swig-4.0.1/0000755000175000017500000000000013527234052012346 5ustar williamwilliamswig-4.0.1/INSTALL0000644000175000017500000002200513527063513013400 0ustar williamwilliamBasic Installation ================== These are generic installation instructions. The `configure' shell script attempts to guess correct values for various system-dependent variables used during compilation. It uses those values to create a `Makefile' in each directory of the package. It may also create one or more `.h' files containing system-dependent definitions. Finally, it creates a shell script `config.status' that you can run in the future to recreate the current configuration, and a file `config.log' containing compiler output (useful mainly for debugging `configure'). It can also use an optional file (typically called `config.cache' and enabled with `--cache-file=config.cache' or simply `-C') that saves the results of its tests to speed up reconfiguring. (Caching is disabled by default to prevent problems with accidental use of stale cache files.) If you need to do unusual things to compile the package, please try to figure out how `configure' could check whether to do them, and mail diffs or instructions to the address given in the `README' so they can be considered for the next release. If you are using the cache, and at some point `config.cache' contains results you don't want to keep, you may remove or edit it. The file `configure.ac' (or `configure.in') is used to create `configure' by a program called `autoconf'. You only need `configure.ac' if you want to change it or regenerate `configure' using a newer version of `autoconf'. The simplest way to compile this package is: 1. `cd' to the directory containing the package's source code and type `./configure' to configure the package for your system. If you're using `csh' on an old version of System V, you might need to type `sh ./configure' instead to prevent `csh' from trying to execute `configure' itself. Running `configure' takes awhile. While running, it prints some messages telling which features it is checking for. 2. Type `make' to compile the package. 3. Optionally, type `make check' to run any self-tests that come with the package. 4. Type `make install' to install the programs and any data files and documentation. 5. You can remove the program binaries and object files from the source code directory by typing `make clean'. To also remove the files that `configure' created (so you can compile the package for a different kind of computer), type `make distclean'. There is also a `make maintainer-clean' target, but that is intended mainly for the package's developers. If you use it, you may have to get all sorts of other programs in order to regenerate files that came with the distribution. Compilers and Options ===================== Some systems require unusual options for compilation or linking that the `configure' script does not know about. Run `./configure --help' for details on some of the pertinent environment variables. You can give `configure' initial values for variables by setting them in the environment. You can do that on the command line like this: ./configure CC=c89 CFLAGS=-O2 LIBS=-lposix *Note Environment Variables::, for more details. Compiling For Multiple Architectures ==================================== You can compile the package for more than one kind of computer at the same time, by placing the object files for each architecture in their own directory. To do this, you must use a version of `make' that supports the `VPATH' variable, such as GNU `make'. `cd' to the directory where you want the object files and executables to go and run the `configure' script. `configure' automatically checks for the source code in the directory that `configure' is in and in `..'. If you have to use a `make' that does not support the `VPATH' variable, you have to compile the package for one architecture at a time in the source code directory. After you have installed the package for one architecture, use `make distclean' before reconfiguring for another architecture. Installation Names ================== By default, `make install' will install the package's files in `/usr/local/bin', `/usr/local/man', etc. You can specify an installation prefix other than `/usr/local' by giving `configure' the option `--prefix=PATH'. You can specify separate installation prefixes for architecture-specific files and architecture-independent files. If you give `configure' the option `--exec-prefix=PATH', the package will use PATH as the prefix for installing programs and libraries. Documentation and other data files will still use the regular prefix. In addition, if you use an unusual directory layout you can give options like `--bindir=PATH' to specify different values for particular kinds of files. Run `configure --help' for a list of the directories you can set and what kinds of files go in them. If the package supports it, you can cause programs to be installed with an extra prefix or suffix on their names by giving `configure' the option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. Optional Features ================= Some packages pay attention to `--enable-FEATURE' options to `configure', where FEATURE indicates an optional part of the package. They may also pay attention to `--with-PACKAGE' options, where PACKAGE is something like `gnu-as' or `x' (for the X Window System). The `README' should mention any `--enable-' and `--with-' options that the package recognizes. For packages that use the X Window System, `configure' can usually find the X include and library files automatically, but if it doesn't, you can use the `configure' options `--x-includes=DIR' and `--x-libraries=DIR' to specify their locations. Specifying the System Type ========================== There may be some features `configure' cannot figure out automatically, but needs to determine by the type of host the package will run on. Usually `configure' can figure that out, but if it prints a message saying it cannot guess the host type, give it the `--build=TYPE' option. TYPE can either be a short name for the system type, such as `sun4', or a canonical name which has the form: CPU-COMPANY-SYSTEM where SYSTEM can have one of these forms: OS KERNEL-OS See the file `config.sub' for the possible values of each field. If `config.sub' isn't included in this package, then this package doesn't need to know the host type. If you are _building_ compiler tools for cross-compiling, you should use the `--target=TYPE' option to select the type of system they will produce code for. If you want to _use_ a cross compiler, that generates code for a platform different from the build platform, you should specify the host platform (i.e., that on which the generated programs will eventually be run) with `--host=TYPE'. In this case, you should also specify the build platform with `--build=TYPE', because, in this case, it may not be possible to guess the build platform (it sometimes involves compiling and running simple test programs, and this can't be done if the compiler is a cross compiler). Sharing Defaults ================ If you want to set default values for `configure' scripts to share, you can create a site shell script called `config.site' that gives default values for variables like `CC', `cache_file', and `prefix'. `configure' looks for `PREFIX/share/config.site' if it exists, then `PREFIX/etc/config.site' if it exists. Or, you can set the `CONFIG_SITE' environment variable to the location of the site script. A warning: not all `configure' scripts look for a site script. Environment Variables ===================== Variables not defined in a site shell script can be set in the environment passed to configure. However, some packages may run configure again during the build, and the customized values of these variables may be lost. In order to avoid this problem, you should set them in the `configure' command line, using `VAR=value'. For example: ./configure CC=/usr/local2/bin/gcc will cause the specified gcc to be used as the C compiler (unless it is overridden in the site shell script). `configure' Invocation ====================== `configure' recognizes the following options to control how it operates. `--help' `-h' Print a summary of the options to `configure', and exit. `--version' `-V' Print the version of Autoconf used to generate the `configure' script, and exit. `--cache-file=FILE' Enable the cache: use and save the results of the tests in FILE, traditionally `config.cache'. FILE defaults to `/dev/null' to disable caching. `--config-cache' `-C' Alias for `--cache-file=config.cache'. `--quiet' `--silent' `-q' Do not print messages saying which checks are being made. To suppress all normal output, redirect it to `/dev/null' (any error messages will still be shown). `--srcdir=DIR' Look for the package's source code in directory DIR. Usually `configure' can determine that directory automatically. `configure' also accepts some other, not widely useful, options. Run `configure --help' for more details. swig-4.0.1/Source/0000755000175000017500000000000013527234047013612 5ustar williamwilliamswig-4.0.1/Source/Preprocessor/0000755000175000017500000000000013527063513016276 5ustar williamwilliamswig-4.0.1/Source/Preprocessor/expr.c0000644000175000017500000003111113527063513017415 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * expr.c * * Integer arithmetic expression evaluator used to handle expressions * encountered during preprocessing. * ----------------------------------------------------------------------------- */ #include "swig.h" #include "preprocessor.h" static Scanner *scan = 0; typedef struct { int op; long value; String *svalue; } exprval; #define EXPR_TOP 1 #define EXPR_VALUE 2 #define EXPR_OP 3 #define EXPR_GROUP 4 #define EXPR_UMINUS 100 static exprval stack[256]; /* Parsing stack */ static int sp = 0; /* Stack pointer */ static int prec[256]; /* Precedence rules */ static int expr_init = 0; /* Initialization flag */ static const char *errmsg = 0; /* Parsing error */ /* Initialize the precedence table for various operators. Low values have higher precedence */ static void init_precedence() { prec[SWIG_TOKEN_NOT] = 10; prec[EXPR_UMINUS] = 10; prec[SWIG_TOKEN_STAR] = 20; prec[SWIG_TOKEN_SLASH] = 20; prec[SWIG_TOKEN_PERCENT] = 20; prec[SWIG_TOKEN_PLUS] = 30; prec[SWIG_TOKEN_MINUS] = 30; prec[SWIG_TOKEN_LSHIFT] = 40; prec[SWIG_TOKEN_RSHIFT] = 40; prec[SWIG_TOKEN_AND] = 50; prec[SWIG_TOKEN_XOR] = 60; prec[SWIG_TOKEN_OR] = 70; prec[SWIG_TOKEN_EQUALTO] = 80; prec[SWIG_TOKEN_NOTEQUAL] = 80; prec[SWIG_TOKEN_LESSTHAN] = 80; prec[SWIG_TOKEN_GREATERTHAN] = 80; prec[SWIG_TOKEN_LTEQUAL] = 80; prec[SWIG_TOKEN_GTEQUAL] = 80; prec[SWIG_TOKEN_LNOT] = 90; prec[SWIG_TOKEN_LAND] = 100; prec[SWIG_TOKEN_LOR] = 110; expr_init = 1; } #define UNARY_OP(token) (((token) == SWIG_TOKEN_NOT) || \ ((token) == SWIG_TOKEN_LNOT) || \ ((token) == EXPR_UMINUS)) /* Reduce a single operator on the stack */ /* return 0 on failure, 1 on success */ static int reduce_op() { long op_token = stack[sp - 1].value; assert(sp > 0); assert(stack[sp - 1].op == EXPR_OP); /* do some basic checking first: */ if (stack[sp].op != EXPR_VALUE) { errmsg = "Right-hand side is not value"; return 0; } if (UNARY_OP(op_token)) { if (stack[sp].svalue) { errmsg = "Syntax error: attempt to apply unary operator to string"; return 0; } } else { /* binary operator: */ if (sp == 1) { /* top of stack: don't attempt to use sp-2! */ errmsg = "Missing left-hand side for binary operator"; return 0; } if (stack[sp].op != EXPR_VALUE) { errmsg = "Left-hand side of binary operator is not a value"; return 0; } if ((!stack[sp - 2].svalue) != (!stack[sp].svalue)) { errmsg = "Can't mix strings and integers in expression"; return 0; } } if (stack[sp].svalue) { /* A binary string expression */ switch (stack[sp - 1].value) { case SWIG_TOKEN_EQUALTO: stack[sp - 2].value = (Strcmp(stack[sp - 2].svalue, stack[sp].svalue) == 0); Delete(stack[sp - 2].svalue); Delete(stack[sp].svalue); sp -= 2; break; case SWIG_TOKEN_NOTEQUAL: stack[sp - 2].value = (Strcmp(stack[sp - 2].svalue, stack[sp].svalue) != 0); Delete(stack[sp - 2].svalue); Delete(stack[sp].svalue); sp -= 2; break; default: errmsg = "Syntax error: bad binary operator for strings"; return 0; break; } } else { switch (op_token) { case SWIG_TOKEN_STAR: stack[sp - 2].value = stack[sp - 2].value * stack[sp].value; sp -= 2; break; case SWIG_TOKEN_EQUALTO: stack[sp - 2].value = stack[sp - 2].value == stack[sp].value; sp -= 2; break; case SWIG_TOKEN_NOTEQUAL: stack[sp - 2].value = stack[sp - 2].value != stack[sp].value; sp -= 2; break; case SWIG_TOKEN_PLUS: stack[sp - 2].value = stack[sp - 2].value + stack[sp].value; sp -= 2; break; case SWIG_TOKEN_MINUS: stack[sp - 2].value = stack[sp - 2].value - stack[sp].value; sp -= 2; break; case SWIG_TOKEN_AND: stack[sp - 2].value = stack[sp - 2].value & stack[sp].value; sp -= 2; break; case SWIG_TOKEN_LAND: stack[sp - 2].value = stack[sp - 2].value && stack[sp].value; sp -= 2; break; case SWIG_TOKEN_OR: stack[sp - 2].value = stack[sp - 2].value | stack[sp].value; sp -= 2; break; case SWIG_TOKEN_LOR: stack[sp - 2].value = stack[sp - 2].value || stack[sp].value; sp -= 2; break; case SWIG_TOKEN_XOR: stack[sp - 2].value = stack[sp - 2].value ^ stack[sp].value; sp -= 2; break; case SWIG_TOKEN_LESSTHAN: stack[sp - 2].value = stack[sp - 2].value < stack[sp].value; sp -= 2; break; case SWIG_TOKEN_GREATERTHAN: stack[sp - 2].value = stack[sp - 2].value > stack[sp].value; sp -= 2; break; case SWIG_TOKEN_LTEQUAL: stack[sp - 2].value = stack[sp - 2].value <= stack[sp].value; sp -= 2; break; case SWIG_TOKEN_GTEQUAL: stack[sp - 2].value = stack[sp - 2].value >= stack[sp].value; sp -= 2; break; case SWIG_TOKEN_NOT: stack[sp - 1].value = ~stack[sp].value; sp--; break; case SWIG_TOKEN_LNOT: stack[sp - 1].value = !stack[sp].value; sp--; break; case EXPR_UMINUS: stack[sp - 1].value = -stack[sp].value; sp--; break; case SWIG_TOKEN_SLASH: if (stack[sp].value != 0) { stack[sp - 2].value = stack[sp - 2].value / stack[sp].value; sp -= 2; } else { errmsg = "Division by zero in expression"; return 0; } break; case SWIG_TOKEN_PERCENT: if (stack[sp].value != 0) { stack[sp - 2].value = stack[sp - 2].value % stack[sp].value; sp -= 2; } else { errmsg = "Modulo by zero in expression"; return 0; } break; case SWIG_TOKEN_LSHIFT: stack[sp - 2].value = stack[sp - 2].value << stack[sp].value; sp -= 2; break; case SWIG_TOKEN_RSHIFT: stack[sp - 2].value = stack[sp - 2].value >> stack[sp].value; sp -= 2; break; default: errmsg = "Syntax error: bad operator"; return 0; break; } } stack[sp].op = EXPR_VALUE; stack[sp].svalue = 0; /* ensure it's not a string! */ return 1; } /* ----------------------------------------------------------------------------- * Preprocessor_expr_init() * * Initialize the expression evaluator * ----------------------------------------------------------------------------- */ void Preprocessor_expr_init(void) { if (!expr_init) init_precedence(); if (!scan) scan = NewScanner(); } void Preprocessor_expr_delete(void) { DelScanner(scan); } /* ----------------------------------------------------------------------------- * Tokenizer * ----------------------------------------------------------------------------- */ static int expr_token(Scanner * s) { int t; while (1) { t = Scanner_token(s); if (!((t == SWIG_TOKEN_BACKSLASH) || (t == SWIG_TOKEN_ENDLINE) || (t == SWIG_TOKEN_COMMENT))) break; } return t; } /* ----------------------------------------------------------------------------- * Preprocessor_expr() * * Evaluates an arithmetic expression. Returns the result and sets an error code. * ----------------------------------------------------------------------------- */ int Preprocessor_expr(DOH *s, int *error) { int token = 0; int op = 0; sp = 0; assert(s); assert(scan); Seek(s, 0, SEEK_SET); /* Printf(stdout,"evaluating : '%s'\n", s); */ *error = 0; Scanner_clear(scan); Scanner_push(scan, s); /* Put initial state onto the stack */ stack[sp].op = EXPR_TOP; stack[sp].value = 0; while (1) { /* Look at the top of the stack */ switch (stack[sp].op) { case EXPR_TOP: /* An expression. Can be a number or another expression enclosed in parens */ token = expr_token(scan); if (!token) { errmsg = "Expected an expression"; *error = 1; return 0; } if ((token == SWIG_TOKEN_INT) || (token == SWIG_TOKEN_UINT) || (token == SWIG_TOKEN_LONG) || (token == SWIG_TOKEN_ULONG)) { /* A number. Reduce EXPR_TOP to an EXPR_VALUE */ char *c = Char(Scanner_text(scan)); stack[sp].value = (long) strtol(c, 0, 0); stack[sp].svalue = 0; /* stack[sp].value = (long) atol(Char(Scanner_text(scan))); */ stack[sp].op = EXPR_VALUE; } else if (token == SWIG_TOKEN_PLUS) { } else if ((token == SWIG_TOKEN_MINUS) || (token == SWIG_TOKEN_LNOT) || (token == SWIG_TOKEN_NOT)) { if (token == SWIG_TOKEN_MINUS) token = EXPR_UMINUS; stack[sp].value = token; stack[sp++].op = EXPR_OP; stack[sp].op = EXPR_TOP; stack[sp].svalue = 0; } else if (token == SWIG_TOKEN_LPAREN) { stack[sp++].op = EXPR_GROUP; stack[sp].op = EXPR_TOP; stack[sp].value = 0; stack[sp].svalue = 0; } else if (token == SWIG_TOKEN_ENDLINE) { } else if (token == SWIG_TOKEN_STRING) { stack[sp].svalue = NewString(Scanner_text(scan)); stack[sp].op = EXPR_VALUE; } else if (token == SWIG_TOKEN_ID) { stack[sp].value = 0; stack[sp].svalue = 0; stack[sp].op = EXPR_VALUE; } else if ((token == SWIG_TOKEN_FLOAT) || (token == SWIG_TOKEN_DOUBLE)) { errmsg = "Floating point constant in preprocessor expression"; *error = 1; return 0; } else goto syntax_error; break; case EXPR_VALUE: /* A value is on the stack. We may reduce or evaluate depending on what the next token is */ token = expr_token(scan); if (!token) { /* End of input. Might have to reduce if an operator is on stack */ while (sp > 0) { if (stack[sp - 1].op == EXPR_OP) { if (!reduce_op()) goto reduce_error; } else if (stack[sp - 1].op == EXPR_GROUP) { errmsg = "Missing \')\'"; *error = 1; return 0; } else goto syntax_error; } return stack[sp].value; } /* Token must be an operator */ switch (token) { case SWIG_TOKEN_STAR: case SWIG_TOKEN_EQUALTO: case SWIG_TOKEN_NOTEQUAL: case SWIG_TOKEN_PLUS: case SWIG_TOKEN_MINUS: case SWIG_TOKEN_AND: case SWIG_TOKEN_LAND: case SWIG_TOKEN_OR: case SWIG_TOKEN_LOR: case SWIG_TOKEN_XOR: case SWIG_TOKEN_LESSTHAN: case SWIG_TOKEN_GREATERTHAN: case SWIG_TOKEN_LTEQUAL: case SWIG_TOKEN_GTEQUAL: case SWIG_TOKEN_SLASH: case SWIG_TOKEN_PERCENT: case SWIG_TOKEN_LSHIFT: case SWIG_TOKEN_RSHIFT: if ((sp == 0) || (stack[sp - 1].op == EXPR_GROUP)) { /* No possibility of reduce. Push operator and expression */ sp++; stack[sp].op = EXPR_OP; stack[sp].value = token; sp++; stack[sp].op = EXPR_TOP; stack[sp].value = 0; } else { if (stack[sp - 1].op != EXPR_OP) goto syntax_error_expected_operator; op = stack[sp - 1].value; /* Previous operator */ /* Now, depending on the precedence relationship between the last operator and the current we will reduce or push */ if (prec[op] <= prec[token]) { /* Reduce the previous operator */ if (!reduce_op()) goto reduce_error; } sp++; stack[sp].op = EXPR_OP; stack[sp].value = token; sp++; stack[sp].op = EXPR_TOP; stack[sp].value = 0; } break; case SWIG_TOKEN_RPAREN: if (sp == 0) goto extra_rparen; /* Might have to reduce operators first */ while ((sp > 0) && (stack[sp - 1].op == EXPR_OP)) { if (!reduce_op()) goto reduce_error; } if ((sp == 0) || (stack[sp - 1].op != EXPR_GROUP)) goto extra_rparen; stack[sp - 1].op = EXPR_VALUE; stack[sp - 1].value = stack[sp].value; sp--; break; default: goto syntax_error_expected_operator; break; } break; default: fprintf(stderr, "Internal error in expression evaluator.\n"); abort(); } } syntax_error: errmsg = "Syntax error"; *error = 1; return 0; syntax_error_expected_operator: errmsg = "Syntax error: expected operator"; *error = 1; return 0; reduce_error: /* errmsg has been set by reduce_op */ *error = 1; return 0; extra_rparen: errmsg = "Extra \')\'"; *error = 1; return 0; } /* ----------------------------------------------------------------------------- * Preprocessor_expr_error() * * Return error message set by the evaluator (if any) * ----------------------------------------------------------------------------- */ const char *Preprocessor_expr_error() { return errmsg; } swig-4.0.1/Source/Preprocessor/preprocessor.h0000644000175000017500000000273313527063513021202 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * preprocessor.h * * SWIG preprocessor module. * ----------------------------------------------------------------------------- */ #ifndef SWIG_PREPROCESSOR_H_ #define SWIG_PREPROCESSOR_H_ #include "swigwarn.h" #ifdef __cplusplus extern "C" { #endif extern int Preprocessor_expr(String *s, int *error); extern const char *Preprocessor_expr_error(void); extern Hash *Preprocessor_define(const_String_or_char_ptr str, int swigmacro); extern void Preprocessor_undef(const_String_or_char_ptr name); extern void Preprocessor_init(void); extern void Preprocessor_delete(void); extern String *Preprocessor_parse(String *s); extern void Preprocessor_include_all(int); extern void Preprocessor_import_all(int); extern void Preprocessor_ignore_missing(int); extern void Preprocessor_error_as_warning(int); extern List *Preprocessor_depend(void); extern void Preprocessor_expr_init(void); extern void Preprocessor_expr_delete(void); #ifdef __cplusplus } #endif #endif swig-4.0.1/Source/Preprocessor/cpp.c0000644000175000017500000015063113527063513017232 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * cpp.c * * An implementation of a C preprocessor plus some support for additional * SWIG directives. * * - SWIG directives such as %include, %extern, and %import are handled * - A new macro %define ... %enddef can be used for multiline macros * - No preprocessing is performed in %{ ... %} blocks * - Lines beginning with %# are stripped down to #... and passed through. * ----------------------------------------------------------------------------- */ #include "swig.h" #include "preprocessor.h" #include static Hash *cpp = 0; /* C preprocessor data */ static int include_all = 0; /* Follow all includes */ static int ignore_missing = 0; static int import_all = 0; /* Follow all includes, but as %import statements */ static int imported_depth = 0; /* Depth of %imported files */ static int single_include = 1; /* Only include each file once */ static Hash *included_files = 0; static List *dependencies = 0; static Scanner *id_scan = 0; static int error_as_warning = 0; /* Understand the cpp #error directive as a special #warning */ static int expand_defined_operator = 0; static int macro_level = 0; static int macro_start_line = 0; static const String * macro_start_file = 0; /* Test a character to see if it starts an identifier */ #define isidentifier(c) ((isalpha(c)) || (c == '_') || (c == '$')) /* Test a character to see if it valid in an identifier (after the first letter) */ #define isidchar(c) ((isalnum(c)) || (c == '_') || (c == '$')) static DOH *Preprocessor_replace(DOH *); /* Skip whitespace */ static void skip_whitespace(String *s, String *out) { int c; while ((c = Getc(s)) != EOF) { if (!isspace(c)) { Ungetc(c, s); break; } else if (out) Putc(c, out); } } /* Skip to a specified character taking line breaks into account */ static int skip_tochar(String *s, int ch, String *out) { int c; while ((c = Getc(s)) != EOF) { if (out) Putc(c, out); if (c == ch) break; if (c == '\\') { c = Getc(s); if ((c != EOF) && (out)) Putc(c, out); } } if (c == EOF) return -1; return 0; } static void copy_location(const DOH *s1, DOH *s2) { Setfile(s2, Getfile((DOH *) s1)); Setline(s2, Getline((DOH *) s1)); } static String *cpp_include(const_String_or_char_ptr fn, int sysfile) { String *s = sysfile ? Swig_include_sys(fn) : Swig_include(fn); if (s && single_include) { String *file = Getfile(s); if (Getattr(included_files, file)) { Delete(s); return 0; } Setattr(included_files, file, file); } if (!s) { if (ignore_missing) { Swig_warning(WARN_PP_MISSING_FILE, Getfile(fn), Getline(fn), "Unable to find '%s'\n", fn); } else { Swig_error(Getfile(fn), Getline(fn), "Unable to find '%s'\n", fn); } } else { String *lf; Seek(s, 0, SEEK_SET); if (!dependencies) { dependencies = NewList(); } lf = Copy(Swig_last_file()); Append(dependencies, lf); Delete(lf); } return s; } static int is_digits(const String *str) { const char *s = Char(str); int isdigits = (*s != 0); while (*s) { if (!isdigit(*s)) { isdigits = 0; break; } s++; } return isdigits; } List *Preprocessor_depend(void) { return dependencies; } /* ----------------------------------------------------------------------------- * void Preprocessor_cpp_init() - Initialize the preprocessor * ----------------------------------------------------------------------------- */ static String *kpp_args = 0; static String *kpp_define = 0; static String *kpp_defined = 0; static String *kpp_elif = 0; static String *kpp_else = 0; static String *kpp_endif = 0; static String *kpp_expanded = 0; static String *kpp_if = 0; static String *kpp_ifdef = 0; static String *kpp_ifndef = 0; static String *kpp_name = 0; static String *kpp_swigmacro = 0; static String *kpp_symbols = 0; static String *kpp_undef = 0; static String *kpp_value = 0; static String *kpp_varargs = 0; static String *kpp_error = 0; static String *kpp_warning = 0; static String *kpp_line = 0; static String *kpp_include = 0; static String *kpp_pragma = 0; static String *kpp_level = 0; static String *kpp_dline = 0; static String *kpp_ddefine = 0; static String *kpp_dinclude = 0; static String *kpp_dimport = 0; static String *kpp_dbeginfile = 0; static String *kpp_dextern = 0; static String *kpp_LINE = 0; static String *kpp_FILE = 0; static String *kpp_hash_if = 0; static String *kpp_hash_elif = 0; void Preprocessor_init(void) { Hash *s; kpp_args = NewString("args"); kpp_define = NewString("define"); kpp_defined = NewString("defined"); kpp_else = NewString("else"); kpp_elif = NewString("elif"); kpp_endif = NewString("endif"); kpp_expanded = NewString("*expanded*"); kpp_if = NewString("if"); kpp_ifdef = NewString("ifdef"); kpp_ifndef = NewString("ifndef"); kpp_name = NewString("name"); kpp_swigmacro = NewString("swigmacro"); kpp_symbols = NewString("symbols"); kpp_undef = NewString("undef"); kpp_value = NewString("value"); kpp_error = NewString("error"); kpp_warning = NewString("warning"); kpp_pragma = NewString("pragma"); kpp_level = NewString("level"); kpp_line = NewString("line"); kpp_include = NewString("include"); kpp_varargs = NewString("varargs"); kpp_dinclude = NewString("%include"); kpp_dimport = NewString("%import"); kpp_dbeginfile = NewString("%beginfile"); kpp_dextern = NewString("%extern"); kpp_ddefine = NewString("%define"); kpp_dline = NewString("%line"); kpp_LINE = NewString("__LINE__"); kpp_FILE = NewString("__FILE__"); kpp_hash_if = NewString("#if"); kpp_hash_elif = NewString("#elif"); cpp = NewHash(); s = NewHash(); Setattr(cpp, kpp_symbols, s); Delete(s); Preprocessor_expr_init(); /* Initialize the expression evaluator */ included_files = NewHash(); id_scan = NewScanner(); } void Preprocessor_delete(void) { Delete(kpp_args); Delete(kpp_define); Delete(kpp_defined); Delete(kpp_else); Delete(kpp_elif); Delete(kpp_endif); Delete(kpp_expanded); Delete(kpp_if); Delete(kpp_ifdef); Delete(kpp_ifndef); Delete(kpp_name); Delete(kpp_swigmacro); Delete(kpp_symbols); Delete(kpp_undef); Delete(kpp_value); Delete(kpp_error); Delete(kpp_warning); Delete(kpp_pragma); Delete(kpp_level); Delete(kpp_line); Delete(kpp_include); Delete(kpp_varargs); Delete(kpp_dinclude); Delete(kpp_dimport); Delete(kpp_dbeginfile); Delete(kpp_dextern); Delete(kpp_ddefine); Delete(kpp_dline); Delete(kpp_LINE); Delete(kpp_FILE); Delete(kpp_hash_if); Delete(kpp_hash_elif); Delete(cpp); Delete(included_files); Preprocessor_expr_delete(); DelScanner(id_scan); Delete(dependencies); Delete(Swig_add_directory(0)); } /* ----------------------------------------------------------------------------- * void Preprocessor_include_all() - Instruct preprocessor to include all files * ----------------------------------------------------------------------------- */ void Preprocessor_include_all(int a) { include_all = a; } void Preprocessor_import_all(int a) { import_all = a; } void Preprocessor_ignore_missing(int a) { ignore_missing = a; } void Preprocessor_error_as_warning(int a) { error_as_warning = a; } /* ----------------------------------------------------------------------------- * Preprocessor_define() * * Defines a new C preprocessor symbol. swigmacro specifies whether or not the macro has * SWIG macro semantics. * ----------------------------------------------------------------------------- */ String *Macro_vararg_name(const_String_or_char_ptr str, const_String_or_char_ptr line) { String *argname; String *varargname; char *s, *dots; argname = Copy(str); s = Char(argname); dots = strchr(s, '.'); if (!dots) { Delete(argname); return NULL; } if (strcmp(dots, "...") != 0) { Swig_error(Getfile(line), Getline(line), "Illegal macro argument name '%s'\n", str); Delete(argname); return NULL; } if (dots == s) { varargname = NewString("__VA_ARGS__"); } else { *dots = '\0'; varargname = NewString(s); } Delete(argname); return varargname; } Hash *Preprocessor_define(const_String_or_char_ptr _str, int swigmacro) { String *macroname = 0, *argstr = 0, *macrovalue = 0, *file = 0, *s = 0; Hash *macro = 0, *symbols = 0, *m1; List *arglist = 0; int c, line; int varargs = 0; String *str; assert(cpp); assert(_str); /* First make sure that string is actually a string */ if (DohCheck(_str)) { s = Copy(_str); copy_location(_str, s); str = s; } else { str = NewString((char *) _str); } Seek(str, 0, SEEK_SET); line = Getline(str); file = Getfile(str); /* Skip over any leading whitespace */ skip_whitespace(str, 0); /* Now look for a macro name */ macroname = NewStringEmpty(); copy_location(str, macroname); while ((c = Getc(str)) != EOF) { if (c == '(') { argstr = NewStringEmpty(); copy_location(str, argstr); /* It is a macro. Go extract its argument string */ while ((c = Getc(str)) != EOF) { if (c == ')') break; else Putc(c, argstr); } if (c != ')') { Swig_error(Getfile(argstr), Getline(argstr), "Missing \')\' in macro parameters\n"); goto macro_error; } break; } else if (isidchar(c) || (c == '%')) { Putc(c, macroname); } else if (isspace(c)) { break; } else if (c == '\\') { c = Getc(str); if (c != '\n') { Ungetc(c, str); Ungetc('\\', str); break; } } else { Ungetc(c, str); break; } } if (!swigmacro) skip_whitespace(str, 0); macrovalue = NewStringEmpty(); copy_location(str, macrovalue); while ((c = Getc(str)) != EOF) { Putc(c, macrovalue); } /* If there are any macro arguments, convert into a list */ if (argstr) { String *argname, *varargname; arglist = NewList(); Seek(argstr, 0, SEEK_SET); argname = NewStringEmpty(); while ((c = Getc(argstr)) != EOF) { if (c == ',') { varargname = Macro_vararg_name(argname, argstr); if (varargname) { Delete(varargname); Swig_error(Getfile(argstr), Getline(argstr), "Variable length macro argument must be last parameter\n"); } else { Append(arglist, argname); } Delete(argname); argname = NewStringEmpty(); } else if (isidchar(c) || (c == '.')) { Putc(c, argname); } else if (!(isspace(c) || (c == '\\'))) { Delete(argname); Swig_error(Getfile(argstr), Getline(argstr), "Illegal character in macro argument name\n"); goto macro_error; } } if (Len(argname)) { /* Check for varargs */ varargname = Macro_vararg_name(argname, argstr); if (varargname) { Append(arglist, varargname); Delete(varargname); varargs = 1; } else { Append(arglist, argname); } } Delete(argname); } if (!swigmacro) { Replace(macrovalue, "\\\n", " ", DOH_REPLACE_NOQUOTE); } /* Look for special # substitutions. We only consider # that appears outside of quotes and comments */ { int state = 0; char *cc = Char(macrovalue); while (*cc) { switch (state) { case 0: if (*cc == '#') *cc = '\001'; else if (*cc == '/') state = 10; else if (*cc == '\'') state = 20; else if (*cc == '\"') state = 30; break; case 10: if (*cc == '*') state = 11; else if (*cc == '/') state = 15; else { state = 0; cc--; } break; case 11: if (*cc == '*') state = 12; break; case 12: if (*cc == '/') state = 0; else if (*cc != '*') state = 11; break; case 15: if (*cc == '\n') state = 0; break; case 20: if (*cc == '\'') state = 0; if (*cc == '\\') state = 21; break; case 21: state = 20; break; case 30: if (*cc == '\"') state = 0; if (*cc == '\\') state = 31; break; case 31: state = 30; break; default: break; } cc++; } } /* Get rid of whitespace surrounding # */ /* Replace(macrovalue,"#","\001",DOH_REPLACE_NOQUOTE); */ while (strstr(Char(macrovalue), "\001 ")) { Replace(macrovalue, "\001 ", "\001", DOH_REPLACE_ANY); } while (strstr(Char(macrovalue), " \001")) { Replace(macrovalue, " \001", "\001", DOH_REPLACE_ANY); } /* Replace '##' with a special token */ Replace(macrovalue, "\001\001", "\002", DOH_REPLACE_ANY); /* Replace '#@' with a special token */ Replace(macrovalue, "\001@", "\004", DOH_REPLACE_ANY); /* Replace '##@' with a special token */ Replace(macrovalue, "\002@", "\005", DOH_REPLACE_ANY); /* Go create the macro */ macro = NewHash(); Setattr(macro, kpp_name, macroname); if (arglist) { Setattr(macro, kpp_args, arglist); Delete(arglist); if (varargs) { Setattr(macro, kpp_varargs, "1"); } } Setattr(macro, kpp_value, macrovalue); Setline(macro, line); Setfile(macro, file); if (swigmacro) { Setattr(macro, kpp_swigmacro, "1"); } symbols = Getattr(cpp, kpp_symbols); if ((m1 = Getattr(symbols, macroname))) { if (!Checkattr(m1, kpp_value, macrovalue)) { Swig_error(Getfile(macroname), Getline(macroname), "Macro '%s' redefined,\n", macroname); Swig_error(Getfile(m1), Getline(m1), "previous definition of '%s'.\n", macroname); goto macro_error; } } else { Setattr(symbols, macroname, macro); Delete(macro); } Delete(macroname); Delete(macrovalue); Delete(str); Delete(argstr); return macro; macro_error: Delete(str); Delete(argstr); Delete(arglist); Delete(macroname); Delete(macrovalue); return 0; } /* ----------------------------------------------------------------------------- * Preprocessor_undef() * * Undefines a macro. * ----------------------------------------------------------------------------- */ void Preprocessor_undef(const_String_or_char_ptr str) { Hash *symbols; assert(cpp); symbols = Getattr(cpp, kpp_symbols); Delattr(symbols, str); } /* ----------------------------------------------------------------------------- * find_args() * * Isolates macro arguments and returns them in a list. For each argument, * leading and trailing whitespace is stripped (ala K&R, pg. 230). * ----------------------------------------------------------------------------- */ static List *find_args(String *s, int ismacro, String *macro_name) { List *args; String *str; int c, level; long pos; /* Create a new list */ args = NewList(); copy_location(s, args); /* First look for a '(' */ pos = Tell(s); skip_whitespace(s, 0); /* Now see if the next character is a '(' */ c = Getc(s); if (c != '(') { /* Not a macro, bail out now! */ assert(pos != -1); (void)Seek(s, pos, SEEK_SET); Delete(args); return 0; } c = Getc(s); /* Okay. This appears to be a macro so we will start isolating arguments */ while (c != EOF) { if (isspace(c)) { skip_whitespace(s, 0); /* Skip leading whitespace */ c = Getc(s); } str = NewStringEmpty(); copy_location(s, str); level = 0; while (c != EOF) { if (c == '\"') { Putc(c, str); skip_tochar(s, '\"', str); c = Getc(s); continue; } else if (c == '\'') { Putc(c, str); skip_tochar(s, '\'', str); c = Getc(s); continue; } else if (c == '/') { /* Ensure comments are ignored by eating up the characters */ c = Getc(s); /* Handle / * ... * / type comments (multi-line) */ if (c == '*') { while ((c = Getc(s)) != EOF) { if (c == '*') { c = Getc(s); if (c == '/' || c == EOF) break; } } c = Getc(s); continue; } /* Handle // ... type comments (single-line) */ if (c == '/') { while ((c = Getc(s)) != EOF) { if (c == '\n') { break; } } c = Getc(s); continue; } /* ensure char is available in the stream as this was not a comment*/ Ungetc(c, s); c = '/'; } if ((c == ',') && (level == 0)) break; if ((c == ')') && (level == 0)) break; Putc(c, str); if (c == '(') level++; if (c == ')') level--; c = Getc(s); } if (level > 0) { goto unterm; } Chop(str); Append(args, str); Delete(str); if (c == ')') return args; c = Getc(s); } unterm: if (ismacro) Swig_error(Getfile(args), Getline(args), "Unterminated call invoking macro '%s'\n", macro_name); else Swig_error(Getfile(args), Getline(args), "Unterminated call to '%s'\n", macro_name); return args; } /* ----------------------------------------------------------------------------- * DOH *get_filename() * * Read a filename from str. A filename can be enclosed in quotes, angle brackets, * or bare. * ----------------------------------------------------------------------------- */ static String *get_filename(String *str, int *sysfile) { String *fn; int c; fn = NewStringEmpty(); copy_location(str, fn); c = Getc(str); *sysfile = 0; if (c == '\"') { while (((c = Getc(str)) != EOF) && (c != '\"')) Putc(c, fn); } else if (c == '<') { *sysfile = 1; while (((c = Getc(str)) != EOF) && (c != '>')) Putc(c, fn); } else { String *preprocessed_str; Putc(c, fn); while (((c = Getc(str)) != EOF) && (!isspace(c))) Putc(c, fn); if (isspace(c)) Ungetc(c, str); preprocessed_str = Preprocessor_replace(fn); Seek(preprocessed_str, 0, SEEK_SET); Delete(fn); fn = NewStringEmpty(); copy_location(preprocessed_str, fn); c = Getc(preprocessed_str); if (c == '\"') { while (((c = Getc(preprocessed_str)) != EOF) && (c != '\"')) Putc(c, fn); } else if (c == '<') { *sysfile = 1; while (((c = Getc(preprocessed_str)) != EOF) && (c != '>')) Putc(c, fn); } else { fn = Copy(preprocessed_str); } Delete(preprocessed_str); } Swig_filename_unescape(fn); Swig_filename_correct(fn); Seek(fn, 0, SEEK_SET); return fn; } static String *get_options(String *str) { int c; c = Getc(str); if (c == '(') { String *opt; int level = 1; opt = NewString("("); while (((c = Getc(str)) != EOF)) { Putc(c, opt); if (c == ')') { level--; if (!level) return opt; } if (c == '(') level++; } Delete(opt); return 0; } else { Ungetc(c, str); return 0; } } /* ----------------------------------------------------------------------------- * expand_macro() * * Perform macro expansion and return a new string. Returns NULL if some sort * of error occurred. * name - name of the macro * args - arguments passed to the macro * line_file - only used for line/file name when reporting errors * ----------------------------------------------------------------------------- */ static String *expand_macro(String *name, List *args, String *line_file) { String *ns; DOH *symbols, *macro, *margs, *mvalue, *temp, *tempa, *e; int i, l; int isvarargs = 0; symbols = Getattr(cpp, kpp_symbols); if (!symbols) return 0; /* See if the name is actually defined */ macro = Getattr(symbols, name); if (!macro) return 0; if (macro_level == 0) { /* Store the start of the macro should the macro contain __LINE__ and __FILE__ for expansion */ macro_start_line = Getline(args ? args : line_file); macro_start_file = Getfile(args ? args : line_file); } macro_level++; if (Getattr(macro, kpp_expanded)) { ns = NewStringEmpty(); Append(ns, name); if (args) { int lenargs = Len(args); if (lenargs) Putc('(', ns); for (i = 0; i < lenargs; i++) { Append(ns, Getitem(args, i)); if (i < (lenargs - 1)) Putc(',', ns); } if (i) Putc(')', ns); } macro_level--; return ns; } /* Get macro arguments and value */ mvalue = Getattr(macro, kpp_value); assert(mvalue); margs = Getattr(macro, kpp_args); if (args && Getattr(macro, kpp_varargs)) { isvarargs = 1; /* Variable length argument macro. We need to collect all of the extra arguments into a single argument */ if (Len(args) >= (Len(margs) - 1)) { int i; int vi, na; String *vararg = NewStringEmpty(); vi = Len(margs) - 1; na = Len(args); for (i = vi; i < na; i++) { Append(vararg, Getitem(args, i)); if ((i + 1) < na) { Append(vararg, ","); } } /* Remove arguments */ for (i = vi; i < na; i++) { Delitem(args, vi); } Append(args, vararg); Delete(vararg); } } if (args && margs && Len(margs) == 0 && Len(args) == 1 && Len(Getitem(args, 0)) == 0) { /* FOO() can invoke a macro defined as FOO(X) as well as one defined FOO(). * * Handle this by removing the only argument if it's empty and the macro * expects no arguments. * * We don't need to worry about varargs here - a varargs macro will always have * Len(margs) >= 1, since the varargs are put in the final macro argument. */ Delitem(args, 0); } /* If there are arguments, see if they match what we were given */ if (args && (!margs || Len(margs) != Len(args))) { if (margs && Len(margs) > (1 + isvarargs)) Swig_error(macro_start_file, macro_start_line, "Macro '%s' expects %d arguments\n", name, Len(margs) - isvarargs); else if (margs && Len(margs) == (1 + isvarargs)) Swig_error(macro_start_file, macro_start_line, "Macro '%s' expects 1 argument\n", name); else Swig_error(macro_start_file, macro_start_line, "Macro '%s' expects no arguments\n", name); macro_level--; return 0; } /* If the macro expects arguments, but none were supplied, we leave it in place */ if (!args && margs) { macro_level--; return NewString(name); } /* Copy the macro value */ ns = Copy(mvalue); copy_location(mvalue, ns); /* Tag the macro as being expanded. This is to avoid recursion in macro expansion */ temp = NewStringEmpty(); tempa = NewStringEmpty(); if (args && margs) { l = Len(margs); for (i = 0; i < l; i++) { DOH *arg, *aname; String *reparg; arg = Getitem(args, i); /* Get an argument value */ reparg = Preprocessor_replace(arg); aname = Getitem(margs, i); /* Get macro argument name */ if (strstr(Char(ns), "\001")) { /* Try to replace a quoted version of the argument */ Clear(temp); Clear(tempa); Printf(temp, "\001%s", aname); Printf(tempa, "\"%s\"", arg); Replace(ns, temp, tempa, DOH_REPLACE_ID_END); } if (strstr(Char(ns), "\002")) { /* Look for concatenation tokens */ Clear(temp); Clear(tempa); Printf(temp, "\002%s", aname); Append(tempa, "\002\003"); Replace(ns, temp, tempa, DOH_REPLACE_ID_END); Clear(temp); Clear(tempa); Printf(temp, "%s\002", aname); Append(tempa, "\003\002"); Replace(ns, temp, tempa, DOH_REPLACE_ID_BEGIN); } /* Non-standard macro expansion. The value `x` is replaced by a quoted version of the argument except that if the argument is already quoted nothing happens */ if (strchr(Char(ns), '`')) { String *rep; char *c; Clear(temp); Printf(temp, "`%s`", aname); c = Char(arg); if (*c == '\"') { rep = arg; } else { Clear(tempa); Printf(tempa, "\"%s\"", arg); rep = tempa; } Replace(ns, temp, rep, DOH_REPLACE_ANY); } /* Non-standard mangle expansions. The #@Name is replaced by mangle_arg(Name). */ if (strstr(Char(ns), "\004")) { String *marg = Swig_string_mangle(arg); Clear(temp); Printf(temp, "\004%s", aname); Replace(ns, temp, marg, DOH_REPLACE_ID_END); Delete(marg); } if (strstr(Char(ns), "\005")) { String *marg = Swig_string_mangle(arg); Clear(temp); Clear(tempa); Printf(temp, "\005%s", aname); Printf(tempa, "\"%s\"", marg); Replace(ns, temp, tempa, DOH_REPLACE_ID_END); Delete(marg); } if (isvarargs && i == l - 1 && Len(arg) == 0) { /* Zero length varargs macro argument. We search for commas that might appear before and nuke them */ char *a, *s, *t, *name; int namelen; s = Char(ns); name = Char(aname); namelen = Len(aname); a = strstr(s, name); while (a) { char ca = a[namelen]; if (!isidchar((int) ca)) { /* Matched the entire vararg name, not just a prefix */ if (a > s) { t = a - 1; if (*t == '\002') { t--; while (t >= s) { if (isspace((int) *t)) t--; else if (*t == ',') { *t = ' '; } else break; } } } } a = strstr(a + namelen, name); } } /* Replace(ns, aname, arg, DOH_REPLACE_ID); */ Replace(ns, aname, reparg, DOH_REPLACE_ID); /* Replace expanded args */ Replace(ns, "\003", arg, DOH_REPLACE_ANY); /* Replace unexpanded arg */ Delete(reparg); } } Replace(ns, "\002", "", DOH_REPLACE_ANY); /* Get rid of concatenation tokens */ Replace(ns, "\001", "#", DOH_REPLACE_ANY); /* Put # back (non-standard C) */ Replace(ns, "\004", "#@", DOH_REPLACE_ANY); /* Put # back (non-standard C) */ /* Expand this macro even further */ Setattr(macro, kpp_expanded, "1"); e = Preprocessor_replace(ns); Delattr(macro, kpp_expanded); Delete(ns); if (Getattr(macro, kpp_swigmacro)) { String *g; String *f = NewStringEmpty(); Seek(e, 0, SEEK_SET); copy_location(macro, e); g = Preprocessor_parse(e); #if 0 /* Drop the macro in place, but with a marker around it */ Printf(f, "/*@%s,%d,%s@*/%s/*@@*/", Getfile(macro), Getline(macro), name, g); #else /* Use simplified around markers to properly count lines in cscanner.c */ if (strchr(Char(g), '\n')) { Printf(f, "/*@SWIG:%s,%d,%s@*/%s/*@SWIG@*/", Getfile(macro), Getline(macro), name, g); #if 0 Printf(f, "/*@SWIG:%s@*/%s/*@SWIG@*/", name, g); #endif } else { Append(f, g); } #endif Delete(g); Delete(e); e = f; } macro_level--; Delete(temp); Delete(tempa); return e; } /* ----------------------------------------------------------------------------- * DOH *Preprocessor_replace(DOH *s) * * Performs a macro substitution on a string s. Returns a new string with * substitutions applied. This function works by walking down s and looking * for identifiers. When found, a check is made to see if they are macros * which are then expanded. * ----------------------------------------------------------------------------- */ /* #define SWIG_PUT_BUFF */ static DOH *Preprocessor_replace(DOH *s) { DOH *ns, *symbols, *m; int c, i, state = 0; String *id = NewStringEmpty(); assert(cpp); symbols = Getattr(cpp, kpp_symbols); ns = NewStringEmpty(); copy_location(s, ns); Seek(s, 0, SEEK_SET); /* Try to locate identifiers in s and replace them with macro replacements */ while ((c = Getc(s)) != EOF) { switch (state) { case 0: if (isidentifier(c)) { Clear(id); Putc(c, id); state = 4; } else if (c == '%') { Clear(id); Putc(c, id); state = 2; } else if (c == '#') { Clear(id); Putc(c, id); state = 4; } else if (c == '\"') { Putc(c, ns); skip_tochar(s, '\"', ns); } else if (c == '\'') { Putc(c, ns); skip_tochar(s, '\'', ns); } else if (c == '/') { Putc(c, ns); state = 10; } else if (c == '\\') { Putc(c, ns); c = Getc(s); if (c == '\n') { Putc(c, ns); } else { Ungetc(c, s); } } else if (c == '\n') { Putc(c, ns); expand_defined_operator = 0; } else { Putc(c, ns); } break; case 2: /* Found '%#' */ if (c == '#') { Putc(c, id); state = 4; } else { Ungetc(c, s); state = 4; } break; case 4: /* An identifier */ if (isidchar(c)) { Putc(c, id); state = 4; } else { /* We found the end of a valid identifier */ Ungetc(c, s); /* See if this is the special "defined" operator */ if (Equal(kpp_defined, id)) { if (expand_defined_operator) { int lenargs = 0; DOH *args = 0; /* See whether or not a parenthesis has been used */ skip_whitespace(s, 0); c = Getc(s); if (c == '(') { Ungetc(c, s); args = find_args(s, 0, kpp_defined); } else if (isidchar(c)) { DOH *arg = NewStringEmpty(); args = NewList(); Putc(c, arg); while (((c = Getc(s)) != EOF)) { if (!isidchar(c)) { Ungetc(c, s); break; } Putc(c, arg); } if (Len(arg)) Append(args, arg); Delete(arg); } else { Seek(s, -1, SEEK_CUR); } lenargs = Len(args); if ((!args) || (!lenargs)) { /* This is not a defined() operator. */ Append(ns, id); state = 0; break; } for (i = 0; i < lenargs; i++) { DOH *o = Getitem(args, i); if (!Getattr(symbols, o)) { break; } } if (i < lenargs) Putc('0', ns); else Putc('1', ns); Delete(args); } else { Append(ns, id); } state = 0; break; } else if (Equal(kpp_LINE, id)) { Printf(ns, "%d", macro_level > 0 ? macro_start_line : Getline(s)); state = 0; break; } else if (Equal(kpp_FILE, id)) { String *fn = Copy(macro_level > 0 ? macro_start_file : Getfile(s)); Replaceall(fn, "\\", "\\\\"); Printf(ns, "\"%s\"", fn); Delete(fn); state = 0; break; } else if (Equal(kpp_hash_if, id) || Equal(kpp_hash_elif, id)) { expand_defined_operator = 1; Append(ns, id); /* } else if (Equal("%#if", id) || Equal("%#ifdef", id)) { Swig_warning(998, Getfile(s), Getline(s), "Found: %s preprocessor directive.\n", id); Append(ns, id); } else if (Equal("#ifdef", id) || Equal("#ifndef", id)) { Swig_warning(998, Getfile(s), Getline(s), "The %s preprocessor directive does not work in macros, try #if instead.\n", id); Append(ns, id); */ } else if ((m = Getattr(symbols, id))) { /* See if the macro is defined in the preprocessor symbol table */ DOH *args = 0; DOH *e; int macro_additional_lines = 0; /* See if the macro expects arguments */ if (Getattr(m, kpp_args)) { /* Yep. We need to go find the arguments and do a substitution */ int line = Getline(s); args = find_args(s, 1, id); macro_additional_lines = Getline(s) - line; assert(macro_additional_lines >= 0); } else { args = 0; } e = expand_macro(id, args, s); if (e) { Append(ns, e); } while (macro_additional_lines--) { Putc('\n', ns); } Delete(e); Delete(args); } else { Append(ns, id); } state = 0; } break; case 10: if (c == '/') state = 11; else if (c == '*') state = 12; else { Ungetc(c, s); state = 0; break; } Putc(c, ns); break; case 11: /* in C++ comment */ Putc(c, ns); if (c == '\n') { expand_defined_operator = 0; state = 0; } break; case 12: /* in C comment */ Putc(c, ns); if (c == '*') state = 13; break; case 13: Putc(c, ns); if (c == '/') state = 0; else if (c != '*') state = 12; break; default: state = 0; break; } } /* Identifier at the end */ if (state == 2 || state == 4) { /* See if this is the special "defined" operator */ if (Equal(kpp_defined, id)) { Swig_error(Getfile(s), Getline(s), "No arguments given to defined()\n"); } else if (Equal(kpp_LINE, id)) { Printf(ns, "%d", macro_level > 0 ? macro_start_line : Getline(s)); } else if (Equal(kpp_FILE, id)) { String *fn = Copy(macro_level > 0 ? macro_start_file : Getfile(s)); Replaceall(fn, "\\", "\\\\"); Printf(ns, "\"%s\"", fn); Delete(fn); } else if (Getattr(symbols, id)) { DOH *e; /* Yes. There is a macro here */ /* See if the macro expects arguments */ e = expand_macro(id, 0, s); if (e) Append(ns, e); Delete(e); } else { Append(ns, id); } } Delete(id); return ns; } /* ----------------------------------------------------------------------------- * int checkpp_id(DOH *s) * * Checks the string s to see if it contains any unresolved identifiers. This * function contains the heuristic that determines whether or not a macro * definition passes through the preprocessor as a constant declaration. * ----------------------------------------------------------------------------- */ static int checkpp_id(DOH *s) { int c; int hastok = 0; Scanner *scan = id_scan; Seek(s, 0, SEEK_SET); Scanner_clear(scan); s = Copy(s); Seek(s, SEEK_SET, 0); Scanner_push(scan, s); while ((c = Scanner_token(scan))) { hastok = 1; if ((c == SWIG_TOKEN_ID) || (c == SWIG_TOKEN_LBRACE) || (c == SWIG_TOKEN_RBRACE)) return 1; } if (!hastok) return 1; return 0; } /* addline(). Utility function for adding lines to a chunk */ static void addline(DOH *s1, DOH *s2, int allow) { if (allow) { Append(s1, s2); } else { char *c = Char(s2); while (*c) { if (*c == '\n') Putc('\n', s1); c++; } } } static void add_chunk(DOH *ns, DOH *chunk, int allow) { DOH *echunk; Seek(chunk, 0, SEEK_SET); if (allow) { echunk = Preprocessor_replace(chunk); addline(ns, echunk, allow); Delete(echunk); } else { addline(ns, chunk, 0); } Clear(chunk); } /* push/pop_imported(): helper functions for defining and undefining SWIGIMPORTED (when %importing a file). */ static void push_imported() { if (imported_depth == 0) { Preprocessor_define("SWIGIMPORTED 1", 0); } ++imported_depth; } static void pop_imported() { --imported_depth; if (imported_depth == 0) { Preprocessor_undef("SWIGIMPORTED"); } } /* ----------------------------------------------------------------------------- * Preprocessor_parse() * * Parses the string s. Returns a new string containing the preprocessed version. * * Parsing rules : * 1. Lines starting with # are C preprocessor directives * 2. Macro expansion inside strings is not allowed * 3. All code inside false conditionals is changed to blank lines * 4. Code in %{, %} is not parsed because it may need to be * included inline (with all preprocessor directives included). * ----------------------------------------------------------------------------- */ String *Preprocessor_parse(String *s) { String *ns; /* New string containing the preprocessed text */ String *chunk, *decl; Hash *symbols; String *id = 0, *value = 0, *comment = 0; int i, state, e, c; int start_line = 0; int allow = 1; int level = 0; int dlevel = 0; int filelevel = 0; int mask = 0; int start_level = 0; int cpp_lines = 0; int cond_lines[256]; /* Blow away all carriage returns */ Replace(s, "\015", "", DOH_REPLACE_ANY); ns = NewStringEmpty(); /* Return result */ decl = NewStringEmpty(); id = NewStringEmpty(); value = NewStringEmpty(); comment = NewStringEmpty(); chunk = NewStringEmpty(); copy_location(s, chunk); copy_location(s, ns); symbols = Getattr(cpp, kpp_symbols); state = 0; while ((c = Getc(s)) != EOF) { switch (state) { case 0: /* Initial state - in first column */ /* Look for C preprocessor directives. Otherwise, go directly to state 1 */ if (c == '#') { copy_location(s, chunk); add_chunk(ns, chunk, allow); cpp_lines = 1; state = 40; } else if (isspace(c)) { Putc(c, chunk); skip_whitespace(s, chunk); } else { state = 1; Ungetc(c, s); } break; case 1: /* Non-preprocessor directive */ /* Look for SWIG directives */ if (c == '%') { state = 100; break; } Putc(c, chunk); if (c == '\n') state = 0; else if (c == '\"') { start_line = Getline(s); if (skip_tochar(s, '\"', chunk) < 0) { Swig_error(Getfile(s), start_line, "Unterminated string constant\n"); } } else if (c == '\'') { start_line = Getline(s); if (skip_tochar(s, '\'', chunk) < 0) { Swig_error(Getfile(s), start_line, "Unterminated character constant\n"); } } else if (c == '/') state = 30; /* Comment */ break; case 30: /* Possibly a comment string of some sort */ start_line = Getline(s); Putc(c, chunk); if (c == '/') state = 31; else if (c == '*') state = 32; else state = 1; break; case 31: Putc(c, chunk); if (c == '\n') state = 0; break; case 32: Putc(c, chunk); if (c == '*') state = 33; break; case 33: Putc(c, chunk); if (c == '/') state = 1; else if (c != '*') state = 32; break; case 40: /* Start of a C preprocessor directive */ if (c == '\n') { Putc('\n', chunk); state = 0; } else if (isspace(c)) { state = 40; } else { /* Got the start of a preprocessor directive */ Ungetc(c, s); Clear(id); copy_location(s, id); state = 41; } break; case 41: /* Build up the name of the preprocessor directive */ if ((isspace(c) || (!isidchar(c)))) { Clear(value); Clear(comment); if (c == '\n') { Ungetc(c, s); state = 50; } else { state = 42; if (!isspace(c)) { Ungetc(c, s); } } copy_location(s, value); break; } Putc(c, id); break; case 42: /* Strip any leading space after the preprocessor directive (before preprocessor value) */ if (isspace(c)) { if (c == '\n') { Ungetc(c, s); state = 50; } break; } state = 43; /* FALL THRU */ case 43: /* Get preprocessor value */ if (c == '\n') { Ungetc(c, s); state = 50; } else if (c == '/') { state = 45; } else if (c == '\"') { Putc(c, value); skip_tochar(s, '\"', value); } else if (c == '\'') { Putc(c, value); skip_tochar(s, '\'', value); } else { Putc(c, value); if (c == '\\') state = 44; } break; case 44: if (c == '\n') { Putc(c, value); cpp_lines++; } else { Ungetc(c, s); } state = 43; break; /* States 45-48 are used to remove, but retain comments from macro values. The comments will be placed in the output in an alternative form */ case 45: if (c == '/') state = 46; else if (c == '*') state = 47; else if (c == '\n') { Putc('/', value); Ungetc(c, s); state = 50; } else { Putc('/', value); Putc(c, value); state = 43; } break; case 46: /* in C++ comment */ if (c == '\n') { Ungetc(c, s); state = 50; } else Putc(c, comment); break; case 47: /* in C comment */ if (c == '*') state = 48; else Putc(c, comment); break; case 48: if (c == '/') state = 43; else if (c == '*') Putc(c, comment); else { Putc('*', comment); Putc(c, comment); state = 47; } break; case 50: /* Check for various preprocessor directives */ Chop(value); if (Equal(id, kpp_define)) { if (allow) { DOH *m, *v, *v1; Seek(value, 0, SEEK_SET); m = Preprocessor_define(value, 0); if ((m) && !(Getattr(m, kpp_args))) { v = Copy(Getattr(m, kpp_value)); copy_location(m, v); if (Len(v)) { Swig_error_silent(1); v1 = Preprocessor_replace(v); Swig_error_silent(0); /* Printf(stdout,"checking '%s'\n", v1); */ if (!checkpp_id(v1)) { if (Len(comment) == 0) Printf(ns, "%%constant %s = %s;\n", Getattr(m, kpp_name), v1); else Printf(ns, "%%constant %s = %s; /*%s*/\n", Getattr(m, kpp_name), v1, comment); cpp_lines--; } Delete(v1); } Delete(v); } } } else if (Equal(id, kpp_undef)) { if (allow) Preprocessor_undef(value); } else if (Equal(id, kpp_ifdef)) { cond_lines[level] = Getline(id); level++; if (allow) { start_level = level; if (Len(value) > 0) { /* See if the identifier is in the hash table */ if (!Getattr(symbols, value)) allow = 0; } else { Swig_error(Getfile(s), Getline(id), "Missing identifier for #ifdef.\n"); allow = 0; } mask = 1; } } else if (Equal(id, kpp_ifndef)) { cond_lines[level] = Getline(id); level++; if (allow) { start_level = level; if (Len(value) > 0) { /* See if the identifier is in the hash table */ if (Getattr(symbols, value)) allow = 0; } else { Swig_error(Getfile(s), Getline(id), "Missing identifier for #ifndef.\n"); allow = 0; } mask = 1; } } else if (Equal(id, kpp_else)) { if (level <= 0) { Swig_error(Getfile(s), Getline(id), "Misplaced #else.\n"); } else { cond_lines[level - 1] = Getline(id); if (Len(value) != 0) Swig_warning(WARN_PP_UNEXPECTED_TOKENS, Getfile(s), Getline(id), "Unexpected tokens after #else directive.\n"); if (allow) { allow = 0; mask = 0; } else if (level == start_level) { allow = 1 * mask; } } } else if (Equal(id, kpp_endif)) { level--; if (level < 0) { Swig_error(Getfile(id), Getline(id), "Extraneous #endif.\n"); level = 0; } else { if (level < start_level) { if (Len(value) != 0) Swig_warning(WARN_PP_UNEXPECTED_TOKENS, Getfile(s), Getline(id), "Unexpected tokens after #endif directive.\n"); allow = 1; start_level--; } } } else if (Equal(id, kpp_if)) { cond_lines[level] = Getline(id); level++; if (allow) { int val; String *sval; expand_defined_operator = 1; sval = Preprocessor_replace(value); start_level = level; Seek(sval, 0, SEEK_SET); /* Printf(stdout,"Evaluating '%s'\n", sval); */ if (Len(sval) > 0) { val = Preprocessor_expr(sval, &e); if (e) { const char *msg = Preprocessor_expr_error(); Seek(value, 0, SEEK_SET); Swig_warning(WARN_PP_EVALUATION, Getfile(value), Getline(value), "Could not evaluate expression '%s'\n", value); if (msg) Swig_warning(WARN_PP_EVALUATION, Getfile(value), Getline(value), "Error: '%s'\n", msg); allow = 0; } else { if (val == 0) allow = 0; } } else { Swig_error(Getfile(s), Getline(id), "Missing expression for #if.\n"); allow = 0; } expand_defined_operator = 0; mask = 1; } } else if (Equal(id, kpp_elif)) { if (level == 0) { Swig_error(Getfile(s), Getline(id), "Misplaced #elif.\n"); } else { cond_lines[level - 1] = Getline(id); if (allow) { allow = 0; mask = 0; } else if (level == start_level) { int val; String *sval; expand_defined_operator = 1; sval = Preprocessor_replace(value); Seek(sval, 0, SEEK_SET); if (Len(sval) > 0) { val = Preprocessor_expr(sval, &e); if (e) { const char *msg = Preprocessor_expr_error(); Seek(value, 0, SEEK_SET); Swig_warning(WARN_PP_EVALUATION, Getfile(value), Getline(value), "Could not evaluate expression '%s'\n", value); if (msg) Swig_warning(WARN_PP_EVALUATION, Getfile(value), Getline(value), "Error: '%s'\n", msg); allow = 0; } else { if (val) allow = 1 * mask; else allow = 0; } } else { Swig_error(Getfile(s), Getline(id), "Missing expression for #elif.\n"); allow = 0; } expand_defined_operator = 0; } } } else if (Equal(id, kpp_warning)) { if (allow) { Swig_warning(WARN_PP_CPP_WARNING, Getfile(s), Getline(id), "CPP #warning, \"%s\".\n", value); } } else if (Equal(id, kpp_error)) { if (allow) { if (error_as_warning) { Swig_warning(WARN_PP_CPP_ERROR, Getfile(s), Getline(id), "CPP #error \"%s\".\n", value); } else { Swig_error(Getfile(s), Getline(id), "CPP #error \"%s\". Use the -cpperraswarn option to continue swig processing.\n", value); } } } else if (Equal(id, kpp_line)) { } else if (Equal(id, kpp_include)) { if (((include_all) || (import_all)) && (allow)) { String *s1, *s2, *fn; String *dirname; int sysfile = 0; if (include_all && import_all) { Swig_warning(WARN_PP_INCLUDEALL_IMPORTALL, Getfile(s), Getline(id), "Both includeall and importall are defined: using includeall.\n"); import_all = 0; } Seek(value, 0, SEEK_SET); fn = get_filename(value, &sysfile); s1 = cpp_include(fn, sysfile); if (s1) { if (include_all) Printf(ns, "%%includefile \"%s\" %%beginfile\n", Swig_filename_escape(Swig_last_file())); else if (import_all) { Printf(ns, "%%importfile \"%s\" %%beginfile\n", Swig_filename_escape(Swig_last_file())); push_imported(); } /* See if the filename has a directory component */ dirname = Swig_file_dirname(Swig_last_file()); if (sysfile || !Len(dirname)) { Delete(dirname); dirname = 0; } if (dirname) { int len = Len(dirname); Delslice(dirname, len - 1, len); /* Kill trailing directory delimiter */ Swig_push_directory(dirname); } s2 = Preprocessor_parse(s1); addline(ns, s2, allow); Append(ns, "%endoffile"); if (dirname) { Swig_pop_directory(); } if (import_all) { pop_imported(); } Delete(s2); Delete(dirname); Delete(s1); } Delete(fn); } } else if (Equal(id, kpp_pragma)) { if (Strncmp(value, "SWIG ", 5) == 0) { char *c = Char(value) + 5; while (*c && (isspace((int) *c))) c++; if (*c) { if (strncmp(c, "nowarn=", 7) == 0) { String *val = NewString(c + 7); String *nowarn = Preprocessor_replace(val); Swig_warnfilter(nowarn, 1); Delete(nowarn); Delete(val); } else if (strncmp(c, "cpperraswarn=", 13) == 0) { error_as_warning = atoi(c + 13); } else { Swig_error(Getfile(s), Getline(id), "Unknown SWIG pragma: %s\n", c); } } } } else if (Equal(id, kpp_level)) { Swig_error(Getfile(s), Getline(id), "cpp debug: level = %d, startlevel = %d\n", level, start_level); } else if (Equal(id, "")) { /* Null directive */ } else if (is_digits(id)) { /* A gcc linemarker of the form '# linenum filename flags' (resulting from running gcc -E) */ } else { /* Ignore unknown preprocessor directives which are inside an inactive * conditional (github issue #394). */ if (allow) Swig_error(Getfile(s), Getline(id), "Unknown SWIG preprocessor directive: %s (if this is a block of target language code, delimit it with %%{ and %%})\n", id); } for (i = 0; i < cpp_lines; i++) Putc('\n', ns); state = 0; break; /* SWIG directives */ case 100: /* %{,%} block */ if (c == '{') { start_line = Getline(s); copy_location(s, chunk); add_chunk(ns, chunk, allow); Putc('%', chunk); Putc(c, chunk); state = 105; } /* %#cpp - an embedded C preprocessor directive (we strip off the %) */ else if (c == '#') { add_chunk(ns, chunk, allow); Putc(c, chunk); state = 107; } else if (isidentifier(c)) { Clear(decl); Putc('%', decl); Putc(c, decl); state = 110; } else { Putc('%', chunk); Putc(c, chunk); state = 1; } break; case 105: Putc(c, chunk); if (c == '%') state = 106; break; case 106: Putc(c, chunk); if (c == '}') { state = 1; addline(ns, chunk, allow); Clear(chunk); copy_location(s, chunk); } else { state = 105; } break; case 107: Putc(c, chunk); if (c == '\n') { addline(ns, chunk, allow); Clear(chunk); state = 0; } else if (c == '\\') { state = 108; } break; case 108: Putc(c, chunk); state = 107; break; case 110: if (!isidchar(c)) { Ungetc(c, s); /* Look for common SWIG directives */ if (Equal(decl, kpp_dinclude) || Equal(decl, kpp_dimport) || Equal(decl, kpp_dextern)) { /* Got some kind of file inclusion directive, eg: %import(option1="value1") "filename" */ if (allow) { DOH *s1, *s2, *fn, *opt; String *options_whitespace = NewStringEmpty(); String *filename_whitespace = NewStringEmpty(); int sysfile = 0; if (Equal(decl, kpp_dextern)) { Swig_warning(WARN_DEPRECATED_EXTERN, Getfile(s), Getline(s), "%%extern is deprecated. Use %%import instead.\n"); Clear(decl); Append(decl, "%%import"); } skip_whitespace(s, options_whitespace); opt = get_options(s); skip_whitespace(s, filename_whitespace); fn = get_filename(s, &sysfile); s1 = cpp_include(fn, sysfile); if (s1) { String *dirname; copy_location(s, chunk); add_chunk(ns, chunk, allow); Printf(ns, "%sfile%s%s%s\"%s\" %%beginfile\n", decl, options_whitespace, opt, filename_whitespace, Swig_filename_escape(Swig_last_file())); if (Equal(decl, kpp_dimport)) { push_imported(); } dirname = Swig_file_dirname(Swig_last_file()); if (sysfile || !Len(dirname)) { Delete(dirname); dirname = 0; } if (dirname) { int len = Len(dirname); Delslice(dirname, len - 1, len); /* Kill trailing directory delimiter */ Swig_push_directory(dirname); } s2 = Preprocessor_parse(s1); if (dirname) { Swig_pop_directory(); } if (Equal(decl, kpp_dimport)) { pop_imported(); } addline(ns, s2, allow); Append(ns, "%endoffile"); Delete(s2); Delete(dirname); Delete(s1); } Delete(fn); Delete(filename_whitespace); Delete(options_whitespace); } state = 1; } else if (Equal(decl, kpp_dbeginfile)) { /* Got an internal directive marking the beginning of an included file: %beginfile ... %endoffile */ filelevel++; start_line = Getline(s); copy_location(s, chunk); add_chunk(ns, chunk, allow); Append(chunk, decl); state = 120; } else if (Equal(decl, kpp_dline)) { /* Got a line directive */ state = 1; } else if (Equal(decl, kpp_ddefine)) { /* Got a define directive */ dlevel++; copy_location(s, chunk); add_chunk(ns, chunk, allow); Clear(value); copy_location(s, value); state = 150; } else { Append(chunk, decl); state = 1; } } else { Putc(c, decl); } break; /* Searching for the end of a %beginfile block */ case 120: Putc(c, chunk); if (c == '%') { const char *bf = "beginfile"; const char *ef = "endoffile"; char statement[10]; int i = 0; for (i = 0; i < 9;) { c = Getc(s); Putc(c, chunk); statement[i++] = (char)c; if (strncmp(statement, bf, i) && strncmp(statement, ef, i)) break; } c = Getc(s); Ungetc(c, s); if ((i == 9) && (isspace(c))) { if (strncmp(statement, bf, i) == 0) { ++filelevel; } else if (strncmp(statement, ef, i) == 0) { --filelevel; if (!filelevel) { /* Reached end of included file */ addline(ns, chunk, allow); Clear(chunk); copy_location(s, chunk); state = 1; } } } } break; /* Searching for the end of a %define statement */ case 150: Putc(c, value); if (c == '%') { const char *ed = "enddef"; const char *df = "define"; char statement[7]; int i = 0; for (i = 0; i < 6;) { c = Getc(s); Putc(c, value); statement[i++] = (char)c; if (strncmp(statement, ed, i) && strncmp(statement, df, i)) break; } c = Getc(s); Ungetc(c, s); if ((i == 6) && (isspace(c))) { if (strncmp(statement, df, i) == 0) { ++dlevel; } else { if (strncmp(statement, ed, i) == 0) { --dlevel; if (!dlevel) { /* Got the macro */ for (i = 0; i < 7; i++) { Delitem(value, DOH_END); } if (allow) { Seek(value, 0, SEEK_SET); Preprocessor_define(value, 1); } addline(ns, value, 0); state = 0; } } } } } break; default: Printf(stderr, "cpp: Invalid parser state %d\n", state); abort(); break; } } while (level > 0) { Swig_error(Getfile(s), cond_lines[level - 1], "Missing #endif for conditional starting here\n"); level--; } if (state == 120) { Swig_error(Getfile(s), start_line, "Missing %%endoffile for file inclusion block starting here\n"); } if (state == 150) { Seek(value, 0, SEEK_SET); Swig_error(Getfile(s), Getline(value), "Missing %%enddef for macro starting here\n", Getline(value)); } if ((state >= 105) && (state < 107)) { Swig_error(Getfile(s), start_line, "Unterminated %%{ ... %%} block\n"); } if ((state >= 30) && (state < 40)) { Swig_error(Getfile(s), start_line, "Unterminated comment\n"); } copy_location(s, chunk); add_chunk(ns, chunk, allow); /* DelScope(scp); */ Delete(decl); Delete(id); Delete(value); Delete(comment); Delete(chunk); return ns; } swig-4.0.1/Source/Makefile.in0000644000175000017500000012524413527234047015667 0ustar williamwilliam# Makefile.in generated by automake 1.15.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2017 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ bin_PROGRAMS = eswig$(EXEEXT) subdir = Source ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = \ $(top_srcdir)/Tools/config/ac_compile_warnings.m4 \ $(top_srcdir)/Tools/config/ac_define_dir.m4 \ $(top_srcdir)/Tools/config/ax_boost_base.m4 \ $(top_srcdir)/Tools/config/ax_compare_version.m4 \ $(top_srcdir)/Tools/config/ax_cxx_compile_stdcxx_11.m4 \ $(top_srcdir)/Tools/config/ax_path_generic.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/Source/Include/swigconfig.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__installdirs = "$(DESTDIR)$(bindir)" PROGRAMS = $(bin_PROGRAMS) am__dirstamp = $(am__leading_dot)dirstamp am_eswig_OBJECTS = CParse/cscanner.$(OBJEXT) CParse/parser.$(OBJEXT) \ CParse/templ.$(OBJEXT) CParse/util.$(OBJEXT) \ DOH/base.$(OBJEXT) DOH/file.$(OBJEXT) DOH/fio.$(OBJEXT) \ DOH/hash.$(OBJEXT) DOH/list.$(OBJEXT) DOH/memory.$(OBJEXT) \ DOH/string.$(OBJEXT) DOH/void.$(OBJEXT) \ Doxygen/doxyentity.$(OBJEXT) Doxygen/doxyparser.$(OBJEXT) \ Doxygen/doxytranslator.$(OBJEXT) Doxygen/javadoc.$(OBJEXT) \ Doxygen/pydoc.$(OBJEXT) Modules/allocate.$(OBJEXT) \ Modules/browser.$(OBJEXT) Modules/contract.$(OBJEXT) \ Modules/csharp.$(OBJEXT) Modules/d.$(OBJEXT) \ Modules/directors.$(OBJEXT) Modules/emit.$(OBJEXT) \ Modules/go.$(OBJEXT) Modules/guile.$(OBJEXT) \ Modules/interface.$(OBJEXT) Modules/java.$(OBJEXT) \ Modules/javascript.$(OBJEXT) Modules/lang.$(OBJEXT) \ Modules/lua.$(OBJEXT) Modules/main.$(OBJEXT) \ Modules/mzscheme.$(OBJEXT) Modules/nested.$(OBJEXT) \ Modules/ocaml.$(OBJEXT) Modules/octave.$(OBJEXT) \ Modules/overload.$(OBJEXT) Modules/perl5.$(OBJEXT) \ Modules/php.$(OBJEXT) Modules/python.$(OBJEXT) \ Modules/r.$(OBJEXT) Modules/ruby.$(OBJEXT) \ Modules/scilab.$(OBJEXT) Modules/swigmain.$(OBJEXT) \ Modules/tcl8.$(OBJEXT) Modules/typepass.$(OBJEXT) \ Modules/utils.$(OBJEXT) Modules/xml.$(OBJEXT) \ Preprocessor/cpp.$(OBJEXT) Preprocessor/expr.$(OBJEXT) \ Swig/cwrap.$(OBJEXT) Swig/deprecate.$(OBJEXT) \ Swig/error.$(OBJEXT) Swig/extend.$(OBJEXT) \ Swig/fragment.$(OBJEXT) Swig/getopt.$(OBJEXT) \ Swig/include.$(OBJEXT) Swig/misc.$(OBJEXT) \ Swig/naming.$(OBJEXT) Swig/parms.$(OBJEXT) \ Swig/scanner.$(OBJEXT) Swig/stype.$(OBJEXT) \ Swig/symbol.$(OBJEXT) Swig/tree.$(OBJEXT) \ Swig/typemap.$(OBJEXT) Swig/typeobj.$(OBJEXT) \ Swig/typesys.$(OBJEXT) Swig/wrapfunc.$(OBJEXT) eswig_OBJECTS = $(am_eswig_OBJECTS) eswig_DEPENDENCIES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = depcomp = $(SHELL) $(top_srcdir)/Tools/config/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = am__yacc_c2h = sed -e s/cc$$/hh/ -e s/cpp$$/hpp/ -e s/cxx$$/hxx/ \ -e s/c++$$/h++/ -e s/c$$/h/ YACCCOMPILE = $(YACC) $(AM_YFLAGS) $(YFLAGS) AM_V_YACC = $(am__v_YACC_@AM_V@) am__v_YACC_ = $(am__v_YACC_@AM_DEFAULT_V@) am__v_YACC_0 = @echo " YACC " $@; am__v_YACC_1 = YLWRAP = $(top_srcdir)/Tools/config/ylwrap SOURCES = $(eswig_SOURCES) DIST_SOURCES = $(eswig_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__DIST_COMMON = $(srcdir)/Makefile.in \ $(top_srcdir)/Tools/config/depcomp \ $(top_srcdir)/Tools/config/ylwrap CParse/parser.c \ CParse/parser.h README DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ADB = @ADB@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ ANDROID = @ANDROID@ ANT = @ANT@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BOOST_CPPFLAGS = @BOOST_CPPFLAGS@ BOOST_LDFLAGS = @BOOST_LDFLAGS@ CAMLP4 = @CAMLP4@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CCSHARED = @CCSHARED@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CSHARPCFLAGS = @CSHARPCFLAGS@ CSHARPCILINTERPRETER = @CSHARPCILINTERPRETER@ CSHARPCILINTERPRETER_FLAGS = @CSHARPCILINTERPRETER_FLAGS@ CSHARPCOMPILER = @CSHARPCOMPILER@ CSHARPCONVERTPATH = @CSHARPCONVERTPATH@ CSHARPDYNAMICLINKING = @CSHARPDYNAMICLINKING@ CSHARPLIBRARYPREFIX = @CSHARPLIBRARYPREFIX@ CSHARPSO = @CSHARPSO@ CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CXXSHARED = @CXXSHARED@ CYGPATH_W = @CYGPATH_W@ D1COMPILER = @D1COMPILER@ D2COMPILER = @D2COMPILER@ DDEFAULTVERSION = @DDEFAULTVERSION@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLIBPREFIX = @DLIBPREFIX@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_CCACHE = @ENABLE_CCACHE@ EXEEXT = @EXEEXT@ EXTRA_CLEAN = @EXTRA_CLEAN@ GCCGO = @GCCGO@ GCCGOOPT = @GCCGOOPT@ GO = @GO@ GO1 = @GO1@ GO12 = @GO12@ GO13 = @GO13@ GO15 = @GO15@ GOC = @GOC@ GOGCC = @GOGCC@ GOOPT = @GOOPT@ GOVERSIONOPTION = @GOVERSIONOPTION@ GREP = @GREP@ GUILE = @GUILE@ GUILE_CFLAGS = @GUILE_CFLAGS@ GUILE_CONFIG = @GUILE_CONFIG@ GUILE_LIBS = @GUILE_LIBS@ GUILE_SO = @GUILE_SO@ HAVE_CXX11_COMPILER = @HAVE_CXX11_COMPILER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ JAVA = @JAVA@ JAVAC = @JAVAC@ JAVACFLAGS = @JAVACFLAGS@ JAVACXXSHARED = @JAVACXXSHARED@ JAVADYNAMICLINKING = @JAVADYNAMICLINKING@ JAVAFLAGS = @JAVAFLAGS@ JAVAINC = @JAVAINC@ JAVALDSHARED = @JAVALDSHARED@ JAVALIBRARYPREFIX = @JAVALIBRARYPREFIX@ JAVASO = @JAVASO@ JAVA_CLASSPATH_SEP = @JAVA_CLASSPATH_SEP@ JAVA_TOOLS_JAR = @JAVA_TOOLS_JAR@ JSCENABLED = @JSCENABLED@ JSCOREDYNAMICLINKING = @JSCOREDYNAMICLINKING@ JSCOREINC = @JSCOREINC@ JSCOREVERSION = @JSCOREVERSION@ JSINTERPRETERCXX = @JSINTERPRETERCXX@ JSINTERPRETERLINKFLAGS = @JSINTERPRETERLINKFLAGS@ JSV8DYNAMICLINKING = @JSV8DYNAMICLINKING@ JSV8ENABLED = @JSV8ENABLED@ JSV8INC = @JSV8INC@ LDFLAGS = @LDFLAGS@ LDSHARED = @LDSHARED@ LIBC = @LIBC@ LIBCRYPT = @LIBCRYPT@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LINKFORSHARED = @LINKFORSHARED@ LTLIBOBJS = @LTLIBOBJS@ LUABIN = @LUABIN@ LUADYNAMICLINKING = @LUADYNAMICLINKING@ LUAFLAGS = @LUAFLAGS@ LUALINK = @LUALINK@ LUA_SO = @LUA_SO@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MZC = @MZC@ MZDYNOBJ = @MZDYNOBJ@ MZSCHEME = @MZSCHEME@ MZSCHEME_SO = @MZSCHEME_SO@ NDKBUILD = @NDKBUILD@ NODEGYP = @NODEGYP@ NODEJS = @NODEJS@ OBJEXT = @OBJEXT@ OCAMLC = @OCAMLC@ OCAMLDLGEN = @OCAMLDLGEN@ OCAMLFIND = @OCAMLFIND@ OCAMLMKTOP = @OCAMLMKTOP@ OCTAVE = @OCTAVE@ OCTAVE_CPPFLAGS = @OCTAVE_CPPFLAGS@ OCTAVE_CXXFLAGS = @OCTAVE_CXXFLAGS@ OCTAVE_LDFLAGS = @OCTAVE_LDFLAGS@ OCTAVE_SO = @OCTAVE_SO@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PCRE_CFLAGS = @PCRE_CFLAGS@ PCRE_CONFIG = @PCRE_CONFIG@ PCRE_LIBS = @PCRE_LIBS@ PERL = @PERL@ PERL5CCCDLFLAGS = @PERL5CCCDLFLAGS@ PERL5CCDLFLAGS = @PERL5CCDLFLAGS@ PERL5CCFLAGS = @PERL5CCFLAGS@ PERL5DYNAMICLINKING = @PERL5DYNAMICLINKING@ PERL5EXT = @PERL5EXT@ PERL5LDFLAGS = @PERL5LDFLAGS@ PERL5LIB = @PERL5LIB@ PHP = @PHP@ PHPINC = @PHPINC@ PHP_SO = @PHP_SO@ PKGCONFIG = @PKGCONFIG@ PLATCFLAGS = @PLATCFLAGS@ PLATCXXFLAGS = @PLATCXXFLAGS@ PY2TO3 = @PY2TO3@ PY3CONFIG = @PY3CONFIG@ PY3INCLUDE = @PY3INCLUDE@ PY3LIB = @PY3LIB@ PY3LINK = @PY3LINK@ PYCODESTYLE = @PYCODESTYLE@ PYINCLUDE = @PYINCLUDE@ PYLIB = @PYLIB@ PYLINK = @PYLINK@ PYTHON = @PYTHON@ PYTHON3 = @PYTHON3@ PYTHON3DYNAMICLINKING = @PYTHON3DYNAMICLINKING@ PYTHONDYNAMICLINKING = @PYTHONDYNAMICLINKING@ PYTHON_SO = @PYTHON_SO@ RBIN = @RBIN@ ROOT_DIR = @ROOT_DIR@ RPATH = @RPATH@ RUBY = @RUBY@ RUBYCCDLFLAGS = @RUBYCCDLFLAGS@ RUBYDYNAMICLINKING = @RUBYDYNAMICLINKING@ RUBYINCLUDE = @RUBYINCLUDE@ RUBYLIB = @RUBYLIB@ RUBYLINK = @RUBYLINK@ RUBYSO = @RUBYSO@ SCILAB = @SCILAB@ SCILABINCLUDE = @SCILABINCLUDE@ SCILABOPT = @SCILABOPT@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SKIP_ANDROID = @SKIP_ANDROID@ SKIP_CSHARP = @SKIP_CSHARP@ SKIP_D = @SKIP_D@ SKIP_GO = @SKIP_GO@ SKIP_GUILE = @SKIP_GUILE@ SKIP_JAVA = @SKIP_JAVA@ SKIP_JAVASCRIPT = @SKIP_JAVASCRIPT@ SKIP_LUA = @SKIP_LUA@ SKIP_MZSCHEME = @SKIP_MZSCHEME@ SKIP_OCAML = @SKIP_OCAML@ SKIP_OCTAVE = @SKIP_OCTAVE@ SKIP_PERL5 = @SKIP_PERL5@ SKIP_PHP = @SKIP_PHP@ SKIP_PYTHON = @SKIP_PYTHON@ SKIP_PYTHON3 = @SKIP_PYTHON3@ SKIP_R = @SKIP_R@ SKIP_RUBY = @SKIP_RUBY@ SKIP_SCILAB = @SKIP_SCILAB@ SKIP_TCL = @SKIP_TCL@ SO = @SO@ STRIP = @STRIP@ SWIGLIBS = @SWIGLIBS@ SWIG_LIB = @SWIG_LIB@ SWIG_LIB_INSTALL = @SWIG_LIB_INSTALL@ SWIG_LIB_PREINST = @SWIG_LIB_PREINST@ SWIG_LIB_SET = @SWIG_LIB_SET@ SWILL = @SWILL@ TCLCXXSHARED = @TCLCXXSHARED@ TCLDYNAMICLINKING = @TCLDYNAMICLINKING@ TCLINCLUDE = @TCLINCLUDE@ TCLLDSHARED = @TCLLDSHARED@ TCLLIB = @TCLLIB@ TCL_SO = @TCL_SO@ TRYLINKINGWITHCXX = @TRYLINKINGWITHCXX@ VERSION = @VERSION@ YACC = @YACC@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_aux_dir = @ac_aux_dir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ # subdir-objects generates object files using the directory structure of the source files. AUTOMAKE_OPTIONS = foreign nostdinc subdir-objects 1.7.2 SOURCE_DIR = $(top_srcdir)/Source BUILD_SOURCE_DIR = $(top_builddir)/Source SWIG_CXX_DEFS = @SWILL@ AM_CPPFLAGS = -I$(BUILD_SOURCE_DIR)/Include \ -I$(BUILD_SOURCE_DIR)/CParse \ -I$(SOURCE_DIR)/Include \ -I$(SOURCE_DIR)/DOH \ -I$(SOURCE_DIR)/CParse \ -I$(SOURCE_DIR)/Doxygen \ -I$(SOURCE_DIR)/Preprocessor \ -I$(SOURCE_DIR)/Swig \ -I$(SOURCE_DIR)/Modules AM_CXXFLAGS = $(SWIG_CXX_DEFS) AM_YFLAGS = -d BUILT_SOURCES = CParse/parser.h eswig_SOURCES = CParse/cscanner.c \ CParse/parser.y \ CParse/templ.c \ CParse/util.c \ DOH/base.c \ DOH/file.c \ DOH/fio.c \ DOH/hash.c \ DOH/list.c \ DOH/memory.c \ DOH/string.c \ DOH/void.c \ Doxygen/doxyentity.cxx \ Doxygen/doxyentity.h \ Doxygen/doxyparser.cxx \ Doxygen/doxyparser.h \ Doxygen/doxytranslator.cxx \ Doxygen/doxytranslator.h \ Doxygen/javadoc.cxx \ Doxygen/javadoc.h \ Doxygen/pydoc.cxx \ Doxygen/pydoc.h \ Modules/allocate.cxx \ Modules/browser.cxx \ Modules/contract.cxx \ Modules/csharp.cxx \ Modules/d.cxx \ Modules/directors.cxx \ Modules/emit.cxx \ Modules/go.cxx \ Modules/guile.cxx \ Modules/interface.cxx \ Modules/java.cxx \ Modules/javascript.cxx \ Modules/lang.cxx \ Modules/lua.cxx \ Modules/main.cxx \ Modules/mzscheme.cxx \ Modules/nested.cxx \ Modules/ocaml.cxx \ Modules/octave.cxx \ Modules/overload.cxx \ Modules/perl5.cxx \ Modules/php.cxx \ Modules/python.cxx \ Modules/r.cxx \ Modules/ruby.cxx \ Modules/scilab.cxx \ Modules/swigmain.cxx \ Modules/tcl8.cxx \ Modules/typepass.cxx \ Modules/utils.cxx \ Modules/xml.cxx \ Preprocessor/cpp.c \ Preprocessor/expr.c \ Swig/cwrap.c \ Swig/deprecate.c \ Swig/error.c \ Swig/extend.c \ Swig/fragment.c \ Swig/getopt.c \ Swig/include.c \ Swig/misc.c \ Swig/naming.c \ Swig/parms.c \ Swig/scanner.c \ Swig/stype.c \ Swig/symbol.c \ Swig/tree.c \ Swig/typemap.c \ Swig/typeobj.c \ Swig/typesys.c \ Swig/wrapfunc.c eswig_LDADD = @SWIGLIBS@ # Override the link stage to avoid using Libtool CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ # Beautify the code. # Note that this works well on C code, but does some odd joining of lines for C++ code. # Compiling with -DNDEBUG and no optimisations will allow one to do a binary diff of the # swig executable as a way of checking before and after the 'beautifying'. # Single files can be beautified with the beautify-file target, eg: 'make beautify-file INDENTFILE=chosenfile.c' SWIGTYPEDEFS = -T bool -T File -T DohObjInfo -T Parm -T Language -T List -T TargetLanguageModule -T Typetab -T ModuleFactory -T ErrorMessageFormat -T Symtab -T Hash -T Scanner -T String -T DohBase -T Node -T String_or_char -T SwigType -T Dispatcher -T Wrapper -T DohStringMethods -T DohFileMethods -T DohListMethods -T DohHashMethods -T DOH -T DohIterator -T ParmList -T FILE -T HashNode -T DOHObj_or_char -T DOHFile -T DOHString -T DOHString_or_char -T UpcallData INDENTBAKSDIR = ../IndentBaks all: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) all-am .SUFFIXES: .SUFFIXES: .c .cxx .o .obj .y $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Source/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign Source/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ fi; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p \ ; then echo "$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n;h' \ -e 's|.*|.|' \ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) files[d] = files[d] " " $$1; \ else { print "f", $$3 "/" $$4, $$1; } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ } \ ; done uninstall-binPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ -e 's/$$/$(EXEEXT)/' \ `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(bindir)" && rm -f $$files clean-binPROGRAMS: -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS) CParse/$(am__dirstamp): @$(MKDIR_P) CParse @: > CParse/$(am__dirstamp) CParse/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) CParse/$(DEPDIR) @: > CParse/$(DEPDIR)/$(am__dirstamp) CParse/cscanner.$(OBJEXT): CParse/$(am__dirstamp) \ CParse/$(DEPDIR)/$(am__dirstamp) CParse/parser.h: CParse/parser.c @if test ! -f $@; then rm -f CParse/parser.c; else :; fi @if test ! -f $@; then $(MAKE) $(AM_MAKEFLAGS) CParse/parser.c; else :; fi CParse/parser.$(OBJEXT): CParse/$(am__dirstamp) \ CParse/$(DEPDIR)/$(am__dirstamp) CParse/templ.$(OBJEXT): CParse/$(am__dirstamp) \ CParse/$(DEPDIR)/$(am__dirstamp) CParse/util.$(OBJEXT): CParse/$(am__dirstamp) \ CParse/$(DEPDIR)/$(am__dirstamp) DOH/$(am__dirstamp): @$(MKDIR_P) DOH @: > DOH/$(am__dirstamp) DOH/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) DOH/$(DEPDIR) @: > DOH/$(DEPDIR)/$(am__dirstamp) DOH/base.$(OBJEXT): DOH/$(am__dirstamp) DOH/$(DEPDIR)/$(am__dirstamp) DOH/file.$(OBJEXT): DOH/$(am__dirstamp) DOH/$(DEPDIR)/$(am__dirstamp) DOH/fio.$(OBJEXT): DOH/$(am__dirstamp) DOH/$(DEPDIR)/$(am__dirstamp) DOH/hash.$(OBJEXT): DOH/$(am__dirstamp) DOH/$(DEPDIR)/$(am__dirstamp) DOH/list.$(OBJEXT): DOH/$(am__dirstamp) DOH/$(DEPDIR)/$(am__dirstamp) DOH/memory.$(OBJEXT): DOH/$(am__dirstamp) \ DOH/$(DEPDIR)/$(am__dirstamp) DOH/string.$(OBJEXT): DOH/$(am__dirstamp) \ DOH/$(DEPDIR)/$(am__dirstamp) DOH/void.$(OBJEXT): DOH/$(am__dirstamp) DOH/$(DEPDIR)/$(am__dirstamp) Doxygen/$(am__dirstamp): @$(MKDIR_P) Doxygen @: > Doxygen/$(am__dirstamp) Doxygen/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) Doxygen/$(DEPDIR) @: > Doxygen/$(DEPDIR)/$(am__dirstamp) Doxygen/doxyentity.$(OBJEXT): Doxygen/$(am__dirstamp) \ Doxygen/$(DEPDIR)/$(am__dirstamp) Doxygen/doxyparser.$(OBJEXT): Doxygen/$(am__dirstamp) \ Doxygen/$(DEPDIR)/$(am__dirstamp) Doxygen/doxytranslator.$(OBJEXT): Doxygen/$(am__dirstamp) \ Doxygen/$(DEPDIR)/$(am__dirstamp) Doxygen/javadoc.$(OBJEXT): Doxygen/$(am__dirstamp) \ Doxygen/$(DEPDIR)/$(am__dirstamp) Doxygen/pydoc.$(OBJEXT): Doxygen/$(am__dirstamp) \ Doxygen/$(DEPDIR)/$(am__dirstamp) Modules/$(am__dirstamp): @$(MKDIR_P) Modules @: > Modules/$(am__dirstamp) Modules/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) Modules/$(DEPDIR) @: > Modules/$(DEPDIR)/$(am__dirstamp) Modules/allocate.$(OBJEXT): Modules/$(am__dirstamp) \ Modules/$(DEPDIR)/$(am__dirstamp) Modules/browser.$(OBJEXT): Modules/$(am__dirstamp) \ Modules/$(DEPDIR)/$(am__dirstamp) Modules/contract.$(OBJEXT): Modules/$(am__dirstamp) \ Modules/$(DEPDIR)/$(am__dirstamp) Modules/csharp.$(OBJEXT): Modules/$(am__dirstamp) \ Modules/$(DEPDIR)/$(am__dirstamp) Modules/d.$(OBJEXT): Modules/$(am__dirstamp) \ Modules/$(DEPDIR)/$(am__dirstamp) Modules/directors.$(OBJEXT): Modules/$(am__dirstamp) \ Modules/$(DEPDIR)/$(am__dirstamp) Modules/emit.$(OBJEXT): Modules/$(am__dirstamp) \ Modules/$(DEPDIR)/$(am__dirstamp) Modules/go.$(OBJEXT): Modules/$(am__dirstamp) \ Modules/$(DEPDIR)/$(am__dirstamp) Modules/guile.$(OBJEXT): Modules/$(am__dirstamp) \ Modules/$(DEPDIR)/$(am__dirstamp) Modules/interface.$(OBJEXT): Modules/$(am__dirstamp) \ Modules/$(DEPDIR)/$(am__dirstamp) Modules/java.$(OBJEXT): Modules/$(am__dirstamp) \ Modules/$(DEPDIR)/$(am__dirstamp) Modules/javascript.$(OBJEXT): Modules/$(am__dirstamp) \ Modules/$(DEPDIR)/$(am__dirstamp) Modules/lang.$(OBJEXT): Modules/$(am__dirstamp) \ Modules/$(DEPDIR)/$(am__dirstamp) Modules/lua.$(OBJEXT): Modules/$(am__dirstamp) \ Modules/$(DEPDIR)/$(am__dirstamp) Modules/main.$(OBJEXT): Modules/$(am__dirstamp) \ Modules/$(DEPDIR)/$(am__dirstamp) Modules/mzscheme.$(OBJEXT): Modules/$(am__dirstamp) \ Modules/$(DEPDIR)/$(am__dirstamp) Modules/nested.$(OBJEXT): Modules/$(am__dirstamp) \ Modules/$(DEPDIR)/$(am__dirstamp) Modules/ocaml.$(OBJEXT): Modules/$(am__dirstamp) \ Modules/$(DEPDIR)/$(am__dirstamp) Modules/octave.$(OBJEXT): Modules/$(am__dirstamp) \ Modules/$(DEPDIR)/$(am__dirstamp) Modules/overload.$(OBJEXT): Modules/$(am__dirstamp) \ Modules/$(DEPDIR)/$(am__dirstamp) Modules/perl5.$(OBJEXT): Modules/$(am__dirstamp) \ Modules/$(DEPDIR)/$(am__dirstamp) Modules/php.$(OBJEXT): Modules/$(am__dirstamp) \ Modules/$(DEPDIR)/$(am__dirstamp) Modules/python.$(OBJEXT): Modules/$(am__dirstamp) \ Modules/$(DEPDIR)/$(am__dirstamp) Modules/r.$(OBJEXT): Modules/$(am__dirstamp) \ Modules/$(DEPDIR)/$(am__dirstamp) Modules/ruby.$(OBJEXT): Modules/$(am__dirstamp) \ Modules/$(DEPDIR)/$(am__dirstamp) Modules/scilab.$(OBJEXT): Modules/$(am__dirstamp) \ Modules/$(DEPDIR)/$(am__dirstamp) Modules/swigmain.$(OBJEXT): Modules/$(am__dirstamp) \ Modules/$(DEPDIR)/$(am__dirstamp) Modules/tcl8.$(OBJEXT): Modules/$(am__dirstamp) \ Modules/$(DEPDIR)/$(am__dirstamp) Modules/typepass.$(OBJEXT): Modules/$(am__dirstamp) \ Modules/$(DEPDIR)/$(am__dirstamp) Modules/utils.$(OBJEXT): Modules/$(am__dirstamp) \ Modules/$(DEPDIR)/$(am__dirstamp) Modules/xml.$(OBJEXT): Modules/$(am__dirstamp) \ Modules/$(DEPDIR)/$(am__dirstamp) Preprocessor/$(am__dirstamp): @$(MKDIR_P) Preprocessor @: > Preprocessor/$(am__dirstamp) Preprocessor/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) Preprocessor/$(DEPDIR) @: > Preprocessor/$(DEPDIR)/$(am__dirstamp) Preprocessor/cpp.$(OBJEXT): Preprocessor/$(am__dirstamp) \ Preprocessor/$(DEPDIR)/$(am__dirstamp) Preprocessor/expr.$(OBJEXT): Preprocessor/$(am__dirstamp) \ Preprocessor/$(DEPDIR)/$(am__dirstamp) Swig/$(am__dirstamp): @$(MKDIR_P) Swig @: > Swig/$(am__dirstamp) Swig/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) Swig/$(DEPDIR) @: > Swig/$(DEPDIR)/$(am__dirstamp) Swig/cwrap.$(OBJEXT): Swig/$(am__dirstamp) \ Swig/$(DEPDIR)/$(am__dirstamp) Swig/deprecate.$(OBJEXT): Swig/$(am__dirstamp) \ Swig/$(DEPDIR)/$(am__dirstamp) Swig/error.$(OBJEXT): Swig/$(am__dirstamp) \ Swig/$(DEPDIR)/$(am__dirstamp) Swig/extend.$(OBJEXT): Swig/$(am__dirstamp) \ Swig/$(DEPDIR)/$(am__dirstamp) Swig/fragment.$(OBJEXT): Swig/$(am__dirstamp) \ Swig/$(DEPDIR)/$(am__dirstamp) Swig/getopt.$(OBJEXT): Swig/$(am__dirstamp) \ Swig/$(DEPDIR)/$(am__dirstamp) Swig/include.$(OBJEXT): Swig/$(am__dirstamp) \ Swig/$(DEPDIR)/$(am__dirstamp) Swig/misc.$(OBJEXT): Swig/$(am__dirstamp) \ Swig/$(DEPDIR)/$(am__dirstamp) Swig/naming.$(OBJEXT): Swig/$(am__dirstamp) \ Swig/$(DEPDIR)/$(am__dirstamp) Swig/parms.$(OBJEXT): Swig/$(am__dirstamp) \ Swig/$(DEPDIR)/$(am__dirstamp) Swig/scanner.$(OBJEXT): Swig/$(am__dirstamp) \ Swig/$(DEPDIR)/$(am__dirstamp) Swig/stype.$(OBJEXT): Swig/$(am__dirstamp) \ Swig/$(DEPDIR)/$(am__dirstamp) Swig/symbol.$(OBJEXT): Swig/$(am__dirstamp) \ Swig/$(DEPDIR)/$(am__dirstamp) Swig/tree.$(OBJEXT): Swig/$(am__dirstamp) \ Swig/$(DEPDIR)/$(am__dirstamp) Swig/typemap.$(OBJEXT): Swig/$(am__dirstamp) \ Swig/$(DEPDIR)/$(am__dirstamp) Swig/typeobj.$(OBJEXT): Swig/$(am__dirstamp) \ Swig/$(DEPDIR)/$(am__dirstamp) Swig/typesys.$(OBJEXT): Swig/$(am__dirstamp) \ Swig/$(DEPDIR)/$(am__dirstamp) Swig/wrapfunc.$(OBJEXT): Swig/$(am__dirstamp) \ Swig/$(DEPDIR)/$(am__dirstamp) eswig$(EXEEXT): $(eswig_OBJECTS) $(eswig_DEPENDENCIES) $(EXTRA_eswig_DEPENDENCIES) @rm -f eswig$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(eswig_OBJECTS) $(eswig_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) -rm -f CParse/*.$(OBJEXT) -rm -f DOH/*.$(OBJEXT) -rm -f Doxygen/*.$(OBJEXT) -rm -f Modules/*.$(OBJEXT) -rm -f Preprocessor/*.$(OBJEXT) -rm -f Swig/*.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@CParse/$(DEPDIR)/cscanner.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@CParse/$(DEPDIR)/parser.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@CParse/$(DEPDIR)/templ.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@CParse/$(DEPDIR)/util.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@DOH/$(DEPDIR)/base.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@DOH/$(DEPDIR)/file.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@DOH/$(DEPDIR)/fio.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@DOH/$(DEPDIR)/hash.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@DOH/$(DEPDIR)/list.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@DOH/$(DEPDIR)/memory.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@DOH/$(DEPDIR)/string.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@DOH/$(DEPDIR)/void.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Doxygen/$(DEPDIR)/doxyentity.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Doxygen/$(DEPDIR)/doxyparser.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Doxygen/$(DEPDIR)/doxytranslator.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Doxygen/$(DEPDIR)/javadoc.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Doxygen/$(DEPDIR)/pydoc.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Modules/$(DEPDIR)/allocate.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Modules/$(DEPDIR)/browser.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Modules/$(DEPDIR)/contract.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Modules/$(DEPDIR)/csharp.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Modules/$(DEPDIR)/d.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Modules/$(DEPDIR)/directors.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Modules/$(DEPDIR)/emit.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Modules/$(DEPDIR)/go.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Modules/$(DEPDIR)/guile.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Modules/$(DEPDIR)/interface.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Modules/$(DEPDIR)/java.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Modules/$(DEPDIR)/javascript.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Modules/$(DEPDIR)/lang.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Modules/$(DEPDIR)/lua.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Modules/$(DEPDIR)/main.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Modules/$(DEPDIR)/mzscheme.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Modules/$(DEPDIR)/nested.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Modules/$(DEPDIR)/ocaml.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Modules/$(DEPDIR)/octave.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Modules/$(DEPDIR)/overload.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Modules/$(DEPDIR)/perl5.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Modules/$(DEPDIR)/php.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Modules/$(DEPDIR)/python.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Modules/$(DEPDIR)/r.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Modules/$(DEPDIR)/ruby.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Modules/$(DEPDIR)/scilab.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Modules/$(DEPDIR)/swigmain.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Modules/$(DEPDIR)/tcl8.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Modules/$(DEPDIR)/typepass.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Modules/$(DEPDIR)/utils.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Modules/$(DEPDIR)/xml.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Preprocessor/$(DEPDIR)/cpp.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Preprocessor/$(DEPDIR)/expr.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Swig/$(DEPDIR)/cwrap.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Swig/$(DEPDIR)/deprecate.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Swig/$(DEPDIR)/error.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Swig/$(DEPDIR)/extend.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Swig/$(DEPDIR)/fragment.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Swig/$(DEPDIR)/getopt.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Swig/$(DEPDIR)/include.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Swig/$(DEPDIR)/misc.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Swig/$(DEPDIR)/naming.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Swig/$(DEPDIR)/parms.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Swig/$(DEPDIR)/scanner.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Swig/$(DEPDIR)/stype.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Swig/$(DEPDIR)/symbol.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Swig/$(DEPDIR)/tree.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Swig/$(DEPDIR)/typemap.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Swig/$(DEPDIR)/typeobj.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Swig/$(DEPDIR)/typesys.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Swig/$(DEPDIR)/wrapfunc.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cxx.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cxx.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .y.c: $(AM_V_YACC)$(am__skipyacc) $(SHELL) $(YLWRAP) $< y.tab.c $@ y.tab.h `echo $@ | $(am__yacc_c2h)` y.output $*.output -- $(YACCCOMPILE) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-am all-am: Makefile $(PROGRAMS) all-local installdirs: for dir in "$(DESTDIR)$(bindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) -rm -f CParse/$(DEPDIR)/$(am__dirstamp) -rm -f CParse/$(am__dirstamp) -rm -f DOH/$(DEPDIR)/$(am__dirstamp) -rm -f DOH/$(am__dirstamp) -rm -f Doxygen/$(DEPDIR)/$(am__dirstamp) -rm -f Doxygen/$(am__dirstamp) -rm -f Modules/$(DEPDIR)/$(am__dirstamp) -rm -f Modules/$(am__dirstamp) -rm -f Preprocessor/$(DEPDIR)/$(am__dirstamp) -rm -f Preprocessor/$(am__dirstamp) -rm -f Swig/$(DEPDIR)/$(am__dirstamp) -rm -f Swig/$(am__dirstamp) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -rm -f CParse/parser.c -rm -f CParse/parser.h -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) clean: clean-am clean-am: clean-binPROGRAMS clean-generic clean-local mostlyclean-am distclean: distclean-am -rm -rf CParse/$(DEPDIR) DOH/$(DEPDIR) Doxygen/$(DEPDIR) Modules/$(DEPDIR) Preprocessor/$(DEPDIR) Swig/$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-local distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-binPROGRAMS install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf CParse/$(DEPDIR) DOH/$(DEPDIR) Doxygen/$(DEPDIR) Modules/$(DEPDIR) Preprocessor/$(DEPDIR) Swig/$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-binPROGRAMS .MAKE: all check install install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am all-local check check-am clean \ clean-binPROGRAMS clean-generic clean-local cscopelist-am \ ctags ctags-am distclean distclean-compile distclean-generic \ distclean-local distclean-tags distdir dvi dvi-am html html-am \ info info-am install install-am install-binPROGRAMS \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic pdf pdf-am ps ps-am tags tags-am uninstall \ uninstall-am uninstall-binPROGRAMS .PRECIOUS: Makefile # The executable is copied to the root directory for installation and running the test-suite. # This occurs on each invocation of make and is a step towards providing support for multiple # build directories. all-local: eswig@EXEEXT@ cp -f $(top_builddir)/Source/eswig@EXEEXT@ $(top_builddir)/swig@EXEEXT@ clean-local: rm -f $(top_builddir)/swig@EXEEXT@ rm -f core @EXTRA_CLEAN@ distclean-local: rm -f $(top_builddir)/Source/Include/swigconfig.h rm -f $(top_builddir)/Source/Include/stamp-h1 beautify: rm -rf $(INDENTBAKSDIR) mkdir $(INDENTBAKSDIR) mkdir $(INDENTBAKSDIR)/CParse mkdir $(INDENTBAKSDIR)/DOH mkdir $(INDENTBAKSDIR)/Modules mkdir $(INDENTBAKSDIR)/Preprocessor mkdir $(INDENTBAKSDIR)/Swig mkdir $(INDENTBAKSDIR)/Include (csources=`find . -name "*.c"` && \ hsources=`find . -name "*.h"` && \ cxxsources=`find . -name "*.cxx"` && \ for file in $$csources $$hsources $$cxxsources; do \ $(MAKE) beautify-file INDENTFILE=$$file; \ done; ) beautify-file: test -e $(INDENTBAKSDIR) || (echo $(INDENTBAKSDIR) directory does not exist && exit 1;) test -n "$(INDENTFILE)" || (echo INDENTFILE not defined && exit 1;) test -e $(INDENTFILE) || (echo File does not exist: $(INDENTFILE) && exit 1;) cp $(INDENTFILE) $(INDENTBAKSDIR)/$(INDENTFILE); indent -kr --honour-newlines --line-length160 --indent-level2 --braces-on-func-def-line --leave-optional-blank-lines $(SWIGTYPEDEFS) $(INDENTFILE) -o $(INDENTFILE).tmp; cat $(INDENTFILE).tmp | sed -e 's/const const /const /' > $(INDENTFILE); rm $(INDENTFILE).tmp; # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: swig-4.0.1/Source/Swig/0000755000175000017500000000000013527063513014521 5ustar williamwilliamswig-4.0.1/Source/Swig/typeobj.c0000644000175000017500000010250513527063513016344 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * typeobj.c * * This file provides functions for constructing, manipulating, and testing * type objects. Type objects are merely the raw low-level representation * of C++ types. They do not incorporate high-level type system features * like typedef, namespaces, etc. * ----------------------------------------------------------------------------- */ #include "swig.h" #include #include /* ----------------------------------------------------------------------------- * Synopsis * * This file provides a collection of low-level functions for constructing and * manipulating C++ data types. In SWIG, C++ datatypes are encoded as simple * text strings. This representation is compact, easy to debug, and easy to read. * * General idea: * * Types are represented by a base type (e.g., "int") and a collection of * type operators applied to the base (e.g., pointers, arrays, etc...). * * Encoding: * * Types are encoded as strings of type constructors such as follows: * * String Encoding C Example * --------------- --------- * p.p.int int ** * a(300).a(400).int int [300][400] * p.q(const).char char const * * * All type constructors are denoted by a trailing '.': * * 'p.' = Pointer (*) * 'r.' = Reference or ref-qualifier (&) * 'z.' = Rvalue reference or ref-qualifier (&&) * 'a(n).' = Array of size n [n] * 'f(..,..).' = Function with arguments (args) * 'q(str).' = Qualifier, such as const or volatile (cv-qualifier) * 'm(cls).' = Pointer to member (cls::*) * * The complete type representation for varargs is: * 'v(...)' * * The encoding follows the order that you might describe a type in words. * For example "p.a(200).int" is "A pointer to array of int's" and * "p.q(const).char" is "a pointer to a const char". * * This representation of types is fairly convenient because ordinary string * operations can be used for type manipulation. For example, a type could be * formed by combining two strings such as the following: * * "p.p." + "a(400).int" = "p.p.a(400).int" * * For C++, typenames may be parameterized using <(...)>. Here are some * examples: * * String Encoding C++ Example * --------------- ------------ * p.vector<(int)> vector * * r.foo<(int,p.double)> foo & * * Contents of this file: * * Most of this functions in this file pertain to the low-level manipulation * of type objects. There are constructor functions like this: * * SwigType_add_pointer() * SwigType_add_reference() * SwigType_add_rvalue_reference() * SwigType_add_array() * * These are used to build new types. There are also functions to undo these * operations. For example: * * SwigType_del_pointer() * SwigType_del_reference() * SwigType_del_rvalue_reference() * SwigType_del_array() * * In addition, there are query functions * * SwigType_ispointer() * SwigType_isreference() * SwigType_isrvalue_reference() * SwigType_isarray() * * Finally, there are some data extraction functions that can be used to * extract array dimensions, template arguments, and so forth. * * It is very important for developers to realize that the functions in this * module do *NOT* incorporate higher-level type system features like typedef. * For example, you could have C code like this: * * typedef int *intptr; * * In this case, a SwigType of type 'intptr' will be treated as a simple type and * functions like SwigType_ispointer() will evaluate as false. It is strongly * advised that developers use the TypeSys_* interface to check types in a more * reliable manner. * ----------------------------------------------------------------------------- */ /* ----------------------------------------------------------------------------- * NewSwigType() * * Constructs a new type object. Eventually, it would be nice for this function * to accept an initial value in the form a C/C++ abstract type (currently unimplemented). * ----------------------------------------------------------------------------- */ #ifdef NEW SwigType *NewSwigType(const_String_or_char_ptr initial) { return NewString(initial); } #endif /* The next few functions are utility functions used in the construction and management of types */ /* ----------------------------------------------------------------------------- * static element_size() * * This utility function finds the size of a single type element in a type string. * Type elements are always delimited by periods, but may be nested with * parentheses. A nested element is always handled as a single item. * * Returns the integer size of the element (which can be used to extract a * substring, to chop the element off, or for other purposes). * ----------------------------------------------------------------------------- */ static int element_size(char *c) { int nparen; char *s = c; while (*c) { if (*c == '.') { c++; return (int) (c - s); } else if (*c == '(') { nparen = 1; c++; while (*c) { if (*c == '(') nparen++; if (*c == ')') { nparen--; if (nparen == 0) break; } c++; } } if (*c) c++; } return (int) (c - s); } /* ----------------------------------------------------------------------------- * SwigType_del_element() * * Deletes one type element from the type. * ----------------------------------------------------------------------------- */ SwigType *SwigType_del_element(SwigType *t) { int sz = element_size(Char(t)); Delslice(t, 0, sz); return t; } /* ----------------------------------------------------------------------------- * SwigType_pop() * * Pop one type element off the type. * For example: * t in: q(const).p.Integer * t out: p.Integer * result: q(const). * ----------------------------------------------------------------------------- */ SwigType *SwigType_pop(SwigType *t) { SwigType *result; char *c; int sz; c = Char(t); if (!*c) return 0; sz = element_size(c); result = NewStringWithSize(c, sz); Delslice(t, 0, sz); c = Char(t); if (*c == '.') { Delitem(t, 0); } return result; } /* ----------------------------------------------------------------------------- * SwigType_parm() * * Returns the parameter of an operator as a string * ----------------------------------------------------------------------------- */ String *SwigType_parm(const SwigType *t) { char *start, *c; int nparens = 0; c = Char(t); while (*c && (*c != '(') && (*c != '.')) c++; if (!*c || (*c == '.')) return 0; c++; start = c; while (*c) { if (*c == ')') { if (nparens == 0) break; nparens--; } else if (*c == '(') { nparens++; } c++; } return NewStringWithSize(start, (int) (c - start)); } /* ----------------------------------------------------------------------------- * SwigType_split() * * Splits a type into its component parts and returns a list of string. * ----------------------------------------------------------------------------- */ List *SwigType_split(const SwigType *t) { String *item; List *list; char *c; int len; c = Char(t); list = NewList(); while (*c) { len = element_size(c); item = NewStringWithSize(c, len); Append(list, item); Delete(item); c = c + len; if (*c == '.') c++; } return list; } /* ----------------------------------------------------------------------------- * SwigType_parmlist() * * Splits a comma separated list of parameters into its component parts * The input is expected to contain the parameter list within () brackets * Returns 0 if no argument list in the input, ie there are no round brackets () * Returns an empty List if there are no parameters in the () brackets * For example: * * Foo(std::string,p.f().Bar<(int,double)>) * * returns 2 elements in the list: * std::string * p.f().Bar<(int,double)> * ----------------------------------------------------------------------------- */ List *SwigType_parmlist(const String *p) { String *item = 0; List *list; char *c; char *itemstart; int size; assert(p); c = Char(p); while (*c && (*c != '(') && (*c != '.')) c++; if (!*c) return 0; assert(*c != '.'); /* p is expected to contain sub elements of a type */ c++; list = NewList(); itemstart = c; while (*c) { if (*c == ',') { size = (int) (c - itemstart); item = NewStringWithSize(itemstart, size); Append(list, item); Delete(item); itemstart = c + 1; } else if (*c == '(') { int nparens = 1; c++; while (*c) { if (*c == '(') nparens++; if (*c == ')') { nparens--; if (nparens == 0) break; } c++; } } else if (*c == ')') { break; } if (*c) c++; } size = (int) (c - itemstart); if (size > 0) { item = NewStringWithSize(itemstart, size); Append(list, item); } Delete(item); return list; } /* ----------------------------------------------------------------------------- * Pointers * * SwigType_add_pointer() * SwigType_del_pointer() * SwigType_ispointer() * * Add, remove, and test if a type is a pointer. The deletion and query * functions take into account qualifiers (if any). * ----------------------------------------------------------------------------- */ SwigType *SwigType_add_pointer(SwigType *t) { Insert(t, 0, "p."); return t; } SwigType *SwigType_del_pointer(SwigType *t) { char *c, *s; c = Char(t); s = c; /* Skip qualifiers, if any */ if (strncmp(c, "q(", 2) == 0) { c = strchr(c, '.'); assert(c); c++; } if (strncmp(c, "p.", 2)) { printf("Fatal error. SwigType_del_pointer applied to non-pointer.\n"); abort(); } Delslice(t, 0, (int)((c - s) + 2)); return t; } int SwigType_ispointer(const SwigType *t) { char *c; if (!t) return 0; c = Char(t); /* Skip qualifiers, if any */ if (strncmp(c, "q(", 2) == 0) { c = strchr(c, '.'); if (!c) return 0; c++; } if (strncmp(c, "p.", 2) == 0) { return 1; } return 0; } /* ----------------------------------------------------------------------------- * References * * SwigType_add_reference() * SwigType_del_reference() * SwigType_isreference() * * Add, remove, and test if a type is a reference. The deletion and query * functions take into account qualifiers (if any). * ----------------------------------------------------------------------------- */ SwigType *SwigType_add_reference(SwigType *t) { Insert(t, 0, "r."); return t; } SwigType *SwigType_del_reference(SwigType *t) { char *c = Char(t); int check = strncmp(c, "r.", 2); assert(check == 0); Delslice(t, 0, 2); return t; } int SwigType_isreference(const SwigType *t) { char *c; if (!t) return 0; c = Char(t); if (strncmp(c, "r.", 2) == 0) { return 1; } return 0; } /* ----------------------------------------------------------------------------- * Rvalue References * * SwigType_add_rvalue_reference() * SwigType_del_rvalue_reference() * SwigType_isrvalue_reference() * * Add, remove, and test if a type is a rvalue reference. The deletion and query * functions take into account qualifiers (if any). * ----------------------------------------------------------------------------- */ SwigType *SwigType_add_rvalue_reference(SwigType *t) { Insert(t, 0, "z."); return t; } SwigType *SwigType_del_rvalue_reference(SwigType *t) { char *c = Char(t); int check = strncmp(c, "z.", 2); assert(check == 0); Delslice(t, 0, 2); return t; } int SwigType_isrvalue_reference(const SwigType *t) { char *c; if (!t) return 0; c = Char(t); if (strncmp(c, "z.", 2) == 0) { return 1; } return 0; } /* ----------------------------------------------------------------------------- * Qualifiers * * SwigType_add_qualifier() * SwigType_del_qualifier() * SwigType_is_qualifier() * * Adds type qualifiers like "const" and "volatile". When multiple qualifiers * are added to a type, they are combined together into a single qualifier. * Repeated qualifications have no effect. Moreover, the order of qualifications * is alphabetical---meaning that "const volatile" and "volatile const" are * stored in exactly the same way as "q(const volatile)". * 'qual' can be a list of multiple qualifiers in any order, separated by spaces. * ----------------------------------------------------------------------------- */ SwigType *SwigType_add_qualifier(SwigType *t, const_String_or_char_ptr qual) { List *qlist; String *allq, *newq; int i, sz; const char *cqprev = 0; const char *c = Char(t); const char *cqual = Char(qual); /* if 't' has no qualifiers and 'qual' is a single qualifier, simply add it */ if ((strncmp(c, "q(", 2) != 0) && (strstr(cqual, " ") == 0)) { String *temp = NewStringf("q(%s).", cqual); Insert(t, 0, temp); Delete(temp); return t; } /* create string of all qualifiers */ if (strncmp(c, "q(", 2) == 0) { allq = SwigType_parm(t); Append(allq, " "); SwigType_del_element(t); /* delete old qualifier list from 't' */ } else { allq = NewStringEmpty(); } Append(allq, qual); /* create list of all qualifiers from string */ qlist = Split(allq, ' ', INT_MAX); Delete(allq); /* sort in alphabetical order */ SortList(qlist, Strcmp); /* create new qualifier string from unique elements of list */ sz = Len(qlist); newq = NewString("q("); for (i = 0; i < sz; ++i) { String *q = Getitem(qlist, i); const char *cq = Char(q); if (cqprev == 0 || strcmp(cqprev, cq) != 0) { if (i > 0) { Append(newq, " "); } Append(newq, q); cqprev = cq; } } Append(newq, ")."); Delete(qlist); /* replace qualifier string with new one */ Insert(t, 0, newq); Delete(newq); return t; } SwigType *SwigType_del_qualifier(SwigType *t) { char *c = Char(t); int check = strncmp(c, "q(", 2); assert(check == 0); Delslice(t, 0, element_size(c)); return t; } int SwigType_isqualifier(const SwigType *t) { char *c; if (!t) return 0; c = Char(t); if (strncmp(c, "q(", 2) == 0) { return 1; } return 0; } /* ----------------------------------------------------------------------------- * Function Pointers * ----------------------------------------------------------------------------- */ int SwigType_isfunctionpointer(const SwigType *t) { char *c; if (!t) return 0; c = Char(t); if (strncmp(c, "p.f(", 4) == 0) { return 1; } return 0; } /* ----------------------------------------------------------------------------- * SwigType_functionpointer_decompose * * Decompose the function pointer into the parameter list and the return type * t - input and on completion contains the return type * returns the function's parameters * ----------------------------------------------------------------------------- */ SwigType *SwigType_functionpointer_decompose(SwigType *t) { String *p; assert(SwigType_isfunctionpointer(t)); p = SwigType_pop(t); Delete(p); p = SwigType_pop(t); return p; } /* ----------------------------------------------------------------------------- * Member Pointers * * SwigType_add_memberpointer() * SwigType_del_memberpointer() * SwigType_ismemberpointer() * * Add, remove, and test for C++ pointer to members. * ----------------------------------------------------------------------------- */ SwigType *SwigType_add_memberpointer(SwigType *t, const_String_or_char_ptr name) { String *temp = NewStringf("m(%s).", name); Insert(t, 0, temp); Delete(temp); return t; } SwigType *SwigType_del_memberpointer(SwigType *t) { char *c = Char(t); int check = strncmp(c, "m(", 2); assert(check == 0); Delslice(t, 0, element_size(c)); return t; } int SwigType_ismemberpointer(const SwigType *t) { char *c; if (!t) return 0; c = Char(t); if (strncmp(c, "m(", 2) == 0) { return 1; } return 0; } /* ----------------------------------------------------------------------------- * Arrays * * SwigType_add_array() * SwigType_del_array() * SwigType_isarray() * * Utility functions: * * SwigType_array_ndim() - Calculate number of array dimensions. * SwigType_array_getdim() - Get array dimension * SwigType_array_setdim() - Set array dimension * SwigType_array_type() - Return array type * SwigType_pop_arrays() - Remove all arrays * ----------------------------------------------------------------------------- */ SwigType *SwigType_add_array(SwigType *t, const_String_or_char_ptr size) { String *temp = NewString("a("); Append(temp, size); Append(temp, ")."); Insert(t, 0, temp); Delete(temp); return t; } SwigType *SwigType_del_array(SwigType *t) { char *c = Char(t); int check = strncmp(c, "a(", 2); assert(check == 0); Delslice(t, 0, element_size(c)); return t; } int SwigType_isarray(const SwigType *t) { char *c; if (!t) return 0; c = Char(t); if (strncmp(c, "a(", 2) == 0) { return 1; } return 0; } /* * SwigType_prefix_is_simple_1D_array * * Determine if the type is a 1D array type that is treated as a pointer within SWIG * eg Foo[], Foo[3] return true, but Foo[3][3], Foo*[], Foo*[3], Foo**[] return false */ int SwigType_prefix_is_simple_1D_array(const SwigType *t) { char *c = Char(t); if (c && (strncmp(c, "a(", 2) == 0)) { c = strchr(c, '.'); if (c) return (*(++c) == 0); } return 0; } /* Remove all arrays */ SwigType *SwigType_pop_arrays(SwigType *t) { String *ta; assert(SwigType_isarray(t)); ta = NewStringEmpty(); while (SwigType_isarray(t)) { SwigType *td = SwigType_pop(t); Append(ta, td); Delete(td); } return ta; } /* Return number of array dimensions */ int SwigType_array_ndim(const SwigType *t) { int ndim = 0; char *c = Char(t); while (c && (strncmp(c, "a(", 2) == 0)) { c = strchr(c, '.'); if (c) { c++; ndim++; } } return ndim; } /* Get nth array dimension */ String *SwigType_array_getdim(const SwigType *t, int n) { char *c = Char(t); while (c && (strncmp(c, "a(", 2) == 0) && (n > 0)) { c = strchr(c, '.'); if (c) { c++; n--; } } if (n == 0) { String *dim = SwigType_parm(c); if (SwigType_istemplate(dim)) { String *ndim = SwigType_namestr(dim); Delete(dim); dim = ndim; } return dim; } return 0; } /* Replace nth array dimension */ void SwigType_array_setdim(SwigType *t, int n, const_String_or_char_ptr rep) { String *result = 0; char temp; char *start; char *c = Char(t); start = c; if (strncmp(c, "a(", 2)) abort(); while (c && (strncmp(c, "a(", 2) == 0) && (n > 0)) { c = strchr(c, '.'); if (c) { c++; n--; } } if (n == 0) { temp = *c; *c = 0; result = NewString(start); Printf(result, "a(%s)", rep); *c = temp; c = strchr(c, '.'); Append(result, c); } Clear(t); Append(t, result); Delete(result); } /* Return base type of an array */ SwigType *SwigType_array_type(const SwigType *ty) { SwigType *t; t = Copy(ty); while (SwigType_isarray(t)) { Delete(SwigType_pop(t)); } return t; } /* ----------------------------------------------------------------------------- * Functions * * SwigType_add_function() * SwigType_isfunction() * SwigType_pop_function() * * Add, remove, and test for function types. * ----------------------------------------------------------------------------- */ /* Returns the function type, t, constructed from the parameters, parms */ SwigType *SwigType_add_function(SwigType *t, ParmList *parms) { String *pstr; Parm *p; Insert(t, 0, ")."); pstr = NewString("f("); for (p = parms; p; p = nextSibling(p)) { if (p != parms) Putc(',', pstr); Append(pstr, Getattr(p, "type")); } Insert(t, 0, pstr); Delete(pstr); return t; } /* ----------------------------------------------------------------------------- * SwigType_pop_function() * * Pop and return the function from the input type leaving the function's return * type, if any. * For example: * t in: q(const).f().p. * t out: p. * result: q(const).f(). * ----------------------------------------------------------------------------- */ SwigType *SwigType_pop_function(SwigType *t) { SwigType *f = 0; SwigType *g = 0; char *c = Char(t); if (strncmp(c, "r.", 2) == 0 || strncmp(c, "z.", 2) == 0) { /* Remove ref-qualifier */ f = SwigType_pop(t); c = Char(t); } if (strncmp(c, "q(", 2) == 0) { /* Remove cv-qualifier */ String *qual = SwigType_pop(t); if (f) { SwigType_push(qual, f); Delete(f); } f = qual; c = Char(t); } if (strncmp(c, "f(", 2)) { printf("Fatal error. SwigType_pop_function applied to non-function.\n"); abort(); } g = SwigType_pop(t); if (f) SwigType_push(g, f); Delete(f); return g; } /* ----------------------------------------------------------------------------- * SwigType_pop_function_qualifiers() * * Pop and return the function qualifiers from the input type leaving the rest of * function declaration. Returns NULL if no qualifiers. * For example: * t in: r.q(const).f().p. * t out: f().p. * result: r.q(const) * ----------------------------------------------------------------------------- */ SwigType *SwigType_pop_function_qualifiers(SwigType *t) { SwigType *qualifiers = 0; char *c = Char(t); if (strncmp(c, "r.", 2) == 0 || strncmp(c, "z.", 2) == 0) { /* Remove ref-qualifier */ String *qual = SwigType_pop(t); qualifiers = qual; c = Char(t); } if (strncmp(c, "q(", 2) == 0) { /* Remove cv-qualifier */ String *qual = SwigType_pop(t); if (qualifiers) { SwigType_push(qual, qualifiers); Delete(qualifiers); } qualifiers = qual; } assert(Strncmp(t, "f(", 2) == 0); return qualifiers; } int SwigType_isfunction(const SwigType *t) { char *c; if (!t) { return 0; } c = Char(t); if (strncmp(c, "r.", 2) == 0 || strncmp(c, "z.", 2) == 0) { /* Might be a function with a ref-qualifier, skip over */ c += 2; if (!*c) return 0; } if (strncmp(c, "q(", 2) == 0) { /* Might be a function with a cv-qualifier, skip over */ c = strchr(c, '.'); if (c) c++; else return 0; } if (strncmp(c, "f(", 2) == 0) { return 1; } return 0; } /* Create a list of parameters from the type t, using the file_line_node Node for * file and line numbering for the parameters */ ParmList *SwigType_function_parms(const SwigType *t, Node *file_line_node) { List *l = SwigType_parmlist(t); Hash *p, *pp = 0, *firstp = 0; Iterator o; for (o = First(l); o.item; o = Next(o)) { p = file_line_node ? NewParm(o.item, 0, file_line_node) : NewParmWithoutFileLineInfo(o.item, 0); if (!firstp) firstp = p; if (pp) { set_nextSibling(pp, p); Delete(p); } pp = p; } Delete(l); return firstp; } int SwigType_isvarargs(const SwigType *t) { if (Strcmp(t, "v(...)") == 0) return 1; return 0; } /* ----------------------------------------------------------------------------- * Templates * * SwigType_add_template() * * Template handling. * ----------------------------------------------------------------------------- */ /* ----------------------------------------------------------------------------- * SwigType_add_template() * * Adds a template to a type. This template is encoded in the SWIG type * mechanism and produces a string like this: * * vector ----> "vector<(p.int)>" * ----------------------------------------------------------------------------- */ SwigType *SwigType_add_template(SwigType *t, ParmList *parms) { Parm *p; Append(t, "<("); for (p = parms; p; p = nextSibling(p)) { String *v; if (Getattr(p, "default")) continue; if (p != parms) Append(t, ","); v = Getattr(p, "value"); if (v) { Append(t, v); } else { Append(t, Getattr(p, "type")); } } Append(t, ")>"); return t; } /* ----------------------------------------------------------------------------- * SwigType_templateprefix() * * Returns the prefix before the first template definition. * Returns the type unmodified if not a template. * For example: * * Foo<(p.int)>::bar => Foo * r.q(const).Foo<(p.int)>::bar => r.q(const).Foo * Foo => Foo * ----------------------------------------------------------------------------- */ String *SwigType_templateprefix(const SwigType *t) { const char *s = Char(t); const char *c = strstr(s, "<("); return c ? NewStringWithSize(s, (int)(c - s)) : NewString(s); } /* ----------------------------------------------------------------------------- * SwigType_templatesuffix() * * Returns text after a template substitution. Used to handle scope names * for example: * * Foo<(p.int)>::bar * * returns "::bar" * ----------------------------------------------------------------------------- */ String *SwigType_templatesuffix(const SwigType *t) { const char *c; c = Char(t); while (*c) { if ((*c == '<') && (*(c + 1) == '(')) { int nest = 1; c++; while (*c && nest) { if (*c == '<') nest++; if (*c == '>') nest--; c++; } return NewString(c); } c++; } return NewStringEmpty(); } /* ----------------------------------------------------------------------------- * SwigType_istemplate_templateprefix() * * Combines SwigType_istemplate and SwigType_templateprefix efficiently into one function. * Returns the prefix before the first template definition. * Returns NULL if not a template. * For example: * * Foo<(p.int)>::bar => Foo * r.q(const).Foo<(p.int)>::bar => r.q(const).Foo * Foo => NULL * ----------------------------------------------------------------------------- */ String *SwigType_istemplate_templateprefix(const SwigType *t) { const char *s = Char(t); const char *c = strstr(s, "<("); return c ? NewStringWithSize(s, (int)(c - s)) : 0; } /* ----------------------------------------------------------------------------- * SwigType_istemplate_only_templateprefix() * * Similar to SwigType_istemplate_templateprefix() but only returns the template * prefix if the type is just the template and not a subtype/symbol within the template. * Returns NULL if not a template or is a template with a symbol within the template. * For example: * * Foo<(p.int)> => Foo * Foo<(p.int)>::bar => NULL * r.q(const).Foo<(p.int)> => r.q(const).Foo * r.q(const).Foo<(p.int)>::bar => NULL * Foo => NULL * ----------------------------------------------------------------------------- */ String *SwigType_istemplate_only_templateprefix(const SwigType *t) { int len = Len(t); const char *s = Char(t); if (len >= 4 && strcmp(s + len - 2, ")>") == 0) { const char *c = strstr(s, "<("); return c ? NewStringWithSize(s, (int)(c - s)) : 0; } else { return 0; } } /* ----------------------------------------------------------------------------- * SwigType_templateargs() * * Returns the template arguments * For example: * * Foo<(p.int)>::bar * * returns "<(p.int)>" * ----------------------------------------------------------------------------- */ String *SwigType_templateargs(const SwigType *t) { const char *c; const char *start; c = Char(t); while (*c) { if ((*c == '<') && (*(c + 1) == '(')) { int nest = 1; start = c; c++; while (*c && nest) { if (*c == '<') nest++; if (*c == '>') nest--; c++; } return NewStringWithSize(start, (int)(c - start)); } c++; } return 0; } /* ----------------------------------------------------------------------------- * SwigType_istemplate() * * Tests a type to see if it includes template parameters * ----------------------------------------------------------------------------- */ int SwigType_istemplate(const SwigType *t) { char *ct = Char(t); ct = strstr(ct, "<("); if (ct && (strstr(ct + 2, ")>"))) return 1; return 0; } /* ----------------------------------------------------------------------------- * SwigType_base() * * This function returns the base of a type. For example, if you have a * type "p.p.int", the function would return "int". * ----------------------------------------------------------------------------- */ SwigType *SwigType_base(const SwigType *t) { char *c; char *lastop = 0; c = Char(t); lastop = c; /* Search for the last type constructor separator '.' */ while (*c) { if (*c == '.') { if (*(c + 1)) { lastop = c + 1; } c++; continue; } if (*c == '<') { /* Skip over template---it's part of the base name */ int ntemp = 1; c++; while ((*c) && (ntemp > 0)) { if (*c == '>') ntemp--; else if (*c == '<') ntemp++; c++; } if (ntemp) break; continue; } if (*c == '(') { /* Skip over params */ int nparen = 1; c++; while ((*c) && (nparen > 0)) { if (*c == '(') nparen++; else if (*c == ')') nparen--; c++; } if (nparen) break; continue; } c++; } return NewString(lastop); } /* ----------------------------------------------------------------------------- * SwigType_prefix() * * Returns the prefix of a datatype. For example, the prefix of the * type "p.p.int" is "p.p.". * ----------------------------------------------------------------------------- */ String *SwigType_prefix(const SwigType *t) { char *c, *d; String *r = 0; c = Char(t); d = c + strlen(c); /* Check for a type constructor */ if ((d > c) && (*(d - 1) == '.')) d--; while (d > c) { d--; if (*d == '>') { int nest = 1; d--; while ((d > c) && (nest)) { if (*d == '>') nest++; if (*d == '<') nest--; d--; } } if (*d == ')') { /* Skip over params */ int nparen = 1; d--; while ((d > c) && (nparen)) { if (*d == ')') nparen++; if (*d == '(') nparen--; d--; } } if (*d == '.') { char t = *(d + 1); *(d + 1) = 0; r = NewString(c); *(d + 1) = t; return r; } } return NewStringEmpty(); } /* ----------------------------------------------------------------------------- * SwigType_strip_qualifiers() * * Strip all qualifiers from a type and return a new type * ----------------------------------------------------------------------------- */ SwigType *SwigType_strip_qualifiers(const SwigType *t) { static Hash *memoize_stripped = 0; SwigType *r; List *l; Iterator ei; if (!memoize_stripped) memoize_stripped = NewHash(); r = Getattr(memoize_stripped, t); if (r) return Copy(r); l = SwigType_split(t); r = NewStringEmpty(); for (ei = First(l); ei.item; ei = Next(ei)) { if (SwigType_isqualifier(ei.item)) continue; Append(r, ei.item); } Delete(l); { String *key, *value; key = Copy(t); value = Copy(r); Setattr(memoize_stripped, key, value); Delete(key); Delete(value); } return r; } /* ----------------------------------------------------------------------------- * SwigType_strip_single_qualifier() * * If the type contains a qualifier, strip one qualifier and return a new type. * The left most qualifier is stripped first (when viewed as C source code) but * this is the equivalent to the right most qualifier using SwigType notation. * Example: * r.q(const).p.q(const).int => r.q(const).p.int * r.q(const).p.int => r.p.int * r.p.int => r.p.int * ----------------------------------------------------------------------------- */ SwigType *SwigType_strip_single_qualifier(const SwigType *t) { static Hash *memoize_stripped = 0; SwigType *r = 0; List *l; int numitems; if (!memoize_stripped) memoize_stripped = NewHash(); r = Getattr(memoize_stripped, t); if (r) return Copy(r); l = SwigType_split(t); numitems = Len(l); if (numitems >= 2) { int item; /* iterate backwards from last but one item */ for (item = numitems - 2; item >= 0; --item) { String *subtype = Getitem(l, item); if (SwigType_isqualifier(subtype)) { Iterator it; Delitem(l, item); r = NewStringEmpty(); for (it = First(l); it.item; it = Next(it)) { Append(r, it.item); } break; } } } if (!r) r = Copy(t); Delete(l); { String *key, *value; key = Copy(t); value = Copy(r); Setattr(memoize_stripped, key, value); Delete(key); Delete(value); } return r; } swig-4.0.1/Source/Swig/typesys.c0000644000175000017500000017776313527063513016432 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * typesys.c * * SWIG type system management. These functions are used to manage * the C++ type system including typenames, typedef, type scopes, * inheritance, and namespaces. Generation of support code for the * run-time type checker is also handled here. * ----------------------------------------------------------------------------- */ #include "swig.h" #include "cparse.h" /* ----------------------------------------------------------------------------- * Synopsis * * The purpose of this module is to manage type names and scoping issues related * to the C++ type system. The primary use is tracking typenames through typedef * and inheritance. * * New typenames are introduced by typedef, class, and enum declarations. * Each type is declared in a scope. This is either the global scope, a * class, or a namespace. For example: * * typedef int A; // Typename A, in global scope * namespace Foo { * typedef int A; // Typename A, in scope Foo:: * } * class Bar { // Typename Bar, in global scope * typedef int A; // Typename A, in scope Bar:: * } * * To manage scopes, the type system is constructed as a tree of hash tables. Each * hash table contains the following attributes: * * "name" - Scope name * "qname" - Fully qualified typename * "typetab" - Type table containing typenames and typedef information * For a given key in the typetab table, the value is a fully * qualified name if not pointing to itself. * "symtab" - Hash table of symbols defined in a scope * "inherit" - List of inherited scopes * "parent" - Parent scope * * The contents of these tables can be viewed for debugging using the -debug-typedef * option which calls SwigType_print_scope(). * * Typedef information is stored in the "typetab" hash table. For example, * if you have these declarations: * * typedef int A; * typedef A B; * typedef B *C; * * typetab in scope '' contains: * "A" : "int" * "B" : "A" * "C" : "p.B" * * To resolve a type back to its root type, one repeatedly expands on the type base. * For example: * * C *[40] ---> a(40).p.C (string type representation, see stype.c) * ---> a(40).p.p.B (C --> p.B) * ---> a(40).p.p.A (B --> A) * ---> a(40).p.p.int (A --> int) * * * Using declarations are stored in the "typetab" hash table. For example, * * namespace NN { * struct SS {}; * } * namespace N { * struct S {}; * using NN::SS; * } * using N::S; * * typetab in scope '' contains: * "S" : "N::S" * * and typetab in scope 'N' contains: * "SS" : "NN::SS" * "S" : "S" * * * For inheritance, SWIG tries to resolve types back to the base class. For instance, if * you have this: * * class Foo { * public: * typedef int Integer; * }; * struct Bar : public Foo { * void blah(Integer x); * }; * * In this case typetab in scope '' contains: * "Foo" : "Foo" * "Bar" : "Bar" * and scope 'Foo' contains: * "Integer" : "int" * and scope 'Bar' inherits from 'Foo' but is empty (observe that blah is not a scope or typedef) * * The argument type of Bar::blah will be set to Foo::Integer. * * * The scope-inheritance mechanism is used to manage C++ using directives. * * namespace XX { * class CC {}; * } * namespace X { * class C {}; * using namespace XX; * } * using namespace X; * * typetab in scope '' inherits from 'X' * typetab in scope 'X' inherits from 'XX' and contains: * "C" : "C" * typetab in scope 'XX' contains: * "CC" : "CC" * * * The scope-inheritance mechanism is used to manage C++ namespace aliases. * For example, if you have this: * * namespace Foo { * typedef int Integer; * } * * namespace F = Foo; * * In this case, F is defined as a scope that "inherits" from Foo. Internally, * F will merely be an empty scope that points to Foo. SWIG will never * place new type information into a namespace alias---attempts to do so * will generate a warning message (in the parser) and will place information into * Foo instead. * *----------------------------------------------------------------------------- */ static Typetab *current_scope = 0; /* Current type scope */ static Hash *current_typetab = 0; /* Current type table */ static Hash *current_symtab = 0; /* Current symbol table */ static Typetab *global_scope = 0; /* The global scope */ static Hash *scopes = 0; /* Hash table containing fully qualified scopes */ /* Performance optimization */ #define SWIG_TYPEDEF_RESOLVE_CACHE static Hash *typedef_resolve_cache = 0; static Hash *typedef_all_cache = 0; static Hash *typedef_qualified_cache = 0; static Typetab *SwigType_find_scope(Typetab *s, const SwigType *nameprefix); /* common attribute keys, to avoid calling find_key all the times */ /* Enable this one if your language fully support SwigValueWrapper. Leaving at '0' keeps the old swig behavior, which is not always safe, but is well known. Setting at '1' activates the new scheme, which is always safe but it requires all the typemaps to be ready for that. */ static int value_wrapper_mode = 0; int Swig_value_wrapper_mode(int mode) { value_wrapper_mode = mode; return mode; } static void flush_cache() { typedef_resolve_cache = 0; typedef_all_cache = 0; typedef_qualified_cache = 0; } /* Initialize the scoping system */ void SwigType_typesystem_init() { if (global_scope) Delete(global_scope); if (scopes) Delete(scopes); current_scope = NewHash(); global_scope = current_scope; Setattr(current_scope, "name", ""); /* No name for global scope */ current_typetab = NewHash(); Setattr(current_scope, "typetab", current_typetab); current_symtab = 0; scopes = NewHash(); Setattr(scopes, "", current_scope); } /* ----------------------------------------------------------------------------- * SwigType_typedef() * * Defines a new typedef in the current scope. Returns -1 if the type name is * already defined. * ----------------------------------------------------------------------------- */ int SwigType_typedef(const SwigType *type, const_String_or_char_ptr name) { /* Printf(stdout, "typedef %s %s\n", type, name); */ if (Getattr(current_typetab, name)) return -1; /* Already defined */ if (Strcmp(type, name) == 0) { /* Can't typedef a name to itself */ return 0; } /* Check if 'type' is already a scope. If so, we create an alias in the type system for it. This is needed to make strange nested scoping problems work correctly. */ { Typetab *t = SwigType_find_scope(current_scope, type); if (t) { SwigType_new_scope(name); SwigType_inherit_scope(t); SwigType_pop_scope(); } } Setattr(current_typetab, name, type); flush_cache(); return 0; } /* ----------------------------------------------------------------------------- * SwigType_typedef_class() * * Defines a class in the current scope. * ----------------------------------------------------------------------------- */ int SwigType_typedef_class(const_String_or_char_ptr name) { String *cname; /* Printf(stdout,"class : '%s'\n", name); */ if (Getattr(current_typetab, name)) return -1; /* Already defined */ cname = NewString(name); Setmeta(cname, "class", "1"); Setattr(current_typetab, cname, cname); Delete(cname); flush_cache(); return 0; } /* ----------------------------------------------------------------------------- * SwigType_scope_name() * * Returns the qualified scope name of a type table * ----------------------------------------------------------------------------- */ String *SwigType_scope_name(Typetab *ttab) { String *qname = NewString(Getattr(ttab, "name")); ttab = Getattr(ttab, "parent"); while (ttab) { String *pname = Getattr(ttab, "name"); if (Len(pname)) { Insert(qname, 0, "::"); Insert(qname, 0, pname); } ttab = Getattr(ttab, "parent"); } return qname; } /* ----------------------------------------------------------------------------- * SwigType_new_scope() * * Creates a new scope * ----------------------------------------------------------------------------- */ void SwigType_new_scope(const_String_or_char_ptr name) { Typetab *s; Hash *ttab; String *qname; if (!name) { name = ""; } s = NewHash(); Setattr(s, "name", name); Setattr(s, "parent", current_scope); ttab = NewHash(); Setattr(s, "typetab", ttab); /* Build fully qualified name */ qname = SwigType_scope_name(s); #if 1 { /* TODO: only do with templates? What happens with non-templates with code below? */ String *stripped_qname; stripped_qname = SwigType_remove_global_scope_prefix(qname); /* Use fully qualified name for hash key without unary scope prefix, qname may contain unary scope */ Setattr(scopes, stripped_qname, s); Setattr(s, "qname", qname); /* Printf(stdout, "SwigType_new_scope stripped %s %s\n", qname, stripped_qname); */ Delete(stripped_qname); } #else Printf(stdout, "SwigType_new_scope %s\n", qname); Setattr(scopes, qname, s); Setattr(s, "qname", qname); #endif Delete(qname); current_scope = s; current_typetab = ttab; current_symtab = 0; flush_cache(); } /* ----------------------------------------------------------------------------- * SwigType_inherit_scope() * * Makes the current scope inherit from another scope. This is used for both * C++ class inheritance, namespaces, and namespace aliases. * ----------------------------------------------------------------------------- */ void SwigType_inherit_scope(Typetab *scope) { List *inherits; int i, len; inherits = Getattr(current_scope, "inherit"); if (!inherits) { inherits = NewList(); Setattr(current_scope, "inherit", inherits); Delete(inherits); } assert(scope != current_scope); len = Len(inherits); for (i = 0; i < len; i++) { Node *n = Getitem(inherits, i); if (n == scope) return; } Append(inherits, scope); } /* ----------------------------------------------------------------------------- * SwigType_scope_alias() * * Creates a scope-alias. * ----------------------------------------------------------------------------- */ void SwigType_scope_alias(String *aliasname, Typetab *ttab) { String *q; /* Printf(stdout,"alias: '%s' '%p'\n", aliasname, ttab); */ q = SwigType_scope_name(current_scope); if (Len(q)) { Append(q, "::"); } Append(q, aliasname); Setattr(scopes, q, ttab); flush_cache(); } /* ----------------------------------------------------------------------------- * SwigType_using_scope() * * Import another scope into this scope. * ----------------------------------------------------------------------------- */ void SwigType_using_scope(Typetab *scope) { SwigType_inherit_scope(scope); { List *ulist; int i, len; ulist = Getattr(current_scope, "using"); if (!ulist) { ulist = NewList(); Setattr(current_scope, "using", ulist); Delete(ulist); } assert(scope != current_scope); len = Len(ulist); for (i = 0; i < len; i++) { Typetab *n = Getitem(ulist, i); if (n == scope) return; } Append(ulist, scope); } flush_cache(); } /* ----------------------------------------------------------------------------- * SwigType_pop_scope() * * Pop off the last scope and perform a merge operation. Returns the hash * table for the scope that was popped off. * ----------------------------------------------------------------------------- */ Typetab *SwigType_pop_scope() { Typetab *t, *old = current_scope; t = Getattr(current_scope, "parent"); if (!t) t = global_scope; current_scope = t; current_typetab = Getattr(t, "typetab"); current_symtab = Getattr(t, "symtab"); flush_cache(); return old; } /* ----------------------------------------------------------------------------- * SwigType_set_scope() * * Set the scope. Returns the old scope. * ----------------------------------------------------------------------------- */ Typetab *SwigType_set_scope(Typetab *t) { Typetab *old = current_scope; if (!t) t = global_scope; current_scope = t; current_typetab = Getattr(t, "typetab"); current_symtab = Getattr(t, "symtab"); flush_cache(); return old; } /* ----------------------------------------------------------------------------- * SwigType_attach_symtab() * * Attaches a symbol table to a type scope * ----------------------------------------------------------------------------- */ void SwigType_attach_symtab(Symtab *sym) { Setattr(current_scope, "symtab", sym); current_symtab = sym; } /* ----------------------------------------------------------------------------- * SwigType_print_scope() * * Debugging function for printing out current scope * ----------------------------------------------------------------------------- */ void SwigType_print_scope(void) { Hash *ttab; Iterator i, j; Printf(stdout, "SCOPES start =======================================\n"); for (i = First(scopes); i.key; i = Next(i)) { Printf(stdout, "-------------------------------------------------------------\n"); ttab = Getattr(i.item, "typetab"); Printf(stdout, "Type scope '%s' (%p)\n", i.key, i.item); { List *inherit = Getattr(i.item, "inherit"); if (inherit) { Iterator j; for (j = First(inherit); j.item; j = Next(j)) { Printf(stdout, " Inherits from '%s' (%p)\n", Getattr(j.item, "qname"), j.item); } } } for (j = First(ttab); j.key; j = Next(j)) { Printf(stdout, "%40s -> %s\n", j.key, j.item); } } Printf(stdout, "SCOPES finish =======================================\n"); } static Typetab *SwigType_find_scope(Typetab *s, const SwigType *nameprefix) { Typetab *ss; Typetab *s_orig = s; String *nnameprefix = 0; static int check_parent = 1; int is_template = 0; if (Getmark(s)) return 0; Setmark(s, 1); is_template = SwigType_istemplate(nameprefix); if (is_template) { nnameprefix = SwigType_typedef_resolve_all(nameprefix); nameprefix = nnameprefix; } ss = s; while (ss) { String *full; String *qname = Getattr(ss, "qname"); if (qname) { full = NewStringf("%s::%s", qname, nameprefix); } else { full = NewString(nameprefix); } s = Getattr(scopes, full); if (!s && is_template) { /* try look up scope with all the unary scope operators within the template parameter list removed */ SwigType *full_stripped = SwigType_remove_global_scope_prefix(full); s = Getattr(scopes, full_stripped); Delete(full_stripped); } Delete(full); if (s) { if (nnameprefix) Delete(nnameprefix); Setmark(s_orig, 0); return s; } if (!s) { /* Check inheritance */ List *inherit; inherit = Getattr(ss, "using"); if (inherit) { Typetab *ttab; int i, len; len = Len(inherit); for (i = 0; i < len; i++) { int oldcp = check_parent; ttab = Getitem(inherit, i); check_parent = 0; s = SwigType_find_scope(ttab, nameprefix); check_parent = oldcp; if (s) { if (nnameprefix) Delete(nnameprefix); Setmark(s_orig, 0); return s; } } } } if (!check_parent) break; ss = Getattr(ss, "parent"); } if (nnameprefix) Delete(nnameprefix); Setmark(s_orig, 0); return 0; } /* ----------------------------------------------------------------------------- * typedef_resolve() * * Resolves a typedef and returns a new type string. Returns 0 if there is no * typedef mapping. base is a name without qualification. * Internal function. * ----------------------------------------------------------------------------- */ static Typetab *resolved_scope = 0; /* Internal function */ static SwigType *_typedef_resolve(Typetab *s, String *base, int look_parent) { Hash *ttab; SwigType *type = 0; List *inherit; Typetab *parent; /* if (!s) return 0; *//* now is checked below */ /* Printf(stdout,"Typetab %s : %s\n", Getattr(s,"name"), base); */ if (!Getmark(s)) { Setmark(s, 1); ttab = Getattr(s, "typetab"); type = Getattr(ttab, base); if (type) { resolved_scope = s; Setmark(s, 0); } else { /* Hmmm. Not found in my scope. It could be in an inherited scope */ inherit = Getattr(s, "inherit"); if (inherit) { int i, len; len = Len(inherit); for (i = 0; i < len; i++) { type = _typedef_resolve(Getitem(inherit, i), base, 0); if (type) { Setmark(s, 0); break; } } } if (!type) { /* Hmmm. Not found in my scope. check parent */ if (look_parent) { parent = Getattr(s, "parent"); type = parent ? _typedef_resolve(parent, base, 1) : 0; } } Setmark(s, 0); } } return type; } /* ----------------------------------------------------------------------------- * template_parameters_resolve() * * For use with templates only. Attempts to resolve one template parameter. * * If one of the template parameters can be resolved, the type is returned with * just the one parameter resolved and the remaining parameters left as is. * If none of the template parameters can be resolved, zero is returned. * ----------------------------------------------------------------------------- */ static String *template_parameters_resolve(const String *base) { List *tparms; String *suffix; String *type; int i, sz; int rep = 0; type = SwigType_templateprefix(base); suffix = SwigType_templatesuffix(base); Append(type, "<("); tparms = SwigType_parmlist(base); sz = Len(tparms); for (i = 0; i < sz; i++) { SwigType *tpr; SwigType *tp = Getitem(tparms, i); if (!rep) { tpr = SwigType_typedef_resolve(tp); } else { tpr = 0; } if (tpr) { Append(type, tpr); Delete(tpr); rep = 1; } else { Append(type, tp); } if ((i + 1) < sz) Append(type, ","); } if (rep) { Append(type, ")>"); Append(type, suffix); } else { Delete(type); type = 0; } Delete(suffix); Delete(tparms); return type; } static SwigType *typedef_resolve(Typetab *s, String *base) { return _typedef_resolve(s, base, 1); } /* ----------------------------------------------------------------------------- * SwigType_typedef_resolve() * * Given a type declaration, this function looks to reduce/resolve the type via a * typedef (including via C++ using declarations). * * If it is able to find a typedef, the resolved type is returned. If no typedef * is found NULL is returned. The type name is resolved in the current scope. * The type returned is not always fully qualified for the global scope, it is * valid for use in the current scope. If the current scope is global scope, a * fully qualified type should be returned. * * Some additional notes are in Doc/Manual/Extending.html. * ----------------------------------------------------------------------------- */ /* #define SWIG_DEBUG */ SwigType *SwigType_typedef_resolve(const SwigType *t) { String *base; String *type = 0; String *r = 0; Typetab *s; Hash *ttab; String *namebase = 0; String *nameprefix = 0, *rnameprefix = 0; int newtype = 0; resolved_scope = 0; #ifdef SWIG_TYPEDEF_RESOLVE_CACHE if (!typedef_resolve_cache) { typedef_resolve_cache = NewHash(); } r = Getattr(typedef_resolve_cache, t); if (r) { resolved_scope = Getmeta(r, "scope"); return Copy(r); } #endif base = SwigType_base(t); #ifdef SWIG_DEBUG Printf(stdout, "base = '%s' t='%s'\n", base, t); #endif if (SwigType_issimple(base)) { s = current_scope; ttab = current_typetab; if (strncmp(Char(base), "::", 2) == 0) { s = global_scope; ttab = Getattr(s, "typetab"); Delitem(base, 0); Delitem(base, 0); } /* Do a quick check in the local scope */ type = Getattr(ttab, base); if (type) { resolved_scope = s; } if (!type) { /* Didn't find in this scope. We need to do a little more searching */ if (Swig_scopename_check(base)) { /* A qualified name. */ Swig_scopename_split(base, &nameprefix, &namebase); #ifdef SWIG_DEBUG Printf(stdout, "nameprefix = '%s'\n", nameprefix); #endif if (nameprefix) { rnameprefix = SwigType_typedef_resolve(nameprefix); if(rnameprefix != NULL) { #ifdef SWIG_DEBUG Printf(stdout, "nameprefix '%s' is a typedef to '%s'\n", nameprefix, rnameprefix); #endif type = Copy(namebase); Insert(type, 0, "::"); Insert(type, 0, rnameprefix); if (strncmp(Char(type), "::", 2) == 0) { Delitem(type, 0); Delitem(type, 0); } newtype = 1; } else { /* Name had a prefix on it. See if we can locate the proper scope for it */ String *rnameprefix = template_parameters_resolve(nameprefix); nameprefix = rnameprefix ? Copy(rnameprefix) : nameprefix; Delete(rnameprefix); s = SwigType_find_scope(s, nameprefix); /* Couldn't locate a scope for the type. */ if (!s) { Delete(base); Delete(namebase); Delete(nameprefix); r = 0; goto return_result; } /* Try to locate the name starting in the scope */ #ifdef SWIG_DEBUG Printf(stdout, "namebase = '%s'\n", namebase); #endif type = typedef_resolve(s, namebase); if (type && resolved_scope) { /* we need to look for the resolved type, this will also fix the resolved_scope if 'type' and 'namebase' are declared in different scopes */ String *rtype = 0; rtype = typedef_resolve(resolved_scope, type); if (rtype) type = rtype; } #ifdef SWIG_DEBUG Printf(stdout, "%s type = '%s'\n", Getattr(s, "name"), type); #endif if ((type) && (!Swig_scopename_check(type)) && resolved_scope) { Typetab *rtab = resolved_scope; String *qname = Getattr(resolved_scope, "qname"); /* If qualified *and* the typename is defined from the resolved scope, we qualify */ if ((qname) && typedef_resolve(resolved_scope, type)) { type = Copy(type); Insert(type, 0, "::"); Insert(type, 0, qname); #ifdef SWIG_DEBUG Printf(stdout, "qual %s \n", type); #endif newtype = 1; } resolved_scope = rtab; } } } else { /* Name is unqualified. */ type = typedef_resolve(s, base); } } else { /* Name is unqualified. */ type = typedef_resolve(s, base); } } if (!type && SwigType_istemplate(base)) { String *tprefix = SwigType_templateprefix(base); String *rtprefix = SwigType_typedef_resolve(tprefix); /* We're looking for a using declaration on the template prefix to resolve the template prefix * in another scope. Using declaration do not have template parameters. */ if (rtprefix && !SwigType_istemplate(rtprefix)) { String *tsuffix = SwigType_templatesuffix(base); String *targs = SwigType_templateargs(base); type = NewString(rtprefix); newtype = 1; Append(type, targs); Append(type, tsuffix); Delete(targs); Delete(tsuffix); Delete(rtprefix); } Delete(tprefix); } if (type && (Equal(base, type))) { if (newtype) Delete(type); Delete(base); Delete(namebase); Delete(nameprefix); r = 0; goto return_result; } /* If the type is a template, and no typedef was found, we need to check the template arguments one by one to see if they can be resolved. */ if (!type && SwigType_istemplate(base)) { newtype = 1; type = template_parameters_resolve(base); } Delete(namebase); Delete(nameprefix); } else { if (SwigType_isfunction(base)) { List *parms; int i, sz; int rep = 0; type = NewString("f("); newtype = 1; parms = SwigType_parmlist(base); sz = Len(parms); for (i = 0; i < sz; i++) { SwigType *tpr; SwigType *tp = Getitem(parms, i); if (!rep) { tpr = SwigType_typedef_resolve(tp); } else { tpr = 0; } if (tpr) { Append(type, tpr); Delete(tpr); rep = 1; } else { Append(type, tp); } if ((i + 1) < sz) Append(type, ","); } Append(type, ")."); Delete(parms); if (!rep) { Delete(type); type = 0; } } else if (SwigType_ismemberpointer(base)) { String *rt; String *mtype = SwigType_parm(base); rt = SwigType_typedef_resolve(mtype); if (rt) { type = NewStringf("m(%s).", rt); newtype = 1; Delete(rt); } Delete(mtype); } else { type = 0; } } r = SwigType_prefix(t); if (!type) { if (r && Len(r)) { char *cr = Char(r); if ((strstr(cr, "f(") || (strstr(cr, "m(")))) { SwigType *rt = SwigType_typedef_resolve(r); if (rt) { Delete(r); Append(rt, base); Delete(base); r = rt; goto return_result; } } } Delete(r); Delete(base); r = 0; goto return_result; } Delete(base); /* If 'type' is an array, then the right-most qualifier in 'r' should be added to 'type' after the array qualifier, so that given a(7).q(volatile).double myarray // typedef volatile double[7] myarray; the type q(const).myarray // const myarray becomes a(7).q(const volatile).double // const volatile double[7] and NOT q(const).a(7).q(volatile).double // non-sensical type */ if (r && Len(r) && SwigType_isarray(type)) { List *r_elem; String *r_qual; int r_sz; r_elem = SwigType_split(r); r_sz = Len(r_elem); r_qual = Getitem(r_elem, r_sz-1); if (SwigType_isqualifier(r_qual)) { String *new_r; String *new_type; List *type_elem; String *type_qual; String *r_qual_arg; int i, type_sz; type_elem = SwigType_split(type); type_sz = Len(type_elem); for (i = 0; i < type_sz; ++i) { String *e = Getitem(type_elem, i); if (!SwigType_isarray(e)) break; } type_qual = Copy(Getitem(type_elem, i)); r_qual_arg = SwigType_parm(r_qual); SwigType_add_qualifier(type_qual, r_qual_arg); Delete(r_qual_arg); Setitem(type_elem, i, type_qual); new_r = NewStringEmpty(); for (i = 0; i < r_sz-1; ++i) { Append(new_r, Getitem(r_elem, i)); } new_type = NewStringEmpty(); for (i = 0; i < type_sz; ++i) { Append(new_type, Getitem(type_elem, i)); } #ifdef SWIG_DEBUG Printf(stdout, "r+type='%s%s' new_r+new_type='%s%s'\n", r, type, new_r, new_type); #endif Delete(r); r = new_r; newtype = 1; type = new_type; Delete(type_elem); } Delete(r_elem); } Append(r, type); if (newtype) { Delete(type); } return_result: #ifdef SWIG_TYPEDEF_RESOLVE_CACHE { String *key = NewString(t); if (r) { SwigType *r1; Setattr(typedef_resolve_cache, key, r); Setmeta(r, "scope", resolved_scope); r1 = Copy(r); Delete(r); r = r1; } Delete(key); } #endif return r; } /* ----------------------------------------------------------------------------- * SwigType_typedef_resolve_all() * * Fully resolve a type down to its most basic datatype * ----------------------------------------------------------------------------- */ SwigType *SwigType_typedef_resolve_all(const SwigType *t) { SwigType *n; SwigType *r; int count = 0; /* Check to see if the typedef resolve has been done before by checking the cache */ if (!typedef_all_cache) { typedef_all_cache = NewHash(); } r = Getattr(typedef_all_cache, t); if (r) { return Copy(r); } #ifdef SWIG_DEBUG Printf(stdout, "SwigType_typedef_resolve_all start ... %s\n", t); #endif /* Recursively resolve the typedef */ r = NewString(t); while ((n = SwigType_typedef_resolve(r))) { Delete(r); r = n; if (++count >= 512) { Swig_error(Getfile(t), Getline(t), "Recursive typedef detected resolving '%s' to '%s' to '%s' and so on...\n", SwigType_str(t, 0), SwigType_str(SwigType_typedef_resolve(t), 0), SwigType_str(SwigType_typedef_resolve(SwigType_typedef_resolve(t)), 0)); break; } } /* Add the typedef to the cache for next time it is looked up */ { String *key; SwigType *rr = Copy(r); key = NewString(t); Setattr(typedef_all_cache, key, rr); Delete(key); Delete(rr); } #ifdef SWIG_DEBUG Printf(stdout, "SwigType_typedef_resolve_all end === %s => %s\n", t, r); #endif return r; } /* ----------------------------------------------------------------------------- * SwigType_typedef_qualified() * * Given a type declaration, this function tries to fully qualify it so that the * resulting type can be used in the global scope. The type name is resolved in * the current scope. * * It provides a fully qualified name, not necessarily a fully expanded name. * When a using declaration or using directive is found the type may not be fully * expanded, but it will be resolved and fully qualified for use in the global scope. * * This function is for looking up scopes to qualify a type. It does not resolve * C typedefs, it just qualifies them. See SwigType_typedef_resolve for resolving. * * If the unary scope operator (::) is used as a prefix to the type to denote global * scope, it is left in place. * ----------------------------------------------------------------------------- */ SwigType *SwigType_typedef_qualified(const SwigType *t) { List *elements; String *result; int i, len; if (!typedef_qualified_cache) typedef_qualified_cache = NewHash(); result = Getattr(typedef_qualified_cache, t); if (result) { String *rc = Copy(result); return rc; } result = NewStringEmpty(); elements = SwigType_split(t); len = Len(elements); for (i = 0; i < len; i++) { String *ty = 0; String *e = Getitem(elements, i); if (SwigType_issimple(e)) { if (!SwigType_istemplate(e)) { String *isenum = 0; if (SwigType_isenum(e)) { isenum = NewString("enum "); ty = NewString(Char(e) + 5); e = ty; } resolved_scope = 0; if (typedef_resolve(current_scope, e) && resolved_scope) { /* resolved_scope contains the scope that actually resolved the symbol */ String *qname = Getattr(resolved_scope, "qname"); if (qname) { Insert(e, 0, "::"); Insert(e, 0, qname); } } else { if (Swig_scopename_check(e)) { String *qlast; String *qname; Swig_scopename_split(e, &qname, &qlast); if (qname) { String *tqname = SwigType_typedef_qualified(qname); Clear(e); Printf(e, "%s::%s", tqname, qlast); Delete(qname); Delete(tqname); } Delete(qlast); /* Automatic template instantiation might go here??? */ } else { /* It's a bare name. It's entirely possible, that the name is part of a namespace. We'll check this by unrolling out of the current scope */ Typetab *cs = current_scope; if (cs) { Typetab *found_scope = SwigType_find_scope(cs, e); if (found_scope) { String *qs = SwigType_scope_name(found_scope); Clear(e); Append(e, qs); Delete(qs); } } } } if (isenum) { Insert(e, 0, isenum); Delete(isenum); } } else { /* Template. We need to qualify template parameters as well as the template itself */ String *tprefix, *qprefix; String *tsuffix; Iterator pi; Parm *p; List *parms; ty = Swig_symbol_template_deftype(e, current_symtab); e = ty; parms = SwigType_parmlist(e); tprefix = SwigType_templateprefix(e); tsuffix = SwigType_templatesuffix(e); qprefix = SwigType_typedef_qualified(tprefix); Append(qprefix, "<("); pi = First(parms); while ((p = pi.item)) { String *qt = SwigType_typedef_qualified(p); if (Equal(qt, p)) { /* && (!Swig_scopename_check(qt))) */ /* No change in value. It is entirely possible that the parameter is an integer value. If there is a symbol table associated with this scope, we're going to check for this */ if (current_symtab) { Node *lastnode = 0; String *value = Copy(p); while (1) { Node *n = Swig_symbol_clookup(value, current_symtab); if (n == lastnode) break; lastnode = n; if (n) { char *ntype = Char(nodeType(n)); if (strcmp(ntype, "enumitem") == 0) { /* An enum item. Generate a fully qualified name */ String *qn = Swig_symbol_qualified(n); if (Len(qn)) { Append(qn, "::"); Append(qn, Getattr(n, "name")); Delete(value); value = qn; continue; } else { Delete(qn); break; } } else if ((strcmp(ntype, "cdecl") == 0) && (Getattr(n, "value"))) { Delete(value); value = Copy(Getattr(n, "value")); continue; } } break; } Append(qprefix, value); Delete(value); } else { Append(qprefix, p); } } else { Append(qprefix, qt); } Delete(qt); pi = Next(pi); if (pi.item) { Append(qprefix, ","); } } Append(qprefix, ")>"); Append(qprefix, tsuffix); Delete(tsuffix); Clear(e); Append(e, qprefix); Delete(tprefix); Delete(qprefix); Delete(parms); } Append(result, e); Delete(ty); } else if (SwigType_isfunction(e)) { List *parms = SwigType_parmlist(e); String *s = NewString("f("); Iterator pi; pi = First(parms); while (pi.item) { String *pq = SwigType_typedef_qualified(pi.item); Append(s, pq); Delete(pq); pi = Next(pi); if (pi.item) { Append(s, ","); } } Append(s, ")."); Append(result, s); Delete(s); Delete(parms); } else if (SwigType_isarray(e)) { String *ndim; String *dim = SwigType_parm(e); ndim = Swig_symbol_string_qualify(dim, 0); Printf(result, "a(%s).", ndim); Delete(dim); Delete(ndim); } else { Append(result, e); } } Delete(elements); { String *key, *cresult; key = NewString(t); cresult = NewString(result); Setattr(typedef_qualified_cache, key, cresult); Delete(key); Delete(cresult); } return result; } /* ----------------------------------------------------------------------------- * SwigType_istypedef() * * Checks a typename to see if it is a typedef. * ----------------------------------------------------------------------------- */ int SwigType_istypedef(const SwigType *t) { String *type; type = SwigType_typedef_resolve(t); if (type) { Delete(type); return 1; } else { return 0; } } /* ----------------------------------------------------------------------------- * SwigType_typedef_using() * * Processes a 'using' declaration to import types from one scope into another. * Name is a qualified name like A::B. * ----------------------------------------------------------------------------- */ int SwigType_typedef_using(const_String_or_char_ptr name) { String *base; String *td; String *prefix; Typetab *s; Typetab *tt = 0; String *defined_name = 0; /* Printf(stdout, "using %s\n", name); */ if (!Swig_scopename_check(name)) return -1; /* Not properly qualified */ base = Swig_scopename_last(name); /* See if the base is already defined in this scope */ if (Getattr(current_typetab, base)) { Delete(base); return -1; } /* See if the using name is a scope */ /* tt = SwigType_find_scope(current_scope,name); Printf(stdout,"tt = %p, name = '%s'\n", tt, name); */ /* We set up a typedef B --> A::B */ Setattr(current_typetab, base, name); /* Find the scope name where the symbol is defined */ td = SwigType_typedef_resolve(name); /* Printf(stdout,"td = '%s' %p\n", td, resolved_scope); */ if (resolved_scope) { defined_name = Getattr(resolved_scope, "qname"); if (defined_name) { defined_name = Copy(defined_name); Append(defined_name, "::"); Append(defined_name, base); /* Printf(stdout,"defined_name = '%s'\n", defined_name); */ tt = SwigType_find_scope(current_scope, defined_name); } } if (td) Delete(td); /* Figure out the scope the using directive refers to */ { prefix = Swig_scopename_prefix(name); if (prefix) { s = SwigType_find_scope(current_scope, prefix); if (s) { Hash *ttab = Getattr(s, "typetab"); if (!Getattr(ttab, base) && defined_name) { Setattr(ttab, base, defined_name); } } } } if (tt) { /* Using directive had its own scope. We need to create a new scope for it */ SwigType_new_scope(base); SwigType_inherit_scope(tt); SwigType_pop_scope(); } if (defined_name) Delete(defined_name); Delete(prefix); Delete(base); return 0; } /* ----------------------------------------------------------------------------- * SwigType_isclass() * * Determines if a type defines a class or not. A class is defined by * its type-table entry maps to itself. Note: a pointer to a class is not * a class. * ----------------------------------------------------------------------------- */ int SwigType_isclass(const SwigType *t) { SwigType *qty, *qtys; int isclass = 0; qty = SwigType_typedef_resolve_all(t); qtys = SwigType_strip_qualifiers(qty); if (SwigType_issimple(qtys)) { String *td = SwigType_typedef_resolve(qtys); if (td) { Delete(td); } if (resolved_scope) { isclass = 1; } /* Hmmm. Not a class. If a template, it might be uninstantiated */ if (!isclass) { String *tp = SwigType_istemplate_templateprefix(qtys); if (tp && Strcmp(tp, t) != 0) { isclass = SwigType_isclass(tp); } Delete(tp); } } Delete(qty); Delete(qtys); return isclass; } /* ----------------------------------------------------------------------------- * SwigType_type() * * Returns an integer code describing the datatype. This is only used for * compatibility with SWIG1.1 language modules and is likely to go away once * everything is based on typemaps. * ----------------------------------------------------------------------------- */ int SwigType_type(const SwigType *t) { char *c; /* Check for the obvious stuff */ c = Char(t); if (strncmp(c, "p.", 2) == 0) { if (SwigType_type(c + 2) == T_CHAR) return T_STRING; else if (SwigType_type(c + 2) == T_WCHAR) return T_WSTRING; else return T_POINTER; } if (strncmp(c, "a(", 2) == 0) return T_ARRAY; if (strncmp(c, "r.", 2) == 0) return T_REFERENCE; if (strncmp(c, "z.", 2) == 0) return T_RVALUE_REFERENCE; if (strncmp(c, "m(", 2) == 0) return T_MPOINTER; if (strncmp(c, "q(", 2) == 0) { while (*c && (*c != '.')) c++; if (*c) return SwigType_type(c + 1); return T_ERROR; } if (strncmp(c, "f(", 2) == 0) return T_FUNCTION; /* Look for basic types */ if (strcmp(c, "int") == 0) return T_INT; if (strcmp(c, "long") == 0) return T_LONG; if (strcmp(c, "short") == 0) return T_SHORT; if (strcmp(c, "unsigned") == 0) return T_UINT; if (strcmp(c, "unsigned short") == 0) return T_USHORT; if (strcmp(c, "unsigned long") == 0) return T_ULONG; if (strcmp(c, "unsigned int") == 0) return T_UINT; if (strcmp(c, "char") == 0) return T_CHAR; if (strcmp(c, "signed char") == 0) return T_SCHAR; if (strcmp(c, "unsigned char") == 0) return T_UCHAR; if (strcmp(c, "wchar_t") == 0) return T_WCHAR; if (strcmp(c, "float") == 0) return T_FLOAT; if (strcmp(c, "double") == 0) return T_DOUBLE; if (strcmp(c, "long double") == 0) return T_LONGDOUBLE; if (!cparse_cplusplus && (strcmp(c, "float complex") == 0)) return T_FLTCPLX; if (!cparse_cplusplus && (strcmp(c, "double complex") == 0)) return T_DBLCPLX; if (!cparse_cplusplus && (strcmp(c, "complex") == 0)) return T_COMPLEX; if (strcmp(c, "void") == 0) return T_VOID; if (strcmp(c, "bool") == 0) return T_BOOL; if (strcmp(c, "long long") == 0) return T_LONGLONG; if (strcmp(c, "unsigned long long") == 0) return T_ULONGLONG; if (strncmp(c, "enum ", 5) == 0) return T_INT; if (strcmp(c, "auto") == 0) return T_AUTO; if (strcmp(c, "v(...)") == 0) return T_VARARGS; /* Hmmm. Unknown type */ if (SwigType_istypedef(t)) { int r; SwigType *nt = SwigType_typedef_resolve(t); r = SwigType_type(nt); Delete(nt); return r; } return T_USER; } /* ----------------------------------------------------------------------------- * SwigType_alttype() * * Returns the alternative value type needed in C++ for class value * types. When swig is not sure about using a plain $ltype value, * since the class doesn't have a default constructor, or it can't be * assigned, you will get back 'SwigValueWrapper'. * * This is the default behavior unless: * * 1.- swig detects a default_constructor and 'setallocate:default_constructor' * attribute. * * 2.- swig doesn't mark 'type' as non-assignable. * * 3.- the user specifies that the value wrapper is not needed by using * %feature("novaluewrapper") like so: * * %feature("novaluewrapper") MyOpaqueClass; * class MyOpaqueClass; * * The user can also force the use of the value wrapper with * %feature("valuewrapper"). * ----------------------------------------------------------------------------- */ SwigType *SwigType_alttype(const SwigType *t, int local_tmap) { Node *n; SwigType *w = 0; int use_wrapper = 0; SwigType *td = 0; if (!cparse_cplusplus) return 0; if (value_wrapper_mode == 0) { /* old partial use of SwigValueTypes, it can fail for opaque types */ if (local_tmap) return 0; if (SwigType_isclass(t)) { SwigType *ftd = SwigType_typedef_resolve_all(t); td = SwigType_strip_qualifiers(ftd); Delete(ftd); n = Swig_symbol_clookup(td, 0); if (n) { if (GetFlag(n, "feature:valuewrapper")) { use_wrapper = 1; } else { if (Checkattr(n, "nodeType", "class") && (!Getattr(n, "allocate:default_constructor") || (Getattr(n, "allocate:noassign")))) { use_wrapper = !GetFlag(n, "feature:novaluewrapper") || GetFlag(n, "feature:nodefault"); } } } else { if (SwigType_issimple(td) && SwigType_istemplate(td)) { use_wrapper = 1; } } } } else { /* safe use of SwigValueTypes, it can fail with some typemaps */ SwigType *ftd = SwigType_typedef_resolve_all(t); td = SwigType_strip_qualifiers(ftd); Delete(ftd); if (SwigType_type(td) == T_USER) { use_wrapper = 1; n = Swig_symbol_clookup(td, 0); if (n) { if ((Checkattr(n, "nodeType", "class") && !Getattr(n, "allocate:noassign") && (Getattr(n, "allocate:default_constructor"))) || (GetFlag(n, "feature:novaluewrapper"))) { use_wrapper = GetFlag(n, "feature:valuewrapper"); } } } } if (use_wrapper) { /* Need a space before the type in case it starts "::" (since the <: * token is a digraph for [ in C++. Also need a space after the * type in case it ends with ">" since then we form the token ">>". */ w = NewStringf("SwigValueWrapper< %s >", td); } Delete(td); return w; } /* ---------------------------------------------------------------------------- * * * * WARNING * * * *** * *** * Don't even think about modifying anything below this line unless you *** * are completely on top of *EVERY* subtle aspect of the C++ type system *** * and you are prepared to suffer endless hours of agony trying to *** * debug the SWIG run-time type checker after you break it. *** * ------------------------------------------------------------------------- */ /* ----------------------------------------------------------------------------- * SwigType_remember() * * This function "remembers" a datatype that was used during wrapper code generation * so that a type-checking table can be generated later on. It is up to the language * modules to actually call this function--it is not done automatically. * * Type tracking is managed through two separate hash tables. The hash 'r_mangled' * is mapping between mangled type names (used in the target language) and * fully-resolved C datatypes used in the source input. The second hash 'r_resolved' * is the inverse mapping that maps fully-resolved C datatypes to all of the mangled * names in the scripting languages. For example, consider the following set of * typedef declarations: * * typedef double Real; * typedef double Float; * typedef double Point[3]; * * Now, suppose that the types 'double *', 'Real *', 'Float *', 'double[3]', and * 'Point' were used in an interface file and "remembered" using this function. * The hash tables would look like this: * * r_mangled { * _p_double : [ p.double, a(3).double ] * _p_Real : [ p.double ] * _p_Float : [ p.double ] * _Point : [ a(3).double ] * * r_resolved { * p.double : [ _p_double, _p_Real, _p_Float ] * a(3).double : [ _p_double, _Point ] * } * * Together these two hash tables can be used to determine type-equivalency between * mangled typenames. To do this, we view the two hash tables as a large graph and * compute the transitive closure. * ----------------------------------------------------------------------------- */ static Hash *r_mangled = 0; /* Hash mapping mangled types to fully resolved types */ static Hash *r_resolved = 0; /* Hash mapping resolved types to mangled types */ static Hash *r_ltype = 0; /* Hash mapping mangled names to their local c type */ static Hash *r_clientdata = 0; /* Hash mapping resolved types to client data */ static Hash *r_mangleddata = 0; /* Hash mapping mangled types to client data */ static Hash *r_remembered = 0; /* Hash of types we remembered already */ static void (*r_tracefunc) (const SwigType *t, String *mangled, String *clientdata) = 0; void SwigType_remember_mangleddata(String *mangled, const_String_or_char_ptr clientdata) { if (!r_mangleddata) { r_mangleddata = NewHash(); } Setattr(r_mangleddata, mangled, clientdata); } void SwigType_remember_clientdata(const SwigType *t, const_String_or_char_ptr clientdata) { String *mt; SwigType *lt; Hash *h; SwigType *fr; SwigType *qr; String *tkey; String *cd; Hash *lthash; if (!r_mangled) { r_mangled = NewHash(); r_resolved = NewHash(); r_ltype = NewHash(); r_clientdata = NewHash(); r_remembered = NewHash(); } { String *last; last = Getattr(r_remembered, t); if (last && (Cmp(last, clientdata) == 0)) return; } tkey = Copy(t); cd = clientdata ? NewString(clientdata) : NewStringEmpty(); Setattr(r_remembered, tkey, cd); Delete(tkey); Delete(cd); mt = SwigType_manglestr(t); /* Create mangled string */ if (r_tracefunc) { (*r_tracefunc) (t, mt, (String *) clientdata); } if (SwigType_istypedef(t)) { lt = Copy(t); } else { lt = SwigType_ltype(t); } lthash = Getattr(r_ltype, mt); if (!lthash) { lthash = NewHash(); Setattr(r_ltype, mt, lthash); } Setattr(lthash, lt, "1"); Delete(lt); fr = SwigType_typedef_resolve_all(t); /* Create fully resolved type */ qr = SwigType_typedef_qualified(fr); Delete(fr); /* Added to deal with possible table bug */ fr = SwigType_strip_qualifiers(qr); Delete(qr); /*Printf(stdout,"t = '%s'\n", t); Printf(stdout,"fr= '%s'\n\n", fr); */ if (t) { char *ct = Char(t); if (strchr(ct, '<') && !(strstr(ct, "<("))) { Printf(stdout, "Bad template type passed to SwigType_remember: %s\n", t); assert(0); } } h = Getattr(r_mangled, mt); if (!h) { h = NewHash(); Setattr(r_mangled, mt, h); Delete(h); } Setattr(h, fr, mt); h = Getattr(r_resolved, fr); if (!h) { h = NewHash(); Setattr(r_resolved, fr, h); Delete(h); } Setattr(h, mt, fr); if (clientdata) { String *cd = Getattr(r_clientdata, fr); if (cd) { if (Strcmp(clientdata, cd) != 0) { Printf(stderr, "*** Internal error. Inconsistent clientdata for type '%s'\n", SwigType_str(fr, 0)); Printf(stderr, "*** '%s' != '%s'\n", clientdata, cd); assert(0); } } else { String *cstr = NewString(clientdata); Setattr(r_clientdata, fr, cstr); Delete(cstr); } } /* If the remembered type is a reference, we also remember the pointer version. This is to prevent odd problems with mixing pointers and references--especially when different functions are using different typenames (via typedef). */ if (SwigType_isreference(t)) { SwigType *tt = Copy(t); SwigType_del_reference(tt); SwigType_add_pointer(tt); SwigType_remember_clientdata(tt, clientdata); } else if (SwigType_isrvalue_reference(t)) { SwigType *tt = Copy(t); SwigType_del_rvalue_reference(tt); SwigType_add_pointer(tt); SwigType_remember_clientdata(tt, clientdata); } } void SwigType_remember(const SwigType *ty) { SwigType_remember_clientdata(ty, 0); } void (*SwigType_remember_trace(void (*tf) (const SwigType *, String *, String *))) (const SwigType *, String *, String *) { void (*o) (const SwigType *, String *, String *) = r_tracefunc; r_tracefunc = tf; return o; } /* ----------------------------------------------------------------------------- * SwigType_equivalent_mangle() * * Return a list of all of the mangled typenames that are equivalent to another * mangled name. This works as follows: For each fully qualified C datatype * in the r_mangled hash entry, we collect all of the mangled names from the * r_resolved hash and combine them together in a list (removing duplicate entries). * ----------------------------------------------------------------------------- */ List *SwigType_equivalent_mangle(String *ms, Hash *checked, Hash *found) { List *l; Hash *h; Hash *ch; Hash *mh; if (found) { h = found; } else { h = NewHash(); } if (checked) { ch = checked; } else { ch = NewHash(); } if (Getattr(ch, ms)) goto check_exit; /* Already checked this type */ Setattr(h, ms, "1"); Setattr(ch, ms, "1"); mh = Getattr(r_mangled, ms); if (mh) { Iterator ki; ki = First(mh); while (ki.key) { Hash *rh; if (Getattr(ch, ki.key)) { ki = Next(ki); continue; } Setattr(ch, ki.key, "1"); rh = Getattr(r_resolved, ki.key); if (rh) { Iterator rk; rk = First(rh); while (rk.key) { Setattr(h, rk.key, "1"); SwigType_equivalent_mangle(rk.key, ch, h); rk = Next(rk); } } ki = Next(ki); } } check_exit: if (!found) { l = Keys(h); Delete(h); Delete(ch); return l; } else { return 0; } } /* ----------------------------------------------------------------------------- * SwigType_clientdata_collect() * * Returns the clientdata field for a mangled type-string. * ----------------------------------------------------------------------------- */ static String *SwigType_clientdata_collect(String *ms) { Hash *mh; String *clientdata = 0; if (r_mangleddata) { clientdata = Getattr(r_mangleddata, ms); if (clientdata) return clientdata; } mh = Getattr(r_mangled, ms); if (mh) { Iterator ki; ki = First(mh); while (ki.key) { clientdata = Getattr(r_clientdata, ki.key); if (clientdata) break; ki = Next(ki); } } return clientdata; } /* ----------------------------------------------------------------------------- * SwigType_inherit() * * Record information about inheritance. We keep a hash table that keeps * a mapping between base classes and all of the classes that are derived * from them. * * subclass is a hash that maps base-classes to all of the classes derived from them. * * derived - name of derived class * base - name of base class * cast - additional casting code when casting from derived to base * conversioncode - if set, overrides the default code in the function when casting * from derived to base * ----------------------------------------------------------------------------- */ static Hash *subclass = 0; static Hash *conversions = 0; void SwigType_inherit(String *derived, String *base, String *cast, String *conversioncode) { Hash *h; String *dd = 0; String *bb = 0; if (!subclass) subclass = NewHash(); /* Printf(stdout,"'%s' --> '%s' '%s'\n", derived, base, cast); */ if (SwigType_istemplate(derived)) { String *ty = SwigType_typedef_resolve_all(derived); dd = SwigType_typedef_qualified(ty); derived = dd; Delete(ty); } if (SwigType_istemplate(base)) { String *ty = SwigType_typedef_resolve_all(base); bb = SwigType_typedef_qualified(ty); base = bb; Delete(ty); } /* Printf(stdout,"'%s' --> '%s' '%s'\n", derived, base, cast); */ h = Getattr(subclass, base); if (!h) { h = NewHash(); Setattr(subclass, base, h); Delete(h); } if (!Getattr(h, derived)) { Hash *c = NewHash(); if (cast) Setattr(c, "cast", cast); if (conversioncode) Setattr(c, "convcode", conversioncode); Setattr(h, derived, c); Delete(c); } Delete(dd); Delete(bb); } /* ----------------------------------------------------------------------------- * SwigType_issubtype() * * Determines if a t1 is a subtype of t2, ie, is t1 derived from t2 * ----------------------------------------------------------------------------- */ int SwigType_issubtype(const SwigType *t1, const SwigType *t2) { SwigType *ft1, *ft2; String *b1, *b2; Hash *h; int r = 0; if (!subclass) return 0; ft1 = SwigType_typedef_resolve_all(t1); ft2 = SwigType_typedef_resolve_all(t2); b1 = SwigType_base(ft1); b2 = SwigType_base(ft2); h = Getattr(subclass, b2); if (h) { if (Getattr(h, b1)) { r = 1; } } Delete(ft1); Delete(ft2); Delete(b1); Delete(b2); /* Printf(stdout, "issubtype(%s,%s) --> %d\n", t1, t2, r); */ return r; } /* ----------------------------------------------------------------------------- * SwigType_inherit_equiv() * * Modify the type table to handle C++ inheritance * ----------------------------------------------------------------------------- */ void SwigType_inherit_equiv(File *out) { String *ckey; String *prefix, *base; String *mprefix, *mkey; Hash *sub; Hash *rh; List *rlist; Iterator rk, bk, ck; if (!conversions) conversions = NewHash(); if (!subclass) subclass = NewHash(); rk = First(r_resolved); while (rk.key) { /* rkey is a fully qualified type. We strip all of the type constructors off of it just to get the base */ base = SwigType_base(rk.key); /* Check to see whether the base is recorded in the subclass table */ sub = Getattr(subclass, base); Delete(base); if (!sub) { rk = Next(rk); continue; } /* This type has subclasses. We now need to walk through these subtypes and generate pointer conversion functions */ rh = Getattr(r_resolved, rk.key); rlist = NewList(); for (ck = First(rh); ck.key; ck = Next(ck)) { Append(rlist, ck.key); } /* Printf(stdout,"rk.key = '%s'\n", rk.key); Printf(stdout,"rh = %p '%s'\n", rh,rh); */ bk = First(sub); while (bk.key) { prefix = SwigType_prefix(rk.key); Append(prefix, bk.key); /* Printf(stdout,"set %p = '%s' : '%s'\n", rh, SwigType_manglestr(prefix),prefix); */ mprefix = SwigType_manglestr(prefix); Setattr(rh, mprefix, prefix); mkey = SwigType_manglestr(rk.key); ckey = NewStringf("%s+%s", mprefix, mkey); if (!Getattr(conversions, ckey)) { String *convname = NewStringf("%sTo%s", mprefix, mkey); String *lkey = SwigType_lstr(rk.key, 0); String *lprefix = SwigType_lstr(prefix, 0); Hash *subhash = Getattr(sub, bk.key); String *convcode = Getattr(subhash, "convcode"); if (convcode) { char *newmemoryused = Strstr(convcode, "newmemory"); /* see if newmemory parameter is used in order to avoid unused parameter warnings */ String *fn = Copy(convcode); Replaceall(fn, "$from", "x"); Printf(out, "static void *%s(void *x, int *%s) {", convname, newmemoryused ? "newmemory" : "SWIGUNUSEDPARM(newmemory)"); Printf(out, "%s", fn); } else { String *cast = Getattr(subhash, "cast"); Printf(out, "static void *%s(void *x, int *SWIGUNUSEDPARM(newmemory)) {", convname); Printf(out, "\n return (void *)((%s) ", lkey); if (cast) Printf(out, "%s", cast); Printf(out, " ((%s) x));\n", lprefix); } Printf(out, "}\n"); Setattr(conversions, ckey, convname); Delete(ckey); Delete(lkey); Delete(lprefix); /* This inserts conversions for typedefs */ { Hash *r = Getattr(r_resolved, prefix); if (r) { Iterator rrk; rrk = First(r); while (rrk.key) { Iterator rlk; String *rkeymangle; /* Make sure this name equivalence is not due to inheritance */ if (Cmp(prefix, Getattr(r, rrk.key)) == 0) { rkeymangle = Copy(mkey); ckey = NewStringf("%s+%s", rrk.key, rkeymangle); if (!Getattr(conversions, ckey)) { Setattr(conversions, ckey, convname); } Delete(ckey); for (rlk = First(rlist); rlk.item; rlk = Next(rlk)) { ckey = NewStringf("%s+%s", rrk.key, rlk.item); Setattr(conversions, ckey, convname); Delete(ckey); } Delete(rkeymangle); /* This is needed to pick up other alternative names for the same type. Needed to make templates work */ Setattr(rh, rrk.key, rrk.item); } rrk = Next(rrk); } } } Delete(convname); } Delete(prefix); Delete(mprefix); Delete(mkey); bk = Next(bk); } rk = Next(rk); Delete(rlist); } } /* Helper function to sort the mangled list */ static int SwigType_compare_mangled(const DOH *a, const DOH *b) { return strcmp((char *) Data(a), (char *) Data(b)); } /* ----------------------------------------------------------------------------- * SwigType_get_sorted_mangled_list() * * Returns the sorted list of mangled type names that should be exported into the * wrapper file. * ----------------------------------------------------------------------------- */ List *SwigType_get_sorted_mangled_list() { List *l = Keys(r_mangled); SortList(l, SwigType_compare_mangled); return l; } /* ----------------------------------------------------------------------------- * SwigType_type_table() * * Generate the type-table for the type-checker. * ----------------------------------------------------------------------------- */ void SwigType_emit_type_table(File *f_forward, File *f_table) { Iterator ki; String *types, *table, *cast, *cast_init, *cast_temp; Hash *imported_types; List *mangled_list; List *table_list = NewList(); int i = 0; if (!r_mangled) { r_mangled = NewHash(); r_resolved = NewHash(); } Printf(f_table, "\n/* -------- TYPE CONVERSION AND EQUIVALENCE RULES (BEGIN) -------- */\n\n"); SwigType_inherit_equiv(f_table); /*#define DEBUG 1*/ #ifdef DEBUG Printf(stdout, "---r_mangled---\n"); Printf(stdout, "%s\n", r_mangled); Printf(stdout, "---r_resolved---\n"); Printf(stdout, "%s\n", r_resolved); Printf(stdout, "---r_ltype---\n"); Printf(stdout, "%s\n", r_ltype); Printf(stdout, "---subclass---\n"); Printf(stdout, "%s\n", subclass); Printf(stdout, "---conversions---\n"); Printf(stdout, "%s\n", conversions); Printf(stdout, "---r_clientdata---\n"); Printf(stdout, "%s\n", r_clientdata); #endif table = NewStringEmpty(); types = NewStringEmpty(); cast = NewStringEmpty(); cast_init = NewStringEmpty(); imported_types = NewHash(); Printf(table, "static swig_type_info *swig_type_initial[] = {\n"); Printf(cast_init, "static swig_cast_info *swig_cast_initial[] = {\n"); Printf(f_forward, "\n/* -------- TYPES TABLE (BEGIN) -------- */\n\n"); mangled_list = SwigType_get_sorted_mangled_list(); for (ki = First(mangled_list); ki.item; ki = Next(ki)) { List *el; Iterator ei; SwigType *lt; SwigType *rt = 0; String *nt; String *ln; String *rn; const String *cd; Hash *lthash; Iterator ltiter; Hash *nthash; cast_temp = NewStringEmpty(); Printv(types, "static swig_type_info _swigt_", ki.item, " = {", NIL); Append(table_list, ki.item); Printf(cast_temp, "static swig_cast_info _swigc_%s[] = {", ki.item); i++; cd = SwigType_clientdata_collect(ki.item); if (!cd) cd = "0"; lthash = Getattr(r_ltype, ki.item); nt = 0; nthash = NewHash(); ltiter = First(lthash); while (ltiter.key) { lt = ltiter.key; rt = SwigType_typedef_resolve_all(lt); /* we save the original type and the fully resolved version */ ln = SwigType_lstr(lt, 0); rn = SwigType_lstr(rt, 0); if (Equal(ln, rn)) { Setattr(nthash, ln, "1"); } else { Setattr(nthash, rn, "1"); Setattr(nthash, ln, "1"); } if (SwigType_istemplate(rt)) { String *dt = Swig_symbol_template_deftype(rt, 0); String *dn = SwigType_lstr(dt, 0); if (!Equal(dn, rn) && !Equal(dn, ln)) { Setattr(nthash, dn, "1"); } Delete(dt); Delete(dn); } ltiter = Next(ltiter); } /* now build nt */ ltiter = First(nthash); nt = 0; while (ltiter.key) { if (nt) { Printf(nt, "|%s", ltiter.key); } else { nt = NewString(ltiter.key); } ltiter = Next(ltiter); } Delete(nthash); Printf(types, "\"%s\", \"%s\", 0, 0, (void*)%s, 0};\n", ki.item, nt, cd); el = SwigType_equivalent_mangle(ki.item, 0, 0); for (ei = First(el); ei.item; ei = Next(ei)) { String *ckey; String *conv; ckey = NewStringf("%s+%s", ei.item, ki.item); conv = Getattr(conversions, ckey); if (conv) { Printf(cast_temp, " {&_swigt_%s, %s, 0, 0},", ei.item, conv); } else { Printf(cast_temp, " {&_swigt_%s, 0, 0, 0},", ei.item); } Delete(ckey); if (!Getattr(r_mangled, ei.item) && !Getattr(imported_types, ei.item)) { Printf(types, "static swig_type_info _swigt_%s = {\"%s\", 0, 0, 0, 0, 0};\n", ei.item, ei.item); Append(table_list, ei.item); Printf(cast, "static swig_cast_info _swigc_%s[] = {{&_swigt_%s, 0, 0, 0},{0, 0, 0, 0}};\n", ei.item, ei.item); i++; Setattr(imported_types, ei.item, "1"); } } Delete(el); Printf(cast, "%s{0, 0, 0, 0}};\n", cast_temp); Delete(cast_temp); Delete(nt); Delete(rt); } /* print the tables in the proper order */ SortList(table_list, SwigType_compare_mangled); i = 0; for (ki = First(table_list); ki.item; ki = Next(ki)) { Printf(f_forward, "#define SWIGTYPE%s swig_types[%d]\n", ki.item, i++); Printf(table, " &_swigt_%s,\n", ki.item); Printf(cast_init, " _swigc_%s,\n", ki.item); } if (i == 0) { /* empty arrays are not allowed by ISO C */ Printf(table, " NULL\n"); Printf(cast_init, " NULL\n"); } Delete(table_list); Delete(mangled_list); Printf(table, "};\n"); Printf(cast_init, "};\n"); Printf(f_table, "%s\n", types); Printf(f_table, "%s\n", table); Printf(f_table, "%s\n", cast); Printf(f_table, "%s\n", cast_init); Printf(f_table, "\n/* -------- TYPE CONVERSION AND EQUIVALENCE RULES (END) -------- */\n\n"); Printf(f_forward, "static swig_type_info *swig_types[%d];\n", i + 1); Printf(f_forward, "static swig_module_info swig_module = {swig_types, %d, 0, 0, 0, 0};\n", i); Printf(f_forward, "#define SWIG_TypeQuery(name) SWIG_TypeQueryModule(&swig_module, &swig_module, name)\n"); Printf(f_forward, "#define SWIG_MangledTypeQuery(name) SWIG_MangledTypeQueryModule(&swig_module, &swig_module, name)\n"); Printf(f_forward, "\n/* -------- TYPES TABLE (END) -------- */\n\n"); Delete(types); Delete(table); Delete(cast); Delete(cast_init); Delete(imported_types); } swig-4.0.1/Source/Swig/symbol.c0000644000175000017500000017565413527063513016214 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * symbol.c * * This file implements the SWIG symbol table. See details below. * ----------------------------------------------------------------------------- */ #include "swig.h" #include "swigwarn.h" #include /* #define SWIG_DEBUG*/ /* ----------------------------------------------------------------------------- * Synopsis * * This module provides symbol table management for all of SWIG. In previous * releases, the management of symbols was rather haphazard. This module tries * to correct that. * * All symbols are associated with simple identifiers. For example, here are some * declarations that generate symbol table entries: * * decl symbol * -------------- ------------ * void foo(int); foo * int x; x * typedef int *blah; blah * * Associated with each symbol is a Hash table that can contain any set of * attributes that make sense for that object. For example: * * typedef int *blah; ----> "name" : 'blah' * "type" : 'int' * "decl" : 'p.' * "storage" : 'typedef' * * In some cases, the symbol table needs to manage overloaded entries. For instance, * overloaded functions. In this case, a linked list is built. The "sym:nextSibling" * attribute is reserved to hold a link to the next entry. For example: * * int foo(int); --> "name" : "foo" "name" : "foo" * int foo(int,double); "type" : "int" "type" : "int" * "decl" : "f(int)." "decl" : "f(int,double)." * ... ... * "sym:nextSibling" : --------> "sym:nextSibling": --------> ... * * When more than one symbol has the same name, the symbol declarator is * used to detect duplicates. For example, in the above case, foo(int) and * foo(int,double) are different because their "decl" attribute is different. * However, if a third declaration "foo(int)" was made, it would generate a * conflict (due to having a declarator that matches a previous entry). * * Structures and classes: * * C/C++ symbol tables are normally managed in a few different spaces. The * most visible namespace is reserved for functions, variables, typedef, enum values * and such. In C, a separate tag-space is reserved for 'struct name', 'class name', * and 'union name' declarations. In SWIG, a single namespace is used for everything * this means that certain incompatibilities will arise with some C programs. For instance: * * struct Foo { * ... * } * * int Foo(); // Error. Name clash. Works in C though * * Due to the unified namespace for structures, special handling is performed for * the following: * * typedef struct Foo { * * } Foo; * * In this case, the symbol table contains an entry for the structure itself. The * typedef is left out of the symbol table. * * Target language vs C: * * The symbol tables are normally managed *in the namespace of the target language*. * This means that name-collisions can be resolved using %rename and related * directives. A quirk of this is that sometimes the symbol tables need to * be used for C type resolution as well. To handle this, each symbol table * also has a C-symbol table lurking behind the scenes. This is used to locate * symbols in the C namespace. However, this symbol table is not used for error * reporting nor is it used for anything else during code generation. * * Symbol table structure: * * Symbol tables themselves are a special kind of node that is organized just like * a normal parse tree node. Symbol tables are organized in a tree that can be * traversed using the SWIG-DOM API. The following attributes names are reserved. * * name -- Name of the scope defined by the symbol table (if any) * This name is the C-scope name and is not affected by * %renaming operations * symtab -- Hash table mapping identifiers to nodes. * csymtab -- Hash table mapping C identifiers to nodes. * * Reserved attributes on symbol objects: * * When a symbol is placed in the symbol table, the following attributes * are set: * * sym:name -- Symbol name * sym:nextSibling -- Next symbol (if overloaded) * sym:previousSibling -- Previous symbol (if overloaded) * sym:symtab -- Symbol table object holding the symbol * sym:overloaded -- Set to the first symbol if overloaded * * These names are modeled after XML namespaces. In particular, every attribute * pertaining to symbol table management is prefaced by the "sym:" prefix. * * An example dump of the parse tree showing symbol table entries for the * following code should clarify this: * * namespace OuterNamespace { * namespace InnerNamespace { * class Class { * }; * struct Struct { * int Var; * }; * } * } * * +++ namespace ---------------------------------------- * | sym:name - "OuterNamespace" * | symtab - 0xa064bf0 * | sym:symtab - 0xa041690 * | sym:overname - "__SWIG_0" * * +++ namespace ---------------------------------------- * | sym:name - "InnerNamespace" * | symtab - 0xa064cc0 * | sym:symtab - 0xa064bf0 * | sym:overname - "__SWIG_0" * * +++ class ---------------------------------------- * | sym:name - "Class" * | symtab - 0xa064d80 * | sym:symtab - 0xa064cc0 * | sym:overname - "__SWIG_0" * | * +++ class ---------------------------------------- * | sym:name - "Struct" * | symtab - 0xa064f00 * | sym:symtab - 0xa064cc0 * | sym:overname - "__SWIG_0" * * +++ cdecl ---------------------------------------- * | sym:name - "Var" * | sym:symtab - 0xa064f00 * | sym:overname - "__SWIG_0" * | * * * Each class and namespace has its own scope and thus a new symbol table (sym) * is created. The sym attribute is only set for the first entry in the symbol * table. The sym:symtab entry points to the symbol table in which the symbol * exists, so for example, Struct is in the scope OuterNamespace::InnerNamespace * so sym:symtab points to this symbol table (0xa064cc0). * * ----------------------------------------------------------------------------- */ static Hash *current = 0; /* The current symbol table hash */ static Hash *ccurrent = 0; /* The current c symbol table hash */ static Hash *current_symtab = 0; /* Current symbol table node */ static Hash *symtabs = 0; /* Hash of all symbol tables by fully-qualified name */ static Hash *global_scope = 0; /* Global scope */ static int use_inherit = 1; /* common attribute keys, to avoid calling find_key all the times */ /* ----------------------------------------------------------------------------- * Swig_symbol_print_tables() * * Debug display of symbol tables * ----------------------------------------------------------------------------- */ void Swig_symbol_print_tables(Symtab *symtab) { if (!symtab) symtab = current_symtab; Printf(stdout, "SYMBOL TABLES start =======================================\n"); Swig_print_tree(symtab); Printf(stdout, "SYMBOL TABLES finish =======================================\n"); } /* ----------------------------------------------------------------------------- * Swig_symbol_print_tables_summary() * * Debug summary display of all symbol tables by fully-qualified name * ----------------------------------------------------------------------------- */ void Swig_symbol_print_tables_summary(void) { Printf(stdout, "SYMBOL TABLES SUMMARY start =======================================\n"); Swig_print_node(symtabs); Printf(stdout, "SYMBOL TABLES SUMMARY finish =======================================\n"); } /* ----------------------------------------------------------------------------- * symbol_print_symbols() * ----------------------------------------------------------------------------- */ static void symbol_print_symbols(const char *symboltabletype, const char *nextSibling) { Node *table = symtabs; Iterator ki = First(table); int show_pointers = 0; while (ki.key) { String *k = ki.key; Printf(stdout, "===================================================\n"); Printf(stdout, "%s -\n", k); { Symtab *symtab = Getattr(Getattr(table, k), symboltabletype); Iterator it = First(symtab); while (it.key) { String *symname = it.key; Printf(stdout, " %s (%s)", symname, nodeType(it.item)); if (show_pointers) Printf(stdout, " %p", it.item); Printf(stdout, "\n"); { Node *sibling = Getattr(it.item, nextSibling); while (sibling) { Printf(stdout, " %s (%s)", symname, nodeType(sibling)); if (show_pointers) Printf(stdout, " %p", sibling); Printf(stdout, "\n"); sibling = Getattr(sibling, nextSibling); } } it = Next(it); } } ki = Next(ki); } } /* ----------------------------------------------------------------------------- * Swig_symbol_print_symbols() * * Debug display of all the target language symbols * ----------------------------------------------------------------------------- */ void Swig_symbol_print_symbols(void) { Printf(stdout, "SYMBOLS start =======================================\n"); symbol_print_symbols("symtab", "sym:nextSibling"); Printf(stdout, "SYMBOLS finish =======================================\n"); } /* ----------------------------------------------------------------------------- * Swig_symbol_print_csymbols() * * Debug display of all the C symbols * ----------------------------------------------------------------------------- */ void Swig_symbol_print_csymbols(void) { Printf(stdout, "CSYMBOLS start =======================================\n"); symbol_print_symbols("csymtab", "csym:nextSibling"); Printf(stdout, "CSYMBOLS finish =======================================\n"); } /* ----------------------------------------------------------------------------- * Swig_symbol_init() * * Create a new symbol table object * ----------------------------------------------------------------------------- */ void Swig_symbol_init(void) { current = NewHash(); current_symtab = NewHash(); ccurrent = NewHash(); set_nodeType(current_symtab, "symboltable"); Setattr(current_symtab, "symtab", current); Delete(current); Setattr(current_symtab, "csymtab", ccurrent); Delete(ccurrent); /* Set the global scope */ symtabs = NewHash(); Setattr(symtabs, "", current_symtab); Delete(current_symtab); global_scope = current_symtab; } /* ----------------------------------------------------------------------------- * Swig_symbol_setscopename() * * Set the C scopename of the current symbol table. * ----------------------------------------------------------------------------- */ void Swig_symbol_setscopename(const_String_or_char_ptr name) { String *qname; /* assert(!Getattr(current_symtab,"name")); */ Setattr(current_symtab, "name", name); /* Set nested scope in parent */ qname = Swig_symbol_qualifiedscopename(current_symtab); /* Save a reference to this scope */ Setattr(symtabs, qname, current_symtab); Delete(qname); } /* ----------------------------------------------------------------------------- * Swig_symbol_getscopename() * * Get the C scopename of the current symbol table * ----------------------------------------------------------------------------- */ String *Swig_symbol_getscopename(void) { return Getattr(current_symtab, "name"); } /* ----------------------------------------------------------------------------- * Swig_symbol_getscope() * * Given a fully qualified C scopename, this function returns a symbol table * ----------------------------------------------------------------------------- */ Symtab *Swig_symbol_getscope(const_String_or_char_ptr name) { if (!symtabs) return 0; if (Equal("::", (const_String_or_char_ptr ) name)) name = ""; return Getattr(symtabs, name); } /* ----------------------------------------------------------------------------- * Swig_symbol_qualifiedscopename() * * Get the fully qualified C scopename of a symbol table. Note, this only pertains * to the C/C++ scope name. It is not affected by renaming. * ----------------------------------------------------------------------------- */ String *Swig_symbol_qualifiedscopename(Symtab *symtab) { String *result = 0; Hash *parent; String *name; if (!symtab) symtab = current_symtab; parent = Getattr(symtab, "parentNode"); if (parent) { result = Swig_symbol_qualifiedscopename(parent); } name = Getattr(symtab, "name"); if (name) { if (!result) { result = NewStringEmpty(); } if (Len(result)) { Printv(result, "::", name, NIL); } else { Append(result, name); } } return result; } /* ----------------------------------------------------------------------------- * Swig_symbol_qualified_language_scopename() * * Get the fully qualified C scopename of a symbol table but using a language * specific separator for the scopenames. Basically the same as * Swig_symbol_qualifiedscopename() but using the different separator. * ----------------------------------------------------------------------------- */ String *Swig_symbol_qualified_language_scopename(Symtab *n) { /* TODO: fix for %rename to work */ String *result = Swig_symbol_qualifiedscopename(n); Replaceall(result, "::", NSPACE_SEPARATOR); return result; } /* ----------------------------------------------------------------------------- * Swig_symbol_newscope() * * Create a new scope. Returns the newly created scope. * ----------------------------------------------------------------------------- */ Symtab *Swig_symbol_newscope(void) { Hash *n; Hash *hsyms, *h; hsyms = NewHash(); h = NewHash(); set_nodeType(h, "symboltable"); Setattr(h, "symtab", hsyms); Delete(hsyms); set_parentNode(h, current_symtab); n = lastChild(current_symtab); if (!n) { set_firstChild(current_symtab, h); } else { set_nextSibling(n, h); Delete(h); } set_lastChild(current_symtab, h); current = hsyms; ccurrent = NewHash(); Setattr(h, "csymtab", ccurrent); Delete(ccurrent); current_symtab = h; return h; } /* ----------------------------------------------------------------------------- * Swig_symbol_setscope() * * Set the current scope. Returns the previous current scope. * ----------------------------------------------------------------------------- */ Symtab *Swig_symbol_setscope(Symtab *sym) { Symtab *ret = current_symtab; current_symtab = sym; current = Getattr(sym, "symtab"); assert(current); ccurrent = Getattr(sym, "csymtab"); assert(ccurrent); return ret; } /* ----------------------------------------------------------------------------- * Swig_symbol_popscope() * * Pop out of the current scope. Returns the popped scope and sets the * scope to the parent scope. * ----------------------------------------------------------------------------- */ Symtab *Swig_symbol_popscope(void) { Hash *h = current_symtab; current_symtab = Getattr(current_symtab, "parentNode"); assert(current_symtab); current = Getattr(current_symtab, "symtab"); assert(current); ccurrent = Getattr(current_symtab, "csymtab"); assert(ccurrent); return h; } /* ----------------------------------------------------------------------------- * Swig_symbol_global_scope() * * Return the symbol table for the global scope. * ----------------------------------------------------------------------------- */ Symtab *Swig_symbol_global_scope(void) { return global_scope; } /* ----------------------------------------------------------------------------- * Swig_symbol_current() * * Return the current symbol table. * ----------------------------------------------------------------------------- */ Symtab *Swig_symbol_current(void) { return current_symtab; } /* ----------------------------------------------------------------------------- * Swig_symbol_alias() * * Makes an alias for a symbol in the global symbol table. * Primarily for namespace aliases such as 'namespace X = Y;'. * ----------------------------------------------------------------------------- */ void Swig_symbol_alias(const_String_or_char_ptr aliasname, Symtab *s) { String *qname = Swig_symbol_qualifiedscopename(current_symtab); if (qname) { Printf(qname, "::%s", aliasname); } else { qname = NewString(aliasname); } if (!Getattr(symtabs, qname)) { Setattr(symtabs, qname, s); } Delete(qname); } /* ----------------------------------------------------------------------------- * Swig_symbol_inherit() * * Inherit symbols from another scope. Primarily for C++ inheritance and * for using directives, such as 'using namespace X;' * but not for using declarations, such as 'using A;'. * ----------------------------------------------------------------------------- */ void Swig_symbol_inherit(Symtab *s) { int i, ilen; List *inherit = Getattr(current_symtab, "inherit"); if (!inherit) { inherit = NewList(); Setattr(current_symtab, "inherit", inherit); Delete(inherit); } if (s == current_symtab) { Swig_warning(WARN_PARSE_REC_INHERITANCE, Getfile(s), Getline(s), "Recursive scope inheritance of '%s'.\n", Getattr(s, "name")); return; } assert(s != current_symtab); ilen = Len(inherit); for (i = 0; i < ilen; i++) { Node *n = Getitem(inherit, i); if (n == s) return; /* Already inherited */ } Append(inherit, s); } /* ----------------------------------------------------------------------------- * Swig_symbol_cadd() * * Adds a node to the C symbol table only. * ----------------------------------------------------------------------------- */ void Swig_symbol_cadd(const_String_or_char_ptr name, Node *n) { Node *append = 0; Node *cn; /* There are a few options for weak symbols. A "weak" symbol is any symbol that can be replaced by another symbol in the C symbol table. An example would be a forward class declaration. A forward class sits in the symbol table until a real class declaration comes along. Certain symbols are marked as "sym:typename". These are important symbols related to the C++ type-system and take precedence in the C symbol table. An example might be code like this: template T foo(T x); int foo(int); In this case, the template is marked with "sym:typename" so that it stays in the C symbol table (so that it can be expanded using %template). */ if (!name) return; if (SwigType_istemplate(name)) { String *cname = NewString(name); String *dname = Swig_symbol_template_deftype(cname, 0); if (!Equal(dname, name)) { Swig_symbol_cadd(dname, n); } Delete(dname); Delete(cname); } #ifdef SWIG_DEBUG Printf(stderr, "symbol_cadd %s %p\n", name, n); #endif cn = Getattr(ccurrent, name); if (cn && (Getattr(cn, "sym:typename"))) { /* The node in the C symbol table is a typename. Do nothing */ /* We might append the symbol at the end */ append = n; } else if (cn && (Getattr(cn, "sym:weak"))) { /* The node in the symbol table is weak. Replace it */ if (checkAttribute(cn, "nodeType", "template") && checkAttribute(cn, "templatetype", "classforward")) { /* The node is a template classforward declaration, and the default template parameters here take precedence. */ ParmList *pc = Getattr(cn, "templateparms"); ParmList *pn = Getattr(n, "templateparms"); #ifdef SWIG_DEBUG Printf(stderr, "found template classforward %s\n", Getattr(cn, "name")); #endif while (pc && pn) { String *value = Getattr(pc, "value"); if (value) { #ifdef SWIG_DEBUG Printf(stderr, "add default template value %s %s\n", Getattr(pc, "name"), value); #endif Setattr(pn, "value", value); } pc = nextSibling(pc); pn = nextSibling(pn); } Setattr(n, "templateparms", Getattr(cn, "templateparms")); } Setattr(ccurrent, name, n); } else if (cn && (Getattr(n, "sym:weak"))) { /* The node being added is weak. Don't worry about it */ } else if (cn && (Getattr(n, "sym:typename"))) { /* The node being added is a typename. We definitely add it */ Setattr(ccurrent, name, n); append = cn; } else if (cn && (Checkattr(cn, "nodeType", "templateparm"))) { Swig_error(Getfile(n), Getline(n), "Declaration of '%s' shadows template parameter,\n", name); Swig_error(Getfile(cn), Getline(cn), "previous template parameter declaration '%s'.\n", name); return; } else if (cn) { append = n; } else if (!cn) { /* No conflict. Add the symbol */ Setattr(ccurrent, name, n); } /* Multiple entries in the C symbol table. We append to the symbol table */ if (append) { Node *fn, *pn = 0; cn = Getattr(ccurrent, name); fn = cn; while (fn) { pn = fn; if (fn == append) { /* already added. Bail */ return; } fn = Getattr(fn, "csym:nextSibling"); } if (pn) { Setattr(pn, "csym:nextSibling", append); } } /* Special typedef handling. When a typedef node is added to the symbol table, we might have to add a type alias. This would occur if the typedef mapped to another scope in the system. For example: class Foo { }; typedef Foo OtherFoo; In this case, OtherFoo becomes an alias for Foo. */ { Node *td = n; while (td && Checkattr(td, "nodeType", "cdecl") && Checkattr(td, "storage", "typedef")) { SwigType *type; Node *td1; type = Copy(Getattr(td, "type")); SwigType_push(type, Getattr(td, "decl")); td1 = Swig_symbol_clookup(type, 0); /* Fix pathetic case #1214313: class Foo { }; typedef Foo FooBar; class CBaz { public: typedef FooBar Foo; }; ie, when Foo -> FooBar -> Foo, jump one scope up when possible. */ if (td1 && Checkattr(td1, "storage", "typedef")) { String *st = Getattr(td1, "type"); String *sn = Getattr(td, "name"); if (st && sn && Equal(st, sn)) { Symtab *sc = Getattr(current_symtab, "parentNode"); if (sc) td1 = Swig_symbol_clookup(type, sc); } } Delete(type); if (td1 == td) break; td = td1; if (td) { Symtab *st = Getattr(td, "symtab"); if (st) { Swig_symbol_alias(Getattr(n, "name"), st); break; } } } } } /* ----------------------------------------------------------------------------- * Swig_symbol_add() * * Adds a node to the symbol table. Returns the node itself if successfully * added. Otherwise, it returns the symbol table entry of the conflicting node. * * Also places the symbol in a behind-the-scenes C symbol table. This is needed * for namespace support, type resolution, and other issues. * ----------------------------------------------------------------------------- */ Node *Swig_symbol_add(const_String_or_char_ptr symname, Node *n) { Hash *c, *cl = 0; SwigType *decl, *ndecl; String *cstorage, *nstorage; int nt = 0, ct = 0; int pn = 0; int u1 = 0, u2 = 0; String *name, *overname; /* See if the node has a name. If so, we place in the C symbol table for this scope. We don't worry about overloading here---the primary purpose of this is to record information for type/name resolution for later. Conflicts in C namespaces are errors, but these will be caught by the C++ compiler when compiling the wrapper code */ /* There are a few options for weak symbols. A "weak" symbol is any symbol that can be replaced by another symbol in the C symbol table. An example would be a forward class declaration. A forward class sits in the symbol table until a real class declaration comes along. Certain symbols are marked as "sym:typename". These are important symbols related to the C++ type-system and take precedence in the C symbol table. An example might be code like this: template T foo(T x); int foo(int); In this case, the template is marked with "sym:typename" so that it stays in the C symbol table (so that it can be expanded using %template). */ name = Getattr(n, "name"); if (name && Len(name)) { Swig_symbol_cadd(name, n); } /* No symbol name defined. We return. */ if (!symname) { Setattr(n, "sym:symtab", current_symtab); return n; } /* If node is ignored. We don't proceed any further */ if (GetFlag(n, "feature:ignore")) return n; /* See if the symbol already exists in the table */ c = Getattr(current, symname); /* Check for a weak symbol. A weak symbol is allowed to be in the symbol table, but is silently overwritten by other symbols. An example would be a forward class declaration. For instance: class Foo; In this case, "Foo" sits in the symbol table. However, the definition of Foo would replace the entry if it appeared later. */ if (c && Getattr(c, "sym:weak")) { c = 0; } if (c) { /* There is a symbol table conflict. There are a few cases to consider here: (1) A conflict between a class/enum and a typedef declaration is okay. In this case, the symbol table entry is set to the class/enum declaration itself, not the typedef. (2) A conflict between namespaces is okay--namespaces are open (3) Otherwise, overloading is only allowed for functions (4) This special case is okay: a class template instantiated with same name as the template's name */ /* Check for namespaces */ String *ntype = Getattr(n, "nodeType"); if ((Equal(ntype, Getattr(c, "nodeType"))) && ((Equal(ntype, "namespace")))) { Node *cl, *pcl = 0; cl = c; while (cl) { pcl = cl; cl = Getattr(cl, "sym:nextSibling"); } Setattr(pcl, "sym:nextSibling", n); Setattr(n, "sym:symtab", current_symtab); Setattr(n, "sym:name", symname); Setattr(n, "sym:previousSibling", pcl); return n; } /* Special case: class template instantiated with same name as the template's name eg: %template(X) X; */ if (Equal(nodeType(c), "template")) { String *nt1 = Getattr(c, "templatetype"); String *nt2 = nodeType(n); if (Equal(nt1, "class") && Equal(nt1, nt2)) { if (Getattr(n, "template")) { /* Finally check that another %template with same name doesn't already exist */ if (!Getattr(c, "sym:nextSibling")) { Setattr(c, "sym:nextSibling", n); Setattr(n, "sym:symtab", current_symtab); Setattr(n, "sym:name", symname); Setattr(n, "sym:previousSibling", c); return n; } } } } if (Getattr(n, "allows_typedef")) nt = 1; if (Getattr(c, "allows_typedef")) ct = 1; if (nt || ct) { Node *td, *other; String *s; /* At least one of the nodes allows typedef overloading. Make sure that both don't--this would be a conflict */ if (nt && ct) return c; /* Figure out which node allows the typedef */ if (nt) { td = n; other = c; } else { td = c; other = n; } /* Make sure the other node is a typedef */ s = Getattr(other, "storage"); if (!s || (!Equal(s, "typedef"))) return c; /* No. This is a conflict */ /* Hmmm. This appears to be okay. Make sure the symbol table refers to the allow_type node */ if (td != c) { Setattr(current, symname, td); Setattr(td, "sym:symtab", current_symtab); Setattr(td, "sym:name", symname); } return n; } decl = Getattr(c, "decl"); ndecl = Getattr(n, "decl"); { String *nt1, *nt2; nt1 = Getattr(n, "nodeType"); if (Equal(nt1, "template")) nt1 = Getattr(n, "templatetype"); nt2 = Getattr(c, "nodeType"); if (Equal(nt2, "template")) nt2 = Getattr(c, "templatetype"); if (Equal(nt1, "using")) u1 = 1; if (Equal(nt2, "using")) u2 = 1; if ((!Equal(nt1, nt2)) && !(u1 || u2)) return c; } if (!(u1 || u2)) { if ((!SwigType_isfunction(decl)) || (!SwigType_isfunction(ndecl))) { /* Symbol table conflict */ return c; } } /* Hmmm. Declarator seems to indicate that this is a function */ /* Look at storage class to see if compatible */ cstorage = Getattr(c, "storage"); nstorage = Getattr(n, "storage"); /* If either one is declared as typedef, forget it. We're hosed */ if (Cmp(cstorage, "typedef") == 0) { return c; } if (Cmp(nstorage, "typedef") == 0) { return c; } /* Okay. Walk down the list of symbols and see if we get a declarator match */ { String *nt = Getattr(n, "nodeType"); int n_template = Equal(nt, "template") && Checkattr(n, "templatetype", "cdecl"); int n_plain_cdecl = Equal(nt, "cdecl"); Node *cn = c; pn = 0; while (cn) { decl = Getattr(cn, "decl"); if (!(u1 || u2)) { if (Cmp(ndecl, decl) == 0) { /* Declarator conflict */ /* Now check we don't have a non-templated function overloaded by a templated function with same params, * eg void foo(); template void foo(); */ String *cnt = Getattr(cn, "nodeType"); int cn_template = Equal(cnt, "template") && Checkattr(cn, "templatetype", "cdecl"); int cn_plain_cdecl = Equal(cnt, "cdecl"); if (!((n_template && cn_plain_cdecl) || (cn_template && n_plain_cdecl))) { /* found a conflict */ return cn; } } } cl = cn; cn = Getattr(cn, "sym:nextSibling"); pn++; } } /* Well, we made it this far. Guess we can drop the symbol in place */ Setattr(n, "sym:symtab", current_symtab); Setattr(n, "sym:name", symname); /* Printf(stdout,"%s %p\n", Getattr(n,"sym:overname"), current_symtab); */ assert(!Getattr(n, "sym:overname")); overname = NewStringf("__SWIG_%d", pn); Setattr(n, "sym:overname", overname); /*Printf(stdout,"%s %s %s\n", symname, Getattr(n,"decl"), Getattr(n,"sym:overname")); */ Setattr(cl, "sym:nextSibling", n); Setattr(n, "sym:previousSibling", cl); Setattr(cl, "sym:overloaded", c); Setattr(n, "sym:overloaded", c); Delete(overname); return n; } /* No conflict. Just add it */ Setattr(n, "sym:symtab", current_symtab); Setattr(n, "sym:name", symname); /* Printf(stdout,"%s\n", Getattr(n,"sym:overname")); */ overname = NewStringf("__SWIG_%d", pn); Setattr(n, "sym:overname", overname); Delete(overname); /* Printf(stdout,"%s %s %s\n", symname, Getattr(n,"decl"), Getattr(n,"sym:overname")); */ Setattr(current, symname, n); return n; } /* ----------------------------------------------------------------------------- * symbol_lookup() * * Internal function to handle fully qualified symbol table lookups. This * works from the symbol table supplied in symtab and unwinds its way out * towards the global scope. * * This function operates in the C namespace, not the target namespace. * * The check function is an optional callback that can be used to verify a particular * symbol match. This is only used in some of the more exotic parts of SWIG. For instance, * verifying that a class hierarchy implements all pure virtual methods. * ----------------------------------------------------------------------------- */ static Node *_symbol_lookup(const String *name, Symtab *symtab, int (*check) (Node *n)) { Node *n; List *inherit; Hash *sym = Getattr(symtab, "csymtab"); if (Getmark(symtab)) return 0; Setmark(symtab, 1); n = Getattr(sym, name); #ifdef SWIG_DEBUG Printf(stderr, "symbol_look %s %p %p %s\n", name, n, symtab, Getattr(symtab, "name")); #endif if (n) { /* if a check-function is defined. Call it to determine a match */ if (check) { int c = check(n); if (c == 1) { Setmark(symtab, 0); return n; } if (c < 0) { /* Terminate the search right away */ Setmark(symtab, 0); return 0; } } else { Setmark(symtab, 0); return n; } } if (!n && SwigType_istemplate(name)) { String *dname = 0; Setmark(symtab, 0); dname = Swig_symbol_template_deftype(name, symtab); if (!Equal(dname, name)) { n = _symbol_lookup(dname, symtab, check); } Delete(dname); if (n) return n; Setmark(symtab, 1); } inherit = Getattr(symtab, "inherit"); if (inherit && use_inherit) { int i, len; len = Len(inherit); for (i = 0; i < len; i++) { n = _symbol_lookup(name, Getitem(inherit, i), check); if (n) { Setmark(symtab, 0); return n; } } } Setmark(symtab, 0); return 0; } static Node *symbol_lookup(const_String_or_char_ptr name, Symtab *symtab, int (*check) (Node *n)) { Node *n = 0; if (DohCheck(name)) { n = _symbol_lookup(name, symtab, check); } else { String *sname = NewString(name); n = _symbol_lookup(sname, symtab, check); Delete(sname); } return n; } /* ----------------------------------------------------------------------------- * symbol_lookup_qualified() * ----------------------------------------------------------------------------- */ static Node *symbol_lookup_qualified(const_String_or_char_ptr name, Symtab *symtab, const String *prefix, int local, int (*checkfunc) (Node *n)) { /* This is a little funky, we search by fully qualified names */ if (!symtab) return 0; if (!prefix) { Node *n; String *bname = 0; String *prefix = 0; Swig_scopename_split(name, &prefix, &bname); n = symbol_lookup_qualified(bname, symtab, prefix, local, checkfunc); Delete(bname); Delete(prefix); return n; } else { Symtab *st; Node *n = 0; /* Make qualified name of current scope */ String *qalloc = 0; String *qname = Swig_symbol_qualifiedscopename(symtab); const String *cqname; if (qname) { if (Len(qname)) { if (prefix && Len(prefix)) { Printv(qname, "::", prefix, NIL); } } else { Append(qname, prefix); } qalloc = qname; cqname = qname; } else { cqname = prefix; } st = Getattr(symtabs, cqname); /* Found a scope match */ if (st) { if (!name) { if (qalloc) Delete(qalloc); return st; } n = symbol_lookup(name, st, checkfunc); } if (qalloc) Delete(qalloc); if (!n) { if (!local) { Node *pn = Getattr(symtab, "parentNode"); if (pn) n = symbol_lookup_qualified(name, pn, prefix, local, checkfunc); /* Check inherited scopes */ if (!n) { List *inherit = Getattr(symtab, "inherit"); if (inherit && use_inherit) { int i, len; len = Len(inherit); for (i = 0; i < len; i++) { Node *prefix_node = symbol_lookup(prefix, Getitem(inherit, i), checkfunc); if (prefix_node) { Node *prefix_symtab = Getattr(prefix_node, "symtab"); if (prefix_symtab) { n = symbol_lookup(name, prefix_symtab, checkfunc); break; } } } } } } else { n = 0; } } return n; } } /* ----------------------------------------------------------------------------- * Swig_symbol_clookup() * * Look up a symbol in the symbol table. This uses the C name, not scripting * names. Note: If we come across a using declaration, we follow it to * to get the real node. Any using directives are also followed (but this is * implemented in symbol_lookup()). * ----------------------------------------------------------------------------- */ Node *Swig_symbol_clookup(const_String_or_char_ptr name, Symtab *n) { Hash *hsym = 0; Node *s = 0; if (!n) { hsym = current_symtab; } else { if (!Checkattr(n, "nodeType", "symboltable")) { n = Getattr(n, "sym:symtab"); } assert(n); if (n) { hsym = n; } } if (Swig_scopename_check(name)) { char *cname = Char(name); if (strncmp(cname, "::", 2) == 0) { String *nname = NewString(cname + 2); if (Swig_scopename_check(nname)) { s = symbol_lookup_qualified(nname, global_scope, 0, 0, 0); } else { s = symbol_lookup(nname, global_scope, 0); } Delete(nname); } else { String *prefix = Swig_scopename_prefix(name); if (prefix) { s = symbol_lookup_qualified(name, hsym, 0, 0, 0); Delete(prefix); if (!s) { return 0; } } } } if (!s) { while (hsym) { s = symbol_lookup(name, hsym, 0); if (s) break; hsym = Getattr(hsym, "parentNode"); if (!hsym) break; } } if (!s) { return 0; } /* Check if s is a 'using' node */ while (s && Checkattr(s, "nodeType", "using")) { String *uname = Getattr(s, "uname"); Symtab *un = Getattr(s, "sym:symtab"); Node *ss = (!Equal(name, uname) || (un != n)) ? Swig_symbol_clookup(uname, un) : 0; /* avoid infinity loop */ if (!ss) { Swig_warning(WARN_PARSE_USING_UNDEF, Getfile(s), Getline(s), "Nothing known about '%s'.\n", SwigType_namestr(Getattr(s, "uname"))); } s = ss; } return s; } /* ----------------------------------------------------------------------------- * Swig_symbol_clookup_check() * * This function is identical to Swig_symbol_clookup() except that it * accepts a callback function that is invoked to determine a symbol match. * The purpose of this function is to support complicated algorithms that need * to examine multiple definitions of the same symbol that might appear in an * inheritance hierarchy. * ----------------------------------------------------------------------------- */ Node *Swig_symbol_clookup_check(const_String_or_char_ptr name, Symtab *n, int (*checkfunc) (Node *n)) { Hash *hsym = 0; Node *s = 0; if (!n) { hsym = current_symtab; } else { if (!Checkattr(n, "nodeType", "symboltable")) { n = Getattr(n, "sym:symtab"); } assert(n); if (n) { hsym = n; } } if (Swig_scopename_check(name)) { char *cname = Char(name); if (strncmp(cname, "::", 2) == 0) { String *nname = NewString(cname + 2); if (Swig_scopename_check(nname)) { s = symbol_lookup_qualified(nname, global_scope, 0, 0, checkfunc); } else { s = symbol_lookup(nname, global_scope, checkfunc); } Delete(nname); } else { String *prefix = Swig_scopename_prefix(name); if (prefix) { s = symbol_lookup_qualified(name, hsym, 0, 0, checkfunc); Delete(prefix); if (!s) { return 0; } } } } if (!s) { while (hsym) { s = symbol_lookup(name, hsym, checkfunc); if (s) break; hsym = Getattr(hsym, "parentNode"); if (!hsym) break; } } if (!s) { return 0; } /* Check if s is a 'using' node */ while (s && Checkattr(s, "nodeType", "using")) { Node *ss; ss = Swig_symbol_clookup(Getattr(s, "uname"), Getattr(s, "sym:symtab")); if (!ss && !checkfunc) { Swig_warning(WARN_PARSE_USING_UNDEF, Getfile(s), Getline(s), "Nothing known about '%s'.\n", SwigType_namestr(Getattr(s, "uname"))); } s = ss; } return s; } /* ----------------------------------------------------------------------------- * Swig_symbol_clookup_local() * * Same as Swig_symbol_clookup but parent nodes are not searched, that is, just * this symbol table is searched. * ----------------------------------------------------------------------------- */ Node *Swig_symbol_clookup_local(const_String_or_char_ptr name, Symtab *n) { Hash *hsym; Node *s = 0; if (!n) { hsym = current_symtab; } else { if (!Checkattr(n, "nodeType", "symboltable")) { n = Getattr(n, "sym:symtab"); } assert(n); hsym = n; } if (Swig_scopename_check(name)) { char *cname = Char(name); if (strncmp(cname, "::", 2) == 0) { String *nname = NewString(cname + 2); if (Swig_scopename_check(nname)) { s = symbol_lookup_qualified(nname, global_scope, 0, 0, 0); } else { s = symbol_lookup(nname, global_scope, 0); } Delete(nname); } else { s = symbol_lookup_qualified(name, hsym, 0, 0, 0); } } if (!s) { s = symbol_lookup(name, hsym, 0); } if (!s) return 0; /* Check if s is a 'using' node */ while (s && Checkattr(s, "nodeType", "using")) { Node *ss = Swig_symbol_clookup_local(Getattr(s, "uname"), Getattr(s, "sym:symtab")); if (!ss) { Swig_warning(WARN_PARSE_USING_UNDEF, Getfile(s), Getline(s), "Nothing known about '%s'.\n", SwigType_namestr(Getattr(s, "uname"))); } s = ss; } return s; } /* ----------------------------------------------------------------------------- * Swig_symbol_clookup_local_check() * ----------------------------------------------------------------------------- */ Node *Swig_symbol_clookup_local_check(const_String_or_char_ptr name, Symtab *n, int (*checkfunc) (Node *)) { Hash *hsym; Node *s = 0; if (!n) { hsym = current_symtab; } else { if (!Checkattr(n, "nodeType", "symboltable")) { n = Getattr(n, "sym:symtab"); } assert(n); hsym = n; } if (Swig_scopename_check(name)) { char *cname = Char(name); if (strncmp(cname, "::", 2) == 0) { String *nname = NewString(cname + 2); if (Swig_scopename_check(nname)) { s = symbol_lookup_qualified(nname, global_scope, 0, 0, checkfunc); } else { s = symbol_lookup(nname, global_scope, checkfunc); } Delete(nname); } else { s = symbol_lookup_qualified(name, hsym, 0, 0, checkfunc); } } if (!s) { s = symbol_lookup(name, hsym, checkfunc); } if (!s) return 0; /* Check if s is a 'using' node */ while (s && Checkattr(s, "nodeType", "using")) { Node *ss = Swig_symbol_clookup_local_check(Getattr(s, "uname"), Getattr(s, "sym:symtab"), checkfunc); if (!ss && !checkfunc) { Swig_warning(WARN_PARSE_USING_UNDEF, Getfile(s), Getline(s), "Nothing known about '%s'.\n", SwigType_namestr(Getattr(s, "uname"))); } s = ss; } return s; } /* ----------------------------------------------------------------------------- * Swig_symbol_clookup_no_inherit() * * Symbol lookup like Swig_symbol_clookup but does not follow using declarations. * ----------------------------------------------------------------------------- */ Node *Swig_symbol_clookup_no_inherit(const_String_or_char_ptr name, Symtab *n) { Node *s = 0; assert(use_inherit==1); use_inherit = 0; s = Swig_symbol_clookup(name, n); use_inherit = 1; return s; } /* ----------------------------------------------------------------------------- * Swig_symbol_cscope() * * Look up a scope name. * ----------------------------------------------------------------------------- */ Symtab *Swig_symbol_cscope(const_String_or_char_ptr name, Symtab *symtab) { char *cname = Char(name); if (strncmp(cname, "::", 2) == 0) return symbol_lookup_qualified(0, global_scope, name, 0, 0); return symbol_lookup_qualified(0, symtab, name, 0, 0); } /* ----------------------------------------------------------------------------- * Swig_symbol_remove() * * Remove a symbol. If the symbol is an overloaded function and the symbol removed * is not the last in the list of overloaded functions, then the overloaded * names (sym:overname attribute) are changed to start from zero, eg __SWIG_0. * ----------------------------------------------------------------------------- */ void Swig_symbol_remove(Node *n) { Symtab *symtab; String *symname; String *overname; Node *symprev; Node *symnext; Node *fixovername = 0; symtab = Getattr(n, "sym:symtab"); /* Get symbol table object */ symtab = Getattr(symtab, "symtab"); /* Get actual hash table of symbols */ symname = Getattr(n, "sym:name"); symprev = Getattr(n, "sym:previousSibling"); symnext = Getattr(n, "sym:nextSibling"); /* If previous symbol, just fix the links */ if (symprev) { if (symnext) { Setattr(symprev, "sym:nextSibling", symnext); fixovername = symprev; /* fix as symbol to remove is somewhere in the middle of the linked list */ } else { Delattr(symprev, "sym:nextSibling"); } } else { /* If no previous symbol, see if there is a next symbol */ if (symnext) { Setattr(symtab, symname, symnext); fixovername = symnext; /* fix as symbol to remove is at head of linked list */ } else { if (symname) Delattr(symtab, symname); } } if (symnext) { if (symprev) { Setattr(symnext, "sym:previousSibling", symprev); } else { Delattr(symnext, "sym:previousSibling"); } } Delattr(n, "sym:symtab"); Delattr(n, "sym:previousSibling"); Delattr(n, "sym:nextSibling"); Delattr(n, "csym:nextSibling"); Delattr(n, "sym:overname"); Delattr(n, "csym:previousSibling"); Delattr(n, "sym:overloaded"); n = 0; if (fixovername) { Node *nn = fixovername; Node *head = fixovername; int pn = 0; /* find head of linked list */ while (nn) { head = nn; nn = Getattr(nn, "sym:previousSibling"); } /* adjust all the sym:overname strings to start from 0 and increment by one */ nn = head; while (nn) { assert(Getattr(nn, "sym:overname")); Delattr(nn, "sym:overname"); overname = NewStringf("__SWIG_%d", pn); Setattr(nn, "sym:overname", overname); Delete(overname); pn++; nn = Getattr(nn, "sym:nextSibling"); } } } /* ----------------------------------------------------------------------------- * Swig_symbol_qualified() * * Return the qualified name of a symbol * ----------------------------------------------------------------------------- */ String *Swig_symbol_qualified(Node *n) { Hash *symtab; if (Checkattr(n, "nodeType", "symboltable")) { symtab = n; } else { symtab = Getattr(n, "sym:symtab"); } if (!symtab) return NewStringEmpty(); #ifdef SWIG_DEBUG Printf(stderr, "symbol_qscope %s %p %s\n", Getattr(n, "name"), symtab, Getattr(symtab, "name")); #endif return Swig_symbol_qualifiedscopename(symtab); } /* ----------------------------------------------------------------------------- * Swig_symbol_isoverloaded() * * Check if a symbol is overloaded. Returns the first symbol if so. * ----------------------------------------------------------------------------- */ Node *Swig_symbol_isoverloaded(Node *n) { return Getattr(n, "sym:overloaded"); } /* ----------------------------------------------------------------------------- * symbol_template_qualify() * * Internal function to create a fully qualified type name for templates * ----------------------------------------------------------------------------- */ /* This cache produces problems with OSS, don't active it */ /* #define SWIG_TEMPLATE_QUALIFY_CACHE */ static SwigType *symbol_template_qualify(const SwigType *e, Symtab *st) { String *tprefix, *tsuffix; SwigType *qprefix; List *targs; Node *tempn; Symtab *tscope; Iterator ti; #ifdef SWIG_TEMPLATE_QUALIFY_CACHE static Hash *qualify_cache = 0; String *scopetype = st ? NewStringf("%s::%s", Getattr(st, "name"), e) : NewStringf("%s::%s", Swig_symbol_getscopename(), e); if (!qualify_cache) { qualify_cache = NewHash(); } if (scopetype) { String *cres = Getattr(qualify_cache, scopetype); if (cres) { Delete(scopetype); return Copy(cres); } } #endif tprefix = SwigType_templateprefix(e); tsuffix = SwigType_templatesuffix(e); qprefix = Swig_symbol_type_qualify(tprefix, st); targs = SwigType_parmlist(e); tempn = Swig_symbol_clookup_local(tprefix, st); tscope = tempn ? Getattr(tempn, "sym:symtab") : 0; Append(qprefix, "<("); for (ti = First(targs); ti.item;) { String *vparm; String *qparm = Swig_symbol_type_qualify(ti.item, st); if (tscope && (tscope != st)) { String *ty = Swig_symbol_type_qualify(qparm, tscope); Delete(qparm); qparm = ty; } vparm = Swig_symbol_template_param_eval(qparm, st); Append(qprefix, vparm); ti = Next(ti); if (ti.item) { Putc(',', qprefix); } Delete(qparm); Delete(vparm); } Append(qprefix, ")>"); Append(qprefix, tsuffix); Delete(tprefix); Delete(tsuffix); Delete(targs); #ifdef SWIG_DEBUG Printf(stderr, "symbol_temp_qual %s %s\n", e, qprefix); #endif #ifdef SWIG_TEMPLATE_QUALIFY_CACHE Setattr(qualify_cache, scopetype, qprefix); Delete(scopetype); #endif return qprefix; } static int symbol_no_constructor(Node *n) { return !Checkattr(n, "nodeType", "constructor"); } /* ----------------------------------------------------------------------------- * Swig_symbol_type_qualify() * * Create a fully qualified type name * Note: Does not resolve a constructor if passed in as the 'type'. * ----------------------------------------------------------------------------- */ SwigType *Swig_symbol_type_qualify(const SwigType *t, Symtab *st) { List *elements; String *result = NewStringEmpty(); int i, len; char *c = Char(t); if (strncmp(c, "::", 2) == 0) { Append(result, t); return result; } elements = SwigType_split(t); len = Len(elements); for (i = 0; i < len; i++) { String *e = Getitem(elements, i); if (SwigType_issimple(e)) { /* Note: the unary scope operator (::) is being removed from the template parameters here. */ Node *n = Swig_symbol_clookup_check(e, st, symbol_no_constructor); if (n) { String *name = Getattr(n, "name"); Clear(e); Append(e, name); #ifdef SWIG_DEBUG Printf(stderr, "symbol_qual_ei %d %s %s %p\n", i, name, e, st); #endif if (!Swig_scopename_check(name)) { String *qname = Swig_symbol_qualified(n); if (qname && Len(qname)) { Insert(e, 0, "::"); Insert(e, 0, qname); } #ifdef SWIG_DEBUG Printf(stderr, "symbol_qual_sc %d %s %s %p\n", i, qname, e, st); #endif Delete(qname); } } else if (SwigType_istemplate(e)) { SwigType *ty = symbol_template_qualify(e, st); Clear(e); Append(e, ty); Delete(ty); } if (strncmp(Char(e), "::", 2) == 0) { Delitem(e, 0); Delitem(e, 0); } Append(result, e); } else if (SwigType_isfunction(e)) { List *parms = SwigType_parmlist(e); String *s = NewString("f("); Iterator pi = First(parms); while (pi.item) { String *pf = Swig_symbol_type_qualify(pi.item, st); Append(s, pf); pi = Next(pi); if (pi.item) { Append(s, ","); } Delete(pf); } Append(s, ")."); Append(result, s); Delete(parms); Delete(s); } else { Append(result, e); } } Delete(elements); #ifdef SWIG_DEBUG Printf(stderr, "symbol_qualify %s %s %p %s\n", t, result, st, st ? Getattr(st, "name") : 0); #endif return result; } /* ----------------------------------------------------------------------------- * Swig_symbol_template_reduce() * Resolves template parameter types * For example: * typedef int Int; * typedef Int Integer; * with input: * Foo<(Int,Integer)> * returns: * Foo<(int,int)> * ----------------------------------------------------------------------------- */ static SwigType *Swig_symbol_template_reduce(SwigType *qt, Symtab *ntab) { Parm *p; String *templateargs = SwigType_templateargs(qt); List *parms = SwigType_parmlist(templateargs); Iterator pi = First(parms); String *tprefix = SwigType_templateprefix(qt); String *tsuffix = SwigType_templatesuffix(qt); String *qprefix = SwigType_typedef_qualified(tprefix); Append(qprefix, "<("); while ((p = pi.item)) { String *np; String *tp = Swig_symbol_typedef_reduce(p, ntab); String *qp = Swig_symbol_type_qualify(tp, ntab); Node *n = Swig_symbol_clookup(qp, ntab); if (n) { String *qual = Swig_symbol_qualified(n); np = Copy(Getattr(n, "name")); Delete(tp); tp = np; if (qual && Len(qual)) { Insert(np, 0, "::"); Insert(np, 0, qual); } Delete(qual); } else { np = qp; } Append(qprefix, np); pi = Next(pi); if (pi.item) { Append(qprefix, ","); } Delete(qp); Delete(tp); } Append(qprefix, ")>"); Append(qprefix, tsuffix); Delete(parms); Delete(tprefix); Delete(tsuffix); Delete(templateargs); return qprefix; } /* ----------------------------------------------------------------------------- * Swig_symbol_typedef_reduce() * * Chase a typedef through symbol tables looking for a match. * ----------------------------------------------------------------------------- */ SwigType *Swig_symbol_typedef_reduce(const SwigType *ty, Symtab *tab) { SwigType *prefix, *base; Node *n; String *nt; base = SwigType_base(ty); prefix = SwigType_prefix(ty); n = Swig_symbol_clookup(base, tab); if (!n) { if (SwigType_istemplate(ty)) { SwigType *qt = Swig_symbol_template_reduce(base, tab); Append(prefix, qt); Delete(qt); #ifdef SWIG_DEBUG Printf(stderr, "symbol_reduce (a) %s %s\n", ty, prefix); #endif Delete(base); return prefix; } else { Delete(prefix); #ifdef SWIG_DEBUG Printf(stderr, "symbol_reduce (b) %s %s\n", ty, ty); #endif return Copy(ty); } } nt = Getattr(n, "nodeType"); if (Equal(nt, "using")) { String *uname = Getattr(n, "uname"); if (uname) { n = Swig_symbol_clookup(base, Getattr(n, "sym:symtab")); if (!n) { Delete(base); Delete(prefix); #ifdef SWIG_DEBUG Printf(stderr, "symbol_reduce (c) %s %s\n", ty, ty); #endif return Copy(ty); } } } if (Equal(nt, "cdecl")) { String *storage = Getattr(n, "storage"); if (storage && (Equal(storage, "typedef"))) { SwigType *decl; SwigType *rt; SwigType *qt; Symtab *ntab; SwigType *nt = Copy(Getattr(n, "type")); /* Fix for case 'typedef struct Hello hello;' */ { const char *dclass[3] = { "struct ", "union ", "class " }; int i; char *c = Char(nt); for (i = 0; i < 3; i++) { if (strstr(c, dclass[i]) == c) { Replace(nt, dclass[i], "", DOH_REPLACE_FIRST); } } } decl = Getattr(n, "decl"); if (decl) { SwigType_push(nt, decl); } SwigType_push(nt, prefix); Delete(base); Delete(prefix); ntab = Getattr(n, "sym:symtab"); rt = Swig_symbol_typedef_reduce(nt, ntab); qt = Swig_symbol_type_qualify(rt, ntab); if (SwigType_istemplate(qt)) { SwigType *qtr = Swig_symbol_template_reduce(qt, ntab); Delete(qt); qt = qtr; } Delete(nt); Delete(rt); #ifdef SWIG_DEBUG Printf(stderr, "symbol_reduce (d) %s %s\n", qt, ty); #endif return qt; } } Delete(base); Delete(prefix); #ifdef SWIG_DEBUG Printf(stderr, "symbol_reduce (e) %s %s\n", ty, ty); #endif return Copy(ty); } /* ----------------------------------------------------------------------------- * Swig_symbol_string_qualify() * * This function takes a string and looks for identifiers. Identifiers are * then qualified according to scope rules. This function is used in a number * of settings including expression evaluation, scoping of conversion operators, * and so forth. * ----------------------------------------------------------------------------- */ String *Swig_symbol_string_qualify(String *s, Symtab *st) { int have_id = 0; String *id = NewStringEmpty(); String *r = NewStringEmpty(); char *c = Char(s); int first_char = 1; while (*c) { if (isalpha((int) *c) || (*c == '_') || (*c == ':') || (*c == '~' && first_char) || (isdigit((int) *c) && !first_char)) { Putc(*c, id); have_id = 1; } else { if (have_id) { String *qid = Swig_symbol_type_qualify(id, st); Append(r, qid); Clear(id); Delete(qid); have_id = 0; } Putc(*c, r); } first_char = (*c == ':'); c++; } if (have_id) { String *qid = Swig_symbol_type_qualify(id, st); Append(r, qid); Delete(qid); } Delete(id); return r; } /* ----------------------------------------------------------------------------- * Swig_symbol_template_defargs() * * Apply default arg from generic template default args * Returns a parameter list which contains missing default arguments (if any) * Note side effects: parms will also contain the extra parameters in its list * (but only if non-zero). * ----------------------------------------------------------------------------- */ ParmList *Swig_symbol_template_defargs(Parm *parms, Parm *targs, Symtab *tscope, Symtab *tsdecl) { ParmList *expandedparms = parms; if (Len(parms) < Len(targs)) { Parm *lp = parms; Parm *p = lp; Parm *tp = targs; while (p && tp) { p = nextSibling(p); tp = nextSibling(tp); if (p) lp = p; } while (tp) { String *value = Getattr(tp, "value"); if (value) { Parm *cp; Parm *ta = targs; Parm *p = parms; SwigType *nt = Swig_symbol_string_qualify(value, tsdecl); SwigType *ntq = 0; #ifdef SWIG_DEBUG Printf(stderr, "value %s %s %s\n", value, nt, tsdecl ? Getattr(tsdecl, "name") : tsdecl); #endif while (p && ta) { String *name = Getattr(ta, "name"); String *pvalue = Getattr(p, "value"); String *value = pvalue ? pvalue : Getattr(p, "type"); String *ttq = Swig_symbol_type_qualify(value, tscope); /* value = SwigType_typedef_resolve_all(value); */ Replaceid(nt, name, ttq); p = nextSibling(p); ta = nextSibling(ta); Delete(ttq); } ntq = Swig_symbol_type_qualify(nt, tsdecl); if (SwigType_istemplate(ntq)) { String *ty = Swig_symbol_template_deftype(ntq, tscope); Delete(ntq); ntq = ty; } cp = NewParmWithoutFileLineInfo(ntq, 0); if (lp) { set_nextSibling(lp, cp); Delete(cp); } else { expandedparms = cp; } lp = cp; tp = nextSibling(tp); Delete(nt); Delete(ntq); } else { tp = 0; } } } return expandedparms; } /* ----------------------------------------------------------------------------- * Swig_symbol_template_deftype() * * Apply default args to generic template type * ----------------------------------------------------------------------------- */ #define SWIG_TEMPLATE_DEFTYPE_CACHE SwigType *Swig_symbol_template_deftype(const SwigType *type, Symtab *tscope) { String *result = NewStringEmpty(); List *elements = SwigType_split(type); int len = Len(elements); int i; #ifdef SWIG_TEMPLATE_DEFTYPE_CACHE static Hash *s_cache = 0; Hash *scope_cache; /* The lookup depends on the current scope and potential namespace qualification. Looking up x in namespace y is not the same as looking up x::y in outer scope. -> we use a 2-level hash: first scope and then symbol. */ String *scope_name = tscope ? Swig_symbol_qualifiedscopename(tscope) : Swig_symbol_qualifiedscopename(current_symtab); String *type_name = tscope ? NewStringf("%s::%s", Getattr(tscope, "name"), type) : NewStringf("%s::%s", Swig_symbol_getscopename(), type); if (!scope_name) scope_name = NewString("::"); if (!s_cache) { s_cache = NewHash(); } scope_cache = Getattr(s_cache, scope_name); if (scope_cache) { String *cres = Getattr(scope_cache, type_name); if (cres) { Append(result, cres); #ifdef SWIG_DEBUG Printf(stderr, "cached deftype %s(%s) -> %s\n", type, scope_name, result); #endif Delete(type_name); Delete(scope_name); return result; } } else { scope_cache = NewHash(); Setattr(s_cache, scope_name, scope_cache); Delete(scope_name); } #endif #ifdef SWIG_DEBUG Printf(stderr, "finding deftype %s\n", type); #endif for (i = 0; i < len; i++) { String *e = Getitem(elements, i); if (SwigType_isfunction(e)) { String *s = NewString("f("); List *parms = SwigType_parmlist(e); Iterator pi = First(parms); while (pi.item) { String *pf = SwigType_istemplate(e) ? Swig_symbol_template_deftype(pi.item, tscope) : Swig_symbol_type_qualify(pi.item, tscope); Append(s, pf); pi = Next(pi); if (pi.item) { Append(s, ","); } Delete(pf); } Append(s, ")."); Append(result, s); Delete(s); Delete(parms); } else if (SwigType_istemplate(e)) { String *prefix = SwigType_prefix(e); String *base = SwigType_base(e); String *tprefix = SwigType_templateprefix(base); String *targs = SwigType_templateargs(base); String *tsuffix = SwigType_templatesuffix(base); ParmList *tparms = SwigType_function_parms(targs, 0); Node *tempn = Swig_symbol_clookup_local(tprefix, tscope); if (!tempn && tsuffix && Len(tsuffix)) { tempn = Swig_symbol_clookup(tprefix, 0); } #ifdef SWIG_DEBUG Printf(stderr, "deftype type %s %s %d\n", e, tprefix, (long) tempn); #endif if (tempn) { ParmList *tnargs = Getattr(tempn, "templateparms"); ParmList *expandedparms; Parm *p; Symtab *tsdecl = Getattr(tempn, "sym:symtab"); #ifdef SWIG_DEBUG Printf(stderr, "deftype type %s %s %s\n", tprefix, targs, tsuffix); #endif Append(tprefix, "<("); expandedparms = Swig_symbol_template_defargs(tparms, tnargs, tscope, tsdecl); p = expandedparms; tscope = tsdecl; while (p) { SwigType *ptype = Getattr(p, "type"); SwigType *ttr = ptype ? ptype : Getattr(p, "value"); SwigType *ttf = Swig_symbol_type_qualify(ttr, tscope); SwigType *ttq = Swig_symbol_template_param_eval(ttf, tscope); #ifdef SWIG_DEBUG Printf(stderr, "arg type %s\n", ttq); #endif if (SwigType_istemplate(ttq)) { SwigType *ttd = Swig_symbol_template_deftype(ttq, tscope); Delete(ttq); ttq = ttd; #ifdef SWIG_DEBUG Printf(stderr, "arg deftype %s\n", ttq); #endif } Append(tprefix, ttq); p = nextSibling(p); if (p) Putc(',', tprefix); Delete(ttf); Delete(ttq); } Append(tprefix, ")>"); Append(tprefix, tsuffix); Append(prefix, tprefix); #ifdef SWIG_DEBUG Printf(stderr, "deftype %s %s \n", type, tprefix); #endif Append(result, prefix); } else { Append(result, e); } Delete(prefix); Delete(base); Delete(tprefix); Delete(tsuffix); Delete(targs); Delete(tparms); } else { Append(result, e); } } Delete(elements); #ifdef SWIG_TEMPLATE_DEFTYPE_CACHE Setattr(scope_cache, type_name, result); Delete(type_name); #endif return result; } SwigType *Swig_symbol_template_param_eval(const SwigType *p, Symtab *symtab) { String *value = Copy(p); Node *lastnode = 0; while (1) { Node *n = Swig_symbol_clookup(value, symtab); if (n == lastnode) break; lastnode = n; if (n) { String *nt = Getattr(n, "nodeType"); if (Equal(nt, "enumitem")) { /* An enum item. Generate a fully qualified name */ String *qn = Swig_symbol_qualified(n); if (qn && Len(qn)) { Append(qn, "::"); Append(qn, Getattr(n, "name")); Delete(value); value = qn; continue; } else { Delete(qn); break; } } else if ((Equal(nt, "cdecl"))) { String *nv = Getattr(n, "value"); if (nv) { Delete(value); value = Copy(nv); continue; } } } break; } return value; } swig-4.0.1/Source/Swig/naming.c0000644000175000017500000014501713527063513016146 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * naming.c * * Functions for generating various kinds of names during code generation. * * Swig_name_register is used to register a format string for generating names. * The format string makes use of the following format specifiers: * * %c - class name is substituted * %f - function name is substituted * %m - member name is substituted * %n - namespace is substituted * %v - variable name is substituted * ----------------------------------------------------------------------------- */ #include "swig.h" #include "cparse.h" #include /* Hash table containing naming data */ static Hash *naming_hash = 0; #if 0 #define SWIG_DEBUG #endif /* ----------------------------------------------------------------------------- * Swig_name_register() * * Register a new naming format. * ----------------------------------------------------------------------------- */ void Swig_name_register(const_String_or_char_ptr method, const_String_or_char_ptr format) { if (!naming_hash) naming_hash = NewHash(); Setattr(naming_hash, method, format); } void Swig_name_unregister(const_String_or_char_ptr method) { if (naming_hash) { Delattr(naming_hash, method); } } /* Return naming format for the specified method or the default format if none was explicitly registered */ static String* get_naming_format_for(const char *method, const char *def_format) { String* f = naming_hash ? Getattr(naming_hash, method) : NULL; return f ? Copy(f) : NewString(def_format); } static int name_mangle(String *r) { char *c; int special; special = 0; Replaceall(r, "::", "_"); c = Char(r); while (*c) { if (!isalnum((int) *c) && (*c != '_')) { special = 1; switch (*c) { case '+': *c = 'a'; break; case '-': *c = 's'; break; case '*': *c = 'm'; break; case '/': *c = 'd'; break; case '<': *c = 'l'; break; case '>': *c = 'g'; break; case '=': *c = 'e'; break; case ',': *c = 'c'; break; case '(': *c = 'p'; break; case ')': *c = 'P'; break; case '[': *c = 'b'; break; case ']': *c = 'B'; break; case '^': *c = 'x'; break; case '&': *c = 'A'; break; case '|': *c = 'o'; break; case '~': *c = 'n'; break; case '!': *c = 'N'; break; case '%': *c = 'M'; break; case '.': *c = 'f'; break; case '?': *c = 'q'; break; default: *c = '_'; break; } } c++; } if (special) Append(r, "___"); return special; } /* ----------------------------------------------------------------------------- * replace_nspace() * * Mangles in the namespace from nspace by replacing %n in name if nspace feature required. * ----------------------------------------------------------------------------- */ static void replace_nspace(String *name, const_String_or_char_ptr nspace) { if (nspace) { String *namspace = NewStringf("%s_", nspace); Replaceall(namspace, NSPACE_SEPARATOR, "_"); Replace(name, "%n", namspace, DOH_REPLACE_ANY); Delete(namspace); } else { Replace(name, "%n", "", DOH_REPLACE_ANY); } } /* ----------------------------------------------------------------------------- * Swig_name_mangle() * * Converts all of the non-identifier characters of a string to underscores. * ----------------------------------------------------------------------------- */ String *Swig_name_mangle(const_String_or_char_ptr s) { #if 0 String *r = NewString(s); name_mangle(r); return r; #else return Swig_string_mangle(s); #endif } /* ----------------------------------------------------------------------------- * Swig_name_wrapper() * * Returns the name of a wrapper function. * ----------------------------------------------------------------------------- */ String *Swig_name_wrapper(const_String_or_char_ptr fname) { String *r = get_naming_format_for("wrapper", "_wrap_%f"); Replace(r, "%f", fname, DOH_REPLACE_ANY); name_mangle(r); return r; } /* ----------------------------------------------------------------------------- * Swig_name_member() * * Returns the name of a class method. * ----------------------------------------------------------------------------- */ String *Swig_name_member(const_String_or_char_ptr nspace, const_String_or_char_ptr classname, const_String_or_char_ptr membername) { String *r; String *rclassname; char *cname; rclassname = SwigType_namestr(classname); r = get_naming_format_for("member", "%n%c_%m"); cname = Char(rclassname); if ((strncmp(cname, "struct ", 7) == 0) || ((strncmp(cname, "class ", 6) == 0)) || ((strncmp(cname, "union ", 6) == 0))) { cname = strchr(cname, ' ') + 1; } replace_nspace(r, nspace); Replace(r, "%c", cname, DOH_REPLACE_ANY); Replace(r, "%m", membername, DOH_REPLACE_ANY); /* name_mangle(r); */ Delete(rclassname); return r; } /* ----------------------------------------------------------------------------- * Swig_name_get() * * Returns the name of the accessor function used to get a variable. * ----------------------------------------------------------------------------- */ String *Swig_name_get(const_String_or_char_ptr nspace, const_String_or_char_ptr vname) { String *r = get_naming_format_for("get", "%n%v_get"); #ifdef SWIG_DEBUG Printf(stdout, "Swig_name_get: '%s'\n", vname); #endif replace_nspace(r, nspace); Replace(r, "%v", vname, DOH_REPLACE_ANY); /* name_mangle(r); */ return r; } /* ----------------------------------------------------------------------------- * Swig_name_set() * * Returns the name of the accessor function used to set a variable. * ----------------------------------------------------------------------------- */ String *Swig_name_set(const_String_or_char_ptr nspace, const_String_or_char_ptr vname) { String *r = get_naming_format_for("set", "%n%v_set"); replace_nspace(r, nspace); Replace(r, "%v", vname, DOH_REPLACE_ANY); /* name_mangle(r); */ return r; } /* Common implementation of all Swig_name_() functions below. */ static String *make_full_name_for(const char *method, const char *def_format, const_String_or_char_ptr nspace, const_String_or_char_ptr classname) { String *r; String *rclassname; char *cname; rclassname = SwigType_namestr(classname); r = get_naming_format_for(method, def_format); cname = Char(rclassname); if ((strncmp(cname, "struct ", 7) == 0) || ((strncmp(cname, "class ", 6) == 0)) || ((strncmp(cname, "union ", 6) == 0))) { cname = strchr(cname, ' ') + 1; } replace_nspace(r, nspace); Replace(r, "%c", cname, DOH_REPLACE_ANY); Delete(rclassname); return r; } /* ----------------------------------------------------------------------------- * Swig_name_construct() * * Returns the name of the accessor function used to create an object. * ----------------------------------------------------------------------------- */ String *Swig_name_construct(const_String_or_char_ptr nspace, const_String_or_char_ptr classname) { return make_full_name_for("construct", "new_%n%c", nspace, classname); } /* ----------------------------------------------------------------------------- * Swig_name_copyconstructor() * * Returns the name of the accessor function used to copy an object. * ----------------------------------------------------------------------------- */ String *Swig_name_copyconstructor(const_String_or_char_ptr nspace, const_String_or_char_ptr classname) { return make_full_name_for("copy", "copy_%n%c", nspace, classname); } /* ----------------------------------------------------------------------------- * Swig_name_destroy() * * Returns the name of the accessor function used to destroy an object. * ----------------------------------------------------------------------------- */ String *Swig_name_destroy(const_String_or_char_ptr nspace, const_String_or_char_ptr classname) { return make_full_name_for("destroy", "delete_%n%c", nspace, classname); } /* ----------------------------------------------------------------------------- * Swig_name_disown() * * Returns the name of the accessor function used to disown an object. * ----------------------------------------------------------------------------- */ String *Swig_name_disown(const_String_or_char_ptr nspace, const_String_or_char_ptr classname) { return make_full_name_for("disown", "disown_%n%c", nspace, classname); } /* ----------------------------------------------------------------------------- * Swig_name_object_set() * * Sets an object associated with a name and optional declarators. * ----------------------------------------------------------------------------- */ void Swig_name_object_set(Hash *namehash, String *name, SwigType *decl, DOH *object) { DOH *n; #ifdef SWIG_DEBUG Printf(stdout, "Swig_name_object_set: '%s', '%s'\n", name, decl); #endif n = Getattr(namehash, name); if (!n) { n = NewHash(); Setattr(namehash, name, n); Delete(n); } /* Add an object based on the declarator value */ if (!decl) { Setattr(n, "start", object); } else { SwigType *cd = Copy(decl); Setattr(n, cd, object); Delete(cd); } } /* ----------------------------------------------------------------------------- * Swig_name_object_get() * * Return an object associated with an optional class prefix, name, and * declarator. This function operates according to name matching rules * described for the %rename directive in the SWIG manual. * ----------------------------------------------------------------------------- */ static DOH *get_object(Hash *n, String *decl) { DOH *rn = 0; if (!n) return 0; if (decl) { rn = Getattr(n, decl); } else { rn = Getattr(n, "start"); } return rn; } static DOH *name_object_get(Hash *namehash, String *tname, SwigType *decl, SwigType *ncdecl) { DOH *rn = 0; Hash *n = Getattr(namehash, tname); if (n) { rn = get_object(n, decl); if ((!rn) && ncdecl) rn = get_object(n, ncdecl); if (!rn) rn = get_object(n, 0); } return rn; } DOH *Swig_name_object_get(Hash *namehash, String *prefix, String *name, SwigType *decl) { String *tname = NewStringEmpty(); DOH *rn = 0; char *ncdecl = 0; if (!namehash) return 0; /* DB: This removed to more tightly control feature/name matching */ /* if ((decl) && (SwigType_isqualifier(decl))) { ncdecl = strchr(Char(decl),'.'); ncdecl++; } */ #ifdef SWIG_DEBUG Printf(stdout, "Swig_name_object_get: '%s' '%s', '%s'\n", prefix, name, decl); #endif /* Perform a class-based lookup (if class prefix supplied) */ if (prefix) { if (Len(prefix)) { Printf(tname, "%s::%s", prefix, name); rn = name_object_get(namehash, tname, decl, ncdecl); if (!rn) { String *cls = Swig_scopename_last(prefix); if (!Equal(cls, prefix)) { Clear(tname); Printf(tname, "*::%s::%s", cls, name); rn = name_object_get(namehash, tname, decl, ncdecl); } Delete(cls); } /* Lookup a name within a templated-based class */ if (!rn) { String *t_name = SwigType_istemplate_templateprefix(prefix); if (t_name) { Clear(tname); Printf(tname, "%s::%s", t_name, name); rn = name_object_get(namehash, tname, decl, ncdecl); Delete(t_name); } } /* Lookup a template-based name within a class */ if (!rn) { String *t_name = SwigType_istemplate_templateprefix(name); if (t_name) rn = Swig_name_object_get(namehash, prefix, t_name, decl); Delete(t_name); } } /* A wildcard-based class lookup */ if (!rn) { Clear(tname); Printf(tname, "*::%s", name); rn = name_object_get(namehash, tname, decl, ncdecl); } } else { /* Lookup in the global namespace only */ Clear(tname); Printf(tname, "::%s", name); rn = name_object_get(namehash, tname, decl, ncdecl); } /* Catch-all */ if (!rn) { rn = name_object_get(namehash, name, decl, ncdecl); } if (!rn && Swig_scopename_check(name)) { String *nprefix = 0; String *nlast = 0; Swig_scopename_split(name, &nprefix, &nlast); rn = name_object_get(namehash, nlast, decl, ncdecl); Delete(nlast); Delete(nprefix); } Delete(tname); #ifdef SWIG_DEBUG Printf(stdout, "Swig_name_object_get: found %d\n", rn ? 1 : 0); #endif return rn; } /* ----------------------------------------------------------------------------- * Swig_name_object_inherit() * * Implements name-based inheritance scheme. * ----------------------------------------------------------------------------- */ void Swig_name_object_inherit(Hash *namehash, String *base, String *derived) { Iterator ki; Hash *derh; String *bprefix; String *dprefix; char *cbprefix; int plen; if (!namehash) return; /* Temporary hash holding all the entries we add while we iterate over namehash itself as we can't modify the latter while iterating over it. */ derh = NULL; bprefix = NewStringf("%s::", base); dprefix = NewStringf("%s::", derived); cbprefix = Char(bprefix); plen = (int)strlen(cbprefix); for (ki = First(namehash); ki.key; ki = Next(ki)) { char *k = Char(ki.key); if (strncmp(k, cbprefix, plen) == 0) { /* Copy, adjusting name, this element to the derived hash. */ Iterator oi; String *nkey = NewStringf("%s%s", dprefix, k + plen); Hash *n = ki.item; Hash *newh; /* Don't overwrite an existing value for the derived class, if any. */ newh = Getattr(namehash, nkey); if (!newh) { if (!derh) derh = NewHash(); newh = NewHash(); Setattr(derh, nkey, newh); Delete(newh); } for (oi = First(n); oi.key; oi = Next(oi)) { if (!Getattr(newh, oi.key)) { String *ci = Copy(oi.item); Setattr(newh, oi.key, ci); Delete(ci); } } Delete(nkey); } } /* Merge the contents of derived hash into the main hash. */ if (derh) { for (ki = First(derh); ki.key; ki = Next(ki)) { Setattr(namehash, ki.key, ki.item); } } Delete(bprefix); Delete(dprefix); Delete(derh); } /* ----------------------------------------------------------------------------- * merge_features() * * Given a hash, this function merges the features in the hash into the node. * ----------------------------------------------------------------------------- */ static void merge_features(Hash *features, Node *n) { Iterator ki; if (!features) return; for (ki = First(features); ki.key; ki = Next(ki)) { String *ci = Copy(ki.item); Setattr(n, ki.key, ci); Delete(ci); } } /* ----------------------------------------------------------------------------- * Swig_features_get() * * Attaches any features in the features hash to the node that matches * the declaration, decl. * ----------------------------------------------------------------------------- */ static void features_get(Hash *features, const String *tname, SwigType *decl, SwigType *ncdecl, Node *node) { Node *n = Getattr(features, tname); #ifdef SWIG_DEBUG Printf(stdout, " features_get: %s\n", tname); #endif if (n) { merge_features(get_object(n, 0), node); if (ncdecl) merge_features(get_object(n, ncdecl), node); merge_features(get_object(n, decl), node); } } void Swig_features_get(Hash *features, String *prefix, String *name, SwigType *decl, Node *node) { char *ncdecl = 0; String *rdecl = 0; String *rname = 0; if (!features) return; /* MM: This removed to more tightly control feature/name matching */ /* if ((decl) && (SwigType_isqualifier(decl))) { ncdecl = strchr(Char(decl),'.'); ncdecl++; } */ /* very specific hack for template constructors/destructors */ if (name && SwigType_istemplate(name)) { String *nodetype = nodeType(node); if (nodetype && (Equal(nodetype, "constructor") || Equal(nodetype, "destructor"))) { String *nprefix = 0; String *nlast = 0; String *tprefix; Swig_scopename_split(name, &nprefix, &nlast); tprefix = SwigType_templateprefix(nlast); Delete(nlast); if (Len(nprefix)) { Append(nprefix, "::"); Append(nprefix, tprefix); Delete(tprefix); rname = nprefix; } else { rname = tprefix; Delete(nprefix); } rdecl = Copy(decl); Replaceall(rdecl, name, rname); decl = rdecl; name = rname; } } #ifdef SWIG_DEBUG Printf(stdout, "Swig_features_get: '%s' '%s' '%s'\n", prefix, name, decl); #endif /* Global features */ features_get(features, "", 0, 0, node); if (name) { String *tname = NewStringEmpty(); /* add features for 'root' template */ String *dname = SwigType_istemplate_templateprefix(name); if (dname) { features_get(features, dname, decl, ncdecl, node); } /* Catch-all */ features_get(features, name, decl, ncdecl, node); /* Perform a class-based lookup (if class prefix supplied) */ if (prefix) { /* A class-generic feature */ if (Len(prefix)) { Printf(tname, "%s::", prefix); features_get(features, tname, decl, ncdecl, node); } /* A wildcard-based class lookup */ Clear(tname); Printf(tname, "*::%s", name); features_get(features, tname, decl, ncdecl, node); /* A specific class lookup */ if (Len(prefix)) { /* A template-based class lookup */ String *tprefix = SwigType_istemplate_templateprefix(prefix); if (tprefix) { Clear(tname); Printf(tname, "%s::%s", tprefix, name); features_get(features, tname, decl, ncdecl, node); } Clear(tname); Printf(tname, "%s::%s", prefix, name); features_get(features, tname, decl, ncdecl, node); Delete(tprefix); } } else { /* Lookup in the global namespace only */ Clear(tname); Printf(tname, "::%s", name); features_get(features, tname, decl, ncdecl, node); } Delete(tname); Delete(dname); } if (name && SwigType_istemplate(name)) { /* add features for complete template type */ String *dname = Swig_symbol_template_deftype(name, 0); if (!Equal(dname, name)) { Swig_features_get(features, prefix, dname, decl, node); } Delete(dname); } if (rname) Delete(rname); if (rdecl) Delete(rdecl); } /* ----------------------------------------------------------------------------- * Swig_feature_set() * * Sets a feature name and value. Also sets optional feature attributes as * passed in by featureattribs. Optional feature attributes are given a full name * concatenating the feature name plus ':' plus the attribute name. * ----------------------------------------------------------------------------- */ void Swig_feature_set(Hash *features, const_String_or_char_ptr name, SwigType *decl, const_String_or_char_ptr featurename, const_String_or_char_ptr value, Hash *featureattribs) { Hash *n; Hash *fhash; #ifdef SWIG_DEBUG Printf(stdout, "Swig_feature_set: '%s' '%s' '%s' '%s'\n", name, decl, featurename, value); #endif n = Getattr(features, name); if (!n) { n = NewHash(); Setattr(features, name, n); Delete(n); } if (!decl) { fhash = Getattr(n, "start"); if (!fhash) { fhash = NewHash(); Setattr(n, "start", fhash); Delete(fhash); } } else { fhash = Getattr(n, decl); if (!fhash) { String *cdecl_ = Copy(decl); fhash = NewHash(); Setattr(n, cdecl_, fhash); Delete(cdecl_); Delete(fhash); } } if (value) { Setattr(fhash, featurename, value); } else { Delattr(fhash, featurename); } { /* Add in the optional feature attributes */ Hash *attribs = featureattribs; while (attribs) { String *attribname = Getattr(attribs, "name"); String *featureattribname = NewStringf("%s:%s", featurename, attribname); if (value) { String *attribvalue = Getattr(attribs, "value"); Setattr(fhash, featureattribname, attribvalue); } else { Delattr(fhash, featureattribname); } attribs = nextSibling(attribs); Delete(featureattribname); } } if (name && SwigType_istemplate(name)) { String *dname = Swig_symbol_template_deftype(name, 0); if (Strcmp(dname, name)) { Swig_feature_set(features, dname, decl, featurename, value, featureattribs); } Delete(dname); } } /* ----------------------------------------------------------------------------- * The rename/namewarn engine * * Code below was in parser.y for a while * ----------------------------------------------------------------------------- */ static Hash *namewarn_hash = 0; static Hash *name_namewarn_hash() { if (!namewarn_hash) namewarn_hash = NewHash(); return namewarn_hash; } static Hash *rename_hash = 0; static Hash *name_rename_hash() { if (!rename_hash) rename_hash = NewHash(); return rename_hash; } static List *namewarn_list = 0; static List *name_namewarn_list() { if (!namewarn_list) namewarn_list = NewList(); return namewarn_list; } static List *rename_list = 0; static List *name_rename_list() { if (!rename_list) rename_list = NewList(); return rename_list; } /* ----------------------------------------------------------------------------- * int need_name_warning(Node *n) * * Detects if a node needs name warnings * * ----------------------------------------------------------------------------- */ static int need_name_warning(Node *n) { int need = 1; /* We don't use name warnings for: - class forwards, no symbol is generated at the target language. - template declarations, only for real instances using %template(name). - typedefs, have no effect at the target language. - using declarations and using directives, have no effect at the target language. */ if (checkAttribute(n, "nodeType", "classforward")) { need = 0; } else if (checkAttribute(n, "nodeType", "using")) { need = 0; } else if (checkAttribute(n, "storage", "typedef")) { need = 0; } else if (Getattr(n, "hidden")) { need = 0; } else if (Getattr(n, "ignore")) { need = 0; } else if (Getattr(n, "templatetype")) { need = 0; } else if (GetFlag(n, "parsing_template_declaration")) { need = 0; } return need; } /* ----------------------------------------------------------------------------- * int Swig_need_redefined_warn() * * Detects when a redefined object needs a warning * * ----------------------------------------------------------------------------- */ static int nodes_are_equivalent(Node *a, Node *b, int a_inclass) { /* they must have the same type */ String *ta = nodeType(a); String *tb = nodeType(b); if (!Equal(ta, tb)) { if (!(Equal(ta, "using") && Equal(tb, "cdecl"))) { return 0; } } if (Cmp(ta, "cdecl") == 0) { /* both cdecl case */ /* typedef */ String *a_storage = Getattr(a, "storage"); String *b_storage = Getattr(b, "storage"); if ((Cmp(a_storage, "typedef") == 0) || (Cmp(b_storage, "typedef") == 0)) { if (Cmp(a_storage, b_storage) == 0) { String *a_type = (Getattr(a, "type")); String *b_type = (Getattr(b, "type")); if (Cmp(a_type, b_type) == 0) return 1; } return 0; } /* static functions */ if (Swig_storage_isstatic(a) || Swig_storage_isstatic(b)) { if (Cmp(a_storage, b_storage) != 0) return 0; } /* friend methods */ if (!a_inclass || (Cmp(a_storage, "friend") == 0)) { /* check declaration */ String *a_decl = (Getattr(a, "decl")); String *b_decl = (Getattr(b, "decl")); if (Cmp(a_decl, b_decl) == 0) { /* check return type */ String *a_type = (Getattr(a, "type")); String *b_type = (Getattr(b, "type")); if (Cmp(a_type, b_type) == 0) { /* check parameters */ Parm *ap = (Getattr(a, "parms")); Parm *bp = (Getattr(b, "parms")); while (ap && bp) { SwigType *at = Getattr(ap, "type"); SwigType *bt = Getattr(bp, "type"); if (Cmp(at, bt) != 0) return 0; ap = nextSibling(ap); bp = nextSibling(bp); } if (ap || bp) { return 0; } else { Node *a_template = Getattr(a, "template"); Node *b_template = Getattr(b, "template"); /* Not equivalent if one is a template instantiation (via %template) and the other is a non-templated function */ if ((a_template && !b_template) || (!a_template && b_template)) return 0; } return 1; } } } } else if (Equal(ta, "using")) { /* using and cdecl case */ String *b_storage = Getattr(b, "storage"); if (Equal(b_storage, "typedef")) { String *a_name = Getattr(a, "name"); String *b_name = Getattr(b, "name"); if (Equal(a_name, b_name)) return 1; } } else { /* both %constant case */ String *a_storage = Getattr(a, "storage"); String *b_storage = Getattr(b, "storage"); if ((Cmp(a_storage, "%constant") == 0) || (Cmp(b_storage, "%constant") == 0)) { if (Cmp(a_storage, b_storage) == 0) { String *a_type = (Getattr(a, "type")); String *b_type = (Getattr(b, "type")); if ((Cmp(a_type, b_type) == 0) && (Cmp(Getattr(a, "value"), Getattr(b, "value")) == 0)) return 1; } return 0; } if (Equal(ta, "template") && Equal(tb, "template")) { if (Cmp(a_storage, "friend") == 0 || Cmp(b_storage, "friend") == 0) return 1; } } return 0; } int Swig_need_redefined_warn(Node *a, Node *b, int InClass) { String *a_name = Getattr(a, "name"); String *b_name = Getattr(b, "name"); String *a_symname = Getattr(a, "sym:name"); String *b_symname = Getattr(b, "sym:name"); /* always send a warning if a 'rename' is involved */ if ((a_symname && !Equal(a_symname, a_name)) || (b_symname && !Equal(b_symname, b_name))) { if (!Equal(a_name, b_name)) { return 1; } } return !nodes_are_equivalent(a, b, InClass); } /* ----------------------------------------------------------------------------- * int Swig_need_protected(Node* n) * * Detects when we need to fully register the protected member. * This is basically any protected members when the allprotected mode is set. * Otherwise we take just the protected virtual methods and non-static methods * (potentially virtual methods) as well as constructors/destructors. * Also any "using" statements in a class may potentially be virtual. * ----------------------------------------------------------------------------- */ int Swig_need_protected(Node *n) { String *nodetype = nodeType(n); if (checkAttribute(n, "access", "protected")) { if ((Equal(nodetype, "cdecl"))) { if (Swig_director_mode() && Swig_director_protected_mode() && Swig_all_protected_mode()) { return 1; } if (SwigType_isfunction(Getattr(n, "decl"))) { String *storage = Getattr(n, "storage"); /* The function is declared virtual, or it has no storage. This eliminates typedef, static etc. */ return !storage || Equal(storage, "virtual"); } } else if (Equal(nodetype, "constructor") || Equal(nodetype, "destructor")) { return 1; } else if (Equal(nodetype, "using") && !Getattr(n, "namespace")) { return 1; } } return 0; } /* ----------------------------------------------------------------------------- * void name_nameobj_add() * * Add nameobj (rename/namewarn) * * ----------------------------------------------------------------------------- */ static List *make_attrlist(const char *ckey) { List *list = NewList(); const char *cattr = strchr(ckey, '$'); if (cattr) { String *nattr; const char *rattr = strchr(++cattr, '$'); while (rattr) { nattr = NewStringWithSize(cattr, (int)(rattr - cattr)); Append(list, nattr); Delete(nattr); cattr = rattr + 1; rattr = strchr(cattr, '$'); } nattr = NewString(cattr); Append(list, nattr); Delete(nattr); } else { Append(list, "nodeType"); } return list; } static void name_object_attach_keys(const char *keys[], Hash *nameobj) { Node *kw = nextSibling(nameobj); List *matchlist = 0; while (kw) { Node *next = nextSibling(kw); String *kname = Getattr(kw, "name"); char *ckey = kname ? Char(kname) : 0; if (ckey) { const char **rkey; int isnotmatch = 0; int isregexmatch = 0; if ((strncmp(ckey, "match", 5) == 0) || (isnotmatch = (strncmp(ckey, "notmatch", 8) == 0)) || (isregexmatch = (strncmp(ckey, "regexmatch", 10) == 0)) || (isnotmatch = isregexmatch = (strncmp(ckey, "notregexmatch", 13) == 0))) { Hash *mi = NewHash(); List *attrlist = make_attrlist(ckey); if (!matchlist) matchlist = NewList(); Setattr(mi, "value", Getattr(kw, "value")); Setattr(mi, "attrlist", attrlist); if (isnotmatch) SetFlag(mi, "notmatch"); if (isregexmatch) SetFlag(mi, "regexmatch"); Delete(attrlist); Append(matchlist, mi); Delete(mi); removeNode(kw); } else { for (rkey = keys; *rkey != 0; ++rkey) { if (strcmp(ckey, *rkey) == 0) { Setattr(nameobj, *rkey, Getattr(kw, "value")); removeNode(kw); } } } } kw = next; } if (matchlist) { Setattr(nameobj, "matchlist", matchlist); Delete(matchlist); } } static void name_nameobj_add(Hash *name_hash, List *name_list, String *prefix, String *name, SwigType *decl, Hash *nameobj) { String *nname = 0; if (name && Len(name)) { String *target_fmt = Getattr(nameobj, "targetfmt"); nname = prefix ? NewStringf("%s::%s", prefix, name) : NewString(name); if (target_fmt) { String *tmp = NewStringf(target_fmt, nname); Delete(nname); nname = tmp; } } if (!nname || !Len(nname) || Getattr(nameobj, "fullname") || /* any of these options trigger a 'list' nameobj */ Getattr(nameobj, "sourcefmt") || Getattr(nameobj, "matchlist") || Getattr(nameobj, "regextarget")) { if (decl) Setattr(nameobj, "decl", decl); if (nname && Len(nname)) Setattr(nameobj, "targetname", nname); /* put the new nameobj at the beginning of the list, such that the last inserted rule take precedence */ Insert(name_list, 0, nameobj); } else { /* here we add an old 'hash' nameobj, simple and fast */ Swig_name_object_set(name_hash, nname, decl, nameobj); } Delete(nname); } /* ----------------------------------------------------------------------------- * int name_match_nameobj() * * Apply and check the nameobj's math list to the node * * ----------------------------------------------------------------------------- */ static DOH *get_lattr(Node *n, List *lattr) { DOH *res = 0; int ilen = Len(lattr); int i; for (i = 0; n && (i < ilen); ++i) { String *nattr = Getitem(lattr, i); res = Getattr(n, nattr); #ifdef SWIG_DEBUG if (!res) { Printf(stdout, "missing %s %s %s\n", nattr, Getattr(n, "name"), Getattr(n, "member")); } else { Printf(stdout, "lattr %d %s %s\n", i, nattr, DohIsString(res) ? res : Getattr(res, "name")); } #endif n = res; } return res; } #ifdef HAVE_PCRE #include static int name_regexmatch_value(Node *n, String *pattern, String *s) { pcre *compiled_pat; const char *err; int errpos; int rc; compiled_pat = pcre_compile(Char(pattern), 0, &err, &errpos, NULL); if (!compiled_pat) { Swig_error("SWIG", Getline(n), "Invalid regex \"%s\": compilation failed at %d: %s\n", Char(pattern), errpos, err); SWIG_exit(EXIT_FAILURE); } rc = pcre_exec(compiled_pat, NULL, Char(s), Len(s), 0, 0, NULL, 0); pcre_free(compiled_pat); if (rc == PCRE_ERROR_NOMATCH) return 0; if (rc < 0 ) { Swig_error("SWIG", Getline(n), "Matching \"%s\" against regex \"%s\" failed: %d\n", Char(s), Char(pattern), rc); SWIG_exit(EXIT_FAILURE); } return 1; } #else /* !HAVE_PCRE */ static int name_regexmatch_value(Node *n, String *pattern, String *s) { (void)pattern; (void)s; Swig_error("SWIG", Getline(n), "PCRE regex matching is not available in this SWIG build.\n"); SWIG_exit(EXIT_FAILURE); } #endif /* HAVE_PCRE/!HAVE_PCRE */ static int name_match_value(String *mvalue, String *value) { #if defined(SWIG_USE_SIMPLE_MATCHOR) int match = 0; char *cvalue = Char(value); char *cmvalue = Char(mvalue); char *sep = strchr(cmvalue, '|'); while (sep && !match) { match = strncmp(cvalue, cmvalue, sep - cmvalue) == 0; #ifdef SWIG_DEBUG Printf(stdout, "match_value: %s %s %d\n", cvalue, cmvalue, match); #endif cmvalue = sep + 1; sep = strchr(cmvalue, '|'); } if (!match) { match = strcmp(cvalue, cmvalue) == 0; #ifdef SWIG_DEBUG Printf(stdout, "match_value: %s %s %d\n", cvalue, cmvalue, match); #endif } return match; #else return Equal(mvalue, value); #endif } static int name_match_nameobj(Hash *rn, Node *n) { int match = 1; List *matchlist = Getattr(rn, "matchlist"); #ifdef SWIG_DEBUG Printf(stdout, "name_match_nameobj: %s\n", Getattr(n, "name")); #endif if (matchlist) { int ilen = Len(matchlist); int i; for (i = 0; match && (i < ilen); ++i) { Node *mi = Getitem(matchlist, i); List *lattr = Getattr(mi, "attrlist"); String *nval = get_lattr(n, lattr); int notmatch = GetFlag(mi, "notmatch"); int regexmatch = GetFlag(mi, "regexmatch"); match = 0; if (nval) { String *kwval = Getattr(mi, "value"); match = regexmatch ? name_regexmatch_value(n, kwval, nval) : name_match_value(kwval, nval); #ifdef SWIG_DEBUG Printf(stdout, "val %s %s %d %d \n", nval, kwval, match, ilen); #endif } if (notmatch) match = !match; } } #ifdef SWIG_DEBUG Printf(stdout, "name_match_nameobj: %d\n", match); #endif return match; } /* ----------------------------------------------------------------------------- * Hash *name_nameobj_lget() * * Get a nameobj (rename/namewarn) from the list of filters * * ----------------------------------------------------------------------------- */ static Hash *name_nameobj_lget(List *namelist, Node *n, String *prefix, String *name, String *decl) { Hash *res = 0; if (namelist) { int len = Len(namelist); int i; int match = 0; for (i = 0; !match && (i < len); i++) { Hash *rn = Getitem(namelist, i); String *rdecl = Getattr(rn, "decl"); if (rdecl && (!decl || !Equal(rdecl, decl))) { continue; } else if (name_match_nameobj(rn, n)) { String *tname = Getattr(rn, "targetname"); if (tname) { String *sfmt = Getattr(rn, "sourcefmt"); String *sname = 0; int fullname = GetFlag(rn, "fullname"); int regextarget = GetFlag(rn, "regextarget"); if (sfmt) { if (fullname && prefix) { String *pname = NewStringf("%s::%s", prefix, name); sname = NewStringf(sfmt, pname); Delete(pname); } else { sname = NewStringf(sfmt, name); } } else { if (fullname && prefix) { sname = NewStringf("%s::%s", prefix, name); } else { sname = name; DohIncref(name); } } match = regextarget ? name_regexmatch_value(n, tname, sname) : name_match_value(tname, sname); Delete(sname); } else { /* Applying the renaming rule may fail if it contains a %(regex)s expression that doesn't match the given name. */ String *sname = NewStringf(Getattr(rn, "name"), name); if (sname) { if (Len(sname)) match = 1; Delete(sname); } } } if (match) { res = rn; break; } } } return res; } /* ----------------------------------------------------------------------------- * Swig_name_namewarn_add * * Add a namewarn objects * * ----------------------------------------------------------------------------- */ void Swig_name_namewarn_add(String *prefix, String *name, SwigType *decl, Hash *namewrn) { const char *namewrn_keys[] = { "rename", "error", "fullname", "sourcefmt", "targetfmt", 0 }; name_object_attach_keys(namewrn_keys, namewrn); name_nameobj_add(name_namewarn_hash(), name_namewarn_list(), prefix, name, decl, namewrn); } /* ----------------------------------------------------------------------------- * Hash *name_namewarn_get() * * Return the namewarn object, if there is one. * * ----------------------------------------------------------------------------- */ static Hash *name_namewarn_get(Node *n, String *prefix, String *name, SwigType *decl) { if (!namewarn_hash && !namewarn_list) return 0; if (n) { /* Return in the obvious cases */ if (!name || !need_name_warning(n)) { return 0; } else { String *access = Getattr(n, "access"); int is_public = !access || Equal(access, "public"); if (!is_public && !Swig_need_protected(n)) { return 0; } } } if (name) { /* Check to see if the name is in the hash */ Hash *wrn = Swig_name_object_get(name_namewarn_hash(), prefix, name, decl); if (wrn && !name_match_nameobj(wrn, n)) wrn = 0; if (!wrn) { wrn = name_nameobj_lget(name_namewarn_list(), n, prefix, name, decl); } if (wrn && Getattr(wrn, "error")) { if (n) { Swig_error(Getfile(n), Getline(n), "%s\n", Getattr(wrn, "name")); } else { Swig_error(cparse_file, cparse_line, "%s\n", Getattr(wrn, "name")); } } return wrn; } else { return 0; } } /* ----------------------------------------------------------------------------- * String *Swig_name_warning() * * Return the name warning, if there is one. * * ----------------------------------------------------------------------------- */ String *Swig_name_warning(Node *n, String *prefix, String *name, SwigType *decl) { Hash *wrn = name_namewarn_get(n, prefix, name, decl); return (name && wrn) ? Getattr(wrn, "name") : 0; } /* ----------------------------------------------------------------------------- * Swig_name_rename_add() * * Manage the rename objects * * ----------------------------------------------------------------------------- */ static void single_rename_add(String *prefix, String *name, SwigType *decl, Hash *newname) { name_nameobj_add(name_rename_hash(), name_rename_list(), prefix, name, decl, newname); } /* Add a new rename. Works much like new_feature including default argument handling. */ void Swig_name_rename_add(String *prefix, String *name, SwigType *decl, Hash *newname, ParmList *declaratorparms) { ParmList *declparms = declaratorparms; const char *rename_keys[] = { "fullname", "sourcefmt", "targetfmt", "continue", "regextarget", 0 }; name_object_attach_keys(rename_keys, newname); /* Add the name */ single_rename_add(prefix, name, decl, newname); /* Add extra names if there are default parameters in the parameter list */ if (decl) { int constqualifier = SwigType_isconst(decl); while (declparms) { if (ParmList_has_defaultargs(declparms)) { /* Create a parameter list for the new rename by copying all but the last (defaulted) parameter */ ParmList *newparms = CopyParmListMax(declparms,ParmList_len(declparms)-1); /* Create new declaration - with the last parameter removed */ SwigType *newdecl = Copy(decl); Delete(SwigType_pop_function(newdecl)); /* remove the old parameter list from newdecl */ SwigType_add_function(newdecl, newparms); if (constqualifier) SwigType_add_qualifier(newdecl, "const"); single_rename_add(prefix, name, newdecl, newname); declparms = newparms; Delete(newdecl); } else { declparms = 0; } } } } /* Create a name for the given node applying rename/namewarn if needed */ static String *apply_rename(Node* n, String *newname, int fullname, String *prefix, String *name) { String *result = 0; if (newname && Len(newname)) { if (Strcmp(newname, "$ignore") == 0) { /* $ignore doesn't apply to parameters and while it's rare to explicitly write %ignore directives for them they could be caught by a wildcard ignore using regex match, just ignore the attempt to ignore them in this case */ if (!Equal(nodeType(n), "parm")) result = Copy(newname); } else { char *cnewname = Char(newname); if (cnewname) { int destructor = name && (*(Char(name)) == '~'); String *fmt = newname; /* use name as a fmt, but avoid C++ "%" and "%=" operators */ if (Len(newname) > 1 && strchr(cnewname, '%') && !(strcmp(cnewname, "%=") == 0)) { if (fullname && prefix) { result = NewStringf(fmt, prefix, name); } else { result = NewStringf(fmt, name); } } else { result = Copy(newname); } if (destructor && result && (*(Char(result)) != '~')) { Insert(result, 0, "~"); } } } } return result; } /* ----------------------------------------------------------------------------- * String *Swig_name_make() * * Make a name after applying all the rename/namewarn objects * * ----------------------------------------------------------------------------- */ String *Swig_name_make(Node *n, String *prefix, const_String_or_char_ptr cname, SwigType *decl, String *oldname) { String *nname = 0; String *result = 0; String *name = NewString(cname); Hash *wrn = 0; String *rdecl = 0; String *rname = 0; /* very specific hack for template constructors/destructors */ #ifdef SWIG_DEBUG Printf(stdout, "Swig_name_make: looking for %s %s %s %s\n", prefix, name, decl, oldname); #endif if (name && n && SwigType_istemplate(name)) { String *nodetype = nodeType(n); if (nodetype && (Equal(nodetype, "constructor") || Equal(nodetype, "destructor"))) { String *nprefix = 0; String *nlast = 0; String *tprefix; Swig_scopename_split(name, &nprefix, &nlast); tprefix = SwigType_templateprefix(nlast); Delete(nlast); if (Len(nprefix)) { Append(nprefix, "::"); Append(nprefix, tprefix); Delete(tprefix); rname = nprefix; } else { rname = tprefix; Delete(nprefix); } rdecl = Copy(decl); Replaceall(rdecl, name, rname); #ifdef SWIG_DEBUG Printf(stdout, "SWIG_name_make: use new name %s %s : %s %s\n", name, decl, rname, rdecl); #endif decl = rdecl; Delete(name); name = rname; } } if (rename_hash || rename_list || namewarn_hash || namewarn_list) { Hash *rn = Swig_name_object_get(name_rename_hash(), prefix, name, decl); if (!rn || !name_match_nameobj(rn, n)) { rn = name_nameobj_lget(name_rename_list(), n, prefix, name, decl); if (rn) { String *sfmt = Getattr(rn, "sourcefmt"); int fullname = GetFlag(rn, "fullname"); if (fullname && prefix) { String *sname = NewStringf("%s::%s", prefix, name); Delete(name); name = sname; prefix = 0; } if (sfmt) { String *sname = NewStringf(sfmt, name); Delete(name); name = sname; } } } if (rn) { String *newname = Getattr(rn, "name"); int fullname = GetFlag(rn, "fullname"); result = apply_rename(n, newname, fullname, prefix, name); } if (result && !Equal(result, name)) { /* operators in C++ allow aliases, we look for them */ char *cresult = Char(result); if (cresult && (strncmp(cresult, "operator ", 9) == 0)) { String *nresult = Swig_name_make(n, prefix, result, decl, oldname); if (!Equal(nresult, result)) { Delete(result); result = nresult; } else { Delete(nresult); } } } nname = result ? result : name; wrn = name_namewarn_get(n, prefix, nname, decl); if (wrn) { String *rename = Getattr(wrn, "rename"); if (rename) { String *msg = Getattr(wrn, "name"); int fullname = GetFlag(wrn, "fullname"); if (result) Delete(result); result = apply_rename(n, rename, fullname, prefix, name); if ((msg) && (Len(msg))) { if (!Getmeta(nname, "already_warned")) { if (n) { /* Parameter renaming is not fully implemented. Mainly because there is no C/C++ syntax to * for %rename to fully qualify a function's parameter name from outside the function. Hence it * is not possible to implemented targetted warning suppression on one parameter in one function. */ int suppress_parameter_rename_warning = Equal(nodeType(n), "parm"); if (!suppress_parameter_rename_warning) { SWIG_WARN_NODE_BEGIN(n); Swig_warning(0, Getfile(n), Getline(n), "%s\n", msg); SWIG_WARN_NODE_END(n); } } else { Swig_warning(0, Getfile(name), Getline(name), "%s\n", msg); } Setmeta(nname, "already_warned", "1"); } } } } } if (!result || !Len(result)) { if (result) Delete(result); if (oldname) { result = NewString(oldname); } else { result = NewString(cname); } } Delete(name); #ifdef SWIG_DEBUG Printf(stdout, "Swig_name_make: result '%s' '%s'\n", cname, result); #endif return result; } /* ----------------------------------------------------------------------------- * void Swig_name_inherit() * * Inherit namewarn, rename, and feature objects * * ----------------------------------------------------------------------------- */ void Swig_name_inherit(String *base, String *derived) { /* Printf(stdout,"base = '%s', derived = '%s'\n", base, derived); */ Swig_name_object_inherit(name_rename_hash(), base, derived); Swig_name_object_inherit(name_namewarn_hash(), base, derived); Swig_name_object_inherit(Swig_cparse_features(), base, derived); } /* ----------------------------------------------------------------------------- * Swig_inherit_base_symbols() * ----------------------------------------------------------------------------- */ void Swig_inherit_base_symbols(List *bases) { if (bases) { Iterator s; for (s = First(bases); s.item; s = Next(s)) { Symtab *st = Getattr(s.item, "symtab"); if (st) { Setfile(st, Getfile(s.item)); Setline(st, Getline(s.item)); Swig_symbol_inherit(st); } } Delete(bases); } } /* ----------------------------------------------------------------------------- * Swig_make_inherit_list() * ----------------------------------------------------------------------------- */ List *Swig_make_inherit_list(String *clsname, List *names, String *Namespaceprefix) { int i, ilen; String *derived; List *bases = NewList(); if (Namespaceprefix) derived = NewStringf("%s::%s", Namespaceprefix, clsname); else derived = NewString(clsname); ilen = Len(names); for (i = 0; i < ilen; i++) { String *base; String *n = Getitem(names, i); /* Try to figure out where this symbol is */ Node *s = Swig_symbol_clookup(n, 0); if (s) { while (s && (Strcmp(nodeType(s), "class") != 0)) { /* Not a class. Could be a typedef though. */ String *storage = Getattr(s, "storage"); if (storage && (Strcmp(storage, "typedef") == 0)) { String *nn = Getattr(s, "type"); s = Swig_symbol_clookup(nn, Getattr(s, "sym:symtab")); } else { break; } } if (s && ((Strcmp(nodeType(s), "class") == 0) || (Strcmp(nodeType(s), "template") == 0))) { String *q = Swig_symbol_qualified(s); Append(bases, s); if (q) { base = NewStringf("%s::%s", q, Getattr(s, "name")); Delete(q); } else { base = NewString(Getattr(s, "name")); } } else { base = NewString(n); } } else { base = NewString(n); } if (base) { Swig_name_inherit(base, derived); Delete(base); } } return bases; } /* ----------------------------------------------------------------------------- * void Swig_name_str() * * Return a stringified version of a C/C++ symbol from a node. * The node passed in is expected to be a function, constructor, destructor or * variable. Some example return values: * "MyNameSpace::MyTemplate::~MyTemplate" * "MyNameSpace::ABC::ABC" * "MyNameSpace::ABC::constmethod" * "MyNameSpace::ABC::variablename" * * ----------------------------------------------------------------------------- */ String *Swig_name_str(Node *n) { String *qname; String *qualifier = Swig_symbol_qualified(n); String *name = Swig_scopename_last(Getattr(n, "name")); if (qualifier) qualifier = SwigType_namestr(qualifier); /* Very specific hack for template constructors/destructors */ if (SwigType_istemplate(name)) { String *nodetype = nodeType(n); if (nodetype && (Equal(nodetype, "constructor") || Equal(nodetype, "destructor"))) { String *nprefix = 0; String *nlast = 0; String *tprefix; Swig_scopename_split(name, &nprefix, &nlast); tprefix = SwigType_templateprefix(nlast); Delete(nlast); Delete(nprefix); Delete(name); name = tprefix; } } qname = NewString(""); if (qualifier && Len(qualifier) > 0) Printf(qname, "%s::", qualifier); Printf(qname, "%s", SwigType_str(name, 0)); Delete(name); Delete(qualifier); return qname; } /* ----------------------------------------------------------------------------- * void Swig_name_decl() * * Return a stringified version of a C/C++ declaration without the return type. * The node passed in is expected to be a function, constructor, destructor or * variable. Some example return values: * "MyNameSpace::MyTemplate::~MyTemplate()" * "MyNameSpace::ABC::ABC(int,double)" * "MyNameSpace::ABC::constmethod(int) const" * "MyNameSpace::ABC::refqualifiermethod(int) const &" * "MyNameSpace::ABC::variablename" * * ----------------------------------------------------------------------------- */ String *Swig_name_decl(Node *n) { String *qname; String *decl; qname = Swig_name_str(n); decl = NewStringf("%s", qname); if (!checkAttribute(n, "kind", "variable")) { String *d = Getattr(n, "decl"); Printv(decl, "(", ParmList_errorstr(Getattr(n, "parms")), ")", NIL); if (SwigType_isfunction(d)) { SwigType *decl_temp = Copy(d); SwigType *qualifiers = SwigType_pop_function_qualifiers(decl_temp); if (qualifiers) { String *qualifiers_string = SwigType_str(qualifiers, 0); Printv(decl, " ", qualifiers_string, NIL); Delete(qualifiers_string); } Delete(decl_temp); } } Delete(qname); return decl; } /* ----------------------------------------------------------------------------- * void Swig_name_fulldecl() * * Return a stringified version of a C/C++ declaration including the return type. * The node passed in is expected to be a function, constructor or destructor. * Some example return values: * "MyNameSpace::MyTemplate::~MyTemplate()" * "MyNameSpace::ABC::ABC(int,double)" * "int * MyNameSpace::ABC::constmethod(int) const" * * ----------------------------------------------------------------------------- */ String *Swig_name_fulldecl(Node *n) { String *decl = Swig_name_decl(n); String *type = Getattr(n, "type"); String *nodetype = nodeType(n); String *fulldecl; /* add on the return type */ if (nodetype && (Equal(nodetype, "constructor") || Equal(nodetype, "destructor"))) { fulldecl = decl; } else { String *t = SwigType_str(type, 0); fulldecl = NewStringf("%s %s", t, decl); Delete(decl); Delete(t); } return fulldecl; } swig-4.0.1/Source/Swig/getopt.c0000644000175000017500000000675613527063513016205 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * getopt.c * * Handles the parsing of command line options. This is particularly nasty * compared to other utilities given that command line options can potentially * be read by many different modules within SWIG. Thus, in order to make sure * there are no unrecognized options, each module is required to "mark" * the options that it uses. Afterwards, we can make a quick scan to make * sure there are no unmarked options. * * TODO: * Should have cleaner error handling in general. * ----------------------------------------------------------------------------- */ #include "swig.h" static char **args; static int numargs; static int *marked; /* ----------------------------------------------------------------------------- * Swig_init_args() * * Initialize the argument list handler. * ----------------------------------------------------------------------------- */ void Swig_init_args(int argc, char **argv) { int i; assert(argc > 0); assert(argv); numargs = argc; args = argv; marked = (int *) malloc(numargs * sizeof(int)); for (i = 0; i < argc; i++) { marked[i] = 0; } marked[0] = 1; } /* ----------------------------------------------------------------------------- * Swig_mark_arg() * * Marks an argument as being parsed. * ----------------------------------------------------------------------------- */ void Swig_mark_arg(int n) { assert(marked); assert((n >= 0) && (n < numargs)); marked[n] = 1; } /* ----------------------------------------------------------------------------- * Swig_check_marked() * * Checks to see if argument has been picked up. * ----------------------------------------------------------------------------- */ int Swig_check_marked(int n) { assert((n >= 0) && (n < numargs)); return marked[n]; } /* ----------------------------------------------------------------------------- * Swig_check_options() * * Checkers for unprocessed command line options and errors. * ----------------------------------------------------------------------------- */ void Swig_check_options(int check_input) { int error = 0; int i; int max = check_input ? numargs - 1 : numargs; assert(marked); for (i = 1; i < max; i++) { if (!marked[i]) { Printf(stderr, "swig error : Unrecognized option %s\n", args[i]); error = 1; } } if (error) { Printf(stderr, "Use 'swig -help' for available options.\n"); SWIG_exit(EXIT_FAILURE); } if (check_input && marked[numargs - 1]) { Printf(stderr, "Must specify an input file. Use -help for available options.\n"); SWIG_exit(EXIT_FAILURE); } } /* ----------------------------------------------------------------------------- * Swig_arg_error() * * Generates a generic error message and exits. * ----------------------------------------------------------------------------- */ void Swig_arg_error(void) { Printf(stderr, "SWIG : Unable to parse command line options.\n"); Printf(stderr, "Use 'swig -help' for available options.\n"); SWIG_exit(EXIT_FAILURE); } swig-4.0.1/Source/Swig/misc.c0000644000175000017500000012044013527063513015621 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * misc.c * * Miscellaneous functions that don't really fit anywhere else. * ----------------------------------------------------------------------------- */ #include "swig.h" #include #include #include #include #include #ifdef _WIN32 #include #ifndef S_ISDIR #define S_ISDIR(mode) (((mode) & S_IFDIR) == S_IFDIR) #endif #endif static char *fake_version = 0; /* ----------------------------------------------------------------------------- * Swig_copy_string() * * Duplicate a NULL-terminate string given as a char *. * ----------------------------------------------------------------------------- */ char *Swig_copy_string(const char *s) { char *c = 0; if (s) { c = (char *) malloc(strlen(s) + 1); strcpy(c, s); } return c; } /* ----------------------------------------------------------------------------- * Swig_set_fakeversion() * * Version string override * ----------------------------------------------------------------------------- */ void Swig_set_fakeversion(const char *version) { fake_version = Swig_copy_string(version); } /* ----------------------------------------------------------------------------- * Swig_package_version() * * Return the package string containing the version number * ----------------------------------------------------------------------------- */ const char *Swig_package_version(void) { return fake_version ? fake_version : PACKAGE_VERSION; } /* ----------------------------------------------------------------------------- * Swig_banner() * * Emits the SWIG identifying banner for the C/C++ wrapper file. * ----------------------------------------------------------------------------- */ void Swig_banner(File *f) { Printf(f, "/* ----------------------------------------------------------------------------\n\ * This file was automatically generated by SWIG (http://www.swig.org).\n\ * Version %s\n\ *\n\ * This file is not intended to be easily readable and contains a number of\n\ * coding conventions designed to improve portability and efficiency. Do not make\n\ * changes to this file unless you know what you are doing--modify the SWIG\n\ * interface file instead.\n", Swig_package_version()); /* String too long for ISO compliance */ Printf(f, " * ----------------------------------------------------------------------------- */\n"); } /* ----------------------------------------------------------------------------- * Swig_banner_target_lang() * * Emits a SWIG identifying banner in the target language * ----------------------------------------------------------------------------- */ void Swig_banner_target_lang(File *f, const_String_or_char_ptr commentchar) { Printf(f, "%s This file was automatically generated by SWIG (http://www.swig.org).\n", commentchar); Printf(f, "%s Version %s\n", commentchar, Swig_package_version()); Printf(f, "%s\n", commentchar); Printf(f, "%s Do not make changes to this file unless you know what you are doing--modify\n", commentchar); Printf(f, "%s the SWIG interface file instead.\n", commentchar); } /* ----------------------------------------------------------------------------- * Swig_strip_c_comments() * * Return a new string with C comments stripped from the input string. NULL is * returned if there aren't any comments. * ----------------------------------------------------------------------------- */ String *Swig_strip_c_comments(const String *s) { const char *c = Char(s); const char *comment_begin = 0; const char *comment_end = 0; String *stripped = 0; while (*c) { if (!comment_begin && *c == '/') { ++c; if (!*c) break; if (*c == '*') comment_begin = c-1; } else if (comment_begin && !comment_end && *c == '*') { ++c; if (*c == '/') { comment_end = c; break; } } ++c; } if (comment_begin && comment_end) { int size = (int)(comment_begin - Char(s)); String *stripmore = 0; stripped = NewStringWithSize(s, size); Printv(stripped, comment_end + 1, NIL); do { stripmore = Swig_strip_c_comments(stripped); if (stripmore) { Delete(stripped); stripped = stripmore; } } while (stripmore); } return stripped; } /* ----------------------------------------------------------------------------- * is_directory() * ----------------------------------------------------------------------------- */ static int is_directory(String *directory) { int last = Len(directory) - 1; int statres; struct stat st; char *dir = Char(directory); if (dir[last] == SWIG_FILE_DELIMITER[0]) { /* remove trailing slash - can cause S_ISDIR to fail on Windows, at least */ dir[last] = 0; statres = stat(dir, &st); dir[last] = SWIG_FILE_DELIMITER[0]; } else { statres = stat(dir, &st); } return (statres == 0 && S_ISDIR(st.st_mode)); } /* ----------------------------------------------------------------------------- * Swig_new_subdirectory() * * Create the subdirectory only if the basedirectory already exists as a directory. * basedirectory can be empty to indicate current directory but not NULL. * ----------------------------------------------------------------------------- */ String *Swig_new_subdirectory(String *basedirectory, String *subdirectory) { String *error = 0; int current_directory = Len(basedirectory) == 0; if (current_directory || is_directory(basedirectory)) { Iterator it; String *dir = NewString(basedirectory); List *subdirs = Split(subdirectory, SWIG_FILE_DELIMITER[0], INT_MAX); for (it = First(subdirs); it.item; it = Next(it)) { int result; String *subdirectory = it.item; Printf(dir, "%s", subdirectory); #ifdef _WIN32 result = _mkdir(Char(dir)); #else result = mkdir(Char(dir), 0777); #endif if (result != 0 && errno != EEXIST) { error = NewStringf("Cannot create directory %s: %s", dir, strerror(errno)); break; } if (!is_directory(dir)) { error = NewStringf("Cannot create directory %s: it may already exist but not be a directory", dir); break; } Printf(dir, SWIG_FILE_DELIMITER); } } else { error = NewStringf("Cannot create subdirectory %s under the base directory %s. Either the base does not exist as a directory or it is not readable.", subdirectory, basedirectory); } return error; } /* ----------------------------------------------------------------------------- * Swig_filename_correct() * * Corrects filename paths by removing duplicate delimiters and on non-unix * systems use the correct delimiter across the whole name. * ----------------------------------------------------------------------------- */ void Swig_filename_correct(String *filename) { int network_path = 0; if (Len(filename) >= 2) { const char *fname = Char(filename); if (fname[0] == '\\' && fname[1] == '\\') network_path = 1; if (fname[0] == '/' && fname[1] == '/') network_path = 1; } #if defined(_WIN32) || defined(MACSWIG) /* accept Unix path separator on non-Unix systems */ Replaceall(filename, "/", SWIG_FILE_DELIMITER); #endif #if defined(__CYGWIN__) /* accept Windows path separator in addition to Unix path separator */ Replaceall(filename, "\\", SWIG_FILE_DELIMITER); #endif /* remove all duplicate file name delimiters */ while (Replaceall(filename, SWIG_FILE_DELIMITER SWIG_FILE_DELIMITER, SWIG_FILE_DELIMITER)) { } /* Network paths can start with a double slash on Windows - unremove the duplicate slash we just removed */ if (network_path) Insert(filename, 0, SWIG_FILE_DELIMITER); } /* ----------------------------------------------------------------------------- * Swig_filename_escape() * * Escapes backslashes in filename - for Windows * ----------------------------------------------------------------------------- */ String *Swig_filename_escape(String *filename) { String *adjusted_filename = Copy(filename); Swig_filename_correct(adjusted_filename); #if defined(_WIN32) /* Note not on Cygwin else filename is displayed with double '/' */ Replaceall(adjusted_filename, "\\", "\\\\"); #endif return adjusted_filename; } /* ----------------------------------------------------------------------------- * Swig_filename_unescape() * * Remove double backslash escaping in filename - for Windows * ----------------------------------------------------------------------------- */ void Swig_filename_unescape(String *filename) { (void)filename; #if defined(_WIN32) Replaceall(filename, "\\\\", "\\"); #endif } /* ----------------------------------------------------------------------------- * Swig_storage_isextern() * * Determine if the storage class specifier is extern (but not externc) * ----------------------------------------------------------------------------- */ int Swig_storage_isextern(Node *n) { const String *storage = Getattr(n, "storage"); return storage ? Strcmp(storage, "extern") == 0 || Strncmp(storage, "extern ", 7) == 0 : 0; } /* ----------------------------------------------------------------------------- * Swig_storage_isexternc() * * Determine if the storage class specifier is externc (but not plain extern) * ----------------------------------------------------------------------------- */ int Swig_storage_isexternc(Node *n) { const String *storage = Getattr(n, "storage"); return storage ? Strcmp(storage, "externc") == 0 || Strncmp(storage, "externc ", 8) == 0 : 0; } /* ----------------------------------------------------------------------------- * Swig_storage_isstatic_custom() * * Determine if the storage class specifier is static * ----------------------------------------------------------------------------- */ int Swig_storage_isstatic_custom(Node *n, const_String_or_char_ptr storage_name) { const String *storage = Getattr(n, storage_name); return storage ? Strncmp(storage, "static", 6) == 0 : 0; } /* ----------------------------------------------------------------------------- * Swig_storage_isstatic() * * Determine if the storage class specifier is static * ----------------------------------------------------------------------------- */ int Swig_storage_isstatic(Node *n) { return Swig_storage_isstatic_custom(n, "storage"); } /* ----------------------------------------------------------------------------- * Swig_string_escape() * * Takes a string object and produces a string with escape codes added to it. * Octal escaping is used. * ----------------------------------------------------------------------------- */ String *Swig_string_escape(String *s) { String *ns; int c; ns = NewStringEmpty(); while ((c = Getc(s)) != EOF) { if (c == '\n') { Printf(ns, "\\n"); } else if (c == '\r') { Printf(ns, "\\r"); } else if (c == '\t') { Printf(ns, "\\t"); } else if (c == '\\') { Printf(ns, "\\\\"); } else if (c == '\'') { Printf(ns, "\\'"); } else if (c == '\"') { Printf(ns, "\\\""); } else if (c == ' ') { Putc(c, ns); } else if (!isgraph(c)) { if (c < 0) c += UCHAR_MAX + 1; Printf(ns, "\\%o", c); } else { Putc(c, ns); } } return ns; } /* ----------------------------------------------------------------------------- * Swig_string_hexescape() * * Takes a string object and produces a string with escape codes added to it. * Hex escaping is used. * ----------------------------------------------------------------------------- */ String *Swig_string_hexescape(String *s) { String *ns; int c; ns = NewStringEmpty(); while ((c = Getc(s)) != EOF) { if (c == '\n') { Printf(ns, "\\n"); } else if (c == '\r') { Printf(ns, "\\r"); } else if (c == '\t') { Printf(ns, "\\t"); } else if (c == '\\') { Printf(ns, "\\\\"); } else if (c == '\'') { Printf(ns, "\\'"); } else if (c == '\"') { Printf(ns, "\\\""); } else if (c == ' ') { Putc(c, ns); } else if (!isgraph(c)) { if (c < 0) c += UCHAR_MAX + 1; Printf(ns, "\\x%X", c); } else { Putc(c, ns); } } return ns; } /* ----------------------------------------------------------------------------- * Swig_string_upper() * * Takes a string object and returns a copy that is uppercase * ----------------------------------------------------------------------------- */ String *Swig_string_upper(String *s) { String *ns; int c; ns = NewStringEmpty(); Seek(s, 0, SEEK_SET); while ((c = Getc(s)) != EOF) { Putc(toupper(c), ns); } return ns; } /* ----------------------------------------------------------------------------- * Swig_string_lower() * * Takes a string object and returns a copy that is lowercase * ----------------------------------------------------------------------------- */ String *Swig_string_lower(String *s) { String *ns; int c; ns = NewStringEmpty(); Seek(s, 0, SEEK_SET); while ((c = Getc(s)) != EOF) { Putc(tolower(c), ns); } return ns; } /* ----------------------------------------------------------------------------- * Swig_string_title() * * Takes a string object and returns a copy that is lowercase with first letter * capitalized * ----------------------------------------------------------------------------- */ String *Swig_string_title(String *s) { String *ns; int first = 1; int c; ns = NewStringEmpty(); Seek(s, 0, SEEK_SET); while ((c = Getc(s)) != EOF) { Putc(first ? toupper(c) : tolower(c), ns); first = 0; } return ns; } /* ----------------------------------------------------------------------------- * Swig_string_ccase() * * Takes a string object and returns a copy that is lowercase with the first * letter capitalized and the one following '_', which are removed. * * camel_case -> CamelCase * camelCase -> CamelCase * ----------------------------------------------------------------------------- */ String *Swig_string_ccase(String *s) { String *ns; int first = 1; int c; ns = NewStringEmpty(); Seek(s, 0, SEEK_SET); while ((c = Getc(s)) != EOF) { if (c == '_') { first = 1; continue; } Putc(first ? toupper(c) : c, ns); first = 0; } return ns; } /* ----------------------------------------------------------------------------- * Swig_string_lccase() * * Takes a string object and returns a copy with the character after * each '_' capitalised, and the '_' removed. The first character is * also forced to lowercase. * * camel_case -> camelCase * CamelCase -> camelCase * ----------------------------------------------------------------------------- */ String *Swig_string_lccase(String *s) { String *ns; int first = 1; int after_underscore = 0; int c; ns = NewStringEmpty(); Seek(s, 0, SEEK_SET); while ((c = Getc(s)) != EOF) { if (c == '_') { after_underscore = 1; continue; } if (first) { Putc(tolower(c), ns); first = 0; } else { Putc(after_underscore ? toupper(c) : c, ns); } after_underscore = 0; } return ns; } /* ----------------------------------------------------------------------------- * Swig_string_ucase() * * This is the reverse case of ccase, ie * * CamelCase -> camel_case * get2D -> get_2d * asFloat2 -> as_float2 * ----------------------------------------------------------------------------- */ String *Swig_string_ucase(String *s) { String *ns; int c; int lastC = 0; int nextC = 0; int underscore = 0; ns = NewStringEmpty(); /* We insert a underscore when: 1. Lower case char followed by upper case char getFoo > get_foo; getFOo > get_foo; GETFOO > getfoo 2. Number preceded by char and not end of string get2D > get_2d; get22D > get_22d; GET2D > get_2d but: asFloat2 > as_float2 */ Seek(s, 0, SEEK_SET); while ((c = Getc(s)) != EOF) { nextC = Getc(s); Ungetc(nextC, s); if (isdigit(c) && isalpha(lastC) && nextC != EOF) underscore = 1; else if (isupper(c) && isalpha(lastC) && !isupper(lastC)) underscore = 1; lastC = c; if (underscore) { Putc('_', ns); underscore = 0; } Putc(tolower(c), ns); } return ns; } /* ----------------------------------------------------------------------------- * Swig_string_first_upper() * * Make the first character in the string uppercase, leave all the * rest the same. This is used by the Ruby module to provide backwards * compatibility with the old way of naming classes and constants. For * more info see the Ruby documentation. * * firstUpper -> FirstUpper * ----------------------------------------------------------------------------- */ String *Swig_string_first_upper(String *s) { String *ns = NewStringEmpty(); char *cs = Char(s); if (cs && cs[0] != 0) { Putc(toupper((int)cs[0]), ns); Append(ns, cs + 1); } return ns; } /* ----------------------------------------------------------------------------- * Swig_string_first_lower() * * Make the first character in the string lowercase, leave all the * rest the same. This is used by the Ruby module to provide backwards * compatibility with the old way of naming classes and constants. For * more info see the Ruby documentation. * * firstLower -> FirstLower * ----------------------------------------------------------------------------- */ String *Swig_string_first_lower(String *s) { String *ns = NewStringEmpty(); char *cs = Char(s); if (cs && cs[0] != 0) { Putc(tolower((int)cs[0]), ns); Append(ns, cs + 1); } return ns; } /* ----------------------------------------------------------------------------- * Swig_string_schemify() * * Replace underscores with dashes, to make identifiers look nice to Schemers. * * under_scores -> under-scores * ----------------------------------------------------------------------------- */ String *Swig_string_schemify(String *s) { String *ns = NewString(s); Replaceall(ns, "_", "-"); return ns; } /* ----------------------------------------------------------------------------- * Swig_string_typecode() * * Takes a string with possible type-escapes in it and replaces them with * real C datatypes. * ----------------------------------------------------------------------------- */ String *Swig_string_typecode(String *s) { String *ns; int c; String *tc; ns = NewStringEmpty(); while ((c = Getc(s)) != EOF) { if (c == '`') { String *str = 0; tc = NewStringEmpty(); while ((c = Getc(s)) != EOF) { if (c == '`') break; Putc(c, tc); } str = SwigType_str(tc, 0); Append(ns, str); Delete(str); } else { Putc(c, ns); if (c == '\'') { while ((c = Getc(s)) != EOF) { Putc(c, ns); if (c == '\'') break; if (c == '\\') { c = Getc(s); Putc(c, ns); } } } else if (c == '\"') { while ((c = Getc(s)) != EOF) { Putc(c, ns); if (c == '\"') break; if (c == '\\') { c = Getc(s); Putc(c, ns); } } } } } return ns; } /* ----------------------------------------------------------------------------- * Swig_string_mangle() * * Take a string and mangle it by stripping all non-valid C identifier * characters. * * This routine skips unnecessary blank spaces, therefore mangling * 'char *' and 'char*', 'std::pair' and * 'std::pair', produce the same result. * * However, note that 'long long' and 'long_long' produce different * mangled strings. * * The mangling method still is not 'perfect', for example std::pair and * std_pair return the same mangling. This is just a little better * than before, but it seems to be enough for most of the purposes. * * Having a perfect mangling will break some examples and code which * assume, for example, that A::get_value will be mangled as * A_get_value. * ----------------------------------------------------------------------------- */ String *Swig_string_mangle(const String *s) { #if 0 /* old mangling, not suitable for using in macros */ String *t = Copy(s); char *c = Char(t); while (*c) { if (!isalnum(*c)) *c = '_'; c++; } return t; #else String *result = NewStringEmpty(); int space = 0; int state = 0; char *pc, *cb; String *b = Copy(s); if (SwigType_istemplate(b)) { String *st = Swig_symbol_template_deftype(b, 0); String *sq = Swig_symbol_type_qualify(st, 0); String *t = SwigType_namestr(sq); Delete(st); Delete(sq); Delete(b); b = t; } pc = cb = Char(b); while (*pc) { char c = *pc; if (isalnum((int) c) || (c == '_')) { state = 1; if (space && (space == state)) { Append(result, "_SS_"); } space = 0; Printf(result, "%c", (int) c); } else { if (isspace((int) c)) { space = state; ++pc; continue; } else { state = 3; space = 0; } switch (c) { case '.': if ((cb != pc) && (*(pc - 1) == 'p')) { Append(result, "_"); ++pc; continue; } else { c = 'f'; } break; case ':': if (*(pc + 1) == ':') { Append(result, "_"); ++pc; ++pc; continue; } break; case '*': c = 'm'; break; case '&': c = 'A'; break; case '<': c = 'l'; break; case '>': c = 'g'; break; case '=': c = 'e'; break; case ',': c = 'c'; break; case '(': c = 'p'; break; case ')': c = 'P'; break; case '[': c = 'b'; break; case ']': c = 'B'; break; case '^': c = 'x'; break; case '|': c = 'o'; break; case '~': c = 'n'; break; case '!': c = 'N'; break; case '%': c = 'M'; break; case '?': c = 'q'; break; case '+': c = 'a'; break; case '-': c = 's'; break; case '/': c = 'd'; break; default: break; } if (isalpha((int) c)) { Printf(result, "_S%c_", (int) c); } else { Printf(result, "_S%02X_", (int) c); } } ++pc; } Delete(b); return result; #endif } String *Swig_string_emangle(String *s) { return Swig_string_mangle(s); } /* ----------------------------------------------------------------------------- * Swig_scopename_split() * * Take a qualified name like "A::B::C" and splits off the last name. * In this case, returns "C" as last and "A::B" as prefix. * Always returns non NULL for last, but prefix may be NULL if there is no prefix. * ----------------------------------------------------------------------------- */ void Swig_scopename_split(const String *s, String **rprefix, String **rlast) { char *tmp = Char(s); char *c = tmp; char *cc = c; char *co = 0; if (!strstr(c, "::")) { *rprefix = 0; *rlast = Copy(s); } co = strstr(cc, "operator "); if (co) { if (co == cc) { *rprefix = 0; *rlast = Copy(s); return; } else { *rprefix = NewStringWithSize(cc, (int)(co - cc - 2)); *rlast = NewString(co); return; } } while (*c) { if ((*c == ':') && (*(c + 1) == ':')) { cc = c; c += 2; } else { if (*c == '<') { int level = 1; c++; while (*c && level) { if (*c == '<') level++; if (*c == '>') level--; c++; } } else { c++; } } } if (cc != tmp) { *rprefix = NewStringWithSize(tmp, (int)(cc - tmp)); *rlast = NewString(cc + 2); return; } else { *rprefix = 0; *rlast = Copy(s); } } /* ----------------------------------------------------------------------------- * Swig_scopename_prefix() * * Take a qualified name like "A::B::C" and return the scope name. * In this case, "A::B". Returns NULL if there is no base. * ----------------------------------------------------------------------------- */ String *Swig_scopename_prefix(const String *s) { char *tmp = Char(s); char *c = tmp; char *cc = c; char *co = 0; if (!strstr(c, "::")) return 0; co = strstr(cc, "operator "); if (co) { if (co == cc) { return 0; } else { String *prefix = NewStringWithSize(cc, (int)(co - cc - 2)); return prefix; } } while (*c) { if ((*c == ':') && (*(c + 1) == ':')) { cc = c; c += 2; } else { if (*c == '<') { int level = 1; c++; while (*c && level) { if (*c == '<') level++; if (*c == '>') level--; c++; } } else { c++; } } } if (cc != tmp) { return NewStringWithSize(tmp, (int)(cc - tmp)); } else { return 0; } } /* ----------------------------------------------------------------------------- * Swig_scopename_last() * * Take a qualified name like "A::B::C" and returns the last. In this * case, "C". * ----------------------------------------------------------------------------- */ String *Swig_scopename_last(const String *s) { char *tmp = Char(s); char *c = tmp; char *cc = c; char *co = 0; if (!strstr(c, "::")) return NewString(s); co = strstr(cc, "operator "); if (co) { return NewString(co); } while (*c) { if ((*c == ':') && (*(c + 1) == ':')) { c += 2; cc = c; } else { if (*c == '<') { int level = 1; c++; while (*c && level) { if (*c == '<') level++; if (*c == '>') level--; c++; } } else { c++; } } } return NewString(cc); } /* ----------------------------------------------------------------------------- * Swig_scopename_first() * * Take a qualified name like "A::B::C" and returns the first scope name. * In this case, "A". Returns NULL if there is no base. * ----------------------------------------------------------------------------- */ String *Swig_scopename_first(const String *s) { char *tmp = Char(s); char *c = tmp; char *co = 0; if (!strstr(c, "::")) return 0; co = strstr(c, "operator "); if (co) { if (co == c) { return 0; } } else { co = c + Len(s); } while (*c && (c != co)) { if ((*c == ':') && (*(c + 1) == ':')) { break; } else { if (*c == '<') { int level = 1; c++; while (*c && level) { if (*c == '<') level++; if (*c == '>') level--; c++; } } else { c++; } } } if (*c && (c != tmp)) { return NewStringWithSize(tmp, (int)(c - tmp)); } else { return 0; } } /* ----------------------------------------------------------------------------- * Swig_scopename_suffix() * * Take a qualified name like "A::B::C" and returns the suffix. * In this case, "B::C". Returns NULL if there is no suffix. * ----------------------------------------------------------------------------- */ String *Swig_scopename_suffix(const String *s) { char *tmp = Char(s); char *c = tmp; char *co = 0; if (!strstr(c, "::")) return 0; co = strstr(c, "operator "); if (co) { if (co == c) return 0; } while (*c) { if ((*c == ':') && (*(c + 1) == ':')) { break; } else { if (*c == '<') { int level = 1; c++; while (*c && level) { if (*c == '<') level++; if (*c == '>') level--; c++; } } else { c++; } } } if (*c && (c != tmp)) { return NewString(c + 2); } else { return 0; } } /* ----------------------------------------------------------------------------- * Swig_scopename_tolist() * * Take a qualified scope name like "A::B::C" and convert it to a list. * In this case, return a list of 3 elements "A", "B", "C". * Returns an empty list if the input is empty. * ----------------------------------------------------------------------------- */ List *Swig_scopename_tolist(const String *s) { List *scopes = NewList(); String *name = Len(s) == 0 ? 0 : NewString(s); while (name) { String *last = 0; String *prefix = 0; Swig_scopename_split(name, &prefix, &last); Insert(scopes, 0, last); Delete(last); Delete(name); name = prefix; } Delete(name); return scopes; } /* ----------------------------------------------------------------------------- * Swig_scopename_check() * * Checks to see if a name is qualified with a scope name, examples: * foo -> 0 * ::foo -> 1 * foo::bar -> 1 * foo< ::bar > -> 0 * ----------------------------------------------------------------------------- */ int Swig_scopename_check(const String *s) { char *c = Char(s); char *co = strstr(c, "operator "); if (co) { if (co == c) return 0; } if (!strstr(c, "::")) return 0; while (*c) { if ((*c == ':') && (*(c + 1) == ':')) { return 1; } else { if (*c == '<') { int level = 1; c++; while (*c && level) { if (*c == '<') level++; if (*c == '>') level--; c++; } } else { c++; } } } return 0; } /* ----------------------------------------------------------------------------- * Swig_string_command() * * Executes a external command via popen with the string as a command * line parameter. For example: * * Printf(stderr,"%(command:sed 's/[a-z]/\U\\1/' <<<)s","hello") -> Hello * ----------------------------------------------------------------------------- */ #if defined(_MSC_VER) # define popen _popen # define pclose _pclose # if !defined(HAVE_POPEN) # define HAVE_POPEN 1 # endif #else # if !defined(_WIN32) /* These Posix functions are not ISO C and so are not always defined in stdio.h */ extern FILE *popen(const char *command, const char *type); extern int pclose(FILE *stream); # endif #endif String *Swig_string_command(String *s) { String *res = NewStringEmpty(); #if defined(HAVE_POPEN) if (Len(s)) { char *command = Char(s); FILE *fp = popen(command, "r"); if (fp) { char buffer[1025]; while (fscanf(fp, "%1024s", buffer) != EOF) { Append(res, buffer); } pclose(fp); } else { Swig_error("SWIG", Getline(s), "Command encoder fails attempting '%s'.\n", s); SWIG_exit(EXIT_FAILURE); } } #endif return res; } /* ----------------------------------------------------------------------------- * Swig_string_strip() * * Strip given prefix from identifiers * * Printf(stderr,"%(strip:[wx])s","wxHello") -> Hello * ----------------------------------------------------------------------------- */ String *Swig_string_strip(String *s) { String *ns; if (!Len(s)) { ns = NewString(s); } else { const char *cs = Char(s); const char *ce = Strchr(cs, ']'); if (*cs != '[' || !ce) { ns = NewString(s); } else { String *fmt = NewStringf("%%.%ds", ce-cs-1); String *prefix = NewStringf(fmt, cs+1); if (0 == Strncmp(ce+1, prefix, Len(prefix))) { ns = NewString(ce+1+Len(prefix)); } else { ns = NewString(ce+1); } } } return ns; } /* ----------------------------------------------------------------------------- * Swig_string_rstrip() * * Strip given suffix from identifiers * * Printf(stderr,"%(rstrip:[Cls])s","HelloCls") -> Hello * ----------------------------------------------------------------------------- */ String *Swig_string_rstrip(String *s) { String *ns; int len = Len(s); if (!len) { ns = NewString(s); } else { const char *cs = Char(s); const char *ce = Strchr(cs, ']'); if (*cs != '[' || !ce) { ns = NewString(s); } else { String *fmt = NewStringf("%%.%ds", ce-cs-1); String *suffix = NewStringf(fmt, cs+1); int suffix_len = Len(suffix); if (0 == Strncmp(cs+len-suffix_len, suffix, suffix_len)) { int copy_len = len-suffix_len-(int)(ce+1-cs); ns = NewStringWithSize(ce+1, copy_len); } else { ns = NewString(ce+1); } } } return ns; } /* ----------------------------------------------------------------------------- * Swig_offset_string() * * Insert number tabs before each new line in s * ----------------------------------------------------------------------------- */ void Swig_offset_string(String *s, int number) { char *res, *p, *end, *start; /* count a number of lines in s */ int lines = 1; int len = Len(s); if (len == 0) return; start = strchr(Char(s), '\n'); while (start) { ++lines; start = strchr(start + 1, '\n'); } /* do not count pending new line */ if ((Char(s))[len-1] == '\n') --lines; /* allocate a temporary storage for a padded string */ res = (char*)malloc(len + lines * number * 2 + 1); res[len + lines * number * 2] = 0; /* copy lines to res, prepending tabs to each line */ p = res; /* output pointer */ start = Char(s); /* start of a current line */ end = strchr(start, '\n'); /* end of a current line */ while (end) { memset(p, ' ', number*2); p += number*2; memcpy(p, start, end - start + 1); p += end - start + 1; start = end + 1; end = strchr(start, '\n'); } /* process the last line */ if (*start) { memset(p, ' ', number*2); p += number*2; strcpy(p, start); } /* replace 's' contents with 'res' */ Clear(s); Append(s, res); free(res); } #ifdef HAVE_PCRE #include static int split_regex_pattern_subst(String *s, String **pattern, String **subst, const char **input) { const char *pats, *pate; const char *subs, *sube; /* Locate the search pattern */ const char *p = Char(s); if (*p++ != '/') goto err_out; pats = p; p = strchr(p, '/'); if (!p) goto err_out; pate = p; /* Locate the substitution string */ subs = ++p; p = strchr(p, '/'); if (!p) goto err_out; sube = p; *pattern = NewStringWithSize(pats, (int)(pate - pats)); *subst = NewStringWithSize(subs, (int)(sube - subs)); *input = p + 1; return 1; err_out: Swig_error("SWIG", Getline(s), "Invalid regex substitution: '%s'.\n", s); SWIG_exit(EXIT_FAILURE); return 0; } /* This function copies len characters from src to dst, possibly applying case conversions to them: if convertCase is 1, to upper case and if it is -1, to lower * case. If convertNextOnly is 1, only a single character is converted (and convertCase is reset), otherwise all of them are. */ static void copy_with_maybe_case_conversion(String *dst, const char *src, int len, int *convertCase, int convertNextOnly) { /* Deal with the trivial cases first. */ if (!len) return; if (!*convertCase) { Write(dst, src, len); return; } /* If we must convert only the first character, do it and write the rest at once. */ if (convertNextOnly) { int src_char = *src; Putc(*convertCase == 1 ? toupper(src_char) : tolower(src_char), dst); *convertCase = 0; if (len > 1) { Write(dst, src + 1, len - 1); } } else { /* We need to convert all characters. */ int i; for (i = 0; i < len; i++, src++) { int src_char = *src; Putc(*convertCase == 1 ? toupper(src_char) : tolower(src_char), dst); } } } String *replace_captures(int num_captures, const char *input, String *subst, int captures[], String *pattern, String *s) { int convertCase = 0, convertNextOnly = 0; String *result = NewStringEmpty(); const char *p = Char(subst); while (*p) { /* Copy part without substitutions */ const char *q = strchr(p, '\\'); if (!q) { copy_with_maybe_case_conversion(result, p, (int)strlen(p), &convertCase, convertNextOnly); break; } copy_with_maybe_case_conversion(result, p, (int)(q - p), &convertCase, convertNextOnly); p = q + 1; /* Handle substitution */ if (*p == '\0') { Putc('\\', result); } else if (isdigit((unsigned char)*p)) { int group = *p++ - '0'; if (group < num_captures) { int l = captures[group*2], r = captures[group*2 + 1]; if (l != -1) { copy_with_maybe_case_conversion(result, input + l, r - l, &convertCase, convertNextOnly); } } else { Swig_error("SWIG", Getline(s), "PCRE capture replacement failed while matching \"%s\" using \"%s\" - request for group %d is greater than the number of captures %d.\n", Char(pattern), input, group, num_captures-1); } } else { /* Handle Perl-like case conversion escapes. */ switch (*p) { case 'u': convertCase = 1; convertNextOnly = 1; break; case 'U': convertCase = 1; convertNextOnly = 0; break; case 'l': convertCase = -1; convertNextOnly = 1; break; case 'L': convertCase = -1; convertNextOnly = 0; break; case 'E': convertCase = 0; break; default: Swig_error("SWIG", Getline(s), "Unrecognized escape character '%c' in the replacement string \"%s\".\n", *p, Char(subst)); } p++; } } return result; } /* ----------------------------------------------------------------------------- * Swig_string_regex() * * Executes a regular expression substitution. For example: * * Printf(stderr,"gsl%(regex:/GSL_(.*)_/\\1/)s", "GSL_Hello_") -> gslHello * ----------------------------------------------------------------------------- */ String *Swig_string_regex(String *s) { const int pcre_options = 0; String *res = 0; pcre *compiled_pat = 0; const char *pcre_error, *input; int pcre_errorpos; String *pattern = 0, *subst = 0; int captures[30]; if (split_regex_pattern_subst(s, &pattern, &subst, &input)) { int rc; compiled_pat = pcre_compile( Char(pattern), pcre_options, &pcre_error, &pcre_errorpos, NULL); if (!compiled_pat) { Swig_error("SWIG", Getline(s), "PCRE compilation failed: '%s' in '%s':%i.\n", pcre_error, Char(pattern), pcre_errorpos); SWIG_exit(EXIT_FAILURE); } rc = pcre_exec(compiled_pat, NULL, input, (int)strlen(input), 0, 0, captures, 30); if (rc >= 0) { res = replace_captures(rc, input, subst, captures, pattern, s); } else if (rc != PCRE_ERROR_NOMATCH) { Swig_error("SWIG", Getline(s), "PCRE execution failed: error %d while matching \"%s\" using \"%s\".\n", rc, Char(pattern), input); SWIG_exit(EXIT_FAILURE); } } DohDelete(pattern); DohDelete(subst); pcre_free(compiled_pat); return res ? res : NewStringEmpty(); } String *Swig_pcre_version(void) { return NewStringf("PCRE Version: %s", pcre_version()); } #else String *Swig_string_regex(String *s) { Swig_error("SWIG", Getline(s), "PCRE regex support not enabled in this SWIG build.\n"); SWIG_exit(EXIT_FAILURE); return 0; } String *Swig_pcre_version(void) { return NewStringf("PCRE not used"); } #endif /* ------------------------------------------------------------ * Swig_is_generated_overload() * Check if the function is an automatically generated * overload created because a method has default parameters. * ------------------------------------------------------------ */ int Swig_is_generated_overload(Node *n) { Node *base_method = Getattr(n, "sym:overloaded"); Node *default_args = Getattr(n, "defaultargs"); return ((base_method != NULL) && (default_args != NULL) && (base_method == default_args)); } /* ----------------------------------------------------------------------------- * Swig_init() * * Initialize the SWIG core * ----------------------------------------------------------------------------- */ void Swig_init() { /* Set some useful string encoding methods */ DohEncoding("escape", Swig_string_escape); DohEncoding("hexescape", Swig_string_hexescape); DohEncoding("upper", Swig_string_upper); DohEncoding("lower", Swig_string_lower); DohEncoding("title", Swig_string_title); DohEncoding("ctitle", Swig_string_ccase); DohEncoding("lctitle", Swig_string_lccase); DohEncoding("utitle", Swig_string_ucase); DohEncoding("typecode", Swig_string_typecode); DohEncoding("mangle", Swig_string_emangle); DohEncoding("command", Swig_string_command); DohEncoding("schemify", Swig_string_schemify); DohEncoding("strip", Swig_string_strip); DohEncoding("rstrip", Swig_string_rstrip); DohEncoding("regex", Swig_string_regex); /* aliases for the case encoders */ DohEncoding("uppercase", Swig_string_upper); DohEncoding("lowercase", Swig_string_lower); DohEncoding("camelcase", Swig_string_ccase); DohEncoding("lowercamelcase", Swig_string_lccase); DohEncoding("undercase", Swig_string_ucase); DohEncoding("firstuppercase", Swig_string_first_upper); DohEncoding("firstlowercase", Swig_string_first_lower); /* Initialize typemaps */ Swig_typemap_init(); /* Initialize symbol table */ Swig_symbol_init(); /* Initialize type system */ SwigType_typesystem_init(); /* Initialize template system */ SwigType_template_init(); } swig-4.0.1/Source/Swig/swig.h0000644000175000017500000005222713527063513015653 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * swig.h * * Header file for the SWIG core. * ----------------------------------------------------------------------------- */ #ifndef SWIGCORE_H_ #define SWIGCORE_H_ #ifndef MACSWIG #include "swigconfig.h" #endif #include #include #include #include #ifdef __cplusplus extern "C" { #endif #include "doh.h" /* Status codes */ #define SWIG_OK 1 #define SWIG_ERROR 0 #define SWIG_NOWRAP 0 /* Global macros */ #define NSPACE_SEPARATOR "." /* Namespace separator for the nspace feature - this should be changed to a target language configurable variable */ #define NSPACE_TODO 0 /* Languages that still need to implement and test the nspace feature use this */ /* Short names for common data types */ typedef DOH String; typedef DOH Hash; typedef DOH List; typedef DOH String_or_char; typedef DOH File; typedef DOH Parm; typedef DOH ParmList; typedef DOH Node; typedef DOH Symtab; typedef DOH Typetab; typedef DOH SwigType; /* --- Legacy DataType interface. These type codes are provided solely for backwards compatibility with older modules --- */ /* --- The ordering of type values is used to determine type-promotion in the parser. Do not change */ /* Numeric types */ #define T_BOOL 1 #define T_SCHAR 2 #define T_UCHAR 3 #define T_SHORT 4 #define T_USHORT 5 #define T_ENUM 6 #define T_INT 7 #define T_UINT 8 #define T_LONG 9 #define T_ULONG 10 #define T_LONGLONG 11 #define T_ULONGLONG 12 #define T_FLOAT 20 #define T_DOUBLE 21 #define T_LONGDOUBLE 22 #define T_FLTCPLX 23 #define T_DBLCPLX 24 #define T_NUMERIC 25 #define T_AUTO 26 #define T_COMPLEX T_DBLCPLX /* non-numeric */ #define T_CHAR 29 #define T_WCHAR 30 #define T_USER 31 #define T_VOID 32 #define T_STRING 33 #define T_POINTER 34 #define T_REFERENCE 35 #define T_ARRAY 36 #define T_FUNCTION 37 #define T_MPOINTER 38 #define T_VARARGS 39 #define T_RVALUE_REFERENCE 40 #define T_WSTRING 41 #define T_SYMBOL 98 #define T_ERROR 99 /* --- File interface --- */ #include "swigfile.h" /* --- Command line parsing --- */ #include "swigopt.h" /* --- Scanner Interface --- */ #include "swigscan.h" /* --- Functions for manipulating the string-based type encoding --- */ extern SwigType *NewSwigType(int typecode); extern SwigType *SwigType_del_element(SwigType *t); extern SwigType *SwigType_add_pointer(SwigType *t); extern SwigType *SwigType_add_memberpointer(SwigType *t, const_String_or_char_ptr qual); extern SwigType *SwigType_del_memberpointer(SwigType *t); extern SwigType *SwigType_del_pointer(SwigType *t); extern SwigType *SwigType_add_array(SwigType *t, const_String_or_char_ptr size); extern SwigType *SwigType_del_array(SwigType *t); extern SwigType *SwigType_pop_arrays(SwigType *t); extern SwigType *SwigType_add_reference(SwigType *t); extern SwigType *SwigType_del_reference(SwigType *t); extern SwigType *SwigType_add_rvalue_reference(SwigType *t); extern SwigType *SwigType_del_rvalue_reference(SwigType *t); extern SwigType *SwigType_add_qualifier(SwigType *t, const_String_or_char_ptr qual); extern SwigType *SwigType_del_qualifier(SwigType *t); extern SwigType *SwigType_add_function(SwigType *t, ParmList *parms); extern SwigType *SwigType_add_template(SwigType *t, ParmList *parms); extern SwigType *SwigType_pop_function(SwigType *t); extern SwigType *SwigType_pop_function_qualifiers(SwigType *t); extern ParmList *SwigType_function_parms(const SwigType *t, Node *file_line_node); extern List *SwigType_split(const SwigType *t); extern String *SwigType_pop(SwigType *t); extern void SwigType_push(SwigType *t, String *s); extern List *SwigType_parmlist(const SwigType *p); extern String *SwigType_parm(const SwigType *p); extern String *SwigType_str(const SwigType *s, const_String_or_char_ptr id); extern String *SwigType_lstr(const SwigType *s, const_String_or_char_ptr id); extern String *SwigType_rcaststr(const SwigType *s, const_String_or_char_ptr id); extern String *SwigType_lcaststr(const SwigType *s, const_String_or_char_ptr id); extern String *SwigType_manglestr(const SwigType *t); extern SwigType *SwigType_ltype(const SwigType *t); extern int SwigType_ispointer(const SwigType *t); extern int SwigType_ispointer_return(const SwigType *t); extern int SwigType_isfunctionpointer(const SwigType *t); extern int SwigType_ismemberpointer(const SwigType *t); extern int SwigType_isreference(const SwigType *t); extern int SwigType_isreference_return(const SwigType *t); extern int SwigType_isrvalue_reference(const SwigType *t); extern int SwigType_isarray(const SwigType *t); extern int SwigType_prefix_is_simple_1D_array(const SwigType *t); extern int SwigType_isfunction(const SwigType *t); extern int SwigType_isqualifier(const SwigType *t); extern int SwigType_isconst(const SwigType *t); extern int SwigType_issimple(const SwigType *t); extern int SwigType_ismutable(const SwigType *t); extern int SwigType_isvarargs(const SwigType *t); extern int SwigType_istemplate(const SwigType *t); extern int SwigType_isenum(const SwigType *t); extern int SwigType_check_decl(const SwigType *t, const_String_or_char_ptr decl); extern SwigType *SwigType_strip_qualifiers(const SwigType *t); extern SwigType *SwigType_strip_single_qualifier(const SwigType *t); extern SwigType *SwigType_functionpointer_decompose(SwigType *t); extern String *SwigType_base(const SwigType *t); extern String *SwigType_namestr(const SwigType *t); extern String *SwigType_templateprefix(const SwigType *t); extern String *SwigType_templatesuffix(const SwigType *t); extern String *SwigType_istemplate_templateprefix(const SwigType *t); extern String *SwigType_istemplate_only_templateprefix(const SwigType *t); extern String *SwigType_templateargs(const SwigType *t); extern String *SwigType_prefix(const SwigType *t); extern int SwigType_array_ndim(const SwigType *t); extern String *SwigType_array_getdim(const SwigType *t, int n); extern void SwigType_array_setdim(SwigType *t, int n, const_String_or_char_ptr rep); extern SwigType *SwigType_array_type(const SwigType *t); extern SwigType *SwigType_default_create(const SwigType *ty); extern SwigType *SwigType_default_deduce(const SwigType *t); extern void SwigType_typename_replace(SwigType *t, String *pat, String *rep); extern SwigType *SwigType_remove_global_scope_prefix(const SwigType *t); extern SwigType *SwigType_alttype(const SwigType *t, int ltmap); /* --- Type-system management --- */ extern void SwigType_typesystem_init(void); extern int SwigType_typedef(const SwigType *type, const_String_or_char_ptr name); extern int SwigType_typedef_class(const_String_or_char_ptr name); extern int SwigType_typedef_using(const_String_or_char_ptr qname); extern void SwigType_inherit(String *subclass, String *baseclass, String *cast, String *conversioncode); extern int SwigType_issubtype(const SwigType *subtype, const SwigType *basetype); extern void SwigType_scope_alias(String *aliasname, Typetab *t); extern void SwigType_using_scope(Typetab *t); extern void SwigType_new_scope(const_String_or_char_ptr name); extern void SwigType_inherit_scope(Typetab *scope); extern Typetab *SwigType_pop_scope(void); extern Typetab *SwigType_set_scope(Typetab *h); extern void SwigType_print_scope(void); extern SwigType *SwigType_typedef_resolve(const SwigType *t); extern SwigType *SwigType_typedef_resolve_all(const SwigType *t); extern SwigType *SwigType_typedef_qualified(const SwigType *t); extern int SwigType_istypedef(const SwigType *t); extern int SwigType_isclass(const SwigType *t); extern void SwigType_attach_symtab(Symtab *syms); extern void SwigType_remember(const SwigType *t); extern void SwigType_remember_clientdata(const SwigType *t, const_String_or_char_ptr clientdata); extern void SwigType_remember_mangleddata(String *mangled, const_String_or_char_ptr clientdata); extern void (*SwigType_remember_trace(void (*tf) (const SwigType *, String *, String *))) (const SwigType *, String *, String *); extern void SwigType_emit_type_table(File *f_headers, File *f_table); extern int SwigType_type(const SwigType *t); /* --- Symbol table module --- */ extern void Swig_symbol_print_tables(Symtab *symtab); extern void Swig_symbol_print_tables_summary(void); extern void Swig_symbol_print_symbols(void); extern void Swig_symbol_print_csymbols(void); extern void Swig_symbol_init(void); extern void Swig_symbol_setscopename(const_String_or_char_ptr name); extern String *Swig_symbol_getscopename(void); extern String *Swig_symbol_qualifiedscopename(Symtab *symtab); extern String *Swig_symbol_qualified_language_scopename(Symtab *symtab); extern Symtab *Swig_symbol_newscope(void); extern Symtab *Swig_symbol_setscope(Symtab *); extern Symtab *Swig_symbol_getscope(const_String_or_char_ptr symname); extern Symtab *Swig_symbol_global_scope(void); extern Symtab *Swig_symbol_current(void); extern Symtab *Swig_symbol_popscope(void); extern Node *Swig_symbol_add(const_String_or_char_ptr symname, Node *node); extern void Swig_symbol_cadd(const_String_or_char_ptr symname, Node *node); extern Node *Swig_symbol_clookup(const_String_or_char_ptr symname, Symtab *tab); extern Node *Swig_symbol_clookup_check(const_String_or_char_ptr symname, Symtab *tab, int (*check) (Node *)); extern Node *Swig_symbol_clookup_no_inherit(const_String_or_char_ptr name, Symtab *n); extern Symtab *Swig_symbol_cscope(const_String_or_char_ptr symname, Symtab *tab); extern Node *Swig_symbol_clookup_local(const_String_or_char_ptr symname, Symtab *tab); extern Node *Swig_symbol_clookup_local_check(const_String_or_char_ptr symname, Symtab *tab, int (*check) (Node *)); extern String *Swig_symbol_qualified(Node *node); extern Node *Swig_symbol_isoverloaded(Node *node); extern void Swig_symbol_remove(Node *node); extern void Swig_symbol_alias(const_String_or_char_ptr aliasname, Symtab *tab); extern void Swig_symbol_inherit(Symtab *tab); extern SwigType *Swig_symbol_type_qualify(const SwigType *ty, Symtab *tab); extern String *Swig_symbol_string_qualify(String *s, Symtab *tab); extern SwigType *Swig_symbol_typedef_reduce(const SwigType *ty, Symtab *tab); extern ParmList *Swig_symbol_template_defargs(Parm *parms, Parm *targs, Symtab *tscope, Symtab *tsdecl); extern SwigType *Swig_symbol_template_deftype(const SwigType *type, Symtab *tscope); extern SwigType *Swig_symbol_template_param_eval(const SwigType *p, Symtab *symtab); /* --- Parameters and Parameter Lists --- */ #include "swigparm.h" extern String *ParmList_errorstr(ParmList *); extern int ParmList_is_compactdefargs(ParmList *p); /* --- Parse tree support --- */ #include "swigtree.h" /* -- Wrapper function Object */ #include "swigwrap.h" /* --- Naming functions --- */ extern void Swig_name_register(const_String_or_char_ptr method, const_String_or_char_ptr format); extern void Swig_name_unregister(const_String_or_char_ptr method); extern String *Swig_name_mangle(const_String_or_char_ptr s); extern String *Swig_name_wrapper(const_String_or_char_ptr fname); extern String *Swig_name_member(const_String_or_char_ptr nspace, const_String_or_char_ptr classname, const_String_or_char_ptr membername); extern String *Swig_name_get(const_String_or_char_ptr nspace, const_String_or_char_ptr vname); extern String *Swig_name_set(const_String_or_char_ptr nspace, const_String_or_char_ptr vname); extern String *Swig_name_construct(const_String_or_char_ptr nspace, const_String_or_char_ptr classname); extern String *Swig_name_copyconstructor(const_String_or_char_ptr nspace, const_String_or_char_ptr classname); extern String *Swig_name_destroy(const_String_or_char_ptr nspace, const_String_or_char_ptr classname); extern String *Swig_name_disown(const_String_or_char_ptr nspace, const_String_or_char_ptr classname); extern void Swig_naming_init(void); extern void Swig_name_namewarn_add(String *prefix, String *name, SwigType *decl, Hash *namewrn); extern void Swig_name_rename_add(String *prefix, String *name, SwigType *decl, Hash *namewrn, ParmList *declaratorparms); extern void Swig_name_inherit(String *base, String *derived); extern List *Swig_make_inherit_list(String *clsname, List *names, String *Namespaceprefix); extern void Swig_inherit_base_symbols(List *bases); extern int Swig_need_protected(Node *n); extern int Swig_need_redefined_warn(Node *a, Node *b, int InClass); extern String *Swig_name_make(Node *n, String *prefix, const_String_or_char_ptr cname, SwigType *decl, String *oldname); extern String *Swig_name_warning(Node *n, String *prefix, String *name, SwigType *decl); extern String *Swig_name_str(Node *n); extern String *Swig_name_decl(Node *n); extern String *Swig_name_fulldecl(Node *n); /* --- parameterized rename functions --- */ extern void Swig_name_object_set(Hash *namehash, String *name, SwigType *decl, DOH *object); extern DOH *Swig_name_object_get(Hash *namehash, String *prefix, String *name, SwigType *decl); extern void Swig_name_object_inherit(Hash *namehash, String *base, String *derived); extern void Swig_features_get(Hash *features, String *prefix, String *name, SwigType *decl, Node *n); extern void Swig_feature_set(Hash *features, const_String_or_char_ptr name, SwigType *decl, const_String_or_char_ptr featurename, const_String_or_char_ptr value, Hash *featureattribs); /* --- Misc --- */ extern char *Swig_copy_string(const char *c); extern void Swig_set_fakeversion(const char *version); extern const char *Swig_package_version(void); extern void Swig_banner(File *f); extern void Swig_banner_target_lang(File *f, const_String_or_char_ptr commentchar); extern String *Swig_strip_c_comments(const String *s); extern String *Swig_new_subdirectory(String *basedirectory, String *subdirectory); extern void Swig_filename_correct(String *filename); extern String *Swig_filename_escape(String *filename); extern void Swig_filename_unescape(String *filename); extern int Swig_storage_isextern(Node *n); extern int Swig_storage_isexternc(Node *n); extern int Swig_storage_isstatic_custom(Node *n, const_String_or_char_ptr storage); extern int Swig_storage_isstatic(Node *n); extern String *Swig_string_escape(String *s); extern String *Swig_string_mangle(const String *s); extern void Swig_scopename_split(const String *s, String **prefix, String **last); extern String *Swig_scopename_prefix(const String *s); extern String *Swig_scopename_last(const String *s); extern String *Swig_scopename_first(const String *s); extern String *Swig_scopename_suffix(const String *s); extern List *Swig_scopename_tolist(const String *s); extern int Swig_scopename_check(const String *s); extern String *Swig_string_lower(String *s); extern String *Swig_string_upper(String *s); extern String *Swig_string_title(String *s); extern void Swig_offset_string(String *s, int number); extern String *Swig_pcre_version(void); extern void Swig_init(void); extern int Swig_value_wrapper_mode(int mode); extern int Swig_is_generated_overload(Node *n); typedef enum { EMF_STANDARD, EMF_MICROSOFT } ErrorMessageFormat; extern void Swig_warning(int num, const_String_or_char_ptr filename, int line, const char *fmt, ...); extern void Swig_error(const_String_or_char_ptr filename, int line, const char *fmt, ...); extern int Swig_error_count(void); extern void Swig_error_silent(int s); extern void Swig_warnfilter(const_String_or_char_ptr wlist, int val); extern void Swig_warnall(void); extern int Swig_warn_count(void); extern void Swig_error_msg_format(ErrorMessageFormat format); extern void Swig_diagnostic(const_String_or_char_ptr filename, int line, const char *fmt, ...); extern String *Swig_stringify_with_location(DOH *object); /* --- C Wrappers --- */ extern void Swig_cresult_name_set(const char *new_name); extern const char *Swig_cresult_name(void); extern String *Swig_cparm_name(Parm *p, int i); extern String *Swig_wrapped_var_type(SwigType *t, int varcref); extern int Swig_cargs(Wrapper *w, ParmList *l); extern String *Swig_cresult(SwigType *t, const_String_or_char_ptr name, const_String_or_char_ptr decl); extern String *Swig_cfunction_call(const_String_or_char_ptr name, ParmList *parms); extern String *Swig_cconstructor_call(const_String_or_char_ptr name); extern String *Swig_cppconstructor_call(const_String_or_char_ptr name, ParmList *parms); extern String *Swig_unref_call(Node *n); extern String *Swig_ref_call(Node *n, const String *lname); extern String *Swig_cdestructor_call(Node *n); extern String *Swig_cppdestructor_call(Node *n); extern String *Swig_cmemberset_call(const_String_or_char_ptr name, SwigType *type, String *self, int varcref); extern String *Swig_cmemberget_call(const_String_or_char_ptr name, SwigType *t, String *self, int varcref); extern int Swig_add_extension_code(Node *n, const String *function_name, ParmList *parms, SwigType *return_type, const String *code, int cplusplus, const String *self); extern void Swig_replace_special_variables(Node *n, Node *parentnode, String *code); /* --- Transformations --- */ extern int Swig_MethodToFunction(Node *n, const_String_or_char_ptr nspace, String *classname, int flags, SwigType *director_type, int is_director); extern int Swig_ConstructorToFunction(Node *n, const_String_or_char_ptr nspace, String *classname, String *none_comparison, String *director_ctor, int cplus, int flags, String *directorname); extern int Swig_DestructorToFunction(Node *n, const_String_or_char_ptr nspace, String *classname, int cplus, int flags); extern int Swig_MembersetToFunction(Node *n, String *classname, int flags); extern int Swig_MembergetToFunction(Node *n, String *classname, int flags); extern int Swig_VargetToFunction(Node *n, int flags); extern int Swig_VarsetToFunction(Node *n, int flags); #define CWRAP_EXTEND 0x01 #define CWRAP_SMART_POINTER 0x02 #define CWRAP_NATURAL_VAR 0x04 #define CWRAP_DIRECTOR_ONE_CALL 0x08 #define CWRAP_DIRECTOR_TWO_CALLS 0x10 #define CWRAP_ALL_PROTECTED_ACCESS 0x20 #define CWRAP_SMART_POINTER_OVERLOAD 0x40 /* --- Director Helpers --- */ extern Node *Swig_methodclass(Node *n); extern int Swig_directorclass(Node *n); extern Node *Swig_directormap(Node *n, String *type); /* --- Legacy Typemap API (somewhat simplified, ha!) --- */ extern void Swig_typemap_init(void); extern void Swig_typemap_register(const_String_or_char_ptr tmap_method, ParmList *pattern, const_String_or_char_ptr code, ParmList *locals, ParmList *kwargs); extern int Swig_typemap_copy(const_String_or_char_ptr tmap_method, ParmList *srcpattern, ParmList *pattern); extern void Swig_typemap_clear(const_String_or_char_ptr tmap_method, ParmList *pattern); extern int Swig_typemap_apply(ParmList *srcpat, ParmList *destpat); extern void Swig_typemap_clear_apply(ParmList *pattern); extern void Swig_typemap_replace_embedded_typemap(String *s, Node *file_line_node); extern void Swig_typemap_debug(void); extern void Swig_typemap_search_debug_set(void); extern void Swig_typemap_used_debug_set(void); extern void Swig_typemap_register_debug_set(void); extern String *Swig_typemap_lookup(const_String_or_char_ptr tmap_method, Node *n, const_String_or_char_ptr lname, Wrapper *f); extern String *Swig_typemap_lookup_out(const_String_or_char_ptr tmap_method, Node *n, const_String_or_char_ptr lname, Wrapper *f, String *actioncode); extern void Swig_typemap_attach_parms(const_String_or_char_ptr tmap_method, ParmList *parms, Wrapper *f); /* --- Code fragment support --- */ extern void Swig_fragment_register(Node *fragment); extern void Swig_fragment_emit(String *name); extern void Swig_fragment_clear(String *section); /* --- Extension support --- */ extern Hash *Swig_extend_hash(void); extern void Swig_extend_merge(Node *cls, Node *am); extern void Swig_extend_append_previous(Node *cls, Node *am); extern void Swig_extend_unused_check(void); /* hacks defined in C++ ! */ extern int Swig_director_mode(void); extern int Swig_director_protected_mode(void); extern int Swig_all_protected_mode(void); extern void Wrapper_director_mode_set(int); extern void Wrapper_director_protected_mode_set(int); extern void Wrapper_all_protected_mode_set(int); extern void Language_replace_special_variables(String *method, String *tm, Parm *parm); extern void Swig_print(DOH *object, int count); extern void Swig_print_with_location(DOH *object, int count); extern void SWIG_exit(int exit_code); /* -- template init -- */ extern void SwigType_template_init(void); #ifdef __cplusplus } #endif #endif swig-4.0.1/Source/Swig/swigscan.h0000644000175000017500000001321713527063513016514 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * swigscan.h * * C/C++ scanner. * ----------------------------------------------------------------------------- */ typedef struct Scanner Scanner; extern Scanner *NewScanner(void); extern void DelScanner(Scanner *); extern void Scanner_clear(Scanner *); extern void Scanner_push(Scanner *, String *); extern void Scanner_pushtoken(Scanner *, int, const_String_or_char_ptr value); extern int Scanner_token(Scanner *); extern String *Scanner_text(Scanner *); extern void Scanner_skip_line(Scanner *); extern int Scanner_skip_balanced(Scanner *, int startchar, int endchar); extern String *Scanner_get_raw_text_balanced(Scanner *, int startchar, int endchar); extern void Scanner_set_location(Scanner *, String *file, int line); extern String *Scanner_file(Scanner *); extern int Scanner_line(Scanner *); extern int Scanner_start_line(Scanner *); extern void Scanner_idstart(Scanner *, const char *idchar); extern String *Scanner_errmsg(Scanner *); extern int Scanner_errline(Scanner *); extern int Scanner_isoperator(int tokval); extern void Scanner_locator(Scanner *, String *loc); /* Note: Tokens in range 100+ are for C/C++ operators */ #define SWIG_MAXTOKENS 200 #define SWIG_TOKEN_LPAREN 1 /* ( */ #define SWIG_TOKEN_RPAREN 2 /* ) */ #define SWIG_TOKEN_SEMI 3 /* ; */ #define SWIG_TOKEN_LBRACE 4 /* { */ #define SWIG_TOKEN_RBRACE 5 /* } */ #define SWIG_TOKEN_LBRACKET 6 /* [ */ #define SWIG_TOKEN_RBRACKET 7 /* ] */ #define SWIG_TOKEN_BACKSLASH 8 /* \ */ #define SWIG_TOKEN_ENDLINE 9 /* \n */ #define SWIG_TOKEN_STRING 10 /* "str" */ #define SWIG_TOKEN_POUND 11 /* # */ #define SWIG_TOKEN_COLON 12 /* : */ #define SWIG_TOKEN_DCOLON 13 /* :: */ #define SWIG_TOKEN_DCOLONSTAR 14 /* ::* */ #define SWIG_TOKEN_ID 15 /* identifier */ #define SWIG_TOKEN_FLOAT 16 /* 3.1415F */ #define SWIG_TOKEN_DOUBLE 17 /* 3.1415 */ #define SWIG_TOKEN_INT 18 /* 314 */ #define SWIG_TOKEN_UINT 19 /* 314U */ #define SWIG_TOKEN_LONG 20 /* 314L */ #define SWIG_TOKEN_ULONG 21 /* 314UL */ #define SWIG_TOKEN_CHAR 22 /* 'charconst' */ #define SWIG_TOKEN_PERIOD 23 /* . */ #define SWIG_TOKEN_AT 24 /* @ */ #define SWIG_TOKEN_DOLLAR 25 /* $ */ #define SWIG_TOKEN_CODEBLOCK 26 /* %{ ... %} ... */ #define SWIG_TOKEN_RSTRING 27 /* `charconst` */ #define SWIG_TOKEN_LONGLONG 28 /* 314LL */ #define SWIG_TOKEN_ULONGLONG 29 /* 314ULL */ #define SWIG_TOKEN_QUESTION 30 /* ? */ #define SWIG_TOKEN_COMMENT 31 /* C or C++ comment */ #define SWIG_TOKEN_BOOL 32 /* true or false */ #define SWIG_TOKEN_WSTRING 33 /* L"str" */ #define SWIG_TOKEN_WCHAR 34 /* L'c' */ #define SWIG_TOKEN_ILLEGAL 99 #define SWIG_TOKEN_ERROR -1 #define SWIG_TOKEN_COMMA 101 /* , */ #define SWIG_TOKEN_STAR 102 /* * */ #define SWIG_TOKEN_TIMES 102 /* * */ #define SWIG_TOKEN_EQUAL 103 /* = */ #define SWIG_TOKEN_EQUALTO 104 /* == */ #define SWIG_TOKEN_NOTEQUAL 105 /* != */ #define SWIG_TOKEN_PLUS 106 /* + */ #define SWIG_TOKEN_MINUS 107 /* - */ #define SWIG_TOKEN_AND 108 /* & */ #define SWIG_TOKEN_LAND 109 /* && */ #define SWIG_TOKEN_OR 110 /* | */ #define SWIG_TOKEN_LOR 111 /* || */ #define SWIG_TOKEN_XOR 112 /* ^ */ #define SWIG_TOKEN_LESSTHAN 113 /* < */ #define SWIG_TOKEN_GREATERTHAN 114 /* > */ #define SWIG_TOKEN_LTEQUAL 115 /* <= */ #define SWIG_TOKEN_GTEQUAL 116 /* >= */ #define SWIG_TOKEN_NOT 117 /* ~ */ #define SWIG_TOKEN_LNOT 118 /* ! */ #define SWIG_TOKEN_SLASH 119 /* / */ #define SWIG_TOKEN_DIVIDE 119 /* / */ #define SWIG_TOKEN_PERCENT 120 /* % */ #define SWIG_TOKEN_MODULO 120 /* % */ #define SWIG_TOKEN_LSHIFT 121 /* << */ #define SWIG_TOKEN_RSHIFT 122 /* >> */ #define SWIG_TOKEN_PLUSPLUS 123 /* ++ */ #define SWIG_TOKEN_MINUSMINUS 124 /* -- */ #define SWIG_TOKEN_PLUSEQUAL 125 /* += */ #define SWIG_TOKEN_MINUSEQUAL 126 /* -= */ #define SWIG_TOKEN_TIMESEQUAL 127 /* *= */ #define SWIG_TOKEN_DIVEQUAL 128 /* /= */ #define SWIG_TOKEN_ANDEQUAL 129 /* &= */ #define SWIG_TOKEN_OREQUAL 130 /* |= */ #define SWIG_TOKEN_XOREQUAL 131 /* ^= */ #define SWIG_TOKEN_LSEQUAL 132 /* <<= */ #define SWIG_TOKEN_RSEQUAL 133 /* >>= */ #define SWIG_TOKEN_MODEQUAL 134 /* %= */ #define SWIG_TOKEN_ARROW 135 /* -> */ #define SWIG_TOKEN_ARROWSTAR 136 /* ->* */ swig-4.0.1/Source/Swig/swigwrap.h0000644000175000017500000000277413527063513016547 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * swigwrap.h * * Functions related to wrapper objects. * ----------------------------------------------------------------------------- */ typedef struct Wrapper { Hash *localh; String *def; String *locals; String *code; } Wrapper; extern Wrapper *NewWrapper(void); extern void DelWrapper(Wrapper *w); extern void Wrapper_compact_print_mode_set(int flag); extern void Wrapper_pretty_print(String *str, File *f); extern void Wrapper_compact_print(String *str, File *f); extern void Wrapper_print(Wrapper *w, File *f); extern int Wrapper_add_local(Wrapper *w, const_String_or_char_ptr name, const_String_or_char_ptr decl); extern int Wrapper_add_localv(Wrapper *w, const_String_or_char_ptr name, ...); extern int Wrapper_check_local(Wrapper *w, const_String_or_char_ptr name); extern char *Wrapper_new_local(Wrapper *w, const_String_or_char_ptr name, const_String_or_char_ptr decl); extern char *Wrapper_new_localv(Wrapper *w, const_String_or_char_ptr name, ...); swig-4.0.1/Source/Swig/parms.c0000644000175000017500000001700313527063513016010 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * parms.c * * Parameter list class. * ----------------------------------------------------------------------------- */ #include "swig.h" /* ------------------------------------------------------------------------ * NewParm() * * Create a new parameter from datatype 'type' and name 'name' copying * the file and line number from the Node from_node. * ------------------------------------------------------------------------ */ Parm *NewParm(SwigType *type, const_String_or_char_ptr name, Node *from_node) { Parm *p = NewParmWithoutFileLineInfo(type, name); Setfile(p, Getfile(from_node)); Setline(p, Getline(from_node)); return p; } /* ------------------------------------------------------------------------ * NewParmWithoutFileLineInfo() * * Create a new parameter from datatype 'type' and name 'name' without any * file / line numbering information. * ------------------------------------------------------------------------ */ Parm *NewParmWithoutFileLineInfo(SwigType *type, const_String_or_char_ptr name) { Parm *p = NewHash(); set_nodeType(p, "parm"); if (type) { SwigType *ntype = Copy(type); Setattr(p, "type", ntype); Delete(ntype); } Setattr(p, "name", name); return p; } /* ------------------------------------------------------------------------ * NewParmNode() * * Create a new parameter from datatype 'type' and name and symbol table as * well as file and line number from the 'from_node'. * The resulting Parm will be similar to a Node used for typemap lookups. * ------------------------------------------------------------------------ */ Parm *NewParmNode(SwigType *type, Node *from_node) { Parm *p = NewParm(type, Getattr(from_node, "name"), from_node); Setattr(p, "sym:symtab", Getattr(from_node, "sym:symtab")); return p; } /* ------------------------------------------------------------------------ * CopyParm() * ------------------------------------------------------------------------ */ Parm *CopyParm(Parm *p) { Parm *np = NewHash(); Iterator ki; for (ki = First(p); ki.key; ki = Next(ki)) { if (DohIsString(ki.item)) { DOH *c = Copy(ki.item); Setattr(np,ki.key,c); Delete(c); } } Setfile(np, Getfile(p)); Setline(np, Getline(p)); return np; } /* ------------------------------------------------------------------ * CopyParmListMax() * CopyParmList() * ------------------------------------------------------------------ */ ParmList *CopyParmListMax(ParmList *p, int count) { Parm *np; Parm *pp = 0; Parm *fp = 0; if (!p) return 0; while (p) { if (count == 0) break; np = CopyParm(p); if (pp) { set_nextSibling(pp, np); Delete(np); } else { fp = np; } pp = np; p = nextSibling(p); count--; } return fp; } ParmList *CopyParmList(ParmList *p) { return CopyParmListMax(p,-1); } /* ----------------------------------------------------------------------------- * int ParmList_numrequired(). Return number of required arguments * ----------------------------------------------------------------------------- */ int ParmList_numrequired(ParmList *p) { int i = 0; while (p) { SwigType *t = Getattr(p, "type"); String *value = Getattr(p, "value"); if (value) return i; if (!(SwigType_type(t) == T_VOID)) i++; else break; p = nextSibling(p); } return i; } /* ----------------------------------------------------------------------------- * int ParmList_len() * ----------------------------------------------------------------------------- */ int ParmList_len(ParmList *p) { int i = 0; while (p) { i++; p = nextSibling(p); } return i; } /* --------------------------------------------------------------------- * get_empty_type() * ---------------------------------------------------------------------- */ static SwigType *get_empty_type() { return NewStringEmpty(); } /* --------------------------------------------------------------------- * ParmList_str() * * Generates a string of parameters * ---------------------------------------------------------------------- */ String *ParmList_str(ParmList *p) { String *out = NewStringEmpty(); while (p) { String *type = Getattr(p, "type"); String *pstr = SwigType_str(type ? type : get_empty_type(), Getattr(p, "name")); Append(out, pstr); p = nextSibling(p); if (p) { Append(out, ","); } Delete(pstr); } return out; } /* --------------------------------------------------------------------- * ParmList_str_defaultargs() * * Generates a string of parameters including default arguments * ---------------------------------------------------------------------- */ String *ParmList_str_defaultargs(ParmList *p) { String *out = NewStringEmpty(); while (p) { String *value = Getattr(p, "value"); String *type = Getattr(p, "type"); String *pstr = SwigType_str(type ? type : get_empty_type(), Getattr(p, "name")); Append(out, pstr); if (value) { Printf(out, "=%s", value); } p = nextSibling(p); if (p) { Append(out, ","); } Delete(pstr); } return out; } /* ----------------------------------------------------------------------------- * ParmList_str_multibrackets() * * Generates a string of parameters including default arguments adding brackets * if more than one parameter * ----------------------------------------------------------------------------- */ String *ParmList_str_multibrackets(ParmList *p) { String *out; String *parm_str = ParmList_str_defaultargs(p); if (ParmList_len(p) > 1) out = NewStringf("(%s)", parm_str); else out = NewStringf("%s", parm_str); Delete(parm_str); return out; } /* --------------------------------------------------------------------- * ParmList_protostr() * * Generate a prototype string. * ---------------------------------------------------------------------- */ String *ParmList_protostr(ParmList *p) { String *out = NewStringEmpty(); while (p) { String *type = Getattr(p, "type"); String *pstr = SwigType_str(type ? type : get_empty_type(), 0); Append(out, pstr); p = nextSibling(p); if (p) { Append(out, ","); } Delete(pstr); } return out; } /* --------------------------------------------------------------------- * ParmList_has_defaultargs() * * Returns 1 if the parameter list passed in is has one or more default * arguments. Otherwise returns 0. * ---------------------------------------------------------------------- */ int ParmList_has_defaultargs(ParmList *p) { while (p) { if (Getattr(p, "value")) { return 1; } p = nextSibling(p); } return 0; } /* --------------------------------------------------------------------- * ParmList_has_varargs() * * Returns 1 if the parameter list passed in has varargs. * Otherwise returns 0. * ---------------------------------------------------------------------- */ int ParmList_has_varargs(ParmList *p) { Parm *lp = 0; while (p) { lp = p; p = nextSibling(p); } return lp ? SwigType_isvarargs(Getattr(lp, "type")) : 0; } swig-4.0.1/Source/Swig/typemap.c0000644000175000017500000020142413527063513016347 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * typemap.c * * A somewhat generalized implementation of SWIG1.1 typemaps. * ----------------------------------------------------------------------------- */ #include "swig.h" #include "cparse.h" #include #if 0 #define SWIG_DEBUG #endif static int typemap_search_debug = 0; static int typemaps_used_debug = 0; static int typemap_register_debug = 0; static int in_typemap_search_multi = 0; static void replace_embedded_typemap(String *s, ParmList *parm_sublist, Wrapper *f, Node *file_line_node); /* ----------------------------------------------------------------------------- * Typemaps are stored in a collection of nested hash tables. Something like * this: * * [ type ] * +-------- [ name ] * +-------- [ name ] * * Each hash table [ type ] or [ name ] then contains references to the * different typemap methods. These are referenced by names such as * "tmap:in", "tmap:out", "tmap:argout", and so forth. * * The object corresponding to a specific typemap method has the following attributes: * * "type" - Typemap type * "pname" - Parameter name * "code" - Typemap code * "source" - Source directive (%apply or %typemap) for the typemap * "locals" - Local variables (if any) * "kwargs" - Typemap attributes * * Example for a typemap method named "in": * %typemap(in, warning="987:my warning", noblock=1) int &my_int (int tmp) "$1 = $input;" * * "type" - r.int * "pname" - my_int * "code" - $1 = $input; * "source" - typemap(in) int &my_int * "locals" - int tmp * "kwargs" - warning="987:my typemap warning", foo=123 * * ----------------------------------------------------------------------------- */ static Hash *typemaps; /* ----------------------------------------------------------------------------- * typemap_identifier_fix() * * Create a type that can be used as a hash key lookup independent of the various * ways a template parameter list can be defined. This is achieved by fully * resolving the template parameters. * * This is a copy and modification of feature_identifier_fix in parser.y. * ----------------------------------------------------------------------------- */ static SwigType *typemap_identifier_fix(const SwigType *s) { String *tp = SwigType_istemplate_templateprefix(s); if (tp) { String *ts, *ta, *tq, *tr; ts = SwigType_templatesuffix(s); ta = SwigType_templateargs(s); tq = Swig_symbol_type_qualify(ta, 0); tr = SwigType_typedef_resolve_all(ta); Append(tp,tr); Append(tp,ts); Delete(ts); Delete(ta); Delete(tq); Delete(tr); return tp; } else { return NewString(s); } } static Hash *get_typemap(const SwigType *type) { Hash *tm = 0; SwigType *dtype = 0; SwigType *hashtype; if (SwigType_istemplate(type)) { SwigType *rty = typemap_identifier_fix(type); String *ty = Swig_symbol_template_deftype(rty, 0); dtype = Swig_symbol_type_qualify(ty, 0); type = dtype; Delete(ty); } /* remove unary scope operator (::) prefix indicating global scope for looking up in the hashmap */ hashtype = SwigType_remove_global_scope_prefix(type); tm = Getattr(typemaps, hashtype); Delete(dtype); Delete(hashtype); return tm; } static void set_typemap(const SwigType *type, Hash **tmhash) { SwigType *hashtype = 0; Hash *new_tm = 0; assert(*tmhash == 0); if (SwigType_istemplate(type)) { SwigType *rty = typemap_identifier_fix(type); String *ty = Swig_symbol_template_deftype(rty, 0); String *tyq = Swig_symbol_type_qualify(ty, 0); hashtype = SwigType_remove_global_scope_prefix(tyq); *tmhash = Getattr(typemaps, hashtype); Delete(rty); Delete(tyq); Delete(ty); } else { hashtype = SwigType_remove_global_scope_prefix(type); } if (!*tmhash) { /* this type has not been seen before even after resolving template parameter types */ new_tm = NewHash(); *tmhash = new_tm; } /* note that the unary scope operator (::) prefix indicating global scope has been removed from the type */ Setattr(typemaps, hashtype, *tmhash); Delete(hashtype); Delete(new_tm); } /* ----------------------------------------------------------------------------- * Swig_typemap_init() * * Initialize the typemap system * ----------------------------------------------------------------------------- */ void Swig_typemap_init() { typemaps = NewHash(); } static String *typemap_method_name(const_String_or_char_ptr tmap_method) { static Hash *names = 0; String *s; /* Due to "interesting" object-identity semantics of DOH, we have to make sure that we only intern strings without object identity into the hash table. (typemap_attach_kwargs calls typemap_method_name several times with the "same" String *tmap_method (i.e., same object identity) but differing string values.) Most other callers work around this by using char* rather than String *. -- mkoeppe, Jun 17, 2003 */ const char *method_without_object_identity = Char(tmap_method); if (!names) names = NewHash(); s = Getattr(names, method_without_object_identity); if (s) return s; s = NewStringf("tmap:%s", tmap_method); Setattr(names, method_without_object_identity, s); Delete(s); return s; } /* ----------------------------------------------------------------------------- * typemap_register() * * Internal implementation for Swig_typemap_register() * ----------------------------------------------------------------------------- */ static void typemap_register(const_String_or_char_ptr tmap_method, ParmList *parms, const_String_or_char_ptr code, ParmList *locals, ParmList *kwargs, String *source_directive) { Hash *tm; Hash *tm1; Hash *tm2; Parm *np; String *tm_method; SwigType *type; String *pname; if (!parms) return; if (typemap_register_debug) { Printf(stdout, "Registering - %s\n", tmap_method); Swig_print_node(parms); } tm_method = typemap_method_name(tmap_method); /* Register the first type in the parameter list */ type = Getattr(parms, "type"); pname = Getattr(parms, "name"); /* See if this type has been seen before */ tm = get_typemap(type); if (!tm) { set_typemap(type, &tm); } if (pname) { /* See if parameter has been seen before */ tm1 = Getattr(tm, pname); if (!tm1) { tm1 = NewHash(); Setattr(tm, pname, tm1); Delete(tm1); } tm = tm1; } /* Now see if this typemap method has been seen before */ tm2 = Getattr(tm, tm_method); if (!tm2) { tm2 = NewHash(); Setattr(tm, tm_method, tm2); Delete(tm2); } /* For a multi-argument typemap, the typemap code and information is really only stored in the last argument. However, to make this work, we perform a really neat trick using the typemap method name. For example, consider this typemap %typemap(in) (int foo, int *bar, char *blah[]) { ... } To store it, we look at typemaps for the following: typemap method type-name ---------------------------------------------- "in" int foo "in-int+foo:" int *bar "in-int+foo:-p.int+bar: char *blah[] Notice how the typemap method name expands to encode information about previous arguments. */ np = nextSibling(parms); if (np) { /* Make an entirely new typemap method key */ String *multi_tmap_method = NewStringf("%s-%s+%s:", tmap_method, type, pname); /* Now reregister on the remaining arguments */ typemap_register(multi_tmap_method, np, code, locals, kwargs, source_directive); Delete(multi_tmap_method); } else { ParmList *clocals = CopyParmList(locals); ParmList *ckwargs = CopyParmList(kwargs); Setfile(tm2, Getfile(code)); Setline(tm2, Getline(code)); Setattr(tm2, "code", code); Setattr(tm2, "type", type); Setattr(tm2, "source", source_directive); if (pname) { Setattr(tm2, "pname", pname); } Setattr(tm2, "locals", clocals); Setattr(tm2, "kwargs", ckwargs); Delete(clocals); Delete(ckwargs); } } /* ----------------------------------------------------------------------------- * Swig_typemap_register() * * Add a new, possibly multi-argument, typemap * ----------------------------------------------------------------------------- */ void Swig_typemap_register(const_String_or_char_ptr tmap_method, ParmList *parms, const_String_or_char_ptr code, ParmList *locals, ParmList *kwargs) { String *parms_str = ParmList_str_multibrackets(parms); String *source_directive = NewStringf("typemap(%s) %s", tmap_method, parms_str); typemap_register(tmap_method, parms, code, locals, kwargs, source_directive); Delete(source_directive); Delete(parms_str); } /* ----------------------------------------------------------------------------- * typemap_get() * * Retrieve typemap information. * ----------------------------------------------------------------------------- */ static Hash *typemap_get(SwigType *type, const_String_or_char_ptr name) { Hash *tm, *tm1; tm = get_typemap(type); if (!tm) { return 0; } if ((name) && Len(name)) { tm1 = Getattr(tm, name); return tm1; } return tm; } /* ----------------------------------------------------------------------------- * Swig_typemap_copy() * * Copy a typemap * ----------------------------------------------------------------------------- */ int Swig_typemap_copy(const_String_or_char_ptr tmap_method, ParmList *srcparms, ParmList *parms) { Hash *tm = 0; String *tm_method; Parm *p; String *pname; SwigType *ptype; String *tm_methods, *multi_tmap_method; if (ParmList_len(parms) != ParmList_len(srcparms)) return -1; tm_method = typemap_method_name(tmap_method); p = srcparms; tm_methods = NewString(tm_method); while (p) { ptype = Getattr(p, "type"); pname = Getattr(p, "name"); /* Lookup the type */ tm = typemap_get(ptype, pname); if (!tm) break; tm = Getattr(tm, tm_methods); if (!tm) break; /* Got a match. Look for next typemap */ multi_tmap_method = NewStringf("%s-%s+%s:", tm_methods, ptype, pname); Delete(tm_methods); tm_methods = multi_tmap_method; p = nextSibling(p); } Delete(tm_methods); if (!p && tm) { /* Got some kind of match */ String *parms_str = ParmList_str_multibrackets(parms); String *srcparms_str = ParmList_str_multibrackets(srcparms); String *source_directive = NewStringf("typemap(%s) %s = %s", tmap_method, parms_str, srcparms_str); typemap_register(tmap_method, parms, Getattr(tm, "code"), Getattr(tm, "locals"), Getattr(tm, "kwargs"), source_directive); Delete(source_directive); Delete(srcparms_str); Delete(parms_str); return 0; } /* Not found */ return -1; } /* ----------------------------------------------------------------------------- * Swig_typemap_clear() * * Delete a multi-argument typemap * ----------------------------------------------------------------------------- */ void Swig_typemap_clear(const_String_or_char_ptr tmap_method, ParmList *parms) { SwigType *type; String *name; Parm *p; String *multi_tmap_method; Hash *tm = 0; /* This might not work */ multi_tmap_method = NewString(tmap_method); p = parms; while (p) { type = Getattr(p, "type"); name = Getattr(p, "name"); tm = typemap_get(type, name); if (!tm) return; p = nextSibling(p); if (p) Printf(multi_tmap_method, "-%s+%s:", type, name); } if (tm) { tm = Getattr(tm, typemap_method_name(multi_tmap_method)); if (tm) { Delattr(tm, "code"); Delattr(tm, "locals"); Delattr(tm, "kwargs"); } } Delete(multi_tmap_method); } /* ----------------------------------------------------------------------------- * Swig_typemap_apply() * * Multi-argument %apply directive. This is pretty horrible so I sure hope * it works. * ----------------------------------------------------------------------------- */ static int count_args(String *s) { /* Count up number of arguments */ int na = 0; char *c = Char(s); while (*c) { if (*c == '+') na++; c++; } return na; } int Swig_typemap_apply(ParmList *src, ParmList *dest) { String *ssig, *dsig; Parm *p, *np, *lastp, *dp, *lastdp = 0; int narg = 0; SwigType *type = 0, *name; Hash *tm, *sm; int match = 0; /* Printf(stdout,"apply : %s --> %s\n", ParmList_str(src), ParmList_str(dest)); */ /* Create type signature of source */ ssig = NewStringEmpty(); dsig = NewStringEmpty(); p = src; dp = dest; lastp = 0; while (p) { lastp = p; lastdp = dp; np = nextSibling(p); if (np) { Printf(ssig, "-%s+%s:", Getattr(p, "type"), Getattr(p, "name")); Printf(dsig, "-%s+%s:", Getattr(dp, "type"), Getattr(dp, "name")); narg++; } p = np; dp = nextSibling(dp); } /* make sure a typemap node exists for the last destination node */ type = Getattr(lastdp, "type"); tm = get_typemap(type); if (!tm) { set_typemap(type, &tm); } name = Getattr(lastdp, "name"); if (name) { Hash *tm1 = Getattr(tm, name); if (!tm1) { tm1 = NewHash(); Setattr(tm, NewString(name), tm1); Delete(tm1); } tm = tm1; } /* This is a little nasty. We need to go searching for all possible typemaps in the source and apply them to the target */ type = Getattr(lastp, "type"); name = Getattr(lastp, "name"); /* See if there is a matching typemap in this scope */ sm = typemap_get(type, name); /* if there is not matching, look for a typemap in the original typedef, if any, like in: typedef unsigned long size_t; ... %apply(size_t) {my_size}; ==> %apply(unsigned long) {my_size}; */ if (!sm) { SwigType *ntype = SwigType_typedef_resolve(type); if (ntype && (Cmp(ntype, type) != 0)) { sm = typemap_get(ntype, name); } Delete(ntype); } if (sm) { /* Got a typemap. Need to only merge attributes for methods that match our signature */ Iterator ki; match = 1; for (ki = First(sm); ki.key; ki = Next(ki)) { /* Check for a signature match with the source signature */ if ((count_args(ki.key) == narg) && (Strstr(ki.key, ssig))) { String *oldm; /* A typemap we have to copy */ String *nkey = Copy(ki.key); Replace(nkey, ssig, dsig, DOH_REPLACE_ANY); /* Make sure the typemap doesn't already exist in the target map */ oldm = Getattr(tm, nkey); if (!oldm || (!Getattr(tm, "code"))) { String *code; ParmList *locals; ParmList *kwargs; Hash *sm1 = ki.item; code = Getattr(sm1, "code"); locals = Getattr(sm1, "locals"); kwargs = Getattr(sm1, "kwargs"); if (code) { String *src_str = ParmList_str_multibrackets(src); String *dest_str = ParmList_str_multibrackets(dest); String *source_directive = NewStringf("apply %s { %s }", src_str, dest_str); Replace(nkey, dsig, "", DOH_REPLACE_ANY); Replace(nkey, "tmap:", "", DOH_REPLACE_ANY); typemap_register(nkey, dest, code, locals, kwargs, source_directive); Delete(source_directive); Delete(dest_str); Delete(src_str); } } Delete(nkey); } } } Delete(ssig); Delete(dsig); return match; } /* ----------------------------------------------------------------------------- * Swig_typemap_clear_apply() * * %clear directive. Clears all typemaps for a type (in the current scope only). * ----------------------------------------------------------------------------- */ /* Multi-argument %clear directive */ void Swig_typemap_clear_apply(Parm *parms) { String *tsig; Parm *p, *np, *lastp; int narg = 0; Hash *tm; String *name; /* Create a type signature of the parameters */ tsig = NewStringEmpty(); p = parms; lastp = 0; while (p) { lastp = p; np = nextSibling(p); if (np) { Printf(tsig, "-%s+%s:", Getattr(p, "type"), Getattr(p, "name")); narg++; } p = np; } tm = get_typemap(Getattr(lastp, "type")); if (!tm) { Delete(tsig); return; } name = Getattr(lastp, "name"); if (name) { tm = Getattr(tm, name); } if (tm) { /* Clear typemaps that match our signature */ Iterator ki, ki2; char *ctsig = Char(tsig); for (ki = First(tm); ki.key; ki = Next(ki)) { char *ckey = Char(ki.key); if (strncmp(ckey, "tmap:", 5) == 0) { int na = count_args(ki.key); if ((na == narg) && strstr(ckey, ctsig)) { Hash *h = ki.item; for (ki2 = First(h); ki2.key; ki2 = Next(ki2)) { Delattr(h, ki2.key); } } } } } Delete(tsig); } /* Internal function to strip array dimensions. */ static SwigType *strip_arrays(SwigType *type) { SwigType *t; int ndim; int i; t = Copy(type); ndim = SwigType_array_ndim(t); for (i = 0; i < ndim; i++) { SwigType_array_setdim(t, i, "ANY"); } return t; } static void debug_search_result_display(Node *tm) { if (tm) Printf(stdout, " Using: %%%s\n", Getattr(tm, "source")); else Printf(stdout, " None found\n"); } /* ----------------------------------------------------------------------------- * typemap_search_helper() * * Helper function for typemap_search to see if there is a type match in the typemap * tm. A match is sought in this order: * %typemap(tm_method) ctype cqualifiedname * %typemap(tm_method) ctype cname * %typemap(tm_method) ctype * ----------------------------------------------------------------------------- */ static Hash *typemap_search_helper(int debug_display, Hash *tm, const String *tm_method, SwigType *ctype, const String *cqualifiedname, const String *cname, Hash **backup) { Hash *result = 0; Hash *tm1; if (debug_display && cqualifiedname) Printf(stdout, " Looking for: %s\n", SwigType_str(ctype, cqualifiedname)); if (tm && cqualifiedname) { tm1 = Getattr(tm, cqualifiedname); if (tm1) { result = Getattr(tm1, tm_method); /* See if there is a type - qualified name match */ if (result && Getattr(result, "code")) goto ret_result; if (result) *backup = result; } } if (debug_display && cname) Printf(stdout, " Looking for: %s\n", SwigType_str(ctype, cname)); if (tm && cname) { tm1 = Getattr(tm, cname); if (tm1) { result = Getattr(tm1, tm_method); /* See if there is a type - name match */ if (result && Getattr(result, "code")) goto ret_result; if (result) *backup = result; } } if (debug_display) Printf(stdout, " Looking for: %s\n", SwigType_str(ctype, 0)); if (tm) { result = Getattr(tm, tm_method); /* See if there is simply a type without name match */ if (result && Getattr(result, "code")) goto ret_result; if (result) *backup = result; } ret_result: return result; } /* ----------------------------------------------------------------------------- * typemap_search() * * Search for a typemap match. This is where the typemap pattern matching rules * are implemented... tries to find the most specific typemap that includes a * 'code' attribute. * ----------------------------------------------------------------------------- */ static Hash *typemap_search(const_String_or_char_ptr tmap_method, SwigType *type, const_String_or_char_ptr name, const_String_or_char_ptr qualifiedname, SwigType **matchtype, Node *node) { Hash *result = 0; Hash *tm; Hash *backup = 0; SwigType *primitive = 0; SwigType *ctype = 0; SwigType *ctype_unstripped = 0; int isarray; const String *cname = 0; const String *cqualifiedname = 0; String *tm_method = typemap_method_name(tmap_method); int debug_display = (in_typemap_search_multi == 0) && typemap_search_debug; if ((name) && Len(name)) cname = name; if ((qualifiedname) && Len(qualifiedname)) cqualifiedname = qualifiedname; if (debug_display) { String *typestr = SwigType_str(type, cqualifiedname ? cqualifiedname : cname); Swig_diagnostic(Getfile(node), Getline(node), "Searching for a suitable '%s' typemap for: %s\n", tmap_method, typestr); Delete(typestr); } ctype = Copy(type); ctype_unstripped = Copy(ctype); while (ctype) { /* Try to get an exact type-match */ tm = get_typemap(ctype); result = typemap_search_helper(debug_display, tm, tm_method, ctype, cqualifiedname, cname, &backup); if (result && Getattr(result, "code")) goto ret_result; { /* Look for the type reduced to just the template prefix - for templated types without the template parameter list being specified */ SwigType *template_prefix = SwigType_istemplate_only_templateprefix(ctype); if (template_prefix) { tm = get_typemap(template_prefix); result = typemap_search_helper(debug_display, tm, tm_method, template_prefix, cqualifiedname, cname, &backup); Delete(template_prefix); if (result && Getattr(result, "code")) goto ret_result; } } /* look for [ANY] arrays */ isarray = SwigType_isarray(ctype); if (isarray) { /* If working with arrays, strip away all of the dimensions and replace with "ANY". See if that generates a match */ SwigType *noarrays = strip_arrays(ctype); tm = get_typemap(noarrays); result = typemap_search_helper(debug_display, tm, tm_method, noarrays, cqualifiedname, cname, &backup); Delete(noarrays); if (result && Getattr(result, "code")) goto ret_result; } /* No match so far - try with a qualifier stripped (strip one qualifier at a time until none remain) * The order of stripping in SwigType_strip_single_qualifier is used to provide some sort of consistency * with the default (SWIGTYPE) typemap matching rules for the first qualifier to be stripped. */ { SwigType *oldctype = ctype; ctype = SwigType_strip_single_qualifier(oldctype); if (!Equal(ctype, oldctype)) { Delete(oldctype); continue; } Delete(oldctype); } /* Once all qualifiers are stripped try resolve a typedef */ { SwigType *oldctype = ctype; ctype = SwigType_typedef_resolve(ctype_unstripped); Delete(oldctype); Delete(ctype_unstripped); ctype_unstripped = Copy(ctype); } } /* Hmmm. Well, no match seems to be found at all. See if there is some kind of default (SWIGTYPE) mapping */ primitive = SwigType_default_create(type); while (primitive) { tm = get_typemap(primitive); result = typemap_search_helper(debug_display, tm, tm_method, primitive, cqualifiedname, cname, &backup); if (result && Getattr(result, "code")) goto ret_result; { SwigType *nprim = SwigType_default_deduce(primitive); Delete(primitive); primitive = nprim; } } if (ctype != type) { Delete(ctype); ctype = 0; } result = backup; ret_result: Delete(primitive); if (matchtype) *matchtype = Copy(ctype); Delete(ctype); Delete(ctype_unstripped); return result; } /* ----------------------------------------------------------------------------- * typemap_search_multi() * * Search for a multi-argument typemap. * ----------------------------------------------------------------------------- */ static Hash *typemap_search_multi(const_String_or_char_ptr tmap_method, ParmList *parms, int *nmatch) { SwigType *type; SwigType *mtype = 0; String *name; String *multi_tmap_method; Hash *tm; Hash *tm1 = 0; if (!parms) { *nmatch = 0; return 0; } type = Getattr(parms, "type"); name = Getattr(parms, "name"); /* Try to find a match on the first type */ tm = typemap_search(tmap_method, type, name, 0, &mtype, parms); if (tm) { if (mtype && SwigType_isarray(mtype)) { Setattr(parms, "tmap:match", mtype); } Delete(mtype); multi_tmap_method = NewStringf("%s-%s+%s:", tmap_method, type, name); in_typemap_search_multi++; tm1 = typemap_search_multi(multi_tmap_method, nextSibling(parms), nmatch); in_typemap_search_multi--; if (tm1) tm = tm1; if (Getattr(tm, "code")) { *(nmatch) = *nmatch + 1; if (typemap_search_debug && tm1 && (in_typemap_search_multi == 0)) { Printf(stdout, " Multi-argument typemap found...\n"); } } else { tm = 0; } Delete(multi_tmap_method); } if (typemap_search_debug && (in_typemap_search_multi == 0)) debug_search_result_display(tm); if (typemaps_used_debug && (in_typemap_search_multi == 0) && tm) { String *typestr = SwigType_str(type, name); Swig_diagnostic(Getfile(parms), Getline(parms), "Typemap for %s (%s) : %%%s\n", typestr, tmap_method, Getattr(tm, "source")); assert(Getfile(parms) && Len(Getfile(parms)) > 0); /* Missing file and line numbering information */ Delete(typestr); } return tm; } /* ----------------------------------------------------------------------------- * typemap_replace_vars() * * Replaces typemap variables on a string. index is the $n variable. * type and pname are the type and parameter name. * ----------------------------------------------------------------------------- */ static void replace_local_types(ParmList *p, const String *name, const String *rep) { SwigType *t; while (p) { t = Getattr(p, "type"); Replace(t, name, rep, DOH_REPLACE_ANY); p = nextSibling(p); } } static int check_locals(ParmList *p, const char *s) { while (p) { char *c = GetChar(p, "type"); if (strstr(c, s)) return 1; p = nextSibling(p); } return 0; } static int typemap_replace_vars(String *s, ParmList *locals, SwigType *type, SwigType *rtype, String *pname, String *lname, int index) { char var[512]; char *varname; SwigType *ftype; int bare_substitution_count = 0; Replaceall(s, "$typemap", "$TYPEMAP"); /* workaround for $type substitution below */ ftype = SwigType_typedef_resolve_all(type); if (!pname) pname = lname; { Parm *p; int rep = 0; p = locals; while (p) { if (Strchr(Getattr(p, "type"), '$')) rep = 1; p = nextSibling(p); } if (!rep) locals = 0; } sprintf(var, "$%d_", index); varname = &var[strlen(var)]; /* If the original datatype was an array. We're going to go through and substitute its array dimensions */ if (SwigType_isarray(type) || SwigType_isarray(ftype)) { String *size; int ndim; int i; if (SwigType_array_ndim(type) != SwigType_array_ndim(ftype)) type = ftype; ndim = SwigType_array_ndim(type); size = NewStringEmpty(); for (i = 0; i < ndim; i++) { String *dim = SwigType_array_getdim(type, i); if (index == 1) { char t[32]; sprintf(t, "$dim%d", i); Replace(s, t, dim, DOH_REPLACE_ANY); replace_local_types(locals, t, dim); } sprintf(varname, "dim%d", i); Replace(s, var, dim, DOH_REPLACE_ANY); replace_local_types(locals, var, dim); if (Len(size)) Putc('*', size); Append(size, dim); Delete(dim); } sprintf(varname, "size"); Replace(s, var, size, DOH_REPLACE_ANY); replace_local_types(locals, var, size); Delete(size); } /* Parameter name substitution */ if (index == 1) { Replace(s, "$parmname", pname, DOH_REPLACE_ANY); } strcpy(varname, "name"); Replace(s, var, pname, DOH_REPLACE_ANY); /* Type-related stuff */ { SwigType *star_type, *amp_type, *base_type, *lex_type; SwigType *ltype, *star_ltype, *amp_ltype; String *mangle, *star_mangle, *amp_mangle, *base_mangle, *base_name, *base_type_str; String *descriptor, *star_descriptor, *amp_descriptor; String *ts; char *sc; sc = Char(s); if (strstr(sc, "type") || check_locals(locals, "type")) { /* Given type : $type */ ts = SwigType_str(type, 0); if (index == 1) { Replace(s, "$type", ts, DOH_REPLACE_ANY); replace_local_types(locals, "$type", type); } strcpy(varname, "type"); Replace(s, var, ts, DOH_REPLACE_ANY); replace_local_types(locals, var, type); Delete(ts); sc = Char(s); } if (strstr(sc, "ltype") || check_locals(locals, "ltype")) { /* Local type: $ltype */ ltype = SwigType_ltype(type); ts = SwigType_str(ltype, 0); if (index == 1) { Replace(s, "$ltype", ts, DOH_REPLACE_ANY); replace_local_types(locals, "$ltype", ltype); } strcpy(varname, "ltype"); Replace(s, var, ts, DOH_REPLACE_ANY); replace_local_types(locals, var, ltype); Delete(ts); Delete(ltype); sc = Char(s); } if (strstr(sc, "mangle") || strstr(sc, "descriptor")) { /* Mangled type */ mangle = SwigType_manglestr(type); if (index == 1) Replace(s, "$mangle", mangle, DOH_REPLACE_ANY); strcpy(varname, "mangle"); Replace(s, var, mangle, DOH_REPLACE_ANY); descriptor = NewStringf("SWIGTYPE%s", mangle); if (index == 1) if (Replace(s, "$descriptor", descriptor, DOH_REPLACE_ANY)) SwigType_remember(type); strcpy(varname, "descriptor"); if (Replace(s, var, descriptor, DOH_REPLACE_ANY)) SwigType_remember(type); Delete(descriptor); Delete(mangle); } /* One pointer level removed */ /* This creates variables of the form $*n_type $*n_ltype */ if (SwigType_ispointer(ftype) || (SwigType_isarray(ftype)) || (SwigType_isreference(ftype)) || (SwigType_isrvalue_reference(ftype))) { if (!(SwigType_isarray(type) || SwigType_ispointer(type) || SwigType_isreference(type) || SwigType_isrvalue_reference(type))) { star_type = Copy(ftype); } else { star_type = Copy(type); } if (!(SwigType_isreference(star_type) || SwigType_isrvalue_reference(star_type))) { if (SwigType_isarray(star_type)) { SwigType_del_element(star_type); } else { SwigType_del_pointer(star_type); } ts = SwigType_str(star_type, 0); if (index == 1) { Replace(s, "$*type", ts, DOH_REPLACE_ANY); replace_local_types(locals, "$*type", star_type); } sprintf(varname, "$*%d_type", index); Replace(s, varname, ts, DOH_REPLACE_ANY); replace_local_types(locals, varname, star_type); Delete(ts); } else { SwigType_del_element(star_type); } star_ltype = SwigType_ltype(star_type); ts = SwigType_str(star_ltype, 0); if (index == 1) { Replace(s, "$*ltype", ts, DOH_REPLACE_ANY); replace_local_types(locals, "$*ltype", star_ltype); } sprintf(varname, "$*%d_ltype", index); Replace(s, varname, ts, DOH_REPLACE_ANY); replace_local_types(locals, varname, star_ltype); Delete(ts); Delete(star_ltype); star_mangle = SwigType_manglestr(star_type); if (index == 1) Replace(s, "$*mangle", star_mangle, DOH_REPLACE_ANY); sprintf(varname, "$*%d_mangle", index); Replace(s, varname, star_mangle, DOH_REPLACE_ANY); star_descriptor = NewStringf("SWIGTYPE%s", star_mangle); if (index == 1) if (Replace(s, "$*descriptor", star_descriptor, DOH_REPLACE_ANY)) SwigType_remember(star_type); sprintf(varname, "$*%d_descriptor", index); if (Replace(s, varname, star_descriptor, DOH_REPLACE_ANY)) SwigType_remember(star_type); Delete(star_descriptor); Delete(star_mangle); Delete(star_type); } else { /* TODO: Signal error if one of the $* substitutions is requested */ } /* One pointer level added */ amp_type = Copy(type); SwigType_add_pointer(amp_type); ts = SwigType_str(amp_type, 0); if (index == 1) { Replace(s, "$&type", ts, DOH_REPLACE_ANY); replace_local_types(locals, "$&type", amp_type); } sprintf(varname, "$&%d_type", index); Replace(s, varname, ts, DOH_REPLACE_ANY); replace_local_types(locals, varname, amp_type); Delete(ts); amp_ltype = SwigType_ltype(type); SwigType_add_pointer(amp_ltype); ts = SwigType_str(amp_ltype, 0); if (index == 1) { Replace(s, "$<ype", ts, DOH_REPLACE_ANY); replace_local_types(locals, "$<ype", amp_ltype); } sprintf(varname, "$&%d_ltype", index); Replace(s, varname, ts, DOH_REPLACE_ANY); replace_local_types(locals, varname, amp_ltype); Delete(ts); Delete(amp_ltype); amp_mangle = SwigType_manglestr(amp_type); if (index == 1) Replace(s, "$&mangle", amp_mangle, DOH_REPLACE_ANY); sprintf(varname, "$&%d_mangle", index); Replace(s, varname, amp_mangle, DOH_REPLACE_ANY); amp_descriptor = NewStringf("SWIGTYPE%s", amp_mangle); if (index == 1) if (Replace(s, "$&descriptor", amp_descriptor, DOH_REPLACE_ANY)) SwigType_remember(amp_type); sprintf(varname, "$&%d_descriptor", index); if (Replace(s, varname, amp_descriptor, DOH_REPLACE_ANY)) SwigType_remember(amp_type); Delete(amp_descriptor); Delete(amp_mangle); Delete(amp_type); /* Base type */ if (SwigType_isarray(type)) { base_type = Copy(type); Delete(SwigType_pop_arrays(base_type)); } else { base_type = SwigType_base(type); } base_type_str = SwigType_str(base_type, 0); base_name = SwigType_namestr(base_type_str); if (index == 1) { Replace(s, "$basetype", base_name, DOH_REPLACE_ANY); replace_local_types(locals, "$basetype", base_name); } strcpy(varname, "basetype"); Replace(s, var, base_type_str, DOH_REPLACE_ANY); replace_local_types(locals, var, base_name); base_mangle = SwigType_manglestr(base_type); if (index == 1) Replace(s, "$basemangle", base_mangle, DOH_REPLACE_ANY); strcpy(varname, "basemangle"); Replace(s, var, base_mangle, DOH_REPLACE_ANY); Delete(base_mangle); Delete(base_name); Delete(base_type_str); Delete(base_type); lex_type = SwigType_base(rtype); if (index == 1) Replace(s, "$lextype", lex_type, DOH_REPLACE_ANY); strcpy(varname, "lextype"); Replace(s, var, lex_type, DOH_REPLACE_ANY); Delete(lex_type); } /* Replace any $n. with (&n)-> */ { char temp[64]; sprintf(var, "$%d.", index); sprintf(temp, "(&$%d)->", index); Replace(s, var, temp, DOH_REPLACE_ANY); } /* Replace the bare $n variable */ sprintf(var, "$%d", index); bare_substitution_count = Replace(s, var, lname, DOH_REPLACE_NUMBER_END); Delete(ftype); return bare_substitution_count; } /* ------------------------------------------------------------------------ * static typemap_locals() * * Takes a string, a parameter list and a wrapper function argument and * creates the local variables. * ------------------------------------------------------------------------ */ static void typemap_locals(String *s, ParmList *l, Wrapper *f, int argnum) { Parm *p; char *new_name; p = l; while (p) { SwigType *pt = Getattr(p, "type"); SwigType *at = SwigType_alttype(pt, 1); String *pn = Getattr(p, "name"); String *value = Getattr(p, "value"); if (at) pt = at; if (pn) { if (Len(pn) > 0) { String *str; int isglobal = 0; str = NewStringEmpty(); if (strncmp(Char(pn), "_global_", 8) == 0) { isglobal = 1; } /* If the user gave us $type as the name of the local variable, we'll use the passed datatype instead */ if ((argnum >= 0) && (!isglobal)) { Printf(str, "%s%d", pn, argnum); } else { Append(str, pn); } if (isglobal && Wrapper_check_local(f, str)) { p = nextSibling(p); Delete(str); if (at) Delete(at); continue; } if (value) { String *pstr = SwigType_str(pt, str); new_name = Wrapper_new_localv(f, str, pstr, "=", value, NIL); Delete(pstr); } else { String *pstr = SwigType_str(pt, str); new_name = Wrapper_new_localv(f, str, pstr, NIL); Delete(pstr); } if (!isglobal) { /* Substitute */ Replace(s, pn, new_name, DOH_REPLACE_ID | DOH_REPLACE_NOQUOTE); } Delete(str); } } p = nextSibling(p); if (at) Delete(at); } } /* ----------------------------------------------------------------------------- * typemap_warn() * * If any warning message is attached to this parameter's "tmap::warning" * attribute, return the warning message (special variables will need expanding * before displaying the warning). * ----------------------------------------------------------------------------- */ static String *typemap_warn(const_String_or_char_ptr tmap_method, Parm *p) { String *temp = NewStringf("%s:warning", tmap_method); String *w = Getattr(p, typemap_method_name(temp)); Delete(temp); return w ? Copy(w) : 0; } /* ----------------------------------------------------------------------------- * Swig_typemap_lookup() * * Attach one or more typemaps to a node and optionally generate the typemap contents * into the wrapper. * * Looks for a typemap matching the given type and name and attaches the typemap code * and any typemap attributes to the provided node. * * The node should contain the "type" and "name" attributes for the typemap match on. * input. The typemap code and typemap attribute values are attached onto the node * prefixed with "tmap:". For example with tmap_method="in", the typemap code can be retrieved * with a call to Getattr(node, "tmap:in") (this is also the string returned) and the * "noblock" attribute can be retrieved with a call to Getattr(node, "tmap:in:noblock"). * * tmap_method - typemap method, eg "in", "out", "newfree" * node - the node to attach the typemap and typemap attributes to * lname - name of variable to substitute $1, $2 etc for * f - wrapper code to generate into if non null * actioncode - code to generate into f before the out typemap code, unless * the optimal attribute is set in the out typemap in which case * $1 in the out typemap will be replaced by the code in actioncode. * ----------------------------------------------------------------------------- */ static String *Swig_typemap_lookup_impl(const_String_or_char_ptr tmap_method, Node *node, const_String_or_char_ptr lname, Wrapper *f, String *actioncode) { SwigType *type; SwigType *mtype = 0; String *pname; String *qpname = 0; String *noscope_pname = 0; Hash *tm = 0; String *s = 0; String *sdef = 0; String *warning = 0; ParmList *locals; ParmList *kw; char temp[256]; String *symname; String *cname = 0; String *clname = 0; char *cmethod = Char(tmap_method); int optimal_attribute = 0; int optimal_substitution = 0; int delete_optimal_attribute = 0; int num_substitutions = 0; SwigType *matchtype = 0; type = Getattr(node, "type"); if (!type) return sdef; /* Special hook (hack!). Check for the 'ref' feature and add code it contains to any 'newfree' typemap code. * We could choose to put this hook into a number of different typemaps, not necessarily 'newfree'... * Rather confusingly 'newfree' is used to release memory and the 'ref' feature is used to add in memory references - yuck! */ if (Cmp(tmap_method, "newfree") == 0) { String *base = SwigType_base(type); Node *typenode = Swig_symbol_clookup(base, 0); if (typenode) sdef = Swig_ref_call(typenode, lname); Delete(base); } pname = Getattr(node, "name"); noscope_pname = Copy(pname); if (pname && Getattr(node, "sym:symtab")) { /* Add on a qualified name search for any symbol in the symbol table, for example: * struct Foo { * int *foo(int bar) -> Foo::foo * }; * Note that if node is a parameter (Parm *) then there will be no symbol table attached to the Parm *. */ String *qsn; if (Swig_scopename_check(pname)) { /* sometimes pname is qualified, so we remove all the scope for the lookup */ Delete(noscope_pname); noscope_pname = Swig_scopename_last(pname); /* Printf(stdout, "Removed scope: %s => %s\n", pname, noscope_pname); */ } qsn = Swig_symbol_qualified(node); if (qsn && Len(qsn)) { qpname = NewStringf("%s::%s", qsn, noscope_pname); Delete(qsn); } } tm = typemap_search(tmap_method, type, noscope_pname, qpname, &mtype, node); if (typemap_search_debug) debug_search_result_display(tm); if (typemaps_used_debug && tm) { String *typestr = SwigType_str(type, qpname ? qpname : pname); Swig_diagnostic(Getfile(node), Getline(node), "Typemap for %s (%s) : %%%s\n", typestr, tmap_method, Getattr(tm, "source")); assert(Getfile(node) && Len(Getfile(node)) > 0); /* Missing file and line numbering information */ Delete(typestr); } Delete(qpname); qpname = 0; Delete(noscope_pname); noscope_pname = 0; if (!tm) return sdef; s = Getattr(tm, "code"); if (!s) return sdef; /* Empty typemap. No match */ if (Cmp(s, "pass") == 0) return sdef; s = Copy(s); /* Make a local copy of the typemap code */ /* Look in the "out" typemap for the "optimal" attribute */ if (Cmp(cmethod, "out") == 0) { kw = Getattr(tm, "kwargs"); while (kw) { if (Cmp(Getattr(kw, "name"), "optimal") == 0) { optimal_attribute = GetFlag(kw, "value"); break; } kw = nextSibling(kw); } } if (optimal_attribute) { /* Note: "out" typemap is the only typemap that will have the "optimal" attribute set. * If f and actioncode are NULL, then the caller is just looking to attach the "out" attributes * ie, not use the typemap code, otherwise both f and actioncode must be non null. */ if (actioncode) { const String *result_equals = NewStringf("%s = ", Swig_cresult_name()); clname = Copy(actioncode); /* check that the code in the typemap can be used in this optimal way. * The code should be in the form "result = ...;\n". We need to extract * the "..." part. This may not be possible for various reasons, eg * code added by %exception. This optimal code generation is bit of a * hack and circumvents the normal requirement for a temporary variable * to hold the result returned from a wrapped function call. */ if (Strncmp(clname, result_equals, 9) == 0) { int numreplacements = Replace(clname, result_equals, "", DOH_REPLACE_ID_BEGIN); if (numreplacements == 1) { numreplacements = Replace(clname, ";\n", "", DOH_REPLACE_ID_END); if (numreplacements == 1) { if (Strchr(clname, ';') == 0) { lname = clname; actioncode = 0; optimal_substitution = 1; } } } } if (!optimal_substitution) { Swig_warning(WARN_TYPEMAP_OUT_OPTIMAL_IGNORED, Getfile(node), Getline(node), "Method %s usage of the optimal attribute ignored\n", Swig_name_decl(node)); Swig_warning(WARN_TYPEMAP_OUT_OPTIMAL_IGNORED, Getfile(s), Getline(s), "in the out typemap as the following cannot be used to generate optimal code: %s\n", clname); delete_optimal_attribute = 1; } } else { assert(!f); } } if (actioncode) { assert(f); Append(f->code, actioncode); } /* emit local variables declared in typemap, eg emit declarations for aa and bb in: * %typemap(in) foo (int aa, int bb) "..." */ locals = Getattr(tm, "locals"); if (locals) locals = CopyParmList(locals); if (pname) { if (SwigType_istemplate(pname)) { cname = SwigType_namestr(pname); pname = cname; } } if (SwigType_istemplate((char *) lname)) { clname = SwigType_namestr((char *) lname); lname = clname; } matchtype = mtype && SwigType_isarray(mtype) ? mtype : type; num_substitutions = typemap_replace_vars(s, locals, matchtype, type, pname, (char *) lname, 1); if (optimal_substitution && num_substitutions > 1) { Swig_warning(WARN_TYPEMAP_OUT_OPTIMAL_MULTIPLE, Getfile(node), Getline(node), "Multiple calls to %s might be generated due to\n", Swig_name_decl(node)); Swig_warning(WARN_TYPEMAP_OUT_OPTIMAL_MULTIPLE, Getfile(s), Getline(s), "optimal attribute usage in the out typemap.\n"); } if (locals && f) { typemap_locals(s, locals, f, -1); } { ParmList *parm_sublist = NewParmWithoutFileLineInfo(type, pname); Setattr(parm_sublist, "lname", lname); replace_embedded_typemap(s, parm_sublist, f, tm); Delete(parm_sublist); } /* Attach kwargs - ie the typemap attributes */ kw = Getattr(tm, "kwargs"); while (kw) { String *value = Copy(Getattr(kw, "value")); String *kwtype = Getattr(kw, "type"); char *ckwname = Char(Getattr(kw, "name")); { /* Expand special variables in typemap attributes. */ SwigType *ptype = Getattr(node, "type"); String *pname = Getattr(node, "name"); SwigType *mtype = Getattr(node, "tmap:match"); SwigType *matchtype = mtype ? mtype : ptype; ParmList *parm_sublist; typemap_replace_vars(value, NULL, matchtype, ptype, pname, (char *)lname, 1); /* Expand special variable macros (embedded typemaps) in typemap attributes. */ parm_sublist = NewParmWithoutFileLineInfo(ptype, pname); Setattr(parm_sublist, "lname", lname); replace_embedded_typemap(value, parm_sublist, NULL, tm); Delete(parm_sublist); } if (kwtype) { String *mangle = Swig_string_mangle(kwtype); Append(value, mangle); Delete(mangle); } sprintf(temp, "%s:%s", cmethod, ckwname); Setattr(node, typemap_method_name(temp), value); Delete(value); kw = nextSibling(kw); } if (delete_optimal_attribute) Delattr(node, "tmap:out:optimal"); Replace(s, "$name", pname, DOH_REPLACE_ANY); symname = Getattr(node, "sym:name"); if (symname) Replace(s, "$symname", symname, DOH_REPLACE_ANY); Setattr(node, typemap_method_name(tmap_method), s); if (locals) { sprintf(temp, "%s:locals", cmethod); Setattr(node, typemap_method_name(temp), locals); Delete(locals); } if (Checkattr(tm, "type", "SWIGTYPE")) { sprintf(temp, "%s:SWIGTYPE", cmethod); Setattr(node, typemap_method_name(temp), "1"); } /* Print warnings, if any */ warning = typemap_warn(cmethod, node); if (warning) { typemap_replace_vars(warning, 0, matchtype, type, pname, (char *) lname, 1); Replace(warning, "$name", pname, DOH_REPLACE_ANY); if (symname) Replace(warning, "$symname", symname, DOH_REPLACE_ANY); Swig_warning(0, Getfile(node), Getline(node), "%s\n", warning); Delete(warning); } /* Look for code fragments */ { String *fragment; sprintf(temp, "%s:fragment", cmethod); fragment = Getattr(node, typemap_method_name(temp)); if (fragment) { String *fname = Copy(fragment); Setfile(fname, Getfile(node)); Setline(fname, Getline(node)); Swig_fragment_emit(fname); Delete(fname); } } Delete(cname); Delete(clname); Delete(mtype); if (sdef) { /* put 'ref' and 'newfree' codes together */ String *p = NewStringf("%s\n%s", sdef, s); Delete(s); Delete(sdef); s = p; } Delete(actioncode); return s; } String *Swig_typemap_lookup_out(const_String_or_char_ptr tmap_method, Node *node, const_String_or_char_ptr lname, Wrapper *f, String *actioncode) { assert(actioncode); assert(Cmp(tmap_method, "out") == 0); return Swig_typemap_lookup_impl(tmap_method, node, lname, f, actioncode); } String *Swig_typemap_lookup(const_String_or_char_ptr tmap_method, Node *node, const_String_or_char_ptr lname, Wrapper *f) { return Swig_typemap_lookup_impl(tmap_method, node, lname, f, 0); } /* ----------------------------------------------------------------------------- * typemap_attach_kwargs() * * If this hash (tm) contains a linked list of parameters under its "kwargs" * attribute, add keys for each of those named keyword arguments to this * parameter for later use. * For example, attach the typemap attributes to firstp (first parameter in parameter list): * %typemap(in, foo="xyz") ... * A new attribute called "tmap:in:foo" with value "xyz" is attached to firstp. * Also expands special variables and special variable macros in the typemap attributes. * ----------------------------------------------------------------------------- */ static void typemap_attach_kwargs(Hash *tm, const_String_or_char_ptr tmap_method, Parm *firstp, int nmatch) { String *temp = NewStringEmpty(); Parm *kw = Getattr(tm, "kwargs"); while (kw) { String *value = Copy(Getattr(kw, "value")); String *type = Getattr(kw, "type"); int i; Parm *p = firstp; /* Expand special variables */ for (i = 0; i < nmatch; i++) { SwigType *type = Getattr(p, "type"); String *pname = Getattr(p, "name"); String *lname = Getattr(p, "lname"); SwigType *mtype = Getattr(p, "tmap:match"); SwigType *matchtype = mtype ? mtype : type; typemap_replace_vars(value, NULL, matchtype, type, pname, lname, i + 1); p = nextSibling(p); } /* Expand special variable macros (embedded typemaps). * Special variable are expanded first above as they might be used in the special variable macros. * For example: $typemap(imtype, $2_type). */ p = firstp; for (i = 0; i < nmatch; i++) { SwigType *type = Getattr(p, "type"); String *pname = Getattr(p, "name"); String *lname = Getattr(p, "lname"); ParmList *parm_sublist = NewParmWithoutFileLineInfo(type, pname); Setattr(parm_sublist, "lname", lname); replace_embedded_typemap(value, parm_sublist, NULL, tm); p = nextSibling(p); } if (type) { Hash *v = NewHash(); Setattr(v, "type", type); Setattr(v, "value", value); Delete(value); value = v; } Clear(temp); Printf(temp, "%s:%s", tmap_method, Getattr(kw, "name")); Setattr(firstp, typemap_method_name(temp), value); Delete(value); kw = nextSibling(kw); } Clear(temp); Printf(temp, "%s:match_type", tmap_method); Setattr(firstp, typemap_method_name(temp), Getattr(tm, "type")); Delete(temp); } static void typemap_emit_code_fragments(const_String_or_char_ptr tmap_method, Parm *p) { String *temp = NewStringf("%s:fragment", tmap_method); String *f = Getattr(p, typemap_method_name(temp)); if (f) { String *fname = Copy(f); Setfile(fname, Getfile(p)); Setline(fname, Getline(p)); Swig_fragment_emit(fname); Delete(fname); } Delete(temp); } static String *typemap_get_option(Hash *tm, const_String_or_char_ptr name) { Parm *kw = Getattr(tm, "kwargs"); while (kw) { String *kname = Getattr(kw, "name"); if (Equal(kname, name)) { return Getattr(kw, "value"); } kw = nextSibling(kw); } return 0; } /* ----------------------------------------------------------------------------- * Swig_typemap_attach_parms() * * Given a parameter list, this function attaches all of the typemaps and typemap * attributes to the parameter for each type in the parameter list. * * This function basically provides the typemap code and typemap attribute values as * attributes on each parameter prefixed with "tmap:". For example with tmap_method="in", the typemap * code can be retrieved for the first parameter with a call to Getattr(parm, "tmap:in") * and the "numinputs" attribute can be retrieved with a call to Getattr(parm, "tmap:in:numinputs"). * * tmap_method - typemap method, eg "in", "out", "newfree" * parms - parameter list to attach each typemap and all typemap attributes * f - wrapper code to generate into if non null * ----------------------------------------------------------------------------- */ void Swig_typemap_attach_parms(const_String_or_char_ptr tmap_method, ParmList *parms, Wrapper *f) { Parm *p, *firstp; Hash *tm; int nmatch = 0; int i; String *s; String *warning = 0; ParmList *locals; int argnum = 0; char temp[256]; char *cmethod = Char(tmap_method); String *kwmatch = 0; p = parms; #ifdef SWIG_DEBUG Printf(stdout, "Swig_typemap_attach_parms: %s\n", tmap_method); #endif while (p) { argnum++; nmatch = 0; #ifdef SWIG_DEBUG Printf(stdout, "parms: %s %s %s\n", tmap_method, Getattr(p, "name"), Getattr(p, "type")); #endif tm = typemap_search_multi(tmap_method, p, &nmatch); #ifdef SWIG_DEBUG if (tm) Printf(stdout, "found: %s\n", tm); #endif if (!tm) { p = nextSibling(p); continue; } /* Check if the typemap requires to match the type of another typemap, for example: %typemap(in) SWIGTYPE * (int var) {...} %typemap(freearg,match="in") SWIGTYPE * {if (var$argnum) ...} here, the freearg typemap requires the "in" typemap to match, or the 'var$argnum' variable will not exist. */ kwmatch = typemap_get_option(tm, "match"); if (kwmatch) { String *tmname = NewStringf("tmap:%s", kwmatch); String *tmin = Getattr(p, tmname); Delete(tmname); #ifdef SWIG_DEBUG if (tm) Printf(stdout, "matching: %s\n", kwmatch); #endif if (tmin) { String *tmninp = NewStringf("tmap:%s:numinputs", kwmatch); String *ninp = Getattr(p, tmninp); Delete(tmninp); if (ninp && Equal(ninp, "0")) { p = nextSibling(p); continue; } else { SwigType *typetm = Getattr(tm, "type"); String *temp = NewStringf("tmap:%s:match_type", kwmatch); SwigType *typein = Getattr(p, temp); Delete(temp); if (!Equal(typein, typetm)) { p = nextSibling(p); continue; } else { int nnmatch; Hash *tmapin = typemap_search_multi(kwmatch, p, &nnmatch); String *tmname = Getattr(tm, "pname"); String *tnname = Getattr(tmapin, "pname"); if (!(tmname && tnname && Equal(tmname, tnname)) && !(!tmname && !tnname)) { p = nextSibling(p); continue; } } } } else { p = nextSibling(p); continue; } } s = Getattr(tm, "code"); if (!s) { p = nextSibling(p); continue; } #ifdef SWIG_DEBUG if (s) Printf(stdout, "code: %s\n", s); #endif /* Empty typemap. No match */ if (Cmp(s, "pass") == 0) { p = nextSibling(p); continue; } s = Copy(s); locals = Getattr(tm, "locals"); if (locals) locals = CopyParmList(locals); firstp = p; #ifdef SWIG_DEBUG Printf(stdout, "nmatch: %d\n", nmatch); #endif for (i = 0; i < nmatch; i++) { SwigType *type = Getattr(p, "type"); String *pname = Getattr(p, "name"); String *lname = Getattr(p, "lname"); SwigType *mtype = Getattr(p, "tmap:match"); SwigType *matchtype = mtype ? mtype : type; typemap_replace_vars(s, locals, matchtype, type, pname, lname, i + 1); if (mtype) Delattr(p, "tmap:match"); if (Checkattr(tm, "type", "SWIGTYPE")) { sprintf(temp, "%s:SWIGTYPE", cmethod); Setattr(p, typemap_method_name(temp), "1"); } p = nextSibling(p); } if (locals && f) { typemap_locals(s, locals, f, argnum); } replace_embedded_typemap(s, firstp, f, tm); /* Attach attributes to object */ #ifdef SWIG_DEBUG Printf(stdout, "attach: %s %s %s\n", Getattr(firstp, "name"), typemap_method_name(tmap_method), s); #endif Setattr(firstp, typemap_method_name(tmap_method), s); /* Code object */ if (locals) { sprintf(temp, "%s:locals", cmethod); Setattr(firstp, typemap_method_name(temp), locals); Delete(locals); } /* Attach a link to the next parameter. Needed for multimaps */ sprintf(temp, "%s:next", cmethod); Setattr(firstp, typemap_method_name(temp), p); /* Attach kwargs */ typemap_attach_kwargs(tm, tmap_method, firstp, nmatch); /* Replace the argument number */ sprintf(temp, "%d", argnum); Replace(s, "$argnum", temp, DOH_REPLACE_ANY); /* Print warnings, if any */ warning = typemap_warn(tmap_method, firstp); if (warning) { SwigType *type = Getattr(firstp, "type"); String *pname = Getattr(firstp, "name"); String *lname = Getattr(firstp, "lname"); SwigType *mtype = Getattr(firstp, "tmap:match"); SwigType *matchtype = mtype ? mtype : type; typemap_replace_vars(warning, 0, matchtype, type, pname, lname, 1); Replace(warning, "$argnum", temp, DOH_REPLACE_ANY); Swig_warning(0, Getfile(firstp), Getline(firstp), "%s\n", warning); Delete(warning); } /* Look for code fragments */ typemap_emit_code_fragments(tmap_method, firstp); /* increase argnum to consider numinputs */ argnum += nmatch - 1; Delete(s); #ifdef SWIG_DEBUG Printf(stdout, "res: %s %s %s\n", Getattr(firstp, "name"), typemap_method_name(tmap_method), Getattr(firstp, typemap_method_name(tmap_method))); #endif } #ifdef SWIG_DEBUG Printf(stdout, "Swig_typemap_attach_parms: end\n"); #endif } /* Splits the arguments of an embedded typemap */ static List *split_embedded_typemap(String *s) { List *args = 0; char *c, *start; int level = 0; int angle_level = 0; int leading = 1; args = NewList(); c = strchr(Char(s), '('); assert(c); c++; start = c; while (*c) { if (*c == '\"') { c++; while (*c) { if (*c == '\\') { c++; } else { if (*c == '\"') break; } c++; } } if ((level == 0) && angle_level == 0 && ((*c == ',') || (*c == ')'))) { String *tmp = NewStringWithSize(start, (int)(c - start)); Append(args, tmp); Delete(tmp); start = c + 1; leading = 1; if (*c == ')') break; c++; continue; } if (*c == '(') level++; if (*c == ')') level--; if (*c == '<') angle_level++; if (*c == '>') angle_level--; if (isspace((int) *c) && leading) start++; if (!isspace((int) *c)) leading = 0; c++; } return args; } /* ----------------------------------------------------------------------------- * Swig_typemap_replace_embedded_typemap() * * For special variable macro $typemap(...) expansion outside of typemaps. * Only limited usage works as most typemap special variables ($1, $input etc) * are not expanded correctly outside of typemaps. * ----------------------------------------------------------------------------- */ void Swig_typemap_replace_embedded_typemap(String *s, Node *file_line_node) { Setfile(s, Getfile(file_line_node)); Setline(s, Getline(file_line_node)); Replaceall(s, "$typemap", "$TYPEMAP"); replace_embedded_typemap(s, 0, 0, file_line_node); } /* ----------------------------------------------------------------------------- * replace_embedded_typemap() * * This function replaces the special variable macro $typemap(...) with typemap * code. The general form of $typemap is as follows: * * $typemap(method, typelist, var1=value, var2=value, ...) * * where varx parameters are optional and undocumented; they were used in an earlier version of $typemap. * A search is made using the typemap matching rules of form: * * %typemap(method) typelist {...} * * and if found will substitute in the typemap contents, making appropriate variable replacements. * * For example: * $typemap(in, int) # simple usage matching %typemap(in) int { ... } * $typemap(in, int b) # simple usage matching %typemap(in) int b { ... } or above %typemap * $typemap(in, (Foo a, int b)) # multi-argument typemap matching %typemap(in) (Foo a, int b) {...} * ----------------------------------------------------------------------------- */ static void replace_embedded_typemap(String *s, ParmList *parm_sublist, Wrapper *f, Node *file_line_node) { char *start = 0; while ((start = strstr(Char(s), "$TYPEMAP("))) { /* note $typemap capitalisation to $TYPEMAP hack */ /* Gather the parameters */ char *end = 0, *c; int level = 0; String *dollar_typemap; int syntax_error = 1; c = start; while (*c) { if (*c == '(') level++; if (*c == ')') { level--; if (level == 0) { end = c + 1; break; } } c++; } if (end) { dollar_typemap = NewStringWithSize(start, (int)((end - start))); syntax_error = 0; } else { dollar_typemap = NewStringWithSize(start, (int)((c - start))); } if (!syntax_error) { List *l; String *tmap_method; Hash *vars; syntax_error = 1; /* Split apart each parameter in $typemap(...) */ l = split_embedded_typemap(dollar_typemap); if (Len(l) >= 2) { ParmList *to_match_parms; tmap_method = Getitem(l, 0); /* the second parameter might contain multiple sub-parameters for multi-argument * typemap matching, so split these parameters apart */ to_match_parms = Swig_cparse_parms(Getitem(l, 1), file_line_node); if (to_match_parms) { Parm *p = to_match_parms; Parm *sub_p = parm_sublist; String *empty_string = NewStringEmpty(); String *lname = empty_string; while (p) { if (sub_p) { lname = Getattr(sub_p, "lname"); sub_p = nextSibling(sub_p); } Setattr(p, "lname", lname); p = nextSibling(p); } Delete(empty_string); } /* process optional extra parameters - the variable replacements (undocumented) */ vars = NewHash(); { int i, ilen; ilen = Len(l); for (i = 2; i < ilen; i++) { String *parm = Getitem(l, i); char *eq = strchr(Char(parm), '='); char *c = Char(parm); if (eq && (eq - c > 0)) { String *name = NewStringWithSize(c, (int)(eq - c)); String *value = NewString(eq + 1); Insert(name, 0, "$"); Setattr(vars, name, value); } else { to_match_parms = 0; /* error - variable replacement parameters must be of form varname=value */ } } } /* Perform a typemap search */ if (to_match_parms) { static int already_substituting = 0; String *tm; String *attr; int match = 0; #ifdef SWIG_DEBUG Printf(stdout, "Swig_typemap_attach_parms: embedded\n"); #endif if (already_substituting < 10) { already_substituting++; if ((in_typemap_search_multi == 0) && typemap_search_debug) { String *dtypemap = NewString(dollar_typemap); Replaceall(dtypemap, "$TYPEMAP", "$typemap"); Printf(stdout, " Containing: %s\n", dtypemap); Delete(dtypemap); } Swig_typemap_attach_parms(tmap_method, to_match_parms, f); already_substituting--; /* Look for the typemap code */ attr = NewStringf("tmap:%s", tmap_method); tm = Getattr(to_match_parms, attr); if (tm) { Printf(attr, "%s", ":next"); /* fail if multi-argument lookup requested in $typemap(...) and the lookup failed */ if (!Getattr(to_match_parms, attr)) { /* Replace parameter variables */ Iterator ki; for (ki = First(vars); ki.key; ki = Next(ki)) { Replace(tm, ki.key, ki.item, DOH_REPLACE_ANY); } /* offer the target language module the chance to make special variable substitutions */ Language_replace_special_variables(tmap_method, tm, to_match_parms); /* finish up - do the substitution */ Replace(s, dollar_typemap, tm, DOH_REPLACE_ANY); Delete(tm); match = 1; } } if (!match) { String *dtypemap = NewString(dollar_typemap); Replaceall(dtypemap, "$TYPEMAP", "$typemap"); Swig_error(Getfile(s), Getline(s), "No typemap found for %s\n", dtypemap); Delete(dtypemap); } Delete(attr); } else { /* Simple recursive call check to prevent infinite recursion - this strategy only allows a limited * number of calls by a embedded typemaps to other embedded typemaps though */ String *dtypemap = NewString(dollar_typemap); Replaceall(dtypemap, "$TYPEMAP", "$typemap"); Swig_error(Getfile(s), Getline(s), "Likely recursive $typemap calls containing %s. Use -debug-tmsearch to debug.\n", dtypemap); Delete(dtypemap); } syntax_error = 0; } Delete(vars); } Delete(l); } if (syntax_error) { String *dtypemap = NewString(dollar_typemap); Replaceall(dtypemap, "$TYPEMAP", "$typemap"); Swig_error(Getfile(s), Getline(s), "Syntax error in: %s\n", dtypemap); Delete(dtypemap); } Replace(s, dollar_typemap, "", DOH_REPLACE_ANY); Delete(dollar_typemap); } } /* ----------------------------------------------------------------------------- * Swig_typemap_debug() * * Display all typemaps * ----------------------------------------------------------------------------- */ void Swig_typemap_debug() { int nesting_level = 2; Printf(stdout, "---[ typemaps ]--------------------------------------------------------------\n"); Swig_print(typemaps, nesting_level); Printf(stdout, "-----------------------------------------------------------------------------\n"); } /* ----------------------------------------------------------------------------- * Swig_typemap_search_debug_set() * * Turn on typemap searching debug display * ----------------------------------------------------------------------------- */ void Swig_typemap_search_debug_set(void) { typemap_search_debug = 1; } /* ----------------------------------------------------------------------------- * Swig_typemap_used_debug_set() * * Turn on typemaps used debug display * ----------------------------------------------------------------------------- */ void Swig_typemap_used_debug_set(void) { typemaps_used_debug = 1; } /* ----------------------------------------------------------------------------- * Swig_typemap_register_debug_set() * * Turn on typemaps used debug display * ----------------------------------------------------------------------------- */ void Swig_typemap_register_debug_set(void) { typemap_register_debug = 1; } swig-4.0.1/Source/Swig/include.c0000644000175000017500000002616613527063513016323 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * include.c * * The functions in this file are used to manage files in the SWIG library. * General purpose functions for opening, including, and retrieving pathnames * are provided. * ----------------------------------------------------------------------------- */ #include "swig.h" static List *directories = 0; /* List of include directories */ static String *lastpath = 0; /* Last file that was included */ static List *pdirectories = 0; /* List of pushed directories */ static int dopush = 1; /* Whether to push directories */ static int file_debug = 0; /* This functions determine whether to push/pop dirs in the preprocessor */ void Swig_set_push_dir(int push) { dopush = push; } int Swig_get_push_dir(void) { return dopush; } /* ----------------------------------------------------------------------------- * Swig_add_directory() * * Adds a directory to the SWIG search path. * ----------------------------------------------------------------------------- */ List *Swig_add_directory(const_String_or_char_ptr dirname) { String *adirname; if (!directories) directories = NewList(); assert(directories); if (dirname) { adirname = NewString(dirname); Append(directories,adirname); Delete(adirname); } return directories; } /* ----------------------------------------------------------------------------- * Swig_push_directory() * * Inserts a directory at the front of the SWIG search path. This is used by * the preprocessor to grab files in the same directory as other included files. * ----------------------------------------------------------------------------- */ void Swig_push_directory(const_String_or_char_ptr dirname) { String *pdirname; if (!Swig_get_push_dir()) return; if (!pdirectories) pdirectories = NewList(); assert(pdirectories); pdirname = NewString(dirname); assert(pdirname); Insert(pdirectories,0,pdirname); Delete(pdirname); } /* ----------------------------------------------------------------------------- * Swig_pop_directory() * * Pops a directory off the front of the SWIG search path. This is used by * the preprocessor. * ----------------------------------------------------------------------------- */ void Swig_pop_directory(void) { if (!Swig_get_push_dir()) return; if (!pdirectories) return; Delitem(pdirectories, 0); } /* ----------------------------------------------------------------------------- * Swig_last_file() * * Returns the full pathname of the last file opened. * ----------------------------------------------------------------------------- */ String *Swig_last_file(void) { assert(lastpath); return lastpath; } /* ----------------------------------------------------------------------------- * Swig_search_path_any() * * Returns a list of the current search paths. * ----------------------------------------------------------------------------- */ static List *Swig_search_path_any(int syspath) { String *filename; List *slist; int i, ilen; slist = NewList(); assert(slist); filename = NewStringEmpty(); assert(filename); #ifdef MACSWIG Printf(filename, "%s", SWIG_FILE_DELIMITER); #else Printf(filename, ".%s", SWIG_FILE_DELIMITER); #endif Append(slist, filename); Delete(filename); /* If there are any pushed directories. Add them first */ if (pdirectories) { ilen = Len(pdirectories); for (i = 0; i < ilen; i++) { filename = NewString(Getitem(pdirectories,i)); Append(filename,SWIG_FILE_DELIMITER); Append(slist,filename); Delete(filename); } } /* Add system directories next */ ilen = Len(directories); for (i = 0; i < ilen; i++) { filename = NewString(Getitem(directories,i)); Append(filename,SWIG_FILE_DELIMITER); if (syspath) { /* If doing a system include, put the system directories first */ Insert(slist,i,filename); } else { /* Otherwise, just put the system directories after the pushed directories (if any) */ Append(slist,filename); } Delete(filename); } return slist; } List *Swig_search_path() { return Swig_search_path_any(0); } /* ----------------------------------------------------------------------------- * Swig_open() * * open a file, optionally looking for it in the include path. Returns an open * FILE * on success. * ----------------------------------------------------------------------------- */ static FILE *Swig_open_file(const_String_or_char_ptr name, int sysfile, int use_include_path) { FILE *f; String *filename; List *spath = 0; char *cname; int i, ilen, nbytes; char bom[3]; if (!directories) directories = NewList(); assert(directories); cname = Char(name); filename = NewString(cname); assert(filename); if (file_debug) { Printf(stdout, " Open: %s\n", filename); } f = fopen(Char(filename), "r"); if (!f && use_include_path) { spath = Swig_search_path_any(sysfile); ilen = Len(spath); for (i = 0; i < ilen; i++) { Clear(filename); Printf(filename, "%s%s", Getitem(spath, i), cname); f = fopen(Char(filename), "r"); if (f) break; } Delete(spath); } if (f) { Delete(lastpath); lastpath = filename; /* Skip the UTF-8 BOM if it's present */ nbytes = (int)fread(bom, 1, 3, f); if (nbytes == 3 && bom[0] == (char)0xEF && bom[1] == (char)0xBB && bom[2] == (char)0xBF) { /* skip */ } else { fseek(f, 0, SEEK_SET); } } return f; } /* Open a file - searching the include paths to find it */ FILE *Swig_include_open(const_String_or_char_ptr name) { return Swig_open_file(name, 0, 1); } /* Open a file - does not use include paths to find it */ FILE *Swig_open(const_String_or_char_ptr name) { return Swig_open_file(name, 0, 0); } /* ----------------------------------------------------------------------------- * Swig_read_file() * * Reads data from an open FILE * and returns it as a string. * ----------------------------------------------------------------------------- */ String *Swig_read_file(FILE *f) { int len; char buffer[4096]; String *str = NewStringEmpty(); assert(str); while (fgets(buffer, 4095, f)) { Append(str, buffer); } len = Len(str); /* Add a newline if not present on last line -- the preprocessor seems to * rely on \n and not EOF terminating lines */ if (len) { char *cstr = Char(str); if (cstr[len - 1] != '\n') { Append(str, "\n"); } } return str; } /* ----------------------------------------------------------------------------- * Swig_include() * * Opens a file and returns it as a string. * ----------------------------------------------------------------------------- */ static String *Swig_include_any(const_String_or_char_ptr name, int sysfile) { FILE *f; String *str; String *file; f = Swig_open_file(name, sysfile, 1); if (!f) return 0; str = Swig_read_file(f); fclose(f); Seek(str, 0, SEEK_SET); file = Copy(Swig_last_file()); Setfile(str, file); Delete(file); Setline(str, 1); return str; } String *Swig_include(const_String_or_char_ptr name) { return Swig_include_any(name, 0); } String *Swig_include_sys(const_String_or_char_ptr name) { return Swig_include_any(name, 1); } /* ----------------------------------------------------------------------------- * Swig_insert_file() * * Copies the contents of a file into another file * ----------------------------------------------------------------------------- */ int Swig_insert_file(const_String_or_char_ptr filename, File *outfile) { char buffer[4096]; int nbytes; FILE *f = Swig_include_open(filename); if (!f) return -1; while ((nbytes = Read(f, buffer, 4096)) > 0) { Write(outfile, buffer, nbytes); } fclose(f); return 0; } /* ----------------------------------------------------------------------------- * Swig_register_filebyname() * * Register a "named" file with the core. Named files can become targets * for %insert directives and other SWIG operations. This function takes * the place of the f_header, f_wrapper, f_init, and other global variables * in SWIG1.1 * ----------------------------------------------------------------------------- */ static Hash *named_files = 0; void Swig_register_filebyname(const_String_or_char_ptr filename, File *outfile) { if (!named_files) named_files = NewHash(); Setattr(named_files, filename, outfile); } /* ----------------------------------------------------------------------------- * Swig_filebyname() * * Get a named file * ----------------------------------------------------------------------------- */ File *Swig_filebyname(const_String_or_char_ptr filename) { if (!named_files) return 0; return Getattr(named_files, filename); } /* ----------------------------------------------------------------------------- * Swig_file_extension() * * Returns the extension of a file * ----------------------------------------------------------------------------- */ String *Swig_file_extension(const_String_or_char_ptr filename) { String *name = Swig_file_filename(filename); const char *c = strrchr(Char(name), '.'); String *extension = c ? NewString(c) : NewString(""); Delete(name); return extension; } /* ----------------------------------------------------------------------------- * Swig_file_basename() * * Returns the filename with the extension removed. * ----------------------------------------------------------------------------- */ String *Swig_file_basename(const_String_or_char_ptr filename) { String *extension = Swig_file_extension(filename); String *basename = NewStringWithSize(filename, Len(filename) - Len(extension)); Delete(extension); return basename; } /* ----------------------------------------------------------------------------- * Swig_file_filename() * * Return the file name with any leading path stripped off * ----------------------------------------------------------------------------- */ String *Swig_file_filename(const_String_or_char_ptr filename) { const char *delim = SWIG_FILE_DELIMITER; const char *c = strrchr(Char(filename), *delim); return c ? NewString(c + 1) : NewString(filename); } /* ----------------------------------------------------------------------------- * Swig_file_dirname() * * Return the name of the directory associated with a file * ----------------------------------------------------------------------------- */ String *Swig_file_dirname(const_String_or_char_ptr filename) { const char *delim = SWIG_FILE_DELIMITER; const char *c = strrchr(Char(filename), *delim); return c ? NewStringWithSize(filename, (int)(c - Char(filename) + 1)) : NewString(""); } /* * Swig_file_debug() */ void Swig_file_debug_set() { file_debug = 1; } swig-4.0.1/Source/Swig/swigtree.h0000644000175000017500000000450213527063513016524 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * swigtree.h * * These functions are used to access and manipulate the SWIG parse tree. * The structure of this tree is modeled directly after XML-DOM. The attribute * and function names are meant to be similar. * ----------------------------------------------------------------------------- */ /* Macros to traverse the DOM tree */ #define nodeType(x) Getattr(x,"nodeType") #define parentNode(x) Getattr(x,"parentNode") #define previousSibling(x) Getattr(x,"previousSibling") #define nextSibling(x) Getattr(x,"nextSibling") #define firstChild(x) Getattr(x,"firstChild") #define lastChild(x) Getattr(x,"lastChild") /* Macros to set up the DOM tree (mostly used by the parser) */ #define set_nodeType(x,v) Setattr(x,"nodeType",v) #define set_parentNode(x,v) Setattr(x,"parentNode",v) #define set_previousSibling(x,v) Setattr(x,"previousSibling",v) #define set_nextSibling(x,v) Setattr(x,"nextSibling",v) #define set_firstChild(x,v) Setattr(x,"firstChild",v) #define set_lastChild(x,v) Setattr(x,"lastChild",v) /* Utility functions */ extern int checkAttribute(Node *obj, const_String_or_char_ptr name, const_String_or_char_ptr value); extern void appendChild(Node *node, Node *child); extern void prependChild(Node *node, Node *child); extern void removeNode(Node *node); extern Node *copyNode(Node *node); extern void appendSibling(Node *node, Node *child); /* Node restoration/restore functions */ extern void Swig_require(const char *ns, Node *node, ...); extern void Swig_save(const char *ns, Node *node, ...); extern void Swig_restore(Node *node); /* Debugging of parse trees */ extern void Swig_print_tags(File *obj, Node *root); extern void Swig_print_tree(Node *obj); extern void Swig_print_node(Node *obj); swig-4.0.1/Source/Swig/error.c0000644000175000017500000002410213527063513016015 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * error.c * * Error handling functions. These are used to issue warnings and * error messages. * ----------------------------------------------------------------------------- */ #include "swig.h" #include #include /* ----------------------------------------------------------------------------- * Commentary on the warning filter. * * The warning filter is a string of numbers prefaced by (-) or (+) to * indicate whether or not a warning message is displayed. For example: * * "-304-201-140+210+201" * * The filter string is scanned left to right and the first occurrence * of a warning number is used to determine printing behavior. * * The same number may appear more than once in the string. For example, in the * above string, "201" appears twice. This simply means that warning 201 * was disabled after it was previously enabled. This may only be temporary * setting--the first number may be removed later in which case the warning * is reenabled. * ----------------------------------------------------------------------------- */ #if defined(_WIN32) # define DEFAULT_ERROR_MSG_FORMAT EMF_MICROSOFT #else # define DEFAULT_ERROR_MSG_FORMAT EMF_STANDARD #endif static ErrorMessageFormat msg_format = DEFAULT_ERROR_MSG_FORMAT; static int silence = 0; /* Silent operation */ static String *filter = 0; /* Warning filter */ static int warnall = 0; static int nwarning = 0; static int nerrors = 0; static int init_fmt = 0; static char wrn_wnum_fmt[64]; static char wrn_nnum_fmt[64]; static char err_line_fmt[64]; static char err_eof_fmt[64]; static char diag_line_fmt[64]; static char diag_eof_fmt[64]; static String *format_filename(const_String_or_char_ptr filename); /* ----------------------------------------------------------------------------- * Swig_warning() * * Issue a warning message on stderr. * ----------------------------------------------------------------------------- */ void Swig_warning(int wnum, const_String_or_char_ptr filename, int line, const char *fmt, ...) { String *out; char *msg; int wrn = 1; va_list ap; if (silence) return; if (!init_fmt) Swig_error_msg_format(DEFAULT_ERROR_MSG_FORMAT); va_start(ap, fmt); out = NewStringEmpty(); vPrintf(out, fmt, ap); msg = Char(out); if (isdigit((unsigned char) *msg)) { unsigned long result = strtoul(msg, &msg, 10); if (msg != Char(out)) { msg++; wnum = result; } } /* Check in the warning filter */ if (filter) { char temp[32]; char *c; char *f = Char(filter); sprintf(temp, "%d", wnum); while (*f != '\0' && (c = strstr(f, temp))) { if (*(c - 1) == '-') { wrn = 0; /* Warning disabled */ break; } if (*(c - 1) == '+') { wrn = 1; /* Warning enabled */ break; } f += strlen(temp); } } if (warnall || wrn) { String *formatted_filename = format_filename(filename); String *full_message = NewString(""); if (wnum) { Printf(full_message, wrn_wnum_fmt, formatted_filename, line, wnum); } else { Printf(full_message, wrn_nnum_fmt, formatted_filename, line); } Printf(full_message, "%s", msg); Printv(stderr, full_message, NIL); nwarning++; Delete(full_message); Delete(formatted_filename); } Delete(out); va_end(ap); } /* ----------------------------------------------------------------------------- * Swig_error() * * Issue an error message on stderr. * ----------------------------------------------------------------------------- */ void Swig_error(const_String_or_char_ptr filename, int line, const char *fmt, ...) { va_list ap; String *formatted_filename = NULL; String *full_message = NULL; if (silence) return; if (!init_fmt) Swig_error_msg_format(DEFAULT_ERROR_MSG_FORMAT); va_start(ap, fmt); formatted_filename = format_filename(filename); full_message = NewString(""); if (line > 0) { Printf(full_message, err_line_fmt, formatted_filename, line); } else { Printf(full_message, err_eof_fmt, formatted_filename); } vPrintf(full_message, fmt, ap); Printv(stderr, full_message, NIL); va_end(ap); nerrors++; Delete(full_message); Delete(formatted_filename); } /* ----------------------------------------------------------------------------- * Swig_error_count() * * Returns number of errors received. * ----------------------------------------------------------------------------- */ int Swig_error_count(void) { return nerrors; } /* ----------------------------------------------------------------------------- * Swig_error_silent() * * Set silent flag * ----------------------------------------------------------------------------- */ void Swig_error_silent(int s) { silence = s; } /* ----------------------------------------------------------------------------- * Swig_warnfilter() * * Takes a comma separate list of warning numbers and puts in the filter. * ----------------------------------------------------------------------------- */ void Swig_warnfilter(const_String_or_char_ptr wlist, int add) { char *c; char *cw; String *s; if (!filter) filter = NewStringEmpty(); s = NewString(""); Clear(s); cw = Char(wlist); while (*cw != '\0') { if (*cw != ' ') { Putc(*cw, s); } ++cw; } c = Char(s); c = strtok(c, ", "); while (c) { if (isdigit((int) *c) || (*c == '+') || (*c == '-')) { /* Even if c is a digit, the rest of the string might not be, eg in the case of typemap * warnings (a bit odd really), eg: %warnfilter(SWIGWARN_TYPEMAP_CHARLEAK_MSG) */ if (add) { Insert(filter, 0, c); if (isdigit((int) *c)) { Insert(filter, 0, "-"); } } else { char *temp = (char *)malloc(sizeof(char)*strlen(c) + 2); if (isdigit((int) *c)) { sprintf(temp, "-%s", c); } else { strcpy(temp, c); } Replace(filter, temp, "", DOH_REPLACE_FIRST); free(temp); } } c = strtok(NULL, ", "); } Delete(s); } void Swig_warnall(void) { warnall = 1; } /* ----------------------------------------------------------------------------- * Swig_warn_count() * * Return the number of warnings * ----------------------------------------------------------------------------- */ int Swig_warn_count(void) { return nwarning; } /* ----------------------------------------------------------------------------- * Swig_error_msg_format() * * Set the type of error/warning message display * ----------------------------------------------------------------------------- */ void Swig_error_msg_format(ErrorMessageFormat format) { const char *error = "Error"; const char *warning = "Warning"; const char *fmt_eof = 0; const char *fmt_line = 0; /* here 'format' could be directly a string instead of an enum, but by now a switch is used to translated into one. */ switch (format) { case EMF_MICROSOFT: fmt_line = "%s(%d) "; fmt_eof = "%s(999999) "; /* Is there a special character for EOF? Just use a large number. */ break; case EMF_STANDARD: default: fmt_line = "%s:%d"; fmt_eof = "%s:EOF"; } sprintf(wrn_wnum_fmt, "%s: %s %%d: ", fmt_line, warning); sprintf(wrn_nnum_fmt, "%s: %s: ", fmt_line, warning); sprintf(err_line_fmt, "%s: %s: ", fmt_line, error); sprintf(err_eof_fmt, "%s: %s: ", fmt_eof, error); sprintf(diag_line_fmt, "%s: ", fmt_line); sprintf(diag_eof_fmt, "%s: ", fmt_eof); msg_format = format; init_fmt = 1; } /* ----------------------------------------------------------------------------- * format_filename() * * Remove double backslashes in Windows filename paths for display * ----------------------------------------------------------------------------- */ static String *format_filename(const_String_or_char_ptr filename) { String *formatted_filename = NewString(filename); #if defined(_WIN32) Replaceall(formatted_filename, "\\\\", "\\"); #endif return formatted_filename; } /* ----------------------------------------------------------------------------- * Swig_stringify_with_location() * * Return a string representation of any DOH object with line and file location * information in the appropriate error message format. The string representation * is enclosed within [] brackets after the line and file information. * ----------------------------------------------------------------------------- */ String *Swig_stringify_with_location(DOH *object) { String *str = NewStringEmpty(); if (!init_fmt) Swig_error_msg_format(DEFAULT_ERROR_MSG_FORMAT); if (object) { int line = Getline(object); String *formatted_filename = format_filename(Getfile(object)); if (line > 0) { Printf(str, diag_line_fmt, formatted_filename, line); } else { Printf(str, diag_eof_fmt, formatted_filename); } if (Len(object) == 0) { Printf(str, "[EMPTY]"); } else { Printf(str, "[%s]", object); } Delete(formatted_filename); } else { Printf(str, "[NULL]"); } return str; } /* ----------------------------------------------------------------------------- * Swig_diagnostic() * * Issue a diagnostic message on stdout. * ----------------------------------------------------------------------------- */ void Swig_diagnostic(const_String_or_char_ptr filename, int line, const char *fmt, ...) { va_list ap; String *formatted_filename = NULL; if (!init_fmt) Swig_error_msg_format(DEFAULT_ERROR_MSG_FORMAT); va_start(ap, fmt); formatted_filename = format_filename(filename); if (line > 0) { Printf(stdout, diag_line_fmt, formatted_filename, line); } else { Printf(stdout, diag_eof_fmt, formatted_filename); } vPrintf(stdout, fmt, ap); va_end(ap); Delete(formatted_filename); } swig-4.0.1/Source/Swig/swigopt.h0000644000175000017500000000156713527063513016377 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * swigopt.h * * Header file for the SWIG command line processing functions * ----------------------------------------------------------------------------- */ extern void Swig_init_args(int argc, char **argv); extern void Swig_mark_arg(int n); extern int Swig_check_marked(int n); extern void Swig_check_options(int check_input); extern void Swig_arg_error(void); swig-4.0.1/Source/Swig/fragment.c0000644000175000017500000001273013527063513016473 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * fragment.c * * This file manages named code fragments. Code fragments are typically * used to hold helper-code that may or may not be included in the wrapper * file (depending on what features are actually used in the interface). * * By using fragments, it's possible to greatly reduce the amount of * wrapper code and to generate cleaner wrapper files. * ----------------------------------------------------------------------------- */ #include "swig.h" #include "swigwarn.h" #include "cparse.h" static Hash *fragments = 0; static Hash *looking_fragments = 0; static int debug = 0; /* ----------------------------------------------------------------------------- * Swig_fragment_register() * * Add a fragment. Use the original Node*, so, if something needs to be * changed, lang.cxx doesn't nedd to be touched again. * ----------------------------------------------------------------------------- */ void Swig_fragment_register(Node *fragment) { if (Getattr(fragment, "emitonly")) { Swig_fragment_emit(fragment); return; } else { String *name = Copy(Getattr(fragment, "value")); String *type = Getattr(fragment, "type"); if (type) { SwigType *rtype = SwigType_typedef_resolve_all(type); String *mangle = Swig_string_mangle(type); Append(name, mangle); Delete(mangle); Delete(rtype); if (debug) Printf(stdout, "register fragment %s %s\n", name, type); } if (!fragments) { fragments = NewHash(); } if (!Getattr(fragments, name)) { String *section = Copy(Getattr(fragment, "section")); String *ccode = Copy(Getattr(fragment, "code")); Hash *kwargs = Getattr(fragment, "kwargs"); Setmeta(ccode, "section", section); if (kwargs) { Setmeta(ccode, "kwargs", kwargs); } Setfile(ccode, Getfile(fragment)); Setline(ccode, Getline(fragment)); /* Replace $descriptor() macros */ Swig_cparse_replace_descriptor(ccode); Setattr(fragments, name, ccode); if (debug) Printf(stdout, "registering fragment %s %s\n", name, section); Delete(section); Delete(ccode); } Delete(name); } } /* ----------------------------------------------------------------------------- * Swig_fragment_emit() * * Emit a fragment * ----------------------------------------------------------------------------- */ static char *char_index(char *str, char c) { while (*str && (c != *str)) ++str; return (c == *str) ? str : 0; } void Swig_fragment_emit(Node *n) { String *code; char *pc, *tok; String *t; String *mangle = 0; String *name = 0; String *type = 0; name = Getattr(n, "value"); if (!name) { name = n; } if (!fragments) { Swig_warning(WARN_FRAGMENT_NOT_FOUND, Getfile(n), Getline(n), "Fragment '%s' not found.\n", name); return; } type = Getattr(n, "type"); if (type) { mangle = Swig_string_mangle(type); } if (debug) Printf(stdout, "looking fragment %s %s\n", name, type); t = Copy(name); tok = Char(t); pc = char_index(tok, ','); if (pc) *pc = 0; while (tok) { String *name = NewString(tok); if (mangle) Append(name, mangle); if (looking_fragments && Getattr(looking_fragments, name)) { return; } code = Getattr(fragments, name); if (debug) Printf(stdout, "looking subfragment %s\n", name); if (code && (Strcmp(code, "ignore") != 0)) { String *section = Getmeta(code, "section"); Hash *nn = Getmeta(code, "kwargs"); if (!looking_fragments) looking_fragments = NewHash(); Setattr(looking_fragments, name, "1"); while (nn) { if (Equal(Getattr(nn, "name"), "fragment")) { if (debug) Printf(stdout, "emitting fragment %s %s\n", nn, type); Setfile(nn, Getfile(n)); Setline(nn, Getline(n)); Swig_fragment_emit(nn); } nn = nextSibling(nn); } if (section) { File *f = Swig_filebyname(section); if (!f) { Swig_error(Getfile(code), Getline(code), "Bad section '%s' in %%fragment declaration for code fragment '%s'\n", section, name); } else { if (debug) Printf(stdout, "emitting subfragment %s %s\n", name, section); if (debug) Printf(f, "/* begin fragment %s */\n", name); Printf(f, "%s\n", code); if (debug) Printf(f, "/* end fragment %s */\n\n", name); Setattr(fragments, name, "ignore"); Delattr(looking_fragments, name); } } } else if (!code && type) { SwigType *rtype = SwigType_typedef_resolve_all(type); if (!Equal(type, rtype)) { String *name = Copy(Getattr(n, "value")); String *mangle = Swig_string_mangle(type); Append(name, mangle); Setfile(name, Getfile(n)); Setline(name, Getline(n)); Swig_fragment_emit(name); Delete(mangle); Delete(name); } Delete(rtype); } if (!code) { Swig_warning(WARN_FRAGMENT_NOT_FOUND, Getfile(n), Getline(n), "Fragment '%s' not found.\n", name); } tok = pc ? pc + 1 : 0; if (tok) { pc = char_index(tok, ','); if (pc) *pc = 0; } Delete(name); } Delete(t); } swig-4.0.1/Source/Swig/scanner.c0000644000175000017500000013125213527063513016322 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * scanner.c * * This file implements a general purpose C/C++ compatible lexical scanner. * This scanner isn't intended to be plugged directly into a parser built * with yacc. Rather, it contains a lot of generic code that could be used * to easily construct yacc-compatible scanners. * ----------------------------------------------------------------------------- */ #include "swig.h" #include extern String *cparse_file; extern int cparse_line; extern int cparse_cplusplus; extern int cparse_start_line; struct Scanner { String *text; /* Current token value */ List *scanobjs; /* Objects being scanned */ String *str; /* Current object being scanned */ char *idstart; /* Optional identifier start characters */ int nexttoken; /* Next token to be returned */ int start_line; /* Starting line of certain declarations */ int line; int yylen; /* Length of text pushed into text */ String *file; String *error; /* Last error message (if any) */ int error_line; /* Error line number */ int freeze_line; /* Suspend line number updates */ List *brackets; /* Current level of < > brackets on each level */ }; typedef struct Locator { String *filename; int line_number; struct Locator *next; } Locator; static int follow_locators = 0; static void brackets_push(Scanner *); static void brackets_clear(Scanner *); /* ----------------------------------------------------------------------------- * NewScanner() * * Create a new scanner object * ----------------------------------------------------------------------------- */ Scanner *NewScanner(void) { Scanner *s; s = (Scanner *) malloc(sizeof(Scanner)); s->line = 1; s->file = 0; s->nexttoken = -1; s->start_line = 1; s->yylen = 0; s->idstart = NULL; s->scanobjs = NewList(); s->text = NewStringEmpty(); s->str = 0; s->error = 0; s->error_line = 0; s->freeze_line = 0; s->brackets = NewList(); brackets_push(s); return s; } /* ----------------------------------------------------------------------------- * DelScanner() * * Delete a scanner object. * ----------------------------------------------------------------------------- */ void DelScanner(Scanner *s) { assert(s); Delete(s->scanobjs); Delete(s->brackets); Delete(s->text); Delete(s->file); Delete(s->error); Delete(s->str); free(s->idstart); free(s); } /* ----------------------------------------------------------------------------- * Scanner_clear() * * Clear the contents of a scanner object. * ----------------------------------------------------------------------------- */ void Scanner_clear(Scanner *s) { assert(s); Delete(s->str); Clear(s->text); Clear(s->scanobjs); brackets_clear(s); Delete(s->error); s->str = 0; s->error = 0; s->line = 1; s->nexttoken = -1; s->start_line = 0; s->yylen = 0; /* Should these be cleared too? s->idstart; s->file; s->error_line; s->freeze_line; */ } /* ----------------------------------------------------------------------------- * Scanner_push() * * Push some new text into the scanner. The scanner will start parsing this text * immediately before returning to the old text. * ----------------------------------------------------------------------------- */ void Scanner_push(Scanner *s, String *txt) { assert(s && txt); Push(s->scanobjs, txt); if (s->str) { Setline(s->str,s->line); Delete(s->str); } s->str = txt; DohIncref(s->str); s->line = Getline(txt); } /* ----------------------------------------------------------------------------- * Scanner_pushtoken() * * Push a token into the scanner. This token will be returned on the next * call to Scanner_token(). * ----------------------------------------------------------------------------- */ void Scanner_pushtoken(Scanner *s, int nt, const_String_or_char_ptr val) { assert(s); assert((nt >= 0) && (nt < SWIG_MAXTOKENS)); s->nexttoken = nt; if ( Char(val) != Char(s->text) ) { Clear(s->text); Append(s->text,val); } } /* ----------------------------------------------------------------------------- * Scanner_set_location() * * Set the file and line number location of the scanner. * ----------------------------------------------------------------------------- */ void Scanner_set_location(Scanner *s, String *file, int line) { Setline(s->str, line); Setfile(s->str, file); s->line = line; } /* ----------------------------------------------------------------------------- * Scanner_file() * * Get the current file. * ----------------------------------------------------------------------------- */ String *Scanner_file(Scanner *s) { return Getfile(s->str); } /* ----------------------------------------------------------------------------- * Scanner_line() * * Get the current line number * ----------------------------------------------------------------------------- */ int Scanner_line(Scanner *s) { return s->line; } /* ----------------------------------------------------------------------------- * Scanner_start_line() * * Get the line number on which the current token starts * ----------------------------------------------------------------------------- */ int Scanner_start_line(Scanner *s) { return s->start_line; } /* ----------------------------------------------------------------------------- * Scanner_idstart() * * Change the set of additional characters that can be used to start an identifier. * ----------------------------------------------------------------------------- */ void Scanner_idstart(Scanner *s, const char *id) { free(s->idstart); s->idstart = Swig_copy_string(id); } /* ----------------------------------------------------------------------------- * nextchar() * * Returns the next character from the scanner or 0 if end of the string. * ----------------------------------------------------------------------------- */ static char nextchar(Scanner *s) { int nc; if (!s->str) return 0; while ((nc = Getc(s->str)) == EOF) { Delete(s->str); s->str = 0; Delitem(s->scanobjs, 0); if (Len(s->scanobjs) == 0) return 0; s->str = Getitem(s->scanobjs, 0); s->line = Getline(s->str); DohIncref(s->str); } if ((nc == '\n') && (!s->freeze_line)) s->line++; Putc(nc,s->text); return (char)nc; } /* ----------------------------------------------------------------------------- * set_error() * * Sets error information on the scanner. * ----------------------------------------------------------------------------- */ static void set_error(Scanner *s, int line, const_String_or_char_ptr msg) { s->error_line = line; s->error = NewString(msg); } /* ----------------------------------------------------------------------------- * Scanner_errmsg() * Scanner_errline() * * Returns error information (if any) * ----------------------------------------------------------------------------- */ String *Scanner_errmsg(Scanner *s) { return s->error; } int Scanner_errline(Scanner *s) { return s->error_line; } /* ----------------------------------------------------------------------------- * freeze_line() * * Freezes the current line number. * ----------------------------------------------------------------------------- */ static void freeze_line(Scanner *s, int val) { s->freeze_line = val; } /* ----------------------------------------------------------------------------- * brackets_count() * * Returns the number of brackets at the current depth. * A syntax error with unbalanced ) brackets will result in a NULL pointer return. * ----------------------------------------------------------------------------- */ static int *brackets_count(Scanner *s) { int *count; if (Len(s->brackets) > 0) count = (int *)Data(Getitem(s->brackets, 0)); else count = 0; return count; } /* ----------------------------------------------------------------------------- * brackets_clear() * * Resets the current depth and clears all brackets. * Usually called at the end of statements; * ----------------------------------------------------------------------------- */ static void brackets_clear(Scanner *s) { Clear(s->brackets); brackets_push(s); /* base bracket count should always be created */ } /* ----------------------------------------------------------------------------- * brackets_increment() * * Increases the number of brackets at the current depth. * Usually called when a single '<' is found. * ----------------------------------------------------------------------------- */ static void brackets_increment(Scanner *s) { int *count = brackets_count(s); if (count) (*count)++; } /* ----------------------------------------------------------------------------- * brackets_decrement() * * Decreases the number of brackets at the current depth. * Usually called when a single '>' is found. * ----------------------------------------------------------------------------- */ static void brackets_decrement(Scanner *s) { int *count = brackets_count(s); if (count) (*count)--; } /* ----------------------------------------------------------------------------- * brackets_reset() * * Sets the number of '<' brackets back to zero. Called at the point where * it is no longer possible to have a matching closing >> pair for a template. * ----------------------------------------------------------------------------- */ static void brackets_reset(Scanner *s) { int *count = brackets_count(s); if (count) *count = 0; } /* ----------------------------------------------------------------------------- * brackets_push() * * Increases the depth of brackets. * Usually called when '(' is found. * ----------------------------------------------------------------------------- */ static void brackets_push(Scanner *s) { int *newInt = (int *)malloc(sizeof(int)); *newInt = 0; Push(s->brackets, NewVoid(newInt, free)); } /* ----------------------------------------------------------------------------- * brackets_pop() * * Decreases the depth of brackets. * Usually called when ')' is found. * ----------------------------------------------------------------------------- */ static void brackets_pop(Scanner *s) { if (Len(s->brackets) > 0) /* protect against unbalanced ')' brackets */ Delitem(s->brackets, 0); } /* ----------------------------------------------------------------------------- * brackets_allow_shift() * * Return 1 to allow shift (>>), or 0 if (>>) should be split into (> >). * This is for C++11 template syntax for closing templates. * ----------------------------------------------------------------------------- */ static int brackets_allow_shift(Scanner *s) { int *count = brackets_count(s); return !count || (*count <= 0); } /* ----------------------------------------------------------------------------- * retract() * * Retract n characters * ----------------------------------------------------------------------------- */ static void retract(Scanner *s, int n) { int i, l; char *str; str = Char(s->text); l = Len(s->text); assert(n <= l); for (i = 0; i < n; i++) { if (str[l - 1] == '\n') { if (!s->freeze_line) s->line--; } (void)Seek(s->str, -1, SEEK_CUR); Delitem(s->text, DOH_END); } } /* ----------------------------------------------------------------------------- * get_escape() * * Get escape sequence. Called when a backslash is found in a string * ----------------------------------------------------------------------------- */ static void get_escape(Scanner *s) { int result = 0; int state = 0; int c; while (1) { c = nextchar(s); if (c == 0) break; switch (state) { case 0: if (c == 'n') { Delitem(s->text, DOH_END); Append(s->text,"\n"); return; } if (c == 'r') { Delitem(s->text, DOH_END); Append(s->text,"\r"); return; } if (c == 't') { Delitem(s->text, DOH_END); Append(s->text,"\t"); return; } if (c == 'a') { Delitem(s->text, DOH_END); Append(s->text,"\a"); return; } if (c == 'b') { Delitem(s->text, DOH_END); Append(s->text,"\b"); return; } if (c == 'f') { Delitem(s->text, DOH_END); Append(s->text,"\f"); return; } if (c == '\\') { Delitem(s->text, DOH_END); Append(s->text,"\\"); return; } if (c == 'v') { Delitem(s->text, DOH_END); Append(s->text,"\v"); return; } if (c == 'e') { Delitem(s->text, DOH_END); Append(s->text,"\033"); return; } if (c == '\'') { Delitem(s->text, DOH_END); Append(s->text,"\'"); return; } if (c == '\"') { Delitem(s->text, DOH_END); Append(s->text,"\""); return; } if (c == '\n') { Delitem(s->text, DOH_END); return; } if (isdigit(c)) { state = 10; result = (c - '0'); Delitem(s->text, DOH_END); } else if (c == 'x') { state = 20; Delitem(s->text, DOH_END); } else { char tmp[3]; tmp[0] = '\\'; tmp[1] = (char)c; tmp[2] = 0; Delitem(s->text, DOH_END); Append(s->text, tmp); return; } break; case 10: if (!isdigit(c)) { retract(s,1); Putc((char)result,s->text); return; } result = (result << 3) + (c - '0'); Delitem(s->text, DOH_END); break; case 20: if (!isxdigit(c)) { retract(s,1); Putc((char)result, s->text); return; } if (isdigit(c)) result = (result << 4) + (c - '0'); else result = (result << 4) + (10 + tolower(c) - 'a'); Delitem(s->text, DOH_END); break; } } return; } /* ----------------------------------------------------------------------------- * look() * * Return the raw value of the next token. * ----------------------------------------------------------------------------- */ static int look(Scanner *s) { int state = 0; int c = 0; String *str_delimiter = 0; Clear(s->text); s->start_line = s->line; Setfile(s->text, Getfile(s->str)); while (1) { switch (state) { case 0: if ((c = nextchar(s)) == 0) return (0); /* Process delimiters */ if (c == '\n') { return SWIG_TOKEN_ENDLINE; } else if (!isspace(c)) { retract(s, 1); state = 1000; Clear(s->text); Setline(s->text, s->line); Setfile(s->text, Getfile(s->str)); } break; case 1000: if ((c = nextchar(s)) == 0) return (0); if (c == '%') state = 4; /* Possibly a SWIG directive */ /* Look for possible identifiers or unicode/delimiter strings */ else if ((isalpha(c)) || (c == '_') || (s->idstart && strchr(s->idstart, c))) { state = 7; } /* Look for single character symbols */ else if (c == '(') { brackets_push(s); return SWIG_TOKEN_LPAREN; } else if (c == ')') { brackets_pop(s); return SWIG_TOKEN_RPAREN; } else if (c == ';') { brackets_clear(s); return SWIG_TOKEN_SEMI; } else if (c == ',') return SWIG_TOKEN_COMMA; else if (c == '*') state = 220; else if (c == '}') return SWIG_TOKEN_RBRACE; else if (c == '{') { brackets_reset(s); return SWIG_TOKEN_LBRACE; } else if (c == '=') state = 33; else if (c == '+') state = 200; else if (c == '-') state = 210; else if (c == '&') state = 31; else if (c == '|') state = 32; else if (c == '^') state = 230; else if (c == '<') state = 60; else if (c == '>') state = 61; else if (c == '~') return SWIG_TOKEN_NOT; else if (c == '!') state = 3; else if (c == '\\') return SWIG_TOKEN_BACKSLASH; else if (c == '[') return SWIG_TOKEN_LBRACKET; else if (c == ']') return SWIG_TOKEN_RBRACKET; else if (c == '@') return SWIG_TOKEN_AT; else if (c == '$') state = 75; else if (c == '#') return SWIG_TOKEN_POUND; else if (c == '?') return SWIG_TOKEN_QUESTION; /* Look for multi-character sequences */ else if (c == '/') { state = 1; /* Comment (maybe) */ s->start_line = s->line; } else if (c == ':') state = 5; /* maybe double colon */ else if (c == '0') state = 83; /* An octal or hex value */ else if (c == '\"') { state = 2; /* A string constant */ s->start_line = s->line; Clear(s->text); } else if (c == '\'') { s->start_line = s->line; Clear(s->text); state = 9; /* A character constant */ } else if (c == '`') { s->start_line = s->line; Clear(s->text); state = 900; } else if (c == '.') state = 100; /* Maybe a number, maybe just a period */ else if (isdigit(c)) state = 8; /* A numerical value */ else state = 99; /* An error */ break; case 1: /* Comment block */ if ((c = nextchar(s)) == 0) return (0); if (c == '/') { state = 10; /* C++ style comment */ Clear(s->text); Setline(s->text, Getline(s->str)); Setfile(s->text, Getfile(s->str)); Append(s->text, "//"); } else if (c == '*') { state = 11; /* C style comment */ Clear(s->text); Setline(s->text, Getline(s->str)); Setfile(s->text, Getfile(s->str)); Append(s->text, "/*"); } else if (c == '=') { return SWIG_TOKEN_DIVEQUAL; } else { retract(s, 1); return SWIG_TOKEN_SLASH; } break; case 10: /* C++ style comment */ if ((c = nextchar(s)) == 0) { Swig_error(cparse_file, cparse_start_line, "Unterminated comment\n"); return SWIG_TOKEN_ERROR; } if (c == '\n') { retract(s,1); return SWIG_TOKEN_COMMENT; } else { state = 10; } break; case 11: /* C style comment block */ if ((c = nextchar(s)) == 0) { Swig_error(cparse_file, cparse_start_line, "Unterminated comment\n"); return SWIG_TOKEN_ERROR; } if (c == '*') { state = 12; } else { state = 11; } break; case 12: /* Still in C style comment */ if ((c = nextchar(s)) == 0) { Swig_error(cparse_file, cparse_start_line, "Unterminated comment\n"); return SWIG_TOKEN_ERROR; } if (c == '*') { state = 12; } else if (c == '/') { return SWIG_TOKEN_COMMENT; } else { state = 11; } break; case 2: /* Processing a string */ if (!str_delimiter) { state=20; break; } if ((c = nextchar(s)) == 0) { Swig_error(cparse_file, cparse_start_line, "Unterminated string\n"); return SWIG_TOKEN_ERROR; } else if (c == '(') { state = 20; } else { char temp[2] = { 0, 0 }; temp[0] = c; Append( str_delimiter, temp ); } break; case 20: /* Inside the string */ if ((c = nextchar(s)) == 0) { Swig_error(cparse_file, cparse_start_line, "Unterminated string\n"); return SWIG_TOKEN_ERROR; } if (!str_delimiter) { /* Ordinary string: "value" */ if (c == '\"') { Delitem(s->text, DOH_END); return SWIG_TOKEN_STRING; } else if (c == '\\') { Delitem(s->text, DOH_END); get_escape(s); } } else { /* Custom delimiter string: R"XXXX(value)XXXX" */ if (c==')') { int i=0; String *end_delimiter = NewStringEmpty(); while ((c = nextchar(s)) != 0 && c!='\"') { char temp[2] = { 0, 0 }; temp[0] = c; Append( end_delimiter, temp ); i++; } if (Strcmp( str_delimiter, end_delimiter )==0) { int len = Len(s->text); Delslice(s->text, len - 2 - Len(str_delimiter), len); /* Delete ending )XXXX" */ Delslice(s->text, 0, Len(str_delimiter) + 1); /* Delete starting XXXX( */ Delete( end_delimiter ); /* Correct end delimiter )XXXX" occurred */ Delete( str_delimiter ); str_delimiter = 0; return SWIG_TOKEN_STRING; } else { /* Incorrect end delimiter occurred */ if (c == 0) { Swig_error(cparse_file, cparse_start_line, "Unterminated raw string, started with R\"%s( is not terminated by )%s\"\n", str_delimiter, str_delimiter); return SWIG_TOKEN_ERROR; } retract( s, i ); Delete( end_delimiter ); } } } break; case 3: /* Maybe a not equals */ if ((c = nextchar(s)) == 0) return SWIG_TOKEN_LNOT; else if (c == '=') return SWIG_TOKEN_NOTEQUAL; else { retract(s, 1); return SWIG_TOKEN_LNOT; } break; case 31: /* AND or Logical AND or ANDEQUAL */ if ((c = nextchar(s)) == 0) return SWIG_TOKEN_AND; else if (c == '&') return SWIG_TOKEN_LAND; else if (c == '=') return SWIG_TOKEN_ANDEQUAL; else { retract(s, 1); return SWIG_TOKEN_AND; } break; case 32: /* OR or Logical OR */ if ((c = nextchar(s)) == 0) return SWIG_TOKEN_OR; else if (c == '|') return SWIG_TOKEN_LOR; else if (c == '=') return SWIG_TOKEN_OREQUAL; else { retract(s, 1); return SWIG_TOKEN_OR; } break; case 33: /* EQUAL or EQUALTO */ if ((c = nextchar(s)) == 0) return SWIG_TOKEN_EQUAL; else if (c == '=') return SWIG_TOKEN_EQUALTO; else { retract(s, 1); return SWIG_TOKEN_EQUAL; } break; case 4: /* A wrapper generator directive (maybe) */ if ((c = nextchar(s)) == 0) return SWIG_TOKEN_PERCENT; if (c == '{') { state = 40; /* Include block */ Clear(s->text); Setline(s->text, Getline(s->str)); Setfile(s->text, Getfile(s->str)); s->start_line = s->line; } else if (s->idstart && strchr(s->idstart, '%') && ((isalpha(c)) || (c == '_'))) { state = 7; } else if (c == '=') { return SWIG_TOKEN_MODEQUAL; } else if (c == '}') { Swig_error(cparse_file, cparse_line, "Syntax error. Extraneous '%%}'\n"); SWIG_exit(EXIT_FAILURE); } else { retract(s, 1); return SWIG_TOKEN_PERCENT; } break; case 40: /* Process an include block */ if ((c = nextchar(s)) == 0) { Swig_error(cparse_file, cparse_start_line, "Unterminated block\n"); return SWIG_TOKEN_ERROR; } if (c == '%') state = 41; break; case 41: /* Still processing include block */ if ((c = nextchar(s)) == 0) { set_error(s,s->start_line,"Unterminated code block"); return 0; } if (c == '}') { Delitem(s->text, DOH_END); Delitem(s->text, DOH_END); Seek(s->text,0,SEEK_SET); return SWIG_TOKEN_CODEBLOCK; } else { state = 40; } break; case 5: /* Maybe a double colon */ if ((c = nextchar(s)) == 0) return SWIG_TOKEN_COLON; if (c == ':') state = 50; else { retract(s, 1); return SWIG_TOKEN_COLON; } break; case 50: /* DCOLON, DCOLONSTAR */ if ((c = nextchar(s)) == 0) return SWIG_TOKEN_DCOLON; else if (c == '*') return SWIG_TOKEN_DCOLONSTAR; else { retract(s, 1); return SWIG_TOKEN_DCOLON; } break; case 60: /* shift operators */ if ((c = nextchar(s)) == 0) { brackets_increment(s); return SWIG_TOKEN_LESSTHAN; } if (c == '<') state = 240; else if (c == '=') return SWIG_TOKEN_LTEQUAL; else { retract(s, 1); brackets_increment(s); return SWIG_TOKEN_LESSTHAN; } break; case 61: if ((c = nextchar(s)) == 0) { brackets_decrement(s); return SWIG_TOKEN_GREATERTHAN; } if (c == '>' && brackets_allow_shift(s)) state = 250; else if (c == '=') return SWIG_TOKEN_GTEQUAL; else { retract(s, 1); brackets_decrement(s); return SWIG_TOKEN_GREATERTHAN; } break; case 7: /* Identifier or true/false or unicode/custom delimiter string */ if (c == 'R') { /* Possibly CUSTOM DELIMITER string */ state = 72; break; } else if (c == 'L') { /* Probably identifier but may be a wide string literal */ state = 77; break; } else if (c != 'u' && c != 'U') { /* Definitely an identifier */ state = 70; break; } if ((c = nextchar(s)) == 0) { state = 76; } else if (c == '\"') { /* Definitely u, U or L string */ retract(s, 1); state = 1000; } else if (c == '\'') { /* Definitely u, U or L char */ retract(s, 1); state = 77; } else if (c == 'R') { /* Possibly CUSTOM DELIMITER u, U, L string */ state = 73; } else if (c == '8') { /* Possibly u8 string/char */ state = 71; } else { retract(s, 1); /* Definitely an identifier */ state = 70; } break; case 70: /* Identifier */ if ((c = nextchar(s)) == 0) state = 76; else if (isalnum(c) || (c == '_') || (c == '$')) { state = 70; } else { retract(s, 1); state = 76; } break; case 71: /* Possibly u8 string/char */ if ((c = nextchar(s)) == 0) { state = 76; } else if (c=='\"') { retract(s, 1); /* Definitely u8 string */ state = 1000; } else if (c=='\'') { retract(s, 1); /* Definitely u8 char */ state = 77; } else if (c=='R') { state = 74; /* Possibly CUSTOM DELIMITER u8 string */ } else { retract(s, 2); /* Definitely an identifier. Retract 8" */ state = 70; } break; case 72: /* Possibly CUSTOM DELIMITER string */ case 73: case 74: if ((c = nextchar(s)) == 0) { state = 76; } else if (c=='\"') { retract(s, 1); /* Definitely custom delimiter u, U or L string */ str_delimiter = NewStringEmpty(); state = 1000; } else { if (state==72) { retract(s, 1); /* Definitely an identifier. Retract ? */ } else if (state==73) { retract(s, 2); /* Definitely an identifier. Retract R? */ } else if (state==74) { retract(s, 3); /* Definitely an identifier. Retract 8R? */ } state = 70; } break; case 75: /* Special identifier $ */ if ((c = nextchar(s)) == 0) return SWIG_TOKEN_DOLLAR; if (isalnum(c) || (c == '_') || (c == '*') || (c == '&')) { state = 70; } else { retract(s,1); if (Len(s->text) == 1) return SWIG_TOKEN_DOLLAR; state = 76; } break; case 76: /* Identifier or true/false */ if (cparse_cplusplus) { if (Strcmp(s->text, "true") == 0) return SWIG_TOKEN_BOOL; else if (Strcmp(s->text, "false") == 0) return SWIG_TOKEN_BOOL; } return SWIG_TOKEN_ID; break; case 77: /*identifier or wide string literal*/ if ((c = nextchar(s)) == 0) return SWIG_TOKEN_ID; else if (c == '\"') { s->start_line = s->line; Clear(s->text); state = 78; } else if (c == '\'') { s->start_line = s->line; Clear(s->text); state = 79; } else if (isalnum(c) || (c == '_') || (c == '$')) state = 7; else { retract(s, 1); return SWIG_TOKEN_ID; } break; case 78: /* Processing a wide string literal*/ if ((c = nextchar(s)) == 0) { Swig_error(cparse_file, cparse_start_line, "Unterminated wide string\n"); return SWIG_TOKEN_ERROR; } if (c == '\"') { Delitem(s->text, DOH_END); return SWIG_TOKEN_WSTRING; } else if (c == '\\') { if ((c = nextchar(s)) == 0) { Swig_error(cparse_file, cparse_start_line, "Unterminated wide string\n"); return SWIG_TOKEN_ERROR; } } break; case 79: /* Processing a wide char literal */ if ((c = nextchar(s)) == 0) { Swig_error(cparse_file, cparse_start_line, "Unterminated wide character constant\n"); return SWIG_TOKEN_ERROR; } if (c == '\'') { Delitem(s->text, DOH_END); return (SWIG_TOKEN_WCHAR); } else if (c == '\\') { if ((c = nextchar(s)) == 0) { Swig_error(cparse_file, cparse_start_line, "Unterminated wide character literal\n"); return SWIG_TOKEN_ERROR; } } break; case 8: /* A numerical digit */ if ((c = nextchar(s)) == 0) return SWIG_TOKEN_INT; if (c == '.') { state = 81; } else if ((c == 'e') || (c == 'E')) { state = 82; } else if ((c == 'f') || (c == 'F')) { Delitem(s->text, DOH_END); return SWIG_TOKEN_FLOAT; } else if (isdigit(c)) { state = 8; } else if ((c == 'l') || (c == 'L')) { state = 87; } else if ((c == 'u') || (c == 'U')) { state = 88; } else { retract(s, 1); return SWIG_TOKEN_INT; } break; case 81: /* A floating pointer number of some sort */ if ((c = nextchar(s)) == 0) return SWIG_TOKEN_DOUBLE; if (isdigit(c)) state = 81; else if ((c == 'e') || (c == 'E')) state = 820; else if ((c == 'f') || (c == 'F')) { Delitem(s->text, DOH_END); return SWIG_TOKEN_FLOAT; } else if ((c == 'l') || (c == 'L')) { Delitem(s->text, DOH_END); return SWIG_TOKEN_DOUBLE; } else { retract(s, 1); return (SWIG_TOKEN_DOUBLE); } break; case 82: if ((c = nextchar(s)) == 0) { Swig_error(cparse_file, cparse_start_line, "Exponent does not have any digits\n"); return SWIG_TOKEN_ERROR; } if ((isdigit(c)) || (c == '-') || (c == '+')) state = 86; else { retract(s, 2); Swig_error(cparse_file, cparse_start_line, "Exponent does not have any digits\n"); return SWIG_TOKEN_ERROR; } break; case 820: /* Like case 82, but we've seen a decimal point. */ if ((c = nextchar(s)) == 0) { Swig_error(cparse_file, cparse_start_line, "Exponent does not have any digits\n"); return SWIG_TOKEN_ERROR; } if ((isdigit(c)) || (c == '-') || (c == '+')) state = 86; else { retract(s, 2); Swig_error(cparse_file, cparse_start_line, "Exponent does not have any digits\n"); return SWIG_TOKEN_ERROR; } break; case 83: /* Might be a hexadecimal or octal number */ if ((c = nextchar(s)) == 0) return SWIG_TOKEN_INT; if (isdigit(c)) state = 84; else if ((c == 'e') || (c == 'E')) state = 82; else if ((c == 'x') || (c == 'X')) state = 85; else if ((c == 'b') || (c == 'B')) state = 850; else if (c == '.') state = 81; else if ((c == 'l') || (c == 'L')) { state = 87; } else if ((c == 'u') || (c == 'U')) { state = 88; } else { retract(s, 1); return SWIG_TOKEN_INT; } break; case 84: /* This is an octal number */ if ((c = nextchar(s)) == 0) return SWIG_TOKEN_INT; if (isdigit(c)) state = 84; else if (c == '.') state = 81; else if ((c == 'e') || (c == 'E')) state = 82; else if ((c == 'l') || (c == 'L')) { state = 87; } else if ((c == 'u') || (c == 'U')) { state = 88; } else { retract(s, 1); return SWIG_TOKEN_INT; } break; case 85: /* This is an hex number */ if ((c = nextchar(s)) == 0) return SWIG_TOKEN_INT; if (isxdigit(c)) state = 85; else if (c == '.') /* hexadecimal float */ state = 860; else if ((c == 'p') || (c == 'P')) /* hexadecimal float */ state = 820; else if ((c == 'l') || (c == 'L')) { state = 87; } else if ((c == 'u') || (c == 'U')) { state = 88; } else { retract(s, 1); return SWIG_TOKEN_INT; } break; case 850: /* This is a binary number */ if ((c = nextchar(s)) == 0) return SWIG_TOKEN_INT; if ((c == '0') || (c == '1')) state = 850; else if ((c == 'l') || (c == 'L')) { state = 87; } else if ((c == 'u') || (c == 'U')) { state = 88; } else { retract(s, 1); return SWIG_TOKEN_INT; } break; case 860: /* hexadecimal float */ if ((c = nextchar(s)) == 0) { Swig_error(cparse_file, cparse_start_line, "Hexadecimal floating literals require an exponent\n"); return SWIG_TOKEN_ERROR; } if (isxdigit(c)) state = 860; else if ((c == 'p') || (c == 'P')) state = 820; else { retract(s, 2); Swig_error(cparse_file, cparse_start_line, "Hexadecimal floating literals require an exponent\n"); return SWIG_TOKEN_ERROR; } break; case 86: /* Rest of floating point number */ if ((c = nextchar(s)) == 0) return SWIG_TOKEN_DOUBLE; if (isdigit(c)) state = 86; else if ((c == 'f') || (c == 'F')) { Delitem(s->text, DOH_END); return SWIG_TOKEN_FLOAT; } else if ((c == 'l') || (c == 'L')) { Delitem(s->text, DOH_END); return SWIG_TOKEN_DOUBLE; } else { retract(s, 1); return SWIG_TOKEN_DOUBLE; } break; case 87: /* A long integer of some sort */ if ((c = nextchar(s)) == 0) return SWIG_TOKEN_LONG; if ((c == 'u') || (c == 'U')) { return SWIG_TOKEN_ULONG; } else if ((c == 'l') || (c == 'L')) { state = 870; } else { retract(s, 1); return SWIG_TOKEN_LONG; } break; /* A long long integer */ case 870: if ((c = nextchar(s)) == 0) return SWIG_TOKEN_LONGLONG; if ((c == 'u') || (c == 'U')) { return SWIG_TOKEN_ULONGLONG; } else { retract(s, 1); return SWIG_TOKEN_LONGLONG; } /* An unsigned number */ case 88: if ((c = nextchar(s)) == 0) return SWIG_TOKEN_UINT; if ((c == 'l') || (c == 'L')) { state = 880; } else { retract(s, 1); return SWIG_TOKEN_UINT; } break; /* Possibly an unsigned long long or unsigned long */ case 880: if ((c = nextchar(s)) == 0) return SWIG_TOKEN_ULONG; if ((c == 'l') || (c == 'L')) return SWIG_TOKEN_ULONGLONG; else { retract(s, 1); return SWIG_TOKEN_ULONG; } /* A character constant */ case 9: if ((c = nextchar(s)) == 0) { Swig_error(cparse_file, cparse_start_line, "Unterminated character constant\n"); return SWIG_TOKEN_ERROR; } if (c == '\'') { Delitem(s->text, DOH_END); return (SWIG_TOKEN_CHAR); } else if (c == '\\') { Delitem(s->text, DOH_END); get_escape(s); } break; /* A period or maybe a floating point number */ case 100: if ((c = nextchar(s)) == 0) return (0); if (isdigit(c)) state = 81; else { retract(s, 1); return SWIG_TOKEN_PERIOD; } break; case 200: /* PLUS, PLUSPLUS, PLUSEQUAL */ if ((c = nextchar(s)) == 0) return SWIG_TOKEN_PLUS; else if (c == '+') return SWIG_TOKEN_PLUSPLUS; else if (c == '=') return SWIG_TOKEN_PLUSEQUAL; else { retract(s, 1); return SWIG_TOKEN_PLUS; } break; case 210: /* MINUS, MINUSMINUS, MINUSEQUAL, ARROW */ if ((c = nextchar(s)) == 0) return SWIG_TOKEN_MINUS; else if (c == '-') return SWIG_TOKEN_MINUSMINUS; else if (c == '=') return SWIG_TOKEN_MINUSEQUAL; else if (c == '>') state = 211; else { retract(s, 1); return SWIG_TOKEN_MINUS; } break; case 211: /* ARROW, ARROWSTAR */ if ((c = nextchar(s)) == 0) return SWIG_TOKEN_ARROW; else if (c == '*') return SWIG_TOKEN_ARROWSTAR; else { retract(s, 1); return SWIG_TOKEN_ARROW; } break; case 220: /* STAR, TIMESEQUAL */ if ((c = nextchar(s)) == 0) return SWIG_TOKEN_STAR; else if (c == '=') return SWIG_TOKEN_TIMESEQUAL; else { retract(s, 1); return SWIG_TOKEN_STAR; } break; case 230: /* XOR, XOREQUAL */ if ((c = nextchar(s)) == 0) return SWIG_TOKEN_XOR; else if (c == '=') return SWIG_TOKEN_XOREQUAL; else { retract(s, 1); return SWIG_TOKEN_XOR; } break; case 240: /* LSHIFT, LSEQUAL */ if ((c = nextchar(s)) == 0) return SWIG_TOKEN_LSHIFT; else if (c == '=') return SWIG_TOKEN_LSEQUAL; else { retract(s, 1); return SWIG_TOKEN_LSHIFT; } break; case 250: /* RSHIFT, RSEQUAL */ if ((c = nextchar(s)) == 0) return SWIG_TOKEN_RSHIFT; else if (c == '=') return SWIG_TOKEN_RSEQUAL; else { retract(s, 1); return SWIG_TOKEN_RSHIFT; } break; /* An illegal character */ /* Reverse string */ case 900: if ((c = nextchar(s)) == 0) { Swig_error(cparse_file, cparse_start_line, "Unterminated character constant\n"); return SWIG_TOKEN_ERROR; } if (c == '`') { Delitem(s->text, DOH_END); return (SWIG_TOKEN_RSTRING); } break; default: return SWIG_TOKEN_ILLEGAL; } } } /* ----------------------------------------------------------------------------- * Scanner_token() * * Real entry point to return the next token. Returns 0 if at end of input. * ----------------------------------------------------------------------------- */ int Scanner_token(Scanner *s) { int t; Delete(s->error); if (s->nexttoken >= 0) { t = s->nexttoken; s->nexttoken = -1; return t; } s->start_line = 0; t = look(s); if (!s->start_line) { Setline(s->text,s->line); } else { Setline(s->text,s->start_line); } return t; } /* ----------------------------------------------------------------------------- * Scanner_text() * * Return the lexene associated with the last returned token. * ----------------------------------------------------------------------------- */ String *Scanner_text(Scanner *s) { return s->text; } /* ----------------------------------------------------------------------------- * Scanner_skip_line() * * Skips to the end of a line * ----------------------------------------------------------------------------- */ void Scanner_skip_line(Scanner *s) { char c; int done = 0; Clear(s->text); Setfile(s->text, Getfile(s->str)); Setline(s->text, s->line); while (!done) { if ((c = nextchar(s)) == 0) return; if (c == '\\') { nextchar(s); } else if (c == '\n') { done = 1; } } return; } /* ----------------------------------------------------------------------------- * Scanner_skip_balanced() * * Skips a piece of code enclosed in begin/end symbols such as '{...}' or * (...). Ignores symbols inside comments or strings. * ----------------------------------------------------------------------------- */ int Scanner_skip_balanced(Scanner *s, int startchar, int endchar) { char c; int num_levels = 1; int state = 0; char temp[2] = { 0, 0 }; String *locator = 0; temp[0] = (char) startchar; Clear(s->text); Setfile(s->text, Getfile(s->str)); Setline(s->text, s->line); Append(s->text, temp); while (num_levels > 0) { if ((c = nextchar(s)) == 0) { Delete(locator); return -1; } switch (state) { case 0: if (c == startchar) num_levels++; else if (c == endchar) num_levels--; else if (c == '/') state = 10; else if (c == '\"') state = 20; else if (c == '\'') state = 30; break; case 10: if (c == '/') state = 11; else if (c == '*') state = 12; else if (c == startchar) { state = 0; num_levels++; } else state = 0; break; case 11: if (c == '\n') state = 0; else state = 11; break; case 12: /* first character inside C comment */ if (c == '*') state = 14; else if (c == '@') state = 40; else state = 13; break; case 13: if (c == '*') state = 14; break; case 14: /* possible end of C comment */ if (c == '*') state = 14; else if (c == '/') state = 0; else state = 13; break; case 20: if (c == '\"') state = 0; else if (c == '\\') state = 21; break; case 21: state = 20; break; case 30: if (c == '\'') state = 0; else if (c == '\\') state = 31; break; case 31: state = 30; break; /* 40-45 SWIG locator checks - a C comment with contents starting: @SWIG */ case 40: state = (c == 'S') ? 41 : (c == '*') ? 14 : 13; break; case 41: state = (c == 'W') ? 42 : (c == '*') ? 14 : 13; break; case 42: state = (c == 'I') ? 43 : (c == '*') ? 14 : 13; break; case 43: state = (c == 'G') ? 44 : (c == '*') ? 14 : 13; if (c == 'G') { Delete(locator); locator = NewString("/*@SWIG"); } break; case 44: if (c == '*') state = 45; Putc(c, locator); break; case 45: /* end of SWIG locator in C comment */ if (c == '/') { state = 0; Putc(c, locator); Scanner_locator(s, locator); } else { /* malformed locator */ state = (c == '*') ? 14 : 13; } break; default: break; } } Delete(locator); return 0; } /* ----------------------------------------------------------------------------- * Scanner_get_raw_text_balanced() * * Returns raw text between 2 braces, does not change scanner state in any way * ----------------------------------------------------------------------------- */ String *Scanner_get_raw_text_balanced(Scanner *s, int startchar, int endchar) { String *result = 0; char c; int old_line = s->line; String *old_text = Copy(s->text); long position = Tell(s->str); int num_levels = 1; int state = 0; char temp[2] = { 0, 0 }; temp[0] = (char) startchar; Clear(s->text); Setfile(s->text, Getfile(s->str)); Setline(s->text, s->line); Append(s->text, temp); while (num_levels > 0) { if ((c = nextchar(s)) == 0) { Clear(s->text); Append(s->text, old_text); Delete(old_text); s->line = old_line; return 0; } switch (state) { case 0: if (c == startchar) num_levels++; else if (c == endchar) num_levels--; else if (c == '/') state = 10; else if (c == '\"') state = 20; else if (c == '\'') state = 30; break; case 10: if (c == '/') state = 11; else if (c == '*') state = 12; else if (c == startchar) { state = 0; num_levels++; } else state = 0; break; case 11: if (c == '\n') state = 0; else state = 11; break; case 12: /* first character inside C comment */ if (c == '*') state = 14; else state = 13; break; case 13: if (c == '*') state = 14; break; case 14: /* possible end of C comment */ if (c == '*') state = 14; else if (c == '/') state = 0; else state = 13; break; case 20: if (c == '\"') state = 0; else if (c == '\\') state = 21; break; case 21: state = 20; break; case 30: if (c == '\'') state = 0; else if (c == '\\') state = 31; break; case 31: state = 30; break; default: break; } } Seek(s->str, position, SEEK_SET); result = Copy(s->text); Clear(s->text); Append(s->text, old_text); Delete(old_text); s->line = old_line; return result; } /* ----------------------------------------------------------------------------- * Scanner_isoperator() * * Returns 0 or 1 depending on whether or not a token corresponds to a C/C++ * operator. * ----------------------------------------------------------------------------- */ int Scanner_isoperator(int tokval) { if (tokval >= 100) return 1; return 0; } /* ---------------------------------------------------------------------- * locator() * * Support for locator strings. These are strings of the form * @SWIG:filename,line,id@ emitted by the SWIG preprocessor. They * are primarily used for macro line number reporting. * We just use the locator to mark when to activate/deactivate linecounting. * ---------------------------------------------------------------------- */ void Scanner_locator(Scanner *s, String *loc) { static Locator *locs = 0; static int expanding_macro = 0; if (!follow_locators) { if (Equal(loc, "/*@SWIG@*/")) { /* End locator. */ if (expanding_macro) --expanding_macro; } else { /* Begin locator. */ ++expanding_macro; } /* Freeze line number processing in Scanner */ freeze_line(s,expanding_macro); } else { int c; Locator *l; (void)Seek(loc, 7, SEEK_SET); c = Getc(loc); if (c == '@') { /* Empty locator. We pop the last location off */ if (locs) { Scanner_set_location(s, locs->filename, locs->line_number); cparse_file = locs->filename; cparse_line = locs->line_number; l = locs->next; free(locs); locs = l; } return; } /* We're going to push a new location */ l = (Locator *) malloc(sizeof(Locator)); l->filename = cparse_file; l->line_number = cparse_line; l->next = locs; locs = l; /* Now, parse the new location out of the locator string */ { String *fn = NewStringEmpty(); /* Putc(c, fn); */ while ((c = Getc(loc)) != EOF) { if ((c == '@') || (c == ',')) break; Putc(c, fn); } cparse_file = Swig_copy_string(Char(fn)); Clear(fn); cparse_line = 1; /* Get the line number */ while ((c = Getc(loc)) != EOF) { if ((c == '@') || (c == ',')) break; Putc(c, fn); } cparse_line = atoi(Char(fn)); Clear(fn); /* Get the rest of it */ while ((c = Getc(loc)) != EOF) { if (c == '@') break; Putc(c, fn); } /* Swig_diagnostic(cparse_file, cparse_line, "Scanner_set_location\n"); */ Scanner_set_location(s, cparse_file, cparse_line); Delete(fn); } } } void Swig_cparse_follow_locators(int v) { follow_locators = v; } swig-4.0.1/Source/Swig/tree.c0000644000175000017500000002466013527063513015634 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * tree.c * * This file provides some general purpose functions for manipulating * parse trees. * ----------------------------------------------------------------------------- */ #include "swig.h" #include #include /* ----------------------------------------------------------------------------- * Swig_print_tags() * * Dump the tag structure of a parse tree to standard output * ----------------------------------------------------------------------------- */ void Swig_print_tags(DOH *obj, DOH *root) { DOH *croot, *newroot; DOH *cobj; if (!root) croot = NewStringEmpty(); else croot = root; while (obj) { Swig_diagnostic(Getfile(obj), Getline(obj), "%s . %s\n", croot, nodeType(obj)); cobj = firstChild(obj); if (cobj) { newroot = NewStringf("%s . %s", croot, nodeType(obj)); Swig_print_tags(cobj, newroot); Delete(newroot); } obj = nextSibling(obj); } if (!root) Delete(croot); } static int indent_level = 0; static void print_indent(int l) { int i; for (i = 0; i < indent_level; i++) { fputc(' ', stdout); } if (l) { fputc('|', stdout); fputc(' ', stdout); } } /* ----------------------------------------------------------------------------- * Swig_print_node(Node *n) * ----------------------------------------------------------------------------- */ void Swig_print_node(Node *obj) { Iterator ki; Node *cobj; print_indent(0); Printf(stdout, "+++ %s - %p ----------------------------------------\n", nodeType(obj), obj); ki = First(obj); while (ki.key) { String *k = ki.key; if ((Cmp(k, "nodeType") == 0) || (Cmp(k, "firstChild") == 0) || (Cmp(k, "lastChild") == 0) || (Cmp(k, "parentNode") == 0) || (Cmp(k, "nextSibling") == 0) || (Cmp(k, "previousSibling") == 0) || (*(Char(k)) == '$')) { /* Do nothing */ } else if (Cmp(k, "kwargs") == 0 || Cmp(k, "parms") == 0 || Cmp(k, "wrap:parms") == 0 || Cmp(k, "pattern") == 0 || Cmp(k, "templateparms") == 0 || Cmp(k, "throws") == 0) { print_indent(2); /* Differentiate parameter lists by displaying within single quotes */ Printf(stdout, "%-12s - \'%s\'\n", k, ParmList_str_defaultargs(Getattr(obj, k))); } else { DOH *o; const char *trunc = ""; print_indent(2); if (DohIsString(Getattr(obj, k))) { o = Str(Getattr(obj, k)); if (Len(o) > 80) { trunc = "..."; } Printf(stdout, "%-12s - \"%(escape)-0.80s%s\"\n", k, o, trunc); Delete(o); } else { Printf(stdout, "%-12s - %p\n", k, Getattr(obj, k)); } } ki = Next(ki); } cobj = firstChild(obj); if (cobj) { indent_level += 6; Printf(stdout, "\n"); Swig_print_tree(cobj); indent_level -= 6; } else { print_indent(1); Printf(stdout, "\n"); } } /* ----------------------------------------------------------------------------- * Swig_print_tree() * * Dump the tree structure of a parse tree to standard output * ----------------------------------------------------------------------------- */ void Swig_print_tree(DOH *obj) { while (obj) { Swig_print_node(obj); obj = nextSibling(obj); } } /* ----------------------------------------------------------------------------- * appendChild() * * Appends a new child to a node * ----------------------------------------------------------------------------- */ void appendChild(Node *node, Node *chd) { Node *lc; if (!chd) return; lc = lastChild(node); if (!lc) { set_firstChild(node, chd); } else { set_nextSibling(lc, chd); set_previousSibling(chd, lc); } while (chd) { lc = chd; set_parentNode(chd, node); chd = nextSibling(chd); } set_lastChild(node, lc); } /* ----------------------------------------------------------------------------- * prependChild() * * Prepends a new child to a node * ----------------------------------------------------------------------------- */ void prependChild(Node *node, Node *chd) { Node *fc; if (!chd) return; fc = firstChild(node); if (fc) { set_nextSibling(chd, fc); set_previousSibling(fc, chd); } set_firstChild(node, chd); while (chd) { set_parentNode(chd, node); chd = nextSibling(chd); } } void appendSibling(Node *node, Node *chd) { Node *parent; Node *lc = node; while (nextSibling(lc)) lc = nextSibling(lc); set_nextSibling(lc, chd); set_previousSibling(chd, lc); parent = parentNode(node); if (parent) { while (chd) { lc = chd; set_parentNode(chd, parent); chd = nextSibling(chd); } set_lastChild(parent, lc); } } /* ----------------------------------------------------------------------------- * removeNode() * * Removes a node from the parse tree. Detaches it from its parent's child list. * ----------------------------------------------------------------------------- */ void removeNode(Node *n) { Node *parent; Node *prev; Node *next; parent = parentNode(n); if (!parent) return; prev = previousSibling(n); next = nextSibling(n); if (prev) { set_nextSibling(prev, next); } else { if (parent) { set_firstChild(parent, next); } } if (next) { set_previousSibling(next, prev); } else { if (parent) { set_lastChild(parent, prev); } } /* Delete attributes */ Delattr(n,"parentNode"); Delattr(n,"nextSibling"); Delattr(n,"prevSibling"); } /* ----------------------------------------------------------------------------- * copyNode() * * Copies a node, but only copies simple attributes (no lists, hashes). * ----------------------------------------------------------------------------- */ Node *copyNode(Node *n) { Iterator ki; Node *c = NewHash(); for (ki = First(n); ki.key; ki = Next(ki)) { if (DohIsString(ki.item)) { Setattr(c, ki.key, Copy(ki.item)); } } Setfile(c, Getfile(n)); Setline(c, Getline(n)); return c; } /* ----------------------------------------------------------------------------- * checkAttribute() * ----------------------------------------------------------------------------- */ int checkAttribute(Node *n, const_String_or_char_ptr name, const_String_or_char_ptr value) { String *v = Getattr(n, name); return v ? Equal(v, value) : 0; } /* ----------------------------------------------------------------------------- * Swig_require() * ns - namespace for the view name for saving any attributes under * n - node * ... - list of attribute names of type char* * This method checks that the attribute names exist in the node n and asserts if * not. Assert will only occur unless the attribute is optional. An attribute is * optional if it is prefixed by ?, eg "?value". If the attribute name is prefixed * by * or ?, eg "*value" then a copy of the attribute is saved. The saved * attributes will be restored on a subsequent call to Swig_restore(). All the * saved attributes are saved in the view namespace (prefixed by ns). * This function can be called more than once with different namespaces. * ----------------------------------------------------------------------------- */ void Swig_require(const char *ns, Node *n, ...) { va_list ap; char *name; DOH *obj; va_start(ap, n); name = va_arg(ap, char *); while (name) { int newref = 0; int opt = 0; if (*name == '*') { newref = 1; name++; } else if (*name == '?') { newref = 1; opt = 1; name++; } obj = Getattr(n, name); if (!opt && !obj) { Swig_error(Getfile(n), Getline(n), "Fatal error (Swig_require). Missing attribute '%s' in node '%s'.\n", name, nodeType(n)); assert(obj); } if (!obj) obj = DohNone; if (newref) { /* Save a copy of the attribute */ Setattr(n, NewStringf("%s:%s", ns, name), obj); } name = va_arg(ap, char *); } va_end(ap); /* Save the view */ { String *view = Getattr(n, "view"); if (view) { if (Strcmp(view, ns) != 0) { Setattr(n, NewStringf("%s:view", ns), view); Setattr(n, "view", NewString(ns)); } } else { Setattr(n, "view", NewString(ns)); } } } /* ----------------------------------------------------------------------------- * Swig_save() * Same as Swig_require(), but all attribute names are optional and all attributes * are saved, ie behaves as if all the attribute names were prefixed by ?. * ----------------------------------------------------------------------------- */ void Swig_save(const char *ns, Node *n, ...) { va_list ap; char *name; DOH *obj; va_start(ap, n); name = va_arg(ap, char *); while (name) { if (*name == '*') { name++; } else if (*name == '?') { name++; } obj = Getattr(n, name); if (!obj) obj = DohNone; /* Save a copy of the attribute */ if (Setattr(n, NewStringf("%s:%s", ns, name), obj)) { Printf(stderr, "Swig_save('%s','%s'): Warning, attribute '%s' was already saved.\n", ns, nodeType(n), name); } name = va_arg(ap, char *); } va_end(ap); /* Save the view */ { String *view = Getattr(n, "view"); if (view) { if (Strcmp(view, ns) != 0) { Setattr(n, NewStringf("%s:view", ns), view); Setattr(n, "view", NewString(ns)); } } else { Setattr(n, "view", NewString(ns)); } } } /* ----------------------------------------------------------------------------- * Swig_restore() * Restores attributes saved by a previous call to Swig_require() or Swig_save(). * ----------------------------------------------------------------------------- */ void Swig_restore(Node *n) { String *temp; int len; List *l; String *ns; Iterator ki; ns = Getattr(n, "view"); assert(ns); l = NewList(); temp = NewStringf("%s:", ns); len = Len(temp); for (ki = First(n); ki.key; ki = Next(ki)) { if (Strncmp(temp, ki.key, len) == 0) { Append(l, ki.key); } } for (ki = First(l); ki.item; ki = Next(ki)) { DOH *obj = Getattr(n, ki.item); Setattr(n, Char(ki.item) + len, obj); Delattr(n, ki.item); } Delete(l); Delete(temp); } swig-4.0.1/Source/Swig/cwrap.c0000644000175000017500000014342313527063513016010 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * cwrap.c * * This file defines a variety of wrapping rules for C/C++ handling including * the naming of local variables, calling conventions, and so forth. * ----------------------------------------------------------------------------- */ #include "swig.h" #include "cparse.h" static const char *cresult_variable_name = "result"; static Parm *nonvoid_parms(Parm *p) { if (p) { SwigType *t = Getattr(p, "type"); if (SwigType_type(t) == T_VOID) return 0; } return p; } /* ----------------------------------------------------------------------------- * Swig_cresult_name_set() * * Change the name of the variable used to hold the return value from C/C++ wrapper functions * from the default "result". * ----------------------------------------------------------------------------- */ void Swig_cresult_name_set(const char *new_name) { cresult_variable_name = new_name; } /* ----------------------------------------------------------------------------- * Swig_cresult_name() * * Get the name of the variable used to hold the return value from C/C++ wrapper functions * ----------------------------------------------------------------------------- */ const char *Swig_cresult_name(void) { return cresult_variable_name; } /* ----------------------------------------------------------------------------- * Swig_cparm_name() * * Generates a name for the ith argument in an argument list * ----------------------------------------------------------------------------- */ String *Swig_cparm_name(Parm *p, int i) { String *name = NewStringf("arg%d", i + 1); if (p) { Setattr(p, "lname", name); } return name; } /* ----------------------------------------------------------------------------- * Swig_clocal() * * Creates a string that declares a C local variable type. Converts references * and user defined types to pointers. * ----------------------------------------------------------------------------- */ static String *Swig_clocal(SwigType *t, const_String_or_char_ptr name, const_String_or_char_ptr value) { String *decl; decl = NewStringEmpty(); switch (SwigType_type(t)) { case T_REFERENCE: if (value) { String *lstrname = SwigType_lstr(t, name); String *lstr = SwigType_lstr(t, 0); Printf(decl, "%s = (%s) &%s_defvalue", lstrname, lstr, name); Delete(lstrname); Delete(lstr); } else { String *lstrname = SwigType_lstr(t, name); Printf(decl, "%s = 0", lstrname); Delete(lstrname); } break; case T_RVALUE_REFERENCE: if (value) { String *lstrname = SwigType_lstr(t, name); String *lstr = SwigType_lstr(t, 0); Printf(decl, "%s = (%s) &%s_defrvalue", lstrname, lstr, name); Delete(lstrname); Delete(lstr); } else { String *lstrname = SwigType_lstr(t, name); Printf(decl, "%s = 0", lstrname); Delete(lstrname); } break; case T_VOID: break; case T_VARARGS: Printf(decl, "void *%s = 0", name); break; default: if (value) { String *lcaststr = SwigType_lcaststr(t, value); String *lstr = SwigType_lstr(t, 0); String *lstrn = SwigType_lstr(t, name); Printf(decl, "%s = (%s) %s", lstrn, lstr, lcaststr); Delete(lcaststr); Delete(lstr); Delete(lstrn); } else { String *lstrname = SwigType_lstr(t, name); Append(decl, lstrname); Delete(lstrname); } } return decl; } /* ----------------------------------------------------------------------------- * Swig_wrapped_var_convert() * * Converts a member variable for use in the get and set wrapper methods. * This function only converts user defined types to pointers. * ----------------------------------------------------------------------------- */ String *Swig_wrapped_var_type(SwigType *t, int varcref) { SwigType *ty; if (!Strstr(t, "enum $unnamed")) { ty = Copy(t); } else { /* Change the type for unnamed enum instance variables */ ty = NewString("int"); } if (SwigType_isclass(t)) { if (varcref) { if (cparse_cplusplus) { if (!SwigType_isconst(ty)) SwigType_add_qualifier(ty, "const"); SwigType_add_reference(ty); } else { return Copy(ty); } } else { SwigType_add_pointer(ty); } } return ty; } String *Swig_wrapped_member_var_type(SwigType *t, int varcref) { SwigType *ty; if (!Strstr(t, "enum $unnamed")) { ty = Copy(t); } else { /* Change the type for unnamed enum instance variables */ ty = NewString("int"); } if (SwigType_isclass(t)) { if (varcref) { if (cparse_cplusplus) { if (!SwigType_isconst(ty)) SwigType_add_qualifier(ty, "const"); SwigType_add_reference(ty); } else { return Copy(ty); } } else { SwigType_add_pointer(ty); } } return ty; } static String *Swig_wrapped_var_deref(SwigType *t, const_String_or_char_ptr name, int varcref) { if (SwigType_isclass(t)) { if (varcref) { if (cparse_cplusplus) { return NewStringf("*%s", name); } else { return NewStringf("%s", name); } } else { return NewStringf("*%s", name); } } else { return SwigType_rcaststr(t, name); } } static String *Swig_wrapped_var_assign(SwigType *t, const_String_or_char_ptr name, int varcref) { if (SwigType_isclass(t)) { if (varcref) { return NewStringf("%s", name); } else { return NewStringf("&%s", name); } } else { return SwigType_lcaststr(t, name); } } /* ----------------------------------------------------------------------------- * Swig_cargs() * * Emit all of the local variables for a list of parameters. Returns the * number of parameters. * Default values for the local variables are only emitted if the compact default * argument behaviour is required. * ----------------------------------------------------------------------------- */ int Swig_cargs(Wrapper *w, ParmList *p) { int i = 0; int compactdefargs = ParmList_is_compactdefargs(p); while (p != 0) { String *lname = Swig_cparm_name(p, i); SwigType *pt = Getattr(p, "type"); if ((SwigType_type(pt) != T_VOID)) { String *local = 0; String *type = Getattr(p, "type"); /* default values only emitted if in compact default args mode */ String *pvalue = (compactdefargs) ? Getattr(p, "value") : 0; /* When using compactdefaultargs, the code generated initialises a variable via a constructor call that accepts the * default value as a parameter. The default constructor is not called and therefore SwigValueWrapper is not needed. */ SwigType *altty = pvalue ? 0 : SwigType_alttype(type, 0); int tycode = SwigType_type(type); if (tycode == T_REFERENCE) { if (pvalue) { SwigType *tvalue; String *defname, *defvalue, *rvalue, *qvalue; rvalue = SwigType_typedef_resolve_all(pvalue); qvalue = SwigType_typedef_qualified(rvalue); defname = NewStringf("%s_defvalue", lname); tvalue = Copy(type); SwigType_del_reference(tvalue); tycode = SwigType_type(tvalue); if (tycode != T_USER) { /* plain primitive type, we copy the def value */ String *lstr = SwigType_lstr(tvalue, defname); defvalue = NewStringf("%s = %s", lstr, qvalue); Delete(lstr); } else { /* user type, we copy the reference value */ String *str = SwigType_str(type, defname); defvalue = NewStringf("%s = %s", str, qvalue); Delete(str); } Wrapper_add_localv(w, defname, defvalue, NIL); Delete(tvalue); Delete(rvalue); Delete(qvalue); Delete(defname); Delete(defvalue); } } else if (tycode == T_RVALUE_REFERENCE) { if (pvalue) { SwigType *tvalue; String *defname, *defvalue, *rvalue, *qvalue; rvalue = SwigType_typedef_resolve_all(pvalue); qvalue = SwigType_typedef_qualified(rvalue); defname = NewStringf("%s_defrvalue", lname); tvalue = Copy(type); SwigType_del_rvalue_reference(tvalue); tycode = SwigType_type(tvalue); if (tycode != T_USER) { /* plain primitive type, we copy the def value */ String *lstr = SwigType_lstr(tvalue, defname); defvalue = NewStringf("%s = %s", lstr, qvalue); Delete(lstr); } else { /* user type, we copy the reference value */ String *str = SwigType_str(type, defname); defvalue = NewStringf("%s = %s", str, qvalue); Delete(str); } Wrapper_add_localv(w, defname, defvalue, NIL); Delete(tvalue); Delete(rvalue); Delete(qvalue); Delete(defname); Delete(defvalue); } } else if (!pvalue && ((tycode == T_POINTER) || (tycode == T_STRING) || (tycode == T_WSTRING))) { pvalue = (String *) "0"; } if (!altty) { local = Swig_clocal(pt, lname, pvalue); } else { local = Swig_clocal(altty, lname, pvalue); Delete(altty); } Wrapper_add_localv(w, lname, local, NIL); Delete(local); i++; } Delete(lname); p = nextSibling(p); } return (i); } /* ----------------------------------------------------------------------------- * Swig_cresult() * * This function generates the C code needed to set the result of a C * function call. * ----------------------------------------------------------------------------- */ String *Swig_cresult(SwigType *t, const_String_or_char_ptr name, const_String_or_char_ptr decl) { String *fcall; fcall = NewStringEmpty(); switch (SwigType_type(t)) { case T_VOID: break; case T_REFERENCE: { String *lstr = SwigType_lstr(t, 0); Printf(fcall, "%s = (%s) &", name, lstr); Delete(lstr); } break; case T_RVALUE_REFERENCE: { String *const_lvalue_str; String *lstr = SwigType_lstr(t, 0); SwigType *tt = Copy(t); SwigType_del_rvalue_reference(tt); SwigType_add_qualifier(tt, "const"); SwigType_add_reference(tt); const_lvalue_str = SwigType_rcaststr(tt, 0); Printf(fcall, "%s = (%s) &%s", name, lstr, const_lvalue_str); Delete(const_lvalue_str); Delete(tt); Delete(lstr); } break; case T_USER: Printf(fcall, "%s = ", name); break; default: /* Normal return value */ { String *lstr = SwigType_lstr(t, 0); Printf(fcall, "%s = (%s)", name, lstr); Delete(lstr); } break; } /* Now print out function call */ Append(fcall, decl); /* A sick hack */ { char *c = Char(decl) + Len(decl) - 1; if (!((*c == ';') || (*c == '}'))) Append(fcall, ";"); } return fcall; } /* ----------------------------------------------------------------------------- * Swig_cfunction_call() * * Creates a string that calls a C function using the local variable rules * defined above. * * name(arg0, arg1, arg2, ... argn) * * ----------------------------------------------------------------------------- */ String *Swig_cfunction_call(const_String_or_char_ptr name, ParmList *parms) { String *func; int i = 0; int comma = 0; Parm *p = parms; String *nname; func = NewStringEmpty(); nname = SwigType_namestr(name); /* SWIGTEMPLATEDISAMBIGUATOR is compiler dependent (swiglabels.swg), - SUN Studio 9 requires 'template', - gcc-3.4 forbids the use of 'template'. the rest seems not caring very much, */ if (SwigType_istemplate(name)) { String *prefix = Swig_scopename_prefix(nname); if (!prefix || Len(prefix) == 0) { Printf(func, "%s(", nname); } else { String *last = Swig_scopename_last(nname); Printf(func, "%s::SWIGTEMPLATEDISAMBIGUATOR %s(", prefix, last); Delete(last); } Delete(prefix); } else { Printf(func, "%s(", nname); } Delete(nname); while (p) { SwigType *pt = Getattr(p, "type"); if ((SwigType_type(pt) != T_VOID)) { SwigType *rpt = SwigType_typedef_resolve_all(pt); String *pname = Swig_cparm_name(p, i); String *rcaststr = SwigType_rcaststr(rpt, pname); if (comma) { Printv(func, ",", rcaststr, NIL); } else { Append(func, rcaststr); } Delete(rpt); Delete(pname); Delete(rcaststr); comma = 1; i++; } p = nextSibling(p); } Append(func, ")"); return func; } /* ----------------------------------------------------------------------------- * Swig_cmethod_call() * * Generates a string that calls a C++ method from a list of parameters. * * arg0->name(arg1, arg2, arg3, ..., argn) * * self is an argument that defines how to handle the first argument. Normally, * it should be set to "this->". With C++ proxy classes enabled, it could be * set to "(*this)->" or some similar sequence. * ----------------------------------------------------------------------------- */ static String *Swig_cmethod_call(const_String_or_char_ptr name, ParmList *parms, const_String_or_char_ptr self, String *explicit_qualifier, SwigType *director_type) { String *func, *nname; int i = 0; Parm *p = parms; SwigType *pt; int comma = 0; func = NewStringEmpty(); if (!p) return func; if (!self) self = "(this)->"; Append(func, self); if (SwigType_istemplate(name) && (strncmp(Char(name), "operator ", 9) == 0)) { /* fix for template + operators and compilers like gcc 3.3.5 */ String *tprefix = SwigType_templateprefix(name); nname = tprefix; } else { nname = SwigType_namestr(name); } if (director_type) { const char *pname = "darg"; String *rcaststr = SwigType_rcaststr(director_type, pname); Replaceall(func, "this", rcaststr); Delete(rcaststr); } else { pt = Getattr(p, "type"); /* If the method is invoked through a dereferenced pointer, we don't add any casts (needed for smart pointers). Otherwise, we cast to the appropriate type */ if (Strstr(func, "*this")) { String *pname = Swig_cparm_name(p, 0); Replaceall(func, "this", pname); Delete(pname); } else { String *pname = Swig_cparm_name(p, 0); String *rcaststr = SwigType_rcaststr(pt, pname); Replaceall(func, "this", rcaststr); Delete(rcaststr); Delete(pname); } /* SWIGTEMPLATEDESIMBUAGATOR is compiler dependent (swiglabels.swg), - SUN Studio 9 requires 'template', - gcc-3.4 forbids the use of 'template' (correctly implementing the ISO C++ standard) the others don't seem to care, */ if (SwigType_istemplate(name)) Printf(func, "SWIGTEMPLATEDISAMBIGUATOR "); if (explicit_qualifier) { Printv(func, explicit_qualifier, "::", NIL); } } Printf(func, "%s(", nname); i++; p = nextSibling(p); while (p) { pt = Getattr(p, "type"); if ((SwigType_type(pt) != T_VOID)) { String *pname = Swig_cparm_name(p, i); String *rcaststr = SwigType_rcaststr(pt, pname); if (comma) Append(func, ","); Append(func, rcaststr); Delete(rcaststr); Delete(pname); comma = 1; i++; } p = nextSibling(p); } Append(func, ")"); Delete(nname); return func; } /* ----------------------------------------------------------------------------- * Swig_cconstructor_call() * * Creates a string that calls a C constructor function. * * calloc(1,sizeof(name)); * ----------------------------------------------------------------------------- */ String *Swig_cconstructor_call(const_String_or_char_ptr name) { DOH *func; func = NewStringEmpty(); Printf(func, "calloc(1, sizeof(%s))", name); return func; } /* ----------------------------------------------------------------------------- * Swig_cppconstructor_call() * * Creates a string that calls a C function using the local variable rules * defined above. * * name(arg0, arg1, arg2, ... argn) * * ----------------------------------------------------------------------------- */ String *Swig_cppconstructor_base_call(const_String_or_char_ptr name, ParmList *parms, int skip_self) { String *func; String *nname; int i = 0; int comma = 0; Parm *p = parms; SwigType *pt; if (skip_self) { if (p) p = nextSibling(p); i++; } nname = SwigType_namestr(name); func = NewStringEmpty(); Printf(func, "new %s(", nname); while (p) { pt = Getattr(p, "type"); if ((SwigType_type(pt) != T_VOID)) { String *rcaststr = 0; String *pname = 0; if (comma) Append(func, ","); if (!Getattr(p, "arg:byname")) { pname = Swig_cparm_name(p, i); i++; } else { pname = Getattr(p, "value"); if (pname) pname = Copy(pname); else pname = Copy(Getattr(p, "name")); } rcaststr = SwigType_rcaststr(pt, pname); Append(func, rcaststr); Delete(rcaststr); comma = 1; Delete(pname); } p = nextSibling(p); } Append(func, ")"); Delete(nname); return func; } String *Swig_cppconstructor_call(const_String_or_char_ptr name, ParmList *parms) { return Swig_cppconstructor_base_call(name, parms, 0); } String *Swig_cppconstructor_nodirector_call(const_String_or_char_ptr name, ParmList *parms) { return Swig_cppconstructor_base_call(name, parms, 1); } String *Swig_cppconstructor_director_call(const_String_or_char_ptr name, ParmList *parms) { return Swig_cppconstructor_base_call(name, parms, 0); } /* ----------------------------------------------------------------------------- * recursive_flag_search() * * This function searches for the class attribute 'attr' in the class * 'n' or recursively in its bases. * * If you define SWIG_FAST_REC_SEARCH, the method will set the found * 'attr' in the target class 'n'. If not, the method will set the * 'noattr' one. This prevents of having to navigate the entire * hierarchy tree everytime, so, it is an O(1) method... or something * like that. However, it populates all the parsed classes with the * 'attr' and/or 'noattr' attributes. * * If you undefine the SWIG_FAST_REC_SEARCH no attribute will be set * while searching. This could be slower for large projects with very * large hierarchy trees... or maybe not. But it will be cleaner. * * Maybe later a swig option can be added to switch at runtime. * * ----------------------------------------------------------------------------- */ /* #define SWIG_FAST_REC_SEARCH 1 */ static String *recursive_flag_search(Node *n, const String *attr, const String *noattr) { String *f = 0; n = Swig_methodclass(n); if (GetFlag(n, noattr)) { return 0; } f = GetFlagAttr(n, attr); if (f) { return f; } else { List *bl = Getattr(n, "bases"); if (bl) { Iterator bi; for (bi = First(bl); bi.item; bi = Next(bi)) { f = recursive_flag_search(bi.item, attr, noattr); if (f) { #ifdef SWIG_FAST_REC_SEARCH SetFlagAttr(n, attr, f); #endif return f; } } } } #ifdef SWIG_FAST_REC_SEARCH SetFlag(n, noattr); #endif return 0; } /* ----------------------------------------------------------------------------- * Swig_unref_call() * * Find the "feature:unref" call, if any. * ----------------------------------------------------------------------------- */ String *Swig_unref_call(Node *n) { String *unref = recursive_flag_search(n, "feature:unref", "feature:nounref"); if (unref) { String *pname = Swig_cparm_name(0, 0); unref = NewString(unref); Replaceall(unref, "$this", pname); Replaceall(unref, "$self", pname); Delete(pname); } return unref; } /* ----------------------------------------------------------------------------- * Swig_ref_call() * * Find the "feature:ref" call, if any. * ----------------------------------------------------------------------------- */ String *Swig_ref_call(Node *n, const String *lname) { String *ref = recursive_flag_search(n, "feature:ref", "feature:noref"); if (ref) { ref = NewString(ref); Replaceall(ref, "$this", lname); Replaceall(ref, "$self", lname); } return ref; } /* ----------------------------------------------------------------------------- * Swig_cdestructor_call() * * Creates a string that calls a C destructor function. * * free((char *) arg0); * ----------------------------------------------------------------------------- */ String *Swig_cdestructor_call(Node *n) { Node *cn = Swig_methodclass(n); String *unref = Swig_unref_call(cn); if (unref) { return unref; } else { String *pname = Swig_cparm_name(0, 0); String *call = NewStringf("free((char *) %s);", pname); Delete(pname); return call; } } /* ----------------------------------------------------------------------------- * Swig_cppdestructor_call() * * Creates a string that calls a C destructor function. * * delete arg1; * ----------------------------------------------------------------------------- */ String *Swig_cppdestructor_call(Node *n) { Node *cn = Swig_methodclass(n); String *unref = Swig_unref_call(cn); if (unref) { return unref; } else { String *pname = Swig_cparm_name(0, 0); String *call = NewStringf("delete %s;", pname); Delete(pname); return call; } } /* ----------------------------------------------------------------------------- * Swig_cmemberset_call() * * Generates a string that sets the name of a member in a C++ class or C struct. * * arg0->name = arg1 * * ----------------------------------------------------------------------------- */ String *Swig_cmemberset_call(const_String_or_char_ptr name, SwigType *type, String *self, int varcref) { String *func; String *pname0 = Swig_cparm_name(0, 0); String *pname1 = Swig_cparm_name(0, 1); func = NewStringEmpty(); if (!self) self = NewString("(this)->"); else self = NewString(self); Replaceall(self, "this", pname0); if (SwigType_type(type) != T_ARRAY) { if (!Strstr(type, "enum $unnamed")) { String *dref = Swig_wrapped_var_deref(type, pname1, varcref); int extra_cast = 0; if (cparse_cplusplusout) { /* Required for C nested structs compiled as C++ as a duplicate of the nested struct is put into the global namespace. * We could improve this by adding the extra casts just for nested structs rather than all structs. */ String *base = SwigType_base(type); extra_cast = SwigType_isclass(base); Delete(base); } if (extra_cast) { String *lstr; SwigType *ptype = Copy(type); SwigType_add_pointer(ptype); lstr = SwigType_lstr(ptype, 0); Printf(func, "if (%s) *(%s)&%s%s = %s", pname0, lstr, self, name, dref); Delete(lstr); Delete(ptype); } else { Printf(func, "if (%s) %s%s = %s", pname0, self, name, dref); } Delete(dref); } else { Printf(func, "if (%s && sizeof(int) == sizeof(%s%s)) *(int*)(void*)&(%s%s) = %s", pname0, self, name, self, name, pname1); } } Delete(self); Delete(pname0); Delete(pname1); return (func); } /* ----------------------------------------------------------------------------- * Swig_cmemberget_call() * * Generates a string that sets the name of a member in a C++ class or C struct. * * arg0->name * * ----------------------------------------------------------------------------- */ String *Swig_cmemberget_call(const_String_or_char_ptr name, SwigType *t, String *self, int varcref) { String *func; String *call; String *pname0 = Swig_cparm_name(0, 0); if (!self) self = NewString("(this)->"); else self = NewString(self); Replaceall(self, "this", pname0); func = NewStringEmpty(); call = Swig_wrapped_var_assign(t, "", varcref); Printf(func, "%s (%s%s)", call, self, name); Delete(self); Delete(call); Delete(pname0); return func; } /* ----------------------------------------------------------------------------- * Swig_replace_special_variables() * * Replaces special variables with a value from the supplied node * ----------------------------------------------------------------------------- */ void Swig_replace_special_variables(Node *n, Node *parentnode, String *code) { Node *parentclass = parentnode; String *overloaded = Getattr(n, "sym:overloaded"); Replaceall(code, "$name", Getattr(n, "name")); Replaceall(code, "$symname", Getattr(n, "sym:name")); Replaceall(code, "$wrapname", Getattr(n, "wrap:name")); Replaceall(code, "$overname", overloaded ? Char(Getattr(n, "sym:overname")) : ""); if (Strstr(code, "$decl")) { String *decl = Swig_name_decl(n); Replaceall(code, "$decl", decl); Delete(decl); } if (Strstr(code, "$fulldecl")) { String *fulldecl = Swig_name_fulldecl(n); Replaceall(code, "$fulldecl", fulldecl); Delete(fulldecl); } if (parentclass && !Equal(nodeType(parentclass), "class")) parentclass = 0; if (Strstr(code, "$parentclasssymname")) { String *parentclasssymname = 0; if (parentclass) parentclasssymname = Getattr(parentclass, "sym:name"); Replaceall(code, "$parentclasssymname", parentclasssymname ? parentclasssymname : ""); } if (Strstr(code, "$parentclassname")) { String *parentclassname = 0; if (parentclass) parentclassname = Getattr(parentclass, "name"); Replaceall(code, "$parentclassname", parentclassname ? SwigType_str(parentclassname, "") : ""); } } /* ----------------------------------------------------------------------------- * extension_code() * * Generates an extension function (a function defined in %extend) * * return_type function_name(parms) code * * ----------------------------------------------------------------------------- */ static String *extension_code(Node *n, const String *function_name, ParmList *parms, SwigType *return_type, const String *code, int cplusplus, const String *self) { String *parms_str = cplusplus ? ParmList_str_defaultargs(parms) : ParmList_str(parms); String *sig = NewStringf("%s(%s)", function_name, (cplusplus || Len(parms_str)) ? parms_str : "void"); String *rt_sig = SwigType_str(return_type, sig); String *body = NewStringf("SWIGINTERN %s", rt_sig); Printv(body, code, "\n", NIL); if (Strstr(body, "$")) { Swig_replace_special_variables(n, parentNode(parentNode(n)), body); if (self) Replaceall(body, "$self", self); } Delete(parms_str); Delete(sig); Delete(rt_sig); return body; } /* ----------------------------------------------------------------------------- * Swig_add_extension_code() * * Generates an extension function (a function defined in %extend) and * adds it to the "wrap:code" attribute of a node * * See also extension_code() * * ----------------------------------------------------------------------------- */ int Swig_add_extension_code(Node *n, const String *function_name, ParmList *parms, SwigType *return_type, const String *code, int cplusplus, const String *self) { String *body = extension_code(n, function_name, parms, return_type, code, cplusplus, self); Setattr(n, "wrap:code", body); Delete(body); return SWIG_OK; } /* ----------------------------------------------------------------------------- * Swig_MethodToFunction(Node *n) * * Converts a C++ method node to a function accessor function. * ----------------------------------------------------------------------------- */ int Swig_MethodToFunction(Node *n, const_String_or_char_ptr nspace, String *classname, int flags, SwigType *director_type, int is_director) { String *name; ParmList *parms; SwigType *type; Parm *p; String *self = 0; int is_smart_pointer_overload = 0; String *qualifier = Getattr(n, "qualifier"); String *directorScope = NewString(nspace); Replace(directorScope, NSPACE_SEPARATOR, "_", DOH_REPLACE_ANY); /* If smart pointer without const overload or mutable method, change self dereferencing */ if (flags & CWRAP_SMART_POINTER) { if (flags & CWRAP_SMART_POINTER_OVERLOAD) { if (qualifier && strncmp(Char(qualifier), "q(const)", 8) == 0) { self = NewString("(*(this))->"); is_smart_pointer_overload = 1; } else if (Swig_storage_isstatic(n)) { String *cname = Getattr(n, "extendsmartclassname") ? Getattr(n, "extendsmartclassname") : classname; String *ctname = SwigType_namestr(cname); self = NewStringf("(*(%s const *)this)->", ctname); is_smart_pointer_overload = 1; Delete(ctname); } else { self = NewString("(*this)->"); } } else { self = NewString("(*this)->"); } } /* If node is a member template expansion, we don't allow added code */ if (Getattr(n, "templatetype")) flags &= ~(CWRAP_EXTEND); name = Getattr(n, "name"); parms = CopyParmList(nonvoid_parms(Getattr(n, "parms"))); type = NewString(classname); if (qualifier) { SwigType_push(type, qualifier); } SwigType_add_pointer(type); p = NewParm(type, "self", n); Setattr(p, "self", "1"); Setattr(p, "hidden","1"); /* Disable the 'this' ownership in 'self' to manage inplace operations like: A& A::operator+=(int i) { ...; return *this;} Here the 'self' parameter ownership needs to be disabled since there could be two objects sharing the same 'this' pointer: the input and the result one. And worse, the pointer could be deleted in one of the objects (input), leaving the other (output) with just a seg. fault to happen. To avoid the previous problem, use %feature("self:disown") *::operator+=; %feature("new") *::operator+=; These two lines just transfer the ownership of the 'this' pointer from the input to the output wrapping object. This happens in python, but may also happen in other target languages. */ if (GetFlag(n, "feature:self:disown")) { Setattr(p, "wrap:disown", "1"); } set_nextSibling(p, parms); Delete(type); /* Generate action code for the access */ if (!(flags & CWRAP_EXTEND)) { String *explicit_qualifier = 0; String *call = 0; String *cres = 0; String *explicitcall_name = 0; int pure_virtual = !(Cmp(Getattr(n, "storage"), "virtual")) && !(Cmp(Getattr(n, "value"), "0")); /* Call the explicit method rather than allow for a polymorphic call */ if ((flags & CWRAP_DIRECTOR_TWO_CALLS) || (flags & CWRAP_DIRECTOR_ONE_CALL)) { String *access = Getattr(n, "access"); if (access && (Cmp(access, "protected") == 0)) { /* If protected access (can only be if a director method) then call the extra public accessor method (language module must provide this) */ String *explicit_qualifier_tmp = SwigType_namestr(Getattr(Getattr(parentNode(n), "typescope"), "qname")); explicitcall_name = NewStringf("%sSwigPublic", name); if (Len(directorScope) > 0) explicit_qualifier = NewStringf("SwigDirector_%s_%s", directorScope, explicit_qualifier_tmp); else explicit_qualifier = NewStringf("SwigDirector_%s", explicit_qualifier_tmp); Delete(explicit_qualifier_tmp); } else { explicit_qualifier = SwigType_namestr(Getattr(Getattr(parentNode(n), "typescope"), "qname")); } } if (!self && SwigType_isrvalue_reference(Getattr(n, "refqualifier"))) { String *memory_header = NewString(""); Setfile(memory_header, Getfile(n)); Setline(memory_header, Getline(n)); Swig_fragment_emit(memory_header); self = NewString("std::move(*this)."); Delete(memory_header); } call = Swig_cmethod_call(explicitcall_name ? explicitcall_name : name, p, self, explicit_qualifier, director_type); cres = Swig_cresult(Getattr(n, "type"), Swig_cresult_name(), call); if (pure_virtual && is_director && (flags & CWRAP_DIRECTOR_TWO_CALLS)) { String *qualifier = SwigType_namestr(Getattr(Getattr(parentNode(n), "typescope"), "qname")); Delete(cres); cres = NewStringf("Swig::DirectorPureVirtualException::raise(\"%s::%s\");", qualifier, name); Delete(qualifier); } if (flags & CWRAP_DIRECTOR_TWO_CALLS) { /* Create two method calls, one to call the explicit method, the other a normal polymorphic function call */ String *cres_both_calls = NewStringf(""); String *call_extra = Swig_cmethod_call(name, p, self, 0, director_type); String *cres_extra = Swig_cresult(Getattr(n, "type"), Swig_cresult_name(), call_extra); Printv(cres_both_calls, "if (upcall) {\n", cres, "\n", "} else {", cres_extra, "\n}", NIL); Setattr(n, "wrap:action", cres_both_calls); Delete(cres_extra); Delete(call_extra); Delete(cres_both_calls); } else { Setattr(n, "wrap:action", cres); } Delete(explicitcall_name); Delete(call); Delete(cres); Delete(explicit_qualifier); } else { /* Methods with default arguments are wrapped with additional methods for each default argument, * however, only one extra %extend method is generated. */ String *defaultargs = Getattr(n, "defaultargs"); String *code = Getattr(n, "code"); String *cname = Getattr(n, "extendsmartclassname") ? Getattr(n, "extendsmartclassname") : classname; String *membername = Swig_name_member(nspace, cname, name); String *mangled = Swig_name_mangle(membername); int is_smart_pointer = flags & CWRAP_SMART_POINTER; type = Getattr(n, "type"); /* Check if the method is overloaded. If so, and it has code attached, we append an extra suffix to avoid a name-clash in the generated wrappers. This allows overloaded methods to be defined in C. */ if (Getattr(n, "sym:overloaded") && code) { Append(mangled, Getattr(defaultargs ? defaultargs : n, "sym:overname")); } /* See if there is any code that we need to emit */ if (!defaultargs && code && !is_smart_pointer) { Swig_add_extension_code(n, mangled, p, type, code, cparse_cplusplus, "self"); } if (is_smart_pointer) { int i = 0; Parm *pp = p; String *func = NewStringf("%s(", mangled); String *cres; if (!Swig_storage_isstatic(n)) { String *pname = Swig_cparm_name(pp, i); String *ctname = SwigType_namestr(cname); String *fadd = 0; if (is_smart_pointer_overload) { String *nclassname = SwigType_namestr(classname); fadd = NewStringf("(%s const *)((%s const *)%s)->operator ->()", ctname, nclassname, pname); Delete(nclassname); } else { fadd = NewStringf("(%s*)(%s)->operator ->()", ctname, pname); } Append(func, fadd); Delete(ctname); Delete(fadd); Delete(pname); pp = nextSibling(pp); if (pp) Append(func, ","); } else { pp = nextSibling(pp); } ++i; while (pp) { SwigType *pt = Getattr(pp, "type"); if ((SwigType_type(pt) != T_VOID)) { String *pname = Swig_cparm_name(pp, i++); String *rcaststr = SwigType_rcaststr(pt, pname); Append(func, rcaststr); Delete(rcaststr); Delete(pname); pp = nextSibling(pp); if (pp) Append(func, ","); } } Append(func, ")"); cres = Swig_cresult(Getattr(n, "type"), Swig_cresult_name(), func); Setattr(n, "wrap:action", cres); Delete(cres); } else { String *call = Swig_cfunction_call(mangled, p); String *cres = Swig_cresult(Getattr(n, "type"), Swig_cresult_name(), call); Setattr(n, "wrap:action", cres); Delete(call); Delete(cres); } Delete(membername); Delete(mangled); } Setattr(n, "parms", p); Delete(p); Delete(self); Delete(parms); Delete(directorScope); return SWIG_OK; } /* ----------------------------------------------------------------------------- * Swig_methodclass() * * This function returns the class node for a given method or class. * ----------------------------------------------------------------------------- */ Node *Swig_methodclass(Node *n) { Node *nodetype = nodeType(n); if (Cmp(nodetype, "class") == 0) return n; return GetFlag(n, "feature:extend") ? parentNode(parentNode(n)) : parentNode(n); } int Swig_directorclass(Node *n) { Node *classNode = Swig_methodclass(n); assert(classNode != 0); return (Getattr(classNode, "vtable") != 0); } Node *Swig_directormap(Node *module, String *type) { int is_void = !Cmp(type, "void"); if (!is_void && module) { /* ?? follow the inheritance hierarchy? */ String *base = SwigType_base(type); Node *directormap = Getattr(module, "wrap:directormap"); if (directormap) return Getattr(directormap, base); } return 0; } /* ----------------------------------------------------------------------------- * Swig_ConstructorToFunction() * * This function creates a C wrapper for a C constructor function. * ----------------------------------------------------------------------------- */ int Swig_ConstructorToFunction(Node *n, const_String_or_char_ptr nspace, String *classname, String *none_comparison, String *director_ctor, int cplus, int flags, String *directorname) { Parm *p; ParmList *directorparms; SwigType *type; int use_director = Swig_directorclass(n); ParmList *parms = CopyParmList(nonvoid_parms(Getattr(n, "parms"))); /* Prepend the list of prefix_args (if any) */ Parm *prefix_args = Getattr(n, "director:prefix_args"); if (prefix_args != NIL) { Parm *p2, *p3; directorparms = CopyParmList(prefix_args); for (p = directorparms; nextSibling(p); p = nextSibling(p)); for (p2 = parms; p2; p2 = nextSibling(p2)) { p3 = CopyParm(p2); set_nextSibling(p, p3); Delete(p3); p = p3; } } else directorparms = parms; type = NewString(classname); SwigType_add_pointer(type); if (flags & CWRAP_EXTEND) { /* Constructors with default arguments are wrapped with additional constructor methods for each default argument, * however, only one extra %extend method is generated. */ String *call; String *cres; String *defaultargs = Getattr(n, "defaultargs"); String *code = Getattr(n, "code"); String *membername = Swig_name_construct(nspace, classname); String *mangled = Swig_name_mangle(membername); /* Check if the constructor is overloaded. If so, and it has code attached, we append an extra suffix to avoid a name-clash in the generated wrappers. This allows overloaded constructors to be defined in C. */ if (Getattr(n, "sym:overloaded") && code) { Append(mangled, Getattr(defaultargs ? defaultargs : n, "sym:overname")); } /* See if there is any code that we need to emit */ if (!defaultargs && code) { Swig_add_extension_code(n, mangled, parms, type, code, cparse_cplusplus, "self"); } call = Swig_cfunction_call(mangled, parms); cres = Swig_cresult(type, Swig_cresult_name(), call); Setattr(n, "wrap:action", cres); Delete(cres); Delete(call); Delete(membername); Delete(mangled); } else { if (cplus) { /* if a C++ director class exists, create it rather than the original class */ if (use_director) { Node *parent = Swig_methodclass(n); int abstract = Getattr(parent, "abstracts") != 0; String *action = NewStringEmpty(); String *tmp_none_comparison = Copy(none_comparison); String *director_call; String *nodirector_call; Replaceall(tmp_none_comparison, "$arg", "arg1"); director_call = Swig_cppconstructor_director_call(directorname, directorparms); nodirector_call = Swig_cppconstructor_nodirector_call(classname, parms); if (abstract) { /* whether or not the abstract class has been subclassed in python, * create a director instance (there's no way to create a normal * instance). if any of the pure virtual methods haven't been * implemented in the target language, calls to those methods will * generate Swig::DirectorPureVirtualException exceptions. */ String *cres = Swig_cresult(type, Swig_cresult_name(), director_call); Append(action, cres); Delete(cres); } else { /* (scottm): The code for creating a new director is now a string template that gets passed in via the director_ctor argument. $comparison : an 'if' comparison from none_comparison $director_new: Call new for director class $nondirector_new: Call new for non-director class */ String *cres; Append(action, director_ctor); Replaceall(action, "$comparison", tmp_none_comparison); cres = Swig_cresult(type, Swig_cresult_name(), director_call); Replaceall(action, "$director_new", cres); Delete(cres); cres = Swig_cresult(type, Swig_cresult_name(), nodirector_call); Replaceall(action, "$nondirector_new", cres); Delete(cres); } Setattr(n, "wrap:action", action); Delete(tmp_none_comparison); Delete(action); } else { String *call = Swig_cppconstructor_call(classname, parms); String *cres = Swig_cresult(type, Swig_cresult_name(), call); Setattr(n, "wrap:action", cres); Delete(cres); Delete(call); } } else { String *call = Swig_cconstructor_call(classname); String *cres = Swig_cresult(type, Swig_cresult_name(), call); Setattr(n, "wrap:action", cres); Delete(cres); Delete(call); } } Setattr(n, "type", type); Setattr(n, "parms", parms); Delete(type); if (directorparms != parms) Delete(directorparms); Delete(parms); return SWIG_OK; } /* ----------------------------------------------------------------------------- * Swig_DestructorToFunction() * * This function creates a C wrapper for a destructor function. * ----------------------------------------------------------------------------- */ int Swig_DestructorToFunction(Node *n, const_String_or_char_ptr nspace, String *classname, int cplus, int flags) { SwigType *type; Parm *p; type = NewString(classname); SwigType_add_pointer(type); p = NewParm(type, "self", n); Setattr(p, "self", "1"); Setattr(p, "hidden", "1"); Setattr(p, "wrap:disown", "1"); Delete(type); type = NewString("void"); if (flags & CWRAP_EXTEND) { String *cres; String *call; String *membername, *mangled, *code; membername = Swig_name_destroy(nspace, classname); mangled = Swig_name_mangle(membername); code = Getattr(n, "code"); if (code) { Swig_add_extension_code(n, mangled, p, type, code, cparse_cplusplus, "self"); } call = Swig_cfunction_call(mangled, p); cres = NewStringf("%s;", call); Setattr(n, "wrap:action", cres); Delete(membername); Delete(mangled); Delete(call); Delete(cres); } else { if (cplus) { String *call = Swig_cppdestructor_call(n); String *cres = NewStringf("%s", call); Setattr(n, "wrap:action", cres); Delete(call); Delete(cres); } else { String *call = Swig_cdestructor_call(n); String *cres = NewStringf("%s", call); Setattr(n, "wrap:action", cres); Delete(call); Delete(cres); } } Setattr(n, "type", type); Setattr(n, "parms", p); Delete(type); Delete(p); return SWIG_OK; } /* ----------------------------------------------------------------------------- * Swig_MembersetToFunction() * * This function creates a C wrapper for setting a structure member. * ----------------------------------------------------------------------------- */ int Swig_MembersetToFunction(Node *n, String *classname, int flags) { String *name; ParmList *parms; Parm *p; SwigType *t; SwigType *ty; SwigType *type; SwigType *void_type = NewString("void"); String *self = 0; int varcref = flags & CWRAP_NATURAL_VAR; if (flags & CWRAP_SMART_POINTER) { self = NewString("(*this)->"); } if (flags & CWRAP_ALL_PROTECTED_ACCESS) { self = NewStringf("darg->"); } name = Getattr(n, "name"); type = Getattr(n, "type"); t = NewString(classname); SwigType_add_pointer(t); parms = NewParm(t, "self", n); Setattr(parms, "self", "1"); Setattr(parms, "hidden","1"); Delete(t); ty = Swig_wrapped_member_var_type(type, varcref); p = NewParm(ty, name, n); Setattr(parms, "hidden", "1"); set_nextSibling(parms, p); /* If the type is a pointer or reference. We mark it with a special wrap:disown attribute */ if (SwigType_check_decl(type, "p.")) { Setattr(p, "wrap:disown", "1"); } Delete(p); if (flags & CWRAP_EXTEND) { String *call; String *cres; String *code = Getattr(n, "code"); String *sname = Swig_name_set(0, name); String *membername = Swig_name_member(0, classname, sname); String *mangled = Swig_name_mangle(membername); if (code) { /* I don't think this ever gets run - WSF */ Swig_add_extension_code(n, mangled, parms, void_type, code, cparse_cplusplus, "self"); } call = Swig_cfunction_call(mangled, parms); cres = NewStringf("%s;", call); Setattr(n, "wrap:action", cres); Delete(cres); Delete(call); Delete(mangled); Delete(membername); Delete(sname); } else { String *call = Swig_cmemberset_call(name, type, self, varcref); String *cres = NewStringf("%s;", call); Setattr(n, "wrap:action", cres); Delete(call); Delete(cres); } Setattr(n, "type", void_type); Setattr(n, "parms", parms); Delete(parms); Delete(ty); Delete(void_type); Delete(self); return SWIG_OK; } /* ----------------------------------------------------------------------------- * Swig_MembergetToFunction() * * This function creates a C wrapper for getting a structure member. * ----------------------------------------------------------------------------- */ int Swig_MembergetToFunction(Node *n, String *classname, int flags) { String *name; ParmList *parms; SwigType *t; SwigType *ty; SwigType *type; String *self = 0; int varcref = flags & CWRAP_NATURAL_VAR; if (flags & CWRAP_SMART_POINTER) { if (Swig_storage_isstatic(n)) { Node *sn = Getattr(n, "cplus:staticbase"); String *base = Getattr(sn, "name"); self = NewStringf("%s::", base); } else if (flags & CWRAP_SMART_POINTER_OVERLOAD) { String *nclassname = SwigType_namestr(classname); self = NewStringf("(*(%s const *)this)->", nclassname); Delete(nclassname); } else { self = NewString("(*this)->"); } } if (flags & CWRAP_ALL_PROTECTED_ACCESS) { self = NewStringf("darg->"); } name = Getattr(n, "name"); type = Getattr(n, "type"); t = NewString(classname); SwigType_add_pointer(t); parms = NewParm(t, "self", n); Setattr(parms, "self", "1"); Setattr(parms, "hidden","1"); Delete(t); ty = Swig_wrapped_member_var_type(type, varcref); if (flags & CWRAP_EXTEND) { String *call; String *cres; String *code = Getattr(n, "code"); String *gname = Swig_name_get(0, name); String *membername = Swig_name_member(0, classname, gname); String *mangled = Swig_name_mangle(membername); if (code) { /* I don't think this ever gets run - WSF */ Swig_add_extension_code(n, mangled, parms, ty, code, cparse_cplusplus, "self"); } call = Swig_cfunction_call(mangled, parms); cres = Swig_cresult(ty, Swig_cresult_name(), call); Setattr(n, "wrap:action", cres); Delete(cres); Delete(call); Delete(mangled); Delete(membername); Delete(gname); } else { String *call = Swig_cmemberget_call(name, type, self, varcref); String *cres = Swig_cresult(ty, Swig_cresult_name(), call); Setattr(n, "wrap:action", cres); Delete(call); Delete(cres); } Setattr(n, "type", ty); Setattr(n, "parms", parms); Delete(parms); Delete(ty); return SWIG_OK; } /* ----------------------------------------------------------------------------- * Swig_VarsetToFunction() * * This function creates a C wrapper for setting a global variable or static member * variable. * ----------------------------------------------------------------------------- */ int Swig_VarsetToFunction(Node *n, int flags) { String *name, *nname; ParmList *parms; SwigType *type, *ty; int varcref = flags & CWRAP_NATURAL_VAR; name = Getattr(n, "name"); type = Getattr(n, "type"); nname = SwigType_namestr(name); ty = Swig_wrapped_var_type(type, varcref); parms = NewParm(ty, name, n); if (flags & CWRAP_EXTEND) { String *sname = Swig_name_set(0, name); String *mangled = Swig_name_mangle(sname); String *call = Swig_cfunction_call(mangled, parms); String *cres = NewStringf("%s;", call); Setattr(n, "wrap:action", cres); Delete(cres); Delete(call); Delete(mangled); Delete(sname); } else { if (!Strstr(type, "enum $unnamed")) { String *pname = Swig_cparm_name(0, 0); String *dref = Swig_wrapped_var_deref(type, pname, varcref); String *call = NewStringf("%s = %s;", nname, dref); Setattr(n, "wrap:action", call); Delete(call); Delete(dref); Delete(pname); } else { String *pname = Swig_cparm_name(0, 0); String *call = NewStringf("if (sizeof(int) == sizeof(%s)) *(int*)(void*)&(%s) = %s;", nname, nname, pname); Setattr(n, "wrap:action", call); Delete(pname); Delete(call); } } Setattr(n, "type", "void"); Setattr(n, "parms", parms); Delete(parms); Delete(ty); Delete(nname); return SWIG_OK; } /* ----------------------------------------------------------------------------- * Swig_VargetToFunction() * * This function creates a C wrapper for getting a global variable or static member * variable. * ----------------------------------------------------------------------------- */ int Swig_VargetToFunction(Node *n, int flags) { String *cres, *call; String *name; SwigType *type; SwigType *ty = 0; int varcref = flags & CWRAP_NATURAL_VAR; name = Getattr(n, "name"); type = Getattr(n, "type"); ty = Swig_wrapped_var_type(type, varcref); if (flags & CWRAP_EXTEND) { String *sname = Swig_name_get(0, name); String *mangled = Swig_name_mangle(sname); call = Swig_cfunction_call(mangled, 0); cres = Swig_cresult(ty, Swig_cresult_name(), call); Setattr(n, "wrap:action", cres); Delete(mangled); Delete(sname); } else { String *nname = 0; if (Equal(nodeType(n), "constant")) { String *rawval = Getattr(n, "rawval"); String *value = rawval ? rawval : Getattr(n, "value"); nname = NewStringf("(%s)", value); } else { nname = SwigType_namestr(name); } call = Swig_wrapped_var_assign(type, nname, varcref); cres = Swig_cresult(ty, Swig_cresult_name(), call); Setattr(n, "wrap:action", cres); Delete(nname); } Setattr(n, "type", ty); Delattr(n, "parms"); Delete(cres); Delete(call); Delete(ty); return SWIG_OK; } swig-4.0.1/Source/Swig/deprecate.c0000644000175000017500000000753213527063513016630 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * deprecate.c * * The functions in this file are SWIG core functions that are deprecated * or which do not fit in nicely with everything else. Generally this means * that the function and/or API needs to be changed in some future release. * ----------------------------------------------------------------------------- */ #include "swig.h" /* --------------------------------------------------------------------- * ParmList_is_compactdefargs() * * Returns 1 if the parameter list passed in is marked for compact argument * handling (by the "compactdefargs" attribute). Otherwise returns 0. * ---------------------------------------------------------------------- */ /* Discussion: "compactdefargs" is a property set by the Parser to indicate special handling of default arguments. This property seems to be something that is associated with functions and methods rather than low-level ParmList objects. Therefore, I don't like the fact that this special purpose feature is bolted onto the side of ParmList objects. Proposed solution: 1. "compactdefargs" should be a feature set on function/method nodes instead of ParmList objects. For example, if you have a function, you would check the function node to see if the parameters are to be handled in this way. Difficulties: 1. This is used by functions in cwrap.c and emit.cxx, none of which are passed information about the function/method node. We might have to change the API of those functions to make this work correctly. For example: int emit_num_required(ParmList *parms) might become int emit_num_required(ParmList *parms, int compactargs) */ int ParmList_is_compactdefargs(ParmList *p) { int compactdefargs = 0; if (p) { compactdefargs = Getattr(p, "compactdefargs") ? 1 : 0; /* The "compactdefargs" attribute should only be set on the first parameter in the list. * However, sometimes an extra parameter is inserted at the beginning of the parameter list, * so we check the 2nd parameter too. */ if (!compactdefargs) { Parm *nextparm = nextSibling(p); compactdefargs = (nextparm && Getattr(nextparm, "compactdefargs")) ? 1 : 0; } } return compactdefargs; } /* --------------------------------------------------------------------- * ParmList_errorstr() * * Generate a prototype string suitable for use in error/warning messages. * Similar to ParmList_protostr() but is also aware of hidden parameters. * ---------------------------------------------------------------------- */ /* Discussion. This function is used to generate error messages, but take into account that there might be a hidden parameter. Although this involves parameter lists, it really isn't a core feature of swigparm.h or parms.c. This is because the "hidden" attribute of parameters is added elsewhere (cwrap.c). For now, this function is placed here because it doesn't really seem to fit in with the parms.c interface. */ String *ParmList_errorstr(ParmList *p) { String *out = NewStringEmpty(); while (p) { if (Getattr(p,"hidden")) { p = nextSibling(p); } else { String *pstr = SwigType_str(Getattr(p, "type"), 0); Append(out, pstr); p = nextSibling(p); if (p) { Append(out, ","); } Delete(pstr); } } return out; } swig-4.0.1/Source/Swig/wrapfunc.c0000644000175000017500000003100213527063513016506 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * wrapfunc.c * * This file defines a object for creating wrapper functions. Primarily * this is used for convenience since it allows pieces of a wrapper function * to be created in a piecemeal manner. * ----------------------------------------------------------------------------- */ #include "swig.h" #include static int Compact_mode = 0; /* set to 0 on default */ static int Max_line_size = 128; /* ----------------------------------------------------------------------------- * NewWrapper() * * Create a new wrapper function object. * ----------------------------------------------------------------------------- */ Wrapper *NewWrapper(void) { Wrapper *w; w = (Wrapper *) malloc(sizeof(Wrapper)); w->localh = NewHash(); w->locals = NewStringEmpty(); w->code = NewStringEmpty(); w->def = NewStringEmpty(); return w; } /* ----------------------------------------------------------------------------- * DelWrapper() * * Delete a wrapper function object. * ----------------------------------------------------------------------------- */ void DelWrapper(Wrapper *w) { Delete(w->localh); Delete(w->locals); Delete(w->code); Delete(w->def); free(w); } /* ----------------------------------------------------------------------------- * Wrapper_compact_print_mode_set() * * Set compact_mode. * ----------------------------------------------------------------------------- */ void Wrapper_compact_print_mode_set(int flag) { Compact_mode = flag; } /* ----------------------------------------------------------------------------- * Wrapper_pretty_print() * * Formats a wrapper function and fixes up the indentation. * ----------------------------------------------------------------------------- */ void Wrapper_pretty_print(String *str, File *f) { String *ts; int level = 0; int c, i; int empty = 1; int indent = 2; int plevel = 0; int label = 0; ts = NewStringEmpty(); Seek(str, 0, SEEK_SET); while ((c = Getc(str)) != EOF) { if (c == '\"') { Putc(c, ts); while ((c = Getc(str)) != EOF) { if (c == '\\') { Putc(c, ts); c = Getc(str); } Putc(c, ts); if (c == '\"') break; } empty = 0; } else if (c == '\'') { Putc(c, ts); while ((c = Getc(str)) != EOF) { if (c == '\\') { Putc(c, ts); c = Getc(str); } Putc(c, ts); if (c == '\'') break; } empty = 0; } else if (c == ':') { Putc(c, ts); if ((c = Getc(str)) == '\n') { if (!empty && !strchr(Char(ts), '?')) label = 1; } Ungetc(c, str); } else if (c == '(') { Putc(c, ts); plevel += indent; empty = 0; } else if (c == ')') { Putc(c, ts); plevel -= indent; empty = 0; } else if (c == '{') { Putc(c, ts); Putc('\n', ts); for (i = 0; i < level; i++) Putc(' ', f); Printf(f, "%s", ts); Clear(ts); level += indent; while ((c = Getc(str)) != EOF) { if (!isspace(c)) { Ungetc(c, str); break; } } empty = 0; } else if (c == '}') { if (!empty) { Putc('\n', ts); for (i = 0; i < level; i++) Putc(' ', f); Printf(f, "%s", ts); Clear(ts); } level -= indent; Putc(c, ts); empty = 0; } else if (c == '\n') { Putc(c, ts); empty = 0; if (!empty) { int slevel = level; if (label && (slevel >= indent)) slevel -= indent; if ((Char(ts))[0] != '#') { for (i = 0; i < slevel; i++) Putc(' ', f); } Printf(f, "%s", ts); for (i = 0; i < plevel; i++) Putc(' ', f); } Clear(ts); label = 0; empty = 1; } else if (c == '/') { empty = 0; Putc(c, ts); c = Getc(str); if (c != EOF) { Putc(c, ts); if (c == '/') { /* C++ comment */ while ((c = Getc(str)) != EOF) { if (c == '\n') { Ungetc(c, str); break; } Putc(c, ts); } } else if (c == '*') { /* C comment */ int endstar = 0; while ((c = Getc(str)) != EOF) { if (endstar && c == '/') { /* end of C comment */ Putc(c, ts); break; } endstar = (c == '*'); Putc(c, ts); if (c == '\n') { /* multi-line C comment. Could be improved slightly. */ for (i = 0; i < level; i++) Putc(' ', ts); } } } } } else { if (!empty || !isspace(c)) { Putc(c, ts); empty = 0; } } } if (!empty) Printf(f, "%s", ts); Delete(ts); Printf(f, "\n"); } /* ----------------------------------------------------------------------------- * Wrapper_compact_print() * * Formats a wrapper function and fixes up the indentation. * Print out in compact format, with Compact enabled. * ----------------------------------------------------------------------------- */ void Wrapper_compact_print(String *str, File *f) { String *ts, *tf; /*temp string & temp file */ int level = 0; int c, i; int empty = 1; int indent = 2; ts = NewStringEmpty(); tf = NewStringEmpty(); Seek(str, 0, SEEK_SET); while ((c = Getc(str)) != EOF) { if (c == '\"') { /* string 1 */ empty = 0; Putc(c, ts); while ((c = Getc(str)) != EOF) { if (c == '\\') { Putc(c, ts); c = Getc(str); } Putc(c, ts); if (c == '\"') break; } } else if (c == '\'') { /* string 2 */ empty = 0; Putc(c, ts); while ((c = Getc(str)) != EOF) { if (c == '\\') { Putc(c, ts); c = Getc(str); } Putc(c, ts); if (c == '\'') break; } } else if (c == '{') { /* start of {...} */ empty = 0; Putc(c, ts); if (Len(tf) == 0) { for (i = 0; i < level; i++) Putc(' ', tf); } else if ((Len(tf) + Len(ts)) < Max_line_size) { Putc(' ', tf); } else { Putc('\n', tf); Printf(f, "%s", tf); Clear(tf); for (i = 0; i < level; i++) Putc(' ', tf); } Append(tf, ts); Clear(ts); level += indent; while ((c = Getc(str)) != EOF) { if (!isspace(c)) { Ungetc(c, str); break; } } } else if (c == '}') { /* end of {...} */ empty = 0; if (Len(tf) == 0) { for (i = 0; i < level; i++) Putc(' ', tf); } else if ((Len(tf) + Len(ts)) < Max_line_size) { Putc(' ', tf); } else { Putc('\n', tf); Printf(f, "%s", tf); Clear(tf); for (i = 0; i < level; i++) Putc(' ', tf); } Append(tf, ts); Putc(c, tf); Clear(ts); level -= indent; } else if (c == '\n') { /* line end */ while ((c = Getc(str)) != EOF) { if (!isspace(c)) break; } if (c == '#') { Putc('\n', ts); } else if (c == '}') { Putc(' ', ts); } else if ((c != EOF) || (Len(ts) != 0)) { if (Len(tf) == 0) { for (i = 0; i < level; i++) Putc(' ', tf); } else if ((Len(tf) + Len(ts)) < Max_line_size) { Putc(' ', tf); } else { Putc('\n', tf); Printf(f, "%s", tf); Clear(tf); for (i = 0; i < level; i++) Putc(' ', tf); } Append(tf, ts); Clear(ts); } Ungetc(c, str); empty = 1; } else if (c == '/') { /* comment */ empty = 0; c = Getc(str); if (c != EOF) { if (c == '/') { /* C++ comment */ while ((c = Getc(str)) != EOF) { if (c == '\n') { Ungetc(c, str); break; } } } else if (c == '*') { /* C comment */ int endstar = 0; while ((c = Getc(str)) != EOF) { if (endstar && c == '/') { /* end of C comment */ break; } endstar = (c == '*'); } } else { Putc('/', ts); Putc(c, ts); } } } else if (c == '#') { /* Preprocessor line */ Putc('#', ts); while ((c = Getc(str)) != EOF) { Putc(c, ts); if (c == '\\') { /* Continued line of the same PP */ c = Getc(str); if (c == '\n') Putc(c, ts); else Ungetc(c, str); } else if (c == '\n') break; } if (!empty) { Append(tf, "\n"); } Append(tf, ts); Printf(f, "%s", tf); Clear(tf); Clear(ts); for (i = 0; i < level; i++) Putc(' ', tf); empty = 1; } else { if (!empty || !isspace(c)) { Putc(c, ts); empty = 0; } } } if (!empty) { Append(tf, ts); } if (Len(tf) != 0) Printf(f, "%s", tf); Delete(ts); Delete(tf); Printf(f, "\n"); } /* ----------------------------------------------------------------------------- * Wrapper_print() * * Print out a wrapper function. Does pretty or compact printing as well. * ----------------------------------------------------------------------------- */ void Wrapper_print(Wrapper *w, File *f) { String *str; str = NewStringEmpty(); Printf(str, "%s\n", w->def); Printf(str, "%s\n", w->locals); Printf(str, "%s\n", w->code); if (Compact_mode == 1) Wrapper_compact_print(str, f); else Wrapper_pretty_print(str, f); Delete(str); } /* ----------------------------------------------------------------------------- * Wrapper_add_local() * * Adds a new local variable declaration to a function. Returns -1 if already * present (which may or may not be okay to the caller). * ----------------------------------------------------------------------------- */ int Wrapper_add_local(Wrapper *w, const_String_or_char_ptr name, const_String_or_char_ptr decl) { /* See if the local has already been declared */ if (Getattr(w->localh, name)) { return -1; } Setattr(w->localh, name, decl); Printf(w->locals, "%s;\n", decl); return 0; } /* ----------------------------------------------------------------------------- * Wrapper_add_localv() * * Same as add_local(), but allows a NULL terminated list of strings to be * used as a replacement for decl. This saves the caller the trouble of having * to manually construct the 'decl' string before calling. * ----------------------------------------------------------------------------- */ int Wrapper_add_localv(Wrapper *w, const_String_or_char_ptr name, ...) { va_list ap; int ret; String *decl; DOH *obj; decl = NewStringEmpty(); va_start(ap, name); obj = va_arg(ap, void *); while (obj) { Append(decl, obj); Putc(' ', decl); obj = va_arg(ap, void *); } va_end(ap); ret = Wrapper_add_local(w, name, decl); Delete(decl); return ret; } /* ----------------------------------------------------------------------------- * Wrapper_check_local() * * Check to see if a local name has already been declared * ----------------------------------------------------------------------------- */ int Wrapper_check_local(Wrapper *w, const_String_or_char_ptr name) { if (Getattr(w->localh, name)) { return 1; } return 0; } /* ----------------------------------------------------------------------------- * Wrapper_new_local() * * Adds a new local variable with a guarantee that a unique local name will be * used. Returns the name that was actually selected. * ----------------------------------------------------------------------------- */ char *Wrapper_new_local(Wrapper *w, const_String_or_char_ptr name, const_String_or_char_ptr decl) { int i; String *nname = NewString(name); String *ndecl = NewString(decl); char *ret; i = 0; while (Wrapper_check_local(w, nname)) { Clear(nname); Printf(nname, "%s%d", name, i); i++; } Replace(ndecl, name, nname, DOH_REPLACE_ID); Setattr(w->localh, nname, ndecl); Printf(w->locals, "%s;\n", ndecl); ret = Char(nname); Delete(nname); Delete(ndecl); return ret; /* Note: nname should still exists in the w->localh hash */ } /* ----------------------------------------------------------------------------- * Wrapper_new_localv() * * Same as add_local(), but allows a NULL terminated list of strings to be * used as a replacement for decl. This saves the caller the trouble of having * to manually construct the 'decl' string before calling. * ----------------------------------------------------------------------------- */ char *Wrapper_new_localv(Wrapper *w, const_String_or_char_ptr name, ...) { va_list ap; char *ret; String *decl; DOH *obj; decl = NewStringEmpty(); va_start(ap, name); obj = va_arg(ap, void *); while (obj) { Append(decl, obj); Putc(' ', decl); obj = va_arg(ap, void *); } va_end(ap); ret = Wrapper_new_local(w, name, decl); Delete(decl); return ret; } swig-4.0.1/Source/Swig/swigfile.h0000644000175000017500000000400613527063513016503 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * swigfile.h * * File handling functions in the SWIG core * ----------------------------------------------------------------------------- */ extern List *Swig_add_directory(const_String_or_char_ptr dirname); extern void Swig_push_directory(const_String_or_char_ptr dirname); extern void Swig_pop_directory(void); extern String *Swig_last_file(void); extern List *Swig_search_path(void); extern FILE *Swig_include_open(const_String_or_char_ptr name); extern FILE *Swig_open(const_String_or_char_ptr name); extern String *Swig_read_file(FILE *f); extern String *Swig_include(const_String_or_char_ptr name); extern String *Swig_include_sys(const_String_or_char_ptr name); extern int Swig_insert_file(const_String_or_char_ptr name, File *outfile); extern void Swig_set_push_dir(int dopush); extern int Swig_get_push_dir(void); extern void Swig_register_filebyname(const_String_or_char_ptr filename, File *outfile); extern File *Swig_filebyname(const_String_or_char_ptr filename); extern String *Swig_file_extension(const_String_or_char_ptr filename); extern String *Swig_file_basename(const_String_or_char_ptr filename); extern String *Swig_file_filename(const_String_or_char_ptr filename); extern String *Swig_file_dirname(const_String_or_char_ptr filename); extern void Swig_file_debug_set(); /* Delimiter used in accessing files and directories */ #if defined(MACSWIG) # define SWIG_FILE_DELIMITER ":" #elif defined(_WIN32) # define SWIG_FILE_DELIMITER "\\" #else # define SWIG_FILE_DELIMITER "/" #endif swig-4.0.1/Source/Swig/extend.c0000644000175000017500000001127613527063513016163 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * extend.c * * Extensions support (%extend) * ----------------------------------------------------------------------------- */ #include "swig.h" #include "cparse.h" static Hash *extendhash = 0; /* Hash table of added methods */ /* ----------------------------------------------------------------------------- * Swig_extend_hash() * * Access the extend hash * ----------------------------------------------------------------------------- */ Hash *Swig_extend_hash(void) { if (!extendhash) extendhash = NewHash(); return extendhash; } /* ----------------------------------------------------------------------------- * Swig_extend_merge() * * Extension merge. This function is used to handle the %extend directive * when it appears before a class definition. To handle this, the %extend * actually needs to take precedence. Therefore, we will selectively nuke symbols * from the current symbol table, replacing them with the added methods. * ----------------------------------------------------------------------------- */ void Swig_extend_merge(Node *cls, Node *am) { Node *n; Node *csym; n = firstChild(am); while (n) { String *symname; if (Strcmp(nodeType(n),"constructor") == 0) { symname = Getattr(n,"sym:name"); if (symname) { if (Strcmp(symname,Getattr(n,"name")) == 0) { /* If the name and the sym:name of a constructor are the same, then it hasn't been renamed. However---the name of the class itself might have been renamed so we need to do a consistency check here */ if (Getattr(cls,"sym:name")) { Setattr(n,"sym:name", Getattr(cls,"sym:name")); } } } } symname = Getattr(n,"sym:name"); DohIncref(symname); if ((symname) && (!Getattr(n,"error"))) { /* Remove node from its symbol table */ Swig_symbol_remove(n); csym = Swig_symbol_add(symname,n); if (csym != n) { /* Conflict with previous definition. Nuke previous definition */ String *e = NewStringEmpty(); String *en = NewStringEmpty(); String *ec = NewStringEmpty(); Printf(ec,"Identifier '%s' redefined by %%extend (ignored),",symname); Printf(en,"%%extend definition of '%s'.",symname); SWIG_WARN_NODE_BEGIN(n); Swig_warning(WARN_PARSE_REDEFINED,Getfile(csym),Getline(csym),"%s\n",ec); Swig_warning(WARN_PARSE_REDEFINED,Getfile(n),Getline(n),"%s\n",en); SWIG_WARN_NODE_END(n); Printf(e,"%s:%d:%s\n%s:%d:%s\n",Getfile(csym),Getline(csym),ec, Getfile(n),Getline(n),en); Setattr(csym,"error",e); Delete(e); Delete(en); Delete(ec); Swig_symbol_remove(csym); /* Remove class definition */ Swig_symbol_add(symname,n); /* Insert extend definition */ } } n = nextSibling(n); } } /* ----------------------------------------------------------------------------- * Swig_extend_append_previous() * ----------------------------------------------------------------------------- */ void Swig_extend_append_previous(Node *cls, Node *am) { Node *n, *ne; Node *pe = 0; Node *ae = 0; if (!am) return; n = firstChild(am); while (n) { ne = nextSibling(n); set_nextSibling(n,0); /* typemaps and fragments need to be prepended */ if (((Cmp(nodeType(n),"typemap") == 0) || (Cmp(nodeType(n),"fragment") == 0))) { if (!pe) pe = Swig_cparse_new_node("extend"); appendChild(pe, n); } else { if (!ae) ae = Swig_cparse_new_node("extend"); appendChild(ae, n); } n = ne; } if (pe) prependChild(cls,pe); if (ae) appendChild(cls,ae); } /* ----------------------------------------------------------------------------- * Swig_extend_unused_check() * * Check for unused %extend. Special case, don't report unused * extensions for templates * ----------------------------------------------------------------------------- */ void Swig_extend_unused_check(void) { Iterator ki; if (!extendhash) return; for (ki = First(extendhash); ki.key; ki = Next(ki)) { if (!Strchr(ki.key,'<')) { SWIG_WARN_NODE_BEGIN(ki.item); Swig_warning(WARN_PARSE_EXTEND_UNDEF,Getfile(ki.item), Getline(ki.item), "%%extend defined for an undeclared class %s.\n", SwigType_namestr(ki.key)); SWIG_WARN_NODE_END(ki.item); } } } swig-4.0.1/Source/Swig/swigparm.h0000644000175000017500000000305413527063513016525 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * swigparm.h * * Functions related to the handling of function/method parameters and * parameter lists. * ----------------------------------------------------------------------------- */ /* Individual parameters */ extern Parm *NewParm(SwigType *type, const_String_or_char_ptr name, Node *from_node); extern Parm *NewParmWithoutFileLineInfo(SwigType *type, const_String_or_char_ptr name); extern Parm *NewParmNode(SwigType *type, Node *from_node); extern Parm *CopyParm(Parm *p); /* Parameter lists */ extern ParmList *CopyParmList(ParmList *); extern ParmList *CopyParmListMax(ParmList *, int count); extern int ParmList_len(ParmList *); extern int ParmList_numrequired(ParmList *); extern int ParmList_has_defaultargs(ParmList *p); extern int ParmList_has_varargs(ParmList *p); /* Output functions */ extern String *ParmList_str(ParmList *); extern String *ParmList_str_defaultargs(ParmList *); extern String *ParmList_str_multibrackets(ParmList *); extern String *ParmList_protostr(ParmList *); swig-4.0.1/Source/Swig/stype.c0000644000175000017500000011363213527063513016037 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * stype.c * * This file provides general support for datatypes that are encoded in * the form of simple strings. * ----------------------------------------------------------------------------- */ #include "swig.h" #include "cparse.h" #include /* ----------------------------------------------------------------------------- * Synopsis * * The purpose of this module is to provide a general purpose type representation * based on simple text strings. * * General idea: * * Types are represented by a base type (e.g., "int") and a collection of * type operators applied to the base (e.g., pointers, arrays, etc...). * * Encoding: * * Types are encoded as strings of type constructors such as follows: * * String Encoding C Example * --------------- --------- * p.p.int int ** * a(300).a(400).int int [300][400] * p.q(const).char char const * * * All type constructors are denoted by a trailing '.': * * 'p.' = Pointer (*) * 'r.' = Reference (&) * 'z.' = Rvalue reference (&&) * 'a(n).' = Array of size n [n] * 'f(..,..).' = Function with arguments (args) * 'q(str).' = Qualifier, such as const or volatile (cv-qualifier) * 'm(cls).' = Pointer to member (cls::*) * * The encoding follows the order that you might describe a type in words. * For example "p.a(200).int" is "A pointer to array of int's" and * "p.q(const).char" is "a pointer to a const char". * * This representation of types is fairly convenient because ordinary string * operations can be used for type manipulation. For example, a type could be * formed by combining two strings such as the following: * * "p.p." + "a(400).int" = "p.p.a(400).int" * * Similarly, one could strip a 'const' declaration from a type doing something * like this: * * Replace(t,"q(const).","",DOH_REPLACE_ANY) * * More examples: * * String Encoding C++ Example * --------------- ----------- * p.f(bool).r.q(const).long const long & (*)(bool) * m(Funcs).q(const).f(bool).long long (Funcs::*)(bool) const * r.q(const).m(Funcs).f(int).long long (Funcs::*const &)(int) * m(Funcs).z.q(const).f(bool).long long (Funcs::*)(bool) const && * * Function decl examples: * * f(bool). long a(bool); * r.f(bool). long b(bool) &; * z.f(bool). long c(bool) &&; * z.q(const).f(bool). long d(bool) const &&; * * For the most part, this module tries to minimize the use of special * characters (*, [, <, etc...) in its type encoding. One reason for this * is that SWIG might be extended to encode data in formats such as XML * where you might want to do this: * * * p.p.int * ... * * * Or alternatively, * * blah * * In either case, it's probably best to avoid characters such as '&', '*', or '<'. * * Why not use C syntax? Well, C syntax is fairly complicated to parse * and not particularly easy to manipulate---especially for adding, deleting and * composing type constructors. The string representation presented here makes * this pretty easy. * * Why not use a bunch of nested data structures? Are you kidding? How * would that be easier to use than a few simple string operations? * ----------------------------------------------------------------------------- */ SwigType *NewSwigType(int t) { switch (t) { case T_BOOL: return NewString("bool"); break; case T_INT: return NewString("int"); break; case T_UINT: return NewString("unsigned int"); break; case T_SHORT: return NewString("short"); break; case T_USHORT: return NewString("unsigned short"); break; case T_LONG: return NewString("long"); break; case T_ULONG: return NewString("unsigned long"); break; case T_FLOAT: return NewString("float"); break; case T_DOUBLE: return NewString("double"); break; case T_COMPLEX: return NewString("complex"); break; case T_CHAR: return NewString("char"); break; case T_SCHAR: return NewString("signed char"); break; case T_UCHAR: return NewString("unsigned char"); break; case T_STRING: { SwigType *t = NewString("char"); SwigType_add_qualifier(t, "const"); SwigType_add_pointer(t); return t; break; } case T_WCHAR: return NewString("wchar_t"); break; case T_WSTRING: { SwigType *t = NewString("wchar_t"); SwigType_add_pointer(t); return t; break; } case T_LONGLONG: return NewString("long long"); break; case T_ULONGLONG: return NewString("unsigned long long"); break; case T_VOID: return NewString("void"); break; case T_AUTO: return NewString("auto"); break; default: break; } return NewStringEmpty(); } /* ----------------------------------------------------------------------------- * SwigType_push() * * Push a type constructor onto the type * ----------------------------------------------------------------------------- */ void SwigType_push(SwigType *t, String *cons) { if (!cons) return; if (!Len(cons)) return; if (Len(t)) { char *c = Char(cons); if (c[strlen(c) - 1] != '.') Insert(t, 0, "."); } Insert(t, 0, cons); } /* ----------------------------------------------------------------------------- * SwigType_ispointer_return() * * Testing functions for querying a raw datatype * ----------------------------------------------------------------------------- */ int SwigType_ispointer_return(const SwigType *t) { char *c; int idx; if (!t) return 0; c = Char(t); idx = (int)strlen(c) - 4; if (idx >= 0) { return (strcmp(c + idx, ").p.") == 0); } return 0; } int SwigType_isreference_return(const SwigType *t) { char *c; int idx; if (!t) return 0; c = Char(t); idx = (int)strlen(c) - 4; if (idx >= 0) { return (strcmp(c + idx, ").r.") == 0); } return 0; } int SwigType_isconst(const SwigType *t) { char *c; if (!t) return 0; c = Char(t); if (strncmp(c, "q(", 2) == 0) { String *q = SwigType_parm(t); if (strstr(Char(q), "const")) { Delete(q); return 1; } Delete(q); } /* Hmmm. Might be const through a typedef */ if (SwigType_issimple(t)) { int ret; SwigType *td = SwigType_typedef_resolve(t); if (td) { ret = SwigType_isconst(td); Delete(td); return ret; } } return 0; } int SwigType_ismutable(const SwigType *t) { int r; SwigType *qt = SwigType_typedef_resolve_all(t); if (SwigType_isreference(qt) || SwigType_isrvalue_reference(qt) || SwigType_isarray(qt)) { Delete(SwigType_pop(qt)); } r = SwigType_isconst(qt); Delete(qt); return r ? 0 : 1; } int SwigType_isenum(const SwigType *t) { char *c = Char(t); if (!t) return 0; if (strncmp(c, "enum ", 5) == 0) { return 1; } return 0; } int SwigType_issimple(const SwigType *t) { char *c = Char(t); if (!t) return 0; while (*c) { if (*c == '<') { int nest = 1; c++; while (*c && nest) { if (*c == '<') nest++; if (*c == '>') nest--; c++; } c--; } if (*c == '.') return 0; c++; } return 1; } /* ----------------------------------------------------------------------------- * SwigType_default_create() * * Create the default type for this datatype. This takes a type and strips it * down to a generic form first by resolving all typedefs. * * Rules: * Pointers: p.SWIGTYPE * References: r.SWIGTYPE * Arrays no dimension: a().SWIGTYPE * Arrays with dimension: a(ANY).SWIGTYPE * Member pointer: m(CLASS).SWIGTYPE * Function pointer: f(ANY).SWIGTYPE * Enums: enum SWIGTYPE * Types: SWIGTYPE * * Examples (also see SwigType_default_deduce): * * int [2][4] * a(2).a(4).int * a(ANY).a(ANY).SWIGTYPE * * struct A {}; * typedef A *Aptr; * Aptr const & * r.q(const).Aptr * r.q(const).p.SWIGTYPE * * enum E {e1, e2}; * enum E const & * r.q(const).enum E * r.q(const).enum SWIGTYPE * ----------------------------------------------------------------------------- */ SwigType *SwigType_default_create(const SwigType *ty) { SwigType *r = 0; List *l; Iterator it; int numitems; if (!SwigType_isvarargs(ty)) { SwigType *t = SwigType_typedef_resolve_all(ty); r = NewStringEmpty(); l = SwigType_split(t); numitems = Len(l); if (numitems >= 1) { String *last_subtype = Getitem(l, numitems-1); if (SwigType_isenum(last_subtype)) Setitem(l, numitems-1, NewString("enum SWIGTYPE")); else Setitem(l, numitems-1, NewString("SWIGTYPE")); } for (it = First(l); it.item; it = Next(it)) { String *subtype = it.item; if (SwigType_isarray(subtype)) { if (Equal(subtype, "a().")) Append(r, NewString("a().")); else Append(r, NewString("a(ANY).")); } else if (SwigType_isfunction(subtype)) { Append(r, NewString("f(ANY).SWIGTYPE")); break; } else if (SwigType_ismemberpointer(subtype)) { Append(r, NewString("m(CLASS).SWIGTYPE")); break; } else { Append(r, subtype); } } Delete(l); Delete(t); } return r; } /* ----------------------------------------------------------------------------- * SwigType_default_deduce() * * This function implements type deduction used in the typemap matching rules * and is very close to the type deduction used in partial template class * specialization matching in that the most specialized type is always chosen. * SWIGTYPE is used as the generic type. The basic idea is to repeatedly call * this function to find a deduced type until nothing matches. * * The type t must have already been converted to the default type via a call to * SwigType_default_create() before calling this function. * * Example deductions (matching the examples described in SwigType_default_create), * where the most specialized matches are highest in the list: * * a(ANY).a(ANY).SWIGTYPE * a(ANY).a().SWIGTYPE * a(ANY).p.SWIGTYPE * a(ANY).SWIGTYPE * a().SWIGTYPE * p.SWIGTYPE * SWIGTYPE * * r.q(const).p.SWIGTYPE * r.q(const).SWIGTYPE * r.SWIGTYPE * SWIGTYPE * * r.q(const).enum SWIGTYPE * r.enum SWIGTYPE * r.SWIGTYPE * SWIGTYPE * ----------------------------------------------------------------------------- */ SwigType *SwigType_default_deduce(const SwigType *t) { SwigType *r = NewStringEmpty(); List *l; Iterator it; int numitems; l = SwigType_split(t); numitems = Len(l); if (numitems >= 1) { String *last_subtype = Getitem(l, numitems-1); int is_enum = SwigType_isenum(last_subtype); if (numitems >=2 ) { String *subtype = Getitem(l, numitems-2); /* last but one */ if (SwigType_isarray(subtype)) { if (is_enum) { /* enum deduction, enum SWIGTYPE => SWIGTYPE */ Setitem(l, numitems-1, NewString("SWIGTYPE")); } else { /* array deduction, a(ANY). => a(). => p. */ String *deduced_subtype = 0; if (Strcmp(subtype, "a().") == 0) { deduced_subtype = NewString("p."); } else if (Strcmp(subtype, "a(ANY).") == 0) { deduced_subtype = NewString("a()."); } else { assert(0); } Setitem(l, numitems-2, deduced_subtype); } } else if (SwigType_ismemberpointer(subtype)) { /* member pointer deduction, m(CLASS). => p. */ Setitem(l, numitems-2, NewString("p.")); } else if (is_enum && !SwigType_isqualifier(subtype)) { /* enum deduction, enum SWIGTYPE => SWIGTYPE */ Setitem(l, numitems-1, NewString("SWIGTYPE")); } else { /* simple type deduction, eg, r.p.p. => r.p. */ /* also function pointers eg, p.f(ANY). => p. */ Delitem(l, numitems-2); } } else { if (is_enum) { /* enum deduction, enum SWIGTYPE => SWIGTYPE */ Setitem(l, numitems-1, NewString("SWIGTYPE")); } else { /* delete the only item, we are done with deduction */ Delitem(l, 0); } } } else { assert(0); } for (it = First(l); it.item; it = Next(it)) { Append(r, it.item); } if (Len(r) == 0) { Delete(r); r = 0; } Delete(l); return r; } /* ----------------------------------------------------------------------------- * SwigType_namestr() * * Returns a string of the base type. Takes care of template expansions * ----------------------------------------------------------------------------- */ String *SwigType_namestr(const SwigType *t) { String *r; String *suffix; List *p; int i, sz; char *d = Char(t); char *c = strstr(d, "<("); if (!c || !strstr(c + 2, ")>")) return NewString(t); r = NewStringWithSize(d, (int)(c - d)); if (*(c - 1) == '<') Putc(' ', r); Putc('<', r); p = SwigType_parmlist(c + 1); sz = Len(p); for (i = 0; i < sz; i++) { String *str = SwigType_str(Getitem(p, i), 0); /* Avoid creating a <: token, which is the same as [ in C++ - put a space after '<'. */ if (i == 0 && Len(str)) Putc(' ', r); Append(r, str); if ((i + 1) < sz) Putc(',', r); Delete(str); } Putc(' ', r); Putc('>', r); suffix = SwigType_templatesuffix(t); if (Len(suffix) > 0) { String *suffix_namestr = SwigType_namestr(suffix); Append(r, suffix_namestr); Delete(suffix_namestr); } else { Append(r, suffix); } Delete(suffix); Delete(p); return r; } /* ----------------------------------------------------------------------------- * SwigType_str() * * Create a C string representation of a datatype. * ----------------------------------------------------------------------------- */ String *SwigType_str(const SwigType *s, const_String_or_char_ptr id) { String *result; String *element = 0; String *nextelement; String *forwardelement; SwigType *member_function_qualifiers = 0; List *elements; int nelements, i; if (id) { /* stringify the id expanding templates, for example when the id is a fully qualified templated class name */ String *id_str = NewString(id); /* unfortunate copy due to current const limitations */ result = SwigType_str(id_str, 0); Delete(id_str); } else { result = NewStringEmpty(); } elements = SwigType_split(s); nelements = Len(elements); if (nelements > 0) { element = Getitem(elements, 0); } /* Now, walk the type list and start emitting */ for (i = 0; i < nelements; i++) { if (i < (nelements - 1)) { nextelement = Getitem(elements, i + 1); forwardelement = nextelement; if (SwigType_isqualifier(nextelement)) { if (i < (nelements - 2)) forwardelement = Getitem(elements, i + 2); } } else { nextelement = 0; forwardelement = 0; } if (SwigType_isqualifier(element)) { if (!member_function_qualifiers) { DOH *q = 0; q = SwigType_parm(element); Insert(result, 0, " "); Insert(result, 0, q); Delete(q); } } else if (SwigType_ispointer(element)) { Insert(result, 0, "*"); if ((forwardelement) && ((SwigType_isfunction(forwardelement) || (SwigType_isarray(forwardelement))))) { Insert(result, 0, "("); Append(result, ")"); } } else if (SwigType_ismemberpointer(element)) { String *q; q = SwigType_parm(element); Insert(result, 0, "::*"); Insert(result, 0, q); if ((forwardelement) && ((SwigType_isfunction(forwardelement) || (SwigType_isarray(forwardelement))))) { Insert(result, 0, "("); Append(result, ")"); } { String *next3elements = NewStringEmpty(); int j; for (j = i + 1; j < i + 4 && j < nelements; j++) { Append(next3elements, Getitem(elements, j)); } if (SwigType_isfunction(next3elements)) member_function_qualifiers = SwigType_pop_function_qualifiers(next3elements); Delete(next3elements); } Delete(q); } else if (SwigType_isreference(element)) { if (!member_function_qualifiers) Insert(result, 0, "&"); if ((forwardelement) && ((SwigType_isfunction(forwardelement) || (SwigType_isarray(forwardelement))))) { Insert(result, 0, "("); Append(result, ")"); } } else if (SwigType_isrvalue_reference(element)) { if (!member_function_qualifiers) Insert(result, 0, "&&"); if ((forwardelement) && ((SwigType_isfunction(forwardelement) || (SwigType_isarray(forwardelement))))) { Insert(result, 0, "("); Append(result, ")"); } } else if (SwigType_isarray(element)) { DOH *size; Append(result, "["); size = SwigType_parm(element); Append(result, size); Append(result, "]"); Delete(size); } else if (SwigType_isfunction(element)) { DOH *parms, *p; int j, plen; Append(result, "("); parms = SwigType_parmlist(element); plen = Len(parms); for (j = 0; j < plen; j++) { p = SwigType_str(Getitem(parms, j), 0); Append(result, p); if (j < (plen - 1)) Append(result, ","); } Append(result, ")"); if (member_function_qualifiers) { String *p = SwigType_str(member_function_qualifiers, 0); Append(result, " "); Append(result, p); Delete(p); Delete(member_function_qualifiers); member_function_qualifiers = 0; } Delete(parms); } else { if (strcmp(Char(element), "v(...)") == 0) { Insert(result, 0, "..."); } else { String *bs = SwigType_namestr(element); Insert(result, 0, " "); Insert(result, 0, bs); Delete(bs); } } element = nextelement; } Delete(elements); Chop(result); return result; } /* ----------------------------------------------------------------------------- * SwigType_ltype(const SwigType *ty) * * Create a locally assignable type * ----------------------------------------------------------------------------- */ SwigType *SwigType_ltype(const SwigType *s) { String *result; String *element; SwigType *td, *tc = 0; List *elements; int nelements, i; int firstarray = 1; int notypeconv = 0; int ignore_member_function_qualifiers = 0; result = NewStringEmpty(); tc = Copy(s); /* Nuke all leading qualifiers */ while (SwigType_isqualifier(tc)) { Delete(SwigType_pop(tc)); } if (SwigType_issimple(tc)) { /* Resolve any typedef definitions */ SwigType *tt = Copy(tc); td = 0; while ((td = SwigType_typedef_resolve(tt))) { if (td && (SwigType_isconst(td) || SwigType_isarray(td) || SwigType_isreference(td) || SwigType_isrvalue_reference(td))) { /* We need to use the typedef type */ Delete(tt); break; } else if (td) { Delete(tt); tt = td; } } if (td) { Delete(tc); tc = td; } } elements = SwigType_split(tc); nelements = Len(elements); /* Now, walk the type list and start emitting */ for (i = 0; i < nelements; i++) { element = Getitem(elements, i); /* when we see a function, we need to preserve the following types */ if (SwigType_isfunction(element)) { notypeconv = 1; ignore_member_function_qualifiers = 0; } if (ignore_member_function_qualifiers) { /* cv-qualifiers and ref-qualifiers up until the f() element have already been added */ } else if (SwigType_isqualifier(element)) { /* swallow cv-qualifiers */ } else if (SwigType_ispointer(element)) { Append(result, element); firstarray = 0; } else if (SwigType_ismemberpointer(element)) { Append(result, element); { String *next3elements = NewStringEmpty(); int j; for (j = i + 1; j < i + 4 && j < nelements; j++) { Append(next3elements, Getitem(elements, j)); } if (SwigType_isfunction(next3elements)) { SwigType *member_function_qualifiers = SwigType_pop_function_qualifiers(next3elements); /* compilers won't let us cast from a member function without qualifiers to one with qualifiers, so the qualifiers are kept in the ltype */ if (member_function_qualifiers) Append(result, member_function_qualifiers); Delete(member_function_qualifiers); ignore_member_function_qualifiers = 1; } Delete(next3elements); } firstarray = 0; } else if (SwigType_isreference(element)) { if (notypeconv) { Append(result, element); } else { Append(result, "p."); } firstarray = 0; } else if (SwigType_isrvalue_reference(element)) { if (notypeconv) { Append(result, element); } else { Append(result, "p."); } firstarray = 0; } else if (SwigType_isarray(element) && firstarray) { if (notypeconv) { Append(result, element); } else { Append(result, "p."); } firstarray = 0; } else if (SwigType_isenum(element)) { int anonymous_enum = (Cmp(element, "enum ") == 0); if (notypeconv || !anonymous_enum) { Append(result, element); } else { Append(result, "int"); } } else { Append(result, element); } } Delete(elements); Delete(tc); return result; } /* ----------------------------------------------------------------------------- * SwigType_lstr() * * Produces a type-string that is suitable as a lvalue in an expression. * That is, a type that can be freely assigned a value without violating * any C assignment rules. * * - Qualifiers such as 'const' and 'volatile' are stripped. * Except for member function cv-qualifiers and ref-qualifiers. * - Arrays are converted into a *single* pointer (i.e., * double [][] becomes double *). * - References are converted into a pointer. * - Typedef names that refer to read-only types will be replaced * with an equivalent assignable version. * -------------------------------------------------------------------- */ String *SwigType_lstr(const SwigType *s, const_String_or_char_ptr id) { String *result; SwigType *tc; tc = SwigType_ltype(s); result = SwigType_str(tc, id); Delete(tc); return result; } /* ----------------------------------------------------------------------------- * SwigType_rcaststr() * * Produces a casting string that maps the type returned by lstr() to the real * datatype printed by str(). * ----------------------------------------------------------------------------- */ String *SwigType_rcaststr(const SwigType *s, const_String_or_char_ptr name) { String *result, *cast; String *element = 0; String *nextelement; String *forwardelement; String *member_function_qualifiers = 0; SwigType *td, *tc = 0; const SwigType *rs; List *elements; int nelements, i; int clear = 1; int firstarray = 1; int isreference = 0; int isfunction = 0; result = NewStringEmpty(); if (SwigType_isconst(s)) { tc = Copy(s); Delete(SwigType_pop(tc)); if (SwigType_ismemberpointer(tc)) rs = s; else rs = tc; } else { rs = s; } if ((SwigType_isconst(rs) || SwigType_isarray(rs) || SwigType_isreference(rs) || SwigType_isrvalue_reference(rs))) { td = 0; } else { td = SwigType_typedef_resolve(rs); } if (td) { if ((SwigType_isconst(td) || SwigType_isarray(td) || SwigType_isreference(td) || SwigType_isrvalue_reference(td))) { elements = SwigType_split(td); } else { elements = SwigType_split(rs); } Delete(td); } else { elements = SwigType_split(rs); } nelements = Len(elements); if (nelements > 0) { element = Getitem(elements, 0); } /* Now, walk the type list and start emitting */ for (i = 0; i < nelements; i++) { if (i < (nelements - 1)) { nextelement = Getitem(elements, i + 1); forwardelement = nextelement; if (SwigType_isqualifier(nextelement)) { if (i < (nelements - 2)) forwardelement = Getitem(elements, i + 2); } } else { nextelement = 0; forwardelement = 0; } if (SwigType_isqualifier(element)) { if (!member_function_qualifiers) { DOH *q = 0; q = SwigType_parm(element); Insert(result, 0, " "); Insert(result, 0, q); Delete(q); clear = 0; } } else if (SwigType_ispointer(element)) { Insert(result, 0, "*"); if ((forwardelement) && ((SwigType_isfunction(forwardelement) || (SwigType_isarray(forwardelement))))) { Insert(result, 0, "("); Append(result, ")"); } firstarray = 0; } else if (SwigType_ismemberpointer(element)) { String *q; Insert(result, 0, "::*"); q = SwigType_parm(element); Insert(result, 0, q); if ((forwardelement) && ((SwigType_isfunction(forwardelement) || (SwigType_isarray(forwardelement))))) { Insert(result, 0, "("); Append(result, ")"); } { String *next3elements = NewStringEmpty(); int j; for (j = i + 1; j < i + 4 && j < nelements; j++) { Append(next3elements, Getitem(elements, j)); } if (SwigType_isfunction(next3elements)) member_function_qualifiers = SwigType_pop_function_qualifiers(next3elements); Delete(next3elements); } firstarray = 0; Delete(q); } else if (SwigType_isreference(element)) { if (!member_function_qualifiers) { Insert(result, 0, "&"); if (!isfunction) isreference = 1; } if ((forwardelement) && ((SwigType_isfunction(forwardelement) || (SwigType_isarray(forwardelement))))) { Insert(result, 0, "("); Append(result, ")"); } } else if (SwigType_isrvalue_reference(element)) { if (!member_function_qualifiers) { Insert(result, 0, "&&"); if (!isfunction) isreference = 1; } if ((forwardelement) && ((SwigType_isfunction(forwardelement) || (SwigType_isarray(forwardelement))))) { Insert(result, 0, "("); Append(result, ")"); } clear = 0; } else if (SwigType_isarray(element)) { DOH *size; if (firstarray && !isreference) { Append(result, "(*)"); firstarray = 0; } else { Append(result, "["); size = SwigType_parm(element); Append(result, size); Append(result, "]"); Delete(size); clear = 0; } } else if (SwigType_isfunction(element)) { DOH *parms, *p; int j, plen; Append(result, "("); parms = SwigType_parmlist(element); plen = Len(parms); for (j = 0; j < plen; j++) { p = SwigType_str(Getitem(parms, j), 0); Append(result, p); Delete(p); if (j < (plen - 1)) Append(result, ","); } Append(result, ")"); Delete(parms); if (member_function_qualifiers) { String *p = SwigType_str(member_function_qualifiers, 0); Append(result, " "); Append(result, p); Delete(p); Delete(member_function_qualifiers); member_function_qualifiers = 0; clear = 0; } isfunction = 1; } else { String *bs = SwigType_namestr(element); Insert(result, 0, " "); Insert(result, 0, bs); Delete(bs); } element = nextelement; } Delete(elements); if (clear) { cast = NewStringEmpty(); } else { cast = NewStringf("(%s)", result); } if (name) { if (isreference) { Append(cast, "*"); } Append(cast, name); } Delete(result); Delete(tc); return cast; } /* ----------------------------------------------------------------------------- * SwigType_lcaststr() * * Casts a variable from the real type to the local datatype. * ----------------------------------------------------------------------------- */ String *SwigType_lcaststr(const SwigType *s, const_String_or_char_ptr name) { String *result; result = NewStringEmpty(); if (SwigType_isarray(s)) { String *lstr = SwigType_lstr(s, 0); Printf(result, "(%s)%s", lstr, name); Delete(lstr); } else if (SwigType_isreference(s)) { String *str = SwigType_str(s, 0); Printf(result, "(%s)", str); Delete(str); if (name) Append(result, name); } else if (SwigType_isrvalue_reference(s)) { String *str = SwigType_str(s, 0); Printf(result, "(%s)", str); Delete(str); if (name) Append(result, name); } else if (SwigType_isqualifier(s)) { String *lstr = SwigType_lstr(s, 0); Printf(result, "(%s)%s", lstr, name); Delete(lstr); } else { if (name) Append(result, name); } return result; } #if 0 /* Alternative implementation for manglestr_default. Mangling is similar to the original except for a few subtle differences for example in templates: namespace foo { template class bar {}; typedef int Integer; void test2(bar *x); } Mangling is more consistent and changes from _p_foo__barT_int_p_t to _p_foo__barT_p_int_t. */ static void mangle_stringcopy(String *destination, const char *source, int count) { while (count-- > 0) { char newc = '_'; if (!(*source == '.' || *source == ':' || *source == ' ')) newc = *source; /* TODO: occasionally '*' or numerics need converting to '_', eg in array dimensions and template expressions */ Putc(newc, destination); source++; } } static void mangle_subtype(String *mangled, SwigType *s); /* ----------------------------------------------------------------------------- * mangle_namestr() * * Mangles a type taking care of template expansions. Similar to SwigType_namestr(). * The type may include a trailing '.', for example "p." * ----------------------------------------------------------------------------- */ static void mangle_namestr(String *mangled, SwigType *t) { int length = Len(t); if (SwigType_isqualifier(t)) { Append(mangled, "q_"); mangle_stringcopy(mangled, Char(t)+2, length-4); Append(mangled, "__"); } else if (SwigType_ismemberpointer(t)) { Append(mangled, "m_"); mangle_stringcopy(mangled, Char(t)+2, length-4); Append(mangled, "__"); } else if (SwigType_isarray(t)) { Append(mangled, "a_"); mangle_stringcopy(mangled, Char(t)+2, length-4); Append(mangled, "__"); } else if (SwigType_isfunction(t)) { List *p = SwigType_parmlist(t); int sz = Len(p); int i; Append(mangled, "f_"); for (i = 0; i < sz; i++) { mangle_subtype(mangled, Getitem(p, i)); Putc('_', mangled); } Append(mangled, (sz > 0) ? "_" : "__"); } else if (SwigType_isvarargs(t)) { Append(mangled, "___"); } else { char *d = Char(t); char *c = strstr(d, "<("); if (!c || !strstr(c + 2, ")>")) { /* not a template type */ mangle_stringcopy(mangled, Char(t), Len(t)); } else { /* a template type */ String *suffix; List *p; int i, sz; mangle_stringcopy(mangled, d, c-d); Putc('T', mangled); Putc('_', mangled); p = SwigType_parmlist(c + 1); sz = Len(p); for (i = 0; i < sz; i++) { mangle_subtype(mangled, Getitem(p, i)); Putc('_', mangled); } Putc('t', mangled); suffix = SwigType_templatesuffix(t); if (Len(suffix) > 0) { mangle_namestr(mangled, suffix); } else { Append(mangled, suffix); } Delete(suffix); Delete(p); } } } static void mangle_subtype(String *mangled, SwigType *s) { List *elements; int nelements, i; assert(s); elements = SwigType_split(s); nelements = Len(elements); for (i = 0; i < nelements; i++) { SwigType *element = Getitem(elements, i); mangle_namestr(mangled, element); } Delete(elements); } static String *manglestr_default(const SwigType *s) { String *mangled = NewString("_"); SwigType *sr = SwigType_typedef_resolve_all(s); SwigType *sq = SwigType_typedef_qualified(sr); SwigType *ss = SwigType_remove_global_scope_prefix(sq); SwigType *type = ss; SwigType *lt; if (SwigType_istemplate(ss)) { SwigType *ty = Swig_symbol_template_deftype(ss, 0); Delete(ss); ss = ty; type = ss; } lt = SwigType_ltype(type); Replace(lt, "struct ", "", DOH_REPLACE_ANY); Replace(lt, "class ", "", DOH_REPLACE_ANY); Replace(lt, "union ", "", DOH_REPLACE_ANY); Replace(lt, "enum ", "", DOH_REPLACE_ANY); mangle_subtype(mangled, lt); Delete(ss); Delete(sq); Delete(sr); return mangled; } #else static String *manglestr_default(const SwigType *s) { char *c; String *result = 0; String *base = 0; SwigType *lt; SwigType *sr = SwigType_typedef_resolve_all(s); SwigType *sq = SwigType_typedef_qualified(sr); SwigType *ss = SwigType_remove_global_scope_prefix(sq); SwigType *type = ss; if (SwigType_istemplate(ss)) { SwigType *ty = Swig_symbol_template_deftype(ss, 0); Delete(ss); ss = ty; type = ss; } lt = SwigType_ltype(type); result = SwigType_prefix(lt); base = SwigType_base(lt); c = Char(result); while (*c) { if (!isalnum((int) *c)) *c = '_'; c++; } if (SwigType_istemplate(base)) { String *b = SwigType_namestr(base); Delete(base); base = b; } Replace(base, "struct ", "", DOH_REPLACE_ANY); /* This might be problematic */ Replace(base, "class ", "", DOH_REPLACE_ANY); Replace(base, "union ", "", DOH_REPLACE_ANY); Replace(base, "enum ", "", DOH_REPLACE_ANY); c = Char(base); while (*c) { if (*c == '<') *c = 'T'; else if (*c == '>') *c = 't'; else if (*c == '*') *c = 'p'; else if (*c == '[') *c = 'a'; else if (*c == ']') *c = 'A'; else if (*c == '&') *c = 'R'; else if (*c == '(') *c = 'f'; else if (*c == ')') *c = 'F'; else if (!isalnum((int) *c)) *c = '_'; c++; } Append(result, base); Insert(result, 0, "_"); Delete(lt); Delete(base); Delete(ss); Delete(sq); Delete(sr); return result; } #endif String *SwigType_manglestr(const SwigType *s) { #if 0 /* Debugging checks to ensure a proper SwigType is passed in and not a stringified type */ String *angle = Strstr(s, "<"); if (angle && Strncmp(angle, "<(", 2) != 0) Printf(stderr, "SwigType_manglestr error: %s\n", s); else if (Strstr(s, "*") || Strstr(s, "&") || Strstr(s, "[")) Printf(stderr, "SwigType_manglestr error: %s\n", s); #endif return manglestr_default(s); } /* ----------------------------------------------------------------------------- * SwigType_typename_replace() * * Replaces a typename in a type with something else. Needed for templates. * ----------------------------------------------------------------------------- */ void SwigType_typename_replace(SwigType *t, String *pat, String *rep) { String *nt; int i, ilen; List *elem; if (!Strstr(t, pat)) return; if (Equal(t, pat)) { Replace(t, pat, rep, DOH_REPLACE_ANY); return; } nt = NewStringEmpty(); elem = SwigType_split(t); ilen = Len(elem); for (i = 0; i < ilen; i++) { String *e = Getitem(elem, i); if (SwigType_issimple(e)) { if (Equal(e, pat)) { /* Replaces a type of the form 'pat' with 'rep' */ Replace(e, pat, rep, DOH_REPLACE_ANY); } else if (SwigType_istemplate(e)) { /* Replaces a type of the form 'pat' with 'rep' */ if (Equal(e, pat)) { String *repbase = SwigType_templateprefix(rep); Replace(e, pat, repbase, DOH_REPLACE_ID | DOH_REPLACE_FIRST); Delete(repbase); } { String *tsuffix; List *tparms = SwigType_parmlist(e); int j, jlen; String *nt = SwigType_templateprefix(e); Append(nt, "<("); jlen = Len(tparms); for (j = 0; j < jlen; j++) { SwigType_typename_replace(Getitem(tparms, j), pat, rep); Append(nt, Getitem(tparms, j)); if (j < (jlen - 1)) Putc(',', nt); } tsuffix = SwigType_templatesuffix(e); SwigType_typename_replace(tsuffix, pat, rep); Printf(nt, ")>%s", tsuffix); Delete(tsuffix); Clear(e); Append(e, nt); Delete(nt); Delete(tparms); } } else if (Swig_scopename_check(e)) { String *first = 0; String *rest = 0; Swig_scopename_split(e, &first, &rest); /* Swig_scopename_split doesn't handle :: prefix very well ... could do with a rework */ if (Strncmp(rest, "::", 2) == 0) { String *tmp = NewString(Char(rest) + 2); Clear(rest); Printv(rest, tmp, NIL); Delete(tmp); assert(!first); } Clear(e); if (first) SwigType_typename_replace(first, pat, rep); SwigType_typename_replace(rest, pat, rep); Printv(e, first ? first : "", "::", rest, NIL); Delete(first); Delete(rest); } } else if (SwigType_isfunction(e)) { int j, jlen; List *fparms = SwigType_parmlist(e); Clear(e); Append(e, "f("); jlen = Len(fparms); for (j = 0; j < jlen; j++) { SwigType_typename_replace(Getitem(fparms, j), pat, rep); Append(e, Getitem(fparms, j)); if (j < (jlen - 1)) Putc(',', e); } Append(e, ")."); Delete(fparms); } else if (SwigType_isarray(e)) { Replace(e, pat, rep, DOH_REPLACE_ID); } Append(nt, e); } Clear(t); Append(t, nt); Delete(nt); Delete(elem); } /* ----------------------------------------------------------------------------- * SwigType_remove_global_scope_prefix() * * Removes the unary scope operator (::) prefix indicating global scope in all * components of the type * ----------------------------------------------------------------------------- */ SwigType *SwigType_remove_global_scope_prefix(const SwigType *t) { SwigType *result; const char *type = Char(t); if (strncmp(type, "::", 2) == 0) type += 2; result = NewString(type); Replaceall(result, ".::", "."); Replaceall(result, "(::", "("); Replaceall(result, "enum ::", "enum "); return result; } /* ----------------------------------------------------------------------------- * SwigType_check_decl() * * Checks type declarators for a match * ----------------------------------------------------------------------------- */ int SwigType_check_decl(const SwigType *ty, const SwigType *decl) { SwigType *t, *t1, *t2; int r; t = SwigType_typedef_resolve_all(ty); t1 = SwigType_strip_qualifiers(t); t2 = SwigType_prefix(t1); r = Equal(t2, decl); Delete(t); Delete(t1); Delete(t2); return r == 1; } swig-4.0.1/Source/Modules/0000755000175000017500000000000013527063513015220 5ustar williamwilliamswig-4.0.1/Source/Modules/octave.cxx0000644000175000017500000014356713527063513017245 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * octave.cxx * * Octave language module for SWIG. * ----------------------------------------------------------------------------- */ #include "swigmod.h" #include "cparse.h" static String *global_name = 0; static String *op_prefix = 0; static const char *usage = "\ Octave Options (available with -octave)\n\ -globals - Set used to access C global variables [default: 'cvar']\n\ Use '.' to load C global variables into module namespace\n\ -opprefix - Prefix for global operator functions [default: 'op_']\n\ \n"; class OCTAVE:public Language { private: File *f_begin; File *f_runtime; File *f_header; File *f_doc; File *f_wrappers; File *f_init; File *f_initbeforefunc; File *f_directors; File *f_directors_h; String *s_global_tab; String *s_members_tab; String *class_name; int have_constructor; int have_destructor; String *constructor_name; Hash *docs; void Octave_begin_function(Node *n, File *f, const_String_or_char_ptr cname, const_String_or_char_ptr wname, bool dld) { if (dld) { String *tname = texinfo_name(n, "std::string()"); Printf(f, "SWIG_DEFUN( %s, %s, %s ) {", cname, wname, tname); } else { Printf(f, "static octave_value_list %s (const octave_value_list& args, int nargout) {", wname); } } public: OCTAVE(): f_begin(0), f_runtime(0), f_header(0), f_doc(0), f_wrappers(0), f_init(0), f_initbeforefunc(0), f_directors(0), f_directors_h(0), s_global_tab(0), s_members_tab(0), class_name(0), have_constructor(0), have_destructor(0), constructor_name(0), docs(0) { /* Add code to manage protected constructors and directors */ director_prot_ctor_code = NewString(""); Printv(director_prot_ctor_code, "if ( $comparison ) { /* subclassed */\n", " $director_new \n", "} else {\n", " error(\"accessing abstract class or protected constructor\"); \n", " SWIG_fail;\n", "}\n", NIL); enable_cplus_runtime_mode(); allow_overloading(); director_multiple_inheritance = 1; director_language = 1; docs = NewHash(); } virtual void main(int argc, char *argv[]) { for (int i = 1; i < argc; i++) { if (argv[i]) { if (strcmp(argv[i], "-help") == 0) { fputs(usage, stdout); } else if (strcmp(argv[i], "-globals") == 0) { if (argv[i + 1]) { global_name = NewString(argv[i + 1]); Swig_mark_arg(i); Swig_mark_arg(i + 1); i++; } else { Swig_arg_error(); } } else if (strcmp(argv[i], "-opprefix") == 0) { if (argv[i + 1]) { op_prefix = NewString(argv[i + 1]); Swig_mark_arg(i); Swig_mark_arg(i + 1); i++; } else { Swig_arg_error(); } } else if (strcmp(argv[i], "-cppcast") == 0) { Printf(stderr, "Deprecated command line option: %s. This option is now always on.\n", argv[i]); Swig_mark_arg(i); } else if (strcmp(argv[i], "-nocppcast") == 0) { Printf(stderr, "Deprecated command line option: %s. This option is no longer supported.\n", argv[i]); Swig_mark_arg(i); SWIG_exit(EXIT_FAILURE); } } } if (!global_name) global_name = NewString("cvar"); if (!op_prefix) op_prefix = NewString("op_"); SWIG_library_directory("octave"); Preprocessor_define("SWIGOCTAVE 1", 0); SWIG_config_file("octave.swg"); SWIG_typemap_lang("octave"); allow_overloading(); // Octave API is C++, so output must be C++ compatible even when wrapping C code if (!cparse_cplusplus) Swig_cparse_cplusplusout(1); } virtual int top(Node *n) { { Node *mod = Getattr(n, "module"); if (mod) { Node *options = Getattr(mod, "options"); if (options) { int dirprot = 0; if (Getattr(options, "dirprot")) { dirprot = 1; } if (Getattr(options, "nodirprot")) { dirprot = 0; } if (Getattr(options, "directors")) { allow_directors(); if (dirprot) allow_dirprot(); } } } } String *module = Getattr(n, "name"); String *outfile = Getattr(n, "outfile"); f_begin = NewFile(outfile, "w", SWIG_output_files()); if (!f_begin) { FileErrorDisplay(outfile); SWIG_exit(EXIT_FAILURE); } f_runtime = NewString(""); f_header = NewString(""); f_doc = NewString(""); f_wrappers = NewString(""); f_init = NewString(""); f_initbeforefunc = NewString(""); f_directors_h = NewString(""); f_directors = NewString(""); s_global_tab = NewString(""); Swig_register_filebyname("begin", f_begin); Swig_register_filebyname("runtime", f_runtime); Swig_register_filebyname("header", f_header); Swig_register_filebyname("doc", f_doc); Swig_register_filebyname("wrapper", f_wrappers); Swig_register_filebyname("init", f_init); Swig_register_filebyname("initbeforefunc", f_initbeforefunc); Swig_register_filebyname("director", f_directors); Swig_register_filebyname("director_h", f_directors_h); Swig_banner(f_begin); Printf(f_runtime, "\n\n#ifndef SWIGOCTAVE\n#define SWIGOCTAVE\n#endif\n\n"); Printf(f_runtime, "#define SWIG_name_d \"%s\"\n", module); Printf(f_runtime, "#define SWIG_name %s\n", module); Printf(f_runtime, "\n"); Printf(f_runtime, "#define SWIG_global_name \"%s\"\n", global_name); Printf(f_runtime, "#define SWIG_op_prefix \"%s\"\n", op_prefix); if (directorsEnabled()) { Printf(f_runtime, "#define SWIG_DIRECTORS\n"); Swig_banner(f_directors_h); if (dirprot_mode()) { // Printf(f_directors_h, "#include \n"); // Printf(f_directors_h, "#include \n\n"); } } Printf(f_runtime, "\n"); Printf(s_global_tab, "\nstatic const struct swig_octave_member swig_globals[] = {\n"); Printf(f_init, "static bool SWIG_init_user(octave_swig_type* module_ns)\n{\n"); if (!CPlusPlus) Printf(f_header,"extern \"C\" {\n"); Language::top(n); if (!CPlusPlus) Printf(f_header,"}\n"); if (Len(docs)) emit_doc_texinfo(); if (directorsEnabled()) { Swig_insert_file("director_common.swg", f_runtime); Swig_insert_file("director.swg", f_runtime); } Printf(f_init, "return true;\n}\n"); Printf(s_global_tab, "{0,0,0,0,0,0}\n};\n"); Printv(f_wrappers, s_global_tab, NIL); SwigType_emit_type_table(f_runtime, f_wrappers); Dump(f_runtime, f_begin); Dump(f_header, f_begin); Dump(f_doc, f_begin); if (directorsEnabled()) { Dump(f_directors_h, f_begin); Dump(f_directors, f_begin); } Dump(f_wrappers, f_begin); Dump(f_initbeforefunc, f_begin); Wrapper_pretty_print(f_init, f_begin); Delete(s_global_tab); Delete(f_initbeforefunc); Delete(f_init); Delete(f_wrappers); Delete(f_doc); Delete(f_header); Delete(f_directors); Delete(f_directors_h); Delete(f_runtime); Delete(f_begin); return SWIG_OK; } String *texinfo_escape(String *_s) { const char* s=(const char*)Data(_s); while (*s&&(*s=='\t'||*s=='\r'||*s=='\n'||*s==' ')) ++s; String *r = NewString(""); for (int j=0;s[j];++j) { if (s[j] == '\n') { Append(r, "\\n\\\n"); } else if (s[j] == '\r') { Append(r, "\\r"); } else if (s[j] == '\t') { Append(r, "\\t"); } else if (s[j] == '\\') { Append(r, "\\\\"); } else if (s[j] == '\'') { Append(r, "\\\'"); } else if (s[j] == '\"') { Append(r, "\\\""); } else Putc(s[j], r); } return r; } void emit_doc_texinfo() { for (Iterator it = First(docs); it.key; it = Next(it)) { String *wrap_name = it.key; String *synopsis = Getattr(it.item, "synopsis"); String *decl_info = Getattr(it.item, "decl_info"); String *cdecl_info = Getattr(it.item, "cdecl_info"); String *args_info = Getattr(it.item, "args_info"); String *doc_str = NewString(""); Printv(doc_str, synopsis, decl_info, cdecl_info, args_info, NIL); String *escaped_doc_str = texinfo_escape(doc_str); if (Len(doc_str)>0) { Printf(f_doc,"static const char* %s_texinfo = ",wrap_name); Printf(f_doc,"\"-*- texinfo -*-\\n\\\n%s", escaped_doc_str); if (Len(decl_info)) Printf(f_doc,"\\n\\\n@end deftypefn"); Printf(f_doc,"\";\n"); } Delete(escaped_doc_str); Delete(doc_str); Delete(wrap_name); } Printf(f_doc,"\n"); } bool is_empty_doc_node(Node* n) { if (!n) return true; String *synopsis = Getattr(n, "synopsis"); String *decl_info = Getattr(n, "decl_info"); String *cdecl_info = Getattr(n, "cdecl_info"); String *args_info = Getattr(n, "args_info"); return !Len(synopsis) && !Len(decl_info) && !Len(cdecl_info) && !Len(args_info); } String *texinfo_name(Node* n, const char* defval = "0") { String *tname = NewString(""); String *iname = Getattr(n, "sym:name"); String *wname = Swig_name_wrapper(iname); Node* d = Getattr(docs, wname); if (is_empty_doc_node(d)) Printf(tname, defval); else Printf(tname, "%s_texinfo", wname); return tname; } void process_autodoc(Node *n) { String *iname = Getattr(n, "sym:name"); String *name = Getattr(n, "name"); String *wname = Swig_name_wrapper(iname); String *str = Getattr(n, "feature:docstring"); bool autodoc_enabled = !Cmp(Getattr(n, "feature:autodoc"), "1"); Node* d = Getattr(docs, wname); if (!d) { d = NewHash(); Setattr(d, "synopsis", NewString("")); Setattr(d, "decl_info", NewString("")); Setattr(d, "cdecl_info", NewString("")); Setattr(d, "args_info", NewString("")); Setattr(docs, wname, d); } String *synopsis = Getattr(d, "synopsis"); String *decl_info = Getattr(d, "decl_info"); // String *cdecl_info = Getattr(d, "cdecl_info"); String *args_info = Getattr(d, "args_info"); // * couldn't we just emit the docs here? if (autodoc_enabled) { String *decl_str = NewString(""); String *args_str = NewString(""); make_autodocParmList(n, decl_str, args_str); Append(decl_info, "@deftypefn {Loadable Function} "); SwigType *type = Getattr(n, "type"); if (type && Strcmp(type, "void")) { Node *nn = classLookup(Getattr(n, "type")); String *type_str = nn ? Copy(Getattr(nn, "sym:name")) : SwigType_str(type, 0); Append(decl_info, "@var{retval} = "); Printf(args_str, "%s@var{retval} is of type %s. ", args_str, type_str); Delete(type_str); } Append(decl_info, name); Append(decl_info, " ("); Append(decl_info, decl_str); Append(decl_info, ")\n"); Append(args_info, args_str); Delete(decl_str); Delete(args_str); } if (str && Len(str) > 0) { // strip off {} if necessary char *t = Char(str); if (*t == '{') { Delitem(str, 0); Delitem(str, DOH_END); } // emit into synopsis section Append(synopsis, str); } } virtual int importDirective(Node *n) { String *modname = Getattr(n, "module"); if (modname) Printf(f_init, "if (!SWIG_Octave_LoadModule(\"%s\")) return false;\n", modname); return Language::importDirective(n); } const char *get_implicitconv_flag(Node *n) { int conv = 0; if (n && GetFlag(n, "feature:implicitconv")) { conv = 1; } return conv ? "SWIG_POINTER_IMPLICIT_CONV" : "0"; } /* ----------------------------------------------------------------------------- * addMissingParameterNames() * For functions that have not had nameless parameters set in the Language class. * * Inputs: * plist - entire parameter list * arg_offset - argument number for first parameter * Side effects: * The "lname" attribute in each parameter in plist will be contain a parameter name * ----------------------------------------------------------------------------- */ void addMissingParameterNames(Node* n, ParmList *plist, int arg_offset) { Parm *p = plist; int i = arg_offset; while (p) { if (!Getattr(p, "lname")) { String *name = makeParameterName(n, p, i); Setattr(p, "lname", name); Delete(name); } i++; p = nextSibling(p); } } void make_autodocParmList(Node *n, String *decl_str, String *args_str) { String *pdocs = 0; ParmList *plist = CopyParmList(Getattr(n, "parms")); Parm *p; Parm *pnext; int arg_num = is_wrapping_class() ? 1 : 0; addMissingParameterNames(n, plist, arg_num); // for $1_name substitutions done in Swig_typemap_attach_parms Swig_typemap_attach_parms("in", plist, 0); Swig_typemap_attach_parms("doc", plist, 0); for (p = plist; p; p = pnext, arg_num++) { String *tm = Getattr(p, "tmap:in"); if (tm) { pnext = Getattr(p, "tmap:in:next"); if (checkAttribute(p, "tmap:in:numinputs", "0")) { continue; } } else { pnext = nextSibling(p); } String *name = 0; String *type = 0; String *value = 0; String *pdoc = Getattr(p, "tmap:doc"); if (pdoc) { name = Getattr(p, "tmap:doc:name"); type = Getattr(p, "tmap:doc:type"); value = Getattr(p, "tmap:doc:value"); } String *made_name = 0; if (!name) { name = made_name = makeParameterName(n, p, arg_num); } type = type ? type : Getattr(p, "type"); value = value ? value : Getattr(p, "value"); if (SwigType_isvarargs(type)) break; String *tex_name = NewString(""); if (name) Printf(tex_name, "@var{%s}", name); else Printf(tex_name, "@var{?}"); if (Len(decl_str)) Append(decl_str, ", "); Append(decl_str, tex_name); if (value) { String *new_value = convertValue(value, Getattr(p, "type")); if (new_value) { value = new_value; } else { Node *lookup = Swig_symbol_clookup(value, 0); if (lookup) value = Getattr(lookup, "sym:name"); } Printf(decl_str, " = %s", value); } Node *nn = classLookup(Getattr(p, "type")); String *type_str = nn ? Copy(Getattr(nn, "sym:name")) : SwigType_str(type, 0); Printf(args_str, "%s is of type %s. ", tex_name, type_str); Delete(type_str); Delete(tex_name); Delete(made_name); } if (pdocs) Setattr(n, "feature:pdocs", pdocs); Delete(plist); } /* ------------------------------------------------------------ * convertValue() * Check if string v can be an Octave value literal, * (eg. number or string), or translate it to an Octave literal. * ------------------------------------------------------------ */ String *convertValue(String *v, SwigType *t) { if (v && Len(v) > 0) { char fc = (Char(v))[0]; if (('0' <= fc && fc <= '9') || '\'' == fc || '"' == fc) { /* number or string (or maybe NULL pointer) */ if (SwigType_ispointer(t) && Strcmp(v, "0") == 0) return NewString("None"); else return v; } if (Strcmp(v, "NULL") == 0 || Strcmp(v, "nullptr") == 0) return SwigType_ispointer(t) ? NewString("nil") : NewString("0"); if (Strcmp(v, "true") == 0 || Strcmp(v, "TRUE") == 0) return NewString("true"); if (Strcmp(v, "false") == 0 || Strcmp(v, "FALSE") == 0) return NewString("false"); } return 0; } virtual int functionWrapper(Node *n) { Parm *p; String *tm; int j; String *nodeType = Getattr(n, "nodeType"); int constructor = (!Cmp(nodeType, "constructor")); int destructor = (!Cmp(nodeType, "destructor")); String *storage = Getattr(n, "storage"); bool overloaded = !!Getattr(n, "sym:overloaded"); bool last_overload = overloaded && !Getattr(n, "sym:nextSibling"); String *iname = Getattr(n, "sym:name"); String *wname = Swig_name_wrapper(iname); String *overname = Copy(wname); SwigType *d = Getattr(n, "type"); ParmList *l = Getattr(n, "parms"); if (!overloaded && !addSymbol(iname, n)) return SWIG_ERROR; if (overloaded) Append(overname, Getattr(n, "sym:overname")); if (!overloaded || last_overload) process_autodoc(n); Wrapper *f = NewWrapper(); Octave_begin_function(n, f->def, iname, overname, !overloaded); emit_parameter_variables(l, f); emit_attach_parmmaps(l, f); Setattr(n, "wrap:parms", l); int num_arguments = emit_num_arguments(l); int num_required = emit_num_required(l); int varargs = emit_isvarargs(l); char source[64]; Printf(f->code, "if (!SWIG_check_num_args(\"%s\",args.length(),%i,%i,%i)) " "{\n SWIG_fail;\n }\n", iname, num_arguments, num_required, varargs); if (constructor && num_arguments == 1 && num_required == 1) { if (Cmp(storage, "explicit") == 0) { Node *parent = Swig_methodclass(n); if (GetFlag(parent, "feature:implicitconv")) { String *desc = NewStringf("SWIGTYPE%s", SwigType_manglestr(Getattr(n, "type"))); Printf(f->code, "if (SWIG_CheckImplicit(%s)) SWIG_fail;\n", desc); Delete(desc); } } } for (j = 0, p = l; j < num_arguments; ++j) { while (checkAttribute(p, "tmap:in:numinputs", "0")) { p = Getattr(p, "tmap:in:next"); } SwigType *pt = Getattr(p, "type"); String *tm = Getattr(p, "tmap:in"); if (tm) { if (!tm || checkAttribute(p, "tmap:in:numinputs", "0")) { p = nextSibling(p); continue; } sprintf(source, "args(%d)", j); Setattr(p, "emit:input", source); Replaceall(tm, "$source", Getattr(p, "emit:input")); Replaceall(tm, "$input", Getattr(p, "emit:input")); Replaceall(tm, "$target", Getattr(p, "lname")); if (Getattr(p, "wrap:disown") || (Getattr(p, "tmap:in:disown"))) { Replaceall(tm, "$disown", "SWIG_POINTER_DISOWN"); } else { Replaceall(tm, "$disown", "0"); } if (Getattr(p, "tmap:in:implicitconv")) { const char *convflag = "0"; if (!Getattr(p, "hidden")) { SwigType *ptype = Getattr(p, "type"); convflag = get_implicitconv_flag(classLookup(ptype)); } Replaceall(tm, "$implicitconv", convflag); Setattr(p, "implicitconv", convflag); } String *getargs = NewString(""); if (j >= num_required) Printf(getargs, "if (%dcode, getargs, "\n", NIL); Delete(getargs); p = Getattr(p, "tmap:in:next"); continue; } else { Swig_warning(WARN_TYPEMAP_IN_UNDEF, input_file, line_number, "Unable to use type %s as a function argument.\n", SwigType_str(pt, 0)); break; } } // Check for trailing varargs if (varargs) { if (p && (tm = Getattr(p, "tmap:in"))) { Replaceall(tm, "$input", "varargs"); Printv(f->code, tm, "\n", NIL); } } // Insert constraint checking code for (p = l; p;) { if ((tm = Getattr(p, "tmap:check"))) { Replaceall(tm, "$target", Getattr(p, "lname")); Printv(f->code, tm, "\n", NIL); p = Getattr(p, "tmap:check:next"); } else { p = nextSibling(p); } } // Insert cleanup code String *cleanup = NewString(""); for (p = l; p;) { if ((tm = Getattr(p, "tmap:freearg"))) { if (Getattr(p, "tmap:freearg:implicitconv")) { const char *convflag = "0"; if (!Getattr(p, "hidden")) { SwigType *ptype = Getattr(p, "type"); convflag = get_implicitconv_flag(classLookup(ptype)); } if (strcmp(convflag, "0") == 0) { tm = 0; } } if (tm && (Len(tm) != 0)) { Replaceall(tm, "$source", Getattr(p, "lname")); Printv(cleanup, tm, "\n", NIL); } p = Getattr(p, "tmap:freearg:next"); } else { p = nextSibling(p); } } // Insert argument output code String *outarg = NewString(""); for (p = l; p;) { if ((tm = Getattr(p, "tmap:argout"))) { Replaceall(tm, "$source", Getattr(p, "lname")); Replaceall(tm, "$target", "_outp"); Replaceall(tm, "$result", "_outp"); Replaceall(tm, "$arg", Getattr(p, "emit:input")); Replaceall(tm, "$input", Getattr(p, "emit:input")); Printv(outarg, tm, "\n", NIL); p = Getattr(p, "tmap:argout:next"); } else { p = nextSibling(p); } } int director_method = is_member_director(n) && !is_smart_pointer() && !destructor; if (director_method) { Wrapper_add_local(f, "upcall", "bool upcall = false"); Append(f->code, "upcall = !!dynamic_cast(arg1);\n"); } Setattr(n, "wrap:name", overname); Swig_director_emit_dynamic_cast(n, f); String *actioncode = emit_action(n); Wrapper_add_local(f, "_out", "octave_value_list _out"); Wrapper_add_local(f, "_outp", "octave_value_list *_outp=&_out"); Wrapper_add_local(f, "_outv", "octave_value _outv"); // Return the function value if ((tm = Swig_typemap_lookup_out("out", n, Swig_cresult_name(), f, actioncode))) { Replaceall(tm, "$source", Swig_cresult_name()); Replaceall(tm, "$target", "_outv"); Replaceall(tm, "$result", "_outv"); if (GetFlag(n, "feature:new")) Replaceall(tm, "$owner", "1"); else Replaceall(tm, "$owner", "0"); Printf(f->code, "%s\n", tm); Printf(f->code, "if (_outv.is_defined()) _outp = " "SWIG_Octave_AppendOutput(_outp, _outv);\n"); Delete(tm); } else { Swig_warning(WARN_TYPEMAP_OUT_UNDEF, input_file, line_number, "Unable to use return type %s in function %s.\n", SwigType_str(d, 0), iname); } emit_return_variable(n, d, f); Printv(f->code, outarg, NIL); Printv(f->code, cleanup, NIL); if (GetFlag(n, "feature:new")) { if ((tm = Swig_typemap_lookup("newfree", n, Swig_cresult_name(), 0))) { Replaceall(tm, "$source", Swig_cresult_name()); Printf(f->code, "%s\n", tm); } } if ((tm = Swig_typemap_lookup("ret", n, Swig_cresult_name(), 0))) { Replaceall(tm, "$source", Swig_cresult_name()); Replaceall(tm, "$result", "_outv"); Printf(f->code, "%s\n", tm); Delete(tm); } Printf(f->code, "return _out;\n"); Printf(f->code, "fail:\n"); // we should free locals etc if this happens Printv(f->code, cleanup, NIL); Printf(f->code, "return octave_value_list();\n"); Printf(f->code, "}\n"); /* Substitute the cleanup code */ Replaceall(f->code, "$cleanup", cleanup); Replaceall(f->code, "$symname", iname); Wrapper_print(f, f_wrappers); DelWrapper(f); if (last_overload) dispatchFunction(n); if (!overloaded || last_overload) { String *tname = texinfo_name(n); Printf(s_global_tab, "{\"%s\",%s,0,0,2,%s},\n", iname, wname, tname); Delete(tname); } Delete(overname); Delete(wname); Delete(cleanup); Delete(outarg); return SWIG_OK; } void dispatchFunction(Node *n) { Wrapper *f = NewWrapper(); String *iname = Getattr(n, "sym:name"); String *wname = Swig_name_wrapper(iname); int maxargs; String *dispatch = Swig_overload_dispatch(n, "return %s(args, nargout);", &maxargs); String *tmp = NewString(""); Octave_begin_function(n, f->def, iname, wname, true); Wrapper_add_local(f, "argc", "int argc = args.length()"); Printf(tmp, "octave_value_ref argv[%d]={", maxargs); for (int j = 0; j < maxargs; ++j) Printf(tmp, "%soctave_value_ref(args,%d)", j ? "," : " ", j); Printf(tmp, "}"); Wrapper_add_local(f, "argv", tmp); Printv(f->code, dispatch, "\n", NIL); Printf(f->code, "error(\"No matching function for overload\");\n", iname); Printf(f->code, "return octave_value_list();\n"); Printv(f->code, "}\n", NIL); Wrapper_print(f, f_wrappers); Delete(tmp); DelWrapper(f); Delete(dispatch); Delete(wname); } virtual int variableWrapper(Node *n) { String *name = Getattr(n, "name"); String *iname = Getattr(n, "sym:name"); SwigType *t = Getattr(n, "type"); if (!addSymbol(iname, n)) return SWIG_ERROR; String *tm; Wrapper *getf = NewWrapper(); Wrapper *setf = NewWrapper(); String *getname = Swig_name_get(NSPACE_TODO, iname); String *setname = Swig_name_set(NSPACE_TODO, iname); String *getwname = Swig_name_wrapper(getname); String *setwname = Swig_name_wrapper(setname); Octave_begin_function(n, setf->def, setname, setwname, true); Printf(setf->def, "if (!SWIG_check_num_args(\"%s_set\",args.length(),1,1,0)) return octave_value_list();", iname); if (is_assignable(n)) { Setattr(n, "wrap:name", setname); if ((tm = Swig_typemap_lookup("varin", n, name, 0))) { Replaceall(tm, "$source", "args(0)"); Replaceall(tm, "$target", name); Replaceall(tm, "$input", "args(0)"); if (Getattr(n, "tmap:varin:implicitconv")) { Replaceall(tm, "$implicitconv", get_implicitconv_flag(n)); } emit_action_code(n, setf->code, tm); Delete(tm); } else { Swig_warning(WARN_TYPEMAP_VARIN_UNDEF, input_file, line_number, "Unable to set variable of type %s.\n", SwigType_str(t, 0)); } Append(setf->code, "fail:\n"); Printf(setf->code, "return octave_value_list();\n"); } else { Printf(setf->code, "return octave_set_immutable(args,nargout);"); } Append(setf->code, "}\n"); Wrapper_print(setf, f_wrappers); Setattr(n, "wrap:name", getname); int addfail = 0; Octave_begin_function(n, getf->def, getname, getwname, true); Wrapper_add_local(getf, "obj", "octave_value obj"); if ((tm = Swig_typemap_lookup("varout", n, name, 0))) { Replaceall(tm, "$source", name); Replaceall(tm, "$target", "obj"); Replaceall(tm, "$result", "obj"); addfail = emit_action_code(n, getf->code, tm); Delete(tm); } else { Swig_warning(WARN_TYPEMAP_VAROUT_UNDEF, input_file, line_number, "Unable to read variable of type %s\n", SwigType_str(t, 0)); } Append(getf->code, " return obj;\n"); if (addfail) { Append(getf->code, "fail:\n"); Append(getf->code, " return octave_value_list();\n"); } Append(getf->code, "}\n"); Wrapper_print(getf, f_wrappers); Printf(s_global_tab, "{\"%s\",0,%s,%s,2,0},\n", iname, getwname, setwname); Delete(getwname); Delete(setwname); DelWrapper(setf); DelWrapper(getf); return SWIG_OK; } virtual int constantWrapper(Node *n) { String *name = Getattr(n, "name"); String *iname = Getattr(n, "sym:name"); SwigType *type = Getattr(n, "type"); String *rawval = Getattr(n, "rawval"); String *value = rawval ? rawval : Getattr(n, "value"); String *cppvalue = Getattr(n, "cppvalue"); String *tm; if (!addSymbol(iname, n)) return SWIG_ERROR; if (SwigType_type(type) == T_MPOINTER) { String *wname = Swig_name_wrapper(iname); String *str = SwigType_str(type, wname); Printf(f_header, "static %s = %s;\n", str, value); Delete(str); value = wname; } if ((tm = Swig_typemap_lookup("constcode", n, name, 0))) { Replaceall(tm, "$source", value); Replaceall(tm, "$target", name); Replaceall(tm, "$value", cppvalue ? cppvalue : value); Replaceall(tm, "$nsname", iname); Printf(f_init, "%s\n", tm); } else { Swig_warning(WARN_TYPEMAP_CONST_UNDEF, input_file, line_number, "Unsupported constant value.\n"); return SWIG_NOWRAP; } return SWIG_OK; } virtual int nativeWrapper(Node *n) { return Language::nativeWrapper(n); } virtual int enumDeclaration(Node *n) { return Language::enumDeclaration(n); } virtual int enumvalueDeclaration(Node *n) { return Language::enumvalueDeclaration(n); } virtual int classDeclaration(Node *n) { return Language::classDeclaration(n); } virtual int classHandler(Node *n) { have_constructor = 0; have_destructor = 0; constructor_name = 0; class_name = Getattr(n, "sym:name"); if (!addSymbol(class_name, n)) return SWIG_ERROR; // This is a bug, due to the fact that swig_type -> octave_class mapping // is 1-to-n. static Hash *emitted = NewHash(); String *mangled_classname = Swig_name_mangle(Getattr(n, "name")); if (Getattr(emitted, mangled_classname)) { Delete(mangled_classname); return SWIG_NOWRAP; } Setattr(emitted, mangled_classname, "1"); Delete(mangled_classname); assert(!s_members_tab); s_members_tab = NewString(""); Printv(s_members_tab, "static swig_octave_member swig_", class_name, "_members[] = {\n", NIL); Language::classHandler(n); SwigType *t = Copy(Getattr(n, "name")); SwigType_add_pointer(t); // Replace storing a pointer to underlying class with a smart pointer (intended for use with non-intrusive smart pointers) SwigType *smart = Swig_cparse_smartptr(n); String *wrap_class = NewStringf("&_wrap_class_%s", class_name); if (smart) { SwigType_add_pointer(smart); SwigType_remember_clientdata(smart, wrap_class); } //String *wrap_class = NewStringf("&_wrap_class_%s", class_name); SwigType_remember_clientdata(t, wrap_class); int use_director = Swig_directorclass(n); if (use_director) { String *nspace = Getattr(n, "sym:nspace"); String *cname = Swig_name_disown(nspace, class_name); String *wcname = Swig_name_wrapper(cname); String *cnameshdw = NewStringf("%s_shadow", cname); String *wcnameshdw = Swig_name_wrapper(cnameshdw); Octave_begin_function(n, f_wrappers, cnameshdw, wcnameshdw, true); Printf(f_wrappers, " if (args.length()!=1) {\n"); Printf(f_wrappers, " error(\"disown takes no arguments\");\n"); Printf(f_wrappers, " return octave_value_list();\n"); Printf(f_wrappers, " }\n"); Printf(f_wrappers, " %s (args, nargout);\n", wcname); Printf(f_wrappers, " return args;\n"); Printf(f_wrappers, "}\n"); Printf(s_members_tab, "{\"__disown\",%s,0,0,0,0},\n", wcnameshdw); Delete(wcname); Delete(cname); Delete(wcnameshdw); Delete(cnameshdw); } Printf(s_members_tab, "{0,0,0,0,0,0}\n};\n"); Printv(f_wrappers, s_members_tab, NIL); String *base_class_names = NewString(""); String *base_class = NewString(""); List *baselist = Getattr(n, "bases"); if (baselist && Len(baselist)) { Iterator b; int index = 0; b = First(baselist); while (b.item) { String *bname = Getattr(b.item, "name"); if ((!bname) || GetFlag(b.item, "feature:ignore") || (!Getattr(b.item, "module"))) { b = Next(b); continue; } String *bname_mangled = SwigType_manglestr(SwigType_add_pointer(Copy(bname))); Printf(base_class_names, "\"%s\",", bname_mangled); Printf(base_class, "0,"); b = Next(b); index++; Delete(bname_mangled); } } Printv(f_wrappers, "static const char *swig_", class_name, "_base_names[] = {", base_class_names, "0};\n", NIL); Printv(f_wrappers, "static const swig_type_info *swig_", class_name, "_base[] = {", base_class, "0};\n", NIL); Printv(f_wrappers, "static swig_octave_class _wrap_class_", class_name, " = {\"", class_name, "\", &SWIGTYPE", SwigType_manglestr(t), ",", NIL); Printv(f_wrappers, Swig_directorclass(n) ? "1," : "0,", NIL); if (have_constructor) { String *nspace = Getattr(n, "sym:nspace"); String *cname = Swig_name_construct(nspace, constructor_name); String *wcname = Swig_name_wrapper(cname); String *tname = texinfo_name(n); Printf(f_wrappers, "%s,%s,", wcname, tname); Delete(tname); Delete(wcname); Delete(cname); } else Printv(f_wrappers, "0,0,", NIL); if (have_destructor) { String *nspace = Getattr(n, "sym:nspace"); String *cname = Swig_name_destroy(nspace, class_name); String *wcname = Swig_name_wrapper(cname); Printf(f_wrappers, "%s,", wcname); Delete(wcname); Delete(cname); } else Printv(f_wrappers, "0", ",", NIL); Printf(f_wrappers, "swig_%s_members,swig_%s_base_names,swig_%s_base };\n\n", class_name, class_name, class_name); Delete(base_class); Delete(base_class_names); Delete(smart); Delete(t); Delete(s_members_tab); s_members_tab = 0; class_name = 0; return SWIG_OK; } virtual int memberfunctionHandler(Node *n) { Language::memberfunctionHandler(n); assert(s_members_tab); assert(class_name); String *name = Getattr(n, "name"); String *iname = GetChar(n, "sym:name"); String *realname = iname ? iname : name; String *wname = Getattr(n, "wrap:name"); assert(wname); if (!Getattr(n, "sym:nextSibling")) { String *tname = texinfo_name(n); String *rname = Copy(wname); bool overloaded = !!Getattr(n, "sym:overloaded"); if (overloaded) Delslice(rname, Len(rname) - Len(Getattr(n, "sym:overname")), DOH_END); Printf(s_members_tab, "{\"%s\",%s,0,0,0,%s},\n", realname, rname, tname); Delete(rname); Delete(tname); } return SWIG_OK; } virtual int membervariableHandler(Node *n) { Setattr(n, "feature:autodoc", "0"); Language::membervariableHandler(n); assert(s_members_tab); assert(class_name); String *symname = Getattr(n, "sym:name"); String *getname = Swig_name_get(NSPACE_TODO, Swig_name_member(NSPACE_TODO, class_name, symname)); String *setname = Swig_name_set(NSPACE_TODO, Swig_name_member(NSPACE_TODO, class_name, symname)); String *getwname = Swig_name_wrapper(getname); String *setwname = GetFlag(n, "feature:immutable") ? NewString("octave_set_immutable") : Swig_name_wrapper(setname); assert(s_members_tab); Printf(s_members_tab, "{\"%s\",0,%s,%s,0,0},\n", symname, getwname, setwname); Delete(getname); Delete(setname); Delete(getwname); Delete(setwname); return SWIG_OK; } virtual int constructorHandler(Node *n) { have_constructor = 1; if (!constructor_name) constructor_name = NewString(Getattr(n, "sym:name")); int use_director = Swig_directorclass(n); if (use_director) { Parm *parms = Getattr(n, "parms"); Parm *self; String *name = NewString("self"); String *type = NewString("void"); SwigType_add_pointer(type); self = NewParm(type, name, n); Delete(type); Delete(name); Setattr(self, "lname", "self_obj"); if (parms) set_nextSibling(self, parms); Setattr(n, "parms", self); Setattr(n, "wrap:self", "1"); Setattr(n, "hidden", "1"); Delete(self); } return Language::constructorHandler(n); } virtual int destructorHandler(Node *n) { have_destructor = 1; return Language::destructorHandler(n); } virtual int staticmemberfunctionHandler(Node *n) { Language::staticmemberfunctionHandler(n); assert(s_members_tab); assert(class_name); String *name = Getattr(n, "name"); String *iname = GetChar(n, "sym:name"); String *realname = iname ? iname : name; String *wname = Getattr(n, "wrap:name"); assert(wname); if (!Getattr(n, "sym:nextSibling")) { String *tname = texinfo_name(n); String *rname = Copy(wname); bool overloaded = !!Getattr(n, "sym:overloaded"); if (overloaded) Delslice(rname, Len(rname) - Len(Getattr(n, "sym:overname")), DOH_END); Printf(s_members_tab, "{\"%s\",%s,0,0,1,%s},\n", realname, rname, tname); Delete(rname); Delete(tname); } return SWIG_OK; } virtual int memberconstantHandler(Node *n) { return Language::memberconstantHandler(n); } virtual int staticmembervariableHandler(Node *n) { Setattr(n, "feature:autodoc", "0"); Language::staticmembervariableHandler(n); if (!GetFlag(n, "wrappedasconstant")) { assert(s_members_tab); assert(class_name); String *symname = Getattr(n, "sym:name"); String *getname = Swig_name_get(NSPACE_TODO, Swig_name_member(NSPACE_TODO, class_name, symname)); String *setname = Swig_name_set(NSPACE_TODO, Swig_name_member(NSPACE_TODO, class_name, symname)); String *getwname = Swig_name_wrapper(getname); String *setwname = GetFlag(n, "feature:immutable") ? NewString("octave_set_immutable") : Swig_name_wrapper(setname); assert(s_members_tab); Printf(s_members_tab, "{\"%s\",0,%s,%s,1,0},\n", symname, getwname, setwname); Delete(getname); Delete(setname); Delete(getwname); Delete(setwname); } return SWIG_OK; } int classDirectorInit(Node *n) { String *declaration = Swig_director_declaration(n); Printf(f_directors_h, "\n"); Printf(f_directors_h, "%s\n", declaration); Printf(f_directors_h, "public:\n"); Delete(declaration); return Language::classDirectorInit(n); } int classDirectorEnd(Node *n) { Printf(f_directors_h, "};\n\n"); return Language::classDirectorEnd(n); } int classDirectorConstructor(Node *n) { Node *parent = Getattr(n, "parentNode"); String *sub = NewString(""); String *decl = Getattr(n, "decl"); String *supername = Swig_class_name(parent); String *classname = NewString(""); Printf(classname, "SwigDirector_%s", supername); // insert self parameter Parm *p; ParmList *superparms = Getattr(n, "parms"); ParmList *parms = CopyParmList(superparms); String *type = NewString("void"); SwigType_add_pointer(type); p = NewParm(type, NewString("self"), n); set_nextSibling(p, parms); parms = p; if (!Getattr(n, "defaultargs")) { // constructor { Wrapper *w = NewWrapper(); String *call; String *basetype = Getattr(parent, "classtype"); String *target = Swig_method_decl(0, decl, classname, parms, 0); call = Swig_csuperclass_call(0, basetype, superparms); Printf(w->def, "%s::%s: %s," "\nSwig::Director(static_cast<%s*>(this)) { \n", classname, target, call, basetype); Append(w->def, "}\n"); Delete(target); Wrapper_print(w, f_directors); Delete(call); DelWrapper(w); } // constructor header { String *target = Swig_method_decl(0, decl, classname, parms, 1); Printf(f_directors_h, " %s;\n", target); Delete(target); } } Delete(sub); Delete(classname); Delete(supername); Delete(parms); return Language::classDirectorConstructor(n); } int classDirectorDefaultConstructor(Node *n) { String *classname = Swig_class_name(n); { Wrapper *w = NewWrapper(); Printf(w->def, "SwigDirector_%s::SwigDirector_%s(void* self) :" "\nSwig::Director((octave_swig_type*)self,static_cast<%s*>(this)) { \n", classname, classname, classname); Append(w->def, "}\n"); Wrapper_print(w, f_directors); DelWrapper(w); } Printf(f_directors_h, " SwigDirector_%s(octave_swig_type* self);\n", classname); Delete(classname); return Language::classDirectorDefaultConstructor(n); } int classDirectorMethod(Node *n, Node *parent, String *super) { int is_void = 0; int is_pointer = 0; String *decl = Getattr(n, "decl"); String *returntype = Getattr(n, "type"); String *name = Getattr(n, "name"); String *classname = Getattr(parent, "sym:name"); String *c_classname = Getattr(parent, "name"); String *symname = Getattr(n, "sym:name"); String *declaration = NewString(""); ParmList *l = Getattr(n, "parms"); Wrapper *w = NewWrapper(); String *tm; String *wrap_args = NewString(""); String *value = Getattr(n, "value"); String *storage = Getattr(n, "storage"); bool pure_virtual = false; int status = SWIG_OK; int idx; bool ignored_method = GetFlag(n, "feature:ignore") ? true : false; if (Cmp(storage, "virtual") == 0) { if (Cmp(value, "0") == 0) { pure_virtual = true; } } // determine if the method returns a pointer is_pointer = SwigType_ispointer_return(decl); is_void = (!Cmp(returntype, "void") && !is_pointer); // virtual method definition String *target; String *pclassname = NewStringf("SwigDirector_%s", classname); String *qualified_name = NewStringf("%s::%s", pclassname, name); SwigType *rtype = Getattr(n, "conversion_operator") ? 0 : Getattr(n, "classDirectorMethods:type"); target = Swig_method_decl(rtype, decl, qualified_name, l, 0); Printf(w->def, "%s", target); Delete(qualified_name); Delete(target); // header declaration target = Swig_method_decl(rtype, decl, name, l, 1); Printf(declaration, " virtual %s", target); Delete(target); // Get any exception classes in the throws typemap if (Getattr(n, "noexcept")) { Append(w->def, " noexcept"); Append(declaration, " noexcept"); } ParmList *throw_parm_list = 0; if ((throw_parm_list = Getattr(n, "throws")) || Getattr(n, "throw")) { Parm *p; int gencomma = 0; Append(w->def, " throw("); Append(declaration, " throw("); if (throw_parm_list) Swig_typemap_attach_parms("throws", throw_parm_list, 0); for (p = throw_parm_list; p; p = nextSibling(p)) { if (Getattr(p, "tmap:throws")) { if (gencomma++) { Append(w->def, ", "); Append(declaration, ", "); } String *str = SwigType_str(Getattr(p, "type"), 0); Append(w->def, str); Append(declaration, str); Delete(str); } } Append(w->def, ")"); Append(declaration, ")"); } Append(w->def, " {"); Append(declaration, ";\n"); // declare method return value // if the return value is a reference or const reference, a specialized typemap must // handle it, including declaration of c_result ($result). if (!is_void && (!ignored_method || pure_virtual)) { if (!SwigType_isclass(returntype)) { if (!(SwigType_ispointer(returntype) || SwigType_isreference(returntype))) { String *construct_result = NewStringf("= SwigValueInit< %s >()", SwigType_lstr(returntype, 0)); Wrapper_add_localv(w, "c_result", SwigType_lstr(returntype, "c_result"), construct_result, NIL); Delete(construct_result); } else { Wrapper_add_localv(w, "c_result", SwigType_lstr(returntype, "c_result"), "= 0", NIL); } } else { String *cres = SwigType_lstr(returntype, "c_result"); Printf(w->code, "%s;\n", cres); Delete(cres); } } if (ignored_method) { if (!pure_virtual) { if (!is_void) Printf(w->code, "return "); String *super_call = Swig_method_call(super, l); Printf(w->code, "%s;\n", super_call); Delete(super_call); } else { Printf(w->code, "Swig::DirectorPureVirtualException::raise(\"Attempted to invoke pure virtual method %s::%s\");\n", SwigType_namestr(c_classname), SwigType_namestr(name)); } } else { // attach typemaps to arguments (C/C++ -> Octave) String *parse_args = NewString(""); Swig_director_parms_fixup(l); Swig_typemap_attach_parms("in", l, 0); Swig_typemap_attach_parms("directorin", l, w); Swig_typemap_attach_parms("directorargout", l, w); Parm *p; int outputs = 0; if (!is_void) outputs++; // build argument list and type conversion string p = l; while (p) { if (checkAttribute(p, "tmap:in:numinputs", "0")) { p = Getattr(p, "tmap:in:next"); continue; } if (Getattr(p, "tmap:directorargout") != 0) outputs++; String *pname = Getattr(p, "name"); String *ptype = Getattr(p, "type"); Wrapper_add_local(w, "tmpv", "octave_value tmpv"); if ((tm = Getattr(p, "tmap:directorin")) != 0) { String *parse = Getattr(p, "tmap:directorin:parse"); if (!parse) { Setattr(p, "emit:directorinput", "tmpv"); Replaceall(tm, "$input", "tmpv"); Replaceall(tm, "$owner", "0"); Printv(wrap_args, tm, "\n", NIL); Printf(wrap_args, "args.append(tmpv);\n"); Putc('O', parse_args); } else { Append(parse_args, parse); Setattr(p, "emit:directorinput", pname); Replaceall(tm, "$input", pname); Replaceall(tm, "$owner", "0"); if (Len(tm) == 0) Append(tm, pname); } p = Getattr(p, "tmap:directorin:next"); continue; } else if (Cmp(ptype, "void")) { Swig_warning(WARN_TYPEMAP_DIRECTORIN_UNDEF, input_file, line_number, "Unable to use type %s as a function argument in director method %s::%s (skipping method).\n", SwigType_str(ptype, 0), SwigType_namestr(c_classname), SwigType_namestr(name)); status = SWIG_NOWRAP; break; } p = nextSibling(p); } String *method_name = Getattr(n, "sym:name"); Printv(w->code, wrap_args, NIL); // emit method invocation Wrapper_add_local(w, "args", "octave_value_list args"); Wrapper_add_local(w, "out", "octave_value_list out"); Wrapper_add_local(w, "idx", "std::list idx"); Printf(w->code, "idx.push_back(octave_value_list(\"%s\"));\n", method_name); Printf(w->code, "idx.push_back(args);\n"); Printf(w->code, "out=swig_get_self()->subsref(\".(\",idx,%d);\n", outputs); String *cleanup = NewString(""); String *outarg = NewString(""); idx = 0; // marshal return value if (!is_void) { Printf(w->code, "if (out.length()<%d) {\n", outputs); Printf(w->code, "Swig::DirectorTypeMismatchException::raise(\"Octave " "method %s.%s failed to return the required number " "of arguments.\");\n", classname, method_name); Printf(w->code, "}\n"); tm = Swig_typemap_lookup("directorout", n, Swig_cresult_name(), w); if (tm != 0) { char temp[24]; sprintf(temp, "out(%d)", idx); Replaceall(tm, "$input", temp); // Replaceall(tm, "$argnum", temp); Replaceall(tm, "$disown", Getattr(n, "wrap:disown") ? "SWIG_POINTER_DISOWN" : "0"); if (Getattr(n, "tmap:directorout:implicitconv")) { Replaceall(tm, "$implicitconv", get_implicitconv_flag(n)); } Replaceall(tm, "$result", "c_result"); Printv(w->code, tm, "\n", NIL); Delete(tm); } else { Swig_warning(WARN_TYPEMAP_DIRECTOROUT_UNDEF, input_file, line_number, "Unable to use return type %s in director method %s::%s (skipping method).\n", SwigType_str(returntype, 0), SwigType_namestr(c_classname), SwigType_namestr(name)); status = SWIG_ERROR; } } idx++; // marshal outputs for (p = l; p;) { if ((tm = Getattr(p, "tmap:directorargout")) != 0) { char temp[24]; sprintf(temp, "out(%d)", idx); Replaceall(tm, "$result", temp); Replaceall(tm, "$input", Getattr(p, "emit:directorinput")); Printv(w->code, tm, "\n", NIL); p = Getattr(p, "tmap:directorargout:next"); } else { p = nextSibling(p); } } Delete(parse_args); Delete(cleanup); Delete(outarg); } if (!is_void) { if (!(ignored_method && !pure_virtual)) { String *rettype = SwigType_str(returntype, 0); if (!SwigType_isreference(returntype)) { Printf(w->code, "return (%s) c_result;\n", rettype); } else { Printf(w->code, "return (%s) *c_result;\n", rettype); } Delete(rettype); } } Append(w->code, "}\n"); // We expose protected methods via an extra public inline method which makes a straight call to the wrapped class' method String *inline_extra_method = NewString(""); if (dirprot_mode() && !is_public(n) && !pure_virtual) { Printv(inline_extra_method, declaration, NIL); String *extra_method_name = NewStringf("%sSwigPublic", name); Replaceall(inline_extra_method, name, extra_method_name); Replaceall(inline_extra_method, ";\n", " {\n "); if (!is_void) Printf(inline_extra_method, "return "); String *methodcall = Swig_method_call(super, l); Printv(inline_extra_method, methodcall, ";\n }\n", NIL); Delete(methodcall); Delete(extra_method_name); } // emit the director method if (status == SWIG_OK) { if (!Getattr(n, "defaultargs")) { Replaceall(w->code, "$symname", symname); Wrapper_print(w, f_directors); Printv(f_directors_h, declaration, NIL); Printv(f_directors_h, inline_extra_method, NIL); } } // clean up Delete(wrap_args); Delete(pclassname); DelWrapper(w); return status; } String *runtimeCode() { String *s = NewString(""); String *srun = Swig_include_sys("octrun.swg"); if (!srun) { Printf(stderr, "*** Unable to open 'octrun.swg'\n"); } else { Append(s, srun); Delete(srun); } return s; } String *defaultExternalRuntimeFilename() { return NewString("swigoctaverun.h"); } }; extern "C" Language *swig_octave(void) { return new OCTAVE(); } swig-4.0.1/Source/Modules/swigmod.h0000644000175000017500000003677013527063513017057 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * swigmod.h * * Main header file for SWIG modules. * ----------------------------------------------------------------------------- */ #ifndef SWIG_SWIGMOD_H_ #define SWIG_SWIGMOD_H_ #include "swig.h" #include "preprocessor.h" #include "swigwarn.h" #define NOT_VIRTUAL 0 #define PLAIN_VIRTUAL 1 #define PURE_VIRTUAL 2 extern String *input_file; extern int line_number; extern int start_line; extern int CPlusPlus; // C++ mode extern int Extend; // Extend mode extern int Verbose; extern int IsVirtual; extern int ImportMode; extern int NoExcept; // -no_except option extern int Abstract; // abstract base class extern int SmartPointer; // smart pointer methods being emitted extern int SwigRuntime; /* Overload "argc" and "argv" */ extern String *argv_template_string; extern String *argc_template_string; /* Miscellaneous stuff */ #define tab2 " " #define tab4 " " #define tab8 " " class Dispatcher { public: Dispatcher ():cplus_mode(PUBLIC) { } virtual ~ Dispatcher () { } virtual int emit_one(Node *n); virtual int emit_children(Node *n); virtual int defaultHandler(Node *n); /* Top of the parse tree */ virtual int top(Node *n) = 0; /* SWIG directives */ virtual int applyDirective(Node *n); virtual int clearDirective(Node *n); virtual int constantDirective(Node *n); virtual int extendDirective(Node *n); virtual int fragmentDirective(Node *n); virtual int importDirective(Node *n); virtual int includeDirective(Node *n); virtual int insertDirective(Node *n); virtual int moduleDirective(Node *n); virtual int nativeDirective(Node *n); virtual int pragmaDirective(Node *n); virtual int typemapDirective(Node *n); virtual int typemapitemDirective(Node *n); virtual int typemapcopyDirective(Node *n); virtual int typesDirective(Node *n); /* C/C++ parsing */ virtual int cDeclaration(Node *n); virtual int externDeclaration(Node *n); virtual int enumDeclaration(Node *n); virtual int enumvalueDeclaration(Node *n); virtual int enumforwardDeclaration(Node *n); virtual int classDeclaration(Node *n); virtual int classforwardDeclaration(Node *n); virtual int constructorDeclaration(Node *n); virtual int destructorDeclaration(Node *n); virtual int accessDeclaration(Node *n); virtual int usingDeclaration(Node *n); virtual int namespaceDeclaration(Node *n); virtual int templateDeclaration(Node *n); virtual int lambdaDeclaration(Node *n); enum AccessMode { PUBLIC, PRIVATE, PROTECTED }; protected: AccessMode cplus_mode; }; /* ---------------------------------------------------------------------------- * class language: * * This class defines the functions that need to be supported by the * scripting language being used. The translator calls these virtual * functions to output different types of code for different languages. * ------------------------------------------------------------------------- */ class Language:public Dispatcher { public: Language(); virtual ~Language(); virtual int emit_one(Node *n); String *directorClassName(Node *n); /* Parse command line options */ virtual void main(int argc, char *argv[]); /* Top of the parse tree */ virtual int top(Node *n); /* SWIG directives */ virtual int applyDirective(Node *n); virtual int clearDirective(Node *n); virtual int constantDirective(Node *n); virtual int extendDirective(Node *n); virtual int fragmentDirective(Node *n); virtual int importDirective(Node *n); virtual int includeDirective(Node *n); virtual int insertDirective(Node *n); virtual int moduleDirective(Node *n); virtual int nativeDirective(Node *n); virtual int pragmaDirective(Node *n); virtual int typemapDirective(Node *n); virtual int typemapcopyDirective(Node *n); virtual int typesDirective(Node *n); /* C/C++ parsing */ virtual int cDeclaration(Node *n); virtual int externDeclaration(Node *n); virtual int enumDeclaration(Node *n); virtual int enumvalueDeclaration(Node *n); virtual int enumforwardDeclaration(Node *n); virtual int classDeclaration(Node *n); virtual int classforwardDeclaration(Node *n); virtual int constructorDeclaration(Node *n); virtual int destructorDeclaration(Node *n); virtual int accessDeclaration(Node *n); virtual int namespaceDeclaration(Node *n); virtual int usingDeclaration(Node *n); /* Function handlers */ virtual int functionHandler(Node *n); virtual int globalfunctionHandler(Node *n); virtual int memberfunctionHandler(Node *n); virtual int staticmemberfunctionHandler(Node *n); virtual int callbackfunctionHandler(Node *n); /* Variable handlers */ virtual int variableHandler(Node *n); virtual int globalvariableHandler(Node *n); virtual int membervariableHandler(Node *n); virtual int staticmembervariableHandler(Node *n); /* C++ handlers */ virtual int memberconstantHandler(Node *n); virtual int constructorHandler(Node *n); virtual int copyconstructorHandler(Node *n); virtual int destructorHandler(Node *n); virtual int classHandler(Node *n); /* Miscellaneous */ virtual int typedefHandler(Node *n); /* Low-level code generation */ virtual int constantWrapper(Node *n); virtual int variableWrapper(Node *n); virtual int functionWrapper(Node *n); virtual int nativeWrapper(Node *n); /* C++ director class generation */ virtual int classDirector(Node *n); virtual int classDirectorInit(Node *n); virtual int classDirectorEnd(Node *n); virtual int unrollVirtualMethods(Node *n, Node *parent, List *vm, int default_director, int &virtual_destructor, int protectedbase = 0); virtual int classDirectorConstructor(Node *n); virtual int classDirectorDefaultConstructor(Node *n); virtual int classDirectorMethod(Node *n, Node *parent, String *super); virtual int classDirectorConstructors(Node *n); virtual int classDirectorDestructor(Node *n); virtual int classDirectorMethods(Node *n); virtual int classDirectorDisown(Node *n); /* Miscellaneous */ virtual int validIdentifier(String *s); /* valid identifier? */ virtual int addSymbol(const String *s, const Node *n, const_String_or_char_ptr scope = ""); /* Add symbol */ virtual int addInterfaceSymbol(const String *interface_name, Node *n, const_String_or_char_ptr scope = ""); virtual void dumpSymbols(); virtual Node *symbolLookup(const String *s, const_String_or_char_ptr scope = ""); /* Symbol lookup */ virtual Hash* symbolAddScope(const_String_or_char_ptr scope); virtual Hash* symbolScopeLookup(const_String_or_char_ptr scope); virtual Hash* symbolScopePseudoSymbolLookup(const_String_or_char_ptr scope); static Node *classLookup(const SwigType *s); /* Class lookup */ static Node *enumLookup(SwigType *s); /* Enum lookup */ virtual int abstractClassTest(Node *n); /* Is class really abstract? */ virtual int is_assignable(Node *n); /* Is variable assignable? */ virtual String *runtimeCode(); /* returns the language specific runtime code */ virtual String *defaultExternalRuntimeFilename(); /* the default filename for the external runtime */ virtual void replaceSpecialVariables(String *method, String *tm, Parm *parm); /* Language specific special variable substitutions for $typemap() */ /* Runtime is C++ based, so extern "C" header section */ void enable_cplus_runtime_mode(); /* Returns the cplus_runtime mode */ int cplus_runtime_mode(); /* Allow director related code generation */ void allow_directors(int val = 1); /* Return true if directors are enabled */ int directorsEnabled() const; /* Allow director protected members related code generation */ void allow_dirprot(int val = 1); /* Allow all protected members code generation (for directors) */ void allow_allprotected(int val = 0); /* Returns the dirprot mode */ int dirprot_mode() const; /* Check if the non public constructor is needed (for directors) */ int need_nonpublic_ctor(Node *n); /* Check if the non public member is needed (for directors) */ int need_nonpublic_member(Node *n); /* Set none comparison string */ void setSubclassInstanceCheck(String *s); /* Set overload variable templates argc and argv */ void setOverloadResolutionTemplates(String *argc, String *argv); /* Language instance is a singleton - get instance */ static Language* instance(); protected: /* Allow multiple-input typemaps */ void allow_multiple_input(int val = 1); /* Allow overloaded functions */ void allow_overloading(int val = 1); /* Wrapping class query */ int is_wrapping_class() const; /* Return the node for the current class */ Node *getCurrentClass() const; /* Return C++ mode */ int getCPlusMode() const; /* Return the namespace for the class/enum - the nspace feature */ String *getNSpace() const; /* Return the real name of the current class */ String *getClassName() const; /* Return the classes hash */ Hash *getClassHash() const; /* Return the current class prefix */ String *getClassPrefix() const; /* Return the current enum class prefix */ String *getEnumClassPrefix() const; /* Fully qualified type name to use */ String *getClassType() const; /* Return true if the current method is part of a smart-pointer */ int is_smart_pointer() const; /* Return the name to use for the given parameter. */ virtual String *makeParameterName(Node *n, Parm *p, int arg_num, bool setter = false) const; /* Some language modules require additional wrappers for virtual methods not declared in sub-classes */ virtual bool extraDirectorProtectedCPPMethodsRequired() const; public: enum NestedClassSupport { NCS_None, // Target language does not have an equivalent to nested classes NCS_Full, // Target language does have an equivalent to nested classes and is fully implemented NCS_Unknown // Target language may or may not have an equivalent to nested classes. If it does, it has not been implemented yet. }; /* Does target language support nested classes? Default is NCS_Unknown. If NCS_Unknown is returned, then the nested classes will be ignored unless %feature "flatnested" is applied to them, in which case they will appear in global space. If the target language does not support the notion of class nesting, the language module should return NCS_None from this function, and the nested classes will be moved to the global scope (like implicit global %feature "flatnested"). */ virtual NestedClassSupport nestedClassesSupport() const; /* Returns true if the target language supports key word arguments (kwargs) */ virtual bool kwargsSupport() const; protected: /* Identifies if a protected members that are generated when the allprotected option is used. This does not include protected virtual methods as they are turned on with the dirprot option. */ bool isNonVirtualProtectedAccess(Node *n) const; /* Identify if a wrapped global or member variable n should use the naturalvar feature */ int use_naturalvar_mode(Node *n) const; /* Director subclass comparison test */ String *none_comparison; /* Director constructor "template" code */ String *director_ctor_code; /* Director 'protected' constructor "template" code */ String *director_prot_ctor_code; /* Director allows multiple inheritance */ int director_multiple_inheritance; /* Director language module */ int director_language; /* Used to translate Doxygen comments to target documentation format */ class DoxygenTranslator *doxygenTranslator; private: Hash *symtabs; /* symbol tables */ int overloading; int multiinput; int cplus_runtime; int directors; static Language *this_; }; extern "C" { void SWIG_typemap_lang(const char *); typedef Language *(*ModuleFactory) (void); } enum Status {Disabled, Experimental, Supported}; struct TargetLanguageModule { const char *name; ModuleFactory fac; const char *help; Status status; }; int SWIG_main(int argc, char *argv[], const TargetLanguageModule *tlm); void emit_parameter_variables(ParmList *l, Wrapper *f); void emit_return_variable(Node *n, SwigType *rt, Wrapper *f); void SWIG_config_file(const_String_or_char_ptr ); const String *SWIG_output_directory(); void SWIG_config_cppext(const char *ext); void Swig_print_xml(Node *obj, String *filename); /* get the list of generated files */ List *SWIG_output_files(); void SWIG_library_directory(const char *); int emit_num_arguments(ParmList *); int emit_num_required(ParmList *); int emit_isvarargs(ParmList *p); bool emit_isvarargs_function(Node *n); void emit_attach_parmmaps(ParmList *, Wrapper *f); void emit_mark_varargs(ParmList *l); String *emit_action(Node *n); int emit_action_code(Node *n, String *wrappercode, String *action); void Swig_overload_check(Node *n); String *Swig_overload_dispatch(Node *n, const_String_or_char_ptr fmt, int *, const_String_or_char_ptr fmt_fastdispatch = 0); String *Swig_overload_dispatch_cast(Node *n, const_String_or_char_ptr fmt, int *); List *Swig_overload_rank(Node *n, bool script_lang_wrapping); SwigType *cplus_value_type(SwigType *t); /* directors.cxx start */ String *Swig_csuperclass_call(String *base, String *method, ParmList *l); String *Swig_class_declaration(Node *n, String *name); String *Swig_class_name(Node *n); String *Swig_method_call(const_String_or_char_ptr name, ParmList *parms); String *Swig_method_decl(SwigType *return_base_type, SwigType *decl, const_String_or_char_ptr id, List *args, int default_args); String *Swig_director_declaration(Node *n); void Swig_director_emit_dynamic_cast(Node *n, Wrapper *f); void Swig_director_parms_fixup(ParmList *parms); /* directors.cxx end */ /* Utilities */ int is_public(Node *n); int is_private(Node *n); int is_protected(Node *n); int is_member_director(Node *parentnode, Node *member); int is_member_director(Node *member); int is_non_virtual_protected_access(Node *n); /* Check if the non-virtual protected members are required (for directors) */ void Wrapper_virtual_elimination_mode_set(int); void Wrapper_fast_dispatch_mode_set(int); void Wrapper_cast_dispatch_mode_set(int); void Wrapper_naturalvar_mode_set(int); void clean_overloaded(Node *n); extern "C" { const char *Swig_to_string(DOH *object, int count = -1); const char *Swig_to_string_with_location(DOH *object, int count = -1); void Swig_print(DOH *object, int count = -1); void Swig_print_with_location(DOH *object, int count = -1); } /* Contracts */ void Swig_contracts(Node *n); void Swig_contract_mode_set(int flag); int Swig_contract_mode_get(); /* Browser */ void Swig_browser(Node *n, int); void Swig_default_allocators(Node *n); void Swig_process_types(Node *n); /* Nested classes */ void Swig_nested_process_classes(Node *n); void Swig_nested_name_unnamed_c_structs(Node *n); /* Interface feature */ void Swig_interface_feature_enable(); void Swig_interface_propagate_methods(Node *n); /* Miscellaneous */ template class save_value { T _value; T& _value_ptr; save_value(const save_value&); save_value& operator=(const save_value&); public: save_value(T& value) : _value(value), _value_ptr(value) {} save_value(T& value, T new_val) : _value(value), _value_ptr(value) { value = new_val; } ~save_value() { _value_ptr = _value; } }; #endif swig-4.0.1/Source/Modules/contract.cxx0000644000175000017500000002357313527063513017573 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * contract.cxx * * Support for Wrap by Contract in SWIG. * ----------------------------------------------------------------------------- */ #include "swigmod.h" /* Contract structure. This holds rules about the different kinds of contract sections and their combination rules */ struct contract { const char *section; const char *combiner; }; /* Contract rules. This table defines what contract sections are recognized as well as how contracts are to combined via inheritance */ static contract Rules[] = { {"require:", "&&"}, {"ensure:", "||"}, {NULL, NULL} }; /* ---------------------------------------------------------------------------- * class Contracts: * * This class defines the functions that need to be used in * "wrap by contract" module. * ------------------------------------------------------------------------- */ class Contracts:public Dispatcher { String *make_expression(String *s, Node *n); void substitute_parms(String *s, ParmList *p, int method); public: Hash *ContractSplit(Node *n); int emit_contract(Node *n, int method); int cDeclaration(Node *n); int constructorDeclaration(Node *n); int externDeclaration(Node *n); int extendDirective(Node *n); int importDirective(Node *n); int includeDirective(Node *n); int namespaceDeclaration(Node *n); int classDeclaration(Node *n); virtual int top(Node *n); }; static int Contract_Mode = 0; /* contract option */ static int InClass = 0; /* Parsing C++ or not */ static int InConstructor = 0; static Node *CurrentClass = 0; /* Set the contract mode, default is 0 (not open) */ /* Normally set in main.cxx, when get the "-contracts" option */ void Swig_contract_mode_set(int flag) { Contract_Mode = flag; } /* Get the contract mode */ int Swig_contract_mode_get() { return Contract_Mode; } /* Apply contracts */ void Swig_contracts(Node *n) { Contracts *a = new Contracts; a->top(n); delete a; } /* Split the whole contract into preassertion, postassertion and others */ Hash *Contracts::ContractSplit(Node *n) { String *contract = Getattr(n, "feature:contract"); Hash *result; if (!contract) return NULL; result = NewHash(); String *current_section = NewString(""); const char *current_section_name = Rules[0].section; List *l = SplitLines(contract); Iterator i; for (i = First(l); i.item; i = Next(i)) { int found = 0; if (Strchr(i.item, '{')) continue; if (Strchr(i.item, '}')) continue; for (int j = 0; Rules[j].section; j++) { if (Strstr(i.item, Rules[j].section)) { if (Len(current_section)) { Setattr(result, current_section_name, current_section); current_section = Getattr(result, Rules[j].section); if (!current_section) current_section = NewString(""); } current_section_name = Rules[j].section; found = 1; break; } } if (!found) Append(current_section, i.item); } if (Len(current_section)) Setattr(result, current_section_name, current_section); return result; } /* This function looks in base classes and collects contracts found */ void inherit_contracts(Node *c, Node *n, Hash *contracts, Hash *messages) { Node *b, *temp; String *name, *type, *local_decl, *base_decl; List *bases; int found = 0; bases = Getattr(c, "bases"); if (!bases) return; name = Getattr(n, "name"); type = Getattr(n, "type"); local_decl = Getattr(n, "decl"); if (local_decl) { local_decl = SwigType_typedef_resolve_all(local_decl); } else { return; } /* Width first search */ for (int i = 0; i < Len(bases); i++) { b = Getitem(bases, i); temp = firstChild(b); while (temp) { base_decl = Getattr(temp, "decl"); if (base_decl) { base_decl = SwigType_typedef_resolve_all(base_decl); if ((checkAttribute(temp, "storage", "virtual")) && (checkAttribute(temp, "name", name)) && (checkAttribute(temp, "type", type)) && (!Strcmp(local_decl, base_decl))) { /* Yes, match found. */ Hash *icontracts = Getattr(temp, "contract:rules"); Hash *imessages = Getattr(temp, "contract:messages"); found = 1; if (icontracts && imessages) { /* Add inherited contracts and messages to the contract rules above */ int j = 0; for (j = 0; Rules[j].section; j++) { String *t = Getattr(contracts, Rules[j].section); String *s = Getattr(icontracts, Rules[j].section); if (s) { if (t) { Insert(t, 0, "("); Printf(t, ") %s (%s)", Rules[j].combiner, s); String *m = Getattr(messages, Rules[j].section); Printf(m, " %s [%s from %s]", Rules[j].combiner, Getattr(imessages, Rules[j].section), Getattr(b, "name")); } else { Setattr(contracts, Rules[j].section, NewString(s)); Setattr(messages, Rules[j].section, NewStringf("[%s from %s]", Getattr(imessages, Rules[j].section), Getattr(b, "name"))); } } } } } Delete(base_decl); } temp = nextSibling(temp); } } Delete(local_decl); if (!found) { for (int j = 0; j < Len(bases); j++) { b = Getitem(bases, j); inherit_contracts(b, n, contracts, messages); } } } /* This function cleans up the assertion string by removing some extraneous characters. Splitting the assertion into pieces */ String *Contracts::make_expression(String *s, Node *n) { String *str_assert, *expr = 0; List *list_assert; str_assert = NewString(s); /* Omit all useless characters and split by ; */ Replaceall(str_assert, "\n", ""); Replaceall(str_assert, "{", ""); Replaceall(str_assert, "}", ""); Replace(str_assert, " ", "", DOH_REPLACE_ANY | DOH_REPLACE_NOQUOTE); Replace(str_assert, "\t", "", DOH_REPLACE_ANY | DOH_REPLACE_NOQUOTE); list_assert = Split(str_assert, ';', -1); Delete(str_assert); /* build up new assertion */ str_assert = NewString(""); Iterator ei; for (ei = First(list_assert); ei.item; ei = Next(ei)) { expr = ei.item; if (Len(expr)) { Replaceid(expr, Getattr(n, "name"), Swig_cresult_name()); if (Len(str_assert)) Append(str_assert, "&&"); Printf(str_assert, "(%s)", expr); } } Delete(list_assert); return str_assert; } /* This function substitutes parameter names for argument names in the contract specification. Note: it is assumed that the wrapper code uses arg1 for self and arg2..argn for arguments. */ void Contracts::substitute_parms(String *s, ParmList *p, int method) { int argnum = 1; char argname[32]; if (method) { Replaceid(s, "$self", "arg1"); argnum++; } while (p) { sprintf(argname, "arg%d", argnum); String *name = Getattr(p, "name"); if (name) { Replaceid(s, name, argname); } argnum++; p = nextSibling(p); } } int Contracts::emit_contract(Node *n, int method) { Hash *contracts; Hash *messages; String *c; ParmList *cparms; if (!Getattr(n, "feature:contract")) return SWIG_ERROR; /* Get contract parameters */ cparms = Getmeta(Getattr(n, "feature:contract"), "parms"); /* Split contract into preassert & postassert */ contracts = ContractSplit(n); if (!contracts) return SWIG_ERROR; /* This messages hash is used to hold the error messages that will be displayed on failed contract. */ messages = NewHash(); /* Take the different contract expressions and clean them up a bit */ Iterator i; for (i = First(contracts); i.item; i = Next(i)) { String *e = make_expression(i.item, n); substitute_parms(e, cparms, method); Setattr(contracts, i.key, e); /* Make a string containing error messages */ Setattr(messages, i.key, NewString(e)); } /* If we're in a class. We need to inherit other assertions. */ if (InClass) { inherit_contracts(CurrentClass, n, contracts, messages); } /* Save information */ Setattr(n, "contract:rules", contracts); Setattr(n, "contract:messages", messages); /* Okay. Generate the contract runtime code. */ if ((c = Getattr(contracts, "require:"))) { Setattr(n, "contract:preassert", NewStringf("SWIG_contract_assert(%s, \"Contract violation: require: %s\");\n", c, Getattr(messages, "require:"))); } if ((c = Getattr(contracts, "ensure:"))) { Setattr(n, "contract:postassert", NewStringf("SWIG_contract_assert(%s, \"Contract violation: ensure: %s\");\n", c, Getattr(messages, "ensure:"))); } return SWIG_OK; } int Contracts::cDeclaration(Node *n) { int ret = SWIG_OK; String *decl = Getattr(n, "decl"); /* Not a function. Don't even bother with it (for now) */ if (!SwigType_isfunction(decl)) return SWIG_OK; if (Getattr(n, "feature:contract")) ret = emit_contract(n, InClass && !Swig_storage_isstatic(n)); return ret; } int Contracts::constructorDeclaration(Node *n) { int ret = SWIG_OK; InConstructor = 1; if (Getattr(n, "feature:contract")) ret = emit_contract(n, 0); InConstructor = 0; return ret; } int Contracts::externDeclaration(Node *n) { return emit_children(n); } int Contracts::extendDirective(Node *n) { return emit_children(n); } int Contracts::importDirective(Node *n) { return emit_children(n); } int Contracts::includeDirective(Node *n) { return emit_children(n); } int Contracts::namespaceDeclaration(Node *n) { return emit_children(n); } int Contracts::classDeclaration(Node *n) { int ret = SWIG_OK; int oldInClass = InClass; Node *oldClass = CurrentClass; InClass = 1; CurrentClass = n; emit_children(n); InClass = oldInClass; CurrentClass = oldClass; return ret; } int Contracts::top(Node *n) { emit_children(n); return SWIG_OK; } swig-4.0.1/Source/Modules/pike.cxx0000644000175000017500000006470313527063513016706 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * pike.cxx * * Pike language module for SWIG. * ----------------------------------------------------------------------------- */ /* * Notes: * * - The current approach used for "out" typemaps is inconsistent with * how "out" typemaps are handled by other language modules. Instead * of converting the C/C++ type ($1) to a Pike object type (e.g. a * struct svalue), we're just calling the appropriate push_XXX * (e.g. push_int) to push the return value onto the stack. * * - Pike classes can't have static member functions or data, so we need * to find some other appropriate mapping for C++ static member functions * and data. * * - Pike doesn't seem to provide any default way to print the memory * address, etc. for extension objects. Should we do something here? * */ #include "swigmod.h" #include // for isalnum() static const char *usage = "\ Pike Options (available with -pike)\n\ [no additional options]\n\ \n"; class PIKE:public Language { private: File *f_begin; File *f_runtime; File *f_header; File *f_wrappers; File *f_init; File *f_classInit; String *PrefixPlusUnderscore; int current; // Wrap modes enum { NO_CPP, MEMBER_FUNC, CONSTRUCTOR, DESTRUCTOR, MEMBER_VAR, CLASS_CONST, STATIC_FUNC, STATIC_VAR }; public: /* --------------------------------------------------------------------- * PIKE() * * Initialize member data * --------------------------------------------------------------------- */ PIKE() { f_begin = 0; f_runtime = 0; f_header = 0; f_wrappers = 0; f_init = 0; f_classInit = 0; PrefixPlusUnderscore = 0; current = NO_CPP; } /* --------------------------------------------------------------------- * main() * * Parse command line options and initializes variables. * --------------------------------------------------------------------- */ virtual void main(int argc, char *argv[]) { /* Set location of SWIG library */ SWIG_library_directory("pike"); /* Look for certain command line options */ for (int i = 1; i < argc; i++) { if (argv[i]) { if (strcmp(argv[i], "-help") == 0) { fputs(usage, stdout); } } } /* Add a symbol to the parser for conditional compilation */ Preprocessor_define("SWIGPIKE 1", 0); /* Set language-specific configuration file */ SWIG_config_file("pike.swg"); /* Set typemap language */ SWIG_typemap_lang("pike"); /* Enable overloaded methods support */ allow_overloading(); } /* --------------------------------------------------------------------- * top() * --------------------------------------------------------------------- */ virtual int top(Node *n) { /* Get the module name */ String *module = Getattr(n, "name"); /* Get the output file name */ String *outfile = Getattr(n, "outfile"); /* Open the output file */ f_begin = NewFile(outfile, "w", SWIG_output_files()); if (!f_begin) { FileErrorDisplay(outfile); SWIG_exit(EXIT_FAILURE); } f_runtime = NewString(""); f_init = NewString(""); f_classInit = NewString(""); f_header = NewString(""); f_wrappers = NewString(""); /* Register file targets with the SWIG file handler */ Swig_register_filebyname("header", f_header); Swig_register_filebyname("wrapper", f_wrappers); Swig_register_filebyname("begin", f_begin); Swig_register_filebyname("runtime", f_runtime); Swig_register_filebyname("init", f_init); Swig_register_filebyname("classInit", f_classInit); /* Standard stuff for the SWIG runtime section */ Swig_banner(f_begin); Printf(f_runtime, "\n\n#ifndef SWIGPIKE\n#define SWIGPIKE\n#endif\n\n"); Printf(f_header, "#define SWIG_init pike_module_init\n"); Printf(f_header, "#define SWIG_name \"%s\"\n\n", module); /* Change naming scheme for constructors and destructors */ Swig_name_register("construct", "%n%c_create"); Swig_name_register("destroy", "%n%c_destroy"); /* Current wrap type */ current = NO_CPP; /* Emit code for children */ Language::top(n); /* Close the initialization function */ Printf(f_init, "}\n"); SwigType_emit_type_table(f_runtime, f_wrappers); /* Close all of the files */ Dump(f_runtime, f_begin); Dump(f_header, f_begin); Dump(f_wrappers, f_begin); Wrapper_pretty_print(f_init, f_begin); Delete(f_header); Delete(f_wrappers); Delete(f_init); Delete(f_classInit); Delete(f_runtime); Delete(f_begin); /* Done */ return SWIG_OK; } /* ------------------------------------------------------------ * validIdentifier() * ------------------------------------------------------------ */ virtual int validIdentifier(String *s) { char *c = Char(s); const char *c0 = c; const char *c1 = c0 + 1; while (*c) { if (*c == '`' && c == c0) { c++; continue; } if ((*c == '+' || *c == '-' || *c == '*' || *c == '/') && c == c1) { c++; continue; } if (!(isalnum(*c) || (*c == '_'))) return 0; c++; } return 1; } /* ------------------------------------------------------------ * importDirective() * ------------------------------------------------------------ */ virtual int importDirective(Node *n) { String *modname = Getattr(n, "module"); if (modname) { Printf(f_init, "pike_require(\"%s\");\n", modname); } return Language::importDirective(n); } /* ------------------------------------------------------------ * strip() * * For names that begin with the current class prefix plus an * underscore (e.g. "Foo_enum_test"), return the base function * name (i.e. "enum_test"). * ------------------------------------------------------------ */ String *strip(const DOHconst_String_or_char_ptr name) { String *s = Copy(name); if (Strncmp(name, PrefixPlusUnderscore, Len(PrefixPlusUnderscore)) != 0) { return s; } Replaceall(s, PrefixPlusUnderscore, ""); return s; } /* ------------------------------------------------------------ * add_method() * ------------------------------------------------------------ */ void add_method(const DOHconst_String_or_char_ptr name, const DOHconst_String_or_char_ptr function, const DOHconst_String_or_char_ptr description) { String *rename = NULL; switch (current) { case NO_CPP: rename = NewString(name); Printf(f_init, "ADD_FUNCTION(\"%s\", %s, tFunc(%s), 0);\n", rename, function, description); break; case STATIC_FUNC: case STATIC_VAR: rename = NewString(name); Printf(f_init, "ADD_FUNCTION(\"%s\", %s, tFunc(%s), 0);\n", rename, function, description); break; case CONSTRUCTOR: case DESTRUCTOR: case MEMBER_FUNC: case MEMBER_VAR: rename = strip(name); Printf(f_classInit, "ADD_FUNCTION(\"%s\", %s, tFunc(%s), 0);\n", rename, function, description); break; case CLASS_CONST: // shouldn't have gotten here for CLASS_CONST nodes default: // what is this? assert(false); } Delete(rename); } /* --------------------------------------------------------------------- * functionWrapper() * * Create a function declaration and register it with the interpreter. * --------------------------------------------------------------------- */ virtual int functionWrapper(Node *n) { String *name = Getattr(n, "name"); String *iname = Getattr(n, "sym:name"); SwigType *d = Getattr(n, "type"); ParmList *l = Getattr(n, "parms"); Parm *p; String *tm; int i; String *overname = 0; if (Getattr(n, "sym:overloaded")) { overname = Getattr(n, "sym:overname"); } else { if (!addSymbol(iname, n)) return SWIG_ERROR; } Wrapper *f = NewWrapper(); // Emit all of the local variables for holding arguments. emit_parameter_variables(l, f); /* Attach the standard typemaps */ emit_attach_parmmaps(l, f); Setattr(n, "wrap:parms", l); /* Get number of required and total arguments */ int num_arguments = emit_num_arguments(l); int varargs = emit_isvarargs(l); /* Which input argument to start with? */ int start = (current == MEMBER_FUNC || current == MEMBER_VAR || current == DESTRUCTOR) ? 1 : 0; /* Offset to skip over the attribute name */ // int offset = (current == MEMBER_VAR) ? 1 : 0; int offset = 0; String *wname = Swig_name_wrapper(iname); if (overname) { Append(wname, overname); } Setattr(n, "wrap:name", wname); Printv(f->def, "static void ", wname, "(INT32 args) {", NIL); /* Generate code for argument marshalling */ String *description = NewString(""); char source[64]; for (i = 0, p = l; i < num_arguments; i++) { while (checkAttribute(p, "tmap:in:numinputs", "0")) { p = Getattr(p, "tmap:in:next"); } SwigType *pt = Getattr(p, "type"); String *ln = Getattr(p, "lname"); if (i < start) { String *lstr = SwigType_lstr(pt, 0); Printf(f->code, "%s = (%s) THIS;\n", ln, lstr); Delete(lstr); } else { /* Look for an input typemap */ sprintf(source, "Pike_sp[%d-args]", i - start + offset); if ((tm = Getattr(p, "tmap:in"))) { Replaceall(tm, "$source", source); Replaceall(tm, "$target", ln); Replaceall(tm, "$input", source); Setattr(p, "emit:input", source); Printf(f->code, "%s\n", tm); String *pikedesc = Getattr(p, "tmap:in:pikedesc"); if (pikedesc) { Printv(description, pikedesc, " ", NIL); } p = Getattr(p, "tmap:in:next"); continue; } else { Swig_warning(WARN_TYPEMAP_IN_UNDEF, input_file, line_number, "Unable to use type %s as a function argument.\n", SwigType_str(pt, 0)); break; } } p = nextSibling(p); } /* Check for trailing varargs */ if (varargs) { if (p && (tm = Getattr(p, "tmap:in"))) { Replaceall(tm, "$input", "varargs"); Printv(f->code, tm, "\n", NIL); } } /* Insert constraint checking code */ for (p = l; p;) { if ((tm = Getattr(p, "tmap:check"))) { Replaceall(tm, "$target", Getattr(p, "lname")); Printv(f->code, tm, "\n", NIL); p = Getattr(p, "tmap:check:next"); } else { p = nextSibling(p); } } /* Insert cleanup code */ String *cleanup = NewString(""); for (p = l; p;) { if ((tm = Getattr(p, "tmap:freearg"))) { Replaceall(tm, "$source", Getattr(p, "lname")); Printv(cleanup, tm, "\n", NIL); p = Getattr(p, "tmap:freearg:next"); } else { p = nextSibling(p); } } /* Insert argument output code */ String *outarg = NewString(""); for (p = l; p;) { if ((tm = Getattr(p, "tmap:argout"))) { Replaceall(tm, "$source", Getattr(p, "lname")); Replaceall(tm, "$target", "resultobj"); Replaceall(tm, "$arg", Getattr(p, "emit:input")); Replaceall(tm, "$input", Getattr(p, "emit:input")); Printv(outarg, tm, "\n", NIL); p = Getattr(p, "tmap:argout:next"); } else { p = nextSibling(p); } } /* Emit the function call */ String *actioncode = emit_action(n); /* Clear the return stack */ Printf(actioncode, "pop_n_elems(args);\n"); /* Return the function value */ if (current == CONSTRUCTOR) { Printv(actioncode, "THIS = (void *) ", Swig_cresult_name(), ";\n", NIL); Printv(description, ", tVoid", NIL); } else if (current == DESTRUCTOR) { Printv(description, ", tVoid", NIL); } else { Printv(description, ", ", NIL); if ((tm = Swig_typemap_lookup_out("out", n, Swig_cresult_name(), f, actioncode))) { actioncode = 0; Replaceall(tm, "$source", Swig_cresult_name()); Replaceall(tm, "$target", "resultobj"); Replaceall(tm, "$result", "resultobj"); if (GetFlag(n, "feature:new")) { Replaceall(tm, "$owner", "1"); } else { Replaceall(tm, "$owner", "0"); } String *pikedesc = Getattr(n, "tmap:out:pikedesc"); if (pikedesc) { Printv(description, pikedesc, NIL); } Printf(f->code, "%s\n", tm); } else { Swig_warning(WARN_TYPEMAP_OUT_UNDEF, input_file, line_number, "Unable to use return type %s in function %s.\n", SwigType_str(d, 0), name); } } if (actioncode) { Append(f->code, actioncode); Delete(actioncode); } emit_return_variable(n, d, f); /* Output argument output code */ Printv(f->code, outarg, NIL); /* Output cleanup code */ Printv(f->code, cleanup, NIL); /* Look to see if there is any newfree cleanup code */ if (GetFlag(n, "feature:new")) { if ((tm = Swig_typemap_lookup("newfree", n, Swig_cresult_name(), 0))) { Replaceall(tm, "$source", Swig_cresult_name()); Printf(f->code, "%s\n", tm); } } /* See if there is any return cleanup code */ if ((tm = Swig_typemap_lookup("ret", n, Swig_cresult_name(), 0))) { Replaceall(tm, "$source", Swig_cresult_name()); Printf(f->code, "%s\n", tm); } /* Close the function */ Printf(f->code, "}\n"); /* Substitute the cleanup code */ Replaceall(f->code, "$cleanup", cleanup); /* Substitute the function name */ Replaceall(f->code, "$symname", iname); Replaceall(f->code, "$result", "resultobj"); /* Dump the function out */ Wrapper_print(f, f_wrappers); /* Now register the function with the interpreter. */ if (!Getattr(n, "sym:overloaded")) { add_method(iname, wname, description); } else { if (!Getattr(n, "sym:nextSibling")) { dispatchFunction(n); } } Delete(cleanup); Delete(outarg); Delete(description); Delete(wname); DelWrapper(f); return SWIG_OK; } /* ------------------------------------------------------------ * dispatchFunction() * * Emit overloading dispatch function * ------------------------------------------------------------ */ void dispatchFunction(Node *n) { /* Last node in overloaded chain */ int maxargs; String *tmp = NewString(""); String *dispatch = Swig_overload_dispatch(n, "%s(args); return;", &maxargs); /* Generate a dispatch wrapper for all overloaded functions */ Wrapper *f = NewWrapper(); String *symname = Getattr(n, "sym:name"); String *wname = Swig_name_wrapper(symname); Printf(f->def, "static void %s(INT32 args) {", wname); Wrapper_add_local(f, "argc", "INT32 argc"); Printf(tmp, "struct svalue argv[%d]", maxargs); Wrapper_add_local(f, "argv", tmp); Wrapper_add_local(f, "ii", "INT32 ii"); Printf(f->code, "argc = args;\n"); Printf(f->code, "for (ii = 0; (ii < argc) && (ii < %d); ii++) {\n", maxargs); Printf(f->code, "argv[ii] = Pike_sp[ii-args];\n"); Printf(f->code, "}\n"); Replaceall(dispatch, "$args", "self, args"); Printv(f->code, dispatch, "\n", NIL); Printf(f->code, "Pike_error(\"No matching function for overloaded '%s'.\");\n", symname); Printv(f->code, "}\n", NIL); Wrapper_print(f, f_wrappers); String *description = NewString(""); Printf(description, "tAny,"); if (current == CONSTRUCTOR || current == DESTRUCTOR) { Printf(description, " tVoid"); } else { String *pd = Getattr(n, "tmap:out:pikedesc"); if (pd) Printf(description, " %s", pd); } add_method(symname, wname, description); Delete(description); DelWrapper(f); Delete(dispatch); Delete(tmp); Delete(wname); } /* ------------------------------------------------------------ * variableWrapper() * ------------------------------------------------------------ */ virtual int variableWrapper(Node *n) { return Language::variableWrapper(n); } /* ------------------------------------------------------------ * constantWrapper() * ------------------------------------------------------------ */ virtual int constantWrapper(Node *n) { Swig_require("constantWrapper", n, "*sym:name", "type", "value", NIL); String *symname = Getattr(n, "sym:name"); SwigType *type = Getattr(n, "type"); String *value = Getattr(n, "value"); bool is_enum_item = (Cmp(nodeType(n), "enumitem") == 0); if (SwigType_type(type) == T_MPOINTER) { /* Special hook for member pointer */ String *wname = Swig_name_wrapper(symname); Printf(f_header, "static %s = %s;\n", SwigType_str(type, wname), value); value = wname; } else if (SwigType_type(type) == T_CHAR && is_enum_item) { type = NewSwigType(T_INT); Setattr(n, "type", type); } /* Perform constant typemap substitution */ String *tm = Swig_typemap_lookup("constant", n, value, 0); if (tm) { Replaceall(tm, "$source", value); Replaceall(tm, "$target", symname); Replaceall(tm, "$symname", symname); Replaceall(tm, "$value", value); Printf(f_init, "%s\n", tm); } else { Swig_warning(WARN_TYPEMAP_CONST_UNDEF, input_file, line_number, "Unsupported constant value %s = %s\n", SwigType_str(type, 0), value); } Swig_restore(n); return SWIG_OK; } /* ------------------------------------------------------------ * nativeWrapper() * ------------------------------------------------------------ */ virtual int nativeWrapper(Node *n) { // return Language::nativeWrapper(n); String *name = Getattr(n, "sym:name"); String *wrapname = Getattr(n, "wrap:name"); if (!addSymbol(wrapname, n)) return SWIG_ERROR; add_method(name, wrapname, 0); return SWIG_OK; } /* ------------------------------------------------------------ * enumDeclaration() * ------------------------------------------------------------ */ virtual int enumDeclaration(Node *n) { return Language::enumDeclaration(n); } /* ------------------------------------------------------------ * enumvalueDeclaration() * ------------------------------------------------------------ */ virtual int enumvalueDeclaration(Node *n) { return Language::enumvalueDeclaration(n); } /* ------------------------------------------------------------ * classDeclaration() * ------------------------------------------------------------ */ virtual int classDeclaration(Node *n) { return Language::classDeclaration(n); } /* ------------------------------------------------------------ * classHandler() * ------------------------------------------------------------ */ virtual int classHandler(Node *n) { String *symname = Getattr(n, "sym:name"); if (!addSymbol(symname, n)) return SWIG_ERROR; PrefixPlusUnderscore = NewStringf("%s_", getClassPrefix()); Printf(f_classInit, "start_new_program();\n"); /* Handle inheritance */ List *baselist = Getattr(n, "bases"); if (baselist && Len(baselist) > 0) { Iterator base = First(baselist); while (base.item) { String *basename = Getattr(base.item, "name"); SwigType *basetype = NewString(basename); SwigType_add_pointer(basetype); SwigType_remember(basetype); String *basemangle = SwigType_manglestr(basetype); Printf(f_classInit, "low_inherit((struct program *) SWIGTYPE%s->clientdata, 0, 0, 0, 0, 0);\n", basemangle); Delete(basemangle); Delete(basetype); base = Next(base); } } else { Printf(f_classInit, "ADD_STORAGE(swig_object_wrapper);\n"); } Language::classHandler(n); /* Accessors for member variables */ /* List *membervariables = Getattr(n,"membervariables"); if (membervariables && Len(membervariables) > 0) { membervariableAccessors(membervariables); } */ /* Done, close the class and dump its definition to the init function */ Printf(f_classInit, "add_program_constant(\"%s\", pr = end_program(), 0);\n", symname); Dump(f_classInit, f_init); Clear(f_classInit); SwigType *tt = NewString(symname); SwigType_add_pointer(tt); SwigType_remember(tt); String *tm = SwigType_manglestr(tt); Printf(f_init, "SWIG_TypeClientData(SWIGTYPE%s, (void *) pr);\n", tm); Delete(tm); Delete(tt); Delete(PrefixPlusUnderscore); PrefixPlusUnderscore = 0; return SWIG_OK; } /* ------------------------------------------------------------ * memberfunctionHandler() * * Method for adding C++ member function * ------------------------------------------------------------ */ virtual int memberfunctionHandler(Node *n) { current = MEMBER_FUNC; Language::memberfunctionHandler(n); current = NO_CPP; return SWIG_OK; } /* ------------------------------------------------------------ * constructorHandler() * * Method for adding C++ member constructor * ------------------------------------------------------------ */ virtual int constructorHandler(Node *n) { current = CONSTRUCTOR; Language::constructorHandler(n); current = NO_CPP; return SWIG_OK; } /* ------------------------------------------------------------ * destructorHandler() * ------------------------------------------------------------ */ virtual int destructorHandler(Node *n) { current = DESTRUCTOR; Language::destructorHandler(n); current = NO_CPP; return SWIG_OK; } /* ------------------------------------------------------------ * membervariableAccessors() * ------------------------------------------------------------ */ void membervariableAccessors(List *membervariables) { String *name; Iterator i; bool need_setter; String *funcname; /* If at least one of them is mutable, we need a setter */ need_setter = false; i = First(membervariables); while (i.item) { if (!GetFlag(i.item, "feature:immutable")) { need_setter = true; break; } i = Next(i); } /* Create a function to set the values of the (mutable) variables */ if (need_setter) { Wrapper *wrapper = NewWrapper(); String *setter = Swig_name_member(NSPACE_TODO, getClassPrefix(), "`->="); String *wname = Swig_name_wrapper(setter); Printv(wrapper->def, "static void ", wname, "(INT32 args) {", NIL); Printf(wrapper->locals, "char *name = (char *) STR0(Pike_sp[0-args].u.string);\n"); i = First(membervariables); while (i.item) { if (!GetFlag(i.item, "feature:immutable")) { name = Getattr(i.item, "name"); funcname = Swig_name_wrapper(Swig_name_set(NSPACE_TODO, Swig_name_member(NSPACE_TODO, getClassPrefix(), name))); Printf(wrapper->code, "if (!strcmp(name, \"%s\")) {\n", name); Printf(wrapper->code, "%s(args);\n", funcname); Printf(wrapper->code, "return;\n"); Printf(wrapper->code, "}\n"); Delete(funcname); } i = Next(i); } /* Close the function */ Printf(wrapper->code, "pop_n_elems(args);\n"); Printf(wrapper->code, "}\n"); /* Dump wrapper code to the output file */ Wrapper_print(wrapper, f_wrappers); /* Register it with Pike */ String *description = NewString("tStr tFloat, tVoid"); add_method("`->=", wname, description); Delete(description); /* Clean up */ Delete(wname); Delete(setter); DelWrapper(wrapper); } /* Create a function to get the values of the (mutable) variables */ Wrapper *wrapper = NewWrapper(); String *getter = Swig_name_member(NSPACE_TODO, getClassPrefix(), "`->"); String *wname = Swig_name_wrapper(getter); Printv(wrapper->def, "static void ", wname, "(INT32 args) {", NIL); Printf(wrapper->locals, "char *name = (char *) STR0(Pike_sp[0-args].u.string);\n"); i = First(membervariables); while (i.item) { name = Getattr(i.item, "name"); funcname = Swig_name_wrapper(Swig_name_get(NSPACE_TODO, Swig_name_member(NSPACE_TODO, getClassPrefix(), name))); Printf(wrapper->code, "if (!strcmp(name, \"%s\")) {\n", name); Printf(wrapper->code, "%s(args);\n", funcname); Printf(wrapper->code, "return;\n"); Printf(wrapper->code, "}\n"); Delete(funcname); i = Next(i); } /* Close the function */ Printf(wrapper->code, "pop_n_elems(args);\n"); Printf(wrapper->code, "}\n"); /* Dump wrapper code to the output file */ Wrapper_print(wrapper, f_wrappers); /* Register it with Pike */ String *description = NewString("tStr, tMix"); add_method("`->", wname, description); Delete(description); /* Clean up */ Delete(wname); Delete(getter); DelWrapper(wrapper); } /* ------------------------------------------------------------ * membervariableHandler() * ------------------------------------------------------------ */ virtual int membervariableHandler(Node *n) { List *membervariables = Getattr(getCurrentClass(), "membervariables"); if (!membervariables) { membervariables = NewList(); Setattr(getCurrentClass(), "membervariables", membervariables); } Append(membervariables, n); current = MEMBER_VAR; Language::membervariableHandler(n); current = NO_CPP; return SWIG_OK; } /* ----------------------------------------------------------------------- * staticmemberfunctionHandler() * * Wrap a static C++ function * ---------------------------------------------------------------------- */ virtual int staticmemberfunctionHandler(Node *n) { current = STATIC_FUNC; Language::staticmemberfunctionHandler(n); current = NO_CPP; return SWIG_OK; } /* ------------------------------------------------------------ * memberconstantHandler() * * Create a C++ constant * ------------------------------------------------------------ */ virtual int memberconstantHandler(Node *n) { current = CLASS_CONST; constantWrapper(n); current = NO_CPP; return SWIG_OK; } /* --------------------------------------------------------------------- * staticmembervariableHandler() * --------------------------------------------------------------------- */ virtual int staticmembervariableHandler(Node *n) { current = STATIC_VAR; Language::staticmembervariableHandler(n); current = NO_CPP; return SWIG_OK; } }; /* ----------------------------------------------------------------------------- * swig_pike() - Instantiate module * ----------------------------------------------------------------------------- */ static Language *new_swig_pike() { return new PIKE(); } extern "C" Language *swig_pike(void) { return new_swig_pike(); } swig-4.0.1/Source/Modules/overload.cxx0000644000175000017500000007035613527063513017572 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * overload.cxx * * This file is used to analyze overloaded functions and methods. * It looks at signatures and tries to gather information for * building a dispatch function. * ----------------------------------------------------------------------------- */ #include "swigmod.h" #define MAX_OVERLOAD 4096 /* Overload "argc" and "argv" */ String *argv_template_string; String *argc_template_string; struct Overloaded { Node *n; /* Node */ int argc; /* Argument count */ ParmList *parms; /* Parameters used for overload check */ int error; /* Ambiguity error */ bool implicitconv_function; /* For ordering implicitconv functions*/ }; static int fast_dispatch_mode = 0; static int cast_dispatch_mode = 0; /* Set fast_dispatch_mode */ void Wrapper_fast_dispatch_mode_set(int flag) { fast_dispatch_mode = flag; } void Wrapper_cast_dispatch_mode_set(int flag) { cast_dispatch_mode = flag; } /* ----------------------------------------------------------------------------- * mark_implicitconv_function() * * Mark function if it contains an implicitconv type in the parameter list * ----------------------------------------------------------------------------- */ static void mark_implicitconv_function(Overloaded& onode) { Parm *parms = onode.parms; if (parms) { bool is_implicitconv_function = false; Parm *p = parms; while (p) { if (checkAttribute(p, "tmap:in:numinputs", "0")) { p = Getattr(p, "tmap:in:next"); continue; } if (GetFlag(p, "implicitconv")) { is_implicitconv_function = true; break; } p = nextSibling(p); } if (is_implicitconv_function) onode.implicitconv_function = true; } } /* ----------------------------------------------------------------------------- * Swig_overload_rank() * * This function takes an overloaded declaration and creates a list that ranks * all overloaded methods in an order that can be used to generate a dispatch * function. * Slight difference in the way this function is used by scripting languages and * statically typed languages. The script languages call this method via * Swig_overload_dispatch() - where wrappers for all overloaded methods are generated, * however sometimes the code can never be executed. The non-scripting languages * call this method via Swig_overload_check() for each overloaded method in order * to determine whether or not the method should be wrapped. Note the slight * difference when overloading methods that differ by const only. The * scripting languages will ignore the const method, whereas the non-scripting * languages ignore the first method parsed. * ----------------------------------------------------------------------------- */ List *Swig_overload_rank(Node *n, bool script_lang_wrapping) { Overloaded nodes[MAX_OVERLOAD]; int nnodes = 0; Node *o = Getattr(n, "sym:overloaded"); Node *c; if (!o) return 0; c = o; while (c) { if (Getattr(c, "error")) { c = Getattr(c, "sym:nextSibling"); continue; } /* if (SmartPointer && Getattr(c,"cplus:staticbase")) { c = Getattr(c,"sym:nextSibling"); continue; } */ /* Make a list of all the declarations (methods) that are overloaded with * this one particular method name */ if (Getattr(c, "wrap:name")) { assert(nnodes < MAX_OVERLOAD); nodes[nnodes].n = c; nodes[nnodes].parms = Getattr(c, "wrap:parms"); nodes[nnodes].argc = emit_num_required(nodes[nnodes].parms); nodes[nnodes].error = 0; nodes[nnodes].implicitconv_function = false; mark_implicitconv_function(nodes[nnodes]); nnodes++; } c = Getattr(c, "sym:nextSibling"); } /* Sort the declarations by required argument count */ { int i, j; for (i = 0; i < nnodes; i++) { for (j = i + 1; j < nnodes; j++) { if (nodes[i].argc > nodes[j].argc) { Overloaded t = nodes[i]; nodes[i] = nodes[j]; nodes[j] = t; } } } } /* Sort the declarations by argument types */ { int i, j; for (i = 0; i < nnodes - 1; i++) { if (nodes[i].argc == nodes[i + 1].argc) { for (j = i + 1; (j < nnodes) && (nodes[j].argc == nodes[i].argc); j++) { Parm *p1 = nodes[i].parms; Parm *p2 = nodes[j].parms; int differ = 0; int num_checked = 0; while (p1 && p2 && (num_checked < nodes[i].argc)) { // Printf(stdout,"p1 = '%s', p2 = '%s'\n", Getattr(p1,"type"), Getattr(p2,"type")); if (checkAttribute(p1, "tmap:in:numinputs", "0")) { p1 = Getattr(p1, "tmap:in:next"); continue; } if (checkAttribute(p2, "tmap:in:numinputs", "0")) { p2 = Getattr(p2, "tmap:in:next"); continue; } String *t1 = Getattr(p1, "tmap:typecheck:precedence"); String *t2 = Getattr(p2, "tmap:typecheck:precedence"); if ((!t1) && (!nodes[i].error)) { Swig_warning(WARN_TYPEMAP_TYPECHECK, Getfile(nodes[i].n), Getline(nodes[i].n), "Overloaded method %s not supported (incomplete type checking rule - no precedence level in typecheck typemap for '%s').\n", Swig_name_decl(nodes[i].n), SwigType_str(Getattr(p1, "type"), 0)); nodes[i].error = 1; } else if ((!t2) && (!nodes[j].error)) { Swig_warning(WARN_TYPEMAP_TYPECHECK, Getfile(nodes[j].n), Getline(nodes[j].n), "Overloaded method %s not supported (incomplete type checking rule - no precedence level in typecheck typemap for '%s').\n", Swig_name_decl(nodes[j].n), SwigType_str(Getattr(p2, "type"), 0)); nodes[j].error = 1; } if (t1 && t2) { int t1v, t2v; t1v = atoi(Char(t1)); t2v = atoi(Char(t2)); differ = t1v - t2v; } else if (!t1 && t2) differ = 1; else if (t1 && !t2) differ = -1; else if (!t1 && !t2) differ = -1; num_checked++; if (differ > 0) { Overloaded t = nodes[i]; nodes[i] = nodes[j]; nodes[j] = t; break; } else if ((differ == 0) && (Strcmp(t1, "0") == 0)) { t1 = Getattr(p1, "equivtype"); t1 = t1 ? t1 : Getattr(p1, "ltype"); if (!t1) { t1 = SwigType_ltype(Getattr(p1, "type")); if (Getattr(p1, "tmap:typecheck:SWIGTYPE")) { SwigType_add_pointer(t1); } Setattr(p1, "ltype", t1); } t2 = Getattr(p2, "equivtype"); t2 = t2 ? t2 : Getattr(p2, "ltype"); if (!t2) { t2 = SwigType_ltype(Getattr(p2, "type")); if (Getattr(p2, "tmap:typecheck:SWIGTYPE")) { SwigType_add_pointer(t2); } Setattr(p2, "ltype", t2); } /* Need subtype check here. If t2 is a subtype of t1, then we need to change the order */ if (SwigType_issubtype(t2, t1)) { Overloaded t = nodes[i]; nodes[i] = nodes[j]; nodes[j] = t; } if (Strcmp(t1, t2) != 0) { differ = 1; break; } } else if (differ) { break; } if (Getattr(p1, "tmap:in:next")) { p1 = Getattr(p1, "tmap:in:next"); } else { p1 = nextSibling(p1); } if (Getattr(p2, "tmap:in:next")) { p2 = Getattr(p2, "tmap:in:next"); } else { p2 = nextSibling(p2); } } if (!differ) { /* See if declarations differ by const only */ String *decl1 = Getattr(nodes[i].n, "decl"); String *decl2 = Getattr(nodes[j].n, "decl"); if (decl1 && decl2) { /* Remove ref-qualifiers. Note that rvalue ref-qualifiers are already ignored and * it is illegal to overload a function with and without ref-qualifiers. So with * all the combinations of ref-qualifiers and cv-qualifiers, we just detect * the cv-qualifier (const) overloading. */ String *d1 = Copy(decl1); String *d2 = Copy(decl2); if (SwigType_isreference(d1) || SwigType_isrvalue_reference(d1)) { Delete(SwigType_pop(d1)); } if (SwigType_isreference(d2) || SwigType_isrvalue_reference(d2)) { Delete(SwigType_pop(d2)); } String *dq1 = Copy(d1); String *dq2 = Copy(d2); if (SwigType_isconst(d1)) { Delete(SwigType_pop(dq1)); } if (SwigType_isconst(d2)) { Delete(SwigType_pop(dq2)); } if (Strcmp(dq1, dq2) == 0) { if (SwigType_isconst(d1) && !SwigType_isconst(d2)) { if (script_lang_wrapping) { // Swap nodes so that the const method gets ignored (shadowed by the non-const method) Overloaded t = nodes[i]; nodes[i] = nodes[j]; nodes[j] = t; } differ = 1; if (!nodes[j].error) { if (script_lang_wrapping) { Swig_warning(WARN_LANG_OVERLOAD_CONST, Getfile(nodes[j].n), Getline(nodes[j].n), "Overloaded method %s ignored,\n", Swig_name_decl(nodes[j].n)); Swig_warning(WARN_LANG_OVERLOAD_CONST, Getfile(nodes[i].n), Getline(nodes[i].n), "using non-const method %s instead.\n", Swig_name_decl(nodes[i].n)); } else { if (!Getattr(nodes[j].n, "overload:ignore")) { Swig_warning(WARN_LANG_OVERLOAD_IGNORED, Getfile(nodes[j].n), Getline(nodes[j].n), "Overloaded method %s ignored,\n", Swig_name_decl(nodes[j].n)); Swig_warning(WARN_LANG_OVERLOAD_IGNORED, Getfile(nodes[i].n), Getline(nodes[i].n), "using %s instead.\n", Swig_name_decl(nodes[i].n)); } } } nodes[j].error = 1; } else if (!SwigType_isconst(d1) && SwigType_isconst(d2)) { differ = 1; if (!nodes[j].error) { if (script_lang_wrapping) { Swig_warning(WARN_LANG_OVERLOAD_CONST, Getfile(nodes[j].n), Getline(nodes[j].n), "Overloaded method %s ignored,\n", Swig_name_decl(nodes[j].n)); Swig_warning(WARN_LANG_OVERLOAD_CONST, Getfile(nodes[i].n), Getline(nodes[i].n), "using non-const method %s instead.\n", Swig_name_decl(nodes[i].n)); } else { if (!Getattr(nodes[j].n, "overload:ignore")) { Swig_warning(WARN_LANG_OVERLOAD_IGNORED, Getfile(nodes[j].n), Getline(nodes[j].n), "Overloaded method %s ignored,\n", Swig_name_decl(nodes[j].n)); Swig_warning(WARN_LANG_OVERLOAD_IGNORED, Getfile(nodes[i].n), Getline(nodes[i].n), "using %s instead.\n", Swig_name_decl(nodes[i].n)); } } } nodes[j].error = 1; } } Delete(dq1); Delete(dq2); } } if (!differ) { if (!nodes[j].error) { if (script_lang_wrapping) { Swig_warning(WARN_LANG_OVERLOAD_SHADOW, Getfile(nodes[j].n), Getline(nodes[j].n), "Overloaded method %s effectively ignored,\n", Swig_name_decl(nodes[j].n)); Swig_warning(WARN_LANG_OVERLOAD_SHADOW, Getfile(nodes[i].n), Getline(nodes[i].n), "as it is shadowed by %s.\n", Swig_name_decl(nodes[i].n)); } else { if (!Getattr(nodes[j].n, "overload:ignore")) { Swig_warning(WARN_LANG_OVERLOAD_IGNORED, Getfile(nodes[j].n), Getline(nodes[j].n), "Overloaded method %s ignored,\n", Swig_name_decl(nodes[j].n)); Swig_warning(WARN_LANG_OVERLOAD_IGNORED, Getfile(nodes[i].n), Getline(nodes[i].n), "using %s instead.\n", Swig_name_decl(nodes[i].n)); } } nodes[j].error = 1; } } } } } } List *result = NewList(); { int i; int argc_changed_index = -1; for (i = 0; i < nnodes; i++) { if (nodes[i].error) Setattr(nodes[i].n, "overload:ignore", "1"); Append(result, nodes[i].n); // Printf(stdout,"[ %d ] %d %s\n", i, nodes[i].implicitconv_function, ParmList_errorstr(nodes[i].parms)); // Swig_print_node(nodes[i].n); if (i == nnodes-1 || nodes[i].argc != nodes[i+1].argc) { if (argc_changed_index+2 < nnodes && (nodes[argc_changed_index+1].argc == nodes[argc_changed_index+2].argc)) { // Add additional implicitconv functions in same order as already ranked. // Consider overloaded functions by argument count... only add additional implicitconv functions if // the number of functions with the same arg count > 1, ie, only if overloaded by same argument count. int j; for (j = argc_changed_index + 1; j <= i; j++) { if (nodes[j].implicitconv_function) { SetFlag(nodes[j].n, "implicitconvtypecheckoff"); Append(result, nodes[j].n); // Printf(stdout,"[ %d ] %d + %s\n", j, nodes[j].implicitconv_function, ParmList_errorstr(nodes[j].parms)); // Swig_print_node(nodes[j].n); } } } argc_changed_index = i; } } } return result; } // /* ----------------------------------------------------------------------------- // * print_typecheck() // * ----------------------------------------------------------------------------- */ static bool print_typecheck(String *f, int j, Parm *pj, bool implicitconvtypecheckoff) { char tmp[256]; sprintf(tmp, Char(argv_template_string), j); String *tm = Getattr(pj, "tmap:typecheck"); if (tm) { tm = Copy(tm); Replaceid(tm, Getattr(pj, "lname"), "_v"); String *conv = Getattr(pj, "implicitconv"); if (conv && !implicitconvtypecheckoff) { Replaceall(tm, "$implicitconv", conv); } else { Replaceall(tm, "$implicitconv", "0"); } Replaceall(tm, "$input", tmp); Printv(f, tm, "\n", NIL); Delete(tm); return true; } else return false; } /* ----------------------------------------------------------------------------- * ReplaceFormat() * ----------------------------------------------------------------------------- */ static String *ReplaceFormat(const_String_or_char_ptr fmt, int j) { String *lfmt = NewString(fmt); char buf[50]; sprintf(buf, "%d", j); Replaceall(lfmt, "$numargs", buf); int i; String *commaargs = NewString(""); for (i = 0; i < j; i++) { Printv(commaargs, ", ", NIL); Printf(commaargs, Char(argv_template_string), i); } Replaceall(lfmt, "$commaargs", commaargs); return lfmt; } /* ----------------------------------------------------------------------------- * Swig_overload_dispatch() * * Generate a dispatch function. argc is assumed to hold the argument count. * argv is the argument vector. * * Note that for C++ class member functions, Swig_overload_dispatch() assumes * that argc includes the "self" argument and that the first element of argv[] * is the "self" argument. So for a member function: * * Foo::bar(int x, int y, int z); * * the argc should be 4 (not 3!) and the first element of argv[] would be * the appropriate scripting language reference to "self". For regular * functions (and static class functions) the argc and argv only include * the regular function arguments. * ----------------------------------------------------------------------------- */ /* Cast dispatch mechanism. */ String *Swig_overload_dispatch_cast(Node *n, const_String_or_char_ptr fmt, int *maxargs) { int i, j; *maxargs = 1; String *f = NewString(""); String *sw = NewString(""); Printf(f, "{\n"); Printf(f, "unsigned long _index = 0;\n"); Printf(f, "SWIG_TypeRank _rank = 0; \n"); /* Get a list of methods ranked by precedence values and argument count */ List *dispatch = Swig_overload_rank(n, true); int nfunc = Len(dispatch); /* Loop over the functions */ bool emitcheck = true; for (i = 0; i < nfunc; i++) { int fn = 0; Node *ni = Getitem(dispatch, i); Parm *pi = Getattr(ni, "wrap:parms"); bool implicitconvtypecheckoff = GetFlag(ni, "implicitconvtypecheckoff") != 0; int num_required = emit_num_required(pi); int num_arguments = emit_num_arguments(pi); if (num_arguments > *maxargs) *maxargs = num_arguments; if (num_required == num_arguments) { Printf(f, "if (%s == %d) {\n", argc_template_string, num_required); } else { Printf(f, "if ((%s >= %d) && (%s <= %d)) {\n", argc_template_string, num_required, argc_template_string, num_arguments); } Printf(f, "SWIG_TypeRank _ranki = 0;\n"); Printf(f, "SWIG_TypeRank _rankm = 0;\n"); if (num_arguments) Printf(f, "SWIG_TypeRank _pi = 1;\n"); /* create a list with the wrappers that collide with the current one based on argument number */ List *coll = NewList(); for (int k = i + 1; k < nfunc; k++) { Node *nk = Getitem(dispatch, k); Parm *pk = Getattr(nk, "wrap:parms"); int nrk = emit_num_required(pk); int nak = emit_num_arguments(pk); if ((nrk >= num_required && nrk <= num_arguments) || (nak >= num_required && nak <= num_arguments) || (nrk <= num_required && nak >= num_arguments)) Append(coll, nk); } // printf("overload: %s coll=%d\n", Char(Getattr(n, "sym:name")), Len(coll)); int num_braces = 0; bool test = (num_arguments > 0); if (test) { int need_v = 1; j = 0; Parm *pj = pi; while (pj) { if (checkAttribute(pj, "tmap:in:numinputs", "0")) { pj = Getattr(pj, "tmap:in:next"); continue; } String *tm = Getattr(pj, "tmap:typecheck"); if (tm) { tm = Copy(tm); /* normalise for comparison later */ Replaceid(tm, Getattr(pj, "lname"), "_v"); /* if all the wrappers have the same type check on this argument we can optimize it out */ for (int k = 0; k < Len(coll) && !emitcheck; k++) { Node *nk = Getitem(coll, k); Parm *pk = Getattr(nk, "wrap:parms"); int nak = emit_num_arguments(pk); if (nak <= j) continue; int l = 0; Parm *pl = pk; /* finds arg j on the collider wrapper */ while (pl && l <= j) { if (checkAttribute(pl, "tmap:in:numinputs", "0")) { pl = Getattr(pl, "tmap:in:next"); continue; } if (l == j) { /* we are at arg j, so we compare the tmaps now */ String *tml = Getattr(pl, "tmap:typecheck"); /* normalise it before comparing */ if (tml) Replaceid(tml, Getattr(pl, "lname"), "_v"); if (!tml || Cmp(tm, tml)) emitcheck = true; //printf("tmap: %s[%d] (%d) => %s\n\n", // Char(Getattr(nk, "sym:name")), // l, emitcheck, tml?Char(tml):0); } Parm *pl1 = Getattr(pl, "tmap:in:next"); if (pl1) pl = pl1; else pl = nextSibling(pl); l++; } } if (emitcheck) { if (need_v) { Printf(f, "int _v = 0;\n"); need_v = 0; } if (j >= num_required) { Printf(f, "if (%s > %d) {\n", argc_template_string, j); num_braces++; } String *tmp = NewStringf(argv_template_string, j); String *conv = Getattr(pj, "implicitconv"); if (conv && !implicitconvtypecheckoff) { Replaceall(tm, "$implicitconv", conv); } else { Replaceall(tm, "$implicitconv", "0"); } Replaceall(tm, "$input", tmp); Printv(f, "{\n", tm, "}\n", NIL); Delete(tm); fn = i + 1; Printf(f, "if (!_v) goto check_%d;\n", fn); Printf(f, "_ranki += _v*_pi;\n"); Printf(f, "_rankm += _pi;\n"); Printf(f, "_pi *= SWIG_MAXCASTRANK;\n"); } } if (!Getattr(pj, "tmap:in:SWIGTYPE") && Getattr(pj, "tmap:typecheck:SWIGTYPE")) { /* we emit a warning if the argument defines the 'in' typemap, but not the 'typecheck' one */ Swig_warning(WARN_TYPEMAP_TYPECHECK_UNDEF, Getfile(ni), Getline(ni), "Overloaded method %s with no explicit typecheck typemap for arg %d of type '%s'\n", Swig_name_decl(n), j, SwigType_str(Getattr(pj, "type"), 0)); } Parm *pj1 = Getattr(pj, "tmap:in:next"); if (pj1) pj = pj1; else pj = nextSibling(pj); j++; } } /* close braces */ for ( /* empty */ ; num_braces > 0; num_braces--) Printf(f, "}\n"); Printf(f, "if (!_index || (_ranki < _rank)) {\n"); Printf(f, " _rank = _ranki; _index = %d;\n", i + 1); Printf(f, " if (_rank == _rankm) goto dispatch;\n"); Printf(f, "}\n"); String *lfmt = ReplaceFormat(fmt, num_arguments); Printf(sw, "case %d:\n", i + 1); Printf(sw, Char(lfmt), Getattr(ni, "wrap:name")); Printf(sw, "\n"); Printf(f, "}\n"); /* braces closes "if" for this method */ if (fn) Printf(f, "check_%d:\n\n", fn); if (implicitconvtypecheckoff) Delattr(ni, "implicitconvtypecheckoff"); Delete(lfmt); Delete(coll); } Delete(dispatch); Printf(f, "dispatch:\n"); Printf(f, "switch(_index) {\n"); Printf(f, "%s", sw); Printf(f, "}\n"); Printf(f, "}\n"); return f; } /* Fast dispatch mechanism, provided by Salvador Fandi~no Garc'ia (#930586). */ static String *overload_dispatch_fast(Node *n, const_String_or_char_ptr fmt, int *maxargs, const_String_or_char_ptr fmt_fastdispatch) { int i, j; *maxargs = 1; String *f = NewString(""); /* Get a list of methods ranked by precedence values and argument count */ List *dispatch = Swig_overload_rank(n, true); int nfunc = Len(dispatch); /* Loop over the functions */ for (i = 0; i < nfunc; i++) { int fn = 0; Node *ni = Getitem(dispatch, i); Parm *pi = Getattr(ni, "wrap:parms"); bool implicitconvtypecheckoff = GetFlag(ni, "implicitconvtypecheckoff") != 0; int num_required = emit_num_required(pi); int num_arguments = emit_num_arguments(pi); if (num_arguments > *maxargs) *maxargs = num_arguments; if (num_required == num_arguments) { Printf(f, "if (%s == %d) {\n", argc_template_string, num_required); } else { Printf(f, "if ((%s >= %d) && (%s <= %d)) {\n", argc_template_string, num_required, argc_template_string, num_arguments); } /* create a list with the wrappers that collide with the current one based on argument number */ List *coll = NewList(); for (int k = i + 1; k < nfunc; k++) { Node *nk = Getitem(dispatch, k); Parm *pk = Getattr(nk, "wrap:parms"); int nrk = emit_num_required(pk); int nak = emit_num_arguments(pk); if ((nrk >= num_required && nrk <= num_arguments) || (nak >= num_required && nak <= num_arguments) || (nrk <= num_required && nak >= num_arguments)) Append(coll, nk); } // printf("overload: %s coll=%d\n", Char(Getattr(n, "sym:name")), Len(coll)); bool emitcheck = false; int num_braces = 0; bool test = (Len(coll) > 0 && num_arguments); if (test) { int need_v = 1; j = 0; Parm *pj = pi; while (pj) { if (checkAttribute(pj, "tmap:in:numinputs", "0")) { pj = Getattr(pj, "tmap:in:next"); continue; } String *tm = Getattr(pj, "tmap:typecheck"); if (tm) { tm = Copy(tm); /* normalise for comparison later */ Replaceid(tm, Getattr(pj, "lname"), "_v"); /* if all the wrappers have the same type check on this argument we can optimize it out */ emitcheck = false; for (int k = 0; k < Len(coll) && !emitcheck; k++) { Node *nk = Getitem(coll, k); Parm *pk = Getattr(nk, "wrap:parms"); int nak = emit_num_arguments(pk); if (nak <= j) continue; int l = 0; Parm *pl = pk; /* finds arg j on the collider wrapper */ while (pl && l <= j) { if (checkAttribute(pl, "tmap:in:numinputs", "0")) { pl = Getattr(pl, "tmap:in:next"); continue; } if (l == j) { /* we are at arg j, so we compare the tmaps now */ String *tml = Getattr(pl, "tmap:typecheck"); /* normalise it before comparing */ if (tml) Replaceid(tml, Getattr(pl, "lname"), "_v"); if (!tml || Cmp(tm, tml)) emitcheck = true; //printf("tmap: %s[%d] (%d) => %s\n\n", // Char(Getattr(nk, "sym:name")), // l, emitcheck, tml?Char(tml):0); } Parm *pl1 = Getattr(pl, "tmap:in:next"); if (pl1) pl = pl1; else pl = nextSibling(pl); l++; } } if (emitcheck) { if (need_v) { Printf(f, "int _v = 0;\n"); need_v = 0; } if (j >= num_required) { Printf(f, "if (%s > %d) {\n", argc_template_string, j); num_braces++; } String *tmp = NewStringf(argv_template_string, j); String *conv = Getattr(pj, "implicitconv"); if (conv && !implicitconvtypecheckoff) { Replaceall(tm, "$implicitconv", conv); } else { Replaceall(tm, "$implicitconv", "0"); } Replaceall(tm, "$input", tmp); Printv(f, "{\n", tm, "}\n", NIL); Delete(tm); fn = i + 1; Printf(f, "if (!_v) goto check_%d;\n", fn); } } if (!Getattr(pj, "tmap:in:SWIGTYPE") && Getattr(pj, "tmap:typecheck:SWIGTYPE")) { /* we emit a warning if the argument defines the 'in' typemap, but not the 'typecheck' one */ Swig_warning(WARN_TYPEMAP_TYPECHECK_UNDEF, Getfile(ni), Getline(ni), "Overloaded method %s with no explicit typecheck typemap for arg %d of type '%s'\n", Swig_name_decl(n), j, SwigType_str(Getattr(pj, "type"), 0)); } Parm *pj1 = Getattr(pj, "tmap:in:next"); if (pj1) pj = pj1; else pj = nextSibling(pj); j++; } } /* close braces */ for ( /* empty */ ; num_braces > 0; num_braces--) Printf(f, "}\n"); // The language module may want to generate different code for last overloaded function called (with same number of arguments) String *lfmt = ReplaceFormat(!emitcheck && fmt_fastdispatch ? fmt_fastdispatch : fmt, num_arguments); Printf(f, Char(lfmt), Getattr(ni, "wrap:name")); Printf(f, "}\n"); /* braces closes "if" for this method */ if (fn) Printf(f, "check_%d:\n\n", fn); if (implicitconvtypecheckoff) Delattr(ni, "implicitconvtypecheckoff"); Delete(lfmt); Delete(coll); } Delete(dispatch); return f; } String *Swig_overload_dispatch(Node *n, const_String_or_char_ptr fmt, int *maxargs, const_String_or_char_ptr fmt_fastdispatch) { if (fast_dispatch_mode || GetFlag(n, "feature:fastdispatch")) { return overload_dispatch_fast(n, fmt, maxargs, fmt_fastdispatch); } int i, j; *maxargs = 1; String *f = NewString(""); /* Get a list of methods ranked by precedence values and argument count */ List *dispatch = Swig_overload_rank(n, true); int nfunc = Len(dispatch); /* Loop over the functions */ for (i = 0; i < nfunc; i++) { Node *ni = Getitem(dispatch, i); Parm *pi = Getattr(ni, "wrap:parms"); bool implicitconvtypecheckoff = GetFlag(ni, "implicitconvtypecheckoff") != 0; int num_required = emit_num_required(pi); int num_arguments = emit_num_arguments(pi); if (GetFlag(n, "wrap:this")) { num_required++; num_arguments++; } if (num_arguments > *maxargs) *maxargs = num_arguments; if (num_required == num_arguments) { Printf(f, "if (%s == %d) {\n", argc_template_string, num_required); } else { Printf(f, "if ((%s >= %d) && (%s <= %d)) {\n", argc_template_string, num_required, argc_template_string, num_arguments); } if (num_arguments) { Printf(f, "int _v;\n"); } int num_braces = 0; j = 0; Parm *pj = pi; while (pj) { if (checkAttribute(pj, "tmap:in:numinputs", "0")) { pj = Getattr(pj, "tmap:in:next"); continue; } if (j >= num_required) { String *lfmt = ReplaceFormat(fmt, num_arguments); Printf(f, "if (%s <= %d) {\n", argc_template_string, j); Printf(f, Char(lfmt), Getattr(ni, "wrap:name")); Printf(f, "}\n"); Delete(lfmt); } if (print_typecheck(f, (GetFlag(n, "wrap:this") ? j + 1 : j), pj, implicitconvtypecheckoff)) { Printf(f, "if (_v) {\n"); num_braces++; } if (!Getattr(pj, "tmap:in:SWIGTYPE") && Getattr(pj, "tmap:typecheck:SWIGTYPE")) { /* we emit a warning if the argument defines the 'in' typemap, but not the 'typecheck' one */ Swig_warning(WARN_TYPEMAP_TYPECHECK_UNDEF, Getfile(ni), Getline(ni), "Overloaded method %s with no explicit typecheck typemap for arg %d of type '%s'\n", Swig_name_decl(n), j, SwigType_str(Getattr(pj, "type"), 0)); } Parm *pk = Getattr(pj, "tmap:in:next"); if (pk) pj = pk; else pj = nextSibling(pj); j++; } String *lfmt = ReplaceFormat(fmt, num_arguments); Printf(f, Char(lfmt), Getattr(ni, "wrap:name")); Delete(lfmt); /* close braces */ for ( /* empty */ ; num_braces > 0; num_braces--) Printf(f, "}\n"); Printf(f, "}\n"); /* braces closes "if" for this method */ if (implicitconvtypecheckoff) Delattr(ni, "implicitconvtypecheckoff"); } Delete(dispatch); return f; } /* ----------------------------------------------------------------------------- * Swig_overload_check() * ----------------------------------------------------------------------------- */ void Swig_overload_check(Node *n) { Swig_overload_rank(n, false); } swig-4.0.1/Source/Modules/allegrocl.cxx0000644000175000017500000026410213527063513017715 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * allegrocl.cxx * * ALLEGROCL language module for SWIG. * ----------------------------------------------------------------------------- */ #include "swigmod.h" #include "cparse.h" #include // #define ALLEGROCL_DEBUG // #define ALLEGROCL_WRAP_DEBUG // #define ALLEGROCL_TYPE_DEBUG // #define ALLEGROCL_CLASS_DEBUG static const char *usage = "\ Allegro CL Options (available with -allegrocl)\n\ -identifier-converter - \n\ Specifies the type of conversion to do on C identifiers to convert\n\ them to symbols. There are two built-in converters: 'null' and\n\ 'lispify'. The default is 'null'. If you supply a name other\n\ than one of the built-ins, then a function by that name will be\n\ called to convert identifiers to symbols.\n\ -[no]cwrap - Turn on or turn off generation of an intermediate C file when\n\ creating a C interface. By default this is only done for C++ code.\n\ -isolate - Define all SWIG helper functions in a package unique to this\n\ module. Avoids redefinition warnings when loading multiple\n\ SWIGged modules into the same running Allegro CL image.\n\ "; static File *f_cl = 0; String *f_clhead = NewString(""); String *f_clwrap = NewString("(swig-in-package ())\n\n"); static File *f_begin; static File *f_runtime; static File *f_cxx_header = 0; static File *f_cxx_wrapper = 0; static String *module_name = 0; static String *swig_package = 0; static String *identifier_converter = NewString("identifier-convert-null"); static bool CWrap = true; // generate wrapper file for C code by default. most correct. static bool Generate_Wrapper = false; static bool unique_swig_package = false; static SwigType *fwdref_ffi_type = NewString("__SWIGACL_FwdReference"); static String *current_namespace = NewString(""); static String *current_package = NewString(""); static Hash *defined_namespace_packages = NewHash(); static Node *in_class = 0; static Node *first_linked_type = 0; static Hash *defined_foreign_types = NewHash(); static Hash *defined_foreign_ltypes = NewHash(); static String *anon_type_name = NewString("anontype"); static int anon_type_count = 0; // stub String *convert_literal(String *num_param, String *type, bool try_to_split = true); class ALLEGROCL:public Language { public: virtual void main(int argc, char *argv[]); virtual int top(Node *n); virtual int functionWrapper(Node *n); virtual int namespaceDeclaration(Node *n); virtual int constructorHandler(Node *n); virtual int destructorHandler(Node *n); virtual int globalvariableHandler(Node *n); virtual int variableWrapper(Node *n); virtual int constantWrapper(Node *n); virtual int memberfunctionHandler(Node *n); virtual int membervariableHandler(Node *n); virtual int classHandler(Node *n); virtual int emit_one(Node *n); virtual int enumDeclaration(Node *n); virtual int enumvalueDeclaration(Node *n); virtual int typedefHandler(Node *n); virtual int classforwardDeclaration(Node *n); virtual int templateDeclaration(Node *n); virtual int validIdentifier(String *s); private: int emit_defun(Node *n, File *f_cl); int emit_dispatch_defun(Node *n); int emit_buffered_defuns(Node *n); int cClassHandler(Node *n); int cppClassHandler(Node *n); }; static ALLEGROCL *allegrocl = 0; static String *trim(String *str) { char *c = Char(str); while (*c != '\0' && isspace((int) *c)) ++c; String *result = NewString(c); Chop(result); return result; } int is_integer(String *s) { char *c = Char(s); if (c[0] == '#' && (c[1] == 'x' || c[1] == 'o')) c += 2; while (*c) { if (!isdigit(*c)) return 0; c++; } return 1; } String *class_from_class_or_class_ref(String *type) { SwigType *stripped = SwigType_strip_qualifiers(type); if (SwigType_isclass(stripped)) return stripped; if (SwigType_ispointer(stripped) || SwigType_isreference(stripped)) { // Printf(stderr,"It is a pointer/reference. Is it a class?\n"); SwigType_pop(stripped); if (SwigType_isclass(stripped)) { return stripped; } } return 0; } String *lookup_defined_foreign_type(String *k) { #ifdef ALLEGROCL_TYPE_DEBUG Printf(stderr, "Looking up defined type '%s'.\n Found: '%s'\n", k, Getattr(defined_foreign_types, k)); #endif return Getattr(defined_foreign_types, k); } String *listify_namespace(String *namespaze) { if (Len(namespaze) == 0) return NewString("()"); String *result = NewStringf("(\"%s\")", namespaze); Replaceall(result, "::", "\" \""); return result; } String *namespaced_name(Node *n, String *ns = current_namespace) { return NewStringf("%s%s%s", ns, (Len(ns) != 0) ? "::" : "", Getattr(n, "sym:name")); } // "Namespace::Nested::Class2::Baz" -> "Baz" static String *strip_namespaces(String *str) { return Swig_scopename_last(str); } void add_linked_type(Node *n) { #ifdef ALLEGROCL_CLASS_DEBUG Printf(stderr, "Adding linked node of type: %s(%s) %s(%p)\n\n", nodeType(n), Getattr(n, "storage"), Getattr(n, "name"), n); // Swig_print_node(n); #endif if (!first_linked_type) { first_linked_type = n; Setattr(n, "allegrocl:last_linked_type", n); } else { Node *t = Getattr(first_linked_type, "allegrocl:last_linked_type"); Setattr(t, "allegrocl:next_linked_type", n); Setattr(first_linked_type, "allegrocl:last_linked_type", n); } } void replace_linked_type(Node *old, Node *new_node) { Node *prev = Getattr(old, "allegrocl:prev_linked_type"); Setattr(new_node, "allegrocl:next_linked_type", Getattr(old, "allegrocl:next_linked_type")); if (prev) Setattr(prev, "allegrocl:next_linked_type", new_node); Delattr(old, "allegrocl:next_linked_type"); Delattr(old, "allegrocl:prev_linked_type"); // check if we're replacing the first link. if (first_linked_type == old) { first_linked_type = new_node; Setattr(first_linked_type, "allegrocl:last_linked_type", Getattr(old, "allegrocl:last_linked_type")); } // check if we're replacing the last link. if (Getattr(first_linked_type, "allegrocl:last_linked_type") == old) Setattr(first_linked_type, "allegrocl:last_linked_type", new_node); } void insert_linked_type_at(Node *old, Node *new_node, int before = 1) { Node *p = 0; if (!first_linked_type) { add_linked_type(new_node); return; } if (!before) { Setattr(new_node, "allegrocl:next_linked_type", Getattr(old, "allegrocl:next_linked_type")); Setattr(old, "allegrocl:next_linked_type", new_node); if (Getattr(first_linked_type, "allegrocl:last_linked_type") == old) Setattr(first_linked_type, "allegrocl:last_linked_type", new_node); } else { Node *c = first_linked_type; while (c) { if (c == old) { break; } else { p = c; c = Getattr(c, "allegrocl:next_linked_type"); } } if (c == old) { Setattr(new_node, "allegrocl:next_linked_type", c); if (first_linked_type == c) { first_linked_type = new_node; Setattr(first_linked_type, "allegrocl:last_linked_type", Getattr(c, "allegrocl:last_linked_type")); Delattr(c, "allegrocl:last_linked_type"); } if (p) Setattr(p, "allegrocl:next_linked_type", new_node); } } } Node *find_linked_type_by_name(String *name) { Node *p = 0; Node *c = first_linked_type; // Printf(stderr,"in find_linked_type_by_name '%s'...", name); while (c) { String *key = Getattr(c, "name"); if (!Strcmp(key, name)) { break; } else { p = c; c = Getattr(c, "allegrocl:next_linked_type"); } } // Printf(stderr,"exit find_linked_type_by_name.\n"); if (p && c) Setattr(c, "allegrocl:prev_linked_type", p); // Printf(stderr,"find_linked_type_by_name: DONE\n"); return c; } Node *get_primary_synonym_of(Node *n) { Node *p = Getattr(n, "allegrocl:synonym-of"); Node *prim = n; // Printf(stderr, "getting primary synonym of %p\n", n); while (p) { // Printf(stderr, " found one! %p\n", p); prim = p; p = Getattr(p, "allegrocl:synonym-of"); } // Printf(stderr,"get_primary_syn: DONE. returning %s(%p)\n", Getattr(prim,"name"),prim); return prim; } void add_forward_referenced_type(Node *n, int overwrite = 0) { String *k = Getattr(n, "name"); String *name = Getattr(n, "sym:name"); String *ns = listify_namespace(current_namespace); String *val = Getattr(defined_foreign_types, k); if (!val || overwrite) { #ifdef ALLEGROCL_TYPE_DEBUG Printf(stderr, "Adding forward reference for %s (overwrite=%d)\n", k, overwrite); #endif Setattr(defined_foreign_types, Copy(k), NewString("forward-reference")); String *mangled_lname_gen = NewStringf("#.(swig-insert-id \"%s\" %s :type :class)", name, ns); Setattr(defined_foreign_ltypes, Copy(k), mangled_lname_gen); // Printf(f_cl, ";; forward reference stub\n" // "(swig-def-foreign-class \"%s\" (ff:foreign-pointer) (:class ))\n\n" // , name); #ifdef ALLEGROCL_CLASS_DEBUG Printf(stderr, "Linking forward reference type = %s(%p)\n", k, n); #endif add_linked_type(n); } } void add_defined_foreign_type(Node *n, int overwrite = 0, String *k = 0, String *name = 0, String *ns = current_namespace) { String *val; String *ns_list = listify_namespace(ns); String *templated = n ? Getattr(n, "template") : 0; String *cDeclName = n ? Getattr(n, "name") : 0; #ifdef ALLEGROCL_CLASS_DEBUG Printf(stderr, "IN A-D-F-T. (n=%p, ow=%d, k=%s, name=%s, ns=%s\n", n, overwrite, k, name, ns); Printf(stderr, " templated = '%p', classDecl = '%p'\n", templated, cDeclName); #endif if (n) { if (!name) name = Getattr(n, "sym:name"); if (!name) name = strip_namespaces(Getattr(n, "name")); if (templated) { k = namespaced_name(n); } else { String *kind_of_type = Getattr(n, "kind"); /* For typedefs of the form: typedef struct __xxx { ... } xxx; behavior differs between C mode and C++ mode. C Mode: add_defined_foreign_type will be called once via classHandler to define the type for 'struct __xxx' and add the mapping from 'struct __xxx' -> 'xxx' It will also be called once via typedefHandler to add the mapping 'xxx' -> 'xxx' C++ Mode: add_defined_foreign_type will be called once via classHandler to define the type for 'xxx'. it also adds the mapping from 'xxx' -> 'xxx' and also for 'struct xxx' -> 'xxx' In typedefHandler, we again try to add the mapping from 'xxx' -> 'xxx', which already exists. This second mapping is ignored. Both modes: All references to this typedef'd struct will appear in generated lisp code as an objectd of type 'xxx'. For non-typedef'd structs, the classHand mapping will be struct __xxx -> (swig-insert-id "__xxx") */ // Swig_print_node(n); String *unnamed = Getattr(n, "unnamed"); if (kind_of_type && (!Strcmp(kind_of_type, "struct") || !Strcmp(kind_of_type, "union")) && cDeclName && !unnamed) { k = NewStringf("%s %s", kind_of_type, cDeclName); } else { if (!Strcmp(nodeType(n), "enum") && unnamed) { name = NewStringf("%s%d", anon_type_name, anon_type_count++); k = NewStringf("enum %s", name); Setattr(n, "allegrocl:name", name); } else { k = k ? k : Getattr(n, "name"); } } } // Swig_print_node(n); } String *tname = SwigType_istemplate_templateprefix(name); if (tname) { String *temp = strip_namespaces(tname); name = NewStringf("%s%s%s", temp, SwigType_templateargs(name), SwigType_templatesuffix(name)); Delete(temp); Delete(tname); } val = lookup_defined_foreign_type(k); int is_fwd_ref = 0; if (val) is_fwd_ref = !Strcmp(val, "forward-reference"); if (!val || overwrite || is_fwd_ref) { #ifdef ALLEGROCL_CLASS_DEBUG Printf(stderr, "Adding defined type '%s' = '%s' '%s' (overwrite=%d, in-class=%d)\n", k, ns, name, overwrite, in_class); #endif String *mangled_name_gen = NewStringf("#.(swig-insert-id \"%s\" %s :type :type)", name, ns_list); String *mangled_lname_gen = NewStringf("#.(swig-insert-id \"%s\" %s :type :class)", name, ns_list); Setattr(defined_foreign_types, Copy(k), Copy(mangled_name_gen)); Setattr(defined_foreign_ltypes, Copy(k), Copy(mangled_lname_gen)); if (CPlusPlus) { bool cpp_struct = Strstr(k, "struct ") ? true : false; bool cpp_union = Strstr(k, "union ") ? true : false; String *cpp_type = 0; if (cpp_struct) { cpp_type = Copy(k); Replaceall(cpp_type, "struct ", ""); } else if (cpp_union) { cpp_type = Copy(k); Replaceall(cpp_type, "union ", ""); } if (cpp_struct || cpp_union) { #ifdef ALLEGROCL_CLASS_DEBUG Printf(stderr, " Also adding defined type '%s' = '%s' '%s' (overwrite=%d)\n", cpp_type, ns, name, overwrite); #endif Setattr(defined_foreign_types, Copy(cpp_type), Copy(mangled_name_gen)); Setattr(defined_foreign_ltypes, Copy(cpp_type), Copy(mangled_lname_gen)); } } #ifdef ALLEGROCL_CLASS_DEBUG Printf(stderr, "looking to add %s/%s(%p) to linked_type_list...\n", k, name, n); #endif if (is_fwd_ref) { // Printf(stderr,"*** 1\n"); if (n) add_linked_type(n); } else { // Printf(stderr,"*** 1-a\n"); if (SwigType_istemplate(k)) { SwigType *resolved = SwigType_typedef_resolve_all(k); // Printf(stderr,"*** 1-b\n"); Node *match = find_linked_type_by_name(resolved); Node *new_node = 0; // Printf(stderr, "*** temp-1\n"); if (n) { new_node = n; } else { #ifdef ALLEGROCL_CLASS_DEBUG Printf(stderr, "Creating a new templateInst:\n"); Printf(stderr, " name = %s\n", resolved); Printf(stderr, " sym:name = %s\n", name); Printf(stderr, " real-name = %s\n", k); Printf(stderr, " type = %s\n", resolved); Printf(stderr, " ns = %s\n\n", ns); #endif new_node = NewHash(); Setattr(new_node, "nodeType", "templateInst"); Setattr(new_node, "name", Copy(resolved)); Setattr(new_node, "sym:name", Copy(name)); Setattr(new_node, "real-name", Copy(k)); Setattr(new_node, "type", Copy(resolved)); Setattr(new_node, "allegrocl:namespace", ns); Setattr(new_node, "allegrocl:package", ns); } if (!match) { if (!Strcmp(nodeType(new_node), "templateInst") && in_class) { /* this is an implicit template instantiation found while walking a class. need to insert this into the linked_type list before the current class definition */ #ifdef ALLEGROCL_CLASS_DEBUG Printf(stderr, "trying to insert a templateInst before a class\n"); #endif insert_linked_type_at(in_class, new_node); #ifdef ALLEGROCL_CLASS_DEBUG Printf(stderr, "DID IT!\n"); #endif } else { // Printf(stderr,"*** 3\n"); add_linked_type(new_node); } Setattr(new_node, "allegrocl:synonym:is-primary", "1"); } else { // a synonym type was found (held in variable 'match') // Printf(stderr, "setting primary synonym of %p to %p\n", new_node, match); if (new_node == match) Printf(stderr, "Hey-4 * - '%s' is a synonym of itself!\n", Getattr(new_node, "name")); Setattr(new_node, "allegrocl:synonym-of", match); // Printf(stderr,"*** 4\n"); add_linked_type(new_node); } } else { Node *match; if (!Strcmp(nodeType(n), "cdecl") && !Strcmp(Getattr(n, "storage"), "typedef")) { SwigType *type = SwigType_strip_qualifiers(Getattr(n, "type")); #ifdef ALLEGROCL_CLASS_DEBUG Printf(stderr, "Examining typedef '%s' for class references. (%d)\n", type, SwigType_isclass(type)); #endif if (SwigType_isclass(type)) { #ifdef ALLEGROCL_CLASS_DEBUG Printf(stderr, "Found typedef of a class '%s'\n", type); #endif /* For the following parsed expression: typedef struct __xxx { ... } xxx; if n is of kind "class" (defining the class 'struct __xxx' then we add n to the linked type list. if n is "cdecl" node of storage "typedef" (to note that xxx is equivalent to 'struct __xxx' then we don't want to add this node to the linked type list. */ String *defined_type = lookup_defined_foreign_type(type); String *defined_key_type = lookup_defined_foreign_type(k); if ((Strstr(type, "struct ") || Strstr(type, "union ")) && defined_type && !Strcmp(defined_type, defined_key_type)) { // mark as a synonym but don't add to linked_type list // Printf(stderr,"*** 4.8\n"); Setattr(n, "allegrocl:synonym", "1"); } else { SwigType *lookup_type = SwigType_istemplate(type) ? SwigType_typedef_resolve_all(type) : Copy(type); match = find_linked_type_by_name(lookup_type); if (match) { Setattr(n, "allegrocl:synonym", "1"); Setattr(n, "allegrocl:synonym-of", match); Setattr(n, "real-name", Copy(lookup_type)); // Printf(stderr, "*** pre-5: found match of '%s'(%p)\n", Getattr(match,"name"),match); // if(n == match) Printf(stderr, "Hey-5 *** setting synonym of %p to %p\n", n, match); // Printf(stderr,"*** 5\n"); add_linked_type(n); } else { #ifdef ALLEGROCL_CLASS_DEBUG Printf(stderr, "Creating classfoward node for struct stub in typedef.\n"); #endif Node *new_node = NewHash(); String *symname = Copy(type); Replaceall(symname, "struct ", ""); Setattr(new_node, "nodeType", "classforward"); Setattr(new_node, "name", Copy(type)); Setattr(new_node, "sym:name", symname); Setattr(new_node, "allegrocl:namespace", ns); Setattr(new_node, "allegrocl:package", ns); String *mangled_new_name = NewStringf("#.(swig-insert-id \"%s\" %s)", symname, ns_list); String *mangled_new_lname = NewStringf("#.(swig-insert-id \"%s\" %s :type :class)", symname, ns_list); Setattr(defined_foreign_types, Copy(symname), Copy(mangled_new_name)); Setattr(defined_foreign_ltypes, Copy(symname), Copy(mangled_new_lname)); // Printf(stderr,"Weird! Can't find the type!\n"); add_forward_referenced_type(new_node); add_linked_type(new_node); Setattr(n, "allegrocl:synonym", "1"); Setattr(n, "allegrocl:synonym-of", new_node); add_linked_type(n); } Delete(lookup_type); } } else { // check if it's a pointer or reference to a class. // Printf(stderr,"Checking if '%s' is a p. or r. to a class\n", type); String *class_ref = class_from_class_or_class_ref(type); if (class_ref) { match = find_linked_type_by_name(class_ref); Setattr(n, "allegrocl:synonym", "1"); Setattr(n, "allegrocl:synonym-of", match); add_linked_type(n); } } Delete(type); // synonym types have already been added. // Printf(stderr,"*** 10\n"); if (!Getattr(n, "allegrocl:synonym")) add_linked_type(n); } else if (Getattr(n, "template")) { // Printf(stderr, "this is a class template node(%s)\n", nodeType(n)); String *resolved = SwigType_typedef_resolve_all(Getattr(n, "name")); #ifdef ALLEGROCL_CLASS_DEBUG Printf(stderr, " looking up %s for linked type match with %s...\n", Getattr(n, "sym:name"), resolved); #endif match = find_linked_type_by_name(resolved); if (!match) { #ifdef ALLEGROCL_CLASS_DEBUG Printf(stderr, "found no implicit instantiation of %%template node %s(%p)\n", Getattr(n, "name"), n); #endif add_linked_type(n); } else { Node *primary = get_primary_synonym_of(match); Setattr(n, "allegrocl:synonym:is-primary", "1"); Delattr(primary, "allegrocl:synonym:is-primary"); if (n == match) Printf(stderr, "Hey-7 * setting synonym of %p to %p\n (match = %p)", primary, n, match); Setattr(primary, "allegrocl:synonym-of", n); // Printf(stderr,"*** 7\n"); add_linked_type(n); } } else { #ifdef ALLEGROCL_CLASS_DEBUG Printf(stderr, "linking type '%s'(%p)\n", k, n); #endif // Printf(stderr,"*** 8\n"); add_linked_type(n); } } } Delete(mangled_name_gen); Delete(mangled_lname_gen); } else { if (!CPlusPlus || Strcmp(Getattr(n,"kind"),"typedef")) { Swig_warning(WARN_TYPE_REDEFINED, Getfile(n), Getline(n), "Attempting to store a foreign type that exists: %s (%s)\n", k, val); } } Delete(ns_list); #ifdef ALLEGROCL_CLASS_DEBUG Printf(stderr, "OUT A-D-F-T\n"); #endif } void note_implicit_template_instantiation(SwigType *t) { // the namespace of the implicit instantiation is not necessarily // current_namespace. Attempt to cull this from the type. #ifdef ALLEGROCL_CLASS_DEBUG Printf(stderr, "culling namespace of '%s' from '%s'\n", t, SwigType_templateprefix(t)); #endif SwigType *type = Copy(t); SwigType *tok = SwigType_pop(type); String *implicit_ns = SwigType_istemplate(tok) ? Swig_scopename_prefix(SwigType_templateprefix(tok)) : 0; add_defined_foreign_type(0, 0, t, t, implicit_ns ? implicit_ns : current_namespace); Delete(type); } String *get_ffi_type(Node *n, SwigType *ty, const_String_or_char_ptr name) { /* lookup defined foreign type. if it exists, it will return a form suitable for placing into lisp code to generate the def-foreign-type name */ #ifdef ALLEGROCL_TYPE_DEBUG Printf(stderr, "inside g_f_t: looking up '%s' '%s'\n", ty, name); #endif String *found_type = lookup_defined_foreign_type(ty); if (found_type) { #ifdef ALLEGROCL_TYPE_DEBUG Printf(stderr, "found_type '%s'\n", found_type); #endif return (Strcmp(found_type, "forward-reference") ? Copy(found_type) : get_ffi_type(n, fwdref_ffi_type, "")); } else { Node *node = NewHash(); Setattr(node, "type", ty); Setfile(node, Getfile(n)); Setline(node, Getline(n)); const String *tm = Swig_typemap_lookup("ffitype", node, name, 0); Delete(node); if (tm) { #ifdef ALLEGROCL_TYPE_DEBUG Printf(stderr, "g-f-t: found ffitype typemap '%s'\n", tm); #endif return NewString(tm); } if (SwigType_istemplate(ty)) { note_implicit_template_instantiation(ty); return Copy(lookup_defined_foreign_type(ty)); } } return 0; } String *lookup_defined_foreign_ltype(String *l) { #ifdef ALLEGROCL_TYPE_DEBUG Printf(stderr, "Looking up defined ltype '%s'.\n Found: '%s'\n", l, Getattr(defined_foreign_ltypes, l)); #endif return Getattr(defined_foreign_ltypes, l); } /* walk type and return string containing lisp version. recursive. */ String *internal_compose_foreign_type(Node *n, SwigType *ty) { SwigType *tok; String *ffiType = NewString(""); // for a function type, need to walk the parm list. while (Len(ty) != 0) { tok = SwigType_pop(ty); if (SwigType_isfunction(tok)) { // Generate Function wrapper Printf(ffiType, "(:function "); // walk parm list List *pl = SwigType_parmlist(tok); Printf(ffiType, "("); // start parm list for (Iterator i = First(pl); i.item; i = Next(i)) { SwigType *f_arg = SwigType_strip_qualifiers(i.item); Printf(ffiType, "%s ", internal_compose_foreign_type(n, f_arg)); Delete(f_arg); } Printf(ffiType, ")"); // end parm list. // do function return type. Printf(ffiType, " %s)", internal_compose_foreign_type(n, ty)); break; } else if (SwigType_ispointer(tok) || SwigType_isreference(tok)) { Printf(ffiType, "(* %s)", internal_compose_foreign_type(n, ty)); } else if (SwigType_isarray(tok)) { Printf(ffiType, "(:array %s", internal_compose_foreign_type(n, ty)); String *atype = NewString("int"); String *dim = convert_literal(SwigType_array_getdim(tok, 0), atype); Delete(atype); if (is_integer(dim)) { Printf(ffiType, " %s)", dim); } else { Printf(ffiType, " #| %s |#)", SwigType_array_getdim(tok, 0)); } } else if (SwigType_ismemberpointer(tok)) { // temp Printf(ffiType, "(* %s)", internal_compose_foreign_type(n, ty)); } else { String *res = get_ffi_type(n, tok, ""); if (res) { Printf(ffiType, "%s", res); } else { SwigType *resolved_type = SwigType_typedef_resolve_all(tok); if (Cmp(resolved_type, tok) != 0) { res = get_ffi_type(n, resolved_type, ""); if (res) { } else { res = internal_compose_foreign_type(n, resolved_type); } if (res) Printf(ffiType, "%s", res); } if (!res) { String *is_struct = 0; String *tok_remove_text = 0; String *tok_name = Copy(tok); String *tok_key = SwigType_str(tok,0); if ((is_struct = Strstr(tok_key, "struct ")) || Strstr(tok_key, "union ")) { tok_remove_text = NewString(is_struct ? "struct " : "union "); } /* be more permissive of opaque types. This is the swig way. compiles will notice if these types are ultimately not present. */ if(tok_remove_text) { Replaceall(tok_name,tok_remove_text,""); } tok_name = strip_namespaces(tok_name); Delete(tok_remove_text); // Swig_warning(WARN_TYPE_UNDEFINED_CLASS, Getfile(tok), Getline(tok), "Unable to find definition of '%s', assuming forward reference.\n", tok); #ifdef ALLEGROCL_TYPE_DEBUG Printf(stderr, "i-c-f-t: adding forward reference for unknown type '%s'. mapping: %s -> %s\n", tok, tok_key, tok_name); #endif Node *nn = NewHash(); Setattr(nn,"nodeType","classforward"); Setattr(nn,"kind","class"); Setattr(nn,"sym:name",tok_name); Setattr(nn,"name",tok_key); Setattr(nn,"allegrocl:package",current_namespace); add_forward_referenced_type(nn, 0); // tok_name is dangling here, unused. ouch. why? Printf(ffiType, "%s", get_ffi_type(n, tok, ""), tok_name); } } } } return ffiType; } String *compose_foreign_type(Node *n, SwigType *ty, String * /*id*/ = 0) { #ifdef ALLEGROCL_TYPE_DEBUG Printf(stderr, "compose_foreign_type: ENTER (%s)...\n ", ty); // Printf(stderr, "compose_foreign_type: ENTER (%s)(%s)...\n ", ty, (id ? id : 0)); /* String *id_ref = SwigType_str(ty, id); Printf(stderr, "looking up typemap for %s, found '%s'(%p)\n", id_ref, lookup_res ? Getattr(lookup_res, "code") : 0, lookup_res); if (lookup_res) Swig_print_node(lookup_res); */ #endif /* should we allow named lookups in the typemap here? YES! */ /* unnamed lookups should be found in get_ffi_type, called by internal_compose_foreign_type(), below. */ /* I'm reverting to 'no' for the question above. I can no longer remember why I needed it. If a user needed it, I'll find out as soon as they upgrade. Sigh. -mutandiz 9/16/2008. */ /* if(id && lookup_res) { #ifdef ALLEGROCL_TYPE_DEBUG Printf(stderr, "compose_foreign_type: EXIT-1 (%s)\n ", Getattr(lookup_res, "code")); #endif return NewString(Getattr(lookup_res, "code")); } */ SwigType *temp = SwigType_strip_qualifiers(ty); String *res = internal_compose_foreign_type(n, temp); Delete(temp); #ifdef ALLEGROCL_TYPE_DEBUG Printf(stderr, "compose_foreign_type: EXIT (%s)\n ", res); #endif return res; } void update_package_if_needed(Node *n, File *f = f_clwrap) { #ifdef ALLEGROCL_DEBUG Printf(stderr, "update_package: ENTER... \n"); Printf(stderr, " current_package = '%s'\n", current_package); Printf(stderr, " node_package = '%s'\n", Getattr(n, "allegrocl:package")); Printf(stderr, " node(%p) = '%s'\n", n, Getattr(n, "name")); #endif String *node_package = Getattr(n, "allegrocl:package"); if (Strcmp(current_package, node_package)) { String *lispy_package = listify_namespace(node_package); Delete(current_package); current_package = Copy(node_package); Printf(f, "\n(swig-in-package %s)\n", lispy_package); Delete(lispy_package); } #ifdef ALLEGROCL_DEBUG Printf(stderr, "update_package: EXIT.\n"); #endif } static String *mangle_name(Node *n, char const *prefix = "ACL", String *ns = current_namespace) { String *suffix = Getattr(n, "sym:overname"); String *pre_mangled_name = NewStringf("%s_%s__%s%s", prefix, ns, Getattr(n, "sym:name"), suffix); String *mangled_name = Swig_name_mangle(pre_mangled_name); Delete(pre_mangled_name); return mangled_name; } /* utilities */ /* remove a pointer from ffitype. non-destructive. (* :char) ==> :char (* (:array :int 30)) ==> (:array :int 30) */ String *dereference_ffitype(String *ffitype) { char *start; char *temp = Char(ffitype); String *reduced_type = 0; if(temp && temp[0] == '(' && temp[1] == '*') { temp += 2; // walk past start of pointer references while(*temp == ' ') temp++; start = temp; // temp = Char(reduced_type); reduced_type = NewString(start); temp = Char(reduced_type); // walk to end of string. remove closing paren while(*temp != '\0') temp++; *(--temp) = '\0'; } return reduced_type ? reduced_type : Copy(ffitype); } /* returns new string w/ parens stripped */ String *strip_parens(String *string) { string = Copy(string); Replaceall(string, "(", ""); Replaceall(string, ")", ""); return string; } int ALLEGROCL::validIdentifier(String *s) { #ifdef ALLEGROCL_DEBUG Printf(stderr, "validIdentifier %s\n", s); #endif char *c = Char(s); bool got_dot = false; bool only_dots = true; /* Check that s is a valid common lisp symbol. There's a lot of leeway here. A common lisp symbol is essentially any token that's not a number and does not consist of only dots. We are expressly not allowing spaces in identifiers here, but spaces could be added via the identifier converter. */ while (*c) { if (*c == '.') { got_dot = true; } else { only_dots = false; } if (!isgraph(*c)) return 0; c++; } return (got_dot && only_dots) ? 0 : 1; } String *infix_to_prefix(String *val, char split_op, const String *op, String *type) { List *ored = Split(val, split_op, -1); // some float hackery if (((split_op == '+') || (split_op == '-')) && Len(ored) == 2 && (SwigType_type(type) == T_FLOAT || SwigType_type(type) == T_DOUBLE || SwigType_type(type) == T_LONGDOUBLE)) { // check that we're not splitting a float String *possible_result = convert_literal(val, type, false); if (possible_result) return possible_result; } // try parsing the split results. if any part fails, kick out. bool part_failed = false; if (Len(ored) > 1) { String *result = NewStringf("(%s", op); for (Iterator i = First(ored); i.item; i = Next(i)) { String *converted = convert_literal(i.item, type); if (converted) { Printf(result, " %s", converted); Delete(converted); } else { part_failed = true; break; } } Printf(result, ")"); Delete(ored); return part_failed ? 0 : result; } Delete(ored); return 0; } /* To be called by code generating the lisp interface Will return a containing the literal based on type. Will return null if there are problems. try_to_split defaults to true (see stub above). */ String *convert_literal(String *literal, String *type, bool try_to_split) { String *num_param = Copy(literal); String *trimmed = trim(num_param); String *num = strip_parens(trimmed), *res = 0; char *s = Char(num); String *ns = listify_namespace(current_namespace); // very basic parsing of infix expressions. if (try_to_split && SwigType_type(type) != T_STRING) { if ((res = infix_to_prefix(num, '|', "logior", type))) return res; if ((res = infix_to_prefix(num, '&', "logand", type))) return res; if ((res = infix_to_prefix(num, '^', "logxor", type))) return res; if ((res = infix_to_prefix(num, '*', "*", type))) return res; if ((res = infix_to_prefix(num, '/', "/", type))) return res; if ((res = infix_to_prefix(num, '+', "+", type))) return res; if ((res = infix_to_prefix(num, '-', "-", type))) return res; // if ((res = infix_to_prefix(num, '~', "lognot", type))) return res; // if( (res = infix_to_prefix(num, '<<', "ash", type)) ) return res; } // unary complement... if (s[0] == '~' && Len(num) >= 2) { String *id = NewString(++s); String *id_conv = convert_literal(id, type, false); Delete(id); if (id_conv) return NewStringf("(lognot %s)", id_conv); s--; } if (SwigType_type(type) == T_FLOAT || SwigType_type(type) == T_DOUBLE || SwigType_type(type) == T_LONGDOUBLE) { // Use CL syntax for float literals String *oldnum = Copy(num); // careful. may be a float identifier or float constant. char *num_start = Char(num); char *num_end = num_start + strlen(num_start) - 1; bool is_literal = isdigit(*num_start) || (*num_start == '.'); String *lisp_exp = 0; if (is_literal) { if (*num_end == 'f' || *num_end == 'F') { lisp_exp = NewString("f"); } else { lisp_exp = NewString("d"); } if (*num_end == 'l' || *num_end == 'L' || *num_end == 'f' || *num_end == 'F') { *num_end = '\0'; num_end--; } int exponents = Replaceall(num, "e", lisp_exp) + Replaceall(num, "E", lisp_exp); if (!exponents) Printf(num, "%s0", lisp_exp); if (exponents > 1 || (exponents + Replaceall(num, ".", ".") == 0)) { // Printf(stderr, "Can't parse '%s' as type '%s'.\n", oldnum, type); Delete(num); num = 0; } Delete(lisp_exp); } else { String *id = NewStringf("#.(swig-insert-id \"%s\" %s :type :constant)", num, ns); Delete(num); num = id; } Delete(oldnum); Delete(trimmed); Delete(ns); return num; } else if (SwigType_type(type) == T_CHAR) { /* Use CL syntax for character literals */ Delete(num); Delete(trimmed); return NewStringf("#\\%s", num_param); } else if (SwigType_type(type) == T_STRING) { /* Use CL syntax for string literals */ Delete(num); Delete(trimmed); return NewStringf("\"%s\"", num_param); } else if (Len(num) >= 1 && (isdigit(s[0]) || s[0] == '+' || s[0] == '-')) { /* use CL syntax for numbers */ String *oldnum = Copy(num); int usuffixes = Replaceall(num, "u", "") + Replaceall(num, "U", ""); int lsuffixes = Replaceall(num, "l", "") + Replaceall(num, "L", ""); if (usuffixes > 1 || lsuffixes > 1) { Printf(stderr, "Weird!! number %s looks invalid.\n", oldnum); SWIG_exit(EXIT_FAILURE); } s = Char(num); if (s[0] == '0' && Len(num) >= 2) { /*octal or hex */ res = NewStringf("#%c%s", tolower(s[1]) == 'x' ? 'x' : 'o', s + 2); Delete(num); } else { res = num; } Delete(oldnum); Delete(trimmed); return res; } else if (allegrocl->validIdentifier(num)) { /* convert C/C++ identifiers to CL symbols */ res = NewStringf("#.(swig-insert-id \"%s\" %s :type :constant)", num, ns); Delete(num); Delete(trimmed); Delete(ns); return res; } else { Delete(trimmed); return num; } } void emit_stub_class(Node *n) { #ifdef ALLEGROCL_WRAP_DEBUG Printf(stderr, "emit_stub_class: ENTER... '%s'(%p)\n", Getattr(n, "sym:name"), n); Swig_print_node(n); #endif String *name = Getattr(n, "sym:name"); if (Getattr(n, "allegrocl:synonym:already-been-stubbed")) return; String *tname = SwigType_istemplate_templateprefix(name); if (tname) { String *temp = strip_namespaces(tname); name = NewStringf("%s%s%s", temp, SwigType_templateargs(name), SwigType_templatesuffix(name)); Delete(temp); Delete(tname); } else { name = strip_namespaces(name); } // Printf(f_clhead, ";; from emit-stub-class\n"); update_package_if_needed(n, f_clhead); Printf(f_clhead, ";; class template stub.\n"); Printf(f_clhead, "(swig-def-foreign-stub \"%s\")\n", name); Setattr(n, "allegrocl:synonym:already-been-stubbed", "1"); #ifdef ALLEGROCL_WRAP_DEBUG Printf(stderr, "emit_stub_class: EXIT\n"); #endif } void emit_synonym(Node *synonym) { #ifdef ALLEGROCL_WRAP_DEBUG Printf(stderr, "emit_synonym: ENTER... \n"); #endif // Printf(stderr,"in emit_synonym for %s(%p)\n", Getattr(synonym,"name"),synonym); int is_tempInst = !Strcmp(nodeType(synonym), "templateInst"); String *synonym_type; Node *of = get_primary_synonym_of(synonym); if (is_tempInst) { // Printf(stderr, "*** using real-name '%s'\n", Getattr(synonym,"real-name")); synonym_type = Getattr(synonym, "real-name"); } else { // Printf(stderr, "*** using name '%s'\n", Getattr(synonym,"name")); synonym_type = Getattr(synonym, "name"); } String *synonym_ns = listify_namespace(Getattr(synonym, "allegrocl:namespace")); String *syn_ltype, *syn_type, *of_ltype; // String *of_cdeclname = Getattr(of,"allegrocl:classDeclarationName"); String *of_ns = Getattr(of, "allegrocl:namespace"); String *of_ns_list = listify_namespace(of_ns); // String *of_name = of_cdeclname ? NewStringf("struct %s", Getattr(of,"name")) : NewStringf("%s::%s", of_ns, Getattr(of,"sym:name")); // String *of_name = NewStringf("%s::%s", of_ns, Getattr(of,"sym:name")); String *of_name = namespaced_name(of, of_ns); if (CPlusPlus && !Strcmp(nodeType(synonym), "cdecl")) { String *real_name = Getattr(synonym, "real-name"); if (!real_name) real_name = NewString("Unknown"); // TODO: fix syn_ltype = NewStringf("#.(swig-insert-id \"%s\" %s :type :class)", strip_namespaces(real_name), synonym_ns); syn_type = NewStringf("#.(swig-insert-id \"%s\" %s :type :type)", strip_namespaces(real_name), synonym_ns); } else { syn_ltype = lookup_defined_foreign_ltype(synonym_type); syn_type = lookup_defined_foreign_type(synonym_type); } of_ltype = lookup_defined_foreign_ltype(of_name); // Printf(stderr,";; from emit-synonym syn='%s' of_ltype='%s'\n", syn_ltype, of_ltype); if( of_ltype ) Printf(f_clhead, "(swig-def-synonym-type %s\n %s\n %s)\n", syn_ltype, of_ltype, syn_type); Delete(synonym_ns); Delete(of_ns_list); Delete(of_name); #ifdef ALLEGROCL_WRAP_DEBUG Printf(stderr, "emit_synonym: EXIT\n"); #endif } void emit_full_class(Node *n) { #ifdef ALLEGROCL_WRAP_DEBUG Printf(stderr, "emit_full_class: ENTER... \n"); #endif String *name = Getattr(n, "sym:name"); String *kind = Getattr(n, "kind"); // Printf(stderr,"in emit_full_class: '%s'(%p).", Getattr(n,"name"),n); if (Getattr(n, "allegrocl:synonym-of")) { // Printf(stderr,"but it's a synonym of something.\n"); update_package_if_needed(n, f_clhead); emit_synonym(n); return; } // collect superclasses String *bases = Getattr(n, "bases"); String *supers = NewString("("); if (bases) { int first = 1; for (Iterator i = First(bases); i.item; i = Next(i)) { if (!first) Printf(supers, " "); String *s = lookup_defined_foreign_ltype(Getattr(i.item, "name")); // String *name = Getattr(i.item,"name"); if (s) { Printf(supers, "%s", s); } else { #ifdef ALLEGROCL_TYPE_DEBUG Printf(stderr, "emit_templ_inst: did not find ltype for base class %s (%s)", Getattr(i.item, "name"), Getattr(n, "allegrocl:namespace")); #endif } } } else { Printf(supers, "ff:foreign-pointer"); } // check for "feature:aclmixins" and add those as well. Printf(supers, " %s)", Getattr(n,"feature:aclmixins")); // Walk children to generate type definition. String *slotdefs = NewString(" "); #ifdef ALLEGROCL_WRAP_DEBUG Printf(stderr, " walking children...\n"); #endif Node *c; for (c = firstChild(n); c; c = nextSibling(c)) { String *storage_type = Getattr(c, "storage"); if ((!Strcmp(nodeType(c), "cdecl") && (!storage_type || Strcmp(storage_type, "typedef")))) { String *access = Getattr(c, "access"); // hack. why would decl have a value of "variableHandler" and now "0"? String *childDecl = Getattr(c, "decl"); // Printf(stderr,"childDecl = '%s' (%s)\n", childDecl, Getattr(c,"view")); if (!childDecl || !Strcmp(childDecl, "0")) childDecl = NewString(""); SwigType *childType; String *cname; // don't include types for private slots (yet). spr33959. if(access && Strcmp(access,"public")) { childType = NewStringf("int"); cname = NewString("nil"); } else { childType = NewStringf("%s%s", childDecl, Getattr(c, "type")); cname = Copy(Getattr(c, "name")); } if (!SwigType_isfunction(childType)) { // Printf(slotdefs, ";;; member functions don't appear as slots.\n "); // Printf(slotdefs, ";; "); String *ns = listify_namespace(Getattr(n, "allegrocl:package")); #ifdef ALLEGROCL_WRAP_DEBUG Printf(stderr, "slot name = '%s' ns = '%s' class-of '%s' and type = '%s'\n", cname, ns, name, childType); #endif Printf(slotdefs, "(#.(swig-insert-id \"%s\" %s :type :slot :class \"%s\") %s)", cname, ns, name, compose_foreign_type(n, childType)); Delete(ns); if (access && Strcmp(access, "public")) Printf(slotdefs, " ;; %s member", access); Printf(slotdefs, "\n "); } Delete(childType); Delete(cname); } } String *ns_list = listify_namespace(Getattr(n, "allegrocl:namespace")); update_package_if_needed(n, f_clhead); Printf(f_clhead, "(swig-def-foreign-class \"%s\"\n %s\n (:%s\n%s))\n\n", name, supers, kind, slotdefs); Delete(supers); Delete(ns_list); Setattr(n, "allegrocl:synonym:already-been-stubbed", "1"); #ifdef ALLEGROCL_WRAP_DEBUG Printf(stderr, "emit_full_class: EXIT\n"); #endif } void emit_class(Node *n) { #ifdef ALLEGROCL_WRAP_DEBUG Printf(stderr, "emit_class: ENTER... '%s'(%p)\n", Getattr(n, "sym:name"), n); #endif int is_tempInst = !Strcmp(nodeType(n), "templateInst"); String *ns_list = listify_namespace(Getattr(n, "allegrocl:namespace")); String *name = Getattr(n, is_tempInst ? "real-name" : "name"); String *tname = SwigType_istemplate_templateprefix(name); if (tname) { String *temp = strip_namespaces(tname); name = NewStringf("%s%s%s", temp, SwigType_templateargs(name), SwigType_templatesuffix(name)); Delete(temp); Delete(tname); } else { name = strip_namespaces(name); } if (Getattr(n, "allegrocl:synonym:is-primary")) { // Printf(stderr," is primary... "); if (is_tempInst) { emit_stub_class(n); } else { emit_full_class(n); } } else { // Node *primary = Getattr(n,"allegrocl:synonym-of"); Node *primary = get_primary_synonym_of(n); if (primary && (primary != n)) { // Printf(stderr," emitting synonym... "); emit_stub_class(primary); update_package_if_needed(n, f_clhead); emit_synonym(n); } else { emit_full_class(n); } } // Printf(stderr,"DONE\n"); Delete(name); Delete(ns_list); #ifdef ALLEGROCL_WRAP_DEBUG Printf(stderr, "emit_class: EXIT\n"); #endif } void emit_typedef(Node *n) { #ifdef ALLEGROCL_WRAP_DEBUG Printf(stderr, "emit_typedef: ENTER... \n"); #endif String *name; String *sym_name = Getattr(n, "sym:name"); String *type = NewStringf("%s%s", Getattr(n, "decl"), Getattr(n, "type")); String *lisp_type = compose_foreign_type(n, type); Delete(type); Node *in_class = Getattr(n, "allegrocl:typedef:in-class"); // Printf(stderr,"in emit_typedef: '%s'(%p).",Getattr(n,"name"),n); if (Getattr(n, "allegrocl:synonym-of")) { // Printf(stderr," but it's a synonym of something.\n"); emit_synonym(n); return; } if (in_class) { String *class_name = Getattr(in_class, "name"); String *tname = SwigType_istemplate_templateprefix(class_name); if (tname) { String *temp = strip_namespaces(tname); class_name = NewStringf("%s%s%s", temp, SwigType_templateargs(class_name), SwigType_templatesuffix(class_name)); Delete(temp); Delete(tname); } name = NewStringf("%s__%s", class_name, sym_name); Setattr(n, "allegrocl:in-class", in_class); } else { name = sym_name ? Copy(sym_name) : Copy(Getattr(n, "name")); } // leave these in for now. might want to change these to def-foreign-class at some point. // Printf(f_clhead, ";; %s\n", SwigType_typedef_resolve_all(lisp_type)); Printf(f_clhead, "(swig-def-foreign-type \"%s\"\n %s)\n", name, lisp_type); Delete(name); #ifdef ALLEGROCL_WRAP_DEBUG Printf(stderr, "emit_typedef: EXIT\n"); #endif } void emit_enum_type_no_wrap(Node *n) { #ifdef ALLEGROCL_WRAP_DEBUG Printf(stderr, "emit_enum_type_no_wrap: ENTER... \n"); #endif String *unnamed = Getattr(n, "unnamed"); String *name; // SwigType *enumtype; name = unnamed ? Getattr(n, "allegrocl:name") : Getattr(n, "sym:name"); SwigType *tmp = NewStringf("enum %s", unnamed ? unnamed : name); Node *node = NewHash(); Setattr(node, "type", tmp); Setfile(node, Getfile(n)); Setline(node, Getline(n)); const String *enumtype = Swig_typemap_lookup("ffitype", node, "", 0); Delete(node); Delete(tmp); if (name) { String *ns = listify_namespace(current_namespace); Printf(f_clhead, "(swig-def-foreign-type \"%s\" %s)\n", name, enumtype); Delete(ns); // walk children. Node *c; for (c = firstChild(n); c; c = nextSibling(c)) { if (!Getattr(c, "error")) { String *val = Getattr(c, "enumvalue"); if (!val) val = Getattr(c, "enumvalueex"); String *converted_val = convert_literal(val, Getattr(c, "type")); String *valname = Getattr(c, "sym:name"); if (converted_val) { Printf(f_clhead, "(swig-defconstant \"%s\" %s)\n", valname, converted_val); Delete(converted_val); } else { Swig_warning(WARN_LANG_DISCARD_CONST, Getfile(n), Getline(n), "Unable to parse enum value '%s'. Setting to NIL\n", val); Printf(f_clhead, "(swig-defconstant \"%s\" nil #| %s |#)\n", valname, val); } } } } Printf(f_clhead, "\n"); #ifdef ALLEGROCL_WRAP_DEBUG Printf(stderr, "emit_enum_type_no_wrap: EXIT\n"); #endif } void emit_enum_type(Node *n) { #ifdef ALLEGROCL_WRAP_DEBUG Printf(stderr, "emit_enum_type: ENTER... \n"); #endif if (!Generate_Wrapper) { emit_enum_type_no_wrap(n); return; } String *unnamed = Getattr(n, "unnamed"); String *name; // SwigType *enumtype; name = unnamed ? Getattr(n, "allegrocl:name") : Getattr(n, "sym:name"); SwigType *tmp = NewStringf("enum %s", unnamed ? unnamed : name); Node *node = NewHash(); Setattr(node, "type", tmp); Setfile(node, Getfile(n)); Setline(node, Getline(n)); const String *enumtype = Swig_typemap_lookup("ffitype", node, "", 0); Delete(node); Delete(tmp); if (name) { String *ns = listify_namespace(current_namespace); Printf(f_clhead, "(swig-def-foreign-type \"%s\" %s)\n", name, enumtype); Delete(ns); // walk children. Node *c; for(c = firstChild(n); c; c=nextSibling(c)) { String *mangled_name = mangle_name(c, "ACL_ENUM", Getattr(c,"allegrocl:package")); Printf(f_clhead, "(swig-defvar \"%s\" \"%s\" :type :constant :ftype :signed-long)\n", Getattr(c, "sym:name"), mangled_name); Delete(mangled_name); } } #ifdef ALLEGROCL_WRAP_DEBUG Printf(stderr, "emit_enum_type: EXIT\n"); #endif } void emit_default_linked_type(Node *n) { #ifdef ALLEGROCL_WRAP_DEBUG Printf(stderr, "emit_default_linked_type: ENTER... \n"); #endif // catchall for non class types. if (!Strcmp(nodeType(n), "classforward")) { Printf(f_clhead, ";; forward referenced stub.\n"); Printf(f_clhead, "(swig-def-foreign-class \"%s\" (ff:foreign-pointer) (:class ))\n\n", Getattr(n, "sym:name")); } else if (!Strcmp(nodeType(n), "enum")) { emit_enum_type(n); } else { Printf(stderr, "Don't know how to emit node type '%s' named '%s'\n", nodeType(n), Getattr(n, "name")); } #ifdef ALLEGROCL_WRAP_DEBUG Printf(stderr, "emit_default_linked_type: EXIT\n"); #endif } void dump_linked_types(File *f) { Node *n = first_linked_type; int i = 0; while (n) { Printf(f, "%d: (%p) node '%s' name '%s'\n", i++, n, nodeType(n), Getattr(n, "sym:name")); Node *t = Getattr(n, "allegrocl:synonym-of"); if (t) Printf(f, " synonym-of %s(%p)\n", Getattr(t, "name"), t); n = Getattr(n, "allegrocl:next_linked_type"); } } void emit_linked_types() { #ifdef ALLEGROCL_WRAP_DEBUG Printf(stderr, "emit_linked_types: ENTER... "); #endif Node *n = first_linked_type; while (n) { String *node_type = nodeType(n); // Printf(stderr,"emitting node %s(%p) of type %s.", Getattr(n,"name"),n, nodeType(n)); if (!Strcmp(node_type, "class") || !Strcmp(node_type, "templateInst")) { // may need to emit a stub, so it will update the package itself. // Printf(stderr," Passing to emit_class."); emit_class(n); } else if (!Strcmp(nodeType(n), "cdecl")) { // Printf(stderr," Passing to emit_typedef."); update_package_if_needed(n, f_clhead); emit_typedef(n); } else { // Printf(stderr," Passing to default_emitter."); update_package_if_needed(n, f_clhead); emit_default_linked_type(n); } n = Getattr(n, "allegrocl:next_linked_type"); // Printf(stderr,"returned.\n"); } #ifdef ALLEGROCL_WRAP_DEBUG Printf(stderr, "emit_linked_types: EXIT\n"); #endif } extern "C" Language *swig_allegrocl(void) { return (allegrocl = new ALLEGROCL()); } void ALLEGROCL::main(int argc, char *argv[]) { int i; Preprocessor_define("SWIGALLEGROCL 1", 0); SWIG_library_directory("allegrocl"); SWIG_config_file("allegrocl.swg"); for (i = 1; i < argc; i++) { if (!strcmp(argv[i], "-identifier-converter")) { char *conv = argv[i + 1]; if (!conv) Swig_arg_error(); Swig_mark_arg(i); Swig_mark_arg(i + 1); i++; /* check for built-ins */ if (!strcmp(conv, "lispify")) { Delete(identifier_converter); identifier_converter = NewString("identifier-convert-lispify"); } else if (!strcmp(conv, "null")) { Delete(identifier_converter); identifier_converter = NewString("identifier-convert-null"); } else { /* Must be user defined */ Delete(identifier_converter); identifier_converter = NewString(conv); } } else if (!strcmp(argv[i], "-cwrap")) { CWrap = true; Swig_mark_arg(i); } else if (!strcmp(argv[i], "-nocwrap")) { CWrap = false; Swig_mark_arg(i); } else if (!strcmp(argv[i], "-isolate")) { unique_swig_package = true; Swig_mark_arg(i); } if (!strcmp(argv[i], "-help")) { Printf(stdout, "%s\n", usage); } } allow_overloading(); } int ALLEGROCL::top(Node *n) { module_name = Getattr(n, "name"); String *cxx_filename = Getattr(n, "outfile"); String *cl_filename = NewString(""); swig_package = unique_swig_package ? NewStringf("swig.%s", module_name) : NewString("swig"); Printf(cl_filename, "%s%s.cl", SWIG_output_directory(), module_name); f_cl = NewFile(cl_filename, "w", SWIG_output_files()); if (!f_cl) { Printf(stderr, "Unable to open %s for writing\n", cl_filename); SWIG_exit(EXIT_FAILURE); } Generate_Wrapper = CPlusPlus || CWrap; if (Generate_Wrapper) { f_begin = NewFile(cxx_filename, "w", SWIG_output_files()); if (!f_begin) { Delete(f_cl); Printf(stderr, "Unable to open %s for writing\n", cxx_filename); SWIG_exit(EXIT_FAILURE); } } else f_begin = NewString(""); f_runtime = NewString(""); f_cxx_header = f_runtime; f_cxx_wrapper = NewString(""); Swig_register_filebyname("header", f_cxx_header); Swig_register_filebyname("wrapper", f_cxx_wrapper); Swig_register_filebyname("begin", f_begin); Swig_register_filebyname("runtime", f_runtime); Swig_register_filebyname("lisp", f_clwrap); Swig_register_filebyname("lisphead", f_cl); Swig_banner(f_begin); Printf(f_runtime, "\n\n#ifndef SWIGALLEGROCL\n#define SWIGALLEGROCL\n#endif\n\n"); Swig_banner_target_lang(f_cl, ";;"); Printf(f_cl, "\n" "(defpackage :%s\n" " (:use :common-lisp :ff :excl)\n" " (:export #:*swig-identifier-converter* #:*swig-module-name*\n" " #:*void* #:*swig-export-list*))\n" "(in-package :%s)\n\n" "(eval-when (:compile-toplevel :load-toplevel :execute)\n" " (defparameter *swig-identifier-converter* '%s)\n" " (defparameter *swig-module-name* :%s))\n\n", swig_package, swig_package, identifier_converter, module_name); Printf(f_cl, "(defpackage :%s\n" " (:use :common-lisp :%s :ff :excl))\n\n", module_name, swig_package); Printf(f_clhead, "(in-package :%s)\n", module_name); Language::top(n); #ifdef ALLEGROCL_TYPE_DEBUG dump_linked_types(stderr); #endif emit_linked_types(); Printf(f_clwrap, "\n(cl::in-package :%s)\n", swig_package); Printf(f_clwrap, "\n(macrolet ((swig-do-export ()\n"); Printf(f_clwrap, " `(dolist (s ',*swig-export-list*)\n"); Printf(f_clwrap, " (apply #'export s))))\n"); Printf(f_clwrap, " (swig-do-export))\n"); Printf(f_clwrap, "\n(setq *swig-export-list* nil)\n"); Printf(f_cl, "%s\n", f_clhead); Printf(f_cl, "%s\n", f_clwrap); Delete(f_cl); Delete(f_clhead); Delete(f_clwrap); Dump(f_runtime, f_begin); Printf(f_begin, "%s\n", f_cxx_wrapper); Delete(f_runtime); Delete(f_begin); Delete(f_cxx_wrapper); // Swig_print_tree(n); return SWIG_OK; } int any_varargs(ParmList *pl) { Parm *p; for (p = pl; p; p = nextSibling(p)) { if (SwigType_isvarargs(Getattr(p, "type"))) return 1; } return 0; } String *get_lisp_type(Node *n, SwigType *ty, const_String_or_char_ptr name) { Node *node = NewHash(); Setattr(node, "type", ty); Setattr(node, "name", name); Setfile(node, Getfile(n)); Setline(node, Getline(n)); const String *tm = Swig_typemap_lookup("lisptype", node, "", 0); Delete(node); return tm ? NewString(tm) : NewString(""); } Node *parent_node_skipping_extends(Node *n) { Node *result = n; do { result = parentNode(result); } while (Cmp("extend", nodeType(result)) == 0); return result; } /* ----------------------------------------------------------------------------- * emit_num_lin_arguments() * * Calculate the total number of arguments. This function is safe for use * with multi-argument typemaps which may change the number of arguments in * strange ways. * ----------------------------------------------------------------------------- */ int emit_num_lin_arguments(ParmList *parms) { Parm *p = parms; int nargs = 0; while (p) { // Printf(stderr,"enla: '%s' lin='%p' numinputs='%s'\n", Getattr(p,"name"), Getattr(p,"tmap:lin"), Getattr(p,"tmap:lin:numinputs")); if (Getattr(p, "tmap:lin")) { nargs += GetInt(p, "tmap:lin:numinputs"); p = Getattr(p, "tmap:lin:next"); } else { p = nextSibling(p); } } /* DB 04/02/2003: Not sure this is necessary with tmap:in:numinputs */ /* if (parms && (p = Getattr(parms,"emit:varargs"))) { if (!nextSibling(p)) { nargs--; } } */ return nargs; } String *id_converter_type(SwigType const *type) { SwigType *t = Copy(type); String *result = 0; if (SwigType_ispointer(t)) { SwigType_pop(t); String *pointee = id_converter_type(t); result = NewStringf("(:* %s)", pointee); Delete(pointee); } else if (SwigType_ismemberpointer(t)) { String *klass = SwigType_parm(t); SwigType_pop(t); String *member = id_converter_type(t); result = NewStringf("(:member \"%s\" %s)", klass, member); Delete(klass); Delete(member); } else if (SwigType_isreference(t)) { SwigType_pop(t); String *referencee = id_converter_type(t); result = NewStringf("(:& %s)", referencee); Delete(referencee); } else if (SwigType_isarray(t)) { String *size = SwigType_parm(t); SwigType_pop(t); String *element_type = id_converter_type(t); result = NewStringf("(:array %s \"%s\")", element_type, size); Delete(size); Delete(element_type); } else if (SwigType_isfunction(t)) { result = NewString("(:function ("); String *parmlist_str = SwigType_parm(t); List *parms = SwigType_parmlist(parmlist_str); for (Iterator i = First(parms); i.item;) { String *parm = id_converter_type((SwigType *) i.item); Printf(result, "%s", parm); i = Next(i); if (i.item) Printf(result, " "); Delete(parm); } SwigType_pop(t); String *ret = id_converter_type(t); Printf(result, ") %s)", ret); Delete(parmlist_str); Delete(parms); Delete(ret); } else if (SwigType_isqualifier(t)) { result = NewString("(:qualified ("); String *qualifiers_str = Copy(SwigType_parm(t)); // ?! // Replaceall below SEGVs if we don't put the Copy here... SwigType_pop(t); String *qualifiee = id_converter_type(t); Replaceall(qualifiers_str, " ", " :"); if (Len(qualifiers_str) > 0) Printf(result, ":"); Printf(result, "%s) %s)", qualifiers_str, qualifiee); Delete(qualifiers_str); Delete(qualifiee); } else if (SwigType_istemplate(t)) { result = NewStringf("(:template \"%s\")", t); } else { /* if (SwigType_issimple(t)) */ if (Strstr(Char(t), "::")) { result = listify_namespace(t); } else { result = NewStringf("\"%s\"", t); } } Delete(t); return result; } static ParmList *parmlist_with_names(ParmList *pl) { ParmList *pl2 = CopyParmList(pl); for (Parm *p = pl, *p2 = pl2; p2; p = nextSibling(p), p2 = nextSibling(p2)) { if (!Getattr(p2, "name")) Setattr(p2, "name", Getattr(p2, "lname")); Setattr(p2, "name", strip_namespaces(Getattr(p2, "name"))); Setattr(p2, "tmap:ctype", Getattr(p, "tmap:ctype")); String *temp = Getattr(p, "tmap:lin"); if (temp) { Setattr(p2, "tmap:lin", temp); Setattr(p2, "tmap:lin:next", Getattr(p, "tmap:lin:next")); } } return pl2; } static String *parmlist_str_id_converter(ParmList *pl) { String *result = NewString(""); for (Parm *p = pl; p;) { String *lispy_type = id_converter_type(Getattr(p, "type")); Printf(result, "(\"%s\" %s)", Getattr(p, "name"), lispy_type); Delete(lispy_type); if ((p = nextSibling(p))) Printf(result, " "); } return result; } String *collect_others_args(Node *overload) { String *overloaded_from = Getattr(overload, "sym:overloaded"); String *others_args = NewString(""); int first_overload = 1; for (Node *overload2 = overloaded_from; overload2; overload2 = Getattr(overload2, "sym:nextSibling")) { if (overload2 == overload || GetInt(overload2, "overload:ignore")) continue; ParmList *opl = parmlist_with_names(Getattr(overload2, "wrap:parms")); String *args = parmlist_str_id_converter(opl); if (!first_overload) Printf(others_args, "\n "); Printf(others_args, "(%s)", args); Delete(args); Delete(opl); first_overload = 0; } return others_args; } struct IDargs { String *name; String *type; String *klass; String *arity; IDargs():name(0), type(0), klass(0), arity(0) { } String *full_quoted_str() { String *result = no_others_quoted_str(); if (arity) Printf(result, " :arity %s", arity); return result; } String *no_others_quoted_str() { String *result = NewString(""); Printf(result, "\"%s\" :type :%s", name, type); if (klass) Printf(result, " :class \"%s\"", klass); return result; } String *noname_str(bool include_class = true) { String *result = NewString(""); Printf(result, " :type :%s", type); if (klass && include_class) Printf(result, " :class \"%s\"", klass); if (arity) Printf(result, " :arity %s", arity); return result; } String *noname_no_others_str(bool include_class = true) { String *result = NewString(""); Printf(result, " :type :%s", type); if (klass && include_class) Printf(result, " :class \"%s\"", klass); return result; } }; IDargs *id_converter_arguments(Node *n) { IDargs *result = (IDargs *) GetVoid(n, "allegrocl:id-converter-args"); if (!result) result = new IDargs; // Base name if (!result->name) { result->name = Getattr(n, "allegrocl:old-sym:name"); if (!result->name) result->name = Getattr(n, "sym:name"); result->name = Copy(result->name); } // :type if (result->type) Delete(result->type); if (!Getattr(n, "allegrocl:kind")) Setattr(n, "allegrocl:kind", "function"); if (Strstr(Getattr(n, "name"), "operator ")) Replaceall(Getattr(n, "allegrocl:kind"), "function", "operator"); if (Strstr(Getattr(n, "allegrocl:kind"), "variable")) { int name_end = Len(Getattr(n, "sym:name")) - 4; char *str = Char(Getattr(n, "sym:name")); String *get_set = NewString(str + name_end + 1); result->type = Copy(Getattr(n, "allegrocl:kind")); Replaceall(result->type, "variable", ""); Printf(result->type, "%ster", get_set); Delete(get_set); } else { result->type = Copy(Getattr(n, "allegrocl:kind")); } // :class if (Strstr(result->type, "member ")) { Replaceall(result->type, "member ", ""); if (!result->klass) { result->klass = Copy(Getattr(parent_node_skipping_extends(n), "sym:name")); } } // :arity if (Getattr(n, "sym:overloaded")) { if (result->arity) Delete(result->arity); result->arity = NewStringf("%d", // emit_num_arguments(Getattr(n, "wrap:parms"))); emit_num_lin_arguments(Getattr(n, "wrap:parms"))); // Printf(stderr, "got arity of '%s' node '%s' '%p'\n", result->arity, Getattr(n,"name"), Getattr(n,"wrap:parms")); } SetVoid(n, "allegrocl:id-converter-args", result); return result; } int ALLEGROCL::emit_buffered_defuns(Node *n) { Node *overloaded_from = Getattr(n, "sym:overloaded"); String *wrap; if (!overloaded_from) { wrap = Getattr(n, "allegrocl:lisp-wrap"); Printf(f_clwrap, "%s\n", wrap); Delattr(n, "allegrocl:lisp-wrap"); Delete(wrap); } else { for (Node *overload = overloaded_from; overload; overload = Getattr(overload, "sym:nextSibling")) { String *others_args = collect_others_args(overload); wrap = Getattr(overload, "allegrocl:lisp-wrap"); Replaceall(wrap, "@@OTHERS-ARGS-GO-HERE@@", others_args); // IDargs* id_args = id_converter_arguments(overload); // Replaceall(id_args->others_args, "@@OTHERS-ARGS-GO-HERE@@", others_args); if (!GetInt(overload, "overload:ignore")) Printf(f_clwrap, "%s", wrap); Delattr(overload, "allegrocl:lisp-wrap"); Delete(wrap); } } return SWIG_OK; } String *dispatching_type(Node *n, Parm *p) { String *result = 0; String *parsed = Getattr(p, "type"); //Swig_cparse_type(Getattr(p,"tmap:ctype")); String *cl_t = SwigType_typedef_resolve_all(parsed); Node *node = NewHash(); Setattr(node, "type", parsed); Setfile(node, Getfile(n)); Setline(node, Getline(n)); const String *tm = Swig_typemap_lookup("lispclass", node, Getattr(p, "name"), 0); Delete(node); if (tm) { result = Copy(tm); } else { String *lookup_type = class_from_class_or_class_ref(parsed); if (lookup_type) result = lookup_defined_foreign_ltype(lookup_type); } // if (!result && SwigType_ispointer(cl_t)) { // SwigType_pop(cl_t); // result = lookup_defined_foreign_ltype(cl_t); // } if (!result) result = NewStringf("ff:foreign-pointer"); // Delete(parsed); Delete(cl_t); return result; } int ALLEGROCL::emit_dispatch_defun(Node *n) { #ifdef ALLEGROCL_WRAP_DEBUG Printf(stderr, "emit_dispatch_defun: ENTER... "); #endif List *overloads = Swig_overload_rank(n, true); // Printf(stderr,"\ndispatch node=%p\n\n", n); // Swig_print_node(n); Node *overloaded_from = Getattr(n,"sym:overloaded"); bool include_class = Getattr(overloaded_from, "allegrocl:dispatcher:include-class") ? true : false; String *id_args = id_converter_arguments(n)->noname_no_others_str(include_class); Printf(f_clwrap, "(swig-dispatcher (\"%s\" %s :arities (", Getattr(overloaded_from, "allegrocl:dispatcher:name"), id_args); Delattr(overloaded_from, "allegrocl:dispatcher:include-class"); Delattr(overloaded_from, "allegrocl:dispatcher:name"); int last_arity = -1; for (Iterator i = First(overloads); i.item; i = Next(i)) { int arity = emit_num_lin_arguments(Getattr(i.item, "wrap:parms")); if (arity == last_arity) continue; Printf(f_clwrap, "%s%d", last_arity == -1 ? "" : " ", arity); last_arity = arity; } Printf(f_clwrap, ")))\n"); Delete(id_args); Delete(overloads); #ifdef ALLEGROCL_WRAP_DEBUG Printf(stderr, "emit_dispatch_defun: EXIT\n"); #endif return SWIG_OK; } int ALLEGROCL::emit_defun(Node *n, File *fcl) { #ifdef ALLEGROCL_WRAP_DEBUG Printf(stderr, "emit_defun: ENTER... "); #endif // avoid name conflicts between smart pointer wrappers and the wrappers for the // actual class. bool smartmemberwrapper = (!Cmp(Getattr(n, "view"), "memberfunctionHandler") && Getattr(n,"allocate:smartpointeraccess")); #ifdef ALLEGROCL_DEBUG int auto_generated = Cmp(Getattr(n, "view"), "globalfunctionHandler"); Printf(stderr, "%s%sfunction %s%s%s\n", auto_generated ? "> " : "", Getattr(n, "sym:overloaded") ? "overloaded " : "", current_namespace, (current_namespace) > 0 ? "::" : "", Getattr(n, "sym:name")); Printf(stderr, " (view: %s)\n", Getattr(n, "view")); Swig_print_node(n); #endif String *funcname = Getattr(n, "allegrocl:old-sym:name"); if (smartmemberwrapper || !funcname) funcname = Getattr(n, "sym:name"); String *mangled_name = Getattr(n, "wrap:name"); ParmList *pl = parmlist_with_names(Getattr(n, "wrap:parms")); // attach typemap info. Wrapper *wrap = NewWrapper(); Swig_typemap_attach_parms("lin", pl, wrap); // Swig_typemap_attach_parms("ffitype", pl, wrap); Swig_typemap_lookup("lout", n, Swig_cresult_name(), 0); SwigType *result_type = Swig_cparse_type(Getattr(n, "tmap:ctype")); // prime the pump, with support for OUTPUT, INOUT typemaps. Printf(wrap->code, "(cl::let ((ACL_ffresult %s:*void*)\n ACL_result)\n $body\n (cl::if (cl::eq ACL_ffresult %s:*void*)\n (cl::values-list ACL_result)\n (cl::values-list (cl::cons ACL_ffresult ACL_result))))", swig_package, swig_package); Parm *p; int largnum = 0, argnum = 0, first = 1; // int varargs=0; if (Generate_Wrapper) { String *extra_parms = id_converter_arguments(n)->noname_str(smartmemberwrapper ? false : true); Node *overloaded_from = Getattr(n,"sym:overloaded"); if (overloaded_from) { if(!GetFlag(overloaded_from,"allegrocl:dispatcher:name")) { Setattr(overloaded_from,"allegrocl:dispatcher:name",funcname); Setattr(overloaded_from,"allegrocl:dispatcher:include-class", smartmemberwrapper ? 0 : "1"); // Printf(stderr, " set a:d:name='%s', a:d:i-c='%s'\n", Getattr(n,"allegrocl:dispatcher:name"), Getattr(n,"allegrocl:dispatcher:include-class")); } Printf(fcl, "(swig-defmethod (\"%s\" \"%s\"%s)\n", funcname, mangled_name, extra_parms); } else Printf(fcl, "(swig-defun (\"%s\" \"%s\"%s)\n", funcname, mangled_name, extra_parms); Delete(extra_parms); } // Just C else { Printf(fcl, "(swig-defun (\"%s\" \"%s\")\n", funcname, Generate_Wrapper ? mangled_name : funcname); } ////////////////////////////////////// // Lisp foreign call parameter list // ////////////////////////////////////// Printf(fcl, " ("); /* Special cases */ if (ParmList_len(pl) == 0) { Printf(fcl, ":void"); /* } else if (any_varargs(pl)) { Printf(fcl, "#| varargs |#"); varargs=1; */ } else { String *largs = NewString(""); for (p = pl; p; p = nextSibling(p), argnum++, largnum++) { // SwigType *argtype=Getattr(p, "type"); SwigType *argtype = Swig_cparse_type(Getattr(p, "tmap:ctype")); SwigType *parmtype = Getattr(p,"type"); if (!first) { Printf(fcl, "\n "); } /* by default, skip varargs */ if (!SwigType_isvarargs(parmtype)) { String *argname = NewStringf("PARM%d_%s", largnum, Getattr(p, "name")); // Printf(stderr,"%s\n", Getattr(p,"tmap:lin")); String *ffitype = compose_foreign_type(n, argtype, Getattr(p,"name")); String *deref_ffitype = dereference_ffitype(ffitype); String *lisptype = get_lisp_type(n, parmtype, Getattr(p, "name")); #ifdef ALLEGROCL_DEBUG Printf(stderr, "lisptype of '%s' '%s' = '%s'\n", parmtype, Getattr(p, "name"), lisptype); #endif // while we're walking the parameters, generating LIN // wrapper code... Setattr(p, "lname", NewStringf("SWIG_arg%d", largnum)); String *parm_code = Getattr(p, "tmap:lin"); if (parm_code) { String *lname = Getattr(p, "lname"); Printf(largs, " %s", lname); Replaceall(parm_code, "$in_fftype", ffitype); // must come before $in Replaceall(parm_code, "$in", argname); Replaceall(parm_code, "$out", lname); Replaceall(parm_code, "$*in_fftype", deref_ffitype); Replaceall(wrap->code, "$body", parm_code); } String *dispatchtype = Getattr(n, "sym:overloaded") ? dispatching_type(n, p) : NewString(""); // if this parameter has been removed from the C/++ wrapper // it shouldn't be in the lisp wrapper either. if (!checkAttribute(p, "tmap:in:numinputs", "0")) { Printf(fcl, "(%s %s %s %s %s)", // parms in the ff wrapper, but not in the lisp wrapper. (checkAttribute(p, "tmap:lin:numinputs", "0") ? ":p-" : ":p+"), argname, dispatchtype, ffitype, lisptype); first = 0; } Delete(argname); Delete(ffitype); Delete(deref_ffitype); Delete(lisptype); } } Printf(wrap->locals, "%s", largs); } String *lout = Getattr(n, "tmap:lout"); Replaceall(lout, "$owner", GetFlag(n, "feature:new") ? "t" : "nil"); Replaceall(wrap->code, "$body", lout); // $lclass handling. String *lclass = (String *) 0; SwigType *parsed = Swig_cparse_type(Getattr(n, "tmap:ctype")); // SwigType *cl_t = SwigType_typedef_resolve_all(parsed); SwigType *cl_t = class_from_class_or_class_ref(parsed); String *out_ffitype = compose_foreign_type(n, parsed); String *deref_out_ffitype; String *out_temp = Copy(parsed); if (SwigType_ispointer(out_temp)) { SwigType_pop(out_temp); deref_out_ffitype = compose_foreign_type(n, out_temp); } else { deref_out_ffitype = Copy(out_ffitype); } Delete(out_temp); Delete(parsed); if (cl_t) { lclass = lookup_defined_foreign_ltype(cl_t); } int ff_foreign_ptr = 0; if (!lclass) { ff_foreign_ptr = 1; lclass = NewStringf("ff:foreign-pointer"); } #ifdef ALLEGROCL_WRAP_DEBUG Printf(stderr, "for output wrapping %s: type=%s, ctype=%s\n", Getattr(n, "name"), Getattr(n, "type"), Swig_cparse_type(Getattr(n, "tmap:ctype"))); #endif if (lclass) Replaceall(wrap->code, "$lclass", lclass); if (out_ffitype) Replaceall(wrap->code, "$out_fftype", out_ffitype); if (deref_out_ffitype) Replaceall(wrap->code, "$*out_fftype", deref_out_ffitype); Replaceall(wrap->code, "$body", NewStringf("(swig-ff-call%s)", wrap->locals)); String *ldestructor = Copy(lclass); if (ff_foreign_ptr) Replaceall(ldestructor, ldestructor, "cl::identity"); else Replaceall(ldestructor, ":type :class", ":type :destructor"); Replaceall(wrap->code, "$ldestructor", ldestructor); Delete(ldestructor); Printf(fcl, ")\n"); /* finish arg list */ ///////////////////////////////////////////////////// // Lisp foreign call return type and optimizations // ///////////////////////////////////////////////////// Printf(fcl, " (:returning (%s %s)", compose_foreign_type(n, result_type), get_lisp_type(n, Getattr(n, "type"), Swig_cresult_name())); for (Iterator option = First(n); option.item; option = Next(option)) { if (Strncmp("feature:ffargs:", option.key, 15)) continue; String *option_val = option.item; String *option_name = NewString(Char(option.key) + 14); Replaceall(option_name, "_", "-"); // TODO: varargs vs call-direct ? Printf(fcl, "\n %s %s", option_name, option_val); Delete(option_name); } Printf(fcl, ")\n %s)\n\n", wrap->code); // Wrapper_print(wrap, stderr); Delete(result_type); Delete(mangled_name); Delete(pl); DelWrapper(wrap); #ifdef ALLEGROCL_WRAP_DEBUG Printf(stderr, "emit_defun: EXIT\n"); #endif return SWIG_OK; } int ALLEGROCL::functionWrapper(Node *n) { #ifdef ALLEGROCL_DEBUG Printf(stderr, "functionWrapper %s\n", Getattr(n,"name")); #endif ParmList *parms = CopyParmList(Getattr(n, "parms")); Wrapper *f = NewWrapper(); SwigType *t = Getattr(n, "type"); String *name = Getattr(n, "name"); String *raw_return_type = Swig_typemap_lookup("ctype", n, "", 0); SwigType *return_type = Swig_cparse_type(raw_return_type); SwigType *resolved = SwigType_typedef_resolve_all(return_type); int is_void_return = (Cmp(resolved, "void") == 0); Delete(resolved); if (!is_void_return) { String *lresult_init = NewStringf("= (%s)0", SwigType_str(SwigType_strip_qualifiers(return_type),0)); Wrapper_add_localv(f, "lresult", SwigType_lstr(SwigType_ltype(return_type), "lresult"), lresult_init, NIL); Delete(lresult_init); } // Emit all of the local variables for holding arguments. emit_parameter_variables(parms, f); // Attach the standard typemaps Swig_typemap_attach_parms("ctype", parms, f); Swig_typemap_attach_parms("lin", parms, f); emit_attach_parmmaps(parms, f); String *mangled = mangle_name(n); Node *overloaded = Getattr(n, "sym:overloaded"); // Parameter overloading Setattr(n, "wrap:parms", parms); Setattr(n, "wrap:name", mangled); if (overloaded) { // emit warnings when overloading is impossible on the lisp side. // basically Swig_overload_check(n), but with script_lang_wrapping // set to true. Delete(Swig_overload_rank(n, true)); if (Getattr(n, "overload:ignore")) { // if we're the last overload, make sure to force the emit // of the rest of the overloads before we leave. // Printf(stderr, "ignored overload %s(%p)\n", name, Getattr(n, "sym:nextSibling")); if (!Getattr(n, "sym:nextSibling")) { update_package_if_needed(n); emit_buffered_defuns(n); emit_dispatch_defun(n); } DelWrapper(f); return SWIG_OK; } } // Get number of required and total arguments int num_arguments = emit_num_arguments(parms); int gencomma = 0; #ifdef ALLEGROCL_DEBUG Printf(stderr, "Walking parameters for %s '%s'\n", Getattr(n, "allegrocl:kind"), name); #endif // Now walk the function parameter list and generate code to get arguments String *name_and_parms = NewStringf("%s (", mangled); int i; Parm *p; for (i = 0, p = parms; i < num_arguments; i++) { #ifdef ALLEGROCL_DEBUG String *temp1 = Getattr(p,"tmap:in"); String *temp2 = Getattr(p,"tmap:in:numinputs"); Printf(stderr," parm %d: %s, tmap:in='%s', tmap:in:numinputs='%s'\n", i, Getattr(p,"name"), temp1 ? temp1 : "", temp2 ? temp2 : ""); #endif while (p && checkAttribute(p, "tmap:in:numinputs", "0")) { p = Getattr(p, "tmap:in:next"); } if (!p) break; SwigType *c_parm_type = Swig_cparse_type(Getattr(p, "tmap:ctype")); String *arg = NewStringf("l%s", Getattr(p, "lname")); // Emit parameter declaration if (gencomma) Printf(name_and_parms, ", "); String *parm_decl = SwigType_str(c_parm_type, arg); Printf(name_and_parms, "%s", parm_decl); #ifdef ALLEGROCL_DEBUG Printf(stderr, " param: %s\n", parm_decl); #endif Delete(parm_decl); gencomma = 1; // Emit parameter conversion code String *parm_code = Getattr(p, "tmap:in"); //if (!parm_code) { // Swig_warning(...); // p = nextSibling(p); /*} else */ { // canThrow(n, "in", p); Replaceall(parm_code, "$input", arg); Setattr(p, "emit:input", arg); Printf(f->code, "%s\n", parm_code); p = Getattr(p, "tmap:in:next"); } Delete(arg); } Printf(name_and_parms, ")"); #ifdef ALLEGROCL_DEBUG Printf(stderr, " arity = %d(%d)\n", emit_num_lin_arguments(parms), emit_num_lin_arguments(Getattr(n,"wrap:parms"))); #endif // Emit the function definition String *signature = SwigType_str(return_type, name_and_parms); Printf(f->def, "EXPORT %s {", signature); if (CPlusPlus) Printf(f->code, " try {\n"); String *actioncode = emit_action(n); String *tm = Swig_typemap_lookup_out("out", n, Swig_cresult_name(), f, actioncode); if (!is_void_return) { if (tm) { Replaceall(tm, "$result", "lresult"); Printf(f->code, "%s\n", tm); Printf(f->code, " return lresult;\n"); Delete(tm); } else { Swig_warning(WARN_TYPEMAP_OUT_UNDEF, input_file, line_number, "Unable to use return type %s in function %s.\n", SwigType_str(t, 0), name); } } /* See if there is any return cleanup code */ if ((tm = Swig_typemap_lookup("ret", n, Swig_cresult_name(), 0))) { Replaceall(tm, "$source", Swig_cresult_name()); Printf(f->code, "%s\n", tm); Delete(tm); } emit_return_variable(n, t, f); if (CPlusPlus) { Printf(f->code, " } catch (...) {\n"); if (!is_void_return) Printf(f->code, " return (%s)0;\n", SwigType_str(SwigType_strip_qualifiers(return_type),0)); Printf(f->code, " }\n"); } Printf(f->code, "}\n"); /* print this when in C mode? make this a command-line arg? */ if (Generate_Wrapper) Wrapper_print(f, f_cxx_wrapper); String *f_buffer = NewString(""); emit_defun(n, f_buffer); Setattr(n, "allegrocl:lisp-wrap", f_buffer); if (!overloaded || !Getattr(n, "sym:nextSibling")) { update_package_if_needed(n); emit_buffered_defuns(n); // this is the last overload. if (overloaded) { emit_dispatch_defun(n); } } DelWrapper(f); return SWIG_OK; } int ALLEGROCL::namespaceDeclaration(Node *n) { #ifdef ALLEGROCL_DEBUG Printf(stderr, "namespaceDecl: '%s'(%p) (fc=%p)\n", Getattr(n, "sym:name"), n, firstChild(n)); #endif /* don't wrap a namespace with no contents. package bloat. also, test-suite/namespace_class.i claims an unnamed namespace is 'private' and should not be wrapped. Complying... */ if (Getattr(n,"unnamed") || !firstChild(n)) return SWIG_OK; String *name = Getattr(n, "sym:name"); String *old_namespace = current_namespace; if (Cmp(current_namespace, "") == 0) current_namespace = NewStringf("%s", name); else current_namespace = NewStringf("%s::%s", current_namespace, name); if (!GetInt(defined_namespace_packages, current_namespace)) { SetInt(defined_namespace_packages, current_namespace, 1); String *lispy_namespace = listify_namespace(current_namespace); Printf(f_clhead, "(swig-defpackage %s)\n", lispy_namespace); Delete(lispy_namespace); } emit_children(n); Delete(current_namespace); current_namespace = old_namespace; return SWIG_OK; } int ALLEGROCL::constructorHandler(Node *n) { #ifdef ALLEGROCL_DEBUG Printf(stderr, "constructorHandler %s\n", Getattr(n, "name")); #endif // Swig_print_node(n); Setattr(n, "allegrocl:kind", "constructor"); Setattr(n, "allegrocl:old-sym:name", Getattr(n, "sym:name")); // Let SWIG generate a global forwarding function. return Language::constructorHandler(n); } int ALLEGROCL::destructorHandler(Node *n) { #ifdef ALLEGROCL_DEBUG Printf(stderr, "destructorHandler %s\n", Getattr(n, "name")); #endif Setattr(n, "allegrocl:kind", "destructor"); Setattr(n, "allegrocl:old-sym:name", Getattr(n, "sym:name")); // Let SWIG generate a global forwarding function. return Language::destructorHandler(n); } int ALLEGROCL::constantWrapper(Node *n) { #ifdef ALLEGROCL_DEBUG Printf(stderr, "constantWrapper %s\n", Getattr(n, "name")); #endif if (Generate_Wrapper) { // Setattr(n,"wrap:name",mangle_name(n, "ACLPP")); String *const_type = Getattr(n, "type"); String *const_val = 0; String *raw_const = Getattr(n, "value"); if (SwigType_type(const_type) == T_STRING) { const_val = NewStringf("\"%s\"", raw_const); } else if (SwigType_type(const_type) == T_CHAR) { const_val = NewStringf("'%s'", raw_const); } else { const_val = Copy(raw_const); } SwigType_add_qualifier(const_type, "const"); String *ppcname = NewStringf("ACLppc_%s", Getattr(n, "sym:name")); // Printf(f_runtime, "static const %s = %s;\n", SwigType_lstr(const_type, ppcname), const_val); Printf(f_runtime, "static %s = %s;\n", SwigType_lstr(const_type, ppcname), const_val); Setattr(n, "name", ppcname); SetFlag(n, "feature:immutable"); Delete(const_val); return variableWrapper(n); } String *type = Getattr(n, "type"); String *value = Getattr(n, "value"); String *converted_value = convert_literal(value, type); String *name = Getattr(n, "sym:name"); Setattr(n, "allegrocl:kind", "constant"); Setattr(n, "allegrocl:old-sym:name", Getattr(n, "sym:name")); #if 0 Printf(stdout, "constant %s is of type %s. value: %s\n", name, type, converted_value); #endif if (converted_value) { Printf(f_clwrap, "(swig-defconstant \"%s\" %s)\n", name, converted_value); } else { Swig_warning(WARN_LANG_DISCARD_CONST, Getfile(n), Getline(n), "Unable to parse constant value '%s'. Setting to NIL\n", value); Printf(f_clwrap, "(swig-defconstant \"%s\" nil #| %s |#)\n", name, value); } Delete(converted_value); return SWIG_OK; } int ALLEGROCL::globalvariableHandler(Node *n) { #ifdef ALLEGROCL_DEBUG Printf(stderr, "globalvariableHandler %s\n", Getattr(n, "name")); #endif if (Generate_Wrapper) return Language::globalvariableHandler(n); // String *name = Getattr(n, "name"); SwigType *type = Getattr(n, "type"); SwigType *rtype = SwigType_typedef_resolve_all(type); if (SwigType_isclass(rtype)) { SwigType_add_pointer(type); SwigType_add_pointer(rtype); } Printf(f_clwrap, "(swig-defvar \"%s\" \"%s\" :type %s)\n", Getattr(n, "sym:name"), Getattr(n, "sym:name"), ((SwigType_isconst(type)) ? ":constant" : ":variable")); return SWIG_OK; } int ALLEGROCL::variableWrapper(Node *n) { #ifdef ALLEGROCL_DEBUG Printf(stderr, "variableWrapper %s\n", Getattr(n, "name")); #endif Setattr(n, "allegrocl:kind", "variable"); Setattr(n, "allegrocl:old-sym:name", Getattr(n, "sym:name")); // Let SWIG generate a get/set function pair. if (Generate_Wrapper) return Language::variableWrapper(n); String *name = Getattr(n, "name"); SwigType *type = Getattr(n, "type"); SwigType *ctype; SwigType *rtype = SwigType_typedef_resolve_all(type); String *mangled_name = mangle_name(n); int pointer_added = 0; if (SwigType_isclass(rtype)) { SwigType_add_pointer(type); SwigType_add_pointer(rtype); pointer_added = 1; } ctype = SwigType_str(type, 0); // EXPORT ; // = ; Printf(f_runtime, "EXPORT %s %s;\n%s %s = %s%s;\n", ctype, mangled_name, ctype, mangled_name, (pointer_added ? "&" : ""), name); Printf(f_cl, "(swig-defvar \"%s\" :type %s)\n", mangled_name, ((SwigType_isconst(type)) ? ":constant" : ":variable")); Printf(stderr,"***\n"); Delete(mangled_name); #ifdef ALLEGROCL_DEBUG Printf(stderr, "DONE variable %s\n", Getattr(n, "name")); #endif return SWIG_OK; } int ALLEGROCL::memberfunctionHandler(Node *n) { #ifdef ALLEGROCL_DEBUG Printf(stderr, "memberfunctionHandler %s::%s\n", Getattr(parent_node_skipping_extends(n), "name"), Getattr(n, "name")); Swig_print_node(n); #endif Setattr(n, "allegrocl:kind", "member function"); Setattr(n, "allegrocl:old-sym:name", Getattr(n, "sym:name")); // Let SWIG generate a global forwarding function. return Language::memberfunctionHandler(n); } int ALLEGROCL::membervariableHandler(Node *n) { #ifdef ALLEGROCL_DEBUG Printf(stderr, "membervariableHandler %s::%s\n", Getattr(parent_node_skipping_extends(n), "name"), Getattr(n, "name")); #endif Setattr(n, "allegrocl:kind", "member variable"); Setattr(n, "allegrocl:old-sym:name", Getattr(n, "sym:name")); // Let SWIG generate a get/set function pair. return Language::membervariableHandler(n); } int ALLEGROCL::typedefHandler(Node *n) { #ifdef ALLEGROCL_TYPE_DEBUG Printf(stderr, "In typedefHandler\n"); #endif SwigType *typedef_type = Getattr(n,"type"); // has the side-effect of noting any implicit // template instantiations in type. String *ff_type = compose_foreign_type(n, typedef_type); String *sym_name = Getattr(n, "sym:name"); String *name; String *type_ref; if (in_class) { #ifdef ALLEGROCL_TYPE_DEBUG Printf(stderr, " typedef in class '%s'(%p)\n", Getattr(in_class, "sym:name"), in_class); #endif Setattr(n, "allegrocl:typedef:in-class", in_class); String *class_name = Getattr(in_class, "name"); name = NewStringf("%s__%s", class_name, sym_name); type_ref = NewStringf("%s::%s", class_name, sym_name); Setattr(n, "allegrocl:in-class", in_class); } else { name = Copy(sym_name); type_ref = Copy(Getattr(n, "name")); } Setattr(n, "allegrocl:namespace", current_namespace); String *lookup = lookup_defined_foreign_type(typedef_type); #ifdef ALLEGROCL_TYPE_DEBUG Printf(stderr, "** lookup='%s'(%p), typedef_type='%s', strcmp = '%d' strstr = '%d'\n", lookup, lookup, typedef_type, Strcmp(typedef_type,"void"), Strstr(ff_type,"__SWIGACL_FwdReference")); #endif if(lookup || (!lookup && Strcmp(typedef_type,"void")) || (!lookup && Strstr(ff_type,"__SWIGACL_FwdReference"))) { add_defined_foreign_type(n, 0, type_ref, name); } else { add_forward_referenced_type(n); } #ifdef ALLEGROCL_TYPE_DEBUG Printf(stderr, "Out typedefHandler\n"); #endif Delete(ff_type); return SWIG_OK; } // forward referenced classes are added specially to defined_foreign_types int ALLEGROCL::classforwardDeclaration(Node *n) { #ifdef ALLEGROCL_DEBUG Printf(stderr, "classforwardDeclaration %s\n", Getattr(n, "name")); #endif add_forward_referenced_type(n); return SWIG_OK; } int ALLEGROCL::classHandler(Node *n) { #ifdef ALLEGROCL_DEBUG Printf(stderr, "classHandler %s::%s\n", current_namespace, Getattr(n, "sym:name")); #endif int result; if (Generate_Wrapper) result = cppClassHandler(n); else result = cClassHandler(n); return result; } int ALLEGROCL::cClassHandler(Node *n) { #ifdef ALLEGROCL_TYPE_DEBUG Printf(stderr, "In cClassHandler\n"); #endif /* Add this structure to the known lisp types */ // Printf(stderr, "Adding %s foreign type\n", name); String *ns = listify_namespace(current_namespace); add_defined_foreign_type(n); Delete(ns); #ifdef ALLEGROCL_TYPE_DEBUG Printf(stderr, "Out cClassHandler\n"); #endif return SWIG_OK; } int ALLEGROCL::cppClassHandler(Node *n) { #ifdef ALLEGROCL_DEBUG Printf(stderr, "cppClassHandler %s\n", Getattr(n, "name")); #endif // String *name=Getattr(n, "sym:name"); // String *kind = Getattr(n,"kind"); /* Template instantiation. Careful. SWIG does not create instantiations of templated classes whenever it sees a templated class reference (say, as a return type, or in a parameter list). The %template directive results in a templated class instantiation that will actually be seen by :: classHandler(). In this case, we don't want to error if the type already exists; the point is to force the creation of wrappers for the templated class. */ String *templated = Getattr(n, "template"); String *t_name; // String *ns = listify_namespace(current_namespace); if (templated) { t_name = namespaced_name(n); } else { t_name = Getattr(n, "name"); } Setattr(n, "allegrocl:namespace", current_namespace); /* Add this structure to the known lisp types. Class may contain references to the type currently being defined */ if (!templated || !lookup_defined_foreign_type(t_name)) { #ifdef ALLEGROCL_CLASS_DEBUG Printf(stderr, "Adding %s foreign type\n", Getattr(n, "sym:name")); #endif add_defined_foreign_type(n); } else { #ifdef ALLEGROCL_CLASS_DEBUG Printf(stderr, "cppClassHand: type %s already exists. Assuming %%template instantiation for wrapping purposes.\n", Getattr(n, "sym:name")); #endif add_defined_foreign_type(n, 1); } // Generate slot accessors, constructor, and destructor. Node *prev_class = in_class; in_class = n; Node *c; // walk all member variables. #ifdef ALLEGROCL_CLASS_DEBUG Printf(stderr, " MANUALLY walking class members... \n"); #endif for (c = firstChild(n); c; c = nextSibling(c)) { // ping the types of all children--even protected and private // so their types can be added to the linked_type_list. SwigType *childType = NewStringf("%s%s", Getattr(c, "decl"), Getattr(c, "type")); #ifdef ALLEGROCL_CLASS_DEBUG Printf(stderr, "looking at child '%p' of type '%s' '%d'\n", c, childType, SwigType_isfunction(childType)); // Swig_print_node(c); #endif if (!SwigType_isfunction(childType)) Delete(compose_foreign_type(n, childType)); Delete(childType); } #ifdef ALLEGROCL_CLASS_DEBUG Printf(stderr, " MANUAL walk DONE.\n"); #endif // this will walk all necessary methods. #ifdef ALLEGROCL_CLASS_DEBUG Printf(stderr, " LANGUAGE walk of children...\n"); #endif Language::classHandler(n); #ifdef ALLEGROCL_CLASS_DEBUG Printf(stderr, " LANGUAGE walk DONE\n"); #endif in_class = prev_class; return SWIG_OK; } int ALLEGROCL::emit_one(Node *n) { // When the current package does not correspond with the current // namespace we need to generate an IN-PACKAGE form, unless the // current node is another namespace node. if (Cmp(nodeType(n), "namespace") != 0 && Cmp(current_package, current_namespace) != 0) { String *lispy_namespace = listify_namespace(current_namespace); Printf(f_clwrap, "(swig-in-package %s)\n", lispy_namespace); Delete(lispy_namespace); Delete(current_package); current_package = NewStringf("%s", current_namespace); } Setattr(n, "allegrocl:package", current_package); return Language::emit_one(n); } int ALLEGROCL::enumDeclaration(Node *n) { #ifdef ALLEGROCL_DEBUG Printf(stderr, "enumDeclaration %s\n", Getattr(n, "name")); #endif if (getCurrentClass() && (cplus_mode != PUBLIC)) return SWIG_NOWRAP; if (Getattr(n, "sym:name")) { add_defined_foreign_type(n); } Node *c; for (c = firstChild(n); c; c = nextSibling(c)) { ALLEGROCL::enumvalueDeclaration(c); // since we walk our own children, we need to add // the current package ourselves. Setattr(c, "allegrocl:package", current_package); } return SWIG_OK; } int ALLEGROCL::enumvalueDeclaration(Node *n) { #ifdef ALLEGROCL_DEBUG Printf(stderr, "enumvalueDeclaration %s\n", Getattr(n, "name")); #endif /* print this when in C mode? make this a command-line arg? */ if (Generate_Wrapper) { SwigType *enum_type = Copy(Getattr(n,"type")); String *mangled_name = mangle_name(n, "ACL_ENUM", in_class ? Getattr(in_class,"name") : current_namespace); SwigType_add_qualifier(enum_type,"const"); String *enum_decl = SwigType_str(enum_type, mangled_name); Printf(f_cxx_wrapper, "EXPORT %s;\n", enum_decl); Printf(f_cxx_wrapper, "%s = %s;\n", enum_decl, Getattr(n, "value")); Delete(mangled_name); Delete(enum_type); Delete(enum_decl); } return SWIG_OK; } int ALLEGROCL::templateDeclaration(Node *n) { #ifdef ALLEGROCL_DEBUG Printf(stderr, "templateDeclaration %s\n", Getattr(n, "name")); #endif String *type = Getattr(n, "templatetype"); // Printf(stderr, "tempDecl: %s %s\n", Getattr(n,"name"), // type); // Swig_print_node(n); if (!Strcmp(type, "cdecl")) { SwigType *ty = NewStringf("%s%s", Getattr(n, "decl"), Getattr(n, "type")); Delete(ty); } Delete(type); return SWIG_OK; } swig-4.0.1/Source/Modules/java.cxx0000644000175000017500000056154613527063513016706 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * java.cxx * * Java language module for SWIG. * ----------------------------------------------------------------------------- */ #include "swigmod.h" #include // for INT_MAX #include "cparse.h" #include #include "javadoc.h" /* Hash type used for upcalls from C/C++ */ typedef DOH UpcallData; class JAVA:public Language { static const char *usage; const String *empty_string; const String *public_string; const String *protected_string; Hash *swig_types_hash; File *f_begin; File *f_runtime; File *f_runtime_h; File *f_header; File *f_wrappers; File *f_init; File *f_directors; File *f_directors_h; List *filenames_list; bool proxy_flag; // Flag for generating proxy classes bool nopgcpp_flag; // Flag for suppressing the premature garbage collection prevention parameter bool native_function_flag; // Flag for when wrapping a native function bool enum_constant_flag; // Flag for when wrapping an enum or constant bool static_flag; // Flag for when wrapping a static functions or member variables bool variable_wrapper_flag; // Flag for when wrapping a nonstatic member variable bool wrapping_member_flag; // Flag for when wrapping a member variable/enum/const bool global_variable_flag; // Flag for when wrapping a global variable bool old_variable_names; // Flag for old style variable names in the intermediary class bool member_func_flag; // flag set when wrapping a member function bool doxygen; //flag for converting found doxygen to javadoc bool comment_creation_chatter; //flag for getting information about where comments were created in java.cxx String *imclass_name; // intermediary class name String *module_class_name; // module class name String *constants_interface_name; // constants interface name String *imclass_class_code; // intermediary class code String *proxy_class_def; String *proxy_class_code; String *interface_class_code; // if %feature("interface") was declared for a class, here goes the interface declaration String *module_class_code; String *proxy_class_name; // proxy class name String *full_proxy_class_name;// fully qualified proxy class name when using nspace feature, otherwise same as proxy_class_name String *full_imclass_name; // fully qualified intermediary class name when using nspace feature, otherwise same as imclass_name String *variable_name; //Name of a variable being wrapped String *proxy_class_constants_code; String *module_class_constants_code; String *enum_code; String *package; // Optional package name String *jnipackage; // Package name used in the JNI code String *package_path; // Package name used internally by JNI (slashes) String *imclass_imports; //intermediary class imports from %pragma String *module_imports; //module imports from %pragma String *imclass_baseclass; //inheritance for intermediary class class from %pragma String *imclass_package; //package in which to generate the intermediary class String *module_baseclass; //inheritance for module class from %pragma String *imclass_interfaces; //interfaces for intermediary class class from %pragma String *module_interfaces; //interfaces for module class from %pragma String *imclass_class_modifiers; //class modifiers for intermediary class overridden by %pragma String *module_class_modifiers; //class modifiers for module class overridden by %pragma String *upcasts_code; //C++ casts for inheritance hierarchies C++ code String *imclass_cppcasts_code; //C++ casts up inheritance hierarchies intermediary class code String *imclass_directors; // Intermediate class director code String *destructor_call; //C++ destructor call if any String *destructor_throws_clause; //C++ destructor throws clause if any // Director method stuff: List *dmethods_seq; Hash *dmethods_table; int n_dmethods; int n_directors; int first_class_dmethod; int curr_class_dmethod; int nesting_depth; enum EnumFeature { SimpleEnum, TypeunsafeEnum, TypesafeEnum, ProperEnum }; public: /* ----------------------------------------------------------------------------- * JAVA() * ----------------------------------------------------------------------------- */ JAVA():empty_string(NewString("")), public_string(NewString("public")), protected_string(NewString("protected")), swig_types_hash(NULL), f_begin(NULL), f_runtime(NULL), f_runtime_h(NULL), f_header(NULL), f_wrappers(NULL), f_init(NULL), f_directors(NULL), f_directors_h(NULL), filenames_list(NULL), proxy_flag(true), nopgcpp_flag(false), native_function_flag(false), enum_constant_flag(false), static_flag(false), variable_wrapper_flag(false), wrapping_member_flag(false), global_variable_flag(false), old_variable_names(false), member_func_flag(false), doxygen(false), comment_creation_chatter(false), imclass_name(NULL), module_class_name(NULL), constants_interface_name(NULL), imclass_class_code(NULL), proxy_class_def(NULL), proxy_class_code(NULL), interface_class_code(NULL), module_class_code(NULL), proxy_class_name(NULL), full_proxy_class_name(NULL), full_imclass_name(NULL), variable_name(NULL), proxy_class_constants_code(NULL), module_class_constants_code(NULL), enum_code(NULL), package(NULL), jnipackage(NULL), package_path(NULL), imclass_imports(NULL), module_imports(NULL), imclass_baseclass(NULL), imclass_package(NULL), module_baseclass(NULL), imclass_interfaces(NULL), module_interfaces(NULL), imclass_class_modifiers(NULL), module_class_modifiers(NULL), upcasts_code(NULL), imclass_cppcasts_code(NULL), imclass_directors(NULL), destructor_call(NULL), destructor_throws_clause(NULL), dmethods_seq(NULL), dmethods_table(NULL), n_dmethods(0), n_directors(0), first_class_dmethod(0), curr_class_dmethod(0), nesting_depth(0){ /* for now, multiple inheritance in directors is disabled, this should be easy to implement though */ director_multiple_inheritance = 0; director_language = 1; } ~JAVA() { delete doxygenTranslator; } /* ----------------------------------------------------------------------------- * constructIntermediateClassName() * * Construct the fully qualified name of the intermediate class and set * the full_imclass_name attribute accordingly. * ----------------------------------------------------------------------------- */ void constructIntermediateClassName(Node *n) { String *nspace = Getattr(n, "sym:nspace"); if (imclass_package && package) full_imclass_name = NewStringf("%s.%s.%s", package, imclass_package, imclass_name); else if (package && nspace) full_imclass_name = NewStringf("%s.%s", package, imclass_name); else if (imclass_package) full_imclass_name = NewStringf("%s.%s", imclass_package, imclass_name); else full_imclass_name = NewStringf("%s", imclass_name); if (nspace && !package) { String *name = Getattr(n, "name") ? Getattr(n, "name") : NewString(""); Swig_warning(WARN_JAVA_NSPACE_WITHOUT_PACKAGE, Getfile(n), Getline(n), "The nspace feature is used on '%s' without -package. " "The generated code may not compile as Java does not support types declared in a named package accessing types declared in an unnamed package.\n", name); } } /* ----------------------------------------------------------------------------- * getProxyName() * * Test to see if a type corresponds to something wrapped with a proxy class. * Return NULL if not otherwise the proxy class name, fully qualified with * package name if the nspace feature is used, unless jnidescriptor is true as * the package name is handled differently (unfortunately for legacy reasons). * ----------------------------------------------------------------------------- */ String *getProxyName(SwigType *t, bool jnidescriptor = false) { String *proxyname = NULL; if (proxy_flag) { Node *n = classLookup(t); if (n) { proxyname = Getattr(n, "proxyname"); if (!proxyname || jnidescriptor) { String *nspace = Getattr(n, "sym:nspace"); String *symname = Copy(Getattr(n, "sym:name")); if (symname && !GetFlag(n, "feature:flatnested")) { for (Node *outer_class = Getattr(n, "nested:outer"); outer_class; outer_class = Getattr(outer_class, "nested:outer")) { if (String* name = Getattr(outer_class, "sym:name")) { Push(symname, jnidescriptor ? "$" : "."); Push(symname, name); } else return NULL; } } if (nspace) { if (package && !jnidescriptor) proxyname = NewStringf("%s.%s.%s", package, nspace, symname); else proxyname = NewStringf("%s.%s", nspace, symname); } else { proxyname = Copy(symname); } if (!jnidescriptor) { Setattr(n, "proxyname", proxyname); // Cache it Delete(proxyname); } Delete(symname); } } } return proxyname; } /* ----------------------------------------------------------------------------- * makeValidJniName() * ----------------------------------------------------------------------------- */ String *makeValidJniName(const String *name) { String *valid_jni_name = NewString(name); Replaceall(valid_jni_name, "_", "_1"); return valid_jni_name; } /* ------------------------------------------------------------ * main() * ------------------------------------------------------------ */ virtual void main(int argc, char *argv[]) { SWIG_library_directory("java"); int doxygen_translator_flags = 0; // Look for certain command line options for (int i = 1; i < argc; i++) { if (argv[i]) { if (strcmp(argv[i], "-package") == 0) { if (argv[i + 1]) { package = NewString(""); Printf(package, argv[i + 1]); if (Len(package) == 0) { Delete(package); package = 0; } Swig_mark_arg(i); Swig_mark_arg(i + 1); i++; } else { Swig_arg_error(); } } else if ((strcmp(argv[i], "-shadow") == 0) || ((strcmp(argv[i], "-proxy") == 0))) { Printf(stderr, "Deprecated command line option: %s. Proxy classes are now generated by default.\n", argv[i]); Swig_mark_arg(i); proxy_flag = true; } else if ((strcmp(argv[i], "-doxygen") == 0)) { Swig_mark_arg(i); doxygen = true; scan_doxygen_comments = true; } else if ((strcmp(argv[i], "-debug-doxygen-translator") == 0)) { Swig_mark_arg(i); doxygen_translator_flags |= DoxygenTranslator::debug_translator; } else if ((strcmp(argv[i], "-debug-doxygen-parser") == 0)) { Swig_mark_arg(i); doxygen_translator_flags |= DoxygenTranslator::debug_parser; } else if ((strcmp(argv[i], "-noproxy") == 0)) { Swig_mark_arg(i); proxy_flag = false; } else if (strcmp(argv[i], "-nopgcpp") == 0) { Swig_mark_arg(i); nopgcpp_flag = true; } else if (strcmp(argv[i], "-oldvarnames") == 0) { Swig_mark_arg(i); old_variable_names = true; } else if (strcmp(argv[i], "-jnic") == 0) { Swig_mark_arg(i); Printf(stderr, "Deprecated command line option: -jnic. C JNI calling convention now used when -c++ not specified.\n"); } else if (strcmp(argv[i], "-nofinalize") == 0) { Swig_mark_arg(i); Printf(stderr, "Deprecated command line option: -nofinalize. Use the new javafinalize typemap instead.\n"); } else if (strcmp(argv[i], "-jnicpp") == 0) { Swig_mark_arg(i); Printf(stderr, "Deprecated command line option: -jnicpp. C++ JNI calling convention now used when -c++ specified.\n"); } else if (strcmp(argv[i], "-help") == 0) { Printf(stdout, "%s\n", usage); } } } if (doxygen) doxygenTranslator = new JavaDocConverter(doxygen_translator_flags); // Add a symbol to the parser for conditional compilation Preprocessor_define("SWIGJAVA 1", 0); // Add typemap definitions SWIG_typemap_lang("java"); SWIG_config_file("java.swg"); allow_overloading(); Swig_interface_feature_enable(); } /* --------------------------------------------------------------------- * top() * --------------------------------------------------------------------- */ virtual int top(Node *n) { // Get any options set in the module directive Node *optionsnode = Getattr(Getattr(n, "module"), "options"); if (optionsnode) { if (Getattr(optionsnode, "jniclassname")) imclass_name = Copy(Getattr(optionsnode, "jniclassname")); /* check if directors are enabled for this module. note: this * is a "master" switch, without which no director code will be * emitted. %feature("director") statements are also required * to enable directors for individual classes or methods. * * use %module(directors="1") modulename at the start of the * interface file to enable director generation. */ if (Getattr(optionsnode, "directors")) { allow_directors(); } if (Getattr(optionsnode, "dirprot")) { allow_dirprot(); } allow_allprotected(GetFlag(optionsnode, "allprotected")); } /* Initialize all of the output files */ String *outfile = Getattr(n, "outfile"); String *outfile_h = Getattr(n, "outfile_h"); if (!outfile) { Printf(stderr, "Unable to determine outfile\n"); SWIG_exit(EXIT_FAILURE); } f_begin = NewFile(outfile, "w", SWIG_output_files()); if (!f_begin) { FileErrorDisplay(outfile); SWIG_exit(EXIT_FAILURE); } if (directorsEnabled()) { if (!outfile_h) { Printf(stderr, "Unable to determine outfile_h\n"); SWIG_exit(EXIT_FAILURE); } f_runtime_h = NewFile(outfile_h, "w", SWIG_output_files()); if (!f_runtime_h) { FileErrorDisplay(outfile_h); SWIG_exit(EXIT_FAILURE); } } f_runtime = NewString(""); f_init = NewString(""); f_header = NewString(""); f_wrappers = NewString(""); f_directors_h = NewString(""); f_directors = NewString(""); /* Register file targets with the SWIG file handler */ Swig_register_filebyname("begin", f_begin); Swig_register_filebyname("header", f_header); Swig_register_filebyname("wrapper", f_wrappers); Swig_register_filebyname("runtime", f_runtime); Swig_register_filebyname("init", f_init); Swig_register_filebyname("director", f_directors); Swig_register_filebyname("director_h", f_directors_h); swig_types_hash = NewHash(); filenames_list = NewList(); // Make the intermediary class and module class names. The intermediary class name can be set in the module directive. if (!imclass_name) { imclass_name = NewStringf("%sJNI", Getattr(n, "name")); module_class_name = Copy(Getattr(n, "name")); } else { // Rename the module name if it is the same as intermediary class name - a backwards compatibility solution if (Cmp(imclass_name, Getattr(n, "name")) == 0) module_class_name = NewStringf("%sModule", Getattr(n, "name")); else module_class_name = Copy(Getattr(n, "name")); } constants_interface_name = NewStringf("%sConstants", module_class_name); // module class and intermediary classes are always created if (!addSymbol(imclass_name, n)) return SWIG_ERROR; if (!addSymbol(module_class_name, n)) return SWIG_ERROR; imclass_class_code = NewString(""); proxy_class_def = NewString(""); proxy_class_code = NewString(""); module_class_constants_code = NewString(""); imclass_baseclass = NewString(""); imclass_package = NULL; imclass_interfaces = NewString(""); imclass_class_modifiers = NewString(""); module_class_code = NewString(""); module_baseclass = NewString(""); module_interfaces = NewString(""); module_imports = NewString(""); module_class_modifiers = NewString(""); imclass_imports = NewString(""); imclass_cppcasts_code = NewString(""); imclass_directors = NewString(""); upcasts_code = NewString(""); dmethods_seq = NewList(); dmethods_table = NewHash(); n_dmethods = 0; n_directors = 0; jnipackage = NewString(""); package_path = NewString(""); Swig_banner(f_begin); Printf(f_runtime, "\n\n#ifndef SWIGJAVA\n#define SWIGJAVA\n#endif\n\n"); if (directorsEnabled()) { Printf(f_runtime, "#define SWIG_DIRECTORS\n"); /* Emit initial director header and director code: */ Swig_banner(f_directors_h); Printf(f_directors_h, "\n"); Printf(f_directors_h, "#ifndef SWIG_%s_WRAP_H_\n", module_class_name); Printf(f_directors_h, "#define SWIG_%s_WRAP_H_\n\n", module_class_name); Printf(f_directors, "\n\n"); Printf(f_directors, "/* ---------------------------------------------------\n"); Printf(f_directors, " * C++ director class methods\n"); Printf(f_directors, " * --------------------------------------------------- */\n\n"); if (outfile_h) { String *filename = Swig_file_filename(outfile_h); Printf(f_directors, "#include \"%s\"\n\n", filename); Delete(filename); } } Printf(f_runtime, "\n"); String *wrapper_name = NewString(""); if (package) { String *jniname = makeValidJniName(package); Printv(jnipackage, jniname, NIL); Delete(jniname); Replaceall(jnipackage, ".", "_"); Append(jnipackage, "_"); Printv(package_path, package, NIL); Replaceall(package_path, ".", "/"); } String *jniname = makeValidJniName(imclass_name); Printf(wrapper_name, "Java_%s%s_%%f", jnipackage, jniname); Delete(jniname); Swig_name_register("wrapper", Char(wrapper_name)); if (old_variable_names) { Swig_name_register("set", "set_%n%v"); Swig_name_register("get", "get_%n%v"); } Delete(wrapper_name); Printf(f_wrappers, "\n#ifdef __cplusplus\n"); Printf(f_wrappers, "extern \"C\" {\n"); Printf(f_wrappers, "#endif\n\n"); /* Emit code */ Language::top(n); if (directorsEnabled()) { // Insert director runtime into the f_runtime file (make it occur before %header section) Swig_insert_file("director_common.swg", f_runtime); Swig_insert_file("director.swg", f_runtime); } // Generate the intermediary class { String *filen = NewStringf("%s%s.java", outputDirectory(imclass_package), imclass_name); File *f_im = NewFile(filen, "w", SWIG_output_files()); if (!f_im) { FileErrorDisplay(filen); SWIG_exit(EXIT_FAILURE); } Append(filenames_list, Copy(filen)); Delete(filen); filen = NULL; // Start writing out the intermediary class file emitBanner(f_im); if (imclass_package && package) Printf(f_im, "package %s.%s;", package, imclass_package); else if (imclass_package) Printf(f_im, "package %s;", imclass_package); else if (package) Printf(f_im, "package %s;\n", package); if (imclass_imports) Printf(f_im, "%s\n", imclass_imports); if (Len(imclass_class_modifiers) > 0) Printf(f_im, "%s ", imclass_class_modifiers); Printf(f_im, "%s ", imclass_name); if (imclass_baseclass && *Char(imclass_baseclass)) Printf(f_im, "extends %s ", imclass_baseclass); if (Len(imclass_interfaces) > 0) Printv(f_im, "implements ", imclass_interfaces, " ", NIL); Printf(f_im, "{\n"); // Add the intermediary class methods Replaceall(imclass_class_code, "$module", module_class_name); Replaceall(imclass_class_code, "$imclassname", imclass_name); Printv(f_im, imclass_class_code, NIL); Printv(f_im, imclass_cppcasts_code, NIL); if (Len(imclass_directors) > 0) Printv(f_im, "\n", imclass_directors, NIL); if (n_dmethods > 0) { Putc('\n', f_im); Printf(f_im, " private final static native void swig_module_init();\n"); Printf(f_im, " static {\n"); Printf(f_im, " swig_module_init();\n"); Printf(f_im, " }\n"); } // Finish off the class Printf(f_im, "}\n"); Delete(f_im); } // Generate the Java module class { String *filen = NewStringf("%s%s.java", SWIG_output_directory(), module_class_name); File *f_module = NewFile(filen, "w", SWIG_output_files()); if (!f_module) { FileErrorDisplay(filen); SWIG_exit(EXIT_FAILURE); } Append(filenames_list, Copy(filen)); Delete(filen); filen = NULL; // Start writing out the module class file emitBanner(f_module); if (package) Printf(f_module, "package %s;\n", package); if (module_imports) Printf(f_module, "%s\n", module_imports); if (doxygen && doxygenTranslator->hasDocumentation(n)) { String *doxygen_comments = doxygenTranslator->getDocumentation(n, 0); if (comment_creation_chatter) Printf(f_module, "/* This was generated from top() */\n"); Printv(f_module, Char(doxygen_comments), NIL); Delete(doxygen_comments); } if (Len(module_class_modifiers) > 0) Printf(f_module, "%s ", module_class_modifiers); Printf(f_module, "%s ", module_class_name); if (module_baseclass && *Char(module_baseclass)) Printf(f_module, "extends %s ", module_baseclass); if (Len(module_interfaces) > 0) { if (Len(module_class_constants_code) != 0) Printv(f_module, "implements ", constants_interface_name, ", ", module_interfaces, " ", NIL); else Printv(f_module, "implements ", module_interfaces, " ", NIL); } else { if (Len(module_class_constants_code) != 0) Printv(f_module, "implements ", constants_interface_name, " ", NIL); } Printf(f_module, "{\n"); Replaceall(module_class_code, "$module", module_class_name); Replaceall(module_class_constants_code, "$module", module_class_name); Replaceall(module_class_code, "$imclassname", imclass_name); Replaceall(module_class_constants_code, "$imclassname", imclass_name); // Add the wrapper methods Printv(f_module, module_class_code, NIL); // Finish off the class Printf(f_module, "}\n"); Delete(f_module); } // Generate the Java constants interface if (Len(module_class_constants_code) != 0) { String *filen = NewStringf("%s%s.java", SWIG_output_directory(), constants_interface_name); File *f_module = NewFile(filen, "w", SWIG_output_files()); if (!f_module) { FileErrorDisplay(filen); SWIG_exit(EXIT_FAILURE); } Append(filenames_list, Copy(filen)); Delete(filen); filen = NULL; // Start writing out the Java constants interface file emitBanner(f_module); if (package) Printf(f_module, "package %s;\n", package); if (module_imports) Printf(f_module, "%s\n", module_imports); Printf(f_module, "public interface %s {\n", constants_interface_name); // Write out all the global constants Printv(f_module, module_class_constants_code, NIL); // Finish off the Java interface Printf(f_module, "}\n"); Delete(f_module); } if (upcasts_code) Printv(f_wrappers, upcasts_code, NIL); emitDirectorUpcalls(); Printf(f_wrappers, "#ifdef __cplusplus\n"); Printf(f_wrappers, "}\n"); Printf(f_wrappers, "#endif\n"); // Output a Java type wrapper class for each SWIG type for (Iterator swig_type = First(swig_types_hash); swig_type.key; swig_type = Next(swig_type)) { emitTypeWrapperClass(swig_type.key, swig_type.item); } // Check for overwriting file problems on filesystems that are case insensitive Iterator it1; Iterator it2; for (it1 = First(filenames_list); it1.item; it1 = Next(it1)) { String *item1_lower = Swig_string_lower(it1.item); for (it2 = Next(it1); it2.item; it2 = Next(it2)) { String *item2_lower = Swig_string_lower(it2.item); if (it1.item && it2.item) { if (Strcmp(item1_lower, item2_lower) == 0) { Swig_warning(WARN_LANG_PORTABILITY_FILENAME, input_file, line_number, "Portability warning: File %s will be overwritten by %s on case insensitive filesystems such as " "Windows' FAT32 and NTFS unless the class/module name is renamed\n", it1.item, it2.item); } } Delete(item2_lower); } Delete(item1_lower); } Delete(swig_types_hash); swig_types_hash = NULL; Delete(filenames_list); filenames_list = NULL; Delete(imclass_name); imclass_name = NULL; Delete(imclass_class_code); imclass_class_code = NULL; Delete(proxy_class_def); proxy_class_def = NULL; Delete(proxy_class_code); proxy_class_code = NULL; Delete(module_class_constants_code); module_class_constants_code = NULL; Delete(imclass_baseclass); imclass_baseclass = NULL; Delete(imclass_package); imclass_package = NULL; Delete(imclass_interfaces); imclass_interfaces = NULL; Delete(imclass_class_modifiers); imclass_class_modifiers = NULL; Delete(module_class_name); module_class_name = NULL; Delete(constants_interface_name); constants_interface_name = NULL; Delete(module_class_code); module_class_code = NULL; Delete(module_baseclass); module_baseclass = NULL; Delete(module_interfaces); module_interfaces = NULL; Delete(module_imports); module_imports = NULL; Delete(module_class_modifiers); module_class_modifiers = NULL; Delete(imclass_imports); imclass_imports = NULL; Delete(imclass_cppcasts_code); imclass_cppcasts_code = NULL; Delete(imclass_directors); imclass_directors = NULL; Delete(upcasts_code); upcasts_code = NULL; Delete(package); package = NULL; Delete(jnipackage); jnipackage = NULL; Delete(package_path); package_path = NULL; Delete(dmethods_seq); dmethods_seq = NULL; Delete(dmethods_table); dmethods_table = NULL; n_dmethods = 0; /* Close all of the files */ Dump(f_header, f_runtime); if (directorsEnabled()) { Dump(f_directors, f_runtime); Dump(f_directors_h, f_runtime_h); Printf(f_runtime_h, "\n"); Printf(f_runtime_h, "#endif\n"); Delete(f_runtime_h); f_runtime_h = NULL; Delete(f_directors); f_directors = NULL; Delete(f_directors_h); f_directors_h = NULL; } Dump(f_wrappers, f_runtime); Wrapper_pretty_print(f_init, f_runtime); Delete(f_header); Delete(f_wrappers); Delete(f_init); Dump(f_runtime, f_begin); Delete(f_runtime); Delete(f_begin); return SWIG_OK; } /* ----------------------------------------------------------------------------- * emitBanner() * ----------------------------------------------------------------------------- */ void emitBanner(File *f) { Printf(f, "/* ----------------------------------------------------------------------------\n"); Swig_banner_target_lang(f, " *"); Printf(f, " * ----------------------------------------------------------------------------- */\n\n"); } /*----------------------------------------------------------------------- * Add new director upcall signature *----------------------------------------------------------------------*/ UpcallData *addUpcallMethod(String *imclass_method, String *class_method, String *imclass_desc, String *class_desc, String *decl) { String *key = NewStringf("%s|%s", imclass_method, decl); ++curr_class_dmethod; String *imclass_methodidx = NewStringf("%d", n_dmethods); String *class_methodidx = NewStringf("%d", n_dmethods - first_class_dmethod); n_dmethods++; Hash *new_udata = NewHash(); Append(dmethods_seq, new_udata); Setattr(dmethods_table, key, new_udata); Setattr(new_udata, "method", Copy(class_method)); Setattr(new_udata, "fdesc", Copy(class_desc)); Setattr(new_udata, "imclass_method", Copy(imclass_method)); Setattr(new_udata, "imclass_fdesc", Copy(imclass_desc)); Setattr(new_udata, "imclass_methodidx", imclass_methodidx); Setattr(new_udata, "class_methodidx", class_methodidx); Setattr(new_udata, "decl", Copy(decl)); Delete(key); return new_udata; } /*----------------------------------------------------------------------- * Get director upcall signature *----------------------------------------------------------------------*/ UpcallData *getUpcallMethodData(String *director_class, String *decl) { String *key = NewStringf("%s|%s", director_class, decl); UpcallData *udata = Getattr(dmethods_table, key); Delete(key); return udata; } /* ---------------------------------------------------------------------- * nativeWrapper() * ---------------------------------------------------------------------- */ virtual int nativeWrapper(Node *n) { String *wrapname = Getattr(n, "wrap:name"); if (!addSymbol(wrapname, n, imclass_name)) return SWIG_ERROR; if (Getattr(n, "type")) { Swig_save("nativeWrapper", n, "name", NIL); Setattr(n, "name", wrapname); native_function_flag = true; functionWrapper(n); Swig_restore(n); native_function_flag = false; } else { Swig_error(input_file, line_number, "No return type for %%native method %s.\n", Getattr(n, "wrap:name")); } return SWIG_OK; } /* ---------------------------------------------------------------------- * functionWrapper() * ---------------------------------------------------------------------- */ virtual int functionWrapper(Node *n) { String *symname = Getattr(n, "sym:name"); SwigType *t = Getattr(n, "type"); ParmList *l = Getattr(n, "parms"); String *tm; Parm *p; int i; String *c_return_type = NewString(""); String *im_return_type = NewString(""); String *cleanup = NewString(""); String *outarg = NewString(""); String *body = NewString(""); int num_arguments = 0; int gencomma = 0; bool is_void_return; String *overloaded_name = getOverloadedName(n); String *nondir_args = NewString(""); bool is_destructor = (Cmp(Getattr(n, "nodeType"), "destructor") == 0); if (!Getattr(n, "sym:overloaded")) { if (!addSymbol(symname, n, imclass_name)) return SWIG_ERROR; } /* The rest of this function deals with generating the intermediary class wrapper function (that wraps a c/c++ function) and generating the JNI c code. Each Java wrapper function has a matching JNI c function call. */ // A new wrapper function object Wrapper *f = NewWrapper(); // Make a wrapper name for this function String *jniname = makeValidJniName(overloaded_name); String *wname = Swig_name_wrapper(jniname); Delete(jniname); /* Attach the non-standard typemaps to the parameter list. */ Swig_typemap_attach_parms("jni", l, f); Swig_typemap_attach_parms("jtype", l, f); Swig_typemap_attach_parms("jstype", l, f); /* Get return types */ if ((tm = Swig_typemap_lookup("jni", n, "", 0))) { Printf(c_return_type, "%s", tm); } else { Swig_warning(WARN_JAVA_TYPEMAP_JNI_UNDEF, input_file, line_number, "No jni typemap defined for %s\n", SwigType_str(t, 0)); } if ((tm = Swig_typemap_lookup("jtype", n, "", 0))) { Printf(im_return_type, "%s", tm); } else { Swig_warning(WARN_JAVA_TYPEMAP_JTYPE_UNDEF, input_file, line_number, "No jtype typemap defined for %s\n", SwigType_str(t, 0)); } is_void_return = (Cmp(c_return_type, "void") == 0); if (!is_void_return) Wrapper_add_localv(f, "jresult", c_return_type, "jresult = 0", NIL); Printv(f->def, "SWIGEXPORT ", c_return_type, " JNICALL ", wname, "(JNIEnv *jenv, jclass jcls", NIL); // Usually these function parameters are unused - The code below ensures // that compilers do not issue such a warning if configured to do so. Printv(f->code, " (void)jenv;\n", NIL); Printv(f->code, " (void)jcls;\n", NIL); // Emit all of the local variables for holding arguments. emit_parameter_variables(l, f); /* Attach the standard typemaps */ emit_attach_parmmaps(l, f); // Parameter overloading Setattr(n, "wrap:parms", l); Setattr(n, "wrap:name", wname); // Wrappers not wanted for some methods where the parameters cannot be overloaded in Java if (Getattr(n, "sym:overloaded")) { // Emit warnings for the few cases that can't be overloaded in Java and give up on generating wrapper Swig_overload_check(n); if (Getattr(n, "overload:ignore")) { DelWrapper(f); return SWIG_OK; } } Printf(imclass_class_code, " public final static native %s %s(", im_return_type, overloaded_name); num_arguments = emit_num_arguments(l); // Now walk the function parameter list and generate code to get arguments for (i = 0, p = l; i < num_arguments; i++) { while (checkAttribute(p, "tmap:in:numinputs", "0")) { p = Getattr(p, "tmap:in:next"); } SwigType *pt = Getattr(p, "type"); String *ln = Getattr(p, "lname"); String *im_param_type = NewString(""); String *c_param_type = NewString(""); String *arg = NewString(""); Printf(arg, "j%s", ln); /* Get the JNI C types of the parameter */ if ((tm = Getattr(p, "tmap:jni"))) { Printv(c_param_type, tm, NIL); } else { Swig_warning(WARN_JAVA_TYPEMAP_JNI_UNDEF, input_file, line_number, "No jni typemap defined for %s\n", SwigType_str(pt, 0)); } /* Get the intermediary class parameter types of the parameter */ if ((tm = Getattr(p, "tmap:jtype"))) { Printv(im_param_type, tm, NIL); } else { Swig_warning(WARN_JAVA_TYPEMAP_JTYPE_UNDEF, input_file, line_number, "No jtype typemap defined for %s\n", SwigType_str(pt, 0)); } /* Add parameter to intermediary class method */ if (gencomma) Printf(imclass_class_code, ", "); Printf(imclass_class_code, "%s %s", im_param_type, arg); // Add parameter to C function Printv(f->def, ", ", c_param_type, " ", arg, NIL); ++gencomma; // Premature garbage collection prevention parameter if (!is_destructor) { String *pgc_parameter = prematureGarbageCollectionPreventionParameter(pt, p); if (pgc_parameter) { Printf(imclass_class_code, ", %s %s_", pgc_parameter, arg); Printf(f->def, ", jobject %s_", arg); Printf(f->code, " (void)%s_;\n", arg); } } // Get typemap for this argument if ((tm = Getattr(p, "tmap:in"))) { addThrows(n, "tmap:in", p); Replaceall(tm, "$source", arg); /* deprecated */ Replaceall(tm, "$target", ln); /* deprecated */ Replaceall(tm, "$arg", arg); /* deprecated? */ Replaceall(tm, "$input", arg); Setattr(p, "emit:input", arg); Printf(nondir_args, "%s\n", tm); p = Getattr(p, "tmap:in:next"); } else { Swig_warning(WARN_TYPEMAP_IN_UNDEF, input_file, line_number, "Unable to use type %s as a function argument.\n", SwigType_str(pt, 0)); p = nextSibling(p); } Delete(im_param_type); Delete(c_param_type); Delete(arg); } Printv(f->code, nondir_args, NIL); Delete(nondir_args); /* Insert constraint checking code */ for (p = l; p;) { if ((tm = Getattr(p, "tmap:check"))) { addThrows(n, "tmap:check", p); Replaceall(tm, "$target", Getattr(p, "lname")); /* deprecated */ Replaceall(tm, "$arg", Getattr(p, "emit:input")); /* deprecated? */ Replaceall(tm, "$input", Getattr(p, "emit:input")); Printv(f->code, tm, "\n", NIL); p = Getattr(p, "tmap:check:next"); } else { p = nextSibling(p); } } /* Insert cleanup code */ for (p = l; p;) { if ((tm = Getattr(p, "tmap:freearg"))) { addThrows(n, "tmap:freearg", p); Replaceall(tm, "$source", Getattr(p, "emit:input")); /* deprecated */ Replaceall(tm, "$arg", Getattr(p, "emit:input")); /* deprecated? */ Replaceall(tm, "$input", Getattr(p, "emit:input")); Printv(cleanup, tm, "\n", NIL); p = Getattr(p, "tmap:freearg:next"); } else { p = nextSibling(p); } } /* Insert argument output code */ for (p = l; p;) { if ((tm = Getattr(p, "tmap:argout"))) { addThrows(n, "tmap:argout", p); Replaceall(tm, "$source", Getattr(p, "emit:input")); /* deprecated */ Replaceall(tm, "$target", Getattr(p, "lname")); /* deprecated */ Replaceall(tm, "$arg", Getattr(p, "emit:input")); /* deprecated? */ Replaceall(tm, "$result", "jresult"); Replaceall(tm, "$input", Getattr(p, "emit:input")); Printv(outarg, tm, "\n", NIL); p = Getattr(p, "tmap:argout:next"); } else { p = nextSibling(p); } } // Get any Java exception classes in the throws typemap ParmList *throw_parm_list = NULL; if ((throw_parm_list = Getattr(n, "catchlist"))) { Swig_typemap_attach_parms("throws", throw_parm_list, f); for (p = throw_parm_list; p; p = nextSibling(p)) { if (Getattr(p, "tmap:throws")) { addThrows(n, "tmap:throws", p); } } } // Now write code to make the function call if (!native_function_flag) { Swig_director_emit_dynamic_cast(n, f); String *actioncode = emit_action(n); // Handle exception classes specified in the "except" feature's "throws" attribute addThrows(n, "feature:except", n); /* Return value if necessary */ if ((tm = Swig_typemap_lookup_out("out", n, Swig_cresult_name(), f, actioncode))) { addThrows(n, "tmap:out", n); Replaceall(tm, "$source", Swig_cresult_name()); /* deprecated */ Replaceall(tm, "$target", "jresult"); /* deprecated */ Replaceall(tm, "$result", "jresult"); if (GetFlag(n, "feature:new")) Replaceall(tm, "$owner", "1"); else Replaceall(tm, "$owner", "0"); Printf(f->code, "%s", tm); if (Len(tm)) Printf(f->code, "\n"); } else { Swig_warning(WARN_TYPEMAP_OUT_UNDEF, input_file, line_number, "Unable to use return type %s in function %s.\n", SwigType_str(t, 0), Getattr(n, "name")); } emit_return_variable(n, t, f); } /* Output argument output code */ Printv(f->code, outarg, NIL); /* Output cleanup code */ Printv(f->code, cleanup, NIL); /* Look to see if there is any newfree cleanup code */ if (GetFlag(n, "feature:new")) { if ((tm = Swig_typemap_lookup("newfree", n, Swig_cresult_name(), 0))) { addThrows(n, "tmap:newfree", n); Replaceall(tm, "$source", Swig_cresult_name()); /* deprecated */ Printf(f->code, "%s\n", tm); } } /* See if there is any return cleanup code */ if (!native_function_flag) { if ((tm = Swig_typemap_lookup("ret", n, Swig_cresult_name(), 0))) { addThrows(n, "tmap:ret", n); Replaceall(tm, "$source", Swig_cresult_name()); /* deprecated */ Printf(f->code, "%s\n", tm); } } /* Finish C function and intermediary class function definitions */ Printf(imclass_class_code, ")"); generateThrowsClause(n, imclass_class_code); Printf(imclass_class_code, ";\n"); Printf(f->def, ") {"); if (!is_void_return) Printv(f->code, " return jresult;\n", NIL); Printf(f->code, "}\n"); /* Substitute the cleanup code */ Replaceall(f->code, "$cleanup", cleanup); /* Substitute the function name */ Replaceall(f->code, "$symname", symname); /* Contract macro modification */ Replaceall(f->code, "SWIG_contract_assert(", "SWIG_contract_assert($null, "); if (!is_void_return) Replaceall(f->code, "$null", "0"); else Replaceall(f->code, "$null", ""); /* Dump the function out */ if (!native_function_flag) Wrapper_print(f, f_wrappers); if (!(proxy_flag && is_wrapping_class()) && !enum_constant_flag) { moduleClassFunctionHandler(n); } /* * Generate the proxy class getters/setters for public member variables. * Not for enums and constants. */ if (proxy_flag && wrapping_member_flag && !enum_constant_flag) { // Capitalize the first letter in the variable to create a JavaBean type getter/setter function name bool getter_flag = Cmp(symname, Swig_name_set(getNSpace(), Swig_name_member(0, getClassPrefix(), variable_name))) != 0; String *getter_setter_name = NewString(""); if (!getter_flag) Printf(getter_setter_name, "set"); else Printf(getter_setter_name, "get"); Putc(toupper((int) *Char(variable_name)), getter_setter_name); Printf(getter_setter_name, "%s", Char(variable_name) + 1); Setattr(n, "proxyfuncname", getter_setter_name); Setattr(n, "imfuncname", symname); proxyClassFunctionHandler(n); Delete(getter_setter_name); } Delete(c_return_type); Delete(im_return_type); Delete(cleanup); Delete(outarg); Delete(body); Delete(overloaded_name); DelWrapper(f); return SWIG_OK; } /* ----------------------------------------------------------------------- * variableWrapper() * ----------------------------------------------------------------------- */ virtual int variableWrapper(Node *n) { variable_wrapper_flag = true; Language::variableWrapper(n); /* Default to functions */ variable_wrapper_flag = false; return SWIG_OK; } /* ----------------------------------------------------------------------- * globalvariableHandler() * ------------------------------------------------------------------------ */ virtual int globalvariableHandler(Node *n) { variable_name = Getattr(n, "sym:name"); global_variable_flag = true; int ret = Language::globalvariableHandler(n); global_variable_flag = false; return ret; } String *getCurrentScopeName(String *nspace) { String *scope = 0; if (nspace || getCurrentClass()) { scope = NewString(""); if (nspace) Printf(scope, "%s", nspace); if (Node* cls = getCurrentClass()) { if (Node *outer = Getattr(cls, "nested:outer")) { String *outerClassesPrefix = Copy(Getattr(outer, "sym:name")); for (outer = Getattr(outer, "nested:outer"); outer != 0; outer = Getattr(outer, "nested:outer")) { Push(outerClassesPrefix, "."); Push(outerClassesPrefix, Getattr(outer, "sym:name")); } Printv(scope, nspace ? "." : "", outerClassesPrefix, ".", proxy_class_name, NIL); Delete(outerClassesPrefix); } else Printv(scope, nspace ? "." : "", proxy_class_name, NIL); } } return scope; } /* ---------------------------------------------------------------------- * enumDeclaration() * * C/C++ enums can be mapped in one of 4 ways, depending on the java:enum feature specified: * 1) Simple enums - simple constant within the proxy class or module class * 2) Typeunsafe enums - simple constant in a Java class (class named after the c++ enum name) * 3) Typesafe enum - typesafe enum pattern (class named after the c++ enum name) * 4) Proper enums - proper Java enum * Anonymous enums always default to 1) * ---------------------------------------------------------------------- */ virtual int enumDeclaration(Node *n) { if (!ImportMode) { if (getCurrentClass() && (cplus_mode != PUBLIC)) return SWIG_NOWRAP; String *nspace = Getattr(n, "sym:nspace"); // NSpace/getNSpace() only works during Language::enumDeclaration call if (proxy_flag && !is_wrapping_class()) { // Global enums / enums in a namespace assert(!full_imclass_name); constructIntermediateClassName(n); } enum_code = NewString(""); String *symname = Getattr(n, "sym:name"); String *constants_code = (proxy_flag && is_wrapping_class())? proxy_class_constants_code : module_class_constants_code; EnumFeature enum_feature = decodeEnumFeature(n); String *typemap_lookup_type = Getattr(n, "name"); if ((enum_feature != SimpleEnum) && symname && typemap_lookup_type) { // Wrap (non-anonymous) C/C++ enum within a typesafe, typeunsafe or proper Java enum if (doxygen && doxygenTranslator->hasDocumentation(n)) { String *doxygen_comments = doxygenTranslator->getDocumentation(n, 0); if (comment_creation_chatter) Printf(enum_code, "/* This was generated from enumDeclaration() */\n"); Printv(enum_code, Char(doxygen_comments), NIL); Delete(doxygen_comments); } String *scope = getCurrentScopeName(nspace); if (!addSymbol(symname, n, scope)) return SWIG_ERROR; // Pure Java baseclass and interfaces const String *pure_baseclass = typemapLookup(n, "javabase", typemap_lookup_type, WARN_NONE); const String *pure_interfaces = typemapLookup(n, "javainterfaces", typemap_lookup_type, WARN_NONE); // Emit the enum Printv(enum_code, typemapLookup(n, "javaclassmodifiers", typemap_lookup_type, WARN_JAVA_TYPEMAP_CLASSMOD_UNDEF), // Class modifiers (enum modifiers really) " ", symname, *Char(pure_baseclass) ? // Bases " extends " : "", pure_baseclass, *Char(pure_interfaces) ? // Interfaces " implements " : "", pure_interfaces, " {\n", NIL); if (proxy_flag && is_wrapping_class()) Replaceall(enum_code, "$static ", "static "); else Replaceall(enum_code, "$static ", ""); Delete(scope); } else { if (symname && !Getattr(n, "unnamedinstance")) Printf(constants_code, " // %s \n", symname); // Translate and write javadoc comment for the enum itself if flagged if (doxygen && doxygenTranslator->hasDocumentation(n)) { String *doxygen_comments = doxygenTranslator->getDocumentation(n, " "); if (comment_creation_chatter) Printf(constants_code, "/* This was generated from enumDeclaration() */\n"); Printf(constants_code, Char(doxygen_comments)); Printf(constants_code, "\n"); Delete(doxygen_comments); } } // Emit each enum item Language::enumDeclaration(n); if ((enum_feature != SimpleEnum) && symname && typemap_lookup_type) { // Wrap (non-anonymous) C/C++ enum within a typesafe, typeunsafe or proper Java enum // Finish the enum declaration // Typemaps are used to generate the enum definition in a similar manner to proxy classes. Printv(enum_code, (enum_feature == ProperEnum) ? ";\n" : "", typemapLookup(n, "javabody", typemap_lookup_type, WARN_JAVA_TYPEMAP_JAVABODY_UNDEF), // main body of class typemapLookup(n, "javacode", typemap_lookup_type, WARN_NONE), // extra Java code "}", NIL); Replaceall(enum_code, "$javaclassname", symname); // Substitute $enumvalues - intended usage is for typesafe enums if (Getattr(n, "enumvalues")) Replaceall(enum_code, "$enumvalues", Getattr(n, "enumvalues")); else Replaceall(enum_code, "$enumvalues", ""); if (proxy_flag && is_wrapping_class()) { // Enums defined within the C++ class are defined within the proxy class // Add extra indentation Replaceall(enum_code, "\n", "\n "); Replaceall(enum_code, " \n", "\n"); if (GetFlag(getCurrentClass(), "feature:interface")) Printv(interface_class_code, " ", enum_code, "\n\n", NIL); else Printv(proxy_class_constants_code, " ", enum_code, "\n\n", NIL); } else { // Global enums are defined in their own file String *output_directory = outputDirectory(nspace); String *filen = NewStringf("%s%s.java", output_directory, symname); File *f_enum = NewFile(filen, "w", SWIG_output_files()); if (!f_enum) { FileErrorDisplay(filen); SWIG_exit(EXIT_FAILURE); } Append(filenames_list, Copy(filen)); Delete(filen); filen = NULL; // Start writing out the enum file emitBanner(f_enum); if (package || nspace) { Printf(f_enum, "package "); if (package) Printv(f_enum, package, nspace ? "." : "", NIL); if (nspace) Printv(f_enum, nspace, NIL); Printf(f_enum, ";\n"); } Printv(f_enum, typemapLookup(n, "javaimports", typemap_lookup_type, WARN_NONE), // Import statements "\n", enum_code, "\n", NIL); Printf(f_enum, "\n"); Delete(f_enum); Delete(output_directory); } } else { // Wrap C++ enum with simple constant Printf(enum_code, "\n"); if (proxy_flag && is_wrapping_class()) Printv(proxy_class_constants_code, enum_code, NIL); else Printv(module_class_constants_code, enum_code, NIL); } Delete(enum_code); enum_code = NULL; if (proxy_flag && !is_wrapping_class()) { Delete(full_imclass_name); full_imclass_name = 0; } } return SWIG_OK; } /* ---------------------------------------------------------------------- * enumvalueDeclaration() * ---------------------------------------------------------------------- */ virtual int enumvalueDeclaration(Node *n) { if (getCurrentClass() && (cplus_mode != PUBLIC)) return SWIG_NOWRAP; Swig_require("enumvalueDeclaration", n, "*name", "?value", NIL); String *symname = Getattr(n, "sym:name"); String *value = Getattr(n, "value"); String *name = Getattr(n, "name"); Node *parent = parentNode(n); int unnamedinstance = GetFlag(parent, "unnamedinstance"); String *parent_name = Getattr(parent, "name"); String *nspace = getNSpace(); String *newsymname = 0; String *tmpValue; // Strange hack from parent method if (value) tmpValue = NewString(value); else tmpValue = NewString(name); // Note that this is used in enumValue() amongst other places Setattr(n, "value", tmpValue); // Deal with enum values that are not int int swigtype = SwigType_type(Getattr(n, "type")); if (swigtype == T_BOOL) { const char *val = Equal(Getattr(n, "enumvalue"), "true") ? "1" : "0"; Setattr(n, "enumvalue", val); } else if (swigtype == T_CHAR) { String *val = NewStringf("'%(escape)s'", Getattr(n, "enumvalue")); Setattr(n, "enumvalue", val); Delete(val); } { EnumFeature enum_feature = decodeEnumFeature(parent); if ((enum_feature == SimpleEnum) && GetFlag(parent, "scopedenum")) { newsymname = Swig_name_member(0, Getattr(parent, "sym:name"), symname); symname = newsymname; } // Add to language symbol table String *scope = 0; if (unnamedinstance || !parent_name || enum_feature == SimpleEnum) { String *enumClassPrefix = getEnumClassPrefix(); if (enumClassPrefix) { scope = NewString(""); if (nspace) Printf(scope, "%s.", nspace); Printf(scope, "%s", enumClassPrefix); } else { scope = Copy(constants_interface_name); } } else { scope = getCurrentScopeName(nspace); if (!scope) scope = Copy(Getattr(parent, "sym:name")); else Printf(scope, ".%s", Getattr(parent, "sym:name")); } if (!addSymbol(symname, n, scope)) return SWIG_ERROR; if ((enum_feature == ProperEnum) && parent_name && !unnamedinstance) { if (!GetFlag(n, "firstenumitem")) Printf(enum_code, ",\n"); } // Translate and write javadoc comment if flagged if (doxygen && doxygenTranslator->hasDocumentation(n)) { String *doxygen_comments = doxygenTranslator->getDocumentation(n, " "); if (comment_creation_chatter) Printf(enum_code, "/* This was generated from enumvalueDeclaration() */\n"); Printv(enum_code, Char(doxygen_comments), NIL); Delete(doxygen_comments); } if ((enum_feature == ProperEnum) && parent_name && !unnamedinstance) { // Wrap (non-anonymous) C/C++ enum with a proper Java enum // Emit the enum item. Printf(enum_code, " %s", symname); if (Getattr(n, "enumvalue")) { String *value = enumValue(n); Printf(enum_code, "(%s)", value); Delete(value); } } else { // Wrap C/C++ enums with constant integers or use the typesafe enum pattern SwigType *typemap_lookup_type = parent_name ? parent_name : NewString("enum "); Setattr(n, "type", typemap_lookup_type); const String *tm = typemapLookup(n, "jstype", typemap_lookup_type, WARN_JAVA_TYPEMAP_JSTYPE_UNDEF); String *return_type = Copy(tm); substituteClassname(typemap_lookup_type, return_type); const String *methodmods = Getattr(n, "feature:java:methodmodifiers"); methodmods = methodmods ? methodmods : (is_public(n) ? public_string : protected_string); if ((enum_feature == TypesafeEnum) && parent_name && !unnamedinstance) { // Wrap (non-anonymous) enum using the typesafe enum pattern if (Getattr(n, "enumvalue")) { String *value = enumValue(n); Printf(enum_code, " %s final static %s %s = new %s(\"%s\", %s);\n", methodmods, return_type, symname, return_type, symname, value); Delete(value); } else { Printf(enum_code, " %s final static %s %s = new %s(\"%s\");\n", methodmods, return_type, symname, return_type, symname); } } else { // Simple integer constants // Note these are always generated for anonymous enums, no matter what enum_feature is specified // Code generated is the same for SimpleEnum and TypeunsafeEnum -> the class it is generated into is determined later String *value = enumValue(n); Printf(enum_code, " %s final static %s %s = %s;\n", methodmods, return_type, symname, value); Delete(value); } Delete(return_type); } // Add the enum value to the comma separated list being constructed in the enum declaration. String *enumvalues = Getattr(parent, "enumvalues"); if (!enumvalues) Setattr(parent, "enumvalues", Copy(symname)); else Printv(enumvalues, ", ", symname, NIL); Delete(scope); } Delete(newsymname); Delete(tmpValue); Swig_restore(n); return SWIG_OK; } /* ----------------------------------------------------------------------- * constantWrapper() * Used for wrapping constants - #define or %constant. * Also for inline initialised const static primitive type member variables (short, int, double, enums etc). * Java static final variables are generated for these. * If the %javaconst(1) feature is used then the C constant value is used to initialise the Java final variable. * If not, a JNI method is generated to get the C constant value for initialisation of the Java final variable. * However, if the %javaconstvalue feature is used, it overrides all other ways to generate the initialisation. * Also note that this method might be called for wrapping enum items (when the enum is using %javaconst(0)). * ------------------------------------------------------------------------ */ virtual int constantWrapper(Node *n) { String *symname = Getattr(n, "sym:name"); SwigType *t = Getattr(n, "type"); SwigType *valuetype = Getattr(n, "valuetype"); ParmList *l = Getattr(n, "parms"); String *tm; String *return_type = NewString(""); String *constants_code = NewString(""); Swig_save("constantWrapper", n, "value", NIL); // Translate and write javadoc comment if flagged if (doxygen && doxygenTranslator->hasDocumentation(n)) { String *doxygen_comments = doxygenTranslator->getDocumentation(n, " "); if (comment_creation_chatter) Printf(constants_code, "/* This was generated from constantWrapper() */\n"); Printv(constants_code, Char(doxygen_comments), NIL); Delete(doxygen_comments); } bool is_enum_item = (Cmp(nodeType(n), "enumitem") == 0); const String *itemname = (proxy_flag && wrapping_member_flag) ? variable_name : symname; if (!is_enum_item) { String *scope = 0; if (proxy_class_name) { String *nspace = getNSpace(); scope = NewString(""); if (nspace) Printf(scope, "%s.", nspace); Printf(scope, "%s", proxy_class_name); } else { scope = Copy(constants_interface_name); } if (!addSymbol(itemname, n, scope)) return SWIG_ERROR; Delete(scope); } // The %javaconst feature determines how the constant value is obtained int const_feature_flag = GetFlag(n, "feature:java:const"); /* Adjust the enum type for the Swig_typemap_lookup. * We want the same jstype typemap for all the enum items so we use the enum type (parent node). */ if (is_enum_item) { t = Getattr(parentNode(n), "enumtype"); Setattr(n, "type", t); } /* Attach the non-standard typemaps to the parameter list. */ Swig_typemap_attach_parms("jstype", l, NULL); /* Get Java return types */ bool classname_substituted_flag = false; if ((tm = Swig_typemap_lookup("jstype", n, "", 0))) { classname_substituted_flag = substituteClassname(t, tm); Printf(return_type, "%s", tm); } else { Swig_warning(WARN_JAVA_TYPEMAP_JSTYPE_UNDEF, input_file, line_number, "No jstype typemap defined for %s\n", SwigType_str(t, 0)); } // Add the stripped quotes back in String *new_value = NewString(""); if (SwigType_type(t) == T_STRING) { Printf(new_value, "\"%s\"", Copy(Getattr(n, "value"))); Setattr(n, "value", new_value); } else if (SwigType_type(t) == T_CHAR) { Printf(new_value, "\'%s\'", Copy(Getattr(n, "value"))); Setattr(n, "value", new_value); } const String *methodmods = Getattr(n, "feature:java:methodmodifiers"); methodmods = methodmods ? methodmods : (is_public(n) ? public_string : protected_string); Printf(constants_code, " %s final static %s %s = ", methodmods, return_type, itemname); // Check for the %javaconstvalue feature String *value = Getattr(n, "feature:java:constvalue"); if (value) { Printf(constants_code, "%s;\n", value); } else if (!const_feature_flag) { // Default enum and constant handling will work with any type of C constant and initialises the Java variable from C through a JNI call. if (classname_substituted_flag) { if (SwigType_isenum(t)) { // This handles wrapping of inline initialised const enum static member variables (not when wrapping enum items - ignored later on) Printf(constants_code, "%s.swigToEnum(%s.%s());\n", return_type, full_imclass_name ? full_imclass_name : imclass_name, Swig_name_get(getNSpace(), symname)); } else { // This handles function pointers using the %constant directive Printf(constants_code, "new %s(%s.%s(), false);\n", return_type, full_imclass_name ? full_imclass_name : imclass_name, Swig_name_get(getNSpace(), symname)); } } else { Printf(constants_code, "%s.%s();\n", full_imclass_name ? full_imclass_name : imclass_name, Swig_name_get(getNSpace(), symname)); } // Each constant and enum value is wrapped with a separate JNI function call SetFlag(n, "feature:immutable"); enum_constant_flag = true; variableWrapper(n); enum_constant_flag = false; } else { // Alternative constant handling will use the C syntax to make a true Java constant and hope that it compiles as Java code if (Getattr(n, "wrappedasconstant")) { if (SwigType_type(valuetype) == T_CHAR) Printf(constants_code, "\'%(escape)s\';\n", Getattr(n, "staticmembervariableHandler:value")); else Printf(constants_code, "%s;\n", Getattr(n, "staticmembervariableHandler:value")); } else { Printf(constants_code, "%s;\n", Getattr(n, "value")); } } // Emit the generated code to appropriate place // Enums only emit the intermediate and JNI methods, so no proxy or module class wrapper methods needed if (!is_enum_item) { if (proxy_flag && wrapping_member_flag) Printv(proxy_class_constants_code, constants_code, NIL); else Printv(module_class_constants_code, constants_code, NIL); } // Cleanup Swig_restore(n); Delete(new_value); Delete(return_type); Delete(constants_code); return SWIG_OK; } /* ----------------------------------------------------------------------------- * insertDirective() * ----------------------------------------------------------------------------- */ virtual int insertDirective(Node *n) { int ret = SWIG_OK; String *code = Getattr(n, "code"); String *section = Getattr(n, "section"); Replaceall(code, "$module", module_class_name); Replaceall(code, "$imclassname", imclass_name); if (!ImportMode && (Cmp(section, "proxycode") == 0)) { if (proxy_class_code) { Swig_typemap_replace_embedded_typemap(code, n); int offset = Len(code) > 0 && *Char(code) == '\n' ? 1 : 0; Printv(proxy_class_code, Char(code) + offset, "\n", NIL); } } else { ret = Language::insertDirective(n); } return ret; } /* ----------------------------------------------------------------------------- * pragmaDirective() * * Valid Pragmas: * jniclassbase - base (extends) for the intermediary class * jniclasspackage - package in which to generate the intermediary class * jniclassclassmodifiers - class modifiers for the intermediary class * jniclasscode - text (java code) is copied verbatim to the intermediary class * jniclassimports - import statements for the intermediary class * jniclassinterfaces - interface (implements) for the intermediary class * * modulebase - base (extends) for the module class * moduleclassmodifiers - class modifiers for the module class * modulecode - text (java code) is copied verbatim to the module class * moduleimports - import statements for the module class * moduleinterfaces - interface (implements) for the module class * * ----------------------------------------------------------------------------- */ virtual int pragmaDirective(Node *n) { if (!ImportMode) { String *lang = Getattr(n, "lang"); String *code = Getattr(n, "name"); String *value = Getattr(n, "value"); if (Strcmp(lang, "java") == 0) { String *strvalue = NewString(value); Replaceall(strvalue, "\\\"", "\""); if (Strcmp(code, "jniclassbase") == 0) { Delete(imclass_baseclass); imclass_baseclass = Copy(strvalue); } else if (Strcmp(code, "jniclasspackage") == 0) { Delete(imclass_package); imclass_package = Copy(strvalue); String *imclass_class_package_jniname = makeValidJniName(imclass_package); Printv(jnipackage, imclass_class_package_jniname, NIL); Delete(imclass_class_package_jniname); Replaceall(jnipackage, NSPACE_SEPARATOR, "_"); Append(jnipackage, "_"); String *wrapper_name = NewString(""); String *imclass_class_jniname = makeValidJniName(imclass_name); Printf(wrapper_name, "Java_%s%s_%%f", jnipackage, imclass_class_jniname); Delete(imclass_class_jniname); Swig_name_unregister("wrapper"); Swig_name_register("wrapper", Char(wrapper_name)); Delete(wrapper_name); } else if (Strcmp(code, "jniclassclassmodifiers") == 0) { Delete(imclass_class_modifiers); imclass_class_modifiers = Copy(strvalue); } else if (Strcmp(code, "jniclasscode") == 0) { Printf(imclass_class_code, "%s\n", strvalue); } else if (Strcmp(code, "jniclassimports") == 0) { Delete(imclass_imports); imclass_imports = Copy(strvalue); } else if (Strcmp(code, "jniclassinterfaces") == 0) { Delete(imclass_interfaces); imclass_interfaces = Copy(strvalue); } else if (Strcmp(code, "modulebase") == 0) { Delete(module_baseclass); module_baseclass = Copy(strvalue); } else if (Strcmp(code, "moduleclassmodifiers") == 0) { Delete(module_class_modifiers); module_class_modifiers = Copy(strvalue); } else if (Strcmp(code, "modulecode") == 0) { Printf(module_class_code, "%s\n", strvalue); } else if (Strcmp(code, "moduleimports") == 0) { Delete(module_imports); module_imports = Copy(strvalue); } else if (Strcmp(code, "moduleinterfaces") == 0) { Delete(module_interfaces); module_interfaces = Copy(strvalue); } else if (Strcmp(code, "moduleimport") == 0) { Swig_error(input_file, line_number, "Deprecated pragma. Please use the moduleimports pragma.\n"); } else if (Strcmp(code, "moduleinterface") == 0) { Swig_error(input_file, line_number, "Deprecated pragma. Please use the moduleinterfaces pragma.\n"); } else if (Strcmp(code, "modulemethodmodifiers") == 0) { Swig_error(input_file, line_number, "Deprecated pragma. Please use %%javamethodmodifiers.\n"); } else if (Strcmp(code, "allshadowimport") == 0) { Swig_error(input_file, line_number, "Deprecated pragma. Please use %%typemap(javaimports).\n"); } else if (Strcmp(code, "allshadowcode") == 0) { Swig_error(input_file, line_number, "Deprecated pragma. Please use %%typemap(javacode).\n"); } else if (Strcmp(code, "allshadowbase") == 0) { Swig_error(input_file, line_number, "Deprecated pragma. Please use %%typemap(javabase).\n"); } else if (Strcmp(code, "allshadowinterface") == 0) { Swig_error(input_file, line_number, "Deprecated pragma. Please use %%typemap(javainterfaces).\n"); } else if (Strcmp(code, "allshadowclassmodifiers") == 0) { Swig_error(input_file, line_number, "Deprecated pragma. Please use %%typemap(javaclassmodifiers).\n"); } else if (proxy_flag) { if (Strcmp(code, "shadowcode") == 0) { Swig_error(input_file, line_number, "Deprecated pragma. Please use %%typemap(javacode).\n"); } else if (Strcmp(code, "shadowimport") == 0) { Swig_error(input_file, line_number, "Deprecated pragma. Please use %%typemap(javaimports).\n"); } else if (Strcmp(code, "shadowbase") == 0) { Swig_error(input_file, line_number, "Deprecated pragma. Please use %%typemap(javabase).\n"); } else if (Strcmp(code, "shadowinterface") == 0) { Swig_error(input_file, line_number, "Deprecated pragma. Please use %%typemap(javainterfaces).\n"); } else if (Strcmp(code, "shadowclassmodifiers") == 0) { Swig_error(input_file, line_number, "Deprecated pragma. Please use %%typemap(javaclassmodifiers).\n"); } else { Swig_error(input_file, line_number, "Unrecognized pragma.\n"); } } else { Swig_error(input_file, line_number, "Unrecognized pragma.\n"); } Delete(strvalue); } } return Language::pragmaDirective(n); } /* ----------------------------------------------------------------------------- * getQualifiedInterfaceName() * ----------------------------------------------------------------------------- */ String *getQualifiedInterfaceName(Node *n) { String *ret = Getattr(n, "interface:qname"); if (!ret) { String *nspace = Getattr(n, "sym:nspace"); String *symname = Getattr(n, "interface:name"); if (nspace) { if (package) ret = NewStringf("%s.%s.%s", package, nspace, symname); else ret = NewStringf("%s.%s", nspace, symname); } else { ret = Copy(symname); } Setattr(n, "interface:qname", ret); } return ret; } /* ----------------------------------------------------------------------------- * getInterfaceName() * ----------------------------------------------------------------------------- */ String *getInterfaceName(SwigType *t, bool qualified) { String *interface_name = NULL; if (proxy_flag) { Node *n = classLookup(t); if (n && Getattr(n, "interface:name")) interface_name = qualified ? getQualifiedInterfaceName(n) : Getattr(n, "interface:name"); } return interface_name; } /* ----------------------------------------------------------------------------- * addInterfaceNameAndUpcasts() * ----------------------------------------------------------------------------- */ void addInterfaceNameAndUpcasts(SwigType *smart, String *interface_list, String *interface_upcasts, Hash *base_list, String *c_classname) { List *keys = Keys(base_list); for (Iterator it = First(keys); it.item; it = Next(it)) { Node *base = Getattr(base_list, it.item); String *c_baseclass = SwigType_namestr(Getattr(base, "name")); String *interface_name = Getattr(base, "interface:name"); if (Len(interface_list)) Append(interface_list, ", "); Append(interface_list, interface_name); Node *attributes = NewHash(); String *interface_code = Copy(typemapLookup(base, "javainterfacecode", Getattr(base, "classtypeobj"), WARN_JAVA_TYPEMAP_INTERFACECODE_UNDEF, attributes)); String *cptr_method_name = 0; if (interface_code) { Replaceall(interface_code, "$interfacename", interface_name); Printv(interface_upcasts, interface_code, NIL); cptr_method_name = Copy(Getattr(attributes, "tmap:javainterfacecode:cptrmethod")); } if (!cptr_method_name) cptr_method_name = NewStringf("%s_GetInterfaceCPtr", interface_name); Replaceall(cptr_method_name, ".", "_"); Replaceall(cptr_method_name, "$interfacename", interface_name); String *upcast_method_name = Swig_name_member(getNSpace(), getClassPrefix(), cptr_method_name); upcastsCode(smart, upcast_method_name, c_classname, c_baseclass); Delete(upcast_method_name); Delete(cptr_method_name); Delete(interface_code); Delete(c_baseclass); } Delete(keys); } /* ----------------------------------------------------------------------------- * upcastsCode() * * Add code for C++ casting to base class * ----------------------------------------------------------------------------- */ void upcastsCode(SwigType *smart, String *upcast_method_name, String *c_classname, String *c_baseclass) { String *jniname = makeValidJniName(upcast_method_name); String *wname = Swig_name_wrapper(jniname); Printf(imclass_cppcasts_code, " public final static native long %s(long jarg1);\n", upcast_method_name); if (smart) { SwigType *bsmart = Copy(smart); SwigType *rclassname = SwigType_typedef_resolve_all(c_classname); SwigType *rbaseclass = SwigType_typedef_resolve_all(c_baseclass); Replaceall(bsmart, rclassname, rbaseclass); Delete(rclassname); Delete(rbaseclass); String *smartnamestr = SwigType_namestr(smart); String *bsmartnamestr = SwigType_namestr(bsmart); Printv(upcasts_code, "SWIGEXPORT jlong JNICALL ", wname, "(JNIEnv *jenv, jclass jcls, jlong jarg1) {\n", " jlong baseptr = 0;\n" " ", smartnamestr, " *argp1;\n" " (void)jenv;\n" " (void)jcls;\n" " argp1 = *(", smartnamestr, " **)&jarg1;\n" " *(", bsmartnamestr, " **)&baseptr = argp1 ? new ", bsmartnamestr, "(*argp1) : 0;\n" " return baseptr;\n" "}\n", "\n", NIL); Delete(bsmartnamestr); Delete(smartnamestr); Delete(bsmart); } else { Printv(upcasts_code, "SWIGEXPORT jlong JNICALL ", wname, "(JNIEnv *jenv, jclass jcls, jlong jarg1) {\n", " jlong baseptr = 0;\n" " (void)jenv;\n" " (void)jcls;\n" " *(", c_baseclass, " **)&baseptr = *(", c_classname, " **)&jarg1;\n" " return baseptr;\n" "}\n", "\n", NIL); } Delete(wname); Delete(jniname); } /* ----------------------------------------------------------------------------- * emitProxyClassDefAndCPPCasts() * ----------------------------------------------------------------------------- */ void emitProxyClassDefAndCPPCasts(Node *n) { String *c_classname = SwigType_namestr(Getattr(n, "name")); String *c_baseclass = NULL; String *baseclass = NULL; String *c_baseclassname = NULL; String *interface_list = NewStringEmpty(); String *interface_upcasts = NewStringEmpty(); SwigType *typemap_lookup_type = Getattr(n, "classtypeobj"); bool feature_director = Swig_directorclass(n) ? true : false; bool has_outerclass = Getattr(n, "nested:outer") != 0 && !GetFlag(n, "feature:flatnested"); SwigType *smart = Swig_cparse_smartptr(n); // Inheritance from pure Java classes Node *attributes = NewHash(); const String *pure_baseclass = typemapLookup(n, "javabase", typemap_lookup_type, WARN_NONE, attributes); bool purebase_replace = GetFlag(attributes, "tmap:javabase:replace") ? true : false; bool purebase_notderived = GetFlag(attributes, "tmap:javabase:notderived") ? true : false; Delete(attributes); // C++ inheritance if (!purebase_replace) { List *baselist = Getattr(n, "bases"); if (baselist) { Iterator base = First(baselist); while (base.item) { if (!(GetFlag(base.item, "feature:ignore") || Getattr(base.item, "feature:interface"))) { String *baseclassname = Getattr(base.item, "name"); if (!c_baseclassname) { c_baseclassname = baseclassname; baseclass = Copy(getProxyName(baseclassname)); if (baseclass) c_baseclass = SwigType_namestr(baseclassname); } else { /* Warn about multiple inheritance for additional base class(es) */ String *proxyclassname = Getattr(n, "classtypeobj"); Swig_warning(WARN_JAVA_MULTIPLE_INHERITANCE, Getfile(n), Getline(n), "Warning for %s, base %s ignored. Multiple inheritance is not supported in Java.\n", SwigType_namestr(proxyclassname), SwigType_namestr(baseclassname)); } } base = Next(base); } } } Hash *interface_bases = Getattr(n, "interface:bases"); if (interface_bases) addInterfaceNameAndUpcasts(smart, interface_list, interface_upcasts, interface_bases, c_classname); bool derived = baseclass && getProxyName(c_baseclassname); if (derived && purebase_notderived) pure_baseclass = empty_string; const String *wanted_base = baseclass ? baseclass : pure_baseclass; if (purebase_replace) { wanted_base = pure_baseclass; derived = false; Delete(baseclass); baseclass = NULL; if (purebase_notderived) Swig_error(Getfile(n), Getline(n), "The javabase typemap for proxy %s must contain just one of the 'replace' or 'notderived' attributes.\n", typemap_lookup_type); } else if (Len(pure_baseclass) > 0 && Len(baseclass) > 0) { Swig_warning(WARN_JAVA_MULTIPLE_INHERITANCE, Getfile(n), Getline(n), "Warning for %s, base %s ignored. Multiple inheritance is not supported in Java. " "Perhaps you need one of the 'replace' or 'notderived' attributes in the javabase typemap?\n", typemap_lookup_type, pure_baseclass); } // Pure Java interfaces const String *pure_interfaces = typemapLookup(n, "javainterfaces", typemap_lookup_type, WARN_NONE); if (*Char(interface_list) && *Char(pure_interfaces)) Append(interface_list, ", "); Append(interface_list, pure_interfaces); // Start writing the proxy class if (!has_outerclass) // Import statements Printv(proxy_class_def, typemapLookup(n, "javaimports", typemap_lookup_type, WARN_NONE),"\n", NIL); // Translate and write javadoc comment if flagged if (doxygen && doxygenTranslator->hasDocumentation(n)) { String *doxygen_comments = doxygenTranslator->getDocumentation(n, 0); if (comment_creation_chatter) Printf(proxy_class_def, "/* This was generated from emitProxyClassDefAndCPPCasts() */\n"); Printv(proxy_class_def, Char(doxygen_comments), NIL); Delete(doxygen_comments); } if (has_outerclass) Printv(proxy_class_def, "static ", NIL); // C++ nested classes correspond to static java classes Printv(proxy_class_def, typemapLookup(n, "javaclassmodifiers", typemap_lookup_type, WARN_JAVA_TYPEMAP_CLASSMOD_UNDEF), // Class modifiers " $javaclassname", // Class name and bases (*Char(wanted_base)) ? " extends " : "", wanted_base, *Char(interface_list) ? // Pure Java interfaces " implements " : "", interface_list, " {", derived ? typemapLookup(n, "javabody_derived", typemap_lookup_type, WARN_JAVA_TYPEMAP_JAVABODY_UNDEF) : // main body of class typemapLookup(n, "javabody", typemap_lookup_type, WARN_JAVA_TYPEMAP_JAVABODY_UNDEF), // main body of class NIL); // C++ destructor is wrapped by the delete method // Note that the method name is specified in a typemap attribute called methodname String *destruct = NewString(""); const String *tm = NULL; attributes = NewHash(); const String *destruct_methodname = NULL; const String *destruct_methodmodifiers = NULL; const String *destruct_parameters = NULL; if (derived) { tm = typemapLookup(n, "javadestruct_derived", typemap_lookup_type, WARN_NONE, attributes); destruct_methodname = Getattr(attributes, "tmap:javadestruct_derived:methodname"); destruct_methodmodifiers = Getattr(attributes, "tmap:javadestruct_derived:methodmodifiers"); destruct_parameters = Getattr(attributes, "tmap:javadestruct_derived:parameters"); } else { tm = typemapLookup(n, "javadestruct", typemap_lookup_type, WARN_NONE, attributes); destruct_methodname = Getattr(attributes, "tmap:javadestruct:methodname"); destruct_methodmodifiers = Getattr(attributes, "tmap:javadestruct:methodmodifiers"); destruct_parameters = Getattr(attributes, "tmap:javadestruct:parameters"); } if (tm && *Char(tm)) { if (!destruct_methodname) { Swig_error(Getfile(n), Getline(n), "No methodname attribute defined in javadestruct%s typemap for %s\n", (derived ? "_derived" : ""), proxy_class_name); } if (!destruct_methodmodifiers) { Swig_error(Getfile(n), Getline(n), "No methodmodifiers attribute defined in javadestruct%s typemap for %s.\n", (derived ? "_derived" : ""), proxy_class_name); } if (!destruct_parameters) destruct_parameters = empty_string; } // Emit the finalize and delete methods if (tm) { // Finalize method if (*Char(destructor_call)) { Printv(proxy_class_def, typemapLookup(n, "javafinalize", typemap_lookup_type, WARN_NONE), NIL); } // delete method Printv(destruct, tm, NIL); if (*Char(destructor_call)) Replaceall(destruct, "$jnicall", destructor_call); else Replaceall(destruct, "$jnicall", "throw new UnsupportedOperationException(\"C++ destructor does not have public access\")"); if (*Char(destruct)) { Printv(proxy_class_def, "\n ", NIL); const String *methodmods = Getattr(n, "destructmethodmodifiers"); if (methodmods) Printv(proxy_class_def, methodmods, NIL); else Printv(proxy_class_def, destruct_methodmodifiers, NIL); Printv(proxy_class_def, " void ", destruct_methodname, "(", destruct_parameters, ")", destructor_throws_clause, " ", destruct, "\n", NIL); } } if (*Char(interface_upcasts)) Printv(proxy_class_def, interface_upcasts, NIL); /* Insert directordisconnect typemap, if this class has directors enabled */ /* Also insert the swigTakeOwnership and swigReleaseOwnership methods */ if (feature_director) { String *destruct_jnicall, *release_jnicall, *take_jnicall; String *changeown_method_name = Swig_name_member(getNSpace(), getClassPrefix(), "change_ownership"); destruct_jnicall = NewStringf("%s()", destruct_methodname); release_jnicall = NewStringf("%s.%s(this, swigCPtr, false)", full_imclass_name, changeown_method_name); take_jnicall = NewStringf("%s.%s(this, swigCPtr, true)", full_imclass_name, changeown_method_name); emitCodeTypemap(n, false, typemap_lookup_type, "directordisconnect", "methodname", destruct_jnicall); emitCodeTypemap(n, false, typemap_lookup_type, "directorowner_release", "methodname", release_jnicall); emitCodeTypemap(n, false, typemap_lookup_type, "directorowner_take", "methodname", take_jnicall); Delete(destruct_jnicall); Delete(changeown_method_name); Delete(release_jnicall); Delete(take_jnicall); } Delete(interface_upcasts); Delete(interface_list); Delete(attributes); Delete(destruct); // Emit extra user code Printv(proxy_class_def, typemapLookup(n, "javacode", typemap_lookup_type, WARN_NONE), // extra Java code "\n", NIL); if (derived) { String *upcast_method_name = Swig_name_member(getNSpace(), getClassPrefix(), smart != 0 ? "SWIGSmartPtrUpcast" : "SWIGUpcast"); upcastsCode(smart, upcast_method_name, c_classname, c_baseclass); Delete(upcast_method_name); } Delete(smart); Delete(baseclass); } /* ---------------------------------------------------------------------- * emitInterfaceDeclaration() * ---------------------------------------------------------------------- */ void emitInterfaceDeclaration(Node *n, String *interface_name, File *f_interface, String *nspace) { if (package || nspace) { Printf(f_interface, "package "); if (package) Printv(f_interface, package, nspace ? "." : "", NIL); if (nspace) Printv(f_interface, nspace, NIL); Printf(f_interface, ";\n"); } Printv(f_interface, typemapLookup(n, "javaimports", Getattr(n, "classtypeobj"), WARN_NONE), "\n", NIL); Printf(f_interface, "public interface %s", interface_name); if (List *baselist = Getattr(n, "bases")) { String *bases = 0; for (Iterator base = First(baselist); base.item; base = Next(base)) { if (GetFlag(base.item, "feature:ignore") || !Getattr(base.item, "feature:interface")) continue; // TODO: warn about skipped non-interface bases String *base_iname = Getattr(base.item, "interface:name"); if (!bases) bases = Copy(base_iname); else { Append(bases, ", "); Append(bases, base_iname); } } if (bases) { Printv(f_interface, " extends ", bases, NIL); Delete(bases); } } Printf(f_interface, " {\n"); Node *attributes = NewHash(); String *interface_code = Copy(typemapLookup(n, "javainterfacecode", Getattr(n, "classtypeobj"), WARN_JAVA_TYPEMAP_INTERFACECODE_UNDEF, attributes)); if (interface_code) { String *interface_declaration = Copy(Getattr(attributes, "tmap:javainterfacecode:declaration")); if (interface_declaration) { Replaceall(interface_declaration, "$interfacename", interface_name); Printv(f_interface, interface_declaration, NIL); Delete(interface_declaration); } Delete(interface_code); } } /* ---------------------------------------------------------------------- * classDeclaration() * ---------------------------------------------------------------------- */ int classDeclaration(Node *n) { return Language::classDeclaration(n); } /* ---------------------------------------------------------------------- * classHandler() * ---------------------------------------------------------------------- */ virtual int classHandler(Node *n) { File *f_proxy = NULL; File *f_interface = NULL; String *old_proxy_class_name = proxy_class_name; String *old_full_proxy_class_name = full_proxy_class_name; String *old_full_imclass_name = full_imclass_name; String *old_destructor_call = destructor_call; String *old_destructor_throws_clause = destructor_throws_clause; String *old_proxy_class_constants_code = proxy_class_constants_code; String *old_proxy_class_def = proxy_class_def; String *old_proxy_class_code = proxy_class_code; bool has_outerclass = Getattr(n, "nested:outer") && !GetFlag(n, "feature:flatnested"); String *old_interface_class_code = interface_class_code; interface_class_code = 0; if (proxy_flag) { proxy_class_name = NewString(Getattr(n, "sym:name")); String *nspace = getNSpace(); constructIntermediateClassName(n); String *outerClassesPrefix = 0; if (Node *outer = Getattr(n, "nested:outer")) { outerClassesPrefix = Copy(Getattr(outer, "sym:name")); for (outer = Getattr(outer, "nested:outer"); outer != 0; outer = Getattr(outer, "nested:outer")) { Push(outerClassesPrefix, "."); Push(outerClassesPrefix, Getattr(outer, "sym:name")); } } if (!nspace) { full_proxy_class_name = outerClassesPrefix ? NewStringf("%s.%s", outerClassesPrefix, proxy_class_name) : NewStringf("%s", proxy_class_name); if (Cmp(proxy_class_name, imclass_name) == 0) { Printf(stderr, "Class name cannot be equal to intermediary class name: %s\n", proxy_class_name); SWIG_exit(EXIT_FAILURE); } if (Cmp(proxy_class_name, module_class_name) == 0) { Printf(stderr, "Class name cannot be equal to module class name: %s\n", proxy_class_name); SWIG_exit(EXIT_FAILURE); } } else { if (outerClassesPrefix) { if (package) full_proxy_class_name = NewStringf("%s.%s.%s.%s", package, nspace, outerClassesPrefix, proxy_class_name); else full_proxy_class_name = NewStringf("%s.%s.%s", nspace, outerClassesPrefix, proxy_class_name); } else { if (package) full_proxy_class_name = NewStringf("%s.%s.%s", package, nspace, proxy_class_name); else full_proxy_class_name = NewStringf("%s.%s", nspace, proxy_class_name); } } String *interface_name = Getattr(n, "feature:interface") ? Getattr(n, "interface:name") : 0; if (outerClassesPrefix) { String *fnspace = nspace ? NewStringf("%s.%s", nspace, outerClassesPrefix) : outerClassesPrefix; if (!addSymbol(proxy_class_name, n, fnspace)) return SWIG_ERROR; if (interface_name && !addInterfaceSymbol(interface_name, n, fnspace)) return SWIG_ERROR; if (nspace) Delete(fnspace); Delete(outerClassesPrefix); } else { if (!addSymbol(proxy_class_name, n, nspace)) return SWIG_ERROR; if (interface_name && !addInterfaceSymbol(interface_name, n, nspace)) return SWIG_ERROR; } // Each outer proxy class goes into a separate file if (!has_outerclass) { String *output_directory = outputDirectory(nspace); String *filen = NewStringf("%s%s.java", output_directory, proxy_class_name); f_proxy = NewFile(filen, "w", SWIG_output_files()); if (!f_proxy) { FileErrorDisplay(filen); SWIG_exit(EXIT_FAILURE); } Append(filenames_list, Copy(filen)); Delete(filen); Delete(output_directory); // Start writing out the proxy class file emitBanner(f_proxy); if (package || nspace) { Printf(f_proxy, "package "); if (package) Printv(f_proxy, package, nspace ? "." : "", NIL); if (nspace) Printv(f_proxy, nspace, NIL); Printf(f_proxy, ";\n"); } } else ++nesting_depth; proxy_class_def = NewString(""); proxy_class_code = NewString(""); destructor_call = NewString(""); destructor_throws_clause = NewString(""); proxy_class_constants_code = NewString(""); if (Getattr(n, "feature:interface")) { interface_class_code = NewString(""); String *output_directory = outputDirectory(nspace); String *filen = NewStringf("%s%s.java", output_directory, interface_name); f_interface = NewFile(filen, "w", SWIG_output_files()); if (!f_interface) { FileErrorDisplay(filen); SWIG_exit(EXIT_FAILURE); } Append(filenames_list, filen); // file name ownership goes to the list emitBanner(f_interface); emitInterfaceDeclaration(n, interface_name, interface_class_code, nspace); Delete(filen); Delete(output_directory); } } Language::classHandler(n); if (proxy_flag) { emitProxyClassDefAndCPPCasts(n); String *javaclazzname = Swig_name_member(getNSpace(), getClassPrefix(), ""); // mangled full proxy class name Replaceall(proxy_class_def, "$javaclassname", proxy_class_name); Replaceall(proxy_class_code, "$javaclassname", proxy_class_name); Replaceall(proxy_class_constants_code, "$javaclassname", proxy_class_name); Replaceall(interface_class_code, "$javaclassname", proxy_class_name); Replaceall(proxy_class_def, "$javaclazzname", javaclazzname); Replaceall(proxy_class_code, "$javaclazzname", javaclazzname); Replaceall(proxy_class_constants_code, "$javaclazzname", javaclazzname); Replaceall(interface_class_code, "$javaclazzname", javaclazzname); Replaceall(proxy_class_def, "$module", module_class_name); Replaceall(proxy_class_code, "$module", module_class_name); Replaceall(proxy_class_constants_code, "$module", module_class_name); Replaceall(interface_class_code, "$module", module_class_name); Replaceall(proxy_class_def, "$imclassname", full_imclass_name); Replaceall(proxy_class_code, "$imclassname", full_imclass_name); Replaceall(proxy_class_constants_code, "$imclassname", full_imclass_name); Replaceall(interface_class_code, "$imclassname", full_imclass_name); if (!has_outerclass) Printv(f_proxy, proxy_class_def, proxy_class_code, NIL); else { Swig_offset_string(proxy_class_def, nesting_depth); Append(old_proxy_class_code, proxy_class_def); Swig_offset_string(proxy_class_code, nesting_depth); Append(old_proxy_class_code, proxy_class_code); } // Write out all the constants if (Len(proxy_class_constants_code) != 0) { if (!has_outerclass) Printv(f_proxy, proxy_class_constants_code, NIL); else { Swig_offset_string(proxy_class_constants_code, nesting_depth); Append(old_proxy_class_code, proxy_class_constants_code); } } if (!has_outerclass) { Printf(f_proxy, "}\n"); Delete(f_proxy); f_proxy = NULL; } else { for (int i = 0; i < nesting_depth; ++i) Append(old_proxy_class_code, " "); Append(old_proxy_class_code, "}\n\n"); --nesting_depth; } if (f_interface) { Printv(f_interface, interface_class_code, "}\n", NIL); Delete(f_interface); f_interface = 0; } emitDirectorExtraMethods(n); Delete(interface_class_code); interface_class_code = old_interface_class_code; Delete(javaclazzname); Delete(proxy_class_name); proxy_class_name = old_proxy_class_name; Delete(full_proxy_class_name); full_proxy_class_name = old_full_proxy_class_name; Delete(full_imclass_name); full_imclass_name = old_full_imclass_name; Delete(destructor_call); destructor_call = old_destructor_call; Delete(destructor_throws_clause); destructor_throws_clause = old_destructor_throws_clause; Delete(proxy_class_constants_code); proxy_class_constants_code = old_proxy_class_constants_code; Delete(proxy_class_def); proxy_class_def = old_proxy_class_def; Delete(proxy_class_code); proxy_class_code = old_proxy_class_code; } return SWIG_OK; } /* ---------------------------------------------------------------------- * memberfunctionHandler() * ---------------------------------------------------------------------- */ virtual int memberfunctionHandler(Node *n) { member_func_flag = true; Language::memberfunctionHandler(n); if (proxy_flag) { String *overloaded_name = getOverloadedName(n); String *intermediary_function_name = Swig_name_member(getNSpace(), getClassPrefix(), overloaded_name); Setattr(n, "proxyfuncname", Getattr(n, "sym:name")); Setattr(n, "imfuncname", intermediary_function_name); proxyClassFunctionHandler(n); Delete(overloaded_name); } member_func_flag = false; return SWIG_OK; } /* ---------------------------------------------------------------------- * staticmemberfunctionHandler() * ---------------------------------------------------------------------- */ virtual int staticmemberfunctionHandler(Node *n) { static_flag = true; member_func_flag = true; Language::staticmemberfunctionHandler(n); if (proxy_flag) { String *overloaded_name = getOverloadedName(n); String *intermediary_function_name = Swig_name_member(getNSpace(), getClassPrefix(), overloaded_name); Setattr(n, "proxyfuncname", Getattr(n, "sym:name")); Setattr(n, "imfuncname", intermediary_function_name); proxyClassFunctionHandler(n); Delete(overloaded_name); } static_flag = false; member_func_flag = false; return SWIG_OK; } /* ----------------------------------------------------------------------------- * proxyClassFunctionHandler() * * Function called for creating a Java wrapper function around a c++ function in the * proxy class. Used for both static and non-static C++ class functions. * C++ class static functions map to Java static functions. * Two extra attributes in the Node must be available. These are "proxyfuncname" - * the name of the Java class proxy function, which in turn will call "imfuncname" - * the intermediary (JNI) function name in the intermediary class. * ----------------------------------------------------------------------------- */ void proxyClassFunctionHandler(Node *n) { SwigType *t = Getattr(n, "type"); ParmList *l = Getattr(n, "parms"); String *intermediary_function_name = Getattr(n, "imfuncname"); String *proxy_function_name = Getattr(n, "proxyfuncname"); String *tm; Parm *p; int i; String *imcall = NewString(""); String *return_type = NewString(""); String *function_code = NewString(""); bool setter_flag = false; String *pre_code = NewString(""); String *post_code = NewString(""); bool is_interface = Getattr(parentNode(n), "feature:interface") != 0 && !static_flag && Getattr(n, "interface:owner") == 0; if (!proxy_flag) return; // Wrappers not wanted for some methods where the parameters cannot be overloaded in Java if (Getattr(n, "overload:ignore")) return; // Don't generate proxy method for additional explicitcall method used in directors if (GetFlag(n, "explicitcall")) return; if (l) { if (SwigType_type(Getattr(l, "type")) == T_VOID) { l = nextSibling(l); } } /* Attach the non-standard typemaps to the parameter list */ Swig_typemap_attach_parms("in", l, NULL); Swig_typemap_attach_parms("jtype", l, NULL); Swig_typemap_attach_parms("jstype", l, NULL); Swig_typemap_attach_parms("javain", l, NULL); /* Get return types */ if ((tm = Swig_typemap_lookup("jstype", n, "", 0))) { // Note that in the case of polymorphic (covariant) return types, the method's return type is changed to be the base of the C++ return type SwigType *covariant = Getattr(n, "covariant"); substituteClassname(covariant ? covariant : t, tm); Printf(return_type, "%s", tm); if (covariant) Swig_warning(WARN_JAVA_COVARIANT_RET, input_file, line_number, "Covariant return types not supported in Java. Proxy method will return %s.\n", SwigType_str(covariant, 0)); } else { Swig_warning(WARN_JAVA_TYPEMAP_JSTYPE_UNDEF, input_file, line_number, "No jstype typemap defined for %s\n", SwigType_str(t, 0)); } if (wrapping_member_flag && !enum_constant_flag) { // For wrapping member variables (Javabean setter) setter_flag = (Cmp(Getattr(n, "sym:name"), Swig_name_set(getNSpace(), Swig_name_member(0, getClassPrefix(), variable_name))) == 0); } // Translate and write javadoc comment if flagged if (doxygen && doxygenTranslator->hasDocumentation(n)) { String *doxygen_comments = doxygenTranslator->getDocumentation(n, " "); if (comment_creation_chatter) Printf(function_code, "/* This was generated from proxyclassfunctionhandler() */\n"); Printv(function_code, Char(doxygen_comments), NIL); Delete(doxygen_comments); } /* Start generating the proxy function */ const String *methodmods = Getattr(n, "feature:java:methodmodifiers"); methodmods = methodmods ? methodmods : (is_public(n) ? public_string : protected_string); Printf(function_code, " %s ", methodmods); if (static_flag) Printf(function_code, "static "); Printf(function_code, "%s %s(", return_type, proxy_function_name); if (is_interface) Printf(interface_class_code, " %s %s(", return_type, proxy_function_name); Printv(imcall, full_imclass_name, ".$imfuncname(", NIL); if (!static_flag) { Printf(imcall, "swigCPtr"); String *this_type = Copy(getClassType()); String *name = NewString("jself"); String *qualifier = Getattr(n, "qualifier"); if (qualifier) SwigType_push(this_type, qualifier); SwigType_add_pointer(this_type); Parm *this_parm = NewParm(this_type, name, n); Swig_typemap_attach_parms("jtype", this_parm, NULL); Swig_typemap_attach_parms("jstype", this_parm, NULL); if (prematureGarbageCollectionPreventionParameter(this_type, this_parm)) Printf(imcall, ", this"); Delete(this_parm); Delete(name); Delete(this_type); } emit_mark_varargs(l); int gencomma = !static_flag; /* Output each parameter */ for (i = 0, p = l; p; i++) { /* Ignored varargs */ if (checkAttribute(p, "varargs:ignore", "1")) { p = nextSibling(p); continue; } /* Ignored parameters */ if (checkAttribute(p, "tmap:in:numinputs", "0")) { p = Getattr(p, "tmap:in:next"); continue; } /* Ignore the 'this' argument for variable wrappers */ if (!(variable_wrapper_flag && i == 0) || static_flag) { SwigType *pt = Getattr(p, "type"); String *param_type = NewString(""); /* Get the Java parameter type */ if ((tm = Getattr(p, "tmap:jstype"))) { substituteClassname(pt, tm); Printf(param_type, "%s", tm); } else { Swig_warning(WARN_JAVA_TYPEMAP_JSTYPE_UNDEF, input_file, line_number, "No jstype typemap defined for %s\n", SwigType_str(pt, 0)); } if (gencomma) Printf(imcall, ", "); String *arg = makeParameterName(n, p, i, setter_flag); // Use typemaps to transform type used in Java proxy wrapper (in proxy class) to type used in JNI function (in intermediary class) if ((tm = Getattr(p, "tmap:javain"))) { addThrows(n, "tmap:javain", p); substituteClassname(pt, tm); Replaceall(tm, "$javainput", arg); String *pre = Getattr(p, "tmap:javain:pre"); if (pre) { substituteClassname(pt, pre); Replaceall(pre, "$javainput", arg); if (Len(pre_code) > 0) Printf(pre_code, "\n"); Printv(pre_code, pre, NIL); } String *post = Getattr(p, "tmap:javain:post"); if (post) { substituteClassname(pt, post); Replaceall(post, "$javainput", arg); if (Len(post_code) > 0) Printf(post_code, "\n"); Printv(post_code, post, NIL); } Printv(imcall, tm, NIL); } else { Swig_warning(WARN_JAVA_TYPEMAP_JAVAIN_UNDEF, input_file, line_number, "No javain typemap defined for %s\n", SwigType_str(pt, 0)); } /* Add parameter to proxy function */ if (gencomma >= 2) { Printf(function_code, ", "); if (is_interface) Printf(interface_class_code, ", "); } gencomma = 2; Printf(function_code, "%s %s", param_type, arg); if (is_interface) Printf(interface_class_code, "%s %s", param_type, arg); if (prematureGarbageCollectionPreventionParameter(pt, p)) { String *pgcppname = Getattr(p, "tmap:javain:pgcppname"); if (pgcppname) { String *argname = Copy(pgcppname); Replaceall(argname, "$javainput", arg); Printf(imcall, ", %s", argname); Delete(argname); } else { Printf(imcall, ", %s", arg); } } Delete(arg); Delete(param_type); } p = Getattr(p, "tmap:in:next"); } Printf(imcall, ")"); Printf(function_code, ")"); // Transform return type used in JNI function (in intermediary class) to type used in Java wrapper function (in proxy class) if ((tm = Swig_typemap_lookup("javaout", n, "", 0))) { addThrows(n, "tmap:javaout", n); bool is_pre_code = Len(pre_code) > 0; bool is_post_code = Len(post_code) > 0; if (is_pre_code || is_post_code) { Replaceall(tm, "\n ", "\n "); // add extra indentation to code in typemap if (is_post_code) { Insert(tm, 0, "\n try "); Printv(tm, " finally {\n", post_code, "\n }", NIL); } else { Insert(tm, 0, "\n "); } if (is_pre_code) { Insert(tm, 0, pre_code); Insert(tm, 0, "\n"); } Insert(tm, 0, "{"); Printf(tm, "\n }"); } if (GetFlag(n, "feature:new")) Replaceall(tm, "$owner", "true"); else Replaceall(tm, "$owner", "false"); substituteClassname(t, tm); // For director methods: generate code to selectively make a normal polymorphic call or // an explicit method call - needed to prevent infinite recursion calls in director methods. Node *explicit_n = Getattr(n, "explicitcallnode"); if (explicit_n) { String *ex_overloaded_name = getOverloadedName(explicit_n); String *ex_intermediary_function_name = Swig_name_member(getNSpace(), getClassPrefix(), ex_overloaded_name); String *ex_imcall = Copy(imcall); Replaceall(ex_imcall, "$imfuncname", ex_intermediary_function_name); Replaceall(imcall, "$imfuncname", intermediary_function_name); String *excode = NewString(""); if (!Cmp(return_type, "void")) Printf(excode, "if (getClass() == %s.class) %s; else %s", proxy_class_name, imcall, ex_imcall); else Printf(excode, "(getClass() == %s.class) ? %s : %s", proxy_class_name, imcall, ex_imcall); Clear(imcall); Printv(imcall, excode, NIL); Delete(ex_overloaded_name); Delete(excode); } else { Replaceall(imcall, "$imfuncname", intermediary_function_name); } Replaceall(tm, "$jnicall", imcall); } else { Swig_warning(WARN_JAVA_TYPEMAP_JAVAOUT_UNDEF, input_file, line_number, "No javaout typemap defined for %s\n", SwigType_str(t, 0)); } if (is_interface) { Printf(interface_class_code, ")"); generateThrowsClause(n, interface_class_code); Printf(interface_class_code, ";\n"); } generateThrowsClause(n, function_code); Printf(function_code, " %s\n\n", tm ? tm : empty_string); Printv(proxy_class_code, function_code, NIL); Delete(pre_code); Delete(post_code); Delete(function_code); Delete(return_type); Delete(imcall); } /* ---------------------------------------------------------------------- * constructorHandler() * ---------------------------------------------------------------------- */ virtual int constructorHandler(Node *n) { ParmList *l = Getattr(n, "parms"); String *tm; Parm *p; int i; String *function_code = NewString(""); String *helper_code = NewString(""); // Holds code for the constructor helper method generated only when the javain typemap has code in the pre or post attributes String *helper_args = NewString(""); String *pre_code = NewString(""); String *post_code = NewString(""); String *im_return_type = NewString(""); bool feature_director = (parentNode(n) && Swig_directorclass(n)); Language::constructorHandler(n); // Wrappers not wanted for some methods where the parameters cannot be overloaded in Java if (Getattr(n, "overload:ignore")) return SWIG_OK; if (proxy_flag) { String *overloaded_name = getOverloadedName(n); String *mangled_overname = Swig_name_construct(getNSpace(), overloaded_name); String *imcall = NewString(""); const String *methodmods = Getattr(n, "feature:java:methodmodifiers"); methodmods = methodmods ? methodmods : (is_public(n) ? public_string : protected_string); tm = Getattr(n, "tmap:jtype"); // typemaps were attached earlier to the node Printf(im_return_type, "%s", tm); // Translate and write javadoc comment if flagged if (doxygen && doxygenTranslator->hasDocumentation(n)) { String *doxygen_comments = doxygenTranslator->getDocumentation(n, " "); if (comment_creation_chatter) Printf(function_code, "/* This was generated from constructionhandler() */\n"); Printv(function_code, Char(doxygen_comments), NIL); Delete(doxygen_comments); } Printf(function_code, " %s %s(", methodmods, proxy_class_name); Printf(helper_code, " static private %s SwigConstruct%s(", im_return_type, proxy_class_name); Printv(imcall, full_imclass_name, ".", mangled_overname, "(", NIL); /* Attach the non-standard typemaps to the parameter list */ Swig_typemap_attach_parms("in", l, NULL); Swig_typemap_attach_parms("jtype", l, NULL); Swig_typemap_attach_parms("jstype", l, NULL); Swig_typemap_attach_parms("javain", l, NULL); emit_mark_varargs(l); int gencomma = 0; /* Output each parameter */ for (i = 0, p = l; p; i++) { /* Ignored varargs */ if (checkAttribute(p, "varargs:ignore", "1")) { p = nextSibling(p); continue; } /* Ignored parameters */ if (checkAttribute(p, "tmap:in:numinputs", "0")) { p = Getattr(p, "tmap:in:next"); continue; } SwigType *pt = Getattr(p, "type"); String *param_type = NewString(""); /* Get the Java parameter type */ if ((tm = Getattr(p, "tmap:jstype"))) { substituteClassname(pt, tm); Printf(param_type, "%s", tm); } else { Swig_warning(WARN_JAVA_TYPEMAP_JSTYPE_UNDEF, input_file, line_number, "No jstype typemap defined for %s\n", SwigType_str(pt, 0)); } if (gencomma) Printf(imcall, ", "); String *arg = makeParameterName(n, p, i, false); // Use typemaps to transform type used in Java wrapper function (in proxy class) to type used in JNI function (in intermediary class) if ((tm = Getattr(p, "tmap:javain"))) { addThrows(n, "tmap:javain", p); substituteClassname(pt, tm); Replaceall(tm, "$javainput", arg); String *pre = Getattr(p, "tmap:javain:pre"); if (pre) { substituteClassname(pt, pre); Replaceall(pre, "$javainput", arg); if (Len(pre_code) > 0) Printf(pre_code, "\n"); Printv(pre_code, pre, NIL); } String *post = Getattr(p, "tmap:javain:post"); if (post) { substituteClassname(pt, post); Replaceall(post, "$javainput", arg); if (Len(post_code) > 0) Printf(post_code, "\n"); Printv(post_code, post, NIL); } Printv(imcall, tm, NIL); } else { Swig_warning(WARN_JAVA_TYPEMAP_JAVAIN_UNDEF, input_file, line_number, "No javain typemap defined for %s\n", SwigType_str(pt, 0)); } /* Add parameter to proxy function */ if (gencomma) { Printf(function_code, ", "); Printf(helper_code, ", "); Printf(helper_args, ", "); } Printf(function_code, "%s %s", param_type, arg); Printf(helper_code, "%s %s", param_type, arg); Printf(helper_args, "%s", arg); ++gencomma; if (prematureGarbageCollectionPreventionParameter(pt, p)) { String *pgcppname = Getattr(p, "tmap:javain:pgcppname"); if (pgcppname) { String *argname = Copy(pgcppname); Replaceall(argname, "$javainput", arg); Printf(imcall, ", %s", argname); Delete(argname); } else { Printf(imcall, ", %s", arg); } } Delete(arg); Delete(param_type); p = Getattr(p, "tmap:in:next"); } Printf(imcall, ")"); Printf(function_code, ")"); Printf(helper_code, ")"); generateThrowsClause(n, function_code); /* Insert the javaconstruct typemap, doing the replacement for $directorconnect, as needed */ Hash *attributes = NewHash(); String *typemap_lookup_type = Getattr(getCurrentClass(), "classtypeobj"); String *construct_tm = Copy(typemapLookup(n, "javaconstruct", typemap_lookup_type, WARN_JAVA_TYPEMAP_JAVACONSTRUCT_UNDEF, attributes)); if (construct_tm) { if (!feature_director) { Replaceall(construct_tm, "$directorconnect", ""); } else { String *connect_attr = Getattr(attributes, "tmap:javaconstruct:directorconnect"); if (connect_attr) { Replaceall(construct_tm, "$directorconnect", connect_attr); } else { Swig_warning(WARN_JAVA_NO_DIRECTORCONNECT_ATTR, input_file, line_number, "\"directorconnect\" attribute missing in %s \"javaconstruct\" typemap.\n", Getattr(n, "name")); Replaceall(construct_tm, "$directorconnect", ""); } } Printv(function_code, " ", construct_tm, "\n", NIL); } bool is_pre_code = Len(pre_code) > 0; bool is_post_code = Len(post_code) > 0; if (is_pre_code || is_post_code) { generateThrowsClause(n, helper_code); Printf(helper_code, " {\n"); if (is_pre_code) { Printv(helper_code, pre_code, "\n", NIL); } if (is_post_code) { Printf(helper_code, " try {\n"); Printv(helper_code, " return ", imcall, ";\n", NIL); Printv(helper_code, " } finally {\n", post_code, "\n }", NIL); } else { Printv(helper_code, " return ", imcall, ";", NIL); } Printf(helper_code, "\n }\n"); String *helper_name = NewStringf("%s.SwigConstruct%s(%s)", proxy_class_name, proxy_class_name, helper_args); Printv(proxy_class_code, helper_code, "\n", NIL); Replaceall(function_code, "$imcall", helper_name); Delete(helper_name); } else { Replaceall(function_code, "$imcall", imcall); } Printv(proxy_class_code, function_code, "\n", NIL); Delete(helper_args); Delete(im_return_type); Delete(pre_code); Delete(post_code); Delete(construct_tm); Delete(attributes); Delete(overloaded_name); Delete(imcall); } return SWIG_OK; } /* ---------------------------------------------------------------------- * destructorHandler() * ---------------------------------------------------------------------- */ virtual int destructorHandler(Node *n) { Language::destructorHandler(n); String *symname = Getattr(n, "sym:name"); if (proxy_flag) { Printv(destructor_call, full_imclass_name, ".", Swig_name_destroy(getNSpace(), symname), "(swigCPtr)", NIL); generateThrowsClause(n, destructor_throws_clause); const String *methodmods = Getattr(n, "feature:java:methodmodifiers"); if (methodmods) Setattr(getCurrentClass(), "destructmethodmodifiers", methodmods); } return SWIG_OK; } /* ---------------------------------------------------------------------- * membervariableHandler() * ---------------------------------------------------------------------- */ virtual int membervariableHandler(Node *n) { variable_name = Getattr(n, "sym:name"); wrapping_member_flag = true; variable_wrapper_flag = true; Language::membervariableHandler(n); wrapping_member_flag = false; variable_wrapper_flag = false; return SWIG_OK; } /* ---------------------------------------------------------------------- * staticmembervariableHandler() * ---------------------------------------------------------------------- */ virtual int staticmembervariableHandler(Node *n) { variable_name = Getattr(n, "sym:name"); wrapping_member_flag = true; static_flag = true; Language::staticmembervariableHandler(n); wrapping_member_flag = false; static_flag = false; return SWIG_OK; } /* ---------------------------------------------------------------------- * memberconstantHandler() * ---------------------------------------------------------------------- */ virtual int memberconstantHandler(Node *n) { variable_name = Getattr(n, "sym:name"); wrapping_member_flag = true; Language::memberconstantHandler(n); wrapping_member_flag = false; return SWIG_OK; } /* ----------------------------------------------------------------------------- * getOverloadedName() * ----------------------------------------------------------------------------- */ String *getOverloadedName(Node *n) { /* Although JNI functions are designed to handle overloaded Java functions, * a Java long is used for all classes in the SWIG intermediary class. * The intermediary class methods are thus mangled when overloaded to give * a unique name. */ String *overloaded_name = NewStringf("%s", Getattr(n, "sym:name")); if (Getattr(n, "sym:overloaded")) { Printv(overloaded_name, Getattr(n, "sym:overname"), NIL); } return overloaded_name; } /* ----------------------------------------------------------------------------- * moduleClassFunctionHandler() * ----------------------------------------------------------------------------- */ void moduleClassFunctionHandler(Node *n) { SwigType *t = Getattr(n, "type"); ParmList *l = Getattr(n, "parms"); String *tm; Parm *p; int i; String *imcall = NewString(""); String *return_type = NewString(""); String *function_code = NewString(""); int num_arguments = 0; String *overloaded_name = getOverloadedName(n); String *func_name = NULL; bool setter_flag = false; String *pre_code = NewString(""); String *post_code = NewString(""); // Translate and write javadoc comment if flagged if (doxygen && doxygenTranslator->hasDocumentation(n)) { String *doxygen_comments = doxygenTranslator->getDocumentation(n, " "); if (comment_creation_chatter) Printf(function_code, "/* This was generated from moduleClassFunctionHandler() */\n"); Printv(function_code, doxygen_comments, NIL); Delete(doxygen_comments); } if (l) { if (SwigType_type(Getattr(l, "type")) == T_VOID) { l = nextSibling(l); } } /* Attach the non-standard typemaps to the parameter list */ Swig_typemap_attach_parms("jstype", l, NULL); Swig_typemap_attach_parms("javain", l, NULL); /* Get return types */ if ((tm = Swig_typemap_lookup("jstype", n, "", 0))) { substituteClassname(t, tm); Printf(return_type, "%s", tm); } else { Swig_warning(WARN_JAVA_TYPEMAP_JSTYPE_UNDEF, input_file, line_number, "No jstype typemap defined for %s\n", SwigType_str(t, 0)); } /* Change function name for global variables */ if (proxy_flag && global_variable_flag) { // Capitalize the first letter in the variable to create a JavaBean type getter/setter function name func_name = NewString(""); setter_flag = (Cmp(Getattr(n, "sym:name"), Swig_name_set(getNSpace(), variable_name)) == 0); if (setter_flag) Printf(func_name, "set"); else Printf(func_name, "get"); Putc(toupper((int) *Char(variable_name)), func_name); Printf(func_name, "%s", Char(variable_name) + 1); } else { func_name = Copy(Getattr(n, "sym:name")); } /* Start generating the function */ const String *methodmods = Getattr(n, "feature:java:methodmodifiers"); methodmods = methodmods ? methodmods : (is_public(n) ? public_string : protected_string); Printf(function_code, " %s static %s %s(", methodmods, return_type, func_name); Printv(imcall, imclass_name, ".", overloaded_name, "(", NIL); /* Get number of required and total arguments */ num_arguments = emit_num_arguments(l); bool global_or_member_variable = global_variable_flag || (wrapping_member_flag && !enum_constant_flag); int gencomma = 0; /* Output each parameter */ for (i = 0, p = l; i < num_arguments; i++) { /* Ignored parameters */ while (checkAttribute(p, "tmap:in:numinputs", "0")) { p = Getattr(p, "tmap:in:next"); } SwigType *pt = Getattr(p, "type"); String *param_type = NewString(""); /* Get the Java parameter type */ if ((tm = Getattr(p, "tmap:jstype"))) { substituteClassname(pt, tm); Printf(param_type, "%s", tm); } else { Swig_warning(WARN_JAVA_TYPEMAP_JSTYPE_UNDEF, input_file, line_number, "No jstype typemap defined for %s\n", SwigType_str(pt, 0)); } if (gencomma) Printf(imcall, ", "); String *arg = makeParameterName(n, p, i, global_or_member_variable); // Use typemaps to transform type used in Java wrapper function (in proxy class) to type used in JNI function (in intermediary class) if ((tm = Getattr(p, "tmap:javain"))) { addThrows(n, "tmap:javain", p); substituteClassname(pt, tm); Replaceall(tm, "$javainput", arg); String *pre = Getattr(p, "tmap:javain:pre"); if (pre) { substituteClassname(pt, pre); Replaceall(pre, "$javainput", arg); if (Len(pre_code) > 0) Printf(pre_code, "\n"); Printv(pre_code, pre, NIL); } String *post = Getattr(p, "tmap:javain:post"); if (post) { substituteClassname(pt, post); Replaceall(post, "$javainput", arg); if (Len(post_code) > 0) Printf(post_code, "\n"); Printv(post_code, post, NIL); } Printv(imcall, tm, NIL); } else { Swig_warning(WARN_JAVA_TYPEMAP_JAVAIN_UNDEF, input_file, line_number, "No javain typemap defined for %s\n", SwigType_str(pt, 0)); } /* Add parameter to module class function */ if (gencomma >= 2) Printf(function_code, ", "); gencomma = 2; Printf(function_code, "%s %s", param_type, arg); if (prematureGarbageCollectionPreventionParameter(pt, p)) { String *pgcppname = Getattr(p, "tmap:javain:pgcppname"); if (pgcppname) { String *argname = Copy(pgcppname); Replaceall(argname, "$javainput", arg); Printf(imcall, ", %s", argname); Delete(argname); } else { Printf(imcall, ", %s", arg); } } p = Getattr(p, "tmap:in:next"); Delete(arg); Delete(param_type); } Printf(imcall, ")"); Printf(function_code, ")"); // Transform return type used in JNI function (in intermediary class) to type used in Java wrapper function (in module class) if ((tm = Swig_typemap_lookup("javaout", n, "", 0))) { addThrows(n, "tmap:javaout", n); bool is_pre_code = Len(pre_code) > 0; bool is_post_code = Len(post_code) > 0; if (is_pre_code || is_post_code) { Replaceall(tm, "\n ", "\n "); // add extra indentation to code in typemap if (is_post_code) { Insert(tm, 0, "\n try "); Printv(tm, " finally {\n", post_code, "\n }", NIL); } else { Insert(tm, 0, "\n "); } if (is_pre_code) { Insert(tm, 0, pre_code); Insert(tm, 0, "\n"); } Insert(tm, 0, "{"); Printf(tm, "\n }"); } if (GetFlag(n, "feature:new")) Replaceall(tm, "$owner", "true"); else Replaceall(tm, "$owner", "false"); substituteClassname(t, tm); Replaceall(tm, "$jnicall", imcall); } else { Swig_warning(WARN_JAVA_TYPEMAP_JAVAOUT_UNDEF, input_file, line_number, "No javaout typemap defined for %s\n", SwigType_str(t, 0)); } generateThrowsClause(n, function_code); Printf(function_code, " %s\n\n", tm ? tm : empty_string); Printv(module_class_code, function_code, NIL); Delete(pre_code); Delete(post_code); Delete(function_code); Delete(return_type); Delete(imcall); Delete(func_name); } /*---------------------------------------------------------------------- * replaceSpecialVariables() *--------------------------------------------------------------------*/ virtual void replaceSpecialVariables(String *method, String *tm, Parm *parm) { (void)method; SwigType *type = Getattr(parm, "type"); substituteClassname(type, tm); } /*---------------------------------------------------------------------- * decodeEnumFeature() * Decode the possible enum features, which are one of: * %javaenum(simple) * %javaenum(typeunsafe) - default * %javaenum(typesafe) * %javaenum(proper) *--------------------------------------------------------------------*/ EnumFeature decodeEnumFeature(Node *n) { EnumFeature enum_feature = TypeunsafeEnum; String *feature = Getattr(n, "feature:java:enum"); if (feature) { if (Cmp(feature, "simple") == 0) enum_feature = SimpleEnum; else if (Cmp(feature, "typesafe") == 0) enum_feature = TypesafeEnum; else if (Cmp(feature, "proper") == 0) enum_feature = ProperEnum; } return enum_feature; } /* ----------------------------------------------------------------------- * enumValue() * This method will return a string with an enum value to use in Java generated * code. If the %javaconst feature is not used, the string will contain the intermediary * class call to obtain the enum value. The intermediary class and JNI methods to obtain * the enum value will be generated. Otherwise the C/C++ enum value will be used if there * is one and hopefully it will compile as Java code - e.g. 20 as in: enum E{e=20}; * The %javaconstvalue feature overrides all other ways to generate the constant value. * The caller must delete memory allocated for the returned string. * ------------------------------------------------------------------------ */ String *enumValue(Node *n) { String *symname = Getattr(n, "sym:name"); // Check for the %javaconstvalue feature String *value = Getattr(n, "feature:java:constvalue"); if (!value) { // The %javaconst feature determines how the constant value is obtained int const_feature_flag = GetFlag(n, "feature:java:const"); if (const_feature_flag) { // Use the C syntax to make a true Java constant and hope that it compiles as Java code value = Getattr(n, "enumvalue") ? Copy(Getattr(n, "enumvalue")) : Copy(Getattr(n, "enumvalueex")); } else { String *newsymname = 0; if (!getCurrentClass() || !proxy_flag) { String *enumClassPrefix = getEnumClassPrefix(); if (enumClassPrefix) { // A global scoped enum newsymname = Swig_name_member(0, enumClassPrefix, symname); symname = newsymname; } } // Get the enumvalue from a JNI call if (!getCurrentClass() || !cparse_cplusplus || !proxy_flag) { // Strange hack to change the name Setattr(n, "name", Getattr(n, "value")); /* for wrapping of enums in a namespace when emit_action is used */ constantWrapper(n); value = NewStringf("%s.%s()", full_imclass_name ? full_imclass_name : imclass_name, Swig_name_get(getNSpace(), symname)); } else { memberconstantHandler(n); value = NewStringf("%s.%s()", full_imclass_name ? full_imclass_name : imclass_name, Swig_name_get(getNSpace(), Swig_name_member(0, getEnumClassPrefix(), symname))); } Delete(newsymname); } } return value; } /* ----------------------------------------------------------------------------- * getEnumName() * * If jnidescriptor is set, inner class names are separated with '$' otherwise a '.' * and the package is also not added to the name. * ----------------------------------------------------------------------------- */ String *getEnumName(SwigType *t, bool jnidescriptor) { Node *enumname = NULL; Node *n = enumLookup(t); if (n) { enumname = Getattr(n, "enumname"); if (!enumname || jnidescriptor) { String *symname = Getattr(n, "sym:name"); if (symname) { // Add in class scope when referencing enum if not a global enum String *scopename_prefix = Swig_scopename_prefix(Getattr(n, "name")); String *proxyname = 0; if (scopename_prefix) { proxyname = getProxyName(scopename_prefix, jnidescriptor); } if (proxyname) { const char *class_separator = jnidescriptor ? "$" : "."; enumname = NewStringf("%s%s%s", proxyname, class_separator, symname); } else { // global enum or enum in a namespace String *nspace = Getattr(n, "sym:nspace"); if (nspace) { if (package && !jnidescriptor) enumname = NewStringf("%s.%s.%s", package, nspace, symname); else enumname = NewStringf("%s.%s", nspace, symname); } else { enumname = Copy(symname); } } if (!jnidescriptor) { Setattr(n, "enumname", enumname); // Cache it Delete(enumname); } Delete(scopename_prefix); } } } return enumname; } /* ----------------------------------------------------------------------------- * substituteClassname() * * Substitute the special variable $javaclassname with the proxy class name for classes/structs/unions * that SWIG knows about. Also substitutes enums with enum name. * Otherwise use the $descriptor name for the Java class name. Note that the $&javaclassname substitution * is the same as a $&descriptor substitution, ie one pointer added to descriptor name. * Note that the path separator is a '.' unless jnidescriptor is set. * Inputs: * pt - parameter type * tm - typemap contents that might contain the special variable to be replaced * jnidescriptor - if set, inner class names are separated with '$' otherwise a '/' is used for the path separator * Outputs: * tm - typemap contents complete with the special variable substitution * Return: * substitution_performed - flag indicating if a substitution was performed * ----------------------------------------------------------------------------- */ bool substituteClassname(SwigType *pt, String *tm, bool jnidescriptor = false) { bool substitution_performed = false; SwigType *type = Copy(SwigType_typedef_resolve_all(pt)); SwigType *strippedtype = SwigType_strip_qualifiers(type); if (Strstr(tm, "$javaclassname")) { SwigType *classnametype = Copy(strippedtype); substituteClassnameSpecialVariable(classnametype, tm, "$javaclassname", jnidescriptor); substitution_performed = true; Delete(classnametype); } if (Strstr(tm, "$*javaclassname")) { SwigType *classnametype = Copy(strippedtype); Delete(SwigType_pop(classnametype)); if (Len(classnametype) > 0) { substituteClassnameSpecialVariable(classnametype, tm, "$*javaclassname", jnidescriptor); substitution_performed = true; } Delete(classnametype); } if (Strstr(tm, "$&javaclassname")) { SwigType *classnametype = Copy(strippedtype); SwigType_add_pointer(classnametype); substituteClassnameSpecialVariable(classnametype, tm, "$&javaclassname", jnidescriptor); substitution_performed = true; Delete(classnametype); } if (Strstr(tm, "$javainterfacename")) { SwigType *interfacenametype = Copy(strippedtype); substituteInterfacenameSpecialVariable(interfacenametype, tm, "$javainterfacename", jnidescriptor, true); substitution_performed = true; Delete(interfacenametype); } if (Strstr(tm, "$*javainterfacename")) { SwigType *interfacenametype = Copy(strippedtype); Delete(SwigType_pop(interfacenametype)); if (Len(interfacenametype) > 0) { substituteInterfacenameSpecialVariable(interfacenametype, tm, "$*javainterfacename", jnidescriptor, true); substitution_performed = true; } Delete(interfacenametype); } if (Strstr(tm, "$&javainterfacename")) { SwigType *interfacenametype = Copy(strippedtype); SwigType_add_pointer(interfacenametype); substituteInterfacenameSpecialVariable(interfacenametype, tm, "$&javainterfacename", jnidescriptor, true); substitution_performed = true; Delete(interfacenametype); } if (Strstr(tm, "$interfacename")) { SwigType *interfacenametype = Copy(strippedtype); substituteInterfacenameSpecialVariable(interfacenametype, tm, "$interfacename", jnidescriptor, false); substitution_performed = true; Delete(interfacenametype); } if (Strstr(tm, "$*interfacename")) { SwigType *interfacenametype = Copy(strippedtype); Delete(SwigType_pop(interfacenametype)); if (Len(interfacenametype) > 0) { substituteInterfacenameSpecialVariable(interfacenametype, tm, "$*interfacename", jnidescriptor, false); substitution_performed = true; } Delete(interfacenametype); } if (Strstr(tm, "$&interfacename")) { SwigType *interfacenametype = Copy(strippedtype); SwigType_add_pointer(interfacenametype); substituteInterfacenameSpecialVariable(interfacenametype, tm, "$&interfacename", jnidescriptor, false); substitution_performed = true; Delete(interfacenametype); } Delete(strippedtype); Delete(type); return substitution_performed; } /* ----------------------------------------------------------------------------- * substituteClassnameSpecialVariable() * ----------------------------------------------------------------------------- */ void substituteClassnameSpecialVariable(SwigType *classnametype, String *tm, const char *classnamespecialvariable, bool jnidescriptor) { String *replacementname; if (SwigType_isenum(classnametype)) { String *enumname = getEnumName(classnametype, jnidescriptor); if (enumname) { replacementname = Copy(enumname); } else { bool anonymous_enum = (Cmp(classnametype, "enum ") == 0); if (anonymous_enum) { replacementname = NewString("int"); } else { // An unknown enum - one that has not been parsed (neither a C enum forward reference nor a definition) or an ignored enum replacementname = NewStringf("SWIGTYPE%s", SwigType_manglestr(classnametype)); Replace(replacementname, "enum ", "", DOH_REPLACE_ANY); Setattr(swig_types_hash, replacementname, classnametype); } } } else { String *classname = getProxyName(classnametype, jnidescriptor); // getProxyName() works for pointers to classes too if (classname) { replacementname = Copy(classname); } else { // use $descriptor if SWIG does not know anything about this type. Note that any typedefs are resolved. replacementname = NewStringf("SWIGTYPE%s", SwigType_manglestr(classnametype)); // Add to hash table so that the type wrapper classes can be created later Setattr(swig_types_hash, replacementname, classnametype); } } if (jnidescriptor) Replaceall(replacementname,".","/"); Replaceall(tm, classnamespecialvariable, replacementname); Delete(replacementname); } /* ----------------------------------------------------------------------------- * substituteInterfacenameSpecialVariable() * ----------------------------------------------------------------------------- */ void substituteInterfacenameSpecialVariable(SwigType *interfacenametype, String *tm, const char *interfacenamespecialvariable, bool jnidescriptor, bool qualified) { String *interfacename = getInterfaceName(interfacenametype/*, jnidescriptor*/, qualified); if (interfacename) { String *replacementname = Copy(interfacename); if (jnidescriptor) Replaceall(replacementname,".","/"); Replaceall(tm, interfacenamespecialvariable, replacementname); Delete(replacementname); } } /* ----------------------------------------------------------------------------- * emitTypeWrapperClass() * ----------------------------------------------------------------------------- */ void emitTypeWrapperClass(String *classname, SwigType *type) { Node *n = NewHash(); Setfile(n, input_file); Setline(n, line_number); String *swigtype = NewString(""); String *filen = NewStringf("%s%s.java", SWIG_output_directory(), classname); File *f_swigtype = NewFile(filen, "w", SWIG_output_files()); if (!f_swigtype) { FileErrorDisplay(filen); SWIG_exit(EXIT_FAILURE); } Append(filenames_list, Copy(filen)); Delete(filen); filen = NULL; // Start writing out the type wrapper class file emitBanner(f_swigtype); if (package) Printf(f_swigtype, "package %s;\n", package); // Pure Java baseclass and interfaces const String *pure_baseclass = typemapLookup(n, "javabase", type, WARN_NONE); const String *pure_interfaces = typemapLookup(n, "javainterfaces", type, WARN_NONE); // Emit the class Printv(swigtype, typemapLookup(n, "javaimports", type, WARN_NONE), // Import statements "\n", typemapLookup(n, "javaclassmodifiers", type, WARN_JAVA_TYPEMAP_CLASSMOD_UNDEF), // Class modifiers " $javaclassname", // Class name and bases *Char(pure_baseclass) ? " extends " : "", pure_baseclass, *Char(pure_interfaces) ? // Interfaces " implements " : "", pure_interfaces, " {", typemapLookup(n, "javabody", type, WARN_JAVA_TYPEMAP_JAVABODY_UNDEF), // main body of class typemapLookup(n, "javacode", type, WARN_NONE), // extra Java code "}\n", "\n", NIL); Replaceall(swigtype, "$javaclassname", classname); Replaceall(swigtype, "$module", module_class_name); Replaceall(swigtype, "$imclassname", imclass_name); // For unknown enums Replaceall(swigtype, "$static ", ""); Replaceall(swigtype, "$enumvalues", ""); Printv(f_swigtype, swigtype, NIL); Delete(f_swigtype); Delete(swigtype); Delete(n); } /* ----------------------------------------------------------------------------- * typemapLookup() * n - for input only and must contain info for Getfile(n) and Getline(n) to work * tmap_method - typemap method name * type - typemap type to lookup * warning - warning number to issue if no typemaps found * typemap_attributes - the typemap attributes are attached to this node and will * also be used for temporary storage if non null * return is never NULL, unlike Swig_typemap_lookup() * ----------------------------------------------------------------------------- */ const String *typemapLookup(Node *n, const_String_or_char_ptr tmap_method, SwigType *type, int warning, Node *typemap_attributes = 0) { Node *node = !typemap_attributes ? NewHash() : typemap_attributes; Setattr(node, "type", type); Setfile(node, Getfile(n)); Setline(node, Getline(n)); const String *tm = Swig_typemap_lookup(tmap_method, node, "", 0); if (!tm) { tm = empty_string; if (warning != WARN_NONE) Swig_warning(warning, Getfile(n), Getline(n), "No %s typemap defined for %s\n", tmap_method, SwigType_str(type, 0)); } if (!typemap_attributes) Delete(node); return tm; } /* ----------------------------------------------------------------------------- * addThrows() * * Adds exception classes to a throws list. The throws list is the list of classes * that will form the Java throws clause. Mainly for checked exceptions. * ----------------------------------------------------------------------------- */ void addThrows(Node *n, const String *attribute, Node *parameter) { // Get the comma separated exception classes for the throws clause - held in typemap/feature's "throws" attribute String *throws_attribute = NewStringf("%s:throws", attribute); String *throws = Getattr(parameter, throws_attribute); if (throws && Len(throws) > 0) { String *throws_list = Getattr(n, "java:throwslist"); if (!throws_list) { throws_list = NewList(); Setattr(n, "java:throwslist", throws_list); } // Put the exception classes in the throws clause into a temporary List List *temp_classes_list = Split(throws, ',', INT_MAX); // Add the exception classes to the node throws list, but don't duplicate if already in list if (temp_classes_list && Len(temp_classes_list) > 0) { for (Iterator cls = First(temp_classes_list); cls.item; cls = Next(cls)) { String *exception_class = NewString(cls.item); Replaceall(exception_class, " ", ""); // remove spaces Replaceall(exception_class, "\t", ""); // remove tabs if (Len(exception_class) > 0) { // $javaclassname substitution SwigType *pt = Getattr(parameter, "type"); substituteClassname(pt, exception_class); // Don't duplicate the Java exception class in the throws clause bool found_flag = false; for (Iterator item = First(throws_list); item.item; item = Next(item)) { if (Strcmp(item.item, exception_class) == 0) found_flag = true; } if (!found_flag) Append(throws_list, exception_class); } Delete(exception_class); } } Delete(temp_classes_list); } Delete(throws_attribute); } /* ----------------------------------------------------------------------------- * generateThrowsClause() * * Generates throws clause for checked exception * ----------------------------------------------------------------------------- */ void generateThrowsClause(Node *n, String *code) { // Add the throws clause into code List *throws_list = Getattr(n, "java:throwslist"); if (throws_list) { Iterator cls = First(throws_list); Printf(code, " throws %s", cls.item); while ((cls = Next(cls)).item) Printf(code, ", %s", cls.item); } } /* ----------------------------------------------------------------------------- * prematureGarbageCollectionPreventionParameter() * * Get the proxy class name for use in an additional generated parameter. The * additional parameter is added to a native method call purely to prevent * premature garbage collection of proxy classes which pass their C++ class pointer * in a Java long to the JNI layer. * ----------------------------------------------------------------------------- */ String *prematureGarbageCollectionPreventionParameter(SwigType *t, Parm *p) { String *pgcpp_java_type = 0; String *jtype = NewString(Getattr(p, "tmap:jtype")); // Strip C comments String *stripped_jtype = Swig_strip_c_comments(jtype); if (stripped_jtype) { Delete(jtype); jtype = stripped_jtype; } // Remove whitespace Replaceall(jtype, " ", ""); Replaceall(jtype, "\t", ""); if (Cmp(jtype, "long") == 0) { if (proxy_flag) { if (!GetFlag(p, "tmap:jtype:nopgcpp") && !nopgcpp_flag) { String *interface_name = getInterfaceName(t, true); pgcpp_java_type = interface_name ? interface_name : getProxyName(t); if (!pgcpp_java_type) { // Look for proxy class parameters passed to C++ layer using non-default typemaps, ie not one of above types String *jstype = NewString(Getattr(p, "tmap:jstype")); if (jstype) { Hash *classes = getClassHash(); if (classes) { // Strip C comments String *stripped_jstype = Swig_strip_c_comments(jstype); if (stripped_jstype) { Delete(jstype); jstype = stripped_jstype; } // Remove whitespace Replaceall(jstype, " ", ""); Replaceall(jstype, "\t", ""); Iterator ki; for (ki = First(classes); ki.key; ki = Next(ki)) { Node *cls = ki.item; if (cls && !Getattr(cls, "feature:ignore")) { String *symname = Getattr(cls, "sym:name"); if (symname && Strcmp(symname, jstype) == 0) { pgcpp_java_type = symname; } } } } } Delete(jstype); } } } } Delete(jtype); return pgcpp_java_type; } /* ----------------------------------------------------------------------------- * outputDirectory() * * Return the directory to use for generating Java classes/enums and create the * subdirectory (does not create if language specific outdir does not exist). * ----------------------------------------------------------------------------- */ String *outputDirectory(String *nspace) { String *output_directory = Copy(SWIG_output_directory()); if (nspace) { String *nspace_subdirectory = Copy(nspace); Replaceall(nspace_subdirectory, ".", SWIG_FILE_DELIMITER); String *newdir_error = Swig_new_subdirectory(output_directory, nspace_subdirectory); if (newdir_error) { Printf(stderr, "%s\n", newdir_error); Delete(newdir_error); SWIG_exit(EXIT_FAILURE); } Printv(output_directory, nspace_subdirectory, SWIG_FILE_DELIMITER, 0); Delete(nspace_subdirectory); } return output_directory; } /*---------------------------------------------------------------------- * Start of director methods *--------------------------------------------------------------------*/ /*---------------------------------------------------------------------- * getUpcallJNIMethod() *--------------------------------------------------------------------*/ String *getUpcallJNIMethod(String *descrip) { static struct { char code; const char *method; } upcall_methods[] = { { 'B', "CallStaticByteMethod"}, { 'C', "CallStaticCharMethod"}, { 'D', "CallStaticDoubleMethod"}, { 'F', "CallStaticFloatMethod"}, { 'I', "CallStaticIntMethod"}, { 'J', "CallStaticLongMethod"}, { 'L', "CallStaticObjectMethod"}, { 'S', "CallStaticShortMethod"}, { 'V', "CallStaticVoidMethod"}, { 'Z', "CallStaticBooleanMethod"}, { '[', "CallStaticObjectMethod"} }; char code; int i; code = *Char(descrip); for (i = 0; i < (int) (sizeof(upcall_methods) / sizeof(upcall_methods[0])); ++i) if (code == upcall_methods[i].code) return NewString(upcall_methods[i].method); return NULL; } /*---------------------------------------------------------------------- * emitDirectorUpcalls() *--------------------------------------------------------------------*/ void emitDirectorUpcalls() { if (n_dmethods) { Wrapper *w = NewWrapper(); String *jni_imclass_name = makeValidJniName(imclass_name); String *swig_module_init = NewString("swig_module_init"); String *swig_module_init_jni = makeValidJniName(swig_module_init); String *dmethod_data = NewString(""); int n_methods = 0; Iterator udata_iter; udata_iter = First(dmethods_seq); while (udata_iter.item) { UpcallData *udata = udata_iter.item; Printf(dmethod_data, " { \"%s\", \"%s\" }", Getattr(udata, "imclass_method"), Getattr(udata, "imclass_fdesc")); ++n_methods; udata_iter = Next(udata_iter); if (udata_iter.item) Putc(',', dmethod_data); Putc('\n', dmethod_data); } Printf(f_runtime, "namespace Swig {\n"); Printf(f_runtime, " namespace {\n"); Printf(f_runtime, " jclass jclass_%s = NULL;\n", imclass_name); Printf(f_runtime, " jmethodID director_method_ids[%d];\n", n_methods); Printf(f_runtime, " }\n"); Printf(f_runtime, "}\n"); Printf(w->def, "SWIGEXPORT void JNICALL Java_%s%s_%s(JNIEnv *jenv, jclass jcls) {", jnipackage, jni_imclass_name, swig_module_init_jni); Printf(w->code, "static struct {\n"); Printf(w->code, " const char *method;\n"); Printf(w->code, " const char *signature;\n"); Printf(w->code, "} methods[%d] = {\n", n_methods); Printv(w->code, dmethod_data, NIL); Printf(w->code, "};\n"); Wrapper_add_local(w, "i", "int i"); Printf(w->code, "Swig::jclass_%s = (jclass) jenv->NewGlobalRef(jcls);\n", imclass_name); Printf(w->code, "if (!Swig::jclass_%s) return;\n", imclass_name); Printf(w->code, "for (i = 0; i < (int) (sizeof(methods)/sizeof(methods[0])); ++i) {\n"); Printf(w->code, " Swig::director_method_ids[i] = jenv->GetStaticMethodID(jcls, methods[i].method, methods[i].signature);\n"); Printf(w->code, " if (!Swig::director_method_ids[i]) return;\n"); Printf(w->code, "}\n"); Printf(w->code, "}\n"); Wrapper_print(w, f_wrappers); Delete(dmethod_data); Delete(swig_module_init_jni); Delete(swig_module_init); Delete(jni_imclass_name); DelWrapper(w); } } /*---------------------------------------------------------------------- * emitDirectorExtraMethods() * * This is where the director connect method is generated. *--------------------------------------------------------------------*/ void emitDirectorExtraMethods(Node *n) { if (!Swig_directorclass(n)) return; // Output the director connect method: String *jni_imclass_name = makeValidJniName(imclass_name); String *norm_name = SwigType_namestr(Getattr(n, "name")); String *swig_director_connect = Swig_name_member(getNSpace(), getClassPrefix(), "director_connect"); String *swig_director_connect_jni = makeValidJniName(swig_director_connect); String *smartptr = Getattr(n, "feature:smartptr"); String *dirClassName = directorClassName(n); Wrapper *code_wrap; Printf(imclass_class_code, " public final static native void %s(%s obj, long cptr, boolean mem_own, boolean weak_global);\n", swig_director_connect, full_proxy_class_name); code_wrap = NewWrapper(); Printf(code_wrap->def, "SWIGEXPORT void JNICALL Java_%s%s_%s(JNIEnv *jenv, jclass jcls, jobject jself, jlong objarg, jboolean jswig_mem_own, " "jboolean jweak_global) {\n", jnipackage, jni_imclass_name, swig_director_connect_jni); if (smartptr) { Printf(code_wrap->code, " %s *obj = *((%s **)&objarg);\n", smartptr, smartptr); Printf(code_wrap->code, " (void)jcls;\n"); Printf(code_wrap->code, " // Keep a local instance of the smart pointer around while we are using the raw pointer\n"); Printf(code_wrap->code, " // Avoids using smart pointer specific API.\n"); Printf(code_wrap->code, " %s *director = static_cast<%s *>(obj->operator->());\n", dirClassName, dirClassName); } else { Printf(code_wrap->code, " %s *obj = *((%s **)&objarg);\n", norm_name, norm_name); Printf(code_wrap->code, " (void)jcls;\n"); Printf(code_wrap->code, " %s *director = static_cast<%s *>(obj);\n", dirClassName, dirClassName); } Printf(code_wrap->code, " director->swig_connect_director(jenv, jself, jenv->GetObjectClass(jself), " "(jswig_mem_own == JNI_TRUE), (jweak_global == JNI_TRUE));\n"); Printf(code_wrap->code, "}\n"); Wrapper_print(code_wrap, f_wrappers); DelWrapper(code_wrap); Delete(swig_director_connect_jni); Delete(swig_director_connect); // Output the swigReleaseOwnership, swigTakeOwnership methods: String *changeown_method_name = Swig_name_member(getNSpace(), getClassPrefix(), "change_ownership"); String *changeown_jnimethod_name = makeValidJniName(changeown_method_name); Printf(imclass_class_code, " public final static native void %s(%s obj, long cptr, boolean take_or_release);\n", changeown_method_name, full_proxy_class_name); code_wrap = NewWrapper(); Printf(code_wrap->def, "SWIGEXPORT void JNICALL Java_%s%s_%s(JNIEnv *jenv, jclass jcls, jobject jself, jlong objarg, jboolean jtake_or_release) {\n", jnipackage, jni_imclass_name, changeown_jnimethod_name); if (Len(smartptr)) { Printf(code_wrap->code, " %s *obj = *((%s **)&objarg);\n", smartptr, smartptr); Printf(code_wrap->code, " // Keep a local instance of the smart pointer around while we are using the raw pointer\n"); Printf(code_wrap->code, " // Avoids using smart pointer specific API.\n"); Printf(code_wrap->code, " %s *director = dynamic_cast<%s *>(obj->operator->());\n", dirClassName, dirClassName); } else { Printf(code_wrap->code, " %s *obj = *((%s **)&objarg);\n", norm_name, norm_name); Printf(code_wrap->code, " %s *director = dynamic_cast<%s *>(obj);\n", dirClassName, dirClassName); } Printf(code_wrap->code, " (void)jcls;\n"); Printf(code_wrap->code, " if (director) {\n"); Printf(code_wrap->code, " director->swig_java_change_ownership(jenv, jself, jtake_or_release ? true : false);\n"); Printf(code_wrap->code, " }\n"); Printf(code_wrap->code, "}\n"); Wrapper_print(code_wrap, f_wrappers); DelWrapper(code_wrap); Delete(changeown_method_name); Delete(changeown_jnimethod_name); Delete(norm_name); Delete(dirClassName); Delete(jni_imclass_name); } /*---------------------------------------------------------------------- * emitCodeTypemap() * * Output a code typemap that uses $methodname and $jnicall, as used * in the directordisconnect, director_release and director_take * typemaps. *--------------------------------------------------------------------*/ void emitCodeTypemap(Node *n, bool derived, SwigType *lookup_type, const String *typemap, const String *methodname, const String *jnicall) { const String *tm = NULL; Node *tmattrs = NewHash(); String *lookup_tmname = NewString(typemap); String *method_attr_name; String *method_attr; if (derived) { Append(lookup_tmname, "_derived"); } tm = typemapLookup(n, lookup_tmname, lookup_type, WARN_NONE, tmattrs); method_attr_name = NewStringf("tmap:%s:%s", lookup_tmname, methodname); method_attr = Getattr(tmattrs, method_attr_name); if (*Char(tm)) { if (method_attr) { String *codebody = Copy(tm); Replaceall(codebody, "$methodname", method_attr); Replaceall(codebody, "$jnicall", jnicall); Append(proxy_class_def, codebody); Delete(codebody); } else { Swig_error(input_file, line_number, "No %s method name attribute for %s\n", lookup_tmname, proxy_class_name); } } else { Swig_error(input_file, line_number, "No %s typemap for %s\n", lookup_tmname, proxy_class_name); } Delete(tmattrs); Delete(lookup_tmname); // Delete(method_attr); } /* ----------------------------------------------------------------------------- * substitutePackagePath() * * Replace $packagepath using the javapackage typemap associated with passed * parm or global package if p is 0. "$packagepath/" is replaced with "" if * no package is set. Note that the path separator is a '/'. * ----------------------------------------------------------------------------- */ void substitutePackagePath(String *text, Parm *p) { String *pkg_path= 0; if (p) pkg_path = Swig_typemap_lookup("javapackage", p, "", 0); if (!pkg_path || Len(pkg_path) == 0) pkg_path = Copy(package_path); if (Len(pkg_path) > 0) { Replaceall(pkg_path, ".", "/"); Replaceall(text, "$packagepath", pkg_path); } else { Replaceall(text, "$packagepath/", empty_string); Replaceall(text, "$packagepath", empty_string); } Delete(pkg_path); } /* --------------------------------------------------------------- * Canonicalize the JNI field descriptor * * Replace the $packagepath and $javaclassname family of special * variables with the desired package and Java proxy name as * required in the JNI field descriptors. * * !!SFM!! If $packagepath occurs in the field descriptor, but * package_path isn't set (length == 0), then strip it and the * optional trailing '/' from the resulting name. * * --------------------------------------------------------------- */ String *canonicalizeJNIDescriptor(String *descriptor_in, Parm *p) { SwigType *type = Getattr(p, "type"); String *descriptor_out = Copy(descriptor_in); substituteClassname(type, descriptor_out, true); substitutePackagePath(descriptor_out, p); return descriptor_out; } /* --------------------------------------------------------------- * classDirectorMethod() * * Emit a virtual director method to pass a method call on to the * underlying Java object. * * --------------------------------------------------------------- */ int classDirectorMethod(Node *n, Node *parent, String *super) { String *c_classname = Getattr(parent, "name"); String *name = Getattr(n, "name"); String *symname = Getattr(n, "sym:name"); SwigType *returntype = Getattr(n, "type"); String *overloaded_name = getOverloadedName(n); String *storage = Getattr(n, "storage"); String *value = Getattr(n, "value"); String *decl = Getattr(n, "decl"); String *declaration = NewString(""); String *tm; Parm *p; int i; Wrapper *w = NewWrapper(); ParmList *l = Getattr(n, "parms"); bool is_void = !(Cmp(returntype, "void")); String *qualified_return = 0; bool pure_virtual = (!(Cmp(storage, "virtual")) && !(Cmp(value, "0"))); int status = SWIG_OK; bool output_director = true; String *dirclassname = directorClassName(parent); String *qualified_name = NewStringf("%s::%s", dirclassname, name); String *jnidesc = NewString(""); String *classdesc = NewString(""); String *jniret_desc = NewString(""); String *classret_desc = NewString(""); SwigType *c_ret_type = NULL; String *jupcall_args = NewString("swigjobj"); String *imclass_dmethod; String *callback_def = NewString(""); String *callback_code = NewString(""); String *imcall_args = NewString(""); int classmeth_off = curr_class_dmethod - first_class_dmethod; bool ignored_method = GetFlag(n, "feature:ignore") ? true : false; String *qualified_classname = getProxyName(getClassName()); // Kludge Alert: functionWrapper sets sym:overload properly, but it // isn't at this point, so we have to manufacture it ourselves. At least // we're consistent with the sym:overload name in functionWrapper. (?? when // does the overloaded method name get set?) imclass_dmethod = NewStringf("%s", Swig_name_member(getNSpace(), dirclassname, overloaded_name)); qualified_return = SwigType_rcaststr(returntype, "c_result"); if (!is_void && (!ignored_method || pure_virtual)) { if (!SwigType_isclass(returntype)) { if (!(SwigType_ispointer(returntype) || SwigType_isreference(returntype))) { String *construct_result = NewStringf("= SwigValueInit< %s >()", SwigType_lstr(returntype, 0)); Wrapper_add_localv(w, "c_result", SwigType_lstr(returntype, "c_result"), construct_result, NIL); Delete(construct_result); } else { String *base_typename = SwigType_base(returntype); String *resolved_typename = SwigType_typedef_resolve_all(base_typename); Symtab *symtab = Getattr(n, "sym:symtab"); Node *typenode = Swig_symbol_clookup(resolved_typename, symtab); if (SwigType_ispointer(returntype) || (typenode && Getattr(typenode, "abstracts"))) { /* initialize pointers to something sane. Same for abstract classes when a reference is returned. */ Wrapper_add_localv(w, "c_result", SwigType_lstr(returntype, "c_result"), "= 0", NIL); } else { /* If returning a reference, initialize the pointer to a sane default - if a Java exception occurs, then the pointer returns something other than a NULL-initialized reference. */ SwigType *noref_type = SwigType_del_reference(Copy(returntype)); String *noref_ltype = SwigType_lstr(noref_type, 0); String *return_ltype = SwigType_lstr(returntype, 0); Wrapper_add_localv(w, "result_default", "static", noref_ltype, "result_default", NIL); Wrapper_add_localv(w, "c_result", return_ltype, "c_result", NIL); Printf(w->code, "result_default = SwigValueInit< %s >();\n", noref_ltype); Printf(w->code, "c_result = &result_default;\n"); Delete(return_ltype); Delete(noref_ltype); Delete(noref_type); } Delete(base_typename); Delete(resolved_typename); } } else { SwigType *vt; vt = cplus_value_type(returntype); if (!vt) { Wrapper_add_localv(w, "c_result", SwigType_lstr(returntype, "c_result"), NIL); } else { Wrapper_add_localv(w, "c_result", SwigType_lstr(vt, "c_result"), NIL); Delete(vt); } } } /* Create the intermediate class wrapper */ tm = Swig_typemap_lookup("jtype", n, "", 0); if (tm) { Printf(callback_def, " public static %s %s(%s jself", tm, imclass_dmethod, qualified_classname); } else { Swig_warning(WARN_JAVA_TYPEMAP_JTYPE_UNDEF, input_file, line_number, "No jtype typemap defined for %s\n", SwigType_str(returntype, 0)); } String *cdesc = NULL; SwigType *covariant = Getattr(n, "covariant"); SwigType *adjustedreturntype = covariant ? covariant : returntype; Parm *adjustedreturntypeparm = NewParmNode(adjustedreturntype, n); if (Swig_typemap_lookup("directorin", adjustedreturntypeparm, "", 0) && (cdesc = Getattr(adjustedreturntypeparm, "tmap:directorin:descriptor"))) { // Note that in the case of polymorphic (covariant) return types, the // method's return type is changed to be the base of the C++ return // type String *jnidesc_canon = canonicalizeJNIDescriptor(cdesc, adjustedreturntypeparm); Append(classret_desc, jnidesc_canon); Delete(jnidesc_canon); } else { Swig_warning(WARN_TYPEMAP_DIRECTORIN_UNDEF, input_file, line_number, "No or improper directorin typemap defined for %s for use in %s::%s (skipping director method)\n", SwigType_str(returntype, 0), SwigType_namestr(c_classname), SwigType_namestr(name)); output_director = false; } /* Get the JNI field descriptor for this return type, add the JNI field descriptor to jniret_desc */ if ((c_ret_type = Swig_typemap_lookup("jni", n, "", 0))) { Parm *tp = NewParmNode(c_ret_type, n); if (!is_void && !ignored_method) { String *jretval_decl = NewStringf("%s jresult", c_ret_type); Wrapper_add_localv(w, "jresult", jretval_decl, "= 0", NIL); Delete(jretval_decl); } String *jdesc = NULL; if (Swig_typemap_lookup("directorin", tp, "", 0) && (jdesc = Getattr(tp, "tmap:directorin:descriptor"))) { // Objects marshalled passing a Java class across JNI boundary use jobject - the nouse flag indicates this // We need the specific Java class name instead of the generic 'Ljava/lang/Object;' if (GetFlag(tp, "tmap:directorin:nouse")) jdesc = cdesc; String *jnidesc_canon = canonicalizeJNIDescriptor(jdesc, tp); Append(jniret_desc, jnidesc_canon); Delete(jnidesc_canon); } else { Swig_warning(WARN_TYPEMAP_DIRECTORIN_UNDEF, input_file, line_number, "No or improper directorin typemap defined for %s for use in %s::%s (skipping director method)\n", SwigType_str(c_ret_type, 0), SwigType_namestr(c_classname), SwigType_namestr(name)); output_director = false; } Delete(tp); } else { Swig_warning(WARN_JAVA_TYPEMAP_JNI_UNDEF, input_file, line_number, "No jni typemap defined for %s for use in %s::%s (skipping director method)\n", SwigType_str(returntype, 0), SwigType_namestr(c_classname), SwigType_namestr(name)); output_director = false; } Delete(adjustedreturntypeparm); Swig_director_parms_fixup(l); /* Attach the standard typemaps */ Swig_typemap_attach_parms("out", l, 0); Swig_typemap_attach_parms("jni", l, 0); Swig_typemap_attach_parms("jtype", l, 0); Swig_typemap_attach_parms("directorin", l, w); Swig_typemap_attach_parms("javadirectorin", l, 0); Swig_typemap_attach_parms("directorargout", l, w); if (!ignored_method) { /* Add Java environment pointer to wrapper */ String *jenvstr = NewString("jenv"); String *jobjstr = NewString("swigjobj"); Wrapper_add_localv(w, "swigjnienv", "JNIEnvWrapper", "swigjnienv(this)", NIL, NIL); Wrapper_add_localv(w, jenvstr, "JNIEnv *", jenvstr, "= swigjnienv.getJNIEnv()", NIL); Wrapper_add_localv(w, jobjstr, "jobject", jobjstr, "= (jobject) NULL", NIL); Delete(jenvstr); Delete(jobjstr); /* Preamble code */ Printf(w->code, "if (!swig_override[%d]) {\n", classmeth_off); } if (!pure_virtual) { String *super_call = Swig_method_call(super, l); if (is_void) { Printf(w->code, "%s;\n", super_call); if (!ignored_method) Printf(w->code, "return;\n"); } else { Printf(w->code, "return %s;\n", super_call); } Delete(super_call); } else { Printf(w->code, "SWIG_JavaThrowException(JNIEnvWrapper(this).getJNIEnv(), SWIG_JavaDirectorPureVirtual, "); Printf(w->code, "\"Attempted to invoke pure virtual method %s::%s.\");\n", SwigType_namestr(c_classname), SwigType_namestr(name)); /* Make sure that we return something in the case of a pure * virtual method call for syntactical reasons. */ if (!is_void) Printf(w->code, "return %s;", qualified_return); else if (!ignored_method) Printf(w->code, "return;\n"); } if (!ignored_method) { Printf(w->code, "}\n"); Printf(w->code, "swigjobj = swig_get_self(jenv);\n"); Printf(w->code, "if (swigjobj && jenv->IsSameObject(swigjobj, NULL) == JNI_FALSE) {\n"); } /* Start the Java field descriptor for the intermediate class's upcall (insert jself object) */ Parm *tp = NewParmNode(c_classname, n); String *jdesc; if ((tm = Swig_typemap_lookup("directorin", tp, "", 0)) && (jdesc = Getattr(tp, "tmap:directorin:descriptor"))) { String *jni_canon = canonicalizeJNIDescriptor(jdesc, tp); Append(jnidesc, jni_canon); Delete(jni_canon); Delete(tm); } else { Swig_warning(WARN_TYPEMAP_DIRECTORIN_UNDEF, input_file, line_number, "No or improper directorin typemap for type %s for use in %s::%s (skipping director method)\n", SwigType_str(returntype, 0), SwigType_namestr(c_classname), SwigType_namestr(name)); output_director = false; } Delete(tp); /* Go through argument list, convert from native to Java */ for (i = 0, p = l; p; ++i) { /* Is this superfluous? */ while (checkAttribute(p, "tmap:directorin:numinputs", "0")) { p = Getattr(p, "tmap:directorin:next"); } SwigType *pt = Getattr(p, "type"); String *ln = makeParameterName(n, p, i, false); String *c_param_type = NULL; String *c_decl = NewString(""); String *arg = NewString(""); Printf(arg, "j%s", ln); /* Add various typemap's 'throws' clauses */ addThrows(n, "tmap:directorin", p); addThrows(n, "tmap:out", p); /* And add to the upcall args */ Printf(jupcall_args, ", %s", arg); /* Get parameter's intermediary C type */ if ((c_param_type = Getattr(p, "tmap:jni"))) { Parm *tp = NewParm(c_param_type, Getattr(p, "name"), n); String *desc_tm = NULL, *jdesc = NULL, *cdesc = NULL; /* Add to local variables */ Printf(c_decl, "%s %s", c_param_type, arg); if (!ignored_method) Wrapper_add_localv(w, arg, c_decl, (!(SwigType_ispointer(pt) || SwigType_isreference(pt)) ? "" : "= 0"), NIL); /* Add input marshalling code and update JNI field descriptor */ if ((desc_tm = Swig_typemap_lookup("directorin", tp, "", 0)) && (jdesc = Getattr(tp, "tmap:directorin:descriptor")) && (tm = Getattr(p, "tmap:directorin")) && (cdesc = Getattr(p, "tmap:directorin:descriptor"))) { // Objects marshalled by passing a Java class across the JNI boundary use jobject as the JNI type - // the nouse flag indicates this. We need the specific Java class name instead of the generic 'Ljava/lang/Object;' if (GetFlag(tp, "tmap:directorin:nouse")) jdesc = cdesc; String *jni_canon = canonicalizeJNIDescriptor(jdesc, tp); Append(jnidesc, jni_canon); Delete(jni_canon); Setattr(p, "emit:directorinput", arg); Replaceall(tm, "$input", arg); Replaceall(tm, "$owner", "0"); if (Len(tm)) if (!ignored_method) Printf(w->code, "%s\n", tm); /* Add parameter to the intermediate class code if generating the * intermediate's upcall code */ if ((tm = Getattr(p, "tmap:jtype"))) { String *din = Copy(Getattr(p, "tmap:javadirectorin")); addThrows(n, "tmap:javadirectorin", p); if (din) { Replaceall(din, "$module", module_class_name); Replaceall(din, "$imclassname", imclass_name); substituteClassname(pt, din); Replaceall(din, "$jniinput", ln); if (i > 0) Printf(imcall_args, ", "); Printf(callback_def, ", %s %s", tm, ln); if (Cmp(din, ln)) { Printv(imcall_args, din, NIL); } else Printv(imcall_args, ln, NIL); jni_canon = canonicalizeJNIDescriptor(cdesc, p); Append(classdesc, jni_canon); Delete(jni_canon); } else { Swig_warning(WARN_JAVA_TYPEMAP_JAVADIRECTORIN_UNDEF, input_file, line_number, "No javadirectorin typemap defined for %s for use in %s::%s (skipping director method)\n", SwigType_str(pt, 0), SwigType_namestr(c_classname), SwigType_namestr(name)); output_director = false; } } else { Swig_warning(WARN_JAVA_TYPEMAP_JTYPE_UNDEF, input_file, line_number, "No jtype typemap defined for %s for use in %s::%s (skipping director method)\n", SwigType_str(pt, 0), SwigType_namestr(c_classname), SwigType_namestr(name)); output_director = false; } p = Getattr(p, "tmap:directorin:next"); Delete(desc_tm); } else { if (!desc_tm) { Swig_warning(WARN_JAVA_TYPEMAP_JAVADIRECTORIN_UNDEF, input_file, line_number, "No or improper directorin typemap defined for %s for use in %s::%s (skipping director method)\n", SwigType_str(c_param_type, 0), SwigType_namestr(c_classname), SwigType_namestr(name)); p = nextSibling(p); } else if (!jdesc) { Swig_warning(WARN_JAVA_TYPEMAP_DIRECTORIN_NODESC, input_file, line_number, "Missing JNI descriptor in directorin typemap defined for %s for use in %s::%s (skipping director method)\n", SwigType_str(c_param_type, 0), SwigType_namestr(c_classname), SwigType_namestr(name)); p = Getattr(p, "tmap:directorin:next"); } else if (!tm) { Swig_warning(WARN_JAVA_TYPEMAP_JAVADIRECTORIN_UNDEF, input_file, line_number, "No or improper directorin typemap defined for argument %s for use in %s::%s (skipping director method)\n", SwigType_str(pt, 0), SwigType_namestr(c_classname), SwigType_namestr(name)); p = nextSibling(p); } else if (!cdesc) { Swig_warning(WARN_JAVA_TYPEMAP_DIRECTORIN_NODESC, input_file, line_number, "Missing JNI descriptor in directorin typemap defined for %s for use in %s::%s (skipping director method)\n", SwigType_str(pt, 0), SwigType_namestr(c_classname), SwigType_namestr(name)); p = Getattr(p, "tmap:directorin:next"); } output_director = false; } } else { Swig_warning(WARN_JAVA_TYPEMAP_JNI_UNDEF, input_file, line_number, "No jni typemap defined for %s for use in %s::%s (skipping director method)\n", SwigType_str(pt, 0), SwigType_namestr(c_classname), SwigType_namestr(name)); output_director = false; p = nextSibling(p); } Delete(arg); Delete(c_decl); Delete(ln); } /* header declaration, start wrapper definition */ String *target; SwigType *rtype = Getattr(n, "conversion_operator") ? 0 : Getattr(n, "classDirectorMethods:type"); target = Swig_method_decl(rtype, decl, qualified_name, l, 0); Printf(w->def, "%s", target); Delete(qualified_name); Delete(target); target = Swig_method_decl(rtype, decl, name, l, 1); Printf(declaration, " virtual %s", target); Delete(target); // Add any exception specifications to the methods in the director class // Get any Java exception classes in the throws typemap ParmList *throw_parm_list = NULL; // May need to add Java throws clause to director methods if %catches defined // Get any Java exception classes in the throws typemap ParmList *catches_list = Getattr(n, "catchlist"); if (catches_list) { Swig_typemap_attach_parms("throws", catches_list, 0); Swig_typemap_attach_parms("directorthrows", catches_list, 0); for (p = catches_list; p; p = nextSibling(p)) { addThrows(n, "tmap:throws", p); } } if (Getattr(n, "noexcept")) { Append(w->def, " noexcept"); Append(declaration, " noexcept"); } if ((throw_parm_list = Getattr(n, "throws")) || Getattr(n, "throw")) { int gencomma = 0; Append(w->def, " throw("); Append(declaration, " throw("); if (throw_parm_list) { Swig_typemap_attach_parms("throws", throw_parm_list, 0); Swig_typemap_attach_parms("directorthrows", throw_parm_list, 0); } for (p = throw_parm_list; p; p = nextSibling(p)) { if (Getattr(p, "tmap:throws")) { // %catches replaces the specified exception specification if (!catches_list) { addThrows(n, "tmap:throws", p); } if (gencomma++) { Append(w->def, ", "); Append(declaration, ", "); } Printf(w->def, "%s", SwigType_str(Getattr(p, "type"), 0)); Printf(declaration, "%s", SwigType_str(Getattr(p, "type"), 0)); } } Append(w->def, ")"); Append(declaration, ")"); } Append(w->def, " {"); Append(declaration, ";\n"); /* Emit the intermediate class's upcall to the actual class */ String *upcall = NewStringf("jself.%s(%s)", symname, imcall_args); // Handle exception classes specified in the "except" feature's "throws" attribute addThrows(n, "feature:except", n); if (!is_void) { if ((tm = Swig_typemap_lookup("javadirectorout", n, "", 0))) { addThrows(n, "tmap:javadirectorout", n); substituteClassname(returntype, tm); Replaceall(tm, "$javacall", upcall); Printf(callback_code, " return %s;\n", tm); } if ((tm = Swig_typemap_lookup("out", n, "", 0))) addThrows(n, "tmap:out", n); Delete(tm); } else Printf(callback_code, " %s;\n", upcall); Printf(callback_code, " }\n"); Delete(upcall); /* Finish off the inherited upcall's definition */ Putc(')', callback_def); generateThrowsClause(n, callback_def); Printf(callback_def, " {\n"); if (!ignored_method) { /* Emit the actual upcall through */ String *imclass_desc = NewStringf("(%s)%s", jnidesc, jniret_desc); String *class_desc = NewStringf("(%s)%s", classdesc, classret_desc); UpcallData *udata = addUpcallMethod(imclass_dmethod, symname, imclass_desc, class_desc, decl); String *methid = Getattr(udata, "imclass_methodidx"); String *methop = getUpcallJNIMethod(jniret_desc); if (!is_void) Printf(w->code, "jresult = (%s) ", c_ret_type); Printf(w->code, "jenv->%s(Swig::jclass_%s, Swig::director_method_ids[%s], %s);\n", methop, imclass_name, methid, jupcall_args); // Generate code to handle any Java exception thrown by director delegation directorExceptHandler(n, catches_list ? catches_list : throw_parm_list, w); if (!is_void) { String *jresult_str = NewString("jresult"); String *result_str = NewString("c_result"); /* Copy jresult into c_result... */ if ((tm = Swig_typemap_lookup("directorout", n, result_str, w))) { addThrows(n, "tmap:directorout", n); Replaceall(tm, "$input", jresult_str); Replaceall(tm, "$result", result_str); Printf(w->code, "%s\n", tm); } else { Swig_warning(WARN_TYPEMAP_DIRECTOROUT_UNDEF, input_file, line_number, "Unable to use return type %s used in %s::%s (skipping director method)\n", SwigType_str(returntype, 0), SwigType_namestr(c_classname), SwigType_namestr(name)); output_director = false; } Delete(jresult_str); Delete(result_str); } /* Marshal outputs */ for (p = l; p;) { if ((tm = Getattr(p, "tmap:directorargout"))) { addThrows(n, "tmap:directorargout", p); Replaceall(tm, "$result", makeParameterName(n, p, i, false)); Replaceall(tm, "$input", Getattr(p, "emit:directorinput")); Printv(w->code, tm, "\n", NIL); p = Getattr(p, "tmap:directorargout:next"); } else { p = nextSibling(p); } } Delete(imclass_desc); Delete(class_desc); /* Terminate wrapper code */ Printf(w->code, "} else {\n"); Printf(w->code, "SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, \"null upcall object in %s::%s \");\n", SwigType_namestr(c_classname), SwigType_namestr(name)); Printf(w->code, "}\n"); Printf(w->code, "if (swigjobj) jenv->DeleteLocalRef(swigjobj);\n"); if (!is_void) Printf(w->code, "return %s;", qualified_return); } Printf(w->code, "}"); // We expose virtual protected methods via an extra public inline method which makes a straight call to the wrapped class' method String *inline_extra_method = NewString(""); if (dirprot_mode() && !is_public(n) && !pure_virtual) { Printv(inline_extra_method, declaration, NIL); String *extra_method_name = NewStringf("%sSwigPublic", name); Replaceall(inline_extra_method, name, extra_method_name); Replaceall(inline_extra_method, ";\n", " {\n "); if (!is_void) Printf(inline_extra_method, "return "); String *methodcall = Swig_method_call(super, l); Printv(inline_extra_method, methodcall, ";\n }\n", NIL); Delete(methodcall); Delete(extra_method_name); } /* emit the director method */ if (status == SWIG_OK && output_director) { if (!is_void) { Replaceall(w->code, "$null", qualified_return); } else { Replaceall(w->code, "$null", ""); } if (!GetFlag(n, "feature:ignore")) Printv(imclass_directors, callback_def, callback_code, NIL); if (!Getattr(n, "defaultargs")) { Replaceall(w->code, "$symname", symname); Wrapper_print(w, f_directors); Printv(f_directors_h, declaration, NIL); Printv(f_directors_h, inline_extra_method, NIL); } } Delete(inline_extra_method); Delete(qualified_return); Delete(jnidesc); Delete(c_ret_type); Delete(jniret_desc); Delete(declaration); Delete(callback_def); Delete(callback_code); DelWrapper(w); return status; } /* ------------------------------------------------------------ * directorExceptHandler() * * Emit code to map Java exceptions back to C++ exceptions when * feature("director:except") is applied to a method node. * This is generated after the Java method upcall. * ------------------------------------------------------------ */ void directorExceptHandler(Node *n, ParmList *throw_parm_list, Wrapper *w) { String *directorexcept = Getattr(n, "feature:director:except"); if (!directorexcept) { directorexcept = NewString(""); Printf(directorexcept, "jthrowable $error = jenv->ExceptionOccurred();\n"); Printf(directorexcept, "if ($error) {"); Printf(directorexcept, "$directorthrowshandlers\n"); Printf(directorexcept, " Swig::DirectorException::raise(jenv, $error);\n"); Printf(directorexcept, "}\n"); } else { directorexcept = Copy(directorexcept); } // Can explicitly disable director:except by setting to "" or "0" if (Len(directorexcept) > 0 && Cmp(directorexcept, "0") != 0) { // Replace $packagepath substitutePackagePath(directorexcept, 0); // Replace $directorthrowshandlers with any defined typemap handlers (or nothing) if (Strstr(directorexcept, "$directorthrowshandlers")) { String *directorthrowshandlers_code = NewString(""); for (Parm *p = throw_parm_list; p; p = nextSibling(p)) { String *tm = Getattr(p, "tmap:directorthrows"); if (tm) { // replace $packagepath/$javaclassname String *directorthrows = canonicalizeJNIDescriptor(tm, p); Printv(directorthrowshandlers_code, directorthrows, NIL); Delete(directorthrows); } else { String *t = Getattr(p,"type"); Swig_warning(WARN_TYPEMAP_DIRECTORTHROWS_UNDEF, Getfile(n), Getline(n), "No directorthrows typemap defined for %s\n", SwigType_str(t, 0)); } } Replaceall(directorexcept, "$directorthrowshandlers", directorthrowshandlers_code); Delete(directorthrowshandlers_code); } Replaceall(directorexcept, "$error", "swigerror"); Printf(w->code, " %s\n", directorexcept); } Delete(directorexcept); } /* ------------------------------------------------------------ * directorPrefixArgs() * ------------------------------------------------------------ */ void directorPrefixArgs(Node *n) { Parm *p; /* Need to prepend 'jenv' to the director constructor's argument list */ String *jenv_type = NewString("JNIEnv"); SwigType_add_pointer(jenv_type); p = NewParm(jenv_type, NewString("jenv"), n); Setattr(p, "arg:byname", "1"); set_nextSibling(p, NULL); Setattr(n, "director:prefix_args", p); } /* ------------------------------------------------------------ * classDirectorConstructor() * ------------------------------------------------------------ */ int classDirectorConstructor(Node *n) { Node *parent = parentNode(n); String *decl = Getattr(n, "decl"); String *supername = Swig_class_name(parent); String *dirclassname = directorClassName(parent); String *sub = NewString(""); Parm *p; ParmList *superparms = Getattr(n, "parms"); ParmList *parms; int argidx = 0; /* Assign arguments to superclass's parameters, if not already done */ for (p = superparms; p; p = nextSibling(p)) { String *pname = Getattr(p, "name"); if (!pname) { pname = NewStringf("arg%d", argidx++); Setattr(p, "name", pname); } } /* insert jenv prefix argument */ parms = CopyParmList(superparms); String *jenv_type = NewString("JNIEnv"); SwigType_add_pointer(jenv_type); p = NewParm(jenv_type, NewString("jenv"), n); set_nextSibling(p, parms); parms = p; directorPrefixArgs(n); if (!Getattr(n, "defaultargs")) { /* constructor */ { String *basetype = Getattr(parent, "classtype"); String *target = Swig_method_decl(0, decl, dirclassname, parms, 0); String *call = Swig_csuperclass_call(0, basetype, superparms); String *classtype = SwigType_namestr(Getattr(n, "name")); Printf(f_directors, "%s::%s : %s, %s {\n", dirclassname, target, call, Getattr(parent, "director:ctor")); Printf(f_directors, "}\n\n"); Delete(classtype); Delete(target); Delete(call); } /* constructor header */ { String *target = Swig_method_decl(0, decl, dirclassname, parms, 1); Printf(f_directors_h, " %s;\n", target); Delete(target); } } Delete(sub); Delete(supername); Delete(jenv_type); Delete(parms); Delete(dirclassname); return Language::classDirectorConstructor(n); } /* ------------------------------------------------------------ * classDirectorDefaultConstructor() * ------------------------------------------------------------ */ int classDirectorDefaultConstructor(Node *n) { String *classname = Swig_class_name(n); String *classtype = SwigType_namestr(Getattr(n, "name")); String *dirClassName = directorClassName(n); Wrapper *w = NewWrapper(); Printf(w->def, "%s::%s(JNIEnv *jenv) : %s {", dirClassName, dirClassName, Getattr(n, "director:ctor")); Printf(w->code, "}\n"); Wrapper_print(w, f_directors); Printf(f_directors_h, " %s(JNIEnv *jenv);\n", dirClassName); DelWrapper(w); Delete(classtype); Delete(classname); Delete(dirClassName); directorPrefixArgs(n); return Language::classDirectorDefaultConstructor(n); } /* ------------------------------------------------------------ * classDirectorInit() * ------------------------------------------------------------ */ int classDirectorInit(Node *n) { Delete(none_comparison); none_comparison = NewString(""); // not used Delete(director_ctor_code); director_ctor_code = NewString("$director_new"); directorDeclaration(n); Printf(f_directors_h, "%s {\n", Getattr(n, "director:decl")); Printf(f_directors_h, "\npublic:\n"); Printf(f_directors_h, " void swig_connect_director(JNIEnv *jenv, jobject jself, jclass jcls, bool swig_mem_own, bool weak_global);\n"); /* Keep track of the director methods for this class */ first_class_dmethod = curr_class_dmethod = n_dmethods; return Language::classDirectorInit(n); } /* ---------------------------------------------------------------------- * classDirectorDestructor() * ---------------------------------------------------------------------- */ int classDirectorDestructor(Node *n) { Node *current_class = getCurrentClass(); String *full_classname = Getattr(current_class, "name"); String *classname = Swig_class_name(current_class); String *dirClassName = directorClassName(current_class); Wrapper *w = NewWrapper(); if (Getattr(n, "noexcept")) { Printf(f_directors_h, " virtual ~%s() noexcept;\n", dirClassName); Printf(w->def, "%s::~%s() noexcept {\n", dirClassName, dirClassName); } else if (Getattr(n, "throw")) { Printf(f_directors_h, " virtual ~%s() throw();\n", dirClassName); Printf(w->def, "%s::~%s() throw() {\n", dirClassName, dirClassName); } else { Printf(f_directors_h, " virtual ~%s();\n", dirClassName); Printf(w->def, "%s::~%s() {\n", dirClassName, dirClassName); } /* Ensure that correct directordisconnect typemap's method name is called * here: */ Node *disconn_attr = NewHash(); String *disconn_methodname = NULL; typemapLookup(n, "directordisconnect", full_classname, WARN_NONE, disconn_attr); disconn_methodname = Getattr(disconn_attr, "tmap:directordisconnect:methodname"); Printv(w->code, " swig_disconnect_director_self(\"", disconn_methodname, "\");\n", "}\n", NIL); Wrapper_print(w, f_directors); DelWrapper(w); Delete(disconn_attr); Delete(classname); Delete(dirClassName); return SWIG_OK; } /* ------------------------------------------------------------ * classDirectorEnd() * ------------------------------------------------------------ */ int classDirectorEnd(Node *n) { String *full_classname = Getattr(n, "name"); String *classname = getProxyName(full_classname, true); String *director_classname = directorClassName(n); String *internal_classname; Wrapper *w = NewWrapper(); if (Len(package_path) > 0) internal_classname = NewStringf("%s/%s", package_path, classname); else internal_classname = NewStringf("%s", classname); // If the namespace is multiple levels, the result of getNSpace() will have inserted // .'s to delimit namespaces, so we need to replace those with /'s Replace(internal_classname, NSPACE_SEPARATOR, "/", DOH_REPLACE_ANY); Wrapper_add_localv(w, "baseclass", "static jclass baseclass", "= 0", NIL); Printf(w->def, "void %s::swig_connect_director(JNIEnv *jenv, jobject jself, jclass jcls, bool swig_mem_own, bool weak_global) {", director_classname); if (first_class_dmethod != curr_class_dmethod) { Printf(w->def, "static struct {\n"); Printf(w->def, "const char *mname;\n"); Printf(w->def, "const char *mdesc;\n"); Printf(w->def, "jmethodID base_methid;\n"); Printf(w->def, "} methods[] = {\n"); for (int i = first_class_dmethod; i < curr_class_dmethod; ++i) { UpcallData *udata = Getitem(dmethods_seq, i); Printf(w->def, "{ \"%s\", \"%s\", NULL }", Getattr(udata, "method"), Getattr(udata, "fdesc")); if (i != curr_class_dmethod - 1) Putc(',', w->def); Putc('\n', w->def); } Printf(w->def, "};\n"); } Printf(w->code, "if (swig_set_self(jenv, jself, swig_mem_own, weak_global)) {\n"); Printf(w->code, "if (!baseclass) {\n"); Printf(w->code, "baseclass = jenv->FindClass(\"%s\");\n", internal_classname); Printf(w->code, "if (!baseclass) return;\n"); Printf(w->code, "baseclass = (jclass) jenv->NewGlobalRef(baseclass);\n"); Printf(w->code, "}\n"); int n_methods = curr_class_dmethod - first_class_dmethod; if (n_methods) { /* Emit the swig_overrides() method and the swig_override array */ Printf(f_directors_h, "public:\n"); Printf(f_directors_h, " bool swig_overrides(int n) {\n"); Printf(f_directors_h, " return (n < %d ? swig_override[n] : false);\n", n_methods); Printf(f_directors_h, " }\n"); Printf(f_directors_h, "protected:\n"); Printf(f_directors_h, " Swig::BoolArray<%d> swig_override;\n", n_methods); /* Emit the code to look up the class's methods, initialize the override array */ Printf(w->code, "bool derived = (jenv->IsSameObject(baseclass, jcls) ? false : true);\n"); Printf(w->code, "for (int i = 0; i < %d; ++i) {\n", n_methods); Printf(w->code, " if (!methods[i].base_methid) {\n"); Printf(w->code, " methods[i].base_methid = jenv->GetMethodID(baseclass, methods[i].mname, methods[i].mdesc);\n"); Printf(w->code, " if (!methods[i].base_methid) return;\n"); Printf(w->code, " }\n"); // Generally, derived classes have a mix of overridden and // non-overridden methods and it is worth making a GetMethodID // check during initialization to determine if each method is // overridden, thus avoiding unnecessary calls into Java. // // On the other hand, when derived classes are // expected to override all director methods then the // GetMethodID calls are inefficient, and it is better to let // the director unconditionally call up into Java. The resulting code // will still behave correctly (though less efficiently) when Java // code doesn't override a given method. // // The assumeoverride feature on a director controls whether or not // overrides are assumed. if (GetFlag(n, "feature:director:assumeoverride")) { Printf(w->code, " swig_override[i] = derived;\n"); } else { Printf(w->code, " swig_override[i] = false;\n"); Printf(w->code, " if (derived) {\n"); Printf(w->code, " jmethodID methid = jenv->GetMethodID(jcls, methods[i].mname, methods[i].mdesc);\n"); Printf(w->code, " swig_override[i] = (methid != methods[i].base_methid);\n"); Printf(w->code, " jenv->ExceptionClear();\n"); Printf(w->code, " }\n"); } Printf(w->code, "}\n"); } else { Printf(f_directors_h, "public:\n"); Printf(f_directors_h, " bool swig_overrides(int n) {\n"); Printf(f_directors_h, " return false;\n"); Printf(f_directors_h, " }\n"); } Printf(f_directors_h, "};\n\n"); Printf(w->code, "}\n"); Printf(w->code, "}\n"); Wrapper_print(w, f_directors); DelWrapper(w); Delete(internal_classname); return Language::classDirectorEnd(n); } /* -------------------------------------------------------------------- * classDirectorDisown() * ------------------------------------------------------------------*/ virtual int classDirectorDisown(Node *n) { (void) n; return SWIG_OK; } /*---------------------------------------------------------------------- * extraDirectorProtectedCPPMethodsRequired() *--------------------------------------------------------------------*/ bool extraDirectorProtectedCPPMethodsRequired() const { return false; } /*---------------------------------------------------------------------- * directorDeclaration() * * Generate the director class's declaration * e.g. "class SwigDirector_myclass : public myclass, public Swig::Director {" *--------------------------------------------------------------------*/ void directorDeclaration(Node *n) { String *base = Getattr(n, "classtype"); String *class_ctor = NewString("Swig::Director(jenv)"); String *directorname = directorClassName(n); String *declaration = Swig_class_declaration(n, directorname); Printf(declaration, " : public %s, public Swig::Director", base); // Stash stuff for later. Setattr(n, "director:decl", declaration); Setattr(n, "director:ctor", class_ctor); } /*---------------------------------------------------------------------- * nestedClassesSupport() *--------------------------------------------------------------------*/ NestedClassSupport nestedClassesSupport() const { return NCS_Full; } }; /* class JAVA */ /* ----------------------------------------------------------------------------- * swig_java() - Instantiate module * ----------------------------------------------------------------------------- */ static Language *new_swig_java() { return new JAVA(); } extern "C" Language *swig_java(void) { return new_swig_java(); } /* ----------------------------------------------------------------------------- * Static member variables * ----------------------------------------------------------------------------- */ const char *JAVA::usage = "\ Java Options (available with -java)\n\ -doxygen - Convert C++ doxygen comments to JavaDoc comments in proxy classes\n\ -debug-doxygen-parser - Display doxygen parser module debugging information\n\ -debug-doxygen-translator - Display doxygen translator module debugging information\n\ -nopgcpp - Suppress premature garbage collection prevention parameter\n\ -noproxy - Generate the low-level functional interface instead\n\ of proxy classes\n\ -oldvarnames - Old intermediary method names for variable wrappers\n\ -package - Set name of the Java package to \n\ \n"; swig-4.0.1/Source/Modules/s-exp.cxx0000644000175000017500000002404313527063513017003 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * s-exp.cxx * * A parse tree represented as Lisp s-expressions. * ----------------------------------------------------------------------------- */ #include "swigmod.h" #include "dohint.h" static const char *usage = "\ S-Exp Options (available with -sexp)\n\ -typemaplang - Typemap language\n\n"; //static Node *view_top = 0; static File *out = 0; class Sexp:public Language { int indent_level; DOHHash *print_circle_hash; int print_circle_count; int hanging_parens; bool need_whitespace; bool need_newline; public: Sexp(): indent_level(0), print_circle_hash(0), print_circle_count(0), hanging_parens(0), need_whitespace(0), need_newline(0) { } virtual ~ Sexp() { } virtual void main(int argc, char *argv[]) { // Add a symbol to the parser for conditional compilation Preprocessor_define("SWIGSEXP 1", 0); SWIG_typemap_lang("sexp"); for (int iX = 0; iX < argc; iX++) { if (strcmp(argv[iX], "-typemaplang") == 0) { Swig_mark_arg(iX); iX++; SWIG_typemap_lang(argv[iX]); Swig_mark_arg(iX); continue; } if (strcmp(argv[iX], "-help") == 0) { fputs(usage, stdout); } } } /* Top of the parse tree */ virtual int top(Node *n) { if (out == 0) { String *outfile = Getattr(n, "outfile"); Replaceall(outfile, "_wrap.cxx", ".lisp"); Replaceall(outfile, "_wrap.c", ".lisp"); out = NewFile(outfile, "w", SWIG_output_files()); if (!out) { FileErrorDisplay(outfile); SWIG_exit(EXIT_FAILURE); } } String *f_sink = NewString(""); Swig_register_filebyname("header", f_sink); Swig_register_filebyname("wrapper", f_sink); Swig_register_filebyname("begin", f_sink); Swig_register_filebyname("runtime", f_sink); Swig_register_filebyname("init", f_sink); Swig_banner_target_lang(out, ";;;"); Language::top(n); Printf(out, "\n"); Printf(out, ";;; Lisp parse tree produced by SWIG\n"); print_circle_hash = NewHash(); print_circle_count = 0; hanging_parens = 0; need_whitespace = 0; need_newline = 0; Sexp_print_node(n); flush_parens(); return SWIG_OK; } void print_indent() { int i; for (i = 0; i < indent_level; i++) { Printf(out, " "); } } void open_paren(const String *oper) { flush_parens(); Printf(out, "("); if (oper) Printf(out, "%s ", oper); indent_level += 2; } void close_paren(bool neednewline = false) { hanging_parens++; if (neednewline) print_lazy_whitespace(); indent_level -= 2; } void flush_parens() { int i; if (hanging_parens) { for (i = 0; i < hanging_parens; i++) Printf(out, ")"); hanging_parens = 0; need_newline = true; need_whitespace = true; } if (need_newline) { Printf(out, "\n"); print_indent(); need_newline = false; need_whitespace = false; } else if (need_whitespace) { Printf(out, " "); need_whitespace = false; } } void print_lazy_whitespace() { need_whitespace = 1; } void print_lazy_newline() { need_newline = 1; } bool internal_key_p(DOH *key) { return ((Cmp(key, "nodeType") == 0) || (Cmp(key, "firstChild") == 0) || (Cmp(key, "lastChild") == 0) || (Cmp(key, "parentNode") == 0) || (Cmp(key, "nextSibling") == 0) || (Cmp(key, "previousSibling") == 0) || (Cmp(key, "csym:nextSibling") == 0) || (Cmp(key, "csym:previousSibling") == 0) || (Cmp(key, "typepass:visit") == 0) || (Cmp(key, "allocate:visit") == 0) || (*(Char(key)) == '$')); } bool boolean_key_p(DOH *key) { return ((Cmp(key, "allocate:default_constructor") == 0) || (Cmp(key, "allocate:default_destructor") == 0) || (Cmp(key, "allows_typedef") == 0) || (Cmp(key, "feature:immutable") == 0)); } bool list_key_p(DOH *key) { return ((Cmp(key, "parms") == 0) || (Cmp(key, "baselist") == 0)); } bool plist_key_p(DOH *key) // true if KEY is the name of data that is a mapping from keys to // values, which should be printed as a plist. { return ((Cmp(key, "typescope") == 0)); } bool maybe_plist_key_p(DOH *key) { return (Strncmp(key, "tmap:", 5) == 0); } bool print_circle(DOH *obj, bool list_p) // We have a complex object, which might be referenced several // times, or even recursively. Use Lisp's reader notation for // circular structures (#n#, #n=). // // An object can be printed in list-mode or object-mode; LIST_P toggles. // return TRUE if OBJ still needs to be printed { flush_parens(); // Following is a silly hack. It works around the limitation of // DOH's hash tables that only work with string keys! char address[32]; sprintf(address, "%p%c", obj, list_p ? 'L' : 'O'); DOH *placeholder = Getattr(print_circle_hash, address); if (placeholder) { Printv(out, placeholder, NIL); return false; } else { String *placeholder = NewStringf("#%d#", ++print_circle_count); Setattr(print_circle_hash, address, placeholder); Printf(out, "#%d=", print_circle_count); return true; } } void Sexp_print_value_of_key(DOH *value, DOH *key) { if ((Cmp(key, "parms") == 0) || (Cmp(key, "wrap:parms") == 0) || (Cmp(key, "kwargs") == 0) || (Cmp(key, "pattern") == 0)) Sexp_print_parms(value); else if (plist_key_p(key)) Sexp_print_plist(value); else if (maybe_plist_key_p(key)) { if (DohIsMapping(value)) Sexp_print_plist(value); else Sexp_print_doh(value); } else if (list_key_p(key)) Sexp_print_list(value); else if (boolean_key_p(key)) Sexp_print_boolean(value); else Sexp_print_doh(value); } void Sexp_print_boolean(DOH *obj) { flush_parens(); /* See DOH/Doh/base.c, DohGetInt() */ if (DohIsString(obj)) { if (atoi(Char(obj)) != 0) Printf(out, "t"); else Printf(out, "nil"); } else Printf(out, "nil"); } void Sexp_print_list(DOH *obj) { if (print_circle(obj, true)) { open_paren(NIL); for (; obj; obj = nextSibling(obj)) { Sexp_print_doh(obj); print_lazy_whitespace(); } close_paren(true); } } void Sexp_print_parms(DOH *obj) { // print it as a list of plists if (print_circle(obj, true)) { open_paren(NIL); for (; obj; obj = nextSibling(obj)) { if (DohIsMapping(obj)) { Iterator k; open_paren(NIL); for (k = First(obj); k.key; k = Next(k)) { if (!internal_key_p(k.key)) { DOH *value = Getattr(obj, k.key); Sexp_print_as_keyword(k.key); Sexp_print_value_of_key(value, k.key); print_lazy_whitespace(); } } close_paren(true); } else Sexp_print_doh(obj); print_lazy_whitespace(); } close_paren(true); } } void Sexp_print_doh(DOH *obj) { flush_parens(); if (DohIsString(obj)) { String *o = Str(obj); Replaceall(o, "\\", "\\\\"); Replaceall(o, "\"", "\\\""); Printf(out, "\"%s\"", o); Delete(o); } else { if (print_circle(obj, false)) { // Dispatch type if (nodeType(obj)) { Sexp_print_node(obj); } else if (DohIsMapping(obj)) { Iterator k; open_paren(NIL); for (k = First(obj); k.key; k = Next(k)) { if (!internal_key_p(k.key)) { DOH *value = Getattr(obj, k.key); flush_parens(); open_paren(NIL); Sexp_print_doh(k.key); Printf(out, " . "); Sexp_print_value_of_key(value, k.key); close_paren(); } } close_paren(); } else if (strcmp(ObjType(obj)->objname, "List") == 0) { int i; open_paren(NIL); for (i = 0; i < Len(obj); i++) { DOH *item = Getitem(obj, i); Sexp_print_doh(item); } close_paren(); } else { // What is it? Printf(out, "#", ObjType(obj)->objname, obj); } } } } void Sexp_print_as_keyword(const DOH *k) { /* Print key, replacing ":" with "-" because : is CL's package prefix */ flush_parens(); String *key = NewString(k); Replaceall(key, ":", "-"); Replaceall(key, "_", "-"); Printf(out, ":%s ", key); Delete(key); } void Sexp_print_plist_noparens(DOH *obj) { /* attributes map names to objects */ Iterator k; bool first; for (k = First(obj), first = true; k.key; k = Next(k), first = false) { if (!internal_key_p(k.key)) { DOH *value = Getattr(obj, k.key); flush_parens(); if (!first) { Printf(out, " "); } Sexp_print_as_keyword(k.key); /* Print value */ Sexp_print_value_of_key(value, k.key); } } } void Sexp_print_plist(DOH *obj) { flush_parens(); if (print_circle(obj, true)) { open_paren(NIL); Sexp_print_plist_noparens(obj); close_paren(); } } void Sexp_print_attributes(Node *obj) { Sexp_print_plist_noparens(obj); } void Sexp_print_node(Node *obj) { Node *cobj; open_paren(nodeType(obj)); /* A node has an attribute list... */ Sexp_print_attributes(obj); /* ... and child nodes. */ cobj = firstChild(obj); if (cobj) { print_lazy_newline(); flush_parens(); Sexp_print_as_keyword("children"); open_paren(NIL); for (; cobj; cobj = nextSibling(cobj)) { Sexp_print_node(cobj); } close_paren(); } close_paren(); } virtual int functionWrapper(Node *n) { ParmList *l = Getattr(n, "parms"); Wrapper *f = NewWrapper(); emit_attach_parmmaps(l, f); Setattr(n, "wrap:parms", l); DelWrapper(f); return SWIG_OK; } }; static Language *new_swig_sexp() { return new Sexp(); } extern "C" Language *swig_sexp(void) { return new_swig_sexp(); } swig-4.0.1/Source/Modules/uffi.cxx0000644000175000017500000002501013527063513016673 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * uffi.cxx * * Uffi language module for SWIG. * ----------------------------------------------------------------------------- */ // TODO: remove remnants of lisptype #include "swigmod.h" static const char *usage = "\ UFFI Options (available with -uffi)\n\ -identifier-converter - \n\ Specifies the type of conversion to do on C identifiers\n\ to convert them to symbols. There are two built-in\n\ converters: 'null' and 'lispify'. The default is\n\ 'null'. If you supply a name other than one of the\n\ built-ins, then a function by that name will be\n\ called to convert identifiers to symbols.\n\ "; class UFFI:public Language { public: virtual void main(int argc, char *argv[]); virtual int top(Node *n); virtual int functionWrapper(Node *n); virtual int constantWrapper(Node *n); virtual int classHandler(Node *n); virtual int membervariableHandler(Node *n); }; static File *f_cl = 0; static struct { int count; String **entries; } defined_foreign_types; static String *identifier_converter = NewString("identifier-convert-null"); static int any_varargs(ParmList *pl) { Parm *p; for (p = pl; p; p = nextSibling(p)) { if (SwigType_isvarargs(Getattr(p, "type"))) return 1; } return 0; } /* utilities */ /* returns new string w/ parens stripped */ static String *strip_parens(String *string) { char *s = Char(string), *p; int len = Len(string); String *res; if (len == 0 || s[0] != '(' || s[len - 1] != ')') { return NewString(string); } p = (char *) malloc(len - 2 + 1); if (!p) { Printf(stderr, "Malloc failed\n"); SWIG_exit(EXIT_FAILURE); } strncpy(p, s + 1, len - 1); p[len - 2] = 0; /* null terminate */ res = NewString(p); free(p); return res; } static String *convert_literal(String *num_param, String *type) { String *num = strip_parens(num_param), *res; char *s = Char(num); /* Make sure doubles use 'd' instead of 'e' */ if (!Strcmp(type, "double")) { String *updated = Copy(num); if (Replace(updated, "e", "d", DOH_REPLACE_ANY) > 1) { Printf(stderr, "Weird!! number %s looks invalid.\n", num); SWIG_exit(EXIT_FAILURE); } Delete(num); return updated; } if (SwigType_type(type) == T_CHAR) { /* Use CL syntax for character literals */ return NewStringf("#\\%s", num_param); } else if (SwigType_type(type) == T_STRING) { /* Use CL syntax for string literals */ return NewStringf("\"%s\"", num_param); } if (Len(num) < 2 || s[0] != '0') { return num; } /* octal or hex */ res = NewStringf("#%c%s", s[1] == 'x' ? 'x' : 'o', s + 2); Delete(num); return res; } static void add_defined_foreign_type(String *type) { if (!defined_foreign_types.count) { /* Make fresh */ defined_foreign_types.count = 1; defined_foreign_types.entries = (String **) malloc(sizeof(String *)); } else { /* make room */ defined_foreign_types.count++; defined_foreign_types.entries = (String **) realloc(defined_foreign_types.entries, defined_foreign_types.count * sizeof(String *)); } if (!defined_foreign_types.entries) { Printf(stderr, "Out of memory\n"); SWIG_exit(EXIT_FAILURE); } /* Fill in the new data */ defined_foreign_types.entries[defined_foreign_types.count - 1] = Copy(type); } static String *get_ffi_type(Node *n, SwigType *ty, const_String_or_char_ptr name) { Node *node = NewHash(); Setattr(node, "type", ty); Setattr(node, "name", name); Setfile(node, Getfile(n)); Setline(node, Getline(n)); const String *tm = Swig_typemap_lookup("ffitype", node, "", 0); Delete(node); if (tm) { return NewString(tm); } else { SwigType *tr = SwigType_typedef_resolve_all(ty); char *type_reduced = Char(tr); int i; //Printf(stdout,"convert_type %s\n", ty); if (SwigType_isconst(tr)) { SwigType_pop(tr); type_reduced = Char(tr); } if (SwigType_ispointer(type_reduced) || SwigType_isarray(ty) || !strncmp(type_reduced, "p.f", 3)) { return NewString(":pointer-void"); } for (i = 0; i < defined_foreign_types.count; i++) { if (!Strcmp(ty, defined_foreign_types.entries[i])) { return NewStringf("#.(%s \"%s\" :type :type)", identifier_converter, ty); } } if (!Strncmp(type_reduced, "enum ", 5)) { return NewString(":int"); } Printf(stderr, "Unsupported data type: %s (was: %s)\n", type_reduced, ty); SWIG_exit(EXIT_FAILURE); } return 0; } static String *get_lisp_type(Node *n, SwigType *ty, const_String_or_char_ptr name) { Node *node = NewHash(); Setattr(node, "type", ty); Setattr(node, "name", name); Setfile(node, Getfile(n)); Setline(node, Getline(n)); const String *tm = Swig_typemap_lookup("lisptype", node, "", 0); Delete(node); return tm ? NewString(tm) : NewString(""); } void UFFI::main(int argc, char *argv[]) { int i; Preprocessor_define("SWIGUFFI 1", 0); SWIG_library_directory("uffi"); SWIG_config_file("uffi.swg"); for (i = 1; i < argc; i++) { if (!strcmp(argv[i], "-identifier-converter")) { char *conv = argv[i + 1]; if (!conv) Swig_arg_error(); Swig_mark_arg(i); Swig_mark_arg(i + 1); i++; /* check for built-ins */ if (!strcmp(conv, "lispify")) { Delete(identifier_converter); identifier_converter = NewString("identifier-convert-lispify"); } else if (!strcmp(conv, "null")) { Delete(identifier_converter); identifier_converter = NewString("identifier-convert-null"); } else { /* Must be user defined */ Delete(identifier_converter); identifier_converter = NewString(conv); } } if (!strcmp(argv[i], "-help")) { Printf(stdout, "%s\n", usage); } } } int UFFI::top(Node *n) { String *module = Getattr(n, "name"); String *output_filename = NewString(""); File *f_null = NewString(""); Printf(output_filename, "%s%s.cl", SWIG_output_directory(), module); f_cl = NewFile(output_filename, "w", SWIG_output_files()); if (!f_cl) { FileErrorDisplay(output_filename); SWIG_exit(EXIT_FAILURE); } Swig_register_filebyname("header", f_null); Swig_register_filebyname("begin", f_null); Swig_register_filebyname("runtime", f_null); Swig_register_filebyname("wrapper", f_cl); Swig_banner_target_lang(f_cl, ";;"); Printf(f_cl, "\n" ";; -*- Mode: Lisp; Syntax: ANSI-Common-Lisp; Base: 10; package: %s -*-\n\n(defpackage :%s\n (:use :common-lisp :uffi))\n\n(in-package :%s)\n", module, module, module); Printf(f_cl, "(eval-when (compile load eval)\n (defparameter *swig-identifier-converter* '%s))\n", identifier_converter); Language::top(n); Delete(f_cl); // Delete the handle, not the file Delete(f_null); return SWIG_OK; } int UFFI::functionWrapper(Node *n) { String *funcname = Getattr(n, "sym:name"); ParmList *pl = Getattr(n, "parms"); Parm *p; int argnum = 0, first = 1; // int varargs = 0; //Language::functionWrapper(n); Printf(f_cl, "(swig-defun \"%s\"\n", funcname); Printf(f_cl, " ("); /* Special cases */ if (ParmList_len(pl) == 0) { Printf(f_cl, ":void"); } else if (any_varargs(pl)) { Printf(f_cl, "#| varargs |#"); // varargs = 1; } else { for (p = pl; p; p = nextSibling(p), argnum++) { String *argname = Getattr(p, "name"); SwigType *argtype = Getattr(p, "type"); String *ffitype = get_ffi_type(n, argtype, argname); String *lisptype = get_lisp_type(n, argtype, argname); int tempargname = 0; if (!argname) { argname = NewStringf("arg%d", argnum); tempargname = 1; } if (!first) { Printf(f_cl, "\n "); } Printf(f_cl, "(%s %s %s)", argname, ffitype, lisptype); first = 0; Delete(ffitype); Delete(lisptype); if (tempargname) Delete(argname); } } Printf(f_cl, ")\n"); /* finish arg list */ Printf(f_cl, " :returning %s\n" //" :strings-convert t\n" //" :call-direct %s\n" //" :optimize-for-space t" ")\n", get_ffi_type(n, Getattr(n, "type"), Swig_cresult_name()) //,varargs ? "nil" : "t" ); return SWIG_OK; } int UFFI::constantWrapper(Node *n) { String *type = Getattr(n, "type"); String *converted_value = convert_literal(Getattr(n, "value"), type); String *name = Getattr(n, "sym:name"); #if 0 Printf(stdout, "constant %s is of type %s. value: %s\n", name, type, converted_value); #endif Printf(f_cl, "(swig-defconstant \"%s\" %s)\n", name, converted_value); Delete(converted_value); return SWIG_OK; } // Includes structs int UFFI::classHandler(Node *n) { String *name = Getattr(n, "sym:name"); String *kind = Getattr(n, "kind"); Node *c; if (Strcmp(kind, "struct")) { Printf(stderr, "Don't know how to deal with %s kind of class yet.\n", kind); Printf(stderr, " (name: %s)\n", name); SWIG_exit(EXIT_FAILURE); } Printf(f_cl, "(swig-def-struct \"%s\"\n \n", name); for (c = firstChild(n); c; c = nextSibling(c)) { SwigType *type = Getattr(c, "type"); SwigType *decl = Getattr(c, "decl"); if (type) { type = Copy(type); SwigType_push(type, decl); String *lisp_type; if (Strcmp(nodeType(c), "cdecl")) { Printf(stderr, "Structure %s has a slot that we can't deal with.\n", name); Printf(stderr, "nodeType: %s, name: %s, type: %s\n", nodeType(c), Getattr(c, "name"), Getattr(c, "type")); SWIG_exit(EXIT_FAILURE); } /* Printf(stdout, "Converting %s in %s\n", type, name); */ lisp_type = get_ffi_type(n, type, Getattr(c, "sym:name")); Printf(f_cl, " (#.(%s \"%s\" :type :slot) %s)\n", identifier_converter, Getattr(c, "sym:name"), lisp_type); Delete(lisp_type); } } // Language::classHandler(n); Printf(f_cl, " )\n"); /* Add this structure to the known lisp types */ //Printf(stdout, "Adding %s foreign type\n", name); add_defined_foreign_type(name); return SWIG_OK; } int UFFI::membervariableHandler(Node *n) { Language::membervariableHandler(n); return SWIG_OK; } extern "C" Language *swig_uffi(void) { return new UFFI(); } swig-4.0.1/Source/Modules/swigmain.cxx0000644000175000017500000002040613527063513017564 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * swigmain.cxx * * Simplified Wrapper and Interface Generator (SWIG) * * This file is the main entry point to SWIG. It collects the command * line options, registers built-in language modules, and instantiates * a module for code generation. If adding new language modules * to SWIG, you would modify this file. * ----------------------------------------------------------------------------- */ #include "swigmod.h" #include /* Module factories. These functions are used to instantiate the built-in language modules. If adding a new language module to SWIG, place a similar function here. Make sure the function has "C" linkage. This is required so that modules can be dynamically loaded in future versions. */ extern "C" { Language *swig_csharp(void); Language *swig_d(void); Language *swig_go(void); Language *swig_guile(void); Language *swig_java(void); Language *swig_javascript(void); Language *swig_lua(void); Language *swig_mzscheme(void); Language *swig_ocaml(void); Language *swig_octave(void); Language *swig_perl5(void); Language *swig_php(void); Language *swig_python(void); Language *swig_r(void); Language *swig_ruby(void); Language *swig_scilab(void); Language *swig_tcl(void); Language *swig_xml(void); } /* Association of command line options to language modules. Place an entry for new language modules here, keeping the list sorted alphabetically. */ static TargetLanguageModule modules[] = { {"-allegrocl", NULL, "ALLEGROCL", Disabled}, {"-chicken", NULL, "CHICKEN", Disabled}, {"-clisp", NULL, "CLISP", Disabled}, {"-cffi", NULL, "CFFI", Disabled}, {"-csharp", swig_csharp, "C#", Supported}, {"-d", swig_d, "D", Supported}, {"-go", swig_go, "Go", Supported}, {"-guile", swig_guile, "Guile", Supported}, {"-java", swig_java, "Java", Supported}, {"-javascript", swig_javascript, "Javascript", Supported}, {"-lua", swig_lua, "Lua", Supported}, {"-modula3", NULL, "Modula 3", Disabled}, {"-mzscheme", swig_mzscheme, "MzScheme/Racket", Experimental}, {"-ocaml", swig_ocaml, "OCaml", Experimental}, {"-octave", swig_octave, "Octave", Supported}, {"-perl", swig_perl5, NULL, Supported}, {"-perl5", swig_perl5, "Perl 5", Supported}, {"-php", swig_php, NULL, Supported}, {"-php5", NULL, "PHP 5", Disabled}, {"-php7", swig_php, "PHP 7", Supported}, {"-pike", NULL, "Pike", Disabled}, {"-python", swig_python, "Python", Supported}, {"-r", swig_r, "R (aka GNU S)", Supported}, {"-ruby", swig_ruby, "Ruby", Supported}, {"-scilab", swig_scilab, "Scilab", Supported}, {"-sexp", NULL, "Lisp S-Expressions", Disabled}, {"-tcl", swig_tcl, NULL, Supported}, {"-tcl8", swig_tcl, "Tcl 8", Supported}, {"-uffi", NULL, "Common Lisp / UFFI", Disabled}, {"-xml", swig_xml, "XML", Supported}, {NULL, NULL, NULL, Disabled} }; #ifdef MACSWIG #include #include #endif //----------------------------------------------------------------- // main() // // Main program. Initializes the files and starts the parser. //----------------------------------------------------------------- void SWIG_merge_envopt(const char *env, int oargc, char *oargv[], int *nargc, char ***nargv) { if (!env) { *nargc = oargc; *nargv = (char **)malloc(sizeof(char *) * (oargc + 1)); memcpy(*nargv, oargv, sizeof(char *) * (oargc + 1)); return; } int argc = 1; int arge = oargc + 1024; char **argv = (char **) malloc(sizeof(char *) * (arge + 1)); char *buffer = (char *) malloc(2048); char *b = buffer; char *be = b + 1023; const char *c = env; while ((b != be) && *c && (argc < arge)) { while (isspace(*c) && *c) ++c; if (*c) { argv[argc] = b; ++argc; } while ((b != be) && *c && !isspace(*c)) { *(b++) = *(c++); } *b++ = 0; } argv[0] = oargv[0]; for (int i = 1; (i < oargc) && (argc < arge); ++i, ++argc) { argv[argc] = oargv[i]; } argv[argc] = NULL; *nargc = argc; *nargv = argv; } static void insert_option(int *argc, char ***argv, int index, char const *start, char const *end) { int new_argc = *argc; char **new_argv = *argv; size_t option_len = end - start; // Preserve the NULL pointer at argv[argc] new_argv = (char **)realloc(new_argv, (new_argc + 2) * sizeof(char *)); memmove(&new_argv[index + 1], &new_argv[index], sizeof(char *) * (new_argc + 1 - index)); new_argc++; new_argv[index] = (char *)malloc(option_len + 1); memcpy(new_argv[index], start, option_len); new_argv[index][option_len] = '\0'; *argc = new_argc; *argv = new_argv; } static void merge_options_files(int *argc, char ***argv) { static const int BUFFER_SIZE = 4096; char buffer[BUFFER_SIZE]; int i; int insert; char **new_argv = *argv; int new_argc = *argc; FILE *f; i = 1; while (i < new_argc) { if (new_argv[i] && new_argv[i][0] == '@' && (f = fopen(&new_argv[i][1], "r"))) { char c; char *b; char *be = &buffer[BUFFER_SIZE]; int quote = 0; bool escape = false; new_argc--; memmove(&new_argv[i], &new_argv[i + 1], sizeof(char *) * (new_argc - i)); insert = i; b = buffer; while ((c = fgetc(f)) != EOF) { if (escape) { if (b != be) { *b = c; ++b; } escape = false; } else if (c == '\\') { escape = true; } else if (!quote && (c == '\'' || c == '"')) { quote = c; } else if (quote && c == quote) { quote = 0; } else if (isspace(c) && !quote) { if (b != buffer) { insert_option(&new_argc, &new_argv, insert, buffer, b); insert++; b = buffer; } } else if (b != be) { *b = c; ++b; } } if (b != buffer) insert_option(&new_argc, &new_argv, insert, buffer, b); fclose(f); } else { ++i; } } *argv = new_argv; *argc = new_argc; } int main(int margc, char **margv) { int i; const TargetLanguageModule *language_module = 0; int argc; char **argv; SWIG_merge_envopt(getenv("SWIG_FEATURES"), margc, margv, &argc, &argv); merge_options_files(&argc, &argv); #ifdef MACSWIG SIOUXSettings.asktosaveonclose = false; argc = ccommand(&argv); #endif Swig_init_args(argc, argv); /* Get options */ for (i = 1; i < argc; i++) { if (argv[i]) { bool is_target_language_module = false; for (int j = 0; modules[j].name; j++) { if (strcmp(modules[j].name, argv[i]) == 0) { language_module = &modules[j]; is_target_language_module = true; break; } } if (is_target_language_module) { Swig_mark_arg(i); if (language_module->status == Disabled) { if (language_module->help) Printf(stderr, "Target language option %s (%s) is no longer supported.\n", language_module->name, language_module->help); else Printf(stderr, "Target language option %s is no longer supported.\n", language_module->name); SWIG_exit(EXIT_FAILURE); } } else if ((strcmp(argv[i], "-help") == 0) || (strcmp(argv[i], "--help") == 0)) { if (strcmp(argv[i], "--help") == 0) strcpy(argv[i], "-help"); Printf(stdout, "Supported Target Language Options\n"); for (int j = 0; modules[j].name; j++) { if (modules[j].help && modules[j].status == Supported) { Printf(stdout, " %-15s - Generate %s wrappers\n", modules[j].name, modules[j].help); } } Printf(stdout, "\nExperimental Target Language Options\n"); for (int j = 0; modules[j].name; j++) { if (modules[j].help && modules[j].status == Experimental) { Printf(stdout, " %-15s - Generate %s wrappers\n", modules[j].name, modules[j].help); } } // Swig_mark_arg not called as the general -help options also need to be displayed later on } } } int res = SWIG_main(argc, argv, language_module); return res; } swig-4.0.1/Source/Modules/interface.cxx0000644000175000017500000001613713527063513017714 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * interface.cxx * * This module contains support for the interface feature. * This feature is used in language modules where the target language does not * naturally support C++ style multiple inheritance, but does support inheritance * from multiple interfaces. * ----------------------------------------------------------------------------- */ #include "swigmod.h" static bool interface_feature_enabled = false; /* ----------------------------------------------------------------------------- * collect_interface_methods() * * Create a list of all the methods from the base classes of class n that are * marked as an interface. The resulting list is thus the list of methods that * need to be implemented in order for n to be non-abstract. * ----------------------------------------------------------------------------- */ static List *collect_interface_methods(Node *n) { List *methods = NewList(); if (Hash *bases = Getattr(n, "interface:bases")) { List *keys = Keys(bases); for (Iterator base = First(keys); base.item; base = Next(base)) { Node *cls = Getattr(bases, base.item); if (cls == n) continue; for (Node *child = firstChild(cls); child; child = nextSibling(child)) { if (Cmp(nodeType(child), "cdecl") == 0) { if (GetFlag(child, "feature:ignore") || Getattr(child, "interface:owner")) continue; // skip methods propagated to bases Node *m = Copy(child); set_nextSibling(m, NIL); set_previousSibling(m, NIL); Setattr(m, "interface:owner", cls); Append(methods, m); } } } Delete(keys); } return methods; } /* ----------------------------------------------------------------------------- * collect_interface_bases * ----------------------------------------------------------------------------- */ static void collect_interface_bases(Hash *bases, Node *n) { if (Getattr(n, "feature:interface")) { String *name = Getattr(n, "interface:name"); if (!Getattr(bases, name)) Setattr(bases, name, n); } if (List *baselist = Getattr(n, "bases")) { for (Iterator base = First(baselist); base.item; base = Next(base)) { if (!GetFlag(base.item, "feature:ignore")) { if (Getattr(base.item, "feature:interface")) collect_interface_bases(bases, base.item); } } } } /* ----------------------------------------------------------------------------- * collect_interface_base_classes() * * Create a hash containing all the classes up the inheritance hierarchy * marked with feature:interface (including this class n). * Stops going up the inheritance chain as soon as a class is found without * feature:interface. * The idea is to find all the base interfaces that a class must implement. * ----------------------------------------------------------------------------- */ static void collect_interface_base_classes(Node *n) { if (Getattr(n, "feature:interface")) { // check all bases are also interfaces if (List *baselist = Getattr(n, "bases")) { for (Iterator base = First(baselist); base.item; base = Next(base)) { if (!GetFlag(base.item, "feature:ignore")) { if (!Getattr(base.item, "feature:interface")) { Swig_error(Getfile(n), Getline(n), "Base class '%s' of '%s' is not similarly marked as an interface.\n", SwigType_namestr(Getattr(base.item, "name")), SwigType_namestr(Getattr(n, "name"))); SWIG_exit(EXIT_FAILURE); } } } } } Hash *interface_bases = NewHash(); collect_interface_bases(interface_bases, n); if (Len(interface_bases) == 0) Delete(interface_bases); else Setattr(n, "interface:bases", interface_bases); } /* ----------------------------------------------------------------------------- * process_interface_name() * ----------------------------------------------------------------------------- */ static void process_interface_name(Node *n) { if (Getattr(n, "feature:interface")) { String *interface_name = Getattr(n, "feature:interface:name"); if (!Len(interface_name)) { Swig_error(Getfile(n), Getline(n), "The interface feature for '%s' is missing the name attribute.\n", SwigType_namestr(Getattr(n, "name"))); SWIG_exit(EXIT_FAILURE); } if (Strchr(interface_name, '%')) { String *name = NewStringf(interface_name, Getattr(n, "sym:name")); Setattr(n, "interface:name", name); } else { Setattr(n, "interface:name", interface_name); } } } /* ----------------------------------------------------------------------------- * Swig_interface_propagate_methods() * * Find all the base classes marked as an interface (with feature:interface) for * class node n. For each of these, add all of its methods as methods of n so that * n is not abstract. If class n is also marked as an interface, it will remain * abstract and not have any methods added. * ----------------------------------------------------------------------------- */ void Swig_interface_propagate_methods(Node *n) { if (interface_feature_enabled) { process_interface_name(n); collect_interface_base_classes(n); List *methods = collect_interface_methods(n); bool is_interface = Getattr(n, "feature:interface") != 0; for (Iterator mi = First(methods); mi.item; mi = Next(mi)) { if (!is_interface && GetFlag(mi.item, "abstract")) continue; String *this_decl = Getattr(mi.item, "decl"); String *this_decl_resolved = SwigType_typedef_resolve_all(this_decl); bool identically_overloaded_method = false; // true when a base class' method is implemented in n if (SwigType_isfunction(this_decl_resolved)) { String *name = Getattr(mi.item, "name"); for (Node *child = firstChild(n); child; child = nextSibling(child)) { if (Getattr(child, "interface:owner")) break; // at the end of the list are newly appended methods if (Cmp(nodeType(child), "cdecl") == 0) { if (checkAttribute(child, "name", name)) { String *decl = SwigType_typedef_resolve_all(Getattr(child, "decl")); identically_overloaded_method = Strcmp(decl, this_decl_resolved) == 0; Delete(decl); if (identically_overloaded_method) break; } } } } Delete(this_decl_resolved); if (!identically_overloaded_method) { // TODO: Fix if the method is overloaded with different arguments / has default args appendChild(n, mi.item); } else { Delete(mi.item); } } Delete(methods); } } /* ----------------------------------------------------------------------------- * Swig_interface_feature_enable() * * Turn on interface feature support * ----------------------------------------------------------------------------- */ void Swig_interface_feature_enable() { interface_feature_enabled = true; } swig-4.0.1/Source/Modules/mzscheme.cxx0000644000175000017500000006320313527063513017563 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * mzscheme.cxx * * Mzscheme language module for SWIG. * ----------------------------------------------------------------------------- */ #include "swigmod.h" #include static const char *usage = "\ Mzscheme Options (available with -mzscheme)\n\ -declaremodule - Create extension that declares a module\n\ -dynamic-load ,[lib,...] - Do not link with these libraries, dynamic load them\n\ -noinit - Do not emit module initialization code\n\ -prefix - Set a prefix to be prepended to all names\n\ "; static String *fieldnames_tab = 0; static String *convert_tab = 0; static String *convert_proto_tab = 0; static String *struct_name = 0; static String *mangled_struct_name = 0; static String *prefix = 0; static bool declaremodule = false; static bool noinit = false; static String *load_libraries = NULL; static String *module = 0; static const char *mzscheme_path = "mzscheme"; static String *init_func_def = 0; static File *f_begin = 0; static File *f_runtime = 0; static File *f_header = 0; static File *f_wrappers = 0; static File *f_init = 0; // Used for garbage collection static int exporting_destructor = 0; static String *swigtype_ptr = 0; static String *cls_swigtype = 0; class MZSCHEME:public Language { public: /* ------------------------------------------------------------ * main() * ------------------------------------------------------------ */ virtual void main(int argc, char *argv[]) { int i; SWIG_library_directory(mzscheme_path); // Look for certain command line options for (i = 1; i < argc; i++) { if (argv[i]) { if (strcmp(argv[i], "-help") == 0) { fputs(usage, stdout); SWIG_exit(0); } else if (strcmp(argv[i], "-prefix") == 0) { if (argv[i + 1]) { prefix = NewString(argv[i + 1]); Swig_mark_arg(i); Swig_mark_arg(i + 1); i++; } else { Swig_arg_error(); } } else if (strcmp(argv[i], "-declaremodule") == 0) { declaremodule = true; Swig_mark_arg(i); } else if (strcmp(argv[i], "-noinit") == 0) { noinit = true; Swig_mark_arg(i); } else if (strcmp(argv[i], "-dynamic-load") == 0) { if (argv[i + 1]) { Delete(load_libraries); load_libraries = NewString(argv[i + 1]); Swig_mark_arg(i++); Swig_mark_arg(i); } else { Swig_arg_error(); } } } } // If a prefix has been specified make sure it ends in a '_' (not actually used!) if (prefix) { const char *px = Char(prefix); if (px[Len(prefix) - 1] != '_') Printf(prefix, "_"); } else prefix = NewString("swig_"); // Add a symbol for this module Preprocessor_define("SWIGMZSCHEME 1", 0); // Set name of typemaps SWIG_typemap_lang("mzscheme"); // Read in default typemaps */ SWIG_config_file("mzscheme.swg"); allow_overloading(); } /* ------------------------------------------------------------ * top() * ------------------------------------------------------------ */ virtual int top(Node *n) { /* Initialize all of the output files */ String *outfile = Getattr(n, "outfile"); f_begin = NewFile(outfile, "w", SWIG_output_files()); if (!f_begin) { FileErrorDisplay(outfile); SWIG_exit(EXIT_FAILURE); } f_runtime = NewString(""); f_init = NewString(""); f_header = NewString(""); f_wrappers = NewString(""); /* Register file targets with the SWIG file handler */ Swig_register_filebyname("header", f_header); Swig_register_filebyname("wrapper", f_wrappers); Swig_register_filebyname("begin", f_begin); Swig_register_filebyname("runtime", f_runtime); init_func_def = NewString(""); Swig_register_filebyname("init", init_func_def); Swig_banner(f_begin); Printf(f_runtime, "\n\n#ifndef SWIGMZSCHEME\n#define SWIGMZSCHEME\n#endif\n\n"); module = Getattr(n, "name"); Language::top(n); SwigType_emit_type_table(f_runtime, f_wrappers); if (!noinit) { if (declaremodule) { Printf(f_init, "#define SWIG_MZSCHEME_CREATE_MENV(env) scheme_primitive_module(scheme_intern_symbol(\"%s\"), env)\n", module); } else { Printf(f_init, "#define SWIG_MZSCHEME_CREATE_MENV(env) (env)\n"); } Printf(f_init, "%s\n", Char(init_func_def)); if (declaremodule) { Printf(f_init, "\tscheme_finish_primitive_module(menv);\n"); } Printf(f_init, "\treturn scheme_void;\n}\n"); Printf(f_init, "Scheme_Object *scheme_initialize(Scheme_Env *env) {\n"); if (load_libraries) { Printf(f_init, "mz_set_dlopen_libraries(\"%s\");\n", load_libraries); } Printf(f_init, "\treturn scheme_reload(env);\n"); Printf(f_init, "}\n"); Printf(f_init, "Scheme_Object *scheme_module_name(void) {\n"); if (declaremodule) { Printf(f_init, " return scheme_intern_symbol((char*)\"%s\");\n", module); } else { Printf(f_init, " return scheme_make_symbol((char*)\"%s\");\n", module); } Printf(f_init, "}\n"); } /* Close all of the files */ Dump(f_runtime, f_begin); Dump(f_header, f_begin); Dump(f_wrappers, f_begin); Wrapper_pretty_print(f_init, f_begin); Delete(f_header); Delete(f_wrappers); Delete(f_init); Delete(f_runtime); Delete(f_begin); return SWIG_OK; } /* ------------------------------------------------------------ * functionWrapper() * Create a function declaration and register it with the interpreter. * ------------------------------------------------------------ */ void throw_unhandled_mzscheme_type_error(SwigType *d) { Swig_warning(WARN_TYPEMAP_UNDEF, input_file, line_number, "Unable to handle type %s.\n", SwigType_str(d, 0)); } /* Return true iff T is a pointer type */ int is_a_pointer(SwigType *t) { return SwigType_ispointer(SwigType_typedef_resolve_all(t)); } virtual int functionWrapper(Node *n) { char *iname = GetChar(n, "sym:name"); SwigType *d = Getattr(n, "type"); ParmList *l = Getattr(n, "parms"); Parm *p; Wrapper *f = NewWrapper(); String *proc_name = NewString(""); String *target = NewString(""); String *arg = NewString(""); String *cleanup = NewString(""); String *outarg = NewString(""); String *build = NewString(""); String *tm; int i = 0; int numargs; int numreq; String *overname = 0; if (load_libraries) { ParmList *parms = Getattr(n, "parms"); SwigType *type = Getattr(n, "type"); String *name = NewString("caller"); Setattr(n, "wrap:action", Swig_cresult(type, Swig_cresult_name(), Swig_cfunction_call(name, parms))); } // Make a wrapper name for this String *wname = Swig_name_wrapper(iname); if (Getattr(n, "sym:overloaded")) { overname = Getattr(n, "sym:overname"); } else { if (!addSymbol(iname, n)) { DelWrapper(f); return SWIG_ERROR; } } if (overname) { Append(wname, overname); } Setattr(n, "wrap:name", wname); // Build the name for Scheme. Printv(proc_name, iname, NIL); Replaceall(proc_name, "_", "-"); // writing the function wrapper function Printv(f->def, "static Scheme_Object *", wname, " (", NIL); Printv(f->def, "int argc, Scheme_Object **argv", NIL); Printv(f->def, ")\n{", NIL); /* Define the scheme name in C. This define is used by several macros. */ Printv(f->def, "#define FUNC_NAME \"", proc_name, "\"", NIL); // Emit all of the local variables for holding arguments. emit_parameter_variables(l, f); /* Attach the standard typemaps */ emit_attach_parmmaps(l, f); Setattr(n, "wrap:parms", l); numargs = emit_num_arguments(l); numreq = emit_num_required(l); /* Add the holder for the pointer to the function to be opened */ if (load_libraries) { Wrapper_add_local(f, "_function_loaded", "static int _function_loaded=(1==0)"); Wrapper_add_local(f, "_the_function", "static void *_the_function=NULL"); { String *parms = ParmList_protostr(l); String *func = NewStringf("(*caller)(%s)", parms); Wrapper_add_local(f, "caller", SwigType_lstr(d, func)); /*"(*caller)()")); */ } } // adds local variables Wrapper_add_local(f, "lenv", "int lenv = 1"); Wrapper_add_local(f, "values", "Scheme_Object *values[MAXVALUES]"); if (load_libraries) { Printf(f->code, "if (!_function_loaded) { _the_function=mz_load_function(\"%s\");_function_loaded=(1==1); }\n", iname); Printf(f->code, "if (!_the_function) { scheme_signal_error(\"Cannot load C function '%s'\"); }\n", iname); Printf(f->code, "caller=_the_function;\n"); } // Now write code to extract the parameters (this is super ugly) for (i = 0, p = l; i < numargs; i++) { /* Skip ignored arguments */ while (checkAttribute(p, "tmap:in:numinputs", "0")) { p = Getattr(p, "tmap:in:next"); } SwigType *pt = Getattr(p, "type"); String *ln = Getattr(p, "lname"); // Produce names of source and target Clear(target); Clear(arg); String *source = NewStringf("argv[%d]", i); Printf(target, "%s", ln); Printv(arg, Getattr(p, "name"), NIL); if (i >= numreq) { Printf(f->code, "if (argc > %d) {\n", i); } // Handle parameter types. if ((tm = Getattr(p, "tmap:in"))) { Replaceall(tm, "$source", source); Replaceall(tm, "$target", target); Replaceall(tm, "$input", source); Setattr(p, "emit:input", source); Printv(f->code, tm, "\n", NIL); p = Getattr(p, "tmap:in:next"); } else { // no typemap found // check if typedef and resolve throw_unhandled_mzscheme_type_error(pt); p = nextSibling(p); } if (i >= numreq) { Printf(f->code, "}\n"); } Delete(source); } /* Insert constraint checking code */ for (p = l; p;) { if ((tm = Getattr(p, "tmap:check"))) { Replaceall(tm, "$target", Getattr(p, "lname")); Printv(f->code, tm, "\n", NIL); p = Getattr(p, "tmap:check:next"); } else { p = nextSibling(p); } } // Pass output arguments back to the caller. for (p = l; p;) { if ((tm = Getattr(p, "tmap:argout"))) { Replaceall(tm, "$source", Getattr(p, "emit:input")); /* Deprecated */ Replaceall(tm, "$target", Getattr(p, "lname")); /* Deprecated */ Replaceall(tm, "$arg", Getattr(p, "emit:input")); Replaceall(tm, "$input", Getattr(p, "emit:input")); Printv(outarg, tm, "\n", NIL); p = Getattr(p, "tmap:argout:next"); } else { p = nextSibling(p); } } // Free up any memory allocated for the arguments. /* Insert cleanup code */ for (p = l; p;) { if ((tm = Getattr(p, "tmap:freearg"))) { Replaceall(tm, "$target", Getattr(p, "lname")); Printv(cleanup, tm, "\n", NIL); p = Getattr(p, "tmap:freearg:next"); } else { p = nextSibling(p); } } // Now write code to make the function call String *actioncode = emit_action(n); // Now have return value, figure out what to do with it. if ((tm = Swig_typemap_lookup_out("out", n, Swig_cresult_name(), f, actioncode))) { Replaceall(tm, "$source", Swig_cresult_name()); Replaceall(tm, "$target", "values[0]"); Replaceall(tm, "$result", "values[0]"); if (GetFlag(n, "feature:new")) Replaceall(tm, "$owner", "1"); else Replaceall(tm, "$owner", "0"); Printv(f->code, tm, "\n", NIL); } else { throw_unhandled_mzscheme_type_error(d); } emit_return_variable(n, d, f); // Dump the argument output code Printv(f->code, Char(outarg), NIL); // Dump the argument cleanup code Printv(f->code, Char(cleanup), NIL); // Look for any remaining cleanup if (GetFlag(n, "feature:new")) { if ((tm = Swig_typemap_lookup("newfree", n, Swig_cresult_name(), 0))) { Replaceall(tm, "$source", Swig_cresult_name()); Printv(f->code, tm, "\n", NIL); } } // Free any memory allocated by the function being wrapped.. if ((tm = Swig_typemap_lookup("ret", n, Swig_cresult_name(), 0))) { Replaceall(tm, "$source", Swig_cresult_name()); Printv(f->code, tm, "\n", NIL); } // Wrap things up (in a manner of speaking) Printv(f->code, tab4, "return SWIG_MzScheme_PackageValues(lenv, values);\n", NIL); Printf(f->code, "#undef FUNC_NAME\n"); Printv(f->code, "}\n", NIL); /* Substitute the function name */ Replaceall(f->code, "$symname", iname); Wrapper_print(f, f_wrappers); if (!Getattr(n, "sym:overloaded")) { // Now register the function char temp[256]; sprintf(temp, "%d", numargs); if (exporting_destructor) { Printf(init_func_def, "SWIG_TypeClientData(SWIGTYPE%s, (void *) %s);\n", swigtype_ptr, wname); } Printf(init_func_def, "scheme_add_global(\"%s\", scheme_make_prim_w_arity(%s,\"%s\",%d,%d),menv);\n", proc_name, wname, proc_name, numreq, numargs); } else { if (!Getattr(n, "sym:nextSibling")) { /* Emit overloading dispatch function */ int maxargs; String *dispatch = Swig_overload_dispatch(n, "return %s(argc,argv);", &maxargs); /* Generate a dispatch wrapper for all overloaded functions */ Wrapper *df = NewWrapper(); String *dname = Swig_name_wrapper(iname); Printv(df->def, "static Scheme_Object *\n", dname, "(int argc, Scheme_Object **argv) {", NIL); Printv(df->code, dispatch, "\n", NIL); Printf(df->code, "scheme_signal_error(\"No matching function for overloaded '%s'\");\n", iname); Printf(df->code, "return NULL;\n", iname); Printv(df->code, "}\n", NIL); Wrapper_print(df, f_wrappers); Printf(init_func_def, "scheme_add_global(\"%s\", scheme_make_prim_w_arity(%s,\"%s\",%d,%d),menv);\n", proc_name, dname, proc_name, 0, maxargs); DelWrapper(df); Delete(dispatch); Delete(dname); } } Delete(proc_name); Delete(target); Delete(arg); Delete(outarg); Delete(cleanup); Delete(build); DelWrapper(f); return SWIG_OK; } /* ------------------------------------------------------------ * variableWrapper() * * Create a link to a C variable. * This creates a single function _wrap_swig_var_varname(). * This function takes a single optional argument. If supplied, it means * we are setting this variable to some value. If omitted, it means we are * simply evaluating this variable. Either way, we return the variables * value. * ------------------------------------------------------------ */ virtual int variableWrapper(Node *n) { char *name = GetChar(n, "name"); char *iname = GetChar(n, "sym:name"); SwigType *t = Getattr(n, "type"); String *proc_name = NewString(""); String *tm; String *tm2 = NewString(""); String *argnum = NewString("0"); String *arg = NewString("argv[0]"); Wrapper *f; if (!addSymbol(iname, n)) return SWIG_ERROR; f = NewWrapper(); // evaluation function names String *var_name = Swig_name_wrapper(iname); // Build the name for scheme. Printv(proc_name, iname, NIL); Replaceall(proc_name, "_", "-"); Setattr(n, "wrap:name", proc_name); if ((SwigType_type(t) != T_USER) || (is_a_pointer(t))) { Printf(f->def, "static Scheme_Object *%s(int argc, Scheme_Object** argv) {\n", var_name); Printv(f->def, "#define FUNC_NAME \"", proc_name, "\"", NIL); Wrapper_add_local(f, "swig_result", "Scheme_Object *swig_result"); if (!GetFlag(n, "feature:immutable")) { /* Check for a setting of the variable value */ Printf(f->code, "if (argc) {\n"); if ((tm = Swig_typemap_lookup("varin", n, name, 0))) { Replaceall(tm, "$source", "argv[0]"); Replaceall(tm, "$target", name); Replaceall(tm, "$input", "argv[0]"); Replaceall(tm, "$argnum", "1"); emit_action_code(n, f->code, tm); } else { throw_unhandled_mzscheme_type_error(t); } Printf(f->code, "}\n"); } // Now return the value of the variable (regardless // of evaluating or setting) if ((tm = Swig_typemap_lookup("varout", n, name, 0))) { Replaceall(tm, "$source", name); Replaceall(tm, "$target", "swig_result"); Replaceall(tm, "$result", "swig_result"); /* Printf (f->code, "%s\n", tm); */ emit_action_code(n, f->code, tm); } else { throw_unhandled_mzscheme_type_error(t); } Printf(f->code, "\nreturn swig_result;\n"); Printf(f->code, "#undef FUNC_NAME\n"); Printf(f->code, "}\n"); Wrapper_print(f, f_wrappers); // Now add symbol to the MzScheme interpreter Printv(init_func_def, "scheme_add_global(\"", proc_name, "\", scheme_make_prim_w_arity(", var_name, ", \"", proc_name, "\", ", "0", ", ", "1", "), menv);\n", NIL); } else { Swig_warning(WARN_TYPEMAP_VAR_UNDEF, input_file, line_number, "Unsupported variable type %s (ignored).\n", SwigType_str(t, 0)); } Delete(var_name); Delete(proc_name); Delete(argnum); Delete(arg); Delete(tm2); DelWrapper(f); return SWIG_OK; } /* ------------------------------------------------------------ * constantWrapper() * ------------------------------------------------------------ */ virtual int constantWrapper(Node *n) { char *name = GetChar(n, "name"); char *iname = GetChar(n, "sym:name"); SwigType *type = Getattr(n, "type"); String *value = Getattr(n, "value"); String *var_name = NewString(""); String *proc_name = NewString(""); String *rvalue = NewString(""); String *temp = NewString(""); String *tm; // Make a static variable; Printf(var_name, "_wrap_const_%s", Swig_name_mangle(Getattr(n, "sym:name"))); // Build the name for scheme. Printv(proc_name, iname, NIL); Replaceall(proc_name, "_", "-"); if ((SwigType_type(type) == T_USER) && (!is_a_pointer(type))) { Swig_warning(WARN_TYPEMAP_CONST_UNDEF, input_file, line_number, "Unsupported constant value.\n"); return SWIG_NOWRAP; } // See if there's a typemap Printv(rvalue, value, NIL); if ((SwigType_type(type) == T_CHAR) && (is_a_pointer(type) == 1)) { temp = Copy(rvalue); Clear(rvalue); Printv(rvalue, "\"", temp, "\"", NIL); } if ((SwigType_type(type) == T_CHAR) && (is_a_pointer(type) == 0)) { Delete(temp); temp = Copy(rvalue); Clear(rvalue); Printv(rvalue, "'", temp, "'", NIL); } if ((tm = Swig_typemap_lookup("constant", n, name, 0))) { Replaceall(tm, "$source", rvalue); Replaceall(tm, "$value", rvalue); Replaceall(tm, "$target", name); Printf(f_init, "%s\n", tm); } else { // Create variable and assign it a value Printf(f_header, "static %s = ", SwigType_lstr(type, var_name)); bool is_enum_item = (Cmp(nodeType(n), "enumitem") == 0); if ((SwigType_type(type) == T_STRING)) { Printf(f_header, "\"%s\";\n", value); } else if (SwigType_type(type) == T_CHAR && !is_enum_item) { Printf(f_header, "\'%s\';\n", value); } else { Printf(f_header, "%s;\n", value); } // Now create a variable declaration { /* Hack alert: will cleanup later -- Dave */ Node *nn = NewHash(); Setfile(nn, Getfile(n)); Setline(nn, Getline(n)); Setattr(nn, "name", var_name); Setattr(nn, "sym:name", iname); Setattr(nn, "type", type); SetFlag(nn, "feature:immutable"); variableWrapper(nn); Delete(nn); } } Delete(proc_name); Delete(rvalue); Delete(temp); return SWIG_OK; } virtual int destructorHandler(Node *n) { exporting_destructor = true; Language::destructorHandler(n); exporting_destructor = false; return SWIG_OK; } /* ------------------------------------------------------------ * classHandler() * ------------------------------------------------------------ */ virtual int classHandler(Node *n) { String *mangled_classname = 0; String *real_classname = 0; String *scm_structname = NewString(""); SwigType *ctype_ptr = NewStringf("p.%s", getClassType()); SwigType *t = NewStringf("p.%s", Getattr(n, "name")); swigtype_ptr = SwigType_manglestr(t); Delete(t); cls_swigtype = SwigType_manglestr(Getattr(n, "name")); fieldnames_tab = NewString(""); convert_tab = NewString(""); convert_proto_tab = NewString(""); struct_name = Getattr(n, "sym:name"); mangled_struct_name = Swig_name_mangle(Getattr(n, "sym:name")); Printv(scm_structname, struct_name, NIL); Replaceall(scm_structname, "_", "-"); real_classname = Getattr(n, "name"); mangled_classname = Swig_name_mangle(real_classname); Printv(fieldnames_tab, "static const char *_swig_struct_", cls_swigtype, "_field_names[] = { \n", NIL); Printv(convert_proto_tab, "static Scheme_Object *_swig_convert_struct_", cls_swigtype, "(", SwigType_str(ctype_ptr, "ptr"), ");\n", NIL); Printv(convert_tab, "static Scheme_Object *_swig_convert_struct_", cls_swigtype, "(", SwigType_str(ctype_ptr, "ptr"), ")\n {\n", NIL); Printv(convert_tab, tab4, "Scheme_Object *obj;\n", tab4, "Scheme_Object *fields[_swig_struct_", cls_swigtype, "_field_names_cnt];\n", tab4, "int i = 0;\n\n", NIL); /* Generate normal wrappers */ Language::classHandler(n); Printv(convert_tab, tab4, "obj = scheme_make_struct_instance(", "_swig_struct_type_", cls_swigtype, ", i, fields);\n", NIL); Printv(convert_tab, tab4, "return obj;\n}\n\n", NIL); Printv(fieldnames_tab, "};\n", NIL); Printv(f_header, "static Scheme_Object *_swig_struct_type_", cls_swigtype, ";\n", NIL); Printv(f_header, fieldnames_tab, NIL); Printv(f_header, "#define _swig_struct_", cls_swigtype, "_field_names_cnt (sizeof(_swig_struct_", cls_swigtype, "_field_names)/sizeof(char*))\n", NIL); Printv(f_header, convert_proto_tab, NIL); Printv(f_wrappers, convert_tab, NIL); Printv(init_func_def, "_swig_struct_type_", cls_swigtype, " = SWIG_MzScheme_new_scheme_struct(menv, \"", scm_structname, "\", ", "_swig_struct_", cls_swigtype, "_field_names_cnt,", "(char**) _swig_struct_", cls_swigtype, "_field_names);\n", NIL); Delete(mangled_classname); Delete(swigtype_ptr); swigtype_ptr = 0; Delete(fieldnames_tab); Delete(convert_tab); Delete(ctype_ptr); Delete(convert_proto_tab); struct_name = 0; mangled_struct_name = 0; Delete(cls_swigtype); cls_swigtype = 0; return SWIG_OK; } /* ------------------------------------------------------------ * membervariableHandler() * ------------------------------------------------------------ */ virtual int membervariableHandler(Node *n) { Language::membervariableHandler(n); if (!is_smart_pointer()) { String *symname = Getattr(n, "sym:name"); String *name = Getattr(n, "name"); SwigType *type = Getattr(n, "type"); String *swigtype = SwigType_manglestr(Getattr(n, "type")); String *tm = 0; String *access_mem = NewString(""); SwigType *ctype_ptr = NewStringf("p.%s", Getattr(n, "type")); Printv(fieldnames_tab, tab4, "\"", symname, "\",\n", NIL); Printv(access_mem, "(ptr)->", name, NIL); if ((SwigType_type(type) == T_USER) && (!is_a_pointer(type))) { Printv(convert_tab, tab4, "fields[i++] = ", NIL); Printv(convert_tab, "_swig_convert_struct_", swigtype, "((", SwigType_str(ctype_ptr, 0), ")&((ptr)->", name, "));\n", NIL); } else if ((tm = Swig_typemap_lookup("varout", n, access_mem, 0))) { Replaceall(tm, "$result", "fields[i++]"); Printv(convert_tab, tm, "\n", NIL); } else Swig_warning(WARN_TYPEMAP_VAR_UNDEF, input_file, line_number, "Unsupported member variable type %s (ignored).\n", SwigType_str(type, 0)); Delete(access_mem); } return SWIG_OK; } /* ------------------------------------------------------------ * validIdentifier() * ------------------------------------------------------------ */ virtual int validIdentifier(String *s) { char *c = Char(s); /* Check whether we have an R5RS identifier. */ /* --> * | */ /* --> | */ if (!(isalpha(*c) || (*c == '!') || (*c == '$') || (*c == '%') || (*c == '&') || (*c == '*') || (*c == '/') || (*c == ':') || (*c == '<') || (*c == '=') || (*c == '>') || (*c == '?') || (*c == '^') || (*c == '_') || (*c == '~'))) { /* --> + | - | ... */ if ((strcmp(c, "+") == 0) || strcmp(c, "-") == 0 || strcmp(c, "...") == 0) return 1; else return 0; } /* --> | | */ while (*c) { if (!(isalnum(*c) || (*c == '!') || (*c == '$') || (*c == '%') || (*c == '&') || (*c == '*') || (*c == '/') || (*c == ':') || (*c == '<') || (*c == '=') || (*c == '>') || (*c == '?') || (*c == '^') || (*c == '_') || (*c == '~') || (*c == '+') || (*c == '-') || (*c == '.') || (*c == '@'))) return 0; c++; } return 1; } String *runtimeCode() { String *s = Swig_include_sys("mzrun.swg"); if (!s) { Printf(stderr, "*** Unable to open 'mzrun.swg'\n"); s = NewString(""); } return s; } String *defaultExternalRuntimeFilename() { return NewString("swigmzrun.h"); } }; /* ----------------------------------------------------------------------------- * swig_mzscheme() - Instantiate module * ----------------------------------------------------------------------------- */ static Language *new_swig_mzscheme() { return new MZSCHEME(); } extern "C" Language *swig_mzscheme(void) { return new_swig_mzscheme(); } swig-4.0.1/Source/Modules/javascript.cxx0000644000175000017500000022356213527063513020124 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * javascript.cxx * * Javascript language module for SWIG. * ----------------------------------------------------------------------------- */ #include "swigmod.h" #include "cparse.h" /** * Enables extra debugging information in typemaps. */ static bool js_template_enable_debug = false; #define ERR_MSG_ONLY_ONE_ENGINE_PLEASE "Only one engine can be specified at a time." // keywords used for state variables #define NAME "name" #define NAME_MANGLED "name_mangled" #define TYPE "type" #define TYPE_MANGLED "type_mangled" #define WRAPPER_NAME "wrapper" #define IS_IMMUTABLE "is_immutable" #define IS_STATIC "is_static" #define IS_ABSTRACT "is_abstract" #define GETTER "getter" #define SETTER "setter" #define PARENT "parent" #define PARENT_MANGLED "parent_mangled" #define CTOR "ctor" #define CTOR_WRAPPERS "ctor_wrappers" #define CTOR_DISPATCHERS "ctor_dispatchers" #define DTOR "dtor" #define ARGCOUNT "wrap:argc" #define HAS_TEMPLATES "has_templates" #define FORCE_CPP "force_cpp" #define RESET true // keys for global state variables #define CREATE_NAMESPACES "create_namespaces" #define REGISTER_NAMESPACES "register_namespaces" #define INITIALIZER "initializer" // keys for class scoped state variables #define MEMBER_VARIABLES "member_variables" #define MEMBER_FUNCTIONS "member_functions" #define STATIC_FUNCTIONS "static_functions" #define STATIC_VARIABLES "static_variables" /** * A convenience class to manage state variables for emitters. * The implementation delegates to SWIG Hash DOHs and provides * named sub-hashes for class, variable, and function states. */ class JSEmitterState { public: JSEmitterState(); ~JSEmitterState(); DOH *globals(); DOH *globals(const char *key, DOH *initial = 0); DOH *clazz(bool reset = false); DOH *clazz(const char *key, DOH *initial = 0); DOH *function(bool reset = false); DOH *function(const char *key, DOH *initial = 0); DOH *variable(bool reset = false); DOH *variable(const char *key, DOH *initial = 0); static int IsSet(DOH *val); private: DOH *getState(const char *key, bool reset = false); Hash *globalHash; }; /** * A convenience class that wraps a code snippet used as template * for code generation. */ class Template { public: Template(const String *code); Template(const String *code, const String *templateName); Template(const Template & other); ~Template(); String *str(); Template & replace(const String *pattern, const String *repl); Template & print(DOH *doh); Template & pretty_print(DOH *doh); void operator=(const Template & t); Template & trim(); private: String *code; String *templateName; }; /** * JSEmitter represents an abstraction of javascript code generators * for different javascript engines. **/ class JSEmitter { protected: typedef JSEmitterState State; enum MarshallingMode { Setter, Getter, Ctor, Function }; public: enum JSEngine { JavascriptCore, V8, NodeJS }; JSEmitter(JSEngine engine); virtual ~ JSEmitter(); /** * Opens output files and temporary output DOHs. */ virtual int initialize(Node *n); /** * Writes all collected code into the output file(s). */ virtual int dump(Node *n) = 0; /** * Cleans up all open output DOHs. */ virtual int close() = 0; /** * Switches the context for code generation. * * Classes, global variables and global functions may need to * be registered in certain static tables. * This method should be used to switch output DOHs correspondingly. */ virtual int switchNamespace(Node *); /** * Invoked at the beginning of the classHandler. */ virtual int enterClass(Node *); /** * Invoked at the end of the classHandler. */ virtual int exitClass(Node *) { return SWIG_OK; }; /** * Invoked at the beginning of the variableHandler. */ virtual int enterVariable(Node *); /** * Invoked at the end of the variableHandler. */ virtual int exitVariable(Node *) { return SWIG_OK; }; /** * Invoked at the beginning of the functionHandler. */ virtual int enterFunction(Node *); /** * Invoked at the end of the functionHandler. */ virtual int exitFunction(Node *) { return SWIG_OK; }; /** * Invoked by functionWrapper callback after call to Language::functionWrapper. */ virtual int emitWrapperFunction(Node *n); /** * Invoked by nativeWrapper callback */ virtual int emitNativeFunction(Node *n); /** * Invoked from constantWrapper after call to Language::constantWrapper. **/ virtual int emitConstant(Node *n); /** * Registers a given code snippet for a given key name. * * This method is called by the fragmentDirective handler * of the JAVASCRIPT language module. **/ int registerTemplate(const String *name, const String *code); /** * Retrieve the code template registered for a given name. */ Template getTemplate(const String *name); State & getState(); protected: /** * Generates code for a constructor function. */ virtual int emitCtor(Node *n); /** * Generates code for a destructor function. */ virtual int emitDtor(Node *n); /** * Generates code for a function. */ virtual int emitFunction(Node *n, bool is_member, bool is_static); virtual int emitFunctionDispatcher(Node *n, bool /*is_member */ ); /** * Generates code for a getter function. */ virtual int emitGetter(Node *n, bool is_member, bool is_static); /** * Generates code for a setter function. */ virtual int emitSetter(Node *n, bool is_member, bool is_static); virtual void marshalInputArgs(Node *n, ParmList *parms, Wrapper *wrapper, MarshallingMode mode, bool is_member, bool is_static) = 0; virtual String *emitInputTypemap(Node *n, Parm *params, Wrapper *wrapper, String *arg); virtual void marshalOutput(Node *n, ParmList *params, Wrapper *wrapper, String *actioncode, const String *cresult = 0, bool emitReturnVariable = true); virtual void emitCleanupCode(Node *n, Wrapper *wrapper, ParmList *params); /** * Helper function to retrieve the first parent class node. */ Node *getBaseClass(Node *n); Parm *skipIgnoredArgs(Parm *p); virtual int createNamespace(String *scope); virtual Hash *createNamespaceEntry(const char *name, const char *parent, const char *parent_mangled); virtual int emitNamespaces() = 0; protected: JSEngine engine; Hash *templates; State state; // contains context specific data (DOHs) // to allow generation of namespace related code // which are switched on namespace change Hash *namespaces; Hash *current_namespace; String *defaultResultName; File *f_wrappers; }; /* factory methods for concrete JSEmitters: */ JSEmitter *swig_javascript_create_JSCEmitter(); JSEmitter *swig_javascript_create_V8Emitter(); JSEmitter *swig_javascript_create_NodeJSEmitter(); /********************************************************************** * JAVASCRIPT: SWIG module implementation **********************************************************************/ class JAVASCRIPT:public Language { public: JAVASCRIPT():emitter(NULL) { } ~JAVASCRIPT() { delete emitter; } virtual int functionHandler(Node *n); virtual int globalfunctionHandler(Node *n); virtual int variableHandler(Node *n); virtual int globalvariableHandler(Node *n); virtual int staticmemberfunctionHandler(Node *n); virtual int classHandler(Node *n); virtual int functionWrapper(Node *n); virtual int constantWrapper(Node *n); virtual int nativeWrapper(Node *n); virtual void main(int argc, char *argv[]); virtual int top(Node *n); /** * Registers all %fragments assigned to section "templates". **/ virtual int fragmentDirective(Node *n); public: virtual String *getNSpace() const; private: JSEmitter *emitter; }; /* --------------------------------------------------------------------- * functionWrapper() * * Low level code generator for functions * --------------------------------------------------------------------- */ int JAVASCRIPT::functionWrapper(Node *n) { // note: the default implementation only prints a message // Language::functionWrapper(n); emitter->emitWrapperFunction(n); return SWIG_OK; } /* --------------------------------------------------------------------- * functionHandler() * * Function handler for generating wrappers for functions * --------------------------------------------------------------------- */ int JAVASCRIPT::functionHandler(Node *n) { if (GetFlag(n, "isextension") == 1) { SetFlag(n, "ismember"); } emitter->enterFunction(n); Language::functionHandler(n); emitter->exitFunction(n); return SWIG_OK; } /* --------------------------------------------------------------------- * globalfunctionHandler() * * Function handler for generating wrappers for functions * --------------------------------------------------------------------- */ int JAVASCRIPT::globalfunctionHandler(Node *n) { emitter->switchNamespace(n); Language::globalfunctionHandler(n); return SWIG_OK; } /* --------------------------------------------------------------------- * staticmemberfunctionHandler() * * Function handler for generating wrappers for static member functions * --------------------------------------------------------------------- */ int JAVASCRIPT::staticmemberfunctionHandler(Node *n) { /* * Note: storage=static is removed by Language::staticmemberfunctionHandler. * So, don't rely on that after here. Instead use the state variable which is * set by JSEmitter::enterFunction(). */ Language::staticmemberfunctionHandler(n); return SWIG_OK; } /* --------------------------------------------------------------------- * variableHandler() * * Function handler for generating wrappers for variables * --------------------------------------------------------------------- */ int JAVASCRIPT::variableHandler(Node *n) { emitter->enterVariable(n); Language::variableHandler(n); emitter->exitVariable(n); return SWIG_OK; } /* --------------------------------------------------------------------- * globalvariableHandler() * * Function handler for generating wrappers for global variables * --------------------------------------------------------------------- */ int JAVASCRIPT::globalvariableHandler(Node *n) { emitter->switchNamespace(n); Language::globalvariableHandler(n); return SWIG_OK; } /* --------------------------------------------------------------------- * constantHandler() * * Function handler for generating wrappers for constants * --------------------------------------------------------------------- */ int JAVASCRIPT::constantWrapper(Node *n) { emitter->switchNamespace(n); // Note: callbacks trigger this wrapper handler // TODO: handle callback declarations if (Equal(Getattr(n, "kind"), "function")) { return SWIG_OK; } // TODO: the emitter for constants must be implemented in a cleaner way // currently we treat it like a read-only variable // however, there is a remaining bug with function pointer constants // which could be fixed with a cleaner approach emitter->emitConstant(n); return SWIG_OK; } /* --------------------------------------------------------------------- * nativeWrapper() * * Function wrapper for generating placeholders for native functions * --------------------------------------------------------------------- */ int JAVASCRIPT::nativeWrapper(Node *n) { emitter->emitNativeFunction(n); return SWIG_OK; } /* --------------------------------------------------------------------- * classHandler() * * Function handler for generating wrappers for class * --------------------------------------------------------------------- */ int JAVASCRIPT::classHandler(Node *n) { emitter->switchNamespace(n); emitter->enterClass(n); Language::classHandler(n); emitter->exitClass(n); return SWIG_OK; } int JAVASCRIPT::fragmentDirective(Node *n) { // catch all fragment directives that have "templates" as location // and register them at the emitter. String *section = Getattr(n, "section"); if (Equal(section, "templates") && !ImportMode) { emitter->registerTemplate(Getattr(n, "value"), Getattr(n, "code")); } else { return Language::fragmentDirective(n); } return SWIG_OK; } String *JAVASCRIPT::getNSpace() const { return Language::getNSpace(); } /* --------------------------------------------------------------------- * top() * * Function handler for processing top node of the parse tree * Wrapper code generation essentially starts from here * --------------------------------------------------------------------- */ int JAVASCRIPT::top(Node *n) { emitter->initialize(n); Language::top(n); emitter->dump(n); emitter->close(); return SWIG_OK; } static const char *usage = (char *) "\ Javascript Options (available with -javascript)\n\ -jsc - creates a JavascriptCore extension \n\ -v8 - creates a v8 extension \n\ -node - creates a node.js extension \n\ -debug-codetemplates - generates information about the origin of code templates\n"; /* --------------------------------------------------------------------- * main() * * Entry point for the JAVASCRIPT module * --------------------------------------------------------------------- */ void JAVASCRIPT::main(int argc, char *argv[]) { // Set javascript subdirectory in SWIG library SWIG_library_directory("javascript"); int engine = -1; for (int i = 1; i < argc; i++) { if (argv[i]) { if (strcmp(argv[i], "-v8") == 0) { if (engine != -1) { Printf(stderr, ERR_MSG_ONLY_ONE_ENGINE_PLEASE); SWIG_exit(-1); } Swig_mark_arg(i); engine = JSEmitter::V8; } else if (strcmp(argv[i], "-jsc") == 0) { if (engine != -1) { Printf(stderr, ERR_MSG_ONLY_ONE_ENGINE_PLEASE); SWIG_exit(-1); } Swig_mark_arg(i); engine = JSEmitter::JavascriptCore; } else if (strcmp(argv[i], "-node") == 0) { if (engine != -1) { Printf(stderr, ERR_MSG_ONLY_ONE_ENGINE_PLEASE); SWIG_exit(-1); } Swig_mark_arg(i); engine = JSEmitter::NodeJS; } else if (strcmp(argv[i], "-debug-codetemplates") == 0) { Swig_mark_arg(i); js_template_enable_debug = true; } else if (strcmp(argv[i], "-help") == 0) { fputs(usage, stdout); return; } } } switch (engine) { case JSEmitter::V8: { emitter = swig_javascript_create_V8Emitter(); Preprocessor_define("SWIG_JAVASCRIPT_V8 1", 0); SWIG_library_directory("javascript/v8"); // V8 API is C++, so output must be C++ compatible even when wrapping C code if (!cparse_cplusplus) { Swig_cparse_cplusplusout(1); } break; } case JSEmitter::JavascriptCore: { emitter = swig_javascript_create_JSCEmitter(); Preprocessor_define("SWIG_JAVASCRIPT_JSC 1", 0); SWIG_library_directory("javascript/jsc"); break; } case JSEmitter::NodeJS: { emitter = swig_javascript_create_V8Emitter(); Preprocessor_define("SWIG_JAVASCRIPT_V8 1", 0); Preprocessor_define("BUILDING_NODE_EXTENSION 1", 0); SWIG_library_directory("javascript/v8"); break; } default: { Printf(stderr, "SWIG Javascript: Unknown engine. Please specify one of '-jsc', '-v8' or '-node'.\n"); SWIG_exit(-1); break; } } // Add a symbol to the parser for conditional compilation Preprocessor_define("SWIGJAVASCRIPT 1", 0); // Add typemap definitions SWIG_typemap_lang("javascript"); // Set configuration file SWIG_config_file("javascript.swg"); allow_overloading(); } /* ----------------------------------------------------------------------------- * swig_javascript() - Instantiate module * ----------------------------------------------------------------------------- */ static Language *new_swig_javascript() { return new JAVASCRIPT(); } extern "C" Language *swig_javascript(void) { return new_swig_javascript(); } /********************************************************************** * Emitter implementations **********************************************************************/ /* ----------------------------------------------------------------------------- * JSEmitter() * ----------------------------------------------------------------------------- */ JSEmitter::JSEmitter(JSEmitter::JSEngine engine) : engine(engine), templates(NewHash()), namespaces(NULL), current_namespace(NULL), defaultResultName(NewString("result")), f_wrappers(NULL) { } /* ----------------------------------------------------------------------------- * ~JSEmitter() * ----------------------------------------------------------------------------- */ JSEmitter::~JSEmitter() { Delete(templates); } /* ----------------------------------------------------------------------------- * JSEmitter::RegisterTemplate() : Registers a code template * * Note: this is used only by JAVASCRIPT::fragmentDirective(). * ----------------------------------------------------------------------------- */ int JSEmitter::registerTemplate(const String *name, const String *code) { if (!State::IsSet(state.globals(HAS_TEMPLATES))) { SetFlag(state.globals(), HAS_TEMPLATES); } return Setattr(templates, name, code); } /* ----------------------------------------------------------------------------- * JSEmitter::getTemplate() : Provides a registered code template * ----------------------------------------------------------------------------- */ Template JSEmitter::getTemplate(const String *name) { String *templ = Getattr(templates, name); if (!templ) { Printf(stderr, "Could not find template %s\n.", name); SWIG_exit(EXIT_FAILURE); } Template t(templ, name); return t; } JSEmitterState & JSEmitter::getState() { return state; } int JSEmitter::initialize(Node * /*n */ ) { if (namespaces != NULL) { Delete(namespaces); } namespaces = NewHash(); Hash *global_namespace = createNamespaceEntry("exports", 0, 0); Setattr(namespaces, "::", global_namespace); current_namespace = global_namespace; f_wrappers = NewString(""); return SWIG_OK; } /* --------------------------------------------------------------------- * skipIgnoredArgs() * --------------------------------------------------------------------- */ Parm *JSEmitter::skipIgnoredArgs(Parm *p) { while (checkAttribute(p, "tmap:in:numinputs", "0")) { p = Getattr(p, "tmap:in:next"); } return p; } /* ----------------------------------------------------------------------------- * JSEmitter::getBaseClass() : the node of the base class or NULL * * Note: the first base class is provided. Multiple inheritance is not * supported. * ----------------------------------------------------------------------------- */ Node *JSEmitter::getBaseClass(Node *n) { // retrieve the first base class that is not %ignored List *baselist = Getattr(n, "bases"); if (baselist) { Iterator base = First(baselist); while (base.item && GetFlag(base.item, "feature:ignore")) { base = Next(base); } return base.item; } return NULL; } /* ----------------------------------------------------------------------------- * JSEmitter::emitWrapperFunction() : dispatches emitter functions. * * This allows to have small sized, dedicated emitting functions. * All state dependent branching is done here. * ----------------------------------------------------------------------------- */ int JSEmitter::emitWrapperFunction(Node *n) { int ret = SWIG_OK; String *kind = Getattr(n, "kind"); if (kind) { if (Equal(kind, "function") // HACK: sneaky.ctest revealed that typedef'd (global) functions must be // detected via the 'view' attribute. || (Equal(kind, "variable") && Equal(Getattr(n, "view"), "globalfunctionHandler")) ) { bool is_member = GetFlag(n, "ismember") != 0 || GetFlag(n, "feature:extend") != 0; bool is_static = GetFlag(state.function(), IS_STATIC) != 0; ret = emitFunction(n, is_member, is_static); } else if (Cmp(kind, "variable") == 0) { bool is_static = GetFlag(state.variable(), IS_STATIC) != 0; // HACK: smartpointeraccessed static variables are not treated as statics if (GetFlag(n, "allocate:smartpointeraccess")) { is_static = false; } bool is_member = GetFlag(n, "ismember") != 0; bool is_setter = GetFlag(n, "memberset") != 0 || GetFlag(n, "varset") != 0; bool is_getter = GetFlag(n, "memberget") != 0 || GetFlag(n, "varget") != 0; if (is_setter) { ret = emitSetter(n, is_member, is_static); } else if (is_getter) { ret = emitGetter(n, is_member, is_static); } else { Swig_print_node(n); } } else { Printf(stderr, "Warning: unsupported wrapper function type\n"); Swig_print_node(n); ret = SWIG_ERROR; } } else { String *view = Getattr(n, "view"); if (Cmp(view, "constructorHandler") == 0) { ret = emitCtor(n); } else if (Cmp(view, "destructorHandler") == 0) { ret = emitDtor(n); } else { Printf(stderr, "Warning: unsupported wrapper function type"); Swig_print_node(n); ret = SWIG_ERROR; } } return ret; } int JSEmitter::emitNativeFunction(Node *n) { String *wrapname = Getattr(n, "wrap:name"); enterFunction(n); state.function(WRAPPER_NAME, wrapname); exitFunction(n); return SWIG_OK; } int JSEmitter::enterClass(Node *n) { state.clazz(RESET); state.clazz(NAME, Getattr(n, "sym:name")); state.clazz("nspace", current_namespace); // Creating a mangled name using the current namespace and the symbol name String *mangled_name = NewString(""); Printf(mangled_name, "%s_%s", Getattr(current_namespace, NAME_MANGLED), Getattr(n, "sym:name")); state.clazz(NAME_MANGLED, SwigType_manglestr(mangled_name)); Delete(mangled_name); state.clazz(TYPE, NewString(Getattr(n, "classtype"))); String *type = SwigType_manglestr(Getattr(n, "classtypeobj")); String *classtype_mangled = NewString(""); Printf(classtype_mangled, "p%s", type); state.clazz(TYPE_MANGLED, classtype_mangled); Delete(type); String *ctor_wrapper = NewString("_wrap_new_veto_"); Append(ctor_wrapper, state.clazz(NAME)); state.clazz(CTOR, ctor_wrapper); state.clazz(CTOR_DISPATCHERS, NewString("")); state.clazz(DTOR, NewString("0")); // HACK: assume that a class is abstract // this is resolved by emitCtor (which is only called for non abstract classes) SetFlag(state.clazz(), IS_ABSTRACT); return SWIG_OK; } int JSEmitter::enterFunction(Node *n) { state.function(RESET); state.function(NAME, Getattr(n, "sym:name")); if (Equal(Getattr(n, "storage"), "static")) { SetFlag(state.function(), IS_STATIC); } return SWIG_OK; } int JSEmitter::enterVariable(Node *n) { // reset the state information for variables. state.variable(RESET); // Retrieve a pure symbol name. Using 'sym:name' as a basis, as it considers %renamings. if (Equal(Getattr(n, "view"), "memberconstantHandler")) { // Note: this is kind of hacky/experimental // For constants/enums 'sym:name' contains e.g., 'Foo_Hello' instead of 'Hello' state.variable(NAME, Getattr(n, "memberconstantHandler:sym:name")); } else { state.variable(NAME, Swig_scopename_last(Getattr(n, "sym:name"))); } if (Equal(Getattr(n, "storage"), "static")) { SetFlag(state.variable(), IS_STATIC); } if (!Language::instance()->is_assignable(n)) { SetFlag(state.variable(), IS_IMMUTABLE); } // FIXME: test "arrays_global" does not compile with that as it is not allowed to assign to char[] if (Equal(Getattr(n, "type"), "a().char")) { SetFlag(state.variable(), IS_IMMUTABLE); } return SWIG_OK; } int JSEmitter::emitCtor(Node *n) { Wrapper *wrapper = NewWrapper(); bool is_overloaded = GetFlag(n, "sym:overloaded") != 0; Template t_ctor(getTemplate("js_ctor")); String *wrap_name = Swig_name_wrapper(Getattr(n, "sym:name")); if (is_overloaded) { t_ctor = getTemplate("js_overloaded_ctor"); Append(wrap_name, Getattr(n, "sym:overname")); } Setattr(n, "wrap:name", wrap_name); // note: we can remove the is_abstract flag now, as this // is called for non-abstract classes only. Setattr(state.clazz(), IS_ABSTRACT, 0); ParmList *params = Getattr(n, "parms"); emit_parameter_variables(params, wrapper); emit_attach_parmmaps(params, wrapper); // HACK: in test-case `ignore_parameter` emit_attach_parmmaps generated an extra line of applied typemaps. // Deleting wrapper->code here, to reset, and as it seemed to have no side effect elsewhere Delete(wrapper->code); wrapper->code = NewString(""); Printf(wrapper->locals, "%sresult;", SwigType_str(Getattr(n, "type"), 0)); marshalInputArgs(n, params, wrapper, Ctor, true, false); String *action = emit_action(n); Printv(wrapper->code, action, "\n", 0); emitCleanupCode(n, wrapper, params); t_ctor.replace("$jswrapper", wrap_name) .replace("$jsmangledtype", state.clazz(TYPE_MANGLED)) .replace("$jslocals", wrapper->locals) .replace("$jscode", wrapper->code) .replace("$jsargcount", Getattr(n, ARGCOUNT)) .pretty_print(f_wrappers); Template t_ctor_case(getTemplate("js_ctor_dispatch_case")); t_ctor_case.replace("$jswrapper", wrap_name) .replace("$jsargcount", Getattr(n, ARGCOUNT)); Append(state.clazz(CTOR_DISPATCHERS), t_ctor_case.str()); DelWrapper(wrapper); // create a dispatching ctor if (is_overloaded) { if (!Getattr(n, "sym:nextSibling")) { String *wrap_name = Swig_name_wrapper(Getattr(n, "sym:name")); Template t_mainctor(getTemplate("js_ctor_dispatcher")); t_mainctor.replace("$jswrapper", wrap_name) .replace("$jsmangledname", state.clazz(NAME_MANGLED)) .replace("$jsdispatchcases", state.clazz(CTOR_DISPATCHERS)) .pretty_print(f_wrappers); state.clazz(CTOR, wrap_name); } } else { state.clazz(CTOR, wrap_name); } return SWIG_OK; } int JSEmitter::emitDtor(Node *n) { String *wrap_name = Swig_name_wrapper(Getattr(n, "sym:name")); SwigType *type = state.clazz(TYPE); String *p_classtype = SwigType_add_pointer(state.clazz(TYPE)); String *ctype = SwigType_lstr(p_classtype, ""); String *free = NewString(""); // (Taken from JSCore implementation.) /* The if (Extend) block was taken from the Ruby implementation. * The problem is that in the case of an %extend to create a destructor for a struct to coordinate automatic memory cleanup with the Javascript collector, * the SWIG function was not being generated. More specifically: struct MyData { %extend { ~MyData() { FreeData($self); } } }; %newobject CreateData; struct MyData* CreateData(void); %delobject FreeData; void FreeData(struct MyData* the_data); where the use case is something like: var my_data = example.CreateData(); my_data = null; This function was not being generated: SWIGINTERN void delete_MyData(struct MyData *self){ FreeData(self); } I don't understand fully why it wasn't being generated. It just seems to happen in the Lua generator. There is a comment about staticmemberfunctionHandler having an inconsistency and I tracked down dome of the SWIGINTERN void delete_* code to that function in the Language base class. The Ruby implementation seems to have an explicit check for if(Extend) and explicitly generates the code, so that's what I'm doing here. The Ruby implementation does other stuff which I omit. */ if (Extend) { String *wrap = Getattr(n, "wrap:code"); if (wrap) { Printv(f_wrappers, wrap, NIL); } } // HACK: this is only for the v8 emitter. maybe set an attribute wrap:action of node // TODO: generate dtors more similar to other wrappers // EW: I think this is wrong. delete should only be used when new was used to create. If malloc was used, free needs to be used. if (SwigType_isarray(type)) { Printf(free, "delete [] (%s)", ctype); } else { Printf(free, "delete (%s)", ctype); } String *destructor_action = Getattr(n, "wrap:action"); // Adapted from the JSCore implementation. /* The next challenge is to generate the correct finalize function for JavaScriptCore to call. Originally, it would use this fragment from javascriptcode.swg %fragment ("JS_destructordefn", "templates") %{ void _wrap_${classname_mangled}_finalize(JSObjectRef thisObject) { SWIG_PRV_DATA* t = (SWIG_PRV_DATA*)JSObjectGetPrivate(thisObject); if(t && t->swigCMemOwn) free ((${type}*)t->swigCObject); if(t) free(t); } %} But for the above example case of %extend to define a destructor on a struct, we need to override the system to not call free ((${type}*)t->swigCObject); and substitute it with what the user has provided. To solve this, I created a variation fragment called JS_destructoroverridedefn: SWIG_PRV_DATA* t = (SWIG_PRV_DATA*)JSObjectGetPrivate(thisObject); if(t && t->swigCMemOwn) { ${type}* arg1 = (${type}*)t->swigCObject; ${destructor_action} } if(t) free(t); Based on what I saw in the Lua and Ruby modules, I use Getattr(n, "wrap:action") to decide if the user has a preferred destructor action. Based on that, I decide which fragment to use. And in the case of the custom action, I substitute that action in. I noticed that destructor_action has the form delete_MyData(arg1); The explicit arg1 is a little funny, so I structured the fragment to create a temporary variable called arg1 to make the generation easier. This might suggest this solution misunderstands a more complex case. Also, there is a problem where destructor_action is always true for me, even when not requesting %extend as above. So this code doesn't actually quite work as I expect. The end result is that the code still works because destructor_action calls free like the original template. The one caveat is the string in destructor_action casts to char* which is weird. I think there is a deeper underlying SWIG issue because I don't think it should be char*. However, it doesn't really matter for free. Maybe the fix for the destructor_action always true problem is that this is supposed to be embedded in the if(Extend) block above. But I don't fully understand the conditions of any of these things, and since it works for the moment, I don't want to break more stuff. */ if (destructor_action) { Template t_dtor = getTemplate("js_dtoroverride"); state.clazz(DTOR, wrap_name); t_dtor.replace("${classname_mangled}", state.clazz(NAME_MANGLED)) .replace("$jswrapper", wrap_name) .replace("$jsfree", free) .replace("$jstype", ctype); t_dtor.replace("${destructor_action}", destructor_action); Wrapper_pretty_print(t_dtor.str(), f_wrappers); } else { Template t_dtor = getTemplate("js_dtor"); state.clazz(DTOR, wrap_name); t_dtor.replace("$jsmangledname", state.clazz(NAME_MANGLED)) .replace("$jswrapper", wrap_name) .replace("$jsfree", free) .replace("$jstype", ctype) .pretty_print(f_wrappers); } Delete(p_classtype); Delete(ctype); Delete(free); return SWIG_OK; } int JSEmitter::emitGetter(Node *n, bool is_member, bool is_static) { Wrapper *wrapper = NewWrapper(); Template t_getter(getTemplate("js_getter")); // prepare wrapper name String *wrap_name = Swig_name_wrapper(Getattr(n, "sym:name")); Setattr(n, "wrap:name", wrap_name); state.variable(GETTER, wrap_name); // prepare local variables ParmList *params = Getattr(n, "parms"); emit_parameter_variables(params, wrapper); emit_attach_parmmaps(params, wrapper); // prepare code part String *action = emit_action(n); marshalInputArgs(n, params, wrapper, Getter, is_member, is_static); marshalOutput(n, params, wrapper, action); emitCleanupCode(n, wrapper, params); t_getter.replace("$jswrapper", wrap_name) .replace("$jslocals", wrapper->locals) .replace("$jscode", wrapper->code) .pretty_print(f_wrappers); DelWrapper(wrapper); return SWIG_OK; } int JSEmitter::emitSetter(Node *n, bool is_member, bool is_static) { // skip variables that are immutable if (State::IsSet(state.variable(IS_IMMUTABLE))) { return SWIG_OK; } Wrapper *wrapper = NewWrapper(); Template t_setter(getTemplate("js_setter")); // prepare wrapper name String *wrap_name = Swig_name_wrapper(Getattr(n, "sym:name")); Setattr(n, "wrap:name", wrap_name); state.variable(SETTER, wrap_name); // prepare local variables ParmList *params = Getattr(n, "parms"); emit_parameter_variables(params, wrapper); emit_attach_parmmaps(params, wrapper); // prepare code part String *action = emit_action(n); marshalInputArgs(n, params, wrapper, Setter, is_member, is_static); Append(wrapper->code, action); emitCleanupCode(n, wrapper, params); t_setter.replace("$jswrapper", wrap_name) .replace("$jslocals", wrapper->locals) .replace("$jscode", wrapper->code) .pretty_print(f_wrappers); DelWrapper(wrapper); return SWIG_OK; } /* ----------------------------------------------------------------------------- * JSEmitter::emitConstant() : triggers code generation for constants * ----------------------------------------------------------------------------- */ int JSEmitter::emitConstant(Node *n) { // HACK: somehow it happened under Mac OS X that before everything started // a lot of SWIG internal constants were emitted // This didn't happen on other platforms yet... // we ignore those premature definitions if (!State::IsSet(state.globals(HAS_TEMPLATES))) { return SWIG_ERROR; } Wrapper *wrapper = NewWrapper(); SwigType *type = Getattr(n, "type"); String *name = Getattr(n, "name"); String *iname = Getattr(n, "sym:name"); String *wname = Swig_name_wrapper(name); String *rawval = Getattr(n, "rawval"); String *value = rawval ? rawval : Getattr(n, "value"); // HACK: forcing usage of cppvalue for v8 (which turned out to fix typdef_struct.i, et. al) if (State::IsSet(state.globals(FORCE_CPP)) && Getattr(n, "cppvalue") != NULL) { value = Getattr(n, "cppvalue"); } Template t_getter(getTemplate("js_getter")); // call the variable methods as a constants are // registered in same way enterVariable(n); state.variable(GETTER, wname); // TODO: why do we need this? Setattr(n, "wrap:name", wname); // special treatment of member pointers if (SwigType_type(type) == T_MPOINTER) { // TODO: this could go into a code-template String *mpointer_wname = NewString(""); Printf(mpointer_wname, "_wrapConstant_%s", iname); Setattr(n, "memberpointer:constant:wrap:name", mpointer_wname); String *str = SwigType_str(type, mpointer_wname); Printf(f_wrappers, "static %s = %s;\n", str, value); Delete(str); value = mpointer_wname; } marshalOutput(n, 0, wrapper, NewString(""), value, false); t_getter.replace("$jswrapper", wname) .replace("$jslocals", wrapper->locals) .replace("$jscode", wrapper->code) .pretty_print(f_wrappers); exitVariable(n); DelWrapper(wrapper); return SWIG_OK; } int JSEmitter::emitFunction(Node *n, bool is_member, bool is_static) { Wrapper *wrapper = NewWrapper(); Template t_function(getTemplate("js_function")); bool is_overloaded = GetFlag(n, "sym:overloaded") != 0; // prepare the function wrapper name String *iname = Getattr(n, "sym:name"); String *wrap_name = Swig_name_wrapper(iname); if (is_overloaded) { t_function = getTemplate("js_overloaded_function"); Append(wrap_name, Getattr(n, "sym:overname")); } Setattr(n, "wrap:name", wrap_name); state.function(WRAPPER_NAME, wrap_name); // prepare local variables ParmList *params = Getattr(n, "parms"); emit_parameter_variables(params, wrapper); emit_attach_parmmaps(params, wrapper); // HACK: in test-case `ignore_parameter` emit_attach_parmmaps generates an extra line of applied typemap. // Deleting wrapper->code here fixes the problem, and seems to have no side effect elsewhere Delete(wrapper->code); wrapper->code = NewString(""); marshalInputArgs(n, params, wrapper, Function, is_member, is_static); String *action = emit_action(n); marshalOutput(n, params, wrapper, action); emitCleanupCode(n, wrapper, params); Replaceall(wrapper->code, "$symname", iname); t_function.replace("$jswrapper", wrap_name) .replace("$jslocals", wrapper->locals) .replace("$jscode", wrapper->code) .replace("$jsargcount", Getattr(n, ARGCOUNT)) .pretty_print(f_wrappers); DelWrapper(wrapper); return SWIG_OK; } int JSEmitter::emitFunctionDispatcher(Node *n, bool /*is_member */ ) { Wrapper *wrapper = NewWrapper(); // Generate call list, go to first node Node *sibl = n; while (Getattr(sibl, "sym:previousSibling")) sibl = Getattr(sibl, "sym:previousSibling"); // go all the way up do { String *siblname = Getattr(sibl, "wrap:name"); if (siblname) { // handle function overloading Template t_dispatch_case = getTemplate("js_function_dispatch_case"); t_dispatch_case.replace("$jswrapper", siblname) .replace("$jsargcount", Getattr(sibl, ARGCOUNT)); Append(wrapper->code, t_dispatch_case.str()); } } while ((sibl = Getattr(sibl, "sym:nextSibling"))); Template t_function(getTemplate("js_function_dispatcher")); // Note: this dispatcher function gets called after the last overloaded function has been created. // At this time, n.wrap:name contains the name of the last wrapper function. // To get a valid function name for the dispatcher function we take the last wrapper name and // substract the extension "sym:overname", String *wrap_name = NewString(Getattr(n, "wrap:name")); String *overname = Getattr(n, "sym:overname"); Node *methodclass = Swig_methodclass(n); String *class_name = Getattr(methodclass, "sym:name"); int l1 = Len(wrap_name); int l2 = Len(overname); Delslice(wrap_name, l1 - l2, l1); String *new_string = NewStringf("%s_%s", class_name, wrap_name); String *final_wrap_name = Swig_name_wrapper(new_string); Setattr(n, "wrap:name", final_wrap_name); state.function(WRAPPER_NAME, final_wrap_name); t_function.replace("$jslocals", wrapper->locals) .replace("$jscode", wrapper->code); // call this here, to replace all variables t_function.replace("$jswrapper", final_wrap_name) .replace("$jsname", state.function(NAME)) .pretty_print(f_wrappers); // Delete the state variable DelWrapper(wrapper); return SWIG_OK; } String *JSEmitter::emitInputTypemap(Node *n, Parm *p, Wrapper *wrapper, String *arg) { // Get input typemap for current param String *tm = Getattr(p, "tmap:in"); SwigType *type = Getattr(p, "type"); if (tm != NULL) { Replaceall(tm, "$input", arg); Setattr(p, "emit:input", arg); // do replacements for built-in variables if (Getattr(p, "wrap:disown") || (Getattr(p, "tmap:in:disown"))) { Replaceall(tm, "$disown", "SWIG_POINTER_DISOWN"); } else { Replaceall(tm, "$disown", "0"); } Replaceall(tm, "$symname", Getattr(n, "sym:name")); Printf(wrapper->code, "%s\n", tm); } else { Swig_warning(WARN_TYPEMAP_IN_UNDEF, input_file, line_number, "Unable to use type %s as a function argument.\n", SwigType_str(type, 0)); } return tm; } void JSEmitter::marshalOutput(Node *n, ParmList *params, Wrapper *wrapper, String *actioncode, const String *cresult, bool emitReturnVariable) { SwigType *type = Getattr(n, "type"); String *tm; Parm *p; // adds a declaration for the result variable if (emitReturnVariable) emit_return_variable(n, type, wrapper); // if not given, use default result identifier ('result') for output typemap if (cresult == 0) cresult = defaultResultName; tm = Swig_typemap_lookup_out("out", n, cresult, wrapper, actioncode); bool should_own = GetFlag(n, "feature:new") != 0; if (tm) { Replaceall(tm, "$objecttype", Swig_scopename_last(SwigType_str(SwigType_strip_qualifiers(type), 0))); if (should_own) { Replaceall(tm, "$owner", "SWIG_POINTER_OWN"); } else { Replaceall(tm, "$owner", "0"); } Append(wrapper->code, tm); if (Len(tm) > 0) { Printf(wrapper->code, "\n"); } } else { Swig_warning(WARN_TYPEMAP_OUT_UNDEF, input_file, line_number, "Unable to use return type %s in function %s.\n", SwigType_str(type, 0), Getattr(n, "name")); } if (params) { for (p = params; p;) { if ((tm = Getattr(p, "tmap:argout"))) { Replaceall(tm, "$input", Getattr(p, "emit:input")); Printv(wrapper->code, tm, "\n", NIL); p = Getattr(p, "tmap:argout:next"); } else { p = nextSibling(p); } } } Replaceall(wrapper->code, "$result", "jsresult"); } void JSEmitter::emitCleanupCode(Node *n, Wrapper *wrapper, ParmList *params) { Parm *p; String *tm; for (p = params; p;) { if ((tm = Getattr(p, "tmap:freearg"))) { //addThrows(n, "tmap:freearg", p); Replaceall(tm, "$input", Getattr(p, "emit:input")); Printv(wrapper->code, tm, "\n", NIL); p = Getattr(p, "tmap:freearg:next"); } else { p = nextSibling(p); } } if (GetFlag(n, "feature:new")) { tm = Swig_typemap_lookup("newfree", n, Swig_cresult_name(), 0); if (tm != NIL) { //addThrows(throws_hash, "newfree", n); Printv(wrapper->code, tm, "\n", NIL); } } /* See if there is any return cleanup code */ if ((tm = Swig_typemap_lookup("ret", n, Swig_cresult_name(), 0))) { Printf(wrapper->code, "%s\n", tm); Delete(tm); } } int JSEmitter::switchNamespace(Node *n) { // HACK: somehow this gets called for member functions. // We can safely ignore them, as members are not associated to a namespace (only their class) if (GetFlag(n, "ismember")) { return SWIG_OK; } // if nspace is deactivated, everything goes into the global scope if (!GetFlag(n, "feature:nspace")) { current_namespace = Getattr(namespaces, "::"); return SWIG_OK; } // EXPERIMENTAL: we want to use Language::getNSpace() here // However, it is not working yet. // For namespace functions Language::getNSpace() does not give a valid result #if 0 JAVASCRIPT *lang = static_cast(Language::instance()); String *_nspace = lang->getNSpace(); if (!Equal(nspace, _nspace)) { Printf(stdout, "##### Custom vs Language::getNSpace(): %s | %s\n", nspace, _nspace); Swig_print_node(n); } #endif String *nspace = Getattr(n, "sym:nspace"); if (nspace == NULL) { // It seems that only classes have 'sym:nspace' set. // We try to get the namespace from the qualified name (i.e., everything before the last '::') nspace = Swig_scopename_prefix(Getattr(n, "name")); } // If there is not even a scopename prefix then it must be global scope if (nspace == NULL) { current_namespace = Getattr(namespaces, "::"); return SWIG_OK; } String *scope = NewString(nspace); // replace "." with "::" that we can use Swig_scopename_last Replaceall(scope, ".", "::"); // if the scope is not yet registered // create (parent) namespaces recursively if (!Getattr(namespaces, scope)) { createNamespace(scope); } current_namespace = Getattr(namespaces, scope); return SWIG_OK; } int JSEmitter::createNamespace(String *scope) { String *parent_scope = Swig_scopename_prefix(scope); Hash *parent_namespace; if (parent_scope == 0) { parent_namespace = Getattr(namespaces, "::"); } else if (!Getattr(namespaces, parent_scope)) { createNamespace(parent_scope); parent_namespace = Getattr(namespaces, parent_scope); } else { parent_namespace = Getattr(namespaces, parent_scope); } assert(parent_namespace != 0); Hash *new_namespace = createNamespaceEntry(Char(scope), Char(Getattr(parent_namespace, "name")), Char(Getattr(parent_namespace, "name_mangled"))); Setattr(namespaces, scope, new_namespace); Delete(parent_scope); return SWIG_OK; } Hash *JSEmitter::createNamespaceEntry(const char *_name, const char *parent, const char *parent_mangled) { Hash *entry = NewHash(); String *name = NewString(_name); Setattr(entry, NAME, Swig_scopename_last(name)); Setattr(entry, NAME_MANGLED, Swig_name_mangle(name)); Setattr(entry, PARENT, NewString(parent)); Setattr(entry, PARENT_MANGLED, NewString(parent_mangled)); Delete(name); return entry; } /********************************************************************** * JavascriptCore: JSEmitter implementation for JavascriptCore engine **********************************************************************/ class JSCEmitter:public JSEmitter { public: JSCEmitter(); virtual ~ JSCEmitter(); virtual int initialize(Node *n); virtual int dump(Node *n); virtual int close(); protected: virtual int enterVariable(Node *n); virtual int exitVariable(Node *n); virtual int enterFunction(Node *n); virtual int exitFunction(Node *n); virtual int enterClass(Node *n); virtual int exitClass(Node *n); virtual void marshalInputArgs(Node *n, ParmList *parms, Wrapper *wrapper, MarshallingMode mode, bool is_member, bool is_static); virtual Hash *createNamespaceEntry(const char *name, const char *parent, const char *parent_mangled); virtual int emitNamespaces(); private: String *NULL_STR; String *VETO_SET; // output file and major code parts File *f_wrap_cpp; File *f_runtime; File *f_header; File *f_init; }; JSCEmitter::JSCEmitter() : JSEmitter(JSEmitter::JavascriptCore), NULL_STR(NewString("NULL")), VETO_SET(NewString("JS_veto_set_variable")), f_wrap_cpp(NULL), f_runtime(NULL), f_header(NULL), f_init(NULL) { } JSCEmitter::~JSCEmitter() { Delete(NULL_STR); Delete(VETO_SET); } /* --------------------------------------------------------------------- * marshalInputArgs() * * Process all of the arguments passed into the argv array * and convert them into C/C++ function arguments using the * supplied typemaps. * --------------------------------------------------------------------- */ void JSCEmitter::marshalInputArgs(Node *n, ParmList *parms, Wrapper *wrapper, MarshallingMode mode, bool is_member, bool is_static) { Parm *p; String *tm; // determine an offset index, as members have an extra 'this' argument // except: static members and ctors. int startIdx = 0; if (is_member && !is_static && mode != Ctor) { startIdx = 1; } // store number of arguments for argument checks int num_args = emit_num_arguments(parms) - startIdx; String *argcount = NewString(""); Printf(argcount, "%d", num_args); Setattr(n, ARGCOUNT, argcount); // process arguments int i = 0; for (p = parms; p; i++) { String *arg = NewString(""); String *type = Getattr(p, "type"); // ignore varargs if (SwigType_isvarargs(type)) break; switch (mode) { case Getter: case Function: if (is_member && !is_static && i == 0) { Printv(arg, "thisObject", 0); } else { Printf(arg, "argv[%d]", i - startIdx); } break; case Setter: if (is_member && !is_static && i == 0) { Printv(arg, "thisObject", 0); } else { Printv(arg, "value", 0); } break; case Ctor: Printf(arg, "argv[%d]", i); break; default: throw "Illegal state."; } tm = emitInputTypemap(n, p, wrapper, arg); Delete(arg); if (tm) { p = Getattr(p, "tmap:in:next"); } else { p = nextSibling(p); } } } int JSCEmitter::initialize(Node *n) { JSEmitter::initialize(n); /* Get the output file name */ String *outfile = Getattr(n, "outfile"); /* Initialize I/O */ f_wrap_cpp = NewFile(outfile, "w", SWIG_output_files()); if (!f_wrap_cpp) { FileErrorDisplay(outfile); SWIG_exit(EXIT_FAILURE); } /* Initialization of members */ f_runtime = NewString(""); f_init = NewString(""); f_header = NewString(""); state.globals(CREATE_NAMESPACES, NewString("")); state.globals(REGISTER_NAMESPACES, NewString("")); state.globals(INITIALIZER, NewString("")); /* Register file targets with the SWIG file handler */ Swig_register_filebyname("begin", f_wrap_cpp); Swig_register_filebyname("header", f_header); Swig_register_filebyname("wrapper", f_wrappers); Swig_register_filebyname("runtime", f_runtime); Swig_register_filebyname("init", f_init); Swig_banner(f_wrap_cpp); return SWIG_OK; } int JSCEmitter::dump(Node *n) { /* Get the module name */ String *module = Getattr(n, "name"); Template initializer_define(getTemplate("js_initializer_define")); initializer_define.replace("$jsname", module).pretty_print(f_header); SwigType_emit_type_table(f_runtime, f_wrappers); Printv(f_wrap_cpp, f_runtime, "\n", 0); Printv(f_wrap_cpp, f_header, "\n", 0); Printv(f_wrap_cpp, f_wrappers, "\n", 0); emitNamespaces(); // compose the initializer function using a template Template initializer(getTemplate("js_initializer")); initializer.replace("$jsname", module) .replace("$jsregisterclasses", state.globals(INITIALIZER)) .replace("$jscreatenamespaces", state.globals(CREATE_NAMESPACES)) .replace("$jsregisternamespaces", state.globals(REGISTER_NAMESPACES)) .pretty_print(f_init); Printv(f_wrap_cpp, f_init, 0); return SWIG_OK; } int JSCEmitter::close() { Delete(f_runtime); Delete(f_header); Delete(f_wrappers); Delete(f_init); Delete(namespaces); Delete(f_wrap_cpp); return SWIG_OK; } int JSCEmitter::enterFunction(Node *n) { JSEmitter::enterFunction(n); return SWIG_OK; } int JSCEmitter::exitFunction(Node *n) { Template t_function = getTemplate("jsc_function_declaration"); bool is_member = GetFlag(n, "ismember") != 0 || GetFlag(n, "feature:extend") != 0; bool is_overloaded = GetFlag(n, "sym:overloaded") != 0; // handle overloaded functions if (is_overloaded) { if (!Getattr(n, "sym:nextSibling")) { //state.function(WRAPPER_NAME, Swig_name_wrapper(Getattr(n, "name"))); // create dispatcher emitFunctionDispatcher(n, is_member); } else { //don't register wrappers of overloaded functions in function tables return SWIG_OK; } } t_function.replace("$jsname", state.function(NAME)) .replace("$jswrapper", state.function(WRAPPER_NAME)); if (is_member) { if (GetFlag(state.function(), IS_STATIC)) { t_function.pretty_print(state.clazz(STATIC_FUNCTIONS)); } else { t_function.pretty_print(state.clazz(MEMBER_FUNCTIONS)); } } else { t_function.pretty_print(Getattr(current_namespace, "functions")); } return SWIG_OK; } int JSCEmitter::enterVariable(Node *n) { JSEmitter::enterVariable(n); state.variable(GETTER, NULL_STR); state.variable(SETTER, VETO_SET); return SWIG_OK; } int JSCEmitter::exitVariable(Node *n) { Template t_variable(getTemplate("jsc_variable_declaration")); t_variable.replace("$jsname", state.variable(NAME)) .replace("$jsgetter", state.variable(GETTER)) .replace("$jssetter", state.variable(SETTER)); if (GetFlag(n, "ismember")) { if (GetFlag(state.variable(), IS_STATIC) || Equal(Getattr(n, "nodeType"), "enumitem")) { t_variable.pretty_print(state.clazz(STATIC_VARIABLES)); } else { t_variable.pretty_print(state.clazz(MEMBER_VARIABLES)); } } else { t_variable.pretty_print(Getattr(current_namespace, "values")); } return SWIG_OK; } int JSCEmitter::enterClass(Node *n) { JSEmitter::enterClass(n); state.clazz(MEMBER_VARIABLES, NewString("")); state.clazz(MEMBER_FUNCTIONS, NewString("")); state.clazz(STATIC_VARIABLES, NewString("")); state.clazz(STATIC_FUNCTIONS, NewString("")); Template t_class_decl = getTemplate("jsc_class_declaration"); t_class_decl.replace("$jsmangledname", state.clazz(NAME_MANGLED)) .pretty_print(f_wrappers); return SWIG_OK; } int JSCEmitter::exitClass(Node *n) { Template t_class_tables(getTemplate("jsc_class_tables")); t_class_tables.replace("$jsmangledname", state.clazz(NAME_MANGLED)) .replace("$jsclassvariables", state.clazz(MEMBER_VARIABLES)) .replace("$jsclassfunctions", state.clazz(MEMBER_FUNCTIONS)) .replace("$jsstaticclassfunctions", state.clazz(STATIC_FUNCTIONS)) .replace("$jsstaticclassvariables", state.clazz(STATIC_VARIABLES)) .pretty_print(f_wrappers); /* adds the ctor wrappers at this position */ // Note: this is necessary to avoid extra forward declarations. //Append(f_wrappers, state.clazz(CTOR_WRAPPERS)); // for abstract classes add a vetoing ctor if (GetFlag(state.clazz(), IS_ABSTRACT)) { Template t_veto_ctor(getTemplate("js_veto_ctor")); t_veto_ctor.replace("$jswrapper", state.clazz(CTOR)) .replace("$jsname", state.clazz(NAME)) .pretty_print(f_wrappers); } /* adds a class template statement to initializer function */ Template t_classtemplate(getTemplate("jsc_class_definition")); /* prepare registration of base class */ String *jsclass_inheritance = NewString(""); Node *base_class = getBaseClass(n); if (base_class != NULL) { Template t_inherit(getTemplate("jsc_class_inherit")); t_inherit.replace("$jsmangledname", state.clazz(NAME_MANGLED)) .replace("$jsbaseclassmangled", SwigType_manglestr(Getattr(base_class, "name"))) .pretty_print(jsclass_inheritance); } else { Template t_inherit(getTemplate("jsc_class_noinherit")); t_inherit.replace("$jsmangledname", state.clazz(NAME_MANGLED)) .pretty_print(jsclass_inheritance); } t_classtemplate.replace("$jsmangledname", state.clazz(NAME_MANGLED)) .replace("$jsmangledtype", state.clazz(TYPE_MANGLED)) .replace("$jsclass_inheritance", jsclass_inheritance) .replace("$jsctor", state.clazz(CTOR)) .replace("$jsdtor", state.clazz(DTOR)) .pretty_print(state.globals(INITIALIZER)); Delete(jsclass_inheritance); /* Note: this makes sure that there is a swig_type added for this class */ SwigType_remember_clientdata(state.clazz(TYPE_MANGLED), NewString("0")); /* adds a class registration statement to initializer function */ Template t_registerclass(getTemplate("jsc_class_registration")); t_registerclass.replace("$jsname", state.clazz(NAME)) .replace("$jsmangledname", state.clazz(NAME_MANGLED)) .replace("$jsnspace", Getattr(state.clazz("nspace"), NAME_MANGLED)) .pretty_print(state.globals(INITIALIZER)); return SWIG_OK; } Hash *JSCEmitter::createNamespaceEntry(const char *name, const char *parent, const char *parent_mangled) { Hash *entry = JSEmitter::createNamespaceEntry(name, parent, parent_mangled); Setattr(entry, "functions", NewString("")); Setattr(entry, "values", NewString("")); return entry; } int JSCEmitter::emitNamespaces() { Iterator it; for (it = First(namespaces); it.item; it = Next(it)) { Hash *entry = it.item; String *name = Getattr(entry, NAME); String *name_mangled = Getattr(entry, NAME_MANGLED); String *parent_mangled = Getattr(entry, PARENT_MANGLED); String *functions = Getattr(entry, "functions"); String *variables = Getattr(entry, "values"); // skip the global namespace which is given by the application Template namespace_definition(getTemplate("jsc_nspace_declaration")); namespace_definition.replace("$jsglobalvariables", variables) .replace("$jsglobalfunctions", functions) .replace("$jsnspace", name_mangled) .replace("$jsmangledname", name_mangled) .pretty_print(f_wrap_cpp); Template t_createNamespace(getTemplate("jsc_nspace_definition")); t_createNamespace.replace("$jsmangledname", name_mangled); Append(state.globals(CREATE_NAMESPACES), t_createNamespace.str()); // Don't register 'exports' as namespace. It is return to the application. if (!Equal("exports", name)) { Template t_registerNamespace(getTemplate("jsc_nspace_registration")); t_registerNamespace.replace("$jsmangledname", name_mangled) .replace("$jsname", name) .replace("$jsparent", parent_mangled); Append(state.globals(REGISTER_NAMESPACES), t_registerNamespace.str()); } } return SWIG_OK; } JSEmitter *swig_javascript_create_JSCEmitter() { return new JSCEmitter(); } /********************************************************************** * V8: JSEmitter implementation for V8 engine **********************************************************************/ class V8Emitter:public JSEmitter { public: V8Emitter(); virtual ~ V8Emitter(); virtual int initialize(Node *n); virtual int dump(Node *n); virtual int close(); virtual int enterClass(Node *n); virtual int exitClass(Node *n); virtual int enterVariable(Node *n); virtual int exitVariable(Node *n); virtual int exitFunction(Node *n); protected: virtual void marshalInputArgs(Node *n, ParmList *parms, Wrapper *wrapper, MarshallingMode mode, bool is_member, bool is_static); virtual int emitNamespaces(); protected: /* built-in parts */ String *f_runtime; String *f_header; String *f_init; String *f_post_init; /* part for class templates */ String *f_class_templates; /* parts for initilizer */ String *f_init_namespaces; String *f_init_class_templates; String *f_init_wrappers; String *f_init_inheritance; String *f_init_class_instances; String *f_init_static_wrappers; String *f_init_register_classes; String *f_init_register_namespaces; // the output cpp file File *f_wrap_cpp; String *NULL_STR; String *VETO_SET; String *moduleName; }; V8Emitter::V8Emitter() : JSEmitter(JSEmitter::V8), NULL_STR(NewString("0")), VETO_SET(NewString("JS_veto_set_variable")) { } V8Emitter::~V8Emitter() { Delete(NULL_STR); Delete(VETO_SET); } int V8Emitter::initialize(Node *n) { JSEmitter::initialize(n); moduleName = Getattr(n, "name"); // Get the output file name String *outfile = Getattr(n, "outfile"); f_wrap_cpp = NewFile(outfile, "w", SWIG_output_files()); if (!f_wrap_cpp) { FileErrorDisplay(outfile); SWIG_exit(EXIT_FAILURE); } f_runtime = NewString(""); f_header = NewString(""); f_class_templates = NewString(""); f_init = NewString(""); f_post_init = NewString(""); f_init_namespaces = NewString(""); f_init_class_templates = NewString(""); f_init_wrappers = NewString(""); f_init_inheritance = NewString(""); f_init_class_instances = NewString(""); f_init_static_wrappers = NewString(""); f_init_register_classes = NewString(""); f_init_register_namespaces = NewString(""); // note: this is necessary for built-in generation of SWIG runtime code Swig_register_filebyname("begin", f_wrap_cpp); Swig_register_filebyname("runtime", f_runtime); Swig_register_filebyname("header", f_header); Swig_register_filebyname("wrapper", f_wrappers); Swig_register_filebyname("init", f_init); Swig_register_filebyname("post-init", f_post_init); state.globals(FORCE_CPP, NewString("1")); Swig_banner(f_wrap_cpp); return SWIG_OK; } int V8Emitter::dump(Node *n) { /* Get the module name */ String *module = Getattr(n, "name"); Template initializer_define(getTemplate("js_initializer_define")); initializer_define.replace("$jsname", module).pretty_print(f_header); SwigType_emit_type_table(f_runtime, f_wrappers); Printv(f_wrap_cpp, f_runtime, "\n", 0); Printv(f_wrap_cpp, f_header, "\n", 0); Printv(f_wrap_cpp, f_class_templates, "\n", 0); Printv(f_wrap_cpp, f_wrappers, "\n", 0); emitNamespaces(); // compose the initializer function using a template // filled with sub-parts Template initializer(getTemplate("js_initializer")); initializer.replace("$jsname", moduleName) .replace("$jsv8nspaces", f_init_namespaces) .replace("$jsv8classtemplates", f_init_class_templates) .replace("$jsv8wrappers", f_init_wrappers) .replace("$jsv8inheritance", f_init_inheritance) .replace("$jsv8classinstances", f_init_class_instances) .replace("$jsv8staticwrappers", f_init_static_wrappers) .replace("$jsv8registerclasses", f_init_register_classes) .replace("$jsv8registernspaces", f_init_register_namespaces); Printv(f_init, initializer.str(), 0); Printv(f_wrap_cpp, f_init, 0); Printv(f_wrap_cpp, f_post_init, 0); return SWIG_OK; } int V8Emitter::close() { Delete(f_runtime); Delete(f_header); Delete(f_class_templates); Delete(f_init_namespaces); Delete(f_init_class_templates); Delete(f_init_wrappers); Delete(f_init_inheritance); Delete(f_init_class_instances); Delete(f_init_static_wrappers); Delete(f_init_register_classes); Delete(f_init_register_namespaces); Delete(f_init); Delete(f_post_init); Delete(f_wrap_cpp); return SWIG_OK; } int V8Emitter::enterClass(Node *n) { JSEmitter::enterClass(n); // emit declaration of a v8 class template Template t_decl_class(getTemplate("jsv8_declare_class_template")); t_decl_class.replace("$jsmangledname", state.clazz(NAME_MANGLED)) .trim() .pretty_print(f_class_templates); return SWIG_OK; } int V8Emitter::exitClass(Node *n) { if (GetFlag(state.clazz(), IS_ABSTRACT)) { Template t_veto_ctor(getTemplate("js_veto_ctor")); t_veto_ctor.replace("$jswrapper", state.clazz(CTOR)) .replace("$jsname", state.clazz(NAME)) .pretty_print(f_wrappers); } /* Note: this makes sure that there is a swig_type added for this class */ String *clientData = NewString(""); Printf(clientData, "&%s_clientData", state.clazz(NAME_MANGLED)); /* Note: this makes sure that there is a swig_type added for this class */ SwigType_remember_clientdata(state.clazz(TYPE_MANGLED), NewString("0")); // emit definition of v8 class template Template t_def_class = getTemplate("jsv8_define_class_template"); t_def_class.replace("$jsmangledname", state.clazz(NAME_MANGLED)) .replace("$jsname", state.clazz(NAME)) .replace("$jsmangledtype", state.clazz(TYPE_MANGLED)) .replace("$jsdtor", state.clazz(DTOR)) .trim() .pretty_print(f_init_class_templates); Template t_class_instance = getTemplate("jsv8_create_class_instance"); t_class_instance.replace("$jsname", state.clazz(NAME)) .replace("$jsmangledname", state.clazz(NAME_MANGLED)) .replace("$jsctor", state.clazz(CTOR)) .trim() .pretty_print(f_init_class_instances); // emit inheritance setup Node *baseClass = getBaseClass(n); if (baseClass) { String *base_name = Getattr(baseClass, "name"); Template t_inherit = getTemplate("jsv8_inherit"); String *base_name_mangled = SwigType_manglestr(base_name); t_inherit.replace("$jsmangledname", state.clazz(NAME_MANGLED)) .replace("$jsbaseclass", base_name_mangled) .trim() .pretty_print(f_init_inheritance); Delete(base_name_mangled); } // emit registration of class template Template t_register = getTemplate("jsv8_register_class"); t_register.replace("$jsmangledname", state.clazz(NAME_MANGLED)) .replace("$jsname", state.clazz(NAME)) .replace("$jsparent", Getattr(state.clazz("nspace"), NAME_MANGLED)) .trim() .pretty_print(f_init_register_classes); return SWIG_OK; } int V8Emitter::enterVariable(Node *n) { JSEmitter::enterVariable(n); state.variable(GETTER, NULL_STR); state.variable(SETTER, VETO_SET); return SWIG_OK; } int V8Emitter::exitVariable(Node *n) { if (GetFlag(n, "ismember")) { if (GetFlag(state.variable(), IS_STATIC) || Equal(Getattr(n, "nodeType"), "enumitem")) { Template t_register = getTemplate("jsv8_register_static_variable"); t_register.replace("$jsparent", state.clazz(NAME_MANGLED)) .replace("$jsname", state.variable(NAME)) .replace("$jsgetter", state.variable(GETTER)) .replace("$jssetter", state.variable(SETTER)) .trim() .pretty_print(f_init_static_wrappers); } else { Template t_register = getTemplate("jsv8_register_member_variable"); t_register.replace("$jsmangledname", state.clazz(NAME_MANGLED)) .replace("$jsname", state.variable(NAME)) .replace("$jsgetter", state.variable(GETTER)) .replace("$jssetter", state.variable(SETTER)) .trim() .pretty_print(f_init_wrappers); } } else { // Note: a global variable is treated like a static variable // with the parent being a nspace object (instead of class object) Template t_register = getTemplate("jsv8_register_static_variable"); t_register.replace("$jsparent", Getattr(current_namespace, NAME_MANGLED)) .replace("$jsname", state.variable(NAME)) .replace("$jsgetter", state.variable(GETTER)) .replace("$jssetter", state.variable(SETTER)) .trim() .pretty_print(f_init_wrappers); } return SWIG_OK; } int V8Emitter::exitFunction(Node *n) { bool is_member = GetFlag(n, "ismember") != 0 || GetFlag(n, "feature:extend") != 0; // create a dispatcher for overloaded functions bool is_overloaded = GetFlag(n, "sym:overloaded") != 0; if (is_overloaded) { if (!Getattr(n, "sym:nextSibling")) { //state.function(WRAPPER_NAME, Swig_name_wrapper(Getattr(n, "name"))); emitFunctionDispatcher(n, is_member); } else { //don't register wrappers of overloaded functions in function tables return SWIG_OK; } } // register the function at the specific context if (is_member) { if (GetFlag(state.function(), IS_STATIC)) { Template t_register = getTemplate("jsv8_register_static_function"); t_register.replace("$jsparent", state.clazz(NAME_MANGLED)) .replace("$jsname", state.function(NAME)) .replace("$jswrapper", state.function(WRAPPER_NAME)) .trim() .pretty_print(f_init_static_wrappers); } else { Template t_register = getTemplate("jsv8_register_member_function"); t_register.replace("$jsmangledname", state.clazz(NAME_MANGLED)) .replace("$jsname", state.function(NAME)) .replace("$jswrapper", state.function(WRAPPER_NAME)) .trim() .pretty_print(f_init_wrappers); } } else { // Note: a global function is treated like a static function // with the parent being a nspace object instead of class object Template t_register = getTemplate("jsv8_register_static_function"); t_register.replace("$jsparent", Getattr(current_namespace, NAME_MANGLED)) .replace("$jsname", state.function(NAME)) .replace("$jswrapper", state.function(WRAPPER_NAME)) .trim() .pretty_print(f_init_static_wrappers); } return SWIG_OK; } void V8Emitter::marshalInputArgs(Node *n, ParmList *parms, Wrapper *wrapper, MarshallingMode mode, bool is_member, bool is_static) { Parm *p; String *tm; int startIdx = 0; if (is_member && !is_static && mode != Ctor) { startIdx = 1; } // store number of arguments for argument checks int num_args = emit_num_arguments(parms) - startIdx; String *argcount = NewString(""); Printf(argcount, "%d", num_args); Setattr(n, ARGCOUNT, argcount); int i = 0; for (p = parms; p; i++) { String *arg = NewString(""); String *type = Getattr(p, "type"); // ignore varargs if (SwigType_isvarargs(type)) break; switch (mode) { case Getter: if (is_member && !is_static && i == 0) { Printv(arg, "info.Holder()", 0); } else { Printf(arg, "args[%d]", i - startIdx); } break; case Function: if (is_member && !is_static && i == 0) { Printv(arg, "args.Holder()", 0); } else { Printf(arg, "args[%d]", i - startIdx); } break; case Setter: if (is_member && !is_static && i == 0) { Printv(arg, "info.Holder()", 0); } else { Printv(arg, "value", 0); } break; case Ctor: Printf(arg, "args[%d]", i); break; default: throw "Illegal state."; } tm = emitInputTypemap(n, p, wrapper, arg); Delete(arg); if (tm) { p = Getattr(p, "tmap:in:next"); } else { p = nextSibling(p); } } } int V8Emitter::emitNamespaces() { Iterator it; for (it = First(namespaces); it.item; it = Next(it)) { Hash *entry = it.item; String *name = Getattr(entry, NAME); String *name_mangled = Getattr(entry, NAME_MANGLED); String *parent = Getattr(entry, PARENT); String *parent_mangled = Getattr(entry, PARENT_MANGLED); bool do_create = true; bool do_register = true; if (Equal(parent, "")) { do_register = false; } // Note: 'exports' is by convention the name of the object where // globals are stored into if (Equal(name, "exports")) { do_create = false; } if (do_create) { // create namespace object and register it to the parent scope Template t_create_ns = getTemplate("jsv8_create_namespace"); t_create_ns.replace("$jsmangledname", name_mangled) .trim() .pretty_print(f_init_namespaces); } if (do_register) { Template t_register_ns = getTemplate("jsv8_register_namespace"); t_register_ns.replace("$jsmangledname", name_mangled) .replace("$jsname", name) .replace("$jsparent", parent_mangled) .trim(); // prepend in order to achieve reversed order of registration statements String *tmp_register_stmt = NewString(""); t_register_ns.pretty_print(tmp_register_stmt); Insert(f_init_register_namespaces, 0, tmp_register_stmt); Delete(tmp_register_stmt); } } return SWIG_OK; } JSEmitter *swig_javascript_create_V8Emitter() { return new V8Emitter(); } /********************************************************************** * Helper implementations **********************************************************************/ JSEmitterState::JSEmitterState() : globalHash(NewHash()) { // initialize sub-hashes Setattr(globalHash, "class", NewHash()); Setattr(globalHash, "function", NewHash()); Setattr(globalHash, "variable", NewHash()); } JSEmitterState::~JSEmitterState() { Delete(globalHash); } DOH *JSEmitterState::getState(const char *key, bool new_key) { if (new_key) { Hash *hash = NewHash(); Setattr(globalHash, key, hash); } return Getattr(globalHash, key); } DOH *JSEmitterState::globals() { return globalHash; } DOH *JSEmitterState::globals(const char *key, DOH *initial) { if (initial != 0) { Setattr(globalHash, key, initial); } return Getattr(globalHash, key); } DOH *JSEmitterState::clazz(bool new_key) { return getState("class", new_key); } DOH *JSEmitterState::clazz(const char *key, DOH *initial) { DOH *c = clazz(); if (initial != 0) { Setattr(c, key, initial); } return Getattr(c, key); } DOH *JSEmitterState::function(bool new_key) { return getState("function", new_key); } DOH *JSEmitterState::function(const char *key, DOH *initial) { DOH *f = function(); if (initial != 0) { Setattr(f, key, initial); } return Getattr(f, key); } DOH *JSEmitterState::variable(bool new_key) { return getState("variable", new_key); } DOH *JSEmitterState::variable(const char *key, DOH *initial) { DOH *v = variable(); if (initial != 0) { Setattr(v, key, initial); } return Getattr(v, key); } /*static*/ int JSEmitterState::IsSet(DOH *val) { if (!val) { return 0; } else { const char *cval = Char(val); if (!cval) return 0; return (strcmp(cval, "0") != 0) ? 1 : 0; } } /* ----------------------------------------------------------------------------- * Template::Template() : creates a Template class for given template code * ----------------------------------------------------------------------------- */ Template::Template(const String *code_) { if (!code_) { Printf(stdout, "Template code was null. Illegal input for template."); SWIG_exit(EXIT_FAILURE); } code = NewString(code_); templateName = NewString(""); } Template::Template(const String *code_, const String *templateName_) { if (!code_) { Printf(stdout, "Template code was null. Illegal input for template."); SWIG_exit(EXIT_FAILURE); } code = NewString(code_); templateName = NewString(templateName_); } /* ----------------------------------------------------------------------------- * Template::~Template() : cleans up of Template. * ----------------------------------------------------------------------------- */ Template::~Template() { Delete(code); Delete(templateName); } /* ----------------------------------------------------------------------------- * String* Template::str() : retrieves the current content of the template. * ----------------------------------------------------------------------------- */ String *Template::str() { if (js_template_enable_debug) { String *pre_code = NewString(""); String *post_code = NewString(""); String *debug_code = NewString(""); Printf(pre_code, "/* begin fragment(\"%s\") */", templateName); Printf(post_code, "/* end fragment(\"%s\") */", templateName); Printf(debug_code, "%s\n%s\n%s\n", pre_code, code, post_code); Delete(code); Delete(pre_code); Delete(post_code); code = debug_code; } return code; } Template & Template::trim() { const char *str = Char(code); if (str == 0) return *this; int length = Len(code); if (length == 0) return *this; int idx; for (idx = 0; idx < length; ++idx) { if (str[idx] != ' ' && str[idx] != '\t' && str[idx] != '\r' && str[idx] != '\n') break; } int start_pos = idx; for (idx = length - 1; idx >= start_pos; --idx) { if (str[idx] != ' ' && str[idx] != '\t' && str[idx] != '\r' && str[idx] != '\n') break; } int end_pos = idx; int new_length = end_pos - start_pos + 1; char *newstr = new char[new_length + 1]; memcpy(newstr, str + start_pos, new_length); newstr[new_length] = 0; Delete(code); code = NewString(newstr); delete[]newstr; return *this; } /* ----------------------------------------------------------------------------- * Template& Template::replace(const String* pattern, const String* repl) : * * replaces all occurrences of a given pattern with a given replacement. * * - pattern: the pattern to be replaced * - repl: the replacement string * - returns a reference to the Template to allow chaining of methods. * ----------------------------------------------------------------------------- */ Template & Template::replace(const String *pattern, const String *repl) { Replaceall(code, pattern, repl); return *this; } Template & Template::print(DOH *doh) { Printv(doh, str(), 0); return *this; } Template & Template::pretty_print(DOH *doh) { Wrapper_pretty_print(str(), doh); return *this; } Template::Template(const Template & t) { code = NewString(t.code); templateName = NewString(t.templateName); } void Template::operator=(const Template & t) { Delete(code); Delete(templateName); code = NewString(t.code); templateName = NewString(t.templateName); } swig-4.0.1/Source/Modules/directors.cxx0000644000175000017500000001750113527063513017746 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * directors.cxx * * Director support functions. * Not all of these may be necessary, and some may duplicate existing functionality * in SWIG. --MR * ----------------------------------------------------------------------------- */ #include "swigmod.h" /* ----------------------------------------------------------------------------- * Swig_csuperclass_call() * * Generates a fully qualified method call, including the full parameter list. * e.g. "base::method(i, j)" * ----------------------------------------------------------------------------- */ String *Swig_csuperclass_call(String *base, String *method, ParmList *l) { String *call = NewString(""); int arg_idx = 0; Parm *p; if (base) { Printf(call, "%s::", base); } Printf(call, "%s(", method); for (p = l; p; p = nextSibling(p)) { String *pname = Getattr(p, "name"); if (!pname && Cmp(Getattr(p, "type"), "void")) { pname = NewString(""); Printf(pname, "arg%d", arg_idx++); } if (p != l) Printf(call, ", "); Printv(call, pname, NIL); } Printf(call, ")"); return call; } /* ----------------------------------------------------------------------------- * Swig_class_declaration() * * Generate the start of a class/struct declaration. * e.g. "class myclass" * ----------------------------------------------------------------------------- */ String *Swig_class_declaration(Node *n, String *name) { if (!name) { name = Getattr(n, "sym:name"); } String *result = NewString(""); String *kind = Getattr(n, "kind"); Printf(result, "%s %s", kind, name); return result; } /* ----------------------------------------------------------------------------- * Swig_class_name() * ----------------------------------------------------------------------------- */ String *Swig_class_name(Node *n) { String *name; name = Copy(Getattr(n, "sym:name")); return name; } /* ----------------------------------------------------------------------------- * Swig_director_declaration() * * Generate the full director class declaration, complete with base classes. * e.g. "class SwigDirector_myclass : public myclass, public Swig::Director {" * ----------------------------------------------------------------------------- */ String *Swig_director_declaration(Node *n) { String *classname = Swig_class_name(n); String *directorname = Language::instance()->directorClassName(n); String *base = Getattr(n, "classtype"); String *declaration = Swig_class_declaration(n, directorname); Printf(declaration, " : public %s, public Swig::Director {\n", base); Delete(classname); Delete(directorname); return declaration; } /* ----------------------------------------------------------------------------- * Swig_method_call() * ----------------------------------------------------------------------------- */ String *Swig_method_call(const_String_or_char_ptr name, ParmList *parms) { String *func; int i = 0; int comma = 0; Parm *p = parms; SwigType *pt; String *nname; func = NewString(""); nname = SwigType_namestr(name); Printf(func, "%s(", nname); while (p) { String *pname; pt = Getattr(p, "type"); if ((SwigType_type(pt) != T_VOID)) { if (comma) Printf(func, ","); pname = Getattr(p, "name"); Printf(func, "%s", pname); comma = 1; i++; } p = nextSibling(p); } Printf(func, ")"); return func; } /* ----------------------------------------------------------------------------- * Swig_method_decl() * * Return a stringified version of a C/C++ declaration. * ----------------------------------------------------------------------------- */ String *Swig_method_decl(SwigType *return_base_type, SwigType *decl, const_String_or_char_ptr id, List *args, int default_args) { String *result = NewString(""); bool conversion_operator = Strstr(id, "operator ") != 0 && !return_base_type; Parm *parm = args; int arg_idx = 0; while (parm) { String *type = Getattr(parm, "type"); String *name = Getattr(parm, "name"); if (!name && Cmp(type, "void")) { name = NewString(""); Printf(name, "arg%d", arg_idx++); Setattr(parm, "name", name); } parm = nextSibling(parm); } String *rettype = Copy(decl); String *quals = SwigType_pop_function_qualifiers(rettype); String *qualifiers = 0; if (quals) qualifiers = SwigType_str(quals, 0); String *popped_decl = SwigType_pop_function(rettype); if (return_base_type) Append(rettype, return_base_type); if (!conversion_operator) { SwigType *rettype_stripped = SwigType_strip_qualifiers(rettype); String *rtype = SwigType_str(rettype, 0); Append(result, rtype); if (SwigType_issimple(rettype_stripped) && return_base_type) Append(result, " "); Delete(rtype); Delete(rettype_stripped); } if (id) Append(result, id); String *args_string = default_args ? ParmList_str_defaultargs(args) : ParmList_str(args); Printv(result, "(", args_string, ")", NIL); if (qualifiers) Printv(result, " ", qualifiers, NIL); // Reformat result to how it has been historically Replaceall(result, ",", ", "); Replaceall(result, "=", " = "); Delete(args_string); Delete(popped_decl); Delete(qualifiers); Delete(quals); Delete(rettype); return result; } /* ----------------------------------------------------------------------------- * Swig_director_emit_dynamic_cast() * * In order to call protected virtual director methods from the target language, we need * to add an extra dynamic_cast to call the public C++ wrapper in the director class. * Also for non-static protected members when the allprotected option is on. * ----------------------------------------------------------------------------- */ void Swig_director_emit_dynamic_cast(Node *n, Wrapper *f) { // TODO: why is the storage element removed in staticmemberfunctionHandler ?? if ((!is_public(n) && (is_member_director(n) || GetFlag(n, "explicitcall"))) || (is_non_virtual_protected_access(n) && !(Swig_storage_isstatic_custom(n, "staticmemberfunctionHandler:storage") || Swig_storage_isstatic(n)) && !Equal(nodeType(n), "constructor"))) { Node *parent = Getattr(n, "parentNode"); String *dirname; String *dirdecl; dirname = Language::instance()->directorClassName(parent); dirdecl = NewStringf("%s *darg = 0", dirname); Wrapper_add_local(f, "darg", dirdecl); Printf(f->code, "darg = dynamic_cast<%s *>(arg1);\n", dirname); Delete(dirname); Delete(dirdecl); } } /* ----------------------------------------------------------------------------- * Swig_director_parms_fixup() * * For each parameter in the C++ member function, copy the parameter name * to its "lname"; this ensures that Swig_typemap_attach_parms() will do * the right thing when it sees strings like "$1" in "directorin" typemaps. * ----------------------------------------------------------------------------- */ void Swig_director_parms_fixup(ParmList *parms) { Parm *p; int i; for (i = 0, p = parms; p; p = nextSibling(p), ++i) { String *arg = Getattr(p, "name"); String *lname = 0; if (!arg && !Equal(Getattr(p, "type"), "void")) { lname = NewStringf("arg%d", i); Setattr(p, "name", lname); } else lname = Copy(arg); Setattr(p, "lname", lname); Delete(lname); } } swig-4.0.1/Source/Modules/xml.cxx0000644000175000017500000002110313527063513016541 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * xml.cxx * * An Xml parse tree generator. * ----------------------------------------------------------------------------- */ #include "swigmod.h" static const char *usage = "\ XML Options (available with -xml)\n\ -xmllang - Typedef language\n\ -xmllite - More lightweight version of XML\n\ ------\n\ deprecated (use -o): -xml - Use as output file (extension .xml mandatory)\n"; static File *out = 0; static int xmllite = 0; class XML:public Language { public: int indent_level; long id; XML() :indent_level(0) , id(0) { } virtual ~ XML() { } virtual void main(int argc, char *argv[]) { SWIG_typemap_lang("xml"); for (int iX = 0; iX < argc; iX++) { if (strcmp(argv[iX], "-xml") == 0) { char *extension = 0; if (iX + 1 >= argc) continue; extension = argv[iX + 1] + strlen(argv[iX + 1]) - 4; if (strcmp(extension, ".xml")) continue; iX++; Swig_mark_arg(iX); String *outfile = NewString(argv[iX]); out = NewFile(outfile, "w", SWIG_output_files()); if (!out) { FileErrorDisplay(outfile); SWIG_exit(EXIT_FAILURE); } continue; } if (strcmp(argv[iX], "-xmllang") == 0) { Swig_mark_arg(iX); iX++; SWIG_typemap_lang(argv[iX]); Swig_mark_arg(iX); continue; } if (strcmp(argv[iX], "-help") == 0) { fputs(usage, stdout); } if (strcmp(argv[iX], "-xmllite") == 0) { Swig_mark_arg(iX); xmllite = 1; } } // Add a symbol to the parser for conditional compilation Preprocessor_define("SWIGXML 1", 0); } /* Top of the parse tree */ virtual int top(Node *n) { if (out == 0) { String *outfile = Getattr(n, "outfile"); String *ext = Swig_file_extension(outfile); // If there's an extension, ext will include the ".". Delslice(outfile, Len(outfile) - Len(ext), DOH_END); Delete(ext); Append(outfile, ".xml"); out = NewFile(outfile, "w", SWIG_output_files()); if (!out) { FileErrorDisplay(outfile); SWIG_exit(EXIT_FAILURE); } } Printf(out, " \n"); Xml_print_tree(n); return SWIG_OK; } void print_indent(int l) { int i; for (i = 0; i < indent_level; i++) { Printf(out, " "); } if (l) { Printf(out, " "); } } void Xml_print_tree(DOH *obj) { while (obj) { Xml_print_node(obj); obj = nextSibling(obj); } } void Xml_print_attributes(Node *obj) { String *k; indent_level += 4; print_indent(0); Printf(out, "\n", ++id, obj); indent_level += 4; Iterator ki; ki = First(obj); while (ki.key) { k = ki.key; if ((Cmp(k, "nodeType") == 0) || (Cmp(k, "firstChild") == 0) || (Cmp(k, "lastChild") == 0) || (Cmp(k, "parentNode") == 0) || (Cmp(k, "nextSibling") == 0) || (Cmp(k, "previousSibling") == 0) || (*(Char(k)) == '$')) { /* Do nothing */ } else if (Cmp(k, "module") == 0) { Xml_print_module(Getattr(obj, k)); } else if (Cmp(k, "baselist") == 0) { Xml_print_baselist(Getattr(obj, k)); } else if (!xmllite && Cmp(k, "typescope") == 0) { Xml_print_typescope(Getattr(obj, k)); } else if (!xmllite && Cmp(k, "typetab") == 0) { Xml_print_typetab(Getattr(obj, k)); } else if (Cmp(k, "kwargs") == 0) { Xml_print_kwargs(Getattr(obj, k)); } else if (Cmp(k, "parms") == 0 || Cmp(k, "pattern") == 0) { Xml_print_parmlist(Getattr(obj, k)); } else if (Cmp(k, "catchlist") == 0 || Cmp(k, "templateparms") == 0) { Xml_print_parmlist(Getattr(obj, k), Char(k)); } else { DOH *o; print_indent(0); if (DohIsString(Getattr(obj, k))) { String *ck = NewString(k); o = Str(Getattr(obj, k)); Replaceall(ck, ":", "_"); Replaceall(ck, "<", "<"); /* Do first to avoid aliasing errors. */ Replaceall(o, "&", "&"); Replaceall(o, "<", "<"); Replaceall(o, "\"", """); Replaceall(o, "\\", "\\\\"); Replaceall(o, "\n", " "); Printf(out, "\n", ck, o, ++id, o); Delete(o); Delete(ck); } else { o = Getattr(obj, k); String *ck = NewString(k); Replaceall(ck, ":", "_"); Printf(out, "\n", ck, o, ++id, o); Delete(ck); } } ki = Next(ki); } indent_level -= 4; print_indent(0); Printf(out, "\n"); indent_level -= 4; } void Xml_print_node(Node *obj) { Node *cobj; print_indent(0); Printf(out, "<%s id=\"%ld\" addr=\"%p\" >\n", nodeType(obj), ++id, obj); Xml_print_attributes(obj); cobj = firstChild(obj); if (cobj) { indent_level += 4; Printf(out, "\n"); Xml_print_tree(cobj); indent_level -= 4; } else { print_indent(1); Printf(out, "\n"); } print_indent(0); Printf(out, "\n", nodeType(obj)); } void Xml_print_parmlist(ParmList *p, const char* markup = "parmlist") { print_indent(0); Printf(out, "<%s id=\"%ld\" addr=\"%p\" >\n", markup, ++id, p); indent_level += 4; while (p) { print_indent(0); Printf(out, "\n", ++id); Xml_print_attributes(p); print_indent(0); Printf(out, "\n"); p = nextSibling(p); } indent_level -= 4; print_indent(0); Printf(out, "\n", markup); } void Xml_print_baselist(List *p) { print_indent(0); Printf(out, "\n", ++id, p); indent_level += 4; Iterator s; for (s = First(p); s.item; s = Next(s)) { print_indent(0); String *item_name = Xml_escape_string(s.item); Printf(out, "\n", item_name, ++id, s.item); Delete(item_name); } indent_level -= 4; print_indent(0); Printf(out, "\n"); } String *Xml_escape_string(String *str) { String *escaped_str = 0; if (str) { escaped_str = NewString(str); Replaceall(escaped_str, "&", "&"); Replaceall(escaped_str, "<", "<"); Replaceall(escaped_str, "\"", """); Replaceall(escaped_str, "\\", "\\\\"); Replaceall(escaped_str, "\n", " "); } return escaped_str; } void Xml_print_module(Node *p) { print_indent(0); Printf(out, "\n", Getattr(p, "name"), ++id, p); } void Xml_print_kwargs(Hash *p) { Xml_print_hash(p, "kwargs"); } void Xml_print_typescope(Hash *p) { Xml_print_hash(p, "typescope"); } void Xml_print_typetab(Hash *p) { Xml_print_hash(p, "typetab"); } void Xml_print_hash(Hash *p, const char *markup) { print_indent(0); Printf(out, "<%s id=\"%ld\" addr=\"%p\" >\n", markup, ++id, p); Xml_print_attributes(p); indent_level += 4; Iterator n = First(p); while (n.key) { print_indent(0); Printf(out, "<%ssitem id=\"%ld\" addr=\"%p\" >\n", markup, ++id, n.item); Xml_print_attributes(n.item); print_indent(0); Printf(out, "\n", markup); n = Next(n); } indent_level -= 4; print_indent(0); Printf(out, "\n", markup); } }; /* ----------------------------------------------------------------------------- * Swig_print_xml * * Dump an XML version of the parse tree. This is different from using the -xml * language module normally as it allows the real language module to process the * tree first, possibly stuffing in new attributes, so the XML that is output ends * up being a post-processing version of the tree. * ----------------------------------------------------------------------------- */ void Swig_print_xml(DOH *obj, String *filename) { XML xml; xmllite = 1; if (!filename) { out = stdout; } else { out = NewFile(filename, "w", SWIG_output_files()); if (!out) { FileErrorDisplay(filename); SWIG_exit(EXIT_FAILURE); } } Printf(out, " \n"); xml.Xml_print_tree(obj); } static Language *new_swig_xml() { return new XML(); } extern "C" Language *swig_xml(void) { return new_swig_xml(); } swig-4.0.1/Source/Modules/d.cxx0000644000175000017500000047574313527063513016213 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * d.cxx * * D language module for SWIG. * ----------------------------------------------------------------------------- */ #include "swigmod.h" #include "cparse.h" #include // Hash type used for storing information about director callbacks for a class. typedef DOH UpcallData; class D : public Language { static const char *usage; const String *empty_string; const String *public_string; const String *protected_string; /* * Files and file sections containing C/C++ code. */ File *f_begin; File *f_runtime; File *f_runtime_h; File *f_header; File *f_wrappers; File *f_init; File *f_directors; File *f_directors_h; List *filenames_list; /* * Command line-set modes of operation. */ // Whether a single proxy D module is generated or classes and enums are // written to their own files. bool split_proxy_dmodule; // The major D version targeted (currently 1 or 2). unsigned short d_version; /* * State variables which indicate what is being wrapped at the moment. * This is probably not the most elegant way of handling state, but it has * proven to work in the C# and Java modules. */ // Indicates if wrapping a native function. bool native_function_flag; // Indicates if wrapping a static functions or member variables bool static_flag; // Indicates if wrapping a nonstatic member variable bool variable_wrapper_flag; // Indicates if wrapping a member variable/enum/const. bool wrapping_member_flag; // Indicates if wrapping a global variable. bool global_variable_flag; // Name of a variable being wrapped. String *variable_name; /* * Variables temporarily holding the generated C++ code. */ // C++ code for the generated wrapper functions for casts up the C++ // for inheritance hierarchies. String *upcasts_code; // Function pointer typedefs for handling director callbacks on the C++ side. String *director_callback_typedefs; // Variables for storing the function pointers to the director callbacks on // the C++ side. String *director_callback_pointers; /* * Names of generated D entities. */ // The name of the D module containing the interface to the C wrapper. String *im_dmodule_name; // The fully qualified name of the wrap D module (package name included). String *im_dmodule_fq_name; // The name of the proxy module which exposes the (SWIG) module contents as a // D module. String *proxy_dmodule_name; // The fully qualified name of the proxy D module. String *proxy_dmodule_fq_name; // Optional: Package the D modules are placed in (set via the -package // command line option). String *package; // The directory the generated D module files are written to. Is constructed // from the package path if a target package is set, points to the general // output directory otherwise. String *dmodule_directory; // The name of the library which contains the C wrapper (used when generating // the dynamic library loader). Can be overridden via the -wrapperlibrary // command line flag. String *wrap_library_name; /* * Variables temporarily holding the generated D code. */ // Import statements written to the intermediary D module header set via // %pragma(d) imdmoduleimports. String *im_dmodule_imports; // The code for the intermediary D module body. String *im_dmodule_code; // Import statements for all proxy modules (the main proxy module and, if in // split proxy module mode, the proxy class modules) from // %pragma(d) globalproxyimports. String *global_proxy_imports; // The D code for the main proxy modules. nspace_proxy_dmodules is a hash from // the namespace name as key to an {"imports", "code"}. If the nspace feature // is not active, only proxy_dmodule_imports and proxy_dmodule_code are used, // which contain the code for the root proxy module. // // These variables should not be accessed directly but rather via the // proxy{Imports, Code}Buffer)() helper functions which return the right // buffer for a given namespace. If not in split proxy mode, they contain the // whole proxy code. String *proxy_dmodule_imports; String *proxy_dmodule_code; Hash *nspace_proxy_dmodules; // The D code generated for the currently processed enum. String *proxy_enum_code; /* * D data for the current proxy class. * * These strings are mainly used to temporarily accumulate code from the * various member handling functions while a single class is processed and are * no longer relevant once that class has been finished, i.e. after * classHandler() has returned. */ // The unqualified name of the current proxy class. String *proxy_class_name; // The name of the current proxy class, qualified with the name of the // namespace it is in, if any. String *proxy_class_qname; // The import directives for the current proxy class. They are written to the // same D module the proxy class is written to. String *proxy_class_imports; // Code for enumerations nested in the current proxy class. Is emitted earlier // than the rest of the body to work around forward referencing-issues. String *proxy_class_enums_code; // The generated D code making up the body of the current proxy class. String *proxy_class_body_code; // D code which is emitted right after the proxy class. String *proxy_class_epilogue_code; // The full code for the current proxy class, including the epilogue. String* proxy_class_code; // Contains a D call to the function wrapping C++ the destructor of the // current class (if there is a public C++ destructor). String *destructor_call; // D code for the director callbacks generated for the current class. String *director_dcallbacks_code; /* * Code for dynamically loading the wrapper library on the D side. */ // D code which is inserted into the im D module if dynamic linking is used. String *wrapper_loader_code; // The D code to bind a function pointer to a library symbol. String *wrapper_loader_bind_command; // The cumulated binding commands binding all the functions declared in the // intermediary D module to the C/C++ library symbols. String *wrapper_loader_bind_code; /* * Director data. */ List *dmethods_seq; Hash *dmethods_table; int n_dmethods; int first_class_dmethod; int curr_class_dmethod; /* * SWIG types data. */ // Collects information about encountered types SWIG does not know about (e.g. // incomplete types). This is used later to generate type wrapper proxy // classes for the unknown types. Hash *unknown_types; public: /* --------------------------------------------------------------------------- * D::D() * --------------------------------------------------------------------------- */ D():empty_string(NewString("")), public_string(NewString("public")), protected_string(NewString("protected")), f_begin(NULL), f_runtime(NULL), f_runtime_h(NULL), f_header(NULL), f_wrappers(NULL), f_init(NULL), f_directors(NULL), f_directors_h(NULL), filenames_list(NULL), split_proxy_dmodule(false), d_version(1), native_function_flag(false), static_flag(false), variable_wrapper_flag(false), wrapping_member_flag(false), global_variable_flag(false), variable_name(NULL), upcasts_code(NULL), director_callback_typedefs(NULL), director_callback_pointers(NULL), im_dmodule_name(NULL), im_dmodule_fq_name(NULL), proxy_dmodule_name(NULL), proxy_dmodule_fq_name(NULL), package(NULL), dmodule_directory(NULL), wrap_library_name(NULL), im_dmodule_imports(NULL), im_dmodule_code(NULL), global_proxy_imports(NULL), proxy_dmodule_imports(NULL), proxy_dmodule_code(NULL), nspace_proxy_dmodules(NULL), proxy_enum_code(NULL), proxy_class_name(NULL), proxy_class_qname(NULL), proxy_class_imports(NULL), proxy_class_enums_code(NULL), proxy_class_body_code(NULL), proxy_class_epilogue_code(NULL), proxy_class_code(NULL), destructor_call(NULL), director_dcallbacks_code(NULL), wrapper_loader_code(NULL), wrapper_loader_bind_command(NULL), wrapper_loader_bind_code(NULL), dmethods_seq(NULL), dmethods_table(NULL), n_dmethods(0), first_class_dmethod(0), curr_class_dmethod(0), unknown_types(NULL) { // For now, multiple inheritance with directors is not possible. It should be // easy to implement though. director_multiple_inheritance = 0; director_language = 1; // Not used: Delete(none_comparison); none_comparison = NewString(""); } /* --------------------------------------------------------------------------- * D::main() * --------------------------------------------------------------------------- */ virtual void main(int argc, char *argv[]) { SWIG_library_directory("d"); // Look for certain command line options for (int i = 1; i < argc; i++) { if (argv[i]) { if ((strcmp(argv[i], "-d2") == 0)) { Swig_mark_arg(i); d_version = 2; } else if (strcmp(argv[i], "-wrapperlibrary") == 0) { if (argv[i + 1]) { wrap_library_name = NewString(""); Printf(wrap_library_name, argv[i + 1]); Swig_mark_arg(i); Swig_mark_arg(i + 1); i++; } else { Swig_arg_error(); } } else if (strcmp(argv[i], "-package") == 0) { if (argv[i + 1]) { package = NewString(""); Printf(package, argv[i + 1]); Swig_mark_arg(i); Swig_mark_arg(i + 1); i++; } else { Swig_arg_error(); } } else if ((strcmp(argv[i], "-splitproxy") == 0)) { Swig_mark_arg(i); split_proxy_dmodule = true; } else if (strcmp(argv[i], "-help") == 0) { Printf(stdout, "%s\n", usage); } } } // Add a symbol to the parser for conditional compilation Preprocessor_define("SWIGD 1", 0); // Also make the target D version available as preprocessor symbol for // use in our library files. String *version_define = NewStringf("SWIG_D_VERSION %u", d_version); Preprocessor_define(version_define, 0); Delete(version_define); // Add typemap definitions SWIG_typemap_lang("d"); SWIG_config_file("d.swg"); allow_overloading(); } /* --------------------------------------------------------------------------- * D::top() * --------------------------------------------------------------------------- */ virtual int top(Node *n) { // Get any options set in the module directive Node *optionsnode = Getattr(Getattr(n, "module"), "options"); if (optionsnode) { if (Getattr(optionsnode, "imdmodulename")) { im_dmodule_name = Copy(Getattr(optionsnode, "imdmodulename")); } if (Getattr(optionsnode, "directors")) { // Check if directors are enabled for this module. Note: This is a // "master switch", if it is not set, not director code will be emitted // at all. %feature("director") statements are also required to enable // directors for individual classes or methods. // // Use the »directors« attributte of the %module directive to enable // director generation (e.g. »%module(directors="1") modulename«). allow_directors(); } if (Getattr(optionsnode, "dirprot")) { allow_dirprot(); } allow_allprotected(GetFlag(optionsnode, "allprotected")); } /* Initialize all of the output files */ String *outfile = Getattr(n, "outfile"); String *outfile_h = Getattr(n, "outfile_h"); if (!outfile) { Printf(stderr, "Unable to determine outfile\n"); SWIG_exit(EXIT_FAILURE); } f_begin = NewFile(outfile, "w", SWIG_output_files()); if (!f_begin) { FileErrorDisplay(outfile); SWIG_exit(EXIT_FAILURE); } if (directorsEnabled()) { if (!outfile_h) { Printf(stderr, "Unable to determine outfile_h\n"); SWIG_exit(EXIT_FAILURE); } f_runtime_h = NewFile(outfile_h, "w", SWIG_output_files()); if (!f_runtime_h) { FileErrorDisplay(outfile_h); SWIG_exit(EXIT_FAILURE); } } f_runtime = NewString(""); f_init = NewString(""); f_header = NewString(""); f_wrappers = NewString(""); f_directors_h = NewString(""); f_directors = NewString(""); /* Register file targets with the SWIG file handler */ Swig_register_filebyname("header", f_header); Swig_register_filebyname("wrapper", f_wrappers); Swig_register_filebyname("begin", f_begin); Swig_register_filebyname("runtime", f_runtime); Swig_register_filebyname("init", f_init); Swig_register_filebyname("director", f_directors); Swig_register_filebyname("director_h", f_directors_h); unknown_types = NewHash(); filenames_list = NewList(); // Make the package name and the resulting module output path. if (package) { // Append a dot so we can prepend the package variable directly to the // module names in the rest of the code. Printv(package, ".", NIL); } else { // Write the generated D modules to the »root« package by default. package = NewString(""); } dmodule_directory = Copy(SWIG_output_directory()); if (Len(package) > 0) { String *package_directory = Copy(package); Replaceall(package_directory, ".", SWIG_FILE_DELIMITER); Printv(dmodule_directory, package_directory, NIL); Delete(package_directory); } // Make the wrap and proxy D module names. // The wrap module name can be set in the module directive. if (!im_dmodule_name) { im_dmodule_name = NewStringf("%s_im", Getattr(n, "name")); } im_dmodule_fq_name = NewStringf("%s%s", package, im_dmodule_name); proxy_dmodule_name = Copy(Getattr(n, "name")); proxy_dmodule_fq_name = NewStringf("%s%s", package, proxy_dmodule_name); im_dmodule_code = NewString(""); proxy_class_imports = NewString(""); proxy_class_enums_code = NewString(""); proxy_class_body_code = NewString(""); proxy_class_epilogue_code = NewString(""); proxy_class_code = NewString(""); destructor_call = NewString(""); proxy_dmodule_code = NewString(""); proxy_dmodule_imports = NewString(""); nspace_proxy_dmodules = NewHash(); im_dmodule_imports = NewString(""); upcasts_code = NewString(""); global_proxy_imports = NewString(""); wrapper_loader_code = NewString(""); wrapper_loader_bind_command = NewString(""); wrapper_loader_bind_code = NewString(""); dmethods_seq = NewList(); dmethods_table = NewHash(); n_dmethods = 0; // By default, expect the dynamically loaded wrapper library to be named // [lib]_wrap[.so/.dll]. if (!wrap_library_name) wrap_library_name = NewStringf("%s_wrap", Getattr(n, "name")); Swig_banner(f_begin); Printf(f_runtime, "\n\n#ifndef SWIGD\n#define SWIGD\n#endif\n\n"); if (directorsEnabled()) { Printf(f_runtime, "#define SWIG_DIRECTORS\n"); /* Emit initial director header and director code: */ Swig_banner(f_directors_h); Printf(f_directors_h, "\n"); Printf(f_directors_h, "#ifndef SWIG_%s_WRAP_H_\n", proxy_dmodule_name); Printf(f_directors_h, "#define SWIG_%s_WRAP_H_\n\n", proxy_dmodule_name); Printf(f_directors, "\n\n"); Printf(f_directors, "/* ---------------------------------------------------\n"); Printf(f_directors, " * C++ director class methods\n"); Printf(f_directors, " * --------------------------------------------------- */\n\n"); if (outfile_h) { String *filename = Swig_file_filename(outfile_h); Printf(f_directors, "#include \"%s\"\n\n", filename); Delete(filename); } } Printf(f_runtime, "\n"); Swig_name_register("wrapper", "D_%f"); Printf(f_wrappers, "\n#ifdef __cplusplus\n"); Printf(f_wrappers, "extern \"C\" {\n"); Printf(f_wrappers, "#endif\n\n"); // Emit all the wrapper code. Language::top(n); if (directorsEnabled()) { // Insert director runtime into the f_runtime file (before %header section). Swig_insert_file("director_common.swg", f_runtime); Swig_insert_file("director.swg", f_runtime); } // Generate the wrap D module. // TODO: Add support for »static« linking. { String *filen = NewStringf("%s%s.d", dmodule_directory, im_dmodule_name); File *im_d_file = NewFile(filen, "w", SWIG_output_files()); if (!im_d_file) { FileErrorDisplay(filen); SWIG_exit(EXIT_FAILURE); } Append(filenames_list, Copy(filen)); Delete(filen); filen = NULL; // Start writing out the intermediary class file. emitBanner(im_d_file); Printf(im_d_file, "module %s;\n", im_dmodule_fq_name); Printv(im_d_file, im_dmodule_imports, "\n", NIL); Replaceall(wrapper_loader_code, "$wraplibrary", wrap_library_name); Replaceall(wrapper_loader_code, "$wrapperloaderbindcode", wrapper_loader_bind_code); Replaceall(wrapper_loader_code, "$module", proxy_dmodule_name); Printf(im_d_file, "%s\n", wrapper_loader_code); // Add the wrapper function declarations. replaceModuleVariables(im_dmodule_code); Printv(im_d_file, im_dmodule_code, NIL); Delete(im_d_file); } // Generate the main D proxy module. { String *filen = NewStringf("%s%s.d", dmodule_directory, proxy_dmodule_name); File *proxy_d_file = NewFile(filen, "w", SWIG_output_files()); if (!proxy_d_file) { FileErrorDisplay(filen); SWIG_exit(EXIT_FAILURE); } Append(filenames_list, Copy(filen)); Delete(filen); filen = NULL; emitBanner(proxy_d_file); Printf(proxy_d_file, "module %s;\n", proxy_dmodule_fq_name); Printf(proxy_d_file, "\nstatic import %s;\n", im_dmodule_fq_name); Printv(proxy_d_file, global_proxy_imports, NIL); Printv(proxy_d_file, proxy_dmodule_imports, NIL); Printv(proxy_d_file, "\n", NIL); // Write a D type wrapper class for each SWIG type to the proxy module code. for (Iterator swig_type = First(unknown_types); swig_type.key; swig_type = Next(swig_type)) { writeTypeWrapperClass(swig_type.key, swig_type.item); } // Add the proxy functions (and classes, if they are not written to a separate file). replaceModuleVariables(proxy_dmodule_code); Printv(proxy_d_file, proxy_dmodule_code, NIL); Delete(proxy_d_file); } // Generate the additional proxy modules for nspace support. for (Iterator it = First(nspace_proxy_dmodules); it.key; it = Next(it)) { String *module_name = createLastNamespaceName(it.key); String *filename = NewStringf("%s%s.d", outputDirectory(it.key), module_name); File *file = NewFile(filename, "w", SWIG_output_files()); if (!file) { FileErrorDisplay(filename); SWIG_exit(EXIT_FAILURE); } Delete(filename); emitBanner(file); Printf(file, "module %s%s.%s;\n", package, it.key, module_name); Printf(file, "\nstatic import %s;\n", im_dmodule_fq_name); Printv(file, global_proxy_imports, NIL); Printv(file, Getattr(it.item, "imports"), NIL); Printv(file, "\n", NIL); String *code = Getattr(it.item, "code"); replaceModuleVariables(code); Printv(file, code, NIL); Delete(file); Delete(module_name); } if (upcasts_code) Printv(f_wrappers, upcasts_code, NIL); Printf(f_wrappers, "#ifdef __cplusplus\n"); Printf(f_wrappers, "}\n"); Printf(f_wrappers, "#endif\n"); // Check for overwriting file problems on filesystems that are case insensitive Iterator it1; Iterator it2; for (it1 = First(filenames_list); it1.item; it1 = Next(it1)) { String *item1_lower = Swig_string_lower(it1.item); for (it2 = Next(it1); it2.item; it2 = Next(it2)) { String *item2_lower = Swig_string_lower(it2.item); if (it1.item && it2.item) { if (Strcmp(item1_lower, item2_lower) == 0) { Swig_warning(WARN_LANG_PORTABILITY_FILENAME, input_file, line_number, "Portability warning: File %s will be overwritten by %s on case insensitive filesystems such as " "Windows' FAT32 and NTFS unless the class/module name is renamed\n", it1.item, it2.item); } } Delete(item2_lower); } Delete(item1_lower); } Delete(unknown_types); unknown_types = NULL; Delete(filenames_list); filenames_list = NULL; Delete(im_dmodule_name); im_dmodule_name = NULL; Delete(im_dmodule_fq_name); im_dmodule_fq_name = NULL; Delete(im_dmodule_code); im_dmodule_code = NULL; Delete(proxy_class_imports); proxy_class_imports = NULL; Delete(proxy_class_enums_code); proxy_class_enums_code = NULL; Delete(proxy_class_body_code); proxy_class_body_code = NULL; Delete(proxy_class_epilogue_code); proxy_class_epilogue_code = NULL; Delete(proxy_class_code); proxy_class_code = NULL; Delete(destructor_call); destructor_call = NULL; Delete(proxy_dmodule_name); proxy_dmodule_name = NULL; Delete(proxy_dmodule_fq_name); proxy_dmodule_fq_name = NULL; Delete(proxy_dmodule_code); proxy_dmodule_code = NULL; Delete(proxy_dmodule_imports); proxy_dmodule_imports = NULL; Delete(nspace_proxy_dmodules); nspace_proxy_dmodules = NULL; Delete(im_dmodule_imports); im_dmodule_imports = NULL; Delete(upcasts_code); upcasts_code = NULL; Delete(global_proxy_imports); global_proxy_imports = NULL; Delete(wrapper_loader_code); wrapper_loader_code = NULL; Delete(wrapper_loader_bind_code); wrapper_loader_bind_code = NULL; Delete(wrapper_loader_bind_command); wrapper_loader_bind_command = NULL; Delete(dmethods_seq); dmethods_seq = NULL; Delete(dmethods_table); dmethods_table = NULL; Delete(package); package = NULL; Delete(dmodule_directory); dmodule_directory = NULL; n_dmethods = 0; // Merge all the generated C/C++ code and close the output files. Dump(f_runtime, f_begin); Dump(f_header, f_begin); if (directorsEnabled()) { Dump(f_directors, f_begin); Dump(f_directors_h, f_runtime_h); Printf(f_runtime_h, "\n"); Printf(f_runtime_h, "#endif\n"); Delete(f_runtime_h); f_runtime_h = NULL; Delete(f_directors); f_directors = NULL; Delete(f_directors_h); f_directors_h = NULL; } Dump(f_wrappers, f_begin); Wrapper_pretty_print(f_init, f_begin); Delete(f_header); Delete(f_wrappers); Delete(f_init); Delete(f_runtime); Delete(f_begin); return SWIG_OK; } /* --------------------------------------------------------------------------- * D::insertDirective() * --------------------------------------------------------------------------- */ virtual int insertDirective(Node *n) { int ret = SWIG_OK; String *code = Getattr(n, "code"); String *section = Getattr(n, "section"); replaceModuleVariables(code); if (!ImportMode && (Cmp(section, "proxycode") == 0)) { if (proxy_class_body_code) { Swig_typemap_replace_embedded_typemap(code, n); Printv(proxy_class_body_code, code, NIL); } } else { ret = Language::insertDirective(n); } return ret; } /* --------------------------------------------------------------------------- * D::pragmaDirective() * * Valid Pragmas: * imdmodulecode - text (D code) is copied verbatim to the wrap module * imdmoduleimports - import statements for the im D module * * proxydmodulecode - text (D code) is copied verbatim to the proxy module * (the main proxy module if in split proxy mode). * globalproxyimports - import statements inserted into _all_ proxy modules. * * wrapperloadercode - D code for loading the wrapper library (is copied to * the im D module). * wrapperloaderbindcommand - D code for binding a symbol from the wrapper * library to the declaration in the im D module. * --------------------------------------------------------------------------- */ virtual int pragmaDirective(Node *n) { if (!ImportMode) { String *lang = Getattr(n, "lang"); String *code = Getattr(n, "name"); String *value = Getattr(n, "value"); if (Strcmp(lang, "d") == 0) { String *strvalue = NewString(value); Replaceall(strvalue, "\\\"", "\""); if (Strcmp(code, "imdmodulecode") == 0) { Printf(im_dmodule_code, "%s\n", strvalue); } else if (Strcmp(code, "imdmoduleimports") == 0) { replaceImportTypeMacros(strvalue); Chop(strvalue); Printf(im_dmodule_imports, "%s\n", strvalue); } else if (Strcmp(code, "proxydmodulecode") == 0) { Printf(proxyCodeBuffer(0), "%s\n", strvalue); } else if (Strcmp(code, "globalproxyimports") == 0) { replaceImportTypeMacros(strvalue); Chop(strvalue); Printf(global_proxy_imports, "%s\n", strvalue); } else if (Strcmp(code, "wrapperloadercode") == 0) { Delete(wrapper_loader_code); wrapper_loader_code = Copy(strvalue); } else if (Strcmp(code, "wrapperloaderbindcommand") == 0) { Delete(wrapper_loader_bind_command); wrapper_loader_bind_command = Copy(strvalue); } else { Swig_error(input_file, line_number, "Unrecognized pragma.\n"); } Delete(strvalue); } } return Language::pragmaDirective(n); } /* --------------------------------------------------------------------------- * D::enumDeclaration() * * Wraps C/C++ enums as D enums. * --------------------------------------------------------------------------- */ virtual int enumDeclaration(Node *n) { if (ImportMode) return SWIG_OK; if (getCurrentClass() && (cplus_mode != PUBLIC)) return SWIG_NOWRAP; proxy_enum_code = NewString(""); String *symname = Getattr(n, "sym:name"); String *typemap_lookup_type = Getattr(n, "name"); // Emit the enum declaration. if (typemap_lookup_type) { const String *enummodifiers = lookupCodeTypemap(n, "dclassmodifiers", typemap_lookup_type, WARN_D_TYPEMAP_CLASSMOD_UNDEF); Printv(proxy_enum_code, "\n", enummodifiers, " ", symname, " {\n", NIL); } else { // Handle anonymous enums. Printv(proxy_enum_code, "\nenum {\n", NIL); } // Emit each enum item. Language::enumDeclaration(n); if (GetFlag(n, "nonempty")) { // Finish the enum. if (typemap_lookup_type) { Printv(proxy_enum_code, lookupCodeTypemap(n, "dcode", typemap_lookup_type, WARN_NONE), // Extra D code "\n}\n", NIL); } else { // Handle anonymous enums. Printv(proxy_enum_code, "\n}\n", NIL); } Replaceall(proxy_enum_code, "$dclassname", symname); } else { // D enum declarations must have at least one member to be legal, so emit // an alias to int instead (their ctype/imtype is always int). Delete(proxy_enum_code); proxy_enum_code = NewStringf("\nalias int %s;\n", symname); } const String* imports = lookupCodeTypemap(n, "dimports", typemap_lookup_type, WARN_NONE); String* imports_trimmed; if (Len(imports) > 0) { imports_trimmed = Copy(imports); Chop(imports_trimmed); replaceImportTypeMacros(imports_trimmed); Printv(imports_trimmed, "\n", NIL); } else { imports_trimmed = NewString(""); } if (is_wrapping_class()) { // Enums defined within the C++ class are written into the proxy // class. Printv(proxy_class_imports, imports_trimmed, NIL); Printv(proxy_class_enums_code, proxy_enum_code, NIL); } else { // Write non-anonymous enums to their own file if in split proxy module // mode. if (split_proxy_dmodule && typemap_lookup_type) { assertClassNameValidity(proxy_class_name); String *nspace = Getattr(n, "sym:nspace"); String *output_directory = outputDirectory(nspace); String *filename = NewStringf("%s%s.d", output_directory, symname); Delete(output_directory); File *class_file = NewFile(filename, "w", SWIG_output_files()); if (!class_file) { FileErrorDisplay(filename); SWIG_exit(EXIT_FAILURE); } Append(filenames_list, Copy(filename)); Delete(filename); emitBanner(class_file); if (nspace) { Printf(class_file, "module %s%s.%s;\n", package, nspace, symname); } else { Printf(class_file, "module %s%s;\n", package, symname); } Printv(class_file, imports_trimmed, NIL); Printv(class_file, proxy_enum_code, NIL); Delete(class_file); } else { String *nspace = Getattr(n, "sym:nspace"); Printv(proxyImportsBuffer(nspace), imports, NIL); Printv(proxyCodeBuffer(nspace), proxy_enum_code, NIL); } } Delete(imports_trimmed); Delete(proxy_enum_code); proxy_enum_code = NULL; return SWIG_OK; } /* --------------------------------------------------------------------------- * D::enumvalueDeclaration() * --------------------------------------------------------------------------- */ virtual int enumvalueDeclaration(Node *n) { if (getCurrentClass() && (cplus_mode != PUBLIC)) return SWIG_NOWRAP; Swig_require("enumvalueDeclaration", n, "*name", "?value", NIL); String *value = Getattr(n, "value"); String *name = Getattr(n, "name"); Node *parent = parentNode(n); String *tmpValue; // Strange hack from parent method. // RESEARCH: What is this doing? if (value) tmpValue = NewString(value); else tmpValue = NewString(name); // Note that this is used in enumValue() amongst other places Setattr(n, "value", tmpValue); // Deal with enum values that are not int int swigtype = SwigType_type(Getattr(n, "type")); if (swigtype == T_BOOL) { const char *val = Equal(Getattr(n, "enumvalue"), "true") ? "1" : "0"; Setattr(n, "enumvalue", val); } else if (swigtype == T_CHAR) { String *val = NewStringf("'%(escape)s'", Getattr(n, "enumvalue")); Setattr(n, "enumvalue", val); Delete(val); } // Emit the enum item. { if (!GetFlag(n, "firstenumitem")) Printf(proxy_enum_code, ",\n"); Printf(proxy_enum_code, " %s", Getattr(n, "sym:name")); // Check for the %dconstvalue feature String *value = Getattr(n, "feature:d:constvalue"); // Note that in D, enum values must be compile-time constants. Thus, // %dmanifestconst(0) (getting the enum values at runtime) is not supported. value = value ? value : Getattr(n, "enumvalue"); if (value) { Printf(proxy_enum_code, " = %s", value); } // Keep track that the currently processed enum has at least one value. SetFlag(parent, "nonempty"); } Delete(tmpValue); Swig_restore(n); return SWIG_OK; } /* --------------------------------------------------------------------------- * D::memberfunctionHandler() * --------------------------------------------------------------------------- */ virtual int memberfunctionHandler(Node *n) { Language::memberfunctionHandler(n); String *overloaded_name = getOverloadedName(n); String *intermediary_function_name = Swig_name_member(getNSpace(), proxy_class_name, overloaded_name); Setattr(n, "imfuncname", intermediary_function_name); String *proxy_func_name = Getattr(n, "sym:name"); Setattr(n, "proxyfuncname", proxy_func_name); if (split_proxy_dmodule && Len(Getattr(n, "parms")) == 0 && Strncmp(proxy_func_name, package, Len(proxy_func_name)) == 0) { // If we are in split proxy mode and the function is named like the // target package, the D compiler is unable to resolve the ambiguity // between the package name and an argument-less function call. // TODO: This might occur with nspace as well, augment the check. Swig_warning(WARN_D_NAME_COLLISION, input_file, line_number, "%s::%s might collide with the package name, consider using %%rename to resolve the ambiguity.\n", proxy_class_name, proxy_func_name); } writeProxyClassFunction(n); Delete(overloaded_name); // For each function, look if we have to alias in the parent class function // for the overload resolution process to work as expected from C++ // (http://www.digitalmars.com/d/2.0/function.html#function-inheritance). // For multiple overloads, only emit the alias directive once (for the // last method, »sym:nextSibling« is null then). // Smart pointer classes do not mirror the inheritance hierarchy of the // underlying types, so aliasing the base class methods in is not required // for them. // DMD BUG: We have to emit the alias after the last function because // taking a delegate in the overload checking code fails otherwise // (http://d.puremagic.com/issues/show_bug.cgi?id=4860). if (!Getattr(n, "sym:nextSibling") && !is_smart_pointer() && !areAllOverloadsOverridden(n)) { String *name = Getattr(n, "sym:name"); Printf(proxy_class_body_code, "\nalias $dbaseclass.%s %s;\n", name, name); } return SWIG_OK; } /* --------------------------------------------------------------------------- * D::staticmemberfunctionHandler() * --------------------------------------------------------------------------- */ virtual int staticmemberfunctionHandler(Node *n) { static_flag = true; Language::staticmemberfunctionHandler(n); String *overloaded_name = getOverloadedName(n); String *intermediary_function_name = Swig_name_member(getNSpace(), proxy_class_name, overloaded_name); Setattr(n, "proxyfuncname", Getattr(n, "sym:name")); Setattr(n, "imfuncname", intermediary_function_name); writeProxyClassFunction(n); Delete(overloaded_name); static_flag = false; return SWIG_OK; } /* --------------------------------------------------------------------------- * D::globalvariableHandler() * --------------------------------------------------------------------------- */ virtual int globalvariableHandler(Node *n) { variable_name = Getattr(n, "sym:name"); global_variable_flag = true; int ret = Language::globalvariableHandler(n); global_variable_flag = false; return ret; } /* --------------------------------------------------------------------------- * D::membervariableHandler() * --------------------------------------------------------------------------- */ virtual int membervariableHandler(Node *n) { variable_name = Getattr(n, "sym:name"); wrapping_member_flag = true; variable_wrapper_flag = true; Language::membervariableHandler(n); wrapping_member_flag = false; variable_wrapper_flag = false; return SWIG_OK; } /* --------------------------------------------------------------------------- * D::staticmembervariableHandler() * --------------------------------------------------------------------------- */ virtual int staticmembervariableHandler(Node *n) { if (GetFlag(n, "feature:d:manifestconst") != 1) { Delattr(n, "value"); } variable_name = Getattr(n, "sym:name"); wrapping_member_flag = true; static_flag = true; Language::staticmembervariableHandler(n); wrapping_member_flag = false; static_flag = false; return SWIG_OK; } /* --------------------------------------------------------------------------- * D::memberconstantHandler() * --------------------------------------------------------------------------- */ virtual int memberconstantHandler(Node *n) { variable_name = Getattr(n, "sym:name"); wrapping_member_flag = true; Language::memberconstantHandler(n); wrapping_member_flag = false; return SWIG_OK; } /* --------------------------------------------------------------------------- * D::constructorHandler() * --------------------------------------------------------------------------- */ virtual int constructorHandler(Node *n) { Language::constructorHandler(n); // Wrappers not wanted for some methods where the parameters cannot be overloadedprocess in D. if (Getattr(n, "overload:ignore")) { return SWIG_OK; } ParmList *l = Getattr(n, "parms"); String *tm; String *proxy_constructor_code = NewString(""); int i; // Holds code for the constructor helper method generated only when the din // typemap has code in the pre or post attributes. String *helper_code = NewString(""); String *helper_args = NewString(""); String *pre_code = NewString(""); String *post_code = NewString(""); String *terminator_code = NewString(""); NewString(""); String *overloaded_name = getOverloadedName(n); String *mangled_overname = Swig_name_construct(getNSpace(), overloaded_name); String *imcall = NewString(""); const String *methodmods = Getattr(n, "feature:d:methodmodifiers"); methodmods = methodmods ? methodmods : (is_public(n) ? public_string : protected_string); // Typemaps were attached earlier to the node, get the return type of the // call to the C++ constructor wrapper. const String *wrapper_return_type = lookupDTypemap(n, "imtype", true); String *imtypeout = Getattr(n, "tmap:imtype:out"); if (imtypeout) { // The type in the imtype typemap's out attribute overrides the type in // the typemap itself. wrapper_return_type = imtypeout; } Printf(proxy_constructor_code, "\n%s this(", methodmods); Printf(helper_code, "static private %s SwigConstruct%s(", wrapper_return_type, proxy_class_name); Printv(imcall, im_dmodule_fq_name, ".", mangled_overname, "(", NIL); /* Attach the non-standard typemaps to the parameter list */ Swig_typemap_attach_parms("in", l, NULL); Swig_typemap_attach_parms("dtype", l, NULL); Swig_typemap_attach_parms("din", l, NULL); emit_mark_varargs(l); int gencomma = 0; /* Output each parameter */ Parm *p = l; for (i = 0; p; i++) { if (checkAttribute(p, "varargs:ignore", "1")) { // Skip ignored varargs. p = nextSibling(p); continue; } if (checkAttribute(p, "tmap:in:numinputs", "0")) { // Skip ignored parameters. p = Getattr(p, "tmap:in:next"); continue; } SwigType *pt = Getattr(p, "type"); String *param_type = NewString(""); // Get the D parameter type. if ((tm = lookupDTypemap(p, "dtype", true))) { const String *inattributes = Getattr(p, "tmap:dtype:inattributes"); Printf(param_type, "%s%s", inattributes ? inattributes : empty_string, tm); } else { Swig_warning(WARN_D_TYPEMAP_DTYPE_UNDEF, input_file, line_number, "No dtype typemap defined for %s\n", SwigType_str(pt, 0)); } if (gencomma) Printf(imcall, ", "); String *arg = makeParameterName(n, p, i, false); String *parmtype = 0; // Get the D code to convert the parameter value to the type used in the // intermediary D module. if ((tm = lookupDTypemap(p, "din"))) { Replaceall(tm, "$dinput", arg); String *pre = Getattr(p, "tmap:din:pre"); if (pre) { replaceClassname(pre, pt); Replaceall(pre, "$dinput", arg); if (Len(pre_code) > 0) Printf(pre_code, "\n"); Printv(pre_code, pre, NIL); } String *post = Getattr(p, "tmap:din:post"); if (post) { replaceClassname(post, pt); Replaceall(post, "$dinput", arg); if (Len(post_code) > 0) Printf(post_code, "\n"); Printv(post_code, post, NIL); } String *terminator = Getattr(p, "tmap:din:terminator"); if (terminator) { replaceClassname(terminator, pt); Replaceall(terminator, "$dinput", arg); if (Len(terminator_code) > 0) Insert(terminator_code, 0, "\n"); Insert(terminator_code, 0, terminator); } parmtype = Getattr(p, "tmap:din:parmtype"); if (parmtype) Replaceall(parmtype, "$dinput", arg); Printv(imcall, tm, NIL); } else { Swig_warning(WARN_D_TYPEMAP_DIN_UNDEF, input_file, line_number, "No din typemap defined for %s\n", SwigType_str(pt, 0)); } /* Add parameter to proxy function */ if (gencomma) { Printf(proxy_constructor_code, ", "); Printf(helper_code, ", "); Printf(helper_args, ", "); } Printf(proxy_constructor_code, "%s %s", param_type, arg); Printf(helper_code, "%s %s", param_type, arg); Printf(helper_args, "%s", parmtype ? parmtype : arg); ++gencomma; Delete(parmtype); Delete(arg); Delete(param_type); p = Getattr(p, "tmap:in:next"); } Printf(imcall, ")"); Printf(proxy_constructor_code, ")"); Printf(helper_code, ")"); // Insert the dconstructor typemap (replacing $directorconnect as needed). Hash *attributes = NewHash(); String *typemap_lookup_type = Getattr(getCurrentClass(), "classtypeobj"); String *construct_tm = Copy(lookupCodeTypemap(n, "dconstructor", typemap_lookup_type, WARN_D_TYPEMAP_DCONSTRUCTOR_UNDEF, attributes)); if (construct_tm) { const bool use_director = (parentNode(n) && Swig_directorclass(n)); if (!use_director) { Replaceall(construct_tm, "$directorconnect", ""); } else { String *connect_attr = Getattr(attributes, "tmap:dconstructor:directorconnect"); if (connect_attr) { Replaceall(construct_tm, "$directorconnect", connect_attr); } else { Swig_warning(WARN_D_NO_DIRECTORCONNECT_ATTR, input_file, line_number, "\"directorconnect\" attribute missing in %s \"dconstructor\" typemap.\n", Getattr(n, "name")); Replaceall(construct_tm, "$directorconnect", ""); } } Printv(proxy_constructor_code, " ", construct_tm, NIL); } replaceExcode(n, proxy_constructor_code, "dconstructor", attributes); bool is_pre_code = Len(pre_code) > 0; bool is_post_code = Len(post_code) > 0; bool is_terminator_code = Len(terminator_code) > 0; if (is_pre_code || is_post_code || is_terminator_code) { Printf(helper_code, " {\n"); if (is_pre_code) { Printv(helper_code, pre_code, "\n", NIL); } if (is_post_code) { Printf(helper_code, " try {\n"); Printv(helper_code, " return ", imcall, ";\n", NIL); Printv(helper_code, " } finally {\n", post_code, "\n }", NIL); } else { Printv(helper_code, " return ", imcall, ";", NIL); } if (is_terminator_code) { Printv(helper_code, "\n", terminator_code, NIL); } Printf(helper_code, "\n}\n"); String *helper_name = NewStringf("%s.SwigConstruct%s(%s)", proxy_class_name, proxy_class_name, helper_args); Replaceall(proxy_constructor_code, "$imcall", helper_name); Delete(helper_name); } else { Replaceall(proxy_constructor_code, "$imcall", imcall); } Printv(proxy_class_body_code, proxy_constructor_code, "\n", NIL); Delete(helper_args); Delete(pre_code); Delete(post_code); Delete(terminator_code); Delete(construct_tm); Delete(attributes); Delete(overloaded_name); Delete(imcall); return SWIG_OK; } /* --------------------------------------------------------------------------- * D::destructorHandler() * --------------------------------------------------------------------------- */ virtual int destructorHandler(Node *n) { Language::destructorHandler(n); String *symname = Getattr(n, "sym:name"); Printv(destructor_call, im_dmodule_fq_name, ".", Swig_name_destroy(getNSpace(),symname), "(cast(void*)swigCPtr)", NIL); const String *methodmods = Getattr(n, "feature:d:methodmodifiers"); if (methodmods) Setattr(getCurrentClass(), "destructmethodmodifiers", methodmods); return SWIG_OK; } /* --------------------------------------------------------------------------- * D::classHandler() * --------------------------------------------------------------------------- */ virtual int classHandler(Node *n) { String *nspace = getNSpace(); File *class_file = NULL; proxy_class_name = Copy(Getattr(n, "sym:name")); if (nspace) { proxy_class_qname = NewStringf("%s.%s", nspace, proxy_class_name); } else { proxy_class_qname = Copy(proxy_class_name); } if (!addSymbol(proxy_class_name, n, nspace)) { return SWIG_ERROR; } assertClassNameValidity(proxy_class_name); if (split_proxy_dmodule) { String *output_directory = outputDirectory(nspace); String *filename = NewStringf("%s%s.d", output_directory, proxy_class_name); class_file = NewFile(filename, "w", SWIG_output_files()); Delete(output_directory); if (!class_file) { FileErrorDisplay(filename); SWIG_exit(EXIT_FAILURE); } Append(filenames_list, Copy(filename)); Delete(filename); emitBanner(class_file); if (nspace) { Printf(class_file, "module %s%s.%s;\n", package, nspace, proxy_class_name); } else { Printf(class_file, "module %s%s;\n", package, proxy_class_name); } Printf(class_file, "\nstatic import %s;\n", im_dmodule_fq_name); } Clear(proxy_class_imports); Clear(proxy_class_enums_code); Clear(proxy_class_body_code); Clear(proxy_class_epilogue_code); Clear(proxy_class_code); Clear(destructor_call); // Traverse the tree for this class, using the *Handler()s to generate code // to the proxy_class_* variables. Language::classHandler(n); writeProxyClassAndUpcasts(n); writeDirectorConnectWrapper(n); Replaceall(proxy_class_code, "$dclassname", proxy_class_name); String *dclazzname = Swig_name_member(getNSpace(), proxy_class_name, ""); Replaceall(proxy_class_code, "$dclazzname", dclazzname); Delete(dclazzname); if (split_proxy_dmodule) { Printv(class_file, global_proxy_imports, NIL); Printv(class_file, proxy_class_imports, NIL); replaceModuleVariables(proxy_class_code); Printv(class_file, proxy_class_code, NIL); Delete(class_file); } else { Printv(proxyImportsBuffer(getNSpace()), proxy_class_imports, NIL); Printv(proxyCodeBuffer(getNSpace()), proxy_class_code, NIL); } Delete(proxy_class_qname); proxy_class_qname = NULL; Delete(proxy_class_name); proxy_class_name = NULL; return SWIG_OK; } /* --------------------------------------------------------------------------- * D::constantWrapper() * * Used for wrapping constants declared by #define or %constant and also for * (primitive) static member constants initialised inline. * * If the %dmanifestconst feature is used, the C/C++ constant value is used to * initialize a D »const«. If not, a »getter« method is generated which * retrieves the value via a call to the C wrapper. However, if there is a * %dconstvalue specified, it overrides all other settings. * --------------------------------------------------------------------------- */ virtual int constantWrapper(Node *n) { String *symname = Getattr(n, "sym:name"); if (!addSymbol(symname, n)) return SWIG_ERROR; // The %dmanifestconst feature determines if a D manifest constant // (const/enum) or a getter function is created. if (GetFlag(n, "feature:d:manifestconst") != 1) { // Default constant handling will work with any type of C constant. It // generates a getter function (which is the same as a read only property // in D) which retrieves the value via by calling the C wrapper. // Note that this is only called for global constants, static member // constants are already handled in staticmemberfunctionHandler(). Swig_save("constantWrapper", n, "value", NIL); Swig_save("constantWrapper", n, "tmap:ctype:out", "tmap:imtype:out", "tmap:dtype:out", "tmap:out:null", "tmap:imtype:outattributes", "tmap:dtype:outattributes", NIL); // Add the stripped quotes back in. String *old_value = Getattr(n, "value"); SwigType *t = Getattr(n, "type"); if (SwigType_type(t) == T_STRING) { Setattr(n, "value", NewStringf("\"%s\"", old_value)); Delete(old_value); } else if (SwigType_type(t) == T_CHAR) { Setattr(n, "value", NewStringf("\'%s\'", old_value)); Delete(old_value); } SetFlag(n, "feature:immutable"); int result = globalvariableHandler(n); Swig_restore(n); return result; } String *constants_code = NewString(""); SwigType *t = Getattr(n, "type"); SwigType *valuetype = Getattr(n, "valuetype"); ParmList *l = Getattr(n, "parms"); // Attach the non-standard typemaps to the parameter list. Swig_typemap_attach_parms("dtype", l, NULL); // Get D return type. String *return_type = NewString(""); String *tm; if ((tm = lookupDTypemap(n, "dtype"))) { String *dtypeout = Getattr(n, "tmap:dtype:out"); if (dtypeout) { // The type in the out attribute of the typemap overrides the type // in the dtype typemap. tm = dtypeout; replaceClassname(tm, t); } Printf(return_type, "%s", tm); } else { Swig_warning(WARN_D_TYPEMAP_DTYPE_UNDEF, input_file, line_number, "No dtype typemap defined for %s\n", SwigType_str(t, 0)); } const String *itemname = wrapping_member_flag ? variable_name : symname; String *attributes = Getattr(n, "feature:d:methodmodifiers"); if (attributes) { attributes = Copy(attributes); } else { attributes = Copy(is_public(n) ? public_string : protected_string); } if (d_version == 1) { if (static_flag) { Printv(attributes, " static", NIL); } Printf(constants_code, "\n%s const %s %s = ", attributes, return_type, itemname); } else { Printf(constants_code, "\n%s enum %s %s = ", attributes, return_type, itemname); } Delete(attributes); // Retrieve the override value set via %dconstvalue, if any. String *override_value = Getattr(n, "feature:d:constvalue"); if (override_value) { Printf(constants_code, "%s;\n", override_value); } else { // Just take the value from the C definition and hope it compiles in D. if (Getattr(n, "wrappedasconstant")) { if (SwigType_type(valuetype) == T_CHAR) Printf(constants_code, "\'%(escape)s\';\n", Getattr(n, "staticmembervariableHandler:value")); else Printf(constants_code, "%s;\n", Getattr(n, "staticmembervariableHandler:value")); } else { // Add the stripped quotes back in. String* value = Getattr(n, "value"); if (SwigType_type(t) == T_STRING) { Printf(constants_code, "\"%s\";\n", value); } else if (SwigType_type(t) == T_CHAR) { Printf(constants_code, "\'%s\';\n", value); } else { Printf(constants_code, "%s;\n", value); } } } // Emit the generated code to appropriate place. if (wrapping_member_flag) { Printv(proxy_class_body_code, constants_code, NIL); } else { Printv(proxyCodeBuffer(getNSpace()), constants_code, NIL); } // Cleanup. Delete(return_type); Delete(constants_code); return SWIG_OK; } /* --------------------------------------------------------------------------- * D::functionWrapper() * * Generates the C wrapper code for a function and the corresponding * declaration in the wrap D module. * --------------------------------------------------------------------------- */ virtual int functionWrapper(Node *n) { String *symname = Getattr(n, "sym:name"); SwigType *t = Getattr(n, "type"); ParmList *l = Getattr(n, "parms"); String *tm; Parm *p; int i; String *c_return_type = NewString(""); String *im_return_type = NewString(""); String *cleanup = NewString(""); String *outarg = NewString(""); String *body = NewString(""); int num_arguments = 0; bool is_void_return; String *overloaded_name = getOverloadedName(n); if (!Getattr(n, "sym:overloaded")) { if (!addSymbol(Getattr(n, "sym:name"), n)) return SWIG_ERROR; } // A new wrapper function object Wrapper *f = NewWrapper(); // Make a wrapper name for this function String *wname = Swig_name_wrapper(overloaded_name); /* Attach the non-standard typemaps to the parameter list. */ Swig_typemap_attach_parms("ctype", l, f); Swig_typemap_attach_parms("imtype", l, f); /* Get return types */ if ((tm = lookupDTypemap(n, "ctype"))) { String *ctypeout = Getattr(n, "tmap:ctype:out"); if (ctypeout) { // The type in the ctype typemap's out attribute overrides the type in // the typemap itself. tm = ctypeout; } Printf(c_return_type, "%s", tm); } else { Swig_warning(WARN_D_TYPEMAP_CTYPE_UNDEF, input_file, line_number, "No ctype typemap defined for %s\n", SwigType_str(t, 0)); } if ((tm = lookupDTypemap(n, "imtype"))) { String *imtypeout = Getattr(n, "tmap:imtype:out"); if (imtypeout) { // The type in the imtype typemap's out attribute overrides the type in // the typemap itself. tm = imtypeout; } Printf(im_return_type, "%s", tm); } else { Swig_warning(WARN_D_TYPEMAP_IMTYPE_UNDEF, input_file, line_number, "No imtype typemap defined for %s\n", SwigType_str(t, 0)); } is_void_return = (Cmp(c_return_type, "void") == 0); if (!is_void_return) Wrapper_add_localv(f, "jresult", c_return_type, "jresult", NIL); Printv(f->def, " SWIGEXPORT ", c_return_type, " ", wname, "(", NIL); // Emit all of the local variables for holding arguments. emit_parameter_variables(l, f); /* Attach the standard typemaps */ emit_attach_parmmaps(l, f); // Parameter overloading Setattr(n, "wrap:parms", l); Setattr(n, "wrap:name", wname); // Wrappers not wanted for some methods where the parameters cannot be overloaded in D if (Getattr(n, "sym:overloaded")) { // Emit warnings for the few cases that can't be overloaded in D and give up on generating wrapper Swig_overload_check(n); if (Getattr(n, "overload:ignore")) { DelWrapper(f); return SWIG_OK; } } // Collect the parameter list for the intermediary D module declaration of // the generated wrapper function. String *im_dmodule_parameters = NewString("("); /* Get number of required and total arguments */ num_arguments = emit_num_arguments(l); int gencomma = 0; // Now walk the function parameter list and generate code to get arguments for (i = 0, p = l; i < num_arguments; i++) { while (checkAttribute(p, "tmap:in:numinputs", "0")) { p = Getattr(p, "tmap:in:next"); } SwigType *pt = Getattr(p, "type"); String *ln = Getattr(p, "lname"); String *im_param_type = NewString(""); String *c_param_type = NewString(""); String *arg = NewString(""); Printf(arg, "j%s", ln); /* Get the ctype types of the parameter */ if ((tm = lookupDTypemap(p, "ctype", true))) { Printv(c_param_type, tm, NIL); } else { Swig_warning(WARN_D_TYPEMAP_CTYPE_UNDEF, input_file, line_number, "No ctype typemap defined for %s\n", SwigType_str(pt, 0)); } /* Get the intermediary class parameter types of the parameter */ if ((tm = lookupDTypemap(p, "imtype", true))) { const String *inattributes = Getattr(p, "tmap:imtype:inattributes"); Printf(im_param_type, "%s%s", inattributes ? inattributes : empty_string, tm); } else { Swig_warning(WARN_D_TYPEMAP_IMTYPE_UNDEF, input_file, line_number, "No imtype typemap defined for %s\n", SwigType_str(pt, 0)); } /* Add parameter to intermediary class method */ if (gencomma) Printf(im_dmodule_parameters, ", "); Printf(im_dmodule_parameters, "%s %s", im_param_type, arg); // Add parameter to C function Printv(f->def, gencomma ? ", " : "", c_param_type, " ", arg, NIL); gencomma = 1; // Get typemap for this argument if ((tm = Getattr(p, "tmap:in"))) { canThrow(n, "in", p); Replaceall(tm, "$input", arg); Setattr(p, "emit:input", arg); Printf(f->code, "%s\n", tm); p = Getattr(p, "tmap:in:next"); } else { Swig_warning(WARN_TYPEMAP_IN_UNDEF, input_file, line_number, "Unable to use type %s as a function argument.\n", SwigType_str(pt, 0)); p = nextSibling(p); } Delete(im_param_type); Delete(c_param_type); Delete(arg); } /* Insert constraint checking code */ for (p = l; p;) { if ((tm = Getattr(p, "tmap:check"))) { canThrow(n, "check", p); Replaceall(tm, "$input", Getattr(p, "emit:input")); Printv(f->code, tm, "\n", NIL); p = Getattr(p, "tmap:check:next"); } else { p = nextSibling(p); } } /* Insert cleanup code */ for (p = l; p;) { if ((tm = Getattr(p, "tmap:freearg"))) { canThrow(n, "freearg", p); Replaceall(tm, "$input", Getattr(p, "emit:input")); Printv(cleanup, tm, "\n", NIL); p = Getattr(p, "tmap:freearg:next"); } else { p = nextSibling(p); } } /* Insert argument output code */ for (p = l; p;) { if ((tm = Getattr(p, "tmap:argout"))) { canThrow(n, "argout", p); Replaceall(tm, "$result", "jresult"); Replaceall(tm, "$input", Getattr(p, "emit:input")); Printv(outarg, tm, "\n", NIL); p = Getattr(p, "tmap:argout:next"); } else { p = nextSibling(p); } } // Look for usage of throws typemap and the canthrow flag ParmList *throw_parm_list = NULL; if ((throw_parm_list = Getattr(n, "catchlist"))) { Swig_typemap_attach_parms("throws", throw_parm_list, f); for (p = throw_parm_list; p; p = nextSibling(p)) { if (Getattr(p, "tmap:throws")) { canThrow(n, "throws", p); } } } String *null_attribute = 0; // Now write code to make the function call if (!native_function_flag) { Swig_director_emit_dynamic_cast(n, f); String *actioncode = emit_action(n); /* Return value if necessary */ if ((tm = Swig_typemap_lookup_out("out", n, Swig_cresult_name(), f, actioncode))) { canThrow(n, "out", n); Replaceall(tm, "$result", "jresult"); if (GetFlag(n, "feature:new")) Replaceall(tm, "$owner", "1"); else Replaceall(tm, "$owner", "0"); Printf(f->code, "%s", tm); null_attribute = Getattr(n, "tmap:out:null"); if (Len(tm)) Printf(f->code, "\n"); } else { Swig_warning(WARN_TYPEMAP_OUT_UNDEF, input_file, line_number, "Unable to use return type %s in function %s.\n", SwigType_str(t, 0), Getattr(n, "name")); } emit_return_variable(n, t, f); } /* Output argument output code */ Printv(f->code, outarg, NIL); /* Output cleanup code */ Printv(f->code, cleanup, NIL); /* Look to see if there is any newfree cleanup code */ if (GetFlag(n, "feature:new")) { if ((tm = Swig_typemap_lookup("newfree", n, Swig_cresult_name(), 0))) { canThrow(n, "newfree", n); Printf(f->code, "%s\n", tm); } } /* See if there is any return cleanup code */ if (!native_function_flag) { if ((tm = Swig_typemap_lookup("ret", n, Swig_cresult_name(), 0))) { canThrow(n, "ret", n); Printf(f->code, "%s\n", tm); } } // Complete D im parameter list and emit the declaration/binding code. Printv(im_dmodule_parameters, ")", NIL); writeImDModuleFunction(overloaded_name, im_return_type, im_dmodule_parameters, wname); Delete(im_dmodule_parameters); // Finish C function header. Printf(f->def, ") {"); if (!is_void_return) Printv(f->code, " return jresult;\n", NIL); Printf(f->code, "}\n"); /* Substitute the cleanup code */ Replaceall(f->code, "$cleanup", cleanup); /* Substitute the function name */ Replaceall(f->code, "$symname", symname); /* Contract macro modification */ if (Replaceall(f->code, "SWIG_contract_assert(", "SWIG_contract_assert($null, ") > 0) { Setattr(n, "d:canthrow", "1"); } if (!null_attribute) Replaceall(f->code, "$null", "0"); else Replaceall(f->code, "$null", null_attribute); /* Dump the function out */ if (!native_function_flag) { Wrapper_print(f, f_wrappers); // Handle %exception which sets the canthrow attribute. if (Getattr(n, "feature:except:canthrow")) { Setattr(n, "d:canthrow", "1"); } // A very simple check (it is not foolproof) to assist typemap writers // with setting the correct features when the want to throw D exceptions // from C++ code. It checks for the common methods which set // a pending D exception and issues a warning if one of them has been found // in the typemap, but the »canthrow« attribute/feature is not set. if (!Getattr(n, "d:canthrow")) { if (Strstr(f->code, "SWIG_exception")) { Swig_warning(WARN_D_CANTHROW_MISSING, input_file, line_number, "C code contains a call to SWIG_exception and D code does not handle pending exceptions via the canthrow attribute.\n"); } else if (Strstr(f->code, "SWIG_DSetPendingException")) { Swig_warning(WARN_D_CANTHROW_MISSING, input_file, line_number, "C code contains a call to a SWIG_DSetPendingException method and D code does not handle pending exceptions via the canthrow attribute.\n"); } } } // If we are not processing an enum or constant, and we were not generating // a wrapper function which will be accessed via a proxy class, write a // function to the proxy D module. if (!is_wrapping_class()) { writeProxyDModuleFunction(n); } // If we are processing a public member variable, write the property-style // member function to the proxy class. if (wrapping_member_flag) { Setattr(n, "proxyfuncname", variable_name); Setattr(n, "imfuncname", symname); writeProxyClassFunction(n); } Delete(c_return_type); Delete(im_return_type); Delete(cleanup); Delete(outarg); Delete(body); Delete(overloaded_name); DelWrapper(f); return SWIG_OK; } /* --------------------------------------------------------------------------- * D::nativeWrapper() * --------------------------------------------------------------------------- */ virtual int nativeWrapper(Node *n) { String *wrapname = Getattr(n, "wrap:name"); if (!addSymbol(wrapname, n)) return SWIG_ERROR; if (Getattr(n, "type")) { Swig_save("nativeWrapper", n, "name", NIL); Setattr(n, "name", wrapname); native_function_flag = true; functionWrapper(n); Swig_restore(n); native_function_flag = false; } else { Swig_error(input_file, line_number, "No return type for %%native method %s.\n", Getattr(n, "wrap:name")); } return SWIG_OK; } /* --------------------------------------------------------------------------- * D::classDirector() * --------------------------------------------------------------------------- */ virtual int classDirector(Node *n) { String *nspace = Getattr(n, "sym:nspace"); proxy_class_name = NewString(Getattr(n, "sym:name")); if (nspace) { proxy_class_qname = NewStringf("%s.%s", nspace, proxy_class_name); } else { proxy_class_qname = Copy(proxy_class_name); } int success = Language::classDirector(n); Delete(proxy_class_qname); proxy_class_qname = NULL; Delete(proxy_class_name); proxy_class_name = NULL; return success; } /* --------------------------------------------------------------------------- * D::classDirectorInit() * --------------------------------------------------------------------------- */ virtual int classDirectorInit(Node *n) { Delete(director_ctor_code); director_ctor_code = NewString("$director_new"); // Write C++ director class declaration, for example: // class SwigDirector_myclass : public myclass, public Swig::Director { String *classname = Swig_class_name(n); String *directorname = directorClassName(n); String *declaration = Swig_class_declaration(n, directorname); const String *base = Getattr(n, "classtype"); Printf(f_directors_h, "%s : public %s, public Swig::Director {\n", declaration, base); Printf(f_directors_h, "\npublic:\n"); Delete(declaration); Delete(directorname); Delete(classname); // Stash for later. Setattr(n, "director:ctor", NewString("Swig::Director()")); // Keep track of the director methods for this class. first_class_dmethod = curr_class_dmethod = n_dmethods; director_callback_typedefs = NewString(""); director_callback_pointers = NewString(""); director_dcallbacks_code = NewString(""); return Language::classDirectorInit(n); } /* --------------------------------------------------------------------------- * D::classDirectorMethod() * * Emit a virtual director method to pass a method call on to the * underlying D object. * --------------------------------------------------------------------------- */ virtual int classDirectorMethod(Node *n, Node *parent, String *super) { String *classname = Getattr(parent, "sym:name"); String *c_classname = Getattr(parent, "name"); String *name = Getattr(n, "name"); String *symname = Getattr(n, "sym:name"); SwigType *returntype = Getattr(n, "type"); String *overloaded_name = getOverloadedName(n); String *storage = Getattr(n, "storage"); String *value = Getattr(n, "value"); String *decl = Getattr(n, "decl"); String *declaration = NewString(""); String *tm; Parm *p; int i; Wrapper *w = NewWrapper(); ParmList *l = Getattr(n, "parms"); bool is_void = !(Cmp(returntype, "void")); String *qualified_return = 0; bool pure_virtual = (!(Cmp(storage, "virtual")) && !(Cmp(value, "0"))); int status = SWIG_OK; bool output_director = true; String *dirclassname = directorClassName(parent); String *qualified_name = NewStringf("%s::%s", dirclassname, name); SwigType *c_ret_type = NULL; String *dcallback_call_args = NewString(""); String *imclass_dmethod; String *callback_typedef_parms = NewString(""); String *delegate_parms = NewString(""); String *proxy_method_param_list = NewString(""); String *proxy_callback_return_type = NewString(""); String *callback_def = NewString(""); String *callback_code = NewString(""); String *imcall_args = NewString(""); bool ignored_method = GetFlag(n, "feature:ignore") ? true : false; // Kludge Alert: functionWrapper sets sym:overload properly, but it // isn't at this point, so we have to manufacture it ourselves. At least // we're consistent with the sym:overload name in functionWrapper. (?? when // does the overloaded method name get set?) imclass_dmethod = NewStringf("SwigDirector_%s", Swig_name_member(getNSpace(), classname, overloaded_name)); qualified_return = SwigType_rcaststr(returntype, "c_result"); if (!is_void && (!ignored_method || pure_virtual)) { if (!SwigType_isclass(returntype)) { if (!(SwigType_ispointer(returntype) || SwigType_isreference(returntype))) { String *construct_result = NewStringf("= SwigValueInit< %s >()", SwigType_lstr(returntype, 0)); Wrapper_add_localv(w, "c_result", SwigType_lstr(returntype, "c_result"), construct_result, NIL); Delete(construct_result); } else { String *base_typename = SwigType_base(returntype); String *resolved_typename = SwigType_typedef_resolve_all(base_typename); Symtab *symtab = Getattr(n, "sym:symtab"); Node *typenode = Swig_symbol_clookup(resolved_typename, symtab); if (SwigType_ispointer(returntype) || (typenode && Getattr(typenode, "abstracts"))) { /* initialize pointers to something sane. Same for abstract classes when a reference is returned. */ Wrapper_add_localv(w, "c_result", SwigType_lstr(returntype, "c_result"), "= 0", NIL); } else { /* If returning a reference, initialize the pointer to a sane default - if a D exception occurs, then the pointer returns something other than a NULL-initialized reference. */ SwigType *noref_type = SwigType_del_reference(Copy(returntype)); String *noref_ltype = SwigType_lstr(noref_type, 0); String *return_ltype = SwigType_lstr(returntype, 0); Wrapper_add_localv(w, "result_default", "static", noref_ltype, "result_default", NIL); Wrapper_add_localv(w, "c_result", return_ltype, "c_result", NIL); Printf(w->code, "result_default = SwigValueInit< %s >();\n", noref_ltype); Printf(w->code, "c_result = &result_default;\n"); Delete(return_ltype); Delete(noref_ltype); Delete(noref_type); } Delete(base_typename); Delete(resolved_typename); } } else { SwigType *vt; vt = cplus_value_type(returntype); if (!vt) { Wrapper_add_localv(w, "c_result", SwigType_lstr(returntype, "c_result"), NIL); } else { Wrapper_add_localv(w, "c_result", SwigType_lstr(vt, "c_result"), NIL); Delete(vt); } } } /* Create the intermediate class wrapper */ tm = lookupDTypemap(n, "imtype"); if (tm) { String *imtypeout = Getattr(n, "tmap:imtype:out"); if (imtypeout) { // The type in the imtype typemap's out attribute overrides the type // in the typemap. tm = imtypeout; } Printf(callback_def, "\nprivate extern(C) %s swigDirectorCallback_%s_%s(void* dObject", tm, classname, overloaded_name); Printv(proxy_callback_return_type, tm, NIL); } else { Swig_warning(WARN_D_TYPEMAP_IMTYPE_UNDEF, input_file, line_number, "No imtype typemap defined for %s\n", SwigType_str(returntype, 0)); } if ((c_ret_type = Swig_typemap_lookup("ctype", n, "", 0))) { if (!is_void && !ignored_method) { String *jretval_decl = NewStringf("%s jresult", c_ret_type); Wrapper_add_localv(w, "jresult", jretval_decl, "= 0", NIL); Delete(jretval_decl); } } else { Swig_warning(WARN_D_TYPEMAP_CTYPE_UNDEF, input_file, line_number, "No ctype typemap defined for %s for use in %s::%s (skipping director method)\n", SwigType_str(returntype, 0), SwigType_namestr(c_classname), SwigType_namestr(name)); output_director = false; } Swig_director_parms_fixup(l); // Attach the standard typemaps. Swig_typemap_attach_parms("out", l, 0); Swig_typemap_attach_parms("ctype", l, 0); Swig_typemap_attach_parms("imtype", l, 0); Swig_typemap_attach_parms("dtype", l, 0); Swig_typemap_attach_parms("directorin", l, w); Swig_typemap_attach_parms("ddirectorin", l, 0); Swig_typemap_attach_parms("directorargout", l, w); // Preamble code. if (!ignored_method) Printf(w->code, "if (!swig_callback_%s) {\n", overloaded_name); if (!pure_virtual) { String *super_call = Swig_method_call(super, l); if (is_void) { Printf(w->code, "%s;\n", super_call); if (!ignored_method) Printf(w->code, "return;\n"); } else { Printf(w->code, "return %s;\n", super_call); } Delete(super_call); } else { Printf(w->code, "Swig::DirectorPureVirtualException::raise(\"%s::%s\");\n", SwigType_namestr(c_classname), SwigType_namestr(name)); if (!is_void) Printf(w->code, "return %s;", qualified_return); else if (!ignored_method) Printf(w->code, "return;\n"); } if (!ignored_method) Printf(w->code, "} else {\n"); // Go through argument list. for (i = 0, p = l; p; ++i) { /* Is this superfluous? */ while (checkAttribute(p, "tmap:directorin:numinputs", "0")) { p = Getattr(p, "tmap:directorin:next"); } SwigType *pt = Getattr(p, "type"); String *ln = makeParameterName(n, p, i, false); String *c_param_type = NULL; String *c_decl = NewString(""); String *arg = NewString(""); Printf(arg, "j%s", ln); // Add each parameter to the D callback invocation arguments. Printf(dcallback_call_args, ", %s", arg); /* Get parameter's intermediary C type */ if ((c_param_type = lookupDTypemap(p, "ctype", true))) { String *ctypeout = Getattr(p, "tmap:ctype:out"); if (ctypeout) { // The type in the ctype typemap's out attribute overrides the type // in the typemap itself. c_param_type = ctypeout; } /* Add to local variables */ Printf(c_decl, "%s %s", c_param_type, arg); if (!ignored_method) Wrapper_add_localv(w, arg, c_decl, (!(SwigType_ispointer(pt) || SwigType_isreference(pt)) ? "" : "= 0"), NIL); /* Add input marshalling code */ if ((tm = Getattr(p, "tmap:directorin"))) { Setattr(p, "emit:directorinput", arg); Replaceall(tm, "$input", arg); Replaceall(tm, "$owner", "0"); if (Len(tm)) if (!ignored_method) Printf(w->code, "%s\n", tm); // Add parameter type to the C typedef for the D callback function. Printf(callback_typedef_parms, ", %s", c_param_type); /* Add parameter to the intermediate class code if generating the * intermediate's upcall code */ if ((tm = lookupDTypemap(p, "imtype", true))) { String *imtypeout = Getattr(p, "tmap:imtype:out"); if (imtypeout) { // The type in the imtype typemap's out attribute overrides the // type in the typemap itself. tm = imtypeout; } const String *im_directorinattributes = Getattr(p, "tmap:imtype:directorinattributes"); // TODO: Is this copy really needed? String *din = Copy(lookupDTypemap(p, "ddirectorin", true)); if (din) { Replaceall(din, "$winput", ln); Printf(delegate_parms, ", "); if (i > 0) { Printf(proxy_method_param_list, ", "); Printf(imcall_args, ", "); } Printf(delegate_parms, "%s%s %s", im_directorinattributes ? im_directorinattributes : empty_string, tm, ln); if (Cmp(din, ln)) { Printv(imcall_args, din, NIL); } else { Printv(imcall_args, ln, NIL); } Delete(din); // Get the parameter type in the proxy D class (used later when // generating the overload checking code for the directorConnect // function). if ((tm = lookupDTypemap(p, "dtype", true))) { Printf(proxy_method_param_list, "%s", tm); } else { Swig_warning(WARN_D_TYPEMAP_DTYPE_UNDEF, input_file, line_number, "No dtype typemap defined for %s\n", SwigType_str(pt, 0)); } } else { Swig_warning(WARN_D_TYPEMAP_DDIRECTORIN_UNDEF, input_file, line_number, "No ddirectorin typemap defined for %s for use in %s::%s (skipping director method)\n", SwigType_str(pt, 0), SwigType_namestr(c_classname), SwigType_namestr(name)); output_director = false; } } else { Swig_warning(WARN_D_TYPEMAP_IMTYPE_UNDEF, input_file, line_number, "No imtype typemap defined for %s for use in %s::%s (skipping director method)\n", SwigType_str(pt, 0), SwigType_namestr(c_classname), SwigType_namestr(name)); output_director = false; } p = Getattr(p, "tmap:directorin:next"); } else { Swig_warning(WARN_D_TYPEMAP_DDIRECTORIN_UNDEF, input_file, line_number, "No or improper directorin typemap defined for argument %s for use in %s::%s (skipping director method)\n", SwigType_str(pt, 0), SwigType_namestr(c_classname), SwigType_namestr(name)); p = nextSibling(p); output_director = false; } } else { Swig_warning(WARN_D_TYPEMAP_CTYPE_UNDEF, input_file, line_number, "No ctype typemap defined for %s for use in %s::%s (skipping director method)\n", SwigType_str(pt, 0), SwigType_namestr(c_classname), SwigType_namestr(name)); output_director = false; p = nextSibling(p); } Delete(arg); Delete(c_decl); Delete(c_param_type); Delete(ln); } /* header declaration, start wrapper definition */ String *target; SwigType *rtype = Getattr(n, "conversion_operator") ? 0 : Getattr(n, "classDirectorMethods:type"); target = Swig_method_decl(rtype, decl, qualified_name, l, 0); Printf(w->def, "%s", target); Delete(qualified_name); Delete(target); target = Swig_method_decl(rtype, decl, name, l, 1); Printf(declaration, " virtual %s", target); Delete(target); // Add any exception specifications to the methods in the director class if (Getattr(n, "noexcept")) { Append(w->def, " noexcept"); Append(declaration, " noexcept"); } ParmList *throw_parm_list = NULL; if ((throw_parm_list = Getattr(n, "throws")) || Getattr(n, "throw")) { int gencomma = 0; Append(w->def, " throw("); Append(declaration, " throw("); if (throw_parm_list) Swig_typemap_attach_parms("throws", throw_parm_list, 0); for (p = throw_parm_list; p; p = nextSibling(p)) { if (Getattr(p, "tmap:throws")) { if (gencomma++) { Append(w->def, ", "); Append(declaration, ", "); } Printf(w->def, "%s", SwigType_str(Getattr(p, "type"), 0)); Printf(declaration, "%s", SwigType_str(Getattr(p, "type"), 0)); } } Append(w->def, ")"); Append(declaration, ")"); } Append(w->def, " {"); Append(declaration, ";\n"); // Finish the callback function declaraction. Printf(callback_def, "%s)", delegate_parms); Printf(callback_def, " {\n"); /* Emit the intermediate class's upcall to the actual class */ String *upcall = NewStringf("(cast(%s)dObject).%s(%s)", classname, symname, imcall_args); if (!is_void) { if ((tm = lookupDTypemap(n, "ddirectorout"))) { Replaceall(tm, "$dcall", upcall); Printf(callback_code, " return %s;\n", tm); } } else { Printf(callback_code, " %s;\n", upcall); } Printf(callback_code, "}\n"); Delete(upcall); if (!ignored_method) { if (!is_void) Printf(w->code, "jresult = (%s) ", c_ret_type); Printf(w->code, "swig_callback_%s(d_object%s);\n", overloaded_name, dcallback_call_args); if (!is_void) { String *jresult_str = NewString("jresult"); String *result_str = NewString("c_result"); /* Copy jresult into c_result... */ if ((tm = Swig_typemap_lookup("directorout", n, result_str, w))) { Replaceall(tm, "$input", jresult_str); Replaceall(tm, "$result", result_str); Printf(w->code, "%s\n", tm); } else { Swig_warning(WARN_TYPEMAP_DIRECTOROUT_UNDEF, input_file, line_number, "Unable to use return type %s used in %s::%s (skipping director method)\n", SwigType_str(returntype, 0), SwigType_namestr(c_classname), SwigType_namestr(name)); output_director = false; } Delete(jresult_str); Delete(result_str); } /* Marshal outputs */ for (p = l; p;) { if ((tm = Getattr(p, "tmap:directorargout"))) { canThrow(n, "directorargout", p); Replaceall(tm, "$result", "jresult"); Replaceall(tm, "$input", Getattr(p, "emit:directorinput")); Printv(w->code, tm, "\n", NIL); p = Getattr(p, "tmap:directorargout:next"); } else { p = nextSibling(p); } } /* Terminate wrapper code */ Printf(w->code, "}\n"); if (!is_void) Printf(w->code, "return %s;", qualified_return); } Printf(w->code, "}"); // We expose virtual protected methods via an extra public inline method which makes a straight call to the wrapped class' method String *inline_extra_method = NewString(""); if (dirprot_mode() && !is_public(n) && !pure_virtual) { Printv(inline_extra_method, declaration, NIL); String *extra_method_name = NewStringf("%sSwigPublic", name); Replaceall(inline_extra_method, name, extra_method_name); Replaceall(inline_extra_method, ";\n", " {\n "); if (!is_void) Printf(inline_extra_method, "return "); String *methodcall = Swig_method_call(super, l); Printv(inline_extra_method, methodcall, ";\n }\n", NIL); Delete(methodcall); Delete(extra_method_name); } /* emit the director method */ if (status == SWIG_OK && output_director) { if (!is_void) { Replaceall(w->code, "$null", qualified_return); } else { Replaceall(w->code, "$null", ""); } if (!ignored_method) Printv(director_dcallbacks_code, callback_def, callback_code, NIL); if (!Getattr(n, "defaultargs")) { Replaceall(w->code, "$symname", symname); Wrapper_print(w, f_directors); Printv(f_directors_h, declaration, NIL); Printv(f_directors_h, inline_extra_method, NIL); } } if (!ignored_method) { // Register the upcall method so that the callback registering code can // be written later. // We cannot directly use n here because its »type« attribute does not // the full return type any longer after Language::functionHandler has // returned. String *dp_return_type = lookupDTypemap(n, "dtype"); if (dp_return_type) { String *dtypeout = Getattr(n, "tmap:dtype:out"); if (dtypeout) { // The type in the dtype typemap's out attribute overrides the type // in the typemap itself. dp_return_type = dtypeout; replaceClassname(dp_return_type, returntype); } } else { Swig_warning(WARN_D_TYPEMAP_DTYPE_UNDEF, input_file, line_number, "No dtype typemap defined for %s\n", SwigType_str(returntype, 0)); dp_return_type = NewString(""); } UpcallData *udata = addUpcallMethod(imclass_dmethod, symname, decl, overloaded_name, dp_return_type, proxy_method_param_list); Delete(dp_return_type); // Write the global callback function pointer on the C code. String *methid = Getattr(udata, "class_methodidx"); Printf(director_callback_typedefs, " typedef %s (* SWIG_Callback%s_t)", c_ret_type, methid); Printf(director_callback_typedefs, "(void *dobj%s);\n", callback_typedef_parms); Printf(director_callback_pointers, " SWIG_Callback%s_t swig_callback_%s;\n", methid, overloaded_name); // Write the type alias for the callback to the intermediary D module. String *proxy_callback_type = NewString(""); String *dirClassName = directorClassName(parent); Printf(proxy_callback_type, "%s_Callback%s", dirClassName, methid); Printf(im_dmodule_code, "alias extern(C) %s function(void*%s) %s;\n", proxy_callback_return_type, delegate_parms, proxy_callback_type); Delete(proxy_callback_type); Delete(dirClassName); } Delete(qualified_return); Delete(c_ret_type); Delete(declaration); Delete(callback_typedef_parms); Delete(delegate_parms); Delete(proxy_method_param_list); Delete(callback_def); Delete(callback_code); DelWrapper(w); return status; } /* --------------------------------------------------------------------------- * D::classDirectorConstructor() * --------------------------------------------------------------------------- */ virtual int classDirectorConstructor(Node *n) { Node *parent = parentNode(n); String *decl = Getattr(n, "decl");; String *supername = Swig_class_name(parent); String *dirclassname = directorClassName(parent); String *sub = NewString(""); Parm *p; ParmList *superparms = Getattr(n, "parms"); ParmList *parms; int argidx = 0; /* Assign arguments to superclass's parameters, if not already done */ for (p = superparms; p; p = nextSibling(p)) { String *pname = Getattr(p, "name"); if (!pname) { pname = NewStringf("arg%d", argidx++); Setattr(p, "name", pname); } } // TODO: Is this copy needed? parms = CopyParmList(superparms); if (!Getattr(n, "defaultargs")) { /* constructor */ { String *basetype = Getattr(parent, "classtype"); String *target = Swig_method_decl(0, decl, dirclassname, parms, 0); String *call = Swig_csuperclass_call(0, basetype, superparms); String *classtype = SwigType_namestr(Getattr(n, "name")); Printf(f_directors, "%s::%s : %s, %s {\n", dirclassname, target, call, Getattr(parent, "director:ctor")); Printf(f_directors, " swig_init_callbacks();\n"); Printf(f_directors, "}\n\n"); Delete(classtype); Delete(target); Delete(call); } /* constructor header */ { String *target = Swig_method_decl(0, decl, dirclassname, parms, 1); Printf(f_directors_h, " %s;\n", target); Delete(target); } } Delete(sub); Delete(supername); Delete(parms); Delete(dirclassname); return Language::classDirectorConstructor(n); } /* --------------------------------------------------------------------------- * D::classDirectorDefaultConstructor() * --------------------------------------------------------------------------- */ virtual int classDirectorDefaultConstructor(Node *n) { String *dirclassname = directorClassName(n); String *classtype = SwigType_namestr(Getattr(n, "name")); Wrapper *w = NewWrapper(); Printf(w->def, "%s::%s() : %s {", dirclassname, dirclassname, Getattr(n, "director:ctor")); Printf(w->code, "}\n"); Wrapper_print(w, f_directors); Printf(f_directors_h, " %s();\n", dirclassname); DelWrapper(w); Delete(classtype); Delete(dirclassname); return Language::classDirectorDefaultConstructor(n); } /* --------------------------------------------------------------------------- * D::classDirectorDestructor() * --------------------------------------------------------------------------- */ virtual int classDirectorDestructor(Node *n) { Node *current_class = getCurrentClass(); String *dirclassname = directorClassName(current_class); Wrapper *w = NewWrapper(); if (Getattr(n, "noexcept")) { Printf(f_directors_h, " virtual ~%s() noexcept;\n", dirclassname); Printf(w->def, "%s::~%s() noexcept {\n", dirclassname, dirclassname); } else if (Getattr(n, "throw")) { Printf(f_directors_h, " virtual ~%s() throw();\n", dirclassname); Printf(w->def, "%s::~%s() throw() {\n", dirclassname, dirclassname); } else { Printf(f_directors_h, " virtual ~%s();\n", dirclassname); Printf(w->def, "%s::~%s() {\n", dirclassname, dirclassname); } Printv(w->code, "}\n", NIL); Wrapper_print(w, f_directors); DelWrapper(w); Delete(dirclassname); return SWIG_OK; } /* --------------------------------------------------------------------------- * D::classDirectorEnd() * --------------------------------------------------------------------------- */ virtual int classDirectorEnd(Node *n) { int i; String *director_classname = directorClassName(n); Wrapper *w = NewWrapper(); if (Len(director_callback_typedefs) > 0) { Printf(f_directors_h, "\n%s", director_callback_typedefs); } Printf(f_directors_h, " void swig_connect_director(void* dobj"); Printf(w->def, "void %s::swig_connect_director(void* dobj", director_classname); Printf(w->code, "d_object = dobj;"); for (i = first_class_dmethod; i < curr_class_dmethod; ++i) { UpcallData *udata = Getitem(dmethods_seq, i); String *methid = Getattr(udata, "class_methodidx"); String *overname = Getattr(udata, "overname"); Printf(f_directors_h, ", SWIG_Callback%s_t callback%s", methid, overname); Printf(w->def, ", SWIG_Callback%s_t callback_%s", methid, overname); Printf(w->code, "swig_callback_%s = callback_%s;\n", overname, overname); } Printf(f_directors_h, ");\n"); Printf(w->def, ") {"); Printf(f_directors_h, "\nprivate:\n"); Printf(f_directors_h, " void swig_init_callbacks();\n"); Printf(f_directors_h, " void *d_object;\n"); if (Len(director_callback_pointers) > 0) { Printf(f_directors_h, "%s", director_callback_pointers); } Printf(f_directors_h, "};\n\n"); Printf(w->code, "}\n\n"); Printf(w->code, "void %s::swig_init_callbacks() {\n", director_classname); for (i = first_class_dmethod; i < curr_class_dmethod; ++i) { UpcallData *udata = Getitem(dmethods_seq, i); String *overname = Getattr(udata, "overname"); Printf(w->code, "swig_callback_%s = 0;\n", overname); } Printf(w->code, "}"); Wrapper_print(w, f_directors); DelWrapper(w); return Language::classDirectorEnd(n); } /* --------------------------------------------------------------------------- * D::classDirectorDisown() * --------------------------------------------------------------------------- */ virtual int classDirectorDisown(Node *n) { (void) n; return SWIG_OK; } /* --------------------------------------------------------------------------- * D::replaceSpecialVariables() * --------------------------------------------------------------------------- */ virtual void replaceSpecialVariables(String *method, String *tm, Parm *parm) { (void)method; SwigType *type = Getattr(parm, "type"); // Just assume that this goes to the proxy class, we cannot know. replaceClassname(tm, type); } protected: /* --------------------------------------------------------------------------- * D::extraDirectorProtectedCPPMethodsRequired() * --------------------------------------------------------------------------- */ virtual bool extraDirectorProtectedCPPMethodsRequired() const { return false; } private: /* --------------------------------------------------------------------------- * D::writeImDModuleFunction() * * Writes a function declaration for the given (C) wrapper function to the * intermediary D module. * * d_name - The name the function in the intermediary D module will get. * return type - The return type of the function in the C wrapper. * parameters - The parameter list of the C wrapper function. * wrapper_function_name - The name of the exported function in the C wrapper * (usually d_name prefixed by »D_«). * --------------------------------------------------------------------------- */ void writeImDModuleFunction(const_String_or_char_ptr d_name, const_String_or_char_ptr return_type, const_String_or_char_ptr parameters, const_String_or_char_ptr wrapper_function_name) { // TODO: Add support for static linking here. Printf(im_dmodule_code, "SwigExternC!(%s function%s) %s;\n", return_type, parameters, d_name); Printv(wrapper_loader_bind_code, wrapper_loader_bind_command, NIL); Replaceall(wrapper_loader_bind_code, "$function", d_name); Replaceall(wrapper_loader_bind_code, "$symbol", wrapper_function_name); } /* --------------------------------------------------------------------------- * D::writeProxyClassFunction() * * Creates a D proxy function for a C++ function in the wrapped class. Used * for both static and non-static C++ class functions. * * The Node must contain two extra attributes. * - "proxyfuncname": The name of the D proxy function. * - "imfuncname": The corresponding function in the intermediary D module. * --------------------------------------------------------------------------- */ void writeProxyClassFunction(Node *n) { SwigType *t = Getattr(n, "type"); ParmList *l = Getattr(n, "parms"); String *intermediary_function_name = Getattr(n, "imfuncname"); String *proxy_function_name = Getattr(n, "proxyfuncname"); String *tm; Parm *p; int i; String *imcall = NewString(""); String *return_type = NewString(""); String *function_code = NewString(""); bool setter_flag = false; String *pre_code = NewString(""); String *post_code = NewString(""); String *terminator_code = NewString(""); // Wrappers not wanted for some methods where the parameters cannot be // overloaded in D. if (Getattr(n, "overload:ignore")) return; // Don't generate proxy method for additional explicitcall method used in // directors. if (GetFlag(n, "explicitcall")) return; // RESEARCH: What is this good for? if (l) { if (SwigType_type(Getattr(l, "type")) == T_VOID) { l = nextSibling(l); } } /* Attach the non-standard typemaps to the parameter list */ Swig_typemap_attach_parms("in", l, NULL); Swig_typemap_attach_parms("dtype", l, NULL); Swig_typemap_attach_parms("din", l, NULL); // Get return types. if ((tm = lookupDTypemap(n, "dtype"))) { String *dtypeout = Getattr(n, "tmap:dtype:out"); if (dtypeout) { // The type in the dtype typemap's out attribute overrides the type in // the typemap. tm = dtypeout; replaceClassname(tm, t); } Printf(return_type, "%s", tm); } else { Swig_warning(WARN_D_TYPEMAP_DTYPE_UNDEF, input_file, line_number, "No dtype typemap defined for %s\n", SwigType_str(t, 0)); } if (wrapping_member_flag) { // Check if this is a setter method for a public member. const String *setter_name = Swig_name_set(getNSpace(), Swig_name_member(0, proxy_class_name, variable_name)); if (Cmp(Getattr(n, "sym:name"), setter_name) == 0) { setter_flag = true; } } // Write function modifiers. { String *modifiers; const String *mods_override = Getattr(n, "feature:d:methodmodifiers"); if (mods_override) { modifiers = Copy(mods_override); } else { modifiers = Copy(is_public(n) ? public_string : protected_string); if (Getattr(n, "override")) { Printf(modifiers, " override"); } } if (is_smart_pointer()) { // Smart pointer classes do not mirror the inheritance hierarchy of the // underlying pointer type, so no override required. Replaceall(modifiers, "override", ""); } Chop(modifiers); if (static_flag) { Printf(modifiers, " static"); } Printf(function_code, "%s ", modifiers); Delete(modifiers); } // Complete the function declaration up to the parameter list. Printf(function_code, "%s %s(", return_type, proxy_function_name); // Write the wrapper function call up to the parameter list. Printv(imcall, im_dmodule_fq_name, ".$imfuncname(", NIL); if (!static_flag) { Printf(imcall, "cast(void*)swigCPtr"); } String *proxy_param_types = NewString(""); // Write the parameter list for the proxy function declaration and the // wrapper function call. emit_mark_varargs(l); int gencomma = !static_flag; for (i = 0, p = l; p; i++) { // Ignored varargs. if (checkAttribute(p, "varargs:ignore", "1")) { p = nextSibling(p); continue; } // Ignored parameters. if (checkAttribute(p, "tmap:in:numinputs", "0")) { p = Getattr(p, "tmap:in:next"); continue; } // Ignore the 'this' argument for variable wrappers. if (!(variable_wrapper_flag && i == 0)) { String *param_name = makeParameterName(n, p, i, setter_flag); SwigType *pt = Getattr(p, "type"); // Write the wrapper function call argument. { if (gencomma) { Printf(imcall, ", "); } if ((tm = lookupDTypemap(p, "din", true))) { Replaceall(tm, "$dinput", param_name); String *pre = Getattr(p, "tmap:din:pre"); if (pre) { replaceClassname(pre, pt); Replaceall(pre, "$dinput", param_name); if (Len(pre_code) > 0) Printf(pre_code, "\n"); Printv(pre_code, pre, NIL); } String *post = Getattr(p, "tmap:din:post"); if (post) { replaceClassname(post, pt); Replaceall(post, "$dinput", param_name); if (Len(post_code) > 0) Printf(post_code, "\n"); Printv(post_code, post, NIL); } String *terminator = Getattr(p, "tmap:din:terminator"); if (terminator) { replaceClassname(terminator, pt); Replaceall(terminator, "$dinput", param_name); if (Len(terminator_code) > 0) Insert(terminator_code, 0, "\n"); Insert(terminator_code, 0, terminator); } Printv(imcall, tm, NIL); } else { Swig_warning(WARN_D_TYPEMAP_DIN_UNDEF, input_file, line_number, "No din typemap defined for %s\n", SwigType_str(pt, 0)); } } // Write the D proxy function parameter. { String *proxy_type = NewString(""); if ((tm = lookupDTypemap(p, "dtype"))) { const String *inattributes = Getattr(p, "tmap:dtype:inattributes"); Printf(proxy_type, "%s%s", inattributes ? inattributes : empty_string, tm); } else { Swig_warning(WARN_D_TYPEMAP_DTYPE_UNDEF, input_file, line_number, "No dtype typemap defined for %s\n", SwigType_str(pt, 0)); } if (gencomma >= 2) { Printf(function_code, ", "); Printf(proxy_param_types, ", "); } gencomma = 2; Printf(function_code, "%s %s", proxy_type, param_name); Append(proxy_param_types, proxy_type); Delete(proxy_type); } Delete(param_name); } p = Getattr(p, "tmap:in:next"); } Printf(imcall, ")"); Printf(function_code, ") "); if (d_version > 1 && wrapping_member_flag) { Printf(function_code, "@property "); } if (wrapMemberFunctionAsDConst(n)) { Printf(function_code, "const "); } // Lookup the code used to convert the wrapper return value to the proxy // function return type. if ((tm = lookupDTypemap(n, "dout"))) { replaceExcode(n, tm, "dout", n); bool is_pre_code = Len(pre_code) > 0; bool is_post_code = Len(post_code) > 0; bool is_terminator_code = Len(terminator_code) > 0; if (is_pre_code || is_post_code || is_terminator_code) { if (is_post_code) { Insert(tm, 0, "\n try "); Printv(tm, " finally {\n", post_code, "\n }", NIL); } else { Insert(tm, 0, "\n "); } if (is_pre_code) { Insert(tm, 0, pre_code); Insert(tm, 0, "\n"); } if (is_terminator_code) { Printv(tm, "\n", terminator_code, NIL); } Insert(tm, 0, "{"); Printv(tm, "}", NIL); } if (GetFlag(n, "feature:new")) Replaceall(tm, "$owner", "true"); else Replaceall(tm, "$owner", "false"); replaceClassname(tm, t); // For director methods: generate code to selectively make a normal // polymorphic call or an explicit method call. Needed to prevent infinite // recursion when calling director methods. Node *explicit_n = Getattr(n, "explicitcallnode"); if (explicit_n && Swig_directorclass(getCurrentClass())) { String *ex_overloaded_name = getOverloadedName(explicit_n); String *ex_intermediary_function_name = Swig_name_member(getNSpace(), proxy_class_name, ex_overloaded_name); String *ex_imcall = Copy(imcall); Replaceall(ex_imcall, "$imfuncname", ex_intermediary_function_name); Replaceall(imcall, "$imfuncname", intermediary_function_name); String *excode = NewString(""); if (!Cmp(return_type, "void")) Printf(excode, "if (swigIsMethodOverridden!(%s delegate(%s), %s function(%s), %s)()) %s; else %s", return_type, proxy_param_types, return_type, proxy_param_types, proxy_function_name, ex_imcall, imcall); else Printf(excode, "((swigIsMethodOverridden!(%s delegate(%s), %s function(%s), %s)()) ? %s : %s)", return_type, proxy_param_types, return_type, proxy_param_types, proxy_function_name, ex_imcall, imcall); Clear(imcall); Printv(imcall, excode, NIL); Delete(ex_overloaded_name); Delete(excode); } else { Replaceall(imcall, "$imfuncname", intermediary_function_name); } Replaceall(tm, "$imcall", imcall); } else { Swig_warning(WARN_D_TYPEMAP_DOUT_UNDEF, input_file, line_number, "No dout typemap defined for %s\n", SwigType_str(t, 0)); } Delete(proxy_param_types); // The whole function body is now in stored tm (if there was a matching type // map, of course), so simply append it to the code buffer. The braces are // included in the typemap. Printv(function_code, tm, NIL); // Write function code buffer to the class code. Printv(proxy_class_body_code, "\n", function_code, "\n", NIL); Delete(pre_code); Delete(post_code); Delete(terminator_code); Delete(function_code); Delete(return_type); Delete(imcall); } /* --------------------------------------------------------------------------- * D::writeProxyDModuleFunction() * --------------------------------------------------------------------------- */ void writeProxyDModuleFunction(Node *n) { SwigType *t = Getattr(n, "type"); ParmList *l = Getattr(n, "parms"); String *tm; Parm *p; int i; String *imcall = NewString(""); String *return_type = NewString(""); String *function_code = NewString(""); int num_arguments = 0; String *overloaded_name = getOverloadedName(n); String *func_name = NULL; String *pre_code = NewString(""); String *post_code = NewString(""); String *terminator_code = NewString(""); // RESEARCH: What is this good for? if (l) { if (SwigType_type(Getattr(l, "type")) == T_VOID) { l = nextSibling(l); } } /* Attach the non-standard typemaps to the parameter list */ Swig_typemap_attach_parms("dtype", l, NULL); Swig_typemap_attach_parms("din", l, NULL); /* Get return types */ if ((tm = lookupDTypemap(n, "dtype"))) { String *dtypeout = Getattr(n, "tmap:dtype:out"); if (dtypeout) { // The type in the dtype typemap's out attribute overrides the type in // the typemap. tm = dtypeout; replaceClassname(tm, t); } Printf(return_type, "%s", tm); } else { Swig_warning(WARN_D_TYPEMAP_DTYPE_UNDEF, input_file, line_number, "No dtype typemap defined for %s\n", SwigType_str(t, 0)); } /* Change function name for global variables */ if (global_variable_flag) { // RESEARCH: Is the Copy() needed here? func_name = Copy(variable_name); } else { func_name = Copy(Getattr(n, "sym:name")); } /* Start generating the function */ const String *outattributes = Getattr(n, "tmap:dtype:outattributes"); if (outattributes) Printf(function_code, " %s\n", outattributes); const String *methodmods = Getattr(n, "feature:d:methodmodifiers"); // TODO: Check if is_public(n) could possibly make any sense here // (private global functions would be useless anyway?). methodmods = methodmods ? methodmods : empty_string; Printf(function_code, "\n%s%s %s(", methodmods, return_type, func_name); Printv(imcall, im_dmodule_fq_name, ".", overloaded_name, "(", NIL); /* Get number of required and total arguments */ num_arguments = emit_num_arguments(l); int gencomma = 0; /* Output each parameter */ for (i = 0, p = l; i < num_arguments; i++) { /* Ignored parameters */ while (checkAttribute(p, "tmap:in:numinputs", "0")) { p = Getattr(p, "tmap:in:next"); } SwigType *pt = Getattr(p, "type"); String *param_type = NewString(""); // Get the D parameter type. if ((tm = lookupDTypemap(p, "dtype", true))) { const String *inattributes = Getattr(p, "tmap:dtype:inattributes"); Printf(param_type, "%s%s", inattributes ? inattributes : empty_string, tm); } else { Swig_warning(WARN_D_TYPEMAP_DTYPE_UNDEF, input_file, line_number, "No dtype typemap defined for %s\n", SwigType_str(pt, 0)); } if (gencomma) Printf(imcall, ", "); const bool generating_setter = global_variable_flag || wrapping_member_flag; String *arg = makeParameterName(n, p, i, generating_setter); // Get the D code to convert the parameter value to the type used in the // wrapper D module. if ((tm = lookupDTypemap(p, "din", true))) { Replaceall(tm, "$dinput", arg); String *pre = Getattr(p, "tmap:din:pre"); if (pre) { replaceClassname(pre, pt); Replaceall(pre, "$dinput", arg); if (Len(pre_code) > 0) Printf(pre_code, "\n"); Printv(pre_code, pre, NIL); } String *post = Getattr(p, "tmap:din:post"); if (post) { replaceClassname(post, pt); Replaceall(post, "$dinput", arg); if (Len(post_code) > 0) Printf(post_code, "\n"); Printv(post_code, post, NIL); } String *terminator = Getattr(p, "tmap:din:terminator"); if (terminator) { replaceClassname(terminator, pt); Replaceall(terminator, "$dinput", arg); if (Len(terminator_code) > 0) Insert(terminator_code, 0, "\n"); Insert(terminator_code, 0, terminator); } Printv(imcall, tm, NIL); } else { Swig_warning(WARN_D_TYPEMAP_DIN_UNDEF, input_file, line_number, "No din typemap defined for %s\n", SwigType_str(pt, 0)); } /* Add parameter to module class function */ if (gencomma >= 2) Printf(function_code, ", "); gencomma = 2; Printf(function_code, "%s %s", param_type, arg); p = Getattr(p, "tmap:in:next"); Delete(arg); Delete(param_type); } Printf(imcall, ")"); Printf(function_code, ") "); if (global_variable_flag && (d_version > 1)) { Printf(function_code, "@property "); } // Lookup the code used to convert the wrapper return value to the proxy // function return type. if ((tm = lookupDTypemap(n, "dout"))) { replaceExcode(n, tm, "dout", n); bool is_pre_code = Len(pre_code) > 0; bool is_post_code = Len(post_code) > 0; bool is_terminator_code = Len(terminator_code) > 0; if (is_pre_code || is_post_code || is_terminator_code) { if (is_post_code) { Insert(tm, 0, "\n try "); Printv(tm, " finally {\n", post_code, "\n }", NIL); } else { Insert(tm, 0, "\n "); } if (is_pre_code) { Insert(tm, 0, pre_code); Insert(tm, 0, "\n"); } if (is_terminator_code) { Printv(tm, "\n", terminator_code, NIL); } Insert(tm, 0, " {"); Printf(tm, "\n}"); } if (GetFlag(n, "feature:new")) Replaceall(tm, "$owner", "true"); else Replaceall(tm, "$owner", "false"); replaceClassname(tm, t); Replaceall(tm, "$imcall", imcall); } else { Swig_warning(WARN_D_TYPEMAP_DOUT_UNDEF, input_file, line_number, "No dout typemap defined for %s\n", SwigType_str(t, 0)); } // The whole function code is now stored in tm (if there was a matching // type map, of course), so simply append it to the code buffer. Printf(function_code, "%s\n", tm ? (const String *) tm : empty_string); Printv(proxyCodeBuffer(getNSpace()), function_code, NIL); Delete(pre_code); Delete(post_code); Delete(terminator_code); Delete(function_code); Delete(return_type); Delete(imcall); Delete(func_name); } /* --------------------------------------------------------------------------- * D::writeProxyClassAndUpcasts() * * Collects all the code fragments generated by the handler function while * traversing the tree from the proxy_class_* variables and writes the * class definition (including any epilogue code) to proxy_class_code. * * Also writes the upcast function to the wrapper layer when processing a * derived class. * * Inputs: * n – The class node currently processed. * --------------------------------------------------------------------------- */ void writeProxyClassAndUpcasts(Node *n) { SwigType *typemap_lookup_type = Getattr(n, "classtypeobj"); /* * Handle inheriting from D and C++ classes. */ String *c_classname = SwigType_namestr(Getattr(n, "name")); String *c_baseclass = NULL; Node *basenode = NULL; String *basename = NULL; String *c_baseclassname = NULL; // Inheritance from pure D classes. Node *attributes = NewHash(); const String *pure_baseclass = lookupCodeTypemap(n, "dbase", typemap_lookup_type, WARN_NONE, attributes); bool purebase_replace = GetFlag(attributes, "tmap:dbase:replace") ? true : false; bool purebase_notderived = GetFlag(attributes, "tmap:dbase:notderived") ? true : false; Delete(attributes); // C++ inheritance. if (!purebase_replace) { List *baselist = Getattr(n, "bases"); if (baselist) { Iterator base = First(baselist); while (base.item) { if (!GetFlag(base.item, "feature:ignore")) { String *baseclassname = Getattr(base.item, "name"); if (!c_baseclassname) { basenode = base.item; c_baseclassname = baseclassname; basename = createProxyName(c_baseclassname); if (basename) c_baseclass = SwigType_namestr(baseclassname); } else { /* Warn about multiple inheritance for additional base class(es) */ String *proxyclassname = Getattr(n, "classtypeobj"); Swig_warning(WARN_D_MULTIPLE_INHERITANCE, Getfile(n), Getline(n), "Base %s of class %s ignored: multiple inheritance is not supported in D.\n", SwigType_namestr(baseclassname), SwigType_namestr(proxyclassname)); } } base = Next(base); } } } bool derived = (basename != NULL); if (derived && purebase_notderived) { pure_baseclass = empty_string; } const String *wanted_base = basename ? basename : pure_baseclass; if (purebase_replace) { wanted_base = pure_baseclass; derived = false; basenode = NULL; Delete(basename); basename = NULL; if (purebase_notderived) { Swig_error(Getfile(n), Getline(n), "The dbase typemap for proxy %s must contain just one of the 'replace' or 'notderived' attributes.\n", typemap_lookup_type); } } else if (basename && Len(pure_baseclass) > 0) { Swig_warning(WARN_D_MULTIPLE_INHERITANCE, Getfile(n), Getline(n), "Warning for %s, base class %s ignored. Multiple inheritance is not supported in D. " "Perhaps you need one of the 'replace' or 'notderived' attributes in the dbase typemap?\n", typemap_lookup_type, pure_baseclass); } // Add code to do C++ casting to base class (only for classes in an inheritance hierarchy) if (derived) { writeClassUpcast(n, proxy_class_name, c_classname, c_baseclass); } /* * Write needed imports. */ // If this class is derived from a C++ class, we need to have the D class // generated for it in scope. if (derived) { requireDType(Getattr(basenode, "sym:nspace"), Getattr(basenode, "sym:name")); } // Write any custom import statements to the proxy module header. const String *imports = lookupCodeTypemap(n, "dimports", typemap_lookup_type, WARN_NONE); if (Len(imports) > 0) { String* imports_trimmed = Copy(imports); Chop(imports_trimmed); replaceImportTypeMacros(imports_trimmed); Printv(proxy_class_imports, imports_trimmed, "\n", NIL); Delete(imports_trimmed); } /* * Write the proxy class header. */ // Class modifiers. const String *modifiers = lookupCodeTypemap(n, "dclassmodifiers", typemap_lookup_type, WARN_D_TYPEMAP_CLASSMOD_UNDEF); // User-defined interfaces. const String *interfaces = lookupCodeTypemap(n, derived ? "dinterfaces_derived" : "dinterfaces", typemap_lookup_type, WARN_NONE); Printv(proxy_class_code, "\n", modifiers, " $dclassname", (*Char(wanted_base) || *Char(interfaces)) ? " : " : "", wanted_base, (*Char(wanted_base) && *Char(interfaces)) ? ", " : "", interfaces, " {", NIL); /* * Write the proxy class body. */ String* body = NewString(""); // Default class body. const String *dbody; if (derived) { dbody = lookupCodeTypemap(n, "dbody_derived", typemap_lookup_type, WARN_D_TYPEMAP_DBODY_UNDEF); } else { dbody = lookupCodeTypemap(n, "dbody", typemap_lookup_type, WARN_D_TYPEMAP_DBODY_UNDEF); } Printv(body, dbody, NIL); // Destructor and dispose(). // If the C++ destructor is accessible (public), it is wrapped by the // dispose() method which is also called by the emitted D constructor. If it // is not accessible, no D destructor is written and the generated dispose() // method throws an exception. // This enables C++ classes with protected or private destructors to be used // in D as it would be used in C++ (GC finalization is a no-op then because // of the empty D destructor) while preventing usage in »scope« variables. // The method name for the dispose() method is specified in a typemap // attribute called »methodname«. const String *tm = NULL; const String *dispose_methodname; const String *dispose_methodmodifiers; const String *dispose_parameters; attributes = NewHash(); if (derived) { tm = lookupCodeTypemap(n, "ddispose_derived", typemap_lookup_type, WARN_NONE, attributes); dispose_methodname = Getattr(attributes, "tmap:ddispose_derived:methodname"); dispose_methodmodifiers = Getattr(attributes, "tmap:ddispose_derived:methodmodifiers"); dispose_parameters = Getattr(attributes, "tmap:ddispose_derived:parameters"); } else { tm = lookupCodeTypemap(n, "ddispose", typemap_lookup_type, WARN_NONE, attributes); dispose_methodname = Getattr(attributes, "tmap:ddispose:methodname"); dispose_methodmodifiers = Getattr(attributes, "tmap:ddispose:methodmodifiers"); dispose_parameters = Getattr(attributes, "tmap:ddispose:parameters"); } if (tm && *Char(tm)) { if (!dispose_methodname) { Swig_error(Getfile(n), Getline(n), "No methodname attribute defined in the ddispose%s typemap for %s\n", (derived ? "_derived" : ""), proxy_class_name); } if (!dispose_methodmodifiers) { Swig_error(Getfile(n), Getline(n), "No methodmodifiers attribute defined in ddispose%s typemap for %s.\n", (derived ? "_derived" : ""), proxy_class_name); } if (!dispose_parameters) dispose_parameters = empty_string; } if (tm) { // Write the destructor if the C++ one is accessible. if (*Char(destructor_call)) { Printv(body, lookupCodeTypemap(n, "ddestructor", typemap_lookup_type, WARN_NONE), NIL); } // Write the dispose() method. String *dispose_code = NewString(""); Printv(dispose_code, tm, NIL); if (*Char(destructor_call)) { Replaceall(dispose_code, "$imcall", destructor_call); } else { Replaceall(dispose_code, "$imcall", "throw new object.Exception(\"C++ destructor does not have public access\")"); } if (*Char(dispose_code)) { Printv(body, "\n", NIL); const String *methodmods = Getattr(n, "destructmethodmodifiers"); if (methodmods) Printv(body, methodmods, NIL); else Printv(body, dispose_methodmodifiers, (derived ? " override" : ""), NIL); Printv(body, " void ", dispose_methodname, "(", dispose_parameters, ") ", dispose_code, "\n", NIL); } } if (Swig_directorclass(n)) { // If directors are enabled for the current class, generate the // director connect helper function which is called from the constructor // and write it to the class body. writeDirectorConnectProxy(n); } // Write all constants and enumerations first to prevent forward reference // errors. Printv(body, proxy_class_enums_code, NIL); // Write the code generated in other methods to the class body. Printv(body, proxy_class_body_code, NIL); // Append extra user D code to the class body. Printv(body, lookupCodeTypemap(n, "dcode", typemap_lookup_type, WARN_NONE), "\n", NIL); // Write the class body and the curly bracket closing the class definition // to the proxy module. indentCode(body); Replaceall(body, "$dbaseclass", basename); Delete(basename); Printv(proxy_class_code, body, "\n}\n", NIL); Delete(body); // Write the epilogue code if there is any. Printv(proxy_class_code, proxy_class_epilogue_code, NIL); } /* --------------------------------------------------------------------------- * D::writeClassUpcast() * --------------------------------------------------------------------------- */ void writeClassUpcast(Node *n, const String* d_class_name, String* c_class_name, String* c_base_name) { SwigType *smart = Swig_cparse_smartptr(n); String *upcast_name = Swig_name_member(getNSpace(), d_class_name, (smart != 0 ? "SmartPtrUpcast" : "Upcast")); String *upcast_wrapper_name = Swig_name_wrapper(upcast_name); writeImDModuleFunction(upcast_name, "void*", "(void* objectRef)", upcast_wrapper_name); if (smart) { SwigType *bsmart = Copy(smart); SwigType *rclassname = SwigType_typedef_resolve_all(c_class_name); SwigType *rbaseclass = SwigType_typedef_resolve_all(c_base_name); Replaceall(bsmart, rclassname, rbaseclass); Delete(rclassname); Delete(rbaseclass); String *smartnamestr = SwigType_namestr(smart); String *bsmartnamestr = SwigType_namestr(bsmart); Printv(upcasts_code, "SWIGEXPORT ", bsmartnamestr, " * ", upcast_wrapper_name, "(", smartnamestr, " *objectRef) {\n", " return objectRef ? new ", bsmartnamestr, "(*objectRef) : 0;\n" "}\n", "\n", NIL); Delete(bsmartnamestr); Delete(smartnamestr); Delete(bsmart); } else { Printv(upcasts_code, "SWIGEXPORT ", c_base_name, " * ", upcast_wrapper_name, "(", c_base_name, " *objectRef) {\n", " return (", c_base_name, " *)objectRef;\n" "}\n", "\n", NIL); } Replaceall(upcasts_code, "$cclass", c_class_name); Replaceall(upcasts_code, "$cbaseclass", c_base_name); Delete(upcast_name); Delete(upcast_wrapper_name); Delete(smart); } /* --------------------------------------------------------------------------- * D::writeTypeWrapperClass() * --------------------------------------------------------------------------- */ void writeTypeWrapperClass(String *classname, SwigType *type) { Node *n = NewHash(); Setfile(n, input_file); Setline(n, line_number); assertClassNameValidity(classname); String* imports_target; String* code_target; File *class_file = NULL; if (split_proxy_dmodule) { String *filename = NewStringf("%s%s.d", dmodule_directory, classname); class_file = NewFile(filename, "w", SWIG_output_files()); if (!class_file) { FileErrorDisplay(filename); SWIG_exit(EXIT_FAILURE); } Append(filenames_list, Copy(filename)); Delete(filename); emitBanner(class_file); Printf(class_file, "module %s%s;\n", package, classname); Printf(class_file, "\nstatic import %s;\n", im_dmodule_fq_name); imports_target = NewString(""); code_target = NewString(""); } else { imports_target = proxyImportsBuffer(0); code_target = proxyCodeBuffer(0); } // Import statements. const String *imports = lookupCodeTypemap(n, "dimports", type, WARN_NONE); if (Len(imports) > 0) { String *imports_trimmed = Copy(imports); Chop(imports_trimmed); replaceImportTypeMacros(imports_trimmed); Printv(imports_target, imports_trimmed, "\n", NIL); Delete(imports_trimmed); } // Pure D baseclass and interfaces (no C++ inheritance possible. const String *pure_baseclass = lookupCodeTypemap(n, "dbase", type, WARN_NONE); const String *pure_interfaces = lookupCodeTypemap(n, "dinterfaces", type, WARN_NONE); // Emit the class. Printv(code_target, "\n", lookupCodeTypemap(n, "dclassmodifiers", type, WARN_D_TYPEMAP_CLASSMOD_UNDEF), " $dclassname", (*Char(pure_baseclass) || *Char(pure_interfaces)) ? " : " : "", pure_baseclass, ((*Char(pure_baseclass)) && *Char(pure_interfaces)) ? ", " : "", pure_interfaces, " {", NIL); String* body = NewString(""); Printv(body, lookupCodeTypemap(n, "dbody", type, WARN_D_TYPEMAP_DBODY_UNDEF), lookupCodeTypemap(n, "dcode", type, WARN_NONE), NIL); indentCode(body); Printv(code_target, body, "\n}\n", NIL); Delete(body); Replaceall(code_target, "$dclassname", classname); if (split_proxy_dmodule) { Printv(class_file, imports_target, NIL); Delete(imports_target); replaceModuleVariables(code_target); Printv(class_file, code_target, NIL); Delete(code_target); Delete(class_file); } Delete(n); } /* --------------------------------------------------------------------------- * D::writeDirectorConnectProxy(Node *classNode) * * Writes the helper method which registers the director callbacks by calling * the director connect function from the D side to the proxy class. * --------------------------------------------------------------------------- */ void writeDirectorConnectProxy(Node* classNode) { String *dirClassName = directorClassName(classNode); String *connect_name = Swig_name_member(getNSpace(), proxy_class_name, "director_connect"); Printf(proxy_class_body_code, "\nprivate void swigDirectorConnect() {\n"); int i; for (i = first_class_dmethod; i < curr_class_dmethod; ++i) { UpcallData *udata = Getitem(dmethods_seq, i); String *method = Getattr(udata, "method"); String *overloaded_name = Getattr(udata, "overname"); String *return_type = Getattr(udata, "return_type"); String *param_list = Getattr(udata, "param_list"); String *methid = Getattr(udata, "class_methodidx"); Printf(proxy_class_body_code, " %s.%s_Callback%s callback%s;\n", im_dmodule_fq_name, dirClassName, methid, methid); Printf(proxy_class_body_code, " if (swigIsMethodOverridden!(%s delegate(%s), %s function(%s), %s)()) {\n", return_type, param_list, return_type, param_list, method); Printf(proxy_class_body_code, " callback%s = &swigDirectorCallback_%s_%s;\n", methid, proxy_class_name, overloaded_name); Printf(proxy_class_body_code, " }\n\n"); } Printf(proxy_class_body_code, " %s.%s(cast(void*)swigCPtr, cast(void*)this", im_dmodule_fq_name, connect_name); for (i = first_class_dmethod; i < curr_class_dmethod; ++i) { UpcallData *udata = Getitem(dmethods_seq, i); String *methid = Getattr(udata, "class_methodidx"); Printf(proxy_class_body_code, ", callback%s", methid); } Printf(proxy_class_body_code, ");\n"); Printf(proxy_class_body_code, "}\n"); // Helper function to determine if a method has been overridden in a // subclass of the wrapped class. If not, we just pass null to the // director_connect_function since the method from the C++ class should // be called as usual (see above). // Only emit it if the proxy class has at least one method. if (first_class_dmethod < curr_class_dmethod) { Printf(proxy_class_body_code, "\n"); Printf(proxy_class_body_code, "private bool swigIsMethodOverridden(DelegateType, FunctionType, alias fn)() %s{\n", (d_version > 1) ? "const " : ""); Printf(proxy_class_body_code, " DelegateType dg = &fn;\n"); Printf(proxy_class_body_code, " return dg.funcptr != SwigNonVirtualAddressOf!(FunctionType, fn);\n"); Printf(proxy_class_body_code, "}\n"); Printf(proxy_class_body_code, "\n"); Printf(proxy_class_body_code, "private static Function SwigNonVirtualAddressOf(Function, alias fn)() {\n"); Printf(proxy_class_body_code, " return cast(Function) &fn;\n"); Printf(proxy_class_body_code, "}\n"); } if (Len(director_dcallbacks_code) > 0) { Printv(proxy_class_epilogue_code, director_dcallbacks_code, NIL); } Delete(director_callback_typedefs); director_callback_typedefs = NULL; Delete(director_callback_pointers); director_callback_pointers = NULL; Delete(director_dcallbacks_code); director_dcallbacks_code = NULL; Delete(dirClassName); Delete(connect_name); } /* --------------------------------------------------------------------------- * D::writeDirectorConnectWrapper() * * Writes the director connect function and the corresponding declaration to * the C++ wrapper respectively the D wrapper. * --------------------------------------------------------------------------- */ void writeDirectorConnectWrapper(Node *n) { if (!Swig_directorclass(n)) return; // Output the director connect method. String *norm_name = SwigType_namestr(Getattr(n, "name")); String *connect_name = Swig_name_member(getNSpace(), proxy_class_name, "director_connect"); String *dirClassName = directorClassName(n); Wrapper *code_wrap; Printv(wrapper_loader_bind_code, wrapper_loader_bind_command, NIL); Replaceall(wrapper_loader_bind_code, "$function", connect_name); Replaceall(wrapper_loader_bind_code, "$symbol", Swig_name_wrapper(connect_name)); Printf(im_dmodule_code, "extern(C) void function(void* cObject, void* dObject"); code_wrap = NewWrapper(); Printf(code_wrap->def, "SWIGEXPORT void D_%s(void *objarg, void *dobj", connect_name); Printf(code_wrap->code, " %s *obj = (%s *)objarg;\n", norm_name, norm_name); Printf(code_wrap->code, " %s *director = static_cast<%s *>(obj);\n", dirClassName, dirClassName); Printf(code_wrap->code, " director->swig_connect_director(dobj"); for (int i = first_class_dmethod; i < curr_class_dmethod; ++i) { UpcallData *udata = Getitem(dmethods_seq, i); String *methid = Getattr(udata, "class_methodidx"); Printf(code_wrap->def, ", %s::SWIG_Callback%s_t callback%s", dirClassName, methid, methid); Printf(code_wrap->code, ", callback%s", methid); Printf(im_dmodule_code, ", %s_Callback%s callback%s", dirClassName, methid, methid); } Printf(code_wrap->def, ") {\n"); Printf(code_wrap->code, ");\n"); Printf(im_dmodule_code, ") %s;\n", connect_name); Printf(code_wrap->code, "}\n"); Wrapper_print(code_wrap, f_wrappers); DelWrapper(code_wrap); Delete(connect_name); Delete(dirClassName); } /* --------------------------------------------------------------------------- * D::requireDType() * * If the given type is not already in scope in the current module, adds an * import statement for it. The name is considered relative to the global root * package if one is set. * * This is only used for dependencies created in generated code, user- * (i.e. typemap-) specified import statements are handled separately. * --------------------------------------------------------------------------- */ void requireDType(const String *nspace, const String *symname) { String *dmodule = createModuleName(nspace, symname); if (!inProxyModule(dmodule)) { String *import = createImportStatement(dmodule); Append(import, "\n"); if (is_wrapping_class()) { addImportStatement(proxy_class_imports, import); } else { addImportStatement(proxyImportsBuffer(getNSpace()), import); } Delete(import); } Delete(dmodule); } /* --------------------------------------------------------------------------- * D::addImportStatement() * * Adds the given import statement to the given list of import statements if * there is no statement importing that module present yet. * --------------------------------------------------------------------------- */ void addImportStatement(String *target, const String *import) const { char *position = Strstr(target, import); if (position) { // If the import statement has been found in the target string, we have to // check if the previous import was static, which would lead to problems // if this import is not. // Thus, we check if the seven characters in front of the occurrence are // »static «. If the import string passed is also static, the checks fail // even if the found statement is also static because the last seven // characters would be part of the previous import statement then. if (position - Char(target) < 7) { return; } if (strncmp(position - 7, "static ", 7)) { return; } } Printv(target, import, NIL); } /* --------------------------------------------------------------------------- * D::createImportStatement() * * Creates a string containing an import statement for the given module. * --------------------------------------------------------------------------- */ String *createImportStatement(const String *dmodule_name, bool static_import = true) const { if (static_import) { return NewStringf("static import %s%s;", package, dmodule_name); } else { return NewStringf("import %s%s;", package, dmodule_name); } } /* --------------------------------------------------------------------------- * D::inProxyModule() * * Determines if the specified proxy type is declared in the currently * processed proxy D module. * * This function is used to determine if fully qualified type names have to * be used (package, module and type name). If the split proxy mode is not * used, this solely depends on whether the type is in the current namespace. * --------------------------------------------------------------------------- */ bool inProxyModule(const String *type_name) const { if (!split_proxy_dmodule) { String *nspace = createOuterNamespaceNames(type_name); // Check if strings are either both null (no namespace) or are both // non-null and have the same contents. Cannot use Strcmp for this // directly because of its strange way of handling the case where only // one argument is 0 ("<"). bool result = !nspace && !getNSpace(); if (nspace && getNSpace()) result = (Strcmp(nspace, getNSpace()) == 0); Delete(nspace); return result; } if (!is_wrapping_class()) { return false; } return (Strcmp(proxy_class_qname, type_name) == 0); } /* --------------------------------------------------------------------------- * D::addUpcallMethod() * * Adds new director upcall signature. * --------------------------------------------------------------------------- */ UpcallData *addUpcallMethod(String *imclass_method, String *class_method, String *decl, String *overloaded_name, String *return_type, String *param_list) { String *key = NewStringf("%s|%s", imclass_method, decl); ++curr_class_dmethod; String *class_methodidx = NewStringf("%d", n_dmethods - first_class_dmethod); n_dmethods++; Hash *new_udata = NewHash(); Append(dmethods_seq, new_udata); Setattr(dmethods_table, key, new_udata); Setattr(new_udata, "method", Copy(class_method)); Setattr(new_udata, "class_methodidx", class_methodidx); Setattr(new_udata, "decl", Copy(decl)); Setattr(new_udata, "overname", Copy(overloaded_name)); Setattr(new_udata, "return_type", Copy(return_type)); Setattr(new_udata, "param_list", Copy(param_list)); Delete(key); return new_udata; } /* --------------------------------------------------------------------------- * D::assertClassNameValidity() * --------------------------------------------------------------------------- */ void assertClassNameValidity(const String* class_name) const { // TODO: With nspace support, there could arise problems also when not in // split proxy mode, warnings for these should be added. if (split_proxy_dmodule) { if (Cmp(class_name, im_dmodule_name) == 0) { Swig_error(input_file, line_number, "Class name cannot be equal to intermediary D module name: %s\n", class_name); SWIG_exit(EXIT_FAILURE); } String *nspace = getNSpace(); if (nspace) { // Check the root package/outermost namespace (a class A in module // A.B leads to problems if another module A.C is also imported) if (Len(package) > 0) { String *dotless_package = NewStringWithSize(package, Len(package) - 1); if (Cmp(class_name, dotless_package) == 0) { Swig_error(input_file, line_number, "Class name cannot be the same as the root package it is in: %s\n", class_name); SWIG_exit(EXIT_FAILURE); } Delete(dotless_package); } else { String *outer = createFirstNamespaceName(nspace); if (Cmp(class_name, outer) == 0) { Swig_error(input_file, line_number, "Class name cannot be the same as the outermost namespace it is in: %s\n", class_name); SWIG_exit(EXIT_FAILURE); } Delete(outer); } // … and the innermost one (because of the conflict with the main proxy // module named like the namespace). String *inner = createLastNamespaceName(nspace); if (Cmp(class_name, inner) == 0) { Swig_error(input_file, line_number, "Class name cannot be the same as the innermost namespace it is in: %s\n", class_name); SWIG_exit(EXIT_FAILURE); } Delete(inner); } else { if (Cmp(class_name, proxy_dmodule_name) == 0) { Swig_error(input_file, line_number, "Class name cannot be equal to proxy D module name: %s\n", class_name); SWIG_exit(EXIT_FAILURE); } } } } /* --------------------------------------------------------------------------- * D::getPrimitiveDptype() * * Returns the D proxy type for the passed type if it is a primitive type in * both C and D. * --------------------------------------------------------------------------- */ String *getPrimitiveDptype(Node *node, SwigType *type) { SwigType *stripped_type = SwigType_typedef_resolve_all(type); // A reference can only be the »outermost element« of a type. bool mutable_ref = false; if (SwigType_isreference(stripped_type)) { SwigType_del_reference(stripped_type); if (SwigType_isconst(stripped_type)) { SwigType_del_qualifier(stripped_type); } else { mutable_ref = true; } } // Strip all the pointers from the type. int indirection_count = 0; while (SwigType_ispointer(stripped_type)) { ++indirection_count; SwigType_del_pointer(stripped_type); } // Now that we got rid of the pointers, see if we are dealing with a // primitive type. String *dtype = 0; if (SwigType_isfunction(stripped_type) && indirection_count > 0) { // type was a function pointer, split it up. SwigType_add_pointer(stripped_type); --indirection_count; SwigType *return_type = Copy(stripped_type); SwigType *params_type = SwigType_functionpointer_decompose(return_type); String *return_dtype = getPrimitiveDptype(node, return_type); Delete(return_type); if (!return_dtype) { return 0; } List *parms = SwigType_parmlist(params_type); List *param_dtypes = NewList(); for (Iterator it = First(parms); it.item; it = Next(it)) { String *current_dtype = getPrimitiveDptype(node, it.item); if (Cmp(current_dtype, "void") == 0) { // void somefunc(void) is legal syntax in C, but not in D, so simply // skip the void parameter. Delete(current_dtype); continue; } if (!current_dtype) { Delete(return_dtype); Delete(param_dtypes); return 0; } Append(param_dtypes, current_dtype); } String *param_list = NewString(""); { bool gen_comma = false; for (Iterator it = First(param_dtypes); it.item; it = Next(it)) { if (gen_comma) { Append(param_list, ", "); } Append(param_list, it.item); Delete(it.item); gen_comma = true; } } dtype = NewStringf("%s.SwigExternC!(%s function(%s))", im_dmodule_fq_name, return_dtype, param_list); Delete(param_list); Delete(param_dtypes); Delete(return_dtype); } else { Hash *attributes = NewHash(); const String *tm = lookupCodeTypemap(node, "dtype", stripped_type, WARN_NONE, attributes); if(!GetFlag(attributes, "tmap:dtype:cprimitive")) { dtype = 0; } else { dtype = Copy(tm); // We need to call replaceClassname here with the stripped type to avoid // $dclassname in the enum typemaps being replaced later with the full // type. replaceClassname(dtype, stripped_type); } Delete(attributes); } Delete(stripped_type); if (!dtype) { // The type passed is no primitive type. return 0; } // The type is ultimately a primitive type, now append the right number of // indirection levels (pointers). for (int i = 0; i < indirection_count; ++i) { Append(dtype, "*"); } // Add a level of indirection for a mutable reference since it is wrapped // as a pointer. if (mutable_ref) { Append(dtype, "*"); } return dtype; } /* --------------------------------------------------------------------------- * D::lookupCodeTypemap() * * Looks up a D code fragment for generating the wrapper class for the given * type. * * n - for input only and must contain info for Getfile(n) and Getline(n) to work * tmap_method - typemap method name * type - typemap type to lookup * warning - warning number to issue if no typemaps found * typemap_attributes - the typemap attributes are attached to this node and will * also be used for temporary storage if non null * return is never NULL, unlike Swig_typemap_lookup() * --------------------------------------------------------------------------- */ const String *lookupCodeTypemap(Node *n, const_String_or_char_ptr tmap_method, SwigType *type, int warning, Node *typemap_attributes = 0) const { Node *node = !typemap_attributes ? NewHash() : typemap_attributes; Setattr(node, "type", type); Setfile(node, Getfile(n)); Setline(node, Getline(n)); const String *tm = Swig_typemap_lookup(tmap_method, node, "", 0); if (!tm) { tm = empty_string; if (warning != WARN_NONE) { Swig_warning(warning, Getfile(n), Getline(n), "No %s typemap defined for %s\n", tmap_method, SwigType_str(type, 0)); } } if (!typemap_attributes) { Delete(node); } return tm; } /* --------------------------------------------------------------------------- * D::lookupDTypemap() * * Looks up a D typemap for the given node, replacing D-specific special * variables as needed. * * The method parameter specifies the typemap method to use. If attached is * true, the value is just fetched from the tmap: node attribute, * Swig_typemap_lookup is used otherwise. * --------------------------------------------------------------------------- */ String *lookupDTypemap(Node *n, const_String_or_char_ptr method, bool attached = false) { String *result = 0; if (attached) { String *attr_name = NewStringf("tmap:%s", method); result = Copy(Getattr(n, attr_name)); Delete(attr_name); } else { // FIXME: As a workaround for a bug so far only surfacing in the // smart_pointer_const_overload test case, remove the nativepointer // typemap attribute since it seems to be already there from a dout // typemap of a different type in that test. String *np_key = NewStringf("tmap:%s:nativepointer", method); Delattr(n, np_key); Delete(np_key); result = Swig_typemap_lookup(method, n, "", 0); } if (!result) { return 0; } // Check if the passed node actually has type information attached. This // is not the case e.g. in constructorWrapper. SwigType *type = Getattr(n, "type"); if (type) { String *np_key = NewStringf("tmap:%s:nativepointer", method); String *np_value = Getattr(n, np_key); Delete(np_key); String *dtype; if (np_value && (dtype = getPrimitiveDptype(n, type))) { // If the typemap in question has a »nativepointer« attribute and we // are dealing with a primitive type, use it instead. result = Copy(np_value); Replaceall(result, "$dtype", dtype); } replaceClassname(result, type); } return result; } /* --------------------------------------------------------------------------- * D::replaceClassname() * * Replaces the special variable $dclassname with the proxy class name for * classes/structs/unions SWIG knows about. Also substitutes the enumeration * name for non-anonymous enums. Otherwise, $classname is replaced with a * $descriptor(type)-like name. * * $*dclassname and $&classname work like with descriptors (see manual section * 10.4.3), they remove a prointer from respectively add a pointer to the type. * * Inputs: * tm - String to perform the substitution at (will usually come from a * typemap. * pt - The type to substitute for the variables. * Outputs: * tm - String with the variables substituted. * Return: * substitution_performed - flag indicating if a substitution was performed * --------------------------------------------------------------------------- */ bool replaceClassname(String *tm, SwigType *pt) { bool substitution_performed = false; SwigType *type = Copy(SwigType_typedef_resolve_all(pt)); SwigType *strippedtype = SwigType_strip_qualifiers(type); if (Strstr(tm, "$dclassname")) { SwigType *classnametype = Copy(strippedtype); replaceClassnameVariable(tm, "$dclassname", classnametype); substitution_performed = true; Delete(classnametype); } if (Strstr(tm, "$*dclassname")) { SwigType *classnametype = Copy(strippedtype); Delete(SwigType_pop(classnametype)); replaceClassnameVariable(tm, "$*dclassname", classnametype); substitution_performed = true; Delete(classnametype); } if (Strstr(tm, "$&dclassname")) { SwigType *classnametype = Copy(strippedtype); SwigType_add_pointer(classnametype); replaceClassnameVariable(tm, "$&dclassname", classnametype); substitution_performed = true; Delete(classnametype); } Delete(strippedtype); Delete(type); return substitution_performed; } /* --------------------------------------------------------------------------- * D::replaceClassnameVariable() * * See D::replaceClassname(). * --------------------------------------------------------------------------- */ void replaceClassnameVariable(String *target, const char *variable, SwigType *type) { // TODO: Fix const-correctness of methods called in here and make type const. // We make use of the fact that this function is called at least once for // every type encountered which is written to a separate file, which allows // us to handle imports here. // When working in split proxy module mode, each generated proxy class/enum // is written to a separate module. This requires us to add a corresponding // import when a type is used in another generated module. If we are not // working in split proxy module mode, this is not relevant and the // generated module name is discarded. String *type_name; if (SwigType_isenum(type)) { // RESEARCH: Make sure that we really cannot get here for anonymous enums. Node *n = enumLookup(type); if (n) { String *enum_name = Getattr(n, "sym:name"); Node *p = parentNode(n); if (p && !Strcmp(nodeType(p), "class")) { // This is a nested enum. String *parent_name = Getattr(p, "sym:name"); String *nspace = Getattr(p, "sym:nspace"); // An enum nested in a class is not written to a separate module (this // would not even be possible in D), so just import the parent. requireDType(nspace, parent_name); String *module = createModuleName(nspace, parent_name); if (inProxyModule(module)) { type_name = NewStringf("%s.%s", parent_name, enum_name); } else { type_name = NewStringf("%s%s.%s.%s", package, module, parent_name, enum_name); } } else { // A non-nested enum is written to a separate module, import it. String *nspace = Getattr(n, "sym:nspace"); requireDType(nspace, enum_name); String *module = createModuleName(nspace, enum_name); if (inProxyModule(module)) { type_name = Copy(enum_name); } else { type_name = NewStringf("%s%s.%s", package, module, enum_name); } } } else { type_name = NewStringf("int"); } } else { Node *n = classLookup(type); if (n) { String *class_name = Getattr(n, "sym:name"); String *nspace = Getattr(n, "sym:nspace"); requireDType(nspace, class_name); String *module = createModuleName(nspace, class_name); if (inProxyModule(module)) { type_name = Copy(class_name); } else { type_name = NewStringf("%s%s.%s", package, module, class_name); } Delete(module); } else { // SWIG does not know anything about the type (after resolving typedefs). // Just mangle the type name string like $descriptor(type) would do. String *descriptor = NewStringf("SWIGTYPE%s", SwigType_manglestr(type)); requireDType(NULL, descriptor); String *module = createModuleName(NULL, descriptor); if (inProxyModule(module)) { type_name = Copy(descriptor); } else { type_name = NewStringf("%s%s.%s", package, module, descriptor); } Delete(module); // Add to hash table so that a type wrapper class can be created later. Setattr(unknown_types, descriptor, type); Delete(descriptor); } } Replaceall(target, variable, type_name); Delete(type_name); } /* --------------------------------------------------------------------------- * D::createModuleName() * * Returns a string holding the name of the module to import to bring the * given type in scope. * --------------------------------------------------------------------------- */ String *createModuleName(const String *nspace, const String *type_name) const { String *module; if (nspace) { module = NewStringf("%s.", nspace); if (split_proxy_dmodule) { Printv(module, type_name, NIL); } else { String *inner = createLastNamespaceName(nspace); Printv(module, inner, NIL); Delete(inner); } } else { if (split_proxy_dmodule) { module = Copy(type_name); } else { module = Copy(proxy_dmodule_name); } } return module; } /* --------------------------------------------------------------------------- * D::replaceModuleVariables() * * Replaces the $imdmodule and $module variables with their values in the * target string. * --------------------------------------------------------------------------- */ void replaceModuleVariables(String *target) const { Replaceall(target, "$imdmodule", im_dmodule_fq_name); Replaceall(target, "$module", proxy_dmodule_name); } /* --------------------------------------------------------------------------- * D::replaceExcode() * * If a C++ method can throw a exception, additional code is added to the * proxy method to check if an exception is pending so that it can be * rethrown on the D side. * * This method replaces the $excode variable with the exception handling code * in the excode typemap attribute if it »canthrow« an exception. * --------------------------------------------------------------------------- */ void replaceExcode(Node *n, String *code, const String *typemap, Node *parameter) const { String *excode_attribute = NewStringf("tmap:%s:excode", typemap); String *excode = Getattr(parameter, excode_attribute); if (Getattr(n, "d:canthrow")) { int count = Replaceall(code, "$excode", excode); if (count < 1 || !excode) { Swig_warning(WARN_D_EXCODE_MISSING, input_file, line_number, "D exception may not be thrown – no $excode or excode attribute in '%s' typemap.\n", typemap); } } else { Replaceall(code, "$excode", ""); } Delete(excode_attribute); } /* --------------------------------------------------------------------------- * D::replaceImportTypeMacros() * * Replaces the $importtype(SomeDClass) macro with an import statement if it * is required to get SomeDClass in scope for the currently generated proxy * D module. * --------------------------------------------------------------------------- */ void replaceImportTypeMacros(String *target) const { // Code from replace_embedded_typemap. char *start = 0; while ((start = Strstr(target, "$importtype("))) { char *end = 0; char *param_start = 0; char *param_end = 0; int level = 0; char *c = start; while (*c) { if (*c == '(') { if (level == 0) { param_start = c + 1; } level++; } if (*c == ')') { level--; if (level == 0) { param_end = c; end = c + 1; break; } } c++; } if (end) { String *current_macro = NewStringWithSize(start, (int)(end - start)); String *current_param = NewStringWithSize(param_start, (int)(param_end - param_start)); if (inProxyModule(current_param)) { Replace(target, current_macro, "", DOH_REPLACE_ANY); } else { String *import = createImportStatement(current_param, false); Replace(target, current_macro, import, DOH_REPLACE_ANY); Delete(import); } Delete(current_param); Delete(current_macro); } else { String *current_macro = NewStringWithSize(start, (int)(c - start)); Swig_error(Getfile(target), Getline(target), "Syntax error in: %s\n", current_macro); Replace(target, current_macro, "", DOH_REPLACE_ANY); Delete(current_macro); } } } /* --------------------------------------------------------------------------- * D::getOverloadedName() * --------------------------------------------------------------------------- */ String *getOverloadedName(Node *n) const { // A void* parameter is used for all wrapped classes in the wrapper code. // Thus, the wrapper function names for overloaded functions are postfixed // with a counter string to make them unique. String *overloaded_name = Copy(Getattr(n, "sym:name")); if (Getattr(n, "sym:overloaded")) { Append(overloaded_name, Getattr(n, "sym:overname")); } return overloaded_name; } /* --------------------------------------------------------------------------- * D::createProxyName() * * Returns the D class name if a type corresponds to something wrapped with a * proxy class, NULL otherwise. * --------------------------------------------------------------------------- */ String *createProxyName(SwigType *t) { String *proxyname = NULL; Node *n = classLookup(t); if (n) { String *nspace = Getattr(n, "sym:nspace"); String *symname = Getattr(n, "sym:name"); String *module = createModuleName(nspace, symname); if (inProxyModule(module)) { proxyname = Copy(symname); } else { proxyname = NewStringf("%s%s.%s", package, module, symname); } } return proxyname; } String *makeParameterName(Node *n, Parm *p, int arg_num, bool setter) const { String *arg = Language::makeParameterName(n, p, arg_num, setter); if (split_proxy_dmodule && Strncmp(arg, package, Len(arg)) == 0) { // If we are in split proxy mode and the argument is named like the target // package, we append an underscore to its name to avoid clashes. Append(arg, "_"); } return arg; } /* --------------------------------------------------------------------------- * D::canThrow() * * Determines whether the code in the typemap can throw a D exception. * If so, note it for later when excodeSubstitute() is called. * --------------------------------------------------------------------------- */ void canThrow(Node *n, const String *typemap, Node *parameter) const { String *canthrow_attribute = NewStringf("tmap:%s:canthrow", typemap); String *canthrow = Getattr(parameter, canthrow_attribute); if (canthrow) Setattr(n, "d:canthrow", "1"); Delete(canthrow_attribute); } /* --------------------------------------------------------------------------- * D::wrapMemberFunctionAsDConst() * * Determines whether the member function represented by the passed node is * wrapped as D »const« or not. * --------------------------------------------------------------------------- */ bool wrapMemberFunctionAsDConst(Node *n) const { if (d_version == 1) return false; if (static_flag) return false; // Never emit »const« for static member functions. return GetFlag(n, "memberget") || SwigType_isconst(Getattr(n, "decl")); } /* --------------------------------------------------------------------------- * D::areAllOverloadsOverridden() * * Determines whether the class the passed function node belongs to overrides * all the overlaods for the passed function node defined somewhere up the * inheritance hierarchy. * --------------------------------------------------------------------------- */ bool areAllOverloadsOverridden(Node *n) const { List *base_list = Getattr(parentNode(n), "bases"); if (!base_list) { // If the class which contains n is not derived from any other class, // there cannot be any not-overridden overloads. return true; } // In case of multiple base classes, skip to the one which has not been // ignored. // RESEARCH: Also emit a warning in case of multiple inheritance here? Iterator it = First(base_list); while (it.item && GetFlag(it.item, "feature:ignore")) { it = Next(it); } Node *base_class = it.item; if (!base_class) { // If all base classes have been ignored, there cannot be one either. return true; } // We try to find at least a single overload which exists in the base class // so we can progress up the inheritance hierarchy even if there have been // new overloads introduced after the topmost class. Node *base_function = NULL; String *symname = Getattr(n, "sym:name"); if (symname) { for (Node *tmp = firstChild(base_class); tmp; tmp = nextSibling(tmp)) { String *child_symname = Getattr(tmp, "sym:name"); if (child_symname && (Strcmp(child_symname, symname) == 0)) { base_function = tmp; break; } } } if (!base_function) { // If there is no overload which also exists in the super class, there // cannot be any base class overloads not overridden. return true; } size_t base_overload_count = 0; for (Node *tmp = firstSibling(base_function); tmp; tmp = Getattr(tmp, "sym:nextSibling")) { if (is_protected(base_function) && !(Swig_director_mode() && Swig_director_protected_mode() && Swig_all_protected_mode())) { // If the base class function is »protected« and were are not in // director mode, it is not emitted to the base class and thus we do // not count it. Otherwise, we would run into issues if the visibility // of some functions was changed from protected to public in a child // class with the using directive. continue; } ++base_overload_count; } return ((base_overload_count <= overridingOverloadCount(n)) && areAllOverloadsOverridden(base_function)); } /* --------------------------------------------------------------------------- * D::overridingOverloadCount() * * Given a member function node, this function counts how many of the * overloads of the function (including itself) override a function in the * base class. * --------------------------------------------------------------------------- */ size_t overridingOverloadCount(Node *n) const { size_t result = 0; Node *tmp = firstSibling(n); do { // KLUDGE: We also have to count the function if the access attribute is // not present, since this means that it has been promoted into another // protection level in the base class with the C++ »using« directive, and // is thus taken into account when counting the base class overloads, even // if it is not marked as »override« by the SWIG parser. if (Getattr(n, "override") || !Getattr(n, "access")) { ++result; } } while((tmp = Getattr(tmp, "sym:nextSibling"))); return result; } /* --------------------------------------------------------------------------- * D::firstSibling() * * Returns the first sibling of the passed node. * --------------------------------------------------------------------------- */ Node *firstSibling(Node *n) const { Node *result = n; while (Node *tmp = Getattr(result, "sym:previousSibling")) { result = tmp; } return result; } /* --------------------------------------------------------------------------- * D::indentCode() * * Helper function to indent a code (string) by one level. * --------------------------------------------------------------------------- */ void indentCode(String* code) const { Replaceall(code, "\n", "\n "); Replaceall(code, " \n", "\n"); Chop(code); } /* --------------------------------------------------------------------------- * D::emitBanner() * --------------------------------------------------------------------------- */ void emitBanner(File *f) const { Printf(f, "/* ----------------------------------------------------------------------------\n"); Swig_banner_target_lang(f, " *"); Printf(f, " * ----------------------------------------------------------------------------- */\n\n"); } /* --------------------------------------------------------------------------- * D::outputDirectory() * * Returns the directory to write the D modules for the given namespace to and * and creates the subdirectory if it doesn't exist. * --------------------------------------------------------------------------- */ String *outputDirectory(String *nspace) { String *output_directory = Copy(dmodule_directory); if (nspace) { String *nspace_subdirectory = Copy(nspace); Replaceall(nspace_subdirectory, ".", SWIG_FILE_DELIMITER); String *newdir_error = Swig_new_subdirectory(output_directory, nspace_subdirectory); if (newdir_error) { Printf(stderr, "%s\n", newdir_error); Delete(newdir_error); SWIG_exit(EXIT_FAILURE); } Printv(output_directory, nspace_subdirectory, SWIG_FILE_DELIMITER, 0); Delete(nspace_subdirectory); } return output_directory; } /* --------------------------------------------------------------------------- * D::proxyCodeBuffer() * * Returns the buffer to write proxy code for the given namespace to. * --------------------------------------------------------------------------- */ String *proxyCodeBuffer(String *nspace) { if (!nspace) { return proxy_dmodule_code; } Hash *hash = Getattr(nspace_proxy_dmodules, nspace); if (!hash) { hash = NewHash(); Setattr(hash, "code", NewString("")); Setattr(hash, "imports", NewString("")); Setattr(nspace_proxy_dmodules, nspace, hash); } return Getattr(hash, "code"); } /* --------------------------------------------------------------------------- * D::proxyCodeBuffer() * * Returns the buffer to write imports for the proxy code for the given * namespace to. * --------------------------------------------------------------------------- */ String *proxyImportsBuffer(String *nspace) { if (!nspace) { return proxy_dmodule_imports; } Hash *hash = Getattr(nspace_proxy_dmodules, nspace); if (!hash) { hash = NewHash(); Setattr(hash, "code", NewString("")); Setattr(hash, "imports", NewString("")); Setattr(nspace_proxy_dmodules, nspace, hash); } return Getattr(hash, "imports"); } /* --------------------------------------------------------------------------- * D::createFirstNamespaceName() * * Returns a new string containing the name of the outermost namespace, e.g. * »A« for the argument »A.B.C«. * --------------------------------------------------------------------------- */ String *createFirstNamespaceName(const String *nspace) const { char *tmp = Char(nspace); char *c = tmp; char *co = 0; if (!strstr(c, ".")) return 0; co = c + Len(nspace); while (*c && (c != co)) { if (*c == '.') { break; } c++; } if (!*c || (c == tmp)) { return NULL; } return NewStringWithSize(tmp, (int)(c - tmp)); } /* --------------------------------------------------------------------------- * D::createLastNamespaceName() * * Returns a new string containing the name of the innermost namespace, e.g. * »C« for the argument »A.B.C«. * --------------------------------------------------------------------------- */ String *createLastNamespaceName(const String *nspace) const { if (!nspace) return NULL; char *c = Char(nspace); char *cc = c; if (!strstr(c, ".")) return NewString(nspace); while (*c) { if (*c == '.') { cc = c; } ++c; } return NewString(cc + 1); } /* --------------------------------------------------------------------------- * D::createOuterNamespaceNames() * * Returns a new string containing the name of the outer namespace, e.g. * »A.B« for the argument »A.B.C«. * --------------------------------------------------------------------------- */ String *createOuterNamespaceNames(const String *nspace) const { if (!nspace) return NULL; char *tmp = Char(nspace); char *c = tmp; char *cc = c; if (!strstr(c, ".")) return NULL; while (*c) { if (*c == '.') { cc = c; } ++c; } if (cc == tmp) { return NULL; } return NewStringWithSize(tmp, (int)(cc - tmp)); } }; static Language *new_swig_d() { return new D(); } /* ----------------------------------------------------------------------------- * swig_d() - Instantiate module * ----------------------------------------------------------------------------- */ extern "C" Language *swig_d(void) { return new_swig_d(); } /* ----------------------------------------------------------------------------- * Usage information displayed at the command line. * ----------------------------------------------------------------------------- */ const char *D::usage = "\ D Options (available with -d)\n\ -d2 - Generate code for D2/Phobos (default: D1/Tango)\n\ -package - Write generated D modules into package \n\ -splitproxy - Write each D type to a dedicated file instead of\n\ generating a single proxy D module.\n\ -wrapperlibrary - Set the name of the wrapper library to \n\ \n"; swig-4.0.1/Source/Modules/utils.cxx0000644000175000017500000001765613527063513017123 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * utils.cxx * * Various utility functions. * ----------------------------------------------------------------------------- */ #include int is_public(Node *n) { String *access = Getattr(n, "access"); return !access || !Cmp(access, "public"); } int is_private(Node *n) { String *access = Getattr(n, "access"); return access && !Cmp(access, "private"); } int is_protected(Node *n) { String *access = Getattr(n, "access"); return access && !Cmp(access, "protected"); } static int is_member_director_helper(Node *parentnode, Node *member) { int parent_nodirector = GetFlag(parentnode, "feature:nodirector"); if (parent_nodirector) return 0; int parent_director = Swig_director_mode() && GetFlag(parentnode, "feature:director"); int cdecl_director = parent_director || GetFlag(member, "feature:director"); int cdecl_nodirector = GetFlag(member, "feature:nodirector"); return cdecl_director && !cdecl_nodirector && !GetFlag(member, "feature:extend"); } int is_member_director(Node *parentnode, Node *member) { if (parentnode && checkAttribute(member, "storage", "virtual")) { return is_member_director_helper(parentnode, member); } else { return 0; } } int is_member_director(Node *member) { return is_member_director(Getattr(member, "parentNode"), member); } // Identifies the additional protected members that are generated when the allprotected option is used. // This does not include protected virtual methods as they are turned on with the dirprot option. int is_non_virtual_protected_access(Node *n) { int result = 0; if (Swig_director_mode() && Swig_director_protected_mode() && Swig_all_protected_mode() && is_protected(n) && !checkAttribute(n, "storage", "virtual")) { Node *parentNode = Getattr(n, "parentNode"); // When vtable is empty, the director class does not get emitted, so a check for an empty vtable should be done. // However, vtable is set in Language and so is not yet set when methods in Typepass call clean_overloaded() // which calls is_non_virtual_protected_access. So commented out below. // Moving the director vtable creation into Typepass should solve this problem. if (is_member_director_helper(parentNode, n) /* && Getattr(parentNode, "vtable")*/) result = 1; } return result; } /* Clean overloaded list. Removes templates, ignored, and errors */ void clean_overloaded(Node *n) { Node *nn = Getattr(n, "sym:overloaded"); Node *first = 0; while (nn) { String *ntype = nodeType(nn); if ((GetFlag(nn, "feature:ignore")) || (Getattr(nn, "error")) || (Strcmp(ntype, "template") == 0) || ((Strcmp(ntype, "cdecl") == 0) && is_protected(nn) && !is_member_director(nn) && !is_non_virtual_protected_access(n))) { /* Remove from overloaded list */ Node *ps = Getattr(nn, "sym:previousSibling"); Node *ns = Getattr(nn, "sym:nextSibling"); if (ps) { Setattr(ps, "sym:nextSibling", ns); } if (ns) { Setattr(ns, "sym:previousSibling", ps); } Delattr(nn, "sym:previousSibling"); Delattr(nn, "sym:nextSibling"); Delattr(nn, "sym:overloaded"); nn = ns; continue; } else { if (!first) first = nn; Setattr(nn, "sym:overloaded", first); } nn = Getattr(nn, "sym:nextSibling"); } if (!first || (first && !Getattr(first, "sym:nextSibling"))) { if (Getattr(n, "sym:overloaded")) Delattr(n, "sym:overloaded"); } } /* ----------------------------------------------------------------------------- * Swig_set_max_hash_expand() * * Controls how many Hash objects are displayed when displaying nested Hash objects. * Makes DohSetMaxHashExpand an externally callable function (for debugger). * ----------------------------------------------------------------------------- */ void Swig_set_max_hash_expand(int count) { SetMaxHashExpand(count); } extern "C" { /* ----------------------------------------------------------------------------- * Swig_get_max_hash_expand() * * Returns how many Hash objects are displayed when displaying nested Hash objects. * Makes DohGetMaxHashExpand an externally callable function (for debugger). * ----------------------------------------------------------------------------- */ int Swig_get_max_hash_expand() { return GetMaxHashExpand(); } /* ----------------------------------------------------------------------------- * Swig_to_doh_string() * * DOH version of Swig_to_string() * ----------------------------------------------------------------------------- */ static String *Swig_to_doh_string(DOH *object, int count) { int old_count = Swig_get_max_hash_expand(); if (count >= 0) Swig_set_max_hash_expand(count); String *debug_string = object ? NewStringf("%s", object) : NewString("NULL"); Swig_set_max_hash_expand(old_count); return debug_string; } /* ----------------------------------------------------------------------------- * Swig_to_doh_string_with_location() * * DOH version of Swig_to_string_with_location() * ----------------------------------------------------------------------------- */ static String *Swig_to_doh_string_with_location(DOH *object, int count) { int old_count = Swig_get_max_hash_expand(); if (count >= 0) Swig_set_max_hash_expand(count); String *debug_string = Swig_stringify_with_location(object); Swig_set_max_hash_expand(old_count); return debug_string; } /* ----------------------------------------------------------------------------- * Swig_to_string() * * Swig debug - return C string representation of any DOH type. * Nested Hash types expand count is value of Swig_get_max_hash_expand when count<0 * Note: leaks memory. * ----------------------------------------------------------------------------- */ const char *Swig_to_string(DOH *object, int count) { return Char(Swig_to_doh_string(object, count)); } /* ----------------------------------------------------------------------------- * Swig_to_string_with_location() * * Swig debug - return C string representation of any DOH type, within [] brackets * for Hash and List types, prefixed by line and file information. * Nested Hash types expand count is value of Swig_get_max_hash_expand when count<0 * Note: leaks memory. * ----------------------------------------------------------------------------- */ const char *Swig_to_string_with_location(DOH *object, int count) { return Char(Swig_to_doh_string_with_location(object, count)); } /* ----------------------------------------------------------------------------- * Swig_print() * * Swig debug - display string representation of any DOH type. * Nested Hash types expand count is value of Swig_get_max_hash_expand when count<0 * ----------------------------------------------------------------------------- */ void Swig_print(DOH *object, int count) { String *output = Swig_to_doh_string(object, count); Printf(stdout, "%s\n", output); Delete(output); } /* ----------------------------------------------------------------------------- * Swig_to_string_with_location() * * Swig debug - display string representation of any DOH type, within [] brackets * for Hash and List types, prefixed by line and file information. * Nested Hash types expand count is value of Swig_get_max_hash_expand when count<0 * ----------------------------------------------------------------------------- */ void Swig_print_with_location(DOH *object, int count) { String *output = Swig_to_doh_string_with_location(object, count); Printf(stdout, "%s\n", output); Delete(output); } } // extern "C" swig-4.0.1/Source/Modules/lua.cxx0000644000175000017500000025356013527063513016540 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * lua.cxx * * Lua language module for SWIG. * ----------------------------------------------------------------------------- */ /* NEW LANGUAGE NOTE: * ver001 this is simply a copy of tcl8.cxx, which has been renamed * ver002 all non essential code commented out, program now does virtually nothing it prints to stderr the list of functions to wrap, but does not create the XXX_wrap.c file * ver003 added back top(), still prints the list of fns to stderr but now creates a rather empty XXX_wrap.c with some basic boilerplate code * ver004 very basic version of functionWrapper() also uncommented usage_string() to keep compiler happy this will start producing proper looking code soon (I hope) produced the wrapper code, but without any type conversion (in or out) generates a few warning because of no wrappering does not generate SWIG_init() reason for this is that lua.swg is empty we will need to add code into this to make it work * ver005/6 massive rework, basing work on the pike module instead of tcl (pike module it only 1/3 of the size)(though not as complete) * ver007 added simple type checking * ver008 INPUT, OUTPUT, INOUT typemaps handled (though not all types yet) * ver009 class support: ok for basic types, but methods still TDB (code is VERY messed up & needs to be cleaned) * ver010 Added support for embedded Lua. Try swig -lua -help for more information */ #include "swigmod.h" #include "cparse.h" /**** Diagnostics: With the #define REPORT(), you can change the amount of diagnostics given This helps me search the parse tree & figure out what is going on inside SWIG (because its not clear or documented) */ #define REPORT(T,D) // no info: //#define REPORT(T,D) {Printf(stdout,T"\n");} // only title //#define REPORT(T,D) {Printf(stdout,T" %p\n",n);} // title & pointer //#define REPORT(T,D) {Printf(stdout,T"\n");display_mapping(D);} // the works //#define REPORT(T,D) {Printf(stdout,T"\n");if(D)Swig_print_node(D);} // the works void display_mapping(DOH *d) { if (d == 0 || !DohIsMapping(d)) return; for (Iterator it = First(d); it.item; it = Next(it)) { if (DohIsString(it.item)) Printf(stdout, " %s = %s\n", it.key, it.item); else if (DohIsMapping(it.item)) Printf(stdout, " %s = \n", it.key); else if (DohIsSequence(it.item)) Printf(stdout, " %s = \n", it.key); else Printf(stdout, " %s = \n", it.key); } } extern "C" { static int compareByLen(const DOH *f, const DOH *s) { return Len(s) - Len(f); } } /* NEW LANGUAGE NOTE:*********************************************** most of the default options are handled by SWIG you can add new ones here (though for now I have not bothered) NEW LANGUAGE NOTE:END ************************************************/ static const char *usage = "\ Lua Options (available with -lua)\n\ -elua - Generates LTR compatible wrappers for smaller devices running elua\n\ -eluac - LTR compatible wrappers in \"crass compress\" mode for elua\n\ -elua-emulate - Emulates behaviour of eLua. Useful only for testing.\n\ Incompatible with -elua/-eluac options.\n\ -nomoduleglobal - Do not register the module name as a global variable \n\ but return the module table from calls to require.\n\ -no-old-metatable-bindings\n\ - Disable support for old-style bindings name generation, some\n\ old-style members scheme etc.\n\ -squash-bases - Squashes symbols from all inheritance tree of a given class\n\ into itself. Emulates pre-SWIG3.0 inheritance. Insignificantly\n\ speeds things up, but increases memory consumption.\n\ \n"; static int nomoduleglobal = 0; static int elua_ltr = 0; static int eluac_ltr = 0; static int elua_emulate = 0; static int squash_bases = 0; /* The new metatable bindings were introduced in SWIG 3.0.0. * old_metatable_bindings in v2: * 1. static methods will be put into the scope their respective class * belongs to as well as into the class scope itself. (only for classes without %nspace given) * 2. The layout in elua mode is somewhat different */ static int old_metatable_bindings = 1; static int old_compatible_names = 1; // This flag can temporarily disable backward compatible names generation if old_metatable_bindings is enabled /* NEW LANGUAGE NOTE:*********************************************** To add a new language, you need to derive your class from Language and the overload various virtual functions (more on this as I figure it out) NEW LANGUAGE NOTE:END ************************************************/ class LUA:public Language { private: File *f_begin; File *f_runtime; File *f_header; File *f_wrappers; File *f_init; File *f_initbeforefunc; String *s_luacode; // luacode to be called during init String *module; //name of the module // Parameters for current class. NIL if not parsing class int have_constructor; int have_destructor; String *destructor_action; // This variable holds the name of the current class in Lua. Usually it is // the same as C++ class name, but rename directives can change it. String *proxy_class_name; // This is a so called fully qualified symname - the above proxy class name // prepended with class namespace. If class Lua name is the same as class C++ name, // then it is basically C++ fully qualified name with colons replaced with dots. String *full_proxy_class_name; // All static methods and/or variables are treated as if they were in the // special C++ namespace $(classname).SwigStatic. This is internal mechanism only // and is not visible to user in any manner. This variable holds the name // of such pseudo-namespace a.k.a the result of above expression evaluation String *class_static_nspace; // This variable holds the name of generated C function that acts as a constructor // for the currently parsed class. String *constructor_name; // Many wrappers forward calls to each other, for example staticmembervariableHandler // forwards calls to variableHandler, which, in turn, makes to call to functionWrapper. // In order to access information about whether it is a static member of class or just // a plain old variable, the current array is kept and used as a 'log' of the call stack. enum TState { NO_CPP, VARIABLE, GLOBAL_FUNC, GLOBAL_VAR, MEMBER_FUNC, CONSTRUCTOR, DESTRUCTOR, MEMBER_VAR, STATIC_FUNC, STATIC_VAR, STATIC_CONST, // enums and things like static const int x = 5; ENUM_CONST, // This is only needed for backward compatibility in C mode STATES_COUNT }; bool current[STATES_COUNT]; public: /* --------------------------------------------------------------------- * LUA() * * Initialize member data * --------------------------------------------------------------------- */ LUA(): f_begin(0), f_runtime(0), f_header(0), f_wrappers(0), f_init(0), f_initbeforefunc(0), s_luacode(0), module(0), have_constructor(0), have_destructor(0), destructor_action(0), proxy_class_name(0), full_proxy_class_name(0), class_static_nspace(0), constructor_name(0) { for (int i = 0; i < STATES_COUNT; i++) current[i] = false; } /* NEW LANGUAGE NOTE:*********************************************** This is called to initialise the system & read any command line args most of this is boilerplate code, except the command line args which depends upon what args your code supports NEW LANGUAGE NOTE:END *********************************************** */ /* --------------------------------------------------------------------- * main() * * Parse command line options and initializes variables. * --------------------------------------------------------------------- */ virtual void main(int argc, char *argv[]) { /* Set location of SWIG library */ SWIG_library_directory("lua"); /* Look for certain command line options */ for (int i = 1; i < argc; i++) { if (argv[i]) { if (strcmp(argv[i], "-help") == 0) { // usage flags fputs(usage, stdout); } else if (strcmp(argv[i], "-nomoduleglobal") == 0) { nomoduleglobal = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-elua") == 0) { elua_ltr = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-eluac") == 0) { eluac_ltr = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-no-old-metatable-bindings") == 0) { Swig_mark_arg(i); old_metatable_bindings = 0; } else if (strcmp(argv[i], "-squash-bases") == 0) { Swig_mark_arg(i); squash_bases = 1; } else if (strcmp(argv[i], "-elua-emulate") == 0) { Swig_mark_arg(i); elua_emulate = 1; } } } if (elua_emulate && (eluac_ltr || elua_ltr )) { Printf(stderr, "Cannot have -elua-emulate with either -eluac or -elua\n"); Swig_arg_error(); } // Set elua_ltr if elua_emulate is requested if(elua_emulate) elua_ltr = 1; /* NEW LANGUAGE NOTE:*********************************************** This is the boilerplate code, setting a few #defines and which lib directory to use the SWIG_library_directory() is also boilerplate code but it always seems to be the first line of code NEW LANGUAGE NOTE:END *********************************************** */ /* Add a symbol to the parser for conditional compilation */ Preprocessor_define("SWIGLUA 1", 0); /* Set language-specific configuration file */ SWIG_config_file("lua.swg"); /* Set typemap language */ SWIG_typemap_lang("lua"); /* Enable overloaded methods support */ allow_overloading(); } /* NEW LANGUAGE NOTE:*********************************************** After calling main, SWIG parses the code to wrap (I believe) then calls top() in this is more boilerplate code to set everything up and a call to Language::top() which begins the code generations by calling the member fns after all that is more boilerplate code to close all down (overall there is virtually nothing here that needs to be edited just use as is) NEW LANGUAGE NOTE:END *********************************************** */ /* --------------------------------------------------------------------- * top() * --------------------------------------------------------------------- */ virtual int top(Node *n) { /* Get the module name */ module = Getattr(n, "name"); /* Get the output file name */ String *outfile = Getattr(n, "outfile"); /* Open the output file */ f_begin = NewFile(outfile, "w", SWIG_output_files()); if (!f_begin) { FileErrorDisplay(outfile); SWIG_exit(EXIT_FAILURE); } f_runtime = NewString(""); f_init = NewString(""); f_header = NewString(""); f_wrappers = NewString(""); f_initbeforefunc = NewString(""); /* Register file targets with the SWIG file handler */ Swig_register_filebyname("header", f_header); Swig_register_filebyname("wrapper", f_wrappers); Swig_register_filebyname("begin", f_begin); Swig_register_filebyname("runtime", f_runtime); Swig_register_filebyname("init", f_init); Swig_register_filebyname("initbeforefunc", f_initbeforefunc); s_luacode = NewString(""); Swig_register_filebyname("luacode", s_luacode); current[NO_CPP] = true; /* Standard stuff for the SWIG runtime section */ Swig_banner(f_begin); Printf(f_runtime, "\n\n#ifndef SWIGLUA\n#define SWIGLUA\n#endif\n\n"); emitLuaFlavor(f_runtime); if (nomoduleglobal) { Printf(f_runtime, "#define SWIG_LUA_NO_MODULE_GLOBAL\n"); } else { Printf(f_runtime, "#define SWIG_LUA_MODULE_GLOBAL\n"); } if (squash_bases) Printf(f_runtime, "#define SWIG_LUA_SQUASH_BASES\n"); // if (NoInclude) { // Printf(f_runtime, "#define SWIG_NOINCLUDE\n"); // } Printf(f_runtime, "\n"); //String *init_name = NewStringf("%(title)s_Init", module); //Printf(f_header, "#define SWIG_init %s\n", init_name); //Printf(f_header, "#define SWIG_name \"%s\"\n", module); /* SWIG_import is a special function name for importing within Lua5.1 */ //Printf(f_header, "#define SWIG_import luaopen_%s\n\n", module); Printf(f_header, "#define SWIG_name \"%s\"\n", module); Printf(f_header, "#define SWIG_init luaopen_%s\n", module); Printf(f_header, "#define SWIG_init_user luaopen_%s_user\n\n", module); Printf(f_header, "#define SWIG_LUACODE luaopen_%s_luacode\n", module); Printf(f_wrappers, "#ifdef __cplusplus\nextern \"C\" {\n#endif\n"); /* %init code inclusion, effectively in the SWIG_init function */ Printf(f_init, "void SWIG_init_user(lua_State* L)\n{\n"); Language::top(n); Printf(f_init, "/* exec Lua code if applicable */\nSWIG_Lua_dostring(L,SWIG_LUACODE);\n"); Printf(f_init, "}\n"); // Done. Close up the module & write to the wrappers closeNamespaces(f_wrappers); Printf(f_wrappers, "#ifdef __cplusplus\n}\n#endif\n"); SwigType_emit_type_table(f_runtime, f_wrappers); /* NEW LANGUAGE NOTE:*********************************************** this basically combines several of the strings together and then writes it all to a file NEW LANGUAGE NOTE:END *********************************************** */ Dump(f_runtime, f_begin); Dump(f_header, f_begin); Dump(f_wrappers, f_begin); Dump(f_initbeforefunc, f_begin); /* for the Lua code it needs to be properly escaped to be added into the C/C++ code */ escapeCode(s_luacode); Printf(f_begin, "const char* SWIG_LUACODE=\n \"%s\";\n\n", s_luacode); Wrapper_pretty_print(f_init, f_begin); /* Close all of the files */ Delete(s_luacode); Delete(f_header); Delete(f_wrappers); Delete(f_init); Delete(f_initbeforefunc); Delete(f_runtime); Delete(f_begin); /* Done */ return SWIG_OK; } /* ------------------------------------------------------------ * importDirective() * ------------------------------------------------------------ */ virtual int importDirective(Node *n) { return Language::importDirective(n); } /* ------------------------------------------------------------ * cDeclaration() * It copies sym:name to lua:name to preserve its original value * ------------------------------------------------------------ */ virtual int cDeclaration(Node *n) { // class 'Language' is messing with symname in a really heavy way. // Although documentation states that sym:name is a name in // the target language space, it is not true. sym:name and // its derivatives are used in various places, including // behind-the-scene C code generation. The best way is not to // touch it at all. // But we need to know what was the name of function/variable // etc that user desired, that's why we store correct symname // as lua:name String *symname = Getattr(n, "sym:name"); if (symname) Setattr(n, "lua:name", symname); return Language::cDeclaration(n); } virtual int constructorDeclaration(Node *n) { Setattr(n, "lua:name", Getattr(n, "sym:name")); return Language::constructorDeclaration(n); } virtual int destructorDeclaration(Node *n) { Setattr(n, "lua:name", Getattr(n, "sym:name")); return Language::destructorDeclaration(n); } /* NEW LANGUAGE NOTE:*********************************************** This is it! you get this one right, and most of your work is done but its going to take some file to get it working right quite a bit of this is generally boilerplate code (or stuff I don't understand) that which matters will have extra added comments NEW LANGUAGE NOTE:END *********************************************** */ /* --------------------------------------------------------------------- * functionWrapper() * * Create a function declaration and register it with the interpreter. * --------------------------------------------------------------------- */ /* ----------------------------------------------------------------------- * registerMethod() * * Determines wrap name of a method, its scope etc and calls * registerMethod overload with correct arguments * Overloaded variant adds method to the "methods" array of specified lua scope/class * ---------------------------------------------------------------------- */ void registerMethod(Node *n, bool overwrite = false, String *overwriteLuaScope = 0) { String *symname = Getattr(n, "sym:name"); assert(symname); if (Getattr(n, "sym:nextSibling")) return; // Lua scope. It is not symbol NSpace, it is the actual key to retrieve getCArraysHash. String *luaScope = luaCurrentSymbolNSpace(); if (overwrite) luaScope = overwriteLuaScope; String *wrapname = 0; String *mrename; if (current[NO_CPP] || !getCurrentClass()) { mrename = symname; } else { assert(!current[NO_CPP]); if (current[STATIC_FUNC] || current[MEMBER_FUNC]) { mrename = Swig_name_member(getNSpace(), getClassPrefix(), symname); } else { mrename = symname; } } wrapname = Swig_name_wrapper(mrename); registerMethod(n, wrapname, luaScope); } /* ----------------------------------------------------------------------- * registerMethod() * * Add method to the "methods" C array of given namespace/class * ---------------------------------------------------------------------- */ void registerMethod(Node *n, String* wname, String *luaScope) { assert(n); Hash *nspaceHash = getCArraysHash(luaScope); String *s_ns_methods_tab = Getattr(nspaceHash, "methods"); String *lua_name = Getattr(n, "lua:name"); if (elua_ltr || eluac_ltr) Printv(s_ns_methods_tab, tab4, "{LSTRKEY(\"", lua_name, "\")", ", LFUNCVAL(", wname, ")", "},\n", NIL); else Printv(s_ns_methods_tab, tab4, "{ \"", lua_name, "\", ", wname, "},\n", NIL); // Add to the metatable if method starts with '__' const char * tn = Char(lua_name); if (tn[0]=='_' && tn[1] == '_' && !eluac_ltr) { String *metatable_tab = Getattr(nspaceHash, "metatable"); assert(metatable_tab); if (elua_ltr) Printv(metatable_tab, tab4, "{LSTRKEY(\"", lua_name, "\")", ", LFUNCVAL(", wname, ")", "},\n", NIL); else Printv(metatable_tab, tab4, "{ \"", lua_name, "\", ", wname, "},\n", NIL); } } virtual int functionWrapper(Node *n) { REPORT("functionWrapper", n); String *name = Getattr(n, "name"); String *iname = Getattr(n, "sym:name"); String *lua_name = Getattr(n, "lua:name"); assert(lua_name); SwigType *d = Getattr(n, "type"); ParmList *l = Getattr(n, "parms"); Parm *p; String *tm; int i; //Printf(stdout,"functionWrapper %s %s %d\n",name,iname,current); String *overname = 0; if (Getattr(n, "sym:overloaded")) { overname = Getattr(n, "sym:overname"); } else { if (!luaAddSymbol(lua_name, n)) { return SWIG_ERROR; } } /* NEW LANGUAGE NOTE:*********************************************** the wrapper object holds all the wrapper code we need to add a couple of local variables NEW LANGUAGE NOTE:END *********************************************** */ Wrapper *f = NewWrapper(); Wrapper_add_local(f, "SWIG_arg", "int SWIG_arg = 0"); String *wname = Swig_name_wrapper(iname); if (overname) { Append(wname, overname); } if (current[CONSTRUCTOR]) { if (constructor_name != 0) Delete(constructor_name); constructor_name = Copy(wname); } /* NEW LANGUAGE NOTE:*********************************************** the format of a lua fn is: static int wrap_XXX(lua_State* L){...} this line adds this into the wrapper code NEW LANGUAGE NOTE:END *********************************************** */ Printv(f->def, "static int ", wname, "(lua_State* L) {", NIL); /* NEW LANGUAGE NOTE:*********************************************** this prints the list of args, eg for a C fn int gcd(int x,int y); it will print int arg1; int arg2; NEW LANGUAGE NOTE:END *********************************************** */ /* Write code to extract function parameters. */ emit_parameter_variables(l, f); /* Attach the standard typemaps */ emit_attach_parmmaps(l, f); Setattr(n, "wrap:parms", l); /* Get number of required and total arguments */ int num_arguments = emit_num_arguments(l); int num_required = emit_num_required(l); int varargs = emit_isvarargs(l); // Check if we have to ignore arguments that are passed by LUA. // Needed for unary minus, where lua passes two arguments and // we have to ignore the second. int args_to_ignore = 0; if (Getattr(n, "lua:ignore_args")) { args_to_ignore = GetInt(n, "lua:ignore_args"); } /* NEW LANGUAGE NOTE:*********************************************** from here on in, it gets rather hairy this is the code to convert from the scripting language to C/C++ some of the stuff will refer to the typemaps code written in your swig file (lua.swg), and some is done in the code here I suppose you could do all the conversion in C, but it would be a nightmare to do NEW LANGUAGE NOTE:END *********************************************** */ /* Generate code for argument marshalling */ // String *description = NewString(""); /* NEW LANGUAGE NOTE:*********************************************** argument_check is a new feature I added to check types of arguments: eg for int gcd(int,int) I want to check that arg1 & arg2 really are integers NEW LANGUAGE NOTE:END *********************************************** */ String *argument_check = NewString(""); String *argument_parse = NewString(""); String *checkfn = NULL; char source[64]; Printf(argument_check, "SWIG_check_num_args(\"%s\",%d,%d)\n", Swig_name_str(n), num_required + args_to_ignore, num_arguments + args_to_ignore); for (i = 0, p = l; i < num_arguments; i++) { while (checkAttribute(p, "tmap:in:numinputs", "0")) { p = Getattr(p, "tmap:in:next"); } SwigType *pt = Getattr(p, "type"); String *ln = Getattr(p, "lname"); /* Look for an input typemap */ sprintf(source, "%d", i + 1); if ((tm = Getattr(p, "tmap:in"))) { Replaceall(tm, "$source", source); Replaceall(tm, "$target", ln); Replaceall(tm, "$input", source); Setattr(p, "emit:input", source); if (Getattr(p, "wrap:disown") || (Getattr(p, "tmap:in:disown"))) { Replaceall(tm, "$disown", "SWIG_POINTER_DISOWN"); } else { Replaceall(tm, "$disown", "0"); } /* NEW LANGUAGE NOTE:*********************************************** look for a 'checkfn' typemap this an additional parameter added to the in typemap if found the type will be tested for this will result in code either in the argument_check or argument_parse string NEW LANGUAGE NOTE:END *********************************************** */ if ((checkfn = Getattr(p, "tmap:in:checkfn"))) { if (i < num_required) { Printf(argument_check, "if(!%s(L,%s))", checkfn, source); } else { Printf(argument_check, "if(lua_gettop(L)>=%s && !%s(L,%s))", source, checkfn, source); } Printf(argument_check, " SWIG_fail_arg(\"%s\",%s,\"%s\");\n", Swig_name_str(n), source, SwigType_str(pt, 0)); } /* NEW LANGUAGE NOTE:*********************************************** lua states the number of arguments passed to a function using the fn lua_gettop() we can use this to deal with default arguments NEW LANGUAGE NOTE:END *********************************************** */ if (i < num_required) { Printf(argument_parse, "%s\n", tm); } else { Printf(argument_parse, "if(lua_gettop(L)>=%s){%s}\n", source, tm); } p = Getattr(p, "tmap:in:next"); continue; } else { /* NEW LANGUAGE NOTE:*********************************************** // why is this code not called when I don't have a typemap? // instead of giving a warning, no code is generated NEW LANGUAGE NOTE:END *********************************************** */ Swig_warning(WARN_TYPEMAP_IN_UNDEF, input_file, line_number, "Unable to use type %s as a function argument.\n", SwigType_str(pt, 0)); break; } } // add all argcheck code Printv(f->code, argument_check, argument_parse, NIL); /* Check for trailing varargs */ if (varargs) { if (p && (tm = Getattr(p, "tmap:in"))) { Replaceall(tm, "$input", "varargs"); Printv(f->code, tm, "\n", NIL); } } /* Insert constraint checking code */ for (p = l; p;) { if ((tm = Getattr(p, "tmap:check"))) { Replaceall(tm, "$target", Getattr(p, "lname")); Printv(f->code, tm, "\n", NIL); p = Getattr(p, "tmap:check:next"); } else { p = nextSibling(p); } } /* Insert cleanup code */ String *cleanup = NewString(""); for (p = l; p;) { if ((tm = Getattr(p, "tmap:freearg"))) { Replaceall(tm, "$source", Getattr(p, "lname")); Printv(cleanup, tm, "\n", NIL); p = Getattr(p, "tmap:freearg:next"); } else { p = nextSibling(p); } } /* Insert argument output code */ String *outarg = NewString(""); for (p = l; p;) { if ((tm = Getattr(p, "tmap:argout"))) { // // managing the number of returning variables // if (numoutputs=Getattr(p,"tmap:argout:numoutputs")){ // int i=GetInt(p,"tmap:argout:numoutputs"); // printf("got argout:numoutputs of %d\n",i); // returnval+=GetInt(p,"tmap:argout:numoutputs"); // } // else returnval++; Replaceall(tm, "$source", Getattr(p, "lname")); Replaceall(tm, "$target", Swig_cresult_name()); Replaceall(tm, "$arg", Getattr(p, "emit:input")); Replaceall(tm, "$input", Getattr(p, "emit:input")); Printv(outarg, tm, "\n", NIL); p = Getattr(p, "tmap:argout:next"); } else { p = nextSibling(p); } } // Remember C name of the wrapping function Setattr(n, "wrap:name", wname); /* Emit the function call */ String *actioncode = emit_action(n); /* NEW LANGUAGE NOTE:*********************************************** FIXME: returns 1 if there is a void return type this is because there is a typemap for void NEW LANGUAGE NOTE:END *********************************************** */ // Return value if necessary if ((tm = Swig_typemap_lookup_out("out", n, Swig_cresult_name(), f, actioncode))) { // managing the number of returning variables // if (numoutputs=Getattr(tm,"numoutputs")){ // int i=GetInt(tm,"numoutputs"); // printf("return numoutputs %d\n",i); // returnval+=GetInt(tm,"numoutputs"); // } // else returnval++; Replaceall(tm, "$source", Swig_cresult_name()); if (GetFlag(n, "feature:new")) { Replaceall(tm, "$owner", "1"); } else { Replaceall(tm, "$owner", "0"); } Printf(f->code, "%s\n", tm); // returnval++; } else { Swig_warning(WARN_TYPEMAP_OUT_UNDEF, input_file, line_number, "Unable to use return type %s in function %s.\n", SwigType_str(d, 0), name); } emit_return_variable(n, d, f); /* Output argument output code */ Printv(f->code, outarg, NIL); /* Output cleanup code */ Printv(f->code, cleanup, NIL); /* Look to see if there is any newfree cleanup code */ if (GetFlag(n, "feature:new")) { if ((tm = Swig_typemap_lookup("newfree", n, Swig_cresult_name(), 0))) { Replaceall(tm, "$source", Swig_cresult_name()); Printf(f->code, "%s\n", tm); } } /* See if there is any return cleanup code */ if ((tm = Swig_typemap_lookup("ret", n, Swig_cresult_name(), 0))) { Replaceall(tm, "$source", Swig_cresult_name()); Printf(f->code, "%s\n", tm); } /* Close the function */ Printv(f->code, "return SWIG_arg;\n", NIL); // add the failure cleanup code: Printv(f->code, "\nif(0) SWIG_fail;\n", NIL); Printv(f->code, "\nfail:\n", NIL); Printv(f->code, "$cleanup", "lua_error(L);\n", NIL); Printv(f->code, "return SWIG_arg;\n", NIL); Printf(f->code, "}\n"); /* Substitute the cleanup code */ Replaceall(f->code, "$cleanup", cleanup); /* Substitute the function name */ Replaceall(f->code, "$symname", iname); Replaceall(f->code, "$result", Swig_cresult_name()); /* Dump the function out */ /* in Lua we will not emit the destructor as a wrapper function, Lua will automatically call the destructor when the object is free'd However: you cannot just skip this function as it will not emit any custom destructor (using %extend), as you need to call emit_action() Therefore we go though the whole function, but do not write the code into the wrapper */ if (!current[DESTRUCTOR]) { Wrapper_print(f, f_wrappers); } /* NEW LANGUAGE NOTE:*********************************************** register the function in SWIG different language mappings seem to use different ideas NEW LANGUAGE NOTE:END *********************************************** */ /* Now register the function with the interpreter. */ int result = SWIG_OK; if (Getattr(n, "sym:overloaded")) { if (!Getattr(n, "sym:nextSibling")) { result = dispatchFunction(n); } } Delete(argument_check); Delete(argument_parse); Delete(cleanup); Delete(outarg); // Delete(description); DelWrapper(f); return result; } /* ------------------------------------------------------------ * dispatchFunction() * * Emit overloading dispatch function * ------------------------------------------------------------ */ /* NEW LANGUAGE NOTE:*********************************************** This is an extra function used for overloading of functions it checks the args & then calls the relevant fn most of the real work in again typemaps: look for %typecheck(SWIG_TYPECHECK_*) in the .swg file NEW LANGUAGE NOTE:END *********************************************** */ int dispatchFunction(Node *n) { //REPORT("dispatchFunction", n); /* Last node in overloaded chain */ int maxargs; String *tmp = NewString(""); String *dispatch = Swig_overload_dispatch(n, "return %s(L);", &maxargs); /* Generate a dispatch wrapper for all overloaded functions */ Wrapper *f = NewWrapper(); String *symname = Getattr(n, "sym:name"); String *lua_name = Getattr(n, "lua:name"); assert(lua_name); String *wname = Swig_name_wrapper(symname); //Printf(stdout,"Swig_overload_dispatch %s %s '%s' %d\n",symname,wname,dispatch,maxargs); if (!luaAddSymbol(lua_name, n)) { DelWrapper(f); Delete(dispatch); Delete(tmp); return SWIG_ERROR; } Printv(f->def, "static int ", wname, "(lua_State* L) {", NIL); Wrapper_add_local(f, "argc", "int argc"); Printf(tmp, "int argv[%d]={1", maxargs + 1); for (int i = 1; i <= maxargs; i++) { Printf(tmp, ",%d", i + 1); } Printf(tmp, "}"); Wrapper_add_local(f, "argv", tmp); Printf(f->code, "argc = lua_gettop(L);\n"); Replaceall(dispatch, "$args", "self,args"); Printv(f->code, dispatch, "\n", NIL); Node *sibl = n; while (Getattr(sibl, "sym:previousSibling")) sibl = Getattr(sibl, "sym:previousSibling"); // go all the way up String *protoTypes = NewString(""); do { String *fulldecl = Swig_name_decl(sibl); Printf(protoTypes, "\n\" %s\\n\"", fulldecl); Delete(fulldecl); } while ((sibl = Getattr(sibl, "sym:nextSibling"))); Printf(f->code, "SWIG_Lua_pusherrstring(L,\"Wrong arguments for overloaded function '%s'\\n\"\n" "\" Possible C/C++ prototypes are:\\n\"%s);\n", symname, protoTypes); Delete(protoTypes); Printf(f->code, "lua_error(L);return 0;\n"); Printv(f->code, "}\n", NIL); Wrapper_print(f, f_wrappers); // Remember C name of the wrapping function Setattr(n, "wrap:name", wname); if (current[CONSTRUCTOR]) { if (constructor_name != 0) Delete(constructor_name); constructor_name = Copy(wname); } DelWrapper(f); Delete(dispatch); Delete(tmp); return SWIG_OK; } /* ------------------------------------------------------------ * Add variable to "attributes" C arrays of given namespace or class. * Input is node. Based on the state of "current" array it determines * the name of the getter function, setter function etc and calls * registerVariable overload with necessary params. * Lua scope could be overwritten. (Used only for backward compatibility) * ------------------------------------------------------------ */ void registerVariable(Node *n, bool overwrite = false, String *overwriteLuaScope = 0) { int assignable = is_assignable(n); String *symname = Getattr(n, "sym:name"); assert(symname); // Lua scope. It is not symbol NSpace, it is the actual key to retrieve getCArraysHash. String *luaScope = luaCurrentSymbolNSpace(); if (overwrite) luaScope = overwriteLuaScope; // Getter and setter String *getName = 0; String *setName = 0; String *mrename = 0; if (current[NO_CPP] || !getCurrentClass()) { // Global variable getName = Swig_name_get(getNSpace(), symname); if (assignable) setName = Swig_name_set(getNSpace(), symname); } else { assert(!current[NO_CPP]); if (current[STATIC_VAR] ) { mrename = Swig_name_member(getNSpace(), getClassPrefix(), symname); getName = Swig_name_get(0, mrename); if (assignable) setName = Swig_name_set(0, mrename); } else if (current[MEMBER_VAR]) { mrename = Swig_name_member(0, getClassPrefix(), symname); getName = Swig_name_get(getNSpace(), mrename); if (assignable) setName = Swig_name_set(getNSpace(), mrename); } else { assert(false); } } getName = Swig_name_wrapper(getName); if (setName) setName = Swig_name_wrapper(setName); registerVariable(luaScope, n, getName, setName); } /* ------------------------------------------------------------ * registerVariable() * * Add variable to the "attributes" (or "get"/"set" in * case of elua_ltr) C arrays of given namespace or class * ------------------------------------------------------------ */ void registerVariable(String *lua_nspace_or_class_name, Node *n, String *getName, String *setName) { String *unassignable = NewString("SWIG_Lua_set_immutable"); if (setName == 0 || GetFlag(n, "feature:immutable")) { setName = unassignable; } Hash *nspaceHash = getCArraysHash(lua_nspace_or_class_name); String *s_ns_methods_tab = Getattr(nspaceHash, "methods"); String *s_ns_var_tab = Getattr(nspaceHash, "attributes"); String *lua_name = Getattr(n, "lua:name"); if (elua_ltr) { String *s_ns_dot_get = Getattr(nspaceHash, "get"); String *s_ns_dot_set = Getattr(nspaceHash, "set"); Printf(s_ns_dot_get, "%s{LSTRKEY(\"%s\"), LFUNCVAL(%s)},\n", tab4, lua_name, getName); Printf(s_ns_dot_set, "%s{LSTRKEY(\"%s\"), LFUNCVAL(%s)},\n", tab4, lua_name, setName); } else if (eluac_ltr) { Printv(s_ns_methods_tab, tab4, "{LSTRKEY(\"", lua_name, "_get", "\")", ", LFUNCVAL(", getName, ")", "},\n", NIL); Printv(s_ns_methods_tab, tab4, "{LSTRKEY(\"", lua_name, "_set", "\")", ", LFUNCVAL(", setName, ")", "},\n", NIL); } else { Printf(s_ns_var_tab, "%s{ \"%s\", %s, %s },\n", tab4, lua_name, getName, setName); } } /* ------------------------------------------------------------ * variableWrapper() * ------------------------------------------------------------ */ virtual int variableWrapper(Node *n) { /* NEW LANGUAGE NOTE:*********************************************** Language::variableWrapper(n) will generate two wrapper fns Foo_get & Foo_set by calling functionWrapper() so we will just add these into the variable lists ideally we should not have registered these as functions, only WRT this variable will look into this later. NEW LANGUAGE NOTE:END *********************************************** */ // REPORT("variableWrapper", n); String *lua_name = Getattr(n, "lua:name"); assert(lua_name); current[VARIABLE] = true; // let SWIG generate the wrappers int result = Language::variableWrapper(n); // It is impossible to use registerVariable, because sym:name of the Node is currently // in an undefined state - the callees of this function may have modified it. // registerVariable should be used from respective callees.* current[VARIABLE] = false; return result; } /* ------------------------------------------------------------ * Add constant to appropriate C array. constantRecord is an array record. * Actually, in current implementation it is resolved consttab typemap * ------------------------------------------------------------ */ void registerConstant(String *nspace, String *constantRecord) { Hash *nspaceHash = getCArraysHash(nspace); String *s_const_tab = 0; if (eluac_ltr || elua_ltr) // In elua everything goes to "methods" tab s_const_tab = Getattr(nspaceHash, "methods"); else s_const_tab = Getattr(nspaceHash, "constants"); assert(s_const_tab); Printf(s_const_tab, " %s,\n", constantRecord); if ((eluac_ltr || elua_ltr) && old_metatable_bindings) { s_const_tab = Getattr(nspaceHash, "constants"); assert(s_const_tab); Printf(s_const_tab, " %s,\n", constantRecord); } } /* ------------------------------------------------------------ * constantWrapper() * ------------------------------------------------------------ */ virtual int constantWrapper(Node *n) { REPORT("constantWrapper", n); String *name = Getattr(n, "name"); String *iname = Getattr(n, "sym:name"); String *lua_name = Getattr(n, "lua:name"); if (lua_name == 0) lua_name = iname; String *nsname = Copy(iname); SwigType *type = Getattr(n, "type"); String *rawval = Getattr(n, "rawval"); String *value = rawval ? rawval : Getattr(n, "value"); String *tm; String *lua_name_v2 = 0; String *tm_v2 = 0; String *iname_v2 = 0; Node *n_v2 = 0; if (!luaAddSymbol(lua_name, n)) return SWIG_ERROR; Swig_save("lua_constantMember", n, "sym:name", NIL); Setattr(n, "sym:name", lua_name); /* Special hook for member pointer */ if (SwigType_type(type) == T_MPOINTER) { String *wname = Swig_name_wrapper(iname); Printf(f_wrappers, "static %s = %s;\n", SwigType_str(type, wname), value); value = Char(wname); } if ((tm = Swig_typemap_lookup("consttab", n, name, 0))) { Replaceall(tm, "$source", value); Replaceall(tm, "$target", lua_name); Replaceall(tm, "$value", value); Replaceall(tm, "$nsname", nsname); registerConstant(luaCurrentSymbolNSpace(), tm); } else if ((tm = Swig_typemap_lookup("constcode", n, name, 0))) { Replaceall(tm, "$source", value); Replaceall(tm, "$target", lua_name); Replaceall(tm, "$value", value); Replaceall(tm, "$nsname", nsname); Printf(f_init, "%s\n", tm); } else { Delete(nsname); nsname = 0; Swig_warning(WARN_TYPEMAP_CONST_UNDEF, input_file, line_number, "Unsupported constant value.\n"); Swig_restore(n); return SWIG_NOWRAP; } bool make_v2_compatible = old_metatable_bindings && getCurrentClass() && old_compatible_names; if (make_v2_compatible) { // Don't do anything for enums in C mode - they are already // wrapped correctly if (CPlusPlus || !current[ENUM_CONST]) { lua_name_v2 = Swig_name_member(0, proxy_class_name, lua_name); iname_v2 = Swig_name_member(0, proxy_class_name, iname); n_v2 = Copy(n); if (!luaAddSymbol(iname_v2, n, getNSpace())) { Swig_restore(n); return SWIG_ERROR; } Setattr(n_v2, "sym:name", lua_name_v2); tm_v2 = Swig_typemap_lookup("consttab", n_v2, name, 0); if (tm_v2) { Replaceall(tm_v2, "$source", value); Replaceall(tm_v2, "$target", lua_name_v2); Replaceall(tm_v2, "$value", value); Replaceall(tm_v2, "$nsname", nsname); registerConstant(getNSpace(), tm_v2); } else { tm_v2 = Swig_typemap_lookup("constcode", n_v2, name, 0); if (!tm_v2) { // This can't be. assert(false); Swig_restore(n); return SWIG_ERROR; } Replaceall(tm_v2, "$source", value); Replaceall(tm_v2, "$target", lua_name_v2); Replaceall(tm_v2, "$value", value); Replaceall(tm_v2, "$nsname", nsname); Printf(f_init, "%s\n", tm_v2); } Delete(n_v2); } } Swig_restore(n); Delete(nsname); return SWIG_OK; } /* ------------------------------------------------------------ * nativeWrapper() * ------------------------------------------------------------ */ virtual int nativeWrapper(Node *n) { // REPORT("nativeWrapper", n); String *symname = Getattr(n, "sym:name"); String *wrapname = Getattr(n, "wrap:name"); if (!luaAddSymbol(wrapname, n)) return SWIG_ERROR; Hash *nspaceHash = getCArraysHash(getNSpace()); String *s_ns_methods_tab = Getattr(nspaceHash, "methods"); Printv(s_ns_methods_tab, tab4, "{ \"", symname, "\",", wrapname, "},\n", NIL); // return Language::nativeWrapper(n); // this does nothing... return SWIG_OK; } /* ------------------------------------------------------------ * enumDeclaration() * ------------------------------------------------------------ */ virtual int enumDeclaration(Node *n) { if (getCurrentClass() && (cplus_mode != PUBLIC)) return SWIG_NOWRAP; current[STATIC_CONST] = true; current[ENUM_CONST] = true; // There is some slightly specific behaviour with enums. Basically, // their NSpace may be tracked separately. The code below tries to work around // this issue to some degree. // The idea is the same as in classHandler - to drop old names generation if // enum is in class in namespace. const int old_compatible_names_saved = old_compatible_names; if (getNSpace() || ( Getattr(n, "sym:nspace") != 0 && Len(Getattr(n, "sym:nspace")) > 0 ) ) { old_compatible_names = 0; } int result = Language::enumDeclaration(n); current[STATIC_CONST] = false; current[ENUM_CONST] = false; old_compatible_names = old_compatible_names_saved; return result; } /* ------------------------------------------------------------ * enumvalueDeclaration() * ------------------------------------------------------------ */ virtual int enumvalueDeclaration(Node *n) { if (getCurrentClass() && (cplus_mode != PUBLIC)) return SWIG_NOWRAP; Swig_require("enumvalueDeclaration", n, "*name", "?value", "*sym:name", NIL); String *symname = Getattr(n, "sym:name"); String *value = Getattr(n, "value"); String *name = Getattr(n, "name"); String *tmpValue; Node *parent = parentNode(n); if (value) tmpValue = NewString(value); else tmpValue = NewString(name); Setattr(n, "value", tmpValue); Setattr(n, "name", tmpValue); /* for wrapping of enums in a namespace when emit_action is used */ if (GetFlag(parent, "scopedenum")) { symname = Swig_name_member(0, Getattr(parent, "sym:name"), symname); Setattr(n, "sym:name", symname); Delete(symname); } int result = constantWrapper(n); Delete(tmpValue); Swig_restore(n); return result; } /* ------------------------------------------------------------ * classDeclaration() * ------------------------------------------------------------ */ virtual int classDeclaration(Node *n) { return Language::classDeclaration(n); } /* ------------------------------------------------------------ * Helper function that adds record to appropriate C arrays * ------------------------------------------------------------ */ void registerClass(String *scope, String *wrap_class) { assert(wrap_class); Hash *nspaceHash = getCArraysHash(scope); String *ns_classes = Getattr(nspaceHash, "classes"); Printv(ns_classes, "&", wrap_class, ",\n", NIL); if (elua_ltr || eluac_ltr) { String *ns_methods = Getattr(nspaceHash, "methods"); Hash *class_hash = getCArraysHash(class_static_nspace); assert(class_hash); String *cls_methods = Getattr(class_hash, "methods:name"); assert(cls_methods); Printv(ns_methods, tab4, "{LSTRKEY(\"", proxy_class_name, "\")", ", LROVAL(", cls_methods, ")", "},\n", NIL); } } /* ------------------------------------------------------------ * classHandler() * ------------------------------------------------------------ */ virtual int classHandler(Node *n) { //REPORT("classHandler", n); String *mangled_full_proxy_class_name = 0; String *destructor_name = 0; String *nspace = getNSpace(); constructor_name = 0; have_constructor = 0; have_destructor = 0; destructor_action = 0; assert(class_static_nspace == 0); assert(full_proxy_class_name == 0); assert(proxy_class_name == 0); current[NO_CPP] = false; proxy_class_name = Getattr(n, "sym:name"); // We have to enforce nspace here, because technically we are already // inside class parsing (getCurrentClass != 0), but we should register // class in its parent namespace if (!luaAddSymbol(proxy_class_name, n, nspace)) return SWIG_ERROR; if (nspace == 0) full_proxy_class_name = NewStringf("%s", proxy_class_name); else full_proxy_class_name = NewStringf("%s.%s", nspace, proxy_class_name); assert(full_proxy_class_name); mangled_full_proxy_class_name = Swig_name_mangle(full_proxy_class_name); SwigType *t = Copy(Getattr(n, "name")); SwigType *fr_t = SwigType_typedef_resolve_all(t); /* Create fully resolved type */ SwigType *t_tmp = 0; t_tmp = SwigType_typedef_qualified(fr_t); // Temporal variable Delete(fr_t); fr_t = SwigType_strip_qualifiers(t_tmp); String *mangled_fr_t = 0; mangled_fr_t = SwigType_manglestr(fr_t); // not sure exactly how this works, // but tcl has a static hashtable of all classes emitted and then only emits code for them once. // this fixes issues in test suites: template_default2 & template_specialization // * if i understand correctly, this is a bug. // * consider effect on template_specialization_defarg static Hash *emitted = NewHash(); if (GetFlag(emitted, mangled_fr_t)) { full_proxy_class_name = 0; proxy_class_name = 0; return SWIG_NOWRAP; } SetFlag(emitted, mangled_fr_t); // We treat class T as both 'class' and 'namespace'. All static members, attributes // and constants are considered part of namespace T, all members - part of the 'class' // Now, here is a trick. Static methods, attributes and non-static methods and attributes // are described with same structures - swig_lua_attribute/swig_lua_method. Instead of calling // getCArraysHash(class name) to initialize things for static methods/attributes and then // manually doing same initialization for non-static methods, we call getCArraysHash 2 times: // 1) With name "class name" + "." + "SwigStatic" to initialize static things // 2) With "class name" to initialize non-static things Hash *instance_cls = getCArraysHash(full_proxy_class_name, false); assert(instance_cls); String *s_attr_tab_name = Getattr(instance_cls, "attributes:name"); String *s_methods_tab_name = Getattr(instance_cls, "methods:name"); SetFlag(instance_cls, "lua:no_namespaces"); SetFlag(instance_cls, "lua:no_classes"); SetFlag(instance_cls, "lua:class_instance"); /* There is no use for "constants", "classes" and "namespaces" arrays. * All constants are considered part of static part of class. */ class_static_nspace = NewStringf("%s%sSwigStatic", full_proxy_class_name, NSPACE_SEPARATOR); Hash *static_cls = getCArraysHash(class_static_nspace, false); assert(static_cls); SetFlag(static_cls, "lua:no_namespaces"); SetFlag(static_cls, "lua:class_static"); // Notifying instance_cls and static_cls hashes about each other Setattr(instance_cls, "lua:class_instance:static_hash", static_cls); Setattr(static_cls, "lua:class_static:instance_hash", instance_cls); const int old_compatible_names_saved = old_compatible_names; // If class has %nspace enabled, then generation of backward compatible names // should be disabled if (getNSpace()) { old_compatible_names = 0; } /* There is no use for "classes" and "namespaces" arrays. Subclasses are not supported * by SWIG and namespaces couldn't be nested inside classes (C++ Standard) */ // Generate normal wrappers Language::classHandler(n); old_compatible_names = old_compatible_names_saved; SwigType_add_pointer(t); // Catch all: eg. a class with only static functions and/or variables will not have 'remembered' String *wrap_class_name = Swig_name_wrapper(NewStringf("class_%s", mangled_full_proxy_class_name)); String *wrap_class = NewStringf("&%s", wrap_class_name); SwigType_remember_clientdata(t, wrap_class); String *rt = Copy(getClassType()); SwigType_add_pointer(rt); // Adding class to appropriate namespace registerClass(nspace, wrap_class_name); Hash *nspaceHash = getCArraysHash(nspace); // Register the class structure with the type checker // Printf(f_init,"SWIG_TypeClientData(SWIGTYPE%s, (void *) &_wrap_class_%s);\n", SwigType_manglestr(t), mangled_full_proxy_class_name); // emit a function to be called to delete the object if (have_destructor) { destructor_name = NewStringf("swig_delete_%s", mangled_full_proxy_class_name); Printv(f_wrappers, "static void ", destructor_name, "(void *obj) {\n", NIL); if (destructor_action) { Printv(f_wrappers, SwigType_str(rt, "arg1"), " = (", SwigType_str(rt, 0), ") obj;\n", NIL); Printv(f_wrappers, destructor_action, "\n", NIL); } else { if (CPlusPlus) { Printv(f_wrappers, " delete (", SwigType_str(rt, 0), ") obj;\n", NIL); } else { Printv(f_wrappers, " free((char *) obj);\n", NIL); } } Printf(f_wrappers, "}\n"); } // Wrap constructor wrapper into one more proxy function. It will be used as class namespace __call method, thus // allowing both // Module.ClassName.StaticMethod to access static method/variable/constant // Module.ClassName() to create new object if (have_constructor) { assert(constructor_name); String *constructor_proxy_name = NewStringf("_proxy_%s", constructor_name); Printv(f_wrappers, "static int ", constructor_proxy_name, "(lua_State *L) {\n", NIL); Printv(f_wrappers, tab4, "assert(lua_istable(L,1));\n", tab4, "lua_pushcfunction(L,", constructor_name, ");\n", tab4, "assert(!lua_isnil(L,-1));\n", tab4, "lua_replace(L,1); /* replace our table with real constructor */\n", tab4, "lua_call(L,lua_gettop(L)-1,1);\n", tab4, "return 1;\n}\n", NIL); Delete(constructor_name); constructor_name = constructor_proxy_name; if (elua_ltr) { String *static_cls_metatable_tab = Getattr(static_cls, "metatable"); assert(static_cls_metatable_tab); Printf(static_cls_metatable_tab, " {LSTRKEY(\"__call\"), LFUNCVAL(%s)},\n", constructor_name); } else if (eluac_ltr) { String *ns_methods_tab = Getattr(nspaceHash, "methods"); assert(ns_methods_tab); Printv(ns_methods_tab, tab4, "{LSTRKEY(\"", "new_", proxy_class_name, "\")", ", LFUNCVAL(", constructor_name, ")", "},\n", NIL); } } if (have_destructor) { if (eluac_ltr) { String *ns_methods_tab = Getattr(nspaceHash, "methods"); assert(ns_methods_tab); Printv(ns_methods_tab, tab4, "{LSTRKEY(\"", "free_", mangled_full_proxy_class_name, "\")", ", LFUNCVAL(", destructor_name, ")", "},\n", NIL); } } closeCArraysHash(full_proxy_class_name, f_wrappers); closeCArraysHash(class_static_nspace, f_wrappers); // Handle inheritance // note: with the idea of class hierarchies spread over multiple modules // cf test-suite: imports.i // it is not possible to just add the pointers to the base classes to the code // (as sometimes these classes are not present) // therefore we instead hold the name of the base class and a null pointer // at runtime: we can query the swig type manager & see if the class exists // if so, we can get the pointer to the base class & replace the null pointer // if the type does not exist, then we cannot... String *base_class = NewString(""); String *base_class_names = NewString(""); List *baselist = Getattr(n, "bases"); if (baselist && Len(baselist)) { Iterator b; int index = 0; b = First(baselist); while (b.item) { String *bname = Getattr(b.item, "name"); if ((!bname) || GetFlag(b.item, "feature:ignore") || (!Getattr(b.item, "module"))) { b = Next(b); continue; } // stores a null pointer & the name Printf(base_class, "0,"); Printf(base_class_names, "\"%s *\",", SwigType_namestr(bname)); b = Next(b); index++; } } // First, print class static part printCArraysDefinition(class_static_nspace, proxy_class_name, f_wrappers); assert(mangled_full_proxy_class_name); assert(base_class); assert(base_class_names); assert(proxy_class_name); assert(full_proxy_class_name); // Then print class instance part Printv(f_wrappers, "static swig_lua_class *swig_", mangled_full_proxy_class_name, "_bases[] = {", base_class, "0};\n", NIL); Delete(base_class); Printv(f_wrappers, "static const char *swig_", mangled_full_proxy_class_name, "_base_names[] = {", base_class_names, "0};\n", NIL); Delete(base_class_names); Printv(f_wrappers, "static swig_lua_class _wrap_class_", mangled_full_proxy_class_name, " = { \"", proxy_class_name, "\", \"", full_proxy_class_name, "\", &SWIGTYPE", SwigType_manglestr(t), ",", NIL); if (have_constructor) { Printv(f_wrappers, constructor_name, NIL); Delete(constructor_name); constructor_name = 0; } else { Printf(f_wrappers, "0"); } if (have_destructor) { Printv(f_wrappers, ", ", destructor_name, NIL); } else { Printf(f_wrappers, ",0"); } Printf(f_wrappers, ", %s, %s, &%s", s_methods_tab_name, s_attr_tab_name, Getattr(static_cls, "cname")); if (!eluac_ltr) { Printf(f_wrappers, ", %s", Getattr(instance_cls,"metatable:name")); } else Printf(f_wrappers, ", 0"); Printf(f_wrappers, ", swig_%s_bases, swig_%s_base_names };\n\n", mangled_full_proxy_class_name, mangled_full_proxy_class_name); current[NO_CPP] = true; Delete(class_static_nspace); class_static_nspace = 0; Delete(mangled_full_proxy_class_name); mangled_full_proxy_class_name = 0; Delete(destructor_name); destructor_name = 0; Delete(full_proxy_class_name); full_proxy_class_name = 0; proxy_class_name = 0; return SWIG_OK; } /* ------------------------------------------------------------ * memberfunctionHandler() * ------------------------------------------------------------ */ virtual int memberfunctionHandler(Node *n) { String *symname = GetChar(n, "sym:name"); //Printf(stdout,"memberfunctionHandler %s %s\n",name,iname); // Special case unary minus: LUA passes two parameters for the // wrapper function while we want only one. Tell our // functionWrapper to ignore a parameter. if (Cmp(symname, "__unm") == 0) { //Printf(stdout, "unary minus: ignore one argument\n"); SetInt(n, "lua:ignore_args", 1); } current[MEMBER_FUNC] = true; Language::memberfunctionHandler(n); registerMethod(n); current[MEMBER_FUNC] = false; return SWIG_OK; } /* ------------------------------------------------------------ * membervariableHandler() * ------------------------------------------------------------ */ virtual int membervariableHandler(Node *n) { // REPORT("membervariableHandler",n); current[MEMBER_VAR] = true; Language::membervariableHandler(n); registerVariable(n); current[MEMBER_VAR] = false; return SWIG_OK; } /* ------------------------------------------------------------ * constructorHandler() * * Method for adding C++ member constructor * ------------------------------------------------------------ */ virtual int constructorHandler(Node *n) { // REPORT("constructorHandler", n); current[CONSTRUCTOR] = true; Language::constructorHandler(n); current[CONSTRUCTOR] = false; //constructor_name = NewString(Getattr(n, "sym:name")); have_constructor = 1; return SWIG_OK; } /* ------------------------------------------------------------ * destructorHandler() * ------------------------------------------------------------ */ virtual int destructorHandler(Node *n) { REPORT("destructorHandler", n); current[DESTRUCTOR] = true; Language::destructorHandler(n); current[DESTRUCTOR] = false; have_destructor = 1; destructor_action = Getattr(n, "wrap:action"); return SWIG_OK; } /* ---------------------------------------------------------------------- * globalfunctionHandler() * * It can be called: * 1. Usual C/C++ global function. * 2. During class parsing for functions declared/defined as friend * 3. During class parsing from staticmemberfunctionHandler * ---------------------------------------------------------------------- */ virtual int globalfunctionHandler(Node *n) { bool oldVal = current[NO_CPP]; if (!current[STATIC_FUNC]) // If static function, don't switch to NO_CPP current[NO_CPP] = true; const int result = Language::globalfunctionHandler(n); if (!current[STATIC_FUNC]) // Register only if not called from static function handler registerMethod(n); current[NO_CPP] = oldVal; return result; } /* ---------------------------------------------------------------------- * globalvariableHandler() * * Sets "current" array correctly * ---------------------------------------------------------------------- */ virtual int globalvariableHandler(Node *n) { bool oldVal = current[NO_CPP]; current[GLOBAL_VAR] = true; current[NO_CPP] = true; const int result = Language::globalvariableHandler(n); registerVariable(n); current[GLOBAL_VAR] = false; current[NO_CPP] = oldVal; return result; } /* ----------------------------------------------------------------------- * staticmemberfunctionHandler() * * Wrap a static C++ function * ---------------------------------------------------------------------- */ virtual int staticmemberfunctionHandler(Node *n) { REPORT("staticmemberfunctionHandler", n); current[STATIC_FUNC] = true; const int result = Language::staticmemberfunctionHandler(n); registerMethod(n); if (old_metatable_bindings && result == SWIG_OK && old_compatible_names) { Swig_require("lua_staticmemberfunctionHandler", n, "*lua:name", NIL); String *lua_name = Getattr(n, "lua:name"); // Although this function uses Swig_name_member, it actually generates the Lua name, // not the C++ name. This is because an earlier version used such a scheme for static function // name generation and we have to maintain backward compatibility. String *compat_name = Swig_name_member(0, proxy_class_name, lua_name); Setattr(n, "lua:name", compat_name); registerMethod(n, true, getNSpace()); Delete(compat_name); Swig_restore(n); } current[STATIC_FUNC] = false;; return result; } /* ------------------------------------------------------------ * memberconstantHandler() * * Create a C++ constant * ------------------------------------------------------------ */ virtual int memberconstantHandler(Node *n) { REPORT("memberconstantHandler", n); int result = Language::memberconstantHandler(n); return result; } /* --------------------------------------------------------------------- * staticmembervariableHandler() * --------------------------------------------------------------------- */ virtual int staticmembervariableHandler(Node *n) { REPORT("staticmembervariableHandler", n); current[STATIC_VAR] = true; //String *symname = Getattr(n, "sym:name"); int result = Language::staticmembervariableHandler(n); if (!GetFlag(n, "wrappedasconstant")) { registerVariable(n); } if (result == SWIG_OK) { // This will add static member variable to the class namespace with name ClassName_VarName if (old_metatable_bindings && old_compatible_names) { Swig_save("lua_staticmembervariableHandler", n, "lua:name", NIL); String *lua_name = Getattr(n, "lua:name"); // Although this function uses Swig_name_member, it actually generates the Lua name, // not the C++ name. This is because an earlier version used such a scheme for static function // name generation and we have to maintain backward compatibility. String *v2_name = Swig_name_member(NIL, proxy_class_name, lua_name); if (!GetFlag(n, "wrappedasconstant")) { Setattr(n, "lua:name", v2_name); // Registering static var in the class parent nspace registerVariable(n, true, getNSpace()); } // If static member variable was wrapped as a constant, then // constant wrapper has already performed all actions necessary for old_metatable_bindings Delete(v2_name); Swig_restore(n); } } current[STATIC_VAR] = false; return result; } /* --------------------------------------------------------------------- * external runtime generation * --------------------------------------------------------------------- */ /* This is to support the usage SWIG -external-runtime The code consists of two functions: String *runtimeCode() // returns a large string with all the runtimes in String *defaultExternalRuntimeFilename() // returns the default filename I am writing a generic solution, even though SWIG-Lua only has one file right now... */ String *runtimeCode() { String *s = NewString(""); const char *filenames[] = { "luarun.swg", 0 }; // must be 0 terminated emitLuaFlavor(s); String *sfile = 0; for (int i = 0; filenames[i] != 0; i++) { sfile = Swig_include_sys(filenames[i]); if (!sfile) { Printf(stderr, "*** Unable to open '%s'\n", filenames[i]); } else { Append(s, sfile); Delete(sfile); } } return s; } String *defaultExternalRuntimeFilename() { return NewString("swigluarun.h"); } /* --------------------------------------------------------------------- * helpers * --------------------------------------------------------------------- */ void emitLuaFlavor(String *s) { if (elua_emulate) { Printf(s, "/*This is only emulation!*/\n"); Printf(s, "#define SWIG_LUA_TARGET SWIG_LUA_FLAVOR_ELUA\n"); Printf(s, "#define SWIG_LUA_ELUA_EMULATE\n"); } else if (elua_ltr) Printf(s, "#define SWIG_LUA_TARGET SWIG_LUA_FLAVOR_ELUA\n"); else if (eluac_ltr) Printf(s, "#define SWIG_LUA_TARGET SWIG_LUA_FLAVOR_ELUAC\n"); else Printf(s, "#define SWIG_LUA_TARGET SWIG_LUA_FLAVOR_LUA\n"); } /* ----------------------------------------------------------------------------- * escapeCode() * * This is to convert the string of Lua code into a proper string, which can then be * emitted into the C/C++ code. * Basically it is a lot of search & replacing of odd sequences * ---------------------------------------------------------------------------- */ void escapeCode(String *str) { //Printf(f_runtime,"/* original luacode:[[[\n%s\n]]]\n*/\n",str); Chop(str); // trim Replace(str, "\\", "\\\\", DOH_REPLACE_ANY); // \ to \\ (this must be done first) Replace(str, "\"", "\\\"", DOH_REPLACE_ANY); // " to \" Replace(str, "\n", "\\n\"\n \"", DOH_REPLACE_ANY); // \n to \n"\n" (ie quoting every line) //Printf(f_runtime,"/* hacked luacode:[[[\n%s\n]]]\n*/\n",str); } /* ----------------------------------------------------------------------------- * rawGetCArraysHash(String *name) * * A small helper to hide implementation of how CArrays hashes are stored * ---------------------------------------------------------------------------- */ Hash *rawGetCArraysHash(const_String_or_char_ptr name) { Hash *scope = symbolScopeLookup( name ? name : "" ); if(!scope) return 0; Hash *carrays_hash = Getattr(scope, "lua:cdata"); return carrays_hash; } /* ----------------------------------------------------------------------------- * getCArraysHash() * * Each namespace can be described with a hash that stores C arrays * where members of the namespace should be added. All these hashes are stored * inside the symbols table, in pseudo-symbol for every namespace. * nspace could be NULL (NSPACE_TODO), that means functions and variables and classes * that are not in any namespace (this is default for SWIG unless %nspace feature is used). * You can later set some attributes that will affect behaviour of functions that use this hash: * "lua:no_namespaces" will disable "namespaces" array. * "lua:no_classes" will disable "classes" array. * For every component ("attributes", "methods", etc) there are subcomponents: * XXX:name - name of the C array that stores data for component * XXX:decl - statement with forward declaration of this array; * Namespace could be automatically registered to its parent if 'reg' == true. This can only be * done during the first call (a.k.a when nspace is created). * ---------------------------------------------------------------------------- */ Hash *getCArraysHash(String *nspace, bool reg = true) { Hash *scope = symbolScopeLookup(nspace ? nspace : ""); if(!scope) { symbolAddScope( nspace ? nspace : "" ); scope = symbolScopeLookup(nspace ? nspace : ""); assert(scope); } Hash *carrays_hash = Getattr(scope, "lua:cdata"); if (carrays_hash != 0) return carrays_hash; carrays_hash = NewHash(); String *mangled_name = 0; if (nspace == 0 || Len(nspace) == 0) mangled_name = NewString("SwigModule"); else mangled_name = Swig_name_mangle(nspace); String *cname = NewStringf("swig_%s", mangled_name); Setattr(carrays_hash, "cname", cname); String *attr_tab = NewString(""); String *attr_tab_name = NewStringf("swig_%s_attributes", mangled_name); String *attr_tab_decl = NewString(""); Printv(attr_tab, "static swig_lua_attribute ", NIL); Printv(attr_tab, attr_tab_name, "[]", NIL); Printv(attr_tab_decl, attr_tab, ";\n", NIL); Printv(attr_tab, " = {\n", NIL); Setattr(carrays_hash, "attributes", attr_tab); Setattr(carrays_hash, "attributes:name", attr_tab_name); Setattr(carrays_hash, "attributes:decl", attr_tab_decl); String *methods_tab = NewString(""); String *methods_tab_name = NewStringf("swig_%s_methods", mangled_name); String *methods_tab_decl = NewString(""); if (elua_ltr || eluac_ltr) // In this case methods array also acts as namespace rotable Printf(methods_tab, "const LUA_REG_TYPE "); else Printf(methods_tab, "static swig_lua_method "); Printv(methods_tab, methods_tab_name, "[]", NIL); Printv(methods_tab_decl, methods_tab, ";\n", NIL); Printv(methods_tab, "= {\n", NIL); Setattr(carrays_hash, "methods", methods_tab); Setattr(carrays_hash, "methods:name", methods_tab_name); Setattr(carrays_hash, "methods:decl", methods_tab_decl); String *const_tab = NewString(""); String *const_tab_name = NewStringf("swig_%s_constants", mangled_name); String *const_tab_decl = NewString(""); if (elua_ltr || eluac_ltr) // In this case const array holds rotable with namespace constants Printf(const_tab, "const LUA_REG_TYPE "); else Printf(const_tab, "static swig_lua_const_info "); Printv(const_tab, const_tab_name, "[]", NIL); Printv(const_tab_decl, const_tab, ";", NIL); Printv(const_tab, "= {\n", NIL); Setattr(carrays_hash, "constants", const_tab); Setattr(carrays_hash, "constants:name", const_tab_name); Setattr(carrays_hash, "constants:decl", const_tab_decl); String *classes_tab = NewString(""); String *classes_tab_name = NewStringf("swig_%s_classes", mangled_name); String *classes_tab_decl = NewString(""); Printf(classes_tab, "static swig_lua_class* "); Printv(classes_tab, classes_tab_name, "[]", NIL); Printv(classes_tab_decl, classes_tab, ";", NIL); Printv(classes_tab, "= {\n", NIL); Setattr(carrays_hash, "classes", classes_tab); Setattr(carrays_hash, "classes:name", classes_tab_name); Setattr(carrays_hash, "classes:decl", classes_tab_decl); String *namespaces_tab = NewString(""); String *namespaces_tab_name = NewStringf("swig_%s_namespaces", mangled_name); String *namespaces_tab_decl = NewString(""); Printf(namespaces_tab, "static swig_lua_namespace* "); Printv(namespaces_tab, namespaces_tab_name, "[]", NIL); Printv(namespaces_tab_decl, namespaces_tab, ";", NIL); Printv(namespaces_tab, " = {\n", NIL); Setattr(carrays_hash, "namespaces", namespaces_tab); Setattr(carrays_hash, "namespaces:name", namespaces_tab_name); Setattr(carrays_hash, "namespaces:decl", namespaces_tab_decl); if (elua_ltr) { String *get_tab = NewString(""); String *get_tab_name = NewStringf("swig_%s_get", mangled_name); String *get_tab_decl = NewString(""); Printv(get_tab, "const LUA_REG_TYPE ", get_tab_name, "[]", NIL); Printv(get_tab_decl, get_tab, ";", NIL); Printv(get_tab, " = {\n", NIL); Setattr(carrays_hash, "get", get_tab); Setattr(carrays_hash, "get:name", get_tab_name); Setattr(carrays_hash, "get:decl", get_tab_decl); String *set_tab = NewString(""); String *set_tab_name = NewStringf("swig_%s_set", mangled_name); String *set_tab_decl = NewString(""); Printv(set_tab, "const LUA_REG_TYPE ", set_tab_name, "[]", NIL); Printv(set_tab_decl, set_tab, ";", NIL); Printv(set_tab, " = {\n", NIL); Setattr(carrays_hash, "set", set_tab); Setattr(carrays_hash, "set:name", set_tab_name); Setattr(carrays_hash, "set:decl", set_tab_decl); } if (!eluac_ltr) { String *metatable_tab = NewString(""); String *metatable_tab_name = NewStringf("swig_%s_meta", mangled_name); String *metatable_tab_decl = NewString(""); if (elua_ltr) // In this case const array holds rotable with namespace constants Printf(metatable_tab, "const LUA_REG_TYPE "); else Printf(metatable_tab, "static swig_lua_method "); Printv(metatable_tab, metatable_tab_name, "[]", NIL); Printv(metatable_tab_decl, metatable_tab, ";", NIL); Printv(metatable_tab, " = {\n", NIL); Setattr(carrays_hash, "metatable", metatable_tab); Setattr(carrays_hash, "metatable:name", metatable_tab_name); Setattr(carrays_hash, "metatable:decl", metatable_tab_decl); } Setattr(scope, "lua:cdata", carrays_hash); assert(rawGetCArraysHash(nspace)); if (reg && nspace != 0 && Len(nspace) != 0 && GetFlag(carrays_hash, "lua:no_reg") == 0) { // Split names into components List *components = Split(nspace, '.', -1); String *parent_path = NewString(""); int len = Len(components); String *name = Copy(Getitem(components, len - 1)); for (int i = 0; i < len - 1; i++) { if (i > 0) Printv(parent_path, NSPACE_SEPARATOR, NIL); String *item = Getitem(components, i); Printv(parent_path, item, NIL); } Hash *parent = getCArraysHash(parent_path, true); String *namespaces_tab = Getattr(parent, "namespaces"); Printv(namespaces_tab, "&", cname, ",\n", NIL); if (elua_ltr || eluac_ltr) { String *methods_tab = Getattr(parent, "methods"); Printv(methods_tab, tab4, "{LSTRKEY(\"", name, "\")", ", LROVAL(", methods_tab_name, ")", "},\n", NIL); } Setattr(carrays_hash, "name", name); Delete(components); Delete(parent_path); } else if (!reg) // This namespace shouldn't be registered. Lets remember it. SetFlag(carrays_hash, "lua:no_reg"); Delete(mangled_name); mangled_name = 0; return carrays_hash; } /* ----------------------------------------------------------------------------- * closeCArraysHash() * * Functions add end markers {0,0,...,0} to all arrays, prints them to * output and marks hash as closed (lua:closed). Consequent attempts to * close the same hash will result in an error. * closeCArraysHash DOES NOT print structure that describes namespace, it only * prints array. You can use printCArraysDefinition to print structure. * if "lua:no_namespaces" is set, then array for "namespaces" won't be printed * if "lua:no_classes" is set, then array for "classes" won't be printed * ----------------------------------------------------------------------------- */ void closeCArraysHash(String *nspace, File *output) { Hash *carrays_hash = rawGetCArraysHash(nspace); assert(carrays_hash); assert(GetFlag(carrays_hash, "lua:closed") == 0); SetFlag(carrays_hash, "lua:closed"); // Do arrays describe class instance part or class static part const int is_instance = GetFlag(carrays_hash, "lua:class_instance"); String *attr_tab = Getattr(carrays_hash, "attributes"); Printf(attr_tab, " {0,0,0}\n};\n"); Printv(output, attr_tab, NIL); String *const_tab = Getattr(carrays_hash, "constants"); String *const_tab_name = Getattr(carrays_hash, "constants:name"); if (elua_ltr || eluac_ltr) Printv(const_tab, tab4, "{LNILKEY, LNILVAL}\n", "};\n", NIL); else Printf(const_tab, " {0,0,0,0,0,0}\n};\n"); // For the sake of compiling with -Wall -Werror we print constants // only when necessary int need_constants = 0; if ( (elua_ltr || eluac_ltr) && (old_metatable_bindings) ) need_constants = 1; else if (!is_instance) // static part need constants tab need_constants = 1; if (need_constants) Printv(output, const_tab, NIL); if (elua_ltr) { // Put forward declaration of metatable array Printv(output, "extern ", Getattr(carrays_hash, "metatable:decl"), "\n", NIL); } String *methods_tab = Getattr(carrays_hash, "methods"); String *metatable_tab_name = Getattr(carrays_hash, "metatable:name"); if (elua_ltr || eluac_ltr) { if (old_metatable_bindings) Printv(methods_tab, tab4, "{LSTRKEY(\"const\"), LROVAL(", const_tab_name, ")},\n", NIL); if (elua_ltr) { Printv(methods_tab, tab4, "{LSTRKEY(\"__metatable\"), LROVAL(", metatable_tab_name, ")},\n", NIL); } Printv(methods_tab, tab4, "{LSTRKEY(\"__disown\"), LFUNCVAL(SWIG_Lua_class_disown)},\n", NIL); Printv(methods_tab, tab4, "{LNILKEY, LNILVAL}\n};\n", NIL); } else Printf(methods_tab, " {0,0}\n};\n"); Printv(output, methods_tab, NIL); if (!GetFlag(carrays_hash, "lua:no_classes")) { String *classes_tab = Getattr(carrays_hash, "classes"); Printf(classes_tab, " 0\n};\n"); Printv(output, classes_tab, NIL); } if (!GetFlag(carrays_hash, "lua:no_namespaces")) { String *namespaces_tab = Getattr(carrays_hash, "namespaces"); Printf(namespaces_tab, " 0\n};\n"); Printv(output, namespaces_tab, NIL); } if (elua_ltr) { String *get_tab = Getattr(carrays_hash, "get"); String *set_tab = Getattr(carrays_hash, "set"); Printv(get_tab, tab4, "{LNILKEY, LNILVAL}\n};\n", NIL); Printv(set_tab, tab4, "{LNILKEY, LNILVAL}\n};\n", NIL); Printv(output, get_tab, NIL); Printv(output, set_tab, NIL); } // Heuristic whether we need to print metatable or not. // For the sake of compiling with -Wall -Werror we don't print // metatable for static part. int need_metatable = 0; if (eluac_ltr) need_metatable = 0; else if(!is_instance) need_metatable = 0; else need_metatable = 1; if (need_metatable) { String *metatable_tab = Getattr(carrays_hash, "metatable"); assert(metatable_tab); if (elua_ltr) { String *get_tab_name = Getattr(carrays_hash, "get:name"); String *set_tab_name = Getattr(carrays_hash, "set:name"); if (GetFlag(carrays_hash, "lua:class_instance")) { Printv(metatable_tab, tab4, "{LSTRKEY(\"__index\"), LFUNCVAL(SWIG_Lua_class_get)},\n", NIL); Printv(metatable_tab, tab4, "{LSTRKEY(\"__newindex\"), LFUNCVAL(SWIG_Lua_class_set)},\n", NIL); } else { Printv(metatable_tab, tab4, "{LSTRKEY(\"__index\"), LFUNCVAL(SWIG_Lua_namespace_get)},\n", NIL); Printv(metatable_tab, tab4, "{LSTRKEY(\"__newindex\"), LFUNCVAL(SWIG_Lua_namespace_set)},\n", NIL); } Printv(metatable_tab, tab4, "{LSTRKEY(\"__gc\"), LFUNCVAL(SWIG_Lua_class_destruct)},\n", NIL); Printv(metatable_tab, tab4, "{LSTRKEY(\".get\"), LROVAL(", get_tab_name, ")},\n", NIL); Printv(metatable_tab, tab4, "{LSTRKEY(\".set\"), LROVAL(", set_tab_name, ")},\n", NIL); Printv(metatable_tab, tab4, "{LSTRKEY(\".fn\"), LROVAL(", Getattr(carrays_hash, "methods:name"), ")},\n", NIL); if (GetFlag(carrays_hash, "lua:class_instance")) { String *static_cls = Getattr(carrays_hash, "lua:class_instance:static_hash"); assert(static_cls); // static_cls is swig_lua_namespace. This structure can't be use with eLua(LTR) // Instead structure describing its methods isused String *static_cls_cname = Getattr(static_cls, "methods:name"); assert(static_cls_cname); Printv(metatable_tab, tab4, "{LSTRKEY(\".static\"), LROVAL(", static_cls_cname, ")},\n", NIL); // Put forward declaration of this array Printv(output, "extern ", Getattr(static_cls, "methods:decl"), "\n", NIL); } else if (GetFlag(carrays_hash, "lua:class_static")) { Hash *instance_cls = Getattr(carrays_hash, "lua:class_static:instance_hash"); assert(instance_cls); String *instance_cls_metatable_name = Getattr(instance_cls, "metatable:name"); assert(instance_cls_metatable_name); Printv(metatable_tab, tab4, "{LSTRKEY(\".instance\"), LROVAL(", instance_cls_metatable_name, ")},\n", NIL); } Printv(metatable_tab, tab4, "{LNILKEY, LNILVAL}\n};\n", NIL); } else { Printf(metatable_tab, " {0,0}\n};\n"); } Printv(output, metatable_tab, NIL); } Printv(output, "\n", NIL); } /* ----------------------------------------------------------------------------- * closeNamespaces() * * Recursively close all non-closed namespaces. Prints data to dataOutput. * ----------------------------------------------------------------------------- */ void closeNamespaces(File *dataOutput) { // Special handling for empty module. if (symbolScopeLookup("") == 0 || rawGetCArraysHash("") == 0) { // Module is empty. Create hash for global scope in order to have swig_SwigModule // variable in resulting file getCArraysHash(0); } // Because we can't directly access 'symtabs', instead we access // top-level scope and look on all scope pseudo-symbols in it. Hash *top_scope = symbolScopeLookup(""); assert(top_scope); Iterator ki = First(top_scope); List *to_close = NewList(); while (ki.key) { assert(ki.item); if (Getattr(ki.item, "sym:scope")) { // We have a pseudo symbol. Lets get actual scope for this pseudo symbol Hash *carrays_hash = rawGetCArraysHash(ki.key); assert(carrays_hash); if (GetFlag(carrays_hash, "lua:closed") == 0) Append(to_close, ki.key); } ki = Next(ki); } SortList(to_close, &compareByLen); int len = Len(to_close); for (int i = 0; i < len; i++) { String *key = Getitem(to_close, i); closeCArraysHash(key, dataOutput); Hash *carrays_hash = rawGetCArraysHash(key); String *name = 0; // name - name of the namespace as it should be visible in Lua if (DohLen(key) == 0) // This is global module name = module; else name = Getattr(carrays_hash, "name"); assert(name); printCArraysDefinition(key, name, dataOutput); } Delete(to_close); } /* ----------------------------------------------------------------------------- * printCArraysDefinition() * * This function prints to output a definition of namespace in form * swig_lua_namespace $cname = { attr_array, methods_array, ... , namespaces_array }; * You can call this function as many times as is necessary. * 'name' is a user-visible name that this namespace will have in Lua. It shouldn't * be a fully qualified name, just its own name. * ----------------------------------------------------------------------------- */ void printCArraysDefinition(String *nspace, String *name, File *output) { Hash *carrays_hash = getCArraysHash(nspace, false); String *cname = Getattr(carrays_hash, "cname"); // cname - name of the C structure that describes namespace assert(cname); Printv(output, "static swig_lua_namespace ", cname, " = ", NIL); String *null_string = NewString("0"); String *attr_tab_name = Getattr(carrays_hash, "attributes:name"); String *methods_tab_name = Getattr(carrays_hash, "methods:name"); String *const_tab_name = Getattr(carrays_hash, "constants:name"); String *classes_tab_name = Getattr(carrays_hash, "classes:name"); String *namespaces_tab_name = Getattr(carrays_hash, "namespaces:name"); bool has_classes = GetFlag(carrays_hash, "lua:no_classes") == 0; bool has_namespaces = GetFlag(carrays_hash, "lua:no_namespaces") == 0; Printv(output, "{\n", tab4, "\"", name, "\",\n", tab4, methods_tab_name, ",\n", tab4, attr_tab_name, ",\n", tab4, const_tab_name, ",\n", tab4, (has_classes) ? classes_tab_name : null_string, ",\n", tab4, (has_namespaces) ? namespaces_tab_name : null_string, "\n};\n", NIL); Delete(null_string); } /* ----------------------------------------------------------------------------- * luaCurrentSymbolNSpace() * * This function determines actual namespace/scope where any symbol at the * current moment should be placed. It looks at the 'current' array * and depending on where are we - static class member/function, * instance class member/function or just global functions decides * where symbol should be put. * The namespace/scope doesn't depend from symbol, only from 'current' * ----------------------------------------------------------------------------- */ String *luaCurrentSymbolNSpace() { String *scope = 0; // If outside class, than NSpace is used. // If inside class, but current[NO_CPP], then this is friend function. It belongs to NSpace if (!getCurrentClass() || current[NO_CPP]) { scope = getNSpace(); } else if (current[ENUM_CONST] && !CPlusPlus ) { // Enums in C mode go to NSpace scope = getNSpace(); } else { // If inside class, then either class static namespace or class fully qualified name is used assert(!current[NO_CPP]); if (current[STATIC_FUNC] || current[STATIC_VAR] || current[STATIC_CONST]) { scope = class_static_nspace; } else if (current[MEMBER_VAR] || current[CONSTRUCTOR] || current[DESTRUCTOR] || current[MEMBER_FUNC]) { scope = full_proxy_class_name; } else { // Friend functions are handled this way scope = class_static_nspace; } assert(scope); } return scope; } /* ----------------------------------------------------------------------------- * luaAddSymbol() * * Our implementation of addSymbol. Determines scope correctly, then * forwards to Language::addSymbol * ----------------------------------------------------------------------------- */ int luaAddSymbol(const String *s, const Node *n) { String *scope = luaCurrentSymbolNSpace(); return luaAddSymbol(s, n, scope); } /* ----------------------------------------------------------------------------- * luaAddSymbol() * * Overload. Enforces given scope. Actually, it simply forwards call to Language::addSymbol * ----------------------------------------------------------------------------- */ int luaAddSymbol(const String *s, const Node *n, const_String_or_char_ptr scope) { int result = Language::addSymbol(s, n, scope); if (!result) Printf(stderr, "addSymbol(%s to scope %s) failed\n", s, scope); return result; } }; /* NEW LANGUAGE NOTE:*********************************************** in order to add you language into swig, you need to make the following changes: - write this file (obviously) - add into the makefile (not 100% clear on how to do this) - edit swigmain.cxx to add your module near the top of swigmain.cxx, look for this code & add you own codes ======= begin change ========== extern "C" { Language *swig_tcl(void); Language *swig_python(void); //etc,etc,etc... Language *swig_lua(void); // this is my code } //etc,etc,etc... swig_module modules[] = { {"-guile", swig_guile, "Guile"}, {"-java", swig_java, "Java"}, //etc,etc,etc... {"-lua", swig_lua, "Lua"}, // this is my code {NULL, NULL, NULL} // this must come at the end of the list }; ======= end change ========== This is all that is needed NEW LANGUAGE NOTE:END ************************************************/ /* ----------------------------------------------------------------------------- * swig_lua() - Instantiate module * ----------------------------------------------------------------------------- */ extern "C" Language *swig_lua(void) { return new LUA(); } swig-4.0.1/Source/Modules/ruby.cxx0000644000175000017500000033027313527063513016735 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * ruby.cxx * * Ruby language module for SWIG. * ----------------------------------------------------------------------------- */ #include "swigmod.h" #include "cparse.h" #include #include #include /* for INT_MAX */ #define SWIG_PROTECTED_TARGET_METHODS 1 class RClass { private: String *temp; public: String *name; /* class name (renamed) */ String *cname; /* original C class/struct name */ String *mname; /* Mangled name */ /** * The C variable name used in the SWIG-generated wrapper code to refer to * this class; usually it is of the form "SwigClassXXX.klass", where SwigClassXXX * is a swig_class struct instance and klass is a member of that struct. */ String *vname; /** * The C variable name used in the SWIG-generated wrapper code to refer to * the module that implements this class's methods (when we're trying to * support C++ multiple inheritance). Usually it is of the form * "SwigClassClassName.mImpl", where SwigClassXXX is a swig_class struct instance * and mImpl is a member of that struct. */ String *mImpl; String *type; String *prefix; String *init; int constructor_defined; int destructor_defined; RClass() { temp = NewString(""); name = NewString(""); cname = NewString(""); mname = NewString(""); vname = NewString(""); mImpl = NewString(""); type = NewString(""); prefix = NewString(""); init = NewString(""); constructor_defined = 0; destructor_defined = 0; } ~RClass() { Delete(name); Delete(cname); Delete(vname); Delete(mImpl); Delete(mname); Delete(type); Delete(prefix); Delete(init); Delete(temp); } void set_name(const_String_or_char_ptr cn, const_String_or_char_ptr rn, const_String_or_char_ptr valn) { /* Original C/C++ class (or struct) name */ Clear(cname); Append(cname, cn); /* Mangled name */ Delete(mname); mname = Swig_name_mangle(cname); /* Renamed class name */ Clear(name); Append(name, valn); /* Variable name for the VALUE that refers to the Ruby Class object */ Clear(vname); Printf(vname, "SwigClass%s.klass", name); /* Variable name for the VALUE that refers to the Ruby Class object */ Clear(mImpl); Printf(mImpl, "SwigClass%s.mImpl", name); /* Prefix */ Clear(prefix); Printv(prefix, (rn ? rn : cn), "_", NIL); } char *strip(const_String_or_char_ptr s) { Clear(temp); Append(temp, s); if (Strncmp(s, prefix, Len(prefix)) == 0) { Replaceall(temp, prefix, ""); } return Char(temp); } }; /* flags for the make_autodoc function */ enum autodoc_t { AUTODOC_CLASS, AUTODOC_CTOR, AUTODOC_DTOR, AUTODOC_STATICFUNC, AUTODOC_FUNC, AUTODOC_METHOD, AUTODOC_GETTER, AUTODOC_SETTER, AUTODOC_NONE }; static const char *usage = "\ Ruby Options (available with -ruby)\n\ -autorename - Enable renaming of classes and methods to follow Ruby coding standards\n\ -globalmodule - Wrap everything into the global module\n\ -initname - Set entry function to Init_ (used by `require')\n\ -minherit - Attempt to support multiple inheritance\n\ -noautorename - Disable renaming of classes and methods (default)\n\ -prefix - Set a prefix to be prepended to all names\n\ "; #define RCLASS(hash, name) (RClass*)(Getattr(hash, name) ? Data(Getattr(hash, name)) : 0) #define SET_RCLASS(hash, name, klass) Setattr(hash, name, NewVoid(klass, 0)) class RUBY:public Language { private: String *module; String *modvar; String *feature; String *prefix; int current; Hash *classes; /* key=cname val=RClass */ RClass *klass; /* Currently processing class */ Hash *special_methods; /* Python style special method name table */ File *f_directors; File *f_directors_h; File *f_directors_helpers; File *f_begin; File *f_runtime; File *f_runtime_h; File *f_header; File *f_wrappers; File *f_init; File *f_initbeforefunc; bool useGlobalModule; bool multipleInheritance; // Wrap modes enum WrapperMode { NO_CPP, MEMBER_FUNC, CONSTRUCTOR_ALLOCATE, CONSTRUCTOR_INITIALIZE, DESTRUCTOR, MEMBER_VAR, CLASS_CONST, STATIC_FUNC, STATIC_VAR }; /* ------------------------------------------------------------ * autodoc level declarations * ------------------------------------------------------------ */ enum autodoc_l { NO_AUTODOC = -2, // no autodoc STRING_AUTODOC = -1, // use provided string NAMES_AUTODOC = 0, // only parameter names TYPES_AUTODOC = 1, // parameter names and types EXTEND_AUTODOC = 2, // extended documentation and parameter names EXTEND_TYPES_AUTODOC = 3 // extended documentation and parameter types + names }; autodoc_t last_mode; String* last_autodoc; autodoc_l autodoc_level(String *autodoc) { autodoc_l dlevel = NO_AUTODOC; char *c = Char(autodoc); if (c) { if (isdigit(c[0])) { dlevel = (autodoc_l) atoi(c); } else { if (strcmp(c, "extended") == 0) { dlevel = EXTEND_AUTODOC; } else { dlevel = STRING_AUTODOC; } } } return dlevel; } /* ------------------------------------------------------------ * have_docstring() * Check if there is a docstring directive and it has text, * or there is an autodoc flag set * ------------------------------------------------------------ */ bool have_docstring(Node *n) { String *str = Getattr(n, "feature:docstring"); return (str && Len(str) > 0) || (Getattr(n, "feature:autodoc") && !GetFlag(n, "feature:noautodoc")); } /* ------------------------------------------------------------ * docstring() * Get the docstring text, stripping off {} if necessary, * and enclose in triple double quotes. If autodoc is also * set then it will build a combined docstring. * ------------------------------------------------------------ */ String *docstring(Node *n, autodoc_t ad_type) { String *str = Getattr(n, "feature:docstring"); bool have_ds = (str && Len(str) > 0); bool have_auto = (Getattr(n, "feature:autodoc") && !GetFlag(n, "feature:noautodoc")); String *autodoc = NULL; String *doc = NULL; if (have_ds) { char *t = Char(str); if (*t == '{') { Delitem(str, 0); Delitem(str, DOH_END); } } if (have_auto) { autodoc = make_autodoc(n, ad_type); have_auto = (autodoc && Len(autodoc) > 0); } if (have_auto || have_ds) doc = NewString("/*"); if (have_auto && have_ds) { // Both autodoc and docstring are present Printv(doc, "\n", autodoc, "\n", str, "\n", NIL); } else if (!have_auto && have_ds) { // only docstring Printv(doc, str, NIL); } else if (have_auto && !have_ds) { // only autodoc Printv(doc, "\n", autodoc, "\n", NIL); } else { doc = NewString(""); } if (have_auto || have_ds) Append(doc, "*/\n"); // Save the generated strings in the parse tree in case they are used later // by post processing tools Setattr(n, "ruby:docstring", doc); Setattr(n, "ruby:autodoc", autodoc); return doc; } /* ----------------------------------------------------------------------------- * addMissingParameterNames() * For functions that have not had nameless parameters set in the Language class. * * Inputs: * plist - entire parameter list * arg_offset - argument number for first parameter * Side effects: * The "lname" attribute in each parameter in plist will be contain a parameter name * ----------------------------------------------------------------------------- */ void addMissingParameterNames(Node* n, ParmList *plist, int arg_offset) { Parm *p = plist; int i = arg_offset; while (p) { if (!Getattr(p, "lname")) { String *name = makeParameterName(n, p, i); Setattr(p, "lname", name); Delete(name); } i++; p = nextSibling(p); } } /* ------------------------------------------------------------ * make_autodocParmList() * Generate the documentation for the function parameters * ------------------------------------------------------------ */ String *make_autodocParmList(Node *n, bool showTypes) { String *doc = NewString(""); String *pdocs = 0; ParmList *plist = CopyParmList(Getattr(n, "parms")); Parm *p; Parm *pnext; int lines = 0; int arg_num = is_wrapping_class() ? 1 : 0; const int maxwidth = 80; addMissingParameterNames(n, plist, arg_num); // for $1_name substitutions done in Swig_typemap_attach_parms Swig_typemap_attach_parms("in", plist, 0); Swig_typemap_attach_parms("doc", plist, 0); if (Strcmp(ParmList_protostr(plist), "void") == 0) { //No parameters actually return doc; } for (p = plist; p; p = pnext, arg_num++) { String *tm = Getattr(p, "tmap:in"); if (tm) { pnext = Getattr(p, "tmap:in:next"); if (checkAttribute(p, "tmap:in:numinputs", "0")) { continue; } } else { pnext = nextSibling(p); } String *name = 0; String *type = 0; String *value = 0; String *pdoc = Getattr(p, "tmap:doc"); if (pdoc) { name = Getattr(p, "tmap:doc:name"); type = Getattr(p, "tmap:doc:type"); value = Getattr(p, "tmap:doc:value"); } // Note: the generated name should be consistent with that in kwnames[] String *made_name = 0; if (!name) { name = made_name = makeParameterName(n, p, arg_num); } type = type ? type : Getattr(p, "type"); value = value ? value : Getattr(p, "value"); if (SwigType_isvarargs(type)) break; // Skip the 'self' parameter which in ruby is implicit if ( Cmp(name, "self") == 0 ) continue; // Make __p parameters just p (as used in STL) Replace( name, "__", "", DOH_REPLACE_FIRST ); if (Len(doc)) { // add a comma to the previous one if any Append(doc, ", "); // Do we need to wrap a long line? if ((Len(doc) - lines * maxwidth) > maxwidth) { Printf(doc, "\n%s", tab4); lines += 1; } } // Do the param type too? Node *nn = classLookup(Getattr(p, "type")); String *type_str = nn ? Copy(Getattr(nn, "sym:name")) : SwigType_str(type, 0); if (showTypes) Printf(doc, "%s ", type_str); Append(doc, name); if (pdoc) { if (!pdocs) pdocs = NewString("Parameters:\n"); Printf(pdocs, " %s.\n", pdoc); } if (value) { String *new_value = convertValue(value, Getattr(p, "type")); if (new_value) { value = new_value; } else { Node *lookup = Swig_symbol_clookup(value, 0); if (lookup) value = Getattr(lookup, "sym:name"); } Printf(doc, "=%s", value); } Delete(type_str); Delete(made_name); } if (pdocs) Setattr(n, "feature:pdocs", pdocs); Delete(plist); return doc; } /* ------------------------------------------------------------ * make_autodoc() * Build a docstring for the node, using parameter and other * info in the parse tree. If the value of the autodoc * attribute is "0" then do not include parameter types, if * it is "1" (the default) then do. If it has some other * value then assume it is supplied by the extension writer * and use it directly. * ------------------------------------------------------------ */ String *make_autodoc(Node *n, autodoc_t ad_type) { int extended = 0; // If the function is overloaded then this function is called // for the last one. Rewind to the first so the docstrings are // in order. while (Getattr(n, "sym:previousSibling")) n = Getattr(n, "sym:previousSibling"); Node *pn = Swig_methodclass(n); String* super_names = NewString(""); String* class_name = Getattr(pn, "sym:name") ; if ( !class_name ) { class_name = NewString(""); } else { class_name = Copy(class_name); List *baselist = Getattr(pn, "bases"); if (baselist && Len(baselist)) { Iterator base = First(baselist); while (base.item && GetFlag(base.item, "feature:ignore")) { base = Next(base); } int count = 0; for ( ;base.item; ++count) { if ( count ) Append(super_names, ", "); String *basename = Getattr(base.item, "sym:name"); String* basenamestr = NewString(basename); Node* parent = parentNode(base.item); while (parent) { String *parent_name = Copy( Getattr(parent, "sym:name") ); if ( !parent_name ) { Node* mod = Getattr(parent, "module"); if ( mod ) parent_name = Copy( Getattr(mod, "name") ); if ( parent_name ) (Char(parent_name))[0] = (char)toupper((Char(parent_name))[0]); } if ( parent_name ) { Insert(basenamestr, 0, "::"); Insert(basenamestr, 0, parent_name); Delete(parent_name); } parent = parentNode(parent); } Append(super_names, basenamestr ); Delete(basenamestr); base = Next(base); } } } String* full_name; if ( module ) { full_name = NewString(module); if (Len(class_name) > 0) Append(full_name, "::"); } else full_name = NewString(""); Append(full_name, class_name); String* symname = Getattr(n, "sym:name"); if ( Getattr( special_methods, symname ) ) symname = Getattr( special_methods, symname ); String* methodName = NewString(full_name); Append(methodName, symname); // Each overloaded function will try to get documented, // so we keep the name of the last overloaded function and its type. // Documenting just from functionWrapper() is not possible as // sym:name has already been changed to include the class name if ( last_mode == ad_type && Cmp(methodName, last_autodoc) == 0 ) { Delete(full_name); Delete(class_name); Delete(super_names); Delete(methodName); return NewString(""); } last_mode = ad_type; last_autodoc = Copy(methodName); String *doc = NewString(""); int counter = 0; bool skipAuto = false; Node* on = n; for ( ; n; ++counter ) { String *type_str = NULL; skipAuto = false; bool showTypes = false; String *autodoc = Getattr(n, "feature:autodoc"); autodoc_l dlevel = autodoc_level(autodoc); switch (dlevel) { case NO_AUTODOC: break; case NAMES_AUTODOC: showTypes = false; break; case TYPES_AUTODOC: showTypes = true; break; case EXTEND_AUTODOC: extended = 1; showTypes = false; break; case EXTEND_TYPES_AUTODOC: extended = 1; showTypes = true; break; case STRING_AUTODOC: skipAuto = true; break; } SwigType *type = Getattr(n, "type"); if (type) { if (Strcmp(type, "void") == 0) { type_str = NULL; } else { SwigType *qt = SwigType_typedef_resolve_all(type); if (SwigType_isenum(qt)) { type_str = NewString("int"); } else { Node *nn = classLookup(type); type_str = nn ? Copy(Getattr(nn, "sym:name")) : SwigType_str(type, 0); } } } if (counter == 0) { switch (ad_type) { case AUTODOC_CLASS: Printf(doc, " Document-class: %s", full_name); if ( Len(super_names) > 0 ) Printf( doc, " < %s", super_names); Append(doc, "\n\n"); break; case AUTODOC_CTOR: Printf(doc, " Document-method: %s.new\n\n", full_name); break; case AUTODOC_DTOR: break; case AUTODOC_STATICFUNC: Printf(doc, " Document-method: %s.%s\n\n", full_name, symname); break; case AUTODOC_FUNC: case AUTODOC_METHOD: case AUTODOC_GETTER: Printf(doc, " Document-method: %s.%s\n\n", full_name, symname); break; case AUTODOC_SETTER: Printf(doc, " Document-method: %s.%s=\n\n", full_name, symname); break; case AUTODOC_NONE: break; } } if (skipAuto) { if ( counter == 0 ) Printf(doc, " call-seq:\n"); switch( ad_type ) { case AUTODOC_STATICFUNC: case AUTODOC_FUNC: case AUTODOC_METHOD: case AUTODOC_GETTER: { String *paramList = make_autodocParmList(n, showTypes); if (Len(paramList)) Printf(doc, " %s(%s)", symname, paramList); else Printf(doc, " %s", symname); if (type_str) Printf(doc, " -> %s", type_str); break; } case AUTODOC_SETTER: { Printf(doc, " %s=(x)", symname); if (type_str) Printf(doc, " -> %s", type_str); break; } default: break; } } else { switch (ad_type) { case AUTODOC_CLASS: { // Only do the autodoc if there isn't a docstring for the class String *str = Getattr(n, "feature:docstring"); if (counter == 0 && (str == 0 || Len(str) == 0)) { if (CPlusPlus) { Printf(doc, " Proxy of C++ %s class", full_name); } else { Printf(doc, " Proxy of C %s struct", full_name); } } } break; case AUTODOC_CTOR: if (counter == 0) Printf(doc, " call-seq:\n"); if (Strcmp(class_name, symname) == 0) { String *paramList = make_autodocParmList(n, showTypes); if (Len(paramList)) Printf(doc, " %s.new(%s)", class_name, paramList); else Printf(doc, " %s.new", class_name); } else { Printf(doc, " %s.new(%s)", class_name, make_autodocParmList(n, showTypes)); } break; case AUTODOC_DTOR: break; case AUTODOC_STATICFUNC: case AUTODOC_FUNC: case AUTODOC_METHOD: case AUTODOC_GETTER: { if (counter == 0) Printf(doc, " call-seq:\n"); String *paramList = make_autodocParmList(n, showTypes); if (Len(paramList)) Printf(doc, " %s(%s)", symname, paramList); else Printf(doc, " %s", symname); if (type_str) Printf(doc, " -> %s", type_str); break; } case AUTODOC_SETTER: { Printf(doc, " call-seq:\n"); Printf(doc, " %s=(x)", symname); if (type_str) Printf(doc, " -> %s", type_str); break; } case AUTODOC_NONE: break; } } // if it's overloaded then get the next decl and loop around again n = Getattr(n, "sym:nextSibling"); if (n) Append(doc, "\n"); Delete(type_str); } Printf(doc, "\n\n"); if (!skipAuto) { switch (ad_type) { case AUTODOC_CLASS: case AUTODOC_DTOR: break; case AUTODOC_CTOR: Printf(doc, "Class constructor.\n"); break; case AUTODOC_STATICFUNC: Printf(doc, "A class method.\n"); break; case AUTODOC_FUNC: Printf(doc, "A module function.\n"); break; case AUTODOC_METHOD: Printf(doc, "An instance method.\n"); break; case AUTODOC_GETTER: Printf(doc, "Get value of attribute.\n"); break; case AUTODOC_SETTER: Printf(doc, "Set new value for attribute.\n"); break; case AUTODOC_NONE: break; } } n = on; while ( n ) { String *autodoc = Getattr(n, "feature:autodoc"); autodoc_l dlevel = autodoc_level(autodoc); switch (dlevel) { case NO_AUTODOC: case NAMES_AUTODOC: case TYPES_AUTODOC: extended = 0; break; case STRING_AUTODOC: extended = 2; Replaceall( autodoc, "$class", class_name ); Printv(doc, autodoc, ".", NIL); break; case EXTEND_AUTODOC: case EXTEND_TYPES_AUTODOC: extended = 1; break; } if (extended) { String *pdocs = Getattr(n, "feature:pdocs"); if (pdocs) { Printv(doc, "\n\n", pdocs, NULL); break; } if ( extended == 2 ) break; } n = Getattr(n, "sym:nextSibling"); } Delete(full_name); Delete(class_name); Delete(super_names); Delete(methodName); return doc; } /* ------------------------------------------------------------ * convertValue() * Check if string v can be a Ruby value literal, * (eg. number or string), or translate it to a Ruby literal. * ------------------------------------------------------------ */ String *convertValue(String *v, SwigType *t) { if (v && Len(v) > 0) { char fc = (Char(v))[0]; if (('0' <= fc && fc <= '9') || '\'' == fc || '"' == fc) { /* number or string (or maybe NULL pointer) */ if (SwigType_ispointer(t) && Strcmp(v, "0") == 0) return NewString("None"); else return v; } if (Strcmp(v, "NULL") == 0 || Strcmp(v, "nullptr") == 0) return SwigType_ispointer(t) ? NewString("nil") : NewString("0"); if (Strcmp(v, "true") == 0 || Strcmp(v, "TRUE") == 0) return NewString("True"); if (Strcmp(v, "false") == 0 || Strcmp(v, "FALSE") == 0) return NewString("False"); } return 0; } public: /* --------------------------------------------------------------------- * RUBY() * * Initialize member data * --------------------------------------------------------------------- */ RUBY() : module(0), modvar(0), feature(0), prefix(0), current(0), classes(0), klass(0), special_methods(0), f_directors(0), f_directors_h(0), f_directors_helpers(0), f_begin(0), f_runtime(0), f_runtime_h(0), f_header(0), f_wrappers(0), f_init(0), f_initbeforefunc(0), useGlobalModule(false), multipleInheritance(false), last_mode(AUTODOC_NONE), last_autodoc(NewString("")) { current = NO_CPP; director_prot_ctor_code = NewString(""); Printv(director_prot_ctor_code, "if ( $comparison ) { /* subclassed */\n", " $director_new \n", "} else {\n", " rb_raise(rb_eRuntimeError,\"accessing abstract class or protected constructor\"); \n", " return Qnil;\n", "}\n", NIL); director_multiple_inheritance = 0; director_language = 1; } /* --------------------------------------------------------------------- * main() * * Parse command line options and initializes variables. * --------------------------------------------------------------------- */ virtual void main(int argc, char *argv[]) { int autorename = 0; /* Set location of SWIG library */ SWIG_library_directory("ruby"); /* Look for certain command line options */ for (int i = 1; i < argc; i++) { if (argv[i]) { if (strcmp(argv[i], "-initname") == 0) { if (argv[i + 1]) { char *name = argv[i + 1]; feature = NewString(name); Swig_mark_arg(i); Swig_mark_arg(i + 1); i++; } else { Swig_arg_error(); } } else if (strcmp(argv[i], "-feature") == 0) { fprintf( stderr, "Warning: Ruby -feature option is deprecated, " "please use -initname instead.\n"); if (argv[i + 1]) { char *name = argv[i + 1]; feature = NewString(name); Swig_mark_arg(i); Swig_mark_arg(i + 1); i++; } else { Swig_arg_error(); } } else if (strcmp(argv[i], "-globalmodule") == 0) { useGlobalModule = true; Swig_mark_arg(i); } else if (strcmp(argv[i], "-minherit") == 0) { multipleInheritance = true; director_multiple_inheritance = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-autorename") == 0) { autorename = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-noautorename") == 0) { autorename = 0; Swig_mark_arg(i); } else if (strcmp(argv[i], "-prefix") == 0) { if (argv[i + 1]) { char *name = argv[i + 1]; prefix = NewString(name); Swig_mark_arg(i); Swig_mark_arg(i + 1); i++; } else { Swig_arg_error(); } } else if (strcmp(argv[i], "-help") == 0) { Printf(stdout, "%s\n", usage); } else if (strcmp(argv[i], "-cppcast") == 0) { Printf(stderr, "Deprecated command line option: %s. This option is now always on.\n", argv[i]); Swig_mark_arg(i); } else if (strcmp(argv[i], "-nocppcast") == 0) { Printf(stderr, "Deprecated command line option: %s. This option is no longer supported.\n", argv[i]); Swig_mark_arg(i); SWIG_exit(EXIT_FAILURE); } } } if (autorename) { /* Turn on the autorename mode */ Preprocessor_define((DOH *) "SWIG_RUBY_AUTORENAME", 0); } /* Add a symbol to the parser for conditional compilation */ Preprocessor_define("SWIGRUBY 1", 0); /* Add typemap definitions */ SWIG_typemap_lang("ruby"); SWIG_config_file("ruby.swg"); allow_overloading(); } /** * Generate initialization code to define the Ruby module(s), * accounting for nested modules as necessary. */ void defineRubyModule() { List *modules = Split(module, ':', INT_MAX); if (modules != 0 && Len(modules) > 0) { String *mv = 0; Iterator m; m = First(modules); while (m.item) { if (Len(m.item) > 0) { if (mv != 0) { Printv(f_init, tab4, modvar, " = rb_define_module_under(", modvar, ", \"", m.item, "\");\n", NIL); } else { Printv(f_init, tab4, modvar, " = rb_define_module(\"", m.item, "\");\n", NIL); mv = NewString(modvar); } } m = Next(m); } Delete(mv); Delete(modules); } } void registerMagicMethods() { special_methods = NewHash(); /* Python->Ruby style special method name. */ /* Basic */ Setattr(special_methods, "__repr__", "inspect"); Setattr(special_methods, "__str__", "to_s"); Setattr(special_methods, "__cmp__", "<=>"); Setattr(special_methods, "__hash__", "hash"); Setattr(special_methods, "__nonzero__", "nonzero?"); /* Callable */ Setattr(special_methods, "__call__", "call"); /* Collection */ Setattr(special_methods, "__len__", "length"); Setattr(special_methods, "__getitem__", "[]"); Setattr(special_methods, "__setitem__", "[]="); /* Operators */ Setattr(special_methods, "__add__", "+"); Setattr(special_methods, "__pos__", "+@"); Setattr(special_methods, "__sub__", "-"); Setattr(special_methods, "__neg__", "-@"); Setattr(special_methods, "__mul__", "*"); Setattr(special_methods, "__div__", "/"); Setattr(special_methods, "__mod__", "%"); Setattr(special_methods, "__lshift__", "<<"); Setattr(special_methods, "__rshift__", ">>"); Setattr(special_methods, "__and__", "&"); Setattr(special_methods, "__or__", "|"); Setattr(special_methods, "__xor__", "^"); Setattr(special_methods, "__invert__", "~"); Setattr(special_methods, "__lt__", "<"); Setattr(special_methods, "__le__", "<="); Setattr(special_methods, "__gt__", ">"); Setattr(special_methods, "__ge__", ">="); Setattr(special_methods, "__eq__", "=="); /* Other numeric */ Setattr(special_methods, "__divmod__", "divmod"); Setattr(special_methods, "__pow__", "**"); Setattr(special_methods, "__abs__", "abs"); Setattr(special_methods, "__int__", "to_i"); Setattr(special_methods, "__float__", "to_f"); Setattr(special_methods, "__coerce__", "coerce"); } /* --------------------------------------------------------------------- * top() * --------------------------------------------------------------------- */ virtual int top(Node *n) { String *mod_docstring = NULL; /** * See if any Ruby module options have been specified as options * to the %module directive. */ Node *swigModule = Getattr(n, "module"); if (swigModule) { Node *options = Getattr(swigModule, "options"); if (options) { if (Getattr(options, "directors")) { allow_directors(); } if (Getattr(options, "dirprot")) { allow_dirprot(); } if (Getattr(options, "ruby_globalmodule")) { useGlobalModule = true; } if (Getattr(options, "ruby_minherit")) { multipleInheritance = true; director_multiple_inheritance = 1; } mod_docstring = Getattr(options, "docstring"); } } /* Set comparison with none for ConstructorToFunction */ setSubclassInstanceCheck(NewStringf("strcmp(rb_obj_classname(self), classname) != 0")); // setSubclassInstanceCheck(NewString("CLASS_OF(self) != cFoo.klass")); /* Initialize all of the output files */ String *outfile = Getattr(n, "outfile"); String *outfile_h = Getattr(n, "outfile_h"); if (!outfile) { Printf(stderr, "Unable to determine outfile\n"); SWIG_exit(EXIT_FAILURE); } f_begin = NewFile(outfile, "w", SWIG_output_files()); if (!f_begin) { FileErrorDisplay(outfile); SWIG_exit(EXIT_FAILURE); } f_runtime = NewString(""); f_init = NewString(""); f_header = NewString(""); f_wrappers = NewString(""); f_directors_h = NewString(""); f_directors = NewString(""); f_directors_helpers = NewString(""); f_initbeforefunc = NewString(""); if (directorsEnabled()) { if (!outfile_h) { Printf(stderr, "Unable to determine outfile_h\n"); SWIG_exit(EXIT_FAILURE); } f_runtime_h = NewFile(outfile_h, "w", SWIG_output_files()); if (!f_runtime_h) { FileErrorDisplay(outfile_h); SWIG_exit(EXIT_FAILURE); } } /* Register file targets with the SWIG file handler */ Swig_register_filebyname("header", f_header); Swig_register_filebyname("wrapper", f_wrappers); Swig_register_filebyname("begin", f_begin); Swig_register_filebyname("runtime", f_runtime); Swig_register_filebyname("init", f_init); Swig_register_filebyname("director", f_directors); Swig_register_filebyname("director_h", f_directors_h); Swig_register_filebyname("director_helpers", f_directors_helpers); Swig_register_filebyname("initbeforefunc", f_initbeforefunc); modvar = 0; current = NO_CPP; klass = 0; classes = NewHash(); registerMagicMethods(); Swig_banner(f_begin); Printf(f_runtime, "\n\n#ifndef SWIGRUBY\n#define SWIGRUBY\n#endif\n\n"); if (directorsEnabled()) { Printf(f_runtime, "#define SWIG_DIRECTORS\n"); } Printf(f_runtime, "\n"); /* typedef void *VALUE */ SwigType *value = NewSwigType(T_VOID); SwigType_add_pointer(value); SwigType_typedef(value, "VALUE"); Delete(value); /* Set module name */ set_module(Char(Getattr(n, "name"))); if (directorsEnabled()) { /* Build a version of the module name for use in a C macro name. */ String *module_macro = Copy(module); Replaceall(module_macro, "::", "__"); Swig_banner(f_directors_h); Printf(f_directors_h, "\n"); Printf(f_directors_h, "#ifndef SWIG_%s_WRAP_H_\n", module_macro); Printf(f_directors_h, "#define SWIG_%s_WRAP_H_\n\n", module_macro); Printf(f_directors_h, "namespace Swig {\n"); Printf(f_directors_h, " class Director;\n"); Printf(f_directors_h, "}\n\n"); Printf(f_directors_helpers, "/* ---------------------------------------------------\n"); Printf(f_directors_helpers, " * C++ director class helpers\n"); Printf(f_directors_helpers, " * --------------------------------------------------- */\n\n"); Printf(f_directors, "\n\n"); Printf(f_directors, "/* ---------------------------------------------------\n"); Printf(f_directors, " * C++ director class methods\n"); Printf(f_directors, " * --------------------------------------------------- */\n\n"); if (outfile_h) { String *filename = Swig_file_filename(outfile_h); Printf(f_directors, "#include \"%s\"\n\n", filename); Delete(filename); } Delete(module_macro); } Printf(f_header, "#define SWIG_init Init_%s\n", feature); Printf(f_header, "#define SWIG_name \"%s\"\n\n", module); if (mod_docstring) { if (Len(mod_docstring)) { Printf(f_header, "/*\n Document-module: %s\n\n%s\n*/\n", module, mod_docstring); } Delete(mod_docstring); mod_docstring = NULL; } Printf(f_header, "static VALUE %s;\n", modvar); /* Start generating the initialization function */ String* docs = docstring(n, AUTODOC_CLASS); Printf(f_init, "/*\n%s\n*/", docs ); Printv(f_init, "\n", "#ifdef __cplusplus\n", "extern \"C\"\n", "#endif\n", "SWIGEXPORT void Init_", feature, "(void) {\n", "size_t i;\n", "\n", NIL); Printv(f_init, tab4, "SWIG_InitRuntime();\n", NIL); if (!useGlobalModule) defineRubyModule(); Printv(f_init, "\n", "SWIG_InitializeModule(0);\n", "for (i = 0; i < swig_module.size; i++) {\n", "SWIG_define_class(swig_module.types[i]);\n", "}\n", NIL); Printf(f_init, "\n"); /* Initialize code to keep track of objects */ Printf(f_init, "SWIG_RubyInitializeTrackings();\n"); Language::top(n); if (directorsEnabled()) { // Insert director runtime into the f_runtime file (make it occur before %header section) Swig_insert_file("director_common.swg", f_runtime); Swig_insert_file("director.swg", f_runtime); } /* Finish off our init function */ Printf(f_init, "}\n"); SwigType_emit_type_table(f_runtime, f_wrappers); /* Close all of the files */ Dump(f_runtime, f_begin); Dump(f_header, f_begin); if (directorsEnabled()) { Dump(f_directors_helpers, f_begin); Dump(f_directors, f_begin); Dump(f_directors_h, f_runtime_h); Printf(f_runtime_h, "\n"); Printf(f_runtime_h, "#endif\n"); Delete(f_runtime_h); } Dump(f_wrappers, f_begin); Dump(f_initbeforefunc, f_begin); Wrapper_pretty_print(f_init, f_begin); Delete(f_header); Delete(f_wrappers); Delete(f_init); Delete(f_initbeforefunc); Delete(f_runtime); Delete(f_begin); return SWIG_OK; } /* ----------------------------------------------------------------------------- * importDirective() * ----------------------------------------------------------------------------- */ virtual int importDirective(Node *n) { String *modname = Getattr(n, "module"); if (modname) { if (prefix) { Insert(modname, 0, prefix); } List *modules = Split(modname, ':', INT_MAX); if (modules && Len(modules) > 0) { modname = NewString(""); String *last = NULL; Iterator m = First(modules); while (m.item) { if (Len(m.item) > 0) { if (last) { Append(modname, "/"); } Append(modname, m.item); last = m.item; } m = Next(m); } Printf(f_init, "rb_require(\"%s\");\n", modname); Delete(modname); } Delete(modules); } return Language::importDirective(n); } /* --------------------------------------------------------------------- * set_module(const char *mod_name) * * Sets the module name. Does nothing if it's already set (so it can * be overridden as a command line option). *---------------------------------------------------------------------- */ void set_module(const char *s) { String *mod_name = NewString(s); if (module == 0) { /* Start with the empty string */ module = NewString(""); if (prefix) { Insert(mod_name, 0, prefix); } /* Account for nested modules */ List *modules = Split(mod_name, ':', INT_MAX); if (modules != 0 && Len(modules) > 0) { String *last = 0; Iterator m = First(modules); while (m.item) { if (Len(m.item) > 0) { String *cap = NewString(m.item); (Char(cap))[0] = (char)toupper((Char(cap))[0]); if (last != 0) { Append(module, "::"); } Append(module, cap); last = m.item; } m = Next(m); } if (last) { if (feature == 0) { feature = Copy(last); } (Char(last))[0] = (char)toupper((Char(last))[0]); modvar = NewStringf("m%s", last); } } Delete(modules); } Delete(mod_name); } /* -------------------------------------------------------------------------- * nativeWrapper() * -------------------------------------------------------------------------- */ virtual int nativeWrapper(Node *n) { String *funcname = Getattr(n, "wrap:name"); Swig_warning(WARN_LANG_NATIVE_UNIMPL, input_file, line_number, "Adding native function %s not supported (ignored).\n", funcname); return SWIG_NOWRAP; } /** * Process the comma-separated list of aliases (if any). */ void defineAliases(Node *n, const_String_or_char_ptr iname) { String *aliasv = Getattr(n, "feature:alias"); if (aliasv) { List *aliases = Split(aliasv, ',', INT_MAX); if (aliases && Len(aliases) > 0) { Iterator alias = First(aliases); while (alias.item) { if (Len(alias.item) > 0) { if (current == NO_CPP) { if (useGlobalModule) { Printv(f_init, tab4, "rb_define_alias(rb_cObject, \"", alias.item, "\", \"", iname, "\");\n", NIL); } else { Printv(f_init, tab4, "rb_define_alias(rb_singleton_class(", modvar, "), \"", alias.item, "\", \"", iname, "\");\n", NIL); } } else if (multipleInheritance) { Printv(klass->init, tab4, "rb_define_alias(", klass->mImpl, ", \"", alias.item, "\", \"", iname, "\");\n", NIL); } else { Printv(klass->init, tab4, "rb_define_alias(", klass->vname, ", \"", alias.item, "\", \"", iname, "\");\n", NIL); } } alias = Next(alias); } } Delete(aliases); } } /* --------------------------------------------------------------------- * create_command(Node *n, char *iname) * * Creates a new command from a C function. * iname = Name of function in scripting language * * A note about what "protected" and "private" mean in Ruby: * * A private method is accessible only within the class or its subclasses, * and it is callable only in "function form", with 'self' (implicit or * explicit) as a receiver. * * A protected method is callable only from within its class, but unlike * a private method, it can be called with a receiver other than self, such * as another instance of the same class. * --------------------------------------------------------------------- */ void create_command(Node *n, const_String_or_char_ptr iname) { String *alloc_func = Swig_name_wrapper(iname); String *wname = Swig_name_wrapper(iname); if (CPlusPlus) { Insert(wname, 0, "VALUEFUNC("); Append(wname, ")"); } if (current != NO_CPP) iname = klass->strip(iname); if (Getattr(special_methods, iname)) { iname = GetChar(special_methods, iname); } String *s = NewString(""); String *temp = NewString(""); #ifdef SWIG_PROTECTED_TARGET_METHODS const char *rb_define_method = is_public(n) ? "rb_define_method" : "rb_define_protected_method"; #else const char *rb_define_method = "rb_define_method"; #endif switch (current) { case MEMBER_FUNC: { if (multipleInheritance) { Printv(klass->init, tab4, rb_define_method, "(", klass->mImpl, ", \"", iname, "\", ", wname, ", -1);\n", NIL); } else { Printv(klass->init, tab4, rb_define_method, "(", klass->vname, ", \"", iname, "\", ", wname, ", -1);\n", NIL); } } break; case CONSTRUCTOR_ALLOCATE: Printv(s, tab4, "rb_define_alloc_func(", klass->vname, ", ", alloc_func, ");\n", NIL); Replaceall(klass->init, "$allocator", s); break; case CONSTRUCTOR_INITIALIZE: Printv(s, tab4, rb_define_method, "(", klass->vname, ", \"initialize\", ", wname, ", -1);\n", NIL); Replaceall(klass->init, "$initializer", s); break; case MEMBER_VAR: Append(temp, iname); /* Check for _set or _get at the end of the name. */ if (Len(temp) > 4) { const char *p = Char(temp) + (Len(temp) - 4); if (strcmp(p, "_set") == 0) { Delslice(temp, Len(temp) - 4, DOH_END); Append(temp, "="); } else if (strcmp(p, "_get") == 0) { Delslice(temp, Len(temp) - 4, DOH_END); } } if (multipleInheritance) { Printv(klass->init, tab4, "rb_define_method(", klass->mImpl, ", \"", temp, "\", ", wname, ", -1);\n", NIL); } else { Printv(klass->init, tab4, "rb_define_method(", klass->vname, ", \"", temp, "\", ", wname, ", -1);\n", NIL); } break; case STATIC_FUNC: Printv(klass->init, tab4, "rb_define_singleton_method(", klass->vname, ", \"", iname, "\", ", wname, ", -1);\n", NIL); break; case NO_CPP: if (!useGlobalModule) { Printv(s, tab4, "rb_define_module_function(", modvar, ", \"", iname, "\", ", wname, ", -1);\n", NIL); Printv(f_init, s, NIL); } else { Printv(s, tab4, "rb_define_global_function(\"", iname, "\", ", wname, ", -1);\n", NIL); Printv(f_init, s, NIL); } break; case DESTRUCTOR: case CLASS_CONST: case STATIC_VAR: default: assert(false); // Should not have gotten here for these types } defineAliases(n, iname); Delete(temp); Delete(s); Delete(wname); Delete(alloc_func); } /* --------------------------------------------------------------------- * applyInputTypemap() * * Look up the appropriate "in" typemap for this parameter (p), * substitute the correct strings for the $target and $input typemap * parameters, and dump the resulting code to the wrapper file. * --------------------------------------------------------------------- */ Parm *applyInputTypemap(Parm *p, String *ln, String *source, Wrapper *f, String *symname) { String *tm; SwigType *pt = Getattr(p, "type"); if ((tm = Getattr(p, "tmap:in"))) { Replaceall(tm, "$target", ln); Replaceall(tm, "$source", source); Replaceall(tm, "$input", source); Replaceall(tm, "$symname", symname); if (Getattr(p, "wrap:disown") || (Getattr(p, "tmap:in:disown"))) { Replaceall(tm, "$disown", "SWIG_POINTER_DISOWN"); } else { Replaceall(tm, "$disown", "0"); } Setattr(p, "emit:input", Copy(source)); Printf(f->code, "%s\n", tm); p = Getattr(p, "tmap:in:next"); } else { Swig_warning(WARN_TYPEMAP_IN_UNDEF, input_file, line_number, "Unable to use type %s as a function argument.\n", SwigType_str(pt, 0)); p = nextSibling(p); } return p; } Parm *skipIgnoredArgs(Parm *p) { while (checkAttribute(p, "tmap:in:numinputs", "0")) { p = Getattr(p, "tmap:in:next"); } return p; } /* --------------------------------------------------------------------- * marshalInputArgs() * * Process all of the arguments passed into the scripting language * method and convert them into C/C++ function arguments using the * supplied typemaps. * --------------------------------------------------------------------- */ void marshalInputArgs(Node *n, ParmList *l, int numarg, int numreq, String *kwargs, bool allow_kwargs, Wrapper *f) { int i; Parm *p; String *tm; String *source; String *target; source = NewString(""); target = NewString(""); bool ctor_director = (current == CONSTRUCTOR_INITIALIZE && Swig_directorclass(n)); /** * The 'start' value indicates which of the C/C++ function arguments * produced here corresponds to the first value in Ruby's argv[] array. * The value of start is either zero or one. If start is zero, then * the first argument (with name arg1) is based on the value of argv[0]. * If start is one, then arg1 is based on the value of argv[1]. */ int start = (current == MEMBER_FUNC || current == MEMBER_VAR || ctor_director) ? 1 : 0; int varargs = emit_isvarargs(l); Printf(kwargs, "{ "); for (i = 0, p = l; i < numarg; i++) { p = skipIgnoredArgs(p); String *pn = Getattr(p, "name"); String *ln = Getattr(p, "lname"); /* Produce string representation of source argument */ Clear(source); /* First argument is a special case */ if (i == 0) { Printv(source, (start == 0) ? "argv[0]" : "self", NIL); } else { Printf(source, "argv[%d]", i - start); } /* Produce string representation of target argument */ Clear(target); Printf(target, "%s", Char(ln)); if (i >= (numreq)) { /* Check if parsing an optional argument */ Printf(f->code, " if (argc > %d) {\n", i - start); } /* Record argument name for keyword argument handling */ if (Len(pn)) { Printf(kwargs, "\"%s\",", pn); } else { Printf(kwargs, "\"arg%d\",", i + 1); } /* Look for an input typemap */ p = applyInputTypemap(p, ln, source, f, Getattr(n, "name")); if (i >= numreq) { Printf(f->code, "}\n"); } } /* Finish argument marshalling */ Printf(kwargs, " NULL }"); if (allow_kwargs) { // kwarg support not implemented // Printv(f->locals, tab4, "const char *kwnames[] = ", kwargs, ";\n", NIL); } /* Trailing varargs */ if (varargs) { if (p && (tm = Getattr(p, "tmap:in"))) { Clear(source); Printf(source, "argv[%d]", i - start); Replaceall(tm, "$input", source); Setattr(p, "emit:input", Copy(source)); Printf(f->code, "if (argc > %d) {\n", i - start); Printv(f->code, tm, "\n", NIL); Printf(f->code, "}\n"); } } Delete(source); Delete(target); } /* --------------------------------------------------------------------- * insertConstraintCheckingCode(ParmList *l, Wrapper *f) * * Checks each of the parameters in the parameter list for a "check" * typemap and (if it finds one) inserts the typemapping code into * the function wrapper. * --------------------------------------------------------------------- */ void insertConstraintCheckingCode(ParmList *l, Wrapper *f) { Parm *p; String *tm; for (p = l; p;) { if ((tm = Getattr(p, "tmap:check"))) { Replaceall(tm, "$target", Getattr(p, "lname")); Printv(f->code, tm, "\n", NIL); p = Getattr(p, "tmap:check:next"); } else { p = nextSibling(p); } } } /* --------------------------------------------------------------------- * insertCleanupCode(ParmList *l, String *cleanup) * * Checks each of the parameters in the parameter list for a "freearg" * typemap and (if it finds one) inserts the typemapping code into * the function wrapper. * --------------------------------------------------------------------- */ void insertCleanupCode(ParmList *l, String *cleanup) { String *tm; for (Parm *p = l; p;) { if ((tm = Getattr(p, "tmap:freearg"))) { if (Len(tm) != 0) { Replaceall(tm, "$source", Getattr(p, "lname")); Printv(cleanup, tm, "\n", NIL); } p = Getattr(p, "tmap:freearg:next"); } else { p = nextSibling(p); } } } /* --------------------------------------------------------------------- * insertArgOutputCode(ParmList *l, String *outarg, int& need_result) * * Checks each of the parameters in the parameter list for a "argout" * typemap and (if it finds one) inserts the typemapping code into * the function wrapper. * --------------------------------------------------------------------- */ void insertArgOutputCode(ParmList *l, String *outarg, int &need_result) { String *tm; for (Parm *p = l; p;) { if ((tm = Getattr(p, "tmap:argout"))) { Replaceall(tm, "$source", Getattr(p, "lname")); Replaceall(tm, "$target", "vresult"); Replaceall(tm, "$result", "vresult"); Replaceall(tm, "$arg", Getattr(p, "emit:input")); Replaceall(tm, "$input", Getattr(p, "emit:input")); Printv(outarg, tm, "\n", NIL); need_result += 1; p = Getattr(p, "tmap:argout:next"); } else { p = nextSibling(p); } } } /* --------------------------------------------------------------------- * validIdentifier() * * Is this a valid identifier in the scripting language? * Ruby method names can include any combination of letters, numbers * and underscores. A Ruby method name may optionally end with * a question mark ("?"), exclamation point ("!") or equals sign ("="). * * Methods whose names end with question marks are, by convention, * predicate methods that return true or false (e.g. Array#empty?). * * Methods whose names end with exclamation points are, by convention, * called bang methods that modify the instance in place (e.g. Array#sort!). * * Methods whose names end with an equals sign are attribute setters * (e.g. Thread#critical=). * --------------------------------------------------------------------- */ virtual int validIdentifier(String *s) { char *c = Char(s); while (*c) { if (!(isalnum(*c) || (*c == '_') || (*c == '?') || (*c == '!') || (*c == '='))) return 0; c++; } return 1; } /* --------------------------------------------------------------------- * functionWrapper() * * Create a function declaration and register it with the interpreter. * --------------------------------------------------------------------- */ virtual int functionWrapper(Node *n) { String *nodeType; bool destructor; String *symname = Copy(Getattr(n, "sym:name")); SwigType *t = Getattr(n, "type"); ParmList *l = Getattr(n, "parms"); int director_method = 0; String *tm; int need_result = 0; /* Ruby needs no destructor wrapper */ if (current == DESTRUCTOR) return SWIG_NOWRAP; nodeType = Getattr(n, "nodeType"); destructor = (!Cmp(nodeType, "destructor")); /* If the C++ class constructor is overloaded, we only want to * write out the "new" singleton method once since it is always * the same. (It's the "initialize" method that will handle the * overloading). */ if (current == CONSTRUCTOR_ALLOCATE && Swig_symbol_isoverloaded(n) && Getattr(n, "sym:nextSibling") != 0) return SWIG_OK; String *overname = 0; if (Getattr(n, "sym:overloaded")) { overname = Getattr(n, "sym:overname"); } else { if (!addSymbol(symname, n)) return SWIG_ERROR; } String *cleanup = NewString(""); String *outarg = NewString(""); String *kwargs = NewString(""); Wrapper *f = NewWrapper(); /* Rename predicate methods */ if (GetFlag(n, "feature:predicate")) { Append(symname, "?"); } /* Rename bang methods */ if (GetFlag(n, "feature:bang")) { Append(symname, "!"); } /* Determine the name of the SWIG wrapper function */ String *wname = Swig_name_wrapper(symname); if (overname && current != CONSTRUCTOR_ALLOCATE) { Append(wname, overname); } /* Emit arguments */ if (current != CONSTRUCTOR_ALLOCATE) { emit_parameter_variables(l, f); } /* Attach standard typemaps */ if (current != CONSTRUCTOR_ALLOCATE) { emit_attach_parmmaps(l, f); } Setattr(n, "wrap:parms", l); /* Get number of arguments */ int numarg = emit_num_arguments(l); int numreq = emit_num_required(l); int varargs = emit_isvarargs(l); bool allow_kwargs = GetFlag(n, "feature:kwargs") ? true : false; bool ctor_director = (current == CONSTRUCTOR_INITIALIZE && Swig_directorclass(n)); int start = (current == MEMBER_FUNC || current == MEMBER_VAR || ctor_director) ? 1 : 0; /* Now write the wrapper function itself */ if (current == CONSTRUCTOR_ALLOCATE) { Printv(f->def, "SWIGINTERN VALUE\n", NIL); Printf(f->def, "#ifdef HAVE_RB_DEFINE_ALLOC_FUNC\n"); Printv(f->def, wname, "(VALUE self)\n", NIL); Printf(f->def, "#else\n"); Printv(f->def, wname, "(int argc, VALUE *argv, VALUE self)\n", NIL); Printf(f->def, "#endif\n"); Printv(f->def, "{\n", NIL); } else if (current == CONSTRUCTOR_INITIALIZE) { Printv(f->def, "SWIGINTERN VALUE\n", wname, "(int argc, VALUE *argv, VALUE self) {", NIL); if (!varargs) { Printf(f->code, "if ((argc < %d) || (argc > %d)) ", numreq - start, numarg - start); } else { Printf(f->code, "if (argc < %d) ", numreq - start); } Printf(f->code, "{rb_raise(rb_eArgError, \"wrong # of arguments(%%d for %d)\",argc); SWIG_fail;}\n", numreq - start); } else { if ( current == NO_CPP ) { String* docs = docstring(n, AUTODOC_FUNC); Printf(f_wrappers, "%s", docs); Delete(docs); } Printv(f->def, "SWIGINTERN VALUE\n", wname, "(int argc, VALUE *argv, VALUE self) {", NIL); if (!varargs) { Printf(f->code, "if ((argc < %d) || (argc > %d)) ", numreq - start, numarg - start); } else { Printf(f->code, "if (argc < %d) ", numreq - start); } Printf(f->code, "{rb_raise(rb_eArgError, \"wrong # of arguments(%%d for %d)\",argc); SWIG_fail;}\n", numreq - start); } /* Now walk the function parameter list and generate code */ /* to get arguments */ if (current != CONSTRUCTOR_ALLOCATE) { marshalInputArgs(n, l, numarg, numreq, kwargs, allow_kwargs, f); } // FIXME? if (ctor_director) { numarg--; numreq--; } /* Insert constraint checking code */ insertConstraintCheckingCode(l, f); /* Insert cleanup code */ insertCleanupCode(l, cleanup); /* Insert argument output code */ insertArgOutputCode(l, outarg, need_result); /* if the object is a director, and the method call originated from its * underlying Ruby object, resolve the call by going up the c++ * inheritance chain. otherwise try to resolve the method in Ruby. * without this check an infinite loop is set up between the director and * shadow class method calls. */ // NOTE: this code should only be inserted if this class is the // base class of a director class. however, in general we haven't // yet analyzed all classes derived from this one to see if they are // directors. furthermore, this class may be used as the base of // a director class defined in a completely different module at a // later time, so this test must be included whether or not directorbase // is true. we do skip this code if directors have not been enabled // at the command line to preserve source-level compatibility with // non-polymorphic swig. also, if this wrapper is for a smart-pointer // method, there is no need to perform the test since the calling object // (the smart-pointer) and the director object (the "pointee") are // distinct. director_method = is_member_director(n) && !is_smart_pointer() && !destructor; if (director_method) { Wrapper_add_local(f, "director", "Swig::Director *director = 0"); Printf(f->code, "director = dynamic_cast(arg1);\n"); Wrapper_add_local(f, "upcall", "bool upcall = false"); Append(f->code, "upcall = (director && (director->swig_get_self() == self));\n"); } /* Now write code to make the function call */ if (current != CONSTRUCTOR_ALLOCATE) { if (current == CONSTRUCTOR_INITIALIZE) { Node *pn = Swig_methodclass(n); String *symname = Getattr(pn, "sym:name"); String *action = Getattr(n, "wrap:action"); if (directorsEnabled()) { String *classname = NewStringf("const char *classname SWIGUNUSED = \"%s::%s\"", module, symname); Wrapper_add_local(f, "classname", classname); } if (action) { SwigType *smart = Swig_cparse_smartptr(pn); String *result_name = NewStringf("%s%s", smart ? "smart" : "", Swig_cresult_name()); if (smart) { String *result_var = NewStringf("%s *%s = 0", SwigType_namestr(smart), result_name); Wrapper_add_local(f, result_name, result_var); Printf(action, "\n%s = new %s(%s);", result_name, SwigType_namestr(smart), Swig_cresult_name()); } Printf(action, "\nDATA_PTR(self) = %s;", result_name); if (GetFlag(pn, "feature:trackobjects")) { Printf(action, "\nSWIG_RubyAddTracking(%s, self);", result_name); } Delete(result_name); Delete(smart); } } /* Emit the function call */ if (director_method) { Printf(f->code, "try {\n"); } Setattr(n, "wrap:name", wname); Swig_director_emit_dynamic_cast(n, f); String *actioncode = emit_action(n); if (director_method) { Printf(actioncode, "} catch (Swig::DirectorException& e) {\n"); Printf(actioncode, " rb_exc_raise(e.getError());\n"); Printf(actioncode, " SWIG_fail;\n"); Printf(actioncode, "}\n"); } /* Return value if necessary */ if (SwigType_type(t) != T_VOID && current != CONSTRUCTOR_INITIALIZE) { need_result = 1; if (GetFlag(n, "feature:predicate")) { Printv(actioncode, tab4, "vresult = (", Swig_cresult_name(), " ? Qtrue : Qfalse);\n", NIL); } else { tm = Swig_typemap_lookup_out("out", n, Swig_cresult_name(), f, actioncode); actioncode = 0; if (tm) { Replaceall(tm, "$result", "vresult"); Replaceall(tm, "$source", Swig_cresult_name()); Replaceall(tm, "$target", "vresult"); if (GetFlag(n, "feature:new")) Replaceall(tm, "$owner", "SWIG_POINTER_OWN"); else Replaceall(tm, "$owner", "0"); #if 1 // FIXME: this will not try to unwrap directors returned as non-director // base class pointers! /* New addition to unwrap director return values so that the original * Ruby object is returned instead. */ bool unwrap = false; String *decl = Getattr(n, "decl"); int is_pointer = SwigType_ispointer_return(decl); int is_reference = SwigType_isreference_return(decl); if (is_pointer || is_reference) { String *type = Getattr(n, "type"); Node *parent = Swig_methodclass(n); Node *modname = Getattr(parent, "module"); Node *target = Swig_directormap(modname, type); if (target) unwrap = true; } if (unwrap) { Wrapper_add_local(f, "director", "Swig::Director *director = 0"); Printf(f->code, "director = dynamic_cast(%s);\n", Swig_cresult_name()); Printf(f->code, "if (director) {\n"); Printf(f->code, " vresult = director->swig_get_self();\n"); Printf(f->code, "} else {\n"); Printf(f->code, "%s\n", tm); Printf(f->code, "}\n"); director_method = 0; } else { Printf(f->code, "%s\n", tm); } #else Printf(f->code, "%s\n", tm); #endif Delete(tm); } else { Swig_warning(WARN_TYPEMAP_OUT_UNDEF, input_file, line_number, "Unable to use return type %s.\n", SwigType_str(t, 0)); } } } if (actioncode) { Append(f->code, actioncode); Delete(actioncode); } emit_return_variable(n, t, f); } /* Extra code needed for new and initialize methods */ if (current == CONSTRUCTOR_ALLOCATE) { Node *pn = Swig_methodclass(n); SwigType *smart = Swig_cparse_smartptr(pn); if (smart) SwigType_add_pointer(smart); String *classtype = smart ? smart : t; need_result = 1; Printf(f->code, "VALUE vresult = SWIG_NewClassInstance(self, SWIGTYPE%s);\n", Char(SwigType_manglestr(classtype))); Printf(f->code, "#ifndef HAVE_RB_DEFINE_ALLOC_FUNC\n"); Printf(f->code, "rb_obj_call_init(vresult, argc, argv);\n"); Printf(f->code, "#endif\n"); Delete(smart); } else if (current == CONSTRUCTOR_INITIALIZE) { need_result = 1; } else { if ( need_result > 1 ) { if ( SwigType_type(t) == T_VOID ) Printf(f->code, "vresult = rb_ary_new();\n"); else { Printf(f->code, "if (vresult == Qnil) vresult = rb_ary_new();\n"); Printf(f->code, "else vresult = SWIG_Ruby_AppendOutput( " "rb_ary_new(), vresult);\n"); } } } /* Dump argument output code; */ Printv(f->code, outarg, NIL); /* Dump the argument cleanup code */ int need_cleanup = (current != CONSTRUCTOR_ALLOCATE) && (Len(cleanup) != 0); if (need_cleanup) { Printv(f->code, cleanup, NIL); } /* Look for any remaining cleanup. This processes the %new directive */ if (current != CONSTRUCTOR_ALLOCATE && GetFlag(n, "feature:new")) { tm = Swig_typemap_lookup("newfree", n, Swig_cresult_name(), 0); if (tm) { Replaceall(tm, "$source", Swig_cresult_name()); Printv(f->code, tm, "\n", NIL); Delete(tm); } } /* Special processing on return value. */ tm = Swig_typemap_lookup("ret", n, Swig_cresult_name(), 0); if (tm) { Replaceall(tm, "$source", Swig_cresult_name()); Printv(f->code, tm, NIL); Delete(tm); } if (director_method) { if ((tm = Swig_typemap_lookup("directorfree", n, Swig_cresult_name(), 0))) { Replaceall(tm, "$input", Swig_cresult_name()); Replaceall(tm, "$result", "vresult"); Printf(f->code, "%s\n", tm); } } /* Wrap things up (in a manner of speaking) */ if (need_result) { if (current == CONSTRUCTOR_ALLOCATE) { Printv(f->code, tab4, "return vresult;\n", NIL); } else if (current == CONSTRUCTOR_INITIALIZE) { Printv(f->code, tab4, "return self;\n", NIL); Printv(f->code, "fail:\n", NIL); if (need_cleanup) { Printv(f->code, cleanup, NIL); } Printv(f->code, tab4, "return Qnil;\n", NIL); } else { Wrapper_add_local(f, "vresult", "VALUE vresult = Qnil"); Printv(f->code, tab4, "return vresult;\n", NIL); Printv(f->code, "fail:\n", NIL); if (need_cleanup) { Printv(f->code, cleanup, NIL); } Printv(f->code, tab4, "return Qnil;\n", NIL); } } else { Printv(f->code, tab4, "return Qnil;\n", NIL); Printv(f->code, "fail:\n", NIL); if (need_cleanup) { Printv(f->code, cleanup, NIL); } Printv(f->code, tab4, "return Qnil;\n", NIL); } Printf(f->code, "}\n"); /* Substitute the cleanup code */ Replaceall(f->code, "$cleanup", cleanup); /* Substitute the function name */ Replaceall(f->code, "$symname", symname); /* Emit the function */ Wrapper_print(f, f_wrappers); /* Now register the function with the interpreter */ if (!Swig_symbol_isoverloaded(n)) { create_command(n, symname); } else { if (current == CONSTRUCTOR_ALLOCATE) { create_command(n, symname); } else { if (!Getattr(n, "sym:nextSibling")) dispatchFunction(n); } } Delete(kwargs); Delete(cleanup); Delete(outarg); DelWrapper(f); Delete(symname); return SWIG_OK; } /* ------------------------------------------------------------ * dispatchFunction() * ------------------------------------------------------------ */ void dispatchFunction(Node *n) { /* Last node in overloaded chain */ int maxargs; String *tmp = NewString(""); String *dispatch = Swig_overload_dispatch(n, "return %s(nargs, args, self);", &maxargs); /* Generate a dispatch wrapper for all overloaded functions */ Wrapper *f = NewWrapper(); String *symname = Getattr(n, "sym:name"); String *wname = Swig_name_wrapper(symname); Printv(f->def, "SWIGINTERN VALUE ", wname, "(int nargs, VALUE *args, VALUE self) {", NIL); Wrapper_add_local(f, "argc", "int argc"); bool ctor_director = (current == CONSTRUCTOR_INITIALIZE && Swig_directorclass(n)); if (current == MEMBER_FUNC || current == MEMBER_VAR || ctor_director) { Printf(tmp, "VALUE argv[%d]", maxargs + 1); } else { Printf(tmp, "VALUE argv[%d]", maxargs); } Wrapper_add_local(f, "argv", tmp); Wrapper_add_local(f, "ii", "int ii"); if (current == MEMBER_FUNC || current == MEMBER_VAR || ctor_director) { maxargs += 1; Printf(f->code, "argc = nargs + 1;\n"); Printf(f->code, "argv[0] = self;\n"); Printf(f->code, "if (argc > %d) SWIG_fail;\n", maxargs); Printf(f->code, "for (ii = 1; (ii < argc); ++ii) {\n"); Printf(f->code, "argv[ii] = args[ii-1];\n"); Printf(f->code, "}\n"); } else { Printf(f->code, "argc = nargs;\n"); Printf(f->code, "if (argc > %d) SWIG_fail;\n", maxargs); Printf(f->code, "for (ii = 0; (ii < argc); ++ii) {\n"); Printf(f->code, "argv[ii] = args[ii];\n"); Printf(f->code, "}\n"); } Replaceall(dispatch, "$args", "nargs, args, self"); Printv(f->code, dispatch, "\n", NIL); // Generate prototype list, go to first node Node *sibl = n; while (Getattr(sibl, "sym:previousSibling")) sibl = Getattr(sibl, "sym:previousSibling"); // go all the way up // Constructors will be treated specially const bool isCtor = (!Cmp(Getattr(sibl, "nodeType"), "constructor")); const bool isMethod = ( Cmp(Getattr(sibl, "ismember"), "1") == 0 && (!isCtor) ); // Construct real method name String* methodName = NewString(""); if ( isMethod ) { // Sometimes a method node has no parent (SF#3034054). // This value is used in an exception message, so just skip the class // name in this case so at least we don't segfault. This is probably // just working around a problem elsewhere though. Node *parent_node = parentNode(sibl); if (parent_node) Printv( methodName, Getattr(parent_node,"sym:name"), ".", NIL ); } Append( methodName, Getattr(sibl,"sym:name" ) ); if ( isCtor ) Append( methodName, ".new" ); // Generate prototype list String *protoTypes = NewString(""); do { Append( protoTypes, "\n\" "); if (!isCtor) { SwigType *type = SwigType_str(Getattr(sibl, "type"), NULL); Printv(protoTypes, type, " ", NIL); Delete(type); } Printv(protoTypes, methodName, NIL ); Parm* p = Getattr(sibl, "wrap:parms"); if (p && (current == MEMBER_FUNC || current == MEMBER_VAR || ctor_director) ) p = nextSibling(p); // skip self Append( protoTypes, "(" ); while(p) { Append( protoTypes, SwigType_str(Getattr(p,"type"), Getattr(p,"name")) ); if ( ( p = nextSibling(p)) ) Append(protoTypes, ", "); } Append( protoTypes, ")\\n\"" ); } while ((sibl = Getattr(sibl, "sym:nextSibling"))); Append(f->code, "fail:\n"); Printf(f->code, "Ruby_Format_OverloadedError( argc, %d, \"%s\", %s);\n", maxargs, methodName, protoTypes); Append(f->code, "\nreturn Qnil;\n"); Delete(methodName); Delete(protoTypes); Printv(f->code, "}\n", NIL); Wrapper_print(f, f_wrappers); create_command(n, Char(symname)); DelWrapper(f); Delete(dispatch); Delete(tmp); Delete(wname); } /* --------------------------------------------------------------------- * variableWrapper() * --------------------------------------------------------------------- */ virtual int variableWrapper(Node *n) { String* docs = docstring(n, AUTODOC_GETTER); Printf(f_wrappers, "%s", docs); Delete(docs); char *name = GetChar(n, "name"); char *iname = GetChar(n, "sym:name"); SwigType *t = Getattr(n, "type"); String *tm; String *getfname, *setfname; Wrapper *getf, *setf; getf = NewWrapper(); setf = NewWrapper(); /* create getter */ int addfail = 0; String *getname = Swig_name_get(NSPACE_TODO, iname); getfname = Swig_name_wrapper(getname); Setattr(n, "wrap:name", getfname); Printv(getf->def, "SWIGINTERN VALUE\n", getfname, "(", NIL); Printf(getf->def, "VALUE self"); Printf(getf->def, ") {"); Wrapper_add_local(getf, "_val", "VALUE _val"); tm = Swig_typemap_lookup("varout", n, name, 0); if (tm) { Replaceall(tm, "$result", "_val"); Replaceall(tm, "$target", "_val"); Replaceall(tm, "$source", name); /* Printv(getf->code,tm, NIL); */ addfail = emit_action_code(n, getf->code, tm); } else { Swig_warning(WARN_TYPEMAP_VAROUT_UNDEF, input_file, line_number, "Unable to read variable of type %s\n", SwigType_str(t, 0)); } Printv(getf->code, tab4, "return _val;\n", NIL); if (addfail) { Append(getf->code, "fail:\n"); Append(getf->code, " return Qnil;\n"); } Append(getf->code, "}\n"); Wrapper_print(getf, f_wrappers); if (!is_assignable(n)) { setfname = NewString("NULL"); } else { /* create setter */ String* docs = docstring(n, AUTODOC_SETTER); Printf(f_wrappers, "%s", docs); Delete(docs); String *setname = Swig_name_set(NSPACE_TODO, iname); setfname = Swig_name_wrapper(setname); Setattr(n, "wrap:name", setfname); Printv(setf->def, "SWIGINTERN VALUE\n", setfname, "(VALUE self, ", NIL); Printf(setf->def, "VALUE _val) {"); tm = Swig_typemap_lookup("varin", n, name, 0); if (tm) { Replaceall(tm, "$input", "_val"); Replaceall(tm, "$source", "_val"); Replaceall(tm, "$target", name); /* Printv(setf->code,tm,"\n",NIL); */ emit_action_code(n, setf->code, tm); } else { Swig_warning(WARN_TYPEMAP_VARIN_UNDEF, input_file, line_number, "Unable to set variable of type %s\n", SwigType_str(t, 0)); } Printv(setf->code, tab4, "return _val;\n", NIL); Printf(setf->code, "fail:\n"); Printv(setf->code, tab4, "return Qnil;\n", NIL); Printf(setf->code, "}\n"); Wrapper_print(setf, f_wrappers); Delete(setname); } /* define accessor method */ if (CPlusPlus) { Insert(getfname, 0, "VALUEFUNC("); Append(getfname, ")"); Insert(setfname, 0, "VALUEFUNC("); Append(setfname, ")"); } String *s = NewString(""); switch (current) { case STATIC_VAR: /* C++ class variable */ Printv(s, tab4, "rb_define_singleton_method(", klass->vname, ", \"", klass->strip(iname), "\", ", getfname, ", 0);\n", NIL); if (!GetFlag(n, "feature:immutable")) { Printv(s, tab4, "rb_define_singleton_method(", klass->vname, ", \"", klass->strip(iname), "=\", ", setfname, ", 1);\n", NIL); } Printv(klass->init, s, NIL); break; default: /* C global variable */ /* wrapped in Ruby module attribute */ assert(current == NO_CPP); if (!useGlobalModule) { Printv(s, tab4, "rb_define_singleton_method(", modvar, ", \"", iname, "\", ", getfname, ", 0);\n", NIL); if (!GetFlag(n, "feature:immutable")) { Printv(s, tab4, "rb_define_singleton_method(", modvar, ", \"", iname, "=\", ", setfname, ", 1);\n", NIL); } } else { Printv(s, tab4, "rb_define_global_method(\"", iname, "\", ", getfname, ", 0);\n", NIL); if (!GetFlag(n, "feature:immutable")) { Printv(s, tab4, "rb_define_global_method(\"", iname, "=\", ", setfname, ", 1);\n", NIL); } } Printv(f_init, s, NIL); Delete(s); break; } Delete(getname); Delete(getfname); Delete(setfname); DelWrapper(setf); DelWrapper(getf); return SWIG_OK; } /* --------------------------------------------------------------------- * validate_const_name(char *name) * * Validate constant name. * --------------------------------------------------------------------- */ char *validate_const_name(char *name, const char *reason) { if (!name || name[0] == '\0') return name; if (isupper(name[0])) return name; if (islower(name[0])) { name[0] = (char)toupper(name[0]); Swig_warning(WARN_RUBY_WRONG_NAME, input_file, line_number, "Wrong %s name (corrected to `%s')\n", reason, name); return name; } Swig_warning(WARN_RUBY_WRONG_NAME, input_file, line_number, "Wrong %s name %s\n", reason, name); return name; } /* --------------------------------------------------------------------- * constantWrapper() * --------------------------------------------------------------------- */ virtual int constantWrapper(Node *n) { Swig_require("constantWrapper", n, "*sym:name", "type", "value", NIL); char *iname = GetChar(n, "sym:name"); SwigType *type = Getattr(n, "type"); String *rawval = Getattr(n, "rawval"); String *value = rawval ? rawval : Getattr(n, "value"); if (current == CLASS_CONST) { iname = klass->strip(iname); } validate_const_name(iname, "constant"); SetChar(n, "sym:name", iname); /* Special hook for member pointer */ if (SwigType_type(type) == T_MPOINTER) { String *wname = Swig_name_wrapper(iname); Printf(f_header, "static %s = %s;\n", SwigType_str(type, wname), value); value = Char(wname); } String *tm = Swig_typemap_lookup("constant", n, value, 0); if (!tm) tm = Swig_typemap_lookup("constcode", n, value, 0); if (tm) { Replaceall(tm, "$source", value); Replaceall(tm, "$target", iname); Replaceall(tm, "$symname", iname); Replaceall(tm, "$value", value); if (current == CLASS_CONST) { if (multipleInheritance) { Replaceall(tm, "$module", klass->mImpl); Printv(klass->init, tm, "\n", NIL); } else { Replaceall(tm, "$module", klass->vname); Printv(klass->init, tm, "\n", NIL); } } else { if (!useGlobalModule) { Replaceall(tm, "$module", modvar); } else { Replaceall(tm, "$module", "rb_cObject"); } Printf(f_init, "%s\n", tm); } } else { Swig_warning(WARN_TYPEMAP_CONST_UNDEF, input_file, line_number, "Unsupported constant value %s = %s\n", SwigType_str(type, 0), value); } Swig_restore(n); return SWIG_OK; } /* ----------------------------------------------------------------------------- * classDeclaration() * * Records information about classes---even classes that might be defined in * other modules referenced by %import. * ----------------------------------------------------------------------------- */ virtual int classDeclaration(Node *n) { if (!Getattr(n, "feature:onlychildren")) { String *name = Getattr(n, "name"); String *symname = Getattr(n, "sym:name"); String *namestr = SwigType_namestr(name); klass = RCLASS(classes, Char(namestr)); if (!klass) { klass = new RClass(); String *valid_name = NewString(symname ? symname : namestr); validate_const_name(Char(valid_name), "class"); klass->set_name(namestr, symname, valid_name); SET_RCLASS(classes, Char(namestr), klass); Delete(valid_name); } Delete(namestr); } return Language::classDeclaration(n); } /** * Process the comma-separated list of mixed-in module names (if any). */ void includeRubyModules(Node *n) { String *mixin = Getattr(n, "feature:mixin"); if (mixin) { List *modules = Split(mixin, ',', INT_MAX); if (modules && Len(modules) > 0) { Iterator mod = First(modules); while (mod.item) { if (Len(mod.item) > 0) { Printf(klass->init, "rb_include_module(%s, rb_eval_string(\"%s\"));\n", klass->vname, mod.item); } mod = Next(mod); } } Delete(modules); } } void handleBaseClasses(Node *n) { List *baselist = Getattr(n, "bases"); if (baselist && Len(baselist)) { Iterator base = First(baselist); while (base.item && GetFlag(base.item, "feature:ignore")) { base = Next(base); } while (base.item) { String *basename = Getattr(base.item, "name"); String *basenamestr = SwigType_namestr(basename); RClass *super = RCLASS(classes, Char(basenamestr)); Delete(basenamestr); if (super) { SwigType *btype = NewString(basename); SwigType_add_pointer(btype); SwigType_remember(btype); SwigType *smart = Swig_cparse_smartptr(base.item); if (smart) { SwigType_add_pointer(smart); SwigType_remember(smart); } String *bmangle = SwigType_manglestr(smart ? smart : btype); if (multipleInheritance) { Insert(bmangle, 0, "((swig_class *) SWIGTYPE"); Append(bmangle, "->clientdata)->mImpl"); Printv(klass->init, "rb_include_module(", klass->mImpl, ", ", bmangle, ");\n", NIL); } else { Insert(bmangle, 0, "((swig_class *) SWIGTYPE"); Append(bmangle, "->clientdata)->klass"); Replaceall(klass->init, "$super", bmangle); } Delete(bmangle); Delete(smart); Delete(btype); } base = Next(base); while (base.item && GetFlag(base.item, "feature:ignore")) { base = Next(base); } if (!multipleInheritance) { /* Warn about multiple inheritance for additional base class(es) */ while (base.item) { if (GetFlag(base.item, "feature:ignore")) { base = Next(base); continue; } String *proxyclassname = SwigType_str(Getattr(n, "classtypeobj"), 0); String *baseclassname = SwigType_str(Getattr(base.item, "name"), 0); Swig_warning(WARN_RUBY_MULTIPLE_INHERITANCE, Getfile(n), Getline(n), "Warning for %s, base %s ignored. Multiple inheritance is not supported in Ruby.\n", proxyclassname, baseclassname); base = Next(base); } } } } } /** * Check to see if a %markfunc was specified. */ void handleMarkFuncDirective(Node *n) { String *markfunc = Getattr(n, "feature:markfunc"); if (markfunc) { Printf(klass->init, "SwigClass%s.mark = (void (*)(void *)) %s;\n", klass->name, markfunc); } else { Printf(klass->init, "SwigClass%s.mark = 0;\n", klass->name); } } /** * Check to see if a %freefunc was specified. */ void handleFreeFuncDirective(Node *n) { String *freefunc = Getattr(n, "feature:freefunc"); if (freefunc) { Printf(klass->init, "SwigClass%s.destroy = (void (*)(void *)) %s;\n", klass->name, freefunc); } else { if (klass->destructor_defined) { Printf(klass->init, "SwigClass%s.destroy = (void (*)(void *)) free_%s;\n", klass->name, klass->mname); } } } /** * Check to see if tracking is enabled for this class. */ void handleTrackDirective(Node *n) { int trackObjects = GetFlag(n, "feature:trackobjects"); if (trackObjects) { Printf(klass->init, "SwigClass%s.trackObjects = 1;\n", klass->name); } else { Printf(klass->init, "SwigClass%s.trackObjects = 0;\n", klass->name); } } /* ---------------------------------------------------------------------- * classHandler() * ---------------------------------------------------------------------- */ virtual int classHandler(Node *n) { String* docs = docstring(n, AUTODOC_CLASS); Printf(f_wrappers, "%s", docs); Delete(docs); String *name = Getattr(n, "name"); String *symname = Getattr(n, "sym:name"); String *namestr = SwigType_namestr(name); // does template expansion klass = RCLASS(classes, Char(namestr)); assert(klass != 0); Delete(namestr); String *valid_name = NewString(symname); validate_const_name(Char(valid_name), "class"); Clear(klass->type); Printv(klass->type, Getattr(n, "classtype"), NIL); Printv(f_wrappers, "static swig_class SwigClass", valid_name, ";\n\n", NIL); Printv(klass->init, "\n", tab4, NIL); if (!useGlobalModule) { Printv(klass->init, klass->vname, " = rb_define_class_under(", modvar, ", \"", klass->name, "\", $super);\n", NIL); } else { Printv(klass->init, klass->vname, " = rb_define_class(\"", klass->name, "\", $super);\n", NIL); } if (multipleInheritance) { Printv(klass->init, klass->mImpl, " = rb_define_module_under(", klass->vname, ", \"Impl\");\n", NIL); } SwigType *tt = NewString(name); SwigType_add_pointer(tt); SwigType_remember(tt); SwigType *smart = Swig_cparse_smartptr(n); if (smart) { SwigType_add_pointer(smart); SwigType_remember(smart); } String *tm = SwigType_manglestr(smart ? smart : tt); Printf(klass->init, "SWIG_TypeClientData(SWIGTYPE%s, (void *) &SwigClass%s);\n", tm, valid_name); Delete(tm); Delete(smart); Delete(tt); Delete(valid_name); includeRubyModules(n); Printv(klass->init, "$allocator", NIL); Printv(klass->init, "$initializer", NIL); Language::classHandler(n); handleBaseClasses(n); handleMarkFuncDirective(n); handleFreeFuncDirective(n); handleTrackDirective(n); if (multipleInheritance) { Printv(klass->init, "rb_include_module(", klass->vname, ", ", klass->mImpl, ");\n", NIL); } String *s = NewString(""); Printv(s, tab4, "rb_undef_alloc_func(", klass->vname, ");\n", NIL); Replaceall(klass->init, "$allocator", s); Replaceall(klass->init, "$initializer", ""); if (GetFlag(n, "feature:exceptionclass")) { Replaceall(klass->init, "$super", "rb_eRuntimeError"); } else { Replaceall(klass->init, "$super", "rb_cObject"); } Delete(s); Printv(f_init, klass->init, NIL); klass = 0; return SWIG_OK; } /* ---------------------------------------------------------------------- * memberfunctionHandler() * * Method for adding C++ member function * * By default, we're going to create a function of the form : * * Foo_bar(this,args) * * Where Foo is the classname, bar is the member name and the this pointer * is explicitly attached to the beginning. * * The renaming only applies to the member function part, not the full * classname. * * --------------------------------------------------------------------- */ virtual int memberfunctionHandler(Node *n) { current = MEMBER_FUNC; String* docs = docstring(n, AUTODOC_METHOD); Printf(f_wrappers, "%s", docs); Delete(docs); Language::memberfunctionHandler(n); current = NO_CPP; return SWIG_OK; } /* --------------------------------------------------------------------- * constructorHandler() * * Method for adding C++ member constructor * -------------------------------------------------------------------- */ void set_director_ctor_code(Node *n) { /* director ctor code is specific for each class */ Delete(director_prot_ctor_code); director_prot_ctor_code = NewString(""); Node *pn = Swig_methodclass(n); String *symname = Getattr(pn, "sym:name"); String *name = Copy(symname); char *cname = Char(name); if (cname) cname[0] = (char)toupper(cname[0]); Printv(director_prot_ctor_code, "if ( $comparison ) { /* subclassed */\n", " $director_new \n", "} else {\n", " rb_raise(rb_eNameError,\"accessing abstract class or protected constructor\"); \n", " return Qnil;\n", "}\n", NIL); Delete(director_ctor_code); director_ctor_code = NewString(""); Printv(director_ctor_code, "if ( $comparison ) { /* subclassed */\n", " $director_new \n", "} else {\n", " $nondirector_new \n", "}\n", NIL); Delete(name); } virtual int constructorHandler(Node *n) { int use_director = Swig_directorclass(n); if (use_director) { set_director_ctor_code(n); } /* First wrap the allocate method */ current = CONSTRUCTOR_ALLOCATE; Swig_name_register("construct", "%n%c_allocate"); Language::constructorHandler(n); String* docs = docstring(n, AUTODOC_CTOR); Printf(f_wrappers, "%s", docs); Delete(docs); /* * If we're wrapping the constructor of a C++ director class, prepend a new parameter * to receive the scripting language object (e.g. 'self') * */ Swig_save("ruby:constructorHandler", n, "parms", NIL); if (use_director) { Parm *parms = Getattr(n, "parms"); Parm *self; String *name = NewString("self"); String *type = NewString("VALUE"); self = NewParm(type, name, n); Delete(type); Delete(name); Setattr(self, "lname", "Qnil"); if (parms) set_nextSibling(self, parms); Setattr(n, "parms", self); Setattr(n, "wrap:self", "1"); Delete(self); } /* Now do the instance initialize method */ current = CONSTRUCTOR_INITIALIZE; Swig_name_register("construct", "new_%n%c"); Language::constructorHandler(n); /* Restore original parameter list */ Delattr(n, "wrap:self"); Swig_restore(n); /* Done */ Swig_name_unregister("construct"); current = NO_CPP; klass->constructor_defined = 1; return SWIG_OK; } virtual int copyconstructorHandler(Node *n) { int use_director = Swig_directorclass(n); if (use_director) { set_director_ctor_code(n); } /* First wrap the allocate method */ current = CONSTRUCTOR_ALLOCATE; Swig_name_register("construct", "%n%c_allocate"); return Language::copyconstructorHandler(n); } /* --------------------------------------------------------------------- * destructorHandler() * -------------------------------------------------------------------- */ virtual int destructorHandler(Node *n) { /* Do no spit free function if user defined his own for this class */ Node *pn = Swig_methodclass(n); String *freefunc = Getattr(pn, "feature:freefunc"); if (freefunc) return SWIG_OK; current = DESTRUCTOR; Language::destructorHandler(n); freefunc = NewString(""); String *freebody = NewString(""); String *pname0 = Swig_cparm_name(0, 0); Printv(freefunc, "free_", klass->mname, NIL); Printv(freebody, "SWIGINTERN void\n", freefunc, "(void *self) {\n", NIL); Printv(freebody, tab4, klass->type, " *", pname0, " = (", klass->type, " *)self;\n", NIL); Printv(freebody, tab4, NIL); /* Check to see if object tracking is activated for the class that owns this destructor. */ if (GetFlag(pn, "feature:trackobjects")) { Printf(freebody, "SWIG_RubyRemoveTracking(%s);\n", pname0); Printv(freebody, tab4, NIL); } if (Extend) { String *wrap = Getattr(n, "wrap:code"); if (wrap) { Printv(f_wrappers, wrap, NIL); } /* Printv(freebody, Swig_name_destroy(name), "(", pname0, ")", NIL); */ Printv(freebody, Getattr(n, "wrap:action"), "\n", NIL); } else { String *action = Getattr(n, "wrap:action"); if (action) { Printv(freebody, action, "\n", NIL); } else { /* In the case swig emits no destroy function. */ if (CPlusPlus) Printf(freebody, "delete %s;\n", pname0); else Printf(freebody, "free((char*) %s);\n", pname0); } } Printv(freebody, "}\n\n", NIL); Printv(f_wrappers, freebody, NIL); klass->destructor_defined = 1; current = NO_CPP; Delete(freefunc); Delete(freebody); Delete(pname0); return SWIG_OK; } /* --------------------------------------------------------------------- * membervariableHandler() * * This creates a pair of functions to set/get the variable of a member. * -------------------------------------------------------------------- */ virtual int membervariableHandler(Node *n) { String* docs = docstring(n, AUTODOC_GETTER); Printf(f_wrappers, "%s", docs); Delete(docs); if (is_assignable(n)) { String* docs = docstring(n, AUTODOC_SETTER); Printf(f_wrappers, "%s", docs); Delete(docs); } current = MEMBER_VAR; Language::membervariableHandler(n); current = NO_CPP; return SWIG_OK; } /* ----------------------------------------------------------------------- * staticmemberfunctionHandler() * * Wrap a static C++ function * ---------------------------------------------------------------------- */ virtual int staticmemberfunctionHandler(Node *n) { String* docs = docstring(n, AUTODOC_STATICFUNC); Printf(f_wrappers, "%s", docs); Delete(docs); current = STATIC_FUNC; Language::staticmemberfunctionHandler(n); current = NO_CPP; return SWIG_OK; } /* ---------------------------------------------------------------------- * memberconstantHandler() * * Create a C++ constant * --------------------------------------------------------------------- */ virtual int memberconstantHandler(Node *n) { String* docs = docstring(n, AUTODOC_STATICFUNC); Printf(f_wrappers, "%s", docs); Delete(docs); current = CLASS_CONST; Language::memberconstantHandler(n); current = NO_CPP; return SWIG_OK; } /* --------------------------------------------------------------------- * staticmembervariableHandler() * --------------------------------------------------------------------- */ virtual int staticmembervariableHandler(Node *n) { String* docs = docstring(n, AUTODOC_GETTER); Printf(f_wrappers, "%s", docs); Delete(docs); if (is_assignable(n)) { String* docs = docstring(n, AUTODOC_SETTER); Printf(f_wrappers, "%s", docs); Delete(docs); } current = STATIC_VAR; Language::staticmembervariableHandler(n); current = NO_CPP; return SWIG_OK; } /* C++ director class generation */ virtual int classDirector(Node *n) { return Language::classDirector(n); } virtual int classDirectorInit(Node *n) { String *declaration; declaration = Swig_director_declaration(n); Printf(f_directors_h, "\n"); Printf(f_directors_h, "%s\n", declaration); Printf(f_directors_h, "public:\n"); Delete(declaration); return Language::classDirectorInit(n); } virtual int classDirectorEnd(Node *n) { Printf(f_directors_h, "};\n\n"); return Language::classDirectorEnd(n); } /* ------------------------------------------------------------ * classDirectorConstructor() * ------------------------------------------------------------ */ virtual int classDirectorConstructor(Node *n) { Node *parent = Getattr(n, "parentNode"); String *sub = NewString(""); String *decl = Getattr(n, "decl"); String *supername = Swig_class_name(parent); String *classname = NewString(""); Printf(classname, "SwigDirector_%s", supername); /* insert self parameter */ Parm *p; ParmList *superparms = Getattr(n, "parms"); ParmList *parms = CopyParmList(superparms); String *type = NewString("VALUE"); p = NewParm(type, NewString("self"), n); set_nextSibling(p, parms); parms = p; if (!Getattr(n, "defaultargs")) { /* constructor */ { Wrapper *w = NewWrapper(); String *call; String *basetype = Getattr(parent, "classtype"); String *target = Swig_method_decl(0, decl, classname, parms, 0); call = Swig_csuperclass_call(0, basetype, superparms); Printf(w->def, "%s::%s: %s, Swig::Director(self) { }", classname, target, call); Delete(target); Wrapper_print(w, f_directors); Delete(call); DelWrapper(w); } /* constructor header */ { String *target = Swig_method_decl(0, decl, classname, parms, 1); Printf(f_directors_h, " %s;\n", target); Delete(target); } } Delete(sub); Delete(classname); Delete(supername); Delete(parms); return Language::classDirectorConstructor(n); } /* ------------------------------------------------------------ * classDirectorDefaultConstructor() * ------------------------------------------------------------ */ virtual int classDirectorDefaultConstructor(Node *n) { String *classname; Wrapper *w; classname = Swig_class_name(n); w = NewWrapper(); Printf(w->def, "SwigDirector_%s::SwigDirector_%s(VALUE self) : Swig::Director(self) { }", classname, classname); Wrapper_print(w, f_directors); DelWrapper(w); Printf(f_directors_h, " SwigDirector_%s(VALUE self);\n", classname); Delete(classname); return Language::classDirectorDefaultConstructor(n); } /* --------------------------------------------------------------- * exceptionSafeMethodCall() * * Emit a virtual director method to pass a method call on to the * underlying Ruby instance. * * --------------------------------------------------------------- */ void exceptionSafeMethodCall(String *className, Node *n, Wrapper *w, int argc, String *args, bool initstack) { Wrapper *body = NewWrapper(); Wrapper *rescue = NewWrapper(); String *methodName = Getattr(n, "sym:name"); String *bodyName = NewStringf("%s_%s_body", className, methodName); String *rescueName = NewStringf("%s_%s_rescue", className, methodName); String *depthCountName = NewStringf("%s_%s_call_depth", className, methodName); // Check for an exception typemap of some kind String *tm = Swig_typemap_lookup("director:except", n, Swig_cresult_name(), 0); if (!tm) { tm = Getattr(n, "feature:director:except"); } if ((tm != 0) && (Len(tm) > 0) && (Strcmp(tm, "1") != 0)) { // Declare a global to hold the depth count if (!Getattr(n, "sym:nextSibling")) { Printf(body->def, "static int %s = 0;\n", depthCountName); // Function body Printf(body->def, "VALUE %s(VALUE data) {\n", bodyName); Wrapper_add_localv(body, "args", "Swig::body_args *", "args", "= reinterpret_cast(data)", NIL); Wrapper_add_localv(body, Swig_cresult_name(), "VALUE", Swig_cresult_name(), "= Qnil", NIL); Printf(body->code, "%s++;\n", depthCountName); Printv(body->code, Swig_cresult_name(), " = rb_funcall2(args->recv, args->id, args->argc, args->argv);\n", NIL); Printf(body->code, "%s--;\n", depthCountName); Printv(body->code, "return ", Swig_cresult_name(), ";\n", NIL); Printv(body->code, "}", NIL); // Exception handler Printf(rescue->def, "VALUE %s(VALUE args, VALUE error) {\n", rescueName); Replaceall(tm, "$error", "error"); Printf(rescue->code, "%s--;\n", depthCountName); Printf(rescue->code, "if (%s == 0) ", depthCountName); Printv(rescue->code, Str(tm), "\n", NIL); Printv(rescue->code, "rb_exc_raise(error);\n", NIL); Printv(rescue->code, "return Qnil;\n", NIL); Printv(rescue->code, "}", NIL); } // Main code Wrapper_add_localv(w, "args", "Swig::body_args", "args", NIL); Wrapper_add_localv(w, "status", "int", "status", NIL); Printv(w->code, "args.recv = swig_get_self();\n", NIL); Printf(w->code, "args.id = rb_intern(\"%s\");\n", methodName); Printf(w->code, "args.argc = %d;\n", argc); if (argc > 0) { Printf(w->code, "args.argv = new VALUE[%d];\n", argc); for (int i = 0; i < argc; i++) { Printf(w->code, "args.argv[%d] = obj%d;\n", i, i); } } else { Printv(w->code, "args.argv = 0;\n", NIL); } Printf(w->code, "%s = rb_protect(PROTECTFUNC(%s), reinterpret_cast(&args), &status);\n", Swig_cresult_name(), bodyName); if ( initstack ) Printf(w->code, "SWIG_RELEASE_STACK;\n"); Printf(w->code, "if (status) {\n"); Printf(w->code, "VALUE lastErr = rb_gv_get(\"$!\");\n"); Printf(w->code, "%s(reinterpret_cast(&args), lastErr);\n", rescueName); Printf(w->code, "}\n"); if (argc > 0) { Printv(w->code, "delete [] args.argv;\n", NIL); } // Dump wrapper code Wrapper_print(body, f_directors_helpers); Wrapper_print(rescue, f_directors_helpers); } else { if (argc > 0) { Printf(w->code, "%s = rb_funcall(swig_get_self(), rb_intern(\"%s\"), %d%s);\n", Swig_cresult_name(), methodName, argc, args); } else { Printf(w->code, "%s = rb_funcall(swig_get_self(), rb_intern(\"%s\"), 0, Qnil);\n", Swig_cresult_name(), methodName); } if ( initstack ) Printf(w->code, "SWIG_RELEASE_STACK;\n"); } // Clean up Delete(bodyName); Delete(rescueName); Delete(depthCountName); DelWrapper(body); DelWrapper(rescue); } virtual int classDirectorMethod(Node *n, Node *parent, String *super) { int is_void = 0; int is_pointer = 0; String *decl = Getattr(n, "decl"); String *name = Getattr(n, "name"); String *classname = Getattr(parent, "sym:name"); String *c_classname = Getattr(parent, "name"); String *symname = Getattr(n, "sym:name"); String *declaration = NewString(""); ParmList *l = Getattr(n, "parms"); Wrapper *w = NewWrapper(); String *tm; String *wrap_args = NewString(""); String *returntype = Getattr(n, "type"); Parm *p; String *value = Getattr(n, "value"); String *storage = Getattr(n, "storage"); bool pure_virtual = false; int status = SWIG_OK; int idx; bool ignored_method = GetFlag(n, "feature:ignore") ? true : false; bool asvoid = checkAttribute( n, "feature:numoutputs", "0") ? true : false; bool initstack = checkAttribute( n, "feature:initstack", "1") ? true : false; if (Cmp(storage, "virtual") == 0) { if (Cmp(value, "0") == 0) { pure_virtual = true; } } String *overnametmp = NewString(Getattr(n, "sym:name")); if (Getattr(n, "sym:overloaded")) { Printf(overnametmp, "::%s", Getattr(n, "sym:overname")); } /* determine if the method returns a pointer */ is_pointer = SwigType_ispointer_return(decl); is_void = (!Cmp(returntype, "void") && !is_pointer); /* virtual method definition */ String *target; String *pclassname = NewStringf("SwigDirector_%s", classname); String *qualified_name = NewStringf("%s::%s", pclassname, name); SwigType *rtype = Getattr(n, "conversion_operator") ? 0 : Getattr(n, "classDirectorMethods:type"); target = Swig_method_decl(rtype, decl, qualified_name, l, 0); Printf(w->def, "%s", target); Delete(qualified_name); Delete(target); /* header declaration */ target = Swig_method_decl(rtype, decl, name, l, 1); Printf(declaration, " virtual %s", target); Delete(target); // Get any exception classes in the throws typemap if (Getattr(n, "noexcept")) { Append(w->def, " noexcept"); Append(declaration, " noexcept"); } ParmList *throw_parm_list = 0; if ((throw_parm_list = Getattr(n, "throws")) || Getattr(n, "throw")) { Parm *p; int gencomma = 0; Append(w->def, " throw("); Append(declaration, " throw("); if (throw_parm_list) Swig_typemap_attach_parms("throws", throw_parm_list, 0); for (p = throw_parm_list; p; p = nextSibling(p)) { if (Getattr(p, "tmap:throws")) { if (gencomma++) { Append(w->def, ", "); Append(declaration, ", "); } Printf(w->def, "%s", SwigType_str(Getattr(p, "type"), 0)); Printf(declaration, "%s", SwigType_str(Getattr(p, "type"), 0)); } } Append(w->def, ")"); Append(declaration, ")"); } Append(w->def, " {"); Append(declaration, ";\n"); if (initstack && !(ignored_method && !pure_virtual)) { Append(w->def, "\nSWIG_INIT_STACK;\n"); } /* declare method return value * if the return value is a reference or const reference, a specialized typemap must * handle it, including declaration of c_result ($result). */ if (!is_void && (!ignored_method || pure_virtual)) { if (!SwigType_isclass(returntype)) { if (!(SwigType_ispointer(returntype) || SwigType_isreference(returntype))) { String *construct_result = NewStringf("= SwigValueInit< %s >()", SwigType_lstr(returntype, 0)); Wrapper_add_localv(w, "c_result", SwigType_lstr(returntype, "c_result"), construct_result, NIL); Delete(construct_result); } else { Wrapper_add_localv(w, "c_result", SwigType_lstr(returntype, "c_result"), "= 0", NIL); } } else { String *cres = SwigType_lstr(returntype, "c_result"); Printf(w->code, "%s;\n", cres); Delete(cres); } } if (ignored_method) { if (!pure_virtual) { if (!is_void) Printf(w->code, "return "); String *super_call = Swig_method_call(super, l); Printf(w->code, "%s;\n", super_call); Delete(super_call); } else { Printf(w->code, "Swig::DirectorPureVirtualException::raise(\"Attempted to invoke pure virtual method %s::%s\");\n", SwigType_namestr(c_classname), SwigType_namestr(name)); } } else { /* attach typemaps to arguments (C/C++ -> Ruby) */ String *arglist = NewString(""); Swig_director_parms_fixup(l); Swig_typemap_attach_parms("in", l, 0); Swig_typemap_attach_parms("directorin", l, w); Swig_typemap_attach_parms("directorargout", l, w); char source[256]; int outputs = 0; if (!is_void && !asvoid) outputs++; /* build argument list and type conversion string */ idx = 0; p = l; while ( p ) { if (Getattr(p, "tmap:ignore")) { p = Getattr(p, "tmap:ignore:next"); continue; } if (Getattr(p, "tmap:directorargout") != 0) outputs++; if ( checkAttribute( p, "tmap:in:numinputs", "0") ) { p = Getattr(p, "tmap:in:next"); continue; } String *parameterName = Getattr(p, "name"); String *parameterType = Getattr(p, "type"); Putc(',', arglist); if ((tm = Getattr(p, "tmap:directorin")) != 0) { sprintf(source, "obj%d", idx++); String *input = NewString(source); Setattr(p, "emit:directorinput", input); Replaceall(tm, "$input", input); Replaceall(tm, "$owner", "0"); Delete(input); Printv(wrap_args, tm, "\n", NIL); Wrapper_add_localv(w, source, "VALUE", source, "= Qnil", NIL); Printv(arglist, source, NIL); p = Getattr(p, "tmap:directorin:next"); continue; } else if (Cmp(parameterType, "void")) { /** * Special handling for pointers to other C++ director classes. * Ideally this would be left to a typemap, but there is currently no * way to selectively apply the dynamic_cast<> to classes that have * directors. In other words, the type "SwigDirector_$1_lname" only exists * for classes with directors. We avoid the problem here by checking * module.wrap::directormap, but it's not clear how to get a typemap to * do something similar. Perhaps a new default typemap (in addition * to SWIGTYPE) called DIRECTORTYPE? */ if (SwigType_ispointer(parameterType) || SwigType_isreference(parameterType)) { Node *modname = Getattr(parent, "module"); Node *target = Swig_directormap(modname, parameterType); sprintf(source, "obj%d", idx++); String *nonconst = 0; /* strip pointer/reference --- should move to Swig/stype.c */ String *nptype = NewString(Char(parameterType) + 2); /* name as pointer */ String *ppname = Copy(parameterName); if (SwigType_isreference(parameterType)) { Insert(ppname, 0, "&"); } /* if necessary, cast away const since Ruby doesn't support it! */ if (SwigType_isconst(nptype)) { nonconst = NewStringf("nc_tmp_%s", parameterName); String *nonconst_i = NewStringf("= const_cast< %s >(%s)", SwigType_lstr(parameterType, 0), ppname); Wrapper_add_localv(w, nonconst, SwigType_lstr(parameterType, 0), nonconst, nonconst_i, NIL); Delete(nonconst_i); Swig_warning(WARN_LANG_DISCARD_CONST, input_file, line_number, "Target language argument '%s' discards const in director method %s::%s.\n", SwigType_str(parameterType, parameterName), SwigType_namestr(c_classname), SwigType_namestr(name)); } else { nonconst = Copy(ppname); } Delete(nptype); Delete(ppname); String *mangle = SwigType_manglestr(parameterType); if (target) { String *director = NewStringf("director_%s", mangle); Wrapper_add_localv(w, director, "Swig::Director *", director, "= 0", NIL); Wrapper_add_localv(w, source, "VALUE", source, "= Qnil", NIL); Printf(wrap_args, "%s = dynamic_cast(%s);\n", director, nonconst); Printf(wrap_args, "if (!%s) {\n", director); Printf(wrap_args, "%s = SWIG_NewPointerObj(%s, SWIGTYPE%s, 0);\n", source, nonconst, mangle); Printf(wrap_args, "} else {\n"); Printf(wrap_args, "%s = %s->swig_get_self();\n", source, director); Printf(wrap_args, "}\n"); Delete(director); Printv(arglist, source, NIL); } else { Wrapper_add_localv(w, source, "VALUE", source, "= Qnil", NIL); Printf(wrap_args, "%s = SWIG_NewPointerObj(%s, SWIGTYPE%s, 0);\n", source, nonconst, mangle); //Printf(wrap_args, "%s = SWIG_NewPointerObj(%s, SWIGTYPE_p_%s, 0);\n", // source, nonconst, base); Printv(arglist, source, NIL); } Delete(mangle); Delete(nonconst); } else { Swig_warning(WARN_TYPEMAP_DIRECTORIN_UNDEF, input_file, line_number, "Unable to use type %s as a function argument in director method %s::%s (skipping method).\n", SwigType_str(parameterType, 0), SwigType_namestr(c_classname), SwigType_namestr(name)); status = SWIG_NOWRAP; break; } } p = nextSibling(p); } /* declare Ruby return value */ String *value_result = NewStringf("VALUE SWIGUNUSED %s", Swig_cresult_name()); Wrapper_add_local(w, Swig_cresult_name(), value_result); Delete(value_result); /* wrap complex arguments to VALUEs */ Printv(w->code, wrap_args, NIL); /* pass the method call on to the Ruby object */ exceptionSafeMethodCall(classname, n, w, idx, arglist, initstack); /* * Ruby method may return a simple object, or an Array of objects. * For in/out arguments, we have to extract the appropriate VALUEs from the Array, * then marshal everything back to C/C++ (return value and output arguments). */ /* Marshal return value and other outputs (if any) from VALUE to C/C++ type */ String *cleanup = NewString(""); String *outarg = NewString(""); if (outputs > 1) { Wrapper_add_local(w, "output", "VALUE output"); Printf(w->code, "if (TYPE(%s) != T_ARRAY) {\n", Swig_cresult_name()); Printf(w->code, "Ruby_DirectorTypeMismatchException(\"Ruby method failed to return an array.\");\n"); Printf(w->code, "}\n"); } idx = 0; /* Marshal return value */ if (!is_void) { tm = Swig_typemap_lookup("directorout", n, Swig_cresult_name(), w); if (tm != 0) { if (outputs > 1 && !asvoid ) { Printf(w->code, "output = rb_ary_entry(%s, %d);\n", Swig_cresult_name(), idx++); Replaceall(tm, "$input", "output"); } else { Replaceall(tm, "$input", Swig_cresult_name()); } /* TODO check this */ if (Getattr(n, "wrap:disown")) { Replaceall(tm, "$disown", "SWIG_POINTER_DISOWN"); } else { Replaceall(tm, "$disown", "0"); } Replaceall(tm, "$result", "c_result"); Printv(w->code, tm, "\n", NIL); } else { Swig_warning(WARN_TYPEMAP_DIRECTOROUT_UNDEF, input_file, line_number, "Unable to use return type %s in director method %s::%s (skipping method).\n", SwigType_str(returntype, 0), SwigType_namestr(c_classname), SwigType_namestr(name)); status = SWIG_ERROR; } } /* Marshal outputs */ for (p = l; p;) { if ((tm = Getattr(p, "tmap:directorargout")) != 0) { if (outputs > 1) { Printf(w->code, "output = rb_ary_entry(%s, %d);\n", Swig_cresult_name(), idx++); Replaceall(tm, "$result", "output"); } else { Replaceall(tm, "$result", Swig_cresult_name()); } Replaceall(tm, "$input", Getattr(p, "emit:directorinput")); Printv(w->code, tm, "\n", NIL); p = Getattr(p, "tmap:directorargout:next"); } else { p = nextSibling(p); } } Delete(arglist); Delete(cleanup); Delete(outarg); } /* any existing helper functions to handle this? */ if (!is_void) { if (!(ignored_method && !pure_virtual)) { String *rettype = SwigType_str(returntype, 0); if (!SwigType_isreference(returntype)) { Printf(w->code, "return (%s) c_result;\n", rettype); } else { Printf(w->code, "return (%s) *c_result;\n", rettype); } Delete(rettype); } } Printf(w->code, "}\n"); // We expose protected methods via an extra public inline method which makes a straight call to the wrapped class' method String *inline_extra_method = NewString(""); if (dirprot_mode() && !is_public(n) && !pure_virtual) { Printv(inline_extra_method, declaration, NIL); String *extra_method_name = NewStringf("%sSwigPublic", name); Replaceall(inline_extra_method, name, extra_method_name); Replaceall(inline_extra_method, ";\n", " {\n "); if (!is_void) Printf(inline_extra_method, "return "); String *methodcall = Swig_method_call(super, l); Printv(inline_extra_method, methodcall, ";\n }\n", NIL); Delete(methodcall); Delete(extra_method_name); } /* emit the director method */ if (status == SWIG_OK) { if (!Getattr(n, "defaultargs")) { Replaceall(w->code, "$symname", symname); Wrapper_print(w, f_directors); Printv(f_directors_h, declaration, NIL); Printv(f_directors_h, inline_extra_method, NIL); } } /* clean up */ Delete(wrap_args); Delete(pclassname); DelWrapper(w); return status; } virtual int classDirectorConstructors(Node *n) { return Language::classDirectorConstructors(n); } virtual int classDirectorMethods(Node *n) { return Language::classDirectorMethods(n); } virtual int classDirectorDisown(Node *n) { return Language::classDirectorDisown(n); } String *runtimeCode() { String *s = NewString(""); String *shead = Swig_include_sys("rubyhead.swg"); if (!shead) { Printf(stderr, "*** Unable to open 'rubyhead.swg'\n"); } else { Append(s, shead); Delete(shead); } String *serrors = Swig_include_sys("rubyerrors.swg"); if (!serrors) { Printf(stderr, "*** Unable to open 'rubyerrors.swg'\n"); } else { Append(s, serrors); Delete(serrors); } String *strack = Swig_include_sys("rubytracking.swg"); if (!strack) { Printf(stderr, "*** Unable to open 'rubytracking.swg'\n"); } else { Append(s, strack); Delete(strack); } String *sapi = Swig_include_sys("rubyapi.swg"); if (!sapi) { Printf(stderr, "*** Unable to open 'rubyapi.swg'\n"); } else { Append(s, sapi); Delete(sapi); } String *srun = Swig_include_sys("rubyrun.swg"); if (!srun) { Printf(stderr, "*** Unable to open 'rubyrun.swg'\n"); } else { Append(s, srun); Delete(srun); } return s; } String *defaultExternalRuntimeFilename() { return NewString("swigrubyrun.h"); } /*---------------------------------------------------------------------- * kwargsSupport() *--------------------------------------------------------------------*/ bool kwargsSupport() const { // kwargs support isn't actually implemented, but changing to return false may break something now as it turns on compactdefaultargs return true; } }; /* class RUBY */ /* ----------------------------------------------------------------------------- * swig_ruby() - Instantiate module * ----------------------------------------------------------------------------- */ static Language *new_swig_ruby() { return new RUBY(); } extern "C" Language *swig_ruby(void) { return new_swig_ruby(); } /* * Local Variables: * c-basic-offset: 2 * End: */ swig-4.0.1/Source/Modules/r.cxx0000644000175000017500000025034713527063513016220 0ustar williamwilliam /* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * r.cxx * * R language module for SWIG. * ----------------------------------------------------------------------------- */ #include "swigmod.h" #include "cparse.h" static String* replaceInitialDash(const String *name) { String *retval; if (!Strncmp(name, "_", 1)) { retval = Copy(name); Insert(retval, 0, "s"); } else { retval = Copy(name); } return retval; } static String * getRTypeName(SwigType *t, int *outCount = NULL) { String *b = SwigType_base(t); List *els = SwigType_split(t); int count = 0; int i; if(Strncmp(b, "struct ", 7) == 0) Replace(b, "struct ", "", DOH_REPLACE_FIRST); /* Printf(stdout, " %s,base = %s\n", t, b); for(i = 0; i < Len(els); i++) Printf(stdout, "%d) %s, ", i, Getitem(els,i)); Printf(stdout, "\n"); */ for(i = 0; i < Len(els); i++) { String *el = Getitem(els, i); if(Strcmp(el, "p.") == 0 || Strncmp(el, "a(", 2) == 0) { count++; Append(b, "Ref"); } } if(outCount) *outCount = count; String *tmp = NewString(""); char *retName = Char(SwigType_manglestr(t)); Insert(tmp, 0, retName); return tmp; /* if(count) return(b); Delete(b); return(NewString("")); */ } /* -------------------------------------------------------------- * Tries to get the resolved name, with options of adding * or removing a layer of references. Take care not * to request both * --------------------------------------------------------------*/ static String *getRClassName(String *retType, int deRef=0, int upRef=0) { SwigType *resolved = SwigType_typedef_resolve_all(retType); int ispointer = SwigType_ispointer(resolved); int isreference = SwigType_isreference(resolved); if (upRef) { SwigType_add_pointer(resolved); } if (deRef) { if (ispointer) { SwigType_del_pointer(resolved); } if (isreference) { SwigType_del_reference(resolved); } } String *tmp = NewString(""); Insert(tmp, 0, Char(SwigType_manglestr(resolved))); return(tmp); } /* -------------------------------------------------------------- * Tries to get the name of the R class corresponding to the given type * e.g. struct A * is ARef, struct A** is ARefRef. * Now handles arrays, i.e. struct A[2] * --------------------------------------------------------------*/ static String * getRClassNameCopyStruct(String *retType, int addRef) { String *tmp = NewString(""); #if 1 List *l = SwigType_split(retType); int n = Len(l); if(!l || n == 0) { #ifdef R_SWIG_VERBOSE Printf(stdout, "SwigType_split return an empty list for %s\n", retType); #endif return(tmp); } String *el = Getitem(l, n-1); char *ptr = Char(el); if(strncmp(ptr, "struct ", 7) == 0) ptr += 7; Printf(tmp, "%s", ptr); if(addRef) { for(int i = 0; i < n; i++) { if(Strcmp(Getitem(l, i), "p.") == 0 || Strncmp(Getitem(l, i), "a(", 2) == 0) Printf(tmp, "Ref"); } } #else char *retName = Char(SwigType_manglestr(retType)); if(!retName) return(tmp); if(addRef) { while(retName && strlen(retName) > 1 && strncmp(retName, "_p", 2) == 0) { retName += 2; Printf(tmp, "Ref"); } } if(retName[0] == '_') retName ++; Insert(tmp, 0, retName); #endif return tmp; } /* ------------------------------------------------------------- * Write the elements of a list to the File*, one element per line. * If quote is true, surround the element with "element". * This takes care of inserting a tab in front of each line and also * a comma after each element, except the last one. * --------------------------------------------------------------*/ static void writeListByLine(List *l, File *out, bool quote = 0) { int i, n = Len(l); for(i = 0; i < n; i++) Printf(out, "%s%s%s%s%s\n", tab8, quote ? "\"" :"", Getitem(l, i), quote ? "\"" :"", i < n-1 ? "," : ""); } static const char *usage = "\ R Options (available with -r)\n\ -copystruct - Emit R code to copy C structs (on by default)\n\ -debug - Output debug\n\ -dll - Name of the DLL (without the .dll or .so suffix).\n\ Default is the module name.\n\ -gc - Aggressive garbage collection\n\ -memoryprof - Add memory profile\n\ -namespace - Output NAMESPACE file\n\ -no-init-code - Turn off the generation of the R_init_ code\n\ (registration information still generated)\n\ -package - Package name for the PACKAGE argument of the R .Call()\n\ invocations. Default is the module name.\n\ "; /* ------------------------------------------------------------- * Display the help for this module on the screen/console. * --------------------------------------------------------------*/ static void showUsage() { fputs(usage, stdout); } static bool expandTypedef(SwigType *t) { if (SwigType_isenum(t)) return false; String *prefix = SwigType_prefix(t); if (Strncmp(prefix, "f", 1)) return false; if (Strncmp(prefix, "p.f", 3)) return false; return true; } /* ------------------------------------------------------------- * Determine whether we should add a .copy argument to the S function * that wraps/interfaces to the routine that returns the given type. * --------------------------------------------------------------*/ static int addCopyParameter(SwigType *type) { int ok = 0; ok = Strncmp(type, "struct ", 7) == 0 || Strncmp(type, "p.struct ", 9) == 0; if(!ok) { ok = Strncmp(type, "p.", 2); } return(ok); } static void replaceRClass(String *tm, SwigType *type) { String *tmp = getRClassName(type, 0, 0); String *tmp_base = getRClassName(type, 1, 0); String *tmp_ref = getRClassName(type, 0, 1); Replaceall(tm, "$R_class", tmp); Replaceall(tm, "$*R_class", tmp_base); Replaceall(tm, "$&R_class", tmp_ref); Delete(tmp); Delete(tmp_base); Delete(tmp_ref); } class R : public Language { public: R(); void registerClass(Node *n); void main(int argc, char *argv[]); int top(Node *n); void dispatchFunction(Node *n); int functionWrapper(Node *n); int constantWrapper(Node *n); int variableWrapper(Node *n); int classDeclaration(Node *n); int enumDeclaration(Node *n); String *enumValue(Node *n); virtual int enumvalueDeclaration(Node *n); int membervariableHandler(Node *n); int typedefHandler(Node *n); static List *Swig_overload_rank(Node *n, bool script_lang_wrapping); int memberfunctionHandler(Node *n) { if (debugMode) Printf(stdout, " %s %s\n", Getattr(n, "name"), Getattr(n, "type")); member_name = Getattr(n, "sym:name"); processing_class_member_function = 1; int status = Language::memberfunctionHandler(n); processing_class_member_function = 0; return status; } /* Grab the name of the current class being processed so that we can deal with members of that class. */ int classHandler(Node *n){ if(!ClassMemberTable) ClassMemberTable = NewHash(); class_name = Getattr(n, "name"); int status = Language::classHandler(n); class_name = NULL; return status; } // Not used: String *runtimeCode(); protected: int addRegistrationRoutine(String *rname, int nargs); int outputRegistrationRoutines(File *out); int outputCommandLineArguments(File *out); int generateCopyRoutines(Node *n); int DumpCode(Node *n); int OutputMemberReferenceMethod(String *className, int isSet, List *el, File *out); int OutputArrayMethod(String *className, List *el, File *out); int OutputClassMemberTable(Hash *tb, File *out); int OutputClassMethodsTable(File *out); int OutputClassAccessInfo(Hash *tb, File *out); int defineArrayAccessors(SwigType *type); void addNamespaceFunction(String *name) { if(!namespaceFunctions) namespaceFunctions = NewList(); Append(namespaceFunctions, name); } void addNamespaceMethod(String *name) { if(!namespaceMethods) namespaceMethods = NewList(); Append(namespaceMethods, name); } String* processType(SwigType *t, Node *n, int *nargs = NULL); String *createFunctionPointerHandler(SwigType *t, Node *n, int *nargs); int addFunctionPointerProxy(String *name, Node *n, SwigType *t, String *s_paramTypes) { /*XXX Do we need to put the t in there to get the return type later. */ if(!functionPointerProxyTable) functionPointerProxyTable = NewHash(); Setattr(functionPointerProxyTable, name, n); Setattr(SClassDefs, name, name); Printv(s_classes, "setClass('", name, "',\n", tab8, "prototype = list(parameterTypes = c(", s_paramTypes, "),\n", tab8, tab8, tab8, "returnType = '", SwigType_manglestr(t), "'),\n", tab8, "contains = 'CRoutinePointer')\n\n##\n", NIL); return SWIG_OK; } void addSMethodInfo(String *name, String *argType, int nargs); // Simple initialization such as constant strings that can be reused. void init(); void addAccessor(String *memberName, Wrapper *f, String *name, int isSet = -1); static int getFunctionPointerNumArgs(Node *n, SwigType *tt); protected: bool copyStruct; bool memoryProfile; bool aggressiveGc; // Strings into which we cumulate the generated code that is to be written //vto the files. String *enum_values; String *enum_def_calls; String *sfile; String *f_init; String *s_classes; String *f_begin; String *f_runtime; String *f_wrapper; String *s_header; String *f_wrappers; String *s_init; String *s_init_routine; String *s_namespace; // State variables that carry information across calls to functionWrapper() // from member accessors and class declarations. String *opaqueClassDeclaration; int processing_variable; int processing_member_access_function; String *member_name; String *class_name; int processing_class_member_function; List *class_member_functions; List *class_member_set_functions; /* */ Hash *ClassMemberTable; Hash *ClassMethodsTable; Hash *SClassDefs; Hash *SMethodInfo; // Information about routines that are generated and to be registered with // R for dynamic lookup. Hash *registrationTable; Hash *functionPointerProxyTable; List *namespaceFunctions; List *namespaceMethods; List *namespaceClasses; // Probably can do this from ClassMemberTable. // Store a copy of the command line. // Need only keep a string that has it formatted. char **Argv; int Argc; bool inCPlusMode; // State variables that we remember from the command line settings // potentially that govern the code we generate. String *DllName; String *Rpackage; bool noInitializationCode; bool outputNamespaceInfo; String *UnProtectWrapupCode; // Static members static bool debugMode; }; R::R() : copyStruct(false), memoryProfile(false), aggressiveGc(false), enum_values(0), enum_def_calls(0), sfile(0), f_init(0), s_classes(0), f_begin(0), f_runtime(0), f_wrapper(0), s_header(0), f_wrappers(0), s_init(0), s_init_routine(0), s_namespace(0), opaqueClassDeclaration(0), processing_variable(0), processing_member_access_function(0), member_name(0), class_name(0), processing_class_member_function(0), class_member_functions(0), class_member_set_functions(0), ClassMemberTable(0), ClassMethodsTable(0), SClassDefs(0), SMethodInfo(0), registrationTable(0), functionPointerProxyTable(0), namespaceFunctions(0), namespaceMethods(0), namespaceClasses(0), Argv(0), Argc(0), inCPlusMode(false), DllName(0), Rpackage(0), noInitializationCode(false), outputNamespaceInfo(false), UnProtectWrapupCode(0) { } bool R::debugMode = false; int R::getFunctionPointerNumArgs(Node *n, SwigType *tt) { (void) tt; n = Getattr(n, "type"); if (debugMode) Printf(stdout, "type: %s\n", n); ParmList *parms = Getattr(n, "parms"); if (debugMode) Printf(stdout, "parms = %p\n", parms); return ParmList_len(parms); } void R::addSMethodInfo(String *name, String *argType, int nargs) { (void) argType; if(!SMethodInfo) SMethodInfo = NewHash(); if (debugMode) Printf(stdout, "[addMethodInfo] %s\n", name); Hash *tb = Getattr(SMethodInfo, name); if(!tb) { tb = NewHash(); Setattr(SMethodInfo, name, tb); } String *str = Getattr(tb, "max"); int max = -1; if(str) max = atoi(Char(str)); if(max < nargs) { if(str) Delete(str); str = NewStringf("%d", max); Setattr(tb, "max", str); } } /* ---------------------------------------- * Returns the name of the new routine. * ------------------------------------------ */ String * R::createFunctionPointerHandler(SwigType *t, Node *n, int *numArgs) { String *funName = SwigType_manglestr(t); /* See if we have already processed this one. */ if(functionPointerProxyTable && Getattr(functionPointerProxyTable, funName)) return funName; if (debugMode) Printf(stdout, " Defining %s\n", t); SwigType *rettype = Copy(Getattr(n, "type")); SwigType *funcparams = SwigType_functionpointer_decompose(rettype); String *rtype = SwigType_str(rettype, 0); // ParmList *parms = Getattr(n, "parms"); // memory leak ParmList *parms = SwigType_function_parms(SwigType_del_pointer(Copy(t)), n); if (debugMode) { Printf(stdout, "Type: %s\n", t); Printf(stdout, "Return type: %s\n", SwigType_base(t)); } bool isVoidType = Strcmp(rettype, "void") == 0; if (debugMode) Printf(stdout, "%s is void ? %s (%s)\n", funName, isVoidType ? "yes" : "no", rettype); Wrapper *f = NewWrapper(); /* Go through argument list, attach lnames for arguments */ int i = 0; Parm *p = parms; for (i = 0; p; p = nextSibling(p), ++i) { String *arg = Getattr(p, "name"); String *lname; if (!arg && Cmp(Getattr(p, "type"), "void")) { lname = NewStringf("arg%d", i+1); Setattr(p, "name", lname); } else lname = arg; Setattr(p, "lname", lname); } Swig_typemap_attach_parms("out", parms, f); Swig_typemap_attach_parms("scoerceout", parms, f); Swig_typemap_attach_parms("scheck", parms, f); Printf(f->def, "%s %s(", rtype, funName); emit_parameter_variables(parms, f); emit_return_variable(n, rettype, f); // emit_attach_parmmaps(parms,f); /* Using weird name and struct to avoid potential conflicts. */ Wrapper_add_local(f, "r_swig_cb_data", "RCallbackFunctionData *r_swig_cb_data = R_SWIG_getCallbackFunctionData()"); String *lvar = NewString("r_swig_cb_data"); Wrapper_add_local(f, "r_tmp", "SEXP r_tmp"); // for use in converting arguments to R objects for call. Wrapper_add_local(f, "r_nprotect", "int r_nprotect = 0"); // for use in converting arguments to R objects for call. Wrapper_add_local(f, "r_vmax", "char * r_vmax= 0"); // for use in converting arguments to R objects for call. // Add local for error code in return value. This is not in emit_return_variable because that assumes an out typemap // whereas the type makes are reverse Wrapper_add_local(f, "ecode", "int ecode = 0"); p = parms; int nargs = ParmList_len(parms); if(numArgs) { *numArgs = nargs; if (debugMode) Printf(stdout, "Setting number of parameters to %d\n", *numArgs); } String *setExprElements = NewString(""); String *s_paramTypes = NewString(""); for(i = 0; p; i++) { SwigType *tt = Getattr(p, "type"); SwigType *name = Getattr(p, "name"); SwigType *swig_parm_name = NewStringf("swigarg_%s", name); String *tm = Getattr(p, "tmap:out"); bool isVoidParm = Strcmp(tt, "void") == 0; if (isVoidParm) Printf(f->def, "%s", SwigType_str(tt, 0)); else Printf(f->def, "%s %s", SwigType_str(tt, 0), swig_parm_name); if (tm) { String *lstr = SwigType_lstr(tt, 0); if (SwigType_isreference(tt) || SwigType_isrvalue_reference(tt)) { Printf(f->code, "%s = (%s) &%s;\n", Getattr(p, "lname"), lstr, swig_parm_name); } else if (!isVoidParm) { Printf(f->code, "%s = (%s) %s;\n", Getattr(p, "lname"), lstr, swig_parm_name); } Replaceall(tm, "$1", name); Replaceall(tm, "$result", "r_tmp"); if (debugMode) { Printf(stdout, "Calling Replace A: %s\n", Getattr(p,"type")); } replaceRClass(tm, Getattr(p,"type")); Replaceall(tm,"$owner", "0"); Delete(lstr); } Printf(setExprElements, "%s\n", tm); Printf(setExprElements, "SETCAR(r_swig_cb_data->el, %s);\n", "r_tmp"); Printf(setExprElements, "r_swig_cb_data->el = CDR(r_swig_cb_data->el);\n\n"); Printf(s_paramTypes, "'%s'", SwigType_manglestr(tt)); p = nextSibling(p); if(p) { Printf(f->def, ", "); Printf(s_paramTypes, ", "); } } Printf(f->def, ") {\n"); Printf(f->code, "Rf_protect(%s->expr = Rf_allocVector(LANGSXP, %d));\n", lvar, nargs + 1); Printf(f->code, "r_nprotect++;\n"); Printf(f->code, "r_swig_cb_data->el = r_swig_cb_data->expr;\n\n"); Printf(f->code, "SETCAR(r_swig_cb_data->el, r_swig_cb_data->fun);\n"); Printf(f->code, "r_swig_cb_data->el = CDR(r_swig_cb_data->el);\n\n"); Printf(f->code, "%s\n\n", setExprElements); Printv(f->code, "r_swig_cb_data->retValue = R_tryEval(", "r_swig_cb_data->expr,", " R_GlobalEnv,", " &r_swig_cb_data->errorOccurred", ");\n", NIL); Printv(f->code, "\n", "if(r_swig_cb_data->errorOccurred) {\n", "R_SWIG_popCallbackFunctionData(1);\n", "Rf_error(\"error in calling R function as a function pointer (", funName, ")\");\n", "}\n", NIL); if(!isVoidType) { /* Need to deal with the return type of the function pointer, not the function pointer itself. So build a new node that has the relevant pieces. XXX Have to be a little more clever so that we can deal with struct A * - the * is getting lost. Is this still true? If so, will a SwigType_push() solve things? */ Parm *bbase = NewParmNode(rettype, n); String *returnTM = Swig_typemap_lookup("in", bbase, Swig_cresult_name(), f); if(returnTM) { String *tm = returnTM; Replaceall(tm,"$input", "r_swig_cb_data->retValue"); Replaceall(tm,"$target", Swig_cresult_name()); replaceRClass(tm, rettype); Replaceall(tm,"$owner", "0"); Replaceall(tm,"$disown","0"); Printf(f->code, "%s\n", tm); } Delete(bbase); } Printv(f->code, "R_SWIG_popCallbackFunctionData(1);\n", NIL); Printv(f->code, "\n", UnProtectWrapupCode, NIL); if (SwigType_isreference(rettype)) { Printv(f->code, "return *", Swig_cresult_name(), ";\n", NIL); } else if (SwigType_isrvalue_reference(rettype)) { Printv(f->code, "return std::move(*", Swig_cresult_name(), ");\n", NIL); } else if (!isVoidType) { Printv(f->code, "return ", Swig_cresult_name(), ";\n", NIL); } Printv(f->code, "\n}\n", NIL); Replaceall(f->code, "SWIG_exception_fail", "SWIG_exception_noreturn"); /* To coerce correctly in S, we really want to have an extra/intermediate function that handles the scoerceout. We need to check if any of the argument types have an entry in that map. If none do, the ignore and call the function straight. Otherwise, generate a marshalling function. Need to be able to find it in S. Or use an entirely generic one that evaluates the expressions. Handle errors in the evaluation of the function by restoring the stack, if there is one in use for this function (i.e. no userData). */ Wrapper_print(f, f_wrapper); addFunctionPointerProxy(funName, n, t, s_paramTypes); Delete(s_paramTypes); Delete(rtype); Delete(rettype); Delete(funcparams); DelWrapper(f); return funName; } void R::init() { UnProtectWrapupCode = NewStringf("%s", "vmaxset(r_vmax);\nif(r_nprotect) Rf_unprotect(r_nprotect);\n\n"); SClassDefs = NewHash(); sfile = NewString(""); f_init = NewString(""); s_header = NewString(""); f_begin = NewString(""); f_runtime = NewString(""); f_wrapper = NewString(""); s_classes = NewString(""); s_init = NewString(""); s_init_routine = NewString(""); enum_def_calls = NewString(""); } #if 0 int R::cDeclaration(Node *n) { SwigType *t = Getattr(n, "type"); SwigType *name = Getattr(n, "name"); if (debugMode) Printf(stdout, "cDeclaration (%s): %s\n", name, SwigType_lstr(t, 0)); return Language::cDeclaration(n); } #endif /* ------------------------------------------------------------- * Method from Language that is called to start the entire * processing off, i.e. the generation of the code. * It is called after the input has been read and parsed. * Here we open the output streams and generate the code. * ------------------------------------------------------------- */ int R::top(Node *n) { String *module = Getattr(n, "name"); if (debugMode) { Printf(stdout, " %s\n", module); } if(!Rpackage) Rpackage = Copy(module); if(!DllName) DllName = Copy(module); if(outputNamespaceInfo) { s_namespace = NewString(""); Swig_register_filebyname("snamespace", s_namespace); Printf(s_namespace, "useDynLib(%s)\n", DllName); } /* Associate the different streams with names so that they can be used in %insert directives by the typemap code. */ Swig_register_filebyname("sinit", s_init); Swig_register_filebyname("sinitroutine", s_init_routine); Swig_register_filebyname("begin", f_begin); Swig_register_filebyname("runtime", f_runtime); Swig_register_filebyname("init", f_init); Swig_register_filebyname("header", s_header); Swig_register_filebyname("wrapper", f_wrapper); Swig_register_filebyname("s", sfile); Swig_register_filebyname("sclasses", s_classes); Swig_banner(f_begin); Printf(f_runtime, "\n\n#ifndef SWIGR\n#define SWIGR\n#endif\n\n"); Swig_banner_target_lang(s_init, "#"); outputCommandLineArguments(s_init); Printf(f_wrapper, "#ifdef __cplusplus\n"); Printf(f_wrapper, "extern \"C\" {\n"); Printf(f_wrapper, "#endif\n\n"); Language::top(n); Printf(f_wrapper, "#ifdef __cplusplus\n"); Printf(f_wrapper, "}\n"); Printf(f_wrapper, "#endif\n"); String *type_table = NewString(""); SwigType_emit_type_table(f_runtime,f_wrapper); Delete(type_table); if(ClassMemberTable) { //XXX OutputClassAccessInfo(ClassMemberTable, sfile); Delete(ClassMemberTable); ClassMemberTable = NULL; } Printf(f_init,"}\n"); if(registrationTable) outputRegistrationRoutines(f_init); /* Now arrange to write the 2 files - .S and .c. */ DumpCode(n); Delete(sfile); Delete(s_classes); Delete(s_init); Delete(f_wrapper); Delete(f_init); Delete(s_header); Delete(f_runtime); Delete(f_begin); return SWIG_OK; } /* ------------------------------------------------------------- * Write the generated code to the .S and the .c files. * ------------------------------------------------------------- */ int R::DumpCode(Node *n) { String *output_filename = NewString(""); /* The name of the file in which we will generate the S code. */ Printf(output_filename, "%s%s.R", SWIG_output_directory(), Rpackage); #ifdef R_SWIG_VERBOSE Printf(stdout, "Writing S code to %s\n", output_filename); #endif File *scode = NewFile(output_filename, "w", SWIG_output_files()); if (!scode) { FileErrorDisplay(output_filename); SWIG_exit(EXIT_FAILURE); } Delete(output_filename); Printf(scode, "%s\n\n", s_init); Printf(scode, "%s\n\n", s_classes); Printf(scode, "%s\n", sfile); Printf(scode, "%s\n", enum_def_calls); Delete(scode); String *outfile = Getattr(n,"outfile"); File *runtime = NewFile(outfile,"w", SWIG_output_files()); if (!runtime) { FileErrorDisplay(outfile); SWIG_exit(EXIT_FAILURE); } Printf(runtime, "%s", f_begin); Printf(runtime, "%s\n", f_runtime); Printf(runtime, "%s\n", s_header); Printf(runtime, "%s\n", f_wrapper); Printf(runtime, "%s\n", f_init); Delete(runtime); if(outputNamespaceInfo) { output_filename = NewString(""); Printf(output_filename, "%sNAMESPACE", SWIG_output_directory()); File *ns = NewFile(output_filename, "w", SWIG_output_files()); if (!ns) { FileErrorDisplay(output_filename); SWIG_exit(EXIT_FAILURE); } Delete(output_filename); Printf(ns, "%s\n", s_namespace); Printf(ns, "\nexport(\n"); writeListByLine(namespaceFunctions, ns); Printf(ns, ")\n"); Printf(ns, "\nexportMethods(\n"); writeListByLine(namespaceMethods, ns, 1); Printf(ns, ")\n"); Delete(ns); Delete(s_namespace); } return SWIG_OK; } /* ------------------------------------------------------------- * We may need to do more.... so this is left as a * stub for the moment. * -------------------------------------------------------------*/ int R::OutputClassAccessInfo(Hash *tb, File *out) { int n = OutputClassMemberTable(tb, out); OutputClassMethodsTable(out); return n; } /* ------------------------------------------------------------- * Currently this just writes the information collected about the * different methods of the C++ classes that have been processed * to the console. * This will be used later to define S4 generics and methods. * --------------------------------------------------------------*/ int R::OutputClassMethodsTable(File *) { Hash *tb = ClassMethodsTable; if(!tb) return SWIG_OK; List *keys = Keys(tb); String *key; int i, n = Len(keys); if (debugMode) { for(i = 0; i < n ; i++ ) { key = Getitem(keys, i); Printf(stdout, "%d) %s\n", i, key); List *els = Getattr(tb, key); int nels = Len(els); Printf(stdout, "\t"); for(int j = 0; j < nels; j+=2) { Printf(stdout, "%s%s", Getitem(els, j), j < nels - 1 ? ", " : ""); Printf(stdout, "%s\n", Getitem(els, j+1)); } Printf(stdout, "\n"); } } return SWIG_OK; } /* -------------------------------------------------------------- * Iterate over the _set and <>_get * elements and generate the $ and $<- functions * that provide constrained access to the member * fields in these elements. * tb - a hash table that is built up in functionWrapper * as we process each membervalueHandler. * The entries are indexed by _set and * _get. Each entry is a List *. * out - the stram where the code is to be written. This is the S * code stream as we generate only S code here. * --------------------------------------------------------------*/ int R::OutputClassMemberTable(Hash *tb, File *out) { List *keys = Keys(tb), *el; String *key; int i, n = Len(keys); /* Loop over all the _set and _get entries in the table. */ /* This function checks for names ending in _set - perhaps it should */ /* use attributes of some other form, as it potentially clashes with */ /* methods ending in _set */ if(n && outputNamespaceInfo) { Printf(s_namespace, "exportClasses("); } for(i = 0; i < n; i++) { key = Getitem(keys, i); el = Getattr(tb, key); String *className = Getitem(el, 0); char *ptr = Char(key); int klen = Len(key); int isSet = 0; if (klen > 4) { ptr = &ptr[klen - 4]; isSet = strcmp(ptr, "_set") == 0; } // OutputArrayMethod(className, el, out); OutputMemberReferenceMethod(className, isSet, el, out); if(outputNamespaceInfo) Printf(s_namespace, "\"%s\"%s", className, i < n-1 ? "," : ""); } if(n && outputNamespaceInfo) { Printf(s_namespace, ")\n"); } return n; } /* -------------------------------------------------------------- * Write the methods for $ or $<- for accessing a member field in an * struct or union (or class). * className - the name of the struct or union (e.g. Bar for struct Bar) * isSet - a logical value indicating whether the method is for * modifying ($<-) or accessing ($) the member field. * el - a list of length 2 * # accessible member elements + 1. * The first element is the name of the class. * The other pairs are member name and the name of the R function to access it. * out - the stream where we write the code. * --------------------------------------------------------------*/ int R::OutputMemberReferenceMethod(String *className, int isSet, List *el, File *out) { int numMems = Len(el), j; int varaccessor = 0; if (numMems == 0) return SWIG_OK; Wrapper *f = NewWrapper(), *attr = NewWrapper(); Printf(f->def, "function(x, name%s)", isSet ? ", value" : ""); Printf(attr->def, "function(x, i, j, ...%s)", isSet ? ", value" : ""); Printf(f->code, "{\n"); Printf(f->code, "%saccessorFuns = list(", tab8); Node *itemList = NewHash(); bool has_prev = false; for(j = 0; j < numMems; j+=3) { String *item = Getitem(el, j); String *dup = Getitem(el, j + 1); char *ptr = Char(dup); ptr = &ptr[Len(dup) - 3]; if (!strcmp(ptr, "get")) varaccessor++; if (Getattr(itemList, item)) continue; Setattr(itemList, item, "1"); String *pitem; if (!Strcmp(item, "operator ()")) { pitem = NewString("call"); } else if (!Strcmp(item, "operator ->")) { pitem = NewString("deref"); } else if (!Strcmp(item, "operator +")) { pitem = NewString("add"); } else if (!Strcmp(item, "operator -")) { pitem = NewString("sub"); } else { pitem = Copy(item); } if (has_prev) Printf(f->code, ", "); Printf(f->code, "'%s' = %s", pitem, dup); has_prev = true; Delete(pitem); } Delete(itemList); Printf(f->code, ");\n"); if (!isSet && varaccessor > 0) { Printf(f->code, "%svaccessors = c(", tab8); int first = 1; for(j = 0; j < numMems; j+=3) { String *item = Getitem(el, j); String *dup = Getitem(el, j + 1); char *ptr = Char(dup); ptr = &ptr[Len(dup) - 3]; if (!strcmp(ptr, "get")) { Printf(f->code, "%s'%s'", first ? "" : ", ", item); first = 0; } } Printf(f->code, ");\n"); } /* Printv(f->code, tab8, "idx = pmatch(name, names(accessorFuns))\n", tab8, "if(is.na(idx)) {\n", tab8, tab4, "stop(\"No ", (isSet ? "modifiable" : "accessible"), " field named \", name, \" in ", className, ": fields are \", paste(names(accessorFuns), sep = \", \")", ")", "\n}\n", NIL); */ Printv(f->code, ";", tab8, "idx = pmatch(name, names(accessorFuns));\n", tab8, "if(is.na(idx)) \n", tab8, tab4, NIL); Printf(f->code, "return(callNextMethod(x, name%s));\n", isSet ? ", value" : ""); Printv(f->code, tab8, "f = accessorFuns[[idx]];\n", NIL); if(isSet) { Printv(f->code, tab8, "f(x, value);\n", NIL); Printv(f->code, tab8, "x;\n", NIL); // make certain to return the S value. } else { if (varaccessor) { Printv(f->code, tab8, "if (is.na(match(name, vaccessors))) function(...){f(x, ...)} else f(x);\n", NIL); } else { Printv(f->code, tab8, "function(...){f(x, ...)};\n", NIL); } } Printf(f->code, "}\n"); Printf(out, "# Start of accessor method for %s\n", className); Printf(out, "setMethod('$%s', '_p%s', ", isSet ? "<-" : "", getRClassName(className)); Wrapper_print(f, out); Printf(out, ");\n"); if(isSet) { Printf(out, "setMethod('[[<-', c('_p%s', 'character'),", getRClassName(className)); Insert(f->code, 2, "name = i;\n"); Printf(attr->code, "%s", f->code); Wrapper_print(attr, out); Printf(out, ");\n"); } DelWrapper(attr); DelWrapper(f); Printf(out, "# end of accessor method for %s\n", className); return SWIG_OK; } /* ------------------------------------------------------------- * Write the methods for [ or [<- for accessing a member field in an * struct or union (or class). * className - the name of the struct or union (e.g. Bar for struct Bar) * el - a list of length 2 * # accessible member elements + 1. * The first element is the name of the class. * The other pairs are member name and the name of the R function to access it. * out - the stream where we write the code. * --------------------------------------------------------------*/ int R::OutputArrayMethod(String *className, List *el, File *out) { int numMems = Len(el), j; if(!el || numMems == 0) return(0); Printf(out, "# start of array methods for %s\n", className); for(j = 0; j < numMems; j+=3) { String *item = Getitem(el, j); String *dup = Getitem(el, j + 1); if (!Strcmp(item, "__getitem__")) { Printf(out, "setMethod('[', '_p%s', function(x, i, j, ..., drop =TRUE) ", getRClassName(className)); Printf(out, " sapply(i, function (n) %s(x, as.integer(n-1))))\n\n", dup); } if (!Strcmp(item, "__setitem__")) { Printf(out, "setMethod('[<-', '_p%s', function(x, i, j, ..., value)", getRClassName(className)); Printf(out, " sapply(1:length(i), function(n) %s(x, as.integer(i[n]-1), value[n])))\n\n", dup); } } Printf(out, "# end of array methods for %s\n", className); return SWIG_OK; } /* ------------------------------------------------------------- * Called when a enumeration is to be processed. * We want to call the R function defineEnumeration(). * tdname is the typedef of the enumeration, i.e. giving its name. * --------------------------------------------------------------*/ int R::enumDeclaration(Node *n) { if (!ImportMode) { if (getCurrentClass() && (cplus_mode != PUBLIC)) return SWIG_NOWRAP; String *symname = Getattr(n, "sym:name"); // TODO - deal with anonymous enumerations // Previous enum code for R didn't wrap them if (!symname || Getattr(n, "unnamedinstance")) return SWIG_NOWRAP; // create mangled name for the enum // This will have content if the %nspace feature is set on // the input file String *nspace = Getattr(n, "sym:nspace"); // NSpace/getNSpace() only works during Language::enumDeclaration call String *ename; String *name = Getattr(n, "name"); ename = getRClassName(name); if (debugMode) { Node *current_class = getCurrentClass(); String *cl = NewString(""); if (current_class) { cl = getEnumClassPrefix(); } Printf(stdout, "enumDeclaration: %s, %s, %s, %s, %s\n", name, symname, nspace, ename, cl); } Delete(name); // set up a call to create the R enum structure. The list of // individual elements will be built in enum_code enum_values = 0; // Emit each enum item Language::enumDeclaration(n); Printf(enum_def_calls, "defineEnumeration(\"%s\",\n .values=c(%s))\n\n", ename, enum_values); Delete(enum_values); Delete(ename); //Delete(symname); } return SWIG_OK; } /* ------------------------------------------------------------- * --------------------------------------------------------------*/ int R::enumvalueDeclaration(Node *n) { if (getCurrentClass() && (cplus_mode != PUBLIC)) { Printf(stdout, "evd: Not public\n"); return SWIG_NOWRAP; } Swig_require("enumvalueDeclaration", n, "*name", "?value", NIL); String *symname = Getattr(n, "sym:name"); String *value = Getattr(n, "value"); String *name = Getattr(n, "name"); Node *parent = parentNode(n); String *parent_name = Getattr(parent, "name"); String *newsymname = 0; String *tmpValue; // Strange hack from parent method if (value) tmpValue = NewString(value); else tmpValue = NewString(name); // Note that this is used in enumValue() amongst other places Setattr(n, "value", tmpValue); // Deal with enum values that are not int int swigtype = SwigType_type(Getattr(n, "type")); if (swigtype == T_BOOL) { const char *val = Equal(Getattr(n, "enumvalue"), "true") ? "1" : "0"; Setattr(n, "enumvalue", val); } else if (swigtype == T_CHAR) { String *val = NewStringf("'%s'", Getattr(n, "enumvalue")); Setattr(n, "enumvalue", val); Delete(val); } if (GetFlag(parent, "scopedenum")) { newsymname = Swig_name_member(0, Getattr(parent, "sym:name"), symname); symname = newsymname; } { // Wrap C/C++ enums with constant integers or use the typesafe enum pattern SwigType *typemap_lookup_type = parent_name ? parent_name : NewString("enum "); if (debugMode) { Printf(stdout, "Setting type: %s\n", Copy(typemap_lookup_type)); } Setattr(n, "type", typemap_lookup_type); // Simple integer constants // Note these are always generated for anonymous enums, no matter what enum_feature is specified // Code generated is the same for SimpleEnum and TypeunsafeEnum -> the class it is generated into is determined later String *value = enumValue(n); if (enum_values) { Printf(enum_values, ",\n\"%s\" = %s", name, value); } else { enum_values = NewString(""); Printf(enum_values, "\"%s\" = %s", name, value); } Delete(value); } return SWIG_OK; } /* ------------------------------------------------------------- * Create accessor functions for variables. * Does not create equivalent wrappers for enumerations, * which are handled differently * --------------------------------------------------------------*/ int R::variableWrapper(Node *n) { String *name = Getattr(n, "sym:name"); if (debugMode) { Printf(stdout, "variableWrapper %s\n", n); } processing_variable = 1; Language::variableWrapper(n); // Force the emission of the _set and _get function wrappers. processing_variable = 0; SwigType *ty = Getattr(n, "type"); String *nodeType = nodeType(n); int addCopyParam = addCopyParameter(ty); //XXX processType(ty, n); if (nodeType && !Strcmp(nodeType, "enumitem")) { /* special wrapper for enums - don't want the R _set, _get functions*/ if (debugMode) { Printf(stdout, "variableWrapper enum branch\n"); } } else if(!SwigType_isconst(ty)) { Wrapper *f = NewWrapper(); Printf(f->def, "%s = \nfunction(value%s)\n{\n", name, addCopyParam ? ", .copy = FALSE" : ""); Printv(f->code, "if(missing(value)) {\n", name, "_get(", addCopyParam ? ".copy" : "", ")\n}", NIL); Printv(f->code, " else {\n", name, "_set(value)\n}\n}", NIL); Wrapper_print(f, sfile); DelWrapper(f); } else { Printf(sfile, "%s = %s_get\n", name, name); } return SWIG_OK; } /* ------------------------------------------------------------- * Creates accessor functions for class members. * ToDo - this version depends on naming conventions and needs * to be replaced. * --------------------------------------------------------------*/ void R::addAccessor(String *memberName, Wrapper *wrapper, String *name, int isSet) { if(isSet < 0) { int n = Len(name); char *ptr = Char(name); if (n>4) { isSet = Strcmp(NewString(&ptr[n-4]), "_set") == 0; } } List *l = isSet ? class_member_set_functions : class_member_functions; if(!l) { l = NewList(); if(isSet) class_member_set_functions = l; else class_member_functions = l; } Append(l, memberName); Append(l, name); String *tmp = NewString(""); Wrapper_print(wrapper, tmp); Append(l, tmp); // if we could put the wrapper in directly: Append(l, Copy(sfun)); if (debugMode) Printf(stdout, "Adding accessor: %s (%s) => %s\n", memberName, name, tmp); } #define MAX_OVERLOAD 256 struct Overloaded { Node *n; /* Node */ int argc; /* Argument count */ ParmList *parms; /* Parameters used for overload check */ int error; /* Ambiguity error */ }; List * R::Swig_overload_rank(Node *n, bool script_lang_wrapping) { Overloaded nodes[MAX_OVERLOAD]; int nnodes = 0; Node *o = Getattr(n,"sym:overloaded"); if (!o) return 0; Node *c = o; while (c) { if (Getattr(c,"error")) { c = Getattr(c,"sym:nextSibling"); continue; } /* if (SmartPointer && Getattr(c,"cplus:staticbase")) { c = Getattr(c,"sym:nextSibling"); continue; } */ /* Make a list of all the declarations (methods) that are overloaded with * this one particular method name */ if (Getattr(c,"wrap:name")) { nodes[nnodes].n = c; nodes[nnodes].parms = Getattr(c,"wrap:parms"); nodes[nnodes].argc = emit_num_required(nodes[nnodes].parms); nodes[nnodes].error = 0; nnodes++; } c = Getattr(c,"sym:nextSibling"); } /* Sort the declarations by required argument count */ { int i,j; for (i = 0; i < nnodes; i++) { for (j = i+1; j < nnodes; j++) { if (nodes[i].argc > nodes[j].argc) { Overloaded t = nodes[i]; nodes[i] = nodes[j]; nodes[j] = t; } } } } /* Sort the declarations by argument types */ { int i,j; for (i = 0; i < nnodes-1; i++) { if (nodes[i].argc == nodes[i+1].argc) { for (j = i+1; (j < nnodes) && (nodes[j].argc == nodes[i].argc); j++) { Parm *p1 = nodes[i].parms; Parm *p2 = nodes[j].parms; int differ = 0; int num_checked = 0; while (p1 && p2 && (num_checked < nodes[i].argc)) { if (debugMode) { Printf(stdout,"p1 = '%s', p2 = '%s'\n", Getattr(p1,"type"), Getattr(p2,"type")); } if (checkAttribute(p1,"tmap:in:numinputs","0")) { p1 = Getattr(p1,"tmap:in:next"); continue; } if (checkAttribute(p2,"tmap:in:numinputs","0")) { p2 = Getattr(p2,"tmap:in:next"); continue; } String *t1 = Getattr(p1,"tmap:typecheck:precedence"); String *t2 = Getattr(p2,"tmap:typecheck:precedence"); if (debugMode) { Printf(stdout,"t1 = '%s', t2 = '%s'\n", t1, t2); } if ((!t1) && (!nodes[i].error)) { Swig_warning(WARN_TYPEMAP_TYPECHECK, Getfile(nodes[i].n), Getline(nodes[i].n), "Overloaded method %s not supported (incomplete type checking rule - no precedence level in typecheck typemap for '%s').\n", Swig_name_decl(nodes[i].n), SwigType_str(Getattr(p1, "type"), 0)); nodes[i].error = 1; } else if ((!t2) && (!nodes[j].error)) { Swig_warning(WARN_TYPEMAP_TYPECHECK, Getfile(nodes[j].n), Getline(nodes[j].n), "Overloaded method %s not supported (incomplete type checking rule - no precedence level in typecheck typemap for '%s').\n", Swig_name_decl(nodes[j].n), SwigType_str(Getattr(p2, "type"), 0)); nodes[j].error = 1; } if (t1 && t2) { int t1v, t2v; t1v = atoi(Char(t1)); t2v = atoi(Char(t2)); differ = t1v-t2v; } else if (!t1 && t2) differ = 1; else if (t1 && !t2) differ = -1; else if (!t1 && !t2) differ = -1; num_checked++; if (differ > 0) { Overloaded t = nodes[i]; nodes[i] = nodes[j]; nodes[j] = t; break; } else if ((differ == 0) && (Strcmp(t1,"0") == 0)) { t1 = Getattr(p1,"ltype"); if (!t1) { t1 = SwigType_ltype(Getattr(p1,"type")); if (Getattr(p1,"tmap:typecheck:SWIGTYPE")) { SwigType_add_pointer(t1); } Setattr(p1,"ltype",t1); } t2 = Getattr(p2,"ltype"); if (!t2) { t2 = SwigType_ltype(Getattr(p2,"type")); if (Getattr(p2,"tmap:typecheck:SWIGTYPE")) { SwigType_add_pointer(t2); } Setattr(p2,"ltype",t2); } /* Need subtype check here. If t2 is a subtype of t1, then we need to change the order */ if (SwigType_issubtype(t2,t1)) { Overloaded t = nodes[i]; nodes[i] = nodes[j]; nodes[j] = t; } if (Strcmp(t1,t2) != 0) { differ = 1; break; } } else if (differ) { break; } if (Getattr(p1,"tmap:in:next")) { p1 = Getattr(p1,"tmap:in:next"); } else { p1 = nextSibling(p1); } if (Getattr(p2,"tmap:in:next")) { p2 = Getattr(p2,"tmap:in:next"); } else { p2 = nextSibling(p2); } } if (!differ) { /* See if declarations differ by const only */ String *d1 = Getattr(nodes[i].n, "decl"); String *d2 = Getattr(nodes[j].n, "decl"); if (d1 && d2) { String *dq1 = Copy(d1); String *dq2 = Copy(d2); if (SwigType_isconst(d1)) { Delete(SwigType_pop(dq1)); } if (SwigType_isconst(d2)) { Delete(SwigType_pop(dq2)); } if (Strcmp(dq1, dq2) == 0) { if (SwigType_isconst(d1) && !SwigType_isconst(d2)) { if (script_lang_wrapping) { // Swap nodes so that the const method gets ignored (shadowed by the non-const method) Overloaded t = nodes[i]; nodes[i] = nodes[j]; nodes[j] = t; } differ = 1; if (!nodes[j].error) { if (script_lang_wrapping) { Swig_warning(WARN_LANG_OVERLOAD_CONST, Getfile(nodes[j].n), Getline(nodes[j].n), "Overloaded method %s ignored,\n", Swig_name_decl(nodes[j].n)); Swig_warning(WARN_LANG_OVERLOAD_CONST, Getfile(nodes[i].n), Getline(nodes[i].n), "using non-const method %s instead.\n", Swig_name_decl(nodes[i].n)); } else { if (!Getattr(nodes[j].n, "overload:ignore")) { Swig_warning(WARN_LANG_OVERLOAD_IGNORED, Getfile(nodes[j].n), Getline(nodes[j].n), "Overloaded method %s ignored,\n", Swig_name_decl(nodes[j].n)); Swig_warning(WARN_LANG_OVERLOAD_IGNORED, Getfile(nodes[i].n), Getline(nodes[i].n), "using %s instead.\n", Swig_name_decl(nodes[i].n)); } } } nodes[j].error = 1; } else if (!SwigType_isconst(d1) && SwigType_isconst(d2)) { differ = 1; if (!nodes[j].error) { if (script_lang_wrapping) { Swig_warning(WARN_LANG_OVERLOAD_CONST, Getfile(nodes[j].n), Getline(nodes[j].n), "Overloaded method %s ignored,\n", Swig_name_decl(nodes[j].n)); Swig_warning(WARN_LANG_OVERLOAD_CONST, Getfile(nodes[i].n), Getline(nodes[i].n), "using non-const method %s instead.\n", Swig_name_decl(nodes[i].n)); } else { if (!Getattr(nodes[j].n, "overload:ignore")) { Swig_warning(WARN_LANG_OVERLOAD_IGNORED, Getfile(nodes[j].n), Getline(nodes[j].n), "Overloaded method %s ignored,\n", Swig_name_decl(nodes[j].n)); Swig_warning(WARN_LANG_OVERLOAD_IGNORED, Getfile(nodes[i].n), Getline(nodes[i].n), "using %s instead.\n", Swig_name_decl(nodes[i].n)); } } } nodes[j].error = 1; } } Delete(dq1); Delete(dq2); } } if (!differ) { if (!nodes[j].error) { if (script_lang_wrapping) { Swig_warning(WARN_LANG_OVERLOAD_SHADOW, Getfile(nodes[j].n), Getline(nodes[j].n), "Overloaded method %s effectively ignored,\n", Swig_name_decl(nodes[j].n)); Swig_warning(WARN_LANG_OVERLOAD_SHADOW, Getfile(nodes[i].n), Getline(nodes[i].n), "as it is shadowed by %s.\n", Swig_name_decl(nodes[i].n)); } else { if (!Getattr(nodes[j].n, "overload:ignore")) { Swig_warning(WARN_LANG_OVERLOAD_IGNORED, Getfile(nodes[j].n), Getline(nodes[j].n), "Overloaded method %s ignored,\n", Swig_name_decl(nodes[j].n)); Swig_warning(WARN_LANG_OVERLOAD_IGNORED, Getfile(nodes[i].n), Getline(nodes[i].n), "using %s instead.\n", Swig_name_decl(nodes[i].n)); } } nodes[j].error = 1; } } } } } } List *result = NewList(); { int i; for (i = 0; i < nnodes; i++) { if (nodes[i].error) Setattr(nodes[i].n, "overload:ignore", "1"); Append(result,nodes[i].n); // Printf(stdout,"[ %d ] %s\n", i, ParmList_errorstr(nodes[i].parms)); // Swig_print_node(nodes[i].n); } } return result; } void R::dispatchFunction(Node *n) { Wrapper *f = NewWrapper(); String *symname = Getattr(n, "sym:name"); String *nodeType = Getattr(n, "nodeType"); bool constructor = (!Cmp(nodeType, "constructor")); String *sfname = NewString(symname); if (constructor) Replace(sfname, "new_", "", DOH_REPLACE_FIRST); Printf(f->def, "`%s` <- function(...) {", sfname); if (debugMode) { Swig_print_node(n); } List *dispatch = Swig_overload_rank(n, true); int nfunc = Len(dispatch); Printv(f->code, "argtypes <- mapply(class, list(...));\n", "argv <- list(...);\n", "argc <- length(argtypes);\n", NIL ); Printf(f->code, "# dispatch functions %d\n", nfunc); int cur_args = -1; bool first_compare = true; for (int i=0; i < nfunc; i++) { Node *ni = Getitem(dispatch,i); Parm *pi = Getattr(ni,"wrap:parms"); int num_arguments = emit_num_arguments(pi); String *overname = Getattr(ni,"sym:overname"); if (cur_args != num_arguments) { if (cur_args != -1) { Printv(f->code, "} else ", NIL); } Printf(f->code, "if (argc == %d) {", num_arguments); cur_args = num_arguments; first_compare = true; } Parm *p; int j; if (num_arguments > 0) { if (!first_compare) { Printv(f->code, " else ", NIL); } else { first_compare = false; } Printv(f->code, "if (", NIL); for (p =pi, j = 0 ; j < num_arguments ; j++) { if (debugMode) { Swig_print_node(p); } String *tm = Swig_typemap_lookup("rtype", p, "", 0); if(tm) { replaceRClass(tm, Getattr(p, "type")); } String *tmcheck = Swig_typemap_lookup("rtypecheck", p, "", 0); if (tmcheck) { String *tmp = NewString(""); Printf(tmp, "argv[[%d]]", j+1); Replaceall(tmcheck, "$arg", tmp); Printf(tmp, "argtype[%d]", j+1); Replaceall(tmcheck, "$argtype", tmp); if (tm) { Replaceall(tmcheck, "$rtype", tm); } if (debugMode) { Printf(stdout, "%s\n", tmcheck); } Printf(f->code, "%s(%s)", j == 0 ? "" : " && ", tmcheck); p = Getattr(p, "tmap:in:next"); continue; } // Below should be migrated into rtypecheck typemaps if (tm) { Printf(f->code, "%s", j == 0 ? "" : " && "); if (Strcmp(tm, "numeric") == 0) { Printf(f->code, "is.numeric(argv[[%d]])", j+1); } else if (Strcmp(tm, "integer") == 0) { Printf(f->code, "(is.integer(argv[[%d]]) || is.numeric(argv[[%d]]))", j+1, j+1); } else if (Strcmp(tm, "character") == 0) { Printf(f->code, "is.character(argv[[%d]])", j+1); } else { if (SwigType_ispointer(Getattr(p, "type"))) Printf(f->code, "(extends(argtypes[%d], '%s') || is.null(argv[[%d]]))", j+1, tm, j+1); else Printf(f->code, "extends(argtypes[%d], '%s')", j+1, tm); } } if (!SwigType_ispointer(Getattr(p, "type"))) { Printf(f->code, " && length(argv[[%d]]) == 1", j+1); } p = Getattr(p, "tmap:in:next"); } Printf(f->code, ") { f <- %s%s; }\n", sfname, overname); } else { Printf(f->code, "f <- %s%s; ", sfname, overname); } } if (cur_args != -1) { Printf(f->code, "} else {\n" "stop(\"cannot find overloaded function for %s with argtypes (\"," "toString(argtypes),\")\");\n" "}", sfname); } Printv(f->code, ";\nf(...)", NIL); Printv(f->code, ";\n}", NIL); Wrapper_print(f, sfile); Printv(sfile, "# Dispatch function\n", NIL); DelWrapper(f); } /*-------------------------------------------------------------- * --------------------------------------------------------------*/ int R::functionWrapper(Node *n) { String *fname = Getattr(n, "name"); String *iname = Getattr(n, "sym:name"); String *type = Getattr(n, "type"); if (debugMode) { Printf(stdout, " %s %s %s\n", fname, iname, type); } String *overname = 0; String *nodeType = Getattr(n, "nodeType"); bool constructor = (!Cmp(nodeType, "constructor")); bool destructor = (!Cmp(nodeType, "destructor")); String *sfname = NewString(iname); if (constructor) Replace(sfname, "new_", "", DOH_REPLACE_FIRST); if (Getattr(n,"sym:overloaded")) { overname = Getattr(n,"sym:overname"); Append(sfname, overname); } if (debugMode) Printf(stdout, " processing parameters\n"); ParmList *l = Getattr(n, "parms"); Parm *p; String *tm; p = l; while(p) { SwigType *resultType = Getattr(p, "type"); if (expandTypedef(resultType) && SwigType_istypedef(resultType)) { SwigType *resolved = SwigType_typedef_resolve_all(resultType); if (expandTypedef(resolved)) { if (debugMode) { Printf(stdout, "Setting type: %s\n", resolved); } Setattr(p, "type", Copy(resolved)); } } p = nextSibling(p); } String *unresolved_return_type = Copy(type); if (expandTypedef(type) && SwigType_istypedef(type)) { SwigType *resolved = SwigType_typedef_resolve_all(type); if (debugMode) Printf(stdout, " resolved %s\n", Copy(unresolved_return_type)); if (expandTypedef(resolved)) { type = Copy(resolved); Setattr(n, "type", type); } } if (debugMode) Printf(stdout, " unresolved_return_type %s\n", unresolved_return_type); if(processing_member_access_function) { if (debugMode) Printf(stdout, " '%s' '%s' '%s' '%s'\n", fname, iname, member_name, class_name); if(opaqueClassDeclaration) return SWIG_OK; /* Add the name of this member to a list for this class_name. We will dump all these at the end. */ int n = Len(iname); char *ptr = Char(iname); bool isSet(0); if (n > 4) isSet = Strcmp(NewString(&ptr[n-4]), "_set") == 0; String *tmp = NewString(""); Printf(tmp, "%s_%s", class_name, isSet ? "set" : "get"); List *memList = Getattr(ClassMemberTable, tmp); if(!memList) { memList = NewList(); Append(memList, class_name); Setattr(ClassMemberTable, tmp, memList); } Delete(tmp); Append(memList, member_name); Append(memList, iname); } int i; int nargs; String *wname = Swig_name_wrapper(iname); Replace(wname, "_wrap", "R_swig", DOH_REPLACE_FIRST); if(overname) Append(wname, overname); Setattr(n,"wrap:name", wname); Wrapper *f = NewWrapper(); Wrapper *sfun = NewWrapper(); int isVoidReturnType = (Strcmp(type, "void") == 0); // Need to use the unresolved return type since // typedef resolution removes the const which causes a // mismatch with the function action emit_return_variable(n, unresolved_return_type, f); SwigType *rtype = Getattr(n, "type"); int addCopyParam = 0; if(!isVoidReturnType) addCopyParam = addCopyParameter(rtype); // Can we get the nodeType() of the type node! and see if it is a struct. // int addCopyParam = SwigType_isclass(rtype); // if(addCopyParam) if (debugMode) Printf(stdout, "Adding a .copy argument to %s for %s = %s\n", iname, type, addCopyParam ? "yes" : "no"); Printv(f->def, "SWIGEXPORT SEXP\n", wname, " ( ", NIL); Printf(sfun->def, "# Start of %s\n", iname); Printv(sfun->def, "\n`", sfname, "` = function(", NIL); if(outputNamespaceInfo) {//XXX Need to be a little more discriminating if (constructor) { String *niname = Copy(iname); Replace(niname, "new_", "", DOH_REPLACE_FIRST); addNamespaceFunction(niname); Delete(niname); } else { addNamespaceFunction(iname); } } Swig_typemap_attach_parms("scoercein", l, f); Swig_typemap_attach_parms("scoerceout", l, f); Swig_typemap_attach_parms("scheck", l, f); emit_parameter_variables(l, f); emit_attach_parmmaps(l,f); Setattr(n,"wrap:parms",l); nargs = emit_num_arguments(l); Wrapper_add_local(f, "r_nprotect", "unsigned int r_nprotect = 0"); Wrapper_add_localv(f, "r_ans", "SEXP", "r_ans = R_NilValue", NIL); Wrapper_add_localv(f, "r_vmax", "VMAXTYPE", "r_vmax = vmaxget()", NIL); String *sargs = NewString(""); String *s_inputTypes = NewString(""); String *s_inputMap = NewString(""); bool inFirstArg = true; bool inFirstType = true; Parm *curP; for (p =l, i = 0 ; i < nargs ; i++) { while (checkAttribute(p, "tmap:in:numinputs", "0")) { p = Getattr(p, "tmap:in:next"); } SwigType *tt = Getattr(p, "type"); int nargs = -1; String *funcptr_name = processType(tt, p, &nargs); // SwigType *tp = Getattr(p, "type"); String *name = Getattr(p,"name"); String *lname = Getattr(p,"lname"); // R keyword renaming if (name) { if (Swig_name_warning(p, 0, name, 0)) { name = 0; } else { /* If we have a :: in the parameter name because we are accessing a static member of a class, say, then we need to remove that prefix. */ while (Strstr(name, "::")) { //XXX need to free. name = NewStringf("%s", Strchr(name, ':') + 2); if (debugMode) Printf(stdout, "+++ parameter name with :: in it %s\n", name); } } } if (!name || Len(name) == 0) name = NewStringf("s_arg%d", i+1); name = replaceInitialDash(name); if (!Strncmp(name, "arg", 3)) { name = Copy(name); Insert(name, 0, "s_"); } if(processing_variable) { name = Copy(name); Insert(name, 0, "s_"); } if(!Strcmp(name, fname)) { name = Copy(name); Insert(name, 0, "s_"); } Printf(sargs, "%s, ", name); String *tm; if((tm = Getattr(p, "tmap:scoercein"))) { Replaceall(tm, "$input", name); replaceRClass(tm, Getattr(p, "type")); if(funcptr_name) { //XXX need to get this to return non-zero if(nargs == -1) nargs = getFunctionPointerNumArgs(p, tt); String *snargs = NewStringf("%d", nargs); Printv(sfun->code, "if(is.function(", name, ")) {", "\n", "assert('...' %in% names(formals(", name, ")) || length(formals(", name, ")) >= ", snargs, ");\n} ", NIL); Delete(snargs); Printv(sfun->code, "else {\n", "if(is.character(", name, ")) {\n", name, " = getNativeSymbolInfo(", name, ");", "\n};\n", "if(is(", name, ", \"NativeSymbolInfo\")) {\n", name, " = ", name, "$address", ";\n}\n", "if(is(", name, ", \"ExternalReference\")) {\n", name, " = ", name, "@ref;\n}\n", "}; \n", NIL); } else { Printf(sfun->code, "%s\n", tm); } } Printv(sfun->def, inFirstArg ? "" : ", ", name, NIL); if ((tm = Getattr(p,"tmap:scheck"))) { Replaceall(tm,"$target", lname); Replaceall(tm,"$source", name); Replaceall(tm,"$input", name); replaceRClass(tm, Getattr(p, "type")); Printf(sfun->code,"%s\n",tm); } curP = p; if ((tm = Getattr(p,"tmap:in"))) { Replaceall(tm,"$target", lname); Replaceall(tm,"$source", name); Replaceall(tm,"$input", name); if (Getattr(p,"wrap:disown") || (Getattr(p,"tmap:in:disown"))) { Replaceall(tm,"$disown","SWIG_POINTER_DISOWN"); } else { Replaceall(tm,"$disown","0"); } if(funcptr_name) { /* have us a function pointer */ Printf(f->code, "if(TYPEOF(%s) != CLOSXP) {\n", name); Replaceall(tm,"$R_class", ""); } else { replaceRClass(tm, Getattr(p, "type")); } Printf(f->code,"%s\n",tm); if(funcptr_name) Printf(f->code, "} else {\n%s = %s;\nR_SWIG_pushCallbackFunctionData(%s, NULL);\n}\n", lname, funcptr_name, name); Printv(f->def, inFirstArg ? "" : ", ", "SEXP ", name, NIL); if (Len(name) != 0) inFirstArg = false; p = Getattr(p,"tmap:in:next"); } else { p = nextSibling(p); } tm = Swig_typemap_lookup("rtype", curP, "", 0); if(tm) { replaceRClass(tm, Getattr(curP, "type")); } Printf(s_inputTypes, "%s'%s'", inFirstType ? "" : ", ", tm); Printf(s_inputMap, "%s%s='%s'", inFirstType ? "" : ", ", name, tm); inFirstType = false; if(funcptr_name) Delete(funcptr_name); } /* end of looping over parameters. */ if(addCopyParam) { Printf(sfun->def, "%s.copy = FALSE", nargs > 0 ? ", " : ""); Printf(f->def, "%sSEXP s_swig_copy", nargs > 0 ? ", " : ""); Printf(sargs, "as.logical(.copy), "); } Printv(f->def, ")\n{\n", NIL); Printv(sfun->def, ")\n{\n", NIL); /* Insert cleanup code */ String *cleanup = NewString(""); for (p = l; p;) { if ((tm = Getattr(p, "tmap:freearg"))) { Replaceall(tm, "$source", Getattr(p, "lname")); Printv(cleanup, tm, "\n", NIL); p = Getattr(p, "tmap:freearg:next"); } else { p = nextSibling(p); } } String *outargs = NewString(""); int numOutArgs = isVoidReturnType ? -1 : 0; for(p = l, i = 0; p; i++) { if((tm = Getattr(p, "tmap:argout"))) { // String *lname = Getattr(p, "lname"); numOutArgs++; String *pos = NewStringf("%d", numOutArgs); Replaceall(tm,"$source", Getattr(p, "lname")); Replaceall(tm,"$result", "r_ans"); Replaceall(tm,"$n", pos); // The position into which to store the answer. Replaceall(tm,"$arg", Getattr(p, "emit:input")); Replaceall(tm,"$input", Getattr(p, "emit:input")); Replaceall(tm,"$owner", "0"); Printf(outargs, "%s\n", tm); p = Getattr(p,"tmap:argout:next"); } else p = nextSibling(p); } String *actioncode = emit_action(n); /* Deal with the explicit return value. */ if ((tm = Swig_typemap_lookup_out("out", n, Swig_cresult_name(), f, actioncode))) { SwigType *retType = Getattr(n, "type"); Replaceall(tm,"$1", Swig_cresult_name()); Replaceall(tm,"$result", "r_ans"); if (debugMode){ Printf(stdout, "Calling replace D: %s, %s, %s\n", retType, n, tm); } replaceRClass(tm, retType); if (GetFlag(n,"feature:new")) { Replaceall(tm, "$owner", "SWIG_POINTER_OWN"); } else { Replaceall(tm,"$owner", "0"); } #if 0 if(addCopyParam) { Printf(f->code, "if(LOGICAL(s_swig_copy)[0]) {\n"); Printf(f->code, "/* Deal with returning a reference. */\nr_ans = R_NilValue;\n"); Printf(f->code, "}\n else {\n"); } #endif Printf(f->code, "%s\n", tm); #if 0 if(addCopyParam) Printf(f->code, "}\n"); /* end of if(s_swig_copy) ... else { ... } */ #endif } else { Swig_warning(WARN_TYPEMAP_OUT_UNDEF, input_file, line_number, "Unable to use return type %s in function %s.\n", SwigType_str(type, 0), fname); } if(Len(outargs)) { Wrapper_add_local(f, "R_OutputValues", "SEXP R_OutputValues"); String *tmp = NewString(""); if(!isVoidReturnType) Printf(tmp, "Rf_protect(r_ans);\n"); Printf(tmp, "Rf_protect(R_OutputValues = Rf_allocVector(VECSXP,%d));\nr_nprotect += %d;\n", numOutArgs + !isVoidReturnType, isVoidReturnType ? 1 : 2); if(!isVoidReturnType) Printf(tmp, "SET_VECTOR_ELT(R_OutputValues, 0, r_ans);\n"); Printf(tmp, "r_ans = R_OutputValues;\n"); Insert(outargs, 0, tmp); Delete(tmp); Printv(f->code, outargs, NIL); Delete(outargs); } /* Output cleanup code */ Printv(f->code, cleanup, NIL); Delete(cleanup); /* Look to see if there is any newfree cleanup code */ if (GetFlag(n, "feature:new")) { if ((tm = Swig_typemap_lookup("newfree", n, Swig_cresult_name(), 0))) { Replaceall(tm, "$source", Swig_cresult_name()); /* deprecated */ Printf(f->code, "%s\n", tm); } } /* See if there is any return cleanup code */ if ((tm = Swig_typemap_lookup("ret", n, Swig_cresult_name(), 0))) { Replaceall(tm, "$source", Swig_cresult_name()); Printf(f->code, "%s\n", tm); Delete(tm); } Printv(f->code, UnProtectWrapupCode, NIL); /*If the user gave us something to convert the result in */ if ((tm = Swig_typemap_lookup("scoerceout", n, Swig_cresult_name(), sfun))) { Replaceall(tm,"$source","ans"); Replaceall(tm,"$result","ans"); if (constructor) { Node * parent = Getattr(n, "parentNode"); String * smartname = Getattr(parent, "feature:smartptr"); if (smartname) { smartname = getRClassName(smartname, 1, 1); Replaceall(tm, "$R_class", smartname); Delete(smartname); } } if (debugMode) { Printf(stdout, "Calling replace B: %s, %s, %s\n", Getattr(n, "type"), Getattr(n, "sym:name"), getNSpace()); } replaceRClass(tm, Getattr(n, "type")); Chop(tm); } Printv(sfun->code, ";", (Len(tm) ? "ans = " : ""), ".Call('", wname, "', ", sargs, "PACKAGE='", Rpackage, "');\n", NIL); if(Len(tm)) { Printf(sfun->code, "%s\n\n", tm); if (constructor) { String *finalizer = NewString(iname); Replace(finalizer, "new_", "", DOH_REPLACE_FIRST); Printf(sfun->code, "reg.finalizer(ans@ref, delete_%s)\n", finalizer); } Printf(sfun->code, "ans\n"); } if (destructor) Printv(f->code, "R_ClearExternalPtr(self);\n", NIL); Printv(f->code, "return r_ans;\n}\n", NIL); Printv(sfun->code, "\n}", NIL); /* Substitute the function name */ Replaceall(f->code,"$symname",iname); Wrapper_print(f, f_wrapper); Wrapper_print(sfun, sfile); Printf(sfun->code, "\n# End of %s\n", iname); tm = Swig_typemap_lookup("rtype", n, "", 0); if(tm) { SwigType *retType = Getattr(n, "type"); if (debugMode) { Printf(stdout, "Calling replace C: %s\n", Copy(retType)); } replaceRClass(tm, retType); } Printv(sfile, "attr(`", sfname, "`, 'returnType') = '", isVoidReturnType ? "void" : (tm ? tm : ""), "'\n", NIL); if(nargs > 0) Printv(sfile, "attr(`", sfname, "`, \"inputTypes\") = c(", s_inputTypes, ")\n", NIL); Printv(sfile, "class(`", sfname, "`) = c(\"SWIGFunction\", class('", sfname, "'))\n\n", NIL); if (memoryProfile) { Printv(sfile, "memory.profile()\n", NIL); } if (aggressiveGc) { Printv(sfile, "gc()\n", NIL); } // Printv(sfile, "setMethod('", name, "', '", name, "', ", iname, ")\n\n\n"); /* If we are dealing with a method in an C++ class, then add the name of the R function and its definition. XXX need to figure out how to store the Wrapper if possible in the hash/list. Would like to be able to do this so that we can potentially insert */ if(processing_member_access_function || processing_class_member_function) { addAccessor(member_name, sfun, iname); } if (Getattr(n, "sym:overloaded") && !Getattr(n, "sym:nextSibling")) { dispatchFunction(n); } addRegistrationRoutine(wname, addCopyParam ? nargs +1 : nargs); DelWrapper(f); DelWrapper(sfun); Delete(sargs); Delete(sfname); return SWIG_OK; } /* ---------------------------------------------------------------------- * R::constantWrapper() * ---------------------------------------------------------------------- */ int R::constantWrapper(Node *n) { (void) n; // TODO return SWIG_OK; } /*-------------------------------------------------------------- * Add the specified routine name to the collection of * generated routines that are called from R functions. * This is used to register the routines with R for * resolving symbols. * rname - the name of the routine * nargs - the number of arguments it expects. * --------------------------------------------------------------*/ int R::addRegistrationRoutine(String *rname, int nargs) { if(!registrationTable) registrationTable = NewHash(); String *el = NewStringf("{\"%s\", (DL_FUNC) &%s, %d}", rname, rname, nargs); Setattr(registrationTable, rname, el); return SWIG_OK; } /* ------------------------------------------------------------- * Write the registration information to an array and * create the initialization routine for registering * these. * --------------------------------------------------------------*/ int R::outputRegistrationRoutines(File *out) { int i, n; if(!registrationTable) return(0); if(inCPlusMode) Printf(out, "#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n"); Printf(out, "#include \n\n"); if(inCPlusMode) Printf(out, "#ifdef __cplusplus\n}\n#endif\n\n"); Printf(out, "SWIGINTERN R_CallMethodDef CallEntries[] = {\n"); List *keys = Keys(registrationTable); n = Len(keys); for(i = 0; i < n; i++) Printf(out, " %s,\n", Getattr(registrationTable, Getitem(keys, i))); Printf(out, " {NULL, NULL, 0}\n};\n\n"); if(!noInitializationCode) { if (inCPlusMode) Printv(out, "extern \"C\" ", NIL); { /* R allows pckage names to have '.' in the name, which is not allowed in C++ var names we simply replace all occurrences of '.' with '_' to construct the var name */ String * Rpackage_sane = Copy(Rpackage); Replace(Rpackage_sane, ".", "_", DOH_REPLACE_ANY); Printf(out, "SWIGEXPORT void R_init_%s(DllInfo *dll) {\n", Rpackage_sane); Delete(Rpackage_sane); } Printf(out, "%sR_registerRoutines(dll, NULL, CallEntries, NULL, NULL);\n", tab4); if(Len(s_init_routine)) { Printf(out, "\n%s\n", s_init_routine); } Printf(out, "}\n"); } return n; } /* ------------------------------------------------------------- * Process a struct, union or class declaration in the source code, * or an anonymous typedef struct * --------------------------------------------------------------*/ //XXX What do we need to do here - // Define an S4 class to refer to this. void R::registerClass(Node *n) { String *name = Getattr(n, "name"); String *kind = Getattr(n, "kind"); if (debugMode) Swig_print_node(n); String *sname = NewStringf("_p%s", SwigType_manglestr(name)); if(!Getattr(SClassDefs, sname)) { Setattr(SClassDefs, sname, sname); String *base; if(Strcmp(kind, "class") == 0) { base = NewString(""); List *l = Getattr(n, "bases"); if(Len(l)) { Printf(base, "c("); for(int i = 0; i < Len(l); i++) { registerClass(Getitem(l, i)); Printf(base, "'_p%s'%s", SwigType_manglestr(Getattr(Getitem(l, i), "name")), i < Len(l)-1 ? ", " : ""); } Printf(base, ")"); } else { base = NewString("'C++Reference'"); } } else base = NewString("'ExternalReference'"); Printf(s_classes, "setClass('%s', contains = %s)\n", sname, base); Delete(base); String *smartptr = Getattr(n, "feature:smartptr"); if (smartptr) { List *l = Getattr(n, "bases"); SwigType *spt = Swig_cparse_type(smartptr); String *smart = SwigType_typedef_resolve_all(spt); String *smart_rname = SwigType_manglestr(smart); Printf(s_classes, "setClass('_p%s', contains = c('%s'", smart_rname, sname); Delete(spt); Delete(smart); Delete(smart_rname); for(int i = 0; i < Len(l); i++) { Node * b = Getitem(l, i); smartptr = Getattr(b, "feature:smartptr"); if (smartptr) { spt = Swig_cparse_type(smartptr); smart = SwigType_typedef_resolve_all(spt); smart_rname = SwigType_manglestr(smart); Printf(s_classes, ", '_p%s'", smart_rname); Delete(spt); Delete(smart); Delete(smart_rname); } } Printf(s_classes, "))\n"); } } } int R::classDeclaration(Node *n) { String *name = Getattr(n, "name"); String *kind = Getattr(n, "kind"); if (debugMode) Swig_print_node(n); registerClass(n); /* If we have a typedef union { ... } U, then we never get to see the typedef via a regular call to typedefHandler. Instead, */ if(Getattr(n, "unnamed") && Getattr(n, "storage") && Strcmp(Getattr(n, "storage"), "typedef") == 0 && Getattr(n, "tdname") && Strcmp(Getattr(n, "tdname"), name) == 0) { if (debugMode) Printf(stdout, "Typedef in the class declaration for %s\n", name); // typedefHandler(n); } bool opaque = GetFlag(n, "feature:opaque") ? true : false; if(opaque) opaqueClassDeclaration = name; int status = Language::classDeclaration(n); opaqueClassDeclaration = NULL; // OutputArrayMethod(name, class_member_functions, sfile); if (class_member_functions) OutputMemberReferenceMethod(name, 0, class_member_functions, sfile); if (class_member_set_functions) OutputMemberReferenceMethod(name, 1, class_member_set_functions, sfile); if(class_member_functions) { Delete(class_member_functions); class_member_functions = NULL; } if(class_member_set_functions) { Delete(class_member_set_functions); class_member_set_functions = NULL; } if (Getattr(n, "has_destructor")) { Printf(sfile, "setMethod('delete', '_p%s', function(obj) {delete%s(obj)})\n", getRClassName(name), getRClassName(name)); } if(!opaque && !Strcmp(kind, "struct") && copyStruct) { String *def = NewStringf("setClass(\"%s\",\n%srepresentation(\n", name, tab4); bool firstItem = true; for(Node *c = firstChild(n); c; ) { String *elName; String *tp; elName = Getattr(c, "name"); String *elKind = Getattr(c, "kind"); if (!Equal(elKind, "variable")) { c = nextSibling(c); continue; } if (!Len(elName)) { c = nextSibling(c); continue; } #if 0 tp = getRType(c); #else tp = Swig_typemap_lookup("rtype", c, "", 0); if(!tp) { c = nextSibling(c); continue; } if (Strstr(tp, "R_class")) { c = nextSibling(c); continue; } if (Strcmp(tp, "character") && Strstr(Getattr(c, "decl"), "p.")) { c = nextSibling(c); continue; } if (!firstItem) { Printf(def, ",\n"); } // else //XXX How can we tell if this is already done. // SwigType_push(elType, elDecl); // returns "" tp = processType(elType, c, NULL); // Printf(stdout, " elType %p\n", elType); // tp = getRClassNameCopyStruct(Getattr(c, "type"), 1); #endif String *elNameT = replaceInitialDash(elName); Printf(def, "%s%s = \"%s\"", tab8, elNameT, tp); firstItem = false; Delete(tp); Delete(elNameT); c = nextSibling(c); } Printf(def, "),\n%scontains = \"RSWIGStruct\")\n", tab8); Printf(s_classes, "%s\n\n# End class %s\n\n", def, name); generateCopyRoutines(n); Delete(def); } return status; } /* ------------------------------------------------------------- * Create the C routines that copy an S object of the class given * by the given struct definition in Node *n to the C value * and also the routine that goes from the C routine to an object * of this S class. * --------------------------------------------------------------*/ /*XXX Clean up the toCRef - make certain the names are correct for the types, etc. in all cases. */ int R::generateCopyRoutines(Node *n) { Wrapper *copyToR = NewWrapper(); Wrapper *copyToC = NewWrapper(); String *name = Getattr(n, "name"); String *tdname = Getattr(n, "tdname"); String *kind = Getattr(n, "kind"); String *type; if(Len(tdname)) { type = Copy(tdname); } else { type = NewStringf("%s %s", kind, name); } String *mangledName = SwigType_manglestr(name); if (debugMode) Printf(stdout, "generateCopyRoutines: name = %s, %s\n", name, type); Printf(copyToR->def, "CopyToR%s = function(value, obj = new(\"%s\"))\n{\n", mangledName, name); Printf(copyToC->def, "CopyToC%s = function(value, obj)\n{\n", mangledName); Node *c = firstChild(n); for(; c; c = nextSibling(c)) { String *elName = Getattr(c, "name"); if (!Len(elName)) { continue; } String *elKind = Getattr(c, "kind"); if (!Equal(elKind, "variable")) { continue; } String *tp = Swig_typemap_lookup("rtype", c, "", 0); if(!tp) { continue; } if (Strstr(tp, "R_class")) { continue; } if (Strcmp(tp, "character") && Strstr(Getattr(c, "decl"), "p.")) { continue; } /* The S functions to get and set the member value. */ String *elNameT = replaceInitialDash(elName); Printf(copyToR->code, "obj@%s = value$%s;\n", elNameT, elNameT); Printf(copyToC->code, "obj$%s = value@%s;\n", elNameT, elNameT); Delete(elNameT); } Printf(copyToR->code, "obj;\n}\n\n"); String *rclassName = getRClassNameCopyStruct(type, 0); // without the Ref. Printf(sfile, "# Start definition of copy functions & methods for %s\n", rclassName); Wrapper_print(copyToR, sfile); Printf(copyToC->code, "obj\n}\n\n"); Wrapper_print(copyToC, sfile); Printf(sfile, "# Start definition of copy methods for %s\n", rclassName); Printf(sfile, "setMethod('copyToR', '_p_%s', CopyToR%s);\n", rclassName, mangledName); Printf(sfile, "setMethod('copyToC', '%s', CopyToC%s);\n\n", rclassName, mangledName); Printf(sfile, "# End definition of copy methods for %s\n", rclassName); Printf(sfile, "# End definition of copy functions & methods for %s\n", rclassName); String *m = NewStringf("%sCopyToR", name); addNamespaceMethod(m); char *tt = Char(m); tt[Len(m)-1] = 'C'; addNamespaceMethod(m); Delete(m); Delete(rclassName); Delete(mangledName); DelWrapper(copyToR); DelWrapper(copyToC); return SWIG_OK; } /* ------------------------------------------------------------- * Called when there is a typedef to be invoked. * * XXX Needs to be enhanced or split to handle the case where we have a * typedef within a classDeclaration emission because the struct/union/etc. * is anonymous. * --------------------------------------------------------------*/ int R::typedefHandler(Node *n) { SwigType *tp = Getattr(n, "type"); String *type = Getattr(n, "type"); if (debugMode) Printf(stdout, " %s\n", Getattr(n, "name")); processType(tp, n); if(Strncmp(type, "struct ", 7) == 0) { String *name = Getattr(n, "name"); char *trueName = Char(type); trueName += 7; if (debugMode) Printf(stdout, " Defining S class %s\n", trueName); Printf(s_classes, "setClass('_p%s', contains = 'ExternalReference')\n", SwigType_manglestr(name)); } return Language::typedefHandler(n); } /* -------------------------------------------------------------- * Called when processing a field in a "class", i.e. struct, union or * actual class. We set a state variable so that we can correctly * interpret the resulting functionWrapper() call and understand that * it is for a field element. * --------------------------------------------------------------*/ int R::membervariableHandler(Node *n) { SwigType *t = Getattr(n, "type"); processType(t, n, NULL); processing_member_access_function = 1; member_name = Getattr(n,"sym:name"); if (debugMode) Printf(stdout, " name = %s, sym:name = %s\n", Getattr(n, "name"), member_name); int status(Language::membervariableHandler(n)); if(!opaqueClassDeclaration && debugMode) Printf(stdout, " %s %s\n", Getattr(n, "name"), Getattr(n, "type")); processing_member_access_function = 0; member_name = NULL; return status; } /* This doesn't seem to get used so leave it out for the moment. */ String * R::runtimeCode() { String *s = Swig_include_sys("rrun.swg"); if (!s) { Printf(stdout, "*** Unable to open 'rrun.swg'\n"); s = NewString(""); } return s; } /* ----------------------------------------------------------------------- * Called when SWIG wants to initialize this * We initialize anythin we want here. * Most importantly, tell SWIG where to find the files (e.g. r.swg) for this module. * Use Swig_mark_arg() to tell SWIG that it is understood and not to * throw an error. * --------------------------------------------------------------*/ void R::main(int argc, char *argv[]) { init(); Preprocessor_define("SWIGR 1", 0); SWIG_library_directory("r"); SWIG_config_file("r.swg"); debugMode = false; copyStruct = true; memoryProfile = false; aggressiveGc = false; inCPlusMode = false; outputNamespaceInfo = false; noInitializationCode = false; this->Argc = argc; this->Argv = argv; allow_overloading();// can we support this? for(int i = 0; i < argc; i++) { if(strcmp(argv[i], "-package") == 0) { Swig_mark_arg(i); i++; Swig_mark_arg(i); Rpackage = argv[i]; } else if(strcmp(argv[i], "-dll") == 0) { Swig_mark_arg(i); i++; Swig_mark_arg(i); DllName = argv[i]; } else if(strcmp(argv[i], "-help") == 0) { showUsage(); } else if(strcmp(argv[i], "-namespace") == 0) { outputNamespaceInfo = true; Swig_mark_arg(i); } else if(!strcmp(argv[i], "-no-init-code")) { noInitializationCode = true; Swig_mark_arg(i); } else if(!strcmp(argv[i], "-c++")) { inCPlusMode = true; Swig_mark_arg(i); Printf(s_classes, "setClass('C++Reference', contains = 'ExternalReference')\n"); } else if(!strcmp(argv[i], "-debug")) { debugMode = true; Swig_mark_arg(i); } else if (!strcmp(argv[i],"-copystruct")) { copyStruct = true; Swig_mark_arg(i); } else if (!strcmp(argv[i], "-nocopystruct")) { copyStruct = false; Swig_mark_arg(i); } else if (!strcmp(argv[i], "-memoryprof")) { memoryProfile = true; Swig_mark_arg(i); } else if (!strcmp(argv[i], "-nomemoryprof")) { memoryProfile = false; Swig_mark_arg(i); } else if (!strcmp(argv[i], "-aggressivegc")) { aggressiveGc = true; Swig_mark_arg(i); } else if (!strcmp(argv[i], "-noaggressivegc")) { aggressiveGc = false; Swig_mark_arg(i); } else if (strcmp(argv[i], "-cppcast") == 0) { Printf(stderr, "Deprecated command line option: %s. This option is now always on.\n", argv[i]); Swig_mark_arg(i); } else if (strcmp(argv[i], "-nocppcast") == 0) { Printf(stderr, "Deprecated command line option: %s. This option is no longer supported.\n", argv[i]); Swig_mark_arg(i); SWIG_exit(EXIT_FAILURE); } if (debugMode) { Swig_typemap_search_debug_set(); Swig_typemap_used_debug_set(); Swig_typemap_register_debug_set(); Swig_file_debug_set(); } /// copyToR copyToC functions. } } /* ----------------------------------------------------------------------- * Could make this work for String or File and then just store the resulting string * rather than the collection of arguments and argc. * ----------------------------------------------------------------------- */ int R::outputCommandLineArguments(File *out) { if(Argc < 1 || !Argv || !Argv[0]) return(-1); Printf(out, "\n## Generated via the command line invocation:\n##\t"); for(int i = 0; i < Argc ; i++) { Printf(out, " %s", Argv[i]); } Printf(out, "\n\n\n"); return Argc; } /* How SWIG instantiates an object from this module. See swigmain.cxx */ extern "C" Language *swig_r(void) { return new R(); } /* ----------------------------------------------------------------------- * Needs to be reworked. *----------------------------------------------------------------------- */ String * R::processType(SwigType *t, Node *n, int *nargs) { //XXX Need to handle typedefs, e.g. // a type which is a typedef to a function pointer. SwigType *tmp = Getattr(n, "tdname"); if (debugMode) Printf(stdout, "processType %s (tdname = %s)(SwigType = %s)\n", Getattr(n, "name"), tmp, Copy(t)); SwigType *td = t; if (expandTypedef(t) && SwigType_istypedef(t)) { SwigType *resolved = SwigType_typedef_resolve_all(t); if (expandTypedef(resolved)) { td = Copy(resolved); } } if(!td) { int count = 0; String *b = getRTypeName(t, &count); if(count && b && !Getattr(SClassDefs, b)) { if (debugMode) Printf(stdout, " Defining class %s\n", b); Printf(s_classes, "setClass('%s', contains = 'ExternalReference')\n", b); Setattr(SClassDefs, b, b); } } if(td) t = td; if(SwigType_isfunctionpointer(t)) { if (debugMode) Printf(stdout, " Defining pointer handler %s\n", t); String *tmp = createFunctionPointerHandler(t, n, nargs); return tmp; } #if 0 SwigType_isfunction(t) && SwigType_ispointer(t) #endif return NULL; } /* ----------------------------------------------------------------------- * enumValue() * This method will return a string with an enum value to use in from R when * setting up an enum variable * ------------------------------------------------------------------------ */ String *R::enumValue(Node *n) { String *symname = Getattr(n, "sym:name"); String *value = Getattr(n, "value"); String *newsymname = 0; Node *parent = parentNode(n); symname = Getattr(n, "sym:name"); // parent enumtype has namespace mangled in String *etype = Getattr(parent, "enumtype"); // we have to directly call the c wrapper function, as the // R wrapper to the enum is designed to be used after the enum // structures have been created on the R side. This means // that we'll need to construct a .Call expression // change the type for variableWrapper if (debugMode) { Printf(stdout, " type set: %s\n", etype); } Setattr(n, "type", etype); if (!getCurrentClass()) { newsymname = Swig_name_member(0, Getattr(parent, "sym:name"), symname); // Strange hack to change the name Setattr(n, "name", Getattr(n, "value")); Setattr(n, "sym:name", newsymname); variableWrapper(n); value = Swig_name_get(NSPACE_TODO, newsymname); } else { String *enumClassPrefix = getEnumClassPrefix(); newsymname = Swig_name_member(0, enumClassPrefix, symname); Setattr(n, "name", Getattr(n, "value")); Setattr(n, "sym:name", newsymname); variableWrapper(n); value = Swig_name_get(NSPACE_TODO, newsymname); } value = Swig_name_wrapper(value); Replace(value, "_wrap", "R_swig", DOH_REPLACE_FIRST); String *valuecall=NewString(""); Printv(valuecall, ".Call('", value, "',FALSE, PACKAGE='", Rpackage, "')", NIL); Delete(value); return valuecall; } swig-4.0.1/Source/Modules/csharp.cxx0000644000175000017500000052241213527063513017232 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * csharp.cxx * * C# language module for SWIG. * ----------------------------------------------------------------------------- */ #include "swigmod.h" #include // for INT_MAX #include "cparse.h" #include /* Hash type used for upcalls from C/C++ */ typedef DOH UpcallData; class CSHARP:public Language { static const char *usage; const String *empty_string; const String *public_string; const String *protected_string; Hash *swig_types_hash; File *f_begin; File *f_runtime; File *f_runtime_h; File *f_header; File *f_wrappers; File *f_init; File *f_directors; File *f_directors_h; File *f_single_out; List *filenames_list; bool proxy_flag; // Flag for generating proxy classes bool native_function_flag; // Flag for when wrapping a native function bool enum_constant_flag; // Flag for when wrapping an enum or constant bool static_flag; // Flag for when wrapping a static functions or member variables bool variable_wrapper_flag; // Flag for when wrapping a nonstatic member variable bool wrapping_member_flag; // Flag for when wrapping a member variable/enum/const bool global_variable_flag; // Flag for when wrapping a global variable bool old_variable_names; // Flag for old style variable names in the intermediary class bool generate_property_declaration_flag; // Flag for generating properties String *imclass_name; // intermediary class name String *module_class_name; // module class name String *imclass_class_code; // intermediary class code String *proxy_class_def; String *proxy_class_code; String *interface_class_code; // if %feature("interface") was declared for a class, here goes the interface declaration String *module_class_code; String *proxy_class_name; // proxy class name String *full_imclass_name; // fully qualified intermediary class name when using nspace feature, otherwise same as imclass_name String *variable_name; //Name of a variable being wrapped String *proxy_class_constants_code; String *module_class_constants_code; String *enum_code; String *dllimport; // DllImport attribute name String *namespce; // Optional namespace name String *imclass_imports; //intermediary class imports from %pragma String *module_imports; //module imports from %pragma String *imclass_baseclass; //inheritance for intermediary class class from %pragma String *module_baseclass; //inheritance for module class from %pragma String *imclass_interfaces; //interfaces for intermediary class class from %pragma String *module_interfaces; //interfaces for module class from %pragma String *imclass_class_modifiers; //class modifiers for intermediary class overridden by %pragma String *module_class_modifiers; //class modifiers for module class overridden by %pragma String *upcasts_code; //C++ casts for inheritance hierarchies C++ code String *imclass_cppcasts_code; //C++ casts up inheritance hierarchies intermediary class code String *director_callback_typedefs; // Director function pointer typedefs for callbacks String *director_callbacks; // Director callback function pointer member variables String *director_delegate_callback; // Director callback method that delegates are set to call String *director_delegate_definitions; // Director delegates definitions in proxy class String *director_delegate_instances; // Director delegates member variables in proxy class String *director_method_types; // Director method types String *director_connect_parms; // Director delegates parameter list for director connect call String *destructor_call; //C++ destructor call if any String *output_file; // File name for single file mode. If set all generated code will be written to this file // Director method stuff: List *dmethods_seq; Hash *dmethods_table; int n_dmethods; int n_directors; int first_class_dmethod; int curr_class_dmethod; int nesting_depth; enum EnumFeature { SimpleEnum, TypeunsafeEnum, TypesafeEnum, ProperEnum }; public: /* ----------------------------------------------------------------------------- * CSHARP() * ----------------------------------------------------------------------------- */ CSHARP():empty_string(NewString("")), public_string(NewString("public")), protected_string(NewString("protected")), swig_types_hash(NULL), f_begin(NULL), f_runtime(NULL), f_runtime_h(NULL), f_header(NULL), f_wrappers(NULL), f_init(NULL), f_directors(NULL), f_directors_h(NULL), f_single_out(NULL), filenames_list(NULL), proxy_flag(true), native_function_flag(false), enum_constant_flag(false), static_flag(false), variable_wrapper_flag(false), wrapping_member_flag(false), global_variable_flag(false), old_variable_names(false), generate_property_declaration_flag(false), imclass_name(NULL), module_class_name(NULL), imclass_class_code(NULL), proxy_class_def(NULL), proxy_class_code(NULL), interface_class_code(NULL), module_class_code(NULL), proxy_class_name(NULL), full_imclass_name(NULL), variable_name(NULL), proxy_class_constants_code(NULL), module_class_constants_code(NULL), enum_code(NULL), dllimport(NULL), namespce(NULL), imclass_imports(NULL), module_imports(NULL), imclass_baseclass(NULL), module_baseclass(NULL), imclass_interfaces(NULL), module_interfaces(NULL), imclass_class_modifiers(NULL), module_class_modifiers(NULL), upcasts_code(NULL), imclass_cppcasts_code(NULL), director_callback_typedefs(NULL), director_callbacks(NULL), director_delegate_callback(NULL), director_delegate_definitions(NULL), director_delegate_instances(NULL), director_method_types(NULL), director_connect_parms(NULL), destructor_call(NULL), output_file(NULL), dmethods_seq(NULL), dmethods_table(NULL), n_dmethods(0), n_directors(0), first_class_dmethod(0), curr_class_dmethod(0), nesting_depth(0){ /* for now, multiple inheritance in directors is disabled, this should be easy to implement though */ director_multiple_inheritance = 0; director_language = 1; } /* ----------------------------------------------------------------------------- * getProxyName() * * Test to see if a type corresponds to something wrapped with a proxy class. * Return NULL if not otherwise the proxy class name, fully qualified with * a namespace if the nspace feature is used. * ----------------------------------------------------------------------------- */ String *getProxyName(SwigType *t) { String *proxyname = NULL; if (proxy_flag) { Node *n = classLookup(t); if (n) { proxyname = Getattr(n, "proxyname"); if (!proxyname) { String *nspace = Getattr(n, "sym:nspace"); String *symname = Copy(Getattr(n, "sym:name")); if (symname && !GetFlag(n, "feature:flatnested")) { for (Node *outer_class = Getattr(n, "nested:outer"); outer_class; outer_class = Getattr(outer_class, "nested:outer")) { if (String* name = Getattr(outer_class, "sym:name")) { Push(symname, "."); Push(symname, name); } else return NULL; } } if (nspace) { if (namespce) proxyname = NewStringf("%s.%s.%s", namespce, nspace, symname); else proxyname = NewStringf("%s.%s", nspace, symname); } else { proxyname = Copy(symname); } Setattr(n, "proxyname", proxyname); Delete(proxyname); Delete(symname); } } } return proxyname; } /* ------------------------------------------------------------ * main() * ------------------------------------------------------------ */ virtual void main(int argc, char *argv[]) { SWIG_library_directory("csharp"); // Look for certain command line options for (int i = 1; i < argc; i++) { if (argv[i]) { if (strcmp(argv[i], "-dllimport") == 0) { if (argv[i + 1]) { dllimport = NewString(""); Printf(dllimport, argv[i + 1]); Swig_mark_arg(i); Swig_mark_arg(i + 1); i++; } else { Swig_arg_error(); } } else if (strcmp(argv[i], "-namespace") == 0) { if (argv[i + 1]) { namespce = NewString(""); Printf(namespce, argv[i + 1]); if (Len(namespce) == 0) { Delete(namespce); namespce = 0; } Swig_mark_arg(i); Swig_mark_arg(i + 1); i++; } else { Swig_arg_error(); } } else if ((strcmp(argv[i], "-noproxy") == 0)) { Swig_mark_arg(i); proxy_flag = false; } else if (strcmp(argv[i], "-oldvarnames") == 0) { Swig_mark_arg(i); old_variable_names = true; } else if (strcmp(argv[i], "-outfile") == 0) { if (argv[i + 1]) { output_file = NewString(""); Printf(output_file, argv[i + 1]); Swig_mark_arg(i); Swig_mark_arg(i + 1); i++; } else { Swig_arg_error(); } } else if (strcmp(argv[i], "-help") == 0) { Printf(stdout, "%s\n", usage); } } } // Add a symbol to the parser for conditional compilation Preprocessor_define("SWIGCSHARP 1", 0); // Add typemap definitions SWIG_typemap_lang("csharp"); SWIG_config_file("csharp.swg"); allow_overloading(); Swig_interface_feature_enable(); } /* --------------------------------------------------------------------- * top() * --------------------------------------------------------------------- */ virtual int top(Node *n) { // Get any options set in the module directive Node *optionsnode = Getattr(Getattr(n, "module"), "options"); if (optionsnode) { if (Getattr(optionsnode, "imclassname")) imclass_name = Copy(Getattr(optionsnode, "imclassname")); /* check if directors are enabled for this module. note: this * is a "master" switch, without which no director code will be * emitted. %feature("director") statements are also required * to enable directors for individual classes or methods. * * use %module(directors="1") modulename at the start of the * interface file to enable director generation. */ if (Getattr(optionsnode, "directors")) { allow_directors(); } if (Getattr(optionsnode, "dirprot")) { allow_dirprot(); } allow_allprotected(GetFlag(optionsnode, "allprotected")); } /* Initialize all of the output files */ String *outfile = Getattr(n, "outfile"); String *outfile_h = Getattr(n, "outfile_h"); if (!outfile) { Printf(stderr, "Unable to determine outfile\n"); SWIG_exit(EXIT_FAILURE); } f_begin = NewFile(outfile, "w", SWIG_output_files()); if (!f_begin) { FileErrorDisplay(outfile); SWIG_exit(EXIT_FAILURE); } if (directorsEnabled()) { if (!outfile_h) { Printf(stderr, "Unable to determine outfile_h\n"); SWIG_exit(EXIT_FAILURE); } f_runtime_h = NewFile(outfile_h, "w", SWIG_output_files()); if (!f_runtime_h) { FileErrorDisplay(outfile_h); SWIG_exit(EXIT_FAILURE); } } f_runtime = NewString(""); f_init = NewString(""); f_header = NewString(""); f_wrappers = NewString(""); f_directors_h = NewString(""); f_directors = NewString(""); /* Register file targets with the SWIG file handler */ Swig_register_filebyname("header", f_header); Swig_register_filebyname("wrapper", f_wrappers); Swig_register_filebyname("begin", f_begin); Swig_register_filebyname("runtime", f_runtime); Swig_register_filebyname("init", f_init); Swig_register_filebyname("director", f_directors); Swig_register_filebyname("director_h", f_directors_h); swig_types_hash = NewHash(); filenames_list = NewList(); // Make the intermediary class and module class names. The intermediary class name can be set in the module directive. if (!imclass_name) { imclass_name = NewStringf("%sPINVOKE", Getattr(n, "name")); module_class_name = Copy(Getattr(n, "name")); } else { // Rename the module name if it is the same as intermediary class name - a backwards compatibility solution if (Cmp(imclass_name, Getattr(n, "name")) == 0) module_class_name = NewStringf("%sModule", Getattr(n, "name")); else module_class_name = Copy(Getattr(n, "name")); } // module class and intermediary classes are always created if (!addSymbol(imclass_name, n)) return SWIG_ERROR; if (!addSymbol(module_class_name, n)) return SWIG_ERROR; imclass_class_code = NewString(""); proxy_class_def = NewString(""); proxy_class_code = NewString(""); module_class_constants_code = NewString(""); imclass_baseclass = NewString(""); imclass_interfaces = NewString(""); imclass_class_modifiers = NewString(""); module_class_code = NewString(""); module_baseclass = NewString(""); module_interfaces = NewString(""); module_imports = NewString(""); module_class_modifiers = NewString(""); imclass_imports = NewString(""); imclass_cppcasts_code = NewString(""); director_connect_parms = NewString(""); upcasts_code = NewString(""); dmethods_seq = NewList(); dmethods_table = NewHash(); n_dmethods = 0; n_directors = 0; if (!dllimport) dllimport = Copy(module_class_name); Swig_banner(f_begin); Printf(f_runtime, "\n\n#ifndef SWIGCSHARP\n#define SWIGCSHARP\n#endif\n\n"); if (directorsEnabled()) { Printf(f_runtime, "#define SWIG_DIRECTORS\n"); /* Emit initial director header and director code: */ Swig_banner(f_directors_h); Printf(f_directors_h, "\n"); Printf(f_directors_h, "#ifndef SWIG_%s_WRAP_H_\n", module_class_name); Printf(f_directors_h, "#define SWIG_%s_WRAP_H_\n\n", module_class_name); Printf(f_directors, "\n\n"); Printf(f_directors, "/* ---------------------------------------------------\n"); Printf(f_directors, " * C++ director class methods\n"); Printf(f_directors, " * --------------------------------------------------- */\n\n"); if (outfile_h) { String *filename = Swig_file_filename(outfile_h); Printf(f_directors, "#include \"%s\"\n\n", filename); Delete(filename); } } Printf(f_runtime, "\n"); if (namespce) { String *wrapper_name = NewStringf(""); Printf(wrapper_name, "CSharp_%s_%%f", namespce); Swig_name_register("wrapper", wrapper_name); Delete(wrapper_name); } else { Swig_name_register("wrapper", "CSharp_%f"); } if (old_variable_names) { Swig_name_register("set", "set_%n%v"); Swig_name_register("get", "get_%n%v"); } Printf(f_wrappers, "\n#ifdef __cplusplus\n"); Printf(f_wrappers, "extern \"C\" {\n"); Printf(f_wrappers, "#endif\n\n"); /* Emit code */ Language::top(n); if (directorsEnabled()) { // Insert director runtime into the f_runtime file (make it occur before %header section) Swig_insert_file("director_common.swg", f_runtime); Swig_insert_file("director.swg", f_runtime); } // Generate the intermediary class { File *f_im = getOutputFile(SWIG_output_directory(), imclass_name); addOpenNamespace(0, f_im); if (imclass_imports) Printf(f_im, "%s\n", imclass_imports); if (Len(imclass_class_modifiers) > 0) Printf(f_im, "%s ", imclass_class_modifiers); Printf(f_im, "%s ", imclass_name); if (imclass_baseclass && *Char(imclass_baseclass)) Printf(f_im, ": %s ", imclass_baseclass); if (Len(imclass_interfaces) > 0) Printv(f_im, "implements ", imclass_interfaces, " ", NIL); Printf(f_im, "{\n"); // Add the intermediary class methods Replaceall(imclass_class_code, "$module", module_class_name); Replaceall(imclass_class_code, "$imclassname", imclass_name); Replaceall(imclass_class_code, "$dllimport", dllimport); Printv(f_im, imclass_class_code, NIL); Printv(f_im, imclass_cppcasts_code, NIL); // Finish off the class Printf(f_im, "}\n"); addCloseNamespace(0, f_im); if (f_im != f_single_out) Delete(f_im); f_im = NULL; } // Generate the C# module class { File *f_module = getOutputFile(SWIG_output_directory(), module_class_name); addOpenNamespace(0, f_module); if (module_imports) Printf(f_module, "%s\n", module_imports); if (Len(module_class_modifiers) > 0) Printf(f_module, "%s ", module_class_modifiers); Printf(f_module, "%s ", module_class_name); if (module_baseclass && *Char(module_baseclass)) Printf(f_module, ": %s ", module_baseclass); if (Len(module_interfaces) > 0) Printv(f_module, "implements ", module_interfaces, " ", NIL); Printf(f_module, "{\n"); Replaceall(module_class_code, "$module", module_class_name); Replaceall(module_class_constants_code, "$module", module_class_name); Replaceall(module_class_code, "$imclassname", imclass_name); Replaceall(module_class_constants_code, "$imclassname", imclass_name); Replaceall(module_class_code, "$dllimport", dllimport); Replaceall(module_class_constants_code, "$dllimport", dllimport); // Add the wrapper methods Printv(f_module, module_class_code, NIL); // Write out all the global constants Printv(f_module, module_class_constants_code, NIL); // Finish off the class Printf(f_module, "}\n"); addCloseNamespace(0, f_module); if (f_module != f_single_out) Delete(f_module); f_module = NULL; } if (upcasts_code) Printv(f_wrappers, upcasts_code, NIL); Printf(f_wrappers, "#ifdef __cplusplus\n"); Printf(f_wrappers, "}\n"); Printf(f_wrappers, "#endif\n"); // Output a C# type wrapper class for each SWIG type for (Iterator swig_type = First(swig_types_hash); swig_type.key; swig_type = Next(swig_type)) { emitTypeWrapperClass(swig_type.key, swig_type.item); } // Check for overwriting file problems on filesystems that are case insensitive Iterator it1; Iterator it2; for (it1 = First(filenames_list); it1.item; it1 = Next(it1)) { String *item1_lower = Swig_string_lower(it1.item); for (it2 = Next(it1); it2.item; it2 = Next(it2)) { String *item2_lower = Swig_string_lower(it2.item); if (it1.item && it2.item) { if (Strcmp(item1_lower, item2_lower) == 0) { Swig_warning(WARN_LANG_PORTABILITY_FILENAME, input_file, line_number, "Portability warning: File %s will be overwritten by %s on case insensitive filesystems such as " "Windows' FAT32 and NTFS unless the class/module name is renamed\n", it1.item, it2.item); } } Delete(item2_lower); } Delete(item1_lower); } Delete(swig_types_hash); swig_types_hash = NULL; Delete(filenames_list); filenames_list = NULL; Delete(imclass_name); imclass_name = NULL; Delete(imclass_class_code); imclass_class_code = NULL; Delete(proxy_class_def); proxy_class_def = NULL; Delete(proxy_class_code); proxy_class_code = NULL; Delete(module_class_constants_code); module_class_constants_code = NULL; Delete(imclass_baseclass); imclass_baseclass = NULL; Delete(imclass_interfaces); imclass_interfaces = NULL; Delete(imclass_class_modifiers); imclass_class_modifiers = NULL; Delete(module_class_name); module_class_name = NULL; Delete(module_class_code); module_class_code = NULL; Delete(module_baseclass); module_baseclass = NULL; Delete(module_interfaces); module_interfaces = NULL; Delete(module_imports); module_imports = NULL; Delete(module_class_modifiers); module_class_modifiers = NULL; Delete(imclass_imports); imclass_imports = NULL; Delete(imclass_cppcasts_code); imclass_cppcasts_code = NULL; Delete(upcasts_code); upcasts_code = NULL; Delete(dmethods_seq); dmethods_seq = NULL; Delete(dmethods_table); dmethods_table = NULL; Delete(namespce); namespce = NULL; n_dmethods = 0; /* Close all of the files */ Dump(f_runtime, f_begin); Dump(f_header, f_begin); if (directorsEnabled()) { Dump(f_directors, f_begin); Dump(f_directors_h, f_runtime_h); Printf(f_runtime_h, "\n"); Printf(f_runtime_h, "#endif\n"); Delete(f_runtime_h); f_runtime_h = NULL; Delete(f_directors); f_directors = NULL; Delete(f_directors_h); f_directors_h = NULL; } if (f_single_out) { Dump(f_single_out, f_begin); Delete(f_single_out); f_single_out = NULL; } Dump(f_wrappers, f_begin); Wrapper_pretty_print(f_init, f_begin); Delete(f_header); Delete(f_wrappers); Delete(f_init); Delete(f_runtime); Delete(f_begin); return SWIG_OK; } /* ----------------------------------------------------------------------------- * emitBanner() * ----------------------------------------------------------------------------- */ void emitBanner(File *f) { Printf(f, "//------------------------------------------------------------------------------\n"); Printf(f, "// \n"); Printf(f, "//\n"); Swig_banner_target_lang(f, "//"); Printf(f, "//------------------------------------------------------------------------------\n\n"); } /* ----------------------------------------------------------------------------- * getOutputFile() * * Prepares a File object by creating the file in the file system and * writing the banner for auto-generated files to it (emitBanner). * If '-outfile' is provided (single file mode) the supplied parameters will * be ignored and the returned file will always be: * / * Otherwise the file will be: * /.cs * ----------------------------------------------------------------------------- */ File *getOutputFile(const String *dir, const String *name) { if (output_file) { if (!f_single_out) { String *filen = NewStringf("%s%s", SWIG_output_directory(), output_file); f_single_out = NewFile(filen, "w", SWIG_output_files()); if (!f_single_out) { FileErrorDisplay(filen); SWIG_exit(EXIT_FAILURE); } Append(filenames_list, Copy(filen)); Delete(filen); filen = NULL; emitBanner(f_single_out); } return f_single_out; } else { String *filen = NewStringf("%s%s.cs", dir, name); File *f = NewFile(filen, "w", SWIG_output_files()); if (!f) { FileErrorDisplay(filen); SWIG_exit(EXIT_FAILURE); } Append(filenames_list, Copy(filen)); Delete(filen); filen = NULL; emitBanner(f); return f; } } /*----------------------------------------------------------------------- * Add new director upcall signature *----------------------------------------------------------------------*/ UpcallData *addUpcallMethod(String *imclass_method, String *class_method, String *decl, String *overloaded_name) { String *key = NewStringf("%s|%s", imclass_method, decl); ++curr_class_dmethod; String *class_methodidx = NewStringf("%d", n_dmethods - first_class_dmethod); n_dmethods++; Hash *new_udata = NewHash(); Append(dmethods_seq, new_udata); Setattr(dmethods_table, key, new_udata); Setattr(new_udata, "method", Copy(class_method)); Setattr(new_udata, "class_methodidx", class_methodidx); Setattr(new_udata, "decl", Copy(decl)); Setattr(new_udata, "overname", Copy(overloaded_name)); Delete(key); return new_udata; } /*----------------------------------------------------------------------- * Get director upcall signature *----------------------------------------------------------------------*/ /* UpcallData * getUpcallMethodData(String *director_class, String *decl) { String *key = NewStringf("%s|%s", director_class, decl); UpcallData *udata = Getattr(dmethods_table, key); Delete(key); return udata; } */ /* ---------------------------------------------------------------------- * nativeWrapper() * ---------------------------------------------------------------------- */ virtual int nativeWrapper(Node *n) { String *wrapname = Getattr(n, "wrap:name"); if (!addSymbol(wrapname, n, imclass_name)) return SWIG_ERROR; if (Getattr(n, "type")) { Swig_save("nativeWrapper", n, "name", NIL); Setattr(n, "name", wrapname); native_function_flag = true; functionWrapper(n); Swig_restore(n); native_function_flag = false; } else { Swig_error(input_file, line_number, "No return type for %%native method %s.\n", Getattr(n, "wrap:name")); } return SWIG_OK; } /* ---------------------------------------------------------------------- * functionWrapper() * ---------------------------------------------------------------------- */ virtual int functionWrapper(Node *n) { String *symname = Getattr(n, "sym:name"); SwigType *t = Getattr(n, "type"); ParmList *l = Getattr(n, "parms"); String *tm; Parm *p; int i; String *c_return_type = NewString(""); String *im_return_type = NewString(""); String *cleanup = NewString(""); String *outarg = NewString(""); String *body = NewString(""); String *im_outattributes = 0; int num_arguments = 0; bool is_void_return; String *overloaded_name = getOverloadedName(n); if (!Getattr(n, "sym:overloaded")) { if (!addSymbol(symname, n, imclass_name)) return SWIG_ERROR; } /* The rest of this function deals with generating the intermediary class wrapper function (that wraps a c/c++ function) and generating the PInvoke c code. Each C# wrapper function has a matching PInvoke c function call. */ // A new wrapper function object Wrapper *f = NewWrapper(); // Make a wrapper name for this function String *wname = Swig_name_wrapper(overloaded_name); /* Attach the non-standard typemaps to the parameter list. */ Swig_typemap_attach_parms("ctype", l, f); Swig_typemap_attach_parms("imtype", l, f); /* Get return types */ if ((tm = Swig_typemap_lookup("ctype", n, "", 0))) { String *ctypeout = Getattr(n, "tmap:ctype:out"); // the type in the ctype typemap's out attribute overrides the type in the typemap if (ctypeout) tm = ctypeout; Printf(c_return_type, "%s", tm); } else { Swig_warning(WARN_CSHARP_TYPEMAP_CTYPE_UNDEF, input_file, line_number, "No ctype typemap defined for %s\n", SwigType_str(t, 0)); } if ((tm = Swig_typemap_lookup("imtype", n, "", 0))) { String *imtypeout = Getattr(n, "tmap:imtype:out"); // the type in the imtype typemap's out attribute overrides the type in the typemap if (imtypeout) tm = imtypeout; Printf(im_return_type, "%s", tm); im_outattributes = Getattr(n, "tmap:imtype:outattributes"); } else { Swig_warning(WARN_CSHARP_TYPEMAP_CSTYPE_UNDEF, input_file, line_number, "No imtype typemap defined for %s\n", SwigType_str(t, 0)); } is_void_return = (Cmp(c_return_type, "void") == 0); if (!is_void_return) Wrapper_add_localv(f, "jresult", c_return_type, "jresult", NIL); Printv(f->def, " SWIGEXPORT ", c_return_type, " SWIGSTDCALL ", wname, "(", NIL); // Emit all of the local variables for holding arguments. emit_parameter_variables(l, f); /* Attach the standard typemaps */ emit_attach_parmmaps(l, f); // Parameter overloading Setattr(n, "wrap:parms", l); Setattr(n, "wrap:name", wname); // Wrappers not wanted for some methods where the parameters cannot be overloaded in C# if (Getattr(n, "sym:overloaded")) { // Emit warnings for the few cases that can't be overloaded in C# and give up on generating wrapper Swig_overload_check(n); if (Getattr(n, "overload:ignore")) { DelWrapper(f); return SWIG_OK; } } Printv(imclass_class_code, "\n [global::System.Runtime.InteropServices.DllImport(\"", dllimport, "\", EntryPoint=\"", wname, "\")]\n", NIL); if (im_outattributes) Printf(imclass_class_code, " %s\n", im_outattributes); Printf(imclass_class_code, " public static extern %s %s(", im_return_type, overloaded_name); /* Get number of required and total arguments */ num_arguments = emit_num_arguments(l); int gencomma = 0; // Now walk the function parameter list and generate code to get arguments for (i = 0, p = l; i < num_arguments; i++) { while (checkAttribute(p, "tmap:in:numinputs", "0")) { p = Getattr(p, "tmap:in:next"); } SwigType *pt = Getattr(p, "type"); String *ln = Getattr(p, "lname"); String *im_param_type = NewString(""); String *c_param_type = NewString(""); String *arg = NewString(""); Printf(arg, "j%s", ln); /* Get the ctype types of the parameter */ if ((tm = Getattr(p, "tmap:ctype"))) { Printv(c_param_type, tm, NIL); } else { Swig_warning(WARN_CSHARP_TYPEMAP_CTYPE_UNDEF, input_file, line_number, "No ctype typemap defined for %s\n", SwigType_str(pt, 0)); } /* Get the intermediary class parameter types of the parameter */ if ((tm = Getattr(p, "tmap:imtype"))) { const String *inattributes = Getattr(p, "tmap:imtype:inattributes"); Printf(im_param_type, "%s%s", inattributes ? inattributes : empty_string, tm); } else { Swig_warning(WARN_CSHARP_TYPEMAP_CSTYPE_UNDEF, input_file, line_number, "No imtype typemap defined for %s\n", SwigType_str(pt, 0)); } /* Add parameter to intermediary class method */ if (gencomma) Printf(imclass_class_code, ", "); Printf(imclass_class_code, "%s %s", im_param_type, arg); // Add parameter to C function Printv(f->def, gencomma ? ", " : "", c_param_type, " ", arg, NIL); gencomma = 1; // Get typemap for this argument if ((tm = Getattr(p, "tmap:in"))) { canThrow(n, "in", p); Replaceall(tm, "$source", arg); /* deprecated */ Replaceall(tm, "$target", ln); /* deprecated */ Replaceall(tm, "$arg", arg); /* deprecated? */ Replaceall(tm, "$input", arg); Setattr(p, "emit:input", arg); Printf(f->code, "%s\n", tm); p = Getattr(p, "tmap:in:next"); } else { Swig_warning(WARN_TYPEMAP_IN_UNDEF, input_file, line_number, "Unable to use type %s as a function argument.\n", SwigType_str(pt, 0)); p = nextSibling(p); } Delete(im_param_type); Delete(c_param_type); Delete(arg); } /* Insert constraint checking code */ for (p = l; p;) { if ((tm = Getattr(p, "tmap:check"))) { canThrow(n, "check", p); Replaceall(tm, "$target", Getattr(p, "lname")); /* deprecated */ Replaceall(tm, "$arg", Getattr(p, "emit:input")); /* deprecated? */ Replaceall(tm, "$input", Getattr(p, "emit:input")); Printv(f->code, tm, "\n", NIL); p = Getattr(p, "tmap:check:next"); } else { p = nextSibling(p); } } /* Insert cleanup code */ for (p = l; p;) { if ((tm = Getattr(p, "tmap:freearg"))) { canThrow(n, "freearg", p); Replaceall(tm, "$source", Getattr(p, "emit:input")); /* deprecated */ Replaceall(tm, "$arg", Getattr(p, "emit:input")); /* deprecated? */ Replaceall(tm, "$input", Getattr(p, "emit:input")); Printv(cleanup, tm, "\n", NIL); p = Getattr(p, "tmap:freearg:next"); } else { p = nextSibling(p); } } /* Insert argument output code */ for (p = l; p;) { if ((tm = Getattr(p, "tmap:argout"))) { canThrow(n, "argout", p); Replaceall(tm, "$source", Getattr(p, "emit:input")); /* deprecated */ Replaceall(tm, "$target", Getattr(p, "lname")); /* deprecated */ Replaceall(tm, "$arg", Getattr(p, "emit:input")); /* deprecated? */ Replaceall(tm, "$result", "jresult"); Replaceall(tm, "$input", Getattr(p, "emit:input")); Printv(outarg, tm, "\n", NIL); p = Getattr(p, "tmap:argout:next"); } else { p = nextSibling(p); } } // Look for usage of throws typemap and the canthrow flag ParmList *throw_parm_list = NULL; if ((throw_parm_list = Getattr(n, "catchlist"))) { Swig_typemap_attach_parms("throws", throw_parm_list, f); for (p = throw_parm_list; p; p = nextSibling(p)) { if (Getattr(p, "tmap:throws")) { canThrow(n, "throws", p); } } } String *null_attribute = 0; // Now write code to make the function call if (!native_function_flag) { Swig_director_emit_dynamic_cast(n, f); String *actioncode = emit_action(n); /* Return value if necessary */ if ((tm = Swig_typemap_lookup_out("out", n, Swig_cresult_name(), f, actioncode))) { canThrow(n, "out", n); Replaceall(tm, "$source", Swig_cresult_name()); /* deprecated */ Replaceall(tm, "$target", "jresult"); /* deprecated */ Replaceall(tm, "$result", "jresult"); if (GetFlag(n, "feature:new")) Replaceall(tm, "$owner", "1"); else Replaceall(tm, "$owner", "0"); Printf(f->code, "%s", tm); null_attribute = Getattr(n, "tmap:out:null"); if (Len(tm)) Printf(f->code, "\n"); } else { Swig_warning(WARN_TYPEMAP_OUT_UNDEF, input_file, line_number, "Unable to use return type %s in function %s.\n", SwigType_str(t, 0), Getattr(n, "name")); } emit_return_variable(n, t, f); } /* Output argument output code */ Printv(f->code, outarg, NIL); /* Output cleanup code */ Printv(f->code, cleanup, NIL); /* Look to see if there is any newfree cleanup code */ if (GetFlag(n, "feature:new")) { if ((tm = Swig_typemap_lookup("newfree", n, Swig_cresult_name(), 0))) { canThrow(n, "newfree", n); Replaceall(tm, "$source", Swig_cresult_name()); /* deprecated */ Printf(f->code, "%s\n", tm); } } /* See if there is any return cleanup code */ if (!native_function_flag) { if ((tm = Swig_typemap_lookup("ret", n, Swig_cresult_name(), 0))) { canThrow(n, "ret", n); Replaceall(tm, "$source", Swig_cresult_name()); /* deprecated */ Printf(f->code, "%s\n", tm); } } /* Finish C function and intermediary class function definitions */ Printf(imclass_class_code, ")"); Printf(imclass_class_code, ";\n"); Printf(f->def, ") {"); if (!is_void_return) Printv(f->code, " return jresult;\n", NIL); Printf(f->code, "}\n"); /* Substitute the cleanup code */ Replaceall(f->code, "$cleanup", cleanup); /* Substitute the function name */ Replaceall(f->code, "$symname", symname); /* Contract macro modification */ if (Replaceall(f->code, "SWIG_contract_assert(", "SWIG_contract_assert($null, ") > 0) { Setattr(n, "csharp:canthrow", "1"); } if (!null_attribute) Replaceall(f->code, "$null", "0"); else Replaceall(f->code, "$null", null_attribute); /* Dump the function out */ if (!native_function_flag) { Wrapper_print(f, f_wrappers); // Handle %csexception which sets the canthrow attribute if (Getattr(n, "feature:except:canthrow")) Setattr(n, "csharp:canthrow", "1"); // A very simple check (it is not foolproof) to help typemap/feature writers for // throwing C# exceptions from unmanaged code. It checks for the common methods which // set a pending C# exception... the 'canthrow' typemap/feature attribute must be set // so that code which checks for pending exceptions is added in the C# proxy method. if (!Getattr(n, "csharp:canthrow")) { if (Strstr(f->code, "SWIG_exception")) { Swig_warning(WARN_CSHARP_CANTHROW, input_file, line_number, "Unmanaged code contains a call to SWIG_exception and C# code does not handle pending exceptions via the canthrow attribute.\n"); } else if (Strstr(f->code, "SWIG_CSharpSetPendingException")) { Swig_warning(WARN_CSHARP_CANTHROW, input_file, line_number, "Unmanaged code contains a call to a SWIG_CSharpSetPendingException method and C# code does not handle pending exceptions via the canthrow attribute.\n"); } } } if (!(proxy_flag && is_wrapping_class()) && !enum_constant_flag) { moduleClassFunctionHandler(n); } /* * Generate the proxy class properties for public member variables. * Not for enums and constants. */ if (proxy_flag && wrapping_member_flag && !enum_constant_flag) { // Capitalize the first letter in the variable in the getter/setter function name bool getter_flag = Cmp(symname, Swig_name_set(getNSpace(), Swig_name_member(0, getClassPrefix(), variable_name))) != 0; String *getter_setter_name = NewString(""); if (!getter_flag) Printf(getter_setter_name, "set"); else Printf(getter_setter_name, "get"); Putc(toupper((int) *Char(variable_name)), getter_setter_name); Printf(getter_setter_name, "%s", Char(variable_name) + 1); Setattr(n, "proxyfuncname", getter_setter_name); Setattr(n, "imfuncname", symname); proxyClassFunctionHandler(n); Delete(getter_setter_name); } Delete(c_return_type); Delete(im_return_type); Delete(cleanup); Delete(outarg); Delete(body); Delete(overloaded_name); DelWrapper(f); return SWIG_OK; } /* ----------------------------------------------------------------------- * variableWrapper() * ----------------------------------------------------------------------- */ virtual int variableWrapper(Node *n) { Language::variableWrapper(n); return SWIG_OK; } /* ----------------------------------------------------------------------- * globalvariableHandler() * ------------------------------------------------------------------------ */ virtual int globalvariableHandler(Node *n) { generate_property_declaration_flag = true; variable_name = Getattr(n, "sym:name"); global_variable_flag = true; int ret = Language::globalvariableHandler(n); global_variable_flag = false; generate_property_declaration_flag = false; if (proxy_flag) { Printf(module_class_code, "\n }\n\n"); } return ret; } String *getCurrentScopeName(String *nspace) { String *scope = 0; if (nspace || getCurrentClass()) { scope = NewString(""); if (nspace) Printf(scope, "%s", nspace); if (Node *cls = getCurrentClass()) { if (Node *outer = Getattr(cls, "nested:outer")) { String *outerClassesPrefix = Copy(Getattr(outer, "sym:name")); for (outer = Getattr(outer, "nested:outer"); outer != 0; outer = Getattr(outer, "nested:outer")) { Push(outerClassesPrefix, "."); Push(outerClassesPrefix, Getattr(outer, "sym:name")); } Printv(scope, nspace ? "." : "", outerClassesPrefix, ".", proxy_class_name, NIL); Delete(outerClassesPrefix); } else Printv(scope, nspace ? "." : "", proxy_class_name, NIL); } } return scope; } /* ---------------------------------------------------------------------- * enumDeclaration() * * C/C++ enums can be mapped in one of 4 ways, depending on the cs:enum feature specified: * 1) Simple enums - simple constant within the proxy class or module class * 2) Typeunsafe enums - simple constant in a C# class (class named after the c++ enum name) * 3) Typesafe enum - typesafe enum pattern (class named after the c++ enum name) * 4) Proper enums - proper C# enum * Anonymous enums always default to 1) * ---------------------------------------------------------------------- */ virtual int enumDeclaration(Node *n) { if (!ImportMode) { if (getCurrentClass() && (cplus_mode != PUBLIC)) return SWIG_NOWRAP; String *nspace = Getattr(n, "sym:nspace"); // NSpace/getNSpace() only works during Language::enumDeclaration call if (proxy_flag && !is_wrapping_class()) { // Global enums / enums in a namespace assert(!full_imclass_name); if (!nspace) { full_imclass_name = NewStringf("%s", imclass_name); } else { if (namespce) { full_imclass_name = NewStringf("%s.%s", namespce, imclass_name); } else { full_imclass_name = NewStringf("%s", imclass_name); } } } enum_code = NewString(""); String *symname = Getattr(n, "sym:name"); String *constants_code = (proxy_flag && is_wrapping_class())? proxy_class_constants_code : module_class_constants_code; EnumFeature enum_feature = decodeEnumFeature(n); String *typemap_lookup_type = Getattr(n, "name"); if ((enum_feature != SimpleEnum) && symname && typemap_lookup_type) { // Wrap (non-anonymous) C/C++ enum within a typesafe, typeunsafe or proper C# enum String *scope = getCurrentScopeName(nspace); if (!addSymbol(symname, n, scope)) return SWIG_ERROR; // Pure C# baseclass and interfaces const String *pure_baseclass = typemapLookup(n, "csbase", typemap_lookup_type, WARN_NONE); const String *pure_interfaces = typemapLookup(n, "csinterfaces", typemap_lookup_type, WARN_NONE); // Class attributes const String *csattributes = typemapLookup(n, "csattributes", typemap_lookup_type, WARN_NONE); if (csattributes && *Char(csattributes)) Printf(enum_code, "%s\n", csattributes); // Emit the enum Printv(enum_code, typemapLookup(n, "csclassmodifiers", typemap_lookup_type, WARN_CSHARP_TYPEMAP_CLASSMOD_UNDEF), // Class modifiers (enum modifiers really) " ", symname, (*Char(pure_baseclass) || *Char(pure_interfaces)) ? " : " : "", pure_baseclass, ((*Char(pure_baseclass)) && *Char(pure_interfaces)) ? // Interfaces ", " : "", pure_interfaces, " {\n", NIL); Delete(scope); } else { // Wrap C++ enum with integers - just indicate start of enum with a comment, no comment for anonymous enums of any sort if (symname && !Getattr(n, "unnamedinstance")) Printf(constants_code, " // %s \n", symname); } // Emit each enum item Language::enumDeclaration(n); if ((enum_feature != SimpleEnum) && symname && typemap_lookup_type) { // Wrap (non-anonymous) C/C++ enum within a typesafe, typeunsafe or proper C# enum // Finish the enum declaration // Typemaps are used to generate the enum definition in a similar manner to proxy classes. Printv(enum_code, (enum_feature == ProperEnum) ? "\n" : typemapLookup(n, "csbody", typemap_lookup_type, WARN_CSHARP_TYPEMAP_CSBODY_UNDEF), // main body of class typemapLookup(n, "cscode", typemap_lookup_type, WARN_NONE), // extra C# code "}", NIL); Replaceall(enum_code, "$csclassname", symname); // Substitute $enumvalues - intended usage is for typesafe enums if (Getattr(n, "enumvalues")) Replaceall(enum_code, "$enumvalues", Getattr(n, "enumvalues")); else Replaceall(enum_code, "$enumvalues", ""); if (proxy_flag && is_wrapping_class()) { // Enums defined within the C++ class are defined within the proxy class // Add extra indentation Replaceall(enum_code, "\n", "\n "); Replaceall(enum_code, " \n", "\n"); Printv(proxy_class_constants_code, " ", enum_code, "\n\n", NIL); } else { // Global enums are defined in their own file String *output_directory = outputDirectory(nspace); File *f_enum = getOutputFile(output_directory, symname); addOpenNamespace(nspace, f_enum); Printv(f_enum, typemapLookup(n, "csimports", typemap_lookup_type, WARN_NONE), // Import statements "\n", enum_code, "\n", NIL); addCloseNamespace(nspace, f_enum); if (f_enum != f_single_out) Delete(f_enum); f_enum = NULL; Delete(output_directory); } } else { // Wrap C++ enum with simple constant Printf(enum_code, "\n"); if (proxy_flag && is_wrapping_class()) Printv(proxy_class_constants_code, enum_code, NIL); else Printv(module_class_constants_code, enum_code, NIL); } Delete(enum_code); enum_code = NULL; if (proxy_flag && !is_wrapping_class()) { Delete(full_imclass_name); full_imclass_name = 0; } } return SWIG_OK; } /* ---------------------------------------------------------------------- * enumvalueDeclaration() * ---------------------------------------------------------------------- */ virtual int enumvalueDeclaration(Node *n) { if (getCurrentClass() && (cplus_mode != PUBLIC)) return SWIG_NOWRAP; Swig_require("enumvalueDeclaration", n, "*name", "?value", NIL); String *symname = Getattr(n, "sym:name"); String *value = Getattr(n, "value"); String *name = Getattr(n, "name"); Node *parent = parentNode(n); int unnamedinstance = GetFlag(parent, "unnamedinstance"); String *parent_name = Getattr(parent, "name"); String *nspace = getNSpace(); String *newsymname = 0; String *tmpValue; // Strange hack from parent method if (value) tmpValue = NewString(value); else tmpValue = NewString(name); // Note that this is used in enumValue() amongst other places Setattr(n, "value", tmpValue); // Deal with enum values that are not int int swigtype = SwigType_type(Getattr(n, "type")); if (swigtype == T_BOOL) { const char *val = Equal(Getattr(n, "enumvalue"), "true") ? "1" : "0"; Setattr(n, "enumvalue", val); } else if (swigtype == T_CHAR) { String *val = NewStringf("'%(hexescape)s'", Getattr(n, "enumvalue")); Setattr(n, "enumvalue", val); Delete(val); } { EnumFeature enum_feature = decodeEnumFeature(parent); if ((enum_feature == SimpleEnum) && GetFlag(parent, "scopedenum")) { newsymname = Swig_name_member(0, Getattr(parent, "sym:name"), symname); symname = newsymname; } // Add to language symbol table String *scope = 0; if (unnamedinstance || !parent_name || enum_feature == SimpleEnum) { String *enumClassPrefix = getEnumClassPrefix(); if (enumClassPrefix) { scope = NewString(""); if (nspace) Printf(scope, "%s.", nspace); Printf(scope, "%s", enumClassPrefix); } else { scope = Copy(module_class_name); } } else { scope = getCurrentScopeName(nspace); if (!scope) scope = Copy(Getattr(parent, "sym:name")); else Printf(scope, ".%s", Getattr(parent, "sym:name")); } if (!addSymbol(symname, n, scope)) return SWIG_ERROR; const String *csattributes = Getattr(n, "feature:cs:attributes"); if ((enum_feature == ProperEnum) && parent_name && !unnamedinstance) { // Wrap (non-anonymous) C/C++ enum with a proper C# enum // Emit the enum item. if (!GetFlag(n, "firstenumitem")) Printf(enum_code, ",\n"); if (csattributes) Printf(enum_code, " %s\n", csattributes); Printf(enum_code, " %s", symname); // Check for the %csconstvalue feature String *value = Getattr(n, "feature:cs:constvalue"); // Note that the enum value must be a true constant and cannot be set from a PINVOKE call, thus no support for %csconst(0) value = value ? value : Getattr(n, "enumvalue"); if (value) { Printf(enum_code, " = %s", value); } } else { // Wrap C/C++ enums with constant integers or use the typesafe enum pattern SwigType *typemap_lookup_type = parent_name ? parent_name : NewString("enum "); Setattr(n, "type", typemap_lookup_type); const String *tm = typemapLookup(n, "cstype", typemap_lookup_type, WARN_CSHARP_TYPEMAP_CSWTYPE_UNDEF); String *return_type = Copy(tm); substituteClassname(typemap_lookup_type, return_type); const String *methodmods = Getattr(n, "feature:cs:methodmodifiers"); methodmods = methodmods ? methodmods : (is_public(n) ? public_string : protected_string); if (csattributes) Printf(enum_code, " %s\n", csattributes); if ((enum_feature == TypesafeEnum) && parent_name && !unnamedinstance) { // Wrap (non-anonymous) enum using the typesafe enum pattern if (Getattr(n, "enumvalue")) { String *value = enumValue(n); Printf(enum_code, " %s static readonly %s %s = new %s(\"%s\", %s);\n", methodmods, return_type, symname, return_type, symname, value); Delete(value); } else { Printf(enum_code, " %s static readonly %s %s = new %s(\"%s\");\n", methodmods, return_type, symname, return_type, symname); } } else { // Simple integer constants // Note these are always generated for anonymous enums, no matter what enum_feature is specified // Code generated is the same for SimpleEnum and TypeunsafeEnum -> the class it is generated into is determined later // The %csconst feature determines how the constant value is obtained int const_feature_flag = GetFlag(n, "feature:cs:const"); const char *const_readonly = const_feature_flag ? "const" : "static readonly"; String *value = enumValue(n); Printf(enum_code, " %s %s %s %s = %s;\n", methodmods, const_readonly, return_type, symname, value); Delete(value); } Delete(return_type); } // Add the enum value to the comma separated list being constructed in the enum declaration. String *enumvalues = Getattr(parent, "enumvalues"); if (!enumvalues) Setattr(parent, "enumvalues", Copy(symname)); else Printv(enumvalues, ", ", symname, NIL); Delete(scope); } Delete(newsymname); Delete(tmpValue); Swig_restore(n); return SWIG_OK; } /* ----------------------------------------------------------------------- * constantWrapper() * Used for wrapping constants - #define or %constant. * Also for inline initialised const static primitive type member variables (short, int, double, enums etc). * C# static const variables are generated for these. * If the %csconst(1) feature is used then the C constant value is used to initialise the C# const variable. * If not, a PINVOKE method is generated to get the C constant value for initialisation of the C# const variable. * However, if the %csconstvalue feature is used, it overrides all other ways to generate the initialisation. * Also note that this method might be called for wrapping enum items (when the enum is using %csconst(0)). * ------------------------------------------------------------------------ */ virtual int constantWrapper(Node *n) { String *symname = Getattr(n, "sym:name"); SwigType *t = Getattr(n, "type"); SwigType *valuetype = Getattr(n, "valuetype"); ParmList *l = Getattr(n, "parms"); String *tm; String *return_type = NewString(""); String *constants_code = NewString(""); Swig_save("constantWrapper", n, "value", NIL); Swig_save("constantWrapper", n, "tmap:ctype:out", "tmap:imtype:out", "tmap:cstype:out", "tmap:out:null", "tmap:imtype:outattributes", "tmap:cstype:outattributes", NIL); bool is_enum_item = (Cmp(nodeType(n), "enumitem") == 0); const String *itemname = (proxy_flag && wrapping_member_flag) ? variable_name : symname; if (!is_enum_item) { String *scope = 0; if (proxy_class_name) { String *nspace = getNSpace(); scope = NewString(""); if (nspace) Printf(scope, "%s.", nspace); Printf(scope, "%s", proxy_class_name); } else { scope = Copy(module_class_name); } if (!addSymbol(itemname, n, scope)) return SWIG_ERROR; Delete(scope); } // The %csconst feature determines how the constant value is obtained int const_feature_flag = GetFlag(n, "feature:cs:const"); /* Adjust the enum type for the Swig_typemap_lookup. * We want the same jstype typemap for all the enum items so we use the enum type (parent node). */ if (is_enum_item) { t = Getattr(parentNode(n), "enumtype"); Setattr(n, "type", t); } /* Attach the non-standard typemaps to the parameter list. */ Swig_typemap_attach_parms("cstype", l, NULL); /* Get C# return types */ bool classname_substituted_flag = false; if ((tm = Swig_typemap_lookup("cstype", n, "", 0))) { String *cstypeout = Getattr(n, "tmap:cstype:out"); // the type in the cstype typemap's out attribute overrides the type in the typemap if (cstypeout) tm = cstypeout; classname_substituted_flag = substituteClassname(t, tm); Printf(return_type, "%s", tm); } else { Swig_warning(WARN_CSHARP_TYPEMAP_CSWTYPE_UNDEF, input_file, line_number, "No cstype typemap defined for %s\n", SwigType_str(t, 0)); } // Default (octal) escaping is no good - change to hex escaped value String *hexescaped_value = Getattr(n, "rawvalue") ? NewStringf("%(hexescape)s", Getattr(n, "rawvalue")) : 0; // Add the stripped quotes back in String *new_value = NewString(""); if (SwigType_type(t) == T_STRING) { Printf(new_value, "\"%s\"", hexescaped_value ? hexescaped_value : Copy(Getattr(n, "value"))); Setattr(n, "value", new_value); } else if (SwigType_type(t) == T_CHAR) { Printf(new_value, "\'%s\'", hexescaped_value ? hexescaped_value : Copy(Getattr(n, "value"))); Setattr(n, "value", new_value); } const String *outattributes = Getattr(n, "tmap:cstype:outattributes"); if (outattributes) Printf(constants_code, " %s\n", outattributes); const String *methodmods = Getattr(n, "feature:cs:methodmodifiers"); methodmods = methodmods ? methodmods : (is_public(n) ? public_string : protected_string); Printf(constants_code, " %s %s %s %s = ", methodmods, (const_feature_flag ? "const" : "static readonly"), return_type, itemname); // Check for the %csconstvalue feature String *value = Getattr(n, "feature:cs:constvalue"); if (value) { Printf(constants_code, "%s;\n", value); } else if (!const_feature_flag) { // Default enum and constant handling will work with any type of C constant and initialises the C# variable from C through a PINVOKE call. if (classname_substituted_flag) { if (SwigType_isenum(t)) { // This handles wrapping of inline initialised const enum static member variables (not when wrapping enum items - ignored later on) Printf(constants_code, "(%s)%s.%s();\n", return_type, full_imclass_name ? full_imclass_name : imclass_name, Swig_name_get(getNSpace(), symname)); } else { // This handles function pointers using the %constant directive Printf(constants_code, "new %s(%s.%s(), false);\n", return_type, full_imclass_name ? full_imclass_name : imclass_name, Swig_name_get(getNSpace(), symname)); } } else { Printf(constants_code, "%s.%s();\n", full_imclass_name ? full_imclass_name : imclass_name, Swig_name_get(getNSpace(), symname)); } // Each constant and enum value is wrapped with a separate PInvoke function call SetFlag(n, "feature:immutable"); enum_constant_flag = true; variableWrapper(n); enum_constant_flag = false; } else { // Alternative constant handling will use the C syntax to make a true C# constant and hope that it compiles as C# code if (Getattr(n, "wrappedasconstant")) { if (SwigType_type(t) == T_CHAR) { if (SwigType_type(valuetype) == T_CHAR) Printf(constants_code, "\'%(hexescape)s\';\n", Getattr(n, "staticmembervariableHandler:value")); else Printf(constants_code, "(char)%s;\n", Getattr(n, "staticmembervariableHandler:value")); } else { Printf(constants_code, "%s;\n", Getattr(n, "staticmembervariableHandler:value")); } } else { Printf(constants_code, "%s;\n", Getattr(n, "value")); } } // Emit the generated code to appropriate place // Enums only emit the intermediate and PINVOKE methods, so no proxy or module class wrapper methods needed if (!is_enum_item) { if (proxy_flag && wrapping_member_flag) Printv(proxy_class_constants_code, constants_code, NIL); else Printv(module_class_constants_code, constants_code, NIL); } // Cleanup Swig_restore(n); Delete(new_value); Delete(return_type); Delete(constants_code); return SWIG_OK; } /* ----------------------------------------------------------------------------- * insertDirective() * ----------------------------------------------------------------------------- */ virtual int insertDirective(Node *n) { int ret = SWIG_OK; String *code = Getattr(n, "code"); String *section = Getattr(n, "section"); Replaceall(code, "$module", module_class_name); Replaceall(code, "$imclassname", imclass_name); Replaceall(code, "$dllimport", dllimport); if (!ImportMode && (Cmp(section, "proxycode") == 0)) { if (proxy_class_code) { Swig_typemap_replace_embedded_typemap(code, n); int offset = Len(code) > 0 && *Char(code) == '\n' ? 1 : 0; Printv(proxy_class_code, Char(code) + offset, "\n", NIL); } } else { ret = Language::insertDirective(n); } return ret; } /* ----------------------------------------------------------------------------- * pragmaDirective() * * Valid Pragmas: * imclassbase - base (extends) for the intermediary class * imclassclassmodifiers - class modifiers for the intermediary class * imclasscode - text (C# code) is copied verbatim to the intermediary class * imclassimports - import statements for the intermediary class * imclassinterfaces - interface (implements) for the intermediary class * * modulebase - base (extends) for the module class * moduleclassmodifiers - class modifiers for the module class * modulecode - text (C# code) is copied verbatim to the module class * moduleimports - import statements for the module class * moduleinterfaces - interface (implements) for the module class * * ----------------------------------------------------------------------------- */ virtual int pragmaDirective(Node *n) { if (!ImportMode) { String *lang = Getattr(n, "lang"); String *code = Getattr(n, "name"); String *value = Getattr(n, "value"); if (Strcmp(lang, "csharp") == 0) { String *strvalue = NewString(value); Replaceall(strvalue, "\\\"", "\""); if (Strcmp(code, "imclassbase") == 0) { Delete(imclass_baseclass); imclass_baseclass = Copy(strvalue); } else if (Strcmp(code, "imclassclassmodifiers") == 0) { Delete(imclass_class_modifiers); imclass_class_modifiers = Copy(strvalue); } else if (Strcmp(code, "imclasscode") == 0) { Printf(imclass_class_code, "%s\n", strvalue); } else if (Strcmp(code, "imclassimports") == 0) { Delete(imclass_imports); imclass_imports = Copy(strvalue); } else if (Strcmp(code, "imclassinterfaces") == 0) { Delete(imclass_interfaces); imclass_interfaces = Copy(strvalue); } else if (Strcmp(code, "modulebase") == 0) { Delete(module_baseclass); module_baseclass = Copy(strvalue); } else if (Strcmp(code, "moduleclassmodifiers") == 0) { Delete(module_class_modifiers); module_class_modifiers = Copy(strvalue); } else if (Strcmp(code, "modulecode") == 0) { Printf(module_class_code, "%s\n", strvalue); } else if (Strcmp(code, "moduleimports") == 0) { Delete(module_imports); module_imports = Copy(strvalue); } else if (Strcmp(code, "moduleinterfaces") == 0) { Delete(module_interfaces); module_interfaces = Copy(strvalue); } else { Swig_error(input_file, line_number, "Unrecognized pragma.\n"); } Delete(strvalue); } } return Language::pragmaDirective(n); } /* ----------------------------------------------------------------------------- * getQualifiedInterfaceName() * ----------------------------------------------------------------------------- */ String *getQualifiedInterfaceName(Node *n) { String *ret = Getattr(n, "interface:qname"); if (!ret) { String *nspace = Getattr(n, "sym:nspace"); String *interface_name = Getattr(n, "interface:name"); if (nspace) { if (namespce) ret = NewStringf("%s.%s.%s", namespce, nspace, interface_name); else ret = NewStringf("%s.%s", nspace, interface_name); } else { ret = Copy(interface_name); } Setattr(n, "interface:qname", ret); } return ret; } /* ----------------------------------------------------------------------------- * getInterfaceName() * ----------------------------------------------------------------------------- */ String *getInterfaceName(SwigType *t, bool qualified) { String *interface_name = NULL; if (proxy_flag) { Node *n = classLookup(t); if (n && Getattr(n, "interface:name")) interface_name = qualified ? getQualifiedInterfaceName(n) : Getattr(n, "interface:name"); } return interface_name; } /* ----------------------------------------------------------------------------- * addInterfaceNameAndUpcasts() * ----------------------------------------------------------------------------- */ void addInterfaceNameAndUpcasts(SwigType *smart, String *interface_list, String *interface_upcasts, Hash *base_list, String *c_classname) { List *keys = Keys(base_list); for (Iterator it = First(keys); it.item; it = Next(it)) { Node *base = Getattr(base_list, it.item); String *c_baseclass = SwigType_namestr(Getattr(base, "name")); String *interface_name = Getattr(base, "interface:name"); if (Len(interface_list)) Append(interface_list, ", "); Append(interface_list, interface_name); Node *attributes = NewHash(); String *interface_code = Copy(typemapLookup(base, "csinterfacecode", Getattr(base, "classtypeobj"), WARN_CSHARP_TYPEMAP_INTERFACECODE_UNDEF, attributes)); String *cptr_method_name = 0; if (interface_code) { Replaceall(interface_code, "$interfacename", interface_name); Printv(interface_upcasts, interface_code, NIL); cptr_method_name = Copy(Getattr(attributes, "tmap:csinterfacecode:cptrmethod")); } if (!cptr_method_name) cptr_method_name = NewStringf("%s_GetInterfaceCPtr", interface_name); Replaceall(cptr_method_name, ".", "_"); Replaceall(cptr_method_name, "$interfacename", interface_name); String *upcast_method_name = Swig_name_member(getNSpace(), getClassPrefix(), cptr_method_name); upcastsCode(smart, upcast_method_name, c_classname, c_baseclass); Delete(upcast_method_name); Delete(cptr_method_name); Delete(interface_code); Delete(c_baseclass); } Delete(keys); } /* ----------------------------------------------------------------------------- * upcastsCode() * * Add code for C++ casting to base class * ----------------------------------------------------------------------------- */ void upcastsCode(SwigType *smart, String *upcast_method_name, String *c_classname, String *c_baseclass) { String *wname = Swig_name_wrapper(upcast_method_name); Printv(imclass_cppcasts_code, "\n [global::System.Runtime.InteropServices.DllImport(\"", dllimport, "\", EntryPoint=\"", wname, "\")]\n", NIL); Printf(imclass_cppcasts_code, " public static extern global::System.IntPtr %s(global::System.IntPtr jarg1);\n", upcast_method_name); Replaceall(imclass_cppcasts_code, "$csclassname", proxy_class_name); if (smart) { SwigType *bsmart = Copy(smart); SwigType *rclassname = SwigType_typedef_resolve_all(c_classname); SwigType *rbaseclass = SwigType_typedef_resolve_all(c_baseclass); Replaceall(bsmart, rclassname, rbaseclass); Delete(rclassname); Delete(rbaseclass); String *smartnamestr = SwigType_namestr(smart); String *bsmartnamestr = SwigType_namestr(bsmart); Printv(upcasts_code, "SWIGEXPORT ", bsmartnamestr, " * SWIGSTDCALL ", wname, "(", smartnamestr, " *jarg1) {\n", " return jarg1 ? new ", bsmartnamestr, "(*jarg1) : 0;\n" "}\n", "\n", NIL); Delete(bsmartnamestr); Delete(smartnamestr); Delete(bsmart); } else { Printv(upcasts_code, "SWIGEXPORT ", c_baseclass, " * SWIGSTDCALL ", wname, "(", c_classname, " *jarg1) {\n", " return (", c_baseclass, " *)jarg1;\n" "}\n", "\n", NIL); } Delete(wname); } /* ----------------------------------------------------------------------------- * emitProxyClassDefAndCPPCasts() * ----------------------------------------------------------------------------- */ void emitProxyClassDefAndCPPCasts(Node *n) { String *c_classname = SwigType_namestr(Getattr(n, "name")); String *c_baseclass = NULL; String *baseclass = NULL; String *c_baseclassname = NULL; String *interface_list = NewStringEmpty(); String *interface_upcasts = NewStringEmpty(); SwigType *typemap_lookup_type = Getattr(n, "classtypeobj"); bool feature_director = Swig_directorclass(n) ? true : false; bool has_outerclass = Getattr(n, "nested:outer") != 0 && !GetFlag(n, "feature:flatnested"); SwigType *smart = Swig_cparse_smartptr(n); // Inheritance from pure C# classes Node *attributes = NewHash(); const String *pure_baseclass = typemapLookup(n, "csbase", typemap_lookup_type, WARN_NONE, attributes); bool purebase_replace = GetFlag(attributes, "tmap:csbase:replace") ? true : false; bool purebase_notderived = GetFlag(attributes, "tmap:csbase:notderived") ? true : false; Delete(attributes); // C++ inheritance if (!purebase_replace) { List *baselist = Getattr(n, "bases"); if (baselist) { Iterator base = First(baselist); while (base.item) { if (!(GetFlag(base.item, "feature:ignore") || Getattr(base.item, "feature:interface"))) { String *baseclassname = Getattr(base.item, "name"); if (!c_baseclassname) { c_baseclassname = baseclassname; baseclass = Copy(getProxyName(baseclassname)); if (baseclass) c_baseclass = SwigType_namestr(baseclassname); } else { /* Warn about multiple inheritance for additional base class(es) */ String *proxyclassname = Getattr(n, "classtypeobj"); Swig_warning(WARN_CSHARP_MULTIPLE_INHERITANCE, Getfile(n), Getline(n), "Warning for %s, base %s ignored. Multiple inheritance is not supported in C#.\n", SwigType_namestr(proxyclassname), SwigType_namestr(baseclassname)); } } base = Next(base); } } } Hash *interface_bases = Getattr(n, "interface:bases"); if (interface_bases) addInterfaceNameAndUpcasts(smart, interface_list, interface_upcasts, interface_bases, c_classname); bool derived = baseclass && getProxyName(c_baseclassname); if (derived && purebase_notderived) pure_baseclass = empty_string; const String *wanted_base = baseclass ? baseclass : pure_baseclass; if (purebase_replace) { wanted_base = pure_baseclass; derived = false; Delete(baseclass); baseclass = NULL; if (purebase_notderived) Swig_error(Getfile(n), Getline(n), "The csbase typemap for proxy %s must contain just one of the 'replace' or 'notderived' attributes.\n", typemap_lookup_type); } else if (Len(pure_baseclass) > 0 && Len(baseclass) > 0) { Swig_warning(WARN_CSHARP_MULTIPLE_INHERITANCE, Getfile(n), Getline(n), "Warning for %s, base %s ignored. Multiple inheritance is not supported in C#. " "Perhaps you need one of the 'replace' or 'notderived' attributes in the csbase typemap?\n", typemap_lookup_type, pure_baseclass); } // Pure C# interfaces const String *pure_interfaces = typemapLookup(n, derived ? "csinterfaces_derived" : "csinterfaces", typemap_lookup_type, WARN_NONE); if (*Char(interface_list) && *Char(pure_interfaces)) Append(interface_list, ", "); Append(interface_list, pure_interfaces); // Start writing the proxy class if (!has_outerclass) Printv(proxy_class_def, typemapLookup(n, "csimports", typemap_lookup_type, WARN_NONE), // Import statements "\n", NIL); // Class attributes const String *csattributes = typemapLookup(n, "csattributes", typemap_lookup_type, WARN_NONE); if (csattributes && *Char(csattributes)) Printf(proxy_class_def, "%s\n", csattributes); Printv(proxy_class_def, typemapLookup(n, "csclassmodifiers", typemap_lookup_type, WARN_CSHARP_TYPEMAP_CLASSMOD_UNDEF), // Class modifiers " $csclassname", // Class name and base class (*Char(wanted_base) || *Char(interface_list)) ? " : " : "", wanted_base, (*Char(wanted_base) && *Char(interface_list)) ? // Interfaces ", " : "", interface_list, " {", derived ? typemapLookup(n, "csbody_derived", typemap_lookup_type, WARN_CSHARP_TYPEMAP_CSBODY_UNDEF) : // main body of class typemapLookup(n, "csbody", typemap_lookup_type, WARN_CSHARP_TYPEMAP_CSBODY_UNDEF), // main body of class NIL); // C++ destructor is wrapped by the Finalize and Dispose methods const char *tmap_method = derived ? "csdestruct_derived" : "csdestruct"; const String *tm = typemapExists(n, tmap_method, typemap_lookup_type); if (tm) { Swig_error(Getfile(tm), Getline(tm), "A deprecated %s typemap was found for %s, please remove it and replace all csdestruct, csdestruct_derived and csfinalize typemaps by the csdispose, csdispose_derived, csdisposing and csdisposing_derived typemaps.\n", tmap_method, proxy_class_name); } tmap_method = "csfinalize"; tm = typemapExists(n, tmap_method, typemap_lookup_type); if (tm) { Swig_error(Getfile(tm), Getline(tm), "A deprecated %s typemap was found for %s, please remove it and replace all csdestruct, csdestruct_derived and csfinalize typemaps by the csdispose, csdispose_derived, csdisposing and csdisposing_derived typemaps.\n", tmap_method, proxy_class_name); } tmap_method = derived ? "csdisposing_derived" : "csdisposing"; String *destruct = NewString(""); attributes = NewHash(); const String *destruct_methodname = NULL; const String *destruct_methodmodifiers = NULL; const String *destruct_parameters = NULL; if (derived) { tm = typemapLookup(n, "csdisposing_derived", typemap_lookup_type, WARN_NONE, attributes); destruct_methodname = Getattr(attributes, "tmap:csdisposing_derived:methodname"); destruct_methodmodifiers = Getattr(attributes, "tmap:csdisposing_derived:methodmodifiers"); destruct_parameters = Getattr(attributes, "tmap:csdisposing_derived:parameters"); } else { tm = typemapLookup(n, "csdisposing", typemap_lookup_type, WARN_NONE, attributes); destruct_methodname = Getattr(attributes, "tmap:csdisposing:methodname"); destruct_methodmodifiers = Getattr(attributes, "tmap:csdisposing:methodmodifiers"); destruct_parameters = Getattr(attributes, "tmap:csdisposing:parameters"); } if (tm && *Char(tm)) { if (!destruct_methodname) { Swig_error(Getfile(n), Getline(n), "No methodname attribute defined in %s typemap for %s\n", tmap_method, proxy_class_name); } if (!destruct_methodmodifiers) { Swig_error(Getfile(n), Getline(n), "No methodmodifiers attribute defined in %s typemap for %s.\n", tmap_method, proxy_class_name); } if (!destruct_parameters) destruct_parameters = empty_string; } // Emit the Finalize and Dispose methods if (tm) { // Finalize and Dispose methods Printv(proxy_class_def, typemapLookup(n, derived ? "csdispose_derived" : "csdispose", typemap_lookup_type, WARN_NONE), NIL); // Dispose(bool disposing) method Printv(destruct, tm, NIL); if (*Char(destructor_call)) Replaceall(destruct, "$imcall", destructor_call); else Replaceall(destruct, "$imcall", "throw new global::System.MethodAccessException(\"C++ destructor does not have public access\")"); if (*Char(destruct)) { Printv(proxy_class_def, "\n ", NIL); const String *methodmods = Getattr(n, "destructmethodmodifiers"); if (methodmods) Printv(proxy_class_def, methodmods, NIL); else Printv(proxy_class_def, destruct_methodmodifiers, " ", derived ? "override" : "virtual", NIL); Printv(proxy_class_def, " void ", destruct_methodname, "(", destruct_parameters, ") ", destruct, "\n", NIL); } } if (*Char(interface_upcasts)) Printv(proxy_class_def, interface_upcasts, NIL); if (feature_director) { // Generate director connect method // put this in classDirectorEnd ??? Printf(proxy_class_code, " private void SwigDirectorConnect() {\n"); int i; for (i = first_class_dmethod; i < curr_class_dmethod; ++i) { UpcallData *udata = Getitem(dmethods_seq, i); String *method = Getattr(udata, "method"); String *methid = Getattr(udata, "class_methodidx"); String *overname = Getattr(udata, "overname"); Printf(proxy_class_code, " if (SwigDerivedClassHasMethod(\"%s\", swigMethodTypes%s))\n", method, methid); Printf(proxy_class_code, " swigDelegate%s = new SwigDelegate%s_%s(SwigDirectorMethod%s);\n", methid, proxy_class_name, methid, overname); } String *director_connect_method_name = Swig_name_member(getNSpace(), getClassPrefix(), "director_connect"); Printf(proxy_class_code, " %s.%s(swigCPtr", imclass_name, director_connect_method_name); for (i = first_class_dmethod; i < curr_class_dmethod; ++i) { UpcallData *udata = Getitem(dmethods_seq, i); String *methid = Getattr(udata, "class_methodidx"); Printf(proxy_class_code, ", swigDelegate%s", methid); } Printf(proxy_class_code, ");\n"); Printf(proxy_class_code, " }\n"); if (first_class_dmethod < curr_class_dmethod) { // Only emit if there is at least one director method Printf(proxy_class_code, "\n"); Printf(proxy_class_code, " private bool SwigDerivedClassHasMethod(string methodName, global::System.Type[] methodTypes) {\n"); Printf(proxy_class_code, " global::System.Reflection.MethodInfo methodInfo = this.GetType().GetMethod(methodName, global::System.Reflection.BindingFlags.Public | global::System.Reflection.BindingFlags.NonPublic | global::System.Reflection.BindingFlags.Instance, null, methodTypes, null);\n"); Printf(proxy_class_code, " bool hasDerivedMethod = methodInfo.DeclaringType.IsSubclassOf(typeof(%s));\n", proxy_class_name); /* Could add this code to cover corner case where the GetMethod() returns a method which allows type * promotion, eg it will return foo(double), if looking for foo(int). if (hasDerivedMethod) { hasDerivedMethod = false; if (methodInfo != null) { hasDerivedMethod = true; ParameterInfo[] parameterArray1 = methodInfo.GetParameters(); for (int i=0; i 0) Printv(proxy_class_code, director_delegate_callback, NIL); if (Len(director_delegate_definitions) > 0) Printv(proxy_class_code, "\n", director_delegate_definitions, NIL); if (Len(director_delegate_instances) > 0) Printv(proxy_class_code, "\n", director_delegate_instances, NIL); if (Len(director_method_types) > 0) Printv(proxy_class_code, "\n", director_method_types, NIL); Delete(director_callback_typedefs); director_callback_typedefs = NULL; Delete(director_callbacks); director_callbacks = NULL; Delete(director_delegate_callback); director_delegate_callback = NULL; Delete(director_delegate_definitions); director_delegate_definitions = NULL; Delete(director_delegate_instances); director_delegate_instances = NULL; Delete(director_method_types); director_method_types = NULL; Delete(director_connect_parms); director_connect_parms = NULL; Delete(director_connect_method_name); } Delete(interface_upcasts); Delete(interface_list); Delete(attributes); Delete(destruct); // Emit extra user code Printv(proxy_class_def, typemapLookup(n, "cscode", typemap_lookup_type, WARN_NONE), // extra C# code "\n", NIL); if (derived) { String *upcast_method_name = Swig_name_member(getNSpace(), getClassPrefix(), smart != 0 ? "SWIGSmartPtrUpcast" : "SWIGUpcast"); upcastsCode(smart, upcast_method_name, c_classname, c_baseclass); Delete(upcast_method_name); } Delete(smart); Delete(baseclass); } /* ---------------------------------------------------------------------- * emitInterfaceDeclaration() * ---------------------------------------------------------------------- */ void emitInterfaceDeclaration(Node *n, String *interface_name, File *f_interface) { Printv(f_interface, typemapLookup(n, "csimports", Getattr(n, "classtypeobj"), WARN_NONE), "\n", NIL); Printf(f_interface, "public interface %s", interface_name); if (List *baselist = Getattr(n, "bases")) { String *bases = 0; for (Iterator base = First(baselist); base.item; base = Next(base)) { if (GetFlag(base.item, "feature:ignore") || !Getattr(base.item, "feature:interface")) continue; // TODO: warn about skipped non-interface bases String *base_iname = Getattr(base.item, "interface:name"); if (!bases) bases = NewStringf(" : %s", base_iname); else { Append(bases, ", "); Append(bases, base_iname); } } if (bases) { Printv(f_interface, bases, NIL); Delete(bases); } } Printf(f_interface, " {\n"); Node *attributes = NewHash(); String *interface_code = Copy(typemapLookup(n, "csinterfacecode", Getattr(n, "classtypeobj"), WARN_CSHARP_TYPEMAP_INTERFACECODE_UNDEF, attributes)); if (interface_code) { String *interface_declaration = Copy(Getattr(attributes, "tmap:csinterfacecode:declaration")); if (interface_declaration) { Replaceall(interface_declaration, "$interfacename", interface_name); Printv(f_interface, interface_declaration, NIL); Delete(interface_declaration); } Delete(interface_code); } } /* ---------------------------------------------------------------------- * classHandler() * ---------------------------------------------------------------------- */ virtual int classHandler(Node *n) { String *nspace = getNSpace(); File *f_proxy = NULL; File *f_interface = NULL; // save class local variables String *old_proxy_class_name = proxy_class_name; String *old_full_imclass_name = full_imclass_name; String *old_destructor_call = destructor_call; String *old_proxy_class_constants_code = proxy_class_constants_code; String *old_proxy_class_def = proxy_class_def; String *old_proxy_class_code = proxy_class_code; bool has_outerclass = Getattr(n, "nested:outer") && !GetFlag(n, "feature:flatnested"); String *old_interface_class_code = interface_class_code; interface_class_code = 0; if (proxy_flag) { proxy_class_name = NewString(Getattr(n, "sym:name")); String *interface_name = Getattr(n, "feature:interface") ? Getattr(n, "interface:name") : 0; if (Node *outer = Getattr(n, "nested:outer")) { String *outerClassesPrefix = Copy(Getattr(outer, "sym:name")); for (outer = Getattr(outer, "nested:outer"); outer != 0; outer = Getattr(outer, "nested:outer")) { Push(outerClassesPrefix, "."); Push(outerClassesPrefix, Getattr(outer, "sym:name")); } String *fnspace = nspace ? NewStringf("%s.%s", nspace, outerClassesPrefix) : outerClassesPrefix; if (!addSymbol(proxy_class_name, n, fnspace)) return SWIG_ERROR; if (interface_name && !addInterfaceSymbol(interface_name, n, fnspace)) return SWIG_ERROR; if (nspace) Delete(fnspace); Delete(outerClassesPrefix); } else { if (!addSymbol(proxy_class_name, n, nspace)) return SWIG_ERROR; if (interface_name && !addInterfaceSymbol(interface_name, n, nspace)) return SWIG_ERROR; } if (!nspace) { full_imclass_name = NewStringf("%s", imclass_name); if (Cmp(proxy_class_name, imclass_name) == 0) { Printf(stderr, "Class name cannot be equal to intermediary class name: %s\n", proxy_class_name); SWIG_exit(EXIT_FAILURE); } if (Cmp(proxy_class_name, module_class_name) == 0) { Printf(stderr, "Class name cannot be equal to module class name: %s\n", proxy_class_name); SWIG_exit(EXIT_FAILURE); } } else { if (namespce) { full_imclass_name = NewStringf("%s.%s", namespce, imclass_name); } else { full_imclass_name = NewStringf("%s", imclass_name); } } if (!has_outerclass) { String *output_directory = outputDirectory(nspace); f_proxy = getOutputFile(output_directory, proxy_class_name); addOpenNamespace(nspace, f_proxy); Delete(output_directory); } else ++nesting_depth; proxy_class_def = NewString(""); proxy_class_code = NewString(""); destructor_call = NewString(""); proxy_class_constants_code = NewString(""); if (Getattr(n, "feature:interface")) { interface_class_code = NewString(""); String *output_directory = outputDirectory(nspace); f_interface = getOutputFile(output_directory, interface_name); addOpenNamespace(nspace, f_interface); emitInterfaceDeclaration(n, interface_name, interface_class_code); Delete(output_directory); } } Language::classHandler(n); if (proxy_flag) { emitProxyClassDefAndCPPCasts(n); String *csclazzname = Swig_name_member(getNSpace(), getClassPrefix(), ""); // mangled full proxy class name Replaceall(proxy_class_def, "$csclassname", proxy_class_name); Replaceall(proxy_class_code, "$csclassname", proxy_class_name); Replaceall(proxy_class_constants_code, "$csclassname", proxy_class_name); Replaceall(interface_class_code, "$csclassname", proxy_class_name); Replaceall(proxy_class_def, "$csclazzname", csclazzname); Replaceall(proxy_class_code, "$csclazzname", csclazzname); Replaceall(proxy_class_constants_code, "$csclazzname", csclazzname); Replaceall(interface_class_code, "$csclazzname", csclazzname); Replaceall(proxy_class_def, "$module", module_class_name); Replaceall(proxy_class_code, "$module", module_class_name); Replaceall(proxy_class_constants_code, "$module", module_class_name); Replaceall(interface_class_code, "$module", module_class_name); Replaceall(proxy_class_def, "$imclassname", full_imclass_name); Replaceall(proxy_class_code, "$imclassname", full_imclass_name); Replaceall(proxy_class_constants_code, "$imclassname", full_imclass_name); Replaceall(interface_class_code, "$imclassname", full_imclass_name); Replaceall(proxy_class_def, "$dllimport", dllimport); Replaceall(proxy_class_code, "$dllimport", dllimport); Replaceall(proxy_class_constants_code, "$dllimport", dllimport); Replaceall(interface_class_code, "$dllimport", dllimport); if (!has_outerclass) Printv(f_proxy, proxy_class_def, proxy_class_code, NIL); else { Swig_offset_string(proxy_class_def, nesting_depth); Append(old_proxy_class_code, proxy_class_def); Swig_offset_string(proxy_class_code, nesting_depth); Append(old_proxy_class_code, proxy_class_code); } // Write out all the constants if (Len(proxy_class_constants_code) != 0) { if (!has_outerclass) Printv(f_proxy, proxy_class_constants_code, NIL); else { Swig_offset_string(proxy_class_constants_code, nesting_depth); Append(old_proxy_class_code, proxy_class_constants_code); } } if (!has_outerclass) { Printf(f_proxy, "}\n"); addCloseNamespace(nspace, f_proxy); if (f_proxy != f_single_out) Delete(f_proxy); f_proxy = NULL; } else { for (int i = 0; i < nesting_depth; ++i) Append(old_proxy_class_code, " "); Append(old_proxy_class_code, "}\n\n"); --nesting_depth; } if (f_interface) { Printv(f_interface, interface_class_code, "}\n", NIL); addCloseNamespace(nspace, f_interface); if (f_interface != f_single_out) Delete(f_interface); f_interface = 0; } emitDirectorExtraMethods(n); Delete(interface_class_code); interface_class_code = old_interface_class_code; Delete(csclazzname); Delete(proxy_class_name); proxy_class_name = old_proxy_class_name; Delete(full_imclass_name); full_imclass_name = old_full_imclass_name; Delete(destructor_call); destructor_call = old_destructor_call; Delete(proxy_class_constants_code); proxy_class_constants_code = old_proxy_class_constants_code; Delete(proxy_class_def); proxy_class_def = old_proxy_class_def; Delete(proxy_class_code); proxy_class_code = old_proxy_class_code; } return SWIG_OK; } /* ---------------------------------------------------------------------- * memberfunctionHandler() * ---------------------------------------------------------------------- */ virtual int memberfunctionHandler(Node *n) { Language::memberfunctionHandler(n); if (proxy_flag) { String *overloaded_name = getOverloadedName(n); String *intermediary_function_name = Swig_name_member(getNSpace(), getClassPrefix(), overloaded_name); Setattr(n, "proxyfuncname", Getattr(n, "sym:name")); Setattr(n, "imfuncname", intermediary_function_name); proxyClassFunctionHandler(n); Delete(overloaded_name); } return SWIG_OK; } /* ---------------------------------------------------------------------- * staticmemberfunctionHandler() * ---------------------------------------------------------------------- */ virtual int staticmemberfunctionHandler(Node *n) { static_flag = true; Language::staticmemberfunctionHandler(n); if (proxy_flag) { String *overloaded_name = getOverloadedName(n); String *intermediary_function_name = Swig_name_member(getNSpace(), getClassPrefix(), overloaded_name); Setattr(n, "proxyfuncname", Getattr(n, "sym:name")); Setattr(n, "imfuncname", intermediary_function_name); proxyClassFunctionHandler(n); Delete(overloaded_name); } static_flag = false; return SWIG_OK; } /* ----------------------------------------------------------------------------- * proxyClassFunctionHandler() * * Function called for creating a C# wrapper function around a c++ function in the * proxy class. Used for both static and non-static C++ class functions. * C++ class static functions map to C# static functions. * Two extra attributes in the Node must be available. These are "proxyfuncname" - * the name of the C# class proxy function, which in turn will call "imfuncname" - * the intermediary (PInvoke) function name in the intermediary class. * ----------------------------------------------------------------------------- */ void proxyClassFunctionHandler(Node *n) { SwigType *t = Getattr(n, "type"); ParmList *l = Getattr(n, "parms"); String *intermediary_function_name = Getattr(n, "imfuncname"); String *proxy_function_name = Getattr(n, "proxyfuncname"); String *tm; Parm *p; Parm *last_parm = 0; int i; String *imcall = NewString(""); String *return_type = NewString(""); String *function_code = NewString(""); bool setter_flag = false; String *pre_code = NewString(""); String *post_code = NewString(""); String *terminator_code = NewString(""); bool is_interface = Getattr(parentNode(n), "feature:interface") != 0 && !static_flag && Getattr(n, "interface:owner") == 0; if (!proxy_flag) return; // Wrappers not wanted for some methods where the parameters cannot be overloaded in C# if (Getattr(n, "overload:ignore")) return; // Don't generate proxy method for additional explicitcall method used in directors if (GetFlag(n, "explicitcall")) return; if (l) { if (SwigType_type(Getattr(l, "type")) == T_VOID) { l = nextSibling(l); } } /* Attach the non-standard typemaps to the parameter list */ Swig_typemap_attach_parms("in", l, NULL); Swig_typemap_attach_parms("cstype", l, NULL); Swig_typemap_attach_parms("csin", l, NULL); /* Get return types */ if ((tm = Swig_typemap_lookup("cstype", n, "", 0))) { // Note that in the case of polymorphic (covariant) return types, the method's return type is changed to be the base of the C++ return type SwigType *covariant = Getattr(n, "covariant"); String *cstypeout = Getattr(n, "tmap:cstype:out"); // the type in the cstype typemap's out attribute overrides the type in the typemap if (cstypeout) tm = cstypeout; substituteClassname(covariant ? covariant : t, tm); Printf(return_type, "%s", tm); if (covariant) Swig_warning(WARN_CSHARP_COVARIANT_RET, input_file, line_number, "Covariant return types not supported in C#. Proxy method will return %s.\n", SwigType_str(covariant, 0)); } else { Swig_warning(WARN_CSHARP_TYPEMAP_CSWTYPE_UNDEF, input_file, line_number, "No cstype typemap defined for %s\n", SwigType_str(t, 0)); } if (wrapping_member_flag && !enum_constant_flag) { // Properties setter_flag = (Cmp(Getattr(n, "sym:name"), Swig_name_set(getNSpace(), Swig_name_member(0, getClassPrefix(), variable_name))) == 0); if (setter_flag) Swig_typemap_attach_parms("csvarin", l, NULL); } /* Start generating the proxy function */ const String *outattributes = Getattr(n, "tmap:cstype:outattributes"); if (outattributes) Printf(function_code, " %s\n", outattributes); const String *csattributes = Getattr(n, "feature:cs:attributes"); if (csattributes) Printf(function_code, " %s\n", csattributes); const String *methodmods = Getattr(n, "feature:cs:methodmodifiers"); if (methodmods) { if (is_smart_pointer()) { // Smart pointer classes do not mirror the inheritance hierarchy of the underlying pointer type, so no virtual/override/new required. String *mmods = Copy(methodmods); Replaceall(mmods, "override", ""); Replaceall(mmods, "virtual", ""); Replaceall(mmods, "new", ""); Chop(mmods); // remove trailing whitespace Printf(function_code, " %s ", mmods); Delete(mmods); } else { Printf(function_code, " %s ", methodmods); } } else { methodmods = (is_public(n) ? public_string : protected_string); Printf(function_code, " %s ", methodmods); if (!is_smart_pointer()) { // Smart pointer classes do not mirror the inheritance hierarchy of the underlying pointer type, so no virtual/override/new required. if (Getattr(n, "override")) Printf(function_code, "override "); else if (checkAttribute(n, "storage", "virtual")) Printf(function_code, "virtual "); if (Getattr(n, "hides")) Printf(function_code, "new "); } } if (static_flag) Printf(function_code, "static "); Printf(function_code, "%s %s(", return_type, proxy_function_name); if (is_interface) Printf(interface_class_code, " %s %s(", return_type, proxy_function_name); Printv(imcall, full_imclass_name, ".$imfuncname(", NIL); if (!static_flag) Printf(imcall, "swigCPtr"); emit_mark_varargs(l); int gencomma = !static_flag; /* Output each parameter */ for (i = 0, p = l; p; i++) { /* Ignored varargs */ if (checkAttribute(p, "varargs:ignore", "1")) { p = nextSibling(p); continue; } /* Ignored parameters */ if (checkAttribute(p, "tmap:in:numinputs", "0")) { p = Getattr(p, "tmap:in:next"); continue; } /* Ignore the 'this' argument for variable wrappers */ if (!(variable_wrapper_flag && i == 0)) { SwigType *pt = Getattr(p, "type"); String *param_type = NewString(""); if (setter_flag) last_parm = p; /* Get the C# parameter type */ if ((tm = Getattr(p, "tmap:cstype"))) { substituteClassname(pt, tm); const String *inattributes = Getattr(p, "tmap:cstype:inattributes"); Printf(param_type, "%s%s", inattributes ? inattributes : empty_string, tm); } else { Swig_warning(WARN_CSHARP_TYPEMAP_CSWTYPE_UNDEF, input_file, line_number, "No cstype typemap defined for %s\n", SwigType_str(pt, 0)); } if (gencomma) Printf(imcall, ", "); String *arg = makeParameterName(n, p, i, setter_flag); // Use typemaps to transform type used in C# wrapper function (in proxy class) to type used in PInvoke function (in intermediary class) if ((tm = Getattr(p, "tmap:csin"))) { substituteClassname(pt, tm); Replaceall(tm, "$csinput", arg); String *pre = Getattr(p, "tmap:csin:pre"); if (pre) { substituteClassname(pt, pre); Replaceall(pre, "$csinput", arg); if (Len(pre_code) > 0) Printf(pre_code, "\n"); Printv(pre_code, pre, NIL); } String *post = Getattr(p, "tmap:csin:post"); if (post) { substituteClassname(pt, post); Replaceall(post, "$csinput", arg); if (Len(post_code) > 0) Printf(post_code, "\n"); Printv(post_code, post, NIL); } String *terminator = Getattr(p, "tmap:csin:terminator"); if (terminator) { substituteClassname(pt, terminator); Replaceall(terminator, "$csinput", arg); if (Len(terminator_code) > 0) Insert(terminator_code, 0, "\n"); Insert(terminator_code, 0, terminator); } Printv(imcall, tm, NIL); } else { Swig_warning(WARN_CSHARP_TYPEMAP_CSIN_UNDEF, input_file, line_number, "No csin typemap defined for %s\n", SwigType_str(pt, 0)); } /* Add parameter to proxy function */ if (gencomma >= 2) { Printf(function_code, ", "); if (is_interface) Printf(interface_class_code, ", "); } gencomma = 2; Printf(function_code, "%s %s", param_type, arg); if (is_interface) Printf(interface_class_code, "%s %s", param_type, arg); Delete(arg); Delete(param_type); } p = Getattr(p, "tmap:in:next"); } Printf(imcall, ")"); Printf(function_code, ")"); if (is_interface) Printf(interface_class_code, ");\n"); // Transform return type used in PInvoke function (in intermediary class) to type used in C# wrapper function (in proxy class) if ((tm = Swig_typemap_lookup("csout", n, "", 0))) { excodeSubstitute(n, tm, "csout", n); bool is_pre_code = Len(pre_code) > 0; bool is_post_code = Len(post_code) > 0; bool is_terminator_code = Len(terminator_code) > 0; if (is_pre_code || is_post_code || is_terminator_code) { Replaceall(tm, "\n ", "\n "); // add extra indentation to code in typemap if (is_post_code) { Insert(tm, 0, "\n try "); Printv(tm, " finally {\n", post_code, "\n }", NIL); } else { Insert(tm, 0, "\n "); } if (is_pre_code) { Insert(tm, 0, pre_code); Insert(tm, 0, "\n"); } if (is_terminator_code) { Printv(tm, "\n", terminator_code, NIL); } Insert(tm, 0, "{"); Printf(tm, "\n }"); } if (GetFlag(n, "feature:new")) Replaceall(tm, "$owner", "true"); else Replaceall(tm, "$owner", "false"); substituteClassname(t, tm); // For director methods: generate code to selectively make a normal polymorphic call or // an explicit method call - needed to prevent infinite recursion calls in director methods. Node *explicit_n = Getattr(n, "explicitcallnode"); if (explicit_n) { String *ex_overloaded_name = getOverloadedName(explicit_n); String *ex_intermediary_function_name = Swig_name_member(getNSpace(), getClassPrefix(), ex_overloaded_name); String *ex_imcall = Copy(imcall); Replaceall(ex_imcall, "$imfuncname", ex_intermediary_function_name); Replaceall(imcall, "$imfuncname", intermediary_function_name); String *excode = NewString(""); Node *directorNode = Getattr(n, "directorNode"); if (directorNode) { UpcallData *udata = Getattr(directorNode, "upcalldata"); String *methid = Getattr(udata, "class_methodidx"); if (!Cmp(return_type, "void")) Printf(excode, "if (SwigDerivedClassHasMethod(\"%s\", swigMethodTypes%s)) %s; else %s", proxy_function_name, methid, ex_imcall, imcall); else Printf(excode, "(SwigDerivedClassHasMethod(\"%s\", swigMethodTypes%s) ? %s : %s)", proxy_function_name, methid, ex_imcall, imcall); Clear(imcall); Printv(imcall, excode, NIL); } else { // probably an ignored method or nodirector } Delete(excode); Delete(ex_overloaded_name); } else { Replaceall(imcall, "$imfuncname", intermediary_function_name); } Replaceall(tm, "$imcall", imcall); } else { Swig_warning(WARN_CSHARP_TYPEMAP_CSOUT_UNDEF, input_file, line_number, "No csout typemap defined for %s\n", SwigType_str(t, 0)); } if (wrapping_member_flag && !enum_constant_flag) { // Properties if (generate_property_declaration_flag) { // Ensure the declaration is generated just once should the property contain both a set and get // Get the C# variable type - obtained differently depending on whether a setter is required. String *variable_type = return_type; if (setter_flag) { assert(last_parm); // (last parameter is the only parameter for properties) /* Get variable type - ensure the variable name is fully resolved during typemap lookup via the symbol table set in NewParmNode */ SwigType *cvariable_type = Getattr(last_parm, "type"); Parm *variable_parm = NewParmNode(cvariable_type, n); if ((tm = Swig_typemap_lookup("cstype", variable_parm, "", 0))) { String *cstypeout = Getattr(variable_parm, "tmap:cstype:out"); // the type in the cstype typemap's out attribute overrides the type in the typemap if (cstypeout) tm = cstypeout; substituteClassname(cvariable_type, tm); variable_type = tm; } else { Swig_warning(WARN_CSHARP_TYPEMAP_CSOUT_UNDEF, input_file, line_number, "No cstype typemap defined for %s\n", SwigType_str(cvariable_type, 0)); } } const String *csattributes = Getattr(n, "feature:cs:attributes"); if (csattributes) Printf(proxy_class_code, " %s\n", csattributes); const String *methodmods = Getattr(n, "feature:cs:methodmodifiers"); if (!methodmods) methodmods = (is_public(n) ? public_string : protected_string); Printf(proxy_class_code, " %s %s%s %s {", methodmods, static_flag ? "static " : "", variable_type, variable_name); } generate_property_declaration_flag = false; if (setter_flag) { // Setter method assert(last_parm); // (last parameter is the only parameter for properties) SwigType *cvariable_type = Getattr(last_parm, "type"); Parm *variable_parm = NewParmNode(cvariable_type, n); if ((tm = Swig_typemap_lookup("csvarin", variable_parm, "", 0))) { substituteClassname(cvariable_type, tm); Replaceall(tm, "$csinput", "value"); Replaceall(tm, "$imcall", imcall); excodeSubstitute(n, tm, "csvarin", variable_parm); Printf(proxy_class_code, "%s", tm); } else { Swig_warning(WARN_CSHARP_TYPEMAP_CSOUT_UNDEF, input_file, line_number, "No csvarin typemap defined for %s\n", SwigType_str(cvariable_type, 0)); } } else { // Getter method if ((tm = Swig_typemap_lookup("csvarout", n, "", 0))) { if (GetFlag(n, "feature:new")) Replaceall(tm, "$owner", "true"); else Replaceall(tm, "$owner", "false"); substituteClassname(t, tm); Replaceall(tm, "$imcall", imcall); excodeSubstitute(n, tm, "csvarout", n); Printf(proxy_class_code, "%s", tm); } else { Swig_warning(WARN_CSHARP_TYPEMAP_CSOUT_UNDEF, input_file, line_number, "No csvarout typemap defined for %s\n", SwigType_str(t, 0)); } } } else { // Normal function call Printf(function_code, " %s\n\n", tm ? (const String *) tm : empty_string); Printv(proxy_class_code, function_code, NIL); } Delete(pre_code); Delete(post_code); Delete(terminator_code); Delete(function_code); Delete(return_type); Delete(imcall); } /* ---------------------------------------------------------------------- * constructorHandler() * ---------------------------------------------------------------------- */ virtual int constructorHandler(Node *n) { ParmList *l = Getattr(n, "parms"); String *tm; Parm *p; int i; String *function_code = NewString(""); String *helper_code = NewString(""); // Holds code for the constructor helper method generated only when the csin typemap has code in the pre or post attributes String *helper_args = NewString(""); String *pre_code = NewString(""); String *post_code = NewString(""); String *terminator_code = NewString(""); String *im_return_type = NewString(""); bool feature_director = (parentNode(n) && Swig_directorclass(n)); Language::constructorHandler(n); // Wrappers not wanted for some methods where the parameters cannot be overloaded in C# if (Getattr(n, "overload:ignore")) return SWIG_OK; if (proxy_flag) { String *overloaded_name = getOverloadedName(n); String *mangled_overname = Swig_name_construct(getNSpace(), overloaded_name); String *imcall = NewString(""); const String *csattributes = Getattr(n, "feature:cs:attributes"); if (csattributes) { Printf(function_code, " %s\n", csattributes); Printf(helper_code, " %s\n", csattributes); } const String *methodmods = Getattr(n, "feature:cs:methodmodifiers"); methodmods = methodmods ? methodmods : (is_public(n) ? public_string : protected_string); tm = Getattr(n, "tmap:imtype"); // typemaps were attached earlier to the node String *imtypeout = Getattr(n, "tmap:imtype:out"); // the type in the imtype typemap's out attribute overrides the type in the typemap if (imtypeout) tm = imtypeout; Printf(im_return_type, "%s", tm); Printf(function_code, " %s %s(", methodmods, proxy_class_name); Printf(helper_code, " static private %s SwigConstruct%s(", im_return_type, proxy_class_name); Printv(imcall, full_imclass_name, ".", mangled_overname, "(", NIL); /* Attach the non-standard typemaps to the parameter list */ Swig_typemap_attach_parms("in", l, NULL); Swig_typemap_attach_parms("cstype", l, NULL); Swig_typemap_attach_parms("csin", l, NULL); emit_mark_varargs(l); int gencomma = 0; /* Output each parameter */ for (i = 0, p = l; p; i++) { /* Ignored varargs */ if (checkAttribute(p, "varargs:ignore", "1")) { p = nextSibling(p); continue; } /* Ignored parameters */ if (checkAttribute(p, "tmap:in:numinputs", "0")) { p = Getattr(p, "tmap:in:next"); continue; } SwigType *pt = Getattr(p, "type"); String *param_type = NewString(""); /* Get the C# parameter type */ if ((tm = Getattr(p, "tmap:cstype"))) { substituteClassname(pt, tm); const String *inattributes = Getattr(p, "tmap:cstype:inattributes"); Printf(param_type, "%s%s", inattributes ? inattributes : empty_string, tm); } else { Swig_warning(WARN_CSHARP_TYPEMAP_CSWTYPE_UNDEF, input_file, line_number, "No cstype typemap defined for %s\n", SwigType_str(pt, 0)); } if (gencomma) Printf(imcall, ", "); String *arg = makeParameterName(n, p, i, false); String *cshin = 0; // Use typemaps to transform type used in C# wrapper function (in proxy class) to type used in PInvoke function (in intermediary class) if ((tm = Getattr(p, "tmap:csin"))) { substituteClassname(pt, tm); Replaceall(tm, "$csinput", arg); String *pre = Getattr(p, "tmap:csin:pre"); if (pre) { substituteClassname(pt, pre); Replaceall(pre, "$csinput", arg); if (Len(pre_code) > 0) Printf(pre_code, "\n"); Printv(pre_code, pre, NIL); } String *post = Getattr(p, "tmap:csin:post"); if (post) { substituteClassname(pt, post); Replaceall(post, "$csinput", arg); if (Len(post_code) > 0) Printf(post_code, "\n"); Printv(post_code, post, NIL); } String *terminator = Getattr(p, "tmap:csin:terminator"); if (terminator) { substituteClassname(pt, terminator); Replaceall(terminator, "$csinput", arg); if (Len(terminator_code) > 0) Insert(terminator_code, 0, "\n"); Insert(terminator_code, 0, terminator); } cshin = Getattr(p, "tmap:csin:cshin"); if (cshin) Replaceall(cshin, "$csinput", arg); Printv(imcall, tm, NIL); } else { Swig_warning(WARN_CSHARP_TYPEMAP_CSIN_UNDEF, input_file, line_number, "No csin typemap defined for %s\n", SwigType_str(pt, 0)); } /* Add parameter to proxy function */ if (gencomma) { Printf(function_code, ", "); Printf(helper_code, ", "); Printf(helper_args, ", "); } Printf(function_code, "%s %s", param_type, arg); Printf(helper_code, "%s %s", param_type, arg); Printf(helper_args, "%s", cshin ? cshin : arg); ++gencomma; Delete(cshin); Delete(arg); Delete(param_type); p = Getattr(p, "tmap:in:next"); } Printf(imcall, ")"); Printf(function_code, ")"); Printf(helper_code, ")"); /* Insert the csconstruct typemap, doing the replacement for $directorconnect, as needed */ Hash *attributes = NewHash(); String *typemap_lookup_type = Getattr(getCurrentClass(), "classtypeobj"); String *construct_tm = Copy(typemapLookup(n, "csconstruct", typemap_lookup_type, WARN_CSHARP_TYPEMAP_CSCONSTRUCT_UNDEF, attributes)); if (construct_tm) { if (!feature_director) { Replaceall(construct_tm, "$directorconnect", ""); } else { String *connect_attr = Getattr(attributes, "tmap:csconstruct:directorconnect"); if (connect_attr) { Replaceall(construct_tm, "$directorconnect", connect_attr); } else { Swig_warning(WARN_CSHARP_NO_DIRECTORCONNECT_ATTR, input_file, line_number, "\"directorconnect\" attribute missing in %s \"csconstruct\" typemap.\n", Getattr(n, "name")); Replaceall(construct_tm, "$directorconnect", ""); } } Printv(function_code, " ", construct_tm, NIL); } excodeSubstitute(n, function_code, "csconstruct", attributes); bool is_pre_code = Len(pre_code) > 0; bool is_post_code = Len(post_code) > 0; bool is_terminator_code = Len(terminator_code) > 0; if (is_pre_code || is_post_code || is_terminator_code) { Printf(helper_code, " {\n"); if (is_pre_code) { Printv(helper_code, pre_code, "\n", NIL); } if (is_post_code) { Printf(helper_code, " try {\n"); Printv(helper_code, " return ", imcall, ";\n", NIL); Printv(helper_code, " } finally {\n", post_code, "\n }", NIL); } else { Printv(helper_code, " return ", imcall, ";", NIL); } if (is_terminator_code) { Printv(helper_code, "\n", terminator_code, NIL); } Printf(helper_code, "\n }\n"); String *helper_name = NewStringf("%s.SwigConstruct%s(%s)", proxy_class_name, proxy_class_name, helper_args); String *im_outattributes = Getattr(n, "tmap:imtype:outattributes"); if (im_outattributes) Printf(proxy_class_code, " %s\n", im_outattributes); Printv(proxy_class_code, helper_code, "\n", NIL); Replaceall(function_code, "$imcall", helper_name); Delete(helper_name); } else { Replaceall(function_code, "$imcall", imcall); } Printv(proxy_class_code, function_code, "\n", NIL); Delete(helper_args); Delete(im_return_type); Delete(pre_code); Delete(post_code); Delete(terminator_code); Delete(construct_tm); Delete(attributes); Delete(overloaded_name); Delete(imcall); } return SWIG_OK; } /* ---------------------------------------------------------------------- * destructorHandler() * ---------------------------------------------------------------------- */ virtual int destructorHandler(Node *n) { Language::destructorHandler(n); String *symname = Getattr(n, "sym:name"); if (proxy_flag) { Printv(destructor_call, full_imclass_name, ".", Swig_name_destroy(getNSpace(), symname), "(swigCPtr)", NIL); const String *methodmods = Getattr(n, "feature:cs:methodmodifiers"); if (methodmods) Setattr(getCurrentClass(), "destructmethodmodifiers", methodmods); } return SWIG_OK; } /* ---------------------------------------------------------------------- * membervariableHandler() * ---------------------------------------------------------------------- */ virtual int membervariableHandler(Node *n) { generate_property_declaration_flag = true; variable_name = Getattr(n, "sym:name"); wrapping_member_flag = true; variable_wrapper_flag = true; Language::membervariableHandler(n); wrapping_member_flag = false; variable_wrapper_flag = false; generate_property_declaration_flag = false; Printf(proxy_class_code, "\n }\n\n"); return SWIG_OK; } /* ---------------------------------------------------------------------- * staticmembervariableHandler() * ---------------------------------------------------------------------- */ virtual int staticmembervariableHandler(Node *n) { bool static_const_member_flag = (Getattr(n, "value") == 0); generate_property_declaration_flag = true; variable_name = Getattr(n, "sym:name"); wrapping_member_flag = true; static_flag = true; Language::staticmembervariableHandler(n); wrapping_member_flag = false; static_flag = false; generate_property_declaration_flag = false; if (static_const_member_flag) Printf(proxy_class_code, "\n }\n\n"); return SWIG_OK; } /* ---------------------------------------------------------------------- * memberconstantHandler() * ---------------------------------------------------------------------- */ virtual int memberconstantHandler(Node *n) { variable_name = Getattr(n, "sym:name"); wrapping_member_flag = true; Language::memberconstantHandler(n); wrapping_member_flag = false; return SWIG_OK; } /* ----------------------------------------------------------------------------- * getOverloadedName() * ----------------------------------------------------------------------------- */ String *getOverloadedName(Node *n) { /* A C# HandleRef is used for all classes in the SWIG intermediary class. * The intermediary class methods are thus mangled when overloaded to give * a unique name. */ String *overloaded_name = NewStringf("%s", Getattr(n, "sym:name")); if (Getattr(n, "sym:overloaded")) { Printv(overloaded_name, Getattr(n, "sym:overname"), NIL); } return overloaded_name; } /* ----------------------------------------------------------------------------- * moduleClassFunctionHandler() * ----------------------------------------------------------------------------- */ void moduleClassFunctionHandler(Node *n) { SwigType *t = Getattr(n, "type"); ParmList *l = Getattr(n, "parms"); String *tm; Parm *p; Parm *last_parm = 0; int i; String *imcall = NewString(""); String *return_type = NewString(""); String *function_code = NewString(""); int num_arguments = 0; String *overloaded_name = getOverloadedName(n); String *func_name = NULL; bool setter_flag = false; String *pre_code = NewString(""); String *post_code = NewString(""); String *terminator_code = NewString(""); if (l) { if (SwigType_type(Getattr(l, "type")) == T_VOID) { l = nextSibling(l); } } /* Attach the non-standard typemaps to the parameter list */ Swig_typemap_attach_parms("cstype", l, NULL); Swig_typemap_attach_parms("csin", l, NULL); /* Get return types */ if ((tm = Swig_typemap_lookup("cstype", n, "", 0))) { String *cstypeout = Getattr(n, "tmap:cstype:out"); // the type in the cstype typemap's out attribute overrides the type in the typemap if (cstypeout) tm = cstypeout; substituteClassname(t, tm); Printf(return_type, "%s", tm); } else { Swig_warning(WARN_CSHARP_TYPEMAP_CSWTYPE_UNDEF, input_file, line_number, "No cstype typemap defined for %s\n", SwigType_str(t, 0)); } /* Change function name for global variables */ if (proxy_flag && global_variable_flag) { // Capitalize the first letter in the variable to create the getter/setter function name func_name = NewString(""); setter_flag = (Cmp(Getattr(n, "sym:name"), Swig_name_set(getNSpace(), variable_name)) == 0); if (setter_flag) Printf(func_name, "set"); else Printf(func_name, "get"); Putc(toupper((int) *Char(variable_name)), func_name); Printf(func_name, "%s", Char(variable_name) + 1); if (setter_flag) Swig_typemap_attach_parms("csvarin", l, NULL); } else { func_name = Copy(Getattr(n, "sym:name")); } /* Start generating the function */ const String *outattributes = Getattr(n, "tmap:cstype:outattributes"); if (outattributes) Printf(function_code, " %s\n", outattributes); const String *csattributes = Getattr(n, "feature:cs:attributes"); if (csattributes) Printf(function_code, " %s\n", csattributes); const String *methodmods = Getattr(n, "feature:cs:methodmodifiers"); methodmods = methodmods ? methodmods : (is_public(n) ? public_string : protected_string); Printf(function_code, " %s static %s %s(", methodmods, return_type, func_name); Printv(imcall, imclass_name, ".", overloaded_name, "(", NIL); /* Get number of required and total arguments */ num_arguments = emit_num_arguments(l); bool global_or_member_variable = global_variable_flag || (wrapping_member_flag && !enum_constant_flag); int gencomma = 0; /* Output each parameter */ for (i = 0, p = l; i < num_arguments; i++) { /* Ignored parameters */ while (checkAttribute(p, "tmap:in:numinputs", "0")) { p = Getattr(p, "tmap:in:next"); } SwigType *pt = Getattr(p, "type"); String *param_type = NewString(""); last_parm = p; /* Get the C# parameter type */ if ((tm = Getattr(p, "tmap:cstype"))) { substituteClassname(pt, tm); const String *inattributes = Getattr(p, "tmap:cstype:inattributes"); Printf(param_type, "%s%s", inattributes ? inattributes : empty_string, tm); } else { Swig_warning(WARN_CSHARP_TYPEMAP_CSWTYPE_UNDEF, input_file, line_number, "No cstype typemap defined for %s\n", SwigType_str(pt, 0)); } if (gencomma) Printf(imcall, ", "); String *arg = makeParameterName(n, p, i, global_or_member_variable); // Use typemaps to transform type used in C# wrapper function (in proxy class) to type used in PInvoke function (in intermediary class) if ((tm = Getattr(p, "tmap:csin"))) { substituteClassname(pt, tm); Replaceall(tm, "$csinput", arg); String *pre = Getattr(p, "tmap:csin:pre"); if (pre) { substituteClassname(pt, pre); Replaceall(pre, "$csinput", arg); if (Len(pre_code) > 0) Printf(pre_code, "\n"); Printv(pre_code, pre, NIL); } String *post = Getattr(p, "tmap:csin:post"); if (post) { substituteClassname(pt, post); Replaceall(post, "$csinput", arg); if (Len(post_code) > 0) Printf(post_code, "\n"); Printv(post_code, post, NIL); } String *terminator = Getattr(p, "tmap:csin:terminator"); if (terminator) { substituteClassname(pt, terminator); Replaceall(terminator, "$csinput", arg); if (Len(terminator_code) > 0) Insert(terminator_code, 0, "\n"); Insert(terminator_code, 0, terminator); } Printv(imcall, tm, NIL); } else { Swig_warning(WARN_CSHARP_TYPEMAP_CSIN_UNDEF, input_file, line_number, "No csin typemap defined for %s\n", SwigType_str(pt, 0)); } /* Add parameter to module class function */ if (gencomma >= 2) Printf(function_code, ", "); gencomma = 2; Printf(function_code, "%s %s", param_type, arg); p = Getattr(p, "tmap:in:next"); Delete(arg); Delete(param_type); } Printf(imcall, ")"); Printf(function_code, ")"); // Transform return type used in PInvoke function (in intermediary class) to type used in C# wrapper function (in module class) if ((tm = Swig_typemap_lookup("csout", n, "", 0))) { excodeSubstitute(n, tm, "csout", n); bool is_pre_code = Len(pre_code) > 0; bool is_post_code = Len(post_code) > 0; bool is_terminator_code = Len(terminator_code) > 0; if (is_pre_code || is_post_code || is_terminator_code) { Replaceall(tm, "\n ", "\n "); // add extra indentation to code in typemap if (is_post_code) { Insert(tm, 0, "\n try "); Printv(tm, " finally {\n", post_code, "\n }", NIL); } else { Insert(tm, 0, "\n "); } if (is_pre_code) { Insert(tm, 0, pre_code); Insert(tm, 0, "\n"); } if (is_terminator_code) { Printv(tm, "\n", terminator_code, NIL); } Insert(tm, 0, "{"); Printf(tm, "\n }"); } if (GetFlag(n, "feature:new")) Replaceall(tm, "$owner", "true"); else Replaceall(tm, "$owner", "false"); substituteClassname(t, tm); Replaceall(tm, "$imcall", imcall); } else { Swig_warning(WARN_CSHARP_TYPEMAP_CSOUT_UNDEF, input_file, line_number, "No csout typemap defined for %s\n", SwigType_str(t, 0)); } if (proxy_flag && global_variable_flag) { // Properties if (generate_property_declaration_flag) { // Ensure the declaration is generated just once should the property contain both a set and get // Get the C# variable type - obtained differently depending on whether a setter is required. String *variable_type = return_type; if (setter_flag) { p = last_parm; // (last parameter is the only parameter for properties) SwigType *pt = Getattr(p, "type"); if ((tm = Getattr(p, "tmap:cstype"))) { substituteClassname(pt, tm); String *cstypeout = Getattr(p, "tmap:cstype:out"); // the type in the cstype typemap's out attribute overrides the type in the typemap variable_type = cstypeout ? cstypeout : tm; } else { Swig_warning(WARN_CSHARP_TYPEMAP_CSOUT_UNDEF, input_file, line_number, "No csvarin typemap defined for %s\n", SwigType_str(pt, 0)); } } const String *csattributes = Getattr(n, "feature:cs:attributes"); if (csattributes) Printf(module_class_code, " %s\n", csattributes); const String *methodmods = Getattr(n, "feature:cs:methodmodifiers"); if (!methodmods) methodmods = (is_public(n) ? public_string : protected_string); Printf(module_class_code, " %s static %s %s {", methodmods, variable_type, variable_name); } generate_property_declaration_flag = false; if (setter_flag) { // Setter method p = last_parm; // (last parameter is the only parameter for properties) SwigType *pt = Getattr(p, "type"); if ((tm = Getattr(p, "tmap:csvarin"))) { substituteClassname(pt, tm); Replaceall(tm, "$csinput", "value"); Replaceall(tm, "$imcall", imcall); excodeSubstitute(n, tm, "csvarin", p); Printf(module_class_code, "%s", tm); } else { Swig_warning(WARN_CSHARP_TYPEMAP_CSOUT_UNDEF, input_file, line_number, "No csvarin typemap defined for %s\n", SwigType_str(pt, 0)); } } else { // Getter method if ((tm = Swig_typemap_lookup("csvarout", n, "", 0))) { if (GetFlag(n, "feature:new")) Replaceall(tm, "$owner", "true"); else Replaceall(tm, "$owner", "false"); substituteClassname(t, tm); Replaceall(tm, "$imcall", imcall); excodeSubstitute(n, tm, "csvarout", n); Printf(module_class_code, "%s", tm); } else { Swig_warning(WARN_CSHARP_TYPEMAP_CSOUT_UNDEF, input_file, line_number, "No csvarout typemap defined for %s\n", SwigType_str(t, 0)); } } } else { // Normal function call Printf(function_code, " %s\n\n", tm ? (const String *) tm : empty_string); Printv(module_class_code, function_code, NIL); } Delete(pre_code); Delete(post_code); Delete(terminator_code); Delete(function_code); Delete(return_type); Delete(imcall); Delete(func_name); } /*---------------------------------------------------------------------- * replaceSpecialVariables() *--------------------------------------------------------------------*/ virtual void replaceSpecialVariables(String *method, String *tm, Parm *parm) { (void)method; SwigType *type = Getattr(parm, "type"); substituteClassname(type, tm); } /*---------------------------------------------------------------------- * decodeEnumFeature() * Decode the possible enum features, which are one of: * %csenum(simple) * %csenum(typeunsafe) - default * %csenum(typesafe) * %csenum(proper) *--------------------------------------------------------------------*/ EnumFeature decodeEnumFeature(Node *n) { EnumFeature enum_feature = TypeunsafeEnum; String *feature = Getattr(n, "feature:cs:enum"); if (feature) { if (Cmp(feature, "simple") == 0) enum_feature = SimpleEnum; else if (Cmp(feature, "typesafe") == 0) enum_feature = TypesafeEnum; else if (Cmp(feature, "proper") == 0) enum_feature = ProperEnum; } return enum_feature; } /* ----------------------------------------------------------------------- * enumValue() * This method will return a string with an enum value to use in C# generated * code. If the %csconst feature is not used, the string will contain the intermediary * class call to obtain the enum value. The intermediary class and PINVOKE methods to obtain * the enum value will be generated. Otherwise the C/C++ enum value will be used if there * is one and hopefully it will compile as C# code - e.g. 20 as in: enum E{e=20}; * The %csconstvalue feature overrides all other ways to generate the constant value. * The caller must delete memory allocated for the returned string. * ------------------------------------------------------------------------ */ String *enumValue(Node *n) { String *symname = Getattr(n, "sym:name"); // Check for the %csconstvalue feature String *value = Getattr(n, "feature:cs:constvalue"); if (!value) { // The %csconst feature determines how the constant value is obtained int const_feature_flag = GetFlag(n, "feature:cs:const"); if (const_feature_flag) { // Use the C syntax to make a true C# constant and hope that it compiles as C# code value = Getattr(n, "enumvalue") ? Copy(Getattr(n, "enumvalue")) : Copy(Getattr(n, "enumvalueex")); } else { String *newsymname = 0; if (!getCurrentClass() || !proxy_flag) { String *enumClassPrefix = getEnumClassPrefix(); if (enumClassPrefix) { // A global scoped enum newsymname = Swig_name_member(0, enumClassPrefix, symname); symname = newsymname; } } // Get the enumvalue from a PINVOKE call if (!getCurrentClass() || !cparse_cplusplus || !proxy_flag) { // Strange hack to change the name Setattr(n, "name", Getattr(n, "value")); /* for wrapping of enums in a namespace when emit_action is used */ constantWrapper(n); value = NewStringf("%s.%s()", full_imclass_name ? full_imclass_name : imclass_name, Swig_name_get(getNSpace(), symname)); } else { memberconstantHandler(n); value = NewStringf("%s.%s()", full_imclass_name ? full_imclass_name : imclass_name, Swig_name_get(getNSpace(), Swig_name_member(0, getEnumClassPrefix(), symname))); } } } return value; } /* ----------------------------------------------------------------------------- * getEnumName() * ----------------------------------------------------------------------------- */ String *getEnumName(SwigType *t) { Node *enumname = NULL; Node *n = enumLookup(t); if (n) { enumname = Getattr(n, "enumname"); if (!enumname) { String *symname = Getattr(n, "sym:name"); if (symname) { // Add in class scope when referencing enum if not a global enum String *scopename_prefix = Swig_scopename_prefix(Getattr(n, "name")); String *proxyname = 0; if (scopename_prefix) { proxyname = getProxyName(scopename_prefix); } if (proxyname) { enumname = NewStringf("%s.%s", proxyname, symname); } else { // global enum or enum in a namespace String *nspace = Getattr(n, "sym:nspace"); if (nspace) { if (namespce) enumname = NewStringf("%s.%s.%s", namespce, nspace, symname); else enumname = NewStringf("%s.%s", nspace, symname); } else { enumname = Copy(symname); } } Setattr(n, "enumname", enumname); Delete(enumname); Delete(scopename_prefix); } } } return enumname; } /* ----------------------------------------------------------------------------- * substituteClassname() * * Substitute the special variable $csclassname with the proxy class name for classes/structs/unions * that SWIG knows about. Also substitutes enums with enum name. * Otherwise use the $descriptor name for the C# class name. Note that the $&csclassname substitution * is the same as a $&descriptor substitution, ie one pointer added to descriptor name. * Inputs: * pt - parameter type * tm - typemap contents that might contain the special variable to be replaced * Outputs: * tm - typemap contents complete with the special variable substitution * Return: * substitution_performed - flag indicating if a substitution was performed * ----------------------------------------------------------------------------- */ bool substituteClassname(SwigType *pt, String *tm) { bool substitution_performed = false; SwigType *type = Copy(SwigType_typedef_resolve_all(pt)); SwigType *strippedtype = SwigType_strip_qualifiers(type); if (Strstr(tm, "$csclassname")) { SwigType *classnametype = Copy(strippedtype); substituteClassnameSpecialVariable(classnametype, tm, "$csclassname"); substitution_performed = true; Delete(classnametype); } if (Strstr(tm, "$*csclassname")) { SwigType *classnametype = Copy(strippedtype); Delete(SwigType_pop(classnametype)); if (Len(classnametype) > 0) { substituteClassnameSpecialVariable(classnametype, tm, "$*csclassname"); substitution_performed = true; } Delete(classnametype); } if (Strstr(tm, "$&csclassname")) { SwigType *classnametype = Copy(strippedtype); SwigType_add_pointer(classnametype); substituteClassnameSpecialVariable(classnametype, tm, "$&csclassname"); substitution_performed = true; Delete(classnametype); } if (Strstr(tm, "$csinterfacename")) { SwigType *interfacenametype = Copy(strippedtype); substituteInterfacenameSpecialVariable(interfacenametype, tm, "$csinterfacename", true); substitution_performed = true; Delete(interfacenametype); } if (Strstr(tm, "$*csinterfacename")) { SwigType *interfacenametype = Copy(strippedtype); Delete(SwigType_pop(interfacenametype)); if (Len(interfacenametype) > 0) { substituteInterfacenameSpecialVariable(interfacenametype, tm, "$*csinterfacename", true); substitution_performed = true; } Delete(interfacenametype); } if (Strstr(tm, "$&csinterfacename")) { SwigType *interfacenametype = Copy(strippedtype); SwigType_add_pointer(interfacenametype); substituteInterfacenameSpecialVariable(interfacenametype, tm, "$&csinterfacename", true); substitution_performed = true; Delete(interfacenametype); } if (Strstr(tm, "$interfacename")) { SwigType *interfacenametype = Copy(strippedtype); substituteInterfacenameSpecialVariable(interfacenametype, tm, "$interfacename", false); substitution_performed = true; Delete(interfacenametype); } if (Strstr(tm, "$*interfacename")) { SwigType *interfacenametype = Copy(strippedtype); Delete(SwigType_pop(interfacenametype)); if (Len(interfacenametype) > 0) { substituteInterfacenameSpecialVariable(interfacenametype, tm, "$*interfacename", false); substitution_performed = true; } Delete(interfacenametype); } if (Strstr(tm, "$&interfacename")) { SwigType *interfacenametype = Copy(strippedtype); SwigType_add_pointer(interfacenametype); substituteInterfacenameSpecialVariable(interfacenametype, tm, "$&interfacename", false); substitution_performed = true; Delete(interfacenametype); } Delete(strippedtype); Delete(type); return substitution_performed; } /* ----------------------------------------------------------------------------- * substituteClassnameSpecialVariable() * ----------------------------------------------------------------------------- */ void substituteClassnameSpecialVariable(SwigType *classnametype, String *tm, const char *classnamespecialvariable) { String *replacementname; if (SwigType_isenum(classnametype)) { String *enumname = getEnumName(classnametype); if (enumname) { replacementname = Copy(enumname); } else { bool anonymous_enum = (Cmp(classnametype, "enum ") == 0); if (anonymous_enum) { replacementname = NewString("int"); } else { // An unknown enum - one that has not been parsed (neither a C enum forward reference nor a definition) or an ignored enum replacementname = NewStringf("SWIGTYPE%s", SwigType_manglestr(classnametype)); Replace(replacementname, "enum ", "", DOH_REPLACE_ANY); Setattr(swig_types_hash, replacementname, classnametype); } } } else { String *classname = getProxyName(classnametype); // getProxyName() works for pointers to classes too if (classname) { replacementname = Copy(classname); } else { // use $descriptor if SWIG does not know anything about this type. Note that any typedefs are resolved. replacementname = NewStringf("SWIGTYPE%s", SwigType_manglestr(classnametype)); // Add to hash table so that the type wrapper classes can be created later Setattr(swig_types_hash, replacementname, classnametype); } } Replaceall(tm, classnamespecialvariable, replacementname); Delete(replacementname); } /* ----------------------------------------------------------------------------- * substituteInterfacenameSpecialVariable() * ----------------------------------------------------------------------------- */ void substituteInterfacenameSpecialVariable(SwigType *interfacenametype, String *tm, const char *interfacenamespecialvariable, bool qualified) { String *interfacename = getInterfaceName(interfacenametype, qualified); if (interfacename) { String *replacementname = Copy(interfacename); Replaceall(tm, interfacenamespecialvariable, replacementname); Delete(replacementname); } } /* ----------------------------------------------------------------------------- * emitTypeWrapperClass() * ----------------------------------------------------------------------------- */ void emitTypeWrapperClass(String *classname, SwigType *type) { Node *n = NewHash(); Setfile(n, input_file); Setline(n, line_number); String *swigtype = NewString(""); File *f_swigtype = getOutputFile(SWIG_output_directory(), classname); addOpenNamespace(0, f_swigtype); // Pure C# baseclass and interfaces const String *pure_baseclass = typemapLookup(n, "csbase", type, WARN_NONE); const String *pure_interfaces = typemapLookup(n, "csinterfaces", type, WARN_NONE); // Emit the class Printv(swigtype, typemapLookup(n, "csimports", type, WARN_NONE), // Import statements "\n", NIL); // Class attributes const String *csattributes = typemapLookup(n, "csattributes", type, WARN_NONE); if (csattributes && *Char(csattributes)) Printf(swigtype, "%s\n", csattributes); Printv(swigtype, typemapLookup(n, "csclassmodifiers", type, WARN_CSHARP_TYPEMAP_CLASSMOD_UNDEF), // Class modifiers " $csclassname", // Class name and base class (*Char(pure_baseclass) || *Char(pure_interfaces)) ? " : " : "", pure_baseclass, ((*Char(pure_baseclass)) && *Char(pure_interfaces)) ? // Interfaces ", " : "", pure_interfaces, " {", typemapLookup(n, "csbody", type, WARN_CSHARP_TYPEMAP_CSBODY_UNDEF), // main body of class typemapLookup(n, "cscode", type, WARN_NONE), // extra C# code "}\n", NIL); Replaceall(swigtype, "$csclassname", classname); Replaceall(swigtype, "$module", module_class_name); Replaceall(swigtype, "$imclassname", imclass_name); Replaceall(swigtype, "$dllimport", dllimport); // For unknown enums Replaceall(swigtype, "$enumvalues", ""); Printv(f_swigtype, swigtype, NIL); addCloseNamespace(0, f_swigtype); if (f_swigtype != f_single_out) Delete(f_swigtype); f_swigtype = NULL; Delete(swigtype); Delete(n); } /* ----------------------------------------------------------------------------- * typemapLookup() * n - for input only and must contain info for Getfile(n) and Getline(n) to work * tmap_method - typemap method name * type - typemap type to lookup * warning - warning number to issue if no typemaps found * typemap_attributes - the typemap attributes are attached to this node and will * also be used for temporary storage if non null * return is never NULL, unlike Swig_typemap_lookup() * ----------------------------------------------------------------------------- */ const String *typemapLookup(Node *n, const_String_or_char_ptr tmap_method, SwigType *type, int warning, Node *typemap_attributes = 0) { Node *node = !typemap_attributes ? NewHash() : typemap_attributes; Setattr(node, "type", type); Setfile(node, Getfile(n)); Setline(node, Getline(n)); const String *tm = Swig_typemap_lookup(tmap_method, node, "", 0); if (!tm) { tm = empty_string; if (warning != WARN_NONE) Swig_warning(warning, Getfile(n), Getline(n), "No %s typemap defined for %s\n", tmap_method, SwigType_str(type, 0)); } if (!typemap_attributes) Delete(node); return tm; } /* ----------------------------------------------------------------------------- * typemapExists() * n - for input only and must contain info for Getfile(n) and Getline(n) to work * tmap_method - typemap method name * type - typemap type to lookup * returns found typemap or NULL if not found * ----------------------------------------------------------------------------- */ const String *typemapExists(Node *n, const_String_or_char_ptr tmap_method, SwigType *type) { Node *node = NewHash(); Setattr(node, "type", type); Setfile(node, Getfile(n)); Setline(node, Getline(n)); const String *tm = Swig_typemap_lookup(tmap_method, node, "", 0); Delete(node); return tm; } /* ----------------------------------------------------------------------------- * canThrow() * Determine whether the code in the typemap can throw a C# exception. * If so, note it for later when excodeSubstitute() is called. * ----------------------------------------------------------------------------- */ void canThrow(Node *n, const String *typemap, Node *parameter) { String *canthrow_attribute = NewStringf("tmap:%s:canthrow", typemap); String *canthrow = Getattr(parameter, canthrow_attribute); if (canthrow) Setattr(n, "csharp:canthrow", "1"); Delete(canthrow_attribute); } /* ----------------------------------------------------------------------------- * excodeSubstitute() * If a method can throw a C# exception, additional exception code is added to * check for the pending exception so that it can then throw the exception. The * $excode special variable is replaced by the exception code in the excode * typemap attribute. * ----------------------------------------------------------------------------- */ void excodeSubstitute(Node *n, String *code, const String *typemap, Node *parameter) { String *excode_attribute = NewStringf("tmap:%s:excode", typemap); String *excode = Getattr(parameter, excode_attribute); if (Getattr(n, "csharp:canthrow")) { int count = Replaceall(code, "$excode", excode); if (count < 1 || !excode) { Swig_warning(WARN_CSHARP_EXCODE, input_file, line_number, "C# exception may not be thrown - no $excode or excode attribute in '%s' typemap.\n", typemap); } } else { Replaceall(code, "$excode", empty_string); } Delete(excode_attribute); } /* ----------------------------------------------------------------------------- * addOpenNamespace() * ----------------------------------------------------------------------------- */ void addOpenNamespace(const String *nspace, File *file) { if (namespce || nspace) { Printf(file, "namespace "); if (namespce) Printv(file, namespce, nspace ? "." : "", NIL); if (nspace) Printv(file, nspace, NIL); Printf(file, " {\n"); } } /* ----------------------------------------------------------------------------- * addCloseNamespace() * ----------------------------------------------------------------------------- */ void addCloseNamespace(const String *nspace, File *file) { if (namespce || nspace) Printf(file, "\n}\n"); } /* ----------------------------------------------------------------------------- * outputDirectory() * * Return the directory to use for generating C# classes/enums and create the * subdirectory (does not create if language specific outdir does not exist). * ----------------------------------------------------------------------------- */ String *outputDirectory(String *nspace) { String *output_directory = Copy(SWIG_output_directory()); if (nspace) { String *nspace_subdirectory = Copy(nspace); Replaceall(nspace_subdirectory, ".", SWIG_FILE_DELIMITER); String *newdir_error = Swig_new_subdirectory(output_directory, nspace_subdirectory); if (newdir_error) { Printf(stderr, "%s\n", newdir_error); Delete(newdir_error); SWIG_exit(EXIT_FAILURE); } Printv(output_directory, nspace_subdirectory, SWIG_FILE_DELIMITER, 0); Delete(nspace_subdirectory); } return output_directory; } /*---------------------------------------------------------------------- * Start of director methods *--------------------------------------------------------------------*/ #if 0 /*---------------------------------------------------------------------- * emitDirectorUpcalls() *--------------------------------------------------------------------*/ void emitDirectorUpcalls() { if (n_dmethods) { Wrapper *w = NewWrapper(); String *dmethod_data = NewString(""); int n_methods = 0; Iterator udata_iter; udata_iter = First(dmethods_seq); while (udata_iter.item) { UpcallData *udata = udata_iter.item; Printf(dmethod_data, " { \"%s\", \"%s\" }", Getattr(udata, "imclass_method"), Getattr(udata, "imclass_fdesc")); ++n_methods; udata_iter = Next(udata_iter); if (udata_iter.item) Putc(',', dmethod_data); Putc('\n', dmethod_data); } Wrapper_print(w, f_wrappers); Delete(dmethod_data); Delete(swig_module_init); DelWrapper(w); } } #endif /*---------------------------------------------------------------------- * emitDirectorExtraMethods() * * This is where the director connect method is generated. *--------------------------------------------------------------------*/ void emitDirectorExtraMethods(Node *n) { if (!Swig_directorclass(n)) return; // Output the director connect method: String *norm_name = SwigType_namestr(Getattr(n, "name")); String *dirclassname = directorClassName(n); String *swig_director_connect = Swig_name_member(getNSpace(), getClassPrefix(), "director_connect"); String *wname = Swig_name_wrapper(swig_director_connect); String *sym_name = Getattr(n, "sym:name"); String *qualified_classname = Copy(sym_name); String *nspace = getNSpace(); String *dirClassName = directorClassName(n); String *smartptr = Getattr(n, "feature:smartptr"); if (!GetFlag(n, "feature:flatnested")) { for (Node *outer_class = Getattr(n, "nested:outer"); outer_class; outer_class = Getattr(outer_class, "nested:outer")) { Push(qualified_classname, "."); Push(qualified_classname, Getattr(outer_class, "sym:name")); } } if (nspace) Insert(qualified_classname, 0, NewStringf("%s.", nspace)); Printv(imclass_class_code, "\n [global::System.Runtime.InteropServices.DllImport(\"", dllimport, "\", EntryPoint=\"", wname, "\")]\n", NIL); Printf(imclass_class_code, " public static extern void %s(global::System.Runtime.InteropServices.HandleRef jarg1", swig_director_connect); Wrapper *code_wrap = NewWrapper(); Printf(code_wrap->def, "SWIGEXPORT void SWIGSTDCALL %s(void *objarg", wname); if (smartptr) { Printf(code_wrap->code, " %s *obj = (%s *)objarg;\n", smartptr, smartptr); Printf(code_wrap->code, " // Keep a local instance of the smart pointer around while we are using the raw pointer\n"); Printf(code_wrap->code, " // Avoids using smart pointer specific API.\n"); Printf(code_wrap->code, " %s *director = static_cast<%s *>(obj->operator->());\n", dirClassName, dirClassName); } else { Printf(code_wrap->code, " %s *obj = (%s *)objarg;\n", norm_name, norm_name); Printf(code_wrap->code, " %s *director = static_cast<%s *>(obj);\n", dirClassName, dirClassName); } Printf(code_wrap->code, " director->swig_connect_director("); for (int i = first_class_dmethod; i < curr_class_dmethod; ++i) { UpcallData *udata = Getitem(dmethods_seq, i); String *methid = Getattr(udata, "class_methodidx"); Printf(code_wrap->def, ", "); if (i != first_class_dmethod) Printf(code_wrap->code, ", "); Printf(code_wrap->def, "%s::SWIG_Callback%s_t callback%s", dirclassname, methid, methid); Printf(code_wrap->code, "callback%s", methid); Printf(imclass_class_code, ", %s.SwigDelegate%s_%s delegate%s", qualified_classname, sym_name, methid, methid); } Printf(code_wrap->def, ") {\n"); Printf(code_wrap->code, ");\n"); Printf(imclass_class_code, ");\n"); Printf(code_wrap->code, "}\n"); Wrapper_print(code_wrap, f_wrappers); DelWrapper(code_wrap); Delete(wname); Delete(swig_director_connect); Delete(qualified_classname); Delete(dirclassname); } /* --------------------------------------------------------------- * classDirectorMethod() * * Emit a virtual director method to pass a method call on to the * underlying C# object. * * --------------------------------------------------------------- */ int classDirectorMethod(Node *n, Node *parent, String *super) { String *classname = Getattr(parent, "sym:name"); String *c_classname = Getattr(parent, "name"); String *name = Getattr(n, "name"); String *symname = Getattr(n, "sym:name"); SwigType *returntype = Getattr(n, "type"); String *overloaded_name = getOverloadedName(n); String *storage = Getattr(n, "storage"); String *value = Getattr(n, "value"); String *decl = Getattr(n, "decl"); String *declaration = NewString(""); String *pre_code = NewString(""); String *post_code = NewString(""); String *terminator_code = NewString(""); String *tm; Parm *p; int i; Wrapper *w = NewWrapper(); ParmList *l = Getattr(n, "parms"); bool is_void = !(Cmp(returntype, "void")); String *qualified_return = 0; bool pure_virtual = (!(Cmp(storage, "virtual")) && !(Cmp(value, "0"))); int status = SWIG_OK; bool output_director = true; String *dirclassname = directorClassName(parent); String *qualified_name = NewStringf("%s::%s", dirclassname, name); SwigType *c_ret_type = NULL; String *jupcall_args = NewString(""); String *imclass_dmethod; String *callback_typedef_parms = NewString(""); String *delegate_parms = NewString(""); String *proxy_method_types = NewString(""); String *callback_def = NewString(""); String *callback_code = NewString(""); String *imcall_args = NewString(""); bool ignored_method = GetFlag(n, "feature:ignore") ? true : false; // Kludge Alert: functionWrapper sets sym:overload properly, but it // isn't at this point, so we have to manufacture it ourselves. At least // we're consistent with the sym:overload name in functionWrapper. (?? when // does the overloaded method name get set?) imclass_dmethod = NewStringf("SwigDirector_%s", Swig_name_member(getNSpace(), getClassPrefix(), overloaded_name)); qualified_return = SwigType_rcaststr(returntype, "c_result"); if (!is_void && (!ignored_method || pure_virtual)) { if (!SwigType_isclass(returntype)) { if (!(SwigType_ispointer(returntype) || SwigType_isreference(returntype))) { String *construct_result = NewStringf("= SwigValueInit< %s >()", SwigType_lstr(returntype, 0)); Wrapper_add_localv(w, "c_result", SwigType_lstr(returntype, "c_result"), construct_result, NIL); Delete(construct_result); } else { String *base_typename = SwigType_base(returntype); String *resolved_typename = SwigType_typedef_resolve_all(base_typename); Symtab *symtab = Getattr(n, "sym:symtab"); Node *typenode = Swig_symbol_clookup(resolved_typename, symtab); if (SwigType_ispointer(returntype) || (typenode && Getattr(typenode, "abstracts"))) { /* initialize pointers to something sane. Same for abstract classes when a reference is returned. */ Wrapper_add_localv(w, "c_result", SwigType_lstr(returntype, "c_result"), "= 0", NIL); } else { /* If returning a reference, initialize the pointer to a sane default - if a C# exception occurs, then the pointer returns something other than a NULL-initialized reference. */ SwigType *noref_type = SwigType_del_reference(Copy(returntype)); String *noref_ltype = SwigType_lstr(noref_type, 0); String *return_ltype = SwigType_lstr(returntype, 0); Wrapper_add_localv(w, "result_default", "static", noref_ltype, "result_default", NIL); Wrapper_add_localv(w, "c_result", return_ltype, "c_result", NIL); Printf(w->code, "result_default = SwigValueInit< %s >();\n", noref_ltype); Printf(w->code, "c_result = &result_default;\n"); Delete(return_ltype); Delete(noref_ltype); Delete(noref_type); } Delete(base_typename); Delete(resolved_typename); } } else { SwigType *vt; vt = cplus_value_type(returntype); if (!vt) { Wrapper_add_localv(w, "c_result", SwigType_lstr(returntype, "c_result"), NIL); } else { Wrapper_add_localv(w, "c_result", SwigType_lstr(vt, "c_result"), NIL); Delete(vt); } } } /* Create the intermediate class wrapper */ tm = Swig_typemap_lookup("imtype", n, "", 0); if (tm) { String *imtypeout = Getattr(n, "tmap:imtype:out"); // the type in the imtype typemap's out attribute overrides the type in the typemap if (imtypeout) tm = imtypeout; const String *im_directoroutattributes = Getattr(n, "tmap:imtype:directoroutattributes"); if (im_directoroutattributes) { Printf(callback_def, " %s\n", im_directoroutattributes); if (!ignored_method) Printf(director_delegate_definitions, " %s\n", im_directoroutattributes); } Printf(callback_def, " private %s SwigDirectorMethod%s(", tm, overloaded_name); if (!ignored_method) { const String *csdirectordelegatemodifiers = Getattr(n, "feature:csdirectordelegatemodifiers"); String *modifiers = (csdirectordelegatemodifiers ? NewStringf("%s%s", csdirectordelegatemodifiers, Len(csdirectordelegatemodifiers) > 0 ? " " : "") : NewStringf("public ")); Printf(director_delegate_definitions, " %sdelegate %s", modifiers, tm); Delete(modifiers); } } else { Swig_warning(WARN_CSHARP_TYPEMAP_CSTYPE_UNDEF, input_file, line_number, "No imtype typemap defined for %s\n", SwigType_str(returntype, 0)); } if ((c_ret_type = Swig_typemap_lookup("ctype", n, "", 0))) { if (!is_void && !ignored_method) { String *jretval_decl = NewStringf("%s jresult", c_ret_type); Wrapper_add_localv(w, "jresult", jretval_decl, "= 0", NIL); Delete(jretval_decl); } } else { Swig_warning(WARN_CSHARP_TYPEMAP_CTYPE_UNDEF, input_file, line_number, "No ctype typemap defined for %s for use in %s::%s (skipping director method)\n", SwigType_str(returntype, 0), SwigType_namestr(c_classname), SwigType_namestr(name)); output_director = false; } Swig_director_parms_fixup(l); /* Attach the standard typemaps */ Swig_typemap_attach_parms("out", l, 0); Swig_typemap_attach_parms("ctype", l, 0); Swig_typemap_attach_parms("imtype", l, 0); Swig_typemap_attach_parms("cstype", l, 0); Swig_typemap_attach_parms("directorin", l, w); Swig_typemap_attach_parms("csdirectorin", l, 0); Swig_typemap_attach_parms("directorargout", l, w); /* Preamble code */ if (!ignored_method) Printf(w->code, "if (!swig_callback%s) {\n", overloaded_name); if (!pure_virtual) { String *super_call = Swig_method_call(super, l); if (is_void) { Printf(w->code, "%s;\n", super_call); if (!ignored_method) Printf(w->code, "return;\n"); } else { Printf(w->code, "return %s;\n", super_call); } Delete(super_call); } else { Printf(w->code, "Swig::DirectorPureVirtualException::raise(\"%s::%s\");\n", SwigType_namestr(c_classname), SwigType_namestr(name)); if (!is_void) Printf(w->code, "return %s;", qualified_return); else if (!ignored_method) Printf(w->code, "return;\n"); } if (!ignored_method) Printf(w->code, "} else {\n"); /* Go through argument list, convert from native to C# */ for (i = 0, p = l; p; ++i) { /* Is this superfluous? */ while (checkAttribute(p, "tmap:directorin:numinputs", "0")) { p = Getattr(p, "tmap:directorin:next"); } SwigType *pt = Getattr(p, "type"); String *ln = makeParameterName(n, p, i, false); String *c_param_type = NULL; String *c_decl = NewString(""); String *arg = NewString(""); Printf(arg, "j%s", ln); /* And add to the upcall args */ if (i > 0) Printf(jupcall_args, ", "); Printf(jupcall_args, "%s", arg); /* Get parameter's intermediary C type */ if ((c_param_type = Getattr(p, "tmap:ctype"))) { String *ctypeout = Getattr(p, "tmap:ctype:out"); // the type in the ctype typemap's out attribute overrides the type in the typemap if (ctypeout) c_param_type = ctypeout; /* Add to local variables */ Printf(c_decl, "%s %s", c_param_type, arg); if (!ignored_method) Wrapper_add_localv(w, arg, c_decl, (!(SwigType_ispointer(pt) || SwigType_isreference(pt)) ? "" : "= 0"), NIL); /* Add input marshalling code */ if ((tm = Getattr(p, "tmap:directorin"))) { Setattr(p, "emit:directorinput", arg); Replaceall(tm, "$input", arg); Replaceall(tm, "$owner", "0"); if (Len(tm)) if (!ignored_method) Printf(w->code, "%s\n", tm); /* Add C type to callback typedef */ if (i > 0) Printf(callback_typedef_parms, ", "); Printf(callback_typedef_parms, "%s", c_param_type); /* Add parameter to the intermediate class code if generating the * intermediate's upcall code */ if ((tm = Getattr(p, "tmap:imtype"))) { String *imtypeout = Getattr(p, "tmap:imtype:out"); // the type in the imtype typemap's out attribute overrides the type in the typemap if (imtypeout) tm = imtypeout; const String *im_directorinattributes = Getattr(p, "tmap:imtype:directorinattributes"); String *din = Copy(Getattr(p, "tmap:csdirectorin")); if (din) { Replaceall(din, "$module", module_class_name); Replaceall(din, "$imclassname", imclass_name); substituteClassname(pt, din); Replaceall(din, "$iminput", ln); // pre and post attribute support String *pre = Getattr(p, "tmap:csdirectorin:pre"); if (pre) { substituteClassname(pt, pre); Replaceall(pre, "$iminput", ln); if (Len(pre_code) > 0) Printf(pre_code, "\n"); Printv(pre_code, pre, NIL); } String *post = Getattr(p, "tmap:csdirectorin:post"); if (post) { substituteClassname(pt, post); Replaceall(post, "$iminput", ln); if (Len(post_code) > 0) Printf(post_code, "\n"); Printv(post_code, post, NIL); } String *terminator = Getattr(p, "tmap:csdirectorin:terminator"); if (terminator) { substituteClassname(pt, terminator); Replaceall(terminator, "$iminput", ln); if (Len(terminator_code) > 0) Insert(terminator_code, 0, "\n"); Insert(terminator_code, 0, terminator); } if (i > 0) { Printf(delegate_parms, ", "); Printf(proxy_method_types, ", "); Printf(imcall_args, ", "); } Printf(delegate_parms, "%s%s %s", im_directorinattributes ? im_directorinattributes : empty_string, tm, ln); if (Cmp(din, ln)) { Printv(imcall_args, din, NIL); } else Printv(imcall_args, ln, NIL); /* Get the C# parameter type */ if ((tm = Getattr(p, "tmap:cstype"))) { substituteClassname(pt, tm); if (Strncmp(tm, "ref ", 4) == 0) { Replace(tm, "ref ", "", DOH_REPLACE_FIRST); Printf(proxy_method_types, "typeof(%s).MakeByRefType()", tm); } else if (Strncmp(tm, "out ", 4) == 0) { Replace(tm, "out ", "", DOH_REPLACE_FIRST); Printf(proxy_method_types, "typeof(%s).MakeByRefType()", tm); } else { Printf(proxy_method_types, "typeof(%s)", tm); } } else { Swig_warning(WARN_CSHARP_TYPEMAP_CSWTYPE_UNDEF, input_file, line_number, "No cstype typemap defined for %s\n", SwigType_str(pt, 0)); } } else { Swig_warning(WARN_CSHARP_TYPEMAP_CSDIRECTORIN_UNDEF, input_file, line_number, "No csdirectorin typemap defined for %s for use in %s::%s (skipping director method)\n", SwigType_str(pt, 0), SwigType_namestr(c_classname), SwigType_namestr(name)); output_director = false; } } else { Swig_warning(WARN_CSHARP_TYPEMAP_CSTYPE_UNDEF, input_file, line_number, "No imtype typemap defined for %s for use in %s::%s (skipping director method)\n", SwigType_str(pt, 0), SwigType_namestr(c_classname), SwigType_namestr(name)); output_director = false; } p = Getattr(p, "tmap:directorin:next"); } else { Swig_warning(WARN_CSHARP_TYPEMAP_CSDIRECTORIN_UNDEF, input_file, line_number, "No or improper directorin typemap defined for argument %s for use in %s::%s (skipping director method)\n", SwigType_str(pt, 0), SwigType_namestr(c_classname), SwigType_namestr(name)); p = nextSibling(p); output_director = false; } } else { Swig_warning(WARN_CSHARP_TYPEMAP_CTYPE_UNDEF, input_file, line_number, "No ctype typemap defined for %s for use in %s::%s (skipping director method)\n", SwigType_str(pt, 0), SwigType_namestr(c_classname), SwigType_namestr(name)); output_director = false; p = nextSibling(p); } Delete(ln); Delete(arg); Delete(c_decl); } /* header declaration, start wrapper definition */ String *target; SwigType *rtype = Getattr(n, "conversion_operator") ? 0 : Getattr(n, "classDirectorMethods:type"); target = Swig_method_decl(rtype, decl, qualified_name, l, 0); Printf(w->def, "%s", target); Delete(qualified_name); Delete(target); target = Swig_method_decl(rtype, decl, name, l, 1); Printf(declaration, " virtual %s", target); Delete(target); // Add any exception specifications to the methods in the director class if (Getattr(n, "noexcept")) { Append(w->def, " noexcept"); Append(declaration, " noexcept"); } ParmList *throw_parm_list = NULL; if ((throw_parm_list = Getattr(n, "throws")) || Getattr(n, "throw")) { int gencomma = 0; Append(w->def, " throw("); Append(declaration, " throw("); if (throw_parm_list) Swig_typemap_attach_parms("throws", throw_parm_list, 0); for (p = throw_parm_list; p; p = nextSibling(p)) { if (Getattr(p, "tmap:throws")) { if (gencomma++) { Append(w->def, ", "); Append(declaration, ", "); } Printf(w->def, "%s", SwigType_str(Getattr(p, "type"), 0)); Printf(declaration, "%s", SwigType_str(Getattr(p, "type"), 0)); } } Append(w->def, ")"); Append(declaration, ")"); } Append(w->def, " {"); Append(declaration, ";\n"); /* Finish off the inherited upcall's definition */ Printf(callback_def, "%s)", delegate_parms); Printf(callback_def, " {\n"); /* Emit the intermediate class's upcall to the actual class */ String *upcall = NewStringf("%s(%s)", symname, imcall_args); if ((tm = Swig_typemap_lookup("csdirectorout", n, "", 0))) { substituteClassname(returntype, tm); Replaceall(tm, "$cscall", upcall); if (!is_void) Insert(tm, 0, "return "); Replaceall(tm, "\n ", "\n "); // add extra indentation to code in typemap // pre and post attribute support bool is_pre_code = Len(pre_code) > 0; bool is_post_code = Len(post_code) > 0; bool is_terminator_code = Len(terminator_code) > 0; if (is_pre_code && is_post_code) Printf(callback_code, "%s\n try {\n %s;\n } finally {\n%s\n }\n", pre_code, tm, post_code); else if (is_pre_code) Printf(callback_code, "%s\n %s;\n", pre_code, tm); else if (is_post_code) Printf(callback_code, " try {\n %s;\n } finally {\n%s\n }\n", tm, post_code); else Printf(callback_code, " %s;\n", tm); if (is_terminator_code) Printv(callback_code, "\n", terminator_code, NIL); } Printf(callback_code, " }\n"); Delete(upcall); if (!ignored_method) { if (!is_void) Printf(w->code, "jresult = (%s) ", c_ret_type); Printf(w->code, "swig_callback%s(%s);\n", overloaded_name, jupcall_args); if (!is_void) { String *jresult_str = NewString("jresult"); String *result_str = NewString("c_result"); /* Copy jresult into c_result... */ if ((tm = Swig_typemap_lookup("directorout", n, result_str, w))) { Replaceall(tm, "$input", jresult_str); Replaceall(tm, "$result", result_str); Printf(w->code, "%s\n", tm); } else { Swig_warning(WARN_TYPEMAP_DIRECTOROUT_UNDEF, input_file, line_number, "Unable to use return type %s used in %s::%s (skipping director method)\n", SwigType_str(returntype, 0), SwigType_namestr(c_classname), SwigType_namestr(name)); output_director = false; } Delete(jresult_str); Delete(result_str); } /* Marshal outputs */ for (p = l; p;) { if ((tm = Getattr(p, "tmap:directorargout"))) { canThrow(n, "directorargout", p); Replaceall(tm, "$result", "jresult"); Replaceall(tm, "$input", Getattr(p, "emit:directorinput")); Printv(w->code, tm, "\n", NIL); p = Getattr(p, "tmap:directorargout:next"); } else { p = nextSibling(p); } } /* Terminate wrapper code */ Printf(w->code, "}\n"); if (!is_void) Printf(w->code, "return %s;", qualified_return); } Printf(w->code, "}"); // We expose virtual protected methods via an extra public inline method which makes a straight call to the wrapped class' method String *inline_extra_method = NewString(""); if (dirprot_mode() && !is_public(n) && !pure_virtual) { Printv(inline_extra_method, declaration, NIL); String *extra_method_name = NewStringf("%sSwigPublic", name); Replaceall(inline_extra_method, name, extra_method_name); Replaceall(inline_extra_method, ";\n", " {\n "); if (!is_void) Printf(inline_extra_method, "return "); String *methodcall = Swig_method_call(super, l); Printv(inline_extra_method, methodcall, ";\n }\n", NIL); Delete(methodcall); Delete(extra_method_name); } /* emit the director method */ if (status == SWIG_OK && output_director) { if (!is_void) { Replaceall(w->code, "$null", qualified_return); } else { Replaceall(w->code, "$null", ""); } if (!ignored_method) Printv(director_delegate_callback, "\n", callback_def, callback_code, NIL); if (!Getattr(n, "defaultargs")) { Replaceall(w->code, "$symname", symname); Wrapper_print(w, f_directors); Printv(f_directors_h, declaration, NIL); Printv(f_directors_h, inline_extra_method, NIL); } } if (!ignored_method) { /* Emit the actual upcall through */ UpcallData *udata = addUpcallMethod(imclass_dmethod, symname, decl, overloaded_name); String *methid = Getattr(udata, "class_methodidx"); Setattr(n, "upcalldata", udata); /* Printf(stdout, "setting upcalldata, nodeType: %s %s::%s %p\n", nodeType(n), classname, Getattr(n, "name"), n); */ Printf(director_callback_typedefs, " typedef %s (SWIGSTDCALL* SWIG_Callback%s_t)(", c_ret_type, methid); Printf(director_callback_typedefs, "%s);\n", callback_typedef_parms); Printf(director_callbacks, " SWIG_Callback%s_t swig_callback%s;\n", methid, overloaded_name); Printf(director_delegate_definitions, " SwigDelegate%s_%s(%s);\n", classname, methid, delegate_parms); Printf(director_delegate_instances, " private SwigDelegate%s_%s swigDelegate%s;\n", classname, methid, methid); Printf(director_method_types, " private static global::System.Type[] swigMethodTypes%s = new global::System.Type[] { %s };\n", methid, proxy_method_types); Printf(director_connect_parms, "SwigDirector%s%s delegate%s", classname, methid, methid); } Delete(pre_code); Delete(post_code); Delete(terminator_code); Delete(qualified_return); Delete(declaration); Delete(callback_typedef_parms); Delete(delegate_parms); Delete(proxy_method_types); Delete(callback_def); Delete(callback_code); Delete(dirclassname); DelWrapper(w); return status; } /* ------------------------------------------------------------ * classDirectorConstructor() * ------------------------------------------------------------ */ int classDirectorConstructor(Node *n) { Node *parent = parentNode(n); String *decl = Getattr(n, "decl"); String *supername = Swig_class_name(parent); String *dirclassname = directorClassName(parent); String *sub = NewString(""); Parm *p; ParmList *superparms = Getattr(n, "parms"); ParmList *parms; int argidx = 0; /* Assign arguments to superclass's parameters, if not already done */ for (p = superparms; p; p = nextSibling(p)) { String *pname = Getattr(p, "name"); if (!pname) { pname = NewStringf("arg%d", argidx++); Setattr(p, "name", pname); } } // TODO: Is this copy needed? parms = CopyParmList(superparms); if (!Getattr(n, "defaultargs")) { /* constructor */ { String *basetype = Getattr(parent, "classtype"); String *target = Swig_method_decl(0, decl, dirclassname, parms, 0); String *call = Swig_csuperclass_call(0, basetype, superparms); Printf(f_directors, "%s::%s : %s, %s {\n", dirclassname, target, call, Getattr(parent, "director:ctor")); Printf(f_directors, " swig_init_callbacks();\n"); Printf(f_directors, "}\n\n"); Delete(target); Delete(call); } /* constructor header */ { String *target = Swig_method_decl(0, decl, dirclassname, parms, 1); Printf(f_directors_h, " %s;\n", target); Delete(target); } } Delete(sub); Delete(supername); Delete(parms); Delete(dirclassname); return Language::classDirectorConstructor(n); } /* ------------------------------------------------------------ * classDirectorDefaultConstructor() * ------------------------------------------------------------ */ int classDirectorDefaultConstructor(Node *n) { String *dirclassname = directorClassName(n); String *classtype = SwigType_namestr(Getattr(n, "name")); Wrapper *w = NewWrapper(); Printf(w->def, "%s::%s() : %s {", dirclassname, dirclassname, Getattr(n, "director:ctor")); Printf(w->code, "}\n"); Wrapper_print(w, f_directors); Printf(f_directors_h, " %s();\n", dirclassname); DelWrapper(w); Delete(classtype); Delete(dirclassname); return Language::classDirectorDefaultConstructor(n); } /* ------------------------------------------------------------ * classDirectorInit() * ------------------------------------------------------------ */ int classDirectorInit(Node *n) { Delete(none_comparison); none_comparison = NewString(""); // not used Delete(director_ctor_code); director_ctor_code = NewString("$director_new"); directorDeclaration(n); Printf(f_directors_h, "%s {\n", Getattr(n, "director:decl")); Printf(f_directors_h, "\npublic:\n"); /* Keep track of the director methods for this class */ first_class_dmethod = curr_class_dmethod = n_dmethods; director_callback_typedefs = NewString(""); director_callbacks = NewString(""); director_delegate_callback = NewString(""); director_delegate_definitions = NewString(""); director_delegate_instances = NewString(""); director_method_types = NewString(""); director_connect_parms = NewString(""); return Language::classDirectorInit(n); } int classDeclaration(Node *n) { String *old_director_callback_typedefs = director_callback_typedefs; String *old_director_callbacks = director_callbacks; String *old_director_delegate_callback = director_delegate_callback; String *old_director_delegate_definitions = director_delegate_definitions; String *old_director_delegate_instances = director_delegate_instances; String *old_director_method_types = director_method_types; String *old_director_connect_parms = director_connect_parms; int ret = Language::classDeclaration(n); // these variables are deleted in emitProxyClassDefAndCPPCasts, hence no Delete here director_callback_typedefs = old_director_callback_typedefs; director_callbacks = old_director_callbacks; director_delegate_callback = old_director_delegate_callback; director_delegate_definitions = old_director_delegate_definitions; director_delegate_instances = old_director_delegate_instances; director_method_types = old_director_method_types; director_connect_parms = old_director_connect_parms; return ret; } /* ---------------------------------------------------------------------- * classDirectorDestructor() * ---------------------------------------------------------------------- */ int classDirectorDestructor(Node *n) { Node *current_class = getCurrentClass(); String *dirclassname = directorClassName(current_class); Wrapper *w = NewWrapper(); if (Getattr(n, "noexcept")) { Printf(f_directors_h, " virtual ~%s() noexcept;\n", dirclassname); Printf(w->def, "%s::~%s() noexcept {\n", dirclassname, dirclassname); } else if (Getattr(n, "throw")) { Printf(f_directors_h, " virtual ~%s() throw();\n", dirclassname); Printf(w->def, "%s::~%s() throw() {\n", dirclassname, dirclassname); } else { Printf(f_directors_h, " virtual ~%s();\n", dirclassname); Printf(w->def, "%s::~%s() {\n", dirclassname, dirclassname); } Printv(w->code, "}\n", NIL); Wrapper_print(w, f_directors); DelWrapper(w); Delete(dirclassname); return SWIG_OK; } /* ------------------------------------------------------------ * classDirectorEnd() * ------------------------------------------------------------ */ int classDirectorEnd(Node *n) { int i; String *dirclassname = directorClassName(n); Wrapper *w = NewWrapper(); if (Len(director_callback_typedefs) > 0) { Printf(f_directors_h, "\n%s", director_callback_typedefs); } Printf(f_directors_h, " void swig_connect_director("); Printf(w->def, "void %s::swig_connect_director(", dirclassname); for (i = first_class_dmethod; i < curr_class_dmethod; ++i) { UpcallData *udata = Getitem(dmethods_seq, i); String *methid = Getattr(udata, "class_methodidx"); String *overname = Getattr(udata, "overname"); Printf(f_directors_h, "SWIG_Callback%s_t callback%s", methid, overname); Printf(w->def, "SWIG_Callback%s_t callback%s", methid, overname); Printf(w->code, "swig_callback%s = callback%s;\n", overname, overname); if (i != curr_class_dmethod - 1) { Printf(f_directors_h, ", "); Printf(w->def, ", "); } } Printf(f_directors_h, ");\n"); Printf(w->def, ") {"); if (Len(director_callbacks) > 0) { Printf(f_directors_h, "\nprivate:\n%s", director_callbacks); } Printf(f_directors_h, " void swig_init_callbacks();\n"); Printf(f_directors_h, "};\n\n"); Printf(w->code, "}\n\n"); Printf(w->code, "void %s::swig_init_callbacks() {\n", dirclassname); for (i = first_class_dmethod; i < curr_class_dmethod; ++i) { UpcallData *udata = Getitem(dmethods_seq, i); String *overname = Getattr(udata, "overname"); Printf(w->code, "swig_callback%s = 0;\n", overname); } Printf(w->code, "}"); Wrapper_print(w, f_directors); DelWrapper(w); Delete(dirclassname); return Language::classDirectorEnd(n); } /* -------------------------------------------------------------------- * classDirectorDisown() * ------------------------------------------------------------------*/ virtual int classDirectorDisown(Node *n) { (void) n; return SWIG_OK; } /*---------------------------------------------------------------------- * extraDirectorProtectedCPPMethodsRequired() *--------------------------------------------------------------------*/ bool extraDirectorProtectedCPPMethodsRequired() const { return false; } /*---------------------------------------------------------------------- * directorDeclaration() * * Generate the director class's declaration * e.g. "class SwigDirector_myclass : public myclass, public Swig::Director {" *--------------------------------------------------------------------*/ void directorDeclaration(Node *n) { String *base = Getattr(n, "classtype"); String *class_ctor = NewString("Swig::Director()"); String *dirclassname = directorClassName(n); String *declaration = Swig_class_declaration(n, dirclassname); Printf(declaration, " : public %s, public Swig::Director", base); // Stash stuff for later. Setattr(n, "director:decl", declaration); Setattr(n, "director:ctor", class_ctor); Delete(dirclassname); } /*---------------------------------------------------------------------- * nestedClassesSupport() *--------------------------------------------------------------------*/ NestedClassSupport nestedClassesSupport() const { return NCS_Full; } }; /* class CSHARP */ /* ----------------------------------------------------------------------------- * swig_csharp() - Instantiate module * ----------------------------------------------------------------------------- */ static Language *new_swig_csharp() { return new CSHARP(); } extern "C" Language *swig_csharp(void) { return new_swig_csharp(); } /* ----------------------------------------------------------------------------- * Static member variables * ----------------------------------------------------------------------------- */ const char *CSHARP::usage = "\ C# Options (available with -csharp)\n\ -dllimport
- Override DllImport attribute name to
\n\ -namespace - Generate wrappers into C# namespace \n\ -noproxy - Generate the low-level functional interface instead\n\ of proxy classes\n\ -oldvarnames - Old intermediary method names for variable wrappers\n\ -outfile - Write all C# into a single located in the output directory\n\ \n"; swig-4.0.1/Source/Modules/clisp.cxx0000644000175000017500000003213613527063513017063 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * clisp.cxx * * clisp language module for SWIG. * ----------------------------------------------------------------------------- */ #include "swigmod.h" static const char *usage = "\ CLISP Options (available with -clisp)\n\ -extern-all - Create clisp definitions for all the functions and\n\ global variables otherwise only definitions for\n\ externed functions and variables are created.\n\ -generate-typedef - Use def-c-type to generate shortcuts according to the\n\ typedefs in the input.\n\ "; class CLISP:public Language { public: File *f_cl; String *module; virtual void main(int argc, char *argv[]); virtual int top(Node *n); virtual int functionWrapper(Node *n); virtual int variableWrapper(Node *n); virtual int constantWrapper(Node *n); virtual int classDeclaration(Node *n); virtual int enumDeclaration(Node *n); virtual int typedefHandler(Node *n); List *entries; private: String *get_ffi_type(Node *n, SwigType *ty); String *convert_literal(String *num_param, String *type); String *strip_parens(String *string); int extern_all_flag; int generate_typedef_flag; int is_function; }; void CLISP::main(int argc, char *argv[]) { int i; Preprocessor_define("SWIGCLISP 1", 0); SWIG_library_directory("clisp"); SWIG_config_file("clisp.swg"); generate_typedef_flag = 0; extern_all_flag = 0; for (i = 1; i < argc; i++) { if (!strcmp(argv[i], "-help")) { Printf(stdout, "%s\n", usage); } else if ((Strcmp(argv[i], "-extern-all") == 0)) { extern_all_flag = 1; Swig_mark_arg(i); } else if ((Strcmp(argv[i], "-generate-typedef") == 0)) { generate_typedef_flag = 1; Swig_mark_arg(i); } } } int CLISP::top(Node *n) { File *f_null = NewString(""); module = Getattr(n, "name"); String *output_filename; entries = NewList(); /* Get the output file name */ String *outfile = Getattr(n, "outfile"); if (!outfile) { Printf(stderr, "Unable to determine outfile\n"); SWIG_exit(EXIT_FAILURE); } output_filename = NewStringf("%s%s.lisp", SWIG_output_directory(), module); f_cl = NewFile(output_filename, "w+", SWIG_output_files()); if (!f_cl) { FileErrorDisplay(output_filename); SWIG_exit(EXIT_FAILURE); } Swig_register_filebyname("header", f_null); Swig_register_filebyname("begin", f_null); Swig_register_filebyname("runtime", f_null); Swig_register_filebyname("wrapper", f_null); String *header = NewString(""); Swig_banner_target_lang(header, ";;"); Printf(header, "\n(defpackage :%s\n (:use :common-lisp :ffi)", module); Language::top(n); Iterator i; long len = Len(entries); if (len > 0) { Printf(header, "\n (:export"); } //else nothing to export for (i = First(entries); i.item; i = Next(i)) { Printf(header, "\n\t:%s", i.item); } if (len > 0) { Printf(header, ")"); } Printf(header, ")\n"); Printf(header, "\n(in-package :%s)\n", module); Printf(header, "\n(default-foreign-language :stdc)\n"); len = Tell(f_cl); Printf(f_cl, "%s", header); long end = Tell(f_cl); for (len--; len >= 0; len--) { end--; (void)Seek(f_cl, len, SEEK_SET); int ch = Getc(f_cl); (void)Seek(f_cl, end, SEEK_SET); Putc(ch, f_cl); } Seek(f_cl, 0, SEEK_SET); Write(f_cl, Char(header), Len(header)); Delete(f_cl); return SWIG_OK; } int CLISP::functionWrapper(Node *n) { is_function = 1; String *storage = Getattr(n, "storage"); if (!extern_all_flag && (!storage || (!Swig_storage_isextern(n) && !Swig_storage_isexternc(n)))) return SWIG_OK; String *func_name = Getattr(n, "sym:name"); ParmList *pl = Getattr(n, "parms"); int argnum = 0, first = 1; Printf(f_cl, "\n(ffi:def-call-out %s\n\t(:name \"%s\")\n", func_name, func_name); Append(entries, func_name); if (ParmList_len(pl) != 0) { Printf(f_cl, "\t(:arguments "); } for (Parm *p = pl; p; p = nextSibling(p), argnum++) { String *argname = Getattr(p, "name"); // SwigType *argtype; String *ffitype = get_ffi_type(n, Getattr(p, "type")); int tempargname = 0; if (!argname) { argname = NewStringf("arg%d", argnum); tempargname = 1; } if (!first) { Printf(f_cl, "\n\t\t"); } Printf(f_cl, "(%s %s)", argname, ffitype); first = 0; Delete(ffitype); if (tempargname) Delete(argname); } if (ParmList_len(pl) != 0) { Printf(f_cl, ")\n"); /* finish arg list */ } String *ffitype = get_ffi_type(n, Getattr(n, "type")); if (Strcmp(ffitype, "NIL")) { //when return type is not nil Printf(f_cl, "\t(:return-type %s)\n", ffitype); } Printf(f_cl, "\t(:library +library-name+))\n"); return SWIG_OK; } int CLISP::constantWrapper(Node *n) { is_function = 0; String *type = Getattr(n, "type"); String *converted_value = convert_literal(Getattr(n, "value"), type); String *name = Getattr(n, "sym:name"); Printf(f_cl, "\n(defconstant %s %s)\n", name, converted_value); Append(entries, name); Delete(converted_value); return SWIG_OK; } int CLISP::variableWrapper(Node *n) { is_function = 0; String *storage = Getattr(n, "storage"); if (!extern_all_flag && (!storage || (!Swig_storage_isextern(n) && !Swig_storage_isexternc(n)))) return SWIG_OK; String *var_name = Getattr(n, "sym:name"); String *lisp_type = get_ffi_type(n, Getattr(n, "type")); Printf(f_cl, "\n(ffi:def-c-var %s\n (:name \"%s\")\n (:type %s)\n", var_name, var_name, lisp_type); Printf(f_cl, "\t(:library +library-name+))\n"); Append(entries, var_name); Delete(lisp_type); return SWIG_OK; } int CLISP::typedefHandler(Node *n) { if (generate_typedef_flag) { is_function = 0; Printf(f_cl, "\n(ffi:def-c-type %s %s)\n", Getattr(n, "name"), get_ffi_type(n, Getattr(n, "type"))); } return Language::typedefHandler(n); } int CLISP::enumDeclaration(Node *n) { if (getCurrentClass() && (cplus_mode != PUBLIC)) return SWIG_NOWRAP; is_function = 0; String *name = Getattr(n, "sym:name"); Printf(f_cl, "\n(ffi:def-c-enum %s ", name); for (Node *c = firstChild(n); c; c = nextSibling(c)) { String *slot_name = Getattr(c, "name"); String *value = Getattr(c, "enumvalue"); Printf(f_cl, "(%s %s)", slot_name, value); Append(entries, slot_name); Delete(value); } Printf(f_cl, ")\n"); return SWIG_OK; } // Includes structs int CLISP::classDeclaration(Node *n) { is_function = 0; String *name = Getattr(n, "sym:name"); String *kind = Getattr(n, "kind"); if (Strcmp(kind, "struct")) { Printf(stderr, "Don't know how to deal with %s kind of class yet.\n", kind); Printf(stderr, " (name: %s)\n", name); SWIG_exit(EXIT_FAILURE); } Printf(f_cl, "\n(ffi:def-c-struct %s", name); Append(entries, NewStringf("make-%s", name)); for (Node *c = firstChild(n); c; c = nextSibling(c)) { if (Strcmp(nodeType(c), "cdecl")) { Printf(stderr, "Structure %s has a slot that we can't deal with.\n", name); Printf(stderr, "nodeType: %s, name: %s, type: %s\n", nodeType(c), Getattr(c, "name"), Getattr(c, "type")); SWIG_exit(EXIT_FAILURE); } String *temp = Copy(Getattr(c, "decl")); if (temp) { Append(temp, Getattr(c, "type")); //appending type to the end, otherwise wrong type String *lisp_type = get_ffi_type(n, temp); Delete(temp); String *slot_name = Getattr(c, "sym:name"); Printf(f_cl, "\n\t(%s %s)", slot_name, lisp_type); Append(entries, NewStringf("%s-%s", name, slot_name)); Delete(lisp_type); } } Printf(f_cl, ")\n"); /* Add this structure to the known lisp types */ //Printf(stdout, "Adding %s foreign type\n", name); // add_defined_foreign_type(name); return SWIG_OK; } /* utilities */ /* returns new string w/ parens stripped */ String *CLISP::strip_parens(String *string) { char *s = Char(string), *p; int len = Len(string); String *res; if (len == 0 || s[0] != '(' || s[len - 1] != ')') { return NewString(string); } p = (char *) malloc(len - 2 + 1); if (!p) { Printf(stderr, "Malloc failed\n"); SWIG_exit(EXIT_FAILURE); } strncpy(p, s + 1, len - 1); p[len - 2] = 0; /* null terminate */ res = NewString(p); free(p); return res; } String *CLISP::convert_literal(String *num_param, String *type) { String *num = strip_parens(num_param), *res; char *s = Char(num); /* Make sure doubles use 'd' instead of 'e' */ if (!Strcmp(type, "double")) { String *updated = Copy(num); if (Replace(updated, "e", "d", DOH_REPLACE_ANY) > 1) { Printf(stderr, "Weird!! number %s looks invalid.\n", num); SWIG_exit(EXIT_FAILURE); } Delete(num); return updated; } if (SwigType_type(type) == T_CHAR) { /* Use CL syntax for character literals */ return NewStringf("#\\%s", num_param); } else if (SwigType_type(type) == T_STRING) { /* Use CL syntax for string literals */ return NewStringf("\"%s\"", num_param); } if (Len(num) < 2 || s[0] != '0') { return num; } /* octal or hex */ res = NewStringf("#%c%s", s[1] == 'x' ? 'x' : 'o', s + 2); Delete(num); return res; } String *CLISP::get_ffi_type(Node *n, SwigType *ty) { Node *node = NewHash(); Setattr(node, "type", ty); Setfile(node, Getfile(n)); Setline(node, Getline(n)); const String *tm = Swig_typemap_lookup("in", node, "", 0); Delete(node); if (tm) { return NewString(tm); } else if (SwigType_ispointer(ty)) { SwigType *cp = Copy(ty); SwigType_del_pointer(cp); String *inner_type = get_ffi_type(n, cp); if (SwigType_isfunction(cp)) { return inner_type; } SwigType *base = SwigType_base(ty); String *base_name = SwigType_str(base, 0); String *str; if (!Strcmp(base_name, "int") || !Strcmp(base_name, "float") || !Strcmp(base_name, "short") || !Strcmp(base_name, "double") || !Strcmp(base_name, "long") || !Strcmp(base_name, "char")) { str = NewStringf("(ffi:c-ptr %s)", inner_type); } else { str = NewStringf("(ffi:c-pointer %s)", inner_type); } Delete(base_name); Delete(base); Delete(cp); Delete(inner_type); return str; } else if (SwigType_isarray(ty)) { SwigType *cp = Copy(ty); String *array_dim = SwigType_array_getdim(ty, 0); if (!Strcmp(array_dim, "")) { //dimension less array convert to pointer Delete(array_dim); SwigType_del_array(cp); SwigType_add_pointer(cp); String *str = get_ffi_type(n, cp); Delete(cp); return str; } else { SwigType_pop_arrays(cp); String *inner_type = get_ffi_type(n, cp); Delete(cp); int ndim = SwigType_array_ndim(ty); String *dimension; if (ndim == 1) { dimension = array_dim; } else { dimension = array_dim; for (int i = 1; i < ndim; i++) { array_dim = SwigType_array_getdim(ty, i); Append(dimension, " "); Append(dimension, array_dim); Delete(array_dim); } String *temp = dimension; dimension = NewStringf("(%s)", dimension); Delete(temp); } String *str; if (is_function) str = NewStringf("(ffi:c-ptr (ffi:c-array %s %s))", inner_type, dimension); else str = NewStringf("(ffi:c-array %s %s)", inner_type, dimension); Delete(inner_type); Delete(dimension); return str; } } else if (SwigType_isfunction(ty)) { SwigType *cp = Copy(ty); SwigType *fn = SwigType_pop_function(cp); String *args = NewString(""); ParmList *pl = SwigType_function_parms(fn, n); if (ParmList_len(pl) != 0) { Printf(args, "(:arguments "); } int argnum = 0, first = 1; for (Parm *p = pl; p; p = nextSibling(p), argnum++) { String *argname = Getattr(p, "name"); SwigType *argtype = Getattr(p, "type"); String *ffitype = get_ffi_type(n, argtype); int tempargname = 0; if (!argname) { argname = NewStringf("arg%d", argnum); tempargname = 1; } if (!first) { Printf(args, "\n\t\t"); } Printf(args, "(%s %s)", argname, ffitype); first = 0; Delete(ffitype); if (tempargname) Delete(argname); } if (ParmList_len(pl) != 0) { Printf(args, ")\n"); /* finish arg list */ } String *ffitype = get_ffi_type(n, cp); String *str = NewStringf("(ffi:c-function %s \t\t\t\t(:return-type %s))", args, ffitype); Delete(fn); Delete(args); Delete(cp); Delete(ffitype); return str; } String *str = SwigType_str(ty, 0); if (str) { char *st = Strstr(str, "struct"); if (st) { st += 7; return NewString(st); } char *cl = Strstr(str, "class"); if (cl) { cl += 6; return NewString(cl); } } return str; } extern "C" Language *swig_clisp(void) { return new CLISP(); } swig-4.0.1/Source/Modules/scilab.cxx0000644000175000017500000012525113527063513017207 0ustar williamwilliam/* ---------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * scilab.cxx * * Scilab language module for SWIG. * --------------------------------------------------------------------------*/ #include "swigmod.h" static const int SCILAB_IDENTIFIER_NAME_CHAR_MAX = 24; static const int SCILAB_VARIABLE_NAME_CHAR_MAX = SCILAB_IDENTIFIER_NAME_CHAR_MAX - 4; static const char *usage = (char *) " \ Scilab options (available with -scilab)\n \ -builder - Generate a Scilab builder script\n \ -buildercflags - Add to the builder compiler flags\n \ -builderflagscript - Set the Scilab script to use by builder to configure the build flags\n \ -builderldflags - Add to the builder linker flags\n \ -buildersources - Add the (comma separated) files to the builder sources\n \ -builderverbositylevel - Set the builder verbosity level to (default 0: off, 2: high)\n \ -gatewayxml - Generate gateway xml with the given \n \ -targetversion - Generate for Scilab target (major) version (default: 5)\n \ \n"; class SCILAB:public Language { protected: /* General objects used for holding the strings */ File *beginSection; File *runtimeSection; File *headerSection; File *wrappersSection; File *initSection; String *variablesCode; int targetVersion; bool generateBuilder; File *builderFile; String *builderCode; int builderFunctionCount; List *sourceFileList; List *cflags; List *ldflags; String *verboseBuildLevel; String *buildFlagsScript; String *gatewayHeader; String *gatewayHeaderV5; String *gatewayHeaderV6; bool createGatewayXML; File *gatewayXMLFile; String *gatewayXML; String *gatewayID; int primitiveID; bool createLoader; File *loaderFile; String *loaderScript; public: /* ------------------------------------------------------------------------ * main() * ----------------------------------------------------------------------*/ virtual void main(int argc, char *argv[]) { targetVersion = 5; generateBuilder = false; sourceFileList = NewList(); cflags = NewList(); ldflags = NewList(); verboseBuildLevel = NULL; buildFlagsScript = NULL; gatewayHeader = NULL; gatewayHeaderV5 = NULL; gatewayHeaderV6 = NULL; createGatewayXML = false; gatewayXML = NULL; gatewayXMLFile = NULL; gatewayID = NULL; createLoader = true; loaderFile = NULL; loaderScript = NULL; /* Manage command line arguments */ for (int argIndex = 1; argIndex < argc; argIndex++) { if (argv[argIndex] != NULL) { if (strcmp(argv[argIndex], "-help") == 0) { Printf(stdout, "%s\n", usage); } else if (strcmp(argv[argIndex], "-builder") == 0) { Swig_mark_arg(argIndex); generateBuilder = true; createLoader = false; } else if (strcmp(argv[argIndex], "-buildersources") == 0) { if (argv[argIndex + 1] != NULL) { Swig_mark_arg(argIndex); char *sourceFile = strtok(argv[argIndex + 1], ","); while (sourceFile != NULL) { Insert(sourceFileList, Len(sourceFileList), sourceFile); sourceFile = strtok(NULL, ","); } Swig_mark_arg(argIndex + 1); } } else if (strcmp(argv[argIndex], "-buildercflags") == 0) { Swig_mark_arg(argIndex); if (argv[argIndex + 1] != NULL) { Insert(cflags, Len(cflags), argv[argIndex + 1]); Swig_mark_arg(argIndex + 1); } } else if (strcmp(argv[argIndex], "-builderldflags") == 0) { Swig_mark_arg(argIndex); if (argv[argIndex + 1] != NULL) { Insert(ldflags, Len(ldflags), argv[argIndex + 1]); Swig_mark_arg(argIndex + 1); } } else if (strcmp(argv[argIndex], "-builderverbositylevel") == 0) { Swig_mark_arg(argIndex); verboseBuildLevel = NewString(argv[argIndex + 1]); Swig_mark_arg(argIndex + 1); } else if (strcmp(argv[argIndex], "-builderflagscript") == 0) { Swig_mark_arg(argIndex); buildFlagsScript = NewString(argv[argIndex + 1]); Swig_mark_arg(argIndex + 1); } else if (strcmp(argv[argIndex], "-gatewayxml") == 0) { Swig_mark_arg(argIndex); createGatewayXML = true; gatewayID = NewString(argv[argIndex + 1]); Swig_mark_arg(argIndex + 1); } else if (strcmp(argv[argIndex], "-targetversion") == 0) { if (argv[argIndex + 1] != NULL) { Swig_mark_arg(argIndex); targetVersion = atoi(argv[argIndex + 1]); Swig_mark_arg(argIndex + 1); } } } } if (verboseBuildLevel == NULL) { verboseBuildLevel = NewString("0"); } /* Set language-specific subdirectory in SWIG library */ SWIG_library_directory("scilab"); /* Add a symbol to the parser for conditional compilation */ Preprocessor_define("SWIGSCILAB 1", 0); /* Set scilab configuration file */ SWIG_config_file("scilab.swg"); /* Set typemap for scilab */ SWIG_typemap_lang("scilab"); allow_overloading(); } /* ------------------------------------------------------------------------ * top() * ----------------------------------------------------------------------*/ virtual int top(Node *node) { /* Get the module name */ String *gatewayName = Getattr(node, "name"); // Set library name String *gatewayLibraryName = NewStringf("lib%s", gatewayName); /* Get the output file name */ String *outputFilename = Getattr(node, "outfile"); /* Initialize I/O */ beginSection = NewFile(outputFilename, "w", SWIG_output_files()); if (!beginSection) { FileErrorDisplay(outputFilename); SWIG_exit(EXIT_FAILURE); } runtimeSection = NewString(""); initSection = NewString(""); headerSection = NewString(""); wrappersSection = NewString(""); /* Register file targets with the SWIG file handler */ Swig_register_filebyname("begin", beginSection); Swig_register_filebyname("header", headerSection); Swig_register_filebyname("wrapper", wrappersSection); Swig_register_filebyname("runtime", runtimeSection); Swig_register_filebyname("init", initSection); /* Output module initialization code */ Swig_banner(beginSection); Printf(runtimeSection, "\n\n#ifndef SWIGSCILAB\n#define SWIGSCILAB\n#endif\n\n"); // Gateway header source merged with wrapper source in nobuilder mode if (!generateBuilder) startGatewayHeader(gatewayLibraryName); // Create builder file if required if (generateBuilder) { createBuilderFile(outputFilename); } // Create gateway XML if required if (createGatewayXML) { createGatewayXMLFile(gatewayName); } // Create loader script if required if (createLoader) { createLoaderFile(gatewayLibraryName); } // Module initialization function String *gatewayInitFunctionName = NewStringf("%s_Init", gatewayName); /* Add initialization function to builder table */ addFunctionToScilab(gatewayInitFunctionName, gatewayInitFunctionName); // Add helper functions to builder table addHelperFunctions(); // Open Scilab wrapper variables creation function variablesCode = NewString(""); Printf(variablesCode, "int SWIG_CreateScilabVariables(void *_pvApiCtx) {"); /* Emit code for children */ if (CPlusPlus) { Printf(wrappersSection, "extern \"C\" {\n"); } Language::top(node); if (CPlusPlus) { Printf(wrappersSection, "}\n"); } // Close Scilab wrapper variables creation function Printf(variablesCode, " return SWIG_OK;\n}\n"); // Add Builder footer code and save if (generateBuilder) { saveBuilderFile(gatewayName); } /* Close the init function and rename with module name */ Printf(initSection, "return 0;\n}\n"); Replaceall(initSection, "", gatewayName); /* Write all to the wrapper file */ SwigType_emit_type_table(runtimeSection, wrappersSection); // Declare pointer types, ... (Ex: SWIGTYPE_p_p_double) // Gateway header source merged with wrapper source in nobuilder mode if (!generateBuilder) { terminateGatewayHeader(gatewayLibraryName); Printv(initSection, gatewayHeader, NIL); } Dump(runtimeSection, beginSection); Dump(headerSection, beginSection); Dump(wrappersSection, beginSection); Dump(variablesCode, beginSection); Wrapper_pretty_print(initSection, beginSection); if (createGatewayXML) { saveGatewayXMLFile(); } if (createLoader) { saveLoaderFile(gatewayLibraryName); } /* Cleanup files */ Delete(runtimeSection); Delete(headerSection); Delete(wrappersSection); Delete(initSection); Delete(beginSection); Delete(sourceFileList); Delete(cflags); Delete(ldflags); return SWIG_OK; } /* ------------------------------------------------------------------------ * emitBanner() * ----------------------------------------------------------------------*/ void emitBanner(File *f) { Printf(f, "// ----------------------------------------------------------------------------\n"); Swig_banner_target_lang(f, "// "); Printf(f, "// ----------------------------------------------------------------------------- */\n\n"); } /* ------------------------------------------------------------------------ * functionWrapper() * ----------------------------------------------------------------------*/ virtual int functionWrapper(Node *node) { /* Get some useful attributes of this function */ String *functionName = Getattr(node, "sym:name"); SwigType *functionReturnType = Getattr(node, "type"); ParmList *functionParamsList = Getattr(node, "parms"); int paramIndex = 0; // Used for loops over ParmsList Parm *param = NULL; // Used for loops over ParamsList /* Create the wrapper object */ Wrapper *wrapper = NewWrapper(); /* Create the function wrapper name */ String *wrapperName = Swig_name_wrapper(functionName); /* Deal with overloading */ String *overloadedName = Copy(wrapperName); /* Determine whether the function is overloaded or not */ bool isOverloaded = ! !Getattr(node, "sym:overloaded"); /* Determine whether the function is the last overloaded */ bool isLastOverloaded = isOverloaded && !Getattr(node, "sym:nextSibling"); if (!isOverloaded && !addSymbol(functionName, node)) { DelWrapper(wrapper); return SWIG_ERROR; } if (isOverloaded) { Append(overloadedName, Getattr(node, "sym:overname")); } /* Write the wrapper function definition (standard Scilab gateway function prototype) */ Printv(wrapper->def, "int ", overloadedName, "(SWIG_GatewayParameters) {", NIL); /* Emit all of the local variables for holding arguments */ // E.g.: double arg1; emit_parameter_variables(functionParamsList, wrapper); /* Attach typemaps to the parameter list */ // Add local variables used in typemaps (iRows, iCols, ...) emit_attach_parmmaps(functionParamsList, wrapper); Setattr(node, "wrap:parms", functionParamsList); /* Check input/output arguments count */ int maxInputArguments = emit_num_arguments(functionParamsList); int minInputArguments = emit_num_required(functionParamsList); int minOutputArguments = 0; int maxOutputArguments = 0; if (!emit_isvarargs(functionParamsList)) { Printf(wrapper->code, "SWIG_CheckInputArgument(pvApiCtx, $mininputarguments, $maxinputarguments);\n"); } else { Printf(wrapper->code, "SWIG_CheckInputArgumentAtLeast(pvApiCtx, $mininputarguments-1);\n"); } Printf(wrapper->code, "SWIG_CheckOutputArgument(pvApiCtx, $minoutputarguments, $maxoutputarguments);\n"); /* Set context */ Printf(wrapper->code, "SWIG_Scilab_SetFuncName(fname);\n"); Printf(wrapper->code, "SWIG_Scilab_SetApiContext(pvApiCtx);\n"); /* Write typemaps(in) */ for (paramIndex = 0, param = functionParamsList; paramIndex < maxInputArguments; ++paramIndex) { // Ignore parameter if the typemap specifies numinputs=0 while (checkAttribute(param, "tmap:in:numinputs", "0")) { param = Getattr(param, "tmap:in:next"); } SwigType *paramType = Getattr(param, "type"); String *paramTypemap = Getattr(param, "tmap:in"); if (paramTypemap) { // Replace $input by the position on Scilab stack String *source = NewString(""); Printf(source, "%d", paramIndex + 1); Setattr(param, "emit:input", source); Replaceall(paramTypemap, "$input", Getattr(param, "emit:input")); if (Getattr(param, "wrap:disown") || (Getattr(param, "tmap:in:disown"))) { Replaceall(paramTypemap, "$disown", "SWIG_POINTER_DISOWN"); } else { Replaceall(paramTypemap, "$disown", "0"); } if (paramIndex >= minInputArguments) { /* Optional input argument management */ Printf(wrapper->code, "if (SWIG_NbInputArgument(pvApiCtx) > %d) {\n%s\n}\n", paramIndex, paramTypemap); } else { Printf(wrapper->code, "%s\n", paramTypemap); } param = Getattr(param, "tmap:in:next"); } else { Swig_warning(WARN_TYPEMAP_IN_UNDEF, input_file, line_number, "Unable to use type %s as a function argument.\n", SwigType_str(paramType, 0)); break; } } /* TODO write constraints */ Setattr(node, "wrap:name", overloadedName); /* Emit the function call */ Swig_director_emit_dynamic_cast(node, wrapper); String *functionActionCode = emit_action(node); /* Insert the return variable */ emit_return_variable(node, functionReturnType, wrapper); /* Return the function value if necessary */ String *functionReturnTypemap = Swig_typemap_lookup_out("out", node, Swig_cresult_name(), wrapper, functionActionCode); if (functionReturnTypemap) { // Result is actually the position of output value on stack if (Len(functionReturnTypemap) > 0) { Printf(wrapper->code, "SWIG_Scilab_SetOutputPosition(%d);\n", 1); } Replaceall(functionReturnTypemap, "$result", "1"); if (GetFlag(node, "feature:new")) { Replaceall(functionReturnTypemap, "$owner", "1"); } else { Replaceall(functionReturnTypemap, "$owner", "0"); } Printf(wrapper->code, "%s\n", functionReturnTypemap); /* If the typemap is not empty, the function return one more argument than the typemaps gives */ if (Len(functionReturnTypemap) > 0) { minOutputArguments++; maxOutputArguments++; } Delete(functionReturnTypemap); } else { Swig_warning(WARN_TYPEMAP_OUT_UNDEF, input_file, line_number, "Unable to use return type %s in function %s.\n", SwigType_str(functionReturnType, 0), functionName); } /* Write typemaps(out) */ for (param = functionParamsList; param;) { String *paramTypemap = Getattr(param, "tmap:argout"); if (paramTypemap) { minOutputArguments++; maxOutputArguments++; Printf(wrapper->code, "SWIG_Scilab_SetOutputPosition(%d);\n", minOutputArguments); String *result = NewString(""); Printf(result, "%d", minOutputArguments); Replaceall(paramTypemap, "$result", result); Printf(wrapper->code, "%s\n", paramTypemap); Delete(paramTypemap); param = Getattr(param, "tmap:argout:next"); } else { param = nextSibling(param); } } /* Add cleanup code */ for (param = functionParamsList; param;) { String *tm; if ((tm = Getattr(param, "tmap:freearg"))) { if (tm && (Len(tm) != 0)) { Replaceall(tm, "$source", Getattr(param, "lname")); Printf(wrapper->code, "%s\n", tm); } param = Getattr(param, "tmap:freearg:next"); } else { param = nextSibling(param); } } /* See if there is any return cleanup code */ String *tm; if ((tm = Swig_typemap_lookup("ret", node, Swig_cresult_name(), 0))) { Replaceall(tm, "$source", Swig_cresult_name()); Printf(wrapper->code, "%s\n", tm); Delete(tm); } /* Close the function(ok) */ Printv(wrapper->code, "return SWIG_OK;\n", NIL); Printv(wrapper->code, "}\n", NIL); /* Add the failure cleanup code */ /* TODO */ /* Final substitutions if applicable */ Replaceall(wrapper->code, "$symname", functionName); /* Set CheckInputArgument and CheckOutputArgument input arguments */ /* In Scilab there is always one output even if not defined */ if (minOutputArguments == 0) { maxOutputArguments = 1; } String *argnumber = NewString(""); Printf(argnumber, "%d", minInputArguments); Replaceall(wrapper->code, "$mininputarguments", argnumber); argnumber = NewString(""); Printf(argnumber, "%d", maxInputArguments); Replaceall(wrapper->code, "$maxinputarguments", argnumber); argnumber = NewString(""); Printf(argnumber, "%d", minOutputArguments); Replaceall(wrapper->code, "$minoutputarguments", argnumber); argnumber = NewString(""); Printf(argnumber, "%d", maxOutputArguments); Replaceall(wrapper->code, "$maxoutputarguments", argnumber); /* Dump the function out */ Wrapper_print(wrapper, wrappersSection); String *scilabFunctionName = checkIdentifierName(functionName, SCILAB_IDENTIFIER_NAME_CHAR_MAX); /* Update builder.sce contents */ if (isLastOverloaded) { addFunctionToScilab(scilabFunctionName, wrapperName); dispatchFunction(node); } if (!isOverloaded) { addFunctionToScilab(scilabFunctionName, wrapperName); } /* tidy up */ Delete(overloadedName); Delete(wrapperName); DelWrapper(wrapper); return SWIG_OK; } /* ----------------------------------------------------------------------- * dispatchFunction() * ----------------------------------------------------------------------- */ void dispatchFunction(Node *node) { Wrapper *wrapper = NewWrapper(); String *functionName = Getattr(node, "sym:name"); String *wrapperName = Swig_name_wrapper(functionName); int maxargs = 0; /* Generate the dispatch function */ String *dispatch = Swig_overload_dispatch(node, "return %s(SWIG_GatewayArguments);", &maxargs); String *tmp = NewString(""); Printv(wrapper->def, "int ", wrapperName, "(SWIG_GatewayParameters) {\n", NIL); /* Get the number of the parameters */ Wrapper_add_local(wrapper, "argc", "int argc = SWIG_NbInputArgument(pvApiCtx)"); Printf(tmp, "int argv[%d] = {", maxargs); for (int j = 0; j < maxargs; ++j) { Printf(tmp, "%s%d", j ? "," : " ", j + 1); } Printf(tmp, "}"); Wrapper_add_local(wrapper, "argv", tmp); Printf(wrapper->code, "SWIG_Scilab_SetApiContext(pvApiCtx);\n"); /* Dump the dispatch function */ Printv(wrapper->code, dispatch, "\n", NIL); Printf(wrapper->code, "Scierror(999, _(\"No matching function for overload\"));\n"); Printf(wrapper->code, "return SWIG_ERROR;\n"); Printv(wrapper->code, "}\n", NIL); Wrapper_print(wrapper, wrappersSection); Delete(tmp); DelWrapper(wrapper); Delete(dispatch); Delete(wrapperName); } /* ----------------------------------------------------------------------- * variableWrapper() * ----------------------------------------------------------------------- */ virtual int variableWrapper(Node *node) { /* Get information about variable */ String *origVariableName = Getattr(node, "name"); // Ex: Shape::nshapes String *variableName = Getattr(node, "sym:name"); // Ex; Shape_nshapes (can be used for function names, ...) // Variable names can have SCILAB_VARIABLE_NAME_CHAR_MAX because of suffixes "_get" or "_set" added to function String *scilabVariableName = checkIdentifierName(variableName, SCILAB_VARIABLE_NAME_CHAR_MAX); /* Manage GET function */ Wrapper *getFunctionWrapper = NewWrapper(); String *getFunctionName = Swig_name_get(NSPACE_TODO, variableName); String *scilabGetFunctionName = Swig_name_get(NSPACE_TODO, scilabVariableName); Setattr(node, "wrap:name", getFunctionName); Printv(getFunctionWrapper->def, "int ", getFunctionName, "(SWIG_GatewayParameters) {\n", NIL); /* Check the number of input and output */ Printf(getFunctionWrapper->def, "SWIG_CheckInputArgument(pvApiCtx, 0, 0);\n"); Printf(getFunctionWrapper->def, "SWIG_CheckOutputArgument(pvApiCtx, 1, 1);\n"); Printf(getFunctionWrapper->def, "SWIG_Scilab_SetApiContext(pvApiCtx);\n"); String *varoutTypemap = Swig_typemap_lookup("varout", node, origVariableName, 0); if (varoutTypemap != NULL) { Printf(getFunctionWrapper->code, "SWIG_Scilab_SetOutputPosition(%d);\n", 1); Replaceall(varoutTypemap, "$value", origVariableName); Replaceall(varoutTypemap, "$result", "1"); emit_action_code(node, getFunctionWrapper->code, varoutTypemap); Delete(varoutTypemap); } Append(getFunctionWrapper->code, "return SWIG_OK;\n"); Append(getFunctionWrapper->code, "}\n"); Wrapper_print(getFunctionWrapper, wrappersSection); /* Add function to builder table */ addFunctionToScilab(scilabGetFunctionName, getFunctionName); /* Manage SET function */ if (is_assignable(node)) { Wrapper *setFunctionWrapper = NewWrapper(); String *setFunctionName = Swig_name_set(NSPACE_TODO, variableName); String *scilabSetFunctionName = Swig_name_set(NSPACE_TODO, scilabVariableName); Setattr(node, "wrap:name", setFunctionName); Printv(setFunctionWrapper->def, "int ", setFunctionName, "(SWIG_GatewayParameters) {\n", NIL); /* Check the number of input and output */ Printf(setFunctionWrapper->def, "SWIG_CheckInputArgument(pvApiCtx, 1, 1);\n"); Printf(setFunctionWrapper->def, "SWIG_CheckOutputArgument(pvApiCtx, 1, 1);\n"); Printf(setFunctionWrapper->def, "SWIG_Scilab_SetApiContext(pvApiCtx);\n"); String *varinTypemap = Swig_typemap_lookup("varin", node, origVariableName, 0); if (varinTypemap != NULL) { Replaceall(varinTypemap, "$input", "1"); emit_action_code(node, setFunctionWrapper->code, varinTypemap); Delete(varinTypemap); } Append(setFunctionWrapper->code, "return SWIG_OK;\n"); Append(setFunctionWrapper->code, "}\n"); Wrapper_print(setFunctionWrapper, wrappersSection); /* Add function to builder table */ addFunctionToScilab(scilabSetFunctionName, setFunctionName); DelWrapper(setFunctionWrapper); } DelWrapper(getFunctionWrapper); return SWIG_OK; } /* ----------------------------------------------------------------------- * constantWrapper() * ----------------------------------------------------------------------- */ virtual int constantWrapper(Node *node) { /* Get the useful information from the node */ String *nodeName = Getattr(node, "name"); SwigType *type = Getattr(node, "type"); String *constantName = Getattr(node, "sym:name"); String *rawValue = Getattr(node, "rawval"); String *constantValue = rawValue ? rawValue : Getattr(node, "value"); String *constantTypemap = NULL; // If feature scilab:const enabled, constants & enums are wrapped to Scilab variables if (GetFlag(node, "feature:scilab:const")) { bool isConstant = ((SwigType_issimple(type)) || (SwigType_type(type) == T_STRING)); bool isEnum = (Cmp(nodeType(node), "enumitem") == 0); if (isConstant || isEnum) { if (isEnum) { Setattr(node, "type", "double"); constantValue = Getattr(node, "value"); } constantTypemap = Swig_typemap_lookup("scilabconstcode", node, nodeName, 0); if (constantTypemap != NULL) { String *scilabConstantName = checkIdentifierName(constantName, SCILAB_IDENTIFIER_NAME_CHAR_MAX); Setattr(node, "wrap:name", constantName); Replaceall(constantTypemap, "$result", scilabConstantName); Replaceall(constantTypemap, "$value", constantValue); emit_action_code(node, variablesCode, constantTypemap); Delete(constantTypemap); return SWIG_OK; } } } /* Create variables for member pointer constants, not supported by typemaps (like Python wrapper does) */ if (SwigType_type(type) == T_MPOINTER) { String *wname = Swig_name_wrapper(constantName); String *str = SwigType_str(type, wname); Printf(headerSection, "static %s = %s;\n", str, constantValue); Delete(str); constantValue = wname; } // Constant names can have SCILAB_VARIABLE_NAME_CHAR_MAX because of suffixes "_get" added to function String *scilabConstantName = checkIdentifierName(constantName, SCILAB_VARIABLE_NAME_CHAR_MAX); /* Create GET function to get the constant value */ Wrapper *getFunctionWrapper = NewWrapper(); String *getFunctionName = Swig_name_get(NSPACE_TODO, constantName); String *scilabGetFunctionName = Swig_name_get(NSPACE_TODO, scilabConstantName); Setattr(node, "wrap:name", getFunctionName); Printv(getFunctionWrapper->def, "int ", getFunctionName, "(SWIG_GatewayParameters) {\n", NIL); /* Check the number of input and output */ Printf(getFunctionWrapper->def, "SWIG_CheckInputArgument(pvApiCtx, 0, 0);\n"); Printf(getFunctionWrapper->def, "SWIG_CheckOutputArgument(pvApiCtx, 1, 1);\n"); Printf(getFunctionWrapper->def, "SWIG_Scilab_SetApiContext(pvApiCtx);\n"); constantTypemap = Swig_typemap_lookup("constcode", node, nodeName, 0); if (constantTypemap != NULL) { Printf(getFunctionWrapper->code, "SWIG_Scilab_SetOutputPosition(%d);\n", 1); Replaceall(constantTypemap, "$value", constantValue); Replaceall(constantTypemap, "$result", "1"); emit_action_code(node, getFunctionWrapper->code, constantTypemap); Delete(constantTypemap); } /* Dump the wrapper function */ Append(getFunctionWrapper->code, "return SWIG_OK;\n"); Append(getFunctionWrapper->code, "}\n"); Wrapper_print(getFunctionWrapper, wrappersSection); /* Add the function to Scilab */ addFunctionToScilab(scilabGetFunctionName, getFunctionName); DelWrapper(getFunctionWrapper); return SWIG_OK; } /* --------------------------------------------------------------------- * enumvalueDeclaration() * --------------------------------------------------------------------- */ virtual int enumvalueDeclaration(Node *node) { static int iPreviousEnumValue = 0; if (GetFlag(node, "feature:scilab:const")) { // Compute the "absolute" value of enum if needed // (most of time enum values are a linked list of relative values) String *enumValue = Getattr(node, "enumvalue"); String *enumValueEx = Getattr(node, "enumvalueex"); // First enum value ? String *firstenumitem = Getattr(node, "firstenumitem"); if (firstenumitem) { if (enumValue) { // Value is in 'enumvalue' iPreviousEnumValue = atoi(Char(enumValue)); } else if (enumValueEx) { // Or value is in 'enumValueEx' iPreviousEnumValue = atoi(Char(enumValueEx)); enumValue = NewString(""); Printf(enumValue, "%d", iPreviousEnumValue); Setattr(node, "enumvalue", enumValue); } } else if (!enumValue && enumValueEx) { // Value is not specified, set it by incrementing last value enumValue = NewString(""); Printf(enumValue, "%d", ++iPreviousEnumValue); Setattr(node, "enumvalue", enumValue); } // Enums in Scilab are mapped to double Setattr(node, "type", "double"); } return Language::enumvalueDeclaration(node); } /* --------------------------------------------------------------------- * membervariableHandler() * --------------------------------------------------------------------- */ virtual int membervariableHandler(Node *node) { checkMemberIdentifierName(node, SCILAB_VARIABLE_NAME_CHAR_MAX); return Language::membervariableHandler(node); } /* ----------------------------------------------------------------------- * checkIdentifierName() * If Scilab target version is lower than 6: * truncates (and displays a warning) too long member identifier names * (applies on members of structs, classes...) * (Scilab 5 identifier names are limited to 24 chars max) * ----------------------------------------------------------------------- */ String *checkIdentifierName(String *name, int char_size_max) { String *scilabIdentifierName; if (targetVersion <= 5) { if (Len(name) > char_size_max) { scilabIdentifierName = DohNewStringWithSize(name, char_size_max); Swig_warning(WARN_SCILAB_TRUNCATED_NAME, input_file, line_number, "Identifier name '%s' exceeds 24 characters and has been truncated to '%s'.\n", name, scilabIdentifierName); } else scilabIdentifierName = name; } else { scilabIdentifierName = DohNewString(name); } return scilabIdentifierName; } /* ----------------------------------------------------------------------- * checkMemberIdentifierName() * If Scilab target version is lower than 6: * truncates (and displays a warning) too long member identifier names * (applies on members of structs, classes...) * (Scilab 5 identifier names are limited to 24 chars max) * ----------------------------------------------------------------------- */ void checkMemberIdentifierName(Node *node, int char_size_max) { if (targetVersion <= 5) { String *memberName = Getattr(node, "sym:name"); Node *containerNode = parentNode(node); String *containerName = Getattr(containerNode, "sym:name"); int lenContainerName = Len(containerName); int lenMemberName = Len(memberName); if (lenContainerName + lenMemberName + 1 > char_size_max) { int lenScilabMemberName = char_size_max - lenContainerName - 1; if (lenScilabMemberName > 0) { String *scilabMemberName = DohNewStringWithSize(memberName, lenScilabMemberName); Setattr(node, "sym:name", scilabMemberName); Swig_warning(WARN_SCILAB_TRUNCATED_NAME, input_file, line_number, "Wrapping functions names for member '%s.%s' will exceed 24 characters, " "so member name has been truncated to '%s'.\n", containerName, memberName, scilabMemberName); } else { Swig_error(input_file, line_number, "Wrapping functions names for member '%s.%s' will exceed 24 characters, " "please rename the container of member '%s'.\n", containerName, memberName, containerName); } } } } /* ----------------------------------------------------------------------- * addHelperFunctions() * ----------------------------------------------------------------------- */ void addHelperFunctions() { addFunctionToScilab("SWIG_this", "SWIG_this"); addFunctionToScilab("SWIG_ptr", "SWIG_ptr"); } /* ----------------------------------------------------------------------- * addFunctionToScilab() * Declare a wrapped function in Scilab (builder, gateway, XML, ...) * ----------------------------------------------------------------------- */ void addFunctionToScilab(const_String_or_char_ptr scilabFunctionName, const_String_or_char_ptr wrapperFunctionName) { if (!generateBuilder) addFunctionInGatewayHeader(scilabFunctionName, wrapperFunctionName); if (generateBuilder) { addFunctionInScriptTable(scilabFunctionName, wrapperFunctionName, builderCode); } if (createLoader) { addFunctionInLoader(scilabFunctionName); } if (gatewayXMLFile) { Printf(gatewayXML, "\n", gatewayID, primitiveID++, scilabFunctionName); } } /* ----------------------------------------------------------------------- * createBuilderCode() * ----------------------------------------------------------------------- */ void createBuilderFile(String *outputFilename) { String *builderFilename = NewStringf("builder.sce"); builderFile = NewFile(builderFilename, "w", SWIG_output_files()); if (!builderFile) { FileErrorDisplay(builderFilename); SWIG_exit(EXIT_FAILURE); } emitBanner(builderFile); builderFunctionCount = 0; builderCode = NewString(""); Printf(builderCode, "mode(-1);\n"); Printf(builderCode, "lines(0);\n"); /* Useful for automatic tests */ // Scilab needs to be in the build directory Printf(builderCode, "originaldir = pwd();\n"); Printf(builderCode, "builddir = get_absolute_file_path('builder.sce');\n"); Printf(builderCode, "cd(builddir);\n"); Printf(builderCode, "ilib_verbose(%s);\n", verboseBuildLevel); Printf(builderCode, "libs = [];\n"); // Flags from command line arguments Printf(builderCode, "cflags = \"\";\n"); for (int i = 0; i < Len(cflags); i++) { String *cflag = Getitem(cflags, i); Printf(builderCode, "cflags = cflags + \" %s\";\n", cflag); } if (Len(ldflags) > 0) { for (int i = 0; i < Len(ldflags); i++) { String *ldflag = Getitem(ldflags, i); if (i == 0) { Printf(builderCode, "ldflags = \"%s\";\n", ldflag); } else { Printf(builderCode, "ldflags = ldflags + \" %s\";\n", ldflag); } } } else { Printf(builderCode, "ldflags = \"\";\n"); } // External script to set flags if (buildFlagsScript) { Printf(builderCode, "exec(\"%s\");\n", buildFlagsScript); Printf(builderCode, "cflags = cflags + getCompilationFlags();\n"); Printf(builderCode, "ldflags = ldflags + getLinkFlags();\n"); } // Additional sources Insert(sourceFileList, 0, outputFilename); for (int i = 0; i < Len(sourceFileList); i++) { String *sourceFile = Getitem(sourceFileList, i); if (i == 0) { Printf(builderCode, "files = \"%s\";\n", sourceFile); } else { Printf(builderCode, "files($ + 1) = \"%s\";\n", sourceFile); } } Printf(builderCode, "table = ["); } /* ----------------------------------------------------------------------- * addFunctionInBuilderCode() * Add a function wrapper in the function table of generated builder script * ----------------------------------------------------------------------- */ void addFunctionInScriptTable(const_String_or_char_ptr scilabFunctionName, const_String_or_char_ptr wrapperFunctionName, String *scriptCode) { if (++builderFunctionCount % 10 == 0) { Printf(scriptCode, "];\ntable = [table;"); } Printf(scriptCode, "\"%s\",\"%s\";", scilabFunctionName, wrapperFunctionName); } /* ----------------------------------------------------------------------- * saveBuilderFile() * ----------------------------------------------------------------------- */ void saveBuilderFile(String *gatewayName) { Printf(builderCode, "];\n"); Printf(builderCode, "ierr = 0;\n"); Printf(builderCode, "if ~isempty(table) then\n"); Printf(builderCode, " ierr = execstr(\"ilib_build(''%s'', table, files, libs, [], ldflags, cflags);\", 'errcatch');\n", gatewayName); Printf(builderCode, " if ierr <> 0 then\n"); Printf(builderCode, " err_msg = lasterror();\n"); Printf(builderCode, " end\n"); Printf(builderCode, "end\n"); Printf(builderCode, "cd(originaldir);\n"); Printf(builderCode, "if ierr <> 0 then\n"); Printf(builderCode, " error(ierr, err_msg);\n"); Printf(builderCode, "end\n"); Printv(builderFile, builderCode, NIL); Delete(builderFile); } /* ----------------------------------------------------------------------- * createGatewayXMLFile() * This XML file is used by Scilab in the context of internal modules * ----------------------------------------------------------------------- */ void createGatewayXMLFile(String *gatewayName) { String *gatewayXMLFilename = NewStringf("%s_gateway.xml", gatewayName); gatewayXMLFile = NewFile(gatewayXMLFilename, "w", SWIG_output_files()); if (!gatewayXMLFile) { FileErrorDisplay(gatewayXMLFilename); SWIG_exit(EXIT_FAILURE); } // Add a slightly modified SWIG banner to the gateway XML ("--modify" is illegal in XML) gatewayXML = NewString(""); Printf(gatewayXML, "\n"); Printf(gatewayXML, "\n"); Printf(gatewayXML, "\n", gatewayName); primitiveID = 1; } /* ----------------------------------------------------------------------- * saveGatewayXMLFile() * ----------------------------------------------------------------------- */ void saveGatewayXMLFile() { Printf(gatewayXML, "\n"); Printv(gatewayXMLFile, gatewayXML, NIL); Delete(gatewayXMLFile); } /* ----------------------------------------------------------------------- * startGatewayHeader() * Start the gateway header * ----------------------------------------------------------------------- */ void startGatewayHeader(String *gatewayLibraryName) { gatewayHeader = NewString(""); Printf(gatewayHeader, "\n"); gatewayHeaderV6 = NewString(""); Printf(gatewayHeaderV6, "#ifdef __cplusplus\n"); Printf(gatewayHeaderV6, "extern \"C\" {\n"); Printf(gatewayHeaderV6, "#endif\n"); Printf(gatewayHeaderV6, "#include \"c_gateway_prototype.h\"\n"); Printf(gatewayHeaderV6, "#include \"addfunction.h\"\n"); Printf(gatewayHeaderV6, "#ifdef __cplusplus\n"); Printf(gatewayHeaderV6, "}\n"); Printf(gatewayHeaderV6, "#endif\n"); Printf(gatewayHeaderV6, "\n"); Printf(gatewayHeaderV6, "#define MODULE_NAME L\"%s\"\n", gatewayLibraryName); Printf(gatewayHeaderV6, "#ifdef __cplusplus\n"); Printf(gatewayHeaderV6, "extern \"C\"\n"); Printf(gatewayHeaderV6, "#endif\n"); Printf(gatewayHeaderV6, "int %s(wchar_t *pwstFuncName) {\n", gatewayLibraryName); Printf(gatewayHeaderV6, "\n"); } /* ----------------------------------------------------------------------- * addFunctionInGatewayHeader() * Add a function in the gateway header * ----------------------------------------------------------------------- */ void addFunctionInGatewayHeader(const_String_or_char_ptr scilabFunctionName, const_String_or_char_ptr wrapperFunctionName) { if (gatewayHeaderV5 == NULL) { gatewayHeaderV5 = NewString(""); Printf(gatewayHeaderV5, "static GenericTable Tab[] = {\n"); } else Printf(gatewayHeaderV5, ",\n"); Printf(gatewayHeaderV5, " {(Myinterfun)sci_gateway, (GT)%s, (char *)\"%s\"}", wrapperFunctionName, scilabFunctionName); Printf(gatewayHeaderV6, "if (wcscmp(pwstFuncName, L\"%s\") == 0) { addCStackFunction((wchar_t *)L\"%s\", &%s, (wchar_t *)MODULE_NAME); }\n", scilabFunctionName, scilabFunctionName, wrapperFunctionName); } /* ----------------------------------------------------------------------- * terminateGatewayHeader() * Terminates the gateway header * ----------------------------------------------------------------------- */ void terminateGatewayHeader(String *gatewayLibraryName) { Printf(gatewayHeaderV5, "};\n"); Printf(gatewayHeaderV5, "\n"); Printf(gatewayHeaderV5, "#ifdef __cplusplus\n"); Printf(gatewayHeaderV5, "extern \"C\" {\n"); Printf(gatewayHeaderV5, "#endif\n"); Printf(gatewayHeaderV5, "int C2F(%s)() {\n", gatewayLibraryName); Printf(gatewayHeaderV5, " Rhs = Max(0, Rhs);\n"); Printf(gatewayHeaderV5, " if (*(Tab[Fin-1].f) != NULL) {\n"); Printf(gatewayHeaderV5, " if(pvApiCtx == NULL) {\n"); Printf(gatewayHeaderV5, " pvApiCtx = (StrCtx *)MALLOC(sizeof(StrCtx));\n"); Printf(gatewayHeaderV5, " }\n"); Printf(gatewayHeaderV5, " pvApiCtx->pstName = (char *)Tab[Fin-1].name;\n"); Printf(gatewayHeaderV5, " (*(Tab[Fin-1].f))(Tab[Fin-1].name,(GatefuncH)Tab[Fin-1].F);\n"); Printf(gatewayHeaderV5, " }\n"); Printf(gatewayHeaderV5, " return 0;\n"); Printf(gatewayHeaderV5, "}\n"); Printf(gatewayHeaderV5, "\n"); Printf(gatewayHeaderV5, "#ifdef __cplusplus\n"); Printf(gatewayHeaderV5, "}\n"); Printf(gatewayHeaderV5, "#endif\n"); Printf(gatewayHeaderV6, "return 1;\n"); Printf(gatewayHeaderV6, "};\n"); Printf(gatewayHeader, "#if SWIG_SCILAB_VERSION >= 600\n"); Printv(gatewayHeader, gatewayHeaderV6, NIL); Printf(gatewayHeader, "#else\n"); Printv(gatewayHeader, gatewayHeaderV5, NIL); Printf(gatewayHeader, "#endif\n"); } /* ----------------------------------------------------------------------- * createLoaderScriptFile() * Creates the loader script file (loader.sce) * ----------------------------------------------------------------------- */ void createLoaderFile(String *gatewayLibraryName) { String *loaderFilename = NewString("loader.sce"); loaderFile = NewFile(loaderFilename, "w", SWIG_output_files()); if (!loaderFile) { FileErrorDisplay(loaderFilename); SWIG_exit(EXIT_FAILURE); } emitBanner(loaderFile); loaderScript = NewString(""); Printf(loaderScript, "%s_path = get_absolute_file_path('loader.sce');\n", gatewayLibraryName); Printf(loaderScript, "[bOK, ilib] = c_link('%s');\n", gatewayLibraryName); Printf(loaderScript, "if bOK then\n"); Printf(loaderScript, " ulink(ilib);\n"); Printf(loaderScript, "end\n"); Printf(loaderScript, "list_functions = [..\n"); } /* ----------------------------------------------------------------------- * addFunctionInLoaderScript() * Add a function in the loader script table * ----------------------------------------------------------------------- */ void addFunctionInLoader(const_String_or_char_ptr scilabFunctionName) { Printf(loaderScript, " '%s'; ..\n", scilabFunctionName); } /* ----------------------------------------------------------------------- * saveLoaderScriptFile() * Terminates and saves the loader script * ----------------------------------------------------------------------- */ void saveLoaderFile(String *gatewayLibraryName) { Printf(loaderScript, "];\n"); Printf(loaderScript, "addinter(fullfile(%s_path, '%s' + getdynlibext()), '%s', list_functions);\n", gatewayLibraryName, gatewayLibraryName, gatewayLibraryName); Printf(loaderScript, "clear %s_path;\n", gatewayLibraryName); Printf(loaderScript, "clear bOK;\n"); Printf(loaderScript, "clear ilib;\n"); Printf(loaderScript, "clear list_functions;\n"); Printv(loaderFile, loaderScript, NIL); Delete(loaderFile); } }; extern "C" Language *swig_scilab(void) { return new SCILAB(); } swig-4.0.1/Source/Modules/ocaml.cxx0000644000175000017500000017531313527063513017051 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * ocaml.cxx * * Ocaml language module for SWIG. * ----------------------------------------------------------------------------- */ #include "swigmod.h" #include static const char *usage = "\ Ocaml Options (available with -ocaml)\n\ -oldvarnames - Old intermediary method names for variable wrappers\n\ -prefix - Set a prefix to be prepended to all names\n\ -suffix - Deprecated alias for general option -cppext\n\ -where - Emit library location\n\ \n"; static int classmode = 0; static int in_constructor = 0, in_destructor = 0, in_copyconst = 0; static int const_enum = 0; static int static_member_function = 0; static int generate_sizeof = 0; static String *prefix = 0; static const char *ocaml_path = "ocaml"; static bool old_variable_names = false; static String *classname = 0; static String *module = 0; static String *init_func_def = 0; static String *f_classtemplate = 0; static SwigType *name_qualifier_type = 0; static Hash *seen_enums = 0; static Hash *seen_enumvalues = 0; static Hash *seen_constructors = 0; static File *f_header = 0; static File *f_begin = 0; static File *f_runtime = 0; static File *f_wrappers = 0; static File *f_directors = 0; static File *f_directors_h = 0; static File *f_init = 0; static File *f_mlout = 0; static File *f_mliout = 0; static File *f_mlbody = 0; static File *f_mlibody = 0; static File *f_mltail = 0; static File *f_mlitail = 0; static File *f_enumtypes_type = 0; static File *f_enumtypes_value = 0; static File *f_class_ctors = 0; static File *f_class_ctors_end = 0; static File *f_enum_to_int = 0; static File *f_int_to_enum = 0; class OCAML:public Language { public: OCAML() { director_prot_ctor_code = NewString(""); Printv(director_prot_ctor_code, "if ( $comparison ) { /* subclassed */\n", " $director_new \n", "} else {\n", " caml_failwith(\"accessing abstract class or protected constructor\"); \n", "}\n", NIL); director_multiple_inheritance = 1; director_language = 1; } String *Swig_class_name(Node *n) { String *name; name = Copy(Getattr(n, "sym:name")); return name; } void PrintIncludeArg() { Printv(stdout, SWIG_LIB, SWIG_FILE_DELIMITER, ocaml_path, "\n", NIL); } /* ------------------------------------------------------------ * main() * ------------------------------------------------------------ */ virtual void main(int argc, char *argv[]) { int i; prefix = 0; SWIG_library_directory(ocaml_path); // Look for certain command line options for (i = 1; i < argc; i++) { if (argv[i]) { if (strcmp(argv[i], "-help") == 0) { fputs(usage, stdout); SWIG_exit(0); } else if (strcmp(argv[i], "-where") == 0) { PrintIncludeArg(); SWIG_exit(0); } else if (strcmp(argv[i], "-prefix") == 0) { if (argv[i + 1]) { prefix = NewString(argv[i + 1]); Swig_mark_arg(i); Swig_mark_arg(i + 1); i++; } else { Swig_arg_error(); } } else if (strcmp(argv[i], "-suffix") == 0) { if (argv[i + 1]) { Printf(stderr, "swig: warning: -suffix option deprecated. SWIG 3.0.4 and later provide a -cppext option which should be used instead.\n"); SWIG_config_cppext(argv[i + 1]); Swig_mark_arg(i); Swig_mark_arg(i + 1); i++; } else Swig_arg_error(); } else if (strcmp(argv[i], "-oldvarnames") == 0) { Swig_mark_arg(i); old_variable_names = true; } } } // If a prefix has been specified make sure it ends in a '_' (not actually used!) if (prefix) { const char *px = Char(prefix); if (px[Len(prefix) - 1] != '_') Printf(prefix, "_"); } else prefix = NewString("swig_"); // Add a symbol for this module Preprocessor_define("SWIGOCAML 1", 0); // Set name of typemaps SWIG_typemap_lang("ocaml"); // Read in default typemaps */ SWIG_config_file("ocaml.i"); allow_overloading(); } /* Swig_director_declaration() * * Generate the full director class declaration, complete with base classes. * e.g. "class SwigDirector_myclass : public myclass, public Swig::Director {" * */ String *Swig_director_declaration(Node *n) { String *classname = Swig_class_name(n); String *directorname = NewStringf("SwigDirector_%s", classname); String *base = Getattr(n, "classtype"); String *declaration = Swig_class_declaration(n, directorname); Printf(declaration, " : public %s, public Swig::Director {\n", base); Delete(classname); Delete(directorname); return declaration; } void emitBanner(File *f) { Printf(f, "(* ----------------------------------------------------------------------------\n"); Swig_banner_target_lang(f, " *"); Printf(f, " * ---------------------------------------------------------------------------- *)\n\n"); } /* ------------------------------------------------------------ * top() * * Recognize the %module, and capture the module name. * Create the default enum cases. * Set up the named outputs: * * init * ml * mli * wrapper * header * runtime * directors * directors_h * ------------------------------------------------------------ */ virtual int top(Node *n) { /* Set comparison with none for ConstructorToFunction */ setSubclassInstanceCheck(NewString("caml_list_nth(args,0) != Val_unit")); /* check if directors are enabled for this module. note: this * is a "master" switch, without which no director code will be * emitted. %feature("director") statements are also required * to enable directors for individual classes or methods. * * use %module(directors="1") modulename at the start of the * interface file to enable director generation. */ String *mod_docstring = NULL; { Node *module = Getattr(n, "module"); if (module) { Node *options = Getattr(module, "options"); if (options) { if (Getattr(options, "directors")) { allow_directors(); } if (Getattr(options, "dirprot")) { allow_dirprot(); } if (Getattr(options, "sizeof")) { generate_sizeof = 1; } mod_docstring = Getattr(options, "docstring"); } } } /* Initialize all of the output files */ String *outfile = Getattr(n, "outfile"); f_begin = NewFile(outfile, "w", SWIG_output_files()); if (!f_begin) { FileErrorDisplay(outfile); SWIG_exit(EXIT_FAILURE); } f_runtime = NewString(""); f_init = NewString(""); f_header = NewString(""); f_wrappers = NewString(""); f_directors = NewString(""); f_directors_h = NewString(""); f_enumtypes_type = NewString(""); f_enumtypes_value = NewString(""); init_func_def = NewString(""); f_mlbody = NewString(""); f_mlibody = NewString(""); f_mltail = NewString(""); f_mlitail = NewString(""); f_class_ctors = NewString(""); f_class_ctors_end = NewString(""); f_enum_to_int = NewString(""); f_int_to_enum = NewString(""); f_classtemplate = NewString(""); module = Getattr(n, "name"); seen_constructors = NewHash(); seen_enums = NewHash(); seen_enumvalues = NewHash(); /* Register file targets with the SWIG file handler */ Swig_register_filebyname("init", init_func_def); Swig_register_filebyname("header", f_header); Swig_register_filebyname("wrapper", f_wrappers); Swig_register_filebyname("begin", f_begin); Swig_register_filebyname("runtime", f_runtime); Swig_register_filebyname("mli", f_mlibody); Swig_register_filebyname("ml", f_mlbody); Swig_register_filebyname("mlitail", f_mlitail); Swig_register_filebyname("mltail", f_mltail); Swig_register_filebyname("director", f_directors); Swig_register_filebyname("director_h", f_directors_h); Swig_register_filebyname("classtemplate", f_classtemplate); Swig_register_filebyname("class_ctors", f_class_ctors); if (old_variable_names) { Swig_name_register("set", "%n%v__set__"); Swig_name_register("get", "%n%v__get__"); } Swig_banner(f_begin); Printf(f_runtime, "\n\n#ifndef SWIGOCAML\n#define SWIGOCAML\n#endif\n\n"); Printf(f_runtime, "#define SWIG_MODULE \"%s\"\n", module); /* Module name */ Printf(f_mlbody, "let module_name = \"%s\"\n", module); Printf(f_mlibody, "val module_name : string\n"); Printf(f_enum_to_int, "let enum_to_int x (v : c_obj) =\n" " match v with\n" " C_enum _y ->\n" " (let y = _y in match (x : c_enum_type) with\n" " `unknown -> " " (match y with\n" " `Int x -> (Swig.C_int x)\n" " | _ -> raise (LabelNotFromThisEnum v))\n"); Printf(f_int_to_enum, "let int_to_enum x y =\n" " match (x : c_enum_type) with\n" " `unknown -> C_enum (`Int y)\n"); if (directorsEnabled()) { Printf(f_runtime, "#define SWIG_DIRECTORS\n"); } Printf(f_runtime, "\n"); /* Produce the enum_to_int and int_to_enum functions */ Printf(f_enumtypes_type, "open Swig\n" "type c_enum_type = [ \n `unknown\n"); Printf(f_enumtypes_value, "type c_enum_value = [ \n `Int of int\n"); String *mlfile = NewString(""); String *mlifile = NewString(""); Printv(mlfile, module, ".ml", NIL); Printv(mlifile, module, ".mli", NIL); String *mlfilen = NewStringf("%s%s", SWIG_output_directory(), mlfile); if ((f_mlout = NewFile(mlfilen, "w", SWIG_output_files())) == 0) { FileErrorDisplay(mlfilen); SWIG_exit(EXIT_FAILURE); } String *mlifilen = NewStringf("%s%s", SWIG_output_directory(), mlifile); if ((f_mliout = NewFile(mlifilen, "w", SWIG_output_files())) == 0) { FileErrorDisplay(mlifilen); SWIG_exit(EXIT_FAILURE); } emitBanner(f_mlout); emitBanner(f_mliout); Language::top(n); if (mod_docstring) { if (Len(mod_docstring)) { Printv(f_mliout, "(** ", mod_docstring, " *)\n", NIL); } Delete(mod_docstring); mod_docstring = NULL; } Printf(f_enum_to_int, ") | _ -> (C_int (get_int v))\n" "let _ = Callback.register \"%s_enum_to_int\" enum_to_int\n", module); Printf(f_mlibody, "val enum_to_int : c_enum_type -> c_obj -> Swig.c_obj\n"); Printf(f_int_to_enum, "let _ = Callback.register \"%s_int_to_enum\" int_to_enum\n", module); Printf(f_mlibody, "val int_to_enum : c_enum_type -> int -> c_obj\n"); Printf(f_init, "#define SWIG_init f_%s_init\n" "%s" "}\n", module, init_func_def); Printf(f_mlbody, "external f_init : unit -> unit = \"f_%s_init\" ;;\n" "let _ = f_init ()\n", module); Printf(f_enumtypes_type, "]\n"); Printf(f_enumtypes_value, "]\n\n" "type c_obj = c_enum_value c_obj_t\n"); if (directorsEnabled()) { // Insert director runtime into the f_runtime file (make it occur before %header section) Swig_insert_file("director_common.swg", f_runtime); Swig_insert_file("director.swg", f_runtime); } SwigType_emit_type_table(f_runtime, f_wrappers); /* Close all of the files */ Dump(f_runtime, f_begin); Dump(f_directors_h, f_header); Dump(f_header, f_begin); Dump(f_directors, f_wrappers); Dump(f_wrappers, f_begin); Wrapper_pretty_print(f_init, f_begin); Delete(f_header); Delete(f_wrappers); Delete(f_init); Delete(f_runtime); Delete(f_begin); Dump(f_enumtypes_type, f_mlout); Dump(f_enumtypes_value, f_mlout); Dump(f_mlbody, f_mlout); Dump(f_enum_to_int, f_mlout); Dump(f_int_to_enum, f_mlout); Delete(f_int_to_enum); Delete(f_enum_to_int); Dump(f_class_ctors, f_mlout); Dump(f_class_ctors_end, f_mlout); Dump(f_mltail, f_mlout); Delete(f_mlout); Dump(f_enumtypes_type, f_mliout); Dump(f_enumtypes_value, f_mliout); Dump(f_mlibody, f_mliout); Dump(f_mlitail, f_mliout); Delete(f_mliout); return SWIG_OK; } /* Produce an error for the given type */ void throw_unhandled_ocaml_type_error(SwigType *d, const char *types) { Swig_warning(WARN_TYPEMAP_UNDEF, input_file, line_number, "Unable to handle type %s (%s).\n", SwigType_str(d, 0), types); } /* Return true iff T is a pointer type */ int is_a_pointer(SwigType *t) { return SwigType_ispointer(SwigType_typedef_resolve_all(t)); } /* * Delete one reference from a given type. */ void oc_SwigType_del_reference(SwigType *t) { char *c = Char(t); if (strncmp(c, "q(", 2) == 0) { Delete(SwigType_pop(t)); c = Char(t); } if (strncmp(c, "r.", 2)) { printf("Fatal error. SwigType_del_pointer applied to non-pointer.\n"); abort(); } Replace(t, "r.", "", DOH_REPLACE_ANY | DOH_REPLACE_FIRST); } void oc_SwigType_del_array(SwigType *t) { char *c = Char(t); if (strncmp(c, "q(", 2) == 0) { Delete(SwigType_pop(t)); c = Char(t); } if (strncmp(c, "a(", 2) == 0) { Delete(SwigType_pop(t)); } } /* * Return true iff T is a reference type */ int is_a_reference(SwigType *t) { return SwigType_isreference(SwigType_typedef_resolve_all(t)); } int is_an_array(SwigType *t) { return SwigType_isarray(SwigType_typedef_resolve_all(t)); } virtual int membervariableHandler(Node *n) { String *symname = Getattr(n, "sym:name"); Language::membervariableHandler(n); String *mname = Swig_name_member(NSPACE_TODO, classname, symname); String *getname = Swig_name_get(NSPACE_TODO, mname); String *mangled_getname = mangleNameForCaml(getname); Delete(getname); if (!GetFlag(n, "feature:immutable")) { String *setname = Swig_name_set(NSPACE_TODO, mname); String *mangled_setname = mangleNameForCaml(setname); Delete(setname); Printf(f_class_ctors, " \"[%s]\", (fun args -> " "if args = (C_list [ raw_ptr ]) then _%s args else _%s args) ;\n", symname, mangled_getname, mangled_setname); Delete(mangled_setname); } else { Printf(f_class_ctors, " \"[%s]\", (fun args -> " "if args = (C_list [ raw_ptr ]) then _%s args else C_void) ;\n", symname, mangled_getname); } Delete(mangled_getname); Delete(mname); return SWIG_OK; } /* ------------------------------------------------------------ * functionWrapper() * Create a function declaration and register it with the interpreter. * ------------------------------------------------------------ */ virtual int functionWrapper(Node *n) { char *iname = GetChar(n, "sym:name"); SwigType *d = Getattr(n, "type"); String *return_type_normalized = normalizeTemplatedClassName(d); ParmList *l = Getattr(n, "parms"); int director_method = 0; Parm *p; Wrapper *f = NewWrapper(); String *proc_name = NewString(""); String *target = NewString(""); String *arg = NewString(""); String *cleanup = NewString(""); String *outarg = NewString(""); String *build = NewString(""); String *tm; int i = 0; int numargs; int numreq; int newobj = GetFlag(n, "feature:new"); String *nodeType = Getattr(n, "nodeType"); int destructor = (!Cmp(nodeType, "destructor")); String *overname = 0; bool isOverloaded = Getattr(n, "sym:overloaded") ? true : false; // For overloaded functions, only the dispatch function needs to be exposed in the ml and mli files. bool expose_func = !isOverloaded || !Getattr(n, "sym:nextSibling"); // Make a wrapper name for this String *wname = Swig_name_wrapper(iname); if (isOverloaded) { overname = Getattr(n, "sym:overname"); } else { if (!addSymbol(iname, n)) { DelWrapper(f); return SWIG_ERROR; } } if (overname) { Append(wname, overname); } /* Do this to disambiguate functions emitted from different modules */ Append(wname, module); Setattr(n, "wrap:name", wname); // Build the name for Scheme. Printv(proc_name, "_", iname, NIL); String *mangled_name = mangleNameForCaml(proc_name); if (classmode && in_constructor && expose_func) { // Emit constructor for object String *mangled_name_nounder = NewString((char *) (Char(mangled_name)) + 1); Printf(f_class_ctors_end, "let %s clst = _%s clst\n", mangled_name_nounder, mangled_name_nounder); Printf(f_mlibody, "val %s : c_obj -> c_obj\n", mangled_name_nounder); Delete(mangled_name_nounder); } else if (classmode && in_destructor) { Printf(f_class_ctors, " \"~\", %s ;\n", mangled_name); } else if (classmode && !in_constructor && !in_destructor && !static_member_function && !Getattr(n, "membervariableHandler:sym:name") && expose_func) { String *opname = Copy(Getattr(n, "memberfunctionHandler:sym:name")); Replaceall(opname, "operator ", ""); Printf(f_class_ctors, " \"%s\", %s ;\n", opname, mangled_name); Delete(opname); } if (classmode && in_constructor) { Setattr(seen_constructors, mangled_name, "true"); } // writing the function wrapper function Printv(f->def, "SWIGEXT CAML_VALUE ", wname, " (", NIL); Printv(f->def, "CAML_VALUE args", NIL); Printv(f->def, ")\n{", NIL); /* Define the scheme name in C. This define is used by several macros. */ //Printv(f->def, "#define FUNC_NAME \"", mangled_name, "\"", NIL); // adds local variables Wrapper_add_local(f, "args", "CAMLparam1(args)"); Wrapper_add_local(f, "ret", "SWIG_CAMLlocal2(swig_result,rv)"); d = SwigType_typedef_qualified(d); emit_parameter_variables(l, f); /* Attach the standard typemaps */ emit_attach_parmmaps(l, f); Setattr(n, "wrap:parms", l); numargs = emit_num_arguments(l); numreq = emit_num_required(l); if (!isOverloaded) { if (numargs > 0) { if (numreq > 0) { Printf(f->code, "if (caml_list_length(args) < %d || caml_list_length(args) > %d) {\n", numreq, numargs); } else { Printf(f->code, "if (caml_list_length(args) > %d) {\n", numargs); } Printf(f->code, "caml_invalid_argument(\"Incorrect number of arguments passed to '%s'\");\n}\n", iname); } else { Printf(f->code, "if (caml_list_length(args) > 0) caml_invalid_argument(\"'%s' takes no arguments\");\n", iname); } } Printf(f->code, "swig_result = Val_unit;\n"); // Now write code to extract the parameters (this is super ugly) for (i = 0, p = l; i < numargs; i++) { /* Skip ignored arguments */ while (checkAttribute(p, "tmap:in:numinputs", "0")) { p = Getattr(p, "tmap:in:next"); } SwigType *pt = Getattr(p, "type"); String *ln = Getattr(p, "lname"); pt = SwigType_typedef_qualified(pt); // Produce names of source and target Clear(target); Clear(arg); String *source = NewStringf("caml_list_nth(args,%d)", i); Printf(target, "%s", ln); Printv(arg, Getattr(p, "name"), NIL); if (i >= numreq) { Printf(f->code, "if (caml_list_length(args) > %d) {\n", i); } // Handle parameter types. if ((tm = Getattr(p, "tmap:in"))) { Replaceall(tm, "$source", source); Replaceall(tm, "$target", target); Replaceall(tm, "$input", source); Setattr(p, "emit:input", source); Printv(f->code, tm, "\n", NIL); p = Getattr(p, "tmap:in:next"); } else { // no typemap found // check if typedef and resolve throw_unhandled_ocaml_type_error(pt, "in"); p = nextSibling(p); } if (i >= numreq) { Printf(f->code, "}\n"); } Delete(source); } /* Insert constraint checking code */ for (p = l; p;) { if ((tm = Getattr(p, "tmap:check"))) { Replaceall(tm, "$target", Getattr(p, "lname")); Printv(f->code, tm, "\n", NIL); p = Getattr(p, "tmap:check:next"); } else { p = nextSibling(p); } } // Pass output arguments back to the caller. for (p = l; p;) { if ((tm = Getattr(p, "tmap:argout"))) { Replaceall(tm, "$source", Getattr(p, "emit:input")); /* Deprecated */ Replaceall(tm, "$target", Getattr(p, "lname")); /* Deprecated */ Replaceall(tm, "$arg", Getattr(p, "emit:input")); Replaceall(tm, "$input", Getattr(p, "emit:input")); Replaceall(tm, "$ntype", normalizeTemplatedClassName(Getattr(p, "type"))); Printv(outarg, tm, "\n", NIL); p = Getattr(p, "tmap:argout:next"); } else { p = nextSibling(p); } } // Free up any memory allocated for the arguments. /* Insert cleanup code */ for (p = l; p;) { if ((tm = Getattr(p, "tmap:freearg"))) { Replaceall(tm, "$target", Getattr(p, "lname")); Printv(cleanup, tm, "\n", NIL); p = Getattr(p, "tmap:freearg:next"); } else { p = nextSibling(p); } } /* if the object is a director, and the method call originated from its * underlying ocaml object, resolve the call by going up the c++ * inheritance chain. otherwise try to resolve the method in ocaml. * without this check an infinite loop is set up between the director and * shadow class method calls. */ // NOTE: this code should only be inserted if this class is the // base class of a director class. however, in general we haven't // yet analyzed all classes derived from this one to see if they are // directors. furthermore, this class may be used as the base of // a director class defined in a completely different module at a // later time, so this test must be included whether or not directorbase // is true. we do skip this code if directors have not been enabled // at the command line to preserve source-level compatibility with // non-polymorphic swig. also, if this wrapper is for a smart-pointer // method, there is no need to perform the test since the calling object // (the smart-pointer) and the director object (the "pointee") are // distinct. director_method = is_member_director(n) && !is_smart_pointer() && !destructor; if (director_method) { Wrapper_add_local(f, "director", "Swig::Director *director = 0"); Printf(f->code, "director = dynamic_cast(arg1);\n"); Wrapper_add_local(f, "upcall", "bool upcall = false"); Append(f->code, "upcall = (director);\n"); } // Now write code to make the function call Swig_director_emit_dynamic_cast(n, f); String *actioncode = emit_action(n); if ((tm = Swig_typemap_lookup_out("out", n, Swig_cresult_name(), f, actioncode))) { Replaceall(tm, "$source", "swig_result"); Replaceall(tm, "$target", "rv"); Replaceall(tm, "$result", "rv"); Replaceall(tm, "$ntype", return_type_normalized); Printv(f->code, tm, "\n", NIL); } else { throw_unhandled_ocaml_type_error(d, "out"); } emit_return_variable(n, d, f); // Dump the argument output code Printv(f->code, Char(outarg), NIL); // Dump the argument cleanup code Printv(f->code, Char(cleanup), NIL); // Look for any remaining cleanup if (GetFlag(n, "feature:new")) { if ((tm = Swig_typemap_lookup("newfree", n, Swig_cresult_name(), 0))) { Replaceall(tm, "$source", "swig_result"); Printv(f->code, tm, "\n", NIL); } } /* See if there is any return cleanup code */ if ((tm = Swig_typemap_lookup("ret", n, Swig_cresult_name(), 0))) { Replaceall(tm, "$source", Swig_cresult_name()); Printf(f->code, "%s\n", tm); Delete(tm); } // Free any memory allocated by the function being wrapped.. if ((tm = Swig_typemap_lookup("swig_result", n, Swig_cresult_name(), 0))) { Replaceall(tm, "$source", Swig_cresult_name()); Printv(f->code, tm, "\n", NIL); } // Wrap things up (in a manner of speaking) Printv(f->code, tab4, "swig_result = caml_list_append(swig_result,rv);\n", NIL); Printv(f->code, tab4, "CAMLreturn(swig_result);\n", NIL); Printv(f->code, "}\n", NIL); /* Substitute the function name */ Replaceall(f->code, "$symname", iname); Wrapper_print(f, f_wrappers); if (isOverloaded) { if (!Getattr(n, "sym:nextSibling")) { int maxargs; Wrapper *df = NewWrapper(); String *dispatch = Swig_overload_dispatch(n, "free(argv);\n" "CAMLreturn(%s(args));\n", &maxargs); Wrapper_add_local(df, "argv", "CAML_VALUE *argv"); /* Undifferentiate name .. this is the dispatch function */ wname = Swig_name_wrapper(iname); /* Do this to disambiguate functions emitted from different * modules */ Append(wname, module); Printv(df->def, "SWIGEXT CAML_VALUE ", wname, "(CAML_VALUE args) {\n" " CAMLparam1(args);\n" " int i;\n" " int argc = caml_list_length(args);\n", NIL); Printv(df->code, "argv = (CAML_VALUE *)malloc( argc * sizeof( CAML_VALUE ) );\n" "for( i = 0; i < argc; i++ ) {\n" " argv[i] = caml_list_nth(args,i);\n" "}\n", NIL); Printv(df->code, dispatch, "\nfree(argv);\n", NIL); Node *sibl = n; while (Getattr(sibl, "sym:previousSibling")) sibl = Getattr(sibl, "sym:previousSibling"); String *protoTypes = NewString(""); do { String *fulldecl = Swig_name_decl(sibl); Printf(protoTypes, "\n\" %s\\n\"", fulldecl); Delete(fulldecl); } while ((sibl = Getattr(sibl, "sym:nextSibling"))); Printf(df->code, "caml_failwith(\"Wrong number or type of arguments for overloaded function '%s'.\\n\"" "\n\" Possible C/C++ prototypes are:\\n\"%s);\n", iname, protoTypes); Delete(protoTypes); Printv(df->code, "}\n", NIL); Wrapper_print(df, f_wrappers); DelWrapper(df); Delete(dispatch); } } if (expose_func) { Printf(f_mlbody, "external %s_f : c_obj list -> c_obj list = \"%s\" ;;\n", mangled_name, wname); Printf(f_mlbody, "let %s arg = match %s_f (%s(fnhelper arg)) with\n", mangled_name, mangled_name, in_constructor && Swig_directorclass(getCurrentClass()) ? "director_core_helper " : ""); Printf(f_mlbody, " [] -> C_void\n" "| [x] -> (if %s then Gc.finalise \n" " (fun x -> ignore ((invoke x) \"~\" C_void)) x) ; x\n" "| lst -> C_list lst ;;\n", newobj ? "true" : "false"); } if ((!classmode || in_constructor || in_destructor || static_member_function) && expose_func) Printf(f_mlibody, "val %s : c_obj -> c_obj\n", mangled_name); Delete(proc_name); Delete(target); Delete(arg); Delete(outarg); Delete(cleanup); Delete(build); DelWrapper(f); return SWIG_OK; } /* ------------------------------------------------------------ * variableWrapper() * * Create a link to a C variable. * This creates a single function _wrap_varname(). * This function takes a single optional argument. If supplied, it means * we are setting this variable to some value. If omitted, it means we are * simply evaluating this variable. We return the value of the variable * in both cases. * * symname is the name of the variable with respect to C. This * may need to differ from the original name in the case of enums. * enumvname is the name of the variable with respect to ocaml. This * will vary if the variable has been renamed. * ------------------------------------------------------------ */ virtual int variableWrapper(Node *n) { char *name = GetChar(n, "feature:symname"); String *iname = Getattr(n, "feature:enumvname"); String *mname = mangleNameForCaml(iname); SwigType *t = Getattr(n, "type"); String *proc_name = NewString(""); String *tm; Wrapper *f; if (!name) { name = GetChar(n, "name"); } if (!iname) { iname = Getattr(n, "sym:name"); mname = mangleNameForCaml(NewString(iname)); } if (!iname || !addSymbol(iname, n)) return SWIG_ERROR; f = NewWrapper(); // evaluation function names String *var_name = Swig_name_wrapper(iname); // Build the name for OCaml. Printv(proc_name, iname, NIL); Setattr(n, "wrap:name", proc_name); Printf(f->def, "SWIGEXT CAML_VALUE %s(CAML_VALUE args) {\n", var_name); // Printv(f->def, "#define FUNC_NAME \"", proc_name, "\"", NIL); Wrapper_add_local(f, "args", "CAMLparam1(args)"); Wrapper_add_local(f, "swig_result", "SWIG_CAMLlocal1(swig_result)"); Printf(f->code, "swig_result = Val_unit;\n"); if (!GetFlag(n, "feature:immutable")) { /* Check for a setting of the variable value */ Printf(f->code, "if (args != Val_int(0)) {\n"); if ((tm = Swig_typemap_lookup("varin", n, name, 0))) { Replaceall(tm, "$source", "args"); Replaceall(tm, "$target", name); Replaceall(tm, "$input", "args"); emit_action_code(n, f->code, tm); } else if ((tm = Swig_typemap_lookup("in", n, name, 0))) { Replaceall(tm, "$source", "args"); Replaceall(tm, "$target", name); Replaceall(tm, "$input", "args"); emit_action_code(n, f->code, tm); } else { throw_unhandled_ocaml_type_error(t, "varin/in"); } Printf(f->code, "}\n"); } // Now return the value of the variable (regardless // of evaluating or setting) if ((tm = Swig_typemap_lookup("varout", n, name, 0))) { Replaceall(tm, "$source", name); Replaceall(tm, "$target", "swig_result"); Replaceall(tm, "$result", "swig_result"); emit_action_code(n, f->code, tm); } else if ((tm = Swig_typemap_lookup("out", n, name, 0))) { Replaceall(tm, "$source", name); Replaceall(tm, "$target", "swig_result"); Replaceall(tm, "$result", "swig_result"); emit_action_code(n, f->code, tm); } else { throw_unhandled_ocaml_type_error(t, "varout/out"); } Printf(f->code, "\nCAMLreturn(swig_result);\n"); Printf(f->code, "}\n"); Wrapper_print(f, f_wrappers); // Now add symbol to the Ocaml interpreter if (GetFlag(n, "feature:immutable")) { Printf(f_mlbody, "external _%s : c_obj -> Swig.c_obj = \"%s\" \n", mname, var_name); Printf(f_mlibody, "val _%s : c_obj -> Swig.c_obj\n", iname); if (const_enum) { Printf(f_enum_to_int, " | `%s -> _%s C_void\n", mname, mname); Printf(f_int_to_enum, " if y = (get_int (_%s C_void)) then `%s else\n", mname, mname); } } else { Printf(f_mlbody, "external _%s : c_obj -> c_obj = \"%s\"\n", mname, var_name); Printf(f_mlibody, "external _%s : c_obj -> c_obj = \"%s\"\n", mname, var_name); } Delete(var_name); Delete(proc_name); DelWrapper(f); return SWIG_OK; } /* ------------------------------------------------------------ * staticmemberfunctionHandler -- * Overridden to set static_member_function * ------------------------------------------------------------ */ virtual int staticmemberfunctionHandler(Node *n) { static_member_function = 1; Language::staticmemberfunctionHandler(n); static_member_function = 0; return SWIG_OK; } /* ------------------------------------------------------------ * constantWrapper() * * The one trick here is that we have to make sure we rename the * constant to something useful that doesn't collide with the * original if any exists. * ------------------------------------------------------------ */ virtual int constantWrapper(Node *n) { String *name = Getattr(n, "feature:symname"); SwigType *type = Getattr(n, "type"); String *rawval = Getattr(n, "rawval"); String *value = rawval ? rawval : Getattr(n, "value"); SwigType *qname = Getattr(n, "qualified:name"); if (qname) value = qname; if (!name) { name = mangleNameForCaml(Getattr(n, "name")); Insert(name, 0, "_swig_wrap_"); Setattr(n, "feature:symname", name); } // See if there's a typemap // Create variable and assign it a value Printf(f_header, "static %s = %s;\n", SwigType_str(type, name), value); SetFlag(n, "feature:immutable"); variableWrapper(n); return SWIG_OK; } int constructorHandler(Node *n) { int ret; in_constructor = 1; ret = Language::constructorHandler(n); in_constructor = 0; return ret; } /* destructorHandler: * Turn on destructor flag to inform decisions in functionWrapper */ int destructorHandler(Node *n) { int ret; in_destructor = 1; ret = Language::destructorHandler(n); in_destructor = 0; return ret; } /* copyconstructorHandler: * Turn on constructor and copyconstructor flags for functionWrapper */ int copyconstructorHandler(Node *n) { int ret; in_copyconst = 1; in_constructor = 1; ret = Language::copyconstructorHandler(n); in_constructor = 0; in_copyconst = 0; return ret; } /** * A simple, somewhat general purpose function for writing to multiple * streams from a source template. This allows the user to define the * class definition in ways different from the one I have here if they * want to. It will also make the class definition system easier to * fiddle with when I want to change methods, etc. */ void Multiwrite(String *s) { char *find_marker = strstr(Char(s), "(*Stream:"); while (find_marker) { char *next = strstr(find_marker, "*)"); find_marker += strlen("(*Stream:"); if (next) { int num_chars = (int)(next - find_marker); String *stream_name = NewString(find_marker); Delslice(stream_name, num_chars, Len(stream_name)); File *fout = Swig_filebyname(stream_name); if (fout) { next += strlen("*)"); char *following = strstr(next, "(*Stream:"); find_marker = following; if (!following) following = next + strlen(next); String *chunk = NewString(next); Delslice(chunk, (int)(following - next), Len(chunk)); Printv(fout, chunk, NIL); } } } } bool isSimpleType(String *name) { char *ch = Char(name); return !(strchr(ch, '(') || strchr(ch, '<') || strchr(ch, ')') || strchr(ch, '>')); } /* We accept all chars in identifiers because we use strings to index * them. */ int validIdentifier(String *name) { return Len(name) > 0 ? 1 : 0; } /* classHandler * * Create a "class" definition for ocaml. I thought quite a bit about * how I should do this part of it, and arrived here, using a function * invocation to select a method, and dispatch. This can obviously be * done better, but I can't see how, given that I want to support * overloaded methods, out parameters, and operators. * * I needed a system that would do this: * * a Be able to call these methods: * int foo( int x ); * float foo( int x, int &out ); * * b Be typeable, even in the presence of mutually dependent classes. * * c Support some form of operator invocation. * * (c) I chose strings for the method names so that "+=" would be a * valid method name, and the somewhat natural << (invoke x) "+=" y >> * would work. * * (a) (b) Since the c_obj type exists, it's easy to return C_int in one * case and C_list [ C_float ; C_int ] in the other. This makes tricky * problems with out parameters disappear; they're simply appended to the * return list. * * (b) Since every item that comes from C++ is the same type, there is no * problem with the following: * * class Foo; * class Bar { Foo *toFoo(); } * class Foo { Bar *toBar(); } * * Since the Objective caml types of Foo and Bar are the same. Now that * I correctly incorporate SWIG's typechecking, this isn't a big deal. * * The class is in the form of a function returning a c_obj. The c_obj * is a C_obj containing a function which invokes a method on the * underlying object given its type. * * The name emitted here is normalized before being sent to * Callback.register, because we need this string to look up properly * when the typemap passes the descriptor string. I've been considering * some, possibly more forgiving method that would do some transformations * on the $descriptor in order to find a potential match. This is for * later. * * Important things to note: * * We rely on exception handling (BadMethodName) in order to call an * ancestor. This can be improved. * * The method used to get :classof could be improved to look at the type * info that the base pointer contains. It's really an error to have a * SWIG-generated object that does not contain type info, since the * existence of the object means that SWIG knows the type. * * :parents could use :classof to tell what class it is and make a better * decision. This could be nice, (i.e. provide a run-time graph of C++ * classes represented);. * * I can't think of a more elegant way of converting a C_obj fun to a * pointer than "operator &"... * * Added a 'sizeof' that will allow you to do the expected thing. * This should help users to fill buffer structs and the like (as is * typical in windows-styled code). It's only enabled if you give * %feature(sizeof) and then, only for simple types. * * Overall, carrying the list of methods and base classes has worked well. * It allows me to give the Ocaml user introspection over their objects. */ int classHandler(Node *n) { String *name = Getattr(n, "name"); classname = Getattr(n, "sym:name"); if (!name) return SWIG_OK; String *mangled_name = mangleNameForCaml(name); String *this_class_def = NewString(f_classtemplate); String *name_normalized = normalizeTemplatedClassName(name); String *old_class_ctors = f_class_ctors; String *base_classes = NewString(""); f_class_ctors = NewString(""); bool sizeof_feature = generate_sizeof && isSimpleType(name); classmode = true; int rv = Language::classHandler(n); classmode = false; if (sizeof_feature) { Printf(f_wrappers, "SWIGEXT CAML_VALUE _wrap_%s_sizeof( CAML_VALUE args ) {\n" " CAMLparam1(args);\n" " CAMLreturn(Val_int(sizeof(%s)));\n" "}\n", mangled_name, name_normalized); Printf(f_mlbody, "external __%s_sizeof : unit -> int = " "\"_wrap_%s_sizeof\"\n", mangled_name, mangled_name); } /* Insert sizeof operator for concrete classes */ if (sizeof_feature) { Printv(f_class_ctors, "\"sizeof\" , (fun args -> C_int (__", mangled_name, "_sizeof ())) ;\n", NIL); } /* Handle up-casts in a nice way */ List *baselist = Getattr(n, "bases"); if (baselist && Len(baselist)) { Iterator b; b = First(baselist); while (b.item) { String *bname = Getattr(b.item, "name"); if (bname) { String *base_create = NewString(""); Printv(base_create, "(create_class \"", bname, "\")", NIL); Printv(f_class_ctors, " \"::", bname, "\", (fun args -> ", base_create, " args) ;\n", NIL); Printv(base_classes, base_create, " ;\n", NIL); } b = Next(b); } } Replaceall(this_class_def, "$classname", mangled_name); Replaceall(this_class_def, "$normalized", name_normalized); Replaceall(this_class_def, "$realname", name); Replaceall(this_class_def, "$baselist", base_classes); Replaceall(this_class_def, "$classbody", f_class_ctors); Delete(f_class_ctors); f_class_ctors = old_class_ctors; // Actually write out the class definition Multiwrite(this_class_def); Setattr(n, "ocaml:ctor", mangled_name); return rv; } String *normalizeTemplatedClassName(String *name) { String *name_normalized = SwigType_typedef_resolve_all(name); bool took_action; do { took_action = false; if (is_a_pointer(name_normalized)) { SwigType_del_pointer(name_normalized); took_action = true; } if (is_a_reference(name_normalized)) { oc_SwigType_del_reference(name_normalized); took_action = true; } if (is_an_array(name_normalized)) { oc_SwigType_del_array(name_normalized); took_action = true; } } while (took_action); return SwigType_str(name_normalized, 0); } /* * Produce the symbol name that ocaml will use when referring to the * target item. I wonder if there's a better way to do this: * * I shudder to think about doing it with a hash lookup, but that would * make a couple of things easier: */ String *mangleNameForCaml(String *s) { String *out = Copy(s); Replaceall(out, " ", "_xx"); Replaceall(out, "::", "_xx"); Replaceall(out, ",", "_x"); Replaceall(out, "+", "_xx_plus"); Replaceall(out, "-", "_xx_minus"); Replaceall(out, "<", "_xx_ldbrace"); Replaceall(out, ">", "_xx_rdbrace"); Replaceall(out, "!", "_xx_not"); Replaceall(out, "%", "_xx_mod"); Replaceall(out, "^", "_xx_xor"); Replaceall(out, "*", "_xx_star"); Replaceall(out, "&", "_xx_amp"); Replaceall(out, "|", "_xx_or"); Replaceall(out, "(", "_xx_lparen"); Replaceall(out, ")", "_xx_rparen"); Replaceall(out, "[", "_xx_lbrace"); Replaceall(out, "]", "_xx_rbrace"); Replaceall(out, "~", "_xx_bnot"); Replaceall(out, "=", "_xx_equals"); Replaceall(out, "/", "_xx_slash"); Replaceall(out, ".", "_xx_dot"); return out; } SwigType *fully_qualified_enum_type(Node *n) { Node *parent = 0; String *fully_qualified_name = NewString(""); String *parent_type = 0; parent = parentNode(n); while (parent) { parent_type = nodeType(parent); if (Getattr(parent, "name")) { String *parent_copy = NewStringf("%s::", Getattr(parent, "name")); if (Cmp(parent_type, "class") == 0 || Cmp(parent_type, "namespace") == 0) Insert(fully_qualified_name, 0, parent_copy); Delete(parent_copy); } if (!Cmp(parent_type, "class")) break; parent = parentNode(parent); } return fully_qualified_name; } /* Benedikt Grundmann inspired --> Enum wrap styles */ int enumvalueDeclaration(Node *n) { String *name = Getattr(n, "name"); SwigType *qtype = 0; if (name_qualifier_type) { qtype = Copy(name_qualifier_type); Printv(qtype, name, NIL); } if (const_enum && qtype && name && !Getattr(seen_enumvalues, name)) { Setattr(seen_enumvalues, name, "true"); SetFlag(n, "feature:immutable"); Setattr(n, "feature:enumvalue", "1"); // this does not appear to be used Setattr(n, "qualified:name", SwigType_namestr(qtype)); String *evname = SwigType_manglestr(qtype); Insert(evname, 0, "SWIG_ENUM_"); Setattr(n, "feature:enumvname", name); Setattr(n, "feature:symname", evname); Delete(evname); Printf(f_enumtypes_value, "| `%s\n", name); return Language::enumvalueDeclaration(n); } else return SWIG_OK; } /* ------------------------------------------------------------------- * This function is a bit uglier than it deserves. * * I used to direct lookup the name of the enum. Now that certain fixes * have been made in other places, the names of enums are now fully * qualified, which is a good thing, overall, but requires me to do * some legwork. * * The other thing that uglifies this function is the varying way that * typedef enum and enum are handled. I need to produce consistent names, * which means looking up and registering by typedef and enum name. */ int enumDeclaration(Node *n) { if (getCurrentClass() && (cplus_mode != PUBLIC)) return SWIG_NOWRAP; String *name = Getattr(n, "name"); if (name) { String *oname = NewString(name); /* name is now fully qualified */ String *fully_qualified_name = NewString(name); bool seen_enum = false; if (name_qualifier_type) Delete(name_qualifier_type); char *strip_position; name_qualifier_type = fully_qualified_enum_type(n); strip_position = strstr(Char(oname), "::"); while (strip_position) { strip_position += 2; oname = NewString(strip_position); strip_position = strstr(Char(oname), "::"); } seen_enum = (Getattr(seen_enums, fully_qualified_name) ? true : false); if (!seen_enum) { const_enum = true; Printf(f_enum_to_int, "| `%s -> (match y with\n", oname); Printf(f_int_to_enum, "| `%s -> C_enum (\n", oname); /* * * * A note about enum name resolution * * * * * This code should now work, but I think we can do a bit better. * The problem I'm having is that swig isn't very precise about * typedef name resolution. My opinion is that SwigType_typedef * resolve_all should *always* return the enum tag if one exists, * rather than the admittedly friendlier enclosing typedef. * * This would make one of the cases below unnecessary. * * * */ Printf(f_mlbody, "let _ = Callback.register \"%s_marker\" (`%s)\n", fully_qualified_name, oname); if (!strncmp(Char(fully_qualified_name), "enum ", 5)) { String *fq_noenum = NewString(Char(fully_qualified_name) + 5); Printf(f_mlbody, "let _ = Callback.register \"%s_marker\" (`%s)\n" "let _ = Callback.register \"%s_marker\" (`%s)\n", fq_noenum, oname, fq_noenum, name); } Printf(f_enumtypes_type, "| `%s\n", oname); Insert(fully_qualified_name, 0, "enum "); Setattr(seen_enums, fully_qualified_name, n); } } int ret = Language::enumDeclaration(n); if (const_enum) { Printf(f_int_to_enum, "`Int y)\n"); Printf(f_enum_to_int, "| `Int x -> Swig.C_int x\n" "| _ -> raise (LabelNotFromThisEnum v))\n"); } const_enum = false; return ret; } /* ---------------------------------------------------------------------------- * BEGIN C++ Director Class modifications * ------------------------------------------------------------------------- */ /* * Modified polymorphism code for Ocaml language module. * * TODO * * Move some boilerplate code generation to Swig_...() functions. * */ /* --------------------------------------------------------------- * classDirectorMethod() * * Emit a virtual director method to pass a method call on to the * underlying Python object. * * --------------------------------------------------------------- */ int classDirectorMethod(Node *n, Node *parent, String *super) { int is_void = 0; int is_pointer = 0; String *storage = Getattr(n, "storage"); String *value = Getattr(n, "value"); String *decl = Getattr(n, "decl"); String *returntype = Getattr(n, "type"); String *name = Getattr(n, "name"); String *classname = Getattr(parent, "sym:name"); String *c_classname = Getattr(parent, "name"); String *symname = Getattr(n, "sym:name"); String *declaration = NewString(""); ParmList *l = Getattr(n, "parms"); Wrapper *w = NewWrapper(); String *tm; String *wrap_args = NewString(""); int status = SWIG_OK; int idx; bool pure_virtual = false; bool ignored_method = GetFlag(n, "feature:ignore") ? true : false; if (Cmp(storage, "virtual") == 0) { if (Cmp(value, "0") == 0) { pure_virtual = true; } } Printf(w->locals, "CAMLparam0();\n"); /* determine if the method returns a pointer */ is_pointer = SwigType_ispointer_return(decl); is_void = (!Cmp(returntype, "void") && !is_pointer); /* virtual method definition */ String *target; String *pclassname = NewStringf("SwigDirector_%s", classname); String *qualified_name = NewStringf("%s::%s", pclassname, name); SwigType *rtype = Getattr(n, "conversion_operator") ? 0 : Getattr(n, "classDirectorMethods:type"); target = Swig_method_decl(rtype, decl, qualified_name, l, 0); Printf(w->def, "%s", target); Delete(qualified_name); Delete(target); /* header declaration */ target = Swig_method_decl(rtype, decl, name, l, 1); Printf(declaration, " virtual %s", target); Delete(target); // Get any exception classes in the throws typemap if (Getattr(n, "noexcept")) { Append(w->def, " noexcept"); Append(declaration, " noexcept"); } ParmList *throw_parm_list = 0; if ((throw_parm_list = Getattr(n, "throws")) || Getattr(n, "throw")) { Parm *p; int gencomma = 0; Append(w->def, " throw("); Append(declaration, " throw("); if (throw_parm_list) Swig_typemap_attach_parms("throws", throw_parm_list, 0); for (p = throw_parm_list; p; p = nextSibling(p)) { if (Getattr(p, "tmap:throws")) { if (gencomma++) { Append(w->def, ", "); Append(declaration, ", "); } String *str = SwigType_str(Getattr(p, "type"), 0); Append(w->def, str); Append(declaration, str); Delete(str); } } Append(w->def, ")"); Append(declaration, ")"); } Append(w->def, " {"); Append(declaration, ";\n"); /* declare method return value * if the return value is a reference or const reference, a specialized typemap must * handle it, including declaration of c_result ($result). */ if (!is_void && (!ignored_method || pure_virtual)) { if (!SwigType_isclass(returntype)) { if (!(SwigType_ispointer(returntype) || SwigType_isreference(returntype))) { String *construct_result = NewStringf("= SwigValueInit< %s >()", SwigType_lstr(returntype, 0)); Wrapper_add_localv(w, "c_result", SwigType_lstr(returntype, "c_result"), construct_result, NIL); Delete(construct_result); } else { Wrapper_add_localv(w, "c_result", SwigType_lstr(returntype, "c_result"), "= 0", NIL); } } else { String *cres = SwigType_lstr(returntype, "c_result"); Printf(w->code, "%s;\n", cres); Delete(cres); } } if (ignored_method) { if (!pure_virtual) { String *super_call = Swig_method_call(super, l); if (is_void) Printf(w->code, "%s;\n", super_call); else Printf(w->code, "CAMLreturn_type(%s);\n", super_call); Delete(super_call); } else { Printf(w->code, "Swig::DirectorPureVirtualException::raise(\"Attempted to invoke pure virtual method %s::%s\");\n", SwigType_namestr(c_classname), SwigType_namestr(name)); } } else { Wrapper_add_local(w, "swig_result", "SWIG_CAMLlocal2(swig_result, args)"); /* attach typemaps to arguments (C/C++ -> Ocaml) */ String *arglist = NewString(""); Swig_director_parms_fixup(l); Swig_typemap_attach_parms("in", l, 0); Swig_typemap_attach_parms("directorin", l, w); Swig_typemap_attach_parms("directorargout", l, w); Parm *p; int num_arguments = emit_num_arguments(l); int i; char source[256]; int outputs = 0; if (!is_void) outputs++; /* build argument list and type conversion string */ for (i = 0, idx = 0, p = l; i < num_arguments; i++) { while (Getattr(p, "tmap:ignore")) { p = Getattr(p, "tmap:ignore:next"); } if (Getattr(p, "tmap:directorargout") != 0) outputs++; String *pname = Getattr(p, "name"); String *ptype = Getattr(p, "type"); Putc(',', arglist); if ((tm = Getattr(p, "tmap:directorin")) != 0) { Setattr(p, "emit:directorinput", pname); Replaceall(tm, "$input", pname); Replaceall(tm, "$owner", "0"); if (Len(tm) == 0) Append(tm, pname); Printv(wrap_args, tm, "\n", NIL); p = Getattr(p, "tmap:directorin:next"); continue; } else if (Cmp(ptype, "void")) { /* special handling for pointers to other C++ director classes. * ideally this would be left to a typemap, but there is currently no * way to selectively apply the dynamic_cast<> to classes that have * directors. in other words, the type "SwigDirector_$1_lname" only exists * for classes with directors. we avoid the problem here by checking * module.wrap::directormap, but it's not clear how to get a typemap to * do something similar. perhaps a new default typemap (in addition * to SWIGTYPE) called DIRECTORTYPE? */ if (SwigType_ispointer(ptype) || SwigType_isreference(ptype)) { Node *module = Getattr(parent, "module"); Node *target = Swig_directormap(module, ptype); sprintf(source, "obj%d", idx++); String *nonconst = 0; /* strip pointer/reference --- should move to Swig/stype.c */ String *nptype = NewString(Char(ptype) + 2); /* name as pointer */ String *ppname = Copy(pname); if (SwigType_isreference(ptype)) { Insert(ppname, 0, "&"); } /* if necessary, cast away const since Python doesn't support it! */ if (SwigType_isconst(nptype)) { nonconst = NewStringf("nc_tmp_%s", pname); String *nonconst_i = NewStringf("= const_cast< %s >(%s)", SwigType_lstr(ptype, 0), ppname); Wrapper_add_localv(w, nonconst, SwigType_lstr(ptype, 0), nonconst, nonconst_i, NIL); Delete(nonconst_i); Swig_warning(WARN_LANG_DISCARD_CONST, input_file, line_number, "Target language argument '%s' discards const in director method %s::%s.\n", SwigType_str(ptype, pname), SwigType_namestr(c_classname), SwigType_namestr(name)); } else { nonconst = Copy(ppname); } Delete(nptype); Delete(ppname); String *mangle = SwigType_manglestr(ptype); if (target) { String *director = NewStringf("director_%s", mangle); Wrapper_add_localv(w, director, "Swig::Director *", director, "= 0", NIL); Wrapper_add_localv(w, source, "CAML_VALUE", source, "= Val_unit", NIL); Printf(wrap_args, "%s = dynamic_cast(%s);\n", director, nonconst); Printf(wrap_args, "if (!%s) {\n", director); Printf(wrap_args, "%s = SWIG_NewPointerObj(%s, SWIGTYPE%s, 0);\n", source, nonconst, mangle); Printf(wrap_args, "} else {\n"); Printf(wrap_args, "%s = %s->swig_get_self();\n", source, director); Printf(wrap_args, "}\n"); Delete(director); Printv(arglist, source, NIL); } else { Wrapper_add_localv(w, source, "CAML_VALUE", source, "= Val_unit", NIL); Printf(wrap_args, "%s = SWIG_NewPointerObj(%s, SWIGTYPE%s, 0);\n", source, nonconst, mangle); //Printf(wrap_args, "%s = SWIG_NewPointerObj(%s, SWIGTYPE_p_%s, 0);\n", // source, nonconst, base); Printv(arglist, source, NIL); } Delete(mangle); Delete(nonconst); } else { Swig_warning(WARN_TYPEMAP_DIRECTORIN_UNDEF, input_file, line_number, "Unable to use type %s as a function argument in director method %s::%s (skipping method).\n", SwigType_str(ptype, 0), SwigType_namestr(c_classname), SwigType_namestr(name)); status = SWIG_NOWRAP; break; } } p = nextSibling(p); } Printv(w->code, "swig_result = Val_unit;\n", 0); Printf(w->code, "args = Val_unit;\n"); /* wrap complex arguments to values */ Printv(w->code, wrap_args, NIL); /* pass the method call on to the OCaml object */ Printv(w->code, "swig_result = caml_swig_alloc(1,C_list);\n" "SWIG_Store_field(swig_result,0,args);\n" "args = swig_result;\n" "swig_result = Val_unit;\n", 0); Printf(w->code, "static CAML_VALUE *swig_ocaml_func_val = NULL;\n" "if (!swig_ocaml_func_val) {\n"); Printf(w->code, " swig_ocaml_func_val = caml_named_value(\"swig_runmethod\");\n }\n"); Printf(w->code, "swig_result = caml_callback3(*swig_ocaml_func_val,swig_get_self(),caml_copy_string(\"%s\"),args);\n", Getattr(n, "name")); /* exception handling */ tm = Swig_typemap_lookup("director:except", n, Swig_cresult_name(), 0); if (!tm) { tm = Getattr(n, "feature:director:except"); } if ((tm) && Len(tm) && (Strcmp(tm, "1") != 0)) { Printf(w->code, "if (!%s) {\n", Swig_cresult_name()); Printf(w->code, " CAML_VALUE error = *caml_named_value(\"director_except\");\n"); Replaceall(tm, "$error", "error"); Printv(w->code, Str(tm), "\n", NIL); Printf(w->code, "}\n"); } /* * Python method may return a simple object, or a tuple. * for in/out arguments, we have to extract the appropriate values from the * argument list, then marshal everything back to C/C++ (return value and * output arguments). */ /* marshal return value and other outputs (if any) from value to C/C++ * type */ String *cleanup = NewString(""); String *outarg = NewString(""); tm = Swig_typemap_lookup("directorout", n, "c_result", w); if (tm != 0) { Replaceall(tm, "$input", "swig_result"); /* TODO check this */ if (Getattr(n, "wrap:disown")) { Replaceall(tm, "$disown", "SWIG_POINTER_DISOWN"); } else { Replaceall(tm, "$disown", "0"); } Replaceall(tm, "$result", "c_result"); Printv(w->code, tm, "\n", NIL); } /* marshal outputs */ for (p = l; p;) { if ((tm = Getattr(p, "tmap:directorargout")) != 0) { Replaceall(tm, "$result", "swig_result"); Replaceall(tm, "$input", Getattr(p, "emit:directorinput")); Printv(w->code, tm, "\n", NIL); p = Getattr(p, "tmap:directorargout:next"); } else { p = nextSibling(p); } } Delete(arglist); Delete(cleanup); Delete(outarg); } /* any existing helper functions to handle this? */ if (!is_void) { if (!(ignored_method && !pure_virtual)) { /* A little explanation: * The director_enum test case makes a method whose return type * is an enum type. returntype here is "int". gcc complains * about an implicit enum conversion, and although i don't strictly * agree with it, I'm working on fixing the error: * * Below is what I came up with. It's not great but it should * always essentially work. */ if (!SwigType_isreference(returntype)) { Printf(w->code, "CAMLreturn_type((%s)c_result);\n", SwigType_lstr(returntype, "")); } else { Printf(w->code, "CAMLreturn_type(*c_result);\n"); } } } else { Printf(w->code, "CAMLreturn0;\n"); } Printf(w->code, "}\n"); // We expose protected methods via an extra public inline method which makes a straight call to the wrapped class' method String *inline_extra_method = NewString(""); if (dirprot_mode() && !is_public(n) && !pure_virtual) { Printv(inline_extra_method, declaration, NIL); String *extra_method_name = NewStringf("%sSwigPublic", name); Replaceall(inline_extra_method, name, extra_method_name); Replaceall(inline_extra_method, ";\n", " {\n "); if (!is_void) Printf(inline_extra_method, "return "); String *methodcall = Swig_method_call(super, l); Printv(inline_extra_method, methodcall, ";\n }\n", NIL); Delete(methodcall); Delete(extra_method_name); } /* emit the director method */ if (status == SWIG_OK) { if (!Getattr(n, "defaultargs")) { Replaceall(w->code, "$symname", symname); Wrapper_print(w, f_directors); Printv(f_directors_h, declaration, NIL); Printv(f_directors_h, inline_extra_method, NIL); } } /* clean up */ Delete(wrap_args); Delete(pclassname); DelWrapper(w); return status; } /* ------------------------------------------------------------ * classDirectorConstructor() * ------------------------------------------------------------ */ int classDirectorConstructor(Node *n) { Node *parent = Getattr(n, "parentNode"); String *sub = NewString(""); String *decl = Getattr(n, "decl"); String *supername = Swig_class_name(parent); String *classname = NewString(""); Printf(classname, "SwigDirector_%s", supername); /* insert self parameter */ Parm *p, *q; ParmList *superparms = Getattr(n, "parms"); ParmList *parms = CopyParmList(superparms); String *type = NewString("CAML_VALUE"); p = NewParm(type, NewString("self"), n); q = Copy(p); set_nextSibling(q, superparms); set_nextSibling(p, parms); parms = p; if (!Getattr(n, "defaultargs")) { /* constructor */ { Wrapper *w = NewWrapper(); String *call; String *basetype = Getattr(parent, "classtype"); String *target = Swig_method_decl(0, decl, classname, parms, 0); call = Swig_csuperclass_call(0, basetype, superparms); Printf(w->def, "%s::%s: %s, Swig::Director(self) { }", classname, target, call); Delete(target); Wrapper_print(w, f_directors); Delete(call); DelWrapper(w); } /* constructor header */ { String *target = Swig_method_decl(0, decl, classname, parms, 1); Printf(f_directors_h, " %s;\n", target); Delete(target); } } Setattr(n, "parms", q); Language::classDirectorConstructor(n); Delete(sub); Delete(classname); Delete(supername); //Delete(parms); return SWIG_OK; } /* ------------------------------------------------------------ * classDirectorDefaultConstructor() * ------------------------------------------------------------ */ int classDirectorDefaultConstructor(Node *n) { String *classname; classname = Swig_class_name(n); /* insert self parameter */ Parm *p, *q; ParmList *superparms = Getattr(n, "parms"); ParmList *parms = CopyParmList(superparms); String *type = NewString("CAML_VALUE"); p = NewParm(type, NewString("self"), n); q = Copy(p); set_nextSibling(p, parms); { Wrapper *w = NewWrapper(); Printf(w->def, "SwigDirector_%s::SwigDirector_%s(CAML_VALUE self) : Swig::Director(self) { }", classname, classname); Wrapper_print(w, f_directors); DelWrapper(w); } Printf(f_directors_h, " SwigDirector_%s(CAML_VALUE self);\n", classname); Delete(classname); Setattr(n, "parms", q); return Language::classDirectorDefaultConstructor(n); } int classDirectorInit(Node *n) { String *declaration = Swig_director_declaration(n); Printf(f_directors_h, "\n" "%s\n" "public:\n", declaration); Delete(declaration); return Language::classDirectorInit(n); } int classDirectorEnd(Node *n) { Printf(f_directors_h, "};\n\n"); return Language::classDirectorEnd(n); } /* --------------------------------------------------------------------- * typedefHandler * * This is here in order to maintain the correct association between * typedef names and enum names. * * Since I implement enums as polymorphic variant tags, I need to call * back into ocaml to evaluate them. This requires a string that can * be generated in the typemaps, and also at SWIG time to be the same * string. The problem that arises is that SWIG variously generates * enum e_name_tag * e_name_tag * e_typedef_name * for * typedef enum e_name_tag { ... } e_typedef_name; * * Since I need these strings to be consistent, I must maintain a correct * association list between typedef and enum names. * --------------------------------------------------------------------- */ int typedefHandler(Node *n) { String *type = Getattr(n, "type"); Node *enum_node = type ? Getattr(seen_enums, type) : 0; if (enum_node) { String *name = Getattr(enum_node, "name"); Printf(f_mlbody, "let _ = Callback.register \"%s_marker\" (`%s)\n", Getattr(n, "name"), name); } return SWIG_OK; } String *runtimeCode() { String *s = Swig_include_sys("ocamlrun.swg"); if (!s) { Printf(stderr, "*** Unable to open 'ocamlrun.swg'\n"); s = NewString(""); } return s; } String *defaultExternalRuntimeFilename() { return NewString("swigocamlrun.h"); } }; /* ------------------------------------------------------------------------- * swig_ocaml() - Instantiate module * ------------------------------------------------------------------------- */ static Language *new_swig_ocaml() { return new OCAML(); } extern "C" Language *swig_ocaml(void) { return new_swig_ocaml(); } swig-4.0.1/Source/Modules/tcl8.cxx0000644000175000017500000012101713527063513016620 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * tcl8.cxx * * Tcl8 language module for SWIG. * ----------------------------------------------------------------------------- */ #include "swigmod.h" #include "cparse.h" static const char *usage = "\ Tcl 8 Options (available with -tcl8)\n\ -itcl - Enable ITcl support\n\ -nosafe - Leave out SafeInit module function.\n\ -prefix - Set a prefix to be prepended to all names\n\ -namespace - Build module into a Tcl 8 namespace\n\ -pkgversion - Set package version\n\n"; static String *cmd_tab = 0; /* Table of command names */ static String *var_tab = 0; /* Table of global variables */ static String *const_tab = 0; /* Constant table */ static String *methods_tab = 0; /* Methods table */ static String *attr_tab = 0; /* Attribute table */ static String *prefix = 0; static String *module = 0; static int namespace_option = 0; static String *init_name = 0; static String *ns_name = 0; static int have_constructor; static String *constructor_name; static int have_destructor; static int have_base_classes; static String *destructor_action = 0; static String *version = (String *) "0.0"; static String *class_name = 0; static int have_attributes; static int have_methods; static int nosafe = 0; static File *f_header = 0; static File *f_wrappers = 0; static File *f_init = 0; static File *f_begin = 0; static File *f_runtime = 0; // Itcl support static int itcl = 0; static File *f_shadow = 0; static File *f_shadow_stubs = 0; static String *constructor = 0; static String *destructor = 0; static String *base_classes = 0; static String *base_class_init = 0; static String *methods = 0; static String *imethods = 0; static String *attributes = 0; static String *attribute_traces = 0; static String *iattribute_traces = 0; class TCL8:public Language { public: /* ------------------------------------------------------------ * TCL8::main() * ------------------------------------------------------------ */ virtual void main(int argc, char *argv[]) { SWIG_library_directory("tcl"); for (int i = 1; i < argc; i++) { if (argv[i]) { if (strcmp(argv[i], "-prefix") == 0) { if (argv[i + 1]) { prefix = NewString(argv[i + 1]); Swig_mark_arg(i); Swig_mark_arg(i + 1); i++; } else Swig_arg_error(); } else if (strcmp(argv[i], "-pkgversion") == 0) { if (argv[i + 1]) { version = NewString(argv[i + 1]); Swig_mark_arg(i); Swig_mark_arg(i + 1); i++; } } else if (strcmp(argv[i], "-namespace") == 0) { namespace_option = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-itcl") == 0) { itcl = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-nosafe") == 0) { nosafe = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-help") == 0) { fputs(usage, stdout); } else if (strcmp(argv[i], "-cppcast") == 0) { Printf(stderr, "Deprecated command line option: %s. This option is now always on.\n", argv[i]); Swig_mark_arg(i); } else if (strcmp(argv[i], "-nocppcast") == 0) { Printf(stderr, "Deprecated command line option: %s. This option is no longer supported.\n", argv[i]); Swig_mark_arg(i); SWIG_exit(EXIT_FAILURE); } } } Preprocessor_define("SWIGTCL 1", 0); // SWIGTCL8 is deprecated, and no longer documented. Preprocessor_define("SWIGTCL8 1", 0); SWIG_typemap_lang("tcl8"); SWIG_config_file("tcl8.swg"); allow_overloading(); } /* ------------------------------------------------------------ * top() * ------------------------------------------------------------ */ virtual int top(Node *n) { /* Initialize all of the output files */ String *outfile = Getattr(n, "outfile"); f_begin = NewFile(outfile, "w", SWIG_output_files()); if (!f_begin) { FileErrorDisplay(outfile); SWIG_exit(EXIT_FAILURE); } f_runtime = NewString(""); f_init = NewString(""); f_header = NewString(""); f_wrappers = NewString(""); /* Register file targets with the SWIG file handler */ Swig_register_filebyname("header", f_header); Swig_register_filebyname("wrapper", f_wrappers); Swig_register_filebyname("begin", f_begin); Swig_register_filebyname("runtime", f_runtime); Swig_register_filebyname("init", f_init); /* Initialize some variables for the object interface */ cmd_tab = NewString(""); var_tab = NewString(""); methods_tab = NewString(""); const_tab = NewString(""); Swig_banner(f_begin); Printf(f_runtime, "\n\n#ifndef SWIGTCL\n#define SWIGTCL\n#endif\n\n"); /* Set the module name, namespace, and prefix */ module = NewStringf("%(lower)s", Getattr(n, "name")); init_name = NewStringf("%(title)s_Init", module); ns_name = prefix ? Copy(prefix) : Copy(module); if (prefix) Append(prefix, "_"); /* If shadow classing is enabled, we're going to change the module name to "_module" */ if (itcl) { String *filen; filen = NewStringf("%s%s.itcl", SWIG_output_directory(), module); Insert(module, 0, "_"); if ((f_shadow = NewFile(filen, "w", SWIG_output_files())) == 0) { FileErrorDisplay(filen); SWIG_exit(EXIT_FAILURE); } f_shadow_stubs = NewString(""); Swig_register_filebyname("shadow", f_shadow); Swig_register_filebyname("itcl", f_shadow); Swig_banner_target_lang(f_shadow, "#"); Printv(f_shadow, "\npackage require Itcl\n\n", NIL); Delete(filen); } /* Generate some macros used throughout code generation */ Printf(f_header, "#define SWIG_init %s\n", init_name); Printf(f_header, "#define SWIG_name \"%s\"\n", module); if (namespace_option) { Printf(f_header, "#define SWIG_prefix \"%s::\"\n", ns_name); Printf(f_header, "#define SWIG_namespace \"%s\"\n\n", ns_name); } else { Printf(f_header, "#define SWIG_prefix \"%s\"\n", prefix); } Printf(f_header, "#define SWIG_version \"%s\"\n", version); Printf(cmd_tab, "\nstatic swig_command_info swig_commands[] = {\n"); Printf(var_tab, "\nstatic swig_var_info swig_variables[] = {\n"); Printf(const_tab, "\nstatic swig_const_info swig_constants[] = {\n"); Printf(f_wrappers, "#ifdef __cplusplus\nextern \"C\" {\n#endif\n"); /* Start emitting code */ Language::top(n); /* Done. Close up the module */ Printv(cmd_tab, tab4, "{0, 0, 0}\n", "};\n", NIL); Printv(var_tab, tab4, "{0,0,0,0}\n", "};\n", NIL); Printv(const_tab, tab4, "{0,0,0,0,0,0}\n", "};\n", NIL); Printv(f_wrappers, cmd_tab, var_tab, const_tab, NIL); /* Dump the pointer equivalency table */ SwigType_emit_type_table(f_runtime, f_wrappers); Printf(f_wrappers, "#ifdef __cplusplus\n}\n#endif\n"); /* Close the init function and quit */ Printf(f_init, "return TCL_OK;\n}\n"); if (!nosafe) { Printf(f_init, "SWIGEXPORT int %(title)s_SafeInit(Tcl_Interp *interp) {\n", module); Printf(f_init, " return SWIG_init(interp);\n"); Printf(f_init, "}\n"); } if (itcl) { Printv(f_shadow, f_shadow_stubs, "\n", NIL); Delete(f_shadow); } /* Close all of the files */ Dump(f_runtime, f_begin); Printv(f_begin, f_header, f_wrappers, NIL); Wrapper_pretty_print(f_init, f_begin); Delete(f_header); Delete(f_wrappers); Delete(f_init); Delete(f_runtime); Delete(f_begin); return SWIG_OK; } /* ------------------------------------------------------------ * functionWrapper() * ------------------------------------------------------------ */ virtual int functionWrapper(Node *n) { String *name = Getattr(n, "name"); /* Like to get rid of this */ String *iname = Getattr(n, "sym:name"); SwigType *type = Getattr(n, "type"); ParmList *parms = Getattr(n, "parms"); String *overname = 0; Parm *p; int i; String *tm; Wrapper *f; String *incode, *cleanup, *outarg, *argstr, *args; int num_arguments = 0; int num_required = 0; int varargs = 0; char source[64]; if (Getattr(n, "sym:overloaded")) { overname = Getattr(n, "sym:overname"); } else { if (!addSymbol(iname, n)) return SWIG_ERROR; } incode = NewString(""); cleanup = NewString(""); outarg = NewString(""); argstr = NewString("\""); args = NewString(""); f = NewWrapper(); #ifdef SWIG_USE_RESULTOBJ Wrapper_add_local(f, "resultobj", "Tcl_Obj *resultobj = NULL"); #endif String *wname = Swig_name_wrapper(iname); if (overname) { Append(wname, overname); } Setattr(n, "wrap:name", wname); Printv(f->def, "SWIGINTERN int\n ", wname, "(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) {", NIL); // Emit all of the local variables for holding arguments. emit_parameter_variables(parms, f); /* Attach standard typemaps */ emit_attach_parmmaps(parms, f); Setattr(n, "wrap:parms", parms); /* Get number of require and total arguments */ num_arguments = emit_num_arguments(parms); num_required = emit_num_required(parms); varargs = emit_isvarargs(parms); /* Unmarshal parameters */ for (i = 0, p = parms; i < num_arguments; i++) { /* Skip ignored arguments */ while (checkAttribute(p, "tmap:in:numinputs", "0")) { p = Getattr(p, "tmap:in:next"); } SwigType *pt = Getattr(p, "type"); String *ln = Getattr(p, "lname"); /* Produce string representations of the source and target arguments */ sprintf(source, "objv[%d]", i + 1); if (i == num_required) Putc('|', argstr); if ((tm = Getattr(p, "tmap:in"))) { String *parse = Getattr(p, "tmap:in:parse"); if (!parse) { Replaceall(tm, "$target", ln); Replaceall(tm, "$source", source); Replaceall(tm, "$input", source); Setattr(p, "emit:input", source); if (Getattr(p, "wrap:disown") || (Getattr(p, "tmap:in:disown"))) { Replaceall(tm, "$disown", "SWIG_POINTER_DISOWN"); } else { Replaceall(tm, "$disown", "0"); } Putc('o', argstr); Printf(args, ",(void *)0"); if (i >= num_required) { Printf(incode, "if (objc > %d) {\n", i + 1); } Printf(incode, "%s\n", tm); if (i >= num_required) { Printf(incode, "}\n"); } } else { Printf(argstr, "%s", parse); Printf(args, ",&%s", ln); if (Strcmp(parse, "p") == 0) { SwigType *lt = SwigType_ltype(pt); SwigType_remember(pt); if (Cmp(lt, "p.void") == 0) { Printf(args, ",(void *)0"); } else { Printf(args, ",SWIGTYPE%s", SwigType_manglestr(pt)); } Delete(lt); } } p = Getattr(p, "tmap:in:next"); continue; } else { Swig_warning(WARN_TYPEMAP_IN_UNDEF, input_file, line_number, "Unable to use type %s as a function argument.\n", SwigType_str(pt, 0)); } p = nextSibling(p); } if (!varargs) { Putc(':', argstr); } else { Putc(';', argstr); /* If variable length arguments we need to emit the in typemap here */ if (p && (tm = Getattr(p, "tmap:in"))) { sprintf(source, "objv[%d]", i + 1); Printf(incode, "if (objc > %d) {\n", i); Replaceall(tm, "$input", source); Printv(incode, tm, "\n", NIL); Printf(incode, "}\n"); } } Printf(argstr, "%s\"", usage_string(Char(iname), type, parms)); Printv(f->code, "if (SWIG_GetArgs(interp, objc, objv,", argstr, args, ") == TCL_ERROR) SWIG_fail;\n", NIL); Printv(f->code, incode, NIL); /* Insert constraint checking code */ for (p = parms; p;) { if ((tm = Getattr(p, "tmap:check"))) { Replaceall(tm, "$target", Getattr(p, "lname")); Printv(f->code, tm, "\n", NIL); p = Getattr(p, "tmap:check:next"); } else { p = nextSibling(p); } } /* Insert cleanup code */ for (i = 0, p = parms; p; i++) { if (!checkAttribute(p, "tmap:in:numinputs", "0") && !Getattr(p, "tmap:in:parse") && (tm = Getattr(p, "tmap:freearg"))) { if (Len(tm) != 0) { Replaceall(tm, "$source", Getattr(p, "lname")); Printv(cleanup, tm, "\n", NIL); } p = Getattr(p, "tmap:freearg:next"); } else { p = nextSibling(p); } } /* Insert argument output code */ for (i = 0, p = parms; p; i++) { if ((tm = Getattr(p, "tmap:argout"))) { Replaceall(tm, "$source", Getattr(p, "lname")); #ifdef SWIG_USE_RESULTOBJ Replaceall(tm, "$target", "resultobj"); Replaceall(tm, "$result", "resultobj"); #else Replaceall(tm, "$target", "(Tcl_GetObjResult(interp))"); Replaceall(tm, "$result", "(Tcl_GetObjResult(interp))"); #endif Replaceall(tm, "$arg", Getattr(p, "emit:input")); Replaceall(tm, "$input", Getattr(p, "emit:input")); Printv(outarg, tm, "\n", NIL); p = Getattr(p, "tmap:argout:next"); } else { p = nextSibling(p); } } /* Now write code to make the function call */ String *actioncode = emit_action(n); /* Need to redo all of this code (eventually) */ /* Return value if necessary */ if ((tm = Swig_typemap_lookup_out("out", n, Swig_cresult_name(), f, actioncode))) { Replaceall(tm, "$source", Swig_cresult_name()); #ifdef SWIG_USE_RESULTOBJ Replaceall(tm, "$target", "resultobj"); Replaceall(tm, "$result", "resultobj"); #else Replaceall(tm, "$target", "(Tcl_GetObjResult(interp))"); Replaceall(tm, "$result", "(Tcl_GetObjResult(interp))"); #endif if (GetFlag(n, "feature:new")) { Replaceall(tm, "$owner", "SWIG_POINTER_OWN"); } else { Replaceall(tm, "$owner", "0"); } Printf(f->code, "%s\n", tm); } else { Swig_warning(WARN_TYPEMAP_OUT_UNDEF, input_file, line_number, "Unable to use return type %s in function %s.\n", SwigType_str(type, 0), name); } emit_return_variable(n, type, f); /* Dump output argument code */ Printv(f->code, outarg, NIL); /* Dump the argument cleanup code */ Printv(f->code, cleanup, NIL); /* Look for any remaining cleanup */ if (GetFlag(n, "feature:new")) { if ((tm = Swig_typemap_lookup("newfree", n, Swig_cresult_name(), 0))) { Replaceall(tm, "$source", Swig_cresult_name()); Printf(f->code, "%s\n", tm); } } if ((tm = Swig_typemap_lookup("ret", n, Swig_cresult_name(), 0))) { Replaceall(tm, "$source", Swig_cresult_name()); Printf(f->code, "%s\n", tm); } #ifdef SWIG_USE_RESULTOBJ Printv(f->code, "if (resultobj) Tcl_SetObjResult(interp, resultobj);\n", NIL); #endif Printv(f->code, "return TCL_OK;\n", NIL); Printv(f->code, "fail:\n", cleanup, "return TCL_ERROR;\n", NIL); Printv(f->code, "}\n", NIL); /* Substitute the cleanup code */ Replaceall(f->code, "$cleanup", cleanup); Replaceall(f->code, "$symname", iname); /* Dump out the function */ Wrapper_print(f, f_wrappers); if (!Getattr(n, "sym:overloaded")) { /* Register the function with Tcl */ Printv(cmd_tab, tab4, "{ SWIG_prefix \"", iname, "\", (swig_wrapper_func) ", Swig_name_wrapper(iname), ", NULL},\n", NIL); } else { if (!Getattr(n, "sym:nextSibling")) { /* Emit overloading dispatch function */ int maxargs; String *dispatch = Swig_overload_dispatch(n, "return %s(clientData, interp, objc, argv - 1);", &maxargs); /* Generate a dispatch wrapper for all overloaded functions */ Wrapper *df = NewWrapper(); String *dname = Swig_name_wrapper(iname); Printv(df->def, "SWIGINTERN int\n", dname, "(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) {", NIL); Printf(df->code, "Tcl_Obj *CONST *argv = objv+1;\n"); Printf(df->code, "int argc = objc-1;\n"); Printv(df->code, dispatch, "\n", NIL); Node *sibl = n; while (Getattr(sibl, "sym:previousSibling")) sibl = Getattr(sibl, "sym:previousSibling"); // go all the way up String *protoTypes = NewString(""); do { String *fulldecl = Swig_name_decl(sibl); Printf(protoTypes, "\n\" %s\\n\"", fulldecl); Delete(fulldecl); } while ((sibl = Getattr(sibl, "sym:nextSibling"))); Printf(df->code, "Tcl_SetResult(interp,(char *) " "\"Wrong number or type of arguments for overloaded function '%s'.\\n\"" "\n\" Possible C/C++ prototypes are:\\n\"%s, TCL_STATIC);\n", iname, protoTypes); Delete(protoTypes); Printf(df->code, "return TCL_ERROR;\n"); Printv(df->code, "}\n", NIL); Wrapper_print(df, f_wrappers); Printv(cmd_tab, tab4, "{ SWIG_prefix \"", iname, "\", (swig_wrapper_func) ", dname, ", NULL},\n", NIL); DelWrapper(df); Delete(dispatch); Delete(dname); } } Delete(incode); Delete(cleanup); Delete(outarg); Delete(argstr); Delete(args); DelWrapper(f); return SWIG_OK; } /* ------------------------------------------------------------ * variableWrapper() * ------------------------------------------------------------ */ virtual int variableWrapper(Node *n) { String *name = Getattr(n, "name"); String *iname = Getattr(n, "sym:name"); SwigType *t = Getattr(n, "type"); String *setname = 0; String *setfname = 0; Wrapper *setf = 0, *getf = 0; int readonly = 0; String *tm; if (!addSymbol(iname, n)) return SWIG_ERROR; /* Create a function for getting a variable */ int addfail = 0; getf = NewWrapper(); String *getname = Swig_name_get(NSPACE_TODO, iname); String *getfname = Swig_name_wrapper(getname); Setattr(n, "wrap:name", getfname); Printv(getf->def, "SWIGINTERN const char *", getfname, "(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, char *name1, char *name2, int flags) {", NIL); Wrapper_add_local(getf, "value", "Tcl_Obj *value = 0"); if ((tm = Swig_typemap_lookup("varout", n, name, 0))) { Replaceall(tm, "$source", name); Replaceall(tm, "$target", "value"); Replaceall(tm, "$result", "value"); /* Printf(getf->code, "%s\n",tm); */ addfail = emit_action_code(n, getf->code, tm); Printf(getf->code, "if (value) {\n"); Printf(getf->code, "Tcl_SetVar2(interp,name1,name2,Tcl_GetStringFromObj(value,NULL), flags);\n"); Printf(getf->code, "Tcl_DecrRefCount(value);\n"); Printf(getf->code, "}\n"); Printf(getf->code, "return NULL;\n"); if (addfail) { Append(getf->code, "fail:\n"); Printf(getf->code, "return \"%s\";\n", iname); } Printf(getf->code, "}\n"); Wrapper_print(getf, f_wrappers); } else { Swig_warning(WARN_TYPEMAP_VAROUT_UNDEF, input_file, line_number, "Unable to read variable of type %s\n", SwigType_str(t, 0)); DelWrapper(getf); return SWIG_NOWRAP; } DelWrapper(getf); /* Try to create a function setting a variable */ if (is_assignable(n)) { setf = NewWrapper(); setname = Swig_name_set(NSPACE_TODO, iname); setfname = Swig_name_wrapper(setname); Setattr(n, "wrap:name", setfname); if (setf) { Printv(setf->def, "SWIGINTERN const char *", setfname, "(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, char *name1, char *name2 SWIGUNUSED, int flags) {", NIL); Wrapper_add_local(setf, "value", "Tcl_Obj *value = 0"); Wrapper_add_local(setf, "name1o", "Tcl_Obj *name1o = 0"); if ((tm = Swig_typemap_lookup("varin", n, name, 0))) { Replaceall(tm, "$source", "value"); Replaceall(tm, "$target", name); Replaceall(tm, "$input", "value"); Printf(setf->code, "name1o = Tcl_NewStringObj(name1,-1);\n"); Printf(setf->code, "value = Tcl_ObjGetVar2(interp, name1o, 0, flags);\n"); Printf(setf->code, "Tcl_DecrRefCount(name1o);\n"); Printf(setf->code, "if (!value) SWIG_fail;\n"); /* Printf(setf->code,"%s\n", tm); */ emit_action_code(n, setf->code, tm); Printf(setf->code, "return NULL;\n"); Printf(setf->code, "fail:\n"); Printf(setf->code, "return \"%s\";\n", iname); Printf(setf->code, "}\n"); Wrapper_print(setf, f_wrappers); } else { Swig_warning(WARN_TYPEMAP_VARIN_UNDEF, input_file, line_number, "Unable to set variable of type %s.\n", SwigType_str(t, 0)); readonly = 1; } } DelWrapper(setf); } else { readonly = 1; } Printv(var_tab, tab4, "{ SWIG_prefix \"", iname, "\", 0, (swig_variable_func) ", getfname, ",", NIL); if (readonly) { static int readonlywrap = 0; if (!readonlywrap) { Wrapper *ro = NewWrapper(); Printf(ro->def, "SWIGINTERN const char *swig_readonly(ClientData clientData SWIGUNUSED, Tcl_Interp *interp SWIGUNUSED, char *name1 SWIGUNUSED, char *name2 SWIGUNUSED, int flags SWIGUNUSED) {"); Printv(ro->code, "return \"Variable is read-only\";\n", "}\n", NIL); Wrapper_print(ro, f_wrappers); readonlywrap = 1; DelWrapper(ro); } Printf(var_tab, "(swig_variable_func) swig_readonly},\n"); } else { Printv(var_tab, "(swig_variable_func) ", setfname, "},\n", NIL); } Delete(getfname); Delete(setfname); Delete(setname); Delete(getname); return SWIG_OK; } /* ------------------------------------------------------------ * constantWrapper() * ------------------------------------------------------------ */ virtual int constantWrapper(Node *n) { String *name = Getattr(n, "name"); String *iname = Getattr(n, "sym:name"); String *nsname = !namespace_option ? Copy(iname) : NewStringf("%s::%s", ns_name, iname); SwigType *type = Getattr(n, "type"); String *rawval = Getattr(n, "rawval"); String *value = rawval ? rawval : Getattr(n, "value"); String *tm; if (!addSymbol(iname, n)) return SWIG_ERROR; if (namespace_option) Setattr(n, "sym:name", nsname); /* Special hook for member pointer */ if (SwigType_type(type) == T_MPOINTER) { String *wname = Swig_name_wrapper(iname); Printf(f_wrappers, "static %s = %s;\n", SwigType_str(type, wname), value); value = Char(wname); } if ((tm = Swig_typemap_lookup("consttab", n, name, 0))) { Replaceall(tm, "$source", value); Replaceall(tm, "$target", name); Replaceall(tm, "$value", value); Replaceall(tm, "$nsname", nsname); Printf(const_tab, "%s,\n", tm); } else if ((tm = Swig_typemap_lookup("constcode", n, name, 0))) { Replaceall(tm, "$source", value); Replaceall(tm, "$target", name); Replaceall(tm, "$value", value); Replaceall(tm, "$nsname", nsname); Printf(f_init, "%s\n", tm); } else { Delete(nsname); Swig_warning(WARN_TYPEMAP_CONST_UNDEF, input_file, line_number, "Unsupported constant value.\n"); return SWIG_NOWRAP; } Delete(nsname); return SWIG_OK; } /* ------------------------------------------------------------ * nativeWrapper() * ------------------------------------------------------------ */ virtual int nativeWrapper(Node *n) { String *name = Getattr(n, "sym:name"); String *funcname = Getattr(n, "wrap:name"); if (!addSymbol(funcname, n)) return SWIG_ERROR; Printf(f_init, "\t Tcl_CreateObjCommand(interp, SWIG_prefix \"%s\", (swig_wrapper_func) %s, (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL);\n", name, funcname); return SWIG_OK; } /* ------------------------------------------------------------ * classHandler() * ------------------------------------------------------------ */ virtual int classHandler(Node *n) { static Hash *emitted = NewHash(); String *mangled_classname = 0; String *real_classname = 0; have_constructor = 0; have_destructor = 0; destructor_action = 0; constructor_name = 0; if (itcl) { constructor = NewString(""); destructor = NewString(""); base_classes = NewString(""); base_class_init = NewString(""); methods = NewString(""); imethods = NewString(""); attributes = NewString(""); attribute_traces = NewString(""); iattribute_traces = NewString(""); have_base_classes = 0; have_methods = 0; have_attributes = 0; } class_name = Getattr(n, "sym:name"); if (!addSymbol(class_name, n)) return SWIG_ERROR; real_classname = Getattr(n, "name"); mangled_classname = Swig_name_mangle(real_classname); if (Getattr(emitted, mangled_classname)) return SWIG_NOWRAP; Setattr(emitted, mangled_classname, "1"); attr_tab = NewString(""); Printf(attr_tab, "static swig_attribute swig_"); Printv(attr_tab, mangled_classname, "_attributes[] = {\n", NIL); methods_tab = NewStringf(""); Printf(methods_tab, "static swig_method swig_"); Printv(methods_tab, mangled_classname, "_methods[] = {\n", NIL); /* Generate normal wrappers */ Language::classHandler(n); SwigType *t = Copy(Getattr(n, "name")); SwigType_add_pointer(t); // Catch all: eg. a class with only static functions and/or variables will not have 'remembered' // SwigType_remember(t); String *wrap_class = NewStringf("&_wrap_class_%s", mangled_classname); SwigType_remember_clientdata(t, wrap_class); String *rt = Copy(getClassType()); SwigType_add_pointer(rt); // Register the class structure with the type checker /* Printf(f_init,"SWIG_TypeClientData(SWIGTYPE%s, (void *) &_wrap_class_%s);\n", SwigType_manglestr(t), mangled_classname); */ if (have_destructor) { Printv(f_wrappers, "SWIGINTERN void swig_delete_", class_name, "(void *obj) {\n", NIL); if (destructor_action) { Printv(f_wrappers, SwigType_str(rt, "arg1"), " = (", SwigType_str(rt, 0), ") obj;\n", NIL); Printv(f_wrappers, destructor_action, "\n", NIL); } else { if (CPlusPlus) { Printv(f_wrappers, " delete (", SwigType_str(rt, 0), ") obj;\n", NIL); } else { Printv(f_wrappers, " free((char *) obj);\n", NIL); } } Printf(f_wrappers, "}\n"); } Printf(methods_tab, " {0,0}\n};\n"); Printv(f_wrappers, methods_tab, NIL); Printf(attr_tab, " {0,0,0}\n};\n"); Printv(f_wrappers, attr_tab, NIL); /* Handle inheritance */ String *base_class = NewString(""); String *base_class_names = NewString(""); if (itcl) { base_classes = NewString(""); } List *baselist = Getattr(n, "bases"); if (baselist && Len(baselist)) { Iterator b; int index = 0; b = First(baselist); while (b.item) { String *bname = Getattr(b.item, "name"); if ((!bname) || GetFlag(b.item, "feature:ignore") || (!Getattr(b.item, "module"))) { b = Next(b); continue; } if (itcl) { have_base_classes = 1; Printv(base_classes, bname, " ", NIL); Printv(base_class_init, " ", bname, "Ptr::constructor $ptr\n", NIL); } String *bmangle = Swig_name_mangle(bname); // Printv(f_wrappers,"extern swig_class _wrap_class_", bmangle, ";\n", NIL); // Printf(base_class,"&_wrap_class_%s",bmangle); Printf(base_class, "0"); Printf(base_class_names, "\"%s *\",", SwigType_namestr(bname)); /* Put code to register base classes in init function */ //Printf(f_init,"/* Register base : %s */\n", bmangle); //Printf(f_init,"swig_%s_bases[%d] = (swig_class *) SWIG_TypeQuery(\"%s *\")->clientdata;\n", mangled_classname, index, SwigType_namestr(bname)); b = Next(b); index++; Putc(',', base_class); Delete(bmangle); } } if (itcl) { String *ptrclass = NewString(""); // First, build the pointer base class Printv(ptrclass, "itcl::class ", class_name, "Ptr {\n", NIL); if (have_base_classes) Printv(ptrclass, " inherit ", base_classes, "\n", NIL); // Define protected variables for SWIG object pointer Printv(ptrclass, " protected variable swigobj\n", " protected variable thisown\n", NIL); // Define public variables if (have_attributes) { Printv(ptrclass, attributes, NIL); // base class swig_getset was being called for complex inheritance trees if (namespace_option) { Printv(ptrclass, " protected method ", class_name, "_swig_getset {var name1 name2 op} {\n", NIL); Printv(ptrclass, " switch -exact -- $op {\n", " r {set $var [", ns_name, "::", class_name, "_[set var]_get $swigobj]}\n", " w {", ns_name, "::", class_name, "_${var}_set $swigobj [set $var]}\n", " }\n", " }\n", NIL); } else { Printv(ptrclass, " protected method ", class_name, "_swig_getset {var name1 name2 op} {\n", " switch -exact -- $op {\n", " r {set $var [", class_name, "_[set var]_get $swigobj]}\n", " w {", class_name, "_${var}_set $swigobj [set $var]}\n", " }\n", " }\n", NIL); } } // Add the constructor, which may include // calls to base class class constructors Printv(ptrclass, " constructor { ptr } {\n", NIL); if (have_base_classes) { Printv(ptrclass, base_class_init, NIL); Printv(ptrclass, " } {\n", NIL); } Printv(ptrclass, " set swigobj $ptr\n", " set thisown 0\n", NIL); if (have_attributes) { Printv(ptrclass, attribute_traces, NIL); } Printv(ptrclass, " }\n", NIL); // Add destructor Printv(ptrclass, " destructor {\n", " set d_func delete_", class_name, "\n", " if { $thisown && ([info command $d_func] != \"\") } {\n" " $d_func $swigobj\n", " }\n", " }\n", NIL); // Add methods if (have_methods) { Printv(ptrclass, imethods, NIL); }; // Close out the pointer class Printv(ptrclass, "}\n\n", NIL); Printv(f_shadow, ptrclass, NIL); // pointer class end // Create the "real" class. Printv(f_shadow, "itcl::class ", class_name, " {\n", NIL); Printv(f_shadow, " inherit ", class_name, "Ptr\n", NIL); // If we have a constructor, then use it. // If not, then we must have an abstract class without // any constructor. So we create a class constructor // which will fail for this class (but not for inherited // classes). Note that the constructor must fail before // calling the ptrclass constructor. if (have_constructor) { Printv(f_shadow, constructor, NIL); } else { Printv(f_shadow, " constructor { } {\n", NIL); Printv(f_shadow, " # This constructor will fail if called directly\n", NIL); Printv(f_shadow, " if { [info class] == \"::", class_name, "\" } {\n", NIL); Printv(f_shadow, " error \"No constructor for class ", class_name, (Getattr(n, "abstracts") ? " - class is abstract" : ""), "\"\n", NIL); Printv(f_shadow, " }\n", NIL); Printv(f_shadow, " }\n", NIL); } Printv(f_shadow, "}\n\n", NIL); } Printv(f_wrappers, "static swig_class *swig_", mangled_classname, "_bases[] = {", base_class, "0};\n", NIL); Printv(f_wrappers, "static const char * swig_", mangled_classname, "_base_names[] = {", base_class_names, "0};\n", NIL); Delete(base_class); Delete(base_class_names); Printv(f_wrappers, "static swig_class _wrap_class_", mangled_classname, " = { \"", class_name, "\", &SWIGTYPE", SwigType_manglestr(t), ",", NIL); if (have_constructor) { Printf(f_wrappers, "%s", Swig_name_wrapper(Swig_name_construct(NSPACE_TODO, constructor_name))); Delete(constructor_name); constructor_name = 0; } else { Printf(f_wrappers, "0"); } if (have_destructor) { Printv(f_wrappers, ", swig_delete_", class_name, NIL); } else { Printf(f_wrappers, ",0"); } Printv(f_wrappers, ", swig_", mangled_classname, "_methods, swig_", mangled_classname, "_attributes, swig_", mangled_classname, "_bases,", "swig_", mangled_classname, "_base_names, &swig_module, SWIG_TCL_HASHTABLE_INIT };\n", NIL); if (!itcl) { Printv(cmd_tab, tab4, "{ SWIG_prefix \"", class_name, "\", (swig_wrapper_func) SWIG_ObjectConstructor, (ClientData)&_wrap_class_", mangled_classname, "},\n", NIL); }; Delete(t); Delete(mangled_classname); return SWIG_OK; } /* ------------------------------------------------------------ * memberfunctionHandler() * ------------------------------------------------------------ */ virtual int memberfunctionHandler(Node *n) { String *name = Getattr(n, "name"); String *iname = GetChar(n, "sym:name"); String *realname, *rname; Language::memberfunctionHandler(n); realname = iname ? iname : name; rname = Swig_name_wrapper(Swig_name_member(NSPACE_TODO, class_name, realname)); if (!Getattr(n, "sym:nextSibling")) { Printv(methods_tab, tab4, "{\"", realname, "\", ", rname, "}, \n", NIL); } if (itcl) { ParmList *l = Getattr(n, "parms"); Parm *p = 0; String *pname = NewString(""); // Add this member to our class handler function Printv(imethods, tab2, "method ", realname, " [list ", NIL); int pnum = 0; for (p = l; p; p = nextSibling(p)) { String *pn = Getattr(p, "name"); String *dv = Getattr(p, "value"); SwigType *pt = Getattr(p, "type"); Printv(pname, ",(", pt, ")", NIL); Clear(pname); /* Only print an argument if not void */ if (Cmp(pt, "void") != 0) { if (Len(pn) > 0) { Printv(pname, pn, NIL); } else { Printf(pname, "p%d", pnum); } if (Len(dv) > 0) { String *defval = NewString(dv); if (namespace_option) { Insert(defval, 0, "::"); Insert(defval, 0, ns_name); } if (Strncmp(dv, "(", 1) == 0) { Insert(defval, 0, "$"); Replaceall(defval, "(", ""); Replaceall(defval, ")", ""); } Printv(imethods, "[list ", pname, " ", defval, "] ", NIL); } else { Printv(imethods, pname, " ", NIL); } } ++pnum; } Printv(imethods, "] ", NIL); if (namespace_option) { Printv(imethods, "{ ", ns_name, "::", class_name, "_", realname, " $swigobj", NIL); } else { Printv(imethods, "{ ", class_name, "_", realname, " $swigobj", NIL); }; pnum = 0; for (p = l; p; p = nextSibling(p)) { String *pn = Getattr(p, "name"); SwigType *pt = Getattr(p, "type"); Clear(pname); /* Only print an argument if not void */ if (Cmp(pt, "void") != 0) { if (Len(pn) > 0) { Printv(pname, pn, NIL); } else { Printf(pname, "p%d", pnum); } Printv(imethods, " $", pname, NIL); } ++pnum; } Printv(imethods, " }\n", NIL); have_methods = 1; } Delete(rname); return SWIG_OK; } /* ------------------------------------------------------------ * membervariableHandler() * ------------------------------------------------------------ */ virtual int membervariableHandler(Node *n) { String *symname = Getattr(n, "sym:name"); String *rname; Language::membervariableHandler(n); Printv(attr_tab, tab4, "{ \"-", symname, "\",", NIL); rname = Swig_name_wrapper(Swig_name_get(NSPACE_TODO, Swig_name_member(NSPACE_TODO, class_name, symname))); Printv(attr_tab, rname, ", ", NIL); Delete(rname); if (!GetFlag(n, "feature:immutable")) { rname = Swig_name_wrapper(Swig_name_set(NSPACE_TODO, Swig_name_member(NSPACE_TODO, class_name, symname))); Printv(attr_tab, rname, "},\n", NIL); Delete(rname); } else { Printf(attr_tab, "0 },\n"); } if (itcl) { Printv(attributes, " public variable ", symname, "\n", NIL); Printv(attribute_traces, " trace variable ", symname, " rw [list ", class_name, "_swig_getset ", symname, "]\n", NIL); Printv(attribute_traces, " set ", symname, "\n", NIL); have_attributes = 1; } return SWIG_OK; } /* ------------------------------------------------------------ * constructorHandler() * ------------------------------------------------------------ */ virtual int constructorHandler(Node *n) { Language::constructorHandler(n); if (itcl) { String *name = Getattr(n, "name"); String *iname = GetChar(n, "sym:name"); String *realname; ParmList *l = Getattr(n, "parms"); Parm *p = 0; String *pname = NewString(""); realname = iname ? iname : name; if (!have_constructor) { // Add this member to our class handler function Printf(constructor, " constructor { "); // Add parameter list int pnum = 0; for (p = l; p; p = nextSibling(p)) { SwigType *pt = Getattr(p, "type"); String *pn = Getattr(p, "name"); String *dv = Getattr(p, "value"); Clear(pname); /* Only print an argument if not void */ if (Cmp(pt, "void") != 0) { if (Len(pn) > 0) { Printv(pname, pn, NIL); } else { Printf(pname, "p%d", pnum); } if (Len(dv) > 0) { Printv(constructor, "{", pname, " {", dv, "} } ", NIL); } else { Printv(constructor, pname, " ", NIL); } } ++pnum; } Printf(constructor, "} { \n"); // [BRE] 08/17/00 Added test to see if we are instantiating this object // type, or, if this constructor is being called as part of the itcl // inheritance hierarchy. // In the former case, we need to call the C++ constructor, in the // latter we don't, or we end up with two C++ objects. // Check to see if we are instantiating a 'realname' or something // derived from it. // Printv(constructor, " if { [string equal -nocase \"", realname, "\" \"[namespace tail [info class]]\" ] } {\n", NIL); // Call to constructor wrapper and parent Ptr class // [BRE] add -namespace/-prefix support if (namespace_option) { Printv(constructor, " ", realname, "Ptr::constructor [", ns_name, "::new_", realname, NIL); } else { Printv(constructor, " ", realname, "Ptr::constructor [new_", realname, NIL); } pnum = 0; for (p = l; p; p = nextSibling(p)) { SwigType *pt = Getattr(p, "type"); String *pn = Getattr(p, "name"); Clear(pname); /* Only print an argument if not void */ if (Cmp(pt, "void") != 0) { if (Len(pn) > 0) { Printv(pname, pn, NIL); } else { Printf(pname, "p%d", pnum); } Printv(constructor, " $", pname, NIL); } ++pnum; } Printv(constructor, "]\n", " }\n", " } {\n", " set thisown 1\n", " }\n", NIL); } } if (!have_constructor) constructor_name = NewString(Getattr(n, "sym:name")); have_constructor = 1; return SWIG_OK; } /* ------------------------------------------------------------ * destructorHandler() * ------------------------------------------------------------ */ virtual int destructorHandler(Node *n) { Language::destructorHandler(n); have_destructor = 1; destructor_action = Getattr(n, "wrap:action"); return SWIG_OK; } /* ------------------------------------------------------------ * validIdentifier() * ------------------------------------------------------------ */ virtual int validIdentifier(String *s) { if (Strchr(s, ' ')) return 0; return 1; } /* ------------------------------------------------------------ * usage_string() * ------------------------------------------------------------ */ char *usage_string(char *iname, SwigType *, ParmList *l) { static String *temp = 0; Parm *p; int i, numopt, pcount; if (!temp) temp = NewString(""); Clear(temp); if (namespace_option) { Printf(temp, "%s::%s ", ns_name, iname); } else { Printf(temp, "%s ", iname); } /* Now go through and print parameters */ i = 0; pcount = emit_num_arguments(l); numopt = pcount - emit_num_required(l); for (p = l; p; p = nextSibling(p)) { SwigType *pt = Getattr(p, "type"); String *pn = Getattr(p, "name"); /* Only print an argument if not ignored */ if (!checkAttribute(p, "tmap:in:numinputs", "0")) { if (i >= (pcount - numopt)) Putc('?', temp); if (Len(pn) > 0) { Printf(temp, "%s", pn); } else { Printf(temp, "%s", SwigType_str(pt, 0)); } if (i >= (pcount - numopt)) Putc('?', temp); Putc(' ', temp); i++; } } return Char(temp); } String *runtimeCode() { String *s = NewString(""); String *serrors = Swig_include_sys("tclerrors.swg"); if (!serrors) { Printf(stderr, "*** Unable to open 'tclerrors.swg'\n"); } else { Append(s, serrors); Delete(serrors); } String *sapi = Swig_include_sys("tclapi.swg"); if (!sapi) { Printf(stderr, "*** Unable to open 'tclapi.swg'\n"); } else { Append(s, sapi); Delete(sapi); } String *srun = Swig_include_sys("tclrun.swg"); if (!srun) { Printf(stderr, "*** Unable to open 'tclrun.swg'\n"); } else { Append(s, srun); Delete(srun); } return s; } String *defaultExternalRuntimeFilename() { return NewString("swigtclrun.h"); } }; /* ---------------------------------------------------------------------- * swig_tcl() - Instantiate module * ---------------------------------------------------------------------- */ static Language *new_swig_tcl() { return new TCL8(); } extern "C" Language *swig_tcl(void) { return new_swig_tcl(); } swig-4.0.1/Source/Modules/typepass.cxx0000644000175000017500000012243013527063513017616 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * typepass.cxx * * This module builds all of the internal type information by collecting * typedef declarations as well as registering classes, structures, and unions. * This information is needed to correctly handle shadow classes and other * advanced features. This phase of compilation is also used to perform * type-expansion. All types are fully qualified with namespace prefixes * and other information needed for compilation. * ----------------------------------------------------------------------------- */ #include "swigmod.h" #include "cparse.h" struct normal_node { Symtab *symtab; Hash *typescope; List *normallist; normal_node *next; }; static normal_node *patch_list = 0; /* Singleton class - all non-static methods in this class are private */ class TypePass:private Dispatcher { Node *inclass; Node *module; int importmode; String *nsname; String *nssymname; Hash *classhash; List *normalize; TypePass() : inclass(0), module(0), importmode(0), nsname(0), nssymname(0), classhash(0), normalize(0) { } /* Normalize a type. Replaces type with fully qualified version */ void normalize_type(SwigType *ty) { SwigType *qty; if (CPlusPlus) { Replaceall(ty, "struct ", ""); Replaceall(ty, "union ", ""); Replaceall(ty, "class ", ""); } qty = SwigType_typedef_qualified(ty); /* Printf(stdout,"%s --> %s\n", ty, qty); */ Clear(ty); Append(ty, qty); Delete(qty); } /* Normalize a parameter list */ void normalize_parms(ParmList *p) { while (p) { SwigType *ty = Getattr(p, "type"); normalize_type(ty); /* This is a check for a function type */ { SwigType *qty = SwigType_typedef_resolve_all(ty); if (SwigType_isfunction(qty)) { SwigType_add_pointer(ty); } Delete(qty); } String *value = Getattr(p, "value"); if (value) { Node *n = Swig_symbol_clookup(value, 0); if (n) { String *q = Swig_symbol_qualified(n); if (q && Len(q)) { String *vb = Swig_scopename_last(value); Clear(value); Printf(value, "%s::%s", SwigType_namestr(q), vb); Delete(q); } } } if (value && SwigType_istemplate(value)) { String *nv = SwigType_namestr(value); Setattr(p, "value", nv); } p = nextSibling(p); } } void normalize_later(ParmList *p) { while (p) { SwigType *ty = Getattr(p, "type"); Append(normalize, ty); p = nextSibling(p); } } /* Walk through entries in normalize list and patch them up */ void normalize_list() { Hash *currentsym = Swig_symbol_current(); normal_node *nn = patch_list; normal_node *np; while (nn) { Swig_symbol_setscope(nn->symtab); SwigType_set_scope(nn->typescope); Iterator t; for (t = First(nn->normallist); t.item; t = Next(t)) { normalize_type(t.item); } Delete(nn->normallist); np = nn->next; delete(nn); nn = np; } Swig_symbol_setscope(currentsym); } /* generate C++ inheritance type-relationships */ void cplus_inherit_types_impl(Node *first, Node *cls, String *clsname, const char *bases, const char *baselist, int ispublic, String *cast = 0) { if (first == cls) return; /* The Marcelo check */ if (!cls) cls = first; List *alist = 0; List *ilist = Getattr(cls, bases); if (!ilist) { List *nlist = Getattr(cls, baselist); if (nlist) { int len = Len(nlist); int i; for (i = 0; i < len; i++) { Node *bcls = 0; int clsforward = 0; String *bname = Getitem(nlist, i); String *sname = bname; String *tname = 0; /* Try to locate the base class. We look in the symbol table and we chase typedef declarations to get to the base class if necessary */ Symtab *st = Getattr(cls, "sym:symtab"); if (SwigType_istemplate(bname)) { tname = SwigType_typedef_resolve_all(bname); sname = tname; } while (1) { String *qsname = SwigType_typedef_qualified(sname); bcls = Swig_symbol_clookup(qsname, st); Delete(qsname); if (bcls) { if (Strcmp(nodeType(bcls), "class") != 0) { /* Not a class. The symbol could be a typedef. */ if (checkAttribute(bcls, "storage", "typedef")) { SwigType *decl = Getattr(bcls, "decl"); if (!decl || !(Len(decl))) { sname = Getattr(bcls, "type"); st = Getattr(bcls, "sym:symtab"); if (SwigType_istemplate(sname)) { if (tname) Delete(tname); tname = SwigType_typedef_resolve_all(sname); sname = tname; } continue; } // A case when both outer and nested classes inherit from the same parent. Constructor may be found instead of the class itself. } else if (GetFlag(cls, "nested") && checkAttribute(bcls, "nodeType", "constructor")) { bcls = Getattr(bcls, "parentNode"); if (Getattr(bcls, "typepass:visit")) { if (!Getattr(bcls, "feature:onlychildren")) { if (!ilist) ilist = alist = NewList(); Append(ilist, bcls); } else { if (!GetFlag(bcls, "feature:ignore")) { Swig_warning(WARN_TYPE_UNDEFINED_CLASS, Getfile(bname), Getline(bname), "Base class '%s' has no name as it is an empty template instantiated with '%%template()'. Ignored.\n", SwigType_namestr(bname)); Swig_warning(WARN_TYPE_UNDEFINED_CLASS, Getfile(bcls), Getline(bcls), "The %%template directive must be written before '%s' is used as a base class and be declared with a name.\n", SwigType_namestr(bname)); } } } break; } if (Strcmp(nodeType(bcls), "classforward") != 0) { Swig_error(Getfile(bname), Getline(bname), "'%s' is not a valid base class.\n", SwigType_namestr(bname)); Swig_error(Getfile(bcls), Getline(bcls), "See definition of '%s'.\n", SwigType_namestr(bname)); } else { Swig_warning(WARN_TYPE_INCOMPLETE, Getfile(bname), Getline(bname), "Base class '%s' is incomplete.\n", SwigType_namestr(bname)); Swig_warning(WARN_TYPE_INCOMPLETE, Getfile(bcls), Getline(bcls), "Only forward declaration '%s' was found.\n", SwigType_namestr(bname)); clsforward = 1; } bcls = 0; } else { if (Getattr(bcls, "typepass:visit")) { if (!Getattr(bcls, "feature:onlychildren")) { if (!ilist) ilist = alist = NewList(); Append(ilist, bcls); } else { if (!GetFlag(bcls, "feature:ignore")) { Swig_warning(WARN_TYPE_UNDEFINED_CLASS, Getfile(bname), Getline(bname), "Base class '%s' has no name as it is an empty template instantiated with '%%template()'. Ignored.\n", SwigType_namestr(bname)); Swig_warning(WARN_TYPE_UNDEFINED_CLASS, Getfile(bcls), Getline(bcls), "The %%template directive must be written before '%s' is used as a base class and be declared with a name.\n", SwigType_namestr(bname)); } } } else { Swig_warning(WARN_TYPE_UNDEFINED_CLASS, Getfile(bname), Getline(bname), "Base class '%s' undefined.\n", SwigType_namestr(bname)); Swig_warning(WARN_TYPE_UNDEFINED_CLASS, Getfile(bcls), Getline(bcls), "'%s' must be defined before it is used as a base class.\n", SwigType_namestr(bname)); } } } break; } if (tname) Delete(tname); if (!bcls) { if (!clsforward && !GetFlag(cls, "feature:ignore")) { if (ispublic && !Getmeta(bname, "already_warned")) { Swig_warning(WARN_TYPE_UNDEFINED_CLASS, Getfile(bname), Getline(bname), "Nothing known about base class '%s'. Ignored.\n", SwigType_namestr(bname)); if (Strchr(bname, '<')) { Swig_warning(WARN_TYPE_UNDEFINED_CLASS, Getfile(bname), Getline(bname), "Maybe you forgot to instantiate '%s' using %%template.\n", SwigType_namestr(bname)); } Setmeta(bname, "already_warned", "1"); } } SwigType_inherit(clsname, bname, cast, 0); } } } if (ilist) { Setattr(cls, bases, ilist); } } if (alist) Delete(alist); if (!ilist) return; int len = Len(ilist); int i; for (i = 0; i < len; i++) { Node *n = Getitem(ilist, i); String *bname = Getattr(n, "name"); Node *bclass = n; /* Getattr(n,"class"); */ Hash *scopes = Getattr(bclass, "typescope"); SwigType_inherit(clsname, bname, cast, 0); if (ispublic && !GetFlag(bclass, "feature:ignore")) { String *smartptr = Getattr(first, "feature:smartptr"); if (smartptr) { SwigType *smart = Swig_cparse_smartptr(first); if (smart) { /* Record a (fake) inheritance relationship between smart pointer and smart pointer to base class, so that smart pointer upcasts are automatically generated. */ SwigType *bsmart = Copy(smart); SwigType *rclsname = SwigType_typedef_resolve_all(clsname); SwigType *rbname = SwigType_typedef_resolve_all(bname); int replace_count = Replaceall(bsmart, rclsname, rbname); if (replace_count == 0) { // If no replacement made, it will be because rclsname is fully resolved, but the // type in the smartptr feature used a typedef or not fully resolved name. String *firstname = Getattr(first, "name"); Replaceall(bsmart, firstname, rbname); } Delete(rclsname); Delete(rbname); String *smartnamestr = SwigType_namestr(smart); String *bsmartnamestr = SwigType_namestr(bsmart); /* construct casting code */ String *convcode = NewStringf("\n *newmemory = SWIG_CAST_NEW_MEMORY;\n return (void *) new %s(*(%s *)$from);\n", bsmartnamestr, smartnamestr); Delete(bsmartnamestr); Delete(smartnamestr); /* setup inheritance relationship between smart pointer templates */ SwigType_inherit(smart, bsmart, 0, convcode); if (!GetFlag(bclass, "feature:smartptr")) Swig_warning(WARN_LANG_SMARTPTR_MISSING, Getfile(first), Getline(first), "Base class '%s' of '%s' is not similarly marked as a smart pointer.\n", SwigType_namestr(Getattr(bclass, "name")), SwigType_namestr(Getattr(first, "name"))); Delete(convcode); Delete(bsmart); } Delete(smart); } else { if (GetFlag(bclass, "feature:smartptr")) Swig_warning(WARN_LANG_SMARTPTR_MISSING, Getfile(first), Getline(first), "Derived class '%s' of '%s' is not similarly marked as a smart pointer.\n", SwigType_namestr(Getattr(first, "name")), SwigType_namestr(Getattr(bclass, "name"))); } } if (!importmode) { String *btype = Copy(bname); SwigType_add_pointer(btype); SwigType_remember(btype); Delete(btype); } if (scopes) { SwigType_inherit_scope(scopes); } /* Set up inheritance in the symbol table */ Symtab *st = Getattr(cls, "symtab"); Symtab *bst = Getattr(bclass, "symtab"); if (st == bst) { Swig_warning(WARN_PARSE_REC_INHERITANCE, Getfile(cls), Getline(cls), "Recursive scope inheritance of '%s'.\n", SwigType_namestr(Getattr(cls, "name"))); continue; } Symtab *s = Swig_symbol_current(); Swig_symbol_setscope(st); Swig_symbol_inherit(bst); Swig_symbol_setscope(s); /* Recursively hit base classes */ String *namestr = SwigType_namestr(Getattr(bclass, "name")); String *newcast = NewStringf("(%s *)%s", namestr, cast); Delete(namestr); cplus_inherit_types_impl(first, bclass, clsname, bases, baselist, ispublic, newcast); Delete(newcast); } } void append_list(List *lb, List *la) { if (la && lb) { for (Iterator bi = First(la); bi.item; bi = Next(bi)) { Append(lb, bi.item); } } } void cplus_inherit_types(Node *first, Node *cls, String *clsname, String *cast = 0) { cplus_inherit_types_impl(first, cls, clsname, "bases", "baselist", 1, cast); cplus_inherit_types_impl(first, cls, clsname, "protectedbases", "protectedbaselist", 0, cast); cplus_inherit_types_impl(first, cls, clsname, "privatebases", "privatebaselist", 0, cast); if (!cls) cls = first; List *allbases = NewList(); append_list(allbases, Getattr(cls, "bases")); append_list(allbases, Getattr(cls, "protectedbases")); append_list(allbases, Getattr(cls, "privatebases")); if (Len(allbases)) { Setattr(cls, "allbases", allbases); } Delete(allbases); } /* ------------------------------------------------------------ * top() * ------------------------------------------------------------ */ virtual int top(Node *n) { importmode = 0; module = Getattr(n, "module"); inclass = 0; normalize = 0; nsname = 0; nssymname = 0; classhash = Getattr(n, "classes"); emit_children(n); normalize_list(); SwigType_set_scope(0); return SWIG_OK; } /* ------------------------------------------------------------ * moduleDirective() * ------------------------------------------------------------ */ virtual int moduleDirective(Node *n) { if (!module) { module = n; } return SWIG_OK; } /* ------------------------------------------------------------ * importDirective() * ------------------------------------------------------------ */ virtual int importDirective(Node *n) { String *oldmodule = module; int oldimport = importmode; importmode = 1; module = 0; emit_children(n); importmode = oldimport; module = oldmodule; return SWIG_OK; } /* ------------------------------------------------------------ * includeDirective() * externDirective() * extendDirective() * ------------------------------------------------------------ */ virtual int includeDirective(Node *n) { return emit_children(n); } virtual int externDeclaration(Node *n) { return emit_children(n); } virtual int extendDirective(Node *n) { return emit_children(n); } /* ------------------------------------------------------------ * classDeclaration() * ------------------------------------------------------------ */ virtual int classDeclaration(Node *n) { String *name = Getattr(n, "name"); String *tdname = Getattr(n, "tdname"); String *unnamed = Getattr(n, "unnamed"); String *storage = Getattr(n, "storage"); String *kind = Getattr(n, "kind"); save_value oldinclass(inclass); List *olist = normalize; Symtab *symtab; String *nname = 0; String *fname = 0; String *scopename = 0; String *template_default_expanded = 0; normalize = NewList(); if (name) { if (SwigType_istemplate(name)) { // We need to fully resolve the name and expand default template parameters to make templates work correctly */ Node *cn; SwigType *resolved_name = SwigType_typedef_resolve_all(name); SwigType *deftype_name = Swig_symbol_template_deftype(resolved_name, 0); fname = Copy(resolved_name); if (!Equal(resolved_name, deftype_name)) template_default_expanded = Copy(deftype_name); if (!Equal(fname, name) && (cn = Swig_symbol_clookup_local(fname, 0))) { if ((n == cn) || (Strcmp(nodeType(cn), "template") == 0) || (Getattr(cn, "feature:onlychildren") != 0) || (Getattr(n, "feature:onlychildren") != 0)) { Swig_symbol_cadd(fname, n); if (template_default_expanded) Swig_symbol_cadd(template_default_expanded, n); SwigType_typedef_class(fname); scopename = Copy(fname); } else { Swig_warning(WARN_TYPE_REDEFINED, Getfile(n), Getline(n), "Template '%s' was already wrapped,\n", SwigType_namestr(name)); Swig_warning(WARN_TYPE_REDEFINED, Getfile(cn), Getline(cn), "previous wrap of '%s'.\n", SwigType_namestr(Getattr(cn, "name"))); scopename = 0; } } else { Swig_symbol_cadd(fname, n); SwigType_typedef_class(fname); scopename = Copy(fname); } Delete(deftype_name); Delete(resolved_name); } else { if ((CPlusPlus) || (unnamed)) { SwigType_typedef_class(name); } else { SwigType_typedef_class(NewStringf("%s %s", kind, name)); } scopename = Copy(name); } } else { scopename = 0; } Setattr(n, "typepass:visit", "1"); /* Need to set up a typedef if unnamed */ if (unnamed && tdname && (Cmp(storage, "typedef") == 0)) { SwigType_typedef(unnamed, tdname); } // name of the outer class should already be patched to contain its outer classes names, but not to contain namespaces // namespace name (if present) is added after processing child nodes if (Getattr(n, "nested:outer") && name) { String *outerName = Getattr(Getattr(n, "nested:outer"), "name"); name = NewStringf("%s::%s", outerName, name); Setattr(n, "name", name); if (tdname) { tdname = NewStringf("%s::%s", outerName, tdname); Setattr(n, "tdname", tdname); } } if (nsname && name) { nname = NewStringf("%s::%s", nsname, name); String *tdname = Getattr(n, "tdname"); if (tdname) { tdname = NewStringf("%s::%s", nsname, tdname); Setattr(n, "tdname", tdname); } } if (nssymname) { if (GetFlag(n, "feature:nspace")) Setattr(n, "sym:nspace", nssymname); } SwigType_new_scope(scopename); SwigType_attach_symtab(Getattr(n, "symtab")); /* Inherit type definitions into the class */ if (name && !(GetFlag(n, "nested") && !checkAttribute(n, "access", "public") && (GetFlag(n, "feature:flatnested") || Language::instance()->nestedClassesSupport() == Language::NCS_None))) { cplus_inherit_types(n, 0, nname ? nname : (fname ? fname : name)); } inclass = n; symtab = Swig_symbol_setscope(Getattr(n, "symtab")); emit_children(n); Swig_symbol_setscope(symtab); Hash *ts = SwigType_pop_scope(); Setattr(n, "typescope", ts); Delete(ts); Setattr(n, "module", module); // When a fully qualified templated type with default parameters is used in the parsed code, // the following additional symbols and scopes are needed for successful lookups if (template_default_expanded) { Swig_symbol_alias(template_default_expanded, Getattr(n, "symtab")); SwigType_scope_alias(template_default_expanded, Getattr(n, "typescope")); } /* Normalize deferred types */ { normal_node *nn = new normal_node(); nn->normallist = normalize; nn->symtab = Getattr(n, "symtab"); nn->next = patch_list; nn->typescope = Getattr(n, "typescope"); patch_list = nn; } normalize = olist; /* If in a namespace, patch the class name */ if (nname) { Setattr(n, "name", nname); Delete(nname); } Delete(fname); return SWIG_OK; } /* ------------------------------------------------------------ * templateDeclaration() * ------------------------------------------------------------ */ virtual int templateDeclaration(Node *n) { String *name = Getattr(n, "name"); String *ttype = Getattr(n, "templatetype"); if (Strcmp(ttype, "class") == 0) { String *rname = SwigType_typedef_resolve_all(name); SwigType_typedef_class(rname); Delete(rname); } else if (Strcmp(ttype, "classforward") == 0) { String *rname = SwigType_typedef_resolve_all(name); SwigType_typedef_class(rname); Delete(rname); /* SwigType_typedef_class(name); */ } else if (Strcmp(ttype, "cdecl") == 0) { String *rname = SwigType_typedef_resolve_all(name); SwigType_typedef_class(rname); Delete(rname); } return SWIG_OK; } /* ------------------------------------------------------------ * lambdaDeclaration() * ------------------------------------------------------------ */ virtual int lambdaDeclaration(Node *) { return SWIG_OK; } /* ------------------------------------------------------------ * classforwardDeclaration() * ------------------------------------------------------------ */ virtual int classforwardDeclaration(Node *n) { /* Can't do inside a C struct because it breaks C nested structure wrapping */ if ((!inclass) || (CPlusPlus)) { String *name = Getattr(n, "name"); SwigType_typedef_class(name); } return SWIG_OK; } /* ------------------------------------------------------------ * namespaceDeclaration() * ------------------------------------------------------------ */ virtual int namespaceDeclaration(Node *n) { Symtab *symtab; String *name = Getattr(n, "name"); String *alias = Getattr(n, "alias"); List *olist = normalize; normalize = NewList(); if (alias) { Typetab *ts = Getattr(n, "typescope"); if (!ts) { /* Create an empty scope for the alias */ Node *ns = Getattr(n, "namespace"); SwigType_scope_alias(name, Getattr(ns, "typescope")); ts = Getattr(ns, "typescope"); Setattr(n, "typescope", ts); } /* Namespace alias */ return SWIG_OK; } else { if (name) { Node *nn = Swig_symbol_clookup(name, n); Hash *ts = 0; if (nn) ts = Getattr(nn, "typescope"); if (!ts) { SwigType_new_scope(name); SwigType_attach_symtab(Getattr(n, "symtab")); } else { SwigType_set_scope(ts); } } String *oldnsname = nsname; String *oldnssymname = nssymname; nsname = Swig_symbol_qualified(Getattr(n, "symtab")); nssymname = Swig_symbol_qualified_language_scopename(Getattr(n, "symtab")); symtab = Swig_symbol_setscope(Getattr(n, "symtab")); emit_children(n); Swig_symbol_setscope(symtab); if (name) { Hash *ts = SwigType_pop_scope(); Setattr(n, "typescope", ts); Delete(ts); } /* Normalize deferred types */ { normal_node *nn = new normal_node(); nn->normallist = normalize; nn->symtab = Getattr(n, "symtab"); nn->next = patch_list; nn->typescope = Getattr(n, "typescope"); patch_list = nn; } normalize = olist; Delete(nssymname); nssymname = oldnssymname; Delete(nsname); nsname = oldnsname; return SWIG_OK; } } /* ------------------------------------------------------------ * cDeclaration() * ------------------------------------------------------------ */ virtual int cDeclaration(Node *n) { if (NoExcept) { Delattr(n, "throws"); } /* Normalize types. */ SwigType *ty = Getattr(n, "type"); if (!ty) { return SWIG_OK; } normalize_type(ty); SwigType *decl = Getattr(n, "decl"); if (decl) { normalize_type(decl); } normalize_parms(Getattr(n, "parms")); normalize_parms(Getattr(n, "throws")); if (GetFlag(n, "conversion_operator")) { /* The call to the operator in the generated wrapper must be fully qualified in order to compile */ SwigType *name = Getattr(n, "name"); SwigType *qualifiedname = Swig_symbol_string_qualify(name, 0); Clear(name); Append(name, qualifiedname); Delete(qualifiedname); } if (checkAttribute(n, "storage", "typedef")) { String *name = Getattr(n, "name"); ty = Getattr(n, "type"); decl = Getattr(n, "decl"); SwigType *t = Copy(ty); { /* If the typename is qualified, make sure the scopename is fully qualified when making a typedef */ if (Swig_scopename_check(t) && strncmp(Char(t), "::", 2)) { String *base, *prefix, *qprefix; base = Swig_scopename_last(t); prefix = Swig_scopename_prefix(t); qprefix = SwigType_typedef_qualified(prefix); Delete(t); t = NewStringf("%s::%s", qprefix, base); Delete(base); Delete(prefix); Delete(qprefix); } } SwigType_push(t, decl); if (CPlusPlus) { Replaceall(t, "struct ", ""); Replaceall(t, "union ", ""); Replaceall(t, "class ", ""); } SwigType_typedef(t, name); } /* If namespaces are active. We need to patch the name with a namespace prefix */ if (nsname && !inclass) { String *name = Getattr(n, "name"); if (name) { String *nname = NewStringf("%s::%s", nsname, name); Setattr(n, "name", nname); Delete(nname); } } clean_overloaded(n); return SWIG_OK; } /* ------------------------------------------------------------ * constructorDeclaration() * ------------------------------------------------------------ */ virtual int constructorDeclaration(Node *n) { if (NoExcept) { Delattr(n, "throws"); } normalize_parms(Getattr(n, "parms")); normalize_parms(Getattr(n, "throws")); clean_overloaded(n); return SWIG_OK; } /* ------------------------------------------------------------ * destructorDeclaration() * ------------------------------------------------------------ */ virtual int destructorDeclaration(Node *) { return SWIG_OK; } /* ------------------------------------------------------------ * constantDirective() * ------------------------------------------------------------ */ virtual int constantDirective(Node *n) { SwigType *ty = Getattr(n, "type"); if (ty) { Setattr(n, "type", SwigType_typedef_qualified(ty)); } return SWIG_OK; } /* ------------------------------------------------------------ * enumDeclaration() * ------------------------------------------------------------ */ virtual int enumDeclaration(Node *n) { String *name = Getattr(n, "name"); if (name) { String *scope = 0; // Add a typedef to the type table so that we can use 'enum Name' as well as just 'Name' if (nsname || inclass) { // But first correct the name and tdname to contain the fully qualified scopename if (nsname && inclass) { scope = NewStringf("%s::%s", nsname, Getattr(inclass, "name")); } else if (nsname) { scope = NewStringf("%s", nsname); } else if (inclass) { scope = NewStringf("%s", Getattr(inclass, "name")); } String *nname = NewStringf("%s::%s", scope, name); Setattr(n, "name", nname); String *tdname = Getattr(n, "tdname"); if (tdname) { tdname = NewStringf("%s::%s", scope, tdname); Setattr(n, "tdname", tdname); } SwigType *t = NewStringf("enum %s", nname); SwigType_typedef(t, name); } else { SwigType *t = NewStringf("enum %s", name); SwigType_typedef(t, name); } Delete(scope); } String *tdname = Getattr(n, "tdname"); String *unnamed = Getattr(n, "unnamed"); String *storage = Getattr(n, "storage"); // Construct enumtype - for declaring an enum of this type with SwigType_ltype() etc String *enumtype = 0; if (unnamed && tdname && (Cmp(storage, "typedef") == 0)) { enumtype = Copy(Getattr(n, "tdname")); } else if (name) { enumtype = NewStringf("%s%s", CPlusPlus ? "" : "enum ", Getattr(n, "name")); } else { // anonymous enums enumtype = Copy(Getattr(n, "type")); } Setattr(n, "enumtype", enumtype); if (nssymname) { if (GetFlag(n, "feature:nspace")) Setattr(n, "sym:nspace", nssymname); } // This block of code is for dealing with %ignore on an enum item where the target language // attempts to use the C enum value in the target language itself and expects the previous enum value // to be one more than the previous value... the previous enum item might not exist if it is ignored! // - It sets the first non-ignored enum item with the "firstenumitem" attribute. // - It adds an enumvalue attribute if the previous enum item is ignored { Node *c; int count = 0; String *previous = 0; bool previous_ignored = false; bool firstenumitem = false; for (c = firstChild(n); c; c = nextSibling(c)) { assert(strcmp(Char(nodeType(c)), "enumitem") == 0); bool reset; String *enumvalue = Getattr(c, "enumvalue"); if (GetFlag(c, "feature:ignore") || !Getattr(c, "sym:name")) { reset = enumvalue ? true : false; previous_ignored = true; } else { if (!enumvalue && previous_ignored) { if (previous) Setattr(c, "enumvalue", NewStringf("(%s) + %d", previous, count+1)); else Setattr(c, "enumvalue", NewStringf("%d", count)); SetFlag(c, "virtenumvalue"); // identify enumvalue as virtual, ie not from the parsed source } if (!firstenumitem) { SetFlag(c, "firstenumitem"); firstenumitem = true; } reset = true; previous_ignored = false; } if (reset) { previous = enumvalue ? enumvalue : Getattr(c, "name"); count = 0; } else { count++; } } } emit_children(n); return SWIG_OK; } /* ------------------------------------------------------------ * enumvalueDeclaration() * ------------------------------------------------------------ */ virtual int enumvalueDeclaration(Node *n) { String *name = Getattr(n, "name"); String *value = Getattr(n, "value"); String *scopedenum = Getattr(parentNode(n), "scopedenum"); if (!value) value = name; if (Strcmp(value, name) == 0) { String *new_value; if ((nsname || inclass || scopedenum) && cparse_cplusplus) { new_value = NewStringf("%s::%s", SwigType_namestr(Swig_symbol_qualified(n)), value); } else { new_value = NewString(value); } if ((nsname || inclass || scopedenum) && !cparse_cplusplus) { String *cppvalue = NewStringf("%s::%s", SwigType_namestr(Swig_symbol_qualified(n)), value); Setattr(n, "cppvalue", cppvalue); /* for target languages that always generate C++ code even when wrapping C code */ } Setattr(n, "value", new_value); Delete(new_value); } Node *next = nextSibling(n); // Make up an enumvalue if one was not specified in the parsed code (not designed to be used on enum items and %ignore - enumvalue will be set instead) if (!GetFlag(n, "feature:ignore")) { if (Getattr(n, "_last") && !Getattr(n, "enumvalue")) { // Only the first enum item has _last set (Note: first non-ignored enum item has firstenumitem set) Setattr(n, "enumvalueex", "0"); } if (next && !Getattr(next, "enumvalue")) { Setattr(next, "enumvalueex", NewStringf("%s + 1", Getattr(n, "sym:name"))); } } return SWIG_OK; } /* ------------------------------------------------------------ * enumforwardDeclaration() * ------------------------------------------------------------ */ virtual int enumforwardDeclaration(Node *n) { // Use enumDeclaration() to do all the hard work. // Note that no children can be emitted in a forward declaration as there aren't any. int result = enumDeclaration(n); if (result == SWIG_OK) { // Detect when the real enum matching the forward enum declaration has not been parsed/declared SwigType *ty = SwigType_typedef_resolve_all(Getattr(n, "type")); Replaceall(ty, "enum ", ""); Node *nn = Swig_symbol_clookup(ty, 0); String *nodetype = nn ? nodeType(nn) : 0; if (nodetype) { if (Equal(nodetype, "enumforward")) { SetFlag(nn, "enumMissing"); } // if a real enum was declared this would be an "enum" node type } Delete(ty); } return result; } #ifdef DEBUG_OVERLOADED static void show_overloaded(Node *n) { Node *c = Getattr(n, "sym:overloaded"); Node *checkoverloaded = c; Printf(stdout, "-------------------- overloaded start %s sym:overloaded():%p -------------------------------\n", Getattr(n, "name"), c); while (c) { if (Getattr(c, "error")) { c = Getattr(c, "sym:nextSibling"); continue; } if (Getattr(c, "sym:overloaded") != checkoverloaded) { Printf(stdout, "sym:overloaded error c:%p checkoverloaded:%p\n", c, checkoverloaded); Swig_print_node(c); SWIG_exit(EXIT_FAILURE); } String *decl = Strcmp(nodeType(c), "using") == 0 ? NewString("------") : Getattr(c, "decl"); Printf(stdout, " show_overloaded %s::%s(%s) [%s] nodeType:%s\n", parentNode(c) ? Getattr(parentNode(c), "name") : "NOPARENT", Getattr(c, "name"), decl, Getattr(c, "sym:overname"), nodeType(c)); if (!Getattr(c, "sym:overloaded")) { Printf(stdout, "sym:overloaded error.....%p\n", c); Swig_print_node(c); SWIG_exit(EXIT_FAILURE); } c = Getattr(c, "sym:nextSibling"); } Printf(stdout, "-------------------- overloaded end %s -------------------------------\n", Getattr(n, "name")); } #endif /* ------------------------------------------------------------ * usingDeclaration() * ------------------------------------------------------------ */ virtual int usingDeclaration(Node *n) { if (Getattr(n, "namespace")) { /* using namespace id */ /* For a namespace import. We set up inheritance in the type system */ Node *ns = Getattr(n, "node"); if (ns) { Typetab *ts = Getattr(ns, "typescope"); if (ts) { SwigType_using_scope(ts); } } return SWIG_OK; } else { Node *ns; /* using id */ Symtab *stab = Getattr(n, "sym:symtab"); if (stab) { String *uname = Getattr(n, "uname"); ns = Swig_symbol_clookup(uname, stab); if (!ns && SwigType_istemplate(uname)) { String *tmp = Swig_symbol_template_deftype(uname, 0); if (!Equal(tmp, uname)) { ns = Swig_symbol_clookup(tmp, stab); } Delete(tmp); } } else { ns = 0; } if (!ns) { if (is_public(n)) { Swig_warning(WARN_PARSE_USING_UNDEF, Getfile(n), Getline(n), "Nothing known about '%s'.\n", SwigType_namestr(Getattr(n, "uname"))); } } else { /* Only a single symbol is being used. There are only a few symbols that we actually care about. These are typedef, class declarations, and enum */ String *ntype = nodeType(ns); if (Strcmp(ntype, "cdecl") == 0) { if (checkAttribute(ns, "storage", "typedef")) { /* A typedef declaration */ String *uname = Getattr(n, "uname"); SwigType_typedef_using(uname); } else { /* A normal C declaration. */ if ((inclass) && (!GetFlag(n, "feature:ignore")) && (Getattr(n, "sym:name"))) { Node *c = ns; Node *unodes = 0, *last_unodes = 0; int ccount = 0; String *symname = Getattr(n, "sym:name"); while (c) { if (Strcmp(nodeType(c), "cdecl") == 0) { if (!(Swig_storage_isstatic(c) || checkAttribute(c, "storage", "typedef") || checkAttribute(c, "storage", "friend") || (Getattr(c, "feature:extend") && !Getattr(c, "code")) || GetFlag(c, "feature:ignore"))) { /* Don't generate a method if the method is overridden in this class, * for example don't generate another m(bool) should there be a Base::m(bool) : * struct Derived : Base { * void m(bool); * using Base::m; * }; */ String *csymname = Getattr(c, "sym:name"); if (!csymname || (Strcmp(csymname, symname) == 0)) { { String *decl = Getattr(c, "decl"); Node *over = Getattr(n, "sym:overloaded"); int match = 0; while (over) { String *odecl = Getattr(over, "decl"); if (Cmp(decl, odecl) == 0) { match = 1; break; } over = Getattr(over, "sym:nextSibling"); } if (match) { c = Getattr(c, "csym:nextSibling"); continue; } } Node *nn = copyNode(c); Delattr(nn, "access"); // access might be different from the method in the base class Setattr(nn, "access", Getattr(n, "access")); if (!Getattr(nn, "sym:name")) Setattr(nn, "sym:name", symname); if (!GetFlag(nn, "feature:ignore")) { ParmList *parms = CopyParmList(Getattr(c, "parms")); int is_pointer = SwigType_ispointer_return(Getattr(nn, "decl")); int is_void = checkAttribute(nn, "type", "void") && !is_pointer; Setattr(nn, "parms", parms); Delete(parms); if (Getattr(n, "feature:extend")) { String *ucode = is_void ? NewStringf("{ self->%s(", Getattr(n, "uname")) : NewStringf("{ return self->%s(", Getattr(n, "uname")); for (ParmList *p = parms; p;) { Append(ucode, Getattr(p, "name")); p = nextSibling(p); if (p) Append(ucode, ","); } Append(ucode, "); }"); Setattr(nn, "code", ucode); Delete(ucode); } ParmList *throw_parm_list = Getattr(c, "throws"); if (throw_parm_list) Setattr(nn, "throws", CopyParmList(throw_parm_list)); ccount++; if (!last_unodes) { last_unodes = nn; unodes = nn; } else { Setattr(nn, "previousSibling", last_unodes); Setattr(last_unodes, "nextSibling", nn); Setattr(nn, "sym:previousSibling", last_unodes); Setattr(last_unodes, "sym:nextSibling", nn); Setattr(nn, "sym:overloaded", unodes); Setattr(unodes, "sym:overloaded", unodes); last_unodes = nn; } } else { Delete(nn); } } } } c = Getattr(c, "csym:nextSibling"); } if (unodes) { set_firstChild(n, unodes); if (ccount > 1) { if (!Getattr(n, "sym:overloaded")) { Setattr(n, "sym:overloaded", n); Setattr(n, "sym:overname", "_SWIG_0"); } } } /* Hack the parse tree symbol table for overloaded methods. Replace the "using" node with the * list of overloaded methods we have just added in as child nodes to the "using" node. * The node will still exist, it is just the symbol table linked list of overloaded methods * which is hacked. */ if (Getattr(n, "sym:overloaded")) { int cnt = 0; #ifdef DEBUG_OVERLOADED Node *debugnode = n; show_overloaded(n); #endif if (!firstChild(n)) { // Remove from overloaded list ('using' node does not actually end up adding in any methods) Node *ps = Getattr(n, "sym:previousSibling"); Node *ns = Getattr(n, "sym:nextSibling"); if (ps) { Setattr(ps, "sym:nextSibling", ns); } if (ns) { Setattr(ns, "sym:previousSibling", ps); } } else { // The 'using' node results in methods being added in - slot in the these methods here Node *ps = Getattr(n, "sym:previousSibling"); Node *ns = Getattr(n, "sym:nextSibling"); Node *fc = firstChild(n); Node *pp = fc; Node *firstoverloaded = Getattr(n, "sym:overloaded"); if (firstoverloaded == n) { // This 'using' node we are cutting out was the first node in the overloaded list. // Change the first node in the list to its first sibling Delattr(firstoverloaded, "sym:overloaded"); Node *nnn = Getattr(firstoverloaded, "sym:nextSibling"); firstoverloaded = fc; while (nnn) { Setattr(nnn, "sym:overloaded", firstoverloaded); nnn = Getattr(nnn, "sym:nextSibling"); } } while (pp) { Node *ppn = Getattr(pp, "sym:nextSibling"); Setattr(pp, "sym:overloaded", firstoverloaded); Setattr(pp, "sym:overname", NewStringf("%s_%d", Getattr(n, "sym:overname"), cnt++)); if (ppn) pp = ppn; else break; } if (ps) { Setattr(ps, "sym:nextSibling", fc); Setattr(fc, "sym:previousSibling", ps); } if (ns) { Setattr(ns, "sym:previousSibling", pp); Setattr(pp, "sym:nextSibling", ns); } #ifdef DEBUG_OVERLOADED debugnode = firstoverloaded; #endif } Delattr(n, "sym:previousSibling"); Delattr(n, "sym:nextSibling"); Delattr(n, "sym:overloaded"); Delattr(n, "sym:overname"); #ifdef DEBUG_OVERLOADED show_overloaded(debugnode); #endif clean_overloaded(n); // Needed? } } } } else if ((Strcmp(ntype, "class") == 0) || ((Strcmp(ntype, "classforward") == 0))) { /* We install the using class name as kind of a typedef back to the original class */ String *uname = Getattr(n, "uname"); /* Import into current type scope */ SwigType_typedef_using(uname); } else if (Strcmp(ntype, "enum") == 0) { SwigType_typedef_using(Getattr(n, "uname")); } else if (Strcmp(ntype, "template") == 0) { SwigType_typedef_using(Getattr(n, "uname")); } } } return SWIG_OK; } /* ------------------------------------------------------------ * typemapDirective() * ------------------------------------------------------------ */ virtual int typemapDirective(Node *n) { if (inclass || nsname) { Node *items = firstChild(n); while (items) { Parm *pattern = Getattr(items, "pattern"); Parm *parms = Getattr(items, "parms"); normalize_later(pattern); normalize_later(parms); items = nextSibling(items); } } return SWIG_OK; } /* ------------------------------------------------------------ * typemapcopyDirective() * ------------------------------------------------------------ */ virtual int typemapcopyDirective(Node *n) { if (inclass || nsname) { Node *items = firstChild(n); ParmList *pattern = Getattr(n, "pattern"); normalize_later(pattern); while (items) { ParmList *npattern = Getattr(items, "pattern"); normalize_later(npattern); items = nextSibling(items); } } return SWIG_OK; } /* ------------------------------------------------------------ * applyDirective() * ------------------------------------------------------------ */ virtual int applyDirective(Node *n) { if (inclass || nsname) { ParmList *pattern = Getattr(n, "pattern"); normalize_later(pattern); Node *items = firstChild(n); while (items) { Parm *apattern = Getattr(items, "pattern"); normalize_later(apattern); items = nextSibling(items); } } return SWIG_OK; } /* ------------------------------------------------------------ * clearDirective() * ------------------------------------------------------------ */ virtual int clearDirective(Node *n) { if (inclass || nsname) { Node *p; for (p = firstChild(n); p; p = nextSibling(p)) { ParmList *pattern = Getattr(p, "pattern"); normalize_later(pattern); } } return SWIG_OK; } public: static void pass(Node *n) { TypePass t; t.top(n); } }; void Swig_process_types(Node *n) { if (!n) return; TypePass::pass(n); } swig-4.0.1/Source/Modules/python.cxx0000644000175000017500000062223613527063513017300 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * python.cxx * * Python language module for SWIG. * ----------------------------------------------------------------------------- */ #include "swigmod.h" #include #include "cparse.h" #include #include #include "pydoc.h" #include #define PYSHADOW_MEMBER 0x2 #define WARN_PYTHON_MULTIPLE_INH 405 #define PYTHON_INT_MAX (2147483647) #define PYTHON_INT_MIN (-2147483647-1) static String *const_code = 0; static String *module = 0; static String *package = 0; static String *mainmodule = 0; static String *interface = 0; static String *global_name = 0; static int shadow = 1; static int use_kw = 0; static int director_method_index = 0; static int builtin = 0; static File *f_begin = 0; static File *f_runtime = 0; static File *f_runtime_h = 0; static File *f_header = 0; static File *f_wrappers = 0; static File *f_directors = 0; static File *f_directors_h = 0; static File *f_init = 0; static File *f_shadow_py = 0; static String *f_shadow = 0; static String *f_shadow_begin = 0; static Hash *f_shadow_imports = 0; static String *f_shadow_after_begin = 0; static String *f_shadow_stubs = 0; static Hash *builtin_getset = 0; static Hash *builtin_closures = 0; static Hash *class_members = 0; static File *f_builtins = 0; static String *builtin_tp_init = 0; static String *builtin_methods = 0; static String *builtin_default_unref = 0; static String *builtin_closures_code = 0; static String *methods; static String *methods_proxydocs; static String *class_name; static String *shadow_indent = 0; static int in_class = 0; static int no_header_file = 0; static int max_bases = 0; static int builtin_bases_needed = 0; static int py3 = 0; /* C++ Support + Shadow Classes */ static int have_constructor; static int have_repr; static String *real_classname; /* Thread Support */ static int threads = 0; static int nothreads = 0; /* Other options */ static int dirvtable = 0; static int doxygen = 0; static int fastunpack = 1; static int fastproxy = 0; static int olddefs = 0; static int castmode = 0; static int extranative = 0; static int nortti = 0; static int relativeimport = 0; /* flags for the make_autodoc function */ enum autodoc_t { AUTODOC_CLASS, AUTODOC_CTOR, AUTODOC_DTOR, AUTODOC_STATICFUNC, AUTODOC_FUNC, AUTODOC_METHOD, AUTODOC_CONST, AUTODOC_VAR }; static const char *usage1 = "\ Python Options (available with -python)\n\ -builtin - Create Python built-in types rather than proxy classes, for better performance\n\ -castmode - Enable the casting mode, which allows implicit cast between types in Python\n\ -debug-doxygen-parser - Display doxygen parser module debugging information\n\ -debug-doxygen-translator - Display doxygen translator module debugging information\n\ -dirvtable - Generate a pseudo virtual table for directors for faster dispatch\n\ -doxygen - Convert C++ doxygen comments to pydoc comments in proxy classes\n\ -extranative - Return extra native wrappers for C++ std containers wherever possible\n\ -fastproxy - Use fast proxy mechanism for member methods\n\ -globals - Set used to access C global variable (default: 'cvar')\n\ -interface - Set low-level C/C++ module name to (default: module name prefixed by '_')\n\ -keyword - Use keyword arguments\n"; static const char *usage2 = "\ -nofastunpack - Use traditional UnpackTuple method to parse the argument functions\n\ -noh - Don't generate the output header file\n"; static const char *usage3 = "\ -noproxy - Don't generate proxy classes\n\ -nortti - Disable the use of the native C++ RTTI with directors\n\ -nothreads - Disable thread support for the entire interface\n\ -olddefs - Keep the old method definitions when using -fastproxy\n\ -py3 - Generate code with Python 3 specific features and syntax\n\ -relativeimport - Use relative Python imports\n\ -threads - Add thread support for all the interface\n\ -O - Enable the following optimization options:\n\ -fastdispatch -fastproxy -fvirtual\n\ \n"; static String *getSlot(Node *n = NULL, const char *key = NULL, String *default_slot = NULL) { static String *zero = NewString("0"); String *val = n && key && *key ? Getattr(n, key) : NULL; return val ? val : default_slot ? default_slot : zero; } static void printSlot(File *f, String *slotval, const char *slotname, const char *functype = NULL) { String *slotval_override = 0; if (functype && Strcmp(slotval, "0") == 0) slotval = slotval_override = NewStringf("(%s) %s", functype, slotval); int len = Len(slotval); int fieldwidth = len > 41 ? (len > 61 ? 0 : 61 - len) : 41 - len; Printf(f, " %s,%*s/* %s */\n", slotval, fieldwidth, "", slotname); Delete(slotval_override); } static String *getClosure(String *functype, String *wrapper, int funpack = 0) { static const char *functypes[] = { "unaryfunc", "SWIGPY_UNARYFUNC_CLOSURE", "destructor", "SWIGPY_DESTRUCTOR_CLOSURE", "inquiry", "SWIGPY_INQUIRY_CLOSURE", "getiterfunc", "SWIGPY_GETITERFUNC_CLOSURE", "binaryfunc", "SWIGPY_BINARYFUNC_CLOSURE", "ternaryfunc", "SWIGPY_TERNARYFUNC_CLOSURE", "ternarycallfunc", "SWIGPY_TERNARYCALLFUNC_CLOSURE", "lenfunc", "SWIGPY_LENFUNC_CLOSURE", "ssizeargfunc", "SWIGPY_SSIZEARGFUNC_CLOSURE", "ssizessizeargfunc", "SWIGPY_SSIZESSIZEARGFUNC_CLOSURE", "ssizeobjargproc", "SWIGPY_SSIZEOBJARGPROC_CLOSURE", "ssizessizeobjargproc", "SWIGPY_SSIZESSIZEOBJARGPROC_CLOSURE", "objobjproc", "SWIGPY_OBJOBJPROC_CLOSURE", "objobjargproc", "SWIGPY_OBJOBJARGPROC_CLOSURE", "reprfunc", "SWIGPY_REPRFUNC_CLOSURE", "hashfunc", "SWIGPY_HASHFUNC_CLOSURE", "iternextfunc", "SWIGPY_ITERNEXTFUNC_CLOSURE", NULL }; static const char *funpack_functypes[] = { "unaryfunc", "SWIGPY_UNARYFUNC_CLOSURE", "destructor", "SWIGPY_DESTRUCTOR_CLOSURE", "inquiry", "SWIGPY_INQUIRY_CLOSURE", "getiterfunc", "SWIGPY_GETITERFUNC_CLOSURE", "ternaryfunc", "SWIGPY_TERNARYFUNC_CLOSURE", "ternarycallfunc", "SWIGPY_TERNARYCALLFUNC_CLOSURE", "lenfunc", "SWIGPY_LENFUNC_CLOSURE", "ssizeargfunc", "SWIGPY_FUNPACK_SSIZEARGFUNC_CLOSURE", "ssizessizeargfunc", "SWIGPY_SSIZESSIZEARGFUNC_CLOSURE", "ssizeobjargproc", "SWIGPY_SSIZEOBJARGPROC_CLOSURE", "ssizessizeobjargproc", "SWIGPY_SSIZESSIZEOBJARGPROC_CLOSURE", "objobjproc", "SWIGPY_FUNPACK_OBJOBJPROC_CLOSURE", "objobjargproc", "SWIGPY_OBJOBJARGPROC_CLOSURE", "reprfunc", "SWIGPY_REPRFUNC_CLOSURE", "hashfunc", "SWIGPY_HASHFUNC_CLOSURE", "iternextfunc", "SWIGPY_ITERNEXTFUNC_CLOSURE", NULL }; if (!functype) return NULL; char *c = Char(functype); int i; if (funpack) { for (i = 0; funpack_functypes[i] != NULL; i += 2) { if (!strcmp(c, funpack_functypes[i])) return NewStringf("%s(%s)", funpack_functypes[i + 1], wrapper); } } else { for (i = 0; functypes[i] != NULL; i += 2) { if (!strcmp(c, functypes[i])) return NewStringf("%s(%s)", functypes[i + 1], wrapper); } } return NULL; } class PYTHON:public Language { public: PYTHON() { /* Add code to manage protected constructors and directors */ director_prot_ctor_code = NewString(""); Printv(director_prot_ctor_code, "if ( $comparison ) { /* subclassed */\n", " $director_new \n", "} else {\n", " SWIG_SetErrorMsg(PyExc_RuntimeError,\"accessing abstract class or protected constructor\"); \n", " SWIG_fail;\n", "}\n", NIL); director_multiple_inheritance = 1; director_language = 1; } ~PYTHON() { delete doxygenTranslator; } /* ------------------------------------------------------------ * Thread Implementation * ------------------------------------------------------------ */ int threads_enable(Node *n) const { return threads && !GetFlagAttr(n, "feature:nothread"); } int initialize_threads(String *f_init) { if (!threads) { return SWIG_OK; } Printf(f_init, "\n"); Printf(f_init, "/* Initialize threading */\n"); Printf(f_init, "SWIG_PYTHON_INITIALIZE_THREADS;\n"); return SWIG_OK; } virtual void thread_begin_block(Node *n, String *f) { if (!GetFlag(n, "feature:nothreadblock")) { String *bb = Getattr(n, "feature:threadbeginblock"); if (bb) { Append(f, bb); } else { Append(f, "SWIG_PYTHON_THREAD_BEGIN_BLOCK;\n"); } } } virtual void thread_end_block(Node *n, String *f) { if (!GetFlag(n, "feature:nothreadblock")) { String *eb = Getattr(n, "feature:threadendblock"); if (eb) { Append(f, eb); } else { Append(f, "SWIG_PYTHON_THREAD_END_BLOCK;\n"); } } } virtual void thread_begin_allow(Node *n, String *f) { if (!GetFlag(n, "feature:nothreadallow")) { String *bb = Getattr(n, "feature:threadbeginallow"); Append(f, "{\n"); if (bb) { Append(f, bb); } else { Append(f, "SWIG_PYTHON_THREAD_BEGIN_ALLOW;\n"); } } } virtual void thread_end_allow(Node *n, String *f) { if (!GetFlag(n, "feature:nothreadallow")) { String *eb = Getattr(n, "feature:threadendallow"); Append(f, "\n"); if (eb) { Append(f, eb); } else { Append(f, "SWIG_PYTHON_THREAD_END_ALLOW;"); } Append(f, "\n}"); } } /* ------------------------------------------------------------ * main() * ------------------------------------------------------------ */ virtual void main(int argc, char *argv[]) { SWIG_library_directory("python"); int doxygen_translator_flags = 0; for (int i = 1; i < argc; i++) { if (argv[i]) { if (strcmp(argv[i], "-interface") == 0) { if (argv[i + 1]) { interface = NewString(argv[i + 1]); Swig_mark_arg(i); Swig_mark_arg(i + 1); i++; } else { Swig_arg_error(); } /* end added */ } else if (strcmp(argv[i], "-globals") == 0) { if (argv[i + 1]) { global_name = NewString(argv[i + 1]); Swig_mark_arg(i); Swig_mark_arg(i + 1); i++; } else { Swig_arg_error(); } } else if ((strcmp(argv[i], "-shadow") == 0) || ((strcmp(argv[i], "-proxy") == 0))) { shadow = 1; Swig_mark_arg(i); } else if ((strcmp(argv[i], "-noproxy") == 0)) { shadow = 0; Swig_mark_arg(i); } else if (strcmp(argv[i], "-keyword") == 0) { use_kw = 1; SWIG_cparse_set_compact_default_args(1); Swig_mark_arg(i); } else if (strcmp(argv[i], "-nortti") == 0) { nortti = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-threads") == 0) { threads = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-nothreads") == 0) { /* Turn off thread support mode */ nothreads = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-dirvtable") == 0) { dirvtable = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-doxygen") == 0) { doxygen = 1; scan_doxygen_comments = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-debug-doxygen-translator") == 0) { doxygen_translator_flags |= DoxygenTranslator::debug_translator; Swig_mark_arg(i); } else if (strcmp(argv[i], "-debug-doxygen-parser") == 0) { doxygen_translator_flags |= DoxygenTranslator::debug_parser; Swig_mark_arg(i); } else if (strcmp(argv[i], "-nofastunpack") == 0) { fastunpack = 0; Swig_mark_arg(i); } else if (strcmp(argv[i], "-fastproxy") == 0) { fastproxy = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-olddefs") == 0) { olddefs = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-castmode") == 0) { castmode = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-extranative") == 0) { extranative = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-noh") == 0) { no_header_file = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-newvwm") == 0) { /* Turn on new value wrapper mode */ /* Undocumented option, did have -help text: New value wrapper mode, use only when everything else fails */ Swig_value_wrapper_mode(1); no_header_file = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-O") == 0) { fastproxy = 1; Wrapper_fast_dispatch_mode_set(1); Wrapper_virtual_elimination_mode_set(1); Swig_mark_arg(i); } else if (strcmp(argv[i], "-help") == 0) { fputs(usage1, stdout); fputs(usage2, stdout); fputs(usage3, stdout); } else if (strcmp(argv[i], "-py3") == 0) { py3 = 1; Preprocessor_define("SWIGPYTHON_PY3", 0); Swig_mark_arg(i); } else if (strcmp(argv[i], "-builtin") == 0) { builtin = 1; Preprocessor_define("SWIGPYTHON_BUILTIN", 0); Swig_mark_arg(i); } else if (strcmp(argv[i], "-relativeimport") == 0) { relativeimport = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-cppcast") == 0 || strcmp(argv[i], "-fastinit") == 0 || strcmp(argv[i], "-fastquery") == 0 || strcmp(argv[i], "-fastunpack") == 0 || strcmp(argv[i], "-modern") == 0 || strcmp(argv[i], "-modernargs") == 0 || strcmp(argv[i], "-noproxydel") == 0 || strcmp(argv[i], "-safecstrings") == 0) { Printf(stderr, "Deprecated command line option: %s. This option is now always on.\n", argv[i]); Swig_mark_arg(i); } else if (strcmp(argv[i], "-aliasobj0") == 0 || strcmp(argv[i], "-buildnone") == 0 || strcmp(argv[i], "-classic") == 0 || strcmp(argv[i], "-classptr") == 0 || strcmp(argv[i], "-new_repr") == 0 || strcmp(argv[i], "-new_vwm") == 0 || strcmp(argv[i], "-newrepr") == 0 || strcmp(argv[i], "-noaliasobj0") == 0 || strcmp(argv[i], "-nobuildnone") == 0 || strcmp(argv[i], "-nocastmode") == 0 || strcmp(argv[i], "-nocppcast") == 0 || strcmp(argv[i], "-nodirvtable") == 0 || strcmp(argv[i], "-noextranative") == 0 || strcmp(argv[i], "-nofastinit") == 0 || strcmp(argv[i], "-nofastproxy") == 0 || strcmp(argv[i], "-nofastquery") == 0 || strcmp(argv[i], "-nomodern") == 0 || strcmp(argv[i], "-nomodernargs") == 0 || strcmp(argv[i], "-noolddefs") == 0 || strcmp(argv[i], "-nooutputtuple") == 0 || strcmp(argv[i], "-noproxyimport") == 0 || strcmp(argv[i], "-nosafecstrings") == 0 || strcmp(argv[i], "-old_repr") == 0 || strcmp(argv[i], "-oldrepr") == 0 || strcmp(argv[i], "-outputtuple") == 0 || strcmp(argv[i], "-proxydel") == 0) { Printf(stderr, "Deprecated command line option: %s. This option is no longer supported.\n", argv[i]); Swig_mark_arg(i); SWIG_exit(EXIT_FAILURE); } } } if (doxygen) doxygenTranslator = new PyDocConverter(doxygen_translator_flags); if (!global_name) global_name = NewString("cvar"); Preprocessor_define("SWIGPYTHON 1", 0); SWIG_typemap_lang("python"); SWIG_config_file("python.swg"); allow_overloading(); } /* ------------------------------------------------------------ * top() * ------------------------------------------------------------ */ virtual int top(Node *n) { /* check if directors are enabled for this module. note: this * is a "master" switch, without which no director code will be * emitted. %feature("director") statements are also required * to enable directors for individual classes or methods. * * use %module(directors="1") modulename at the start of the * interface file to enable director generation. */ String *mod_docstring = NULL; String *moduleimport = NULL; { Node *mod = Getattr(n, "module"); if (mod) { Node *options = Getattr(mod, "options"); if (options) { int dirprot = 0; if (Getattr(options, "dirprot")) { dirprot = 1; } if (Getattr(options, "nodirprot")) { dirprot = 0; } if (Getattr(options, "directors")) { allow_directors(); if (dirprot) allow_dirprot(); } if (Getattr(options, "threads")) { threads = 1; } if (Getattr(options, "castmode")) { castmode = 1; } if (Getattr(options, "nocastmode")) { Printf(stderr, "Deprecated module option: %s. This option is no longer supported.\n", "nocastmode"); SWIG_exit(EXIT_FAILURE); } if (Getattr(options, "extranative")) { extranative = 1; } if (Getattr(options, "noextranative")) { Printf(stderr, "Deprecated module option: %s. This option is no longer supported.\n", "noextranative"); SWIG_exit(EXIT_FAILURE); } if (Getattr(options, "outputtuple")) { Printf(stderr, "Deprecated module option: %s. This option is no longer supported.\n", "outputtuple"); SWIG_exit(EXIT_FAILURE); } if (Getattr(options, "nooutputtuple")) { Printf(stderr, "Deprecated module option: %s. This option is no longer supported.\n", "nooutputtuple"); SWIG_exit(EXIT_FAILURE); } mod_docstring = Getattr(options, "docstring"); package = Getattr(options, "package"); moduleimport = Getattr(options, "moduleimport"); } } } /* Set comparison with none for ConstructorToFunction */ setSubclassInstanceCheck(NewString("$arg != Py_None")); /* Initialize all of the output files */ String *outfile = Getattr(n, "outfile"); String *outfile_h = !no_header_file ? Getattr(n, "outfile_h") : 0; f_begin = NewFile(outfile, "w", SWIG_output_files()); if (!f_begin) { FileErrorDisplay(outfile); SWIG_exit(EXIT_FAILURE); } f_runtime = NewString(""); f_init = NewString(""); f_header = NewString(""); f_wrappers = NewString(""); f_directors_h = NewString(""); f_directors = NewString(""); builtin_getset = NewHash(); builtin_closures = NewHash(); builtin_closures_code = NewString(""); class_members = NewHash(); builtin_methods = NewString(""); builtin_default_unref = NewString("delete $self;"); if (builtin) { f_builtins = NewString(""); } if (directorsEnabled()) { if (!no_header_file) { f_runtime_h = NewFile(outfile_h, "w", SWIG_output_files()); if (!f_runtime_h) { FileErrorDisplay(outfile_h); SWIG_exit(EXIT_FAILURE); } } else { f_runtime_h = f_runtime; } } /* Register file targets with the SWIG file handler */ Swig_register_filebyname("header", f_header); Swig_register_filebyname("wrapper", f_wrappers); Swig_register_filebyname("begin", f_begin); Swig_register_filebyname("runtime", f_runtime); Swig_register_filebyname("init", f_init); Swig_register_filebyname("director", f_directors); Swig_register_filebyname("director_h", f_directors_h); const_code = NewString(""); methods = NewString(""); methods_proxydocs = NewString(""); Swig_banner(f_begin); Printf(f_runtime, "\n\n#ifndef SWIGPYTHON\n#define SWIGPYTHON\n#endif\n\n"); if (directorsEnabled()) { Printf(f_runtime, "#define SWIG_DIRECTORS\n"); } if (nothreads) { Printf(f_runtime, "#define SWIG_PYTHON_NO_THREADS\n"); } else if (threads) { Printf(f_runtime, "#define SWIG_PYTHON_THREADS\n"); } if (!dirvtable) { Printf(f_runtime, "#define SWIG_PYTHON_DIRECTOR_NO_VTABLE\n"); } if (nortti) { Printf(f_runtime, "#ifndef SWIG_DIRECTOR_NORTTI\n"); Printf(f_runtime, "#define SWIG_DIRECTOR_NORTTI\n"); Printf(f_runtime, "#endif\n"); } if (castmode) { Printf(f_runtime, "#define SWIG_CASTRANK_MODE\n"); Printf(f_runtime, "#define SWIG_PYTHON_CAST_MODE\n"); } if (extranative) { Printf(f_runtime, "#define SWIG_PYTHON_EXTRA_NATIVE_CONTAINERS\n"); } if (builtin) { Printf(f_runtime, "#define SWIGPYTHON_BUILTIN\n"); } Printf(f_runtime, "\n"); Printf(f_header, "#ifdef SWIG_TypeQuery\n"); Printf(f_header, "# undef SWIG_TypeQuery\n"); Printf(f_header, "#endif\n"); Printf(f_header, "#define SWIG_TypeQuery SWIG_Python_TypeQuery\n"); /* Set module name */ module = Copy(Getattr(n, "name")); mainmodule = Getattr(n, "name"); if (directorsEnabled()) { Swig_banner(f_directors_h); Printf(f_directors_h, "\n"); Printf(f_directors_h, "#ifndef SWIG_%s_WRAP_H_\n", module); Printf(f_directors_h, "#define SWIG_%s_WRAP_H_\n\n", module); if (dirprot_mode()) { Printf(f_directors_h, "#include \n"); Printf(f_directors_h, "#include \n\n"); } Printf(f_directors, "\n\n"); Printf(f_directors, "/* ---------------------------------------------------\n"); Printf(f_directors, " * C++ director class methods\n"); Printf(f_directors, " * --------------------------------------------------- */\n\n"); if (outfile_h) { String *filename = Swig_file_filename(outfile_h); Printf(f_directors, "#include \"%s\"\n\n", filename); Delete(filename); } } /* If shadow classing is enabled, we're going to change the module name to "_module" */ String *default_import_code = NewString(""); if (shadow) { String *filen = NewStringf("%s%s.py", SWIG_output_directory(), Char(module)); // If we don't have an interface then change the module name X to _X if (interface) module = interface; else Insert(module, 0, "_"); if ((f_shadow_py = NewFile(filen, "w", SWIG_output_files())) == 0) { FileErrorDisplay(filen); SWIG_exit(EXIT_FAILURE); } Delete(filen); filen = NULL; f_shadow = NewString(""); f_shadow_begin = NewString(""); f_shadow_imports = NewHash(); f_shadow_after_begin = NewString(""); f_shadow_stubs = NewString(""); Swig_register_filebyname("shadow", f_shadow); Swig_register_filebyname("python", f_shadow); if (!builtin) { /* Import the low-level C/C++ module. This should be a relative import, * since the shadow module may also have been imported by a relative * import, and there is thus no guarantee that the low-level C/C++ module is on * sys.path. Relative imports must be explicitly specified from 2.6.0 * onwards (implicit relative imports raised a DeprecationWarning in 2.6, * and fail in 2.7 onwards). * * First check for __package__ which is available from 2.6 onwards, see PEP366. * Next try determine the shadow wrapper's package based on the __name__ it * was given by the importer that loaded it. * If the module is in a package, load the low-level C/C++ module from the * same package, otherwise load it as a global module. */ Printv(default_import_code, "# Import the low-level C/C++ module\n", NULL); Printv(default_import_code, "if __package__ or \".\" in __name__:\n", NULL); Printv(default_import_code, tab4, "from . import ", module, "\n", NULL); Printv(default_import_code, "else:\n", NULL); Printv(default_import_code, tab4, "import ", module, "\n", NULL); } else { Printv(default_import_code, "# Pull in all the attributes from the low-level C/C++ module\n", NULL); Printv(default_import_code, "if __package__ or \".\" in __name__:\n", NULL); Printv(default_import_code, tab4, "from .", module, " import *\n", NULL); Printv(default_import_code, "else:\n", NULL); Printv(default_import_code, tab4, "from ", module, " import *\n", NULL); } /* Need builtins to qualify names like Exception that might also be defined in this module (try both Python 3 and Python 2 names) */ Printv(f_shadow, "try:\n", tab4, "import builtins as __builtin__\n", "except ImportError:\n", tab4, "import __builtin__\n", NULL); if (!builtin && fastproxy) { Printf(f_shadow, "\n"); Printf(f_shadow, "_swig_new_instance_method = %s.SWIG_PyInstanceMethod_New\n", module); Printf(f_shadow, "_swig_new_static_method = %s.SWIG_PyStaticMethod_New\n", module); } Printv(f_shadow, "\n", "def _swig_repr(self):\n", tab4, "try:\n", tab4, tab4, "strthis = \"proxy of \" + self.this.__repr__()\n", tab4, "except __builtin__.Exception:\n", tab4, tab4, "strthis = \"\"\n", tab4, "return \"<%s.%s; %s >\" % (self.__class__.__module__, self.__class__.__name__, strthis,)\n\n", NIL); Printv(f_shadow, "\n", "def _swig_setattr_nondynamic_instance_variable(set):\n", tab4, "def set_instance_attr(self, name, value):\n", #ifdef USE_THISOWN tab4, tab4, "if name in (\"this\", \"thisown\"):\n", tab4, tab4, tab4, "set(self, name, value)\n", #else tab4, tab4, "if name == \"thisown\":\n", tab4, tab4, tab4, "self.this.own(value)\n", tab4, tab4, "elif name == \"this\":\n", tab4, tab4, tab4, "set(self, name, value)\n", #endif tab4, tab4, "elif hasattr(self, name) and isinstance(getattr(type(self), name), property):\n", tab4, tab4, tab4, "set(self, name, value)\n", tab4, tab4, "else:\n", tab4, tab4, tab4, "raise AttributeError(\"You cannot add instance attributes to %s\" % self)\n", tab4, "return set_instance_attr\n\n", NIL); Printv(f_shadow, "\n", "def _swig_setattr_nondynamic_class_variable(set):\n", tab4, "def set_class_attr(cls, name, value):\n", tab4, tab4, "if hasattr(cls, name) and not isinstance(getattr(cls, name), property):\n", tab4, tab4, tab4, "set(cls, name, value)\n", tab4, tab4, "else:\n", tab4, tab4, tab4, "raise AttributeError(\"You cannot add class attributes to %s\" % cls)\n", tab4, "return set_class_attr\n\n", NIL); Printv(f_shadow, "\n", "def _swig_add_metaclass(metaclass):\n", tab4, "\"\"\"Class decorator for adding a metaclass to a SWIG wrapped class - a slimmed down version of six.add_metaclass\"\"\"\n", tab4, "def wrapper(cls):\n", tab4, tab4, "return metaclass(cls.__name__, cls.__bases__, cls.__dict__.copy())\n", tab4, "return wrapper\n\n", NIL); Printv(f_shadow, "\n", "class _SwigNonDynamicMeta(type):\n", tab4, "\"\"\"Meta class to enforce nondynamic attributes (no new attributes) for a class\"\"\"\n", tab4, "__setattr__ = _swig_setattr_nondynamic_class_variable(type.__setattr__)\n", "\n", NIL); Printv(f_shadow, "\n", NIL); if (directorsEnabled()) { Printv(f_shadow, "import weakref\n\n", NIL); } } // Include some information in the code Printf(f_header, "\n/*-----------------------------------------------\n @(target):= %s.so\n\ ------------------------------------------------*/\n", module); Printf(f_header, "#if PY_VERSION_HEX >= 0x03000000\n"); Printf(f_header, "# define SWIG_init PyInit_%s\n\n", module); Printf(f_header, "#else\n"); Printf(f_header, "# define SWIG_init init%s\n\n", module); Printf(f_header, "#endif\n"); Printf(f_header, "#define SWIG_name \"%s\"\n", module); Printf(f_wrappers, "#ifdef __cplusplus\n"); Printf(f_wrappers, "extern \"C\" {\n"); Printf(f_wrappers, "#endif\n"); Append(const_code, "static swig_const_info swig_const_table[] = {\n"); Append(methods, "static PyMethodDef SwigMethods[] = {\n"); Append(methods_proxydocs, "static PyMethodDef SwigMethods_proxydocs[] = {\n"); /* the method exported for replacement of new.instancemethod in Python 3 */ add_pyinstancemethod_new(); add_pystaticmethod_new(); if (builtin) { SwigType *s = NewString("SwigPyObject"); SwigType_add_pointer(s); SwigType_remember(s); Delete(s); } /* emit code */ Language::top(n); if (directorsEnabled()) { // Insert director runtime into the f_runtime file (make it occur before %header section) Swig_insert_file("director_common.swg", f_runtime); Swig_insert_file("director.swg", f_runtime); } /* Close language module */ Append(methods, "\t { NULL, NULL, 0, NULL }\n"); Append(methods, "};\n"); Printf(f_wrappers, "%s\n", methods); Append(methods_proxydocs, "\t { NULL, NULL, 0, NULL }\n"); Append(methods_proxydocs, "};\n"); Printf(f_wrappers, "%s\n", methods_proxydocs); if (builtin) { Dump(f_builtins, f_wrappers); } SwigType_emit_type_table(f_runtime, f_wrappers); Append(const_code, "{0, 0, 0, 0.0, 0, 0}};\n"); Printf(f_wrappers, "%s\n", const_code); initialize_threads(f_init); Printf(f_init, "#if PY_VERSION_HEX >= 0x03000000\n"); Printf(f_init, " return m;\n"); Printf(f_init, "#else\n"); Printf(f_init, " return;\n"); Printf(f_init, "#endif\n"); Printf(f_init, "}\n"); Printf(f_wrappers, "#ifdef __cplusplus\n"); Printf(f_wrappers, "}\n"); Printf(f_wrappers, "#endif\n"); if (shadow) { Swig_banner_target_lang(f_shadow_py, "#"); if (mod_docstring) { if (Len(mod_docstring)) { const char *triple_double = "\"\"\""; // follow PEP257 rules: https://www.python.org/dev/peps/pep-0257/ // reported by pep257: https://github.com/GreenSteam/pep257 bool multi_line_ds = Strchr(mod_docstring, '\n') != 0; Printv(f_shadow_py, "\n", triple_double, multi_line_ds ? "\n":"", mod_docstring, multi_line_ds ? "\n":"", triple_double, "\n", NIL); } Delete(mod_docstring); mod_docstring = NULL; } if (Len(f_shadow_begin) > 0) Printv(f_shadow_py, "\n", f_shadow_begin, "\n", NIL); Printv(f_shadow_py, "\nfrom sys import version_info as _swig_python_version_info\n", NULL); Printv(f_shadow_py, "if _swig_python_version_info < (2, 7, 0):\n", NULL); Printv(f_shadow_py, tab4, "raise RuntimeError(\"Python 2.7 or later required\")\n\n", NULL); if (Len(f_shadow_after_begin) > 0) Printv(f_shadow_py, f_shadow_after_begin, "\n", NIL); if (moduleimport) { Replaceall(moduleimport, "$module", module); Printv(f_shadow_py, moduleimport, "\n", NIL); } else { Printv(f_shadow_py, default_import_code, NIL); } Printv(f_shadow_py, "\n", f_shadow, "\n", NIL); Printv(f_shadow_py, f_shadow_stubs, "\n", NIL); Delete(f_shadow_py); } /* Close all of the files */ Dump(f_runtime, f_begin); Dump(f_header, f_begin); if (directorsEnabled()) { Dump(f_directors_h, f_runtime_h); Printf(f_runtime_h, "\n"); Printf(f_runtime_h, "#endif\n"); if (f_runtime_h != f_begin) Delete(f_runtime_h); Dump(f_directors, f_begin); } Dump(f_wrappers, f_begin); if (builtin && builtin_bases_needed) Printf(f_begin, "static PyTypeObject *builtin_bases[%d];\n\n", max_bases + 2); Wrapper_pretty_print(f_init, f_begin); Delete(default_import_code); Delete(f_shadow_after_begin); Delete(f_shadow_imports); Delete(f_shadow_begin); Delete(f_shadow); Delete(f_header); Delete(f_wrappers); Delete(f_builtins); Delete(f_init); Delete(f_directors); Delete(f_directors_h); Delete(f_runtime); Delete(f_begin); return SWIG_OK; } /* ------------------------------------------------------------ * Emit the wrapper for PyInstanceMethod_New to MethodDef array. * This wrapper is used to implement -fastproxy, * as a replacement of new.instancemethod in Python 3. * ------------------------------------------------------------ */ int add_pyinstancemethod_new() { String *name = NewString("SWIG_PyInstanceMethod_New"); String *line = NewString(""); Printf(line, "\t { \"%s\", %s, METH_O, NULL},\n", name, name); Append(methods, line); if (fastproxy) { Append(methods_proxydocs, line); } Delete(line); Delete(name); return 0; } /* ------------------------------------------------------------ * Emit the wrapper for PyStaticMethod_New to MethodDef array. * This wrapper is used to ensure the correct documentation is * generated for static methods when using -fastproxy * ------------------------------------------------------------ */ int add_pystaticmethod_new() { if (fastproxy) { String *name = NewString("SWIG_PyStaticMethod_New"); String *line = NewString(""); Printf(line, "\t { \"%s\", %s, METH_O, NULL},\n", name, name); Append(methods, line); Append(methods_proxydocs, line); Delete(line); Delete(name); } return 0; } /* ------------------------------------------------------------ * subpkg_tail() * * Return the name of 'other' package relative to 'base'. * * 1. If 'other' is a sub-package of 'base', returns the 'other' relative to * 'base'. * 2. If 'other' and 'base' are equal, returns empty string "". * 3. In any other case, NULL pointer is returned. * * The 'base' and 'other' are expected to be fully qualified names. * * NOTE: none of 'base' nor 'other' can be null. * * Examples: * * # base other tail * -- ---- ----- ---- * 1 "Foo" "Foo.Bar" -> "Bar" * 2 "Foo" "Foo." -> "" * 3 "Foo" "FooB.ar" -> NULL * 4 "Foo.Bar" "Foo.Bar" -> "" * 5 "Foo.Bar" "Foo" -> NULL * 6 "Foo.Bar" "Foo.Gez" -> NULL * * NOTE: the example #2 is actually a syntax error (at input). I believe * swig parser prevents us from this case happening here. * ------------------------------------------------------------ */ static String *subpkg_tail(const String *base, const String *other) { int baselen = Len(base); int otherlen = Len(other); if (Strncmp(other, base, baselen) == 0) { if ((baselen < otherlen) && (Char(other))[baselen] == '.') { return NewString((Char(other)) + baselen + 1); } else if (baselen == otherlen) { return NewString(""); } else { return 0; } } else { return 0; } } /* ------------------------------------------------------------ * abs_import_directive_string() * * Return a string containing python code to import module. * * pkg package name or the module being imported * mod module name of the module being imported * pfx optional prefix to module name * * NOTE: keep this function consistent with abs_import_name_string(). * ------------------------------------------------------------ */ static String *abs_import_directive_string(const String *pkg, const String *mod, const char *pfx = "") { String *out = NewString(""); if (pkg && *Char(pkg)) { Printf(out, "import %s.%s%s\n", pkg, pfx, mod); } else { Printf(out, "import %s%s\n", pfx, mod); } return out; } /* ------------------------------------------------------------ * rel_import_directive_string() * * Return a string containing python code to import module that * is potentially within a package. * * mainpkg package name of the module which imports the other module * pkg package name or the module being imported * mod module name of the module being imported * pfx optional prefix to module name * * NOTE: keep this function consistent with rel_import_name_string(). * ------------------------------------------------------------ */ static String *rel_import_directive_string(const String *mainpkg, const String *pkg, const String *mod, const char *pfx = "") { /* NOTE: things are not so trivial. This is what we do here (by examples): * * 0. To import module 'foo', which is not in any package, we do absolute * import: * * import foo * * 1. To import 'pkg1.pkg2.foo', when mainpkg != "pkg1" and * mainpkg != "pkg1.pkg2" or when mainpkg is not given we do absolute * import: * * import pkg1.pkg2.foo * * 2. To import module pkg1.foo, when mainpkg == "pkg1", we do: * * - for py3 = 0: * * import foo * * - for py3 = 1: * * from . import foo * * 3. To import "pkg1.pkg2.pkg3.foo", when mainpkg = "pkg1", we do: * * - for py3 == 0: * * import pkg2.pkg3.foo * * - for py3 == 1: * * from . import pkg2 # [1] * import pkg1.pkg2.pkg3.foo * * NOTE: [1] is necessary for pkg2.foo to be present in the importing module */ String *apkg = 0; // absolute (FQDN) package name of pkg String *rpkg = 0; // relative package name int py3_rlen1 = 0; // length of 1st level sub-package name, used by py3 String *out = NewString(""); if (pkg && *Char(pkg)) { if (mainpkg) { String *tail = subpkg_tail(mainpkg, pkg); if (tail) { if (*Char(tail)) { rpkg = NewString(tail); const char *py3_end1 = Strchr(rpkg, '.'); if (!py3_end1) py3_end1 = (Char(rpkg)) + Len(rpkg); py3_rlen1 = (int)(py3_end1 - Char(rpkg)); } else { rpkg = NewString(""); } Delete(tail); } else { apkg = NewString(pkg); } } else { apkg = NewString(pkg); } } else { apkg = NewString(""); } if (apkg) { Printf(out, "import %s%s%s%s\n", apkg, *Char(apkg) ? "." : "", pfx, mod); Delete(apkg); } else { if (py3_rlen1) Printf(out, "from . import %.*s\n", py3_rlen1, rpkg); Printf(out, "from .%s import %s%s\n", rpkg, pfx, mod); Delete(rpkg); } return out; } /* ------------------------------------------------------------ * import_directive_string() * ------------------------------------------------------------ */ static String *import_directive_string(const String *mainpkg, const String *pkg, const String *mod, const char *pfx = "") { if (!relativeimport) { return abs_import_directive_string(pkg, mod, pfx); } else { return rel_import_directive_string(mainpkg, pkg, mod, pfx); } } /* ------------------------------------------------------------ * abs_import_name_string() * * Return a string with the name of a symbol (perhaps imported * from external module by absolute import directive). * * mainpkg package name of current module * mainmod module name of current module * pkg package name of (perhaps other) module * mod module name of (perhaps other) module * sym symbol name * * NOTE: mainmod, mod, and sym can't be NULL. * NOTE: keep this function consistent with abs_import_directive_string() * ------------------------------------------------------------ */ static String *abs_import_name_string(const String *mainpkg, const String *mainmod, const String *pkg, const String *mod, const String *sym) { String *out = NewString(""); if (pkg && *Char(pkg)) { if (mainpkg && *Char(mainpkg)) { if (Strcmp(mainpkg,pkg) != 0 || Strcmp(mainmod, mod) != 0) { Printf(out, "%s.%s.", pkg, mod); } } else { Printf(out, "%s.%s.", pkg, mod); } } else if ((mainpkg && *Char(mainpkg)) || Strcmp(mainmod, mod) != 0) { Printf(out, "%s.", mod); } Append(out, sym); return out; } /* ------------------------------------------------------------ * rel_import_name_string() * * Return a string with the name of a symbol (perhaps imported * from external module by relative import directive). * * mainpkg package name of current module * mainmod module name of current module * pkg package name of (perhaps other) module * mod module name of (perhaps other) module * sym symbol name * * NOTE: mainmod, mod, and sym can't be NULL. * NOTE: keep this function consistent with rel_import_directive_string() * ------------------------------------------------------------ */ static String *rel_import_name_string(const String *mainpkg, const String *mainmod, const String *pkg, const String *mod, const String *sym) { String *out = NewString(""); if (pkg && *Char(pkg)) { String *tail = 0; if (mainpkg) tail = subpkg_tail(mainpkg, pkg); if (!tail) tail = NewString(pkg); if (*Char(tail)) { Printf(out, "%s.%s.", tail, mod); } else if (Strcmp(mainmod, mod) != 0) { Printf(out, "%s.", mod); } Delete(tail); } else if ((mainpkg && *Char(mainpkg)) || Strcmp(mainmod, mod) != 0) { Printf(out, "%s.", mod); } Append(out, sym); return out; } /* ------------------------------------------------------------ * import_name_string() * ------------------------------------------------------------ */ static String *import_name_string(const String *mainpkg, const String *mainmod, const String *pkg, const String *mod, const String *sym) { if (!relativeimport) { return abs_import_name_string(mainpkg,mainmod,pkg,mod,sym); } else { return rel_import_name_string(mainpkg,mainmod,pkg,mod,sym); } } /* ------------------------------------------------------------ * importDirective() * ------------------------------------------------------------ */ virtual int importDirective(Node *n) { if (shadow) { String *modname = Getattr(n, "module"); if (modname) { // Find the module node for this imported module. It should be the // first child but search just in case. Node *mod = firstChild(n); while (mod && Strcmp(nodeType(mod), "module") != 0) mod = nextSibling(mod); Node *options = Getattr(mod, "options"); String *pkg = options ? Getattr(options, "package") : 0; if (!options || (!Getattr(options, "noshadow") && !Getattr(options, "noproxy"))) { String *_import = import_directive_string(package, pkg, modname, "_"); if (!GetFlagAttr(f_shadow_imports, _import)) { String *import = import_directive_string(package, pkg, modname); Printf(builtin ? f_shadow_after_begin : f_shadow, "%s", import); Delete(import); SetFlag(f_shadow_imports, _import); } Delete(_import); } } } return Language::importDirective(n); } /* ------------------------------------------------------------ * funcCall() * * Emit shadow code to call a function in the extension * module. Using proper argument and calling style for * given node n. * ------------------------------------------------------------ */ String *funcCall(String *name, String *parms) { String *str = NewString(""); Printv(str, module, ".", name, "(", parms, ")", NIL); return str; } /* ------------------------------------------------------------ * indent_pythoncode() * * Format (indent) Python code. * Remove leading whitespace from 'code' and re-indent using * the indentation string in 'indent'. * ------------------------------------------------------------ */ String *indent_pythoncode(const String *code, const_String_or_char_ptr indent, String *file, int line, const char *directive_name) { String *out = NewString(""); String *temp; char *t; if (!indent) indent = ""; temp = NewString(code); t = Char(temp); if (*t == '{') { Delitem(temp, 0); Delitem(temp, DOH_END); } /* Split the input text into lines */ List *clist = SplitLines(temp); Delete(temp); // Line number within the pythoncode. int py_line = 0; String *initial = 0; Iterator si; /* Get the initial indentation. Skip lines which only contain whitespace * and/or a comment, as the indentation of those doesn't matter: * * A logical line that contains only spaces, tabs, formfeeds and * possibly a comment, is ignored (i.e., no NEWLINE token is * generated). * * see: * https://docs.python.org/2/reference/lexical_analysis.html#blank-lines * https://docs.python.org/3/reference/lexical_analysis.html#blank-lines */ for (si = First(clist); si.item; si = Next(si), ++py_line) { const char *c = Char(si.item); int i; for (i = 0; isspace((unsigned char)c[i]); i++) { // Scan forward until we find a non-space (which may be a null byte). } char ch = c[i]; if (ch && ch != '#') { // Found a line with actual content. initial = NewStringWithSize(c, i); break; } if (ch) { Printv(out, indent, c, NIL); } Putc('\n', out); } // Process remaining lines. for ( ; si.item; si = Next(si), ++py_line) { const char *c = Char(si.item); // If no prefixed line was found, the above loop should have completed. assert(initial); int i; for (i = 0; isspace((unsigned char)c[i]); i++) { // Scan forward until we find a non-space (which may be a null byte). } char ch = c[i]; if (!ch) { // Line is just whitespace - emit an empty line. Putc('\n', out); continue; } if (ch == '#') { // Comment - the indentation doesn't matter to python, but try to // adjust the whitespace for the benefit of human readers (though SWIG // currently seems to always remove any whitespace before a '#' before // we get here, in which case we'll just leave the comment at the start // of the line). if (i >= Len(initial)) { Printv(out, indent, NIL); } Printv(out, c + i, "\n", NIL); continue; } if (i < Len(initial)) { // There's non-whitespace in the initial prefix of this line. Swig_error(file, line, "Line indented less than expected (line %d of %s) as no line should be indented less than the indentation in line 1\n", py_line, directive_name); Printv(out, indent, c, "\n", NIL); } else { if (memcmp(c, Char(initial), Len(initial)) == 0) { // Prefix matches initial, so just remove it. Printv(out, indent, c + Len(initial), "\n", NIL); continue; } Swig_warning(WARN_PYTHON_INDENT_MISMATCH, file, line, "Whitespace indentation is inconsistent compared to earlier lines (line %d of %s)\n", py_line, directive_name); // To avoid gratuitously breaking interface files which worked with // SWIG <= 3.0.5, we remove a prefix of the same number of bytes for // lines which start with different whitespace to the line we got // 'initial' from. Printv(out, indent, c + Len(initial), "\n", NIL); } } Delete(clist); return out; } /* ------------------------------------------------------------ * indent_docstring() * * Format (indent) a Python docstring. * Remove leading whitespace from 'code' and re-indent using * the indentation string in 'indent'. * ------------------------------------------------------------ */ String *indent_docstring(const String *code, const_String_or_char_ptr indent) { String *out = NewString(""); String *temp; char *t; if (!indent) indent = ""; temp = NewString(code); t = Char(temp); if (*t == '{') { Delitem(temp, 0); Delitem(temp, DOH_END); } /* Split the input text into lines */ List *clist = SplitLines(temp); Delete(temp); Iterator si; int truncate_characters_count = INT_MAX; for (si = First(clist); si.item; si = Next(si)) { const char *c = Char(si.item); int i; for (i = 0; isspace((unsigned char)c[i]); i++) { // Scan forward until we find a non-space (which may be a null byte). } char ch = c[i]; if (ch) { // Found a line which isn't just whitespace if (i < truncate_characters_count) truncate_characters_count = i; } } if (truncate_characters_count == INT_MAX) truncate_characters_count = 0; for (si = First(clist); si.item; si = Next(si)) { const char *c = Char(si.item); int i; for (i = 0; isspace((unsigned char)c[i]); i++) { // Scan forward until we find a non-space (which may be a null byte). } char ch = c[i]; if (!ch) { // Line is just whitespace - emit an empty line. Putc('\n', out); continue; } Printv(out, indent, c + truncate_characters_count, "\n", NIL); } Delete(clist); return out; } /* ------------------------------------------------------------ * autodoc level declarations * ------------------------------------------------------------ */ enum autodoc_l { NO_AUTODOC = -2, // no autodoc STRING_AUTODOC = -1, // use provided string NAMES_AUTODOC = 0, // only parameter names TYPES_AUTODOC = 1, // parameter names and types EXTEND_AUTODOC = 2, // extended documentation and parameter names EXTEND_TYPES_AUTODOC = 3 // extended documentation and parameter types + names }; autodoc_l autodoc_level(String *autodoc) { autodoc_l dlevel = NO_AUTODOC; char *c = Char(autodoc); if (c) { if (isdigit(c[0])) { dlevel = (autodoc_l) atoi(c); } else { if (strcmp(c, "extended") == 0) { dlevel = EXTEND_AUTODOC; } else { dlevel = STRING_AUTODOC; } } } return dlevel; } /* ------------------------------------------------------------ * have_docstring() * * Check if there is a docstring directive and it has text, * or there is an autodoc flag set * ------------------------------------------------------------ */ bool have_docstring(Node *n) { String *str = Getattr(n, "feature:docstring"); return ((str && Len(str) > 0) || (Getattr(n, "feature:autodoc") && !GetFlag(n, "feature:noautodoc")) || (doxygen && doxygenTranslator->hasDocumentation(n)) ); } /* ------------------------------------------------------------ * build_combined_docstring() * * Build the full docstring which may be a combination of the * explicit docstring and autodoc string or, if none of them * is specified, obtained by translating Doxygen comment to * Python. * * Return new string to be deleted by caller (never NIL but * may be empty if there is no docstring). * ------------------------------------------------------------ */ String *build_combined_docstring(Node *n, autodoc_t ad_type, const String *indent = "", bool low_level = false) { String *docstr = Getattr(n, "feature:docstring"); if (docstr && Len(docstr)) { docstr = Copy(docstr); char *t = Char(docstr); if (*t == '{') { Delitem(docstr, 0); Delitem(docstr, DOH_END); } } if (Getattr(n, "feature:autodoc") && !GetFlag(n, "feature:noautodoc")) { String *autodoc = make_autodoc(n, ad_type, low_level); if (autodoc && Len(autodoc) > 0) { if (docstr && Len(docstr)) { Append(autodoc, "\n"); Append(autodoc, docstr); } String *tmp = autodoc; autodoc = docstr; docstr = tmp; } Delete(autodoc); } if (!docstr || !Len(docstr)) { if (doxygen) { docstr = Getattr(n, "python:docstring"); if (!docstr && doxygenTranslator->hasDocumentation(n)) { docstr = doxygenTranslator->getDocumentation(n, 0); // Avoid rebuilding it again the next time: notice that we can't do // this for the combined doc string as autodoc part of it depends on // the sym:name of the node and it is changed while handling it, so // the cached results become incorrect. But Doxygen docstring only // depends on the comment which is not going to change, so we can // safely cache it. Setattr(n, "python:docstring", Copy(docstr)); } else { // Must copy here since if the docstring is multi-line, the String* // here will get Deleted below, which is bad if it is a pointer to // the cached object! docstr = Copy(docstr); } } } if (!docstr) docstr = NewString(""); // If there is more than one line then make docstrings like this: // // """ // This is line1 // And here is line2 followed by the rest of them // """ // // otherwise, put it all on a single line if (Strchr(docstr, '\n')) { String *tmp = NewString(""); Append(tmp, "\n"); Append(tmp, indent_docstring(docstr, indent)); Append(tmp, indent); Delete(docstr); docstr = tmp; } return docstr; } /* ------------------------------------------------------------ * docstring() * * Get the docstring text, stripping off {} if necessary, * and enclose in triple double quotes. If autodoc is also * set then it will build a combined docstring. * ------------------------------------------------------------ */ String *docstring(Node *n, autodoc_t ad_type, const String *indent, bool low_level = false) { String *docstr = build_combined_docstring(n, ad_type, indent, low_level); if (!Len(docstr)) return docstr; // Notice that all comments are created as raw strings (prefix "r"), // because '\' is used often in comments, but may break Python module from // loading. For example, in doxy comment one may write path in quotes: // // This is path to file "C:\x\file.txt" // // Python will not load the module with such comment because of illegal // escape '\x'. '\' may additionally appear in verbatim or htmlonly sections // of doxygen doc, Latex expressions, ... String *doc = NewString(""); Append(doc, "r\"\"\""); Append(doc, docstr); Append(doc, "\"\"\""); Delete(docstr); return doc; } /* ------------------------------------------------------------ * cdocstring() * * Get the docstring text as it would appear in C-language * source code (but without quotes around it). * ------------------------------------------------------------ */ String *cdocstring(Node *n, autodoc_t ad_type, bool low_level = false) { String *ds = build_combined_docstring(n, ad_type, "", low_level); Replaceall(ds, "\\", "\\\\"); Replaceall(ds, "\"", "\\\""); Replaceall(ds, "\n", "\\n\"\n\t\t\""); return ds; } /* ----------------------------------------------------------------------------- * addMissingParameterNames() * * For functions that have not had nameless parameters set in the Language class. * * Inputs: * plist - entire parameter list * arg_num - the number to start from when naming arguments * Side effects: * The "lname" attribute in each parameter in plist will be contain a parameter name * ----------------------------------------------------------------------------- */ void addMissingParameterNames(Node *n, ParmList *plist, int arg_num) { Parm *p = plist; int i = arg_num; while (p) { if (!Getattr(p, "lname")) { String *name = makeParameterName(n, p, i); Setattr(p, "lname", name); Delete(name); } i++; p = nextSibling(p); } } /* ------------------------------------------------------------ * make_autodocParmList() * * Generate the documentation for the function parameters * Parameters: * arg_num: The number to start assigning unnamed arguments from * func_annotation: Function annotation support * ------------------------------------------------------------ */ String *make_autodocParmList(Node *n, bool showTypes, int arg_num = 1, bool calling = false, bool func_annotation = false) { String *doc = NewString(""); String *pdocs = 0; ParmList *plist = CopyParmList(Getattr(n, "parms")); Parm *p; Parm *pnext; if (calling) func_annotation = false; addMissingParameterNames(n, plist, arg_num); // for $1_name substitutions done in Swig_typemap_attach_parms Swig_typemap_attach_parms("in", plist, 0); Swig_typemap_attach_parms("doc", plist, 0); if (Strcmp(ParmList_protostr(plist), "void") == 0) { //No parameters actually return doc; } for (p = plist; p; p = pnext) { String *tm = Getattr(p, "tmap:in"); if (tm) { pnext = Getattr(p, "tmap:in:next"); if (checkAttribute(p, "tmap:in:numinputs", "0")) { continue; } } else { pnext = nextSibling(p); } String *name = 0; String *type = 0; String *value = 0; String *pdoc = Getattr(p, "tmap:doc"); if (pdoc) { name = Getattr(p, "tmap:doc:name"); type = Getattr(p, "tmap:doc:type"); value = Getattr(p, "tmap:doc:value"); } // Skip the "self" argument - it is added to the parameter list automatically // and shouldn't be included in the Parameters block if (Getattr(p, "self")) { continue; } // Note: the generated name should be consistent with that in kwnames[] String *made_name = 0; if (!name) { name = made_name = makeParameterName(n, p, arg_num); } // Increment the argument number once we are sure this is a real argument to count arg_num++; type = type ? type : Getattr(p, "type"); value = value ? value : Getattr(p, "value"); if (SwigType_isvarargs(type)) { Delete(made_name); break; } if (Len(doc)) { // add a comma to the previous one if any Append(doc, ", "); } // Do the param type too? Node *nn = classLookup(Getattr(p, "type")); String *type_str = nn ? Copy(Getattr(nn, "sym:name")) : SwigType_str(type, 0); if (showTypes) Printf(doc, "%s ", type_str); Append(doc, name); if (pdoc) { if (!pdocs) // numpydoc style: https://github.com/numpy/numpy/blob/master/doc/HOWTO_DOCUMENT.rst.txt pdocs = NewString("\nParameters\n----------\n"); Printf(pdocs, "%s\n", pdoc); } // Write the function annotation if (func_annotation) Printf(doc, ": \"%s\"", type_str); // Write default value if (value && !calling) { String *new_value = convertValue(value, Getattr(p, "type")); if (new_value) { value = new_value; } else { // Even if the value is not representable in the target language, still use it in the documentation, for compatibility with the previous SWIG versions // and because it can still be useful to see the C++ expression there. Node *lookup = Swig_symbol_clookup(value, 0); if (lookup) value = Getattr(lookup, "sym:name"); } Printf(doc, "=%s", value); if (new_value) Delete(new_value); } Delete(type_str); Delete(made_name); } if (pdocs) Setattr(n, "feature:pdocs", pdocs); Delete(plist); return doc; } /* ------------------------------------------------------------ * make_autodoc() * * Build a docstring for the node, using parameter and other * info in the parse tree. If the value of the autodoc * attribute is "0" then do not include parameter types, if * it is "1" (the default) then do. If it has some other * value then assume it is supplied by the extension writer * and use it directly. * ------------------------------------------------------------ */ String *make_autodoc(Node *n, autodoc_t ad_type, bool low_level = false) { int extended = 0; bool first_func = true; // If the function is overloaded then this function is called // for the last one. Rewind to the first so the docstrings are // in order. while (Getattr(n, "sym:previousSibling")) n = Getattr(n, "sym:previousSibling"); String *doc = NewString(""); while (n) { bool showTypes = false; bool skipAuto = false; String *autodoc = Getattr(n, "feature:autodoc"); autodoc_l dlevel = autodoc_level(autodoc); switch (dlevel) { case NO_AUTODOC: break; case NAMES_AUTODOC: showTypes = false; break; case TYPES_AUTODOC: showTypes = true; break; case EXTEND_AUTODOC: extended = 1; showTypes = false; break; case EXTEND_TYPES_AUTODOC: extended = 1; showTypes = true; break; case STRING_AUTODOC: Append(doc, autodoc); skipAuto = true; break; } if (!skipAuto) { /* Check if a documentation name was given for either the low-level C API or high-level Python shadow API */ String *symname = Getattr(n, low_level ? "doc:low:name" : "doc:high:name"); if (!symname) { symname = Getattr(n, "sym:name"); } SwigType *type = Getattr(n, "type"); String *type_str = NULL; // If the function has default arguments, then that documentation covers this version too if (Getattr(n, "defaultargs") != NULL) { n = Getattr(n, "sym:nextSibling"); continue; } if (!first_func) Append(doc, "\n"); if (type) { if (Strcmp(type, "void") == 0) { type_str = NULL; } else { Node *nn = classLookup(type); type_str = nn ? Copy(Getattr(nn, "sym:name")) : SwigType_str(type, 0); } } /* Treat the low-level C API functions for getting/setting variables as methods for documentation purposes */ String *kind = Getattr(n, "kind"); if (kind && Strcmp(kind, "variable") == 0) { if (ad_type == AUTODOC_FUNC) { ad_type = AUTODOC_METHOD; } } /* Treat destructors as methods for documentation purposes */ String *nodeType = Getattr(n, "nodeType"); if (nodeType && Strcmp(nodeType, "destructor") == 0) { if (ad_type == AUTODOC_FUNC) { ad_type = AUTODOC_METHOD; } } switch (ad_type) { case AUTODOC_CLASS: { // Only do the autodoc if there isn't a docstring for the class String *str = Getattr(n, "feature:docstring"); if (!str || Len(str) == 0) { if (builtin) { String *name = Getattr(n, "name"); String *rname = add_explicit_scope(SwigType_namestr(name)); Printf(doc, "%s", rname); Delete(rname); } else { if (CPlusPlus) { Printf(doc, "Proxy of C++ %s class.", SwigType_namestr(real_classname)); } else { Printf(doc, "Proxy of C %s struct.", SwigType_namestr(real_classname)); } } } } break; case AUTODOC_CTOR: if (Strcmp(class_name, symname) == 0) { String *paramList = make_autodocParmList(n, showTypes, 2); Printf(doc, "__init__("); if (showTypes) Printf(doc, "%s ", class_name); if (Len(paramList)) Printf(doc, "self, %s) -> %s", paramList, class_name); else Printf(doc, "self) -> %s", class_name); } else Printf(doc, "%s(%s) -> %s", symname, make_autodocParmList(n, showTypes), class_name); break; case AUTODOC_DTOR: if (showTypes) Printf(doc, "__del__(%s self)", class_name); else Printf(doc, "__del__(self)"); break; case AUTODOC_STATICFUNC: Printf(doc, "%s(%s)", symname, make_autodocParmList(n, showTypes)); if (type_str) Printf(doc, " -> %s", type_str); break; case AUTODOC_FUNC: Printf(doc, "%s(%s)", symname, make_autodocParmList(n, showTypes)); if (type_str) Printf(doc, " -> %s", type_str); break; case AUTODOC_METHOD: { String *paramList = make_autodocParmList(n, showTypes, 2); Printf(doc, "%s(", symname); if (showTypes) Printf(doc, "%s ", class_name); if (Len(paramList)) Printf(doc, "self, %s)", paramList); else Printf(doc, "self)"); if (type_str) Printf(doc, " -> %s", type_str); } break; case AUTODOC_CONST: // There is no autodoc support for constants currently, this enum // element only exists to allow calling docstring() with it. return NULL; case AUTODOC_VAR: // Variables can also be documented (e.g. through the property() function in python) Printf(doc, "%s", symname); if (showTypes) { String *type = Getattr(n, "tmap:doc:type"); if (!type) type = Getattr(n, "membervariableHandler:type"); if (!type) type = Getattr(n, "type"); Printf(doc, " : %s", type); } break; } Delete(type_str); // Special case: wrapper functions to get a variable should have no parameters. // Because the node is re-used for the setter and getter, the feature:pdocs field will // exist for the getter function, so explicitly avoid printing parameters in this case. bool variable_getter = kind && Strcmp(kind, "variable") == 0 && Getattr(n, "memberget"); if (extended && ad_type != AUTODOC_VAR && !variable_getter) { String *pdocs = Getattr(n, "feature:pdocs"); if (pdocs) { Printv(doc, "\n", pdocs, NULL); } } } // if it's overloaded then get the next decl and loop around again n = Getattr(n, "sym:nextSibling"); if (n) first_func = false; } return doc; } /* ------------------------------------------------------------ * convertIntegerValue() * * Check if string v is an integer and can be represented in * Python. If so, return an appropriate Python representation, * otherwise (or if we are unsure), return NIL. * ------------------------------------------------------------ */ String *convertIntegerValue(String *v, SwigType *resolved_type) { const char *const s = Char(v); char *end; String *result = NIL; // Check if this is an integer number in any base. errno = 0; long value = strtol(s, &end, 0); if (errno == ERANGE || end == s) return NIL; if (*end != '\0') { // If there is a suffix after the number, we can safely ignore "l" // and (provided the number is unsigned) "u", and also combinations of // these, but not anything else. for (char *p = end; *p != '\0'; ++p) { switch (*p) { case 'l': case 'L': break; case 'u': case 'U': if (value < 0) return NIL; break; default: return NIL; } } } // So now we are certain that we are indeed dealing with an integer // that has a representation as long given by value. // Restrict to guaranteed supported range in Python, see maxint docs: https://docs.python.org/2/library/sys.html#sys.maxint // Don't do this pointless check when long is 32 bits or smaller as strtol will have already failed with ERANGE #if LONG_MAX > PYTHON_INT_MAX || LONG_MIN < PYTHON_INT_MIN if (value > PYTHON_INT_MAX || value < PYTHON_INT_MIN) { return NIL; } #endif if (Cmp(resolved_type, "bool") == 0) // Allow integers as the default value for a bool parameter. return NewString(value ? "True" : "False"); if (value == 0) return NewString(SwigType_ispointer(resolved_type) ? "None" : "0"); // v may still be octal or hexadecimal: const char *p = s; if (*p == '+' || *p == '-') ++p; if (*p == '0' && *(p+1) != 'x' && *(p+1) != 'X') { // This must have been an octal number. This is the only case we // cannot use in Python directly, since Python 2 and 3 use non- // compatible representations. result = NewString(*s == '-' ? "int(\"-" : "int(\""); String *octal_string = NewStringWithSize(p, (int) (end - p)); Append(result, octal_string); Append(result, "\", 8)"); Delete(octal_string); return result; } result = *end == '\0' ? Copy(v) : NewStringWithSize(s, (int) (end - s)); return result; } /* ------------------------------------------------------------ * convertDoubleValue() * * Check if the given string looks like a decimal floating point constant * and return it if it does, otherwise return NIL. * ------------------------------------------------------------ */ String *convertDoubleValue(String *v) { const char *const s = Char(v); char *end; errno = 0; double value = strtod(s, &end); (void) value; if (errno != ERANGE && end != s) { // An added complication: at least some versions of strtod() recognize // hexadecimal floating point numbers which don't exist in Python, so // detect them ourselves and refuse to convert them (this can't be done // without loss of precision in general). // // Also don't accept neither "NAN" nor "INFINITY" (both of which // conveniently contain "n"). if (strpbrk(s, "xXnN")) return NIL; // Disregard optional "f" suffix, it can be just dropped in Python as it // uses doubles for everything anyhow. for (char * p = end; *p != '\0'; ++p) { switch (*p) { case 'f': case 'F': break; default: return NIL; } } // Avoid unnecessary string allocation in the common case when we don't // need to remove any suffix. return *end == '\0' ? Copy(v) : NewStringWithSize(s, (int)(end - s)); } return NIL; } /* ------------------------------------------------------------ * convertValue() * * Check if string v can be a Python value literal or a * constant. Return an equivalent Python representation, * or NIL if it isn't, or we are unsure. * ------------------------------------------------------------ */ String *convertValue(String *v, SwigType *type) { const char *const s = Char(v); String *result = NIL; SwigType *resolved_type = SwigType_typedef_resolve_all(type); result = convertIntegerValue(v, resolved_type); if (!result) { result = convertDoubleValue(v); if (!result) { if (Strcmp(v, "true") == 0) result = NewString("True"); else if (Strcmp(v, "false") == 0) result = NewString("False"); else if (Strcmp(v, "NULL") == 0 || Strcmp(v, "nullptr") == 0) result = SwigType_ispointer(resolved_type) ? NewString("None") : NewString("0"); // This could also be an enum type, default value of which could be // representable in Python if it doesn't include any scope (which could, // but currently is not, translated). else if (!Strchr(s, ':')) { Node *lookup = Swig_symbol_clookup(v, 0); if (lookup) { if (Cmp(Getattr(lookup, "nodeType"), "enumitem") == 0) result = Copy(Getattr(lookup, "sym:name")); } } } } Delete(resolved_type); return result; } /* ------------------------------------------------------------ * is_representable_as_pyargs() * * Check if the function parameters default argument values * can be represented in Python. * * If this method returns false, the parameters will be translated * to a generic "*args" which allows us to deal with default values * at C++ code level where they can always be handled. * ------------------------------------------------------------ */ bool is_representable_as_pyargs(Node *n) { ParmList *plist = CopyParmList(Getattr(n, "parms")); Swig_typemap_attach_parms("default", plist, NULL); Parm *p; Parm *pnext; for (p = plist; p; p = pnext) { pnext = nextSibling(p); String *tm = Getattr(p, "tmap:in"); if (tm) { Parm *in_next = Getattr(p, "tmap:in:next"); if (in_next) pnext = in_next; if (checkAttribute(p, "tmap:in:numinputs", "0")) { continue; } } // "default" typemap can contain arbitrary C++ code, so while it could, in // principle, be possible to examine it and check if it's just something // simple of the form "$1 = expression" and then use convertValue() to // check if expression can be used in Python, but for now we just // pessimistically give up and prefer to handle this at C++ level only. if (Getattr(p, "tmap:default")) return false; String *value = Getattr(p, "value"); if (value) { String *convertedValue = convertValue(value, Getattr(p, "type")); if (!convertedValue) return false; Delete(convertedValue); } } return true; } /* ------------------------------------------------------------ * is_real_overloaded() * * Check if the function is overloaded, but not just have some * siblings generated due to the original function having * default arguments. * ------------------------------------------------------------ */ bool is_real_overloaded(Node *n) { Node *h = Getattr(n, "sym:overloaded"); Node *i; if (!h) return false; i = Getattr(h, "sym:nextSibling"); while (i) { Node *nn = Getattr(i, "defaultargs"); if (nn != h) { /* Check if overloaded function has defaultargs and * pointed to the first overloaded. */ return true; } i = Getattr(i, "sym:nextSibling"); } return false; } /* ------------------------------------------------------------ * make_pyParmList() * * Generate parameter list for Python functions or methods, * reuse make_autodocParmList() to do so. * ------------------------------------------------------------ */ String *make_pyParmList(Node *n, bool in_class, bool is_calling, int kw, bool has_self_for_count = false) { /* Get the original function for a defaultargs copy, * see default_arguments() in parser.y. */ Node *nn = Getattr(n, "defaultargs"); if (nn) n = nn; Parm *parms = Getattr(n, "parms"); int varargs = parms ? emit_isvarargs(parms) : 0; /* We prefer to explicitly list all parameters of the C function in the generated Python code as this makes the function more convenient to use, however in some cases we must replace the real parameters list with just the catch all "*args". This happens when: 1. The function is overloaded as Python doesn't support this. 2. We were explicitly asked to use the "compact" arguments form. 3. We were explicitly asked to use default args from C via the "python:cdefaultargs" feature. 4. One of the default argument values can't be represented in Python. 5. Varargs that haven't been forced to use a fixed number of arguments with %varargs. */ if (is_real_overloaded(n) || GetFlag(n, "feature:compactdefaultargs") || GetFlag(n, "feature:python:cdefaultargs") || !is_representable_as_pyargs(n) || varargs) { String *parms = NewString(""); if (in_class) Printf(parms, "self, "); Printf(parms, "*args"); if (kw) Printf(parms, ", **kwargs"); return parms; } bool funcanno = py3 ? true : false; String *params = NewString(""); String *_params = make_autodocParmList(n, false, ((in_class || has_self_for_count)? 2 : 1), is_calling, funcanno); if (in_class) { Printf(params, "self"); if (Len(_params) > 0) Printf(params, ", "); } Printv(params, _params, NULL); return params; } /* ------------------------------------------------------------ * have_pythonprepend() * * Check if there is a %pythonprepend directive and it has text * ------------------------------------------------------------ */ bool have_pythonprepend(Node *n) { String *str = Getattr(n, "feature:pythonprepend"); return (str && Len(str) > 0); } /* ------------------------------------------------------------ * pythonprepend() * * Get the %pythonprepend code, stripping off {} if necessary * ------------------------------------------------------------ */ String *pythonprepend(Node *n) { String *str = Getattr(n, "feature:pythonprepend"); char *t = Char(str); if (*t == '{') { Delitem(str, 0); Delitem(str, DOH_END); } return str; } /* ------------------------------------------------------------ * have_pythonappend() * * Check if there is a %pythonappend directive and it has text * ------------------------------------------------------------ */ bool have_pythonappend(Node *n) { String *str = Getattr(n, "feature:pythonappend"); if (!str) str = Getattr(n, "feature:addtofunc"); return (str && Len(str) > 0); } /* ------------------------------------------------------------ * pythonappend() * * Get the %pythonappend code, stripping off {} if necessary * ------------------------------------------------------------ */ String *pythonappend(Node *n) { String *str = Getattr(n, "feature:pythonappend"); if (!str) str = Getattr(n, "feature:addtofunc"); char *t = Char(str); if (*t == '{') { Delitem(str, 0); Delitem(str, DOH_END); } return str; } /* ------------------------------------------------------------ * have_addtofunc() * * Check if there is a %addtofunc directive and it has text * ------------------------------------------------------------ */ bool have_addtofunc(Node *n) { return have_pythonappend(n) || have_pythonprepend(n); } /* ------------------------------------------------------------ * returnTypeAnnotation() * * Helper function for constructing the function annotation * of the returning type, return a empty string for Python 2.x * ------------------------------------------------------------ */ String *returnTypeAnnotation(Node *n) { String *ret = 0; Parm *p = Getattr(n, "parms"); String *tm; /* Try to guess the returning type by argout typemap, * however the result may not accurate. */ while (p) { if ((tm = Getattr(p, "tmap:argout:match_type"))) { tm = SwigType_str(tm, 0); if (ret) Printv(ret, ", ", tm, NULL); else ret = tm; p = Getattr(p, "tmap:argout:next"); } else { p = nextSibling(p); } } /* If no argout typemap, then get the returning type from * the function prototype. */ if (!ret) { ret = Getattr(n, "type"); if (ret) ret = SwigType_str(ret, 0); } return (ret && py3) ? NewStringf(" -> \"%s\"", ret) : NewString(""); } /* ------------------------------------------------------------ * emitFunctionShadowHelper() * * Refactoring some common code out of functionWrapper and * dispatchFunction that writes the proxy code for non-member * functions. * ------------------------------------------------------------ */ void emitFunctionShadowHelper(Node *n, File *f_dest, String *name, int kw) { String *parms = make_pyParmList(n, false, false, kw); String *callParms = make_pyParmList(n, false, true, kw); // Callbacks need the C function in order to extract the pointer from the swig_ptr: string bool fast = (fastproxy && !have_addtofunc(n)) || Getattr(n, "feature:callback"); if (!fast || olddefs) { /* Make a wrapper function to insert the code into */ Printv(f_dest, "\n", "def ", name, "(", parms, ")", returnTypeAnnotation(n), ":\n", NIL); if (have_docstring(n)) Printv(f_dest, tab4, docstring(n, AUTODOC_FUNC, tab4, true), "\n", NIL); if (have_pythonprepend(n)) Printv(f_dest, indent_pythoncode(pythonprepend(n), tab4, Getfile(n), Getline(n), "%pythonprepend or %feature(\"pythonprepend\")"), "\n", NIL); if (have_pythonappend(n)) { Printv(f_dest, tab4 "val = ", funcCall(name, callParms), "\n", NIL); Printv(f_dest, indent_pythoncode(pythonappend(n), tab4, Getfile(n), Getline(n), "%pythonappend or %feature(\"pythonappend\")"), "\n", NIL); Printv(f_dest, tab4 "return val\n", NIL); } else { Printv(f_dest, tab4 "return ", funcCall(name, callParms), "\n", NIL); } } // Below may result in a 2nd definition of the method when -olddefs is used. The Python interpreter will use the second definition as it overwrites the first. if (fast) { /* If there is no addtofunc directive then just assign from the extension module (for speed up) */ Printv(f_dest, name, " = ", module, ".", name, "\n", NIL); } } /* ------------------------------------------------------------ * check_kwargs() * * check if using kwargs is allowed for this Node * ------------------------------------------------------------ */ int check_kwargs(Node *n) const { return (use_kw || GetFlag(n, "feature:kwargs")) && !GetFlag(n, "memberset") && !GetFlag(n, "memberget"); } /* ------------------------------------------------------------ * add_method() * ------------------------------------------------------------ */ void add_method(String *name, String *function, int kw, Node *n = 0, int funpack = 0, int num_required = -1, int num_arguments = -1) { String * meth_str = NewString(""); if (!kw) { if (funpack) { if (num_required == 0 && num_arguments == 0) { Printf(meth_str, "\t { \"%s\", %s, METH_NOARGS, ", name, function); } else if (num_required == 1 && num_arguments == 1) { Printf(meth_str, "\t { \"%s\", %s, METH_O, ", name, function); } else { Printf(meth_str, "\t { \"%s\", %s, METH_VARARGS, ", name, function); } } else { Printf(meth_str, "\t { \"%s\", %s, METH_VARARGS, ", name, function); } } else { // Cast via void(*)(void) to suppress GCC -Wcast-function-type warning. // Python should always call the function correctly, but the Python C API // requires us to store it in function pointer of a different type. Printf(meth_str, "\t { \"%s\", (PyCFunction)(void(*)(void))%s, METH_VARARGS|METH_KEYWORDS, ", name, function); } Append(methods, meth_str); if (fastproxy) { Append(methods_proxydocs, meth_str); } Delete(meth_str); if (!n) { Append(methods, "NULL"); if (fastproxy) { Append(methods_proxydocs, "NULL"); } } else if (have_docstring(n)) { /* Use the low-level docstring here since this is the docstring that will be used for the C API */ String *ds = cdocstring(n, Getattr(n, "memberfunction") ? AUTODOC_METHOD : AUTODOC_FUNC, true); Printf(methods, "\"%s\"", ds); if (fastproxy) { /* In the fastproxy case, we must also record the high-level docstring for use in the Python shadow API */ Delete(ds); ds = cdocstring(n, Getattr(n, "memberfunction") ? AUTODOC_METHOD : AUTODOC_FUNC); Printf(methods_proxydocs, "\"%s\"", ds); } Delete(ds); } else if (Getattr(n, "feature:callback")) { Printf(methods, "\"swig_ptr: %s\"", Getattr(n, "feature:callback:name")); if (fastproxy) { Printf(methods_proxydocs, "\"swig_ptr: %s\"", Getattr(n, "feature:callback:name")); } } else { Append(methods, "NULL"); if (fastproxy) { Append(methods_proxydocs, "NULL"); } } Append(methods, "},\n"); if (fastproxy) { Append(methods_proxydocs, "},\n"); } } /* ------------------------------------------------------------ * dispatchFunction() * ------------------------------------------------------------ */ void dispatchFunction(Node *n, String *linkage, int funpack = 0, bool builtin_self = false, bool builtin_ctor = false, bool director_class = false) { /* Last node in overloaded chain */ bool add_self = builtin_self && (!builtin_ctor || director_class); int maxargs; String *tmp = NewString(""); String *dispatch; const char *dispatch_call = funpack ? "%s(self, argc, argv);" : (builtin_ctor ? "%s(self, args, NULL);" : "%s(self, args);"); String *dispatch_code = NewStringf("return %s", dispatch_call); if (castmode) { dispatch = Swig_overload_dispatch_cast(n, dispatch_code, &maxargs); } else { String *fastdispatch_code; if (builtin_ctor) fastdispatch_code = NewStringf("int retval = %s\nif (retval == 0 || !SWIG_Python_TypeErrorOccurred(NULL)) return retval;\nSWIG_fail;", dispatch_call); else fastdispatch_code = NewStringf("PyObject *retobj = %s\nif (!SWIG_Python_TypeErrorOccurred(retobj)) return retobj;\nSWIG_fail;", dispatch_call); if (!CPlusPlus) { Insert(fastdispatch_code, 0, "{\n"); Append(fastdispatch_code, "\n}"); } dispatch = Swig_overload_dispatch(n, dispatch_code, &maxargs, fastdispatch_code); Delete(fastdispatch_code); } /* Generate a dispatch wrapper for all overloaded functions */ Wrapper *f = NewWrapper(); String *symname = Getattr(n, "sym:name"); String *wname = Swig_name_wrapper(symname); const char *builtin_kwargs = builtin_ctor ? ", PyObject *SWIGUNUSEDPARM(kwargs)" : ""; Printv(f->def, linkage, builtin_ctor ? "int " : "PyObject *", wname, "(PyObject *self, PyObject *args", builtin_kwargs, ") {", NIL); Wrapper_add_local(f, "argc", "Py_ssize_t argc"); Printf(tmp, "PyObject *argv[%d] = {0}", maxargs + 1); Wrapper_add_local(f, "argv", tmp); if (!fastunpack) { Wrapper_add_local(f, "ii", "Py_ssize_t ii"); if (maxargs - (add_self ? 1 : 0) > 0) { Append(f->code, "if (!PyTuple_Check(args)) SWIG_fail;\n"); Append(f->code, "argc = PyObject_Length(args);\n"); } else { Append(f->code, "argc = args ? PyObject_Length(args) : 0;\n"); } if (add_self) Append(f->code, "argv[0] = self;\n"); Printf(f->code, "for (ii = 0; (ii < %d) && (ii < argc); ii++) {\n", add_self ? maxargs - 1 : maxargs); Printf(f->code, "argv[ii%s] = PyTuple_GET_ITEM(args,ii);\n", add_self ? " + 1" : ""); Append(f->code, "}\n"); if (add_self) Append(f->code, "argc++;\n"); } else { String *iname = Getattr(n, "sym:name"); Printf(f->code, "if (!(argc = SWIG_Python_UnpackTuple(args, \"%s\", 0, %d, argv%s))) SWIG_fail;\n", iname, maxargs, add_self ? "+1" : ""); if (add_self) Append(f->code, "argv[0] = self;\n"); else Append(f->code, "--argc;\n"); } Replaceall(dispatch, "$args", "self, args"); Printv(f->code, dispatch, "\n", NIL); if (GetFlag(n, "feature:python:maybecall")) { Append(f->code, "fail:\n"); Append(f->code, " Py_INCREF(Py_NotImplemented);\n"); Append(f->code, " return Py_NotImplemented;\n"); } else { Node *sibl = n; while (Getattr(sibl, "sym:previousSibling")) sibl = Getattr(sibl, "sym:previousSibling"); // go all the way up String *protoTypes = NewString(""); do { String *fulldecl = Swig_name_decl(sibl); Printf(protoTypes, "\n\" %s\\n\"", fulldecl); Delete(fulldecl); } while ((sibl = Getattr(sibl, "sym:nextSibling"))); Append(f->code, "fail:\n"); Printf(f->code, " SWIG_Python_RaiseOrModifyTypeError(" "\"Wrong number or type of arguments for overloaded function '%s'.\\n\"" "\n\" Possible C/C++ prototypes are:\\n\"%s);\n", symname, protoTypes); Printf(f->code, "return %s;\n", builtin_ctor ? "-1" : "0"); Delete(protoTypes); } Printv(f->code, "}\n", NIL); Wrapper_print(f, f_wrappers); Node *p = Getattr(n, "sym:previousSibling"); if (!builtin_self) add_method(symname, wname, 0, p); /* Create a shadow for this function (if enabled and not in a member function) */ if (!builtin && (shadow) && (!(shadow & PYSHADOW_MEMBER))) { emitFunctionShadowHelper(n, in_class ? f_shadow_stubs : f_shadow, symname, 0); } DelWrapper(f); Delete(dispatch); Delete(dispatch_code); Delete(tmp); Delete(wname); } /* ------------------------------------------------------------ * functionWrapper() * ------------------------------------------------------------ */ /* A note about argument marshalling with built-in types. There are three distinct cases for member (non-static) methods: 1) An ordinary member function. In this case, the first param in the param list is 'this'. For builtin types, 'this' is taken from the first argument to the wrapper (usually called 'self); it's not extracted from the second argument (which is usually a tuple). 2) A constructor for a non-director class. In this case, the param list doesn't contain an entry for 'this', but the first ('self') argument to the wrapper *does* contain the newly-allocated, uninitialized object. 3) A constructor for a director class. In this case, the param list contains a 'self' param, which comes from the first argument to the wrapper function. */ const char *get_implicitconv_flag(Node *klass) { int conv = 0; if (klass && GetFlag(klass, "feature:implicitconv")) { conv = 1; } return conv ? "SWIG_POINTER_IMPLICIT_CONV" : "0"; } virtual int functionWrapper(Node *n) { String *name = Getattr(n, "name"); String *iname = Getattr(n, "sym:name"); SwigType *d = Getattr(n, "type"); ParmList *l = Getattr(n, "parms"); Node *parent = Swig_methodclass(n); int director_method = 0; Parm *p; int i; char source[64]; Wrapper *f; String *self_parse; String *parse_args; String *arglist; String *get_pointers; String *cleanup; String *outarg; String *kwargs; String *tm; String *overname = 0; int num_required; int num_arguments; int num_fixed_arguments; int tuple_required; int tuple_arguments; int varargs = 0; int allow_kwargs = check_kwargs(n); String *nodeType = Getattr(n, "nodeType"); int constructor = (!Cmp(nodeType, "constructor")); int destructor = (!Cmp(nodeType, "destructor")); String *storage = Getattr(n, "storage"); /* Only the first constructor is handled as init method. Others constructor can be emitted via %rename */ int handled_as_init = 0; if (!have_constructor && (constructor || Getattr(n, "handled_as_constructor")) && ((shadow & PYSHADOW_MEMBER))) { String *nname = Getattr(n, "sym:name"); String *sname = Getattr(getCurrentClass(), "sym:name"); String *cname = Swig_name_construct(NSPACE_TODO, sname); handled_as_init = (Strcmp(nname, sname) == 0) || (Strcmp(nname, cname) == 0); Delete(cname); } bool builtin_self = builtin && in_class && (constructor || (l && Getattr(l, "self"))); bool builtin_ctor = false; if (builtin_self && constructor) { String *class_mname = Getattr(getCurrentClass(), "sym:name"); String *mrename = Swig_name_construct(getNSpace(), class_mname); if (Cmp(iname, mrename)) builtin_self = false; else builtin_ctor = true; Delete(mrename); } bool director_class = (getCurrentClass() && Swig_directorclass(getCurrentClass())); bool add_self = builtin_self && (!builtin_ctor || director_class); bool builtin_getter = (builtin && GetFlag(n, "memberget")); bool builtin_setter = (builtin && GetFlag(n, "memberset") && !builtin_getter); char const *self_param = builtin ? "self" : "SWIGUNUSEDPARM(self)"; char const *wrap_return = builtin_ctor ? "int " : "PyObject *"; String *linkage = NewString("SWIGINTERN "); String *wrapper_name = Swig_name_wrapper(iname); if (Getattr(n, "sym:overloaded")) { overname = Getattr(n, "sym:overname"); } else { if (!addSymbol(iname, n)) return SWIG_ERROR; } f = NewWrapper(); self_parse = NewString(""); parse_args = NewString(""); arglist = NewString(""); get_pointers = NewString(""); cleanup = NewString(""); outarg = NewString(""); kwargs = NewString(""); int allow_thread = threads_enable(n); Wrapper_add_local(f, "resultobj", "PyObject *resultobj = 0"); // Emit all of the local variables for holding arguments. emit_parameter_variables(l, f); /* Attach the standard typemaps */ emit_attach_parmmaps(l, f); Setattr(n, "wrap:parms", l); /* Get number of required and total arguments */ tuple_arguments = num_arguments = emit_num_arguments(l); tuple_required = num_required = emit_num_required(l); if (add_self) { --tuple_arguments; --tuple_required; } num_fixed_arguments = tuple_required; if (((num_arguments == 0) && (num_required == 0)) || ((num_arguments == 1) && (num_required == 1) && Getattr(l, "self"))) allow_kwargs = 0; varargs = emit_isvarargs(l); String *wname = Copy(wrapper_name); if (overname) { Append(wname, overname); } const char *builtin_kwargs = builtin_ctor ? ", PyObject *SWIGUNUSEDPARM(kwargs)" : ""; if (!allow_kwargs || overname) { if (!varargs) { Printv(f->def, linkage, wrap_return, wname, "(PyObject *", self_param, ", PyObject *args", builtin_kwargs, ") {", NIL); } else { Printv(f->def, linkage, wrap_return, wname, "__varargs__", "(PyObject *", self_param, ", PyObject *args, PyObject *varargs) {", NIL); } if (allow_kwargs) { Swig_warning(WARN_LANG_OVERLOAD_KEYWORD, input_file, line_number, "Can't use keyword arguments with overloaded functions (%s).\n", Swig_name_decl(n)); allow_kwargs = 0; } } else { if (varargs) { Swig_warning(WARN_LANG_VARARGS_KEYWORD, input_file, line_number, "Can't wrap varargs with keyword arguments enabled\n"); varargs = 0; } Printv(f->def, linkage, wrap_return, wname, "(PyObject *", self_param, ", PyObject *args, PyObject *kwargs) {", NIL); } if (!builtin || !in_class || tuple_arguments > 0) { if (!allow_kwargs) { Append(parse_args, " if (!PyArg_ParseTuple(args, \""); } else { Append(parse_args, " if (!PyArg_ParseTupleAndKeywords(args, kwargs, \""); Append(arglist, ", kwnames"); } } bool over_varargs = emit_isvarargs_function(n); int funpack = fastunpack && !varargs && !over_varargs && !allow_kwargs; int noargs = funpack && (tuple_required == 0 && tuple_arguments == 0); int onearg = funpack && (tuple_required == 1 && tuple_arguments == 1); if (builtin && funpack && !overname && !builtin_ctor) { int compactdefargs = ParmList_is_compactdefargs(l); if (!(compactdefargs && (tuple_arguments > tuple_required || varargs))) { String *argattr = NewStringf("%d", tuple_arguments); Setattr(n, "python:argcount", argattr); Delete(argattr); } } /* Generate code for argument marshalling */ if (funpack) { if (num_arguments > 0 && !overname) { sprintf(source, "PyObject *swig_obj[%d]", num_arguments); Wrapper_add_localv(f, "swig_obj", source, NIL); } } if (constructor && num_arguments == 1 && num_required == 1) { if (Cmp(storage, "explicit") == 0) { if (GetFlag(parent, "feature:implicitconv")) { String *desc = NewStringf("SWIGTYPE%s", SwigType_manglestr(Getattr(n, "type"))); Printf(f->code, "if (SWIG_CheckImplicit(%s)) SWIG_fail;\n", desc); Delete(desc); } } } if (builtin_ctor && checkAttribute(n, "access", "protected")) { String *tmp_none_comparison = Copy(none_comparison); Replaceall(tmp_none_comparison, "$arg", "self"); Printf(self_parse, "if (!(%s)) {\n", tmp_none_comparison); Printv(self_parse, " SWIG_SetErrorMsg(PyExc_RuntimeError, \"accessing abstract class or protected constructor\");\n SWIG_fail;\n}\n", NIL); Delete(tmp_none_comparison); } int use_parse = 0; Append(kwargs, "{"); for (i = 0, p = l; i < num_arguments; i++) { while (checkAttribute(p, "tmap:in:numinputs", "0")) { p = Getattr(p, "tmap:in:next"); } SwigType *pt = Getattr(p, "type"); String *ln = Getattr(p, "lname"); bool parse_from_tuple = (i > 0 || !add_self); if (SwigType_type(pt) == T_VARARGS) { parse_from_tuple = false; num_fixed_arguments -= atoi(Char(Getattr(p, "tmap:in:numinputs"))); } if (!parse_from_tuple) sprintf(source, "self"); else if (funpack) sprintf(source, "swig_obj[%d]", add_self && !overname ? i - 1 : i); else sprintf(source, "obj%d", builtin_ctor ? i + 1 : i); if (parse_from_tuple) { Printf(arglist, ", "); if (i == num_required) Putc('|', parse_args); /* Optional argument separator */ } /* Keyword argument handling */ if (allow_kwargs && parse_from_tuple) { String *name = makeParameterName(n, p, i + 1); Printf(kwargs, " (char *)\"%s\", ", name); Delete(name); } /* Look for an input typemap */ if ((tm = Getattr(p, "tmap:in"))) { String *parse = Getattr(p, "tmap:in:parse"); if (!parse) { if (builtin_self) { Replaceall(tm, "$self", "self"); } else if (funpack) { Replaceall(tm, "$self", "swig_obj[0]"); } else { Replaceall(tm, "$self", "obj0"); } Replaceall(tm, "$source", source); Replaceall(tm, "$target", ln); Replaceall(tm, "$input", source); Setattr(p, "emit:input", source); /* Save the location of the object */ if (Getattr(p, "wrap:disown") || (Getattr(p, "tmap:in:disown"))) { Replaceall(tm, "$disown", "SWIG_POINTER_DISOWN"); } else { Replaceall(tm, "$disown", "0"); } if (Getattr(p, "tmap:in:implicitconv")) { const char *convflag = "0"; if (!Getattr(p, "hidden")) { SwigType *ptype = Getattr(p, "type"); convflag = get_implicitconv_flag(classLookup(ptype)); } Replaceall(tm, "$implicitconv", convflag); Setattr(p, "implicitconv", convflag); } if (parse_from_tuple) Putc('O', parse_args); if (!funpack && parse_from_tuple) { Wrapper_add_localv(f, source, "PyObject *", source, "= 0", NIL); Printf(arglist, "&%s", source); } if (i >= num_required) Printv(get_pointers, "if (", source, ") {\n", NIL); Printv(get_pointers, tm, "\n", NIL); if (i >= num_required) Printv(get_pointers, "}\n", NIL); } else { use_parse = 1; Append(parse_args, parse); if (parse_from_tuple) Printf(arglist, "&%s", ln); } p = Getattr(p, "tmap:in:next"); continue; } else { Swig_warning(WARN_TYPEMAP_IN_UNDEF, input_file, line_number, "Unable to use type %s as a function argument.\n", SwigType_str(pt, 0)); break; } } /* finish argument marshalling */ Append(kwargs, " NULL }"); if (allow_kwargs) { Printv(f->locals, " char * kwnames[] = ", kwargs, ";\n", NIL); } if (builtin && !funpack && in_class && tuple_arguments == 0) { Printf(parse_args, " if (args && PyTuple_Check(args) && PyTuple_GET_SIZE(args) > 0) SWIG_exception_fail(SWIG_TypeError, \"%s takes no arguments\");\n", iname); } else if (use_parse || allow_kwargs) { Printf(parse_args, ":%s\"", iname); Printv(parse_args, arglist, ")) SWIG_fail;\n", NIL); funpack = 0; } else { Clear(parse_args); if (funpack) { Clear(f->def); if (overname) { if (noargs) { Printv(f->def, linkage, wrap_return, wname, "(PyObject *", self_param, ", Py_ssize_t nobjs, PyObject **SWIGUNUSEDPARM(swig_obj)) {", NIL); } else { Printv(f->def, linkage, wrap_return, wname, "(PyObject *", self_param, ", Py_ssize_t nobjs, PyObject **swig_obj) {", NIL); } Printf(parse_args, "if ((nobjs < %d) || (nobjs > %d)) SWIG_fail;\n", num_required, num_arguments); } else { int is_tp_call = Equal(Getattr(n, "feature:python:slot"), "tp_call"); Printv(f->def, linkage, wrap_return, wname, "(PyObject *", self_param, ", PyObject *args", builtin_kwargs, ") {", NIL); if (onearg && !builtin_ctor && !is_tp_call) { Printf(parse_args, "if (!args) SWIG_fail;\n"); Append(parse_args, "swig_obj[0] = args;\n"); } else if (!noargs) { Printf(parse_args, "if (!SWIG_Python_UnpackTuple(args, \"%s\", %d, %d, swig_obj)) SWIG_fail;\n", iname, num_fixed_arguments, tuple_arguments); } else if (noargs) { Printf(parse_args, "if (!SWIG_Python_UnpackTuple(args, \"%s\", %d, %d, 0)) SWIG_fail;\n", iname, num_fixed_arguments, tuple_arguments); } } } else { Printf(parse_args, "if (!PyArg_UnpackTuple(args, \"%s\", %d, %d", iname, num_fixed_arguments, tuple_arguments); Printv(parse_args, arglist, ")) SWIG_fail;\n", NIL); } } /* Now piece together the first part of the wrapper function */ Printv(f->code, self_parse, parse_args, get_pointers, NIL); /* Check for trailing varargs */ if (varargs) { if (p && (tm = Getattr(p, "tmap:in"))) { Replaceall(tm, "$input", "varargs"); Printv(f->code, tm, "\n", NIL); } } /* Insert constraint checking code */ for (p = l; p;) { if ((tm = Getattr(p, "tmap:check"))) { Replaceall(tm, "$target", Getattr(p, "lname")); Printv(f->code, tm, "\n", NIL); p = Getattr(p, "tmap:check:next"); } else { p = nextSibling(p); } } /* Insert cleanup code */ for (p = l; p;) { if (!Getattr(p, "tmap:in:parse") && (tm = Getattr(p, "tmap:freearg"))) { if (Getattr(p, "tmap:freearg:implicitconv")) { const char *convflag = "0"; if (!Getattr(p, "hidden")) { SwigType *ptype = Getattr(p, "type"); convflag = get_implicitconv_flag(classLookup(ptype)); } if (strcmp(convflag, "0") == 0) { tm = 0; } } if (tm && (Len(tm) != 0)) { Replaceall(tm, "$source", Getattr(p, "lname")); Printv(cleanup, tm, "\n", NIL); } p = Getattr(p, "tmap:freearg:next"); } else { p = nextSibling(p); } } /* Insert argument output code */ for (p = l; p;) { if ((tm = Getattr(p, "tmap:argout"))) { Replaceall(tm, "$source", Getattr(p, "lname")); Replaceall(tm, "$target", "resultobj"); Replaceall(tm, "$arg", Getattr(p, "emit:input")); Replaceall(tm, "$input", Getattr(p, "emit:input")); Printv(outarg, tm, "\n", NIL); p = Getattr(p, "tmap:argout:next"); } else { p = nextSibling(p); } } /* if the object is a director, and the method call originated from its * underlying python object, resolve the call by going up the c++ * inheritance chain. otherwise try to resolve the method in python. * without this check an infinite loop is set up between the director and * shadow class method calls. */ // NOTE: this code should only be inserted if this class is the // base class of a director class. however, in general we haven't // yet analyzed all classes derived from this one to see if they are // directors. furthermore, this class may be used as the base of // a director class defined in a completely different module at a // later time, so this test must be included whether or not directorbase // is true. we do skip this code if directors have not been enabled // at the command line to preserve source-level compatibility with // non-polymorphic swig. also, if this wrapper is for a smart-pointer // method, there is no need to perform the test since the calling object // (the smart-pointer) and the director object (the "pointee") are // distinct. director_method = is_member_director(n) && !is_smart_pointer() && !destructor; if (director_method) { Wrapper_add_local(f, "director", "Swig::Director *director = 0"); Append(f->code, "director = SWIG_DIRECTOR_CAST(arg1);\n"); if (dirprot_mode() && !is_public(n)) { Printf(f->code, "if (!director || !(director->swig_get_inner(\"%s\"))) {\n", name); Printf(f->code, "SWIG_SetErrorMsg(PyExc_RuntimeError,\"accessing protected member %s\");\n", name); Append(f->code, "SWIG_fail;\n"); Append(f->code, "}\n"); } Wrapper_add_local(f, "upcall", "bool upcall = false"); if (funpack) { const char *self_parm = builtin_self ? "self" : "swig_obj[0]"; Printf(f->code, "upcall = (director && (director->swig_get_self()==%s));\n", self_parm); } else { const char *self_parm = builtin_self ? "self" : "obj0"; Printf(f->code, "upcall = (director && (director->swig_get_self()==%s));\n", self_parm); } } /* Emit the function call */ if (director_method) { Append(f->code, "try {\n"); } else { if (allow_thread) { String *preaction = NewString(""); thread_begin_allow(n, preaction); Setattr(n, "wrap:preaction", preaction); String *postaction = NewString(""); thread_end_allow(n, postaction); Setattr(n, "wrap:postaction", postaction); } } Setattr(n, "wrap:name", wname); Swig_director_emit_dynamic_cast(n, f); String *actioncode = emit_action(n); if (director_method) { Append(actioncode, "} catch (Swig::DirectorException&) {\n"); Append(actioncode, " SWIG_fail;\n"); Append(actioncode, "}\n"); } /* This part below still needs cleanup */ /* Return the function value */ tm = Swig_typemap_lookup_out("out", n, Swig_cresult_name(), f, actioncode); if (tm) { if (builtin_self) { Replaceall(tm, "$self", "self"); } else if (funpack) { Replaceall(tm, "$self", "swig_obj[0]"); } else { Replaceall(tm, "$self", "obj0"); } Replaceall(tm, "$source", Swig_cresult_name()); Replaceall(tm, "$target", "resultobj"); Replaceall(tm, "$result", "resultobj"); if (builtin_ctor) { Replaceall(tm, "$owner", "SWIG_BUILTIN_INIT"); } else if (handled_as_init) { Replaceall(tm, "$owner", "SWIG_POINTER_NEW"); } else { if (GetFlag(n, "feature:new")) { Replaceall(tm, "$owner", "SWIG_POINTER_OWN"); } else { Replaceall(tm, "$owner", "0"); } } // FIXME: this will not try to unwrap directors returned as non-director // base class pointers! /* New addition to unwrap director return values so that the original * python object is returned instead. */ #if 1 int unwrap = 0; String *decl = Getattr(n, "decl"); int is_pointer = SwigType_ispointer_return(decl); int is_reference = SwigType_isreference_return(decl); if (is_pointer || is_reference) { String *type = Getattr(n, "type"); //Node *classNode = Swig_methodclass(n); //Node *module = Getattr(classNode, "module"); Node *module = Getattr(parent, "module"); Node *target = Swig_directormap(module, type); if (target) unwrap = 1; } if (unwrap) { Wrapper_add_local(f, "director", "Swig::Director *director = 0"); Printf(f->code, "director = SWIG_DIRECTOR_CAST(%s);\n", Swig_cresult_name()); Append(f->code, "if (director) {\n"); Append(f->code, " resultobj = director->swig_get_self();\n"); Append(f->code, " Py_INCREF(resultobj);\n"); Append(f->code, "} else {\n"); Printf(f->code, "%s\n", tm); Append(f->code, "}\n"); } else { Printf(f->code, "%s\n", tm); } #else Printf(f->code, "%s\n", tm); #endif Delete(tm); } else { Swig_warning(WARN_TYPEMAP_OUT_UNDEF, input_file, line_number, "Unable to use return type %s in function %s.\n", SwigType_str(d, 0), name); } emit_return_variable(n, d, f); /* Output argument output code */ Printv(f->code, outarg, NIL); /* Output cleanup code */ int need_cleanup = Len(cleanup) != 0; if (need_cleanup) { Printv(f->code, cleanup, NIL); } /* Look to see if there is any newfree cleanup code */ if (GetFlag(n, "feature:new")) { if ((tm = Swig_typemap_lookup("newfree", n, Swig_cresult_name(), 0))) { Replaceall(tm, "$source", Swig_cresult_name()); Printf(f->code, "%s\n", tm); Delete(tm); } } /* See if there is any return cleanup code */ if ((tm = Swig_typemap_lookup("ret", n, Swig_cresult_name(), 0))) { Replaceall(tm, "$source", Swig_cresult_name()); Printf(f->code, "%s\n", tm); Delete(tm); } if (director_method) { if ((tm = Swig_typemap_lookup("directorfree", n, Swig_cresult_name(), 0))) { Replaceall(tm, "$input", Swig_cresult_name()); Replaceall(tm, "$result", "resultobj"); Printf(f->code, "%s\n", tm); Delete(tm); } } if (builtin_ctor) Append(f->code, " return resultobj == Py_None ? -1 : 0;\n"); else Append(f->code, " return resultobj;\n"); /* Error handling code */ Append(f->code, "fail:\n"); if (need_cleanup) { Printv(f->code, cleanup, NIL); } if (builtin_ctor) { Printv(f->code, " return -1;\n", NIL); } else { if (GetFlag(n, "feature:python:maybecall")) { Append(f->code, " PyErr_Clear();\n"); Append(f->code, " Py_INCREF(Py_NotImplemented);\n"); Append(f->code, " return Py_NotImplemented;\n"); } else { Printv(f->code, " return NULL;\n", NIL); } } Append(f->code, "}\n"); /* Substitute the cleanup code */ Replaceall(f->code, "$cleanup", cleanup); /* Substitute the function name */ Replaceall(f->code, "$symname", iname); Replaceall(f->code, "$result", "resultobj"); if (builtin_self) { Replaceall(f->code, "$self", "self"); } else if (funpack) { Replaceall(f->code, "$self", "swig_obj[0]"); } else { Replaceall(f->code, "$self", "obj0"); } /* Dump the function out */ Wrapper_print(f, f_wrappers); /* If varargs. Need to emit a varargs stub */ if (varargs) { DelWrapper(f); f = NewWrapper(); if (funpack) { // Note: funpack is currently always false for varargs Printv(f->def, linkage, wrap_return, wname, "(PyObject *", self_param, ", Py_ssize_t nobjs, PyObject **swig_obj) {", NIL); } else { Printv(f->def, linkage, wrap_return, wname, "(PyObject *", self_param, ", PyObject *args", builtin_kwargs, ") {", NIL); } Wrapper_add_local(f, "resultobj", builtin_ctor ? "int resultobj" : "PyObject *resultobj"); Wrapper_add_local(f, "varargs", "PyObject *varargs"); Wrapper_add_local(f, "newargs", "PyObject *newargs"); if (funpack) { Wrapper_add_local(f, "i", "int i"); Printf(f->code, "newargs = PyTuple_New(%d);\n", num_fixed_arguments); Printf(f->code, "for (i = 0; i < %d; ++i) {\n", num_fixed_arguments); Printf(f->code, " PyTuple_SET_ITEM(newargs, i, swig_obj[i]);\n"); Printf(f->code, " Py_XINCREF(swig_obj[i]);\n"); Printf(f->code, "}\n"); Printf(f->code, "varargs = PyTuple_New(nobjs > %d ? nobjs - %d : 0);\n", num_fixed_arguments, num_fixed_arguments); Printf(f->code, "for (i = 0; i < nobjs - %d; ++i) {\n", num_fixed_arguments); Printf(f->code, " PyTuple_SET_ITEM(newargs, i, swig_obj[i + %d]);\n", num_fixed_arguments); Printf(f->code, " Py_XINCREF(swig_obj[i + %d]);\n", num_fixed_arguments); Printf(f->code, "}\n"); } else { Printf(f->code, "newargs = PyTuple_GetSlice(args,0,%d);\n", num_fixed_arguments); Printf(f->code, "varargs = PyTuple_GetSlice(args,%d,PyTuple_Size(args));\n", num_fixed_arguments); } Printf(f->code, "resultobj = %s__varargs__(%s,newargs,varargs);\n", wname, builtin ? "self" : "NULL"); Append(f->code, "Py_XDECREF(newargs);\n"); Append(f->code, "Py_XDECREF(varargs);\n"); Append(f->code, "return resultobj;\n"); Append(f->code, "}\n"); Wrapper_print(f, f_wrappers); } /* Now register the function with the interpreter. */ if (!Getattr(n, "sym:overloaded")) { if (!builtin_self) add_method(iname, wname, allow_kwargs, n, funpack, num_required, num_arguments); /* Create a shadow for this function (if enabled and not in a member function) */ if (!builtin && (shadow) && (!(shadow & PYSHADOW_MEMBER))) { emitFunctionShadowHelper(n, in_class ? f_shadow_stubs : f_shadow, iname, allow_kwargs); } } else { if (!Getattr(n, "sym:nextSibling")) { dispatchFunction(n, linkage, funpack, builtin_self, builtin_ctor, director_class); } } // Put this in tp_init of the PyTypeObject if (builtin_ctor) { if ((director_method || !is_private(n)) && !Getattr(class_members, iname)) { Setattr(class_members, iname, n); if (!builtin_tp_init) builtin_tp_init = Swig_name_wrapper(iname); } } /* If this is a builtin type, create a PyGetSetDef entry for this member variable. */ if (builtin) { const char *memname = "__dict__"; Hash *h = Getattr(builtin_getset, memname); if (!h) { h = NewHash(); Setattr(builtin_getset, memname, h); Delete(h); } Setattr(h, "getter", "SwigPyObject_get___dict__"); if (!Getattr(h, "doc")) { Setattr(n, "doc:high:name", Getattr(n, "name")); Setattr(h, "doc", cdocstring(n, AUTODOC_VAR)); } } if (builtin_getter) { String *memname = Getattr(n, "membervariableHandler:sym:name"); if (!memname) memname = iname; Hash *h = Getattr(builtin_getset, memname); if (!h) { h = NewHash(); Setattr(builtin_getset, memname, h); Delete(h); } Setattr(h, "getter", wrapper_name); Delattr(n, "memberget"); if (!Getattr(h, "doc")) { Setattr(n, "doc:high:name", Getattr(n, "name")); String *ds = cdocstring(n, AUTODOC_VAR); Setattr(h, "doc", ds); Delete(ds); } } if (builtin_setter) { String *memname = Getattr(n, "membervariableHandler:sym:name"); if (!memname) memname = iname; Hash *h = Getattr(builtin_getset, memname); if (!h) { h = NewHash(); Setattr(builtin_getset, memname, h); Delete(h); } Setattr(h, "setter", wrapper_name); Delattr(n, "memberset"); if (!Getattr(h, "doc")) { Setattr(n, "doc:high:name", Getattr(n, "name")); String *ds = cdocstring(n, AUTODOC_VAR); Setattr(h, "doc", ds); Delete(ds); } } if (in_class && builtin) { /* Handle operator overloads for builtin types */ String *slot = Getattr(n, "feature:python:slot"); if (slot) { String *func_type = Getattr(n, "feature:python:slot:functype"); String *closure_decl = getClosure(func_type, wrapper_name, overname ? 0 : funpack); String *feature_name = NewStringf("feature:python:%s", slot); String *closure_name = 0; if (closure_decl) { closure_name = NewStringf("%s_%s_closure", wrapper_name, func_type); if (!GetFlag(builtin_closures, closure_name)) Printf(builtin_closures_code, "%s /* defines %s */\n\n", closure_decl, closure_name); SetFlag(builtin_closures, closure_name); Delete(closure_decl); } else { closure_name = Copy(wrapper_name); } if (func_type) { String *s = NewStringf("%s", closure_name); Delete(closure_name); closure_name = s; } Setattr(parent, feature_name, closure_name); Delete(feature_name); Delete(closure_name); } /* Handle comparison operators for builtin types */ String *compare = Getattr(n, "feature:python:compare"); if (compare) { Hash *richcompare = Getattr(parent, "python:richcompare"); assert(richcompare); Setattr(richcompare, compare, wrapper_name); } } Delete(self_parse); Delete(parse_args); Delete(linkage); Delete(arglist); Delete(get_pointers); Delete(cleanup); Delete(outarg); Delete(kwargs); Delete(wname); DelWrapper(f); Delete(wrapper_name); return SWIG_OK; } /* ------------------------------------------------------------ * variableWrapper() * ------------------------------------------------------------ */ virtual int variableWrapper(Node *n) { String *name = Getattr(n, "name"); String *iname = Getattr(n, "sym:name"); SwigType *t = Getattr(n, "type"); static int have_globals = 0; String *tm; Wrapper *getf, *setf; if (!addSymbol(iname, n)) return SWIG_ERROR; getf = NewWrapper(); setf = NewWrapper(); /* If this is our first call, add the globals variable to the Python dictionary. */ if (!have_globals) { Printf(f_init, "\t globals = SWIG_globals();\n"); Printf(f_init, "\t if (!globals) {\n"); Printf(f_init, " PyErr_SetString(PyExc_TypeError, \"Failure to create SWIG globals.\");\n"); Printf(f_init, "#if PY_VERSION_HEX >= 0x03000000\n"); Printf(f_init, "\t return NULL;\n"); Printf(f_init, "#else\n"); Printf(f_init, "\t return;\n"); Printf(f_init, "#endif\n"); Printf(f_init, "\t }\n"); Printf(f_init, "\t PyDict_SetItemString(md, \"%s\", globals);\n", global_name); Printf(f_init, "\t Py_DECREF(globals);\n"); if (builtin) Printf(f_init, "\t SwigPyBuiltin_AddPublicSymbol(public_interface, \"%s\");\n", global_name); have_globals = 1; if (!builtin && (shadow) && (!(shadow & PYSHADOW_MEMBER))) { Printf(f_shadow_stubs, "%s = %s.%s\n", global_name, module, global_name); } } int assignable = is_assignable(n); if (!builtin && shadow && !assignable && !in_class) Printf(f_shadow_stubs, "%s = %s.%s\n", iname, global_name, iname); String *getname = Swig_name_get(NSPACE_TODO, iname); String *setname = Swig_name_set(NSPACE_TODO, iname); String *vargetname = NewStringf("Swig_var_%s", getname); String *varsetname = NewStringf("Swig_var_%s", setname); /* Create a function for setting the value of the variable */ if (assignable) { Setattr(n, "wrap:name", varsetname); if (builtin && in_class) { String *set_wrapper = Swig_name_wrapper(setname); Setattr(n, "pybuiltin:setter", set_wrapper); Delete(set_wrapper); } Printf(setf->def, "SWIGINTERN int %s(PyObject *_val) {", varsetname); if ((tm = Swig_typemap_lookup("varin", n, name, 0))) { Replaceall(tm, "$source", "_val"); Replaceall(tm, "$target", name); Replaceall(tm, "$input", "_val"); if (Getattr(n, "tmap:varin:implicitconv")) { Replaceall(tm, "$implicitconv", get_implicitconv_flag(n)); } emit_action_code(n, setf->code, tm); Delete(tm); } else { Swig_warning(WARN_TYPEMAP_VARIN_UNDEF, input_file, line_number, "Unable to set variable of type %s.\n", SwigType_str(t, 0)); } Printv(setf->code, " return 0;\n", NULL); Append(setf->code, "fail:\n"); Printv(setf->code, " return 1;\n", NULL); } else { /* Is a readonly variable. Issue an error */ if (CPlusPlus) { Printf(setf->def, "SWIGINTERN int %s(PyObject *) {", varsetname); } else { Printf(setf->def, "SWIGINTERN int %s(PyObject *_val SWIGUNUSED) {", varsetname); } Printv(setf->code, " SWIG_Error(SWIG_AttributeError,\"Variable ", iname, " is read-only.\");\n", " return 1;\n", NIL); } Append(setf->code, "}\n"); Wrapper_print(setf, f_wrappers); /* Create a function for getting the value of a variable */ Setattr(n, "wrap:name", vargetname); if (builtin && in_class) { String *get_wrapper = Swig_name_wrapper(getname); Setattr(n, "pybuiltin:getter", get_wrapper); Delete(get_wrapper); } int addfail = 0; Printf(getf->def, "SWIGINTERN PyObject *%s(void) {", vargetname); Wrapper_add_local(getf, "pyobj", "PyObject *pyobj = 0"); if (builtin) { Wrapper_add_local(getf, "self", "PyObject *self = 0"); Append(getf->code, " (void)self;\n"); } if ((tm = Swig_typemap_lookup("varout", n, name, 0))) { Replaceall(tm, "$source", name); Replaceall(tm, "$target", "pyobj"); Replaceall(tm, "$result", "pyobj"); addfail = emit_action_code(n, getf->code, tm); Delete(tm); } else { Swig_warning(WARN_TYPEMAP_VAROUT_UNDEF, input_file, line_number, "Unable to read variable of type %s\n", SwigType_str(t, 0)); } Append(getf->code, " return pyobj;\n"); if (addfail) { Append(getf->code, "fail:\n"); Append(getf->code, " return NULL;\n"); } Append(getf->code, "}\n"); Wrapper_print(getf, f_wrappers); /* Now add this to the variable linking mechanism */ Printf(f_init, "\t SWIG_addvarlink(globals, \"%s\", %s, %s);\n", iname, vargetname, varsetname); if (builtin && shadow && !assignable && !in_class) { Printf(f_init, "\t PyDict_SetItemString(md, \"%s\", PyObject_GetAttrString(globals, \"%s\"));\n", iname, iname); Printf(f_init, "\t SwigPyBuiltin_AddPublicSymbol(public_interface, \"%s\");\n", iname); } Delete(vargetname); Delete(varsetname); Delete(getname); Delete(setname); DelWrapper(setf); DelWrapper(getf); return SWIG_OK; } /* ------------------------------------------------------------ * constantWrapper() * ------------------------------------------------------------ */ /* Determine if the node requires the _swigconstant code to be generated */ bool needs_swigconstant(Node *n) { SwigType *type = Getattr(n, "type"); SwigType *qtype = SwigType_typedef_resolve_all(type); SwigType *uqtype = SwigType_strip_qualifiers(qtype); bool result = false; /* Note, that we need special handling for function pointers, as * SwigType_base(fptr) does not return the underlying pointer-to-function * type but the return-type of function. */ if (!SwigType_isfunction(uqtype) && !SwigType_isfunctionpointer(uqtype)) { SwigType *basetype = SwigType_base(uqtype); result = SwigType_isclass(basetype) != 0; Delete(basetype); } Delete(qtype); Delete(uqtype); return result; } virtual int constantWrapper(Node *n) { String *name = Getattr(n, "name"); String *iname = Getattr(n, "sym:name"); SwigType *type = Getattr(n, "type"); String *rawval = Getattr(n, "rawval"); String *value = rawval ? rawval : Getattr(n, "value"); String *tm; int have_tm = 0; int have_builtin_symname = 0; if (!addSymbol(iname, n)) return SWIG_ERROR; /* Special hook for member pointer */ if (SwigType_type(type) == T_MPOINTER) { String *wname = Swig_name_wrapper(iname); String *str = SwigType_str(type, wname); Printf(f_header, "static %s = %s;\n", str, value); Delete(str); value = wname; } if ((tm = Swig_typemap_lookup("consttab", n, name, 0))) { Replaceall(tm, "$source", value); Replaceall(tm, "$target", name); Replaceall(tm, "$value", value); Printf(const_code, "%s,\n", tm); Delete(tm); have_tm = 1; } if (builtin && in_class && Getattr(n, "pybuiltin:symname")) { have_builtin_symname = 1; Swig_require("builtin_constantWrapper", n, "*sym:name", "pybuiltin:symname", NIL); Setattr(n, "sym:name", Getattr(n, "pybuiltin:symname")); } if ((tm = Swig_typemap_lookup("constcode", n, name, 0))) { Replaceall(tm, "$source", value); Replaceall(tm, "$target", name); Replaceall(tm, "$value", value); if (needs_swigconstant(n) && !builtin && (shadow) && (!(shadow & PYSHADOW_MEMBER)) && (!in_class || !Getattr(n, "feature:python:callback"))) { // Generate `*_swigconstant()` method which registers the new constant. // // *_swigconstant methods are required for constants of class type. // Class types are registered in shadow file (see *_swigregister). The // instances of class must be created (registered) after the type is // registered, so we can't let SWIG_init() to register constants of // class type (the SWIG_init() is called before shadow classes are // defined and registered). Printf(f_wrappers, "SWIGINTERN PyObject *%s_swigconstant(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {\n", iname); Printf(f_wrappers, tab2 "PyObject *module;\n", tm); Printf(f_wrappers, tab2 "PyObject *d;\n"); Printf(f_wrappers, tab2 "if (!SWIG_Python_UnpackTuple(args, \"swigconstant\", 1, 1, &module)) return NULL;\n"); Printf(f_wrappers, tab2 "d = PyModule_GetDict(module);\n"); Printf(f_wrappers, tab2 "if (!d) return NULL;\n"); Printf(f_wrappers, tab2 "%s\n", tm); Printf(f_wrappers, tab2 "return SWIG_Py_Void();\n"); Printf(f_wrappers, "}\n\n\n"); // Register the method in SwigMethods array String *cname = NewStringf("%s_swigconstant", iname); add_method(cname, cname, 0, 0, 1, 1, 1); Delete(cname); } else { Printf(f_init, "%s\n", tm); } Delete(tm); have_tm = 1; } if (have_builtin_symname) Swig_restore(n); if (!have_tm) { Swig_warning(WARN_TYPEMAP_CONST_UNDEF, input_file, line_number, "Unsupported constant value.\n"); return SWIG_NOWRAP; } if (!builtin && (shadow) && (!(shadow & PYSHADOW_MEMBER))) { String *f_s; if (!in_class) { f_s = f_shadow; } else { f_s = Getattr(n, "feature:python:callback") ? NIL : f_shadow_stubs; } if (f_s) { if (needs_swigconstant(n)) { Printv(f_s, "\n",NIL); Printv(f_s, module, ".", iname, "_swigconstant(",module,")\n", NIL); } Printv(f_s, iname, " = ", module, ".", iname, "\n", NIL); if (have_docstring(n)) Printv(f_s, docstring(n, AUTODOC_CONST, tab4), "\n", NIL); } } return SWIG_OK; } /* ------------------------------------------------------------ * nativeWrapper() * ------------------------------------------------------------ */ virtual int nativeWrapper(Node *n) { String *name = Getattr(n, "sym:name"); String *wrapname = Getattr(n, "wrap:name"); if (!addSymbol(wrapname, n)) return SWIG_ERROR; add_method(name, wrapname, 0); if (!builtin && shadow) { Printv(f_shadow_stubs, name, " = ", module, ".", name, "\n", NIL); } return SWIG_OK; } /* ---------------------------------------------------------------------------- * BEGIN C++ Director Class modifications * ------------------------------------------------------------------------- */ /* C++/Python polymorphism demo code * * TODO * * Move some boilerplate code generation to Swig_...() functions. * */ /* --------------------------------------------------------------- * classDirectorMethod() * * Emit a virtual director method to pass a method call on to the * underlying Python object. * ** Moved down due to gcc-2.96 internal error ** * --------------------------------------------------------------- */ int classDirectorMethods(Node *n); int classDirectorMethod(Node *n, Node *parent, String *super); /* ------------------------------------------------------------ * classDirectorConstructor() * ------------------------------------------------------------ */ int classDirectorConstructor(Node *n) { Node *parent = Getattr(n, "parentNode"); String *sub = NewString(""); String *decl = Getattr(n, "decl"); String *supername = Swig_class_name(parent); String *classname = NewString(""); Printf(classname, "SwigDirector_%s", supername); /* insert self parameter */ Parm *p; ParmList *superparms = Getattr(n, "parms"); ParmList *parms = CopyParmList(superparms); String *type = NewString("PyObject"); SwigType_add_pointer(type); p = NewParm(type, NewString("self"), n); set_nextSibling(p, parms); parms = p; if (!Getattr(n, "defaultargs")) { /* constructor */ { Wrapper *w = NewWrapper(); String *call; String *basetype = Getattr(parent, "classtype"); String *target = Swig_method_decl(0, decl, classname, parms, 0); call = Swig_csuperclass_call(0, basetype, superparms); Printf(w->def, "%s::%s: %s, Swig::Director(self) { \n", classname, target, call); Printf(w->def, " SWIG_DIRECTOR_RGTR((%s *)this, this); \n", basetype); Append(w->def, "}\n"); Delete(target); Wrapper_print(w, f_directors); Delete(call); DelWrapper(w); } /* constructor header */ { String *target = Swig_method_decl(0, decl, classname, parms, 1); Printf(f_directors_h, " %s;\n", target); Delete(target); } } Delete(sub); Delete(classname); Delete(supername); Delete(parms); return Language::classDirectorConstructor(n); } /* ------------------------------------------------------------ * classDirectorDefaultConstructor() * ------------------------------------------------------------ */ int classDirectorDefaultConstructor(Node *n) { String *classname = Swig_class_name(n); { Node *parent = Swig_methodclass(n); String *basetype = Getattr(parent, "classtype"); Wrapper *w = NewWrapper(); Printf(w->def, "SwigDirector_%s::SwigDirector_%s(PyObject *self) : Swig::Director(self) { \n", classname, classname); Printf(w->def, " SWIG_DIRECTOR_RGTR((%s *)this, this); \n", basetype); Append(w->def, "}\n"); Wrapper_print(w, f_directors); DelWrapper(w); } Printf(f_directors_h, " SwigDirector_%s(PyObject *self);\n", classname); Delete(classname); return Language::classDirectorDefaultConstructor(n); } /* ------------------------------------------------------------ * classDirectorInit() * ------------------------------------------------------------ */ int classDirectorInit(Node *n) { String *declaration = Swig_director_declaration(n); Printf(f_directors_h, "\n"); Printf(f_directors_h, "%s\n", declaration); Printf(f_directors_h, "public:\n"); Delete(declaration); return Language::classDirectorInit(n); } /* ------------------------------------------------------------ * classDirectorEnd() * ------------------------------------------------------------ */ int classDirectorEnd(Node *n) { String *classname = Swig_class_name(n); if (dirprot_mode()) { /* This implementation uses a std::map. It should be possible to rewrite it using a more elegant way, like copying the Java approach for the 'override' array. But for now, this seems to be the least intrusive way. */ Printf(f_directors_h, "\n"); Printf(f_directors_h, "/* Internal director utilities */\n"); Printf(f_directors_h, "public:\n"); Printf(f_directors_h, " bool swig_get_inner(const char *swig_protected_method_name) const {\n"); Printf(f_directors_h, " std::map::const_iterator iv = swig_inner.find(swig_protected_method_name);\n"); Printf(f_directors_h, " return (iv != swig_inner.end() ? iv->second : false);\n"); Printf(f_directors_h, " }\n"); Printf(f_directors_h, " void swig_set_inner(const char *swig_protected_method_name, bool swig_val) const {\n"); Printf(f_directors_h, " swig_inner[swig_protected_method_name] = swig_val;\n"); Printf(f_directors_h, " }\n"); Printf(f_directors_h, "private:\n"); Printf(f_directors_h, " mutable std::map swig_inner;\n"); } if (director_method_index) { Printf(f_directors_h, "\n"); Printf(f_directors_h, "#if defined(SWIG_PYTHON_DIRECTOR_VTABLE)\n"); Printf(f_directors_h, "/* VTable implementation */\n"); Printf(f_directors_h, " PyObject *swig_get_method(size_t method_index, const char *method_name) const {\n"); Printf(f_directors_h, " PyObject *method = vtable[method_index];\n"); Printf(f_directors_h, " if (!method) {\n"); Printf(f_directors_h, " swig::SwigVar_PyObject name = SWIG_Python_str_FromChar(method_name);\n"); Printf(f_directors_h, " method = PyObject_GetAttr(swig_get_self(), name);\n"); Printf(f_directors_h, " if (!method) {\n"); Printf(f_directors_h, " std::string msg = \"Method in class %s doesn't exist, undefined \";\n", classname); Printf(f_directors_h, " msg += method_name;\n"); Printf(f_directors_h, " Swig::DirectorMethodException::raise(msg.c_str());\n"); Printf(f_directors_h, " }\n"); Printf(f_directors_h, " vtable[method_index] = method;\n"); Printf(f_directors_h, " }\n"); Printf(f_directors_h, " return method;\n"); Printf(f_directors_h, " }\n"); Printf(f_directors_h, "private:\n"); Printf(f_directors_h, " mutable swig::SwigVar_PyObject vtable[%d];\n", director_method_index); Printf(f_directors_h, "#endif\n\n"); } Printf(f_directors_h, "};\n\n"); return Language::classDirectorEnd(n); } /* ------------------------------------------------------------ * classDirectorDisown() * ------------------------------------------------------------ */ int classDirectorDisown(Node *n) { int result; int oldshadow = shadow; /* disable shadowing */ if (shadow) shadow = shadow | PYSHADOW_MEMBER; result = Language::classDirectorDisown(n); shadow = oldshadow; if (shadow) { if (builtin) { String *rname = SwigType_namestr(real_classname); Printf(builtin_methods, " { \"__disown__\", Swig::Director::swig_pyobj_disown< %s >, METH_NOARGS, \"\" },\n", rname); Delete(rname); } else { String *symname = Getattr(n, "sym:name"); String *mrename = Swig_name_disown(NSPACE_TODO, symname); //Getattr(n, "name")); Printv(f_shadow, tab4, "def __disown__(self):\n", NIL); #ifdef USE_THISOWN Printv(f_shadow, tab8, "self.thisown = 0\n", NIL); #else Printv(f_shadow, tab8, "self.this.disown()\n", NIL); #endif Printv(f_shadow, tab8, module, ".", mrename, "(self)\n", NIL); Printv(f_shadow, tab8, "return weakref.proxy(self)\n", NIL); Delete(mrename); } } return result; } /* ---------------------------------------------------------------------------- * END of C++ Director Class modifications * ------------------------------------------------------------------------- */ /* ------------------------------------------------------------ * classDeclaration() * ------------------------------------------------------------ */ virtual int classDeclaration(Node *n) { if (shadow && !Getattr(n, "feature:onlychildren")) { Node *mod = Getattr(n, "module"); if (mod) { String *modname = Getattr(mod, "name"); Node *options = Getattr(mod, "options"); String *pkg = options ? Getattr(options, "package") : 0; String *sym = Getattr(n, "sym:name"); String *importname = import_name_string(package, mainmodule, pkg, modname, sym); Setattr(n, "python:proxy", importname); Delete(importname); } } int result = Language::classDeclaration(n); return result; } /* ------------------------------------------------------------ * classHandler() * ------------------------------------------------------------ */ String *add_explicit_scope(String *s) { if (!Strstr(s, "::")) { String *ss = NewStringf("::%s", s); Delete(s); s = ss; } return s; } void builtin_pre_decl(Node *n) { String *name = Getattr(n, "name"); String *rname = add_explicit_scope(SwigType_namestr(name)); String *mname = SwigType_manglestr(rname); Printf(f_init, "\n/* type '%s' */\n", rname); Printf(f_init, " builtin_pytype = (PyTypeObject *)&SwigPyBuiltin_%s_type;\n", mname); Printf(f_init, " builtin_pytype->tp_dict = d = PyDict_New();\n"); Delete(rname); Delete(mname); } void builtin_post_decl(File *f, Node *n) { String *name = Getattr(n, "name"); String *pname = Copy(name); SwigType_add_pointer(pname); String *symname = Getattr(n, "sym:name"); String *rname = add_explicit_scope(SwigType_namestr(name)); String *mname = SwigType_manglestr(rname); String *pmname = SwigType_manglestr(pname); String *templ = NewStringf("SwigPyBuiltin_%s", mname); int funpack = fastunpack; static String *tp_new = NewString("PyType_GenericNew"); Printv(f_init, " SwigPyBuiltin_SetMetaType(builtin_pytype, metatype);\n", NIL); // We can’t statically initialize a structure member with a function defined in another C module // So this is done in the initialization function instead, see https://docs.python.org/2/extending/newtypes.html Printf(f_init, " builtin_pytype->tp_new = %s;\n", getSlot(n, "feature:python:tp_new", tp_new)); Printv(f_init, " builtin_base_count = 0;\n", NIL); List *baselist = Getattr(n, "bases"); if (baselist) { int base_count = 0; for (Iterator b = First(baselist); b.item; b = Next(b)) { String *bname = Getattr(b.item, "name"); if (!bname || GetFlag(b.item, "feature:ignore")) continue; base_count++; String *base_name = Copy(bname); SwigType_add_pointer(base_name); String *base_mname = SwigType_manglestr(base_name); Printf(f_init, " builtin_basetype = SWIG_MangledTypeQuery(\"%s\");\n", base_mname); Printv(f_init, " if (builtin_basetype && builtin_basetype->clientdata && ((SwigPyClientData *) builtin_basetype->clientdata)->pytype) {\n", NIL); Printv(f_init, " builtin_bases[builtin_base_count++] = ((SwigPyClientData *) builtin_basetype->clientdata)->pytype;\n", NIL); Printv(f_init, " } else {\n", NIL); Printf(f_init, " PyErr_SetString(PyExc_TypeError, \"Could not create type '%s' as base '%s' has not been initialized.\\n\");\n", symname, bname); Printv(f_init, "#if PY_VERSION_HEX >= 0x03000000\n", NIL); Printv(f_init, " return NULL;\n", NIL); Printv(f_init, "#else\n", NIL); Printv(f_init, " return;\n", NIL); Printv(f_init, "#endif\n", NIL); Printv(f_init, " }\n", NIL); Delete(base_name); Delete(base_mname); } if (base_count > max_bases) max_bases = base_count; } Printv(f_init, " builtin_bases[builtin_base_count] = NULL;\n", NIL); Printv(f_init, " SwigPyBuiltin_InitBases(builtin_pytype, builtin_bases);\n", NIL); builtin_bases_needed = 1; // Check for non-public destructor, in which case tp_dealloc will issue // a warning and allow the memory to leak. Any class that doesn't explicitly // have a private/protected destructor has an implicit public destructor. static String *tp_dealloc_bad = NewString("SwigPyBuiltin_BadDealloc"); String *getset_name = NewStringf("%s_getset", templ); String *methods_name = NewStringf("%s_methods", templ); String *getset_def = NewString(""); Printf(getset_def, "SWIGINTERN PyGetSetDef %s[] = {\n", getset_name); // All objects have 'this' and 'thisown' attributes Printv(f_init, "PyDict_SetItemString(d, \"this\", this_descr);\n", NIL); Printv(f_init, "PyDict_SetItemString(d, \"thisown\", thisown_descr);\n", NIL); // Now, the rest of the attributes for (Iterator member_iter = First(builtin_getset); member_iter.item; member_iter = Next(member_iter)) { String *memname = member_iter.key; Hash *mgetset = member_iter.item; String *getter = Getattr(mgetset, "getter"); String *setter = Getattr(mgetset, "setter"); const char *getter_closure = getter ? funpack ? "SwigPyBuiltin_FunpackGetterClosure" : "SwigPyBuiltin_GetterClosure" : "0"; const char *setter_closure = setter ? funpack ? "SwigPyBuiltin_FunpackSetterClosure" : "SwigPyBuiltin_SetterClosure" : "0"; String *gspair = NewStringf("%s_%s_getset", symname, memname); Printf(f, "static SwigPyGetSet %s = { %s, %s };\n", gspair, getter ? getter : "0", setter ? setter : "0"); String *doc = Getattr(mgetset, "doc"); if (!doc) doc = NewStringf("%s.%s", name, memname); String *entry = NewStringf("{ (char *)\"%s\", %s, %s, (char *)\"%s\", &%s }", memname, getter_closure, setter_closure, doc, gspair); if (GetFlag(mgetset, "static")) { Printf(f, "static PyGetSetDef %s_def = %s;\n", gspair, entry); Printf(f_init, "static_getset = SwigPyStaticVar_new_getset(metatype, &%s_def);\n", gspair); Printf(f_init, "PyDict_SetItemString(d, static_getset->d_getset->name, (PyObject *) static_getset);\n", memname); Printf(f_init, "Py_DECREF(static_getset);\n"); } else { Printf(getset_def, " %s,\n", entry); } Delete(gspair); Delete(entry); } Printv(f, getset_def, " { NULL, NULL, NULL, NULL, NULL } /* Sentinel */\n", "};\n\n", NIL); // Rich compare function Hash *richcompare = Getattr(n, "python:richcompare"); String *richcompare_func = NewStringf("%s_richcompare", templ); assert(richcompare); Printf(f, "SWIGINTERN PyObject *\n"); Printf(f, "%s(PyObject *self, PyObject *other, int op) {\n", richcompare_func); Printf(f, " PyObject *result = NULL;\n"); if (!funpack) { Printf(f, " PyObject *tuple = PyTuple_New(1);\n"); Printf(f, " assert(tuple);\n"); Printf(f, " PyTuple_SET_ITEM(tuple, 0, other);\n"); Printf(f, " Py_XINCREF(other);\n"); } Iterator rich_iter = First(richcompare); if (rich_iter.item) { Printf(f, " switch (op) {\n"); for (; rich_iter.item; rich_iter = Next(rich_iter)) Printf(f, " case %s : result = %s(self, %s); break;\n", rich_iter.key, rich_iter.item, funpack ? "other" : "tuple"); Printv(f, " default : break;\n", NIL); Printf(f, " }\n"); } Printv(f, " if (!result) {\n", NIL); Printv(f, " if (SwigPyObject_Check(self) && SwigPyObject_Check(other)) {\n", NIL); Printv(f, " result = SwigPyObject_richcompare((SwigPyObject *)self, (SwigPyObject *)other, op);\n", NIL); Printv(f, " } else {\n", NIL); Printv(f, " result = Py_NotImplemented;\n", NIL); Printv(f, " Py_INCREF(result);\n", NIL); Printv(f, " }\n", NIL); Printv(f, " }\n", NIL); if (!funpack) Printf(f, " Py_DECREF(tuple);\n"); Printf(f, " return result;\n"); Printf(f, "}\n\n"); // Methods Printf(f, "SWIGINTERN PyMethodDef %s_methods[] = {\n", templ); Dump(builtin_methods, f); Printf(f, " { NULL, NULL, 0, NULL } /* Sentinel */\n};\n\n"); // No instance dict for nondynamic objects if (GetFlag(n, "feature:python:nondynamic")) Setattr(n, "feature:python:tp_setattro", "SWIG_Python_NonDynamicSetAttr"); Node *mod = Getattr(n, "module"); String *modname = mod ? Getattr(mod, "name") : 0; String *quoted_symname; if (package) { if (modname) quoted_symname = NewStringf("\"%s.%s.%s\"", package, modname, symname); else quoted_symname = NewStringf("\"%s.%s\"", package, symname); } else { if (modname) quoted_symname = NewStringf("\"%s.%s\"", modname, symname); else quoted_symname = NewStringf("\"%s\"", symname); } String *quoted_tp_doc_str = NewStringf("\"%s\"", getSlot(n, "feature:python:tp_doc")); String *tp_init = NewString(builtin_tp_init ? Char(builtin_tp_init) : Swig_directorclass(n) ? "0" : "SwigPyBuiltin_BadInit"); String *tp_flags = NewString("Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_CHECKTYPES"); String *tp_flags_py3 = NewString("Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE"); static String *tp_basicsize = NewStringf("sizeof(SwigPyObject)"); static String *tp_dictoffset_default = NewString("offsetof(SwigPyObject, dict)"); static String *tp_hash = NewString("SwigPyObject_hash"); String *tp_as_number = NewStringf("&%s_type.as_number", templ); String *tp_as_sequence = NewStringf("&%s_type.as_sequence", templ); String *tp_as_mapping = NewStringf("&%s_type.as_mapping", templ); String *tp_as_buffer = NewStringf("&%s_type.as_buffer", templ); Printf(f, "static PyHeapTypeObject %s_type = {\n", templ); // PyTypeObject ht_type Printf(f, " {\n"); Printv(f, "#if PY_VERSION_HEX >= 0x03000000\n", NIL); Printv(f, " PyVarObject_HEAD_INIT(NULL, 0)\n", NIL); Printv(f, "#else\n", NIL); Printf(f, " PyObject_HEAD_INIT(NULL)\n"); printSlot(f, getSlot(), "ob_size"); Printv(f, "#endif\n", NIL); printSlot(f, quoted_symname, "tp_name"); printSlot(f, getSlot(n, "feature:python:tp_basicsize", tp_basicsize), "tp_basicsize"); printSlot(f, getSlot(n, "feature:python:tp_itemsize"), "tp_itemsize"); printSlot(f, getSlot(n, "feature:python:tp_dealloc", tp_dealloc_bad), "tp_dealloc", "destructor"); printSlot(f, getSlot(n, "feature:python:tp_print"), "tp_print", "printfunc"); printSlot(f, getSlot(n, "feature:python:tp_getattr"), "tp_getattr", "getattrfunc"); printSlot(f, getSlot(n, "feature:python:tp_setattr"), "tp_setattr", "setattrfunc"); Printv(f, "#if PY_VERSION_HEX >= 0x03000000\n", NIL); printSlot(f, getSlot(n, "feature:python:tp_compare"), "tp_compare"); Printv(f, "#else\n", NIL); printSlot(f, getSlot(n, "feature:python:tp_compare"), "tp_compare", "cmpfunc"); Printv(f, "#endif\n", NIL); printSlot(f, getSlot(n, "feature:python:tp_repr"), "tp_repr", "reprfunc"); printSlot(f, getSlot(n, "feature:python:tp_as_number", tp_as_number), "tp_as_number"); printSlot(f, getSlot(n, "feature:python:tp_as_sequence", tp_as_sequence), "tp_as_sequence"); printSlot(f, getSlot(n, "feature:python:tp_as_mapping", tp_as_mapping), "tp_as_mapping"); printSlot(f, getSlot(n, "feature:python:tp_hash", tp_hash), "tp_hash", "hashfunc"); printSlot(f, getSlot(n, "feature:python:tp_call"), "tp_call", "ternaryfunc"); printSlot(f, getSlot(n, "feature:python:tp_str"), "tp_str", "reprfunc"); printSlot(f, getSlot(n, "feature:python:tp_getattro"), "tp_getattro", "getattrofunc"); printSlot(f, getSlot(n, "feature:python:tp_setattro"), "tp_setattro", "setattrofunc"); printSlot(f, getSlot(n, "feature:python:tp_as_buffer", tp_as_buffer), "tp_as_buffer"); Printv(f, "#if PY_VERSION_HEX >= 0x03000000\n", NIL); printSlot(f, getSlot(n, "feature:python:tp_flags", tp_flags_py3), "tp_flags"); Printv(f, "#else\n", NIL); printSlot(f, getSlot(n, "feature:python:tp_flags", tp_flags), "tp_flags"); Printv(f, "#endif\n", NIL); if (have_docstring(n)) { String *ds = cdocstring(n, AUTODOC_CLASS); String *tp_doc = NewString(""); Printf(tp_doc, "\"%s\"", ds); Delete(ds); printSlot(f, tp_doc, "tp_doc"); Delete(tp_doc); } else { printSlot(f, quoted_tp_doc_str, "tp_doc"); } printSlot(f, getSlot(n, "feature:python:tp_traverse"), "tp_traverse", "traverseproc"); printSlot(f, getSlot(n, "feature:python:tp_clear"), "tp_clear", "inquiry"); printSlot(f, getSlot(n, "feature:python:tp_richcompare", richcompare_func), "tp_richcompare", "richcmpfunc"); printSlot(f, getSlot(n, "feature:python:tp_weaklistoffset"), "tp_weaklistoffset"); printSlot(f, getSlot(n, "feature:python:tp_iter"), "tp_iter", "getiterfunc"); printSlot(f, getSlot(n, "feature:python:tp_iternext"), "tp_iternext", "iternextfunc"); printSlot(f, getSlot(n, "feature:python:tp_methods", methods_name), "tp_methods"); printSlot(f, getSlot(n, "feature:python:tp_members"), "tp_members"); printSlot(f, getSlot(n, "feature:python:tp_getset", getset_name), "tp_getset"); printSlot(f, getSlot(n, "feature:python:tp_base"), "tp_base"); printSlot(f, getSlot(n, "feature:python:tp_dict"), "tp_dict"); printSlot(f, getSlot(n, "feature:python:tp_descr_get"), "tp_descr_get", "descrgetfunc"); printSlot(f, getSlot(n, "feature:python:tp_descr_set"), "tp_descr_set", "descrsetfunc"); printSlot(f, getSlot(n, "feature:python:tp_dictoffset", tp_dictoffset_default), "tp_dictoffset", "Py_ssize_t"); printSlot(f, getSlot(n, "feature:python:tp_init", tp_init), "tp_init", "initproc"); printSlot(f, getSlot(n, "feature:python:tp_alloc"), "tp_alloc", "allocfunc"); printSlot(f, getSlot(), "tp_new", "newfunc"); printSlot(f, getSlot(n, "feature:python:tp_free"), "tp_free", "freefunc"); printSlot(f, getSlot(n, "feature:python:tp_is_gc"), "tp_is_gc", "inquiry"); printSlot(f, getSlot(n, "feature:python:tp_bases"), "tp_bases", "PyObject *"); printSlot(f, getSlot(n, "feature:python:tp_mro"), "tp_mro", "PyObject *"); printSlot(f, getSlot(n, "feature:python:tp_cache"), "tp_cache", "PyObject *"); printSlot(f, getSlot(n, "feature:python:tp_subclasses"), "tp_subclasses", "PyObject *"); printSlot(f, getSlot(n, "feature:python:tp_weaklist"), "tp_weaklist", "PyObject *"); printSlot(f, getSlot(n, "feature:python:tp_del"), "tp_del", "destructor"); printSlot(f, getSlot(n, "feature:python:tp_version_tag"), "tp_version_tag", "int"); Printv(f, "#if PY_VERSION_HEX >= 0x03040000\n", NIL); printSlot(f, getSlot(n, "feature:python:tp_finalize"), "tp_finalize", "destructor"); Printv(f, "#endif\n", NIL); Printv(f, "#ifdef COUNT_ALLOCS\n", NIL); printSlot(f, getSlot(n, "feature:python:tp_allocs"), "tp_allocs", "Py_ssize_t"); printSlot(f, getSlot(n, "feature:python:tp_frees"), "tp_frees", "Py_ssize_t"); printSlot(f, getSlot(n, "feature:python:tp_maxalloc"), "tp_maxalloc", "Py_ssize_t"); printSlot(f, getSlot(n, "feature:python:tp_prev"), "tp_prev"); printSlot(f, getSlot(n, "feature:python:tp_next"), "tp_next"); Printv(f, "#endif\n", NIL); Printf(f, " },\n"); // PyAsyncMethods as_async Printv(f, "#if PY_VERSION_HEX >= 0x03050000\n", NIL); Printf(f, " {\n"); printSlot(f, getSlot(n, "feature:python:am_await"), "am_await", "unaryfunc"); printSlot(f, getSlot(n, "feature:python:am_aiter"), "am_aiter", "unaryfunc"); printSlot(f, getSlot(n, "feature:python:am_anext"), "am_anext", "unaryfunc"); Printf(f, " },\n"); Printv(f, "#endif\n", NIL); // PyNumberMethods as_number Printf(f, " {\n"); printSlot(f, getSlot(n, "feature:python:nb_add"), "nb_add", "binaryfunc"); printSlot(f, getSlot(n, "feature:python:nb_subtract"), "nb_subtract", "binaryfunc"); printSlot(f, getSlot(n, "feature:python:nb_multiply"), "nb_multiply", "binaryfunc"); Printv(f, "#if PY_VERSION_HEX < 0x03000000\n", NIL); printSlot(f, getSlot(n, "feature:python:nb_divide"), "nb_divide", "binaryfunc"); Printv(f, "#endif\n", NIL); printSlot(f, getSlot(n, "feature:python:nb_remainder"), "nb_remainder", "binaryfunc"); printSlot(f, getSlot(n, "feature:python:nb_divmod"), "nb_divmod", "binaryfunc"); printSlot(f, getSlot(n, "feature:python:nb_power"), "nb_power", "ternaryfunc"); printSlot(f, getSlot(n, "feature:python:nb_negative"), "nb_negative", "unaryfunc"); printSlot(f, getSlot(n, "feature:python:nb_positive"), "nb_positive", "unaryfunc"); printSlot(f, getSlot(n, "feature:python:nb_absolute"), "nb_absolute", "unaryfunc"); printSlot(f, getSlot(n, "feature:python:nb_nonzero"), "nb_nonzero", "inquiry"); printSlot(f, getSlot(n, "feature:python:nb_invert"), "nb_invert", "unaryfunc"); printSlot(f, getSlot(n, "feature:python:nb_lshift"), "nb_lshift", "binaryfunc"); printSlot(f, getSlot(n, "feature:python:nb_rshift"), "nb_rshift", "binaryfunc"); printSlot(f, getSlot(n, "feature:python:nb_and"), "nb_and", "binaryfunc"); printSlot(f, getSlot(n, "feature:python:nb_xor"), "nb_xor", "binaryfunc"); printSlot(f, getSlot(n, "feature:python:nb_or"), "nb_or", "binaryfunc"); Printv(f, "#if PY_VERSION_HEX < 0x03000000\n", NIL); printSlot(f, getSlot(n, "feature:python:nb_coerce"), "nb_coerce", "coercion"); Printv(f, "#endif\n", NIL); printSlot(f, getSlot(n, "feature:python:nb_int"), "nb_int", "unaryfunc"); Printv(f, "#if PY_VERSION_HEX >= 0x03000000\n", NIL); printSlot(f, getSlot(n, "feature:python:nb_reserved"), "nb_reserved", "void *"); Printv(f, "#else\n", NIL); printSlot(f, getSlot(n, "feature:python:nb_long"), "nb_long", "unaryfunc"); Printv(f, "#endif\n", NIL); printSlot(f, getSlot(n, "feature:python:nb_float"), "nb_float", "unaryfunc"); Printv(f, "#if PY_VERSION_HEX < 0x03000000\n", NIL); printSlot(f, getSlot(n, "feature:python:nb_oct"), "nb_oct", "unaryfunc"); printSlot(f, getSlot(n, "feature:python:nb_hex"), "nb_hex", "unaryfunc"); Printv(f, "#endif\n", NIL); printSlot(f, getSlot(n, "feature:python:nb_inplace_add"), "nb_inplace_add", "binaryfunc"); printSlot(f, getSlot(n, "feature:python:nb_inplace_subtract"), "nb_inplace_subtract", "binaryfunc"); printSlot(f, getSlot(n, "feature:python:nb_inplace_multiply"), "nb_inplace_multiply", "binaryfunc"); Printv(f, "#if PY_VERSION_HEX < 0x03000000\n", NIL); printSlot(f, getSlot(n, "feature:python:nb_inplace_divide"), "nb_inplace_divide", "binaryfunc"); Printv(f, "#endif\n", NIL); printSlot(f, getSlot(n, "feature:python:nb_inplace_remainder"), "nb_inplace_remainder", "binaryfunc"); printSlot(f, getSlot(n, "feature:python:nb_inplace_power"), "nb_inplace_power", "ternaryfunc"); printSlot(f, getSlot(n, "feature:python:nb_inplace_lshift"), "nb_inplace_lshift", "binaryfunc"); printSlot(f, getSlot(n, "feature:python:nb_inplace_rshift"), "nb_inplace_rshift", "binaryfunc"); printSlot(f, getSlot(n, "feature:python:nb_inplace_and"), "nb_inplace_and", "binaryfunc"); printSlot(f, getSlot(n, "feature:python:nb_inplace_xor"), "nb_inplace_xor", "binaryfunc"); printSlot(f, getSlot(n, "feature:python:nb_inplace_or"), "nb_inplace_or", "binaryfunc"); printSlot(f, getSlot(n, "feature:python:nb_floor_divide"), "nb_floor_divide", "binaryfunc"); printSlot(f, getSlot(n, "feature:python:nb_divide"), "nb_true_divide", "binaryfunc"); printSlot(f, getSlot(n, "feature:python:nb_inplace_floor_divide"), "nb_inplace_floor_divide", "binaryfunc"); printSlot(f, getSlot(n, "feature:python:nb_inplace_divide"), "nb_inplace_true_divide", "binaryfunc"); printSlot(f, getSlot(n, "feature:python:nb_index"), "nb_index", "unaryfunc"); Printv(f, "#if PY_VERSION_HEX >= 0x03050000\n", NIL); printSlot(f, getSlot(n, "feature:python:nb_matrix_multiply"), "nb_matrix_multiply", "binaryfunc"); printSlot(f, getSlot(n, "feature:python:nb_inplace_matrix_multiply"), "nb_inplace_matrix_multiply", "binaryfunc"); Printv(f, "#endif\n", NIL); Printf(f, " },\n"); // PyMappingMethods as_mapping; Printf(f, " {\n"); printSlot(f, getSlot(n, "feature:python:mp_length"), "mp_length", "lenfunc"); printSlot(f, getSlot(n, "feature:python:mp_subscript"), "mp_subscript", "binaryfunc"); printSlot(f, getSlot(n, "feature:python:mp_ass_subscript"), "mp_ass_subscript", "objobjargproc"); Printf(f, " },\n"); // PySequenceMethods as_sequence; Printf(f, " {\n"); printSlot(f, getSlot(n, "feature:python:sq_length"), "sq_length", "lenfunc"); printSlot(f, getSlot(n, "feature:python:sq_concat"), "sq_concat", "binaryfunc"); printSlot(f, getSlot(n, "feature:python:sq_repeat"), "sq_repeat", "ssizeargfunc"); printSlot(f, getSlot(n, "feature:python:sq_item"), "sq_item", "ssizeargfunc"); Printv(f, "#if PY_VERSION_HEX >= 0x03000000\n", NIL); printSlot(f, getSlot(n, "feature:python:was_sq_slice"), "was_sq_slice", "void *"); Printv(f, "#else\n", NIL); printSlot(f, getSlot(n, "feature:python:sq_slice"), "sq_slice", "ssizessizeargfunc"); Printv(f, "#endif\n", NIL); printSlot(f, getSlot(n, "feature:python:sq_ass_item"), "sq_ass_item", "ssizeobjargproc"); Printv(f, "#if PY_VERSION_HEX >= 0x03000000\n", NIL); printSlot(f, getSlot(n, "feature:python:was_sq_ass_slice"), "was_sq_ass_slice", "void *"); Printv(f, "#else\n", NIL); printSlot(f, getSlot(n, "feature:python:sq_ass_slice"), "sq_ass_slice", "ssizessizeobjargproc"); Printv(f, "#endif\n", NIL); printSlot(f, getSlot(n, "feature:python:sq_contains"), "sq_contains", "objobjproc"); printSlot(f, getSlot(n, "feature:python:sq_inplace_concat"), "sq_inplace_concat", "binaryfunc"); printSlot(f, getSlot(n, "feature:python:sq_inplace_repeat"), "sq_inplace_repeat", "ssizeargfunc"); Printf(f, " },\n"); // PyBufferProcs as_buffer; Printf(f, " {\n"); Printv(f, "#if PY_VERSION_HEX < 0x03000000\n", NIL); printSlot(f, getSlot(n, "feature:python:bf_getreadbuffer"), "bf_getreadbuffer", "readbufferproc"); printSlot(f, getSlot(n, "feature:python:bf_getwritebuffer"), "bf_getwritebuffer", "writebufferproc"); printSlot(f, getSlot(n, "feature:python:bf_getsegcount"), "bf_getsegcount", "segcountproc"); printSlot(f, getSlot(n, "feature:python:bf_getcharbuffer"), "bf_getcharbuffer", "charbufferproc"); Printv(f, "#endif\n", NIL); printSlot(f, getSlot(n, "feature:python:bf_getbuffer"), "bf_getbuffer", "getbufferproc"); printSlot(f, getSlot(n, "feature:python:bf_releasebuffer"), "bf_releasebuffer", "releasebufferproc"); Printf(f, " },\n"); // PyObject *ht_name, *ht_slots, *ht_qualname; printSlot(f, getSlot(n, "feature:python:ht_name"), "ht_name", "PyObject *"); printSlot(f, getSlot(n, "feature:python:ht_slots"), "ht_slots", "PyObject *"); Printv(f, "#if PY_VERSION_HEX >= 0x03030000\n", NIL); printSlot(f, getSlot(n, "feature:python:ht_qualname"), "ht_qualname", "PyObject *"); // struct _dictkeysobject *ht_cached_keys; printSlot(f, getSlot(n, "feature:python:ht_cached_keys"), "ht_cached_keys"); Printv(f, "#endif\n", NIL); Printf(f, "};\n\n"); String *clientdata = NewString(""); Printf(clientdata, "&%s_clientdata", templ); SwigType_remember_mangleddata(pmname, clientdata); SwigType *smart = Swig_cparse_smartptr(n); if (smart) { SwigType_add_pointer(smart); String *smart_pmname = SwigType_manglestr(smart); SwigType_remember_mangleddata(smart_pmname, clientdata); Delete(smart_pmname); } String *clientdata_klass = NewString("0"); if (GetFlag(n, "feature:implicitconv")) { Clear(clientdata_klass); Printf(clientdata_klass, "(PyObject *) &%s_type", templ); } Printf(f, "SWIGINTERN SwigPyClientData %s_clientdata = {%s, 0, 0, 0, 0, 0, (PyTypeObject *)&%s_type};\n\n", templ, clientdata_klass, templ); Printv(f_init, " if (PyType_Ready(builtin_pytype) < 0) {\n", NIL); Printf(f_init, " PyErr_SetString(PyExc_TypeError, \"Could not create type '%s'.\");\n", symname); Printv(f_init, "#if PY_VERSION_HEX >= 0x03000000\n", NIL); Printv(f_init, " return NULL;\n", NIL); Printv(f_init, "#else\n", NIL); Printv(f_init, " return;\n", NIL); Printv(f_init, "#endif\n", NIL); Printv(f_init, " }\n", NIL); Printv(f_init, " Py_INCREF(builtin_pytype);\n", NIL); Printf(f_init, " PyModule_AddObject(m, \"%s\", (PyObject *)builtin_pytype);\n", symname); Printf(f_init, " SwigPyBuiltin_AddPublicSymbol(public_interface, \"%s\");\n", symname); Printv(f_init, " d = md;\n", NIL); Delete(clientdata); Delete(smart); Delete(rname); Delete(pname); Delete(mname); Delete(pmname); Delete(templ); Delete(tp_flags); Delete(tp_flags_py3); Delete(tp_as_buffer); Delete(tp_as_mapping); Delete(tp_as_sequence); Delete(tp_as_number); Delete(quoted_symname); Delete(quoted_tp_doc_str); Delete(tp_init); Delete(clientdata_klass); Delete(richcompare_func); Delete(getset_name); Delete(methods_name); } virtual int classHandler(Node *n) { File *f_shadow_file = f_shadow; Node *base_node = NULL; if (shadow) { /* Create new strings for building up a wrapper function */ have_constructor = 0; have_repr = 0; class_name = Getattr(n, "sym:name"); real_classname = Getattr(n, "name"); if (!addSymbol(class_name, n)) return SWIG_ERROR; if (builtin) { List *baselist = Getattr(n, "bases"); if (baselist && Len(baselist) > 0) { Iterator b = First(baselist); base_node = b.item; } } shadow_indent = (String *) tab4; /* Handle inheritance */ String *base_class = NewString(""); List *baselist = Getattr(n, "bases"); if (baselist && Len(baselist)) { Iterator b; b = First(baselist); while (b.item) { String *bname = Getattr(b.item, "python:proxy"); bool ignore = GetFlag(b.item, "feature:ignore") ? true : false; if (!bname || ignore) { if (!bname && !ignore) { Swig_warning(WARN_TYPE_UNDEFINED_CLASS, Getfile(n), Getline(n), "Base class '%s' ignored - unknown module name for base. Either import the appropriate module interface file or specify the name of the module in the %%import directive.\n", SwigType_namestr(Getattr(b.item, "name"))); } b = Next(b); continue; } Printv(base_class, bname, NIL); b = Next(b); if (b.item) { Printv(base_class, ", ", NIL); } } } if (builtin) { Hash *base_richcompare = NULL; Hash *richcompare = NULL; if (base_node) base_richcompare = Getattr(base_node, "python:richcompare"); if (base_richcompare) richcompare = Copy(base_richcompare); else richcompare = NewHash(); Setattr(n, "python:richcompare", richcompare); } /* dealing with abstract base class */ String *abcs = Getattr(n, "feature:python:abc"); if (py3 && abcs) { if (Len(base_class)) { Printv(base_class, ", ", NIL); } Printv(base_class, abcs, NIL); } if (builtin) { if (have_docstring(n)) { String *ds = cdocstring(n, AUTODOC_CLASS); Setattr(n, "feature:python:tp_doc", ds); Delete(ds); } else { String *name = Getattr(n, "name"); String *rname = add_explicit_scope(SwigType_namestr(name)); Setattr(n, "feature:python:tp_doc", rname); Delete(rname); } } else { if (!py3) { if (GetFlag(n, "feature:python:nondynamic")) Printv(f_shadow, "@_swig_add_metaclass(_SwigNonDynamicMeta)\n", NIL); } Printv(f_shadow, "class ", class_name, NIL); if (Len(base_class)) { Printf(f_shadow, "(%s)", base_class); } else { if (GetFlag(n, "feature:exceptionclass")) { Printf(f_shadow, "(Exception)"); } else { Printf(f_shadow, "(object"); Printf(f_shadow, py3 && GetFlag(n, "feature:python:nondynamic") ? ", metaclass=_SwigNonDynamicMeta" : "", ")"); Printf(f_shadow, ")"); } } Printf(f_shadow, ":\n"); // write docstrings if requested if (have_docstring(n)) { String *str = docstring(n, AUTODOC_CLASS, tab4); if (str && Len(str)) Printv(f_shadow, tab4, str, "\n\n", NIL); } Printv(f_shadow, tab4, "thisown = property(lambda x: x.this.own(), ", "lambda x, v: x.this.own(v), doc=\"The membership flag\")\n", NIL); /* Add static attribute */ if (GetFlag(n, "feature:python:nondynamic")) { Printv(f_shadow_file, tab4, "__setattr__ = _swig_setattr_nondynamic_instance_variable(object.__setattr__)\n", NIL); } } } /* Emit all of the members */ in_class = 1; if (builtin) builtin_pre_decl(n); /* Override the shadow file so we can capture its methods */ f_shadow = NewString(""); // Set up type check for director class constructor Clear(none_comparison); if (builtin && Swig_directorclass(n)) { String *p_real_classname = Copy(real_classname); SwigType_add_pointer(p_real_classname); String *mangle = SwigType_manglestr(p_real_classname); String *descriptor = NewStringf("SWIGTYPE%s", mangle); Printv(none_comparison, "self->ob_type != ((SwigPyClientData *)(", descriptor, ")->clientdata)->pytype", NIL); Delete(descriptor); Delete(mangle); Delete(p_real_classname); } else { Printv(none_comparison, "$arg != Py_None", NIL); } Language::classHandler(n); in_class = 0; /* Complete the class */ if (shadow) { /* Generate a class registration function */ // Replace storing a pointer to underlying class with a smart pointer (intended for use with non-intrusive smart pointers) SwigType *smart = Swig_cparse_smartptr(n); SwigType *ct = Copy(smart ? smart : real_classname); SwigType_add_pointer(ct); SwigType *realct = Copy(real_classname); SwigType_add_pointer(realct); SwigType_remember(realct); if (builtin) { Printv(f_wrappers, builtin_closures_code, NIL); Delete(builtin_closures_code); builtin_closures_code = NewString(""); Clear(builtin_closures); } else { Printv(f_wrappers, "SWIGINTERN PyObject *", class_name, "_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {\n", NIL); Printv(f_wrappers, " PyObject *obj;\n", NIL); Printv(f_wrappers, " if (!SWIG_Python_UnpackTuple(args, \"swigregister\", 1, 1, &obj)) return NULL;\n", NIL); Printv(f_wrappers, " SWIG_TypeNewClientData(SWIGTYPE", SwigType_manglestr(ct), ", SWIG_NewClientData(obj));\n", " return SWIG_Py_Void();\n", "}\n\n", NIL); String *cname = NewStringf("%s_swigregister", class_name); add_method(cname, cname, 0, 0, 1, 1, 1); Delete(cname); } Delete(smart); Delete(ct); Delete(realct); if (!have_constructor) { if (!builtin) Printv(f_shadow_file, "\n", tab4, "def __init__(self, *args, **kwargs):\n", tab8, "raise AttributeError(\"", "No constructor defined", (Getattr(n, "abstracts") ? " - class is abstract" : ""), "\")\n", NIL); } else if (!builtin) { Printv(f_wrappers, "SWIGINTERN PyObject *", class_name, "_swiginit(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {\n", NIL); Printv(f_wrappers, " return SWIG_Python_InitShadowInstance(args);\n", "}\n\n", NIL); String *cname = NewStringf("%s_swiginit", class_name); add_method(cname, cname, 0); Delete(cname); } if (!have_repr && !builtin) { /* Supply a repr method for this class */ String *rname = SwigType_namestr(real_classname); Printv(f_shadow_file, tab4, "__repr__ = _swig_repr\n", NIL); Delete(rname); } if (builtin) builtin_post_decl(f_builtins, n); if (builtin_tp_init) { Delete(builtin_tp_init); builtin_tp_init = 0; } if (!builtin) { /* Now emit methods */ Printv(f_shadow_file, f_shadow, NIL); Printf(f_shadow_file, "\n"); Printf(f_shadow_file, "# Register %s in %s:\n", class_name, module); Printf(f_shadow_file, "%s.%s_swigregister(%s)\n", module, class_name, class_name); } shadow_indent = 0; Printf(f_shadow_file, "%s\n", f_shadow_stubs); Clear(f_shadow_stubs); } if (builtin) { Clear(class_members); Clear(builtin_getset); Clear(builtin_methods); } /* Restore shadow file back to original version */ Delete(f_shadow); f_shadow = f_shadow_file; return SWIG_OK; } /* ------------------------------------------------------------ * functionHandler() - Mainly overloaded for callback handling * ------------------------------------------------------------ */ virtual int functionHandler(Node *n) { String *pcb = GetFlagAttr(n, "feature:python:callback"); if (pcb) { if (Strcmp(pcb, "1") == 0) { SetFlagAttr(n, "feature:callback", "%s_cb_ptr"); } else { SetFlagAttr(n, "feature:callback", pcb); } autodoc_l dlevel = autodoc_level(Getattr(n, "feature:autodoc")); if (dlevel != NO_AUTODOC && dlevel > TYPES_AUTODOC) { Setattr(n, "feature:autodoc", "1"); } } return Language::functionHandler(n); } /* ------------------------------------------------------------ * memberfunctionHandler() * ------------------------------------------------------------ */ virtual int memberfunctionHandler(Node *n) { String *symname = Getattr(n, "sym:name"); int oldshadow; if (builtin) Swig_save("builtin_memberfunc", n, "python:argcount", NIL); /* Create the default member function */ oldshadow = shadow; /* Disable shadowing when wrapping member functions */ if (shadow) shadow = shadow | PYSHADOW_MEMBER; Language::memberfunctionHandler(n); shadow = oldshadow; if (builtin && in_class) { // Can't use checkAttribute(n, "access", "public") because // "access" attr isn't set on %extend methods if (!checkAttribute(n, "access", "private") && strncmp(Char(symname), "operator ", 9) && !Getattr(class_members, symname)) { String *fullname = Swig_name_member(NSPACE_TODO, class_name, symname); String *wname = Swig_name_wrapper(fullname); Setattr(class_members, symname, n); int argcount = Getattr(n, "python:argcount") ? atoi(Char(Getattr(n, "python:argcount"))) : 2; String *ds = have_docstring(n) ? cdocstring(n, AUTODOC_METHOD) : NewString(""); if (check_kwargs(n)) { // Cast via void(*)(void) to suppress GCC -Wcast-function-type // warning. Python should always call the function correctly, but // the Python C API requires us to store it in function pointer of a // different type. Printf(builtin_methods, " { \"%s\", (PyCFunction)(void(*)(void))%s, METH_VARARGS|METH_KEYWORDS, \"%s\" },\n", symname, wname, ds); } else if (argcount == 0) { Printf(builtin_methods, " { \"%s\", %s, METH_NOARGS, \"%s\" },\n", symname, wname, ds); } else if (argcount == 1) { Printf(builtin_methods, " { \"%s\", %s, METH_O, \"%s\" },\n", symname, wname, ds); } else { Printf(builtin_methods, " { \"%s\", %s, METH_VARARGS, \"%s\" },\n", symname, wname, ds); } Delete(fullname); Delete(wname); Delete(ds); } } if (builtin) Swig_restore(n); if (!Getattr(n, "sym:nextSibling")) { if (shadow && !builtin) { int fproxy = fastproxy; String *fullname = Swig_name_member(NSPACE_TODO, class_name, symname); if (Strcmp(symname, "__repr__") == 0) { have_repr = 1; } if (Getattr(n, "feature:shadow")) { String *pycode = indent_pythoncode(Getattr(n, "feature:shadow"), tab4, Getfile(n), Getline(n), "%feature(\"shadow\")"); String *pyaction = NewStringf("%s.%s", module, fullname); Replaceall(pycode, "$action", pyaction); Delete(pyaction); Printv(f_shadow, pycode, "\n", NIL); Delete(pycode); fproxy = 0; } else { int allow_kwargs = (check_kwargs(n) && !Getattr(n, "sym:overloaded")) ? 1 : 0; String *parms = make_pyParmList(n, true, false, allow_kwargs); String *callParms = make_pyParmList(n, true, true, allow_kwargs); if (!have_addtofunc(n)) { if (!fastproxy || olddefs) { Printv(f_shadow, "\n", tab4, "def ", symname, "(", parms, ")", returnTypeAnnotation(n), ":\n", NIL); if (have_docstring(n)) Printv(f_shadow, tab8, docstring(n, AUTODOC_METHOD, tab8), "\n", NIL); Printv(f_shadow, tab8, "return ", funcCall(fullname, callParms), "\n", NIL); } } else { Printv(f_shadow, "\n", tab4, "def ", symname, "(", parms, ")", returnTypeAnnotation(n), ":\n", NIL); if (have_docstring(n)) Printv(f_shadow, tab8, docstring(n, AUTODOC_METHOD, tab8), "\n", NIL); if (have_pythonprepend(n)) { fproxy = 0; Printv(f_shadow, indent_pythoncode(pythonprepend(n), tab8, Getfile(n), Getline(n), "%pythonprepend or %feature(\"pythonprepend\")"), "\n", NIL); } if (have_pythonappend(n)) { fproxy = 0; Printv(f_shadow, tab8, "val = ", funcCall(fullname, callParms), "\n", NIL); Printv(f_shadow, indent_pythoncode(pythonappend(n), tab8, Getfile(n), Getline(n), "%pythonappend or %feature(\"pythonappend\")"), "\n", NIL); Printv(f_shadow, tab8, "return val\n\n", NIL); } else { Printv(f_shadow, tab8, "return ", funcCall(fullname, callParms), "\n\n", NIL); } } } if (fproxy) { Printf(f_shadow, tab4); Printf(f_shadow, "%s = _swig_new_instance_method(%s.%s)\n", symname, module, Swig_name_member(NSPACE_TODO, class_name, symname)); } Delete(fullname); } } return SWIG_OK; } /* ------------------------------------------------------------ * staticmemberfunctionHandler() * ------------------------------------------------------------ */ virtual int staticmemberfunctionHandler(Node *n) { String *symname = Getattr(n, "sym:name"); if (builtin && in_class) { Swig_save("builtin_memberconstantHandler", n, "pybuiltin:symname", NIL); Setattr(n, "pybuiltin:symname", symname); } Language::staticmemberfunctionHandler(n); if (builtin && in_class) { Swig_restore(n); } if (builtin && in_class) { if ((GetFlagAttr(n, "feature:extend") || checkAttribute(n, "access", "public")) && !Getattr(class_members, symname)) { String *fullname = Swig_name_member(NSPACE_TODO, class_name, symname); String *wname = Swig_name_wrapper(fullname); Setattr(class_members, symname, n); int funpack = fastunpack && !Getattr(n, "sym:overloaded"); String *pyflags = NewString("METH_STATIC|"); int argcount = Getattr(n, "python:argcount") ? atoi(Char(Getattr(n, "python:argcount"))) : 2; if (funpack && argcount == 0) Append(pyflags, "METH_NOARGS"); else if (funpack && argcount == 1) Append(pyflags, "METH_O"); else Append(pyflags, "METH_VARARGS"); // Cast via void(*)(void) to suppress GCC -Wcast-function-type warning. // Python should always call the function correctly, but the Python C // API requires us to store it in function pointer of a different type. if (have_docstring(n)) { String *ds = cdocstring(n, AUTODOC_STATICFUNC); Printf(builtin_methods, " { \"%s\", (PyCFunction)(void(*)(void))%s, %s, \"%s\" },\n", symname, wname, pyflags, ds); Delete(ds); } else { Printf(builtin_methods, " { \"%s\", (PyCFunction)(void(*)(void))%s, %s, \"\" },\n", symname, wname, pyflags); } Delete(fullname); Delete(wname); Delete(pyflags); } return SWIG_OK; } if (Getattr(n, "sym:nextSibling")) { return SWIG_OK; } if (shadow) { String *staticfunc_name = NewString(fastproxy ? "_swig_new_static_method" : "staticmethod"); bool fast = (fastproxy && !have_addtofunc(n)) || Getattr(n, "feature:callback"); if (!fast || olddefs) { int kw = (check_kwargs(n) && !Getattr(n, "sym:overloaded")) ? 1 : 0; String *parms = make_pyParmList(n, false, false, kw); String *callParms = make_pyParmList(n, false, true, kw); Printv(f_shadow, "\n", tab4, "@staticmethod", NIL); Printv(f_shadow, "\n", tab4, "def ", symname, "(", parms, ")", returnTypeAnnotation(n), ":\n", NIL); if (have_docstring(n)) Printv(f_shadow, tab8, docstring(n, AUTODOC_STATICFUNC, tab8), "\n", NIL); if (have_pythonprepend(n)) Printv(f_shadow, indent_pythoncode(pythonprepend(n), tab8, Getfile(n), Getline(n), "%pythonprepend or %feature(\"pythonprepend\")"), "\n", NIL); if (have_pythonappend(n)) { Printv(f_shadow, tab8, "val = ", funcCall(Swig_name_member(NSPACE_TODO, class_name, symname), callParms), "\n", NIL); Printv(f_shadow, indent_pythoncode(pythonappend(n), tab8, Getfile(n), Getline(n), "%pythonappend or %feature(\"pythonappend\")"), "\n", NIL); Printv(f_shadow, tab8, "return val\n", NIL); } else { Printv(f_shadow, tab8, "return ", funcCall(Swig_name_member(NSPACE_TODO, class_name, symname), callParms), "\n", NIL); } } // Below may result in a 2nd definition of the method when -olddefs is used. The Python interpreter will use the second definition as it overwrites the first. if (fast) { Printv(f_shadow, tab4, symname, " = ", staticfunc_name, "(", module, ".", Swig_name_member(NSPACE_TODO, class_name, symname), ")\n", NIL); } Delete(staticfunc_name); } return SWIG_OK; } /* ------------------------------------------------------------ * constructorDeclaration() * ------------------------------------------------------------ */ virtual int constructorHandler(Node *n) { String *symname = Getattr(n, "sym:name"); int oldshadow = shadow; int use_director = Swig_directorclass(n); /* * If we're wrapping the constructor of a C++ director class, prepend a new parameter * to receive the scripting language object (e.g. 'self') * */ Swig_save("python:constructorHandler", n, "parms", NIL); if (use_director) { Parm *parms = Getattr(n, "parms"); Parm *self; String *name = NewString("self"); String *type = NewString("PyObject"); SwigType_add_pointer(type); self = NewParm(type, name, n); Delete(type); Delete(name); Setattr(self, "lname", "O"); if (parms) set_nextSibling(self, parms); Setattr(n, "parms", self); Setattr(n, "wrap:self", "1"); Setattr(n, "hidden", "1"); Delete(self); } if (shadow) shadow = shadow | PYSHADOW_MEMBER; Language::constructorHandler(n); shadow = oldshadow; Delattr(n, "wrap:self"); Swig_restore(n); if (!Getattr(n, "sym:nextSibling")) { if (shadow) { int allow_kwargs = (check_kwargs(n) && (!Getattr(n, "sym:overloaded"))) ? 1 : 0; int handled_as_init = 0; if (!have_constructor) { String *nname = Getattr(n, "sym:name"); String *sname = Getattr(getCurrentClass(), "sym:name"); String *cname = Swig_name_construct(NSPACE_TODO, sname); handled_as_init = (Strcmp(nname, sname) == 0) || (Strcmp(nname, cname) == 0); Delete(cname); } String *subfunc = Swig_name_construct(NSPACE_TODO, symname); if (!have_constructor && handled_as_init) { if (!builtin) { if (Getattr(n, "feature:shadow")) { String *pycode = indent_pythoncode(Getattr(n, "feature:shadow"), tab4, Getfile(n), Getline(n), "%feature(\"shadow\")"); String *pyaction = NewStringf("%s.%s", module, subfunc); Replaceall(pycode, "$action", pyaction); Delete(pyaction); Printv(f_shadow, pycode, "\n", NIL); Delete(pycode); } else { String *pass_self = NewString(""); Node *parent = Swig_methodclass(n); String *classname = Swig_class_name(parent); String *rclassname = Swig_class_name(getCurrentClass()); assert(rclassname); String *parms = make_pyParmList(n, true, false, allow_kwargs); /* Pass 'self' only if using director */ String *callParms = make_pyParmList(n, false, true, allow_kwargs, true); if (use_director) { Insert(callParms, 0, "_self, "); Printv(pass_self, tab8, NIL); Printf(pass_self, "if self.__class__ == %s:\n", classname); //Printv(pass_self, tab8, tab4, "args = (None,) + args\n", tab8, "else:\n", tab8, tab4, "args = (self,) + args\n", NIL); Printv(pass_self, tab8, tab4, "_self = None\n", tab8, "else:\n", tab8, tab4, "_self = self\n", NIL); } Printv(f_shadow, "\n", tab4, "def __init__(", parms, ")", returnTypeAnnotation(n), ":\n", NIL); if (have_docstring(n)) Printv(f_shadow, tab8, docstring(n, AUTODOC_CTOR, tab8), "\n", NIL); if (have_pythonprepend(n)) Printv(f_shadow, indent_pythoncode(pythonprepend(n), tab8, Getfile(n), Getline(n), "%pythonprepend or %feature(\"pythonprepend\")"), "\n", NIL); Printv(f_shadow, pass_self, NIL); Printv(f_shadow, tab8, module, ".", class_name, "_swiginit(self, ", funcCall(subfunc, callParms), ")\n", NIL); if (have_pythonappend(n)) Printv(f_shadow, indent_pythoncode(pythonappend(n), tab8, Getfile(n), Getline(n), "%pythonappend or %feature(\"pythonappend\")"), "\n\n", NIL); Delete(pass_self); } have_constructor = 1; } } else { /* Hmmm. We seem to be creating a different constructor. We're just going to create a function for it. */ if (!builtin) { if (Getattr(n, "feature:shadow")) { String *pycode = indent_pythoncode(Getattr(n, "feature:shadow"), "", Getfile(n), Getline(n), "%feature(\"shadow\")"); String *pyaction = NewStringf("%s.%s", module, subfunc); Replaceall(pycode, "$action", pyaction); Delete(pyaction); Printv(f_shadow_stubs, pycode, "\n", NIL); Delete(pycode); } else { String *parms = make_pyParmList(n, false, false, allow_kwargs); String *callParms = make_pyParmList(n, false, true, allow_kwargs); Printv(f_shadow_stubs, "\ndef ", symname, "(", parms, ")", returnTypeAnnotation(n), ":\n", NIL); if (have_docstring(n)) Printv(f_shadow_stubs, tab4, docstring(n, AUTODOC_CTOR, tab4), "\n", NIL); if (have_pythonprepend(n)) Printv(f_shadow_stubs, indent_pythoncode(pythonprepend(n), tab4, Getfile(n), Getline(n), "%pythonprepend or %feature(\"pythonprepend\")"), "\n", NIL); Printv(f_shadow_stubs, tab4, "val = ", funcCall(subfunc, callParms), "\n", NIL); #ifdef USE_THISOWN Printv(f_shadow_stubs, tab4, "val.thisown = 1\n", NIL); #endif if (have_pythonappend(n)) Printv(f_shadow_stubs, indent_pythoncode(pythonappend(n), tab4, Getfile(n), Getline(n), "%pythonappend or %feature(\"pythonappend\")"), "\n", NIL); Printv(f_shadow_stubs, tab4, "return val\n", NIL); } } else { Printf(f_shadow_stubs, "%s = %s\n", symname, subfunc); } } Delete(subfunc); } } return SWIG_OK; } /* ------------------------------------------------------------ * destructorHandler() * ------------------------------------------------------------ */ virtual int destructorHandler(Node *n) { String *symname = Getattr(n, "sym:name"); int oldshadow = shadow; if (builtin && in_class) { Node *cls = Swig_methodclass(n); // Use the destructor for the tp_dealloc slot unless a user overrides it with another method if (!Getattr(cls, "feature:python:tp_dealloc")) { Setattr(n, "feature:python:slot", "tp_dealloc"); Setattr(n, "feature:python:slot:functype", "destructor"); } } if (shadow) shadow = shadow | PYSHADOW_MEMBER; //Setattr(n,"emit:dealloc","1"); Language::destructorHandler(n); shadow = oldshadow; if (shadow) { if (Getattr(n, "feature:shadow")) { String *pycode = indent_pythoncode(Getattr(n, "feature:shadow"), tab4, Getfile(n), Getline(n), "%feature(\"shadow\")"); String *pyaction = NewStringf("%s.%s", module, Swig_name_destroy(NSPACE_TODO, symname)); Replaceall(pycode, "$action", pyaction); Delete(pyaction); Printv(f_shadow, pycode, "\n", NIL); Delete(pycode); } else { Printv(f_shadow, tab4, "__swig_destroy__ = ", module, ".", Swig_name_destroy(NSPACE_TODO, symname), "\n", NIL); if (!have_pythonprepend(n) && !have_pythonappend(n)) { return SWIG_OK; } Printv(f_shadow, tab4, "def __del__(self):\n", NIL); if (have_docstring(n)) Printv(f_shadow, tab8, docstring(n, AUTODOC_DTOR, tab8), "\n", NIL); if (have_pythonprepend(n)) Printv(f_shadow, indent_pythoncode(pythonprepend(n), tab8, Getfile(n), Getline(n), "%pythonprepend or %feature(\"pythonprepend\")"), "\n", NIL); #ifdef USE_THISOWN Printv(f_shadow, tab8, "try:\n", NIL); Printv(f_shadow, tab8, tab4, "if self.thisown:", module, ".", Swig_name_destroy(NSPACE_TODO, symname), "(self)\n", NIL); Printv(f_shadow, tab8, "except __builtin__.Exception: pass\n", NIL); #else #endif if (have_pythonappend(n)) Printv(f_shadow, indent_pythoncode(pythonappend(n), tab8, Getfile(n), Getline(n), "%pythonappend or %feature(\"pythonappend\")"), "\n", NIL); Printv(f_shadow, tab8, "pass\n", NIL); Printv(f_shadow, "\n", NIL); } } return SWIG_OK; } /* ------------------------------------------------------------ * membervariableHandler() * ------------------------------------------------------------ */ virtual int membervariableHandler(Node *n) { String *symname = Getattr(n, "sym:name"); int oldshadow = shadow; if (shadow) shadow = shadow | PYSHADOW_MEMBER; Language::membervariableHandler(n); shadow = oldshadow; if (shadow && !builtin) { String *mname = Swig_name_member(NSPACE_TODO, class_name, symname); String *setname = Swig_name_set(NSPACE_TODO, mname); String *getname = Swig_name_get(NSPACE_TODO, mname); int assignable = is_assignable(n); Printv(f_shadow, tab4, symname, " = property(", module, ".", getname, NIL); if (assignable) Printv(f_shadow, ", ", module, ".", setname, NIL); if (have_docstring(n)) Printv(f_shadow, ", doc=", docstring(n, AUTODOC_VAR, tab4), NIL); Printv(f_shadow, ")\n", NIL); Delete(mname); Delete(setname); Delete(getname); } return SWIG_OK; } /* ------------------------------------------------------------ * staticmembervariableHandler() * ------------------------------------------------------------ */ virtual int staticmembervariableHandler(Node *n) { Swig_save("builtin_staticmembervariableHandler", n, "builtin_symname", NIL); Language::staticmembervariableHandler(n); Swig_restore(n); if (GetFlag(n, "wrappedasconstant")) return SWIG_OK; String *symname = Getattr(n, "sym:name"); if (shadow) { if (!builtin && GetFlag(n, "hasconsttype")) { String *mname = Swig_name_member(NSPACE_TODO, class_name, symname); Printf(f_shadow_stubs, "%s.%s = %s.%s.%s\n", class_name, symname, module, global_name, mname); Delete(mname); } else { String *mname = Swig_name_member(NSPACE_TODO, class_name, symname); String *getname = Swig_name_get(NSPACE_TODO, mname); String *wrapgetname = Swig_name_wrapper(getname); String *vargetname = NewStringf("Swig_var_%s", getname); String *setname = Swig_name_set(NSPACE_TODO, mname); String *wrapsetname = Swig_name_wrapper(setname); String *varsetname = NewStringf("Swig_var_%s", setname); Wrapper *f = NewWrapper(); Printv(f->def, "SWIGINTERN PyObject *", wrapgetname, "(PyObject *SWIGUNUSEDPARM(self), PyObject *SWIGUNUSEDPARM(args)) {", NIL); Printv(f->code, " return ", vargetname, "();\n", NIL); Append(f->code, "}\n"); add_method(getname, wrapgetname, 0); Wrapper_print(f, f_wrappers); DelWrapper(f); int assignable = is_assignable(n); if (assignable) { int funpack = fastunpack; Wrapper *f = NewWrapper(); Printv(f->def, "SWIGINTERN PyObject *", wrapsetname, "(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {", NIL); Wrapper_add_local(f, "res", "int res"); if (!funpack) { Wrapper_add_local(f, "value", "PyObject *value"); Append(f->code, "if (!PyArg_ParseTuple(args, \"O:set\", &value)) return NULL;\n"); } Printf(f->code, "res = %s(%s);\n", varsetname, funpack ? "args" : "value"); Append(f->code, "return !res ? SWIG_Py_Void() : NULL;\n"); Append(f->code, "}\n"); Wrapper_print(f, f_wrappers); add_method(setname, wrapsetname, 0, 0, funpack, 1, 1); DelWrapper(f); } if (!builtin) { Printv(f_shadow, tab4, symname, " = property(", module, ".", getname, NIL); if (assignable) Printv(f_shadow, ", ", module, ".", setname, NIL); if (have_docstring(n)) Printv(f_shadow, ", doc=", docstring(n, AUTODOC_VAR, tab4), NIL); Printv(f_shadow, ")\n", NIL); } String *getter = Getattr(n, "pybuiltin:getter"); String *setter = Getattr(n, "pybuiltin:setter"); Hash *h = NULL; if (getter || setter) { h = Getattr(builtin_getset, symname); if (!h) { h = NewHash(); Setattr(h, "static", "1"); Setattr(builtin_getset, symname, h); } } if (getter) Setattr(h, "getter", getter); if (setter) Setattr(h, "setter", setter); if (h) Delete(h); Delete(mname); Delete(getname); Delete(wrapgetname); Delete(vargetname); Delete(setname); Delete(wrapsetname); Delete(varsetname); } } return SWIG_OK; } /* ------------------------------------------------------------ * memberconstantHandler() * ------------------------------------------------------------ */ virtual int memberconstantHandler(Node *n) { String *symname = Getattr(n, "sym:name"); if (builtin && in_class) { Swig_save("builtin_memberconstantHandler", n, "pybuiltin:symname", NIL); Setattr(n, "pybuiltin:symname", symname); } int oldshadow = shadow; if (shadow) shadow = shadow | PYSHADOW_MEMBER; Language::memberconstantHandler(n); shadow = oldshadow; if (builtin && in_class) { Swig_restore(n); } else if (shadow) { Printv(f_shadow, tab4, symname, " = ", module, ".", Swig_name_member(NSPACE_TODO, class_name, symname), "\n", NIL); if (have_docstring(n)) Printv(f_shadow, tab4, docstring(n, AUTODOC_CONST, tab4), "\n", NIL); } return SWIG_OK; } /* ------------------------------------------------------------ * insertDirective() * * Hook for %insert directive. We're going to look for special %shadow inserts * as a special case so we can do indenting correctly * ------------------------------------------------------------ */ virtual int insertDirective(Node *n) { String *code = Getattr(n, "code"); String *section = Getattr(n, "section"); if (!ImportMode && (Cmp(section, "python") == 0 || Cmp(section, "shadow") == 0)) { if (shadow) { String *pycode = indent_pythoncode(code, shadow_indent, Getfile(n), Getline(n), "%pythoncode or %insert(\"python\") block"); Printv(f_shadow, pycode, NIL); Delete(pycode); } } else if (!ImportMode && (Cmp(section, "pythonbegin") == 0)) { if (shadow) { String *pycode = indent_pythoncode(code, "", Getfile(n), Getline(n), "%pythonbegin or %insert(\"pythonbegin\") block"); Printv(f_shadow_begin, pycode, NIL); Delete(pycode); } } else { Language::insertDirective(n); } return SWIG_OK; } virtual String *runtimeCode() { String *s = NewString(""); String *shead = Swig_include_sys("pyhead.swg"); if (!shead) { Printf(stderr, "*** Unable to open 'pyhead.swg'\n"); } else { Append(s, shead); Delete(shead); } String *serrors = Swig_include_sys("pyerrors.swg"); if (!serrors) { Printf(stderr, "*** Unable to open 'pyerrors.swg'\n"); } else { Append(s, serrors); Delete(serrors); } String *sthread = Swig_include_sys("pythreads.swg"); if (!sthread) { Printf(stderr, "*** Unable to open 'pythreads.swg'\n"); } else { Append(s, sthread); Delete(sthread); } String *sapi = Swig_include_sys("pyapi.swg"); if (!sapi) { Printf(stderr, "*** Unable to open 'pyapi.swg'\n"); } else { Append(s, sapi); Delete(sapi); } String *srun = Swig_include_sys("pyrun.swg"); if (!srun) { Printf(stderr, "*** Unable to open 'pyrun.swg'\n"); } else { Append(s, srun); Delete(srun); } return s; } virtual String *defaultExternalRuntimeFilename() { return NewString("swigpyrun.h"); } /*---------------------------------------------------------------------- * kwargsSupport() *--------------------------------------------------------------------*/ bool kwargsSupport() const { return true; } }; /* --------------------------------------------------------------- * classDirectorMethod() * * Emit a virtual director method to pass a method call on to the * underlying Python object. * * ** Moved it here due to internal error on gcc-2.96 ** * --------------------------------------------------------------- */ int PYTHON::classDirectorMethods(Node *n) { director_method_index = 0; return Language::classDirectorMethods(n); } int PYTHON::classDirectorMethod(Node *n, Node *parent, String *super) { int is_void = 0; int is_pointer = 0; String *decl = Getattr(n, "decl"); String *name = Getattr(n, "name"); String *classname = Getattr(parent, "sym:name"); String *c_classname = Getattr(parent, "name"); String *symname = Getattr(n, "sym:name"); String *declaration = NewString(""); ParmList *l = Getattr(n, "parms"); Wrapper *w = NewWrapper(); String *tm; String *wrap_args = NewString(""); String *returntype = Getattr(n, "type"); String *value = Getattr(n, "value"); String *storage = Getattr(n, "storage"); bool pure_virtual = false; int status = SWIG_OK; int idx; bool ignored_method = GetFlag(n, "feature:ignore") ? true : false; if (builtin) { // Rename any wrapped parameters called 'self' as the generated code contains a variable with same name Parm *p; for (p = l; p; p = nextSibling(p)) { String *arg = Getattr(p, "name"); if (arg && Cmp(arg, "self") == 0) Delattr(p, "name"); } } if (Cmp(storage, "virtual") == 0) { if (Cmp(value, "0") == 0) { pure_virtual = true; } } /* determine if the method returns a pointer */ is_pointer = SwigType_ispointer_return(decl); is_void = (!Cmp(returntype, "void") && !is_pointer); /* virtual method definition */ String *target; String *pclassname = NewStringf("SwigDirector_%s", classname); String *qualified_name = NewStringf("%s::%s", pclassname, name); SwigType *rtype = Getattr(n, "conversion_operator") ? 0 : Getattr(n, "classDirectorMethods:type"); target = Swig_method_decl(rtype, decl, qualified_name, l, 0); Printf(w->def, "%s", target); Delete(qualified_name); Delete(target); /* header declaration */ target = Swig_method_decl(rtype, decl, name, l, 1); Printf(declaration, " virtual %s", target); Delete(target); // Get any exception classes in the throws typemap if (Getattr(n, "noexcept")) { Append(w->def, " noexcept"); Append(declaration, " noexcept"); } ParmList *throw_parm_list = 0; if ((throw_parm_list = Getattr(n, "throws")) || Getattr(n, "throw")) { Parm *p; int gencomma = 0; Append(w->def, " throw("); Append(declaration, " throw("); if (throw_parm_list) Swig_typemap_attach_parms("throws", throw_parm_list, 0); for (p = throw_parm_list; p; p = nextSibling(p)) { if (Getattr(p, "tmap:throws")) { if (gencomma++) { Append(w->def, ", "); Append(declaration, ", "); } String *str = SwigType_str(Getattr(p, "type"), 0); Append(w->def, str); Append(declaration, str); Delete(str); } } Append(w->def, ")"); Append(declaration, ")"); } Append(w->def, " {"); Append(declaration, ";\n"); /* declare method return value * if the return value is a reference or const reference, a specialized typemap must * handle it, including declaration of c_result ($result). */ if (!is_void && (!ignored_method || pure_virtual)) { if (!SwigType_isclass(returntype)) { if (!(SwigType_ispointer(returntype) || SwigType_isreference(returntype))) { String *construct_result = NewStringf("= SwigValueInit< %s >()", SwigType_lstr(returntype, 0)); Wrapper_add_localv(w, "c_result", SwigType_lstr(returntype, "c_result"), construct_result, NIL); Delete(construct_result); } else { Wrapper_add_localv(w, "c_result", SwigType_lstr(returntype, "c_result"), "= 0", NIL); } } else { String *cres = SwigType_lstr(returntype, "c_result"); Printf(w->code, "%s;\n", cres); Delete(cres); } } if (builtin) { Printv(w->code, "PyObject *self = NULL;\n", NIL); Printv(w->code, "(void)self;\n", NIL); } if (ignored_method) { if (!pure_virtual) { if (!is_void) Printf(w->code, "return "); String *super_call = Swig_method_call(super, l); Printf(w->code, "%s;\n", super_call); Delete(super_call); } else { Printf(w->code, "Swig::DirectorPureVirtualException::raise(\"Attempted to invoke pure virtual method %s::%s\");\n", SwigType_namestr(c_classname), SwigType_namestr(name)); } } else { /* attach typemaps to arguments (C/C++ -> Python) */ String *arglist = NewString(""); String *parse_args = NewString(""); Swig_director_parms_fixup(l); /* remove the wrapper 'w' since it was producing spurious temps */ Swig_typemap_attach_parms("in", l, 0); Swig_typemap_attach_parms("directorin", l, w); Swig_typemap_attach_parms("directorargout", l, w); Parm *p; char source[256]; int outputs = 0; if (!is_void) outputs++; /* build argument list and type conversion string */ idx = 0; p = l; int use_parse = 0; while (p) { if (checkAttribute(p, "tmap:in:numinputs", "0")) { p = Getattr(p, "tmap:in:next"); continue; } /* old style? caused segfaults without the p!=0 check in the for() condition, and seems dangerous in the while loop as well. while (Getattr(p, "tmap:ignore")) { p = Getattr(p, "tmap:ignore:next"); } */ if (Getattr(p, "tmap:directorargout") != 0) outputs++; String *pname = Getattr(p, "name"); String *ptype = Getattr(p, "type"); Putc(',', arglist); if ((tm = Getattr(p, "tmap:directorin")) != 0) { String *parse = Getattr(p, "tmap:directorin:parse"); if (!parse) { sprintf(source, "obj%d", idx++); String *input = NewString(source); Setattr(p, "emit:directorinput", input); Replaceall(tm, "$input", input); Delete(input); Replaceall(tm, "$owner", "0"); /* Wrapper_add_localv(w, source, "swig::SwigVar_PyObject", source, "= 0", NIL); */ Printv(wrap_args, "swig::SwigVar_PyObject ", source, ";\n", NIL); Printv(wrap_args, tm, "\n", NIL); Printv(arglist, "(PyObject *)", source, NIL); Putc('O', parse_args); } else { use_parse = 1; Append(parse_args, parse); Setattr(p, "emit:directorinput", pname); Replaceall(tm, "$input", pname); Replaceall(tm, "$owner", "0"); if (Len(tm) == 0) Append(tm, pname); Append(arglist, tm); } p = Getattr(p, "tmap:directorin:next"); continue; } else if (Cmp(ptype, "void")) { /* special handling for pointers to other C++ director classes. * ideally this would be left to a typemap, but there is currently no * way to selectively apply the dynamic_cast<> to classes that have * directors. in other words, the type "SwigDirector_$1_lname" only exists * for classes with directors. we avoid the problem here by checking * module.wrap::directormap, but it's not clear how to get a typemap to * do something similar. perhaps a new default typemap (in addition * to SWIGTYPE) called DIRECTORTYPE? */ if (SwigType_ispointer(ptype) || SwigType_isreference(ptype)) { Node *module = Getattr(parent, "module"); Node *target = Swig_directormap(module, ptype); sprintf(source, "obj%d", idx++); String *nonconst = 0; /* strip pointer/reference --- should move to Swig/stype.c */ String *nptype = NewString(Char(ptype) + 2); /* name as pointer */ String *ppname = Copy(pname); if (SwigType_isreference(ptype)) { Insert(ppname, 0, "&"); } /* if necessary, cast away const since Python doesn't support it! */ if (SwigType_isconst(nptype)) { nonconst = NewStringf("nc_tmp_%s", pname); String *nonconst_i = NewStringf("= const_cast< %s >(%s)", SwigType_lstr(ptype, 0), ppname); Wrapper_add_localv(w, nonconst, SwigType_lstr(ptype, 0), nonconst, nonconst_i, NIL); Delete(nonconst_i); Swig_warning(WARN_LANG_DISCARD_CONST, input_file, line_number, "Target language argument '%s' discards const in director method %s::%s.\n", SwigType_str(ptype, pname), SwigType_namestr(c_classname), SwigType_namestr(name)); } else { nonconst = Copy(ppname); } Delete(nptype); Delete(ppname); String *mangle = SwigType_manglestr(ptype); if (target) { String *director = NewStringf("director_%s", mangle); Wrapper_add_localv(w, director, "Swig::Director *", director, "= 0", NIL); Wrapper_add_localv(w, source, "swig::SwigVar_PyObject", source, "= 0", NIL); Printf(wrap_args, "%s = SWIG_DIRECTOR_CAST(%s);\n", director, nonconst); Printf(wrap_args, "if (!%s) {\n", director); Printf(wrap_args, "%s = SWIG_InternalNewPointerObj(%s, SWIGTYPE%s, 0);\n", source, nonconst, mangle); Append(wrap_args, "} else {\n"); Printf(wrap_args, "%s = %s->swig_get_self();\n", source, director); Printf(wrap_args, "Py_INCREF((PyObject *)%s);\n", source); Append(wrap_args, "}\n"); Delete(director); Printv(arglist, source, NIL); } else { Wrapper_add_localv(w, source, "swig::SwigVar_PyObject", source, "= 0", NIL); Printf(wrap_args, "%s = SWIG_InternalNewPointerObj(%s, SWIGTYPE%s, 0);\n", source, nonconst, mangle); //Printf(wrap_args, "%s = SWIG_NewPointerObj(%s, SWIGTYPE_p_%s, 0);\n", // source, nonconst, base); Printv(arglist, source, NIL); } Putc('O', parse_args); Delete(mangle); Delete(nonconst); } else { Swig_warning(WARN_TYPEMAP_DIRECTORIN_UNDEF, input_file, line_number, "Unable to use type %s as a function argument in director method %s::%s (skipping method).\n", SwigType_str(ptype, 0), SwigType_namestr(c_classname), SwigType_namestr(name)); status = SWIG_NOWRAP; break; } } p = nextSibling(p); } /* add the method name as a PyString */ String *pyname = Getattr(n, "sym:name"); int allow_thread = threads_enable(n); if (allow_thread) { thread_begin_block(n, w->code); Append(w->code, "{\n"); } /* wrap complex arguments to PyObjects */ Printv(w->code, wrap_args, NIL); /* pass the method call on to the Python object */ if (dirprot_mode() && !is_public(n)) { Printf(w->code, "swig_set_inner(\"%s\", true);\n", name); } Append(w->code, "if (!swig_get_self()) {\n"); Printf(w->code, " Swig::DirectorException::raise(\"'self' uninitialized, maybe you forgot to call %s.__init__.\");\n", classname); Append(w->code, "}\n"); Append(w->code, "#if defined(SWIG_PYTHON_DIRECTOR_VTABLE)\n"); Printf(w->code, "const size_t swig_method_index = %d;\n", director_method_index++); Printf(w->code, "const char *const swig_method_name = \"%s\";\n", pyname); Append(w->code, "PyObject *method = swig_get_method(swig_method_index, swig_method_name);\n"); if (Len(parse_args) > 0) { if (use_parse) { Printf(w->code, "swig::SwigVar_PyObject %s = PyObject_CallFunction(method, (char *)\"(%s)\" %s);\n", Swig_cresult_name(), parse_args, arglist); } else { Printf(w->code, "swig::SwigVar_PyObject %s = PyObject_CallFunctionObjArgs(method %s, NULL);\n", Swig_cresult_name(), arglist); } } else { Append(w->code, "swig::SwigVar_PyObject args = PyTuple_New(0);\n"); Printf(w->code, "swig::SwigVar_PyObject %s = PyObject_Call(method, (PyObject *) args, NULL);\n", Swig_cresult_name()); } Append(w->code, "#else\n"); if (Len(parse_args) > 0) { if (use_parse) { Printf(w->code, "swig::SwigVar_PyObject %s = PyObject_CallMethod(swig_get_self(), (char *)\"%s\", (char *)\"(%s)\" %s);\n", Swig_cresult_name(), pyname, parse_args, arglist); } else { Printf(w->code, "swig::SwigVar_PyObject swig_method_name = SWIG_Python_str_FromChar(\"%s\");\n", pyname); Printf(w->code, "swig::SwigVar_PyObject %s = PyObject_CallMethodObjArgs(swig_get_self(), (PyObject *) swig_method_name %s, NULL);\n", Swig_cresult_name(), arglist); } } else { Printf(w->code, "swig::SwigVar_PyObject swig_method_name = SWIG_Python_str_FromChar(\"%s\");\n", pyname); Printf(w->code, "swig::SwigVar_PyObject %s = PyObject_CallMethodObjArgs(swig_get_self(), (PyObject *) swig_method_name, NULL);\n", Swig_cresult_name()); } Append(w->code, "#endif\n"); if (dirprot_mode() && !is_public(n)) Printf(w->code, "swig_set_inner(\"%s\", false);\n", name); /* exception handling */ tm = Swig_typemap_lookup("director:except", n, Swig_cresult_name(), 0); if (!tm) { tm = Getattr(n, "feature:director:except"); if (tm) tm = Copy(tm); } Printf(w->code, "if (!%s) {\n", Swig_cresult_name()); Append(w->code, " PyObject *error = PyErr_Occurred();\n"); if ((tm) && Len(tm) && (Strcmp(tm, "1") != 0)) { Replaceall(tm, "$error", "error"); Printv(w->code, Str(tm), "\n", NIL); } else { Append(w->code, " if (error) {\n"); Printf(w->code, " Swig::DirectorMethodException::raise(\"Error detected when calling '%s.%s'\");\n", classname, pyname); Append(w->code, " }\n"); } Append(w->code, "}\n"); Delete(tm); /* * Python method may return a simple object, or a tuple. * for in/out arguments, we have to extract the appropriate PyObjects from the tuple, * then marshal everything back to C/C++ (return value and output arguments). * */ /* marshal return value and other outputs (if any) from PyObject to C/C++ type */ String *cleanup = NewString(""); String *outarg = NewString(""); if (outputs > 1) { Wrapper_add_local(w, "output", "PyObject *output"); Printf(w->code, "if (!PyTuple_Check(%s)) {\n", Swig_cresult_name()); Printf(w->code, " Swig::DirectorTypeMismatchException::raise(\"Python method %s.%sfailed to return a tuple.\");\n", classname, pyname); Append(w->code, "}\n"); } idx = 0; /* marshal return value */ if (!is_void) { tm = Swig_typemap_lookup("directorout", n, Swig_cresult_name(), w); if (tm != 0) { if (outputs > 1) { Printf(w->code, "output = PyTuple_GetItem(%s, %d);\n", Swig_cresult_name(), idx++); Replaceall(tm, "$input", "output"); } else { Replaceall(tm, "$input", Swig_cresult_name()); } char temp[24]; sprintf(temp, "%d", idx); Replaceall(tm, "$argnum", temp); /* TODO check this */ if (Getattr(n, "wrap:disown")) { Replaceall(tm, "$disown", "SWIG_POINTER_DISOWN"); } else { Replaceall(tm, "$disown", "0"); } if (Getattr(n, "tmap:directorout:implicitconv")) { Replaceall(tm, "$implicitconv", get_implicitconv_flag(n)); } Replaceall(tm, "$result", "c_result"); Printv(w->code, tm, "\n", NIL); Delete(tm); } else { Swig_warning(WARN_TYPEMAP_DIRECTOROUT_UNDEF, input_file, line_number, "Unable to use return type %s in director method %s::%s (skipping method).\n", SwigType_str(returntype, 0), SwigType_namestr(c_classname), SwigType_namestr(name)); status = SWIG_ERROR; } } /* marshal outputs */ for (p = l; p;) { if ((tm = Getattr(p, "tmap:directorargout")) != 0) { if (outputs > 1) { Printf(w->code, "output = PyTuple_GetItem(%s, %d);\n", Swig_cresult_name(), idx++); Replaceall(tm, "$result", "output"); } else { Replaceall(tm, "$result", Swig_cresult_name()); } Replaceall(tm, "$input", Getattr(p, "emit:directorinput")); Printv(w->code, tm, "\n", NIL); p = Getattr(p, "tmap:directorargout:next"); } else { p = nextSibling(p); } } /* any existing helper functions to handle this? */ if (allow_thread) { Append(w->code, "}\n"); thread_end_block(n, w->code); } Delete(parse_args); Delete(arglist); Delete(cleanup); Delete(outarg); } if (!is_void) { if (!(ignored_method && !pure_virtual)) { String *rettype = SwigType_str(returntype, 0); if (!SwigType_isreference(returntype)) { Printf(w->code, "return (%s) c_result;\n", rettype); } else { Printf(w->code, "return (%s) *c_result;\n", rettype); } Delete(rettype); } } Append(w->code, "}\n"); // We expose protected methods via an extra public inline method which makes a straight call to the wrapped class' method String *inline_extra_method = NewString(""); if (dirprot_mode() && !is_public(n) && !pure_virtual) { Printv(inline_extra_method, declaration, NIL); String *extra_method_name = NewStringf("%sSwigPublic", name); Replaceall(inline_extra_method, name, extra_method_name); Replaceall(inline_extra_method, ";\n", " {\n "); if (!is_void) Printf(inline_extra_method, "return "); String *methodcall = Swig_method_call(super, l); Printv(inline_extra_method, methodcall, ";\n }\n", NIL); Delete(methodcall); Delete(extra_method_name); } /* emit the director method */ if (status == SWIG_OK) { if (!Getattr(n, "defaultargs")) { Replaceall(w->code, "$symname", symname); Wrapper_print(w, f_directors); Printv(f_directors_h, declaration, NIL); Printv(f_directors_h, inline_extra_method, NIL); } } /* clean up */ Delete(wrap_args); Delete(pclassname); DelWrapper(w); return status; } /* ----------------------------------------------------------------------------- * swig_python() - Instantiate module * ----------------------------------------------------------------------------- */ static Language *new_swig_python() { return new PYTHON(); } extern "C" Language *swig_python(void) { return new_swig_python(); } swig-4.0.1/Source/Modules/chicken.cxx0000644000175000017500000013351513527063513017360 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * chicken.cxx * * CHICKEN language module for SWIG. * ----------------------------------------------------------------------------- */ #include "swigmod.h" #include static const char *usage = "\ \ CHICKEN Options (available with -chicken)\n\ -closprefix - Prepend to all clos identifiers\n\ -noclosuses - Do not (declare (uses ...)) in scheme file\n\ -nocollection - Do not register pointers with chicken garbage\n\ collector and export destructors\n\ -nounit - Do not (declare (unit ...)) in scheme file\n\ -proxy - Export TinyCLOS class definitions\n\ -unhideprimitive - Unhide the primitive: symbols\n\ -useclassprefix - Prepend the class name to all clos identifiers\n\ \n"; static char *module = 0; static const char *chicken_path = "chicken"; static int num_methods = 0; static File *f_begin = 0; static File *f_runtime = 0; static File *f_header = 0; static File *f_wrappers = 0; static File *f_init = 0; static String *chickentext = 0; static String *closprefix = 0; static String *swigtype_ptr = 0; static String *f_sym_size = 0; /* some options */ static int declare_unit = 1; static int no_collection = 0; static int clos_uses = 1; /* C++ Support + Clos Classes */ static int clos = 0; static String *c_class_name = 0; static String *class_name = 0; static String *short_class_name = 0; static int in_class = 0; static int have_constructor = 0; static bool exporting_destructor = false; static bool exporting_constructor = false; static String *constructor_name = 0; static String *member_name = 0; /* sections of the .scm code */ static String *scm_const_defs = 0; static String *clos_class_defines = 0; static String *clos_methods = 0; /* Some clos options */ static int useclassprefix = 0; static String *clossymnameprefix = 0; static int hide_primitive = 1; static Hash *primitive_names = 0; /* Used for overloading constructors */ static int has_constructor_args = 0; static List *constructor_arg_types = 0; static String *constructor_dispatch = 0; static Hash *overload_parameter_lists = 0; class CHICKEN:public Language { public: virtual void main(int argc, char *argv[]); virtual int top(Node *n); virtual int functionWrapper(Node *n); virtual int variableWrapper(Node *n); virtual int constantWrapper(Node *n); virtual int classHandler(Node *n); virtual int memberfunctionHandler(Node *n); virtual int membervariableHandler(Node *n); virtual int constructorHandler(Node *n); virtual int destructorHandler(Node *n); virtual int validIdentifier(String *s); virtual int staticmembervariableHandler(Node *n); virtual int staticmemberfunctionHandler(Node *n); virtual int importDirective(Node *n); protected: void addMethod(String *scheme_name, String *function); /* Return true iff T is a pointer type */ int isPointer(SwigType *t); void dispatchFunction(Node *n); String *chickenNameMapping(String *, const_String_or_char_ptr ); String *chickenPrimitiveName(String *); String *runtimeCode(); String *defaultExternalRuntimeFilename(); String *buildClosFunctionCall(List *types, const_String_or_char_ptr closname, const_String_or_char_ptr funcname); }; /* ----------------------------------------------------------------------- * swig_chicken() - Instantiate module * ----------------------------------------------------------------------- */ static Language *new_swig_chicken() { return new CHICKEN(); } extern "C" { Language *swig_chicken(void) { return new_swig_chicken(); } } void CHICKEN::main(int argc, char *argv[]) { int i; SWIG_library_directory(chicken_path); // Look for certain command line options for (i = 1; i < argc; i++) { if (argv[i]) { if (strcmp(argv[i], "-help") == 0) { fputs(usage, stdout); SWIG_exit(0); } else if (strcmp(argv[i], "-proxy") == 0) { clos = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-closprefix") == 0) { if (argv[i + 1]) { clossymnameprefix = NewString(argv[i + 1]); Swig_mark_arg(i); Swig_mark_arg(i + 1); i++; } else { Swig_arg_error(); } } else if (strcmp(argv[i], "-useclassprefix") == 0) { useclassprefix = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-unhideprimitive") == 0) { hide_primitive = 0; Swig_mark_arg(i); } else if (strcmp(argv[i], "-nounit") == 0) { declare_unit = 0; Swig_mark_arg(i); } else if (strcmp(argv[i], "-noclosuses") == 0) { clos_uses = 0; Swig_mark_arg(i); } else if (strcmp(argv[i], "-nocollection") == 0) { no_collection = 1; Swig_mark_arg(i); } } } if (!clos) hide_primitive = 0; // Add a symbol for this module Preprocessor_define("SWIGCHICKEN 1", 0); // Set name of typemaps SWIG_typemap_lang("chicken"); // Read in default typemaps */ SWIG_config_file("chicken.swg"); allow_overloading(); } int CHICKEN::top(Node *n) { String *chicken_filename = NewString(""); File *f_scm; String *scmmodule; /* Initialize all of the output files */ String *outfile = Getattr(n, "outfile"); f_begin = NewFile(outfile, "w", SWIG_output_files()); if (!f_begin) { FileErrorDisplay(outfile); SWIG_exit(EXIT_FAILURE); } f_runtime = NewString(""); f_init = NewString(""); f_header = NewString(""); f_wrappers = NewString(""); chickentext = NewString(""); closprefix = NewString(""); f_sym_size = NewString(""); primitive_names = NewHash(); overload_parameter_lists = NewHash(); /* Register file targets with the SWIG file handler */ Swig_register_filebyname("header", f_header); Swig_register_filebyname("wrapper", f_wrappers); Swig_register_filebyname("begin", f_begin); Swig_register_filebyname("runtime", f_runtime); Swig_register_filebyname("init", f_init); Swig_register_filebyname("chicken", chickentext); Swig_register_filebyname("closprefix", closprefix); clos_class_defines = NewString(""); clos_methods = NewString(""); scm_const_defs = NewString(""); Swig_banner(f_begin); Printf(f_runtime, "\n\n#ifndef SWIGCHICKEN\n#define SWIGCHICKEN\n#endif\n\n"); if (no_collection) Printf(f_runtime, "#define SWIG_CHICKEN_NO_COLLECTION 1\n"); Printf(f_runtime, "\n"); /* Set module name */ module = Swig_copy_string(Char(Getattr(n, "name"))); scmmodule = NewString(module); Replaceall(scmmodule, "_", "-"); Printf(f_header, "#define SWIG_init swig_%s_init\n", module); Printf(f_header, "#define SWIG_name \"%s\"\n", scmmodule); Printf(f_wrappers, "#ifdef __cplusplus\n"); Printf(f_wrappers, "extern \"C\" {\n"); Printf(f_wrappers, "#endif\n\n"); Language::top(n); SwigType_emit_type_table(f_runtime, f_wrappers); Printf(f_wrappers, "#ifdef __cplusplus\n"); Printf(f_wrappers, "}\n"); Printf(f_wrappers, "#endif\n"); Printf(f_init, "C_kontinue (continuation, ret);\n"); Printf(f_init, "}\n\n"); Printf(f_init, "#ifdef __cplusplus\n"); Printf(f_init, "}\n"); Printf(f_init, "#endif\n"); Printf(chicken_filename, "%s%s.scm", SWIG_output_directory(), module); if ((f_scm = NewFile(chicken_filename, "w", SWIG_output_files())) == 0) { FileErrorDisplay(chicken_filename); SWIG_exit(EXIT_FAILURE); } Swig_banner_target_lang(f_scm, ";;"); Printf(f_scm, "\n"); if (declare_unit) Printv(f_scm, "(declare (unit ", scmmodule, "))\n\n", NIL); Printv(f_scm, "(declare \n", tab4, "(hide swig-init swig-init-return)\n", tab4, "(foreign-declare \"C_extern void swig_", module, "_init(C_word,C_word,C_word) C_noret;\"))\n", NIL); Printv(f_scm, "(define swig-init (##core#primitive \"swig_", module, "_init\"))\n", NIL); Printv(f_scm, "(define swig-init-return (swig-init))\n\n", NIL); if (clos) { //Printf (f_scm, "(declare (uses tinyclos))\n"); //New chicken versions have tinyclos as an egg Printf(f_scm, "(require-extension tinyclos)\n"); Replaceall(closprefix, "$module", scmmodule); Printf(f_scm, "%s\n", closprefix); Printf(f_scm, "%s\n", clos_class_defines); Printf(f_scm, "%s\n", clos_methods); } else { Printf(f_scm, "%s\n", scm_const_defs); } Printf(f_scm, "%s\n", chickentext); Delete(f_scm); char buftmp[20]; sprintf(buftmp, "%d", num_methods); Replaceall(f_init, "$nummethods", buftmp); Replaceall(f_init, "$symsize", f_sym_size); if (hide_primitive) Replaceall(f_init, "$veclength", buftmp); else Replaceall(f_init, "$veclength", "0"); Delete(chicken_filename); Delete(chickentext); Delete(closprefix); Delete(overload_parameter_lists); Delete(clos_class_defines); Delete(clos_methods); Delete(scm_const_defs); /* Close all of the files */ Delete(primitive_names); Delete(scmmodule); Dump(f_runtime, f_begin); Dump(f_header, f_begin); Dump(f_wrappers, f_begin); Wrapper_pretty_print(f_init, f_begin); Delete(f_header); Delete(f_wrappers); Delete(f_sym_size); Delete(f_init); Delete(f_runtime); Delete(f_begin); return SWIG_OK; } int CHICKEN::functionWrapper(Node *n) { String *name = Getattr(n, "name"); String *iname = Getattr(n, "sym:name"); SwigType *d = Getattr(n, "type"); ParmList *l = Getattr(n, "parms"); Parm *p; int i; String *wname; Wrapper *f; String *mangle = NewString(""); String *get_pointers; String *cleanup; String *argout; String *tm; String *overname = 0; String *declfunc = 0; String *scmname; bool any_specialized_arg = false; List *function_arg_types = NewList(); int num_required; int num_arguments; int have_argout; Printf(mangle, "\"%s\"", SwigType_manglestr(d)); if (Getattr(n, "sym:overloaded")) { overname = Getattr(n, "sym:overname"); } else { if (!addSymbol(iname, n)) return SWIG_ERROR; } f = NewWrapper(); wname = NewString(""); get_pointers = NewString(""); cleanup = NewString(""); argout = NewString(""); declfunc = NewString(""); scmname = NewString(iname); Replaceall(scmname, "_", "-"); /* Local vars */ Wrapper_add_local(f, "resultobj", "C_word resultobj"); /* Write code to extract function parameters. */ emit_parameter_variables(l, f); /* Attach the standard typemaps */ emit_attach_parmmaps(l, f); Setattr(n, "wrap:parms", l); /* Get number of required and total arguments */ num_arguments = emit_num_arguments(l); num_required = emit_num_required(l); Append(wname, Swig_name_wrapper(iname)); if (overname) { Append(wname, overname); } // Check for interrupts Printv(f->code, "C_trace(\"", scmname, "\");\n", NIL); Printv(f->def, "static ", "void ", wname, " (C_word argc, C_word closure, C_word continuation", NIL); Printv(declfunc, "void ", wname, "(C_word,C_word,C_word", NIL); /* Generate code for argument marshalling */ for (i = 0, p = l; i < num_arguments; i++) { while (checkAttribute(p, "tmap:in:numinputs", "0")) { p = Getattr(p, "tmap:in:next"); } SwigType *pt = Getattr(p, "type"); String *ln = Getattr(p, "lname"); Printf(f->def, ", C_word scm%d", i + 1); Printf(declfunc, ",C_word"); /* Look for an input typemap */ if ((tm = Getattr(p, "tmap:in"))) { String *parse = Getattr(p, "tmap:in:parse"); if (!parse) { String *source = NewStringf("scm%d", i + 1); Replaceall(tm, "$source", source); Replaceall(tm, "$target", ln); Replaceall(tm, "$input", source); Setattr(p, "emit:input", source); /* Save the location of the object */ if (Getattr(p, "wrap:disown") || (Getattr(p, "tmap:in:disown"))) { Replaceall(tm, "$disown", "SWIG_POINTER_DISOWN"); } else { Replaceall(tm, "$disown", "0"); } if (i >= num_required) Printf(get_pointers, "if (argc-2>%i && (%s)) {\n", i, source); Printv(get_pointers, tm, "\n", NIL); if (i >= num_required) Printv(get_pointers, "}\n", NIL); if (clos) { if (i < num_required) { if (strcmp("void", Char(pt)) != 0) { Node *class_node = 0; String *clos_code = Getattr(p, "tmap:in:closcode"); class_node = classLookup(pt); if (clos_code && class_node) { String *class_name = NewStringf("<%s>", Getattr(class_node, "sym:name")); Replaceall(class_name, "_", "-"); Append(function_arg_types, class_name); Append(function_arg_types, Copy(clos_code)); any_specialized_arg = true; Delete(class_name); } else { Append(function_arg_types, ""); Append(function_arg_types, "$input"); } } } } Delete(source); } p = Getattr(p, "tmap:in:next"); continue; } else { Swig_warning(WARN_TYPEMAP_IN_UNDEF, input_file, line_number, "Unable to use type %s as a function argument.\n", SwigType_str(pt, 0)); break; } } /* finish argument marshalling */ Printf(f->def, ") {"); Printf(declfunc, ")"); if (num_required != num_arguments) { Append(function_arg_types, "^^##optional$$"); } /* First check the number of arguments is correct */ if (num_arguments != num_required) Printf(f->code, "if (argc-2<%i || argc-2>%i) C_bad_argc(argc,%i);\n", num_required, num_arguments, num_required + 2); else Printf(f->code, "if (argc!=%i) C_bad_argc(argc,%i);\n", num_arguments + 2, num_arguments + 2); /* Now piece together the first part of the wrapper function */ Printv(f->code, get_pointers, NIL); /* Insert constraint checking code */ for (p = l; p;) { if ((tm = Getattr(p, "tmap:check"))) { Replaceall(tm, "$target", Getattr(p, "lname")); Printv(f->code, tm, "\n", NIL); p = Getattr(p, "tmap:check:next"); } else { p = nextSibling(p); } } /* Insert cleanup code */ for (p = l; p;) { if ((tm = Getattr(p, "tmap:freearg"))) { Replaceall(tm, "$source", Getattr(p, "lname")); Printv(cleanup, tm, "\n", NIL); p = Getattr(p, "tmap:freearg:next"); } else { p = nextSibling(p); } } /* Insert argument output code */ have_argout = 0; for (p = l; p;) { if ((tm = Getattr(p, "tmap:argout"))) { if (!have_argout) { have_argout = 1; // Print initial argument output code Printf(argout, "SWIG_Chicken_SetupArgout\n"); } Replaceall(tm, "$source", Getattr(p, "lname")); Replaceall(tm, "$target", "resultobj"); Replaceall(tm, "$arg", Getattr(p, "emit:input")); Replaceall(tm, "$input", Getattr(p, "emit:input")); Printf(argout, "%s", tm); p = Getattr(p, "tmap:argout:next"); } else { p = nextSibling(p); } } Setattr(n, "wrap:name", wname); /* Emit the function call */ String *actioncode = emit_action(n); /* Return the function value */ if ((tm = Swig_typemap_lookup_out("out", n, Swig_cresult_name(), f, actioncode))) { Replaceall(tm, "$source", Swig_cresult_name()); Replaceall(tm, "$target", "resultobj"); Replaceall(tm, "$result", "resultobj"); if (GetFlag(n, "feature:new")) { Replaceall(tm, "$owner", "1"); } else { Replaceall(tm, "$owner", "0"); } Printf(f->code, "%s", tm); if (have_argout) Printf(f->code, "\nSWIG_APPEND_VALUE(resultobj);\n"); } else { Swig_warning(WARN_TYPEMAP_OUT_UNDEF, input_file, line_number, "Unable to use return type %s in function %s.\n", SwigType_str(d, 0), name); } emit_return_variable(n, d, f); /* Insert the argument output code */ Printv(f->code, argout, NIL); /* Output cleanup code */ Printv(f->code, cleanup, NIL); /* Look to see if there is any newfree cleanup code */ if (GetFlag(n, "feature:new")) { if ((tm = Swig_typemap_lookup("newfree", n, Swig_cresult_name(), 0))) { Replaceall(tm, "$source", Swig_cresult_name()); Printf(f->code, "%s\n", tm); } } /* See if there is any return cleanup code */ if ((tm = Swig_typemap_lookup("ret", n, Swig_cresult_name(), 0))) { Replaceall(tm, "$source", Swig_cresult_name()); Printf(f->code, "%s\n", tm); } if (have_argout) { Printf(f->code, "C_kontinue(continuation,C_SCHEME_END_OF_LIST);\n"); } else { if (exporting_constructor && clos && hide_primitive) { /* Don't return a proxy, the wrapped CLOS class is the proxy */ Printf(f->code, "C_kontinue(continuation,resultobj);\n"); } else { // make the continuation the proxy creation function, if one exists Printv(f->code, "{\n", "C_word func;\n", "SWIG_Chicken_FindCreateProxy(func, resultobj)\n", "if (C_swig_is_closurep(func))\n", " ((C_proc4)(void *)C_block_item(func, 0))(4,func,continuation,resultobj,C_SCHEME_FALSE);\n", "else\n", " C_kontinue(continuation, resultobj);\n", "}\n", NIL); } } /* Error handling code */ #ifdef USE_FAIL Printf(f->code, "fail:\n"); Printv(f->code, cleanup, NIL); Printf(f->code, "swig_panic (\"failure in " "'$symname' SWIG function wrapper\");\n"); #endif Printf(f->code, "}\n"); /* Substitute the cleanup code */ Replaceall(f->code, "$cleanup", cleanup); /* Substitute the function name */ Replaceall(f->code, "$symname", iname); Replaceall(f->code, "$result", "resultobj"); /* Dump the function out */ Printv(f_wrappers, "static ", declfunc, " C_noret;\n", NIL); Wrapper_print(f, f_wrappers); /* Now register the function with the interpreter. */ if (!Getattr(n, "sym:overloaded")) { if (exporting_destructor && !no_collection) { Printf(f_init, "((swig_chicken_clientdata *)(SWIGTYPE%s->clientdata))->destroy = (swig_chicken_destructor) %s;\n", swigtype_ptr, wname); } else { addMethod(scmname, wname); } /* Only export if we are not in a class, or if in a class memberfunction */ if (!in_class || member_name) { String *method_def; String *clos_name; if (in_class) clos_name = NewString(member_name); else clos_name = chickenNameMapping(scmname, ""); if (!any_specialized_arg) { method_def = NewString(""); Printv(method_def, "(define ", clos_name, " ", chickenPrimitiveName(scmname), ")", NIL); } else { method_def = buildClosFunctionCall(function_arg_types, clos_name, chickenPrimitiveName(scmname)); } Printv(clos_methods, method_def, "\n", NIL); Delete(clos_name); Delete(method_def); } if (have_constructor && !has_constructor_args && any_specialized_arg) { has_constructor_args = 1; constructor_arg_types = Copy(function_arg_types); } } else { /* add function_arg_types to overload hash */ List *flist = Getattr(overload_parameter_lists, scmname); if (!flist) { flist = NewList(); Setattr(overload_parameter_lists, scmname, flist); } Append(flist, Copy(function_arg_types)); if (!Getattr(n, "sym:nextSibling")) { dispatchFunction(n); } } Delete(wname); Delete(get_pointers); Delete(cleanup); Delete(declfunc); Delete(mangle); Delete(function_arg_types); DelWrapper(f); return SWIG_OK; } int CHICKEN::variableWrapper(Node *n) { char *name = GetChar(n, "name"); char *iname = GetChar(n, "sym:name"); SwigType *t = Getattr(n, "type"); ParmList *l = Getattr(n, "parms"); String *wname = NewString(""); String *mangle = NewString(""); String *tm; String *tm2 = NewString(""); String *argnum = NewString("0"); String *arg = NewString("argv[0]"); Wrapper *f; String *overname = 0; String *scmname; scmname = NewString(iname); Replaceall(scmname, "_", "-"); Printf(mangle, "\"%s\"", SwigType_manglestr(t)); if (Getattr(n, "sym:overloaded")) { overname = Getattr(n, "sym:overname"); } else { if (!addSymbol(iname, n)) return SWIG_ERROR; } f = NewWrapper(); /* Attach the standard typemaps */ emit_attach_parmmaps(l, f); Setattr(n, "wrap:parms", l); // evaluation function names Append(wname, Swig_name_wrapper(iname)); if (overname) { Append(wname, overname); } Setattr(n, "wrap:name", wname); // Check for interrupts Printv(f->code, "C_trace(\"", scmname, "\");\n", NIL); if (1 || (SwigType_type(t) != T_USER) || (isPointer(t))) { Printv(f->def, "static ", "void ", wname, "(C_word, C_word, C_word, C_word) C_noret;\n", NIL); Printv(f->def, "static " "void ", wname, "(C_word argc, C_word closure, " "C_word continuation, C_word value) {\n", NIL); Wrapper_add_local(f, "resultobj", "C_word resultobj"); Printf(f->code, "if (argc!=2 && argc!=3) C_bad_argc(argc,2);\n"); /* Check for a setting of the variable value */ if (!GetFlag(n, "feature:immutable")) { Printf(f->code, "if (argc > 2) {\n"); if ((tm = Swig_typemap_lookup("varin", n, name, 0))) { Replaceall(tm, "$source", "value"); Replaceall(tm, "$target", name); Replaceall(tm, "$input", "value"); /* Printv(f->code, tm, "\n",NIL); */ emit_action_code(n, f->code, tm); } else { Swig_warning(WARN_TYPEMAP_VARIN_UNDEF, input_file, line_number, "Unable to set variable of type %s.\n", SwigType_str(t, 0)); } Printf(f->code, "}\n"); } String *varname; if (SwigType_istemplate((char *) name)) { varname = SwigType_namestr((char *) name); } else { varname = name; } // Now return the value of the variable - regardless // of evaluating or setting. if ((tm = Swig_typemap_lookup("varout", n, name, 0))) { Replaceall(tm, "$source", varname); Replaceall(tm, "$varname", varname); Replaceall(tm, "$target", "resultobj"); Replaceall(tm, "$result", "resultobj"); /* Printf(f->code, "%s\n", tm); */ emit_action_code(n, f->code, tm); } else { Swig_warning(WARN_TYPEMAP_VAROUT_UNDEF, input_file, line_number, "Unable to read variable of type %s\n", SwigType_str(t, 0)); } Printv(f->code, "{\n", "C_word func;\n", "SWIG_Chicken_FindCreateProxy(func, resultobj)\n", "if (C_swig_is_closurep(func))\n", " ((C_proc4)(void *)C_block_item(func, 0))(4,func,continuation,resultobj,C_SCHEME_FALSE);\n", "else\n", " C_kontinue(continuation, resultobj);\n", "}\n", NIL); /* Error handling code */ #ifdef USE_FAIL Printf(f->code, "fail:\n"); Printf(f->code, "swig_panic (\"failure in " "'%s' SWIG wrapper\");\n", proc_name); #endif Printf(f->code, "}\n"); Wrapper_print(f, f_wrappers); /* Now register the variable with the interpreter. */ addMethod(scmname, wname); if (!in_class || member_name) { String *clos_name; if (in_class) clos_name = NewString(member_name); else clos_name = chickenNameMapping(scmname, ""); Node *class_node = classLookup(t); String *clos_code = Getattr(n, "tmap:varin:closcode"); if (class_node && clos_code && !GetFlag(n, "feature:immutable")) { Replaceall(clos_code, "$input", "(car lst)"); Printv(clos_methods, "(define (", clos_name, " . lst) (if (null? lst) (", chickenPrimitiveName(scmname), ") (", chickenPrimitiveName(scmname), " ", clos_code, ")))\n", NIL); } else { /* Simply re-export the procedure */ if (GetFlag(n, "feature:immutable") && GetFlag(n, "feature:constasvar")) { Printv(clos_methods, "(define ", clos_name, " (", chickenPrimitiveName(scmname), "))\n", NIL); Printv(scm_const_defs, "(set! ", scmname, " (", scmname, "))\n", NIL); } else { Printv(clos_methods, "(define ", clos_name, " ", chickenPrimitiveName(scmname), ")\n", NIL); } } Delete(clos_name); } } else { Swig_warning(WARN_TYPEMAP_VAR_UNDEF, input_file, line_number, "Unsupported variable type %s (ignored).\n", SwigType_str(t, 0)); } Delete(wname); Delete(argnum); Delete(arg); Delete(tm2); Delete(mangle); DelWrapper(f); return SWIG_OK; } /* ------------------------------------------------------------ * constantWrapper() * ------------------------------------------------------------ */ int CHICKEN::constantWrapper(Node *n) { char *name = GetChar(n, "name"); char *iname = GetChar(n, "sym:name"); SwigType *t = Getattr(n, "type"); ParmList *l = Getattr(n, "parms"); String *value = Getattr(n, "value"); String *proc_name = NewString(""); String *wname = NewString(""); String *mangle = NewString(""); String *tm; String *tm2 = NewString(""); String *source = NewString(""); String *argnum = NewString("0"); String *arg = NewString("argv[0]"); Wrapper *f; String *overname = 0; String *scmname; String *rvalue; SwigType *nctype; scmname = NewString(iname); Replaceall(scmname, "_", "-"); Printf(source, "swig_const_%s", iname); Replaceall(source, "::", "__"); Printf(mangle, "\"%s\"", SwigType_manglestr(t)); if (Getattr(n, "sym:overloaded")) { overname = Getattr(n, "sym:overname"); } else { if (!addSymbol(iname, n)) return SWIG_ERROR; } Append(wname, Swig_name_wrapper(iname)); if (overname) { Append(wname, overname); } nctype = NewString(t); if (SwigType_isconst(nctype)) { Delete(SwigType_pop(nctype)); } bool is_enum_item = (Cmp(nodeType(n), "enumitem") == 0); if (SwigType_type(nctype) == T_STRING) { rvalue = NewStringf("\"%s\"", value); } else if (SwigType_type(nctype) == T_CHAR && !is_enum_item) { rvalue = NewStringf("\'%s\'", value); } else { rvalue = NewString(value); } /* Special hook for member pointer */ if (SwigType_type(t) == T_MPOINTER) { Printf(f_header, "static %s = %s;\n", SwigType_str(t, source), rvalue); } else { if ((tm = Swig_typemap_lookup("constcode", n, name, 0))) { Replaceall(tm, "$source", rvalue); Replaceall(tm, "$target", source); Replaceall(tm, "$result", source); Replaceall(tm, "$value", rvalue); Printf(f_header, "%s\n", tm); } else { Swig_warning(WARN_TYPEMAP_CONST_UNDEF, input_file, line_number, "Unsupported constant value.\n"); return SWIG_NOWRAP; } } f = NewWrapper(); /* Attach the standard typemaps */ emit_attach_parmmaps(l, f); Setattr(n, "wrap:parms", l); // evaluation function names // Check for interrupts Printv(f->code, "C_trace(\"", scmname, "\");\n", NIL); if (1 || (SwigType_type(t) != T_USER) || (isPointer(t))) { Setattr(n, "wrap:name", wname); Printv(f->def, "static ", "void ", wname, "(C_word, C_word, C_word) C_noret;\n", NIL); Printv(f->def, "static ", "void ", wname, "(C_word argc, C_word closure, " "C_word continuation) {\n", NIL); Wrapper_add_local(f, "resultobj", "C_word resultobj"); Printf(f->code, "if (argc!=2) C_bad_argc(argc,2);\n"); // Return the value of the variable if ((tm = Swig_typemap_lookup("varout", n, name, 0))) { Replaceall(tm, "$source", source); Replaceall(tm, "$varname", source); Replaceall(tm, "$target", "resultobj"); Replaceall(tm, "$result", "resultobj"); /* Printf(f->code, "%s\n", tm); */ emit_action_code(n, f->code, tm); } else { Swig_warning(WARN_TYPEMAP_VAROUT_UNDEF, input_file, line_number, "Unable to read variable of type %s\n", SwigType_str(t, 0)); } Printv(f->code, "{\n", "C_word func;\n", "SWIG_Chicken_FindCreateProxy(func, resultobj)\n", "if (C_swig_is_closurep(func))\n", " ((C_proc4)(void *)C_block_item(func, 0))(4,func,continuation,resultobj,C_SCHEME_FALSE);\n", "else\n", " C_kontinue(continuation, resultobj);\n", "}\n", NIL); /* Error handling code */ #ifdef USE_FAIL Printf(f->code, "fail:\n"); Printf(f->code, "swig_panic (\"failure in " "'%s' SWIG wrapper\");\n", proc_name); #endif Printf(f->code, "}\n"); Wrapper_print(f, f_wrappers); /* Now register the variable with the interpreter. */ addMethod(scmname, wname); if (!in_class || member_name) { String *clos_name; if (in_class) clos_name = NewString(member_name); else clos_name = chickenNameMapping(scmname, ""); if (GetFlag(n, "feature:constasvar")) { Printv(clos_methods, "(define ", clos_name, " (", chickenPrimitiveName(scmname), "))\n", NIL); Printv(scm_const_defs, "(set! ", scmname, " (", scmname, "))\n", NIL); } else { Printv(clos_methods, "(define ", clos_name, " ", chickenPrimitiveName(scmname), ")\n", NIL); } Delete(clos_name); } } else { Swig_warning(WARN_TYPEMAP_VAR_UNDEF, input_file, line_number, "Unsupported variable type %s (ignored).\n", SwigType_str(t, 0)); } Delete(wname); Delete(nctype); Delete(proc_name); Delete(argnum); Delete(arg); Delete(tm2); Delete(mangle); Delete(source); Delete(rvalue); DelWrapper(f); return SWIG_OK; } int CHICKEN::classHandler(Node *n) { /* Create new strings for building up a wrapper function */ have_constructor = 0; constructor_dispatch = 0; constructor_name = 0; c_class_name = NewString(Getattr(n, "sym:name")); class_name = NewString(""); short_class_name = NewString(""); Printv(class_name, "<", c_class_name, ">", NIL); Printv(short_class_name, c_class_name, NIL); Replaceall(class_name, "_", "-"); Replaceall(short_class_name, "_", "-"); if (!addSymbol(class_name, n)) return SWIG_ERROR; /* Handle inheritance */ String *base_class = NewString(""); List *baselist = Getattr(n, "bases"); if (baselist && Len(baselist)) { Iterator base = First(baselist); while (base.item) { if (!Getattr(base.item, "feature:ignore")) Printv(base_class, "<", Getattr(base.item, "sym:name"), "> ", NIL); base = Next(base); } } Replaceall(base_class, "_", "-"); String *scmmod = NewString(module); Replaceall(scmmod, "_", "-"); Printv(clos_class_defines, "(define ", class_name, "\n", " (make 'name \"", short_class_name, "\"\n", NIL); Delete(scmmod); if (Len(base_class)) { Printv(clos_class_defines, " 'direct-supers (list ", base_class, ")\n", NIL); } else { Printv(clos_class_defines, " 'direct-supers (list )\n", NIL); } Printf(clos_class_defines, " 'direct-slots (list 'swig-this\n"); String *mangled_classname = Swig_name_mangle(Getattr(n, "sym:name")); SwigType *ct = NewStringf("p.%s", Getattr(n, "name")); swigtype_ptr = SwigType_manglestr(ct); Printf(f_runtime, "static swig_chicken_clientdata _swig_chicken_clientdata%s = { 0 };\n", mangled_classname); Printv(f_init, "SWIG_TypeClientData(SWIGTYPE", swigtype_ptr, ", (void *) &_swig_chicken_clientdata", mangled_classname, ");\n", NIL); SwigType_remember(ct); /* Emit all of the members */ in_class = 1; Language::classHandler(n); in_class = 0; Printf(clos_class_defines, ")))\n\n"); if (have_constructor) { Printv(clos_methods, "(define-method (initialize (obj ", class_name, ") initargs)\n", " (swig-initialize obj initargs ", NIL); if (constructor_arg_types) { String *initfunc_name = NewStringf("%s@@SWIG@initmethod", class_name); String *func_call = buildClosFunctionCall(constructor_arg_types, initfunc_name, chickenPrimitiveName(constructor_name)); Printf(clos_methods, "%s)\n)\n", initfunc_name); Printf(clos_methods, "(declare (hide %s))\n", initfunc_name); Printf(clos_methods, "%s\n", func_call); Delete(func_call); Delete(initfunc_name); Delete(constructor_arg_types); constructor_arg_types = 0; } else if (constructor_dispatch) { Printf(clos_methods, "%s)\n)\n", constructor_dispatch); Delete(constructor_dispatch); constructor_dispatch = 0; } else { Printf(clos_methods, "%s)\n)\n", chickenPrimitiveName(constructor_name)); } Delete(constructor_name); constructor_name = 0; } else { Printv(clos_methods, "(define-method (initialize (obj ", class_name, ") initargs)\n", " (swig-initialize obj initargs (lambda x #f)))\n", NIL); } /* export class initialization function */ if (clos) { String *funcname = NewString(mangled_classname); Printf(funcname, "_swig_chicken_setclosclass"); String *closfuncname = NewString(funcname); Replaceall(closfuncname, "_", "-"); Printv(f_wrappers, "static void ", funcname, "(C_word,C_word,C_word,C_word) C_noret;\n", "static void ", funcname, "(C_word argc, C_word closure, C_word continuation, C_word cl) {\n", " C_trace(\"", funcname, "\");\n", " if (argc!=3) C_bad_argc(argc,3);\n", " swig_chicken_clientdata *cdata = (swig_chicken_clientdata *) SWIGTYPE", swigtype_ptr, "->clientdata;\n", " cdata->gc_proxy_create = CHICKEN_new_gc_root();\n", " CHICKEN_gc_root_set(cdata->gc_proxy_create, cl);\n", " C_kontinue(continuation, C_SCHEME_UNDEFINED);\n", "}\n", NIL); addMethod(closfuncname, funcname); Printv(clos_methods, "(", chickenPrimitiveName(closfuncname), " (lambda (x lst) (if lst ", "(cons (make ", class_name, " 'swig-this x) lst) ", "(make ", class_name, " 'swig-this x))))\n\n", NIL); Delete(closfuncname); Delete(funcname); } Delete(mangled_classname); Delete(swigtype_ptr); swigtype_ptr = 0; Delete(class_name); Delete(short_class_name); Delete(c_class_name); class_name = 0; short_class_name = 0; c_class_name = 0; return SWIG_OK; } int CHICKEN::memberfunctionHandler(Node *n) { String *iname = Getattr(n, "sym:name"); String *proc = NewString(iname); Replaceall(proc, "_", "-"); member_name = chickenNameMapping(proc, short_class_name); Language::memberfunctionHandler(n); Delete(member_name); member_name = NULL; Delete(proc); return SWIG_OK; } int CHICKEN::staticmemberfunctionHandler(Node *n) { String *iname = Getattr(n, "sym:name"); String *proc = NewString(iname); Replaceall(proc, "_", "-"); member_name = NewStringf("%s-%s", short_class_name, proc); Language::staticmemberfunctionHandler(n); Delete(member_name); member_name = NULL; Delete(proc); return SWIG_OK; } int CHICKEN::membervariableHandler(Node *n) { String *iname = Getattr(n, "sym:name"); //String *pb = SwigType_typedef_resolve_all(SwigType_base(Getattr(n, "type"))); Language::membervariableHandler(n); String *proc = NewString(iname); Replaceall(proc, "_", "-"); //Node *class_node = Swig_symbol_clookup(pb, Getattr(n, "sym:symtab")); Node *class_node = classLookup(Getattr(n, "type")); //String *getfunc = NewStringf("%s-%s-get", short_class_name, proc); //String *setfunc = NewStringf("%s-%s-set", short_class_name, proc); String *getfunc = Swig_name_get(NSPACE_TODO, Swig_name_member(NSPACE_TODO, c_class_name, iname)); Replaceall(getfunc, "_", "-"); String *setfunc = Swig_name_set(NSPACE_TODO, Swig_name_member(NSPACE_TODO, c_class_name, iname)); Replaceall(setfunc, "_", "-"); Printv(clos_class_defines, " (list '", proc, " ':swig-virtual ':swig-get ", chickenPrimitiveName(getfunc), NIL); if (!GetFlag(n, "feature:immutable")) { if (class_node) { Printv(clos_class_defines, " ':swig-set (lambda (x y) (", chickenPrimitiveName(setfunc), " x (slot-ref y 'swig-this))))\n", NIL); } else { Printv(clos_class_defines, " ':swig-set ", chickenPrimitiveName(setfunc), ")\n", NIL); } } else { Printf(clos_class_defines, ")\n"); } Delete(proc); Delete(setfunc); Delete(getfunc); return SWIG_OK; } int CHICKEN::staticmembervariableHandler(Node *n) { String *iname = Getattr(n, "sym:name"); String *proc = NewString(iname); Replaceall(proc, "_", "-"); member_name = NewStringf("%s-%s", short_class_name, proc); Language::staticmembervariableHandler(n); Delete(member_name); member_name = NULL; Delete(proc); return SWIG_OK; } int CHICKEN::constructorHandler(Node *n) { have_constructor = 1; has_constructor_args = 0; exporting_constructor = true; Language::constructorHandler(n); exporting_constructor = false; has_constructor_args = 1; String *iname = Getattr(n, "sym:name"); constructor_name = Swig_name_construct(NSPACE_TODO, iname); Replaceall(constructor_name, "_", "-"); return SWIG_OK; } int CHICKEN::destructorHandler(Node *n) { if (no_collection) member_name = NewStringf("delete-%s", short_class_name); exporting_destructor = true; Language::destructorHandler(n); exporting_destructor = false; if (no_collection) { Delete(member_name); member_name = NULL; } return SWIG_OK; } int CHICKEN::importDirective(Node *n) { String *modname = Getattr(n, "module"); if (modname && clos_uses) { // Find the module node for this imported module. It should be the // first child but search just in case. Node *mod = firstChild(n); while (mod && Strcmp(nodeType(mod), "module") != 0) mod = nextSibling(mod); if (mod) { String *name = Getattr(mod, "name"); if (name) { Printf(closprefix, "(declare (uses %s))\n", name); } } } return Language::importDirective(n); } String *CHICKEN::buildClosFunctionCall(List *types, const_String_or_char_ptr closname, const_String_or_char_ptr funcname) { String *method_signature = NewString(""); String *func_args = NewString(""); String *func_call = NewString(""); Iterator arg_type; int arg_count = 0; int optional_arguments = 0; for (arg_type = First(types); arg_type.item; arg_type = Next(arg_type)) { if (Strcmp(arg_type.item, "^^##optional$$") == 0) { optional_arguments = 1; } else { Printf(method_signature, " (arg%i %s)", arg_count, arg_type.item); arg_type = Next(arg_type); if (!arg_type.item) break; String *arg = NewStringf("arg%i", arg_count); String *access_arg = Copy(arg_type.item); Replaceall(access_arg, "$input", arg); Printf(func_args, " %s", access_arg); Delete(arg); Delete(access_arg); } arg_count++; } if (optional_arguments) { Printf(func_call, "(define-method (%s %s . args) (apply %s %s args))", closname, method_signature, funcname, func_args); } else { Printf(func_call, "(define-method (%s %s) (%s %s))", closname, method_signature, funcname, func_args); } Delete(method_signature); Delete(func_args); return func_call; } extern "C" { /* compares based on non-primitive names */ static int compareTypeListsHelper(const DOH *a, const DOH *b, int opt_equal) { List *la = (List *) a; List *lb = (List *) b; Iterator ia = First(la); Iterator ib = First(lb); while (ia.item && ib.item) { int ret = Strcmp(ia.item, ib.item); if (ret) return ret; ia = Next(Next(ia)); ib = Next(Next(ib)); } if (opt_equal && ia.item && Strcmp(ia.item, "^^##optional$$") == 0) return 0; if (ia.item) return -1; if (opt_equal && ib.item && Strcmp(ib.item, "^^##optional$$") == 0) return 0; if (ib.item) return 1; return 0; } static int compareTypeLists(const DOH *a, const DOH *b) { return compareTypeListsHelper(a, b, 0); } } void CHICKEN::dispatchFunction(Node *n) { /* Last node in overloaded chain */ int maxargs; String *tmp = NewString(""); String *dispatch = Swig_overload_dispatch(n, "%s (2+$numargs,closure," "continuation$commaargs);", &maxargs); /* Generate a dispatch wrapper for all overloaded functions */ Wrapper *f = NewWrapper(); String *iname = Getattr(n, "sym:name"); String *wname = NewString(""); String *scmname = NewString(iname); Replaceall(scmname, "_", "-"); Append(wname, Swig_name_wrapper(iname)); Printv(f->def, "static void real_", wname, "(C_word, C_word, C_word, C_word) C_noret;\n", NIL); Printv(f->def, "static void real_", wname, "(C_word oldargc, C_word closure, C_word continuation, C_word args) {", NIL); Wrapper_add_local(f, "argc", "int argc"); Printf(tmp, "C_word argv[%d]", maxargs + 1); Wrapper_add_local(f, "argv", tmp); Wrapper_add_local(f, "ii", "int ii"); Wrapper_add_local(f, "t", "C_word t = args"); Printf(f->code, "if (!C_swig_is_list (args)) {\n"); Printf(f->code, " swig_barf (SWIG_BARF1_BAD_ARGUMENT_TYPE, " "\"Argument #1 must be a list of overloaded arguments\");\n"); Printf(f->code, "}\n"); Printf(f->code, "argc = C_unfix (C_i_length (args));\n"); Printf(f->code, "for (ii = 0; (ii < argc) && (ii < %d); ii++, t = C_block_item (t, 1)) {\n", maxargs); Printf(f->code, "argv[ii] = C_block_item (t, 0);\n"); Printf(f->code, "}\n"); Printv(f->code, dispatch, "\n", NIL); Printf(f->code, "swig_barf (SWIG_BARF1_BAD_ARGUMENT_TYPE," "\"No matching function for overloaded '%s'\");\n", iname); Printv(f->code, "}\n", NIL); Wrapper_print(f, f_wrappers); addMethod(scmname, wname); DelWrapper(f); f = NewWrapper(); /* varargs */ Printv(f->def, "void ", wname, "(C_word, C_word, C_word, ...) C_noret;\n", NIL); Printv(f->def, "void ", wname, "(C_word c, C_word t0, C_word t1, ...) {", NIL); Printv(f->code, "C_word t2;\n", "va_list v;\n", "C_word *a, c2 = c;\n", "C_save_rest (t1, c2, 2);\n", "a = C_alloc((c-2)*3);\n", "t2 = C_restore_rest (a, C_rest_count (0));\n", "real_", wname, " (3, t0, t1, t2);\n", NIL); Printv(f->code, "}\n", NIL); Wrapper_print(f, f_wrappers); /* Now deal with overloaded function when exporting clos */ if (clos) { List *flist = Getattr(overload_parameter_lists, scmname); if (flist) { Delattr(overload_parameter_lists, scmname); SortList(flist, compareTypeLists); String *clos_name; if (have_constructor && !has_constructor_args) { has_constructor_args = 1; constructor_dispatch = NewStringf("%s@SWIG@new@dispatch", short_class_name); clos_name = Copy(constructor_dispatch); Printf(clos_methods, "(declare (hide %s))\n", clos_name); } else if (in_class) clos_name = NewString(member_name); else clos_name = chickenNameMapping(scmname, ""); Iterator f; List *prev = 0; int all_primitive = 1; /* first check for duplicates and an empty call */ String *newlist = NewList(); for (f = First(flist); f.item; f = Next(f)) { /* check if cur is a duplicate of prev */ if (prev && compareTypeListsHelper(f.item, prev, 1) == 0) { Delete(f.item); } else { Append(newlist, f.item); prev = f.item; Iterator j; for (j = First(f.item); j.item; j = Next(j)) { if (Strcmp(j.item, "^^##optional$$") != 0 && Strcmp(j.item, "") != 0) all_primitive = 0; } } } Delete(flist); flist = newlist; if (all_primitive) { Printf(clos_methods, "(define %s %s)\n", clos_name, chickenPrimitiveName(scmname)); } else { for (f = First(flist); f.item; f = Next(f)) { /* now export clos code for argument */ String *func_call = buildClosFunctionCall(f.item, clos_name, chickenPrimitiveName(scmname)); Printf(clos_methods, "%s\n", func_call); Delete(f.item); Delete(func_call); } } Delete(clos_name); Delete(flist); } } DelWrapper(f); Delete(dispatch); Delete(tmp); Delete(wname); } int CHICKEN::isPointer(SwigType *t) { return SwigType_ispointer(SwigType_typedef_resolve_all(t)); } void CHICKEN::addMethod(String *scheme_name, String *function) { String *sym = NewString(""); if (clos) { Append(sym, "primitive:"); } Append(sym, scheme_name); /* add symbol to Chicken internal symbol table */ if (hide_primitive) { Printv(f_init, "{\n", " C_word *p0 = a;\n", " *(a++)=C_CLOSURE_TYPE|1;\n", " *(a++)=(C_word)", function, ";\n", " C_mutate(return_vec++, (C_word)p0);\n", "}\n", NIL); } else { Printf(f_sym_size, "+C_SIZEOF_INTERNED_SYMBOL(%d)", Len(sym)); Printf(f_init, "sym = C_intern (&a, %d, \"%s\");\n", Len(sym), sym); Printv(f_init, "C_mutate ((C_word*)sym+1, (*a=C_CLOSURE_TYPE|1, a[1]=(C_word)", function, ", tmp=(C_word)a, a+=2, tmp));\n", NIL); } if (hide_primitive) { Setattr(primitive_names, scheme_name, NewStringf("(vector-ref swig-init-return %i)", num_methods)); } else { Setattr(primitive_names, scheme_name, Copy(sym)); } num_methods++; Delete(sym); } String *CHICKEN::chickenPrimitiveName(String *name) { String *value = Getattr(primitive_names, name); if (value) return value; else { Swig_error(input_file, line_number, "Internal Error: attempting to reference non-existent primitive name %s\n", name); return NewString("#f"); } } int CHICKEN::validIdentifier(String *s) { char *c = Char(s); /* Check whether we have an R5RS identifier. */ /* --> * | */ /* --> | */ if (!(isalpha(*c) || (*c == '!') || (*c == '$') || (*c == '%') || (*c == '&') || (*c == '*') || (*c == '/') || (*c == ':') || (*c == '<') || (*c == '=') || (*c == '>') || (*c == '?') || (*c == '^') || (*c == '_') || (*c == '~'))) { /* --> + | - | ... */ if ((strcmp(c, "+") == 0) || strcmp(c, "-") == 0 || strcmp(c, "...") == 0) return 1; else return 0; } /* --> | | */ while (*c) { if (!(isalnum(*c) || (*c == '!') || (*c == '$') || (*c == '%') || (*c == '&') || (*c == '*') || (*c == '/') || (*c == ':') || (*c == '<') || (*c == '=') || (*c == '>') || (*c == '?') || (*c == '^') || (*c == '_') || (*c == '~') || (*c == '+') || (*c == '-') || (*c == '.') || (*c == '@'))) return 0; c++; } return 1; } /* ------------------------------------------------------------ * closNameMapping() * Maps the identifier from C++ to the CLOS based on command * line parameters and such. * If class_name = "" that means the mapping is for a function or * variable not attached to any class. * ------------------------------------------------------------ */ String *CHICKEN::chickenNameMapping(String *name, const_String_or_char_ptr class_name) { String *n = NewString(""); if (Strcmp(class_name, "") == 0) { // not part of a class, so no class name to prefix if (clossymnameprefix) { Printf(n, "%s%s", clossymnameprefix, name); } else { Printf(n, "%s", name); } } else { if (useclassprefix) { Printf(n, "%s-%s", class_name, name); } else { if (clossymnameprefix) { Printf(n, "%s%s", clossymnameprefix, name); } else { Printf(n, "%s", name); } } } return n; } String *CHICKEN::runtimeCode() { String *s = Swig_include_sys("chickenrun.swg"); if (!s) { Printf(stderr, "*** Unable to open 'chickenrun.swg'\n"); s = NewString(""); } return s; } String *CHICKEN::defaultExternalRuntimeFilename() { return NewString("swigchickenrun.h"); } swig-4.0.1/Source/Modules/perl5.cxx0000644000175000017500000024345513527063513017010 0ustar williamwilliam/* ---------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * perl5.cxx * * Perl5 language module for SWIG. * ------------------------------------------------------------------------- */ #include "swigmod.h" #include "cparse.h" #include static const char *usage = "\ Perl 5 Options (available with -perl5)\n\ -compat - Compatibility mode\n\ -const - Wrap constants as constants and not variables (implies -proxy)\n\ -nopm - Do not generate the .pm file\n\ -noproxy - Don't create proxy classes\n\ -proxy - Create proxy classes\n\ -static - Omit code related to dynamic loading\n\ \n"; static int compat = 0; static int no_pmfile = 0; static int export_all = 0; /* * pmfile * set by the -pm flag, overrides the name of the .pm file */ static String *pmfile = 0; /* * module * set by the %module directive, e.g. "Xerces". It will determine * the name of the .pm file, and the dynamic library, and the name * used by any module wanting to %import the module. */ static String *module = 0; /* * namespace_module * the fully namespace qualified name of the module. It will be used * to set the package namespace in the .pm file, as well as the name * of the initialization methods in the glue library. This will be * the same as module, above, unless the %module directive is given * the 'package' option, e.g. %module(package="Foo::Bar") "baz" */ static String *namespace_module = 0; /* * cmodule * the namespace of the internal glue code, set to the value of * module with a 'c' appended */ static String *cmodule = 0; /* * dest_package * an optional namespace to put all classes into. Specified by using * the %module(package="Foo::Bar") "baz" syntax */ static String *dest_package = 0; static String *command_tab = 0; static String *constant_tab = 0; static String *variable_tab = 0; static File *f_begin = 0; static File *f_runtime = 0; static File *f_runtime_h = 0; static File *f_header = 0; static File *f_wrappers = 0; static File *f_directors = 0; static File *f_directors_h = 0; static File *f_init = 0; static File *f_pm = 0; static String *pm; /* Package initialization code */ static String *magic; /* Magic variable wrappers */ static int staticoption = 0; // controlling verbose output static int verbose = 0; /* The following variables are used to manage Perl5 classes */ static int blessed = 1; /* Enable object oriented features */ static int do_constants = 0; /* Constant wrapping */ static List *classlist = 0; /* List of classes */ static int have_constructor = 0; static int have_destructor = 0; static int have_data_members = 0; static String *class_name = 0; /* Name of the class (what Perl thinks it is) */ static String *real_classname = 0; /* Real name of C/C++ class */ static String *fullclassname = 0; static String *pcode = 0; /* Perl code associated with each class */ /* static String *blessedmembers = 0; *//* Member data associated with each class */ static int member_func = 0; /* Set to 1 when wrapping a member function */ static String *func_stubs = 0; /* Function stubs */ static String *const_stubs = 0; /* Constant stubs */ static int num_consts = 0; /* Number of constants */ static String *var_stubs = 0; /* Variable stubs */ static String *exported = 0; /* Exported symbols */ static String *pragma_include = 0; static String *additional_perl_code = 0; /* Additional Perl code from %perlcode %{ ... %} */ static Hash *operators = 0; static int have_operators = 0; class PERL5:public Language { public: PERL5():Language () { Clear(argc_template_string); Printv(argc_template_string, "items", NIL); Clear(argv_template_string); Printv(argv_template_string, "ST(%d)", NIL); director_language = 1; } /* Test to see if a type corresponds to something wrapped with a shadow class */ Node *is_shadow(SwigType *t) { Node *n; n = classLookup(t); /* Printf(stdout,"'%s' --> '%p'\n", t, n); */ if (n) { if (!Getattr(n, "perl5:proxy")) { setclassname(n); } return Getattr(n, "perl5:proxy"); } return 0; } /* ------------------------------------------------------------ * main() * ------------------------------------------------------------ */ virtual void main(int argc, char *argv[]) { int i = 1; SWIG_library_directory("perl5"); for (i = 1; i < argc; i++) { if (argv[i]) { if (strcmp(argv[i], "-package") == 0) { Printv(stderr, "*** -package is no longer supported\n*** use the directive '%module A::B::C' in your interface file instead\n*** see the Perl section in the manual for details.\n", NIL); SWIG_exit(EXIT_FAILURE); } else if (strcmp(argv[i], "-interface") == 0) { Printv(stderr, "*** -interface is no longer supported\n*** use the directive '%module A::B::C' in your interface file instead\n*** see the Perl section in the manual for details.\n", NIL); SWIG_exit(EXIT_FAILURE); } else if (strcmp(argv[i], "-exportall") == 0) { export_all = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-static") == 0) { staticoption = 1; Swig_mark_arg(i); } else if ((strcmp(argv[i], "-shadow") == 0) || ((strcmp(argv[i], "-proxy") == 0))) { blessed = 1; Swig_mark_arg(i); } else if ((strcmp(argv[i], "-noproxy") == 0)) { blessed = 0; Swig_mark_arg(i); } else if (strcmp(argv[i], "-const") == 0) { do_constants = 1; blessed = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-nopm") == 0) { no_pmfile = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-pm") == 0) { Swig_mark_arg(i); i++; pmfile = NewString(argv[i]); Swig_mark_arg(i); } else if (strcmp(argv[i],"-v") == 0) { Swig_mark_arg(i); verbose++; } else if (strcmp(argv[i], "-compat") == 0) { compat = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-help") == 0) { fputs(usage, stdout); } else if (strcmp(argv[i], "-cppcast") == 0) { Printf(stderr, "Deprecated command line option: %s. This option is now always on.\n", argv[i]); Swig_mark_arg(i); } else if (strcmp(argv[i], "-nocppcast") == 0) { Printf(stderr, "Deprecated command line option: %s. This option is no longer supported.\n", argv[i]); Swig_mark_arg(i); SWIG_exit(EXIT_FAILURE); } } } Preprocessor_define("SWIGPERL 1", 0); // SWIGPERL5 is deprecated, and no longer documented. Preprocessor_define("SWIGPERL5 1", 0); SWIG_typemap_lang("perl5"); SWIG_config_file("perl5.swg"); allow_overloading(); } /* ------------------------------------------------------------ * top() * ------------------------------------------------------------ */ virtual int top(Node *n) { /* check if directors are enabled for this module. note: this * is a "master" switch, without which no director code will be * emitted. %feature("director") statements are also required * to enable directors for individual classes or methods. * * use %module(directors="1") modulename at the start of the * interface file to enable director generation. * * TODO: directors are disallowed in conjunction with many command * line options. Some of them are probably safe, but it will take * some effort to validate each one. */ { Node *mod = Getattr(n, "module"); if (mod) { Node *options = Getattr(mod, "options"); if (options) { int dirprot = 0; if (Getattr(options, "dirprot")) dirprot = 1; if (Getattr(options, "nodirprot")) dirprot = 0; if (Getattr(options, "directors")) { int allow = 1; if (export_all) { Printv(stderr, "*** directors are not supported with -exportall\n", NIL); allow = 0; } if (staticoption) { Printv(stderr, "*** directors are not supported with -static\n", NIL); allow = 0; } if (!blessed) { Printv(stderr, "*** directors are not supported with -noproxy\n", NIL); allow = 0; } if (no_pmfile) { Printv(stderr, "*** directors are not supported with -nopm\n", NIL); allow = 0; } if (compat) { Printv(stderr, "*** directors are not supported with -compat\n", NIL); allow = 0; } if (allow) { allow_directors(); if (dirprot) allow_dirprot(); } } } } } /* Initialize all of the output files */ String *outfile = Getattr(n, "outfile"); String *outfile_h = Getattr(n, "outfile_h"); f_begin = NewFile(outfile, "w", SWIG_output_files()); if (!f_begin) { FileErrorDisplay(outfile); SWIG_exit(EXIT_FAILURE); } f_runtime = NewString(""); f_init = NewString(""); f_header = NewString(""); f_wrappers = NewString(""); f_directors_h = NewString(""); f_directors = NewString(""); if (directorsEnabled()) { f_runtime_h = NewFile(outfile_h, "w", SWIG_output_files()); if (!f_runtime_h) { FileErrorDisplay(outfile_h); SWIG_exit(EXIT_FAILURE); } } /* Register file targets with the SWIG file handler */ Swig_register_filebyname("header", f_header); Swig_register_filebyname("wrapper", f_wrappers); Swig_register_filebyname("begin", f_begin); Swig_register_filebyname("runtime", f_runtime); Swig_register_filebyname("init", f_init); Swig_register_filebyname("director", f_directors); Swig_register_filebyname("director_h", f_directors_h); classlist = NewList(); pm = NewString(""); func_stubs = NewString(""); var_stubs = NewString(""); const_stubs = NewString(""); exported = NewString(""); magic = NewString(""); pragma_include = NewString(""); additional_perl_code = NewString(""); command_tab = NewString("static swig_command_info swig_commands[] = {\n"); constant_tab = NewString("static swig_constant_info swig_constants[] = {\n"); variable_tab = NewString("static swig_variable_info swig_variables[] = {\n"); Swig_banner(f_begin); Printf(f_runtime, "\n\n#ifndef SWIGPERL\n#define SWIGPERL\n#endif\n\n"); if (directorsEnabled()) { Printf(f_runtime, "#define SWIG_DIRECTORS\n"); } Printf(f_runtime, "#define SWIG_CASTRANK_MODE\n"); Printf(f_runtime, "\n"); // Is the imported module in another package? (IOW, does it use the // %module(package="name") option and it's different than the package // of this module.) Node *mod = Getattr(n, "module"); Node *options = Getattr(mod, "options"); module = Copy(Getattr(n,"name")); String *underscore_module = Copy(module); Replaceall(underscore_module,":","_"); if (verbose > 0) { fprintf(stdout, "top: using namespace_module: %s\n", Char(namespace_module)); } if (directorsEnabled()) { Swig_banner(f_directors_h); Printf(f_directors_h, "\n"); Printf(f_directors_h, "#ifndef SWIG_%s_WRAP_H_\n", underscore_module); Printf(f_directors_h, "#define SWIG_%s_WRAP_H_\n\n", underscore_module); if (dirprot_mode()) { Printf(f_directors_h, "#include \n"); Printf(f_directors_h, "#include \n\n"); } Printf(f_directors, "\n\n"); Printf(f_directors, "/* ---------------------------------------------------\n"); Printf(f_directors, " * C++ director class methods\n"); Printf(f_directors, " * --------------------------------------------------- */\n\n"); if (outfile_h) { String *filename = Swig_file_filename(outfile_h); Printf(magic, "#include \"%s\"\n\n", filename); Delete(filename); } } if (verbose > 0) { fprintf(stdout, "top: using module: %s\n", Char(module)); } dest_package = options ? Getattr(options, "package") : 0; if (dest_package) { namespace_module = Copy(dest_package); if (verbose > 0) { fprintf(stdout, "top: Found package: %s\n",Char(dest_package)); } } else { namespace_module = Copy(module); if (verbose > 0) { fprintf(stdout, "top: No package found\n"); } } /* If we're in blessed mode, change the package name to "packagec" */ if (blessed) { cmodule = NewStringf("%sc",namespace_module); } else { cmodule = NewString(namespace_module); } /* Create a .pm file * Need to strip off any prefixes that might be found in * the module name */ if (no_pmfile) { f_pm = NewString(0); } else { if (!pmfile) { char *m = Char(module) + Len(module); while (m != Char(module)) { if (*m == ':') { m++; break; } m--; } pmfile = NewStringf("%s.pm", m); } String *filen = NewStringf("%s%s", SWIG_output_directory(), pmfile); if ((f_pm = NewFile(filen, "w", SWIG_output_files())) == 0) { FileErrorDisplay(filen); SWIG_exit(EXIT_FAILURE); } Delete(filen); filen = NULL; Swig_register_filebyname("pm", f_pm); Swig_register_filebyname("perl", f_pm); } { String *boot_name = NewStringf("boot_%s", underscore_module); Printf(f_header,"#define SWIG_init %s\n\n", boot_name); Printf(f_header,"#define SWIG_name \"%s::%s\"\n", cmodule, boot_name); Printf(f_header,"#define SWIG_prefix \"%s::\"\n", cmodule); Delete(boot_name); } Swig_banner_target_lang(f_pm, "#"); Printf(f_pm, "\n"); Printf(f_pm, "package %s;\n", module); /* * If the package option has been given we are placing our * symbols into some other packages namespace, so we do not * mess with @ISA or require for that package */ if (dest_package) { Printf(f_pm,"use base qw(DynaLoader);\n"); } else { Printf(f_pm,"use base qw(Exporter);\n"); if (!staticoption) { Printf(f_pm,"use base qw(DynaLoader);\n"); } } /* Start creating magic code */ Printv(magic, "#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n", "#ifdef PERL_OBJECT\n", "#define MAGIC_CLASS _wrap_", underscore_module, "_var::\n", "class _wrap_", underscore_module, "_var : public CPerlObj {\n", "public:\n", "#else\n", "#define MAGIC_CLASS\n", "#endif\n", "SWIGCLASS_STATIC int swig_magic_readonly(pTHX_ SV *SWIGUNUSEDPARM(sv), MAGIC *SWIGUNUSEDPARM(mg)) {\n", tab4, "MAGIC_PPERL\n", tab4, "croak(\"Value is read-only.\");\n", tab4, "return 0;\n", "}\n", NIL); Printf(f_wrappers, "#ifdef __cplusplus\nextern \"C\" {\n#endif\n"); /* emit wrappers */ Language::top(n); if (directorsEnabled()) { // Insert director runtime into the f_runtime file (make it occur before %header section) Swig_insert_file("director_common.swg", f_runtime); Swig_insert_file("director.swg", f_runtime); } String *base = NewString(""); /* Dump out variable wrappers */ Printv(magic, "\n\n#ifdef PERL_OBJECT\n", "};\n", "#endif\n", NIL); Printv(magic, "\n#ifdef __cplusplus\n}\n#endif\n", NIL); Printf(f_header, "%s\n", magic); String *type_table = NewString(""); /* Patch the type table to reflect the names used by shadow classes */ if (blessed) { Iterator cls; for (cls = First(classlist); cls.item; cls = Next(cls)) { String *pname = Getattr(cls.item, "perl5:proxy"); if (pname) { SwigType *type = Getattr(cls.item, "classtypeobj"); if (!type) continue; /* If unnamed class, no type will be found */ type = Copy(type); SwigType_add_pointer(type); String *mangled = SwigType_manglestr(type); SwigType_remember_mangleddata(mangled, NewStringf("\"%s\"", pname)); Delete(type); Delete(mangled); } } } SwigType_emit_type_table(f_runtime, type_table); Printf(f_wrappers, "%s", type_table); Delete(type_table); Printf(constant_tab, "{0,0,0,0,0,0}\n};\n"); Printv(f_wrappers, constant_tab, NIL); Printf(f_wrappers, "#ifdef __cplusplus\n}\n#endif\n"); Printf(f_init, "\t ST(0) = &PL_sv_yes;\n"); Printf(f_init, "\t XSRETURN(1);\n"); Printf(f_init, "}\n"); /* Finish off tables */ Printf(variable_tab, "{0,0,0,0}\n};\n"); Printv(f_wrappers, variable_tab, NIL); Printf(command_tab, "{0,0}\n};\n"); Printv(f_wrappers, command_tab, NIL); Printf(f_pm, "package %s;\n", cmodule); if (!staticoption) { Printf(f_pm,"bootstrap %s;\n", module); } else { Printf(f_pm,"package %s;\n", cmodule); Printf(f_pm,"boot_%s();\n", underscore_module); } Printf(f_pm, "package %s;\n", module); /* * If the package option has been given we are placing our * symbols into some other packages namespace, so we do not * mess with @EXPORT */ if (!dest_package) { Printf(f_pm,"@EXPORT = qw(%s);\n", exported); } Printf(f_pm, "%s", pragma_include); if (blessed) { /* * These methods will be duplicated if package * has been specified, so we do not output them */ if (!dest_package) { Printv(base, "\n# ---------- BASE METHODS -------------\n\n", "package ", namespace_module, ";\n\n", NIL); /* Write out the TIE method */ Printv(base, "sub TIEHASH {\n", tab4, "my ($classname,$obj) = @_;\n", tab4, "return bless $obj, $classname;\n", "}\n\n", NIL); /* Output a CLEAR method. This is just a place-holder, but by providing it we * can make declarations such as * %$u = ( x => 2, y=>3, z =>4 ); * * Where x,y,z are the members of some C/C++ object. */ Printf(base, "sub CLEAR { }\n\n"); /* Output default firstkey/nextkey methods */ Printf(base, "sub FIRSTKEY { }\n\n"); Printf(base, "sub NEXTKEY { }\n\n"); /* Output a FETCH method. This is actually common to all classes */ Printv(base, "sub FETCH {\n", tab4, "my ($self,$field) = @_;\n", tab4, "my $member_func = \"swig_${field}_get\";\n", tab4, "$self->$member_func();\n", "}\n\n", NIL); /* Output a STORE method. This is also common to all classes (might move to base class) */ Printv(base, "sub STORE {\n", tab4, "my ($self,$field,$newval) = @_;\n", tab4, "my $member_func = \"swig_${field}_set\";\n", tab4, "$self->$member_func($newval);\n", "}\n\n", NIL); /* Output a 'this' method */ Printv(base, "sub this {\n", tab4, "my $ptr = shift;\n", tab4, "return tied(%$ptr);\n", "}\n\n", NIL); Printf(f_pm, "%s", base); } /* Emit function stubs for stand-alone functions */ Printf(f_pm, "\n# ------- FUNCTION WRAPPERS --------\n\n"); Printf(f_pm, "package %s;\n\n", namespace_module); Printf(f_pm, "%s", func_stubs); /* Emit package code for different classes */ Printf(f_pm, "%s", pm); if (num_consts > 0) { /* Emit constant stubs */ Printf(f_pm, "\n# ------- CONSTANT STUBS -------\n\n"); Printf(f_pm, "package %s;\n\n", namespace_module); Printf(f_pm, "%s", const_stubs); } /* Emit variable stubs */ Printf(f_pm, "\n# ------- VARIABLE STUBS --------\n\n"); Printf(f_pm, "package %s;\n\n", namespace_module); Printf(f_pm, "%s", var_stubs); } /* Add additional Perl code at the end */ Printf(f_pm, "%s", additional_perl_code); Printf(f_pm, "1;\n"); Delete(f_pm); Delete(base); Delete(dest_package); Delete(underscore_module); /* Close all of the files */ Dump(f_runtime, f_begin); Dump(f_header, f_begin); if (directorsEnabled()) { Dump(f_directors_h, f_runtime_h); Printf(f_runtime_h, "\n"); Printf(f_runtime_h, "#endif\n"); Dump(f_directors, f_begin); } Dump(f_wrappers, f_begin); Wrapper_pretty_print(f_init, f_begin); Delete(f_header); Delete(f_wrappers); Delete(f_init); Delete(f_directors); Delete(f_directors_h); Delete(f_runtime); Delete(f_begin); return SWIG_OK; } /* ------------------------------------------------------------ * importDirective(Node *n) * ------------------------------------------------------------ */ virtual int importDirective(Node *n) { if (blessed) { String *modname = Getattr(n, "module"); if (modname) { Printf(f_pm, "require %s;\n", modname); } } return Language::importDirective(n); } /* ------------------------------------------------------------ * functionWrapper() * ------------------------------------------------------------ */ virtual int functionWrapper(Node *n) { String *name = Getattr(n, "name"); String *iname = Getattr(n, "sym:name"); SwigType *d = Getattr(n, "type"); ParmList *l = Getattr(n, "parms"); String *overname = 0; int director_method = 0; Parm *p; int i; Wrapper *f; char source[256], temp[256]; String *tm; String *cleanup, *outarg; int num_saved = 0; int num_arguments, num_required; int varargs = 0; if (Getattr(n, "sym:overloaded")) { overname = Getattr(n, "sym:overname"); } else { if (!addSymbol(iname, n)) return SWIG_ERROR; } f = NewWrapper(); cleanup = NewString(""); outarg = NewString(""); String *wname = Swig_name_wrapper(iname); if (overname) { Append(wname, overname); } Setattr(n, "wrap:name", wname); Printv(f->def, "XS(", wname, ") {\n", "{\n", /* scope to destroy C++ objects before croaking */ NIL); emit_parameter_variables(l, f); emit_attach_parmmaps(l, f); Setattr(n, "wrap:parms", l); num_arguments = emit_num_arguments(l); num_required = emit_num_required(l); varargs = emit_isvarargs(l); Wrapper_add_local(f, "argvi", "int argvi = 0"); /* Check the number of arguments */ if (!varargs) { Printf(f->code, " if ((items < %d) || (items > %d)) {\n", num_required, num_arguments); } else { Printf(f->code, " if (items < %d) {\n", num_required); } Printf(f->code, " SWIG_croak(\"Usage: %s\");\n", usage_func(Char(iname), d, l)); Printf(f->code, "}\n"); /* Write code to extract parameters. */ for (i = 0, p = l; i < num_arguments; i++) { /* Skip ignored arguments */ while (checkAttribute(p, "tmap:in:numinputs", "0")) { p = Getattr(p, "tmap:in:next"); } SwigType *pt = Getattr(p, "type"); /* Produce string representation of source and target arguments */ sprintf(source, "ST(%d)", i); String *target = Getattr(p, "lname"); if (i >= num_required) { Printf(f->code, " if (items > %d) {\n", i); } if ((tm = Getattr(p, "tmap:in"))) { Replaceall(tm, "$target", target); Replaceall(tm, "$source", source); Replaceall(tm, "$input", source); Setattr(p, "emit:input", source); /* Save input location */ if (Getattr(p, "wrap:disown") || (Getattr(p, "tmap:in:disown"))) { Replaceall(tm, "$disown", "SWIG_POINTER_DISOWN"); } else { Replaceall(tm, "$disown", "0"); } Printf(f->code, "%s\n", tm); p = Getattr(p, "tmap:in:next"); } else { Swig_warning(WARN_TYPEMAP_IN_UNDEF, input_file, line_number, "Unable to use type %s as a function argument.\n", SwigType_str(pt, 0)); p = nextSibling(p); } if (i >= num_required) { Printf(f->code, " }\n"); } } if (varargs) { if (p && (tm = Getattr(p, "tmap:in"))) { sprintf(source, "ST(%d)", i); Replaceall(tm, "$input", source); Setattr(p, "emit:input", source); Printf(f->code, "if (items >= %d) {\n", i); Printv(f->code, tm, "\n", NIL); Printf(f->code, "}\n"); } } /* Insert constraint checking code */ for (p = l; p;) { if ((tm = Getattr(p, "tmap:check"))) { Replaceall(tm, "$target", Getattr(p, "lname")); Printv(f->code, tm, "\n", NIL); p = Getattr(p, "tmap:check:next"); } else { p = nextSibling(p); } } /* Insert cleanup code */ for (i = 0, p = l; p; i++) { if ((tm = Getattr(p, "tmap:freearg"))) { Replaceall(tm, "$source", Getattr(p, "lname")); Replaceall(tm, "$arg", Getattr(p, "emit:input")); Replaceall(tm, "$input", Getattr(p, "emit:input")); Printv(cleanup, tm, "\n", NIL); p = Getattr(p, "tmap:freearg:next"); } else { p = nextSibling(p); } } /* Insert argument output code */ num_saved = 0; for (i = 0, p = l; p; i++) { if ((tm = Getattr(p, "tmap:argout"))) { SwigType *t = Getattr(p, "type"); Replaceall(tm, "$source", Getattr(p, "lname")); Replaceall(tm, "$target", "ST(argvi)"); Replaceall(tm, "$result", "ST(argvi)"); if (is_shadow(t)) { Replaceall(tm, "$shadow", "SWIG_SHADOW"); } else { Replaceall(tm, "$shadow", "0"); } String *in = Getattr(p, "emit:input"); if (in) { sprintf(temp, "_saved[%d]", num_saved); Replaceall(tm, "$arg", temp); Replaceall(tm, "$input", temp); Printf(f->code, "_saved[%d] = %s;\n", num_saved, in); num_saved++; } Printv(outarg, tm, "\n", NIL); p = Getattr(p, "tmap:argout:next"); } else { p = nextSibling(p); } } /* If there were any saved arguments, emit a local variable for them */ if (num_saved) { sprintf(temp, "_saved[%d]", num_saved); Wrapper_add_localv(f, "_saved", "SV *", temp, NIL); } director_method = is_member_director(n) && !is_smart_pointer() && 0 != Cmp(nodeType(n), "destructor"); if (director_method) { Wrapper_add_local(f, "director", "Swig::Director *director = 0"); Append(f->code, "director = SWIG_DIRECTOR_CAST(arg1);\n"); if (dirprot_mode() && !is_public(n)) { Printf(f->code, "if (!director || !(director->swig_get_inner(\"%s\"))) {\n", name); Printf(f->code, "SWIG_exception_fail(SWIG_RuntimeError, \"accessing protected member %s\");\n", name); Append(f->code, "}\n"); } Wrapper_add_local(f, "upcall", "bool upcall = false"); Printf(f->code, "upcall = director && SvSTASH(SvRV(ST(0))) == gv_stashpv(director->swig_get_class(), 0);\n"); } /* Emit the function call */ if (director_method) { Append(f->code, "try {\n"); } /* Now write code to make the function call */ Swig_director_emit_dynamic_cast(n, f); String *actioncode = emit_action(n); if (director_method) { Append(actioncode, "} catch (Swig::DirectorException& swig_err) {\n"); Append(actioncode, " sv_setsv(ERRSV, swig_err.getNative());\n"); Append(actioncode, " SWIG_fail;\n"); Append(actioncode, "}\n"); } if ((tm = Swig_typemap_lookup_out("out", n, Swig_cresult_name(), f, actioncode))) { SwigType *t = Getattr(n, "type"); Replaceall(tm, "$source", Swig_cresult_name()); Replaceall(tm, "$target", "ST(argvi)"); Replaceall(tm, "$result", "ST(argvi)"); if (is_shadow(t)) { Replaceall(tm, "$shadow", "SWIG_SHADOW"); } else { Replaceall(tm, "$shadow", "0"); } if (GetFlag(n, "feature:new")) { Replaceall(tm, "$owner", "SWIG_OWNER"); } else { Replaceall(tm, "$owner", "0"); } Printf(f->code, "%s\n", tm); } else { Swig_warning(WARN_TYPEMAP_OUT_UNDEF, input_file, line_number, "Unable to use return type %s in function %s.\n", SwigType_str(d, 0), name); } emit_return_variable(n, d, f); /* If there were any output args, take care of them. */ Printv(f->code, outarg, NIL); /* If there was any cleanup, do that. */ Printv(f->code, cleanup, NIL); if (GetFlag(n, "feature:new")) { if ((tm = Swig_typemap_lookup("newfree", n, Swig_cresult_name(), 0))) { Replaceall(tm, "$source", Swig_cresult_name()); Printf(f->code, "%s\n", tm); } } if ((tm = Swig_typemap_lookup("ret", n, Swig_cresult_name(), 0))) { Replaceall(tm, "$source", Swig_cresult_name()); Printf(f->code, "%s\n", tm); } if (director_method) { if ((tm = Swig_typemap_lookup("directorfree", n, Swig_cresult_name(), 0))) { Replaceall(tm, "$input", Swig_cresult_name()); Replaceall(tm, "$result", "ST(argvi)"); Printf(f->code, "%s\n", tm); Delete(tm); } } Printv(f->code, "XSRETURN(argvi);\n", "fail:\n", cleanup, "SWIG_croak_null();\n" "}\n" "}\n", NIL); /* Add the dXSARGS last */ Wrapper_add_local(f, "dXSARGS", "dXSARGS"); /* Substitute the cleanup code */ Replaceall(f->code, "$cleanup", cleanup); Replaceall(f->code, "$symname", iname); /* Dump the wrapper function */ Wrapper_print(f, f_wrappers); /* Now register the function */ if (!Getattr(n, "sym:overloaded")) { Printf(command_tab, "{\"%s::%s\", %s},\n", cmodule, iname, wname); } else if (!Getattr(n, "sym:nextSibling")) { /* Generate overloaded dispatch function */ int maxargs; String *dispatch = Swig_overload_dispatch_cast(n, "PUSHMARK(MARK); SWIG_CALLXS(%s); return;", &maxargs); /* Generate a dispatch wrapper for all overloaded functions */ Wrapper *df = NewWrapper(); String *dname = Swig_name_wrapper(iname); Printv(df->def, "XS(", dname, ") {\n", NIL); Wrapper_add_local(df, "dXSARGS", "dXSARGS"); Printv(df->code, dispatch, "\n", NIL); Printf(df->code, "croak(\"No matching function for overloaded '%s'\");\n", iname); Printf(df->code, "XSRETURN(0);\n"); Printv(df->code, "}\n", NIL); Wrapper_print(df, f_wrappers); Printf(command_tab, "{\"%s::%s\", %s},\n", cmodule, iname, dname); DelWrapper(df); Delete(dispatch); Delete(dname); } if (!Getattr(n, "sym:nextSibling")) { if (export_all) { Printf(exported, "%s ", iname); } /* -------------------------------------------------------------------- * Create a stub for this function, provided it's not a member function * -------------------------------------------------------------------- */ if ((blessed) && (!member_func)) { Printv(func_stubs, "*", iname, " = *", cmodule, "::", iname, ";\n", NIL); } } Delete(cleanup); Delete(outarg); DelWrapper(f); return SWIG_OK; } /* ------------------------------------------------------------ * variableWrapper() * ------------------------------------------------------------ */ virtual int variableWrapper(Node *n) { String *name = Getattr(n, "name"); String *iname = Getattr(n, "sym:name"); SwigType *t = Getattr(n, "type"); Wrapper *getf, *setf; String *tm; String *getname = Swig_name_get(NSPACE_TODO, iname); String *setname = Swig_name_set(NSPACE_TODO, iname); String *get_name = Swig_name_wrapper(getname); String *set_name = Swig_name_wrapper(setname); if (!addSymbol(iname, n)) return SWIG_ERROR; getf = NewWrapper(); setf = NewWrapper(); /* Create a Perl function for setting the variable value */ if (!GetFlag(n, "feature:immutable")) { Setattr(n, "wrap:name", set_name); Printf(setf->def, "SWIGCLASS_STATIC int %s(pTHX_ SV* sv, MAGIC * SWIGUNUSEDPARM(mg)) {\n", set_name); Printv(setf->code, tab4, "MAGIC_PPERL\n", NIL); /* Check for a few typemaps */ tm = Swig_typemap_lookup("varin", n, name, 0); if (tm) { Replaceall(tm, "$source", "sv"); Replaceall(tm, "$target", name); Replaceall(tm, "$input", "sv"); /* Printf(setf->code,"%s\n", tm); */ emit_action_code(n, setf->code, tm); } else { Swig_warning(WARN_TYPEMAP_VARIN_UNDEF, input_file, line_number, "Unable to set variable of type %s.\n", SwigType_str(t, 0)); DelWrapper(setf); DelWrapper(getf); return SWIG_NOWRAP; } Printf(setf->code, "fail:\n"); Printf(setf->code, " return 1;\n}\n"); Replaceall(setf->code, "$symname", iname); Wrapper_print(setf, magic); } /* Now write a function to evaluate the variable */ Setattr(n, "wrap:name", get_name); int addfail = 0; Printf(getf->def, "SWIGCLASS_STATIC int %s(pTHX_ SV *sv, MAGIC *SWIGUNUSEDPARM(mg)) {\n", get_name); Printv(getf->code, tab4, "MAGIC_PPERL\n", NIL); if ((tm = Swig_typemap_lookup("varout", n, name, 0))) { Replaceall(tm, "$target", "sv"); Replaceall(tm, "$result", "sv"); Replaceall(tm, "$source", name); if (is_shadow(t)) { Replaceall(tm, "$shadow", "SWIG_SHADOW"); } else { Replaceall(tm, "$shadow", "0"); } /* Printf(getf->code,"%s\n", tm); */ addfail = emit_action_code(n, getf->code, tm); } else { Swig_warning(WARN_TYPEMAP_VAROUT_UNDEF, input_file, line_number, "Unable to read variable of type %s\n", SwigType_str(t, 0)); DelWrapper(setf); DelWrapper(getf); return SWIG_NOWRAP; } Printf(getf->code, " return 1;\n"); if (addfail) { Append(getf->code, "fail:\n"); Append(getf->code, " return 0;\n"); } Append(getf->code, "}\n"); Replaceall(getf->code, "$symname", iname); Wrapper_print(getf, magic); String *tt = Getattr(n, "tmap:varout:type"); if (tt) { tt = NewStringf("&%s", tt); } else { tt = NewString("0"); } /* Now add symbol to the PERL interpreter */ if (GetFlag(n, "feature:immutable")) { Printv(variable_tab, tab4, "{ \"", cmodule, "::", iname, "\", MAGIC_CLASS swig_magic_readonly, MAGIC_CLASS ", get_name, ",", tt, " },\n", NIL); } else { Printv(variable_tab, tab4, "{ \"", cmodule, "::", iname, "\", MAGIC_CLASS ", set_name, ", MAGIC_CLASS ", get_name, ",", tt, " },\n", NIL); } /* If we're blessed, try to figure out what to do with the variable 1. If it's a Perl object of some sort, create a tied-hash around it. 2. Otherwise, just hack Perl's symbol table */ if (blessed) { if (is_shadow(t)) { Printv(var_stubs, "\nmy %__", iname, "_hash;\n", "tie %__", iname, "_hash,\"", is_shadow(t), "\", $", cmodule, "::", iname, ";\n", "$", iname, "= \\%__", iname, "_hash;\n", "bless $", iname, ", ", is_shadow(t), ";\n", NIL); } else { Printv(var_stubs, "*", iname, " = *", cmodule, "::", iname, ";\n", NIL); } } if (export_all) Printf(exported, "$%s ", iname); Delete(tt); DelWrapper(setf); DelWrapper(getf); Delete(getname); Delete(setname); Delete(set_name); Delete(get_name); return SWIG_OK; } /* ------------------------------------------------------------ * constantWrapper() * ------------------------------------------------------------ */ virtual int constantWrapper(Node *n) { String *name = Getattr(n, "name"); String *iname = Getattr(n, "sym:name"); SwigType *type = Getattr(n, "type"); String *rawval = Getattr(n, "rawval"); String *value = rawval ? rawval : Getattr(n, "value"); String *tm; if (!addSymbol(iname, n)) return SWIG_ERROR; /* Special hook for member pointer */ if (SwigType_type(type) == T_MPOINTER) { String *wname = Swig_name_wrapper(iname); Printf(f_wrappers, "static %s = %s;\n", SwigType_str(type, wname), value); value = Char(wname); } if ((tm = Swig_typemap_lookup("consttab", n, name, 0))) { Replaceall(tm, "$source", value); Replaceall(tm, "$target", name); Replaceall(tm, "$value", value); if (is_shadow(type)) { Replaceall(tm, "$shadow", "SWIG_SHADOW"); } else { Replaceall(tm, "$shadow", "0"); } Printf(constant_tab, "%s,\n", tm); } else if ((tm = Swig_typemap_lookup("constcode", n, name, 0))) { Replaceall(tm, "$source", value); Replaceall(tm, "$target", name); Replaceall(tm, "$value", value); if (is_shadow(type)) { Replaceall(tm, "$shadow", "SWIG_SHADOW"); } else { Replaceall(tm, "$shadow", "0"); } Printf(f_init, "%s\n", tm); } else { Swig_warning(WARN_TYPEMAP_CONST_UNDEF, input_file, line_number, "Unsupported constant value.\n"); return SWIG_NOWRAP; } if (blessed) { if (is_shadow(type)) { Printv(var_stubs, "\nmy %__", iname, "_hash;\n", "tie %__", iname, "_hash,\"", is_shadow(type), "\", $", cmodule, "::", iname, ";\n", "$", iname, "= \\%__", iname, "_hash;\n", "bless $", iname, ", ", is_shadow(type), ";\n", NIL); } else if (do_constants) { Printv(const_stubs, "sub ", name, " () { $", cmodule, "::", name, " }\n", NIL); num_consts++; } else { Printv(var_stubs, "*", iname, " = *", cmodule, "::", iname, ";\n", NIL); } } if (export_all) { if (do_constants && !is_shadow(type)) { Printf(exported, "%s ", name); } else { Printf(exported, "$%s ", iname); } } return SWIG_OK; } /* ------------------------------------------------------------ * usage_func() * ------------------------------------------------------------ */ char *usage_func(char *iname, SwigType *, ParmList *l) { static String *temp = 0; Parm *p; int i; if (!temp) temp = NewString(""); Clear(temp); Printf(temp, "%s(", iname); /* Now go through and print parameters */ p = l; i = 0; while (p != 0) { SwigType *pt = Getattr(p, "type"); String *pn = Getattr(p, "name"); if (!checkAttribute(p,"tmap:in:numinputs","0")) { /* If parameter has been named, use that. Otherwise, just print a type */ if (SwigType_type(pt) != T_VOID) { if (Len(pn) > 0) { Printf(temp, "%s", pn); } else { Printf(temp, "%s", SwigType_str(pt, 0)); } } i++; p = nextSibling(p); if (p) if (!checkAttribute(p,"tmap:in:numinputs","0")) Putc(',', temp); } else { p = nextSibling(p); if (p) if ((i > 0) && (!checkAttribute(p,"tmap:in:numinputs","0"))) Putc(',', temp); } } Printf(temp, ");"); return Char(temp); } /* ------------------------------------------------------------ * nativeWrapper() * ------------------------------------------------------------ */ virtual int nativeWrapper(Node *n) { String *name = Getattr(n, "sym:name"); String *funcname = Getattr(n, "wrap:name"); if (!addSymbol(funcname, n)) return SWIG_ERROR; Printf(command_tab, "{\"%s::%s\", %s},\n", cmodule, name, funcname); if (export_all) Printf(exported, "%s ", name); if (blessed) { Printv(func_stubs, "*", name, " = *", cmodule, "::", name, ";\n", NIL); } return SWIG_OK; } /* ---------------------------------------------------------------------------- * OBJECT-ORIENTED FEATURES * * These extensions provide a more object-oriented interface to C++ * classes and structures. The code here is based on extensions * provided by David Fletcher and Gary Holt. * * I have generalized these extensions to make them more general purpose * and to resolve object-ownership problems. * * The approach here is very similar to the Python module : * 1. All of the original methods are placed into a single * package like before except that a 'c' is appended to the * package name. * * 2. All methods and function calls are wrapped with a new * perl function. While possibly inefficient this allows * us to catch complex function arguments (which are hard to * track otherwise). * * 3. Classes are represented as tied-hashes in a manner similar * to Gary Holt's extension. This allows us to access * member data. * * 4. Stand-alone (global) C functions are modified to take * tied hashes as arguments for complex datatypes (if * appropriate). * * 5. Global variables involving a class/struct is encapsulated * in a tied hash. * * ------------------------------------------------------------------------- */ void setclassname(Node *n) { String *symname = Getattr(n, "sym:name"); String *fullname; String *actualpackage; Node *clsmodule = Getattr(n, "module"); if (!clsmodule) { /* imported module does not define a module name. Oh well */ return; } /* Do some work on the class name */ if (verbose > 0) { String *modulename = Getattr(clsmodule, "name"); fprintf(stdout, "setclassname: Found sym:name: %s\n", Char(symname)); fprintf(stdout, "setclassname: Found module: %s\n", Char(modulename)); fprintf(stdout, "setclassname: No package found\n"); } if (dest_package) { fullname = NewStringf("%s::%s", namespace_module, symname); } else { actualpackage = Getattr(clsmodule,"name"); if (verbose > 0) { fprintf(stdout, "setclassname: Found actualpackage: %s\n", Char(actualpackage)); } if ((!compat) && (!Strchr(symname,':'))) { fullname = NewStringf("%s::%s",actualpackage,symname); } else { fullname = NewString(symname); } } if (verbose > 0) { fprintf(stdout, "setclassname: setting proxy: %s\n", Char(fullname)); } Setattr(n, "perl5:proxy", fullname); } /* ------------------------------------------------------------ * classDeclaration() * ------------------------------------------------------------ */ virtual int classDeclaration(Node *n) { /* Do some work on the class name */ if (!Getattr(n, "feature:onlychildren")) { if (blessed) { setclassname(n); Append(classlist, n); } } return Language::classDeclaration(n); } /* ------------------------------------------------------------ * classHandler() * ------------------------------------------------------------ */ virtual int classHandler(Node *n) { if (blessed) { have_constructor = 0; have_operators = 0; have_destructor = 0; have_data_members = 0; operators = NewHash(); class_name = Getattr(n, "sym:name"); if (!addSymbol(class_name, n)) return SWIG_ERROR; /* Use the fully qualified name of the Perl class */ if (!compat) { fullclassname = NewStringf("%s::%s", namespace_module, class_name); } else { fullclassname = NewString(class_name); } real_classname = Getattr(n, "name"); pcode = NewString(""); // blessedmembers = NewString(""); } /* Emit all of the members */ Language::classHandler(n); /* Finish the rest of the class */ if (blessed) { /* Generate a client-data entry */ SwigType *ct = NewStringf("p.%s", real_classname); Printv(f_init, "SWIG_TypeClientData(SWIGTYPE", SwigType_manglestr(ct), ", (void*) \"", fullclassname, "\");\n", NIL); SwigType_remember(ct); Delete(ct); Printv(pm, "\n############# Class : ", fullclassname, " ##############\n", "\npackage ", fullclassname, ";\n", NIL); if (have_operators) { Printf(pm, "use overload\n"); Iterator ki; for (ki = First(operators); ki.key; ki = Next(ki)) { char *name = Char(ki.key); // fprintf(stderr,"found name: <%s>\n", name); if (strstr(name, "__eq__")) { Printv(pm, tab4, "\"==\" => sub { $_[0]->__eq__($_[1])},\n",NIL); } else if (strstr(name, "__ne__")) { Printv(pm, tab4, "\"!=\" => sub { $_[0]->__ne__($_[1])},\n",NIL); // there are no tests for this in operator_overload_runme.pl // it is likely to be broken // } else if (strstr(name, "__assign__")) { // Printv(pm, tab4, "\"=\" => sub { $_[0]->__assign__($_[1])},\n",NIL); } else if (strstr(name, "__str__")) { Printv(pm, tab4, "'\"\"' => sub { $_[0]->__str__()},\n",NIL); } else if (strstr(name, "__plusplus__")) { Printv(pm, tab4, "\"++\" => sub { $_[0]->__plusplus__()},\n",NIL); } else if (strstr(name, "__minmin__")) { Printv(pm, tab4, "\"--\" => sub { $_[0]->__minmin__()},\n",NIL); } else if (strstr(name, "__add__")) { Printv(pm, tab4, "\"+\" => sub { $_[0]->__add__($_[1])},\n",NIL); } else if (strstr(name, "__sub__")) { Printv(pm, tab4, "\"-\" => sub { if( not $_[2] ) { $_[0]->__sub__($_[1]) }\n",NIL); Printv(pm, tab8, "elsif( $_[0]->can('__rsub__') ) { $_[0]->__rsub__($_[1]) }\n",NIL); Printv(pm, tab8, "else { die(\"reverse subtraction not supported\") }\n",NIL); Printv(pm, tab8, "},\n",NIL); } else if (strstr(name, "__mul__")) { Printv(pm, tab4, "\"*\" => sub { $_[0]->__mul__($_[1])},\n",NIL); } else if (strstr(name, "__div__")) { Printv(pm, tab4, "\"/\" => sub { $_[0]->__div__($_[1])},\n",NIL); } else if (strstr(name, "__mod__")) { Printv(pm, tab4, "\"%\" => sub { $_[0]->__mod__($_[1])},\n",NIL); // there are no tests for this in operator_overload_runme.pl // it is likely to be broken // } else if (strstr(name, "__and__")) { // Printv(pm, tab4, "\"&\" => sub { $_[0]->__and__($_[1])},\n",NIL); // there are no tests for this in operator_overload_runme.pl // it is likely to be broken // } else if (strstr(name, "__or__")) { // Printv(pm, tab4, "\"|\" => sub { $_[0]->__or__($_[1])},\n",NIL); } else if (strstr(name, "__gt__")) { Printv(pm, tab4, "\">\" => sub { $_[0]->__gt__($_[1])},\n",NIL); } else if (strstr(name, "__ge__")) { Printv(pm, tab4, "\">=\" => sub { $_[0]->__ge__($_[1])},\n",NIL); } else if (strstr(name, "__not__")) { Printv(pm, tab4, "\"!\" => sub { $_[0]->__not__()},\n",NIL); } else if (strstr(name, "__lt__")) { Printv(pm, tab4, "\"<\" => sub { $_[0]->__lt__($_[1])},\n",NIL); } else if (strstr(name, "__le__")) { Printv(pm, tab4, "\"<=\" => sub { $_[0]->__le__($_[1])},\n",NIL); } else if (strstr(name, "__pluseq__")) { Printv(pm, tab4, "\"+=\" => sub { $_[0]->__pluseq__($_[1])},\n",NIL); } else if (strstr(name, "__mineq__")) { Printv(pm, tab4, "\"-=\" => sub { $_[0]->__mineq__($_[1])},\n",NIL); } else if (strstr(name, "__neg__")) { Printv(pm, tab4, "\"neg\" => sub { $_[0]->__neg__()},\n",NIL); } else { fprintf(stderr,"Unknown operator: %s\n", name); } } Printv(pm, tab4, "\"=\" => sub { my $class = ref($_[0]); $class->new($_[0]) },\n", NIL); Printv(pm, tab4, "\"fallback\" => 1;\n", NIL); } // make use strict happy Printv(pm, "use vars qw(@ISA %OWNER %ITERATORS %BLESSEDMEMBERS);\n", NIL); /* If we are inheriting from a base class, set that up */ Printv(pm, "@ISA = qw(", NIL); /* Handle inheritance */ List *baselist = Getattr(n, "bases"); if (baselist && Len(baselist)) { Iterator b; b = First(baselist); while (b.item) { String *bname = Getattr(b.item, "perl5:proxy"); if (!bname) { b = Next(b); continue; } Printv(pm, " ", bname, NIL); b = Next(b); } } /* Module comes last */ if (!compat || Cmp(namespace_module, fullclassname)) { Printv(pm, " ", namespace_module, NIL); } Printf(pm, " );\n"); /* Dump out a hash table containing the pointers that we own */ Printf(pm, "%%OWNER = ();\n"); if (have_data_members || have_destructor) Printf(pm, "%%ITERATORS = ();\n"); /* Dump out the package methods */ Printv(pm, pcode, NIL); Delete(pcode); /* Output methods for managing ownership */ String *director_disown; if (Getattr(n, "perl5:directordisown")) { director_disown = NewStringf("%s%s($self);\n", tab4, Getattr(n, "perl5:directordisown")); } else { director_disown = NewString(""); } Printv(pm, "sub DISOWN {\n", tab4, "my $self = shift;\n", director_disown, tab4, "my $ptr = tied(%$self);\n", tab4, "delete $OWNER{$ptr};\n", "}\n\n", "sub ACQUIRE {\n", tab4, "my $self = shift;\n", tab4, "my $ptr = tied(%$self);\n", tab4, "$OWNER{$ptr} = 1;\n", "}\n\n", NIL); Delete(director_disown); /* Only output the following methods if a class has member data */ Delete(operators); operators = 0; if (Swig_directorclass(n)) { /* director classes need a way to recover subclass instance attributes */ Node *get_attr = NewHash(); String *mrename; String *symname = Getattr(n, "sym:name"); mrename = Swig_name_disown(NSPACE_TODO, symname); Replaceall(mrename, "disown", "swig_get_attr"); String *type = NewString(getClassType()); String *name = NewString("self"); SwigType_add_pointer(type); Parm *p = NewParm(type, name, n); Delete(name); Delete(type); type = NewString("SV"); SwigType_add_pointer(type); String *action = NewString(""); Printv(action, "{\n", " Swig::Director *director = SWIG_DIRECTOR_CAST(arg1);\n", " result = sv_newmortal();\n" " if (director) sv_setsv(result, director->swig_get_self());\n", "}\n", NIL); Setfile(get_attr, Getfile(n)); Setline(get_attr, Getline(n)); Setattr(get_attr, "wrap:action", action); Setattr(get_attr, "name", mrename); Setattr(get_attr, "sym:name", mrename); Setattr(get_attr, "type", type); Setattr(get_attr, "parms", p); Delete(action); Delete(type); Delete(p); member_func = 1; functionWrapper(get_attr); member_func = 0; Delete(get_attr); Printv(pm, "sub FETCH {\n", tab4, "my ($self,$field) = @_;\n", tab4, "my $member_func = \"swig_${field}_get\";\n", tab4, "if (not $self->can($member_func)) {\n", tab8, "my $h = ", cmodule, "::", mrename, "($self);\n", tab8, "return $h->{$field} if $h;\n", tab4, "}\n", tab4, "return $self->$member_func;\n", "}\n", "\n", "sub STORE {\n", tab4, "my ($self,$field,$newval) = @_;\n", tab4, "my $member_func = \"swig_${field}_set\";\n", tab4, "if (not $self->can($member_func)) {\n", tab8, "my $h = ", cmodule, "::", mrename, "($self);\n", tab8, "return $h->{$field} = $newval if $h;\n", tab4, "}\n", tab4, "return $self->$member_func($newval);\n", "}\n", NIL); Delete(mrename); } } return SWIG_OK; } /* ------------------------------------------------------------ * memberfunctionHandler() * ------------------------------------------------------------ */ virtual int memberfunctionHandler(Node *n) { String *symname = Getattr(n, "sym:name"); member_func = 1; Language::memberfunctionHandler(n); member_func = 0; if ((blessed) && (!Getattr(n, "sym:nextSibling"))) { if (Strstr(symname, "__eq__")) { DohSetInt(operators, "__eq__", 1); have_operators = 1; } else if (Strstr(symname, "__ne__")) { DohSetInt(operators, "__ne__", 1); have_operators = 1; } else if (Strstr(symname, "__assign__")) { DohSetInt(operators, "__assign__", 1); have_operators = 1; } else if (Strstr(symname, "__str__")) { DohSetInt(operators, "__str__", 1); have_operators = 1; } else if (Strstr(symname, "__add__")) { DohSetInt(operators, "__add__", 1); have_operators = 1; } else if (Strstr(symname, "__sub__")) { DohSetInt(operators, "__sub__", 1); have_operators = 1; } else if (Strstr(symname, "__mul__")) { DohSetInt(operators, "__mul__", 1); have_operators = 1; } else if (Strstr(symname, "__div__")) { DohSetInt(operators, "__div__", 1); have_operators = 1; } else if (Strstr(symname, "__mod__")) { DohSetInt(operators, "__mod__", 1); have_operators = 1; } else if (Strstr(symname, "__and__")) { DohSetInt(operators, "__and__", 1); have_operators = 1; } else if (Strstr(symname, "__or__")) { DohSetInt(operators, "__or__", 1); have_operators = 1; } else if (Strstr(symname, "__not__")) { DohSetInt(operators, "__not__", 1); have_operators = 1; } else if (Strstr(symname, "__gt__")) { DohSetInt(operators, "__gt__", 1); have_operators = 1; } else if (Strstr(symname, "__ge__")) { DohSetInt(operators, "__ge__", 1); have_operators = 1; } else if (Strstr(symname, "__lt__")) { DohSetInt(operators, "__lt__", 1); have_operators = 1; } else if (Strstr(symname, "__le__")) { DohSetInt(operators, "__le__", 1); have_operators = 1; } else if (Strstr(symname, "__neg__")) { DohSetInt(operators, "__neg__", 1); have_operators = 1; } else if (Strstr(symname, "__plusplus__")) { DohSetInt(operators, "__plusplus__", 1); have_operators = 1; } else if (Strstr(symname, "__minmin__")) { DohSetInt(operators, "__minmin__", 1); have_operators = 1; } else if (Strstr(symname, "__mineq__")) { DohSetInt(operators, "__mineq__", 1); have_operators = 1; } else if (Strstr(symname, "__pluseq__")) { DohSetInt(operators, "__pluseq__", 1); have_operators = 1; } if (Getattr(n, "feature:shadow")) { String *plcode = perlcode(Getattr(n, "feature:shadow"), 0); String *plaction = NewStringf("%s::%s", cmodule, Swig_name_member(NSPACE_TODO, class_name, symname)); Replaceall(plcode, "$action", plaction); Delete(plaction); Printv(pcode, plcode, NIL); } else { Printv(pcode, "*", symname, " = *", cmodule, "::", Swig_name_member(NSPACE_TODO, class_name, symname), ";\n", NIL); } } return SWIG_OK; } /* ------------------------------------------------------------ * membervariableHandler() * * Adds an instance member. * ----------------------------------------------------------------------------- */ virtual int membervariableHandler(Node *n) { String *symname = Getattr(n, "sym:name"); /* SwigType *t = Getattr(n,"type"); */ /* Emit a pair of get/set functions for the variable */ member_func = 1; Language::membervariableHandler(n); member_func = 0; if (blessed) { Printv(pcode, "*swig_", symname, "_get = *", cmodule, "::", Swig_name_get(NSPACE_TODO, Swig_name_member(NSPACE_TODO, class_name, symname)), ";\n", NIL); Printv(pcode, "*swig_", symname, "_set = *", cmodule, "::", Swig_name_set(NSPACE_TODO, Swig_name_member(NSPACE_TODO, class_name, symname)), ";\n", NIL); /* Now we need to generate a little Perl code for this */ /* if (is_shadow(t)) { *//* This is a Perl object that we have already seen. Add an entry to the members list *//* Printv(blessedmembers, tab4, symname, " => '", is_shadow(t), "',\n", NIL); } */ } have_data_members++; return SWIG_OK; } /* ------------------------------------------------------------ * constructorDeclaration() * * Emits a blessed constructor for our class. In addition to our construct * we manage a Perl hash table containing all of the pointers created by * the constructor. This prevents us from accidentally trying to free * something that wasn't necessarily allocated by malloc or new * ------------------------------------------------------------ */ virtual int constructorHandler(Node *n) { String *symname = Getattr(n, "sym:name"); member_func = 1; Swig_save("perl5:constructorHandler", n, "parms", NIL); if (Swig_directorclass(n)) { Parm *parms = Getattr(n, "parms"); Parm *self; String *name = NewString("self"); String *type = NewString("SV"); SwigType_add_pointer(type); self = NewParm(type, name, n); Delete(type); Delete(name); Setattr(self, "lname", "O"); if (parms) set_nextSibling(self, parms); Setattr(n, "parms", self); Setattr(n, "wrap:self", "1"); Setattr(n, "hidden", "1"); Delete(self); } String *saved_nc = none_comparison; none_comparison = NewStringf("strcmp(SvPV_nolen(ST(0)), \"%s::%s\") != 0", module, class_name); String *saved_director_prot_ctor_code = director_prot_ctor_code; director_prot_ctor_code = NewStringf("if ($comparison) { /* subclassed */\n" " $director_new\n" "} else {\n" "SWIG_exception_fail(SWIG_RuntimeError, \"accessing abstract class or protected constructor\");\n" "}\n"); Language::constructorHandler(n); Delete(none_comparison); none_comparison = saved_nc; Delete(director_prot_ctor_code); director_prot_ctor_code = saved_director_prot_ctor_code; Swig_restore(n); if ((blessed) && (!Getattr(n, "sym:nextSibling"))) { if (Getattr(n, "feature:shadow")) { String *plcode = perlcode(Getattr(n, "feature:shadow"), 0); String *plaction = NewStringf("%s::%s", module, Swig_name_member(NSPACE_TODO, class_name, symname)); Replaceall(plcode, "$action", plaction); Delete(plaction); Printv(pcode, plcode, NIL); } else { if ((Cmp(symname, class_name) == 0)) { /* Emit a blessed constructor */ Printf(pcode, "sub new {\n"); } else { /* Constructor doesn't match classname so we'll just use the normal name */ Printv(pcode, "sub ", Swig_name_construct(NSPACE_TODO, symname), " {\n", NIL); } const char *pkg = getCurrentClass() && Swig_directorclass(getCurrentClass())? "$_[0]" : "shift"; Printv(pcode, tab4, "my $pkg = ", pkg, ";\n", tab4, "my $self = ", cmodule, "::", Swig_name_construct(NSPACE_TODO, symname), "(@_);\n", tab4, "bless $self, $pkg if defined($self);\n", "}\n\n", NIL); have_constructor = 1; } } member_func = 0; return SWIG_OK; } /* ------------------------------------------------------------ * destructorHandler() * ------------------------------------------------------------ */ virtual int destructorHandler(Node *n) { String *symname = Getattr(n, "sym:name"); member_func = 1; Language::destructorHandler(n); if (blessed) { if (Getattr(n, "feature:shadow")) { String *plcode = perlcode(Getattr(n, "feature:shadow"), 0); String *plaction = NewStringf("%s::%s", module, Swig_name_member(NSPACE_TODO, class_name, symname)); Replaceall(plcode, "$action", plaction); Delete(plaction); Printv(pcode, plcode, NIL); } else { Printv(pcode, "sub DESTROY {\n", tab4, "return unless $_[0]->isa('HASH');\n", tab4, "my $self = tied(%{$_[0]});\n", tab4, "return unless defined $self;\n", tab4, "delete $ITERATORS{$self};\n", tab4, "if (exists $OWNER{$self}) {\n", tab8, cmodule, "::", Swig_name_destroy(NSPACE_TODO, symname), "($self);\n", tab8, "delete $OWNER{$self};\n", tab4, "}\n}\n\n", NIL); have_destructor = 1; } } member_func = 0; return SWIG_OK; } /* ------------------------------------------------------------ * staticmemberfunctionHandler() * ------------------------------------------------------------ */ virtual int staticmemberfunctionHandler(Node *n) { member_func = 1; Language::staticmemberfunctionHandler(n); member_func = 0; if ((blessed) && (!Getattr(n, "sym:nextSibling"))) { String *symname = Getattr(n, "sym:name"); Printv(pcode, "*", symname, " = *", cmodule, "::", Swig_name_member(NSPACE_TODO, class_name, symname), ";\n", NIL); } return SWIG_OK; } /* ------------------------------------------------------------ * staticmembervariableHandler() * ------------------------------------------------------------ */ virtual int staticmembervariableHandler(Node *n) { Language::staticmembervariableHandler(n); if (blessed) { String *symname = Getattr(n, "sym:name"); Printv(pcode, "*", symname, " = *", cmodule, "::", Swig_name_member(NSPACE_TODO, class_name, symname), ";\n", NIL); } return SWIG_OK; } /* ------------------------------------------------------------ * memberconstantHandler() * ------------------------------------------------------------ */ virtual int memberconstantHandler(Node *n) { String *symname = Getattr(n, "sym:name"); int oldblessed = blessed; /* Create a normal constant */ blessed = 0; Language::memberconstantHandler(n); blessed = oldblessed; if (blessed) { Printv(pcode, "*", symname, " = *", cmodule, "::", Swig_name_member(NSPACE_TODO, class_name, symname), ";\n", NIL); } return SWIG_OK; } /* ------------------------------------------------------------ * pragma() * * Pragma directive. * * %pragma(perl5) code="String" # Includes a string in the .pm file * %pragma(perl5) include="file.pl" # Includes a file in the .pm file * ------------------------------------------------------------ */ virtual int pragmaDirective(Node *n) { String *lang; String *code; String *value; if (!ImportMode) { lang = Getattr(n, "lang"); code = Getattr(n, "name"); value = Getattr(n, "value"); if (Strcmp(lang, "perl5") == 0) { if (Strcmp(code, "code") == 0) { /* Dump the value string into the .pm file */ if (value) { Printf(pragma_include, "%s\n", value); } } else if (Strcmp(code, "include") == 0) { /* Include a file into the .pm file */ if (value) { FILE *f = Swig_include_open(value); if (!f) { Swig_error(input_file, line_number, "Unable to locate file %s\n", value); } else { char buffer[4096]; while (fgets(buffer, 4095, f)) { Printf(pragma_include, "%s", buffer); } fclose(f); } } } else { Swig_error(input_file, line_number, "Unrecognized pragma.\n"); } } } return Language::pragmaDirective(n); } /* ------------------------------------------------------------ * perlcode() - Output perlcode code into the shadow file * ------------------------------------------------------------ */ String *perlcode(String *code, const String *indent) { String *out = NewString(""); String *temp; char *t; if (!indent) indent = ""; temp = NewString(code); t = Char(temp); if (*t == '{') { Delitem(temp, 0); Delitem(temp, DOH_END); } /* Split the input text into lines */ List *clist = SplitLines(temp); Delete(temp); int initial = 0; String *s = 0; Iterator si; /* Get the initial indentation */ for (si = First(clist); si.item; si = Next(si)) { s = si.item; if (Len(s)) { char *c = Char(s); while (*c) { if (!isspace(*c)) break; initial++; c++; } if (*c && !isspace(*c)) break; else { initial = 0; } } } while (si.item) { s = si.item; if (Len(s) > initial) { char *c = Char(s); c += initial; Printv(out, indent, c, "\n", NIL); } else { Printv(out, "\n", NIL); } si = Next(si); } Delete(clist); return out; } /* ------------------------------------------------------------ * insertDirective() * * Hook for %insert directive. * ------------------------------------------------------------ */ virtual int insertDirective(Node *n) { String *code = Getattr(n, "code"); String *section = Getattr(n, "section"); if ((!ImportMode) && (Cmp(section, "perl") == 0)) { Printv(additional_perl_code, code, NIL); } else { Language::insertDirective(n); } return SWIG_OK; } String *runtimeCode() { String *s = NewString(""); String *shead = Swig_include_sys("perlhead.swg"); if (!shead) { Printf(stderr, "*** Unable to open 'perlhead.swg'\n"); } else { Append(s, shead); Delete(shead); } String *serrors = Swig_include_sys("perlerrors.swg"); if (!serrors) { Printf(stderr, "*** Unable to open 'perlerrors.swg'\n"); } else { Append(s, serrors); Delete(serrors); } String *srun = Swig_include_sys("perlrun.swg"); if (!srun) { Printf(stderr, "*** Unable to open 'perlrun.swg'\n"); } else { Append(s, srun); Delete(srun); } return s; } String *defaultExternalRuntimeFilename() { return NewString("swigperlrun.h"); } virtual int classDirectorInit(Node *n) { String *declaration = Swig_director_declaration(n); Printf(f_directors_h, "\n"); Printf(f_directors_h, "%s\n", declaration); Printf(f_directors_h, "public:\n"); Delete(declaration); return Language::classDirectorInit(n); } virtual int classDirectorEnd(Node *n) { if (dirprot_mode()) { /* This implementation uses a std::map. It should be possible to rewrite it using a more elegant way, like copying the Java approach for the 'override' array. But for now, this seems to be the least intrusive way. */ Printf(f_directors_h, "\n"); Printf(f_directors_h, "/* Internal director utilities */\n"); Printf(f_directors_h, "public:\n"); Printf(f_directors_h, " bool swig_get_inner(const char *swig_protected_method_name) const {\n"); Printf(f_directors_h, " std::map::const_iterator iv = swig_inner.find(swig_protected_method_name);\n"); Printf(f_directors_h, " return (iv != swig_inner.end() ? iv->second : false);\n"); Printf(f_directors_h, " }\n"); Printf(f_directors_h, " void swig_set_inner(const char *swig_protected_method_name, bool swig_val) const {\n"); Printf(f_directors_h, " swig_inner[swig_protected_method_name] = swig_val;\n"); Printf(f_directors_h, " }\n"); Printf(f_directors_h, "private:\n"); Printf(f_directors_h, " mutable std::map swig_inner;\n"); } Printf(f_directors_h, "};\n"); return Language::classDirectorEnd(n); } virtual int classDirectorConstructor(Node *n) { Node *parent = Getattr(n, "parentNode"); String *sub = NewString(""); String *decl = Getattr(n, "decl"); String *supername = Swig_class_name(parent); String *classname = NewString(""); Printf(classname, "SwigDirector_%s", supername); /* insert self parameter */ Parm *p; ParmList *superparms = Getattr(n, "parms"); ParmList *parms = CopyParmList(superparms); String *type = NewString("SV"); SwigType_add_pointer(type); p = NewParm(type, NewString("self"), n); set_nextSibling(p, parms); parms = p; if (!Getattr(n, "defaultargs")) { /* constructor */ { Wrapper *w = NewWrapper(); String *call; String *basetype = Getattr(parent, "classtype"); String *target = Swig_method_decl(0, decl, classname, parms, 0); call = Swig_csuperclass_call(0, basetype, superparms); Printf(w->def, "%s::%s: %s, Swig::Director(self) { \n", classname, target, call); Printf(w->def, " SWIG_DIRECTOR_RGTR((%s *)this, this); \n", basetype); Append(w->def, "}\n"); Delete(target); Wrapper_print(w, f_directors); Delete(call); DelWrapper(w); } /* constructor header */ { String *target = Swig_method_decl(0, decl, classname, parms, 1); Printf(f_directors_h, " %s;\n", target); Delete(target); } } Delete(sub); Delete(classname); Delete(supername); Delete(parms); return Language::classDirectorConstructor(n); } virtual int classDirectorMethod(Node *n, Node *parent, String *super) { int is_void = 0; int is_pointer = 0; String *decl = Getattr(n, "decl"); String *name = Getattr(n, "name"); String *classname = Getattr(parent, "sym:name"); String *c_classname = Getattr(parent, "name"); String *symname = Getattr(n, "sym:name"); String *declaration = NewString(""); ParmList *l = Getattr(n, "parms"); Wrapper *w = NewWrapper(); String *tm; String *wrap_args = NewString(""); String *returntype = Getattr(n, "type"); String *value = Getattr(n, "value"); String *storage = Getattr(n, "storage"); bool pure_virtual = false; int status = SWIG_OK; int idx; bool ignored_method = GetFlag(n, "feature:ignore") ? true : false; if (Cmp(storage, "virtual") == 0) { if (Cmp(value, "0") == 0) { pure_virtual = true; } } /* determine if the method returns a pointer */ is_pointer = SwigType_ispointer_return(decl); is_void = (!Cmp(returntype, "void") && !is_pointer); /* virtual method definition */ String *target; String *pclassname = NewStringf("SwigDirector_%s", classname); String *qualified_name = NewStringf("%s::%s", pclassname, name); SwigType *rtype = Getattr(n, "conversion_operator") ? 0 : Getattr(n, "classDirectorMethods:type"); target = Swig_method_decl(rtype, decl, qualified_name, l, 0); Printf(w->def, "%s", target); Delete(qualified_name); Delete(target); /* header declaration */ target = Swig_method_decl(rtype, decl, name, l, 1); Printf(declaration, " virtual %s", target); Delete(target); // Get any exception classes in the throws typemap if (Getattr(n, "noexcept")) { Append(w->def, " noexcept"); Append(declaration, " noexcept"); } ParmList *throw_parm_list = 0; if ((throw_parm_list = Getattr(n, "throws")) || Getattr(n, "throw")) { Parm *p; int gencomma = 0; Append(w->def, " throw("); Append(declaration, " throw("); if (throw_parm_list) Swig_typemap_attach_parms("throws", throw_parm_list, 0); for (p = throw_parm_list; p; p = nextSibling(p)) { if (Getattr(p, "tmap:throws")) { if (gencomma++) { Append(w->def, ", "); Append(declaration, ", "); } String *str = SwigType_str(Getattr(p, "type"), 0); Append(w->def, str); Append(declaration, str); Delete(str); } } Append(w->def, ")"); Append(declaration, ")"); } Append(w->def, " {"); Append(declaration, ";\n"); /* declare method return value * if the return value is a reference or const reference, a specialized typemap must * handle it, including declaration of c_result ($result). */ if (!is_void && (!ignored_method || pure_virtual)) { if (!SwigType_isclass(returntype)) { if (!(SwigType_ispointer(returntype) || SwigType_isreference(returntype))) { String *construct_result = NewStringf("= SwigValueInit< %s >()", SwigType_lstr(returntype, 0)); Wrapper_add_localv(w, "c_result", SwigType_lstr(returntype, "c_result"), construct_result, NIL); Delete(construct_result); } else { Wrapper_add_localv(w, "c_result", SwigType_lstr(returntype, "c_result"), "= 0", NIL); } } else { String *cres = SwigType_lstr(returntype, "c_result"); Printf(w->code, "%s;\n", cres); Delete(cres); } } if (!is_void && !ignored_method) { String *pres = NewStringf("SV *%s", Swig_cresult_name()); Wrapper_add_local(w, Swig_cresult_name(), pres); Delete(pres); } if (ignored_method) { if (!pure_virtual) { if (!is_void) Printf(w->code, "return "); String *super_call = Swig_method_call(super, l); Printf(w->code, "%s;\n", super_call); Delete(super_call); } else { Printf(w->code, "Swig::DirectorPureVirtualException::raise(\"Attempted to invoke pure virtual method %s::%s\");\n", SwigType_namestr(c_classname), SwigType_namestr(name)); } } else { /* attach typemaps to arguments (C/C++ -> Perl) */ String *parse_args = NewString(""); String *pstack = NewString(""); Swig_director_parms_fixup(l); /* remove the wrapper 'w' since it was producing spurious temps */ Swig_typemap_attach_parms("in", l, 0); Swig_typemap_attach_parms("directorin", l, w); Swig_typemap_attach_parms("directorargout", l, w); Wrapper_add_local(w, "SP", "dSP"); { String *ptype = Copy(getClassType()); SwigType_add_pointer(ptype); String *mangle = SwigType_manglestr(ptype); Wrapper_add_local(w, "swigself", "SV *swigself"); Printf(w->code, "swigself = SWIG_NewPointerObj(SWIG_as_voidptr(this), SWIGTYPE%s, SWIG_SHADOW);\n", mangle); Printf(w->code, "sv_bless(swigself, gv_stashpv(swig_get_class(), 0));\n"); Delete(mangle); Delete(ptype); Append(pstack, "XPUSHs(swigself);\n"); } Parm *p; char source[256]; int outputs = 0; if (!is_void) outputs++; /* build argument list and type conversion string */ idx = 0; p = l; while (p) { if (checkAttribute(p, "tmap:in:numinputs", "0")) { p = Getattr(p, "tmap:in:next"); continue; } /* old style? caused segfaults without the p!=0 check in the for() condition, and seems dangerous in the while loop as well. while (Getattr(p, "tmap:ignore")) { p = Getattr(p, "tmap:ignore:next"); } */ if (Getattr(p, "tmap:directorargout") != 0) outputs++; String *pname = Getattr(p, "name"); String *ptype = Getattr(p, "type"); if ((tm = Getattr(p, "tmap:directorin")) != 0) { sprintf(source, "obj%d", idx++); String *input = NewString(source); Setattr(p, "emit:directorinput", input); Replaceall(tm, "$input", input); Delete(input); Replaceall(tm, "$owner", "0"); Replaceall(tm, "$shadow", "0"); /* Wrapper_add_localv(w, source, "SV *", source, "= 0", NIL); */ Printv(wrap_args, "SV *", source, ";\n", NIL); Printv(wrap_args, tm, "\n", NIL); Putc('O', parse_args); Printv(pstack, "XPUSHs(", source, ");\n", NIL); p = Getattr(p, "tmap:directorin:next"); continue; } else if (Cmp(ptype, "void")) { /* special handling for pointers to other C++ director classes. * ideally this would be left to a typemap, but there is currently no * way to selectively apply the dynamic_cast<> to classes that have * directors. in other words, the type "SwigDirector_$1_lname" only exists * for classes with directors. we avoid the problem here by checking * module.wrap::directormap, but it's not clear how to get a typemap to * do something similar. perhaps a new default typemap (in addition * to SWIGTYPE) called DIRECTORTYPE? */ if (SwigType_ispointer(ptype) || SwigType_isreference(ptype)) { Node *module = Getattr(parent, "module"); Node *target = Swig_directormap(module, ptype); sprintf(source, "obj%d", idx++); String *nonconst = 0; /* strip pointer/reference --- should move to Swig/stype.c */ String *nptype = NewString(Char(ptype) + 2); /* name as pointer */ String *ppname = Copy(pname); if (SwigType_isreference(ptype)) { Insert(ppname, 0, "&"); } /* if necessary, cast away const since Perl doesn't support it! */ if (SwigType_isconst(nptype)) { nonconst = NewStringf("nc_tmp_%s", pname); String *nonconst_i = NewStringf("= const_cast< %s >(%s)", SwigType_lstr(ptype, 0), ppname); Wrapper_add_localv(w, nonconst, SwigType_lstr(ptype, 0), nonconst, nonconst_i, NIL); Delete(nonconst_i); Swig_warning(WARN_LANG_DISCARD_CONST, input_file, line_number, "Target language argument '%s' discards const in director method %s::%s.\n", SwigType_str(ptype, pname), SwigType_namestr(c_classname), SwigType_namestr(name)); } else { nonconst = Copy(ppname); } Delete(nptype); Delete(ppname); String *mangle = SwigType_manglestr(ptype); if (target) { String *director = NewStringf("director_%s", mangle); Wrapper_add_localv(w, director, "Swig::Director *", director, "= 0", NIL); Wrapper_add_localv(w, source, "SV *", source, "= 0", NIL); Printf(wrap_args, "%s = SWIG_DIRECTOR_CAST(%s);\n", director, nonconst); Printf(wrap_args, "if (!%s) {\n", director); Printf(wrap_args, "%s = SWIG_NewPointerObj(%s, SWIGTYPE%s, 0);\n", source, nonconst, mangle); Append(wrap_args, "} else {\n"); Printf(wrap_args, "%s = %s->swig_get_self();\n", source, director); Printf(wrap_args, "SvREFCNT_inc((SV *)%s);\n", source); Append(wrap_args, "}\n"); Delete(director); } else { Wrapper_add_localv(w, source, "SV *", source, "= 0", NIL); Printf(wrap_args, "%s = SWIG_NewPointerObj(%s, SWIGTYPE%s, 0);\n", source, nonconst, mangle); Printf(pstack, "XPUSHs(sv_2mortal(%s));\n", source); } Putc('O', parse_args); Delete(mangle); Delete(nonconst); } else { Swig_warning(WARN_TYPEMAP_DIRECTORIN_UNDEF, input_file, line_number, "Unable to use type %s as a function argument in director method %s::%s (skipping method).\n", SwigType_str(ptype, 0), SwigType_namestr(c_classname), SwigType_namestr(name)); status = SWIG_NOWRAP; break; } } p = nextSibling(p); } /* add the method name as a PyString */ String *pyname = Getattr(n, "sym:name"); /* wrap complex arguments to PyObjects */ Printv(w->code, wrap_args, NIL); /* pass the method call on to the Python object */ if (dirprot_mode() && !is_public(n)) { Printf(w->code, "swig_set_inner(\"%s\", true);\n", name); } Append(w->code, "ENTER;\n"); Append(w->code, "SAVETMPS;\n"); Append(w->code, "PUSHMARK(SP);\n"); Append(w->code, pstack); Delete(pstack); Append(w->code, "PUTBACK;\n"); Printf(w->code, "call_method(\"%s\", G_EVAL | G_SCALAR);\n", pyname); if (dirprot_mode() && !is_public(n)) Printf(w->code, "swig_set_inner(\"%s\", false);\n", name); /* exception handling */ tm = Swig_typemap_lookup("director:except", n, Swig_cresult_name(), 0); if (!tm) { tm = Getattr(n, "feature:director:except"); if (tm) tm = Copy(tm); } Append(w->code, "if (SvTRUE(ERRSV)) {\n"); Append(w->code, " PUTBACK;\n FREETMPS;\n LEAVE;\n"); if ((tm) && Len(tm) && (Strcmp(tm, "1") != 0)) { Replaceall(tm, "$error", "ERRSV"); Printv(w->code, Str(tm), "\n", NIL); } else { Printf(w->code, " Swig::DirectorMethodException::raise(ERRSV);\n", classname, pyname); } Append(w->code, "}\n"); Delete(tm); /* * Python method may return a simple object, or a tuple. * for in/out arguments, we have to extract the appropriate PyObjects from the tuple, * then marshal everything back to C/C++ (return value and output arguments). * */ /* marshal return value and other outputs (if any) from PyObject to C/C++ type */ String *cleanup = NewString(""); String *outarg = NewString(""); if (outputs > 1) { Wrapper_add_local(w, "output", "SV *output"); Printf(w->code, "if (count != %d) {\n", outputs); Printf(w->code, " Swig::DirectorTypeMismatchException::raise(\"Perl method %s.%sfailed to return a list.\");\n", classname, pyname); Append(w->code, "}\n"); } idx = 0; /* marshal return value */ if (!is_void) { Append(w->code, "SPAGAIN;\n"); Printf(w->code, "%s = POPs;\n", Swig_cresult_name()); tm = Swig_typemap_lookup("directorout", n, Swig_cresult_name(), w); if (tm != 0) { if (outputs > 1) { Printf(w->code, "output = POPs;\n"); Replaceall(tm, "$input", "output"); } else { Replaceall(tm, "$input", Swig_cresult_name()); } char temp[24]; sprintf(temp, "%d", idx); Replaceall(tm, "$argnum", temp); /* TODO check this */ if (Getattr(n, "wrap:disown")) { Replaceall(tm, "$disown", "SWIG_POINTER_DISOWN"); } else { Replaceall(tm, "$disown", "0"); } Replaceall(tm, "$result", "c_result"); Printv(w->code, tm, "\n", NIL); Delete(tm); } else { Swig_warning(WARN_TYPEMAP_DIRECTOROUT_UNDEF, input_file, line_number, "Unable to use return type %s in director method %s::%s (skipping method).\n", SwigType_str(returntype, 0), SwigType_namestr(c_classname), SwigType_namestr(name)); status = SWIG_ERROR; } } /* marshal outputs */ for (p = l; p;) { if ((tm = Getattr(p, "tmap:directorargout")) != 0) { if (outputs > 1) { Printf(w->code, "output = POPs;\n"); Replaceall(tm, "$result", "output"); } else { Replaceall(tm, "$result", Swig_cresult_name()); } Replaceall(tm, "$input", Getattr(p, "emit:directorinput")); Printv(w->code, tm, "\n", NIL); p = Getattr(p, "tmap:directorargout:next"); } else { p = nextSibling(p); } } Delete(parse_args); Delete(cleanup); Delete(outarg); } if (!ignored_method) { Append(w->code, "PUTBACK;\n"); Append(w->code, "FREETMPS;\n"); Append(w->code, "LEAVE;\n"); } if (!is_void) { if (!(ignored_method && !pure_virtual)) { String *rettype = SwigType_str(returntype, 0); if (!SwigType_isreference(returntype)) { Printf(w->code, "return (%s) c_result;\n", rettype); } else { Printf(w->code, "return (%s) *c_result;\n", rettype); } Delete(rettype); } } Append(w->code, "}\n"); // We expose protected methods via an extra public inline method which makes a straight call to the wrapped class' method String *inline_extra_method = NewString(""); if (dirprot_mode() && !is_public(n) && !pure_virtual) { Printv(inline_extra_method, declaration, NIL); String *extra_method_name = NewStringf("%sSwigPublic", name); Replaceall(inline_extra_method, name, extra_method_name); Replaceall(inline_extra_method, ";\n", " {\n "); if (!is_void) Printf(inline_extra_method, "return "); String *methodcall = Swig_method_call(super, l); Printv(inline_extra_method, methodcall, ";\n }\n", NIL); Delete(methodcall); Delete(extra_method_name); } /* emit the director method */ if (status == SWIG_OK) { if (!Getattr(n, "defaultargs")) { Replaceall(w->code, "$symname", symname); Wrapper_print(w, f_directors); Printv(f_directors_h, declaration, NIL); Printv(f_directors_h, inline_extra_method, NIL); } } /* clean up */ Delete(wrap_args); Delete(pclassname); DelWrapper(w); return status; } int classDirectorDisown(Node *n) { int rv; member_func = 1; rv = Language::classDirectorDisown(n); member_func = 0; if (rv == SWIG_OK && Swig_directorclass(n)) { String *symname = Getattr(n, "sym:name"); String *disown = Swig_name_disown(NSPACE_TODO, symname); Setattr(n, "perl5:directordisown", NewStringf("%s::%s", cmodule, disown)); } return rv; } int classDirectorDestructor(Node *n) { /* TODO: it would be nice if this didn't have to copy the body of Language::classDirectorDestructor() */ String *DirectorClassName = directorClassName(getCurrentClass()); String *body = NewString("\n"); String *ptype = Copy(getClassType()); SwigType_add_pointer(ptype); String *mangle = SwigType_manglestr(ptype); Printv(body, tab4, "dSP;\n", tab4, "SV *self = SWIG_NewPointerObj(SWIG_as_voidptr(this), SWIGTYPE", mangle, ", SWIG_SHADOW);\n", tab4, "\n", tab4, "sv_bless(self, gv_stashpv(swig_get_class(), 0));\n", tab4, "ENTER;\n", tab4, "SAVETMPS;\n", tab4, "PUSHMARK(SP);\n", tab4, "XPUSHs(self);\n", tab4, "XPUSHs(&PL_sv_yes);\n", tab4, "PUTBACK;\n", tab4, "call_method(\"DESTROY\", G_EVAL | G_VOID);\n", tab4, "FREETMPS;\n", tab4, "LEAVE;\n", NIL); Delete(mangle); Delete(ptype); if (Getattr(n, "noexcept")) { Printf(f_directors_h, " virtual ~%s() noexcept;\n", DirectorClassName); Printf(f_directors, "%s::~%s() noexcept {%s}\n\n", DirectorClassName, DirectorClassName, body); } else if (Getattr(n, "throw")) { Printf(f_directors_h, " virtual ~%s() throw();\n", DirectorClassName); Printf(f_directors, "%s::~%s() throw() {%s}\n\n", DirectorClassName, DirectorClassName, body); } else { Printf(f_directors_h, " virtual ~%s();\n", DirectorClassName); Printf(f_directors, "%s::~%s() {%s}\n\n", DirectorClassName, DirectorClassName, body); } return SWIG_OK; } }; /* ----------------------------------------------------------------------------- * swig_perl5() - Instantiate module * ----------------------------------------------------------------------------- */ static Language *new_swig_perl5() { return new PERL5(); } extern "C" Language *swig_perl5(void) { return new_swig_perl5(); } swig-4.0.1/Source/Modules/emit.cxx0000644000175000017500000004057613527063513016716 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * emit.cxx * * Useful functions for emitting various pieces of code. * ----------------------------------------------------------------------------- */ #include "swigmod.h" #include "cparse.h" /* ----------------------------------------------------------------------------- * emit_return_variable() * * Emits a variable declaration for a function return value. * The variable name is always called result. * n => Node of the method being wrapped * rt => the return type * f => the wrapper to generate code into * ----------------------------------------------------------------------------- */ void emit_return_variable(Node *n, SwigType *rt, Wrapper *f) { if (!GetFlag(n, "tmap:out:optimal")) { if (rt && (SwigType_type(rt) != T_VOID)) { SwigType *vt = cplus_value_type(rt); SwigType *tt = vt ? vt : rt; SwigType *lt = SwigType_ltype(tt); String *lstr = SwigType_str(lt, Swig_cresult_name()); if (SwigType_ispointer(lt)) { Wrapper_add_localv(f, Swig_cresult_name(), lstr, "= 0", NULL); } else { Wrapper_add_local(f, Swig_cresult_name(), lstr); } if (vt) { Delete(vt); } Delete(lt); Delete(lstr); } } } /* ----------------------------------------------------------------------------- * emit_parameter_variables() * * Emits a list of variable declarations for function parameters. * The variable names are always called arg1, arg2, etc... * l => the parameter list * f => the wrapper to generate code into * ----------------------------------------------------------------------------- */ void emit_parameter_variables(ParmList *l, Wrapper *f) { Parm *p; String *tm; /* Emit function arguments */ Swig_cargs(f, l); /* Attach typemaps to parameters */ /* Swig_typemap_attach_parms("ignore",l,f); */ Swig_typemap_attach_parms("default", l, f); Swig_typemap_attach_parms("arginit", l, f); /* Apply the arginit and default */ p = l; while (p) { tm = Getattr(p, "tmap:arginit"); if (tm) { Replace(tm, "$target", Getattr(p, "lname"), DOH_REPLACE_ANY); Printv(f->code, tm, "\n", NIL); p = Getattr(p, "tmap:arginit:next"); } else { p = nextSibling(p); } } /* Apply the default typemap */ p = l; while (p) { tm = Getattr(p, "tmap:default"); if (tm) { Replace(tm, "$target", Getattr(p, "lname"), DOH_REPLACE_ANY); Printv(f->code, tm, "\n", NIL); p = Getattr(p, "tmap:default:next"); } else { p = nextSibling(p); } } } /* ----------------------------------------------------------------------------- * emit_attach_parmmaps() * * Attach the standard parameter related typemaps. * ----------------------------------------------------------------------------- */ void emit_attach_parmmaps(ParmList *l, Wrapper *f) { Swig_typemap_attach_parms("in", l, f); Swig_typemap_attach_parms("typecheck", l, 0); Swig_typemap_attach_parms("argout", l, f); Swig_typemap_attach_parms("check", l, f); Swig_typemap_attach_parms("freearg", l, f); { /* This is compatibility code to deal with the deprecated "ignore" typemap */ Parm *p = l; Parm *np; while (p) { String *tm = Getattr(p, "tmap:in"); if (tm && checkAttribute(p, "tmap:in:numinputs", "0")) { Replaceall(tm, "$target", Getattr(p, "lname")); Printv(f->code, tm, "\n", NIL); np = Getattr(p, "tmap:in:next"); while (p && (p != np)) { /* Setattr(p,"ignore","1"); Deprecate */ p = nextSibling(p); } } else if (tm) { p = Getattr(p, "tmap:in:next"); } else { p = nextSibling(p); } } } /* Perform a sanity check on "in" and "freearg" typemaps. These must exactly match to avoid chaos. If a mismatch occurs, we nuke the freearg typemap */ { Parm *p = l; Parm *npin, *npfreearg; while (p) { npin = Getattr(p, "tmap:in:next"); /* if (Getattr(p,"tmap:ignore")) { npin = Getattr(p,"tmap:ignore:next"); } else if (Getattr(p,"tmap:in")) { npin = Getattr(p,"tmap:in:next"); } */ if (Getattr(p, "tmap:freearg")) { npfreearg = Getattr(p, "tmap:freearg:next"); if (npin != npfreearg) { while (p != npin) { Delattr(p, "tmap:freearg"); Delattr(p, "tmap:freearg:next"); p = nextSibling(p); } } } p = npin; } } /* Check for variable length arguments with no input typemap. If no input is defined, we set this to ignore and print a message. */ { Parm *p = l; Parm *lp = 0; while (p) { if (!checkAttribute(p, "tmap:in:numinputs", "0")) { lp = p; p = Getattr(p, "tmap:in:next"); continue; } if (SwigType_isvarargs(Getattr(p, "type"))) { Swig_warning(WARN_LANG_VARARGS, input_file, line_number, "Variable length arguments discarded.\n"); Setattr(p, "tmap:in", ""); } lp = 0; p = nextSibling(p); } /* Check if last input argument is variable length argument */ if (lp) { p = lp; while (p) { if (SwigType_isvarargs(Getattr(p, "type"))) { // Mark the head of the ParmList that it has varargs Setattr(l, "emit:varargs", lp); //Printf(stdout, "setting emit:varargs %s ... %s +++ %s\n", Getattr(l, "emit:varargs"), Getattr(l, "type"), Getattr(p, "type")); break; } p = nextSibling(p); } } } /* * An equivalent type can be used in the typecheck typemap for SWIG to detect the overloading of equivalent * target language types. This is primarily for the smartptr feature, where a pointer and a smart pointer * are seen as equivalent types in the target language. */ { Parm *p = l; while (p) { String *tm = Getattr(p, "tmap:typecheck"); if (tm) { String *equivalent = Getattr(p, "tmap:typecheck:equivalent"); if (equivalent) { String *precedence = Getattr(p, "tmap:typecheck:precedence"); if (precedence && Strcmp(precedence, "0") != 0) Swig_error(Getfile(tm), Getline(tm), "The 'typecheck' typemap for %s contains an 'equivalent' attribute for a 'precedence' that is not set to SWIG_TYPECHECK_POINTER or 0.\n", SwigType_str(Getattr(p, "type"), 0)); SwigType *cpt = Swig_cparse_type(equivalent); if (cpt) { Setattr(p, "equivtype", cpt); Delete(cpt); } else { Swig_error(Getfile(tm), Getline(tm), "Invalid type (%s) in 'equivalent' attribute in 'typecheck' typemap for type %s.\n", equivalent, SwigType_str(Getattr(p, "type"), 0)); } } p = Getattr(p, "tmap:typecheck:next"); } else { p = nextSibling(p); } } } } /* ----------------------------------------------------------------------------- * emit_num_arguments() * * Calculate the total number of arguments. This function is safe for use * with multi-argument typemaps which may change the number of arguments in * strange ways. * ----------------------------------------------------------------------------- */ int emit_num_arguments(ParmList *parms) { Parm *p = parms; int nargs = 0; while (p) { if (Getattr(p, "tmap:in")) { nargs += GetInt(p, "tmap:in:numinputs"); p = Getattr(p, "tmap:in:next"); } else { p = nextSibling(p); } } /* DB 04/02/2003: Not sure this is necessary with tmap:in:numinputs */ /* if (parms && (p = Getattr(parms,"emit:varargs"))) { if (!nextSibling(p)) { nargs--; } } */ return nargs; } /* ----------------------------------------------------------------------------- * emit_num_required() * * Computes the number of required arguments. This function is safe for * use with multi-argument typemaps and knows how to skip over everything * properly. Note that parameters with default values are counted unless * the compact default args option is on. * ----------------------------------------------------------------------------- */ int emit_num_required(ParmList *parms) { Parm *p = parms; int nargs = 0; Parm *first_default_arg = 0; int compactdefargs = ParmList_is_compactdefargs(p); while (p) { if (Getattr(p, "tmap:in") && checkAttribute(p, "tmap:in:numinputs", "0")) { p = Getattr(p, "tmap:in:next"); } else { if (Getattr(p, "tmap:default")) break; if (Getattr(p, "value")) { if (!first_default_arg) first_default_arg = p; if (compactdefargs) break; } nargs += GetInt(p, "tmap:in:numinputs"); if (Getattr(p, "tmap:in")) { p = Getattr(p, "tmap:in:next"); } else { p = nextSibling(p); } } } /* Print error message for non-default arguments following default arguments */ /* The error message is printed more than once with most language modules, this ought to be fixed */ if (first_default_arg) { p = first_default_arg; while (p) { if (Getattr(p, "tmap:in") && checkAttribute(p, "tmap:in:numinputs", "0")) { p = Getattr(p, "tmap:in:next"); } else { if (!Getattr(p, "value") && (!Getattr(p, "tmap:default"))) { Swig_error(Getfile(p), Getline(p), "Non-optional argument '%s' follows an optional argument.\n", Getattr(p, "name")); } if (Getattr(p, "tmap:in")) { p = Getattr(p, "tmap:in:next"); } else { p = nextSibling(p); } } } } /* DB 04/02/2003: Not sure this is necessary with tmap:in:numinputs */ /* if (parms && (p = Getattr(parms,"emit:varargs"))) { if (!nextSibling(p)) { nargs--; } } */ return nargs; } /* ----------------------------------------------------------------------------- * emit_isvarargs() * * Checks if a ParmList is a parameter list containing varargs. * This function requires emit_attach_parmmaps to have been called beforehand. * ----------------------------------------------------------------------------- */ int emit_isvarargs(ParmList *p) { if (!p) return 0; if (Getattr(p, "emit:varargs")) return 1; return 0; } /* ----------------------------------------------------------------------------- * emit_isvarargs_function() * * Checks for varargs in a function/constructor (can be overloaded) * ----------------------------------------------------------------------------- */ bool emit_isvarargs_function(Node *n) { bool has_varargs = false; Node *over = Getattr(n, "sym:overloaded"); if (over) { for (Node *sibling = over; sibling; sibling = Getattr(sibling, "sym:nextSibling")) { if (ParmList_has_varargs(Getattr(sibling, "parms"))) { has_varargs = true; break; } } } else { has_varargs = ParmList_has_varargs(Getattr(n, "parms")) ? true : false; } return has_varargs; } /* ----------------------------------------------------------------------------- * void emit_mark_vararg_parms() * * Marks the vararg parameters which are to be ignored. * Vararg parameters are marked as ignored if there is no 'in' varargs (...) * typemap. * ----------------------------------------------------------------------------- */ void emit_mark_varargs(ParmList *l) { Parm *p = l; while (p) { if (SwigType_isvarargs(Getattr(p, "type"))) if (!Getattr(p, "tmap:in")) Setattr(p, "varargs:ignore", "1"); p = nextSibling(p); } } #if 0 /* replace_contract_args. This function replaces argument names in contract specifications. Used in conjunction with the %contract directive. */ static void replace_contract_args(Parm *cp, Parm *rp, String *s) { while (cp && rp) { String *n = Getattr(cp, "name"); if (n) { Replace(s, n, Getattr(rp, "lname"), DOH_REPLACE_ID); } cp = nextSibling(cp); rp = nextSibling(rp); } } #endif /* ----------------------------------------------------------------------------- * int emit_action_code() * * Emits action code for a wrapper. Adds in exception handling code (%exception). * eaction -> the action code to emit * wrappercode -> the emitted code (output) * ----------------------------------------------------------------------------- */ int emit_action_code(Node *n, String *wrappercode, String *eaction) { assert(Getattr(n, "wrap:name")); /* Look for except feature (%exception) */ String *tm = GetFlagAttr(n, "feature:except"); if (tm) tm = Copy(tm); if ((tm) && Len(tm) && (Strcmp(tm, "1") != 0)) { if (Strstr(tm, "$")) { Swig_replace_special_variables(n, parentNode(n), tm); Replaceall(tm, "$function", eaction); // deprecated Replaceall(tm, "$action", eaction); } Printv(wrappercode, tm, "\n", NIL); Delete(tm); return 1; } else { Printv(wrappercode, eaction, "\n", NIL); return 0; } } /* ----------------------------------------------------------------------------- * int emit_action() * * Emits the call to the wrapped function. * Adds in exception specification exception handling and %exception code. * ----------------------------------------------------------------------------- */ String *emit_action(Node *n) { String *actioncode = NewStringEmpty(); String *tm; String *action; String *wrap; ParmList *catchlist = Getattr(n, "catchlist"); /* Look for fragments */ { String *fragment = Getattr(n, "feature:fragment"); if (fragment) { char *c, *tok; String *t = Copy(fragment); c = Char(t); tok = strtok(c, ","); while (tok) { String *fname = NewString(tok); Setfile(fname, Getfile(n)); Setline(fname, Getline(n)); Swig_fragment_emit(fname); Delete(fname); tok = strtok(NULL, ","); } Delete(t); } } /* Emit wrapper code (if any) */ wrap = Getattr(n, "wrap:code"); if (wrap && Swig_filebyname("header") != Getattr(n, "wrap:code:done")) { File *f_code = Swig_filebyname("header"); if (f_code) { Printv(f_code, wrap, NIL); } Setattr(n, "wrap:code:done", f_code); } action = Getattr(n, "feature:action"); if (!action) action = Getattr(n, "wrap:action"); assert(action != 0); /* Emit contract code (if any) */ if (Swig_contract_mode_get()) { /* Preassertion */ tm = Getattr(n, "contract:preassert"); if (Len(tm)) { Printv(actioncode, tm, "\n", NIL); } } /* Exception handling code */ /* saves action -> eaction for postcatching exception */ String *eaction = NewString(""); /* If we are in C++ mode and there is an exception specification. We're going to enclose the block in a try block */ if (catchlist) { Printf(eaction, "try {\n"); } String *preaction = Getattr(n, "wrap:preaction"); if (preaction) Printv(eaction, preaction, NIL); Printv(eaction, action, NIL); String *postaction = Getattr(n, "wrap:postaction"); if (postaction) Printv(eaction, postaction, NIL); if (catchlist) { int unknown_catch = 0; int has_varargs = 0; Printf(eaction, "}"); for (Parm *ep = catchlist; ep; ep = nextSibling(ep)) { String *em = Swig_typemap_lookup("throws", ep, "_e", 0); if (em) { SwigType *et = Getattr(ep, "type"); SwigType *etr = SwigType_typedef_resolve_all(et); if (SwigType_isreference(etr) || SwigType_ispointer(etr) || SwigType_isarray(etr)) { Printf(eaction, " catch(%s) {", SwigType_str(et, "_e")); } else if (SwigType_isvarargs(etr)) { Printf(eaction, " catch(...) {"); has_varargs = 1; } else { Printf(eaction, " catch(%s) {", SwigType_str(et, "&_e")); } Printv(eaction, em, "\n", NIL); Printf(eaction, "}"); } else { Swig_warning(WARN_TYPEMAP_THROW, Getfile(n), Getline(n), "No 'throws' typemap defined for exception type '%s'\n", SwigType_str(Getattr(ep, "type"), 0)); unknown_catch = 1; } } if (unknown_catch && !has_varargs) { Printf(eaction, " catch(...) {\nthrow;\n}"); } } /* Look for except typemap (Deprecated) */ tm = Swig_typemap_lookup("except", n, Swig_cresult_name(), 0); if (tm) { Setattr(n, "feature:except", tm); tm = 0; } /* emit the except feature code */ emit_action_code(n, actioncode, eaction); Delete(eaction); /* Emit contract code (if any) */ if (Swig_contract_mode_get()) { /* Postassertion */ tm = Getattr(n, "contract:postassert"); if (Len(tm)) { Printv(actioncode, tm, "\n", NIL); } } return actioncode; } swig-4.0.1/Source/Modules/cffi.cxx0000644000175000017500000010631313527063513016657 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * cffi.cxx * * cffi language module for SWIG. * ----------------------------------------------------------------------------- */ #include "swigmod.h" #include "cparse.h" #include //#define CFFI_DEBUG //#define CFFI_WRAP_DEBUG static const char *usage = "\ CFFI Options (available with -cffi)\n\ -generate-typedef - Use defctype to generate shortcuts according to the\n\ typedefs in the input.\n\ -[no]cwrap - Turn on or turn off generation of an intermediate C\n\ file when creating a C interface. By default this is\n\ only done for C++ code.\n\ -[no]swig-lisp - Turn on or off generation of code for helper lisp\n\ macro, functions, etc. which SWIG uses while\n\ generating wrappers. These macros, functions may still\n\ be used by generated wrapper code.\n\ "; class CFFI:public Language { public: String *f_cl; String *f_clhead; String *f_clwrap; bool CWrap; // generate wrapper file for C code? File *f_begin; File *f_runtime; File *f_cxx_header; File *f_cxx_wrapper; File *f_clos; String *module; virtual void main(int argc, char *argv[]); virtual int top(Node *n); virtual int functionWrapper(Node *n); virtual int variableWrapper(Node *n); virtual int constantWrapper(Node *n); // virtual int classDeclaration(Node *n); virtual int enumDeclaration(Node *n); virtual int typedefHandler(Node *n); //c++ specific code virtual int constructorHandler(Node *n); virtual int destructorHandler(Node *n); virtual int memberfunctionHandler(Node *n); virtual int membervariableHandler(Node *n); virtual int classHandler(Node *n); private: static void checkConstraints(ParmList *parms, Wrapper *f); static void argout(ParmList *parms, Wrapper *f); static String *freearg(ParmList *parms); static void cleanupFunction(Node *n, Wrapper *f, ParmList *parms); void emit_defun(Node *n, String *name); void emit_defmethod(Node *n); void emit_initialize_instance(Node *n); void emit_getter(Node *n); void emit_setter(Node *n); void emit_class(Node *n); void emit_struct_union(Node *n, bool un); void emit_export(Node *n, String *name); void emit_inline(Node *n, String *name); String *lispy_name(char *name); String *lispify_name(Node *n, String *ty, const char *flag, bool kw = false); String *convert_literal(String *num_param, String *type, bool try_to_split = true); String *infix_to_prefix(String *val, char split_op, const String *op, String *type); String *strip_parens(String *string); String *trim(String *string); int generate_typedef_flag; bool no_swig_lisp; }; void CFFI::main(int argc, char *argv[]) { int i; Preprocessor_define("SWIGCFFI 1", 0); SWIG_library_directory("cffi"); SWIG_config_file("cffi.swg"); generate_typedef_flag = 0; no_swig_lisp = false; CWrap = false; for (i = 1; i < argc; i++) { if (!Strcmp(argv[i], "-help")) { Printf(stdout, "%s\n", usage); } else if (!strcmp(argv[i], "-cwrap")) { CWrap = true; Swig_mark_arg(i); } else if ((Strcmp(argv[i], "-generate-typedef") == 0)) { generate_typedef_flag = 1; Swig_mark_arg(i); } else if (!strcmp(argv[i], "-nocwrap")) { CWrap = false; Swig_mark_arg(i); } else if (!strcmp(argv[i], "-swig-lisp")) { no_swig_lisp = false; Swig_mark_arg(i); } else if (!strcmp(argv[i], "-noswig-lisp")) { no_swig_lisp = true; Swig_mark_arg(i); } } f_clhead = NewString(""); f_clwrap = NewString(""); f_cl = NewString(""); allow_overloading(); } int CFFI::top(Node *n) { File *f_null = NewString(""); module = Getattr(n, "name"); String *cxx_filename = Getattr(n, "outfile"); String *lisp_filename = NewString(""); Printf(lisp_filename, "%s%s.lisp", SWIG_output_directory(), module); File *f_lisp = NewFile(lisp_filename, "w", SWIG_output_files()); if (!f_lisp) { FileErrorDisplay(lisp_filename); SWIG_exit(EXIT_FAILURE); } if (CPlusPlus || CWrap) { f_begin = NewFile(cxx_filename, "w", SWIG_output_files()); if (!f_begin) { Delete(f_lisp); Printf(stderr, "Unable to open %s for writing\n", cxx_filename); SWIG_exit(EXIT_FAILURE); } String *clos_filename = NewString(""); Printf(clos_filename, "%s%s-clos.lisp", SWIG_output_directory(), module); f_clos = NewFile(clos_filename, "w", SWIG_output_files()); if (!f_clos) { Delete(f_lisp); Printf(stderr, "Unable to open %s for writing\n", cxx_filename); SWIG_exit(EXIT_FAILURE); } } else { f_begin = NewString(""); f_clos = NewString(""); } f_runtime = NewString(""); f_cxx_header = f_runtime; f_cxx_wrapper = NewString(""); Swig_register_filebyname("header", f_cxx_header); Swig_register_filebyname("wrapper", f_cxx_wrapper); Swig_register_filebyname("begin", f_begin); Swig_register_filebyname("runtime", f_runtime); Swig_register_filebyname("lisphead", f_clhead); if (!no_swig_lisp) Swig_register_filebyname("swiglisp", f_cl); else Swig_register_filebyname("swiglisp", f_null); Swig_banner(f_begin); Printf(f_runtime, "\n\n#ifndef SWIGCFFI\n#define SWIGCFFI\n#endif\n\n"); Swig_banner_target_lang(f_lisp, ";;;"); Language::top(n); Printf(f_lisp, "%s\n", f_clhead); Printf(f_lisp, "%s\n", f_cl); Printf(f_lisp, "%s\n", f_clwrap); Delete(f_lisp); Delete(f_cl); Delete(f_clhead); Delete(f_clwrap); Dump(f_runtime, f_begin); Delete(f_runtime); Delete(f_begin); Delete(f_cxx_wrapper); Delete(f_null); return SWIG_OK; } int CFFI::classHandler(Node *n) { #ifdef CFFI_DEBUG Printf(stderr, "class %s::%s\n", "some namespace", //current_namespace, Getattr(n, "sym:name")); #endif String *name = Getattr(n, "sym:name"); String *kind = Getattr(n, "kind"); // maybe just remove this check and get rid of the else clause below. if (Strcmp(kind, "struct") == 0) { emit_struct_union(n, false); return SWIG_OK; } else if (Strcmp(kind, "union") == 0) { emit_struct_union(n, true); return SWIG_OK; } else if (Strcmp(kind, "class") == 0) { emit_class(n); Language::classHandler(n); } else { Printf(stderr, "Don't know how to deal with %s kind of class yet.\n", kind); Printf(stderr, " (name: %s)\n", name); SWIG_exit(EXIT_FAILURE); return SWIG_OK; } return SWIG_OK; } int CFFI::constructorHandler(Node *n) { #ifdef CFFI_DEBUG Printf(stderr, "constructor %s\n", Getattr(n, "name")); Printf(stderr, "constructor %s\n and %s and %s", Getattr(n, "kind"), Getattr(n, "sym:name"), Getattr(n, "allegrocl:old-sym:name")); #endif Setattr(n, "cffi:constructorfunction", "1"); // Let SWIG generate a global forwarding function. return Language::constructorHandler(n); } int CFFI::destructorHandler(Node *n) { #ifdef CFFI_DEBUG Printf(stderr, "destructor %s\n", Getattr(n, "name")); #endif // Let SWIG generate a global forwarding function. return Language::destructorHandler(n); } void CFFI::emit_defmethod(Node *n) { String *args_placeholder = NewStringf(""); String *args_call = NewStringf(""); ParmList *pl = Getattr(n, "parms"); int argnum = 0; Node *parent = getCurrentClass(); bool first = 0; for (Parm *p = pl; p; p = nextSibling(p), argnum++) { String *argname = Getattr(p, "name"); String *ffitype = Swig_typemap_lookup("lispclass", p, "", 0); int tempargname = 0; if(!first) first = true; else Printf(args_placeholder, " "); if (!argname) { argname = NewStringf("arg%d", argnum); tempargname = 1; } else if (Strcmp(argname, "t") == 0 || Strcmp(argname, "T") == 0) { argname = NewStringf("t-arg%d", argnum); tempargname = 1; } if (Len(ffitype) > 0) Printf(args_placeholder, "(%s %s)", argname, ffitype); else Printf(args_placeholder, "%s", argname); if (ffitype && Strcmp(ffitype, lispify_name(parent, lispy_name(Char(Getattr(parent, "sym:name"))), "'classname")) == 0) Printf(args_call, " (ff-pointer %s)", argname); else Printf(args_call, " %s", argname); Delete(ffitype); if (tempargname) Delete(argname); } String *method_name = Getattr(n, "name"); int x = Replace(method_name, "operator ", "", DOH_REPLACE_FIRST); // if (x == 1) Printf(f_clos, "(cl:shadow \"%s\")\n", method_name); Printf(f_clos, "(cl:defmethod %s (%s)\n (%s%s))\n\n", lispify_name(n, lispy_name(Char(method_name)), "'method"), args_placeholder, lispify_name(n, Getattr(n, "sym:name"), "'function"), args_call); } void CFFI::emit_initialize_instance(Node *n) { String *args_placeholder = NewStringf(""); String *args_call = NewStringf(""); ParmList *pl = Getattr(n, "parms"); int argnum = 0; Node *parent = getCurrentClass(); for (Parm *p = pl; p; p = nextSibling(p), argnum++) { String *argname = Getattr(p, "name"); String *ffitype = Swig_typemap_lookup("lispclass", p, "", 0); int tempargname = 0; if (!argname) { argname = NewStringf("arg%d", argnum); tempargname = 1; } else if (Strcmp(argname, "t") == 0 || Strcmp(argname, "T") == 0) { argname = NewStringf("t-arg%d", argnum); tempargname = 1; } if (Len(ffitype) > 0) Printf(args_placeholder, " (%s %s)", argname, ffitype); else Printf(args_placeholder, " %s", argname); if (ffitype && Strcmp(ffitype, lispify_name(parent, lispy_name(Char(Getattr(parent, "sym:name"))), "'classname")) == 0) Printf(args_call, " (ff-pointer %s)", argname); else Printf(args_call, " %s", argname); Delete(ffitype); if (tempargname) Delete(argname); } Printf(f_clos, "(cl:defmethod initialize-instance :after ((obj %s) &key%s)\n (setf (slot-value obj 'ff-pointer) (%s%s)))\n\n", lispify_name(parent, lispy_name(Char(Getattr(parent, "sym:name"))), "'class"), args_placeholder, lispify_name(n, Getattr(n, "sym:name"), "'function"), args_call); } void CFFI::emit_setter(Node *n) { Node *parent = getCurrentClass(); Printf(f_clos, "(cl:defmethod (cl:setf %s) (arg0 (obj %s))\n (%s (ff-pointer obj) arg0))\n\n", lispify_name(n, Getattr(n, "name"), "'method"), lispify_name(parent, lispy_name(Char(Getattr(parent, "sym:name"))), "'class"), lispify_name(n, Getattr(n, "sym:name"), "'function")); } void CFFI::emit_getter(Node *n) { Node *parent = getCurrentClass(); Printf(f_clos, "(cl:defmethod %s ((obj %s))\n (%s (ff-pointer obj)))\n\n", lispify_name(n, Getattr(n, "name"), "'method"), lispify_name(parent, lispy_name(Char(Getattr(parent, "sym:name"))), "'class"), lispify_name(n, Getattr(n, "sym:name"), "'function")); } int CFFI::memberfunctionHandler(Node *n) { // Let SWIG generate a global forwarding function. Setattr(n, "cffi:memberfunction", "1"); return Language::memberfunctionHandler(n); } int CFFI::membervariableHandler(Node *n) { // Let SWIG generate a get/set function pair. Setattr(n, "cffi:membervariable", "1"); return Language::membervariableHandler(n); } void CFFI::checkConstraints(ParmList *parms, Wrapper *f) { Parm *p = parms; while (p) { String *tm = Getattr(p, "tmap:check"); if (!tm) { p = nextSibling(p); } else { tm = Copy(tm); Replaceall(tm, "$input", Getattr(p, "emit:input")); Printv(f->code, tm, "\n\n", NULL); Delete(tm); p = Getattr(p, "tmap:check:next"); } } } void CFFI::argout(ParmList *parms, Wrapper *f) { Parm *p = parms; while (p) { String *tm = Getattr(p, "tmap:argout"); if (!tm) { p = nextSibling(p); } else { tm = Copy(tm); Replaceall(tm, "$result", Swig_cresult_name()); Replaceall(tm, "$input", Getattr(p, "emit:input")); Printv(f->code, tm, "\n", NULL); Delete(tm); p = Getattr(p, "tmap:argout:next"); } } } String *CFFI::freearg(ParmList *parms) { String *ret = NewString(""); Parm *p = parms; while (p) { String *tm = Getattr(p, "tmap:freearg"); if (!tm) { p = nextSibling(p); } else { tm = Copy(tm); Replaceall(tm, "$input", Getattr(p, "emit:input")); Printv(ret, tm, "\n", NULL); Delete(tm); p = Getattr(p, "tmap:freearg:next"); } } return ret; } void CFFI::cleanupFunction(Node *n, Wrapper *f, ParmList *parms) { String *cleanup = freearg(parms); Printv(f->code, cleanup, NULL); if (GetFlag(n, "feature:new")) { String *tm = Swig_typemap_lookup("newfree", n, Swig_cresult_name(), 0); if (tm) { Replaceall(tm, "$source", Swig_cresult_name()); Printv(f->code, tm, "\n", NULL); Delete(tm); } } Replaceall(f->code, "$cleanup", cleanup); Delete(cleanup); Replaceall(f->code, "$symname", Getattr(n, "sym:name")); } int CFFI::functionWrapper(Node *n) { ParmList *parms = Getattr(n, "parms"); String *iname = Getattr(n, "sym:name"); Wrapper *f = NewWrapper(); String *raw_return_type = Swig_typemap_lookup("ctype", n, "", 0); SwigType *return_type = Swig_cparse_type(raw_return_type); SwigType *resolved = SwigType_typedef_resolve_all(return_type); int is_void_return = (Cmp(resolved, "void") == 0); Delete(resolved); if (!is_void_return) { String *lresult_init = NewStringf("lresult = (%s)0", raw_return_type); Wrapper_add_localv(f, "lresult", raw_return_type, lresult_init, NIL); Delete(lresult_init); } String *overname = 0; if (Getattr(n, "sym:overloaded")) { overname = Getattr(n, "sym:overname"); } else { if (!addSymbol(iname, n)) { DelWrapper(f); return SWIG_ERROR; } } String *wname = Swig_name_wrapper(iname); if (overname) { Append(wname, overname); } Setattr(n, "wrap:name", wname); // Emit all of the local variables for holding arguments. emit_parameter_variables(parms, f); // Attach the standard typemaps Swig_typemap_attach_parms("ctype", parms, f); emit_attach_parmmaps(parms, f); int num_arguments = emit_num_arguments(parms); String *name_and_parms = NewStringf("%s (", wname); int i; Parm *p; int gencomma = 0; #ifdef CFFI_DEBUG Printf(stderr, "function - %s - %d\n", Getattr(n, "name"), num_arguments); #endif for (i = 0, p = parms; i < num_arguments; i++) { while (checkAttribute(p, "tmap:in:numinputs", "0")) { p = Getattr(p, "tmap:in:next"); } SwigType *c_parm_type = Swig_cparse_type(Getattr(p, "tmap:ctype")); String *arg = NewStringf("l%s", Getattr(p, "lname")); // Emit parameter declaration if (gencomma) Printf(name_and_parms, ", "); String *parm_decl = SwigType_str(c_parm_type, arg); Printf(name_and_parms, "%s", parm_decl); #ifdef CFFI_DEBUG Printf(stderr, " param: %s\n", parm_decl); #endif Delete(parm_decl); gencomma = 1; // Emit parameter conversion code String *parm_code = Getattr(p, "tmap:in"); { Replaceall(parm_code, "$input", arg); Setattr(p, "emit:input", arg); Printf(f->code, "%s\n", parm_code); p = Getattr(p, "tmap:in:next"); } Delete(arg); } Printf(name_and_parms, ")"); // Emit the function definition String *signature = SwigType_str(return_type, name_and_parms); Printf(f->def, "EXPORT %s {", signature); checkConstraints(parms, f); Printf(f->code, " try {\n"); String *actioncode = emit_action(n); String *result_convert = Swig_typemap_lookup_out("out", n, Swig_cresult_name(), f, actioncode); if (result_convert) { Replaceall(result_convert, "$result", "lresult"); Printf(f->code, "%s\n", result_convert); } Delete(result_convert); argout(parms, f); cleanupFunction(n, f, parms); /* See if there is any return cleanup code */ String *tm = 0; if ((tm = Swig_typemap_lookup("ret", n, Swig_cresult_name(), 0))) { Replaceall(tm, "$source", Swig_cresult_name()); Printf(f->code, "%s\n", tm); Delete(tm); } if (!is_void_return) { Printf(f->code, " return lresult;\n"); } emit_return_variable(n, Getattr(n, "type"), f); Printf(f->code, " } catch (...) {\n"); if (!is_void_return) Printf(f->code, " return (%s)0;\n", raw_return_type); Printf(f->code, " }\n"); Printf(f->code, "}\n"); if (CPlusPlus) Wrapper_print(f, f_runtime); if (CPlusPlus) { emit_defun(n, wname); if (Getattr(n, "cffi:memberfunction")) emit_defmethod(n); else if (Getattr(n, "cffi:membervariable")) { if (Getattr(n, "memberget")) emit_getter(n); else if (Getattr(n, "memberset")) emit_setter(n); } else if (Getattr(n, "cffi:constructorfunction")) { emit_initialize_instance(n); } } else emit_defun(n, iname); // if (!overloaded || !Getattr(n, "sym:nextSibling")) { // update_package_if_needed(n); // emit_buffered_defuns(n); // // this is the last overload. // if (overloaded) { // emit_dispatch_defun(n); // } // } Delete(wname); DelWrapper(f); return SWIG_OK; } void CFFI::emit_defun(Node *n, String *name) { String *func_name = Getattr(n, "sym:name"); ParmList *pl = Getattr(n, "parms"); int argnum = 0; func_name = lispify_name(n, func_name, "'function"); emit_inline(n, func_name); Printf(f_cl, "\n(cffi:defcfun (\"%s\" %s)", name, func_name); String *ffitype = Swig_typemap_lookup("cout", n, ":pointer", 0); Printf(f_cl, " %s", ffitype); Delete(ffitype); for (Parm *p = pl; p; p = nextSibling(p), argnum++) { if (SwigType_isvarargs(Getattr(p, "type"))) { Printf(f_cl, "\n %s", NewString("&rest")); continue; } String *argname = Getattr(p, "name"); ffitype = Swig_typemap_lookup("cin", p, "", 0); int tempargname = 0; if (!argname) { argname = NewStringf("arg%d", argnum); tempargname = 1; } else if (Strcmp(argname, "t") == 0 || Strcmp(argname, "T") == 0) { argname = NewStringf("t_arg%d", argnum); tempargname = 1; } Printf(f_cl, "\n (%s %s)", argname, ffitype); Delete(ffitype); if (tempargname) Delete(argname); } Printf(f_cl, ")\n"); /* finish arg list */ emit_export(n, func_name); } int CFFI::constantWrapper(Node *n) { String *type = Getattr(n, "type"); String *converted_value; if (SwigType_type(type) == T_STRING) { converted_value = NewString(Getattr(n, "rawval")); } else { converted_value = convert_literal(Getattr(n, "value"), type); } String *name = lispify_name(n, Getattr(n, "sym:name"), "'constant"); if (Strcmp(name, "t") == 0 || Strcmp(name, "T") == 0) name = NewStringf("t_var"); Printf(f_cl, "\n(cl:defconstant %s %s)\n", name, converted_value); Delete(converted_value); emit_export(n, name); return SWIG_OK; } int CFFI::variableWrapper(Node *n) { String *var_name = Getattr(n, "sym:name"); String *lisp_type = Swig_typemap_lookup("cin", n, "", 0); String *lisp_name = lispify_name(n, var_name, "'variable"); if (Strcmp(lisp_name, "t") == 0 || Strcmp(lisp_name, "T") == 0) lisp_name = NewStringf("t_var"); Printf(f_cl, "\n(cffi:defcvar (\"%s\" %s)\n %s)\n", var_name, lisp_name, lisp_type); Delete(lisp_type); emit_export(n, lisp_name); return SWIG_OK; } int CFFI::typedefHandler(Node *n) { if (generate_typedef_flag && strncmp(Char(Getattr(n, "type")), "enum", 4)) { String *lisp_name = lispify_name(n, Getattr(n, "name"), "'typename"); Printf(f_cl, "\n(cffi:defctype %s %s)\n", lisp_name, Swig_typemap_lookup("cin", n, "", 0)); emit_export(n, lisp_name); } return Language::typedefHandler(n); } int CFFI::enumDeclaration(Node *n) { if (getCurrentClass() && (cplus_mode != PUBLIC)) return SWIG_NOWRAP; String *name = Getattr(n, "sym:name"); bool slot_name_keywords; String *lisp_name = 0; if (name && Len(name) != 0) { lisp_name = lispify_name(n, name, "'enumname"); if (GetFlag(n, "feature:bitfield")) { Printf(f_cl, "\n(cffi:defbitfield %s", lisp_name); } else { Printf(f_cl, "\n(cffi:defcenum %s", lisp_name); } slot_name_keywords = true; //Registering the enum name to the cin and cout typemaps Parm *pattern = NewParm(name, NULL, n); Swig_typemap_register("cin", pattern, lisp_name, NULL, NULL); Swig_typemap_register("cout", pattern, lisp_name, NULL, NULL); Delete(pattern); //Registering with the kind, i.e., enum pattern = NewParm(NewStringf("enum %s", name), NULL, n); Swig_typemap_register("cin", pattern, lisp_name, NULL, NULL); Swig_typemap_register("cout", pattern, lisp_name, NULL, NULL); Delete(pattern); } else { Printf(f_cl, "\n(defanonenum %s", name); slot_name_keywords = false; } for (Node *c = firstChild(n); c; c = nextSibling(c)) { String *slot_name = lispify_name(c, Getattr(c, "name"), "'enumvalue", slot_name_keywords); String *value = Getattr(c, "enumvalue"); if (!value || GetFlag(n, "feature:bitfield:ignore_values")) Printf(f_cl, "\n\t%s", slot_name); else { String *type = Getattr(c, "type"); String *converted_value = convert_literal(value, type); Printf(f_cl, "\n\t(%s #.%s)", slot_name, converted_value); Delete(converted_value); } Delete(value); } Printf(f_cl, ")\n"); // No need to export keywords if (lisp_name && Len(lisp_name) != 0) { emit_export(n, lisp_name); } else { for (Node *c = firstChild(n); c; c = nextSibling(c)) emit_export(c, lispify_name(c, Getattr(c, "name"), "'enumvalue")); } return SWIG_OK; } void CFFI::emit_class(Node *n) { #ifdef CFFI_WRAP_DEBUG Printf(stderr, "emit_class: ENTER... '%s'(%p)\n", Getattr(n, "sym:name"), n); #endif String *name = Getattr(n, "sym:name"); String *lisp_name = lispify_name(n, lispy_name(Char(name)), "'classname"); String *bases = Getattr(n, "bases"); String *supers = NewString("("); if (bases) { int first = 1; for (Iterator i = First(bases); i.item; i = Next(i)) { if (!first) Printf(supers, " "); String *s = Getattr(i.item, "name"); Printf(supers, "%s", lispify_name(i.item, lispy_name(Char(s)), "'classname")); } } else { // Printf(supers,"ff:foreign-pointer"); } Printf(supers, ")"); Printf(f_clos, "\n(cl:defclass %s%s", lisp_name, supers); Printf(f_clos, "\n ((ff-pointer :reader ff-pointer)))\n\n"); Parm *pattern = NewParm(Getattr(n, "name"), NULL, n); Swig_typemap_register("lispclass", pattern, lisp_name, NULL, NULL); SwigType_add_pointer(Getattr(pattern, "type")); Swig_typemap_register("lispclass", pattern, lisp_name, NULL, NULL); SwigType_add_qualifier(Getattr(pattern, "type"), "const"); Swig_typemap_register("lispclass", pattern, lisp_name, NULL, NULL); SwigType_del_pointer(Getattr(pattern, "type")); SwigType_add_reference(Getattr(pattern, "type")); Swig_typemap_register("lispclass", pattern, lisp_name, NULL, NULL); #ifdef CFFI_WRAP_DEBUG Printf(stderr, " pattern %s name %s .. ... %s .\n", pattern, lisp_name); #endif Delete(pattern); // Walk children to generate type definition. String *slotdefs = NewString(" "); #ifdef CFFI_WRAP_DEBUG Printf(stderr, " walking children...\n"); #endif Node *c; for (c = firstChild(n); c; c = nextSibling(c)) { String *storage_type = Getattr(c, "storage"); if ((!Strcmp(nodeType(c), "cdecl") && (!storage_type || Strcmp(storage_type, "typedef")))) { String *access = Getattr(c, "access"); // hack. why would decl have a value of "variableHandler" and now "0"? String *childDecl = Getattr(c, "decl"); // Printf(stderr,"childDecl = '%s' (%s)\n", childDecl, Getattr(c,"view")); if (!Strcmp(childDecl, "0")) childDecl = NewString(""); SwigType *childType = NewStringf("%s%s", childDecl, Getattr(c, "type")); String *cname = (access && Strcmp(access, "public")) ? NewString("nil") : Copy(Getattr(c, "name")); if (!SwigType_isfunction(childType)) { // Printf(slotdefs, ";;; member functions don't appear as slots.\n "); // Printf(slotdefs, ";; "); // String *ns = listify_namespace(Getattr(n, "cffi:package")); String *ns = NewString(""); #ifdef CFFI_WRAP_DEBUG Printf(stderr, "slot name = '%s' ns = '%s' class-of '%s' and type = '%s'\n", cname, ns, name, childType); #endif Printf(slotdefs, "(#.(swig-insert-id \"%s\" %s :type :slot :class \"%s\") %s)", cname, ns, name, childType); //compose_foreign_type(childType) Delete(ns); if (access && Strcmp(access, "public")) Printf(slotdefs, " ;; %s member", access); Printf(slotdefs, "\n "); } Delete(childType); Delete(cname); } } // String *ns_list = listify_namespace(Getattr(n,"cffi:namespace")); // update_package_if_needed(n,f_clhead); // Printf(f_clos, // "(swig-def-foreign-class \"%s\"\n %s\n (:%s\n%s))\n\n", // name, supers, kind, slotdefs); Delete(supers); // Delete(ns_list); // Parm *pattern = NewParm(name, NULL, n); // Swig_typemap_register("cin",pattern,lisp_name,NULL,NULL); //Swig_typemap_register("cout",pattern,lisp_name,NULL,NULL); //Delete(pattern); #ifdef CFFI_WRAP_DEBUG Printf(stderr, "emit_class: EXIT\n"); #endif } // Includes structs void CFFI::emit_struct_union(Node *n, bool un = false) { #ifdef CFFI_DEBUG Printf(stderr, "struct/union %s\n", Getattr(n, "name")); Printf(stderr, "struct/union %s\n and %s", Getattr(n, "kind"), Getattr(n, "sym:name")); #endif String *name = Getattr(n, "sym:name"); String *kind = Getattr(n, "kind"); if (Strcmp(kind, "struct") != 0 && Strcmp(kind, "union") != 0) { Printf(stderr, "Don't know how to deal with %s kind of class yet.\n", kind); Printf(stderr, " (name: %s)\n", name); SWIG_exit(EXIT_FAILURE); } String *lisp_name = lispify_name(n, name, "'classname"); //Register the struct/union name to the cin and cout typemaps Parm *pattern = NewParm(name, NULL, n); Swig_typemap_register("cin", pattern, lisp_name, NULL, NULL); Swig_typemap_register("cout", pattern, lisp_name, NULL, NULL); Delete(pattern); //Registering with the kind, i.e., struct or union pattern = NewParm(NewStringf("%s %s", kind, name), NULL, n); Swig_typemap_register("cin", pattern, lisp_name, NULL, NULL); Swig_typemap_register("cout", pattern, lisp_name, NULL, NULL); Delete(pattern); if (un) { Printf(f_cl, "\n(cffi:defcunion %s", lisp_name); } else Printf(f_cl, "\n(cffi:defcstruct %s", lisp_name); for (Node *c = firstChild(n); c; c = nextSibling(c)) { #ifdef CFFI_DEBUG Printf(stderr, "struct/union %s\n", Getattr(c, "name")); Printf(stderr, "struct/union %s and %s \n", Getattr(c, "kind"), Getattr(c, "sym:name")); #endif if (Strcmp(nodeType(c), "cdecl")) { //C declaration ignore // Printf(stderr, "Structure %s has a slot that we can't deal with.\n", // name); // Printf(stderr, "nodeType: %s, name: %s, type: %s\n", // nodeType(c), // Getattr(c, "name"), // Getattr(c, "type")); // SWIG_exit(EXIT_FAILURE); } else { SwigType *childType = NewStringf("%s%s", Getattr(c, "decl"), Getattr(c, "type")); Node *node = NewHash(); Setattr(node, "type", childType); Setfile(node, Getfile(n)); Setline(node, Getline(n)); const String *tm = Swig_typemap_lookup("cin", node, "", 0); String *typespec = tm ? NewString(tm) : NewString(""); String *slot_name = lispify_name(c, Getattr(c, "sym:name"), "'slotname"); if (slot_name && (Strcmp(slot_name, "t") == 0 || Strcmp(slot_name, "T") == 0)) slot_name = NewStringf("t_var"); if (SwigType_isarray(childType) && SwigType_array_ndim(childType) == 1) { String *dim = SwigType_array_getdim(childType, 0); Printf(f_cl, "\n\t(%s %s :count %s)", slot_name, typespec, dim); Delete(dim); } else Printf(f_cl, "\n\t(%s %s)", slot_name, typespec); Delete(node); Delete(childType); Delete(typespec); } } Printf(f_cl, ")\n"); emit_export(n, lisp_name); for (Node *child = firstChild(n); child; child = nextSibling(child)) { if (!Strcmp(nodeType(child), "cdecl")) { emit_export(child, lispify_name(child, Getattr(child, "sym:name"), "'slotname")); } } /* Add this structure to the known lisp types */ //Printf(stdout, "Adding %s foreign type\n", name); // add_defined_foreign_type(name); } void CFFI::emit_export(Node *n, String *name) { if (GetInt(n, "feature:export")) { String* package = Getattr(n, "feature:export:package"); Printf(f_cl, "\n(cl:export '%s%s%s)\n", name, package ? " " : "", package ? package : ""); } } void CFFI::emit_inline(Node *n, String *name) { if (GetInt(n, "feature:inline")) Printf(f_cl, "\n(cl:declaim (cl:inline %s))\n", name); } String *CFFI::lispify_name(Node *n, String *ty, const char *flag, bool kw) { String *intern_func = Getattr(n, "feature:intern_function"); if (intern_func) { if (Strcmp(intern_func, "1") == 0) intern_func = NewStringf("swig-lispify"); return NewStringf("#.(%s \"%s\" %s%s)", intern_func, ty, flag, kw ? " :keyword" : ""); } else if (kw) return NewStringf(":%s", ty); else return ty; } /* utilities */ /* returns new string w/ parens stripped */ String *CFFI::strip_parens(String *string) { char *s = Char(string), *p; int len = Len(string); String *res; if (len == 0 || s[0] != '(' || s[len - 1] != ')') { return NewString(string); } p = (char *) malloc(len - 2 + 1); if (!p) { Printf(stderr, "Malloc failed\n"); SWIG_exit(EXIT_FAILURE); } strncpy(p, s + 1, len - 1); p[len - 2] = 0; /* null terminate */ res = NewString(p); free(p); return res; } String *CFFI::trim(String *str) { char *c = Char(str); while (*c != '\0' && isspace((int) *c)) ++c; String *result = NewString(c); Chop(result); return result; } String *CFFI::infix_to_prefix(String *val, char split_op, const String *op, String *type) { List *ored = Split(val, split_op, -1); // some float hackery //i don't understand it, if you do then please explain // if ( ((split_op == '+') || (split_op == '-')) && Len(ored) == 2 && // (SwigType_type(type) == T_FLOAT || SwigType_type(type) == T_DOUBLE || // SwigType_type(type) == T_LONGDOUBLE) ) { // // check that we're not splitting a float // String *possible_result = convert_literal(val, type, false); // if (possible_result) return possible_result; // } // try parsing the split results. if any part fails, kick out. bool part_failed = false; if (Len(ored) > 1) { String *result = NewStringf("(%s", op); for (Iterator i = First(ored); i.item; i = Next(i)) { String *converted = convert_literal(i.item, type); if (converted) { Printf(result, " %s", converted); Delete(converted); } else { part_failed = true; break; } } Printf(result, ")"); Delete(ored); return part_failed ? 0 : result; } else { Delete(ored); } return 0; } /* To be called by code generating the lisp interface Will return a String containing the literal based on type. Will return null if there are problems. try_to_split defaults to true (see stub above). */ String *CFFI::convert_literal(String *literal, String *type, bool try_to_split) { String *num_param = Copy(literal); String *trimmed = trim(num_param); String *num = strip_parens(trimmed), *res = 0; Delete(trimmed); char *s = Char(num); // very basic parsing of infix expressions. if (try_to_split) { if ((res = infix_to_prefix(num, '|', "cl:logior", type))) return res; if ((res = infix_to_prefix(num, '&', "cl:logand", type))) return res; if ((res = infix_to_prefix(num, '^', "cl:logxor", type))) return res; if ((res = infix_to_prefix(num, '*', "cl:*", type))) return res; if ((res = infix_to_prefix(num, '/', "cl:/", type))) return res; if ((res = infix_to_prefix(num, '+', "cl:+", type))) return res; if ((res = infix_to_prefix(num, '-', "cl:-", type))) return res; } if (SwigType_type(type) == T_FLOAT || SwigType_type(type) == T_DOUBLE || SwigType_type(type) == T_LONGDOUBLE) { // Use CL syntax for float literals // careful. may be a float identifier or float constant. char *num_start = Char(num); char *num_end = num_start + strlen(num_start) - 1; bool is_literal = isdigit(*num_start) || (*num_start == '.') || (*num_start == '+') || (*num_start == '-'); String *lisp_exp = 0; if (is_literal) { if (*num_end == 'f' || *num_end == 'F') { lisp_exp = NewString("f"); } else { lisp_exp = NewString("d"); } if (*num_end == 'l' || *num_end == 'L' || *num_end == 'f' || *num_end == 'F') { *num_end = '\0'; num_end--; } int exponents = Replaceall(num, "e", lisp_exp) + Replaceall(num, "E", lisp_exp); if (!exponents) Printf(num, "%s0", lisp_exp); if (exponents > 1 || (exponents + Replaceall(num, ".", ".") == 0)) { Delete(num); num = 0; } } return num; } else if (SwigType_type(type) == T_CHAR) { /* Use CL syntax for character literals */ String* result = NewStringf("#\\%s", s); Delete(num); return result; } else if (SwigType_type(type) == T_STRING) { /* Use CL syntax for string literals */ String* result = NewStringf("\"%s\"", num_param); Delete(num); return result; } else if (SwigType_type(type) == T_INT || SwigType_type(type) == T_UINT) { // Printf(stderr, "Is a T_INT or T_UINT %s, before replaceall\n", s); const char *num_start = Char(num); bool is_literal = isdigit(*num_start) || (*num_start == '.') || (*num_start == '+') || (*num_start == '-'); if (is_literal) { Replaceall(num, "u", ""); Replaceall(num, "U", ""); Replaceall(num, "l", ""); Replaceall(num, "L", ""); } int i, j; if (sscanf(s, "%d >> %d", &i, &j) == 2) { String* result = NewStringf("(cl:ash %d -%d)", i, j); Delete(num); return result; } else if (sscanf(s, "%d << %d", &i, &j) == 2) { String* result = NewStringf("(cl:ash %d %d)", i, j); Delete(num); return result; } } if (Len(num) >= 2 && s[0] == '0') { /* octal or hex */ if (s[1] == 'x'){ Replace(num,"0","#",DOH_REPLACE_FIRST); } else{ Replace(num,"0","#o",DOH_REPLACE_FIRST); } } return num; } //less flexible as it does the conversion in C, the lispify name does the conversion in lisp String *CFFI::lispy_name(char *name) { bool helper = false; String *new_name = NewString(""); for (unsigned int i = 0; i < strlen(name); i++) { if (name[i] == '_' || name[i] == '-') { Printf(new_name, "%c", '-'); helper = false; } else if (name[i] >= 'A' && name[i] <= 'Z') { if (helper) Printf(new_name, "%c", '-'); Printf(new_name, "%c", ('a' + (name[i] - 'A'))); helper = false; } else { helper = true; Printf(new_name, "%c", name[i]); } } return new_name; } extern "C" Language *swig_cffi(void) { return new CFFI(); } swig-4.0.1/Source/Modules/modula3.cxx0000644000175000017500000040426213527063513017320 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * modula3.cxx * * Modula3 language module for SWIG. * ----------------------------------------------------------------------------- */ /* Text formatted with indent -sob -br -ce -nut -npsl */ /* Report: - It's not a good concept to use member variables or global variables for passing parameters to functions. It's not a good concept to use functions of superclasses for specific services. E.g. For SWIG this means: Generating accessor functions for member variables is the most common but no general task to be processed in membervariableHandler. Better provide a service function which generates accessor function code and equip this service function with all parameters needed for input (parse node) and output (generated code). - How can I make globalvariableHandler not to generate interface functions to two accessor functions (that don't exist) ? - How can I generate a typemap that turns every C reference argument into its Modula 3 counterpart, that is void test(Complex &z); PROCEDURE test(VAR z:Complex); - neither $*n_mangle nor $*n_type nor $*n_ltype return the type without pointer converted to Modula3 equivalent, $*n_mangle is the variant closest to what I expect - using a typemap like typemap(m3wrapintype) int * %{VAR $1_name: INTEGER%} has the advantages: - one C parameter can be turned into multiple M3 parameters - the argument can be renamed - using typemaps like typemap(m3wrapinmode) int * "VAR" typemap(m3wrapintype) int * "INTEGER" has the advantages: - multiple parameters with same type and default value can be bundled - more conform to the other language modules - Where takes the reduction of multi-typemaps place? How can I preserve all parameters for functions of the intermediary class? The answer is Getattrs(n,"tmap:m3rawintype:next") - Char() can be used to transform a String to (char *) which can be used for output with printf - What is the while (checkAttribute()) loop in functionWrapper good for? Appearently for skipping (numinputs=0) typemaps. - SWIGTYPE const * - typemap is ignored, whereas SWIGTYPE * - typemap is invoked, why? Had it been (const SWIGTYPE *) instead? - enumeration items should definitely be equipped with its plain numerical value One could add tag 'numvalue' in CParse/parser.y, but it is still possible that someone declares an enumeration using a symbolic constant. I have quickly hacked that the successive number is assigned if "enumvalue" has suffix "+1". The ultimate solution would be to generate a C program which includes the header and outputs all constants. This program might be compiled and run by 'make' or by SWIG and the resulting output is fed back to SWIG. - It's a bad idea to interpret feature value "" 'disable feature' because the value "" might be sensible in case of feature:modula3:oldprefix. - What's the difference between "sym:name" and "name" ? "name" is the original name and "sym:name" is probably modified by the user using %rename - Is it possible for 'configure' to find out if m3pp is installed and to invoke it for generated Modula3 files? - It would be better to separate an arguments purpose and its name, because an output variable with name "OUTPUT" is not very descriptive. In case of PLPlot this could be solved by typedefs that assign special purposes to the array types. - Can one interpret $n_basetype as the identifier matched with SWIGTYPE ? SWIG's odds: - arguments of type (Node *) for SWIG functions should be most often better (const Node *): Swig_symbol_qualified, Getattr, nodeType, parentNode - unique identifier style instead of NewString, Getattr, firstChild - 'class'.name is qualified, 'enum'.name and 'enumitem'.name is not - Swig_symbol_qualified() returns NIL for enumeration nodes - Is there a function that creates a C representation of a SWIG type string? ToDo: - create WeakRefs only for resources returned by function marked with %newobject -> part of output conversion - clean typemap conception - should a multi-typemap for m3wrapouttype skip the corresponding input parameters? when yes - How to handle inout-arguments? In this case like in-argument. - C++ classes - C++ exceptions - allow for moving RECORD and OBJECT definitions to separate files, with the main type called T - call-back functions - special option: fast access to class members by pointer arithmetic, member offsets can be determined by a C++ program that print them. - emit enumeration definitions when its first item is declared, currently enumerations are emitted at the beginning of the file Done: - addThrow should convert the typemap by itself - not possible because routine for attaching mapped types to parameter nodes won't work for the function node - turning error codes into exceptions -> part of output value checking - create WeakRefs for resources allocated by the library -> part of output conversion - TRY..FINALLY..END; can be omitted - if there is no m3wrapfreearg - no exception can be raised in the body (empty RAISES) list */ #include "swigmod.h" #include // for INT_MAX #include #define USAGE_ARG_DIR "m3wrapargdir typemap expect values: in, out, inout\n" class MODULA3:public Language { public: enum block_type { no_block, constant, variable, blocktype, revelation }; private: struct M3File { String *f; Hash *import; block_type bt; /* VC++ 6 doesn't allow the access to 'no_block' if it is a private member of MODULA3 class */ M3File():f(NewString("")), import(NewHash()), bt(no_block) { } ~M3File() { Delete(f); Delete(import); } /* ----------------------------------------------------------------------------- * enterBlock() * * Make sure that a given declaration is written to the right declaration block, * that is constants are written after "CONST" and so on ... * ----------------------------------------------------------------------------- */ void enterBlock(block_type newbt) { static const char *ident[] = { "", "\nCONST\n", "\nVAR\n", "\nTYPE\n", "\nREVEAL\n" }; #ifdef DEBUG if ((bt < 0) || (4 < bt)) { printf("bt %d out of range\n", bt); } #endif if (newbt != bt) { Append(f, ident[newbt]); bt = newbt; } } }; static const char *usage; const String *empty_string; Hash *swig_types_hash; File *f_begin; File *f_runtime; File *f_header; File *f_wrappers; File *f_init; bool proxy_flag; // Flag for generating proxy classes bool have_default_constructor_flag; bool native_function_flag; // Flag for when wrapping a native function bool enum_constant_flag; // Flag for when wrapping an enum or constant bool static_flag; // Flag for when wrapping a static functions or member variables bool variable_wrapper_flag; // Flag for when wrapping a nonstatic member variable bool wrapping_member_flag; // Flag for when wrapping a member variable/enum/const bool global_variable_flag; // Flag for when wrapping a global variable bool old_variable_names; // Flag for old style variable names in the intermediary class bool unsafe_module; String *m3raw_name; // raw interface name M3File m3raw_intf; // raw interface M3File m3raw_impl; // raw implementation (usually empty) String *m3wrap_name; // wrapper module M3File m3wrap_intf; M3File m3wrap_impl; String *m3makefile; String *targetlibrary; String *proxy_class_def; String *proxy_class_code; String *proxy_class_name; String *variable_name; //Name of a variable being wrapped String *variable_type; //Type of this variable Hash *enumeration_coll; //Collection of all enumerations. /* The items are nodes with members: "items" - hash of with key 'itemname' and content 'itemvalue' "max" - maximum value in item list */ String *constant_values; String *constantfilename; String *renamefilename; String *typemapfilename; String *m3raw_imports; //intermediary class imports from %pragma String *module_imports; //module imports from %pragma String *m3raw_baseclass; //inheritance for intermediary class class from %pragma String *module_baseclass; //inheritance for module class from %pragma String *m3raw_interfaces; //interfaces for intermediary class class from %pragma String *module_interfaces; //interfaces for module class from %pragma String *m3raw_class_modifiers; //class modifiers for intermediary class overridden by %pragma String *m3wrap_modifiers; //class modifiers for module class overridden by %pragma String *upcasts_code; //C++ casts for inheritance hierarchies C++ code String *m3raw_cppcasts_code; //C++ casts up inheritance hierarchies intermediary class code String *destructor_call; //C++ destructor call if any String *outfile; enum type_additions { none, pointer, reference }; public: /* ----------------------------------------------------------------------------- * MODULA3() * ----------------------------------------------------------------------------- */ MODULA3(): empty_string(NewString("")), swig_types_hash(NULL), f_begin(NULL), f_runtime(NULL), f_header(NULL), f_wrappers(NULL), f_init(NULL), proxy_flag(true), have_default_constructor_flag(false), native_function_flag(false), enum_constant_flag(false), static_flag(false), variable_wrapper_flag(false), wrapping_member_flag(false), global_variable_flag(false), old_variable_names(false), unsafe_module(false), m3raw_name(NULL), m3raw_intf(), m3raw_impl(), m3wrap_name(NULL), m3wrap_intf(), m3wrap_impl(), m3makefile(NULL), targetlibrary(NULL), proxy_class_def(NULL), proxy_class_code(NULL), proxy_class_name(NULL), variable_name(NULL), variable_type(NULL), enumeration_coll(NULL), constant_values(NULL), constantfilename(NULL), renamefilename(NULL), typemapfilename(NULL), m3raw_imports(NULL), module_imports(NULL), m3raw_baseclass(NULL), module_baseclass(NULL), m3raw_interfaces(NULL), module_interfaces(NULL), m3raw_class_modifiers(NULL), m3wrap_modifiers(NULL), upcasts_code(NULL), m3raw_cppcasts_code(NULL), destructor_call(NULL), outfile(NULL) { } /************** some utility functions ***************/ /* ----------------------------------------------------------------------------- * getMappedType() * * Return the type of 'p' mapped by 'map'. * Print a standard warning if 'p' can't be mapped. * ----------------------------------------------------------------------------- */ String *getMappedType(Node *p, const char *map) { String *mapattr = NewString("tmap:"); Append(mapattr, map); String *tm = Getattr(p, mapattr); if (tm == NIL) { Swig_warning(WARN_MODULA3_TYPEMAP_TYPE_UNDEF, input_file, line_number, "No '%s' typemap defined for type '%s'\n", map, SwigType_str(Getattr(p, "type"), 0)); } Delete(mapattr); return tm; } /* ----------------------------------------------------------------------------- * getMappedTypeNew() * * Similar to getMappedType but uses Swig_type_lookup_new. * ----------------------------------------------------------------------------- */ String *getMappedTypeNew(Node *n, const char *map, const char *lname = "", bool warn = true) { String *tm = Swig_typemap_lookup(map, n, lname, 0); if ((tm == NIL) && warn) { Swig_warning(WARN_MODULA3_TYPEMAP_TYPE_UNDEF, input_file, line_number, "No '%s' typemap defined for type '%s'\n", map, SwigType_str(Getattr(n, "type"), 0)); } return tm; } /* ----------------------------------------------------------------------------- * attachMappedType() * * Obtain the type mapped by 'map' and attach it to the node * ----------------------------------------------------------------------------- */ void attachMappedType(Node *n, const char *map, const char *lname = "") { String *tm = Swig_typemap_lookup(map, n, lname, 0); if (tm != NIL) { String *attr = NewStringf("tmap:%s", map); Setattr(n, attr, tm); Delete(attr); } } /* ----------------------------------------------------------------------------- * skipIgnored() * * Skip all parameters that have 'numinputs=0' * with respect to a given typemap. * ----------------------------------------------------------------------------- */ Node *skipIgnored(Node *p, const char *map) { String *niattr = NewStringf("tmap:%s:numinputs", map); String *nextattr = NewStringf("tmap:%s:next", map); while ((p != NIL) && checkAttribute(p, niattr, "0")) { p = Getattr(p, nextattr); } Delete(nextattr); Delete(niattr); return p; } /* ----------------------------------------------------------------------------- * isInParam() * isOutParam() * * Check if the parameter is intended for input or for output. * ----------------------------------------------------------------------------- */ bool isInParam(Node *p) { String *dir = Getattr(p, "tmap:m3wrapargdir"); //printf("dir for %s: %s\n", Char(Getattr(p,"name")), Char(dir)); if ((dir == NIL) || (Strcmp(dir, "in") == 0) || (Strcmp(dir, "inout") == 0)) { return true; } else if (Strcmp(dir, "out") == 0) { return false; } else { printf("%s", USAGE_ARG_DIR); return false; } } bool isOutParam(Node *p) { String *dir = Getattr(p, "tmap:m3wrapargdir"); if ((dir == NIL) || (Strcmp(dir, "in") == 0)) { return false; } else if ((Strcmp(dir, "out") == 0) || (Strcmp(dir, "inout") == 0)) { return true; } else { printf("%s", USAGE_ARG_DIR); return false; } } /* ----------------------------------------------------------------------------- * printAttrs() * * For debugging: Show all attributes of a node and their values. * ----------------------------------------------------------------------------- */ void printAttrs(Node *n) { Iterator it; for (it = First(n); it.key != NIL; it = Next(it)) { printf("%s = %s\n", Char(it.key), Char(Getattr(n, it.key))); } } /* ----------------------------------------------------------------------------- * hasPrefix() * * Check if a string have a given prefix. * ----------------------------------------------------------------------------- */ bool hasPrefix(const String *str, const String *prefix) { int len_prefix = Len(prefix); return (Len(str) > len_prefix) && (Strncmp(str, prefix, len_prefix) == 0); } /* ----------------------------------------------------------------------------- * getQualifiedName() * * Return fully qualified identifier of n. * ----------------------------------------------------------------------------- */ #if 0 // Swig_symbol_qualified returns NIL for enumeration nodes String *getQualifiedName(Node *n) { String *qual = Swig_symbol_qualified(n); String *name = Getattr(n, "name"); if (hasContent(qual)) { return NewStringf("%s::%s", qual, name); } else { return name; } } #else String *getQualifiedName(Node *n) { String *name = Copy(Getattr(n, "name")); n = parentNode(n); while (n != NIL) { const String *type = nodeType(n); if ((Strcmp(type, "class") == 0) || (Strcmp(type, "struct") == 0) || (Strcmp(type, "namespace") == 0)) { String *newname = NewStringf("%s::%s", Getattr(n, "name"), name); Delete(name); //name = newname; // Hmpf, the class name is already qualified. return newname; } n = parentNode(n); } //printf("qualified name: %s\n", Char(name)); return name; } #endif /* ----------------------------------------------------------------------------- * nameToModula3() * * Turn usual C identifiers like "this_is_an_identifier" * into usual Modula 3 identifier like "thisIsAnIdentifier" * ----------------------------------------------------------------------------- */ String *nameToModula3(const String *sym, bool leadingCap) { int len_sym = Len(sym); char *csym = Char(sym); char *m3sym = new char[len_sym + 1]; int i, j; bool cap = leadingCap; for (i = 0, j = 0; j < len_sym; j++) { char c = csym[j]; if ((c == '_') || (c == ':')) { cap = true; } else { if (isdigit(c)) { m3sym[i] = c; cap = true; } else { if (cap) { m3sym[i] = (char)toupper(c); } else { m3sym[i] = (char)tolower(c); } cap = false; } i++; } } m3sym[i] = 0; String *result = NewString(m3sym); delete[]m3sym; return result; } /* ----------------------------------------------------------------------------- * capitalizeFirst() * * Make the first character upper case. * ----------------------------------------------------------------------------- */ String *capitalizeFirst(const String *str) { return NewStringf("%c%s", toupper(*Char(str)), Char(str) + 1); } /* ----------------------------------------------------------------------------- * prefixedNameToModula3() * * If feature modula3:oldprefix and modula3:newprefix is present * and the C identifier has leading 'oldprefix' * then it is replaced by the 'newprefix'. * The rest is converted to Modula style. * ----------------------------------------------------------------------------- */ String *prefixedNameToModula3(Node *n, const String *sym, bool leadingCap) { String *oldPrefix = Getattr(n, "feature:modula3:oldprefix"); String *newPrefix = Getattr(n, "feature:modula3:newprefix"); String *result = NewString(""); char *short_sym = Char(sym); // if at least one prefix feature is present // the replacement takes place if ((oldPrefix != NIL) || (newPrefix != NIL)) { if ((oldPrefix == NIL) || hasPrefix(sym, oldPrefix)) { short_sym += Len(oldPrefix); if (newPrefix != NIL) { Append(result, newPrefix); } } } String *suffix = nameToModula3(short_sym, leadingCap || hasContent(newPrefix)); Append(result, suffix); Delete(suffix); return result; } /* ----------------------------------------------------------------------------- * hasContent() * * Check if the string exists and contains something. * ----------------------------------------------------------------------------- */ bool hasContent(const String *str) { return (str != NIL) && (Strcmp(str, "") != 0); } /* ----------------------------------------------------------------------------- * openWriteFile() * * Caution: The file must be freshly allocated and will be destroyed * by this routine. * ----------------------------------------------------------------------------- */ File *openWriteFile(String *name) { File *file = NewFile(name, "w", SWIG_output_files()); if (!file) { FileErrorDisplay(name); SWIG_exit(EXIT_FAILURE); } Delete(name); return file; } /* ----------------------------------------------------------------------------- * aToL() * * like atol but with additional user warning * ----------------------------------------------------------------------------- */ long aToL(const String *value) { char *endptr; long numvalue = strtol(Char(value), &endptr, 0); if (*endptr != 0) { Swig_warning(WARN_MODULA3_BAD_ENUMERATION, input_file, line_number, "The string <%s> does not denote a numeric value.\n", value); } return numvalue; } /* ----------------------------------------------------------------------------- * strToL() * * like strtol but returns if the conversion was successful * ----------------------------------------------------------------------------- */ bool strToL(const String *value, long &numvalue) { char *endptr; numvalue = strtol(Char(value), &endptr, 0); return (*endptr == 0); } /* ----------------------------------------------------------------------------- * evalExpr() * * Evaluate simple expression as they may occur in "enumvalue" attributes. * ----------------------------------------------------------------------------- */ bool evalExpr(String *value, long &numvalue) { // Split changes file status of String and thus cannot receive 'const' strings //printf("evaluate <%s>\n", Char(value)); List *summands = Split(value, '+', INT_MAX); Iterator sm = First(summands); numvalue = 0; for (; sm.item != NIL; sm = Next(sm)) { String *smvalue = Getattr(constant_values, sm.item); long smnumvalue; if (smvalue != NIL) { if (!strToL(smvalue, smnumvalue)) { //printf("evaluation: abort 0 <%s>\n", Char(smvalue)); return false; } } else { if (!strToL(sm.item, smnumvalue)) { //printf("evaluation: abort 1 <%s>\n", Char(sm)); return false; } } numvalue += smnumvalue; } //printf("evaluation: return %ld\n", numvalue); return true; } /* ----------------------------------------------------------------------------- * log2() * * Determine the position of the single bit of a power of two. * Returns true if the given number is a power of two. * ----------------------------------------------------------------------------- */ bool log2(long n, long &exp) { exp = 0; while (n > 0) { if ((n & 1) != 0) { return n == 1; } exp++; n >>= 1; } return false; } /* ----------------------------------------------------------------------------- * writeArg * * Write a function argument or RECORD entry definition. * Bundles arguments of same type and default value. * 'name.next==NIL' denotes the end of the entry or argument list. * ----------------------------------------------------------------------------- */ bool equalNilStr(const String *str0, const String *str1) { if (str0 == NIL) { return (str1 == NIL); //return (str0==NIL) == (str1==NIL); } else { return (str1 != NIL) && (Cmp(str0, str1) == 0); //return Cmp(str0,str1)==0; } } struct writeArgState { String *mode, *name, *type, *value; bool hold; writeArgState():mode(NIL), name(NIL), type(NIL), value(NIL), hold(false) { } }; void writeArg(File *f, writeArgState & state, String *mode, String *name, String *type, String *value) { /* skip the first argument, only store the information for the next call in this case */ if (state.name != NIL) { if ((!state.hold) && (state.mode != NIL)) { Printf(f, "%s ", state.mode); } if ((name != NIL) && equalNilStr(state.mode, mode) && equalNilStr(state.type, type) && (state.value == NIL) && (value == NIL) /* the same expression may have different values due to side effects of the called function */ /*equalNilStr(state.value,value) */ ) { Printf(f, "%s, ", state.name); state.hold = true; } else { Append(f, state.name); if (state.type != NIL) { Printf(f, ": %s", state.type); } if (state.value != NIL) { Printf(f, ":= %s", state.value); } Append(f, ";\n"); state.hold = false; } } /* at the next call the current argument will be the previous one */ state.mode = mode; state.name = name; state.type = type; state.value = value; } /* ----------------------------------------------------------------------------- * getProxyName() * * Test to see if a type corresponds to something wrapped with a proxy class * Return NULL if not otherwise the proxy class name * ----------------------------------------------------------------------------- */ String *getProxyName(SwigType *t) { if (proxy_flag) { Node *n = classLookup(t); if (n) { return Getattr(n, "sym:name"); } } return NULL; } /*************** language processing ********************/ /* ------------------------------------------------------------ * main() * ------------------------------------------------------------ */ virtual void main(int argc, char *argv[]) { SWIG_library_directory("modula3"); // Look for certain command line options for (int i = 1; i < argc; i++) { if (argv[i]) { if (strcmp(argv[i], "-generateconst") == 0) { if (argv[i + 1]) { constantfilename = NewString(argv[i + 1]); Swig_mark_arg(i); Swig_mark_arg(i + 1); i++; } else { Swig_arg_error(); } } else if (strcmp(argv[i], "-generaterename") == 0) { if (argv[i + 1]) { renamefilename = NewString(argv[i + 1]); Swig_mark_arg(i); Swig_mark_arg(i + 1); i++; } else { Swig_arg_error(); } } else if (strcmp(argv[i], "-generatetypemap") == 0) { if (argv[i + 1]) { typemapfilename = NewString(argv[i + 1]); Swig_mark_arg(i); Swig_mark_arg(i + 1); i++; } else { Swig_arg_error(); } } else if (strcmp(argv[i], "-noproxy") == 0) { Swig_mark_arg(i); proxy_flag = false; } else if (strcmp(argv[i], "-oldvarnames") == 0) { Swig_mark_arg(i); old_variable_names = true; } else if (strcmp(argv[i], "-help") == 0) { Printf(stdout, "%s\n", usage); } } } // Add a symbol to the parser for conditional compilation Preprocessor_define("SWIGMODULA3 1", 0); // Add typemap definitions SWIG_typemap_lang("modula3"); SWIG_config_file("modula3.swg"); allow_overloading(); } /* --------------------------------------------------------------------- * top() * --------------------------------------------------------------------- */ virtual int top(Node *n) { if (hasContent(constantfilename) || hasContent(renamefilename) || hasContent(typemapfilename)) { int result = SWIG_OK; if (hasContent(constantfilename)) { result = generateConstantTop(n) && result; } if (hasContent(renamefilename)) { result = generateRenameTop(n) && result; } if (hasContent(typemapfilename)) { result = generateTypemapTop(n) && result; } return result; } else { return generateM3Top(n); } } void scanConstant(File *file, Node *n) { Node *child = firstChild(n); while (child != NIL) { String *constname = NIL; String *type = nodeType(child); if ((Strcmp(type, "enumitem") == 0) || (Strcmp(type, "constant") == 0)) { #if 1 constname = getQualifiedName(child); #else constname = Getattr(child, "value"); if ((!hasContent(constname)) || (('0' <= *Char(constname)) && (*Char(constname) <= '9'))) { constname = Getattr(child, "name"); } #endif } if (constname != NIL) { Printf(file, " printf(\"%%%%constnumeric(%%Lg) %s;\\n\", (long double)%s);\n", constname, constname); } scanConstant(file, child); child = nextSibling(child); } } int generateConstantTop(Node *n) { File *file = openWriteFile(NewStringf("%s.c", constantfilename)); if (CPlusPlus) { Printf(file, "#include \n"); } else { Printf(file, "#include \n"); } Printf(file, "#include \"%s\"\n", input_file); Printf(file, "\n"); Printf(file, "int main (int argc, char *argv[]) {\n"); Printf(file, "\ /*This program must work for floating point numbers and integers.\n\ Thus all numbers are converted to double precision floating point format.*/\n"); scanConstant(file, n); Printf(file, " return 0;\n"); Printf(file, "}\n"); Delete(file); return SWIG_OK; } void scanRename(File *file, Node *n) { Node *child = firstChild(n); while (child != NIL) { String *type = nodeType(child); if (Strcmp(type, "cdecl") == 0) { ParmList *p = Getattr(child, "parms"); if (p != NIL) { String *name = getQualifiedName(child); String *m3name = nameToModula3(name, true); /*don't know how to get the original C type identifiers */ //String *arguments = createCSignature (child); Printf(file, "%%rename(\"%s\") %s;\n", m3name, name); /*Printf(file, "%%rename(\"%s\") %s %s(%s);\n", m3name, Getattr(n,"type"), name, arguments); */ Delete(name); Delete(m3name); //Delete (arguments); } } scanRename(file, child); child = nextSibling(child); } } int generateRenameTop(Node *n) { File *file = openWriteFile(NewStringf("%s.i", renamefilename)); Printf(file, "\ /* This file was generated from %s\n\ by SWIG with option -generaterename. */\n\ \n", input_file); scanRename(file, n); Delete(file); return SWIG_OK; } void scanTypemap(File *file, Node *n) { Node *child = firstChild(n); while (child != NIL) { String *type = nodeType(child); //printf("nodetype %s\n", Char(type)); String *storage = Getattr(child, "storage"); if ((Strcmp(type, "class") == 0) || ((Strcmp(type, "cdecl") == 0) && (storage != NIL) && (Strcmp(storage, "typedef") == 0))) { String *name = getQualifiedName(child); String *m3name = nameToModula3(name, true); Printf(file, "%%typemap(\"m3wrapintype\") %s %%{%s%%}\n", name, m3name); Printf(file, "%%typemap(\"m3rawintype\") %s %%{%s%%}\n", name, m3name); Printf(file, "\n"); } scanTypemap(file, child); child = nextSibling(child); } } int generateTypemapTop(Node *n) { File *file = openWriteFile(NewStringf("%s.i", typemapfilename)); Printf(file, "\ /* This file was generated from %s\n\ by SWIG with option -generatetypemap. */\n\ \n", input_file); scanTypemap(file, n); Delete(file); return SWIG_OK; } int generateM3Top(Node *n) { /* Initialize all of the output files */ outfile = Getattr(n, "outfile"); f_begin = NewFile(outfile, "w", SWIG_output_files()); if (!f_begin) { FileErrorDisplay(outfile); SWIG_exit(EXIT_FAILURE); } f_runtime = NewString(""); f_init = NewString(""); f_header = NewString(""); f_wrappers = NewString(""); m3makefile = NewString(""); /* Register file targets with the SWIG file handler */ Swig_register_filebyname("header", f_header); Swig_register_filebyname("wrapper", f_wrappers); Swig_register_filebyname("begin", f_begin); Swig_register_filebyname("runtime", f_runtime); Swig_register_filebyname("init", f_init); Swig_register_filebyname("m3rawintf", m3raw_intf.f); Swig_register_filebyname("m3rawimpl", m3raw_impl.f); Swig_register_filebyname("m3wrapintf", m3wrap_intf.f); Swig_register_filebyname("m3wrapimpl", m3wrap_impl.f); Swig_register_filebyname("m3makefile", m3makefile); swig_types_hash = NewHash(); String *name = Getattr(n, "name"); // Make the intermediary class and module class names. The intermediary class name can be set in the module directive. Node *optionsnode = Getattr(Getattr(n, "module"), "options"); if (optionsnode != NIL) { String *m3raw_name_tmp = Getattr(optionsnode, "m3rawname"); if (m3raw_name_tmp != NIL) { m3raw_name = Copy(m3raw_name_tmp); } } if (m3raw_name == NIL) { m3raw_name = NewStringf("%sRaw", name); } Setattr(m3wrap_impl.import, m3raw_name, ""); m3wrap_name = Copy(name); proxy_class_def = NewString(""); proxy_class_code = NewString(""); m3raw_baseclass = NewString(""); m3raw_interfaces = NewString(""); m3raw_class_modifiers = NewString(""); // package access only to the intermediary class by default m3raw_imports = NewString(""); m3raw_cppcasts_code = NewString(""); m3wrap_modifiers = NewString("public"); module_baseclass = NewString(""); module_interfaces = NewString(""); module_imports = NewString(""); upcasts_code = NewString(""); Swig_banner(f_begin); Printf(f_runtime, "\n\n#ifndef SWIGMODULA3\n#define SWIGMODULA3\n#endif\n\n"); Swig_name_register("wrapper", "Modula3_%f"); if (old_variable_names) { Swig_name_register("set", "set_%n%v"); Swig_name_register("get", "get_%n%v"); } Printf(f_wrappers, "\n#ifdef __cplusplus\n"); Printf(f_wrappers, "extern \"C\" {\n"); Printf(f_wrappers, "#endif\n\n"); constant_values = NewHash(); scanForConstPragmas(n); enumeration_coll = NewHash(); collectEnumerations(enumeration_coll, n); /* Emit code */ Language::top(n); // Generate m3makefile // This will be unnecessary if SWIG is invoked from Quake. { File *file = openWriteFile(NewStringf("%sm3makefile", SWIG_output_directory())); Printf(file, "%% automatically generated quake file for %s\n\n", name); /* Write the fragments written by '%insert' collected while 'top' processed the parse tree */ Printv(file, m3makefile, NIL); Printf(file, "import(\"libm3\")\n"); //Printf(file, "import_lib(\"%s\",\"/usr/lib\")\n", name); Printf(file, "module(\"%s\")\n", m3raw_name); Printf(file, "module(\"%s\")\n\n", m3wrap_name); if (targetlibrary != NIL) { Printf(file, "library(\"%s\")\n", targetlibrary); } else { Printf(file, "library(\"m3%s\")\n", name); } Delete(file); } // Generate the raw interface { File *file = openWriteFile(NewStringf("%s%s.i3", SWIG_output_directory(), m3raw_name)); emitBanner(file); Printf(file, "INTERFACE %s;\n\n", m3raw_name); emitImportStatements(m3raw_intf.import, file); Printf(file, "\n"); // Write the interface generated within 'top' Printv(file, m3raw_intf.f, NIL); Printf(file, "\nEND %s.\n", m3raw_name); Delete(file); } // Generate the raw module { File *file = openWriteFile(NewStringf("%s%s.m3", SWIG_output_directory(), m3raw_name)); emitBanner(file); Printf(file, "MODULE %s;\n\n", m3raw_name); emitImportStatements(m3raw_impl.import, file); Printf(file, "\n"); // will be empty usually Printv(file, m3raw_impl.f, NIL); Printf(file, "BEGIN\nEND %s.\n", m3raw_name); Delete(file); } // Generate the interface for the comfort wrappers { File *file = openWriteFile(NewStringf("%s%s.i3", SWIG_output_directory(), m3wrap_name)); emitBanner(file); Printf(file, "INTERFACE %s;\n", m3wrap_name); emitImportStatements(m3wrap_intf.import, file); Printf(file, "\n"); { Iterator it = First(enumeration_coll); if (it.key != NIL) { Printf(file, "TYPE\n"); } for (; it.key != NIL; it = Next(it)) { Printf(file, "\n"); emitEnumeration(file, it.key, it.item); } } // Add the wrapper methods Printv(file, m3wrap_intf.f, NIL); // Finish off the class Printf(file, "\nEND %s.\n", m3wrap_name); Delete(file); } // Generate the wrapper routines implemented in Modula 3 { File *file = openWriteFile(NewStringf("%s%s.m3", SWIG_output_directory(), m3wrap_name)); emitBanner(file); if (unsafe_module) { Printf(file, "UNSAFE "); } Printf(file, "MODULE %s;\n\n", m3wrap_name); emitImportStatements(m3wrap_impl.import, file); Printf(file, "\n"); // Add the wrapper methods Printv(file, m3wrap_impl.f, NIL); Printf(file, "\nBEGIN\nEND %s.\n", m3wrap_name); Delete(file); } if (upcasts_code) Printv(f_wrappers, upcasts_code, NIL); Printf(f_wrappers, "#ifdef __cplusplus\n"); Printf(f_wrappers, "}\n"); Printf(f_wrappers, "#endif\n"); // Output a Modula 3 type wrapper class for each SWIG type for (Iterator swig_type = First(swig_types_hash); swig_type.item != NIL; swig_type = Next(swig_type)) { emitTypeWrapperClass(swig_type.key, swig_type.item); } Delete(swig_types_hash); swig_types_hash = NULL; Delete(constant_values); constant_values = NULL; Delete(enumeration_coll); enumeration_coll = NULL; Delete(m3raw_name); m3raw_name = NULL; Delete(m3raw_baseclass); m3raw_baseclass = NULL; Delete(m3raw_interfaces); m3raw_interfaces = NULL; Delete(m3raw_class_modifiers); m3raw_class_modifiers = NULL; Delete(m3raw_imports); m3raw_imports = NULL; Delete(m3raw_cppcasts_code); m3raw_cppcasts_code = NULL; Delete(proxy_class_def); proxy_class_def = NULL; Delete(proxy_class_code); proxy_class_code = NULL; Delete(m3wrap_name); m3wrap_name = NULL; Delete(m3wrap_modifiers); m3wrap_modifiers = NULL; Delete(targetlibrary); targetlibrary = NULL; Delete(module_baseclass); module_baseclass = NULL; Delete(module_interfaces); module_interfaces = NULL; Delete(module_imports); module_imports = NULL; Delete(upcasts_code); upcasts_code = NULL; Delete(constantfilename); constantfilename = NULL; Delete(renamefilename); renamefilename = NULL; Delete(typemapfilename); typemapfilename = NULL; /* Close all of the files */ Dump(f_runtime, f_begin); Dump(f_header, f_begin); Dump(f_wrappers, f_begin); Wrapper_pretty_print(f_init, f_begin); Delete(f_header); Delete(f_wrappers); Delete(f_init); Delete(f_runtime); Delete(f_begin); return SWIG_OK; } /* ----------------------------------------------------------------------------- * emitBanner() * ----------------------------------------------------------------------------- */ void emitBanner(File *f) { Printf(f, "(*******************************************************************************\n"); Swig_banner_target_lang(f, " *"); Printf(f, "*******************************************************************************)\n\n"); } /* ---------------------------------------------------------------------- * nativeWrapper() * ---------------------------------------------------------------------- */ virtual int nativeWrapper(Node *n) { String *wrapname = Getattr(n, "wrap:name"); if (!addSymbol(wrapname, n)) return SWIG_ERROR; if (Getattr(n, "type")) { Swig_save("nativeWrapper", n, "name", NIL); Setattr(n, "name", wrapname); native_function_flag = true; functionWrapper(n); Swig_restore(n); native_function_flag = false; } else { Swig_error(input_file, line_number, "No return type for %%native method %s.\n", Getattr(n, "wrap:name")); } return SWIG_OK; } /* ---------------------------------------------------------------------- * functionWrapper() * ---------------------------------------------------------------------- */ virtual int functionWrapper(Node *n) { String *type = nodeType(n); String *funcType = Getattr(n, "modula3:functype"); String *rawname = Getattr(n, "name"); String *symname = Getattr(n, "sym:name"); String *capname = capitalizeFirst(symname); //String *wname = Swig_name_wrapper(symname); //printf("function: %s\n", Char(symname)); //printf(" purpose: %s\n", Char(funcType)); if (Strcmp(type, "cdecl") == 0) { if (funcType == NIL) { // no wrapper needed for plain functions emitM3RawPrototype(n, rawname, symname); emitM3Wrapper(n, symname); } else if (Strcmp(funcType, "method") == 0) { Setattr(n, "modula3:funcname", capname); emitCWrapper(n, capname); emitM3RawPrototype(n, capname, capname); emitM3Wrapper(n, capname); } else if (Strcmp(funcType, "accessor") == 0) { /* * Generate the proxy class properties for public member variables. * Not for enums and constants. */ if (proxy_flag && wrapping_member_flag && !enum_constant_flag) { // Capitalize the first letter in the function name Setattr(n, "proxyfuncname", capname); Setattr(n, "imfuncname", symname); if (hasPrefix(capname, "Set")) { Setattr(n, "modula3:setname", capname); } else { Setattr(n, "modula3:getname", capname); } emitCWrapper(n, capname); emitM3RawPrototype(n, capname, capname); emitM3Wrapper(n, capname); //proxyClassFunctionHandler(n); } #ifdef DEBUG } else { Swig_warning(WARN_MODULA3_BAD_ENUMERATION, input_file, line_number, "Function type <%s> unknown.\n", Char(funcType)); #endif } } else if ((Strcmp(type, "constructor") == 0) || (Strcmp(type, "destructor") == 0)) { emitCWrapper(n, capname); emitM3RawPrototype(n, capname, capname); emitM3Wrapper(n, capname); } // a Java relict #if 0 if (!(proxy_flag && is_wrapping_class()) && !enum_constant_flag) { emitM3Wrapper(n, capname); } #endif Delete(capname); return SWIG_OK; } /* ---------------------------------------------------------------------- * emitCWrapper() * * Generate the wrapper in C which calls C++ methods. * ---------------------------------------------------------------------- */ virtual int emitCWrapper(Node *n, const String *wname) { String *rawname = Getattr(n, "name"); String *c_return_type = NewString(""); String *cleanup = NewString(""); String *outarg = NewString(""); String *body = NewString(""); Hash *throws_hash = NewHash(); ParmList *l = Getattr(n, "parms"); SwigType *t = Getattr(n, "type"); String *symname = Getattr(n, "sym:name"); if (!Getattr(n, "sym:overloaded")) { if (!addSymbol(wname, n)) { return SWIG_ERROR; } } // A new wrapper function object Wrapper *f = NewWrapper(); /* Attach the non-standard typemaps to the parameter list. */ Swig_typemap_attach_parms("ctype", l, f); /* Get return types */ { String *tm = getMappedTypeNew(n, "ctype", ""); if (tm != NIL) { Printf(c_return_type, "%s", tm); } } bool is_void_return = (Cmp(c_return_type, "void") == 0); if (!is_void_return) { Wrapper_add_localv(f, "cresult", c_return_type, "cresult = 0", NIL); } Printv(f->def, " SWIGEXPORT ", c_return_type, " ", wname, "(", NIL); // Emit all of the local variables for holding arguments. emit_parameter_variables(l, f); /* Attach the standard typemaps */ emit_attach_parmmaps(l, f); Setattr(n, "wrap:parms", l); // Generate signature and argument conversion for C wrapper { Parm *p; attachParameterNames(n, "tmap:name", "c:wrapname", "m3arg%d"); bool gencomma = false; for (p = skipIgnored(l, "in"); p; p = skipIgnored(p, "in")) { String *arg = Getattr(p, "c:wrapname"); { /* Get the ctype types of the parameter */ String *c_param_type = getMappedType(p, "ctype"); // Add parameter to C function Printv(f->def, gencomma ? ", " : "", c_param_type, " ", arg, NIL); Delete(c_param_type); gencomma = true; } // Get typemap for this argument String *tm = getMappedType(p, "in"); if (tm != NIL) { addThrows(throws_hash, "in", p); Replaceall(tm, "$input", arg); Setattr(p, "emit:input", arg); /*??? */ Printf(f->code, "%s\n", tm); p = Getattr(p, "tmap:in:next"); } else { p = nextSibling(p); } } } /* Insert constraint checking code */ { Parm *p; for (p = l; p;) { String *tm = Getattr(p, "tmap:check"); if (tm != NIL) { addThrows(throws_hash, "check", p); Replaceall(tm, "$target", Getattr(p, "lname")); /* deprecated */ Replaceall(tm, "$arg", Getattr(p, "emit:input")); /* deprecated? */ Replaceall(tm, "$input", Getattr(p, "emit:input")); Printv(f->code, tm, "\n", NIL); p = Getattr(p, "tmap:check:next"); } else { p = nextSibling(p); } } } /* Insert cleanup code */ { Parm *p; for (p = l; p;) { String *tm = Getattr(p, "tmap:freearg"); if (tm != NIL) { addThrows(throws_hash, "freearg", p); Replaceall(tm, "$source", Getattr(p, "emit:input")); /* deprecated */ Replaceall(tm, "$arg", Getattr(p, "emit:input")); /* deprecated? */ Replaceall(tm, "$input", Getattr(p, "emit:input")); Printv(cleanup, tm, "\n", NIL); p = Getattr(p, "tmap:freearg:next"); } else { p = nextSibling(p); } } } /* Insert argument output code */ { Parm *p; for (p = l; p;) { String *tm = Getattr(p, "tmap:argout"); if (tm != NIL) { addThrows(throws_hash, "argout", p); Replaceall(tm, "$source", Getattr(p, "emit:input")); /* deprecated */ Replaceall(tm, "$target", Getattr(p, "lname")); /* deprecated */ Replaceall(tm, "$arg", Getattr(p, "emit:input")); /* deprecated? */ Replaceall(tm, "$result", "cresult"); Replaceall(tm, "$input", Getattr(p, "emit:input")); Printv(outarg, tm, "\n", NIL); p = Getattr(p, "tmap:argout:next"); } else { p = nextSibling(p); } } } // Get any Modula 3 exception classes in the throws typemap ParmList *throw_parm_list = NULL; if ((throw_parm_list = Getattr(n, "catchlist"))) { Swig_typemap_attach_parms("throws", throw_parm_list, f); Parm *p; for (p = throw_parm_list; p; p = nextSibling(p)) { addThrows(throws_hash, "throws", p); } } Setattr(n, "wrap:name", wname); // Now write code to make the function call if (!native_function_flag) { String *actioncode = emit_action(n); /* Return value if necessary */ String *tm; if ((tm = Swig_typemap_lookup_out("out", n, Swig_cresult_name(), f, actioncode))) { addThrows(throws_hash, "out", n); Replaceall(tm, "$source", Swig_cresult_name()); /* deprecated */ Replaceall(tm, "$target", "cresult"); /* deprecated */ Replaceall(tm, "$result", "cresult"); Printf(f->code, "%s", tm); if (hasContent(tm)) Printf(f->code, "\n"); } else { Swig_warning(WARN_TYPEMAP_OUT_UNDEF, input_file, line_number, "Unable to use return type %s in function %s.\n", SwigType_str(t, 0), rawname); } emit_return_variable(n, t, f); } /* Output argument output code */ Printv(f->code, outarg, NIL); /* Output cleanup code */ Printv(f->code, cleanup, NIL); /* Look to see if there is any newfree cleanup code */ if (GetFlag(n, "feature:new")) { String *tm = Swig_typemap_lookup("newfree", n, Swig_cresult_name(), 0); if (tm != NIL) { addThrows(throws_hash, "newfree", n); Replaceall(tm, "$source", Swig_cresult_name()); /* deprecated */ Printf(f->code, "%s\n", tm); } } /* See if there is any return cleanup code */ if (!native_function_flag) { String *tm = Swig_typemap_lookup("ret", n, Swig_cresult_name(), 0); if (tm != NIL) { Replaceall(tm, "$source", Swig_cresult_name()); /* deprecated */ Printf(f->code, "%s\n", tm); } } /* Finish C wrapper */ Printf(f->def, ") {"); if (!is_void_return) Printv(f->code, " return cresult;\n", NIL); Printf(f->code, "}\n"); /* Substitute the cleanup code */ Replaceall(f->code, "$cleanup", cleanup); /* Substitute the function name */ Replaceall(f->code, "$symname", symname); if (!is_void_return) { Replaceall(f->code, "$null", "0"); } else { Replaceall(f->code, "$null", ""); } /* Dump the function out */ if (!native_function_flag) { Wrapper_print(f, f_wrappers); } Delete(c_return_type); Delete(cleanup); Delete(outarg); Delete(body); Delete(throws_hash); DelWrapper(f); return SWIG_OK; } /* ---------------------------------------------------------------------- * emitM3RawPrototype() * * Generate an EXTERNAL procedure declaration in Modula 3 * which is the interface to an existing C routine or a C wrapper. * ---------------------------------------------------------------------- */ virtual int emitM3RawPrototype(Node *n, const String *cname, const String *m3name) { String *im_return_type = NewString(""); //String *symname = Getattr(n,"sym:name"); ParmList *l = Getattr(n, "parms"); /* Attach the non-standard typemaps to the parameter list. */ Swig_typemap_attach_parms("m3rawinmode", l, NULL); Swig_typemap_attach_parms("m3rawintype", l, NULL); /* Get return types */ bool has_return; { String *tm = getMappedTypeNew(n, "m3rawrettype", ""); if (tm != NIL) { Printf(im_return_type, "%s", tm); } has_return = hasContent(tm); } /* cname is the original name if 'n' denotes a C function and it is the relabeled name (sym:name) if 'n' denotes a C++ method or similar */ m3raw_intf.enterBlock(no_block); Printf(m3raw_intf.f, "\n<* EXTERNAL %s *>\nPROCEDURE %s (", cname, m3name); // Generate signature for raw interface { Parm *p; writeArgState state; attachParameterNames(n, "tmap:rawinname", "modula3:rawname", "arg%d"); for (p = skipIgnored(l, "m3rawintype"); p; p = skipIgnored(p, "m3rawintype")) { /* Get argument passing mode, should be one of VALUE, VAR, READONLY */ String *mode = Getattr(p, "tmap:m3rawinmode"); String *argname = Getattr(p, "modula3:rawname"); String *im_param_type = getMappedType(p, "m3rawintype"); addImports(m3raw_intf.import, "m3rawintype", p); writeArg(m3raw_intf.f, state, mode, argname, im_param_type, NIL); if (im_param_type != NIL) { p = Getattr(p, "tmap:m3rawintype:next"); } else { p = nextSibling(p); } } writeArg(m3raw_intf.f, state, NIL, NIL, NIL, NIL); } /* Finish M3 raw prototype */ Printf(m3raw_intf.f, ")"); // neither a C wrapper nor a plain C function may throw an exception //generateThrowsClause(throws_hash, m3raw_intf.f); if (has_return) { Printf(m3raw_intf.f, ": %s", im_return_type); } Printf(m3raw_intf.f, ";\n"); Delete(im_return_type); return SWIG_OK; } /* ----------------------------------------------------------------------- * variableWrapper() * ----------------------------------------------------------------------- */ virtual int variableWrapper(Node *n) { Language::variableWrapper(n); return SWIG_OK; } /* ----------------------------------------------------------------------- * globalvariableHandler() * ----------------------------------------------------------------------- */ virtual int globalvariableHandler(Node *n) { SwigType *t = Getattr(n, "type"); String *tm; // Get the variable type if ((tm = getMappedTypeNew(n, "m3wraptype", ""))) { substituteClassname(t, tm); } variable_name = Getattr(n, "sym:name"); variable_type = Copy(tm); // Get the variable type expressed in terms of Modula 3 equivalents of C types if ((tm = getMappedTypeNew(n, "m3rawtype", ""))) { m3raw_intf.enterBlock(no_block); Printf(m3raw_intf.f, "\n<* EXTERNAL *> VAR %s: %s;\n", variable_name, tm); } // Output the property's accessor methods /* global_variable_flag = true; int ret = Language::globalvariableHandler(n); global_variable_flag = false; */ Printf(m3wrap_impl.f, "\n\n"); //return ret; return 1; } long getConstNumeric(Node *n) { String *constnumeric = Getfeature(n, "constnumeric"); String *name = Getattr(n, "name"); long numvalue; if (constnumeric == NIL) { Swig_warning(WARN_MODULA3_BAD_ENUMERATION, input_file, line_number, "Feature 'constnumeric' is necessary to obtain value of %s.\n", name); return 0; } else if (!strToL(constnumeric, numvalue)) { Swig_warning(WARN_MODULA3_BAD_ENUMERATION, input_file, line_number, "The feature 'constnumeric' of %s specifies value <%s> which is not an integer constant.\n", name, constnumeric); return 0; } else { return numvalue; } } /* ------------------------------------------------------------------------ * generateIntConstant() * * Considers node as an integer constant definition * and generate a Modula 3 constant definition. * ------------------------------------------------------------------------ */ void generateIntConstant(Node *n, String *name) { String *value = Getattr(n, "value"); String *type = Getfeature(n, "modula3:constint:type"); String *conv = Getfeature(n, "modula3:constint:conv"); if (name == NIL) { name = Getattr(n, "sym:name"); } long numvalue; bool isSimpleNum = strToL(value, numvalue); if (!isSimpleNum) { numvalue = getConstNumeric(n); } String *m3value; if ((conv == NIL) || ((Strcmp(conv, "set:int") != 0) && (Strcmp(conv, "int:set") != 0))) { /* The original value of the constant has precedence over 'constnumeric' feature since we like to keep the style (that is the base) of simple numeric constants */ if (isSimpleNum) { if (hasPrefix(value, "0x")) { m3value = NewStringf("16_%s", Char(value) + 2); } else if ((Len(value) > 1) && (*Char(value) == '0')) { m3value = NewStringf("8_%s", Char(value) + 1); } else { m3value = Copy(value); } /* If we cannot easily obtain the value of a numeric constant, we use the results given by a C compiler. */ } else { m3value = Copy(Getfeature(n, "constnumeric")); } } else { // if the value can't be converted, it is ignored if (convertInt(numvalue, numvalue, conv)) { m3value = NewStringf("%d", numvalue); } else { m3value = NIL; } } if (m3value != NIL) { m3wrap_intf.enterBlock(constant); Printf(m3wrap_intf.f, "%s", name); if (hasContent(type)) { Printf(m3wrap_intf.f, ": %s", type); } Printf(m3wrap_intf.f, " = %s;\n", m3value); Delete(m3value); } } /* ----------------------------------------------------------------------- * generateSetConstant() * * Considers node as a set constant definition * and generate a Modula 3 constant definition. * ------------------------------------------------------------------------ */ void generateSetConstant(Node *n, String *name) { String *value = Getattr(n, "value"); String *type = Getfeature(n, "modula3:constset:type"); String *setname = Getfeature(n, "modula3:constset:set"); String *basename = Getfeature(n, "modula3:constset:base"); String *conv = Getfeature(n, "modula3:constset:conv"); m3wrap_intf.enterBlock(constant); Printf(m3wrap_intf.f, "%s", name); if (type != NIL) { Printf(m3wrap_intf.f, ":%s ", type); } Printf(m3wrap_intf.f, " = %s{", setname); long numvalue = 0; if (!strToL(value, numvalue)) { numvalue = getConstNumeric(n); } convertInt(numvalue, numvalue, conv); bool isIntType = Strcmp(basename, "CARDINAL") == 0; Hash *items = NIL; if (!isIntType) { Hash *enumeration = Getattr(enumeration_coll, basename); if (enumeration == NIL) { Swig_warning(WARN_MODULA3_BAD_ENUMERATION, input_file, line_number, "There is no enumeration <%s> as needed for the set.\n", setname); isIntType = true; } else { items = Getattr(enumeration, "items"); } } bool gencomma = false; int bitpos = 0; while (numvalue > 0) { if ((numvalue & 1) != 0) { if (isIntType) { if (gencomma) { Printv(m3wrap_intf.f, ",", NIL); } gencomma = true; Printf(m3wrap_intf.f, "%d", bitpos); } else { char bitval[15]; sprintf(bitval, "%d", bitpos); String *bitname = Getattr(items, bitval); if (bitname == NIL) { Swig_warning(WARN_MODULA3_BAD_ENUMERATION, input_file, line_number, "Enumeration <%s> has no value <%s>.\n", setname, bitval); } else { if (gencomma) { Printv(m3wrap_intf.f, ",", NIL); } gencomma = true; Printf(m3wrap_intf.f, "%s.%s", basename, bitname); } } } numvalue >>= 1; bitpos++; } Printf(m3wrap_intf.f, "};\n"); } void generateConstant(Node *n) { // any of the special interpretation disables the default behaviour String *enumitem = Getfeature(n, "modula3:enumitem:name"); String *constset = Getfeature(n, "modula3:constset:name"); String *constint = Getfeature(n, "modula3:constint:name"); if (hasContent(enumitem) || hasContent(constset) || hasContent(constint)) { if (hasContent(constset)) { generateSetConstant(n, constset); } if (hasContent(constint)) { generateIntConstant(n, constint); } } else { String *value = Getattr(n, "value"); String *name = Getattr(n, "sym:name"); if (name == NIL) { name = Getattr(n, "name"); } m3wrap_intf.enterBlock(constant); Printf(m3wrap_intf.f, "%s = %s;\n", name, value); } } void emitEnumeration(File *file, String *name, Node *n) { Printf(file, "%s = {", name); int i; bool gencomma = false; int max = aToL(Getattr(n, "max")); Hash *items = Getattr(n, "items"); for (i = 0; i <= max; i++) { if (gencomma) { Printf(file, ","); } Printf(file, "\n"); gencomma = true; char numstr[15]; sprintf(numstr, "%d", i); String *name = Getattr(items, numstr); if (name != NIL) { Printv(file, name, NIL); } else { Printf(file, "Dummy%d", i); } } Printf(file, "\n};\n"); } /* ----------------------------------------------------------------------- * constantWrapper() * * Handles constants and enumeration items. * ------------------------------------------------------------------------ */ virtual int constantWrapper(Node *n) { generateConstant(n); return SWIG_OK; } #if 0 // enumerations are handled like constant definitions /* ----------------------------------------------------------------------------- * enumDeclaration() * ----------------------------------------------------------------------------- */ virtual int enumDeclaration(Node *n) { String *symname = nameToModula3(Getattr(n, "sym:name"), true); enumerationStart(symname); int result = Language::enumDeclaration(n); enumerationStop(); Delete(symname); return result; } #endif /* ----------------------------------------------------------------------------- * enumvalueDeclaration() * ----------------------------------------------------------------------------- */ virtual int enumvalueDeclaration(Node *n) { generateConstant(n); /* This call would continue processing in the constantWrapper which cannot handle values like "RED+1". return Language::enumvalueDeclaration(n); */ return SWIG_OK; } /* ----------------------------------------------------------------------------- * pragmaDirective() * * Valid Pragmas: * imclassbase - base (extends) for the intermediary class * imclassclassmodifiers - class modifiers for the intermediary class * imclasscode - text (Modula 3 code) is copied verbatim to the intermediary class * imclassimports - import statements for the intermediary class * imclassinterfaces - interface (implements) for the intermediary class * * modulebase - base (extends) for the module class * moduleclassmodifiers - class modifiers for the module class * modulecode - text (Modula 3 code) is copied verbatim to the module class * moduleimports - import statements for the module class * moduleinterfaces - interface (implements) for the module class * * ----------------------------------------------------------------------------- */ virtual int pragmaDirective(Node *n) { if (!ImportMode) { String *lang = Getattr(n, "lang"); String *code = Getattr(n, "name"); String *value = Getattr(n, "value"); if (Strcmp(lang, "modula3") == 0) { String *strvalue = NewString(value); Replaceall(strvalue, "\\\"", "\""); /* bool isEnumItem = Strcmp(code, "enumitem") == 0; bool isSetItem = Strcmp(code, "setitem") == 0; */ if (Strcmp(code, "imclassbase") == 0) { Delete(m3raw_baseclass); m3raw_baseclass = Copy(strvalue); } else if (Strcmp(code, "imclassclassmodifiers") == 0) { Delete(m3raw_class_modifiers); m3raw_class_modifiers = Copy(strvalue); } else if (Strcmp(code, "imclasscode") == 0) { Printf(m3raw_intf.f, "%s\n", strvalue); } else if (Strcmp(code, "imclassimports") == 0) { Delete(m3raw_imports); m3raw_imports = Copy(strvalue); } else if (Strcmp(code, "imclassinterfaces") == 0) { Delete(m3raw_interfaces); m3raw_interfaces = Copy(strvalue); } else if (Strcmp(code, "modulebase") == 0) { Delete(module_baseclass); module_baseclass = Copy(strvalue); } else if (Strcmp(code, "moduleclassmodifiers") == 0) { Delete(m3wrap_modifiers); m3wrap_modifiers = Copy(strvalue); } else if (Strcmp(code, "modulecode") == 0) { Printf(m3wrap_impl.f, "%s\n", strvalue); } else if (Strcmp(code, "moduleimports") == 0) { Delete(module_imports); module_imports = Copy(strvalue); } else if (Strcmp(code, "moduleinterfaces") == 0) { Delete(module_interfaces); module_interfaces = Copy(strvalue); } else if (Strcmp(code, "unsafe") == 0) { unsafe_module = true; } else if (Strcmp(code, "library") == 0) { if (targetlibrary) { Delete(targetlibrary); } targetlibrary = Copy(strvalue); } else if (Strcmp(code, "enumitem") == 0) { } else if (Strcmp(code, "constset") == 0) { } else if (Strcmp(code, "constint") == 0) { } else if (Strcmp(code, "makesetofenum") == 0) { m3wrap_intf.enterBlock(blocktype); Printf(m3wrap_intf.f, "%sSet = SET OF %s;\n", value, value); } else { Swig_warning(WARN_MODULA3_UNKNOWN_PRAGMA, input_file, line_number, "Unrecognized pragma <%s>.\n", code); } Delete(strvalue); } } return Language::pragmaDirective(n); } void Setfeature(Node *n, const char *feature, const String *value, bool warn = false) { //printf("tag feature <%s> with value <%s>\n", feature, Char(value)); String *attr = NewStringf("feature:%s", feature); if ((Setattr(n, attr, value) != 0) && warn) { Swig_warning(WARN_MODULA3_BAD_ENUMERATION, input_file, line_number, "Feature <%s> of %s did already exist.\n", feature, Getattr(n, "name")); } Delete(attr); } String *Getfeature(Node *n, const char *feature) { //printf("retrieve feature <%s> with value <%s>\n", feature, Char(value)); String *attr = NewStringf("feature:%s", feature); String *result = Getattr(n, attr); Delete(attr); return result; } bool convertInt(long in, long &out, const String *mode) { if ((mode == NIL) || (Strcmp(mode, "int:int") == 0) || (Strcmp(mode, "set:set") == 0)) { out = in; return true; } else if (Strcmp(mode, "set:int") == 0) { return log2(in, out); } else if (Strcmp(mode, "int:set") == 0) { out = 1L << in; return unsigned (in) < (sizeof(out) * 8); } else { Swig_warning(WARN_MODULA3_BAD_ENUMERATION, input_file, line_number, "Unknown integer conversion method <%s>.\n", mode); return false; } } void collectEnumerations(Hash *enums, Node *n) { Node *child = firstChild(n); while (child != NIL) { String *name = Getattr(child, "name"); const bool isConstant = Strcmp(nodeType(child), "constant") == 0; const bool isEnumItem = Strcmp(nodeType(child), "enumitem") == 0; if (isConstant || isEnumItem) { //printf("%s%s name %s\n", isConstant?"constant":"", isEnumItem?"enumitem":"", Char(name)); { String *m3name = Getfeature(child, "modula3:enumitem:name"); String *m3enum = Getfeature(child, "modula3:enumitem:enum"); String *conv = Getfeature(child, "modula3:enumitem:conv"); if (m3enum != NIL) { //printf("m3enum %s\n", Char(m3enum)); if (m3name == NIL) { m3name = name; } long max = -1; Hash *items; Hash *enumnode = Getattr(enums, m3enum); if (enumnode == NIL) { enumnode = NewHash(); items = NewHash(); Setattr(enumnode, "items", items); Setattr(enums, m3enum, enumnode); } else { String *maxstr = Getattr(enumnode, "max"); if (maxstr != NIL) { max = aToL(maxstr); } items = Getattr(enumnode, "items"); } long numvalue; String *value = Getattr(child, "value"); //printf("value: %s\n", Char(value)); if ((value == NIL) || (!strToL(value, numvalue))) { value = Getattr(child, "enumvalue"); if ((value == NIL) || (!evalExpr(value, numvalue))) { numvalue = getConstNumeric(child); } //printf("constnumeric: %s\n", Char(value)); } Setattr(constant_values, name, NewStringf("%d", numvalue)); if (convertInt(numvalue, numvalue, conv)) { String *newvalue = NewStringf("%d", numvalue); String *oldname = Getattr(items, newvalue); if (oldname != NIL) { Swig_warning(WARN_MODULA3_BAD_ENUMERATION, input_file, line_number, "The value <%s> is already assigned to <%s>.\n", value, oldname); } //printf("items %p, set %s = %s\n", items, Char(newvalue), Char(m3name)); Setattr(items, newvalue, m3name); if (max < numvalue) { max = numvalue; } Setattr(enumnode, "max", NewStringf("%d", max)); } } } } collectEnumerations(enums, child); child = nextSibling(child); } } enum const_pragma_type { cpt_none, cpt_constint, cpt_constset, cpt_enumitem }; struct const_id_pattern { String *prefix, *parentEnum; }; void tagConstants(Node *first, String *parentEnum, const const_id_pattern & pat, const String *pragma, List *convdesc) { Node *n = first; while (n != NIL) { String *name = getQualifiedName(n); bool isConstant = Strcmp(nodeType(n), "constant") == 0; bool isEnumItem = Strcmp(nodeType(n), "enumitem") == 0; if ((isConstant || isEnumItem) && ((pat.prefix == NIL) || (hasPrefix(name, pat.prefix))) && ((pat.parentEnum == NIL) || ((parentEnum != NIL) && (Strcmp (pat.parentEnum, parentEnum) == 0)))) { //printf("tag %s\n", Char(name)); String *srctype = Getitem(convdesc, 1); String *relationstr = Getitem(convdesc, 3); List *relationdesc = Split(relationstr, ',', 2); // transform name from C to Modula3 style String *srcstyle = NIL; String *newprefix = NIL; { //printf("name conversion <%s>\n", Char(Getitem(convdesc,2))); List *namedesc = Split(Getitem(convdesc, 2), ',', INT_MAX); Iterator nameit = First(namedesc); for (; nameit.item != NIL; nameit = Next(nameit)) { List *nameassign = Split(nameit.item, '=', 2); String *tag = Getitem(nameassign, 0); String *data = Getitem(nameassign, 1); //printf("name conv <%s> = <%s>\n", Char(tag), Char(data)); if (Strcmp(tag, "srcstyle") == 0) { srcstyle = Copy(data); } else if (Strcmp(tag, "prefix") == 0) { newprefix = Copy(data); } else { Swig_warning(WARN_MODULA3_BAD_ENUMERATION, input_file, line_number, "Unknown name conversion tag <%s> with value <%s>.\n", tag, data); } Delete(nameassign); } Delete(namedesc); } const char *stem = Char(name); if (pat.prefix != NIL) { //printf("pat.prefix %s for %s\n", Char(pat.prefix), Char(name)); stem += Len(pat.prefix); } String *newname; if (srcstyle && Strcmp(srcstyle, "underscore") == 0) { if (newprefix != NIL) { String *newstem = nameToModula3(stem, true); newname = NewStringf("%s%s", newprefix, newstem); Delete(newstem); } else { newname = nameToModula3(stem, true); } } else { if (srcstyle != NIL) { Swig_warning(WARN_MODULA3_BAD_ENUMERATION, input_file, line_number, "Unknown C identifier style <%s>.\n", srcstyle); } newname = Copy(name); } if (Strcmp(pragma, "enumitem") == 0) { if (Len(relationdesc) != 1) { Swig_warning(WARN_MODULA3_BAD_ENUMERATION, input_file, line_number, "Expected , got <%s>.\n", relationstr); } Setfeature(n, "modula3:enumitem:name", newname, true); Setfeature(n, "modula3:enumitem:enum", relationstr, true); Setfeature(n, "modula3:enumitem:conv", NewStringf("%s:int", srctype), true); } else if (Strcmp(pragma, "constint") == 0) { if (Len(relationdesc) != 1) { Swig_warning(WARN_MODULA3_BAD_ENUMERATION, input_file, line_number, "Expected , got <%s>.\n", relationstr); } Setfeature(n, "modula3:constint:name", newname, true); Setfeature(n, "modula3:constint:type", Getitem(relationdesc, 0), true); Setfeature(n, "modula3:constint:conv", NewStringf("%s:int", srctype), true); } else if (Strcmp(pragma, "constset") == 0) { if (Len(relationdesc) != 2) { Swig_warning(WARN_MODULA3_BAD_ENUMERATION, input_file, line_number, "Expected , got <%s>.\n", relationstr); } String *settype = Getitem(relationdesc, 0); Setfeature(n, "modula3:constset:name", newname, true); //Setfeature(n,"modula3:constset:type",settype,true); Setfeature(n, "modula3:constset:set", settype, true); Setfeature(n, "modula3:constset:base", Getitem(relationdesc, 1), true); Setfeature(n, "modula3:constset:conv", NewStringf("%s:set", srctype), true); } Delete(newname); Delete(relationdesc); } if (Strcmp(nodeType(n), "enum") == 0) { //printf("explore enum %s, qualification %s\n", Char(name), Char(Swig_symbol_qualified(n))); tagConstants(firstChild(n), name, pat, pragma, convdesc); } else { tagConstants(firstChild(n), NIL, pat, pragma, convdesc); } n = nextSibling(n); } } void scanForConstPragmas(Node *n) { Node *child = firstChild(n); while (child != NIL) { const String *type = nodeType(child); if (Strcmp(type, "pragma") == 0) { const String *lang = Getattr(child, "lang"); const String *code = Getattr(child, "name"); String *value = Getattr(child, "value"); if (Strcmp(lang, "modula3") == 0) { const_pragma_type cpt = cpt_none; if (Strcmp(code, "constint") == 0) { cpt = cpt_constint; } else if (Strcmp(code, "constset") == 0) { cpt = cpt_constset; } else if (Strcmp(code, "enumitem") == 0) { cpt = cpt_enumitem; } if (cpt != cpt_none) { const_id_pattern pat = { NIL, NIL }; List *convdesc = Split(value, ';', 4); List *patterndesc = Split(Getitem(convdesc, 0), ',', INT_MAX); Iterator patternit; for (patternit = First(patterndesc); patternit.item != NIL; patternit = Next(patternit)) { List *patternassign = Split(patternit.item, '=', 2); String *tag = Getitem(patternassign, 0); String *data = Getitem(patternassign, 1); if (Strcmp(tag, "prefix") == 0) { pat.prefix = Copy(data); } else if (Strcmp(tag, "enum") == 0) { pat.parentEnum = Copy(data); } else { Swig_warning(WARN_MODULA3_BAD_ENUMERATION, input_file, line_number, "Unknown identification tag <%s> with value <%s>.\n", tag, data); } Delete(patternassign); } tagConstants(child, NIL, pat, code, convdesc); Delete(patterndesc); } } } scanForConstPragmas(child); child = nextSibling(child); } } /* ----------------------------------------------------------------------------- * emitProxyClassDefAndCPPCasts() * ----------------------------------------------------------------------------- */ void emitProxyClassDefAndCPPCasts(Node *n) { String *c_classname = SwigType_namestr(Getattr(n, "name")); String *c_baseclass = NULL; String *baseclass = NULL; String *c_baseclassname = NULL; String *name = Getattr(n, "name"); /* Deal with inheritance */ List *baselist = Getattr(n, "bases"); if (baselist) { Iterator base = First(baselist); while (base.item) { if (!GetFlag(base.item, "feature:ignore")) { String *baseclassname = Getattr(base.item, "name"); if (!c_baseclassname) { c_baseclassname = baseclassname; baseclass = Copy(getProxyName(baseclassname)); if (baseclass) c_baseclass = SwigType_namestr(baseclassname); } else { /* Warn about multiple inheritance for additional base class(es) */ String *proxyclassname = Getattr(n, "classtypeobj"); Swig_warning(WARN_MODULA3_MULTIPLE_INHERITANCE, Getfile(n), Getline(n), "Warning for %s, base %s ignored. Multiple inheritance is not supported in Modula 3.\n", SwigType_namestr(proxyclassname), SwigType_namestr(baseclassname)); } } base = Next(base); } } bool derived = baseclass && getProxyName(c_baseclassname); if (!baseclass) baseclass = NewString(""); // Inheritance from pure Modula 3 classes const String *pure_baseclass = typemapLookup(n, "m3base", name, WARN_NONE); if (hasContent(pure_baseclass) && hasContent(baseclass)) { Swig_warning(WARN_MODULA3_MULTIPLE_INHERITANCE, Getfile(n), Getline(n), "Warning for %s, base %s ignored. Multiple inheritance is not supported in Modula 3.\n", name, pure_baseclass); } // Pure Modula 3 interfaces const String *pure_interfaces = typemapLookup(n, derived ? "m3interfaces_derived" : "m3interfaces", name, WARN_NONE); // Start writing the proxy class Printv(proxy_class_def, typemapLookup(n, "m3imports", name, WARN_NONE), // Import statements "\n", typemapLookup(n, "m3classmodifiers", name, WARN_MODULA3_TYPEMAP_CLASSMOD_UNDEF), // Class modifiers " class $m3classname", // Class name and bases (derived || *Char(pure_baseclass) || *Char(pure_interfaces)) ? " : " : "", baseclass, pure_baseclass, ((derived || *Char(pure_baseclass)) && *Char(pure_interfaces)) ? // Interfaces ", " : "", pure_interfaces, " {\n", " private IntPtr swigCPtr;\n", // Member variables for memory handling derived ? "" : " protected bool swigCMemOwn;\n", "\n", " ", typemapLookup(n, "m3ptrconstructormodifiers", name, WARN_MODULA3_TYPEMAP_PTRCONSTMOD_UNDEF), // pointer constructor modifiers " $m3classname(IntPtr cPtr, bool cMemoryOwn) ", // Constructor used for wrapping pointers derived ? ": base($imclassname.$m3classnameTo$baseclass(cPtr), cMemoryOwn) {\n" : "{\n swigCMemOwn = cMemoryOwn;\n", " swigCPtr = cPtr;\n", " }\n", NIL); if (!have_default_constructor_flag) { // All proxy classes need a constructor Printv(proxy_class_def, "\n", " protected $m3classname() : this(IntPtr.Zero, false) {\n", " }\n", NIL); } // C++ destructor is wrapped by the Dispose method // Note that the method name is specified in a typemap attribute called methodname String *destruct = NewString(""); const String *tm = NULL; Node *attributes = NewHash(); String *destruct_methodname = NULL; if (derived) { tm = typemapLookup(n, "m3destruct_derived", name, WARN_NONE, attributes); destruct_methodname = Getattr(attributes, "tmap:m3destruct_derived:methodname"); } else { tm = typemapLookup(n, "m3destruct", name, WARN_NONE, attributes); destruct_methodname = Getattr(attributes, "tmap:m3destruct:methodname"); } if (!destruct_methodname) { Swig_error(Getfile(n), Getline(n), "No methodname attribute defined in m3destruct%s typemap for %s\n", (derived ? "_derived" : ""), proxy_class_name); } // Emit the Finalize and Dispose methods if (tm) { // Finalize method if (*Char(destructor_call)) { Printv(proxy_class_def, typemapLookup(n, "m3finalize", name, WARN_NONE), NIL); } // Dispose method Printv(destruct, tm, NIL); if (*Char(destructor_call)) Replaceall(destruct, "$imcall", destructor_call); else Replaceall(destruct, "$imcall", "throw new MethodAccessException(\"C++ destructor does not have public access\")"); if (*Char(destruct)) Printv(proxy_class_def, "\n public ", derived ? "override" : "virtual", " void ", destruct_methodname, "() ", destruct, "\n", NIL); } Delete(attributes); Delete(destruct); // Emit various other methods Printv(proxy_class_def, typemapLookup(n, "m3getcptr", name, WARN_MODULA3_TYPEMAP_GETCPTR_UNDEF), // getCPtr method typemapLookup(n, "m3code", name, WARN_NONE), // extra Modula 3 code "\n", NIL); // Substitute various strings into the above template Replaceall(proxy_class_def, "$m3classname", proxy_class_name); Replaceall(proxy_class_code, "$m3classname", proxy_class_name); Replaceall(proxy_class_def, "$baseclass", baseclass); Replaceall(proxy_class_code, "$baseclass", baseclass); Replaceall(proxy_class_def, "$imclassname", m3raw_name); Replaceall(proxy_class_code, "$imclassname", m3raw_name); // Add code to do C++ casting to base class (only for classes in an inheritance hierarchy) if (derived) { Printv(m3raw_cppcasts_code, "\n [DllImport(\"", m3wrap_name, "\", EntryPoint=\"Modula3_", proxy_class_name, "To", baseclass, "\")]\n", NIL); Printv(m3raw_cppcasts_code, " public static extern IntPtr ", "$m3classnameTo$baseclass(IntPtr objectRef);\n", NIL); Replaceall(m3raw_cppcasts_code, "$m3classname", proxy_class_name); Replaceall(m3raw_cppcasts_code, "$baseclass", baseclass); Printv(upcasts_code, "SWIGEXPORT long Modula3_$imclazznameTo$imbaseclass", "(long objectRef) {\n", " long baseptr = 0;\n" " *($cbaseclass **)&baseptr = *($cclass **)&objectRef;\n" " return baseptr;\n" "}\n", "\n", NIL); Replaceall(upcasts_code, "$imbaseclass", baseclass); Replaceall(upcasts_code, "$cbaseclass", c_baseclass); Replaceall(upcasts_code, "$imclazzname", proxy_class_name); Replaceall(upcasts_code, "$cclass", c_classname); } Delete(baseclass); } /* ---------------------------------------------------------------------- * getAttrString() * * If necessary create and return the string * associated with a certain attribute of 'n'. * ---------------------------------------------------------------------- */ String *getAttrString(Node *n, const char *attr) { String *str = Getattr(n, attr); if (str == NIL) { str = NewString(""); Setattr(n, attr, str); } return str; } /* ---------------------------------------------------------------------- * getMethodDeclarations() * * If necessary create and return the handle * where the methods of the current access can be written to. * 'n' must be a member of a struct or a class. * ---------------------------------------------------------------------- */ String *getMethodDeclarations(Node *n) { String *acc_str = Getattr(n, "access"); String *methodattr; if (acc_str == NIL) { methodattr = NewString("modula3:method:public"); } else { methodattr = NewStringf("modula3:method:%s", acc_str); } String *methods = getAttrString(parentNode(n), Char(methodattr)); Delete(methodattr); return methods; } /* ---------------------------------------------------------------------- * classHandler() * ---------------------------------------------------------------------- */ virtual int classHandler(Node *n) { File *f_proxy = NULL; proxy_class_name = Copy(Getattr(n, "sym:name")); //String *rawname = Getattr(n,"name"); if (proxy_flag) { if (!addSymbol(proxy_class_name, n)) return SWIG_ERROR; if (Cmp(proxy_class_name, m3raw_name) == 0) { Printf(stderr, "Class name cannot be equal to intermediary class name: %s\n", proxy_class_name); SWIG_exit(EXIT_FAILURE); } if (Cmp(proxy_class_name, m3wrap_name) == 0) { Printf(stderr, "Class name cannot be equal to module class name: %s\n", proxy_class_name); SWIG_exit(EXIT_FAILURE); } String *filen = NewStringf("%s%s.m3", SWIG_output_directory(), proxy_class_name); f_proxy = NewFile(filen, "w", SWIG_output_files()); if (!f_proxy) { FileErrorDisplay(filen); SWIG_exit(EXIT_FAILURE); } Delete(filen); filen = NULL; emitBanner(f_proxy); Clear(proxy_class_def); Clear(proxy_class_code); have_default_constructor_flag = false; destructor_call = NewString(""); } /* This will invoke memberfunctionHandler, membervariableHandler ... and finally it may invoke functionWrapper for wrappers and member variable accessors. It will invoke Language:constructorDeclaration which decides whether to call MODULA3::constructorHandler */ Language::classHandler(n); { String *kind = Getattr(n, "kind"); if (Cmp(kind, "struct") == 0) { String *entries = NewString(""); Node *child; writeArgState state; for (child = firstChild(n); child != NIL; child = nextSibling(child)) { String *childType = nodeType(child); if (Strcmp(childType, "cdecl") == 0) { String *member = Getattr(child, "sym:name"); ParmList *pl = Getattr(child, "parms"); if (pl == NIL) { // Get the variable type in Modula 3 type equivalents String *m3ct = getMappedTypeNew(child, "m3rawtype", ""); writeArg(entries, state, NIL, member, m3ct, NIL); } } } writeArg(entries, state, NIL, NIL, NIL, NIL); m3raw_intf.enterBlock(blocktype); Printf(m3raw_intf.f, "%s =\nRECORD\n%sEND;\n", proxy_class_name, entries); Delete(entries); } else if (Cmp(kind, "class") == 0) { enum access_privilege { acc_public, acc_protected, acc_private }; int max_acc = acc_public; const char *acc_name[3] = { "public", "protected", "private" }; String *methods[3]; int acc; for (acc = acc_public; acc <= acc_private; acc++) { String *methodattr = NewStringf("modula3:method:%s", acc_name[acc]); methods[acc] = Getattr(n, methodattr); Delete(methodattr); max_acc = max_acc > acc ? max_acc : acc; } /* Determine the name of the base class */ String *baseclassname = NewString(""); { List *baselist = Getattr(n, "bases"); if (baselist) { /* Look for the first (principal?) base class - Modula 3 does not support multiple inheritance */ Iterator base = First(baselist); if (base.item) { Append(baseclassname, Getattr(base.item, "sym:name")); base = Next(base); if (base.item) { Swig_warning(WARN_MODULA3_MULTIPLE_INHERITANCE, Getfile(n), Getline(n), "Warning for %s, base %s ignored. Multiple inheritance is not supported in Modula 3.\n", proxy_class_name, Getattr(base.item, "name")); } } } } /* the private class of the base class and only this need a pointer to the C++ object */ bool need_private = !hasContent(baseclassname); max_acc = need_private ? acc_private : max_acc; /* Declare C++ object as abstract pointer in Modula 3 */ /* The revelation system does not allow us to imitate the whole class hierarchy of the C++ library, but at least we can distinguish between classes of different roots. */ if (hasContent(baseclassname)) { m3raw_intf.enterBlock(blocktype); Printf(m3raw_intf.f, "%s = %s;\n", proxy_class_name, baseclassname); } else { m3raw_intf.enterBlock(blocktype); Printf(m3raw_intf.f, "%s <: ADDRESS;\n", proxy_class_name); m3raw_impl.enterBlock(revelation); Printf(m3raw_impl.f, "%s = UNTRACED BRANDED REF RECORD (*Dummy*) END;\n", proxy_class_name); } String *superclass; m3wrap_intf.enterBlock(blocktype); if (hasContent(methods[acc_public])) { superclass = NewStringf("%sPublic", proxy_class_name); } else if (hasContent(baseclassname)) { superclass = Copy(baseclassname); } else { superclass = NewString("ROOT"); } Printf(m3wrap_intf.f, "%s <: %s;\n", proxy_class_name, superclass); Delete(superclass); { static const char *acc_m3suffix[] = { "Public", "Protected", "Private" }; int acc; for (acc = acc_public; acc <= acc_private; acc++) { bool process_private = (acc == acc_private) && need_private; if (hasContent(methods[acc]) || process_private) { String *subclass = NewStringf("%s%s", proxy_class_name, acc_m3suffix[acc]); /* m3wrap_intf.enterBlock(revelation); Printf(m3wrap_intf.f, "%s <: %s;\n", proxy_class_name, subclass); */ if (acc == max_acc) { m3wrap_intf.enterBlock(revelation); Printf(m3wrap_intf.f, "%s =\n", proxy_class_name); } else { m3wrap_intf.enterBlock(blocktype); Printf(m3wrap_intf.f, "%s =\n", subclass); } Printf(m3wrap_intf.f, "%s BRANDED OBJECT\n", baseclassname); if (process_private) { Setattr(m3wrap_intf.import, m3raw_name, ""); Printf(m3wrap_intf.f, "cxxObj:%s.%s;\n", m3raw_name, proxy_class_name); } if (hasContent(methods[acc])) { Printf(m3wrap_intf.f, "METHODS\n%s", methods[acc]); } if (acc == max_acc) { String *overrides = Getattr(n, "modula3:override"); Printf(m3wrap_intf.f, "OVERRIDES\n%s", overrides); } Printf(m3wrap_intf.f, "END;\n"); Delete(baseclassname); baseclassname = subclass; } } } Delete(methods[acc_public]); Delete(methods[acc_protected]); Delete(methods[acc_private]); } else { Swig_warning(WARN_MODULA3_TYPECONSTRUCTOR_UNKNOWN, input_file, line_number, "Unknown type constructor %s\n", kind); } } if (proxy_flag) { emitProxyClassDefAndCPPCasts(n); Printv(f_proxy, proxy_class_def, proxy_class_code, NIL); Printf(f_proxy, "}\n"); Delete(f_proxy); f_proxy = NULL; Delete(proxy_class_name); proxy_class_name = NULL; Delete(destructor_call); destructor_call = NULL; } return SWIG_OK; } /* ---------------------------------------------------------------------- * memberfunctionHandler() * ---------------------------------------------------------------------- */ virtual int memberfunctionHandler(Node *n) { //printf("begin memberfunctionHandler(%s)\n", Char(Getattr(n,"name"))); Setattr(n, "modula3:functype", "method"); Language::memberfunctionHandler(n); { /* Language::memberfunctionHandler will remove the mapped types that emitM3Wrapper may attach */ ParmList *pl = Getattr(n, "parms"); Swig_typemap_attach_parms("m3wrapinmode", pl, NULL); Swig_typemap_attach_parms("m3wrapinname", pl, NULL); Swig_typemap_attach_parms("m3wrapintype", pl, NULL); Swig_typemap_attach_parms("m3wrapindefault", pl, NULL); attachParameterNames(n, "tmap:m3wrapinname", "autoname", "arg%d"); String *rettype = getMappedTypeNew(n, "m3wrapouttype", ""); String *methodname = Getattr(n, "sym:name"); /* if (methodname==NIL) { methodname = Getattr(n,"name"); } */ String *arguments = createM3Signature(n); String *storage = Getattr(n, "storage"); String *overridden = Getattr(n, "override"); bool isVirtual = (storage != NIL) && (Strcmp(storage, "virtual") == 0); bool isOverridden = (overridden != NIL) && (Strcmp(overridden, "1") == 0); if ((!isVirtual) || (!isOverridden)) { { String *methods = getMethodDeclarations(n); Printf(methods, "%s(%s)%s%s;%s\n", methodname, arguments, hasContent(rettype) ? ": " : "", hasContent(rettype) ? (const String *) rettype : "", isVirtual ? " (* base method *)" : ""); } { /* this was attached by functionWrapper invoked by Language::memberfunctionHandler */ String *fname = Getattr(n, "modula3:funcname"); String *overrides = getAttrString(parentNode(n), "modula3:override"); Printf(overrides, "%s := %s;\n", methodname, fname); } } } if (proxy_flag) { String *overloaded_name = getOverloadedName(n); String *intermediary_function_name = Swig_name_member(NSPACE_TODO, proxy_class_name, overloaded_name); Setattr(n, "proxyfuncname", Getattr(n, "sym:name")); Setattr(n, "imfuncname", intermediary_function_name); proxyClassFunctionHandler(n); Delete(overloaded_name); } //printf("end memberfunctionHandler(%s)\n", Char(Getattr(n,"name"))); return SWIG_OK; } /* ---------------------------------------------------------------------- * staticmemberfunctionHandler() * ---------------------------------------------------------------------- */ virtual int staticmemberfunctionHandler(Node *n) { static_flag = true; Language::staticmemberfunctionHandler(n); if (proxy_flag) { String *overloaded_name = getOverloadedName(n); String *intermediary_function_name = Swig_name_member(NSPACE_TODO, proxy_class_name, overloaded_name); Setattr(n, "proxyfuncname", Getattr(n, "sym:name")); Setattr(n, "imfuncname", intermediary_function_name); proxyClassFunctionHandler(n); Delete(overloaded_name); } static_flag = false; return SWIG_OK; } /* ----------------------------------------------------------------------------- * proxyClassFunctionHandler() * * Function called for creating a Modula 3 wrapper function around a c++ function in the * proxy class. Used for both static and non-static C++ class functions. * C++ class static functions map to Modula 3 static functions. * Two extra attributes in the Node must be available. These are "proxyfuncname" - * the name of the Modula 3 class proxy function, which in turn will call "imfuncname" - * the intermediary (PInvoke) function name in the intermediary class. * ----------------------------------------------------------------------------- */ void proxyClassFunctionHandler(Node *n) { SwigType *t = Getattr(n, "type"); ParmList *l = Getattr(n, "parms"); Hash *throws_hash = NewHash(); String *intermediary_function_name = Getattr(n, "imfuncname"); String *proxy_function_name = Getattr(n, "proxyfuncname"); String *tm; Parm *p; int i; String *imcall = NewString(""); String *return_type = NewString(""); String *function_code = NewString(""); bool setter_flag = false; if (!proxy_flag) return; if (l) { if (SwigType_type(Getattr(l, "type")) == T_VOID) { l = nextSibling(l); } } /* Attach the non-standard typemaps to the parameter list */ Swig_typemap_attach_parms("in", l, NULL); Swig_typemap_attach_parms("m3wraptype", l, NULL); Swig_typemap_attach_parms("m3in", l, NULL); /* Get return types */ if ((tm = getMappedTypeNew(n, "m3wraptype", ""))) { substituteClassname(t, tm); Printf(return_type, "%s", tm); } if (proxy_flag && wrapping_member_flag && !enum_constant_flag) { // Properties setter_flag = (Cmp(Getattr(n, "sym:name"), Swig_name_set(NSPACE_TODO, Swig_name_member(NSPACE_TODO, proxy_class_name, variable_name))) == 0); } /* Start generating the proxy function */ Printf(function_code, " %s ", Getattr(n, "feature:modula3:methodmodifiers")); if (static_flag) Printf(function_code, "static "); if (Getattr(n, "override")) Printf(function_code, "override "); else if (checkAttribute(n, "storage", "virtual")) Printf(function_code, "virtual "); Printf(function_code, "%s %s(", return_type, proxy_function_name); Printv(imcall, m3raw_name, ".", intermediary_function_name, "(", NIL); if (!static_flag) Printv(imcall, "swigCPtr", NIL); emit_mark_varargs(l); int gencomma = !static_flag; /* Output each parameter */ for (i = 0, p = l; p; i++) { /* Ignored varargs */ if (checkAttribute(p, "varargs:ignore", "1")) { p = nextSibling(p); continue; } /* Ignored parameters */ if (checkAttribute(p, "tmap:in:numinputs", "0")) { p = Getattr(p, "tmap:in:next"); continue; } /* Ignore the 'this' argument for variable wrappers */ if (!(variable_wrapper_flag && i == 0)) { SwigType *pt = Getattr(p, "type"); String *param_type = NewString(""); /* Get the Modula 3 parameter type */ if ((tm = getMappedType(p, "m3wraptype"))) { substituteClassname(pt, tm); Printf(param_type, "%s", tm); } if (gencomma) Printf(imcall, ", "); String *arg = variable_wrapper_flag ? NewString("value") : makeParameterName(n, p, i); // Use typemaps to transform type used in Modula 3 wrapper function (in proxy class) to type used in PInvoke function (in intermediary class) if ((tm = getMappedType(p, "in"))) { addThrows(throws_hash, "in", p); substituteClassname(pt, tm); Replaceall(tm, "$input", arg); Printv(imcall, tm, NIL); } /* Add parameter to proxy function */ if (gencomma >= 2) Printf(function_code, ", "); gencomma = 2; Printf(function_code, "%s %s", param_type, arg); Delete(arg); Delete(param_type); } p = Getattr(p, "tmap:in:next"); } Printf(imcall, ")"); Printf(function_code, ")"); // Transform return type used in PInvoke function (in intermediary class) to type used in Modula 3 wrapper function (in proxy class) if ((tm = getMappedTypeNew(n, "m3out", ""))) { addThrows(throws_hash, "m3out", n); if (GetFlag(n, "feature:new")) Replaceall(tm, "$owner", "true"); else Replaceall(tm, "$owner", "false"); substituteClassname(t, tm); Replaceall(tm, "$imcall", imcall); } generateThrowsClause(throws_hash, function_code); Printf(function_code, " %s\n\n", tm ? (const String *) tm : empty_string); if (proxy_flag && wrapping_member_flag && !enum_constant_flag) { // Properties if (setter_flag) { // Setter method if ((tm = getMappedTypeNew(n, "m3varin", ""))) { if (GetFlag(n, "feature:new")) Replaceall(tm, "$owner", "true"); else Replaceall(tm, "$owner", "false"); substituteClassname(t, tm); Replaceall(tm, "$imcall", imcall); Printf(proxy_class_code, "%s", tm); } } else { // Getter method if ((tm = getMappedTypeNew(n, "m3varout", ""))) { if (GetFlag(n, "feature:new")) Replaceall(tm, "$owner", "true"); else Replaceall(tm, "$owner", "false"); substituteClassname(t, tm); Replaceall(tm, "$imcall", imcall); Printf(proxy_class_code, "%s", tm); } } } else { // Normal function call Printv(proxy_class_code, function_code, NIL); } Delete(function_code); Delete(return_type); Delete(imcall); Delete(throws_hash); } /* ---------------------------------------------------------------------- * constructorHandler() * ---------------------------------------------------------------------- */ virtual int constructorHandler(Node *n) { // this invokes functionWrapper Language::constructorHandler(n); if (proxy_flag) { ParmList *l = Getattr(n, "parms"); Hash *throws_hash = NewHash(); String *overloaded_name = getOverloadedName(n); String *imcall = NewString(""); Printf(proxy_class_code, " %s %s(", Getattr(n, "feature:modula3:methodmodifiers"), proxy_class_name); Printv(imcall, " : this(", m3raw_name, ".", Swig_name_construct(NSPACE_TODO, overloaded_name), "(", NIL); /* Attach the non-standard typemaps to the parameter list */ Swig_typemap_attach_parms("in", l, NULL); Swig_typemap_attach_parms("m3wraptype", l, NULL); Swig_typemap_attach_parms("m3in", l, NULL); emit_mark_varargs(l); int gencomma = 0; String *tm; Parm *p = l; int i; /* Output each parameter */ for (i = 0; p; i++) { /* Ignored varargs */ if (checkAttribute(p, "varargs:ignore", "1")) { p = nextSibling(p); continue; } /* Ignored parameters */ if (checkAttribute(p, "tmap:in:numinputs", "0")) { p = Getattr(p, "tmap:in:next"); continue; } SwigType *pt = Getattr(p, "type"); String *param_type = NewString(""); /* Get the Modula 3 parameter type */ if ((tm = getMappedType(p, "m3wraptype"))) { substituteClassname(pt, tm); Printf(param_type, "%s", tm); } if (gencomma) Printf(imcall, ", "); String *arg = makeParameterName(n, p, i); // Use typemaps to transform type used in Modula 3 wrapper function (in proxy class) to type used in PInvoke function (in intermediary class) if ((tm = getMappedType(p, "in"))) { addThrows(throws_hash, "in", p); substituteClassname(pt, tm); Replaceall(tm, "$input", arg); Printv(imcall, tm, NIL); } /* Add parameter to proxy function */ if (gencomma) Printf(proxy_class_code, ", "); Printf(proxy_class_code, "%s %s", param_type, arg); gencomma = 1; Delete(arg); Delete(param_type); p = Getattr(p, "tmap:in:next"); } Printf(imcall, "), true)"); Printf(proxy_class_code, ")"); Printf(proxy_class_code, "%s", imcall); generateThrowsClause(throws_hash, proxy_class_code); Printf(proxy_class_code, " {\n"); Printf(proxy_class_code, " }\n\n"); if (!gencomma) // We must have a default constructor have_default_constructor_flag = true; Delete(overloaded_name); Delete(imcall); Delete(throws_hash); } return SWIG_OK; } /* ---------------------------------------------------------------------- * destructorHandler() * ---------------------------------------------------------------------- */ virtual int destructorHandler(Node *n) { Language::destructorHandler(n); String *symname = Getattr(n, "sym:name"); if (proxy_flag) { Printv(destructor_call, m3raw_name, ".", Swig_name_destroy(NSPACE_TODO, symname), "(swigCPtr)", NIL); } return SWIG_OK; } /* ---------------------------------------------------------------------- * membervariableHandler() * ---------------------------------------------------------------------- */ virtual int membervariableHandler(Node *n) { //printf("begin membervariableHandler(%s)\n", Char(Getattr(n,"name"))); SwigType *t = Getattr(n, "type"); String *tm; // Get the variable type if ((tm = getMappedTypeNew(n, "m3wraptype", ""))) { substituteClassname(t, tm); } variable_name = Getattr(n, "sym:name"); //printf("member variable: %s\n", Char(variable_name)); // Output the property's field declaration and accessor methods Printf(proxy_class_code, " public %s %s {", tm, variable_name); Setattr(n, "modula3:functype", "accessor"); wrapping_member_flag = true; variable_wrapper_flag = true; Language::membervariableHandler(n); wrapping_member_flag = false; variable_wrapper_flag = false; Printf(proxy_class_code, "\n }\n\n"); { String *methods = getMethodDeclarations(n); String *overrides = getAttrString(parentNode(n), "modula3:override"); SwigType *type = Getattr(n, "type"); String *m3name = capitalizeFirst(variable_name); //String *m3name = nameToModula3(variable_name,true); if (!SwigType_isconst(type)) { { String *inmode = getMappedTypeNew(n, "m3wrapinmode", "", false); String *intype = getMappedTypeNew(n, "m3wrapintype", ""); Printf(methods, "set%s(%s val:%s);\n", m3name, (inmode != NIL) ? (const String *) inmode : "", intype); } { /* this was attached by functionWrapper invoked by Language::memberfunctionHandler */ String *fname = Getattr(n, "modula3:setname"); Printf(overrides, "set%s := %s;\n", m3name, fname); } } { { String *outtype = getMappedTypeNew(n, "m3wrapouttype", ""); Printf(methods, "get%s():%s;\n", m3name, outtype); } { /* this was attached by functionWrapper invoked by Language::memberfunctionHandler */ String *fname = Getattr(n, "modula3:getname"); Printf(overrides, "get%s := %s;\n", m3name, fname); } } Delete(m3name); } //printf("end membervariableHandler(%s)\n", Char(Getattr(n,"name"))); return SWIG_OK; } /* ---------------------------------------------------------------------- * staticmembervariableHandler() * ---------------------------------------------------------------------- */ virtual int staticmembervariableHandler(Node *n) { bool static_const_member_flag = (Getattr(n, "value") == 0); if (static_const_member_flag) { SwigType *t = Getattr(n, "type"); String *tm; // Get the variable type if ((tm = getMappedTypeNew(n, "m3wraptype", ""))) { substituteClassname(t, tm); } // Output the property's field declaration and accessor methods Printf(proxy_class_code, " public static %s %s {", tm, Getattr(n, "sym:name")); } variable_name = Getattr(n, "sym:name"); wrapping_member_flag = true; static_flag = true; Language::staticmembervariableHandler(n); wrapping_member_flag = false; static_flag = false; if (static_const_member_flag) Printf(proxy_class_code, "\n }\n\n"); return SWIG_OK; } /* ---------------------------------------------------------------------- * memberconstantHandler() * ---------------------------------------------------------------------- */ virtual int memberconstantHandler(Node *n) { variable_name = Getattr(n, "sym:name"); wrapping_member_flag = true; Language::memberconstantHandler(n); wrapping_member_flag = false; return SWIG_OK; } /* ----------------------------------------------------------------------------- * getOverloadedName() * ----------------------------------------------------------------------------- */ String *getOverloadedName(Node *n) { String *overloaded_name = Copy(Getattr(n, "sym:name")); if (Getattr(n, "sym:overloaded")) { Printv(overloaded_name, Getattr(n, "sym:overname"), NIL); } return overloaded_name; } /* ----------------------------------------------------------------------------- * emitM3Wrapper() * It is also used for set and get methods of global variables. * ----------------------------------------------------------------------------- */ void emitM3Wrapper(Node *n, const String *func_name) { SwigType *t = Getattr(n, "type"); ParmList *l = Getattr(n, "parms"); Hash *throws_hash = NewHash(); int num_exceptions = 0; int num_returns = 0; String *rawcall = NewString(""); String *reccall = NewString(""); String *local_variables = NewString(""); String *local_constants = NewString(""); String *incheck = NewString(""); String *outcheck = NewString(""); String *setup = NewString(""); String *cleanup = NewString(""); String *outarg = NewString(""); /* don't mix up with 'autark' :-] */ String *storeout = NewString(""); String *result_name = NewString(""); String *return_variables = NewString(""); const char *result_return = "ret"; String *function_code = NewString(""); /*several names for the same function */ String *raw_name = Getattr(n, "name"); /*original C function name */ //String *func_name = Getattr(n,"sym:name"); /*final Modula3 name chosen by the user*/ bool setter_flag = false; int multiretval = GetFlag(n, "feature:modula3:multiretval"); if (l) { if (SwigType_type(Getattr(l, "type")) == T_VOID) { l = nextSibling(l); } } /* Attach the non-standard typemaps to the parameter list */ Swig_typemap_attach_parms("m3wrapargvar", l, NULL); Swig_typemap_attach_parms("m3wrapargconst", l, NULL); Swig_typemap_attach_parms("m3wrapargraw", l, NULL); Swig_typemap_attach_parms("m3wrapargdir", l, NULL); Swig_typemap_attach_parms("m3wrapinmode", l, NULL); Swig_typemap_attach_parms("m3wrapinname", l, NULL); Swig_typemap_attach_parms("m3wrapintype", l, NULL); Swig_typemap_attach_parms("m3wrapindefault", l, NULL); Swig_typemap_attach_parms("m3wrapinconv", l, NULL); Swig_typemap_attach_parms("m3wrapincheck", l, NULL); Swig_typemap_attach_parms("m3wrapoutname", l, NULL); Swig_typemap_attach_parms("m3wrapouttype", l, NULL); Swig_typemap_attach_parms("m3wrapoutconv", l, NULL); Swig_typemap_attach_parms("m3wrapoutcheck", l, NULL); attachMappedType(n, "m3wrapretraw"); attachMappedType(n, "m3wrapretname"); attachMappedType(n, "m3wraprettype"); attachMappedType(n, "m3wrapretvar"); attachMappedType(n, "m3wrapretconv"); attachMappedType(n, "m3wrapretcheck"); Swig_typemap_attach_parms("m3wrapfreearg", l, NULL); /* Swig_typemap_attach_parms("m3wrapargvar:throws", l, NULL); Swig_typemap_attach_parms("m3wrapargraw:throws", l, NULL); Swig_typemap_attach_parms("m3wrapinconv:throws", l, NULL); Swig_typemap_attach_parms("m3wrapincheck:throws", l, NULL); Swig_typemap_attach_parms("m3wrapoutconv:throws", l, NULL); Swig_typemap_attach_parms("m3wrapoutcheck:throws", l, NULL); attachMappedType(n, "m3wrapretvar:throws"); attachMappedType(n, "m3wrapretconv:throws"); attachMappedType(n, "m3wrapretcheck:throws"); Swig_typemap_attach_parms("m3wrapfreearg:throws", l, NULL); */ /* Attach argument names to the parameter list */ /* should be a separate procedure making use of hashes */ attachParameterNames(n, "tmap:m3wrapinname", "autoname", "arg%d"); /* Get return types */ String *result_m3rawtype = Copy(getMappedTypeNew(n, "m3rawrettype", "")); String *result_m3wraptype = Copy(getMappedTypeNew(n, "m3wraprettype", "")); bool has_return_raw = hasContent(result_m3rawtype); bool has_return_m3 = hasContent(result_m3wraptype); if (has_return_m3) { num_returns++; //printf("%s: %s\n", Char(func_name),Char(result_m3wraptype)); } String *arguments = createM3Signature(n); /* Create local variables or RECORD fields for return values and determine return type that might result from a converted VAR argument. */ { writeArgState state; if (multiretval && has_return_m3) { writeArg(return_variables, state, NIL, NewString(result_return), result_m3wraptype, NIL); } Parm *p = skipIgnored(l, "m3wrapouttype"); while (p != NIL) { String *arg = Getattr(p, "tmap:m3wrapoutname"); if (arg == NIL) { arg = Getattr(p, "name"); } String *tm = Getattr(p, "tmap:m3wrapouttype"); if (tm != NIL) { if (isOutParam(p)) { if (!multiretval) { if (num_returns == 0) { Printv(result_name, arg, NIL); Clear(result_m3wraptype); Printv(result_m3wraptype, tm, NIL); } else { Swig_warning(WARN_MODULA3_TYPEMAP_MULTIPLE_RETURN, input_file, line_number, "Typemap m3wrapargdir set to 'out' for %s implies a RETURN value, but the routine %s has already one.\nUse %%multiretval feature.\n", SwigType_str(Getattr(p, "type"), 0), raw_name); } } num_returns++; addImports(m3wrap_intf.import, "m3wrapouttype", p); writeArg(return_variables, state, NIL, arg, tm, NIL); } p = skipIgnored(Getattr(p, "tmap:m3wrapouttype:next"), "m3wrapouttype"); } else { p = nextSibling(p); } } writeArg(return_variables, state, NIL, NIL, NIL, NIL); if (multiretval) { Printv(result_name, Swig_cresult_name(), NIL); Printf(result_m3wraptype, "%sResult", func_name); m3wrap_intf.enterBlock(blocktype); Printf(m3wrap_intf.f, "%s =\nRECORD\n%sEND;\n", result_m3wraptype, return_variables); Printf(local_variables, "%s: %s;\n", result_name, result_m3wraptype); } else { Append(local_variables, return_variables); } } /* Declare local constants e.g. for storing argument names. */ { Parm *p = l; while (p != NIL) { String *arg = Getattr(p, "autoname"); String *tm = Getattr(p, "tmap:m3wrapargconst"); if (tm != NIL) { addImports(m3wrap_impl.import, "m3wrapargconst", p); Replaceall(tm, "$input", arg); Printv(local_constants, tm, "\n", NIL); p = Getattr(p, "tmap:m3wrapargconst:next"); } else { p = nextSibling(p); } } } /* Declare local variables e.g. for converted input values. */ { String *tm = getMappedTypeNew(n, "m3wrapretvar", "", false); if (tm != NIL) { addImports(m3wrap_impl.import, "m3wrapretvar", n); addThrows(throws_hash, "m3wrapretvar", n); Printv(local_variables, tm, "\n", NIL); } Parm *p = l; while (p != NIL) { String *arg = Getattr(p, "autoname"); tm = Getattr(p, "tmap:m3wrapargvar"); if (tm != NIL) { /* exceptions that may be raised but can't be caught, thus we won't count them in num_exceptions */ addImports(m3wrap_impl.import, "m3wrapargvar", p); addThrows(throws_hash, "m3wrapargvar", p); Replaceall(tm, "$input", arg); Printv(local_variables, tm, "\n", NIL); p = Getattr(p, "tmap:m3wrapargvar:next"); } else { p = nextSibling(p); } } } /* Convert input values from Modula 3 to C. */ { Parm *p = l; while (p != NIL) { String *arg = Getattr(p, "autoname"); String *tm = Getattr(p, "tmap:m3wrapinconv"); if (tm != NIL) { addImports(m3wrap_impl.import, "m3wrapinconv", p); num_exceptions += addThrows(throws_hash, "m3wrapinconv", p); Replaceall(tm, "$input", arg); Printv(setup, tm, "\n", NIL); p = Getattr(p, "tmap:m3wrapinconv:next"); } else { p = nextSibling(p); } } } /* Generate checks for input value integrity. */ { Parm *p = l; while (p != NIL) { String *arg = Getattr(p, "autoname"); String *tm = Getattr(p, "tmap:m3wrapincheck"); if (tm != NIL) { addImports(m3wrap_impl.import, "m3wrapincheck", p); num_exceptions += addThrows(throws_hash, "m3wrapincheck", p); Replaceall(tm, "$input", arg); Printv(incheck, tm, "\n", NIL); p = Getattr(p, "tmap:m3wrapincheck:next"); } else { p = nextSibling(p); } } } Printv(rawcall, m3raw_name, ".", func_name, "(", NIL); /* Arguments to the raw C function */ { bool gencomma = false; Parm *p = l; while (p != NIL) { if (gencomma) { Printf(rawcall, ", "); } gencomma = true; addImports(m3wrap_impl.import, "m3wrapargraw", p); num_exceptions += addThrows(throws_hash, "m3wrapargraw", p); String *arg = Getattr(p, "autoname"); String *qualarg = NewString(""); if (!isInParam(p)) { String *tmparg = Getattr(p, "tmap:m3wrapoutname"); if (tmparg != NIL) { arg = tmparg; } if (multiretval /*&& isOutParam(p) - automatically fulfilled */ ) { Printf(qualarg, "%s.", result_name); } } Append(qualarg, arg); Setattr(p, "m3outarg", qualarg); String *tm = Getattr(p, "tmap:m3wrapargraw"); if (tm != NIL) { Replaceall(tm, "$input", arg); Replaceall(tm, "$output", qualarg); Printv(rawcall, tm, NIL); p = Getattr(p, "tmap:m3wrapargraw:next"); } else { //Printv(rawcall, Getattr(p,"lname"), NIL); Printv(rawcall, qualarg, NIL); p = nextSibling(p); } Delete(qualarg); } } Printf(rawcall, ")"); /* Check for error codes and integrity of results */ { String *tm = getMappedTypeNew(n, "m3wrapretcheck", "", false); if (tm != NIL) { addImports(m3wrap_impl.import, "m3wrapretcheck", n); num_exceptions += addThrows(throws_hash, "m3wrapretcheck", n); Printv(outcheck, tm, "\n", NIL); } Parm *p = l; while (p != NIL) { tm = Getattr(p, "tmap:m3wrapoutcheck"); if (tm != NIL) { String *arg = Getattr(p, "autoname"); String *outarg = Getattr(p, "m3outarg"); addImports(m3wrap_impl.import, "m3wrapoutcheck", p); num_exceptions += addThrows(throws_hash, "m3wrapoutcheck", p); //substituteClassname(Getattr(p,"type"), tm); Replaceall(tm, "$input", arg); Replaceall(tm, "$output", outarg); Printv(outcheck, tm, "\n", NIL); p = Getattr(p, "tmap:m3wrapoutcheck:next"); } else { p = nextSibling(p); } } } /* Convert the results to Modula 3 data structures and put them in the record prepared for returning */ { /* m3wrapretconv is processed when it is clear if there is some output conversion and checking code */ Parm *p = l; while (p != NIL) { String *tm = Getattr(p, "tmap:m3wrapoutconv"); if (tm != NIL) { String *arg = Getattr(p, "autoname"); String *outarg = Getattr(p, "m3outarg"); addImports(m3wrap_impl.import, "m3wrapoutconv", n); num_exceptions += addThrows(throws_hash, "m3wrapoutconv", p); //substituteClassname(Getattr(p,"type"), tm); Replaceall(tm, "$input", arg); Replaceall(tm, "$output", outarg); Printf(storeout, "%s := %s;\n", outarg, tm); p = Getattr(p, "tmap:m3wrapoutconv:next"); } else { p = nextSibling(p); } } } /* Generate cleanup code */ { Parm *p = l; while (p != NIL) { String *tm = Getattr(p, "tmap:m3wrapfreearg"); if (tm != NIL) { String *arg = Getattr(p, "autoname"); String *outarg = Getattr(p, "m3outarg"); addImports(m3wrap_impl.import, "m3wrapfreearg", p); num_exceptions += addThrows(throws_hash, "m3wrapfreearg", p); //substituteClassname(Getattr(p,"type"), tm); Replaceall(tm, "$input", arg); Replaceall(tm, "$output", outarg); Printv(cleanup, tm, "\n", NIL); p = Getattr(p, "tmap:m3wrapfreearg:next"); } else { p = nextSibling(p); } } } { /* Currently I don't know how a typemap similar to the original 'out' typemap could help returning the return value. */ /* Receive result from call to raw library function */ if (!has_return_raw) { /* rawcall(arg1); result.val := arg1; RETURN result; */ /* rawcall(arg1); RETURN arg1; */ Printf(reccall, "%s;\n", rawcall); if (hasContent(result_name)) { Printf(outarg, "RETURN %s;\n", result_name); } } else { /* arg0 := rawcall(arg1); result.ret := Convert(arg0); result.val := arg1; RETURN result; */ /* arg0 := rawcall(); RETURN Convert(arg0); */ /* RETURN rawcall(); */ String *return_raw = getMappedTypeNew(n, "m3wrapretraw", "", false); String *return_conv = getMappedTypeNew(n, "m3wrapretconv", "", false); /* immediate RETURN would skip result checking */ if ((hasContent(outcheck) || hasContent(storeout) || hasContent(cleanup)) && (!hasContent(result_name)) && (return_raw == NIL)) { Printv(result_name, Swig_cresult_name(), NIL); Printf(local_variables, "%s: %s;\n", result_name, result_m3wraptype); } String *result_lvalue = Copy(result_name); if (multiretval) { Printf(result_lvalue, ".%s", result_return); } if (return_raw != NIL) { Printf(reccall, "%s := %s;\n", return_raw, rawcall); } else if (hasContent(result_name)) { Printf(reccall, "%s := %s;\n", result_lvalue, rawcall); } else { Printf(outarg, "RETURN %s;\n", rawcall); } if (return_conv != NIL) { addImports(m3wrap_impl.import, "m3wrapretconv", n); num_exceptions += addThrows(throws_hash, "m3wrapretconv", n); if (hasContent(result_name)) { Printf(reccall, "%s := %s;\n", result_lvalue, return_conv); Printf(outarg, "RETURN %s;\n", result_name); } else { Printf(outarg, "RETURN %s;\n", return_conv); } } else { if (hasContent(result_name)) { Printf(outarg, "RETURN %s;\n", result_name); } } } } /* Create procedure header */ { String *header = NewStringf("PROCEDURE %s (%s)", func_name, arguments); if ((num_returns > 0) || multiretval) { Printf(header, ": %s", result_m3wraptype); } generateThrowsClause(throws_hash, header); Append(function_code, header); m3wrap_intf.enterBlock(no_block); Printf(m3wrap_intf.f, "%s;\n\n", header); } { String *body = NewStringf("%s%s%s%s%s", incheck, setup, reccall, outcheck, storeout); String *exc_handler; if (hasContent(cleanup) && (num_exceptions > 0)) { exc_handler = NewStringf("TRY\n%sFINALLY\n%sEND;\n", body, cleanup); } else { exc_handler = NewStringf("%s%s", body, cleanup); } Printf(function_code, " =\n%s%s%s%sBEGIN\n%s%sEND %s;\n\n", hasContent(local_constants) ? "CONST\n" : "", local_constants, hasContent(local_variables) ? "VAR\n" : "", local_variables, exc_handler, outarg, func_name); Delete(exc_handler); Delete(body); } m3wrap_impl.enterBlock(no_block); if (proxy_flag && global_variable_flag) { setter_flag = (Cmp(Getattr(n, "sym:name"), Swig_name_set(NSPACE_TODO, variable_name)) == 0); // Properties if (setter_flag) { // Setter method String *tm = getMappedTypeNew(n, "m3varin", ""); if (tm != NIL) { if (GetFlag(n, "feature:new")) { Replaceall(tm, "$owner", "true"); } else { Replaceall(tm, "$owner", "false"); } substituteClassname(t, tm); Replaceall(tm, "$rawcall", rawcall); Replaceall(tm, "$vartype", variable_type); /* $type is already replaced by some super class */ Replaceall(tm, "$var", variable_name); Printf(m3wrap_impl.f, "%s", tm); } } else { // Getter method String *tm = getMappedTypeNew(n, "m3varout", ""); if (tm != NIL) { if (GetFlag(n, "feature:new")) Replaceall(tm, "$owner", "true"); else Replaceall(tm, "$owner", "false"); substituteClassname(t, tm); Replaceall(tm, "$rawcall", rawcall); Replaceall(tm, "$vartype", variable_type); Replaceall(tm, "$var", variable_name); Printf(m3wrap_impl.f, "%s", tm); } } } else { // Normal function call Printv(m3wrap_impl.f, function_code, NIL); } Delete(arguments); Delete(return_variables); Delete(local_variables); Delete(local_constants); Delete(outarg); Delete(incheck); Delete(outcheck); Delete(setup); Delete(cleanup); Delete(storeout); Delete(function_code); Delete(result_name); Delete(result_m3wraptype); Delete(reccall); Delete(rawcall); Delete(throws_hash); } /*---------------------------------------------------------------------- * replaceSpecialVariables() *--------------------------------------------------------------------*/ virtual void replaceSpecialVariables(String *method, String *tm, Parm *parm) { (void)method; SwigType *type = Getattr(parm, "type"); substituteClassname(type, tm); } /* ----------------------------------------------------------------------------- * substituteClassname() * * Substitute the special variable $m3classname with the proxy class name for classes/structs/unions * that SWIG knows about. * Otherwise use the $descriptor name for the Modula 3 class name. Note that the $&m3classname substitution * is the same as a $&descriptor substitution, ie one pointer added to descriptor name. * Inputs: * pt - parameter type * tm - typemap contents that might contain the special variable to be replaced * Outputs: * tm - typemap contents complete with the special variable substitution * Return: * substitution_performed - flag indicating if a substitution was performed * ----------------------------------------------------------------------------- */ bool substituteClassname(SwigType *pt, String *tm) { bool substitution_performed = false; if (Strstr(tm, "$m3classname") || Strstr(tm, "$&m3classname")) { String *classname = getProxyName(pt); if (classname) { Replaceall(tm, "$&m3classname", classname); // getProxyName() works for pointers to classes too Replaceall(tm, "$m3classname", classname); } else { // use $descriptor if SWIG does not know anything about this type. Note that any typedefs are resolved. String *descriptor = NULL; SwigType *type = Copy(SwigType_typedef_resolve_all(pt)); if (Strstr(tm, "$&m3classname")) { SwigType_add_pointer(type); descriptor = NewStringf("SWIGTYPE%s", SwigType_manglestr(type)); Replaceall(tm, "$&m3classname", descriptor); } else { // $m3classname descriptor = NewStringf("SWIGTYPE%s", SwigType_manglestr(type)); Replaceall(tm, "$m3classname", descriptor); } // Add to hash table so that the type wrapper classes can be created later Setattr(swig_types_hash, descriptor, type); Delete(descriptor); Delete(type); } substitution_performed = true; } return substitution_performed; } /* ----------------------------------------------------------------------------- * attachParameterNames() * * Inputs: * n - Node of a function declaration * tmid - attribute name for overriding C argument names, * e.g. "tmap:m3wrapinname", * don't forget to attach the mapped types before * nameid - attribute for attaching the names, * e.g. "modula3:inname" * fmt - format for the argument name containing %d * e.g. "arg%d" * ----------------------------------------------------------------------------- */ void attachParameterNames(Node *n, const char *tmid, const char *nameid, const char *fmt) { /* Use C parameter name if present and unique, otherwise create an 'arg%d' name */ Hash *hash = NewHash(); Parm *p = Getattr(n, "parms"); int count = 0; while (p != NIL) { String *name = Getattr(p, tmid); if (name == NIL) { name = Getattr(p, "name"); } String *newname; if ((!hasContent(name)) || (Getattr(hash, name) != NIL)) { newname = NewStringf(fmt, count); } else { newname = Copy(name); } if (1 == Setattr(hash, newname, "1")) { Swig_warning(WARN_MODULA3_DOUBLE_ID, input_file, line_number, "Argument '%s' twice.\n", newname); } Setattr(p, nameid, newname); // Delete(newname); p = nextSibling(p); count++; } Delete(hash); } /* ----------------------------------------------------------------------------- * createM3Signature() * * Create signature of M3 wrapper procedure * Call attachParameterNames and attach mapped types before! * m3wrapintype, m3wrapinmode, m3wrapindefault * ----------------------------------------------------------------------------- */ String *createM3Signature(Node *n) { String *arguments = NewString(""); Parm *p = skipIgnored(Getattr(n, "parms"), "m3wrapintype"); writeArgState state; while (p != NIL) { /* Get the M3 parameter type */ String *tm = getMappedType(p, "m3wrapintype"); if (tm != NIL) { if (isInParam(p)) { addImports(m3wrap_intf.import, "m3wrapintype", p); addImports(m3wrap_impl.import, "m3wrapintype", p); String *mode = Getattr(p, "tmap:m3wrapinmode"); String *deflt = Getattr(p, "tmap:m3wrapindefault"); String *arg = Getattr(p, "autoname"); SwigType *pt = Getattr(p, "type"); substituteClassname(pt, tm); /* do we need this ? */ writeArg(arguments, state, mode, arg, tm, deflt); } p = skipIgnored(Getattr(p, "tmap:m3wrapintype:next"), "m3wrapintype"); } else { p = nextSibling(p); } } writeArg(arguments, state, NIL, NIL, NIL, NIL); return (arguments); } /* not used any longer - try SwigType_str if required again */ #if 0 /* ----------------------------------------------------------------------------- * createCSignature() * * Create signature of C function * ----------------------------------------------------------------------------- */ String *createCSignature(Node *n) { String *arguments = NewString(""); bool gencomma = false; Node *p; for (p = Getattr(n, "parms"); p != NIL; p = nextSibling(p)) { if (gencomma) { Append(arguments, ","); } gencomma = true; String *type = Getattr(p, "type"); String *ctype = getMappedTypeNew(type, "ctype"); Append(arguments, ctype); } return arguments; } #endif /* ----------------------------------------------------------------------------- * emitTypeWrapperClass() * ----------------------------------------------------------------------------- */ void emitTypeWrapperClass(String *classname, SwigType *type) { Node *n = NewHash(); Setfile(n, input_file); Setline(n, line_number); String *filen = NewStringf("%s%s.m3", SWIG_output_directory(), classname); File *f_swigtype = NewFile(filen, "w", SWIG_output_files()); if (!f_swigtype) { FileErrorDisplay(filen); SWIG_exit(EXIT_FAILURE); } String *swigtype = NewString(""); // Emit banner name emitBanner(f_swigtype); // Pure Modula 3 baseclass and interfaces const String *pure_baseclass = typemapLookup(n, "m3base", type, WARN_NONE); const String *pure_interfaces = typemapLookup(n, "m3interfaces", type, WARN_NONE); // Emit the class Printv(swigtype, typemapLookup(n, "m3imports", type, WARN_NONE), // Import statements "\n", typemapLookup(n, "m3classmodifiers", type, WARN_MODULA3_TYPEMAP_CLASSMOD_UNDEF), // Class modifiers " class $m3classname", // Class name and bases *Char(pure_baseclass) ? " : " : "", pure_baseclass, *Char(pure_interfaces) ? // Interfaces " : " : "", pure_interfaces, " {\n", " private IntPtr swigCPtr;\n", "\n", " ", typemapLookup(n, "m3ptrconstructormodifiers", type, WARN_MODULA3_TYPEMAP_PTRCONSTMOD_UNDEF), // pointer constructor modifiers " $m3classname(IntPtr cPtr, bool bFutureUse) {\n", // Constructor used for wrapping pointers " swigCPtr = cPtr;\n", " }\n", "\n", " protected $m3classname() {\n", // Default constructor " swigCPtr = IntPtr.Zero;\n", " }\n", typemapLookup(n, "m3getcptr", type, WARN_MODULA3_TYPEMAP_GETCPTR_UNDEF), // getCPtr method typemapLookup(n, "m3code", type, WARN_NONE), // extra Modula 3 code "}\n", "\n", NIL); Replaceall(swigtype, "$m3classname", classname); Printv(f_swigtype, swigtype, NIL); Delete(f_swigtype); Delete(filen); Delete(swigtype); } /* ----------------------------------------------------------------------------- * typemapLookup() * n - for input only and must contain info for Getfile(n) and Getline(n) to work * tmap_method - typemap method name * type - typemap type to lookup * warning - warning number to issue if no typemaps found * typemap_attributes - the typemap attributes are attached to this node and will * also be used for temporary storage if non null * return is never NULL, unlike Swig_typemap_lookup() * ----------------------------------------------------------------------------- */ const String *typemapLookup(Node *n, const_String_or_char_ptr tmap_method, SwigType *type, int warning, Node *typemap_attributes = 0) { Node *node = !typemap_attributes ? NewHash() : typemap_attributes; Setattr(node, "type", type); Setfile(node, Getfile(n)); Setline(node, Getline(n)); const String *tm = Swig_typemap_lookup(tmap_method, node, "", 0); if (!tm) { tm = empty_string; if (warning != WARN_NONE) Swig_warning(warning, Getfile(n), Getline(n), "No %s typemap defined for %s\n", tmap_method, SwigType_str(type, 0)); } if (!typemap_attributes) Delete(node); return tm; } /* ----------------------------------------------------------------------------- * addThrows() * * Add all exceptions to a hash that are associated with the 'typemap'. * Return number the number of these exceptions. * ----------------------------------------------------------------------------- */ int addThrows(Hash *throws_hash, const String *typemap, Node *parameter) { // Get the comma separated throws clause - held in "throws" attribute in the typemap passed in int len = 0; String *throws_attribute = NewStringf("%s:throws", typemap); addImports(m3wrap_intf.import, throws_attribute, parameter); addImports(m3wrap_impl.import, throws_attribute, parameter); String *throws = getMappedTypeNew(parameter, Char(throws_attribute), "", false); //printf("got exceptions %s for %s\n", Char(throws), Char(throws_attribute)); if (throws) { // Put the exception classes in the throws clause into a temporary List List *temp_classes_list = Split(throws, ',', INT_MAX); len = Len(temp_classes_list); // Add the exception classes to the node throws list, but don't duplicate if already in list if (temp_classes_list /*&& hasContent(temp_classes_list) */ ) { for (Iterator cls = First(temp_classes_list); cls.item != NIL; cls = Next(cls)) { String *exception_class = NewString(cls.item); Replaceall(exception_class, " ", ""); // remove spaces Replaceall(exception_class, "\t", ""); // remove tabs if (hasContent(exception_class)) { // $m3classname substitution SwigType *pt = Getattr(parameter, "type"); substituteClassname(pt, exception_class); // Don't duplicate the exception class in the throws clause //printf("add exception %s\n", Char(exception_class)); Setattr(throws_hash, exception_class, "1"); } Delete(exception_class); } } Delete(temp_classes_list); } Delete(throws_attribute); return len; } /* ----------------------------------------------------------------------------- * generateThrowsClause() * ----------------------------------------------------------------------------- */ void generateThrowsClause(Hash *throws_hash, String *code) { // Add the throws clause into code if (Len(throws_hash) > 0) { Iterator cls = First(throws_hash); Printf(code, " RAISES {%s", cls.key); for (cls = Next(cls); cls.key != NIL; cls = Next(cls)) { Printf(code, ", %s", cls.key); } Printf(code, "}"); } } /* ----------------------------------------------------------------------------- * addImports() * * Add all imports that are needed for contents of 'typemap'. * ----------------------------------------------------------------------------- */ void addImports(Hash *imports_hash, const String *typemap, Node *node) { // Get the comma separated throws clause - held in "throws" attribute in the typemap passed in String *imports_attribute = NewStringf("%s:import", typemap); String *imports = getMappedTypeNew(node, Char(imports_attribute), "", false); //printf("got imports %s for %s\n", Char(imports), Char(imports_attribute)); if (imports != NIL) { List *import_list = Split(imports, ',', INT_MAX); // Add the exception classes to the node imports list, but don't duplicate if already in list if (import_list != NIL) { for (Iterator imp = First(import_list); imp.item != NIL; imp = Next(imp)) { List *import_pair = Split(imp.item, ' ', 3); if (Len(import_pair) == 1) { Setattr(imports_hash, Getitem(import_pair, 0), ""); } else if ((Len(import_pair) == 3) && Strcmp(Getitem(import_pair, 1), "AS") == 0) { Setattr(imports_hash, Getitem(import_pair, 0), Getitem(import_pair, 2)); } else { Swig_warning(WARN_MODULA3_BAD_IMPORT, input_file, line_number, "Malformed import '%s' for typemap '%s' defined for type '%s'\n", imp, typemap, SwigType_str(Getattr(node, "type"), 0)); } Delete(import_pair); } } Delete(import_list); } Delete(imports_attribute); } /* ----------------------------------------------------------------------------- * emitImportStatements() * ----------------------------------------------------------------------------- */ void emitImportStatements(Hash *imports_hash, String *code) { // Add the imports statements into code Iterator imp = First(imports_hash); while (imp.key != NIL) { Printf(code, "IMPORT %s", imp.key); String *imp_as = imp.item; if (hasContent(imp_as)) { Printf(code, " AS %s", imp_as); } Printf(code, ";\n"); imp = Next(imp); } } }; /* class MODULA3 */ /* ----------------------------------------------------------------------------- * swig_modula3() - Instantiate module * ----------------------------------------------------------------------------- */ extern "C" Language *swig_modula3(void) { return new MODULA3(); } /* ----------------------------------------------------------------------------- * Static member variables * ----------------------------------------------------------------------------- */ const char *MODULA3::usage = "\ Modula 3 Options (available with -modula3)\n\ -generateconst - Generate code for computing numeric values of constants\n\ -generaterename - Generate suggestions for %rename\n\ -generatetypemap - Generate templates for some basic typemaps\n\ -oldvarnames - Old intermediary method names for variable wrappers\n\ \n"; /* -generateconst - stem of the .c source file for computing the numeric values of constants\n\ -generaterename - stem of the .i source file containing %rename suggestions\n\ -generatetypemap - stem of the .i source file containing typemap patterns\n\ */ swig-4.0.1/Source/Modules/nested.cxx0000644000175000017500000003013513527063513017230 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * nested.cxx * * Nested structs support * ----------------------------------------------------------------------------- */ #include "swigmod.h" #include "cparse.h" // Nested classes processing section static Hash *classhash = 0; static String *make_name(Node *n, String *name, SwigType *decl) { int destructor = name && (*(Char(name)) == '~'); if (String *yyrename = Getattr(n, "class_rename")) { String *s = NewString(yyrename); Delattr(n, "class_rename"); if (destructor && (*(Char(s)) != '~')) { Insert(s, 0, "~"); } return s; } if (!name) return 0; return Swig_name_make(n, 0, name, decl, 0); } // C version of add_symbols() static void add_symbols_c(Node *n) { String *decl; String *wrn = 0; String *symname = 0; int iscdecl = Cmp(nodeType(n), "cdecl") == 0; Setattr(n, "ismember", "1"); Setattr(n, "access", "public"); if (Getattr(n, "sym:name")) return; decl = Getattr(n, "decl"); if (!SwigType_isfunction(decl)) { String *name = Getattr(n, "name"); String *makename = Getattr(n, "parser:makename"); if (iscdecl) { String *storage = Getattr(n, "storage"); if (Cmp(storage, "typedef") == 0) { Setattr(n, "kind", "typedef"); } else { SwigType *type = Getattr(n, "type"); String *value = Getattr(n, "value"); Setattr(n, "kind", "variable"); if (value && Len(value)) { Setattr(n, "hasvalue", "1"); } if (type) { SwigType *ty; SwigType *tmp = 0; if (decl) { ty = tmp = Copy(type); SwigType_push(ty, decl); } else { ty = type; } if (!SwigType_ismutable(ty)) { SetFlag(n, "hasconsttype"); SetFlag(n, "feature:immutable"); } if (tmp) Delete(tmp); } if (!type) { Printf(stderr, "notype name %s\n", name); } } } Swig_features_get(Swig_cparse_features(), 0, name, 0, n); if (makename) { symname = make_name(n, makename, 0); Delattr(n, "parser:makename"); /* temporary information, don't leave it hanging around */ } else { makename = name; symname = make_name(n, makename, 0); } if (!symname) { symname = Copy(Getattr(n, "unnamed")); } if (symname) { wrn = Swig_name_warning(n, 0, symname, 0); } } else { String *name = Getattr(n, "name"); SwigType *fdecl = Copy(decl); SwigType *fun = SwigType_pop_function(fdecl); if (iscdecl) { Setattr(n, "kind", "function"); } Swig_features_get(Swig_cparse_features(), 0, name, fun, n); symname = make_name(n, name, fun); wrn = Swig_name_warning(n, 0, symname, fun); Delete(fdecl); Delete(fun); } if (!symname) return; if (GetFlag(n, "feature:ignore")) { /* Only add to C symbol table and continue */ Swig_symbol_add(0, n); } else if (strncmp(Char(symname), "$ignore", 7) == 0) { char *c = Char(symname) + 7; SetFlag(n, "feature:ignore"); if (strlen(c)) { SWIG_WARN_NODE_BEGIN(n); Swig_warning(0, Getfile(n), Getline(n), "%s\n", c + 1); SWIG_WARN_NODE_END(n); } Swig_symbol_add(0, n); } else { Node *c; if ((wrn) && (Len(wrn))) { String *metaname = symname; if (!Getmeta(metaname, "already_warned")) { SWIG_WARN_NODE_BEGIN(n); Swig_warning(0, Getfile(n), Getline(n), "%s\n", wrn); SWIG_WARN_NODE_END(n); Setmeta(metaname, "already_warned", "1"); } } c = Swig_symbol_add(symname, n); if (c != n) { /* symbol conflict attempting to add in the new symbol */ if (Getattr(n, "sym:weak")) { Setattr(n, "sym:name", symname); } else { String *e = NewStringEmpty(); String *en = NewStringEmpty(); String *ec = NewStringEmpty(); int redefined = Swig_need_redefined_warn(n, c, true); if (redefined) { Printf(en, "Identifier '%s' redefined (ignored)", symname); Printf(ec, "previous definition of '%s'", symname); } else { Printf(en, "Redundant redeclaration of '%s'", symname); Printf(ec, "previous declaration of '%s'", symname); } if (Cmp(symname, Getattr(n, "name"))) { Printf(en, " (Renamed from '%s')", SwigType_namestr(Getattr(n, "name"))); } Printf(en, ","); if (Cmp(symname, Getattr(c, "name"))) { Printf(ec, " (Renamed from '%s')", SwigType_namestr(Getattr(c, "name"))); } Printf(ec, "."); SWIG_WARN_NODE_BEGIN(n); if (redefined) { Swig_warning(WARN_PARSE_REDEFINED, Getfile(n), Getline(n), "%s\n", en); Swig_warning(WARN_PARSE_REDEFINED, Getfile(c), Getline(c), "%s\n", ec); } else { Swig_warning(WARN_PARSE_REDUNDANT, Getfile(n), Getline(n), "%s\n", en); Swig_warning(WARN_PARSE_REDUNDANT, Getfile(c), Getline(c), "%s\n", ec); } SWIG_WARN_NODE_END(n); Printf(e, "%s:%d:%s\n%s:%d:%s\n", Getfile(n), Getline(n), en, Getfile(c), Getline(c), ec); Setattr(n, "error", e); Delete(e); Delete(en); Delete(ec); } } } Delete(symname); } /* Strips C-style and C++-style comments from string in-place. */ static void strip_comments(char *string) { int state = 0; /* * 0 - not in comment * 1 - in c-style comment * 2 - in c++-style comment * 3 - in string * 4 - after reading / not in comments * 5 - after reading * in c-style comments * 6 - after reading \ in strings */ char *c = string; while (*c) { switch (state) { case 0: if (*c == '\"') state = 3; else if (*c == '/') state = 4; break; case 1: if (*c == '*') state = 5; *c = ' '; break; case 2: if (*c == '\n') state = 0; else *c = ' '; break; case 3: if (*c == '\"') state = 0; else if (*c == '\\') state = 6; break; case 4: if (*c == '/') { *(c - 1) = ' '; *c = ' '; state = 2; } else if (*c == '*') { *(c - 1) = ' '; *c = ' '; state = 1; } else state = 0; break; case 5: if (*c == '/') state = 0; else state = 1; *c = ' '; break; case 6: state = 3; break; } ++c; } } // Create a %insert with a typedef to make a new name visible to C static Node *create_insert(Node *n, bool noTypedef = false) { // format a typedef String *ccode = Getattr(n, "code"); Push(ccode, " "); if (noTypedef) { Push(ccode, Getattr(n, "name")); Push(ccode, " "); Push(ccode, Getattr(n, "kind")); } else { Push(ccode, Getattr(n, "kind")); Push(ccode, "typedef "); Append(ccode, " "); Append(ccode, Getattr(n, "tdname")); } Append(ccode, ";"); /* Strip comments - further code may break in presence of comments. */ strip_comments(Char(ccode)); /* Make all SWIG created typedef structs/unions/classes unnamed else redefinition errors occur - nasty hack alert. */ if (!noTypedef) { const char *types_array[3] = { "struct", "union", "class" }; for (int i = 0; i < 3; i++) { char *code_ptr = Char(ccode); while (code_ptr) { /* Replace struct name (as in 'struct name {...}' ) with whitespace name will be between struct and opening brace */ code_ptr = strstr(code_ptr, types_array[i]); if (code_ptr) { char *open_bracket_pos; code_ptr += strlen(types_array[i]); open_bracket_pos = strchr(code_ptr, '{'); if (open_bracket_pos) { /* Make sure we don't have something like struct A a; */ char *semi_colon_pos = strchr(code_ptr, ';'); if (!(semi_colon_pos && (semi_colon_pos < open_bracket_pos))) while (code_ptr < open_bracket_pos) *code_ptr++ = ' '; } } } } } { /* Remove SWIG directive %constant which may be left in the SWIG created typedefs */ char *code_ptr = Char(ccode); while (code_ptr) { code_ptr = strstr(code_ptr, "%constant"); if (code_ptr) { char *directive_end_pos = strchr(code_ptr, ';'); if (directive_end_pos) { while (code_ptr <= directive_end_pos) *code_ptr++ = ' '; } } } } Node *newnode = NewHash(); set_nodeType(newnode, "insert"); Setfile(newnode, Getfile(n)); Setline(newnode, Getline(n)); String *code = NewStringEmpty(); Wrapper_pretty_print(ccode, code); Setattr(newnode, "code", code); Delete(code); Delattr(n, "code"); return newnode; } static void insertNodeAfter(Node *n, Node *c) { Node *g = parentNode(n); set_parentNode(c, g); Node *ns = nextSibling(n); if (Node *outer = Getattr(c, "nested:outer")) { while (ns && outer == Getattr(ns, "nested:outer")) { n = ns; ns = nextSibling(n); } } if (!ns) { set_lastChild(g, c); } else { set_nextSibling(c, ns); set_previousSibling(ns, c); } set_nextSibling(n, c); set_previousSibling(c, n); } void Swig_nested_name_unnamed_c_structs(Node *n) { if (!n) return; if (!classhash) classhash = Getattr(n, "classes"); Node *c = firstChild(n); while (c) { Node *next = nextSibling(c); if (String *declName = Getattr(c, "nested:unnamed")) { if (Node *outer = Getattr(c, "nested:outer")) { // generate a name String *name = NewStringf("%s_%s", Getattr(outer, "name"), declName); Delattr(c, "nested:unnamed"); // set the name to the class and symbol table Setattr(c, "tdname", name); Setattr(c, "name", name); Swig_symbol_setscope(Getattr(c, "symtab")); Swig_symbol_setscopename(name); // now that we have a name - gather base symbols if (List *publicBases = Getattr(c, "baselist")) { List *bases = Swig_make_inherit_list(name, publicBases, 0); Swig_inherit_base_symbols(bases); Delete(bases); } Setattr(classhash, name, c); // Merge the extension into the symbol table if (Node *am = Getattr(Swig_extend_hash(), name)) { Swig_extend_merge(c, am); Swig_extend_append_previous(c, am); Delattr(Swig_extend_hash(), name); } Swig_symbol_popscope(); // process declarations following this type (assign correct new type) SwigType *ty = Copy(name); Node *decl = nextSibling(c); List *declList = NewList(); while (decl && Getattr(decl, "nested:unnamedtype") == c) { Setattr(decl, "type", ty); Append(declList, decl); Delattr(decl, "nested:unnamedtype"); SetFlag(decl, "feature:immutable"); add_symbols_c(decl); decl = nextSibling(decl); } Delete(ty); Swig_symbol_setscope(Swig_symbol_global_scope()); add_symbols_c(c); Node *ins = create_insert(c); insertNodeAfter(c, ins); removeNode(c); insertNodeAfter(n, c); Delete(ins); Delattr(c, "nested:outer"); } else { // global unnamed struct - ignore it and it's instances SetFlag(c, "feature:ignore"); while (next && Getattr(next, "nested:unnamedtype") == c) { SetFlag(next, "feature:ignore"); next = nextSibling(next); } c = next; continue; } } else if (cparse_cplusplusout) { if (Getattr(c, "nested:outer")) { Node *ins = create_insert(c, true); insertNodeAfter(c, ins); Delete(ins); Delattr(c, "nested:outer"); } } // process children Swig_nested_name_unnamed_c_structs(c); c = next; } } static void remove_outer_class_reference(Node *n) { for (Node *c = firstChild(n); c; c = nextSibling(c)) { if (GetFlag(c, "feature:flatnested") || Language::instance()->nestedClassesSupport() == Language::NCS_None) { Delattr(c, "nested:outer"); remove_outer_class_reference(c); } } } void Swig_nested_process_classes(Node *n) { if (!n) return; Node *c = firstChild(n); while (c) { Node *next = nextSibling(c); if (!Getattr(c, "templatetype")) { if (GetFlag(c, "nested") && (GetFlag(c, "feature:flatnested") || Language::instance()->nestedClassesSupport() == Language::NCS_None)) { removeNode(c); if (!checkAttribute(c, "access", "public")) SetFlag(c, "feature:ignore"); else if (Strcmp(nodeType(n),"extend") == 0 && Strcmp(nodeType(parentNode(n)),"class") == 0) insertNodeAfter(parentNode(n), c); else insertNodeAfter(n, c); } Swig_nested_process_classes(c); } c = next; } remove_outer_class_reference(n); } swig-4.0.1/Source/Modules/allocate.cxx0000644000175000017500000007426213527063513017543 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * allocate.cxx * * This module tries to figure out which classes and structures support * default constructors and destructors in C++. There are several rules that * define this behavior including pure abstract methods, private sections, * and non-default constructors in base classes. See the ARM or * Doc/Manual/SWIGPlus.html for details. * ----------------------------------------------------------------------------- */ #include "swigmod.h" #include "cparse.h" static int virtual_elimination_mode = 0; /* set to 0 on default */ /* Set virtual_elimination_mode */ void Wrapper_virtual_elimination_mode_set(int flag) { virtual_elimination_mode = flag; } /* Helper function to assist with abstract class checking. This is a major hack. Sorry. */ extern "C" { static String *search_decl = 0; /* Declarator being searched */ static int check_implemented(Node *n) { String *decl; if (!n) return 0; while (n) { if (Strcmp(nodeType(n), "cdecl") == 0) { decl = Getattr(n, "decl"); if (SwigType_isfunction(decl)) { SwigType *decl1 = SwigType_typedef_resolve_all(decl); SwigType *decl2 = SwigType_pop_function(decl1); if (Strcmp(decl2, search_decl) == 0) { if (!GetFlag(n, "abstract")) { Delete(decl1); Delete(decl2); return 1; } } Delete(decl1); Delete(decl2); } } n = Getattr(n, "csym:nextSibling"); } return 0; } } class Allocate:public Dispatcher { Node *inclass; int extendmode; /* Checks if a function, n, is the same as any in the base class, ie if the method is polymorphic. * Also checks for methods which will be hidden (ie a base has an identical non-virtual method). * Both methods must have public access for a match to occur. */ int function_is_defined_in_bases(Node *n, Node *bases) { if (!bases) return 0; String *this_decl = Getattr(n, "decl"); if (!this_decl) return 0; String *name = Getattr(n, "name"); String *this_type = Getattr(n, "type"); String *resolved_decl = SwigType_typedef_resolve_all(this_decl); // Search all base classes for methods with same signature for (int i = 0; i < Len(bases); i++) { Node *b = Getitem(bases, i); Node *base = firstChild(b); while (base) { if (Strcmp(nodeType(base), "extend") == 0) { // Loop through all the %extend methods Node *extend = firstChild(base); while (extend) { if (function_is_defined_in_bases_seek(n, b, extend, this_decl, name, this_type, resolved_decl)) { Delete(resolved_decl); return 1; } extend = nextSibling(extend); } } else if (Strcmp(nodeType(base), "using") == 0) { // Loop through all the using declaration methods Node *usingdecl = firstChild(base); while (usingdecl) { if (function_is_defined_in_bases_seek(n, b, usingdecl, this_decl, name, this_type, resolved_decl)) { Delete(resolved_decl); return 1; } usingdecl = nextSibling(usingdecl); } } else { // normal methods if (function_is_defined_in_bases_seek(n, b, base, this_decl, name, this_type, resolved_decl)) { Delete(resolved_decl); return 1; } } base = nextSibling(base); } } Delete(resolved_decl); resolved_decl = 0; for (int j = 0; j < Len(bases); j++) { Node *b = Getitem(bases, j); if (function_is_defined_in_bases(n, Getattr(b, "allbases"))) return 1; } return 0; } /* Helper function for function_is_defined_in_bases */ int function_is_defined_in_bases_seek(Node *n, Node *b, Node *base, String *this_decl, String *name, String *this_type, String *resolved_decl) { String *base_decl = Getattr(base, "decl"); SwigType *base_type = Getattr(base, "type"); if (base_decl && base_type) { if (checkAttribute(base, "name", name) && !GetFlag(b, "feature:ignore") /* whole class is ignored */ ) { if (SwigType_isfunction(resolved_decl) && SwigType_isfunction(base_decl)) { // We have found a method that has the same name as one in a base class bool covariant_returntype = false; bool returntype_match = Strcmp(base_type, this_type) == 0 ? true : false; bool decl_match = Strcmp(base_decl, this_decl) == 0 ? true : false; if (returntype_match && decl_match) { // Exact match - we have found a method with identical signature // No typedef resolution was done, but skipping it speeds things up slightly } else { // Either we have: // 1) matching methods but are one of them uses a different typedef (return type or parameter) to the one in base class' method // 2) matching polymorphic methods with covariant return type // 3) a non-matching method (ie an overloaded method of some sort) // 4) a matching method which is not polymorphic, ie it hides the base class' method // Check if fully resolved return types match (including // covariant return types) if (!returntype_match) { String *this_returntype = function_return_type(n); String *base_returntype = function_return_type(base); returntype_match = Strcmp(this_returntype, base_returntype) == 0 ? true : false; if (!returntype_match) { covariant_returntype = SwigType_issubtype(this_returntype, base_returntype) ? true : false; returntype_match = covariant_returntype; } Delete(this_returntype); Delete(base_returntype); } // The return types must match at this point, for the whole method to match if (returntype_match && !decl_match) { // Now need to check the parameter list // First do an inexpensive parameter count ParmList *this_parms = Getattr(n, "parms"); ParmList *base_parms = Getattr(base, "parms"); if (ParmList_len(this_parms) == ParmList_len(base_parms)) { // Number of parameters are the same, now check that all the parameters match SwigType *base_fn = NewString(""); SwigType *this_fn = NewString(""); SwigType_add_function(base_fn, base_parms); SwigType_add_function(this_fn, this_parms); base_fn = SwigType_typedef_resolve_all(base_fn); this_fn = SwigType_typedef_resolve_all(this_fn); if (Strcmp(base_fn, this_fn) == 0) { // Finally check that the qualifiers match int base_qualifier = SwigType_isqualifier(resolved_decl); int this_qualifier = SwigType_isqualifier(base_decl); if (base_qualifier == this_qualifier) { decl_match = true; } } Delete(base_fn); Delete(this_fn); } } } //Printf(stderr,"look %s %s %d %d\n",base_decl, this_decl, returntype_match, decl_match); if (decl_match && returntype_match) { // Found an identical method in the base class bool this_wrapping_protected_members = is_member_director(n) ? true : false; // This should really check for dirprot rather than just being a director method bool base_wrapping_protected_members = is_member_director(base) ? true : false; // This should really check for dirprot rather than just being a director method bool both_have_public_access = is_public(n) && is_public(base); bool both_have_protected_access = (is_protected(n) && this_wrapping_protected_members) && (is_protected(base) && base_wrapping_protected_members); bool both_have_private_access = is_private(n) && is_private(base); if (checkAttribute(base, "storage", "virtual")) { // Found a polymorphic method. // Mark the polymorphic method, in case the virtual keyword was not used. Setattr(n, "storage", "virtual"); if (!Getattr(b, "feature:interface")) { // interface implementation neither hides nor overrides if (both_have_public_access || both_have_protected_access) { if (!is_non_public_base(inclass, b)) Setattr(n, "override", base); // Note C# definition of override, ie access must be the same } else if (!both_have_private_access) { // Different access if (this_wrapping_protected_members || base_wrapping_protected_members) if (!is_non_public_base(inclass, b)) Setattr(n, "hides", base); // Note C# definition of hiding, ie hidden if access is different } } // Try and find the most base's covariant return type SwigType *most_base_covariant_type = Getattr(base, "covariant"); if (!most_base_covariant_type && covariant_returntype) most_base_covariant_type = function_return_type(base, false); if (!most_base_covariant_type) { // Eliminate the derived virtual method. if (virtual_elimination_mode && !is_member_director(n)) if (both_have_public_access) if (!is_non_public_base(inclass, b)) if (!Swig_symbol_isoverloaded(n)) { // Don't eliminate if an overloaded method as this hides the method // in the scripting languages: the dispatch function will hide the base method if ignored. SetFlag(n, "feature:ignore"); } } else { // Some languages need to know about covariant return types Setattr(n, "covariant", most_base_covariant_type); } } else { // Found an identical method in the base class, but it is not polymorphic. if (both_have_public_access || both_have_protected_access) if (!is_non_public_base(inclass, b)) Setattr(n, "hides", base); } if (both_have_public_access || both_have_protected_access) return 1; } } } } return 0; } /* Determines whether the base class, b, is in the list of private * or protected base classes for class n. */ bool is_non_public_base(Node *n, Node *b) { bool non_public_base = false; Node *bases = Getattr(n, "privatebases"); if (bases) { for (int i = 0; i < Len(bases); i++) { Node *base = Getitem(bases, i); if (base == b) non_public_base = true; } } bases = Getattr(n, "protectedbases"); if (bases) { for (int i = 0; i < Len(bases); i++) { Node *base = Getitem(bases, i); if (base == b) non_public_base = true; } } return non_public_base; } /* Returns the return type for a function. The node n should be a function. If resolve is true the fully returned type is fully resolved. Caller is responsible for deleting returned string. */ String *function_return_type(Node *n, bool resolve = true) { String *decl = Getattr(n, "decl"); SwigType *type = Getattr(n, "type"); String *ty = NewString(type); SwigType_push(ty, decl); if (SwigType_isqualifier(ty)) Delete(SwigType_pop(ty)); Delete(SwigType_pop_function(ty)); if (resolve) { String *unresolved = ty; ty = SwigType_typedef_resolve_all(unresolved); Delete(unresolved); } return ty; } /* Checks if a class member is the same as inherited from the class bases */ int class_member_is_defined_in_bases(Node *member, Node *classnode) { Node *bases; /* bases is the closest ancestors of classnode */ int defined = 0; bases = Getattr(classnode, "allbases"); if (!bases) return 0; { int old_mode = virtual_elimination_mode; if (is_member_director(classnode, member)) virtual_elimination_mode = 0; if (function_is_defined_in_bases(member, bases)) { defined = 1; } virtual_elimination_mode = old_mode; } if (defined) return 1; else return 0; } /* Checks to see if a class is abstract through inheritance, and saves the first node that seems to be abstract. */ int is_abstract_inherit(Node *n, Node *base = 0, int first = 0) { if (!first && (base == n)) return 0; if (!base) { /* Root node */ Symtab *stab = Getattr(n, "symtab"); /* Get symbol table for node */ Symtab *oldtab = Swig_symbol_setscope(stab); int ret = is_abstract_inherit(n, n, 1); Swig_symbol_setscope(oldtab); return ret; } List *abstracts = Getattr(base, "abstracts"); if (abstracts) { int dabstract = 0; int len = Len(abstracts); for (int i = 0; i < len; i++) { Node *nn = Getitem(abstracts, i); String *name = Getattr(nn, "name"); if (!name) continue; if (Strchr(name, '~')) continue; /* Don't care about destructors */ String *base_decl = Getattr(nn, "decl"); if (base_decl) base_decl = SwigType_typedef_resolve_all(base_decl); if (SwigType_isfunction(base_decl)) search_decl = SwigType_pop_function(base_decl); Node *dn = Swig_symbol_clookup_local_check(name, 0, check_implemented); Delete(search_decl); Delete(base_decl); if (!dn) { List *nabstracts = Getattr(n, "abstracts"); if (!nabstracts) { nabstracts = NewList(); Setattr(n, "abstracts", nabstracts); Delete(nabstracts); } Append(nabstracts, nn); if (!Getattr(n, "abstracts:firstnode")) { Setattr(n, "abstracts:firstnode", nn); } dabstract = base != n; } } if (dabstract) return 1; } List *bases = Getattr(base, "allbases"); if (!bases) return 0; for (int i = 0; i < Len(bases); i++) { if (is_abstract_inherit(n, Getitem(bases, i))) { return 1; } } return 0; } /* Grab methods used by smart pointers */ List *smart_pointer_methods(Node *cls, List *methods, int isconst, String *classname = 0) { if (!methods) { methods = NewList(); } Node *c = firstChild(cls); while (c) { if (Getattr(c, "error") || GetFlag(c, "feature:ignore")) { c = nextSibling(c); continue; } if (!isconst && (Strcmp(nodeType(c), "extend") == 0)) { methods = smart_pointer_methods(c, methods, isconst, Getattr(cls, "name")); } else if (Strcmp(nodeType(c), "cdecl") == 0) { if (!GetFlag(c, "feature:ignore")) { String *storage = Getattr(c, "storage"); if (!((Cmp(storage, "typedef") == 0)) && !((Cmp(storage, "friend") == 0))) { String *name = Getattr(c, "name"); String *symname = Getattr(c, "sym:name"); Node *e = Swig_symbol_clookup_local(name, 0); if (e && is_public(e) && !GetFlag(e, "feature:ignore") && (Cmp(symname, Getattr(e, "sym:name")) == 0)) { Swig_warning(WARN_LANG_DEREF_SHADOW, Getfile(e), Getline(e), "Declaration of '%s' shadows declaration accessible via operator->(),\n", name); Swig_warning(WARN_LANG_DEREF_SHADOW, Getfile(c), Getline(c), "previous declaration of '%s'.\n", name); } else { /* Make sure node with same name doesn't already exist */ int k; int match = 0; for (k = 0; k < Len(methods); k++) { e = Getitem(methods, k); if (Cmp(symname, Getattr(e, "sym:name")) == 0) { match = 1; break; } if (!Getattr(e, "sym:name") && (Cmp(name, Getattr(e, "name")) == 0)) { match = 1; break; } } if (!match) { Node *cc = c; while (cc) { Node *cp = cc; if (classname) { Setattr(cp, "extendsmartclassname", classname); } Setattr(cp, "allocate:smartpointeraccess", "1"); /* If constant, we have to be careful */ if (isconst) { SwigType *decl = Getattr(cp, "decl"); if (decl) { if (SwigType_isfunction(decl)) { /* If method, we only add if it's a const method */ if (SwigType_isconst(decl)) { Append(methods, cp); } } else { Append(methods, cp); } } else { Append(methods, cp); } } else { Append(methods, cp); } cc = Getattr(cc, "sym:nextSibling"); } } } } } } c = nextSibling(c); } /* Look for methods in base classes */ { Node *bases = Getattr(cls, "bases"); int k; for (k = 0; k < Len(bases); k++) { smart_pointer_methods(Getitem(bases, k), methods, isconst); } } /* Remove protected/private members */ { for (int i = 0; i < Len(methods);) { Node *n = Getitem(methods, i); if (!is_public(n)) { Delitem(methods, i); continue; } i++; } } return methods; } void mark_exception_classes(ParmList *p) { while (p) { SwigType *ty = Getattr(p, "type"); SwigType *t = SwigType_typedef_resolve_all(ty); if (SwigType_isreference(t) || SwigType_ispointer(t) || SwigType_isarray(t)) { Delete(SwigType_pop(t)); } Node *c = Swig_symbol_clookup(t, 0); if (c) { if (!GetFlag(c, "feature:exceptionclass")) { SetFlag(c, "feature:exceptionclass"); } } p = nextSibling(p); Delete(t); } } void process_exceptions(Node *n) { ParmList *catchlist = 0; /* the "catchlist" attribute is used to emit the block try {$action;} catch ; in emit.cxx and is either constructed from the "feature:catches" feature or copied from the node "throws" list. */ String *scatchlist = Getattr(n, "feature:catches"); if (scatchlist) { catchlist = Swig_cparse_parms(scatchlist, n); if (catchlist) { Setattr(n, "catchlist", catchlist); mark_exception_classes(catchlist); Delete(catchlist); } } ParmList *throws = Getattr(n, "throws"); if (throws) { /* if there is no explicit catchlist, we catch everything in the throws list */ if (!catchlist) { Setattr(n, "catchlist", throws); } mark_exception_classes(throws); } } public: Allocate(): inclass(NULL), extendmode(0) { } virtual int top(Node *n) { cplus_mode = PUBLIC; inclass = 0; extendmode = 0; emit_children(n); return SWIG_OK; } virtual int importDirective(Node *n) { return emit_children(n); } virtual int includeDirective(Node *n) { return emit_children(n); } virtual int externDeclaration(Node *n) { return emit_children(n); } virtual int namespaceDeclaration(Node *n) { return emit_children(n); } virtual int extendDirective(Node *n) { extendmode = 1; emit_children(n); extendmode = 0; return SWIG_OK; } virtual int classDeclaration(Node *n) { Symtab *symtab = Swig_symbol_current(); Swig_symbol_setscope(Getattr(n, "symtab")); save_value oldInclass(inclass); save_value oldAcessMode(cplus_mode); save_value oldExtendMode(extendmode); if (Getattr(n, "template")) extendmode = 0; if (!CPlusPlus) { /* Always have default constructors/destructors in C */ Setattr(n, "allocate:default_constructor", "1"); Setattr(n, "allocate:default_destructor", "1"); } if (Getattr(n, "allocate:visit")) return SWIG_OK; Setattr(n, "allocate:visit", "1"); /* Always visit base classes first */ { List *bases = Getattr(n, "bases"); if (bases) { for (int i = 0; i < Len(bases); i++) { Node *b = Getitem(bases, i); classDeclaration(b); } } } inclass = n; String *kind = Getattr(n, "kind"); if (Strcmp(kind, "class") == 0) { cplus_mode = PRIVATE; } else { cplus_mode = PUBLIC; } emit_children(n); /* Check if the class is abstract via inheritance. This might occur if a class didn't have any pure virtual methods of its own, but it didn't implement all of the pure methods in a base class */ if (!Getattr(n, "abstracts") && is_abstract_inherit(n)) { if (((Getattr(n, "allocate:public_constructor") || (!GetFlag(n, "feature:nodefault") && !Getattr(n, "allocate:has_constructor"))))) { if (!GetFlag(n, "feature:notabstract")) { Node *na = Getattr(n, "abstracts:firstnode"); if (na) { Swig_warning(WARN_TYPE_ABSTRACT, Getfile(n), Getline(n), "Class '%s' might be abstract, " "no constructors generated,\n", SwigType_namestr(Getattr(n, "name"))); Swig_warning(WARN_TYPE_ABSTRACT, Getfile(na), Getline(na), "Method %s might not be implemented.\n", Swig_name_decl(na)); if (!Getattr(n, "abstracts")) { List *abstracts = NewList(); Append(abstracts, na); Setattr(n, "abstracts", abstracts); Delete(abstracts); } } } } } if (!Getattr(n, "allocate:has_constructor")) { /* No constructor is defined. We need to check a few things */ /* If class is abstract. No default constructor. Sorry */ if (Getattr(n, "abstracts")) { Delattr(n, "allocate:default_constructor"); } if (!Getattr(n, "allocate:default_constructor")) { /* Check base classes */ List *bases = Getattr(n, "allbases"); int allows_default = 1; for (int i = 0; i < Len(bases); i++) { Node *n = Getitem(bases, i); /* If base class does not allow default constructor, we don't allow it either */ if (!Getattr(n, "allocate:default_constructor") && (!Getattr(n, "allocate:default_base_constructor"))) { allows_default = 0; } } if (allows_default) { Setattr(n, "allocate:default_constructor", "1"); } } } if (!Getattr(n, "allocate:has_copy_constructor")) { if (Getattr(n, "abstracts")) { Delattr(n, "allocate:copy_constructor"); } if (!Getattr(n, "allocate:copy_constructor")) { /* Check base classes */ List *bases = Getattr(n, "allbases"); int allows_copy = 1; for (int i = 0; i < Len(bases); i++) { Node *n = Getitem(bases, i); /* If base class does not allow copy constructor, we don't allow it either */ if (!Getattr(n, "allocate:copy_constructor") && (!Getattr(n, "allocate:copy_base_constructor"))) { allows_copy = 0; } } if (allows_copy) { Setattr(n, "allocate:copy_constructor", "1"); } } } if (!Getattr(n, "allocate:has_destructor")) { /* No destructor was defined */ List *bases = Getattr(n, "allbases"); int allows_destruct = 1; for (int i = 0; i < Len(bases); i++) { Node *n = Getitem(bases, i); /* If base class does not allow default destructor, we don't allow it either */ if (!Getattr(n, "allocate:default_destructor") && (!Getattr(n, "allocate:default_base_destructor"))) { allows_destruct = 0; } } if (allows_destruct) { Setattr(n, "allocate:default_destructor", "1"); } } if (!Getattr(n, "allocate:has_assign")) { /* No assignment operator was defined */ List *bases = Getattr(n, "allbases"); int allows_assign = 1; for (int i = 0; i < Len(bases); i++) { Node *n = Getitem(bases, i); /* If base class does not allow assignment, we don't allow it either */ if (Getattr(n, "allocate:has_assign")) { allows_assign = !Getattr(n, "allocate:noassign"); } } if (!allows_assign) { Setattr(n, "allocate:noassign", "1"); } } if (!Getattr(n, "allocate:has_new")) { /* No new operator was defined */ List *bases = Getattr(n, "allbases"); int allows_new = 1; for (int i = 0; i < Len(bases); i++) { Node *n = Getitem(bases, i); /* If base class does not allow new operator, we don't allow it either */ if (Getattr(n, "allocate:has_new")) { allows_new = !Getattr(n, "allocate:nonew"); } } if (!allows_new) { Setattr(n, "allocate:nonew", "1"); } } /* Check if base classes allow smart pointers, but might be hidden */ if (!Getattr(n, "allocate:smartpointer")) { Node *sp = Swig_symbol_clookup("operator ->", 0); if (sp) { /* Look for parent */ Node *p = parentNode(sp); if (Strcmp(nodeType(p), "extend") == 0) { p = parentNode(p); } if (Strcmp(nodeType(p), "class") == 0) { if (GetFlag(p, "feature:ignore")) { Setattr(n, "allocate:smartpointer", Getattr(p, "allocate:smartpointer")); } } } } Swig_interface_propagate_methods(n); /* Only care about default behavior. Remove temporary values */ Setattr(n, "allocate:visit", "1"); Swig_symbol_setscope(symtab); return SWIG_OK; } virtual int accessDeclaration(Node *n) { String *kind = Getattr(n, "kind"); if (Cmp(kind, "public") == 0) { cplus_mode = PUBLIC; } else if (Cmp(kind, "private") == 0) { cplus_mode = PRIVATE; } else if (Cmp(kind, "protected") == 0) { cplus_mode = PROTECTED; } return SWIG_OK; } virtual int usingDeclaration(Node *n) { Node *c = 0; for (c = firstChild(n); c; c = nextSibling(c)) { if (Strcmp(nodeType(c), "cdecl") == 0) { process_exceptions(c); if (inclass) class_member_is_defined_in_bases(c, inclass); } } return SWIG_OK; } virtual int cDeclaration(Node *n) { process_exceptions(n); if (inclass) { /* check whether the member node n is defined in class node in class's bases */ class_member_is_defined_in_bases(n, inclass); /* Check to see if this is a static member or not. If so, we add an attribute cplus:staticbase that saves the current class */ if (Swig_storage_isstatic(n)) { Setattr(n, "cplus:staticbase", inclass); } String *name = Getattr(n, "name"); if (cplus_mode != PUBLIC) { if (Strcmp(name, "operator =") == 0) { /* Look for a private assignment operator */ if (!GetFlag(n, "deleted")) Setattr(inclass, "allocate:has_assign", "1"); Setattr(inclass, "allocate:noassign", "1"); } else if (Strcmp(name, "operator new") == 0) { /* Look for a private new operator */ if (!GetFlag(n, "deleted")) Setattr(inclass, "allocate:has_new", "1"); Setattr(inclass, "allocate:nonew", "1"); } } else { if (Strcmp(name, "operator =") == 0) { if (!GetFlag(n, "deleted")) Setattr(inclass, "allocate:has_assign", "1"); else Setattr(inclass, "allocate:noassign", "1"); } else if (Strcmp(name, "operator new") == 0) { if (!GetFlag(n, "deleted")) Setattr(inclass, "allocate:has_new", "1"); else Setattr(inclass, "allocate:nonew", "1"); } /* Look for smart pointer operator */ if ((Strcmp(name, "operator ->") == 0) && (!GetFlag(n, "feature:ignore"))) { /* Look for version with no parameters */ Node *sn = n; while (sn) { if (!Getattr(sn, "parms")) { SwigType *type = SwigType_typedef_resolve_all(Getattr(sn, "type")); SwigType_push(type, Getattr(sn, "decl")); Delete(SwigType_pop_function(type)); SwigType *base = SwigType_base(type); Node *sc = Swig_symbol_clookup(base, 0); if ((sc) && (Strcmp(nodeType(sc), "class") == 0)) { if (SwigType_check_decl(type, "p.")) { /* Need to check if type is a const pointer */ int isconst = 0; Delete(SwigType_pop(type)); if (SwigType_isconst(type)) { isconst = !Getattr(inclass, "allocate:smartpointermutable"); Setattr(inclass, "allocate:smartpointerconst", "1"); } else { Setattr(inclass, "allocate:smartpointermutable", "1"); } List *methods = smart_pointer_methods(sc, 0, isconst); Setattr(inclass, "allocate:smartpointer", methods); Setattr(inclass, "allocate:smartpointerpointeeclassname", Getattr(sc, "name")); } else { /* Hmmm. The return value is not a pointer. If the type is a value or reference. We're going to chase it to see if another operator->() can be found */ if ((SwigType_check_decl(type, "")) || (SwigType_check_decl(type, "r."))) { Node *nn = Swig_symbol_clookup("operator ->", Getattr(sc, "symtab")); if (nn) { Delete(base); Delete(type); sn = nn; continue; } } } } Delete(base); Delete(type); break; } } } } } return SWIG_OK; } virtual int constructorDeclaration(Node *n) { if (!inclass) return SWIG_OK; Parm *parms = Getattr(n, "parms"); process_exceptions(n); if (!extendmode) { if (!ParmList_numrequired(parms)) { /* Class does define a default constructor */ /* However, we had better see where it is defined */ if (cplus_mode == PUBLIC) { Setattr(inclass, "allocate:default_constructor", "1"); } else if (cplus_mode == PROTECTED) { Setattr(inclass, "allocate:default_base_constructor", "1"); } } /* Class defines some kind of constructor. May or may not be public */ Setattr(inclass, "allocate:has_constructor", "1"); if (cplus_mode == PUBLIC) { Setattr(inclass, "allocate:public_constructor", "1"); } } else { Setattr(inclass, "allocate:has_constructor", "1"); Setattr(inclass, "allocate:public_constructor", "1"); } /* See if this is a copy constructor */ if (parms && (ParmList_numrequired(parms) == 1)) { /* Look for a few cases. X(const X &), X(X &), X(X *) */ int copy_constructor = 0; SwigType *type = Getattr(inclass, "name"); String *tn = NewStringf("r.q(const).%s", type); String *cc = SwigType_typedef_resolve_all(tn); SwigType *rt = SwigType_typedef_resolve_all(Getattr(parms, "type")); if (SwigType_istemplate(type)) { String *tmp = Swig_symbol_template_deftype(cc, 0); Delete(cc); cc = tmp; tmp = Swig_symbol_template_deftype(rt, 0); Delete(rt); rt = tmp; } if (Strcmp(cc, rt) == 0) { copy_constructor = 1; } else { Delete(cc); cc = NewStringf("r.%s", Getattr(inclass, "name")); if (Strcmp(cc, Getattr(parms, "type")) == 0) { copy_constructor = 1; } else { Delete(cc); cc = NewStringf("p.%s", Getattr(inclass, "name")); String *ty = SwigType_strip_qualifiers(Getattr(parms, "type")); if (Strcmp(cc, ty) == 0) { copy_constructor = 1; } Delete(ty); } } Delete(cc); Delete(rt); Delete(tn); if (copy_constructor) { Setattr(n, "copy_constructor", "1"); Setattr(inclass, "allocate:has_copy_constructor", "1"); if (cplus_mode == PUBLIC) { Setattr(inclass, "allocate:copy_constructor", "1"); } else if (cplus_mode == PROTECTED) { Setattr(inclass, "allocate:copy_base_constructor", "1"); } } } return SWIG_OK; } virtual int destructorDeclaration(Node *n) { (void) n; if (!inclass) return SWIG_OK; if (!extendmode) { Setattr(inclass, "allocate:has_destructor", "1"); if (cplus_mode == PUBLIC) { Setattr(inclass, "allocate:default_destructor", "1"); } else if (cplus_mode == PROTECTED) { Setattr(inclass, "allocate:default_base_destructor", "1"); } else if (cplus_mode == PRIVATE) { Setattr(inclass, "allocate:private_destructor", "1"); } } else { Setattr(inclass, "allocate:has_destructor", "1"); Setattr(inclass, "allocate:default_destructor", "1"); } return SWIG_OK; } }; void Swig_default_allocators(Node *n) { if (!n) return; Allocate *a = new Allocate; a->top(n); delete a; } swig-4.0.1/Source/Modules/browser.cxx0000644000175000017500000002626013527063513017435 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * browser.cxx * * A web-base parse tree browser using SWILL. This is an optional * feature that's normally disabled. * ----------------------------------------------------------------------------- */ #include "swigmod.h" #ifdef SWIG_SWILL extern "C" { #include "swill.h" } static FILE *out = 0; static Node *view_top = 0; class Browser:public Dispatcher { void show_checkbox(Node *t, Node *n) { int v = 0; if (Getmeta(n, "visible")) { v = 1; } if (v) { Printf(out, "[-] ", n, t, n, n); } else { Printf(out, "[+] ", n, t, n, n); } } void show_attributes(Node *obj) { if (!Getmeta(obj, "visible")) return; String *os = NewString(""); String *k; Iterator ki; ki = First(obj); while (ki.key) { k = ki.key; if ((Cmp(k, "nodeType") == 0) || (Cmp(k, "firstChild") == 0) || (Cmp(k, "lastChild") == 0) || (Cmp(k, "parentNode") == 0) || (Cmp(k, "nextSibling") == 0) || (Cmp(k, "previousSibling") == 0) || (*(Char(k)) == '$')) { /* Do nothing */ } else if (Cmp(k, "parms") == 0) { String *o = NewString(""); Printf(o, "%s", ParmList_protostr(Getattr(obj, k))); Replaceall(o, "&", "&"); Replaceall(o, "<", "<"); Replaceall(o, ">", ">"); Printf(os, "? %-12s - %s\n", Getattr(obj, k), k, o); Delete(o); } else { DOH *o; char *trunc = ""; if (DohIsString(Getattr(obj, k))) { o = Str(Getattr(obj, k)); if (Len(o) > 70) { trunc = "..."; } Replaceall(o, "&", "&"); Replaceall(o, "<", "<"); Printf(os, "? %-12s - \"%(escape)-0.70s%s\"\n", Getattr(obj, k), k, o, trunc); Delete(o); } else { Printf(os, "? %-12s - %p\n", Getattr(obj, k), k, Getattr(obj, k)); } } ki = Next(ki); } Printf(out, "
\n%s
\n", Char(os)); Delete(os); } public: virtual int emit_one(Node *n) { char *tag = Char(nodeType(n)); char *file = Char(Getfile(n)); int line = Getline(n); char *name = GetChar(n, "name"); show_checkbox(view_top, n); Printf(out, "%s", n, tag); if (name) { Printf(out, " (%s)", name); } Printf(out, ". %s:%d\n", file, line); Printf(out, "
"); Dispatcher::emit_one(n); return SWIG_OK; } virtual int emit_children(Node *n) { if (Getmeta(n, "visible")) { Printf(out, "
\n"); Dispatcher::emit_children(n); Printf(out, "
\n"); } return SWIG_OK; } virtual int defaultHandler(Node *n) { show_attributes(n); return SWIG_OK; } virtual int top(Node *n) { show_attributes(n); emit_children(n); return SWIG_OK; } virtual int includeDirective(Node *n) { show_attributes(n); emit_children(n); return SWIG_OK; } virtual int importDirective(Node *n) { show_attributes(n); emit_children(n); return SWIG_OK; } virtual int extendDirective(Node *n) { show_attributes(n); emit_children(n); return SWIG_OK; } virtual int classDeclaration(Node *n) { show_attributes(n); emit_children(n); return SWIG_OK; } virtual int templateDeclaration(Node *n) { show_attributes(n); emit_children(n); return SWIG_OK; } virtual int lambdaDeclaration(Node *n) { show_attributes(n); emit_children(n); return SWIG_OK; } virtual int enumDeclaration(Node *n) { show_attributes(n); emit_children(n); return SWIG_OK; } virtual int typemapDirective(Node *n) { show_attributes(n); emit_children(n); return SWIG_OK; } virtual int namespaceDeclaration(Node *n) { show_attributes(n); emit_children(n); return SWIG_OK; } virtual int usingDeclaration(Node *n) { show_attributes(n); emit_children(n); return SWIG_OK; } }; static int browser_exit = 0; static Node *tree_top = 0; static Browser *browse = 0; /* ---------------------------------------------------------------------- * exit_handler() - Force the browser to exit * ---------------------------------------------------------------------- */ void exit_handler(FILE *f) { browser_exit = 1; Printf(f, "Terminated.\n"); } /* ---------------------------------------------------------------------- * node_handler() - Generate information about a specific node * ---------------------------------------------------------------------- */ static void display(FILE *f, Node *n) { /* Print standard HTML header */ Printf(f, "SWIG-%s\n", Swig_package_version()); Printf(f, "SWIG-%s
\n", Swig_package_version()); Printf(f, "[ Exit ]"); Printf(f, " [ Top ]", tree_top); if (n != tree_top) { Printf(f, " [ Up ]", parentNode(n)); } Printf(f, " [ Symbols ]"); Printf(f, "

\n"); out = f; browse->emit_one(n); /* Print standard footer */ Printf(f, "


\n"); } void node_handler(FILE *f) { Node *n = 0; if (!swill_getargs("p(node)", &n)) { n = tree_top; } view_top = n; display(f, n); } /* ---------------------------------------------------------------------- * hide_handler() - Hide a node * ---------------------------------------------------------------------- */ void hide_handler(FILE *f) { Node *n = 0; if (!swill_getargs("p(hn)", &n)) { n = 0; } if (n) { Delmeta(n, "visible"); } node_handler(f); } void show_handler(FILE *f) { Node *n = 0; if (!swill_getargs("p(hn)", &n)) { n = 0; } if (n) { Setmeta(n, "visible", "1"); } node_handler(f); } void raw_data(FILE *out, Node *obj) { if (!obj) return; if (DohIsMapping(obj)) { String *k; Iterator ki; String *os = NewString(""); Printf(os, "Hash {\n"); ki = First(obj); while (ki.key) { k = ki.key; DOH *o; const char *trunc = ""; if (DohIsString(Getattr(obj, k))) { o = Str(Getattr(obj, k)); if (Len(o) > 70) { trunc = "..."; } Replaceall(o, "<", "<"); Printf(os, " ? %-12s - \"%(escape)-0.70s%s\"\n", Getattr(obj, k), k, o, trunc); Delete(o); } else { Printf(os, " ? %-12s - %p\n", Getattr(obj, k), k, Getattr(obj, k)); } ki = Next(ki); } Printf(os, "}\n"); Printf(out, "
\n%s
\n", Char(os)); Delete(os); } else if (DohIsString(obj)) { String *o = Str(obj); Replaceall(o, "<", "<"); Printf(out, "
\n%s
\n", Char(o)); Delete(o); } else if (DohIsSequence(obj)) { int i; String *os = NewString(""); Printf(os, "List [\n"); for (i = 0; i < Len(obj); i++) { DOH *o = Getitem(obj, i); const char *trunc = ""; if (DohIsString(o)) { String *s = Str(o); if (Len(s) > 70) { trunc = "..."; } Replaceall(o, "<", "<"); Printf(os, " ? [%d] - \"%(escape)-0.70s%s\"\n", o, i, s, trunc); Delete(s); } else { Printf(os, " ? [%d] - %p\n", o, i, o); } } Printf(os, "\n]\n"); Printf(out, "
\n%s
\n", Char(os)); Delete(os); } } void data_handler(FILE *f) { DOH *n = 0; if (!swill_getargs("p(n)", &n)) { n = 0; } Printf(f, "SWIG-%s\n", Swig_package_version()); Printf(f, "SWIG-%s
\n", Swig_package_version()); Printf(f, "[ Exit ]"); Printf(f, " [ Top ]", tree_top); Printf(f, "

\n"); if (n) { raw_data(f, n); } /* Print standard footer */ Printf(f, "


\n"); } void symbol_handler(FILE *f) { Symtab *sym; char *name = 0; Printf(f, "SWIG-%s\n", Swig_package_version()); Printf(f, "SWIG-%s
\n", Swig_package_version()); Printf(f, "[ Exit ]"); Printf(f, " [ Top ]", tree_top); Printf(f, " [ Symbols ]"); Printf(f, "

\n"); if (!swill_getargs("p(sym)|s(name)", &sym, &name)) { sym = Swig_symbol_getscope(""); name = 0; } if (!sym) { Printf(f, "No symbol table specified!\n"); return; } { String *q = Swig_symbol_qualifiedscopename(sym); if (!Len(q)) { Printf(f, "Symbol table: :: (global)
\n"); } else { Printf(f, "Symbol table: %s
\n", q); } Delete(q); } fprintf(f, "

\n"); fprintf(f, "Symbol lookup:
\n"); fprintf(f, "\n", sym); fprintf(f, "Submit : \n"); fprintf(f, "
"); if (name) { Node *n = Swig_symbol_clookup(name, sym); Printf(f, "Symbol '%s':\n", name); Printf(f, "
\n"); if (!n) { Printf(f, "Not defined!\n"); } else { raw_data(f, n); } Printf(f, "
\n"); } Printf(f, "

Nested scopes
\n"); Printf(f, "

\n");
  {
    Hash *h;
    h = firstChild(sym);
    while (h) {
      Printf(f, "%s\n", h, Getattr(h, "name"));
      h = nextSibling(h);
    }
  }
  Printf(f, "
\n"); Printf(f, "

Symbol table contents
\n"); raw_data(f, Getattr(sym, "symtab")); Printf(f, "


\n"); } #endif void Swig_browser(Node *top, int port) { #ifdef SWIG_SWILL int sport; browser_exit = 0; /* Initialize the server */ sport = swill_init(port); if (sport < 0) { Printf(stderr, "Couldn't open socket on port %d. Sorry.\n", port); return; } browse = new Browser(); Setmeta(top, "visible", "1"); tree_top = top; Printf(stderr, "SWIG: Tree browser listening on port %d\n", sport); swill_handle("exit.html", exit_handler, 0); swill_handle("index.html", node_handler, 0); swill_handle("hide.html", hide_handler, 0); swill_handle("show.html", show_handler, 0); swill_handle("data.html", data_handler, 0); swill_handle("symbol.html", symbol_handler, 0); swill_netscape("index.html"); while (!browser_exit) { swill_serve(); } Printf(stderr, "Browser terminated.\n"); swill_close(); delete browse; return; #else (void) top; (void) port; #endif } swig-4.0.1/Source/Modules/guile.cxx0000644000175000017500000015373113527063513017063 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * guile.cxx * * Guile language module for SWIG. * ----------------------------------------------------------------------------- */ #include "swigmod.h" #include // Note string broken in half for compilers that can't handle long strings static const char *usage = "\ Guile Options (available with -guile)\n\ -emitsetters - Emit procedures-with-setters for variables\n\ and structure slots.\n\ -emitslotaccessors - Emit accessor methods for all GOOPS slots\n" "\ -exportprimitive - Add the (export ...) code from scmstub into the\n\ GOOPS file.\n\ -goopsprefix - Prepend to all goops identifiers\n\ -Linkage - Use linkage protocol (default `simple')\n\ Use `module' for native Guile module linking\n\ (requires Guile >= 1.5.0). Use `passive' for\n\ passive linking (no C-level module-handling code),\n\ `ltdlmod' for Guile's old dynamic module\n\ convention (Guile <= 1.4), or `hobbit' for hobbit\n\ modules.\n\ -onlysetters - Don't emit traditional getter and setter\n\ procedures for structure slots,\n\ only emit procedures-with-setters.\n\ -package - Set the path of the module to \n\ (default NULL)\n\ -prefix - Use as prefix [default \"gswig_\"]\n\ -procdoc - Output procedure documentation to \n\ -procdocformat - Output procedure documentation in ;\n\ one of `guile-1.4', `plain', `texinfo'\n\ -proxy - Export GOOPS class definitions\n\ -primsuffix - Name appended to primitive module when exporting\n\ GOOPS classes. (default = \"primitive\")\n\ -scmstub - Output Scheme file with module declaration and\n\ exports; only with `passive' and `simple' linkage\n\ -useclassprefix - Prepend the class name to all goops identifiers\n\ \n"; static File *f_begin = 0; static File *f_runtime = 0; static File *f_header = 0; static File *f_wrappers = 0; static File *f_init = 0; static String *prefix = NewString("gswig_"); static char *module = 0; static String *package = 0; static enum { GUILE_LSTYLE_SIMPLE, // call `SWIG_init()' GUILE_LSTYLE_PASSIVE, // passive linking (no module code) GUILE_LSTYLE_MODULE, // native guile module linking (Guile >= 1.4.1) GUILE_LSTYLE_LTDLMOD_1_4, // old (Guile <= 1.4) dynamic module convention GUILE_LSTYLE_HOBBIT // use (hobbit4d link) } linkage = GUILE_LSTYLE_SIMPLE; static File *procdoc = 0; static bool scmstub = false; static String *scmtext; static bool goops = false; static String *goopstext; static String *goopscode; static String *goopsexport; static enum { GUILE_1_4, PLAIN, TEXINFO } docformat = GUILE_1_4; static int emit_setters = 0; static int only_setters = 0; static int emit_slot_accessors = 0; static int struct_member = 0; static String *beforereturn = 0; static String *return_nothing_doc = 0; static String *return_one_doc = 0; static String *return_multi_doc = 0; static String *exported_symbols = 0; static int exporting_destructor = 0; static String *swigtype_ptr = 0; /* GOOPS stuff */ static String *primsuffix = 0; static String *class_name = 0; static String *short_class_name = 0; static String *goops_class_methods; static int in_class = 0; static int have_constructor = 0; static int useclassprefix = 0; // -useclassprefix argument static String *goopsprefix = 0; // -goopsprefix argument static int primRenamer = 0; // if (use-modules ((...) :renamer ...) is exported to GOOPS file static int exportprimitive = 0; // -exportprimitive argument static String *memberfunction_name = 0; extern "C" { static int has_classname(Node *class_node) { return Getattr(class_node, "guile:goopsclassname") ? 1 : 0; } } class GUILE:public Language { public: /* ------------------------------------------------------------ * main() * ------------------------------------------------------------ */ virtual void main(int argc, char *argv[]) { int i; SWIG_library_directory("guile"); SWIG_typemap_lang("guile"); // Look for certain command line options for (i = 1; i < argc; i++) { if (argv[i]) { if (strcmp(argv[i], "-help") == 0) { fputs(usage, stdout); SWIG_exit(EXIT_SUCCESS); } else if (strcmp(argv[i], "-prefix") == 0) { if (argv[i + 1]) { prefix = NewString(argv[i + 1]); Swig_mark_arg(i); Swig_mark_arg(i + 1); i++; } else { Swig_arg_error(); } } else if (strcmp(argv[i], "-package") == 0) { if (argv[i + 1]) { package = NewString(argv[i + 1]); Swig_mark_arg(i); Swig_mark_arg(i + 1); i++; } else { Swig_arg_error(); } } else if (strcmp(argv[i], "-Linkage") == 0 || strcmp(argv[i], "-linkage") == 0) { if (argv[i + 1]) { if (0 == strcmp(argv[i + 1], "ltdlmod")) linkage = GUILE_LSTYLE_LTDLMOD_1_4; else if (0 == strcmp(argv[i + 1], "hobbit")) linkage = GUILE_LSTYLE_HOBBIT; else if (0 == strcmp(argv[i + 1], "simple")) linkage = GUILE_LSTYLE_SIMPLE; else if (0 == strcmp(argv[i + 1], "passive")) linkage = GUILE_LSTYLE_PASSIVE; else if (0 == strcmp(argv[i + 1], "module")) linkage = GUILE_LSTYLE_MODULE; else Swig_arg_error(); Swig_mark_arg(i); Swig_mark_arg(i + 1); i++; } else { Swig_arg_error(); } } else if (strcmp(argv[i], "-procdoc") == 0) { if (argv[i + 1]) { procdoc = NewFile(argv[i + 1], "w", SWIG_output_files()); if (!procdoc) { FileErrorDisplay(argv[i + 1]); SWIG_exit(EXIT_FAILURE); } Swig_mark_arg(i); Swig_mark_arg(i + 1); i++; } else { Swig_arg_error(); } } else if (strcmp(argv[i], "-procdocformat") == 0) { if (strcmp(argv[i + 1], "guile-1.4") == 0) docformat = GUILE_1_4; else if (strcmp(argv[i + 1], "plain") == 0) docformat = PLAIN; else if (strcmp(argv[i + 1], "texinfo") == 0) docformat = TEXINFO; else Swig_arg_error(); Swig_mark_arg(i); Swig_mark_arg(i + 1); i++; } else if (strcmp(argv[i], "-emit-setters") == 0 || strcmp(argv[i], "-emitsetters") == 0) { emit_setters = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-only-setters") == 0 || strcmp(argv[i], "-onlysetters") == 0) { emit_setters = 1; only_setters = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-emit-slot-accessors") == 0 || strcmp(argv[i], "-emitslotaccessors") == 0) { emit_slot_accessors = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-scmstub") == 0) { scmstub = true; Swig_mark_arg(i); } else if ((strcmp(argv[i], "-shadow") == 0) || ((strcmp(argv[i], "-proxy") == 0))) { goops = true; Swig_mark_arg(i); } else if (strcmp(argv[i], "-gh") == 0) { Printf(stderr, "Deprecated command line option: -gh. Wrappers are always generated for the SCM interface. See documentation for more information regarding the deprecated GH interface.\n"); Swig_mark_arg(i); } else if (strcmp(argv[i], "-scm") == 0) { Printf(stderr, "Deprecated command line option: -scm. Wrappers are always generated for the SCM interface. See documentation for more information regarding the deprecated GH interface.\n"); Swig_mark_arg(i); } else if (strcmp(argv[i], "-primsuffix") == 0) { if (argv[i + 1]) { primsuffix = NewString(argv[i + 1]); Swig_mark_arg(i); Swig_mark_arg(i + 1); i++; } else { Swig_arg_error(); } } else if (strcmp(argv[i], "-goopsprefix") == 0) { if (argv[i + 1]) { goopsprefix = NewString(argv[i + 1]); Swig_mark_arg(i); Swig_mark_arg(i + 1); i++; } else { Swig_arg_error(); } } else if (strcmp(argv[i], "-useclassprefix") == 0) { useclassprefix = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-exportprimitive") == 0) { exportprimitive = 1; // should use Swig_warning() here? Swig_mark_arg(i); } } } // set default value for primsuffix if (!primsuffix) primsuffix = NewString("primitive"); //goops support can only be enabled if passive or module linkage is used if (goops) { if (linkage != GUILE_LSTYLE_PASSIVE && linkage != GUILE_LSTYLE_MODULE) { Printf(stderr, "guile: GOOPS support requires passive or module linkage\n"); SWIG_exit(EXIT_FAILURE); } } if (goops) { // -proxy implies -emit-setters emit_setters = 1; } if ((linkage == GUILE_LSTYLE_PASSIVE && scmstub) || linkage == GUILE_LSTYLE_MODULE) primRenamer = 1; if (exportprimitive && primRenamer) { // should use Swig_warning() ? Printf(stderr, "guile: Warning: -exportprimitive only makes sense with passive linkage without a scmstub.\n"); } // Make sure `prefix' ends in an underscore if (prefix) { const char *px = Char(prefix); if (px[Len(prefix) - 1] != '_') Printf(prefix, "_"); } /* Add a symbol for this module */ Preprocessor_define("SWIGGUILE 1", 0); /* Read in default typemaps */ SWIG_config_file("guile_scm.swg"); allow_overloading(); } /* ------------------------------------------------------------ * top() * ------------------------------------------------------------ */ virtual int top(Node *n) { /* Initialize all of the output files */ String *outfile = Getattr(n, "outfile"); f_begin = NewFile(outfile, "w", SWIG_output_files()); if (!f_begin) { FileErrorDisplay(outfile); SWIG_exit(EXIT_FAILURE); } f_runtime = NewString(""); f_init = NewString(""); f_header = NewString(""); f_wrappers = NewString(""); /* Register file targets with the SWIG file handler */ Swig_register_filebyname("header", f_header); Swig_register_filebyname("wrapper", f_wrappers); Swig_register_filebyname("begin", f_begin); Swig_register_filebyname("runtime", f_runtime); Swig_register_filebyname("init", f_init); scmtext = NewString(""); Swig_register_filebyname("scheme", scmtext); exported_symbols = NewString(""); goopstext = NewString(""); Swig_register_filebyname("goops", goopstext); goopscode = NewString(""); goopsexport = NewString(""); Swig_banner(f_begin); Printf(f_runtime, "\n\n#ifndef SWIGGUILE\n#define SWIGGUILE\n#endif\n\n"); /* Write out directives and declarations */ module = Swig_copy_string(Char(Getattr(n, "name"))); switch (linkage) { case GUILE_LSTYLE_SIMPLE: /* Simple linkage; we have to export the SWIG_init function. The user can rename the function by a #define. */ Printf(f_runtime, "#define SWIG_GUILE_INIT_STATIC extern\n"); break; default: /* Other linkage; we make the SWIG_init function static */ Printf(f_runtime, "#define SWIG_GUILE_INIT_STATIC static\n"); break; } if (CPlusPlus) { Printf(f_runtime, "extern \"C\" {\n\n"); } Printf(f_runtime, "SWIG_GUILE_INIT_STATIC void\nSWIG_init (void);\n"); if (CPlusPlus) { Printf(f_runtime, "\n}\n"); } Printf(f_runtime, "\n"); Language::top(n); /* Close module */ Printf(f_wrappers, "#ifdef __cplusplus\nextern \"C\" {\n#endif\n"); SwigType_emit_type_table(f_runtime, f_wrappers); Printf(f_init, "}\n\n"); Printf(f_init, "#ifdef __cplusplus\n}\n#endif\n"); String *module_name = NewString(""); if (!module) Printv(module_name, "swig", NIL); else { if (package) Printf(module_name, "%s/%s", package, module); else Printv(module_name, module, NIL); } emit_linkage(module_name); Delete(module_name); if (procdoc) { Delete(procdoc); procdoc = NULL; } Delete(goopscode); Delete(goopsexport); Delete(goopstext); /* Close all of the files */ Dump(f_runtime, f_begin); Dump(f_header, f_begin); Dump(f_wrappers, f_begin); Wrapper_pretty_print(f_init, f_begin); Delete(f_header); Delete(f_wrappers); Delete(f_init); Delete(f_runtime); Delete(f_begin); return SWIG_OK; } void emit_linkage(String *module_name) { String *module_func = NewString(""); if (CPlusPlus) { Printf(f_init, "extern \"C\" {\n\n"); } Printv(module_func, module_name, NIL); Replaceall(module_func, "-", "_"); switch (linkage) { case GUILE_LSTYLE_SIMPLE: Printf(f_init, "\n/* Linkage: simple */\n"); break; case GUILE_LSTYLE_PASSIVE: Printf(f_init, "\n/* Linkage: passive */\n"); Replaceall(module_func, "/", "_"); Insert(module_func, 0, "scm_init_"); Append(module_func, "_module"); Printf(f_init, "SCM\n%s (void)\n{\n", module_func); Printf(f_init, " SWIG_init();\n"); Printf(f_init, " return SCM_UNSPECIFIED;\n"); Printf(f_init, "}\n"); break; case GUILE_LSTYLE_LTDLMOD_1_4: Printf(f_init, "\n/* Linkage: ltdlmod */\n"); Replaceall(module_func, "/", "_"); Insert(module_func, 0, "scm_init_"); Append(module_func, "_module"); Printf(f_init, "SCM\n%s (void)\n{\n", module_func); { String *mod = NewString(module_name); Replaceall(mod, "/", " "); Printf(f_init, " scm_register_module_xxx (\"%s\", (void *) SWIG_init);\n", mod); Printf(f_init, " return SCM_UNSPECIFIED;\n"); Delete(mod); } Printf(f_init, "}\n"); break; case GUILE_LSTYLE_MODULE: Printf(f_init, "\n/* Linkage: module */\n"); Replaceall(module_func, "/", "_"); Insert(module_func, 0, "scm_init_"); Append(module_func, "_module"); Printf(f_init, "static void SWIG_init_helper(void *data)\n"); Printf(f_init, "{\n SWIG_init();\n"); if (Len(exported_symbols) > 0) Printf(f_init, " scm_c_export(%sNULL);", exported_symbols); Printf(f_init, "\n}\n\n"); Printf(f_init, "SCM\n%s (void)\n{\n", module_func); { String *mod = NewString(module_name); if (goops) Printv(mod, "-", primsuffix, NIL); Replaceall(mod, "/", " "); Printf(f_init, " scm_c_define_module(\"%s\",\n", mod); Printf(f_init, " SWIG_init_helper, NULL);\n"); Printf(f_init, " return SCM_UNSPECIFIED;\n"); Delete(mod); } Printf(f_init, "}\n"); break; case GUILE_LSTYLE_HOBBIT: Printf(f_init, "\n/* Linkage: hobbit */\n"); Replaceall(module_func, "/", "_slash_"); Insert(module_func, 0, "scm_init_"); Printf(f_init, "SCM\n%s (void)\n{\n", module_func); { String *mod = NewString(module_name); Replaceall(mod, "/", " "); Printf(f_init, " scm_register_module_xxx (\"%s\", (void *) SWIG_init);\n", mod); Printf(f_init, " return SCM_UNSPECIFIED;\n"); Delete(mod); } Printf(f_init, "}\n"); break; default: abort(); // for now } if (scmstub) { /* Emit Scheme stub if requested */ String *primitive_name = NewString(module_name); if (goops) Printv(primitive_name, "-", primsuffix, NIL); String *mod = NewString(primitive_name); Replaceall(mod, "/", " "); String *fname = NewStringf("%s%s.scm", SWIG_output_directory(), primitive_name); Delete(primitive_name); File *scmstubfile = NewFile(fname, "w", SWIG_output_files()); if (!scmstubfile) { FileErrorDisplay(fname); SWIG_exit(EXIT_FAILURE); } Delete(fname); Swig_banner_target_lang(scmstubfile, ";;;"); Printf(scmstubfile, "\n"); if (linkage == GUILE_LSTYLE_SIMPLE || linkage == GUILE_LSTYLE_PASSIVE) Printf(scmstubfile, "(define-module (%s))\n\n", mod); Delete(mod); Printf(scmstubfile, "%s", scmtext); if ((linkage == GUILE_LSTYLE_SIMPLE || linkage == GUILE_LSTYLE_PASSIVE) && Len(exported_symbols) > 0) { String *ex = NewString(exported_symbols); Replaceall(ex, ", ", "\n "); Replaceall(ex, "\"", ""); Chop(ex); Printf(scmstubfile, "\n(export %s)\n", ex); Delete(ex); } Delete(scmstubfile); } if (goops) { String *mod = NewString(module_name); Replaceall(mod, "/", " "); String *fname = NewStringf("%s%s.scm", SWIG_output_directory(), module_name); File *goopsfile = NewFile(fname, "w", SWIG_output_files()); if (!goopsfile) { FileErrorDisplay(fname); SWIG_exit(EXIT_FAILURE); } Delete(fname); Swig_banner_target_lang(goopsfile, ";;;"); Printf(goopsfile, "\n"); Printf(goopsfile, "(define-module (%s))\n", mod); Printf(goopsfile, "%s\n", goopstext); Printf(goopsfile, "(use-modules (oop goops) (Swig common))\n"); if (primRenamer) { Printf(goopsfile, "(use-modules ((%s-%s) :renamer (symbol-prefix-proc 'primitive:)))\n", mod, primsuffix); } Printf(goopsfile, "%s\n(export %s)", goopscode, goopsexport); if (exportprimitive) { String *ex = NewString(exported_symbols); Replaceall(ex, ", ", "\n "); Replaceall(ex, "\"", ""); Chop(ex); Printf(goopsfile, "\n(export %s)", ex); Delete(ex); } Delete(mod); Delete(goopsfile); } Delete(module_func); if (CPlusPlus) { Printf(f_init, "\n}\n"); } } /* Return true iff T is a pointer type */ int is_a_pointer(SwigType *t) { return SwigType_ispointer(SwigType_typedef_resolve_all(t)); } /* Report an error handling the given type. */ void throw_unhandled_guile_type_error(SwigType *d) { Swig_warning(WARN_TYPEMAP_UNDEF, input_file, line_number, "Unable to handle type %s.\n", SwigType_str(d, 0)); } /* Write out procedure documentation */ void write_doc(const String *proc_name, const String *signature, const String *doc, const String *signature2 = NULL) { switch (docformat) { case GUILE_1_4: Printv(procdoc, "\f\n", NIL); Printv(procdoc, "(", signature, ")\n", NIL); if (signature2) Printv(procdoc, "(", signature2, ")\n", NIL); Printv(procdoc, doc, "\n", NIL); break; case PLAIN: Printv(procdoc, "\f", proc_name, "\n\n", NIL); Printv(procdoc, "(", signature, ")\n", NIL); if (signature2) Printv(procdoc, "(", signature2, ")\n", NIL); Printv(procdoc, doc, "\n\n", NIL); break; case TEXINFO: Printv(procdoc, "\f", proc_name, "\n", NIL); Printv(procdoc, "@deffn primitive ", signature, "\n", NIL); if (signature2) Printv(procdoc, "@deffnx primitive ", signature2, "\n", NIL); Printv(procdoc, doc, "\n", NIL); Printv(procdoc, "@end deffn\n\n", NIL); break; } } /* returns false if the typemap is an empty string */ bool handle_documentation_typemap(String *output, const String *maybe_delimiter, Parm *p, const String *typemap, const String *default_doc, const String *name = NULL) { String *tmp = NewString(""); String *tm; if (!(tm = Getattr(p, typemap))) { Printf(tmp, "%s", default_doc); tm = tmp; } bool result = (Len(tm) > 0); if (maybe_delimiter && Len(output) > 0 && Len(tm) > 0) { Printv(output, maybe_delimiter, NIL); } const String *pn = !name ? (const String *) Getattr(p, "name") : name; String *pt = Getattr(p, "type"); Replaceall(tm, "$name", pn); // legacy for $parmname Replaceall(tm, "$type", SwigType_str(pt, 0)); /* $NAME is like $name, but marked-up as a variable. */ String *ARGNAME = NewString(""); if (docformat == TEXINFO) Printf(ARGNAME, "@var{%s}", pn); else Printf(ARGNAME, "%(upper)s", pn); Replaceall(tm, "$NAME", ARGNAME); Replaceall(tm, "$PARMNAME", ARGNAME); Printv(output, tm, NIL); Delete(tmp); return result; } /* ------------------------------------------------------------ * functionWrapper() * Create a function declaration and register it with the interpreter. * ------------------------------------------------------------ */ virtual int functionWrapper(Node *n) { String *iname = Getattr(n, "sym:name"); SwigType *d = Getattr(n, "type"); ParmList *l = Getattr(n, "parms"); Parm *p; String *proc_name = 0; char source[256]; Wrapper *f = NewWrapper(); String *cleanup = NewString(""); String *outarg = NewString(""); String *signature = NewString(""); String *doc_body = NewString(""); String *returns = NewString(""); String *method_signature = NewString(""); String *primitive_args = NewString(""); Hash *scheme_arg_names = NewHash(); int num_results = 1; String *tmp = NewString(""); String *tm; int i; int numargs = 0; int numreq = 0; String *overname = 0; int args_passed_as_array = 0; int scheme_argnum = 0; bool any_specialized_arg = false; // Make a wrapper name for this String *wname = Swig_name_wrapper(iname); if (Getattr(n, "sym:overloaded")) { overname = Getattr(n, "sym:overname"); args_passed_as_array = 1; } else { if (!addSymbol(iname, n)) { DelWrapper(f); return SWIG_ERROR; } } if (overname) { Append(wname, overname); } Setattr(n, "wrap:name", wname); // Build the name for scheme. proc_name = NewString(iname); Replaceall(proc_name, "_", "-"); /* Emit locals etc. into f->code; figure out which args to ignore */ emit_parameter_variables(l, f); /* Attach the standard typemaps */ emit_attach_parmmaps(l, f); Setattr(n, "wrap:parms", l); /* Get number of required and total arguments */ numargs = emit_num_arguments(l); numreq = emit_num_required(l); /* Declare return variable */ Wrapper_add_local(f, "gswig_result", "SCM gswig_result"); Wrapper_add_local(f, "gswig_list_p", "SWIGUNUSED int gswig_list_p = 0"); /* Open prototype and signature */ Printv(f->def, "static SCM\n", wname, " (", NIL); if (args_passed_as_array) { Printv(f->def, "int argc, SCM *argv", NIL); } Printv(signature, proc_name, NIL); /* Now write code to extract the parameters */ for (i = 0, p = l; i < numargs; i++) { while (checkAttribute(p, "tmap:in:numinputs", "0")) { p = Getattr(p, "tmap:in:next"); } SwigType *pt = Getattr(p, "type"); int opt_p = (i >= numreq); // Produce names of source and target if (args_passed_as_array) sprintf(source, "argv[%d]", i); else sprintf(source, "s_%d", i); String *target = Getattr(p, "lname"); if (!args_passed_as_array) { if (i != 0) Printf(f->def, ", "); Printf(f->def, "SCM s_%d", i); } if (opt_p) { Printf(f->code, " if (%s != SCM_UNDEFINED) {\n", source); } if ((tm = Getattr(p, "tmap:in"))) { Replaceall(tm, "$source", source); Replaceall(tm, "$target", target); Replaceall(tm, "$input", source); Setattr(p, "emit:input", source); Printv(f->code, tm, "\n", NIL); SwigType *pb = SwigType_typedef_resolve_all(SwigType_base(pt)); SwigType *pn = Getattr(p, "name"); String *argname; scheme_argnum++; if (pn && !Getattr(scheme_arg_names, pn)) argname = pn; else { /* Anonymous arg or re-used argument name -- choose a name that cannot clash */ argname = NewStringf("%%arg%d", scheme_argnum); } if (procdoc) { if (i == numreq) { /* First optional argument */ Printf(signature, " #:optional"); } /* Add to signature (arglist) */ handle_documentation_typemap(signature, " ", p, "tmap:in:arglist", "$name", argname); /* Document the type of the arg in the documentation body */ handle_documentation_typemap(doc_body, ", ", p, "tmap:in:doc", "$NAME is of type <$type>", argname); } if (goops) { if (i < numreq) { if (strcmp("void", Char(pt)) != 0) { Node *class_node = Swig_symbol_clookup_check(pb, Getattr(n, "sym:symtab"), has_classname); String *goopsclassname = !class_node ? NULL : Getattr(class_node, "guile:goopsclassname"); /* do input conversion */ if (goopsclassname) { Printv(method_signature, " (", argname, " ", goopsclassname, ")", NIL); any_specialized_arg = true; } else { Printv(method_signature, " ", argname, NIL); } Printv(primitive_args, " ", argname, NIL); Setattr(scheme_arg_names, argname, p); } } } if (!pn) { Delete(argname); } p = Getattr(p, "tmap:in:next"); } else { throw_unhandled_guile_type_error(pt); p = nextSibling(p); } if (opt_p) Printf(f->code, " }\n"); } if (Len(doc_body) > 0) Printf(doc_body, ".\n"); /* Insert constraint checking code */ for (p = l; p;) { if ((tm = Getattr(p, "tmap:check"))) { Replaceall(tm, "$target", Getattr(p, "lname")); Printv(f->code, tm, "\n", NIL); p = Getattr(p, "tmap:check:next"); } else { p = nextSibling(p); } } /* Pass output arguments back to the caller. */ /* Insert argument output code */ String *returns_argout = NewString(""); for (p = l; p;) { if ((tm = Getattr(p, "tmap:argout"))) { Replaceall(tm, "$source", Getattr(p, "lname")); Replaceall(tm, "$target", Getattr(p, "lname")); Replaceall(tm, "$arg", Getattr(p, "emit:input")); Replaceall(tm, "$input", Getattr(p, "emit:input")); Printv(outarg, tm, "\n", NIL); if (procdoc) { if (handle_documentation_typemap(returns_argout, ", ", p, "tmap:argout:doc", "$NAME (of type $type)")) { /* A documentation typemap that is not the empty string indicates that a value is returned to Scheme. */ num_results++; } } p = Getattr(p, "tmap:argout:next"); } else { p = nextSibling(p); } } /* Insert cleanup code */ for (p = l; p;) { if ((tm = Getattr(p, "tmap:freearg"))) { Replaceall(tm, "$target", Getattr(p, "lname")); Replaceall(tm, "$input", Getattr(p, "emit:input")); Printv(cleanup, tm, "\n", NIL); p = Getattr(p, "tmap:freearg:next"); } else { p = nextSibling(p); } } if (exporting_destructor) { /* Mark the destructor's argument as destroyed. */ String *tm = NewString("SWIG_Guile_MarkPointerDestroyed($input);"); Replaceall(tm, "$input", Getattr(l, "emit:input")); Printv(cleanup, tm, "\n", NIL); Delete(tm); } /* Close prototype */ Printf(f->def, ")\n{\n"); /* Define the scheme name in C. This define is used by several Guile macros. */ Printv(f->def, "#define FUNC_NAME \"", proc_name, "\"", NIL); // Now write code to make the function call String *actioncode = emit_action(n); // Now have return value, figure out what to do with it. if ((tm = Swig_typemap_lookup_out("out", n, Swig_cresult_name(), f, actioncode))) { Replaceall(tm, "$result", "gswig_result"); Replaceall(tm, "$target", "gswig_result"); Replaceall(tm, "$source", Swig_cresult_name()); if (GetFlag(n, "feature:new")) Replaceall(tm, "$owner", "1"); else Replaceall(tm, "$owner", "0"); Printv(f->code, tm, "\n", NIL); } else { throw_unhandled_guile_type_error(d); } emit_return_variable(n, d, f); // Documentation if ((tm = Getattr(n, "tmap:out:doc"))) { Printv(returns, tm, NIL); if (Len(tm) > 0) num_results = 1; else num_results = 0; } else { String *s = SwigType_str(d, 0); Chop(s); Printf(returns, "<%s>", s); Delete(s); num_results = 1; } Append(returns, returns_argout); // Dump the argument output code Printv(f->code, outarg, NIL); // Dump the argument cleanup code Printv(f->code, cleanup, NIL); // Look for any remaining cleanup if (GetFlag(n, "feature:new")) { if ((tm = Swig_typemap_lookup("newfree", n, Swig_cresult_name(), 0))) { Replaceall(tm, "$source", Swig_cresult_name()); Printv(f->code, tm, "\n", NIL); } } // Free any memory allocated by the function being wrapped.. if ((tm = Swig_typemap_lookup("ret", n, Swig_cresult_name(), 0))) { Replaceall(tm, "$source", Swig_cresult_name()); Printv(f->code, tm, "\n", NIL); } // Wrap things up (in a manner of speaking) if (beforereturn) Printv(f->code, beforereturn, "\n", NIL); Printv(f->code, "return gswig_result;\n", NIL); /* Substitute the function name */ Replaceall(f->code, "$symname", iname); // Undefine the scheme name Printf(f->code, "#undef FUNC_NAME\n"); Printf(f->code, "}\n"); Wrapper_print(f, f_wrappers); if (!Getattr(n, "sym:overloaded")) { if (numargs > 10) { int i; /* gh_new_procedure would complain: too many args */ /* Build a wrapper wrapper */ Printv(f_wrappers, "static SCM\n", wname, "_rest (SCM rest)\n", NIL); Printv(f_wrappers, "{\n", NIL); Printf(f_wrappers, "SCM arg[%d];\n", numargs); Printf(f_wrappers, "SWIG_Guile_GetArgs (arg, rest, %d, %d, \"%s\");\n", numreq, numargs - numreq, proc_name); Printv(f_wrappers, "return ", wname, "(", NIL); Printv(f_wrappers, "arg[0]", NIL); for (i = 1; i < numargs; i++) Printf(f_wrappers, ", arg[%d]", i); Printv(f_wrappers, ");\n", NIL); Printv(f_wrappers, "}\n", NIL); /* Register it */ Printf(f_init, "scm_c_define_gsubr(\"%s\", 0, 0, 1, (swig_guile_proc) %s_rest);\n", proc_name, wname); } else if (emit_setters && struct_member && strlen(Char(proc_name)) > 3) { int len = Len(proc_name); const char *pc = Char(proc_name); /* MEMBER-set and MEMBER-get functions. */ int is_setter = (pc[len - 3] == 's'); if (is_setter) { Printf(f_init, "SCM setter = "); struct_member = 2; /* have a setter */ } else Printf(f_init, "SCM getter = "); /* GOOPS support uses the MEMBER-set and MEMBER-get functions, so ignore only_setters in this case. */ if (only_setters && !goops) Printf(f_init, "scm_c_make_gsubr(\"%s\", %d, %d, 0, (swig_guile_proc) %s);\n", proc_name, numreq, numargs - numreq, wname); else Printf(f_init, "scm_c_define_gsubr(\"%s\", %d, %d, 0, (swig_guile_proc) %s);\n", proc_name, numreq, numargs - numreq, wname); if (!is_setter) { /* Strip off "-get" */ char *pws_name = (char *) malloc(sizeof(char) * (len - 3)); strncpy(pws_name, pc, len - 3); pws_name[len - 4] = 0; if (struct_member == 2) { /* There was a setter, so create a procedure with setter */ Printf(f_init, "scm_c_define"); Printf(f_init, "(\"%s\", " "scm_make_procedure_with_setter(getter, setter));\n", pws_name); } else { /* There was no setter, so make an alias to the getter */ Printf(f_init, "scm_c_define"); Printf(f_init, "(\"%s\", getter);\n", pws_name); } Printf(exported_symbols, "\"%s\", ", pws_name); free(pws_name); } } else { /* Register the function */ if (exporting_destructor) { Printf(f_init, "((swig_guile_clientdata *)(SWIGTYPE%s->clientdata))->destroy = (guile_destructor) %s;\n", swigtype_ptr, wname); //Printf(f_init, "SWIG_TypeClientData(SWIGTYPE%s, (void *) %s);\n", swigtype_ptr, wname); } Printf(f_init, "scm_c_define_gsubr(\"%s\", %d, %d, 0, (swig_guile_proc) %s);\n", proc_name, numreq, numargs - numreq, wname); } } else { /* overloaded function; don't export the single methods */ if (!Getattr(n, "sym:nextSibling")) { /* Emit overloading dispatch function */ int maxargs; String *dispatch = Swig_overload_dispatch(n, "return %s(argc,argv);", &maxargs); /* Generate a dispatch wrapper for all overloaded functions */ Wrapper *df = NewWrapper(); String *dname = Swig_name_wrapper(iname); Printv(df->def, "static SCM\n", dname, "(SCM rest)\n{\n", NIL); Printf(df->code, "#define FUNC_NAME \"%s\"\n", proc_name); Printf(df->code, "SCM argv[%d];\n", maxargs); Printf(df->code, "int argc = SWIG_Guile_GetArgs (argv, rest, %d, %d, \"%s\");\n", 0, maxargs, proc_name); Printv(df->code, dispatch, "\n", NIL); Printf(df->code, "scm_misc_error(\"%s\", \"No matching method for generic function `%s'\", SCM_EOL);\n", proc_name, iname); Printf(df->code, "#undef FUNC_NAME\n"); Printv(df->code, "}\n", NIL); Wrapper_print(df, f_wrappers); Printf(f_init, "scm_c_define_gsubr(\"%s\", 0, 0, 1, (swig_guile_proc) %s);\n", proc_name, dname); DelWrapper(df); Delete(dispatch); Delete(dname); } } Printf(exported_symbols, "\"%s\", ", proc_name); if (!in_class || memberfunction_name) { // export wrapper into goops file String *method_def = NewString(""); String *goops_name; if (in_class) goops_name = NewString(memberfunction_name); else goops_name = goopsNameMapping(proc_name, ""); String *primitive_name = NewString(""); if (primRenamer) Printv(primitive_name, "primitive:", proc_name, NIL); else Printv(primitive_name, proc_name, NIL); Replaceall(method_signature, "_", "-"); Replaceall(primitive_args, "_", "-"); if (!any_specialized_arg) { /* If there would not be any specialized argument in the method declaration, we simply re-export the function. This is a performance optimization. */ Printv(method_def, "(define ", goops_name, " ", primitive_name, ")\n", NIL); } else if (numreq == numargs) { Printv(method_def, "(define-method (", goops_name, method_signature, ")\n", NIL); Printv(method_def, " (", primitive_name, primitive_args, "))\n", NIL); } else { /* Handle optional args. For the rest argument, use a name that cannot clash. */ Printv(method_def, "(define-method (", goops_name, method_signature, " . %args)\n", NIL); Printv(method_def, " (apply ", primitive_name, primitive_args, " %args))\n", NIL); } if (in_class) { /* Defer method definition till end of class definition. */ Printv(goops_class_methods, method_def, NIL); } else { Printv(goopscode, method_def, NIL); } Printf(goopsexport, "%s ", goops_name); Delete(primitive_name); Delete(goops_name); Delete(method_def); } if (procdoc) { String *returns_text = NewString(""); if (num_results == 0) Printv(returns_text, return_nothing_doc, NIL); else if (num_results == 1) Printv(returns_text, return_one_doc, NIL); else Printv(returns_text, return_multi_doc, NIL); /* Substitute documentation variables */ static const char *numbers[] = { "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten", "eleven", "twelve" }; if (num_results <= 12) Replaceall(returns_text, "$num_values", numbers[num_results]); else { String *num_results_str = NewStringf("%d", num_results); Replaceall(returns_text, "$num_values", num_results_str); Delete(num_results_str); } Replaceall(returns_text, "$values", returns); Printf(doc_body, "\n%s", returns_text); write_doc(proc_name, signature, doc_body); Delete(returns_text); } Delete(proc_name); Delete(outarg); Delete(cleanup); Delete(signature); Delete(method_signature); Delete(primitive_args); Delete(doc_body); Delete(returns_argout); Delete(returns); Delete(tmp); Delete(scheme_arg_names); DelWrapper(f); return SWIG_OK; } /* ------------------------------------------------------------ * variableWrapper() * * Create a link to a C variable. * This creates a single function PREFIX_var_VARNAME(). * This function takes a single optional argument. If supplied, it means * we are setting this variable to some value. If omitted, it means we are * simply evaluating this variable. Either way, we return the variables * value. * ------------------------------------------------------------ */ virtual int variableWrapper(Node *n) { char *name = GetChar(n, "name"); char *iname = GetChar(n, "sym:name"); SwigType *t = Getattr(n, "type"); String *proc_name; Wrapper *f; String *tm; if (!addSymbol(iname, n)) return SWIG_ERROR; f = NewWrapper(); // evaluation function names String *var_name = Swig_name_wrapper(iname); // Build the name for scheme. proc_name = NewString(iname); Replaceall(proc_name, "_", "-"); Setattr(n, "wrap:name", proc_name); if (1 || (SwigType_type(t) != T_USER) || (is_a_pointer(t))) { Printf(f->def, "static SCM\n%s(SCM s_0)\n{\n", var_name); /* Define the scheme name in C. This define is used by several Guile macros. */ Printv(f->def, "#define FUNC_NAME \"", proc_name, "\"", NIL); Wrapper_add_local(f, "gswig_result", "SCM gswig_result"); if (!GetFlag(n, "feature:immutable")) { /* Check for a setting of the variable value */ Printf(f->code, "if (s_0 != SCM_UNDEFINED) {\n"); if ((tm = Swig_typemap_lookup("varin", n, name, 0))) { Replaceall(tm, "$source", "s_0"); Replaceall(tm, "$input", "s_0"); Replaceall(tm, "$target", name); /* Printv(f->code,tm,"\n",NIL); */ emit_action_code(n, f->code, tm); } else { throw_unhandled_guile_type_error(t); } Printf(f->code, "}\n"); } // Now return the value of the variable (regardless // of evaluating or setting) if ((tm = Swig_typemap_lookup("varout", n, name, 0))) { Replaceall(tm, "$source", name); Replaceall(tm, "$target", "gswig_result"); Replaceall(tm, "$result", "gswig_result"); /* Printv(f->code,tm,"\n",NIL); */ emit_action_code(n, f->code, tm); } else { throw_unhandled_guile_type_error(t); } Printf(f->code, "\nreturn gswig_result;\n"); Printf(f->code, "#undef FUNC_NAME\n"); Printf(f->code, "}\n"); Wrapper_print(f, f_wrappers); // Now add symbol to the Guile interpreter if (!emit_setters || GetFlag(n, "feature:immutable")) { /* Read-only variables become a simple procedure returning the value; read-write variables become a simple procedure with an optional argument. */ if (!goops && GetFlag(n, "feature:constasvar")) { /* need to export this function as a variable instead of a procedure */ if (scmstub) { /* export the function in the wrapper, and (set!) it in scmstub */ Printf(f_init, "scm_c_define_gsubr(\"%s\", 0, %d, 0, (swig_guile_proc) %s);\n", proc_name, !GetFlag(n, "feature:immutable"), var_name); Printf(scmtext, "(set! %s (%s))\n", proc_name, proc_name); } else { /* export the variable directly */ Printf(f_init, "scm_c_define(\"%s\", %s(SCM_UNDEFINED));\n", proc_name, var_name); } } else { /* Export the function as normal */ Printf(f_init, "scm_c_define_gsubr(\"%s\", 0, %d, 0, (swig_guile_proc) %s);\n", proc_name, !GetFlag(n, "feature:immutable"), var_name); } } else { /* Read/write variables become a procedure with setter. */ Printf(f_init, "{ SCM p = scm_c_define_gsubr(\"%s\", 0, 1, 0, (swig_guile_proc) %s);\n", proc_name, var_name); Printf(f_init, "scm_c_define"); Printf(f_init, "(\"%s\", " "scm_make_procedure_with_setter(p, p)); }\n", proc_name); } Printf(exported_symbols, "\"%s\", ", proc_name); // export wrapper into goops file if (!in_class) { // only if the variable is not part of a class String *class_name = SwigType_typedef_resolve_all(SwigType_base(t)); String *goops_name = goopsNameMapping(proc_name, ""); String *primitive_name = NewString(""); if (primRenamer) Printv(primitive_name, "primitive:", NIL); Printv(primitive_name, proc_name, NIL); /* Simply re-export the procedure */ if ((!emit_setters || GetFlag(n, "feature:immutable")) && GetFlag(n, "feature:constasvar")) { Printv(goopscode, "(define ", goops_name, " (", primitive_name, "))\n", NIL); } else { Printv(goopscode, "(define ", goops_name, " ", primitive_name, ")\n", NIL); } Printf(goopsexport, "%s ", goops_name); Delete(primitive_name); Delete(class_name); Delete(goops_name); } if (procdoc) { /* Compute documentation */ String *signature = NewString(""); String *signature2 = NULL; String *doc = NewString(""); if (GetFlag(n, "feature:immutable")) { Printv(signature, proc_name, NIL); if (GetFlag(n, "feature:constasvar")) { Printv(doc, "Is constant ", NIL); } else { Printv(doc, "Returns constant ", NIL); } if ((tm = Getattr(n, "tmap:varout:doc"))) { Printv(doc, tm, NIL); } else { String *s = SwigType_str(t, 0); Chop(s); Printf(doc, "<%s>", s); Delete(s); } } else if (emit_setters) { Printv(signature, proc_name, NIL); signature2 = NewString(""); Printv(signature2, "set! (", proc_name, ") ", NIL); handle_documentation_typemap(signature2, NIL, n, "tmap:varin:arglist", "new-value"); Printv(doc, "Get or set the value of the C variable, \n", NIL); Printv(doc, "which is of type ", NIL); handle_documentation_typemap(doc, NIL, n, "tmap:varout:doc", "$1_type"); Printv(doc, "."); } else { Printv(signature, proc_name, " #:optional ", NIL); if ((tm = Getattr(n, "tmap:varin:doc"))) { Printv(signature, tm, NIL); } else { String *s = SwigType_str(t, 0); Chop(s); Printf(signature, "new-value <%s>", s); Delete(s); } Printv(doc, "If NEW-VALUE is provided, " "set C variable to this value.\n", NIL); Printv(doc, "Returns variable value ", NIL); if ((tm = Getattr(n, "tmap:varout:doc"))) { Printv(doc, tm, NIL); } else { String *s = SwigType_str(t, 0); Chop(s); Printf(doc, "<%s>", s); Delete(s); } } write_doc(proc_name, signature, doc, signature2); Delete(signature); if (signature2) Delete(signature2); Delete(doc); } } else { Swig_warning(WARN_TYPEMAP_VAR_UNDEF, input_file, line_number, "Unsupported variable type %s (ignored).\n", SwigType_str(t, 0)); } Delete(var_name); Delete(proc_name); DelWrapper(f); return SWIG_OK; } /* ------------------------------------------------------------ * constantWrapper() * * We create a read-only variable. * ------------------------------------------------------------ */ virtual int constantWrapper(Node *n) { char *name = GetChar(n, "name"); char *iname = GetChar(n, "sym:name"); SwigType *type = Getattr(n, "type"); String *rawval = Getattr(n, "rawval"); String *value = rawval ? rawval : Getattr(n, "value"); int constasvar = GetFlag(n, "feature:constasvar"); String *proc_name; String *var_name; Wrapper *f; SwigType *nctype; String *tm; f = NewWrapper(); // Make a static variable; var_name = NewStringf("%sconst_%s", prefix, iname); // Strip const qualifier from type if present nctype = NewString(type); if (SwigType_isconst(nctype)) { Delete(SwigType_pop(nctype)); } // Build the name for scheme. proc_name = NewString(iname); Replaceall(proc_name, "_", "-"); if ((SwigType_type(nctype) == T_USER) && (!is_a_pointer(nctype))) { Swig_warning(WARN_TYPEMAP_CONST_UNDEF, input_file, line_number, "Unsupported constant value.\n"); Delete(var_name); DelWrapper(f); return SWIG_NOWRAP; } // See if there's a typemap if ((tm = Swig_typemap_lookup("constant", n, name, 0))) { Replaceall(tm, "$source", value); Replaceall(tm, "$value", value); Replaceall(tm, "$target", name); Printv(f_header, tm, "\n", NIL); } else { // Create variable and assign it a value Printf(f_header, "static %s = (%s)(%s);\n", SwigType_str(type, var_name), SwigType_str(type, 0), value); } { /* Hack alert: will cleanup later -- Dave */ Node *nn = NewHash(); Setfile(nn, Getfile(n)); Setline(nn, Getline(n)); Setattr(nn, "name", var_name); Setattr(nn, "sym:name", iname); Setattr(nn, "type", nctype); SetFlag(nn, "feature:immutable"); if (constasvar) { SetFlag(nn, "feature:constasvar"); } variableWrapper(nn); Delete(nn); } Delete(var_name); Delete(nctype); Delete(proc_name); DelWrapper(f); return SWIG_OK; } /* ------------------------------------------------------------ * classDeclaration() * ------------------------------------------------------------ */ virtual int classDeclaration(Node *n) { String *class_name = NewStringf("<%s>", Getattr(n, "sym:name")); Setattr(n, "guile:goopsclassname", class_name); return Language::classDeclaration(n); } /* ------------------------------------------------------------ * classHandler() * ------------------------------------------------------------ */ virtual int classHandler(Node *n) { /* Create new strings for building up a wrapper function */ have_constructor = 0; class_name = NewString(""); short_class_name = NewString(""); Printv(class_name, "<", Getattr(n, "sym:name"), ">", NIL); Printv(short_class_name, Getattr(n, "sym:name"), NIL); Replaceall(class_name, "_", "-"); Replaceall(short_class_name, "_", "-"); if (!addSymbol(class_name, n)) return SWIG_ERROR; /* Handle inheritance */ String *base_class = NewString("<"); List *baselist = Getattr(n, "bases"); if (baselist && Len(baselist)) { Iterator i = First(baselist); while (i.item) { Printv(base_class, Getattr(i.item, "sym:name"), NIL); i = Next(i); if (i.item) { Printf(base_class, "> <"); } } } Printf(base_class, ">"); Replaceall(base_class, "_", "-"); Printv(goopscode, "(define-class ", class_name, " ", NIL); Printf(goopsexport, "%s ", class_name); if (Len(base_class) > 2) { Printv(goopscode, "(", base_class, ")\n", NIL); } else { Printv(goopscode, "()\n", NIL); } SwigType *ct = NewStringf("p.%s", Getattr(n, "name")); swigtype_ptr = SwigType_manglestr(ct); String *mangled_classname = Swig_name_mangle(Getattr(n, "sym:name")); /* Export clientdata structure */ Printf(f_runtime, "static swig_guile_clientdata _swig_guile_clientdata%s = { NULL, SCM_EOL };\n", mangled_classname); Printv(f_init, "SWIG_TypeClientData(SWIGTYPE", swigtype_ptr, ", (void *) &_swig_guile_clientdata", mangled_classname, ");\n", NIL); SwigType_remember(ct); Delete(ct); /* Emit all of the members */ goops_class_methods = NewString(""); in_class = 1; Language::classHandler(n); in_class = 0; Printv(goopscode, " #:metaclass \n", NIL); if (have_constructor) Printv(goopscode, " #:new-function ", primRenamer ? "primitive:" : "", "new-", short_class_name, "\n", NIL); Printf(goopscode, ")\n%s\n", goops_class_methods); Delete(goops_class_methods); goops_class_methods = 0; /* export class initialization function */ if (goops) { /* export the wrapper function */ String *funcName = NewString(mangled_classname); Printf(funcName, "_swig_guile_setgoopsclass"); String *guileFuncName = NewString(funcName); Replaceall(guileFuncName, "_", "-"); Printv(f_wrappers, "static SCM ", funcName, "(SCM cl) \n", NIL); Printf(f_wrappers, "#define FUNC_NAME %s\n{\n", guileFuncName); Printv(f_wrappers, " ((swig_guile_clientdata *)(SWIGTYPE", swigtype_ptr, "->clientdata))->goops_class = cl;\n", NIL); Printf(f_wrappers, " return SCM_UNSPECIFIED;\n"); Printf(f_wrappers, "}\n#undef FUNC_NAME\n\n"); Printf(f_init, "scm_c_define_gsubr(\"%s\", 1, 0, 0, (swig_guile_proc) %s);\n", guileFuncName, funcName); Printf(exported_symbols, "\"%s\", ", guileFuncName); /* export the call to the wrapper function */ Printf(goopscode, "(%s%s %s)\n\n", primRenamer ? "primitive:" : "", guileFuncName, class_name); Delete(guileFuncName); Delete(funcName); } Delete(mangled_classname); Delete(swigtype_ptr); swigtype_ptr = 0; Delete(class_name); Delete(short_class_name); class_name = 0; short_class_name = 0; return SWIG_OK; } /* ------------------------------------------------------------ * memberfunctionHandler() * ------------------------------------------------------------ */ int memberfunctionHandler(Node *n) { String *iname = Getattr(n, "sym:name"); String *proc = NewString(iname); Replaceall(proc, "_", "-"); memberfunction_name = goopsNameMapping(proc, short_class_name); Language::memberfunctionHandler(n); Delete(memberfunction_name); memberfunction_name = NULL; Delete(proc); return SWIG_OK; } /* ------------------------------------------------------------ * membervariableHandler() * ------------------------------------------------------------ */ int membervariableHandler(Node *n) { String *iname = Getattr(n, "sym:name"); if (emit_setters) { struct_member = 1; Printf(f_init, "{\n"); } Language::membervariableHandler(n); if (emit_setters) { Printf(f_init, "}\n"); struct_member = 0; } String *proc = NewString(iname); Replaceall(proc, "_", "-"); String *goops_name = goopsNameMapping(proc, short_class_name); /* The slot name is never qualified with the class, even if useclassprefix is true. */ Printv(goopscode, " (", proc, " #:allocation #:virtual", NIL); /* GOOPS (at least in Guile 1.6.3) only accepts closures, not primitive procedures for slot-ref and slot-set. */ Printv(goopscode, "\n #:slot-ref (lambda (obj) (", primRenamer ? "primitive:" : "", short_class_name, "-", proc, "-get", " obj))", NIL); if (!GetFlag(n, "feature:immutable")) { Printv(goopscode, "\n #:slot-set! (lambda (obj value) (", primRenamer ? "primitive:" : "", short_class_name, "-", proc, "-set", " obj value))", NIL); } else { Printf(goopscode, "\n #:slot-set! (lambda (obj value) (error \"Immutable slot\"))"); } if (emit_slot_accessors) { if (GetFlag(n, "feature:immutable")) { Printv(goopscode, "\n #:getter ", goops_name, NIL); } else { Printv(goopscode, "\n #:accessor ", goops_name, NIL); } Printf(goopsexport, "%s ", goops_name); } Printv(goopscode, ")\n", NIL); Delete(proc); Delete(goops_name); return SWIG_OK; } /* ------------------------------------------------------------ * constructorHandler() * ------------------------------------------------------------ */ int constructorHandler(Node *n) { Language::constructorHandler(n); have_constructor = 1; return SWIG_OK; } /* ------------------------------------------------------------ * destructorHandler() * ------------------------------------------------------------ */ virtual int destructorHandler(Node *n) { exporting_destructor = true; Language::destructorHandler(n); exporting_destructor = false; return SWIG_OK; } /* ------------------------------------------------------------ * pragmaDirective() * ------------------------------------------------------------ */ virtual int pragmaDirective(Node *n) { if (!ImportMode) { String *lang = Getattr(n, "lang"); String *cmd = Getattr(n, "name"); String *value = Getattr(n, "value"); # define store_pragma(PRAGMANAME) \ if (Strcmp(cmd, #PRAGMANAME) == 0) { \ if (PRAGMANAME) Delete(PRAGMANAME); \ PRAGMANAME = value ? NewString(value) : NULL; \ } if (Strcmp(lang, "guile") == 0) { store_pragma(beforereturn) store_pragma(return_nothing_doc) store_pragma(return_one_doc) store_pragma(return_multi_doc); # undef store_pragma } } return Language::pragmaDirective(n); } /* ------------------------------------------------------------ * goopsNameMapping() * Maps the identifier from C++ to the GOOPS based * on command * line parameters and such. * If class_name = "" that means the mapping is for a function or * variable not attached to any class. * ------------------------------------------------------------ */ String *goopsNameMapping(String *name, const_String_or_char_ptr class_name) { String *n = NewString(""); if (Strcmp(class_name, "") == 0) { // not part of a class, so no class name to prefix if (goopsprefix) { Printf(n, "%s%s", goopsprefix, name); } else { Printf(n, "%s", name); } } else { if (useclassprefix) { Printf(n, "%s-%s", class_name, name); } else { if (goopsprefix) { Printf(n, "%s%s", goopsprefix, name); } else { Printf(n, "%s", name); } } } return n; } /* ------------------------------------------------------------ * validIdentifier() * ------------------------------------------------------------ */ virtual int validIdentifier(String *s) { char *c = Char(s); /* Check whether we have an R5RS identifier. Guile supports a superset of R5RS identifiers, but it's probably a bad idea to use those. */ /* --> * | */ /* --> | */ if (!(isalpha(*c) || (*c == '!') || (*c == '$') || (*c == '%') || (*c == '&') || (*c == '*') || (*c == '/') || (*c == ':') || (*c == '<') || (*c == '=') || (*c == '>') || (*c == '?') || (*c == '^') || (*c == '_') || (*c == '~'))) { /* --> + | - | ... */ if ((strcmp(c, "+") == 0) || strcmp(c, "-") == 0 || strcmp(c, "...") == 0) return 1; else return 0; } /* --> | | */ while (*c) { if (!(isalnum(*c) || (*c == '!') || (*c == '$') || (*c == '%') || (*c == '&') || (*c == '*') || (*c == '/') || (*c == ':') || (*c == '<') || (*c == '=') || (*c == '>') || (*c == '?') || (*c == '^') || (*c == '_') || (*c == '~') || (*c == '+') || (*c == '-') || (*c == '.') || (*c == '@'))) return 0; c++; } return 1; } String *runtimeCode() { String *s; s = Swig_include_sys("guile_scm_run.swg"); if (!s) { Printf(stderr, "*** Unable to open 'guile_scm_run.swg"); s = NewString(""); } return s; } String *defaultExternalRuntimeFilename() { return NewString("swigguilerun.h"); } }; /* ----------------------------------------------------------------------------- * swig_guile() - Instantiate module * ----------------------------------------------------------------------------- */ static Language *new_swig_guile() { return new GUILE(); } extern "C" Language *swig_guile(void) { return new_swig_guile(); } swig-4.0.1/Source/Modules/go.cxx0000644000175000017500000062252313527063513016363 0ustar williamwilliam/* ----------------------------------------------------------------------------- * See the LICENSE file for information on copyright, usage and redistribution * of SWIG, and the README file for authors - http://www.swig.org/release.html. * * go.cxx * * Go language module for SWIG. * ----------------------------------------------------------------------------- */ #include "swigmod.h" #include "cparse.h" #include /* ---------------------------------------------------------------------- * siphash() * * 64-bit SipHash-2-4 to generate unique id for each module * ---------------------------------------------------------------------- */ // An unsigned 64-bit integer that works on a 32-bit host. typedef struct { // Assume unsigned long is at least 32 bits. unsigned long hi; unsigned long lo; } swig_uint64; // Rotate v left by bits, which must be <= 32. static inline void _rotl(swig_uint64 *v, int bits) { assert(bits <= 32); unsigned long tmp = v->hi; if (bits == 32) { v->hi = v->lo; v->lo = tmp; } else { v->hi = (tmp << bits) | ((0xfffffffful & v->lo) >> (32 - bits)); v->lo = (v->lo << bits) | ((0xfffffffful & tmp) >> (32 - bits)); } } // dst ^= src static inline void _xor(swig_uint64 *dst, swig_uint64 *src) { dst->lo ^= src->lo; dst->hi ^= src->hi; } // dst += src static inline void _add(swig_uint64 *dst, swig_uint64 *src) { dst->lo += src->lo; dst->hi += src->hi + ((dst->lo & 0xfffffffful) < (src->lo&0xfffffffful) ? 1 : 0); } #define SIPROUND \ do { \ _add(&v0, &v1); _rotl(&v1, 13); _xor(&v1, &v0); _rotl(&v0, 32); \ _add(&v2, &v3); _rotl(&v3, 16); _xor(&v3, &v2); \ _add(&v0, &v3); _rotl(&v3, 21); _xor(&v3, &v0); \ _add(&v2, &v1); _rotl(&v1, 17); _xor(&v1, &v2); _rotl(&v2, 32); \ } while(0) // Set out to the hash of inc/inlen. static void siphash(swig_uint64 *out, const char *inc, unsigned long inlen) { /* "somepseudorandomlygeneratedbytes" */ swig_uint64 v0 = {0x736f6d65UL, 0x70736575UL}; swig_uint64 v1 = {0x646f7261UL, 0x6e646f6dUL}; swig_uint64 v2 = {0x6c796765UL, 0x6e657261UL}; swig_uint64 v3 = {0x74656462UL, 0x79746573UL}; swig_uint64 b; /* hard-coded k. */ swig_uint64 k0 = {0x07060504UL, 0x03020100UL}; swig_uint64 k1 = {0x0F0E0D0CUL, 0x0B0A0908UL}; int i; const int cROUNDS = 2, dROUNDS = 4; const unsigned char *in = (const unsigned char *)inc; const unsigned char *end = in + inlen - (inlen % 8); int left = inlen & 7; _xor(&v3, &k1); _xor(&v2, &k0); _xor(&v1, &k1); _xor(&v0, &k0); for (; in != end; in += 8) { b.hi = 0; b.lo = 0; for (i = 0; i < 4; i++) { b.lo |= ((unsigned long)in[i]) << (8*i); } for (i = 0; i < 4; i++) { b.hi |= ((unsigned long)in[i+4]) << (8*i); } _xor(&v3, &b); for (i = 0; i < cROUNDS; i++) { SIPROUND; } _xor(&v0, &b); } b.hi = (inlen & 0xff)<<24; b.lo = 0; for (; left; left--) { if (left > 4) { b.hi |= ((unsigned long)in[left-1]) << (8*left-8-32); } else { b.lo |= ((unsigned long)in[left-1]) << (8*left-8); } } _xor(&v3, &b); for(i=0; ilo = 0; out->hi = 0; _xor(out, &v0); _xor(out, &v1); _xor(out, &v2); _xor(out, &v3); } #undef SIPROUND class GO:public Language { static const char *const usage; // Go package name. String *package; // SWIG module name. String *module; // Flag for generating cgo input files. bool cgo_flag; // Flag for generating gccgo output. bool gccgo_flag; // Prefix to use with gccgo. String *go_prefix; // -fgo-prefix option. String *prefix_option; // -fgo-pkgpath option. String *pkgpath_option; // Prefix for translating %import directive to import statements. String *import_prefix; // Whether to use a shared library. bool use_shlib; // Name of shared library to import. String *soname; // Size in bits of the Go type "int". 0 if not specified. int intgo_type_size; /* Output files */ File *f_c_begin; File *f_go_begin; File *f_gc_begin; /* Output fragments */ File *f_c_runtime; File *f_c_header; File *f_c_wrappers; File *f_c_init; File *f_c_directors; File *f_c_directors_h; File *f_go_imports; File *f_go_runtime; File *f_go_header; File *f_go_wrappers; File *f_go_directors; File *f_gc_runtime; File *f_gc_header; File *f_gc_wrappers; File *f_cgo_comment; File *f_cgo_comment_typedefs; // True if we imported a module. bool saw_import; // If not NULL, name of import package being processed. String *imported_package; // Build interface methods while handling a class. This is only // non-NULL when we are handling methods. String *interfaces; // The class node while handling a class. This is only non-NULL // when we are handling methods. Node *class_node; // The class name while handling a class. This is only non-NULL // when we are handling methods. This is the name of the class as // SWIG sees it. String *class_name; // The receiver name while handling a class. This is only non-NULL // when we are handling methods. This is the name of the class // as run through goCPointerType. String *class_receiver; // A hash table of method names that we have seen when processing a // class. This lets us detect base class methods that we don't want // to use. Hash *class_methods; // True when we are generating the wrapper functions for a variable. bool making_variable_wrappers; // True when working with a static member function. bool is_static_member_function; // A hash table of enum types that we have seen but which may not have // been defined. The index is a SwigType. Hash *undefined_enum_types; // A hash table of types that we have seen but which may not have // been defined. The index is a SwigType. Hash *undefined_types; // A hash table of classes which were defined. The index is a Go // type name. Hash *defined_types; // A hash table of all the go_imports already imported. The index is a full // import name e.g. '"runtime"' or '_ "runtime/cgo"' or 'sc "syscall"'. Hash *go_imports; // A unique ID used to make public symbols unique. String *unique_id; public: GO():package(NULL), module(NULL), cgo_flag(true), gccgo_flag(false), go_prefix(NULL), prefix_option(NULL), pkgpath_option(NULL), import_prefix(NULL), use_shlib(false), soname(NULL), intgo_type_size(0), f_c_begin(NULL), f_go_begin(NULL), f_gc_begin(NULL), f_c_runtime(NULL), f_c_header(NULL), f_c_wrappers(NULL), f_c_init(NULL), f_c_directors(NULL), f_c_directors_h(NULL), f_go_imports(NULL), f_go_runtime(NULL), f_go_header(NULL), f_go_wrappers(NULL), f_go_directors(NULL), f_gc_runtime(NULL), f_gc_header(NULL), f_gc_wrappers(NULL), f_cgo_comment(NULL), f_cgo_comment_typedefs(NULL), saw_import(false), imported_package(NULL), interfaces(NULL), class_node(NULL), class_name(NULL), class_receiver(NULL), class_methods(NULL), making_variable_wrappers(false), is_static_member_function(false), undefined_enum_types(NULL), undefined_types(NULL), defined_types(NULL), go_imports(NULL), unique_id(NULL) { director_multiple_inheritance = 1; director_language = 1; director_prot_ctor_code = NewString("_swig_gopanic(\"accessing abstract class or protected constructor\");"); } private: /* ------------------------------------------------------------ * main() * ------------------------------------------------------------ */ virtual void main(int argc, char *argv[]) { SWIG_library_directory("go"); bool display_help = false; // Process command line options. for (int i = 1; i < argc; i++) { if (argv[i]) { if (strcmp(argv[i], "-package") == 0) { if (argv[i + 1]) { package = NewString(argv[i + 1]); Swig_mark_arg(i); Swig_mark_arg(i + 1); i++; } else { Swig_arg_error(); } } else if (strcmp(argv[i], "-cgo") == 0) { Swig_mark_arg(i); cgo_flag = true; } else if (strcmp(argv[i], "-no-cgo") == 0) { Swig_mark_arg(i); cgo_flag = false; } else if (strcmp(argv[i], "-gccgo") == 0) { Swig_mark_arg(i); gccgo_flag = true; } else if (strcmp(argv[i], "-go-prefix") == 0) { if (argv[i + 1]) { prefix_option = NewString(argv[i + 1]); Swig_mark_arg(i); Swig_mark_arg(i + 1); i++; } else { Swig_arg_error(); } } else if (strcmp(argv[i], "-go-pkgpath") == 0) { if (argv[i + 1]) { pkgpath_option = NewString(argv[i + 1]); Swig_mark_arg(i); Swig_mark_arg(i + 1); i++; } else { Swig_arg_error(); } } else if (strcmp(argv[i], "-import-prefix") == 0) { if (argv[i + 1]) { import_prefix = NewString(argv[i + 1]); Swig_mark_arg(i); Swig_mark_arg(i + 1); i++; } else { Swig_arg_error(); } } else if (strcmp(argv[i], "-use-shlib") == 0) { Swig_mark_arg(i); use_shlib = true; } else if (strcmp(argv[i], "-soname") == 0) { if (argv[i + 1]) { soname = NewString(argv[i + 1]); Swig_mark_arg(i); Swig_mark_arg(i + 1); i++; } else { Swig_arg_error(); } } else if (strcmp(argv[i], "-longsize") == 0) { // Ignore for backward compatibility. if (argv[i + 1]) { Swig_mark_arg(i); Swig_mark_arg(i + 1); ++i; } else { Swig_arg_error(); } } else if (strcmp(argv[i], "-intgosize") == 0) { if (argv[i + 1]) { intgo_type_size = atoi(argv[i + 1]); if (intgo_type_size != 32 && intgo_type_size != 64) { Printf(stderr, "-intgosize not 32 or 64\n"); Swig_arg_error(); } Swig_mark_arg(i); Swig_mark_arg(i + 1); ++i; } else { Swig_arg_error(); } } else if (strcmp(argv[i], "-help") == 0) { display_help = true; Printf(stdout, "%s\n", usage); } } } if (gccgo_flag && !pkgpath_option && !prefix_option) { prefix_option = NewString("go"); } // Add preprocessor symbol to parser. Preprocessor_define("SWIGGO 1", 0); if (cgo_flag) { Preprocessor_define("SWIGGO_CGO 1", 0); } if (gccgo_flag) { Preprocessor_define("SWIGGO_GCCGO 1", 0); } // This test may be removed in the future, when we can assume that // everybody has upgraded to Go 1.1. The code below is prepared // for this test to simply be taken out. if (intgo_type_size == 0 && !display_help) { Printf(stderr, "SWIG -go: -intgosize option required but not specified\n"); SWIG_exit(EXIT_FAILURE); } if (intgo_type_size == 32) { Preprocessor_define("SWIGGO_INTGO_SIZE 32", 0); } else if (intgo_type_size == 64) { Preprocessor_define("SWIGGO_INTGO_SIZE 64", 0); } else { Preprocessor_define("SWIGGO_INTGO_SIZE 0", 0); } // Add typemap definitions. SWIG_typemap_lang("go"); SWIG_config_file("go.swg"); allow_overloading(); } /* --------------------------------------------------------------------- * top() * * For 6g/8g, we are going to create the following files: * * 1) A .c or .cxx file compiled with gcc. This file will contain * function wrappers. Each wrapper will take a pointer to a * struct holding the arguments, unpack them, and call the real * function. * * 2) A .go file which defines the Go form of all types, and which * defines Go function wrappers. Each wrapper will call the C * function wrapper in the second file. * * 3) A .c file compiled with 6c/8c. This file will define * Go-callable C function wrappers. Each wrapper will use * cgocall to call the function wrappers in the first file. * * When generating code for gccgo, we don't need the third file, and * the function wrappers in the first file have a different form. * * --------------------------------------------------------------------- */ virtual int top(Node *n) { Node *optionsnode = Getattr(Getattr(n, "module"), "options"); if (optionsnode) { if (Getattr(optionsnode, "directors")) { allow_directors(); } if (Getattr(optionsnode, "dirprot")) { allow_dirprot(); } allow_allprotected(GetFlag(optionsnode, "allprotected")); } module = Getattr(n, "name"); if (!package) { package = Copy(module); } if (!soname && use_shlib) { soname = Copy(package); Append(soname, ".so"); } if (gccgo_flag) { String *pref; if (pkgpath_option) { pref = pkgpath_option; } else { pref = prefix_option; } go_prefix = NewString(""); for (char *p = Char(pref); *p != '\0'; p++) { if ((*p >= 'A' && *p <= 'Z') || (*p >= 'a' && *p <= 'z') || (*p >= '0' && *p <= '9') || *p == '.' || *p == '$') { Putc(*p, go_prefix); } else { Putc('_', go_prefix); } } if (!pkgpath_option) { Append(go_prefix, "."); Append(go_prefix, getModuleName(package)); } } // Get filenames. String *swig_filename = Getattr(n, "infile"); String *c_filename = Getattr(n, "outfile"); String *c_filename_h = Getattr(n, "outfile_h"); String *go_filename = NewString(""); Printf(go_filename, "%s%s.go", SWIG_output_directory(), module); String *gc_filename = NULL; if (!gccgo_flag) { gc_filename = NewString(""); Printf(gc_filename, "%s%s_gc.c", SWIG_output_directory(), module); } // Generate a unique ID based on a hash of the SWIG input. swig_uint64 hash = {0, 0}; FILE *swig_input = Swig_open(swig_filename); if (swig_input == NULL) { FileErrorDisplay(swig_filename); SWIG_exit(EXIT_FAILURE); } String *swig_input_content = Swig_read_file(swig_input); siphash(&hash, Char(swig_input_content), Len(swig_input_content)); Delete(swig_input_content); fclose(swig_input); unique_id = NewString(""); Printf(unique_id, "_%s_%08x%08x", getModuleName(package), hash.hi, hash.lo); // Open files. f_c_begin = NewFile(c_filename, "w", SWIG_output_files()); if (!f_c_begin) { FileErrorDisplay(c_filename); SWIG_exit(EXIT_FAILURE); } if (directorsEnabled()) { if (!c_filename_h) { Printf(stderr, "Unable to determine outfile_h\n"); SWIG_exit(EXIT_FAILURE); } f_c_directors_h = NewFile(c_filename_h, "w", SWIG_output_files()); if (!f_c_directors_h) { FileErrorDisplay(c_filename_h); SWIG_exit(EXIT_FAILURE); } } f_go_begin = NewFile(go_filename, "w", SWIG_output_files()); if (!f_go_begin) { FileErrorDisplay(go_filename); SWIG_exit(EXIT_FAILURE); } if (!gccgo_flag && !cgo_flag) { f_gc_begin = NewFile(gc_filename, "w", SWIG_output_files()); if (!f_gc_begin) { FileErrorDisplay(gc_filename); SWIG_exit(EXIT_FAILURE); } } f_c_runtime = NewString(""); f_c_header = NewString(""); f_c_wrappers = NewString(""); f_c_init = NewString(""); f_c_directors = NewString(""); f_go_imports = NewString(""); f_go_runtime = NewString(""); f_go_header = NewString(""); f_go_wrappers = NewString(""); f_go_directors = NewString(""); if (!gccgo_flag && !cgo_flag) { f_gc_runtime = NewString(""); f_gc_header = NewString(""); f_gc_wrappers = NewString(""); } if (cgo_flag) { f_cgo_comment = NewString(""); f_cgo_comment_typedefs = NewString(""); } Swig_register_filebyname("begin", f_c_begin); Swig_register_filebyname("runtime", f_c_runtime); Swig_register_filebyname("header", f_c_header); Swig_register_filebyname("wrapper", f_c_wrappers); Swig_register_filebyname("init", f_c_init); Swig_register_filebyname("director", f_c_directors); Swig_register_filebyname("director_h", f_c_directors_h); Swig_register_filebyname("go_begin", f_go_begin); Swig_register_filebyname("go_imports", f_go_imports); Swig_register_filebyname("go_runtime", f_go_runtime); Swig_register_filebyname("go_header", f_go_header); Swig_register_filebyname("go_wrapper", f_go_wrappers); Swig_register_filebyname("go_director", f_go_directors); if (!gccgo_flag && !cgo_flag) { Swig_register_filebyname("gc_begin", f_gc_begin); Swig_register_filebyname("gc_runtime", f_gc_runtime); Swig_register_filebyname("gc_header", f_gc_header); Swig_register_filebyname("gc_wrapper", f_gc_wrappers); } if (cgo_flag) { Swig_register_filebyname("cgo_comment", f_cgo_comment); Swig_register_filebyname("cgo_comment_typedefs", f_cgo_comment_typedefs); } Swig_banner(f_c_begin); if (CPlusPlus) { Printf(f_c_begin, "\n// source: %s\n\n", swig_filename); } else { Printf(f_c_begin, "\n/* source: %s */\n\n", swig_filename); } Printf(f_c_runtime, "#define SWIGMODULE %s\n", module); if (gccgo_flag) { Printf(f_c_runtime, "#define SWIGGO_PREFIX %s\n", go_prefix); } if (directorsEnabled()) { Printf(f_c_runtime, "#define SWIG_DIRECTORS\n"); Swig_banner(f_c_directors_h); Printf(f_c_directors_h, "\n// source: %s\n\n", swig_filename); Printf(f_c_directors_h, "#ifndef SWIG_%s_WRAP_H_\n", module); Printf(f_c_directors_h, "#define SWIG_%s_WRAP_H_\n\n", module); Printf(f_c_directors_h, "class Swig_memory;\n\n"); Printf(f_c_directors, "\n// C++ director class methods.\n"); String *filename = Swig_file_filename(c_filename_h); Printf(f_c_directors, "#include \"%s\"\n\n", filename); Delete(filename); } Swig_banner(f_go_begin); Printf(f_go_begin, "\n// source: %s\n", swig_filename); if (!gccgo_flag && !cgo_flag && soname) { Swig_banner(f_gc_begin); Printf(f_gc_begin, "\n/* source: %s */\n\n", swig_filename); Printf(f_gc_begin, "\n/* This file should be compiled with 6c/8c. */\n"); Printf(f_gc_begin, "#pragma dynimport _ _ \"%s\"\n", soname); } if (cgo_flag) { Printv(f_cgo_comment_typedefs, "/*\n", NULL); // The cgo program defines the intgo type after our function // definitions, but we want those definitions to be able to use // intgo also. Printv(f_cgo_comment_typedefs, "#define intgo swig_intgo\n", NULL); Printv(f_cgo_comment_typedefs, "typedef void *swig_voidp;\n", NULL); } // Output module initialization code. Printf(f_go_begin, "\npackage %s\n\n", getModuleName(package)); if (gccgo_flag && !cgo_flag) { Printf(f_go_runtime, "func SwigCgocall()\n"); Printf(f_go_runtime, "func SwigCgocallDone()\n"); Printf(f_go_runtime, "func SwigCgocallBack()\n"); Printf(f_go_runtime, "func SwigCgocallBackDone()\n\n"); } // All the C++ wrappers should be extern "C". Printv(f_c_wrappers, "#ifdef __cplusplus\n", "extern \"C\" {\n", "#endif\n\n", NULL); // Set up the hash table for types not defined by SWIG. undefined_enum_types = NewHash(); undefined_types = NewHash(); defined_types = NewHash(); go_imports = NewHash(); // Emit code. Language::top(n); if (directorsEnabled()) { // Insert director runtime into the f_runtime file (make it occur before %header section) Swig_insert_file("director_common.swg", f_c_runtime); Swig_insert_file("director.swg", f_c_runtime); } Delete(go_imports); // Write out definitions for the types not defined by SWIG. if (Len(undefined_enum_types) > 0) Printv(f_go_wrappers, "\n", NULL); for (Iterator p = First(undefined_enum_types); p.key; p = Next(p)) { String *name = p.item; Printv(f_go_wrappers, "type ", name, " int\n", NULL); } Printv(f_go_wrappers, "\n", NULL); for (Iterator p = First(undefined_types); p.key; p = Next(p)) { String *ty = goType(NULL, p.key); if (!Getattr(defined_types, ty)) { String *cp = goCPointerType(p.key, false); if (!Getattr(defined_types, cp)) { Printv(f_go_wrappers, "type ", cp, " uintptr\n", NULL); Printv(f_go_wrappers, "type ", ty, " interface {\n", NULL); Printv(f_go_wrappers, "\tSwigcptr() uintptr;\n", NULL); Printv(f_go_wrappers, "}\n", NULL); Printv(f_go_wrappers, "func (p ", cp, ") Swigcptr() uintptr {\n", NULL); Printv(f_go_wrappers, "\treturn uintptr(p)\n", NULL); Printv(f_go_wrappers, "}\n\n", NULL); } Delete(cp); } Delete(ty); } Delete(undefined_enum_types); Delete(undefined_types); Delete(defined_types); /* Write and cleanup */ Dump(f_c_header, f_c_runtime); if (directorsEnabled()) { Printf(f_c_directors_h, "#endif\n"); Delete(f_c_directors_h); f_c_directors_h = NULL; Dump(f_c_directors, f_c_runtime); Delete(f_c_directors); f_c_directors = NULL; } // End the extern "C". Printv(f_c_wrappers, "#ifdef __cplusplus\n", "}\n", "#endif\n\n", NULL); if (cgo_flag) { // End the cgo comment. Printv(f_cgo_comment, "#undef intgo\n", NULL); Printv(f_cgo_comment, "*/\n", NULL); Printv(f_cgo_comment, "import \"C\"\n", NULL); Printv(f_cgo_comment, "\n", NULL); } Dump(f_c_runtime, f_c_begin); Dump(f_c_wrappers, f_c_begin); Dump(f_c_init, f_c_begin); if (cgo_flag) { Dump(f_cgo_comment_typedefs, f_go_begin); Dump(f_cgo_comment, f_go_begin); } Dump(f_go_imports, f_go_begin); Dump(f_go_header, f_go_begin); Dump(f_go_runtime, f_go_begin); Dump(f_go_wrappers, f_go_begin); if (directorsEnabled()) { Dump(f_go_directors, f_go_begin); } if (!gccgo_flag && !cgo_flag) { Dump(f_gc_header, f_gc_begin); Dump(f_gc_runtime, f_gc_begin); Dump(f_gc_wrappers, f_gc_begin); } Delete(f_c_runtime); Delete(f_c_header); Delete(f_c_wrappers); Delete(f_c_init); Delete(f_go_imports); Delete(f_go_runtime); Delete(f_go_header); Delete(f_go_wrappers); Delete(f_go_directors); if (!gccgo_flag && !cgo_flag) { Delete(f_gc_runtime); Delete(f_gc_header); Delete(f_gc_wrappers); } if (cgo_flag) { Delete(f_cgo_comment); Delete(f_cgo_comment_typedefs); } Delete(f_c_begin); Delete(f_go_begin); if (!gccgo_flag && !cgo_flag) { Delete(f_gc_begin); } return SWIG_OK; } /* ------------------------------------------------------------ * importDirective() * * Handle a SWIG import statement by generating a Go import * statement. * ------------------------------------------------------------ */ virtual int importDirective(Node *n) { String *hold_import = imported_package; String *modname = Getattr(n, "module"); if (modname) { if (!Getattr(go_imports, modname)) { Setattr(go_imports, modname, modname); Printv(f_go_imports, "import \"", NULL); if (import_prefix) { Printv(f_go_imports, import_prefix, "/", NULL); } Printv(f_go_imports, modname, "\"\n", NULL); } imported_package = modname; saw_import = true; } int r = Language::importDirective(n); imported_package = hold_import; return r; } /* ---------------------------------------------------------------------- * Language::insertDirective() * * If the section is go_imports, store them for later. * ---------------------------------------------------------------------- */ virtual int insertDirective(Node *n) { char *section = Char(Getattr(n, "section")); if ((ImportMode && !Getattr(n, "generated")) || !section || (strcmp(section, "go_imports") != 0)) { return Language::insertDirective(n); } char *code = Char(Getattr(n, "code")); char *pch = strtok(code, ","); while (pch != NULL) { // Do not import same thing more than once. if (!Getattr(go_imports, pch)) { Setattr(go_imports, pch, pch); Printv(f_go_imports, "import ", pch, "\n", NULL); } pch = strtok(NULL, ","); } return SWIG_OK; } /* ---------------------------------------------------------------------- * functionWrapper() * * Implement a function. * ---------------------------------------------------------------------- */ virtual int functionWrapper(Node *n) { if (GetFlag(n, "feature:ignore")) { return SWIG_OK; } // We don't need explicit calls. if (GetFlag(n, "explicitcall")) { return SWIG_OK; } // Don't emit constructors for abstract director classes. They // will never succeed anyhow. if (Swig_methodclass(n) && Swig_directorclass(n) && Strcmp(Char(Getattr(n, "wrap:action")), director_prot_ctor_code) == 0) { return SWIG_OK; } String *name = Getattr(n, "sym:name"); String *nodetype = Getattr(n, "nodeType"); bool is_static = is_static_member_function || isStatic(n); bool is_friend = isFriend(n); bool is_ctor_dtor = false; SwigType *result = Getattr(n, "type"); // For some reason SWIG changs the "type" value during the call to // functionWrapper. We need to remember the type for possible // overload processing. Setattr(n, "go:type", Copy(result)); String *go_name; String *r1 = NULL; if (making_variable_wrappers) { // Change the name of the variable setter and getter functions // to be more Go like. bool is_set = Strcmp(Char(name) + Len(name) - 4, "_set") == 0; assert(is_set || Strcmp(Char(name) + Len(name) - 4, "_get") == 0); // Start with Set or Get. go_name = NewString(is_set ? "Set" : "Get"); // If this is a static variable, put in the class name, // capitalized. if (is_static && class_name) { String *ccn = exportedName(class_name); Append(go_name, ccn); Delete(ccn); } // Add the rest of the name, capitalized, dropping the _set or // _get. String *c1 = removeClassname(name); String *c2 = exportedName(c1); char *p = Char(c2); int len = Len(p); for (int i = 0; i < len - 4; ++i) { Putc(p[i], go_name); } Delete(c2); Delete(c1); if (!checkIgnoredParameters(n, go_name)) { Delete(go_name); return SWIG_NOWRAP; } } else if (Cmp(nodetype, "constructor") == 0) { is_ctor_dtor = true; // Change the name of a constructor to be more Go like. Change // new_ to New, and capitalize the class name. assert(Strncmp(name, "new_", 4) == 0); String *c1 = NewString(Char(name) + 4); String *c2 = exportedName(c1); go_name = NewString("New"); Append(go_name, c2); Delete(c2); Delete(c1); if (Swig_methodclass(n) && Swig_directorclass(n)) { // The core SWIG code skips the first parameter when // generating the $nondirector_new string. Recreate the // action in this case. But don't it if we are using the // special code for an abstract class. String *call = Swig_cppconstructor_call(getClassType(), Getattr(n, "parms")); SwigType *type = Copy(getClassType()); SwigType_add_pointer(type); String *cres = Swig_cresult(type, Swig_cresult_name(), call); Setattr(n, "wrap:action", cres); } } else if (Cmp(nodetype, "destructor") == 0) { // No need to emit protected destructors. if (!is_public(n)) { return SWIG_OK; } is_ctor_dtor = true; // Change the name of a destructor to be more Go like. Change // delete_ to Delete and capitalize the class name. assert(Strncmp(name, "delete_", 7) == 0); String *c1 = NewString(Char(name) + 7); String *c2 = exportedName(c1); go_name = NewString("Delete"); Append(go_name, c2); Delete(c2); Delete(c1); result = NewString("void"); r1 = result; } else { if (!checkFunctionVisibility(n, NULL)) { return SWIG_OK; } go_name = buildGoName(name, is_static, is_friend); if (!checkIgnoredParameters(n, go_name)) { Delete(go_name); return SWIG_NOWRAP; } } String *overname = NULL; if (Getattr(n, "sym:overloaded")) { overname = Getattr(n, "sym:overname"); } else { String *scope; if (!class_name || is_static || is_ctor_dtor) { scope = NULL; } else { scope = NewString("swiggoscope."); Append(scope, class_name); } if (!checkNameConflict(go_name, n, scope)) { Delete(go_name); return SWIG_NOWRAP; } } String *wname = Swig_name_wrapper(name); if (overname) { Append(wname, overname); } Append(wname, unique_id); Setattr(n, "wrap:name", wname); ParmList *parms = Getattr(n, "parms"); Setattr(n, "wrap:parms", parms); int r = makeWrappers(n, name, go_name, overname, wname, NULL, parms, result, is_static); if (r != SWIG_OK) { return r; } if (Getattr(n, "sym:overloaded") && !Getattr(n, "sym:nextSibling")) { String *scope ; if (!class_name || is_static || is_ctor_dtor) { scope = NULL; } else { scope = NewString("swiggoscope."); Append(scope, class_name); } if (!checkNameConflict(go_name, n, scope)) { Delete(go_name); return SWIG_NOWRAP; } String *receiver = class_receiver; if (is_static || is_ctor_dtor) { receiver = NULL; } r = makeDispatchFunction(n, go_name, receiver, is_static, NULL, false); if (r != SWIG_OK) { return r; } } Delete(wname); Delete(go_name); Delete(r1); return SWIG_OK; } /* ---------------------------------------------------------------------- * staticmemberfunctionHandler() * * For some reason the language code removes the "storage" attribute * for a static function before calling functionWrapper, which means * that we have no way of knowing whether a function is static or * not. That makes no sense in the Go context. Here we note that a * function is static. * ---------------------------------------------------------------------- */ int staticmemberfunctionHandler(Node *n) { assert(!is_static_member_function); is_static_member_function = true; int r = Language::staticmemberfunctionHandler(n); is_static_member_function = false; return r; } /* ---------------------------------------------------------------------- * makeWrappers() * * Write out the various function wrappers. * n: The function we are emitting. * name: The function name. * go_name: The name of the function in Go. * overname: The overload string for overloaded function. * wname: The SWIG wrapped name--the name of the C function. * base: A list of the names of base classes, in the case where this * is a virtual method not defined in the current class. * parms: The parameters. * result: The result type. * is_static: Whether this is a static method or member. * ---------------------------------------------------------------------- */ int makeWrappers(Node *n, String *name, String *go_name, String *overname, String *wname, List *base, ParmList *parms, SwigType *result, bool is_static) { assert(result); int ret = SWIG_OK; if (cgo_flag) { int r = makeCgoWrappers(n, go_name, overname, wname, base, parms, result, is_static); if (r != SWIG_OK) { ret = r; } } else { int r = goFunctionWrapper(n, name, go_name, overname, wname, base, parms, result, is_static); if (r != SWIG_OK) { ret = r; } if (!gccgo_flag) { r = gcFunctionWrapper(wname); if (r != SWIG_OK) { ret = r; } r = gccFunctionWrapper(n, base, wname, parms, result); if (r != SWIG_OK) { ret = r; } } else { r = gccgoFunctionWrapper(n, base, wname, parms, result); if (r != SWIG_OK) { ret = r; } } } if (class_methods) { Setattr(class_methods, Getattr(n, "name"), NewString("")); } return ret; } /* ---------------------------------------------------------------------- * struct cgoWrapperInfo * * Information needed by the CGO wrapper functions. * ---------------------------------------------------------------------- */ struct cgoWrapperInfo { // The function we are generating code for. Node *n; // The name of the Go function. String *go_name; // The overload string for an overloaded function. String *overname; // The name of the C wrapper function. String *wname; // The base classes. List *base; // The parameters. ParmList *parms; // The result type. SwigType *result; // Whether this is a static function, not a class method. bool is_static; // The Go receiver type. String *receiver; // Whether this is a class constructor. bool is_constructor; // Whether this is a class destructor. bool is_destructor; }; /* ---------------------------------------------------------------------- * makeCgoWrappers() * * Write out the wrappers for a function when producing cgo input * files. * ---------------------------------------------------------------------- */ int makeCgoWrappers(Node *n, String *go_name, String *overname, String *wname, List *base, ParmList *parms, SwigType *result, bool is_static) { Swig_save("makeCgoWrappers", n, "emit:cgotype", "emit:cgotypestruct", NULL); cgoWrapperInfo info; info.n = n; info.go_name = go_name; info.overname = overname; info.wname = wname; info.base = base; info.parms = parms; info.result = result; info.is_static = is_static; info.receiver = class_receiver; if (is_static) { info.receiver = NULL; } String *nodetype = Getattr(n, "nodeType"); info.is_constructor = Cmp(nodetype, "constructor") == 0; info.is_destructor = Cmp(nodetype, "destructor") == 0; if (info.is_constructor || info.is_destructor) { assert(class_receiver); assert(!base); info.receiver = NULL; } int ret = SWIG_OK; int r = cgoGoWrapper(&info); if (r != SWIG_OK) { ret = r; } r = cgoCommentWrapper(&info); if (r != SWIG_OK) { ret = r; } r = cgoGccWrapper(&info); if (r != SWIG_OK) { ret = r; } Swig_restore(n); return ret; } /* ---------------------------------------------------------------------- * cgoGoWrapper() * * Write out Go code to call a cgo function. This code will go into * the generated Go output file. * ---------------------------------------------------------------------- */ int cgoGoWrapper(const cgoWrapperInfo *info) { Wrapper *dummy = initGoTypemaps(info->parms); bool add_to_interface = interfaces && !info->is_constructor && !info->is_destructor && !info->is_static && !info->overname && checkFunctionVisibility(info->n, NULL); Printv(f_go_wrappers, "func ", NULL); Parm *p = info->parms; int pi = 0; // Add the receiver first if this is a method. if (info->receiver) { Printv(f_go_wrappers, "(", NULL); if (info->base && info->receiver) { Printv(f_go_wrappers, "_swig_base", NULL); } else { Printv(f_go_wrappers, Getattr(p, "lname"), NULL); p = nextParm(p); ++pi; } Printv(f_go_wrappers, " ", info->receiver, ") ", NULL); } Printv(f_go_wrappers, info->go_name, NULL); if (info->overname) { Printv(f_go_wrappers, info->overname, NULL); } Printv(f_go_wrappers, "(", NULL); // If we are doing methods, add this method to the interface. if (add_to_interface) { Printv(interfaces, "\t", info->go_name, "(", NULL); } // Write out the parameters to both the function definition and // the interface. String *parm_print = NewString(""); int parm_count = emit_num_arguments(info->parms); int required_count = emit_num_required(info->parms); int args = 0; for (; pi < parm_count; ++pi) { p = getParm(p); if (pi == 0 && info->is_destructor) { String *cl = exportedName(class_name); Printv(parm_print, Getattr(p, "lname"), " ", cl, NULL); Delete(cl); ++args; } else { if (args > 0) { Printv(parm_print, ", ", NULL); } ++args; if (pi >= required_count) { Printv(parm_print, "_swig_args ...interface{}", NULL); break; } Printv(parm_print, Getattr(p, "lname"), " ", NULL); String *tm = goType(p, Getattr(p, "type")); Printv(parm_print, tm, NULL); Delete(tm); } p = nextParm(p); } Printv(parm_print, ")", NULL); // Write out the result type. if (info->is_constructor) { String *cl = exportedName(class_name); Printv(parm_print, " (_swig_ret ", cl, ")", NULL); Delete(cl); } else { if (SwigType_type(info->result) != T_VOID) { String *tm = goType(info->n, info->result); Printv(parm_print, " (_swig_ret ", tm, ")", NULL); Delete(tm); } } Printv(f_go_wrappers, parm_print, NULL); if (add_to_interface) { Printv(interfaces, parm_print, "\n", NULL); } // Write out the function body. Printv(f_go_wrappers, " {\n", NULL); if (parm_count > required_count) { Parm *p = info->parms; int i; for (i = 0; i < required_count; ++i) { p = getParm(p); p = nextParm(p); } for (; i < parm_count; ++i) { p = getParm(p); String *tm = goType(p, Getattr(p, "type")); Printv(f_go_wrappers, "\tvar ", Getattr(p, "lname"), " ", tm, "\n", NULL); Printf(f_go_wrappers, "\tif len(_swig_args) > %d {\n", i - required_count); Printf(f_go_wrappers, "\t\t%s = _swig_args[%d].(%s)\n", Getattr(p, "lname"), i - required_count, tm); Printv(f_go_wrappers, "\t}\n", NULL); Delete(tm); p = nextParm(p); } } String *call = NewString("\t"); String *ret_type = NULL; bool memcpy_ret = false; String *wt = NULL; if (SwigType_type(info->result) != T_VOID) { if (info->is_constructor) { ret_type = exportedName(class_name); } else { ret_type = goImType(info->n, info->result); } Printv(f_go_wrappers, "\tvar swig_r ", ret_type, "\n", NULL); bool c_struct_type; Delete(cgoTypeForGoValue(info->n, info->result, &c_struct_type)); if (c_struct_type) { memcpy_ret = true; } if (memcpy_ret) { Printv(call, "swig_r_p := ", NULL); } else { Printv(call, "swig_r = (", ret_type, ")(", NULL); } if (info->is_constructor || goTypeIsInterface(info->n, info->result)) { if (info->is_constructor) { wt = Copy(class_receiver); } else { wt = goWrapperType(info->n, info->result, true); } Printv(call, wt, "(", NULL); } } Printv(call, "C.", info->wname, "(", NULL); args = 0; if (parm_count > required_count) { Printv(call, "C.swig_intgo(len(_swig_args))", NULL); ++args; } if (info->base && info->receiver) { if (args > 0) { Printv(call, ", ", NULL); } ++args; Printv(call, "C.uintptr_t(_swig_base)", NULL); } p = info->parms; for (int i = 0; i < parm_count; ++i) { p = getParm(p); if (args > 0) { Printv(call, ", ", NULL); } ++args; SwigType *pt = Getattr(p, "type"); String *ln = Getattr(p, "lname"); String *ivar = NewStringf("_swig_i_%d", i); String *goin = goGetattr(p, "tmap:goin"); if (goin == NULL) { Printv(f_go_wrappers, "\t", ivar, " := ", ln, NULL); if ((i == 0 && info->is_destructor) || ((i > 0 || !info->receiver || info->base || info->is_constructor) && goTypeIsInterface(p, pt))) { Printv(f_go_wrappers, ".Swigcptr()", NULL); } Printv(f_go_wrappers, "\n", NULL); Setattr(p, "emit:goinput", ln); } else { String *itm = goImType(p, pt); Printv(f_go_wrappers, "\tvar ", ivar, " ", itm, "\n", NULL); goin = Copy(goin); Replaceall(goin, "$input", ln); Replaceall(goin, "$result", ivar); Printv(f_go_wrappers, goin, "\n", NULL); Delete(goin); Setattr(p, "emit:goinput", ivar); } bool c_struct_type; String *ct = cgoTypeForGoValue(p, pt, &c_struct_type); if (c_struct_type) { Printv(call, "*(*C.", ct, ")(unsafe.Pointer(&", ivar, "))", NULL); } else { Printv(call, "C.", ct, "(", ivar, ")", NULL); } Delete(ct); p = nextParm(p); } Printv(f_go_wrappers, call, ")", NULL); Delete(call); if (wt) { // Close the type conversion to the wrapper type. Printv(f_go_wrappers, ")", NULL); } if (SwigType_type(info->result) != T_VOID && !memcpy_ret) { // Close the type conversion of the return value. Printv(f_go_wrappers, ")", NULL); } Printv(f_go_wrappers, "\n", NULL); if (memcpy_ret) { Printv(f_go_wrappers, "\tswig_r = *(*", ret_type, ")(unsafe.Pointer(&swig_r_p))\n", NULL); } if (ret_type) { Delete(ret_type); } goargout(info->parms); if (SwigType_type(info->result) != T_VOID) { Swig_save("cgoGoWrapper", info->n, "type", "tmap:goout", NULL); Setattr(info->n, "type", info->result); String *goout = goTypemapLookup("goout", info->n, "swig_r"); if (goout == NULL) { Printv(f_go_wrappers, "\treturn swig_r\n", NULL); } else { String *tm = goType(info->n, info->result); Printv(f_go_wrappers, "\tvar swig_r_1 ", tm, "\n", NULL); goout = Copy(goout); Replaceall(goout, "$input", "swig_r"); Replaceall(goout, "$result", "swig_r_1"); Printv(f_go_wrappers, goout, "\n", NULL); Printv(f_go_wrappers, "\treturn swig_r_1\n", NULL); } Swig_restore(info->n); } Printv(f_go_wrappers, "}\n\n", NULL); DelWrapper(dummy); return SWIG_OK; } /* ---------------------------------------------------------------------- * cgoCommentWrapper() * * Write out a cgo function to call a C/C++ function. This code * will go into the cgo comment in the generated Go output file. * ---------------------------------------------------------------------- */ int cgoCommentWrapper(const cgoWrapperInfo *info) { String *ret_type; if (SwigType_type(info->result) == T_VOID) { ret_type = NewString("void"); } else { bool c_struct_type; ret_type = cgoTypeForGoValue(info->n, info->result, &c_struct_type); } Printv(f_cgo_comment, "extern ", ret_type, " ", info->wname, "(", NULL); Delete(ret_type); int parm_count = emit_num_arguments(info->parms); int required_count = emit_num_required(info->parms); int args = 0; if (parm_count > required_count) { Printv(f_cgo_comment, "intgo _swig_args", NULL); ++args; } if (info->base && info->receiver) { if (args > 0) { Printv(f_cgo_comment, ", ", NULL); } ++args; Printv(f_cgo_comment, "uintptr_t _swig_base", NULL); } Parm *p = info->parms; for (int i = 0; i < parm_count; ++i) { p = getParm(p); if (args > 0) { Printv(f_cgo_comment, ", ", NULL); } ++args; SwigType *pt = Getattr(p, "type"); String *ln = Getattr(p, "lname"); bool c_struct_type; String *ct = cgoTypeForGoValue(p, pt, &c_struct_type); Printv(f_cgo_comment, ct, " ", ln, NULL); Delete(ct); p = nextParm(p); } if (args == 0) { Printv(f_cgo_comment, "void", NULL); } Printv(f_cgo_comment, ");\n", NULL); return SWIG_OK; } /* ---------------------------------------------------------------------- * cgoGccWrapper() * * Write out code to the C/C++ wrapper file. This code will be * called by the code generated by cgoCommentWrapper. * ---------------------------------------------------------------------- */ int cgoGccWrapper(const cgoWrapperInfo *info) { Wrapper *f = NewWrapper(); Swig_save("cgoGccWrapper", info->n, "parms", NULL); ParmList *parms = info->parms; Parm *base_parm = NULL; if (info->base && !isStatic(info->n)) { SwigType *base_type = Copy(getClassType()); SwigType_add_pointer(base_type); base_parm = NewParm(base_type, NewString("arg1"), info->n); set_nextSibling(base_parm, parms); parms = base_parm; } emit_parameter_variables(parms, f); emit_attach_parmmaps(parms, f); int parm_count = emit_num_arguments(parms); int required_count = emit_num_required(parms); emit_return_variable(info->n, info->result, f); // Start the function definition. String *fnname = NewString(""); Printv(fnname, info->wname, "(", NULL); int args = 0; if (parm_count > required_count) { Printv(fnname, "intgo _swig_optargc", NULL); ++args; } Parm *p = parms; for (int i = 0; i < parm_count; ++i) { if (args > 0) { Printv(fnname, ", ", NULL); } ++args; p = getParm(p); SwigType *pt = Copy(Getattr(p, "type")); if (SwigType_isarray(pt)) { SwigType_del_array(pt); SwigType_add_pointer(pt); } String *pn = NewStringf("_swig_go_%d", i); String *ct = gcCTypeForGoValue(p, pt, pn); Printv(fnname, ct, NULL); Delete(ct); Delete(pn); Delete(pt); p = nextParm(p); } Printv(fnname, ")", NULL); if (SwigType_type(info->result) == T_VOID) { Printv(f->def, "void ", fnname, NULL); } else { String *ct = gcCTypeForGoValue(info->n, info->result, fnname); Printv(f->def, ct, NULL); Delete(ct); String *ln = NewString("_swig_go_result"); ct = gcCTypeForGoValue(info->n, info->result, ln); Wrapper_add_local(f, "_swig_go_result", ct); Delete(ct); Delete(ln); } Delete(fnname); Printv(f->def, " {\n", NULL); // Apply the in typemaps. p = parms; for (int i = 0; i < parm_count; ++i) { p = getParm(p); String *tm = Getattr(p, "tmap:in"); if (!tm) { Swig_warning(WARN_TYPEMAP_IN_UNDEF, input_file, line_number, "unable to use type %s as a function argument\n", SwigType_str(Getattr(p, "type"), 0)); } else { tm = Copy(tm); String *pn = NewStringf("_swig_go_%d", i); Replaceall(tm, "$input", pn); if (i < required_count) { Printv(f->code, "\t", tm, "\n", NULL); } else { Printf(f->code, "\tif (_swig_optargc > %d) {\n", i - required_count); Printv(f->code, "\t\t", tm, "\n", NULL); Printv(f->code, "\t}\n", NULL); } Delete(tm); Setattr(p, "emit:input", pn); } p = nextParm(p); } Printv(f->code, "\n", NULL); // Do the real work of the function. checkConstraints(parms, f); emitGoAction(info->n, info->base, parms, info->result, f); argout(parms, f); cleanupFunction(info->n, f, parms); if (SwigType_type(info->result) != T_VOID) { Printv(f->code, "\treturn _swig_go_result;\n", NULL); } Printv(f->code, "}\n", NULL); Wrapper_print(f, f_c_wrappers); Swig_restore(info->n); DelWrapper(f); if (base_parm) { Delete(base_parm); } return SWIG_OK; } /* ---------------------------------------------------------------------- * goFunctionWrapper() * * Write out a function wrapper in Go. When not implementing a * method, the actual code is all in C; here we just declare the C * function. When implementing a method, we have to call the C * function, because it will have a different name. If base is not * NULL, then we are being called to forward a virtual method to a * base class. * ---------------------------------------------------------------------- */ int goFunctionWrapper(Node *n, String *name, String *go_name, String *overname, String *wname, List *base, ParmList *parms, SwigType *result, bool is_static) { Wrapper *dummy = initGoTypemaps(parms); int parm_count = emit_num_arguments(parms); int required_count = emit_num_required(parms); String *receiver = class_receiver; if (receiver && is_static) { receiver = NULL; } String *nodetype = Getattr(n, "nodeType"); bool is_constructor = Cmp(nodetype, "constructor") == 0; bool is_destructor = Cmp(nodetype, "destructor") == 0; if (is_constructor || is_destructor) { assert(class_receiver); assert(!base); receiver = NULL; } Swig_save("cgoGoWrapper", n, "type", "tmap:goout", NULL); Setattr(n, "type", result); String *goout = goTypemapLookup("goout", n, "swig_r"); Swig_restore(n); bool add_to_interface = (interfaces && !is_constructor && !is_destructor && !is_static && !overname && checkFunctionVisibility(n, NULL)); bool needs_wrapper = (gccgo_flag || receiver || is_constructor || is_destructor || parm_count > required_count); bool has_goout = false; if (goout) { has_goout = true; } // See whether any of the function parameters are represented by // interface values. When calling the C++ code, we need to convert // back to a uintptr. Parm *p = parms; for (int i = 0; i < parm_count; ++i) { p = getParm(p); String *ty = Getattr(p, "type"); if (goGetattr(p, "tmap:goargout")) { has_goout = true; needs_wrapper = true; } else if (goTypeIsInterface(p, ty) || goGetattr(p, "tmap:goin")) { needs_wrapper = true; } if (paramNeedsEscape(p)) { needs_wrapper = true; } p = nextParm(p); } if (goTypeIsInterface(n, result) || goout != NULL) { needs_wrapper = true; } if (!gccgo_flag) { Printv(f_go_wrappers, "var ", wname, " unsafe.Pointer\n\n", NULL); } // If this is a method, first declare the C function we will call. // If we do not need a wrapper, then we will only be writing a // declaration. String *wrapper_name = NULL; if (needs_wrapper) { wrapper_name = buildGoWrapperName(name, overname); if (gccgo_flag) { Printv(f_go_wrappers, "//extern ", go_prefix, "_", wname, "\n", NULL); } bool arg = false; Printv(f_go_wrappers, "func ", wrapper_name, "(", NULL); if (parm_count > required_count) { Printv(f_go_wrappers, argName(&arg), " int", NULL); } Parm *p = getParm(parms); int i = 0; if (is_destructor) { if (parm_count > required_count) { Printv(f_go_wrappers, ", ", NULL); } Printv(f_go_wrappers, argName(&arg), " uintptr", NULL); ++i; p = nextParm(p); } else if (receiver && (base || !is_constructor)) { if (parm_count > required_count) { Printv(f_go_wrappers, ", ", NULL); } Printv(f_go_wrappers, argName(&arg), " ", receiver, NULL); if (!base) { ++i; p = nextParm(p); } } for (; i < parm_count; ++i) { p = getParm(p); if (i > 0 || (base && receiver) || parm_count > required_count) { Printv(f_go_wrappers, ", ", NULL); } String *tm = goWrapperType(p, Getattr(p, "type"), false); Printv(f_go_wrappers, argName(&arg), " ", tm, NULL); Delete(tm); p = nextParm(p); } Printv(f_go_wrappers, ")", NULL); if (is_constructor) { Printv(f_go_wrappers, " (", argName(&arg), " ", class_receiver, ")", NULL); } else { if (SwigType_type(result) != T_VOID) { String *tm = goWrapperType(n, result, true); Printv(f_go_wrappers, " (", argName(&arg), " ", tm, ")", NULL); Delete(tm); } } if (!gccgo_flag) { Printv(f_go_wrappers, " {\n", NULL); if (arg) { Printv(f_go_wrappers, "\t_swig_p := uintptr(unsafe.Pointer(&base))\n", NULL); } else { Printv(f_go_wrappers, "\tvar _swig_p uintptr\n", NULL); } Printv(f_go_wrappers, "\t_cgo_runtime_cgocall(", wname, ", _swig_p)\n", NULL); Printv(f_go_wrappers, "\treturn\n", NULL); Printv(f_go_wrappers, "}", NULL); } Printv(f_go_wrappers, "\n\n", NULL); } // Start defining the Go function. if (!needs_wrapper && gccgo_flag) { Printv(f_go_wrappers, "//extern ", go_prefix, "_", wname, "\n", NULL); } Printv(f_go_wrappers, "func ", NULL); p = parms; int pi = 0; // Add the receiver if this is a method. String *first = NULL; if (receiver) { Printv(f_go_wrappers, "(", NULL); if (base && receiver) { Printv(f_go_wrappers, "_swig_base", NULL); if (first == NULL) { first = NewString("_swig_base"); } } else { Printv(f_go_wrappers, Getattr(p, "lname"), NULL); if (first == NULL) { first = Copy(Getattr(p, "lname")); } p = nextParm(p); ++pi; } Printv(f_go_wrappers, " ", receiver, ") ", NULL); } Printv(f_go_wrappers, go_name, NULL); if (overname) { Printv(f_go_wrappers, overname, NULL); } Printv(f_go_wrappers, "(", NULL); // If we are doing methods, add this function to the interface. if (add_to_interface) { Printv(interfaces, "\t", go_name, "(", NULL); } // Write out the parameters to both the function definition and // the interface. String *parm_print = NewString(""); for (; pi < parm_count; ++pi) { p = getParm(p); if (pi == 0 && is_destructor) { String *cl = exportedName(class_name); Printv(parm_print, Getattr(p, "lname"), " ", cl, NULL); if (first == NULL) { first = Copy(Getattr(p, "lname")); } Delete(cl); } else { if (pi > (receiver && !base ? 1 : 0)) { Printv(parm_print, ", ", NULL); } if (pi >= required_count) { Printv(parm_print, "_swig_args ...interface{}", NULL); if (first == NULL) { first = NewString("_swig_args"); } break; } Printv(parm_print, Getattr(p, "lname"), " ", NULL); if (first == NULL) { first = Copy(Getattr(p, "lname")); } String *tm = goType(p, Getattr(p, "type")); Printv(parm_print, tm, NULL); Delete(tm); } p = nextParm(p); } Printv(parm_print, ")", NULL); // Write out the result type. if (is_constructor) { String *cl = exportedName(class_name); Printv(parm_print, " (_swig_ret ", cl, ")", NULL); if (first == NULL) { first = NewString("_swig_ret"); } Delete(cl); } else { if (SwigType_type(result) != T_VOID) { String *tm = goType(n, result); Printv(parm_print, " (_swig_ret ", tm, ")", NULL); if (first == NULL) { first = NewString("_swig_ret"); } Delete(tm); } } Printv(f_go_wrappers, parm_print, NULL); if (add_to_interface) { Printv(interfaces, parm_print, "\n", NULL); } // If this is a wrapper, we need to actually call the C function. if (needs_wrapper) { Printv(f_go_wrappers, " {\n", NULL); if (parm_count > required_count) { Parm *p = parms; int i; for (i = 0; i < required_count; ++i) { p = getParm(p); p = nextParm(p); } for (; i < parm_count; ++i) { p = getParm(p); String *tm = goType(p, Getattr(p, "type")); Printv(f_go_wrappers, "\tvar ", Getattr(p, "lname"), " ", tm, "\n", NULL); Printf(f_go_wrappers, "\tif len(_swig_args) > %d {\n", i - required_count); Printf(f_go_wrappers, "\t\t%s = _swig_args[%d].(%s)\n", Getattr(p, "lname"), i - required_count, tm); Printv(f_go_wrappers, "\t}\n", NULL); Delete(tm); p = nextParm(p); } } String *call = NewString(""); bool need_return_var = SwigType_type(result) != T_VOID && ((gccgo_flag && is_constructor) || has_goout); if (need_return_var) { Printv(f_go_wrappers, "\tvar swig_r ", NULL); if (is_constructor) { String *cl = exportedName(class_name); Printv(f_go_wrappers, cl, NULL); Delete(cl); } else { Printv(f_go_wrappers, goImType(n, result), NULL); } Printv(f_go_wrappers, "\n", NULL); } if (gccgo_flag) { if (has_goout || is_constructor) { Printv(call, "\tfunc() {\n", NULL); } Printv(call, "\tdefer SwigCgocallDone()\n", NULL); Printv(call, "\tSwigCgocall()\n", NULL); } Printv(call, "\t", NULL); if (SwigType_type(result) != T_VOID) { if (need_return_var) { Printv(call, "swig_r = ", NULL); } else { Printv(call, "return ", NULL); } } Printv(call, wrapper_name, "(", NULL); if (parm_count > required_count) { Printv(call, "len(_swig_args)", NULL); } if (base && receiver) { if (parm_count > required_count) { Printv(call, ", ", NULL); } Printv(call, "_swig_base", NULL); } Parm *p = parms; for (int i = 0; i < parm_count; ++i) { p = getParm(p); if (i > 0 || (base && receiver) || parm_count > required_count) { Printv(call, ", ", NULL); } SwigType *pt = Getattr(p, "type"); String *ln = Getattr(p, "lname"); String *goin = goGetattr(p, "tmap:goin"); if (goin == NULL) { Printv(call, ln, NULL); if ((i == 0 && is_destructor) || ((i > 0 || !receiver || base || is_constructor) && goTypeIsInterface(p, pt))) { Printv(call, ".Swigcptr()", NULL); } Setattr(p, "emit:goinput", ln); } else { String *ivar = NewString(""); Printf(ivar, "_swig_i_%d", i); String *itm = goImType(p, pt); Printv(f_go_wrappers, "\tvar ", ivar, " ", itm, "\n", NULL); goin = Copy(goin); Replaceall(goin, "$input", ln); Replaceall(goin, "$result", ivar); Printv(f_go_wrappers, goin, "\n", NULL); Delete(goin); Printv(call, ivar, NULL); Setattr(p, "emit:goinput", ivar); } // If the parameter has an argout or freearg typemap, make // sure that it escapes. if (paramNeedsEscape(p)) { Printv(f_go_wrappers, "\tif Swig_escape_always_false {\n", NULL); Printv(f_go_wrappers, "\t\tSwig_escape_val = ", Getattr(p, "emit:goinput"), "\n", NULL); Printv(f_go_wrappers, "\t}\n", NULL); } p = nextParm(p); } Printv(call, ")\n", NULL); if (gccgo_flag && (has_goout || is_constructor)) { Printv(call, "\t}()\n", NULL); } Printv(f_go_wrappers, call, NULL); Delete(call); goargout(parms); if (need_return_var) { if (goout == NULL) { Printv(f_go_wrappers, "\treturn swig_r\n", NULL); } else { String *tm = goType(n, result); Printv(f_go_wrappers, "\tvar swig_r_1 ", tm, "\n", NULL); Replaceall(goout, "$input", "swig_r"); Replaceall(goout, "$result", "swig_r_1"); Printv(f_go_wrappers, goout, "\n", NULL); Printv(f_go_wrappers, "\treturn swig_r_1\n", NULL); } } Printv(f_go_wrappers, "}\n", NULL); } else if (!gccgo_flag) { // We don't need a wrapper. If we're using gccgo, the function // declaration is all we need--it has a //extern comment to // GCC-compiled wrapper. If we're not using gccgo, we need to // call the GCC-compiled wrapper here. Printv(f_go_wrappers, " {\n", NULL); if (first == NULL) { Printv(f_go_wrappers, "\tvar _swig_p uintptr\n", NULL); } else { Printv(f_go_wrappers, "\t_swig_p := uintptr(unsafe.Pointer(&", first, "))\n", NULL); } Printv(f_go_wrappers, "\t_cgo_runtime_cgocall(", wname, ", _swig_p)\n", NULL); Printv(f_go_wrappers, "\treturn\n", NULL); Printv(f_go_wrappers, "}", NULL); } Printv(f_go_wrappers, "\n", NULL); Delete(wrapper_name); DelWrapper(dummy); return SWIG_OK; } /* ---------------------------------------------------------------------- * initGoTypemaps() * * Initialize the typenames for a Go wrapper, returning a dummy * Wrapper*. Also set consistent names for the parameters. * ---------------------------------------------------------------------- */ Wrapper* initGoTypemaps(ParmList *parms) { Wrapper *dummy = NewWrapper(); emit_attach_parmmaps(parms, dummy); Parm *p = parms; int parm_count = emit_num_arguments(parms); for (int i = 0; i < parm_count; ++i) { p = getParm(p); Swig_cparm_name(p, i); p = nextParm(p); } Swig_typemap_attach_parms("default", parms, dummy); Swig_typemap_attach_parms("gotype", parms, dummy); Swig_typemap_attach_parms("goin", parms, dummy); Swig_typemap_attach_parms("goargout", parms, dummy); Swig_typemap_attach_parms("imtype", parms, dummy); return dummy; } /* ---------------------------------------------------------------------- * argName() * * A helper for goFunctionWrapper to output the first argument name * as "base" and all others as "_". * ---------------------------------------------------------------------- */ const char *argName(bool *arg) { if (*arg) { return "_"; } *arg = true; return "base"; } /* ---------------------------------------------------------------------- * paramNeedsEscape() * * A helper for goFunctionWrapper that returns whether a parameter * needs to explicitly escape. This is true if the parameter has a * non-empty argout or freearg typemap, because in those cases the * Go argument might be or contain a pointer. We need to ensure * that that pointer does not point into the stack, which means that * it needs to escape. * ---------------------------------------------------------------------- */ bool paramNeedsEscape(Parm *p) { String *argout = Getattr(p, "tmap:argout"); String *freearg = Getattr(p, "tmap:freearg"); if ((!argout || Len(argout) == 0) && (!freearg || Len(freearg) == 0)) { return false; } // If a C++ type is represented as an interface type in Go, then // we don't care whether it escapes, because we know that the // pointer is a C++ pointer. if (goTypeIsInterface(p, Getattr(p, "type"))) { return false; } return true; } /* ---------------------------------------------------------------------- * gcFunctionWrapper() * * This is used for 6g/8g, not for gccgo. Write out the function * redirector that will be compiled with 6c/8c. This used to write * out a real function wrapper, but that has moved into Go code. * ---------------------------------------------------------------------- */ int gcFunctionWrapper(String *wname) { Wrapper *f = NewWrapper(); Printv(f->def, "#pragma dynimport ", wname, " ", wname, " \"\"\n", NULL); Printv(f->def, "#pragma cgo_import_static ", wname, "\n", NULL); Printv(f->def, "extern void ", wname, "(void*);\n", NULL); // Declare this as a uintptr, since it is not a pointer into the // Go heap. // \xc2\xb7 is UTF-8 for U+00B7 which is Unicode 'Middle Dot' Printv(f->def, "uintptr \xc2\xb7", wname, " = (uintptr)", wname, ";\n", NULL); Wrapper_print(f, f_gc_wrappers); DelWrapper(f); return SWIG_OK; } /* ---------------------------------------------------------------------- * gccFunctionWrapper() * * This is used for 6g/8g, not for gccgo. Write out the function * wrapper which will be compiled with gcc. If the base parameter * is not NULL, this is calls the base class method rather than * executing the SWIG wrapper code. * ---------------------------------------------------------------------- */ int gccFunctionWrapper(Node *n, List *base, String *wname, ParmList *parms, SwigType *result) { Wrapper *f = NewWrapper(); Swig_save("gccFunctionWrapper", n, "parms", NULL); Parm *base_parm = NULL; if (base && !isStatic(n)) { SwigType *base_type = Copy(getClassType()); SwigType_add_pointer(base_type); base_parm = NewParm(base_type, NewString("arg1"), n); set_nextSibling(base_parm, parms); parms = base_parm; } emit_parameter_variables(parms, f); emit_attach_parmmaps(parms, f); int parm_count = emit_num_arguments(parms); int required_count = emit_num_required(parms); bool needs_swigargs = false; emit_return_variable(n, result, f); // Start the function definition. Printv(f->def, "void\n", wname, "(void *swig_v)\n", "{\n", NULL); // The single function parameter is a pointer to the real argument // values. Define the structure that it points to. String *swigargs = NewString("\tstruct swigargs {\n"); if (parm_count > required_count) { needs_swigargs = true; Printv(swigargs, "\t\tintgo _swig_optargc;\n", NULL); } Parm *p = parms; for (int i = 0; i < parm_count; ++i) { p = getParm(p); String *ln = Getattr(p, "lname"); SwigType *pt = Getattr(p, "type"); String *ct = gcCTypeForGoValue(p, pt, ln); Printv(swigargs, "\t\t\t", ct, ";\n", NULL); needs_swigargs = true; Delete(ct); String *gn = NewStringf("_swig_go_%d", i); ct = gcCTypeForGoValue(p, pt, gn); Setattr(p, "emit:input", gn); Wrapper_add_local(f, gn, ct); Delete(ct); p = nextParm(p); } if (SwigType_type(result) != T_VOID) { Printv(swigargs, "\t\tlong : 0;\n", NULL); String *ln = NewString(Swig_cresult_name()); String *ct = gcCTypeForGoValue(n, result, ln); Delete(ln); Printv(swigargs, "\t\t", ct, ";\n", NULL); needs_swigargs = true; Delete(ct); ln = NewString("_swig_go_result"); ct = gcCTypeForGoValue(n, result, ln); Wrapper_add_local(f, "_swig_go_result", ct); Delete(ct); Delete(ln); } Printv(swigargs, "\t} SWIGSTRUCTPACKED *swig_a = (struct swigargs *) swig_v;\n", NULL); // Copy the input arguments out of the structure into the Go local // variables. p = parms; for (int i = 0; i < parm_count; ++i) { p = getParm(p); String *ln = Getattr(p, "lname"); String *gn = Getattr(p, "emit:input"); Printv(f->code, "\t", gn, " = swig_a->", ln, ";\n", NULL); p = nextParm(p); } // Apply the in typemaps. p = parms; for (int i = 0; i < parm_count; ++i) { p = getParm(p); String *tm = Getattr(p, "tmap:in"); if (!tm) { Swig_warning(WARN_TYPEMAP_IN_UNDEF, input_file, line_number, "Unable to use type %s as a function argument\n", SwigType_str(Getattr(p, "type"), 0)); } else { tm = Copy(tm); String *gn = Getattr(p, "emit:input"); Replaceall(tm, "$input", gn); if (i < required_count) { Printv(f->code, "\t", tm, "\n", NULL); } else { Printf(f->code, "\tif (swig_a->_swig_optargc > %d) {\n", i - required_count); Printv(f->code, "\t\t", tm, "\n", NULL); Printv(f->code, "\t}\n", NULL); } Delete(tm); } p = nextParm(p); } Printv(f->code, "\n", NULL); // Do the real work of the function. checkConstraints(parms, f); emitGoAction(n, base, parms, result, f); argout(parms, f); cleanupFunction(n, f, parms); if (needs_swigargs) { Printv(f->locals, swigargs, NULL); } Printv(f->code, "}\n", NULL); Wrapper_print(f, f_c_wrappers); Swig_restore(n); Delete(swigargs); DelWrapper(f); Delete(base_parm); return SWIG_OK; } /* ---------------------------------------------------------------------- * gccgoFunctionWrapper() * * This is used for gccgo, not 6g/8g. Write out the function * wrapper which will be compiled with gcc. If the base parameter * is not NULL, this is calls the base class method rather than * executing the SWIG wrapper code. * ---------------------------------------------------------------------- */ int gccgoFunctionWrapper(Node *n, List *base, String *wname, ParmList *parms, SwigType *result) { Wrapper *f = NewWrapper(); Swig_save("gccgoFunctionWrapper", n, "parms", NULL); Parm *base_parm = NULL; if (base && !isStatic(n)) { SwigType *base_type = Copy(getClassType()); SwigType_add_pointer(base_type); base_parm = NewParm(base_type, NewString("arg1"), n); set_nextSibling(base_parm, parms); parms = base_parm; } emit_parameter_variables(parms, f); emit_attach_parmmaps(parms, f); int parm_count = emit_num_arguments(parms); int required_count = emit_num_required(parms); emit_return_variable(n, result, f); // Start the function definition. String *fnname = NewString(""); Printv(fnname, "go_", wname, "(", NULL); if (parm_count > required_count) { Printv(fnname, "intgo _swig_optargc", NULL); } Parm *p = parms; for (int i = 0; i < parm_count; ++i) { p = getParm(p); SwigType *pt = Copy(Getattr(p, "type")); if (SwigType_isarray(pt)) { SwigType_del_array(pt); SwigType_add_pointer(pt); } String *pn = NewString("g"); Append(pn, Getattr(p, "lname")); String *ct = gccgoCTypeForGoValue(p, pt, pn); if (i > 0 || parm_count > required_count) { Printv(fnname, ", ", NULL); } Printv(fnname, ct, NULL); Delete(ct); Delete(pn); Delete(pt); p = nextParm(p); } Printv(fnname, ")", NULL); String *fndef = NewString(""); if (SwigType_type(result) == T_VOID) { Printv(fndef, "void ", fnname, NULL); } else { String *ct = gccgoCTypeForGoValue(n, result, fnname); Printv(fndef, ct, NULL); Delete(ct); } Printv(f->def, fndef, " __asm__(\"", go_prefix, "_", wname, "\");\n", NULL); Printv(f->def, fndef, " {\n", NULL); Delete(fnname); Delete(fndef); if (SwigType_type(result) != T_VOID) { String *ln = NewString("_swig_go_result"); String *ct = gccgoCTypeForGoValue(n, result, ln); Wrapper_add_local(f, "_swig_go_result", ct); Delete(ct); Delete(ln); } // Copy the parameters into the variables which hold their values, // applying appropriate transformations. p = parms; for (int i = 0; i < parm_count; ++i) { p = getParm(p); String *tm = Getattr(p, "tmap:in"); if (!tm) { Swig_warning(WARN_TYPEMAP_IN_UNDEF, input_file, line_number, "Unable to use type %s as a function argument\n", SwigType_str(Getattr(p, "type"), 0)); } else { String *ln = Getattr(p, "lname"); String *pn = NewString("g"); Append(pn, ln); tm = Copy(tm); Replaceall(tm, "$input", pn); Setattr(p, "emit:input", pn); if (i < required_count) { Printv(f->code, " ", tm, "\n", NULL); } else { Printf(f->code, " if (_swig_optargc > %d) {\n", i - required_count); Printv(f->code, " ", tm, "\n", NULL); Printv(f->code, " }\n", NULL); } Delete(tm); } p = nextParm(p); } Printv(f->code, "\n", NULL); // Do the real work of the function. checkConstraints(parms, f); emitGoAction(n, base, parms, result, f); argout(parms, f); cleanupFunction(n, f, parms); if (SwigType_type(result) != T_VOID) { Printv(f->code, " return _swig_go_result;\n", NULL); } Printv(f->code, "}\n", NULL); Wrapper_print(f, f_c_wrappers); Swig_restore(n); DelWrapper(f); Delete(base_parm); return SWIG_OK; } /* ----------------------------------------------------------------------- * checkConstraints() * * Check parameter constraints if any. This is used for the C/C++ * function. This assumes that each parameter has an "emit:input" * property with the name to use to refer to that parameter. * ----------------------------------------------------------------------- */ void checkConstraints(ParmList *parms, Wrapper *f) { Parm *p = parms; while (p) { String *tm = Getattr(p, "tmap:check"); if (!tm) { p = nextSibling(p); } else { tm = Copy(tm); Replaceall(tm, "$input", Getattr(p, "emit:input")); Printv(f->code, tm, "\n\n", NULL); Delete(tm); p = Getattr(p, "tmap:check:next"); } } } /* ----------------------------------------------------------------------- * emitGoAction() * * Emit the action of the function. This is used for the C/C++ function. * ----------------------------------------------------------------------- */ void emitGoAction(Node *n, List *base, ParmList *parms, SwigType *result, Wrapper *f) { if (!gccgo_flag && !cgo_flag && SwigType_type(result) != T_VOID) { Wrapper_add_local(f, "swig_stktop", "char *swig_stktop"); Printv(f->code, "\tswig_stktop = _swig_topofstack();\n", NULL); } String *actioncode; if (!base || isStatic(n)) { Swig_director_emit_dynamic_cast(n, f); actioncode = emit_action(n); } else { // Call the base class method. actioncode = NewString(""); String *current = NewString(""); if (!gccgo_flag && !cgo_flag) { Printv(current, "swig_a->", NULL); } Printv(current, Getattr(parms, "lname"), NULL); int vc = 0; for (Iterator bi = First(base); bi.item; bi = Next(bi)) { Printf(actioncode, " %s *swig_b%d = (%s *)%s;\n", bi.item, vc, bi.item, current); Delete(current); current = NewString(""); Printf(current, "swig_b%d", vc); ++vc; } String *code = Copy(Getattr(n, "wrap:action")); Replace(code, Getattr(parms, "lname"), current, DOH_REPLACE_ANY | DOH_REPLACE_ID); Delete(current); Printv(actioncode, code, "\n", NULL); } Swig_save("emitGoAction", n, "type", "tmap:out", NULL); Setattr(n, "type", result); String *tm = Swig_typemap_lookup_out("out", n, Swig_cresult_name(), f, actioncode); if (!tm) { Swig_warning(WARN_TYPEMAP_OUT_UNDEF, input_file, line_number, "Unable to use return type %s\n", SwigType_str(result, 0)); } else { Replaceall(tm, "$result", "_swig_go_result"); if (GetFlag(n, "feature:new")) { Replaceall(tm, "$owner", "1"); } else { Replaceall(tm, "$owner", "0"); } Printv(f->code, tm, "\n", NULL); Delete(tm); } if (!gccgo_flag && !cgo_flag && SwigType_type(result) != T_VOID) { // If the function called back into the Go code, the stack might // have been copied. We need to adjust swig_a accordingly here. // This is what cgo does. Printv(f->code, "\tswig_a = (struct swigargs*)((char*)swig_a + (_swig_topofstack() - swig_stktop));\n", NULL); Printv(f->code, "\tswig_a->", Swig_cresult_name(), " = ", "_swig_go_result;\n", NULL); } Swig_restore(n); } /* ----------------------------------------------------------------------- * argout() * * Handle argument output code if any. This is used for the C/C++ * function. This assumes that each parameter has an "emit:input" * property with the name to use to refer to that parameter. * ----------------------------------------------------------------------- */ void argout(ParmList *parms, Wrapper *f) { Parm *p = parms; while (p) { String *tm = Getattr(p, "tmap:argout"); if (!tm) { p = nextSibling(p); } else { tm = Copy(tm); Replaceall(tm, "$result", Swig_cresult_name()); Replaceall(tm, "$input", Getattr(p, "emit:input")); Printv(f->code, tm, "\n", NULL); Delete(tm); p = Getattr(p, "tmap:argout:next"); } } } /* ----------------------------------------------------------------------- * goargout() * * Handle Go argument output code if any. This is used for the Go * function. This assumes that each parameter has an "emit:goinput" * property with the name to use to refer to that parameter. * ----------------------------------------------------------------------- */ void goargout(ParmList *parms) { Parm *p = parms; while (p) { String *tm = Getattr(p, "tmap:goargout"); if (!tm) { p = nextSibling(p); } else { tm = Copy(tm); Replaceall(tm, "$result", "swig_r"); Replaceall(tm, "$input", Getattr(p, "emit:goinput")); Printv(f_go_wrappers, tm, "\n", NULL); Delete(tm); p = Getattr(p, "tmap:goargout:next"); } } // When using cgo, if we need to memcpy a parameter to pass it to // the C code, the compiler may think that the parameter is not // live during the function call. If the garbage collector runs // while the C/C++ function is running, the parameter may be // freed. Force the compiler to see the parameter as live across // the C/C++ function. if (cgo_flag) { int parm_count = emit_num_arguments(parms); p = parms; for (int i = 0; i < parm_count; ++i) { p = getParm(p); bool c_struct_type; Delete(cgoTypeForGoValue(p, Getattr(p, "type"), &c_struct_type)); if (c_struct_type) { Printv(f_go_wrappers, "\tif Swig_escape_always_false {\n", NULL); Printv(f_go_wrappers, "\t\tSwig_escape_val = ", Getattr(p, "emit:goinput"), "\n", NULL); Printv(f_go_wrappers, "\t}\n", NULL); } p = nextParm(p); } } } /* ----------------------------------------------------------------------- * freearg() * * Handle argument cleanup code if any. This is used for the C/C++ * function. This assumes that each parameter has an "emit:input" * property with the name to use to refer to that parameter. * ----------------------------------------------------------------------- */ String *freearg(ParmList *parms) { String *ret = NewString(""); Parm *p = parms; while (p) { String *tm = Getattr(p, "tmap:freearg"); if (!tm) { p = nextSibling(p); } else { tm = Copy(tm); Replaceall(tm, "$input", Getattr(p, "emit:input")); Printv(ret, tm, "\n", NULL); Delete(tm); p = Getattr(p, "tmap:freearg:next"); } } return ret; } /* ----------------------------------------------------------------------- * cleanupFunction() * * Final function cleanup code. * ----------------------------------------------------------------------- */ void cleanupFunction(Node *n, Wrapper *f, ParmList *parms) { String *cleanup = freearg(parms); Printv(f->code, cleanup, NULL); if (GetFlag(n, "feature:new")) { String *tm = Swig_typemap_lookup("newfree", n, Swig_cresult_name(), 0); if (tm) { Replaceall(tm, "$source", Swig_cresult_name()); Printv(f->code, tm, "\n", NULL); Delete(tm); } } Replaceall(f->code, "$cleanup", cleanup); Delete(cleanup); /* See if there is any return cleanup code */ String *tm; if ((tm = Swig_typemap_lookup("ret", n, Swig_cresult_name(), 0))) { Replaceall(tm, "$source", Swig_cresult_name()); Printf(f->code, "%s\n", tm); Delete(tm); } Replaceall(f->code, "$symname", Getattr(n, "sym:name")); } /* ----------------------------------------------------------------------- * variableHandler() * * This exists just to set the making_variable_wrappers flag. * ----------------------------------------------------------------------- */ virtual int variableHandler(Node *n) { assert(!making_variable_wrappers); making_variable_wrappers = true; int r = Language::variableHandler(n); making_variable_wrappers = false; return r; } /* ----------------------------------------------------------------------- * constantWrapper() * * Product a const declaration. * ------------------------------------------------------------------------ */ virtual int constantWrapper(Node *n) { SwigType *type = Getattr(n, "type"); if (!SwigType_issimple(type) && SwigType_type(type) != T_STRING) { return goComplexConstant(n, type); } if (Swig_storage_isstatic(n)) { return goComplexConstant(n, type); } String *go_name = buildGoName(Getattr(n, "sym:name"), false, false); String *tm = goType(n, type); String *value = Getattr(n, "value"); String *copy = NULL; if (SwigType_type(type) == T_BOOL) { if (Cmp(value, "true") != 0 && Cmp(value, "false") != 0) { return goComplexConstant(n, type); } } else if (SwigType_type(type) == T_STRING || SwigType_type(type) == T_CHAR) { // Backslash sequences are somewhat different in Go and C/C++. if (Strchr(value, '\\') != 0) { return goComplexConstant(n, type); } } else { // Accept a 0x prefix, and strip combinations of u and l // suffixes. Otherwise accept digits, decimal point, and // exponentiation. Treat anything else as too complicated to // handle as a Go constant. char *p = Char(value); int len = (int)strlen(p); bool need_copy = false; while (len > 0) { char c = p[len - 1]; if (c != 'l' && c != 'L' && c != 'u' && c != 'U') { break; } --len; need_copy = true; } bool is_hex = false; int i = 0; if (p[0] == '0' && (p[1] == 'x' || p[1] == 'X')) { i = 2; is_hex = true; } for (; i < len; ++i) { switch (p[i]) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': break; case 'a': case 'b': case 'c': case 'd': case 'f': case 'A': case 'B': case 'C': case 'D': case 'F': if (!is_hex) { return goComplexConstant(n, type); } break; case '.': case 'e': case 'E': case '+': case '-': break; default: return goComplexConstant(n, type); } } if (need_copy) { copy = Copy(value); Replaceall(copy, p + len, ""); value = copy; } } if (!checkNameConflict(go_name, n, NULL)) { Delete(tm); Delete(go_name); Delete(copy); return SWIG_NOWRAP; } Printv(f_go_wrappers, "const ", go_name, " ", tm, " = ", NULL); if (SwigType_type(type) == T_STRING) { Printv(f_go_wrappers, "\"", value, "\"", NULL); } else if (SwigType_type(type) == T_CHAR) { Printv(f_go_wrappers, "'", value, "'", NULL); } else { Printv(f_go_wrappers, value, NULL); } Printv(f_go_wrappers, "\n", NULL); Delete(tm); Delete(go_name); Delete(copy); return SWIG_OK; } /* ---------------------------------------------------------------------- * enumDeclaration() * * A C++ enum type turns into a Named go int type. * ---------------------------------------------------------------------- */ virtual int enumDeclaration(Node *n) { if (getCurrentClass() && (cplus_mode != PUBLIC)) return SWIG_NOWRAP; String *name = goEnumName(n); if (Strcmp(name, "int") != 0) { if (!ImportMode || !imported_package) { if (!checkNameConflict(name, n, NULL)) { Delete(name); return SWIG_NOWRAP; } Printv(f_go_wrappers, "type ", name, " int\n", NULL); } else { String *nw = NewString(""); Printv(nw, getModuleName(imported_package), ".", name, NULL); Setattr(n, "go:enumname", nw); } } Delete(name); return Language::enumDeclaration(n); } /* ----------------------------------------------------------------------- * enumvalueDeclaration() * * Declare a single value of an enum type. We fetch the value by * calling a C/C++ function. * ------------------------------------------------------------------------ */ virtual int enumvalueDeclaration(Node *n) { if (!is_public(n)) { return SWIG_OK; } Swig_require("enumvalueDeclaration", n, "*sym:name", NIL); Node *parent = parentNode(n); if (Getattr(parent, "unnamed")) { Setattr(n, "type", NewString("int")); } else { Setattr(n, "type", Getattr(parent, "enumtype")); } if (GetFlag(parent, "scopedenum")) { String *symname = Getattr(n, "sym:name"); symname = Swig_name_member(0, Getattr(parent, "sym:name"), symname); Setattr(n, "sym:name", symname); Delete(symname); } int ret = goComplexConstant(n, Getattr(n, "type")); Swig_restore(n); return ret; } /* ----------------------------------------------------------------------- * goComplexConstant() * * Handle a const declaration for something which is not a Go constant. * ------------------------------------------------------------------------ */ int goComplexConstant(Node *n, SwigType *type) { String *symname = Getattr(n, "sym:name"); if (!symname) { symname = Getattr(n, "name"); } String *varname = buildGoName(symname, true, false); if (!checkNameConflict(varname, n, NULL)) { Delete(varname); return SWIG_NOWRAP; } String *rawval = Getattr(n, "rawval"); if (rawval && Len(rawval)) { // Based on Swig_VargetToFunction String *nname = NewStringf("(%s)", rawval); String *call; if (SwigType_isclass(type)) { call = NewStringf("%s", nname); } else { call = SwigType_lcaststr(type, nname); } String *cres = Swig_cresult(type, Swig_cresult_name(), call); Setattr(n, "wrap:action", cres); Delete(nname); Delete(call); Delete(cres); } else { String *get = NewString(""); Printv(get, Swig_cresult_name(), " = ", NULL); char quote; if (Getattr(n, "wrappedasconstant")) { quote = '\0'; } else if (SwigType_type(type) == T_CHAR) { quote = '\''; } else if (SwigType_type(type) == T_STRING) { Printv(get, "(char *)", NULL); quote = '"'; } else { quote = '\0'; } if (quote != '\0') { Printf(get, "%c", quote); } Printv(get, Getattr(n, "value"), NULL); if (quote != '\0') { Printf(get, "%c", quote); } Printv(get, ";\n", NULL); Setattr(n, "wrap:action", get); Delete(get); } String *sname = Copy(symname); if (class_name) { Append(sname, "_"); Append(sname, class_name); } String *go_name = NewString("_swig_get"); if (class_name) { Append(go_name, class_name); Append(go_name, "_"); } Append(go_name, sname); String *wname = Swig_name_wrapper(sname); Append(wname, unique_id); Setattr(n, "wrap:name", wname); int r = makeWrappers(n, sname, go_name, NULL, wname, NULL, NULL, type, true); if (r != SWIG_OK) { return r; } String *t = goType(n, type); Printv(f_go_wrappers, "var ", varname, " ", t, " = ", go_name, "()\n", NULL); Delete(varname); Delete(t); Delete(go_name); Delete(sname); return SWIG_OK; } /* ------------------------------------------------------------ * classHandler() * * For a C++ class, in Go we generate both a struct and an * interface. The interface will declare all the class public * methods. We will define all the methods on the struct, so that * the struct meets the interface. We then expect users of the * class to use the interface. * ------------------------------------------------------------ */ virtual int classHandler(Node *n) { class_node = n; List *baselist = Getattr(n, "bases"); bool has_base_classes = baselist && Len(baselist) > 0; String *name = Getattr(n, "sym:name"); String *go_name = exportedName(name); if (!checkNameConflict(go_name, n, NULL)) { Delete(go_name); SetFlag(n, "go:conflict"); return SWIG_NOWRAP; } String *go_type_name = goCPointerType(Getattr(n, "classtypeobj"), true); class_name = name; class_receiver = go_type_name; class_methods = NewHash(); int isdir = GetFlag(n, "feature:director"); int isnodir = GetFlag(n, "feature:nodirector"); bool is_director = isdir && !isnodir; Printv(f_go_wrappers, "type ", go_type_name, " uintptr\n\n", NULL); // A method to return the pointer to the C++ class. This is used // by generated code to convert between the interface and the C++ // value. Printv(f_go_wrappers, "func (p ", go_type_name, ") Swigcptr() uintptr {\n", NULL); Printv(f_go_wrappers, "\treturn (uintptr)(p)\n", NULL); Printv(f_go_wrappers, "}\n\n", NULL); // A method used as a marker for the class, to avoid invalid // interface conversions when using multiple inheritance. Printv(f_go_wrappers, "func (p ", go_type_name, ") SwigIs", go_name, "() {\n", NULL); Printv(f_go_wrappers, "}\n\n", NULL); if (is_director) { // Return the interface passed to the NewDirector function. Printv(f_go_wrappers, "func (p ", go_type_name, ") DirectorInterface() interface{} {\n", NULL); Printv(f_go_wrappers, "\treturn nil\n", NULL); Printv(f_go_wrappers, "}\n\n", NULL); } // We have seen a definition for this type. Setattr(defined_types, go_name, go_name); Setattr(defined_types, go_type_name, go_type_name); interfaces = NewString(""); int r = Language::classHandler(n); if (r != SWIG_OK) { return r; } if (has_base_classes) { // For each method defined in a base class but not defined in // this class, we need to define the method in this class. We // can't use anonymous field inheritance because it works // differently in Go and in C++. Hash *local = NewHash(); for (Node *ni = Getattr(n, "firstChild"); ni; ni = nextSibling(ni)) { if (!is_public(ni)) { continue; } String *type = Getattr(ni, "nodeType"); if (Cmp(type, "constructor") == 0 || Cmp(type, "destructor") == 0) { continue; } String *cname = Getattr(ni, "sym:name"); if (!cname) { cname = Getattr(ni, "name"); } if (cname) { Setattr(local, cname, NewString("")); } } for (Iterator b = First(baselist); b.item; b = Next(b)) { List *bases = NewList(); Append(bases, Getattr(b.item, "classtype")); int r = addBase(n, b.item, bases, local); if (r != SWIG_OK) { return r; } Delete(bases); } Delete(local); Hash *parents = NewHash(); addFirstBaseInterface(n, parents, baselist); int r = addExtraBaseInterfaces(n, parents, baselist); Delete(parents); if (r != SWIG_OK) { return r; } } Printv(f_go_wrappers, "type ", go_name, " interface {\n", NULL); Printv(f_go_wrappers, "\tSwigcptr() uintptr\n", NULL); Printv(f_go_wrappers, "\tSwigIs", go_name, "()\n", NULL); if (is_director) { Printv(f_go_wrappers, "\tDirectorInterface() interface{}\n", NULL); } Append(f_go_wrappers, interfaces); Printv(f_go_wrappers, "}\n\n", NULL); Delete(interfaces); interfaces = NULL; class_name = NULL; class_receiver = NULL; class_node = NULL; Delete(class_methods); class_methods = NULL; Delete(go_type_name); return SWIG_OK; } /* ------------------------------------------------------------ * addBase() * * Implement methods and members defined in a parent class for a * child class. * ------------------------------------------------------------ */ int addBase(Node *n, Node *base, List *bases, Hash *local) { if (GetFlag(base, "feature:ignore")) { return SWIG_OK; } for (Node *ni = Getattr(base, "firstChild"); ni; ni = nextSibling(ni)) { if (GetFlag(ni, "feature:ignore")) { continue; } if (!is_public(ni)) { continue; } String *type = Getattr(ni, "nodeType"); if (Strcmp(type, "constructor") == 0 || Strcmp(type, "destructor") == 0 || Strcmp(type, "enum") == 0 || Strcmp(type, "using") == 0 || Strcmp(type, "classforward") == 0 || Strcmp(type, "template") == 0) { continue; } String *storage = Getattr(ni, "storage"); if (storage && (Strcmp(storage, "typedef") == 0 || Strcmp(storage, "friend") == 0)) { continue; } String *mname = Getattr(ni, "sym:name"); if (!mname) { continue; } String *lname = Getattr(ni, "name"); if (Getattr(class_methods, lname)) { continue; } if (Getattr(local, lname)) { continue; } Setattr(local, lname, NewString("")); String *ty = NewString(Getattr(ni, "type")); SwigType_push(ty, Getattr(ni, "decl")); String *fullty = SwigType_typedef_resolve_all(ty); bool is_function = SwigType_isfunction(fullty) ? true : false; Delete(ty); Delete(fullty); if (is_function) { int r = goBaseMethod(n, bases, ni); if (r != SWIG_OK) { return r; } if (Getattr(ni, "sym:overloaded")) { for (Node *on = Getattr(ni, "sym:nextSibling"); on; on = Getattr(on, "sym:nextSibling")) { r = goBaseMethod(n, bases, on); if (r != SWIG_OK) { return r; } } String *receiver = class_receiver; bool is_static = isStatic(ni); if (is_static) { receiver = NULL; } String *go_name = buildGoName(Getattr(ni, "sym:name"), is_static, false); r = makeDispatchFunction(ni, go_name, receiver, is_static, NULL, false); Delete(go_name); if (r != SWIG_OK) { return r; } } } else { int r = goBaseVariable(n, bases, ni); if (r != SWIG_OK) { return r; } } } List *baselist = Getattr(base, "bases"); if (baselist && Len(baselist) > 0) { for (Iterator b = First(baselist); b.item; b = Next(b)) { List *nb = Copy(bases); Append(nb, Getattr(b.item, "classtype")); int r = addBase(n, b.item, nb, local); Delete(nb); if (r != SWIG_OK) { return r; } } } return SWIG_OK; } /* ------------------------------------------------------------ * goBaseMethod() * * Implement a method defined in a parent class for a child class. * ------------------------------------------------------------ */ int goBaseMethod(Node *method_class, List *bases, Node *method) { String *symname = Getattr(method, "sym:name"); if (!validIdentifier(symname)) { return SWIG_OK; } String *name = NewString(""); Printv(name, Getattr(method_class, "sym:name"), "_", symname, NULL); bool is_static = isStatic(method); String *go_name = buildGoName(name, is_static, false); String *overname = NULL; if (Getattr(method, "sym:overloaded")) { overname = Getattr(method, "sym:overname"); } String *wname = Swig_name_wrapper(name); if (overname) { Append(wname, overname); } Append(wname, unique_id); String *result = NewString(Getattr(method, "type")); SwigType_push(result, Getattr(method, "decl")); if (SwigType_isqualifier(result)) { Delete(SwigType_pop(result)); } Delete(SwigType_pop_function(result)); // If the base method is imported, wrap:action may not be set. Swig_save("goBaseMethod", method, "wrap:name", "wrap:action", "parms", NULL); Setattr(method, "wrap:name", wname); if (!Getattr(method, "wrap:action")) { if (!is_static) { Swig_MethodToFunction(method, getNSpace(), getClassType(), (Getattr(method, "template") ? SmartPointer : Extend | SmartPointer), NULL, false); // Remove any self parameter that was just added. ParmList *parms = Getattr(method, "parms"); if (parms && Getattr(parms, "self")) { parms = CopyParmList(nextSibling(parms)); Setattr(method, "parms", parms); } } else { String *call = Swig_cfunction_call(Getattr(method, "name"), Getattr(method, "parms")); Setattr(method, "wrap:action", Swig_cresult(Getattr(method, "type"), Swig_cresult_name(), call)); } } int r = makeWrappers(method, name, go_name, overname, wname, bases, Getattr(method, "parms"), result, is_static); Swig_restore(method); Delete(result); Delete(go_name); Delete(name); return r; } /* ------------------------------------------------------------ * goBaseVariable() * * Add accessors for a member variable defined in a parent class for * a child class. * ------------------------------------------------------------ */ int goBaseVariable(Node *var_class, List *bases, Node *var) { if (isStatic(var)) { return SWIG_OK; } String *var_name = buildGoName(Getattr(var, "sym:name"), false, false); Swig_save("goBaseVariable", var, "type", "wrap:action", NULL); // For a pointer type we apparently have to wrap in the decl. SwigType *var_type = NewString(Getattr(var, "type")); SwigType_push(var_type, Getattr(var, "decl")); Setattr(var, "type", var_type); SwigType *vt = Copy(var_type); int flags = Extend | SmartPointer | use_naturalvar_mode(var); if (isNonVirtualProtectedAccess(var)) { flags |= CWRAP_ALL_PROTECTED_ACCESS; } // Copied from Swig_wrapped_member_var_type. if (SwigType_isclass(vt)) { if (flags & CWRAP_NATURAL_VAR) { if (CPlusPlus) { if (!SwigType_isconst(vt)) { SwigType_add_qualifier(vt, "const"); } SwigType_add_reference(vt); } } else { SwigType_add_pointer(vt); } } String *mname = Swig_name_member(getNSpace(), Getattr(var_class, "sym:name"), var_name); if (is_assignable(var)) { for (Iterator ki = First(var); ki.key; ki = Next(ki)) { if (Strncmp(ki.key, "tmap:", 5) == 0) { Delattr(var, ki.key); } } Swig_save("goBaseVariableSet", var, "name", "sym:name", "type", NULL); String *mname_set = NewString("Set"); Append(mname_set, mname); String *go_name = NewString("Set"); Append(go_name, var_name); Swig_MembersetToFunction(var, class_name, flags); String *wname = Swig_name_wrapper(mname_set); Append(wname, unique_id); ParmList *parms = NewParm(vt, var_name, var); String *result = NewString("void"); int r = makeWrappers(var, mname_set, go_name, NULL, wname, bases, parms, result, false); if (r != SWIG_OK) { return r; } Delete(wname); Delete(parms); Delete(result); Delete(go_name); Delete(mname_set); Swig_restore(var); for (Iterator ki = First(var); ki.key; ki = Next(ki)) { if (Strncmp(ki.key, "tmap:", 5) == 0) { Delattr(var, ki.key); } } } Swig_MembergetToFunction(var, class_name, flags); String *mname_get = NewString("Get"); Append(mname_get, mname); String *go_name = NewString("Get"); Append(go_name, var_name); String *wname = Swig_name_wrapper(mname_get); Append(wname, unique_id); int r = makeWrappers(var, mname_get, go_name, NULL, wname, bases, NULL, vt, false); if (r != SWIG_OK) { return r; } Delete(wname); Delete(mname_get); Delete(go_name); Delete(mname); Delete(var_name); Delete(var_type); Delete(vt); Swig_restore(var); return SWIG_OK; } /* ------------------------------------------------------------ * addFirstBaseInterface() * * When a C++ class uses multiple inheritance, we can use the C++ * pointer for the first base class but not for any subsequent base * classes. However, the Go interface will match the interface for * all the base classes. To avoid accidentally treating a class as * a pointer to a base class other than the first one, we use an * isClassname method. This function adds those methods as * required. * * For convenience when using multiple inheritance, we also add * functions to retrieve the base class pointers. * ------------------------------------------------------------ */ void addFirstBaseInterface(Node *n, Hash *parents, List *bases) { if (!bases || Len(bases) == 0) { return; } Iterator b = First(bases); if (!GetFlag(b.item, "feature:ignore")) { String *go_name = buildGoName(Getattr(n, "sym:name"), false, false); String *go_type_name = goCPointerType(Getattr(n, "classtypeobj"), true); String *go_base_name = exportedName(Getattr(b.item, "sym:name")); String *go_base_type = goType(n, Getattr(b.item, "classtypeobj")); String *go_base_type_name = goCPointerType(Getattr(b.item, "classtypeobj"), true); Printv(f_go_wrappers, "func (p ", go_type_name, ") SwigIs", go_base_name, "() {\n", NULL); Printv(f_go_wrappers, "}\n\n", NULL); Printv(interfaces, "\tSwigIs", go_base_name, "()\n", NULL); Printv(f_go_wrappers, "func (p ", go_type_name, ") SwigGet", go_base_name, "() ", go_base_type, " {\n", NULL); Printv(f_go_wrappers, "\treturn ", go_base_type_name, "(p.Swigcptr())\n", NULL); Printv(f_go_wrappers, "}\n\n", NULL); Printv(interfaces, "\tSwigGet", go_base_name, "() ", go_base_type, "\n", NULL); Setattr(parents, go_base_name, NewString("")); Delete(go_name); Delete(go_type_name); Delete(go_base_type); Delete(go_base_type_name); } addFirstBaseInterface(n, parents, Getattr(b.item, "bases")); } /* ------------------------------------------------------------ * addExtraBaseInterfaces() * * Add functions to retrieve the base class pointers for all base * classes other than the first. * ------------------------------------------------------------ */ int addExtraBaseInterfaces(Node *n, Hash *parents, List *bases) { Iterator b = First(bases); Node *fb = b.item; for (b = Next(b); b.item; b = Next(b)) { if (GetFlag(b.item, "feature:ignore")) { continue; } String *go_base_name = exportedName(Getattr(b.item, "sym:name")); Swig_save("addExtraBaseInterface", n, "wrap:action", "wrap:name", "wrap:parms", NULL); SwigType *type = Copy(Getattr(n, "classtypeobj")); SwigType_add_pointer(type); Parm *parm = NewParm(type, "self", n); Setattr(n, "wrap:parms", parm); String *pn = Swig_cparm_name(parm, 0); String *action = NewString(""); Printv(action, Swig_cresult_name(), " = (", Getattr(b.item, "classtype"), "*)", pn, ";", NULL); Delete(pn); Setattr(n, "wrap:action", action); String *name = Copy(class_name); Append(name, "_SwigGet"); Append(name, go_base_name); String *go_name = NewString("SwigGet"); String *c1 = exportedName(go_base_name); Append(go_name, c1); Delete(c1); String *wname = Swig_name_wrapper(name); Append(wname, unique_id); Setattr(n, "wrap:name", wname); SwigType *result = Copy(Getattr(b.item, "classtypeobj")); SwigType_add_pointer(result); int r = makeWrappers(n, name, go_name, NULL, wname, NULL, parm, result, false); if (r != SWIG_OK) { return r; } Swig_restore(n); Setattr(parents, go_base_name, NewString("")); Delete(go_name); Delete(type); Delete(parm); Delete(action); Delete(result); String *ns = NewString(""); addParentExtraBaseInterfaces(n, parents, b.item, false, ns); Delete(ns); } if (!GetFlag(fb, "feature:ignore")) { String *ns = NewString(""); addParentExtraBaseInterfaces(n, parents, fb, true, ns); Delete(ns); } return SWIG_OK; } /* ------------------------------------------------------------ * addParentExtraBaseInterfaces() * * Add functions to retrieve the base class pointers for all base * classes of parents other than the first base class at each level. * ------------------------------------------------------------ */ void addParentExtraBaseInterfaces(Node *n, Hash *parents, Node *base, bool is_base_first, String *sofar) { List *baselist = Getattr(base, "bases"); if (!baselist || Len(baselist) == 0) { return; } String *go_this_base_name = exportedName(Getattr(base, "sym:name")); String *sf = NewString(""); Printv(sf, sofar, ".SwigGet", go_this_base_name, "()", NULL); Iterator b = First(baselist); if (is_base_first) { if (!b.item) { return; } if (!GetFlag(b.item, "feature:ignore")) { addParentExtraBaseInterfaces(n, parents, b.item, true, sf); } b = Next(b); } String *go_name = buildGoName(Getattr(n, "sym:name"), false, false); String *go_type_name = goCPointerType(Getattr(n, "classtypeobj"), true); for (; b.item; b = Next(b)) { if (GetFlag(b.item, "feature:ignore")) { continue; } String *go_base_name = exportedName(Getattr(b.item, "sym:name")); if (!Getattr(parents, go_base_name)) { Printv(f_go_wrappers, "func (p ", go_type_name, ") SwigGet", go_base_name, "() ", go_base_name, " {\n", NULL); Printv(f_go_wrappers, "\treturn p", sf, ".SwigGet", go_base_name, "()\n", NULL); Printv(f_go_wrappers, "}\n\n", NULL); Printv(interfaces, "\tSwigGet", go_base_name, "() ", go_base_name, "\n", NULL); addParentExtraBaseInterfaces(n, parents, b.item, false, sf); Setattr(parents, go_base_name, NewString("")); } } Delete(go_name); Delete(go_type_name); Delete(go_this_base_name); Delete(sf); } /* ------------------------------------------------------------ * classDirectorInit * * Add support for a director class. * * Virtual inheritance is different in Go and C++. We implement * director classes by defining a new function in Go, * NewDirectorClassname, which takes a empty interface value and * creates an instance of a new child class. The new child class * refers all methods back to Go. The Go code checks whether the * value passed to NewDirectorClassname implements that method; if * it does, it calls it, otherwise it calls back into C++. * ------------------------------------------------------------ */ int classDirectorInit(Node *n) { // Because we use a different function to handle inheritance in // Go, ordinary creations of the object should not create a // director object. Delete(director_ctor_code); director_ctor_code = NewString("$nondirector_new"); class_node = n; String *name = Getattr(n, "sym:name"); assert(!class_name); class_name = name; String *go_name = exportedName(name); String *go_type_name = goCPointerType(Getattr(n, "classtypeobj"), true); assert(!class_receiver); class_receiver = go_type_name; String *director_struct_name = NewString("_swig_Director"); Append(director_struct_name, go_name); String *cxx_director_name = NewString("SwigDirector_"); Append(cxx_director_name, name); // The Go type of the director class. Printv(f_go_wrappers, "type ", director_struct_name, " struct {\n", NULL); Printv(f_go_wrappers, "\t", go_type_name, "\n", NULL); Printv(f_go_wrappers, "\tv interface{}\n", NULL); Printv(f_go_wrappers, "}\n\n", NULL); Printv(f_go_wrappers, "func (p *", director_struct_name, ") Swigcptr() uintptr {\n", NULL); Printv(f_go_wrappers, "\treturn p.", go_type_name, ".Swigcptr()\n", NULL); Printv(f_go_wrappers, "}\n\n", NULL); Printv(f_go_wrappers, "func (p *", director_struct_name, ") SwigIs", go_name, "() {\n", NULL); Printv(f_go_wrappers, "}\n\n", NULL); Printv(f_go_wrappers, "func (p *", director_struct_name, ") DirectorInterface() interface{} {\n", NULL); Printv(f_go_wrappers, "\treturn p.v\n", NULL); Printv(f_go_wrappers, "}\n\n", NULL); // Start defining the director class. Printv(f_c_directors_h, "class ", cxx_director_name, " : public ", Getattr(n, "classtype"), "\n", NULL); Printv(f_c_directors_h, "{\n", NULL); Printv(f_c_directors_h, " public:\n", NULL); Delete(director_struct_name); Delete(cxx_director_name); class_methods = NewHash(); return SWIG_OK; } /* ------------------------------------------------------------ * classDirectorConstructor * * Emit a constructor for a director class. * ------------------------------------------------------------ */ int classDirectorConstructor(Node *n) { bool is_ignored = GetFlag(n, "feature:ignore") ? true : false; String *name = Getattr(n, "sym:name"); if (!name) { assert(is_ignored); name = Getattr(n, "name"); } String *overname = NULL; if (Getattr(n, "sym:overloaded")) { overname = Getattr(n, "sym:overname"); } String *go_name = exportedName(name); ParmList *parms = Getattr(n, "parms"); Setattr(n, "wrap:parms", parms); String *cn = exportedName(Getattr(parentNode(n), "sym:name")); String *go_type_name = goCPointerType(Getattr(parentNode(n), "classtypeobj"), true); String *director_struct_name = NewString("_swig_Director"); Append(director_struct_name, cn); String *fn_name = NewString("_swig_NewDirector"); Append(fn_name, cn); Append(fn_name, go_name); if (!overname && !is_ignored) { if (!checkNameConflict(fn_name, n, NULL)) { return SWIG_NOWRAP; } } String *fn_with_over_name = Copy(fn_name); if (overname) { Append(fn_with_over_name, overname); } String *wname = Swig_name_wrapper(fn_name); if (overname) { Append(wname, overname); } Append(wname, unique_id); Setattr(n, "wrap:name", wname); bool is_static = isStatic(n); Wrapper *dummy = NewWrapper(); emit_attach_parmmaps(parms, dummy); DelWrapper(dummy); Swig_typemap_attach_parms("gotype", parms, NULL); Swig_typemap_attach_parms("goin", parms, NULL); Swig_typemap_attach_parms("goargout", parms, NULL); Swig_typemap_attach_parms("imtype", parms, NULL); int parm_count = emit_num_arguments(parms); String *func_name = NewString("NewDirector"); Append(func_name, go_name); String *func_with_over_name = Copy(func_name); if (overname) { Append(func_with_over_name, overname); } SwigType *first_type = NewString("int"); Parm *first_parm = NewParm(first_type, "swig_p", n); set_nextSibling(first_parm, parms); Setattr(first_parm, "lname", "p"); Parm *p = parms; for (int i = 0; i < parm_count; ++i) { p = getParm(p); Swig_cparm_name(p, i); p = nextParm(p); } if (!is_ignored) { if (cgo_flag) { Printv(f_cgo_comment, "extern uintptr_t ", wname, "(int", NULL); p = parms; for (int i = 0; i < parm_count; ++i) { p = getParm(p); bool c_struct_type; String *ct = cgoTypeForGoValue(p, Getattr(p, "type"), &c_struct_type); Printv(f_cgo_comment, ", ", ct, " ", Getattr(p, "lname"), NULL); p = nextParm(p); } Printv(f_cgo_comment, ");\n", NULL); } else { // Declare the C++ wrapper. if (!gccgo_flag) { Printv(f_go_wrappers, "var ", wname, " unsafe.Pointer\n\n", NULL); } else { Printv(f_go_wrappers, "//extern ", go_prefix, "_", wname, "\n", NULL); } Printv(f_go_wrappers, "func ", fn_with_over_name, "(_swig_director int", NULL); p = parms; for (int i = 0; i < parm_count; ++i) { p = getParm(p); String *tm = goWrapperType(p, Getattr(p, "type"), false); Printv(f_go_wrappers, ", _ ", tm, NULL); Delete(tm); p = nextParm(p); } Printv(f_go_wrappers, ") (_swig_ret ", go_type_name, ")", NULL); if (!gccgo_flag) { Printv(f_go_wrappers, " {\n", NULL); Printv(f_go_wrappers, "\t_swig_p := uintptr(unsafe.Pointer(&_swig_director))\n", NULL); Printv(f_go_wrappers, "\t_cgo_runtime_cgocall(", wname, ", _swig_p)\n", NULL); Printv(f_go_wrappers, "\treturn\n", NULL); Printv(f_go_wrappers, "}", NULL); } Printv(f_go_wrappers, "\n\n", NULL); } // Write out the Go function that calls the wrapper. Printv(f_go_wrappers, "func ", func_with_over_name, "(v interface{}", NULL); p = parms; for (int i = 0; i < parm_count; ++i) { p = getParm(p); Printv(f_go_wrappers, ", ", Getattr(p, "lname"), " ", NULL); String *tm = goType(p, Getattr(p, "type")); Printv(f_go_wrappers, tm, NULL); Delete(tm); p = nextParm(p); } Printv(f_go_wrappers, ") ", cn, " {\n", NULL); Printv(f_go_wrappers, "\tp := &", director_struct_name, "{0, v}\n", NULL); if (gccgo_flag && !cgo_flag) { Printv(f_go_wrappers, "\tdefer SwigCgocallDone()\n", NULL); Printv(f_go_wrappers, "\tSwigCgocall()\n", NULL); } String *call = NewString(""); Printv(call, "\tp.", class_receiver, " = ", NULL); if (cgo_flag) { Printv(call, go_type_name, "(C.", wname, "(C.int(swigDirectorAdd(p))", NULL); } else { Printv(call, fn_with_over_name, "(swigDirectorAdd(p)", NULL); } p = parms; for (int i = 0; i < parm_count; ++i) { Printv(call, ", ", NULL); p = getParm(p); String *pt = Getattr(p, "type"); String *ln = Getattr(p, "lname"); String *ivar = NewStringf("_swig_i_%d", i); String *goin = goGetattr(p, "tmap:goin"); if (goin == NULL) { Printv(f_go_wrappers, "\t", ivar, " := ", ln, NULL); if (goTypeIsInterface(p, pt)) { Printv(f_go_wrappers, ".Swigcptr()", NULL); } Printv(f_go_wrappers, "\n", NULL); } else { String *itm = goImType(p, pt); Printv(f_go_wrappers, "\tvar ", ivar, " ", itm, "\n", NULL); goin = Copy(goin); Replaceall(goin, "$input", ln); Replaceall(goin, "$result", ivar); Printv(f_go_wrappers, goin, "\n", NULL); Delete(goin); } Setattr(p, "emit:goinput", ivar); if (cgo_flag) { bool c_struct_type; String *ct = cgoTypeForGoValue(p, pt, &c_struct_type); if (c_struct_type) { Printv(call, "*(*C.", ct, ")(unsafe.Pointer(&", ivar, "))", NULL); } else { Printv(call, "C.", ct, "(", ivar, ")", NULL); } Delete(ct); } else { Printv(call, ivar, NULL); } p = nextParm(p); } Printv(call, ")", NULL); if (cgo_flag) { Printv(call, ")", NULL); } Printv(f_go_wrappers, call, "\n", NULL); goargout(parms); Printv(f_go_wrappers, "\treturn p\n", NULL); Printv(f_go_wrappers, "}\n\n", NULL); SwigType *result = Copy(Getattr(parentNode(n), "classtypeobj")); SwigType_add_pointer(result); Swig_save("classDirectorConstructor", n, "wrap:name", "wrap:action", NULL); String *dwname = Swig_name_wrapper(name); Append(dwname, unique_id); Setattr(n, "wrap:name", dwname); String *action = NewString(""); Printv(action, Swig_cresult_name(), " = new SwigDirector_", class_name, "(", NULL); String *pname = Swig_cparm_name(NULL, 0); Printv(action, pname, NULL); Delete(pname); p = parms; for (int i = 0; i < parm_count; ++i) { p = getParm(p); String *pname = Swig_cparm_name(NULL, i + 1); Printv(action, ", ", NULL); if (SwigType_isreference(Getattr(p, "type"))) { Printv(action, "*", NULL); } Printv(action, pname, NULL); Delete(pname); p = nextParm(p); } Printv(action, ");", NULL); Setattr(n, "wrap:action", action); if (cgo_flag) { cgoWrapperInfo info; info.n = n; info.go_name = func_name; info.overname = overname; info.wname = wname; info.base = NULL; info.parms = first_parm; info.result = result; info.is_static = false; info.receiver = NULL; info.is_constructor = true; info.is_destructor = false; int r = cgoGccWrapper(&info); if (r != SWIG_OK) { return r; } } else if (!gccgo_flag) { int r = gcFunctionWrapper(wname); if (r != SWIG_OK) { return r; } r = gccFunctionWrapper(n, NULL, wname, first_parm, result); if (r != SWIG_OK) { return r; } } else { int r = gccgoFunctionWrapper(n, NULL, wname, first_parm, result); if (r != SWIG_OK) { return r; } } Swig_restore(n); Delete(result); } String *cxx_director_name = NewString("SwigDirector_"); Append(cxx_director_name, class_name); String *decl = Swig_method_decl(NULL, Getattr(n, "decl"), cxx_director_name, first_parm, 0); Printv(f_c_directors_h, " ", decl, ";\n", NULL); Delete(decl); decl = Swig_method_decl(NULL, Getattr(n, "decl"), cxx_director_name, first_parm, 0); Printv(f_c_directors, cxx_director_name, "::", decl, "\n", NULL); Delete(decl); Printv(f_c_directors, " : ", Getattr(parentNode(n), "classtype"), "(", NULL); p = parms; for (int i = 0; i < parm_count; ++i) { p = getParm(p); if (i > 0) { Printv(f_c_directors, ", ", NULL); } String *pn = Getattr(p, "name"); assert(pn); Printv(f_c_directors, pn, NULL); p = nextParm(p); } Printv(f_c_directors, "),\n", NULL); Printv(f_c_directors, " go_val(swig_p), swig_mem(0)\n", NULL); Printv(f_c_directors, "{ }\n\n", NULL); if (Getattr(n, "sym:overloaded") && !Getattr(n, "sym:nextSibling")) { int r = makeDispatchFunction(n, func_name, cn, is_static, Getattr(parentNode(n), "classtypeobj"), false); if (r != SWIG_OK) { return r; } } Delete(cxx_director_name); Delete(go_name); Delete(cn); Delete(go_type_name); Delete(director_struct_name); Delete(fn_name); Delete(fn_with_over_name); Delete(func_name); Delete(func_with_over_name); Delete(wname); Delete(first_type); Delete(first_parm); return SWIG_OK; } /* ------------------------------------------------------------ * classDirectorDestructor * * Emit a destructor for a director class. * ------------------------------------------------------------ */ int classDirectorDestructor(Node *n) { if (!is_public(n)) { return SWIG_OK; } bool is_ignored = GetFlag(n, "feature:ignore") ? true : false; if (!is_ignored) { String *fnname = NewString("DeleteDirector"); String *c1 = exportedName(class_name); Append(fnname, c1); Delete(c1); String *wname = Swig_name_wrapper(fnname); Append(wname, unique_id); Setattr(n, "wrap:name", fnname); Swig_DestructorToFunction(n, getNSpace(), getClassType(), CPlusPlus, Extend); ParmList *parms = Getattr(n, "parms"); Setattr(n, "wrap:parms", parms); String *result = NewString("void"); int r = makeWrappers(n, fnname, fnname, NULL, wname, NULL, parms, result, isStatic(n)); if (r != SWIG_OK) { return r; } Delete(result); Delete(fnname); Delete(wname); } // Generate the destructor for the C++ director class. Since the // Go code is keeping a pointer to the C++ object, we need to call // back to the Go code to let it know that the C++ object is gone. String *go_name = NewString("Swiggo_DeleteDirector_"); Append(go_name, class_name); String *cn = exportedName(class_name); String *director_struct_name = NewString("_swig_Director"); Append(director_struct_name, cn); Printv(f_c_directors_h, " virtual ~SwigDirector_", class_name, "()", NULL); String *throws = buildThrow(n); if (throws) { Printv(f_c_directors_h, " ", throws, NULL); } Printv(f_c_directors_h, ";\n", NULL); String *director_sig = NewString(""); Printv(director_sig, "SwigDirector_", class_name, "::~SwigDirector_", class_name, "()", NULL); if (throws) { Printv(director_sig, " ", throws, NULL); Delete(throws); } Printv(director_sig, "\n", NULL); Printv(director_sig, "{\n", NULL); if (is_ignored) { Printv(f_c_directors, director_sig, NULL); } else { makeDirectorDestructorWrapper(go_name, director_struct_name, director_sig); } Printv(f_c_directors, " delete swig_mem;\n", NULL); Printv(f_c_directors, "}\n\n", NULL); Delete(director_sig); Delete(go_name); Delete(cn); Delete(director_struct_name); return SWIG_OK; } /* ------------------------------------------------------------ * makeDirectorDestructorWrapper * * Emit the function wrapper for the destructor of a director class. * This writes director_sig to f_c_directors and leaves the function * unfinished. * ------------------------------------------------------------ */ void makeDirectorDestructorWrapper(String *go_name, String *director_struct_name, String *director_sig) { if (cgo_flag) { makeCgoDirectorDestructorWrapper(go_name, director_struct_name, director_sig); return; } Printv(f_go_wrappers, "func ", go_name, "(c int) {\n", NULL); if (gccgo_flag) { Printv(f_go_wrappers, "\tSwigCgocallBack()\n", NULL); Printv(f_go_wrappers, "\tdefer SwigCgocallBackDone()\n", NULL); } Printv(f_go_wrappers, "\tswigDirectorLookup(c).(*", director_struct_name, ").", class_receiver, " = 0\n", NULL); Printv(f_go_wrappers, "\tswigDirectorDelete(c)\n", NULL); Printv(f_go_wrappers, "}\n\n", NULL); String *wname = NewString("_swiggo_wrap_DeleteDirector_"); Append(wname, class_name); if (!gccgo_flag) { Printv(f_c_directors, "extern \"C\" void ", wname, "(void*, int);\n", NULL); } else { Printv(f_c_directors, "extern \"C\" void ", wname, "(intgo) __asm__(\"", go_prefix, ".", go_name, "\");\n", NULL); } Printv(f_c_directors, director_sig, NULL); if (!gccgo_flag) { Printv(f_c_directors, " struct { intgo p; } SWIGSTRUCTPACKED a;\n", NULL); Printv(f_c_directors, " a.p = go_val;\n", NULL); Printv(f_c_directors, " crosscall2(", wname, ", &a, (int) sizeof a);\n", NULL); Printv(f_gc_wrappers, "#pragma dynexport ", wname, " ", wname, "\n", NULL); Printv(f_gc_wrappers, "#pragma cgo_export_static ", wname, " ", wname, "\n", NULL); Printv(f_gc_wrappers, "#pragma textflag 7\n", NULL); Printv(f_gc_wrappers, "extern void \xc2\xb7", go_name, "();\n", NULL); Printv(f_gc_wrappers, "void\n", NULL); Printv(f_gc_wrappers, wname, "(void *a, int32 n)\n", NULL); Printv(f_gc_wrappers, "{\n", NULL); Printv(f_gc_wrappers, "\truntime\xc2\xb7" "cgocallback(\xc2\xb7", go_name, ", a, n);\n", NULL); Printv(f_gc_wrappers, "}\n\n", NULL); } else { Printv(f_c_directors, " ", wname, "(go_val);\n", NULL); } Delete(wname); } /* ------------------------------------------------------------ * makeCgoDirectorDestructorWrapper * * When using cgo, emit the function wrapper for the destructor of a * director class. * ------------------------------------------------------------ */ void makeCgoDirectorDestructorWrapper(String *go_name, String *director_struct_name, String *director_sig) { String *wname = Copy(go_name); Append(wname, unique_id); Printv(f_go_wrappers, "//export ", wname, "\n", NULL); Printv(f_go_wrappers, "func ", wname, "(c int) {\n", NULL); Printv(f_go_wrappers, "\tswigDirectorLookup(c).(*", director_struct_name, ").", class_receiver, " = 0\n", NULL); Printv(f_go_wrappers, "\tswigDirectorDelete(c)\n", NULL); Printv(f_go_wrappers, "}\n\n", NULL); Printv(f_c_directors, "extern \"C\" void ", wname, "(intgo);\n", NULL); Printv(f_c_directors, director_sig, NULL); Printv(f_c_directors, " ", wname, "(go_val);\n", NULL); } /* ------------------------------------------------------------ * classDirectorMethod * * Emit a method for a director class, plus its overloads. * ------------------------------------------------------------ */ int classDirectorMethod(Node *n, Node *parent, String *super) { bool is_ignored = GetFlag(n, "feature:ignore") ? true : false; // We don't need explicit calls. if (GetFlag(n, "explicitcall")) { return SWIG_OK; } String *name = Getattr(n, "sym:name"); if (!name) { assert(is_ignored); name = Getattr(n, "name"); } bool overloaded = Getattr(n, "sym:overloaded") && !Getattr(n, "explicitcallnode"); if (!overloaded) { int r = oneClassDirectorMethod(n, parent, super); if (r != SWIG_OK) { return r; } } else { // Handle overloaded methods here, because otherwise we will // reject them in the class_methods hash table. We need to use // class_methods so that we correctly handle cases where a // function in one class hides a function of the same name in a // parent class. if (!Getattr(class_methods, name)) { for (Node *on = Getattr(n, "sym:overloaded"); on; on = Getattr(on, "sym:nextSibling")) { // Swig_overload_rank expects wrap:name and wrap:parms to be // set. String *wn = Swig_name_wrapper(Getattr(on, "sym:name")); Append(wn, Getattr(on, "sym:overname")); Append(wn, unique_id); Setattr(on, "wrap:name", wn); Delete(wn); Setattr(on, "wrap:parms", Getattr(on, "parms")); } } int r = oneClassDirectorMethod(n, parent, super); if (r != SWIG_OK) { return r; } if (!Getattr(n, "sym:nextSibling")) { // Last overloaded function Node *on = Getattr(n, "sym:overloaded"); bool is_static = isStatic(on); String *cn = exportedName(Getattr(parent, "sym:name")); String *go_name = buildGoName(name, is_static, false); String *director_struct_name = NewString("_swig_Director"); Append(director_struct_name, cn); int r = makeDispatchFunction(on, go_name, director_struct_name, is_static, director_struct_name, false); if (r != SWIG_OK) { return r; } if (!GetFlag(n, "abstract")) { String *go_upcall = NewString("Director"); Append(go_upcall, cn); Append(go_upcall, go_name); r = makeDispatchFunction(on, go_upcall, director_struct_name, is_static, director_struct_name, true); if (r != SWIG_OK) { return r; } Delete(go_upcall); } Delete(director_struct_name); Delete(go_name); Delete(cn); } } Setattr(class_methods, name, NewString("")); return SWIG_OK; } /* ------------------------------------------------------------ * oneClassDirectorMethod * * Emit a method for a director class. * ------------------------------------------------------------ */ int oneClassDirectorMethod(Node *n, Node *parent, String *super) { String *symname = Getattr(n, "sym:name"); if (!checkFunctionVisibility(n, parent)) { return SWIG_OK; } bool is_ignored = GetFlag(n, "feature:ignore") ? true : false; bool is_pure_virtual = (Cmp(Getattr(n, "storage"), "virtual") == 0 && Cmp(Getattr(n, "value"), "0") == 0); String *name = Getattr(n, "sym:name"); if (!name) { assert(is_ignored); name = Getattr(n, "name"); } String *overname = NULL; if (Getattr(n, "sym:overloaded")) { overname = Getattr(n, "sym:overname"); } String *cn = exportedName(Getattr(parent, "sym:name")); String *go_type_name = goCPointerType(Getattr(parent, "classtypeobj"), true); String *director_struct_name = NewString("_swig_Director"); Append(director_struct_name, cn); bool is_static = isStatic(n); String *go_name = buildGoName(name, is_static, false); ParmList *parms = Getattr(n, "parms"); Setattr(n, "wrap:parms", parms); Wrapper *dummy = NewWrapper(); emit_attach_parmmaps(parms, dummy); Swig_typemap_attach_parms("gotype", parms, NULL); Swig_typemap_attach_parms("imtype", parms, NULL); int parm_count = emit_num_arguments(parms); SwigType *result = Getattr(n, "type"); // Save the type for overload processing. Setattr(n, "go:type", result); String *interface_name = NewString("_swig_DirectorInterface"); Append(interface_name, cn); Append(interface_name, go_name); if (overname) { Append(interface_name, overname); } String *callback_name = Copy(director_struct_name); Append(callback_name, "_callback_"); Append(callback_name, name); Replace(callback_name, "_swig", "Swig", DOH_REPLACE_FIRST); if (overname) { Append(callback_name, overname); } if (cgo_flag) { Append(callback_name, unique_id); } String *upcall_name = Copy(director_struct_name); Append(upcall_name, "_upcall_"); Append(upcall_name, go_name); String *upcall_wname = Swig_name_wrapper(upcall_name); if (overname) { Append(upcall_wname, overname); } Append(upcall_wname, unique_id); String *upcall_gc_name = buildGoWrapperName(upcall_name, overname); String *go_with_over_name = Copy(go_name); if (overname) { Append(go_with_over_name, overname); } Parm *p = 0; Wrapper *w = NewWrapper(); Swig_director_parms_fixup(parms); Swig_typemap_attach_parms("directorin", parms, w); Swig_typemap_attach_parms("directorargout", parms, w); Swig_typemap_attach_parms("godirectorin", parms, w); Swig_typemap_attach_parms("goin", parms, dummy); Swig_typemap_attach_parms("goargout", parms, dummy); DelWrapper(dummy); if (!is_ignored) { // We use an interface to see if this method is defined in Go. Printv(f_go_wrappers, "type ", interface_name, " interface {\n", NULL); Printv(f_go_wrappers, "\t", go_with_over_name, "(", NULL); p = parms; for (int i = 0; i < parm_count; ++i) { p = getParm(p); if (i > 0) { Printv(f_go_wrappers, ", ", NULL); } String *tm = goType(p, Getattr(p, "type")); Printv(f_go_wrappers, tm, NULL); Delete(tm); p = nextParm(p); } Printv(f_go_wrappers, ")", NULL); if (SwigType_type(result) != T_VOID) { String *tm = goType(n, result); Printv(f_go_wrappers, " ", tm, NULL); Delete(tm); } Printv(f_go_wrappers, "\n", NULL); Printv(f_go_wrappers, "}\n\n", NULL); if (!GetFlag(n, "abstract")) { if (cgo_flag) { Printv(f_cgo_comment, "extern ", NULL); if (SwigType_type(result) == T_VOID) { Printv(f_cgo_comment, "void", NULL); } else { bool c_struct_type; String *ret_type = cgoTypeForGoValue(n, result, &c_struct_type); Printv(f_cgo_comment, ret_type, NULL); Delete(ret_type); } Printv(f_cgo_comment, " ", upcall_wname, "(uintptr_t", NULL); p = parms; for (int i = 0; i < parm_count; ++i) { p = getParm(p); bool c_struct_type; String *ct = cgoTypeForGoValue(p, Getattr(p, "type"), &c_struct_type); Printv(f_cgo_comment, ", ", ct, " ", Getattr(p, "lname"), NULL); p = nextParm(p); } Printv(f_cgo_comment, ");\n", NULL); } else { // Declare the upcall function, which calls the method on // the parent class. if (!gccgo_flag) { Printv(f_go_wrappers, "var ", upcall_wname, " unsafe.Pointer\n\n", NULL); } else { Printv(f_go_wrappers, "//extern ", go_prefix, "_", upcall_wname, "\n", NULL); } Printv(f_go_wrappers, "func ", upcall_gc_name, "(_swig_ptr ", go_type_name, NULL); p = parms; for (int i = 0; i < parm_count; ++i) { p = getParm(p); String *tm = goWrapperType(p, Getattr(p, "type"), false); Printv(f_go_wrappers, ", _ ", tm, NULL); Delete(tm); p = nextParm(p); } Printv(f_go_wrappers, ")", NULL); if (SwigType_type(result) != T_VOID) { String *tm = goWrapperType(n, result, true); Printv(f_go_wrappers, " (_swig_ret ", tm, ")", NULL); Delete(tm); } if (!gccgo_flag) { Printv(f_go_wrappers, " {\n", NULL); Printv(f_go_wrappers, "\t_swig_p := uintptr(unsafe.Pointer(&_swig_ptr))\n", NULL); Printv(f_go_wrappers, "\t_cgo_runtime_cgocall(", upcall_wname, ", _swig_p)\n", NULL); Printv(f_go_wrappers, "\treturn\n", NULL); Printv(f_go_wrappers, "}", NULL); } Printv(f_go_wrappers, "\n\n", NULL); } } // Define the method on the director class in Go. Printv(f_go_wrappers, "func (swig_p *", director_struct_name, ") ", go_with_over_name, "(", NULL); p = parms; for (int i = 0; i < parm_count; ++i) { p = getParm(p); if (i > 0) { Printv(f_go_wrappers, ", ", NULL); } Printv(f_go_wrappers, Getattr(p, "lname"), " ", NULL); String *tm = goType(p, Getattr(p, "type")); Printv(f_go_wrappers, tm, NULL); Delete(tm); p = nextParm(p); } Printv(f_go_wrappers, ")", NULL); if (SwigType_type(result) != T_VOID) { String *tm = goType(n, result); Printv(f_go_wrappers, " ", tm, NULL); Delete(tm); } Printv(f_go_wrappers, " {\n", NULL); Printv(f_go_wrappers, "\tif swig_g, swig_ok := swig_p.v.(", interface_name, "); swig_ok {\n", NULL); Printv(f_go_wrappers, "\t\t", NULL); if (SwigType_type(result) != T_VOID) { Printv(f_go_wrappers, "return ", NULL); } Printv(f_go_wrappers, "swig_g.", go_with_over_name, "(", NULL); p = parms; for (int i = 0; i < parm_count; ++i) { p = getParm(p); if (i > 0) { Printv(f_go_wrappers, ", ", NULL); } Printv(f_go_wrappers, Getattr(p, "lname"), NULL); p = nextParm(p); } Printv(f_go_wrappers, ")\n", NULL); if (SwigType_type(result) == T_VOID) { Printv(f_go_wrappers, "\t\treturn\n", NULL); } Printv(f_go_wrappers, "\t}\n", NULL); if (GetFlag(n, "abstract")) { Printv(f_go_wrappers, "\tpanic(\"call to pure virtual method\")\n", NULL); } else { String *ret_type = NULL; bool memcpy_ret = false; String *wt = NULL; bool has_goout = false; String *goout = NULL; if (SwigType_type(result) != T_VOID) { ret_type = goImType(n, result); Printv(f_go_wrappers, "\tvar swig_r ", ret_type, "\n", NULL); goout = goTypemapLookup("goout", n, "swig_r"); if (goout) { has_goout = true; } if (cgo_flag) { bool c_struct_type; Delete(cgoTypeForGoValue(n, result, &c_struct_type)); if (c_struct_type) { memcpy_ret = true; } } } p = parms; for (int i = 0; i < parm_count; ++i) { p = getParm(p); if (goGetattr(p, "tmap:goargout")) { has_goout = true; } p = nextParm(p); } String *call = NewString(""); if (gccgo_flag && !cgo_flag) { if (has_goout) { Printv(call, "\tfunc() {\n", NULL); } Printv(call, "\tdefer SwigCgocallDone()\n", NULL); Printv(call, "\tSwigCgocall()\n", NULL); } Printv(call, "\t", NULL); if (SwigType_type(result) != T_VOID) { if (memcpy_ret) { Printv(call, "swig_r_p := ", NULL); } else { Printv(call, "swig_r = ", NULL); if (cgo_flag) { Printv(call, "(", ret_type, ")(", NULL); } } if (cgo_flag && goTypeIsInterface(n, result)) { wt = goWrapperType(n, result, true); Printv(call, "(", wt, ")(", NULL); } } if (cgo_flag) { Printv(call, "C.", upcall_wname, NULL); } else { Printv(call, upcall_gc_name, NULL); } Printv(call, "(", NULL); if (cgo_flag) { Printv(call, "C.uintptr_t(", NULL); } Printv(call, "swig_p.", go_type_name, NULL); if (cgo_flag) { Printv(call, ")", NULL); } p = parms; for (int i = 0; i < parm_count; ++i) { Printv(call, ", ", NULL); p = getParm(p); SwigType *pt = Getattr(p, "type"); String *ln = Getattr(p, "lname"); String *ivar = NewStringf("_swig_i_%d", i); // This is an ordinary call from Go to C++, so adjust using // the goin typemap. String *goin = goGetattr(p, "tmap:goin"); if (goin == NULL) { Printv(f_go_wrappers, "\t", ivar, " := ", ln, NULL); if (goTypeIsInterface(p, pt)) { Printv(f_go_wrappers, ".Swigcptr()", NULL); } Printv(f_go_wrappers, "\n", NULL); } else { String *itm = goImType(p, pt); Printv(f_go_wrappers, "\tvar ", ivar, " ", itm, "\n", NULL); goin = Copy(goin); Replaceall(goin, "$input", ln); Replaceall(goin, "$result", ivar); Printv(f_go_wrappers, goin, NULL); Delete(goin); } Setattr(p, "emit:goinput", ivar); if (cgo_flag) { bool c_struct_type; String *ct = cgoTypeForGoValue(p, pt, &c_struct_type); if (c_struct_type) { Printv(call, "*(*C.", ct, ")(unsafe.Pointer(&", ivar, "))", NULL); } else { Printv(call, "C.", ct, "(", ivar, ")", NULL); } } else { Printv(call, ivar, NULL); } p = nextParm(p); } Printv(call, ")", NULL); if (gccgo_flag && !cgo_flag && has_goout) { Printv(call, "\n\t}()", NULL); } if (cgo_flag) { if (wt) { // Close the type conversion to the wrapper type. Printv(call, ")", NULL); } if (SwigType_type(result) != T_VOID && !memcpy_ret) { // Close the type conversion of the return value. Printv(call, ")", NULL); } } Printv(call, "\n", NULL); Printv(f_go_wrappers, call, NULL); Delete(call); if (memcpy_ret) { Printv(f_go_wrappers, "\tswig_r = *(*", ret_type, ")(unsafe.Pointer(&swig_r_p))\n", NULL); } goargout(parms); if (SwigType_type(result) != T_VOID) { if (goout == NULL) { Printv(f_go_wrappers, "\treturn swig_r\n", NULL); } else { String *tm = goType(n, result); Printv(f_go_wrappers, "\tvar swig_r_1 ", tm, "\n", NULL); Replaceall(goout, "$input", "swig_r"); Replaceall(goout, "$result", "swig_r_1"); Printv(f_go_wrappers, goout, "\n", NULL); Printv(f_go_wrappers, "\treturn swig_r_1\n", NULL); } } if (ret_type) { Delete(ret_type); } if (wt) { Delete(wt); } } Printv(f_go_wrappers, "}\n\n", NULL); // Define a method in the C++ director class that the C++ upcall // function can call. This permits an upcall to a protected // method. if (!GetFlag(n, "abstract")) { String *upcall_method_name = NewString("_swig_upcall_"); Append(upcall_method_name, name); if (overname) { Append(upcall_method_name, overname); } SwigType *rtype = Getattr(n, "classDirectorMethods:type"); String *upcall_decl = Swig_method_decl(rtype, Getattr(n, "decl"), upcall_method_name, parms, 0); Printv(f_c_directors_h, " ", upcall_decl, " {\n", NULL); Delete(upcall_decl); Printv(f_c_directors_h, " ", NULL); if (SwigType_type(result) != T_VOID) { Printv(f_c_directors_h, "return ", NULL); } String *super_call = Swig_method_call(super, parms); Printv(f_c_directors_h, super_call, ";\n", NULL); Delete(super_call); Printv(f_c_directors_h, " }\n", NULL); // Define the C++ function that the Go function calls. SwigType *first_type = NULL; Parm *first_parm = parms; if (!is_static) { first_type = NewString("SwigDirector_"); Append(first_type, class_name); SwigType_add_pointer(first_type); first_parm = NewParm(first_type, "p", n); set_nextSibling(first_parm, parms); } Swig_save("classDirectorMethod", n, "wrap:name", "wrap:action", NULL); Setattr(n, "wrap:name", upcall_wname); String *action = NewString(""); if (SwigType_type(result) != T_VOID) { Printv(action, Swig_cresult_name(), " = (", SwigType_lstr(result, 0), ")", NULL); if (SwigType_isreference(result)) { Printv(action, "&", NULL); } } Printv(action, Swig_cparm_name(NULL, 0), "->", upcall_method_name, "(", NULL); p = parms; int i = 0; while (p != NULL) { if (SwigType_type(Getattr(p, "type")) != T_VOID) { String *pname = Swig_cparm_name(NULL, i + 1); if (i > 0) { Printv(action, ", ", NULL); } // A parameter whose type is a reference is converted into a // pointer type by gcCTypeForGoValue. We are calling a // function which expects a reference so we need to convert // back. if (SwigType_isreference(Getattr(p, "type"))) { Printv(action, "*", NULL); } Printv(action, pname, NULL); Delete(pname); i++; } p = nextSibling(p); } Printv(action, ");", NULL); Setattr(n, "wrap:action", action); if (cgo_flag) { cgoWrapperInfo info; info.n = n; info.go_name = go_name; info.overname = overname; info.wname = upcall_wname; info.base = NULL; info.parms = first_parm; info.result = result; info.is_static = is_static; info.receiver = NULL; info.is_constructor = false; info.is_destructor = false; int r = cgoGccWrapper(&info); if (r != SWIG_OK) { return r; } } else if (!gccgo_flag) { // Write the upcall wrapper function. This is compiled by gc // and calls the C++ function. int r = gcFunctionWrapper(upcall_wname); if (r != SWIG_OK) { return r; } r = gccFunctionWrapper(n, NULL, upcall_wname, first_parm, result); if (r != SWIG_OK) { return r; } } else { int r = gccgoFunctionWrapper(n, NULL, upcall_wname, first_parm, result); if (r != SWIG_OK) { return r; } } Delete(first_type); if (first_parm != parms) { Delete(first_parm); } Swig_restore(n); Delete(upcall_method_name); // Define a function that uses the Go director type that other // methods in the Go type can call to get parent methods. Printv(f_go_wrappers, "func Director", cn, go_with_over_name, "(p ", cn, NULL); p = parms; for (int i = 0; i < parm_count; ++i) { p = getParm(p); Printv(f_go_wrappers, ", ", Getattr(p, "lname"), " ", NULL); String *tm = goType(p, Getattr(p, "type")); Printv(f_go_wrappers, tm, NULL); Delete(tm); p = nextParm(p); } Printv(f_go_wrappers, ")", NULL); if (SwigType_type(result) != T_VOID) { String *tm = goType(n, result); Printv(f_go_wrappers, " ", tm, NULL); Delete(tm); } Printv(f_go_wrappers, " {\n", NULL); String *ret_type = NULL; bool memcpy_ret = false; String *wt = NULL; String *goout = NULL; if (SwigType_type(result) != T_VOID) { ret_type = goImType(n, result); Printv(f_go_wrappers, "\tvar swig_r ", ret_type, "\n", NULL); goout = goTypemapLookup("goout", n, "swig_r"); if (cgo_flag) { bool c_struct_type; Delete(cgoTypeForGoValue(n, result, &c_struct_type)); if (c_struct_type) { memcpy_ret = true; } } } String *call = NewString(""); if (gccgo_flag && !cgo_flag) { if (goout != NULL) { Printv(call, "\tfunc() {\n", NULL); } Printv(call, "\tdefer SwigCgocallDone()\n", NULL); Printv(call, "\tSwigCgocall()\n", NULL); } Printv(call, "\t", NULL); if (SwigType_type(result) != T_VOID) { if (memcpy_ret) { Printv(call, "swig_r_p := ", NULL); } else { Printv(call, "swig_r = ", NULL); if (cgo_flag) { Printv(call, "(", ret_type, ")(", NULL); } } if (cgo_flag && goTypeIsInterface(n, result)) { wt = goWrapperType(n, result, true); Printv(call, "(", wt, ")(", NULL); } } if (cgo_flag) { Printv(call, "C.", upcall_wname, NULL); } else { Printv(call, upcall_gc_name, NULL); } Printv(call, "(", NULL); if (cgo_flag) { Printv(call, "C.uintptr_t(", NULL); } Printv(call, "p.(*", director_struct_name, ").", go_type_name, NULL); if (cgo_flag) { Printv(call, ")", NULL); } p = parms; for (int i = 0; i < parm_count; ++i) { Printv(call, ", ", NULL); p = getParm(p); SwigType *pt = Getattr(p, "type"); String *ivar = NewStringf("_swig_i_%d", i); String *ln = Copy(Getattr(p, "lname")); String *goin = goGetattr(p, "tmap:goin"); if (goin == NULL) { Printv(f_go_wrappers, "\t", ivar, " := ", ln, NULL); if (goTypeIsInterface(p, pt)) { Printv(f_go_wrappers, ".Swigcptr()", NULL); } Printv(f_go_wrappers, "\n", NULL); } else { String *itm = goImType(p, pt); Printv(f_go_wrappers, "\tvar ", ivar, " ", itm, "\n", NULL); goin = Copy(goin); Replaceall(goin, "$input", ln); Replaceall(goin, "$result", ivar); Printv(f_go_wrappers, goin, NULL); Delete(goin); } Setattr(p, "emit:goinput", ivar); if (cgo_flag) { bool c_struct_type; String *ct = cgoTypeForGoValue(p, pt, &c_struct_type); if (c_struct_type) { Printv(call, "*(*C.", ct, ")(unsafe.Pointer(&", ivar, "))", NULL); } else { Printv(call, "C.", ct, "(", ivar, ")", NULL); } } else { Printv(call, ivar, NULL); } Delete(ln); p = nextParm(p); } Printv(call, ")", NULL); if (gccgo_flag && !cgo_flag && goout != NULL) { Printv(call, "\n\t}()", NULL); } if (cgo_flag) { if (wt) { // Close the type conversion to the wrapper type. Printv(call, ")", NULL); } if (SwigType_type(result) != T_VOID && !memcpy_ret) { // Close the type conversion of the return value. Printv(call, ")", NULL); } } Printv(call, "\n", NULL); Printv(f_go_wrappers, call, NULL); Delete(call); if (memcpy_ret) { Printv(f_go_wrappers, "\tswig_r = *(*", ret_type, ")(unsafe.Pointer(&swig_r_p))\n", NULL); } goargout(parms); if (SwigType_type(result) != T_VOID) { if (goout == NULL) { Printv(f_go_wrappers, "\treturn swig_r\n", NULL); } else { String *tm = goType(n, result); Printv(f_go_wrappers, "\tvar swig_r_1 ", tm, "\n", NULL); Replaceall(goout, "$input", "swig_r"); Replaceall(goout, "$result", "swig_r_1"); Printv(f_go_wrappers, goout, "\n", NULL); Printv(f_go_wrappers, "\treturn swig_r_1\n", NULL); } } Printv(f_go_wrappers, "}\n\n", NULL); if (ret_type) { Delete(ret_type); } if (wt) { Delete(wt); } } // The Go function which invokes the method. This is called by // the C++ method on the director class. if (cgo_flag) { Printv(f_go_wrappers, "//export ", callback_name, "\n", NULL); } Printv(f_go_wrappers, "func ", callback_name, "(swig_c int", NULL); p = parms; for (int i = 0; i < parm_count; ++i) { p = getParm(p); String *tm = goWrapperType(p, Getattr(p, "type"), false); Printv(f_go_wrappers, ", ", Getattr(p, "lname"), " ", tm, NULL); Delete(tm); p = nextParm(p); } Printv(f_go_wrappers, ") ", NULL); String *result_wrapper = NULL; if (SwigType_type(result) != T_VOID) { result_wrapper = goWrapperType(n, result, true); Printv(f_go_wrappers, "(swig_result ", result_wrapper, ") ", NULL); } Printv(f_go_wrappers, "{\n", NULL); if (is_ignored) { Printv(f_go_wrappers, "\treturn\n", NULL); } else { bool result_is_interface = false; String *goout = NULL; if (SwigType_type(result) != T_VOID) { result_is_interface = goTypeIsInterface(NULL, result); Printv(f_go_wrappers, "\tvar swig_r ", NULL); if (!result_is_interface) { Printv(f_go_wrappers, goType(n, result), NULL); } else { Printv(f_go_wrappers, result_wrapper, NULL); } Printv(f_go_wrappers, "\n", NULL); goout = goTypemapLookup("godirectorout", n, "swig_r"); } String *call = NewString(""); Printv(call, "\t", NULL); if (SwigType_type(result) != T_VOID) { Printv(call, "swig_r = ", NULL); if (result_is_interface) { Printv(call, result_wrapper, "(", NULL); } } Printv(call, "swig_p.", go_with_over_name, "(", NULL); String *goincode = NewString(""); p = parms; for (int i = 0; i < parm_count; ++i) { p = getParm(p); if (i > 0) { Printv(call, ", ", NULL); } SwigType *pt = Getattr(p, "type"); String *ln = NewString(""); // If the Go representation is an interface type class, then // we are receiving a uintptr, and must convert to the // interface. bool is_interface = goTypeIsInterface(p, pt); if (is_interface) { // Passing is_result as true to goWrapperType gives us the // name of the Go type we need to convert to an interface. String *wt = goWrapperType(p, pt, true); Printv(ln, wt, "(", NULL); Delete(wt); } Printv(ln, Getattr(p, "lname"), NULL); if (is_interface) { Printv(ln, ")", NULL); } String *goin = goGetattr(p, "tmap:godirectorin"); if (goin == NULL) { Printv(call, ln, NULL); } else { String *ivar = NewString(""); Printf(ivar, "_swig_i_%d", i); String *itm = goType(p, pt); Printv(f_go_wrappers, "\tvar ", ivar, " ", itm, "\n", NULL); goin = Copy(goin); Replaceall(goin, "$input", ln); Replaceall(goin, "$result", ivar); Printv(goincode, goin, "\n", NULL); Delete(goin); Printv(call, ivar, NULL); Delete(ivar); } Delete(ln); p = nextParm(p); } Printv(call, ")", NULL); if (result_is_interface) { Printv(call, ".Swigcptr())", NULL); } Printv(call, "\n", NULL); if (gccgo_flag && !cgo_flag) { if (goout != NULL) { Printv(f_go_wrappers, "\tfunc() {\n", NULL); } Printv(f_go_wrappers, "\tSwigCgocallBack()\n", NULL); Printv(f_go_wrappers, "\tdefer SwigCgocallBackDone()\n", NULL); } Printv(f_go_wrappers, "\tswig_p := swigDirectorLookup(swig_c).(*", director_struct_name, ")\n", NULL); Printv(f_go_wrappers, goincode, NULL); Printv(f_go_wrappers, call, NULL); Delete(call); if (gccgo_flag && !cgo_flag && goout != NULL) { Printv(f_go_wrappers, "\t}()\n", NULL); } if (SwigType_type(result) != T_VOID) { if (goout == NULL) { Printv(f_go_wrappers, "\treturn swig_r\n", NULL); } else { String *tm = goImType(n, result); Printv(f_go_wrappers, "\tvar swig_r_1 ", tm, "\n", NULL); Replaceall(goout, "$input", "swig_r"); Replaceall(goout, "$result", "swig_r_1"); Printv(f_go_wrappers, goout, "\n", NULL); Printv(f_go_wrappers, "\treturn swig_r_1\n", NULL); } } } Printv(f_go_wrappers, "}\n\n", NULL); Delete(result_wrapper); Delete(upcall_wname); Delete(upcall_gc_name); Delete(go_with_over_name); } if (!is_ignored || is_pure_virtual) { // Declare the method for the director class. SwigType *rtype = Getattr(n, "conversion_operator") ? 0 : Getattr(n, "classDirectorMethods:type"); String *decl = Swig_method_decl(rtype, Getattr(n, "decl"), Getattr(n, "name"), parms, 0); Printv(f_c_directors_h, " virtual ", decl, NULL); Delete(decl); String *qname = NewString(""); Printv(qname, "SwigDirector_", class_name, "::", Getattr(n, "name"), NULL); decl = Swig_method_decl(rtype, Getattr(n, "decl"), qname, parms, 0); Printv(w->def, decl, NULL); Delete(decl); Delete(qname); String *throws = buildThrow(n); if (throws) { Printv(f_c_directors_h, " ", throws, NULL); Printv(w->def, " ", throws, NULL); Delete(throws); } Printv(f_c_directors_h, ";\n", NULL); Printv(w->def, " {\n", NULL); if (SwigType_type(result) != T_VOID) { if (!SwigType_isclass(result)) { if (!(SwigType_ispointer(result) || SwigType_isreference(result))) { String *construct_result = NewStringf("= SwigValueInit< %s >()", SwigType_lstr(result, 0)); Wrapper_add_localv(w, "c_result", SwigType_lstr(result, "c_result"), construct_result, NIL); Delete(construct_result); } else { Wrapper_add_localv(w, "c_result", SwigType_lstr(result, "c_result"), "= 0", NIL); } } else { String *cres = SwigType_lstr(result, "c_result"); Printf(w->code, "%s;\n", cres); Delete(cres); } } if (!is_ignored) { makeDirectorMethodWrapper(n, w, callback_name); } else { assert(is_pure_virtual); Printv(w->code, " _swig_gopanic(\"call to pure virtual function ", Getattr(parent, "sym:name"), name, "\");\n", NULL); if (SwigType_type(result) != T_VOID) { String *retstr = SwigType_rcaststr(result, "c_result"); Printv(w->code, " return ", retstr, ";\n", NULL); Delete(retstr); } } Printv(w->code, "}", NULL); Replaceall(w->code, "$symname", symname); Wrapper_print(w, f_c_directors); } Delete(cn); Delete(go_type_name); Delete(director_struct_name); Delete(interface_name); Delete(callback_name); Delete(upcall_name); Delete(go_name); DelWrapper(w); return SWIG_OK; } /* ------------------------------------------------------------ * makeDirectorMethodWrapper * * Emit the function wrapper for a director method. * ------------------------------------------------------------ */ void makeDirectorMethodWrapper(Node *n, Wrapper *w, String *callback_name) { if (cgo_flag) { makeCgoDirectorMethodWrapper(n, w, callback_name); return; } ParmList *parms = Getattr(n, "wrap:parms"); SwigType *result = Getattr(n, "type"); String *callback_wname = Swig_name_wrapper(callback_name); Append(callback_wname, unique_id); if (!gccgo_flag) { Printv(f_c_directors, "extern \"C\" void ", callback_wname, "(void*, int);\n", NULL); } else { Printv(f_c_directors, "extern \"C\" ", NULL); String *fnname = NewString(""); Printv(fnname, callback_wname, "(int", NULL); Parm *p = parms; while (p) { while (checkAttribute(p, "tmap:directorin:numinputs", "0")) { p = Getattr(p, "tmap:directorin:next"); } String *cg = gccgoCTypeForGoValue(p, Getattr(p, "type"), Getattr(p, "lname")); Printv(fnname, ", ", cg, NULL); Delete(cg); p = Getattr(p, "tmap:directorin:next"); } Printv(fnname, ")", NULL); if (SwigType_type(result) == T_VOID) { Printv(f_c_directors, "void ", fnname, NULL); } else { String *tm = gccgoCTypeForGoValue(n, result, fnname); Printv(f_c_directors, tm, NULL); Delete(tm); } Delete(fnname); Printv(f_c_directors, " __asm__(\"", go_prefix, ".", callback_name, "\");\n", NULL); } if (!gccgo_flag) { Printv(w->code, " struct {\n", NULL); Printv(w->code, " intgo go_val;\n", NULL); Parm *p = parms; while (p) { while (checkAttribute(p, "tmap:directorin:numinputs", "0")) { p = Getattr(p, "tmap:directorin:next"); } String *ln = Getattr(p, "lname"); String *cg = gcCTypeForGoValue(p, Getattr(p, "type"), ln); Printv(w->code, " ", cg, ";\n", NULL); Delete(cg); p = Getattr(p, "tmap:directorin:next"); } if (SwigType_type(result) != T_VOID) { Printv(w->code, " long : 0;\n", NULL); String *rname = NewString(Swig_cresult_name()); String *cg = gcCTypeForGoValue(n, result, rname); Printv(w->code, " ", cg, ";\n", NULL); Delete(cg); Delete(rname); } Printv(w->code, " } SWIGSTRUCTPACKED swig_a;\n", NULL); Printv(w->code, " swig_a.go_val = go_val;\n", NULL); p = parms; while (p) { while (checkAttribute(p, "tmap:directorin:numinputs", "0")) { p = Getattr(p, "tmap:directorin:next"); } String *tm = Getattr(p, "tmap:directorin"); if (!tm) { Swig_warning(WARN_TYPEMAP_DIRECTORIN_UNDEF, input_file, line_number, "Unable to use type %s as director method argument\n", SwigType_str(Getattr(p, "type"), 0)); } else { tm = Copy(tm); String *ln = Getattr(p, "lname"); String *input = NewString(""); Printv(input, "swig_a.", ln, NULL); Setattr(p, "emit:directorinput", input); Replaceall(tm, "$input", input); Replaceall(tm, "$owner", "0"); Delete(input); Printv(w->code, "\t", tm, "\n", NULL); Delete(tm); } p = Getattr(p, "tmap:directorin:next"); } Printv(w->code, " crosscall2(", callback_wname, ", &swig_a, (int) sizeof swig_a);\n", NULL); /* Marshal outputs */ for (p = parms; p;) { String *tm; if ((tm = Getattr(p, "tmap:directorargout"))) { tm = Copy(tm); Replaceall(tm, "$result", "jresult"); Replaceall(tm, "$input", Getattr(p, "emit:directorinput")); Printv(w->code, tm, "\n", NIL); Delete(tm); p = Getattr(p, "tmap:directorargout:next"); } else { p = nextSibling(p); } } if (SwigType_type(result) != T_VOID) { String *result_str = NewString("c_result"); String *tm = Swig_typemap_lookup("directorout", n, result_str, NULL); if (!tm) { Swig_warning(WARN_TYPEMAP_DIRECTOROUT_UNDEF, input_file, line_number, "Unable to use type %s as director method result\n", SwigType_str(result, 0)); } else { static const String *swig_a_result = NewStringf("swig_a.%s", Swig_cresult_name()); Replaceall(tm, "$input", swig_a_result); Replaceall(tm, "$result", "c_result"); Printv(w->code, " ", tm, "\n", NULL); String *retstr = SwigType_rcaststr(result, "c_result"); Printv(w->code, " return ", retstr, ";\n", NULL); Delete(retstr); Delete(tm); } Delete(result_str); } // The C wrapper code which calls the Go function. Printv(f_gc_wrappers, "#pragma dynexport ", callback_wname, " ", callback_wname, "\n", NULL); Printv(f_gc_wrappers, "#pragma cgo_export_static ", callback_wname, " ", callback_wname, "\n", NULL); Printv(f_gc_wrappers, "#pragma textflag 7\n", NULL); Printv(f_gc_wrappers, "extern void \xc2\xb7", callback_name, "();\n", NULL); Printv(f_gc_wrappers, "void\n", NULL); Printv(f_gc_wrappers, callback_wname, "(void *a, int32 n)\n", NULL); Printv(f_gc_wrappers, "{\n", NULL); Printv(f_gc_wrappers, "\truntime\xc2\xb7" "cgocallback(\xc2\xb7", callback_name, ", a, n);\n", NULL); Printv(f_gc_wrappers, "}\n\n", NULL); } else { if (SwigType_type(result) != T_VOID) { String *r = NewString(Swig_cresult_name()); String *tm = gccgoCTypeForGoValue(n, result, r); Wrapper_add_local(w, r, tm); Delete(tm); Delete(r); } String *args = NewString(""); Parm *p = parms; while (p) { while (checkAttribute(p, "tmap:directorin:numinputs", "0")) { p = Getattr(p, "tmap:directorin:next"); } String *pn = NewString("g"); Append(pn, Getattr(p, "lname")); Setattr(p, "emit:directorinput", pn); String *tm = gccgoCTypeForGoValue(n, Getattr(p, "type"), pn); Wrapper_add_local(w, pn, tm); Delete(tm); tm = Getattr(p, "tmap:directorin"); if (!tm) { Swig_warning(WARN_TYPEMAP_DIRECTORIN_UNDEF, input_file, line_number, "Unable to use type %s as director method argument\n", SwigType_str(Getattr(p, "type"), 0)); } else { tm = Copy(tm); Replaceall(tm, "$input", pn); Replaceall(tm, "$owner", 0); Printv(w->code, " ", tm, "\n", NULL); Delete(tm); Printv(args, ", ", pn, NULL); } p = Getattr(p, "tmap:directorin:next"); } Printv(w->code, " ", NULL); if (SwigType_type(result) != T_VOID) { Printv(w->code, Swig_cresult_name(), " = ", NULL); } Printv(w->code, callback_wname, "(go_val", args, ");\n", NULL); /* Marshal outputs */ for (p = parms; p;) { String *tm; if ((tm = Getattr(p, "tmap:directorargout"))) { tm = Copy(tm); Replaceall(tm, "$result", "jresult"); Replaceall(tm, "$input", Getattr(p, "emit:directorinput")); Printv(w->code, tm, "\n", NIL); Delete(tm); p = Getattr(p, "tmap:directorargout:next"); } else { p = nextSibling(p); } } if (SwigType_type(result) != T_VOID) { String *result_str = NewString("c_result"); String *tm = Swig_typemap_lookup("directorout", n, result_str, NULL); if (!tm) { Swig_warning(WARN_TYPEMAP_DIRECTOROUT_UNDEF, input_file, line_number, "Unable to use type %s as director method result\n", SwigType_str(result, 0)); } else { Replaceall(tm, "$input", Swig_cresult_name()); Replaceall(tm, "$result", "c_result"); Printv(w->code, " ", tm, "\n", NULL); String *retstr = SwigType_rcaststr(result, "c_result"); Printv(w->code, " return ", retstr, ";\n", NULL); Delete(retstr); Delete(tm); } Delete(result_str); } } Delete(callback_wname); } /* ------------------------------------------------------------ * makeDirectorMethodWrapper * * Emit the function wrapper for a director method for cgo. * ------------------------------------------------------------ */ void makeCgoDirectorMethodWrapper(Node *n, Wrapper *w, String *callback_name) { ParmList *parms = Getattr(n, "wrap:parms"); SwigType *result = Getattr(n, "type"); Printv(f_c_directors, "extern \"C\" ", NULL); String *fnname = Copy(callback_name); Append(fnname, "(int"); Parm *p = parms; while (p) { while (checkAttribute(p, "tmap:directorin:numinputs", "0")) { p = Getattr(p, "tmap:directorin:next"); } String *cg = gcCTypeForGoValue(p, Getattr(p, "type"), Getattr(p, "lname")); Printv(fnname, ", ", cg, NULL); Delete(cg); p = Getattr(p, "tmap:directorin:next"); } Printv(fnname, ")", NULL); if (SwigType_type(result) == T_VOID) { Printv(f_c_directors, "void ", fnname, NULL); } else { String *tm = gcCTypeForGoValue(n, result, fnname); Printv(f_c_directors, tm, NULL); Delete(tm); } Delete(fnname); Printv(f_c_directors, ";\n", NULL); if (SwigType_type(result) != T_VOID) { String *r = NewString(Swig_cresult_name()); String *tm = gcCTypeForGoValue(n, result, r); Wrapper_add_local(w, r, tm); Delete(tm); Delete(r); } String *args = NewString(""); p = parms; while (p) { while (checkAttribute(p, "tmap:directorin:numinputs", "0")) { p = Getattr(p, "tmap:directorin:next"); } String *pn = NewString("swig_"); Append(pn, Getattr(p, "lname")); Setattr(p, "emit:directorinput", pn); String *tm = gcCTypeForGoValue(p, Getattr(p, "type"), pn); Wrapper_add_local(w, pn, tm); Delete(tm); tm = Getattr(p, "tmap:directorin"); if (!tm) { Swig_warning(WARN_TYPEMAP_DIRECTORIN_UNDEF, input_file, line_number, "Unable to use type %s as director method argument\n", SwigType_str(Getattr(p, "type"), 0)); } else { tm = Copy(tm); Replaceall(tm, "$input", pn); Replaceall(tm, "$owner", 0); Printv(w->code, " ", tm, "\n", NULL); Delete(tm); Printv(args, ", ", pn, NULL); } p = Getattr(p, "tmap:directorin:next"); } Printv(w->code, " ", NULL); if (SwigType_type(result) != T_VOID) { Printv(w->code, Swig_cresult_name(), " = ", NULL); } Printv(w->code, callback_name, "(go_val", args, ");\n", NULL); /* Marshal outputs */ for (p = parms; p; ) { String *tm; if ((tm = Getattr(p, "tmap:directorargout"))) { tm = Copy(tm); Replaceall(tm, "$result", "jresult"); Replaceall(tm, "$input", Getattr(p, "emit:directorinput")); Printv(w->code, tm, "\n", NULL); Delete(tm); p = Getattr(p, "tmap:directorargout:next"); } else { p = nextSibling(p); } } if (SwigType_type(result) != T_VOID) { String *result_str = NewString("c_result"); String *tm = Swig_typemap_lookup("directorout", n, result_str, NULL); if (!tm) { Swig_warning(WARN_TYPEMAP_DIRECTOROUT_UNDEF, input_file, line_number, "Unable to use type %s as director method result\n", SwigType_str(result, 0)); } else { tm = Copy(tm); Replaceall(tm, "$input", Swig_cresult_name()); Replaceall(tm, "$result", "c_result"); Printv(w->code, " ", tm, "\n", NULL); String *retstr = SwigType_rcaststr(result, "c_result"); Printv(w->code, " return ", retstr, ";\n", NULL); Delete(retstr); Delete(tm); } Delete(result_str); } } /* ------------------------------------------------------------ * classDirectorEnd * * Complete support for a director class. * ------------------------------------------------------------ */ int classDirectorEnd(Node *n) { (void) n; Printv(f_c_directors_h, " private:\n", NULL); Printv(f_c_directors_h, " intgo go_val;\n", NULL); Printv(f_c_directors_h, " Swig_memory *swig_mem;\n", NULL); Printv(f_c_directors_h, "};\n\n", NULL); class_name = NULL; class_node = NULL; Delete(class_receiver); class_receiver = NULL; Delete(class_methods); class_methods = NULL; return SWIG_OK; } /* ------------------------------------------------------------ * classDirectorDisown * * I think Go does not require a disown method. * ------------------------------------------------------------ */ int classDirectorDisown(Node *n) { (void) n; return SWIG_OK; } /*---------------------------------------------------------------------- * buildThrow() * * Build and return a throw clause if needed. *--------------------------------------------------------------------*/ String *buildThrow(Node *n) { if (Getattr(n, "noexcept")) return NewString("noexcept"); ParmList *throw_parm_list = Getattr(n, "throws"); if (!throw_parm_list && !Getattr(n, "throw")) return NULL; String *ret = NewString("throw("); if (throw_parm_list) { Swig_typemap_attach_parms("throws", throw_parm_list, NULL); } bool first = true; for (Parm *p = throw_parm_list; p; p = nextSibling(p)) { if (Getattr(p, "tmap:throws")) { if (first) { first = false; } else { Printv(ret, ", ", NULL); } String *s = SwigType_str(Getattr(p, "type"), 0); Printv(ret, s, NULL); Delete(s); } } Printv(ret, ")", NULL); return ret; } /*---------------------------------------------------------------------- * extraDirectorProtectedCPPMethodsRequired() * * We don't need to check upcall when calling methods. *--------------------------------------------------------------------*/ bool extraDirectorProtectedCPPMethodsRequired() const { return false; } /*---------------------------------------------------------------------- * makeDispatchFunction * * Make a dispatch function for an overloaded C++ function. The * receiver parameter is the receiver for a method, unless is_upcall * is true. If is_upcall is true, then the receiver parameter is * the type of the first argument to the function. *--------------------------------------------------------------------*/ int makeDispatchFunction(Node *n, String *go_name, String *receiver, bool is_static, SwigType *director_struct, bool is_upcall) { bool is_director = director_struct ? true : false; String *nodetype = Getattr(n, "nodeType"); bool is_constructor = Cmp(nodetype, "constructor") == 0; bool is_destructor = Cmp(nodetype, "destructor") == 0; bool can_use_receiver = (!is_constructor && !is_destructor && !is_upcall); bool use_receiver = (!is_static && can_use_receiver); bool add_to_interface = (interfaces && !is_constructor && !is_destructor && !is_static && !is_upcall); List *dispatch = Swig_overload_rank(n, false); int nfunc = Len(dispatch); SwigType *all_result; bool mismatch; if (is_constructor) { assert(!is_upcall); if (!is_director) { all_result = Copy(Getattr(class_node, "classtypeobj")); } else { all_result = Copy(director_struct); } mismatch = false; } else { all_result = NULL; mismatch = false; bool any_void = false; for (int i = 0; i < nfunc; ++i) { Node *nn = Getitem(dispatch, i); Node *ni = Getattr(nn, "directorNode") ? Getattr(nn, "directorNode") : nn; SwigType *result = Getattr(ni, "go:type"); assert(result); if (SwigType_type(result) == T_VOID) { if (all_result) { mismatch = true; } any_void = true; } else { if (any_void) { mismatch = true; } else if (!all_result) { all_result = Copy(result); } else if (Cmp(result, all_result) != 0) { mismatch = true; } } } if (mismatch) { Delete(all_result); all_result = NULL; } else if (all_result) { ; } else { all_result = NewString("void"); } } Printv(f_go_wrappers, "func ", NULL); if (receiver && use_receiver) { Printv(f_go_wrappers, "(p ", receiver, ") ", NULL); } Printv(f_go_wrappers, go_name, "(", NULL); if (is_director && is_constructor) { Printv(f_go_wrappers, "abi interface{}, ", NULL); assert(!add_to_interface); } if (is_upcall) { Printv(f_go_wrappers, "p *", receiver, ", ", NULL); assert(!add_to_interface); } Printv(f_go_wrappers, "a ...interface{})", NULL); if (add_to_interface) { Printv(interfaces, "\t", go_name, "(a ...interface{})", NULL); } if (mismatch) { Printv(f_go_wrappers, " interface{}", NULL); if (add_to_interface) { Printv(interfaces, " interface{}", NULL); } } else if (all_result && SwigType_type(all_result) != T_VOID) { if (is_director && is_constructor) { Printv(f_go_wrappers, " ", receiver, NULL); if (add_to_interface) { Printv(interfaces, " ", receiver, NULL); } } else { String *tm = goType(n, all_result); Printv(f_go_wrappers, " ", tm, NULL); if (add_to_interface) { Printv(interfaces, " ", tm, NULL); } Delete(tm); } } Printv(f_go_wrappers, " {\n", NULL); if (add_to_interface) { Printv(interfaces, "\n", NULL); } Printv(f_go_wrappers, "\targc := len(a)\n", NULL); for (int i = 0; i < nfunc; ++i) { int fn = 0; Node *nn = Getitem(dispatch, i); Node *ni = Getattr(nn, "directorNode") ? Getattr(nn, "directorNode") : nn; Parm *pi = Getattr(ni, "wrap:parms"); // If we are using a receiver, we want to ignore a leading self // parameter. Because of the way this is called, there may or // may not be a self parameter at this point. if (use_receiver && pi && Getattr(pi, "self")) { pi = getParm(pi); if (pi) { pi = nextParm(pi); } } int num_required = emit_num_required(pi); int num_arguments = emit_num_arguments(pi); bool varargs = emit_isvarargs(pi) ? true : false; if (varargs) { Printf(f_go_wrappers, "\tif argc >= %d {\n", num_required); } else { if (num_required == num_arguments) { Printf(f_go_wrappers, "\tif argc == %d {\n", num_required); } else { Printf(f_go_wrappers, "\tif argc >= %d && argc <= %d {\n", num_required, num_arguments); } } // Build list of collisions with the same number of arguments. List *coll = NewList(); for (int k = i + 1; k < nfunc; ++k) { Node *nnk = Getitem(dispatch, k); Node *nk = Getattr(nnk, "directorNode") ? Getattr(nnk, "directorNode") : nnk; Parm *pk = Getattr(nk, "wrap:parms"); if (use_receiver && pk && Getattr(pk, "self")) { pk = getParm(pk); if (pk) { pk = nextParm(pk); } } int nrk = emit_num_required(pk); int nak = emit_num_arguments(pk); if ((nrk >= num_required && nrk <= num_arguments) || (nak >= num_required && nak <= num_arguments) || (nrk <= num_required && nak >= num_arguments) || (varargs && nrk >= num_required)) { Append(coll, nk); } } int num_braces = 0; if (Len(coll) > 0 && num_arguments > 0) { int j = 0; Parm *pj = pi; while (pj) { pj = getParm(pj); if (!pj) { break; } // If all the overloads have the same type in this position, // we can omit the check. SwigType *tm = goOverloadType(pj, Getattr(pj, "type")); bool emitcheck = false; for (int k = 0; k < Len(coll) && !emitcheck; ++k) { Node *nk = Getitem(coll, k); Parm *pk = Getattr(nk, "wrap:parms"); if (use_receiver && pk && Getattr(pk, "self")) { pk = getParm(pk); if (pk) { pk = nextParm(pk); } } int nak = emit_num_arguments(pk); if (nak <= j) continue; int l = 0; Parm *pl = pk; while (pl && l <= j) { pl = getParm(pl); if (!pl) { break; } if (l == j) { SwigType *tml = goOverloadType(pl, Getattr(pl, "type")); if (Cmp(tm, tml) != 0) { emitcheck = true; } Delete(tml); } pl = nextParm(pl); ++l; } } if (emitcheck) { if (j >= num_required) { Printf(f_go_wrappers, "\t\tif argc > %d {\n", j); ++num_braces; } fn = i + 1; Printf(f_go_wrappers, "\t\tif _, ok := a[%d].(%s); !ok {\n", j, tm); Printf(f_go_wrappers, "\t\t\tgoto check_%d\n", fn); Printv(f_go_wrappers, "\t\t}\n", NULL); } Delete(tm); pj = nextParm(pj); ++j; } } for (; num_braces > 0; --num_braces) { Printv(f_go_wrappers, "\t\t}\n", NULL); } // We may need to generate multiple calls if there are variable // argument lists involved. Build the start of the call. String *start = NewString(""); SwigType *result = Getattr(ni, "go:type"); if (is_constructor) { result = all_result; } else if (is_destructor) { result = NULL; } if (result && SwigType_type(result) != T_VOID && (!all_result || SwigType_type(all_result) != T_VOID)) { Printv(start, "return ", NULL); } bool advance_parm = false; if (receiver && use_receiver) { Printv(start, "p.", go_name, NULL); } else if (can_use_receiver && !isStatic(ni) && pi && Getattr(pi, "self")) { // This is an overload of a static function and a non-static // function. assert(num_required > 0); SwigType *tm = goWrapperType(pi, Getattr(pi, "type"), true); String *nm = buildGoName(Getattr(ni, "sym:name"), false, isFriend(ni)); Printv(start, "a[0].(", tm, ").", nm, NULL); Delete(nm); Delete(tm); advance_parm = true; } else { Printv(start, go_name, NULL); } Printv(start, Getattr(ni, "sym:overname"), "(", NULL); bool need_comma = false; if (is_director && is_constructor) { Printv(start, "abi", NULL); need_comma = true; } if (is_upcall) { Printv(start, "p", NULL); need_comma = true; } Parm *p = pi; int pn = 0; if (advance_parm) { p = getParm(p); if (p) { p = nextParm(p); } ++pn; } while (pn < num_required) { p = getParm(p); if (need_comma) { Printv(start, ", ", NULL); } SwigType *tm = goType(p, Getattr(p, "type")); Printf(start, "a[%d].(%s)", pn, tm); Delete(tm); need_comma = true; ++pn; p = nextParm(p); } String *end = NULL; if (!result || SwigType_type(result) == T_VOID || (all_result && SwigType_type(all_result) == T_VOID)) { end = NewString(""); Printv(end, "return", NULL); if (!all_result || SwigType_type(all_result) != T_VOID) { Printv(end, " 0", NULL); } } if (num_required == num_arguments) { Printv(f_go_wrappers, "\t\t", start, ")\n", NULL); if (end) { Printv(f_go_wrappers, "\t\t", end, "\n", NULL); } } else { Printv(f_go_wrappers, "\t\tswitch argc {\n", NULL); for (int j = num_required; j <= num_arguments; ++j) { Printf(f_go_wrappers, "\t\tcase %d:\n", j); Printv(f_go_wrappers, "\t\t\t", start, NULL); bool nc = need_comma; for (int k = num_required; k < j; ++k) { if (nc) { Printv(f_go_wrappers, ", ", NULL); } Printf(f_go_wrappers, "a[%d]", k); nc = true; } Printv(f_go_wrappers, ")\n", NULL); if (end) { Printv(f_go_wrappers, "\t\t\t", end, "\n", NULL); } } Printv(f_go_wrappers, "\t\t}\n", NULL); } Printv(f_go_wrappers, "\t}\n", NULL); if (fn != 0) { Printf(f_go_wrappers, "check_%d:\n", fn); } Delete(coll); } Printv(f_go_wrappers, "\tpanic(\"No match for overloaded function call\")\n", NULL); Printv(f_go_wrappers, "}\n\n", NULL); Delete(all_result); Delete(dispatch); return SWIG_OK; } /* ---------------------------------------------------------------------- * checkFunctionVisibility() * * Return true if we should write out a function based on its * visibility, false otherwise. * ---------------------------------------------------------------------- */ bool checkFunctionVisibility(Node *n, Node *parent) { // Write out a public function. if (is_public(n)) return true; // Don't write out a private function. if (is_private(n)) return false; // Write a protected function for a director class in // dirprot_mode. if (parent == NULL) { return false; } if (dirprot_mode() && Swig_directorclass(parent)) return true; // Otherwise don't write out a protected function. return false; } /* ---------------------------------------------------------------------- * exportedName() * * Given a C/C++ name, return a name in Go which will be exported. * If the first character is an upper case letter, this returns a * copy of its argument. If the first character is a lower case * letter, this forces it to upper case. Otherwise, this prepends * 'X'. * ---------------------------------------------------------------------- */ String *exportedName(String *name) { String *copy = Copy(name); char c = *Char(copy); if (islower(c)) { char l[2]; char u[2]; l[0] = c; l[1] = '\0'; u[0] = toupper(c); u[1] = '\0'; Replace(copy, l, u, DOH_REPLACE_FIRST); } else if (!isalpha(c)) { char l[2]; char u[3]; l[0] = c; l[1] = '\0'; u[0] = 'X'; u[1] = c; u[2] = '\0'; Replace(copy, l, u, DOH_REPLACE_FIRST); } String *ret = Swig_name_mangle(copy); Delete(copy); return ret; } /* ---------------------------------------------------------------------- * removeClassname() * * If the name starts with the current class name, followed by an * underscore, remove it. If there is no current class name, this * simply returns a copy of the name. This undoes Swig's way of * recording the class name in a member name. * ---------------------------------------------------------------------- */ String *removeClassname(String *name) { String *copy = Copy(name); if (class_name) { char *p = Char(name); if (Strncmp(name, class_name, Len(class_name)) == 0 && p[Len(class_name)] == '_') { Replace(copy, class_name, "", DOH_REPLACE_FIRST); Replace(copy, "_", "", DOH_REPLACE_FIRST); } } return copy; } /* ---------------------------------------------------------------------- * buildGoName() * * Build the name to use for an ordinary function, variable, or * whatever in Go. The name argument is something like the sym:name * attribute of the node. If is_static is false, this could be a * method, and the returned name will be the name of the * method--i.e., it will not include the class name. * ---------------------------------------------------------------------- */ String *buildGoName(String *name, bool is_static, bool is_friend) { String *nw = NewString(""); if (is_static && !is_friend && class_name) { String *c1 = exportedName(class_name); Append(nw, c1); Delete(c1); } String *c2 = removeClassname(name); String *c3 = exportedName(c2); Append(nw, c3); Delete(c2); Delete(c3); String *ret = Swig_name_mangle(nw); Delete(nw); return ret; } /* ---------------------------------------------------------------------- * buildGoWrapperName() * * Build the name to use for a Go wrapper function. This is a * function called by the real Go function in order to convert C++ * classes from interfaces to pointers, and other such conversions * between the Go type and the C++ type. * ---------------------------------------------------------------------- */ String *buildGoWrapperName(String *name, String *overname) { String *s1 = NewString("_swig_wrap_"); Append(s1, name); String *s2 = Swig_name_mangle(s1); Delete(s1); if (overname) { Append(s2, overname); } return s2; } /* ---------------------------------------------------------------------- * checkNameConflict() * * Check for a name conflict on the name we are going to use in Go. * These conflicts are likely because of the enforced * capitalization. When we find one, issue a warning and return * false. If the name is OK, return true. * ---------------------------------------------------------------------- */ bool checkNameConflict(String* name, Node* n, const_String_or_char_ptr scope) { Node *lk = symbolLookup(name, scope); if (lk) { String *n1 = Getattr(n, "sym:name"); if (!n1) { n1 = Getattr(n, "name"); } String *n2 = Getattr(lk, "sym:name"); if (!n2) { n2 = Getattr(lk, "name"); } Swig_warning(WARN_GO_NAME_CONFLICT, input_file, line_number, "Ignoring '%s' due to Go name ('%s') conflict with '%s'\n", n1, name, n2); return false; } bool r = addSymbol(name, n, scope) ? true : false; assert(r); return true; } /* ---------------------------------------------------------------------- * checkIgnoredParameters() * * If any of the parameters of this function, or the return type, * are ignored due to a name conflict, give a warning and return * false. * ---------------------------------------------------------------------- */ bool checkIgnoredParameters(Node *n, String *go_name) { ParmList *parms = Getattr(n, "parms"); if (parms) { Wrapper *dummy = NewWrapper(); emit_attach_parmmaps(parms, dummy); int parm_count = emit_num_arguments(parms); Parm *p = parms; for (int i = 0; i < parm_count; ++i) { p = getParm(p); if (!checkIgnoredType(n, go_name, Getattr(p, "type"))) { DelWrapper(dummy); return false; } p = nextParm(p); } DelWrapper(dummy); } if (!checkIgnoredType(n, go_name, Getattr(n, "type"))) { return false; } return true; } /* ---------------------------------------------------------------------- * checkIgnoredType() * * If this type is being ignored due to a name conflict, give a * warning and return false. * ---------------------------------------------------------------------- */ bool checkIgnoredType(Node *n, String *go_name, SwigType *type) { if (hasGoTypemap(n, type)) { return true; } SwigType *t = SwigType_typedef_resolve_all(type); bool ret = true; bool is_conflict = false; Node *e = Language::enumLookup(t); if (e) { if (GetFlag(e, "go:conflict")) { is_conflict = true; } } else if (SwigType_issimple(t)) { Node *cn = classLookup(t); if (cn) { if (GetFlag(cn, "go:conflict")) { is_conflict = true; } } } else if (SwigType_ispointer(t) || SwigType_isarray(t) || SwigType_isqualifier(t) || SwigType_isreference(t)) { SwigType *r = Copy(t); if (SwigType_ispointer(r)) { SwigType_del_pointer(r); } else if (SwigType_isarray(r)) { SwigType_del_array(r); } else if (SwigType_isqualifier(r)) { SwigType_del_qualifier(r); } else { SwigType_del_reference(r); } if (!checkIgnoredType(n, go_name, r)) { ret = false; } Delete(r); } if (is_conflict) { String *s = SwigType_str(t, NULL); Swig_warning(WARN_GO_NAME_CONFLICT, input_file, line_number, "Ignoring '%s' (Go name '%s') due to Go name conflict for parameter or result type '%s'\n", Getattr(n, "name"), go_name, s); Delete(s); ret = false; } Delete(t); return ret; } /* ---------------------------------------------------------------------- * goType() * * Given a SWIG type, return a string for the type in Go. * ---------------------------------------------------------------------- */ String *goType(Node *n, SwigType *type) { return goTypeWithInfo(n, type, false, NULL); } /* ---------------------------------------------------------------------- * goImType() * * Given a SWIG type, return a string for the intermediate Go type * to pass to C/C++. This is like goType except that it looks for * an imtype typemap entry first. * ---------------------------------------------------------------------- */ String *goImType(Node *n, SwigType *type) { return goTypeWithInfo(n, type, true, NULL); } /* ---------------------------------------------------------------------- * goTypeWithInfo() * * Like goType, but return some more information. * * If use_imtype is true, this look for a imtype typemap entry. * * If the p_is_interface parameter is not NULL, this sets * *p_is_interface to indicate whether this type is going to be * represented by a Go interface type. These are cases where the Go * code needs to make some adjustments when passing values back and * forth with C/C++. * ---------------------------------------------------------------------- */ String *goTypeWithInfo(Node *n, SwigType *type, bool use_imtype, bool *p_is_interface) { if (p_is_interface) { *p_is_interface = false; } String *ret = NULL; if (use_imtype) { if (n && Cmp(type, Getattr(n, "type")) == 0) { if (Strcmp(Getattr(n, "nodeType"), "parm") == 0) { ret = Getattr(n, "tmap:imtype"); } if (!ret) { ret = Swig_typemap_lookup("imtype", n, "", NULL); } } else { Parm *p = NewParm(type, "goImType", n); ret = Swig_typemap_lookup("imtype", p, "", NULL); Delete(p); } } if (!ret) { if (n && Cmp(type, Getattr(n, "type")) == 0) { if (Strcmp(Getattr(n, "nodeType"), "parm") == 0) { ret = Getattr(n, "tmap:gotype"); } if (!ret) { ret = Swig_typemap_lookup("gotype", n, "", NULL); } } else { Parm *p = NewParm(type, "goType", n); ret = Swig_typemap_lookup("gotype", p, "", NULL); Delete(p); } } if (ret && Strstr(ret, "$gotypename") != 0) { ret = NULL; } if (ret) { return Copy(ret); } SwigType *t = SwigType_typedef_resolve_all(type); if (SwigType_isenum(t)) { Node *e = Language::enumLookup(t); if (e) { ret = goEnumName(e); } else if (Strcmp(t, "enum ") == 0) { ret = NewString("int"); } else { // An unknown enum - one that has not been parsed (neither a C enum forward reference nor a definition) or an ignored enum String *tt = Copy(t); Replace(tt, "enum ", "", DOH_REPLACE_ANY); ret = exportedName(tt); Setattr(undefined_enum_types, t, ret); Delete(tt); } } else if (SwigType_isfunctionpointer(t) || SwigType_isfunction(t)) { ret = NewString("_swig_fnptr"); } else if (SwigType_ismemberpointer(t)) { ret = NewString("_swig_memberptr"); } else if (SwigType_issimple(t)) { Node *cn = classLookup(t); if (cn) { ret = Getattr(cn, "sym:name"); if (!ret) { ret = Getattr(cn, "name"); } ret = exportedName(ret); Node *cnmod = Getattr(cn, "module"); if (!cnmod || Strcmp(Getattr(cnmod, "name"), module) == 0) { Setattr(undefined_types, t, t); } else { String *nw = NewString(""); Printv(nw, getModuleName(Getattr(cnmod, "name")), ".", ret, NULL); Delete(ret); ret = nw; } } else { // SWIG does not know about this type. ret = exportedName(t); Setattr(undefined_types, t, t); } if (p_is_interface) { *p_is_interface = true; } } else if (SwigType_ispointer(t) || SwigType_isarray(t)) { SwigType *r = Copy(t); if (SwigType_ispointer(r)) { SwigType_del_pointer(r); } else { SwigType_del_array(r); } if (SwigType_type(r) == T_VOID) { ret = NewString("uintptr"); } else { bool is_interface; String *base = goTypeWithInfo(n, r, false, &is_interface); // At the Go level, an unknown or class type is handled as an // interface wrapping a pointer. This means that if a // function returns the C type X, we will be wrapping the C // type X*. In Go we will call that type X. That means that // if a C function expects X*, we can pass the Go type X. And // that means that when we see the C type X*, we should use // the Go type X. // The is_interface variable tells us this. However, it will // be true both for the case of X and for the case of X*. If // r is a pointer here, then we are looking at X**. There is // really no good way for us to handle that. bool is_pointer_to_pointer = false; if (is_interface) { SwigType *c = Copy(r); if (SwigType_isqualifier(c)) { SwigType_del_qualifier(c); if (SwigType_ispointer(c) || SwigType_isarray(c)) { is_pointer_to_pointer = true; } } Delete(c); } if (is_interface) { if (!is_pointer_to_pointer) { ret = base; if (p_is_interface) { *p_is_interface = true; } } else { ret = NewString("uintptr"); } } else { ret = NewString("*"); Append(ret, base); Delete(base); } } Delete(r); } else if (SwigType_isreference(t)) { SwigType *r = Copy(t); SwigType_del_reference(r); // If this is a const reference, and we are looking at a pointer // to it, then we just use the pointer we already have. bool add_pointer = true; if (SwigType_isqualifier(r)) { String *q = SwigType_parm(r); if (Strcmp(q, "const") == 0) { SwigType *c = Copy(r); SwigType_del_qualifier(c); if (SwigType_ispointer(c)) { add_pointer = false; } Delete(c); } } if (add_pointer) { SwigType_add_pointer(r); } ret = goTypeWithInfo(n, r, false, p_is_interface); Delete(r); } else if (SwigType_isqualifier(t)) { SwigType *r = Copy(t); SwigType_del_qualifier(r); ret = goTypeWithInfo(n, r, false, p_is_interface); Delete(r); } else if (SwigType_isvarargs(t)) { ret = NewString("[]interface{}"); } Delete(t); if (!ret) { Swig_warning(WARN_LANG_NATIVE_UNIMPL, input_file, line_number, "No Go typemap defined for %s\n", SwigType_str(type, 0)); ret = NewString("uintptr"); } return ret; } /* ---------------------------------------------------------------------- * cgoTypeForGoValue() * * Given a SWIG type, return a string for the C type to use for the * cgo wrapper code. This always returns a simple identifier, since * it is used in Go code as C.name. * * This sets *c_struct_type if the C type uses a struct where the Go * type uses a simple type. This is true for strings and slices. * When this is true the Go code has to jump through unsafe hoops to * pass the type checker. * ---------------------------------------------------------------------- */ String *cgoTypeForGoValue(Node *n, SwigType *type, bool *c_struct_type) { *c_struct_type = false; bool is_interface; String *go_type = goTypeWithInfo(n, type, true, &is_interface); if (is_interface) { Delete(go_type); return NewString("uintptr_t"); } if (Strcmp(go_type, "uintptr") == 0) { Delete(go_type); return NewString("uintptr_t"); } if (((char*)Char(go_type))[0] == '*') { // Treat all pointers as void*. There is no meaningful type // checking going on here anyhow, and that lets us avoid // worrying about defining the base type of the pointer. Delete(go_type); return NewString("swig_voidp"); } // Check for some Go types that are really pointers under the covers. bool is_hidden_pointer = Strncmp(go_type, "func(", 5) == 0 || Strncmp(go_type, "map[", 4) == 0 || Strncmp(go_type, "chan ", 5) == 0; Delete(go_type); String *ct = Getattr(n, "emit:cgotype"); if (ct) { *c_struct_type = Getattr(n, "emit:cgotypestruct") ? true : false; return Copy(ct); } String *t = Copy(type); if (SwigType_isarray(t)) { SwigType_del_array(t); SwigType_add_pointer(t); } bool add_typedef = true; static int count; ++count; ct = NewStringf("swig_type_%d", count); String *gct = gcCTypeForGoValue(n, t, ct); Delete(t); if (Strncmp(gct, "_gostring_", 10) == 0 || Strncmp(gct, "_goslice_", 9) == 0) { *c_struct_type = true; Setattr(n, "emit:cgotypestruct", type); } else { char *p = Strstr(gct, ct); if (p != NULL && p > (char*)Char(gct) && p[-1] == '*' && p[Len(ct)] == '\0') { // Treat all pointers as void*. See above. Delete(ct); --count; ct = NewString("swig_voidp"); add_typedef = false; if (is_hidden_pointer) { // A Go type that is really a pointer, like func, map, chan, // is being represented in C by a pointer. This is fine, // but we have to memcpy the type rather than simply // converting it. *c_struct_type = true; Setattr(n, "emit:cgotypestruct", type); } } if (Strncmp(gct, "bool ", 5) == 0) { // Change the C++ type bool to the C type _Bool. Replace(gct, "bool", "_Bool", DOH_REPLACE_FIRST); } if (Strncmp(gct, "intgo ", 6) == 0) { // We #define intgo to swig_intgo for the cgo comment. Replace(gct, "intgo", "swig_intgo", DOH_REPLACE_FIRST); } p = Strstr(gct, ct); if (p != NULL && p > (char*)Char(gct) && p[-1] == ' ' && p[Len(ct)] == '\0') { String *q = NewStringWithSize(gct, Len(gct) - Len(ct) - 1); if (validIdentifier(q)) { // This is a simple type name, and we can use it directly. Delete(ct); --count; ct = q; add_typedef = false; } } } if (add_typedef) { Printv(f_cgo_comment_typedefs, "typedef ", gct, ";\n", NULL); } Setattr(n, "emit:cgotype", ct); Delete(gct); return Copy(ct); } /* ---------------------------------------------------------------------- * goWrapperType() * * Given a type, return a string for the type to use for the wrapped * Go function. This function exists because for a C++ class we * need to convert interface and reference types. * ---------------------------------------------------------------------- */ String *goWrapperType(Node *n, SwigType *type, bool is_result) { bool is_interface; String *ret = goTypeWithInfo(n, type, true, &is_interface); // If this is an interface, we want to pass the real type. if (is_interface) { Delete(ret); if (!is_result) { ret = NewString("uintptr"); } else { SwigType *ty = SwigType_typedef_resolve_all(type); while (true) { if (SwigType_ispointer(ty)) { SwigType_del_pointer(ty); } else if (SwigType_isarray(ty)) { SwigType_del_array(ty); } else if (SwigType_isreference(ty)) { SwigType_del_reference(ty); } else if (SwigType_isqualifier(ty)) { SwigType_del_qualifier(ty); } else { break; } } assert(SwigType_issimple(ty)); String *p = goCPointerType(ty, true); Delete(ty); ret = p; } } return ret; } /* ---------------------------------------------------------------------- * goOverloadType() * * Given a type, return the Go type to use when dispatching of * overloaded functions. This is normally just the usual Go type. * However, for a C++ class, the usual Go type is an interface type. * And if that interface type represents a C++ type that SWIG does * not know about, then the interface type generated for any C++ * class will match that interface. So for that case, we match on * the underlying integer type. * * It has to work this way so that we can handle a derived type of a * %ignore'd type. It's unlikely that anybody will have a value of * an undefined type, but we support it because it worked in the * past. * ---------------------------------------------------------------------- */ String *goOverloadType(Node *n, SwigType *type) { SwigType *ty = SwigType_typedef_resolve_all(type); while (true) { if (SwigType_ispointer(ty)) { SwigType_del_pointer(ty); } else if (SwigType_isarray(ty)) { SwigType_del_array(ty); } else if (SwigType_isreference(ty)) { SwigType_del_reference(ty); } else if (SwigType_isqualifier(ty)) { SwigType_del_qualifier(ty); } else { break; } } if (Getattr(undefined_types, ty) && !Getattr(defined_types, ty)) { return goWrapperType(n, type, true); } return goType(n, type); } /* ---------------------------------------------------------------------- * goCPointerType() * * Return the name of the Go type to use for the C pointer value. * The regular C type is the name of an interface type which wraps a * pointer whose name is returned by this function. * ---------------------------------------------------------------------- */ String *goCPointerType(SwigType *type, bool add_to_hash) { SwigType *ty = SwigType_typedef_resolve_all(type); Node *cn = classLookup(ty); String *ex; String *ret; if (!cn) { if (add_to_hash) { Setattr(undefined_types, ty, ty); } ret = NewString("Swigcptr"); ex = exportedName(ty); Append(ret, ex); } else { String *cname = Getattr(cn, "sym:name"); if (!cname) { cname = Getattr(cn, "name"); } ex = exportedName(cname); Node *cnmod = Getattr(cn, "module"); if (!cnmod || Strcmp(Getattr(cnmod, "name"), module) == 0) { if (add_to_hash) { Setattr(undefined_types, ty, ty); } ret = NewString("Swigcptr"); Append(ret, ex); } else { ret = NewString(""); Printv(ret, getModuleName(Getattr(cnmod, "name")), ".Swigcptr", ex, NULL); } } Delete(ty); Delete(ex); return ret; } /* ---------------------------------------------------------------------- * gcCTypeForGoValue() * * Given a type, return the C/C++ type which will be used to catch * the value in Go. This is the 6g/8g version. * ---------------------------------------------------------------------- */ String *gcCTypeForGoValue(Node *n, SwigType *type, String *name) { bool is_interface; String *gt = goTypeWithInfo(n, type, true, &is_interface); String *tail = NewString(""); SwigType *t = SwigType_typedef_resolve_all(type); if (!SwigType_isreference(t)) { while (Strncmp(gt, "*", 1) == 0) { Replace(gt, "*", "", DOH_REPLACE_FIRST); Printv(tail, "*", NULL); } } Delete(t); bool is_string = Strcmp(gt, "string") == 0; bool is_slice = Strncmp(gt, "[]", 2) == 0; bool is_function = Strcmp(gt, "_swig_fnptr") == 0; bool is_member = Strcmp(gt, "_swig_memberptr") == 0; bool is_complex64 = Strcmp(gt, "complex64") == 0; bool is_complex128 = Strcmp(gt, "complex128") == 0; bool is_bool = false; bool is_int8 = false; bool is_int16 = false; bool is_int = Strcmp(gt, "int") == 0 || Strcmp(gt, "uint") == 0; bool is_int32 = false; bool is_int64 = false; bool is_float32 = false; bool is_float64 = false; bool has_typemap = (n != NULL && Getattr(n, "tmap:gotype") != NULL) || hasGoTypemap(n, type); if (has_typemap) { is_bool = Strcmp(gt, "bool") == 0; is_int8 = Strcmp(gt, "int8") == 0 || Strcmp(gt, "uint8") == 0 || Strcmp(gt, "byte") == 0; is_int16 = Strcmp(gt, "int16") == 0 || Strcmp(gt, "uint16") == 0; is_int32 = Strcmp(gt, "int32") == 0 || Strcmp(gt, "uint32") == 0; is_int64 = Strcmp(gt, "int64") == 0 || Strcmp(gt, "uint64") == 0; is_float32 = Strcmp(gt, "float32") == 0; is_float64 = Strcmp(gt, "float64") == 0; } Delete(gt); String *ret; if (is_string) { // Note that we don't turn a reference to a string into a // pointer to a string. Strings are immutable anyhow. ret = NewString(""); Printv(ret, "_gostring_", tail, " ", name, NULL); Delete(tail); return ret; } else if (is_slice) { // Slices are always passed as a _goslice_, whether or not references // are involved. ret = NewString(""); Printv(ret, "_goslice_", tail, " ", name, NULL); Delete(tail); return ret; } else if (is_function || is_member) { ret = NewString(""); Printv(ret, "void*", tail, " ", name, NULL); Delete(tail); return ret; } else if (is_complex64) { ret = NewString("_Complex float "); } else if (is_complex128) { ret = NewString("_Complex double "); } else if (is_interface) { SwigType *t = SwigType_typedef_resolve_all(type); if (SwigType_ispointer(t)) { SwigType_del_pointer(t); } if (SwigType_isreference(t)) { SwigType_del_reference(t); } SwigType_add_pointer(t); ret = SwigType_lstr(t, name); Delete(t); Delete(tail); return ret; } else { SwigType *t = SwigType_typedef_resolve_all(type); if (!has_typemap && SwigType_isreference(t)) { // A const reference to a known type, or to a pointer, is not // mapped to a pointer. SwigType_del_reference(t); if (SwigType_isqualifier(t)) { String *q = SwigType_parm(t); if (Strcmp(q, "const") == 0) { SwigType_del_qualifier(t); if (hasGoTypemap(n, t) || SwigType_ispointer(t)) { if (is_int) { ret = NewString("intgo "); Append(ret, name); } else if (is_int64) { ret = NewString("long long "); Append(ret, name); } else { ret = SwigType_lstr(t, name); } Delete(q); Delete(t); Delete(tail); return ret; } } Delete(q); } } if (Language::enumLookup(t) != NULL) { is_int = true; } else { SwigType *tstripped = SwigType_strip_qualifiers(t); if (SwigType_isenum(tstripped)) is_int = true; Delete(tstripped); } Delete(t); if (is_bool) { ret = NewString("bool "); } else if (is_int8) { ret = NewString("char "); } else if (is_int16) { ret = NewString("short "); } else if (is_int) { ret = NewString("intgo "); } else if (is_int32) { ret = NewString("int "); } else if (is_int64) { ret = NewString("long long "); } else if (is_float32) { ret = NewString("float "); } else if (is_float64) { ret = NewString("double "); } else { Delete(tail); return SwigType_lstr(type, name); } } Append(ret, tail); if (!has_typemap && SwigType_isreference(type)) { Append(ret, "* "); } Append(ret, name); Delete(tail); return ret; } /* ---------------------------------------------------------------------- * gccgoCTypeForGoValue() * * Given a type, return the C/C++ type which will be used to catch * the value in Go. This is the gccgo version. * ---------------------------------------------------------------------- */ String *gccgoCTypeForGoValue(Node *n, SwigType *type, String *name) { return gcCTypeForGoValue(n, type, name); } /* ---------------------------------------------------------------------- * goTypeIsInterface * * Return whether this C++ type is represented as an interface type * in Go. These types require adjustments in the Go code when * passing them back and forth between Go and C++. * ---------------------------------------------------------------------- */ bool goTypeIsInterface(Node *n, SwigType *type) { bool is_interface; Delete(goTypeWithInfo(n, type, false, &is_interface)); return is_interface; } /* ---------------------------------------------------------------------- * hasGoTypemap * * Return whether a type has a "gotype" typemap entry. * ---------------------------------------------------------------------- */ bool hasGoTypemap(Node *n, SwigType *type) { Parm *p = NewParm(type, "test", n); SwigType *tm = Swig_typemap_lookup("gotype", p, "", NULL); Delete(p); if (tm && Strstr(tm, "$gotypename") == 0) { Delete(tm); return true; } Delete(tm); return false; } /* ---------------------------------------------------------------------- * goEnumName() * * Given an enum node, return a string to use for the enum type in Go. * ---------------------------------------------------------------------- */ String *goEnumName(Node *n) { String *ret = Getattr(n, "go:enumname"); if (ret) { return Copy(ret); } if (Equal(Getattr(n, "type"), "enum ")) { return NewString("int"); } String *type = Getattr(n, "enumtype"); assert(type); char *p = Char(type); int len = Len(type); String *s = NewString(""); bool capitalize = true; for (int i = 0; i < len; ++i, ++p) { if (*p == ':') { ++i; ++p; assert(*p == ':'); capitalize = true; } else if (capitalize) { Putc(toupper(*p), s); capitalize = false; } else { Putc(*p, s); } } ret = Swig_name_mangle(s); Delete(s); return ret; } /* ---------------------------------------------------------------------- * getParm() * * Get the real parameter to use. * ---------------------------------------------------------------------- */ Parm *getParm(Parm *p) { while (p && checkAttribute(p, "tmap:in:numinputs", "0")) { p = Getattr(p, "tmap:in:next"); } return p; } /* ---------------------------------------------------------------------- * nextParm() * * Return the next parameter. * ---------------------------------------------------------------------- */ Parm *nextParm(Parm *p) { if (!p) { return NULL; } else if (Getattr(p, "tmap:in")) { return Getattr(p, "tmap:in:next"); } else { return nextSibling(p); } } /* ---------------------------------------------------------------------- * isStatic * * Return whether a node should be considered as static rather than * as a member. * ---------------------------------------------------------------------- */ bool isStatic(Node *n) { String *storage = Getattr(n, "storage"); return (storage && (Swig_storage_isstatic(n) || Strcmp(storage, "friend") == 0) && (!SmartPointer || !Getattr(n, "allocate:smartpointeraccess"))); } /* ---------------------------------------------------------------------- * isFriend * * Return whether a node is a friend. * ---------------------------------------------------------------------- */ bool isFriend(Node *n) { String *storage = Getattr(n, "storage"); return storage && Strcmp(storage, "friend") == 0; } /* ---------------------------------------------------------------------- * goGetattr * * Fetch an attribute from a node but return NULL if it is the empty string. * ---------------------------------------------------------------------- */ Node *goGetattr(Node *n, const char *name) { Node *ret = Getattr(n, name); if (ret != NULL && Len(ret) == 0) { ret = NULL; } return ret; } /* ---------------------------------------------------------------------- * goTypemapLookup * * Look up a typemap but return NULL if it is the empty string. * ---------------------------------------------------------------------- */ String *goTypemapLookup(const char *name, Node *node, const char *lname) { String *ret = Swig_typemap_lookup(name, node, lname, NULL); if (ret != NULL && Len(ret) == 0) { ret = NULL; } return ret; } /* ---------------------------------------------------------------------- * getModuleName * * Return the name of a module. This is different from module path: * "some/path/to/module" -> "module". * ---------------------------------------------------------------------- */ String *getModuleName(String *module_path) { char *suffix = strrchr(Char(module_path), '/'); if (suffix == NULL) { return module_path; } return Str(suffix + 1); } }; /* class GO */ /* ----------------------------------------------------------------------------- * swig_go() - Instantiate module * ----------------------------------------------------------------------------- */ static Language *new_swig_go() { return new GO(); } extern "C" Language *swig_go(void) { return new_swig_go(); } /* ----------------------------------------------------------------------------- * Static member variables * ----------------------------------------------------------------------------- */ // Usage message. const char * const GO::usage = "\ Go Options (available with -go)\n\ -cgo - Generate cgo input files\n\ -no-cgo - Do not generate cgo input files\n\ -gccgo - Generate code for gccgo rather than gc\n\ -go-pkgpath

- Like gccgo -fgo-pkgpath option\n\ -go-prefix

- Like gccgo -fgo-prefix option\n\ -import-prefix

- Prefix to add to %import directives\n\ -intgosize - Set size of Go int type--32 or 64 bits\n\ -package - Set name of the Go package to \n\ -use-shlib - Force use of a shared library\n\ -soname - Set shared library holding C/C++ code to \n\ \n"; swig-4.0.1/Source/Modules/README0000644000175000017500000000047213527063513016103 0ustar williamwilliam06/25/2002 This directory contains all of the SWIG language modules. Many of these modules contain code that dates back to SWIG1.0. The module API has changed a lot in the development releases so this is fairly messy. We're working on cleaning it up, but you'll have to bear with us until it's done. -- Dave swig-4.0.1/Source/Modules/lang.cxx0000644000175000017500000036660713527063513016707 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * lang.cxx * * Language base class functions. Default C++ handling is also implemented here. * ----------------------------------------------------------------------------- */ #include "swigmod.h" #include "cparse.h" #include /* default mode settings */ static int director_mode = 0; static int director_protected_mode = 1; static int all_protected_mode = 0; static int naturalvar_mode = 0; Language *Language::this_ = 0; /* Set director_protected_mode */ void Wrapper_director_mode_set(int flag) { director_mode = flag; } void Wrapper_director_protected_mode_set(int flag) { director_protected_mode = flag; } void Wrapper_all_protected_mode_set(int flag) { all_protected_mode = flag; } void Wrapper_naturalvar_mode_set(int flag) { naturalvar_mode = flag; } extern "C" { int Swig_director_mode() { return director_mode; } int Swig_director_protected_mode() { return director_protected_mode; } int Swig_all_protected_mode() { return all_protected_mode; } void Language_replace_special_variables(String *method, String *tm, Parm *parm) { Language::instance()->replaceSpecialVariables(method, tm, parm); } } /* Some status variables used during parsing */ static int InClass = 0; /* Parsing C++ or not */ static String *ClassName = 0; /* This is the real name of the current class */ static String *EnumClassName = 0; /* Enum class name */ static String *ClassPrefix = 0; /* Class prefix */ static String *EnumClassPrefix = 0; /* Prefix for strongly typed enums (including ClassPrefix) */ static String *NSpace = 0; /* Namespace for the nspace feature */ static String *ClassType = 0; /* Fully qualified type name to use */ static String *DirectorClassName = 0; /* Director name of the current class */ int Abstract = 0; int ImportMode = 0; int IsVirtual = 0; static String *AttributeFunctionGet = 0; static String *AttributeFunctionSet = 0; static Node *CurrentClass = 0; int line_number = 0; String *input_file = 0; int SmartPointer = 0; static Hash *classhash; extern int GenerateDefault; extern int ForceExtern; extern int AddExtern; /* import modes */ #define IMPORT_MODE 1 /* ---------------------------------------------------------------------- * Dispatcher::emit_one() * * Dispatch a single node * ---------------------------------------------------------------------- */ int Dispatcher::emit_one(Node *n) { int ret = SWIG_OK; char *tag = Char(nodeType(n)); if (!tag) { /* Printf(stderr,"SWIG: Fatal internal error. Malformed parse tree node!\n"); */ return SWIG_OK; } /* Do not proceed if marked with an error */ if (Getattr(n, "error")) return SWIG_OK; /* Look for warnings */ String *wrn = Getattr(n, "feature:warnfilter"); if (wrn) Swig_warnfilter(wrn, 1); /* ============================================================ * C/C++ parsing * ============================================================ */ if (strcmp(tag, "extern") == 0) { ret = externDeclaration(n); } else if (strcmp(tag, "cdecl") == 0) { ret = cDeclaration(n); } else if (strcmp(tag, "enum") == 0) { ret = enumDeclaration(n); } else if (strcmp(tag, "enumitem") == 0) { ret = enumvalueDeclaration(n); } else if (strcmp(tag, "enumforward") == 0) { ret = enumforwardDeclaration(n); } else if (strcmp(tag, "class") == 0) { ret = classDeclaration(n); } else if (strcmp(tag, "classforward") == 0) { ret = classforwardDeclaration(n); } else if (strcmp(tag, "constructor") == 0) { ret = constructorDeclaration(n); } else if (strcmp(tag, "destructor") == 0) { ret = destructorDeclaration(n); } else if (strcmp(tag, "access") == 0) { ret = accessDeclaration(n); } else if (strcmp(tag, "using") == 0) { ret = usingDeclaration(n); } else if (strcmp(tag, "namespace") == 0) { ret = namespaceDeclaration(n); } else if (strcmp(tag, "template") == 0) { ret = templateDeclaration(n); } else if (strcmp(tag, "lambda") == 0) { ret = lambdaDeclaration(n); } /* =============================================================== * SWIG directives * =============================================================== */ else if (strcmp(tag, "top") == 0) { ret = top(n); } else if (strcmp(tag, "extend") == 0) { ret = extendDirective(n); } else if (strcmp(tag, "apply") == 0) { ret = applyDirective(n); } else if (strcmp(tag, "clear") == 0) { ret = clearDirective(n); } else if (strcmp(tag, "constant") == 0) { ret = constantDirective(n); } else if (strcmp(tag, "fragment") == 0) { ret = fragmentDirective(n); } else if (strcmp(tag, "import") == 0) { ret = importDirective(n); } else if (strcmp(tag, "include") == 0) { ret = includeDirective(n); } else if (strcmp(tag, "insert") == 0) { ret = insertDirective(n); } else if (strcmp(tag, "module") == 0) { ret = moduleDirective(n); } else if (strcmp(tag, "native") == 0) { ret = nativeDirective(n); } else if (strcmp(tag, "pragma") == 0) { ret = pragmaDirective(n); } else if (strcmp(tag, "typemap") == 0) { ret = typemapDirective(n); } else if (strcmp(tag, "typemapcopy") == 0) { ret = typemapcopyDirective(n); } else if (strcmp(tag, "typemapitem") == 0) { ret = typemapitemDirective(n); } else if (strcmp(tag, "types") == 0) { ret = typesDirective(n); } else { Swig_error(input_file, line_number, "Unrecognized parse tree node type '%s'\n", tag); ret = SWIG_ERROR; } if (wrn) Swig_warnfilter(wrn, 0); return ret; } /* ---------------------------------------------------------------------- * Dispatcher::emit_children() * * Emit all children that match the given type. type = 0 means all types. * ---------------------------------------------------------------------- */ int Dispatcher::emit_children(Node *n) { Node *c; char *eo = Char(Getattr(n, "feature:emitonlychildren")); for (c = firstChild(n); c; c = nextSibling(c)) { if (eo) { const char *tag = Char(nodeType(c)); if (strcmp(tag, "cdecl") == 0) { if (checkAttribute(c, "storage", "typedef")) tag = "typedef"; } if (strstr(eo, tag) == 0) { continue; } } emit_one(c); } return SWIG_OK; } /* Stubs for dispatcher class. We don't do anything by default---up to derived class to fill in traversal code */ int Dispatcher::defaultHandler(Node *) { return SWIG_OK; } int Dispatcher::extendDirective(Node *n) { return defaultHandler(n); } int Dispatcher::applyDirective(Node *n) { return defaultHandler(n); } int Dispatcher::clearDirective(Node *n) { return defaultHandler(n); } int Dispatcher::constantDirective(Node *n) { return defaultHandler(n); } int Dispatcher::fragmentDirective(Node *n) { return defaultHandler(n); } int Dispatcher::importDirective(Node *n) { return defaultHandler(n); } int Dispatcher::includeDirective(Node *n) { return defaultHandler(n); } int Dispatcher::insertDirective(Node *n) { return defaultHandler(n); } int Dispatcher::moduleDirective(Node *n) { return defaultHandler(n); } int Dispatcher::nativeDirective(Node *n) { return defaultHandler(n); } int Dispatcher::pragmaDirective(Node *n) { return defaultHandler(n); } int Dispatcher::typemapDirective(Node *n) { return defaultHandler(n); } int Dispatcher::typemapitemDirective(Node *n) { return defaultHandler(n); } int Dispatcher::typemapcopyDirective(Node *n) { return defaultHandler(n); } int Dispatcher::typesDirective(Node *n) { return defaultHandler(n); } int Dispatcher::cDeclaration(Node *n) { return defaultHandler(n); } int Dispatcher::externDeclaration(Node *n) { return defaultHandler(n); } int Dispatcher::enumDeclaration(Node *n) { return defaultHandler(n); } int Dispatcher::enumvalueDeclaration(Node *n) { return defaultHandler(n); } int Dispatcher::enumforwardDeclaration(Node *n) { return defaultHandler(n); } int Dispatcher::classDeclaration(Node *n) { return defaultHandler(n); } int Dispatcher::templateDeclaration(Node *n) { return defaultHandler(n); } int Dispatcher::lambdaDeclaration(Node *n) { return defaultHandler(n); } int Dispatcher::classforwardDeclaration(Node *n) { return defaultHandler(n); } int Dispatcher::constructorDeclaration(Node *n) { return defaultHandler(n); } int Dispatcher::destructorDeclaration(Node *n) { return defaultHandler(n); } int Dispatcher::accessDeclaration(Node *n) { return defaultHandler(n); } int Dispatcher::usingDeclaration(Node *n) { return defaultHandler(n); } int Dispatcher::namespaceDeclaration(Node *n) { return defaultHandler(n); } /* Allocators */ Language::Language(): none_comparison(NewString("$arg != 0")), director_ctor_code(NewString("")), director_prot_ctor_code(0), symtabs(NewHash()), overloading(0), multiinput(0), cplus_runtime(0), directors(0) { symbolAddScope(""); // create top level/global symbol table scope argc_template_string = NewString("argc"); argv_template_string = NewString("argv[%d]"); /* Default director constructor code, passed to Swig_ConstructorToFunction */ Printv(director_ctor_code, "if ( $comparison ) { /* subclassed */\n", " $director_new \n", "} else {\n", " $nondirector_new \n", "}\n", NIL); /* Default director 'protected' constructor code, disabled by default. Each language that needs it, has to define it. */ director_prot_ctor_code = 0; director_multiple_inheritance = 1; director_language = 0; assert(!this_); this_ = this; doxygenTranslator = NULL; } Language::~Language() { Delete(symtabs); Delete(director_ctor_code); Delete(none_comparison); this_ = 0; } /* ----------------------------------------------------------------------------- * directorClassName() * ----------------------------------------------------------------------------- */ String *Language::directorClassName(Node *n) { String *dirclassname; String *nspace = NewString(Getattr(n, "sym:nspace")); const char *attrib = "director:classname"; String *classname = getClassPrefix(); Replace(nspace, NSPACE_SEPARATOR, "_", DOH_REPLACE_ANY); if (Len(nspace) > 0) dirclassname = NewStringf("SwigDirector_%s_%s", nspace, classname); else dirclassname = NewStringf("SwigDirector_%s", classname); Setattr(n, attrib, dirclassname); Delete(nspace); return dirclassname; } /* ---------------------------------------------------------------------- emit_one() ---------------------------------------------------------------------- */ int Language::emit_one(Node *n) { int ret; int oldext; if (!n) return SWIG_OK; if (GetFlag(n, "feature:ignore") && !Getattr(n, "feature:onlychildren")) return SWIG_OK; oldext = Extend; if (Getattr(n, "feature:extend")) Extend = 1; line_number = Getline(n); input_file = Getfile(n); /* symtab = Getattr(n,"symtab"); if (symtab) { symtab = Swig_symbol_setscope(symtab); } */ ret = Dispatcher::emit_one(n); /* if (symtab) { Swig_symbol_setscope(symtab); } */ Extend = oldext; return ret; } static Parm *nonvoid_parms(Parm *p) { if (p) { SwigType *t = Getattr(p, "type"); if (SwigType_type(t) == T_VOID) return 0; } return p; } /* ----------------------------------------------------------------------------- * cplus_value_type() * * Returns the alternative value type needed in C++ for class value * types. When swig is not sure about using a plain $ltype value, * since the class doesn't have a default constructor, or it can't be * assigned, you will get back 'SwigValueWrapper'. * * ----------------------------------------------------------------------------- */ SwigType *cplus_value_type(SwigType *t) { return SwigType_alttype(t, 0); } static Node *first_nontemplate(Node *n) { while (n) { if (Strcmp(nodeType(n), "template") != 0) return n; n = Getattr(n, "sym:nextSibling"); } return n; } /* -------------------------------------------------------------------------- * swig_pragma() * * Handle swig pragma directives. * -------------------------------------------------------------------------- */ void swig_pragma(char *lang, char *name, char *value) { if (strcmp(lang, "swig") == 0) { if ((strcmp(name, "make_default") == 0) || ((strcmp(name, "makedefault") == 0))) { GenerateDefault = 1; } else if ((strcmp(name, "no_default") == 0) || ((strcmp(name, "nodefault") == 0))) { Swig_warning(WARN_DEPRECATED_NODEFAULT, "SWIG", 1, "dangerous, use %%nodefaultctor, %%nodefaultdtor instead.\n"); GenerateDefault = 0; } else if (strcmp(name, "attributefunction") == 0) { String *nvalue = NewString(value); char *s = strchr(Char(nvalue), ':'); if (!s) { Swig_error(input_file, line_number, "Bad value for attributefunction. Expected \"fmtget:fmtset\".\n"); } else { *s = 0; AttributeFunctionGet = NewString(Char(nvalue)); AttributeFunctionSet = NewString(s + 1); } Delete(nvalue); } else if (strcmp(name, "noattributefunction") == 0) { AttributeFunctionGet = 0; AttributeFunctionSet = 0; } } } /* -------------------------------------------------------------------------- * Language::use_naturalvar_mode() * * Determine whether to use const ref typemaps instead of pointer typemaps * for variable access. * -------------------------------------------------------------------------- */ int Language::use_naturalvar_mode(Node *n) const { if (Getattr(n, "unnamed")) return 0; // The naturalvar feature can be attached to either the variable name or the variable's type // naturalvar on the variable name is more specific and overrides naturalvar on the variable's type String *naturalvar = Getattr(n, "feature:naturalvar"); bool explicitly_off = naturalvar && Strcmp(naturalvar, "0") == 0; int nvar = GetFlag(n, "feature:naturalvar"); if (!explicitly_off && !nvar) { /* look for feature in the class */ SwigType *ty = Getattr(n, "type"); SwigType *fullty = SwigType_typedef_resolve_all(ty); if (SwigType_isclass(fullty)) { SwigType *tys = SwigType_strip_qualifiers(fullty); if (!CPlusPlus) { Replaceall(tys, "struct ", ""); Replaceall(tys, "union ", ""); Replaceall(tys, "class ", ""); } Node *typenode = Swig_symbol_clookup(tys, 0); if (typenode) { naturalvar = Getattr(typenode, "feature:naturalvar"); explicitly_off = naturalvar && Strcmp(naturalvar, "0") == 0; nvar = nvar || GetFlag(typenode, "feature:naturalvar"); } Delete(tys); } Delete(fullty); } nvar = nvar || naturalvar_mode; return explicitly_off ? 0 : nvar ? CWRAP_NATURAL_VAR : 0; } /* ---------------------------------------------------------------------- * Language::top() - Top of parsing tree * ---------------------------------------------------------------------- */ int Language::top(Node *n) { Node *mod = Getattr(n, "module"); if (mod) { Node *options = Getattr(mod, "options"); if (options) { if (Getattr(options, "naturalvar")) { naturalvar_mode = 1; } } } classhash = Getattr(n, "classes"); return emit_children(n); } /* ---------------------------------------------------------------------- * Language::extendDirective() * ---------------------------------------------------------------------- */ int Language::extendDirective(Node *n) { save_value oldam(Extend, CWRAP_EXTEND); save_value oldmode(cplus_mode, PUBLIC); emit_children(n); return SWIG_OK; } /* ---------------------------------------------------------------------- * Language::applyDirective() * ---------------------------------------------------------------------- */ int Language::applyDirective(Node *n) { Parm *pattern = Getattr(n, "pattern"); Node *c = firstChild(n); while (c) { Parm *apattern = Getattr(c, "pattern"); if (ParmList_len(pattern) != ParmList_len(apattern)) { Swig_error(input_file, line_number, "Can't apply (%s) to (%s). Number of arguments don't match.\n", ParmList_str(pattern), ParmList_str(apattern)); } else { if (!Swig_typemap_apply(pattern, apattern)) { Swig_warning(WARN_TYPEMAP_APPLY_UNDEF, input_file, line_number, "Can't apply (%s). No typemaps are defined.\n", ParmList_str(pattern)); } } c = nextSibling(c); } return SWIG_OK; } /* ---------------------------------------------------------------------- * Language::clearDirective() * ---------------------------------------------------------------------- */ int Language::clearDirective(Node *n) { Node *p; for (p = firstChild(n); p; p = nextSibling(p)) { ParmList *pattern = Getattr(p, "pattern"); Swig_typemap_clear_apply(pattern); } return SWIG_OK; } /* ---------------------------------------------------------------------- * Language::constantDirective() * ---------------------------------------------------------------------- */ int Language::constantDirective(Node *n) { if (CurrentClass && (cplus_mode != PUBLIC)) return SWIG_NOWRAP; if (!GetFlag(n, "feature:allowexcept")) { UnsetFlag(n, "feature:except"); } if (Getattr(n, "feature:exceptvar")) { Setattr(n, "feature:except", Getattr(n, "feature:exceptvar")); } if (!ImportMode) { Swig_require("constantDirective", n, "name", "?value", NIL); String *name = Getattr(n, "name"); String *value = Getattr(n, "value"); if (!value) { value = Copy(name); } else { /* if (checkAttribute(n,"type","char")) { value = NewString(value); } else { value = NewStringf("%(escape)s", value); } */ Setattr(n, "rawvalue", value); value = NewStringf("%(escape)s", value); if (!Len(value)) Append(value, "\\0"); /* Printf(stdout,"'%s' = '%s'\n", name, value); */ } Setattr(n, "value", value); this->constantWrapper(n); Swig_restore(n); return SWIG_OK; } return SWIG_NOWRAP; } /* ---------------------------------------------------------------------- * Language::fragmentDirective() * ---------------------------------------------------------------------- */ int Language::fragmentDirective(Node *n) { if (!(Getattr(n, "emitonly") && ImportMode)) Swig_fragment_register(n); return SWIG_OK; } /* ---------------------------------------------------------------------- * Language::importDirective() * ---------------------------------------------------------------------- */ int Language::importDirective(Node *n) { int oldim = ImportMode; ImportMode = IMPORT_MODE; emit_children(n); ImportMode = oldim; return SWIG_OK; } /* ---------------------------------------------------------------------- * Language::includeDirective() * ---------------------------------------------------------------------- */ int Language::includeDirective(Node *n) { emit_children(n); return SWIG_OK; } /* ---------------------------------------------------------------------- * Language::insertDirective() * ---------------------------------------------------------------------- */ int Language::insertDirective(Node *n) { /* %insert directive */ if ((!ImportMode) || Getattr(n, "generated")) { String *code = Getattr(n, "code"); String *section = Getattr(n, "section"); File *f = 0; if (!section) { /* %{ ... %} */ f = Swig_filebyname("header"); } else { f = Swig_filebyname(section); } if (f) { Printf(f, "%s\n", code); } else { Swig_error(input_file, line_number, "Unknown target '%s' for %%insert directive.\n", section); } return SWIG_OK; } else { return SWIG_NOWRAP; } } /* ---------------------------------------------------------------------- * Language::moduleDirective() * ---------------------------------------------------------------------- */ int Language::moduleDirective(Node *n) { (void) n; /* %module directive */ return SWIG_OK; } /* ---------------------------------------------------------------------- * Language::nativeDirective() * ---------------------------------------------------------------------- */ int Language::nativeDirective(Node *n) { if (!ImportMode) { return nativeWrapper(n); } else { return SWIG_NOWRAP; } } /* ---------------------------------------------------------------------- * Language::pragmaDirective() * ---------------------------------------------------------------------- */ int Language::pragmaDirective(Node *n) { /* %pragma directive */ if (!ImportMode) { String *lan = Getattr(n, "lang"); String *name = Getattr(n, "name"); String *value = Getattr(n, "value"); swig_pragma(Char(lan), Char(name), Char(value)); /* pragma(Char(lan),Char(name),Char(value)); */ return SWIG_OK; } return SWIG_OK; } /* ---------------------------------------------------------------------- * Language::typemapDirective() * ---------------------------------------------------------------------- */ int Language::typemapDirective(Node *n) { /* %typemap directive */ String *method = Getattr(n, "method"); String *code = Getattr(n, "code"); Parm *kwargs = Getattr(n, "kwargs"); Node *items = firstChild(n); static int namewarn = 0; if (code && (Strstr(code, "$source") || (Strstr(code, "$target")))) { Swig_warning(WARN_TYPEMAP_SOURCETARGET, Getfile(n), Getline(n), "Deprecated typemap feature ($source/$target).\n"); if (!namewarn) { Swig_warning(WARN_TYPEMAP_SOURCETARGET, Getfile(n), Getline(n), "The use of $source and $target in a typemap declaration is deprecated.\n\ For typemaps related to argument input (in,ignore,default,arginit,check), replace\n\ $source by $input and $target by $1. For typemaps related to return values (out,\n\ argout,ret,except), replace $source by $1 and $target by $result. See the file\n\ Doc/Manual/Typemaps.html for complete details.\n"); namewarn = 1; } } if (Strcmp(method, "except") == 0) { Swig_warning(WARN_DEPRECATED_EXCEPT_TM, Getfile(n), Getline(n), "%%typemap(except) is deprecated. Use the %%exception directive.\n"); } if (Strcmp(method, "in") == 0) { Hash *k; k = kwargs; while (k) { if (checkAttribute(k, "name", "numinputs")) { if (!multiinput && (GetInt(k, "value") > 1)) { Swig_error(Getfile(n), Getline(n), "Multiple-input typemaps (numinputs > 1) not supported by this target language module.\n"); return SWIG_ERROR; } break; } k = nextSibling(k); } if (!k) { k = NewHash(); Setattr(k, "name", "numinputs"); Setattr(k, "value", "1"); set_nextSibling(k, kwargs); Setattr(n, "kwargs", k); kwargs = k; } } if (Strcmp(method, "ignore") == 0) { Swig_warning(WARN_DEPRECATED_IGNORE_TM, Getfile(n), Getline(n), "%%typemap(ignore) has been replaced by %%typemap(in,numinputs=0).\n"); Clear(method); Append(method, "in"); Hash *k = NewHash(); Setattr(k, "name", "numinputs"); Setattr(k, "value", "0"); set_nextSibling(k, kwargs); Setattr(n, "kwargs", k); kwargs = k; } /* Replace $descriptor() macros */ if (code) { Setfile(code, Getfile(n)); Setline(code, Getline(n)); Swig_cparse_replace_descriptor(code); } while (items) { Parm *pattern = Getattr(items, "pattern"); Parm *parms = Getattr(items, "parms"); if (code) { Swig_typemap_register(method, pattern, code, parms, kwargs); } else { Swig_typemap_clear(method, pattern); } items = nextSibling(items); } return SWIG_OK; } /* ---------------------------------------------------------------------- * Language::typemapcopyDirective() * ---------------------------------------------------------------------- */ int Language::typemapcopyDirective(Node *n) { String *method = Getattr(n, "method"); Parm *pattern = Getattr(n, "pattern"); Node *items = firstChild(n); int nsrc = 0; nsrc = ParmList_len(pattern); while (items) { ParmList *npattern = Getattr(items, "pattern"); if (nsrc != ParmList_len(npattern)) { Swig_error(input_file, line_number, "Can't copy typemap. Number of types differ.\n"); } else { if (Swig_typemap_copy(method, pattern, npattern) < 0) { Swig_error(input_file, line_number, "Can't copy typemap (%s) %s = %s\n", method, ParmList_str(pattern), ParmList_str(npattern)); } } items = nextSibling(items); } return SWIG_OK; } /* ---------------------------------------------------------------------- * Language::typesDirective() * ---------------------------------------------------------------------- */ int Language::typesDirective(Node *n) { Parm *parms = Getattr(n, "parms"); String *convcode = Getattr(n, "convcode"); /* optional user supplied conversion code for custom casting */ while (parms) { SwigType *t = Getattr(parms, "type"); String *v = Getattr(parms, "value"); if (!v) { SwigType_remember(t); } else { if (SwigType_issimple(t)) { SwigType_inherit(t, v, 0, convcode); } } parms = nextSibling(parms); } return SWIG_OK; } /* ---------------------------------------------------------------------- * Language::cDeclaration() * ---------------------------------------------------------------------- */ int Language::cDeclaration(Node *n) { String *name = Getattr(n, "name"); String *symname = Getattr(n, "sym:name"); SwigType *type = Getattr(n, "type"); SwigType *decl = Getattr(n, "decl"); String *storage = Getattr(n, "storage"); Node *over; File *f_header = 0; SwigType *ty, *fullty; if (Getattr(n, "feature:onlychildren")) { if (GetFlag(n, "feature:ignore")) { return SWIG_NOWRAP; } else { // Found an unignored templated method that has an empty template instantiation (%template()) // Ignore it unless it has been %rename'd if (Strncmp(symname, "__dummy_", 8) == 0 && Cmp(storage, "typedef") != 0) { SetFlag(n, "feature:ignore"); Swig_warning(WARN_LANG_TEMPLATE_METHOD_IGNORE, input_file, line_number, "%%template() contains no name. Template method ignored: %s\n", Swig_name_decl(n)); return SWIG_NOWRAP; } } } /* discards nodes following the access control rules */ if (cplus_mode != PUBLIC || !is_public(n)) { /* except for friends, they are not affected by access control */ int isfriend = Cmp(storage, "friend") == 0; if (!isfriend) { /* Check what the director needs. If the method is pure virtual, it is always needed. * Also wrap non-virtual protected members if asked for (allprotected mode). */ if (!(directorsEnabled() && ((is_member_director(CurrentClass, n) && need_nonpublic_member(n)) || isNonVirtualProtectedAccess(n)))) { return SWIG_NOWRAP; } // Prevent wrapping protected overloaded director methods more than once - // This bit of code is only needed due to the cDeclaration call in classHandler() String *wrapname = NewStringf("nonpublic_%s%s", symname, Getattr(n, "sym:overname")); if (Getattr(CurrentClass, wrapname)) { Delete(wrapname); return SWIG_NOWRAP; } SetFlag(CurrentClass, wrapname); Delete(wrapname); } } if (Cmp(storage, "typedef") == 0) { Swig_save("cDeclaration", n, "type", NIL); SwigType *t = Copy(type); if (t) { SwigType_push(t, decl); Setattr(n, "type", t); typedefHandler(n); } Swig_restore(n); return SWIG_OK; } /* If in import mode, we proceed no further */ if (ImportMode) return SWIG_NOWRAP; /* If we're in extend mode and there is code, replace the $descriptor macros */ if (Extend) { String *code = Getattr(n, "code"); if (code) { Setfile(code, Getfile(n)); Setline(code, Getline(n)); Swig_cparse_replace_descriptor(code); } } /* Overloaded symbol check */ over = Swig_symbol_isoverloaded(n); if (!overloading) { if (over) over = first_nontemplate(over); if (over && (over != n)) { Swig_warning(WARN_LANG_OVERLOAD_DECL, input_file, line_number, "Overloaded declaration ignored. %s\n", Swig_name_decl(n)); Swig_warning(WARN_LANG_OVERLOAD_DECL, Getfile(over), Getline(over), "Previous declaration is %s\n", Swig_name_decl(over)); return SWIG_NOWRAP; } } if (!validIdentifier(symname)) { Swig_warning(WARN_LANG_IDENTIFIER, input_file, line_number, "Can't wrap '%s' unless renamed to a valid identifier.\n", SwigType_namestr(symname)); return SWIG_NOWRAP; } ty = NewString(type); SwigType_push(ty, decl); fullty = SwigType_typedef_resolve_all(ty); if (SwigType_isfunction(fullty)) { if (!SwigType_isfunction(ty)) { Delete(ty); ty = fullty; fullty = 0; ParmList *parms = SwigType_function_parms(ty, n); Setattr(n, "parms", parms); } /* Transform the node into a 'function' node and emit */ if (!CurrentClass) { f_header = Swig_filebyname("header"); if (AddExtern) { if (f_header) { if (Swig_storage_isextern(n) || (ForceExtern && !storage)) { /* we don't need the 'extern' part in the C/C++ declaration, and it produces some problems when namespace and SUN Studio is used. Printf(f_header,"extern %s", SwigType_str(ty,name)); In fact generating extern declarations is quite error prone and is no longer the default. Getting it right seems impossible with namespaces and default arguments and when a method is declared with the various Windows calling conventions - SWIG doesn't understand Windows (non standard) calling conventions in the first place, so can't regenerate them. */ String *str = SwigType_str(ty, name); Printf(f_header, "%s", str); Delete(str); { DOH *t = Getattr(n, "throws"); if (t) { Printf(f_header, " throw("); while (t) { Printf(f_header, "%s", Getattr(t, "type")); t = nextSibling(t); if (t) Printf(f_header, ","); } Printf(f_header, ")"); } } Printf(f_header, ";\n"); } else if (Swig_storage_isexternc(n)) { /* here 'extern "C"' is needed */ String *str = SwigType_str(ty, name); Printf(f_header, "extern \"C\" %s;\n", str); Delete(str); } } } } /* This needs to check qualifiers */ if (SwigType_isqualifier(ty)) { SwigType *qual = SwigType_pop(ty); Setattr(n, "qualifier", qual); Delete(qual); } Delete(SwigType_pop_function(ty)); DohIncref(type); Setattr(n, "type", ty); functionHandler(n); Setattr(n, "type", type); Delete(ty); Delete(type); return SWIG_OK; } else { /* Some kind of variable declaration */ String *declaration = Copy(decl); Delattr(n, "decl"); if (!CurrentClass) { if (Swig_storage_isextern(n) || ForceExtern) { if (AddExtern) { f_header = Swig_filebyname("header"); if (f_header) { String *str = SwigType_str(ty, name); Printf(f_header, "%s %s;\n", Getattr(n, "storage"), str); Delete(str); } } } } if (!SwigType_ismutable(ty)) { SetFlag(n, "feature:immutable"); } /* If an array and elements are const, then read-only */ if (SwigType_isarray(ty)) { SwigType *tya = SwigType_array_type(ty); if (SwigType_isconst(tya)) { SetFlag(n, "feature:immutable"); } Delete(tya); } DohIncref(type); Setattr(n, "type", ty); variableHandler(n); Setattr(n, "type", type); Setattr(n, "decl", declaration); Delete(ty); Delete(type); Delete(fullty); return SWIG_OK; } } /* ---------------------------------------------------------------------- * Language::functionHandler() * ---------------------------------------------------------------------- */ int Language::functionHandler(Node *n) { String *storage = Getattr(n, "storage"); int isfriend = CurrentClass && Cmp(storage, "friend") == 0; int isstatic = CurrentClass && Swig_storage_isstatic(n) && !(SmartPointer && Getattr(n, "allocate:smartpointeraccess")); Parm *p = Getattr(n, "parms"); if (GetFlag(n, "feature:del")) { /* the method acts like a delete operator, ie, we need to disown the parameter */ if (CurrentClass && !isstatic && !isfriend) { SetFlag(n, "feature:self:disown"); } else { if (p) SetFlag(p, "wrap:disown"); } } if (!CurrentClass) { globalfunctionHandler(n); } else { if (isstatic) { staticmemberfunctionHandler(n); } else if (isfriend) { int oldInClass = InClass; InClass = 0; globalfunctionHandler(n); InClass = oldInClass; } else { // This is a member function, set a flag so the documentation type is correct SetFlag(n, "memberfunction"); Node *explicit_n = 0; if (directorsEnabled() && is_member_director(CurrentClass, n) && !extraDirectorProtectedCPPMethodsRequired()) { bool virtual_but_not_pure_virtual = (!(Cmp(storage, "virtual")) && (Cmp(Getattr(n, "value"), "0") != 0)); if (virtual_but_not_pure_virtual) { // Add additional wrapper which makes an explicit call to the virtual method (ie not a virtual call) explicit_n = Copy(n); String *new_symname = Copy(Getattr(n, "sym:name")); String *suffix = Getattr(parentNode(n), "sym:name"); Printv(new_symname, "SwigExplicit", suffix, NIL); Setattr(explicit_n, "sym:name", new_symname); Delattr(explicit_n, "storage"); Delattr(explicit_n, "override"); Delattr(explicit_n, "hides"); SetFlag(explicit_n, "explicitcall"); Setattr(n, "explicitcallnode", explicit_n); } } memberfunctionHandler(n); if (explicit_n) { memberfunctionHandler(explicit_n); Delattr(explicit_n, "explicitcall"); Delete(explicit_n); } } } return SWIG_OK; } /* ---------------------------------------------------------------------- * Language::globalfunctionHandler() * ---------------------------------------------------------------------- */ int Language::globalfunctionHandler(Node *n) { Swig_require("globalfunctionHandler", n, "name", "sym:name", "type", "?parms", NIL); String *name = Getattr(n, "name"); String *symname = Getattr(n, "sym:name"); SwigType *type = Getattr(n, "type"); ParmList *parms = Getattr(n, "parms"); /* Check for callback mode */ String *cb = GetFlagAttr(n, "feature:callback"); if (cb) { String *cbname = Getattr(n, "feature:callback:name"); if (!cbname) { cbname = NewStringf(cb, symname); Setattr(n, "feature:callback:name", cbname); } callbackfunctionHandler(n); if (Cmp(cbname, symname) == 0) { Delete(cbname); Swig_restore(n); return SWIG_NOWRAP; } Delete(cbname); } Setattr(n, "parms", nonvoid_parms(parms)); String *extendname = Getattr(n, "extendname"); String *call = Swig_cfunction_call(extendname ? extendname : name, parms); String *cres = Swig_cresult(type, Swig_cresult_name(), call); Setattr(n, "wrap:action", cres); Delete(cres); Delete(call); functionWrapper(n); Swig_restore(n); return SWIG_OK; } /* ---------------------------------------------------------------------- * Language::callbackfunctionHandler() * ---------------------------------------------------------------------- */ int Language::callbackfunctionHandler(Node *n) { Swig_require("callbackfunctionHandler", n, "name", "*sym:name", "*type", "?value", NIL); String *type = Getattr(n, "type"); String *name = Getattr(n, "name"); String *parms = Getattr(n, "parms"); String *cbname = Getattr(n, "feature:callback:name"); String *calltype = NewStringf("(%s (*)(%s))(%s)", SwigType_str(type, 0), ParmList_str(parms), SwigType_namestr(name)); SwigType *cbty = Copy(type); SwigType_add_function(cbty, parms); SwigType_add_pointer(cbty); Setattr(n, "sym:name", cbname); Setattr(n, "type", cbty); Setattr(n, "value", calltype); Node *ns = symbolLookup(cbname); if (!ns) constantWrapper(n); Delete(cbty); Swig_restore(n); return SWIG_OK; } /* ---------------------------------------------------------------------- * Language::memberfunctionHandler() * ---------------------------------------------------------------------- */ int Language::memberfunctionHandler(Node *n) { Swig_require("memberfunctionHandler", n, "*name", "*sym:name", "*type", "?parms", "?value", NIL); String *storage = Getattr(n, "storage"); String *name = Getattr(n, "name"); String *symname = Getattr(n, "sym:name"); SwigType *type = Getattr(n, "type"); String *value = Getattr(n, "value"); ParmList *parms = Getattr(n, "parms"); String *cb = GetFlagAttr(n, "feature:callback"); if (Cmp(storage, "virtual") == 0) { if (Cmp(value, "0") == 0) { IsVirtual = PURE_VIRTUAL; } else { IsVirtual = PLAIN_VIRTUAL; } } else { IsVirtual = 0; } if (cb) { Node *cbn = NewHash(); String *cbname = Getattr(n, "feature:callback:name"); if (!cbname) { cbname = NewStringf(cb, symname); } SwigType *cbty = Copy(type); SwigType_add_function(cbty, parms); SwigType_add_memberpointer(cbty, ClassName); String *cbvalue = NewStringf("&%s::%s", ClassName, name); Setattr(cbn, "sym:name", cbname); Setattr(cbn, "type", cbty); Setattr(cbn, "value", cbvalue); Setattr(cbn, "name", name); Setfile(cbn, Getfile(n)); Setline(cbn, Getline(n)); memberconstantHandler(cbn); Setattr(n, "feature:callback:name", Swig_name_member(NSpace, ClassPrefix, cbname)); Delete(cb); Delete(cbn); Delete(cbvalue); Delete(cbty); Delete(cbname); if (Cmp(cbname, symname) == 0) { Swig_restore(n); return SWIG_NOWRAP; } } String *fname = Swig_name_member(NSpace, ClassPrefix, symname); if (Extend && SmartPointer) { if (!Getattr(n, "extendsmartclassname")) { Setattr(n, "extendsmartclassname", Getattr(CurrentClass, "allocate:smartpointerpointeeclassname")); } } // Set up the type for the cast to this class for use when wrapping const director (virtual) methods. // Note: protected director methods or when allprotected mode turned on. String *director_type = 0; if (!is_public(n) && (is_member_director(CurrentClass, n) || GetFlag(n, "explicitcall") || isNonVirtualProtectedAccess(n))) { director_type = Copy(DirectorClassName); String *qualifier = Getattr(n, "qualifier"); if (qualifier) SwigType_push(director_type, qualifier); SwigType_add_pointer(director_type); } int DirectorExtraCall = 0; if (directorsEnabled() && is_member_director(CurrentClass, n) && !SmartPointer) if (extraDirectorProtectedCPPMethodsRequired()) DirectorExtraCall = CWRAP_DIRECTOR_TWO_CALLS; if (GetFlag(n, "explicitcall")) DirectorExtraCall = CWRAP_DIRECTOR_ONE_CALL; int extendmember = GetFlag(n, "isextendmember") ? Extend : 0; int flags = Getattr(n, "template") ? extendmember | SmartPointer : Extend | SmartPointer | DirectorExtraCall; Swig_MethodToFunction(n, NSpace, ClassType, flags, director_type, is_member_director(CurrentClass, n)); Setattr(n, "sym:name", fname); /* Explicitly save low-level and high-level documentation names */ Setattr(n, "doc:low:name", fname); Setattr(n, "doc:high:name", symname); functionWrapper(n); Delete(director_type); Delete(fname); Swig_restore(n); return SWIG_OK; } /* ---------------------------------------------------------------------- * Language::staticmemberfunctionHandler() * ---------------------------------------------------------------------- */ int Language::staticmemberfunctionHandler(Node *n) { Swig_require("staticmemberfunctionHandler", n, "*name", "*sym:name", "*type", NIL); Swig_save("staticmemberfunctionHandler", n, "storage", NIL); String *name = Getattr(n, "name"); String *symname = Getattr(n, "sym:name"); SwigType *type = Getattr(n, "type"); ParmList *parms = Getattr(n, "parms"); String *cb = GetFlagAttr(n, "feature:callback"); String *cname, *mrename; if (!Extend) { Node *sb = Getattr(n, "cplus:staticbase"); String *sname = Getattr(sb, "name"); if (isNonVirtualProtectedAccess(n)) cname = NewStringf("%s::%s", DirectorClassName, name); else cname = NewStringf("%s::%s", sname, name); } else { String *mname = Swig_name_mangle(ClassName); cname = Swig_name_member(NSpace, mname, name); Delete(mname); } mrename = Swig_name_member(NSpace, ClassPrefix, symname); if (Extend) { String *code = Getattr(n, "code"); String *defaultargs = Getattr(n, "defaultargs"); String *mangled = Swig_name_mangle(mrename); Delete(mrename); mrename = mangled; if (Getattr(n, "sym:overloaded") && code) { Append(cname, Getattr(defaultargs ? defaultargs : n, "sym:overname")); } if (!defaultargs && code) { /* Hmmm. An added static member. We have to create a little wrapper for this */ String *mangled_cname = Swig_name_mangle(cname); Swig_add_extension_code(n, mangled_cname, parms, type, code, CPlusPlus, 0); Setattr(n, "extendname", mangled_cname); Delete(mangled_cname); } } Setattr(n, "name", cname); Setattr(n, "sym:name", mrename); /* Explicitly save low-level and high-level documentation names */ Setattr(n, "doc:low:name", mrename); Setattr(n, "doc:high:name", symname); if (cb) { String *cbname = NewStringf(cb, symname); Setattr(n, "feature:callback:name", Swig_name_member(NSpace, ClassPrefix, cbname)); Setattr(n, "feature:callback:staticname", name); } Delattr(n, "storage"); globalfunctionHandler(n); Delete(cname); Delete(mrename); Swig_restore(n); return SWIG_OK; } /* ---------------------------------------------------------------------- * Language::variableHandler() * ---------------------------------------------------------------------- */ int Language::variableHandler(Node *n) { /* If not a smart-pointer access or added method. We clear feature:except. There is no way C++ or C would throw an exception merely for accessing a member data. Caveat: Some compilers seem to route attribute access through methods which can generate exceptions. The feature:allowexcept allows this. Also, the feature:exceptvar can be used to match only variables. */ if (!(Extend | SmartPointer)) { if (!GetFlag(n, "feature:allowexcept")) { UnsetFlag(n, "feature:except"); } if (Getattr(n, "feature:exceptvar")) { Setattr(n, "feature:except", Getattr(n, "feature:exceptvar")); } } if (!CurrentClass) { globalvariableHandler(n); } else { Swig_save("variableHandler", n, "feature:immutable", NIL); if (SmartPointer) { /* If a smart-pointer and it's a constant access, we have to set immutable */ if (!Getattr(CurrentClass, "allocate:smartpointermutable")) { SetFlag(n, "feature:immutable"); } } if (Swig_storage_isstatic(n) && !(SmartPointer && Getattr(n, "allocate:smartpointeraccess"))) { staticmembervariableHandler(n); } else { membervariableHandler(n); } Swig_restore(n); } return SWIG_OK; } /* ---------------------------------------------------------------------- * Language::globalvariableHandler() * ---------------------------------------------------------------------- */ int Language::globalvariableHandler(Node *n) { variableWrapper(n); return SWIG_OK; } /* ---------------------------------------------------------------------- * Language::membervariableHandler() * ---------------------------------------------------------------------- */ int Language::membervariableHandler(Node *n) { Swig_require("membervariableHandler", n, "*name", "*sym:name", "*type", NIL); Swig_save("membervariableHandler", n, "parms", NIL); String *name = Getattr(n, "name"); String *symname = Getattr(n, "sym:name"); SwigType *type = Getattr(n, "type"); if (!AttributeFunctionGet) { String *mname = Swig_name_member(0, ClassPrefix, symname); String *mrename_get = Swig_name_get(NSpace, mname); String *mrename_set = Swig_name_set(NSpace, mname); Delete(mname); /* Create a function to set the value of the variable */ int assignable = is_assignable(n); if (SmartPointer) { if (!Getattr(CurrentClass, "allocate:smartpointermutable")) { assignable = 0; } } if (assignable) { int make_set_wrapper = 1; String *tm = 0; String *target = 0; if (!Extend) { if (SmartPointer) { if (Swig_storage_isstatic(n)) { Node *sn = Getattr(n, "cplus:staticbase"); String *base = Getattr(sn, "name"); target = NewStringf("%s::%s", base, name); } else { String *pname = Swig_cparm_name(0, 0); target = NewStringf("(*%s)->%s", pname, name); Delete(pname); } } else { String *pname = isNonVirtualProtectedAccess(n) ? NewString("darg") : Swig_cparm_name(0, 0); target = NewStringf("%s->%s", pname, name); Delete(pname); } // This is an input type typemap lookup and so it should not use Node n // otherwise qualification is done on the parameter name for the setter function Parm *nin = NewParm(type, name, n); tm = Swig_typemap_lookup("memberin", nin, target, 0); Delete(nin); } int flags = Extend | SmartPointer | use_naturalvar_mode(n); if (isNonVirtualProtectedAccess(n)) flags = flags | CWRAP_ALL_PROTECTED_ACCESS; Swig_MembersetToFunction(n, ClassType, flags); Setattr(n, "memberset", "1"); if (!Extend) { /* Check for a member in typemap here */ if (!tm) { if (SwigType_isarray(type)) { Swig_warning(WARN_TYPEMAP_VARIN_UNDEF, input_file, line_number, "Unable to set variable of type %s.\n", SwigType_str(type, 0)); make_set_wrapper = 0; } } else { String *pname0 = Swig_cparm_name(0, 0); String *pname1 = Swig_cparm_name(0, 1); Replace(tm, "$source", pname1, DOH_REPLACE_ANY); Replace(tm, "$target", target, DOH_REPLACE_ANY); Replace(tm, "$input", pname1, DOH_REPLACE_ANY); Replace(tm, "$self", pname0, DOH_REPLACE_ANY); Setattr(n, "wrap:action", tm); Delete(tm); Delete(pname0); Delete(pname1); } Delete(target); } if (make_set_wrapper) { Setattr(n, "sym:name", mrename_set); functionWrapper(n); } else { SetFlag(n, "feature:immutable"); } /* Restore parameters */ Setattr(n, "type", type); Setattr(n, "name", name); Setattr(n, "sym:name", symname); Delattr(n, "memberset"); /* Delete all attached typemaps and typemap attributes */ Iterator ki; for (ki = First(n); ki.key; ki = Next(ki)) { if (Strncmp(ki.key, "tmap:", 5) == 0) Delattr(n, ki.key); } } /* Emit get function */ { int flags = Extend | SmartPointer | use_naturalvar_mode(n); if (isNonVirtualProtectedAccess(n)) flags = flags | CWRAP_ALL_PROTECTED_ACCESS; Swig_MembergetToFunction(n, ClassType, flags); Setattr(n, "sym:name", mrename_get); Setattr(n, "memberget", "1"); functionWrapper(n); Delattr(n, "memberget"); } Delete(mrename_get); Delete(mrename_set); } else { /* This code is used to support the attributefunction directive where member variables are converted automagically to accessor functions */ #if 0 Parm *p; String *gname; SwigType *vty; p = NewParm(type, 0, n); gname = NewStringf(AttributeFunctionGet, symname); if (!Extend) { ActionFunc = Copy(Swig_cmemberget_call(name, type)); cpp_member_func(Char(gname), Char(gname), type, 0); Delete(ActionFunc); } else { String *cname = Swig_name_get(NSpace, name); cpp_member_func(Char(cname), Char(gname), type, 0); Delete(cname); } Delete(gname); if (!GetFlag(n, "feature:immutable")) { gname = NewStringf(AttributeFunctionSet, symname); vty = NewString("void"); if (!Extend) { ActionFunc = Copy(Swig_cmemberset_call(name, type)); cpp_member_func(Char(gname), Char(gname), vty, p); Delete(ActionFunc); } else { String *cname = Swig_name_set(NSpace, name); cpp_member_func(Char(cname), Char(gname), vty, p); Delete(cname); } Delete(gname); } ActionFunc = 0; #endif } Swig_restore(n); return SWIG_OK; } /* ---------------------------------------------------------------------- * Language::staticmembervariableHandler() * ---------------------------------------------------------------------- */ int Language::staticmembervariableHandler(Node *n) { Swig_require("staticmembervariableHandler", n, "*name", "*sym:name", "*type", "?value", NIL); String *value = Getattr(n, "value"); String *classname = !SmartPointer ? (isNonVirtualProtectedAccess(n) ? DirectorClassName : ClassName) : Getattr(CurrentClass, "allocate:smartpointerpointeeclassname"); if (!value || !Getattr(n, "hasconsttype")) { String *name = Getattr(n, "name"); String *symname = Getattr(n, "sym:name"); String *cname, *mrename; /* Create the variable name */ mrename = Swig_name_member(0, ClassPrefix, symname); cname = NewStringf("%s::%s", classname, name); Setattr(n, "sym:name", mrename); Setattr(n, "name", cname); /* Wrap as an ordinary global variable */ variableWrapper(n); Delete(mrename); Delete(cname); } else { /* This is a C++ static member declaration with an initializer and it's const. Certain C++ compilers optimize this out so that there is no linkage to a memory address. Example: class Foo { public: static const int x = 3; }; Some discussion of this in section 9.4 of the C++ draft standard. Also, we have to manage the case: class Foo { public: %extend { static const int x = 3; } }; in which there's no actual Foo::x variable to refer to. In this case, the best we can do is to wrap the given value verbatim. */ String *name = Getattr(n, "name"); String *cname = NewStringf("%s::%s", classname, name); if (Extend) { /* the variable is a synthesized one. There's nothing we can do; we just keep the given value */ } else { /* we refer to the value as Foo::x */ String *value = SwigType_namestr(cname); Setattr(n, "value", value); } SwigType *t1 = SwigType_typedef_resolve_all(Getattr(n, "type")); SwigType *t2 = SwigType_strip_qualifiers(t1); Setattr(n, "type", t2); Delete(t1); Delete(t2); SetFlag(n, "wrappedasconstant"); memberconstantHandler(n); Delete(cname); } Swig_restore(n); return SWIG_OK; } /* ---------------------------------------------------------------------- * Language::externDeclaration() * ---------------------------------------------------------------------- */ int Language::externDeclaration(Node *n) { return emit_children(n); } /* ---------------------------------------------------------------------- * Language::enumDeclaration() * ---------------------------------------------------------------------- */ int Language::enumDeclaration(Node *n) { if (CurrentClass && (cplus_mode != PUBLIC)) return SWIG_NOWRAP; String *oldNSpace = NSpace; NSpace = Getattr(n, "sym:nspace"); String *oldEnumClassPrefix = EnumClassPrefix; if (GetFlag(n, "scopedenum")) { assert(Getattr(n, "sym:name")); assert(Getattr(n, "name")); EnumClassPrefix = ClassPrefix ? NewStringf("%s_", ClassPrefix) : NewString(""); Printv(EnumClassPrefix, Getattr(n, "sym:name"), NIL); EnumClassName = Copy(Getattr(n, "name")); } if (!ImportMode) { emit_children(n); } if (GetFlag(n, "scopedenum")) { Delete(EnumClassName); EnumClassName = 0; Delete(EnumClassPrefix); EnumClassPrefix = oldEnumClassPrefix; } NSpace = oldNSpace; return SWIG_OK; } /* ---------------------------------------------------------------------- * Language::enumvalueDeclaration() * ---------------------------------------------------------------------- */ int Language::enumvalueDeclaration(Node *n) { if (CurrentClass && (cplus_mode != PUBLIC)) return SWIG_NOWRAP; Swig_require("enumvalueDeclaration", n, "*name", "*sym:name", "?value", NIL); String *value = Getattr(n, "value"); String *name = Getattr(n, "name"); String *tmpValue; if (value) tmpValue = NewString(value); else tmpValue = NewString(name); Setattr(n, "value", tmpValue); Node *parent = parentNode(n); if (GetFlag(parent, "scopedenum")) { String *symname = Swig_name_member(0, Getattr(parent, "sym:name"), Getattr(n, "sym:name")); Setattr(n, "sym:name", symname); Delete(symname); } if (!CurrentClass || !cparse_cplusplus) { Setattr(n, "name", tmpValue); /* for wrapping of enums in a namespace when emit_action is used */ constantWrapper(n); } else { memberconstantHandler(n); } Delete(tmpValue); Swig_restore(n); return SWIG_OK; } /* ---------------------------------------------------------------------- * Language::enumforwardDeclaration() * ---------------------------------------------------------------------- */ int Language::enumforwardDeclaration(Node *n) { (void) n; if (GetFlag(n, "enumMissing")) enumDeclaration(n); // Generate an empty enum in target language return SWIG_OK; } /* ----------------------------------------------------------------------------- * Language::memberconstantHandler() * ----------------------------------------------------------------------------- */ int Language::memberconstantHandler(Node *n) { Swig_require("memberconstantHandler", n, "*name", "*sym:name", "value", NIL); if (!GetFlag(n, "feature:allowexcept")) { UnsetFlag(n, "feature:except"); } if (Getattr(n, "feature:exceptvar")) { Setattr(n, "feature:except", Getattr(n, "feature:exceptvar")); } String *enumvalue_symname = Getattr(n, "enumvalueDeclaration:sym:name"); // Only set if a strongly typed enum String *name = Getattr(n, "name"); String *symname = Getattr(n, "sym:name"); String *value = Getattr(n, "value"); String *mrename = Swig_name_member(0, EnumClassPrefix, enumvalue_symname ? enumvalue_symname : symname); Setattr(n, "sym:name", mrename); String *new_name = 0; if (Extend) new_name = Copy(value); else if (EnumClassName) new_name = NewStringf("%s::%s", isNonVirtualProtectedAccess(n) ? DirectorClassName : EnumClassName, name); else new_name = NewStringf("%s::%s", isNonVirtualProtectedAccess(n) ? DirectorClassName : ClassName, name); Setattr(n, "name", new_name); constantWrapper(n); Delete(mrename); Delete(new_name); Swig_restore(n); return SWIG_OK; } /* ---------------------------------------------------------------------- * Language::typedefHandler() * ---------------------------------------------------------------------- */ int Language::typedefHandler(Node *n) { /* since this is a recurring issue, we are going to remember the typedef pointer, if already it is not a pointer or reference, as in typedef void NT; int func(NT *p); see director_basic.i for example. */ SwigType *name = Getattr(n, "name"); SwigType *decl = Getattr(n, "decl"); if (!SwigType_ispointer(decl) && !SwigType_isreference(decl)) { SwigType *pname = Copy(name); SwigType_add_pointer(pname); SwigType_remember(pname); Delete(pname); } return SWIG_OK; } /* ---------------------------------------------------------------------- * Language::classDirectorMethod() * ---------------------------------------------------------------------- */ int Language::classDirectorMethod(Node *n, Node *parent, String *super) { (void) n; (void) parent; (void) super; return SWIG_OK; } /* ---------------------------------------------------------------------- * Language::classDirectorConstructor() * ---------------------------------------------------------------------- */ int Language::classDirectorConstructor(Node *n) { (void) n; return SWIG_OK; } /* ---------------------------------------------------------------------- * Language::classDirectorDefaultConstructor() * ---------------------------------------------------------------------- */ int Language::classDirectorDefaultConstructor(Node *n) { (void) n; return SWIG_OK; } static String *vtable_method_id(Node *n) { String *nodeType = Getattr(n, "nodeType"); int is_destructor = (Cmp(nodeType, "destructor") == 0); if (is_destructor) return 0; String *name = Getattr(n, "name"); String *decl = Getattr(n, "decl"); String *local_decl = SwigType_typedef_resolve_all(decl); String *tmp = SwigType_pop_function(local_decl); Delete(local_decl); local_decl = tmp; Node *method_id = NewStringf("%s|%s", name, local_decl); Delete(local_decl); return method_id; } /* ---------------------------------------------------------------------- * Language::unrollVirtualMethods() * ---------------------------------------------------------------------- */ int Language::unrollVirtualMethods(Node *n, Node *parent, List *vm, int default_director, int &virtual_destructor, int protectedbase) { Node *ni; String *nodeType; String *classname; String *decl; bool first_base = false; // recurse through all base classes to build the vtable List *bl = Getattr(n, "bases"); if (bl) { Iterator bi; for (bi = First(bl); bi.item; bi = Next(bi)) { if (first_base && !director_multiple_inheritance) break; unrollVirtualMethods(bi.item, parent, vm, default_director, virtual_destructor); first_base = true; } } // recurse through all protected base classes to build the vtable, as needed bl = Getattr(n, "protectedbases"); if (bl) { Iterator bi; for (bi = First(bl); bi.item; bi = Next(bi)) { if (first_base && !director_multiple_inheritance) break; unrollVirtualMethods(bi.item, parent, vm, default_director, virtual_destructor, 1); first_base = true; } } // find the methods that need directors classname = Getattr(n, "name"); for (ni = Getattr(n, "firstChild"); ni; ni = nextSibling(ni)) { /* we only need to check the virtual members */ nodeType = Getattr(ni, "nodeType"); int is_using = (Cmp(nodeType, "using") == 0); Node *nn = is_using ? firstChild(ni) : ni; /* assume there is only one child node for "using" nodes */ if (is_using) { if (nn) nodeType = Getattr(nn, "nodeType"); else continue; // A private "using" node } if (!checkAttribute(nn, "storage", "virtual")) continue; if (GetFlag(nn, "final")) continue; /* we need to add methods(cdecl) and destructor (to check for throw decl) */ int is_destructor = (Cmp(nodeType, "destructor") == 0); if ((Cmp(nodeType, "cdecl") == 0) || is_destructor) { decl = Getattr(nn, "decl"); /* extra check for function type and proper access */ if (SwigType_isfunction(decl) && (((!protectedbase || dirprot_mode()) && is_public(nn)) || need_nonpublic_member(nn))) { String *name = Getattr(nn, "name"); Node *method_id = is_destructor ? NewStringf("~destructor") : vtable_method_id(nn); /* Make sure that the new method overwrites the existing: */ int len = Len(vm); const int DO_NOT_REPLACE = -1; int replace = DO_NOT_REPLACE; for (int i = 0; i < len; i++) { Node *item = Getitem(vm, i); String *check_vmid = Getattr(item, "vmid"); if (Strcmp(method_id, check_vmid) == 0) { replace = i; break; } } /* filling a new method item */ String *fqdname = NewStringf("%s::%s", classname, name); Hash *item = NewHash(); Setattr(item, "fqdname", fqdname); Node *m = Copy(nn); /* Store the complete return type - needed for non-simple return types (pointers, references etc.) */ SwigType *ty = NewString(Getattr(m, "type")); SwigType_push(ty, decl); if (SwigType_isqualifier(ty)) { Delete(SwigType_pop(ty)); } Delete(SwigType_pop_function(ty)); Setattr(m, "returntype", ty); String *mname = NewStringf("%s::%s", Getattr(parent, "name"), name); /* apply the features of the original method found in the base class */ Swig_features_get(Swig_cparse_features(), 0, mname, Getattr(m, "decl"), m); Setattr(item, "methodNode", m); Setattr(item, "vmid", method_id); if (replace == DO_NOT_REPLACE) Append(vm, item); else Setitem(vm, replace, item); Setattr(nn, "directorNode", m); Delete(mname); } if (is_destructor) { virtual_destructor = 1; } } } /* We delete all the nodirector methods. This prevents the generation of 'empty' director classes. But this has to be done outside the previous 'for' and the recursive loop!. */ if (n == parent) { int len = Len(vm); for (int i = 0; i < len; i++) { Node *item = Getitem(vm, i); Node *m = Getattr(item, "methodNode"); /* retrieve the director features */ int mdir = GetFlag(m, "feature:director"); int mndir = GetFlag(m, "feature:nodirector"); /* 'nodirector' has precedence over 'director' */ int dir = (mdir || mndir) ? (mdir && !mndir) : 1; /* check if the method was found only in a base class */ Node *p = Getattr(m, "parentNode"); if (p != n) { Node *c = Copy(m); Setattr(c, "parentNode", n); int cdir = GetFlag(c, "feature:director"); int cndir = GetFlag(c, "feature:nodirector"); dir = (cdir || cndir) ? (cdir && !cndir) : dir; Delete(c); } if (dir) { /* be sure the 'nodirector' feature is disabled */ if (mndir) Delattr(m, "feature:nodirector"); } else { /* or just delete from the vm, since is not a director method */ Delitem(vm, i); len--; i--; } } } return SWIG_OK; } /* ---------------------------------------------------------------------- * Language::classDirectorDisown() * ---------------------------------------------------------------------- */ int Language::classDirectorDisown(Node *n) { Node *disown = NewHash(); String *mrename; String *symname = Getattr(n, "sym:name"); mrename = Swig_name_disown(NSpace, symname); String *type = NewString(ClassType); String *name = NewString("self"); SwigType_add_pointer(type); Parm *p = NewParm(type, name, n); Delete(name); Delete(type); type = NewString("void"); String *action = NewString(""); Printv(action, "{\n", "Swig::Director *director = SWIG_DIRECTOR_CAST(arg1);\n", "if (director) director->swig_disown();\n", "}\n", NULL); Setfile(disown, Getfile(n)); Setline(disown, Getline(n)); Setattr(disown, "wrap:action", action); Setattr(disown, "name", mrename); Setattr(disown, "sym:name", mrename); Setattr(disown, "type", type); Setattr(disown, "parms", p); Delete(action); Delete(mrename); Delete(type); Delete(p); functionWrapper(disown); Delete(disown); return SWIG_OK; } /* ---------------------------------------------------------------------- * Language::classDirectorConstructors() * ---------------------------------------------------------------------- */ int Language::classDirectorConstructors(Node *n) { Node *ni; String *nodeType; Node *parent = Swig_methodclass(n); int default_ctor = Getattr(parent, "allocate:default_constructor") ? 1 : 0; int protected_ctor = 0; int constructor = 0; /* emit constructors */ for (ni = Getattr(n, "firstChild"); ni; ni = nextSibling(ni)) { nodeType = Getattr(ni, "nodeType"); if (Cmp(nodeType, "constructor") == 0) { if (GetFlag(ni, "feature:ignore")) continue; Parm *parms = Getattr(ni, "parms"); if (is_public(ni)) { /* emit public constructor */ classDirectorConstructor(ni); constructor = 1; if (default_ctor) default_ctor = !ParmList_numrequired(parms); } else { /* emit protected constructor if needed */ if (need_nonpublic_ctor(ni)) { classDirectorConstructor(ni); constructor = 1; protected_ctor = 1; if (default_ctor) default_ctor = !ParmList_numrequired(parms); } } } } /* emit default constructor if needed */ if (!constructor) { if (!default_ctor) { /* we get here because the class has no public, protected or default constructor, therefore, the director class can't be created, ie, is kind of abstract. */ Swig_warning(WARN_LANG_DIRECTOR_ABSTRACT, Getfile(n), Getline(n), "Director class '%s' can't be constructed\n", SwigType_namestr(Getattr(n, "name"))); return SWIG_OK; } classDirectorDefaultConstructor(n); default_ctor = 1; } /* this is just to support old java behavior, ie, the default constructor is always emitted, even when protected, and not needed, since there is a public constructor already defined. (scottm) This code is needed here to make the director_abstract + test generate compilable code (Example2 in director_abstract.i). (mmatus) This is very strange, since swig compiled with gcc3.2.3 doesn't need it here.... */ if (!default_ctor && !protected_ctor) { if (Getattr(parent, "allocate:default_base_constructor")) { classDirectorDefaultConstructor(n); } } return SWIG_OK; } /* ---------------------------------------------------------------------- * Language::classDirectorMethods() * ---------------------------------------------------------------------- */ int Language::classDirectorMethods(Node *n) { Node *vtable = Getattr(n, "vtable"); int len = Len(vtable); for (int i = 0; i < len; i++) { Node *item = Getitem(vtable, i); String *method = Getattr(item, "methodNode"); String *fqdname = Getattr(item, "fqdname"); if (GetFlag(method, "feature:nodirector") || GetFlag(method, "final")) continue; String *wrn = Getattr(method, "feature:warnfilter"); if (wrn) Swig_warnfilter(wrn, 1); String *type = Getattr(method, "nodeType"); if (!Cmp(type, "destructor")) { classDirectorDestructor(method); } else { Swig_require("classDirectorMethods", method, "*type", NIL); assert(Getattr(method, "returntype")); Setattr(method, "type", Getattr(method, "returntype")); if (classDirectorMethod(method, n, fqdname) == SWIG_OK) SetFlag(item, "director"); Swig_restore(method); } if (wrn) Swig_warnfilter(wrn, 0); } return SWIG_OK; } /* ---------------------------------------------------------------------- * Language::classDirectorInit() * ---------------------------------------------------------------------- */ int Language::classDirectorInit(Node *n) { (void) n; return SWIG_OK; } /* ---------------------------------------------------------------------- * Language::classDirectorDestructor() * ---------------------------------------------------------------------- */ int Language::classDirectorDestructor(Node *n) { /* Always emit the virtual destructor in the declaration and in the compilation unit. Been explicit here can't make any damage, and can solve some nasty C++ compiler problems. */ File *f_directors = Swig_filebyname("director"); File *f_directors_h = Swig_filebyname("director_h"); if (Getattr(n, "throw")) { Printf(f_directors_h, " virtual ~%s() throw();\n", DirectorClassName); Printf(f_directors, "%s::~%s() throw() {\n}\n\n", DirectorClassName, DirectorClassName); } else { Printf(f_directors_h, " virtual ~%s();\n", DirectorClassName); Printf(f_directors, "%s::~%s() {\n}\n\n", DirectorClassName, DirectorClassName); } return SWIG_OK; } /* ---------------------------------------------------------------------- * Language::classDirectorEnd() * ---------------------------------------------------------------------- */ int Language::classDirectorEnd(Node *n) { (void) n; return SWIG_OK; } /* ---------------------------------------------------------------------- * Language::classDirector() * ---------------------------------------------------------------------- */ int Language::classDirector(Node *n) { Node *module = Getattr(n, "module"); String *classtype = Getattr(n, "classtype"); Hash *directormap = 0; if (module) { directormap = Getattr(module, "wrap:directormap"); if (directormap == 0) { directormap = NewHash(); Setattr(module, "wrap:directormap", directormap); } } List *vtable = NewList(); int virtual_destructor = 0; unrollVirtualMethods(n, n, vtable, 0, virtual_destructor); // Emit all the using base::member statements for non virtual members (allprotected mode) Node *ni; String *using_protected_members_code = NewString(""); for (ni = Getattr(n, "firstChild"); ni; ni = nextSibling(ni)) { Node *nodeType = Getattr(ni, "nodeType"); if (Cmp(nodeType, "destructor") == 0 && GetFlag(ni, "final")) { String *classtype = Getattr(n, "classtype"); SWIG_WARN_NODE_BEGIN(ni); Swig_warning(WARN_LANG_DIRECTOR_FINAL, input_file, line_number, "Destructor %s is final, %s cannot be a director class.\n", Swig_name_decl(ni), classtype); SWIG_WARN_NODE_END(ni); SetFlag(n, "feature:nodirector"); Delete(vtable); Delete(using_protected_members_code); return SWIG_OK; } bool cdeclaration = (Cmp(nodeType, "cdecl") == 0); if (cdeclaration && !GetFlag(ni, "feature:ignore")) { if (isNonVirtualProtectedAccess(ni)) { Node *overloaded = Getattr(ni, "sym:overloaded"); // emit the using base::member statement (but only once if the method is overloaded) if (!overloaded || (overloaded && (overloaded == ni))) Printf(using_protected_members_code, " using %s::%s;\n", SwigType_namestr(ClassName), Getattr(ni, "name")); } } } if (virtual_destructor || Len(vtable) > 0) { if (!virtual_destructor) { String *classtype = Getattr(n, "classtype"); Swig_warning(WARN_LANG_DIRECTOR_VDESTRUCT, input_file, line_number, "Director base class %s has no virtual destructor.\n", classtype); } Setattr(n, "vtable", vtable); if (directormap != 0) { Setattr(directormap, classtype, n); } classDirectorInit(n); classDirectorConstructors(n); classDirectorMethods(n); File *f_directors_h = Swig_filebyname("director_h"); Printv(f_directors_h, using_protected_members_code, NIL); classDirectorEnd(n); } Delete(vtable); Delete(using_protected_members_code); return SWIG_OK; } /* ---------------------------------------------------------------------- * Language::classDeclaration() * ---------------------------------------------------------------------- */ static void addCopyConstructor(Node *n) { Node *cn = NewHash(); set_nodeType(cn, "constructor"); Setattr(cn, "access", "public"); Setfile(cn, Getfile(n)); Setline(cn, Getline(n)); String *cname = Getattr(n, "name"); SwigType *type = Copy(cname); String *name = Swig_scopename_last(cname); String *cc = NewStringf("r.q(const).%s", type); String *decl = NewStringf("f(%s).", cc); String *oldname = Getattr(n, "sym:name"); if (Getattr(n, "allocate:has_constructor")) { // to work properly with '%rename Class', we must look // for any other constructor in the class, which has not been // renamed, and use its name as oldname. Node *c; for (c = firstChild(n); c; c = nextSibling(c)) { const char *tag = Char(nodeType(c)); if (strcmp(tag, "constructor") == 0) { String *cname = Getattr(c, "name"); String *csname = Getattr(c, "sym:name"); String *clast = Swig_scopename_last(cname); if (Equal(csname, clast)) { oldname = csname; break; } } } } String *symname = Swig_name_make(cn, cname, name, decl, oldname); if (Strcmp(symname, "$ignore") != 0) { Parm *p = NewParm(cc, "other", n); Setattr(cn, "name", name); Setattr(cn, "sym:name", symname); SetFlag(cn, "feature:new"); Setattr(cn, "decl", decl); Setattr(cn, "parentNode", n); Setattr(cn, "parms", p); Setattr(cn, "copy_constructor", "1"); Symtab *oldscope = Swig_symbol_setscope(Getattr(n, "symtab")); Node *on = Swig_symbol_add(symname, cn); Swig_features_get(Swig_cparse_features(), Swig_symbol_qualifiedscopename(0), name, decl, cn); Swig_symbol_setscope(oldscope); if (on == cn) { Node *access = NewHash(); set_nodeType(access, "access"); Setattr(access, "kind", "public"); appendChild(n, access); appendChild(n, cn); Setattr(n, "has_copy_constructor", "1"); Setattr(n, "copy_constructor_decl", decl); Setattr(n, "allocate:copy_constructor", "1"); Delete(access); } } Delete(cn); Delete(name); Delete(decl); Delete(symname); } static void addDefaultConstructor(Node *n) { Node *cn = NewHash(); set_nodeType(cn, "constructor"); Setattr(cn, "access", "public"); Setfile(cn, Getfile(n)); Setline(cn, Getline(n)); String *cname = Getattr(n, "name"); String *name = Swig_scopename_last(cname); String *decl = NewString("f()."); String *oldname = Getattr(n, "sym:name"); String *symname = Swig_name_make(cn, cname, name, decl, oldname); if (Strcmp(symname, "$ignore") != 0) { Setattr(cn, "name", name); Setattr(cn, "sym:name", symname); SetFlag(cn, "feature:new"); Setattr(cn, "decl", decl); Setattr(cn, "parentNode", n); Setattr(cn, "default_constructor", "1"); Symtab *oldscope = Swig_symbol_setscope(Getattr(n, "symtab")); Node *on = Swig_symbol_add(symname, cn); Swig_features_get(Swig_cparse_features(), Swig_symbol_qualifiedscopename(0), name, decl, cn); Swig_symbol_setscope(oldscope); if (on == cn) { Node *access = NewHash(); set_nodeType(access, "access"); Setattr(access, "kind", "public"); appendChild(n, access); appendChild(n, cn); Setattr(n, "has_default_constructor", "1"); Setattr(n, "allocate:default_constructor", "1"); Delete(access); } } Delete(cn); Delete(name); Delete(decl); Delete(symname); } static void addDestructor(Node *n) { Node *cn = NewHash(); set_nodeType(cn, "destructor"); Setattr(cn, "access", "public"); Setfile(cn, Getfile(n)); Setline(cn, Getline(n)); String *cname = Getattr(n, "name"); String *name = Swig_scopename_last(cname); Insert(name, 0, "~"); String *decl = NewString("f()."); String *symname = Swig_name_make(cn, cname, name, decl, 0); if (Strcmp(symname, "$ignore") != 0) { String *possible_nonstandard_symname = NewStringf("~%s", Getattr(n, "sym:name")); Setattr(cn, "name", name); Setattr(cn, "sym:name", symname); Setattr(cn, "decl", "f()."); Setattr(cn, "parentNode", n); Symtab *oldscope = Swig_symbol_setscope(Getattr(n, "symtab")); Node *nonstandard_destructor = Equal(possible_nonstandard_symname, symname) ? 0 : Swig_symbol_clookup(possible_nonstandard_symname, 0); Node *on = Swig_symbol_add(symname, cn); Swig_features_get(Swig_cparse_features(), Swig_symbol_qualifiedscopename(0), name, decl, cn); Swig_symbol_setscope(oldscope); if (on == cn) { // SWIG accepts a non-standard named destructor in %extend that uses a typedef for the destructor name // For example: typedef struct X {} XX; %extend X { ~XX() {...} } // Don't add another destructor if a nonstandard one has been declared if (!nonstandard_destructor) { Node *access = NewHash(); set_nodeType(access, "access"); Setattr(access, "kind", "public"); appendChild(n, access); appendChild(n, cn); Setattr(n, "has_destructor", "1"); Setattr(n, "allocate:destructor", "1"); Delete(access); } } Delete(possible_nonstandard_symname); } Delete(cn); Delete(name); Delete(decl); Delete(symname); } int Language::classDeclaration(Node *n) { String *ochildren = Getattr(n, "feature:onlychildren"); if (ochildren) { Setattr(n, "feature:emitonlychildren", ochildren); emit_children(n); Delattr(n, "feature:emitonlychildren"); SetFlag(n, "feature:ignore"); return SWIG_NOWRAP; } // save class local variables for nested classes support int oldInClass = InClass; String *oldClassType = ClassType; String *oldClassPrefix = ClassPrefix; String *oldEnumClassPrefix = EnumClassPrefix; String *oldClassName = ClassName; String *oldDirectorClassName = DirectorClassName; String *oldNSpace = NSpace; Node *oldCurrentClass = CurrentClass; int dir = 0; String *kind = Getattr(n, "kind"); String *name = Getattr(n, "name"); String *tdname = Getattr(n, "tdname"); String *unnamed = Getattr(n, "unnamed"); String *symname = Getattr(n, "sym:name"); int strip = CPlusPlus ? 1 : unnamed && tdname; if (cplus_mode != PUBLIC) return SWIG_NOWRAP; if (!name) { Swig_warning(WARN_LANG_CLASS_UNNAMED, input_file, line_number, "Can't generate wrappers for unnamed struct/class.\n"); return SWIG_NOWRAP; } /* Check symbol name for template. If not renamed. Issue a warning */ if (!validIdentifier(symname)) { Swig_warning(WARN_LANG_IDENTIFIER, input_file, line_number, "Can't wrap class %s unless renamed to a valid identifier.\n", SwigType_namestr(symname)); return SWIG_NOWRAP; } AccessMode oldAccessMode = cplus_mode; Node *outerClass = Getattr(n, "nested:outer"); if (outerClass && oldAccessMode != PUBLIC) return SWIG_NOWRAP; ClassName = Copy(name); ClassPrefix = Copy(symname); if (Cmp(kind, "class") == 0) { cplus_mode = PRIVATE; } else { cplus_mode = PUBLIC; } for (; outerClass; outerClass = Getattr(outerClass, "nested:outer")) { Push(ClassPrefix, "_"); Push(ClassPrefix, Getattr(outerClass, "sym:name")); } EnumClassPrefix = Copy(ClassPrefix); if (strip) { ClassType = Copy(name); } else { ClassType = NewStringf("%s %s", kind, name); } Setattr(n, "classtypeobj", Copy(ClassType)); Setattr(n, "classtype", SwigType_namestr(ClassType)); InClass = 1; CurrentClass = n; NSpace = Getattr(n, "sym:nspace"); int oldAbstract = Abstract; /* Call classHandler() here */ if (!ImportMode) { if (directorsEnabled()) { int ndir = GetFlag(n, "feature:director"); int nndir = GetFlag(n, "feature:nodirector"); /* 'nodirector' has precedence over 'director' */ dir = (ndir || nndir) ? (ndir && !nndir) : 0; } int abstract = !dir && abstractClassTest(n); int odefault = (GenerateDefault && !GetFlag(n, "feature:nodefault")); /* default constructor */ if (!abstract && !GetFlag(n, "feature:nodefaultctor") && odefault) { if (!Getattr(n, "has_constructor") && !Getattr(n, "allocate:has_constructor") && (Getattr(n, "allocate:default_constructor"))) { addDefaultConstructor(n); } } /* copy constructor */ if (CPlusPlus && !abstract && GetFlag(n, "feature:copyctor")) { if (!Getattr(n, "has_copy_constructor") && !Getattr(n, "allocate:has_copy_constructor") && (Getattr(n, "allocate:copy_constructor")) && (!GetFlag(n, "feature:ignore"))) { addCopyConstructor(n); } } /* default destructor */ if (!GetFlag(n, "feature:nodefaultdtor") && odefault) { if (!Getattr(n, "has_destructor") && (!Getattr(n, "allocate:has_destructor")) && (Getattr(n, "allocate:default_destructor")) && (!GetFlag(n, "feature:ignore"))) { addDestructor(n); } } if (dir) { DirectorClassName = directorClassName(n); classDirector(n); } /* check for abstract after resolving directors */ Abstract = abstractClassTest(n); classHandler(n); } else { Abstract = abstractClassTest(n); Language::classHandler(n); } Abstract = oldAbstract; cplus_mode = oldAccessMode; NSpace = oldNSpace; InClass = oldInClass; CurrentClass = oldCurrentClass; Delete(ClassType); ClassType = oldClassType; Delete(EnumClassPrefix); EnumClassPrefix = oldEnumClassPrefix; Delete(ClassPrefix); ClassPrefix = oldClassPrefix; Delete(ClassName); ClassName = oldClassName; if (dir) { Delete(DirectorClassName); } DirectorClassName = oldDirectorClassName; return SWIG_OK; } /* ---------------------------------------------------------------------- * Language::classHandler() * ---------------------------------------------------------------------- */ int Language::classHandler(Node *n) { save_value oldExtend(Extend); if (Getattr(n, "template")) Extend = 0; bool hasDirector = Swig_directorclass(n) ? true : false; /* Emit all of the class members */ emit_children(n); /* Look for smart pointer handling */ if (Getattr(n, "allocate:smartpointer")) { List *methods = Getattr(n, "allocate:smartpointer"); cplus_mode = PUBLIC; SmartPointer = CWRAP_SMART_POINTER; if (Getattr(n, "allocate:smartpointerconst") && Getattr(n, "allocate:smartpointermutable")) { SmartPointer |= CWRAP_SMART_POINTER_OVERLOAD; } Iterator c; for (c = First(methods); c.item; c = Next(c)) { emit_one(c.item); } SmartPointer = 0; } cplus_mode = PUBLIC; /* emit director disown method */ if (hasDirector) { classDirectorDisown(n); /* Emit additional protected virtual methods - only needed if the language module * codes logic in the C++ layer instead of the director proxy class method - primarily * to catch public use of protected methods by the scripting languages. */ if (dirprot_mode() && extraDirectorProtectedCPPMethodsRequired()) { Node *vtable = Getattr(n, "vtable"); String *symname = Getattr(n, "sym:name"); save_value old_mode(cplus_mode); cplus_mode = PROTECTED; int len = Len(vtable); for (int i = 0; i < len; i++) { Node *item = Getitem(vtable, i); Node *method = Getattr(item, "methodNode"); SwigType *type = Getattr(method, "nodeType"); if (Strcmp(type, "cdecl") != 0) continue; if (GetFlag(method, "feature:ignore")) continue; String *methodname = Getattr(method, "sym:name"); String *wrapname = NewStringf("%s_%s", symname, methodname); if (!symbolLookup(wrapname, "") && (!is_public(method))) { Node *m = Copy(method); Setattr(m, "director", "1"); Setattr(m, "parentNode", n); /* * There is a bug that needs fixing still... * This area of code is creating methods which have not been overridden in a derived class (director methods that are protected in the base) * If the method is overloaded, then Swig_overload_dispatch() incorrectly generates a call to the base wrapper, _wrap_xxx method * See director_protected_overloaded.i - Possibly sym:overname needs correcting here. Printf(stdout, "new method: %s::%s(%s)\n", Getattr(parentNode(m), "name"), Getattr(m, "name"), ParmList_str_defaultargs(Getattr(m, "parms"))); */ cDeclaration(m); Delete(m); } Delete(wrapname); } } } return SWIG_OK; } /* ---------------------------------------------------------------------- * Language::classforwardDeclaration() * ---------------------------------------------------------------------- */ int Language::classforwardDeclaration(Node *n) { (void) n; return SWIG_OK; } /* ---------------------------------------------------------------------- * Language::constructorDeclaration() * ---------------------------------------------------------------------- */ int Language::constructorDeclaration(Node *n) { String *name = Getattr(n, "name"); String *symname = Getattr(n, "sym:name"); if (!symname) return SWIG_NOWRAP; if (!CurrentClass) return SWIG_NOWRAP; if (ImportMode) return SWIG_NOWRAP; if (Extend) { /* extend default constructor can be safely ignored if there is already one */ int num_required = ParmList_numrequired(Getattr(n, "parms")); if ((num_required == 0) && Getattr(CurrentClass, "has_default_constructor")) { return SWIG_NOWRAP; } if ((num_required == 1) && Getattr(CurrentClass, "has_copy_constructor")) { String *ccdecl = Getattr(CurrentClass, "copy_constructor_decl"); if (ccdecl && (Strcmp(ccdecl, Getattr(n, "decl")) == 0)) { return SWIG_NOWRAP; } } } /* clean protected overloaded constructors, in case they are not needed anymore */ Node *over = Swig_symbol_isoverloaded(n); if (over && !Getattr(CurrentClass, "sym:cleanconstructor")) { int dirclass = Swig_directorclass(CurrentClass); Node *nn = over; while (nn) { if (!is_public(nn)) { if (!dirclass || !need_nonpublic_ctor(nn)) { SetFlag(nn, "feature:ignore"); } } nn = Getattr(nn, "sym:nextSibling"); } clean_overloaded(over); Setattr(CurrentClass, "sym:cleanconstructor", "1"); } if ((cplus_mode != PUBLIC)) { /* check only for director classes */ if (!Swig_directorclass(CurrentClass) || !need_nonpublic_ctor(n)) return SWIG_NOWRAP; } /* Name adjustment for %name */ Swig_save("constructorDeclaration", n, "sym:name", NIL); { String *base = Swig_scopename_last(name); if ((Strcmp(base, symname) == 0) && (Strcmp(symname, ClassPrefix) != 0)) { Setattr(n, "sym:name", ClassPrefix); } Delete(base); } /* Only create a constructor if the class is not abstract */ if (!Abstract) { Node *over; over = Swig_symbol_isoverloaded(n); if (over) over = first_nontemplate(over); if ((over) && (!overloading)) { /* If the symbol is overloaded. We check to see if it is a copy constructor. If so, we invoke copyconstructorHandler() as a special case. */ if (Getattr(n, "copy_constructor") && (!Getattr(CurrentClass, "has_copy_constructor"))) { copyconstructorHandler(n); Setattr(CurrentClass, "has_copy_constructor", "1"); } else { if (Getattr(over, "copy_constructor")) over = Getattr(over, "sym:nextSibling"); if (over != n) { Swig_warning(WARN_LANG_OVERLOAD_CONSTRUCT, input_file, line_number, "Overloaded constructor ignored. %s\n", Swig_name_decl(n)); Swig_warning(WARN_LANG_OVERLOAD_CONSTRUCT, Getfile(over), Getline(over), "Previous declaration is %s\n", Swig_name_decl(over)); } else { constructorHandler(n); } } } else { String *expected_name = ClassName; String *scope = Swig_scopename_check(ClassName) ? Swig_scopename_prefix(ClassName) : 0; String *actual_name = scope ? NewStringf("%s::%s", scope, name) : NewString(name); Delete(scope); if (!Equal(actual_name, expected_name) && !SwigType_istemplate(expected_name) && !SwigType_istemplate(actual_name)) { // Checking templates is skipped but they ought to be checked... they are just somewhat more tricky to check correctly bool illegal_name = true; if (Extend) { // Check for typedef names used as a constructor name in %extend. This is deprecated except for anonymous // typedef structs which have had their symbol names adjusted to the typedef name in the parser. SwigType *name_resolved = SwigType_typedef_resolve_all(actual_name); SwigType *expected_name_resolved = SwigType_typedef_resolve_all(expected_name); if (!CPlusPlus) { if (Strncmp(name_resolved, "struct ", 7) == 0) Replace(name_resolved, "struct ", "", DOH_REPLACE_FIRST); else if (Strncmp(name_resolved, "union ", 6) == 0) Replace(name_resolved, "union ", "", DOH_REPLACE_FIRST); } illegal_name = !Equal(name_resolved, expected_name_resolved); if (!illegal_name) Swig_warning(WARN_LANG_EXTEND_CONSTRUCTOR, input_file, line_number, "Use of an illegal constructor name '%s' in %%extend is deprecated, the constructor name should be '%s'.\n", SwigType_str(Swig_scopename_last(actual_name), 0), SwigType_str(Swig_scopename_last(expected_name), 0)); Delete(name_resolved); Delete(expected_name_resolved); } if (illegal_name) { Swig_warning(WARN_LANG_RETURN_TYPE, input_file, line_number, "Function %s must have a return type. Ignored.\n", Swig_name_decl(n)); Swig_restore(n); return SWIG_NOWRAP; } } constructorHandler(n); } } Setattr(CurrentClass, "has_constructor", "1"); Swig_restore(n); return SWIG_OK; } /* ---------------------------------------------------------------------- * get_director_ctor_code() * ---------------------------------------------------------------------- */ static String *get_director_ctor_code(Node *n, String *director_ctor_code, String *director_prot_ctor_code, List *&abstracts) { String *director_ctor = director_ctor_code; int use_director = Swig_directorclass(n); if (use_director) { Node *pn = Swig_methodclass(n); abstracts = Getattr(pn, "abstracts"); if (director_prot_ctor_code) { int is_notabstract = GetFlag(pn, "feature:notabstract"); int is_abstract = abstracts && !is_notabstract; if (is_protected(n) || is_abstract) { director_ctor = director_prot_ctor_code; abstracts = Copy(abstracts); Delattr(pn, "abstracts"); } else { if (is_notabstract) { abstracts = Copy(abstracts); Delattr(pn, "abstracts"); } else { abstracts = 0; } } } } return director_ctor; } /* ---------------------------------------------------------------------- * Language::constructorHandler() * ---------------------------------------------------------------------- */ int Language::constructorHandler(Node *n) { Swig_require("constructorHandler", n, "?name", "*sym:name", "?type", "?parms", NIL); String *symname = Getattr(n, "sym:name"); String *mrename = Swig_name_construct(NSpace, symname); String *nodeType = Getattr(n, "nodeType"); int constructor = (!Cmp(nodeType, "constructor")); List *abstracts = 0; String *director_ctor = get_director_ctor_code(n, director_ctor_code, director_prot_ctor_code, abstracts); if (!constructor) { /* if not originally a constructor, still handle it as one */ Setattr(n, "handled_as_constructor", "1"); } int extendmember = GetFlag(n, "isextendmember") ? Extend : 0; int flags = Getattr(n, "template") ? extendmember : Extend; Swig_ConstructorToFunction(n, NSpace, ClassType, none_comparison, director_ctor, CPlusPlus, flags, DirectorClassName); Setattr(n, "sym:name", mrename); functionWrapper(n); Delete(mrename); Swig_restore(n); if (abstracts) Setattr(Swig_methodclass(n), "abstracts", abstracts); return SWIG_OK; } /* ---------------------------------------------------------------------- * Language::copyconstructorHandler() * ---------------------------------------------------------------------- */ int Language::copyconstructorHandler(Node *n) { Swig_require("copyconstructorHandler", n, "?name", "*sym:name", "?type", "?parms", NIL); String *symname = Getattr(n, "sym:name"); String *mrename = Swig_name_copyconstructor(NSpace, symname); List *abstracts = 0; String *director_ctor = get_director_ctor_code(n, director_ctor_code, director_prot_ctor_code, abstracts); Swig_ConstructorToFunction(n, NSpace, ClassType, none_comparison, director_ctor, CPlusPlus, Getattr(n, "template") ? 0 : Extend, DirectorClassName); Setattr(n, "sym:name", mrename); functionWrapper(n); Delete(mrename); Swig_restore(n); if (abstracts) Setattr(Swig_methodclass(n), "abstracts", abstracts); return SWIG_OK; } /* ---------------------------------------------------------------------- * Language::destructorDeclaration() * ---------------------------------------------------------------------- */ int Language::destructorDeclaration(Node *n) { if (!CurrentClass) return SWIG_NOWRAP; if (cplus_mode != PUBLIC && !Getattr(CurrentClass, "feature:unref")) return SWIG_NOWRAP; if (ImportMode) return SWIG_NOWRAP; Swig_save("destructorDeclaration", n, "name", "sym:name", NIL); char *c = GetChar(n, "sym:name"); if (c && (*c == '~')) { Setattr(n, "sym:name", c + 1); } String *name = Getattr(n, "name"); String *symname = Getattr(n, "sym:name"); if ((Strcmp(name, symname) == 0) || (Strcmp(symname, ClassPrefix) != 0)) { Setattr(n, "sym:name", ClassPrefix); } String *expected_name = ClassName; String *scope = Swig_scopename_check(ClassName) ? Swig_scopename_prefix(ClassName) : 0; String *actual_name = scope ? NewStringf("%s::%s", scope, name) : NewString(name); Delete(scope); Replace(actual_name, "~", "", DOH_REPLACE_FIRST); if (!Equal(actual_name, expected_name) && !(Getattr(n, "template"))) { bool illegal_name = true; if (Extend) { // Check for typedef names used as a destructor name in %extend. This is deprecated except for anonymous // typedef structs which have had their symbol names adjusted to the typedef name in the parser. SwigType *name_resolved = SwigType_typedef_resolve_all(actual_name); SwigType *expected_name_resolved = SwigType_typedef_resolve_all(expected_name); if (!CPlusPlus) { if (Strncmp(name_resolved, "struct ", 7) == 0) Replace(name_resolved, "struct ", "", DOH_REPLACE_FIRST); else if (Strncmp(name_resolved, "union ", 6) == 0) Replace(name_resolved, "union ", "", DOH_REPLACE_FIRST); } illegal_name = !Equal(name_resolved, expected_name_resolved); if (!illegal_name) Swig_warning(WARN_LANG_EXTEND_DESTRUCTOR, input_file, line_number, "Use of an illegal destructor name '%s' in %%extend is deprecated, the destructor name should be '%s'.\n", SwigType_str(Swig_scopename_last(actual_name), 0), SwigType_str(Swig_scopename_last(expected_name), 0)); Delete(name_resolved); Delete(expected_name_resolved); } if (illegal_name) { Swig_warning(WARN_LANG_ILLEGAL_DESTRUCTOR, input_file, line_number, "Illegal destructor name %s. Ignored.\n", Swig_name_decl(n)); Swig_restore(n); return SWIG_NOWRAP; } } destructorHandler(n); Setattr(CurrentClass, "has_destructor", "1"); Swig_restore(n); return SWIG_OK; } /* ---------------------------------------------------------------------- * Language::destructorHandler() * ---------------------------------------------------------------------- */ int Language::destructorHandler(Node *n) { Swig_require("destructorHandler", n, "?name", "*sym:name", NIL); Swig_save("destructorHandler", n, "type", "parms", NIL); String *symname = Getattr(n, "sym:name"); String *mrename; char *csymname = Char(symname); if (*csymname == '~') csymname += 1; mrename = Swig_name_destroy(NSpace, csymname); Swig_DestructorToFunction(n, NSpace, ClassType, CPlusPlus, Extend); Setattr(n, "sym:name", mrename); functionWrapper(n); Delete(mrename); Swig_restore(n); return SWIG_OK; } /* ---------------------------------------------------------------------- * Language::accessDeclaration() * ---------------------------------------------------------------------- */ int Language::accessDeclaration(Node *n) { String *kind = Getattr(n, "kind"); if (Cmp(kind, "public") == 0) { cplus_mode = PUBLIC; } else if (Cmp(kind, "private") == 0) { cplus_mode = PRIVATE; } else if (Cmp(kind, "protected") == 0) { cplus_mode = PROTECTED; } return SWIG_OK; } /* ----------------------------------------------------------------------------- * Language::namespaceDeclaration() * ----------------------------------------------------------------------------- */ int Language::namespaceDeclaration(Node *n) { if (Getattr(n, "alias")) return SWIG_OK; if (Getattr(n, "unnamed")) return SWIG_OK; emit_children(n); return SWIG_OK; } int Language::validIdentifier(String *s) { char *c = Char(s); while (*c) { if (!(isalnum(*c) || (*c == '_'))) return 0; c++; } return 1; } /* ----------------------------------------------------------------------------- * Language::usingDeclaration() * ----------------------------------------------------------------------------- */ int Language::usingDeclaration(Node *n) { if ((cplus_mode == PUBLIC) || (!is_public(n) && dirprot_mode())) { Node *np = Copy(n); Node *c; for (c = firstChild(np); c; c = nextSibling(c)) { /* it seems for some cases this is needed, like A* A::boo() */ if (CurrentClass) Setattr(c, "parentNode", CurrentClass); emit_one(c); } Delete(np); } return SWIG_OK; } /* Stubs. Language modules need to implement these */ /* ---------------------------------------------------------------------- * Language::constantWrapper() * ---------------------------------------------------------------------- */ int Language::constantWrapper(Node *n) { String *name = Getattr(n, "sym:name"); SwigType *type = Getattr(n, "type"); String *value = Getattr(n, "value"); String *str = SwigType_str(type, name); Printf(stdout, "constantWrapper : %s = %s\n", str, value); Delete(str); return SWIG_OK; } /* ---------------------------------------------------------------------- * Language::variableWrapper() * ---------------------------------------------------------------------- */ int Language::variableWrapper(Node *n) { Swig_require("variableWrapper", n, "*name", "*sym:name", "*type", "?parms", "?varset", "?varget", NIL); String *symname = Getattr(n, "sym:name"); SwigType *type = Getattr(n, "type"); String *name = Getattr(n, "name"); Delattr(n,"varset"); Delattr(n,"varget"); String *newsymname = 0; if (!CurrentClass && EnumClassPrefix) { newsymname = Swig_name_member(0, EnumClassPrefix, symname); symname = newsymname; } /* If no way to set variables. We simply create functions */ int assignable = is_assignable(n); int flags = use_naturalvar_mode(n); if (!GetFlag(n, "wrappedasconstant")) flags = flags | Extend; if (assignable) { int make_set_wrapper = 1; String *tm = Swig_typemap_lookup("globalin", n, name, 0); Swig_VarsetToFunction(n, flags); String *sname = Swig_name_set(NSpace, symname); Setattr(n, "sym:name", sname); Delete(sname); if (!tm) { if (SwigType_isarray(type)) { Swig_warning(WARN_TYPEMAP_VARIN_UNDEF, input_file, line_number, "Unable to set variable of type %s.\n", SwigType_str(type, 0)); make_set_wrapper = 0; } } else { String *pname0 = Swig_cparm_name(0, 0); Replace(tm, "$source", pname0, DOH_REPLACE_ANY); Replace(tm, "$target", name, DOH_REPLACE_ANY); Replace(tm, "$input", pname0, DOH_REPLACE_ANY); Setattr(n, "wrap:action", tm); Delete(tm); Delete(pname0); } if (make_set_wrapper) { Setattr(n, "varset", "1"); functionWrapper(n); } else { SetFlag(n, "feature:immutable"); } /* Restore parameters */ Setattr(n, "sym:name", symname); Setattr(n, "type", type); Setattr(n, "name", name); Delattr(n, "varset"); /* Delete all attached typemaps and typemap attributes */ Iterator ki; for (ki = First(n); ki.key; ki = Next(ki)) { if (Strncmp(ki.key, "tmap:", 5) == 0) Delattr(n, ki.key); } } Swig_VargetToFunction(n, flags); String *gname = Swig_name_get(NSpace, symname); Setattr(n, "sym:name", gname); Delete(gname); Setattr(n, "varget", "1"); functionWrapper(n); Delattr(n, "varget"); Swig_restore(n); Delete(newsymname); return SWIG_OK; } /* ---------------------------------------------------------------------- * Language::functionWrapper() * ---------------------------------------------------------------------- */ int Language::functionWrapper(Node *n) { String *name = Getattr(n, "sym:name"); SwigType *type = Getattr(n, "type"); ParmList *parms = Getattr(n, "parms"); Printf(stdout, "functionWrapper : %s\n", SwigType_str(type, NewStringf("%s(%s)", name, ParmList_str_defaultargs(parms)))); Printf(stdout, " action : %s\n", Getattr(n, "wrap:action")); return SWIG_OK; } /* ----------------------------------------------------------------------------- * Language::nativeWrapper() * ----------------------------------------------------------------------------- */ int Language::nativeWrapper(Node *n) { (void) n; return SWIG_OK; } void Language::main(int argc, char *argv[]) { (void) argc; (void) argv; } /* ----------------------------------------------------------------------------- * Language::addSymbol() * * Adds a symbol entry into the target language symbol tables. * Returns 1 if the symbol is added successfully. * Prints an error message and returns 0 if a conflict occurs. * The scope is optional for target languages and if supplied must be a fully * qualified scope and the symbol s must not contain any scope qualifiers. * ----------------------------------------------------------------------------- */ int Language::addSymbol(const String *s, const Node *n, const_String_or_char_ptr scope) { //Printf( stdout, "addSymbol: %s %s\n", s, scope ); Hash *symbols = Getattr(symtabs, scope ? scope : ""); if (!symbols) { symbols = symbolAddScope(scope); } else { Node *c = Getattr(symbols, s); if (c && (c != n)) { if (scope && Len(scope) > 0) Swig_error(input_file, line_number, "'%s' is multiply defined in the generated target language module in scope '%s'.\n", s, scope); else Swig_error(input_file, line_number, "'%s' is multiply defined in the generated target language module.\n", s); Swig_error(Getfile(c), Getline(c), "Previous declaration of '%s'\n", s); return 0; } } Setattr(symbols, s, n); return 1; } /* ----------------------------------------------------------------------------- * Language::addInterfaceSymbol() * * Adds a symbol entry into the target language symbol tables - for the interface * feature only. * Returns 1 if the symbol is added successfully. * The scope is as per addSymbol. * ----------------------------------------------------------------------------- */ int Language::addInterfaceSymbol(const String *interface_name, Node *n, const_String_or_char_ptr scope) { if (interface_name) { Node *existing_symbol = symbolLookup(interface_name, scope); if (existing_symbol) { String *proxy_class_name = Getattr(n, "sym:name"); Swig_error(input_file, line_number, "The interface feature name '%s' for proxy class '%s' is already defined in the generated target language module in scope '%s'.\n", interface_name, proxy_class_name, scope); Swig_error(Getfile(existing_symbol), Getline(existing_symbol), "Previous declaration of '%s'\n", interface_name); return 0; } if (!addSymbol(interface_name, n, scope)) return 0; } return 1; } /* ----------------------------------------------------------------------------- * Language::symbolAddScope() * * Creates a scope (symbols Hash) for given name. This method is auxiliary, * you don't have to call it - addSymbols will lazily create scopes automatically. * If scope with given name already exists, then do nothing. * Returns newly created (or already existing) scope. * ----------------------------------------------------------------------------- */ Hash* Language::symbolAddScope(const_String_or_char_ptr scope) { Hash *symbols = symbolScopeLookup(scope); if(!symbols) { // The order in which the following code is executed is important. In the Language // constructor addScope("") is called to create a top level scope. // Thus we must first add a symbols hash to symtab and only then add pseudo // symbols to the top-level scope. // New scope which has not been added by the target language - lazily created. symbols = NewHash(); Setattr(symtabs, scope, symbols); // Add the new scope as a symbol in the top level scope. // Alternatively the target language must add it in before attempting to add symbols into the scope. const_String_or_char_ptr top_scope = ""; Hash *topscope_symbols = Getattr(symtabs, top_scope); Hash *pseudo_symbol = NewHash(); Setattr(pseudo_symbol, "sym:scope", "1"); Setattr(topscope_symbols, scope, pseudo_symbol); } return symbols; } /* ----------------------------------------------------------------------------- * Language::symbolScopeLookup() * * Lookup and returns a symtable (hash) representing given scope. Hash contains * all symbols in this scope. * ----------------------------------------------------------------------------- */ Hash* Language::symbolScopeLookup( const_String_or_char_ptr scope ) { Hash *symbols = Getattr(symtabs, scope ? scope : ""); return symbols; } /* ----------------------------------------------------------------------------- * Language::symbolScopePseudoSymbolLookup() * * For every scope there is a special pseudo-symbol in the top scope (""). It * exists solely to detect name clashes. This pseudo symbol may contain a few properties, * but more could be added. This is also true for the top level scope (""). * It contains a pseudo symbol with name "" (empty). Pseudo symbol contains the * following properties: * sym:scope = "1" - a flag that this is a scope pseudo symbol * * Pseudo symbols are a Hash*, not a Node*. * There is no difference from symbolLookup() method except for signature * and return type. * ----------------------------------------------------------------------------- */ Hash* Language::symbolScopePseudoSymbolLookup( const_String_or_char_ptr scope ) { /* Getting top scope */ const_String_or_char_ptr top_scope = ""; Hash *symbols = Getattr(symtabs, top_scope); return Getattr(symbols, scope); } /* ----------------------------------------------------------------------------- * Language::dumpSymbols() * ----------------------------------------------------------------------------- */ void Language::dumpSymbols() { Printf(stdout, "LANGUAGE SYMBOLS start =======================================\n"); Node *table = symtabs; Iterator ki = First(table); while (ki.key) { String *k = ki.key; Printf(stdout, "===================================================\n"); Printf(stdout, "%s -\n", k); { Symtab *symtab = Getattr(table, k); Iterator it = First(symtab); while (it.key) { String *symname = it.key; Printf(stdout, " %s\n", symname); it = Next(it); } } ki = Next(ki); } Printf(stdout, "LANGUAGE SYMBOLS finish =======================================\n"); } /* ----------------------------------------------------------------------------- * Language::symbolLookup() * ----------------------------------------------------------------------------- */ Node *Language::symbolLookup(const String *s, const_String_or_char_ptr scope) { Hash *symbols = Getattr(symtabs, scope ? scope : ""); if (!symbols) { return NULL; } return Getattr(symbols, s); } /* ----------------------------------------------------------------------------- * Language::classLookup() * * Tries to locate a class from a type definition * ----------------------------------------------------------------------------- */ Node *Language::classLookup(const SwigType *s) { static Hash *classtypes = 0; Node *n = 0; /* Look in hash of cached values */ n = classtypes ? Getattr(classtypes, s) : 0; if (!n) { Symtab *stab = 0; SwigType *ty1 = SwigType_typedef_resolve_all(s); SwigType *ty2 = SwigType_strip_qualifiers(ty1); String *base = SwigType_base(ty2); Replaceall(base, "class ", ""); Replaceall(base, "struct ", ""); Replaceall(base, "union ", ""); if (strncmp(Char(base), "::", 2) == 0) { String *oldbase = base; base = NewString(Char(base) + 2); Delete(oldbase); } String *prefix = SwigType_prefix(ty2); /* Do a symbol table search on the base type */ while (!n) { Hash *nstab; n = Swig_symbol_clookup(base, stab); if (!n) break; if (Strcmp(nodeType(n), "class") == 0) break; Node *sibling = n; while (sibling) { sibling = Getattr(sibling, "csym:nextSibling"); if (sibling && Strcmp(nodeType(sibling), "class") == 0) break; } if (sibling) break; n = parentNode(n); if (!n) break; nstab = Getattr(n, "sym:symtab"); n = 0; if ((!nstab) || (nstab == stab)) { break; } stab = nstab; } if (n) { /* Found a match. Look at the prefix. We only allow the cases where we want a proxy class for the particular type */ bool acceptable_prefix = (Len(prefix) == 0) || // simple type (pass by value) (Strcmp(prefix, "p.") == 0) || // pointer (Strcmp(prefix, "r.") == 0) || // reference (Strcmp(prefix, "z.") == 0) || // rvalue reference SwigType_prefix_is_simple_1D_array(prefix); // Simple 1D array (not arrays of pointers/references) // Also accept pointer by const reference, not non-const pointer reference if (!acceptable_prefix && (Strcmp(prefix, "r.p.") == 0)) { Delete(prefix); prefix = SwigType_prefix(ty1); acceptable_prefix = (Strncmp(prefix, "r.q(const", 9) == 0); } if (acceptable_prefix) { SwigType *cs = Copy(s); if (!classtypes) classtypes = NewHash(); Setattr(classtypes, cs, n); Delete(cs); } else { n = 0; } } Delete(prefix); Delete(base); Delete(ty2); Delete(ty1); } if (n && (GetFlag(n, "feature:ignore") || Getattr(n, "feature:onlychildren"))) { n = 0; } return n; } /* ----------------------------------------------------------------------------- * Language::enumLookup() * * Finds and returns the Node containing the enum declaration for the (enum) * type passed in. * ----------------------------------------------------------------------------- */ Node *Language::enumLookup(SwigType *s) { static Hash *enumtypes = 0; Node *n = 0; /* Look in hash of cached values */ n = enumtypes ? Getattr(enumtypes, s) : 0; if (!n) { Symtab *stab = 0; SwigType *lt = SwigType_ltype(s); SwigType *ty1 = SwigType_typedef_resolve_all(lt); SwigType *ty2 = SwigType_strip_qualifiers(ty1); String *base = SwigType_base(ty2); Replaceall(base, "enum ", ""); String *prefix = SwigType_prefix(ty2); if (strncmp(Char(base), "::", 2) == 0) { String *oldbase = base; base = NewString(Char(base) + 2); Delete(oldbase); } /* Look for type in symbol table */ while (!n) { Hash *nstab; n = Swig_symbol_clookup(base, stab); if (!n) break; if (Equal(nodeType(n), "enum")) break; if (Equal(nodeType(n), "enumforward") && GetFlag(n, "enumMissing")) break; n = parentNode(n); if (!n) break; nstab = Getattr(n, "sym:symtab"); n = 0; if ((!nstab) || (nstab == stab)) { break; } stab = nstab; } if (n) { /* Found a match. Look at the prefix. We only allow simple types. */ if (Len(prefix) == 0) { /* Simple type */ if (!enumtypes) enumtypes = NewHash(); Setattr(enumtypes, Copy(s), n); } else { n = 0; } } Delete(prefix); Delete(base); Delete(ty2); Delete(ty1); Delete(lt); } if (n && (GetFlag(n, "feature:ignore"))) { n = 0; } return n; } /* ----------------------------------------------------------------------------- * Language::allow_overloading() * ----------------------------------------------------------------------------- */ void Language::allow_overloading(int val) { overloading = val; } /* ----------------------------------------------------------------------------- * Language::allow_multiple_input() * ----------------------------------------------------------------------------- */ void Language::allow_multiple_input(int val) { multiinput = val; } /* ----------------------------------------------------------------------------- * Language::enable_cplus_runtime_mode() * ----------------------------------------------------------------------------- */ void Language::enable_cplus_runtime_mode() { cplus_runtime = 1; } /* ----------------------------------------------------------------------------- * Language::cplus_runtime_mode() * ----------------------------------------------------------------------------- */ int Language::cplus_runtime_mode() { return cplus_runtime; } /* ----------------------------------------------------------------------------- * Language::allow_directors() * ----------------------------------------------------------------------------- */ void Language::allow_directors(int val) { directors = val; } /* ----------------------------------------------------------------------------- * Language::directorsEnabled() * ----------------------------------------------------------------------------- */ int Language::directorsEnabled() const { return director_language && CPlusPlus && (directors || director_mode); } /* ----------------------------------------------------------------------------- * Language::allow_dirprot() * ----------------------------------------------------------------------------- */ void Language::allow_dirprot(int val) { director_protected_mode = val; } /* ----------------------------------------------------------------------------- * Language::allow_allprotected() * ----------------------------------------------------------------------------- */ void Language::allow_allprotected(int val) { all_protected_mode = val; } /* ----------------------------------------------------------------------------- * Language::dirprot_mode() * ----------------------------------------------------------------------------- */ int Language::dirprot_mode() const { return directorsEnabled() ? director_protected_mode : 0; } /* ----------------------------------------------------------------------------- * Language::need_nonpublic_ctor() * ----------------------------------------------------------------------------- */ int Language::need_nonpublic_ctor(Node *n) { /* detects when a protected constructor is needed, which is always the case if 'dirprot' mode is used. However, if that is not the case, we will try to strictly emit what is minimal to don't break the generated, while preserving compatibility with java, which always try to emit the default constructor. rules: - when dirprot mode is used, the protected constructors are always needed. - the protected default constructor is always needed. - if dirprot mode is not used, the protected constructors will be needed only if: - there is no any public constructor in the class, and - there is no protected default constructor In that case, all the declared protected constructors are needed since we don't know which one to pick up. Note: given all the complications here, I am always in favor to always enable 'dirprot', since is the C++ idea of protected members, and use %ignore for the method you don't want to add in the director class. */ if (directorsEnabled()) { if (is_protected(n)) { if (dirprot_mode()) { /* when using dirprot mode, the protected constructors are always needed */ return 1; } else { int is_default_ctor = !ParmList_numrequired(Getattr(n, "parms")); if (is_default_ctor) { /* the default protected constructor is always needed, for java compatibility */ return 1; } else { /* check if there is a public constructor */ Node *parent = Swig_methodclass(n); int public_ctor = Getattr(parent, "allocate:default_constructor") || Getattr(parent, "allocate:public_constructor"); if (!public_ctor) { /* if not, the protected constructor will be needed only if there is no protected default constructor declared */ int no_prot_default_ctor = !Getattr(parent, "allocate:default_base_constructor"); return no_prot_default_ctor; } } } } } return 0; } /* ----------------------------------------------------------------------------- * Language::need_nonpublic_member() * ----------------------------------------------------------------------------- */ int Language::need_nonpublic_member(Node *n) { if (directorsEnabled() && DirectorClassName) { if (is_protected(n)) { if (dirprot_mode()) { /* when using dirprot mode, the protected members are always needed. */ return 1; } else { /* if the method is pure virtual, we need it. */ int pure_virtual = (Cmp(Getattr(n, "value"), "0") == 0); return pure_virtual; } } } return 0; } /* ----------------------------------------------------------------------------- * Language::is_smart_pointer() * ----------------------------------------------------------------------------- */ int Language::is_smart_pointer() const { return SmartPointer; } /* ----------------------------------------------------------------------------- * Language::makeParameterName() * * Inputs: * n - Node * p - parameter node * arg_num - parameter argument number * setter - set this flag when wrapping variables * Return: * arg - a unique parameter name * ----------------------------------------------------------------------------- */ String *Language::makeParameterName(Node *n, Parm *p, int arg_num, bool setter) const { String *arg = 0; String *pn = Getattr(p, "name"); // Check if parameter name is a duplicate. int count = 0; ParmList *plist = Getattr(n, "parms"); while (plist) { if ((Cmp(pn, Getattr(plist, "name")) == 0)) count++; plist = nextSibling(plist); } // If the parameter has no name at all or has a non-unique name, replace it with "argN". if (!pn || count > 1) { arg = NewStringf("arg%d", arg_num); } else { // Otherwise, try to use the original C name, but modify it if necessary to avoid conflicting with the language keywords. arg = Swig_name_make(p, 0, pn, 0, 0); } if (setter && Cmp(arg, "self") != 0) { // Some languages (C#) insist on calling the input variable "value" while // others (D, Java) could, in principle, use something different but this // would require more work, and so we just use "value" for them too. // For setters the parameter name sometimes includes C++ scope resolution which needs removing. Delete(arg); arg = NewString("value"); } return arg; } /* ----------------------------------------------------------------------------- * Language::() * ----------------------------------------------------------------------------- */ bool Language::isNonVirtualProtectedAccess(Node *n) const { // Ideally is_non_virtual_protected_access() would contain all this logic, see // comments therein about vtable. return DirectorClassName && is_non_virtual_protected_access(n); } /* ----------------------------------------------------------------------------- * Language::extraDirectorProtectedCPPMethodsRequired() * ----------------------------------------------------------------------------- */ bool Language::extraDirectorProtectedCPPMethodsRequired() const { return true; } /* ----------------------------------------------------------------------------- * Language::nestedClassesSupport() * ----------------------------------------------------------------------------- */ Language::NestedClassSupport Language::nestedClassesSupport() const { return NCS_Unknown; } /* ----------------------------------------------------------------------------- * Language::kwargsSupport() * ----------------------------------------------------------------------------- */ bool Language::kwargsSupport() const { return false; } /* ----------------------------------------------------------------------------- * Language::is_wrapping_class() * ----------------------------------------------------------------------------- */ int Language::is_wrapping_class() const { return InClass; } /* ----------------------------------------------------------------------------- * Language::getCurrentClass() * ----------------------------------------------------------------------------- */ Node *Language::getCurrentClass() const { return CurrentClass; } /* ----------------------------------------------------------------------------- * Language::getNSpace() * ----------------------------------------------------------------------------- */ String *Language::getNSpace() const { return NSpace; } /* ----------------------------------------------------------------------------- * Language::getClassName() * ----------------------------------------------------------------------------- */ String *Language::getClassName() const { return ClassName; } /* ----------------------------------------------------------------------------- * Language::getClassPrefix() * ----------------------------------------------------------------------------- */ String *Language::getClassPrefix() const { return ClassPrefix; } /* ----------------------------------------------------------------------------- * Language::getEnumClassPrefix() * ----------------------------------------------------------------------------- */ String *Language::getEnumClassPrefix() const { return EnumClassPrefix; } /* ----------------------------------------------------------------------------- * Language::getClassType() * ----------------------------------------------------------------------------- */ String *Language::getClassType() const { return ClassType; } /* ----------------------------------------------------------------------------- * Language::abstractClassTest() * ----------------------------------------------------------------------------- */ //#define SWIG_DEBUG int Language::abstractClassTest(Node *n) { /* check for non public operator new */ if (GetFlag(n, "feature:notabstract")) return 0; if (Getattr(n, "allocate:nonew")) return 1; // A class cannot be instantiated if one of its bases has a private destructor // Note that if the above does not hold the class can be instantiated if its own destructor is private List *bases = Getattr(n, "bases"); if (bases) { for (int i = 0; i < Len(bases); i++) { Node *b = Getitem(bases, i); if (GetFlag(b, "allocate:private_destructor")) return 1; } } /* now check for the rest */ List *abstracts = Getattr(n, "abstracts"); if (!abstracts) return 0; int labs = Len(abstracts); #ifdef SWIG_DEBUG List *allbases = Getattr(n, "allbases"); Printf(stderr, "testing %s %d %d\n", Getattr(n, "name"), labs, Len(allbases)); #endif if (!labs) return 0; /*strange, but need to be fixed */ if (abstracts && !directorsEnabled()) return 1; if (!GetFlag(n, "feature:director")) return 1; Node *dirabstract = 0; Node *vtable = Getattr(n, "vtable"); if (vtable) { #ifdef SWIG_DEBUG Printf(stderr, "vtable %s %d %d\n", Getattr(n, "name"), Len(vtable), labs); #endif for (int i = 0; i < labs; i++) { Node *ni = Getitem(abstracts, i); Node *method_id = vtable_method_id(ni); if (!method_id) continue; bool exists_item = false; int len = Len(vtable); for (int i = 0; i < len; i++) { Node *item = Getitem(vtable, i); String *check_item = Getattr(item, "vmid"); if (Strcmp(method_id, check_item) == 0) { exists_item = true; break; } } #ifdef SWIG_DEBUG Printf(stderr, "method %s %d\n", method_id, exists_item ? 1 : 0); #endif Delete(method_id); if (!exists_item) { dirabstract = ni; break; } } if (dirabstract) { if (is_public(dirabstract)) { Swig_warning(WARN_LANG_DIRECTOR_ABSTRACT, Getfile(n), Getline(n), "Director class '%s' is abstract, abstract method '%s' is not accessible, maybe due to multiple inheritance or 'nodirector' feature\n", SwigType_namestr(Getattr(n, "name")), Getattr(dirabstract, "name")); } else { Swig_warning(WARN_LANG_DIRECTOR_ABSTRACT, Getfile(n), Getline(n), "Director class '%s' is abstract, abstract method '%s' is private\n", SwigType_namestr(Getattr(n, "name")), Getattr(dirabstract, "name")); } return 1; } } else { return 1; } return 0; } void Language::setSubclassInstanceCheck(String *nc) { none_comparison = nc; } void Language::setOverloadResolutionTemplates(String *argc, String *argv) { Delete(argc_template_string); argc_template_string = Copy(argc); Delete(argv_template_string); argv_template_string = Copy(argv); } int Language::is_assignable(Node *n) { if (GetFlag(n, "feature:immutable")) return 0; SwigType *type = Getattr(n, "type"); Node *cn = 0; SwigType *ftd = SwigType_typedef_resolve_all(type); SwigType *td = SwigType_strip_qualifiers(ftd); if (SwigType_type(td) == T_USER) { cn = Swig_symbol_clookup(td, 0); if (cn) { if ((Strcmp(nodeType(cn), "class") == 0)) { if (Getattr(cn, "allocate:noassign")) { SetFlag(n, "feature:immutable"); Delete(ftd); Delete(td); return 0; } } } } Delete(ftd); Delete(td); return 1; } String *Language::runtimeCode() { return NewString(""); } String *Language::defaultExternalRuntimeFilename() { return 0; } /* ----------------------------------------------------------------------------- * Language::replaceSpecialVariables() * * Language modules should implement this if special variables are to be handled * correctly in the $typemap(...) special variable macro. * method - typemap method name * tm - string containing typemap contents * parm - a parameter describing the typemap type to be handled * ----------------------------------------------------------------------------- */ void Language::replaceSpecialVariables(String *method, String *tm, Parm *parm) { (void)method; (void)tm; (void)parm; } Language *Language::instance() { return this_; } Hash *Language::getClassHash() const { return classhash; } swig-4.0.1/Source/Modules/main.cxx0000644000175000017500000013305313527063513016675 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * main.cxx * * Main entry point to the SWIG core. * ----------------------------------------------------------------------------- */ #include "swigconfig.h" #if defined(_WIN32) #define WIN32_LEAN_AND_MEAN #include #endif #include "swigmod.h" #include "swigwarn.h" #include "cparse.h" #include #include #include // for INT_MAX // Global variables static Language *lang = 0; // Language method int CPlusPlus = 0; int Extend = 0; // Extend flag int ForceExtern = 0; // Force extern mode int GenerateDefault = 1; // Generate default constructors int Verbose = 0; int AddExtern = 0; int NoExcept = 0; int SwigRuntime = 0; // 0 = no option, 1 = -runtime, 2 = -noruntime /* Suppress warning messages for private inheritance, preprocessor evaluation etc... WARN_PP_EVALUATION 202 WARN_PARSE_PRIVATE_INHERIT 309 WARN_PARSE_BUILTIN_NAME 321 WARN_PARSE_REDUNDANT 322 WARN_TYPE_ABSTRACT 403 WARN_TYPE_RVALUE_REF_QUALIFIER_IGNORED 405 WARN_LANG_OVERLOAD_CONST 512 */ #define EXTRA_WARNINGS "202,309,403,405,512,321,322" extern "C" { extern String *ModuleName; extern int ignore_nested_classes; extern int kwargs_supported; } /* usage string split into multiple parts otherwise string is too big for some compilers */ /* naming conventions for commandline options - no underscores, no capital letters, join words together * except when using a common prefix, then use '-' to separate, eg the debug-xxx options */ static const char *usage1 = (const char *) "\ \nGeneral Options\n\ -addextern - Add extra extern declarations\n\ -c++ - Enable C++ processing\n\ -co - Check out of the SWIG library\n\ -copyctor - Automatically generate copy constructors wherever possible\n\ -cpperraswarn - Treat the preprocessor #error statement as #warning (default)\n\ -cppext - Change file extension of generated C++ files to \n\ (default is cxx)\n\ -copyright - Display copyright notices\n\ -debug-classes - Display information about the classes found in the interface\n\ -debug-module - Display module parse tree at stages 1-4, is a csv list of stages\n\ -debug-symtabs - Display symbol tables information\n\ -debug-symbols - Display target language symbols in the symbol tables\n\ -debug-csymbols - Display C symbols in the symbol tables\n\ -debug-lsymbols - Display target language layer symbols\n\ -debug-tags - Display information about the tags found in the interface\n\ -debug-template - Display information for debugging templates\n\ -debug-top - Display entire parse tree at stages 1-4, is a csv list of stages\n\ -debug-typedef - Display information about the types and typedefs in the interface\n\ -debug-typemap - Display typemap debugging information\n\ -debug-tmsearch - Display typemap search debugging information\n\ -debug-tmused - Display typemaps used debugging information\n\ -directors - Turn on director mode for all the classes, mainly for testing\n\ -dirprot - Turn on wrapping of protected members for director classes (default)\n\ -D - Define a symbol (for conditional compilation)\n\ "; static const char *usage2 = (const char *) "\ -E - Preprocess only, does not generate wrapper code\n\ -external-runtime [file] - Export the SWIG runtime stack\n\ -fakeversion - Make SWIG fake the program version number to \n\ -fcompact - Compile in compact mode\n\ -features - Set global features, where is a comma separated list of\n\ features, eg -features directors,autodoc=1\n\ If no explicit value is given to the feature, a default of 1 is used\n\ -fastdispatch - Enable fast dispatch mode to produce faster overload dispatcher code\n\ -Fmicrosoft - Display error/warning messages in Microsoft format\n\ -Fstandard - Display error/warning messages in commonly used format\n\ -fvirtual - Compile in virtual elimination mode\n\ -help - Display help\n\ -I- - Don't search the current directory\n\ -I

- Look for SWIG files in directory \n\ -ignoremissing - Ignore missing include files\n\ -importall - Follow all #include statements as imports\n\ -includeall - Follow all #include statements\n\ -l - Include SWIG library file \n\ "; static const char *usage3 = (const char *) "\ -macroerrors - Report errors inside macros\n\ -makedefault - Create default constructors/destructors (the default)\n\ -M - List all dependencies\n\ -MD - Is equivalent to `-M -MF ', except `-E' is not implied\n\ -MF - Generate dependencies into and continue generating wrappers\n\ -MM - List dependencies, but omit files in SWIG library\n\ -MMD - Like `-MD', but omit files in SWIG library\n\ -module - Set module name to \n\ -MP - Generate phony targets for all dependencies\n\ -MT - Set the target of the rule emitted by dependency generation\n\ -nocontract - Turn off contract checking\n\ -nocpperraswarn - Do not treat the preprocessor #error statement as #warning\n\ -nodefault - Do not generate default constructors nor default destructors\n\ -nodefaultctor - Do not generate implicit default constructors\n\ -nodefaultdtor - Do not generate implicit default destructors\n\ -nodirprot - Do not wrap director protected members\n\ -noexcept - Do not wrap exception specifiers\n\ -nofastdispatch - Disable fast dispatch mode (default)\n\ -nopreprocess - Skip the preprocessor step\n\ -notemplatereduce - Disable reduction of the typedefs in templates\n\ "; static const char *usage4 = (const char *) "\ -O - Enable the optimization options:\n\ -fastdispatch -fvirtual\n\ -o - Set name of C/C++ output file to \n\ -oh - Set name of C++ output header file for directors to \n\ -outcurrentdir - Set default output dir to current dir instead of input file's path\n\ -outdir - Set language specific files output directory to \n\ -pcreversion - Display PCRE version information\n\ -small - Compile in virtual elimination and compact mode\n\ -swiglib - Report location of SWIG library and exit\n\ -templatereduce - Reduce all the typedefs in templates\n\ -v - Run in verbose mode\n\ -version - Display SWIG version number\n\ -Wall - Remove all warning suppression, also implies -Wextra\n\ -Wallkw - Enable keyword warnings for all the supported languages\n\ -Werror - Treat warnings as errors\n\ -Wextra - Adds the following additional warnings: " EXTRA_WARNINGS "\n\ -w - Suppress/add warning messages, eg -w401,+321 - see Warnings.html\n\ -xmlout - Write XML version of the parse tree to after normal processing\n\ \n\ Options can also be defined using the SWIG_FEATURES environment variable, for example:\n\ \n\ $ SWIG_FEATURES=\"-Wall\"\n\ $ export SWIG_FEATURES\n\ $ swig -python interface.i\n\ \n\ is equivalent to:\n\ \n\ $ swig -Wall -python interface.i\n\ \n\ Arguments may also be passed in a file, separated by whitespace. For example:\n\ \n\ $ echo \"-Wall -python interface.i\" > args.txt\n\ $ swig @args.txt\n\ \n"; // Local variables static String *LangSubDir = 0; // Target language library subdirectory static String *SwigLib = 0; // Library directory static String *SwigLibWinUnix = 0; // Extra library directory on Windows static int freeze = 0; static String *lang_config = 0; static const char *hpp_extension = "h"; static const char *cpp_extension = "cxx"; static const char *depends_extension = "d"; static String *outdir = 0; static String *xmlout = 0; static int outcurrentdir = 0; static int help = 0; static int checkout = 0; static int cpp_only = 0; static int no_cpp = 0; static String *outfile_name = 0; static String *outfile_name_h = 0; static int tm_debug = 0; static int dump_symtabs = 0; static int dump_symbols = 0; static int dump_csymbols = 0; static int dump_lang_symbols = 0; static int dump_tags = 0; static int dump_module = 0; static int dump_top = 0; static int dump_xml = 0; static int browse = 0; static int dump_typedef = 0; static int dump_classes = 0; static int werror = 0; static int depend = 0; static int depend_only = 0; static int depend_phony = 0; static int memory_debug = 0; static int allkw = 0; static DOH *cpps = 0; static String *dependencies_file = 0; static String *dependencies_target = 0; static int external_runtime = 0; static String *external_runtime_name = 0; enum { STAGE1=1, STAGE2=2, STAGE3=4, STAGE4=8, STAGEOVERFLOW=16 }; static List *libfiles = 0; static List *all_output_files = 0; /* ----------------------------------------------------------------------------- * check_extension() * * Checks the extension of a file to see if we should emit extern declarations. * ----------------------------------------------------------------------------- */ static bool check_extension(String *filename) { bool wanted = false; const char *name = Char(filename); if (!name) return 0; String *extension = Swig_file_extension(name); const char *c = Char(extension); if ((strcmp(c, ".c") == 0) || (strcmp(c, ".C") == 0) || (strcmp(c, ".cc") == 0) || (strcmp(c, ".cxx") == 0) || (strcmp(c, ".c++") == 0) || (strcmp(c, ".cpp") == 0)) { wanted = true; } Delete(extension); return wanted; } /* ----------------------------------------------------------------------------- * install_opts() * * Install all command line options as preprocessor symbols * ----------------------------------------------------------------------------- */ static void install_opts(int argc, char *argv[]) { int i; int noopt = 0; char *c; for (i = 1; i < (argc - 1); i++) { if (argv[i]) { if ((*argv[i] == '-') && (!isupper(*(argv[i] + 1)))) { String *opt = NewStringf("SWIGOPT%(upper)s", argv[i]); Replaceall(opt, "-", "_"); c = Char(opt); noopt = 0; while (*c) { if (!(isalnum(*c) || (*c == '_'))) { noopt = 1; break; } c++; } if (((i + 1) < (argc - 1)) && (argv[i + 1]) && (*argv[i + 1] != '-')) { Printf(opt, " %s", argv[i + 1]); i++; } else { Printf(opt, " 1"); } if (!noopt) { /* Printf(stdout,"%s\n", opt); */ Preprocessor_define(opt, 0); } Delete(opt); } } } } /* ----------------------------------------------------------------------------- * decode_numbers_list() * * Decode comma separated list into a binary number of the inputs or'd together * eg list="1,4" will return (2^0 || 2^3) = 0x1001 * ----------------------------------------------------------------------------- */ static unsigned int decode_numbers_list(String *numlist) { unsigned int decoded_number = 0; if (numlist) { List *numbers = Split(numlist, ',', INT_MAX); if (numbers && Len(numbers) > 0) { for (Iterator it = First(numbers); it.item; it = Next(it)) { String *numstring = it.item; // TODO: check that it is a number int number = atoi(Char(numstring)); if (number > 0 && number <= 16) { decoded_number |= (1 << (number-1)); } } } } return decoded_number; } /* ----------------------------------------------------------------------------- * Sets the output directory for language specific (proxy) files from the * C wrapper file if not set and corrects the directory name and adds a trailing * file separator if necessary. * ----------------------------------------------------------------------------- */ static void configure_outdir(const String *c_wrapper_outfile) { // Use the C wrapper file's directory if the output directory has not been set by user if (!outdir || Len(outdir) == 0) outdir = Swig_file_dirname(c_wrapper_outfile); Swig_filename_correct(outdir); // Add trailing file delimiter if not present in output directory name if (Len(outdir) > 0) { const char *outd = Char(outdir); if (strcmp(outd + strlen(outd) - strlen(SWIG_FILE_DELIMITER), SWIG_FILE_DELIMITER) != 0) Printv(outdir, SWIG_FILE_DELIMITER, NIL); } } /* This function sets the name of the configuration file */ void SWIG_config_file(const_String_or_char_ptr filename) { lang_config = NewString(filename); } /* Sets the target language subdirectory name */ void SWIG_library_directory(const char *subdirectory) { LangSubDir = NewString(subdirectory); } // Returns the directory for generating language specific files (non C/C++ files) const String *SWIG_output_directory() { assert(outdir); return outdir; } void SWIG_config_cppext(const char *ext) { cpp_extension = ext; } List *SWIG_output_files() { assert(all_output_files); return all_output_files; } void SWIG_setfeature(const char *cfeature, const char *cvalue) { Hash *features_hash = Swig_cparse_features(); String *name = NewString(""); String *fname = NewString(cfeature); String *fvalue = NewString(cvalue); Swig_feature_set(features_hash, name, 0, fname, fvalue, 0); Delete(name); Delete(fname); Delete(fvalue); } void SWIG_setfeatures(const char *c) { char feature[64]; char *fb = feature; char *fe = fb + 63; Hash *features_hash = Swig_cparse_features(); String *name = NewString(""); /* Printf(stderr,"all features %s\n", c); */ while (*c) { char *f = fb; String *fname = NewString("feature:"); String *fvalue = NewString(""); while ((f != fe) && *c != '=' && *c != ',' && *c) { *(f++) = *(c++); } *f = 0; Printf(fname, "%s", feature); if (*c && *(c++) == '=') { char value[64]; char *v = value; char *ve = v + 63; while ((v != ve) && *c != ',' && *c && !isspace(*c)) { *(v++) = *(c++); } *v = 0; Printf(fvalue, "%s", value); } else { Printf(fvalue, "1"); } /* Printf(stderr,"%s %s\n", fname, fvalue); */ Swig_feature_set(features_hash, name, 0, fname, fvalue, 0); Delete(fname); Delete(fvalue); } Delete(name); } /* This function handles the -external-runtime command option */ static void SWIG_dump_runtime() { String *outfile; File *runtime; String *s; outfile = external_runtime_name; if (!outfile) { outfile = lang->defaultExternalRuntimeFilename(); if (!outfile) { Printf(stderr, "*** Please provide a filename for the external runtime\n"); SWIG_exit(EXIT_FAILURE); } } runtime = NewFile(outfile, "w", SWIG_output_files()); if (!runtime) { FileErrorDisplay(outfile); SWIG_exit(EXIT_FAILURE); } Swig_banner(runtime); Printf(runtime, "\n"); s = Swig_include_sys("swiglabels.swg"); if (!s) { Printf(stderr, "*** Unable to open 'swiglabels.swg'\n"); Delete(runtime); SWIG_exit(EXIT_FAILURE); } Printf(runtime, "%s", s); Delete(s); s = Swig_include_sys("swigerrors.swg"); if (!s) { Printf(stderr, "*** Unable to open 'swigerrors.swg'\n"); Delete(runtime); SWIG_exit(EXIT_FAILURE); } Printf(runtime, "%s", s); Delete(s); s = Swig_include_sys("swigrun.swg"); if (!s) { Printf(stderr, "*** Unable to open 'swigrun.swg'\n"); Delete(runtime); SWIG_exit(EXIT_FAILURE); } Printf(runtime, "%s", s); Delete(s); s = lang->runtimeCode(); Printf(runtime, "%s", s); Delete(s); s = Swig_include_sys("runtime.swg"); if (!s) { Printf(stderr, "*** Unable to open 'runtime.swg'\n"); Delete(runtime); SWIG_exit(EXIT_FAILURE); } Printf(runtime, "%s", s); Delete(s); Delete(runtime); SWIG_exit(EXIT_SUCCESS); } static void getoptions(int argc, char *argv[]) { int i; // Get options for (i = 1; i < argc; i++) { if (argv[i] && !Swig_check_marked(i)) { if (strncmp(argv[i], "-I-", 3) == 0) { // Don't push/pop directories Swig_set_push_dir(0); Swig_mark_arg(i); } else if (strncmp(argv[i], "-I", 2) == 0) { // Add a new directory search path char *a = Swig_copy_string(argv[i] + 2); Swig_add_directory((DOH *) a); free(a); Swig_mark_arg(i); } else if (strncmp(argv[i], "-D", 2) == 0) { String *d = NewString(argv[i] + 2); Replace(d, "=", " ", DOH_REPLACE_ANY | DOH_REPLACE_FIRST); Preprocessor_define((DOH *) d, 0); Delete(d); // Create a symbol Swig_mark_arg(i); } else if (strcmp(argv[i], "-E") == 0) { cpp_only = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-nopreprocess") == 0) { no_cpp = 1; Swig_mark_arg(i); } else if ((strcmp(argv[i], "-verbose") == 0) || (strcmp(argv[i], "-v") == 0)) { Verbose = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-c++") == 0) { CPlusPlus = 1; Preprocessor_define((DOH *) "__cplusplus __cplusplus", 0); Swig_cparse_cplusplus(1); Swig_mark_arg(i); } else if (strcmp(argv[i], "-c++out") == 0) { // Undocumented Swig_cparse_cplusplusout(1); Swig_mark_arg(i); } else if (strcmp(argv[i], "-fcompact") == 0) { Wrapper_compact_print_mode_set(1); Swig_mark_arg(i); } else if (strcmp(argv[i], "-fvirtual") == 0) { Wrapper_virtual_elimination_mode_set(1); Swig_mark_arg(i); } else if (strcmp(argv[i], "-fastdispatch") == 0) { Wrapper_fast_dispatch_mode_set(1); Swig_mark_arg(i); } else if (strcmp(argv[i], "-nofastdispatch") == 0) { Wrapper_fast_dispatch_mode_set(0); Swig_mark_arg(i); } else if (strcmp(argv[i], "-naturalvar") == 0) { Wrapper_naturalvar_mode_set(1); Swig_mark_arg(i); } else if (strcmp(argv[i], "-directors") == 0) { SWIG_setfeature("feature:director", "1"); Wrapper_director_mode_set(1); Swig_mark_arg(i); } else if (strcmp(argv[i], "-dirprot") == 0) { Wrapper_director_protected_mode_set(1); Swig_mark_arg(i); } else if (strcmp(argv[i], "-nodirprot") == 0) { Wrapper_director_protected_mode_set(0); Swig_mark_arg(i); } else if (strcmp(argv[i], "-pcreversion") == 0) { String *version = Swig_pcre_version(); Printf(stdout, "%s\n", version); Delete(version); Swig_mark_arg(i); SWIG_exit(EXIT_SUCCESS); } else if (strcmp(argv[i], "-small") == 0) { Wrapper_compact_print_mode_set(1); Wrapper_virtual_elimination_mode_set(1); Swig_mark_arg(i); } else if (strcmp(argv[i], "-runtime") == 0) { // Used to also accept -c. removed in swig-1.3.36 Swig_mark_arg(i); Swig_warning(WARN_DEPRECATED_OPTC, "SWIG", 1, "-runtime, -noruntime command line options are deprecated.\n"); SwigRuntime = 1; } else if (strcmp(argv[i], "-noruntime") == 0) { Swig_mark_arg(i); Swig_warning(WARN_DEPRECATED_OPTC, "SWIG", 1, "-runtime, -noruntime command line options are deprecated.\n"); SwigRuntime = 2; } else if (strcmp(argv[i], "-external-runtime") == 0) { external_runtime = 1; Swig_mark_arg(i); if (argv[i + 1]) { external_runtime_name = NewString(argv[i + 1]); Swig_mark_arg(i + 1); i++; } } else if ((strcmp(argv[i], "-make_default") == 0) || (strcmp(argv[i], "-makedefault") == 0)) { GenerateDefault = 1; Swig_mark_arg(i); } else if ((strcmp(argv[i], "-no_default") == 0) || (strcmp(argv[i], "-nodefault") == 0)) { GenerateDefault = 0; Swig_warning(WARN_DEPRECATED_NODEFAULT, "SWIG", 1, "dangerous, use -nodefaultctor, -nodefaultdtor instead.\n"); Swig_mark_arg(i); } else if ((strcmp(argv[i], "-nodefaultctor") == 0)) { SWIG_setfeature("feature:nodefaultctor", "1"); Swig_mark_arg(i); } else if ((strcmp(argv[i], "-nodefaultdtor") == 0)) { SWIG_setfeature("feature:nodefaultdtor", "1"); Swig_mark_arg(i); } else if ((strcmp(argv[i], "-copyctor") == 0)) { SWIG_setfeature("feature:copyctor", "1"); Swig_mark_arg(i); } else if (strcmp(argv[i], "-noexcept") == 0) { NoExcept = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-noextern") == 0) { Swig_warning(WARN_DEPRECATED_NOEXTERN, "SWIG", 1, "-noextern command line option is deprecated; extern is no longer generated by default.\n"); AddExtern = 0; Swig_mark_arg(i); } else if (strcmp(argv[i], "-addextern") == 0) { AddExtern = 1; Swig_mark_arg(i); } else if ((strcmp(argv[i], "-debug-template") == 0) || (strcmp(argv[i], "-debug_template") == 0) || (strcmp(argv[i], "-show_templates") == 0)) { Swig_cparse_debug_templates(1); Swig_mark_arg(i); } else if (strcmp(argv[i], "-templatereduce") == 0) { SWIG_cparse_template_reduce(1); Swig_mark_arg(i); } else if (strcmp(argv[i], "-notemplatereduce") == 0) { SWIG_cparse_template_reduce(0); Swig_mark_arg(i); } else if (strcmp(argv[i], "-macroerrors") == 0) { Swig_cparse_follow_locators(1); Swig_mark_arg(i); } else if (strcmp(argv[i], "-swiglib") == 0) { Printf(stdout, "%s\n", SwigLib); if (SwigLibWinUnix) Printf(stdout, "%s\n", SwigLibWinUnix); SWIG_exit(EXIT_SUCCESS); } else if (strcmp(argv[i], "-o") == 0) { Swig_mark_arg(i); if (argv[i + 1]) { outfile_name = NewString(argv[i + 1]); Swig_filename_correct(outfile_name); if (!outfile_name_h || !dependencies_file) { char *ext = strrchr(Char(outfile_name), '.'); String *basename = ext ? NewStringWithSize(Char(outfile_name), (int)(Char(ext) - Char(outfile_name))) : NewString(outfile_name); if (!dependencies_file) { dependencies_file = NewStringf("%s.%s", basename, depends_extension); } if (!outfile_name_h) { Printf(basename, ".%s", hpp_extension); outfile_name_h = NewString(basename); } Delete(basename); } Swig_mark_arg(i + 1); i++; } else { Swig_arg_error(); } } else if (strcmp(argv[i], "-oh") == 0) { Swig_mark_arg(i); if (argv[i + 1]) { outfile_name_h = NewString(argv[i + 1]); Swig_filename_correct(outfile_name_h); Swig_mark_arg(i + 1); i++; } else { Swig_arg_error(); } } else if (strcmp(argv[i], "-fakeversion") == 0) { Swig_mark_arg(i); if (argv[i + 1]) { Swig_set_fakeversion(argv[i + 1]); Swig_mark_arg(i + 1); i++; } else { Swig_arg_error(); } } else if (strcmp(argv[i], "-version") == 0) { fprintf(stdout, "\nSWIG Version %s\n", Swig_package_version()); fprintf(stdout, "\nCompiled with %s [%s]\n", SWIG_CXX, SWIG_PLATFORM); fprintf(stdout, "\nConfigured options: %cpcre\n", #ifdef HAVE_PCRE '+' #else '-' #endif ); fprintf(stdout, "\nPlease see %s for reporting bugs and further information\n", PACKAGE_BUGREPORT); SWIG_exit(EXIT_SUCCESS); } else if (strcmp(argv[i], "-copyright") == 0) { fprintf(stdout, "\nSWIG Version %s\n", Swig_package_version()); fprintf(stdout, "Copyright (c) 1995-1998\n"); fprintf(stdout, "University of Utah and the Regents of the University of California\n"); fprintf(stdout, "Copyright (c) 1998-2005\n"); fprintf(stdout, "University of Chicago\n"); fprintf(stdout, "Copyright (c) 2005-2006\n"); fprintf(stdout, "Arizona Board of Regents (University of Arizona)\n"); SWIG_exit(EXIT_SUCCESS); } else if (strncmp(argv[i], "-l", 2) == 0) { // Add a new directory search path Append(libfiles, argv[i] + 2); Swig_mark_arg(i); } else if (strcmp(argv[i], "-co") == 0) { checkout = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-features") == 0) { Swig_mark_arg(i); if (argv[i + 1]) { SWIG_setfeatures(argv[i + 1]); Swig_mark_arg(i + 1); } else { Swig_arg_error(); } } else if (strcmp(argv[i], "-freeze") == 0) { freeze = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-includeall") == 0) { Preprocessor_include_all(1); Swig_mark_arg(i); } else if (strcmp(argv[i], "-importall") == 0) { Preprocessor_import_all(1); Swig_mark_arg(i); } else if (strcmp(argv[i], "-ignoremissing") == 0) { Preprocessor_ignore_missing(1); Swig_mark_arg(i); } else if (strcmp(argv[i], "-cpperraswarn") == 0) { Preprocessor_error_as_warning(1); Swig_mark_arg(i); } else if (strcmp(argv[i], "-nocpperraswarn") == 0) { Preprocessor_error_as_warning(0); Swig_mark_arg(i); } else if (strcmp(argv[i], "-cppext") == 0) { Swig_mark_arg(i); if (argv[i + 1]) { SWIG_config_cppext(argv[i + 1]); Swig_mark_arg(i + 1); i++; } else { Swig_arg_error(); } } else if ((strcmp(argv[i], "-debug-typemap") == 0) || (strcmp(argv[i], "-debug_typemap") == 0) || (strcmp(argv[i], "-tm_debug") == 0)) { tm_debug = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-debug-tmsearch") == 0) { Swig_typemap_search_debug_set(); Swig_mark_arg(i); } else if (strcmp(argv[i], "-debug-tmused") == 0) { Swig_typemap_used_debug_set(); Swig_mark_arg(i); } else if (strcmp(argv[i], "-module") == 0) { Swig_mark_arg(i); if (argv[i + 1]) { ModuleName = NewString(argv[i + 1]); Swig_mark_arg(i + 1); } else { Swig_arg_error(); } } else if (strcmp(argv[i], "-M") == 0) { depend = 1; depend_only = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-MM") == 0) { depend = 2; depend_only = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-MF") == 0) { Swig_mark_arg(i); if (argv[i + 1]) { dependencies_file = NewString(argv[i + 1]); Swig_mark_arg(i + 1); } else { Swig_arg_error(); } } else if (strcmp(argv[i], "-MD") == 0) { depend = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-MMD") == 0) { depend = 2; Swig_mark_arg(i); } else if (strcmp(argv[i], "-MP") == 0) { depend_phony = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-MT") == 0) { Swig_mark_arg(i); if (argv[i + 1]) { if (!dependencies_target) dependencies_target = NewString(argv[i + 1]); else Printf(dependencies_target, " %s", argv[i + 1]); Swig_mark_arg(i + 1); } else { Swig_arg_error(); } } else if (strcmp(argv[i], "-outdir") == 0) { Swig_mark_arg(i); if (argv[i + 1]) { outdir = NewString(argv[i + 1]); Swig_mark_arg(i + 1); } else { Swig_arg_error(); } } else if (strcmp(argv[i], "-outcurrentdir") == 0) { Swig_mark_arg(i); outcurrentdir = 1; } else if (strcmp(argv[i], "-Wall") == 0) { Swig_mark_arg(i); Swig_warnall(); } else if (strcmp(argv[i], "-Wallkw") == 0) { allkw = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-Werror") == 0) { werror = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-Wextra") == 0) { Swig_mark_arg(i); Swig_warnfilter(EXTRA_WARNINGS, 0); } else if (strncmp(argv[i], "-w", 2) == 0) { Swig_mark_arg(i); Swig_warnfilter(argv[i] + 2, 1); } else if (strcmp(argv[i], "-debug-symtabs") == 0) { dump_symtabs = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-debug-symbols") == 0) { dump_symbols = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-debug-csymbols") == 0) { dump_csymbols = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-debug-lsymbols") == 0) { dump_lang_symbols = 1; Swig_mark_arg(i); } else if ((strcmp(argv[i], "-debug-tags") == 0) || (strcmp(argv[i], "-dump_tags") == 0)) { dump_tags = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-debug-top") == 0) { Swig_mark_arg(i); if (argv[i + 1]) { String *dump_list = NewString(argv[i + 1]); dump_top = decode_numbers_list(dump_list); if (dump_top < STAGE1 || dump_top >= STAGEOVERFLOW) Swig_arg_error(); else Swig_mark_arg(i + 1); Delete(dump_list); } else { Swig_arg_error(); } } else if (strcmp(argv[i], "-debug-module") == 0) { Swig_mark_arg(i); if (argv[i + 1]) { String *dump_list = NewString(argv[i + 1]); dump_module = decode_numbers_list(dump_list); if (dump_module < STAGE1 || dump_module >= STAGEOVERFLOW) Swig_arg_error(); else Swig_mark_arg(i + 1); Delete(dump_list); } else { Swig_arg_error(); } } else if ((strcmp(argv[i], "-dump_tree") == 0) || (strcmp(argv[i], "-dump_top") == 0)) { dump_top |= STAGE4; Swig_mark_arg(i); } else if (strcmp(argv[i], "-dump_module") == 0) { dump_module |= STAGE4; Swig_mark_arg(i); } else if (strcmp(argv[i], "-dump_parse_module") == 0) { dump_module |= STAGE1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-dump_parse_top") == 0) { dump_top |= STAGE1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-dump_xml") == 0) { dump_xml = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-xmlout") == 0) { dump_xml = 1; Swig_mark_arg(i); if (argv[i + 1]) { xmlout = NewString(argv[i + 1]); Swig_mark_arg(i + 1); } else { Swig_arg_error(); } } else if (strcmp(argv[i], "-nocontract") == 0) { Swig_mark_arg(i); Swig_contract_mode_set(0); } else if (strcmp(argv[i], "-browse") == 0) { browse = 1; Swig_mark_arg(i); } else if ((strcmp(argv[i], "-debug-typedef") == 0) || (strcmp(argv[i], "-dump_typedef") == 0)) { dump_typedef = 1; Swig_mark_arg(i); } else if ((strcmp(argv[i], "-debug-classes") == 0) || (strcmp(argv[i], "-dump_classes") == 0)) { dump_classes = 1; Swig_mark_arg(i); } else if ((strcmp(argv[i], "-debug-memory") == 0) || (strcmp(argv[i], "-dump_memory") == 0)) { memory_debug = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-Fstandard") == 0) { Swig_error_msg_format(EMF_STANDARD); Swig_mark_arg(i); } else if (strcmp(argv[i], "-Fmicrosoft") == 0) { Swig_error_msg_format(EMF_MICROSOFT); Swig_mark_arg(i); } else if (strcmp(argv[i], "-O") == 0) { Wrapper_virtual_elimination_mode_set(1); Wrapper_fast_dispatch_mode_set(1); Swig_mark_arg(i); } else if (strcmp(argv[i], "-help") == 0) { fputs(usage1, stdout); fputs(usage2, stdout); fputs(usage3, stdout); fputs(usage4, stdout); Swig_mark_arg(i); help = 1; } } } } int SWIG_main(int argc, char *argv[], const TargetLanguageModule *tlm) { char *c; /* Initialize the SWIG core */ Swig_init(); // Default warning suppression Swig_warnfilter(EXTRA_WARNINGS, 1); // Initialize the preprocessor Preprocessor_init(); // Set lang to a dummy value if no target language was specified so we // can process options enough to handle -version, etc. lang = tlm ? tlm->fac() : new Language; // Set up some default symbols (available in both SWIG interface files // and C files) Preprocessor_define((DOH *) "SWIG 1", 0); Preprocessor_define((DOH *) "__STDC__", 0); // Set the SWIG version value in format 0xAABBCC from package version expected to be in format A.B.C String *package_version = NewString(PACKAGE_VERSION); /* Note that the fakeversion has not been set at this point */ char *token = strtok(Char(package_version), "."); String *vers = NewString("SWIG_VERSION 0x"); int count = 0; while (token) { int len = (int)strlen(token); assert(len == 1 || len == 2); Printf(vers, "%s%s", (len == 1) ? "0" : "", token); token = strtok(NULL, "."); count++; } Delete(package_version); assert(count == 3); // Check version format is correct /* Turn on contracts */ Swig_contract_mode_set(1); Preprocessor_define(vers, 0); /* Turn off directors mode */ Wrapper_director_mode_set(0); Wrapper_director_protected_mode_set(1); // Inform the parser if the nested classes should be ignored unless explicitly told otherwise via feature:flatnested ignore_nested_classes = lang->nestedClassesSupport() == Language::NCS_Unknown ? 1 : 0; kwargs_supported = lang->kwargsSupport() ? 1 : 0; // Create Library search directories // Check for SWIG_LIB environment variable if ((c = getenv("SWIG_LIB")) == (char *) 0) { #if defined(_WIN32) char buf[MAX_PATH]; char *p; if (!(GetModuleFileName(0, buf, MAX_PATH) == 0 || (p = strrchr(buf, '\\')) == 0)) { *(p + 1) = '\0'; SwigLib = NewStringf("%sLib", buf); // Native windows installation path } else { SwigLib = NewStringf(""); // Unexpected error } if (Len(SWIG_LIB_WIN_UNIX) > 0) SwigLibWinUnix = NewString(SWIG_LIB_WIN_UNIX); // Unix installation path using a drive letter (for msys/mingw) #else SwigLib = NewString(SWIG_LIB); #endif } else { SwigLib = NewString(c); } libfiles = NewList(); all_output_files = NewList(); /* Check for SWIG_FEATURES environment variable */ getoptions(argc, argv); // Define the __cplusplus symbol if (CPlusPlus) Preprocessor_define((DOH *) "__cplusplus __cplusplus", 0); // Parse language dependent options lang->main(argc, argv); if (help) { Printf(stdout, "\nNote: 'swig - -help' displays options for a specific target language.\n\n"); SWIG_exit(EXIT_SUCCESS); // Exit if we're in help mode } // Check all of the options to make sure we're cool. // Don't check for an input file if -external-runtime is passed Swig_check_options(external_runtime ? 0 : 1); if (CPlusPlus && cparse_cplusplusout) { Printf(stderr, "The -c++out option is for C input but C++ input has been requested via -c++\n"); SWIG_exit(EXIT_FAILURE); } install_opts(argc, argv); // Add language dependent directory to the search path { String *rl = NewString(""); Printf(rl, ".%sswig_lib%s%s", SWIG_FILE_DELIMITER, SWIG_FILE_DELIMITER, LangSubDir); Swig_add_directory(rl); if (SwigLibWinUnix) { rl = NewString(""); Printf(rl, "%s%s%s", SwigLibWinUnix, SWIG_FILE_DELIMITER, LangSubDir); Swig_add_directory(rl); } rl = NewString(""); Printf(rl, "%s%s%s", SwigLib, SWIG_FILE_DELIMITER, LangSubDir); Swig_add_directory(rl); } Swig_add_directory((String *) "." SWIG_FILE_DELIMITER "swig_lib"); if (SwigLibWinUnix) Swig_add_directory((String *) SwigLibWinUnix); Swig_add_directory(SwigLib); if (Verbose) { Printf(stdout, "Language subdirectory: %s\n", LangSubDir); Printf(stdout, "Search paths:\n"); List *sp = Swig_search_path(); Iterator s; for (s = First(sp); s.item; s = Next(s)) { Printf(stdout, " %s\n", s.item); } } // handle the -external-runtime argument if (external_runtime) SWIG_dump_runtime(); // If we made it this far, looks good. go for it.... input_file = NewString(argv[argc - 1]); Swig_filename_correct(input_file); // If the user has requested to check out a file, handle that if (checkout) { DOH *s; String *outfile = input_file; if (outfile_name) outfile = outfile_name; if (Verbose) Printf(stdout, "Handling checkout...\n"); s = Swig_include(input_file); if (!s) { Printf(stderr, "Unable to locate '%s' in the SWIG library.\n", input_file); } else { FILE *f = Swig_open(outfile); if (f) { fclose(f); Printf(stderr, "File '%s' already exists. Checkout aborted.\n", outfile); } else { File *f_outfile = NewFile(outfile, "w", SWIG_output_files()); if (!f_outfile) { FileErrorDisplay(outfile); SWIG_exit(EXIT_FAILURE); } else { if (Verbose) Printf(stdout, "'%s' checked out from the SWIG library.\n", outfile); Printv(f_outfile, s, NIL); Delete(f_outfile); } } } } else { // Run the preprocessor if (Verbose) Printf(stdout, "Preprocessing...\n"); { int i; String *fs = NewString(""); FILE *df = Swig_open(input_file); if (!df) { df = Swig_include_open(input_file); if (!df) { char *cfile = Char(input_file); if (cfile && cfile[0] == '-') { Printf(stderr, "Unable to find option or file '%s', ", input_file); Printf(stderr, "Use 'swig -help' for more information.\n"); } else { Printf(stderr, "Unable to find file '%s'.\n", input_file); } SWIG_exit(EXIT_FAILURE); } else { Swig_warning(WARN_DEPRECATED_INPUT_FILE, "SWIG", 1, "Use of the include path to find the input file is deprecated and will not work with ccache. Please include the path when specifying the input file.\n"); // so that behaviour is like c/c++ compilers } } if (!tlm) { Printf(stderr, "No target language specified.\n"); Printf(stderr, "Use 'swig -help' for more information.\n"); SWIG_exit(EXIT_FAILURE); } if (!no_cpp) { fclose(df); Printf(fs, "%%include \n"); if (allkw) { Printf(fs, "%%include \n"); } if (lang_config) { Printf(fs, "\n%%include <%s>\n", lang_config); } Printf(fs, "%%include(maininput=\"%s\") \"%s\"\n", Swig_filename_escape(input_file), Swig_filename_escape(Swig_last_file())); for (i = 0; i < Len(libfiles); i++) { Printf(fs, "\n%%include \"%s\"\n", Swig_filename_escape(Getitem(libfiles, i))); } Seek(fs, 0, SEEK_SET); cpps = Preprocessor_parse(fs); Delete(fs); } else { cpps = Swig_read_file(df); fclose(df); } if (Swig_error_count()) { SWIG_exit(EXIT_FAILURE); } if (cpp_only) { Printf(stdout, "%s", cpps); SWIG_exit(EXIT_SUCCESS); } if (depend) { if (!no_cpp) { String *outfile; File *f_dependencies_file = 0; String *inputfile_filename = outcurrentdir ? Swig_file_filename(input_file): Copy(input_file); String *basename = Swig_file_basename(inputfile_filename); if (!outfile_name) { if (CPlusPlus || lang->cplus_runtime_mode()) { outfile = NewStringf("%s_wrap.%s", basename, cpp_extension); } else { outfile = NewStringf("%s_wrap.c", basename); } } else { outfile = NewString(outfile_name); } if (dependencies_file && Len(dependencies_file) != 0) { f_dependencies_file = NewFile(dependencies_file, "w", SWIG_output_files()); if (!f_dependencies_file) { FileErrorDisplay(dependencies_file); SWIG_exit(EXIT_FAILURE); } } else if (!depend_only) { String *filename = NewStringf("%s_wrap.%s", basename, depends_extension); f_dependencies_file = NewFile(filename, "w", SWIG_output_files()); if (!f_dependencies_file) { FileErrorDisplay(filename); SWIG_exit(EXIT_FAILURE); } } else f_dependencies_file = stdout; if (dependencies_target) { Printf(f_dependencies_file, "%s: ", dependencies_target); } else { Printf(f_dependencies_file, "%s: ", outfile); } List *files = Preprocessor_depend(); List *phony_targets = NewList(); for (int i = 0; i < Len(files); i++) { int use_file = 1; if (depend == 2) { if ((Strncmp(Getitem(files, i), SwigLib, Len(SwigLib)) == 0) || (SwigLibWinUnix && (Strncmp(Getitem(files, i), SwigLibWinUnix, Len(SwigLibWinUnix)) == 0))) use_file = 0; } if (use_file) { Printf(f_dependencies_file, "\\\n %s ", Getitem(files, i)); if (depend_phony) Append(phony_targets, Getitem(files, i)); } } Printf(f_dependencies_file, "\n"); if (depend_phony) { for (int i = 0; i < Len(phony_targets); i++) { Printf(f_dependencies_file, "\n%s:\n", Getitem(phony_targets, i)); } } if (f_dependencies_file != stdout) Delete(f_dependencies_file); if (depend_only) SWIG_exit(EXIT_SUCCESS); Delete(inputfile_filename); Delete(basename); Delete(phony_targets); } else { Printf(stderr, "Cannot generate dependencies with -nopreprocess\n"); // Actually we could but it would be inefficient when just generating dependencies, as it would be done after Swig_cparse SWIG_exit(EXIT_FAILURE); } } Seek(cpps, 0, SEEK_SET); } /* Register a null file with the file handler */ Swig_register_filebyname("null", NewString("")); // Pass control over to the specific language interpreter if (Verbose) { fprintf(stdout, "Starting language-specific parse...\n"); fflush(stdout); } Node *top = Swig_cparse(cpps); if (dump_top & STAGE1) { Printf(stdout, "debug-top stage 1\n"); Swig_print_tree(top); } if (dump_module & STAGE1) { Printf(stdout, "debug-module stage 1\n"); Swig_print_tree(Getattr(top, "module")); } if (!CPlusPlus) { if (Verbose) Printf(stdout, "Processing unnamed structs...\n"); Swig_nested_name_unnamed_c_structs(top); } Swig_extend_unused_check(); if (Verbose) { Printf(stdout, "Processing types...\n"); } Swig_process_types(top); if (dump_top & STAGE2) { Printf(stdout, "debug-top stage 2\n"); Swig_print_tree(top); } if (dump_module & STAGE2) { Printf(stdout, "debug-module stage 2\n"); Swig_print_tree(Getattr(top, "module")); } if (Verbose) { Printf(stdout, "C++ analysis...\n"); } Swig_default_allocators(top); if (CPlusPlus) { if (Verbose) Printf(stdout, "Processing nested classes...\n"); Swig_nested_process_classes(top); } if (dump_top & STAGE3) { Printf(stdout, "debug-top stage 3\n"); Swig_print_tree(top); } if (top && (dump_module & STAGE3)) { Printf(stdout, "debug-module stage 3\n"); Swig_print_tree(Getattr(top, "module")); } if (Verbose) { Printf(stdout, "Generating wrappers...\n"); } if (top && dump_classes) { Hash *classes = Getattr(top, "classes"); if (classes) { Printf(stdout, "Classes\n"); Printf(stdout, "------------\n"); Iterator ki; for (ki = First(classes); ki.key; ki = Next(ki)) { Printf(stdout, "%s\n", ki.key); } } } if (dump_typedef) { SwigType_print_scope(); } if (dump_symtabs) { Swig_symbol_print_tables(Swig_symbol_global_scope()); Swig_symbol_print_tables_summary(); } if (dump_symbols) { Swig_symbol_print_symbols(); } if (dump_csymbols) { Swig_symbol_print_csymbols(); } if (dump_tags) { Swig_print_tags(top, 0); } if (top) { if (!Getattr(top, "name")) { Printf(stderr, "No module name specified using %%module or -module.\n"); SWIG_exit(EXIT_FAILURE); } else { /* Set some filename information on the object */ String *infile = scanner_get_main_input_file(); if (!infile) { Printf(stderr, "Missing input file in preprocessed output.\n"); SWIG_exit(EXIT_FAILURE); } Setattr(top, "infile", infile); // Note: if nopreprocess then infile is the original input file, otherwise input_file Setattr(top, "inputfile", input_file); String *infile_filename = outcurrentdir ? Swig_file_filename(infile): Copy(infile); String *basename = Swig_file_basename(infile_filename); if (!outfile_name) { if (CPlusPlus || lang->cplus_runtime_mode()) { Setattr(top, "outfile", NewStringf("%s_wrap.%s", basename, cpp_extension)); } else { Setattr(top, "outfile", NewStringf("%s_wrap.c", basename)); } } else { Setattr(top, "outfile", outfile_name); } if (!outfile_name_h) { Setattr(top, "outfile_h", NewStringf("%s_wrap.%s", basename, hpp_extension)); } else { Setattr(top, "outfile_h", outfile_name_h); } configure_outdir(Getattr(top, "outfile")); if (Swig_contract_mode_get()) { Swig_contracts(top); } // Check the extension for a c/c++ file. If so, we're going to declare everything we see as "extern" ForceExtern = check_extension(input_file); if (tlm->status == Experimental) { Swig_warning(WARN_LANG_EXPERIMENTAL, "SWIG", 1, "Experimental target language. " "Target language %s specified by %s is an experimental language. " "Please read about SWIG experimental languages, http://swig.org/Doc4.0/Introduction.html#Introduction_experimental_status.\n", tlm->help ? tlm->help : "", tlm->name); } lang->top(top); if (browse) { Swig_browser(top, 0); } Delete(infile_filename); Delete(basename); } } if (dump_lang_symbols) { lang->dumpSymbols(); } if (dump_top & STAGE4) { Printf(stdout, "debug-top stage 4\n"); Swig_print_tree(top); } if (dump_module & STAGE4) { Printf(stdout, "debug-module stage 4\n"); Swig_print_tree(Getattr(top, "module")); } if (dump_xml && top) { delete lang; lang = 0; Swig_print_xml(top, xmlout); } Delete(top); } if (tm_debug) Swig_typemap_debug(); if (memory_debug) DohMemoryDebug(); char *outfiles = getenv("CCACHE_OUTFILES"); if (outfiles) { File *f_outfiles = NewFile(outfiles, "w", 0); if (!f_outfiles) { Printf(stderr, "Failed to write list of output files to the filename '%s' specified in CCACHE_OUTFILES environment variable - ", outfiles); FileErrorDisplay(outfiles); SWIG_exit(EXIT_FAILURE); } else { int i; for (i = 0; i < Len(all_output_files); i++) Printf(f_outfiles, "%s\n", Getitem(all_output_files, i)); Delete(f_outfiles); } } // Deletes Delete(libfiles); Preprocessor_delete(); while (freeze) { } delete lang; int error_count = werror ? Swig_warn_count() : 0; error_count += Swig_error_count(); if (error_count != 0) SWIG_exit(error_count); return 0; } /* ----------------------------------------------------------------------------- * SWIG_exit() * * Cleanup and either freeze or exit * ----------------------------------------------------------------------------- */ void SWIG_exit(int exit_code) { while (freeze) { } if (exit_code > 0) { CloseAllOpenFiles(); /* Remove all generated files */ if (all_output_files) { for (int i = 0; i < Len(all_output_files); i++) { String *filename = Getitem(all_output_files, i); int removed = remove(Char(filename)); if (removed == -1) fprintf(stderr, "On exit, could not delete file %s: %s\n", Char(filename), strerror(errno)); } } } exit(exit_code); } swig-4.0.1/Source/Modules/php.cxx0000644000175000017500000026621713527063513016551 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * php.cxx * * PHP language module for SWIG. * ----------------------------------------------------------------------------- */ /* FIXME: PHP OO wrapping TODO list: * * Medium term: * * Handle default parameters on overloaded methods in PHP where possible. * (Mostly done - just need to handle cases of overloaded methods with * default parameters...) * This is an optimisation - we could handle this case using a PHP * default value, but currently we treat it as we would for a default * value which is a compound C++ expression (i.e. as if we had a * method with two overloaded forms instead of a single method with * a default parameter value). * * Long term: * * Sort out locale-dependent behaviour of strtod() - it's harmless unless * SWIG ever sets the locale and DOH/base.c calls atof, so we're probably * OK currently at least. */ /* * TODO: Replace remaining stderr messages with Swig_error or Swig_warning * (may need to add more WARN_PHP_xxx codes...) */ #include "swigmod.h" #include #include static const char *usage = "\ PHP 7 Options (available with -php7)\n\ -noproxy - Don't generate proxy classes.\n\ -prefix - Prepend to all class names in PHP wrappers\n\ \n"; /* The original class wrappers for PHP stored the pointer to the C++ class in * the object property _cPtr. If we use the same name for the member variable * which we put the pointer to the C++ class in, then the flat function * wrappers will automatically pull it out without any changes being required. * FIXME: Isn't using a leading underscore a bit suspect here? */ #define SWIG_PTR "_cPtr" /* This is the name of the hash where the variables existing only in PHP * classes are stored. */ #define SWIG_DATA "_pData" static int constructors = 0; static String *NOTCLASS = NewString("Not a class"); static Node *classnode = 0; static String *module = 0; static String *cap_module = 0; static String *prefix = 0; static String *shadow_classname = 0; static File *f_begin = 0; static File *f_runtime = 0; static File *f_runtime_h = 0; static File *f_h = 0; static File *f_phpcode = 0; static File *f_directors = 0; static File *f_directors_h = 0; static String *phpfilename = 0; static String *s_header; static String *s_wrappers; static String *s_init; static String *r_init; // RINIT user code static String *s_shutdown; // MSHUTDOWN user code static String *r_shutdown; // RSHUTDOWN user code static String *s_vinit; // varinit initialization code. static String *s_vdecl; static String *s_cinit; // consttab initialization code. static String *s_oinit; static String *s_arginfo; static String *s_entry; static String *cs_entry; static String *all_cs_entry; static String *pragma_incl; static String *pragma_code; static String *pragma_phpinfo; static String *pragma_version; static String *s_oowrappers; static String *s_fakeoowrappers; static String *s_phpclasses; /* To reduce code size (generated and compiled) we only want to emit each * different arginfo once, so we need to track which have been used. */ static Hash *arginfo_used; /* Variables for using PHP classes */ static Node *current_class = 0; static Hash *shadow_get_vars; static Hash *shadow_set_vars; static Hash *zend_types = 0; static int shadow = 1; static bool class_has_ctor = false; static String *wrapping_member_constant = NULL; // These static variables are used to pass some state from Handlers into functionWrapper static enum { standard = 0, memberfn, staticmemberfn, membervar, staticmembervar, constructor, directorconstructor } wrapperType = standard; extern "C" { static void (*r_prevtracefunc) (const SwigType *t, String *mangled, String *clientdata) = 0; } static void SwigPHP_emit_resource_registrations() { Iterator ki; bool emitted_default_dtor = false; if (!zend_types) return; ki = First(zend_types); if (ki.key) Printf(s_oinit, "\n /* Register resource destructors for pointer types */\n"); while (ki.key) { DOH *key = ki.key; Node *class_node = ki.item; String *human_name = key; String *rsrc_dtor_name = NULL; // write out body if (class_node != NOTCLASS) { String *destructor = Getattr(class_node, "destructor"); human_name = Getattr(class_node, "sym:name"); if (!human_name) human_name = Getattr(class_node, "name"); // Do we have a known destructor for this type? if (destructor) { rsrc_dtor_name = NewStringf("_wrap_destroy%s", key); // Write out custom destructor function Printf(s_wrappers, "static ZEND_RSRC_DTOR_FUNC(%s) {\n", rsrc_dtor_name); Printf(s_wrappers, " %s(res, SWIGTYPE%s->name);\n", destructor, key); Printf(s_wrappers, "}\n"); } } if (!rsrc_dtor_name) { rsrc_dtor_name = NewString("_swig_default_rsrc_destroy"); if (!emitted_default_dtor) { // Write out custom destructor function Printf(s_wrappers, "static ZEND_RSRC_DTOR_FUNC(%s) {\n", rsrc_dtor_name); Printf(s_wrappers, " efree(res->ptr);\n"); Printf(s_wrappers, "}\n"); emitted_default_dtor = true; } } // declare le_swig_ to store php registration Printf(s_vdecl, "static int le_swig_%s=0; /* handle for %s */\n", key, human_name); // register with php Printf(s_oinit, " le_swig_%s=zend_register_list_destructors_ex" "(%s, NULL, SWIGTYPE%s->name, module_number);\n", key, rsrc_dtor_name, key); // store php type in class struct Printf(s_oinit, " SWIG_TypeClientData(SWIGTYPE%s,&le_swig_%s);\n", key, key); Delete(rsrc_dtor_name); ki = Next(ki); } } class PHP : public Language { public: PHP() { director_language = 1; } /* ------------------------------------------------------------ * main() * ------------------------------------------------------------ */ virtual void main(int argc, char *argv[]) { SWIG_library_directory("php"); for (int i = 1; i < argc; i++) { if (strcmp(argv[i], "-prefix") == 0) { if (argv[i + 1]) { prefix = NewString(argv[i + 1]); Swig_mark_arg(i); Swig_mark_arg(i + 1); i++; } else { Swig_arg_error(); } } else if ((strcmp(argv[i], "-noshadow") == 0) || (strcmp(argv[i], "-noproxy") == 0)) { shadow = 0; Swig_mark_arg(i); } else if (strcmp(argv[i], "-help") == 0) { fputs(usage, stdout); } } Preprocessor_define("SWIGPHP 1", 0); Preprocessor_define("SWIGPHP7 1", 0); SWIG_typemap_lang("php"); SWIG_config_file("php.swg"); allow_overloading(); } /* ------------------------------------------------------------ * top() * ------------------------------------------------------------ */ virtual int top(Node *n) { String *filen; /* Check if directors are enabled for this module. */ Node *mod = Getattr(n, "module"); if (mod) { Node *options = Getattr(mod, "options"); if (options && Getattr(options, "directors")) { allow_directors(); } } /* Set comparison with null for ConstructorToFunction */ setSubclassInstanceCheck(NewString("Z_TYPE_P($arg) != IS_NULL")); /* Initialize all of the output files */ String *outfile = Getattr(n, "outfile"); String *outfile_h = Getattr(n, "outfile_h"); /* main output file */ f_begin = NewFile(outfile, "w", SWIG_output_files()); if (!f_begin) { FileErrorDisplay(outfile); SWIG_exit(EXIT_FAILURE); } f_runtime = NewStringEmpty(); /* sections of the output file */ s_init = NewStringEmpty(); r_init = NewStringEmpty(); s_shutdown = NewStringEmpty(); r_shutdown = NewStringEmpty(); s_header = NewString("/* header section */\n"); s_wrappers = NewString("/* wrapper section */\n"); /* subsections of the init section */ s_vinit = NewStringEmpty(); s_vdecl = NewString("/* vdecl subsection */\n"); s_cinit = NewString(" /* cinit subsection */\n"); s_oinit = NewString(" /* oinit subsection */\n"); pragma_phpinfo = NewStringEmpty(); s_phpclasses = NewString("/* PHP Proxy Classes */\n"); f_directors_h = NewStringEmpty(); f_directors = NewStringEmpty(); if (directorsEnabled()) { f_runtime_h = NewFile(outfile_h, "w", SWIG_output_files()); if (!f_runtime_h) { FileErrorDisplay(outfile_h); SWIG_exit(EXIT_FAILURE); } } /* Register file targets with the SWIG file handler */ Swig_register_filebyname("begin", f_begin); Swig_register_filebyname("runtime", f_runtime); Swig_register_filebyname("init", s_init); Swig_register_filebyname("rinit", r_init); Swig_register_filebyname("shutdown", s_shutdown); Swig_register_filebyname("rshutdown", r_shutdown); Swig_register_filebyname("header", s_header); Swig_register_filebyname("wrapper", s_wrappers); Swig_register_filebyname("director", f_directors); Swig_register_filebyname("director_h", f_directors_h); Swig_banner(f_begin); Printf(f_runtime, "\n\n#ifndef SWIGPHP\n#define SWIGPHP\n#endif\n\n"); if (directorsEnabled()) { Printf(f_runtime, "#define SWIG_DIRECTORS\n"); } /* Set the module name */ module = Copy(Getattr(n, "name")); cap_module = NewStringf("%(upper)s", module); if (!prefix) prefix = NewStringEmpty(); Printf(f_runtime, "#define SWIG_PREFIX \"%s\"\n", prefix); Printf(f_runtime, "#define SWIG_PREFIX_LEN %lu\n", (unsigned long)Len(prefix)); if (directorsEnabled()) { Swig_banner(f_directors_h); Printf(f_directors_h, "\n"); Printf(f_directors_h, "#ifndef SWIG_%s_WRAP_H_\n", cap_module); Printf(f_directors_h, "#define SWIG_%s_WRAP_H_\n\n", cap_module); String *filename = Swig_file_filename(outfile_h); Printf(f_directors, "\n#include \"%s\"\n\n", filename); Delete(filename); } /* PHP module file */ filen = NewStringEmpty(); Printv(filen, SWIG_output_directory(), module, ".php", NIL); phpfilename = NewString(filen); f_phpcode = NewFile(filen, "w", SWIG_output_files()); if (!f_phpcode) { FileErrorDisplay(filen); SWIG_exit(EXIT_FAILURE); } Printf(f_phpcode, "error_msg = default_error_msg;\n"); Printf(s_header, " globals->error_code = default_error_code;\n"); Printf(s_header, "}\n"); Printf(s_header, "static void SWIG_ResetError(void) {\n"); Printf(s_header, " SWIG_ErrorMsg() = default_error_msg;\n"); Printf(s_header, " SWIG_ErrorCode() = default_error_code;\n"); Printf(s_header, "}\n"); Append(s_header, "\n"); Printf(s_header, "ZEND_NAMED_FUNCTION(_wrap_swig_%s_alter_newobject) {\n", module); Append(s_header, " zval args[2];\n"); Append(s_header, " swig_object_wrapper *value;\n"); Append(s_header, "\n"); Append(s_header, " SWIG_ResetError();\n"); Append(s_header, " if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) {\n"); Append(s_header, " WRONG_PARAM_COUNT;\n"); Append(s_header, " }\n"); Append(s_header, "\n"); Append(s_header, " value = (swig_object_wrapper *) Z_RES_VAL(args[0]);\n"); Append(s_header, " value->newobject = zval_is_true(&args[1]);\n"); Append(s_header, "\n"); Append(s_header, " return;\n"); Append(s_header, "}\n"); Printf(s_header, "ZEND_NAMED_FUNCTION(_wrap_swig_%s_get_newobject) {\n", module); Append(s_header, " zval args[1];\n"); Append(s_header, " swig_object_wrapper *value;\n"); Append(s_header, "\n"); Append(s_header, " SWIG_ResetError();\n"); Append(s_header, " if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) {\n"); Append(s_header, " WRONG_PARAM_COUNT;\n"); Append(s_header, " }\n"); Append(s_header, "\n"); Append(s_header, " value = (swig_object_wrapper *) Z_RES_VAL(args[0]);\n"); Append(s_header, " RETVAL_LONG(value->newobject);\n"); Append(s_header, "\n"); Append(s_header, " return;\n"); Append(s_header, "}\n"); Printf(s_header, "#define SWIG_name \"%s\"\n", module); Printf(s_header, "#ifdef __cplusplus\n"); Printf(s_header, "extern \"C\" {\n"); Printf(s_header, "#endif\n"); Printf(s_header, "#include \"php.h\"\n"); Printf(s_header, "#include \"php_ini.h\"\n"); Printf(s_header, "#include \"ext/standard/info.h\"\n"); Printf(s_header, "#include \"php_%s.h\"\n", module); Printf(s_header, "#ifdef __cplusplus\n"); Printf(s_header, "}\n"); Printf(s_header, "#endif\n\n"); if (directorsEnabled()) { // Insert director runtime Swig_insert_file("director_common.swg", s_header); Swig_insert_file("director.swg", s_header); } /* Create the .h file too */ filen = NewStringEmpty(); Printv(filen, SWIG_output_directory(), "php_", module, ".h", NIL); f_h = NewFile(filen, "w", SWIG_output_files()); if (!f_h) { FileErrorDisplay(filen); SWIG_exit(EXIT_FAILURE); } Swig_banner(f_h); Printf(f_h, "\n"); Printf(f_h, "#ifndef PHP_%s_H\n", cap_module); Printf(f_h, "#define PHP_%s_H\n\n", cap_module); Printf(f_h, "extern zend_module_entry %s_module_entry;\n", module); Printf(f_h, "#define phpext_%s_ptr &%s_module_entry\n\n", module, module); Printf(f_h, "#ifdef PHP_WIN32\n"); Printf(f_h, "# define PHP_%s_API __declspec(dllexport)\n", cap_module); Printf(f_h, "#else\n"); Printf(f_h, "# define PHP_%s_API\n", cap_module); Printf(f_h, "#endif\n\n"); /* start the arginfo section */ s_arginfo = NewString("/* arginfo subsection */\n"); arginfo_used = NewHash(); /* start the function entry section */ s_entry = NewString("/* entry subsection */\n"); /* holds all the per-class function entry sections */ all_cs_entry = NewString("/* class entry subsection */\n"); cs_entry = NULL; Printf(s_entry, "/* Every non-class user visible function must have an entry here */\n"); Printf(s_entry, "static zend_function_entry %s_functions[] = {\n", module); /* Emit all of the code */ Language::top(n); SwigPHP_emit_resource_registrations(); /* start the init section */ { String * s_init_old = s_init; s_init = NewString("/* init section */\n"); Printv(s_init, "zend_module_entry ", module, "_module_entry = {\n", NIL); Printf(s_init, " STANDARD_MODULE_HEADER,\n"); Printf(s_init, " \"%s\",\n", module); Printf(s_init, " %s_functions,\n", module); Printf(s_init, " PHP_MINIT(%s),\n", module); if (Len(s_shutdown) > 0) { Printf(s_init, " PHP_MSHUTDOWN(%s),\n", module); } else { Printf(s_init, " NULL, /* No MSHUTDOWN code */\n"); } if (Len(r_init) > 0 || Len(s_vinit) > 0) { Printf(s_init, " PHP_RINIT(%s),\n", module); } else { Printf(s_init, " NULL, /* No RINIT code */\n"); } if (Len(r_shutdown) > 0) { Printf(s_init, " PHP_RSHUTDOWN(%s),\n", module); } else { Printf(s_init, " NULL, /* No RSHUTDOWN code */\n"); } if (Len(pragma_phpinfo) > 0) { Printf(s_init, " PHP_MINFO(%s),\n", module); } else { Printf(s_init, " NULL, /* No MINFO code */\n"); } if (Len(pragma_version) > 0) { Printf(s_init, " \"%s\",\n", pragma_version); } else { Printf(s_init, " NO_VERSION_YET,\n"); } Printf(s_init, " STANDARD_MODULE_PROPERTIES\n"); Printf(s_init, "};\n"); Printf(s_init, "zend_module_entry* SWIG_module_entry = &%s_module_entry;\n\n", module); Printf(s_init, "#ifdef __cplusplus\n"); Printf(s_init, "extern \"C\" {\n"); Printf(s_init, "#endif\n"); // We want to write "SWIGEXPORT ZEND_GET_MODULE(%s)" but ZEND_GET_MODULE // in PHP7 has "extern "C" { ... }" around it so we can't do that. Printf(s_init, "SWIGEXPORT zend_module_entry *get_module(void) { return &%s_module_entry; }\n", module); Printf(s_init, "#ifdef __cplusplus\n"); Printf(s_init, "}\n"); Printf(s_init, "#endif\n\n"); Printf(s_init, "#define SWIG_php_minit PHP_MINIT_FUNCTION(%s)\n\n", module); Printv(s_init, s_init_old, NIL); Delete(s_init_old); } /* We have to register the constants before they are (possibly) used * by the pointer typemaps. This all needs re-arranging really as * things are being called in the wrong order */ // Printv(s_init,s_resourcetypes,NIL); /* We need this after all classes written out by ::top */ Printf(s_oinit, " CG(active_class_entry) = NULL;\n"); Printf(s_oinit, " /* end oinit subsection */\n"); Printf(s_init, "%s\n", s_oinit); /* Constants generated during top call */ Printf(s_cinit, " /* end cinit subsection */\n"); Printf(s_init, "%s\n", s_cinit); Clear(s_cinit); Delete(s_cinit); Printf(s_init, " return SUCCESS;\n"); Printf(s_init, "}\n\n"); // Now do REQUEST init which holds any user specified %rinit, and also vinit if (Len(r_init) > 0 || Len(s_vinit) > 0) { Printf(f_h, "PHP_RINIT_FUNCTION(%s);\n", module); Printf(s_init, "PHP_RINIT_FUNCTION(%s)\n{\n", module); if (Len(r_init) > 0) { Printv(s_init, "/* rinit section */\n", r_init, "\n", NIL); } if (Len(s_vinit) > 0) { /* finish our init section which will have been used by class wrappers */ Printv(s_init, " /* vinit subsection */\n", s_vinit, "\n" " /* end vinit subsection */\n", NIL); Clear(s_vinit); } Delete(s_vinit); Printf(s_init, " return SUCCESS;\n"); Printf(s_init, "}\n\n"); } Printf(f_h, "PHP_MINIT_FUNCTION(%s);\n", module); if (Len(s_shutdown) > 0) { Printf(f_h, "PHP_MSHUTDOWN_FUNCTION(%s);\n", module); Printv(s_init, "PHP_MSHUTDOWN_FUNCTION(", module, ")\n" "/* shutdown section */\n" "{\n", s_shutdown, " return SUCCESS;\n" "}\n\n", NIL); } if (Len(r_shutdown) > 0) { Printf(f_h, "PHP_RSHUTDOWN_FUNCTION(%s);\n", module); Printf(s_init, "PHP_RSHUTDOWN_FUNCTION(%s)\n{\n", module); Printf(s_init, "/* rshutdown section */\n"); Printf(s_init, "%s\n", r_shutdown); Printf(s_init, " return SUCCESS;\n"); Printf(s_init, "}\n\n"); } if (Len(pragma_phpinfo) > 0) { Printf(f_h, "PHP_MINFO_FUNCTION(%s);\n", module); Printf(s_init, "PHP_MINFO_FUNCTION(%s)\n{\n", module); Printf(s_init, "%s", pragma_phpinfo); Printf(s_init, "}\n"); } Printf(s_init, "/* end init section */\n"); Printf(f_h, "\n#endif /* PHP_%s_H */\n", cap_module); Delete(f_h); String *type_table = NewStringEmpty(); SwigType_emit_type_table(f_runtime, type_table); Printf(s_header, "%s", type_table); Delete(type_table); /* Oh dear, more things being called in the wrong order. This whole * function really needs totally redoing. */ if (directorsEnabled()) { Dump(f_directors_h, f_runtime_h); Printf(f_runtime_h, "\n"); Printf(f_runtime_h, "#endif\n"); Delete(f_runtime_h); } Printf(s_header, "/* end header section */\n"); Printf(s_wrappers, "/* end wrapper section */\n"); Printf(s_vdecl, "/* end vdecl subsection */\n"); Dump(f_runtime, f_begin); Printv(f_begin, s_header, NIL); if (directorsEnabled()) { Dump(f_directors, f_begin); } Printv(f_begin, s_vdecl, s_wrappers, NIL); Printv(f_begin, all_cs_entry, "\n\n", s_arginfo, "\n\n", s_entry, " SWIG_ZEND_NAMED_FE(swig_", module, "_alter_newobject,_wrap_swig_", module, "_alter_newobject,NULL)\n" " SWIG_ZEND_NAMED_FE(swig_", module, "_get_newobject,_wrap_swig_", module, "_get_newobject,NULL)\n" " ZEND_FE_END\n};\n\n", NIL); Printv(f_begin, s_init, NIL); Delete(s_header); Delete(s_wrappers); Delete(s_init); Delete(s_vdecl); Delete(all_cs_entry); Delete(s_entry); Delete(s_arginfo); Delete(f_runtime); Delete(f_begin); Delete(arginfo_used); Printf(f_phpcode, "%s\n%s\n", pragma_incl, pragma_code); if (s_fakeoowrappers) { Printf(f_phpcode, "abstract class %s {", Len(prefix) ? prefix : module); Printf(f_phpcode, "%s", s_fakeoowrappers); Printf(f_phpcode, "}\n\n"); Delete(s_fakeoowrappers); s_fakeoowrappers = NULL; } Printf(f_phpcode, "%s\n", s_phpclasses); Delete(f_phpcode); return SWIG_OK; } /* Just need to append function names to function table to register with PHP. */ void create_command(String *cname, String *iname, Node *n) { // This is for the single main zend_function_entry record Printf(f_h, "ZEND_NAMED_FUNCTION(%s);\n", iname); // We want to only emit each different arginfo once, as that reduces the // size of both the generated source code and the compiled extension // module. To do this, we name the arginfo to encode the number of // parameters and which (if any) are passed by reference by using a // sequence of 0s (for non-reference) and 1s (for by references). ParmList *l = Getattr(n, "parms"); String * arginfo_code = NewStringEmpty(); for (Parm *p = l; p; p = Getattr(p, "tmap:in:next")) { /* Ignored parameters */ if (checkAttribute(p, "tmap:in:numinputs", "0")) { continue; } Append(arginfo_code, GetFlag(p, "tmap:in:byref") ? "1" : "0"); } if (!GetFlag(arginfo_used, arginfo_code)) { // Not had this one before, so emit it. SetFlag(arginfo_used, arginfo_code); Printf(s_arginfo, "ZEND_BEGIN_ARG_INFO_EX(swig_arginfo_%s, 0, 0, 0)\n", arginfo_code); for (const char * p = Char(arginfo_code); *p; ++p) { Printf(s_arginfo, " ZEND_ARG_PASS_INFO(%c)\n", *p); } Printf(s_arginfo, "ZEND_END_ARG_INFO()\n"); } String * s = cs_entry; if (!s) s = s_entry; Printf(s, " SWIG_ZEND_NAMED_FE(%(lower)s,%s,swig_arginfo_%s)\n", cname, iname, arginfo_code); Delete(arginfo_code); } /* ------------------------------------------------------------ * dispatchFunction() * ------------------------------------------------------------ */ void dispatchFunction(Node *n) { /* Last node in overloaded chain */ int maxargs; String *tmp = NewStringEmpty(); if (Swig_directorclass(n) && wrapperType == directorconstructor) { /* We have an extra 'this' parameter. */ SetFlag(n, "wrap:this"); } String *dispatch = Swig_overload_dispatch(n, "%s(INTERNAL_FUNCTION_PARAM_PASSTHRU); return;", &maxargs); /* Generate a dispatch wrapper for all overloaded functions */ Wrapper *f = NewWrapper(); String *symname = Getattr(n, "sym:name"); String *wname = Swig_name_wrapper(symname); create_command(symname, wname, n); Printv(f->def, "ZEND_NAMED_FUNCTION(", wname, ") {\n", NIL); Wrapper_add_local(f, "argc", "int argc"); Printf(tmp, "zval argv[%d]", maxargs); Wrapper_add_local(f, "argv", tmp); Printf(f->code, "argc = ZEND_NUM_ARGS();\n"); Printf(f->code, "zend_get_parameters_array_ex(argc, argv);\n"); Replaceall(dispatch, "$args", "self,args"); Printv(f->code, dispatch, "\n", NIL); Printf(f->code, "SWIG_ErrorCode() = E_ERROR;\n"); Printf(f->code, "SWIG_ErrorMsg() = \"No matching function for overloaded '%s'\";\n", symname); Printv(f->code, "SWIG_FAIL();\n", NIL); Printv(f->code, "}\n", NIL); Wrapper_print(f, s_wrappers); DelWrapper(f); Delete(dispatch); Delete(tmp); Delete(wname); } /* ------------------------------------------------------------ * functionWrapper() * ------------------------------------------------------------ */ /* Helper method for PHP::functionWrapper */ bool is_class(SwigType *t) { Node *n = classLookup(t); if (n) { String *r = Getattr(n, "php:proxy"); // Set by classDeclaration() if (!r) r = Getattr(n, "sym:name"); // Not seen by classDeclaration yet, but this is the name if (r) return true; } return false; } virtual int functionWrapper(Node *n) { String *name = GetChar(n, "name"); String *iname = GetChar(n, "sym:name"); SwigType *d = Getattr(n, "type"); ParmList *l = Getattr(n, "parms"); String *nodeType = Getattr(n, "nodeType"); int newobject = GetFlag(n, "feature:new"); int constructor = (Cmp(nodeType, "constructor") == 0); Parm *p; int i; int numopt; String *tm; Wrapper *f; String *wname; int overloaded = 0; String *overname = 0; if (Cmp(nodeType, "destructor") == 0) { // We just generate the Zend List Destructor and let Zend manage the // reference counting. There's no explicit destructor, but the user can // just do `$obj = null;' to remove a reference to an object. return CreateZendListDestructor(n); } // Test for overloading; if (Getattr(n, "sym:overloaded")) { overloaded = 1; overname = Getattr(n, "sym:overname"); } else { if (!addSymbol(iname, n)) return SWIG_ERROR; } wname = Swig_name_wrapper(iname); if (overname) { Printf(wname, "%s", overname); } f = NewWrapper(); String *outarg = NewStringEmpty(); String *cleanup = NewStringEmpty(); Printv(f->def, "ZEND_NAMED_FUNCTION(", wname, ") {\n", NIL); emit_parameter_variables(l, f); /* Attach standard typemaps */ emit_attach_parmmaps(l, f); // Not issued for overloaded functions. if (!overloaded) { create_command(iname, wname, n); } // wrap:parms is used by overload resolution. Setattr(n, "wrap:parms", l); int num_arguments = emit_num_arguments(l); int num_required = emit_num_required(l); numopt = num_arguments - num_required; if (wrapperType == directorconstructor) num_arguments++; if (num_arguments > 0) { String *args = NewStringEmpty(); if (wrapperType == directorconstructor) Wrapper_add_local(f, "arg0", "zval * arg0"); Printf(args, "zval args[%d]", num_arguments); Wrapper_add_local(f, "args", args); Delete(args); args = NULL; } // This generated code may be called: // 1) as an object method, or // 2) as a class-method/function (without a "this_ptr") // Option (1) has "this_ptr" for "this", option (2) needs it as // first parameter // NOTE: possible we ignore this_ptr as a param for native constructor Printf(f->code, "SWIG_ResetError();\n"); if (numopt > 0) { // membervariable wrappers do not have optional args Wrapper_add_local(f, "arg_count", "int arg_count"); Printf(f->code, "arg_count = ZEND_NUM_ARGS();\n"); Printf(f->code, "if(arg_count<%d || arg_count>%d ||\n", num_required, num_arguments); Printf(f->code, " zend_get_parameters_array_ex(arg_count,args)!=SUCCESS)\n"); Printf(f->code, "\tWRONG_PARAM_COUNT;\n\n"); } else { if (num_arguments == 0) { Printf(f->code, "if(ZEND_NUM_ARGS() != 0) {\n"); } else { Printf(f->code, "if(ZEND_NUM_ARGS() != %d || zend_get_parameters_array_ex(%d, args) != SUCCESS) {\n", num_arguments, num_arguments); } Printf(f->code, "WRONG_PARAM_COUNT;\n}\n\n"); } if (wrapperType == directorconstructor) Printf(f->code, "arg0 = &args[0];\n \n"); /* Now convert from PHP to C variables */ // At this point, argcount if used is the number of deliberately passed args // not including this_ptr even if it is used. // It means error messages may be out by argbase with error // reports. We can either take argbase into account when raising // errors, or find a better way of dealing with _thisptr. // I would like, if objects are wrapped, to assume _thisptr is always // _this and not the first argument. // This may mean looking at Language::memberfunctionHandler int limit = num_arguments; if (wrapperType == directorconstructor) limit--; for (i = 0, p = l; i < limit; i++) { String *source; /* Skip ignored arguments */ //while (Getattr(p,"tmap:ignore")) { p = Getattr(p,"tmap:ignore:next");} while (checkAttribute(p, "tmap:in:numinputs", "0")) { p = Getattr(p, "tmap:in:next"); } SwigType *pt = Getattr(p, "type"); if (wrapperType == directorconstructor) { source = NewStringf("args[%d]", i+1); } else { source = NewStringf("args[%d]", i); } String *ln = Getattr(p, "lname"); /* Check if optional */ if (i >= num_required) { Printf(f->code, "\tif(arg_count > %d) {\n", i); } if ((tm = Getattr(p, "tmap:in"))) { Replaceall(tm, "$source", &source); Replaceall(tm, "$target", ln); Replaceall(tm, "$input", source); Setattr(p, "emit:input", source); Printf(f->code, "%s\n", tm); if (i == 0 && Getattr(p, "self")) { Printf(f->code, "\tif(!arg1) SWIG_PHP_Error(E_ERROR, \"this pointer is NULL\");\n"); } p = Getattr(p, "tmap:in:next"); if (i >= num_required) { Printf(f->code, "}\n"); } continue; } else { Swig_warning(WARN_TYPEMAP_IN_UNDEF, input_file, line_number, "Unable to use type %s as a function argument.\n", SwigType_str(pt, 0)); } if (i >= num_required) { Printf(f->code, "\t}\n"); } Delete(source); } if (is_member_director(n)) { Wrapper_add_local(f, "upcall", "bool upcall = false"); Printf(f->code, "upcall = !Swig::Director::swig_is_overridden_method(\"%s%s\", \"%s\");\n", prefix, Swig_class_name(Swig_methodclass(n)), name); } Swig_director_emit_dynamic_cast(n, f); /* Insert constraint checking code */ for (p = l; p;) { if ((tm = Getattr(p, "tmap:check"))) { Replaceall(tm, "$target", Getattr(p, "lname")); Printv(f->code, tm, "\n", NIL); p = Getattr(p, "tmap:check:next"); } else { p = nextSibling(p); } } /* Insert cleanup code */ for (i = 0, p = l; p; i++) { if ((tm = Getattr(p, "tmap:freearg"))) { Replaceall(tm, "$source", Getattr(p, "lname")); Printv(cleanup, tm, "\n", NIL); p = Getattr(p, "tmap:freearg:next"); } else { p = nextSibling(p); } } /* Insert argument output code */ bool hasargout = false; for (i = 0, p = l; p; i++) { if ((tm = Getattr(p, "tmap:argout")) && Len(tm)) { hasargout = true; Replaceall(tm, "$source", Getattr(p, "lname")); // Replaceall(tm,"$input",Getattr(p,"lname")); Replaceall(tm, "$target", "return_value"); Replaceall(tm, "$result", "return_value"); Replaceall(tm, "$arg", Getattr(p, "emit:input")); Replaceall(tm, "$input", Getattr(p, "emit:input")); Printv(outarg, tm, "\n", NIL); p = Getattr(p, "tmap:argout:next"); } else { p = nextSibling(p); } } Setattr(n, "wrap:name", wname); /* emit function call */ String *actioncode = emit_action(n); if ((tm = Swig_typemap_lookup_out("out", n, Swig_cresult_name(), f, actioncode))) { Replaceall(tm, "$input", Swig_cresult_name()); Replaceall(tm, "$source", Swig_cresult_name()); Replaceall(tm, "$target", "return_value"); Replaceall(tm, "$result", "return_value"); Replaceall(tm, "$owner", newobject ? "1" : "0"); Printf(f->code, "%s\n", tm); } else { Swig_warning(WARN_TYPEMAP_OUT_UNDEF, input_file, line_number, "Unable to use return type %s in function %s.\n", SwigType_str(d, 0), name); } emit_return_variable(n, d, f); if (outarg) { Printv(f->code, outarg, NIL); } if (cleanup) { Printv(f->code, cleanup, NIL); } /* Look to see if there is any newfree cleanup code */ if (GetFlag(n, "feature:new")) { if ((tm = Swig_typemap_lookup("newfree", n, Swig_cresult_name(), 0))) { Printf(f->code, "%s\n", tm); Delete(tm); } } /* See if there is any return cleanup code */ if ((tm = Swig_typemap_lookup("ret", n, Swig_cresult_name(), 0))) { Printf(f->code, "%s\n", tm); Delete(tm); } Printf(f->code, "thrown:\n"); Printf(f->code, "return;\n"); /* Error handling code */ Printf(f->code, "fail:\n"); Printv(f->code, cleanup, NIL); Append(f->code, "SWIG_FAIL();\n"); Printf(f->code, "}\n"); Replaceall(f->code, "$cleanup", cleanup); Replaceall(f->code, "$symname", iname); Wrapper_print(f, s_wrappers); DelWrapper(f); f = NULL; if (overloaded && !Getattr(n, "sym:nextSibling")) { dispatchFunction(n); } Delete(wname); wname = NULL; if (!shadow) { return SWIG_OK; } // Handle getters and setters. if (wrapperType == membervar) { const char *p = Char(iname); if (strlen(p) > 4) { p += strlen(p) - 4; String *varname = Getattr(n, "membervariableHandler:sym:name"); if (strcmp(p, "_get") == 0) { Setattr(shadow_get_vars, varname, Getattr(n, "type")); } else if (strcmp(p, "_set") == 0) { Setattr(shadow_set_vars, varname, iname); } } return SWIG_OK; } // Only look at non-overloaded methods and the last entry in each overload // chain (we check the last so that wrap:parms and wrap:name have been set // for them all). if (overloaded && Getattr(n, "sym:nextSibling") != 0) return SWIG_OK; if (!s_oowrappers) s_oowrappers = NewStringEmpty(); if (newobject || wrapperType == memberfn || wrapperType == staticmemberfn || wrapperType == standard || wrapperType == staticmembervar) { bool handle_as_overload = false; String **arg_names; String **arg_values; unsigned char * byref; // Method or static method or plain function. const char *methodname = 0; String *output = s_oowrappers; if (constructor) { class_has_ctor = true; // Skip the Foo:: prefix. char *ptr = strrchr(GetChar(current_class, "sym:name"), ':'); if (ptr) { ptr++; } else { ptr = GetChar(current_class, "sym:name"); } if (strcmp(ptr, GetChar(n, "constructorHandler:sym:name")) == 0) { methodname = "__construct"; } else { // The class has multiple constructors and this one is // renamed, so this will be a static factory function methodname = GetChar(n, "constructorHandler:sym:name"); } } else if (wrapperType == memberfn) { methodname = Char(Getattr(n, "memberfunctionHandler:sym:name")); } else if (wrapperType == staticmemberfn) { methodname = Char(Getattr(n, "staticmemberfunctionHandler:sym:name")); } else if (wrapperType == staticmembervar) { // Static member variable, wrapped as a function due to PHP limitations. methodname = Char(Getattr(n, "staticmembervariableHandler:sym:name")); } else { // wrapperType == standard methodname = Char(iname); if (!s_fakeoowrappers) s_fakeoowrappers = NewStringEmpty(); output = s_fakeoowrappers; } bool really_overloaded = overloaded ? true : false; int min_num_of_arguments = emit_num_required(l); int max_num_of_arguments = emit_num_arguments(l); Hash *ret_types = NewHash(); Setattr(ret_types, d, d); bool non_void_return = (Cmp(d, "void") != 0); if (overloaded) { // Look at all the overloaded versions of this method in turn to // decide if it's really an overloaded method, or just one where some // parameters have default values. Node *o = Getattr(n, "sym:overloaded"); while (o) { if (o == n) { o = Getattr(o, "sym:nextSibling"); continue; } SwigType *d2 = Getattr(o, "type"); if (!d2) { assert(constructor); } else if (!Getattr(ret_types, d2)) { Setattr(ret_types, d2, d2); non_void_return = non_void_return || (Cmp(d2, "void") != 0); } ParmList *l2 = Getattr(o, "wrap:parms"); int num_arguments = emit_num_arguments(l2); int num_required = emit_num_required(l2); if (num_required < min_num_of_arguments) min_num_of_arguments = num_required; if (num_arguments > max_num_of_arguments) { max_num_of_arguments = num_arguments; } o = Getattr(o, "sym:nextSibling"); } o = Getattr(n, "sym:overloaded"); while (o) { if (o == n) { o = Getattr(o, "sym:nextSibling"); continue; } ParmList *l2 = Getattr(o, "wrap:parms"); Parm *p = l, *p2 = l2; if (wrapperType == memberfn) { p = nextSibling(p); p2 = nextSibling(p2); } while (p && p2) { if (Cmp(Getattr(p, "type"), Getattr(p2, "type")) != 0) break; if (Cmp(Getattr(p, "name"), Getattr(p2, "name")) != 0) break; String *value = Getattr(p, "value"); String *value2 = Getattr(p2, "value"); if (value && !value2) break; if (!value && value2) break; if (value) { if (Cmp(value, value2) != 0) break; } p = nextSibling(p); p2 = nextSibling(p2); } if (p && p2) break; // One parameter list is a prefix of the other, so check that all // remaining parameters of the longer list are optional. if (p2) p = p2; while (p && Getattr(p, "value")) p = nextSibling(p); if (p) break; o = Getattr(o, "sym:nextSibling"); } if (!o) { // This "overloaded method" is really just one with default args. really_overloaded = false; } } if (wrapperType == memberfn) { // Allow for the "this" pointer. --min_num_of_arguments; --max_num_of_arguments; } arg_names = (String **) malloc(max_num_of_arguments * sizeof(String *)); if (!arg_names) { /* FIXME: How should this be handled? The rest of SWIG just seems * to not bother checking for malloc failing! */ fprintf(stderr, "Malloc failed!\n"); SWIG_exit(EXIT_FAILURE); } for (i = 0; i < max_num_of_arguments; ++i) { arg_names[i] = NULL; } arg_values = (String **) malloc(max_num_of_arguments * sizeof(String *)); byref = (unsigned char *) malloc(max_num_of_arguments); if (!arg_values || !byref) { /* FIXME: How should this be handled? The rest of SWIG just seems * to not bother checking for malloc failing! */ fprintf(stderr, "Malloc failed!\n"); SWIG_exit(EXIT_FAILURE); } for (i = 0; i < max_num_of_arguments; ++i) { arg_values[i] = NULL; byref[i] = false; } Node *o; if (overloaded) { o = Getattr(n, "sym:overloaded"); } else { o = n; } while (o) { int argno = 0; Parm *p = Getattr(o, "wrap:parms"); if (wrapperType == memberfn) p = nextSibling(p); while (p) { if (GetInt(p, "tmap:in:numinputs") == 0) { p = nextSibling(p); continue; } assert(0 <= argno && argno < max_num_of_arguments); byref[argno] = GetFlag(p, "tmap:in:byref"); String *&pname = arg_names[argno]; const char *pname_cstr = GetChar(p, "name"); // Just get rid of the C++ namespace part for now. const char *ptr = NULL; if (pname_cstr && (ptr = strrchr(pname_cstr, ':'))) { pname_cstr = ptr + 1; } if (!pname_cstr) { // Unnamed parameter, e.g. int foo(int); } else if (!pname) { pname = NewString(pname_cstr); } else { size_t len = strlen(pname_cstr); size_t spc = 0; size_t len_pname = strlen(Char(pname)); while (spc + len <= len_pname) { if (strncmp(pname_cstr, Char(pname) + spc, len) == 0) { char ch = ((char *) Char(pname))[spc + len]; if (ch == '\0' || ch == ' ') { // Already have this pname_cstr. pname_cstr = NULL; break; } } char *p = strchr(Char(pname) + spc, ' '); if (!p) break; spc = (p + 4) - Char(pname); } if (pname_cstr) { Printf(pname, " or_%s", pname_cstr); } } String *value = NewString(Getattr(p, "value")); if (Len(value)) { /* Check that value is a valid constant in PHP (and adjust it if * necessary, or replace it with "?" if it's just not valid). */ SwigType *type = Getattr(p, "type"); switch (SwigType_type(type)) { case T_BOOL: { if (Strcmp(value, "true") == 0 || Strcmp(value, "false") == 0) break; char *p; errno = 0; long n = strtol(Char(value), &p, 0); Clear(value); if (errno || *p) { Append(value, "?"); } else if (n) { Append(value, "true"); } else { Append(value, "false"); } break; } case T_CHAR: case T_SCHAR: case T_SHORT: case T_INT: case T_LONG: case T_LONGLONG: { char *p; errno = 0; long n = strtol(Char(value), &p, 0); (void) n; if (errno || *p) { Clear(value); Append(value, "?"); } break; } case T_UCHAR: case T_USHORT: case T_UINT: case T_ULONG: case T_ULONGLONG: { char *p; errno = 0; unsigned int n = strtoul(Char(value), &p, 0); (void) n; if (errno || *p) { Clear(value); Append(value, "?"); } break; } case T_FLOAT: case T_DOUBLE: case T_LONGDOUBLE: { char *p; errno = 0; /* FIXME: strtod is locale dependent... */ double val = strtod(Char(value), &p); if (errno || *p) { Clear(value); Append(value, "?"); } else if (strchr(Char(value), '.') == 0) { // Ensure value is a double constant, not an integer one. Append(value, ".0"); double val2 = strtod(Char(value), &p); if (errno || *p || val != val2) { Clear(value); Append(value, "?"); } } break; } case T_STRING: if (Len(value) < 2) { // How can a string (including "" be less than 2 characters?) Clear(value); Append(value, "?"); } else { const char *v = Char(value); if (v[0] != '"' || v[Len(value) - 1] != '"') { Clear(value); Append(value, "?"); } // Strings containing "$" require special handling, but we do // that later. } break; case T_VOID: assert(false); break; case T_POINTER: { const char *v = Char(value); if (v[0] == '(') { // Handle "(void*)0", "(TYPE*)0", "(char*)NULL", etc. v += strcspn(v + 1, "*()") + 1; if (*v == '*') { do { v++; v += strspn(v, " \t"); } while (*v == '*'); if (*v++ == ')') { v += strspn(v, " \t"); String * old = value; value = NewString(v); Delete(old); } } } if (Strcmp(value, "NULL") == 0 || Strcmp(value, "nullptr") == 0 || Strcmp(value, "0") == 0 || Strcmp(value, "0L") == 0) { Clear(value); Append(value, "null"); } else { Clear(value); Append(value, "?"); } break; } default: /* Safe default */ Clear(value); Append(value, "?"); break; } if (!arg_values[argno]) { arg_values[argno] = value; value = NULL; } else if (Cmp(arg_values[argno], value) != 0) { // If a parameter has two different default values in // different overloaded forms of the function, we can't // set its default in PHP. Flag this by setting its // default to `?'. Delete(arg_values[argno]); arg_values[argno] = NewString("?"); } } else if (arg_values[argno]) { // This argument already has a default value in another overloaded // form, but doesn't in this form. So don't try to do anything // clever, just let the C wrappers resolve the overload and set the // default values. // // This handling is safe, but I'm wondering if it may be overly // conservative (FIXME) in some cases. It seems it's only bad when // there's an overloaded form with the appropriate number of // parameters which doesn't want the default value, but I need to // think about this more. Delete(arg_values[argno]); arg_values[argno] = NewString("?"); } Delete(value); p = nextSibling(p); ++argno; } if (!really_overloaded) break; o = Getattr(o, "sym:nextSibling"); } /* Clean up any parameters which haven't yet got names, or whose * names clash. */ Hash *seen = NewHash(); /* We need $this to refer to the current class, so can't allow it * to be used as a parameter. */ Setattr(seen, "this", seen); for (int argno = 0; argno < max_num_of_arguments; ++argno) { String *&pname = arg_names[argno]; if (pname) { Replaceall(pname, " ", "_"); } else { /* We get here if the SWIG .i file has "int foo(int);" */ pname = NewStringEmpty(); Printf(pname, "arg%d", argno + 1); } // Check if we've already used this parameter name. while (Getattr(seen, pname)) { // Append "_" to clashing names until they stop clashing... Printf(pname, "_"); } Setattr(seen, Char(pname), seen); if (arg_values[argno] && Cmp(arg_values[argno], "?") == 0) { handle_as_overload = true; } } Delete(seen); seen = NULL; String *invoke = NewStringEmpty(); String *prepare = NewStringEmpty(); String *args = NewStringEmpty(); if (!handle_as_overload && !(really_overloaded && max_num_of_arguments > min_num_of_arguments)) { Printf(invoke, "%s(", iname); if (wrapperType == memberfn) { Printf(invoke, "$this->%s", SWIG_PTR); } for (int i = 0; i < max_num_of_arguments; ++i) { if (i) Printf(args, ","); if (i || wrapperType == memberfn) Printf(invoke, ","); if (byref[i]) Printf(args, "&"); String *value = arg_values[i]; if (value) { const char *v = Char(value); if (v[0] == '"') { /* In a PHP double quoted string, $ needs to be escaped as \$. */ Replaceall(value, "$", "\\$"); } Printf(args, "$%s=%s", arg_names[i], value); } else if (constructor && strcmp(methodname, "__construct") == 0 && i >= 1 && i < min_num_of_arguments) { // We need to be able to call __construct($resource). Printf(args, "$%s=null", arg_names[i]); } else { Printf(args, "$%s", arg_names[i]); } Printf(invoke, "$%s", arg_names[i]); } Printf(invoke, ")"); } else { int i; for (i = 0; i < min_num_of_arguments; ++i) { if (i) Printf(args, ","); Printf(args, "$%s", arg_names[i]); } String *invoke_args = NewStringEmpty(); if (wrapperType == memberfn) { Printf(invoke_args, "$this->%s", SWIG_PTR); if (min_num_of_arguments > 0) Printf(invoke_args, ","); } Printf(invoke_args, "%s", args); if (constructor && min_num_of_arguments > 1) { // We need to be able to call __construct($resource). Clear(args); Printf(args, "$%s", arg_names[0]); for (i = 1; i < min_num_of_arguments; ++i) { Printf(args, ","); Printf(args, "$%s=null", arg_names[i]); } } bool had_a_case = false; int last_handled_i = i - 1; for (; i < max_num_of_arguments; ++i) { if (i) Printf(args, ","); const char *value = Char(arg_values[i]); // FIXME: (really_overloaded && handle_as_overload) is perhaps a // little conservative, but it doesn't hit any cases that it // shouldn't for Xapian at least (and we need it to handle // "Enquire::get_mset()" correctly). bool non_php_default = ((really_overloaded && handle_as_overload) || !value || strcmp(value, "?") == 0); if (non_php_default) value = "null"; Printf(args, "$%s=%s", arg_names[i], value); if (non_php_default) { if (!had_a_case) { Printf(prepare, "\t\tswitch (func_num_args()) {\n"); had_a_case = true; } Printf(prepare, "\t\t"); while (last_handled_i < i) { Printf(prepare, "case %d: ", ++last_handled_i); } if (non_void_return) { if ((!directorsEnabled() || !Swig_directorclass(n)) && !constructor) { Append(prepare, "$r="); } else if (wrapperType == staticmemberfn || wrapperType == staticmembervar) { Append(prepare, "$r="); } else { Printf(prepare, "$this->%s=", SWIG_PTR); } } if (!directorsEnabled() || !Swig_directorclass(n) || !constructor) { Printf(prepare, "%s(%s); break;\n", iname, invoke_args); } else if (!i) { Printf(prepare, "%s($_this%s); break;\n", iname, invoke_args); } else { Printf(prepare, "%s($_this, %s); break;\n", iname, invoke_args); } } if (i || wrapperType == memberfn) Printf(invoke_args, ","); Printf(invoke_args, "$%s", arg_names[i]); } Printf(prepare, "\t\t"); if (had_a_case) Printf(prepare, "default: "); if (non_void_return) { if ((!directorsEnabled() || !Swig_directorclass(n)) && !constructor) { Append(prepare, "$r="); } else if (wrapperType == staticmemberfn || wrapperType == staticmembervar) { Append(prepare, "$r="); } else { Printf(prepare, "$this->%s=", SWIG_PTR); } } if (!directorsEnabled() || !Swig_directorclass(n) || !constructor) { Printf(prepare, "%s(%s);\n", iname, invoke_args); } else { Printf(prepare, "%s($_this, %s);\n", iname, invoke_args); } if (had_a_case) Printf(prepare, "\t\t}\n"); Delete(invoke_args); Printf(invoke, "$r"); } Printf(output, "\n"); // If it's a member function or a class constructor... if (wrapperType == memberfn || (constructor && current_class)) { String *acc = NewString(Getattr(n, "access")); // If a base has the same method with public access, then PHP // requires to have it here as public as well Node *bases = Getattr(Swig_methodclass(n), "bases"); if (bases && Strcmp(acc, "public") != 0) { String *warnmsg = 0; int haspublicbase = 0; Iterator i = First(bases); while (i.item) { Node *j = firstChild(i.item); while (j) { String *jname = Getattr(j, "name"); if (!jname || Strcmp(jname, Getattr(n, "name")) != 0) { j = nextSibling(j); continue; } if (Strcmp(nodeType(j), "cdecl") == 0) { if (!Getattr(j, "access") || checkAttribute(j, "access", "public")) { haspublicbase = 1; } } else if (Strcmp(nodeType(j), "using") == 0 && firstChild(j) && Strcmp(nodeType(firstChild(j)), "cdecl") == 0) { if (!Getattr(firstChild(j), "access") || checkAttribute(firstChild(j), "access", "public")) { haspublicbase = 1; } } if (haspublicbase) { warnmsg = NewStringf("Modifying the access of '%s::%s' to public, as the base '%s' has it as public as well.\n", Getattr(current_class, "classtype"), Getattr(n, "name"), Getattr(i.item, "classtype")); break; } j = nextSibling(j); } i = Next(i); if (haspublicbase) { break; } } if (Getattr(n, "access") && haspublicbase) { Delete(acc); acc = NewStringEmpty(); // implicitly public Swig_warning(WARN_PHP_PUBLIC_BASE, input_file, line_number, Char(warnmsg)); Delete(warnmsg); } } if (Cmp(acc, "public") == 0) { // The default visibility for methods is public, so don't specify // that explicitly to keep the wrapper size down. Delete(acc); acc = NewStringEmpty(); } else if (Cmp(acc, "") != 0) { Append(acc, " "); } if (constructor) { // Discriminate between the PHP constructor and a C++ constructor // renamed to become a factory function in PHP. bool php_constructor = (strcmp(methodname, "__construct") == 0); const char * arg0 = NULL; if (max_num_of_arguments > 0) { arg0 = Char(arg_names[0]); } else if (php_constructor) { // The PHP constructor needs to be able to wrap a resource, but a // renamed constructor doesn't. arg0 = "res"; Delete(args); args = NewString("$res=null"); } String *mangled_type = SwigType_manglestr(Getattr(n, "type")); if (!php_constructor) { // A renamed constructor should be a static method. Append(acc, "static "); } Printf(output, "\t%sfunction %s(%s) {\n", acc, methodname, args); if (php_constructor) { // The PHP constructor needs to be able to wrap a resource, but a // renamed constructor doesn't. Printf(output, "\t\tif (is_resource($%s) && get_resource_type($%s) === '%s') {\n", arg0, arg0, mangled_type); Printf(output, "\t\t\t$this->%s=$%s;\n", SWIG_PTR, arg0); Printf(output, "\t\t\treturn;\n"); Printf(output, "\t\t}\n"); } } else { Printf(output, "\t%sfunction %s(%s) {\n", acc, methodname, args); } Delete(acc); } else if (wrapperType == staticmembervar) { // We're called twice for a writable static member variable - first // with "foo_set" and then with "foo_get" - so generate half the // wrapper function each time. // // For a const static member, we only get called once. static bool started = false; if (!started) { Printf(output, "\tstatic function %s() {\n", methodname); if (max_num_of_arguments) { // Setter. Printf(output, "\t\tif (func_num_args()) {\n"); Printf(output, "\t\t\t%s(func_get_arg(0));\n", iname); Printf(output, "\t\t\treturn;\n"); Printf(output, "\t\t}\n"); started = true; goto done; } } started = false; } else { Printf(output, "\tstatic function %s(%s) {\n", methodname, args); } if (!constructor) Printf(output, "%s", prepare); if (constructor) { if (!directorsEnabled() || !Swig_directorclass(n)) { if (!Len(prepare)) { if (strcmp(methodname, "__construct") == 0) { Printf(output, "\t\t$this->%s=%s;\n", SWIG_PTR, invoke); } else { String *classname = Swig_class_name(current_class); Printf(output, "\t\treturn new %s%s(%s);\n", prefix, classname, invoke); } } } else { Node *parent = Swig_methodclass(n); String *classname = Swig_class_name(parent); Printf(output, "\t\tif (get_class($this) === '%s%s') {\n", prefix, classname); Printf(output, "\t\t\t$_this = null;\n"); Printf(output, "\t\t} else {\n"); Printf(output, "\t\t\t$_this = $this;\n"); Printf(output, "\t\t}\n"); if (!Len(prepare)) { if (num_arguments > 1) { Printf(output, "\t\t$this->%s=%s($_this, %s);\n", SWIG_PTR, iname, args); } else { Printf(output, "\t\t$this->%s=%s($_this);\n", SWIG_PTR, iname); } } } Printf(output, "%s", prepare); } else if (!non_void_return && !hasargout) { if (Cmp(invoke, "$r") != 0) Printf(output, "\t\t%s;\n", invoke); } else if (is_class(d)) { if (Cmp(invoke, "$r") != 0) Printf(output, "\t\t$r=%s;\n", invoke); if (Len(ret_types) == 1) { /* If d is abstract we can't create a new wrapper type d. */ Node *d_class = classLookup(d); int is_abstract = 0; if (Getattr(d_class, "abstracts")) { is_abstract = 1; } if (newobject || !is_abstract) { Printf(output, "\t\tif (is_resource($r)) {\n"); if (Getattr(classLookup(Getattr(n, "type")), "module")) { /* * _p_Foo -> Foo, _p_ns__Bar -> Bar * TODO: do this in a more elegant way */ if (Len(prefix) == 0) { Printf(output, "\t\t\t$c=substr(get_resource_type($r), (strpos(get_resource_type($r), '__') ? strpos(get_resource_type($r), '__') + 2 : 3));\n"); } else { Printf(output, "\t\t\t$c='%s'.substr(get_resource_type($r), (strpos(get_resource_type($r), '__') ? strpos(get_resource_type($r), '__') + 2 : 3));\n", prefix); } Printf(output, "\t\t\tif (class_exists($c)) return new $c($r);\n"); Printf(output, "\t\t\treturn new %s%s($r);\n", prefix, Getattr(classLookup(d), "sym:name")); } else { Printf(output, "\t\t\t$c = new stdClass();\n"); Printf(output, "\t\t\t$c->" SWIG_PTR " = $r;\n"); Printf(output, "\t\t\treturn $c;\n"); } Printf(output, "\t\t}\n\t\treturn $r;\n"); } else { Printf(output, "\t\t$this->%s = $r;\n", SWIG_PTR); Printf(output, "\t\treturn $this;\n"); } } else { Printf(output, "\t\tif (!is_resource($r)) return $r;\n"); String *wrapobj = NULL; String *common = NULL; Iterator i = First(ret_types); while (i.item) { SwigType *ret_type = i.item; i = Next(i); String *mangled = NewString("_p"); Printf(mangled, "%s", SwigType_manglestr(ret_type)); Node *class_node = Getattr(zend_types, mangled); if (!class_node) { /* This is needed when we're returning a pointer to a type * rather than returning the type by value or reference. */ Delete(mangled); mangled = NewString(SwigType_manglestr(ret_type)); class_node = Getattr(zend_types, mangled); if (!class_node) { // Return type isn't an object, so will be handled by the // !is_resource() check before the switch. continue; } } const char *classname = GetChar(class_node, "sym:name"); if (!classname) classname = GetChar(class_node, "name"); String * action = NewStringEmpty(); if (classname) Printf(action, "return new %s%s($r);\n", prefix, classname); else Printf(action, "return $r;\n"); if (!wrapobj) { wrapobj = NewString("\t\tswitch (get_resource_type($r)) {\n"); common = action; } else { if (common && Cmp(common, action) != 0) { Delete(common); common = NULL; } } Printf(wrapobj, "\t\t"); if (i.item) { Printf(wrapobj, "case '%s': ", mangled); } else { Printf(wrapobj, "default: "); } Printv(wrapobj, action, NIL); if (action != common) Delete(action); Delete(mangled); } Printf(wrapobj, "\t\t}\n"); if (common) { // All cases have the same action, so eliminate the switch // wrapper. Printf(output, "\t\t%s", common); Delete(common); } else { Printv(output, wrapobj, NIL); } Delete(wrapobj); } } else { if (non_void_return || hasargout) { Printf(output, "\t\treturn %s;\n", invoke); } else if (Cmp(invoke, "$r") != 0) { Printf(output, "\t\t%s;\n", invoke); } } Printf(output, "\t}\n"); done: Delete(prepare); Delete(invoke); free(arg_values); Delete(args); args = NULL; for (int i = 0; i < max_num_of_arguments; ++i) { Delete(arg_names[i]); } free(arg_names); arg_names = NULL; } return SWIG_OK; } /* ------------------------------------------------------------ * globalvariableHandler() * ------------------------------------------------------------ */ virtual int globalvariableHandler(Node *n) { char *name = GetChar(n, "name"); char *iname = GetChar(n, "sym:name"); SwigType *t = Getattr(n, "type"); String *tm; /* First do the wrappers such as name_set(), name_get() * as provided by the baseclass's implementation of variableWrapper */ if (Language::globalvariableHandler(n) == SWIG_NOWRAP) { return SWIG_NOWRAP; } if (!addSymbol(iname, n)) return SWIG_ERROR; /* First link C variables to PHP */ tm = Swig_typemap_lookup("varinit", n, name, 0); if (tm) { Replaceall(tm, "$target", name); Printf(s_vinit, "%s\n", tm); } else { Swig_error(input_file, line_number, "Unable to link with type %s\n", SwigType_str(t, 0)); } /* Now generate PHP -> C sync blocks */ /* tm = Swig_typemap_lookup("varin", n, name, 0); if(tm) { Replaceall(tm, "$symname", iname); Printf(f_c->code, "%s\n", tm); } else { Swig_error(input_file, line_number, "Unable to link with type %s\n", SwigType_str(t, 0)); } */ /* Now generate C -> PHP sync blocks */ /* if(!GetFlag(n,"feature:immutable")) { tm = Swig_typemap_lookup("varout", n, name, 0); if(tm) { Replaceall(tm, "$symname", iname); Printf(f_php->code, "%s\n", tm); } else { Swig_error(input_file, line_number, "Unable to link with type %s\n", SwigType_str(t, 0)); } } */ return SWIG_OK; } /* ------------------------------------------------------------ * constantWrapper() * ------------------------------------------------------------ */ virtual int constantWrapper(Node *n) { String *name = GetChar(n, "name"); String *iname = GetChar(n, "sym:name"); SwigType *type = Getattr(n, "type"); String *rawval = Getattr(n, "rawval"); String *value = rawval ? rawval : Getattr(n, "value"); String *tm; if (!addSymbol(iname, n)) return SWIG_ERROR; SwigType_remember(type); if ((tm = Swig_typemap_lookup("consttab", n, name, 0))) { Replaceall(tm, "$source", value); Replaceall(tm, "$target", name); Replaceall(tm, "$value", value); Printf(s_cinit, "%s\n", tm); } if (shadow) { String *enumvalue = GetChar(n, "enumvalue"); String *set_to = iname; if (!enumvalue) { enumvalue = GetChar(n, "enumvalueex"); } if (enumvalue && *Char(enumvalue)) { // Check for a simple constant expression which is valid in PHP. // If we find one, initialise the const member with it; otherwise // we initialise it using the C/C++ wrapped constant. const char *p; for (p = Char(enumvalue); *p; ++p) { if (!isdigit((unsigned char)*p) && !strchr(" +-", *p)) { // FIXME: enhance to handle ` + 1' which is what // we get for enums that don't have an explicit value set. break; } } if (!*p) set_to = enumvalue; } if (wrapping_member_constant) { if (!s_oowrappers) s_oowrappers = NewStringEmpty(); Printf(s_oowrappers, "\n\tconst %s = %s;\n", wrapping_member_constant, set_to); } else { if (!s_fakeoowrappers) s_fakeoowrappers = NewStringEmpty(); Printf(s_fakeoowrappers, "\n\tconst %s = %s;\n", iname, set_to); } } return SWIG_OK; } /* * PHP::pragma() * * Pragma directive. * * %pragma(php) code="String" # Includes a string in the .php file * %pragma(php) include="file.php" # Includes a file in the .php file */ virtual int pragmaDirective(Node *n) { if (!ImportMode) { String *lang = Getattr(n, "lang"); String *type = Getattr(n, "name"); String *value = Getattr(n, "value"); if (Strcmp(lang, "php") == 0) { if (Strcmp(type, "code") == 0) { if (value) { Printf(pragma_code, "%s\n", value); } } else if (Strcmp(type, "include") == 0) { if (value) { Printf(pragma_incl, "include '%s';\n", value); } } else if (Strcmp(type, "phpinfo") == 0) { if (value) { Printf(pragma_phpinfo, "%s\n", value); } } else if (Strcmp(type, "version") == 0) { if (value) { pragma_version = value; } } else { Swig_warning(WARN_PHP_UNKNOWN_PRAGMA, input_file, line_number, "Unrecognized pragma <%s>.\n", type); } } } return Language::pragmaDirective(n); } /* ------------------------------------------------------------ * classDeclaration() * ------------------------------------------------------------ */ virtual int classDeclaration(Node *n) { if (!Getattr(n, "feature:onlychildren")) { String *symname = Getattr(n, "sym:name"); Setattr(n, "php:proxy", symname); } return Language::classDeclaration(n); } /* ------------------------------------------------------------ * classHandler() * ------------------------------------------------------------ */ virtual int classHandler(Node *n) { constructors = 0; current_class = n; if (shadow) { char *rename = GetChar(n, "sym:name"); if (!addSymbol(rename, n)) return SWIG_ERROR; shadow_classname = NewString(rename); shadow_get_vars = NewHash(); shadow_set_vars = NewHash(); /* Deal with inheritance */ List *baselist = Getattr(n, "bases"); if (baselist) { Iterator base = First(baselist); while (base.item && GetFlag(base.item, "feature:ignore")) { base = Next(base); } base = Next(base); if (base.item) { /* Warn about multiple inheritance for additional base class(es) */ while (base.item) { if (GetFlag(base.item, "feature:ignore")) { base = Next(base); continue; } String *proxyclassname = SwigType_str(Getattr(n, "classtypeobj"), 0); String *baseclassname = SwigType_str(Getattr(base.item, "name"), 0); Swig_warning(WARN_PHP_MULTIPLE_INHERITANCE, input_file, line_number, "Warning for %s, base %s ignored. Multiple inheritance is not supported in PHP.\n", proxyclassname, baseclassname); base = Next(base); } } } } classnode = n; Language::classHandler(n); classnode = 0; if (shadow) { List *baselist = Getattr(n, "bases"); Iterator ki, base; if (baselist) { base = First(baselist); while (base.item && GetFlag(base.item, "feature:ignore")) { base = Next(base); } } else { base.item = NULL; } if (Getattr(n, "abstracts") && !GetFlag(n, "feature:notabstract")) { Printf(s_phpclasses, "abstract "); } Printf(s_phpclasses, "class %s%s ", prefix, shadow_classname); String *baseclass = NULL; if (base.item && Getattr(base.item, "module")) { baseclass = Getattr(base.item, "sym:name"); if (!baseclass) baseclass = Getattr(base.item, "name"); Printf(s_phpclasses, "extends %s%s ", prefix, baseclass); } else if (GetFlag(n, "feature:exceptionclass")) { Append(s_phpclasses, "extends Exception "); } { Node *node = NewHash(); Setattr(node, "type", Getattr(n, "name")); Setfile(node, Getfile(n)); Setline(node, Getline(n)); String * interfaces = Swig_typemap_lookup("phpinterfaces", node, "", 0); if (interfaces) { Printf(s_phpclasses, "implements %s ", interfaces); } Delete(node); } Printf(s_phpclasses, "{\n\tpublic $%s=null;\n", SWIG_PTR); if (!baseclass) { // Only store this in the base class (NB !baseclass means we *are* // a base class...) Printf(s_phpclasses, "\tprotected $%s=array();\n", SWIG_DATA); } // Write property SET handlers ki = First(shadow_set_vars); if (ki.key) { // This class has setters. Printf(s_phpclasses, "\n\tfunction __set($var,$value) {\n"); // FIXME: tune this threshold... if (Len(shadow_set_vars) <= 2) { // Not many setters, so avoid call_user_func. for (; ki.key; ki = Next(ki)) { DOH *key = ki.key; String *iname = ki.item; Printf(s_phpclasses, "\t\tif ($var === '%s') return %s($this->%s,$value);\n", key, iname, SWIG_PTR); } } else { Printf(s_phpclasses, "\t\t$func = '%s_'.$var.'_set';\n", shadow_classname); Printf(s_phpclasses, "\t\tif (function_exists($func)) return call_user_func($func,$this->%s,$value);\n", SWIG_PTR); } Printf(s_phpclasses, "\t\tif ($var === 'thisown') return swig_%s_alter_newobject($this->%s,$value);\n", module, SWIG_PTR); if (baseclass) { Printf(s_phpclasses, "\t\t%s%s::__set($var,$value);\n", prefix, baseclass); } else { Printf(s_phpclasses, "\t\t$this->%s[$var] = $value;\n", SWIG_DATA); } Printf(s_phpclasses, "\t}\n"); } else { Printf(s_phpclasses, "\n\tfunction __set($var,$value) {\n"); Printf(s_phpclasses, "\t\tif ($var === 'thisown') return swig_%s_alter_newobject($this->%s,$value);\n", module, SWIG_PTR); if (baseclass) { Printf(s_phpclasses, "\t\t%s%s::__set($var,$value);\n", prefix, baseclass); } else { Printf(s_phpclasses, "\t\t$this->%s[$var] = $value;\n", SWIG_DATA); } Printf(s_phpclasses, "\t}\n"); } // Write property GET handlers ki = First(shadow_get_vars); if (ki.key) { // This class has getters. Printf(s_phpclasses, "\n\tfunction __get($var) {\n"); int non_class_getters = 0; for (; ki.key; ki = Next(ki)) { DOH *key = ki.key; SwigType *d = ki.item; if (!is_class(d)) { ++non_class_getters; continue; } Printv(s_phpclasses, "\t\tif ($var === '", key, "') return new ", prefix, Getattr(classLookup(d), "sym:name"), "(", shadow_classname, "_", key, "_get($this->", SWIG_PTR, "));\n", NIL); } // FIXME: tune this threshold... if (non_class_getters <= 2) { // Not many non-class getters, so avoid call_user_func. for (ki = First(shadow_get_vars); non_class_getters && ki.key; ki = Next(ki)) { DOH *key = ki.key; SwigType *d = ki.item; if (is_class(d)) continue; Printv(s_phpclasses, "\t\tif ($var === '", key, "') return ", shadow_classname, "_", key, "_get($this->", SWIG_PTR, ");\n", NIL); --non_class_getters; } } else { Printf(s_phpclasses, "\t\t$func = '%s_'.$var.'_get';\n", shadow_classname); Printf(s_phpclasses, "\t\tif (function_exists($func)) return call_user_func($func,$this->%s);\n", SWIG_PTR); } Printf(s_phpclasses, "\t\tif ($var === 'thisown') return swig_%s_get_newobject($this->%s);\n", module, SWIG_PTR); if (baseclass) { Printf(s_phpclasses, "\t\treturn %s%s::__get($var);\n", prefix, baseclass); } else { // Reading an unknown property name gives null in PHP. Printf(s_phpclasses, "\t\treturn $this->%s[$var];\n", SWIG_DATA); } Printf(s_phpclasses, "\t}\n"); /* __isset() should return true for read-only properties, so check for * *_get() not *_set(). */ Printf(s_phpclasses, "\n\tfunction __isset($var) {\n"); Printf(s_phpclasses, "\t\tif (function_exists('%s_'.$var.'_get')) return true;\n", shadow_classname); Printf(s_phpclasses, "\t\tif ($var === 'thisown') return true;\n"); if (baseclass) { Printf(s_phpclasses, "\t\treturn %s%s::__isset($var);\n", prefix, baseclass); } else { Printf(s_phpclasses, "\t\treturn array_key_exists($var, $this->%s);\n", SWIG_DATA); } Printf(s_phpclasses, "\t}\n"); } else { Printf(s_phpclasses, "\n\tfunction __get($var) {\n"); Printf(s_phpclasses, "\t\tif ($var === 'thisown') return swig_%s_get_newobject($this->%s);\n", module, SWIG_PTR); if (baseclass) { Printf(s_phpclasses, "\t\treturn %s%s::__get($var);\n", prefix, baseclass); } else { Printf(s_phpclasses, "\t\treturn $this->%s[$var];\n", SWIG_DATA); } Printf(s_phpclasses, "\t}\n"); Printf(s_phpclasses, "\n\tfunction __isset($var) {\n"); Printf(s_phpclasses, "\t\tif ($var === 'thisown') return true;\n"); if (baseclass) { Printf(s_phpclasses, "\t\treturn %s%s::__isset($var);\n", prefix, baseclass); } else { Printf(s_phpclasses, "\t\treturn array_key_exists($var, $this->%s);\n", SWIG_DATA); } Printf(s_phpclasses, "\t}\n"); } if (!class_has_ctor) { Printf(s_phpclasses, "\tfunction __construct($h) {\n"); Printf(s_phpclasses, "\t\t$this->%s=$h;\n", SWIG_PTR); Printf(s_phpclasses, "\t}\n"); } if (s_oowrappers) { Printf(s_phpclasses, "%s", s_oowrappers); Delete(s_oowrappers); s_oowrappers = NULL; } class_has_ctor = false; Printf(s_phpclasses, "}\n\n"); Delete(shadow_classname); shadow_classname = NULL; Delete(shadow_set_vars); shadow_set_vars = NULL; Delete(shadow_get_vars); shadow_get_vars = NULL; } return SWIG_OK; } /* ------------------------------------------------------------ * memberfunctionHandler() * ------------------------------------------------------------ */ virtual int memberfunctionHandler(Node *n) { wrapperType = memberfn; Language::memberfunctionHandler(n); wrapperType = standard; return SWIG_OK; } /* ------------------------------------------------------------ * membervariableHandler() * ------------------------------------------------------------ */ virtual int membervariableHandler(Node *n) { wrapperType = membervar; Language::membervariableHandler(n); wrapperType = standard; return SWIG_OK; } /* ------------------------------------------------------------ * staticmembervariableHandler() * ------------------------------------------------------------ */ virtual int staticmembervariableHandler(Node *n) { wrapperType = staticmembervar; Language::staticmembervariableHandler(n); wrapperType = standard; return SWIG_OK; } /* ------------------------------------------------------------ * staticmemberfunctionHandler() * ------------------------------------------------------------ */ virtual int staticmemberfunctionHandler(Node *n) { wrapperType = staticmemberfn; Language::staticmemberfunctionHandler(n); wrapperType = standard; return SWIG_OK; } int abstractConstructorHandler(Node *) { return SWIG_OK; } /* ------------------------------------------------------------ * constructorHandler() * ------------------------------------------------------------ */ virtual int constructorHandler(Node *n) { constructors++; if (Swig_directorclass(n)) { String *name = GetChar(Swig_methodclass(n), "name"); String *ctype = GetChar(Swig_methodclass(n), "classtype"); String *sname = GetChar(Swig_methodclass(n), "sym:name"); String *args = NewStringEmpty(); ParmList *p = Getattr(n, "parms"); int i; for (i = 0; p; p = nextSibling(p), i++) { if (i) { Printf(args, ", "); } if (Strcmp(GetChar(p, "type"), SwigType_str(GetChar(p, "type"), 0))) { SwigType *t = Getattr(p, "type"); Printf(args, "%s", SwigType_rcaststr(t, 0)); if (SwigType_isreference(t)) { Append(args, "*"); } } Printf(args, "arg%d", i+1); } /* director ctor code is specific for each class */ Delete(director_ctor_code); director_ctor_code = NewStringEmpty(); director_prot_ctor_code = NewStringEmpty(); Printf(director_ctor_code, "if (Z_TYPE_P(arg0) == IS_NULL) { /* not subclassed */\n"); Printf(director_prot_ctor_code, "if (Z_TYPE_P(arg0) == IS_NULL) { /* not subclassed */\n"); Printf(director_ctor_code, " %s = (%s *)new %s(%s);\n", Swig_cresult_name(), ctype, ctype, args); Printf(director_prot_ctor_code, " SWIG_PHP_Error(E_ERROR, \"accessing abstract class or protected constructor\");\n", name, name, args); if (i) { Insert(args, 0, ", "); } Printf(director_ctor_code, "} else {\n %s = (%s *)new SwigDirector_%s(arg0%s);\n}\n", Swig_cresult_name(), ctype, sname, args); Printf(director_prot_ctor_code, "} else {\n %s = (%s *)new SwigDirector_%s(arg0%s);\n}\n", Swig_cresult_name(), ctype, sname, args); Delete(args); wrapperType = directorconstructor; } else { wrapperType = constructor; } Language::constructorHandler(n); wrapperType = standard; return SWIG_OK; } /* ------------------------------------------------------------ * CreateZendListDestructor() * ------------------------------------------------------------ */ //virtual int destructorHandler(Node *n) { //} int CreateZendListDestructor(Node *n) { String *name = GetChar(Swig_methodclass(n), "name"); String *iname = GetChar(n, "sym:name"); ParmList *l = Getattr(n, "parms"); String *destructorname = NewStringEmpty(); Printf(destructorname, "_%s", Swig_name_wrapper(iname)); Setattr(classnode, "destructor", destructorname); Wrapper *f = NewWrapper(); Printf(f->def, "/* This function is designed to be called by the zend list destructors */\n"); Printf(f->def, "/* to typecast and do the actual destruction */\n"); Printf(f->def, "static void %s(zend_resource *res, const char *type_name) {\n", destructorname); Wrapper_add_localv(f, "value", "swig_object_wrapper *value=(swig_object_wrapper *) res->ptr", NIL); Wrapper_add_localv(f, "ptr", "void *ptr=value->ptr", NIL); Wrapper_add_localv(f, "newobject", "int newobject=value->newobject", NIL); emit_parameter_variables(l, f); emit_attach_parmmaps(l, f); // Get type of first arg, thing to be destructed // Skip ignored arguments Parm *p = l; //while (Getattr(p,"tmap:ignore")) {p = Getattr(p,"tmap:ignore:next");} while (checkAttribute(p, "tmap:in:numinputs", "0")) { p = Getattr(p, "tmap:in:next"); } SwigType *pt = Getattr(p, "type"); Printf(f->code, " efree(value);\n"); Printf(f->code, " if (! newobject) return; /* can't delete it! */\n"); Printf(f->code, " arg1 = (%s)SWIG_ConvertResourceData(ptr, type_name, SWIGTYPE%s);\n", SwigType_lstr(pt, 0), SwigType_manglestr(pt)); Printf(f->code, " if (! arg1) zend_error(E_ERROR, \"%s resource already free'd\");\n", Char(name)); Setattr(n, "wrap:name", destructorname); String *actioncode = emit_action(n); Append(f->code, actioncode); Delete(actioncode); Printf(f->code, "thrown:\n"); Append(f->code, "return;\n"); Append(f->code, "fail:\n"); Append(f->code, "SWIG_FAIL();\n"); Printf(f->code, "}\n"); Wrapper_print(f, s_wrappers); DelWrapper(f); return SWIG_OK; } /* ------------------------------------------------------------ * memberconstantHandler() * ------------------------------------------------------------ */ virtual int memberconstantHandler(Node *n) { wrapping_member_constant = Getattr(n, "sym:name"); Language::memberconstantHandler(n); wrapping_member_constant = NULL; return SWIG_OK; } int classDirectorInit(Node *n) { String *declaration = Swig_director_declaration(n); Printf(f_directors_h, "%s\n", declaration); Printf(f_directors_h, "public:\n"); Delete(declaration); return Language::classDirectorInit(n); } int classDirectorEnd(Node *n) { Printf(f_directors_h, "};\n"); return Language::classDirectorEnd(n); } int classDirectorConstructor(Node *n) { Node *parent = Getattr(n, "parentNode"); String *decl = Getattr(n, "decl"); String *supername = Swig_class_name(parent); String *classname = NewStringEmpty(); Printf(classname, "SwigDirector_%s", supername); /* insert self parameter */ Parm *p; ParmList *superparms = Getattr(n, "parms"); ParmList *parms = CopyParmList(superparms); String *type = NewString("zval"); SwigType_add_pointer(type); p = NewParm(type, NewString("self"), n); set_nextSibling(p, parms); parms = p; if (!Getattr(n, "defaultargs")) { // There should always be a "self" parameter first. assert(ParmList_len(parms) > 0); /* constructor */ { Wrapper *w = NewWrapper(); String *call; String *basetype = Getattr(parent, "classtype"); String *target = Swig_method_decl(0, decl, classname, parms, 0); call = Swig_csuperclass_call(0, basetype, superparms); Printf(w->def, "%s::%s: %s, Swig::Director(self) {", classname, target, call); Append(w->def, "}"); Delete(target); Wrapper_print(w, f_directors); Delete(call); DelWrapper(w); } /* constructor header */ { String *target = Swig_method_decl(0, decl, classname, parms, 1); Printf(f_directors_h, " %s;\n", target); Delete(target); } } return Language::classDirectorConstructor(n); } int classDirectorMethod(Node *n, Node *parent, String *super) { int is_void = 0; int is_pointer = 0; String *decl = Getattr(n, "decl"); String *returntype = Getattr(n, "type"); String *name = Getattr(n, "name"); String *classname = Getattr(parent, "sym:name"); String *c_classname = Getattr(parent, "name"); String *symname = Getattr(n, "sym:name"); String *declaration = NewStringEmpty(); ParmList *l = Getattr(n, "parms"); Wrapper *w = NewWrapper(); String *tm; String *wrap_args = NewStringEmpty(); String *value = Getattr(n, "value"); String *storage = Getattr(n, "storage"); bool pure_virtual = false; int status = SWIG_OK; int idx; bool ignored_method = GetFlag(n, "feature:ignore") ? true : false; if (Cmp(storage, "virtual") == 0) { if (Cmp(value, "0") == 0) { pure_virtual = true; } } /* determine if the method returns a pointer */ is_pointer = SwigType_ispointer_return(decl); is_void = (Cmp(returntype, "void") == 0 && !is_pointer); /* virtual method definition */ String *target; String *pclassname = NewStringf("SwigDirector_%s", classname); String *qualified_name = NewStringf("%s::%s", pclassname, name); SwigType *rtype = Getattr(n, "conversion_operator") ? 0 : Getattr(n, "classDirectorMethods:type"); target = Swig_method_decl(rtype, decl, qualified_name, l, 0); Printf(w->def, "%s", target); Delete(qualified_name); Delete(target); /* header declaration */ target = Swig_method_decl(rtype, decl, name, l, 1); Printf(declaration, " virtual %s", target); Delete(target); // Get any exception classes in the throws typemap if (Getattr(n, "noexcept")) { Append(w->def, " noexcept"); Append(declaration, " noexcept"); } ParmList *throw_parm_list = 0; if ((throw_parm_list = Getattr(n, "throws")) || Getattr(n, "throw")) { Parm *p; int gencomma = 0; Append(w->def, " throw("); Append(declaration, " throw("); if (throw_parm_list) Swig_typemap_attach_parms("throws", throw_parm_list, 0); for (p = throw_parm_list; p; p = nextSibling(p)) { if (Getattr(p, "tmap:throws")) { if (gencomma++) { Append(w->def, ", "); Append(declaration, ", "); } String *str = SwigType_str(Getattr(p, "type"), 0); Append(w->def, str); Append(declaration, str); Delete(str); } } Append(w->def, ")"); Append(declaration, ")"); } Append(w->def, " {"); Append(declaration, ";\n"); /* declare method return value * if the return value is a reference or const reference, a specialized typemap must * handle it, including declaration of c_result ($result). */ if (!is_void && (!ignored_method || pure_virtual)) { if (!SwigType_isclass(returntype)) { if (!(SwigType_ispointer(returntype) || SwigType_isreference(returntype))) { String *construct_result = NewStringf("= SwigValueInit< %s >()", SwigType_lstr(returntype, 0)); Wrapper_add_localv(w, "c_result", SwigType_lstr(returntype, "c_result"), construct_result, NIL); Delete(construct_result); } else { Wrapper_add_localv(w, "c_result", SwigType_lstr(returntype, "c_result"), "= 0", NIL); } } else { String *cres = SwigType_lstr(returntype, "c_result"); Printf(w->code, "%s;\n", cres); Delete(cres); } } if (ignored_method) { if (!pure_virtual) { if (!is_void) Printf(w->code, "return "); String *super_call = Swig_method_call(super, l); Printf(w->code, "%s;\n", super_call); Delete(super_call); } else { Printf(w->code, "Swig::DirectorPureVirtualException::raise(\"Attempted to invoke pure virtual method %s::%s\");\n", SwigType_namestr(c_classname), SwigType_namestr(name)); } } else { /* attach typemaps to arguments (C/C++ -> PHP) */ String *parse_args = NewStringEmpty(); Swig_director_parms_fixup(l); /* remove the wrapper 'w' since it was producing spurious temps */ Swig_typemap_attach_parms("in", l, 0); Swig_typemap_attach_parms("directorin", l, w); Swig_typemap_attach_parms("directorargout", l, w); Parm *p; int outputs = 0; if (!is_void) outputs++; /* build argument list and type conversion string */ idx = 0; p = l; while (p) { if (checkAttribute(p, "tmap:in:numinputs", "0")) { p = Getattr(p, "tmap:in:next"); continue; } if (Getattr(p, "tmap:directorargout") != 0) outputs++; String *pname = Getattr(p, "name"); String *ptype = Getattr(p, "type"); if ((tm = Getattr(p, "tmap:directorin")) != 0) { String *parse = Getattr(p, "tmap:directorin:parse"); if (!parse) { String *input = NewStringf("&args[%d]", idx++); Setattr(p, "emit:directorinput", input); Replaceall(tm, "$input", input); Delete(input); Replaceall(tm, "$owner", "0"); Printv(wrap_args, tm, "\n", NIL); Putc('O', parse_args); } else { Append(parse_args, parse); Setattr(p, "emit:directorinput", pname); Replaceall(tm, "$input", pname); Replaceall(tm, "$owner", "0"); if (Len(tm) == 0) Append(tm, pname); } p = Getattr(p, "tmap:directorin:next"); continue; } else if (Cmp(ptype, "void")) { Swig_warning(WARN_TYPEMAP_DIRECTORIN_UNDEF, input_file, line_number, "Unable to use type %s as a function argument in director method %s::%s (skipping method).\n", SwigType_str(ptype, 0), SwigType_namestr(c_classname), SwigType_namestr(name)); status = SWIG_NOWRAP; break; } p = nextSibling(p); } /* exception handling */ bool error_used_in_typemap = false; tm = Swig_typemap_lookup("director:except", n, Swig_cresult_name(), 0); if (!tm) { tm = Getattr(n, "feature:director:except"); if (tm) tm = Copy(tm); } if ((tm) && Len(tm) && (Strcmp(tm, "1") != 0)) { if (Replaceall(tm, "$error", "error")) { /* Only declare error if it is used by the typemap. */ error_used_in_typemap = true; Append(w->code, "int error;\n"); } } else { Delete(tm); tm = NULL; } if (!idx) { Printf(w->code, "zval *args = NULL;\n"); } else { Printf(w->code, "zval args[%d];\n", idx); } // typemap_directorout testcase requires that 0 can be assigned to the // variable named after the result of Swig_cresult_name(), so that can't // be a zval - make it a pointer to one instead. Printf(w->code, "zval swig_zval_result, swig_funcname;\n", Swig_cresult_name()); Printf(w->code, "zval * SWIGUNUSED %s = &swig_zval_result;\n", Swig_cresult_name()); const char * funcname = GetChar(n, "sym:name"); Printf(w->code, "ZVAL_STRINGL(&swig_funcname, \"%s\", %d);\n", funcname, strlen(funcname)); /* wrap complex arguments to zvals */ Printv(w->code, wrap_args, NIL); if (error_used_in_typemap) { Append(w->code, "error = "); } Append(w->code, "call_user_function(EG(function_table), &swig_self, &swig_funcname,"); Printf(w->code, " &swig_zval_result, %d, args);\n", idx); if (tm) { Printv(w->code, Str(tm), "\n", NIL); Delete(tm); } /* marshal return value from PHP to C/C++ type */ String *cleanup = NewStringEmpty(); String *outarg = NewStringEmpty(); idx = 0; /* marshal return value */ if (!is_void) { tm = Swig_typemap_lookup("directorout", n, Swig_cresult_name(), w); if (tm != 0) { Replaceall(tm, "$input", Swig_cresult_name()); char temp[24]; sprintf(temp, "%d", idx); Replaceall(tm, "$argnum", temp); /* TODO check this */ if (Getattr(n, "wrap:disown")) { Replaceall(tm, "$disown", "SWIG_POINTER_DISOWN"); } else { Replaceall(tm, "$disown", "0"); } Replaceall(tm, "$result", "c_result"); Printv(w->code, tm, "\n", NIL); Delete(tm); } else { Swig_warning(WARN_TYPEMAP_DIRECTOROUT_UNDEF, input_file, line_number, "Unable to use return type %s in director method %s::%s (skipping method).\n", SwigType_str(returntype, 0), SwigType_namestr(c_classname), SwigType_namestr(name)); status = SWIG_ERROR; } } /* marshal outputs */ for (p = l; p;) { if ((tm = Getattr(p, "tmap:directorargout")) != 0) { Replaceall(tm, "$result", Swig_cresult_name()); Replaceall(tm, "$input", Getattr(p, "emit:directorinput")); Printv(w->code, tm, "\n", NIL); p = Getattr(p, "tmap:directorargout:next"); } else { p = nextSibling(p); } } Delete(parse_args); Delete(cleanup); Delete(outarg); } Append(w->code, "thrown:\n"); if (!is_void) { if (!(ignored_method && !pure_virtual)) { String *rettype = SwigType_str(returntype, 0); if (!SwigType_isreference(returntype)) { Printf(w->code, "return (%s) c_result;\n", rettype); } else { Printf(w->code, "return (%s) *c_result;\n", rettype); } Delete(rettype); } } else { Append(w->code, "return;\n"); } Append(w->code, "fail:\n"); Append(w->code, "SWIG_FAIL();\n"); Append(w->code, "}\n"); // We expose protected methods via an extra public inline method which makes a straight call to the wrapped class' method String *inline_extra_method = NewStringEmpty(); if (dirprot_mode() && !is_public(n) && !pure_virtual) { Printv(inline_extra_method, declaration, NIL); String *extra_method_name = NewStringf("%sSwigPublic", name); Replaceall(inline_extra_method, name, extra_method_name); Replaceall(inline_extra_method, ";\n", " {\n "); if (!is_void) Printf(inline_extra_method, "return "); String *methodcall = Swig_method_call(super, l); Printv(inline_extra_method, methodcall, ";\n }\n", NIL); Delete(methodcall); Delete(extra_method_name); } /* emit the director method */ if (status == SWIG_OK) { if (!Getattr(n, "defaultargs")) { Replaceall(w->code, "$symname", symname); Wrapper_print(w, f_directors); Printv(f_directors_h, declaration, NIL); Printv(f_directors_h, inline_extra_method, NIL); } } /* clean up */ Delete(wrap_args); Delete(pclassname); DelWrapper(w); return status; } int classDirectorDisown(Node *) { return SWIG_OK; } }; /* class PHP */ static PHP *maininstance = 0; // We use this function to be able to write out zend_register_list_destructor_ex // lines for most things in the type table // NOTE: it's a function NOT A PHP::METHOD extern "C" { static void typetrace(const SwigType *ty, String *mangled, String *clientdata) { Node *class_node; if (!zend_types) { zend_types = NewHash(); } // we want to know if the type which reduced to this has a constructor if ((class_node = maininstance->classLookup(ty))) { if (!Getattr(zend_types, mangled)) { // OK it may have been set before by a different SwigType but it would // have had the same underlying class node I think // - it is certainly required not to have different originating class // nodes for the same SwigType Setattr(zend_types, mangled, class_node); } } else { // a non-class pointer Setattr(zend_types, mangled, NOTCLASS); } if (r_prevtracefunc) (*r_prevtracefunc) (ty, mangled, (String *) clientdata); } } /* ----------------------------------------------------------------------------- * new_swig_php() - Instantiate module * ----------------------------------------------------------------------------- */ static Language *new_swig_php() { maininstance = new PHP; if (!r_prevtracefunc) { r_prevtracefunc = SwigType_remember_trace(typetrace); } else { Printf(stderr, "php Typetrace vector already saved!\n"); assert(0); } return maininstance; } extern "C" Language *swig_php(void) { return new_swig_php(); } swig-4.0.1/Source/Makefile.am0000644000175000017500000001144413527063513015650 0ustar williamwilliam## Process this file with automake to produce Makefile.in # subdir-objects generates object files using the directory structure of the source files. AUTOMAKE_OPTIONS = foreign nostdinc subdir-objects 1.7.2 SOURCE_DIR=$(top_srcdir)/Source BUILD_SOURCE_DIR=$(top_builddir)/Source SWIG_CXX_DEFS = @SWILL@ AM_CPPFLAGS = -I$(BUILD_SOURCE_DIR)/Include \ -I$(BUILD_SOURCE_DIR)/CParse \ -I$(SOURCE_DIR)/Include \ -I$(SOURCE_DIR)/DOH \ -I$(SOURCE_DIR)/CParse \ -I$(SOURCE_DIR)/Doxygen \ -I$(SOURCE_DIR)/Preprocessor \ -I$(SOURCE_DIR)/Swig \ -I$(SOURCE_DIR)/Modules AM_CXXFLAGS = $(SWIG_CXX_DEFS) AM_YFLAGS = -d BUILT_SOURCES = CParse/parser.h eswig_SOURCES = CParse/cscanner.c \ CParse/parser.y \ CParse/templ.c \ CParse/util.c \ DOH/base.c \ DOH/file.c \ DOH/fio.c \ DOH/hash.c \ DOH/list.c \ DOH/memory.c \ DOH/string.c \ DOH/void.c \ Doxygen/doxyentity.cxx \ Doxygen/doxyentity.h \ Doxygen/doxyparser.cxx \ Doxygen/doxyparser.h \ Doxygen/doxytranslator.cxx \ Doxygen/doxytranslator.h \ Doxygen/javadoc.cxx \ Doxygen/javadoc.h \ Doxygen/pydoc.cxx \ Doxygen/pydoc.h \ Modules/allocate.cxx \ Modules/browser.cxx \ Modules/contract.cxx \ Modules/csharp.cxx \ Modules/d.cxx \ Modules/directors.cxx \ Modules/emit.cxx \ Modules/go.cxx \ Modules/guile.cxx \ Modules/interface.cxx \ Modules/java.cxx \ Modules/javascript.cxx \ Modules/lang.cxx \ Modules/lua.cxx \ Modules/main.cxx \ Modules/mzscheme.cxx \ Modules/nested.cxx \ Modules/ocaml.cxx \ Modules/octave.cxx \ Modules/overload.cxx \ Modules/perl5.cxx \ Modules/php.cxx \ Modules/python.cxx \ Modules/r.cxx \ Modules/ruby.cxx \ Modules/scilab.cxx \ Modules/swigmain.cxx \ Modules/tcl8.cxx \ Modules/typepass.cxx \ Modules/utils.cxx \ Modules/xml.cxx \ Preprocessor/cpp.c \ Preprocessor/expr.c \ Swig/cwrap.c \ Swig/deprecate.c \ Swig/error.c \ Swig/extend.c \ Swig/fragment.c \ Swig/getopt.c \ Swig/include.c \ Swig/misc.c \ Swig/naming.c \ Swig/parms.c \ Swig/scanner.c \ Swig/stype.c \ Swig/symbol.c \ Swig/tree.c \ Swig/typemap.c \ Swig/typeobj.c \ Swig/typesys.c \ Swig/wrapfunc.c bin_PROGRAMS = eswig eswig_LDADD = @SWIGLIBS@ # Override the link stage to avoid using Libtool CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ # The executable is copied to the root directory for installation and running the test-suite. # This occurs on each invocation of make and is a step towards providing support for multiple # build directories. all-local: eswig@EXEEXT@ cp -f $(top_builddir)/Source/eswig@EXEEXT@ $(top_builddir)/swig@EXEEXT@ clean-local: rm -f $(top_builddir)/swig@EXEEXT@ rm -f core @EXTRA_CLEAN@ distclean-local: rm -f $(top_builddir)/Source/Include/swigconfig.h rm -f $(top_builddir)/Source/Include/stamp-h1 # Beautify the code. # Note that this works well on C code, but does some odd joining of lines for C++ code. # Compiling with -DNDEBUG and no optimisations will allow one to do a binary diff of the # swig executable as a way of checking before and after the 'beautifying'. # Single files can be beautified with the beautify-file target, eg: 'make beautify-file INDENTFILE=chosenfile.c' SWIGTYPEDEFS=-T bool -T File -T DohObjInfo -T Parm -T Language -T List -T TargetLanguageModule -T Typetab -T ModuleFactory -T ErrorMessageFormat -T Symtab -T Hash -T Scanner -T String -T DohBase -T Node -T String_or_char -T SwigType -T Dispatcher -T Wrapper -T DohStringMethods -T DohFileMethods -T DohListMethods -T DohHashMethods -T DOH -T DohIterator -T ParmList -T FILE -T HashNode -T DOHObj_or_char -T DOHFile -T DOHString -T DOHString_or_char -T UpcallData INDENTBAKSDIR=../IndentBaks beautify: rm -rf $(INDENTBAKSDIR) mkdir $(INDENTBAKSDIR) mkdir $(INDENTBAKSDIR)/CParse mkdir $(INDENTBAKSDIR)/DOH mkdir $(INDENTBAKSDIR)/Modules mkdir $(INDENTBAKSDIR)/Preprocessor mkdir $(INDENTBAKSDIR)/Swig mkdir $(INDENTBAKSDIR)/Include (csources=`find . -name "*.c"` && \ hsources=`find . -name "*.h"` && \ cxxsources=`find . -name "*.cxx"` && \ for file in $$csources $$hsources $$cxxsources; do \ $(MAKE) beautify-file INDENTFILE=$$file; \ done; ) beautify-file: test -e $(INDENTBAKSDIR) || (echo $(INDENTBAKSDIR) directory does not exist && exit 1;) test -n "$(INDENTFILE)" || (echo INDENTFILE not defined && exit 1;) test -e $(INDENTFILE) || (echo File does not exist: $(INDENTFILE) && exit 1;) cp $(INDENTFILE) $(INDENTBAKSDIR)/$(INDENTFILE); indent -kr --honour-newlines --line-length160 --indent-level2 --braces-on-func-def-line --leave-optional-blank-lines $(SWIGTYPEDEFS) $(INDENTFILE) -o $(INDENTFILE).tmp; cat $(INDENTFILE).tmp | sed -e 's/const const /const /' > $(INDENTFILE); rm $(INDENTFILE).tmp; swig-4.0.1/Source/Include/0000755000175000017500000000000013527234047015175 5ustar williamwilliamswig-4.0.1/Source/Include/swigwarn.h0000644000175000017500000003216113527063513017210 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * swigwarn.h * * SWIG warning message numbers * This file serves as the main registry of warning message numbers. Some of these * numbers are used internally in the C/C++ source code of SWIG. However, some * of the numbers are used in SWIG configuration files (swig.swg and others). * * The numbers are roughly organized into a few different classes by functionality. * * Even though symbolic constants are used in the SWIG source, this is * not always the case in SWIG interface files. Do not change the * numbers in this file. * * This file is used as the input for generating Lib/swigwarn.swg. * ----------------------------------------------------------------------------- */ #ifndef SWIGWARN_H_ #define SWIGWARN_H_ #define WARN_NONE 0 /* -- Deprecated features -- */ #define WARN_DEPRECATED_EXTERN 101 #define WARN_DEPRECATED_VAL 102 #define WARN_DEPRECATED_OUT 103 #define WARN_DEPRECATED_DISABLEDOC 104 #define WARN_DEPRECATED_ENABLEDOC 105 #define WARN_DEPRECATED_DOCONLY 106 #define WARN_DEPRECATED_STYLE 107 #define WARN_DEPRECATED_LOCALSTYLE 108 #define WARN_DEPRECATED_TITLE 109 #define WARN_DEPRECATED_SECTION 110 #define WARN_DEPRECATED_SUBSECTION 111 #define WARN_DEPRECATED_SUBSUBSECTION 112 #define WARN_DEPRECATED_ADDMETHODS 113 #define WARN_DEPRECATED_READONLY 114 #define WARN_DEPRECATED_READWRITE 115 #define WARN_DEPRECATED_EXCEPT 116 #define WARN_DEPRECATED_NEW 117 #define WARN_DEPRECATED_EXCEPT_TM 118 #define WARN_DEPRECATED_IGNORE_TM 119 #define WARN_DEPRECATED_OPTC 120 #define WARN_DEPRECATED_NAME 121 #define WARN_DEPRECATED_NOEXTERN 122 #define WARN_DEPRECATED_NODEFAULT 123 #define WARN_DEPRECATED_TYPEMAP_LANG 124 #define WARN_DEPRECATED_INPUT_FILE 125 #define WARN_DEPRECATED_NESTED_WORKAROUND 126 /* -- Preprocessor -- */ #define WARN_PP_MISSING_FILE 201 #define WARN_PP_EVALUATION 202 #define WARN_PP_INCLUDEALL_IMPORTALL 203 #define WARN_PP_CPP_WARNING 204 #define WARN_PP_CPP_ERROR 205 #define WARN_PP_UNEXPECTED_TOKENS 206 /* -- C/C++ Parser -- */ #define WARN_PARSE_CLASS_KEYWORD 301 #define WARN_PARSE_REDEFINED 302 #define WARN_PARSE_EXTEND_UNDEF 303 #define WARN_PARSE_UNSUPPORTED_VALUE 304 #define WARN_PARSE_BAD_VALUE 305 #define WARN_PARSE_PRIVATE 306 #define WARN_PARSE_BAD_DEFAULT 307 #define WARN_PARSE_NAMESPACE_ALIAS 308 #define WARN_PARSE_PRIVATE_INHERIT 309 #define WARN_PARSE_TEMPLATE_REPEAT 310 #define WARN_PARSE_TEMPLATE_PARTIAL 311 #define WARN_PARSE_UNNAMED_NESTED_CLASS 312 #define WARN_PARSE_UNDEFINED_EXTERN 313 #define WARN_PARSE_KEYWORD 314 #define WARN_PARSE_USING_UNDEF 315 #define WARN_PARSE_MODULE_REPEAT 316 #define WARN_PARSE_TEMPLATE_SP_UNDEF 317 #define WARN_PARSE_TEMPLATE_AMBIG 318 #define WARN_PARSE_NO_ACCESS 319 #define WARN_PARSE_EXPLICIT_TEMPLATE 320 #define WARN_PARSE_BUILTIN_NAME 321 #define WARN_PARSE_REDUNDANT 322 #define WARN_PARSE_REC_INHERITANCE 323 #define WARN_PARSE_NESTED_TEMPLATE 324 #define WARN_PARSE_NAMED_NESTED_CLASS 325 #define WARN_PARSE_EXTEND_NAME 326 #define WARN_CPP11_LAMBDA 340 #define WARN_CPP11_ALIAS_DECLARATION 341 /* redundant now */ #define WARN_CPP11_ALIAS_TEMPLATE 342 /* redundant now */ #define WARN_CPP11_VARIADIC_TEMPLATE 343 #define WARN_IGNORE_OPERATOR_NEW 350 /* new */ #define WARN_IGNORE_OPERATOR_DELETE 351 /* delete */ #define WARN_IGNORE_OPERATOR_PLUS 352 /* + */ #define WARN_IGNORE_OPERATOR_MINUS 353 /* - */ #define WARN_IGNORE_OPERATOR_MUL 354 /* * */ #define WARN_IGNORE_OPERATOR_DIV 355 /* / */ #define WARN_IGNORE_OPERATOR_MOD 356 /* % */ #define WARN_IGNORE_OPERATOR_XOR 357 /* ^ */ #define WARN_IGNORE_OPERATOR_AND 358 /* & */ #define WARN_IGNORE_OPERATOR_OR 359 /* | */ #define WARN_IGNORE_OPERATOR_NOT 360 /* ~ */ #define WARN_IGNORE_OPERATOR_LNOT 361 /* ! */ #define WARN_IGNORE_OPERATOR_EQ 362 /* = */ #define WARN_IGNORE_OPERATOR_LT 363 /* < */ #define WARN_IGNORE_OPERATOR_GT 364 /* > */ #define WARN_IGNORE_OPERATOR_PLUSEQ 365 /* += */ #define WARN_IGNORE_OPERATOR_MINUSEQ 366 /* -= */ #define WARN_IGNORE_OPERATOR_MULEQ 367 /* *= */ #define WARN_IGNORE_OPERATOR_DIVEQ 368 /* /= */ #define WARN_IGNORE_OPERATOR_MODEQ 369 /* %= */ #define WARN_IGNORE_OPERATOR_XOREQ 370 /* ^= */ #define WARN_IGNORE_OPERATOR_ANDEQ 371 /* &= */ #define WARN_IGNORE_OPERATOR_OREQ 372 /* |= */ #define WARN_IGNORE_OPERATOR_LSHIFT 373 /* << */ #define WARN_IGNORE_OPERATOR_RSHIFT 374 /* >> */ #define WARN_IGNORE_OPERATOR_LSHIFTEQ 375 /* <<= */ #define WARN_IGNORE_OPERATOR_RSHIFTEQ 376 /* >>= */ #define WARN_IGNORE_OPERATOR_EQUALTO 377 /* == */ #define WARN_IGNORE_OPERATOR_NOTEQUAL 378 /* != */ #define WARN_IGNORE_OPERATOR_LTEQUAL 379 /* <= */ #define WARN_IGNORE_OPERATOR_GTEQUAL 380 /* >= */ #define WARN_IGNORE_OPERATOR_LAND 381 /* && */ #define WARN_IGNORE_OPERATOR_LOR 382 /* || */ #define WARN_IGNORE_OPERATOR_PLUSPLUS 383 /* ++ */ #define WARN_IGNORE_OPERATOR_MINUSMINUS 384 /* -- */ #define WARN_IGNORE_OPERATOR_COMMA 385 /* , */ #define WARN_IGNORE_OPERATOR_ARROWSTAR 386 /* ->* */ #define WARN_IGNORE_OPERATOR_ARROW 387 /* -> */ #define WARN_IGNORE_OPERATOR_CALL 388 /* () */ #define WARN_IGNORE_OPERATOR_INDEX 389 /* [] */ #define WARN_IGNORE_OPERATOR_UPLUS 390 /* + */ #define WARN_IGNORE_OPERATOR_UMINUS 391 /* - */ #define WARN_IGNORE_OPERATOR_UMUL 392 /* * */ #define WARN_IGNORE_OPERATOR_UAND 393 /* & */ #define WARN_IGNORE_OPERATOR_NEWARR 394 /* new [] */ #define WARN_IGNORE_OPERATOR_DELARR 395 /* delete [] */ #define WARN_IGNORE_OPERATOR_REF 396 /* operator *() */ /* 394-399 are reserved */ /* -- Type system and typemaps -- */ #define WARN_TYPE_UNDEFINED_CLASS 401 #define WARN_TYPE_INCOMPLETE 402 #define WARN_TYPE_ABSTRACT 403 #define WARN_TYPE_REDEFINED 404 #define WARN_TYPE_RVALUE_REF_QUALIFIER_IGNORED 405 #define WARN_TYPEMAP_SOURCETARGET 450 #define WARN_TYPEMAP_CHARLEAK 451 #define WARN_TYPEMAP_SWIGTYPE 452 #define WARN_TYPEMAP_APPLY_UNDEF 453 #define WARN_TYPEMAP_SWIGTYPELEAK 454 #define WARN_TYPEMAP_IN_UNDEF 460 #define WARN_TYPEMAP_OUT_UNDEF 461 #define WARN_TYPEMAP_VARIN_UNDEF 462 #define WARN_TYPEMAP_VAROUT_UNDEF 463 #define WARN_TYPEMAP_CONST_UNDEF 464 #define WARN_TYPEMAP_UNDEF 465 #define WARN_TYPEMAP_VAR_UNDEF 466 #define WARN_TYPEMAP_TYPECHECK 467 #define WARN_TYPEMAP_THROW 468 #define WARN_TYPEMAP_DIRECTORIN_UNDEF 469 #define WARN_TYPEMAP_THREAD_UNSAFE 470 /* mostly used in directorout typemaps */ #define WARN_TYPEMAP_DIRECTOROUT_UNDEF 471 #define WARN_TYPEMAP_TYPECHECK_UNDEF 472 #define WARN_TYPEMAP_DIRECTOROUT_PTR 473 #define WARN_TYPEMAP_OUT_OPTIMAL_IGNORED 474 #define WARN_TYPEMAP_OUT_OPTIMAL_MULTIPLE 475 #define WARN_TYPEMAP_INITIALIZER_LIST 476 #define WARN_TYPEMAP_DIRECTORTHROWS_UNDEF 477 /* -- Fragments -- */ #define WARN_FRAGMENT_NOT_FOUND 490 /* -- General code generation -- */ #define WARN_LANG_OVERLOAD_DECL 501 #define WARN_LANG_OVERLOAD_CONSTRUCT 502 #define WARN_LANG_IDENTIFIER 503 #define WARN_LANG_RETURN_TYPE 504 #define WARN_LANG_VARARGS 505 #define WARN_LANG_VARARGS_KEYWORD 506 #define WARN_LANG_NATIVE_UNIMPL 507 #define WARN_LANG_DEREF_SHADOW 508 #define WARN_LANG_OVERLOAD_SHADOW 509 #define WARN_LANG_FRIEND_IGNORE 510 #define WARN_LANG_OVERLOAD_KEYWORD 511 #define WARN_LANG_OVERLOAD_CONST 512 #define WARN_LANG_CLASS_UNNAMED 513 #define WARN_LANG_DIRECTOR_VDESTRUCT 514 #define WARN_LANG_DISCARD_CONST 515 #define WARN_LANG_OVERLOAD_IGNORED 516 #define WARN_LANG_DIRECTOR_ABSTRACT 517 #define WARN_LANG_PORTABILITY_FILENAME 518 #define WARN_LANG_TEMPLATE_METHOD_IGNORE 519 #define WARN_LANG_SMARTPTR_MISSING 520 #define WARN_LANG_ILLEGAL_DESTRUCTOR 521 #define WARN_LANG_EXTEND_CONSTRUCTOR 522 #define WARN_LANG_EXTEND_DESTRUCTOR 523 #define WARN_LANG_EXPERIMENTAL 524 #define WARN_LANG_DIRECTOR_FINAL 525 /* -- Doxygen comments -- */ #define WARN_DOXYGEN_UNKNOWN_COMMAND 560 #define WARN_DOXYGEN_UNEXPECTED_END_OF_COMMENT 561 #define WARN_DOXYGEN_COMMAND_EXPECTED 562 #define WARN_DOXYGEN_HTML_ERROR 563 #define WARN_DOXYGEN_COMMAND_ERROR 564 #define WARN_DOXYGEN_UNKNOWN_CHARACTER 565 #define WARN_DOXYGEN_UNEXPECTED_ITERATOR_VALUE 566 /* -- Reserved (600-799) -- */ /* -- Language module specific warnings (700 - 899) -- */ /* Feel free to claim any number in this space that's not currently being used. Just make sure you add an entry here */ #define WARN_D_TYPEMAP_CTYPE_UNDEF 700 #define WARN_D_TYPEMAP_IMTYPE_UNDEF 701 #define WARN_D_TYPEMAP_DTYPE_UNDEF 702 #define WARN_D_MULTIPLE_INHERITANCE 703 #define WARN_D_TYPEMAP_CLASSMOD_UNDEF 704 #define WARN_D_TYPEMAP_DBODY_UNDEF 705 #define WARN_D_TYPEMAP_DOUT_UNDEF 706 #define WARN_D_TYPEMAP_DIN_UNDEF 707 #define WARN_D_TYPEMAP_DDIRECTORIN_UNDEF 708 #define WARN_D_TYPEMAP_DCONSTRUCTOR_UNDEF 709 #define WARN_D_EXCODE_MISSING 710 #define WARN_D_CANTHROW_MISSING 711 #define WARN_D_NO_DIRECTORCONNECT_ATTR 712 #define WARN_D_NAME_COLLISION 713 /* please leave 700-719 free for D */ #define WARN_SCILAB_TRUNCATED_NAME 720 /* please leave 720-739 free for Scilab */ #define WARN_PYTHON_INDENT_MISMATCH 740 /* please leave 740-759 free for Python */ #define WARN_RUBY_WRONG_NAME 801 #define WARN_RUBY_MULTIPLE_INHERITANCE 802 /* please leave 800-809 free for Ruby */ #define WARN_JAVA_TYPEMAP_JNI_UNDEF 810 #define WARN_JAVA_TYPEMAP_JTYPE_UNDEF 811 #define WARN_JAVA_TYPEMAP_JSTYPE_UNDEF 812 #define WARN_JAVA_MULTIPLE_INHERITANCE 813 #define WARN_JAVA_TYPEMAP_GETCPTR_UNDEF 814 #define WARN_JAVA_TYPEMAP_CLASSMOD_UNDEF 815 #define WARN_JAVA_TYPEMAP_JAVABODY_UNDEF 816 #define WARN_JAVA_TYPEMAP_JAVAOUT_UNDEF 817 #define WARN_JAVA_TYPEMAP_JAVAIN_UNDEF 818 #define WARN_JAVA_TYPEMAP_JAVADIRECTORIN_UNDEF 819 #define WARN_JAVA_TYPEMAP_JAVADIRECTOROUT_UNDEF 820 #define WARN_JAVA_TYPEMAP_INTERFACECODE_UNDEF 821 #define WARN_JAVA_COVARIANT_RET 822 #define WARN_JAVA_TYPEMAP_JAVACONSTRUCT_UNDEF 823 #define WARN_JAVA_TYPEMAP_DIRECTORIN_NODESC 824 #define WARN_JAVA_NO_DIRECTORCONNECT_ATTR 825 #define WARN_JAVA_NSPACE_WITHOUT_PACKAGE 826 /* please leave 810-829 free for Java */ #define WARN_CSHARP_TYPEMAP_CTYPE_UNDEF 830 #define WARN_CSHARP_TYPEMAP_CSTYPE_UNDEF 831 #define WARN_CSHARP_TYPEMAP_CSWTYPE_UNDEF 832 #define WARN_CSHARP_MULTIPLE_INHERITANCE 833 #define WARN_CSHARP_TYPEMAP_GETCPTR_UNDEF 834 #define WARN_CSHARP_TYPEMAP_CLASSMOD_UNDEF 835 #define WARN_CSHARP_TYPEMAP_CSBODY_UNDEF 836 #define WARN_CSHARP_TYPEMAP_CSOUT_UNDEF 837 #define WARN_CSHARP_TYPEMAP_CSIN_UNDEF 838 #define WARN_CSHARP_TYPEMAP_CSDIRECTORIN_UNDEF 839 #define WARN_CSHARP_TYPEMAP_CSDIRECTOROUT_UNDEF 840 #define WARN_CSHARP_TYPEMAP_INTERFACECODE_UNDEF 841 #define WARN_CSHARP_COVARIANT_RET 842 #define WARN_CSHARP_TYPEMAP_CSCONSTRUCT_UNDEF 843 #define WARN_CSHARP_EXCODE 844 #define WARN_CSHARP_CANTHROW 845 #define WARN_CSHARP_NO_DIRECTORCONNECT_ATTR 846 /* please leave 830-849 free for C# */ #define WARN_MODULA3_TYPEMAP_TYPE_UNDEF 850 #define WARN_MODULA3_TYPEMAP_GETCPTR_UNDEF 851 #define WARN_MODULA3_TYPEMAP_CLASSMOD_UNDEF 852 #define WARN_MODULA3_TYPEMAP_PTRCONSTMOD_UNDEF 853 #define WARN_MODULA3_TYPEMAP_MULTIPLE_RETURN 854 #define WARN_MODULA3_MULTIPLE_INHERITANCE 855 #define WARN_MODULA3_TYPECONSTRUCTOR_UNKNOWN 856 #define WARN_MODULA3_UNKNOWN_PRAGMA 857 #define WARN_MODULA3_BAD_ENUMERATION 858 #define WARN_MODULA3_DOUBLE_ID 859 #define WARN_MODULA3_BAD_IMPORT 860 /* please leave 850-869 free for Modula 3 */ #define WARN_PHP_MULTIPLE_INHERITANCE 870 #define WARN_PHP_UNKNOWN_PRAGMA 871 #define WARN_PHP_PUBLIC_BASE 872 /* please leave 870-889 free for PHP */ #define WARN_GO_NAME_CONFLICT 890 /* please leave 890-899 free for Go */ /* -- User defined warnings (900 - 999) -- */ #endif swig-4.0.1/Source/Include/swigconfig.h.in0000644000175000017500000000437013527234047020116 0ustar williamwilliam/* Source/Include/swigconfig.h.in. Generated from configure.ac by autoheader. */ /* define if the Boost library is available */ #undef HAVE_BOOST /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H /* Define to 1 if you have the `dl' library (-ldl). */ #undef HAVE_LIBDL /* Define to 1 if you have the `dld' library (-ldld). */ #undef HAVE_LIBDLD /* Define to 1 if you have the header file. */ #undef HAVE_MEMORY_H /* Define if you have PCRE library */ #undef HAVE_PCRE /* Define if popen is available */ #undef HAVE_POPEN /* Define to 1 if you have the header file. */ #undef HAVE_STDINT_H /* Define to 1 if you have the header file. */ #undef HAVE_STDLIB_H /* Define to 1 if you have the header file. */ #undef HAVE_STRINGS_H /* Define to 1 if you have the header file. */ #undef HAVE_STRING_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_STAT_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TYPES_H /* Define to 1 if you have the header file. */ #undef HAVE_UNISTD_H /* Name of package */ #undef PACKAGE /* Define to the address where bug reports for this package should be sent. */ #undef PACKAGE_BUGREPORT /* Define to the full name of this package. */ #undef PACKAGE_NAME /* Define to the full name and version of this package. */ #undef PACKAGE_STRING /* Define to the one symbol short name of this package. */ #undef PACKAGE_TARNAME /* Define to the home page for this package. */ #undef PACKAGE_URL /* Define to the version of this package. */ #undef PACKAGE_VERSION /* The size of `void *', as computed by sizeof. */ #undef SIZEOF_VOID_P /* Define to 1 if you have the ANSI C header files. */ #undef STDC_HEADERS /* Compiler that built SWIG */ #undef SWIG_CXX /* Directory for SWIG system-independent libraries */ #undef SWIG_LIB /* Directory for SWIG system-independent libraries (Unix install on native Windows) */ #undef SWIG_LIB_WIN_UNIX /* Platform that SWIG is built for */ #undef SWIG_PLATFORM /* Version number of package */ #undef VERSION /* Deal with attempt by Microsoft to deprecate C standard runtime functions */ #if defined(_MSC_VER) # define _CRT_SECURE_NO_DEPRECATE #endif swig-4.0.1/Source/Doxygen/0000755000175000017500000000000013527063513015225 5ustar williamwilliamswig-4.0.1/Source/Doxygen/pydoc.h0000644000175000017500000001576713527063513016534 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * pydoc.h * * Module to return documentation for nodes formatted for PyDoc * ----------------------------------------------------------------------------- */ #ifndef PYDOCCONVERTER_H_ #define PYDOCCONVERTER_H_ #include #include #include "swig.h" #include "doxyentity.h" #include "doxytranslator.h" #define DOC_STRING_LENGTH 64 // characters per line allowed #define DOC_PARAM_STRING_LENGTH 30 // characters reserved for param name / type class PyDocConverter : public DoxygenTranslator { public: PyDocConverter(int flags = 0); String *makeDocumentation(Node *node); protected: size_t m_tableLineLen; bool m_prevRowIsTH; std::string m_url; /* * Translate every entity in a tree, also manages sections * display. Prints title for every group of tags that have * a section title associated with them */ std::string translateSubtree(DoxygenEntity &doxygenEntity); /* * Translate one entity with the appropriate handler, according * to the tagHandlers */ void translateEntity(DoxygenEntity &doxyEntity, std::string &translatedComment); /* * Typedef for the function that handles one tag * arg - some string argument to easily pass it through lookup table */ typedef void (PyDocConverter::*tagHandler) (DoxygenEntity &tag, std::string &translatedComment, const std::string &arg); /* * Wrap the command data with the some string * arg - string to wrap with, like '_' or '*' */ void handleTagWrap(DoxygenEntity &tag, std::string &translatedComment, const std::string &arg); /* * Just prints new line */ void handleNewLine(DoxygenEntity &tag, std::string &translatedComment, const std::string &arg); /* * Print the name of tag to the output, used for escape-commands */ void handleTagChar(DoxygenEntity &tag, std::string &translatedComment, const std::string &arg); /* * Format the contents of the \exception tag or its synonyms. */ void handleTagException(DoxygenEntity &tag, std::string &translatedComment, const std::string &arg); /* * Print only the content and strip original tag */ void handleParagraph(DoxygenEntity &tag, std::string &translatedComment, const std::string &arg = std::string()); /* * Handle Doxygen verbatim tag */ void handleVerbatimBlock(DoxygenEntity &tag, std::string &translatedComment, const std::string &arg = std::string()); /* * Handle one of the Doxygen formula-related tags. */ void handleMath(DoxygenEntity &tag, std::string &translatedComment, const std::string &arg); /* * Handle a code snippet. */ void handleCode(DoxygenEntity &tag, std::string &translatedComment, const std::string &arg); /* * Print only data part of code */ void handlePlainString(DoxygenEntity &tag, std::string &translatedComment, const std::string &arg); /** * Copies verbatim args of the tag to output, used for commands like \f$, ... */ void handleTagVerbatim(DoxygenEntity &tag, std::string &translatedComment, const std::string &arg); /* * Print the if-elseif-else-endif section */ void handleTagIf(DoxygenEntity &tag, std::string &translatedComment, const std::string &arg); /* * Prints the specified message, than the contents of the tag * arg - message */ void handleTagMessage(DoxygenEntity &tag, std::string &translatedComment, const std::string &arg); /* * Insert 'Title: ...' */ void handleTagPar(DoxygenEntity &tag, std::string &translatedComment, const std::string &arg); /* * Insert 'Image: ...' */ void handleTagImage(DoxygenEntity &tag, std::string &translatedComment, const std::string &arg); /* * Format nice param description with type information */ void handleTagParam(DoxygenEntity &tag, std::string &translatedComment, const std::string &arg); /* * Format the contents of the \return tag or its synonyms. */ void handleTagReturn(DoxygenEntity &tag, std::string &translatedComment, const std::string &arg); /* * Writes text for \ref tag. */ void handleTagRef(DoxygenEntity &tag, std::string &translatedComment, const std::string &arg); /* Handles HTML tags recognized by Doxygen, like , \n" if subsubsection: index += "\n" if subsection: index += "\n" if section == 1: index += "
    \n" index += """
  • %s\n""" % (headingname,prevheadingtext) subsection = 0 subsubsection = 0 subsubsubsection = 0 skipspace = 1 continue m = h3.match(s) if m: prevheadingtext = getheadingtext(m, s) nameindex += 1 subsection += 1 headingname = getheadingname(m) result.append("""

    %d.%d.%d %s

    """ % (headingname,num,section, subsection, prevheadingtext)) if subsubsubsection: index += "
\n" if subsubsection: index += "\n" if subsection == 1: index += "
    \n" index += """
  • %s\n""" % (headingname,prevheadingtext) subsubsection = 0 skipspace = 1 continue m = h4.match(s) if m: prevheadingtext = getheadingtext(m, s) nameindex += 1 subsubsection += 1 headingname = getheadingname(m) result.append("""

    %d.%d.%d.%d %s

    """ % (headingname,num,section, subsection, subsubsection, prevheadingtext)) if subsubsubsection: index += "
\n" if subsubsection == 1: index += "
    \n" index += """
  • %s\n""" % (headingname,prevheadingtext) subsubsubsection = 0 skipspace = 1 continue m = h5.match(s) if m: prevheadingtext = getheadingtext(m, s) nameindex += 1 subsubsubsection += 1 headingname = getheadingname(m) result.append("""
    %d.%d.%d.%d.%d %s
    """ % (headingname,num,section, subsection, subsubsection, subsubsubsection, prevheadingtext)) if subsubsubsection == 1: index += "
      \n" index += """
    • %s\n""" % (headingname,prevheadingtext) skipspace = 1 continue result.append(s) if subsubsubsection: index += "
    \n" if subsubsection: index += "
\n" if subsection: index += "\n" if section: index += "\n" index += "\n\n" data = "\n".join(result) data = data.replace("@INDEX@",index) + "\n"; # Write the file back out open(filename,"w").write(data) # Print the TOC data to stdout correcting the anchor links for external referencing index = index.replace("
  • %d %s\n""" % (filename,filenamebase,num,name) print index swig-4.0.1/Doc/Manual/fixstyle.py0000644000175000017500000000111513527063513016511 0ustar williamwilliam#!/usr/bin/python # Replace the inline htmldoc stylesheet with the SWIG stylesheet import sys import string filename = sys.argv[1] data = open(filename).read() open(filename+".bak","w").write(data) swigstyle = "\n" + open("style.css").read() lines = data.splitlines() result = [ ] skip = False for s in lines: if not skip: result.append(s) if s == "": result.append(s) skip = False data = "\n".join(result) open(filename,"w").write(data) swig-4.0.1/Doc/Manual/CCache.html0000644000175000017500000004676313527234052016304 0ustar williamwilliam ccache-swig(1) manpage

    20 Using SWIG with ccache - ccache-swig(1) manpage

    20.1 NAME

    ccache-swig - a fast compiler cache

    20.2 SYNOPSIS

    ccache-swig [OPTION]

    ccache-swig <compiler> [COMPILER OPTIONS]

    <compiler> [COMPILER OPTIONS]

    20.3 DESCRIPTION

    ccache-swig is a compiler cache. It speeds up re-compilation of C/C++/SWIG code by caching previous compiles and detecting when the same compile is being done again. ccache-swig is ccache plus support for SWIG. ccache and ccache-swig are used interchangeably in this document.

    20.4 OPTIONS SUMMARY

    Here is a summary of the options to ccache-swig.

    
    -s                      show statistics summary
    -z                      zero statistics
    -c                      run a cache cleanup
    -C                      clear the cache completely
    -F <n>                  set maximum files in cache
    -M <n>                  set maximum size of cache (use G, M or K)
    -h                      this help page
    -V                      print version number
    
    

    20.5 OPTIONS

    These options only apply when you invoke ccache as "ccache-swig". When invoked as a compiler none of these options apply. In that case your normal compiler options apply and you should refer to your compilers documentation.

    -h
    Print a options summary page

    -s
    Print the current statistics summary for the cache. The statistics are stored spread across the subdirectories of the cache. Using "ccache-swig -s" adds up the statistics across all subdirectories and prints the totals.

    -z
    Zero the cache statistics.

    -V
    Print the ccache version number

    -c
    Clean the cache and re-calculate the cache file count and size totals. Normally the -c option should not be necessary as ccache keeps the cache below the specified limits at runtime and keeps statistics up to date on each compile. This option is mostly useful if you manually modify the cache contents or believe that the cache size statistics may be inaccurate.

    -C
    Clear the entire cache, removing all cached files.

    -F <maxfiles>
    This sets the maximum number of files allowed in the cache. The value is stored inside the cache directory and applies to all future compiles. Due to the way the value is stored the actual value used is always rounded down to the nearest multiple of 16.

    -M <maxsize>
    This sets the maximum cache size. You can specify a value in gigabytes, megabytes or kilobytes by appending a G, M or K to the value. The default is gigabytes. The actual value stored is rounded down to the nearest multiple of 16 kilobytes.

    20.6 INSTALLATION

    There are two ways to use ccache. You can either prefix your compile commands with "ccache-swig" or you can create a symbolic link between ccache-swig and the names of your compilers. The first method is most convenient if you just want to try out ccache or wish to use it for some specific projects. The second method is most useful for when you wish to use ccache for all your compiles.

    To install for usage by the first method just copy ccache-swig to somewhere in your path.

    To install for the second method do something like this:

    
      cp ccache-swig /usr/local/bin/
      ln -s /usr/local/bin/ccache-swig /usr/local/bin/gcc
      ln -s /usr/local/bin/ccache-swig /usr/local/bin/g++
      ln -s /usr/local/bin/ccache-swig /usr/local/bin/cc
      ln -s /usr/local/bin/ccache-swig /usr/local/bin/swig
    
    
    This will work as long as /usr/local/bin comes before the path to gcc (which is usually in /usr/bin). After installing you may wish to run "which gcc" to make sure that the correct link is being used.

    Note! Do not use a hard link, use a symbolic link. A hardlink will cause "interesting" problems.

    20.7 EXTRA OPTIONS

    When run as a compiler front end ccache usually just takes the same command line options as the compiler you are using. The only exception to this is the option '--ccache-skip'. That option can be used to tell ccache that the next option is definitely not a input filename, and should be passed along to the compiler as-is.

    The reason this can be important is that ccache does need to parse the command line and determine what is an input filename and what is a compiler option, as it needs the input filename to determine the name of the resulting object file (among other things). The heuristic ccache uses in this parse is that any string on the command line that exists as a file is treated as an input file name (usually a C file). By using --ccache-skip you can force an option to not be treated as an input file name and instead be passed along to the compiler as a command line option.

    20.8 ENVIRONMENT VARIABLES

    ccache uses a number of environment variables to control operation. In most cases you won't need any of these as the defaults will be fine.

    CCACHE_DIR
    the CCACHE_DIR environment variable specifies where ccache will keep its cached compiler output. The default is "$HOME/.ccache".

    CCACHE_TEMPDIR
    the CCACHE_TEMPDIR environment variable specifies where ccache will put temporary files. The default is the same as CCACHE_DIR. Note that the CCACHE_TEMPDIR path must be on the same filesystem as the CCACHE_DIR path, so that renames of files between the two directories can work.

    CCACHE_LOGFILE
    If you set the CCACHE_LOGFILE environment variable then ccache will write some log information on cache hits and misses in that file. This is useful for tracking down problems.

    CCACHE_VERBOSE
    If you set the CCACHE_VERBOSE environment variable then ccache will display on stdout all the compiler invocations that it makes. This can useful for debugging unexpected problems.

    CCACHE_PATH
    You can optionally set CCACHE_PATH to a colon separated path where ccache will look for the real compilers. If you don't do this then ccache will look for the first executable matching the compiler name in the normal PATH that isn't a symbolic link to ccache itself.

    CCACHE_CC
    You can optionally set CCACHE_CC to force the name of the compiler to use. If you don't do this then ccache works it out from the command line.

    CCACHE_PREFIX
    This option adds a prefix to the command line that ccache runs when invoking the compiler. Also see the section below on using ccache with distcc.

    CCACHE_DISABLE
    If you set the environment variable CCACHE_DISABLE then ccache will just call the real compiler, bypassing the cache completely.

    CCACHE_READONLY
    the CCACHE_READONLY environment variable tells ccache to attempt to use existing cached object files, but not to try to add anything new to the cache. If you are using this because your CCACHE_DIR is read-only, then you may find that you also need to set CCACHE_TEMPDIR as otherwise ccache will fail to create the temporary files.

    CCACHE_CPP2
    If you set the environment variable CCACHE_CPP2 then ccache will not use the optimisation of avoiding the 2nd call to the pre-processor by compiling the pre-processed output that was used for finding the hash in the case of a cache miss. This is primarily a debugging option, although it is possible that some unusual compilers will have problems with the intermediate filename extensions used in this optimisation, in which case this option could allow ccache to be used.

    CCACHE_NOCOMPRESS
    If you set the environment variable CCACHE_NOCOMPRESS then there is no compression used on files that go into the cache. However, this setting has no effect on how files are retrieved from the cache, compressed results will still be usable.

    CCACHE_NOSTATS
    If you set the environment variable CCACHE_NOSTATS then ccache will not update the statistics files on each compile.

    CCACHE_NLEVELS
    The environment variable CCACHE_NLEVELS allows you to choose the number of levels of hash in the cache directory. The default is 2. The minimum is 1 and the maximum is 8.

    CCACHE_HARDLINK
    If you set the environment variable CCACHE_HARDLINK then ccache will attempt to use hard links from the cache directory when creating the compiler output rather than using a file copy. Using hard links is faster, but can confuse programs like 'make' that rely on modification times. Hard links are never made for compressed cache files.

    CCACHE_RECACHE
    This forces ccache to not use any cached results, even if it finds them. New results are still cached, but existing cache entries are ignored.

    CCACHE_UMASK
    This sets the umask for ccache and all child processes (such as the compiler). This is mostly useful when you wish to share your cache with other users. Note that this also affects the file permissions set on the object files created from your compilations.

    CCACHE_HASHDIR
    This tells ccache to hash the current working directory when calculating the hash that is used to distinguish two compiles. This prevents a problem with the storage of the current working directory in the debug info of a object file, which can lead ccache to give a cached object file that has the working directory in the debug info set incorrectly. This option is off by default as the incorrect setting of this debug info rarely causes problems. If you strike problems with gdb not using the correct directory then enable this option.

    CCACHE_UNIFY
    If you set the environment variable CCACHE_UNIFY then ccache will use the C/C++ unifier when hashing the pre-processor output if -g is not used in the compile. The unifier is slower than a normal hash, so setting this environment variable loses a little bit of speed, but it means that ccache can take advantage of not recompiling when the changes to the source code consist of reformatting only. Note that using CCACHE_UNIFY changes the hash, so cached compiles with CCACHE_UNIFY set cannot be used when CCACHE_UNIFY is not set and vice versa. The reason the unifier is off by default is that it can give incorrect line number information in compiler warning messages.

    CCACHE_EXTENSION
    Normally ccache tries to automatically determine the extension to use for intermediate C pre-processor files based on the type of file being compiled. Unfortunately this sometimes doesn't work, for example when using the aCC compiler on HP-UX. On systems like this you can use the CCACHE_EXTENSION option to override the default. On HP-UX set this environment variable to "i" if you use the aCC compiler.

    CCACHE_STRIPC
    If you set the environment variable CCACHE_STRIPC then ccache will strip the -c option when invoking the preprocessor. This option is primarily for the Sun Workshop C++ compiler as without this option an unwarranted warning is displayed: CC: Warning: "-E" redefines product from "object" to "source (stdout)" when -E and -c is used together.

    CCACHE_SWIG
    When using SWIG as the compiler and it does not have 'swig' in the executable name, then the CCACHE_SWIG environment variable needs to be set in order for ccache to work correctly with SWIG. The use of CCACHE_CPP2 is also recommended for SWIG due to some preprocessor quirks, however, use of CCACHE_CPP2 can often be skipped -- check your generated code with and without this option set. Known problems are using preprocessor directives within %inline blocks and the use of '#pragma SWIG'.

    20.9 CACHE SIZE MANAGEMENT

    By default ccache has a one gigabyte limit on the cache size and no maximum number of files. You can set a different limit using the "ccache -M" and "ccache -F" options, which set the size and number of files limits.

    When these limits are reached ccache will reduce the cache to 20% below the numbers you specified in order to avoid doing the cache clean operation too often.

    20.10 CACHE COMPRESSION

    By default on most platforms ccache will compress all files it puts into the cache using the zlib compression. While this involves a negligible performance slowdown, it significantly increases the number of files that fit in the cache. You can turn off compression setting the CCACHE_NOCOMPRESS environment variable.

    20.11 HOW IT WORKS

    The basic idea is to detect when you are compiling exactly the same code a 2nd time and use the previously compiled output. You detect that it is the same code by forming a hash of:

    • the pre-processor output from running the compiler with -E
    • the command line options
    • the real compilers size and modification time
    • any stderr output generated by the compiler

    These are hashed using md4 (a strong hash) and a cache file is formed based on that hash result. When the same compilation is done a second time ccache is able to supply the correct compiler output (including all warnings etc) from the cache.

    ccache has been carefully written to always produce exactly the same compiler output that you would get without the cache. If you ever discover a case where ccache changes the output of your compiler then please let me know.

    20.12 USING CCACHE WITH DISTCC

    distcc is a very useful program for distributing compilation across a range of compiler servers. It is often useful to combine distcc with ccache, so that compiles that are done are sped up by distcc, but that ccache avoids the compile completely where possible.

    To use distcc with ccache I recommend using the CCACHE_PREFIX option. You just need to set the environment variable CCACHE_PREFIX to 'distcc' and ccache will prefix the command line used with the compiler with the command 'distcc'.

    20.13 SHARING A CACHE

    A group of developers can increase the cache hit rate by sharing a cache directory. The hard links however cause unwanted side effects, as all links to a cached file share the file's modification timestamp. This results in false dependencies to be triggered by timestamp-based build systems whenever another user links to an existing file. Typically, users will see that their libraries and binaries are relinked without reason. To share a cache without side effects, the following conditions need to be met:

    • Use the same CCACHE_DIR environment variable setting
    • Unset the CCACHE_HARDLINK environment variable
    • Make sure everyone sets the CCACHE_UMASK environment variable to 002, this ensures that cached files are accessible to everyone in the group.
    • Make sure that all users have write permission in the entire cache directory (and that you trust all users of the shared cache).
    • Make sure that the setgid bit is set on all directories in the cache. This tells the filesystem to inherit group ownership for new directories. The command "chmod g+s `find $CCACHE_DIR -type d`" might be useful for this.
    • Set CCACHE_NOCOMPRESS for all users, if there are users with versions of ccache that do not support compression.

    20.14 HISTORY

    ccache was inspired by the compilercache shell script written by Erik Thiele and I would like to thank him for an excellent piece of work. See http://www.erikyyy.de/compilercache/ for the Erik's scripts. ccache-swig is a port of the original ccache with support added for use with SWIG.

    I wrote ccache because I wanted to get a bit more speed out of a compiler cache and I wanted to remove some of the limitations of the shell-script version.

    20.15 DIFFERENCES FROM COMPILERCACHE

    The biggest differences between Erik's compilercache script and ccache are:

    • ccache is written in C, which makes it a bit faster (calling out to external programs is mostly what slowed down the scripts).
    • ccache can automatically find the real compiler
    • ccache keeps statistics on hits/misses
    • ccache can do automatic cache management
    • ccache can cache compiler output that includes warnings. In many cases this gives ccache a much higher cache hit rate.
    • ccache can handle a much wider ranger of compiler options
    • ccache avoids a double call to cpp on a cache miss

    20.16 CREDITS

    Thanks to the following people for their contributions to ccache

    • Erik Thiele for the original compilercache script
    • Luciano Rocha for the idea of compiling the pre-processor output to avoid a 2nd cpp pass
    • Paul Russell for many suggestions and the debian packaging

    20.17 AUTHOR

    ccache was written by Andrew Tridgell https://www.samba.org/~tridge/. ccache was adapted to create ccache-swig for use with SWIG by William Fulton.

    If you wish to report a problem or make a suggestion then please email the SWIG developers on the swig-devel mailing list, see http://www.swig.org/mail.html

    ccache is released under the GNU General Public License version 2 or later. Please see the file COPYING for license details.

    swig-4.0.1/Doc/Manual/Lisp.html0000644000175000017500000004304213527063513016072 0ustar williamwilliam SWIG and Common Lisp

    29 SWIG and Common Lisp

    Common Lisp is a high-level, all-purpose, object-oriented, dynamic, functional programming language with long history. Common Lisp is used in many fields, ranging from web development to finance, and also common in computer science education. There are more than 9 different implementations of common lisp which are available, all have different foreign function interfaces. SWIG currently supports the Common Foreign Function Interface(CFFI).

    29.2 Common Foreign Function Interface(CFFI)

    CFFI, the Common Foreign Function Interface, is a portable foreign function interface for ANSI Common Lisp systems. CFFI requires only a small set of low-level functionality from the Lisp implementation, such as calling a foreign function by name, allocating foreign memory, and dereferencing pointers.

    To run the cffi module of SWIG requires very little effort, you just need to run:

    swig -cffi -module module-name   file-name 
    
    

    But a better was of using all the power of SWIG is to write SWIG interface files. Below we will explain how to write interface files and the various things which you can do with them.

    29.2.1 Additional Commandline Options

    CFFI specific options
    -generate-typedef If this option is given then defctype will be used to generate
    shortcuts according to the typedefs in the input.
    -[no]cwrap Turn on or turn off generation of an intermediate C file when
    creating a C interface. By default this is only done for C++ code.
    -[no]swig-lisp Turns on or off generation of code for helper lisp macro, functions, etc. which SWIG uses while generating wrappers. These macros, functions may still be used by generated wrapper code.

    29.2.2 Generating CFFI bindings

    As we mentioned earlier the ideal way to use SWIG is to use interface files. To illustrate the use of it, let's assume that we have a file named test.h with the following C code:

    #define y 5
    #define x (y >>  1)
    
    typedef int days;
    
    struct bar {
      short p, q;
      char a, b;
      int *z[1000];
      struct bar * n;
    };
      
    struct   bar * my_struct;
    
    struct foo {
      int a;
      struct foo * b[100];
    };
    
    int pointer_func(void (*ClosureFun)( void* _fun, void* _data, void* _evt ), int p);
    
    int func123(div_t * p, int **q[100], int r[][1000][10]);
    
    void lispsort_double (int n, double * array);
    
    enum color { RED, BLUE, GREEN};
    

    Corresponding to this we will write a simple interface file:

    %module test
    
    %include "test.h"
    
    

    The generated SWIG Code will be:

    ;;;SWIG wrapper code starts here
    
    (cl:defmacro defanonenum (&body enums)
       "Converts anonymous enums to defconstants."
      `(cl:progn , @(cl:loop for value in enums
                            for index = 0 then (cl:1+ index)
                            when (cl:listp value) do (cl:setf index (cl:second value)
                                                              value (cl:first value))
                            collect `(cl:defconstant , value , index))))
    
    (cl:eval-when (:compile-toplevel :load-toplevel)
      (cl:unless (cl:fboundp 'swig-lispify)
        (cl:defun swig-lispify (name flag cl:&optional (package cl:*package*))
          (cl:labels ((helper (lst last rest cl:&aux (c (cl:car lst)))
                        (cl:cond
                          ((cl:null lst)
                           rest)
                          ((cl:upper-case-p c)
                           (helper (cl:cdr lst) 'upper
                                   (cl:case last
                                     ((lower digit) (cl:list* c #\- rest))
                                     (cl:t (cl:cons c rest)))))
                          ((cl:lower-case-p c)
                           (helper (cl:cdr lst) 'lower (cl:cons (cl:char-upcase c) rest)))
                          ((cl:digit-char-p c)
                           (helper (cl:cdr lst) 'digit 
                                   (cl:case last
                                     ((upper lower) (cl:list* c #\- rest))
                                     (cl:t (cl:cons c rest)))))
                          ((cl:char-equal c #\_)
                           (helper (cl:cdr lst) '_ (cl:cons #\- rest)))
                          (cl:t
                           (cl:error "Invalid character: ~A" c)))))
            (cl:let ((fix (cl:case flag
                            ((constant enumvalue) "+")
                            (variable "*")
                            (cl:t ""))))
              (cl:intern
               (cl:concatenate
                'cl:string
                fix
                (cl:nreverse (helper (cl:concatenate 'cl:list name) cl:nil cl:nil))
                fix)
               package))))))
    
    ;;;SWIG wrapper code ends here
    
    
    (cl:defconstant y 5)
    
    (cl:defconstant x (cl:ash 5 -1))
    
    (cffi:defcstruct bar
            (p :short)
            (q :short)
            (a :char)
            (b :char)
            (z :pointer)
            (n :pointer))
    
    (cffi:defcvar ("my_struct" my_struct)
     :pointer)
    
    (cffi:defcstruct foo
            (a :int)
            (b :pointer))
    
    (cffi:defcfun ("pointer_func" pointer_func) :int
      (ClosureFun :pointer)
      (p :int))
    
    (cffi:defcfun ("func123" func123) :int
      (p :pointer)
      (q :pointer)
      (r :pointer))
    
    (cffi:defcfun ("lispsort_double" lispsort_double) :void
      (n :int)
      (array :pointer))
    
    (cffi:defcenum color
            :RED
            :BLUE
            :GREEN)
    

    The SWIG wrapper code refers to the special code which SWIG may need to use while wrapping C code. You can turn on/off the generation of this code by using the -[no]swig-lisp option. You must have noticed that SWIG goes one extra step to ensure that CFFI does not do automatic lispification of the C function names. The reason SWIG does this is because quite often developers want to build a nice CLOS based lispy API, and this one to one correspondence between C function names and lisp function name helps.

    Maybe you want to have your own convention for generating lisp function names for corresponding C function names, or you just want to lispify the names, also, before we forget you want to export the generated lisp names. To do this, we will use the SWIG feature directive. Let's edit the interface file such that the C type "div_t*" is changed to Lisp type ":my-pointer", we lispify all names, export everything, and do some more stuff.

    %module test
    
    %typemap(cin) div_t* ":my-pointer";
    
    %feature("intern_function", "1");
    %feature("export");
    
    %feature("inline") lispsort_double;
    %feature("intern_function", "my-lispify") lispsort_double;
    %feature("export", package="'some-other-package") lispsort_double;
    
    %rename func123 renamed_cool_func;
    
    %ignore "pointer_func";
    
    %include "test.h"
    
    

    The typemap(cin) ensures that for all arguments which are input to C with the type "div_t*", the ":my-pointer" type be used. Similarly typemap(cout) are used for all types which are returned from C.

    The feature intern_function ensures that all C names are interned using the swig-lispify function. The "1" given to the feature is optional. The use of feature like %feature("intern_function", "1"); globally enables interning for everything. If you want to target a single function, or declaration then use the targeted version of feature, %feature("intern_function", "my-lispify") lispsort_double;, here we are using an additional feature which allows us to use our lispify function.

    The export feature allows us to export the symbols. If the package argument is given, then the symbol will be exported to the specified Lisp package. The inline feature declaims the declared function as inline. The rename directive allows us to change the name(it is useful when generating C wrapper code for handling overloaded functions). The ignore directive ignores a certain declaration.

    There are several other things which are possible, to see some example of usage of SWIG look at the Lispbuilder and wxCL projects. The generated code with 'noswig-lisp' option is:

    (cl:defconstant #.(swig-lispify "y" 'constant) 5)
    
    (cl:export '#.(swig-lispify "y" 'constant))
    
    (cl:defconstant #.(swig-lispify "x" 'constant) (cl:ash 5 -1))
    
    (cl:export '#.(swig-lispify "x" 'constant))
    
    (cffi:defcstruct #.(swig-lispify "bar" 'classname)
            (#.(swig-lispify "p" 'slotname) :short)
            (#.(swig-lispify "q" 'slotname) :short)
            (#.(swig-lispify "a" 'slotname) :char)
            (#.(swig-lispify "b" 'slotname) :char)
            (#.(swig-lispify "z" 'slotname) :pointer)
            (#.(swig-lispify "n" 'slotname) :pointer))
    
    (cl:export '#.(swig-lispify "bar" 'classname))
    
    (cl:export '#.(swig-lispify "p" 'slotname))
    
    (cl:export '#.(swig-lispify "q" 'slotname))
    
    (cl:export '#.(swig-lispify "a" 'slotname))
    
    (cl:export '#.(swig-lispify "b" 'slotname))
    
    (cl:export '#.(swig-lispify "z" 'slotname))
    
    (cl:export '#.(swig-lispify "n" 'slotname))
    
    (cffi:defcvar ("my_struct" #.(swig-lispify "my_struct" 'variable))
     :pointer)
    
    (cl:export '#.(swig-lispify "my_struct" 'variable))
    
    (cffi:defcstruct #.(swig-lispify "foo" 'classname)
            (#.(swig-lispify "a" 'slotname) :int)
            (#.(swig-lispify "b" 'slotname) :pointer))
    
    (cl:export '#.(swig-lispify "foo" 'classname))
    
    (cl:export '#.(swig-lispify "a" 'slotname))
    
    (cl:export '#.(swig-lispify "b" 'slotname))
    
    (cffi:defcfun ("renamed_cool_func" #.(swig-lispify "renamed_cool_func" 'function)) :int
      (p :my-pointer)
      (q :pointer)
      (r :pointer))
    
    (cl:export '#.(swig-lispify "renamed_cool_func" 'function))
    
    (cl:declaim (cl:inline #.(my-lispify "lispsort_double" 'function)))
    
    (cffi:defcfun ("lispsort_double" #.(my-lispify "lispsort_double" 'function)) :void
      (n :int)
      (array :pointer))
    
    (cl:export '#.(my-lispify "lispsort_double" 'function) 'some-other-package)
    
    (cffi:defcenum #.(swig-lispify "color" 'enumname)
            #.(swig-lispify "RED" 'enumvalue :keyword)
            #.(swig-lispify "BLUE" 'enumvalue :keyword)
            #.(swig-lispify "GREEN" 'enumvalue :keyword))
    
    (cl:export '#.(swig-lispify "color" 'enumname))
    
    

    29.2.3 Generating CFFI bindings for C++ code

    This feature to SWIG (for CFFI) is very new and still far from complete. Pitch in with your patches, bug reports and feature requests to improve it.

    Generating bindings for C++ code, requires -c++ option to be present and it first generates C binding which will wrap the C++ code, and then generates the corresponding CFFI wrapper code. In the generated C wrapper code, you will often want to put your own C code, such as the code to include various files. This can be done by making use of "%{" and "%}" as shown below.

    %{
     #include "Test/test.h"
    %}
    

    Also, while parsing the C++ file and generating C wrapper code SWIG may need to be able to understand various symbols used in other header files. To help SWIG in doing this while ensuring that wrapper code is generated for the target file, use the "import" directive. The "include" directive specifies the target file for which wrapper code will be generated.

    
    %import "ancillary/header.h"
    
    %include "target/header.h"
    
    

    Various features which were available for C headers can also be used here. The target header which we are going to use here is:

    namespace OpenDemo {
      class Test
      {
        public:
          float x;
          // constructors
          Test (void) {x = 0;}
          Test (float X) {x = X;}
    
          // vector addition
          Test operator+ (const Test& v) const {return Test (x+v.x);}
    
          // length squared
          float lengthSquared (void) const {return this->dot (*this);}
    
          static float distance (const Test& a, const Test& b){return(a-b).length();}
    
          inline Test parallelComponent (const Test& unitBasis) const {
            return unitBasis * projection;
          }
    
          Test setYtoZero (void) const {return Test (this->x);}
    
          static const Test zero;
      };
    
      inline Test operator* (float s, const Test& v) {return v*s;}
    
      inline std::ostream& operator<< (std::ostream& o, const Test& v)
      {
        return o << "(" << v.x << ")";
      }
    
      inline Test RandomUnitVectorOnXZPlane (void)
      {
        return RandomVectorInUnitRadiusSphere().setYtoZero().normalize();
      }
    }
    

    The interface used is:

    %module test
    %include "test.cpp"
    

    SWIG generates 3 files, the first one is a C wrap which we don't show, the second is the plain CFFI wrapper which is as shown below:

    (cffi:defcfun ("_wrap_Test_x_set" Test_x_set) :void
      (self :pointer)
      (x :float))
    
    (cffi:defcfun ("_wrap_Test_x_get" Test_x_get) :float
      (self :pointer))
    
    (cffi:defcfun ("_wrap_new_Test__SWIG_0" new_Test) :pointer)
    
    (cffi:defcfun ("_wrap_new_Test__SWIG_1" new_Test) :pointer
      (X :float))
    
    (cffi:defcfun ("_wrap_Test___add__" Test___add__) :pointer
      (self :pointer)
      (v :pointer))
    
    (cffi:defcfun ("_wrap_Test_lengthSquared" Test_lengthSquared) :float
      (self :pointer))
    
    (cffi:defcfun ("_wrap_Test_distance" Test_distance) :float
      (a :pointer)
      (b :pointer))
    
    (cffi:defcfun ("_wrap_Test_parallelComponent" Test_parallelComponent) :pointer
      (self :pointer)
      (unitBasis :pointer))
    
    (cffi:defcfun ("_wrap_Test_setYtoZero" Test_setYtoZero) :pointer
      (self :pointer))
    
    (cffi:defcvar ("Test_zero" Test_zero)
     :pointer)
    
    (cffi:defcfun ("_wrap_delete_Test" delete_Test) :void
      (self :pointer))
    
    (cffi:defcfun ("_wrap___mul__" __mul__) :pointer
      (s :float)
      (v :pointer))
    
    (cffi:defcfun ("_wrap___lshift__" __lshift__) :pointer
      (o :pointer)
      (v :pointer))
    
    (cffi:defcfun ("_wrap_RandomUnitVectorOnXZPlane" RandomUnitVectorOnXZPlane) :pointer)
    

    The output is pretty good but it fails in disambiguating overloaded functions such as the constructor, in this case. One way of resolving this problem is to make the interface use the rename directiv, but hopefully there are better solutions. In addition SWIG also generates, a CLOS file

    (clos:defclass test()
      ((ff :reader ff-pointer)))
    
    (clos:defmethod (cl:setf x) (arg0 (obj test))
      (Test_x_set (ff-pointer obj) arg0))
    
    (clos:defmethod x ((obj test))
      (Test_x_get (ff-pointer obj)))
    
    (cl:shadow "+")
    (clos:defmethod + ((obj test) (self test) (v test))
      (Test___add__ (ff-pointer obj) (ff-pointer self) (ff-pointer v)))
    
    (clos:defmethod length-squared ((obj test) (self test))
      (Test_lengthSquared (ff-pointer obj) (ff-pointer self)))
    
    (clos:defmethod parallel-component ((obj test) (self test) (unitBasis test))
      (Test_parallelComponent (ff-pointer obj) (ff-pointer self) (ff-pointer unitBasis)))
    
    (clos:defmethod set-yto-zero ((obj test) (self test))
      (Test_setYtoZero (ff-pointer obj) (ff-pointer self)))
    

    I agree that the CFFI C++ module needs lot more work. But I hope it provides a starting point, on which you can base your work of importing C++ libraries to Lisp.

    If you have any questions, suggestions, patches, etc., related to CFFI module feel free to contact us on the SWIG mailing list, and also please add a "[CFFI]" tag in the subject line.

    29.2.4 Inserting user code into generated files

    It is often necessary to include user-defined code into the automatically generated interface files. For example, when building a C++ interface, example_wrap.cxx will likely not compile unless you add a #include "header.h" directive. This can be done using the SWIG %insert(section) %{ ...code... %} directive:

    %module example
    
    %{
    #include "header.h"
    %}
    
    %include "header.h"
    
    int fact(int n);
    

    Additional sections have been added for inserting into the generated lisp interface file:

    • lisphead - inserts before type declarations
    • swiglisp - inserts after type declarations according to where it appears in the .i file

    Note that the block %{ ... %} is effectively a shortcut for %insert("header") %{ ... %}.

    swig-4.0.1/Doc/Manual/Octave.html0000644000175000017500000007204213527234052016404 0ustar williamwilliam SWIG and Octave

    29 SWIG and Octave

    Octave is a high-level language intended for numerical programming that is mostly compatible with MATLAB. More information can be found at Octave web site.

    This chapter is intended to give an introduction to using the module. You should also read the SWIG documentation that is not specific to Octave. Also, there are a dozen or so examples in the Examples/octave directory, and hundreds in the test suite (Examples/test-suite and Examples/test-suite/octave).

    29.1 Preliminaries

    SWIG is regularly tested against the following versions of Octave: 3.8, 4.0, 4.2.

    Every effort is made to maintain backward compatibility with older versions of Octave. This cannot be guaranteed however, as in recent times new Octave releases have required nontrivial updates to SWIG, which may break backward compatibility for older Octave versions against which SWIG is not regularly tested.

    The SWIG runtime exports the function swig_octave_prereq() for checking the version of Octave.

    29.2 Running SWIG

    Let's start with a very simple SWIG interface file, example.i:

    %module swigexample
    %{
    #include "example.h"
    %}
    int gcd(int x, int y);
    extern double Foo; 

    To build an Octave module when wrapping C code, run SWIG using the -octave option:

    $ swig -octave -o example_wrap.cpp example.i 

    The -c++ option is also required when wrapping C++ code:

    $ swig -octave -c++ -o example_wrap.cpp example.i 

    This creates a C++ source file "example_wrap.cpp". A C++ file is generated even when wrapping C code as Octave is itself written in C++ and requires wrapper code to be in the same language. The generated C++ source file contains the low-level wrappers that need to be compiled and linked with the rest of your C/C++ application (in this case, the gcd implementation) to create an extension module.

    29.2.1 Command-line options

    The swig command line has a number of options you can use, like to redirect its output. Use swig -help to learn about these. Options specific to the Octave module are:

    $ swig -octave -help
    ...
    Octave Options (available with -octave)
         -globals name - Set name used to access C global variables [default: 'cvar']
                         Use '.' to load C global variables into module namespace
         -opprefix str - Prefix str for global operator functions [default: 'op_']
    

    The -globals option sets the name of the variable which is the namespace for C global variables exported by the module. The special name "." loads C global variables into the module namespace, i.e. alongside C functions and structs exported by the module. The -opprefix options sets the prefix of the names of global/friend operator functions.

    29.2.2 Compiling a dynamic module

    Octave modules are DLLs/shared objects having the ".oct" suffix. Building an oct file is usually done with the mkoctfile command (either within Octave itself, or from the shell). For example,

    $ swig -octave -c++ -o example_wrap.cpp example.i
    $ mkoctfile example_wrap.cpp example.c
    

    where "example.c" is the file containing the gcd() implementation.

    mkoctfile can also be used to extract the build parameters required to invoke the compiler and linker yourself. See the Octave manual and mkoctfile man page.

    mkoctfile will produce "swigexample.oct", which contains the compiled extension module. Loading it into Octave is then a matter of invoking

    octave:1> swigexample

    29.2.3 Using your module

    Assuming all goes well, you will be able to do this:

    $ octave -q
    octave:1> swigexample
    octave:2> swigexample.gcd(4, 6)
    ans =  2
    octave:3> swigexample.cvar.Foo
    ans =  3
    octave:4> swigexample.cvar.Foo=4;
    octave:5> swigexample.cvar.Foo
    ans =  4 

    29.3 A tour of basic C/C++ wrapping

    29.3.1 Modules

    The SWIG module directive specifies the name of the Octave module. If you specify "module swigexample", then in Octave everything in the module will be accessible under "swigexample", as in the above example. When choosing a module name, make sure you don't use the same name as a built-in Octave command or standard module name.

    When Octave is asked to invoke swigexample, it will try to find the ".m" or ".oct" file that defines the function "swigexample". You therefore need to make sure that "swigexample.oct" is in Octave's search path, which can be specified with the environment variable "OCTAVE_PATH".

    To load an Octave module, simply type its name:

    octave:1> swigexample;
    octave:2> gcd(4, 6)
    ans =  2
    octave:3> cvar.Foo
    ans =  3
    octave:4> cvar.Foo=4;
    octave:5> cvar.Foo
    ans =  4
    

    Modules can also be loaded from within functions, even before being loaded in the base context. If the module is also used in the base context, however, it must first be loaded again:

    octave:1> function l = my_lcm(a, b)
    > swigexample
    > l = abs(a*b)/swigexample.gcd(a, b);
    > endfunction
    octave:2> my_lcm(4, 6)
    ans =  12
    octave:3> swigexample.gcd(4, 6)
    error: can't perform indexing operations for <unknown type> type
    octave:3> swigexample;
    octave:4> swigexample.gcd(4, 6)
    ans =  2
    

    29.3.2 Functions

    Global functions are wrapped as new Octave built-in functions. For example,

    %module swigexample
    int fact(int n); 

    creates a built-in function swigexample.fact(n) that works exactly like you think it does:

    octave:1> swigexample.fact(4)
    24 

    29.3.3 Global variables

    Global variables are a little special in Octave. Given a global variable:

    %module swigexample
    extern double Foo;
    

    To expose variables, SWIG actually generates two functions, to get and set the value. In this case, Foo_set and Foo_set would be generated. SWIG then automatically calls these functions when you get and set the variable-- in the former case creating a local copy in the interpreter of the C variables, and in the latter case copying an interpreter variables onto the C variable.

    octave:1> swigexample;
    octave:2> c=swigexample.cvar.Foo
    c =  3
    octave:3> swigexample.cvar.Foo=4;
    octave:4> c
    c =  3
    octave:5> swigexample.cvar.Foo
    ans =  4

    If a variable is marked with the %immutable directive then any attempts to set this variable will cause an Octave error. Given a global variable:

    %module swigexample
    %immutable;
    extern double Foo;
    %mutable;
    

    SWIG will allow the reading of Foo but when a set attempt is made, an error function will be called.

    octave:1> swigexample
    octave:2> swigexample.Foo=4
    error: attempt to set immutable member variable
    error: assignment failed, or no method for `swig_type = scalar'
    error: evaluating assignment expression near line 2, column 12 

    It is possible to add new functions or variables to the module. This also allows the user to rename/remove existing functions and constants (but not linked variables, mutable or immutable). Therefore users are recommended to be careful when doing so.

    octave:1> swigexample;
    octave:2> swigexample.PI=3.142;
    octave:3> swigexample.PI
    ans =  3.1420 

    29.3.4 Constants and enums

    Because Octave doesn't really have the concept of constants, C/C++ constants are not really constant in Octave. They are actually just a copy of the value into the Octave interpreter. Therefore they can be changed just as any other value. For example given some constants:

    %module swigexample
    %constant int ICONST=42;
    #define    SCONST      "Hello World"
    enum Days{SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY};
    

    This is 'effectively' converted into the following Octave code:

    swigexample.ICONST=42
    swigexample.SCONST="Hello World"
    swigexample.SUNDAY=0
    .... 

    29.3.5 Pointers

    C/C++ pointers are fully supported by SWIG. Furthermore, SWIG has no problem working with incomplete type information. Given a wrapping of the <file.h> interface: C/C++ pointers are fully supported by SWIG. Furthermore, SWIG has no problem working with incomplete type information. Given a wrapping of the <file.h> interface:

    %module swigexample
    FILE *fopen(const char *filename, const char *mode);
    int fputs(const char *, FILE *);
    int fclose(FILE *);
    

    When wrapped, you will be able to use the functions in a natural way from Octave. For example:

    octave:1> swigexample;
    octave:2> f=swigexample.fopen("w", "junk");
    octave:3> swigexample.fputs("Hello world", f);
    octave:4> swigexample.fclose(f);
    

    Simply printing the value of a wrapped C++ type will print its typename. E.g.,

    octave:1> swigexample;
    octave:2> f=swigexample.fopen("junk", "w");
    octave:3> f
    f =
    
    {
      _p_FILE, ptr = 0x9b0cd00
    } 

    As the user of the pointer, you are responsible for freeing it, or closing any resources associated with it (just as you would in a C program). This does not apply so strictly to classes and structs (see below).

    octave:1> swigexample;
    octave:2> f=swigexample.fopen("not there", "r");
    error: value on right hand side of assignment is undefined
    error: evaluating assignment expression near line 2, column 2 

    29.3.6 Structures and C++ classes

    SWIG wraps C structures and C++ classes by using a special Octave type called a swig_ref. A swig_ref contains a reference to one or more instances of C/C++ objects, or just the type information for an object. For each wrapped structure and class, a swig_ref will be exposed that has the name of the type. When invoked as a function, it creates a new object of its type and returns a swig_ref that points to that instance. This provides a very natural interface. For example,

    struct Point{
      int x, y;
    };
    

    is used as follows:

    octave:1> swigexample;
    octave:2> p=swigexample.Point();
    octave:3> p.x=3;
    octave:4> p.y=5;
    octave:5> p.x, p.y
    ans =  3
    ans =  5 
    

    In C++, invoking the type object in this way calls the object's constructor. swig_ref objects can also be acquired by having a wrapped function return a pointer, reference, or value of a non-primitive type.

    The swig_ref type handles indexing operations such that usage maps closely to what you would have in C/C++. Structure members are accessed as in the above example, by calling set and get methods for C++ variables. Methods also work as expected. For example, code wrapped in the following way

    class Point{
    public:
      int x, y;
      Point(int _x, int _y) : x(_x), y(_y) {}
      double distance(const Point& rhs) {
        return sqrt(pow(x-rhs.x, 2)+pow(y-rhs.y, 2));
      }
      void set(int _x, int _y) {
        x=_x; y=_y;
      }
    };
    

    can be used from Octave like this

    octave:1> swigexample;
    octave:2> p1=swigexample.Point(3, 5);
    octave:3> p2=swigexample.Point(1, 2);
    octave:4> p1.distance(p2)
    ans =  3.6056
    

    By using the swig_this() and swig_type() functions, one can discover the pointers to and types of the underlying C/C++ object.

    octave:5> swig_this(p1)
    ans = 162504808
    octave:6> swig_type(p1)
    ans = Point
    

    Note that swig_ref is a reference-counted pointer to a C/C++ object/type, and as such has pass-by-reference semantics. For example if one has a allocated a single object but has two swig_ref's pointing to it, modifying the object through either of them will change the single allocated object. This differs from the usual pass-by-value (copy-on-write) semantics that Octave maintains for built-in types. For example, in the following snippet, modifying b does not modify a,

    octave:7> a=struct('x', 4)
    a =
    {
      x =  4
    }
    
    octave:8> b=a
    b =
    {
      x =  4
    }
    
    octave:9> b.y=4
    b =
    {
      x =  4
      y =  4
    }
    
    octave:10> a
    a =
    {
      x =  4
    }
    

    However, when dealing with wrapped objects, one gets the behavior

    octave:2> a=Point(3, 5)
    a =
    
    {
      Point, ptr = 0x9afbbb0
    }
    
    octave:3> b=a
    b =
    
    {
      Point, ptr = 0x9afbbb0
    }
    
    octave:4> b.set(2, 1);
    octave:5> b.x, b.y
    ans =  2
    ans =  1
    octave:6> a.x, a.y
    ans =  2
    ans =  1
    

    Depending on the ownership setting of a swig_ref, it may call C++ destructors when its reference count goes to zero. See the section on memory management below for details.

    29.3.7 C++ inheritance

    Single and multiple inheritance are fully supported. The swig_ref type carries type information along with any C++ object pointer it holds. This information contains the full class hierarchy. When an indexing operation (such as a method invocation) occurs, the tree is walked to find a match in the current class as well as any of its bases. The lookup is then cached in the swig_ref.

    29.3.8 C++ overloaded functions

    Overloaded functions are supported, and handled as in other modules. That is, each overload is wrapped separately (under internal names), and a dispatch function is also emitted under the external/visible name. The dispatch function selects which overload to call (if any) based on the passed arguments. typecheck typemaps are used to analyze each argument, as well as assign precedence. See the chapter on typemaps for details.

    29.3.9 C++ operators

    C++ operator overloading is supported, in a way similar to other modules. The swig_ref type supports all unary and binary operators between itself and all other types that exist in the system at module load time. When an operator is used (where one of the operands is a swig_ref), the runtime routes the call to either a member function of the given object, or to a global function whose named is derived from the types of the operands (either both or just the lhs or rhs).

    For example, if a and b are SWIG variables in Octave, a+b becomes a.__add__(b). The wrapper is then free to implement __add__ to do whatever it wants. A wrapper may define the __add__ function manually, %rename some other function to it, or %rename a C++ operator to it.

    By default the C++ operators are renamed to their corresponding Octave operators. So without doing any work, the following interface

    %inline {
    struct A {
      int value;
      A(int _value) : value(_value) {}
      A operator+ (const A& x) {
        return A(value+x.value);
      }
    };
    }
    

    is usable from Octave like this:

    a=A(2), b=A(3), c=a+b
    assert(c.value==5);
    

    Octave operators are mapped in the following way:

    __brace__      a{args}
    __brace_asgn__ a{args} = rhs
    __paren__      a(args)
    __paren_asgn__ a(args) = rhs
    __str__        generates string rep
    __not__        !a
    __uplus__      +a
    __uminus__     -a
    __transpose__  a.'
    __hermitian__  a'
    __incr__       a++
    __decr__       a--
    __add__        a + b
    __sub__        a - b
    __mul__        a * b
    __div__        a / b
    __pow__        a ^ b
    __ldiv__       a \ b
    __lshift__     a << b
    __rshift__     a >> b
    __lt__         a < b
    __le__         a <= b
    __eq__         a == b
    __ge__         a >= b
    __gt__         a > b
    __ne__         a != b
    __el_mul__     a .* b
    __el_div__     a ./ b
    __el_pow__     a .^ b
    __el_ldiv__    a .\ b
    __el_and__     a & b
    __el_or__      a | b
    

    On the C++ side, the default mappings are as follows:

    %rename(__add__)       *::operator+;
    %rename(__add__)       *::operator+();
    %rename(__add__)       *::operator+() const;
    %rename(__sub__)       *::operator-;
    %rename(__uminus__)    *::operator-();
    %rename(__uminus__)    *::operator-() const;
    %rename(__mul__)       *::operator*;
    %rename(__div__)       *::operator/;
    %rename(__mod__)       *::operator%;
    %rename(__lshift__)    *::operator<<;
    %rename(__rshift__)    *::operator>>;
    %rename(__el_and__)    *::operator&&;
    %rename(__el_or__)     *::operator||;
    %rename(__xor__)       *::operator^;
    %rename(__invert__)    *::operator~;
    %rename(__lt__)        *::operator<;
    %rename(__le__)        *::operator<=;
    %rename(__gt__)        *::operator>;
    %rename(__ge__)        *::operator>=;
    %rename(__eq__)        *::operator==;
    %rename(__ne__)        *::operator!=;
    %rename(__not__)       *::operator!;
    %rename(__incr__)      *::operator++;
    %rename(__decr__)      *::operator--;
    %rename(__paren__)     *::operator();
    %rename(__brace__)     *::operator[];
    

    Octave can also utilise friend (i.e. non-member) operators with a simple %rename: see the example in the Examples/octave/operator directory.

    29.3.10 Class extension with %extend

    The %extend directive works the same as in other modules.

    You can use it to define special behavior, like for example defining Octave operators not mapped to C++ operators, or defining certain Octave mechanisms such as how an object prints. For example, the octave_value::{is_string, string_value, print} functions are routed to a special method __str__ that can be defined inside an %extend.

    %extend A {
    string __str__() {
      stringstream sout;
      sout<<$self->value;
      return sout.str();
    }
    }
    

    Then in Octave one gets,

    octave:1> a=A(4);
    octave:2> a
    a = 4
    octave:3> printf("%s\n", a);
    4
    octave:4> a.__str__()
    4
    

    Similarly, Octave can use the __float__ method to convert an object to a numeric value.

    Octave 3.8.0 and later versions will also map unary functions X() to the corresponding __X__ method, where X includes: abs(), acos(), acosh(), angle(), arg(), asin(), asinh(), atan(), atanh(), cbrt(), ceil(), conj(), cos(), cosh(), dawson(), erf(), erfc(), erfcinv(), erfcx(), erfi(), erfinv(), exp(), expm1(), finite(), fix(), floor(), gamma(), imag(), isalnum(), isalpha(), isascii(), iscntrl(), isdigit(), isgraph(), isinf(), islower(), isna(), isnan(), isprint(), ispunct(), isspace(), isupper(), isxdigit(), lgamma(), log(), log10(), log1p(), log2(), real(), round(), roundb(), signbit(), signum(), sin(), sinh(), sqrt(), tan(), tanh(), toascii(), tolower(), toupper()

    29.3.11 C++ templates

    C++ class and function templates are fully supported as in other modules, in that the %template directive may used to create explicit instantiations of templated types. For example, function templates can be instantiated as follows:

    %module swigexample
    %inline {
      template<class __scalar>
        __scalar mul(__scalar a, __scalar b) {
        return a*b;
      }
    }
    %include <std_complex.i>
    %template(mul) mul<std::complex<double> >
    %template(mul) mul<double>
    

    and then used from Octave

    octave:1> mul(4, 3)
    ans =  12
    octave:2> mul(4.2, 3.6)
    ans =  15.120
    octave:3> mul(3+4i, 10+2i)
    ans =  22 + 46i
    

    Similarly, class templates can be instantiated as in the following example,

    %module swigexample
    %include <std_complex.i>
    %include <std_string.i>
    %inline {
      #include <sstream>
      template<class __scalar> class sum {
        __scalar s;
      public:
        sum(__scalar _s=0) : s(_s) {}
        sum& add(__scalar _s) {
          s+=_s;
          return *this;
        }
        std::string __str__() const {
          std::stringstream sout;
          sout<<s;
          return sout.str();
        }
      };
    }
    %template(sum_complex) sum<std::complex<double> >;
    %template(sum_double) sum<double>;
    

    and then used from Octave

    octave:2> a=sum_complex(2+3i);
    octave:3> a.add(2)
    ans =
    
    (4, 3)
    octave:4> a.add(3+i)
    ans =
    
    (7, 4)
    

    29.3.12 C++ Smart Pointers

    29.3.12.1 The shared_ptr Smart Pointer

    The C++11 standard provides std::shared_ptr which was derived from the Boost implementation, boost::shared_ptr. Both of these are available for Octave in the SWIG library and usage is outlined in the shared_ptr smart pointer library section.

    29.3.12.2 Generic Smart Pointers

    C++ smart pointers are fully supported as in other modules.

    29.3.13 Directors (calling Octave from C++ code)

    There is full support for SWIG Directors, which permits Octave code to subclass C++ classes, and implement their virtual methods.

    Octave has no direct support for object oriented programming, however the swig_ref type provides some of this support. You can manufacture a swig_ref using the subclass function (provided by the SWIG/Octave runtime).

    For example,

    octave:1> a=subclass();
    octave:2> a.my_var = 4;
    octave:3> a.my_method = @(self) printf("my_var = ", self.my_var);
    octave:4> a.my_method();
    my_var = 4
    

    subclass() can also be used to subclass one or more C++ types. Suppose you have an interface defined by

    %inline {
    class A {
    public:
      virtual my_method() {
        printf("c-side routine called\n");
      }
    };
    void call_your_method(A& a) {
      a.my_method();
    }
    }
    

    Then from Octave you can say:

    octave:1> B=@() subclass(A(), @my_method);
    octave:2> function my_method(self)
    octave:3>   printf("octave-side routine called\n");
    octave:4> end
    octave:5> call_your_method(B());
    octave-side routine called
    

    or more concisely,

    octave:1> B=@() subclass(A(), 'my_method', @(self) printf("octave-side routine called\n"));
    octave:2> call_your_method(B());
    octave-side routine called
    

    Note that you have to enable directors via the %feature directive (see other modules for this).

    subclass() will accept any number of C++ bases or other subclass()'ed objects, (string, octave_value) pairs, and function_handles. In the first case, these are taken as base classes; in the second case, as named members (either variables or functions, depending on whether the given value is a function handle); in the third case, as member functions whose name is taken from the given function handle. E.g.,

    octave:1> B=@(some_var=2) subclass(A(), 'some_var', some_var, @some_func, 'another_func',
    @(self) do_stuff())
    

    You can also assign non-C++ member variables and functions after construct time. There is no support for non-C++ static members.

    There is limited support for explicitly referencing C++ bases. So, in the example above, we could have

    octave:1> B=@() subclass(A(), @my_method);
    octave:2> function my_method(self)
    octave:3>   self.A.my_method();
    octave:4>   printf("octave-side routine called\n");
    octave:5> end
    octave:6> call_your_method(B());
    c-side routine called
    octave-side routine called
    

    29.3.14 Threads

    The use of threads in wrapped Director code is not supported; i.e., an Octave-side implementation of a C++ class must be called from the Octave interpreter's thread. Anything fancier (apartment/queue model, whatever) is left to the user. Without anything fancier, this amounts to the limitation that Octave must drive the module... like, for example, an optimization package that calls Octave to evaluate an objective function.

    29.3.15 Memory management

    As noted above, swig_ref represents a reference counted pointer to a C/C++-side object. It also contains a flag indicating whether Octave or the C/C++ code owns the object. If Octave owns it, any destructors will be called when the reference count reaches zero. If the C/C++ side owns the object, then destructors will not be called when the reference count goes to zero.

    For example,

    %inline {
    class A {
    public:
      A() { printf("A constructing\n"); }
      ~A() { printf("A destructing\n"); }
    };
    }
    

    Would produce this behavior in Octave:

    octave:1> a=A();
    A constructing
    octave:2> b=a;
    octave:3> clear a;
    octave:4> b=4;
    A destructing
    

    The %newobject directive may be used to control this behavior for pointers returned from functions.

    In the case where one wishes for the C++ side to own an object that was created in Octave (especially a Director object), one can use the __disown() method to invert this logic. Then letting the Octave reference count go to zero will not destroy the object, but destroying the object will invalidate the Octave-side object if it still exists (and call destructors of other C++ bases in the case of multiple inheritance/subclass()'ing).

    29.3.16 STL support

    Various STL library files are provided for wrapping STL containers.

    29.3.17 Matrix typemaps

    Octave provides a rich set of classes for dealing with matrices. Currently there are no built-in typemaps to deal with those. However, these are relatively straight forward for users to add themselves (see the docs on typemaps). Without much work (a single typemap decl-- say, 5 lines of code in the interface file), it would be possible to have a function

    double my_det(const double* mat, int m, int n);
    

    that is accessed from Octave as,

    octave:1> my_det(rand(4));
    ans = -0.18388
    

    swig-4.0.1/Doc/Manual/Php.html0000644000175000017500000010603213527234052015707 0ustar williamwilliam SWIG and PHP

    31 SWIG and PHP

    In this chapter, we discuss SWIG's support of PHP. SWIG currently supports generating wrappers for PHP7. Support for PHP5 was removed in SWIG 4.0.0 and support for PHP4 was removed in SWIG 1.3.37.

    Currently any PHP7 release should work.

    In order to use this module, you will need to have a copy of the PHP include files to compile the SWIG generated files. If you installed PHP from a binary package, you may need to install a "php-dev" or "php-devel" package for these to be installed. You can find out where these files are by running php-config --includes. To use the built PHP module you will need either the php binary or the Apache php module. If you want to build your extension into php directly, you will need the complete PHP source tree available.

    31.1 Generating PHP Extensions

    To build a PHP extension, run swig using the -php7 option as follows (-php is also supported and currently is an alias for -php7 but prior to SWIG 4.0.0 it was an alias for -php5):

    swig -php7 example.i
    

    This will produce 3 files example_wrap.c, php_example.h and example.php. The first file, example_wrap.c contains all of the C code needed to build a PHP extension. The second file, php_example.h contains the header information needed if you wish to statically link the extension into the php interpreter. The third file, example.php can be included by PHP scripts. It attempts to dynamically load the extension and contains extra php code specified in the interface file. If wrapping C++ code with PHP classes, it will also contain PHP class wrappers.

    SWIG can generate PHP extensions from C++ libraries as well when given the -c++ option. The support for C++ is discussed in more detail in section 27.2.6. The generated C++ wrapper will be called example_wrap.cxx. You can specify a different extension for the C++ wrapper using -cppext - e.g. if you want example_wrap.cc use -cppext cc.

    The usual (and recommended) way is to build the extension as a separate dynamically loaded module (which is supported by all modern operating systems).

    It is also possible to rebuild PHP from source so that your module is statically linked into the php executable/library. This is a lot more work, and also requires a full rebuild of PHP to update your module, and it doesn't play nicely with package system. We don't recommend this approach, or provide explicit support for it.

    31.1.1 Building a loadable extension

    To build your module as a dynamically loadable extension, use compilation commands like these (if you aren't using GCC, the commands will be different, and there may be some variation between platforms - these commands should at least work for Linux though):

            gcc `php-config --includes` -fpic -c example_wrap.c example.c
            gcc -shared example_wrap.o example.o -o example.so
    

    31.1.2 Using PHP Extensions

    To test the extension from a PHP script, you first need to tell PHP to load it. To do this, add a line like this to the [PHP] section of php.ini:

            extension=/path/to/modulename.so
    

    If the module is in PHP's default extension directory, you can omit the path.

    For some SAPIs (for example, the CLI SAPI) you can instead use the dl() function to load an extension at run time, by adding a line like this to the start of each PHP script which uses your extension:

            dl("/path/to/modulename.so"); // Load the module
    

    But note that dl() isn't supported when running PHP through a webserver - you'll need to use extension in php.ini as described above.

    The PHP module which SWIG generates will also attempt to do the dl() call for you if the extension isn't already loaded:

            include("example.php");
    

    This PHP module also defines the PHP classes for the wrapped API, so you'll almost certainly want to include it anyway.

    31.2 Basic PHP interface

    It is important to understand that PHP uses a single global namespace into which all symbols from extension modules are loaded. It is quite possible for names of symbols in one extension module to clash with other symbols unless care is taken to %rename them. At present SWIG doesn't have support for generating wrappers which make use of PHP's namespace feature.

    31.2.1 Constants

    These work in much the same way as in C/C++. Constants can be defined by using either the normal C pre-processor declarations, or the %constant SWIG directive. These will then be available from your PHP script as a PHP constant, (i.e. no dollar sign is needed to access them.) For example, with a swig interface file like this,

    %module example
    
    #define PI 3.14159
    
    %constant int E  = 2.71828
    

    you can access the constants in your PHP script like this,

    include("example.php");
    
    echo "PI = " . PI . "\n";
    
    echo "E = " . E . "\n";
    
    

    There's one peculiarity of how constants work in PHP which it is useful to note (this is not specific to SWIG though) - if you try to use an undeclared constant, PHP will emit a warning (or a notice in PHP 7.1 and earlier) and then expand the constant to a string version of the constant's name. Unfortunately it is easy to miss the warning message if you're using PHP in a webserver as it will probably end up in error.log or similar. Apparently this will throw an Error in a future version of PHP, but until then it's something to be aware of.

    For example,

    %module example
    
    #define EASY_TO_MISPELL 0
    

    accessed incorrectly in PHP,

    include("example.php");
    
    if(EASY_TO_MISPEL) {
      ...
    } else {
      ...
    }
    
    

    The mis-spelled constant will become the string 'EASY_TO_MISPEL', which is treated as true by the if test, when the value of the intended constant would be treated as false!

    31.2.2 Global Variables

    Because PHP does not provide a mechanism to intercept access and assignment of global variables, global variables are supported through the use of automatically generated accessor functions.

    %module example;
    
    %inline %{
      double seki = 2;
      void print_seki() {
        zend_printf("seki is now %f\n", seki);
      }
    %}
    

    is accessed as follows:

    include("example.php");
    print seki_get();
    seki_set( seki_get() * 2); # The C variable is now 4.
    print seki_get();
    

    SWIG supports global variables of all C datatypes including pointers and complex objects. Additional types can be supported by using the varinit typemap.

    SWIG honors the %immutable modifier by not generating code for the _set method. This provides read-only access to the variable from the php script. Attempting to access the _set method will result in a php fatal error because the function is undefined.

    At this time SWIG does not support custom accessor methods.

    31.2.3 Functions

    C functions are converted into PHP functions. Default/optional arguments are also allowed. An interface file like this :

    %module example
    int foo(int a);
    double bar(double, double b = 3.0);
    ...
    

    Will be accessed in PHP like this :

    include("example.php");
    $a = foo(2);
    $b = bar(3.5, -1.5);
    $c = bar(3.5);  # Use default argument for 2nd parameter
    
    

    31.2.4 Overloading

    Although PHP does not support overloading functions natively, swig will generate dispatch functions which will use %typecheck typemaps to allow overloading. This dispatch function's operation and precedence is described in Overloaded functions and methods.

    31.2.5 Pointers and References

    Pointers to C/C++ objects are represented as PHP resources, rather like MySQL connection handles.

    There are multiple ways to wrap pointers to simple types. Given the following C method:

      void add( int *in1, int *in2, int *result);
    

    One can include cpointer.i to generate PHP wrappers to int *.

    %module example
    %include "cpointer.i"
    %pointer_functions(int, intp)
    
    void add( int *in1, int *in2, int *result);
    

    This will result in the following usage in PHP:

    <?php
    
    include("example.php");
    
    $in1=copy_intp(3);
    $in2=copy_intp(5);
    $result=new_intp();
    
    add( $in1, $in2, $result );
    
    echo "The sum " . intp_value($in1) . " + " . intp_value($in2) . " = " . intp_value( $result) . "\n";
    ?>
    

    An alternative would be to use the include typemaps.i which defines named typemaps for INPUT, OUTPUT and INOUT variables. One needs to either %apply the appropriate typemap or adjust the parameter names as appropriate.

    %module example
    %include "typemaps.i"
    
    void add( int *INPUT, int *INPUT, int *OUTPUT);
    
    

    This will result in the following usage in PHP:

    <?php
    
    include("example.php");
    
    $in1 = 3;
    $in2 = 5;
    $result= add($in1, $in2);  # Note using variables for the input is unnecessary.
    
    echo "The sum $in1 + $in2 = $result\n";
    ?>
    

    Because PHP has a native concept of reference, it may seem more natural to the PHP developer to use references to pass pointers. To enable this, one needs to include phppointers.i which defines the named typemap REF.

    In case you write your own typemaps, SWIG supports an attribute called byref: if you set that, then SWIG will make sure that the generated wrapper function will want the input parameter as a reference.

    %module example
    %include "phppointers.i"
    
    void add( int *REF, int *REF, int *REF);
    
    

    This will result in the following usage in PHP:

    <?php
    
    include("example.php");
    
    $in1 = 3;
    $in2 = 5;
    $result = 0;
    add($in1, $in2, $result);
    
    echo "The sum $in1 + $in2 = $result\n";
    ?>
    

    It is important to note that a php variable which is NULL when passed by reference would end up passing a NULL pointer into the function. In PHP, an unassigned variable (i.e. where the first reference to the variable is not an assignment) is NULL. In the above example, if any of the three variables had not been assigned, a NULL pointer would have been passed into add. Depending on the implementation of the function, this may or may not be a good thing.

    We chose to allow passing NULL pointers into functions because that is sometimes required in C libraries. A NULL pointer can be created in PHP in a number of ways: by using unset on an existing variable, or assigning NULL to a variable.

    31.2.6 Structures and C++ classes

    SWIG defaults to wrapping C++ structs and classes with PHP classes - this is done by generating a PHP wrapper script which defines proxy classes which calls a set of flat functions which actually wrap the C++ class. You can disable this wrapper layer by passing the command-line option "-noproxy" in which case you'll just get the flat functions.

    This interface file

    %module vector
    
    class Vector {
    public:
      double x, y, z;
      Vector();
      ~Vector();
      double magnitude();
    };
    
    struct Complex {
     double re, im;
    };
    

    Would be used in the following way from PHP:

    <?php
      require "vector.php";
    
      $v = new Vector();
      $v->x = 3;
      $v->y = 4;
      $v->z = 5;
    
      echo "Magnitude of ($v->x, $v->y, $v->z) = " . $v->magnitude() . "\n";
    
      $v = NULL;   # destructor called.
    
      $c = new Complex();
    
      $c->re = 0;
      $c->im = 0;
    
      # $c destructor called when $c goes out of scope.
    ?>
    

    Member variables and methods are accessed using the -> operator.

    31.2.6.1 Using -noproxy

    The -noproxy option flattens the object structure and generates collections of named functions (these are the functions which the PHP class wrappers call). The above example results in the following PHP functions:

    new_Vector();
    Vector_x_set($obj, $d);
    Vector_x_get($obj);
    Vector_y_set($obj, $d);
    Vector_y_get($obj);
    Vector_z_set($obj, $d);
    Vector_z_get($obj);
    Vector_magnitude($obj);
    new_Complex();
    Complex_re_set($obj, $d);
    Complex_re_get($obj);
    Complex_im_set($obj, $d);
    Complex_im_get($obj);
    

    31.2.6.2 Constructors and Destructors

    The constructor is called when new Object() (or new_Object() if using -noproxy) is used to create an instance of the object. If multiple constructors are defined for an object, function overloading will be used to determine which constructor to execute.

    Because PHP uses reference counting to manage resources, simple assignment of one variable to another such as:

    $ref = $v;
    

    causes the symbol $ref to refer to the same underlying object as $v. This does not result in a call to the C++ copy constructor or copy assignment operator.

    One can force execution of the copy constructor by using:

    $o_copy = new Object($o);
    

    Destructors are automatically called when all variables referencing the instance are reassigned or go out of scope. The destructor is not available to be called manually. To force a destructor to be called the programmer can either reassign the variable or call unset($v)

    31.2.6.3 Static Member Variables

    Static member variables in C++ are not wrapped as such in PHP as it does not appear to be possible to intercept accesses to such variables. Therefore, static member variables are wrapped using a class function with the same name, which returns the current value of the class variable. For example

    %module example
    
    class Ko {
      static int threats;
    };
    
    

    would be accessed in PHP as,

    include("example.php");
    
    echo "There have now been " . Ko::threats() . " threats\n";
    
    

    To set the static member variable, pass the value as the argument to the class function, e.g.

    
    Ko::threats(10);
    
    echo "There have now been " . Ko::threats() . " threats\n";
    
    

    31.2.6.4 Static Member Functions

    Static member functions are supported in PHP using the class::function() syntax. For example

    %module example
    class Ko {
      static void threats();
    };
    
    would be executed in PHP as,
    include("example.php");
    Ko::threats();
    

    31.2.6.5 Specifying Implemented Interfaces

    PHP supports the concept of abstract interfaces which a class can implement. Since SWIG 3.0.3, you can tell SWIG that a wrapped class (for example MyIterator) implements the Iterator interface like so:

    %typemap("phpinterfaces") MyIterator "Iterator";
    

    If there are multiple interfaces, just list them separated by commas.

    31.2.7 PHP Pragmas, Startup and Shutdown code

    To place PHP code in the generated "example.php" file one can use the code pragma. The code is inserted after loading the shared object.

    %module example
    %pragma(php) code="
    # This code is inserted into example.php
    echo \"example.php execution\\n\";
    "
    

    Results in the following in "example.php"

    # This code is inserted into example.php
    echo "example.php execution\n";
    

    The version pragma can be used to add version to generated PHP extension module. The version is inserted in the zend_module_entry block.

    %module example
    %pragma(php) version="1.5"
    

    The include pragma is a short cut to add include statements to the example.php file.

    %module example
    %pragma(php) code="
    include \"include.php\";
    "
    %pragma(php) include="include.php"   // equivalent.
    

    The phpinfo pragma inserts code in the PHP_MINFO_FUNCTION which is called from PHP's phpinfo() function.

    %module example;
    %pragma(php) phpinfo="
      zend_printf("An example of PHP support through SWIG\n");
      php_info_print_table_start();
      php_info_print_table_header(2, \"Directive\", \"Value\");
      php_info_print_table_row(2, \"Example support\", \"enabled\");
      php_info_print_table_end();
    "
    

    To insert code into the PHP_MINIT_FUNCTION, one can use either %init or %minit.

    %module example;
    %init {
      zend_printf("Inserted into PHP_MINIT_FUNCTION\n");
    }
    %minit {
      zend_printf("Inserted into PHP_MINIT_FUNCTION\n");
    }
    

    To insert code into the PHP_MSHUTDOWN_FUNCTION, one can use either %shutdown or %mshutdown.

    %module example;
    %mshutdown {
      zend_printf("Inserted into PHP_MSHUTDOWN_FUNCTION\n");
    }
    

    The %rinit and %rshutdown statements are very similar but insert code into the request init (PHP_RINIT_FUNCTION) and request shutdown (PHP_RSHUTDOWN_FUNCTION) code respectively.

    31.3 Cross language polymorphism

    Proxy classes provide a more natural, object-oriented way to access extension classes. As described above, each proxy instance has an associated C++ instance, and method calls to the proxy are passed to the C++ instance transparently via C wrapper functions.

    This arrangement is asymmetric in the sense that no corresponding mechanism exists to pass method calls down the inheritance chain from C++ to PHP. In particular, if a C++ class has been extended in PHP (by extending the proxy class), these extensions will not be visible from C++ code. Virtual method calls from C++ are thus not able access the lowest implementation in the inheritance chain.

    Changes have been made to SWIG 1.3.18 to address this problem and make the relationship between C++ classes and proxy classes more symmetric. To achieve this goal, new classes called directors are introduced at the bottom of the C++ inheritance chain. Support for generating PHP classes has been added in SWIG 1.3.40. The job of the directors is to route method calls correctly, either to C++ implementations higher in the inheritance chain or to PHP implementations lower in the inheritance chain. The upshot is that C++ classes can be extended in PHP and from C++ these extensions look exactly like native C++ classes. Neither C++ code nor PHP code needs to know where a particular method is implemented: the combination of proxy classes, director classes, and C wrapper functions takes care of all the cross-language method routing transparently.

    31.3.1 Enabling directors

    The director feature is disabled by default. To use directors you must make two changes to the interface file. First, add the "directors" option to the %module directive, like this:

    %module(directors="1") modulename
    

    Without this option no director code will be generated. Second, you must use the %feature("director") directive to tell SWIG which classes and methods should get directors. The %feature directive can be applied globally, to specific classes, and to specific methods, like this:

    // generate directors for all classes that have virtual methods
    %feature("director");         
    
    // generate directors for the virtual methods in class Foo
    %feature("director") Foo;      
    

    You can use the %feature("nodirector") directive to turn off directors for specific classes or methods. So for example,

    %feature("director") Foo;
    %feature("nodirector") Foo::bar;
    

    will generate directors for the virtual methods of class Foo except bar().

    Directors can also be generated implicitly through inheritance. In the following, class Bar will get a director class that handles the methods one() and two() (but not three()):

    %feature("director") Foo;
    class Foo {
    public:
      Foo(int foo);
      virtual void one();
      virtual void two();
    };
    
    class Bar: public Foo {
    public:
      virtual void three();
    };
    

    then at the PHP side you can define

    require("mymodule.php");
    
    class MyFoo extends Foo {
      function one() {
        print "one from php\n";
      }
    }
    

    31.3.2 Director classes

    For each class that has directors enabled, SWIG generates a new class that derives from both the class in question and a special Swig::Director class. These new classes, referred to as director classes, can be loosely thought of as the C++ equivalent of the PHP proxy classes. The director classes store a pointer to their underlying PHP object. Indeed, this is quite similar to the "_cPtr" and "thisown" members of the PHP proxy classes.

    For simplicity let's ignore the Swig::Director class and refer to the original C++ class as the director's base class. By default, a director class extends all virtual methods in the inheritance chain of its base class (see the preceding section for how to modify this behavior). Virtual methods that have a final specifier are unsurprisingly excluded. Thus the virtual method calls, whether they originate in C++ or in PHP via proxy classes, eventually end up in at the implementation in the director class. The job of the director methods is to route these method calls to the appropriate place in the inheritance chain. By "appropriate place" we mean the method that would have been called if the C++ base class and its extensions in PHP were seamlessly integrated. That seamless integration is exactly what the director classes provide, transparently skipping over all the messy extension API glue that binds the two languages together.

    In reality, the "appropriate place" is one of only two possibilities: C++ or PHP. Once this decision is made, the rest is fairly easy. If the correct implementation is in C++, then the lowest implementation of the method in the C++ inheritance chain is called explicitly. If the correct implementation is in PHP, the Zend API is used to call the method of the underlying PHP object (after which the usual virtual method resolution in PHP automatically finds the right implementation).

    Now how does the director decide which language should handle the method call? The basic rule is to handle the method in PHP, unless there's a good reason not to. The reason for this is simple: PHP has the most "extended" implementation of the method. This assertion is guaranteed, since at a minimum the PHP proxy class implements the method. If the method in question has been extended by a class derived from the proxy class, that extended implementation will execute exactly as it should. If not, the proxy class will route the method call into a C wrapper function, expecting that the method will be resolved in C++. The wrapper will call the virtual method of the C++ instance, and since the director extends this the call will end up right back in the director method. Now comes the "good reason not to" part. If the director method were to blindly call the PHP method again, it would get stuck in an infinite loop. We avoid this situation by adding special code to the C wrapper function that tells the director method to not do this. The C wrapper function compares the called and the declaring class name of the given method. If these are not the same, then the C wrapper function tells the director to resolve the method by calling up the C++ inheritance chain, preventing an infinite loop.

    One more point needs to be made about the relationship between director classes and proxy classes. When a proxy class instance is created in PHP, SWIG creates an instance of the original C++ class and assigns it to ->_cPtr. This is exactly what happens without directors and is true even if directors are enabled for the particular class in question. When a class derived from a proxy class is created, however, SWIG then creates an instance of the corresponding C++ director class. The reason for this difference is that user-defined subclasses may override or extend methods of the original class, so the director class is needed to route calls to these methods correctly. For unmodified proxy classes, all methods are ultimately implemented in C++ so there is no need for the extra overhead involved with routing the calls through PHP.

    31.3.3 Ownership and object destruction

    Memory management issues are slightly more complicated with directors than for proxy classes alone. PHP instances hold a pointer to the associated C++ director object, and the director in turn holds a pointer back to the PHP object. By default, proxy classes own their C++ director object and take care of deleting it when they are garbage collected.

    This relationship can be reversed by calling the special ->thisown property of the proxy class. After setting this property to 0, the director class no longer destroys the PHP object. Assuming no outstanding references to the PHP object remain, the PHP object will be destroyed at the same time. This is a good thing, since directors and proxies refer to each other and so must be created and destroyed together. Destroying one without destroying the other will likely cause your program to segfault.

    Here is an example:

    class Foo {
    public:
      ...
    };
    class FooContainer {
    public:
      void addFoo(Foo *);
      ...
    };
    

    $c = new FooContainer();
    $a = new Foo();
    $a->thisown = 0;
    $c->addFoo($a);
    

    In this example, we are assuming that FooContainer will take care of deleting all the Foo pointers it contains at some point.

    31.3.4 Exception unrolling

    With directors routing method calls to PHP, and proxies routing them to C++, the handling of exceptions is an important concern. By default, an exception thrown in PHP code called from C++ causes the PHP interpreter to flag that an exception is thrown, then return passes to C++ as if the PHP function had returned Null. Assuming the directorout typemaps handle this (those SWIG defines by default should) then once control returns to PHP code again, the PHP exception will actually propagate.

    Sometimes this control flow is problematic, and you want to skip any handling in the C++ code. To achieve this, it is necessary to temporarily translate the PHP exception into a C++ exception. This can be achieved using the %feature("director:except") directive. The following code should suffice in most cases:

    %feature("director:except") {
      if ($error == FAILURE) {
        throw Swig::DirectorMethodException();
      }
    }
    

    This code will check the PHP error state after each method call from a director into PHP, and throw a C++ exception if an error occurred. This exception can be caught in C++ to implement an error handler. Currently no information about the PHP error is stored in the Swig::DirectorMethodException object, but this will likely change in the future.

    It may be the case that a method call originates in PHP, travels up to C++ through a proxy class, and then back into PHP via a director method. If an exception occurs in PHP at this point, it would be nice for that exception to find its way back to the original caller. This can be done by combining a normal %exception directive with the director:except handler shown above. Here is an example of a suitable exception handler:

    %exception {
      try { $action }
      catch (Swig::DirectorException &e) { SWIG_fail; }
    }
    

    The class Swig::DirectorException used in this example is actually a base class of Swig::DirectorMethodException, so it will trap this exception. Because the PHP error state is still set when Swig::DirectorMethodException is thrown, PHP will register the exception as soon as the C wrapper function returns.

    31.3.5 Overhead and code bloat

    Enabling directors for a class will generate a new director method for every virtual method in the class' inheritance chain. This alone can generate a lot of code bloat for large hierarchies. Method arguments that require complex conversions to and from target language types can result in large director methods. For this reason it is recommended that you selectively enable directors only for specific classes that are likely to be extended in PHP and used in C++.

    Compared to classes that do not use directors, the call routing in the director methods does add some overhead. In particular, at least one dynamic cast and one extra function call occurs per method call from PHP. Relative to the speed of PHP execution this is probably completely negligible. For worst case routing, a method call that ultimately resolves in C++ may take one extra detour through PHP in order to ensure that the method does not have an extended PHP implementation. This could result in a noticeable overhead in some cases.

    Although directors make it natural to mix native C++ objects with PHP objects (as director objects) via a common base class pointer, one should be aware of the obvious fact that method calls to PHP objects will be much slower than calls to C++ objects. This situation can be optimized by selectively enabling director methods (using the %feature directive) for only those methods that are likely to be extended in PHP.

    31.3.6 Typemaps

    Typemaps for input and output of most of the basic types from director classes have been written. These are roughly the reverse of the usual input and output typemaps used by the wrapper code. The typemap operation names are 'directorin', 'directorout', and 'directorargout'. The director code does not currently use any of the other kinds of typemaps. It is not clear at this point which kinds are appropriate and need to be supported.

    31.3.7 Miscellaneous

    Director typemaps for STL classes are mostly in place, and hence you should be able to use std::string, etc., as you would any other type.

    swig-4.0.1/Doc/Manual/Tcl.html0000644000175000017500000023545313527234053015715 0ustar williamwilliam SWIG and Tcl

    36 SWIG and Tcl

    Caution: This chapter is under repair!

    This chapter discusses SWIG's support of Tcl. SWIG currently requires Tcl 8.0 or a later release. Earlier releases of SWIG supported Tcl 7.x, but this is no longer supported.

    36.1 Preliminaries

    To build a Tcl module, run SWIG using the -tcl or -tcl8 option :

    $ swig -tcl example.i
    

    If building a C++ extension, add the -c++ option:

    $ swig -c++ -tcl example.i
    

    This creates a file example_wrap.c or example_wrap.cxx that contains all of the code needed to build a Tcl extension module. To finish building the module, you need to compile this file and link it with the rest of your program.

    36.1.1 Getting the right header files

    In order to compile the wrapper code, the compiler needs the tcl.h header file. This file is usually contained in the directory

    /usr/local/include
    

    Be aware that some Tcl versions install this header file with a version number attached to it. If this is the case, you should probably make a symbolic link so that tcl.h points to the correct header file.

    36.1.2 Compiling a dynamic module

    The preferred approach to building an extension module is to compile it into a shared object file or DLL. Assuming you have code you need to link to in a file called example.c, you will need to compile your program using commands like this (shown for Linux):

    $ swig -tcl example.i
    $ gcc -fPIC -c example.c
    $ gcc -fPIC -c example_wrap.c -I/usr/local/include
    $ gcc -shared example.o example_wrap.o -o example.so
    

    The exact commands for doing this vary from platform to platform. SWIG tries to guess the right options when it is installed. Therefore, you may want to start with one of the examples in the SWIG/Examples/tcl directory. If that doesn't work, you will need to read the man-pages for your compiler and linker to get the right set of options. You might also check the SWIG Wiki for additional information.

    When linking the module, the name of the output file has to match the name of the module. If the name of your SWIG module is "example", the name of the corresponding object file should be "example.so". The name of the module is specified using the %module directive or the -module command line option.

    36.1.3 Static linking

    An alternative approach to dynamic linking is to rebuild the Tcl interpreter with your extension module added to it. In the past, this approach was sometimes necessary due to limitations in dynamic loading support on certain machines. However, the situation has improved greatly over the last few years and you should not consider this approach unless there is really no other option.

    The usual procedure for adding a new module to Tcl involves writing a special function Tcl_AppInit() and using it to initialize the interpreter and your module. With SWIG, the tclsh.i and wish.i library files can be used to rebuild the tclsh and wish interpreters respectively. For example:

    %module example
    
    %inline %{
    extern int fact(int);
    extern int mod(int, int);
    extern double My_variable;
    %}
    
    %include "tclsh.i"       // Include code for rebuilding tclsh
    
    

    The tclsh.i library file includes supporting code that contains everything needed to rebuild tclsh. To rebuild the interpreter, you simply do something like this:

    $ swig -tcl example.i
    $ gcc example.c example_wrap.c \
            -Xlinker -export-dynamic \
            -DHAVE_CONFIG_H -I/usr/local/include/ \
            -L/usr/local/lib -ltcl -lm -ldl \
            -o mytclsh
    
    

    You will need to supply the same libraries that were used to build Tcl the first time. This may include system libraries such as -lsocket, -lnsl, and -lpthread. If this actually works, the new version of Tcl should be identical to the default version except that your extension module will be a built-in part of the interpreter.

    Comment: In practice, you should probably try to avoid static linking if possible. Some programmers may be inclined to use static linking in the interest of getting better performance. However, the performance gained by static linking tends to be rather minimal in most situations (and quite frankly not worth the extra hassle in the opinion of this author).

    36.1.4 Using your module

    To use your module, simply use the Tcl load command. If all goes well, you will be able to this:

    $ tclsh
    % load ./example.so
    % fact 4
    24
    %
    

    A common error received by first-time users is the following:

    % load ./example.so
    couldn't find procedure Example_Init
    % 
    

    This error is almost always caused when the name of the shared object file doesn't match the name of the module supplied using the SWIG %module directive. Double-check the interface to make sure the module name and the shared object file match. Another possible cause of this error is forgetting to link the SWIG-generated wrapper code with the rest of your application when creating the extension module.

    Another common error is something similar to the following:

    % load ./example.so
    couldn't load file "./example.so": ./example.so: undefined symbol: fact
    % 
    

    This error usually indicates that you forgot to include some object files or libraries in the linking of the shared library file. Make sure you compile both the SWIG wrapper file and your original program into a shared library file. Make sure you pass all of the required libraries to the linker.

    Sometimes unresolved symbols occur because a wrapper has been created for a function that doesn't actually exist in a library. This usually occurs when a header file includes a declaration for a function that was never actually implemented or it was removed from a library without updating the header file. To fix this, you can either edit the SWIG input file to remove the offending declaration or you can use the %ignore directive to ignore the declaration.

    Finally, suppose that your extension module is linked with another library like this:

    $ gcc -shared example.o example_wrap.o -L/home/beazley/projects/lib -lfoo \
          -o example.so
    

    If the foo library is compiled as a shared library, you might get the following problem when you try to use your module:

    % load ./example.so
    couldn't load file "./example.so": libfoo.so: cannot open shared object file:
    No such file or directory
    %        
    

    This error is generated because the dynamic linker can't locate the libfoo.so library. When shared libraries are loaded, the system normally only checks a few standard locations such as /usr/lib and /usr/local/lib. To fix this problem, there are several things you can do. First, you can recompile your extension module with extra path information. For example, on Linux you can do this:

    $ gcc -shared example.o example_wrap.o -L/home/beazley/projects/lib -lfoo \
          -Xlinker -rpath /home/beazley/projects/lib \
          -o example.so
    

    Alternatively, you can set the LD_LIBRARY_PATH environment variable to include the directory with your shared libraries. If setting LD_LIBRARY_PATH, be aware that setting this variable can introduce a noticeable performance impact on all other applications that you run. To set it only for Tcl, you might want to do this instead:

    $ env LD_LIBRARY_PATH=/home/beazley/projects/lib tclsh
    

    Finally, you can use a command such as ldconfig to add additional search paths to the default system configuration (this requires root access and you will need to read the man pages).

    36.1.5 Compilation of C++ extensions

    Compilation of C++ extensions has traditionally been a tricky problem. Since the Tcl interpreter is written in C, you need to take steps to make sure C++ is properly initialized and that modules are compiled correctly.

    On most machines, C++ extension modules should be linked using the C++ compiler. For example:

    % swig -c++ -tcl example.i
    % g++ -fPIC -c example.cxx
    % g++ -fPIC -c example_wrap.cxx -I/usr/local/include
    % g++ -shared example.o example_wrap.o -o example.so
    

    In addition to this, you may need to include additional library files to make it work. For example, if you are using the Sun C++ compiler on Solaris, you often need to add an extra library -lCrun like this:

    % swig -c++ -tcl example.i
    % CC -KPIC -c example.cxx
    % CC -KPIC -c example_wrap.cxx -I/usr/local/include
    % CC -G example.o example_wrap.o -L/opt/SUNWspro/lib -o example.so -lCrun
    

    Of course, the extra libraries to use are completely non-portable---you will probably need to do some experimentation.

    Sometimes people have suggested that it is necessary to relink the Tcl interpreter using the C++ compiler to make C++ extension modules work. In the experience of this author, this has never actually appeared to be necessary. Relinking the interpreter with C++ really only includes the special run-time libraries described above---as long as you link your extension modules with these libraries, it should not be necessary to rebuild Tcl.

    If you aren't entirely sure about the linking of a C++ extension, you might look at an existing C++ program. On many Unix machines, the ldd command will list library dependencies. This should give you some clues about what you might have to include when you link your extension module. For example:

    $ ldd swig
            libstdc++-libc6.1-1.so.2 => /usr/lib/libstdc++-libc6.1-1.so.2 (0x40019000)
            libm.so.6 => /lib/libm.so.6 (0x4005b000)
            libc.so.6 => /lib/libc.so.6 (0x40077000)
            /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
    $
    

    As a final complication, a major weakness of C++ is that it does not define any sort of standard for binary linking of libraries. This means that C++ code compiled by different compilers will not link together properly as libraries nor is the memory layout of classes and data structures implemented in any kind of portable manner. In a monolithic C++ program, this problem may be unnoticed. However, in Tcl, it is possible for different extension modules to be compiled with different C++ compilers. As long as these modules are self-contained, this probably won't matter. However, if these modules start sharing data, you will need to take steps to avoid segmentation faults and other erratic program behavior. If working with lots of software components, you might want to investigate using a more formal standard such as COM.

    36.1.6 Compiling for 64-bit platforms

    On platforms that support 64-bit applications (Solaris, Irix, etc.), special care is required when building extension modules. On these machines, 64-bit applications are compiled and linked using a different set of compiler/linker options. In addition, it is not generally possible to mix 32-bit and 64-bit code together in the same application.

    To utilize 64-bits, the Tcl executable will need to be recompiled as a 64-bit application. In addition, all libraries, wrapper code, and every other part of your application will need to be compiled for 64-bits. If you plan to use other third-party extension modules, they will also have to be recompiled as 64-bit extensions.

    If you are wrapping commercial software for which you have no source code, you will be forced to use the same linking standard as used by that software. This may prevent the use of 64-bit extensions. It may also introduce problems on platforms that support more than one linking standard (e.g., -o32 and -n32 on Irix).

    36.1.7 Setting a package prefix

    To avoid namespace problems, you can instruct SWIG to append a package prefix to all of your functions and variables. This is done using the -prefix option as follows :

    swig -tcl -prefix Foo example.i
    

    If you have a function "bar" in the SWIG file, the prefix option will append the prefix to the name when creating a command and call it "Foo_bar".

    36.1.8 Using namespaces

    Alternatively, you can have SWIG install your module into a Tcl namespace by specifying the -namespace option :

    swig -tcl -namespace example.i
    

    By default, the name of the namespace will be the same as the module name, but you can override it using the -prefix option.

    When the -namespace option is used, objects in the module are always accessed with the namespace name such as Foo::bar.

    36.2 Building Tcl/Tk Extensions under Windows 95/NT

    Building a SWIG extension to Tcl/Tk under Windows 95/NT is roughly similar to the process used with Unix. Normally, you will want to produce a DLL that can be loaded into tclsh or wish. This section covers the process of using SWIG with Microsoft Visual C++. although the procedure may be similar with other compilers.

    36.2.1 Running SWIG from Developer Studio

    If you are developing your application within Microsoft developer studio, SWIG can be invoked as a custom build option. The process roughly follows these steps :

    • Open up a new workspace and use the AppWizard to select a DLL project.
    • Add both the SWIG interface file (the .i file), any supporting C files, and the name of the wrapper file that will be created by SWIG (ie. example_wrap.c). Note : If using C++, choose a different suffix for the wrapper file such as example_wrap.cxx. Don't worry if the wrapper file doesn't exist yet--Developer studio will keep a reference to it around.
    • Select the SWIG interface file and go to the settings menu. Under settings, select the "Custom Build" option.
    • Enter "SWIG" in the description field.
    • Enter "swig -tcl -o $(ProjDir)\$(InputName)_wrap.c $(InputPath)" in the "Build command(s) field"
    • Enter "$(ProjDir)\$(InputName)_wrap.c" in the "Output files(s) field".
    • Next, select the settings for the entire project and go to "C++:Preprocessor". Add the include directories for your Tcl installation under "Additional include directories".
    • Finally, select the settings for the entire project and go to "Link Options". Add the Tcl library file to your link libraries. For example "tcl80.lib". Also, set the name of the output file to match the name of your Tcl module (ie. example.dll).
    • Build your project.

    Now, assuming all went well, SWIG will be automatically invoked when you build your project. Any changes made to the interface file will result in SWIG being automatically invoked to produce a new version of the wrapper file. To run your new Tcl extension, simply run tclsh or wish and use the load command. For example :

    MSDOS > tclsh80
    % load example.dll
    % fact 4
    24
    %
    

    36.2.2 Using NMAKE

    Alternatively, SWIG extensions can be built by writing a Makefile for NMAKE. To do this, make sure the environment variables for MSVC++ are available and the MSVC++ tools are in your path. Now, just write a short Makefile like this :

    # Makefile for building various SWIG generated extensions
    
    SRCS          = example.c
    IFILE         = example
    INTERFACE     = $(IFILE).i
    WRAPFILE      = $(IFILE)_wrap.c
    
    # Location of the Visual C++ tools (32 bit assumed)
    
    TOOLS         = c:\msdev
    TARGET        = example.dll
    CC            = $(TOOLS)\bin\cl.exe
    LINK          = $(TOOLS)\bin\link.exe
    INCLUDE32     = -I$(TOOLS)\include
    MACHINE       = IX86
    
    # C Library needed to build a DLL
    
    DLLIBC        = msvcrt.lib oldnames.lib  
    
    # Windows libraries that are apparently needed
    WINLIB        = kernel32.lib advapi32.lib user32.lib gdi32.lib comdlg32.lib 
    winspool.lib
    
    # Libraries common to all DLLs
    LIBS          = $(DLLIBC) $(WINLIB) 
    
    # Linker options
    LOPT      = -debug:full -debugtype:cv /NODEFAULTLIB /RELEASE /NOLOGO /
    MACHINE:$(MACHINE) -entry:_DllMainCRTStartup@12 -dll
    
    # C compiler flags
    
    CFLAGS    = /Z7 /Od /c /nologo
    TCL_INCLUDES  = -Id:\tcl8.0a2\generic -Id:\tcl8.0a2\win
    TCLLIB        = d:\tcl8.0a2\win\tcl80.lib
    
    tcl:
            ..\..\swig -tcl -o $(WRAPFILE) $(INTERFACE)
            $(CC) $(CFLAGS) $(TCL_INCLUDES) $(SRCS) $(WRAPFILE)
            set LIB=$(TOOLS)\lib
            $(LINK) $(LOPT) -out:example.dll $(LIBS) $(TCLLIB) example.obj example_wrap.obj
    
    

    To build the extension, run NMAKE (you may need to run vcvars32 first). This is a pretty minimal Makefile, but hopefully its enough to get you started. With a little practice, you'll be making lots of Tcl extensions.

    36.3 A tour of basic C/C++ wrapping

    By default, SWIG tries to build a very natural Tcl interface to your C/C++ code. Functions are wrapped as functions, classes are wrapped in an interface that mimics the style of Tk widgets and [incr Tcl] classes. This section briefly covers the essential aspects of this wrapping.

    36.3.1 Modules

    The SWIG %module directive specifies the name of the Tcl module. If you specify `%module example', then everything is compiled into an extension module example.so. When choosing a module name, make sure you don't use the same name as a built-in Tcl command.

    One pitfall to watch out for is module names involving numbers. If you specify a module name like %module md5, you'll find that the load command no longer seems to work:

    % load ./md5.so
    couldn't find procedure Md_Init
    

    To fix this, supply an extra argument to load like this:

    % load ./md5.so md5
    

    36.3.2 Functions

    Global functions are wrapped as new Tcl built-in commands. For example,

    %module example
    int fact(int n);
    

    creates a built-in function fact that works exactly like you think it does:

    % load ./example.so
    % fact 4
    24
    % set x [fact 6]
    %
    

    36.3.3 Global variables

    C/C++ global variables are wrapped by Tcl global variables. For example:

    // SWIG interface file with global variables
    %module example
    ...
    %inline %{
    extern double density;
    %}
    ...
    

    Now look at the Tcl interface:

    % puts $density          # Output value of C global variable
    1.0
    % set density 0.95       # Change value
    

    If you make an error in variable assignment, you will get an error message. For example:

    % set density "hello"
    can't set "density": Type error. expected a double.
    %
    

    If a variable is declared as const, it is wrapped as a read-only variable. Attempts to modify its value will result in an error.

    To make ordinary variables read-only, you can use the %immutable directive. For example:

    %{
    extern char *path;
    %}
    %immutable;
    extern char *path;
    %mutable;
    

    The %immutable directive stays in effect until it is explicitly disabled or cleared using %mutable. See the Creating read-only variables section for further details.

    If you just want to make a specific variable immutable, supply a declaration name. For example:

    %{
    extern char *path;
    %}
    %immutable path;
    ...
    extern char *path;      // Read-only (due to %immutable)
    

    36.3.4 Constants and enums

    C/C++ constants are installed as global Tcl variables containing the appropriate value. To create a constant, use #define, enum, or the %constant directive. For example:

    #define PI 3.14159
    #define VERSION "1.0"
    
    enum Beverage { ALE, LAGER, STOUT, PILSNER };
    
    %constant int FOO = 42;
    %constant const char *path = "/usr/local";
    

    For enums, make sure that the definition of the enumeration actually appears in a header file or in the wrapper file somehow---if you just stick an enum in a SWIG interface without also telling the C compiler about it, the wrapper code won't compile.

    Note: declarations declared as const are wrapped as read-only variables and will be accessed using the cvar object described in the previous section. They are not wrapped as constants. For further discussion about this, see the SWIG Basics chapter.

    Constants are not guaranteed to remain constant in Tcl---the value of the constant could be accidentally reassigned.You will just have to be careful.

    A peculiarity of installing constants as variables is that it is necessary to use the Tcl global statement to access constants in procedure bodies. For example:

    proc blah {} {
      global FOO
      bar $FOO
    }
    

    If a program relies on a lot of constants, this can be extremely annoying. To fix the problem, consider using the following typemap rule:

    %apply int CONSTANT { int x };
    #define FOO 42
    ...
    void bar(int x);
    

    When applied to an input argument, the CONSTANT rule allows a constant to be passed to a function using its actual value or a symbolic identifier name. For example:

    proc blah {} {
      bar FOO
    }
    

    When an identifier name is given, it is used to perform an implicit hash-table lookup of the value during argument conversion. This allows the global statement to be omitted.

    36.3.5 Pointers

    C/C++ pointers are fully supported by SWIG. Furthermore, SWIG has no problem working with incomplete type information. Here is a rather simple interface:

    %module example
    
    FILE *fopen(const char *filename, const char *mode);
    int fputs(const char *, FILE *);
    int fclose(FILE *);
    

    When wrapped, you will be able to use the functions in a natural way from Tcl. For example:

    % load ./example.so
    % set f [fopen junk w]
    % fputs "Hello World\n" $f
    % fclose $f
    

    If this makes you uneasy, rest assured that there is no deep magic involved. Underneath the covers, pointers to C/C++ objects are simply represented as opaque values--normally an encoded character string like this:

    % puts $f
    _c0671108_p_FILE
    % 
    

    This pointer value can be freely passed around to different C functions that expect to receive an object of type FILE *. The only thing you can't do is dereference the pointer from Tcl.

    The NULL pointer is represented by the string NULL.

    As much as you might be inclined to modify a pointer value directly from Tcl, don't. The hexadecimal encoding is not necessarily the same as the logical memory address of the underlying object. Instead it is the raw byte encoding of the pointer value. The encoding will vary depending on the native byte-ordering of the platform (i.e., big-endian vs. little-endian). Similarly, don't try to manually cast a pointer to a new type by simply replacing the type-string. This may not work like you expect and it is particularly dangerous when casting C++ objects. If you need to cast a pointer or change its value, consider writing some helper functions instead. For example:

    %inline %{
    /* C-style cast */
    Bar *FooToBar(Foo *f) {
      return (Bar *) f;
    }
    
    /* C++-style cast */
    Foo *BarToFoo(Bar *b) {
      return dynamic_cast<Foo*>(b);
    }
    
    Foo *IncrFoo(Foo *f, int i) {
      return f+i;
    }
    %}
    

    Also, if working with C++, you should always try to use the new C++ style casts. For example, in the above code, the C-style cast may return a bogus result whereas as the C++-style cast will return None if the conversion can't be performed.

    36.3.6 Structures

    If you wrap a C structure, it is wrapped by a Tcl interface that somewhat resembles a Tk widget. This provides a very natural interface. For example,

    struct Vector {
      double x, y, z;
    };
    
    

    is used as follows:

    % Vector v
    % v configure -x 3.5 -y 7.2
    % puts "[v cget -x] [v cget -y] [v cget -z]"
    3.5 7.2 0.0
    % 
    

    Similar access is provided for unions and the data members of C++ classes.

    In the above example, v is a name that's used for the object. However, underneath the covers, there's a pointer to a raw C structure. This can be obtained by looking at the -this attribute. For example:

    % puts [v cget -this]
    _88e31408_p_Vector
    

    Further details about the relationship between the Tcl and the underlying C structure are covered a little later.

    const members of a structure are read-only. Data members can also be forced to be read-only using the %immutable directive. For example:

    struct Foo {
      ...
      %immutable;
      int x;        /* Read-only members */
      char *name;
      %mutable;
      ...
    };
    

    When char * members of a structure are wrapped, the contents are assumed to be dynamically allocated using malloc or new (depending on whether or not SWIG is run with the -c++ option). When the structure member is set, the old contents will be released and a new value created. If this is not the behavior you want, you will have to use a typemap (described later).

    If a structure contains arrays, access to those arrays is managed through pointers. For example, consider this:

    struct Bar {
      int  x[16];
    };
    

    If accessed in Tcl, you will see behavior like this:

    % Bar b
    % puts [b cget -x]
    _801861a4_p_int
    % 
    

    This pointer can be passed around to functions that expect to receive an int * (just like C). You can also set the value of an array member using another pointer. For example:

    % Bar c
    % c configure -x [b cget -x]   # Copy contents of b.x to c.x
    

    For array assignment, SWIG copies the entire contents of the array starting with the data pointed to by b.x. In this example, 16 integers would be copied. Like C, SWIG makes no assumptions about bounds checking---if you pass a bad pointer, you may get a segmentation fault or access violation.

    When a member of a structure is itself a structure, it is handled as a pointer. For example, suppose you have two structures like this:

    struct Foo {
      int a;
    };
    
    struct Bar {
      Foo f;
    };
    

    Now, suppose that you access the f attribute of Bar like this:

    % Bar b
    % set x [b cget -f]
    

    In this case, x is a pointer that points to the Foo that is inside b. This is the same value as generated by this C code:

    Bar b;
    Foo *x = &b->f;       /* Points inside b */
    

    However, one peculiarity of accessing a substructure like this is that the returned value does work quite like you might expect. For example:

    % Bar b
    % set x [b cget -f]
    % x cget -a
    invalid command name "x"
    

    This is because the returned value was not created in a normal way from the interpreter (x is not a command object). To make it function normally, just evaluate the variable like this:

    % Bar b
    % set x [b cget -f]
    % $x cget -a
    0
    %
    

    In this example, x points inside the original structure. This means that modifications work just like you would expect. For example:

    
    % Bar b
    % set x [b cget -f]
    % $x configure -a 3            # Modifies contents of f (inside b)
    % [b cget -f] -configure -a 3  # Same thing
    

    In many of these structure examples, a simple name like "v" or "b" has been given to wrapped structures. If necessary, this name can be passed to functions that expect to receive an object. For example, if you have a function like this,

    void blah(Foo *f);
    

    you can call the function in Tcl as follows:

    % Foo x            # Create a Foo object 
    % blah x           # Pass the object to a function
    

    It is also possible to call the function using the raw pointer value. For instance:

    % blah [x cget -this]   # Pass object to a function
    

    It is also possible to create and use objects using variables. For example:

    % set b [Bar]            # Create a Bar
    % $b cget -f             # Member access
    % puts $b
    _108fea88_p_Bar
    %
    

    Finally, to destroy objects created from Tcl, you can either let the object name go out of scope or you can explicitly delete the object. For example:

    % Foo f                 # Create object f
    % rename f ""
    

    or

    % Foo f                 # Create object f
    % f -delete
    

    Note: Tcl only destroys the underlying object if it has ownership. See the memory management section that appears shortly.

    36.3.7 C++ classes

    C++ classes are wrapped as an extension of structure wrapping. For example, if you have this class,

    class List {
    public:
      List();
      ~List();
      int  search(char *item);
      void insert(char *item);
      void remove(char *item);
      char *get(int n);
      int  length;
    };
    

    you can use it in Tcl like this:

    % List x
    % x insert Ale
    % x insert Stout
    % x insert Lager
    % x get 1
    Stout
    % puts [x cget -length]
    3
    %
    

    Class data members are accessed in the same manner as C structures.

    Static class members are accessed as global functions or variables. To illustrate, suppose you have a class like this:

    class Spam {
    public:
      static void foo();
      static int bar;
    };
    

    In Tcl, the static member is accessed as follows:

    % Spam_foo        # Spam::foo()
    % puts $Spam_bar  # Spam::bar
    

    36.3.8 C++ inheritance

    SWIG is fully aware of issues related to C++ inheritance. Therefore, if you have classes like this

    class Foo {
    ...
    };
    
    class Bar : public Foo {
    ...
    };
    

    An object of type Bar can be used where a Foo is expected. For example, if you have this function:

    void spam(Foo *f);
    

    then the function spam() accepts a Foo * or a pointer to any class derived from Foo. For instance:

    % Foo f      # Create a Foo
    % Bar b      # Create a Bar
    % spam f     # OK
    % spam b     # OK
    

    It is safe to use multiple inheritance with SWIG.

    36.3.9 Pointers, references, values, and arrays

    In C++, there are many different ways a function might receive and manipulate objects. For example:

    void spam1(Foo *x);      // Pass by pointer
    void spam2(Foo &x);      // Pass by reference
    void spam3(Foo x);       // Pass by value
    void spam4(Foo x[]);     // Array of objects
    

    In Tcl, there is no detailed distinction like this. Because of this, SWIG unifies all of these types together in the wrapper code. For instance, if you actually had the above functions, it is perfectly legal to do this:

    % Foo f             # Create a Foo
    % spam1 f           # Ok. Pointer
    % spam2 f           # Ok. Reference
    % spam3 f           # Ok. Value.
    % spam4 f           # Ok. Array (1 element)
    

    Similar behavior occurs for return values. For example, if you had functions like this,

    Foo *spam5();
    Foo &spam6();
    Foo  spam7();
    

    then all three functions will return a pointer to some Foo object. Since the third function (spam7) returns a value, newly allocated memory is used to hold the result and a pointer is returned (Tcl will release this memory when the return value is garbage collected).

    36.3.10 C++ overloaded functions

    C++ overloaded functions, methods, and constructors are mostly supported by SWIG. For example, if you have two functions like this:

    void foo(int);
    void foo(char *c);
    

    You can use them in Tcl in a straightforward manner:

    % foo 3            # foo(int)
    % foo Hello        # foo(char *c)
    

    Similarly, if you have a class like this,

    class Foo {
    public:
      Foo();
      Foo(const Foo &);
      ...
    };
    

    you can write Tcl code like this:

    % Foo f                # Create a Foo
    % Foo g f              # Copy f
    

    Overloading support is not quite as flexible as in C++. Sometimes there are methods that SWIG can't disambiguate. For example:

    void spam(int);
    void spam(short);
    

    or

    void foo(Bar *b);
    void foo(Bar &b);
    

    If declarations such as these appear, you will get a warning message like this:

    example.i:12: Warning 509: Overloaded method spam(short) effectively ignored,
    example.i:11: Warning 509: as it is shadowed by spam(int).
    

    To fix this, you either need to ignore or rename one of the methods. For example:

    %rename(spam_short) spam(short);
    ...
    void spam(int);    
    void spam(short);   // Accessed as spam_short
    

    or

    %ignore spam(short);
    ...
    void spam(int);    
    void spam(short);   // Ignored
    

    SWIG resolves overloaded functions and methods using a disambiguation scheme that ranks and sorts declarations according to a set of type-precedence rules. The order in which declarations appear in the input does not matter except in situations where ambiguity arises--in this case, the first declaration takes precedence.

    Please refer to the "SWIG and C++" chapter for more information about overloading.

    36.3.11 C++ operators

    Certain C++ overloaded operators can be handled automatically by SWIG. For example, consider a class like this:

    class Complex {
    private:
      double rpart, ipart;
    public:
      Complex(double r = 0, double i = 0) : rpart(r), ipart(i) { }
      Complex(const Complex &c) : rpart(c.rpart), ipart(c.ipart) { }
      Complex &operator=(const Complex &c);
      Complex operator+(const Complex &c) const;
      Complex operator-(const Complex &c) const;
      Complex operator*(const Complex &c) const;
      Complex operator-() const;
      
      double re() const { return rpart; }
      double im() const { return ipart; }
    };
    

    When wrapped, it works like this:

    % Complex c 3 4
    % Complex d 7 8
    % set e [c + d]
    % $e re
    10.0
    % $e im
    12.0
    

    It should be stressed that operators in SWIG have no relationship to operators in Tcl. In fact, the only thing that's happening here is that an operator like operator + has been renamed to a method +. Therefore, the statement [c + d] is really just invoking the + method on c. When more than operator is defined (with different arguments), the standard method overloading facilities are used. Here is a rather odd looking example:

    % Complex c 3 4
    % Complex d 7 8
    % set e [c - d]       # operator-(const Complex &)
    % puts "[$e re] [$e im]"
    10.0 12.0
    % set f [c -]         # operator-()
    % puts "[$f re] [$f im]"
    -3.0 -4.0
    %
    

    One restriction with operator overloading support is that SWIG is not able to fully handle operators that aren't defined as part of the class. For example, if you had code like this

    class Complex {
    ...
    friend Complex operator+(double, const Complex &c);
    ...
    };
    

    then SWIG doesn't know what to do with the friend function--in fact, it simply ignores it and issues a warning. You can still wrap the operator, but you may have to encapsulate it in a special function. For example:

    %rename(Complex_add_dc) operator+(double, const Complex &);
    ...
    Complex operator+(double, const Complex &c);
    

    There are ways to make this operator appear as part of the class using the %extend directive. Keep reading.

    36.3.12 C++ namespaces

    SWIG is aware of C++ namespaces, but namespace names do not appear in the module nor do namespaces result in a module that is broken up into submodules or packages. For example, if you have a file like this,

    %module example
    
    namespace foo {
      int fact(int n);
      struct Vector {
        double x, y, z;
      };
    };
    

    it works in Tcl as follows:

    % load ./example.so
    % fact 3
    6
    % Vector v
    % v configure -x 3.4
    

    If your program has more than one namespace, name conflicts (if any) can be resolved using %rename For example:

    %rename(Bar_spam) Bar::spam;
    
    namespace Foo {
      int spam();
    }
    
    namespace Bar {
      int spam();
    }
    

    If you have more than one namespace and your want to keep their symbols separate, consider wrapping them as separate SWIG modules. For example, make the module name the same as the namespace and create extension modules for each namespace separately. If your program utilizes thousands of small deeply nested namespaces each with identical symbol names, well, then you get what you deserve.

    36.3.13 C++ templates

    C++ templates don't present a huge problem for SWIG. However, in order to create wrappers, you have to tell SWIG to create wrappers for a particular template instantiation. To do this, you use the %template directive. For example:

    %module example
    %{
    #include "pair.h"
    %}
    
    template<class T1, class T2>
    struct pair {
      typedef T1 first_type;
      typedef T2 second_type;
      T1 first;
      T2 second;
      pair();
      pair(const T1&, const T2&);
      ~pair();
    };
    
    %template(pairii) pair<int, int>;
    

    In Tcl:

    % pairii p 3 4
    % p cget -first
    3
    % p cget -second
    4
    

    Obviously, there is more to template wrapping than shown in this example. More details can be found in the SWIG and C++ chapter. Some more complicated examples will appear later.

    36.3.14 C++ Smart Pointers

    In certain C++ programs, it is common to use classes that have been wrapped by so-called "smart pointers." Generally, this involves the use of a template class that implements operator->() like this:

    template<class T> class SmartPtr {
      ...
      T *operator->();
      ...
    }
    

    Then, if you have a class like this,

    class Foo {
    public:
      int x;
      int bar();
    };
    

    A smart pointer would be used in C++ as follows:

    SmartPtr<Foo> p = CreateFoo();   // Created somehow (not shown)
    ...
    p->x = 3;                        // Foo::x
    int y = p->bar();                // Foo::bar
    

    To wrap this in Tcl, simply tell SWIG about the SmartPtr class and the low-level Foo object. Make sure you instantiate SmartPtr using %template if necessary. For example:

    %module example
    ...
    %template(SmartPtrFoo) SmartPtr<Foo>;
    ...
    

    Now, in Tcl, everything should just "work":

    % set p [CreateFoo]                  # Create a smart-pointer somehow
    % $p configure -x 3                  # Foo::x
    % $p bar                             # Foo::bar
    

    If you ever need to access the underlying pointer returned by operator->() itself, simply use the __deref__() method. For example:

    % set f [$p __deref__]    # Returns underlying Foo *
    

    36.4 Further details on the Tcl class interface

    In the previous section, a high-level view of Tcl wrapping was presented. A key component of this wrapping is that structures and classes are wrapped by Tcl class-like objects. This provides a very natural Tcl interface and allows SWIG to support a number of advanced features such as operator overloading. However, a number of low-level details were omitted. This section provides a brief overview of how the proxy classes work.

    36.4.1 Proxy classes

    In the "SWIG basics" and "SWIG and C++" chapters, details of low-level structure and class wrapping are described. To summarize those chapters, if you have a class like this

    class Foo {
    public:
      int x;
      int spam(int);
      ...
    

    then SWIG transforms it into a set of low-level procedural wrappers. For example:

    Foo *new_Foo() {
      return new Foo();
    }
    void delete_Foo(Foo *f) {
      delete f;
    }
    int Foo_x_get(Foo *f) {
      return f->x;
    }
    void Foo_x_set(Foo *f, int value) {
      f->x = value;
    }
    int Foo_spam(Foo *f, int arg1) {
      return f->spam(arg1);
    }
    

    These wrappers are actually found in the Tcl extension module. For example, you can certainly do this:

    % load ./example.so
    % set f [new_Foo]
    % Foo_x_get $f
    0
    % Foo_spam $f 3
    1
    %
    

    However, in addition to this, the classname Foo is used as an object constructor function. This allows objects to be encapsulated objects that look a lot like Tk widgets as shown in the last section.

    36.4.2 Memory management

    Associated with each wrapped object, is an ownership flag thisown The value of this flag determines who is responsible for deleting the underlying C++ object. If set to 1, the Tcl interpreter destroys the C++ object when the proxy class is garbage collected. If set to 0 (or if the attribute is missing), then the destruction of the proxy class has no effect on the C++ object.

    When an object is created by a constructor or returned by value, Tcl automatically takes ownership of the result. For example:

    class Foo {
    public:
      Foo();
      Foo bar();
    };
    

    In Tcl:

    % Foo f
    % f cget -thisown
    1
    % set g [f bar]
    % $g cget -thisown
    1
    

    On the other hand, when pointers are returned to Tcl, there is often no way to know where they came from. Therefore, the ownership is set to zero. For example:

    class Foo {
    public:
      ...
      Foo *spam();
      ...
    };
    

    % Foo f
    % set s [f spam]
    % $s cget -thisown
    0
    % 
    

    This behavior is especially important for classes that act as containers. For example, if a method returns a pointer to an object that is contained inside another object, you definitely don't want Tcl to assume ownership and destroy it!

    Related to containers, ownership issues can arise whenever an object is assigned to a member or global variable. For example, consider this interface:

    %module example
    
    struct Foo {
      int  value;
      Foo  *next;
    };
    
    Foo *head = 0;
    

    When wrapped in Tcl, careful observation will reveal that ownership changes whenever an object is assigned to a global variable. For example:

    % Foo f
    % f cget -thisown
    1
    % set head f
    % f cget -thisown
    0
    

    In this case, C is now holding a reference to the object---you probably don't want Tcl to destroy it. Similarly, this occurs for members. For example:

    % Foo f
    % Foo g
    % f cget -thisown
    1
    % g cget -thisown
    1
    % f configure -next g
    % g cget -thisown 
    0
    %
    

    For the most part, memory management issues remain hidden. However, there are occasionally situations where you might have to manually change the ownership of an object. For instance, consider code like this:

    class Node {
      Object *value;
    public:
      void set_value(Object *v) { value = v; }
      ...
    };
    

    Now, consider the following Tcl code:

    % Object v                 # Create an object
    % Node n                   # Create a node
    % n setvalue v             # Set value
    % v cget -thisown
    1
    % 
    

    In this case, the object n is holding a reference to v internally. However, SWIG has no way to know that this has occurred. Therefore, Tcl still thinks that it has ownership of the object. Should the proxy object be destroyed, then the C++ destructor will be invoked and n will be holding a stale-pointer. If you're lucky, you will only get a segmentation fault.

    To work around this, it is always possible to flip the ownership flag. For example,

    % v -disown              # Give ownership to C/C++
    % v -acquire             # Acquire ownership
    

    It is also possible to deal with situations like this using typemaps--an advanced topic discussed later.

    36.5 Input and output parameters

    A common problem in some C programs is handling parameters passed as simple pointers. For example:

    void add(int x, int y, int *result) {
      *result = x + y;
    }
    

    or perhaps

    int sub(int *x, int *y) {
      return *x+*y;
    }
    

    The easiest way to handle these situations is to use the typemaps.i file. For example:

    %module example
    %include "typemaps.i"
    
    void add(int, int, int *OUTPUT);
    int  sub(int *INPUT, int *INPUT);
    

    In Tcl, this allows you to pass simple values instead of pointer. For example:

    set a [add 3 4]
    puts $a
    7
    

    Notice how the INPUT parameters allow integer values to be passed instead of pointers and how the OUTPUT parameter creates a return result.

    If you don't want to use the names INPUT or OUTPUT, use the %apply directive. For example:

    %module example
    %include "typemaps.i"
    
    %apply int *OUTPUT { int *result };
    %apply int *INPUT  { int *x, int *y};
    
    void add(int x, int y, int *result);
    int  sub(int *x, int *y);
    

    If a function mutates one of its parameters like this,

    void negate(int *x) {
      *x = -(*x);
    }
    

    you can use INOUT like this:

    %include "typemaps.i"
    ...
    void negate(int *INOUT);
    

    In Tcl, a mutated parameter shows up as a return value. For example:

    set a [negate 3]
    puts $a
    -3
    

    The most common use of these special typemap rules is to handle functions that return more than one value. For example, sometimes a function returns a result as well as a special error code:

    /* send message, return number of bytes sent, along with success code */
    int send_message(char *text, int len, int *success);
    

    To wrap such a function, simply use the OUTPUT rule above. For example:

    %module example
    %include "typemaps.i"
    %apply int *OUTPUT { int *success };
    ...
    int send_message(char *text, int *success);
    

    When used in Tcl, the function will return multiple values as a list.

    set r [send_message "Hello World"]
    set bytes [lindex $r 0]
    set success [lindex $r 1]
    

    Another common use of multiple return values are in query functions. For example:

    void get_dimensions(Matrix *m, int *rows, int *columns);
    

    To wrap this, you might use the following:

    %module example
    %include "typemaps.i"
    %apply int *OUTPUT { int *rows, int *columns };
    ...
    void get_dimensions(Matrix *m, int *rows, *columns);
    

    Now, in Perl:

    set dim [get_dimensions $m]
    set r  [lindex $dim 0]
    set c  [lindex $dim 1]
    

    36.6 Exception handling

    The %exception directive can be used to create a user-definable exception handler in charge of converting exceptions in your C/C++ program into Tcl exceptions. The chapter on customization features contains more details, but suppose you extended the array example into a C++ class like the following :

    class RangeError {};   // Used for an exception
    
    class DoubleArray {
      private:
        int n;
        double *ptr;
      public:
        // Create a new array of fixed size
        DoubleArray(int size) {
          ptr = new double[size];
          n = size;
        }
        // Destroy an array
        ~DoubleArray() {
          delete ptr;
        }
        // Return the length of the array
        int   length() {
          return n;
        }
    
        // Get an item from the array and perform bounds checking.
        double getitem(int i) {
          if ((i >= 0) && (i < n))
            return ptr[i];
          else
            throw RangeError();
        }
    
        // Set an item in the array and perform bounds checking.
        void setitem(int i, double val) {
          if ((i >= 0) && (i < n))
            ptr[i] = val;
          else {
            throw RangeError();
          }
        }
      };
    

    The functions associated with this class can throw a C++ range exception for an out-of-bounds array access. We can catch this in our Tcl extension by specifying the following in an interface file :

    %exception {
      try {
        $action                // Gets substituted by actual function call
      }
      catch (RangeError) {
        Tcl_SetResult(interp, (char *)"Array index out-of-bounds", TCL_STATIC);
        return TCL_ERROR;
      }
    }
    

    As shown, the exception handling code will be added to every wrapper function. Since this is somewhat inefficient. You might consider refining the exception handler to only apply to specific methods like this:

    %exception getitem {
      try {
        $action
      }
      catch (RangeError) {
        Tcl_SetResult(interp, (char *)"Array index out-of-bounds", TCL_STATIC);
        return TCL_ERROR;
      }
    }
    
    %exception setitem {
      try {
        $action
      }
      catch (RangeError) {
        Tcl_SetResult(interp, (char *)"Array index out-of-bounds", TCL_STATIC);
        return TCL_ERROR;
      }
    }
    

    In this case, the exception handler is only attached to methods and functions named getitem and setitem.

    If you had a lot of different methods, you can avoid extra typing by using a macro. For example:

    %define RANGE_ERROR
    {
      try {
        $action
      }
      catch (RangeError) {
        Tcl_SetResult(interp, (char *)"Array index out-of-bounds", TCL_STATIC);
        return TCL_ERROR;
      }
    }
    %enddef
    
    %exception getitem RANGE_ERROR;
    %exception setitem RANGE_ERROR;
    

    Since SWIG's exception handling is user-definable, you are not limited to C++ exception handling. See the chapter on "Customization Features" for more examples.

    36.7 Typemaps

    This section describes how you can modify SWIG's default wrapping behavior for various C/C++ datatypes using the %typemap directive. This is an advanced topic that assumes familiarity with the Tcl C API as well as the material in the "Typemaps" chapter.

    Before proceeding, it should be stressed that typemaps are not a required part of using SWIG---the default wrapping behavior is enough in most cases. Typemaps are only used if you want to change some aspect of the primitive C-Tcl interface.

    36.7.1 What is a typemap?

    A typemap is nothing more than a code generation rule that is attached to a specific C datatype. For example, to convert integers from Tcl to C, you might define a typemap like this:

    %module example
    
    %typemap(in) int {
      if (Tcl_GetIntFromObj(interp, $input, &$1) == TCL_ERROR)
        return TCL_ERROR;
      printf("Received an integer : %d\n", $1);
    }
    %inline %{
    extern int fact(int n);
    %}
    

    Typemaps are always associated with some specific aspect of code generation. In this case, the "in" method refers to the conversion of input arguments to C/C++. The datatype int is the datatype to which the typemap will be applied. The supplied C code is used to convert values. In this code a number of special variable prefaced by a $ are used. The $1 variable is placeholder for a local variable of type int. The $input variable is the input object of type Tcl_Obj *.

    When this example is compiled into a Tcl module, it operates as follows:

    % load ./example.so
    % fact 6
    Received an integer : 6
    720
    

    In this example, the typemap is applied to all occurrences of the int datatype. You can refine this by supplying an optional parameter name. For example:

    %module example
    
    %typemap(in) int n {
      if (Tcl_GetIntFromObj(interp, $input, &$1) == TCL_ERROR)
        return TCL_ERROR;
      printf("n = %d\n", $1);
    }
    %inline %{
    extern int fact(int n);
    %}
    

    In this case, the typemap code is only attached to arguments that exactly match int n.

    The application of a typemap to specific datatypes and argument names involves more than simple text-matching--typemaps are fully integrated into the SWIG type-system. When you define a typemap for int, that typemap applies to int and qualified variations such as const int. In addition, the typemap system follows typedef declarations. For example:

    %typemap(in) int n {
      if (Tcl_GetIntFromObj(interp, $input, &$1) == TCL_ERROR)
        return TCL_ERROR;
      printf("n = %d\n", $1);
    }
    %inline %{
    typedef int Integer;
    extern int fact(Integer n);    // Above typemap is applied
    %}
    

    However, the matching of typedef only occurs in one direction. If you defined a typemap for Integer, it is not applied to arguments of type int.

    Typemaps can also be defined for groups of consecutive arguments. For example:

    %typemap(in) (char *str, int len) {
        $1 = Tcl_GetStringFromObj($input, &$2);
    };
    
    int count(char c, char *str, int len);
    

    When a multi-argument typemap is defined, the arguments are always handled as a single Tcl object. This allows the function to be used like this (notice how the length parameter is omitted):

    % count e "Hello World"
    1
    

    36.7.2 Tcl typemaps

    The previous section illustrated an "in" typemap for converting Tcl objects to C. A variety of different typemap methods are defined by the Tcl module. For example, to convert a C integer back into a Tcl object, you might define an "out" typemap like this:

    %typemap(out) int {
      Tcl_SetObjResult(interp, Tcl_NewIntObj($1));
    }
    

    The following list details all of the typemap methods that can be used by the Tcl module:

    %typemap(in)

    Converts Tcl objects to input function arguments

    %typemap(out)

    Converts return value of a C function to a Tcl object

    %typemap(varin)

    Assigns a C global variable from a Tcl object

    %typemap(varout)

    Returns a C global variable as a Tcl object

    %typemap(freearg)

    Cleans up a function argument (if necessary)

    %typemap(argout)

    Output argument processing

    %typemap(ret)

    Cleanup of function return values

    %typemap(consttab)

    Creation of Tcl constants (constant table)

    %typemap(constcode)

    Creation of Tcl constants (init function)

    %typemap(memberin)

    Setting of structure/class member data

    %typemap(globalin)

    Setting of C global variables

    %typemap(check)

    Checks function input values.

    %typemap(default)

    Set a default value for an argument (making it optional).

    %typemap(arginit)

    Initialize an argument to a value before any conversions occur.

    Examples of these methods will appear shortly.

    36.7.3 Typemap variables

    Within typemap code, a number of special variables prefaced with a $ may appear. A full list of variables can be found in the "Typemaps" chapter. This is a list of the most common variables:

    $1

    A C local variable corresponding to the actual type specified in the %typemap directive. For input values, this is a C local variable that's supposed to hold an argument value. For output values, this is the raw result that's supposed to be returned to Tcl.

    $input

    A Tcl_Obj * holding a raw Tcl object with an argument or variable value.

    $result

    A Tcl_Obj * that holds the result to be returned to Tcl.

    $1_name

    The parameter name that was matched.

    $1_type

    The actual C datatype matched by the typemap.

    $1_ltype

    An assignable version of the datatype matched by the typemap (a type that can appear on the left-hand-side of a C assignment operation). This type is stripped of qualifiers and may be an altered version of $1_type. All arguments and local variables in wrapper functions are declared using this type so that their values can be properly assigned.

    $symname

    The Tcl name of the wrapper function being created.

    36.7.4 Converting a Tcl list to a char **

    A common problem in many C programs is the processing of command line arguments, which are usually passed in an array of NULL terminated strings. The following SWIG interface file allows a Tcl list to be used as a char ** object.

    %module argv
    
    // This tells SWIG to treat char ** as a special case
    %typemap(in) char ** {
      Tcl_Obj **listobjv;
      int       nitems;
      int       i;
      if (Tcl_ListObjGetElements(interp, $input, &nitems, &listobjv) == TCL_ERROR) {
        return TCL_ERROR;
      }
      $1 = (char **) malloc((nitems+1)*sizeof(char *));
      for (i = 0; i < nitems; i++) {
        $1[i] = Tcl_GetStringFromObj(listobjv[i], 0);
      }
      $1[i] = 0;
    }
    
    // This gives SWIG some cleanup code that will get called after the function call
    %typemap(freearg) char ** {
      if ($1) {
        free($1);
      }
    }
    
    // Now a test functions
    %inline %{
      int print_args(char **argv) {
        int i = 0;
        while (argv[i]) {
          printf("argv[%d] = %s\n", i, argv[i]);
          i++;
        }
        return i;
      }
    %}
    %include "tclsh.i"
    
    

    In Tcl:

    % print_args {John Guido Larry}
    argv[0] = John
    argv[1] = Guido
    argv[2] = Larry
    3
    

    36.7.5 Returning values in arguments

    The "argout" typemap can be used to return a value originating from a function argument. For example :

    // A typemap defining how to return an argument by appending it to the result
    %typemap(argout) double *outvalue {
      Tcl_Obj *o = Tcl_NewDoubleObj($1);
      Tcl_ListObjAppendElement(interp, $result, o);
    }
    
    // A typemap telling SWIG to ignore an argument for input
    // However, we still need to pass a pointer to the C function
    %typemap(in, numinputs=0) double *outvalue (double temp) {
      $1 = &temp;
    }
    
    // Now a function returning two values
    int mypow(double a, double b, double *outvalue) {
      if ((a < 0) || (b < 0)) return -1;
      *outvalue = pow(a, b);
      return 0;
    };
    

    When wrapped, SWIG matches the argout typemap to the "double *outvalue" argument. The numinputs=0 specification tells SWIG to simply ignore this argument when generating wrapper code. As a result, a Tcl function using these typemaps will work like this :

    % mypow 2 3     # Returns two values, a status value and the result
    0 8
    %
    

    36.7.6 Useful functions

    The following tables provide some functions that may be useful in writing Tcl typemaps.

    Integers

    Tcl_Obj   *Tcl_NewIntObj(int Value);
    void       Tcl_SetIntObj(Tcl_Obj *obj, int Value);
    int        Tcl_GetIntFromObj(Tcl_Interp *, Tcl_Obj *obj, int *ip);
    

    Floating Point

    Tcl_Obj  *Tcl_NewDoubleObj(double Value);
    void      Tcl_SetDoubleObj(Tcl_Obj *obj, double value);
    int       Tcl_GetDoubleFromObj(Tcl_Interp *, Tcl_Obj *o, double *dp);
    

    Strings

    Tcl_Obj  *Tcl_NewStringObj(char *str, int len);
    char     *Tcl_GetStringFromObj(Tcl_Obj *obj, int *len);
    void      Tcl_AppendToObj(Tcl_Obj *obj, char *str, int len);
    

    Lists

    Tcl_Obj  *Tcl_NewListObj(int objc, Tcl_Obj *objv);
    int       Tcl_ListObjAppendList(Tcl_Interp *, Tcl_Obj *listPtr, Tcl_Obj *elemListPtr);
    int       Tcl_ListObjAppendElement(Tcl_Interp *, Tcl_Obj *listPtr, Tcl_Obj *element);
    int       Tcl_ListObjGetElements(Tcl_Interp *, Tcl_Obj *listPtr, int *objcPtr,
                                     Tcl_Obj ***objvPtr);
    int       Tcl_ListObjLength(Tcl_Interp *, Tcl_Obj *listPtr, int *intPtr);
    int       Tcl_ListObjIndex(Tcl_Interp *, Tcl_Obj *listPtr, int index,
                               Tcl_Obj_Obj **objptr);
    int       Tcl_ListObjReplace(Tcl_Interp *, Tcl_Obj *listPtr, int first, int count,
                                 int objc, Tcl_Obj *objv);
    

    Objects

    Tcl_Obj *Tcl_DuplicateObj(Tcl_Obj *obj);
    void     Tcl_IncrRefCount(Tcl_Obj *obj);
    void     Tcl_DecrRefCount(Tcl_Obj *obj);
    int      Tcl_IsShared(Tcl_Obj *obj);
    

    36.7.7 Standard typemaps

    The following typemaps show how to convert a few common kinds of objects between Tcl and C (and to give a better idea of how typemaps work)

    Integer conversion

    %typemap(in) int, short, long {
      int temp;
      if (Tcl_GetIntFromObj(interp, $input, &temp) == TCL_ERROR)
        return TCL_ERROR;
      $1 = ($1_ltype) temp;
    }
    

    %typemap(out) int, short, long {
      Tcl_SetIntObj($result, (int) $1);
    }
    

    Floating point conversion

    %typemap(in) float, double {
      double temp;
      if (Tcl_GetDoubleFromObj(interp, $input, &temp) == TCL_ERROR)
        return TCL_ERROR;
      $1 = ($1_ltype) temp;
    }
    

    %typemap(out) float, double {
      Tcl_SetDoubleObj($result, $1);
    }
    

    String Conversion

    %typemap(in) char * {
      int len;
      $1 = Tcl_GetStringFromObj(interp, &len);
    }
    

    %typemap(out, noblock=1, fragment="SWIG_FromCharPtr") char *, const char * {
      Tcl_SetObjResult(interp, SWIG_FromCharPtr((const char *)$1));
    }
    
    

    36.7.8 Pointer handling

    SWIG pointers are mapped into Tcl strings containing the hexadecimal value and type. The following functions can be used to create and read pointer values.

    int SWIG_ConvertPtr(Tcl_Obj *obj, void **ptr, swig_type_info *ty, int flags)

    Converts a Tcl object obj to a C pointer. The result of the conversion is placed into the pointer located at ptr. ty is a SWIG type descriptor structure. flags is used to handle error checking and other aspects of conversion. It is currently reserved for future expansion. Returns 0 on success and -1 on error.

    Tcl_Obj *SWIG_NewPointerObj(void *ptr, swig_type_info *ty, int flags)

    Creates a new Tcl pointer object. ptr is the pointer to convert, ty is the SWIG type descriptor structure that describes the type, and own is a flag reserved for future expansion.

    Both of these functions require the use of a special SWIG type-descriptor structure. This structure contains information about the mangled name of the datatype, type-equivalence information, as well as information about converting pointer values under C++ inheritance. For a type of Foo *, the type descriptor structure is usually accessed as follows:

    Foo *f;
    if (!SWIG_IsOK(SWIG_ConvertPtr($input, (void **) &f, SWIGTYPE_p_Foo, 0))) {
      SWIG_exception_fail(SWIG_TypeError, "in method '$symname', expecting type Foo");
    }
    
    Tcl_Obj *;
    obj = SWIG_NewPointerObj(f, SWIGTYPE_p_Foo, 0);
    

    In a typemap, the type descriptor should always be accessed using the special typemap variable $1_descriptor. For example:

    %typemap(in) Foo * {
      if (!SWIG_IsOK(SWIG_ConvertPtr($input, (void **) &$1, $1_descriptor, 0))) {
        SWIG_exception_fail(SWIG_TypeError, "in method '$symname', expecting type Foo");
      }
    }
    

    If necessary, the descriptor for any type can be obtained using the $descriptor() macro in a typemap. For example:

    %typemap(in) Foo * {
      if (!SWIG_IsOK(SWIG_ConvertPtr($input, (void **) &$1, $descriptor(Foo *), 0))) {
        SWIG_exception_fail(SWIG_TypeError, "in method '$symname', expecting type Foo");
      }
    }
    

    36.8 Turning a SWIG module into a Tcl Package.

    Tcl 7.4 introduced the idea of an extension package. By default, SWIG generates all of the code necessary to create a package. To set the package version, simply use the -pkgversion option. For example:

    % swig -tcl -pkgversion 2.3 example.i
    

    After building the SWIG generated module, you need to execute the "pkg_mkIndex" command inside tclsh. For example :

    unix > tclsh
    % pkg_mkIndex . example.so
    % exit
    

    This creates a file "pkgIndex.tcl" with information about the package. To use your package, you now need to move it to its own subdirectory which has the same name as the package. For example :

    ./example/
               pkgIndex.tcl           # The file created by pkg_mkIndex
               example.so             # The SWIG generated module
    

    Finally, assuming that you're not entirely confused at this point, make sure that the example subdirectory is visible from the directories contained in either the tcl_library or auto_path variables. At this point you're ready to use the package as follows :

    unix > tclsh
    % package require example
    % fact 4
    24
    %
    

    If you're working with an example in the current directory and this doesn't work, do this instead :

    unix > tclsh
    % lappend auto_path .
    % package require example
    % fact 4
    24
    

    As a final note, most SWIG examples do not yet use the package commands. For simple extensions it may be easier just to use the load command instead.

    36.9 Building new kinds of Tcl interfaces (in Tcl)

    One of the most interesting aspects of Tcl and SWIG is that you can create entirely new kinds of Tcl interfaces in Tcl using the low-level SWIG accessor functions. For example, suppose you had a library of helper functions to access arrays :

    /* File : array.i */
    %module array
    
    %inline %{
    double *new_double(int size) {
      return (double *) malloc(size*sizeof(double));
    }
    void delete_double(double *a) {
      free(a);
    }
    double get_double(double *a, int index) {
      return a[index];
    }
    void set_double(double *a, int index, double val) {
      a[index] = val;
    }
    int *new_int(int size) {
      return (int *) malloc(size*sizeof(int));
    }
    void delete_int(int *a) {
      free(a);
    }
    int get_int(int *a, int index) {
      return a[index];
    }
    int set_int(int *a, int index, int val) {
      a[index] = val;
    }
    %}
    
    

    While these could be called directly, we could also write a Tcl script like this :

    proc Array {type size} {
        set ptr [new_$type $size]
        set code {
            set method [lindex $args 0]
            set parms [concat $ptr [lrange $args 1 end]]
            switch $method {
                get {return [eval "get_$type $parms"]}
                set {return [eval "set_$type $parms"]}
                delete {eval "delete_$type $ptr; rename $ptr {}"}
            }
        }
        # Create a procedure
        uplevel "proc $ptr args {set ptr $ptr; set type $type;$code}"
        return $ptr
    }
    

    Our script allows easy array access as follows :

    set a [Array double 100]                   ;# Create a double [100]
    for {set i 0} {$i < 100} {incr i 1} {      ;# Clear the array
            $a set $i 0.0
    }
    $a set 3 3.1455                            ;# Set an individual element
    set b [$a get 10]                          ;# Retrieve an element
    
    set ia [Array int 50]                      ;# Create an int[50]
    for {set i 0} {$i < 50} {incr i 1} {       ;# Clear it
            $ia set $i 0
    }
    $ia set 3 7                                ;# Set an individual element
    set ib [$ia get 10]                        ;# Get an individual element
    
    $a delete                                  ;# Destroy a
    $ia delete                                 ;# Destroy ia
    

    The cool thing about this approach is that it makes a common interface for two different types of arrays. In fact, if we were to add more C datatypes to our wrapper file, the Tcl code would work with those as well--without modification. If an unsupported datatype was requested, the Tcl code would simply return with an error so there is very little danger of blowing something up (although it is easily accomplished with an out of bounds array access).

    36.9.1 Proxy classes

    A similar approach can be applied to proxy classes (also known as shadow classes). The following example is provided by Erik Bierwagen and Paul Saxe. To use it, run SWIG with the -noobject option (which disables the builtin object oriented interface). When running Tcl, simply source this file. Now, objects can be used in a more or less natural fashion.

    # swig_c++.tcl
    # Provides a simple object oriented interface using
    # SWIG's low level interface.
    #
    
    proc new {objectType handle_r args} {
        # Creates a new SWIG object of the given type,
        # returning a handle in the variable "handle_r".
        #
        # Also creates a procedure for the object and a trace on
        # the handle variable that deletes the object when the
        # handle variable is overwritten or unset
        upvar $handle_r handle
        #
        # Create the new object
        #
        eval set handle \[new_$objectType $args\]
        #
        # Set up the object procedure
        #
        proc $handle {cmd args} "eval ${objectType}_\$cmd $handle \$args"
        #
        # And the trace ...
        #
        uplevel trace variable $handle_r uw "{deleteObject $objectType $handle}"
        #
        # Return the handle so that 'new' can be used as an argument to a procedure
        #
        return $handle
    }
    
    proc deleteObject {objectType handle name element op} {
        #
        # Check that the object handle has a reasonable form
        #
        if {![regexp {_[0-9a-f]*_(.+)_p} $handle]} {
            error "deleteObject: not a valid object handle: $handle"
        }
        #
        # Remove the object procedure
        #
        catch {rename $handle {}}
        #
        # Delete the object
        #
        delete_$objectType $handle
    }
    
    proc delete {handle_r} {
        #
        # A synonym for unset that is more familiar to C++ programmers
        #
        uplevel unset $handle_r
    }
    

    To use this file, we simply source it and execute commands such as "new" and "delete" to manipulate objects. For example :

    // list.i
    %module List
    %{
    #include "list.h"
    %}
    
    // Very simple C++ example
    
    class List {
    public:
      List();  // Create a new list
      ~List(); // Destroy a list
      int  search(char *value);
      void insert(char *);  // Insert a new item into the list
      void remove(char *);  // Remove item from list
      char *get(int n);     // Get the nth item in the list
      int  length;          // The current length of the list
    static void print(List *l);  // Print out the contents of the list
    };
    

    Now a Tcl script using the interface...

    load ./list.so list       ; # Load the module
    source swig_c++.tcl       ; # Source the object file
    
    new List l
    $l insert Dave
    $l insert John
    $l insert Guido
    $l remove Dave
    puts $l length_get
    
    delete l
    

    The cool thing about this example is that it works with any C++ object wrapped by SWIG and requires no special compilation. Proof that a short, but clever Tcl script can be combined with SWIG to do many interesting things.

    36.10 Tcl/Tk Stubs

    For background information about the Tcl Stubs feature, see http://www.tcl.tk/doc/howto/stubs.html.

    As of SWIG 1.3.10, the generated C/C++ wrapper will use the Tcl Stubs feature if compiled with -DUSE_TCL_STUBS.

    As of SWIG 1.3.40, the generated C/C++ wrapper will use the Tk Stubs feature if compiled with -DUSE_TK_STUBS. Also, you can override the minimum version to support which is passed to Tcl_InitStubs() and Tk_InitStubs() with -DSWIG_TCL_STUBS_VERSION="8.3" or the version being compiled with using -DSWIG_TCL_STUBS_VERSION=TCL_VERSION.

    swig-4.0.1/Doc/Manual/Contents.html0000644000175000017500000026327213527234053016770 0ustar williamwilliam SWIG Users Manual

    SWIG Users Manual

    1 Preface

    2 Introduction

    3 Getting started on Windows

    4 Scripting Languages

    5 SWIG Basics

    6 SWIG and C++

    7 SWIG and C++11

    8 SWIG and C++14

    9 SWIG and C++17

    10 Preprocessing

    11 SWIG library

    12 Argument Handling

    13 Typemaps

    14 Customization Features

    15 Contracts

    16 Variable Length Arguments

    17 SWIG and Doxygen Translation

    18 Warning Messages

    19 Working with Modules

    20 Using SWIG with ccache - ccache-swig(1) manpage

    21 SWIG and Android

    22 SWIG and C#

    23 SWIG and D

    24 SWIG and Go

    25 SWIG and Guile

    26 SWIG and Java

    27 SWIG and Javascript

    28 SWIG and Lua

    29 SWIG and Octave

    30 SWIG and Perl5

    31 SWIG and PHP

    32 SWIG and Python

    33 SWIG and R

    34 SWIG and Ruby

    35 SWIG and Scilab

    36 SWIG and Tcl

    37 SWIG and MzScheme/Racket

    38 SWIG and OCaml

    39 Extending SWIG to support new languages

    swig-4.0.1/Doc/Manual/Scripting.html0000644000175000017500000003454313527234052017131 0ustar williamwilliam Scripting Languages

    4 Scripting Languages

    This chapter provides a brief overview of scripting language extension programming and the mechanisms by which scripting language interpreters access C and C++ code.

    4.1 The two language view of the world

    When a scripting language is used to control a C program, the resulting system tends to look as follows:

    Scripting language input - C/C++ functions output

    In this programming model, the scripting language interpreter is used for high level control whereas the underlying functionality of the C/C++ program is accessed through special scripting language "commands." If you have ever tried to write your own simple command interpreter, you might view the scripting language approach to be a highly advanced implementation of that. Likewise, If you have ever used a package such as MATLAB or IDL, it is a very similar model--the interpreter executes user commands and scripts. However, most of the underlying functionality is written in a low-level language like C or Fortran.

    The two-language model of computing is extremely powerful because it exploits the strengths of each language. C/C++ can be used for maximal performance and complicated systems programming tasks. Scripting languages can be used for rapid prototyping, interactive debugging, scripting, and access to high-level data structures such associative arrays.

    4.2 How does a scripting language talk to C?

    Scripting languages are built around a parser that knows how to execute commands and scripts. Within this parser, there is a mechanism for executing commands and accessing variables. Normally, this is used to implement the builtin features of the language. However, by extending the interpreter, it is usually possible to add new commands and variables. To do this, most languages define a special API for adding new commands. Furthermore, a special foreign function interface defines how these new commands are supposed to hook into the interpreter.

    Typically, when you add a new command to a scripting interpreter you need to do two things; first you need to write a special "wrapper" function that serves as the glue between the interpreter and the underlying C function. Then you need to give the interpreter information about the wrapper by providing details about the name of the function, arguments, and so forth. The next few sections illustrate the process.

    4.2.1 Wrapper functions

    Suppose you have an ordinary C function like this :

    int fact(int n) {
      if (n <= 1)
        return 1;
      else
        return n*fact(n-1);
    }
    

    In order to access this function from a scripting language, it is necessary to write a special "wrapper" function that serves as the glue between the scripting language and the underlying C function. A wrapper function must do three things :

    • Gather function arguments and make sure they are valid.
    • Call the C function.
    • Convert the return value into a form recognized by the scripting language.

    As an example, the Tcl wrapper function for the fact() function above example might look like the following :

    int wrap_fact(ClientData clientData, Tcl_Interp *interp, int argc, char *argv[]) {
      int result;
      int arg0;
      if (argc != 2) {
        interp->result = "wrong # args";
        return TCL_ERROR;
      }
      arg0 = atoi(argv[1]);
      result = fact(arg0);
      sprintf(interp->result, "%d", result);
      return TCL_OK;
    }
    
    

    Once you have created a wrapper function, the final step is to tell the scripting language about the new function. This is usually done in an initialization function called by the language when the module is loaded. For example, adding the above function to the Tcl interpreter requires code like the following :

    int Wrap_Init(Tcl_Interp *interp) {
      Tcl_CreateCommand(interp, "fact", wrap_fact, (ClientData) NULL,
                        (Tcl_CmdDeleteProc *) NULL);
      return TCL_OK;
    }
    

    When executed, Tcl will now have a new command called "fact" that you can use like any other Tcl command.

    Although the process of adding a new function to Tcl has been illustrated, the procedure is almost identical for Perl and Python. Both require special wrappers to be written and both need additional initialization code. Only the specific details are different.

    4.2.2 Variable linking

    Variable linking refers to the problem of mapping a C/C++ global variable to a variable in the scripting language interpreter. For example, suppose you had the following variable:

    double Foo = 3.5;
    

    It might be nice to access it from a script as follows (shown for Perl):

    $a = $Foo * 2.3;   # Evaluation
    $Foo = $a + 2.0;   # Assignment
    

    To provide such access, variables are commonly manipulated using a pair of get/set functions. For example, whenever the value of a variable is read, a "get" function is invoked. Similarly, whenever the value of a variable is changed, a "set" function is called.

    In many languages, calls to the get/set functions can be attached to evaluation and assignment operators. Therefore, evaluating a variable such as $Foo might implicitly call the get function. Similarly, typing $Foo = 4 would call the underlying set function to change the value.

    4.2.3 Constants

    In many cases, a C program or library may define a large collection of constants. For example:

    #define RED   0xff0000
    #define BLUE  0x0000ff
    #define GREEN 0x00ff00
    

    To make constants available, their values can be stored in scripting language variables such as $RED, $BLUE, and $GREEN. Virtually all scripting languages provide C functions for creating variables so installing constants is usually a trivial exercise.

    4.2.4 Structures and classes

    Although scripting languages have no trouble accessing simple functions and variables, accessing C/C++ structures and classes present a different problem. This is because the implementation of structures is largely related to the problem of data representation and layout. Furthermore, certain language features are difficult to map to an interpreter. For instance, what does C++ inheritance mean in a Perl interface?

    The most straightforward technique for handling structures is to implement a collection of accessor functions that hide the underlying representation of a structure. For example,

    struct Vector {
      Vector();
      ~Vector();
      double x, y, z;
    };
    
    

    can be transformed into the following set of functions :

    Vector *new_Vector();
    void delete_Vector(Vector *v);
    double Vector_x_get(Vector *v);
    double Vector_y_get(Vector *v);
    double Vector_z_get(Vector *v);
    void Vector_x_set(Vector *v, double x);
    void Vector_y_set(Vector *v, double y);
    void Vector_z_set(Vector *v, double z);
    
    

    Now, from an interpreter these function might be used as follows:

    % set v [new_Vector]
    % Vector_x_set $v 3.5
    % Vector_y_get $v
    % delete_Vector $v
    % ...
    

    Since accessor functions provide a mechanism for accessing the internals of an object, the interpreter does not need to know anything about the actual representation of a Vector.

    4.2.5 Proxy classes

    In certain cases, it is possible to use the low-level accessor functions to create a proxy class, also known as a shadow class. A proxy class is a special kind of object that gets created in a scripting language to access a C/C++ class (or struct) in a way that looks like the original structure (that is, it proxies the real C++ class). For example, if you have the following C++ definition :

    class Vector {
    public:
      Vector();
      ~Vector();
      double x, y, z;
    };
    

    A proxy classing mechanism would allow you to access the structure in a more natural manner from the interpreter. For example, in Python, you might want to do this:

    >>> v = Vector()
    >>> v.x = 3
    >>> v.y = 4
    >>> v.z = -13
    >>> ...
    >>> del v
    

    Similarly, in Perl5 you may want the interface to work like this:

    $v = new Vector;
    $v->{x} = 3;
    $v->{y} = 4;
    $v->{z} = -13;
    
    

    Finally, in Tcl :

    Vector v
    v configure -x 3 -y 4 -z -13
    
    

    When proxy classes are used, two objects are really at work--one in the scripting language, and an underlying C/C++ object. Operations affect both objects equally and for all practical purposes, it appears as if you are simply manipulating a C/C++ object.

    4.3 Building scripting language extensions

    The final step in using a scripting language with your C/C++ application is adding your extensions to the scripting language itself. There are two primary approaches for doing this. The preferred technique is to build a dynamically loadable extension in the form of a shared library. Alternatively, you can recompile the scripting language interpreter with your extensions added to it.

    4.3.1 Shared libraries and dynamic loading

    To create a shared library or DLL, you often need to look at the manual pages for your compiler and linker. However, the procedure for a few common platforms is shown below:

    # Build a shared library for Solaris
    gcc -fpic -c example.c example_wrap.c -I/usr/local/include
    ld -G example.o example_wrap.o -o example.so
    
    # Build a shared library for Linux
    gcc -fpic -c example.c example_wrap.c -I/usr/local/include
    gcc -shared example.o example_wrap.o -o example.so
    

    To use your shared library, you simply use the corresponding command in the scripting language (load, import, use, etc...). This will import your module and allow you to start using it. For example:

    % load ./example.so
    % fact 4
    24
    %
    

    When working with C++ codes, the process of building shared libraries may be more complicated--primarily due to the fact that C++ modules may need additional code in order to operate correctly. On many machines, you can build a shared C++ module by following the above procedures, but changing the link line to the following :

    c++ -shared example.o example_wrap.o -o example.so
    

    4.3.2 Linking with shared libraries

    When building extensions as shared libraries, it is not uncommon for your extension to rely upon other shared libraries on your machine. In order for the extension to work, it needs to be able to find all of these libraries at run-time. Otherwise, you may get an error such as the following :

    >>> import graph
    Traceback (innermost last):
      File "<stdin>", line 1, in ?
      File "/home/sci/data1/beazley/graph/graph.py", line 2, in ?
        import graphc
    ImportError:  1101:/home/sci/data1/beazley/bin/python: rld: Fatal Error: cannot 
    successfully map soname 'libgraph.so' under any of the filenames /usr/lib/libgraph.so:/
    lib/libgraph.so:/lib/cmplrs/cc/libgraph.so:/usr/lib/cmplrs/cc/libgraph.so:
    >>>
    

    What this error means is that the extension module created by SWIG depends upon a shared library called "libgraph.so" that the system was unable to locate. To fix this problem, there are a few approaches you can take.

    • Link your extension and explicitly tell the linker where the required libraries are located. Often times, this can be done with a special linker flag such as -R, -rpath, etc. This is not implemented in a standard manner so read the man pages for your linker to find out more about how to set the search path for shared libraries.
    • Put shared libraries in the same directory as the executable. This technique is sometimes required for correct operation on non-Unix platforms.
    • Set the UNIX environment variable LD_LIBRARY_PATH to the directory where shared libraries are located before running Python. Although this is an easy solution, it is not recommended. Consider setting the path using linker options instead.

    4.3.3 Static linking

    With static linking, you rebuild the scripting language interpreter with extensions. The process usually involves compiling a short main program that adds your customized commands to the language and starts the interpreter. You then link your program with a library to produce a new scripting language executable.

    Although static linking is supported on all platforms, this is not the preferred technique for building scripting language extensions. In fact, there are very few practical reasons for doing this--consider using shared libraries instead.

    swig-4.0.1/Doc/Manual/Modules.html0000644000175000017500000003336013527234052016573 0ustar williamwilliam Working with Modules

    19 Working with Modules

    19.1 Modules Introduction

    Each invocation of SWIG requires a module name to be specified. The module name is used to name the resulting target language extension module. Exactly what this means and what the name is used for depends on the target language, for example the name can define a target language namespace or merely be a useful name for naming files or helper classes. Essentially, a module comprises target language wrappers for a chosen collection of global variables/functions, structs/classes and other C/C++ types.

    The module name can be supplied in one of two ways. The first is to specify it with the special %module directive. This directive must appear at the beginning of the interface file. The general form of this directive is:

    %module(option1="value1", option2="value2", ...) modulename
    

    where the modulename is mandatory and the options add one or more optional additional features. Typically no options are specified, for example:

    %module mymodule
    

    The second way to specify the module name is with the -module command line option, for example -module mymodule. If the module name is supplied on the command line, it overrides the name specified by the %module directive.

    When first working with SWIG, users commonly start by creating a single module. That is, you might define a single SWIG interface that wraps some set of C/C++ code. You then compile all of the generated wrapper code together and use it. For large applications, however, this approach is problematic---the size of the generated wrapper code can be rather large. Moreover, it is probably easier to manage the target language interface when it is broken up into smaller pieces.

    This chapter describes the problem of using SWIG in programs where you want to create a collection of modules. Each module in the collection is created via separate invocations of SWIG.

    19.2 Basics

    The basic usage case with multiple modules is when modules do not have cross-references (ie. when wrapping multiple independent C APIs). In that case, swig input files should just work out of the box - you simply create multiple wrapper .cxx files, link them into your application, and insert/load each in the scripting language runtime as you would do for the single module case.

    A bit more complex is the case in which modules need to share information. For example, when one module extends the class of another by deriving from it:

    // File: base.h
    class base {
    public:
      int foo();
    };
    
     
    // File: base_module.i
    %module base_module
    
    %{
    #include "base.h"
    %}
    %include "base.h"
    
     
    // File: derived_module.i
    %module derived_module
    
    %import "base_module.i"
    
    %inline %{
    class derived : public base {
    public:
      int bar();
    };
    %}
    

    To create the wrapper properly, module derived_module needs to know about the base class and that its interface is covered in another module. The line %import "base_module.i" lets SWIG know exactly that. Often the .h file is passed to %import instead of the .i, which unfortunately doesn't work for all language modules. For example, Python requires the name of module that the base class exists in so that the proxy classes can fully inherit the base class's methods. Typically you will get a warning when the module name is missing, eg:

    derived_module.i:8: Warning 401: Base class 'base' ignored - unknown module name for base. Either
    import
    the appropriate module interface file or specify the name of the module in the %import directive.
    

    It is sometimes desirable to import the header file rather than the interface file and overcome the above warning. For example in the case of the imported interface being quite large, it may be desirable to simplify matters and just import a small header file of dependent types. This can be done by specifying the optional module attribute in the %import directive. The derived_module.i file shown above could be replaced with the following:

    // File: derived_module.i
    %module derived_module
    
    %import(module="base_module") "base.h"
    
    %inline %{
    class derived : public base {
    public:
      int bar();
    };
    

    Note that "base_module" is the module name and is the same as that specified in %module in base_module.i as well as the %import in derived_module.i.

    Another issue to beware of is that multiple dependent wrappers should not be linked/loaded in parallel from multiple threads as SWIG provides no locking - for more on that issue, read on.

    19.3 The SWIG runtime code

    Many of SWIG's target languages generate a set of functions commonly known as the "SWIG runtime." These functions are primarily related to the runtime type system which checks pointer types and performs other tasks such as proper casting of pointer values in C++. As a general rule, the statically typed target languages, such as Java, use the language's built in static type checking and have no need for a SWIG runtime. All the dynamically typed / interpreted languages rely on the SWIG runtime.

    The runtime functions are private to each SWIG-generated module. That is, the runtime functions are declared with "static" linkage and are visible only to the wrapper functions defined in that module. The only problem with this approach is that when more than one SWIG module is used in the same application, those modules often need to share type information. This is especially true for C++ programs where SWIG must collect and share information about inheritance relationships that cross module boundaries.

    To solve the problem of sharing information across modules, a pointer to the type information is stored in a global variable in the target language namespace. During module initialization, type information is loaded into the global data structure of type information from all modules.

    There are a few trade offs with this approach. This type information is global across all SWIG modules loaded, and can cause type conflicts between modules that were not designed to work together. To solve this approach, the SWIG runtime code uses a define SWIG_TYPE_TABLE to provide a unique type table. This behavior can be enabled when compiling the generated _wrap.cxx or _wrap.c file by adding -DSWIG_TYPE_TABLE=myprojectname to the command line argument.

    Then, only modules compiled with SWIG_TYPE_TABLE set to myprojectname will share type information. So if your project has three modules, all three should be compiled with -DSWIG_TYPE_TABLE=myprojectname, and then these three modules will share type information. But any other project's types will not interfere or clash with the types in your module.

    Another issue relating to the global type table is thread safety. If two modules try and load at the same time, the type information can become corrupt. SWIG currently does not provide any locking, and if you use threads, you must make sure that modules are loaded serially. Be careful if you use threads and the automatic module loading that some scripting languages provide. One solution is to load all modules before spawning any threads, or use SWIG_TYPE_TABLE to separate type tables so they do not clash with each other.

    Lastly, SWIG uses a #define SWIG_RUNTIME_VERSION, located in Lib/swigrun.swg and near the top of every generated module. This number gets incremented when the data structures change, so that SWIG modules generated with different versions can peacefully coexist. So the type structures are separated by the (SWIG_TYPE_TABLE, SWIG_RUNTIME_VERSION) pair, where by default SWIG_TYPE_TABLE is empty. Only modules compiled with the same pair will share type information.

    19.4 External access to the runtime

    As described in The run-time type checker, the functions SWIG_TypeQuery, SWIG_NewPointerObj, and others sometimes need to be called. Calling these functions from a typemap is supported, since the typemap code is embedded into the _wrap.c file, which has those declarations available. If you need to call the SWIG run-time functions from another C file, there is one header you need to include. To generate the header that needs to be included, SWIG can be run in a different mode via -external-runtime to generate the run-time instead of the normal mode of processing an input interface file. For example:

    $ swig -python -external-runtime <filename>
    

    The filename argument is optional and if it is not passed, then the default filename will be something like swigpyrun.h, depending on the language. This header file should be treated like any of the other _wrap.c output files, and should be regenerated when the _wrap files are. After including this header, your code will be able to call SWIG_TypeQuery, SWIG_NewPointerObj, SWIG_ConvertPtr and others. The exact argument parameters for these functions might differ between language modules; please check the language module chapters for more information.

    Inside this header the functions are declared static and are included inline into the file, and thus the file does not need to be linked against any SWIG libraries or code (you might still need to link against the language libraries like libpython-2.3). Data is shared between this file and the _wrap.c files through a global variable in the scripting language. It is also possible to copy this header file along with the generated wrapper files into your own package, so that you can distribute a package that can be compiled without SWIG installed (this works because the header file is self-contained, and does not need to link with anything).

    This header will also use the -DSWIG_TYPE_TABLE described above, so when compiling any code which includes the generated header file should define the SWIG_TYPE_TABLE to be the same as the module whose types you are trying to access.

    19.5 A word of caution about static libraries

    When working with multiple SWIG modules, you should take care not to use static libraries. For example, if you have a static library libfoo.a and you link a collection of SWIG modules with that library, each module will get its own private copy of the library code inserted into it. This is very often NOT what you want and it can lead to unexpected or bizarre program behavior. When working with dynamically loadable modules, you should try to work exclusively with shared libraries.

    19.6 References

    Due to the complexity of working with shared libraries and multiple modules, it might be a good idea to consult an outside reference. John Levine's "Linkers and Loaders" is highly recommended.

    19.7 Reducing the wrapper file size

    Using multiple modules with the %import directive is the most common approach to modularising large projects. In this way a number of different wrapper files can be generated, thereby avoiding the generation of a single large wrapper file. There are a couple of alternative solutions for reducing the size of a wrapper file through the use of command line options and features.

    -fcompact
    This command line option will compact the size of the wrapper file without changing the code generated into the wrapper file. It simply removes blank lines and joins lines of code together. This is useful for compilers that have a maximum file size that can be handled.

    -fvirtual
    This command line option will remove the generation of superfluous virtual method wrappers. Consider the following inheritance hierarchy:

    struct Base {
      virtual void method();
      ...
    };
    
    struct Derived : Base {
      virtual void method();
      ...
    };
    

    Normally wrappers are generated for both methods, whereas this command line option will suppress the generation of a wrapper for Derived::method. Normal polymorphic behaviour remains as Derived::method will still be called should you have a Derived instance and call the wrapper for Base::method.

    %feature("compactdefaultargs")
    This feature can reduce the number of wrapper methods when wrapping methods with default arguments. The section on default arguments discusses the feature and its limitations.

    swig-4.0.1/Doc/Manual/Typemaps.html0000644000175000017500000044352413527234052016774 0ustar williamwilliam Typemaps

    13 Typemaps

    13.1 Introduction

    Chances are, you are reading this chapter for one of two reasons; you either want to customize SWIG's behavior or you overheard someone mumbling some incomprehensible drivel about "typemaps" and you asked yourself "typemaps, what are those?" That said, let's start with a short disclaimer that "typemaps" are an advanced customization feature that provide direct access to SWIG's low-level code generator. Not only that, they are an integral part of the SWIG C++ type system (a non-trivial topic of its own). Typemaps are generally not a required part of using SWIG. Therefore, you might want to re-read the earlier chapters if you have found your way to this chapter with only a vague idea of what SWIG already does by default.

    13.1.1 Type conversion

    One of the most important problems in wrapper code generation is the conversion or marshalling of datatypes between programming languages. Specifically, for every C/C++ declaration, SWIG must somehow generate wrapper code that allows values to be passed back and forth between languages. Since every programming language represents data differently, this is not a simple of matter of simply linking code together with the C linker. Instead, SWIG has to know something about how data is represented in each language and how it can be manipulated.

    To illustrate, suppose you had a simple C function like this:

    int factorial(int n);
    

    To access this function from Python, a pair of Python API functions are used to convert integer values. For example:

    long PyInt_AsLong(PyObject *obj);      /* Python --> C */
    PyObject *PyInt_FromLong(long x);      /* C --> Python */
    

    The first function is used to convert the input argument from a Python integer object to C long. The second function is used to convert a value from C back into a Python integer object.

    Inside the wrapper function, you might see these functions used like this:

    PyObject *wrap_factorial(PyObject *self, PyObject *args) {
      int       arg1;
      int       result;
      PyObject *obj1;
      PyObject *resultobj;
    
      if (!PyArg_ParseTuple("O:factorial", &obj1)) return NULL;
      arg1 = PyInt_AsLong(obj1);
      result = factorial(arg1);
      resultobj = PyInt_FromLong(result);
      return resultobj;
    }
    

    Every target language supported by SWIG has functions that work in a similar manner. For example, in Perl, the following functions are used:

    IV SvIV(SV *sv);                     /* Perl --> C */
    void sv_setiv(SV *sv, IV val);       /* C --> Perl */
    

    In Tcl:

    int Tcl_GetLongFromObj(Tcl_Interp *interp, Tcl_Obj *obj, long *value);
    Tcl_Obj *Tcl_NewIntObj(long value);
    

    The precise details are not so important. What is important is that all of the underlying type conversion is handled by collections of utility functions and short bits of C code like this---you simply have to read the extension documentation for your favorite language to know how it works (an exercise left to the reader).

    13.1.2 Typemaps

    Since type handling is so central to wrapper code generation, SWIG allows it to be completely defined (or redefined) by the user. To do this, a special %typemap directive is used. For example:

    /* Convert from Python --> C */
    %typemap(in) int {
      $1 = PyInt_AsLong($input);
    }
    
    /* Convert from C --> Python */
    %typemap(out) int {
      $result = PyInt_FromLong($1);
    }
    

    At first glance, this code will look a little confusing. However, there is really not much to it. The first typemap (the "in" typemap) is used to convert a value from the target language to C. The second typemap (the "out" typemap) is used to convert in the other direction. The content of each typemap is a small fragment of code that is inserted directly into the SWIG generated wrapper functions. The code is usually C or C++ code which will be generated into the C/C++ wrapper functions. Note that this isn't always the case as some target language modules allow target language code within the typemaps which gets generated into target language specific files. Within this code, a number of special variables prefixed with a $ are expanded. These are really just placeholders for C/C++ variables that are generated in the course of creating the wrapper function. In this case, $input refers to an input object that needs to be converted to C/C++ and $result refers to an object that is going to be returned by a wrapper function. $1 refers to a C/C++ variable that has the same type as specified in the typemap declaration (an int in this example).

    A short example might make this a little more clear. If you were wrapping a function like this:

    int gcd(int x, int y);
    

    A wrapper function would look approximately like this:

    PyObject *wrap_gcd(PyObject *self, PyObject *args) {
      int arg1;
      int arg2;
      int result;
      PyObject *obj1;
      PyObject *obj2;
      PyObject *resultobj;
    
      if (!PyArg_ParseTuple("OO:gcd", &obj1, &obj2)) return NULL;
    
      /* "in" typemap, argument 1 */
      {
        arg1 = PyInt_AsLong(obj1);
      }
    
      /* "in" typemap, argument 2 */
      {
        arg2 = PyInt_AsLong(obj2);
      }
    
      result = gcd(arg1, arg2);
    
      /* "out" typemap, return value */
      {
        resultobj = PyInt_FromLong(result);
      }
    
      return resultobj;
    }
    

    In this code, you can see how the typemap code has been inserted into the function. You can also see how the special $ variables have been expanded to match certain variable names inside the wrapper function. This is really the whole idea behind typemaps--they simply let you insert arbitrary code into different parts of the generated wrapper functions. Because arbitrary code can be inserted, it possible to completely change the way in which values are converted.

    13.1.3 Pattern matching

    As the name implies, the purpose of a typemap is to "map" C datatypes to types in the target language. Once a typemap is defined for a C datatype, it is applied to all future occurrences of that type in the input file. For example:

    /* Convert from Perl --> C */
    %typemap(in) int {
      $1 = SvIV($input);
    }
    
    ...
    int factorial(int n);
    int gcd(int x, int y);
    int count(char *s, char *t, int max);
    

    The matching of typemaps to C datatypes is more than a simple textual match. In fact, typemaps are fully built into the underlying type system. Therefore, typemaps are unaffected by typedef, namespaces, and other declarations that might hide the underlying type. For example, you could have code like this:

    /* Convert from Ruby--> C */
    %typemap(in) int {
      $1 = NUM2INT($input);
    }
    ...
    typedef int Integer;
    namespace foo {
      typedef Integer Number;
    };
    
    int foo(int x);
    int bar(Integer y);
    int spam(foo::Number a, foo::Number b);
    

    In this case, the typemap is still applied to the proper arguments even though typenames don't always match the text "int". This ability to track types is a critical part of SWIG--in fact, all of the target language modules work merely define a family of typemaps for the basic types. Yet, it is never necessary to write new typemaps for typenames introduced by typedef.

    In addition to tracking typenames, typemaps may also be specialized to match against a specific argument name. For example, you could write a typemap like this:

    %typemap(in) double nonnegative {
      $1 = PyFloat_AsDouble($input);
      if ($1 < 0) {
        PyErr_SetString(PyExc_ValueError, "argument must be nonnegative.");
        SWIG_fail;
      }
    }
    
    ...
    double sin(double x);
    double cos(double x);
    double sqrt(double nonnegative);
    
    typedef double Real;
    double log(Real nonnegative);
    ...
    

    For certain tasks such as input argument conversion, typemaps can be defined for sequences of consecutive arguments. For example:

    %typemap(in) (char *str, int len) {
      $1 = PyString_AsString($input);   /* char *str */
      $2 = PyString_Size($input);       /* int len   */
    }
    ...
    int count(char *str, int len, char c);
    

    In this case, a single input object is expanded into a pair of C arguments. This example also provides a hint to the unusual variable naming scheme involving $1, $2, and so forth.

    13.1.4 Reusing typemaps

    Typemaps are normally defined for specific type and argument name patterns. However, typemaps can also be copied and reused. One way to do this is to use assignment like this:

    %typemap(in) Integer = int;   
    %typemap(in) (char *buffer, int size) = (char *str, int len);
    

    There is a more powerful way to copy a family of typemaps though. Consider the following family of two typemap methods, "in" and "out" for type int:

    %typemap(in) int {
      /* Convert an integer argument */
      ...
    }
    %typemap(out) int {
      /* Return an integer value */
      ...
    }
    

    Each of the two typemap methods could be copied individually for type size_t as follows:

    /* Apply all of the int typemaps to size_t */
    %typemap(in) size_t = int;   
    %typemap(out) size_t = int;   
    

    A more powerful form of copying is available from the %apply directive. The code below is identical to the above:

    /* Apply all of the int typemaps to size_t */
    %apply int { size_t };    
    

    %apply merely takes all of the typemaps that are defined for one type and applies them to other types. Note: you can include a comma separated set of types in the { ... } part of %apply.

    It should be noted that it is not necessary to copy typemaps for types that are related by typedef. For example, if you have this,

    typedef int size_t;
    

    then SWIG already knows that the int typemaps apply. You don't have to do anything.

    13.1.5 What can be done with typemaps?

    The primary use of typemaps is for defining wrapper generation behavior at the level of individual C/C++ datatypes. There are currently six general categories of problems that typemaps address:

    Argument handling

    int foo(int x, double y, char *s);
    
    • Input argument conversion ("in" typemap).
    • Input argument type checking for types used in overloaded methods ("typecheck" typemap).
    • Output argument handling ("argout" typemap).
    • Input argument value checking ("check" typemap).
    • Input argument initialization ("arginit" typemap).
    • Default arguments ("default" typemap).
    • Input argument resource management ("freearg" typemap).

    Return value handling

    int foo(int x, double y, char *s);
    
    • Function return value conversion ("out" typemap).
    • Return value resource management ("ret" typemap).
    • Resource management for newly allocated objects ("newfree" typemap).

    Exception handling

    int foo(int x, double y, char *s) throw(MemoryError, IndexError);
    
    • Handling of C++ exception specifications. ("throw" typemap).

    Global variables

    int foo;
    
    • Assignment of a global variable. ("varin" typemap).
    • Reading a global variable. ("varout" typemap).

    Member variables

    struct Foo {
      int x[20];
    };
    
    • Assignment of data to a class/structure member. ("memberin" typemap).

    Constant creation

    #define FOO 3
    %constant int BAR = 42;
    enum { ALE, LAGER, STOUT };
    
    • Creation of constant values. ("consttab" or "constcode" typemap).

    Details of each of these typemaps will be covered shortly. Also, certain language modules may define additional typemaps that expand upon this list. For example, the Java module defines a variety of typemaps for controlling additional aspects of the Java bindings. Consult language specific documentation for further details.

    13.1.6 What can't be done with typemaps?

    Typemaps can't be used to define properties that apply to C/C++ declarations as a whole. For example, suppose you had a declaration like this,

    Foo *make_Foo(int n);
    

    and you wanted to tell SWIG that make_Foo(int n) returned a newly allocated object (for the purposes of providing better memory management). Clearly, this property of make_Foo(int n) is not a property that would be associated with the datatype Foo * by itself. Therefore, a completely different SWIG customization mechanism (%feature) is used for this purpose. Consult the Customization Features chapter for more information about that.

    Typemaps also can't be used to rearrange or transform the order of arguments. For example, if you had a function like this:

    void foo(int, char *);
    

    you can't use typemaps to interchange the arguments, allowing you to call the function like this:

    foo("hello", 3)          # Reversed arguments
    

    If you want to change the calling conventions of a function, write a helper function instead. For example:

    %rename(foo) wrap_foo;
    %inline %{
    void wrap_foo(char *s, int x) {
      foo(x, s);
    }
    %}
    

    13.1.7 Similarities to Aspect Oriented Programming

    SWIG has parallels to Aspect Oriented Software Development (AOP). The AOP terminology with respect to SWIG typemaps can be viewed as follows:

    • Cross-cutting concerns: The cross-cutting concerns are the modularization of the functionality that the typemaps implement, which is primarily marshalling of types from/to the target language and C/C++.
    • Advice: The typemap body contains code which is executed whenever the marshalling is required.
    • Pointcut: The pointcuts are the positions in the wrapper code that the typemap code is generated into.
    • Aspect: Aspects are the combination of the pointcut and the advice, hence each typemap is an aspect.

    SWIG can also be viewed as has having a second set of aspects based around %feature. Features such as %exception are also cross-cutting concerns as they encapsulate code that can be used to add logging or exception handling to any function.

    13.1.8 The rest of this chapter

    The rest of this chapter provides detailed information for people who want to write new typemaps. This information is of particular importance to anyone who intends to write a new SWIG target language module. Power users can also use this information to write application specific type conversion rules.

    Since typemaps are strongly tied to the underlying C++ type system, subsequent sections assume that you are reasonably familiar with the basic details of values, pointers, references, arrays, type qualifiers (e.g., const), structures, namespaces, templates, and memory management in C/C++. If not, you would be well-advised to consult a copy of "The C Programming Language" by Kernighan and Ritchie or "The C++ Programming Language" by Stroustrup before going any further.

    13.2 Typemap specifications

    This section describes the behavior of the %typemap directive itself.

    13.2.1 Defining a typemap

    New typemaps are defined using the %typemap declaration. The general form of this declaration is as follows (parts enclosed in [ ... ] are optional):

    %typemap(method [, modifiers]) typelist code ;
    

    method is a simply a name that specifies what kind of typemap is being defined. It is usually a name like "in", "out", or "argout". The purpose of these methods is described later.

    modifiers is an optional comma separated list of name="value" values. These are sometimes to attach extra information to a typemap and is often target-language dependent. They are also known as typemap attributes.

    typelist is a list of the C++ type patterns that the typemap will match. The general form of this list is as follows:

    typelist    :  typepattern [, typepattern, typepattern, ... ] ;
    
    typepattern :  type [ (parms) ]
                |  type name [ (parms) ]
                |  ( typelist ) [ (parms) ]
    
    

    Each type pattern is either a simple type, a simple type and argument name, or a list of types in the case of multi-argument typemaps. In addition, each type pattern can be parameterized with a list of temporary variables (parms). The purpose of these variables will be explained shortly.

    code specifies the code used in the typemap. Usually this is C/C++ code, but in the statically typed target languages, such as Java and C#, this can contain target language code for certain typemaps. It can take any one of the following forms:

    code       : { ... }
               | " ... "
               | %{ ... %}
    

    Note that the preprocessor will expand code within the {} delimiters, but not in the last two styles of delimiters, see Preprocessor and Typemaps. Here are some examples of valid typemap specifications:

    /* Simple typemap declarations */
    %typemap(in) int {
      $1 = PyInt_AsLong($input);
    }
    %typemap(in) int "$1 = PyInt_AsLong($input);";
    %typemap(in) int %{ 
      $1 = PyInt_AsLong($input);
    %}
    
    /* Typemap with extra argument name */
    %typemap(in) int nonnegative {
      ...
    }
    
    /* Multiple types in one typemap */
    %typemap(in) int, short, long { 
      $1 = SvIV($input);
    }
    
    /* Typemap with modifiers */
    %typemap(in, doc="integer") int "$1 = scm_to_int($input);";
    
    /* Typemap applied to patterns of multiple arguments */
    %typemap(in) (char *str, int len),
                 (char *buffer, int size)
    {
      $1 = PyString_AsString($input);
      $2 = PyString_Size($input);
    }
    
    /* Typemap with extra pattern parameters */
    %typemap(in, numinputs=0) int *output (int temp),
                              long *output (long temp)
    {
      $1 = &temp;
    }
    

    Admittedly, it's not the most readable syntax at first glance. However, the purpose of the individual pieces will become clear.

    13.2.2 Typemap scope

    Once defined, a typemap remains in effect for all of the declarations that follow. A typemap may be redefined for different sections of an input file. For example:

    // typemap1
    %typemap(in) int {
    ...
    }
    
    int fact(int);                    // typemap1
    int gcd(int x, int y);            // typemap1
    
    // typemap2
    %typemap(in) int {
    ...
    }
    
    int isprime(int);                 // typemap2
    

    One exception to the typemap scoping rules pertains to the %extend declaration. %extend is used to attach new declarations to a class or structure definition. Because of this, all of the declarations in an %extend block are subject to the typemap rules that are in effect at the point where the class itself is defined. For example:

    class Foo {
      ...
    };
    
    %typemap(in) int {
     ...
    }
    
    %extend Foo {
      int blah(int x);    // typemap has no effect.  Declaration is attached to Foo which
                          // appears before the %typemap declaration.
    };
    

    13.2.3 Copying a typemap

    A typemap is copied by using assignment. For example:

    %typemap(in) Integer = int;
    

    or this:

    %typemap(in) Integer, Number, int32_t = int;
    

    Types are often managed by a collection of different typemaps. For example:

    %typemap(in)     int { ... }
    %typemap(out)    int { ... }
    %typemap(varin)  int { ... }
    %typemap(varout) int { ... }
    

    To copy all of these typemaps to a new type, use %apply. For example:

    %apply int { Integer };            // Copy all int typemaps to Integer
    %apply int { Integer, Number };    // Copy all int typemaps to both Integer and Number
    

    The patterns for %apply follow the same rules as for %typemap. For example:

    %apply int *output { Integer *output };                    // Typemap with name
    %apply (char *buf, int len) { (char *buffer, int size) };  // Multiple arguments
    

    13.2.4 Deleting a typemap

    A particular typemap can be deleted / cleared by simply defining no code. For example:

    %typemap(in) int;                 // Clears the "in" typemap for int
    %typemap(in) int, long, short;    // Clears the "in" typemap for int, long, short
    %typemap(in) int *output;       
    

    The above syntax deletes a typemap for just one typemap method - the "in" method in each of the examples above. The %clear directive is more powerful and will delete / clear a family of typemaps, that is, all the typemap methods for a given type. For example:

    %clear int;                       // Delete all typemaps ("in", "out", "varin", ...) for int
    %clear int *output, long *output;
    

    Note: Since SWIG's default behavior is defined by typemaps, clearing a fundamental type like int will make that type unusable unless you also define a new family of typemaps immediately after the clear operation.

    13.2.5 Placement of typemaps

    Typemap declarations can be declared in the global scope, within a C++ namespace, and within a C++ class. For example:

    %typemap(in) int {
      ...
    }
    
    namespace std {
      class string;
      %typemap(in) string {
        ...
      }
    }
    
    class Bar {
    public:
      typedef const int & const_reference;
      %typemap(out) const_reference {
        ...
      }
    };
    

    When a typemap appears inside a namespace or class, it stays in effect until the end of the SWIG input (just like before). However, the typemap takes the local scope into account. Therefore, this code

    namespace std {
      class string;
      %typemap(in) string {
        ...
      }
    }
    

    is really defining a typemap for the type std::string. You could have code like this:

    namespace std {
      class string;
      %typemap(in) string {          /* std::string */
        ...
      }
    }
    
    namespace Foo {
      class string;
      %typemap(in) string {          /* Foo::string */
        ...
      }
    }
    

    In this case, there are two completely distinct typemaps that apply to two completely different types (std::string and Foo::string).

    It should be noted that for scoping to work, SWIG has to know that string is a typename defined within a particular namespace. In this example, this is done using the forward class declaration class string.

    13.3 Pattern matching rules

    The section describes the pattern matching rules by which C/C++ datatypes are associated with typemaps. The matching rules can be observed in practice by using the debugging options also described.

    13.3.1 Basic matching rules

    Typemaps are matched using both a type and a name (typically the name of a argument). For a given TYPE NAME pair, the following rules are applied, in order, to find a match. The first typemap found is used.

    • Typemaps that exactly match TYPE and NAME.
    • Typemaps that exactly match TYPE only.
    • If TYPE is a C++ template of type T< TPARMS >, where TPARMS are the template parameters, the type is stripped of the template parameters and the following checks are then made:
      • Typemaps that exactly match T and NAME.
      • Typemaps that exactly match T only.

    If TYPE includes qualifiers (const, volatile, etc.), each qualifier is stripped one at a time to form a new stripped type and the matching rules above are repeated on the stripped type. The left-most qualifier is stripped first, resulting in the right-most (or top-level) qualifier being stripped last. For example int const*const is first stripped to int *const then int *.

    If TYPE is an array. The following transformation is made:

    • Replace all dimensions to [ANY] and look for a generic array typemap.

    To illustrate, suppose that you had a function like this:

    int foo(const char *s);
    

    To find a typemap for the argument const char *s, SWIG will search for the following typemaps:

    const char *s           Exact type and name match
    const char *            Exact type match
    char *s                 Type and name match (qualifier stripped)
    char *                  Type match (qualifier stripped)
    

    When more than one typemap rule might be defined, only the first match found is actually used. Here is an example that shows how some of the basic rules are applied:

    %typemap(in) int *x {
      ... typemap 1
    }
    
    %typemap(in) int * {
      ... typemap 2
    }
    
    %typemap(in) const int *z {
      ... typemap 3
    }
    
    %typemap(in) int [4] {
      ... typemap 4
    }
    
    %typemap(in) int [ANY] {
      ... typemap 5
    }
    
    void A(int *x);        // int *x rule       (typemap 1)
    void B(int *y);        // int * rule        (typemap 2)
    void C(const int *x);  // int *x rule       (typemap 1)
    void D(const int *z);  // const int *z rule (typemap 3)
    void E(int x[4]);      // int [4] rule      (typemap 4)
    void F(int x[1000]);   // int [ANY] rule    (typemap 5)
    

    Compatibility note: SWIG-2.0.0 introduced stripping the qualifiers one step at a time. Prior versions stripped all qualifiers in one step.

    13.3.2 Typedef reductions matching

    If no match is found using the rules in the previous section, SWIG applies a typedef reduction to the type and repeats the typemap search for the reduced type. To illustrate, suppose you had code like this:

    %typemap(in) int {
      ... typemap 1
    }
    
    typedef int Integer;
    void blah(Integer x);
    

    To find the typemap for Integer x, SWIG will first search for the following typemaps:

    Integer x
    Integer
    

    Finding no match, it then applies a reduction Integer -> int to the type and repeats the search.

    int x
    int      --> match: typemap 1
    

    Even though two types might be the same via typedef, SWIG allows typemaps to be defined for each typename independently. This allows for interesting customization possibilities based solely on the typename itself. For example, you could write code like this:

    typedef double  pdouble;     // Positive double
    
    // typemap 1
    %typemap(in) double {
      ... get a double ...
    }
    // typemap 2
    %typemap(in) pdouble {
      ... get a positive double ...
    }
    double sin(double x);           // typemap 1
    pdouble sqrt(pdouble x);        // typemap 2
    

    When reducing the type, only one typedef reduction is applied at a time. The search process continues to apply reductions until a match is found or until no more reductions can be made.

    For complicated types, the reduction process can generate a long list of patterns. Consider the following:

    typedef int Integer;
    typedef Integer Row4[4];
    void foo(Row4 rows[10]);
    

    To find a match for the Row4 rows[10] argument, SWIG would check the following patterns, stopping only when it found a match:

    Row4 rows[10]
    Row4 [10]
    Row4 rows[ANY]
    Row4 [ANY]
    
    # Reduce Row4 --> Integer[4]
    Integer rows[10][4]
    Integer [10][4]
    Integer rows[ANY][ANY]
    Integer [ANY][ANY]
    
    # Reduce Integer --> int
    int rows[10][4]
    int [10][4]
    int rows[ANY][ANY]
    int [ANY][ANY]
    

    For parameterized types like templates, the situation is even more complicated. Suppose you had some declarations like this:

    typedef int Integer;
    typedef foo<Integer, Integer> fooii;
    void blah(fooii *x);
    

    In this case, the following typemap patterns are searched for the argument fooii *x:

    fooii *x
    fooii *
    
    # Reduce fooii --> foo<Integer, Integer>
    foo<Integer, Integer> *x
    foo<Integer, Integer> *
    
    # Reduce Integer -> int
    foo<int, Integer> *x
    foo<int, Integer> *
    
    # Reduce Integer -> int
    foo<int, int> *x
    foo<int, int> *
    

    Typemap reductions are always applied to the left-most type that appears. Only when no reductions can be made to the left-most type are reductions made to other parts of the type. This behavior means that you could define a typemap for foo<int, Integer>, but a typemap for foo<Integer, int> would never be matched. Admittedly, this is rather esoteric--there's little practical reason to write a typemap quite like that. Of course, you could rely on this to confuse your coworkers even more.

    As a point of clarification, it is worth emphasizing that typedef matching is a typedef reduction process only, that is, SWIG does not search for every single possible typedef. Given a type in a declaration, it will only reduce the type, it won't build it up looking for typedefs. For example, given the type Struct, the typemap below will not be used for the aStruct parameter, because Struct is fully reduced:

    struct Struct {...};
    typedef Struct StructTypedef;
    
    %typemap(in) StructTypedef { 
      ...
    }
    
    void go(Struct aStruct);
    

    13.3.3 Default typemap matching rules

    If the basic pattern matching rules result in no match being made, even after typedef reductions, the default typemap matching rules are used to look for a suitable typemap match. These rules match a generic typemap based on the reserved SWIGTYPE base type. For example pointers will use SWIGTYPE * and references will use SWIGTYPE &. More precisely, the rules are based on the C++ class template partial specialization matching rules used by C++ compilers when looking for an appropriate partial template specialization. This means that a match is chosen from the most specialized set of generic typemap types available. For example, when looking for a match to int const *, the rules will prefer to match SWIGTYPE const * if available before matching SWIGTYPE *, before matching SWIGTYPE.

    Most SWIG language modules use typemaps to define the default behavior of the C primitive types. This is entirely straightforward. For example, a set of typemaps for primitives marshalled by value or const reference are written like this:

    %typemap(in) int           "... convert to int ...";
    %typemap(in) short         "... convert to short ...";
    %typemap(in) float         "... convert to float ...";
    ...
    %typemap(in) const int &   "... convert ...";
    %typemap(in) const short & "... convert ...";
    %typemap(in) const float & "... convert ...";
    ...
    

    Since typemap matching follows all typedef declarations, any sort of type that is mapped to a primitive type by value or const reference through typedef will be picked up by one of these primitive typemaps. Most language modules also define typemaps for char pointers and char arrays to handle strings, so these non-default types will also be used in preference as the basic typemap matching rules provide a better match than the default typemap matching rules.

    Below is a list of the typical default types supplied by language modules, showing what the "in" typemap would look like:

    %typemap(in) SWIGTYPE &            { ... default reference handling ...                       };
    %typemap(in) SWIGTYPE *            { ... default pointer handling ...                         };
    %typemap(in) SWIGTYPE *const       { ... default pointer const handling ...                   };
    %typemap(in) SWIGTYPE *const&      { ... default pointer const reference handling ...         };
    %typemap(in) SWIGTYPE[ANY]         { ... 1D fixed size arrays handling ...                    };
    %typemap(in) SWIGTYPE []           { ... unknown sized array handling ...                     };
    %typemap(in) enum SWIGTYPE         { ... default handling for enum values ...                 };
    %typemap(in) const enum SWIGTYPE & { ... default handling for const enum reference values ... };
    %typemap(in) SWIGTYPE (CLASS::*)   { ... default pointer member handling ...                  };
    %typemap(in) SWIGTYPE              { ... simple default handling ...                          };
    

    If you wanted to change SWIG's default handling for simple pointers, you would simply redefine the rule for SWIGTYPE *. Note, the simple default typemap rule is used to match against simple types that don't match any other rules:

    %typemap(in) SWIGTYPE              { ... simple default handling ...                          } 
    

    This typemap is important because it is the rule that gets triggered when call or return by value is used. For instance, if you have a declaration like this:

    double dot_product(Vector a, Vector b);
    

    The Vector type will usually just get matched against SWIGTYPE. The default implementation of SWIGTYPE is to convert the value into pointers (as described in this earlier section).

    By redefining SWIGTYPE it may be possible to implement other behavior. For example, if you cleared all typemaps for SWIGTYPE, SWIG simply won't wrap any unknown datatype (which might be useful for debugging). Alternatively, you might modify SWIGTYPE to marshal objects into strings instead of converting them to pointers.

    Let's consider an example where the following typemaps are defined and SWIG is looking for the best match for the enum shown below:

    %typemap(in) const Hello &          { ... }
    %typemap(in) const enum SWIGTYPE &  { ... }
    %typemap(in) enum SWIGTYPE &        { ... }
    %typemap(in) SWIGTYPE &             { ... }
    %typemap(in) SWIGTYPE               { ... }
    
    enum Hello {};
    const Hello &hi;
    

    The typemap at the top of the list will be chosen, not because it is defined first, but because it is the closest match for the type being wrapped. If any of the typemaps in the above list were not defined, then the next one on the list would have precedence.

    The best way to explore the default typemaps is to look at the ones already defined for a particular language module. Typemap definitions are usually found in the SWIG library in a file such as java.swg, csharp.swg etc. However, for many of the target languages the typemaps are hidden behind complicated macros, so the best way to view the default typemaps, or any typemaps for that matter, is to look at the preprocessed output by running swig -E on any interface file. Finally the best way to view the typemap matching rules in action is via the debugging typemap pattern matching options covered later on.

    Compatibility note: The default typemap matching rules were modified in SWIG-2.0.0 from a slightly simpler scheme to match the current C++ class template partial specialization matching rules.

    13.3.4 Multi-arguments typemaps

    When multi-argument typemaps are specified, they take precedence over any typemaps specified for a single type. For example:

    %typemap(in) (char *buffer, int len) {
      // typemap 1
    }
    
    %typemap(in) char *buffer {
      // typemap 2
    }
    
    void foo(char *buffer, int len, int count); // (char *buffer, int len)
    void bar(char *buffer, int blah);           // char *buffer
    

    Multi-argument typemaps are also more restrictive in the way that they are matched. Currently, the first argument follows the matching rules described in the previous section, but all subsequent arguments must match exactly.

    13.3.5 Matching rules compared to C++ templates

    For those intimately familiar with C++ templates, a comparison of the typemap matching rules and template type deduction is interesting. The two areas considered are firstly the default typemaps and their similarities to partial template specialization and secondly, non-default typemaps and their similarities to full template specialization.

    For default (SWIGTYPE) typemaps the rules are inspired by C++ class template partial specialization. For example, given partial specialization for T const& :

    template <typename T> struct X             { void a(); };
    template <typename T> struct X< T const& > { void b(); };
    

    The full (unspecialized) template is matched with most types, such as:

    X< int & >            x1;  x1.a();
    

    and the following all match the T const& partial specialization:

    X< int *const& >      x2;  x2.b();
    X< int const*const& > x3;  x3.b();
    X< int const& >       x4;  x4.b();
    

    Now, given just these two default typemaps, where T is analogous to SWIGTYPE:

    %typemap(...) SWIGTYPE        { ... }
    %typemap(...) SWIGTYPE const& { ... }
    

    The generic default typemap SWIGTYPE is used with most types, such as

    int &
    

    and the following all match the SWIGTYPE const& typemap, just like the partial template matching:

    int *const&
    int const*const&
    int const&
    

    Note that the template and typemap matching rules are not identical for all default typemaps though, for example, with arrays.

    For non-default typemaps, one might expect SWIG to follow the fully specialized template rules. This is nearly the case, but not quite. Consider a very similar example to the earlier partially specialized template but this time there is a fully specialized template:

    template <typename T> struct Y       { void a(); };
    template <> struct Y< int const & >  { void b(); };
    

    Only the one type matches the specialized template exactly:

    Y< int & >             y1;  y1.a();
    Y< int *const& >       y2;  y2.a();
    Y< int const *const& > y3;  y3.a();
    Y< int const& >        y4;  y4.b(); // fully specialized match
    

    Given typemaps with the same types used for the template declared above, where T is again analogous to SWIGTYPE:

    %typemap(...) SWIGTYPE        { ... }
    %typemap(...) int const&      { ... }
    

    The comparison between non-default typemaps and fully specialized single parameter templates turns out to be the same, as just the one type will match the non-default typemap:

    int &
    int *const&
    int const*const&
    int const&        // matches non-default typemap int const&
    

    However, if a non-const type is used instead:

    %typemap(...) SWIGTYPE        { ... }
    %typemap(...) int &           { ... }
    

    then there is a clear difference to template matching as both the const and non-const types match the typemap:

    int &             // matches non-default typemap int &
    int *const&
    int const*const&
    int const&        // matches non-default typemap int &
    

    There are other subtle differences such as typedef handling, but at least it should be clear that the typemap matching rules are similar to those for specialized template handling.

    13.3.6 Debugging typemap pattern matching

    There are two useful debug command line options available for debugging typemaps, -debug-tmsearch and -debug-tmused.

    The -debug-tmsearch option is a verbose option for debugging typemap searches. This can be very useful for watching the pattern matching process in action and for debugging which typemaps are used. The option displays all the typemaps and types that are looked for until a successful pattern match is made. As the display includes searches for each and every type needed for wrapping, the amount of information displayed can be large. Normally you would manually search through the displayed information for the particular type that you are interested in.

    For example, consider some of the code used in the Typedef reductions section already covered:

    typedef int Integer;
    typedef Integer Row4[4];
    void foo(Row4 rows[10]);
    

    A sample of the debugging output is shown below for the "in" typemap:

    swig -perl -debug-tmsearch example.i
    ...
    example.h:3: Searching for a suitable 'in' typemap for: Row4 rows[10]
      Looking for: Row4 rows[10]
      Looking for: Row4 [10]
      Looking for: Row4 rows[ANY]
      Looking for: Row4 [ANY]
      Looking for: Integer rows[10][4]
      Looking for: Integer [10][4]
      Looking for: Integer rows[ANY][ANY]
      Looking for: Integer [ANY][ANY]
      Looking for: int rows[10][4]
      Looking for: int [10][4]
      Looking for: int rows[ANY][ANY]
      Looking for: int [ANY][ANY]
      Looking for: SWIGTYPE rows[ANY][ANY]
      Looking for: SWIGTYPE [ANY][ANY]
      Looking for: SWIGTYPE rows[ANY][]
      Looking for: SWIGTYPE [ANY][]
      Looking for: SWIGTYPE *rows[ANY]
      Looking for: SWIGTYPE *[ANY]
      Looking for: SWIGTYPE rows[ANY]
      Looking for: SWIGTYPE [ANY]
      Looking for: SWIGTYPE rows[]
      Looking for: SWIGTYPE []
      Using: %typemap(in) SWIGTYPE []
    ...
    

    showing that the best default match supplied by SWIG is the SWIGTYPE [] typemap. As the example shows, the successful match displays the used typemap source including typemap method, type and optional name in one of these simplified formats:

    • Using: %typemap(method) type name
    • Using: %typemap(method) type name = type2 name2
    • Using: %apply type2 name2 { type name }

    This information might meet your debugging needs, however, you might want to analyze further. If you next invoke SWIG with the -E option to display the preprocessed output, and search for the particular typemap used, you'll find the full typemap contents (example shown below for Python):

    %typemap(in, noblock=1) SWIGTYPE [] (void *argp = 0, int res = 0) {
      res = SWIG_ConvertPtr($input, &argp, $descriptor, $disown |  0 );
      if (!SWIG_IsOK(res)) { 
        SWIG_exception_fail(SWIG_ArgError(res), "in method '" "$symname" "', argument "
                           "$argnum"" of type '" "$type""'"); 
      } 
      $1 = ($ltype)(argp);
    }
    

    The generated code for the foo wrapper will then contain the snippets of the typemap with the special variables expanded. The rest of this chapter will need reading though to fully understand all of this, however, the relevant parts of the generated code for the above typemap can be seen below:

    SWIGINTERN PyObject *_wrap_foo(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
    ...
      void *argp1 = 0 ;
      int res1 = 0 ;
    ...
      res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_a_4__int, 0 |  0 );
      if (!SWIG_IsOK(res1)) {
        SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "foo" "', argument "
                           "1"" of type '" "int [10][4]""'"); 
      } 
      arg1 = (int (*)[4])(argp1);
    ...
    }
    

    Searches for multi-argument typemaps are not mentioned unless a matching multi-argument typemap does actually exist. For example, the output for the code in the earlier multi-arguments section is as follows:

    ...
    example.h:39: Searching for a suitable 'in' typemap for: char *buffer
      Looking for: char *buffer
      Multi-argument typemap found...
      Using: %typemap(in) (char *buffer, int len)
    ...
    

    The second option for debugging is -debug-tmused and this displays the typemaps used. This option is a less verbose version of the -debug-tmsearch option as it only displays each successfully found typemap on a separate single line. The output displays the type, and name if present, the typemap method in brackets and then the actual typemap used in the same simplified format output by the -debug-tmsearch option. Below is the output for the example code at the start of this section on debugging.

    $ swig -perl -debug-tmused example.i
    example.h:3: Typemap for Row4 rows[10] (in) : %typemap(in) SWIGTYPE []
    example.h:3: Typemap for Row4 rows[10] (typecheck) : %typemap(typecheck) SWIGTYPE *
    example.h:3: Typemap for Row4 rows[10] (freearg) : %typemap(freearg) SWIGTYPE []
    example.h:3: Typemap for void foo (out) : %typemap(out) void
    

    Now, consider the following interface file:

    %module example
    
    %{
    void set_value(const char* val) {}
    %}
    
    %typemap(check) char *NON_NULL {
      if (!$1) {
        /* ... error handling ... */
      }
    }
    
    // use default pointer handling instead of strings
    %apply SWIGTYPE * { const char* val, const char* another_value }
    
    %typemap(check) const char* val = char* NON_NULL;
    
    %typemap(arginit, noblock=1) const char* val {
      $1 = "";
    }
    
    void set_value(const char* val);
    
    

    and the output debug:

    swig -perl5 -debug-tmused example.i
    example.i:21: Typemap for char const *val (arginit) : %typemap(arginit) char const *val
    example.i:21: Typemap for char const *val (in) : %apply SWIGTYPE * { char const *val }
    example.i:21: Typemap for char const *val (typecheck) : %apply SWIGTYPE * { char const *val }
    example.i:21: Typemap for char const *val (check) : %typemap(check) char const *val = char *NON_NULL
    example.i:21: Typemap for char const *val (freearg) : %apply SWIGTYPE * { char const *val }
    example.i:21: Typemap for void set_value (out) : %typemap(out) void
    

    The following observations about what is displayed can be noted (the same applies for -debug-tmsearch):

    • The relevant typemap is shown, but for typemap copying, the appropriate %typemap or %apply is displayed, for example, the "check" and "in" typemaps.
    • The typemap modifiers are not shown, eg the noblock=1 modifier in the "arginit" typemap.
    • The exact %apply statement might look different to what is in the actual code. For example, the const char* another_value is not shown as it is not relevant here. Also the types may be displayed slightly differently - char const * and not const char*.

    13.4 Code generation rules

    This section describes rules by which typemap code is inserted into the generated wrapper code.

    13.4.1 Scope

    When a typemap is defined like this:

    %typemap(in) int {
      $1 = PyInt_AsLong($input);
    }
    

    the typemap code is inserted into the wrapper function using a new block scope. In other words, the wrapper code will look like this:

    wrap_whatever() {
      ...
      // Typemap code
      {
        arg1 = PyInt_AsLong(obj1);
      }
      ...
    }
    

    Because the typemap code is enclosed in its own block, it is legal to declare temporary variables for use during typemap execution. For example:

    %typemap(in) short {
      long temp;          /* Temporary value */
      if (Tcl_GetLongFromObj(interp, $input, &temp) != TCL_OK) {
        return TCL_ERROR;
      }
      $1 = (short) temp;
    }
    

    Of course, any variables that you declare inside a typemap are destroyed as soon as the typemap code has executed (they are not visible to other parts of the wrapper function or other typemaps that might use the same variable names).

    Occasionally, typemap code will be specified using a few alternative forms. For example:

    %typemap(in) int "$1 = PyInt_AsLong($input);";
    %typemap(in) int %{
    $1 = PyInt_AsLong($input);
    %}
    %typemap(in, noblock=1) int {
    $1 = PyInt_AsLong($input);
    }
    

    These three forms are mainly used for cosmetics--the specified code is not enclosed inside a block scope when it is emitted. This sometimes results in a less complicated looking wrapper function. Note that only the third of the three typemaps have the typemap code passed through the SWIG preprocessor.

    13.4.2 Declaring new local variables

    Sometimes it is useful to declare a new local variable that exists within the scope of the entire wrapper function. A good example of this might be an application in which you wanted to marshal strings. Suppose you had a C++ function like this

    int foo(std::string *s);
    

    and you wanted to pass a native string in the target language as an argument. For instance, in Perl, you wanted the function to work like this:

    $x = foo("Hello World");
    

    To do this, you can't just pass a raw Perl string as the std::string * argument. Instead, you have to create a temporary std::string object, copy the Perl string data into it, and then pass a pointer to the object. To do this, simply specify the typemap with an extra parameter like this:

    %typemap(in) std::string * (std::string temp) {
      unsigned int len;
      char        *s;
      s = SvPV($input, len);         /* Extract string data */
      temp.assign(s, len);           /* Assign to temp */
      $1 = &temp;                   /* Set argument to point to temp */
    }
    

    In this case, temp becomes a local variable in the scope of the entire wrapper function. For example:

    wrap_foo() {
      std::string temp;    <--- Declaration of temp goes here
      ...
    
      /* Typemap code */
      {
        ...
        temp.assign(s, len);
        ...
      }
      ...
    }
    

    When you set temp to a value, it persists for the duration of the wrapper function and gets cleaned up automatically on exit.

    It is perfectly safe to use more than one typemap involving local variables in the same declaration. For example, you could declare a function as :

    void foo(std::string *x, std::string *y, std::string *z);
    

    This is safely handled because SWIG actually renames all local variable references by appending an argument number suffix. Therefore, the generated code would actually look like this:

    wrap_foo() {
      int *arg1;    /* Actual arguments */
      int *arg2;
      int *arg3;
      std::string temp1;    /* Locals declared in the typemap */
      std::string temp2;
      std::string temp3;
      ...
      {
        char *s;
        unsigned int len;
        ...
        temp1.assign(s, len);
        arg1 = *temp1;
      }
      {
        char *s;
        unsigned int len;
        ...
        temp2.assign(s, len);
        arg2 = &temp2;
      }
      {
        char *s;
        unsigned int len;
        ...
        temp3.assign(s, len);
        arg3 = &temp3;
      }
      ...
    }
    

    There is an exception: if the variable name starts with the _global_ prefix, the argument number is not appended. Such variables can be used throughout the generated wrapper function. For example, the above typemap could be rewritten to use _global_temp instead of temp and the generated code would then contain a single _global_temp variable instead of temp1, temp2 and temp3:

    %typemap(in) std::string * (std::string _global_temp) {
     ... as above ...
    }
    

    Some typemaps do not recognize local variables (or they may simply not apply). At this time, only typemaps that apply to argument conversion support this (input typemaps such as the "in" typemap).

    Note:

    When declaring a typemap for multiple types, each type must have its own local variable declaration.

    %typemap(in) const std::string *, std::string * (std::string temp) // NO!
    // only std::string * has a local variable
    // const std::string * does not (oops)
    ....
    
    %typemap(in) const std::string * (std::string temp), std::string * (std::string temp) // Correct
    ....
    

    13.4.3 Special variables

    Within all typemaps, the following special variables are expanded. This is by no means a complete list as some target languages have additional special variables which are documented in the language specific chapters.

    VariableMeaning
    $n A C local variable corresponding to type n in the typemap pattern.
    $argnum Argument number. Only available in typemaps related to argument conversion
    $n_name Argument name
    $n_type Real C datatype of type n.
    $n_ltype ltype of type n
    $n_mangle Mangled form of type n. For example _p_Foo
    $n_descriptor Type descriptor structure for type n. For example SWIGTYPE_p_Foo. This is primarily used when interacting with the run-time type checker (described later).
    $*n_type Real C datatype of type n with one pointer removed.
    $*n_ltype ltype of type n with one pointer removed.
    $*n_mangle Mangled form of type n with one pointer removed.
    $*n_descriptor Type descriptor structure for type n with one pointer removed.
    $&n_type Real C datatype of type n with one pointer added.
    $&n_ltype ltype of type n with one pointer added.
    $&n_mangle Mangled form of type n with one pointer added.
    $&n_descriptor Type descriptor structure for type n with one pointer added.
    $n_basetype Base typename with all pointers and qualifiers stripped.

    Within the table, $n refers to a specific type within the typemap specification. For example, if you write this

    %typemap(in) int *INPUT {
    
    }
    

    then $1 refers to int *INPUT. If you have a typemap like this,

    %typemap(in) (int argc, char *argv[]) {
      ...
    }
    

    then $1 refers to int argc and $2 refers to char *argv[].

    Substitutions related to types and names always fill in values from the actual code that was matched. This is useful when a typemap might match multiple C datatype. For example:

    %typemap(in)  int, short, long {
      $1 = ($1_ltype) PyInt_AsLong($input);
    }
    

    In this case, $1_ltype is replaced with the datatype that is actually matched.

    When typemap code is emitted, the C/C++ datatype of the special variables $1 and $2 is always an "ltype." An "ltype" is simply a type that can legally appear on the left-hand side of a C assignment operation. Here are a few examples of types and ltypes:

    type              ltype
    ------            ----------------
    int               int
    const int         int
    const int *       int *
    int [4]           int *
    int [4][5]        int (*)[5]
    

    In most cases a ltype is simply the C datatype with qualifiers stripped off. In addition, arrays are converted into pointers.

    Variables such as $&1_type and $*1_type are used to safely modify the type by removing or adding pointers. Although not needed in most typemaps, these substitutions are sometimes needed to properly work with typemaps that convert values between pointers and values.

    If necessary, type related substitutions can also be used when declaring locals. For example:

    %typemap(in) int * ($*1_type temp) {
      temp = PyInt_AsLong($input);
      $1 = &temp;
    }
    

    There is one word of caution about declaring local variables in this manner. If you declare a local variable using a type substitution such as $1_ltype temp, it won't work like you expect for arrays and certain kinds of pointers. For example, if you wrote this,

    %typemap(in) int [10][20] {
      $1_ltype temp;
    }
    

    then the declaration of temp will be expanded as

    int (*)[20] temp;
    

    This is illegal C syntax and won't compile. There is currently no straightforward way to work around this problem in SWIG due to the way that typemap code is expanded and processed. However, one possible workaround is to simply pick an alternative type such as void * and use casts to get the correct type when needed. For example:

    %typemap(in) int [10][20] {
      void *temp;
      ...
      (($1_ltype) temp)[i][j] = x;    /* set a value */
      ...
    }
    

    Another approach, which only works for arrays is to use the $1_basetype substitution. For example:

    %typemap(in) int [10][20] {
      $1_basetype temp[10][20];
      ...
      temp[i][j] = x;    /* set a value */
      ...
    }
    

    13.4.4 Special variable macros

    Special variable macros are like macro functions in that they take one or more input arguments which are used for the macro expansion. They look like macro/function calls but use the special variable $ prefix to the macro name. Note that unlike normal macros, the expansion is not done by the preprocessor, it is done during the SWIG parsing/compilation stages. The following special variable macros are available across all language modules.

    13.4.4.1 $descriptor(type)

    This macro expands into the type descriptor structure for any C/C++ type specified in type. It behaves like the $1_descriptor special variable described above except that the type to expand is taken from the macro argument rather than inferred from the typemap type. For example, $descriptor(std::vector<int> *) will expand into SWIGTYPE_p_std__vectorT_int_t. This macro is mostly used in the scripting target languages and is demonstrated later in the Run-time type checker usage section.

    13.4.4.2 $typemap(method, typepattern)

    This macro uses the pattern matching rules described earlier to lookup and then substitute the special variable macro with the code in the matched typemap. The typemap to search for is specified by the arguments, where method is the typemap method name and typepattern is a type pattern as per the %typemap specification in the Defining a typemap section.

    The special variables within the matched typemap are expanded into those for the matched typemap type, not the typemap within which the macro is called. In practice, there is little use for this macro in the scripting target languages. It is mostly used in the target languages that are statically typed as a way to obtain the target language type given the C/C++ type and more commonly only when the C++ type is a template parameter.

    The example below is for C# only and uses some typemap method names documented in the C# chapter, but it shows some of the possible syntax variations.

    %typemap(cstype) unsigned long    "uint"
    %typemap(cstype) unsigned long bb "bool"
    %typemap(cscode) BarClass %{
      void foo($typemap(cstype, unsigned long aa) var1,
               $typemap(cstype, unsigned long bb) var2,
               $typemap(cstype, (unsigned long bb)) var3,
               $typemap(cstype, unsigned long) var4)
      {
        // do something
      }
    %}
    

    The result is the following expansion

    %typemap(cstype) unsigned long    "uint"
    %typemap(cstype) unsigned long bb "bool"
    %typemap(cscode) BarClass %{
      void foo(uint var1,
               bool var2,
               bool var3,
               uint var4)
      {
        // do something
      }
    %}
    

    13.4.5 Special variables and typemap attributes

    As of SWIG-3.0.7 typemap attributes will also expand special variables and special variable macros.

    Example usage showing the expansion in the 'out' attribute (C# specific) as well as the main typemap body:

    %typemap(ctype, out="$*1_ltype") unsigned int& "$*1_ltype"
    

    is equivalent to the following as $*1_ltype expands to unsigned int:

    %typemap(ctype, out="unsigned int") unsigned int& "unsigned int"
    

    13.4.6 Special variables combined with special variable macros

    Special variables can also be used within special variable macros. The special variables are expanded before they are used in the special variable macros.

    Consider the following C# typemaps:

    %typemap(cstype) unsigned int "uint"
    %typemap(cstype, out="$typemap(cstype, $*1_ltype)") unsigned int& "$typemap(cstype, $*1_ltype)"
    

    Special variables are expanded first and hence the above is equivalent to:

    %typemap(cstype) unsigned int "uint"
    %typemap(cstype, out="$typemap(cstype, unsigned int)") unsigned int& "$typemap(cstype, unsigned int)"
    

    which then expands to:

    %typemap(cstype) unsigned int "uint"
    %typemap(cstype, out="uint") unsigned int& "uint"
    

    13.5 Common typemap methods

    The family of typemaps recognized by a language module may vary. However, the following typemap methods are nearly universal:

    13.5.1 "in" typemap

    The "in" typemap is used to convert function arguments from the target language to C. For example:

    %typemap(in) int {
      $1 = PyInt_AsLong($input);
    }
    

    The following special variables are available:

    $input            - Input object holding value to be converted.
    $symname          - Name of function/method being wrapped
    

    This is probably the most commonly redefined typemap because it can be used to implement customized conversions.

    In addition, the "in" typemap allows the number of converted arguments to be specified. The numinputs attributes facilitates this. For example:

    // Ignored argument.
    %typemap(in, numinputs=0) int *out (int temp) {
      $1 = &temp;
    }
    

    At this time, only zero or one arguments may be converted. When numinputs is set to 0, the argument is effectively ignored and cannot be supplied from the target language. The argument is still required when making the C/C++ call and the above typemap shows the value used is instead obtained from a locally declared variable called temp. Usually numinputs is not specified, whereupon the default value is 1, that is, there is a one to one mapping of the number of arguments when used from the target language to the C/C++ call. Multi-argument typemaps provide a similar concept where the number of arguments mapped from the target language to C/C++ can be changed for multiple adjacent C/C++ arguments.

    Compatibility note: Specifying numinputs=0 is the same as the old "ignore" typemap.

    13.5.2 "typecheck" typemap

    The "typecheck" typemap is used to support overloaded functions and methods. It merely checks an argument to see whether or not it matches a specific type. For example:

    %typemap(typecheck, precedence=SWIG_TYPECHECK_INTEGER) int {
      $1 = PyInt_Check($input) ? 1 : 0;
    }
    

    For typechecking, the $1 variable is always a simple integer that is set to 1 or 0 depending on whether or not the input argument is the correct type. Set to 1 if the input argument is the correct type otherwise set to 0.

    If you define new "in" typemaps and your program uses overloaded methods, you should also define a collection of "typecheck" typemaps. More details about this follow in the Typemaps and overloading section.

    13.5.3 "out" typemap

    The "out" typemap is used to convert function/method return values from C into the target language. For example:

    %typemap(out) int {
      $result = PyInt_FromLong($1);
    }
    

    The following special variables are available.

    $result           - Result object returned to target language.
    $symname          - Name of function/method being wrapped
    

    The "out" typemap supports an optional attribute flag called "optimal". This is for code optimisation and is detailed in the Optimal code generation when returning by value section.

    13.5.4 "arginit" typemap

    The "arginit" typemap is used to set the initial value of a function argument--before any conversion has occurred. This is not normally necessary, but might be useful in highly specialized applications. For example:

    // Set argument to NULL before any conversion occurs
    %typemap(arginit) int *data {
      $1 = NULL;
    }
    

    13.5.5 "default" typemap

    The "default" typemap is used to turn an argument into a default argument. For example:

    %typemap(default) int flags {
      $1 = DEFAULT_FLAGS;
    }
    ...
    int foo(int x, int y, int flags);
    

    The primary use of this typemap is to either change the wrapping of default arguments or specify a default argument in a language where they aren't supported (like C). Target languages that do not support optional arguments, such as Java and C#, effectively ignore the value specified by this typemap as all arguments must be given.

    Once a default typemap has been applied to an argument, all arguments that follow must have default values. See the Default/optional arguments section for further information on default argument wrapping.

    13.5.6 "check" typemap

    The "check" typemap is used to supply value checking code during argument conversion. The typemap is applied after arguments have been converted. For example:

    %typemap(check) int positive {
      if ($1 <= 0) {
        SWIG_exception(SWIG_ValueError, "Expected positive value.");
      }
    }
    

    13.5.7 "argout" typemap

    The "argout" typemap is used to return values from arguments. This is most commonly used to write wrappers for C/C++ functions that need to return multiple values. The "argout" typemap is almost always combined with an "in" typemap---possibly to ignore the input value. For example:

    /* Set the input argument to point to a temporary variable */
    %typemap(in, numinputs=0) int *out (int temp) {
      $1 = &temp;
    }
    
    %typemap(argout) int *out {
      // Append output value $1 to $result
      ...
    }
    

    The following special variables are available.

    $result           - Result object returned to target language.
    $input            - The original input object passed.
    $symname          - Name of function/method being wrapped
    

    The code supplied to the "argout" typemap is always placed after the "out" typemap. If multiple return values are used, the extra return values are often appended to return value of the function.

    See the typemaps.i library file for examples.

    13.5.8 "freearg" typemap

    The "freearg" typemap is used to cleanup argument data. It is only used when an argument might have allocated resources that need to be cleaned up when the wrapper function exits. The "freearg" typemap usually cleans up argument resources allocated by the "in" typemap. For example:

    // Get a list of integers
    %typemap(in) int *items {
      int nitems = Length($input);
      $1 = (int *) malloc(sizeof(int)*nitems);
    }
    // Free the list 
    %typemap(freearg) int *items {
      free($1);
    }
    

    The "freearg" typemap inserted at the end of the wrapper function, just before control is returned back to the target language. This code is also placed into a special variable $cleanup that may be used in other typemaps whenever a wrapper function needs to abort prematurely.

    13.5.9 "newfree" typemap

    The "newfree" typemap is used in conjunction with the %newobject directive and is used to deallocate memory used by the return result of a function. For example:

    %typemap(newfree) string * {
      delete $1;
    }
    %typemap(out) string * {
      $result = PyString_FromString($1->c_str());
    }
    ...
    
    %newobject foo;
    ...
    string *foo();
    

    See Object ownership and %newobject for further details.

    13.5.10 "ret" typemap

    The "ret" typemap is not used very often, but can be useful for anything associated with the return type, such as resource management, return value error checking, etc. Usually this can all be done in the "out" typemap, but sometimes it is handy to use the "out" typemap code untouched and add to the generated code using the code in the "ret" typemap. One such case is memory clean up. For example, a stringheap_t type is defined indicating that the returned memory must be deleted and a string_t type is defined indicating that the returned memory must not be deleted.

    %typemap(ret) stringheap_t %{
      free($1);
    %}
    
    typedef char * string_t;
    typedef char * stringheap_t;
    
    string_t MakeString1();
    stringheap_t MakeString2();
    

    The "ret" typemap above will only be used for MakeString2, but both functions will use the default "out" typemap for char * provided by SWIG. The code above would ensure the appropriate memory is freed in all target languages as the need to provide custom "out" typemaps (which involve target language specific code) is not necessary.

    This approach is an alternative to using the "newfree" typemap and %newobject as there is no need to list all the functions that require the memory cleanup, it is purely done on types.

    13.5.11 "memberin" typemap

    The "memberin" typemap is used to copy data from an already converted input value into a structure member. It is typically used to handle array members and other special cases. For example:

    %typemap(memberin) int [4] {
      memmove($1, $input, 4*sizeof(int));
    }
    

    It is rarely necessary to write "memberin" typemaps---SWIG already provides a default implementation for arrays, strings, and other objects.

    13.5.12 "varin" typemap

    The "varin" typemap is used to convert objects in the target language to C for the purposes of assigning to a C/C++ global variable. This is implementation specific.

    13.5.13 "varout" typemap

    The "varout" typemap is used to convert a C/C++ object to an object in the target language when reading a C/C++ global variable. This is implementation specific.

    13.5.14 "throws" typemap

    The "throws" typemap is only used when SWIG parses a C++ method with an exception specification or has the %catches feature attached to the method (see Exception handling with %catches). It provides a default mechanism for handling C++ methods that have declared the exceptions they will throw. The purpose of this typemap is to convert a C++ exception into an error or exception in the target language. It is slightly different to the other typemaps as it is based around the exception type rather than the type of a parameter or variable. For example:

    %typemap(throws) const char * %{
      PyErr_SetString(PyExc_RuntimeError, $1);
      SWIG_fail;
    %}
    
    // Either an exception specification on the method
      void bar() throw (const char *);
    
    // Or a %catches feature attached to the method
      %catches(const char *) bar();
      void bar();
    

    As can be seen from the resulting generated code below, SWIG generates an exception handler when wrapping the bar function with the catch block comprising the "throws" typemap content.

    ...
    try {
      bar();
    } catch(char const *_e) {
      PyErr_SetString(PyExc_RuntimeError, _e);
      SWIG_fail;
    }
    ...
    

    Note that if your methods do not have an exception specification but they do throw exceptions and you are not using %catches, SWIG cannot know how to deal with them. Please also see the Exception handling with %exception section for another way to handle exceptions.

    13.6 Some typemap examples

    This section contains a few examples. Consult language module documentation for more examples.

    13.6.1 Typemaps for arrays

    A common use of typemaps is to provide support for C arrays appearing both as arguments to functions and as structure members.

    For example, suppose you had a function like this:

    void set_vector(int type, float value[4]);
    

    If you wanted to handle float value[4] as a list of floats, you might write a typemap similar to this:

    
    %typemap(in) float value[4] (float temp[4]) {
      int i;
      if (!PySequence_Check($input)) {
        PyErr_SetString(PyExc_ValueError, "Expected a sequence");
        SWIG_fail;
      }
      if (PySequence_Length($input) != 4) {
        PyErr_SetString(PyExc_ValueError, "Size mismatch. Expected 4 elements");
        SWIG_fail;
      }
      for (i = 0; i < 4; i++) {
        PyObject *o = PySequence_GetItem($input, i);
        if (PyNumber_Check(o)) {
          temp[i] = (float) PyFloat_AsDouble(o);
        } else {
          PyErr_SetString(PyExc_ValueError, "Sequence elements must be numbers");      
          SWIG_fail;
        }
      }
      $1 = temp;
    }
    

    In this example, the variable temp allocates a small array on the C stack. The typemap then populates this array and passes it to the underlying C function.

    When used from Python, the typemap allows the following type of function call:

    >>> set_vector(type, [ 1, 2.5, 5, 20 ])
    

    If you wanted to generalize the typemap to apply to arrays of all dimensions you might write this:

    %typemap(in) float value[ANY] (float temp[$1_dim0]) {
      int i;
      if (!PySequence_Check($input)) {
        PyErr_SetString(PyExc_ValueError, "Expected a sequence");
        SWIG_fail;
      }
      if (PySequence_Length($input) != $1_dim0) {
        PyErr_SetString(PyExc_ValueError, "Size mismatch. Expected $1_dim0 elements");
        SWIG_fail;
      }
      for (i = 0; i < $1_dim0; i++) {
        PyObject *o = PySequence_GetItem($input, i);
        if (PyNumber_Check(o)) {
          temp[i] = (float) PyFloat_AsDouble(o);
        } else {
          PyErr_SetString(PyExc_ValueError, "Sequence elements must be numbers");      
          SWIG_fail;
        }
      }
      $1 = temp;
    }
    

    In this example, the special variable $1_dim0 is expanded with the actual array dimensions. Multidimensional arrays can be matched in a similar manner. For example:

    %typemap(in) float matrix[ANY][ANY] (float temp[$1_dim0][$1_dim1]) {
      ... convert a 2d array ...
    }
    

    For large arrays, it may be impractical to allocate storage on the stack using a temporary variable as shown. To work with heap allocated data, the following technique can be used.

    %typemap(in) float value[ANY] {
      int i;
      if (!PySequence_Check($input)) {
        PyErr_SetString(PyExc_ValueError, "Expected a sequence");
        SWIG_fail;
      }
      if (PySequence_Length($input) != $1_dim0) {
        PyErr_SetString(PyExc_ValueError, "Size mismatch. Expected $1_dim0 elements");
        SWIG_fail;
      }
      $1 = (float *) malloc($1_dim0*sizeof(float));
      for (i = 0; i < $1_dim0; i++) {
        PyObject *o = PySequence_GetItem($input, i);
        if (PyNumber_Check(o)) {
          $1[i] = (float) PyFloat_AsDouble(o);
        } else {
          free($1);
          PyErr_SetString(PyExc_ValueError, "Sequence elements must be numbers");
          SWIG_fail;
        }
      }
    }
    %typemap(freearg) float value[ANY] {
      if ($1) free($1);
    }
    

    In this case, an array is allocated using malloc. The freearg typemap is then used to release the argument after the function has been called.

    Another common use of array typemaps is to provide support for array structure members. Due to subtle differences between pointers and arrays in C, you can't just "assign" to a array structure member. Instead, you have to explicitly copy elements into the array. For example, suppose you had a structure like this:

    struct SomeObject {
      float  value[4];
      ...
    };
    

    When SWIG runs, it won't produce any code to set the vec member. You may even get a warning message like this:

    $ swig -python  example.i
    example.i:10: Warning 462: Unable to set variable of type float [4].
    

    These warning messages indicate that SWIG does not know how you want to set the vec field.

    To fix this, you can supply a special "memberin" typemap like this:

    %typemap(memberin) float [ANY] {
      int i;
      for (i = 0; i < $1_dim0; i++) {
          $1[i] = $input[i];
      }
    }
    

    The memberin typemap is used to set a structure member from data that has already been converted from the target language to C. In this case, $input is the local variable in which converted input data is stored. This typemap then copies this data into the structure.

    When combined with the earlier typemaps for arrays, the combination of the "in" and "memberin" typemap allows the following usage:

    >>> s = SomeObject()
    >>> s.x = [1, 2.5, 5, 10]
    

    Related to structure member input, it may be desirable to return structure members as a new kind of object. For example, in this example, you will get very odd program behavior where the structure member can be set nicely, but reading the member simply returns a pointer:

    >>> s = SomeObject()
    >>> s.x = [1, 2.5, 5, 10]
    >>> print s.x
    _1008fea8_p_float
    >>> 
    

    To fix this, you can write an "out" typemap. For example:

    %typemap(out) float [ANY] {
      int i;
      $result = PyList_New($1_dim0);
      for (i = 0; i < $1_dim0; i++) {
        PyObject *o = PyFloat_FromDouble((double) $1[i]);
        PyList_SetItem($result, i, o);
      }
    }
    

    Now, you will find that member access is quite nice:

    >>> s = SomeObject()
    >>> s.x = [1, 2.5, 5, 10]
    >>> print s.x
    [ 1, 2.5, 5, 10]
    

    Compatibility Note: SWIG1.1 used to provide a special "memberout" typemap. However, it was mostly useless and has since been eliminated. To return structure members, simply use the "out" typemap.

    13.6.2 Implementing constraints with typemaps

    One particularly interesting application of typemaps is the implementation of argument constraints. This can be done with the "check" typemap. When used, this allows you to provide code for checking the values of function arguments. For example:

    %module math
    
    %typemap(check) double posdouble {
      if ($1 < 0) {
        croak("Expecting a positive number");
      }
    }
    
    ...
    double sqrt(double posdouble);
    
    

    This provides a sanity check to your wrapper function. If a negative number is passed to this function, a Perl exception will be raised and your program terminated with an error message.

    This kind of checking can be particularly useful when working with pointers. For example:

    %typemap(check) Vector * {
      if ($1 == 0) {
        PyErr_SetString(PyExc_TypeError, "NULL Pointer not allowed");
        SWIG_fail;
      }
    }
    
    

    will prevent any function involving a Vector * from accepting a NULL pointer. As a result, SWIG can often prevent a potential segmentation faults or other run-time problems by raising an exception rather than blindly passing values to the underlying C/C++ program.

    13.7 Typemaps for multiple target languages

    The code within typemaps is usually language dependent, however, many target languages support the same typemaps. In order to distinguish typemaps across different languages, the preprocessor should be used. For example, the "in" typemap for Perl and Ruby could be written as:

    #if defined(SWIGPERL)
      %typemap(in) int "$1 = ($1_ltype) SvIV($input);"
    #elif defined(SWIGRUBY)
      %typemap(in) int "$1 = NUM2INT($input);"
    #else
      #warning no "in" typemap defined
    #endif
    

    The full set of language specific macros is defined in the Conditional Compilation section. The example above also shows a common approach of issuing a warning for an as yet unsupported language.

    Compatibility note: In SWIG-1.1 different languages could be distinguished with the language name being put within the %typemap directive, for example,
    %typemap(ruby, in) int "$1 = NUM2INT($input);".

    13.8 Optimal code generation when returning by value

    The "out" typemap is the main typemap for return types. This typemap supports an optional attribute flag called "optimal", which is for reducing the number of temporary variables and the amount of generated code, thereby giving the compiler the opportunity to use return value optimization for generating faster executing code. It only really makes a difference when returning objects by value and has some limitations on usage, as explained later on.

    When a function returns an object by value, SWIG generates code that instantiates the default type on the stack then assigns the value returned by the function call to it. A copy of this object is then made on the heap and this is what is ultimately stored and used from the target language. This will be clearer considering an example. Consider running the following code through SWIG:

    %typemap(out) SWIGTYPE %{
      $result = new $1_ltype((const $1_ltype &)$1);
    %}
    
    %inline %{
    #include <iostream>
    using namespace std;
    
    struct XX {
      XX() { cout << "XX()" << endl; }
      XX(int i) { cout << "XX(" << i << ")" << endl; }
      XX(const XX &other) { cout << "XX(const XX &)" << endl; }
      XX & operator =(const XX &other) { cout << "operator=(const XX &)" << endl; return *this; }
      ~XX() { cout << "~XX()" << endl; }
      static XX create() { 
        return XX(0);
      }
    };
    %}
    

    The "out" typemap shown is the default typemap for C# when returning objects by value. When making a call to XX::create() from C#, the output is as follows:

    XX()
    XX(0)
    operator=(const XX &)
    ~XX()
    XX(const XX &)
    ~XX()
    ~XX()
    

    Note that three objects are being created as well as an assignment. Wouldn't it be great if the XX::create() method was the only time a constructor was called? As the method returns by value, this is asking a lot and the code that SWIG generates by default makes it impossible for the compiler to use return value optimisation (RVO). However, this is where the "optimal" attribute in the "out" typemap can help out. If the typemap code is kept the same and just the "optimal" attribute specified like this:

    %typemap(out, optimal="1") SWIGTYPE %{
      $result = new $1_ltype((const $1_ltype &)$1);
    %}
    

    then when the code is run again, the output is simply:

    XX(0)
    ~XX()
    

    How the "optimal" attribute works is best explained using the generated code. Without "optimal", the generated code is:

    SWIGEXPORT void * SWIGSTDCALL CSharp_XX_create() {
      void * jresult ;
      XX result;
      result = XX::create();
      jresult = new XX((const XX &)result);
      return jresult;
    }
    
    

    With the "optimal" attribute, the code is:

    SWIGEXPORT void * SWIGSTDCALL CSharp_XX_create() {
      void * jresult ;
      jresult = new XX((const XX &)XX::create());
      return jresult;
    }
    

    The major difference is the result temporary variable holding the value returned from XX::create() is no longer generated and instead the copy constructor call is made directly from the value returned by XX::create(). With modern compilers implementing RVO, the copy is not actually done, in fact the object is never created on the stack in XX::create() at all, it is simply created directly on the heap. In the first instance, the $1 special variable in the typemap is expanded into result. In the second instance, $1 is expanded into XX::create() and this is essentially what the "optimal" attribute is telling SWIG to do.

    The "optimal" attribute optimisation is not turned on by default as it has a number of restrictions. Firstly, some code cannot be condensed into a simple call for passing into the copy constructor. One common occurrence is when %exception is used. Consider adding the following %exception to the example:

    %exception XX::create() %{
    try {
      $action
    } catch(const std::exception &e) {
      cout << e.what() << endl;
    }
    %}
    

    SWIG can detect when the "optimal" attribute cannot be used and will ignore it and in this case will issue the following warning:

    example.i:28: Warning 474: Method XX::create() usage of the optimal attribute ignored
    example.i:14: Warning 474: in the out typemap as the following cannot be used to generate
    optimal code: 
    try {
      result = XX::create();
    } catch(const std::exception &e) {
      cout << e.what() << endl;
    }
    

    It should be clear that the above code cannot be used as the argument to the copy constructor call, that is, for the $1 substitution.

    Secondly, if the typemaps uses $1 more than once, then multiple calls to the wrapped function will be made. Obviously that is not very optimal. In fact SWIG attempts to detect this and will issue a warning something like:

    example.i:21: Warning 475: Multiple calls to XX::create() might be generated due to
    example.i:7: Warning 475: optimal attribute usage in the out typemap.
    

    However, it doesn't always get it right, for example when $1 is within some commented out code.

    13.9 Multi-argument typemaps

    So far, the typemaps presented have focused on the problem of dealing with single values. For example, converting a single input object to a single argument in a function call. However, certain conversion problems are difficult to handle in this manner. As an example, consider the example at the very beginning of this chapter:

    int foo(int argc, char *argv[]);
    

    Suppose that you wanted to wrap this function so that it accepted a single list of strings like this:

    >>> foo(["ale", "lager", "stout"])
    

    To do this, you not only need to map a list of strings to char *argv[], but the value of int argc is implicitly determined by the length of the list. Using only simple typemaps, this type of conversion is possible, but extremely painful. Multi-argument typemaps help in this situation.

    A multi-argument typemap is a conversion rule that specifies how to convert a single object in the target language to a set of consecutive function arguments in C/C++. For example, the following multi-argument maps perform the conversion described for the above example:

    %typemap(in) (int argc, char *argv[]) {
      int i;
      if (!PyList_Check($input)) {
        PyErr_SetString(PyExc_ValueError, "Expecting a list");
        SWIG_fail;
      }
      $1 = PyList_Size($input);
      $2 = (char **) malloc(($1+1)*sizeof(char *));
      for (i = 0; i < $1; i++) {
        PyObject *s = PyList_GetItem($input, i);
        if (!PyString_Check(s)) {
          free($2);
          PyErr_SetString(PyExc_ValueError, "List items must be strings");
          SWIG_fail;
        }
        $2[i] = PyString_AsString(s);
      }
      $2[i] = 0;
    }
    
    %typemap(freearg) (int argc, char *argv[]) {
      if ($2) free($2);
    }
    
    /* Required for C++ method overloading */
    %typecheck(SWIG_TYPECHECK_STRING_ARRAY) (int argc, char *argv[]) {
      $1 = PyList_Check($input) ? 1 : 0;
    }
    

    A multi-argument map is always specified by surrounding the arguments with parentheses as shown. For example:

    %typemap(in) (int argc, char *argv[]) { ... }
    

    Within the typemap code, the variables $1, $2, and so forth refer to each type in the map. All of the usual substitutions apply--just use the appropriate $1 or $2 prefix on the variable name (e.g., $2_type, $1_ltype, etc.)

    Multi-argument typemaps always have precedence over simple typemaps and SWIG always performs longest-match searching. Therefore, you will get the following behavior:

    %typemap(in) int argc                              { ... typemap 1 ... }
    %typemap(in) (int argc, char *argv[])              { ... typemap 2 ... }
    %typemap(in) (int argc, char *argv[], char *env[]) { ... typemap 3 ... }
    
    int foo(int argc, char *argv[]);                   // Uses typemap 2
    int bar(int argc, int x);                          // Uses typemap 1
    int spam(int argc, char *argv[], char *env[]);     // Uses typemap 3
    

    It should be stressed that multi-argument typemaps can appear anywhere in a function declaration and can appear more than once. For example, you could write this:

    %typemap(in) (int scount, char *swords[]) { ... }
    %typemap(in) (int wcount, char *words[]) { ... }
    
    void search_words(int scount, char *swords[], int wcount, char *words[], int maxcount);
    

    Other directives such as %apply and %clear also work with multi-argument maps. For example:

    %apply (int argc, char *argv[]) {
        (int scount, char *swords[]),
        (int wcount, char *words[])
    };
    ...
    %clear (int scount, char *swords[]), (int wcount, char *words[]);
    ...
    

    Don't forget to also provide a suitable typemap for overloaded functions, such as %typecheck shown for foo above. This is only required if the function is overloaded in C++.

    Although multi-argument typemaps may seem like an exotic, little used feature, there are several situations where they make sense. First, suppose you wanted to wrap functions similar to the low-level read() and write() system calls. For example:

    typedef unsigned int size_t;
    
    int read(int fd, void *rbuffer, size_t len);
    int write(int fd, void *wbuffer, size_t len);
    

    As is, the only way to use the functions would be to allocate memory and pass some kind of pointer as the second argument---a process that might require the use of a helper function. However, using multi-argument maps, the functions can be transformed into something more natural. For example, you might write typemaps like this:

    // typemap for an outgoing buffer
    %typemap(in) (void *wbuffer, size_t len) {
      if (!PyString_Check($input)) {
        PyErr_SetString(PyExc_ValueError, "Expecting a string");
        SWIG_fail;
      }
      $1 = (void *) PyString_AsString($input);
      $2 = PyString_Size($input);
    }
    
    // typemap for an incoming buffer
    %typemap(in) (void *rbuffer, size_t len) {
      if (!PyInt_Check($input)) {
        PyErr_SetString(PyExc_ValueError, "Expecting an integer");
        SWIG_fail;
      }
      $2 = PyInt_AsLong($input);
      if ($2 < 0) {
        PyErr_SetString(PyExc_ValueError, "Positive integer expected");
        SWIG_fail;
      }
      $1 = (void *) malloc($2);
    }
    
    // Return the buffer.  Discarding any previous return result
    %typemap(argout) (void *rbuffer, size_t len) {
      Py_XDECREF($result);   /* Blow away any previous result */
      if (result < 0) {      /* Check for I/O error */
        free($1);
        PyErr_SetFromErrno(PyExc_IOError);
        return NULL;
      }
      $result = PyString_FromStringAndSize($1, result);
      free($1);
    }
    

    (note: In the above example, $result and result are two different variables. result is the real C datatype that was returned by the function. $result is the scripting language object being returned to the interpreter.).

    Now, in a script, you can write code that simply passes buffers as strings like this:

    >>> f = example.open("Makefile")
    >>> example.read(f, 40)
    'TOP        = ../..\nSWIG       = $(TOP)/.'
    >>> example.read(f, 40)
    './swig\nSRCS       = example.c\nTARGET    '
    >>> example.close(f)
    0
    >>> g = example.open("foo", example.O_WRONLY | example.O_CREAT, 0644)
    >>> example.write(g, "Hello world\n")
    12
    >>> example.write(g, "This is a test\n")
    15
    >>> example.close(g)
    0
    >>>
    

    A number of multi-argument typemap problems also arise in libraries that perform matrix-calculations--especially if they are mapped onto low-level Fortran or C code. For example, you might have a function like this:

    int is_symmetric(double *mat, int rows, int columns);
    

    In this case, you might want to pass some kind of higher-level object as an matrix. To do this, you could write a multi-argument typemap like this:

    %typemap(in) (double *mat, int rows, int columns) {
      MatrixObject *a;
      a = GetMatrixFromObject($input);     /* Get matrix somehow */
    
      /* Get matrix properties */
      $1 = GetPointer(a);
      $2 = GetRows(a);
      $3 = GetColumns(a);
    }
    

    This kind of technique can be used to hook into scripting-language matrix packages such as Numeric Python. However, it should also be stressed that some care is in order. For example, when crossing languages you may need to worry about issues such as row-major vs. column-major ordering (and perform conversions if needed). Note that multi-argument typemaps cannot deal with non-consecutive C/C++ arguments; a workaround such as a helper function re-ordering the arguments to make them consecutive will need to be written.

    13.10 Typemap warnings

    Warnings can be added to typemaps so that SWIG generates a warning message whenever the typemap is used. See the information in the issuing warnings section.

    13.11 Typemap fragments

    The primary purpose of fragments is to reduce code bloat that repeated use of typemap code can lead to. Fragments are snippets of code that can be thought of as code dependencies of a typemap. If a fragment is used by more than one typemap, then the snippet of code within the fragment is only generated once. Code bloat is typically reduced by moving typemap code into a support function and then placing the support function into a fragment.

    For example, if you have a very long typemap

    %typemap(in) MyClass * {
      MyClass *value = 0;
    
      ... many lines of marshalling code  ...
    
      $result = value;
    }
    

    the same marshalling code is often repeated in several typemaps, such as "in", "varin", "directorout", etc. SWIG copies the code for each argument that requires the typemap code, easily leading to code bloat in the generated code. To eliminate this, define a fragment that includes the common marshalling code:

    %fragment("AsMyClass", "header") {
      MyClass *AsMyClass(PyObject *obj) {
        MyClass *value = 0;
    
        ... many lines of marshalling code  ...
    
        return value;
      }
    }
    
    %typemap(in, fragment="AsMyClass") MyClass * {
      $result = AsMyClass($input);
    }
    
    %typemap(varin, fragment="AsMyClass") MyClass * {
      $result = AsMyClass($input);
    }
    

    When the "in" or "varin" typemaps for MyClass are required, the contents of the fragment called "AsMyClass" is added to the "header" section within the generated code, and then the typemap code is emitted. Hence, the method AsMyClass will be generated into the wrapper code before any typemap code that calls it.

    To define a fragment you need a fragment name, a section name for generating the fragment code into, and the code itself. See Code insertion blocks for a full list of section names. Usually the section name used is "header". Different delimiters can be used:

    %fragment("my_name", "header") %{ ... %}
    %fragment("my_name", "header") { ... }
    %fragment("my_name", "header") " ... "
    

    and these follow the usual preprocessing rules mentioned in the Preprocessing delimiters section. The following are some rules and guidelines for using fragments:

    1. A fragment is added to the wrapping code only once. When using the MyClass * typemaps above and wrapping the method:

      void foo(MyClass *a, MyClass *b);
      

      the generated code will look something like:

      MyClass *AsMyClass(PyObject *obj) {
        ...
      }
      
      void _wrap_foo(...) {
        ....
        arg1 = AsMyClass(obj1);
        arg2 = AsMyClass(obj2);
        ...
        foo(arg1, arg2);
      }
      

      even as there is duplicated typemap code to process both a and b, the AsMyClass method will be defined only once.

    2. A fragment should only be defined once. If there is more than one definition, the first definition is the one used. All other definitions are silently ignored. For example, if you have

      %fragment("AsMyClass", "header") { ...definition 1... }
      ....
      %fragment("AsMyClass", "header") { ...definition 2... }
      

      only the first definition is used. In this way you can override the default fragments in a SWIG library by defining your fragment before the library %include. Note that this behavior is the opposite to typemaps, where the last typemap defined/applied prevails. Fragments follow the first-in-first-out convention since they are intended to be global, while typemaps are intended to be locally specialized.

    3. Fragment names cannot contain commas.

    4. A fragment can use one or more additional fragments, for example:

      %fragment("<limits.h>", "header") %{
        #include <limits.h>
      %}
      
      
      %fragment("AsMyClass", "header", fragment="<limits.h>") {
        MyClass *AsMyClass(PyObject *obj) {
          MyClass *value = 0;
      
          ... some marshalling code  ...
      
          if  (ival < CHAR_MIN /*defined in <limits.h>*/) {
            ...
          } else {
            ...
          }
          ...
          return value;
        }
      }
      

      in this case, when the "AsMyClass" fragment is emitted, it also triggers the inclusion of the "<limits.h>" fragment.

    5. A fragment can have dependencies on a number of other fragments, for example:

      %fragment("bigfragment", "header", fragment="frag1", fragment="frag2", fragment="frag3") "";
      

      When the "bigfragment" is used, the three dependent fragments "frag1", "frag2" and "frag3" are also pulled in. Note that as "bigframent" is empty (the empty string - ""), it does not add any code itself, but merely triggers the inclusion of the other fragments.

    6. A typemap can also use more than one fragment, but since the syntax is different, you need to specify the dependent fragments in a comma separated list. Consider:

      %typemap(in, fragment="frag1, frag2, frag3") {...}
      

      which is equivalent to:

      %typemap(in, fragment="bigfragment") {...}
      

      when used with the "bigfragment" defined above.

    7. Finally, you can force the inclusion of a fragment at any point in the generated code as follows:

      %fragment("bigfragment");
      

      which, for example, is very useful inside a template class. Another useful case is when using %extend inside a class where the additional code in the %extend block depends on the contents of the fragment.

      %fragment("<limits.h>", "header") %{
        #include <limits.h>
      %}
      
      struct X {
        ...
        %extend {
          %fragment("<limits.h>");
          bool check(short val) {
            if (val < SHRT_MIN /*defined in <limits.h>*/) {
              return true;
            } else {
              return false;
            }
          }
        }
      };
      

      Forced inclusion of fragments can be used as a replacement for code insertion block, ensuring the code block is only generated once. Consider the contents of FileA.i below which first uses a code insertion block and then a forced fragment inclusion to generate code:

      // FileA.i
      %{
        #include <stdio.h>
      %}
      %fragment("<limits.h>");
      

      and another file including the above:

      // FileB.i
      %include "FileA.i"
      

      The resulting code in the wrappers for FileB.i is:

        #include <stdio.h>
      
        #include <limits.h>
      

      A note of caution must be mentioned when using %fragment forced inclusion or code insertion blocks with %import. If %import is used instead:

      // FileC.i
      %import "FileA.i"
      

      then nothing is generated in the resulting code in the wrappers for FileC.i. This is because %import is for collecting type information and does not result in any code being generated, see File Imports.

    Most readers will probably want to skip the next two sub-sections on advanced fragment usage unless a desire to really get to grips with some powerful but tricky macro and fragment usage that is used in parts of the SWIG typemap library.

    13.11.1 Fragment type specialization

    Fragments can be type specialized. The syntax is as follows:

    %fragment("name", "header") { ...a type independent fragment... }
    %fragment("name"{type}, "header") { ...a type dependent fragment...  }
    

    where type is a C/C++ type. Like typemaps, fragments can also be used inside templates, for example:

    template <class T>
    struct A {
      %fragment("incode"{A<T>}, "header") {
        ... 'incode' specialized fragment ...
      }
    
      %typemap(in, fragment="incode"{A<T>}) {
        ... here we use the 'type specialized' fragment "incode"{A<T>} ...
      }
    };
    

    13.11.2 Fragments and automatic typemap specialization

    Since fragments can be type specialized, they can be elegantly used to specialize typemaps. For example, if you have something like:

    %fragment("incode"{float}, "header") {
      float in_method_float(PyObject *obj) {
        ...
      }
    }
    
    %fragment("incode"{long}, "header") {
      float in_method_long(PyObject *obj) {
        ...
      }
    }
    
    // %my_typemaps macro definition
    %define %my_typemaps(Type) 
    %typemap(in, fragment="incode"{Type}) Type {
      value = in_method_##Type(obj);
    }
    %enddef
    
    %my_typemaps(float);
    %my_typemaps(long);
    

    then the proper "incode"{float} or "incode"{long} fragment will be used, and the in_method_float and in_method_long methods will be called whenever the float or long types are used as input parameters.

    This feature is used a lot in the typemaps shipped in the SWIG library for some scripting languages. The interested (or very brave) reader can take a look at the fragments.swg file shipped with SWIG to see this in action.

    13.12 The run-time type checker

    Most scripting languages need type information at run-time. This type information can include how to construct types, how to garbage collect types, and the inheritance relationships between types. If the language interface does not provide its own type information storage, the generated SWIG code needs to provide it.

    Requirements for the type system:

    • Store inheritance and type equivalence information and be able to correctly re-create the type pointer.
    • Share type information between modules.
    • Modules can be loaded in any order, regardless of actual type dependency.
    • Avoid the use of dynamically allocated memory, and library/system calls in general.
    • Provide a reasonably fast implementation, minimizing the lookup time for all language modules.
    • Custom, language specific information can be attached to types.
    • Modules can be unloaded from the type system.

    13.12.1 Implementation

    The run-time type checker is used by many, but not all, of SWIG's supported target languages. The run-time type checker features are not required and are thus not used for statically typed languages such as Java and C#. The scripting and scheme based languages rely on it and it forms a critical part of SWIG's operation for these languages.

    When pointers, arrays, and objects are wrapped by SWIG, they are normally converted into typed pointer objects. For example, an instance of Foo * might be a string encoded like this:

    _108e688_p_Foo
    

    At a basic level, the type checker simply restores some type-safety to extension modules. However, the type checker is also responsible for making sure that wrapped C++ classes are handled correctly---especially when inheritance is used. This is especially important when an extension module makes use of multiple inheritance. For example:

    class Foo {
    public:
      int x;
    };
    
    class Bar {
    public:
      int y;
    };
    
    class FooBar : public Foo, public Bar {
    public:
      int z;
    };
    

    When the class FooBar is organized in memory, it contains the contents of the classes Foo and Bar as well as its own data members. For example:

    FooBar --> | -----------|  <-- Foo
               |   int x    |
               |------------|  <-- Bar
               |   int y    |
               |------------|
               |   int z    |
               |------------|
    

    Because of the way that base class data is stacked together, the casting of a Foobar * to either of the base classes may change the actual value of the pointer. This means that it is generally not safe to represent pointers using a simple integer or a bare void *---type tags are needed to implement correct handling of pointer values (and to make adjustments when needed).

    In the wrapper code generated for each language, pointers are handled through the use of special type descriptors and conversion functions. For example, if you look at the wrapper code for Python, you will see code similar to the following (simplified for brevity):

    if (!SWIG_IsOK(SWIG_ConvertPtr(obj0, (void **) &arg1, SWIGTYPE_p_Foo, 0))) {
      SWIG_exception_fail(SWIG_TypeError, "in method 'GrabVal', expecting type Foo");
    }
    

    In this code, SWIGTYPE_p_Foo is the type descriptor that describes Foo *. The type descriptor is actually a pointer to a structure that contains information about the type name to use in the target language, a list of equivalent typenames (via typedef or inheritance), and pointer value handling information (if applicable). The SWIG_ConvertPtr() function is simply a utility function that takes a pointer object in the target language and a type-descriptor object and uses this information to generate a C++ pointer. The SWIG_IsOK macro checks the return value for errors and SWIG_exception_fail can be called to raise an exception in the target language. However, the exact name and calling conventions of the conversion function depends on the target language (see language specific chapters for details).

    The actual type code is in swigrun.swg, and gets inserted near the top of the generated swig wrapper file. The phrase "a type X that can cast into a type Y" means that given a type X, it can be converted into a type Y. In other words, X is a derived class of Y or X is a typedef of Y. The structure to store type information looks like this:

    /* Structure to store information on one type */
    typedef struct swig_type_info {
      const char *name;             /* mangled name of this type */
      const char *str;              /* human readable name for this type */
      swig_dycast_func dcast;       /* dynamic cast function down a hierarchy */
      struct swig_cast_info *cast;  /* Linked list of types that can cast into this type */
      void *clientdata;             /* Language specific type data */
    } swig_type_info;
    
    /* Structure to store a type and conversion function used for casting */
    typedef struct swig_cast_info {
      swig_type_info *type;          /* pointer to type that is equivalent to this type */
      swig_converter_func converter; /* function to cast the void pointers */
      struct swig_cast_info *next;   /* pointer to next cast in linked list */
      struct swig_cast_info *prev;   /* pointer to the previous cast */
    } swig_cast_info;
    

    Each swig_type_info stores a linked list of types that it is equivalent to. Each entry in this doubly linked list stores a pointer back to another swig_type_info structure, along with a pointer to a conversion function. This conversion function is used to solve the above problem of the FooBar class, correctly returning a pointer to the type we want.

    The basic problem we need to solve is verifying and building arguments passed to functions. So going back to the SWIG_ConvertPtr() function example from above, we are expecting a Foo * and need to check if obj0 is in fact a Foo *. From before, SWIGTYPE_p_Foo is just a pointer to the swig_type_info structure describing Foo *. So we loop through the linked list of swig_cast_info structures attached to SWIGTYPE_p_Foo. If we see that the type of obj0 is in the linked list, we pass the object through the associated conversion function and then return a positive. If we reach the end of the linked list without a match, then obj0 can not be converted to a Foo * and an error is generated.

    Another issue needing to be addressed is sharing type information between multiple modules. More explicitly, we need to have ONE swig_type_info for each type. If two modules both use the type, the second module loaded must lookup and use the swig_type_info structure from the module already loaded. Because no dynamic memory is used and the circular dependencies of the casting information, loading the type information is somewhat tricky, and not explained here. A complete description is in the Lib/swiginit.swg file (and near the top of any generated file).

    Each module has one swig_module_info structure which looks like this:

    /* Structure used to store module information
     * Each module generates one structure like this, and the runtime collects
     * all of these structures and stores them in a circularly linked list.*/
    typedef struct swig_module_info {
      swig_type_info **types;         /* Array of pointers to swig_type_info structs in this module */
      int size;                       /* Number of types in this module */
      struct swig_module_info *next;  /* Pointer to next element in circularly linked list */
      swig_type_info **type_initial;  /* Array of initially generated type structures */
      swig_cast_info **cast_initial;  /* Array of initially generated casting structures */
      void *clientdata;               /* Language specific module data */
    } swig_module_info;
    

    Each module stores an array of pointers to swig_type_info structures and the number of types in this module. So when a second module is loaded, it finds the swig_module_info structure for the first module and searches the array of types. If any of its own types are in the first module and have already been loaded, it uses those swig_type_info structures rather than creating new ones. These swig_module_info structures are chained together in a circularly linked list.

    13.12.2 Usage

    This section covers how to use these functions from typemaps. To learn how to call these functions from external files (not the generated _wrap.c file), see the External access to the run-time system section.

    When pointers are converted in a typemap, the typemap code often looks similar to this:

    %typemap(in) Foo * {
      if (!SWIG_IsOK(SWIG_ConvertPtr($input, (void **) &$1, $1_descriptor, 0))) {
        SWIG_exception_fail(SWIG_TypeError, "in method '$symname', expecting type Foo");
      }
    }
    

    The most critical part is the typemap is the use of the $1_descriptor special variable. When placed in a typemap, this is expanded into the SWIGTYPE_* type descriptor object above. As a general rule, you should always use $1_descriptor instead of trying to hard-code the type descriptor name directly.

    There is another reason why you should always use the $1_descriptor variable. When this special variable is expanded, SWIG marks the corresponding type as "in use." When type-tables and type information is emitted in the wrapper file, descriptor information is only generated for those datatypes that were actually used in the interface. This greatly reduces the size of the type tables and improves efficiency.

    Occasionally, you might need to write a typemap that needs to convert pointers of other types. To handle this, the special variable macro $descriptor(type) covered earlier can be used to generate the SWIG type descriptor name for any C datatype. For example:

    %typemap(in) Foo * {
      if (!SWIG_IsOK(SWIG_ConvertPtr($input, (void **) &$1, $1_descriptor, 0))) {
        Bar *temp;
        if (!SWIG_IsOK(SWIG_ConvertPtr($input, (void **) &temp, $descriptor(Bar *), 0))) {
          SWIG_exception_fail(SWIG_TypeError, "in method '$symname', expecting type Foo or Bar");
        }
        $1 = (Foo *)temp;
      }
    }
    

    The primary use of $descriptor(type) is when writing typemaps for container objects and other complex data structures. There are some restrictions on the argument---namely it must be a fully defined C datatype. It can not be any of the special typemap variables.

    In certain cases, SWIG may not generate type-descriptors like you expect. For example, if you are converting pointers in some non-standard way or working with an unusual combination of interface files and modules, you may find that SWIG omits information for a specific type descriptor. To fix this, you may need to use the %types directive. For example:

    %types(int *, short *, long *, float *, double *);
    

    When %types is used, SWIG generates type-descriptor information even if those datatypes never appear elsewhere in the interface file.

    Further details about the run-time type checking can be found in the documentation for individual language modules. Reading the source code may also help. The file Lib/swigrun.swg in the SWIG library contains all of the source of the generated code for type-checking. This code is also included in every generated wrapped file so you probably just look at the output of SWIG to get a better sense for how types are managed.

    13.13 Typemaps and overloading

    This section does not apply to the statically typed languages like Java and C#, where overloading of the types is handled much like C++ by generating overloaded methods in the target language. In many of the other target languages, SWIG still fully supports C++ overloaded methods and functions. For example, if you have a collection of functions like this:

    int foo(int x);
    int foo(double x);
    int foo(char *s, int y);
    

    You can access the functions in a normal way from the scripting interpreter:

    # Python
    foo(3)           # foo(int)
    foo(3.5)         # foo(double)
    foo("hello", 5)  # foo(char *, int)
    
    # Tcl
    foo 3            # foo(int)
    foo 3.5          # foo(double)
    foo hello 5      # foo(char *, int)
    

    To implement overloading, SWIG generates a separate wrapper function for each overloaded method. For example, the above functions would produce something roughly like this:

    // wrapper pseudocode
    _wrap_foo_0(argc, args[]) {       // foo(int)
      int arg1;
      int result;
      ...
      arg1 = FromInteger(args[0]);
      result = foo(arg1);
      return ToInteger(result);
    }
    
    _wrap_foo_1(argc, args[]) {       // foo(double)
      double arg1;
      int result;
      ...
      arg1 = FromDouble(args[0]);
      result = foo(arg1);
      return ToInteger(result);
    }
    
    _wrap_foo_2(argc, args[]) {       // foo(char *, int)
      char *arg1;
      int   arg2;
      int result;
      ...
      arg1 = FromString(args[0]);
      arg2 = FromInteger(args[1]);
      result = foo(arg1, arg2);
      return ToInteger(result);
    }
    
    

    Next, a dynamic dispatch function is generated:

    _wrap_foo(argc, args[]) {
      if (argc == 1) {
        if (IsInteger(args[0])) {
          return _wrap_foo_0(argc, args);
        }
        if (IsDouble(args[0])) {
          return _wrap_foo_1(argc, args);
        }
      }
      if (argc == 2) {
        if (IsString(args[0]) && IsInteger(args[1])) {
          return _wrap_foo_2(argc, args);
        }
      }
      error("No matching function!\n");
    }
    

    The purpose of the dynamic dispatch function is to select the appropriate C++ function based on argument types---a task that must be performed at runtime in most of SWIG's target languages.

    The generation of the dynamic dispatch function is a relatively tricky affair. Not only must input typemaps be taken into account (these typemaps can radically change the types of arguments accepted), but overloaded methods must also be sorted and checked in a very specific order to resolve potential ambiguity. A high-level overview of this ranking process is found in the "SWIG and C++" chapter. What isn't mentioned in that chapter is the mechanism by which it is implemented---as a collection of typemaps.

    To support dynamic dispatch, SWIG first defines a general purpose type hierarchy as follows:

    Symbolic Name                   Precedence Value
    ------------------------------  ------------------
    SWIG_TYPECHECK_POINTER           0
    SWIG_TYPECHECK_ITERATOR          5
    SWIG_TYPECHECK_VOIDPTR           10
    SWIG_TYPECHECK_BOOL              15
    SWIG_TYPECHECK_UINT8             20
    SWIG_TYPECHECK_INT8              25
    SWIG_TYPECHECK_UINT16            30
    SWIG_TYPECHECK_INT16             35
    SWIG_TYPECHECK_UINT32            40
    SWIG_TYPECHECK_INT32             45
    SWIG_TYPECHECK_SIZE              47
    SWIG_TYPECHECK_PTRDIFF           48
    SWIG_TYPECHECK_UINT64            50
    SWIG_TYPECHECK_INT64             55
    SWIG_TYPECHECK_UINT128           60
    SWIG_TYPECHECK_INT128            65
    SWIG_TYPECHECK_INTEGER           70
    SWIG_TYPECHECK_FLOAT             80
    SWIG_TYPECHECK_DOUBLE            90
    SWIG_TYPECHECK_CPLXFLT           95
    SWIG_TYPECHECK_CPLXDBL           100
    SWIG_TYPECHECK_COMPLEX           105
    SWIG_TYPECHECK_UNICHAR           110
    SWIG_TYPECHECK_STDUNISTRING      115
    SWIG_TYPECHECK_UNISTRING         120
    SWIG_TYPECHECK_CHAR              130
    SWIG_TYPECHECK_STDSTRING         135
    SWIG_TYPECHECK_STRING            140
    SWIG_TYPECHECK_PAIR              150
    SWIG_TYPECHECK_STDARRAY          155
    SWIG_TYPECHECK_VECTOR            160
    SWIG_TYPECHECK_DEQUE             170
    SWIG_TYPECHECK_LIST              180
    SWIG_TYPECHECK_SET               190
    SWIG_TYPECHECK_MULTISET          200
    SWIG_TYPECHECK_MAP               210
    SWIG_TYPECHECK_MULTIMAP          220
    SWIG_TYPECHECK_STACK             230
    SWIG_TYPECHECK_QUEUE             240
    SWIG_TYPECHECK_BOOL_ARRAY        1015
    SWIG_TYPECHECK_INT8_ARRAY        1025
    SWIG_TYPECHECK_INT16_ARRAY       1035
    SWIG_TYPECHECK_INT32_ARRAY       1045
    SWIG_TYPECHECK_INT64_ARRAY       1055
    SWIG_TYPECHECK_INT128_ARRAY      1065
    SWIG_TYPECHECK_FLOAT_ARRAY       1080
    SWIG_TYPECHECK_DOUBLE_ARRAY      1090
    SWIG_TYPECHECK_CHAR_ARRAY        1130
    SWIG_TYPECHECK_STRING_ARRAY      1140
    SWIG_TYPECHECK_OBJECT_ARRAY      1150
    SWIG_TYPECHECK_BOOL_PTR          2015
    SWIG_TYPECHECK_UINT8_PTR         2020
    SWIG_TYPECHECK_INT8_PTR          2025
    SWIG_TYPECHECK_UINT16_PTR        2030
    SWIG_TYPECHECK_INT16_PTR         2035
    SWIG_TYPECHECK_UINT32_PTR        2040
    SWIG_TYPECHECK_INT32_PTR         2045
    SWIG_TYPECHECK_UINT64_PTR        2050
    SWIG_TYPECHECK_INT64_PTR         2055
    SWIG_TYPECHECK_FLOAT_PTR         2080
    SWIG_TYPECHECK_DOUBLE_PTR        2090
    SWIG_TYPECHECK_CHAR_PTR          2130
    SWIG_TYPECHECK_SWIGOBJECT        5000
    

    (These precedence levels are defined in swig.swg, a library file that's included by all target language modules.)

    In this table, the precedence-level determines the order in which types are going to be checked. Low values are always checked before higher values. For example, integers are checked before floats, single values are checked before arrays, and so forth.

    Using the above table as a guide, each target language defines a collection of "typecheck" typemaps. The following excerpt from the Python module illustrates this:

    /* Python type checking rules */
    /* Note:  %typecheck(X) is a macro for %typemap(typecheck, precedence=X) */
    
    %typecheck(SWIG_TYPECHECK_INTEGER)
      int, short, long,
      unsigned int, unsigned short, unsigned long,
      signed char, unsigned char,
      long long, unsigned long long,
      const int &, const short &, const long &,
      const unsigned int &, const unsigned short &, const unsigned long &,
      const long long &, const unsigned long long &,
      enum SWIGTYPE,
      bool, const bool &
    {
      $1 = (PyInt_Check($input) || PyLong_Check($input)) ? 1 : 0;
    }
    
    %typecheck(SWIG_TYPECHECK_DOUBLE)
      float, double,
      const float &, const double &
    {
      $1 = (PyFloat_Check($input) || PyInt_Check($input) || PyLong_Check($input)) ? 1 : 0;
    }
    
    %typecheck(SWIG_TYPECHECK_CHAR) char {
      $1 = (PyString_Check($input) && (PyString_Size($input) == 1)) ? 1 : 0;
    }
    
    %typecheck(SWIG_TYPECHECK_STRING) char * {
      $1 = PyString_Check($input) ? 1 : 0;
    }
    
    %typemap(typecheck, precedence=SWIG_TYPECHECK_POINTER, noblock=1) SWIGTYPE * {
      void *vptr = 0;
      int res = SWIG_ConvertPtr($input, &vptr, $1_descriptor, 0);
      $1 = SWIG_IsOK(res) ? 1 : 0;
    }
    
    %typecheck(SWIG_TYPECHECK_POINTER) PyObject * {
      $1 = ($input != 0);
    }
    

    It might take a bit of contemplation, but this code has merely organized all of the basic C++ types, provided some simple type-checking code, and assigned each type a precedence value.

    Finally, to generate the dynamic dispatch function, SWIG uses the following algorithm:

    • Overloaded methods are first sorted by the number of required arguments.
    • Methods with the same number of arguments are then sorted by precedence values of argument types.
    • Typecheck typemaps are then emitted to produce a dispatch function that checks arguments in the correct order.

    If you haven't written any typemaps of your own, it is unnecessary to worry about the typechecking rules. However, if you have written new input typemaps, you might have to supply a typechecking rule as well. An easy way to do this is to simply copy one of the existing typechecking rules. Here is an example,

    // Typemap for a C++ string
    %typemap(in) std::string {
      if (PyString_Check($input)) {
        $1 = std::string(PyString_AsString($input));
      } else {
        SWIG_exception(SWIG_TypeError, "string expected");
      }
    }
    // Copy the typecheck code for "char *".  
    %typemap(typecheck) std::string = char *;
    

    The bottom line: If you are writing new typemaps and you are using overloaded methods, you will probably have to write new typecheck code or copy and modify existing typecheck code.

    If you write a typecheck typemap and omit the precedence level, for example commenting it out as shown below:

    %typemap(typecheck /*, precedence=SWIG_TYPECHECK_INTEGER*/) int {
      $1 = PyInt_Check($input) ? 1 : 0;
    }
    

    then the type is given a precedence higher than any other known precedence level and a warning is issued:

    example.i:18: Warning 467: Overloaded method foo(int) not supported (incomplete type
    checking rule - no precedence level in typecheck typemap for 'int').
    

    Notes:

    • Typecheck typemaps are not used for non-overloaded methods. Because of this, it is still always necessary to check types in any "in" typemaps.
    • The dynamic dispatch process is only meant to be a heuristic. There are many corner cases where SWIG simply can't disambiguate types to the same degree as C++. The only way to resolve this ambiguity is to use the %rename directive to rename one of the overloaded methods (effectively eliminating overloading).
    • Typechecking may be partial. For example, if working with arrays, the typecheck code might simply check the type of the first array element and use that to dispatch to the correct function. Subsequent "in" typemaps would then perform more extensive type-checking.
    • Make sure you read the section on overloading in the SWIG and C++ chapter.

    13.13.1 SWIG_TYPECHECK_POINTER precedence level and the typecheck typemap

    When it comes to overloading of a particular type passed by value, pointer or reference (const and non-const), a C++ compiler can disambiguate which overloaded function to call. However, SWIG effectively treats these as pointers in the target language and thus as equivalent types. For example, consider:

    class X { ... };
    void m(X const &c); // equivalent: void m(X *c);
    void m(X &r);       // equivalent: void m(X *r);
    void m(X *p);       // equivalent: void m(X *p);
    

    These cannot be disambiguated in the target languages and so SWIG will choose the first method and ignore the subsequent two methods. The scripting languages do this by using the overload dispatch mechanism described earlier and warnings indicate this:

    example.i:6: Warning 509: Overloaded method m(X &) effectively ignored,
    example.i:5: Warning 509: as it is shadowed by m(X const &).
    example.i:7: Warning 509: Overloaded method m(X *) effectively ignored,
    example.i:5: Warning 509: as it is shadowed by m(X const &).
    

    The statically typed languages like Java and C# automatically ignore all but the first equivalent overloaded methods with warnings:

    example.i:6: Warning 516: Overloaded method m(X &) ignored,
    example.i:5: Warning 516: using m(X const &) instead.
    example.i:7: Warning 516: Overloaded method m(X *) ignored,
    example.i:5: Warning 516: using m(X const &) instead.
    

    You can select the overloaded method you would like to wrap by ignoring the other two with %ignore or rename two of them with %rename and this will of course remove the warnings too. The problem of ambiguity is also discussed in the C++ chapter on overloading.

    So how does this work with respect to typemaps? The typemaps SWIG provides to handle overloading for these three methods are from the SWIGTYPE family. As discussed earlier, in Default typemap matching rules, the SWIGTYPE & typemaps are used for references and SWIGTYPE * typemaps are used for pointers. SWIG uses the special SWIG_TYPECHECK_POINTER (0) precedence level to handle these types in the "typecheck" typemap:

    %typemap(typecheck, precedence=SWIG_TYPECHECK_POINTER) SWIGTYPE & "..."
    %typemap(typecheck, precedence=SWIG_TYPECHECK_POINTER) SWIGTYPE * "..."
    

    When the SWIGTYPE "typecheck" typemaps use the SWIG_TYPECHECK_POINTER precedence level, SWIG converts the type to a pointer equivalent type and then uses the equivalent type to detect if it can be disambiguated in an overloaded method in the target language. In our example above, the equivalent types for X const &, X & and X * are all X *. As they are the same, they cannot be disambiguated and so just the first overloaded method is chosen.

    The automatic conversion to equivalent types and subsequent type comparison is triggered via the use of the special SWIG_TYPECHECK_POINTER precedence level and works for types passed by value, pointer and reference. Alas, there are more ways to overload a method that also need handling. C++ smart pointers are such a type which can be disambiguated by a C++ compiler but not automatically by SWIG. SWIG does not automatically know that a smart pointer has an equivalent type, but it can be told manually. Just specify the 'equivalent' attribute in the "typecheck" typemap with a pointer to the underlying type.

    %typemap(typecheck, precedence=SWIG_TYPECHECK_POINTER, equivalent="X *") MySmartPtr<X> " ... "
    
    void m(X &r);            // equivalent: void m(X *r);
    void m(MySmartPtr<X> s); // equivalent: void m(X *s);
    

    Now SWIG will detect the two types are equivalent and generate valid code by wrapping just the first overloaded method. You can of course choose which method to wrap by ignoring one of them with %ignore. Otherwise both can be wrapped by removing the overloading name ambiguity by renaming one of them with %rename.

    The 'equivalent' attribute is used in the implementation for the shared_ptr smart pointer library.

    13.14 More about %apply and %clear

    In order to implement certain kinds of program behavior, it is sometimes necessary to write a family of typemap methods. For example, to support output arguments, one often writes a family of typemaps like this:

    %typemap(in, numinputs=0) int *OUTPUT (int temp) {
      $1 = &temp;
    }
    %typemap(argout) int *OUTPUT {
      // return value somehow
    }
    

    To make it easier to apply the typemap to different argument types and names, the %apply directive performs a copy of all typemaps from a source type to one or more set of target types. For example, if you specify this,

    %apply int *OUTPUT { int *retvalue, int32 *output };
    

    then all of the int *OUTPUT (source) typemap methods are copied to int *retvalue and int32 *output (the targets).

    However, there is a subtle aspect of %apply that needs clarification. Namely, if a target contains a typemap method that the source does not, the target typemap method remains in place and unchanged. This behavior allows you to do two things:

    • You can specialize parts of a complex typemap rule by first defining a few typemaps and then using %apply to incorporate the remaining pieces.
    • Different typemaps can be applied to the same datatype using repeated %apply directives.

    For example:

    %typemap(in) int *INPUT (int temp) {
      temp = ... get value from $input ...;
      $1 = &temp;
    }
    
    %typemap(check) int *POSITIVE {
      if (*$1 <= 0) {
        SWIG_exception(SWIG_ValueError, "Expected a positive number!\n");
        return NULL;
      }
    }
    
    %typemap(arginit) int *invalue %{
      $1 = NULL;
    %}
    
    ...
    %apply int *INPUT     { int *invalue };
    %apply int *POSITIVE  { int *invalue };
    

    In this example, neither of the two %apply directives will overwrite / delete the "arginit" typemap as neither has an "arginit" typemap. The result is a family of three relevant typemaps for int *invalue. Since %apply does not overwrite / delete any existing rules, the only way to reset behavior is to delete them, such as with the %clear directive. For example:

    %clear int *invalue;
    

    will delete the typemaps for all the typemap methods; namely "in", "check" and "arginit". Alternatively delete each one individually:

    %typemap(in) int *invalue;
    %typemap(check) int *invalue;
    %typemap(arginit) int *invalue;
    

    13.15 Passing data between typemaps

    It is also important to note that the primary use of local variables is to create stack-allocated objects for temporary use inside a wrapper function (this is faster and less-prone to error than allocating data on the heap). In general, the variables are not intended to pass information between different types of typemaps. However, this can be done if you realize that local names have the argument number appended to them. For example, you could do this:

    %typemap(in) int *(int temp) {
      temp = (int) PyInt_AsLong($input);
      $1 = &temp;
    }
    
    %typemap(argout) int * {
      PyObject *o = PyInt_FromLong(temp$argnum);
      ...
    }
    

    In this case, the $argnum variable is expanded into the argument number. Therefore, the code will reference the appropriate local such as temp1 and temp2. It should be noted that there are plenty of opportunities to break the universe here and that accessing locals in this manner should probably be avoided. At the very least, you should make sure that the typemaps sharing information have exactly the same types and names.

    13.16 C++ "this" pointer

    All the rules discussed for typemaps apply to C++ as well as C. However in addition C++ passes an extra parameter into every non-static class method -- the this pointer. Occasionally it can be useful to apply a typemap to this pointer (for example to check and make sure this is non-null before deferencing). Actually, C also has an the equivalent of the this pointer which is used when accessing variables in a C struct.

    In order to customise the this pointer handling, target a variable named self in your typemaps. self is the name SWIG uses to refer to the extra parameter in wrapped functions.

    For example, if wrapping for Java generation:

    %typemap(check) SWIGTYPE *self %{
    if (!$1) {
      SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException,
        "invalid native object; delete() likely already called");
      return $null;
    }
    %}
    

    In the above case, the $1 variable is expanded into the argument name that SWIG is using as the this pointer. SWIG will then insert the check code before the actual C++ class method is called, and will raise an exception rather than crash the Java virtual machine. The generated code will look something like:

      if (!arg1) {
        SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException,
          "invalid native object; delete() likely already called");
        return ;
      }
      (arg1)->wrappedFunction(...);
    

    Note that if you have a parameter named self then it will also match the typemap. One work around is to create an interface file that wraps the method, but gives the argument a name other than self.

    13.17 Where to go for more information?

    The best place to find out more information about writing typemaps is to look in the SWIG library. Most language modules define all of their default behavior using typemaps. These are found in files such as python.swg, perl5.swg, tcl8.swg and so forth. The typemaps.i file in the library also contains numerous examples. You should look at these files to get a feel for how to define typemaps of your own. Some of the language modules support additional typemaps and further information is available in the individual chapters for each target language. There you may also find more hands-on practical examples.

    swig-4.0.1/Doc/Manual/Allegrocl.html0000644000175000017500000021100713527063513017065 0ustar williamwilliam SWIG and Allegro Common Lisp

    20 SWIG and Allegro Common Lisp

    This chapter describes SWIG's support of Allegro Common Lisp. Allegro CL is a full-featured implementation of the Common Lisp language standard that includes many vendor-specific enhancements and add-on modules for increased usability.

    One such module included in Allegro CL is the Foreign Functions Interface (FFI). This module, tailored primarily toward interfacing with C/C++ and, historically, Fortran, provides a means by which compiled foreign code can be loaded into a running lisp environment and executed. The interface supports the calling of foreign functions and methods, allows for executing lisp routines from foreign code (callbacks), and the passing of data between foreign and lisp code.

    The goal of this module is to make it possible to quickly generate the necessary foreign function definitions so one can make use of C/C++ foreign libraries directly from lisp without the tedium of having to code them by hand. When necessary, it will also generate further C/C++ code that will need to be linked with the intended library for proper interfacing from lisp. It has been designed with an eye toward flexibility. Some foreign function calls may release the heap, while other should not. Some foreign functions should automatically convert lisp strings into native strings, while others should not. These adjustments and many more are possible with the current module.

    It is significant to note that, while this is a vendor-specific module, we would like to acknowledge the current and ongoing work by developers in the open source lisp community that are working on similar interfaces to implementation-independent foreign function interfaces (CFFI, for example). Such work can only benefit the lisp community, and we would not be unhappy to see some enterprising folk use this work to add to it.

    20.1 Basics

    20.1.1 Running SWIG

    If you're reading this, you must have some library you need to generate an interface for. In order for SWIG to do this work, however, it needs a bit of information about how it should go about creating your interface, and what you are interfacing to.

    SWIG expects a description of what in the foreign interface you wish to connect to. It must consisting of C/C++ declarations and special SWIG directives. SWIG can be furnished with a header file, but an interface can also be generated without library headers by supplying a simple text file--called the interface file, which is typically named with a .i extension--containing any foreign declarations of identifiers you wish to use. The most common approach is to use an interface file with directives to parse the needed headers. A straight parse of library headers will result in usable code, but SWIG directives provides much freedom in how a user might tailor the generated code to their needs or style of coding.

    Note that SWIG does not require any function definitions; the declarations of those functions is all that is necessary. Be careful when tuning the interface as it is quite possible to generate code that will not load or compile.

    An example interface file is shown below. It makes use of two SWIG directives, one of which requests that the declarations in a header file be used to generate part of the interface, and also includes an additional declaration to be added.

    example.i
    %module example
    
    %include "header.h"
    
    int fact(int n);
    

    The contents of header.h are very simple:

    header.h
    int fact(char *statement);   // pass it a fact, and it will rate it.
    

    The contents of example.cl will look like this:

    example.cl
    (defpackage :example
      (:use :common-lisp :swig :ff :excl))
    
      ... helper routines for defining the interface ...
    
    (swig-in-package ())
    
    (swig-defun ("fact")
      ((PARM0_statement cl:string (* :char) ))
      (:returning (:int )
       :strings-convert t)
      (let ((SWIG_arg0 PARM0_statement))
      (swig-ff-call SWIG_arg0)))
    
    (swig-defun ("fact")
      ((PARM0_n cl:integer :int ))
      (:returning (:int )
       :strings-convert t)
      (let ((SWIG_arg0 PARM0_n))
      (swig-ff-call SWIG_arg0)))
    
    (swig-dispatcher ("fact" :type :function :arities (1)))
    

    The generated file contains calls to internal swig helper functions. In this case there are two calls to swig-defun. These calls will expand into code that will make the appropriate definitions using the Allegro FFI. Note also, that this code is erroneous. Function overloading is not supported in C, and this code will not compile even though SWIG did not complain.

    In order to generate a C interface to Allegro CL using this code run swig using the -allegrocl option, as below:

    % swig -allegrocl example.i
    

    When building an interface to C++ code, include the -c++ option:

    % swig -allegrocl -c++ example.i
    

    As a result of running one of the above commands, a file named example.cl will be generated containing the lisp side of the interface. As well, a file example_wrap.cxx is also generated, containing C/C++ wrapper code to facilitate access to C++ methods, enumeration values, and constant values. Wrapper functions are necessary in C++ due to the lack of a standard for mangling the names of symbols across all C++ compilers. These wrapper functions are exported from the shared library as appropriate, using the C name mangling convention. The lisp code that is generated will interface to your foreign library through these wrappers.

    It is possible to disable the creation of the .cxx file when generating a C interface by using the -nocwrap command-line argument. For interfaces that don't contain complex enum or constant expressions, contain nested struct/union declarations, or doesn't need to use many of the SWIG customization featuers, this will result in a more streamlined, direct interface to the intended module.

    The generated wrapper file is below. It contains very simple wrappers by default, that simply pass the arguments to the actual function.

    example_wrap.i
      ... lots of SWIG internals ...
    
    EXPORT int ACL___fact__SWIG_0 (char *larg1) {
      int lresult = (int)0 ;
      char *arg1 = (char *) 0 ;
      int result;
    
      arg1 = larg1;
      try {
        result = (int)fact(arg1);
    
        lresult = result;
        return lresult;
      } catch (...) {
        return (int)0;
      }
    }
    
    
    EXPORT int ACL___fact__SWIG_1 (int larg1) {
      int lresult = (int)0 ;
      int arg1 ;
      int result;
    
      arg1 = larg1;
      try {
        result = (int)fact(arg1);
    
        lresult = result;
        return lresult;
      } catch (...) {
        return (int)0;
      }
    }
    

    And again, the generated lisp code. Note that it differs from what is generated when parsing C code:

      ...
    
    (swig-in-package ())
    
    (swig-defmethod ("fact" "ACL___fact__SWIG_0" :type :function :arity 1)
      ((PARM0_statement cl:string (* :char) ))
      (:returning (:int )
       :strings-convert t)
      (let ((SWIG_arg0 PARM0_statement))
      (swig-ff-call SWIG_arg0)))
    
    (swig-defmethod ("fact" "ACL___fact__SWIG_1" :type :function :arity 1)
      ((PARM0_n cl:integer :int ))
      (:returning (:int )
       :strings-convert t)
      (let ((SWIG_arg0 PARM0_n))
      (swig-ff-call SWIG_arg0)))
    
    (swig-dispatcher ("fact" :type :function :arities (1)))
    

    In this case, the interface generates two swig-defmethod forms and a swig-dispatcher form. This provides a single functional interface for all overloaded routines. A more detailed description of this features is to be found in the section titled Function overloading/Parameter defaulting.

    In order to load a C++ interface, you will need to build a shared library from example_wrap.cxx. Be sure to link in the actual library you created the interface for, as well as any other dependent shared libraries. For example, if you intend to be able to call back into lisp, you will also need to link in the Allegro shared library. The library you create from the C++ wrapper will be what you then load into Allegro CL.

    20.1.2 Command Line Options

    There are three Allegro CL specific command-line option:

    swig -allegrocl [ options ] filename
    
       -identifier-converter [name] - Binds the variable swig:*swig-identifier-convert* 
                                      in the generated .cl file to name.
                                      This function is used to generate symbols
                                      for the lisp side of the interface.
    
       -cwrap - [default] Generate a .cxx file containing C wrapper function when
                wrapping C code. The interface generated is similar to what is
                done for C++ code.
       -nocwrap - Explicitly turn off generation of .cxx wrappers for C code. Reasonable
                  for modules with simple interfaces. Can not handle all legal enum
                  and constant constructs, or take advantage of SWIG customization features.
    
       -isolate - With this command-line argument, all lisp helper functions are defined
                  in a unique package named swig.<module-name> rather than
                  swig. This prevents conflicts when the module is
                  intended to be used with other swig generated interfaces that may,
                  for instance, make use of different identifier converters.
    

    See Section 17.5 Identifier converter functions for more details.

    20.1.3 Inserting user code into generated files

    It is often necessary to include user-defined code into the automatically generated interface files. For example, when building a C++ interface, example_wrap.cxx will likely not compile unless you add a #include "header.h" directive. This can be done using the SWIG %insert(section) %{ ...code... %} directive:

    %module example
    
    %{
    #include "header.h"
    %}
    
    %include "header.h"
    
    int fact(int n);
    

    Additional sections have been added for inserting into the generated lisp interface file

    • lisphead - inserts before type declarations
    • lisp - inserts after type declarations according to where it appears in the .i file

    Note that the block %{ ... %} is effectively a shortcut for %insert("header") %{ ... %}.

    20.2 Wrapping Overview

    New users to SWIG are encouraged to read SWIG Basics, and SWIG and C++, for those interested in generating an interface to C++.

    20.2.1 Function Wrapping

    Writing lisp code that directly invokes functions at the foreign function interface level can be cumbersome. Data must often be translated between lisp and foreign types, data extracted from objects, foreign objects allocated and freed upon completion of the foreign call. Dealing with pointers can be unwieldy when it comes to keeping them distinct from other valid integer values.

    We make an attempt to ease some of these burdens by making the interface to foreign code much more lisp-like, rather than C like. How this is done is described in later chapters. The layers themselves, appear as follows:

            ______________
           |              |  (foreign side)
           | Foreign Code |  What we're generating an interface to.
           |______________|
                   |
                   |
            _______v______
           |              |  (foreign side)
           | Wrapper code |  extern "C" wrappers calling C++ 
           |______________|  functions and methods.
                   |
        .  . . - - + - - . .  .
            _______v______
           |              |  (lisp side)
           |  FFI Layer   |  Low level lisp interface. ff:def-foreign-call,
           |______________|  ff:def-foreign-variable
                   |
                   +----------------------------
            _______v______              _______v______
           |              |            |              | (lisp side)    
           |    Defuns    |            |  Defmethods  | wrapper for overloaded
           |______________|            |______________| functions or those with
            (lisp side)                        |        defaulted arguments
            Wrapper for non-overloaded         |
            functions and methods       _______v______
                                       |              | (lisp side)
                                       |    Defuns    | dispatch function
                                       |______________| to overloads based
                                                        on arity
      

    20.2.2 Foreign Wrappers

    These wrappers are as generated by SWIG default. The types of function parameters can be transformed in place using the CTYPE typemap. This is use for converting pass-by-value parameters to pass-by-reference where necessary. All wrapper parameters are then bound to local variables for possible transformation of values (see LIN typemap). Return values can be transformed via the OUT typemap.

    20.2.3 FFI Wrappers

    These are the generated ff:def-foreign-call forms. No typemaps are applicable to this layer, but the %ffargs directive is available for use in .i files, to specify which keyword arguments should be specified for a given function.

    ffargs.i:
    %module ffargs
    
    %ffargs(strings_convert="nil", call_direct="t") foo;
    %ffargs(strings_convert="nil", release_heap=":never", optimize_for_space="t") bar;
    
    int foo(float f1, float f2);
    int foo(float f1, char c2);
    
    void bar(void *lisp_fn);
    
    char *xxx();
      

    Generates:

    ffargs.cl:
    (swig-in-package ())
    
    (swig-defmethod ("foo" "ACL___foo__SWIG_0" :type :function :arity 2)
      ((PARM0_f1 cl:single-float :float )
       (PARM1_f2 cl:single-float :float ))
      (:returning (:int )
       :call-direct t
       :strings-convert nil)
      (let ((SWIG_arg0 PARM0_f1))
      (let ((SWIG_arg1 PARM1_f2))
      (swig-ff-call SWIG_arg0 SWIG_arg1))))
    
    (swig-defmethod ("foo" "ACL___foo__SWIG_1" :type :function :arity 2)
      ((PARM0_f1 cl:single-float :float )
       (PARM1_c2 cl:character :char character))
      (:returning (:int )
       :call-direct t
       :strings-convert nil)
      (let ((SWIG_arg0 PARM0_f1))
      (let ((SWIG_arg1 PARM1_c2))
      (swig-ff-call SWIG_arg0 SWIG_arg1))))
    
    (swig-dispatcher ("foo" :type :function :arities (2)))
    (swig-defun ("bar" "ACL___bar__SWIG_0" :type :function)
      ((PARM0_lisp_fn  (* :void) ))
      (:returning (:void )
       :release-heap :never
       :optimize-for-space t
       :strings-convert nil)
      (let ((SWIG_arg0 PARM0_lisp_fn))
      (swig-ff-call SWIG_arg0)))
    
    
    (swig-defun ("xxx" "ACL___xxx__SWIG_0" :type :function)
      (:void)
      (:returning ((* :char) )
       :strings-convert t)
      (swig-ff-call))
      
    %ffargs(strings_convert="t");

    Is the only default value specified in allegrocl.swg to force the muffling of warnings about automatic string conversion when defining ff:def-foreign-call's.

    20.2.4 Non-overloaded Defuns

    These are simple defuns. There is no typechecking of arguments. Parameters are bound to local variables for possible transformation of values, such as pulling values out of instance slots or allocating temporary stack allocated structures, via the lin typemap. These arguments are then passed to the foreign-call (where typechecking may occur). The return value from this function can be manipulated via the lout typemap.

    20.2.5 Overloaded Defuns

    In the case of overloaded functions, multiple layers are generated. First, all the overloads for a given name are separated out into groups based on arity, and are wrapped in defmethods. Each method calls a distinct wrapper function, but are themselves distinguished by the types of their arguments (see lispclass typemap). These are further wrapped in a dispatching function (defun) which will invoke the appropriate generic-function based on arity. This provides a single functional interface to all overloads. The return value from this function can be manipulated via the lout typemap.

    20.2.6 What about constant and variable access?

    Along with the described functional layering, when creating a .cxx wrapper, this module will generate getter and--if not immutable--setter, functions for variables and constants. If the -nocwrap option is used, defconstant and ff:def-foreign-variable forms will be generated for accessing constants and global variables. These, along with the defuns listed above are the intended API for calling into the foreign module.

    20.2.7 Object Wrapping

    All non-primitive types (Classes, structs, unions, and typedefs involving same) have a corresponding foreign-type defined on the lisp side via ff:def-foreign-type.

    All non-primitive types are further represented by a CLOS class, created via defclass. An attempt is made to create the same class hierarchy, with all classes inheriting directly or indirectly from ff:foreign-pointer. Further, wherever it is apparent, all pointers returned from foreign code are wrapped in a CLOS instance of the appropriate class. For ff:def-foreign-calls that have been defined to expect a :foreign-address type as argument, these CLOS instances can legally be passed and the pointer to the C++ object automatically extracted. This is a natural feature of Allegro's foreign function interface.

    20.3 Wrapping Details

    In this section is described how particular C/C++ constructs are translated into lisp.

    20.3.1 Namespaces

    C++ namespaces are translated into Lisp packages by SWIG. The Global namespace is mapped to a package named by the %module directive or the -module command-line argument. Further namespaces are generated by the swig-defpackage utility function and given names based on Allegro CLs nested namespace convention. For example:

    foo.i:
    %module foo
    
    %{
    #include "foo.h"
    %}
    
    %include "foo.h"
    
    namespace car {
      ...
      namespace tires {
        int do_something(int n);
      }
    }
        

    Generates the following code.

    foo.cl
    (defpackage :foo
      (:use :common-lisp :swig :ff :excl))
    
    ...
    
    (swig-defpackage ("car"))
    (swig-defpackage ("car" "tires"))
    
    ...
    
    (swig-in-package ("car" "tires"))
    (swig-defun ("do_something" "ACL_car_tires__do_something__SWIG_0" :type :function)
      ((PARM0_n  :int ))
      (:returning (:int )
       :strings-convert t)
      (let ((SWIG_arg0 PARM0_n))
      (swig-ff-call SWIG_arg0)))
        

    The above interface file would cause packages foo, foo.car, and foo.car.tires to be created. One would find the function wrapper for do_something defined in the foo.car.tires package(*).

    (*) Except for the package named by the module, all namespace names are passed to the identifier-converter-function as strings with a :type of :namespace. It is the job of this function to generate the desired symbol, accounting for case preferences, additional naming cues, etc.

    Note that packages created by swig-defpackage do not use the COMMON-LISP or EXCL package. This reduces possible conflicts when defining foreign types via the SWIG interface in all but the toplevel modules package. This may lead to confusion if, for example, the current package is foo.car.tires and you attempt to use a common-lisp function such as (car '(1 2 3).

    20.3.2 Constants

    Constants, as declared by the preprocessor #define macro or SWIG %constant directive, are included in SWIG's parse tree when it can be determined that they are, or could be reduced to, a literal value. Such values are translated into defconstant forms in the generated lisp wrapper when the -nocwrap command-line options is used. Else, wrapper functions are generated as in the case of variable access (see section below).

    Here are examples of simple preprocessor constants when using -nocwrap.

    #define A 1                    => (swig-defconstant "A" 1)  
    #define B 'c'                  => (swig-defconstant "B" #\c)
    #define C B                    => (swig-defconstant "C" #\c)
    #define D 1.0e2                => (swig-defconstant "D" 1.0d2)
    #define E 2222                 => (swig-defconstant "E" 2222)
    #define F (unsigned int)2222   => no code generated
    #define G 1.02e2f              => (swig-defconstant "G" 1.02f2)
    #define H foo                  => no code generated
          

    Note that where SWIG is unable to determine if a constant is a literal, no node is added to the SWIG parse tree, and so no values can be generated.

    For preprocessor constants containing expressions which can be reduced to literal values, nodes are created, but with no simplification of the constant value. A very very simple infix to prefix converter has been implemented that tries to do the right thing for simple cases, but does not for more complex expressions. If the literal parser determines that something is wrong, a warning will be generated and the literal expression will be included in the generated code, but commented out.

    #define I A + E                => (swig-defconstant "I" (+ 1 2222))
    #define J 1|2                  => (swig-defconstant "J" (logior 1 2))
    #define Y 1 + 2 * 3 + 4        => (swig-defconstant "Y" (* (+ 1 2) (+ 3 4)))
    #define Y1 (1 + 2) * (3 + 4)   => (swig-defconstant "Y1" (* (+ 1 2) (+ 3 4)))
    #define Y2 1 * 2 + 3 * 4       => (swig-defconstant "Y2" (* 1 (+ 2 3) 4))  ;; WRONG
    #define Y3 (1 * 2) + (3 * 4)   => (swig-defconstant "Y3" (* 1 (+ 2 3) 4))  ;; WRONG
    #define Z 1 + 2 - 3 + 4 * 5    => (swig-defconstant "Z" (* (+ 1 (- 2 3) 4) 5)) ;; WRONG
          

    Users are cautioned to get to know their constants before use, or not use the -nocwrap command-line option.

    20.3.3 Variables

    For C wrapping, a def-foreign-variable call is generated for access to global variables.

    When wrapping C++ code, both global and member variables, getter wrappers are generated for accessing their value, and if not immutable, setter wrappers as well. In the example below, note the lack of a setter wrapper for global_var, defined as const.

    vars.h
    namespace nnn {
      int const global_var = 2;
      float glob_float = 2.0;
    }
        

    Generated code:

    vars.cl
    (swig-in-package ("nnn"))
    (swig-defun ("global_var" "ACL_nnn__global_var_get__SWIG_0" :type :getter)
      (:void)
      (:returning (:int )
       :strings-convert t)
      (swig-ff-call))
    
    
    (swig-defun ("glob_float" "ACL_nnn__glob_float_set__SWIG_0" :type :setter)
      ((PARM0_glob_float  :float ))
      (:returning (:void )
       :strings-convert t)
      (let ((SWIG_arg0 PARM0_glob_float))
      (swig-ff-call SWIG_arg0)))
    
    
    (swig-defun ("glob_float" "ACL_nnn__glob_float_get__SWIG_0" :type :getter)
      (:void)
      (:returning (:float )
       :strings-convert t)
      (swig-ff-call))
        

    Note also, that where applicable, setter wrappers are implemented as setf methods on the getter function, providing a lispy interface to the foreign code.

    user> (load "globalvar.dll")
    ; Foreign loading globalvar.dll.
    t
    user> (load "globalvar.cl")
    ; Loading c:\mikel\src\swig\test\globalvar.cl
    t
    user> 
    globalvar> (globalvar.nnn::global_var)
    2
    globalvar> (globalvar.nnn::glob_float)
    2.0
    globalvar> (setf (globalvar.nnn::glob_float) 3.0)
    3.0
    globalvar> (globalvar.nnn::glob_float)
    3.0
        

    20.3.4 Enumerations

    In C, an enumeration value is an integer value, while in C++ an enumeration value is implicitly convertible to an integer value, but can also be distinguished by its enum type. For each enum declaration a def-foreign-type is generated, assigning the enum a default type of :int. Users may adjust the foreign type of enums via SWIG typemaps.

    Enum values are a bit trickier as they can be initialized using any valid C/C++ expression. In C with the -nocwrap command-line option, we handle the typical cases (simple integer initialization) and generate a defconstant form for each enum value. This has the advantage of it not being necessary to probe into foreign space to retrieve enum values. When generating a .cxx wrapper file, a more general solution is employed. A wrapper variable is created in the module_wrap.cxx file, and a ff:def-foreign-variable call is generated to retrieve its value into lisp.

    For example, the following header file

    enum.h:
    enum COL { RED, GREEN, BLUE };
    enum FOO { FOO1 = 10, FOO2, FOO3 };
          

    In -nocwrap mode, generates

    enum.cl:
    (swig-def-foreign-type "COL" :int)
    (swig-defconstant "RED" 0)
    (swig-defconstant "GREEN" (+ #.(swig-insert-id "RED" () :type :constant) 1))
    (swig-defconstant "BLUE" (+ #.(swig-insert-id "GREEN" () :type :constant) 1))
    
    (swig-def-foreign-type "FOO" :int)
    (swig-defconstant "FOO1" 10)
    (swig-defconstant "FOO2" (+ #.(swig-insert-id "FOO1" () :type :constant) 1))
    (swig-defconstant "FOO3" (+ #.(swig-insert-id "FOO2" () :type :constant) 1))
          

    And when generating a .cxx wrapper

    enum_wrap.cxx:
    EXPORT const int ACL_ENUM___RED__SWIG_0 = RED;
    EXPORT const int ACL_ENUM___GREEN__SWIG_0 = GREEN;
    EXPORT const int ACL_ENUM___BLUE__SWIG_0 = BLUE;
    EXPORT const int ACL_ENUM___FOO1__SWIG_0 = FOO1;
    EXPORT const int ACL_ENUM___FOO2__SWIG_0 = FOO2;
    EXPORT const int ACL_ENUM___FOO3__SWIG_0 = FOO3;
          

    and

    enum.cl:
    (swig-def-foreign-type "COL" :int)
    (swig-defvar "RED" "ACL_ENUM___RED__SWIG_0" :type :constant)
    (swig-defvar "GREEN" "ACL_ENUM___GREEN__SWIG_0" :type :constant)
    (swig-defvar "BLUE" "ACL_ENUM___BLUE__SWIG_0" :type :constant)
    
    (swig-def-foreign-type "FOO" :int)
    (swig-defvar "FOO1" "ACL_ENUM___FOO1__SWIG_0" :type :constant)
    (swig-defvar "FOO2" "ACL_ENUM___FOO2__SWIG_0" :type :constant)
    (swig-defvar "FOO3" "ACL_ENUM___FOO3__SWIG_0" :type :constant)
    
          

    20.3.5 Arrays

    One limitation in the Allegro CL foreign-types module, is that, without macrology, expressions may not be used to specify the dimensions of an array declaration. This is not a horrible drawback unless it is necessary to allocate foreign structures based on the array declaration using ff:allocate-fobject. When it can be determined that an array bound is a valid numeric value, SWIG will include this in the generated array declaration on the lisp side, otherwise the value will be included, but commented out.

    Below is a comprehensive example, showing a number of legal C/C++ array declarations and how they are translated into foreign-type specifications in the generated lisp code.

    array.h
    #define MAX_BUF_SIZE 1024
    
    namespace FOO {
      int global_var1[13];
      float global_var2[MAX_BUF_SIZE];
    
    }
    
    enum COLOR { RED = 10, GREEN = 20, BLUE, PURPLE = 50, CYAN };
    
    namespace BAR {
      char global_var3[MAX_BUF_SIZE + 1];
      float global_var4[MAX_BUF_SIZE][13];
      signed short global_var5[MAX_BUF_SIZE + MAX_BUF_SIZE];
    
      int enum_var5[GREEN];
      int enum_var6[CYAN];
    
      COLOR enum_var7[CYAN][MAX_BUF_SIZE];
    }
        

    Generates:

    array.cl
    (in-package #.*swig-module-name*)
    
    (swig-defpackage ("FOO"))
    (swig-defpackage ("BAR"))
    
    (swig-in-package ())
    (swig-def-foreign-type "COLOR" :int)
    (swig-defvar "RED" "ACL_ENUM___RED__SWIG_0" :type :constant)
    (swig-defvar "GREEN" "ACL_ENUM___GREEN__SWIG_0" :type :constant)
    (swig-defvar "BLUE" "ACL_ENUM___BLUE__SWIG_0" :type :constant)
    (swig-defvar "PURPLE" "ACL_ENUM___PURPLE__SWIG_0" :type :constant)
    (swig-defvar "CYAN" "ACL_ENUM___CYAN__SWIG_0" :type :constant)
    
    (swig-in-package ())
    
    (swig-defconstant "MAX_BUF_SIZE" 1024)
    (swig-in-package ("FOO"))
    
    (swig-defun ("global_var1" "ACL_FOO__global_var1_get__SWIG_0" :type :getter)
      (:void)
      (:returning ((* :int) )
       :strings-convert t)
      (make-instance 'ff:foreign-pointer :foreign-address (swig-ff-call)))
    
    
    (swig-defun ("global_var2" "ACL_FOO__global_var2_set__SWIG_0" :type :setter)
      ((global_var2  (:array :float 1024) ))
      (:returning (:void )
       :strings-convert t)
      (let ((SWIG_arg0 global_var2))
      (swig-ff-call SWIG_arg0)))
    
    
    (swig-in-package ())
    (swig-in-package ("BAR"))
    (swig-defun ("global_var3" "ACL_BAR__global_var3_set__SWIG_0" :type :setter)
      ((global_var3  (:array :char #|1024+1|#) ))
      (:returning (:void )
       :strings-convert t)
      (let ((SWIG_arg0 global_var3))
      (swig-ff-call SWIG_arg0)))
    
    
    (swig-defun ("global_var4" "ACL_BAR__global_var4_set__SWIG_0" :type :setter)
      ((global_var4  (:array (:array :float 13) 1024) ))
      (:returning (:void )
       :strings-convert t)
      (let ((SWIG_arg0 global_var4))
      (swig-ff-call SWIG_arg0)))
    
    
    (swig-defun ("global_var4" "ACL_BAR__global_var4_get__SWIG_0" :type :getter)
      (:void)
      (:returning ((* (:array :float 13)) )
       :strings-convert t)
      (make-instance 'ff:foreign-pointer :foreign-address (swig-ff-call)))
    
    
    (swig-defun ("global_var5" "ACL_BAR__global_var5_set__SWIG_0" :type :setter)
      ((global_var5  (:array :short #|1024+1024|#) ))
      (:returning (:void )
       :strings-convert t)
      (let ((SWIG_arg0 global_var5))
      (swig-ff-call SWIG_arg0)))
    
    
    (swig-defun ("enum_var5" "ACL_BAR__enum_var5_set__SWIG_0" :type :setter)
      ((enum_var5  (:array :int #|GREEN|#) ))
      (:returning (:void )
       :strings-convert t)
      (let ((SWIG_arg0 enum_var5))
      (swig-ff-call SWIG_arg0)))
    
    
    (swig-defun ("enum_var6" "ACL_BAR__enum_var6_set__SWIG_0" :type :setter)
      ((enum_var6  (:array :int #|CYAN|#) ))
      (:returning (:void )
       :strings-convert t)
      (let ((SWIG_arg0 enum_var6))
      (swig-ff-call SWIG_arg0)))
    
    
    (swig-defun ("enum_var7" "ACL_BAR__enum_var7_set__SWIG_0" :type :setter)
      ((enum_var7  (:array (:array #.(swig-insert-id "COLOR" ()) 1024) #|CYAN|#) ))
      (:returning (:void )
       :strings-convert t)
      (let ((SWIG_arg0 enum_var7))
      (swig-ff-call SWIG_arg0)))
    
    
    (swig-defun ("enum_var7" "ACL_BAR__enum_var7_get__SWIG_0" :type :getter)
      (:void)
      (:returning ((* (:array #.(swig-insert-id "COLOR" ()) 1024)) )
       :strings-convert t)
      (make-instance 'ff:foreign-pointer :foreign-address (swig-ff-call)))
        

    20.3.6 Classes and Structs and Unions (oh my!)

    20.3.6.1 CLOS wrapping of

    Classes, unions, and structs are all treated the same way by the interface generator. For any of these objects, a def-foreign-type and a defclass form are generated. For every function that returns an object (or pointer/reference) of C/C++ type X, the wrapping defun (or defmethod) on the Lisp side will automatically wrap the pointer returned in an instance of the appropriate class. This makes it much easier to write and debug code than if pointers were passed around as a jumble of integer values.

    20.3.6.2 CLOS Inheritance

    The CLOS class schema generated by the interface mirrors the inheritance of the classes in foreign code, with the ff:foreign-pointer class at its root. ff:foreign-pointer is a thin wrapper for pointers that is made available by the foreign function interface. Its key benefit is that it may be passed as an argument to any ff:def-foreign-call that is expecting a pointer as the parameter.

    20.3.6.3 Member fields and functions

    All public fields will have accessor getter/setter functions generated for them, as appropriate. All public member functions will have wrapper functions generated.

    We currently ignore anything that isn't public (i.e. private or protected), because the C++ compiler won't allow the wrapper functions to access such fields. Likewise, the interface does nothing for friend directives,

    20.3.6.4 Why not directly access C++ classes using foreign types?

    The def-foreign-type generated by the SWIG interface is currently incomplete. We can reliably generate the object layout of simple structs and unions; they can be allocated via ff:allocate-fobject, and their member variables accessed directly using the various ff:fslot-value-* functions. However, the layout of C++ classes is more complicated. Different compilers adjust class layout based on inheritance patterns, and the presence of virtual member functions. The size of member function pointers vary across compilers as well. As a result, it is recommended that users of any generated interface not attempt to access C++ instances via the foreign type system, but instead use the more robust wrapper functions.

    20.3.7 Templates

    20.3.7.1 Generating wrapper code for templates

    SWIG provides support for dealing with templates, but by default, it will not generate any member variable or function wrappers for templated classes. In order to create these wrappers, you need to explicitly tell SWIG to instantiate them. This is done via the %template directive.

    20.3.7.2 Implicit Template instantiation

    While no wrapper code is generated for accessing member variables, or calling member functions, type code is generated to include these templated classes in the foreign-type and CLOS class schema.

    20.3.8 Typedef, Templates, and Synonym Types

    In C/C++ it is possible, via typedef, to have many names refer to the same type. In general, this is not a problem, though it can lead to confusion. Assume the below C++ header file:

    synonyms.h
    class A { 
      int x;
      int y;
    };
    
    typedef A Foo;
    
    A *xxx(int i);         /* sets A->x = A->y = i */
    Foo *yyy(int i);       /* sets Foo->x = Foo->y = i */
    
    int zzz(A *inst = 0);  /* return inst->x + inst->y */
        

    The function zzz is an overloaded functions; the foreign function call to it will be wrapped in a generic-function whose argument will be checked against a type of A. Assuming a simple implementation, a call to xxx(1) will return a pointer to an A object, which will be wrapped in a CLOS instance of class A, and a call to yyy(1) will result in a CLOS instance of type Foo being returned. Without establishing a clear type relationship between Foo and A, an attempt to call zzz(yyy(1)) will result in an error.

    We resolve this issue, by noting synonym relationships between types while generating the interface. A Primary type is selected (more on this below) from the candidate list of synonyms. For all other synonyms, instead of generating a distinct CLOS class definition, we generate a form that expands to:

    (setf (find-class <synonym>) <primary>)

    The result is that all references to synonym types in foreign code, are wrapped in the same CLOS wrapper, and, in particular, method specialization in wrapping generic functions works as expected.

    Given the above header file, synonym.h, a Lisp session would appear as follows:

    CL-USER> (load "synonym.dll")
    ; Foreign loading synonym.dll.
    t
    CL-USER> (load "synonym.cl")
    ; Loading c:\mikel\src\swig\test\synonym.cl
    t
    CL-USER> 
    synonym> (setf a (xxx 3))
    #<A nil #x3261a0 @ #x207299da>
    synonym> (setf foo (yyy 10))
    #<A nil #x3291d0 @ #x2072e982>
    synonym> (zzz a)
    6
    synonym> (zzz foo)
    20
    synonym> 
        

    20.3.8.1 Choosing a primary type

    The choice of a primary type is selected by the following criteria from a set of synonym types.

    • If a synonym type has a class definition, it is the primary type.
    • If a synonym type is a class template and has been explicitly instantiated via %template, it is the primary type.
    • For all other sets of synonymous types, the synonym which is parsed first becomes the primary type.

    20.3.9 Function overloading/Parameter defaulting

    For each possible argument combination, a distinct wrapper function is created in the .cxx file. On the Lisp side, a generic functions is defined for each possible arity the overloaded/defaulted call may have. Each distinct wrapper is then called from within a defmethod on the appropriate generic function. These are further wrapped inside a dispatch function that checks the number of arguments it is called with and passes them via apply to the appropriate generic-function. This allows for a single entry point to overloaded functions on the lisp side.

    Example:

    overload.h:
    
    class A {
     public:
      int x;
      int y;
    };
    
    float xxx(int i, int x = 0);   /* return i * x */
    float xxx(A *inst, int x);     /* return x + A->x + A->y */
        

    Creates the following three wrappers, for each of the possible argument combinations

    overload_wrap.cxx
    EXPORT void ACL___delete_A__SWIG_0 (A *larg1) {
      A *arg1 = (A *) 0 ;
    
      arg1 = larg1;
      try {
        delete arg1;
    
      } catch (...) {
    
      }
    }
    
    
    EXPORT float ACL___xxx__SWIG_0 (int larg1, int larg2) {
      float lresult = (float)0 ;
      int arg1 ;
      int arg2 ;
      float result;
    
      arg1 = larg1;
      arg2 = larg2;
      try {
        result = (float)xxx(arg1, arg2);
    
        lresult = result;
        return lresult;
      } catch (...) {
        return (float)0;
      }
    }
    
    
    EXPORT float ACL___xxx__SWIG_1 (int larg1) {
      float lresult = (float)0 ;
      int arg1 ;
      float result;
    
      arg1 = larg1;
      try {
        result = (float)xxx(arg1);
    
        lresult = result;
        return lresult;
      } catch (...) {
        return (float)0;
      }
    }
    
    
    EXPORT float ACL___xxx__SWIG_2 (A *larg1, int larg2) {
      float lresult = (float)0 ;
      A *arg1 = (A *) 0 ;
      int arg2 ;
      float result;
    
      arg1 = larg1;
      arg2 = larg2;
      try {
        result = (float)xxx(arg1, arg2);
    
        lresult = result;
        return lresult;
      } catch (...) {
        return (float)0;
      }
    }
        

    And the following foreign-function-call and method definitions on the lisp side:

    overload.cl
    (swig-defmethod ("xxx" "ACL___xxx__SWIG_0" :type :function :arity 2)
      ((PARM0_i cl:integer :int )
       (PARM1_x cl:integer :int ))
      (:returning (:float )
       :strings-convert t)
      (let ((SWIG_arg0 PARM0_i))
      (let ((SWIG_arg1 PARM1_x))
      (swig-ff-call SWIG_arg0 SWIG_arg1))))
    
    (swig-defmethod ("xxx" "ACL___xxx__SWIG_1" :type :function :arity 1)
      ((PARM0_i cl:integer :int ))
      (:returning (:float )
       :strings-convert t)
      (let ((SWIG_arg0 PARM0_i))
      (swig-ff-call SWIG_arg0)))
    
    (swig-defmethod ("xxx" "ACL___xxx__SWIG_2" :type :function :arity 2)
      ((PARM0_inst #.(swig-insert-id "A" () :type :class) (* #.(swig-insert-id "A" ())) )
       (PARM1_x cl:integer :int ))
      (:returning (:float )
       :strings-convert t)
      (let ((SWIG_arg0 PARM0_inst))
      (let ((SWIG_arg1 PARM1_x))
      (swig-ff-call SWIG_arg0 SWIG_arg1))))
    
    (swig-dispatcher ("xxx" :type :function :arities (1 2)))
        

    And their usage in a sample lisp session:

    overload> (setf a (new_A))
    #<A nil #x329268 @ #x206cf612>
    overload> (setf (A_x a) 10)
    10
    overload> (setf (A_y a) 20)
    20
    overload> (xxx 1)
    0.0
    overload> (xxx 3 10)
    30.0
    overload> (xxx a 1)
    31.0
    overload> (xxx a 2)
    32.0
    overload> 
        

    20.3.10 Operator wrapping and Operator overloading

    Wrappers to defined C++ Operators are automatically renamed, using %rename, to the following defaults:

    /* name conversion for overloaded operators. */
    #ifdef __cplusplus
    %rename(__add__)             *::operator+;
    %rename(__pos__)             *::operator+();
    %rename(__pos__)             *::operator+() const;
    
    %rename(__sub__)             *::operator-;
    %rename(__neg__)             *::operator-() const;
    %rename(__neg__)             *::operator-();
    
    %rename(__mul__)             *::operator*;
    %rename(__deref__)           *::operator*();
    %rename(__deref__)           *::operator*() const;
    
    %rename(__div__)             *::operator/;
    %rename(__mod__)             *::operator%;
    %rename(__logxor__)          *::operator^;
    %rename(__logand__)          *::operator&;
    %rename(__logior__)          *::operator|;
    %rename(__lognot__)          *::operator~();
    %rename(__lognot__)          *::operator~() const;
    
    %rename(__not__)             *::operator!();
    %rename(__not__)             *::operator!() const;
    
    %rename(__assign__)          *::operator=;
    
    %rename(__add_assign__)      *::operator+=;
    %rename(__sub_assign__)      *::operator-=;
    %rename(__mul_assign__)      *::operator*=;
    %rename(__div_assign__)      *::operator/=;
    %rename(__mod_assign__)      *::operator%=;
    %rename(__logxor_assign__)   *::operator^=;
    %rename(__logand_assign__)   *::operator&=;
    %rename(__logior_assign__)   *::operator|=;
    
    %rename(__lshift__)          *::operator<<;
    %rename(__lshift_assign__)   *::operator<<=;
    %rename(__rshift__)          *::operator>>;
    %rename(__rshift_assign__)   *::operator>>=;
    
    %rename(__eq__)              *::operator==;
    %rename(__ne__)              *::operator!=;
    %rename(__lt__)              *::operator<;
    %rename(__gt__)              *::operator>;
    %rename(__lte__)             *::operator<=;
    %rename(__gte__)             *::operator>=;
    
    %rename(__and__)             *::operator&&;
    %rename(__or__)              *::operator||;
    
    %rename(__preincr__)         *::operator++();
    %rename(__postincr__)        *::operator++(int);
    %rename(__predecr__)         *::operator--();
    %rename(__postdecr__)        *::operator--(int);
    
    %rename(__comma__)           *::operator,();
    %rename(__comma__)           *::operator,() const;
    
    %rename(__member_ref__)      *::operator->;
    %rename(__member_func_ref__) *::operator->*;
    
    %rename(__funcall__)         *::operator();
    %rename(__aref__)            *::operator[];
        

    Name mangling occurs on all such renamed identifiers, so that wrapper name generated by B::operator= will be B___eq__, i.e. <class-or-namespace>_ has been added. Users may modify these default names by adding %rename directives in their own .i files.

    Operator overloading can be achieved by adding functions based on the mangled names of the function. In the following example, a class B is defined with a Operator== method defined. The swig %extend directive is used to add an overload method on Operator==.

    opoverload.h
    class B {
     public:
      int x;
      int y;
      bool operator==(B const& other) const;
    };
        

    and

    opoverload.i
    %module opoverload
    
    %{
    #include <fstream>
    #include "opoverload.h"
    %}
    
    %{
    bool B___eq__(B const *inst, int const x)
    {
      // insert the function definition into the wrapper code before
      // the wrapper for it.
      // ... do stuff ...
    }
    %}
    
    %include "opoverload.h"
    
    %extend B {
     public:
      bool __eq__(int const x) const;
    };
        

    Either operator can be called via a single call to the dispatch function:

    opoverload> (B___eq__ x1 x2)
    nil
    opoverload> (B___eq__ x1 3)
    nil
    opoverload> 
        

    20.3.11 Varargs

    Variable length argument lists are not supported, by default. If such a function is encountered, a warning will generated to stderr. Varargs are supported via the SWIG %varargs directive. This directive allows you to specify a (finite) argument list which will be inserted into the wrapper in place of the variable length argument indicator. As an example, consider the function printf(). Its declaration would appear as follows:

    See the following section on Variable Length arguments provides examples on how %varargs can be used, along with other ways such functions can be wrapped.

    20.3.12 C++ Exceptions

    Each C++ wrapper includes a handler to catch any exceptions that may be thrown while in foreign code. This helps prevent simple C++ errors from killing the entire lisp process. There is currently no mechanism to have these exceptions forwarded to the lisp condition system, nor has any explicit support of the exception related SWIG typemaps been implemented.

    20.3.13 Pass by value, pass by reference

    Allegro CL does not support the passing of non-primitive foreign structures by value. As a result, SWIG must automatically detect and convert function parameters and return values to pointers whenever necessary. This is done via the use of typemaps, and should not require any fine tuning by the user, even for newly defined types.

    20.4 Typemaps

    SWIG Typemaps provide a powerful tool for automatically generating code to handle various menial tasks required of writing an interface to foreign code. The purpose of this section is to describe each of the typemaps used by the Allegro CL module. Please read the chapter on Typemaps for more information.

    20.4.1 Code Generation in the C++ Wrapper

    Every C++ wrapper generated by SWIG takes the following form:

    return-val wrapper-name(parm0, parm1, ..., parmN)
    {
      return-val lresult;   /* return value from wrapper */
      <local-declaration>
      ... results;          /* return value from function call */
    
      <binding locals to parameters>
    
      try {
        result = function-name(local0, local1, ..., localN);
    
        <convert and bind result to lresult>
    
        return lresult;
      catch (...) {
        return (int)0;
      }
        

    20.4.1.1 IN Typemap

    the in typemap is used to generate code to convert parameters passed to C++ wrapper functions into the arguments desired for the call being wrapped. That is, it fills in the code for the <binding locals to parameters> section above. We use this map to automatically convert parameters passed by reference to the wrapper function into by-value arguments for the wrapped call, and also to convert boolean values, which are passed as integers from lisp (by default), into the appropriate type for the language of code being wrapped.

    These are the default specifications for the IN typemap. Here, $input refers to the parameter code is being generated for, and $1 is the local variable to which it is being assigned. The default settings of this typemap are as follows:

    %typemap(in) bool                          "$1 = (bool)$input;";
    %typemap(in) char, unsigned char, signed char,
                 short, signed short, unsigned short,
                 int, signed int, unsigned int,
                 long, signed long, unsigned long,
                 float, double, long double, char *, void *, void,
                 enum SWIGTYPE, SWIGTYPE *,
                 SWIGTYPE[ANY], SWIGTYPE &     "$1 = $input;";
    %typemap(in) SWIGTYPE                      "$1 = *$input;";
        

    20.4.1.2 OUT Typemap

    The out typemap is used to generate code to form the return value of the wrapper from the return value of the wrapped function. This code is placed in the <convert and bind result to lresult> section of the above code diagram. Its default mapping is as follows:

    %typemap(out) bool                          "$result = (int)$1;";
    %typemap(out) char, unsigned char, signed char,
                  short, signed short, unsigned short,
                  int, signed int, unsigned int,
                  long, signed long, unsigned long,
                  float, double, long double, char *, void *, void,
                  enum SWIGTYPE, SWIGTYPE *,
                  SWIGTYPE[ANY], SWIGTYPE &    "$result = $1;";
    %typemap(out) SWIGTYPE                     "$result = new $1_type($1);";
        

    20.4.1.3 CTYPE Typemap

    This typemap is not used for code generation, but purely for the transformation of types in the parameter list of the wrapper function. Its primary use is to handle by-value to by-reference conversion in the wrappers parameter list. Its default settings are:

    %typemap(ctype) bool                       "int";
    %typemap(ctype) char, unsigned char, signed char,
                    short, signed short, unsigned short,
                    int, signed int, unsigned int,
                    long, signed long, unsigned long,
                    float, double, long double, char *, void *, void,
                    enum SWIGTYPE, SWIGTYPE *,
                    SWIGTYPE[ANY], SWIGTYPE &  "$1_ltype";
    %typemap(ctype) SWIGTYPE                   "$&1_type";
        

    These three typemaps are specifically employed by the Allegro CL interface generator. SWIG also implements a number of other typemaps that can be used for generating code in the C/C++ wrappers. You can read about these common typemaps here.

    20.4.2 Code generation in Lisp wrappers

    A number of custom typemaps have also been added to facilitate the generation of code in the lisp side of the interface. These are described below. The basic code generation structure is applied as a series of nested expressions, one for each parameter, then one for manipulating the return value, and last, the foreign function call itself.

    Note that the typemaps below use fully qualified symbols where necessary. Users writing their own typemaps should do likewise. See the explanation in the last paragraph of 16.3.1 Namespaces for details.

    20.4.2.1 LIN Typemap

    The LIN typemap allows for the manipulating the lisp objects passed as arguments to the wrapping defun before passing them to the foreign function call. For example, when passing lisp strings to foreign code, it is often necessary to copy the string into a foreign structure of type (:char *) of appropriate size, and pass this copy to the foreign call. Using the LIN typemap, one could arrange for the stack-allocation of a foreign char array, copy your string into it, and not have to worry about freeing the copy after the function returns.

    The LIN typemap accepts the following $variable references.

    • $in - expands to the name of the parameter being applied to this typemap
    • $out - expands to the name of the local variable assigned to this typemap
    • $in_fftype - the foreign function type of the C type.
    • $*in_fftype - the foreign function type of the C type with one pointer removed. If there is no pointer, then $*in_fftype is the same as $in_fftype.
    • $body - very important. Instructs SWIG where subsequent code generation steps should be inserted into the current typemap. Leaving out a $body reference will result in lisp wrappers that do very little by way of calling into foreign code. Not recommended.
    %typemap(lin) SWIGTYPE "(cl:let (($out $in))\n  $body)";
        

    20.4.2.2 LOUT Typemap

    The LOUT typemap is the means by which we effect the wrapping of foreign pointers in CLOS instances. It is applied after all LIN typemaps, and immediately before the actual foreign-call.

    The LOUT typemap uses the following $variable

    • $lclass - Expands to the CLOS class that represents foreign-objects of the return type matching this typemap.
    • $body - Same as for the LIN map. Place this variable where you want the foreign-function call to occur.
    • $ldestructor - Expands to the symbol naming the destructor for this class ($lclass) of object. Allows you to insert finalization or automatic garbage collection into the wrapper code (see default mappings below).
    %typemap(lout) bool, char, unsigned char, signed char,
                   short, signed short, unsigned short,
                   int, signed int, unsigned int,
                   long, signed long, unsigned long,
                   float, double, long double, char *, void *, void,
                   enum SWIGTYPE    "$body";
    %typemap(lout) SWIGTYPE[ANY], SWIGTYPE *,
                   SWIGTYPE &       "(cl:make-instance '$lclass :foreign-address $body)";
    %typemap(lout) SWIGTYPE    "(cl:let* ((address $body)\n
                                (ACL_result (cl:make-instance '$lclass :foreign-address address)))\n
                                (cl:unless (cl::zerop address)\n
                                (excl:schedule-finalization ACL_result #'$ldestructor))\n
                                 ACL_result)";
        

    20.4.2.3 FFITYPE Typemap

    The FFITYPE typemap works as a helper for a body of code that converts C/C++ type specifications into Allegro CL foreign-type specifications. These foreign-type specifications appear in ff:def-foreing-type declarations, and in the argument list and return values of ff:def-foreign-calls. You would modify this typemap if you want to change how the FFI passes through arguments of a given type. For example, if you know that a particular compiler represents booleans as a single byte, you might add an entry for:

    %typemap(ffitype) bool ":unsigned-char";
        

    Note that this typemap is pure type transformation, and is not used in any code generations step the way the LIN and LOUT typemaps are. The default mappings for this typemap are:

    %typemap(ffitype) bool ":int";
    %typemap(ffitype) char ":char";
    %typemap(ffitype) unsigned char ":unsigned-char";
    %typemap(ffitype) signed char ":char";
    %typemap(ffitype) short, signed short ":short";
    %typemap(ffitype) unsigned short ":unsigned-short";
    %typemap(ffitype) int, signed int ":int";
    %typemap(ffitype) unsigned int ":unsigned-int";
    %typemap(ffitype) long, signed long ":long";
    %typemap(ffitype) unsigned long ":unsigned-long";
    %typemap(ffitype) float ":float";
    %typemap(ffitype) double ":double";
    %typemap(ffitype) char * "(* :char)";
    %typemap(ffitype) void * "(* :void)";
    %typemap(ffitype) void ":void";
    %typemap(ffitype) enum SWIGTYPE ":int";
    %typemap(ffitype) SWIGTYPE & "(* :void)";
        

    20.4.2.4 LISPTYPE Typemap

    This is another type only transformation map, and is used to provide the lisp-type, which is the optional third argument in argument specifier in a ff:def-foreign-call form. Specifying a lisp-type allows the foreign call to perform type checking on the arguments passed in. The default entries in this typemap are:

    %typemap(lisptype) bool "cl:boolean";
    %typemap(lisptype) char "cl:character";
    %typemap(lisptype) unsigned char "cl:integer";
    %typemap(lisptype) signed char "cl:integer";
        

    20.4.2.5 LISPCLASS Typemap

    The LISPCLASS typemap is used to generate the method signatures for the generic-functions which wrap overloaded functions and functions with defaulted arguments. The default entries are:

    %typemap(lispclass) bool "t";
    %typemap(lispclass) char "cl:character";
    %typemap(lispclass) unsigned char, signed char,
                        short, signed short, unsigned short,
                        int, signed int, unsigned int,
                        long, signed long, unsigned long,
                        enum SWIGTYPE       "cl:integer";
    %typemap(lispclass) float "cl:single-float";
    %typemap(lispclass) double "cl:double-float";
    %typemap(lispclass) char * "cl:string";
        

    20.4.3 Modifying SWIG behavior using typemaps

    The following example shows how we made use of the above typemaps to add support for the wchar_t type.

    %typecheck(SWIG_TYPECHECK_UNICHAR) wchar_t { $1 = 1; };
    
    %typemap(in)        wchar_t "$1 = $input;";
    %typemap(lin)       wchar_t "(cl:let (($out (cl:char-code $in)))\n  $body)";
    %typemap(lin)       wchar_t* "(excl:with-native-string
                                             ($out $in
                                              :external-format #+little-endian :fat-le 
                                                               #-little-endian :fat)\n
                                     $body)"
    
    %typemap(out)       wchar_t "$result = $1;";
    %typemap(lout)      wchar_t "(cl:code-char $body)";
    %typemap(lout)      wchar_t* "(excl:native-to-string $body
                                              :external-format #+little-endian :fat-le
                                                               #-little-endian :fat)";
    
    %typemap(ffitype)   wchar_t ":unsigned-short";
    %typemap(lisptype)  wchar_t "";
    %typemap(ctype)     wchar_t "wchar_t";
    %typemap(lispclass) wchar_t "cl:character";
    %typemap(lispclass) wchar_t* "cl:string";
        

    20.5 Identifier Converter functions

    20.5.1 Creating symbols in the lisp environment

    Various symbols must be generated in the lisp environment to which class definitions, functions, constants, variables, etc. must be bound. Rather than force a particular convention for naming these symbols, an identifier (to symbol) conversion function is used. A user-defined identifier-converter can then implement any symbol naming, case-modifying, scheme desired.

    In generated SWIG code, whenever some interface object must be referenced by its lisp symbol, a macro is inserted that calls the identifier-converter function to generate the appropriate symbol reference. It is therefore expected that the identifier-converter function reliably return the same (eq) symbol given the same set of arguments.

    20.5.2 Existing identifier-converter functions

    Two basic identifier routines have been defined.

    20.5.2.1 identifier-convert-null

    No modification of the identifier string is performed. Based on other arguments, the identifier may be concatenated with other strings, from which a symbol will be created.

    20.5.2.2 identifier-convert-lispify

    All underscores in the identifier string are converted to hyphens. Otherwise, identifier-convert-lispify performs the same symbol transformations.

    20.5.2.3 Default identifier to symbol conversions

    Check the definitions of the above two default identifier-converters in Lib/allegrocl/allegrocl.swg for default naming conventions.

    20.5.3 Defining your own identifier-converter

    A user-defined identifier-converter function should conform to the following specification:

    (defun identifier-convert-fn (id &key type class arity) ...body...)
    result ==> symbol or (setf symbol)
    

    The ID argument is a string representing an identifier in the foreign environment.

    The :type keyword argument provides more information on the type of identifier. Its value is a symbol. This allows the identifier-converter to apply different heuristics when mapping different types of identifiers to symbols. SWIG will generate calls to your identifier-converter using the following types.

    • :class - names a CLOS class.
    • :constant - names a defconstant
    • :constructor - names a function for creating a foreign object
    • :destructor - names a function for freeing a foreign object
    • :function - names a CLOS wrapping defmethod or defun.
    • :ff-operator - names a foreign call defined via ff:def-foreign-call
    • :getter - getter function
    • :namespace - names a C++ namespace
    • :setter - names a setter function. May return a (setf symbol) reference
    • :operator - names a C++ operator, such as Operator=, Operator*.
    • :slot - names a slot in a struct/class/union declaration.
    • :type - names a foreign-type defined via ff:def-foreign-type.
    • :variable - names a variable defined via ff:def-foreign-variable.

    The :class keyword argument is a string naming a foreign class. When non-nil, it indicates that the current identifier has scope in the specified class.

    The :arity keyword argument only appears in swig:swig-defmethod forms generated for overloaded functions. Its value is an integer indicating the number of arguments passed to the routine indicated by this identifier.

    20.5.4 Instructing SWIG to use a particular identifier-converter

    By default, SWIG will use identifier-converter-null. To specify another convert function, use the -identifier-converter command-line argument. The value should be a string naming the function you wish the interface to use instead, when generating symbols. ex:

    % swig -allegrocl -c++ -module mymodule -identifier-converter my-identifier-converter
    
    swig-4.0.1/Doc/Manual/Mzscheme.html0000644000175000017500000001204313527234053016732 0ustar williamwilliam SWIG and MzScheme/Racket

    37 SWIG and MzScheme/Racket

    This section contains information on SWIG's support of Racket, formally known as MzScheme.

    37.1 Creating native structures

    Example interface file:

    /* define a macro for the struct creation */
    %define handle_ptr(TYPE, NAME)
    %typemap(argout) TYPE *NAME{
      Scheme_Object *o = SWIG_NewStructFromPtr($1, $*1_mangle);
      SWIG_APPEND_VALUE(o);
    }
    
    %typemap(in, numinputs=0) TYPE *NAME (TYPE temp) {
      $1 = &temp;
    }
    %enddef
    
    /* setup the typemaps for the pointer to an output parameter cntrs */
    handle_ptr(struct diag_cntrs, cntrs);
    

    Then in scheme, you can use regular struct access procedures like

            ; suppose a function created a struct foo as
            ; (define foo (make-diag-cntrs (#x1 #x2 #x3) (make-inspector))
            ; Then you can do
            (format "0x~x" (diag-cntrs-field1 foo))
            (format "0x~x" (diag-cntrs-field2 foo))
            ;etc...
    

    37.2 Simple example

    A few examples are available in the Examples/mzscheme directory. The code and log of a session using SWIG below should help getting started.

    C header file:

    // example.h
    int fact(int n);
    

    C source code:

    // File: example.c
    #include "example.h"
    
    int fact(int n) {
      if (n < 0) { /* This should probably return an error, but this is simpler */
        return 0;
      }
      if (n == 0) {
        return 1;
      }
      else {
        /* testing for overflow would be a good idea here */
        return n * fact(n-1);
      }
    }
    

    SWIG interface file:

    /* File: example.i */
    %module example
    
    %{
    #include "example.h"
    %}
    
    int fact(int n);
    

    The session below using the above files is on an OS X machine, but the points to be made are more general. On OS X, libtool is the tool which creates libraries, which are named .dylib, rather than .so on other unixes, or .dll on Windows.

    % swig -mzscheme -declaremodule example.i
    % gcc -c -m32 -o example.o example.c # force 32-bit object file (mzscheme is 32-bit only)
    % libtool -dynamic -o libexample.dylib example.o # make it into a library
    % ls # what've we got so far?
    example.c example.o
    example.h example_wrap.c
    example.i libexample.dylib*
    % mzc --cgc --cc example_wrap.c # compile the wrapping code
    % LDFLAGS="-L. -lexample" mzc --ld example_wrap.dylib example_wrap.o # ...and link it
    % mzscheme -e '(path->string (build-path "compiled" "native" (system-library-subpath)))'
    "compiled/native/i386-macosx/3m"
    % mkdir -p compiled/native/i386-macosx/3m # move the extension library to a magic place
    % mv example_wrap.dylib compiled/native/i386-macosx/3m/example_ss.dylib
    % mzscheme
    Welcome to MzScheme v4.2.4 [3m], Copyright (c) 2004-2010 PLT Scheme Inc.
    > (require "example.ss")
    > (fact 5)
    120
    > ^D
    % echo 'It works!'
    

    Some points of interest:

    • This is on a 64-bit machine, so we have to include the -m32 option when building the object file
    • If you want to declare a scheme module (and you probably do), it's important that you include the -declaremodule option to swig (if you miss this out, it'll appear to work, but fail later).
    • Use mzc to compile and then link the wrapped code. You'll probably need to adjust the link flags to refer to the library you're wrapping (you can either do this with an LDFLAGS declaration, as here, or with multiple ++ldf options to mzc).
    • Create the directory with path (build-path "compiled" "native" (system-library-subpath)) and move the freshly-generated .dylib to there, changing its name to module-name_ss.dylib. After that, you can REQUIRE the new module with (require "module-name.ss").
    • The above requests mzc to create an extension using the CGC garbage-collector. The alternative -- the 3m collector -- has generally better performance, but work is still required for SWIG to emit code which is compatible with it.

    37.3 External documentation

    See the C API for more description of using the mechanism for adding extensions. The main documentation is here.

    Tip: mzc's --vv option is very useful for debugging the inevitable library problems you'll encounter.

    swig-4.0.1/Doc/Manual/Chicken.html0000644000175000017500000006002313527063513016525 0ustar williamwilliam SWIG and Chicken

    23 SWIG and Chicken

    This chapter describes SWIG's support of CHICKEN. CHICKEN is a Scheme-to-C compiler supporting most of the language features as defined in the Revised^5 Report on Scheme. Its main attributes are that it

    1. generates portable C code
    2. includes a customizable interpreter
    3. links to C libraries with a simple Foreign Function Interface
    4. supports full tail-recursion and first-class continuations

    When confronted with a large C library, CHICKEN users can use SWIG to generate CHICKEN wrappers for the C library. However, the real advantages of using SWIG with CHICKEN are its support for C++ -- object-oriented code is difficult to wrap by hand in CHICKEN -- and its typed pointer representation, essential for C and C++ libraries involving structures or classes.

    23.1 Preliminaries

    CHICKEN support was introduced to SWIG in version 1.3.18. SWIG relies on some recent additions to CHICKEN, which are only present in releases of CHICKEN with version number greater than or equal to 1.89. To use a chicken version between 1.40 and 1.89, see the Garbage collection section below.

    You may want to look at any of the examples in Examples/chicken/ directory for the basic steps to run SWIG CHICKEN.

    23.1.1 Running SWIG in C mode

    To run SWIG CHICKEN in C mode, use the -chicken option.

    % swig -chicken example.i

    To allow the wrapper to take advantage of future CHICKEN code generation improvements, part of the wrapper is direct CHICKEN function calls (example_wrap.c) and part is CHICKEN Scheme (example.scm). The basic Scheme code must be compiled to C using your system's CHICKEN compiler or both files can be compiled directly using the much simpler csc.

    % chicken example.scm -output-file oexample.c
    

    So for the C mode of SWIG CHICKEN, example_wrap.c and oexample.c are the files that must be compiled to object files and linked into your project.

    23.1.2 Running SWIG in C++ mode

    To run SWIG CHICKEN in C++ mode, use the -chicken -c++ option.

    % swig -chicken -c++ example.i

    This will generate example_wrap.cxx and example.scm. The basic Scheme code must be compiled to C using your system's CHICKEN compiler or both files can be compiled directly using the much simpler csc.

    % chicken example.scm -output-file oexample.c

    So for the C++ mode of SWIG CHICKEN, example_wrap.cxx and oexample.c are the files that must be compiled to object files and linked into your project.

    23.2 Code Generation

    23.2.1 Naming Conventions

    Given a C variable, function or constant declaration named Foo_Bar, the declaration will be available in CHICKEN as an identifier ending with Foo-Bar. That is, an underscore is converted to a dash.

    You may control what the CHICKEN identifier will be by using the %rename SWIG directive in the SWIG interface file.

    23.2.2 Modules

    The name of the module must be declared one of two ways:

    • Placing %module example in the SWIG interface file.
    • Using -module example on the SWIG command line.

    The generated example.scm file then exports (declare (unit modulename)). If you do not want SWIG to export the (declare (unit modulename)), pass the -nounit option to SWIG.

    CHICKEN will be able to access the module using the (declare (uses modulename)) CHICKEN Scheme form.

    23.2.3 Constants and Variables

    Constants may be created using any of the four constructs in the interface file:

    1. #define MYCONSTANT1 ...
    2. %constant int MYCONSTANT2 = ...
    3. const int MYCONSTANT3 = ...
    4. enum { MYCONSTANT4 = ... };

    In all cases, the constants may be accessed from within CHICKEN using the form (MYCONSTANT1); that is, the constants may be accessed using the read-only parameter form.

    Variables are accessed using the full parameter form. For example, to set the C variable "int my_variable;", use the Scheme form (my-variable 2345). To get the C variable, use (my-variable).

    The %feature("constasvar") can be applied to any constant or immutable variable. Instead of exporting the constant as a function that must be called, the constant will appear as a scheme variable. This causes the generated .scm file to just contain the code (set! MYCONSTANT1 (MYCONSTANT1)). See Features and the %feature directive for info on how to apply the %feature.

    23.2.4 Functions

    C functions declared in the SWIG interface file will have corresponding CHICKEN Scheme procedures. For example, the C function "int sqrt(double x);" will be available using the Scheme form (sqrt 2345.0). A void return value will give C_SCHEME_UNDEFINED as a result.

    A function may return more than one value by using the OUTPUT specifier (see Lib/chicken/typemaps.i). They will be returned as multiple values using (values) if there is more than one result (that is, a non-void return value and at least one argout parameter, or a void return value and at least two argout parameters). The return values can then be accessed with (call-with-values).

    23.2.5 Exceptions

    The SWIG chicken module has support for exceptions thrown from C or C++ code to be caught in scheme. See Exception handling with %exception for more information about declaring exceptions in the interface file.

    Chicken supports both the SWIG_exception(int code, const char *msg) interface as well as a SWIG_ThrowException(C_word val) function for throwing exceptions from inside the %exception blocks. SWIG_exception will throw a list consisting of the code (as an integer) and the message. Both of these will throw an exception using (abort), which can be handled by (handle-exceptions). See the Chicken manual on Exceptions and SFRI-12. Since the exception values are thrown directly, if (condition-case) is used to catch an exception the exception will come through in the val () case.

    The following simple module

    %module exception_test
    
    %inline %{
      void test_throw(int i) throws (int) { 
        if (i == 1) throw 15; 
      }
    %}
    

    could be run with

    (handle-exceptions exvar 
      (if (= exvar 15)
        (print "Correct!") 
        (print "Threw something else " exvar))
      (test-throw 1))
    

    23.3 TinyCLOS

    The author of TinyCLOS, Gregor Kiczales, describes TinyCLOS as: "Tiny CLOS is a Scheme implementation of a 'kernelized' CLOS, with a metaobject protocol. The implementation is even simpler than the simple CLOS found in 'The Art of the Metaobject Protocol', weighing in at around 850 lines of code, including (some) comments and documentation."

    Almost all good Scheme books describe how to use metaobjects and generic procedures to implement an object-oriented Scheme system. Please consult a Scheme book if you are unfamiliar with the concept.

    CHICKEN has a modified version of TinyCLOS, which SWIG CHICKEN uses if the -proxy argument is given. If -proxy is passed, then the generated example.scm file will contain TinyCLOS class definitions. A class named Foo is declared as <Foo>, and each member variable is allocated a slot. Member functions are exported as generic functions.

    Primitive symbols and functions (the interface that would be presented if -proxy was not passed) are hidden and no longer accessible. If the -unhideprimitive command line argument is passed to SWIG, then the primitive symbols will be available, but each will be prefixed by the string "primitive:"

    The exported symbol names can be controlled with the -closprefix and -useclassprefix arguments. If -useclassprefix is passed to SWIG, every member function will be generated with the class name as a prefix. If the -closprefix mymod: argument is passed to SWIG, then the exported functions will be prefixed by the string "mymod:". If -useclassprefix is passed, -closprefix is ignored.

    23.4 Linkage

    Please refer to CHICKEN - A practical and portable Scheme system - User's manual for detailed help on how to link object files to create a CHICKEN Scheme program. Briefly, to link object files, be sure to add `chicken-config -extra-libs -libs` or `chicken-config -shared -extra-libs -libs`to your linker options. Use the -shared option if you want to create a dynamically loadable module. You might also want to use the much simpler csc or csc.bat.

    Each scheme file that is generated by SWIG contains (declare (uses modname)). This means that to load the module from scheme code, the code must include (declare (uses modname)).

    23.4.1 Static binary or shared library linked at compile time

    We can easily use csc to build a static binary.

    $ swig -chicken example.i
    $ csc -v example.scm example_impl.c example_wrap.c test_script.scm -o example
    $ ./example
    

    Similar to the above, any number of module.scm files could be compiled into a shared library, and then that shared library linked when compiling the main application.

    $ swig -chicken example.i
    $ csc -sv example.scm example_wrap.c example_impl.c -o example.so
    

    The example.so file can then linked with test_script.scm when it is compiled, in which case test_script.scm must have (declare (uses example)). Multiple SWIG modules could have been linked into example.so and each one accessed with a (declare (uses ... )).

    $ csc -v test_script.scm -lexample
    

    An alternative is that the test_script.scm can have the code (load-library 'example "example.so"), in which case the test script does not need to be linked with example.so. The test_script.scm file can then be run with csi.

    23.4.2 Building chicken extension libraries

    Building a shared library like in the above section only works if the library is linked at compile time with a script containing (declare (uses ...)) or is loaded explicitly with (load-library 'example "example.so"). It is not the format that CHICKEN expects for extension libraries and eggs. The problem is the (declare (unit modname)) inside the modname.scm file. There are two possible solutions to this.

    First, SWIG accepts a -nounit argument, in which case the (declare (unit modname)) is not generated. Then, the modname.scm and modname_wrap.c files must be compiled into their own shared library.

    $ csc -sv modname.scm modname_wrap.c modname_impl.c -o modname.so
    

    This library can then be loaded by scheme code with the (require 'modname) function. See the Loading-extension-libraries in the eval unit inside the CHICKEN manual for more information.

    Another alternative is to run SWIG normally and create a scheme file that contains (declare (uses modname)) and then compile that file into the shared library as well. For example, inside the mod_load.scm file,

    (declare (uses mod1))
    (declare (uses mod2))
    

    Which would then be compiled with

    $ swig -chicken mod1.i
    $ swig -chicken mod2.i
    $ csc -sv mod_load.scm mod1.scm mod2.scm mod1_wrap.c mod2_wrap.c mod1_impl.c mod2_impl.c -o mod.so
    

    Then the extension library can be loaded with (require 'mod). As we can see here, mod_load.scm contains the code that gets executed when the module is loaded. All this code does is load both mod1 and mod2. As we can see, this technique is more useful when you want to combine a few SWIG modules into one chicken extension library, especially if modules are related by %import

    In either method, the files that are compiled into the shared library could also be packaged into an egg. The mod1_wrap.c and mod2_wrap.c files that are created by SWIG are stand alone and do not need SWIG to be installed to be compiled. Thus the egg could be distributed and used by anyone, even if SWIG is not installed.

    See the Examples/chicken/egg directory in the SWIG source for an example that builds two eggs, one using the first method and one using the second method.

    23.4.3 Linking multiple SWIG modules with TinyCLOS

    Linking together multiple modules that share type information using the %import directive while also using -proxy is more complicated. For example, if mod2.i imports mod1.i, then the mod2.scm file contains references to symbols declared in mod1.scm, and thus a (declare (uses mod1)) or (require 'mod1) must be exported to the top of mod2.scm. By default, when SWIG encounters an %import "modname.i" directive, it exports (declare (uses modname)) into the scm file. This works fine unless mod1 was compiled with the -nounit argument or was compiled into an extension library with other modules under a different name.

    One option is to override the automatic generation of (declare (uses mod1)) by passing the -noclosuses option to SWIG when compiling mod2.i. SWIG then provides the %insert(closprefix) %{ %} directive. Any scheme code inside that directive is inserted into the generated .scm file, and if mod1 was compiled with -nounit, the directive should contain (require 'mod1). This option allows for mixed loading as well, where some modules are imported with (declare (uses modname)) (which means they were compiled without -nounit) and some are imported with (require 'modname).

    The other option is to use the second idea in the above section. Compile all the modules normally, without any %insert(closprefix), -nounit, or -noclosuses. Then the modules will import each other correctly with (declare (uses ...)). To create an extension library or an egg, just create a module_load.scm file that (declare (uses ...)) all the modules.

    23.5 Typemaps

    The Chicken module handles all types via typemaps. This information is read from Lib/chicken/typemaps.i and Lib/chicken/chicken.swg.

    23.6 Pointers

    For pointer types, SWIG uses CHICKEN tagged pointers. A tagged pointer is an ordinary CHICKEN pointer with an extra slot for a void *. With SWIG CHICKEN, this void * is a pointer to a type-info structure. So each pointer used as input or output from the SWIG-generated CHICKEN wrappers will have type information attached to it. This will let the wrappers correctly determine which method should be called according to the object type hierarchy exposed in the SWIG interface files.

    To construct a Scheme object from a C pointer, the wrapper code calls the function SWIG_NewPointerObj(void *ptr, swig_type_info *type, int owner), The function that calls SWIG_NewPointerObj must have a variable declared C_word *known_space = C_alloc(C_SIZEOF_SWIG_POINTER); It is ok to call SWIG_NewPointerObj more than once, just make sure known_space has enough space for all the created pointers.

    To get the pointer represented by a CHICKEN tagged pointer, the wrapper code calls the function SWIG_ConvertPtr(C_word s, void **result, swig_type_info *type, int flags), passing a pointer to a struct representing the expected pointer type. flags is either zero or SWIG_POINTER_DISOWN (see below).

    23.6.1 Garbage collection

    If the owner flag passed to SWIG_NewPointerObj is 1, NewPointerObj will add a finalizer to the type which will call the destructor or delete method of that type. The destructor and delete functions are no longer exported for use in scheme code, instead SWIG and chicken manage pointers. In situations where SWIG knows that a function is returning a type that should be garbage collected, SWIG will automatically set the owner flag to 1. For other functions, the %newobject directive must be specified for functions whose return values should be garbage collected. See Object ownership and %newobject for more information.

    In situations where a C or C++ function will assume ownership of a pointer, and thus chicken should no longer garbage collect it, SWIG provides the DISOWN input typemap. After applying this typemap (see the Typemaps chapter for more information on how to apply typemaps), any pointer that gets passed in will no longer be garbage collected. An object is disowned by passing the SWIG_POINTER_DISOWN flag to SWIG_ConvertPtr. Warning: Since the lifetime of the object is now controlled by the underlying code, the object might get deleted while the scheme code still holds a pointer to it. Further use of this pointer can lead to a crash.

    Adding a finalizer function from C code was added to chicken in the 1.89 release, so garbage collection does not work for chicken versions below 1.89. If you would like the SWIG generated code to work with chicken 1.40 to 1.89, pass the -nocollection argument to SWIG. This will not export code inside the _wrap.c file to register finalizers, and will then export destructor functions which must be called manually.

    23.7 Unsupported features and known problems

    • No director support.
    • No support for c++ standard types like std::vector.
    • The TinyCLOS wrappers for overloaded functions will not work correctly when using %feature(compactdefaultargs).

    23.7.1 TinyCLOS problems with Chicken version <= 1.92

    In Chicken versions equal to or below 1.92, TinyCLOS has a limitation such that generic methods do not properly work on methods with different number of specializers: TinyCLOS assumes that every method added to a generic function will have the same number of specializers. SWIG generates functions with different lengths of specializers when C/C++ functions are overloaded. For example, the code

    class Foo {};
    int foo(int a, Foo *b);
    int foo(int a);
    

    will produce scheme code

    (define-method (foo (arg0 <top>) (arg1 <Foo>)) (call primitive function))
    (define-method (foo (arg0 <top>)) (call primitive function))
    

    Using unpatched TinyCLOS, the second (define-method) will replace the first one, so calling (foo 3 f) will produce an error.

    There are three solutions to this. The easist is to upgrade to the latest Chicken version. Otherwise, the file Lib/chicken/tinyclos-multi-generic.patch in the SWIG source contains a patch against tinyclos.scm inside the 1.92 chicken source to add support into TinyCLOS for multi-argument generics. (This patch was accepted into Chicken) This requires chicken to be rebuilt and custom install of chicken. An alternative is the Lib/chicken/multi-generic.scm file in the SWIG source. This file can be loaded after TinyCLOS is loaded, and it will override some functions inside TinyCLOS to correctly support multi-argument generics. Please see the comments at the top of both files for more information.

    swig-4.0.1/Doc/Manual/ch2.1.png0000644000175000017500000000611213527063513015613 0ustar williamwilliam‰PNG  IHDRy•Š,zBPLTEÿÿÿÿÿÌÿÿ™ÿÿfÿÿ3ÿÿÿÌÿÿÌÌÿÌ™ÿÌfÿÌ3ÿÌÿ™ÿÿ™Ìÿ™™ÿ™fÿ™3ÿ™ÿfÿÿfÌÿf™ÿffÿf3ÿfÿ3ÿÿ3Ìÿ3™ÿ3fÿ33ÿ3ÿÿÿÌÿ™ÿfÿ3ÿÌÿÿÌÿÌÌÿ™ÌÿfÌÿ3ÌÿÌÌÿÌÌÌÌÌ™ÌÌfÌÌ3ÌÌÌ™ÿÌ™ÌÌ™™Ì™fÌ™3Ì™ÌfÿÌfÌÌf™ÌffÌf3ÌfÌ3ÿÌ3ÌÌ3™Ì3fÌ33Ì3ÌÿÌÌÌ™ÌfÌ3Ì™ÿÿ™ÿÌ™ÿ™™ÿf™ÿ3™ÿ™Ìÿ™Ì̙̙™Ìf™Ì3™Ì™™ÿ™™Ì™™™™™f™™3™™™fÿ™fÌ™f™™ff™f3™f™3ÿ™3Ì™3™™3f™33™3™ÿ™Ì™™™f™3™fÿÿfÿÌfÿ™fÿffÿ3fÿfÌÿfÌÌfÌ™fÌffÌ3fÌf™ÿf™Ìf™™f™ff™3f™ffÿffÌff™fffff3fff3ÿf3Ìf3™f3ff33f3fÿfÌf™fff3f3ÿÿ3ÿÌ3ÿ™3ÿf3ÿ33ÿ3Ìÿ3ÌÌ3Ì™3Ìf3Ì33Ì3™ÿ3™Ì3™™3™f3™33™3fÿ3fÌ3f™3ff3f33f33ÿ33Ì33™33f333333ÿ3Ì3™3f333ÿÿÿÌÿ™ÿfÿ3ÿÌÿÌÌÌ™ÌfÌ3Ì™ÿ™Ì™™™f™3™fÿfÌf™fff3f3ÿ3Ì3™3f333ÿÌ™f3îÝ»ªˆwUD"îÝ»ªˆwUD"îÝ»ªˆwUD"îîîÝÝÝ»»»ªªªˆˆˆwwwUUUDDD"""û‚™ IDATxÚb`ÿÿEÿÿEÿÿEÿÿEÿÿEÿÿEÿÿEÿÿEÿÿEÿÿEÿÿ¢ú?l-C ÿÿ ù yÿÿ¢MÈ—¼KKÓÿÿuñ@ùÿÿuñ@ùÿÿuñ@ùÿÿœ.ÆbÂm­ÿÿhcoB  ý'd(š!´ yÿÿà+ýO±q´ #Ú†<ÿÿ ù yÿÿðÿZdüGŠŒÿ`iXyÂR¾ ˜Â€U!Ât œÎ¥mÈÿÿø‡…¢ó 8ëÿXøü‡q¡Lr¨ á¦"TÀÌÄí^Ú†<ÿÿð\ zh¨ÀÓ!ñÿ?Š2Æf#v…È:Ð%&äÿÿ å#’ï)yXÑ„;ä1 ËòÿÿèÒ†¼Ç^ÎÿÇÐð 3*– H9ÿÿm›ÿH¥6zÈ#'UÜåÎGTðÚ½äù?@!ÿÿ<5,ÒÈìx} oüG&ÐˈÿHU3.…(HVÚÿÿÄí`¼±ÖàTH„ ´ yÿÿš!ÿŸØÇ©ðÿ€‡<ÿÿÊ!OI™Jg ÿÿ¼!ÿåG¤%8amCÿÿï(ÿÿuñ@ùÿÿuñ@ùÿÿ¢‹GW}ÿÿ ù yÿÿEÿÿEÿÿEÿÿ5ÈÐô ÿÿb!χ †jÐÿÿ!?$ƒÿÿ!?ƒÿÿ ùÿÿ ùÿÿ¢U†TBÿÿ&É~†;ÿÿÉ~H&xÿÿEÎÐ wÿÿúÉ~¨†;ÿÿòÉ~È<ÿÿâé~‡;ÿÿÒÉ~H‡;ÿÿÊÉ~h<ÿÿºÉ~¨‡;ÿÿÊÉ~h‡;ÿÿúé~¨ºÿÿêÉ~è:ÿÿEÿÿEÿÿEÿÿ"²Ý6 ¨¾‰ÿÿ ù yÿÿÂò£ùžâb$ÿÿ ù yÿÿ ù yÿÿ ù yÿÿ ù yÿÿ ù yÿÿ ù yÿÿ ù yÿÿ ù yÿÿ ù yÿÿ ù yÿÿ ù yÿÿ ù yÿÿ ù yÿÿ ù yÿÿ ù yÿÿ ù yÿÿ ù yÿÿ ù yÿÿ ù yÿÿ ù yÿÿ ù yÿÿ!ÿ(†<ÿÿ¢cÈÿÇHÄÙ†]ÑWKÑÛËxÍÿÿ¢™3ÐWúüG¿Ç-Fˆ»ð?6 þc³¿f A­ ÿÿ¢UÈÿÇð ®›úˆ·Û•°°Kèþ :üÖ Àîÿÿ¢‘càׯÒ*ä‘-øfßlåÿ  yÿÿ¢cЊ™ÿh!tíüä«íÿ£ß\brq‚"îVl!b ŠAþƼúÿÿ¢yÈ£\SÌ€|ý<Ò¥ëws£\í™aHy„5ÿQ­ è0¦AÈÿÿ€G½Ž›óžn´ §I yxF[Í‹j Ž `K^ÿÿG\?$‡<þr×EáøCž&¥ ÿÿ¢q ‹+Í#©!+ä‘¥1›=T y R=^}ÿÿ¢m«ý:z”ì‹rÝ=©!d*—`ÈÿÇV–àKóä^}ÿÿ¢}O ™B½ÔQ #I )ÅÒ¶ÁbÁì=7,ÎA úÿ(u-^GP°ç¯Fÿÿòã6ƒÙ™xÝÿÿú!?TSÿÿc•C2äÿÿ ù yÿÿ ù yÿÿ ù yÿÿ ù yÿÿ ù yÿÿ ù yÿÿ ù yÿÿ ù yÿÿ ù yÿÿ ù yÿÿ ù yÿÿ ù yÿÿ ù yÿÿ ù yÿÿ ù yÿÿ ù yÿÿ ù yÿÿ ù yÿÿ ù yÿÿ ù yÿÿ ù yÿÿ§mÐòt\ÿÿ ù yÿÿEÿÿEÿÿEÿÿEÿÿEÿÿEÿÿEÿÿEÿÿEÿÿUŸ˜Å"AIEND®B`‚swig-4.0.1/Doc/Manual/Ocaml.html0000644000175000017500000010765613527234053016231 0ustar williamwilliam SWIG and Ocaml

    38 SWIG and OCaml

    This chapter describes SWIG's support of Ocaml.

    Ocaml is a relatively recent addition to the ML family, and is a recent addition to SWIG. It's the second compiled, typed language to be added. Ocaml has widely acknowledged benefits for engineers, mostly derived from a sophisticated type system, compile-time checking which eliminates several classes of common programming errors, and good native performance. While all of this is wonderful, there are well-written C and C++ libraries that Ocaml users will want to take advantage of as part of their arsenal (such as SSL and gdbm), as well as their own mature C and C++ code. SWIG allows this code to be used in a natural, type-safe way with Ocaml, by providing the necessary, but repetitive glue code which creates and uses Ocaml values to communicate with C and C++ code. In addition, SWIG also produces the needed Ocaml source that binds variants, functions, classes, etc.

    If you're not familiar with the Objective Caml language, you can visit The Ocaml Website.

    38.1 Preliminaries

    SWIG is compatible with OCaml 3.12.0 and above. Given the choice, you should use the latest stable release. The SWIG Ocaml module has been tested on Linux (x86, PPC, Sparc) and Cygwin on Windows. The best way to determine whether your system will work is to compile the examples and test-suite which come with SWIG. You can do this by running make check from the SWIG root directory after installing SWIG. The Ocaml module has been tested using the system's dynamic linking (the usual -lxxx against libxxx.so, as well as with Gerd Stolpmann's Dl package. The ocaml_dynamic and ocaml_dynamic_cpp targets in the file Examples/Makefile illustrate how to compile and link SWIG modules that will be loaded dynamically. This has only been tested on Linux so far.

    38.1.1 Running SWIG

    The basics of getting a SWIG Ocaml module up and running can be seen from one of SWIG's example Makefiles, but is also described here. To build an Ocaml module, run SWIG using the -ocaml option.

    %swig -ocaml example.i
    

    This will produce 3 files. The file example_wrap.c contains all of the C code needed to build an Ocaml module. To build the module, you will compile the file example_wrap.c with ocamlc or ocamlopt to create the needed .o file. You will need to compile the resulting .ml and .mli files as well, and do the final link with -custom (not needed for native link).

    38.1.2 Compiling the code

    The OCaml SWIG module now requires you to compile a module (Swig) separately. In addition to aggregating common SWIG functionality, the Swig module contains the data structure that represents C/C++ values. This allows easier data sharing between modules if two or more are combined, because the type of each SWIG'ed module's c_obj is derived from Swig.c_obj_t. This also allows SWIG to acquire new conversions painlessly, as well as giving the user more freedom with respect to custom typing. Use ocamlc or ocamlopt to compile your SWIG interface like:

    % swig -ocaml -co swig.mli ; swig -ocaml -co swig.ml
    % ocamlc -c swig.mli ; ocamlc -c swig.ml
    % ocamlc -c -ccopt "-I/usr/include/foo" example_wrap.c
    % ocamlc -c example.mli
    % ocamlc -c example.ml
    

    ocamlc is aware of .c files and knows how to handle them. Unfortunately, it does not know about .cxx, .cc, or .cpp files, so when SWIG is invoked in C++ mode, you must:

    % cp example_wrap.cxx example_wrap.cxx.c
    % ocamlc -c ... -ccopt -xc++ example_wrap.cxx.c
    % ...
    

    38.1.3 The camlp4 module

    The camlp4 module (swigp4.ml -> swigp4.cmo) contains a simple rewriter which makes C++ code blend more seamlessly with objective caml code. Its use is optional, but encouraged. The source file is included in the Lib/ocaml directory of the SWIG source distribution. You can checkout this file with "swig -ocaml -co swigp4.ml". You should compile the file with "ocamlc -I `camlp4 -where` -pp 'camlp4o pa_extend.cmo q_MLast.cmo' -c swigp4.ml"

    The basic principle of the module is to recognize certain non-caml expressions and convert them for use with C++ code as interfaced by SWIG. The camlp4 module is written to work with generated SWIG interfaces, and probably isn't great to use with anything else.

    Here are the main rewriting rules:

    InputRewritten to
    f'( ... ) as in
    atoi'("0") or
    _exit'(0)
    f(C_list [ ... ]) as in
    atoi (C_list [ C_string "0" ]) or
    _exit (C_list [ C_int 0 ])
    object -> method ( ... )(invoke object) "method" (C_list [ ... ])
    object 'binop argument as in
    a '+= b
    (invoke object) "+=" argument as in
    (invoke a) "+=" b
    Note that because camlp4 always recognizes << and >>, they are replaced by lsl and lsr in operator names.
    'unop object as in
    '! a
    (invoke a) "!" C_void
    Smart pointer access like this
    object '-> method ( args )
    (invoke (invoke object "->" C_void))
    Invoke syntax
    object . '( ... )
    (invoke object) "()" (C_list [ ... ])
    Array syntax
    object '[ 10 ]
    (invoke object) "[]" (C_int 10)
    Assignment syntax
    let a = '10 and b = '"foo" and c = '1.0 and d = 'true
    let a = C_int 10 and b = C_string "foo" and c = C_double 1.0 and d = C_bool true
    Cast syntax
    let a = _atoi '("2") as int
    let b = (getenv "PATH") to string
    This works for int, string, float, bool
    let a = get_int (_atoi (C_string "2"))
    let b = C_string (getenv "PATH")

    38.1.4 Using your module

    You can test-drive your module by building a toplevel ocaml interpreter. Consult the ocaml manual for details.

    When linking any ocaml bytecode with your module, use the -custom option to build your functions into the primitive list. This option is not needed when you build native code.

    38.1.5 Compilation problems and compiling with C++

    As mentioned above, .cxx files need special handling to be compiled with ocamlc. Other than that, C code that uses class as a non-keyword, and C code that is too liberal with pointer types may not compile under the C++ compiler. Most code meant to be compiled as C++ will not have problems.

    38.2 The low-level Ocaml/C interface

    In order to provide access to overloaded functions, and provide sensible outputs from them, all C entities are represented as members of the c_obj type:

    In the code as seen by the typemap writer, there is a value, swig_result, that always contains the current return data. It is a list, and must be appended with the caml_list_append function, or with functions and macros provided by objective caml.

    type c_obj =
        C_void
      | C_bool of bool
      | C_char of char
      | C_uchar of char
      | C_short of int
      | C_ushort of int
      | C_int of int
      | C_uint of int32
      | C_int32 of int32
      | C_int64 of int64
      | C_float of float
      | C_double of float
      | C_ptr of int64 * int64
      | C_array of c_obj array
      | C_list of c_obj list
      | C_obj of (string -> c_obj -> c_obj)
      | C_string of string
      | C_enum of c_enum_t
    

    A few functions exist which generate and return these:

    • caml_ptr_val receives a c_obj and returns a void *. This should be used for all pointer purposes.
    • caml_long_val receives a c_obj and returns a long. This should be used for most integral purposes.
    • caml_val_ptr receives a void * and returns a c_obj.
    • caml_val_bool receives a C int and returns a c_obj representing its bool value.
    • caml_val_(u)?(char|short|int|long|float|double) receives an appropriate C value and returns a c_obj representing it.
    • caml_val_string receives a char * and returns a string value.
    • caml_val_string_len receives a char * and a length and returns a string value.
    • caml_val_obj receives a void * and an object type and returns a C_obj, which contains a closure giving method access.

    Because of this style, a typemap can return any kind of value it wants from a function. This enables out typemaps and inout typemaps to work well. The one thing to remember about outputting values is that you must append them to the return list with swig_result = caml_list_append(swig_result, v).

    This function will return a new list that has your element appended. Upon return to caml space, the fnhelper function beautifies the result. A list containing a single item degrades to only that item (i.e. [ C_int 3 ] -> C_int 3), and a list containing more than one item is wrapped in C_list (i.e. [ C_char 'a' ; C_char 'b' ] -> C_list [ C_char 'a' ; C_char 'b' ]). This is in order to make return values easier to handle when functions have only one return value, such as constructors, and operators. In addition, string, pointer, and object values are interchangeable with respect to caml_ptr_val, so you can allocate memory as caml strings and still use the resulting pointers for C purposes, even using them to construct simple objects on. Note, though, that foreign C++ code does not respect the garbage collector, although the SWIG interface does.

    The wild card type that you can use in lots of different ways is C_obj. It allows you to wrap any type of thing you like as an object using the same mechanism that the ocaml module does. When evaluated in caml_ptr_val, the returned value is the result of a call to the object's "&" operator, taken as a pointer.

    You should only construct values using objective caml, or using the functions caml_val_* functions provided as static functions to a SWIG ocaml module, as well as the caml_list_* functions. These functions provide everything a typemap needs to produce values. In addition, value items pass through directly, but you must make your own type signature for a function that uses value in this way.

    38.2.1 The generated module

    The SWIG %module directive specifies the name of the Ocaml module to be generated. If you specified `%module example', then your Ocaml code will be accessible in the module Example. The module name is always capitalized as is the ocaml convention. Note that you must not use any Ocaml keyword to name your module. Remember that the keywords are not the same as the C++ ones.

    You can introduce extra code into the output wherever you like with SWIG. These are the places you can introduce code:
    "header"This code is inserted near the beginning of the C wrapper file, before any function definitions.
    "wrapper"This code is inserted in the function definition section.
    "runtime"This code is inserted near the end of the C wrapper file.
    "mli"This code is inserted into the caml interface file. Special signatures should be inserted here.
    "ml"This code is inserted in the caml code defining the interface to your C code. Special caml code, as well as any initialization which should run when the module is loaded may be inserted here.
    "classtemplate"The "classtemplate" place is special because it describes the output SWIG will generate for class definitions.

    38.2.2 Enums

    SWIG will wrap enumerations as polymorphic variants in the output Ocaml code, as above in C_enum. In order to support all C++-style uses of enums, the function int_to_enum and enum_to_int are provided for ocaml code to produce and consume these values as integers. Other than that, correct uses of enums will not have a problem. Since enum labels may overlap between enums, the enum_to_int and int_to_enum functions take an enum type label as an argument. Example:

    %module enum_test
    %{
    enum c_enum_type { a = 1, b, c = 4, d = 8 };
    %}
    enum c_enum_type { a = 1, b, c = 4, d = 8 };
    

    The output mli contains:

    type c_enum_type = [
      `unknown
    | `c_enum_type
    ]
    type c_enum_tag = [
      `int of int
    | `a
    | `b
    | `c
    | `d
    ]
    val int_to_enum c_enum_type -> int -> c_obj
    val enum_to_int c_enum_type -> c_obj -> c_obj
    

    So it's possible to do this:

    bash-2.05a$ ocamlmktop -custom enum_test_wrap.o enum_test.cmo -o enum_test_top
    bash-2.05a$ ./enum_test_top
            Objective Caml version 3.04
    
    # open Enum_test ;;
    # let x = C_enum `a ;;
    val x : Enum_test.c_obj = C_enum `a
    # enum_to_int `c_enum_type x ;;
    - : Enum_test.c_obj = C_int 1
    # int_to_enum `c_enum_type 4 ;;
    - : Enum_test.c_obj = C_enum `c
    

    38.2.2.1 Enum typing in Ocaml

    The ocaml SWIG module now has support for loading and using multiple SWIG modules at the same time. This enhances modularity, but presents problems when used with a language which assumes that each module's types are complete at compile time. In order to achieve total soundness enum types are now isolated per-module. The type issue matters when values are shared between functions imported from different modules. You must convert values to master values using the swig_val function before sharing them with another module.

    38.2.3 Arrays

    38.2.3.1 Simple types of bounded arrays

    SWIG has support for array types, but you generally will need to provide a typemap to handle them. You can currently roll your own, or expand some of the macros provided (but not included by default) with the SWIG distribution.

    By including "carray.i", you will get access to some macros that help you create typemaps for array types fairly easily.

    %make_simple_array_typemap is the easiest way to get access to arrays of simple types with known bounds in your code, but this only works for arrays whose bounds are completely specified.

    38.2.3.2 Complex and unbounded arrays

    Unfortunately, unbounded arrays and pointers can't be handled in a completely general way by SWIG, because the end-condition of such an array can't be predicted. In some cases, it will be by consent (e.g. an array of four or more chars), sometimes by explicit length (char *buffer, int len), and sometimes by sentinel value (0, -1, etc.). SWIG can't predict which of these methods will be used in the array, so you have to specify it for yourself in the form of a typemap.

    38.2.3.3 Using an object

    It's possible to use C++ to your advantage by creating a simple object that provides access to your array. This may be more desirable in some cases, since the object can provide bounds checking, etc., that prevents crashes.

    Consider writing an object when the ending condition of your array is complex, such as using a required sentinel, etc.

    38.2.3.4 Example typemap for a function taking float * and int

    This is a simple example in typemap for an array of float, where the length of the array is specified as an extra parameter. Other such typemaps will work similarly. In the example, the function printfloats is called with a float array, and specified length. The actual length reported in the len argument is the length of the array passed from ocaml, making passing an array into this type of function convenient.

    tarray.i
    %module tarray
    %{
    #include <stdio.h>
    
    void printfloats( float *tab, int len ) {
      int i;
    
      for( i = 0; i < len; i++ ) {
        printf( "%f ", tab[i] );
      }
    
      printf( "\n" );
    }
    %}
    
    %typemap(in) (float *tab, int len) {
      int i;
      /* $*1_type */
      $2 = caml_array_len($input);
      $1 = ($*1_type *)malloc( $2 * sizeof( float ) );
      for( i = 0; i < $2; i++ ) {
        $1[i] = caml_double_val(caml_array_nth($input, i));
      }
    }
    
    void printfloats( float *tab, int len );
    
    Sample Run
    # open Tarray ;;
    # _printfloats (C_array [| C_double 1.0 ; C_double 3.0 ; C_double 5.6666 |]) ;;
    1.000000 3.000000 5.666600
    - : Tarray.c_obj = C_void
    

    38.2.4 C++ Classes

    C++ classes, along with structs and unions are represented by C_obj (string -> c_obj -> c_obj) wrapped closures. These objects contain a method list, and a type, which allow them to be used like C++ objects. When passed into typemaps that use pointers, they degrade to pointers through their "&" method. Every method an object has is represented as a string in the object's method table, and each method table exists in memory only once. In addition to any other operators an object might have, certain builtin ones are provided by SWIG: (all of these take no arguments (C_void))

    "~"Delete this object
    "&"Return an ordinary C_ptr value representing this object's address
    "sizeof"If enabled with ("sizeof"="1") on the module node, return the object's size in char.
    ":methods"Returns a list of strings containing the names of the methods this object contains
    ":classof"Returns the name of the class this object belongs to.
    ":parents"Returns a list of all direct parent classes which have been wrapped by SWIG.
    "::[parent-class]"Returns a view of the object as the indicated parent class. This is mainly used internally by the SWIG module, but may be useful to client programs.
    "[member-variable]"Each member variable is wrapped as a method with an optional parameter. Called with one argument, the member variable is set to the value of the argument. With zero arguments, the value is returned.

    Note that this string belongs to the wrapper object, and not the underlying pointer, so using create_[x]_from_ptr alters the returned value for the same object.

    38.2.4.1 STL vector and string Example

    Standard typemaps are now provided for STL vector and string. More are in the works. STL strings are passed just like normal strings, and returned as strings. STL string references don't mutate the original string, (which might be surprising), because Ocaml strings are mutable but have fixed length. Instead, use multiple returns, as in the argout_ref example.

    example.i
    %module example
    %{
    #include "example.h"
    %}
    
    %include <stl.i>
    
    namespace std {
      %template(StringVector) std::vector < string >;
    };
    
    %include "example.h"
    
    This example is in Examples/ocaml/stl

    Since there's a makefile in that directory, the example is easy to build.

    Here's a sample transcript of an interactive session using a string vector after making a toplevel (make toplevel). This example uses the camlp4 module.

    bash-2.05a$ ./runme_top
            Objective Caml version 3.06
    
            Camlp4 Parsing version 3.06
    
    # open Swig ;;
    # open Example ;;
    # let x = new_StringVector '() ;;
    val x : Example.c_obj = C_obj <fun>
    # x -> ":methods" () ;;
    - : Example.c_obj =
    C_list
     [C_string "nop"; C_string "size"; C_string "empty"; C_string "clear";
      C_string "push_back"; C_string "[]"; C_string "="; C_string "set";
      C_string "~"; C_string "&"; C_string ":parents"; C_string ":classof";
      C_string ":methods"]
    # x -> push_back ("foo") ;;
    - : Example.c_obj = C_void
    # x -> push_back ("bar") ;;
    - : Example.c_obj = C_void
    # x -> push_back ("baz") ;;
    - : Example.c_obj = C_void
    # x '[1] ;;
    - : Example.c_obj = C_string "bar"
    # x -> set (1, "spam") ;;
    - : Example.c_obj = C_void
    # x '[1] ;;
    - : Example.c_obj = C_string "spam"
    # for i = 0 to (x -> size() as int) - 1 do
        print_endline ((x '[i to int]) as string)
      done ;;
    foo
    bar
    baz
    - : unit = ()
    #
    

    38.2.4.2 C++ Class Example

    Here's a simple example using Trolltech's Qt Library:

    qt.i
    %module qt
    %{
    #include <qapplication.h>
    #include <qpushbutton.h>
    %}
    class QApplication {
    public:
      QApplication( int argc, char **argv );
      void setMainWidget( QWidget *widget );
      void exec();
    };
    
    class QPushButton {
    public:
      QPushButton( char *str, QWidget *w );
      void resize( int x, int y );
      void show();
    };
    

    38.2.4.3 Compiling the example

    bash-2.05a$ QTPATH=/your/qt/path
    bash-2.05a$ for file in swig.mli swig.ml swigp4.ml ; do swig -ocaml -co $file ; done
    bash-2.05a$ ocamlc -c swig.mli ; ocamlc -c swig.ml
    bash-2.05a$ ocamlc -I `camlp4 -where` -pp "camlp4o pa_extend.cmo q_MLast.cmo" -c swigp4.ml
    bash-2.05a$ swig -ocaml -c++ -I$QTPATH/include qt.i
    bash-2.05a$ mv qt_wrap.cxx qt_wrap.c
    bash-2.05a$ ocamlc -c -ccopt -xc++ -ccopt -g -g -ccopt -I$QTPATH/include qt_wrap.c
    bash-2.05a$ ocamlc -c qt.mli
    bash-2.05a$ ocamlc -c qt.ml
    bash-2.05a$ ocamlmktop -custom swig.cmo -I `camlp4 -where` \
      camlp4o.cma swigp4.cmo qt_wrap.o qt.cmo -o qt_top -cclib \
      -L$QTPATH/lib -cclib -lqt
    

    38.2.4.4 Sample Session

    bash-2.05a$ ./qt_top
            Objective Caml version 3.06
    
            Camlp4 Parsing version 3.06
    
    # open Swig ;;
    # open Qt ;;
    # let a = new_QApplication '(0, 0) ;;
    val a : Qt.c_obj = C_obj <fun>
    # let hello = new_QPushButton '("hi", 0) ;;
    val hello : Qt.c_obj = C_obj <fun>
    # hello -> resize (100, 30) ;;
    - : Qt.c_obj = C_void
    # hello -> show () ;;
    - : Qt.c_obj = C_void
    # a -> exec () ;;
    

    Assuming you have a working installation of QT, you will see a window containing the string "hi" in a button.

    38.2.5 Director Classes

    38.2.5.1 Director Introduction

    Director classes are classes which allow Ocaml code to override the public methods of a C++ object. This facility allows the user to use C++ libraries that require a derived class to provide application specific functionality in the context of an application or utility framework.

    You can turn on director classes by using an optional module argument like this:

    %module(directors="1")
    
    ...
    
    // Turn on the director class for a specific class like this:
    %feature("director")
    class foo {
      ...
    };
    

    38.2.5.2 Overriding Methods in Ocaml

    Because the Ocaml language module treats C++ method calls as calls to a certain function, all you need to do is to define the function that will handle the method calls in terms of the public methods of the object, and any other relevant information. The function new_derived_object uses a stub class to call your methods in place of the ones provided by the underlying implementation. The object you receive is the underlying object, so you are free to call any methods you want from within your derived method. Note that calls to the underlying object do not invoke Ocaml code. You need to handle that yourself.

    new_derived_object receives your function, the function that creates the underlying object, and any constructor arguments, and provides an object that you can use in any usual way. When C++ code calls one of the object's methods, the object invokes the Ocaml function as if it had been invoked from Ocaml, allowing any method definitions to override the C++ ones.

    In this example, I'll examine the objective caml code involved in providing an overloaded class. This example is contained in Examples/ocaml/shapes.

    38.2.5.3 Director Usage Example

    runme.ml
    open Swig
    open Example
    
    ...
    
    let triangle_class pts ob meth args =
      match meth with
          "cover" ->
            (match args with
                 C_list [ x_arg ; y_arg ] ->
                 let xa = x_arg as float
                 and ya = y_arg as float in
                   (point_in_triangle pts xa ya) to bool
               | _ -> raise (Failure "cover needs two double arguments."))
        | _ -> (invoke ob) meth args ;;
    
    ...
    
    let triangle =
      new_derived_object
        new_shape
        (triangle_class ((0.0, 0.0), (0.5, 1.0), (1.0, 0.6)))
        '() ;;
    
    let _ = _draw_shape_coverage '(triangle, 60, 20) ;;
    

    This is the meat of what you need to do. The actual "class" definition containing the overloaded method is defined in the function triangle_class. This is a lot like the class definitions emitted by SWIG, if you look at example.ml, which is generated when SWIG consumes example.i. Basically, you are given the arguments as a c_obj and the method name as a string, and you must intercept the method you are interested in and provide whatever return value you need. Bear in mind that the underlying C++ code needs the right return type, or an exception will be thrown. This exception will generally be Failure, or NotObject. You must call other ocaml methods that you rely on yourself. Due to the way directors are implemented, method calls on your object from with ocaml code will always invoke C++ methods even if they are overridden in ocaml.

    In the example, the draw_shape_coverage function plots the indicated number of points as either covered (x) or uncovered ( ) between 0 and 1 on the X and Y axes. Your shape implementation can provide any coverage map it likes, as long as it responds to the "cover" method call with a boolean return (the underlying method returns bool). This might allow a tricky shape implementation, such as a boolean combination, to be expressed in a more effortless style in ocaml, while leaving the "engine" part of the program in C++.

    38.2.5.4 Creating director objects

    The definition of the actual object triangle can be described this way:

    let triangle =
      new_derived_object
        new_shape
        (triangle_class ((0.0, 0.0), (0.5, 1.0), (1.0, 0.0)))
        '()
    

    The first argument to new_derived_object, new_shape is the method which returns a shape instance. This function will be invoked with the third argument will be appended to the argument list [ C_void ]. In the example, the actual argument list is sent as (C_list [ C_void ; C_void ]). The augmented constructor for a director class needs the first argument to determine whether it is being constructed as a derived object, or as an object of the indicated type only (in this case shape). The Second argument is a closure that will be added to the final C_obj.

    The actual object passed to the self parameter of the director object will be a C_director_core, containing a c_obj option ref and a c_obj. The c_obj provided is the same object that will be returned from new_derived object, that is, the object exposing the overridden methods. The other part is an option ref that will have its value extracted before becoming the ob parameter of your class closure. This ref will contain None if the C++ object underlying is ever destroyed, and will consequently trigger an exception when any method is called on the object after that point (the actual raise is from an inner function used by new_derived_object, and throws NotObject). This prevents a deleted C++ object from causing a core dump, as long as the object is destroyed properly.

    38.2.5.5 Typemaps for directors, directorin, directorout, directorargout

    Special typemaps exist for use with directors, the directorin, directorout, directorargout are used in place of in, out, argout typemaps, except that their direction is reversed. They provide for you to provide argout values, as well as a function return value in the same way you provide function arguments, and to receive arguments the same way you normally receive function returns.

    38.2.5.6 directorin typemap

    The directorin typemap is used when you will receive arguments from a call made by C++ code to you, therefore, values will be translated from C++ to ocaml. You must provide some valid C_obj value. This is the value your ocaml code receives when you are called. In general, a simple directorin typemap can use the same body as a simple out typemap.

    38.2.5.7 directorout typemap

    The directorout typemap is used when you will send an argument from your code back to the C++ caller. That is; directorout specifies a function return conversion. You can usually use the same body as an in typemap for the same type, except when there are special requirements for object ownership, etc.

    38.2.5.8 directorargout typemap

    C++ allows function arguments which are by pointer (*) and by reference (&) to receive a value from the called function, as well as sending one there. Sometimes, this is the main purpose of the argument given. directorargout typemaps allow your caml code to emulate this by specifying additional return values to be put into the output parameters. The SWIG ocaml module is a bit loose in order to make code easier to write. In this case, your return to the caller must be a list containing the normal function return first, followed by any argout values in order. These argout values will be taken from the list and assigned to the values to be returned to C++ through directorargout typemaps. In the event that you don't specify all of the necessary values, integral values will read zero, and struct or object returns have undefined results.

    38.2.6 Exceptions

    If an error occurs in a C or C++ function, you may want to convert that error into an OCaml exception. To do this, you can use the %exception directive. The %exception directive simply lets you rewrite part of the generated wrapper code to include an error check. It is detailed in full in the Exception handling with %exception section.

    In C, a function often indicates an error by returning a status code (e.g. a negative number or a NULL pointer). Here is a simple example of how you might handle that:

    %exception malloc {
      $action
      if (result == NULL) {
        caml_failwith("Not enough memory");
      }
    }
    void *malloc(size_t nbytes);
    

    In OCaml:

    # let a = _malloc (C_int 20000000000);;
    Exception: Failure "Not enough memory".
    #
    

    If a library provides some kind of general error handling framework, you can also use that. For example:

    %exception {
      $action
      if (err_occurred()) {
        caml_failwith(err_message());
      }
    }
    

    If no declaration name is given to %exception, it is applied to all wrapper functions. $action is a SWIG special variable and is replaced by the C/C++ function call being wrapped.

    C++ exceptions are also easy to handle. We can catch a C++ exception and rethrow it as an OCaml exception like this:

    %exception getitem {
      try {
        $action
      } catch (std::out_of_range &e) {
        caml_failwith(e.what());
      }
    }
    
    class FooClass {
      public:
        int getitem(int index);      // Exception handling added
        ...
    };
    

    The language-independent exception.i library file can also be used to raise exceptions. See the SWIG Library chapter.

    38.3 Documentation Features

    The features described in this section can be used to generate documentation comments (colloquially referred to as "docstrings") that can be read by OCamldoc.

    38.3.1 Module docstring

    The first documentation comment of an mli file is the comment associated with the entire module. SWIG supports this by setting an option of the %module directive. For example:

    %module(docstring="This is the example module's docstring") example
    

    When you have more than just a line or so, you can retain the readability of the %module directive by using a macro. For example:

    %define DOCSTRING
    "The `XmlResource` class allows program resources defining menus,
    controls on a panel, etc. to be loaded from an XML file."
    %enddef
    
    %module(docstring=DOCSTRING) xrc
    
    swig-4.0.1/Doc/Manual/android-class.png0000644000175000017500000003446613527063513017540 0ustar williamwilliam‰PNG  IHDRÎv)r8ýIDATxœí}”EÕo¼õ¼'Oó)êª D‚$BÂ?³ˆ`–1$˜L%«Aã‚c@X¢Ä>¾¸¢Æ1@\‚„5j<»ïÏÆÏèFEz¢‹Ê1ñ&Ñ ¢ G}jªëoϽUu«nßë½–Áh#xõât£À À(4êf€Ól8õÔSgΜyb- –kÖ¬Y5sN>ùdkÕŒ¶hã”SN #†“N: O‘&~Eu3ÀlÎ9çœóÎ;oéÒ¥Ë\wÝuêO<}ã߈”2ל9sæÏŸ¿dÉ’åµP*•òÌ3Ï´ÖÎhKÌ›7ï /´Òâñ<¿–d zç;ßù® z{{o¾ùæ¿ÿýï[¶lAXƯZµ ä.sÍ;÷â‹/~—‚ñññ}èCW_}õ5×\ó½ï}ï½ï}¯|ôŽw¼}ŽßaFK£ûÛßþö+®¸b``à–[nÙ¾}û—¾ô¥/~ñ‹ ¨~ô£ïÿûW®\yÆgXóž<ó¤ã§wâ´ãpŸf¦#pÒ4É:u3ÀÉ6\pÁ+\uÕU<ðÀ¿þõ¯_þò—üàÕG‹-’¹0¼ímo“úúú}ôѧžzê™gžùë_ÿú»ßýÌ Ÿ"eww·µvFû¤ùž÷¼çöÛoéö³ŸEà3ŸùÌÖ­[‡††>ÿùÏá _¸üòËÁ$fÆ®9] .8ÿ}ž·îÆ×_sã\\ën<[Öß8÷ýÏZúÖÅg½þ,L HŸ `ýóõÑ\Ìh÷»ßýnõÑùçŸ/suÖYË–-“~îãÞ{ïç pß}÷ýêW¿’O1ñ}öÙ)½n†ŸúÔ§0*a8Óâï¾ûîçž{®\.kñˆùÃþ€,û÷ïÇê J /ºè¢uëÖa€…COOÏ[ßúVܱиì²Ëhd$ Ör-<á¥<ëÆMÚt¿·ù~ïæû=-pÓ½ÿö_>fÑÂ…gvÍ9¹8É,fÞ\ ´cùÚµk±˜ùÛßþ†>ƒwî¹çÊ\0!PúmÛ¶=gÃÈÈ%@JÈÖÚ©âË_þ2†$ü`5¾¿¿Ÿþ£O~ò“j<ÈôÙgŸ}üñÇ÷îÝ‹§ øšYLÌœ9Ë üï×_ý7¾ñ_ÿú×ÿøÇ?~ó›ß|ë[ßÚ°aâñänfðÒŸÿügPfî=ôÐ_þò,1ðôÄOÔrÍš9ó¥®+oœZþ¡WþÁa廽w­Ÿýæ ß¼|Ùò[oÙò·ÿ÷·ƒÖßÿáÅ‹/¼`áé§ rJ† ޼á oÀ„…æ¢{X·Aº`ÂZ¼x1ýãÿ1HóÚ×¾v¢¹³fA Øîc÷îÝÿ·ˆ¿2üï|“¤Ú>ªÿdÄÅûÞ÷>Ð.þV•ð—Ü¿ò•¯HjÆœÿÏþsÏž=ßüæ7 ù‘ßýîwÆ2ØšÅ׿þõXY`¼ÇÀŠùá… ‚¢ c§3fÌPÓŸtÒŒ9gœvÕç^ô‘o>ïãwy»ë¿}ì.oåU3æŸ7ÃÀÀ¯õð#¿~äâÞwΟwîüyóQÚɳOžÞoH™ö4¿ÿýï?ùä“K–,ÁŠ ‚,FÐ.&D¬ùæøË\à`ðÃG>òÄÓ›"<öØc2ü“ŸüO¯»î:¤Ä„e­‘6°Ú& Ÿ¥R ¤ aôsŸûâ?þñS<8å]wÝ…HüõˆÁêaL#aYÀ„O4³qãÆ}ûöA¤Ä€i‹Dâé´iÓÔô3Nœ®èß1éºÿzÞÀ7¼ÝâZþžc¯X{ÅÏîûÙÃ=¼ÿ¾ý‡xxÁ‚ Î8ýŒ'Ì@®dœDRVl˜¡°ø:tèž{îÈ"ÅLmj.,õ¾ýíocl¸ÿþû%Ñ?úè£2Œ—Ž)iRë0£iÐà‡?üáŸþô' Æ£££ˆ¿ýöÛ1?ËÄDô—_~9ÂwÞy' w¯yÍkèô@!÷Þ{/ø ð£ýC!"ÍÑpÖ¬™‹.\¼¼wÚš›þLJ¿âýçW¼ëþË[pñQ3O˜yÂI'œý†³¿>ö­-·Λ7ÿä™'?ãø×÷šã`€©! F`€¹c­†å;þ›nº £‚ÚÊc=VfAýĪñ–[nùéO*‰þ·¿ý­ ÿüç?¿ù曑)êf¤ þ‹|~b0Öö*00#0©[o½1øëƒ,X!>,K@ÇwÑ Ä?¬X0t‚– .bÜD$žª´ æÔÙ§Î9sN÷²#úÿ·‡ëÚÿã-»â…H8õØ©¯ëz&'Θñjd:vê”)SŽ>æhäJ†^õªW]Á1Ç6øêW¿ ±iÅŠGWã¨£Ž’¹ׯ_¾aŒ—¯¢’ cäÀÓ«¯¾)‘>ÞÿÈh`†¿Á-\wíÚµtéÒË.»ŒdÐ(Èýü#=Åê%,‹£ÆW¿úÕ’¨0ØcüðÃcá„Å6Eâ)Ò¹¦¼ø¥¯è^zDÿv¯o»wÍvïŸóÖmý·u·öþÛ»ú¶Ãún;ìªÛ»ì¦Ã¦N™úÊ£^9µ˜bCg5À²h.-fÀvÚS™ë•¯|¥ŒüØÇ>&‰þ‘G‘a ÿ2 Ò[kg¤ ¬Fˆ´ø¡¡!ÄC*ExåÊ•O=õVØCfûýïÿÌ3Ï`é~Ëâ»—½ìeô¿£Z ÌåË—S$ž‚ Ì\Çwü¬Sf.Xõ¿.^wØEô/?ðv?°âšÃÞ¶î¿Ï˜qÌ©§Ÿ þA–ºàh^ô¢ý»‚·¼å-4åá\rÉ%ÿ^ ™ }˜eÔÉógpPÝH¾ø »êf"/õNÄ*´ªã­)A¦ xðmÛÓ9˜¡f^¾ó={#3@Ãõõ_ äbµ³VlõãzeØæ;ß›|O`h€°V‘ Lý|ÏðÞÔ€ï|ÏÛ½Ù3ßùž«{Ý À`0L>br÷üîÒŠRÏŠžô‘¯÷ŒT1éðIƒ[…†æ¾{öß3žÞ}|ïøÐ¶!0[Ö=f0”7•=tèÐ#‡Ä=½ë‘à^ÞR¿Þƒ‘=xè‰&lu  J¡£ö‡æÝ³î1ƒ¡D9A¥|G-O<‘u  Ê&#ë3 ª|¤)w鼂 †¥Ø¢ñwi@¦rÇ&­ð#,3ò„ êè1¹k™^õP ë¬.ûž;÷ @1ÂbÜÎÑñ»Ç±LÂ1¥%%ÁÕ%„^÷‰+ë3 „í·ý0¨ õïB8q:Ø ¼¹Œ˜ ¸g™LéCH È X&ɼ5îûÅ.#gèìì,-)‘ÿÆÞÕ½‰ßÉi$ª˜rÌ”¬ûÊ`0 ƒÁ`0 ƒÁ`0Z “&Mš=köôiӽެ›Â`4 ý¡mCååÉ“r<·çŽ=CÛ‡†w ÷]Ù—Í>mvÿzáµx쎱á‘a\}ë¢.óJtÍéj  Ñs5V>#'˜~âôÑ£ƒ›d€@-§CøÉëžßH›¦LE« ßµp™7@‡þ®»Ñs5V>#7ÀúG0À–˜ ày=+{pM>bòÀ }ëûˆ,JK„\]g‰aOÁjƒ[‡¶aí…ŸåÍe„Q=~Ê2¿`ÑÏ×±S ï<²Ù)Ã<†^Qà–Áþkû…Æ@Ž2/¡÷Ò^ÌQx*yJ{P{¡µ¹0ùÈ\ÐæáíÃ-(±ì£V>£å{ðiTø Þ2ˆåˆ¤CÔÐÙÙ‰iÁó5…P‡çÓ_ϪÏ— 6 AÝ:È„®¹Ær\!Ðî7uËÕøPô– ×ÎQYšÕk@ú˜0Òk}dhu`À_[¨@¥ÈoZ $ãj`4--/€ˆÔ‚Ÿ#ÃV Â16c¥áÈàZÖ\¹¦{®!'(ŠöH@™Ú*¨ª%j®E „ébê”`BS*ehu`56.ŒîªúûQ –ËAø¡#Më*].u°\ÁBûZ¸/h‚ú‘~xÇ0Å d±âRªq[f¥…B`¨$ÆšJÕ*5["s•V”hu„}‡ VZõ:¼@ü0Œ¼"î à`Ï_‘ÐI[“ø‰§¸hLÕ~: eÓèÛ»º¤BD…£$¿‚©FP³šÆl‰ÌEã=&ŒdJaóÔçO3ÀÈ-hh\`0Zqg£¥W`0Z<0 ¸2DORס­¦Q+Ž–Â.ɯ Fˆ5€ˆ¥…‘¿ÃS·G\ˆœ’€‘*bÉšê%&±Ýcr+¡ö³mˆ~¢‚þ ý}ëú©¥”»“R³²gem>"’€‘âÊåMeµTŒ©Úöî*@Ïg½™R(¢ù{üòœKœøÒüà'c`¤‡ÎºævGKÕ €a¤a^ž©2e÷ün„1Øã¢“cÄô®î¥§‚»˜©!™] `ðVÈzB…æ˜)–Ôj¨Òà÷c˜ÍA,@æ•q7 Bcª U-Fü%«Ù0ÒA¬‹¨ÈQÕ_Ü7 Bã*C^E&¡™Õléu…Ÿ3 Öb<0 Ø2@‡gIˆ¼ênAE)H“’s³muµ6ºŠ£Éˆ; Ü0@Ûž²+Zª•‚&‘ÓiÈJîQ[]EŠÑtÄ;ð·ð«b…Ϧä£)©JA’È(o.÷¯§ÈrV¡Ÿ£»Féû`Y]y“ÐBzÒ¼˜øè‘¬Tø Ö¬]#T6Ö÷÷¬ìAxJ´k6OÂ,=E!¨øT–0ËA R" b´>ª æÍÜÌï`N—¶ìQ~L%j¡*¥ …PÑI0–Dv Gõs^ÐhZk~ö®…~ÒÙJÀeožç*‡Þš$ RÈÖÚt™¤"­Zƒù8/sÄ’¬ ~L%ÏP c€ c'k× ©vJ´;Q܆*\Õ¡[Ô¢P#Y‚èšÛ…dֿɖ;Ê!+Z²µn]&½Õ fdŽX3@0Ô)P¦’© Ʀ­ZY¬äv5Ê“„+‹2@kž„›ðSc‡.“ÖG­ÁÖÚÍDÜsRv °0÷é´ d*yªRƒ:DEfíš=ëÒ%ŒÌæI„.ް/ìºL•EŽÚGÝ/²FÜ] ’z1Â@¬n»@¦‚§ª9€vZ…=ÚU½jùš=ÍòƒÌæ©0Ë¡ùÇ*›åLXöÅbÙG­Á,gŽÖй[éþ–bÚšçS Ft´ÆIpyS9Øt'{ü9ðfCÕ³n#.ZCl jÃw«ýÃ&Óø0)‡ Œ Ñ3ƒ‘š"$§/ä†Û†J”U{æ+ûzyƒÃÛ†ihÆ ¬¾5ÕÔÞÉÃßV—BTlEn¦!u Y}!kz‡!U'GÝfÕ`¦±V¤«i ©FQ[B˜!#íÉ¢mÙZŽ£Á¦!&µF‡ÞuPSB¶¡ý\kVÅ*@ s«{…÷´ºRùAê3@ÂúBõÒtr4]£À‘YXšú5…¨ÀˆjKàj’¡…dO®VõB¾— +'¬Áæ{Ój4õ¦Ì"ÙQ ô•æ–ìŠUÊ#4Û­+•+¤.$«/T—!M%Áªk–¦aM¡ˆjKH†¡­EgÑMáp“ðÕ¬2€µœ°›ïM«ÑÔ›2;î„#§–ôcõzt¥¼žº-;™ ]W*WPÍØJP_ÈLïF„ÔªU+„¥±V$áÐ8ÒÔ–¤¶©¶D"#…‘†D•¬å„vÊxo5=²i$oäž¿ú¢£w‡e'ë €¿ Š®T®4 ZC¨…”ÚRÕŸh•MO|œ0’R[Ê¡ú“­Ë­¡ ÔBHJm)oêOn´.ð À(4¶ ”ˆ¾ ¼Ðö3„fmçXÝS"ÁZx(«ì š1 ä"©DFéÂ’h zæ~ f¬ Ä(4x`² Ôº¨W×2·º™9lX±ìµ.ØXPJhg»@“ K8ÚÇ“GvJ- ù–i ÇÝZ 6ÔŠÆ‚ÚÙ.f ÇLie«1Wk+ 3¿”gcAù7ÔÎvÄ(¥•ÆpØXûý´¢± v¶ Dy­Ä(¥jã„òrÃacAíg,¨íi–pÌ”ó¯CÊØc8l,¨ýŒµ³] ÓN .o*ÓºÖó5®Ñ*1¬ú3€Û޵v 6ÔŠÆ‚ò¨ Ô4yÔå= n2°± Ü¢ º@Mf6”[t`0qeµEêï¶’Eó-! Å.„œ=ØRP Ö LnY¤7ƒ4ßRzÌiNâÄl)¨=K“É+Ûda)H5!¶‘ʦqÄ–‚Úqe¡µ¡_ÚÿI\Ù&KAô1~ÐŒ‘ #¦Æ[ j$p@'ö ¦4”m²²„F‚OÐfÜoQ¸`KAmdvhÀNCÙ&sKAd(Åì[ jij ZÉj–#âwrÊ6™X ’(-)Ƀz­kl)¨=Ï6èÜ.ÒK‘Û…i(Û4ßRW‘ÔQµd]ãˆ-µÒÒJö¨•-1RBZ'Ámüy.£–.3£%Àº@ŒB£ ß0ž…FA¿`0<0 –…ÏŒBƒeF¡Á3£Ð`€Qhð À(4X`<0 d€‹˜–¼Z޽O#Z+­æ`å'”d]‚¾k1ù4P~;¡àNÖH`(o*£ý›@·c/çÓˆ**U=iÒ$úó@ýdZ"fùív²ޏ2ÙtЖxᎽèëAí©i)ÈüôpÝ5*?¼Ôš¤e7cÑ'—ô‰#¥1Û ù·ò ›E¦ƒ-B˜«/k Ñ©.Àšãd­ˆ;€ñO|3.QíØKs¡>¥ÄžÓ›¥°ºÖ+j¶tOXŠãAô—‡»¾ ü[6‹´b%B]}%Dt@fºkŽ“µ" ® @vJ<ß|H•ij¿Fšû LKAXJa±þ©=Ó1–b‰3 „kEäÞÇ´Y¤+æêËRBýÈ´¶¥êd­ˆ5€0‘™ÝÆNdp[ -ÁÆ4QØ-”(ž°ÔòÌí²¶Ád‹,ÍßV%ÒêêË,¡d5s%ìd­ÝKF~*ïÎt†§:ö20ò©ÛR£ìÈħÕJ¡î Ë`ktÿV†Í"ÓׄÝÕ—QBDda.À¬¹t²VĚȖü)–C ¨Ž½4ÿYêÓš–‚f  s`õ­z=¦yÂ2ÀÚÍ¿•gØ,2lIX]}™%Dw@fuf/39'kEëÙQ¸­Ò¢‚O‚í`(XÈf€‚€gF¡Á2£Ðà€Qh° À(4x`,0 ž…ËŒBƒgF¡Á2£Ðà€Qh° À(4x`qeù©‘Wù¸¤á¦DQÀ”öm¢$ÎV£3¢)7Ô.ÔÕwFDÄdÏÿšÉõX±o‘j˜"›â©‰  ÕfÖ¯¶C\ÀÊY¿‘4foGµocµícÖ+ T ¡Ûé<²SÚ·CJ ·j.wDƒ7—Ñ´£™â‘tØ¢/ýMFT£ÖwÙKöê– _š‘†Š¸3€´ A†!âX¿‘ÿk˜½*û6†mk½’d$4c;V˜h¶³ ª¡À°‚føHi³fkHûØß4a¤íÑ^”™ÝÚ”áŸ,(’—¶~£þ¯V{;h¶}¬õJÐ,Vx†­+È\î.X …0€ijE3÷bš0r0€%»ÍäÃäe€†­ßT-ëCìí˜D¥^«À Û9b²d,!ˆ¬"‡»ƒÁ:°QÐúÞè-a8‘¼ аõ™Ìaog¾ʹIX½VÐŒíL,É|ó8pwP’úfd!¦­!m ã0adöݺ2Y‘—@¤² Ô˜õu` ³·3aMÈFsaõ†m©Æv<ߘ([ˆÎÀÝAÙÕ,Ä´5¤Ù;r˜0²ö]Ën¶„…`7X¨yàýû‚O‚›f€‚ušf€‚gF¡Ñ CptX°9jŒE!§CȦêùTjBžï ;è ±ÏÃJA9Gê3–¿rÿ;ÛYÆÖY)(ÿH]hÛ—=+{èË@PøÏ4Çàù{8¤z)­’D±,䀩äù§ˆ— ÐØ5X+e¥ ü£2þ{a£¦¢ó£š9c:“TѲP]ÚA•Ó’@ÛÐ :"ÐNX)(ÿhÒ9@×Ü.úp[=%ËMVÀ0‰§˜hùѲšvD|¿ †TŒy±RPþѼ] °M0 ò€R‰(AR’¢XŠ¢„yl#Ù)þH*e¥ ÖBúßTÊ9‚ˆ«–@#b däÁÀItƒ€É1µƒ4¨ Иšœ‚ÄZhÄŸX)¨uþ÷s»hÄ•%’Œ­ tƒ<þž ©Ð™ àÅÓÒ 2€×š:E9.V j9d© ¶˜N yÐb¥ ¼!Ë“à&3@´ƒX)(oÈR¨É À`˜`] F¡Ñ¶ß0QÀ3£Ðàï…ÏŒBƒeF¡Á3£Ð`€Qhð À(4X`<0 –…ÏŒB#® `u”͈ù•LRß ”V3Dê'£‰TÑÆŸ1¤â)ž žJU5ý¦EntH©‚ÀЏ2€•4»=Ñ­ú4fÉÈ…£t#S’QJ€æ -ëû{VöëH¢9G±Â½ßê^Üé³É°öÈZ´ôîWÑ»ªwl÷£³Ÿhfï$´àŽ¿C~hêù¦Ô*è#R2Êd­+ì•ZóšV”î«ÅªßŽf…¸3Þ¯´¾·0íöD´ê#Ð9 ¼åÀæŸ=°ÇæƒlCP9ôõ:zK_¬ ›%+JŽbÕ\øGÉkÚG-Azç« ËH²®0ŸhZï&šg4€zWe'¦º TM†:ÍqSب*½óU¨oO³ ¤fÑz7Ѽ(K [Ž*ô•y­VÍîë}ÉÁ(•] ÍnOD«> ›BŸ‡‚ .´h÷Y(Ìu¡E»Ï3£ÐhI mÆæ¨ ë²,6BÊŒ’«f:À¢]|ȵºó(_º¥°é-Ì'Z]¹èPœdb¹»Õ»ª7p–Þ,šVêÒœiu*ÛîÁvj­î»Ky‰}˜ÊѲæ³D\ÞTVw–´ìVŸhõæ"ÿTT;Ë]»–@:HQ0UeTEšþõbøÝ5Š÷"Jhº"Ò©2Ò°Ñ5§ ÕúïZËñ*vÉ1Þhû÷¦‹¦ô¦VDÇŸò¨{~7míY ´êY•‹ÂT€$L‡†n’µËzÉþ‹õüã3j<„+m»#Yˆ”MhVŸhå2»#a~GZ3@Ø9Q Þ5QxCŽž¡+B§‰žOdôŸ!FlBWÞTX9ø?ĬŒpÚù«§h°h5šjE¦¶ i›¡À`Ù®£ëÙ”‹ÂT€$Lsï§Š|¥a]6K&$ÈE¯ýE㉨wÈ"Iy²áÍŒi8Auß&yµi†ìÓ’ÜšÒu$Q†Ì¥éŠ †Rü7 {ð€Eð¢}H°–£yaQ@×`Ñ”^ µ"S[¤† Ga:TbôSçpÝ ‡ZŽ›¬ºIj³dTMzÔä3àÓŠEJR–0= É˜ÆrÄúGj¹vˆ±’(\:‰"­À­ãùÄAÓ·¦äX¥+â¿¢ðfÉÓžgœìšå„Qƒ©Á¢×èéjEæ?Æà/¤AË­¿T„ýåÁЮÀ\38ºl–Œ\;H®À–K d t{wÝ^ͯ¦æMÆ4–Ë«,¤<£vÁáˆ-Y¤%¸rˆ²'RWtBL½$„ÕP˜¾t)'pˆTWdzSƒE«ÑT+ÒµeüOL¨|½šÑTª1›ªj6fízöšuµ4òò=@½´ôéA=ˆ%UiZÓQ¡%6•aÔ\¨B=÷‘Wu`RŽÙT3yx쨮j¦ÑΧ[¹™êµT¾1tÏï&º4ý,hÍ žÈh  éÀhP›Ê0tôkdXæ¥z Ú€u’¡":³*ÕhMµ¦ÑÔlµËã këki]äE¨×"–>=€Ôå„JÓ3±Z T†A/@ÙHƒ»d?U=%áýpÔªf£­|&ÒØÔl¬µ«Gøai¬uµ(r1ÔkÈ®ÒS?Ü3€„Jy*M»u`¼ðlê1R§@SÁJC*)^ »Sƒ€Ò¸ÕlTTg5U¢i=XëjEäB¨×"™>qÈ¿V¨$(Òž•¦'f€jC7š ”l¨Ð”–”HIÁT ÞƒŸ˜Î,Çlª™Æ¡f#k'˜æúÔ4a¯¥u‘‹ ^‹@fúÄA—Ð2ZwÝ  ºQ[UhH”G¢9‹zŒ²æ&õ³³©–ºlj6Zí^µ:š5MØki]äE`02A.f#+äB`0²ÏŒB£%e€†Õ*µ8â6£ZKǪÉ#¡©âDÔ52x¢(Ñ—1ƒ¾¹/DÉG«+Š"Y»µ…¦òRžÑª3@#;ÐÕ>¹âCÛ ±jòLUœ(ºFV;95‚\Á^™ÖfùÕ„U¯IMcUª©bd¾–œ#2€i0Çsz×R5[¢;ÿRf¹ËÒfÇœ9A9,Þ8tÌ\QÄ™×*û™—Tò1ë2Ó˜Š@QTŒbM6¹˜,s܎ƪ ãDuþ¥ºKq{ïªÀqTljéH¨†n$L‹7Qt´\QD÷+;ýh¡UÉÇZ—–ÆTŠ¢bäx-ùD.dÓ^ˆÛ»–u@­íüKa€Þ»" LK§ÊÐD¸Å‡®‘;W˜"PhJ>z]¶4E 0#‡òR>‘—Àd‡w-«Y„ÚοªÀ彫× `ÓÒÑ4yÔrª8aºFî\aŠ@aK SÉÇd€èŠ@a*Fnå¥"/2@]Þµ¢0€ÕքìZÞ»¢´ÙÔÒÑ5ê*ªA¦*N]#3WE Í",ÙTò1À­EÅÈ|-Þe–ÈÑ Ý»V0Kð‡Yîò#BÓÒ15y&Tƒ UœHºFF®(Š@2—*'˜Ë}j*ET1Ò^KΑ Ù J#"ò2002A^dfF&ÈÅ À`d…\Èõ¢Á›ü!bÃÖ¬]hàTÛpNÍ÷fêIÈŒ´½†µê Pa³O›-• Òû“šï5Ìm˜ˆ  ^ÃØGXÞ}„I/8(“vQ¨½–*:Ò\v}v–²ðf5:D]CJjƒC‡*)°°¼û£Q¸ô6(}#ìc€ºì,eâ5ÌÔ52»æ¥ï5Œ}„åÝGÜC¡aj×W„0@]v–²ò¦é™]k‚×0ö–wa4`›T"Fô `8Ôkg)s¯a¤Xav­ ^ÃØGXÞ}„É?Eɪ)­ªô½G†i=S—¥L¼†IH]#³kMðÆ>Âòî# y©ƒr»07•I¡·„4b2ôg€zí,yYx ól†‰4ù¾ ^ÃØGXóøn¬ö½KLÓkûkrÎÅûk˜rˆV= f0AKê5 †•ÍÞŽ5Æ‘˜‘Cð  »•ÅÞŽÃÛ8#?ÈÅ÷^.}„i–sÌÍx¹Bnf€üùó ‡Hš¹‡Ç#F® Ÿ>˜Ú¹˜rë#Œ—@m\È9ôF°[ê”fhM <Šþˆ‘KäbÈ¡0‚i©S³·£Å¨ÊHfbF‘€Áȹ˜Œ¬ €ÁÈ <0 –”V«LCUMß°jPË¡Ug€<øóªMß°jP+"2€i0Ç˽0Ï0}Ãçb­ˆ\̃9¹÷æ¦oX3¢‘ À´’a¦éf€VD^f€–ófš¾á%P+"/2@Ëù“P­ÿ±jPË!G3@Ëù#¨ÖÿX5¨å ñ J# ò2002A^dfF&ÈÅ À`d…\È FVà€QhäB`0²ÏŒBƒeF¡Á3£Ð`€Qhð À(4X`<0 –…ÏŒB#¶ Ð!¼4ƒ‡†G†Éy‚>¢w —7•'Mš4û´Ù}ëú¬ŸÂXÁ¦Œ(ˆ;ôoè§Ï¯<ÿ¨$›V)Ÿ>àšrÌr¶Î ÀH±dë®`ƒòæ2…¥'wÓÆuü);ôŸ*$ q3}vˆ&‰¯Š•5]Œ‰l–…¯ù\2»cµb¼[9²v2 !?Š—cZ¥¿ÏhbÍøçL]Š1Œð€&zVöˆ>¹k?UH 8õªÎâÕïÐkºSí i5Z@³b¤6O+'° çƒìJÍ ÏgBjbòïå»]KP@ ½;†1È™c1Âã[,­(vªªˆÎÂôHe1¦&ˆâbLµË‚ÁX¥i+hF\ÔJµrÔVÉñ~P¡SȈÚÑa`‹· 2B¬@X=P–@øw“lŠÁb€À2Åwöb¢×~VÔt1¦–&WÍî¸@+Çdô"Lnö†e• ÷@x“®P1@•)‘aZiFx$•“¥Ní§Z~]K 2@KUk¦xÜ.Æ `éŽaÅÈlž,Ç\Q@ÔÛp &H0š‰¸»@ Œ‹ Ú ÌЮîÅO!úC¦gáÁO’ é¿×~J¨Û ã‚iÁ¥ Á5]Œ9ÀìŽÕŠ‘Ö<µœ !¸b>ˆh £ƒ$02ëÕ Þ`m'ðIpÝ`h'°.PÝ`h'ð À(4âÊ]_µÐ¨ÙBMeÄG¬ ºë«Ö¢ªF1Z±d‡ßSÛ‡v!i‘Ò˜ 9Q<…Yµ†4_Ö\a®ÄÌfL8 Qb´ bÍÏ?šzzx$N»(e¸BN˜§°0­¡Éª±ÿ_VWbÖf˜È´ó8FÛ – à`]ÛǦlãPÈ õ¢5¤æuûÿ2ýh˜Í0i BŒ¶A¬ †ë+E½Ç<"µ*äÔô¦+ã´s_‡ÿ/zAîãaF{ Þ÷ᮯ4õ“˜¬ 95=……i U9PrúÿÒÀ¡Ä PÄ=s}¥©÷XµÄL…œšžÂ´†´]&‡ÿ/Ó—^˜^3@#] ÖÚ*e´rtÌ Àh>r¤ Ä Àh>r40ÍGövè‡F&ÈÞ.3#C$oÈ3,áXczVöÐþ#i’¢zUÞT–{ xp”ÿ1®g3ïÃ`ÄDòvÌÏÀ͘àvÏ'îÃÄâlòÄ)}bïUìFÙÍû0ñ¼] Óˆ;&0 eèA2¦n\(^Ç äíÅg$ õa1ªò¥]/ˆÁˆ‡äíÕ½Q–@ÕÆv0€è¥-MÇÁˆTì™–pÌ‚é+b «Š@ˆÝ5*E^MÇÁˆéY!–X†Å\#)äú$xú´é<Ø3REŽt4Ðg»i8Ý`0$r=0i#® 0¶{ Ëtqˆ»¹ìPg{T¯D 7q„Ži.ƒQ¸3€Fˆ‹:ÖG13’B\@e‡EªGµì™:?šâ2ºíp1‘ä à°¨#Õ´dêü˜ŠCž §Û !1@sâ«YÔQíG¸í™:?¦Þ„çsKÜ®3éͺ u­ï´dêüX€½ª0AZ2@Ô´dêü˜ŠCyC#&š=Ô´äÙt~4Å!¡…Ê»@Œ$€`tçh~uŒTñ À'ÁŒ‚‚f€<ê1MQÁ˜EĤÃ'uÍéÂ<ÀZ÷ ƒÁ`0 ƒÁ`0 +þ?³ºýÿí¦b IEND®B`‚swig-4.0.1/Doc/Manual/Modula3.html0000644000175000017500000006223413527063513016473 0ustar williamwilliam SWIG and Modula-3

    31 SWIG and Modula-3

    This chapter describes SWIG's support for Modula-3. You should be familiar with the basics of SWIG, especially typemaps.

    31.1 Overview

    Modula-3 is a compiled language in the tradition of Niklaus Wirth's Modula 2, which is in turn a successor to Pascal.

    SWIG's Modula-3 support is currently very basic and highly experimental! Many features are still not designed satisfyingly and I need more discussion about the odds and ends. Don't rely on any feature, incompatible changes are likely in the future! However, the Modula-3 generator was already useful for interfacing to the libraries:

    1. PLPlot
    2. FFTW

    31.1.1 Motivation

    Although it is possible to write Modula-3 code that performs as well as C/C++ most existing libraries are not written in Modula-3 but in C or C++, and even libraries in other languages may provide C header files.

    Fortunately Modula-3 can call C functions, but you have to write Modula-3 interfaces to them, and to make things comfortable you will also need wrappers that convert between high-level features of Modula-3 (garbage collecting, exceptions) and the explicit tracking of allocated memory and exception codes used by C APIs.

    SWIG converts C headers to Modula-3 interfaces for you, and using typemaps you can pass TEXTs or open arrays, and convert error return codes into exceptions.

    If the library API is ill designed writing appropriate typemaps can still be time-consuming. E.g. C programmers are very creative to work-around missing data types like (real) enumerations and sets. You should turn such work-arounds back to the Modula-3 way otherwise you lose static safety and consistency.

    Without SWIG you would probably never consider trying to call C++ libraries from Modula-3, but with SWIG this is becomes feasible. SWIG can generate C wrappers to C++ functions and object methods that may throw exceptions, and then wrap these C wrappers for Modula-3. To make it complete you can then hide the C interface with Modula-3 classes and exceptions.

    SWIG allows you to call C and C++ libraries from Modula-3 (even with call back functions), but it doesn't allow you to easily integrate a Modula-3 module into a C/C++ project.

    31.2 Conception

    31.2.1 Interfaces to C libraries

    Modula-3 has integrated support for calling C functions. This is also extensively used by the standard Modula-3 libraries to call OS functions. The Modula-3 part of SWIG and the corresponding SWIG library modula3.swg contain code that uses these features. Because of the built-in support there is no need for calling the SWIG kernel to generate wrappers written in C. All conversion and argument checking can be done in Modula-3 and the interfacing is quite efficient. All you have to do is to write pieces of Modula-3 code that SWIG puts together.

    C library support integrated in Modula-3
    Pragma <* EXTERNAL *> Precedes a declaration of a PROCEDURE that is implemented in an external library instead of a Modula-3 module.
    Pragma <* CALLBACK *> Precedes a declaration of a PROCEDURE that should be called by external library code.
    Module Ctypes Contains Modula-3 types that match some basic C types.
    Module M3toC Contains routines that convert between Modula-3's TEXT type and C's char * type.

    In each run of SWIG the Modula-3 part generates several files:

    Module name scheme Identifier for %insert Description
    ModuleRaw.i3 m3rawintf Declaration of types that are equivalent to those of the C library, EXTERNAL procedures as interface to the C library functions
    ModuleRaw.m3 m3rawimpl Almost empty.
    Module.i3 m3wrapintf Declaration of comfortable wrappers to the C library functions.
    Module.m3 m3wrapimpl Implementation of the wrappers that convert between Modula-3 and C types, check for validity of values, hand-over resource management to the garbage collector using WeakRefs and raises exceptions.
    m3makefile m3makefile Add the modules above to the Modula-3 project and specify the name of the Modula-3 wrapper library to be generated. Today I'm not sure if it is a good idea to create a m3makefile in each run, because SWIG must be started for each Modula-3 module it creates. Thus the m3makefile is overwritten each time. :-(

    Here's a scheme of how the function calls to Modula-3 wrappers are redirected to C library functions:

    Modula-3 wrapper
    Module.i3
    generated by Modula-3 part of SWIG
    |
    v
    Modula-3 interface to C
    ModuleRaw.i3
    generated by Modula-3 part of SWIG
    --> C library

    I have still no good conception how one can split C library interfaces into type oriented interfaces. A Module in Modula-3 represents an Abstract DataType (or call it a static classes, i.e. a class without virtual methods). E.g. if you have a principal type, say Database, it is good Modula-3 style to set up one Module with the name Database where the database type is declared with the name T and where all functions are declared that operates on it.

    The normal operation of SWIG is to generate a fixed set of files per call. To generate multiple modules one has to write one SWIG interface (different SWIG interfaces can share common data) per module. Identifiers belonging to a different module may ignored (%ignore) and the principal type must be renamed (%typemap).

    31.2.2 Interfaces to C++ libraries

    Interfaces to C++ files are much more complicated and there are some more design decisions that are not made, yet. Modula-3 has no support for C++ functions but C++ compilers should support generating C++ functions with a C interface.

    Here's a scheme of how the function calls to Modula-3 wrappers are redirected to C library functions:

    Modula-3 wrapper
    Module.i3
    generated by Modula-3 part of SWIG
    C++ library
    |
    v
    ^
    |
    Modula-3 interface to C
    ModuleRaw.i3
    generated by Modula-3 part of SWIG
    --> C interface to C++
    module_wrap.cxx
    generated by the SWIG core

    Wrapping C++ libraries arises additional problems:

    • Is it sensible to wrap C++ classes with Modula-3 classes?
    • How to find the wrapping Modula-3 class for a class pointer that is returned by a C++ routine?
    • How to deal with multiple inheritance which was neglected for Modula-3 for good reasons?
    • Is it possible to sub-class C++ classes with Modula-3 code? This issue is addressed by directors, a feature that was experimentally added to some Language modules like Java and Python.
    • How to manage storage with the garbage collector of Modula-3? Support for %newobject and %typemap(newfree) isn't implemented, yet. What's about resources that are managed by the garbage collector but shall be passed back to the storage management of the C++ library? This is a general issue which is not solved in a satisfying fashion as far as I know.
    • How to turn C++ exceptions into Modula-3 exceptions? There's also no support for %exception, yet.

    Be warned: There is no C++ library I wrote a SWIG interface for, so I'm not sure if this is possible or sensible, yet.

    31.3 Preliminaries

    31.3.1 Compilers

    There are different Modula-3 compilers around: cm3, pm3, ezm3, Klagenfurth Modula-3, Cambridge Modula-3. SWIG itself does not contain compiler specific code but the modula3.swg library file may do so. For testing examples I use Critical Mass cm3.

    31.3.2 Additional Commandline Options

    There are some experimental command line options that prevent SWIG from generating interface files. Instead files are emitted that may assist you when writing SWIG interface files.

    Modula-3 specific options Description
    -generateconst <file> Disable generation of interfaces and wrappers. Instead write code for computing numeric values of constants to the specified file.
    C code may contain several constant definitions written as preprocessor macros. Other language modules of SWIG use compute-once-use-readonly variables or functions to wrap such definitions. All of them can invoke C code dynamically for computing the macro values. But if one wants to turn them into Modula-3 integer constants, enumerations or set types, the values of these expressions has to be known statically. Although definitions like (1 << FLAG_MAXIMIZEWINDOW) must be considered as good C style they are hard to convert to Modula-3 since the value computation can use every feature of C.
    Thus I implemented these switch to extract all constant definitions and write a C program that output the values of them. It works for numeric constants only and treats all of them as double. Future versions may generate a C++ program that can detect the type of the macros by overloaded output functions. Then strings can also be processed.
    -generaterename <file> Disable generation of interfaces and wrappers. Instead generate suggestions for %rename.
    C libraries use a naming style that is neither homogeneous nor similar to that of Modula-3. C function names often contain a prefix denoting the library and some name components separated by underscores or capitalization changes. To get library interfaces that are really Modula-3 like you should rename the function names with the %rename directive. This switch outputs a list of such directives with a name suggestion generated by a simple heuristic.
    -generatetypemap <file> Disable generation of interfaces and wrappers. Instead generate templates for some basic typemaps.

    31.4 Modula-3 typemaps

    31.4.1 Inputs and outputs

    Each C procedure has a bunch of inputs and outputs. Inputs are passed as function arguments, outputs are updated referential arguments and the function value.

    Each C type can have several typemaps that apply only in case if a type is used for an input argument, for an output argument, or for a return value. A further typemap may specify the direction that is used for certain parameters. I have chosen this separation in order to be able to write general typemaps for the modula3.swg typemap library. In the library code the final usage of the type is not known. Using separate typemaps for each possible use allows appropriate definitions for each case. If these pre-definitions are fine then the direction of the function parameter is the only hint the user must give.

    The typemaps specific to Modula-3 have a common name scheme: A typemap name starts with "m3", followed by "raw" or "wrap" depending on whether it controls the generation of the ModuleRaw.i3 or the Module.i3, respectively. It follows an "in" for typemaps applied to input argument, "out" for output arguments, "arg" for all kind of arguments, "ret" for returned values.

    The main task of SWIG is to build wrapper function, i.e. functions that convert values between C and Modula-3 and call the corresponding C function. Modula-3 wrapper functions generated by SWIG consist of the following parts:

    • Generate PROCEDURE signature.
    • Declare local variables.
    • Convert input values from Modula-3 to C.
    • Check for input value integrity.
    • Call the C function.
    • Check returned values, e.g. error codes.
    • Convert and write back values into Modula-3 records.
    • Free temporary storage.
    • Return values.
    Typemap Example Description
    m3wrapargvar $1: INTEGER := $1_name; Declaration of some variables needed for temporary results.
    m3wrapargconst $1 = "$1_name"; Declaration of some constant, maybe for debug purposes.
    m3wrapargraw ORD($1_name) The expression that should be passed as argument to the raw Modula-3 interface function.
    m3wrapargdir out Referential arguments can be used for input, output, update. ???
    m3wrapinmode READONLY One of Modula-3 parameter modes VALUE (or empty), VAR, READONLY
    m3wrapinname New name of the input argument.
    m3wrapintype Modula-3 type of the input argument.
    m3wrapindefault Default value of the input argument
    m3wrapinconv $1 := M3toC.SharedTtoS($1_name); Statement for converting the Modula-3 input value to C compliant value.
    m3wrapincheck IF Text.Length($1_name) > 10 THEN RAISE E("str too long"); END; Check the integrity of the input value.
    m3wrapoutname Name of the RECORD field to be used for returning multiple values. This applies to referential output arguments that shall be turned into return values.
    m3wrapouttype Type of the value that is returned instead of a referential output argument.
    m3wrapoutconv
    m3wrapoutcheck
    m3wrapretraw
    m3wrapretname
    m3wraprettype
    m3wrapretvar
    m3wrapretconv
    m3wrapretcheck
    m3wrapfreearg M3toC.FreeSharedS(str, arg1); Free resources that were temporarily used in the wrapper. Since this step should never be skipped, SWIG will put it in the FINALLY branch of a TRY .. FINALLY structure.

    31.4.2 Subranges, Enumerations, Sets

    Subranges, enumerations, and sets are machine oriented types that make Modula very strong and expressive compared with the type systems of many other languages.

    • Subranges are used for statically restricted choices of integers.
    • Enumerations are used for named choices.
    • Sets are commonly used for flag (option) sets.

    Using them extensively makes Modula code very safe and readable.

    C supports enumerations, too, but they are not as safe as the ones of Modula. Thus they are abused for many things: For named choices, for integer constant definitions, for sets. To make it complete every way of defining a value in C (#define, const int, enum) is somewhere used for defining something that must be handled completely different in Modula-3 (INTEGER, enumeration, SET).

    I played around with several %features and %pragmas that split the task up into converting the C bit patterns (integer or bit set) into Modula-3 bit patterns (integer or bit set) and change the type as requested. See the corresponding example in the Examples/modula3/enum/example.i file. This is quite messy and not satisfying. So the best what you can currently do is to rewrite constant definitions manually. Though this is a tedious work that I'd like to automate.

    31.4.3 Objects

    Declarations of C++ classes are mapped to OBJECT types while it is tried to retain the access hierarchy "public - protected - private" using partial revelation. Though the example in Examples/modula3/class/example.i is not really useful, yet.

    31.4.4 Imports

    Pieces of Modula-3 code provided by typemaps may contain identifiers from foreign modules. If the typemap m3wrapinconv for blah * contains code using the function M3toC.SharedTtoS you may declare %typemap("m3wrapinconv:import") blah * %{M3toC%}. Then the module M3toC is imported if the m3wrapinconv typemap for blah * is used at least once. Use %typemap("m3wrapinconv:import") blah * %{MyConversions AS M3toC%} if you need module renaming. Unqualified import is not supported.

    It is cumbersome to add this typemap to each piece of Modula-3 code. It is especially useful when writing general typemaps for the modula3.swg typemap library. For a monolithic module you might be better off if you add the imports directly:

    %insert(m3rawintf) %{
    IMPORT M3toC;
    %}
    

    31.4.5 Exceptions

    Modula-3 provides another possibility of an output of a function: exceptions.

    Any piece of Modula-3 code that SWIG inserts due to a typemap can raise an exception. This way you can also convert an error code from a C function into a Modula-3 exception.

    The RAISES clause is controlled by typemaps with the throws extension. If the typemap m3wrapinconv for blah * contains code that may raise the exceptions OSError.E you should declare %typemap("m3wrapinconv:throws") blah * %{OSError.E%}.

    31.4.6 Example

    The generation of wrappers in Modula-3 needs very fine control to take advantage of the language features. Here is an example of a generated wrapper where almost everything is generated by a typemap:

             (* %relabel  m3wrapinmode m3wrapinname m3wrapintype  m3wrapindefault *)
      PROCEDURE Name     (READONLY       str       :    TEXT    :=      ""       )
                  (* m3wrapoutcheck:throws *)
         : NameResult RAISES {E} =
        CONST
          arg1name = "str";                  (* m3wrapargconst *)
        VAR
          arg0   : C.char_star;              (* m3wrapretvar *)
          arg1   : C.char_star;              (* m3wrapargvar *)
          arg2   : C.int;
          result : RECORD
               (*m3wrapretname  m3wraprettype*)
                     unixPath : TEXT;
               (*m3wrapoutname  m3wrapouttype*)
                     checksum : CARDINAL;
                   END;
        BEGIN
          TRY
            arg1 := M3toC.SharedTtoS(str);   (* m3wrapinconv *)
            IF Text.Length(arg1) > 10 THEN   (* m3wrapincheck *)
              RAISE E("str too long");
            END;
     (* m3wrapretraw           m3wrapargraw *)
            arg0 := MessyToUnix  (arg1,   arg2);
            result.unixPath := M3toC.CopyStoT(arg0);  (* m3wrapretconv *)
            result.checksum := arg2;         (* m3wrapoutconv *)
            IF result.checksum = 0 THEN      (* m3wrapoutcheck *)
              RAISE E("invalid checksum");
            END;
          FINALLY
            M3toC.FreeSharedS(str, arg1);     (* m3wrapfreearg *)
          END;
        END Name;
    

    31.5 More hints to the generator

    31.5.1 Features

    Feature Example Description
    multiretval %m3multiretval get_box; or %feature("modula3:multiretval") get_box; Let the denoted function return a RECORD rather than a plain value. This RECORD contains all arguments with "out" direction including the return value of the C function (if there is one). If more than one argument is "out" then the function must have the multiretval feature activated, but it is explicitly requested from the user to prevent mistakes.
    constnumeric %constnumeric(12) twelve; or %feature("constnumeric", "12") twelve; This feature can be used to tell Modula-3's back-end of SWIG the value of an identifier. This is necessary in the cases where it was defined by a non-trivial C expression. This feature is used by the -generateconst option. In future it may be generalized to other kind of values such as strings.

    31.5.2 Pragmas

    Pragma Example Description
    unsafe %pragma(modula3) unsafe="true"; Mark the raw interface modules as UNSAFE. This will be necessary in many cases.
    library %pragma(modula3) library="m3fftw"; Specifies the library name for the wrapper library to be created. It should be distinct from the name of the library to be wrapped.

    31.6 Remarks

    • The Modula-3 part of SWIG doesn't try to generate nicely formatted code. If you need to read the generated code, use m3pp to postprocess the Modula files.
    swig-4.0.1/Doc/Manual/Makefile0000644000175000017500000001314513527063513015736 0ustar williamwilliam# Makefile for generating the SWIG documentation # # Note that the htmldoc package needs to be installed. wkhtmltopdf patched with qt is also required # and can be installed from http://wkhtmltopdf.org/downloads.html. # # The .html files are first processed and updated with chapter numbering and anchor names # are added to the HTML headings using the python scripts. The htmldoc program is then # used to generate the single page HTML version of the documentation. # wkhtmltopdf is used to generate the pdf document from the single page html file. # HTML TIDY (package also known as tidy) is also required and is used as an aid to HTML # validation. # # Additional html validation can be done using the validate target. # Additional link checking can be done using the linkchecker1 and linkchecker2 target. # # Note the # and " are escaped HTMLDOC_OPTIONS = "--book --toclevels 4 --no-numbered --toctitle \"Table of Contents\" --title --titleimage swig16.png --linkcolor \#0000ff --linkstyle underline --size Universal --left 0.50in --right 0.50in --top 0.50in --bottom 0.50in --header .t. --footer h.1 --nup 1 --tocheader .t. --tocfooter ..i --portrait --color --no-pscommands --no-xrxcomments --compression=1 --jpeg=0 --fontsize 10.0 --fontspacing 1.2 --headingfont Helvetica --bodyfont Times --headfootsize 10.0 --headfootfont Helvetica --charset iso-8859-1 --links --no-embedfonts --pagemode outline --pagelayout single --firstpage c1 --pageeffect none --pageduration 10 --effectduration 1.0 --no-encryption --permissions all --owner-password \"\" --user-password \"\" --browserwidth 680" .PHONY: maketoc check generate all maintainer-clean validate test all: maketoc check generate maketoc: python maketoc.py # Use this to regenerate CCache.html should this ever be needed CCache.html: ../../CCache/ccache.yo yodl2html -o CCache.html ../../CCache/ccache.yo # Tabs in the html files will stop the build as wkhtmltopdf does not expand them correctly - replace them with the appropriate number of tabs # Use htmltidy to warn about some HTML errors. Note that it is not used to clean/tidy the HTML, # it is just used as a primitive HTML checker. # CCache.html is generated by yodl2html and has a few insignificant problems, so we don't put it through tidy check: all="index.html Sections.html `sed '/^#/d' chapters | grep -v CCache.html`" && for a in $$all; do echo "Check for tabs $$a" && if grep -P '\t' $$a; then echo "Please delete the tabs from the lines above" && exit 1; fi; done && for a in $$all; do echo "HTML tidy check $$a" && tidy -errors --gnu-emacs yes -quiet $$a; done; # Note wkhtmltopdf limitations for generating pdf docs: # 1)

    Text

    style links don't work and need changing to #

    Text

    # 2) Tabs in
     elements should be expanded to 8 spaces by default, but
    #     are expanded to just one space and css tab-size is not working.
    #  3) 
       elements do not always select a fixed-width font - try installing the
    #     Courier font to fix - these have been added to style.css.
    generate: SWIGDocumentation.html
    	wkhtmltopdf --version | grep "with patched qt" || (echo "wkhtmltopdf is not the patched qt version and so cannot be used - download it from http://wkhtmltopdf.org/downloads.html" && false)
    	wkhtmltopdf --margin-top 20mm --margin-bottom 20mm --margin-left 10mm --margin-right 10mm --header-font-size 6 --footer-font-size 6 --header-spacing 6 --footer-spacing 6 --header-center '[doctitle]' --footer-left '[subsection]' --footer-right '[page]' SWIGDocumentation.html SWIGDocumentation.pdf
    
    SWIGDocumentation.html: swightml.book
    	htmldoc --batch swightml.book || true
    	python fixstyle.py SWIGDocumentation.html
    
    swightml.book: chapters Sections.html
    	echo "#HTMLDOC 1.8.24" > swightml.book
    	echo -t html -f SWIGDocumentation.html $(HTMLDOC_OPTIONS) >> swightml.book
    	echo "Sections.html" >> swightml.book
    	cat chapters >> swightml.book
    
    maintainer-clean: clean-baks
    	rm -f swightml.book
    	rm -f SWIGDocumentation.html
    	rm -f SWIGDocumentation.pdf
    	rm -rf linkchecker-tmp
    
    clean-baks:
    	rm -f *.bak
    
    test:
    	grep "href=\".*\.html\"" index.html
    	grep "href=\".*\.html\"" Sections.html
    	all=`sed '/^#/d' chapters`; for a in $$all; do grep -l "href=\".*\.html\"" $$a; done;
    
    # Validating using the WDG offline validator - http://www.htmlhelp.com/tools/validator/offline/
    validate:
    	all=`sed '/^#/d' chapters`; for a in $$all; do validate --emacs $$a; done;
    
    # Link checking using linkchecker of the index.html only file (including anchors)
    linkchecker1:
    	@echo -----------------------------------------------------------------------
    	@echo Note linkchecker versions prior to 6.1 do not work properly wrt anchors
    	@echo -----------------------------------------------------------------------
    	linkchecker --config=./linkchecker.config --anchors index.html
    
    # Check for links which don't work including those generated from the individual .html files into SWIGDocumentation.html
    linkchecker2:
    	rm -rf linkchecker-tmp
    	mkdir linkchecker-tmp
    	cp SWIGDocumentation.html linkchecker-tmp
    	cp *.png linkchecker-tmp
    	(cd linkchecker-tmp && linkchecker --config=../linkchecker.config -F text --no-warnings SWIGDocumentation.html)
    
    # Simple check for relative links (there shouldn't be any), they don't translate properly creating the .pdf doc
    # with wkhtmltopdf. For example, href="SWIG.html" needs to be href="SWIG.html#SWIG"
    linkchecker3:
    	@echo "The following list should just contain SWIGDocumentation.html and SWIGDocumentation.pdf,"
    	@echo "as all links should have an anchor (with a #) or be a full url beginning http."
    	grep 'href="' *.html | sed -e 's/.*href="\(.*\)">.*$$/\1/' | grep -v "#" | grep -v "^http" | grep -v "^style.css"
    swig-4.0.1/Doc/Manual/Python.html0000644000175000017500000062372413527234053016456 0ustar  williamwilliam
    
    
    SWIG and Python
    
    
    
    
    
    

    32 SWIG and Python

    Caution: This chapter is under repair!

    This chapter describes SWIG's support of Python. SWIG is compatible with all recent Python versions (Python 2.7 and Python >= 3.2). If you still need to generate bindings which work with older versions of Python, you'll have to use SWIG 3.0.x.

    This chapter covers most SWIG features, but certain low-level details are covered in less depth than in earlier chapters. At the very least, make sure you read the "SWIG Basics" chapter.

    32.1 Overview

    To build Python extension modules, SWIG uses a layered approach in which parts of the extension module are defined in C and other parts are defined in Python. The C layer contains low-level wrappers whereas Python code is used to define high-level features.

    This layered approach recognizes the fact that certain aspects of extension building are better accomplished in each language (instead of trying to do everything in C or C++). Furthermore, by generating code in both languages, you get a lot more flexibility since you can enhance the extension module with support code in either language.

    In describing the Python interface, this chapter starts by covering the basics of configuration, compiling, and installing Python modules. Next, the Python interface to common C and C++ programming features is described. Advanced customization features such as typemaps are then described followed by a discussion of low-level implementation details.

    32.2 Preliminaries

    32.2.1 Running SWIG

    Suppose that you defined a SWIG module such as the following:

    /* File: example.i */
    %module example
    
    %{
    #define SWIG_FILE_WITH_INIT
    #include "example.h"
    %}
    
    int fact(int n);
    

    The #define SWIG_FILE_WITH_INIT line inserts a macro that specifies that the resulting C file should be built as a Python extension, inserting the module init code. This .i file wraps the following simple C file:

    /* File: example.c */
    
    #include "example.h"
    
    int fact(int n) {
      if (n < 0) { /* This should probably return an error, but this is simpler */
        return 0;
      }
      if (n == 0) {
        return 1;
      } else {
        /* testing for overflow would be a good idea here */
        return n * fact(n-1);
      }
    }
    
    

    With the header file:

    /* File: example.h */
    
    int fact(int n);
    

    To build a Python module, run SWIG using the -python option:

    $ swig -python example.i
    

    If building a C++ extension, add the -c++ option:

    $ swig -c++ -python example.i
    

    This creates two different files; a C/C++ source file example_wrap.c or example_wrap.cxx and a Python source file example.py. The generated C source file contains the low-level wrappers that need to be compiled and linked with the rest of your C/C++ application to create an extension module. The Python source file contains high-level support code. This is the file that you will import to use the module.

    The name of the wrapper file is derived from the name of the input file. For example, if the input file is example.i, the name of the wrapper file is example_wrap.c. To change this, you can use the -o option. The name of the Python file is derived from the module name specified with %module. If the module name is example, then a file example.py is created.

    The following sections have further practical examples and details on how you might go about compiling and using the generated files.

    32.2.2 Using distutils

    The preferred approach to building an extension module for Python is to compile it with distutils, which comes with all recent versions of Python (Distutils Docs).

    Distutils takes care of making sure that your extension is built with all the correct flags, headers, etc. for the version of Python it is run with. Distutils will compile your extension into a shared object file or DLL (.so on Linux, .pyd on Windows, etc). In addition, distutils can handle installing your package into site-packages, if that is desired. A configuration file (conventionally called: setup.py) describes the extension (and related Python modules). The distutils will then generate all the right compiler directives to build it for you.

    Here is a sample setup.py file for the above example:

    #!/usr/bin/env python
    
    """
    setup.py file for SWIG example
    """
    
    from distutils.core import setup, Extension
    
    
    example_module = Extension('_example',
                               sources=['example_wrap.c', 'example.c'],
                               )
    
    setup (name = 'example',
           version = '0.1',
           author      = "SWIG Docs",
           description = """Simple swig example from docs""",
           ext_modules = [example_module],
           py_modules = ["example"],
           )
    

    In this example, the line: example_module = Extension(....) creates an Extension module object, defining the name as _example, and using the source code files: example_wrap.c, generated by swig, and example.c, your original c source. The swig (and other Python extension modules) tradition is for the compiled extension to have the name of the Python portion, prefixed by an underscore. If the name of your Python module is "example.py", then the name of the corresponding object file will be"_example.so"

    The setup call then sets up distutils to build your package, defining some meta data, and passing in your extension module object. Once this is saved as setup.py, you can build your extension with these commands:

    $ swig -python example.i
    $ python setup.py build_ext --inplace
    

    And a .so, or .pyd or... will be created for you. It will build a version that matches the Python that you run the command with. Taking apart the command line:

    • python -- the version of Python you want to build for
    • setup.py -- the name of your setup script (it can be called anything, but setup.py is the tradition)
    • build_ext -- telling distutils to build extensions
    • --inplace -- this tells distutils to put the extension lib in the current dir. Otherwise, it will put it inside a build hierarchy, and you'd have to move it to use it.

    The distutils have many other features, consult the Python distutils docs for details.

    This same approach works on all platforms if the appropriate compiler is installed. (it can even build extensions to the standard Windows Python using MingGW)

    32.2.3 Hand compiling a dynamic module

    While the preferred approach to building an extension module is to use the distutils, some people like to integrate building extensions with a larger build system, and thus may wish to compile their modules without the distutils. To do this, you need to compile your program using commands like this (shown for Linux):

    $ swig -python example.i
    $ gcc -O2 -fPIC -c example.c
    $ gcc -O2 -fPIC -c example_wrap.c -I/usr/local/include/python2.5
    $ gcc -shared example.o example_wrap.o -o _example.so
    

    The exact commands for doing this vary from platform to platform. However, SWIG tries to guess the right options when it is installed. Therefore, you may want to start with one of the examples in the SWIG/Examples/python directory. If that doesn't work, you will need to read the man-pages for your compiler and linker to get the right set of options. You might also check the SWIG Wiki for additional information.

    When linking the module, the name of the output file has to match the name of the module prefixed by an underscore. If the name of your module is "example", then the name of the corresponding object file should be "_example.so" or "_examplemodule.so". The name of the module is specified using the %module directive or the -module command line option.

    Compatibility Note: In SWIG-1.3.13 and earlier releases, module names did not include the leading underscore. This is because modules were normally created as C-only extensions without the extra Python support file (instead, creating Python code was supported as an optional feature). This has been changed in SWIG-1.3.14 and is consistent with other Python extension modules. For example, the socket module actually consists of two files; socket.py and _socket.so. Many other built-in Python modules follow a similar convention.

    32.2.4 Static linking

    An alternative approach to dynamic linking is to rebuild the Python interpreter with your extension module added to it. In the past, this approach was sometimes necessary due to limitations in dynamic loading support on certain machines. However, the situation has improved greatly over the last few years and you should not consider this approach unless there is really no other option.

    The usual procedure for adding a new module to Python involves finding the Python source, adding an entry to the Modules/Setup file, and rebuilding the interpreter using the Python Makefile. However, newer Python versions have changed the build process. You may need to edit the 'setup.py' file in the Python distribution instead.

    In earlier versions of SWIG, the embed.i library file could be used to rebuild the interpreter. For example:

    %module example
    
    %inline %{
    extern int fact(int);
    extern int mod(int, int);
    extern double My_variable;
    %}
    
    %include "embed.i"       // Include code for a static version of Python
    
    

    The embed.i library file includes supporting code that contains everything needed to rebuild Python. To rebuild the interpreter, you simply do something like this:

    $ swig -python -lembed.i example.i
    $ gcc example.c example_wrap.c \
            -Xlinker -export-dynamic \
            -DHAVE_CONFIG_H -I/usr/include/python2.7 \
            -I/usr/lib/python2.7/config-x86_64-linux-gnu \
            -I/usr/lib/python2.7/config \
            -L/usr/lib/python2.7/config -lpython2.7 -lm -ldl \
            -o mypython
    

    You will need to supply the same libraries that were used to build Python the first time. This may include system libraries such as -lsocket, -lnsl, and -lpthread. Assuming this actually works, the new version of Python should be identical to the default version except that your extension module will be a built-in part of the interpreter.

    Comment: In practice, you should probably try to avoid static linking if possible. Some programmers may be inclined to use static linking in the interest of getting better performance. However, the performance gained by static linking tends to be rather minimal in most situations (and quite frankly not worth the extra hassle in the opinion of this author).

    Compatibility note: The embed.i library file is deprecated and has not been actively maintained for many years. Even though it appears to "work" with Python 2.7, no future support is guaranteed. If using static linking, you might want to rely on a different approach (perhaps using distutils).

    32.2.5 Using your module

    To use your module, simply use the Python import statement. If all goes well, you will be able to run this:

    $ python
    >>> import example
    >>> example.fact(4)
    24
    >>>
    

    A common error received by first-time users is the following:

    >>> import example
    Traceback (most recent call last):
      File "<stdin>", line 1, in ?
      File "example.py", line 2, in ?
        import _example
    ImportError: No module named _example
    

    If you get this message, it means that you either forgot to compile the wrapper code into an extension module or you didn't give the extension module the right name. Make sure that you compiled the wrappers into a module called _example.so. And don't forget the leading underscore (_).

    Another possible error is the following:

    >>> import example
    Traceback (most recent call last):
      File "<stdin>", line 1, in ?
    ImportError: dynamic module does not define init function (init_example)
    >>>
    

    This error is almost always caused when a bad name is given to the shared object file. For example, if you created a file example.so instead of _example.so you would get this error. Alternatively, this error could arise if the name of the module is inconsistent with the module name supplied with the %module directive. Double-check the interface to make sure the module name and the shared object filename match. Another possible cause of this error is forgetting to link the SWIG-generated wrapper code with the rest of your application when creating the extension module.

    Another common error is something similar to the following:

    Traceback (most recent call last):
      File "example.py", line 3, in ?
        import example
    ImportError: ./_example.so: undefined symbol: fact
    

    This error usually indicates that you forgot to include some object files or libraries in the linking of the shared library file. Make sure you compile both the SWIG wrapper file and your original program into a shared library file. Make sure you pass all of the required libraries to the linker.

    Sometimes unresolved symbols occur because a wrapper has been created for a function that doesn't actually exist in a library. This usually occurs when a header file includes a declaration for a function that was never actually implemented or it was removed from a library without updating the header file. To fix this, you can either edit the SWIG input file to remove the offending declaration or you can use the %ignore directive to ignore the declaration.

    Finally, suppose that your extension module is linked with another library like this:

    $ gcc -shared example.o example_wrap.o -L/home/beazley/projects/lib -lfoo \
          -o _example.so
    

    If the foo library is compiled as a shared library, you might encounter the following problem when you try to use your module:

    >>> import example
    Traceback (most recent call last):
      File "<stdin>", line 1, in ?
    ImportError: libfoo.so: cannot open shared object file: No such file or directory
    >>>
    

    This error is generated because the dynamic linker can't locate the libfoo.so library. When shared libraries are loaded, the system normally only checks a few standard locations such as /usr/lib and /usr/local/lib. To fix this problem, there are several things you can do. First, you can recompile your extension module with extra path information. For example, on Linux you can do this:

    $ gcc -shared example.o example_wrap.o -L/home/beazley/projects/lib -lfoo \
          -Xlinker -rpath /home/beazley/projects/lib  \
          -o _example.so
    

    Alternatively, you can set the LD_LIBRARY_PATH environment variable to include the directory with your shared libraries. If setting LD_LIBRARY_PATH, be aware that setting this variable can introduce a noticeable performance impact on all other applications that you run. To set it only for Python, you might want to do this instead:

    $ env LD_LIBRARY_PATH=/home/beazley/projects/lib python
    

    Finally, you can use a command such as ldconfig (Linux) or crle (Solaris) to add additional search paths to the default system configuration (this requires root access and you will need to read the man pages).

    32.2.6 Compilation of C++ extensions

    Compilation of C++ extensions has traditionally been a tricky problem. Since the Python interpreter is written in C, you need to take steps to make sure C++ is properly initialized and that modules are compiled correctly. This should be a non-issue if you're using distutils, as it takes care of all that for you. The following is included for historical reasons, and in case you need to compile on your own.

    On most machines, C++ extension modules should be linked using the C++ compiler. For example:

    $ swig -c++ -python example.i
    $ g++ -O2 -fPIC -c example.cxx
    $ g++ -O2 -fPIC -c example_wrap.cxx -I/usr/local/include/python2.5
    $ g++ -shared example.o example_wrap.o -o _example.so
    

    The -fPIC option tells GCC to generate position-independent code (PIC) which is required for most architectures (it's not vital on x86, but still a good idea as it allows code pages from the library to be shared between processes). Other compilers may need a different option specified instead of -fPIC.

    In addition to this, you may need to include additional library files to make it work. For example, if you are using the Sun C++ compiler on Solaris, you often need to add an extra library -lCrun like this:

    $ swig -c++ -python example.i
    $ CC -c example.cxx
    $ CC -c example_wrap.cxx -I/usr/local/include/python2.5
    $ CC -G example.o example_wrap.o -L/opt/SUNWspro/lib -o _example.so -lCrun
    

    Of course, the extra libraries to use are completely non-portable---you will probably need to do some experimentation.

    Sometimes people have suggested that it is necessary to relink the Python interpreter using the C++ compiler to make C++ extension modules work. In the experience of this author, this has never actually appeared to be necessary. Relinking the interpreter with C++ really only includes the special run-time libraries described above---as long as you link your extension modules with these libraries, it should not be necessary to rebuild Python.

    If you aren't entirely sure about the linking of a C++ extension, you might look at an existing C++ program. On many Unix machines, the ldd command will list library dependencies. This should give you some clues about what you might have to include when you link your extension module. For example:

    $ ldd swig
            libstdc++-libc6.1-1.so.2 => /usr/lib/libstdc++-libc6.1-1.so.2 (0x40019000)
            libm.so.6 => /lib/libm.so.6 (0x4005b000)
            libc.so.6 => /lib/libc.so.6 (0x40077000)
            /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
    

    As a final complication, a major weakness of C++ is that it does not define any sort of standard for binary linking of libraries. This means that C++ code compiled by different compilers will not link together properly as libraries nor is the memory layout of classes and data structures implemented in any kind of portable manner. In a monolithic C++ program, this problem may be unnoticed. However, in Python, it is possible for different extension modules to be compiled with different C++ compilers. As long as these modules are self-contained, this probably won't matter. However, if these modules start sharing data, you will need to take steps to avoid segmentation faults and other erratic program behavior. If working with lots of software components, you might want to investigate using a more formal standard such as COM.

    32.2.7 Compiling for 64-bit platforms

    On platforms that support 64-bit applications (Solaris, Irix, etc.), special care is required when building extension modules. On these machines, 64-bit applications are compiled and linked using a different set of compiler/linker options. In addition, it is not generally possible to mix 32-bit and 64-bit code together in the same application.

    To utilize 64-bits, the Python executable will need to be recompiled as a 64-bit application. In addition, all libraries, wrapper code, and every other part of your application will need to be compiled for 64-bits. If you plan to use other third-party extension modules, they will also have to be recompiled as 64-bit extensions.

    If you are wrapping commercial software for which you have no source code, you will be forced to use the same linking standard as used by that software. This may prevent the use of 64-bit extensions. It may also introduce problems on platforms that support more than one linking standard (e.g., -o32 and -n32 on Irix).

    On the Linux x86_64 platform (Opteron or EM64T), besides of the required compiler option -fPIC discussed above, you will need to be careful about the libraries you link with or the library path you use. In general, a Linux distribution will have two set of libraries, one for native x86_64 programs (under /usr/lib64), and another for 32 bits compatibility (under /usr/lib). Also, the compiler options -m32 and -m64 allow you to choose the desired binary format for your Python extension.

    32.2.8 Building Python extensions under Windows

    Building a SWIG extension to Python under Windows is roughly similar to the process used with Unix. Using the distutils, it is essentially identical. If you have the same version of the MS compiler that Python was built with (the python2.4 and python2.5 distributed by python.org are built with Visual Studio 2003), the standard python setup.py build should just work.

    As of python2.5, the distutils support building extensions with MingGW out of the box. Following the instruction here: Building Python extensions for Windows with only free tools should get you started.

    If you need to build it on your own, the following notes are provided:

    You will need to create a DLL that can be loaded into the interpreter. This section briefly describes the use of SWIG with Microsoft Visual C++. As a starting point, many of SWIG's examples include project files (.dsp files) for Visual C++ 6. These can be opened by more recent versions of Visual Studio. You might want to take a quick look at these examples in addition to reading this section.

    In Developer Studio, SWIG should be invoked as a custom build option. This is usually done as follows:

    • Open up a new workspace and use the AppWizard to select a DLL project.
    • Add both the SWIG interface file (the .i file), any supporting C files, and the name of the wrapper file that will be created by SWIG (ie. example_wrap.c). Note : If using C++, choose a different suffix for the wrapper file such as example_wrap.cxx. Don't worry if the wrapper file doesn't exist yet--Developer Studio keeps a reference to it.
    • Select the SWIG interface file and go to the settings menu. Under settings, select the "Custom Build" option.
    • Enter "SWIG" in the description field.
    • Enter "swig -python -o $(ProjDir)\$(InputName)_wrap.c $(InputPath)" in the "Build command(s) field"
    • Enter "$(ProjDir)\$(InputName)_wrap.c" in the "Output files(s) field".
    • Next, select the settings for the entire project and go to "C++:Preprocessor". Add the include directories for your Python installation under "Additional include directories".
    • Define the symbol __WIN32__ under preprocessor options.
    • Finally, select the settings for the entire project and go to "Link Options". Add the Python library file to your link libraries. For example "python27.lib". Also, set the name of the output file to match the name of your Python module, i.e. _example.pyd
    • Build your project.

    If all went well, SWIG will be automatically invoked whenever you build your project. Any changes made to the interface file will result in SWIG being automatically executed to produce a new version of the wrapper file.

    To run your new Python extension, simply run Python and use the import command as normal. For example :

    $ python
    >>> import example
    >>> print example.fact(4)
    24
    >>>
    

    If you get an ImportError exception when importing the module, you may have forgotten to include additional library files when you built your module. If you get an access violation or some kind of general protection fault immediately upon import, you have a more serious problem. This is often caused by linking your extension module against the wrong set of Win32 debug or thread libraries. You will have to fiddle around with the build options of project to try and track this down.

    A 'Debug' build of the wrappers requires a debug build of the Python interpreter. This normally requires building the Python interpreter from source, which is not a job for the feint-hearted. Alternatively you can use the 'Release' build of the Python interpreter with a 'Debug' build of your wrappers by defining the SWIG_PYTHON_INTERPRETER_NO_DEBUG symbol under the preprocessor options. Or you can ensure this macro is defined at the beginning of the wrapper code using the following in your interface file, where _MSC_VER ensures it is only used by the Visual Studio compiler:

    %begin %{
    #ifdef _MSC_VER
    #define SWIG_PYTHON_INTERPRETER_NO_DEBUG
    #endif
    %}
    

    Some users have reported success in building extension modules using Cygwin and other compilers. However, the problem of building usable DLLs with these compilers tends to be rather problematic. For the latest information, you may want to consult the SWIG Wiki.

    32.2.9 Additional Python commandline options

    The following table lists the additional commandline options available for the Python module. They can also be seen by using:

    swig -python -help
    
    Python specific options
    -builtin Create Python built-in types rather than proxy classes, for better performance
    -castmode Enable the casting mode, which allows implicit cast between types in Python
    -debug-doxygen-parser Display doxygen parser module debugging information
    -debug-doxygen-translator Display doxygen translator module debugging information
    -dirvtable Generate a pseudo virtual table for directors for faster dispatch
    -doxygen Convert C++ doxygen comments to pydoc comments in proxy classes
    -extranative Return extra native wrappers for C++ std containers wherever possible
    -fastproxy Use fast proxy mechanism for member methods
    -globals <name> Set <name> used to access C global variable (default: 'cvar')
    -interface <mod>Set low-level C/C++ module name to <mod> (default: module name prefixed by '_')
    -keyword Use keyword arguments
    -nofastunpack Use traditional UnpackTuple method to parse the argument functions
    -noh Don't generate the output header file
    -noproxy Don't generate proxy classes
    -nortti Disable the use of the native C++ RTTI with directors
    -nothreads Disable thread support for the entire interface
    -olddefs Keep the old method definitions when using -fastproxy
    -py3 Generate code with Python 3 specific features and syntax
    -relativeimport Use relative Python imports
    -threads Add thread support for all the interface
    -O Enable the following optimization options: -fastdispatch -fastproxy -fvirtual

    Many of these options are covered later on and their use should become clearer by the time you have finished reading this section on SWIG and Python.

    32.3 A tour of basic C/C++ wrapping

    By default, SWIG tries to build a very natural Python interface to your C/C++ code. Functions are wrapped as functions, classes are wrapped as classes, and so forth. This section briefly covers the essential aspects of this wrapping.

    32.3.1 Modules

    The SWIG %module directive specifies the name of the Python module. If you specify `%module example', then everything is wrapped into a Python 'example' module. Underneath the covers, this module consists of a Python source file example.py and a low-level extension module _example.so. When choosing a module name, make sure you don't use the same name as a built-in Python command or standard module name.

    32.3.2 Functions

    Global functions are wrapped as new Python built-in functions. For example,

    %module example
    int fact(int n);
    

    creates a built-in function example.fact(n) that works exactly like you think it does:

    >>> import example
    >>> print example.fact(4)
    24
    >>>
    

    32.3.3 Global variables

    C/C++ global variables are fully supported by SWIG. However, the underlying mechanism is somewhat different than you might expect due to the way that Python assignment works. When you type the following in Python

    a = 3.4
    

    "a" becomes a name for an object containing the value 3.4. If you later type

    b = a
    

    then "a" and "b" are both names for the object containing the value 3.4. Thus, there is only one object containing 3.4 and "a" and "b" are both names that refer to it. This is quite different than C where a variable name refers to a memory location in which a value is stored (and assignment copies data into that location). Because of this, there is no direct way to map variable assignment in C to variable assignment in Python.

    To provide access to C global variables, SWIG creates a special object called `cvar' that is added to each SWIG generated module. Global variables are then accessed as attributes of this object. For example, consider this interface

    // SWIG interface file with global variables
    %module example
    ...
    %inline %{
    extern int My_variable;
    extern double density;
    %}
    ...
    

    Now look at the Python interface:

    >>> import example
    >>> # Print out value of a C global variable
    >>> print example.cvar.My_variable
    4
    >>> # Set the value of a C global variable
    >>> example.cvar.density = 0.8442
    >>> # Use in a math operation
    >>> example.cvar.density = example.cvar.density*1.10
    

    If you make an error in variable assignment, you will receive an error message. For example:

    >>> example.cvar.density = "Hello"
    Traceback (most recent call last):
      File "<stdin>", line 1, in ?
    TypeError: C variable 'density (double )'
    >>>
    

    If a variable is declared as const, it is wrapped as a read-only variable. Attempts to modify its value will result in an error.

    To make ordinary variables read-only, you can use the %immutable directive. For example:

    %{
    extern char *path;
    %}
    %immutable;
    extern char *path;
    %mutable;
    

    The %immutable directive stays in effect until it is explicitly disabled or cleared using %mutable. See the Creating read-only variables section for further details.

    If you just want to make a specific variable immutable, supply a declaration name. For example:

    %{
    extern char *path;
    %}
    %immutable path;
    ...
    extern char *path;      // Read-only (due to %immutable)
    

    If you would like to access variables using a name other than "cvar", it can be changed using the -globals option :

    $ swig -python -globals myvar example.i
    

    Some care is in order when importing multiple SWIG modules. If you use the "from <file> import *" style of importing, you will get a name clash on the variable `cvar' and you will only be able to access global variables from the last module loaded. To prevent this, you might consider renaming cvar or making it private to the module by giving it a name that starts with a leading underscore. SWIG does not create cvar if there are no global variables in a module.

    32.3.4 Constants and enums

    C/C++ constants are installed as Python objects containing the appropriate value. To create a constant, use #define, enum, or the %constant directive. For example:

    #define PI 3.14159
    #define VERSION "1.0"
    
    enum Beverage { ALE, LAGER, STOUT, PILSNER };
    
    %constant int FOO = 42;
    %constant const char *path = "/usr/local";
    

    For enums, make sure that the definition of the enumeration actually appears in a header file or in the wrapper file somehow---if you just stick an enum in a SWIG interface without also telling the C compiler about it, the wrapper code won't compile.

    Note: declarations declared as const are wrapped as read-only variables and will be accessed using the cvar object described in the previous section. They are not wrapped as constants. For further discussion about this, see the SWIG Basics chapter.

    Constants are not guaranteed to remain constant in Python---the name of the constant could be accidentally reassigned to refer to some other object. Unfortunately, there is no easy way for SWIG to generate code that prevents this. You will just have to be careful.

    32.3.5 Pointers

    C/C++ pointers are fully supported by SWIG. Furthermore, SWIG has no problem working with incomplete type information. Here is a rather simple interface:

    %module example
    
    FILE *fopen(const char *filename, const char *mode);
    int fputs(const char *, FILE *);
    int fclose(FILE *);
    

    When wrapped, you will be able to use the functions in a natural way from Python. For example:

    >>> import example
    >>> f = example.fopen("junk", "w")
    >>> example.fputs("Hello World\n", f)
    >>> example.fclose(f)
    

    If this makes you uneasy, rest assured that there is no deep magic involved. Underneath the covers, pointers to C/C++ objects are simply represented as opaque values using an especial Python container object:

    >>> print f
    <Swig Object of type 'FILE *' at 0xb7d6f470>
    

    This pointer value can be freely passed around to different C functions that expect to receive an object of type FILE *. The only thing you can't do is dereference the pointer from Python. Of course, that isn't much of a concern in this example.

    In older versions of SWIG (1.3.22 or older), pointers were represented using a plain string object. If you have an old package that still requires that representation, or you just feel nostalgic, you can always retrieve it by casting the pointer object to a string:

    >>> print str(f)
    _c0671108_p_FILE
    

    Also, if you need to pass the raw pointer value to some external Python library, you can do it by casting the pointer object to an integer:

    >>> print int(f)
    135833352
    

    However, the inverse operation is not possible, i.e., you can't build a SWIG pointer object from a raw integer value.

    Note also that the '0' or NULL pointer is always represented by None, no matter what type swig is addressing. In the previous example, you can call:

    >>> example.fclose(None)
    

    and that will be equivalent to the following, but not really useful, C code:

    FILE *f = NULL;
    fclose(f);
    

    As much as you might be inclined to modify a pointer value directly from Python, don't. The hexadecimal encoding is not necessarily the same as the logical memory address of the underlying object. Instead it is the raw byte encoding of the pointer value. The encoding will vary depending on the native byte-ordering of the platform (i.e., big-endian vs. little-endian). Similarly, don't try to manually cast a pointer to a new type by simply replacing the type-string. This may not work like you expect, it is particularly dangerous when casting C++ objects. If you need to cast a pointer or change its value, consider writing some helper functions instead. For example:

    %inline %{
    /* C-style cast */
    Bar *FooToBar(Foo *f) {
      return (Bar *) f;
    }
    
    /* C++-style cast */
    Foo *BarToFoo(Bar *b) {
      return dynamic_cast<Foo*>(b);
    }
    
    Foo *IncrFoo(Foo *f, int i) {
      return f+i;
    }
    %}
    

    Also, if working with C++, you should always try to use the new C++ style casts. For example, in the above code, the C-style cast may return a bogus result whereas as the C++-style cast will return None if the conversion can't be performed.

    32.3.6 Structures

    If you wrap a C structure, it is wrapped by a Python class. This provides a very natural interface. For example,

    struct Vector {
      double x, y, z;
    };
    
    

    is used as follows:

    >>> v = example.Vector()
    >>> v.x = 3.5
    >>> v.y = 7.2
    >>> print v.x, v.y, v.z
    3.5 7.2 0.0
    >>>
    

    Similar access is provided for unions and the data members of C++ classes.

    If you print out the value of v in the above example, you will see something like this:

    >>> print v
    <C Vector instance at _18e31408_p_Vector>
    

    This object is actually a Python instance that has been wrapped around a pointer to the low-level C structure. This instance doesn't actually do anything--it just serves as a proxy. The pointer to the C object can be found in the .this attribute. For example:

    >>> print v.this
    _18e31408_p_Vector
    >>>
    

    Further details about the Python proxy class are covered a little later.

    const members of a structure are read-only. Data members can also be forced to be read-only using the %immutable directive. For example:

    struct Foo {
      ...
      %immutable;
      int x;        /* Read-only members */
      char *name;
      %mutable;
      ...
    };
    

    When char * members of a structure are wrapped, the contents are assumed to be dynamically allocated using malloc or new (depending on whether or not SWIG is run with the -c++ option). When the structure member is set, the old contents will be released and a new value created. If this is not the behavior you want, you will have to use a typemap (described later).

    If a structure contains arrays, access to those arrays is managed through pointers. For example, consider this:

    struct Bar {
      int  x[16];
    };
    

    If accessed in Python, you will see behavior like this:

    >>> b = example.Bar()
    >>> print b.x
    _801861a4_p_int
    >>>
    

    This pointer can be passed around to functions that expect to receive an int * (just like C). You can also set the value of an array member using another pointer. For example:

    >>> c = example.Bar()
    >>> c.x = b.x             # Copy contents of b.x to c.x
    

    For array assignment, SWIG copies the entire contents of the array starting with the data pointed to by b.x. In this example, 16 integers would be copied. Like C, SWIG makes no assumptions about bounds checking---if you pass a bad pointer, you may get a segmentation fault or access violation.

    When a member of a structure is itself a structure, it is handled as a pointer. For example, suppose you have two structures like this:

    struct Foo {
      int a;
    };
    
    struct Bar {
      Foo f;
    };
    

    Now, suppose that you access the f attribute of Bar like this:

    >>> b = Bar()
    >>> x = b.f
    

    In this case, x is a pointer that points to the Foo that is inside b. This is the same value as generated by this C code:

    Bar b;
    Foo *x = &b->f;       /* Points inside b */
    

    Because the pointer points inside the structure, you can modify the contents and everything works just like you would expect. For example:

    >>> b = Bar()
    >>> b.f.a = 3               # Modify attribute of structure member
    >>> x = b.f
    >>> x.a = 3                 # Modifies the same structure
    

    Note that there is a limitation with structs within structs that will cause a problem if the outer struct is not a named variable in Python. The following will cause a segfault:

    Bar().f.a = 3
    

    because the unnamed Python proxy class for Bar() has its reference count decremented by the Python interpreter after f has been obtained from it and before f is used to obtain a. This results in the underlying Bar instance being deleted, which of course also deletes f inside it. Hence the pointer to f points to deleted memory and use of it results in a segfault or some sort of other undefined behaviour.

    32.3.7 C++ classes

    C++ classes are wrapped by Python classes as well. For example, if you have this class,

    class List {
    public:
      List();
      ~List();
      int  search(char *item);
      void insert(char *item);
      void remove(char *item);
      char *get(int n);
      int  length;
    };
    

    you can use it in Python like this:

    >>> l = example.List()
    >>> l.insert("Ale")
    >>> l.insert("Stout")
    >>> l.insert("Lager")
    >>> l.get(1)
    'Stout'
    >>> print l.length
    3
    >>>
    

    Class data members are accessed in the same manner as C structures.

    Static class members present a special problem for Python. Prior to Python-2.2, Python classes had no support for static methods and no version of Python supports static member variables in a manner that SWIG can utilize. Therefore, SWIG generates wrappers that try to work around some of these issues. To illustrate, suppose you have a class like this:

    class Spam {
    public:
      static void foo();
      static int bar;
    };
    

    In Python, the static member can be access in three different ways:

    >>> example.Spam_foo()    # Spam::foo()
    >>> s = example.Spam()
    >>> s.foo()               # Spam::foo() via an instance
    >>> example.Spam.foo()    # Spam::foo(). Python-2.2 only
    

    The first two methods of access are supported in all versions of Python. The last technique is only available in Python-2.2 and later versions.

    Static member variables are currently accessed as global variables. This means, they are accessed through cvar like this:

    >>> print example.cvar.Spam_bar
    7
    

    32.3.8 C++ inheritance

    SWIG is fully aware of issues related to C++ inheritance. Therefore, if you have classes like this

    class Foo {
    ...
    };
    
    class Bar : public Foo {
    ...
    };
    

    those classes are wrapped into a hierarchy of Python classes that reflect the same inheritance structure. All of the usual Python utility functions work normally:

    >>> b = Bar()
    >>> instance(b, Foo)
    1
    >>> issubclass(Bar, Foo)
    1
    >>> issubclass(Foo, Bar)
    0
    

    Furthermore, if you have functions like this

    void spam(Foo *f);
    

    then the function spam() accepts Foo * or a pointer to any class derived from Foo.

    It is safe to use multiple inheritance with SWIG.

    32.3.9 Pointers, references, values, and arrays

    In C++, there are many different ways a function might receive and manipulate objects. For example:

    void spam1(Foo *x);      // Pass by pointer
    void spam2(Foo &x);      // Pass by reference
    void spam3(const Foo &x);// Pass by const reference
    void spam4(Foo x);       // Pass by value
    void spam5(Foo x[]);     // Array of objects
    

    In Python, there is no detailed distinction like this--specifically, there are only "objects". There are no pointers, references, arrays, and so forth. Because of this, SWIG unifies all of these types together in the wrapper code. For instance, if you actually had the above functions, it is perfectly legal to do this:

    >>> f = Foo()           # Create a Foo
    >>> spam1(f)            # Ok. Pointer
    >>> spam2(f)            # Ok. Reference
    >>> spam3(f)            # Ok. Const reference
    >>> spam4(f)            # Ok. Value.
    >>> spam5(f)            # Ok. Array (1 element)
    

    Similar behavior occurs for return values. For example, if you had functions like this,

    Foo *spam6();
    Foo &spam7();
    Foo  spam8();
    const Foo &spam9();
    

    then all three functions will return a pointer to some Foo object. Since the third function (spam8) returns a value, newly allocated memory is used to hold the result and a pointer is returned (Python will release this memory when the return value is garbage collected). The fourth case (spam9) which returns a const reference, in most of the cases will be treated as a returning value, and it will follow the same allocation/deallocation process.

    32.3.10 C++ overloaded functions

    C++ overloaded functions, methods, and constructors are mostly supported by SWIG. For example, if you have two functions like this:

    void foo(int);
    void foo(char *c);
    

    You can use them in Python in a straightforward manner:

    >>> foo(3)           # foo(int)
    >>> foo("Hello")     # foo(char *c)
    

    Similarly, if you have a class like this,

    class Foo {
    public:
      Foo();
      Foo(const Foo &);
      ...
    };
    

    you can write Python code like this:

    >>> f = Foo()          # Create a Foo
    >>> g = Foo(f)         # Copy f
    

    Overloading support is not quite as flexible as in C++. Sometimes there are methods that SWIG can't disambiguate. For example:

    void spam(int);
    void spam(short);
    

    or

    void foo(Bar *b);
    void foo(Bar &b);
    

    If declarations such as these appear, you will get a warning message like this:

    example.i:12: Warning 509: Overloaded method spam(short) effectively ignored,
    example.i:11: Warning 509: as it is shadowed by spam(int).
    

    To fix this, you either need to ignore or rename one of the methods. For example:

    %rename(spam_short) spam(short);
    ...
    void spam(int);
    void spam(short);   // Accessed as spam_short
    

    or

    %ignore spam(short);
    ...
    void spam(int);
    void spam(short);   // Ignored
    

    SWIG resolves overloaded functions and methods using a disambiguation scheme that ranks and sorts declarations according to a set of type-precedence rules. The order in which declarations appear in the input does not matter except in situations where ambiguity arises--in this case, the first declaration takes precedence.

    Please refer to the "SWIG and C++" chapter for more information about overloading.

    32.3.11 C++ operators

    Certain C++ overloaded operators can be handled automatically by SWIG. For example, consider a class like this:

    class Complex {
    private:
      double rpart, ipart;
    public:
      Complex(double r = 0, double i = 0) : rpart(r), ipart(i) { }
      Complex(const Complex &c) : rpart(c.rpart), ipart(c.ipart) { }
      Complex &operator=(const Complex &c);
    
      Complex operator+=(const Complex &c) const;
      Complex operator+(const Complex &c) const;
      Complex operator-(const Complex &c) const;
      Complex operator*(const Complex &c) const;
      Complex operator-() const;
    
      double re() const { return rpart; }
      double im() const { return ipart; }
    };
    

    When wrapped, it works like you expect:

    >>> c = Complex(3, 4)
    >>> d = Complex(7, 8)
    >>> e = c + d
    >>> e.re()
    10.0
    >>> e.im()
    12.0
    >>> c += d
    >>> c.re()
    10.0
    >>> c.im()
    12.0
    
    

    One restriction with operator overloading support is that SWIG is not able to fully handle operators that aren't defined as part of the class. For example, if you had code like this

    class Complex {
    ...
    friend Complex operator+(double, const Complex &c);
    ...
    };
    

    then SWIG ignores it and issues a warning. You can still wrap the operator, but you may have to encapsulate it in a special function. For example:

    %rename(Complex_add_dc) operator+(double, const Complex &);
    

    There are ways to make this operator appear as part of the class using the %extend directive. Keep reading.

    Also, be aware that certain operators don't map cleanly to Python. For instance, overloaded assignment operators don't map to Python semantics and will be ignored.

    Operator overloading is implemented in the pyopers.swg library file. In particular overloaded operators are marked with the python:maybecall feature, also known as %pythonmaybecall. This feature forces SWIG to generate code that return an instance of Python's NotImplemented instead of raising an exception when the comparison fails, that is, on any kind of error. This follows the guidelines in PEP 207 - Rich Comparisons and NotImplemented Python constant.

    32.3.12 C++ namespaces

    SWIG is aware of C++ namespaces, but namespace names do not appear in the module nor do namespaces result in a module that is broken up into submodules or packages. For example, if you have a file like this,

    %module example
    
    namespace foo {
      int fact(int n);
      struct Vector {
        double x, y, z;
      };
    };
    

    it works in Python as follows:

    >>> import example
    >>> example.fact(3)
    6
    >>> v = example.Vector()
    >>> v.x = 3.4
    >>> print v.y
    0.0
    >>>
    

    If your program has more than one namespace, name conflicts (if any) can be resolved using %rename For example:

    %rename(Bar_spam) Bar::spam;
    
    namespace Foo {
      int spam();
    }
    
    namespace Bar {
      int spam();
    }
    

    If you have more than one namespace and your want to keep their symbols separate, consider wrapping them as separate SWIG modules. For example, make the module name the same as the namespace and create extension modules for each namespace separately. If your program utilizes thousands of small deeply nested namespaces each with identical symbol names, well, then you get what you deserve.

    32.3.13 C++ templates

    C++ templates don't present a huge problem for SWIG. However, in order to create wrappers, you have to tell SWIG to create wrappers for a particular template instantiation. To do this, you use the %template directive. For example:

    %module example
    %{
    #include "pair.h"
    %}
    
    template<class T1, class T2>
    struct pair {
      typedef T1 first_type;
      typedef T2 second_type;
      T1 first;
      T2 second;
      pair();
      pair(const T1&, const T2&);
     ~pair();
    };
    
    %template(pairii) pair<int, int>;
    

    In Python:

    >>> import example
    >>> p = example.pairii(3, 4)
    >>> p.first
    3
    >>> p.second
    4
    

    Obviously, there is more to template wrapping than shown in this example. More details can be found in the SWIG and C++ chapter. Some more complicated examples will appear later.

    32.3.14 C++ Smart Pointers

    32.3.14.1 The shared_ptr Smart Pointer

    The C++11 standard provides std::shared_ptr which was derived from the Boost implementation, boost::shared_ptr. Both of these are available for Python in the SWIG library and usage is outlined in the shared_ptr smart pointer library section.

    32.3.14.2 Generic Smart Pointers

    In certain C++ programs, it is common to use classes that have been wrapped by so-called "smart pointers." Generally, this involves the use of a template class that implements operator->() like this:

    template<class T> class SmartPtr {
      ...
      T *operator->();
      ...
    }
    

    Then, if you have a class like this,

    class Foo {
    public:
      int x;
      int bar();
    };
    

    A smart pointer would be used in C++ as follows:

    SmartPtr<Foo> p = CreateFoo();   // Created somehow (not shown)
    ...
    p->x = 3;                        // Foo::x
    int y = p->bar();                // Foo::bar
    

    To wrap this in Python, simply tell SWIG about the SmartPtr class and the low-level Foo object. Make sure you instantiate SmartPtr using %template if necessary. For example:

    %module example
    ...
    %template(SmartPtrFoo) SmartPtr<Foo>;
    ...
    

    Now, in Python, everything should just "work":

    >>> p = example.CreateFoo()          # Create a smart-pointer somehow
    >>> p.x = 3                          # Foo::x
    >>> p.bar()                          # Foo::bar
    

    If you ever need to access the underlying pointer returned by operator->() itself, simply use the __deref__() method. For example:

    >>> f = p.__deref__()     # Returns underlying Foo *
    

    32.3.15 C++ reference counted objects

    The C++ reference counted objects section contains Python examples of memory management using referencing counting.

    32.4 Further details on the Python class interface

    In the previous section, a high-level view of Python wrapping was presented. A key component of this wrapping is that structures and classes are wrapped by Python proxy classes. This provides a very natural Python interface and allows SWIG to support a number of advanced features such as operator overloading. However, a number of low-level details were omitted. This section provides a brief overview of how the proxy classes work.

    New in SWIG version 2.0.4: The use of Python proxy classes has performance implications that may be unacceptable for a high-performance library. The new -builtin option instructs SWIG to forego the use of proxy classes, and instead create wrapped types as new built-in Python types. When this option is used, the following section ("Proxy classes") does not apply. Details on the use of the -builtin option are in the Built-in Types section.

    32.4.1 Proxy classes

    In the "SWIG basics" and "SWIG and C++" chapters, details of low-level structure and class wrapping are described. To summarize those chapters, if you have a class like this

    class Foo {
    public:
      int x;
      int spam(int);
      ...
    

    then SWIG transforms it into a set of low-level procedural wrappers. For example:

    Foo *new_Foo() {
      return new Foo();
    }
    void delete_Foo(Foo *f) {
      delete f;
    }
    int Foo_x_get(Foo *f) {
      return f->x;
    }
    void Foo_x_set(Foo *f, int value) {
      f->x = value;
    }
    int Foo_spam(Foo *f, int arg1) {
      return f->spam(arg1);
    }
    

    These wrappers can be found in the low-level extension module (e.g., _example).

    Using these wrappers, SWIG generates a high-level Python proxy class (also known as a shadow class) like this (shown for Python 2.2):

    import _example
    
    class Foo(object):
        def __init__(self):
            self.this = _example.new_Foo()
            self.thisown = 1
        def __del__(self):
            if self.thisown:
                _example.delete_Foo(self.this)
        def spam(self, arg1):
            return _example.Foo_spam(self.this, arg1)
        x = property(_example.Foo_x_get, _example.Foo_x_set)
    

    This class merely holds a pointer to the underlying C++ object (.this) and dispatches methods and member variable access to that object using the low-level accessor functions. From a user's point of view, it makes the class work normally:

    >>> f = example.Foo()
    >>> f.x = 3
    >>> y = f.spam(5)
    

    The fact that the class has been wrapped by a real Python class offers certain advantages. For instance, you can attach new Python methods to the class and you can even inherit from it (something not supported by Python built-in types until Python 2.2).

    32.4.2 Built-in Types

    The -builtin option provides a significant performance improvement in the wrapped code. To understand the difference between proxy classes and built-in types, let's take a look at what a wrapped object looks like under both circumstances.

    When proxy classes are used, each wrapped object in Python is an instance of a pure Python class. As a reminder, here is what the __init__ method looks like in a proxy class:

    class Foo(object):
        def __init__(self):
            self.this = _example.new_Foo()
            self.thisown = 1
    

    When a Foo instance is created, the call to _example.new_Foo() creates a new C++ Foo instance; wraps that C++ instance inside an instance of a Python built-in type called SwigPyObject; and stores the SwigPyObject instance in the 'this' field of the Python Foo object. Did you get all that? So, the Python Foo object is composed of three parts:

    • The Python Foo instance, which contains...
    • ... an instance of struct SwigPyObject, which contains...
    • ... a C++ Foo instance

    When -builtin is used, the pure Python layer is stripped off. Each wrapped class is turned into a new Python built-in type which inherits from SwigPyObject, and SwigPyObject instances are returned directly from the wrapped methods. For more information about Python built-in extensions, please refer to the Python documentation:

    https://docs.python.org/3/extending/newtypes.html

    32.4.2.1 Limitations

    Use of the -builtin option implies a couple of limitations:

    • Some legacy syntax is no longer supported; in particular:

      • The functional interface is no longer exposed. For example, you may no longer call Whizzo.new_CrunchyFrog(). Instead, you must use Whizzo.CrunchyFrog().
      • Static member variables are no longer accessed through the 'cvar' field (e.g., Dances.cvar.FishSlap). They are instead accessed in the idiomatic way (Dances.FishSlap).
    • Wrapped types may not be raised as Python exceptions. Here's why: the Python internals expect that all sub-classes of Exception will have this struct layout:

      typedef struct {
        PyObject_HEAD
        PyObject *dict;
        PyObject *args;
        PyObject *message;
      } PyBaseExceptionObject;
      

      But swig-generated wrappers expect that all swig-wrapped classes will have this struct layout:

      typedef struct {
        PyObject_HEAD
        void *ptr;
        swig_type_info *ty;
        int own;
        PyObject *next;
        PyObject *dict;
      } SwigPyObject;
      

      There are workarounds for this. For example, if you wrap this class:

      class MyException {
      public:
        MyException (const char *msg_);
        ~MyException ();
      
        const char *what () const;
      
      private:
        char *msg;
      };
      

      ... you can define this Python class, which may be raised as an exception:

      class MyPyException(Exception):
          def __init__(self, msg, *args):
              Exception.__init__(self, *args)
              self.myexc = MyException(msg)
          def what(self):
              return self.myexc.what()
      
    • Reverse binary operators (e.g., __radd__) are not supported.

      To illustrate this point, if you have a wrapped class called MyString, and you want to use instances of MyString interchangeably with native Python strings, you can define an 'operator+ (const char*)' method :

      class MyString {
      public:
        MyString (const char *init);
        MyString operator+ (const char *other) const;
        ...
      };
      

      SWIG will automatically create an operator overload in Python that will allow this:

      from MyModule import MyString
      
      mystr = MyString("No one expects")
      episode = mystr + " the Spanish Inquisition"
      

      This works because the first operand (mystr) defines a way to add a native string to itself. However, the following will not work:

      from MyModule import MyString
      
      mystr = MyString("Parrot")
      episode = "Dead " + mystr
      

      The above code fails, because the first operand -- a native Python string -- doesn't know how to add an instance of MyString to itself.

    • If you have multiple SWIG modules that share type information (more info), the -builtin option requires a bit of extra discipline to ensure that base classes are initialized before derived classes. Specifically:

      • There must be an unambiguous dependency graph for the modules.

      • Module dependencies must be explicitly stated with %import statements in the SWIG interface file.

      As an example, suppose module A has this interface in A.i :

      %module "A";
      
      class Base {
      ...
      };
      

      If you want to wrap another module containing a class that inherits from A, this is how it would look :

      %module "B";
      
      %import "A.i"
      
      class Derived : public Base {
      ...
      };
      

      The import "A.i" statement is required, because module B depends on module A.

      As long as you obey these requirements, your Python code may import the modules in any order :

      import B
      import A
      
      assert(issubclass(B.Derived, A.Base))
      

    32.4.2.2 Operator overloads and slots -- use them!

    The entire justification for the -builtin option is improved performance. To that end, the best way to squeeze maximum performance out of your wrappers is to use operator overloads. Named method dispatch is slow in Python, even when compared to other scripting languages. However, Python built-in types have a large number of "slots", analogous to C++ operator overloads, which allow you to short-circuit named method dispatch for certain common operations.

    By default, SWIG will translate most C++ arithmetic operator overloads into Python slot entries. For example, suppose you have this class:

    class Twit {
    public:
      Twit operator+ (const Twit& twit) const;
    
      // Forward to operator+
      Twit add (const Twit& twit) const {
        return *this + twit;
      }
    };
    

    SWIG will automatically register operator+ as a Python slot operator for addition. You may write Python code like this:

    from MyModule import Twit
    
    nigel = Twit()
    emily = Twit()
    percival = nigel + emily
    percival = nigel.add(emily)
    

    The last two lines of the Python code are equivalent, but the line that uses the '+' operator is much faster.

    In-place operators (e.g., operator+=) and comparison operators (operator==, operator<, etc.) are also converted to Python slot operators. For a complete list of C++ operators that are automatically converted to Python slot operators, refer to the file python/pyopers.swig in the SWIG library.

    Read about all of the available Python slots here: https://docs.python.org/3/c-api/typeobj.html

    There are two ways to define a Python slot function: dispatch to a statically defined function; or dispatch to a method defined on the operand.

    To dispatch to a statically defined function, use %feature("python:<slot>"), where <slot> is the name of a field in a PyTypeObject, PyNumberMethods, PyMappingMethods, PySequenceMethods or PyBufferProcs. You may override (almost) all of these slots.

    Let's consider an example setting the tp_hash slot for the MyClass type. This is akin to providing a __hash__ method (for non-builtin types) to make a type hashable. The hashable type can then for example be added to a Python dict.

    %feature("python:tp_hash") MyClass "myHashFunc";
    
    class MyClass {
    public:
      long field1;
      long field2;
      ...
    };
    
    %{
    #if PY_VERSION_HEX >= 0x03020000
      static Py_hash_t myHashFunc(PyObject *pyobj)
    #else
      static long myHashFunc(PyObject *pyobj)
    #endif
      {
        MyClass *cobj;
        // Convert pyobj to cobj
        return (cobj->field1 * (cobj->field2 << 7));
      }
    %}
    

    If you examine the generated code, the supplied hash function will now be the function callback in the tp_hash slot for the builtin type for MyClass:

    static PyHeapTypeObject SwigPyBuiltin__MyClass_type = {
      ...
      (hashfunc) myHashFunc,       /* tp_hash */
      ...
    

    NOTE: It is the responsibility of the programmer (that's you!) to ensure that a statically defined slot function has the correct signature, the hashfunc typedef in this case.

    If, instead, you want to dispatch to an instance method, you can use %feature("python:slot"). For example:

    %feature("python:slot", "tp_hash", functype="hashfunc") MyClass::myHashFunc;
    
    #if PY_VERSION_HEX < 0x03020000
      #define Py_hash_t long
    #endif
    
    class MyClass {
      public:
        Py_hash_t myHashFunc() const;
        ...
    };
    

    NOTE: Some Python slots use a method signature which does not match the signature of SWIG-wrapped methods. For those slots, SWIG will automatically generate a "closure" function to re-marshal the arguments before dispatching to the wrapped method. Setting the "functype" attribute of the feature enables SWIG to generate the chosen closure function.

    There is further information on %feature("python:slot") in the file python/pyopers.swig in the SWIG library.

    32.4.3 Memory management

    NOTE: Although this section refers to proxy objects, everything here also applies when the -builtin option is used.

    Associated with proxy object, is an ownership flag .thisown The value of this flag determines who is responsible for deleting the underlying C++ object. If set to 1, the Python interpreter will destroy the C++ object when the proxy class is garbage collected. If set to 0 (or if the attribute is missing), then the destruction of the proxy class has no effect on the C++ object.

    When an object is created by a constructor or returned by value, Python automatically takes ownership of the result. For example:

    class Foo {
    public:
      Foo();
      Foo bar();
    };
    

    In Python:

    >>> f = Foo()
    >>> f.thisown
    1
    >>> g = f.bar()
    >>> g.thisown
    1
    

    On the other hand, when pointers are returned to Python, there is often no way to know where they came from. Therefore, the ownership is set to zero. For example:

    class Foo {
    public:
      ...
      Foo *spam();
      ...
    };
    

    >>> f = Foo()
    >>> s = f.spam()
    >>> print s.thisown
    0
    >>>
    

    This behavior is especially important for classes that act as containers. For example, if a method returns a pointer to an object that is contained inside another object, you definitely don't want Python to assume ownership and destroy it!

    A good way to indicate that ownership should be set for a returned pointer is to use the %newobject directive.

    Related to containers, ownership issues can arise whenever an object is assigned to a member or global variable. For example, consider this interface:

    %module example
    
    struct Foo {
      int  value;
      Foo  *next;
    };
    
    Foo *head = 0;
    

    When wrapped in Python, careful observation will reveal that ownership changes whenever an object is assigned to a global variable. For example:

    >>> f = example.Foo()
    >>> f.thisown
    1
    >>> example.cvar.head = f
    >>> f.thisown
    0
    >>>
    

    In this case, C is now holding a reference to the object---you probably don't want Python to destroy it. Similarly, this occurs for members. For example:

    >>> f = example.Foo()
    >>> g = example.Foo()
    >>> f.thisown
    1
    >>> g.thisown
    1
    >>> f.next = g
    >>> g.thisown
    0
    >>>
    

    For the most part, memory management issues remain hidden. However, there are occasionally situations where you might have to manually change the ownership of an object. For instance, consider code like this:

    class Node {
      Object *value;
    public:
      void set_value(Object *v) { value = v; }
      ...
    };
    

    Now, consider the following Python code:

    >>> v = Object()           # Create an object
    >>> n = Node()             # Create a node
    >>> n.set_value(v)         # Set value
    >>> v.thisown
    1
    >>> del v
    

    In this case, the object n is holding a reference to v internally. However, SWIG has no way to know that this has occurred. Therefore, Python still thinks that it has ownership of the object. Should the proxy object be destroyed, then the C++ destructor will be invoked and n will be holding a stale-pointer. If you're lucky, you will only get a segmentation fault.

    To work around this, it is always possible to flip the ownership flag. For example,

    >>> v.thisown = 0
    

    It is also possible to deal with situations like this using typemaps--an advanced topic discussed later.

    32.5 Cross language polymorphism

    Proxy classes provide a more natural, object-oriented way to access extension classes. As described above, each proxy instance has an associated C++ instance, and method calls to the proxy are passed to the C++ instance transparently via C wrapper functions.

    This arrangement is asymmetric in the sense that no corresponding mechanism exists to pass method calls down the inheritance chain from C++ to Python. In particular, if a C++ class has been extended in Python (by extending the proxy class), these extensions will not be visible from C++ code. Virtual method calls from C++ are thus not able access the lowest implementation in the inheritance chain.

    Changes have been made to SWIG 1.3.18 to address this problem and make the relationship between C++ classes and proxy classes more symmetric. To achieve this goal, new classes called directors are introduced at the bottom of the C++ inheritance chain. The job of the directors is to route method calls correctly, either to C++ implementations higher in the inheritance chain or to Python implementations lower in the inheritance chain. The upshot is that C++ classes can be extended in Python and from C++ these extensions look exactly like native C++ classes. Neither C++ code nor Python code needs to know where a particular method is implemented: the combination of proxy classes, director classes, and C wrapper functions takes care of all the cross-language method routing transparently.

    32.5.1 Enabling directors

    The director feature is disabled by default. To use directors you must make two changes to the interface file. First, add the "directors" option to the %module directive, like this:

    %module(directors="1") modulename
    

    Without this option no director code will be generated. Second, you must use the %feature("director") directive to tell SWIG which classes and methods should get directors. The %feature directive can be applied globally, to specific classes, and to specific methods, like this:

    // generate directors for all classes that have virtual methods
    %feature("director");
    
    // generate directors for the virtual methods in class Foo
    %feature("director") Foo;
    

    You can use the %feature("nodirector") directive to turn off directors for specific classes or methods. So for example,

    %feature("director") Foo;
    %feature("nodirector") Foo::bar;
    

    will generate directors for the virtual methods of class Foo except bar().

    Directors can also be generated implicitly through inheritance. In the following, class Bar will get a director class that handles the methods one() and two() (but not three()):

    %feature("director") Foo;
    class Foo {
    public:
      Foo(int foo);
      virtual ~Foo();
      virtual void one();
      virtual void two();
    };
    
    class Bar: public Foo {
    public:
      virtual void three();
    };
    

    then at the Python side you can define

    import mymodule
    
    class MyFoo(mymodule.Foo):
        def __init__(self, foo):
            mymodule.Foo.__init__(self, foo)
    #       super().__init__(foo) # Alternative construction for Python3
    
        def one(self):
            print "one from Python"
    

    32.5.2 Director classes

    For each class that has directors enabled, SWIG generates a new class that derives from both the class in question and a special Swig::Director class. These new classes, referred to as director classes, can be loosely thought of as the C++ equivalent of the Python proxy classes. The director classes store a pointer to their underlying Python object and handle various issues related to object ownership. Indeed, this is quite similar to the "this" and "thisown" members of the Python proxy classes.

    For simplicity let's ignore the Swig::Director class and refer to the original C++ class as the director's base class. By default, a director class extends all virtual methods in the inheritance chain of its base class (see the preceding section for how to modify this behavior). Virtual methods that have a final specifier are unsurprisingly excluded. Thus the virtual method calls, whether they originate in C++ or in Python via proxy classes, eventually end up in at the implementation in the director class. The job of the director methods is to route these method calls to the appropriate place in the inheritance chain. By "appropriate place" we mean the method that would have been called if the C++ base class and its extensions in Python were seamlessly integrated. That seamless integration is exactly what the director classes provide, transparently skipping over all the messy extension API glue that binds the two languages together.

    In reality, the "appropriate place" is one of only two possibilities: C++ or Python. Once this decision is made, the rest is fairly easy. If the correct implementation is in C++, then the lowest implementation of the method in the C++ inheritance chain is called explicitly. If the correct implementation is in Python, the Python API is used to call the method of the underlying Python object (after which the usual virtual method resolution in Python automatically finds the right implementation).

    Now how does the director decide which language should handle the method call? The basic rule is to handle the method in Python, unless there's a good reason not to. The reason for this is simple: Python has the most "extended" implementation of the method. This assertion is guaranteed, since at a minimum the Python proxy class implements the method. If the method in question has been extended by a class derived from the proxy class, that extended implementation will execute exactly as it should. If not, the proxy class will route the method call into a C wrapper function, expecting that the method will be resolved in C++. The wrapper will call the virtual method of the C++ instance, and since the director extends this the call will end up right back in the director method. Now comes the "good reason not to" part. If the director method were to blindly call the Python method again, it would get stuck in an infinite loop. We avoid this situation by adding special code to the C wrapper function that tells the director method to not do this. The C wrapper function compares the pointer to the Python object that called the wrapper function to the pointer stored by the director. If these are the same, then the C wrapper function tells the director to resolve the method by calling up the C++ inheritance chain, preventing an infinite loop.

    One more point needs to be made about the relationship between director classes and proxy classes. When a proxy class instance is created in Python, SWIG creates an instance of the original C++ class and assigns it to .this. This is exactly what happens without directors and is true even if directors are enabled for the particular class in question. When a class derived from a proxy class is created, however, SWIG then creates an instance of the corresponding C++ director class. The reason for this difference is that user-defined subclasses may override or extend methods of the original class, so the director class is needed to route calls to these methods correctly. For unmodified proxy classes, all methods are ultimately implemented in C++ so there is no need for the extra overhead involved with routing the calls through Python.

    32.5.3 Ownership and object destruction

    Memory management issues are slightly more complicated with directors than for proxy classes alone. Python instances hold a pointer to the associated C++ director object, and the director in turn holds a pointer back to the Python object. By default, proxy classes own their C++ director object and take care of deleting it when they are garbage collected.

    This relationship can be reversed by calling the special __disown__() method of the proxy class. After calling this method, the .thisown flag is set to zero, and the director class increments the reference count of the Python object. When the director class is deleted it decrements the reference count. Assuming no outstanding references to the Python object remain, the Python object will be destroyed at the same time. This is a good thing, since directors and proxies refer to each other and so must be created and destroyed together. Destroying one without destroying the other will likely cause your program to segfault.

    To help ensure that no references to the Python object remain after calling __disown__(), this method returns a weak reference to the Python object. Weak references are only available in Python versions 2.1 and higher, so for older versions you must explicitly delete all references. Here is an example:

    class Foo {
    public:
      ...
    };
    class FooContainer {
    public:
      void addFoo(Foo *);
      ...
    };
    

    >>> c = FooContainer()
    >>> a = Foo().__disown__()
    >>> c.addFoo(a)
    >>> b = Foo()
    >>> b = b.__disown__()
    >>> c.addFoo(b)
    >>> c.addFoo(Foo().__disown__())
    

    In this example, we are assuming that FooContainer will take care of deleting all the Foo pointers it contains at some point. Note that no hard references to the Foo objects remain in Python.

    32.5.4 Exception unrolling

    With directors routing method calls to Python, and proxies routing them to C++, the handling of exceptions is an important concern. By default, the directors ignore exceptions that occur during method calls that are resolved in Python. To handle such exceptions correctly, it is necessary to temporarily translate them into C++ exceptions. This can be done with the %feature("director:except") directive. The following code should suffice in most cases:

    %feature("director:except") {
      if ($error != NULL) {
        throw Swig::DirectorMethodException();
      }
    }
    

    This code will check the Python error state after each method call from a director into Python, and throw a C++ exception if an error occurred. This exception can be caught in C++ to implement an error handler. Currently no information about the Python error is stored in the Swig::DirectorMethodException object, but this will likely change in the future.

    It may be the case that a method call originates in Python, travels up to C++ through a proxy class, and then back into Python via a director method. If an exception occurs in Python at this point, it would be nice for that exception to find its way back to the original caller. This can be done by combining a normal %exception directive with the director:except handler shown above. Here is an example of a suitable exception handler:

    %exception {
      try { $action }
      catch (Swig::DirectorException &e) { SWIG_fail; }
    }
    

    The class Swig::DirectorException used in this example is actually a base class of Swig::DirectorMethodException, so it will trap this exception. Because the Python error state is still set when Swig::DirectorMethodException is thrown, Python will register the exception as soon as the C wrapper function returns.

    32.5.5 Overhead and code bloat

    Enabling directors for a class will generate a new director method for every virtual method in the class' inheritance chain. This alone can generate a lot of code bloat for large hierarchies. Method arguments that require complex conversions to and from target language types can result in large director methods. For this reason it is recommended that you selectively enable directors only for specific classes that are likely to be extended in Python and used in C++.

    Compared to classes that do not use directors, the call routing in the director methods does add some overhead. In particular, at least one dynamic cast and one extra function call occurs per method call from Python. Relative to the speed of Python execution this is probably completely negligible. For worst case routing, a method call that ultimately resolves in C++ may take one extra detour through Python in order to ensure that the method does not have an extended Python implementation. This could result in a noticeable overhead in some cases.

    Although directors make it natural to mix native C++ objects with Python objects (as director objects) via a common base class pointer, one should be aware of the obvious fact that method calls to Python objects will be much slower than calls to C++ objects. This situation can be optimized by selectively enabling director methods (using the %feature directive) for only those methods that are likely to be extended in Python.

    32.5.6 Typemaps

    Typemaps for input and output of most of the basic types from director classes have been written. These are roughly the reverse of the usual input and output typemaps used by the wrapper code. The typemap operation names are 'directorin', 'directorout', and 'directorargout'. The director code does not currently use any of the other kinds of typemaps. It is not clear at this point which kinds are appropriate and need to be supported.

    32.5.7 Miscellaneous

    Director typemaps for STL classes are in place, and hence you should be able to use std::vector, std::string, etc., as you would any other type.

    Note: The director typemaps for return types based in const references, such as

    class Foo {
    …
      virtual const int& bar();
    …
    };
    

    will work only for simple call scenarios. Usually the resulting code is neither thread or reentrant safe. Hence, the user is advised to avoid returning const references in director methods. For example, the user could modify the method interface to use lvalue return types, wherever possible, for example

    class Foo {
    …
      virtual int bar();
    …
    };
    

    If that is not possible, the user should avoid enabling the director feature for reentrant, recursive or threaded member methods that return const references.

    32.6 Common customization features

    The last section presented the absolute basics of C/C++ wrapping. If you do nothing but feed SWIG a header file, you will get an interface that mimics the behavior described. However, sometimes this isn't enough to produce a nice module. Certain types of functionality might be missing or the interface to certain functions might be awkward. This section describes some common SWIG features that are used to improve your the interface to an extension module.

    32.6.1 C/C++ helper functions

    Sometimes when you create a module, it is missing certain bits of functionality. For example, if you had a function like this

    void set_transform(Image *im, double m[4][4]);
    

    it would be accessible from Python, but there may be no easy way to call it. For example, you might get errors like this:

    >>> a = [
    ...   [1, 0, 0, 0],
    ...   [0, 1, 0, 0],
    ...   [0, 0, 1, 0],
    ...   [0, 0, 0, 1]]
    >>> set_transform(im, a)
    Traceback (most recent call last):
      File "<stdin>", line 1, in ?
    TypeError: Type error. Expected _p_a_4__double
    

    The problem here is that there is no easy way to construct and manipulate a suitable double [4][4] value to use. To fix this, you can write some extra C helper functions. Just use the %inline directive. For example:

    %inline %{
    /* Note: double[4][4] is equivalent to a pointer to an array double (*)[4] */
    double (*new_mat44())[4] {
      return (double (*)[4]) malloc(16*sizeof(double));
    }
    void free_mat44(double (*x)[4]) {
      free(x);
    }
    void mat44_set(double x[4][4], int i, int j, double v) {
      x[i][j] = v;
    }
    double mat44_get(double x[4][4], int i, int j) {
      return x[i][j];
    }
    %}
    

    From Python, you could then write code like this:

    >>> a = new_mat44()
    >>> mat44_set(a, 0, 0, 1.0)
    >>> mat44_set(a, 1, 1, 1.0)
    >>> mat44_set(a, 2, 2, 1.0)
    ...
    >>> set_transform(im, a)
    >>>
    

    Admittedly, this is not the most elegant looking approach. However, it works and it wasn't too hard to implement. It is possible to clean this up using Python code, typemaps, and other customization features as covered in later sections.

    32.6.2 Adding additional Python code

    If writing support code in C isn't enough, it is also possible to write code in Python. This code gets inserted in to the .py file created by SWIG. One use of Python code might be to supply a high-level interface to certain functions. For example:

    void set_transform(Image *im, double x[4][4]);
    
    ...
    /* Rewrite the high level interface to set_transform */
    %pythoncode %{
    def set_transform(im, x):
        a = new_mat44()
        for i in range(4):
            for j in range(4):
                mat44_set(a, i, j, x[i][j])
        _example.set_transform(im, a)
        free_mat44(a)
    %}
    

    In this example, set_transform() provides a high-level Python interface built on top of low-level helper functions. For example, this code now seems to work:

    >>> a = [
    ...   [1, 0, 0, 0],
    ...   [0, 1, 0, 0],
    ...   [0, 0, 1, 0],
    ...   [0, 0, 0, 1]]
    >>> set_transform(im, a)
    >>>
    

    Admittedly, this whole scheme for wrapping the two-dimension array argument is rather ad-hoc. Besides, shouldn't a Python list or a Numeric Python array just work normally? We'll get to those examples soon enough. For now, think of this example as an illustration of what can be done without having to rely on any of the more advanced customization features.

    There is also %pythonbegin which is another directive very similar to %pythoncode, but generates the given Python code at the beginning of the .py file. This directive works in the same way as %pythoncode, except the code is copied just after the SWIG banner (comment) at the top of the file, before any real code. This provides an opportunity to add your own description in a comment near the top of the file as well as Python imports that have to appear at the top of the file, such as "from __future__ import" statements.

    The following example for Python 2.x shows how to insert code into the generated wrapper to enable print to be used as a Python3-compatible function instead of a statement:

    %pythonbegin %{
    # This module provides wrappers to the Whizz Bang library
    %}
    
    %pythonbegin %{
    from __future__ import print_function
    print("Loading", "Whizz", "Bang", sep=' ... ')
    %}
    

    The insert code can be seen at the start of the generated .py file:

    # This file was automatically generated by SWIG (http://www.swig.org).
    # Version 4.0.0
    #
    # Do not make changes to this file unless you know what you are doing--modify
    # the SWIG interface file instead.
    
    # This module provides wrappers to the Whizz Bang library
    
    from __future__ import print_function
    print("Loading", "Whizz", "Bang", sep=' ... ')
    
    

    When using %pythoncode and %pythonbegin you generally want to make sure that the block is delimited by %{ and %}. If you delimit it with { and } then any lines with a leading # will be handled by SWIG as preprocessor directives, when you probably meant them as Python comments. Prior to SWIG 3.0.3, invalid preprocessor directives were silently ignored, so generally using the wrong delimiters resulted in such comments not appearing in the generated output (though a comment starting with a valid preprocessor directive could cause problems, for example: # error handling). SWIG 3.0.3 and later report an error for invalid preprocessor directives, so you may have to update existing interface files to delimit blocks of Python code correctly.

    As an alternative to providing a block containing Python code, you can include Python code from a file. The code is inserted exactly as in the file, so this avoids any issues with the SWIG preprocessor. It's a good approach if you have a non-trivial chunk of Python code to insert. To use this feature you specify a filename in double quotes, for example:

    %pythoncode "somecode.py"
    

    Sometimes you may want to replace or modify the wrapper function that SWIG creates in the proxy .py file. The Python module in SWIG provides some features that enable you to do this. First, to entirely replace a proxy function you can use %feature("shadow"). For example:

    %module example
    
    // Rewrite bar() Python code
    
    %feature("shadow") Foo::bar(int) %{
    def bar(*args):
        #do something before
        $action
        #do something after
    %}
    
    class Foo {
    public:
      int bar(int x);
    };
    

    where $action will be replaced by the call to the C/C++ proper method.

    Often the proxy function created by SWIG is fine, but you simply want to add code to it without touching the rest of the generated function body. For these cases SWIG provides the pythonprepend and pythonappend features which do exactly as their names suggest. The pythonprepend feature will insert its value at the beginning of the proxy function, and pythonappend will insert code at the end of the proxy, just before the return statement.

    %module example
    
    // Add Python code to bar()
    
    %feature("pythonprepend") Foo::bar(int) %{
        #do something before C++ call
    %}
    
    %feature("pythonappend") Foo::bar(int) %{
        #do something after C++ call
        #the 'val' variable holds the return value
    %}
    
    
    class Foo {
    public:
      int bar(int x);
    };
    

    Notes: Usually the pythonappend and pythonprepend features are safer to use than the shadow feature. Also, from SWIG version 1.3.28 you can use the directive forms %pythonappend and %pythonprepend as follows:

    %module example
    
    // Add Python code to bar()
    
    %pythonprepend Foo::bar(int) %{
        #do something before C++ call
    %}
    
    %pythonappend Foo::bar(int) %{
        #do something after C++ call
        #the 'val' variable holds the return value
    %}
    
    
    class Foo {
    public:
      int bar(int x);
    };
    

    Note that when the underlying C++ method is overloaded, there is only one proxy Python method for multiple C++ methods. In this case, only one of parsed methods is examined for the feature. You are better off specifying the feature without the argument list to ensure it will get used, as it will then get attached to all the overloaded C++ methods. For example:

    %module example
    
    // Add Python code to bar()
    
    %pythonprepend Foo::bar %{
        #do something before C++ call
    %}
    
    %pythonappend Foo::bar %{
        #do something after C++ call
    %}
    
    
    class Foo {
    public:
      int bar(int x);
      int bar();
    };
    

    The same applies for overloaded constructors.

    32.6.3 Class extension with %extend

    One of the more interesting features of SWIG is that it can extend structures and classes with new methods--at least in the Python interface. Here is a simple example:

    %module example
    %{
    #include "someheader.h"
    %}
    
    struct Vector {
      double x, y, z;
    };
    
    %extend Vector {
      char *__str__() {
        static char tmp[1024];
        sprintf(tmp, "Vector(%g, %g, %g)", $self->x, $self->y, $self->z);
        return tmp;
      }
      Vector(double x, double y, double z) {
        Vector *v = (Vector *) malloc(sizeof(Vector));
        v->x = x;
        v->y = y;
        v->z = z;
        return v;
      }
    };
    

    Now, in Python

    >>> v = example.Vector(2, 3, 4)
    >>> print v
    Vector(2, 3, 4)
    >>>
    

    %extend can be used for many more tasks than this. For example, if you wanted to overload a Python operator, you might do this:

    %extend Vector {
      Vector __add__(Vector *other) {
        Vector v;
        v.x = $self->x + other->x;
        v.y = $self->y + other->y;
        v.z = $self->z + other->z;
        return v;
      }
    };
    

    Use it like this:

    >>> import example
    >>> v = example.Vector(2, 3, 4)
    >>> w = example.Vector(10, 11, 12)
    >>> print v+w
    Vector(12, 14, 16)
    >>>
    

    %extend works with both C and C++ code. It does not modify the underlying object in any way---the extensions only show up in the Python interface.

    32.6.4 Exception handling with %exception

    If a C or C++ function throws an error, you may want to convert that error into a Python exception. To do this, you can use the %exception directive. %exception simply lets you rewrite part of the generated wrapper code to include an error check.

    In C, a function often indicates an error by returning a status code (a negative number or a NULL pointer perhaps). Here is a simple example of how you might handle that:

    %exception malloc {
      $action
      if (!result) {
        PyErr_SetString(PyExc_MemoryError, "Not enough memory");
        SWIG_fail;
      }
    }
    void *malloc(size_t nbytes);
    

    In Python,

    >>> a = example.malloc(2000000000)
    Traceback (most recent call last):
      File "<stdin>", line 1, in ?
    MemoryError: Not enough memory
    >>>
    

    If a library provides some kind of general error handling framework, you can also use that. For example:

    %exception {
      $action
      if (err_occurred()) {
        PyErr_SetString(PyExc_RuntimeError, err_message());
        SWIG_fail;
      }
    }
    

    No declaration name is given to %exception, it is applied to all wrapper functions.

    C++ exceptions are also easy to handle. For example, you can write code like this:

    %exception getitem {
      try {
        $action
      } catch (std::out_of_range &e) {
        PyErr_SetString(PyExc_IndexError, const_cast<char*>(e.what()));
        SWIG_fail;
      }
    }
    
    class Base {
    public:
      Foo *getitem(int index);      // Exception handled added
      ...
    };
    

    When raising a Python exception from C, use the PyErr_SetString() function as shown above followed by SWIG_fail. The following exception types can be used as the first argument.

    PyExc_ArithmeticError
    PyExc_AssertionError
    PyExc_AttributeError
    PyExc_EnvironmentError
    PyExc_EOFError
    PyExc_Exception
    PyExc_FloatingPointError
    PyExc_ImportError
    PyExc_IndexError
    PyExc_IOError
    PyExc_KeyError
    PyExc_KeyboardInterrupt
    PyExc_LookupError
    PyExc_MemoryError
    PyExc_NameError
    PyExc_NotImplementedError
    PyExc_OSError
    PyExc_OverflowError
    PyExc_RuntimeError
    PyExc_StandardError
    PyExc_SyntaxError
    PyExc_SystemError
    PyExc_TypeError
    PyExc_UnicodeError
    PyExc_ValueError
    PyExc_ZeroDivisionError
    

    SWIG_fail is a C macro which when called within the context of SWIG wrapper function, will jump to the error handler code. This will call any cleanup code (freeing any temp variables) and then return from the wrapper function so that the Python interpreter can raise the Python exception. This macro should always be called after setting a Python error in code snippets, such as typemaps and %exception, that are ultimately generated into the wrapper function.

    The language-independent exception.i library file can also be used to raise exceptions. See the SWIG Library chapter.

    32.6.5 Optimization options

    32.6.5.1 -fastproxy

    The -fastproxy command line option enables faster method calling as the call is made directly into the C/C++ layer rather than going through a method wrapper.

    Consider wrapping a C++ class:

    struct Go {
      void callme0() {}
      void callme4(int a, int b, int c, int d) {}
      void callme8(double a, double b, double c, double d, double e, double f, double g, double i) {}
    };
    

    The default generated proxy class is:

    class Go(object):
        def callme0(self):
            return _example.Go_callme0(self)
    
        def callme4(self, a, b, c, d):
            return _example.Go_callme4(self, a, b, c, d)
    
        def callme8(self, a, b, c, d, e, f, g, i):
            return _example.Go_callme8(self, a, b, c, d, e, f, g, i)
        ...
    

    Each method in the Python class contains a Python proxy method which passes the arguments on to the underlying function in the low-level C/C++ module (_example in this case). The generated proxy class when using -fastproxy is:

    %module example
    class Go(object):
        callme0 = _swig_new_instance_method(_example.Go_callme0)
        callme4 = _swig_new_instance_method(_example.Go_callme4)
        callme8 = _swig_new_instance_method(_example.Go_callme8)
        ...
    

    where _swig_new_instance_method adds the method to the proxy class via C API calls for direct access to the underlying function in the low-level C/C++ module. Note that for some methods it is not possible to generate the direct access call and so -fastproxy is ignored. This happens, for example, when adding additional code to Python proxy methods, such as using %pythonprepend.

    The overhead calling into C/C++ from Python is reduced slightly using -fastproxy. Below are some timings in microseconds calling the 3 functions in the example above. Also included in the table for comparison is using the -builtin option covered in the Built-in Types.

    Method name Default -fastproxy -builtin
    callme0 0.15 0.09 0.07
    callme4 0.26 0.16 0.14
    callme8 0.32 0.20 0.17

    Although the -fastproxy option results in faster code over the default, the generated proxy code is not as user-friendly as docstring/doxygen comments and functions with default values are not visible in the generated Python proxy class. The -olddefs option can rectify this.

    The generated proxy class for the example above when using -fastproxy -olddefs is:

    class Go(object):
        def callme0(self):
            return _example.Go_callme0(self)
        callme0 = _swig_new_instance_method(_example.Go_callme0)
    
        def callme4(self, a, b, c, d):
            return _example.Go_callme4(self, a, b, c, d)
        callme4 = _swig_new_instance_method(_example.Go_callme4)
    
        def callme8(self, a, b, c, d, e, f, g, i):
            return _example.Go_callme8(self, a, b, c, d, e, f, g, i)
        callme8 = _swig_new_instance_method(_example.Go_callme8)
        ...
    

    The class defines each method in two different ways. The first definition is replaced by the second definition and so the second definition is the one used when the method is called. While this possibly provides the best of both worlds, the time to import the module will be slightly slower when the class is defined due to the additional method definitions.

    The command line options mentioned above also apply to wrapped C/C++ global functions, not just class methods.

    32.7 Tips and techniques

    Although SWIG is largely automatic, there are certain types of wrapping problems that require additional user input. Examples include dealing with output parameters, strings, binary data, and arrays. This chapter discusses the common techniques for solving these problems.

    32.7.1 Input and output parameters

    A common problem in some C programs is handling parameters passed as simple pointers. For example:

    void add(int x, int y, int *result) {
      *result = x + y;
    }
    

    or perhaps

    int sub(int *x, int *y) {
      return *x-*y;
    }
    

    The easiest way to handle these situations is to use the typemaps.i file. For example:

    %module example
    %include "typemaps.i"
    
    void add(int, int, int *OUTPUT);
    int  sub(int *INPUT, int *INPUT);
    

    In Python, this allows you to pass simple values. For example:

    >>> a = add(3, 4)
    >>> print a
    7
    >>> b = sub(7, 4)
    >>> print b
    3
    >>>
    

    Notice how the INPUT parameters allow integer values to be passed instead of pointers and how the OUTPUT parameter creates a return result.

    If you don't want to use the names INPUT or OUTPUT, use the %apply directive. For example:

    %module example
    %include "typemaps.i"
    
    %apply int *OUTPUT { int *result };
    %apply int *INPUT  { int *x, int *y};
    
    void add(int x, int y, int *result);
    int  sub(int *x, int *y);
    

    If a function mutates one of its parameters like this,

    void negate(int *x) {
      *x = -(*x);
    }
    

    you can use INOUT like this:

    %include "typemaps.i"
    ...
    void negate(int *INOUT);
    

    In Python, a mutated parameter shows up as a return value. For example:

    >>> a = negate(3)
    >>> print a
    -3
    >>>
    

    Note: Since most primitive Python objects are immutable, it is not possible to perform in-place modification of a Python object passed as a parameter.

    The most common use of these special typemap rules is to handle functions that return more than one value. For example, sometimes a function returns a result as well as a special error code:

    /* send message, return number of bytes sent, along with success code */
    int send_message(char *text, int len, int *success);
    

    To wrap such a function, simply use the OUTPUT rule above. For example:

    %module example
    %include "typemaps.i"
    %apply int *OUTPUT { int *success };
    ...
    int send_message(char *text, int *success);
    

    When used in Python, the function will return multiple values.

    bytes, success = send_message("Hello World")
    if not success:
        print "Whoa!"
    else:
        print "Sent", bytes
    

    Another common use of multiple return values are in query functions. For example:

    void get_dimensions(Matrix *m, int *rows, int *columns);
    

    To wrap this, you might use the following:

    %module example
    %include "typemaps.i"
    %apply int *OUTPUT { int *rows, int *columns };
    ...
    void get_dimensions(Matrix *m, int *rows, *columns);
    

    Now, in Python:

    >>> r, c = get_dimensions(m)
    

    Be aware that the primary purpose of the typemaps.i file is to support primitive datatypes. Writing a function like this

    void foo(Bar *OUTPUT);
    

    may not have the intended effect since typemaps.i does not define an OUTPUT rule for Bar.

    32.7.2 Simple pointers

    If you must work with simple pointers such as int * or double * and you don't want to use typemaps.i, consider using the cpointer.i library file. For example:

    %module example
    %include "cpointer.i"
    
    %inline %{
    extern void add(int x, int y, int *result);
    %}
    
    %pointer_functions(int, intp);
    

    The %pointer_functions(type, name) macro generates five helper functions that can be used to create, destroy, copy, assign, and dereference a pointer. In this case, the functions are as follows:

    int  *new_intp();
    int  *copy_intp(int *x);
    void  delete_intp(int *x);
    void  intp_assign(int *x, int value);
    int   intp_value(int *x);
    

    In Python, you would use the functions like this:

    >>> result = new_intp()
    >>> print result
    _108fea8_p_int
    >>> add(3, 4, result)
    >>> print intp_value(result)
    7
    >>>
    

    If you replace %pointer_functions() by %pointer_class(type, name), the interface is more class-like.

    >>> result = intp()
    >>> add(3, 4, result)
    >>> print result.value()
    7
    

    See the SWIG Library chapter for further details.

    32.7.3 Unbounded C Arrays

    Sometimes a C function expects an array to be passed as a pointer. For example,

    int sumitems(int *first, int nitems) {
      int i, sum = 0;
      for (i = 0; i < nitems; i++) {
        sum += first[i];
      }
      return sum;
    }
    

    To wrap this into Python, you need to pass an array pointer as the first argument. A simple way to do this is to use the carrays.i library file. For example:

    %include "carrays.i"
    %array_class(int, intArray);
    

    The %array_class(type, name) macro creates wrappers for an unbounded array object that can be passed around as a simple pointer like int * or double *. For instance, you will be able to do this in Python:

    >>> a = intArray(10000000)         # Array of 10-million integers
    >>> for i in xrange(10000):        # Set some values
    ...     a[i] = i
    >>> sumitems(a, 10000)
    49995000
    >>>
    

    The array "object" created by %array_class() does not encapsulate pointers inside a special array object. In fact, there is no bounds checking or safety of any kind (just like in C). Because of this, the arrays created by this library are extremely low-level indeed. You can't iterate over them nor can you even query their length. In fact, any valid memory address can be accessed if you want (negative indices, indices beyond the end of the array, etc.). Needless to say, this approach is not going to suit all applications. On the other hand, this low-level approach is extremely efficient and well suited for applications in which you need to create buffers, package binary data, etc.

    32.7.4 String handling

    If a C function has an argument of char *, then a Python string can be passed as input. For example:

    // C
    void foo(char *s);
    
    # Python
    >>> foo("Hello")
    

    When a Python string is passed as a parameter, the C function receives a pointer to the raw data contained in the string. Since Python strings are immutable, it is illegal for your program to change the value. In fact, doing so will probably crash the Python interpreter.

    If your program modifies the input parameter or uses it to return data, consider using the cstring.i library file described in the SWIG Library chapter.

    When functions return a char *, it is assumed to be a NULL-terminated string. Data is copied into a new Python string and returned.

    If your program needs to work with binary data, you can use a typemap to expand a Python string into a pointer/length argument pair. As luck would have it, just such a typemap is already defined. Just do this:

    %apply (char *STRING, int LENGTH) { (char *data, int size) };
    ...
    int parity(char *data, int size, int initial);
    

    Now in Python:

    >>> parity("e\x09ffss\x00\x00\x01\nx", 0)
    

    If you need to return binary data, you might use the cstring.i library file. The cdata.i library can also be used to extra binary data from arbitrary pointers.

    32.7.5 Default arguments

    C++ default argument code generation is documented in the main Default arguments section. There is also an optional Python specific feature that can be used called the python:cdefaultargs feature flag. By default, SWIG attempts to convert C++ default argument values into Python values and generates code into the Python layer containing these values. For example:

    struct CDA {
      int fff(int a = 1, bool b = false);
    };
    

    From Python this can be called as follows:

    >>> CDA().fff()        # C++ layer receives a=1 and b=false
    >>> CDA().fff(2)       # C++ layer receives a=2 and b=false
    >>> CDA().fff(3, True) # C++ layer receives a=3 and b=true
    

    The default code generation in the Python layer is:

    class CDA(object):
        ...
        def fff(self, a=1, b=False):
            return _default_args.CDA_fff(self, a, b)
    

    Adding the feature:

    %feature("python:cdefaultargs") CDA::fff;
    struct CDA {
      int fff(int a = 1, bool b = false);
    

    results in identical behaviour when called from Python, however, it results in different code generation:

    class CDA(object):
        ...
        def fff(self, *args):
            return _default_args.CDA_fff(self, *args)
    

    The default arguments are obtained in the C++ wrapper layer instead of the Python layer. Some code generation modes are quite different, eg -builtin and -fastproxy, and are unaffected by python:cdefaultargs as the default values are always obtained from the C++ layer.

    Note that not all default arguments can be converted into a Python equivalent. When SWIG does not convert them, it will generate code to obtain them from the C++ layer as if python:cdefaultargs was specified. This will happen if just one argument cannot be converted into a Python equivalent. This occurs typically when the argument is not fully numeric, such as int(1):

    struct CDA {
      int fff(int a = int(1), bool b = false);
    };
    

    Compatibility Note: SWIG-3.0.6 introduced the python:cdefaultargs feature. Versions of SWIG prior to this varied in their ability to convert C++ default values into equivalent Python default argument values.

    32.8 Typemaps

    This section describes how you can modify SWIG's default wrapping behavior for various C/C++ datatypes using the %typemap directive. This is an advanced topic that assumes familiarity with the Python C API as well as the material in the "Typemaps" chapter.

    Before proceeding, it should be stressed that typemaps are not a required part of using SWIG---the default wrapping behavior is enough in most cases. Typemaps are only used if you want to change some aspect of the primitive C-Python interface or if you want to elevate your guru status.

    32.8.1 What is a typemap?

    A typemap is nothing more than a code generation rule that is attached to a specific C datatype. For example, to convert integers from Python to C, you might define a typemap like this:

    %module example
    
    %typemap(in) int {
      $1 = (int) PyLong_AsLong($input);
      printf("Received an integer : %d\n", $1);
    }
    %inline %{
    extern int fact(int n);
    %}
    

    Typemaps are always associated with some specific aspect of code generation. In this case, the "in" method refers to the conversion of input arguments to C/C++. The datatype int is the datatype to which the typemap will be applied. The supplied C code is used to convert values. In this code a number of special variable prefaced by a $ are used. The $1 variable is placeholder for a local variable of type int. The $input variable is the input object of type PyObject *.

    When this example is compiled into a Python module, it operates as follows:

    >>> from example import *
    >>> fact(6)
    Received an integer : 6
    720
    

    In this example, the typemap is applied to all occurrences of the int datatype. You can refine this by supplying an optional parameter name. For example:

    %module example
    
    %typemap(in) int nonnegative {
      $1 = (int) PyLong_AsLong($input);
      if ($1 < 0) {
        PyErr_SetString(PyExc_ValueError, "Expected a nonnegative value.");
        SWIG_fail;
      }
    }
    %inline %{
    extern int fact(int nonnegative);
    %}
    

    In this case, the typemap code is only attached to arguments that exactly match int nonnegative.

    The application of a typemap to specific datatypes and argument names involves more than simple text-matching--typemaps are fully integrated into the SWIG C++ type-system. When you define a typemap for int, that typemap applies to int and qualified variations such as const int. In addition, the typemap system follows typedef declarations. For example:

    %typemap(in) int n {
      $1 = (int) PyLong_AsLong($input);
      printf("n = %d\n", $1);
    }
    %inline %{
    typedef int Integer;
    extern int fact(Integer n);    // Above typemap is applied
    %}
    

    Typemaps can also be defined for groups of consecutive arguments. For example:

    %typemap(in) (char *str, int len) {
      $1 = PyString_AsString($input);
      $2 = PyString_Size($input);
    };
    
    int count(char c, char *str, int len);
    

    When a multi-argument typemap is defined, the arguments are always handled as a single Python object. This allows the function to be used like this (notice how the length parameter is omitted):

    >>> example.count('e', 'Hello World')
    1
    >>>
    

    32.8.2 Python typemaps

    The previous section illustrated an "in" typemap for converting Python objects to C. A variety of different typemap methods are defined by the Python module. For example, to convert a C integer back into a Python object, you might define an "out" typemap like this:

    %typemap(out) int {
        $result = PyInt_FromLong((long) $1);
    }
    

    A detailed list of available methods can be found in the "Typemaps" chapter.

    However, the best source of typemap information (and examples) is probably the Python module itself. In fact, all of SWIG's default type handling is defined by typemaps. You can view these typemaps by looking at the files in the SWIG library. Just take into account that in the latest versions of swig (1.3.22+), the library files are not very pristine clear for the casual reader, as they used to be. The extensive use of macros and other ugly techniques in the latest version produce a very powerful and consistent Python typemap library, but at the cost of simplicity and pedagogic value.

    To learn how to write a simple or your first typemap, you better take a look at the SWIG library version 1.3.20 or so.

    32.8.3 Typemap variables

    Within typemap code, a number of special variables prefaced with a $ may appear. A full list of variables can be found in the "Typemaps" chapter. This is a list of the most common variables:

    $1

    A C local variable corresponding to the actual type specified in the %typemap directive. For input values, this is a C local variable that's supposed to hold an argument value. For output values, this is the raw result that's supposed to be returned to Python.

    $input

    A PyObject * holding a raw Python object with an argument or variable value.

    $result

    A PyObject * that holds the result to be returned to Python.

    $1_name

    The parameter name that was matched.

    $1_type

    The actual C datatype matched by the typemap.

    $1_ltype

    An assignable version of the datatype matched by the typemap (a type that can appear on the left-hand-side of a C assignment operation). This type is stripped of qualifiers and may be an altered version of $1_type. All arguments and local variables in wrapper functions are declared using this type so that their values can be properly assigned.

    $symname

    The Python name of the wrapper function being created.

    32.8.4 Useful Python Functions

    When you write a typemap, you usually have to work directly with Python objects. The following functions may prove to be useful.

    Python Integer Functions

    PyObject *PyInt_FromLong(long l);
    long      PyInt_AsLong(PyObject *);
    int       PyInt_Check(PyObject *);
    

    Python Floating Point Functions

    PyObject *PyFloat_FromDouble(double);
    double    PyFloat_AsDouble(PyObject *);
    int       PyFloat_Check(PyObject *);
    

    Python String Functions

    PyObject *PyString_FromString(char *);
    PyObject *PyString_FromStringAndSize(char *, lint len);
    int       PyString_Size(PyObject *);
    char     *PyString_AsString(PyObject *);
    int       PyString_Check(PyObject *);
    

    Python List Functions

    PyObject *PyList_New(int size);
    int       PyList_Size(PyObject *list);
    PyObject *PyList_GetItem(PyObject *list, int i);
    int       PyList_SetItem(PyObject *list, int i, PyObject *item);
    int       PyList_Insert(PyObject *list, int i, PyObject *item);
    int       PyList_Append(PyObject *list, PyObject *item);
    PyObject *PyList_GetSlice(PyObject *list, int i, int j);
    int       PyList_SetSlice(PyObject *list, int i, int , PyObject *list2);
    int       PyList_Sort(PyObject *list);
    int       PyList_Reverse(PyObject *list);
    PyObject *PyList_AsTuple(PyObject *list);
    int       PyList_Check(PyObject *);
    

    Python Tuple Functions

    PyObject *PyTuple_New(int size);
    int       PyTuple_Size(PyObject *);
    PyObject *PyTuple_GetItem(PyObject *, int i);
    int       PyTuple_SetItem(PyObject *, int i, PyObject *item);
    PyObject *PyTuple_GetSlice(PyObject *t, int i, int j);
    int       PyTuple_Check(PyObject *);
    

    Python Dictionary Functions

    PyObject *PyDict_New();
    int       PyDict_Check(PyObject *);
    int       PyDict_SetItem(PyObject *p, PyObject *key, PyObject *val);
    int       PyDict_SetItemString(PyObject *p, const char *key, PyObject *val);
    int       PyDict_DelItem(PyObject *p, PyObject *key);
    int       PyDict_DelItemString(PyObject *p, char *key);
    PyObject* PyDict_Keys(PyObject *p);
    PyObject* PyDict_Values(PyObject *p);
    PyObject* PyDict_GetItem(PyObject *p, PyObject *key);
    PyObject* PyDict_GetItemString(PyObject *p, const char *key);
    int       PyDict_Next(PyObject *p, Py_ssize_t *ppos, PyObject **pkey, PyObject **pvalue);
    Py_ssize_t PyDict_Size(PyObject *p);
    int       PyDict_Update(PyObject *a, PyObject *b);
    int       PyDict_Merge(PyObject *a, PyObject *b, int override);
    PyObject* PyDict_Items(PyObject *p);
    

    Python File Conversion Functions

    PyObject *PyFile_FromFile(FILE *f);
    FILE     *PyFile_AsFile(PyObject *);
    int       PyFile_Check(PyObject *);
    

    Abstract Object Interface

    write me
    

    32.9 Typemap Examples

    This section includes a few examples of typemaps. For more examples, you might look at the files "python.swg" and "typemaps.i" in the SWIG library.

    32.9.1 Converting Python list to a char **

    A common problem in many C programs is the processing of command line arguments, which are usually passed in an array of NULL terminated strings. The following SWIG interface file allows a Python list object to be used as a char ** object.

    %module argv
    
    // This tells SWIG to treat char ** as a special case
    %typemap(in) char ** {
      /* Check if is a list */
      if (PyList_Check($input)) {
        int size = PyList_Size($input);
        int i = 0;
        $1 = (char **) malloc((size+1)*sizeof(char *));
        for (i = 0; i < size; i++) {
          PyObject *o = PyList_GetItem($input, i);
          if (PyString_Check(o)) {
            $1[i] = PyString_AsString(PyList_GetItem($input, i));
          } else {
            free($1);
            PyErr_SetString(PyExc_TypeError, "list must contain strings");
            SWIG_fail;
          }
        }
        $1[i] = 0;
      } else {
        PyErr_SetString(PyExc_TypeError, "not a list");
        SWIG_fail;
      }
    }
    
    // This cleans up the char ** array we malloc'd before the function call
    %typemap(freearg) char ** {
      free((char *) $1);
    }
    
    // Now a test function
    %inline %{
    int print_args(char **argv) {
      int i = 0;
      while (argv[i]) {
        printf("argv[%d] = %s\n", i, argv[i]);
        i++;
      }
      return i;
    }
    %}
    
    

    When this module is compiled, the wrapped C function now operates as follows :

    >>> from argv import *
    >>> print_args(["Dave", "Mike", "Mary", "Jane", "John"])
    argv[0] = Dave
    argv[1] = Mike
    argv[2] = Mary
    argv[3] = Jane
    argv[4] = John
    5
    

    In the example, two different typemaps are used. The "in" typemap is used to receive an input argument and convert it to a C array. Since dynamic memory allocation is used to allocate memory for the array, the "freearg" typemap is used to later release this memory after the execution of the C function.

    32.9.2 Expanding a Python object into multiple arguments

    Suppose that you had a collection of C functions with arguments such as the following:

    int foo(int argc, char **argv);
    

    In the previous example, a typemap was written to pass a Python list as the char **argv. This allows the function to be used from Python as follows:

    >>> foo(4, ["foo", "bar", "spam", "1"])
    

    Although this works, it's a little awkward to specify the argument count. To fix this, a multi-argument typemap can be defined. This is not very difficult--you only have to make slight modifications to the previous example:

    %typemap(in) (int argc, char **argv) {
      /* Check if is a list */
      if (PyList_Check($input)) {
        int i;
        $1 = PyList_Size($input);
        $2 = (char **) malloc(($1+1)*sizeof(char *));
        for (i = 0; i < $1; i++) {
          PyObject *o = PyList_GetItem($input, i);
          if (PyString_Check(o)) {
            $2[i] = PyString_AsString(PyList_GetItem($input, i));
          } else {
            free($2);
            PyErr_SetString(PyExc_TypeError, "list must contain strings");
            SWIG_fail;
          }
        }
        $2[i] = 0;
      } else {
        PyErr_SetString(PyExc_TypeError, "not a list");
        SWIG_fail;
      }
    }
    
    %typemap(freearg) (int argc, char **argv) {
      free((char *) $2);
    }
    

    When writing a multiple-argument typemap, each of the types is referenced by a variable such as $1 or $2. The typemap code simply fills in the appropriate values from the supplied Python object.

    With the above typemap in place, you will find it no longer necessary to supply the argument count. This is automatically set by the typemap code. For example:

    >>> foo(["foo", "bar", "spam", "1"])
    

    If your function is overloaded in C++, for example:

    int foo(int argc, char **argv);
    int foo();
    

    don't forget to also provide a suitable typecheck typemap for overloading such as:

    %typecheck(SWIG_TYPECHECK_STRING_ARRAY) (int argc, char **argv) {
      $1 = PyList_Check($input) ? 1 : 0;
    }
    

    If you don't you'll get an error message along the lines of:

    Traceback (most recent call last):
      File "runme.py", line 3, in >module<
        example.foo(["foo", "bar", "spam", "1"])
    TypeError: Wrong number or type of arguments for overloaded function 'foo'.
      Possible C/C++ prototypes are:
        foo(int, char **)
        foo()
    

    32.9.3 Using typemaps to return arguments

    A common problem in some C programs is that values may be returned in arguments rather than in the return value of a function. For example:

    /* Returns a status value and two values in out1 and out2 */
    int spam(double a, double b, double *out1, double *out2) {
      ... Do a bunch of stuff ...
      *out1 = result1;
      *out2 = result2;
      return status;
    }
    

    A typemap can be used to handle this case as follows :

    %module outarg
    
    // This tells SWIG to treat an double * argument with name 'OutValue' as
    // an output value.  We'll append the value to the current result which
    // is guaranteed to be a List object by SWIG.
    
    %typemap(argout) double *OutValue {
      PyObject *o, *o2, *o3;
      o = PyFloat_FromDouble(*$1);
      if ((!$result) || ($result == Py_None)) {
        $result = o;
      } else {
        if (!PyTuple_Check($result)) {
          PyObject *o2 = $result;
          $result = PyTuple_New(1);
          PyTuple_SetItem($result, 0, o2);
        }
        o3 = PyTuple_New(1);
        PyTuple_SetItem(o3, 0, o);
        o2 = $result;
        $result = PySequence_Concat(o2, o3);
        Py_DECREF(o2);
        Py_DECREF(o3);
      }
    }
    
    int spam(double a, double b, double *OutValue, double *OutValue);
    
    

    The typemap works as follows. First, a check is made to see if any previous result exists. If so, it is turned into a tuple and the new output value is concatenated to it. Otherwise, the result is returned normally. For the sample function spam(), there are three output values--meaning that the function will return a 3-tuple of the results.

    As written, the function must accept 4 arguments as input values, last two being pointers to doubles. If these arguments are only used to hold output values (and have no meaningful input value), an additional typemap can be written. For example:

    %typemap(in, numinputs=0) double *OutValue(double temp) {
      $1 = &temp;
    }
    
    

    By specifying numinputs=0, the input value is ignored. However, since the argument still has to be set to some meaningful value before calling C, it is set to point to a local variable temp. When the function stores its output value, it will simply be placed in this local variable. As a result, the function can now be used as follows:

    >>> a = spam(4, 5)
    >>> print a
    (0, 2.45, 5.0)
    >>> x, y, z = spam(4, 5)
    >>>
    

    32.9.4 Mapping Python tuples into small arrays

    In some applications, it is sometimes desirable to pass small arrays of numbers as arguments. For example :

    extern void set_direction(double a[4]);       // Set direction vector
    

    This too, can be handled used typemaps as follows :

    // Grab a 4 element array as a Python 4-tuple
    %typemap(in) double[4](double temp[4]) {   // temp[4] becomes a local variable
      int i;
      if (PyTuple_Check($input)) {
        if (!PyArg_ParseTuple($input, "dddd", temp, temp+1, temp+2, temp+3)) {
          PyErr_SetString(PyExc_TypeError, "tuple must have 4 elements");
          SWIG_fail;
        }
        $1 = &temp[0];
      } else {
        PyErr_SetString(PyExc_TypeError, "expected a tuple.");
        SWIG_fail;
      }
    }
    
    

    This allows our set_direction function to be called from Python as follows :

    >>> set_direction((0.5, 0.0, 1.0, -0.25))
    

    Since our mapping copies the contents of a Python tuple into a C array, such an approach would not be recommended for huge arrays, but for small structures, this approach works fine.

    32.9.5 Mapping sequences to C arrays

    Suppose that you wanted to generalize the previous example to handle C arrays of different sizes. To do this, you might write a typemap as follows:

    // Map a Python sequence into any sized C double array
    %typemap(in) double[ANY](double temp[$1_dim0]) {
      int i;
      if (!PySequence_Check($input)) {
        PyErr_SetString(PyExc_TypeError, "Expecting a sequence");
        SWIG_fail;
      }
      if (PyObject_Length($input) != $1_dim0) {
        PyErr_SetString(PyExc_ValueError, "Expecting a sequence with $1_dim0 elements");
        SWIG_fail;
      }
      for (i =0; i < $1_dim0; i++) {
        PyObject *o = PySequence_GetItem($input, i);
        if (!PyFloat_Check(o)) {
          Py_XDECREF(o);
          PyErr_SetString(PyExc_ValueError, "Expecting a sequence of floats");
          SWIG_fail;
        }
        temp[i] = PyFloat_AsDouble(o);
        Py_DECREF(o);
      }
      $1 = &temp[0];
    }
    

    In this case, the variable $1_dim0 is expanded to match the array dimensions actually used in the C code. This allows the typemap to be applied to types such as:

    void foo(double x[10]);
    void bar(double a[4], double b[8]);
    

    Since the above typemap code gets inserted into every wrapper function where used, it might make sense to use a helper function instead. This will greatly reduce the amount of wrapper code. For example:

    %{
    static int convert_darray(PyObject *input, double *ptr, int size) {
      int i;
      if (!PySequence_Check(input)) {
        PyErr_SetString(PyExc_TypeError, "Expecting a sequence");
        return 0;
      }
      if (PyObject_Length(input) != size) {
        PyErr_SetString(PyExc_ValueError, "Sequence size mismatch");
        return 0;
      }
      for (i =0; i < size; i++) {
        PyObject *o = PySequence_GetItem(input, i);
        if (!PyFloat_Check(o)) {
          Py_XDECREF(o);
          PyErr_SetString(PyExc_ValueError, "Expecting a sequence of floats");
          return 0;
        }
        ptr[i] = PyFloat_AsDouble(o);
        Py_DECREF(o);
      }
      return 1;
    }
    %}
    
    %typemap(in) double [ANY](double temp[$1_dim0]) {
      if (!convert_darray($input, temp, $1_dim0)) {
        SWIG_fail;
      }
      $1 = &temp[0];
    }
    

    32.9.6 Pointer handling

    Occasionally, it might be necessary to convert pointer values that have been stored using the SWIG typed-pointer representation. Since there are several ways in which pointers can be represented, the following two functions are used to safely perform this conversion:

    int SWIG_ConvertPtr(PyObject *obj, void **ptr, swig_type_info *ty, int flags)

    Converts a Python object obj to a C pointer. The result of the conversion is placed into the pointer located at ptr. ty is a SWIG type descriptor structure. flags is used to handle error checking and other aspects of conversion. It is the bitwise-or of several flag values including SWIG_POINTER_EXCEPTION and SWIG_POINTER_DISOWN. The first flag makes the function raise an exception on type error. The second flag additionally steals ownership of an object. Returns 0 on success and -1 on error.

    PyObject *SWIG_NewPointerObj(void *ptr, swig_type_info *ty, int own)

    Creates a new Python pointer object. ptr is the pointer to convert, ty is the SWIG type descriptor structure that describes the type, and own is a flag that indicates whether or not Python should take ownership of the pointer.

    Both of these functions require the use of a special SWIG type-descriptor structure. This structure contains information about the mangled name of the datatype, type-equivalence information, as well as information about converting pointer values under C++ inheritance. For a type of Foo *, the type descriptor structure is usually accessed as follows:

    Foo *f;
    if (!SWIG_IsOK(SWIG_ConvertPtr($input, (void **) &f, SWIGTYPE_p_Foo, 0))) {
      SWIG_exception_fail(SWIG_TypeError, "in method '$symname', expecting type Foo");
    }
    
    PyObject *obj;
    obj = SWIG_NewPointerObj(f, SWIGTYPE_p_Foo, 0);
    

    In a typemap, the type descriptor should always be accessed using the special typemap variable $1_descriptor. For example:

    %typemap(in) Foo * {
      if (!SWIG_IsOK(SWIG_ConvertPtr($input, (void **) &$1, $1_descriptor, 0))) {
        SWIG_exception_fail(SWIG_TypeError, "in method '$symname', expecting type Foo");
      }
    }
    

    If necessary, the descriptor for any type can be obtained using the $descriptor() macro in a typemap. For example:

    %typemap(in) Foo * {
      if (!SWIG_IsOK(SWIG_ConvertPtr($input, (void **) &$1, $descriptor(Foo *), 0))) {
        SWIG_exception_fail(SWIG_TypeError, "in method '$symname', expecting type Foo");
      }
    }
    

    Although the pointer handling functions are primarily intended for manipulating low-level pointers, both functions are fully aware of Python proxy classes. Specifically, SWIG_ConvertPtr() will retrieve a pointer from any object that has a this attribute. In addition, SWIG_NewPointerObj() can automatically generate a proxy class object (if applicable).

    32.9.7 Memory management when returning references to member variables

    This example shows how to prevent premature garbage collection of objects when the underlying C++ class returns a pointer or reference to a member variable. The example is a direct equivalent to this Java equivalent.

    Consider the following C++ code:

    #include <iostream>
    struct Wheel {
      int size;
      Wheel(int sz = 0) : size(sz) {}
      ~Wheel() { std::cout << "~Wheel" << std::endl; }
    };
    
    class Bike {
      Wheel wheel;
    public:
      Bike(int val) : wheel(val) {}
      Wheel& getWheel() { return wheel; }
    };
    

    and the following usage from Python after running the code through SWIG:

    bike = Bike(10)
    wheel = bike.getWheel()
    print("wheel size: {}".format(wheel.size))
    
    del bike  # Allow bike to be garbage collected
    print("wheel size: {}".format(wheel.size))
    

    Don't be surprised that if the resulting output gives strange results such as...

    wheel size: 10
    ~Wheel
    wheel size: 135019664
    

    What has happened here is the garbage collector has collected the Bike instance as it doesn't think it is needed any more. The proxy instance, wheel, contains a reference to memory that was deleted when the Bike instance was collected. In order to prevent the garbage collector from collecting the Bike instance, a reference to the Bike must be added to the wheel instance.

    You can do this by adding the reference when the getWheel() method is called using one of three approaches:

    The easier, but less optimized, way is to use the %pythonappend directive (see Adding additional Python code):

    %pythonappend getWheel %{
      # val is the Wheel proxy, self is the Bike instance
      val.__bike_reference = self
    %}
    

    The code gets appended to the Python code generated for the Bike::getWheel wrapper function, where we store the Bike proxy instance onto the Wheel proxy instance before it is returned to the caller as follows.

    class Bike(object):
        ...
        def getWheel(self):
            val = _example.Bike_getWheel(self)
    
            # val is the Wheel proxy, self is the Bike instance
            val.__bike_reference = self
    
            return val
    

    The second option, which performs better and is required if you use the -builtin option, is to set the reference in the CPython implementation:

    %extend Wheel {
    // A reference to the parent class is added to ensure the underlying C++
    // object is not deleted while the item is in use
    %typemap(ret) Wheel& getWheel {
      PyObject *bike_reference_string = SWIG_Python_str_FromChar("__bike_reference");
      PyObject_SetAttr($result, bike_reference_string, $self);
      Py_DecRef(bike_reference_string);
    }
    }
    

    The third approach, shown below, is an optimization of the above approach and creates the "__bike_reference" Python string object just once. While this looks more complex, it is just a small variation on the above typemap plus a support function bike_reference() in a fragment called bike_reference_function. The bike_reference_init typemap generates code into the "init" section for an initial call to bike_reference() when the module is initialized and is done to create the "__bike_reference" Python string singleton in a thread-safe manner.

    %fragment("bike_reference_init", "init") {
      // Thread-safe initialization - initialize during Python module initialization
      bike_reference();
    }
    
    %fragment("bike_reference_function", "header", fragment="bike_reference_init") {
    
    static PyObject *bike_reference() {
      static PyObject *bike_reference_string = SWIG_Python_str_FromChar("__bike_reference");
      return bike_reference_string;
    }
    
    }
    
    %extend Wheel {
    // A reference to the parent class is added to ensure the underlying C++
    // object is not deleted while the item is in use
    %typemap(ret, fragment="bike_reference_function") Wheel& getWheel %{
      PyObject_SetAttr($result, bike_reference(), $self);
    %}
    }
    

    32.10 Docstring Features

    Using docstrings in Python code is becoming more and more important and more tools are coming on the scene that take advantage of them, everything from full-blown documentation generators to class browsers and popup call-tips in Python-aware IDEs. Given the way that SWIG generates the proxy code by default, your users will normally get something like "function_name(*args)" in the popup calltip of their IDE which is next to useless when the real function prototype might be something like this:

    bool function_name(int x, int y, Foo* foo=NULL, Bar* bar=NULL);
    

    The features described in this section make it easy for you to add docstrings to your modules, functions and methods that can then be used by the various tools out there to make the programming experience of your users much simpler.

    32.10.1 Module docstring

    Python allows a docstring at the beginning of the .py file before any other statements, and it is typically used to give a general description of the entire module. SWIG supports this by setting an option of the %module directive. For example:

    %module(docstring="This is the example module's docstring") example
    

    When you have more than just a line or so then you can retain the easy readability of the %module directive by using a macro. For example:

    %define DOCSTRING
    "The `XmlResource` class allows program resources defining menus,
    layout of controls on a panel, etc. to be loaded from an XML file."
    %enddef
    
    %module(docstring=DOCSTRING) xrc
    

    32.10.2 %feature("autodoc")

    As alluded to above SWIG will generate all the function and method proxy wrappers with just "*args" (or "*args, **kwargs" if the -keyword option is used) for a parameter list and will then sort out the individual parameters in the C wrapper code. This is nice and simple for the wrapper code, but makes it difficult to be programmer and tool friendly as anyone looking at the .py file will not be able to find out anything about the parameters that the functions accept.

    But since SWIG does know everything about the function it is possible to generate a docstring containing the parameter types, names and default values. Since many of the docstring tools are adopting a standard of recognizing if the first thing in the docstring is a function prototype then using that instead of what they found from introspection, then life is good once more.

    SWIG's Python module provides support for the "autodoc" feature, which when attached to a node in the parse tree will cause a docstring to be generated that includes the name of the function, parameter names, default values if any, and return type if any. There are also four levels for autodoc controlled by the value given to the feature, %feature("autodoc", "level"). The four values for level are covered in the following sub-sections.

    32.10.2.1 %feature("autodoc", "0")

    When level "0" is used then the types of the parameters will not be included in the autodoc string. For example, given this function prototype:

    %feature("autodoc", "0");
    bool function_name(int x, int y, Foo* foo=NULL, Bar* bar=NULL);
    

    Then Python code like this will be generated:

    def function_name(*args, **kwargs):
        """function_name(x, y, foo=None, bar=None) -> bool"""
        ...
    

    32.10.2.2 %feature("autodoc", "1")

    When level "1" is used then the parameter types will be used in the autodoc string. In addition, an attempt is made to simplify the type name such that it makes more sense to the Python user. Pointer, reference and const info is removed if the associated type is has an associated Python type (%rename's are thus shown correctly). This works most of the time, otherwise a C/C++ type will be used. See the next section for the "docstring" feature for tweaking the docstrings to your liking. Given the example above, then turning on the parameter types with level "1" will result in Python code like this:

    def function_name(*args, **kwargs):
        """function_name(int x, int y, Foo foo=None, Bar bar=None) -> bool"""
        ...
    

    32.10.2.3 %feature("autodoc", "2")

    Level "2" results in the function prototype as per level "0". In addition, a line of documentation is generated for each parameter using numpydoc style. Using the previous example, the generated code will be:

    def function_name(*args, **kwargs):
        """
        function_name(x, y, foo=None, bar=None) -> bool
    
        Parameters
        ----------
        x: int
        y: int
        foo: Foo *
        bar: Bar *
    
        """
        ...
    

    Note that the documentation for each parameter is sourced from the "doc" typemap which by default shows the C/C++ type rather than the simplified Python type name described earlier for level "1". Typemaps can of course change the output for any particular type, for example the int x parameter:

    %feature("autodoc", "2");
    %typemap("doc") int x "$1_name (C++ type: $1_type) -- Input $1_name dimension"
    bool function_name(int x, int y, Foo* foo=NULL, Bar* bar=NULL);
    

    resulting in

    def function_name(*args, **kwargs):
        """
        function_name(x, y, foo=None, bar=None) -> bool
    
        Parameters
        ----------
        x (C++ type: int) -- Input x dimension
        y: int
        foo: Foo *
        bar: Bar *
    
        """
    

    32.10.2.4 %feature("autodoc", "3")

    Level "3" results in the function prototype as per level "1" but also contains the same additional line of documentation for each parameter as per level "2". Using our earlier example again, the generated code will be:

    def function_name(*args, **kwargs):
        """
        function_name(int x, int y, Foo foo=None, Bar bar=None) -> bool
    
        Parameters
        ----------
        x: int
        y: int
        foo: Foo *
        bar: Bar *
    
        """
        ...
    

    32.10.2.5 %feature("autodoc", "docstring")

    Finally, there are times when the automatically generated autodoc string will make no sense for a Python programmer, particularly when a typemap is involved. So if you give an explicit value for the autodoc feature then that string will be used in place of the automatically generated string. For example:

    %feature("autodoc", "GetPosition() -> (x, y)") GetPosition;
    void GetPosition(int* OUTPUT, int* OUTPUT);
    

    32.10.3 %feature("docstring")

    In addition to the autodoc strings described above, you can also attach any arbitrary descriptive text to a node in the parse tree with the "docstring" feature. When the proxy module is generated then any docstring associated with classes, function or methods are output. If an item already has an autodoc string then it is combined with the docstring and they are output together. If the docstring is all on a single line then it is output like this::

    """This is the docstring"""
    

    Otherwise, to aid readability it is output like this:

    """
    This is a multi-line docstring
    with more than one line.
    """
    

    32.11 Python Packages

    Python has concepts of modules and packages. Modules are separate units of code and may be grouped together to form a package. Packages may be nested, that is they may contain subpackages. This leads to tree-like hierarchy, with packages as intermediate nodes and modules as leaf nodes.

    The hierarchy of Python packages/modules follows the hierarchy of *.py files found in a source tree (or, more generally, in the Python path). Normally, the developer creates new module by placing a *.py file somewhere under Python path; the module is then named after that *.py file. A package is created by placing an __init__.py file within a directory; the package is then named after that directory. For example, the following source tree:

    mod1.py
    pkg1/__init__.py
    pkg1/mod2.py
    pkg1/pkg2/__init__.py
    pkg1/pkg2/mod3.py
    

    defines the following Python packages and modules:

    pkg1            # package
    pkg1.pkg2       # package
    mod1            # module
    pkg1.mod2       # module
    pkg1.pkg2.mod3  # module
    

    The purpose of an __init__.py file is two-fold. First, the existence of __init__.py in a directory informs the Python interpreter that this directory contains a Python package. Second, the code in __init__.py is loaded/executed automatically when the package is initialized (when it or its submodule/subpackage gets import'ed). By default, SWIG generates proxy Python code – one *.py file for each *.i interface. The __init__.py files, however, are not generated by SWIG. They should be created by other means. Both files (module *.py and __init__.py) should be installed in appropriate destination directories in order to obtain a desirable package/module hierarchy.

    Python3 adds another option for packages with PEP 0420 (implicit namespace packages). Implicit namespace packages no longer use __init__.py files. SWIG generated Python modules support implicit namespace packages. See Implicit namespace packages for more information.

    You can place a SWIG generated module into a Python package or keep as a global module, details are covered a little later in Location of modules.

    The way Python defines its modules and packages impacts SWIG users. Some users may need to use special features such as the package option in the %module directive or import related command line options. These are explained in the following sections.

    32.11.1 Setting the Python package

    Using the package option in the %module directive allows you to specify a Python package that the module will be in when installed.

    %module(package="wx") xrc
    

    This is useful when the .i file is %imported by another .i file. By default SWIG will assume that the importer is able to find the importee with just the module name, but if they live in separate Python packages then this won't work. However if the importee specifies what its package is with the %module option then the Python code generated for the importer will use that package name when importing the other module and in base class declarations, etc..

    SWIG assumes that the package option provided to %module together with the module name (that is, wx.xrc in the above example) forms a fully qualified (absolute) name of a module (in Python terms). This is important especially for Python 3, where absolute imports are used by default. It's up to you to place the generated module files (.py, .so) in appropriate subdirectories. For example, if you have an interface file foo.i with:

    %module(package="pkg1.pkg2") foo
    

    then the resulting directory layout should be

    pkg1/
    pkg1/__init__.py
    pkg1/pkg2/__init__.py
    pkg1/pkg2/foo.py        # (generated by SWIG)
    pkg1/pkg2/_foo.so       # (shared library built from C/C++ code generated by SWIG)
    

    32.11.2 Absolute and relative imports

    Suppose, we have the following hierarchy of files:

    pkg1/
    pkg1/__init__.py
    pkg1/mod2.py
    pkg1/pkg2/__init__.py
    pkg1/pkg2/mod3.py
    

    Let the contents of pkg1/pkg2/mod3.py be

    class M3: pass
    

    We edit pkg1/mod2.py and want to import module pkg1/pkg2/mod3.py in order to derive from class M3. We can write appropriate Python code in several ways, for example:

    1. Using "import <>" syntax with absolute package name:

      # pkg1/mod2.py
      import pkg1.pkg2.mod3
      class M2(pkg1.pkg2.mod3.M3): pass
      
    2. Using "import <>" syntax with package name relative to pkg1 (only in Python 2.7 and earlier):

      # pkg1/mod2.py
      import pkg2.mod3
      class M2(pkg2.mod3.M3): pass
      
    3. Using "from <> import <>" syntax (relative import syntax, only in Python 2.5 and later):

      # pkg1/mod2.py
      from .pkg2 import mod3
      class M2(mod3.M3): pass
      
    4. Other variants, for example the following construction in order to have the pkg2.mod3.M3 symbol available in mod2 as in point 2 above (but now under Python 3):

      # pkg1/mod2.py
      from . import pkg2
      from .pkg2 import mod3
      class M2(pkg2.mod3.M3): pass
      

    Now suppose we have mod2.i with

    // mod2.i
    %module (package="pkg1") mod2
    %import "mod3.i"
    // ...
    

    and mod3.i with

    // mod3.i
    %module (package="pkg1.pkg2") mod3
    // ...
    

    By default, SWIG will generate mod2.py proxy file with import directive as in point 1. This can be changed with the -relativeimport command line option. The -relativeimport instructs SWIG to organize imports as in point 4 for Python 2.7.0 and newer.

    Compatibility Note: Versions of SWIG prior to SWIG-4.0.0 supported Python < 2.7.0 and would organize the imports as in point 2 if an older version of Python was detected at runtime.

    In short, if you have mod2.i and mod3.i as above, then without -relativeimport SWIG will write

    import pkg1.pkg2.mod3
    

    to mod2.py proxy file, and with -relativeimport it will write

    from . import pkg2
    from .pkg2 import mod3
    

    You should avoid using relative imports and use absolute ones whenever possible. There are some cases, however, when relative imports may be necessary. The first example is, when some (legacy) Python code refers entities imported by proxy files generated by SWIG, and it assumes that the proxy file uses relative imports. Second case is, when one puts import directives in __init__.py to import symbols from submodules or subpackages and the submodule depends on other submodules (discussed later).

    32.11.3 Enforcing absolute import semantics

    As you may know, there is an incompatibility in import semantics (for the import <> syntax) between Python 2 and 3. In Python 2.4 and earlier it is not clear whether

    import foo
    

    refers to a top-level module or to another module inside the current package. In Python 3 it always refers to a top-level module (see PEP 328). To instruct Python 2.5 through 2.7 to use new semantics (that is import foo is interpreted as absolute import), one has to put the following line

    from __future__ import absolute_import
    

    at the very beginning of your proxy *.py file. In SWIG, it may be accomplished with %pythonbegin directive as follows:

    %pythonbegin %{
    from __future__ import absolute_import
    %}
    

    32.11.4 Importing from __init__.py

    Imports in __init__.py are handy when you want to populate a package's namespace with names imported from other modules. In SWIG based projects this approach may also be used to split large pieces of code into smaller modules, compile them in parallel and then re-assemble everything at runtime by importing submodules' contents in __init__.py, for example.

    Unfortunately import directives in __init__.py may cause problems, especially if they refer to a package's submodules. This is caused by the way Python initializes packages. If you spot problems with imports from __init__.py try using -relativeimport option. Below we explain in detail one issue, for which the -relativeimport workaround may be helpful.

    Consider the following example (Python 3):

    pkg1/__init__.py        # (empty)
    pkg1/pkg2/__init__.py   # (imports something from bar.py)
    pkg1/pkg2/foo.py
    pkg1/pkg2/bar.py        # (imports foo.py)
    

    If the file contents are:

    • pkg1/pkg2/__init__.py:

      # pkg1/pkg2/__init__.py
      from .bar import Bar
      
    • pkg1/pkg2/foo.py:

      # pkg1/pkg2/foo.py
      class Foo: pass
      
    • pkg1/pkg2/bar.py:

      # pkg1/pkg2/bar.py
      import pkg1.pkg2.foo
      class Bar(pkg1.pkg2.foo.Foo): pass
      

    Now if one simply used import pkg1.pkg2, it will usually fail:

    >>> import pkg1.pkg2
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "./pkg1/pkg2/__init__.py", line 2, in <module>
        from .bar import Bar
      File "./pkg1/pkg2/bar.py", line 3, in <module>
        class Bar(pkg1.pkg2.foo.Foo): pass
    AttributeError: 'module' object has no attribute 'pkg2'
    

    Surprisingly, if we execute the import pkg1.pkg2 directive for the second time, it succeeds. The reason seems to be following: when Python spots the from .bar import Bar directive in pkg1/pkg2/__init__.py it starts loading pkg1/pkg2/bar.py. This module imports pkg1.pkg2.foo in turn and tries to use pkg1.pkg2.foo.Foo, but the package pkg1 is not fully initialized yet (the initialization procedure is actually in progress) and it seems like the effect of the already seen import pkg1.pkg2.pkg3.foo is "delayed" or ignored. Exactly the same may happen to a proxy module generated by SWIG.

    One workaround for this case is to use a relative import in pkg1/pkg2/bar.py. If we change bar.py to be:

    from .pkg3 import foo
    class Bar(foo.Foo): pass
    

    or

    from . import pkg3
    from .pkg3 import foo
    class Bar(pkg3.foo.Foo): pass
    

    then the example works again. With SWIG, you need to enable the -relativeimport option in order to have the above workaround in effect (note, that the Python 2 case also needs the -relativeimport workaround).

    32.11.5 Implicit namespace packages

    Python 3.3 introduced PEP 0420 which implements implicit namespace packages. In a nutshell, implicit namespace packages remove the requirement of an __init__.py file and allow packages to be split across multiple PATH elements. For example:

    /fragment1/pkg1/mod1.py
    /fragment2/pkg1/mod2.py
    /fragment3/pkg1/mod3.py
    

    If PYTHONPATH is set to "/fragment1:/fragment2:/fragment3", then mod1, mod2 and mod3 will be part of pkg1. This allows for splitting of packages into separate pieces. This can be useful for SWIG generated wrappers in the following way.

    Suppose you create a SWIG wrapper for a module called robin. The SWIG generated code consists of two files robin.py and _robin.so. You wish to make these modules part of a subpackage (brave.sir). With implicit namespace packages you can place these files in the following configurations:

    Using PYTHONPATH="/some/path"

    /some/path/brave/sir/robin.py
    /some/path/brave/sir/_robin.so
    

    Using PYTHONPATH="/some/path:/some/other/path"

    /some/path/brave/sir/robin.py
    /some/other/path/brave/sir/_robin.so
    

    Finally suppose that your pure Python code is stored in a .zip file or some other way (database, web service connection, etc). Python can load the robin.py module using a custom importer. But the _robin.so module will need to be located on a file system. Implicit namespace packages make this possible. For example, using PYTHONPATH="/some/path/foo.zip:/some/other/path"

    Contents of foo.zip

    brave/
    brave/sir/
    brave/sir/robin.py
    

    File system contents

    /some/other/path/brave/sir/_robin.so
    

    Support for implicit namespace packages was added to python-3.3. The zipimporter requires python-3.5.1 or newer to work with subpackages.

    Compatibility Note: Support for implicit namespace packages was added in SWIG-3.0.9.

    32.11.6 Location of modules

    When SWIG creates wrappers from an interface file, say foo.i, two Python modules are created. There is a pure Python module (foo.py) and C/C++ code which is compiled and linked into a dynamically (or statically) loaded low-level module _foo (see the Preliminaries section for details). So, the interface file really defines two Python modules. How these two modules are loaded is covered next.

    The pure Python module needs to load the C/C++ module in order to call the wrapped C/C++ methods. To do this it must make some assumptions about the location of the C/C++ module. There are two configurations that are supported by default.

    1. Both modules in the same package

    2. Both modules are global

    Additional configurations are supported but require custom import code.

    The following sub-sections look more closely at the two default configurations as well as some customized configurations. An input interface file, foo.i, results in the two modules foo.py and _foo.so for each of the configurations.

    32.11.6.1 Both modules in the same package

    In this configuration, the pure Python module, foo.py, tries to load the C/C++ module, _foo, from the same package foo.py is located in. The package name is determined from the __package__ attribute if available, see PEP 366. Otherwise it is derived from the __name__ attribute given to foo.py by the Python loader that imported foo.py. The interface file for this configuration would contain:

    %module(package="mypackage") foo
    

    The location of the files could be as follows:

    /dir/mypackage/foo.py
    /dir/mypackage/__init__.py
    /dir/mypackage/_foo.so
    

    Assuming /dir/ is in PYTHONPATH, the module can be imported using

    from mypackage import foo
    

    32.11.6.2 Both modules are global

    In this configuration, there are no packages. If foo.py is not in a package, that is, it is a global module, then _foo is loaded as a global module. The interface file for this configuration would contain:

    %module foo
    

    The location of the files could be as follows:

    /dir/foo.py
    /dir/_foo.so
    

    Assuming /dir/ is in PYTHONPATH, the module can be imported using

    import foo
    

    32.11.6.3 Split modules custom configuration

    In this non-standard 'split module' configuration, the pure Python module is in a package and the low level C/C++ module is global. This configuration is not generally recommended and is not supported by default as it needs a custom configuration. The module import code customization required is via the moduleimport attribute in the %module directive. The next sub-section elaborates further on this. The interface file for this split module configuration would contain:

    %module(package="mypackage", moduleimport="import _foo") foo
    

    When using -builtin, use the following instead (the reasons are also covered shortly in the next sub-section):

    %module(package="mypackage", moduleimport="from _foo import *") foo
    

    The location of the files could be as follows:

    /dir/mypackage/foo.py
    /dir/mypackage/__init__.py
    /dir/_foo.so
    

    Assuming /dir/ is in PYTHONPATH, the module can be imported using

    from mypackage import foo
    

    Compatibility Note: Versions of SWIG prior to SWIG-4.0.0 supported split modules without the above customization. However, this had to be removed as the default import code often led to confusion due to obfuscation of genuine Python ImportError problems. Using one of the two default configurations is the recommended approach now.

    32.11.6.4 More on customizing the module import code

    The Python code implementing the default import logic is shown below. It supports the two configurations described earlier, that is, either both modules are in a package or loading both as global modules. The code is generated into the pure Python module, foo.py, and merely imports the low-level _foo module.

    if __package__ or '.' in __name__:
        from . import _foo
    else:
        import _foo
    

    This import code implementation is non-trivial but it can be replaced with custom code providing opportunities to make it simpler and/or more flexible. This is not normally recommended though unless you have a good understanding of the intricacies of importing Python modules. The custom code can be specified by setting the moduleimport option of the %module directive with the appropriate import code. For example:

    %module(moduleimport="import _foo") foo
    

    This will replace the default import logic above and generate the following into the pure Python module, foo.py:

    import _foo
    

    In fact the above is a simplification customization for the configuration where both modules are global; it removes the logic for also handling the modules being in a package.

    There is a special variable, $module, which is expanded into the low-level C/C++ module name, _foo in the case above. The identical output would be generated if instead the following had been used:

    %module(moduleimport="import $module") foo
    

    When you have many lines you can retain the easy readability of the %module directive by using a macro. For example:

    %define MODULEIMPORT
    "
    print 'Loading low-level module $module'
    import $module
    print 'Module has loaded'
    "
    %enddef
    
    %module(moduleimport=MODULEIMPORT) foo
    

    This will of course generate the following into the pure Python module:

    print 'Loading low-level module $module'
    import _foo
    print 'Module has loaded'
    

    When using the -builtin option, the link between the pure Python module and the low-level C/C++ module is slightly different as all the objects from the low-level module are imported directly into the pure Python module. The default import loading code is thus different:

    if __package__ or '.' in __name__:
        from ._foo import *
    else:
        from _foo import *
    

    Any customizations must import the code in a similar manner. The best way to support both with and without -builtin is to make use of the SWIGPYTHON_BUILTIN macro which is defined when -builtin is specified. The following will do this for the split modules case above.

    #if defined(SWIGPYTHON_BUILTIN) /* defined when using -builtin */
    %module(package="mypackage", moduleimport="from $module import *") foo
    #else
    %module(package="mypackage", moduleimport="import $module") foo
    #endif
    

    32.11.6.5 Statically linked C modules

    It is strongly recommended to use dynamically linked modules for the C portion of your pair of Python modules. If for some reason you still need to link the C module of the pair of Python modules generated by SWIG into your interpreter, then this section provides some details on how this impacts the pure Python modules ability to locate the other part of the pair. Please also see the Static Linking section.

    When Python is extended with C code the Python interpreter needs to be informed about details of the new C functions that have been linked into the executable. The code to do this is created by SWIG and is automatically called in the correct way when the module is dynamically loaded. However when the code is not dynamically loaded (because it is statically linked) Then the initialization method for the module created by SWIG is not called automatically and the Python interpreter has no idea that the new SWIG C module exists.

    Before Python 3, one could simply call the init method created by SWIG which would have normally been called when the shared object was dynamically loaded. The specific name of this method is not given here because statically linked modules are not encouraged with SWIG (Static Linking). However one can find this init function in the C file generated by SWIG.

    If you are really keen on static linking there are two ways to initialize the SWIG generated C module with the init method. Which way you use depends on what version of Python your module is being linked with. Python 2 and Python 3 treat this init function differently. And the way they treat it affects how the pure Python module will be able to locate the C module.

    The details concerning this are covered completely in the documentation for Python itself. Links to the relevant sections follow:

    There are two keys things to understand. The first is that in Python 2 the init() function returns void. In Python 3 the init() function returns a PyObject * which points to the new module. Secondly, when you call the init() method manually, you are the Python importer. So, you determine which package the C module will be located in.

    So, if you are using Python 3 it is important that you follow what is described in the Python documentation linked above. In particular, you can't simply call the init() function generated by SWIG and cast the PyObject pointer it returns over the side. If you do then Python 3 will have no idea that your C module exists and the pure Python half of your wrapper will not be able to find it. You need to register your module with the Python interpreter as described in the Python docs.

    With Python 2 things are somewhat more simple. In this case the init() function returns void. Calling it will register your new C module as a global module. The pure Python part of the SWIG wrapper will be able to find it because it tries both the pure Python module it is part of and the global module. If you wish not to have the statically linked module be a global module then you will either need to refer to the Python documentation on how to do this (remember you are now the Python importer) or use dynamic linking.

    32.12 Python 3 Support

    SWIG is able to support Python 3.x. The wrapper code generated by SWIG can be compiled with both Python 2.x or 3.x. Further more, by passing the -py3 command line option to SWIG, wrapper code with some Python 3 specific features can be generated (see below subsections for details of these features).

    There is a list of known-to-be-broken features in Python 3:

    • No more support for FILE* typemaps, because PyFile_AsFile has been dropped in Python 3.
    • The -apply command line option is removed and generating code using apply() is no longer supported.

    The following are Python 3 new features that are currently supported by SWIG.

    32.12.1 Function annotation

    The -py3 option will enable function annotation support. When used SWIG is able to generate proxy method definitions like this:

      def foo(self, bar : "int"=0) -> "void" : ...
    

    Also, even if without passing SWIG the -py3 option, the parameter list still could be generated:

      def foo(self, bar=0): ...
    

    But for overloaded function or method, the parameter list would fallback to *args or self, *args, and **kwargs may be append depend on whether you enabled the keyword argument. This fallback is due to all overloaded functions share the same function in SWIG generated proxy class.

    For detailed usage of function annotation, see PEP 3107.

    32.12.2 Buffer interface

    SWIG has a series of typemaps to support buffer interfaces. These typemap macros are defined in pybuffer.i, which must be included in order to use them. By using these typemaps, your wrapped function will be able to accept any Python object that exposes a suitable buffer interface.

    For example, the get_path() function puts the path string into the memory pointed to by its argument:

    void get_path(char *s);
    

    Then you can write a typemap like this: (the following example is applied to both Python 2 and 3, since the bytearray type was backported to 2.6.

    %include <pybuffer.i>
    %pybuffer_mutable_string(char *str);
    void get_path(char *str);
    

    And then on the Python side the wrapped get_path could be used in this way:

    >>> p = bytearray(10)
    >>> get_path(p)
    >>> print(p)
    bytearray(b'/Foo/Bar/\x00')
    

    The macros defined in pybuffer.i are similar to those in cstring.i:

    %pybuffer_mutable_binary(parm, size_parm)

    The macro can be used to generate a typemap which maps a buffer of an object to a pointer provided by parm and a size argument provided by size_parm. For example:

    %pybuffer_mutable_binary(char *str, size_t size);
    ...
    int snprintf(char *str, size_t size, const char *format, ...);
    

    In Python:

    >>> buf = bytearray(6)
    >>> snprintf(buf, "Hello world!")
    >>> print(buf)
    bytearray(b'Hello\x00')
    >>>
    

    %pybuffer_mutable_string(parm)

    This typemap macro requires the buffer to be a zero terminated string, and maps the pointer of the buffer to parm. For example:

    %pybuffer_mutable_string(char *str);
    ...
    size_t make_upper(char *str);
    

    In Python:

    >>> buf = bytearray(b'foo\x00')
    >>> make_upper(buf)
    >>> print(buf)
    bytearray(b'FOO\x00')
    >>>
    

    Both %pybuffer_mutable_binary and %pybuffer_mutable_string require the provided buffer to be mutable, eg. they can accept a bytearray type but can't accept an immutable byte type.

    %pybuffer_binary(parm, size_parm)

    This macro maps an object's buffer to a pointer parm and a size size_parm. It is similar to %pybuffer_mutable_binary, except the %pybuffer_binary can accept both mutable and immutable buffers. As a result, the wrapped function should not modify the buffer.

    %pybuffer_string(parm)

    This macro maps an object's buffer as a string pointer parm. It is similar to %pybuffer_mutable_string but the buffer could be both mutable and immutable. And your function should not modify the buffer.

    32.12.3 Abstract base classes

    By including pyabc.i and using the -py3 command line option when calling SWIG, the proxy classes of the STL containers will automatically gain an appropriate abstract base class from the collections.abc module. For example, the following SWIG interface:

    %include <pyabc.i>
    %include <std_map.i>
    %include <std_list.i>
    
    namespace std {
      %template(Mapii) map<int, int>;
      %template(IntList) list<int>;
    }
    

    will generate a Python proxy class Mapii inheriting from collections.abc.MutableMap and a proxy class IntList inheriting from collections.abc.MutableSequence.

    pyabc.i also provides a macro %pythonabc that could be used to define an abstract base class for your own C++ class:

    %pythonabc(MySet, collections.abc.MutableSet);
    

    For details of abstract base class, please see PEP 3119.

    Compatibility Note: SWIG-4.0.0 changed the base classes to use the collections.abc module instead of collections due to the deprecation of the classes in the collections module in Python 3.7. The collections.abc module was introduced in Python 3.3 and hence this feature requires Python 3.3 or later.

    32.12.4 Byte string output conversion

    By default, any byte string (char* or std::string) returned from C or C++ code is decoded to text as UTF-8. This decoding uses the surrogateescape error handler under Python 3.1 or higher -- this error handler decodes invalid byte sequences to high surrogate characters in the range U+DC80 to U+DCFF. As an example, consider the following SWIG interface, which exposes a byte string that cannot be completely decoded as UTF-8:

    %module example
    
    %inline %{
    
    const char * non_utf8_c_str(void) {
      return "h\xe9llo w\xc3\xb6rld";
    }
    
    void instring(const char *s) {
      ...
    }
    
    %}
    

    Note that "\xe9" is an invalid UTF-8 encoding, but "\xc3\xb6" is valid. When this method is called from Python 3, the return value is the following text string:

    >>> s = example.non_utf8_c_str()
    >>> s
    'h\udce9llo wörld'
    

    Since the C string contains bytes that cannot be decoded as UTF-8, those raw bytes are represented as high surrogate characters that can be used to obtain the original byte sequence:

    >>> b = s.encode('utf-8', errors='surrogateescape')
    >>> b
    b'h\xe9llo w\xc3\xb6rld'
    

    One can then attempt a different encoding, if desired (or simply leave the byte string as a raw sequence of bytes for use in binary protocols):

    >>> b.decode('latin-1')
    'héllo wörld'
    

    Note, however, that text strings containing surrogate characters are rejected with the default strict codec error handler. For example:

    >>> with open('test', 'w') as f:
    ...     print(s, file=f)
    ...
    Traceback (most recent call last):
      File "<stdin>", line 2, in <module>
    UnicodeEncodeError: 'utf-8' codec can't encode character '\udce9' in position 1: surrogates not allowed
    

    This requires the user to check most strings returned by SWIG bindings, but the alternative is for a non-UTF8 byte string to be completely inaccessible in Python 3 code.

    For more details about the surrogateescape error handler, please see PEP 383.

    When Python 3 strings are passed to the C/C++ layer, they are expected to be valid UTF8 Unicode strings too. For example, when the instring method above is wrapped and called, any invalid UTF8 Unicode code strings will result in a TypeError because the attempted conversion fails:

    >>> example.instring('h\xe9llo')
    >>> example.instring('h\udce9llo')
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: in method 'instring', argument 1 of type 'char const *'
    

    In some cases, users may wish to instead handle all byte strings as bytes objects in Python 3. This can be accomplished by adding SWIG_PYTHON_STRICT_BYTE_CHAR to the generated code:

    %module char_to_bytes
    %begin %{
    #define SWIG_PYTHON_STRICT_BYTE_CHAR
    %}
    
    char *charstring(char *s) {
      return s;
    }
    

    This will modify the behavior so that only Python 3 bytes objects will be accepted and converted to a C/C++ string, and any string returned from C/C++ will be converted to a bytes object in Python 3:

    >>> from char_to_bytes import *
    >>> charstring(b"hi") # Byte string
    b'hi'
    >>> charstring("hi")  # Unicode string
    Traceback (most recent call last):
      File "<stdin>", line 1, in ?
    TypeError: in method 'charstring', argument 1 of type 'char *'
    

    Note that in Python 2, defining SWIG_PYTHON_STRICT_BYTE_CHAR has no effect, since strings in Python 2 are equivalent to Python 3 bytes objects. However, there is a similar capability to force unicode-only handling for wide characters C/C++ strings (wchar_t * or std::wstring types) in Python 2. By default, in Python 2 both strings and unicode strings are converted to C/C++ wide strings, and returned wide strings are converted to a Python unicode string. To instead only convert unicode strings to wide strings, users can add SWIG_PYTHON_STRICT_UNICODE_WCHAR to the generated code:

    %module wchar_to_unicode
    %begin %{
    #define SWIG_PYTHON_STRICT_UNICODE_WCHAR
    %}
    
    wchar_t *wcharstring(wchar_t *s) {
      return s;
    }
    

    This ensures that only unicode strings are accepted by wcharstring in both Python 2 and Python 3:

    >>> from wchar_to_unicode import *
    >>> wcharstring(u"hi") # Unicode string
    u'hi'
    >>> wcharstring(b"hi") # Byte string
    Traceback (most recent call last):
      File "<stdin>", line 1, in ?
    TypeError: in method 'charstring', argument 1 of type 'wchar_t *'
    

    By defining both SWIG_PYTHON_STRICT_BYTE_CHAR and SWIG_PYTHON_STRICT_UNICODE_WCHAR, Python wrapper code can support overloads taking both std::string (as Python bytes) and std::wstring (as Python unicode).

    32.12.5 Python 2 Unicode

    A Python 3 string is a Unicode string so by default a Python 3 string that contains Unicode characters passed to C/C++ will be accepted and converted to a C/C++ string (char * or std::string types). A Python 2 string is not a unicode string by default and should a Unicode string be passed to C/C++ it will fail to convert to a C/C++ string (char * or std::string types). The Python 2 behavior can be made more like Python 3 by defining SWIG_PYTHON_2_UNICODE when compiling the generated C/C++ code. By default when the following is wrapped:

    %module unicode_strings
    char *charstring(char *s) {
      return s;
    }
    

    An error will occur when using Unicode strings in Python 2:

    >>> from unicode_strings import *
    >>> charstring("hi")
    'hi'
    >>> charstring(u"hi")
    Traceback (most recent call last):
      File "<stdin>", line 1, in ?
    TypeError: in method 'charstring', argument 1 of type 'char *'
    

    When the SWIG_PYTHON_2_UNICODE macro is added to the generated code:

    %module unicode_strings
    %begin %{
    #define SWIG_PYTHON_2_UNICODE
    %}
    
    char *charstring(char *s) {
      return s;
    }
    

    Unicode strings will be successfully accepted and converted from UTF-8, but note that they are returned as a normal Python 2 string:

    >>> from unicode_strings import *
    >>> charstring("hi")
    'hi'
    >>> charstring(u"hi")
    'hi'
    >>>
    

    Note that defining both SWIG_PYTHON_2_UNICODE and SWIG_PYTHON_STRICT_BYTE_CHAR at the same time is not allowed, since the first is allowing unicode conversion and the second is explicitly prohibiting it.

    32.13 Support for Multithreaded Applications

    By default, SWIG does not enable support for multithreaded Python applications. More specifically, the Python wrappers generated by SWIG will not release the Python's interpreter's Global Interpreter Lock (GIL) when wrapped C/C++ code is entered. Hence, while any of the wrapped C/C++ code is executing, the Python interpreter will not be able to run any other threads, even if the wrapped C/C++ code is waiting in a blocking call for something like network or disk IO. Fortunately, SWIG does have the ability to enable multithreaded support and automatic release of the GIL either for all wrapped code in a module or on a more selective basis. The user interface for this is described in the next section.

    32.13.1 UI for Enabling Multithreading Support

    The user interface is as follows:

    1. Module thread support can be enabled in two ways:

      • The -threads SWIG Python option at the command line (or in setup.py):

        $ swig -python -threads example.i
      • The threads module option in the *.i template file:

        %module("threads"=1)
    2. You can disable thread support for a given method:

      %feature("nothread") method;
      or
      %nothread method;
    3. You can partially disable thread support for a given method:

      • To disable the C++/Python thread protection:

        %feature("nothreadblock") method;
        or
        %nothreadblock method;
      • To disable the Python/C++ thread protection

        %feature("nothreadallow") method;
        or
        %nothreadallow method;

    32.13.2 Multithread Performance

    For the curious about performance, here are some numbers for the profiletest.i test, which is used to check the speed of the wrapped code:

    Thread Mode Execution Time (sec) Comment
    Single Threaded 9.6 no "-threads" option given
    Fully Multithreaded 15.5 "-threads" option = 'allow' + 'block'
    No Thread block 12.2 only 'allow'
    No Thread Allow 13.6 only block'

    Fully threaded code decreases the wrapping performance by around 60%. If that is important to your application, you can tune each method using the different 'nothread', 'nothreadblock' or 'nothreadallow' features as needed. Note that for some methods deactivating the 'thread block' or 'thread allow' code is not an option, so, be careful.

    swig-4.0.1/Doc/Manual/Javascript.html0000644000175000017500000010221213527234052017262 0ustar williamwilliam

    27 SWIG and Javascript

    This chapter describes SWIG's support of Javascript. It does not cover SWIG basics, but only information that is specific to this module.

    27.1 Overview

    Javascript is a prototype-based scripting language that is dynamic, weakly typed and has first-class functions. Its arguably the most popular language for web development. Javascript has gone beyond being a browser-based scripting language and with node.js, it is also used as a backend development language.

    Native Javascript extensions can be used for applications that embed a web-browser view or that embed a Javascript engine (such as node.js). Extending a general purpose web-browser is not possible as this would be a severe security issue.

    SWIG Javascript currently supports JavascriptCore, the Javascript engine used by Safari/Webkit, and v8, which is used by Chromium and node.js.

    WebKit is a modern browser implementation available as open-source which can be embedded into an application. With node-webkit there is a platform which uses Google's Chromium as Web-Browser widget and node.js for javascript extensions.

    27.2 Preliminaries

    27.2.1 Running SWIG

    Suppose that you defined a SWIG module such as the following:

    %module example
    %{
    #include "example.h"
    %}
    int gcd(int x, int y);
    extern double Foo;

    To build a Javascript module, run SWIG using the -javascript option and a desired target engine -jsc, -v8, or -node. The generator for node is essentially delegating to the v8 generator and adds some necessary preprocessor definitions.

    $ swig -javascript -jsc example.i

    If building a C++ extension, add the -c++ option:

    $ swig -c++ -javascript -jsc example.i

    The V8 code that SWIG generates should work with most versions from 3.11.10 up to 3.29.14 and later.

    The API headers for V8 >= 4.3.0 define constants which SWIG can use to determine the V8 version it is compiling for. For versions < 4.3.0, you need to specify the V8 version when running SWIG. This is specified as a hex constant, but the constant is read as pairs of decimal digits, so for V8 3.25.30 use constant 0x032530. This scheme can't represent components > 99, but this constant is only useful for V8 < 4.3.0, and no V8 versions from that era had a component > 99. For example:

    $ swig -c++ -javascript -v8 -DV8_VERSION=0x032530 example.i

    If you're targeting V8 >= 4.3.0, you would just run swig like so:

    $ swig -c++ -javascript -v8 example.i

    This creates a C/C++ source file example_wrap.c or example_wrap.cxx. The generated C source file contains the low-level wrappers that need to be compiled and linked with the rest of your C/C++ application to create an extension module.

    The name of the wrapper file is derived from the name of the input file. For example, if the input file is example.i, the name of the wrapper file is example_wrap.c. To change this, you can use the -o option. The wrapped module will export one function which must be called to register the module with the Javascript interpreter. For example, if your module is named example the corresponding initializer for JavascriptCore would be

    bool example_initialize(JSGlobalContextRef context, JSObjectRef *exports)

    and for v8:

    void example_initialize(v8::Handle<v8::Object> exports)

    Note: be aware that v8 has a C++ API, and thus, the generated modules must be compiled as C++.

    27.2.2 Running Tests and Examples

    The configuration for tests and examples currently supports Linux and Mac only and not MinGW (Windows) yet.

    The default interpreter is node.js as it is available on all platforms and convenient to use.

    Running the examples with JavascriptCore requires libjavascriptcoregtk-1.0 to be installed, e.g., under Ubuntu with

    $ sudo apt-get install libjavascriptcoregtk-1.0-dev

    Running with V8 requires libv8:

    $ sudo apt-get install libv8-dev

    Examples can be run using

    $ make check-javascript-examples ENGINE=jsc

    ENGINE can be node, jsc, or v8.

    The test-suite can be run using

    $ make check-javascript-test-suite ENGINE=jsc

    You can specify a specific V8 version for running the examples and tests

    $ make check-javascript-examples V8_VERSION=0x032530 ENGINE=v8

    27.2.3 Known Issues

    At the moment, the Javascript generators pass all tests syntactically, i.e., the generated source code compiles. However, there are still remaining runtime issues.

    • Default optional arguments do not work for all targeted interpreters

    • Multiple output arguments do not work for JSC

    • C89 incompatibility: the JSC generator might still generate C89 violating code

    • long long is not supported

    • Javascript callbacks are not supported

    • instanceOf does not work under JSC

    The primary development environment has been Linux (Ubuntu 12.04). Windows and Mac OS X have been tested sporadically. Therefore, the generators might have more issues on those platforms. Please report back any problem you observe to help us improving this module quickly.

    27.3 Integration

    This chapter gives a short introduction how to use a native Javascript extension: as a node.js module, and as an extension for an embedded Webkit.

    27.3.1 Creating node.js Extensions

    To install node.js you can download an installer from their web-site for Mac OS X and Windows. For Linux you can either build the source yourself and run sudo checkinstall or keep to the (probably stone-age) packaged version. For Ubuntu there is a PPA available.

    $ sudo add-apt-repository ppa:chris-lea/node.js
    $ sudo apt-get update
    $ sudo apt-get install nodejs

    As v8 is written in C++ and comes as a C++ library it is crucial to compile your module using the same compiler flags as used for building v8. To make things easier, node.js provides a build tool called node-gyp.

    You have to install it using npm:

    $ sudo npm install -g node-gyp

    node-gyp expects a configuration file named binding.gyp which is basically in JSON format and conforms to the same format that is used with Google's build-tool gyp.

    binding.gyp:

    {
      "targets": [
        {
          "target_name": "example",
          "sources": [ "example.cxx", "example_wrap.cxx" ]
        }
      ]
    }

    First create the wrapper using SWIG:

    $ swig -javascript -node -c++ example.i

    Then run node-gyp build to actually create the module:

    $ node-gyp build

    This will create a build folder containing the native module. To use the extension you need to 'require' it in your Javascript source file:

    require("./build/Release/example")

    A more detailed explanation is given in the Examples section.

    27.3.1.1 Troubleshooting

    • 'module' object has no attribute 'script_main'

    This error happens when gyp is installed as a distribution package. It seems to be outdated. Removing it resolves the problem.

    $ sudo apt-get remove gyp

    27.3.2 Embedded Webkit

    Webkit is pre-installed on Mac OS X and available as a library for GTK.

    27.3.2.1 Mac OS X

    There is general information about programming with WebKit on Apple Developer Documentation. Details about Cocoa programming are not covered here.

    An integration of a native extension 'example' would look like this:

    #import "appDelegate.h"
    
    extern bool example_initialize(JSGlobalContextRef context, JSObjectRef* exports);
    
    
    @implementation ExampleAppDelegate
    
    @synthesize webView;
    
    - (void)addGlobalObject:(JSContextRef) context:(NSString *)objectName:(JSObjectRef) theObject {
      JSObjectRef global = JSContextGetGlobalObject(context);
      JSStringRef objectJSName = JSStringCreateWithCFString( (CFStringRef) objectName )
      if ( objectJSName != NULL ) {
        JSObjectSetProperty(context, global, objectJSName, theObject, kJSPropertyAttributeReadOnly, NULL);
        JSStringRelease( objectJSName );
      }
    }
    
    - (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
    
      // Start a webview with the bundled index.html file
      NSString *path = [[NSBundle mainBundle] bundlePath];
      NSString *url =  [NSString stringWithFormat: @"file://%@/Contents/Assets/index.html", path];
    
      WebFrame *webframe = [webView mainFrame];
      JSGlobalContextRef context = [webframe globalContext];
    
      JSObjectRef example;
      example_initialize(context, &example);
      [self addGlobalObject:context:@"example":example]
    
      JSObjectSetProperty(context, global, JSStringRef propertyName, example, JSPropertyAttributes attributes, NULL);
    
      [ [webView mainFrame] loadRequest:
        [NSURLRequest requestWithURL: [NSURL URLWithString:url] ]
      ];
    }
    
    @end

    27.3.2.2 GTK

    There is general information about programming GTK at GTK documentation and in the GTK tutorial, and for Webkit there is a Webkit GTK+ API Reference.

    An integration of a native extension 'example' would look like this:

    #include <gtk/gtk.h>
    #include <webkit/webkit.h>
    
    extern bool example_initialize(JSGlobalContextRef context);
    
    int main(int argc, char* argv[])
    {
      // Initialize GTK+
      gtk_init(&argc, &argv);
    
      ...
    
      // Create a browser instance
      WebKitWebView *webView = WEBKIT_WEB_VIEW(webkit_web_view_new());
      WebFrame *webframe = webkit_web_view_get_main_frame(webView);
      JSGlobalContextRef context = webkit_web_frame_get_global_context(webFrame);
      JSObjectRef global = JSContextGetGlobalObject(context);
    
      JSObjectRef exampleModule;
      example_initialize(context, &exampleModule);
      JSStringRef jsName = JSStringCreateWithUTF8CString("example");
      JSObjectSetProperty(context, global, jsName, exampleModule, kJSPropertyAttributeReadOnly, NULL);
      JSStringRelease(jsName);
    
      ...
    
      // Load a web page into the browser instance
      webkit_web_view_load_uri(webView, "http://www.webkitgtk.org/");
    
      ...
    
      // Run the main GTK+ event loop
      gtk_main();
    
      return 0;
    }

    27.3.3 Creating Applications with node-webkit

    To get started with node-webkit there is a very informative set of wiki pages.

    Similar to node.js, node-webkit is started from command line within a node.js project directory. Native extensions are created in the very same way as for node.js, except that a customized gyp derivate has to be used: nw-gyp.

    A simple example would have the following structure:

    - package.json
    - app.html
    - app.js
    - node_modules
      / example
      ... (as known from node.js)
    

    The configuration file essentially conforms to node.js syntax. It has some extras to configure node-webkit. See the Manifest specification for more details.

    package.json:

    {
      "name": "example",
      "main": "app.html",
      "window": {
        "show": true,
        "width": 800,
        "height": 600
      }
    }

    The 'main' property of package.json specifies a web-page to be rendered in the main window.

    app.html:

    <html>
      <head>
        <script src="app.js"></script>
      </head>
      <body>
        <div>
          The greatest common divisor of
          <span id="x"></span> and
          <span id="y"></span> is
          <span id="z"></span>.
        </div>
      </body>
    </html>

    As known from node.js one can use require to load javascript modules. Additionally, node-webkit provides an API that allows to manipulate the window's menu, open new windows, and many more things.

    app.js:

    window.onload = function() {
      var example = require("example");
      var x = 18;
      var y = 24;
      var z = example.gcd(x, y);
      document.querySelector('#x').innerHTML = x;
      document.querySelector('#y').innerHTML = y;
      document.querySelector('#z').innerHTML = z;
    };

    27.4 Examples

    Some basic examples are shown here in more detail.

    27.4.1 Simple

    The common example simple looks like this:

    /* File : example.i */
    %module example
    
    %inline %{
    extern int    gcd(int x, int y);
    extern double Foo;
    %}

    To make this available as a node extension a binding.gyp has to be created:

    {
      "targets": [
        {
          "target_name": "example",
          "sources": [ "example.cxx", "example_wrap.cxx" ]
        }
      ]
    }

    Then node-gyp is used to build the extension:

    $ node-gyp configure build

    From a 'nodejs` application the extension would be used like this:

    // import the extension via require
    var example = require("./build/Release/example");
    
    // calling the global method
    var x = 42;
    var y = 105;
    var g = example.gcd(x, y);
    
    // Accessing the global variable
    var f = example.Foo;
    example.Foo = 3.1415926;

    First the module example is loaded from the previously built extension. Global methods and variables are available in the scope of the module.

    Note: ECMAScript 5, the currently implemented Javascript standard, does not have modules. node.js and other implementations provide this mechanism defined by the CommonJS group. For browsers this is provided by Browserify, for instance.

    27.4.2 Class

    The common example class defines three classes, Shape, Circle, and Square:

    class Shape {
    public:
      Shape() {
        nshapes++;
      }
      virtual ~Shape() {
        nshapes--;
      }
      double  x, y;
      void    move(double dx, double dy);
      virtual double area(void) = 0;
      virtual double perimeter(void) = 0;
      static  int nshapes;
    };
    
    class Circle : public Shape {
    private:
      double radius;
    public:
      Circle(double r) : radius(r) { }
      virtual double area(void);
      virtual double perimeter(void);
    };
    
    class Square : public Shape {
    private:
      double width;
    public:
      Square(double w) : width(w) { }
      virtual double area(void);
      virtual double perimeter(void);
    };

    Circle and Square inherit from Shape. Shape has a static variable nshapes, a function move that can't be overridden (non-virtual), and two abstract functions area and perimeter (pure virtual) that must be overridden by the sub-classes.

    A nodejs extension is built the same way as for the simple example.

    In Javascript it can be used as follows:

    var example = require("./build/Release/example");
    
    // local aliases for convenience
    var Shape = example.Shape;
    var Circle = example.Circle;
    var Square = example.Square;
    
    // creating new instances using the 'new' operator
    var c = new Circle(10);
    var s = new Square(10);
    
    // accessing a static member
    Shape.nshapes;
    
    // accessing member variables
    c.x = 20;
    c.y = 30;
    s.x = -10;
    s.y = 5;
    
    // calling some methods
    c.area();
    c.perimeter();
    s.area();
    s.perimeter();
    
    // instantiation of Shape is not permitted
    new Shape();

    Running these commands in an interactive node shell results in the following output:

    $ node -i
    & var example = require("./build/Release/example");
    undefined
    & var Shape = example.Shape;
    undefined
    & var Circle = example.Circle;
    undefined
    & var Square = example.Square;
    undefined
    & var c = new Circle(10);
    undefined
    & var s = new Square(10);
    undefined
    & Shape.nshapes;
    2
    & c.x = 20;
    20
    & c.y = 30;
    30
    & s.x = -10;
    -10
    & s.y = 5;
    5
    & c.area();
    314.1592653589793
    & c.perimeter();
    62.83185307179586
    & s.area();
    100
    & s.perimeter();
    40
    & c.move(40, 40)
    undefined
    & c.x
    60
    & c.y
    70
    & new Shape()
    Error: Class Shape can not be instantiated
    at repl:1:2
    at REPLServer.self.eval (repl.js:110:21)
    at Interface.<anonymous> (repl.js:239:12)
    at Interface.EventEmitter.emit (events.js:95:17)
    at Interface._onLine (readline.js:202:10)
    at Interface._line (readline.js:531:8)
    at Interface._ttyWrite (readline.js:760:14)
    at ReadStream.onkeypress (readline.js:99:10)
    at ReadStream.EventEmitter.emit (events.js:98:17)
    at emitKey (readline.js:1095:12)

    Note: In ECMAScript 5 there is no concept for classes. Instead each function can be used as a constructor function which is executed by the 'new' operator. Furthermore, during construction the key property prototype of the constructor function is used to attach a prototype instance to the created object. A prototype is essentially an object itself that is the first-class delegate of a class used whenever the access to a property of an object fails. The very same prototype instance is shared among all instances of one type. Prototypal inheritance is explained in more detail on in Inheritance and the prototype chain, for instance.

    27.5 Implementation

    The Javascript Module implementation has taken a very different approach compared to other language modules in order to support different Javascript interpreters.

    27.5.1 Source Code

    The Javascript module is implemented in Source/Modules/javascript.cxx. It dispatches the code generation to a JSEmitter instance, V8Emitter or JSCEmitter. Additionally there are some helpers: Template, for templated code generation, and JSEmitterState, which is used to manage state information during AST traversal. This rough map shall make it easier to find a way through this huge source file:

    // module wide defines
    
    #define NAME "name"
    ...
    
    // ###############################
    // #  Helper class declarations
    
    class JSEmitterState { ... };
    
    class Template { ... };
    
    // ###############################
    // # JSEmitter declaration
    
    class JSEmitter { ... };
    
    // Emitter factory declarations
    
    JSEmitter *swig_javascript_create_JSCEmitter();
    JSEmitter *swig_javascript_create_V8Emitter();
    
    // ###############################
    // # Javascript module
    
    // Javascript module declaration
    
    class JAVASCRIPT:public Language { ... };
    
    // Javascript module implementation
    
    int JAVASCRIPT::functionWrapper(Node *n) { ... }
    ...
    
    // Module factory implementation
    
    static Language *new_swig_javascript() { ... }
    
    extern "C" Language *swig_javascript(void) { ... }
    
    // ###############################
    // # JSEmitter base implementation
    
    JSEmitter::JSEmitter() { ... }
    
    Template JSEmitter::getTemplate(const String *name) { ... }
    ...
    
    // ###############################
    // # JSCEmitter
    
    // JSCEmitter declaration
    
    class JSCEmitter: public JSEmitter { ... };
    
    // JSCEmitter implementation
    
    JSCEmitter::JSCEmitter() { ... }
    
    void JSCEmitter::marshalInputArgs(Node *n, ParmList *parms, Wrapper *wrapper, MarshallingMode mode, bool is_member, bool is_static) { ... }
    ...
    
    // JSCEmitter factory
    
    JSEmitter *swig_javascript_create_JSCEmitter() { ... }
    
    
    // ###############################
    // # V8Emitter
    
    // V8Emitter declaration
    
    class V8Emitter: public JSEmitter { ... };
    
    // V8Emitter implementation
    
    V8Emitter::V8Emitter() { ... }
    
    int V8Emitter::initialize(Node *n) { ... }
    
    // V8Emitter factory
    
    JSEmitter *swig_javascript_create_V8Emitter() { ... }
    
    
    // ###############################
    // # Helper implementation (JSEmitterState, Template)
    
    JSEmitterState::JSEmitterState() { ... }
    ...
    
    Template::Template(const String *code_) { ... }
    ...

    27.5.2 Code Templates

    All generated code is created on the basis of code templates. The templates for JavascriptCore can be found in Lib/javascript/jsc/javascriptcode.swg, for v8 in Lib/javascript/v8/javascriptcode.swg.

    To track the originating code template for generated code you can run

    $ swig -javascript -jsc -debug-codetemplates

    which wraps generated code with a descriptive comment

    /* begin fragment("template_name") */
    
    ...generated code ...
    
    /* end fragment("template_name") */

    The Template class is used like this:

    Template t_register = getTemplate("jsv8_register_static_variable");
    t_register.replace("$jsparent", state.clazz(NAME_MANGLED))
        .replace("$jsname", state.variable(NAME))
        .replace("$jsgetter", state.variable(GETTER))
        .replace("$jssetter", state.variable(SETTER))
        .trim().
        print(f_init_static_wrappers);

    A code template is registered with the JSEmitter via fragment(name, "template"), e.g.,

    %fragment ("jsc_variable_declaration", "templates")
    %{
      {"$jsname", $jsgetter, $jssetter, kJSPropertyAttributeNone},
    %}

    Template creates a copy of that string and Template::replace uses Swig's Replaceall to replace variables in the template. Template::trim can be used to eliminate leading and trailing whitespaces. Template::print is used to write the final template string to a Swig DOH (based on Printv). All methods allow chaining.

    27.5.3 Emitter

    The Javascript module delegates code generation to a JSEmitter instance. The following extract shows the essential interface:

    class JSEmitter {
      ...
    
      /**
       * Opens output files and temporary output DOHs.
       */
      virtual int initialize(Node *n);
    
      /**
       * Writes all collected code into the output file(s).
       */
      virtual int dump(Node *n) = 0;
    
      /**
       * Cleans up all open output DOHs.
       */
      virtual int close() = 0;
    
      ...
    
      /**
       * Invoked at the beginning of the classHandler.
       */
      virtual int enterClass(Node *);
    
      /**
       * Invoked at the end of the classHandler.
       */
      virtual int exitClass(Node *) {
        return SWIG_OK;
      }
    
      /**
       * Invoked at the beginning of the variableHandler.
       */
      virtual int enterVariable(Node *);
    
      /**
       * Invoked at the end of the variableHandler.
       */
      virtual int exitVariable(Node *) {
        return SWIG_OK;
      }
    
      /**
       * Invoked at the beginning of the functionHandler.
       */
      virtual int enterFunction(Node *);
    
      /**
       * Invoked at the end of the functionHandler.
       */
      virtual int exitFunction(Node *) {
        return SWIG_OK;
      }
    
      /**
       * Invoked by functionWrapper callback after call to Language::functionWrapper.
       */
      virtual int emitWrapperFunction(Node *n);
    
      /**
       * Invoked from constantWrapper after call to Language::constantWrapper.
       **/
      virtual int emitConstant(Node *n);
    
      /**
       * Registers a given code snippet for a given key name.
       *
       * This method is called by the fragmentDirective handler
       * of the JAVASCRIPT language module.
       **/
      int registerTemplate(const String *name, const String *code);
    
      /**
       * Retrieve the code template registered for a given name.
       */
      Template getTemplate(const String *name);
    
      State &getState();
    
      ...
    
    }

    The module calls initialize, dump, and close from within the top method:

    int JAVASCRIPT::top(Node *n) {
      emitter->initialize(n);
    
      Language::top(n);
    
      emitter->dump(n);
      emitter->close();
    
      return SWIG_OK;
    }

    The methods enterClass and exitClass are called from within the classHandler method:

    int JAVASCRIPT::classHandler(Node *n) {
    
      emitter->enterClass(n);
      Language::classHandler(n);
      emitter->exitClass(n);
    
      return SWIG_OK;
    }

    In enterClass the emitter stores state information that is necessary when processing class members. In exitClass the wrapper code for the whole class is generated.

    27.5.4 Emitter states

    For storing information during the AST traversal the emitter provides a JSEmitterState with different slots to store data representing the scopes global, class, function, and variable.

    class JSEmitterState {
    
    public:
    
      JSEmitterState();
    
      ~JSEmitterState();
    
      DOH *global();
    
      DOH *global(const char* key, DOH *initial = 0);
    
      DOH *clazz(bool reset = false);
    
      DOH *clazz(const char* key, DOH *initial = 0);
    
      DOH *function(bool reset = false);
    
      DOH *function(const char* key, DOH *initial = 0);
    
      DOH *variable(bool reset = false);
    
      DOH *variable(const char* key, DOH *initial = 0);
    
      static int IsSet(DOH *val);
    
      ...
    };

    When entering a scope, such as in enterClass, the corresponding state is reset and new data is stored:

    state.clazz(RESET);
    state.clazz(NAME, Getattr(n, "sym:name"));

    State information can be retrieved using state.clazz(NAME) or with Getattr on state.clazz() which actually returns a Hash instance.

    27.5.5 Handling Exceptions in JavascriptCore

    Applications with an embedded JavascriptCore should be able to present detailed exception messages that occur in the Javascript engine. Below is an example derived from code provided by Brian Barnes on how these exception details can be extracted.

    void script_exception_to_string(JSContextRef js_context, JSValueRef exception_value_ref, char* return_error_string, int return_error_string_max_length)
    {
      JSObjectRef exception_object;
      JSValueRef value_ref;
      JSStringRef jsstring_property_name = NULL;
      JSValueRef temporary_exception = NULL;
      JSStringRef js_return_string = NULL;
      size_t bytes_needed;
      char* c_result_string = NULL;
      exception_object = JSValueToObject(js_context, exception_value_ref, NULL);
    
      /* source url */
      strcpy(return_error_string, "[");
      jsstring_property_name = JSStringCreateWithUTF8CString("sourceURL");
      value_ref = JSObjectGetProperty(js_context, exception_object, jsstring_property_name, &temporary_exception);
      JSStringRelease(jsstring_property_name);
      js_return_string = JSValueToStringCopy(js_context, value_ref, NULL);
      bytes_needed = JSStringGetMaximumUTF8CStringSize(js_return_string);
      c_result_string = (char*)calloc(bytes_needed, sizeof(char));
      JSStringGetUTF8CString(js_return_string, c_result_string, bytes_needed);
      JSStringRelease(js_return_string);
      strncat(return_error_string, c_result_string, return_error_string_max_length-1);
      free(c_result_string);
    
      strncat(return_error_string, ":", return_error_string_max_length-1);
    
      /* line number */
    
      jsstring_property_name = JSStringCreateWithUTF8CString("line");
      value_ref = JSObjectGetProperty(js_context, exception_object, jsstring_property_name, &temporary_exception);
      JSStringRelease(jsstring_property_name);
      js_return_string = JSValueToStringCopy(js_context, value_ref, NULL);
      bytes_needed = JSStringGetMaximumUTF8CStringSize(js_return_string);
      c_result_string = (char*)calloc(bytes_needed, sizeof(char));
      JSStringGetUTF8CString(js_return_string, c_result_string, bytes_needed);
      JSStringRelease(js_return_string);
      strncat(return_error_string, c_result_string, return_error_string_max_length-1);
      free(c_result_string);
    
      strncat(return_error_string, "]", return_error_string_max_length-1);
    
      /* error message */
    
      jsstring_property_name = JSStringCreateWithUTF8CString("message");
      value_ref = JSObjectGetProperty(js_context, exception_object, jsstring_property_name, &temporary_exception);
      JSStringRelease(jsstring_property_name);
      if(NULL == value_ref)
      {
        strncat(return_error_string, "Unknown Error", return_error_string_max_length-1);
      }
      else
      {
        js_return_string = JSValueToStringCopy(js_context, value_ref, NULL);
        bytes_needed = JSStringGetMaximumUTF8CStringSize(js_return_string);
        c_result_string = (char*)calloc(bytes_needed, sizeof(char));
        JSStringGetUTF8CString(js_return_string, c_result_string, bytes_needed);
        JSStringRelease(js_return_string);
        strncat(return_error_string, c_result_string, return_error_string_max_length-1);
        free(c_result_string);
      }
    }

    It would be used in the following way:

    if(js_exception)
    {
      char return_error_string[256];
      script_exception_to_string(js_context, js_exception, return_error_string, 256);
      printf("Compile error is %s", return_error_string);
    }
    swig-4.0.1/Doc/Manual/linkchecker.config0000644000175000017500000000012513527063513017741 0ustar williamwilliam[filtering] ignorewarnings=http-robots-denied ignorewarnings=https-certificate-error swig-4.0.1/Doc/Manual/SWIGPlus.html0000644000175000017500000045631613527234052016612 0ustar williamwilliam SWIG and C++

    6 SWIG and C++

    This chapter describes SWIG's support for wrapping C++. It is mostly concerned about C++ as defined by the C++ 98 and 03 standards. For additions to the original C++ standard, please read the SWIG and C++11, SWIG and C++14 and SWIG and C++17 chapters. As a prerequisite, you should first read the chapter SWIG Basics to see how SWIG wraps ISO C. Support for C++ builds upon ISO C wrapping and that material will be useful in understanding this chapter.

    6.1 Comments on C++ Wrapping

    Because of its complexity and the fact that C++ can be difficult to integrate with itself let alone other languages, SWIG only provides support for a subset of C++ features. Fortunately, this is now a rather large subset.

    In part, the problem with C++ wrapping is that there is no semantically obvious (or automatic ) way to map many of its advanced features into other languages. As a simple example, consider the problem of wrapping C++ multiple inheritance to a target language with no such support. Similarly, the use of overloaded operators and overloaded functions can be problematic when no such capability exists in a target language.

    A more subtle issue with C++ has to do with the way that some C++ programmers think about programming libraries. In the world of SWIG, you are really trying to create binary-level software components for use in other languages. In order for this to work, a "component" has to contain real executable instructions and there has to be some kind of binary linking mechanism for accessing its functionality. In contrast, C++ has increasingly relied upon generic programming and templates for much of its functionality. Although templates are a powerful feature, they are largely orthogonal to the whole notion of binary components and libraries. For example, an STL vector does not define any kind of binary object for which SWIG can just create a wrapper. To further complicate matters, these libraries often utilize a lot of behind the scenes magic in which the semantics of seemingly basic operations (e.g., pointer dereferencing, procedure call, etc.) can be changed in dramatic and sometimes non-obvious ways. Although this "magic" may present few problems in a C++-only universe, it greatly complicates the problem of crossing language boundaries and provides many opportunities to shoot yourself in the foot. You will just have to be careful.

    6.2 Approach

    To wrap C++, SWIG uses a layered approach to code generation. At the lowest level, SWIG generates a collection of procedural ISO C style wrappers. These wrappers take care of basic type conversion, type checking, error handling, and other low-level details of the C++ binding. These wrappers are also sufficient to bind C++ into any target language that supports built-in procedures. In some sense, you might view this layer of wrapping as providing a C library interface to C++. On top of the low-level procedural (flattened) interface, SWIG generates proxy classes that provide a natural object-oriented (OO) interface to the underlying code. The proxy classes are typically written in the target language itself. For instance, in Python, a real Python class is used to provide a wrapper around the underlying C++ object.

    It is important to emphasize that SWIG takes a deliberately conservative and non-intrusive approach to C++ wrapping. SWIG does not encapsulate C++ classes inside a special C++ adaptor, it does not rely upon templates, nor does it add in additional C++ inheritance when generating wrappers. The last thing that most C++ programs need is even more compiler magic. Therefore, SWIG tries to maintain a very strict and clean separation between the implementation of your C++ application and the resulting wrapper code. You might say that SWIG has been written to follow the principle of least surprise--it does not play sneaky tricks with the C++ type system, it doesn't mess with your class hierarchies, and it doesn't introduce new semantics. Although this approach might not provide the most seamless integration with C++, it is safe, simple, portable, and debuggable.

    Some of this chapter focuses on the low-level procedural interface to C++ that is used as the foundation for all language modules. Keep in mind that the target languages also provide the high-level OO interface via proxy classes. More detailed coverage can be found in the documentation for each target language.

    6.3 Supported C++ features

    SWIG currently supports most C++ features including the following:

    • Classes
    • Constructors and destructors
    • Virtual functions
    • Public inheritance (including multiple inheritance)
    • Static functions
    • Function and method overloading
    • Operator overloading for many standard operators
    • References
    • Templates (including specialization and member templates)
    • Pointers to members
    • Namespaces
    • Default parameters
    • Smart pointers

    The following C++ features are not currently supported:

    • Overloaded versions of certain operators (new, delete, etc.)

    As a rule of thumb, SWIG should not be used on raw C++ source files, use header files only.

    SWIG's C++ support is an ongoing project so some of these limitations may be lifted in future releases. However, we make no promises. Also, submitting a bug report is a very good way to get problems fixed (wink).

    6.4 Command line options and compilation

    When wrapping C++ code, it is critical that SWIG be called with the `-c++' option. This changes the way a number of critical features such as memory management are handled. It also enables the recognition of C++ keywords. Without the -c++ flag, SWIG will either issue a warning or a large number of syntax errors if it encounters C++ code in an interface file.

    When compiling and linking the resulting wrapper file, it is normal to use the C++ compiler. For example:

    $ swig -c++ -tcl example.i
    $ c++ -fPIC -c example_wrap.cxx 
    $ c++ example_wrap.o $(OBJS) -o example.so
    

    Unfortunately, the process varies slightly on each platform. Make sure you refer to the documentation on each target language for further details. The SWIG Wiki also has further details.

    Compatibility Note: Early versions of SWIG generated just a flattened low-level C style API to C++ classes by default. The -noproxy commandline option is recognised by many target languages and will generate just this interface as in earlier versions.

    6.5 Proxy classes

    In order to provide a natural mapping from C++ classes to the target language classes, SWIG's target languages mostly wrap C++ classes with special proxy classes. These proxy classes are typically implemented in the target language itself. For example, if you're building a Python module, each C++ class is wrapped by a Python proxy class. Or if you're building a Java module, each C++ class is wrapped by a Java proxy class.

    6.5.1 Construction of proxy classes

    Proxy classes are always constructed as an extra layer of wrapping that uses low-level accessor functions. To illustrate, suppose you had a C++ class like this:

    class Foo {
      public:
        Foo();
        ~Foo();
        int  bar(int x);
        int  x;
    };
    

    Using C++ as pseudocode, a proxy class looks something like this:

    class FooProxy {
      private:
        Foo    *self;
      public:
        FooProxy() {
          self = new_Foo();
        }
        ~FooProxy() {
          delete_Foo(self);
        }
        int bar(int x) {
          return Foo_bar(self, x);
        }
        int x_get() {
          return Foo_x_get(self);
        }
        void x_set(int x) {
          Foo_x_set(self, x);
        }
    };
    

    Of course, always keep in mind that the real proxy class is written in the target language. For example, in Python, the proxy might look roughly like this:

    class Foo:
        def __init__(self):
            self.this = new_Foo()
        def __del__(self):
            delete_Foo(self.this)
        def bar(self, x):
            return Foo_bar(self.this, x)
        def __getattr__(self, name):
            if name == 'x':
                return Foo_x_get(self.this)
            ...
        def __setattr__(self, name, value):
            if name == 'x':
                Foo_x_set(self.this, value)
            ...
    

    Again, it's important to emphasize that the low-level accessor functions are always used by the proxy classes. Whenever possible, proxies try to take advantage of language features that are similar to C++. This might include operator overloading, exception handling, and other features.

    6.5.2 Resource management in proxies

    A major issue with proxies concerns the memory management of wrapped objects. Consider the following C++ code:

    class Foo {
    public:
      Foo();
      ~Foo();
      int bar(int x);
      int x;
    };
    
    class Spam {
    public:
      Foo *value;
      ...
    };
    

    Consider some script code that uses these classes:

    f = Foo()               # Creates a new Foo
    s = Spam()              # Creates a new Spam
    s.value = f             # Stores a reference to f inside s
    g = s.value             # Returns stored reference
    g = 4                   # Reassign g to some other value
    del f                   # Destroy f 
    

    Now, ponder the resulting memory management issues. When objects are created in the script, the objects are wrapped by newly created proxy classes. That is, there is both a new proxy class instance and a new instance of the underlying C++ class. In this example, both f and s are created in this way. However, the statement s.value is rather curious---when executed, a pointer to f is stored inside another object. This means that the scripting proxy class AND another C++ class share a reference to the same object. To make matters even more interesting, consider the statement g = s.value. When executed, this creates a new proxy class g that provides a wrapper around the C++ object stored in s.value. In general, there is no way to know where this object came from---it could have been created by the script, but it could also have been generated internally. In this particular example, the assignment of g results in a second proxy class for f. In other words, a reference to f is now shared by two proxy classes and a C++ class.

    Finally, consider what happens when objects are destroyed. In the statement, g=4, the variable g is reassigned. In many languages, this makes the old value of g available for garbage collection. Therefore, this causes one of the proxy classes to be destroyed. Later on, the statement del f destroys the other proxy class. Of course, there is still a reference to the original object stored inside another C++ object. What happens to it? Is the object still valid?

    To deal with memory management problems, proxy classes provide an API for controlling ownership. In C++ pseudocode, ownership control might look roughly like this:

    class FooProxy {
      public:
        Foo    *self;
        int     thisown;
    
        FooProxy() {
          self = new_Foo();
          thisown = 1;       // Newly created object
        }
        ~FooProxy() {
          if (thisown) delete_Foo(self);
        }
        ...
        // Ownership control API
        void disown() {
          thisown = 0;
        }
        void acquire() {
          thisown = 1;
        }
    };
    
    class FooPtrProxy: public FooProxy {
    public:
      FooPtrProxy(Foo *s) {
        self = s;
        thisown = 0;
      }
    };
    
    class SpamProxy {
      ...
      FooProxy *value_get() {
        return FooPtrProxy(Spam_value_get(self));
      }
      void value_set(FooProxy *v) {
        Spam_value_set(self, v->self);
        v->disown();
      }
      ...
    };
    

    Looking at this code, there are a few central features:

    • Each proxy class keeps an extra flag to indicate ownership. C++ objects are only destroyed if the ownership flag is set.
    • When new objects are created in the target language, the ownership flag is set.
    • When a reference to an internal C++ object is returned, it is wrapped by a proxy class, but the proxy class does not have ownership.
    • In certain cases, ownership is adjusted. For instance, when a value is assigned to the member of a class, ownership is lost.
    • Manual ownership control is provided by special disown() and acquire() methods.

    Given the tricky nature of C++ memory management, it is impossible for proxy classes to automatically handle every possible memory management problem. However, proxies do provide a mechanism for manual control that can be used (if necessary) to address some of the more tricky memory management problems.

    6.5.3 Language specific details

    Language specific details on proxy classes are contained in the chapters describing each target language. This chapter has merely introduced the topic in a very general way.

    6.6 Simple C++ wrapping

    The following code shows a SWIG interface file for a simple C++ class.

    %module list
    %{
    #include "list.h"
    %}
    
    // Very simple C++ example for linked list
    
    class List {
    public:
      List();
      ~List();
      int  search(char *value);
      void insert(char *);
      void remove(char *);
      char *get(int n);
      int  length;
    static void print(List *l);
    };
    

    To generate wrappers for this class, SWIG first reduces the class to a collection of low-level C-style accessor functions which are then used by the proxy classes.

    6.6.1 Constructors and destructors

    C++ constructors and destructors are translated into accessor functions such as the following :

    List * new_List(void) {
      return new List;
    }
    void delete_List(List *l) {
      delete l;
    }
    
    

    6.6.2 Default constructors, copy constructors and implicit destructors

    Following the C++ rules for implicit constructor and destructors, SWIG will automatically assume there is one even when they are not explicitly declared in the class interface.

    In general then:

    • If a C++ class does not declare any explicit constructor, SWIG will automatically generate a wrapper for one.
    • If a C++ class does not declare an explicit copy constructor, SWIG will automatically generate a wrapper for one if the %copyctor is used.
    • If a C++ class does not declare an explicit destructor, SWIG will automatically generate a wrapper for one.

    And as in C++, a few rules that alters the previous behavior:

    • A default constructor is not created if a class already defines a constructor with arguments.
    • Default constructors are not generated for classes with pure virtual methods or for classes that inherit from an abstract class, but don't provide definitions for all of the pure methods.
    • A default constructor is not created unless all base classes support a default constructor.
    • Default constructors and implicit destructors are not created if a class defines them in a private or protected section.
    • Default constructors and implicit destructors are not created if any base class defines a non-public default constructor or destructor.

    SWIG should never generate a default constructor, copy constructor or default destructor wrapper for a class in which it is illegal to do so. In some cases, however, it could be necessary (if the complete class declaration is not visible from SWIG, and one of the above rules is violated) or desired (to reduce the size of the final interface) by manually disabling the implicit constructor/destructor generation.

    To manually disable these, the %nodefaultctor and %nodefaultdtor feature flag directives can be used. Note that these directives only affects the implicit generation, and they have no effect if the default/copy constructors or destructor are explicitly declared in the class interface.

    For example:

    %nodefaultctor Foo;  // Disable the default constructor for class Foo.
    class Foo {          // No default constructor is generated, unless one is declared
    ...
    };
    class Bar {          // A default constructor is generated, if possible
    ...
    };
    

    The directive %nodefaultctor can also be applied "globally", as in:

    %nodefaultctor; // Disable creation of default constructors
    class Foo {     // No default constructor is generated, unless one is declared
    ...
    };
    class Bar {   
    public:
      Bar();        // The default constructor is generated, since one is declared
    };
    %clearnodefaultctor; // Enable the creation of default constructors again
    

    The corresponding %nodefaultdtor directive can be used to disable the generation of the default or implicit destructor, if needed. Be aware, however, that this could lead to memory leaks in the target language. Hence, it is recommended to use this directive only in well known cases. For example:

    %nodefaultdtor Foo;   // Disable the implicit/default destructor for class Foo.
    class Foo {           // No destructor is generated, unless one is declared
    ...
    };
    

    Compatibility Note: The generation of default constructors/implicit destructors was made the default behavior in SWIG 1.3.7. This may break certain older modules, but the old behavior can be easily restored using %nodefault or the -nodefault command line option. Furthermore, in order for SWIG to properly generate (or not generate) default constructors, it must be able to gather information from both the private and protected sections (specifically, it needs to know if a private or protected constructor/destructor is defined). In older versions of SWIG, it was fairly common to simply remove or comment out the private and protected sections of a class due to parser limitations. However, this removal may now cause SWIG to erroneously generate constructors for classes that define a constructor in those sections. Consider restoring those sections in the interface or using %nodefault to fix the problem.

    Note: The %nodefault directive/-nodefault options described above, which disable both the default constructor and the implicit destructors, could lead to memory leaks, and so it is strongly recommended to not use them.

    6.6.3 When constructor wrappers aren't created

    If a class defines a constructor, SWIG normally tries to generate a wrapper for it. However, SWIG will not generate a constructor wrapper if it thinks that it will result in illegal wrapper code. There are really two cases where this might show up.

    First, SWIG won't generate wrappers for protected or private constructors. For example:

    class Foo {
    protected:
      Foo();         // Not wrapped.
    public:
      ...
    };
    

    Next, SWIG won't generate wrappers for a class if it appears to be abstract--that is, it has undefined pure virtual methods. Here are some examples:

    class Bar {
    public:
      Bar();               // Not wrapped.  Bar is abstract.
      virtual void spam(void) = 0;
    };
    
    class Grok : public Bar {
    public:
      Grok();              // Not wrapped. No implementation of abstract spam().
    };
    

    Some users are surprised (or confused) to find missing constructor wrappers in their interfaces. In almost all cases, this is caused when classes are determined to be abstract. To see if this is the case, run SWIG with all of its warnings turned on:

    % swig -Wall -python module.i
    

    In this mode, SWIG will issue a warning for all abstract classes. It is possible to force a class to be non-abstract using this:

    %feature("notabstract") Foo;
    
    class Foo : public Bar {
    public:
      Foo();    // Generated no matter what---not abstract.
      ...
    };
    

    More information about %feature can be found in the Customization features chapter.

    6.6.4 Copy constructors

    If a class defines more than one constructor, its behavior depends on the capabilities of the target language. If overloading is supported, the copy constructor is accessible using the normal constructor function. For example, if you have this:

    class List {
    public:
      List();    
      List(const List &);      // Copy constructor
      ...
    };
    

    then the copy constructor can be used as follows:

    x = List()               # Create a list
    y = List(x)              # Copy list x
    

    If the target language does not support overloading, then the copy constructor is available through a special function like this:

    List *copy_List(List *f) {
      return new List(*f);
    }
    

    Note: For a class X, SWIG only treats a constructor as a copy constructor if it can be applied to an object of type X or X *. If more than one copy constructor is defined, only the first definition that appears is used as the copy constructor--other definitions will result in a name-clash. Constructors such as X(const X &), X(X &), and X(X *) are handled as copy constructors in SWIG.

    Note: SWIG does not generate a copy constructor wrapper unless one is explicitly declared in the class. This differs from the treatment of default constructors and destructors. However, copy constructor wrappers can be generated if using the copyctor feature flag. For example:

    %copyctor List;
    
    class List {
    public:
      List();    
    };
    

    Will generate a copy constructor wrapper for List.

    Compatibility note: Special support for copy constructors was not added until SWIG-1.3.12. In previous versions, copy constructors could be wrapped, but they had to be renamed. For example:

    class Foo {
    public:
      Foo();
      %name(CopyFoo) Foo(const Foo &);
      ...
    };
    

    For backwards compatibility, SWIG does not perform any special copy-constructor handling if the constructor has been manually renamed. For instance, in the above example, the name of the constructor is set to new_CopyFoo(). This is the same as in older versions.

    6.6.5 Member functions

    All member functions are roughly translated into accessor functions like this :

    int List_search(List *obj, char *value) {
      return obj->search(value);
    }
    
    

    This translation is the same even if the member function has been declared as virtual.

    It should be noted that SWIG does not actually create a C accessor function in the code it generates. Instead, member access such as obj->search(value) is directly inlined into the generated wrapper functions. However, the name and calling convention of the low-level procedural wrappers match the accessor function prototype described above.

    6.6.6 Static members

    Static member functions are called directly without making any special transformations. For example, the static member function print(List *l) directly invokes List::print(List *l) in the generated wrapper code.

    6.6.7 Member data

    Member data is handled in exactly the same manner as for C structures. A pair of accessor functions are effectively created. For example :

    int List_length_get(List *obj) {
      return obj->length;
    }
    int List_length_set(List *obj, int value) {
      obj->length = value;
      return value;
    }
    
    

    A read-only member can be created using the %immutable and %mutable feature flag directive. For example, we probably wouldn't want the user to change the length of a list so we could do the following to make the value available, but read-only.

    class List {
    public:
    ...
    %immutable;
      int length;
    %mutable;
    ...
    };
    

    Alternatively, you can specify an immutable member in advance like this:

    %immutable List::length;
    ...
    class List {
      ...
      int length;         // Immutable by above directive
      ...
    };
    

    Similarly, all data attributes declared as const are wrapped as read-only members.

    By default, SWIG uses the const reference typemaps for members that are primitive types. There are some subtle issues when wrapping data members that are not primitive types, such as classes. For instance, if you had another class like this,

    class Foo {
    public:
      List items;
      ...
    

    then the low-level accessor to the items member actually uses pointers. For example:

    List *Foo_items_get(Foo *self) {
      return &self->items;
    }
    void Foo_items_set(Foo *self, List *value) {
      self->items = *value;
    }
    

    More information about this can be found in the SWIG Basics chapter, Structure data members section.

    The wrapper code to generate the accessors for classes comes from the pointer typemaps. This can be somewhat unnatural for some types. For example, a user would expect the STL std::string class member variables to be wrapped as a string in the target language, rather than a pointer to this class. The const reference typemaps offer this type of marshalling, so there is a feature to tell SWIG to use the const reference typemaps rather than the pointer typemaps. It is the naturalvar feature and can be used to effectively change the way accessors are generated to the following:

    const List &Foo_items_get(Foo *self) {
      return self->items;
    }
    void Foo_items_set(Foo *self, const List &value) {
      self->items = value;
    }
    

    The %naturalvar directive is a macro for, and hence equivalent to, %feature("naturalvar"). It can be used as follows:

    // All List variables will use const List& typemaps
    %naturalvar List;
    
    // Only Foo::myList will use const List& typemaps
    %naturalvar Foo::myList;
    struct Foo {
      List myList;
    };
    
    // All non-primitive types will use const reference typemaps
    %naturalvar;
    

    The observant reader will notice that %naturalvar works like any other feature flag directive but with some extra flexibility. The first of the example usages above shows %naturalvar attaching to the myList's variable type, that is the List class. The second usage shows %naturalvar attaching to the variable name. Hence the naturalvar feature can be used on either the variable's name or type. Note that using the naturalvar feature on a variable's name overrides any naturalvar feature attached to the variable's type.

    It is generally a good idea to use this feature globally as the reference typemaps have extra NULL checking compared to the pointer typemaps. A pointer can be NULL, whereas a reference cannot, so the extra checking ensures that the target language user does not pass in a value that translates to a NULL pointer and thereby preventing any potential NULL pointer dereferences. The %naturalvar feature will apply to global variables in addition to member variables in some language modules, eg C# and Java.

    The naturalvar behavior can also be turned on as a global setting via the -naturalvar commandline option or the module mode option, %module(naturalvar=1). However, any use of %feature("naturalvar") will override the global setting.

    Compatibility note: The %naturalvar feature was introduced in SWIG-1.3.28, prior to which it was necessary to manually apply the const reference typemaps, eg %apply const std::string & { std::string * }, but this example would also apply the typemaps to methods taking a std::string pointer.

    Compatibility note: Read-only access used to be controlled by a pair of directives %readonly and %readwrite. Although these directives still work, they generate a warning message. Simply change the directives to %immutable; and %mutable; to silence the warning. Don't forget the extra semicolon!

    Compatibility note: Prior to SWIG-1.3.12, all members of unknown type were wrapped into accessor functions using pointers. For example, if you had a structure like this

    struct Foo {
      size_t  len;
    };
    

    and nothing was known about size_t, then accessors would be written to work with size_t *. Starting in SWIG-1.3.12, this behavior has been modified. Specifically, pointers will only be used if SWIG knows that a datatype corresponds to a structure or class. Therefore, the above code would be wrapped into accessors involving size_t. This change is subtle, but it smooths over a few problems related to structure wrapping and some of SWIG's customization features.

    6.7 Protection

    SWIG wraps class members that are public following the C++ conventions, i.e., by explicit public declaration or by the use of the using directive. In general, anything specified in a private or protected section will be ignored, although the internal code generator sometimes looks at the contents of the private and protected sections so that it can properly generate code for default constructors and destructors. Directors could also modify the way non-public virtual protected members are treated.

    By default, members of a class definition are assumed to be private until you explicitly give a `public:' declaration (This is the same convention used by C++).

    6.8 Enums and constants

    Enumerations and constants are handled differently by the different language modules and are described in detail in the appropriate language chapter. However, many languages map enums and constants in a class definition into constants with the classname as a prefix. For example :

    class Swig {
    public:
      enum {ALE, LAGER, PORTER, STOUT};
    };
    
    

    Generates the following set of constants in the target scripting language :

    Swig_ALE = Swig::ALE
    Swig_LAGER = Swig::LAGER
    Swig_PORTER = Swig::PORTER
    Swig_STOUT = Swig::STOUT
    
    

    Members declared as const are wrapped as read-only members and do not create constants.

    6.9 Friends

    Friend declarations are recognised by SWIG. For example, if you have this code:

    class Foo {
    public:
      ...
      friend void blah(Foo *f);
      ...
    };
    

    then the friend declaration does result in a wrapper code equivalent to one generated for the following declaration

    class Foo {
    public:
      ...
    };
    
    void blah(Foo *f);    
    

    A friend declaration, as in C++, is understood to be in the same scope where the class is declared, hence, you can have

    
    %ignore bar::blah(Foo *f);
    
    namespace bar {
    
      class Foo {
      public:
        ...
        friend void blah(Foo *f);
        ...
      };
    }
    

    and a wrapper for the method 'blah' will not be generated.

    6.10 References and pointers

    C++ references are supported, but SWIG transforms them back into pointers. For example, a declaration like this :

    class Foo {
    public:
      double bar(double &a);
    }
    

    has a low-level accessor

    double Foo_bar(Foo *obj, double *a) {
      obj->bar(*a);
    }
    

    As a special case, most language modules pass const references to primitive datatypes (int, short, float, etc.) by value instead of pointers. For example, if you have a function like this,

    void foo(const int &x);
    

    it is called from a script as follows:

    foo(3)              # Notice pass by value
    

    Functions that return a reference are remapped to return a pointer instead. For example:

    class Bar {
    public:
      Foo &spam();
    };
    

    Generates an accessor like this:

    Foo *Bar_spam(Bar *obj) {
      Foo &result = obj->spam();
      return &result;
    }
    

    However, functions that return const references to primitive datatypes (int, short, etc.) normally return the result as a value rather than a pointer. For example, a function like this,

    const int &bar();
    

    will return integers such as 37 or 42 in the target scripting language rather than a pointer to an integer.

    Don't return references to objects allocated as local variables on the stack. SWIG doesn't make a copy of the objects so this will probably cause your program to crash.

    Note: The special treatment for references to primitive datatypes is necessary to provide more seamless integration with more advanced C++ wrapping applications---especially related to templates and the STL. This was first added in SWIG-1.3.12.

    6.11 Pass and return by value

    Occasionally, a C++ program will pass and return class objects by value. For example, a function like this might appear:

    Vector cross_product(Vector a, Vector b);
    

    If no information is supplied about Vector, SWIG creates a wrapper function similar to the following:

    Vector *wrap_cross_product(Vector *a, Vector *b) {
      Vector x = *a;
      Vector y = *b;
      Vector r = cross_product(x, y);
      return new Vector(r);
    }

    In order for the wrapper code to compile, Vector must define a copy constructor and a default constructor.

    If Vector is defined as a class in the interface, but it does not support a default constructor, SWIG changes the wrapper code by encapsulating the arguments inside a special C++ template wrapper class, through a process called the "Fulton Transform". This produces a wrapper that looks like this:

    Vector cross_product(Vector *a, Vector *b) {
      SwigValueWrapper<Vector> x = *a;
      SwigValueWrapper<Vector> y = *b;
      SwigValueWrapper<Vector> r = cross_product(x, y);
      return new Vector(r);
    }
    

    This transformation is a little sneaky, but it provides support for pass-by-value even when a class does not provide a default constructor and it makes it possible to properly support a number of SWIG's customization options. The definition of SwigValueWrapper can be found by reading the SWIG wrapper code. This class is really nothing more than a thin wrapper around a pointer.

    Although SWIG usually detects the classes to which the Fulton Transform should be applied, in some situations it's necessary to override it. That's done with %feature("valuewrapper") to ensure it is used and %feature("novaluewrapper") to ensure it is not used:

    %feature("novaluewrapper") A;    
    class A;
    
    %feature("valuewrapper") B;
    struct B { 
      B();
      // ....
    };   
    

    It is well worth considering turning this feature on for classes that do have a default constructor. It will remove a redundant constructor call at the point of the variable declaration in the wrapper, so will generate notably better performance for large objects or for classes with expensive construction. Alternatively consider returning a reference or a pointer.

    Note: this transformation has no effect on typemaps or any other part of SWIG---it should be transparent except that you may see this code when reading the SWIG output file.

    Note: This template transformation is new in SWIG-1.3.11 and may be refined in future SWIG releases. In practice, it is only absolutely necessary to do this for classes that don't define a default constructor.

    Note: The use of this template only occurs when objects are passed or returned by value. It is not used for C++ pointers or references.

    6.12 Inheritance

    SWIG supports C++ inheritance of classes and allows both single and multiple inheritance, as limited or allowed by the target language. The SWIG type-checker knows about the relationship between base and derived classes and allows pointers to any object of a derived class to be used in functions of a base class. The type-checker properly casts pointer values and is safe to use with multiple inheritance.

    SWIG treats private or protected inheritance as close to the C++ spirit, and target language capabilities, as possible. In most cases, this means that SWIG will parse the non-public inheritance declarations, but that will have no effect in the generated code, besides the implicit policies derived for constructors and destructors.

    The following example shows how SWIG handles inheritance. For clarity, the full C++ code has been omitted.

    // shapes.i
    %module shapes
    %{
    #include "shapes.h"
    %}
    
    class Shape {
    public:
      double x, y;
      virtual double area() = 0;
      virtual double perimeter() = 0;
      void    set_location(double x, double y);
    };
    class Circle : public Shape {
    public:
      Circle(double radius);
      ~Circle();
      double area();
      double perimeter();
    };
    class Square : public Shape {
    public:
      Square(double size);
      ~Square();
      double area();
      double perimeter();
    }
    

    When wrapped into Python, we can perform the following operations (shown using the low level Python accessors):

    $ python
    >>> import shapes
    >>> circle = shapes.new_Circle(7)
    >>> square = shapes.new_Square(10)
    >>> print shapes.Circle_area(circle)
    153.93804004599999757
    >>> print shapes.Shape_area(circle)
    153.93804004599999757
    >>> print shapes.Shape_area(square)
    100.00000000000000000
    >>> shapes.Shape_set_location(square, 2, -3)
    >>> print shapes.Shape_perimeter(square)
    40.00000000000000000
    >>>
    

    In this example, Circle and Square objects have been created. Member functions can be invoked on each object by making calls to Circle_area, Square_area, and so on. However, the same results can be accomplished by simply using the Shape_area function on either object.

    One important point concerning inheritance is that the low-level accessor functions are only generated for classes in which they are actually declared. For instance, in the above example, the method set_location() is only accessible as Shape_set_location() and not as Circle_set_location() or Square_set_location(). Of course, the Shape_set_location() function will accept any kind of object derived from Shape. Similarly, accessor functions for the attributes x and y are generated as Shape_x_get(), Shape_x_set(), Shape_y_get(), and Shape_y_set(). Functions such as Circle_x_get() are not available--instead you should use Shape_x_get().

    Note that there is a one to one correlation between the low-level accessor functions and the proxy methods and therefore there is also a one to one correlation between the C++ class methods and the generated proxy class methods.

    Note: For the best results, SWIG requires all base classes to be defined in an interface. Otherwise, you may get a warning message like this:

    example.i:18: Warning 401: Nothing known about base class 'Foo'. Ignored.
    

    If any base class is undefined, SWIG still generates correct type relationships. For instance, a function accepting a Foo * will accept any object derived from Foo regardless of whether or not SWIG actually wrapped the Foo class. If you really don't want to generate wrappers for the base class, but you want to silence the warning, you might consider using the %import directive to include the file that defines Foo. %import simply gathers type information, but doesn't generate wrappers. Alternatively, you could just define Foo as an empty class in the SWIG interface or use warning suppression.

    Note: typedef-names can be used as base classes. For example:

    class Foo {
    ...
    };
    
    typedef Foo FooObj;
    class Bar : public FooObj {     // Ok.  Base class is Foo
    ...
    };
    

    Similarly, typedef allows unnamed structures to be used as base classes. For example:

    typedef struct {
      ...
    } Foo;
    
    class Bar : public Foo {    // Ok. 
    ...
    };
    

    Compatibility Note: Starting in version 1.3.7, SWIG only generates low-level accessor wrappers for the declarations that are actually defined in each class. This differs from SWIG1.1 which used to inherit all of the declarations defined in base classes and regenerate specialized accessor functions such as Circle_x_get(), Square_x_get(), Circle_set_location(), and Square_set_location(). This behavior resulted in huge amounts of replicated code for large class hierarchies and made it awkward to build applications spread across multiple modules (since accessor functions are duplicated in every single module). It is also unnecessary to have such wrappers when advanced features like proxy classes are used. Note: Further optimizations are enabled when using the -fvirtual option, which avoids the regenerating of wrapper functions for virtual members that are already defined in a base class.

    6.13 A brief discussion of multiple inheritance, pointers, and type checking

    When a target scripting language refers to a C++ object, it normally uses a tagged pointer object that contains both the value of the pointer and a type string. For example, in Tcl, a C++ pointer might be encoded as a string like this:

    _808fea88_p_Circle
    

    A somewhat common question is whether or not the type-tag could be safely removed from the pointer. For instance, to get better performance, could you strip all type tags and just use simple integers instead?

    In general, the answer to this question is no. In the wrappers, all pointers are converted into a common data representation in the target language. Typically this is the equivalent of casting a pointer to void *. This means that any C++ type information associated with the pointer is lost in the conversion.

    The problem with losing type information is that it is needed to properly support many advanced C++ features--especially multiple inheritance. For example, suppose you had code like this:

    class A {
    public:
      int x;
    };
    
    class B {
    public:
      int y;
    };
    
    class C : public A, public B {
    };
    
    int A_function(A *a) {
      return a->x;
    }
    
    int B_function(B *b) {
      return b->y;
    }
    

    Now, consider the following code that uses void *.

    C *c = new C();
    void *p = (void *) c;
    ...
    int x = A_function((A *) p);
    int y = B_function((B *) p);
    

    In this code, both A_function() and B_function() may legally accept an object of type C * (via inheritance). However, one of the functions will always return the wrong result when used as shown. The reason for this is that even though p points to an object of type C, the casting operation doesn't work like you would expect. Internally, this has to do with the data representation of C. With multiple inheritance, the data from each base class is stacked together. For example:

                 ------------    <--- (C *),  (A *)
                |     A      |
                |------------|   <--- (B *)
                |     B      |
                 ------------   
    

    Because of this stacking, a pointer of type C * may change value when it is converted to a A * or B *. However, this adjustment does not occur if you are converting from a void *.

    The use of type tags marks all pointers with the real type of the underlying object. This extra information is then used by SWIG generated wrappers to correctly cast pointer values under inheritance (avoiding the above problem).

    Some of the language modules are able to solve the problem by storing multiple instances of the pointer, for example, A *, in the A proxy class as well as C * in the C proxy class. The correct cast can then be made by choosing the correct void * pointer to use and is guaranteed to work as the cast to a void pointer and back to the same type does not lose any type information:

    C *c = new C();
    void *p = (void *) c;
    void *pA = (void *) c;
    void *pB = (void *) c;
    ...
    int x = A_function((A *) pA);
    int y = B_function((B *) pB);
    

    In practice, the pointer is held as an integral number in the target language proxy class.

    6.14 Default arguments

    SWIG will wrap all types of functions that have default arguments. For example member functions:

    class Foo {
    public:
      void bar(int x, int y = 3, int z = 4);
    };
    

    SWIG handles default arguments by generating an extra overloaded method for each defaulted argument. SWIG is effectively handling methods with default arguments as if it was wrapping the equivalent overloaded methods. Thus for the example above, it is as if we had instead given the following to SWIG:

    class Foo {
    public:
      void bar(int x, int y, int z);
      void bar(int x, int y);
      void bar(int x);
    };
    

    The wrappers produced are exactly the same as if the above code was instead fed into SWIG. Details of this are covered in the next section Overloaded functions and methods. This approach allows SWIG to wrap all possible default arguments, but can be verbose. For example if a method has ten default arguments, then eleven wrapper methods are generated.

    Please see the Features and default arguments section for more information on using %feature with functions with default arguments. The Renaming and ambiguity resolution section also deals with using %rename and %ignore on methods with default arguments. If you are writing your own typemaps for types used in methods with default arguments, you may also need to write a typecheck typemap. See the Typemaps and overloading section for details or otherwise use the compactdefaultargs feature flag as mentioned below.

    Compatibility note: Versions of SWIG prior to SWIG-1.3.23 wrapped default arguments slightly differently. Instead a single wrapper method was generated and the default values were copied into the C++ wrappers so that the method being wrapped was then called with all the arguments specified. If the size of the wrappers are a concern then this approach to wrapping methods with default arguments can be re-activated by using the compactdefaultargs feature flag.

    %feature("compactdefaultargs") Foo::bar;
    class Foo {
    public:
      void bar(int x, int y = 3, int z = 4);
    };
    

    This is great for reducing the size of the wrappers, but the caveat is it does not work for the statically typed languages, such as C# and Java, which don't have optional arguments in the language, Another restriction of this feature is that it cannot handle default arguments that are not public. The following example illustrates this:

    class Foo {
    private:
      static const int spam;
    public:
      void bar(int x, int y = spam);   // Won't work with %feature("compactdefaultargs") -
                                       // private default value
    };
    

    This produces uncompilable wrapper code because default values in C++ are evaluated in the same scope as the member function whereas SWIG evaluates them in the scope of a wrapper function (meaning that the values have to be public).

    The compactdefaultargs feature is automatically turned on when wrapping C code with default arguments. Some target languages will also automatically turn on this feature if the keyword arguments feature (kwargs) is specified for either C or C++ functions, and the target language supports kwargs, the compactdefaultargs feature is also automatically turned on. Keyword arguments are a language feature of some scripting languages, for example Ruby and Python. SWIG is unable to support kwargs when wrapping overloaded methods, so the default approach cannot be used.

    6.15 Overloaded functions and methods

    In many language modules, SWIG provides partial support for overloaded functions, methods, and constructors. For example, if you supply SWIG with overloaded functions like this:

    void foo(int x) {
      printf("x is %d\n", x);
    }
    void foo(char *x) {
      printf("x is '%s'\n", x);
    }
    

    The function is used in a completely natural way. For example:

    >>> foo(3)
    x is 3
    >>> foo("hello")
    x is 'hello'
    >>>
    

    Overloading works in a similar manner for methods and constructors. For example if you have this code,

    class Foo {
    public:
      Foo();
      Foo(const Foo &);   // Copy constructor
      void bar(int x);
      void bar(char *s, int y);
    };
    

    it might be used like this

    >>> f = Foo()          # Create a Foo
    >>> f.bar(3)
    >>> g = Foo(f)         # Copy Foo
    >>> f.bar("hello", 2)
    

    6.15.1 Dispatch function generation

    The implementation of overloaded functions and methods is somewhat complicated due to the dynamic nature of scripting languages. Unlike C++, which binds overloaded methods at compile time, SWIG must determine the proper function as a runtime check for scripting language targets. This check is further complicated by the typeless nature of certain scripting languages. For instance, in Tcl, all types are simply strings. Therefore, if you have two overloaded functions like this,

    void foo(char *x);
    void foo(int x);
    

    the order in which the arguments are checked plays a rather critical role.

    For statically typed languages, SWIG uses the language's method overloading mechanism. To implement overloading for the scripting languages, SWIG generates a dispatch function that checks the number of passed arguments and their types. To create this function, SWIG first examines all of the overloaded methods and ranks them according to the following rules:

    1. Number of required arguments. Methods are sorted by increasing number of required arguments.
    2. Argument type precedence. All C++ datatypes are assigned a numeric type precedence value (which is determined by the language module).

      Type              Precedence
      ----------------  ----------
      TYPE *            0     (High)
      void *            20
      Integers          40
      Floating point    60
      char              80
      Strings           100   (Low)
      

      Using these precedence values, overloaded methods with the same number of required arguments are sorted in increased order of precedence values.

    This may sound very confusing, but an example will help. Consider the following collection of overloaded methods:

    void foo(double);
    void foo(int);
    void foo(Bar *);
    void foo();
    void foo(int x, int y, int z, int w);
    void foo(int x, int y, int z = 3);
    void foo(double x, double y);
    void foo(double x, Bar *z);
    

    The first rule simply ranks the functions by required argument count. This would produce the following list:

    rank
    -----
    [0]   foo()
    [1]   foo(double);
    [2]   foo(int);
    [3]   foo(Bar *);
    [4]   foo(int x, int y, int z = 3);
    [5]   foo(double x, double y)
    [6]   foo(double x, Bar *z)
    [7]   foo(int x, int y, int z, int w);
    

    The second rule, simply refines the ranking by looking at argument type precedence values.

    rank
    -----
    [0]   foo()
    [1]   foo(Bar *);
    [2]   foo(int);
    [3]   foo(double);
    [4]   foo(int x, int y, int z = 3);
    [5]   foo(double x, Bar *z)
    [6]   foo(double x, double y)
    [7]   foo(int x, int y, int z, int w);
    

    Finally, to generate the dispatch function, the arguments passed to an overloaded method are simply checked in the same order as they appear in this ranking.

    If you're still confused, don't worry about it---SWIG is probably doing the right thing.

    6.15.2 Ambiguity in overloading

    Regrettably, SWIG is not able to support every possible use of valid C++ overloading. Consider the following example:

    void foo(int x);
    void foo(long x);
    

    In C++, this is perfectly legal. However, in a scripting language, there is generally only one kind of integer object. Therefore, which one of these functions do you pick? Clearly, there is no way to truly make a distinction just by looking at the value of the integer itself (int and long may even be the same precision). Therefore, when SWIG encounters this situation, it may generate a warning message like this for scripting languages:

    example.i:4: Warning 509: Overloaded method foo(long) effectively ignored,
    example.i:3: Warning 509: as it is shadowed by foo(int).
    

    or for statically typed languages like Java:

    example.i:4: Warning 516: Overloaded method foo(long) ignored,
    example.i:3: Warning 516: using foo(int) instead.
    at example.i:3 used.
    

    This means that the second overloaded function will be inaccessible from a scripting interface or the method won't be wrapped at all. This is done as SWIG does not know how to disambiguate it from an earlier method.

    Ambiguity problems are known to arise in the following situations:

    • Integer conversions. Datatypes such as int, long, and short cannot be disambiguated in some languages. Shown above.
    • Floating point conversion. float and double can not be disambiguated in some languages.
    • Pointers and references. For example, Foo * and Foo &.
    • Pointers and arrays. For example, Foo * and Foo [4].
    • Pointers and instances. For example, Foo and Foo *. Note: SWIG converts all instances to pointers.
    • Qualifiers. For example, const Foo * and Foo *.
    • Default vs. non default arguments. For example, foo(int a, int b) and foo(int a, int b = 3).

    When an ambiguity arises, methods are checked in the same order as they appear in the interface file. Therefore, earlier methods will shadow methods that appear later.

    When wrapping an overloaded function, there is a chance that you will get a warning message like this:

    example.i:3: Warning 467: Overloaded foo(int) not supported (incomplete type checking rule - 
    no precedence level in typecheck typemap for 'int').
    

    This error means that the target language module supports overloading, but for some reason there is no type-checking rule that can be used to generate a working dispatch function. The resulting behavior is then undefined. You should report this as a bug to the SWIG bug tracking database if this is due to one of the typemaps supplied with SWIG.

    If you get an error message such as the following,

    foo.i:6. Overloaded declaration ignored.  Spam::foo(double )
    foo.i:5. Previous declaration is Spam::foo(int )
    foo.i:7. Overloaded declaration ignored.  Spam::foo(Bar *, Spam *, int )
    foo.i:5. Previous declaration is Spam::foo(int )
    

    it means that the target language module has not yet implemented support for overloaded functions and methods. The only way to fix the problem is to read the next section.

    6.15.3 Renaming and ambiguity resolution

    If an ambiguity in overload resolution occurs or if a module doesn't allow overloading, there are a few strategies for dealing with the problem. First, you can tell SWIG to ignore one of the methods. This is easy---simply use the %ignore directive. For example:

    %ignore foo(long);
    
    void foo(int);
    void foo(long);       // Ignored.  Oh well.
    

    The other alternative is to rename one of the methods. This can be done using %rename. For example:

    %rename("foo_short") foo(short);
    %rename(foo_long) foo(long);
    
    void foo(int);
    void foo(short);      // Accessed as foo_short()
    void foo(long);       // Accessed as foo_long()
    

    Note that the quotes around the new name are optional, however, should the new name be a C/C++ keyword they would be essential in order to avoid a parsing error. The %ignore and %rename directives are both rather powerful in their ability to match declarations. When used in their simple form, they apply to both global functions and methods. For example:

    /* Forward renaming declarations */
    %rename(foo_i) foo(int); 
    %rename(foo_d) foo(double);
    ...
    void foo(int);           // Becomes 'foo_i'
    void foo(char *c);       // Stays 'foo' (not renamed)
    
    class Spam {
    public:
      void foo(int);      // Becomes 'foo_i'
      void foo(double);   // Becomes 'foo_d'
      ...
    };
    

    If you only want the renaming to apply to a certain scope, the C++ scope resolution operator (::) can be used. For example:

    %rename(foo_i) ::foo(int);      // Only rename foo(int) in the global scope.
                                    // (will not rename class members)
    
    %rename(foo_i) Spam::foo(int);  // Only rename foo(int) in class Spam
    

    When a renaming operator is applied to a class as in Spam::foo(int), it is applied to that class and all derived classes. This can be used to apply a consistent renaming across an entire class hierarchy with only a few declarations. For example:

    %rename(foo_i) Spam::foo(int);
    %rename(foo_d) Spam::foo(double);
    
    class Spam {
    public:
      virtual void foo(int);      // Renamed to foo_i
      virtual void foo(double);   // Renamed to foo_d
      ...
    };
    
    class Bar : public Spam {
    public:
      virtual void foo(int);      // Renamed to foo_i
      virtual void foo(double);   // Renamed to foo_d
      ...
    };
    
    class Grok : public Bar {
    public:
      virtual void foo(int);      // Renamed to foo_i
      virtual void foo(double);   // Renamed to foo_d
      ...
    };
    

    It is also possible to include %rename specifications in the class definition itself. For example:

    class Spam {
      %rename(foo_i) foo(int);
      %rename(foo_d) foo(double);
    public:
      virtual void foo(int);      // Renamed to foo_i
      virtual void foo(double);   // Renamed to foo_d
      ...
    };
    
    class Bar : public Spam {
    public:
      virtual void foo(int);      // Renamed to foo_i
      virtual void foo(double);   // Renamed to foo_d
    ...
    };
    

    In this case, the %rename directives still get applied across the entire inheritance hierarchy, but it's no longer necessary to explicitly specify the class prefix Spam::.

    A special form of %rename can be used to apply a renaming just to class members (of all classes):

    %rename(foo_i) *::foo(int);   // Only rename foo(int) if it appears in a class.
    

    Note: the *:: syntax is non-standard C++, but the '*' is meant to be a wildcard that matches any class name (we couldn't think of a better alternative so if you have a better idea, send email to the swig-devel mailing list.

    Although this discussion has primarily focused on %rename all of the same rules also apply to %ignore. For example:

    %ignore foo(double);          // Ignore all foo(double)
    %ignore Spam::foo;            // Ignore foo in class Spam
    %ignore Spam::foo(double);    // Ignore foo(double) in class Spam
    %ignore *::foo(double);       // Ignore foo(double) in all classes
    

    When applied to a base class, %ignore forces all definitions in derived classes to disappear. For example, %ignore Spam::foo(double) will eliminate foo(double) in Spam and all classes derived from Spam.

    Notes on %rename and %ignore:

    • Since, the %rename declaration is used to declare a renaming in advance, it can be placed at the start of an interface file. This makes it possible to apply a consistent name resolution without having to modify header files. For example:

      %module foo
      
      /* Rename these overloaded functions */
      %rename(foo_i) foo(int); 
      %rename(foo_d) foo(double);
      
      %include "header.h"
      
    • The scope qualifier (::) can also be used on simple names. For example:

      %rename(bar) ::foo;       // Rename foo to bar in global scope only
      %rename(bar) Spam::foo;   // Rename foo to bar in class Spam only
      %rename(bar) *::foo;      // Rename foo in classes only
      
    • Name matching tries to find the most specific match that is defined. A qualified name such as Spam::foo always has higher precedence than an unqualified name foo. Spam::foo has higher precedence than *::foo and *::foo has higher precedence than foo. A parameterized name has higher precedence than an unparameterized name within the same scope level. However, an unparameterized name with a scope qualifier has higher precedence than a parameterized name in global scope (e.g., a renaming of Spam::foo takes precedence over a renaming of foo(int)).

    • The order in which %rename directives are defined does not matter as long as they appear before the declarations to be renamed. Thus, there is no difference between saying:

      %rename(bar) foo;
      %rename(foo_i) Spam::foo(int);
      %rename(Foo) Spam::foo;
      

      and this

      %rename(Foo) Spam::foo;
      %rename(bar) foo;
      %rename(foo_i) Spam::foo(int);
      

      (the declarations are not stored in a linked list and order has no importance). Of course, a repeated %rename directive will change the setting for a previous %rename directive if exactly the same name, scope, and parameters are supplied.

    • For multiple inheritance where renaming rules are defined for multiple base classes, the first renaming rule found on a depth-first traversal of the class hierarchy is used.
    • The name matching rules strictly follow member qualifier rules. For example, if you have a class and member with a member that is const qualified like this:

      class Spam {
      public:
        ...
        void bar() const;
        ...
      };
      

      the declaration

      %rename(name) Spam::bar();
      

      will not apply as there is no unqualified member bar(). The following will apply the rename as the qualifier matches correctly:

      %rename(name) Spam::bar() const;
      

      Similarly for combinations of cv-qualifiers and ref-qualifiers, all the qualifiers must be specified to match correctly:

      %rename(name) Jam::bar();          // will not match
      %rename(name) Jam::bar() &;        // will not match
      %rename(name) Jam::bar() const;    // will not match
      %rename(name) Jam::bar() const &;  // ok, will match
      
      class Jam {
      public:
        ...
        void bar() const &;
        ...
      };
      

      An often overlooked C++ feature is that classes can define two different overloaded members that differ only in their qualifiers, like this:

      class Spam {
      public:
        ...
        void bar();         // Unqualified member
        void bar() const;   // Qualified member
        ...
      };
      

      %rename can then be used to target each of the overloaded methods individually. For example we can give them separate names in the target language:

      %rename(name1) Spam::bar();
      %rename(name2) Spam::bar() const;
      

      Similarly, if you merely wanted to ignore one of the declarations, use %ignore with the full qualifier. For example, the following directive would tell SWIG to ignore the const version of bar() above:

      %ignore Spam::bar() const;   // Ignore bar() const, but leave other bar() alone
      
    • Currently no resolution is performed in order to match function parameters. This means function parameter types must match exactly. For example, namespace qualifiers and typedefs will not work. The following usage of typedefs demonstrates this:

      typedef int Integer;
      
      %rename(foo_i) foo(int);
      
      class Spam {
      public:
        void foo(Integer);  // Stays 'foo' (not renamed)
      };
      class Ham {
      public:
        void foo(int);      // Renamed to foo_i
      };
      
    • The name matching rules also use default arguments for finer control when wrapping methods that have default arguments. Recall that methods with default arguments are wrapped as if the equivalent overloaded methods had been parsed (Default arguments section). Let's consider the following example class:

      class Spam {
      public:
        ...
        void bar(int i=-1, double d=0.0);
        ...
      };
      

      The following %rename will match exactly and apply to all the target language overloaded methods because the declaration with the default arguments exactly matches the wrapped method:

      %rename(newbar) Spam::bar(int i=-1, double d=0.0);
      

      The C++ method can then be called from the target language with the new name no matter how many arguments are specified, for example: newbar(2, 2.0), newbar(2) or newbar(). However, if the %rename does not contain the default arguments:

      %rename(newbar) Spam::bar(int i, double d);
      

      then only one of the three equivalent overloaded methods will be renamed and wrapped as if SWIG parsed:

      void Spam::newbar(int i, double d);
      void Spam::bar(int i);
      void Spam::bar();
      

      The C++ method must then be called from the target language with the new name newbar(2, 2.0) when both arguments are supplied or with the original name as bar(2) (one argument) or bar() (no arguments).

      In fact it is possible to use %rename on the equivalent overloaded methods, to rename all the equivalent overloaded methods:

      %rename(bar_2args)   Spam::bar(int i, double d);
      %rename(bar_1arg)    Spam::bar(int i);
      %rename(bar_default) Spam::bar();
      

      Similarly, the extra overloaded methods can be selectively ignored using %ignore.

      Compatibility note: The %rename directive introduced the default argument matching rules in SWIG-1.3.23 at the same time as the changes to wrapping methods with default arguments was introduced.

    6.15.4 Comments on overloading

    Support for overloaded methods was first added in SWIG-1.3.14. The implementation is somewhat unusual when compared to similar tools. For instance, the order in which declarations appear is largely irrelevant in SWIG. Furthermore, SWIG does not rely upon trial execution or exception handling to figure out which method to invoke.

    Internally, the overloading mechanism is completely configurable by the target language module. Therefore, the degree of overloading support may vary from language to language. As a general rule, statically typed languages like Java are able to provide more support than dynamically typed languages like Perl, Python, Ruby, and Tcl.

    6.16 Overloaded operators

    C++ overloaded operator declarations can be wrapped. For example, consider a class like this:

    class Complex {
    private:
      double rpart, ipart;
    public:
      Complex(double r = 0, double i = 0) : rpart(r), ipart(i) { }
      Complex(const Complex &c) : rpart(c.rpart), ipart(c.ipart) { }
      Complex &operator=(const Complex &c) {
        rpart = c.rpart;
        ipart = c.ipart;
        return *this;
      }
      Complex operator+(const Complex &c) const {
        return Complex(rpart+c.rpart, ipart+c.ipart);
      }
      Complex operator-(const Complex &c) const {
        return Complex(rpart-c.rpart, ipart-c.ipart);
      }
      Complex operator*(const Complex &c) const {
        return Complex(rpart*c.rpart - ipart*c.ipart,
                       rpart*c.ipart + c.rpart*ipart);
      }
      Complex operator-() const {
        return Complex(-rpart, -ipart);
      }
      double re() const { return rpart; }
      double im() const { return ipart; }
    };
    

    When operator declarations appear, they are handled in exactly the same manner as regular methods. However, the names of these methods are set to strings like "operator +" or "operator -". The problem with these names is that they are illegal identifiers in most scripting languages. For instance, you can't just create a method called "operator +" in Python--there won't be any way to call it.

    Some language modules already know how to automatically handle certain operators (mapping them into operators in the target language). However, the underlying implementation of this is really managed in a very general way using the %rename directive. For example, in Python a declaration similar to this is used:

    %rename(__add__) Complex::operator+;
    

    This binds the + operator to a method called __add__ (which is conveniently the same name used to implement the Python + operator). Internally, the generated wrapper code for a wrapped operator will look something like this pseudocode:

    _wrap_Complex___add__(args) {
      ... get args ...
      obj->operator+(args);
      ...
    }
    

    When used in the target language, it may now be possible to use the overloaded operator normally. For example:

    >>> a = Complex(3, 4)
    >>> b = Complex(5, 2)
    >>> c = a + b           # Invokes __add__ method
    

    It is important to realize that there is nothing magical happening here. The %rename directive really only picks a valid method name. If you wrote this:

    %rename(add) operator+;
    

    The resulting scripting interface might work like this:

    a = Complex(3, 4)
    b = Complex(5, 2)
    c = a.add(b)      # Call a.operator+(b)
    

    All of the techniques described to deal with overloaded functions also apply to operators. For example:

    %ignore Complex::operator=;             // Ignore = in class Complex
    %ignore *::operator=;                   // Ignore = in all classes
    %ignore operator=;                      // Ignore = everywhere.
    
    %rename(__sub__) Complex::operator-; 
    %rename(__neg__) Complex::operator-();  // Unary - 
    

    The last part of this example illustrates how multiple definitions of the operator- method might be handled.

    Handling operators in this manner is mostly straightforward. However, there are a few subtle issues to keep in mind:

    • In C++, it is fairly common to define different versions of the operators to account for different types. For example, a class might also include a friend function like this:

      class Complex {
      public:
        friend Complex operator+(Complex &, double);
      };
      Complex operator+(Complex &, double);
      

      SWIG simply ignores all friend declarations. Furthermore, it doesn't know how to associate the associated operator+ with the class (because it's not a member of the class).

      It's still possible to make a wrapper for this operator, but you'll have to handle it like a normal function. For example:

      %rename(add_complex_double) operator+(Complex &, double);
      
    • Certain operators are ignored by default. For instance, new and delete operators are ignored as well as conversion and index operators. A warning such as the one below is shown:

      example.i:12: Warning 503: Can't wrap 'operator []' unless renamed to a valid identifier.
      
    • The index operator, operator[], is particularly difficult to overload due to differences in C++ implementations. Specifically, the get and set operators in other languages typically are separated into two methods such that additional logic can be packed into the operations; C# uses this[type key] { get { ... } set { ... }}, Python uses __getitem__ and __setitem__, etc. In C++ if the return type of operator[] is a reference and the method is const, it is often indicative of the setter, and the getter is usually a const function return an object by value. In the absence of any hard and fast rules and the fact that there may be multiple index operators, it is up to the user to choose the getter and setter to use by using %rename as shown earlier.

    • The semantics of certain C++ operators may not match those in the target language.

    6.17 Class extension

    New methods can be added to a class using the %extend directive. This directive is primarily used in conjunction with proxy classes to add additional functionality to an existing class. For example :

    %module vector
    %{
    #include "vector.h"
    %}
    
    class Vector {
    public:
      double x, y, z;
      Vector();
      ~Vector();
      ... bunch of C++ methods ...
      %extend {
        char *__str__() {
          static char temp[256];
          sprintf(temp, "[ %g, %g, %g ]", $self->x, $self->y, $self->z);
          return &temp[0];
        }
      }
    };
    

    This code adds a __str__ method to our class for producing a string representation of the object. In Python, such a method would allow us to print the value of an object using the print command.

    >>>
    >>> v = Vector();
    >>> v.x = 3
    >>> v.y = 4
    >>> v.z = 0
    >>> print(v)
    [ 3.0, 4.0, 0.0 ]
    >>>
    
    

    The C++ 'this' pointer is often needed to access member variables, methods etc. The $self special variable should be used wherever you could use 'this'. The example above demonstrates this for accessing member variables. Note that the members dereferenced by $self must be public members as the code is ultimately generated into a global function and so will not have any access to non-public members. The implicit 'this' pointer that is present in C++ methods is not present in %extend methods. In order to access anything in the extended class or its base class, an explicit 'this' is required. The following example shows how one could access base class members:

    struct Base {
      virtual void method(int v) {
        ...
      }
      int value;
    };
    struct Derived : Base {
    };
    %extend Derived {
      virtual void method(int v) {
        $self->Base::method(v); // akin to this->Base::method(v);
        $self->value = v;       // akin to this->value = v;
        ...
      }
    }
    

    The following special variables are expanded if used within a %extend block: $name, $symname, $overname, $decl, $fulldecl, $parentclassname and $parentclasssymname. The Special variables section provides more information each of these special variables.

    The %extend directive follows all of the same conventions as its use with C structures. Please refer to the Adding member functions to C structures section for further details.

    Compatibility note: The %extend directive is a new name for the %addmethods directive in SWIG1.1. Since %addmethods could be used to extend a structure with more than just methods, a more suitable directive name has been chosen.

    6.18 Templates

    Template type names may appear anywhere a type is expected in an interface file. For example:

    void foo(vector<int> *a, int n);
    void bar(list<int, 100> *x);
    

    There are some restrictions on the use of non-type arguments. Simple literals are supported, and so are some constant expressions. However, use of '<' and '>' within a constant expressions currently is not supported by SWIG ('<=' and '>=' are though). For example:

    void bar(list<int, 100> *x);                // OK
    void bar(list<int, 2*50> *x);               // OK
    void bar(list<int, (2>1 ? 100 : 50)> *x)    // Not supported
    

    The type system is smart enough to figure out clever games you might try to play with typedef. For instance, consider this code:

    typedef int Integer;
    void foo(vector<int> *x, vector<Integer> *y);
    

    In this case, vector<Integer> is exactly the same type as vector<int>. The wrapper for foo() will accept either variant.

    6.18.1 The %template directive

    There are a couple of important points about template wrapping. First, a bare C++ template does not define any sort of runnable object-code for which SWIG can normally create a wrapper. Therefore, in order to wrap a template, you need to give SWIG information about a particular template instantiation (e.g., vector<int>, array<double>, etc.). Second, an instantiation name such as vector<int> is generally not a valid identifier name in most target languages. Thus, you will need to give the template instantiation a more suitable name such as intvector.

    To illustrate, consider the following class template definition:

    template<class T> class List {
    private:
      T *data;
      int nitems;
      int maxitems;
    public:
      List(int max) {
        data = new T [max];
        nitems = 0;
        maxitems = max;
      }
      ~List() {
        delete [] data;
      };
      void append(T obj) {
        if (nitems < maxitems) {
          data[nitems++] = obj;
        }
      }
      int length() {
        return nitems;
      }
      T get(int n) {
        return data[n];
      }
    };
    

    By itself, this class template is useless--SWIG simply ignores it because it doesn't know how to generate any code unless a definition of T is provided. The %template directive is required to instantiate the template for use in a target language. The directive requires an identifier name for use in the target language plus the template for instantiation. The example below instantiates List<int> for use as a class named intList:

    %template(intList) List<int>;
    

    The instantiation expands the template code as a C++ compiler would do and then makes it available under the given identifier name. Essentially it is the same as wrapping the following concept code where the class template definition has T expanded to int (note that this is not entirely valid syntax):

    %rename(intList) List<int>;       // Rename to a suitable identifier
    class List<int> {
    private:
      int *data;
      int nitems;
      int maxitems;
    public:
      List(int max);
      ~List();
      void append(int obj);
      int length();
      int get(int n);
    };
    

    The argument to %template() is the name of the instantiation in the target language. The name you choose should not conflict with any other declarations in the interface file with one exception---it is okay for the template name to match that of a typedef declaration. For example:

    %template(intList) List<int>;
    ...
    typedef List<int> intList;    // OK
    

    The %template directive must always appear after the definition of the template to be expanded, so the following will work:

    template<class T> class List { ... };
    %template(intList) List<int>;
    

    but if %template is used before the template definition, such as:

    %template(intList) List<int>;
    template<class T> class List { ... };
    

    SWIG will generate an error:

    example.i:3: Error: Template 'List' undefined.
    

    Since the type system knows how to handle typedef, it is generally not necessary to instantiate different versions of a template for typenames that are equivalent. For instance, consider this code:

    %template(intList) List<int>;
    typedef int Integer;
    ...
    void foo(List<Integer> *x);
    

    In this case, List<Integer> is exactly the same type as List<int>. Any use of List<Integer> is mapped back to the instantiation of List<int> created earlier. Therefore, it is not necessary to instantiate a new class for the type Integer (doing so is redundant and will simply result in code bloat).

    The template provided to %template for instantiation must be the actual template and not a typedef to a template.

    typedef List<int> ListOfInt;
    
    %template(intList) List<int>; // ok
    %template(intList) ListOfInt; // illegal - Syntax error
    

    6.18.2 Function templates

    SWIG can also generate wrappers for function templates using a similar technique to that shown above for class templates. For example:

    // Function template
    template<class T> T max(T a, T b) { return a > b ? a : b; }
    
    // Make some different versions of this function
    %template(maxint) max<int>;
    %template(maxdouble) max<double>;
    

    In this case, maxint and maxdouble become unique names for specific instantiations of the function.

    SWIG even supports overloaded templated functions. As usual the %template directive is used to wrap templated functions. For example:

    template<class T> void foo(T x) { };
    template<class T> void foo(T x, T y) { };
    
    %template(foo) foo<int>;
    

    This will generate two overloaded wrapper methods, the first will take a single integer as an argument and the second will take two integer arguments.

    6.18.3 Default template arguments

    The number of arguments supplied to %template should match that in the original template definition. Template default arguments are supported. For example:

    template vector<typename T, int max=100> class vector {
    ...
    };
    
    %template(intvec) vector<int>;           // OK
    %template(vec1000) vector<int, 1000>;     // OK
    

    The %template directive should not be used to wrap the same template instantiation more than once in the same scope. This will generate an error. For example:

    %template(intList) List<int>;
    %template(Listint) List<int>;    // Error.   Template already wrapped.
    

    This error is caused because the template expansion results in two identical classes with the same name. This generates a symbol table conflict. Besides, it probably more efficient to only wrap a specific instantiation only once in order to reduce the potential for code bloat.

    6.18.4 Template base classes

    When a template is instantiated using %template, information about that class is saved by SWIG and used elsewhere in the program. For example, if you wrote code like this,

    ...
    %template(intList) List<int>;
    ...
    class UltraList : public List<int> {
      ...
    };
    

    then SWIG knows that List<int> was already wrapped as a class called intList and arranges to handle the inheritance correctly. If, on the other hand, nothing is known about List<int>, you will get a warning message similar to this:

    example.h:42: Warning 401. Nothing known about class 'List< int >'. Ignored. 
    example.h:42: Warning 401. Maybe you forgot to instantiate 'List< int >' using %template. 
    

    If a class template inherits from another class template, you need to make sure that base classes are instantiated before derived classes. For example:

    template<class T> class Foo {
    ...
    };
    
    template<class T> class Bar : public Foo<T> {
    ...
    };
    
    // Instantiate base classes first 
    %template(intFoo) Foo<int>;
    %template(doubleFoo) Foo<double>;
    
    // Now instantiate derived classes
    %template(intBar) Bar<int>;
    %template(doubleBar) Bar<double>;
    

    The order is important since SWIG uses the instantiation names to properly set up the inheritance hierarchy in the resulting wrapper code (and base classes need to be wrapped before derived classes). Don't worry--if you get the order wrong, SWIG should generate a warning message.

    Occasionally, you may need to tell SWIG about base classes that are defined by templates, but which aren't supposed to be wrapped. Since SWIG is not able to automatically instantiate templates for this purpose, you must do it manually. To do this, simply use the empty template instantiation, that is, %template with no name. For example:

    // Instantiate traits<double, double>, but don't wrap it.
    %template() traits<double, double>;
    

    If you have to instantiate a lot of different classes for many different types, you might consider writing a SWIG macro. For example:

    %define TEMPLATE_WRAP(prefix, T...) 
    %template(prefix ## Foo) Foo<T >;
    %template(prefix ## Bar) Bar<T >;
    ...
    %enddef
    
    TEMPLATE_WRAP(int, int)
    TEMPLATE_WRAP(double, double)
    TEMPLATE_WRAP(String, char *)
    TEMPLATE_WRAP(PairStringInt, std::pair<string, int>)
    ...
    

    Note the use of a vararg macro for the type T. If this wasn't used, the comma in the templated type in the last example would not be possible.

    6.18.5 Template specialization

    The SWIG template mechanism does support specialization. For instance, if you define a class like this,

    template<> class List<int> {
    private:
      int *data;
      int nitems;
      int maxitems;
    public:
      List(int max);
      ~List();
      void append(int obj);
      int length();
      int get(int n);
    };
    

    then SWIG will use this code whenever the user expands List<int>. In practice, this may have very little effect on the underlying wrapper code since specialization is often used to provide slightly modified method bodies (which are ignored by SWIG). However, special SWIG directives such as %typemap, %extend, and so forth can be attached to a specialization to provide customization for specific types.

    Partial template specialization is partially supported by SWIG. For example, this code defines a template that is applied when the template argument is a pointer.

    template<class T> class List<T*> {
    private:
      T *data;
      int nitems;
      int maxitems;
    public:
      List(int max);
      ~List();
      void append(T obj);
      int length();
      T get(int n);
    };
    

    SWIG supports both template explicit specialization and partial specialization. Consider:

    template<class T1, class T2> class Foo { };                     // (1) primary template
    template<>                   class Foo<double *, int *> { };    // (2) explicit specialization
    template<class T1, class T2> class Foo<T1, T2 *> { };           // (3) partial specialization
    

    SWIG is able to properly match explicit instantiations:

    Foo<double *, int *>     // explicit specialization matching (2)
    

    SWIG implements template argument deduction so that the following partial specialization examples work just like they would with a C++ compiler:

    Foo<int *, int *>        // partial specialization matching (3)
    Foo<int *, const int *>  // partial specialization matching (3)
    Foo<int *, int **>       // partial specialization matching (3)
    

    6.18.6 Member templates

    Member templates are supported. The underlying principle is the same as for normal templates--SWIG can't create a wrapper unless you provide more information about types. For example, a class with a member function template might look like this:

    class Foo {
    public:
      template<class T> void bar(T x, T y) { ... };
      ...
    };
    

    To expand the template, simply use %template inside the class.

    class Foo {
    public:
      template<class T> void bar(T x, T y) { ... };
      ...
      %template(barint)    bar<int>;
      %template(bardouble) bar<double>;
    };
    

    Or, if you want to leave the original class definition alone, just do this:

    class Foo {
    public:
      template<class T> void bar(T x, T y) { ... };
      ...
    };
    ...
    %extend Foo {
      %template(barint)    bar<int>;
      %template(bardouble) bar<double>;
    };
    

    or simply

    class Foo {
    public:
      template<class T> void bar(T x, T y) { ... };
      ...
    };
    ...
    
    %template(bari) Foo::bar<int>;
    %template(bard) Foo::bar<double>;
    

    In this case, the %extend directive is not needed, and %template does exactly the same job, i.e., it adds two new methods to the Foo class.

    Now, if your target language supports overloading, you can even try

    %template(bar) Foo::bar<int>;
    %template(bar) Foo::bar<double>;
    

    and since the two new wrapped methods have the same name 'bar', they will be overloaded, and when called, the correct method will be dispatched depending on the argument type.

    When used with members, the %template directive may be placed in another class template. Here is a slightly perverse example:

    // A template
    template<class T> class Foo {
    public:
      // A member template
      template<class S> T bar(S x, S y) { ... };
      ...
    };
    
    // Expand a few member templates
    %extend Foo {
      %template(bari) bar<int>;
      %template(bard) bar<double>;
    }
    
    // Create some wrappers for the template
    %template(Fooi) Foo<int>;
    %template(Food) Foo<double>;
    

    Miraculously, you will find that each expansion of Foo has member functions bari() and bard() added.

    A common use of member templates is to define constructors for copies and conversions. For example:

    template<class T1, class T2> struct pair {
      T1 first;
      T2 second;
      pair() : first(T1()), second(T2()) { }
      pair(const T1 &x, const T2 &y) : first(x), second(y) { }
      template<class U1, class U2> pair(const pair<U1, U2> &x)
                                           : first(x.first), second(x.second) { }
    };
    

    This declaration is perfectly acceptable to SWIG, but the constructor template will be ignored unless you explicitly expand it. To do that, you could expand a few versions of the constructor in the class template itself. For example:

    %extend pair {
      %template(pair) pair<T1, T2>;        // Generate default copy constructor
    };
    

    When using %extend in this manner, notice how you can still use the template parameters in the original template definition.

    Alternatively, you could expand the constructor template in selected instantiations. For example:

    // Instantiate a few versions
    %template(pairii) pair<int, int>;
    %template(pairdd) pair<double, double>;
    
    // Create a default constructor only 
    %extend pair<int, int> {
      %template(paird) pair<int, int>;         // Default constructor
    };
    
    // Create default and conversion constructors 
    %extend pair<double, double> {
      %template(paird) pair<double, dobule>;   // Default constructor
      %template(pairc) pair<int, int>;         // Conversion constructor
    };
    

    And if your target language supports overloading, then you can try instead:

    // Create default and conversion constructors 
    %extend pair<double, double> {
      %template(pair) pair<double, dobule>;   // Default constructor
      %template(pair) pair<int, int>;         // Conversion constructor
    };
    

    In this case, the default and conversion constructors have the same name. Hence, SWIG will overload them and define an unique visible constructor, that will dispatch the proper call depending on the argument type.

    6.18.7 Scoping and templates

    The %template directive for a class template is the equivalent to an explicit instantiation of a C++ class template. The scope for a valid %template instantiation is the same as the scope required for a valid explicit instantiation of a C++ template. A definition of the template for the explicit instantiation must be in scope where the instantiation is declared and must not be enclosed within a different namespace.

    For example, a few %template instantiations and C++ explicit instantiations are shown below:

    namespace N {
      template<typename T> class C {};
    }
    
    // valid
    %template(cin) N::C<int>;
    template class N::C<int>;
    
    // valid
    namespace N {
      %template(cin) C<int>;
      template class C<int>;
    }
    
    // valid
    using namespace N;
    %template(cin) C<int>;
    template class C<int>;
    
    // valid
    using N::C;
    %template(cin) C<int>;
    template class C<int>;
    
    // ill-formed
    namespace unrelated {
      using N::C;
      %template(cin) C<int>;
      template class C<int>;
    }
    
    // ill-formed
    namespace unrelated {
      using namespace N;
      %template(cin) C<int>;
      template class C<int>;
    }
    
    // ill-formed
    namespace unrelated {
      namespace N {
        %template(cin) C<int>;
        template class C<int>;
      }
    }
    
    // ill-formed
    namespace unrelated {
      %template(cin) N::C<int>;
      template class N::C<int>;
    }
    

    When the scope is incorrect, such as for the ill-formed examples above, an error occurs:

    cpp_template_scope.i:34: Error: 'C' resolves to 'N::C' and was incorrectly instantiated
    in scope 'unrelated' instead of within scope 'N'.
    

    A note for the C++ standard geeks out there; a valid instantiation is one which conforms to the C++03 standard as C++11 made a change to disallow using declarations and using directives to find a template.

    // valid C++03, ill-formed C++11
    using N::C;
    template class C<int>;
    

    Compatibility Note: Versions prior to SWIG-4.0.0 did not error out with incorrectly scoped %template declarations, but this led to numerous subtle template scope problems.

    6.18.8 More on templates

    If all of this isn't quite enough and you really want to make someone's head explode, SWIG directives such as %rename, %extend, and %typemap can be included directly in template definitions. For example:

    // File : list.h
    template<class T> class List {
      ...
    public:
      %rename(__getitem__) get(int);
      List(int max);
      ~List();
      ...
      T get(int index);
      %extend {
        char *__str__() {
          /* Make a string representation */
          ...
        }
      }
    };
    

    In this example, the extra SWIG directives are propagated to every template instantiation.

    It is also possible to separate these declarations from the class template. For example:

    %rename(__getitem__) List::get;
    %extend List {
      char *__str__() {
        /* Make a string representation */
        ...
      }
      /* Make a copy */
      T *__copy__() {
        return new List<T>(*$self);
      }
    };
    
    ...
    template<class T> class List {
      ...
      public:
      List() { }
      T get(int index);
      ...
    };
    

    When %extend is decoupled from the class definition, it is legal to use the same template parameters as provided in the class definition. These are replaced when the template is expanded. In addition, the %extend directive can be used to add additional methods to a specific instantiation. For example:

    %template(intList) List<int>;
    
    %extend List<int> {
      void blah() {
        printf("Hey, I'm an List<int>!\n");
      }
    };
    

    It is even possible to extend a class via %extend with template methods, for example:

    %include <std_string.i>
    
    %inline %{
    class ExtendMe {
    public:
      template <typename T>
      T do_stuff_impl(int a, T b, double d) {
        return b;
      }
    };
    %}
    
    %extend ExtendMe {
      template<typename T>
      T do_overloaded_stuff(T b) {
        return $self->do_stuff_impl(0, b, 4.0);
      }
    }
    %template(do_overloaded_stuff) ExtendMe::do_overloaded_stuff<std::string>;
    %template(do_overloaded_stuff) ExtendMe::do_overloaded_stuff<double>;
    

    The wrapped ExtendMe class will then have two (overloaded) methods called do_overloaded_stuff.

    Compatibility Note: Extending a class with template methods was added in version 3.0.12

    Needless to say, SWIG's template support provides plenty of opportunities to break the universe. That said, an important final point is that SWIG does not perform extensive error checking of templates! Specifically, SWIG does not perform type checking nor does it check to see if the actual contents of the template declaration make any sense. Since the C++ compiler checks this when it compiles the resulting wrapper file, there is no practical reason for SWIG to duplicate this functionality.

    As SWIG's template support does not perform type checking %template can be used as early as after a template declaration. You can, and rarely have to, use %template before the template parameters have been declared. For example:

    template <class T> class OuterTemplateClass {};
    
    // The nested class OuterClass::InnerClass inherits from the class template
    // OuterTemplateClass<OuterClass::InnerStruct> and thus the template needs
    // to be expanded with %template before the OuterClass declaration.
    %template(OuterTemplateClass_OuterClass__InnerStruct)
      OuterTemplateClass<OuterClass::InnerStruct>
    
    
    // Don't forget to use %feature("flatnested") for OuterClass::InnerStruct and
    // OuterClass::InnerClass if the target language doesn't support nested classes.
    class OuterClass {
      public:
        // Forward declarations:
        struct InnerStruct;
        class InnerClass;
    };
    
    struct OuterClass::InnerStruct {};
    
    // Expanding the template at this point with %template is too late as the
    // OuterClass::InnerClass declaration is processed inside OuterClass.
    
    class OuterClass::InnerClass : public OuterTemplateClass<InnerStruct> {};
    

    Compatibility Note: The first implementation of template support relied heavily on macro expansion in the preprocessor. Templates have been more tightly integrated into the parser and type system in SWIG-1.3.12 and the preprocessor is no longer used. Code that relied on preprocessing features in template expansion will no longer work. However, SWIG still allows the # operator to be used to generate a string from a template argument.

    Compatibility Note: In earlier versions of SWIG, the %template directive introduced a new class name. This name could then be used with other directives. For example:

    %template(vectori) vector<int>;
    %extend vectori {
      void somemethod() { }
    };
    

    This behavior is no longer supported. Instead, you should use the original template name as the class name. For example:

    %template(vectori) vector<int>;
    %extend vector<int> {
      void somemethod() { }
    };
    

    Similar changes apply to typemaps and other customization features.

    6.19 Namespaces

    Support for C++ namespaces is comprehensive, but by default simple, however, some target languages can turn on more advanced namespace support via the nspace feature, described later. Code within unnamed namespaces is ignored as there is no external access to symbols declared within the unnamed namespace. Before detailing the default implementation for named namespaces, it is worth noting that the semantics of C++ namespaces is extremely non-trivial--especially with regard to the C++ type system and class machinery. At a most basic level, namespaces are sometimes used to encapsulate common functionality. For example:

    namespace math {
      double sin(double);
      double cos(double);
    
      class Complex {
        double im, re;
      public:
        ...
      };
      ...
    };
    

    Members of the namespace are accessed in C++ by prepending the namespace prefix to names. For example:

    double x = math::sin(1.0);
    double magnitude(math::Complex *c);
    math::Complex c;
    ...
    

    At this level, namespaces are relatively easy to manage. However, things start to get very ugly when you throw in the other ways a namespace can be used. For example, selective symbols can be exported from a namespace with using.

    using math::Complex;
    double magnitude(Complex *c);       // Namespace prefix stripped
    

    Similarly, the contents of an entire namespace can be made available like this:

    using namespace math;
    double x = sin(1.0);
    double magnitude(Complex *c);
    

    Alternatively, a namespace can be aliased:

    namespace M = math;
    double x = M::sin(1.0);
    double magnitude(M::Complex *c);
    

    Using combinations of these features, it is possible to write head-exploding code like this:

    namespace A {
      class Foo {
      };
    }
    
    namespace B {
      namespace C {
        using namespace A;
      }
      typedef C::Foo FooClass;
    }
    
    namespace BIGB = B;
    
    namespace D {
      using BIGB::FooClass;
      class Bar : public FooClass {
      }
    };
    
    class Spam : public D::Bar {
    };
    
    void evil(A::Foo *a, B::FooClass *b, B::C::Foo *c, BIGB::FooClass *d,
              BIGB::C::Foo *e, D::FooClass *f);
    
    

    Given the possibility for such perversion, it's hard to imagine how every C++ programmer might want such code wrapped into the target language. Clearly this code defines three different classes. However, one of those classes is accessible under at least six different names!

    SWIG fully supports C++ namespaces in its internal type system and class handling code. If you feed SWIG the above code, it will be parsed correctly, it will generate compilable wrapper code, and it will produce a working scripting language module. However, the default wrapping behavior is to flatten namespaces in the target language. This means that the contents of all namespaces are merged together in the resulting scripting language module. For example, if you have code like this,

    %module foo
    namespace foo {
      void bar(int);
      void spam();
    }
    
    namespace bar {
      void blah();
    }
    
    

    then SWIG simply creates three wrapper functions bar(), spam(), and blah() in the target language. SWIG does not prepend the names with a namespace prefix nor are the functions packaged in any kind of nested scope. Note that the default handling of flattening all the namespace scopes in the target language can be changed via the nspace feature.

    There is some rationale for taking this approach. Since C++ namespaces are often used to define modules in C++, there is a natural correlation between the likely contents of a SWIG module and the contents of a namespace. For instance, it would not be unreasonable to assume that a programmer might make a separate extension module for each C++ namespace. In this case, it would be redundant to prepend everything with an additional namespace prefix when the module itself already serves as a namespace in the target language. Or put another way, if you want SWIG to keep namespaces separate, simply wrap each namespace with its own SWIG interface.

    Because namespaces are flattened, it is possible for symbols defined in different namespaces to generate a name conflict in the target language. For example:

    namespace A {
      void foo(int);
    }
    namespace B {
      void foo(double);
    }
    

    When this conflict occurs, you will get an error message that resembles this:

    example.i:26. Error. 'foo' is multiply defined in the generated target language module.
    example.i:23. Previous declaration of 'foo'
    

    To resolve this error, simply use %rename to disambiguate the declarations. For example:

    %rename(B_foo) B::foo;
    ...
    namespace A {
      void foo(int);
    }
    namespace B {
      void foo(double);     // Gets renamed to B_foo
    }
    

    Similarly, %ignore can be used to ignore declarations.

    using declarations do not have any effect on the generated wrapper code. They are ignored by SWIG language modules and they do not result in any code. However, these declarations are used by the internal type system to track type-names. Therefore, if you have code like this:

    namespace A {
      typedef int Integer;
    }
    using namespace A;
    void foo(Integer x);
    

    SWIG knows that Integer is the same as A::Integer which is the same as int.

    Namespaces may be combined with templates. If necessary, the %template directive can be used to expand a template defined in a different namespace. For example:

    namespace foo {
      template<typename T> T max(T a, T b) { return a > b ? a : b; }
    }
    
    using foo::max;
    
    %template(maxint)   max<int>;           // Okay.
    %template(maxfloat) foo::max<float>;    // Okay (qualified name).
    
    namespace bar {
      using namespace foo;
      %template(maxdouble)  max<double>;    // Okay.
    }
    

    The combination of namespaces and other SWIG directives may introduce subtle scope-related problems. The key thing to keep in mind is that all SWIG generated wrappers are produced in the global namespace. Symbols from other namespaces are always accessed using fully qualified names---names are never imported into the global space unless the interface happens to do so with a using declaration. In almost all cases, SWIG adjusts typenames and symbols to be fully qualified. However, this is not done in code fragments such as function bodies, typemaps, exception handlers, and so forth. For example, consider the following:

    namespace foo {
      typedef int Integer;
      class bar {
        public:
        ...
      };
    }
    
    %extend foo::bar {
      Integer add(Integer x, Integer y) {
        Integer r = x + y;        // Error. Integer not defined in this scope
        return r;
      }
    };
    

    In this case, SWIG correctly resolves the added method parameters and return type to foo::Integer. However, since function bodies aren't parsed and such code is emitted in the global namespace, this code produces a compiler error about Integer. To fix the problem, make sure you use fully qualified names. For example:

    %extend foo::bar {
      Integer add(Integer x, Integer y) {
        foo::Integer r = x + y;        // Ok.
        return r;
      }
    };
    

    Note: SWIG does not propagate using declarations to the resulting wrapper code. If these declarations appear in an interface, they should also appear in any header files that might have been included in a %{ ... %} section. In other words, don't insert extra using declarations into a SWIG interface unless they also appear in the underlying C++ code.

    Note: Code inclusion directives such as %{ ... %} or %inline %{ ... %} should not be placed inside a namespace declaration. The code emitted by these directives will not be enclosed in a namespace and you may get very strange results. If you need to use namespaces with these directives, consider the following:

    // Good version
    %inline %{
    namespace foo {
      void bar(int) { ... }
      ...
    }
    %}
    
    // Bad version.  Emitted code not placed in namespace.
    namespace foo {
    %inline %{
      void bar(int) { ... }   /* I'm bad */
      ...
      %}
    }
    

    Note: When the %extend directive is used inside a namespace, the namespace name is included in the generated functions. For example, if you have code like this,

    namespace foo {
      class bar {
        public:
          %extend {
            int blah(int x);
          };
      };
    }
    

    the added method blah() is mapped to a function int foo_bar_blah(foo::bar *self, int x). This function resides in the global namespace.

    Note: Although namespaces are flattened in the target language, the SWIG generated wrapper code observes the same namespace conventions as used in the input file. Thus, if there are no symbol conflicts in the input, there will be no conflicts in the generated code.

    Note: In the same way that no resolution is performed on parameters, a conversion operator name must match exactly to how it is defined. Do not change the qualification of the operator. For example, suppose you had an interface like this:

    namespace foo {
      class bar;
      class spam {
        public:
        ...
        operator bar();      // Conversion of spam -> bar
        ...
      };
    }
    

    The following is how the feature is expected to be written for a successful match:

    %rename(tofoo) foo::spam::operator bar();
    

    The following does not work as no namespace resolution is performed in the matching of conversion operator names:

    %rename(tofoo) foo::spam::operator foo::bar();
    

    Note, however, that if the operator is defined using a qualifier in its name, then the feature must use it too...

    %rename(tofoo) foo::spam::operator bar();      // will not match
    %rename(tofoo) foo::spam::operator foo::bar(); // will match
    namespace foo {
      class bar;
      class spam {
        public:
        ...
        operator foo::bar();
        ...
      };
    }
    

    Compatibility Note: Versions of SWIG prior to 1.3.32 were inconsistent in this approach. A fully qualified name was usually required, but would not work in some situations.

    Note: The flattening of namespaces is only intended to serve as a basic namespace implementation. More advanced handling of namespaces is discussed next.

    6.19.1 The nspace feature for namespaces

    Some target languages provide support for the nspace feature. The feature can be applied to any class, struct, union or enum declared within a named namespace. The feature wraps the type within the target language specific concept of a namespace, for example, a Java package or C# namespace. Please see the language specific sections to see if the target language you are interested in supports the nspace feature.

    The feature is demonstrated below for C# using the following example:

    %feature("nspace") MyWorld::Material::Color;
    %nspace MyWorld::Wrapping::Color; // %nspace is a macro for %feature("nspace")
    
    namespace MyWorld {
      namespace Material {
        class Color {
        ...
        };
      }
      namespace Wrapping {
        class Color {
        ...
        };
      }
    }
    

    Without the nspace feature directives above or %rename, you would get the following warning resulting in just one of the Color classes being available for use from the target language:

    example.i:9: Error: 'Color' is multiply defined in the generated target language module.
    example.i:5: Error: Previous declaration of 'Color'
    

    With the nspace feature the two Color classes are wrapped into the equivalent C# namespaces. A fully qualified constructor call of each these two types in C# is then:

    MyWorld.Material.Color materialColor = new MyWorld.Material.Color();
    MyWorld.Wrapping.Color wrappingColor = new MyWorld.Wrapping.Color();
    

    Note that the nspace feature does not apply to variables and functions simply declared in a namespace. For example, the following symbols cannot co-exist in the target language without renaming. This may change in a future version.

    namespace MyWorld {
      namespace Material {
        int quantity;
        void dispatch();
      }
      namespace Wrapping {
        int quantity;
        void dispatch();
      }
    }
    

    Compatibility Note: The nspace feature was first introduced in SWIG-2.0.0.

    6.20 Renaming templated types in namespaces

    As has been mentioned, when %rename includes parameters, the parameter types must match exactly (no typedef or namespace resolution is performed). SWIG treats templated types slightly differently and has an additional matching rule so unlike non-templated types, an exact match is not always required. If the fully qualified templated type is specified, it will have a higher precedence over the generic template type. In the example below, the generic template type is used to rename to bbb and the fully qualified type is used to rename to ccc.

    %rename(bbb) Space::ABC::aaa(T t);                     // will match but with lower precedence than ccc
    %rename(ccc) Space::ABC<Space::XYZ>::aaa(Space::XYZ t);// will match but with higher precedence
                                                           // than bbb
    
    namespace Space {
      class XYZ {};
      template<typename T> struct ABC {
        void aaa(T t) {}
      };
    }
    %template(ABCXYZ) Space::ABC<Space::XYZ>;
    

    It should now be apparent that there are many ways to achieve a renaming with %rename. This is demonstrated by the following two examples, which are effectively the same as the above example. Below shows how %rename can be placed inside a namespace.

    namespace Space {
      %rename(bbb) ABC::aaa(T t);                     // will match but with lower precedence than ccc
      %rename(ccc) ABC<Space::XYZ>::aaa(Space::XYZ t);// will match but with higher precedence than bbb
      %rename(ddd) ABC<Space::XYZ>::aaa(XYZ t);       // will not match
    }
    
    namespace Space {
      class XYZ {};
      template<typename T> struct ABC {
        void aaa(T t) {}
      };
    }
    %template(ABCXYZ) Space::ABC<Space::XYZ>;
    

    Note that ddd does not match as there is no namespace resolution for parameter types and the fully qualified type must be specified for template type expansion. The following example shows how %rename can be placed within %extend.

    namespace Space {
      %extend ABC {
        %rename(bbb) aaa(T t);         // will match but with lower precedence than ccc
      }
      %extend ABC<Space::XYZ> {
        %rename(ccc) aaa(Space::XYZ t);// will match but with higher precedence than bbb
        %rename(ddd) aaa(XYZ t);       // will not match
      }
    }
    
    namespace Space {
      class XYZ {};
      template<typename T> struct ABC {
        void aaa(T t) {}
      };
    }
    %template(ABCXYZ) Space::ABC<Space::XYZ>;
    

    6.21 Exception specifications

    When C++ programs utilize exceptions, exceptional behavior is sometimes specified as part of a function or method declaration. For example:

    class Error { };
    
    class Foo {
    public:
      ...
      void blah() throw(Error);
      ...
    };
    

    If an exception specification is used, SWIG automatically generates wrapper code for catching the indicated exception and, when possible, rethrowing it into the target language, or converting it into an error in the target language otherwise. For example, in Python, you can write code like this:

    f = Foo()
    try:
        f.blah()
    except Error, e:
        # e is a wrapped instance of "Error"
    

    Details of how to tailor code for handling the caught C++ exception and converting it into the target language's exception/error handling mechanism is outlined in the "throws" typemap section.

    Since exception specifications are sometimes only used sparingly, this alone may not be enough to properly handle C++ exceptions. To do that, a different set of special SWIG directives are used. Consult the "Exception handling with %exception" section for details. The next section details a way of simulating an exception specification or replacing an existing one.

    6.22 Exception handling with %catches

    Exceptions are automatically handled for methods with an exception specification. Similar handling can be achieved for methods without exception specifications through the %catches feature. It is also possible to replace any declared exception specification using the %catches feature. In fact, %catches uses the same "throws" typemaps that SWIG uses for exception specifications in handling exceptions. The %catches feature must contain a list of possible types that can be thrown. For each type that is in the list, SWIG will generate a catch handler, in the same way that it would for types declared in the exception specification. Note that the list can also include the catch all specification "...". For example,

    struct EBase { virtual ~EBase(); };
    struct Error1 : EBase { };
    struct Error2 : EBase { };
    struct Error3 : EBase { };
    struct Error4 : EBase { };
    
    %catches(Error1, Error2, ...) Foo::bar();
    %catches(EBase) Foo::blah();
    
    class Foo {
    public:
      ...
      void bar();
      void blah() throw(Error1, Error2, Error3, Error4);
      ...
    };
    

    For the Foo::bar() method, which can throw anything, SWIG will generate catch handlers for Error1, Error2 as well as a catch all handler (...). Each catch handler will convert the caught exception and convert it into a target language error/exception. The catch all handler will convert the caught exception into an unknown error/exception.

    Without the %catches feature being attached to Foo::blah(), SWIG will generate catch handlers for all of the types in the exception specification, that is, Error1, Error2, Error3, Error4. However, with the %catches feature above, just a single catch handler for the base class, EBase will be generated to convert the C++ exception into a target language error/exception.

    6.23 Pointers to Members

    Starting with SWIG-1.3.7, there is limited parsing support for pointers to C++ class members. For example:

    double do_op(Object *o, double (Object::*callback)(double, double));
    extern double (Object::*fooptr)(double, double);
    %constant double (Object::*FOO)(double, double) = &Object::foo;
    

    Although these kinds of pointers can be parsed and represented by the SWIG type system, few language modules know how to handle them due to implementation differences from standard C pointers. Readers are strongly advised to consult an advanced text such as the "The Annotated C++ Manual" for specific details.

    When pointers to members are supported, the pointer value might appear as a special string like this:

    >>> print example.FOO
    _ff0d54a800000000_m_Object__f_double_double__double
    >>>
    

    In this case, the hexadecimal digits represent the entire value of the pointer which is usually the contents of a small C++ structure on most machines.

    SWIG's type-checking mechanism is also more limited when working with member pointers. Normally SWIG tries to keep track of inheritance when checking types. However, no such support is currently provided for member pointers.

    6.24 Smart pointers and operator->()

    In some C++ programs, objects are often encapsulated by smart-pointers or proxy classes. This is sometimes done to implement automatic memory management (reference counting) or persistence. Typically a smart-pointer is defined by a class template where the -> operator has been overloaded. This class is then wrapped around some other class. For example:

    // Smart-pointer class
    template<class T> class SmartPtr {
      T *pointee;
    public:
      SmartPtr(T *p) : pointee(p) { ... }
      T *operator->() {
        return pointee;
      }
      ...
    };
    
    // Ordinary class
    class Foo_Impl {
    public:
      int x;
      virtual void bar();
      ...
    };
    
    // Smart-pointer wrapper
    typedef SmartPtr<Foo_Impl> Foo;
    
    // Create smart pointer Foo
    Foo make_Foo() {
      return SmartPtr<Foo_Impl>(new Foo_Impl());
    }
    
    // Do something with smart pointer Foo
    void do_something(Foo f) {
      printf("x = %d\n", f->x);
      f->bar();
    }
    
    // Call the wrapped smart pointer proxy class in the target language 'Foo'
    %template(Foo) SmartPtr<Foo_Impl>;
    

    A key feature of this approach is that by defining operator-> the methods and attributes of the object wrapped by a smart pointer are transparently accessible. For example, expressions such as these (from the previous example),

    f->x
    f->bar()
    

    are transparently mapped to the following

    (f.operator->())->x;
    (f.operator->())->bar();
    

    When generating wrappers, SWIG tries to emulate this functionality to the extent that it is possible. To do this, whenever operator->() is encountered in a class, SWIG looks at its returned type and uses it to generate wrappers for accessing attributes of the underlying object. For example, wrapping the above code produces wrappers like this:

    int Foo_x_get(Foo *f) {
      return (*f)->x;
    }
    void Foo_x_set(Foo *f, int value) {
      (*f)->x = value;
    }
    void Foo_bar(Foo *f) {
      (*f)->bar();
    }
    

    These wrappers take a smart-pointer instance as an argument, but dereference it in a way to gain access to the object returned by operator->(). You should carefully compare these wrappers to those in the first part of this chapter (they are slightly different).

    The end result is that access looks very similar to C++. For example, you could do this in Python:

    >>> f = make_Foo()
    >>> print f.x
    0
    >>> f.bar()
    >>>
    

    When generating wrappers through a smart-pointer, SWIG tries to generate wrappers for all methods and attributes that might be accessible through operator->(). This includes any methods that might be accessible through inheritance. However, there are a number of restrictions:

    • Member variables and methods are wrapped through a smart pointer. Enumerations, constructors, and destructors are not wrapped.
    • If the smart-pointer class and the underlying object both define a method or variable of the same name, then the smart-pointer version has precedence. For example, if you have this code

      class Foo {
      public:
        int x;
      };
      
      class Bar {
      public:
        int x;       
        Foo *operator->();
      };
      

      then the wrapper for Bar::x accesses the x defined in Bar, and not the x defined in Foo.

    If your intent is to only expose the smart-pointer class in the interface, it is not necessary to wrap both the smart-pointer class and the class for the underlying object. However, you must still tell SWIG about both classes if you want the technique described in this section to work. To only generate wrappers for the smart-pointer class, you can use the %ignore directive. For example:

    %ignore Foo;
    class Foo {       // Ignored
    };
    
    class Bar {
    public:
      Foo *operator->();
      ...
    };
    

    Alternatively, you can import the definition of Foo from a separate file using %import.

    Note: When a class defines operator->(), the operator itself is wrapped as a method __deref__(). For example:

    f = Foo()               # Smart-pointer
    p = f.__deref__()       # Raw pointer from operator->
    

    Note: To disable the smart-pointer behavior, use %ignore to ignore operator->(). For example:

    %ignore Bar::operator->;
    

    Note: Smart pointer support was first added in SWIG-1.3.14.

    6.25 C++ reference counted objects - ref/unref feature

    Another similar idiom in C++ is the use of reference counted objects. Consider for example:

    class RCObj  {
      // implement the ref counting mechanism
      int add_ref();
      int del_ref();
      int ref_count();
    
    public:
      virtual ~RCObj() = 0;
    
      int ref() const {
        return add_ref();
      }
    
      int unref() const {
        if (ref_count() == 0 || del_ref() == 0 ) {
          delete this;
          return 0;
        }
        return ref_count();
      }
    };
    
    
    class A : RCObj {
    public:
      A();
      int foo();
    };
    
    
    class B {
      A *_a;
    
    public:
      B(A *a) : _a(a) { 
        a->ref(); 
      }
    
      ~B() { 
        a->unref(); 
      }
    };
    
    int main() {
      A *a  = new A();       // (count: 0)
      a->ref();           // 'a' ref here (count: 1)
    
      B *b1 = new B(a);   // 'a' ref here (count: 2)
      if (1 + 1 == 2) {
        B *b2 = new B(a); // 'a' ref here (count: 3)
        delete b2;        // 'a' unref, but not deleted (count: 2)
      }
    
      delete b1;          // 'a' unref, but not deleted (count: 1)
      a->unref();         // 'a' unref and deleted (count: 0)
    }
    

    In the example above, the 'A' class instance 'a' is a reference counted object, which can't be deleted arbitrarily since it is shared between the objects 'b1' and 'b2'. 'A' is derived from a Reference Counted Object 'RCObj', which implements the ref/unref idiom.

    To tell SWIG that 'RCObj' and all its derived classes are reference counted objects, use the "ref" and "unref" features. These are also available as %refobject and %unrefobject, respectively. For example:

    %module example
    ...
    
    %feature("ref")   RCObj "$this->ref();"
    %feature("unref") RCObj "$this->unref();"
    
    %include "rcobj.h"
    %include "A.h"
    ...
    

    where the code passed to the "ref" and "unref" features will be executed as needed whenever a new object is passed to Python, or when Python tries to release the proxy object instance, respectively.

    On the Python side, the use of a reference counted object is no different to any other regular instance:

    def create_A():
        a = A()         # SWIG ref 'a' - new object is passed to Python (count: 1)
        b1 = B(a)       # C++ ref 'a (count: 2)
        if 1 + 1 == 2:
            b2 = B(a)   # C++ ref 'a' (count: 3)
        return a        # 'b1' and 'b2' are released and deleted, C++ unref 'a' twice (count: 1)
    
    a = create_A()      # (count: 1)
    exit                # 'a' is released, SWIG unref 'a' called in the destructor wrapper (count: 0)
    

    Note that the user doesn't explicitly need to call 'a->ref()' nor 'a->unref()' (and neither 'delete a'). Instead, SWIG takes cares of executing the "ref" and "unref" calls as needed. If the user doesn't specify the "ref/unref" feature for a type, SWIG will produce code equivalent to defining these features:

    %feature("ref")   ""
    %feature("unref") "delete $this;"
    

    In other words, SWIG will not do anything special when a new object is passed to Python, and it will always 'delete' the underlying object when Python releases the proxy instance.

    The %newobject feature is designed to indicate to the target language that it should take ownership of the returned object. When used in conjunction with a type that has the "ref" feature associated with it, it additionally emits the code in the "ref" feature into the C++ wrapper. Consider wrapping the following factory function in addition to the above:

    %newobject AFactory;
    A *AFactory() {
      return new A();
    }
    

    The AFactory function now acts much like a call to the A constructor with respect to memory handling:

    a = AFactory()    # SWIG ref 'a' due to %newobject (count: 1)
    exit              # 'a' is released, SWIG unref 'a' called in the destructor wrapper (count: 0)
    

    6.26 Using declarations and inheritance

    using declarations are sometimes used to adjust access to members of base classes. For example:

    class Foo {
    public:
      int  blah(int x);
    };
    
    class Bar {
    public:
      double blah(double x);
    };
    
    class FooBar : public Foo, public Bar {
    public:
      using Foo::blah;
      using Bar::blah;
      char *blah(const char *x);
    };
    

    In this example, the using declarations make different versions of the overloaded blah() method accessible from the derived class. For example:

    FooBar *f;
    f->blah(3);         // Ok. Invokes Foo::blah(int)
    f->blah(3.5);       // Ok. Invokes Bar::blah(double)
    f->blah("hello");   // Ok. Invokes FooBar::blah(const char *);
    

    SWIG emulates the same functionality when creating wrappers. For example, if you wrap this code in Python, the module works just like you would expect:

    >>> import example
    >>> f = example.FooBar()
    >>> f.blah(3)
    >>> f.blah(3.5)
    >>> f.blah("hello")
    

    using declarations can also be used to change access when applicable. For example:

    class Foo {
    protected:
      int x;
      int blah(int x);
    };
    
    class Bar : public Foo {
    public:
      using Foo::x;       // Make x public
      using Foo::blah;    // Make blah public
    };
    

    This also works in SWIG---the exposed declarations will be wrapped normally.

    When using declarations are used as shown in these examples, declarations from the base classes are copied into the derived class and wrapped normally. When copied, the declarations retain any properties that might have been attached using %rename, %ignore, or %feature. Thus, if a method is ignored in a base class, it will also be ignored by a using declaration.

    Because a using declaration does not provide fine-grained control over the declarations that get imported, it may be difficult to manage such declarations in applications that make heavy use of SWIG customization features. If you can't get using to work correctly, you can always change the interface to the following:

    
    class FooBar : public Foo, public Bar {
    public:
    #ifndef SWIG
      using Foo::blah;
      using Bar::blah;
    #else
      int blah(int x);         // explicitly tell SWIG about other declarations
      double blah(double x);
    #endif
    
      char *blah(const char *x);
    };
    

    Notes:

    • If a derived class redefines a method defined in a base class, then a using declaration won't cause a conflict. For example:

      class Foo {
      public:
        int blah(int );
        double blah(double);
      };
      
      class Bar : public Foo {
      public:
        using Foo::blah;    // Only imports blah(double);
        int blah(int);
      };
      
    • Resolving ambiguity in overloading may prevent declarations from being imported by using. For example:

      %rename(blah_long) Foo::blah(long);
      class Foo {
      public:
        int blah(int);
        long blah(long);  // Renamed to blah_long
      };
      
      class Bar : public Foo {
      public:
        using Foo::blah;     // Only imports blah(int)
        double blah(double x);
      };
      

    6.27 Nested classes

    If the target language supports the nested classes concept (like Java), the nested C++ classes are wrapped as nested target language proxy classes. (In case of Java - "static" nested classes.) Only public nested classes are wrapped. Otherwise there is little difference between nested and normal classes.

    If the target language doesn't support nested classes directly, or the support is not implemented in the language module (like for Python currently), then the visible nested classes are moved to the same name space as the containing class (nesting hierarchy is "flattened"). The same behaviour may be turned on for C# and Java by the %feature ("flatnested"); If there is a class with the same name in the outer namespace the inner class (or the global one) may be renamed or ignored:

    %rename (Bar_Foo) Bar::Foo;
    class Foo {};
    class Bar {
      public:
      class Foo {};
    };
    

    If a nested class, within an outer class, has to be used as a template parameter within the outer class, then the template will have to be instantiated with %template before the beginning of the outer class. An example can be found in the Templates section.

    Compatibility Note: Prior to SWIG-3.0.0, there was limited nested class support. Nested classes were treated as opaque pointers. However, there was a workaround for nested class support in these older versions requiring the user to replicate the nested class in the global scope, adding in a typedef for the nested class in the global scope and using the "nestedworkaround" feature on the nested class. This resulted in approximately the same behaviour as the "flatnested" feature. With proper nested class support now available in SWIG-3.0.0, this feature has been deprecated and no longer works requiring code changes. If you see the following warning:

    example.i:8: Warning 126: The nestedworkaround feature is deprecated
    

    consider using the "flatnested" feature discussed above which generates a non-nested proxy class, like the "nestedworkaround" feature did. Alternatively, use the default nested class code generation, which may generate an equivalent to a nested proxy class in the target language, depending on the target language support.

    SWIG-1.3.40 and earlier versions did not have the nestedworkaround feature and the generated code resulting from parsing nested classes did not always compile. Nested class warnings could also not be suppressed using %warnfilter.

    6.28 A brief rant about const-correctness

    A common issue when working with C++ programs is dealing with all possible ways in which the const qualifier (or lack thereof) will break your program, all programs linked against your program, and all programs linked against those programs.

    Although SWIG knows how to correctly deal with const in its internal type system and it knows how to generate wrappers that are free of const-related warnings, SWIG does not make any attempt to preserve const-correctness in the target language. Thus, it is possible to pass const qualified objects to non-const methods and functions. For example, consider the following code in C++:

    const Object * foo();
    void bar(Object *);
    
    ...
    // C++ code
    void blah() {
      bar(foo());         // Error: bar discards const
    };
    

    Now, consider the behavior when wrapped into a Python module:

    >>> bar(foo())         # Okay
    >>> 
    

    Although this is clearly a violation of the C++ type-system, fixing the problem doesn't seem to be worth the added implementation complexity that would be required to support it in the SWIG run-time type system. There are no plans to change this in future releases (although we'll never rule anything out entirely).

    The bottom line is that this particular issue does not appear to be a problem for most SWIG projects. Of course, you might want to consider using another tool if maintaining constness is the most important part of your project.

    6.29 Callbacks to the target language

    C/C++ function pointers are often used for callbacks and this is discussed in the Pointers to functions and callbacks section. The callback techniques described therein provide a way to control callbacks to a C/C++ function but not callbacks into the target language. The techniques described below show how the director feature can be used to support callbacks from C/C++ to the target language.

    6.29.1 Introduction to director classes

    The director feature enables the ability for a target language class to derive from a wrapped C++ class. The target language can override virtual methods of a wrapped C++ class, thereby supporting cross-language polymorphism. Code can 'call up' from C++ into the target language by simply calling a virtual method overridden in a derived class in the target language. The wrapped C++ classes that have this ability are termed 'director' classes. The director feature is documented individually in each target language and the reader should locate and read this to obtain a full understanding of directors.

    6.29.2 Using directors and target language callbacks

    SWIG's primary goal is to make it possible to call C/C++ code from a target language, however, the director feature enables the reverse. While there isn't simple direct support for calling target language code from C, the director feature makes this possible. It does require some work and additional wrapper code to be provided by the user. The additional code required must be C++ and not C code and hence may introduce a small dependency on C++ if using a pure C project. In a nutshell, the user must create a C++ base class and turn it into a director class. A virtual method in the director base class is required. SWIG generates the code to call up into the target language when wrapping the director virtual method.

    Let's look at some details next. Consider the same function pointer for a callback called binary_op from the Pointers to functions and callbacks section. For completeness, the code required for the module and director feature is also shown:

    %module(directors="1") example
    
    %{
    int binary_op(int a, int b, int (*op)(int, int)) {
      return op(a, b);
    }
    %}
    

    The goal is to have a target language function that gets called by binary_op. The target language function should have the equivalent signature as the C/C++ function pointer int (*op)(int, int). As we are using directors, we need a C++ virtual method with this signature, so let's define the C++ class and pure virtual method first and make it a director class via the director feature:

    %feature("director") BinaryOp;
    
    %inline %{
    struct BinaryOp {
      virtual int handle(int a, int b) = 0;
      virtual ~BinaryOp() {}
    };
    %}
    

    The following handler_helper function and binary_op_wrapper function completes the code needed in the C++/SWIG layer. The binary_op_wrapper function is wrapped by SWIG and is very similar to the binary_op function, however, it takes a pointer to the director base class BinaryOp instead of a C/C++ function pointer.

    %{
    static BinaryOp *handler_ptr = NULL;
    static int handler_helper(int a, int b) {
      // Make the call up to the target language when handler_ptr
      // is an instance of a target language director class
      return handler_ptr->handle(a, b);
    }
    // If desired, handler_ptr above could be changed to a thread-local variable in order to make thread-safe
    %}
    
    %inline %{
    int binary_op_wrapper(int a, int b, BinaryOp *handler) {
      handler_ptr = handler;
      int result = binary_op(a, b, &handler_helper);
      handler = NULL;
      return result;
    }
    %}
    

    On the target language side, we need to derive a class from BinaryOp and override the handle method. In Python this could be as simple as:

    import example
    
    # PythonBinaryOp class is defined and derived from C++ class BinaryOp
    class PythonBinaryOp(example.BinaryOp):
    
        # Define Python class 'constructor'
        def __init__(self):
            # Call C++ base class constructor
            example.BinaryOp.__init__(self)
    
        # Override C++ method: virtual int handle(int a, int b) = 0;
        def handle(self, a, b):
            # Return the product
            return a * b
    

    For this to work from Python, an instance of the PythonBinaryOp class is created and then passed to binary_op_wrapper. The net result is the binary_op function will in turn be called which will call handler_helper which will call the virtual handle method, that is, the Python method handle in the PythonBinaryOp class. The result will be the product of 10 and 20 and make its way back to Python and hence 200 will be printed with the following code:

    handler = PythonBinaryOp()
    result = example.binary_op_wrapper(10, 20, handler)
    print result
    

    This has thus demonstrated a C/C++ function pointer calling back into a target language function. The code could be made a little more user friendly by using %rename to provide the original binary_op name from the target language instead of binary_op_wrapper. A C++ functor base class and Python functor class could also be used instead, but these are left as exercises for the reader.

    6.30 Where to go for more information

    If you're wrapping serious C++ code, you might want to pick up a copy of "The Annotated C++ Reference Manual" by Ellis and Stroustrup. This is the reference document we use to guide a lot of SWIG's C++ support.

    swig-4.0.1/Doc/Manual/chapters0000644000175000017500000000076413527063513016035 0ustar williamwilliamPreface.html Introduction.html Windows.html Scripting.html SWIG.html SWIGPlus.html CPlusPlus11.html CPlusPlus14.html CPlusPlus17.html Preprocessor.html Library.html Arguments.html Typemaps.html Customization.html Contract.html Varargs.html Doxygen.html Warnings.html Modules.html CCache.html Android.html CSharp.html D.html Go.html Guile.html Java.html Javascript.html Lua.html Octave.html Perl5.html Php.html Python.html R.html Ruby.html Scilab.html Tcl.html Mzscheme.html Ocaml.html Extending.html swig-4.0.1/Doc/Manual/Sections.html0000644000175000017500000000610213527063513016746 0ustar williamwilliam SWIG-4.0 Documentation

    SWIG-4.0 Documentation

    Last update : SWIG-4.0.1 (21 Aug 2019)

    Sections

    SWIG Core Documentation

    Supported Language Modules Documentation

    Experimental Language Modules Documentation

    Developer Documentation

    swig-4.0.1/Doc/Manual/CPlusPlus17.html0000644000175000017500000000452413527234052017225 0ustar williamwilliam SWIG and C++17

    9 SWIG and C++17

    9.1 Introduction

    This chapter gives you a brief overview about the SWIG implementation of the C++17 standard. There isn't much in C++17 that affects SWIG, however, work has only just begun on adding C++17 support.

    Compatibility note: SWIG-4.0.0 is the first version to support any C++17 features.

    9.2 Core language changes

    9.2.1 Nested namespace definitions

    C++17 offers a more concise syntax for defining namespaces. SWIG has support for nested namespace definitions such as:

    namespace A::B::C {
      ...
    }
    

    This is the equivalent to the C++98 namespace definitions:

    namespace A {
      namespace B {
        namespace C {
          ...
        }
      }
    }
    

    9.2.2 UTF-8 character literals

    C++17 added UTF-8 (u8) character literals. These are of type char. Example:

    char a = u8'a';
    

    9.2.3 Hexadecimal floating literals

    C++17 added hexadecimal floating literals. For example:

    double f = 0xF.68p2;
    

    9.3 Standard library changes

    swig-4.0.1/Doc/Manual/CSharp.html0000644000175000017500000027334613527234052016355 0ustar williamwilliam SWIG and C#

    22 SWIG and C#

    22.1 Introduction

    The purpose of the C# module is to offer an automated way of accessing existing C/C++ code from .NET languages. The wrapper code implementation uses C# and the Platform Invoke (PInvoke) interface to access natively compiled C/C++ code. The PInvoke interface has been chosen over Microsoft's Managed C++ interface as it is portable to both Microsoft Windows and non-Microsoft platforms. PInvoke is part of the ECMA/ISO C# specification. It is also better suited for robust production environments due to the Managed C++ flaw called the Mixed DLL Loading Problem. SWIG C# works equally well on non-Microsoft operating systems such as Linux, Solaris and Apple Mac using Mono and Portable.NET.

    To get the most out of this chapter an understanding of interop is required. The Microsoft Developer Network (MSDN) has a good reference guide in a section titled "Interop Marshaling". Monodoc, available from the Mono project, has a very useful section titled Interop with native libraries.

    22.1.1 SWIG 2 Compatibility

    In order to minimize name collisions between names generated based on input to SWIG and names used in the generated code from the .NET framework, SWIG 3 fully qualifies the use of all .NET types. Furthermore, SWIG 3 avoids using directives in generated code. This breaks backwards compatibility with typemaps, pragmas, etc written for use with SWIG 2 that assume the presence of using System; or using System.Runtime.InteropServices; directives in the intermediate class imports, module imports, or proxy imports. SWIG 3 supports backwards compatibility though the use of the SWIG2_CSHARP macro. If SWIG2_CSHARP is defined, SWIG 3 generates using directives in the intermediate class, module class, and proxy class code similar to those generated by SWIG 2. This can be done without modifying any of the input code by passing the -DSWIG2_CSHARP commandline parameter when executing swig.

    22.1.2 Additional command line options

    The following table lists the additional commandline options available for the C# module. They can also be seen by using:

    swig -csharp -help 
    
    C# specific options
    -dllimport <dl> Override DllImport attribute name to <dl>
    -namespace <nm> Generate wrappers into C# namespace <nm>
    -noproxy Generate the low-level functional interface instead of proxy classes
    -oldvarnames Old intermediary method names for variable wrappers
    -outfile <file> Write all C# into a single <file> located in the output directory

    The -outfile option combines all the generated C# code into a single output file instead of creating multiple C# files. The default, when this option is not provided, is to generate separate .cs files for the module class, intermediary class and each of the generated proxy and type wrapper classes. Note that the file extension (.cs) will not be automatically added and needs to be provided. Due to possible compiler limits it is not advisable to use -outfile for large projects.

    22.2 Differences to the Java module

    The C# module is very similar to the Java module, so until some more complete documentation has been written, please use the Java documentation as a guide to using SWIG with C#. The C# module has the same major SWIG features as the Java module. The rest of this section should be read in conjunction with the Java documentation as it lists the main differences. The most notable differences to Java are the following:

    • When invoking SWIG use the -csharp command line option instead of -java.
    • The -nopgcpp command line option does not exist.
    • The -package command line option does not exist.
    • The -namespace <name> commandline option will generate all code into the namespace specified by <name>. C# supports nested namespaces that are not lexically nested, so nested namespaces will of course also work. For example: -namespace com.bloggs.widget, will generate code into C# namespaces:
      namespace com.bloggs.widget {
        ...
      }
      
      Note that by default, the generated C# classes have no namespace and the module name is unrelated to namespaces. The module name is just like in Java and is merely used to name some of the generated classes.
    • The nspace feature is also supported as described in this general section with a C# example. Unlike Java which requires the use of the -package option when using the nspace feature, the -namespace option is not mandatory for C#.
    • The -dllimport <name> commandline option specifies the name of the DLL for the DllImport attribute for every PInvoke method. If this commandline option is not given, the DllImport DLL name is the same as the module name. This option is useful for when one wants to invoke SWIG multiple times on different modules, yet compile all the resulting code into a single DLL.
    • C/C++ variables are wrapped with C# properties and not JavaBean style getters and setters.
    • Global constants are generated into the module class. There is no constants interface.
    • There is no implementation for type unsafe enums - not deemed necessary.
    • The default enum wrapping approach is proper C# enums, not typesafe enums.
      Note that %csconst(0) will be ignored when wrapping C/C++ enums with proper C# enums. This is because C# enum items must be initialised from a compile time constant. If an enum item has an initialiser and the initialiser doesn't compile as C# code, then the %csconstvalue directive must be used as %csconst(0) will have no effect. If it was used, it would generate an illegal runtime initialisation via a PInvoke call.
    • C# doesn't support the notion of throws clauses. Therefore there is no 'throws' typemap attribute support for adding exception classes to a throws clause. Likewise there is no need for an equivalent to %javaexception. In fact, throwing C# exceptions works quite differently, see C# Exceptions below.
    • The majority of the typemaps are in csharp.swg, not java.swg.
    • Typemap equivalent names:

      jni                         -> ctype
      jtype                       -> imtype
      jstype                      -> cstype
      javain                      -> csin
      javaout                     -> csout
      javadirectorin              -> csdirectorin
      javadirectorout             -> csdirectorout
      javainterfaces              -> csinterfaces and csinterfaces_derived
      javabase                    -> csbase
      javaclassmodifiers          -> csclassmodifiers
      javacode                    -> cscode
      javaimports                 -> csimports
      javabody                    -> csbody
      javafinalize                -> csfinalize
      javadestruct                -> csdisposing and csdispose
      javadestruct_derived        -> csdisposing_derived and csdispose_derived
      javainterfacecode           -> csinterfacecode
      
    • Typemap macros:

      SWIG_JAVABODY_PROXY         -> SWIG_CSBODY_PROXY
      SWIG_JAVABODY_TYPEWRAPPER   -> SWIG_CSBODY_TYPEWRAPPER
      
    • Additional typemaps:

      csvarin                     C# code property set typemap
      csvarout                    C# code property get typemap
      csattributes                C# attributes for attaching to proxy classes/enums
      
    • Additional typemap attributes:

      The "null" attribute in the "out" typemap can be specified to provide a value for $null to expand into for wrapped functions that return non-void. Normally the default value of 0 is used. For example this is needed if you change the return type to void:

      %typemap(ctype) Status "void"
      %typemap(out, null="") Status { ... }
      
    • Feature equivalent names:

      %javaconst                  -> %csconst
      %javaconstvalue             -> %csconstvalue
      %javamethodmodifiers        -> %csmethodmodifiers
      
    • Pragma equivalent names:

      %pragma(java)               -> %pragma(csharp)
      jniclassbase                -> imclassbase
      jniclassclassmodifiers      -> imclassclassmodifiers
      jniclasscode                -> imclasscode
      jniclassimports             -> imclassimports
      jniclassinterfaces          -> imclassinterfaces
      
    • Special variable equivalent names:

      $javaclassname              -> $csclassname
      $&javaclassname             -> $&csclassname
      $*javaclassname             -> $*csclassname
      $javaclazzname              -> $csclazzname
      $javainput                  -> $csinput
      $jnicall                    -> $imcall
      $javainterfacename          -> $csinterfacename
      $&javainterfacename         -> $&csinterfacename
      $*javainterfacename         -> $*csinterfacename
      
    • Unlike the "javain" typemap, the "csin" typemap does not support the 'pgcpp' attribute as the C# module does not have a premature garbage collection prevention parameter. The "csin" typemap supports additional optional attributes called 'cshin' and 'terminator'. The "csdirectorin" typemap supports additional optional attributes called 'terminator'. The 'cshin' attribute should contain the parameter type and name whenever a constructor helper function is generated due to the 'pre' or 'post' attributes. The 'terminator' attribute normally just contains a closing brace for when the 'pre' attribute contains an opening brace, such as when a C# using or fixed block is started. Note that 'pre', 'post', 'terminator' and 'cshin' attributes are not used for marshalling the property set. Please see the Date marshalling example and Date marshalling of properties example for further understanding of these "csin" applicable attributes. Please see the Date marshalling director example for further understanding of the "csdirectorin" attributes.

    • Support for asymmetric type marshalling. The 'ctype', 'imtype' and 'cstype' typemaps support an optional out attribute which is used for output types. If this typemap attribute is specified, then the type specified in the attribute is used for output types and the type specified in the typemap itself is used for the input type. If this typemap attribute is not specified, then the type used for both input and output is the type specified in the typemap. An example shows that char * could be marshalled in different ways,

      %typemap(imtype, out="global::System.IntPtr") char * "string"
      char * function(char *);
      

      The output type is thus IntPtr and the input type is string. The resulting intermediary C# code is:

      public static extern global::System.IntPtr function(string jarg1);
      
    • Support for type attributes. The 'imtype' and 'cstype' typemaps can have an optional inattributes and outattributes typemap attribute. The 'imtype' typemap can also have an optional directorinattributes and directoroutattributes typemap attribute which attaches to director delegates, an implementation detail of directors, see directors implementation. Note that there are C# attributes and typemap attributes, don't get confused between the two!! The C# attributes specified in these typemap attributes are generated wherever the type is used in the C# wrappers. These can be used to specify any C# attribute associated with a C/C++ type, but are more typically used for the C# MarshalAs attribute. For example:

      %typemap(imtype,
               inattributes="[global::System.Runtime.InteropServices.MarshalAs(UnmanagedType.LPStr)]",
               outattributes="[return: global::System.Runtime.InteropServices.MarshalAs(UnmanagedType.LPStr)]") const char * "String"
      
      const char * GetMsg() {}
      void SetMsg(const char *msg) {}
      

      The intermediary class will then have the marshalling as specified by everything in the 'imtype' typemap:

      class examplePINVOKE {
        ...
        [global::System.Runtime.InteropServices.DllImport("example", EntryPoint="CSharp_GetMsg")]
        [return: global::System.Runtime.InteropServices.MarshalAs(UnmanagedType.LPStr)]
        public static extern String GetMsg();
      
        [global::System.Runtime.InteropServices.DllImport("example", EntryPoint="CSharp_SetMsg")]
        public static extern void SetMsg([global::System.Runtime.InteropServices.MarshalAs(UnmanagedType.LPStr)]String jarg1);
      }
      

      Note that the DllImport attribute is always generated, irrespective of any additional attributes specified.

      These attributes are associated with the C/C++ parameter type or return type, which is subtly different to the attribute features and typemaps covered next. Note that all these different C# attributes can be combined so that a method has more than one attribute.

      The directorinattributes and directoroutattributes typemap attribute are attached to the delegates in the director class, for example, the SwigDelegateBase_0

    • Support for attaching C# attributes to wrapped methods, variables and enum values. This is done using the %csattributes feature, see %feature directives. Note that C# attributes are attached to proxy classes and enums using the csattributes typemap. For example, imagine we have a custom attribute class, ThreadSafeAttribute, for labelling thread safety. The following SWIG code shows how to attach this C# attribute to some methods and the class declaration itself:

      %typemap(csattributes) AClass          "[ThreadSafe]"
      %csattributes AClass::AClass(double d) "[ThreadSafe(false)]"
      %csattributes AClass::AMethod()        "[ThreadSafe(true)]"
      
      %inline %{
      class AClass {
      public:
        AClass(double a) {}
        void AMethod() {}
      };
      %}
      

      will generate a C# proxy class:

      [ThreadSafe]
      public class AClass : global::System.IDisposable {
        ...
        [ThreadSafe(false)]
        public AClass(double a) ...
      
        [ThreadSafe(true)]
        public void AMethod() ...
      }
      

      If C# attributes need adding to the set or get part of C# properties, when wrapping C/C++ variables, they can be added using the 'csvarin' and 'csvarout' typemaps respectively. Note that the type used for the property is specified in the 'cstype' typemap. If the 'out' attribute exists in this typemap, then the type used is from the 'out' attribute.

      An example for attaching attributes to the enum and enum values is shown below.

      %typemap(csattributes) Couleur "[global::System.ComponentModel.Description(\"Colours\")]"
      %csattributes Rouge "[global::System.ComponentModel.Description(\"Red\")]"
      %csattributes Vert "[global::System.ComponentModel.Description(\"Green\")]"
      %inline %{
        enum Couleur { Rouge, Orange, Vert };
      %}
      

      which will result in the following C# enum:

      [global::System.ComponentModel.Description("Colours")]
      public enum Couleur {
        [global::System.ComponentModel.Description("Red")]
        Rouge,
        Orange,
        [global::System.ComponentModel.Description("Green")]
        Vert
      }
      
    • The intermediary classname has PINVOKE appended after the module name instead of JNI, for example modulenamePINVOKE.

    • The %csmethodmodifiers feature can also be applied to variables as well as methods. In addition to the default public modifier that SWIG generates when %csmethodmodifiers is not specified, the feature will also replace the virtual/new/override modifiers that SWIG thinks is appropriate. This feature is useful for some obscure cases where SWIG might get the virtual/new/override modifiers incorrect, for example with multiple inheritance.

    • The name of the intermediary class can be changed from its default, that is, the module name with PINVOKE appended after it. The module directive attribute imclassname is used to achieve this:

      %module (imclassname="name") modulename
      

      If name is the same as modulename then the module class name gets changed from modulename to modulenameModule.

    • There is no additional 'premature garbage collection prevention parameter' as the marshalling of the HandleRef object takes care of ensuring a reference to the proxy class is held until the unmanaged call completed.

    $dllimport
    This is a C# only special variable that can be used in typemaps, pragmas, features etc. The special variable will get translated into the value specified by the -dllimport commandline option if specified, otherwise it is equivalent to the $module special variable.

    $imclassname
    This special variable expands to the intermediary class name. For C# this is usually the same as '$modulePINVOKE' ('$moduleJNI' for Java), unless the imclassname attribute is specified in the %module directive.

    The directory Examples/csharp has a number of simple examples. Visual Studio .NET 2003 solution and project files are available for compiling with the Microsoft .NET C# compiler on Windows. This also works with newer versions of Visual Studio if you allow it to convert the solution to the latest version. If your SWIG installation went well on a Unix environment and your C# compiler was detected, you should be able to type make in each example directory. After SWIG has run and both the C# and C/C++ compilers have finished building, the examples will be run, by either running runme.exe or by running mono runme.exe (Mono C# compiler). Windows users can also get the examples working using a Cygwin or MinGW environment for automatic configuration of the example makefiles. Any one of the C# compilers (Mono or Microsoft) can be detected from within a Cygwin or Mingw environment if installed in your path.

    22.3 Void pointers

    By default SWIG treats void * as any other pointer and hence marshalls it as a type wrapper class called SWIGTYPE_p_void. If you want to marshall with the .NET System.IntPtr type instead, there is a simple set of named typemaps called void *VOID_INT_PTR that can be used. They can be applied like any other named typemaps:

    %apply void *VOID_INT_PTR { void * }
    void * f(void *v);
    

    22.4 C# Arrays

    There are various ways to pass arrays from C# to C/C++. The default wrapping treats arrays as pointers and as such simple type wrapper classes are generated, eg SWIGTYPE_p_int when wrapping the C type int [] or int *. This gives a rather restricted use of the underlying unmanaged code and the most practical way to use arrays is to enhance or customise with one of the following three approaches; namely the SWIG C arrays library, P/Invoke default array marshalling or pinned arrays.

    22.4.1 The SWIG C arrays library

    The C arrays library keeps all the array memory in the unmanaged layer. The library is available to all language modules and is documented in the carrays.i library section. Please refer to this section for details, but for convenience, the C# usage for the two examples outlined there is shown below.

    For the %array_functions example, the equivalent usage would be:

    SWIGTYPE_p_double a = example.new_doubleArray(10);  // Create an array
    for (int i=0; i<10; i++)
      example.doubleArray_setitem(a, i, 2*i);           // Set a value
    example.print_array(a);                             // Pass to C
    example.delete_doubleArray(a);                      // Destroy array
    

    and for the %array_class example, the equivalent usage would be:

    doubleArray c = new doubleArray(10);    // Create double[10]
    for (int i=0; i<10; i++)
      c.setitem(i, 2*i);                    // Assign values
    example.print_array(c.cast());          // Pass to C
    

    22.4.2 Managed arrays using P/Invoke default array marshalling

    In the P/Invoke default marshalling scheme, one needs to designate whether the invoked function will treat a managed array parameter as input, output, or both. When the function is invoked, the CLR allocates a separate chunk of memory as big as the given managed array, which is automatically released at the end of the function call. If the array parameter is marked as being input, the content of the managed array is copied into this buffer when the call is made. Correspondingly, if the array parameter is marked as being output, the contents of the reserved buffer are copied back into the managed array after the call returns. A pointer to this buffer is passed to the native function.

    The reason for allocating a separate buffer is to leave the CLR free to relocate the managed array object during garbage collection. If the overhead caused by the copying is causing a significant performance penalty, consider pinning the managed array and passing a direct reference as described in the next section.

    For more information on the subject, see the Default Marshaling for Arrays article on MSDN.

    The P/Invoke default marshalling is supported by the arrays_csharp.i library via the INPUT, OUTPUT and INOUT typemaps. Let's look at some example usage. Consider the following C function:

    void myArrayCopy(int *sourceArray, int *targetArray, int nitems);
    

    We can now instruct SWIG to use the default marshalling typemaps by

    %include "arrays_csharp.i"
    
    %apply int INPUT[]  {int *sourceArray}
    %apply int OUTPUT[] {int *targetArray}
    

    As a result, we get the following method in the module class:

    public static void myArrayCopy(int[] sourceArray, int[] targetArray, int nitems) {
      examplePINVOKE.myArrayCopy(sourceArray, targetArray, nitems);
    }
    

    If we look beneath the surface at the corresponding intermediary class code, we see that SWIG has generated code that uses attributes (from the System.Runtime.InteropServices namespace) to tell the CLR to use default marshalling for the arrays:

    [global::System.Runtime.InteropServices.DllImport("example", EntryPoint="CSharp_myArrayCopy")]
    public static extern void myArrayCopy([global::System.Runtime.InteropServices.In, global::System.Runtime.InteropServices.MarshalAs(UnmanagedType.LPArray)]int[] jarg1, 
                                          [global::System.Runtime.InteropServices.Out, global::System.Runtime.InteropServices.MarshalAs(UnmanagedType.LPArray)]int[] jarg2,
                                           int jarg3);
    

    As an example of passing an inout array (i.e. the target function will both read from and write to the array), consider this C function that swaps a given number of elements in the given arrays:

    void myArraySwap(int *array1, int *array2, int nitems);
    

    Now, we can instruct SWIG to wrap this by

    %include "arrays_csharp.i"
    
    %apply int INOUT[] {int *array1}
    %apply int INOUT[] {int *array2}
    

    This results in the module class method

      public static void myArraySwap(int[] array1, int[] array2, int nitems) {
        examplePINVOKE.myArraySwap(array1, array2, nitems);
      }
    

    and intermediary class method

      [global::System.Runtime.InteropServices.DllImport("example", EntryPoint="CSharp_myArraySwap")]
      public static extern void myArraySwap([global::System.Runtime.InteropServices.In, global::System.Runtime.InteropServices.Out, global::System.Runtime.InteropServices.MarshalAs(UnmanagedType.LPArray)]int[] jarg1, 
                                            [global::System.Runtime.InteropServices.In, global::System.Runtime.InteropServices.Out, global::System.Runtime.InteropServices.MarshalAs(UnmanagedType.LPArray)]int[] jarg2,
                                             int jarg3);
    

    22.4.3 Managed arrays using pinning

    It is also possible to pin a given array in memory (i.e. fix its location in memory), obtain a direct pointer to it, and then pass this pointer to the wrapped C/C++ function. This approach involves no copying, but it makes the work of the garbage collector harder as the managed array object can not be relocated before the fix on the array is released. You should avoid fixing arrays in memory in cases where the control may re-enter the managed side via a callback and/or another thread may produce enough garbage to trigger garbage collection.

    For more information, see the fixed statement in the C# language reference.

    Now let's look at an example using pinning, thus avoiding the CLR making copies of the arrays passed as parameters. The arrays_csharp.i library file again provides the required support via the FIXED typemaps. Let's use the same function from the previous section:

    void myArrayCopy(int *sourceArray, int *targetArray, int nitems);
    

    We now need to declare the module class method unsafe, as we are using pointers:

    %csmethodmodifiers myArrayCopy "public unsafe";
     

    Apply the appropriate typemaps to the array parameters:

    %include "arrays_csharp.i"
    
    %apply int FIXED[] {int *sourceArray}
    %apply int FIXED[] {int *targetArray}
    

    Notice that there is no need for separate in, out or inout typemaps as is the case when using P/Invoke default marshalling.

    As a result, we get the following method in the module class:

      public unsafe static void myArrayCopy(int[] sourceArray, int[] targetArray, int nitems) {
        fixed ( int *swig_ptrTo_sourceArray = sourceArray ) {
        fixed ( int *swig_ptrTo_targetArray = targetArray ) {
        {
          examplePINVOKE.myArrayCopy((global::System.IntPtr)swig_ptrTo_sourceArray, (global::System.IntPtr)swig_ptrTo_targetArray,
                                     nitems);
        }
        }
        }
      }
    

    On the method signature level the only difference to the version using P/Invoke default marshalling is the "unsafe" quantifier, which is required because we are handling pointers.

    Also the intermediary class method looks a little different from the default marshalling example - the method is expecting an IntPtr as the parameter type.

    [global::System.Runtime.InteropServices.DllImport("example", EntryPoint="CSharp_myArrayCopy")]
    public static extern void myArrayCopy(global::System.IntPtr jarg1, global::System.IntPtr jarg2, int jarg3);
    

    22.5 C# Exceptions

    It is possible to throw a C# Exception from C/C++ code. SWIG already provides the framework for throwing C# exceptions if it is able to detect that a C++ exception could be thrown. Automatically detecting that a C++ exception could be thrown is only possible when a C++ exception specification is used, see Exception specifications. The Exception handling with %exception section details the %exception feature. Customised code for handling exceptions with or without a C++ exception specification is possible and the details follow. However anyone wishing to do this should be familiar with the contents of the sections referred to above.

    Unfortunately a C# exception cannot simply be thrown from unmanaged code for a variety of reasons. Most notably being that throwing a C# exception results in exceptions being thrown across the C PInvoke interface and C does not understand exceptions. The design revolves around a C# exception being constructed and stored as a pending exception, to be thrown only when the unmanaged code has completed. Implementing this is a tad involved and there are thus some unusual typemap constructs. Some practical examples follow and they should be read in conjunction with the rest of this section.

    First some details about the design that must be followed. Each typemap or feature that generates unmanaged code supports an attribute called canthrow. This is simply a flag which when set indicates that the code in the typemap/feature has code which might want to throw a C# exception. The code in the typemap/feature can then raise a C# exception by calling one of the C functions, SWIG_CSharpSetPendingException() or SWIG_CSharpSetPendingExceptionArgument(). When called, the function makes a callback into the managed world via a delegate. The callback creates and stores an exception ready for throwing when the unmanaged code has finished. The typemap/feature unmanaged code is then expected to force an immediate return from the unmanaged wrapper function, so that the pending managed exception can then be thrown. The support code has been carefully designed to be efficient as well as thread-safe. However to achieve the goal of efficiency requires some optional code generation in the managed code typemaps. Code to check for pending exceptions is generated if and only if the unmanaged code has code to set a pending exception, that is if the canthrow attribute is set. The optional managed code is generated using the excode typemap attribute and $excode special variable in the relevant managed code typemaps. Simply, if any relevant unmanaged code has the canthrow attribute set, then any occurrences of $excode is replaced with the code in the excode attribute. If the canthrow attribute is not set, then any occurrences of $excode are replaced with nothing.

    The prototypes for the SWIG_CSharpSetPendingException() and SWIG_CSharpSetPendingExceptionArgument() functions are

    static void SWIG_CSharpSetPendingException(SWIG_CSharpExceptionCodes code,
                                               const char *msg);
    
    static void SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpExceptionArgumentCodes code,
                                                       const char *msg,
                                                       const char *param_name);
    

    The first parameter defines which .NET exceptions can be thrown:

    typedef enum {
      SWIG_CSharpApplicationException,
      SWIG_CSharpArithmeticException,
      SWIG_CSharpDivideByZeroException,
      SWIG_CSharpIndexOutOfRangeException,
      SWIG_CSharpInvalidCastException,
      SWIG_CSharpInvalidOperationException,
      SWIG_CSharpIOException,
      SWIG_CSharpNullReferenceException,
      SWIG_CSharpOutOfMemoryException,
      SWIG_CSharpOverflowException,
      SWIG_CSharpSystemException
    } SWIG_CSharpExceptionCodes;
    
    typedef enum {
      SWIG_CSharpArgumentException,
      SWIG_CSharpArgumentNullException,
      SWIG_CSharpArgumentOutOfRangeException,
    } SWIG_CSharpExceptionArgumentCodes;
    

    where, for example, SWIG_CSharpApplicationException corresponds to the .NET exception, ApplicationException. The msg and param_name parameters contain the C# exception message and parameter name associated with the exception.

    The %exception feature in C# has the canthrow attribute set. The %csnothrowexception feature is like %exception, but it does not have the canthrow attribute set so should only be used when a C# exception is not created.

    22.5.1 C# exception example using "check" typemap

    Let's say we have the following simple C++ method:

    void positivesonly(int number);
    

    and we want to check that the input number is always positive and if not throw a C# ArgumentOutOfRangeException. The "check" typemap is designed for checking input parameters. Below you will see the canthrow attribute is set because the code contains a call to SWIG_CSharpSetPendingExceptionArgument(). The full example follows:

    %module example
    
    %typemap(check, canthrow=1) int number %{
    if ($1 < 0) {
      SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentOutOfRangeException,
                                             "only positive numbers accepted", "number");
      return $null;
    }
    // SWIGEXCODE is a macro used by many other csout typemaps
    %define SWIGEXCODE
     "\n    if ($modulePINVOKE.SWIGPendingException.Pending)"
     "\n      throw $modulePINVOKE.SWIGPendingException.Retrieve();"
    %enddef
    %typemap(csout, excode=SWIGEXCODE) void {
        $imcall;$excode
      }
    %}
    
    %inline %{
    
    void positivesonly(int number) {
    }
    
    %}
    

    When the following C# code is executed:

    public class runme {
      static void Main() {
        example.positivesonly(-1);
      }
    }
    

    The exception is thrown:

    Unhandled Exception: System.ArgumentOutOfRangeException: only positive numbers accepted
    Parameter name: number
    in <0x00034> example:positivesonly (int)
    in <0x0000c> runme:Main ()
    

    Now let's analyse the generated code to gain a fuller understanding of the typemaps. The generated unmanaged C++ code is:

    SWIGEXPORT void SWIGSTDCALL CSharp_positivesonly(int jarg1) {
      int arg1 ;
    
      arg1 = (int)jarg1;
    
      if (arg1 < 0) {
        SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentOutOfRangeException,
          "only positive numbers accepted", "number");
        return ;
      }
    
      positivesonly(arg1);
    
    }
    

    This largely comes from the "check" typemap. The managed code in the module class is:

    public class example {
      public static void positivesonly(int number) {
        examplePINVOKE.positivesonly(number);
        if (examplePINVOKE.SWIGPendingException.Pending)
          throw examplePINVOKE.SWIGPendingException.Retrieve();
      }
    
    }
    

    This comes largely from the "csout" typemap.

    The "csout" typemap is the same as the default void "csout" typemap so is not strictly necessary for the example. However, it is shown to demonstrate what managed output code typemaps should contain, that is, a $excode special variable and an excode attribute. Also note that $excode is expanded into the code held in the excode attribute. The $imcall as always expands into examplePINVOKE.positivesonly(number). The exception support code in the intermediary class, examplePINVOKE, is not shown, but is contained within the inner classes, SWIGPendingException and SWIGExceptionHelper and is always generated. These classes can be seen in any of the generated wrappers. However, all that is required of a user is as demonstrated in the "csin" typemap above. That is, is to check SWIGPendingException.Pending and to throw the exception returned by SWIGPendingException.Retrieve().

    If the "check" typemap did not exist, then the following module class would instead be generated:

    public class example {
      public static void positivesonly(int number) {
        examplePINVOKE.positivesonly(number);
      }
    
    }
    

    Here we see the pending exception checking code is omitted. In fact, the code above would be generated if the canthrow attribute was not in the "check" typemap, such as:

    %typemap(check) int number %{
    if ($1 < 0) {
      SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentOutOfRangeException,
                                             "only positive numbers accepted", "number");
      return $null;
    }
    %}
    

    Note that if SWIG detects you have used SWIG_CSharpSetPendingException() or SWIG_CSharpSetPendingExceptionArgument() without setting the canthrow attribute you will get a warning message similar to

    example.i:21: Warning 845: Unmanaged code contains a call to a SWIG_CSharpSetPendingException
    method and C# code does not handle pending exceptions via the canthrow attribute.
    

    Actually it will issue this warning for any function beginning with SWIG_CSharpSetPendingException.

    22.5.2 C# exception example using %exception

    Let's consider a similar, but more common example that throws a C++ exception from within a wrapped function. We can use %exception as mentioned in Exception handling with %exception.

    %exception negativesonly(int value) %{
    try {
      $action
    } catch (std::out_of_range e) {
      SWIG_CSharpSetPendingException(SWIG_CSharpApplicationException, e.what());
      return $null;
    }
    %}
    
    %inline %{
    #include <stdexcept>
    void negativesonly(int value) {
      if (value >= 0)
        throw std::out_of_range("number should be negative");
    }
    %}
    

    The generated unmanaged code this time catches the C++ exception and converts it into a C# ApplicationException.

    SWIGEXPORT void SWIGSTDCALL CSharp_negativesonly(int jarg1) {
      int arg1 ;
    
      arg1 = (int)jarg1;
    
      try {
        negativesonly(arg1);
    
      } catch (std::out_of_range e) {
        SWIG_CSharpSetPendingException(SWIG_CSharpApplicationException, e.what());
        return ;
      }
    }
    

    The managed code generated does check for the pending exception as mentioned earlier as the C# version of %exception has the canthrow attribute set by default:

      public static void negativesonly(int value) {
        examplePINVOKE.negativesonly(value);
        if (examplePINVOKE.SWIGPendingException.Pending)
          throw examplePINVOKE.SWIGPendingException.Retrieve();
      }
    

    22.5.3 C# exception example using exception specifications

    When C++ exception specifications are used, SWIG is able to detect that the method might throw an exception. By default SWIG will automatically generate code to catch the exception and convert it into a managed ApplicationException, as defined by the default "throws" typemaps. The following example has a user supplied "throws" typemap which is used whenever an exception specification contains a std::out_of_range, such as the evensonly method below.

    %typemap(throws, canthrow=1) std::out_of_range {
      SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentException, $1.what(), NULL);
      return $null;
    }
    
    %inline %{
    #include <stdexcept>
    void evensonly(int input) throw (std::out_of_range) {
      if (input%2 != 0)
        throw std::out_of_range("number is not even");
    }
    %}
    

    Note that the type for the throws typemap is the type in the exception specification. SWIG generates a try catch block with the throws typemap code in the catch handler.

    SWIGEXPORT void SWIGSTDCALL CSharp_evensonly(int jarg1) {
      int arg1 ;
    
      arg1 = (int)jarg1;
      try {
        evensonly(arg1);
      }
      catch(std::out_of_range &_e) {
        {
          SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentException, (&_e)->what(), NULL);
          return ;
        }
      }
    }
    

    Multiple catch handlers are generated should there be more than one exception specifications declared.

    22.5.4 Custom C# ApplicationException example

    This example involves a user defined exception. The conventional .NET exception handling approach is to create a custom ApplicationException and throw it in your application. The goal in this example is to convert the STL std::out_of_range exception into one of these custom .NET exceptions.

    The default exception handling is quite easy to use as the SWIG_CSharpSetPendingException() and SWIG_CSharpSetPendingExceptionArgument() methods are provided by SWIG. However, for a custom C# exception, the boiler plate code that supports these functions needs replicating. In essence this consists of some C/C++ code and C# code. The C/C++ code can be generated into the wrapper file using the %insert(runtime) directive and the C# code can be generated into the intermediary class using the imclasscode pragma as follows:

    %insert(runtime) %{
      // Code to handle throwing of C# CustomApplicationException from C/C++ code.
      // The equivalent delegate to the callback, CSharpExceptionCallback_t, is CustomExceptionDelegate
      // and the equivalent customExceptionCallback instance is customDelegate
      typedef void (SWIGSTDCALL* CSharpExceptionCallback_t)(const char *);
      CSharpExceptionCallback_t customExceptionCallback = NULL;
    
      extern "C" SWIGEXPORT
      void SWIGSTDCALL CustomExceptionRegisterCallback(CSharpExceptionCallback_t customCallback) {
        customExceptionCallback = customCallback;
      }
    
      // Note that SWIG detects any method calls named starting with
      // SWIG_CSharpSetPendingException for warning 845
      static void SWIG_CSharpSetPendingExceptionCustom(const char *msg) {
        customExceptionCallback(msg);
      }
    %}
    
    %pragma(csharp) imclasscode=%{
      class CustomExceptionHelper {
        // C# delegate for the C/C++ customExceptionCallback
        public delegate void CustomExceptionDelegate(string message);
        static CustomExceptionDelegate customDelegate =
                                       new CustomExceptionDelegate(SetPendingCustomException);
    
        [global::System.Runtime.InteropServices.DllImport("$dllimport", EntryPoint="CustomExceptionRegisterCallback")]
        public static extern
               void CustomExceptionRegisterCallback(CustomExceptionDelegate customCallback);
    
        static void SetPendingCustomException(string message) {
          SWIGPendingException.Set(new CustomApplicationException(message));
        }
    
        static CustomExceptionHelper() {
          CustomExceptionRegisterCallback(customDelegate);
        }
      }
      static CustomExceptionHelper exceptionHelper = new CustomExceptionHelper();
    %}
    

    The method stored in the C# delegate instance, customDelegate is what gets called by the C/C++ callback. However, the equivalent to the C# delegate, that is the C/C++ callback, needs to be assigned before any unmanaged code is executed. This is achieved by putting the initialisation code in the intermediary class. Recall that the intermediary class contains all the PInvoke methods, so the static variables in the intermediary class will be initialised before any of the PInvoke methods in this class are called. The exceptionHelper static variable ensures the C/C++ callback is initialised with the value in customDelegate by calling the CustomExceptionRegisterCallback method in the CustomExceptionHelper static constructor. Once this has been done, unmanaged code can make callbacks into the managed world as customExceptionCallback will be initialised with a valid callback/delegate. Any calls to SWIG_CSharpSetPendingExceptionCustom() will make the callback to create the pending exception in the same way that SWIG_CSharpSetPendingException() and SWIG_CSharpSetPendingExceptionArgument() does. In fact the method has been similarly named so that SWIG can issue the warning about missing canthrow attributes as discussed earlier. It is an invaluable warning as it is easy to forget the canthrow attribute when writing typemaps/features.

    The SWIGPendingException helper class is not shown, but is generated as an inner class into the intermediary class. It stores the pending exception in Thread Local Storage so that the exception handling mechanism is thread safe.

    The boiler plate code above must be used in addition to a handcrafted CustomApplicationException:

    // Custom C# Exception
    class CustomApplicationException : global::System.ApplicationException {
      public CustomApplicationException(string message) 
        : base(message) {
      }
    }
    

    and the SWIG interface code:

    %typemap(throws, canthrow=1) std::out_of_range {
      SWIG_CSharpSetPendingExceptionCustom($1.what());
      return $null;
    }
    
    %inline %{
    void oddsonly(int input) throw (std::out_of_range) {
      if (input%2 != 1)
        throw std::out_of_range("number is not odd");
    }
    %}
    

    The "throws" typemap now simply calls our new SWIG_CSharpSetPendingExceptionCustom() function so that the exception can be caught, as such:

    try {
      example.oddsonly(2);
    } catch (CustomApplicationException e) {
      ...
    }
    

    22.6 C# Directors

    The SWIG directors feature adds extra code to the generated C# proxy classes that enable these classes to be used in cross-language polymorphism. Essentially, it enables unmanaged C++ code to call back into managed code for virtual methods so that a C# class can derive from a wrapped C++ class.

    The following sections provide information on the C# director implementation and contain most of the information required to use the C# directors. However, the Java directors section should also be read in order to gain more insight into directors.

    22.6.1 Directors example

    Imagine we are wrapping a C++ base class, Base, from which we would like to inherit in C#. Such a class is shown below as well as another class, Caller, which calls the virtual method UIntMethod from pure unmanaged C++ code.

    // file: example.h
    class Base {
    public:
      virtual ~Base() {}
    
      virtual unsigned int UIntMethod(unsigned int x) {
        std::cout << "Base - UIntMethod(" << x << ")" << std::endl;
        return x;
      }
      virtual void BaseBoolMethod(const Base &b, bool flag) {}
    };
    
    class Caller {
    public:
      Caller(): m_base(0) {}
      ~Caller() { delBase(); }
      void set(Base *b) { delBase(); m_base = b; }
      void reset() { m_base = 0; }
      unsigned int UIntMethodCall(unsigned int x) { return m_base->UIntMethod(x); }
    
    private:
      Base *m_base;
      void delBase() { delete m_base; m_base = 0; }
    };
    

    The director feature is turned off by default and the following simple interface file shows how directors are enabled for the class Base.

    /* File : example.i */
    %module(directors="1") example
    %{
    #include "example.h"
    %}
    
    %feature("director") Base;
    
    %include "example.h"
    

    The following is a C# class inheriting from Base:

    public class CSharpDerived : Base
    {
      public override uint UIntMethod(uint x)
      {
        Console.WriteLine("CSharpDerived - UIntMethod({0})", x);
        return x;
      }
    }
    

    The Caller class can demonstrate the UIntMethod method being called from unmanaged code using the following C# code:

    public class runme
    {
      static void Main() 
      {
        Caller myCaller = new Caller();
    
        // Test pure C++ class
        using (Base myBase = new Base())
        {
          makeCalls(myCaller, myBase);
        }
    
        // Test director / C# derived class
        using (Base myBase = new CSharpDerived())
        {
          makeCalls(myCaller, myBase);
        }
      }
    
      static void makeCalls(Caller myCaller, Base myBase)
      {
        myCaller.set(myBase);
        myCaller.UIntMethodCall(123);
        myCaller.reset();
      }
    }
    

    If the above is run, the output is then:

    Base - UIntMethod(123)
    CSharpDerived - UIntMethod(123)
    

    22.6.2 Directors implementation

    The previous section demonstrated a simple example where the virtual UIntMethod method was called from C++ code, even when the overridden method is implemented in C#. The intention of this section is to gain an insight into how the director feature works. It shows the generated code for the two virtual methods, UIntMethod and BaseBoolMethod, when the director feature is enabled for the Base class.

    Below is the generated C# Base director class.

    public class Base : global::System.IDisposable {
      private global::System.Runtime.InteropServices.HandleRef swigCPtr;
      protected bool swigCMemOwn;
    
      internal Base(global::System.IntPtr cPtr, bool cMemoryOwn) {
        swigCMemOwn = cMemoryOwn;
        swigCPtr = new global::System.Runtime.InteropServices.HandleRef(this, cPtr);
      }
    
      internal static global::System.Runtime.InteropServices.HandleRef getCPtr(Base obj) {
        return (obj == null) ? new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero) : obj.swigCPtr;
      }
    
      ~Base() {
        Dispose();
      }
    
      public virtual void Dispose() {
        lock(this) {
          if(swigCPtr.Handle != global::System.IntPtr.Zero && swigCMemOwn) {
            swigCMemOwn = false;
            examplePINVOKE.delete_Base(swigCPtr);
          }
          swigCPtr = new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero);
          global::System.GC.SuppressFinalize(this);
        }
      }
    
      public virtual uint UIntMethod(uint x) {
        uint ret = examplePINVOKE.Base_UIntMethod(swigCPtr, x);
        return ret;
      }
    
      public virtual void BaseBoolMethod(Base b, bool flag) {
        examplePINVOKE.Base_BaseBoolMethod(swigCPtr, Base.getCPtr(b), flag);
        if (examplePINVOKE.SWIGPendingException.Pending)
          throw examplePINVOKE.SWIGPendingException.Retrieve();
      }
    
      public Base() : this(examplePINVOKE.new_Base(), true) {
        SwigDirectorConnect();
      }
    
      private void SwigDirectorConnect() {
        if (SwigDerivedClassHasMethod("UIntMethod", swigMethodTypes0))
          swigDelegate0 = new SwigDelegateBase_0(SwigDirectorMethodUIntMethod);
        if (SwigDerivedClassHasMethod("BaseBoolMethod", swigMethodTypes1))
          swigDelegate1 = new SwigDelegateBase_1(SwigDirectorMethodBaseBoolMethod);
        examplePINVOKE.Base_director_connect(swigCPtr, swigDelegate0, swigDelegate1);
      }
    
      private bool SwigDerivedClassHasMethod(string methodName, global::System.global::System.Type[] methodTypes) {
        System.Reflection.MethodInfo methodInfo = this.GetType().GetMethod(methodName, methodTypes);
        bool hasDerivedMethod = methodInfo.DeclaringType.IsSubclassOf(typeof(Base));
        return hasDerivedMethod;
      }
    
      private uint SwigDirectorMethodUIntMethod(uint x) {
        return UIntMethod(x);
      }
    
      private void SwigDirectorMethodBaseBoolMethod(global::System.IntPtr b, bool flag) {
        BaseBoolMethod(new Base(b, false), flag);
      }
    
      public delegate uint SwigDelegateBase_0(uint x);
      public delegate void SwigDelegateBase_1(global::System.IntPtr b, bool flag);
    
      private SwigDelegateBase_0 swigDelegate0;
      private SwigDelegateBase_1 swigDelegate1;
    
      private static global::System.Type[] swigMethodTypes0 = new global::System.Type[] { typeof(uint) };
      private static global::System.Type[] swigMethodTypes1 = new global::System.Type[] { typeof(Base), typeof(bool) };
    }
    

    Everything from the SwigDirectorConnect() method and below is code that is only generated when directors are enabled. The design comprises a C# delegate being initialised for each virtual method on construction of the class. Let's examine the BaseBoolMethod.

    In the Base constructor a call is made to SwigDirectorConnect() which contains the initialisation code for all the virtual methods. It uses a support method, SwigDerivedClassHasMethod(), which simply uses reflection to determine if the named method, BaseBoolMethod, with the list of required parameter types, exists in a subclass. If it does not exist, the delegate is not initialised as there is no need for unmanaged code to call back into managed C# code. However, if there is an overridden method in any subclass, the delegate is required. It is then initialised to the SwigDirectorMethodBaseBoolMethod which in turn will call BaseBoolMethod if invoked. The delegate is not initialised to the BaseBoolMethod directly as quite often types will need marshalling from the unmanaged type to the managed type in which case an intermediary method (SwigDirectorMethodBaseBoolMethod) is required for the marshalling. In this case, the C# Base class needs to be created from the unmanaged IntPtr type.

    The last thing that SwigDirectorConnect() does is to pass the delegates to the unmanaged code. It calls the intermediary method Base_director_connect() which is really a call to the C function CSharp_Base_director_connect(). This method simply maps each C# delegate onto a C function pointer.

    SWIGEXPORT void SWIGSTDCALL CSharp_Base_director_connect(void *objarg, 
                                            SwigDirector_Base::SWIG_Callback0_t callback0,
                                            SwigDirector_Base::SWIG_Callback1_t callback1) {
      Base *obj = (Base *)objarg;
      SwigDirector_Base *director = dynamic_cast<SwigDirector_Base *>(obj);
      if (director) {
        director->swig_connect_director(callback0, callback1);
      }
    }
    
    class SwigDirector_Base : public Base, public Swig::Director {
    public:
      SwigDirector_Base();
      virtual unsigned int UIntMethod(unsigned int x);
      virtual ~SwigDirector_Base();
      virtual void BaseBoolMethod(Base const &b, bool flag);
    
      typedef unsigned int (SWIGSTDCALL* SWIG_Callback0_t)(unsigned int);
      typedef void (SWIGSTDCALL* SWIG_Callback1_t)(void *, unsigned int);
      void swig_connect_director(SWIG_Callback0_t callbackUIntMethod,
                                 SWIG_Callback1_t callbackBaseBoolMethod);
    
    private:
      SWIG_Callback0_t swig_callbackUIntMethod;
      SWIG_Callback1_t swig_callbackBaseBoolMethod;
      void swig_init_callbacks();
    };
    
    void SwigDirector_Base::swig_connect_director(SWIG_Callback0_t callbackUIntMethod, 
                                                  SWIG_Callback1_t callbackBaseBoolMethod) {
      swig_callbackUIntMethod = callbackUIntMethod;
      swig_callbackBaseBoolMethod = callbackBaseBoolMethod;
    }
    

    Note that for each director class SWIG creates an unmanaged director class for making the callbacks. For example Base has SwigDirector_Base and SwigDirector_Base is derived from Base. Should a C# class be derived from Base, the underlying C++ SwigDirector_Base is created rather than Base. The SwigDirector_Base class then implements all the virtual methods, redirecting calls up to managed code if the callback/delegate is non-zero. The implementation of SwigDirector_Base::BaseBoolMethod shows this - the callback is made by invoking the swig_callbackBaseBoolMethod function pointer:

    void SwigDirector_Base::BaseBoolMethod(Base const &b, bool flag) {
      void * jb = 0 ;
      unsigned int jflag  ;
      
      if (!swig_callbackBaseBoolMethod) {
        Base::BaseBoolMethod(b, flag);
        return;
      } else {
        jb = (Base *) &b; 
        jflag = flag;
        swig_callbackBaseBoolMethod(jb, jflag);
      }
    }
    

    The delegates from the above example are public by default:

      public delegate uint SwigDelegateBase_0(uint x);
      public delegate void SwigDelegateBase_1(global::System.IntPtr b, bool flag);
    

    These can be changed if desired via the csdirectordelegatemodifiers %feature directive. For example, using %feature("csdirectordelegatemodifiers") "internal" before SWIG parses the Base class will change all the delegates to internal:

      internal delegate uint SwigDelegateBase_0(uint x);
      internal delegate void SwigDelegateBase_1(global::System.IntPtr b, bool flag);
    

    22.6.3 Director caveats

    There is a subtle gotcha with directors. If default parameters are used, it is recommended to follow a pattern of always calling a single method in any C# derived class. An example will clarify this and the reasoning behind the recommendation. Consider the following C++ class wrapped as a director class:

    class Defaults {
    public:
      virtual ~Defaults();
      virtual void DefaultMethod(int a=-100);
    };
    

    Recall that C++ methods with default parameters generate overloaded methods for each defaulted parameter, so a C# derived class can be created with two DefaultMethod override methods:

    public class CSharpDefaults : Defaults
    {
      public override void DefaultMethod()
      {
        DefaultMethod(-100); // note C++ default value used
      }
      public override void DefaultMethod(int x)
      {
      }
    }
    

    It may not be clear at first, but should a user intend to call CSharpDefaults.DefaultMethod() from C++, a call is actually made to CSharpDefaults.DefaultMethod(int). This is because the initial call is made in C++ and therefore the DefaultMethod(int) method will be called as is expected with C++ calls to methods with defaults, with the default being set to -100. The callback/delegate matching this method is of course the overloaded method DefaultMethod(int). However, a call from C# to CSharpDefaults.DefaultMethod() will of course call this exact method and in order for behaviour to be consistent with calls from C++, the implementation should pass the call on to CSharpDefaults.DefaultMethod(int)using the C++ default value, as shown above.

    22.7 Multiple modules

    When using multiple modules it is possible to compile each SWIG generated wrapper into a different assembly. However, by default the generated code may not compile if generated classes in one assembly use generated classes in another assembly. The visibility of the getCPtr() and pointer constructor generated from the csbody typemaps needs changing. The default visibility is internal but it needs to be public for access from a different assembly. Just changing 'internal' to 'public' in the typemap achieves this. Two macros are available in csharp.swg to make this easier and using them is the preferred approach over simply copying the typemaps and modifying as this is forward compatible with any changes in the csbody typemap in future versions of SWIG. The macros are for the proxy and typewrapper classes and can respectively be used to to make the method and constructor public:

      SWIG_CSBODY_PROXY(public, public, SWIGTYPE)
      SWIG_CSBODY_TYPEWRAPPER(public, public, public, SWIGTYPE)
    

    Alternatively, instead of exposing these as public, consider using the [assembly:InternalsVisibleTo("Name")] attribute available in the .NET framework when you know which assemblies these can be exposed to. Another approach would be to make these public, but also to hide them from intellisense by using the [System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)] attribute if you don't want users to easily stumble upon these so called 'internal workings' of the wrappers.

    22.8 C# Typemap examples

    This section includes a few examples of typemaps. For more examples, you might look at the files "csharp.swg" and "typemaps.i" in the SWIG library.

    22.8.1 Memory management when returning references to member variables

    This example shows how to prevent premature garbage collection of objects when the underlying C++ class returns a pointer or reference to a member variable. The example is a direct equivalent to this Java equivalent.

    Consider the following C++ code:

    struct Wheel {
      int size;
      Wheel(int sz = 0) : size(sz) {}
    };
    
    class Bike {
      Wheel wheel;
    public:
      Bike(int val) : wheel(val) {}
      Wheel& getWheel() { return wheel; }
    };
    

    and the following usage from C# after running the code through SWIG:

      Wheel wheel = new Bike(10).getWheel();
      Console.WriteLine("wheel size: " + wheel.size);
      // Simulate a garbage collection
      global::System.GC.Collect();
      global::System.GC.WaitForPendingFinalizers();
      global::System.Console.WriteLine("wheel size: " + wheel.size);
    

    Don't be surprised that if the resulting output gives strange results such as...

    wheel size: 10
    wheel size: 135019664
    

    What has happened here is the garbage collector has collected the Bike instance as it doesn't think it is needed any more. The proxy instance, wheel, contains a reference to memory that was deleted when the Bike instance was collected. In order to prevent the garbage collector from collecting the Bike instance a reference to the Bike must be added to the wheel instance. You can do this by adding the reference when the getWheel() method is called using the following typemaps.

    %typemap(cscode) Wheel %{
      // Ensure that the GC doesn't collect any Bike instance set from C#
      private Bike bikeReference;
      internal void addReference(Bike bike) {
        bikeReference = bike;
      }
    %}
    
    // Add a C# reference to prevent premature garbage collection and resulting use
    // of dangling C++ pointer. Intended for methods that return pointers or
    // references to a member variable.
    %typemap(csout, excode=SWIGEXCODE) Wheel& getWheel {
        global::System.IntPtr cPtr = $imcall;$excode
        $csclassname ret = null;
        if (cPtr != global::System.IntPtr.Zero) {
          ret = new $csclassname(cPtr, $owner);
          ret.addReference(this);
        }
        return ret;
      }
    

    The code in the first typemap gets added to the Wheel proxy class. The code in the second typemap constitutes the bulk of the code in the generated getWheel() function:

    public class Wheel : global::System.IDisposable {
      ...
      // Ensure that the GC doesn't collect any Bike instance set from C#
      private Bike bikeReference;
      internal void addReference(Bike bike) {
        bikeReference = bike;
      }
    }
    
    public class Bike : global::System.IDisposable {
      ...
      public Wheel getWheel() {
        global::System.IntPtr cPtr = examplePINVOKE.Bike_getWheel(swigCPtr);
        Wheel ret = null;
        if (cPtr != global::System.IntPtr.Zero) {
          ret = new Wheel(cPtr, false);
          ret.addReference(this);
        }
        return ret;
      }
    }
    

    Note the addReference call.

    22.8.2 Memory management for objects passed to the C++ layer

    The example is a direct equivalent to this Java equivalent. Managing memory can be tricky when using C++ and C# proxy classes. The previous example shows one such case and this example looks at memory management for a class passed to a C++ method which expects the object to remain in scope after the function has returned. Consider the following two C++ classes:

    struct Element {
      int value;
      Element(int val) : value(val) {}
    };
    class Container {
      Element* element;
    public:
      Container() : element(0) {}
      void setElement(Element* e) { element = e; }
      Element* getElement() { return element; }
    };
    

    and usage from C++

      Container container;
      Element element(20);
      container.setElement(&element);
      cout << "element.value: " << container.getElement()->value << endl;
    

    and more or less equivalent usage from C#

      Container container = new Container();
      Element element = new Element(20);
      container.setElement(element);
    

    The C++ code will always print out 20, but the value printed out may not be this in the C# equivalent code. In order to understand why, consider a garbage collection occurring...

      Container container = new Container();
      Element element = new Element(20);
      container.setElement(element);
      Console.WriteLine("element.value: " + container.getElement().value);
      // Simulate a garbage collection
      global::System.GC.Collect();
      global::System.GC.WaitForPendingFinalizers();
      global::System.Console.WriteLine("element.value: " + container.getElement().value);
    

    The temporary element created with new Element(20) could get garbage collected which ultimately means the container variable is holding a dangling pointer, thereby printing out any old random value instead of the expected value of 20. One solution is to add in the appropriate references in the C# layer...

    public class Container : global::System.IDisposable {
    
      ...
    
      // Ensure that the GC doesn't collect any Element set from C#
      // as the underlying C++ class stores a shallow copy
      private Element elementReference;
    
      public void setElement(Element e) {
        examplePINVOKE.Container_setElement(swigCPtr, Element.getCPtr(e));
        elementReference = e;
      }
    }
    

    The following typemaps can be used to generate this code:

    %typemap(cscode) Container %{
      // Ensure that the GC doesn't collect any Element set from C#
      // as the underlying C++ class stores a shallow copy
      private Element elementReference;
    %}
    
    %typemap(csin,
             post="      elementReference = $csinput;"
             ) Element *e "Element.getCPtr($csinput)"
    

    The 'cscode' typemap simply adds in the specified code into the C# proxy class. The 'csin' typemap matches the input parameter type and name for the setElement method and the 'post' typemap attribute allows adding code after the PInvoke call. The 'post' code is generated into a finally block after the PInvoke call so the resulting code isn't quite as mentioned earlier, setElement is actually:

      public void setElement(Element e) {
        try {
          examplePINVOKE.Container_setElement(swigCPtr, Element.getCPtr(e));
        } finally {
          elementReference = e;
        }
      }
    

    22.8.3 Date marshalling using the csin typemap and associated attributes

    The NaN Exception example is a simple example of the "javain" typemap and its 'pre' attribute. This example demonstrates how a C++ date class, say CDate, can be mapped onto the standard .NET date class, System.DateTime by using the 'pre', 'post' and 'pgcppname' attributes of the "csin" typemap (the C# equivalent to the "javain" typemap). The example is an equivalent to the Java Date marshalling example. The idea is that the System.DateTime is used wherever the C++ API uses a CDate. Let's assume the code being wrapped is as follows:

    class CDate {
    public:
      CDate();
      CDate(int year, int month, int day);
      int getYear();
      int getMonth();
      int getDay();
      ...
    };
    struct Action {
      static int doSomething(const CDate &dateIn, CDate &dateOut);
      Action(const CDate &date, CDate &dateOut);
    };
    

    Note that dateIn is const and therefore read only and dateOut is a non-const output type.

    First let's look at the code that is generated by default, where the C# proxy class CDate is used in the proxy interface:

    public class Action : global::System.IDisposable {
      ...
      public Action(CDate dateIn, CDate dateOut) 
          : this(examplePINVOKE.new_Action(CDate.getCPtr(dateIn), CDate.getCPtr(dateOut)), true) {
        if (examplePINVOKE.SWIGPendingException.Pending) 
          throw examplePINVOKE.SWIGPendingException.Retrieve();
      }
    
      public int doSomething(CDate dateIn, CDate dateOut) {
        int ret = examplePINVOKE.Action_doSomething(swigCPtr, 
                                                    CDate.getCPtr(dateIn), 
                                                    CDate.getCPtr(dateOut));
        if (examplePINVOKE.SWIGPendingException.Pending) 
          throw examplePINVOKE.SWIGPendingException.Retrieve();
        return ret;
      }
    }
    

    The CDate & and const CDate & C# code is generated from the following two default typemaps:

    %typemap(cstype) SWIGTYPE & "$csclassname"
    %typemap(csin) SWIGTYPE & "$csclassname.getCPtr($csinput)"
    

    where '$csclassname' is translated into the proxy class name, CDate and '$csinput' is translated into the name of the parameter, eg dateIn. From C#, the intention is then to call into a modified API with something like:

    System.DateTime dateIn = new System.DateTime(2011, 4, 13);
    System.DateTime dateOut = new System.DateTime();
    
    // Note in calls below, dateIn remains unchanged and dateOut 
    // is set to a new value by the C++ call
    Action action = new Action(dateIn, out dateOut);
    dateIn = new System.DateTime(2012, 7, 14);
    

    To achieve this mapping, we need to alter the default code generation slightly so that at the C# layer, a System.DateTime is converted into a CDate. The intermediary layer will still take a pointer to the underlying CDate class. The typemaps to achieve this are shown below.

    %typemap(cstype) const CDate & "System.DateTime"
    %typemap(csin, 
             pre="    CDate temp$csinput = new CDate($csinput.Year, $csinput.Month, $csinput.Day);"
            ) const CDate &
             "$csclassname.getCPtr(temp$csinput)"
    
    %typemap(cstype) CDate & "out System.DateTime"
    %typemap(csin, 
             pre="    CDate temp$csinput = new CDate();", 
             post="      $csinput = new System.DateTime(temp$csinput.getYear(),"
                  " temp$csinput.getMonth(), temp$csinput.getDay(), 0, 0, 0);",
             cshin="out $csinput"
            ) CDate &
             "$csclassname.getCPtr(temp$csinput)"
    
    

    The resulting generated proxy code in the Action class follows:

    public class Action : global::System.IDisposable {
      ...
      public int doSomething(System.DateTime dateIn, out System.DateTime dateOut) {
        CDate tempdateIn = new CDate(dateIn.Year, dateIn.Month, dateIn.Day);
        CDate tempdateOut = new CDate();
        try {
          int ret = examplePINVOKE.Action_doSomething(swigCPtr, 
                                                      CDate.getCPtr(tempdateIn), 
                                                      CDate.getCPtr(tempdateOut));
          if (examplePINVOKE.SWIGPendingException.Pending) 
            throw examplePINVOKE.SWIGPendingException.Retrieve();
          return ret;
        } finally {
          dateOut = new System.DateTime(tempdateOut.getYear(), 
                                        tempdateOut.getMonth(), tempdateOut.getDay(), 0, 0, 0);
        }
      }
    
      static private global::System.IntPtr SwigConstructAction(System.DateTime dateIn, out System.DateTime dateOut) {
        CDate tempdateIn = new CDate(dateIn.Year, dateIn.Month, dateIn.Day);
        CDate tempdateOut = new CDate();
        try {
          return examplePINVOKE.new_Action(CDate.getCPtr(tempdateIn), CDate.getCPtr(tempdateOut));
        } finally {
          dateOut = new System.DateTime(tempdateOut.getYear(), 
                                        tempdateOut.getMonth(), tempdateOut.getDay(), 0, 0, 0);
        }
      }
    
      public Action(System.DateTime dateIn, out System.DateTime dateOut) 
          : this(Action.SwigConstructAction(dateIn, out dateOut), true) {
        if (examplePINVOKE.SWIGPendingException.Pending) 
          throw examplePINVOKE.SWIGPendingException.Retrieve();
      }
    }
    

    A few things to note:

    • The "cstype" typemap has changed the parameter type to System.DateTime instead of the default generated CDate proxy.
    • The non-const CDate & type is marshalled as a reference parameter in C# as the date cannot be explicitly set once the object has been created, so a new object is created instead.
    • The code in the 'pre' attribute appears before the intermediary call (examplePINVOKE.new_Action / examplePINVOKE.Action_doSomething).
    • The code in the 'post' attribute appears after the intermediary call.
    • A try .. finally block is generated with the intermediary call in the try block and 'post' code in the finally block. The alternative of just using a temporary variable for the return value from the intermediary call and the 'post' code being inserted before the return statement is not possible given that the intermediary call and method return comes from a single source (the "csout" typemap).
    • The temporary variables in the "csin" typemaps are called temp$csin, where "$csin" is replaced with the parameter name. "$csin" is used to mangle the variable name so that more than one CDate & type can be used as a parameter in a method, otherwise two or more local variables with the same name would be generated.
    • The use of the "csin" typemap causes a constructor helper function (SwigConstructAction) to be generated. This allows C# code to be called before the intermediary call made in the constructor initialization list.
    • The 'cshin' attribute is required for the SwigConstructAction constructor helper function so that the 2nd parameter is declared as out dateOut instead of just dateOut.

    So far we have considered the date as an input only and an output only type. Now let's consider CDate * used as an input/output type. Consider the following C++ function which modifies the date passed in:

    void addYears(CDate *pDate, int years) {
      *pDate = CDate(pDate->getYear() + years, pDate->getMonth(), pDate->getDay());
    }
    

    If usage of CDate * commonly follows this input/output pattern, usage from C# like the following

    System.DateTime christmasEve = new System.DateTime(2000, 12, 24);
    example.addYears(ref christmasEve, 10); // christmasEve now contains 2010-12-24
    

    will be possible with the following CDate * typemaps

    %typemap(cstype, out="System.DateTime") CDate * "ref System.DateTime"
    
    %typemap(csin,
             pre="    CDate temp$csinput = new CDate($csinput.Year, $csinput.Month, $csinput.Day);",
             post="      $csinput = new System.DateTime(temp$csinput.getYear(),"
                  " temp$csinput.getMonth(), temp$csinput.getDay(), 0, 0, 0);",
             cshin="ref $csinput"
            ) CDate *
             "$csclassname.getCPtr(temp$csinput)"
    

    Globals are wrapped by the module class and for a module called example, the typemaps result in the following code:

    public class example {
      public static void addYears(ref System.DateTime pDate, int years) {
        CDate temppDate = new CDate(pDate.Year, pDate.Month, pDate.Day);
        try {
          examplePINVOKE.addYears(CDate.getCPtr(temppDate), years);
        } finally {
          pDate = new System.DateTime(temppDate.getYear(), temppDate.getMonth(), temppDate.getDay(),
                                      0, 0, 0);
        }
      }
      ...
    }
    

    The following typemap is the same as the previous but demonstrates how a using block can be used for the temporary variable. The only change to the previous typemap is the introduction of the 'terminator' attribute to terminate the using block. The subtractYears method is nearly identical to the above addYears method.

    %typemap(csin,
      pre="    using (CDate temp$csinput = new CDate($csinput.Year, $csinput.Month, $csinput.Day)) {",
      post="      $csinput = new System.DateTime(temp$csinput.getYear(),"
           " temp$csinput.getMonth(), temp$csinput.getDay(), 0, 0, 0);",
      terminator="    } // terminate temp$csinput using block",
      cshin="ref $csinput"
     ) CDate *
      "$csclassname.getCPtr(temp$csinput)"
    
    void subtractYears(CDate *pDate, int years) {
      *pDate = CDate(pDate->getYear() - years, pDate->getMonth(), pDate->getDay());
    }
    

    The resulting generated code shows the termination of the using block:

    public class example {
      public static void subtractYears(ref System.DateTime pDate, int years) {
        using (CDate temppDate = new CDate(pDate.Year, pDate.Month, pDate.Day)) {
        try {
          examplePINVOKE.subtractYears(CDate.getCPtr(temppDate), years);
        } finally {
          pDate = new System.DateTime(temppDate.getYear(), temppDate.getMonth(), temppDate.getDay(),
                                      0, 0, 0);
        }
        } // terminate temppDate using block
      }
      ...
    }
    

    22.8.4 A date example demonstrating marshalling of C# properties

    The previous section looked at converting a C++ date class to System.DateTime for parameters. This section extends this idea so that the correct marshalling is obtained when wrapping C++ variables. Consider the same CDate class from the previous section and a global variable:

    CDate ImportantDate = CDate(1999, 12, 31);
    

    The aim is to use System.DateTime from C# when accessing this date as shown in the following usage where the module name is 'example':

    example.ImportantDate = new System.DateTime(2000, 11, 22);
    System.DateTime importantDate = example.ImportantDate;
    Console.WriteLine("Important date: " + importantDate);
    

    When SWIG wraps a variable that is a class/struct/union, it is wrapped using a pointer to the type for the reasons given in Structure data members. The typemap type required is thus CDate *. Given that the previous section already designed CDate * typemaps, we'll use those same typemaps plus the 'csvarin' and 'csvarout' typemaps.

    %typemap(cstype, out="System.DateTime") CDate * "ref System.DateTime"
    
    %typemap(csin,
             pre="    CDate temp$csinput = new CDate($csinput.Year, $csinput.Month, $csinput.Day);",
             post="      $csinput = new System.DateTime(temp$csinput.getYear(),"
                  " temp$csinput.getMonth(), temp$csinput.getDay(), 0, 0, 0);",
             cshin="ref $csinput"
            ) CDate *
             "$csclassname.getCPtr(temp$csinput)"
    
    %typemap(csvarin, excode=SWIGEXCODE2) CDate * %{
        /* csvarin typemap code */
        set {
          CDate temp$csinput = new CDate($csinput.Year, $csinput.Month, $csinput.Day);
          $imcall;$excode
        } %}
    
    %typemap(csvarout, excode=SWIGEXCODE2) CDate * %{
        /* csvarout typemap code */
        get {
          global::System.IntPtr cPtr = $imcall;
          CDate tempDate = (cPtr == global::System.IntPtr.Zero) ? null : new CDate(cPtr, $owner);$excode
          return new System.DateTime(tempDate.getYear(), tempDate.getMonth(), tempDate.getDay(),
                                     0, 0, 0);
        } %}
    

    For a module called example, the typemaps result in the following code:

    public class example {
      public static System.DateTime ImportantDate {
        /* csvarin typemap code */
        set {
          CDate tempvalue = new CDate(value.Year, value.Month, value.Day);
          examplePINVOKE.ImportantDate_set(CDate.getCPtr(tempvalue));
        } 
        /* csvarout typemap code */
        get {
          global::System.IntPtr cPtr = examplePINVOKE.ImportantDate_get();
          CDate tempDate = (cPtr == global::System.IntPtr.Zero) ? null : new CDate(cPtr, false);
          return new System.DateTime(tempDate.getYear(), tempDate.getMonth(), tempDate.getDay(),
                                     0, 0, 0);
        } 
      }
      ...
    }
    

    Some points to note:

    • The property set comes from the 'csvarin' typemap and the property get comes from the 'csvarout' typemap.
    • The type used for the property comes from the 'cstype' typemap. This particular example has the 'out' attribute set in the typemap and as it is specified, it is used in preference to the type in the typemap body. This is because the type in the 'out' attribute can never include modifiers such as 'ref', thereby avoiding code such as public static ref System.DateTime ImportantDate { ..., which would of course not compile.
    • The $excode special variable expands to nothing as there are no exception handlers specified in any of the unmanaged code typemaps (in fact the marshalling was done using the default unmanaged code typemaps.)
    • The $imcall typemap expands to the appropriate intermediary method call in the examplePINVOKE class.
    • The $csinput special variable in the 'csin' typemap always expands to value for properties. In this case $csclassname.getCPtr(temp$csinput) expands to CDate.getCPtr(tempvalue).
    • The 'csin' typemap has 'pre', 'post' and 'cshin' attributes, and these are all ignored in the property set. The code in these attributes must instead be replicated within the 'csvarin' typemap. The line creating the temp$csinput variable is such an example; it is identical to what is in the 'pre' attribute.

    22.8.5 Date example demonstrating the 'pre' and 'post' typemap attributes for directors

    The 'pre' and 'post' attributes in the "csdirectorin" typemap act like the attributes of the same name in the "csin" typemap. For example if we modify the Date marshalling example like this:

    class CDate {
      ...
      void setYear(int);
      void setMonth(int);
      void setDay(int);
    };
    struct Action {
      virtual void someCallback(CDate &date);
      virtual ~Action();
      ...
    };
    

    and declare %feature ("director") for the Action class, we would have to define additional marshalling rules for CDate & parameter. The typemap may look like this:

    %typemap(csdirectorin,
             pre="System.DateTime temp$iminput = new System.DateTime();",
             post="CDate temp2$iminput = new CDate($iminput, false);\n"
                  "temp2$iminput.setYear(tempdate.Year);\n"
                  "temp2$iminput.setMonth(tempdate.Month);\n"
                  "temp2$iminput.setDay(tempdate.Day);"
             ) CDate &date "out temp$iminput"
    

    The generated proxy class code will then contain the following wrapper for calling user-overloaded someCallback():

    ...
      private void SwigDirectorMethodsomeCallback(global::System.IntPtr date) {
        System.DateTime tempdate = new System.DateTime();
        try {
          someCallback(out tempdate);
        } finally {
          // we create a managed wrapper around the existing C reference, just for convenience
          CDate temp2date = new CDate(date, false);
          temp2date.setYear(tempdate.Year);
          temp2date.setMonth(tempdate.Month);
          temp2date.setDay(tempdate.Day);
        }
      }
    ...
    

    Pay special attention to the memory management issues, using these attributes.

    22.8.6 Turning proxy classes into partial classes

    C# supports the notion of partial classes whereby a class definition can be split into more than one file. It is possible to turn the wrapped C++ class into a partial C# class using the csclassmodifiers typemap. Consider a C++ class called ExtendMe:

    class ExtendMe {
    public:
      int Part1() { return 1; }
    };
    

    The default C# proxy class generated is:

    public class ExtendMe : global::System.IDisposable {
      ...
      public int Part1() {
        ...
      }
    }
    

    The default csclassmodifiers typemap shipped with SWIG is

    %typemap(csclassmodifiers) SWIGTYPE "public class"
    

    Note that the type used is the special catch all type SWIGTYPE. If instead we use the following typemap to override this for just the ExtendMe class:

    %typemap(csclassmodifiers) ExtendMe "public partial class"
    

    The C# proxy class becomes a partial class:

    public partial class ExtendMe : global::System.IDisposable {
      ...
      public int Part1() {
        ...
      }
    }
    

    You can then of course declare another part of the partial class elsewhere, for example:

    public partial class ExtendMe : global::System.IDisposable {
      public int Part2() {
        return 2;
      }
    }
    

    and compile the following code:

    ExtendMe em = new ExtendMe();
    Console.WriteLine("part1: {0}", em.Part1());
    Console.WriteLine("part2: {0}", em.Part2());
    

    demonstrating that the class contains methods calling both unmanaged code - Part1() and managed code - Part2(). The following example is an alternative approach to adding managed code to the generated proxy class.

    22.8.7 Turning proxy classes into sealed classes

    The technique in the previous section can be used to make the proxy class a sealed class. Consider a C++ class NotABaseClass that you don't want to be derived from in C#:

    struct NotABaseClass {
      NotABaseClass();
      ~NotABaseClass();
    };
    

    The default C# proxy class method generated with Dispose method is:

    public class NotABaseClass : global::System.IDisposable {
      ...
      public virtual void Dispose() {
        ...
      }
    }
    

    The csclassmodifiers typemap can be used to modify the class modifiers and the csmethodmodifiers feature can be used on the destructor to modify the proxy's Dispose method:

    %typemap(csclassmodifiers) NotABaseClass "public sealed class"
    %csmethodmodifiers NotABaseClass::~NotABaseClass "public /*virtual*/";
    

    The relevant generated code is thus:

    public sealed class NotABaseClass : global::System.IDisposable {
      ...
      public /*virtual*/ void Dispose() {
        ...
      }
    }
    

    Any attempt to derive from the NotABaseClass in C# will result in a C# compiler error, for example:

    public class Derived : NotABaseClass {
    };
    
    runme.cs(6,14): error CS0509: `Derived': cannot derive from sealed type `NotABaseClass'
    

    Finally, if you get a warning about use of 'protected' in the generated base class:

    NotABaseClass.cs(14,18): warning CS0628: `NotABaseClass.swigCMemOwn': new protected member declared in sealed class
    

    Either suppress the warning or modify the generated code by copying and tweaking the default 'csbody' typemap code in csharp.swg by modifying swigCMemOwn to not be protected.

    22.8.8 Extending proxy classes with additional C# code

    The previous example showed how to use partial classes to add functionality to a generated C# proxy class. It is also possible to extend a wrapped struct/class with C/C++ code by using the %extend directive. A third approach is to add some C# methods into the generated proxy class with the cscode typemap. If we declare the following typemap before SWIG parses the ExtendMe class used in the previous example

    %typemap(cscode) ExtendMe %{
      public int Part3() {
        return 3;
      }
    %}
    
    

    The generated C# proxy class will instead be:

    public class ExtendMe : global::System.IDisposable {
      ...
      public int Part3() {
        return 3;
      }
      public int Part1() {
        ...
      }
    }
    

    22.8.9 Underlying type for enums

    C# enums use int as the underlying type for each enum item. If you wish to change the underlying type to something else, then use the csbase typemap. For example when your C++ code uses a value larger than int, this is necessary as the C# compiler will not compile values which are too large to fit into an int. Here is an example:

    %typemap(csbase) BigNumbers "uint"
    %inline %{
      enum BigNumbers { big=0x80000000, bigger };
    %}
    

    The generated enum will then use the given underlying type and compile correctly:

    public enum BigNumbers : uint {
      big = 0x80000000,
      bigger
    }
    
    swig-4.0.1/Doc/Manual/CPlusPlus11.html0000644000175000017500000012301613527234052017215 0ustar williamwilliam SWIG and C++11

    7 SWIG and C++11

    7.1 Introduction

    This chapter gives you a brief overview about the SWIG implementation of the C++11 standard. This part of SWIG is still a work in progress.

    SWIG supports the new C++ syntax changes with some minor limitations in some areas such as decltype expressions and variadic templates. Wrappers for the new STL types (unordered_ containers, result_of, tuples) are incomplete. The wrappers for the new containers would work much like the C++03 containers and users are welcome to help by adapting the existing container interface files and submitting them as a patch for inclusion in future versions of SWIG.

    7.2 Core language changes

    7.2.1 Rvalue reference and move semantics

    SWIG correctly parses the rvalue reference syntax '&&', for example the typical usage of it in the move constructor and move assignment operator below:

    class MyClass {
    ...
      std::vector<int> numbers;
    public:
      MyClass(MyClass &&other) : numbers(std::move(other.numbers)) {}
      MyClass & operator=(MyClass &&other) {
        numbers = std::move(other.numbers);
        return *this;
      }
    };
    

    Rvalue references are designed for C++ temporaries and so are not very useful when used from non-C++ target languages. Generally you would just ignore them via %ignore before parsing the class. For example, ignore the move constructor:

    %ignore MyClass::MyClass(MyClass &&);
    

    The plan is to ignore move constructors by default in a future version of SWIG. Note that both normal assignment operators as well as move assignment operators are ignored by default in most target languages with the following warning:

    example.i:18: Warning 503: Can't wrap 'operator =' unless renamed to a valid identifier.
    

    7.2.2 Generalized constant expressions

    SWIG parses and identifies the keyword constexpr, but cannot fully utilise it. These C++ compile time constants are usable as runtime constants from the target languages. Below shows example usage for assigning a C++ compile time constant from a compile time constant function:

    constexpr int XXX() { return 10; }
    constexpr int YYY = XXX() + 100;
    

    When either of these is used from a target language, a runtime call is made to obtain the underlying constant.

    7.2.3 Extern template

    SWIG correctly parses the keywords extern template. However, this template instantiation suppression in a translation unit has no relevance outside of the C++ compiler and so is not used by SWIG. SWIG only uses %template for instantiating and wrapping templates.

    template class std::vector<int>;        // C++03 explicit instantiation in C++
    extern template class std::vector<int>; // C++11 explicit instantiation suppression in C++
    %template(VectorInt) std::vector<int>;  // SWIG instantiation
    

    7.2.4 Initializer lists

    Initializer lists are very much a C++ compiler construct and are not very accessible from wrappers as they are intended for compile time initialization of classes using the special std::initializer_list type. SWIG detects usage of initializer lists and will emit a special informative warning each time one is used:

    example.i:33: Warning 476: Initialization using std::initializer_list.
    

    Initializer lists usually appear in constructors but can appear in any function or method. They often appear in constructors which are overloaded with alternative approaches to initializing a class, such as the std container's push_back method for adding elements to a container. The recommended approach then is to simply ignore the initializer-list constructor, for example:

    %ignore Container::Container(std::initializer_list<int>);
    class Container {
    public:
      Container(std::initializer_list<int>); // initializer-list constructor
      Container();
      void push_back(const int &);
      ...
    };
    

    Alternatively you could modify the class and add another constructor for initialization by some other means, for example by a std::vector:

    %include <std_vector.i>
    class Container {
    public:
      Container(const std::vector<int> &);
      Container(std::initializer_list<int>); // initializer-list constructor
      Container();
      void push_back(const int &);
      ...
    };
    

    And then call this constructor from your target language, for example, in Python, the following will call the constructor taking the std::vector:

    >>> c = Container( [1, 2, 3, 4] )
    

    If you are unable to modify the class being wrapped, consider ignoring the initializer-list constructor and using %extend to add in an alternative constructor:

    %include <std_vector.i>
    %extend Container {
      Container(const std::vector<int> &elements) {
        Container *c = new Container();
        for (int element : elements)
          c->push_back(element);
        return c;
      }
    }
    
    %ignore Container::Container(std::initializer_list<int>);
    
    class Container {
    public:
      Container(std::initializer_list<int>); // initializer-list constructor
      Container();
      void push_back(const int &);
      ...
    };
    

    The above makes the wrappers look is as if the class had been declared as follows:

    %include <std_vector.i>
    class Container {
    public:
      Container(const std::vector<int> &);
    //  Container(std::initializer_list<int>); // initializer-list constructor (ignored)
      Container();
      void push_back(const int &);
      ...
    };
    

    std::initializer_list is simply a container that can only be initialized at compile time. As it is just a C++ type, it is possible to write typemaps for a target language container to map onto std::initializer_list. However, this can only be done for a fixed number of elements as initializer lists are not designed to be constructed with a variable number of arguments at runtime. The example below is a very simple approach which ignores any parameters passed in and merely initializes with a fixed list of fixed integer values chosen at compile time:

    %typemap(in) std::initializer_list<int> {
      $1 = {10, 20, 30, 40, 50};
    }
    class Container {
    public:
      Container(std::initializer_list<int>); // initializer-list constructor
      Container();
      void push_back(const int &);
      ...
    };
    

    Any attempt at passing in values from the target language will be ignored and be replaced by {10, 20, 30, 40, 50}. Needless to say, this approach is very limited, but could be improved upon, but only slightly. A typemap could be written to map a fixed number of elements on to the std::initializer_list, but with values decided at runtime. The typemaps would be target language specific.

    Note that the default typemap for std::initializer_list does nothing but issue the warning and hence any user supplied typemaps will override it and suppress the warning.

    7.2.5 Uniform initialization

    The curly brackets {} for member initialization are fully supported by SWIG:

    struct BasicStruct {
     int x;
     double y;
    };
     
    struct AltStruct {
      AltStruct(int x, double y) : x_{x}, y_{y} {}
     
      int x_;
      double y_;
    };
    
    BasicStruct var1{5, 3.2}; // only fills the struct components
    AltStruct var2{2, 4.3};   // calls the constructor
    

    Uniform initialization does not affect usage from the target language, for example in Python:

    >>> a = AltStruct(10, 142.15)
    >>> a.x_
    10
    >>> a.y_
    142.15
    

    7.2.6 Type inference

    SWIG supports decltype() with some limitations. Single variables are allowed, however, expressions are not supported yet. For example, the following code will work:

    int i;
    decltype(i) j;
    

    However, using an expression inside the decltype results in syntax error:

    int i; int j;
    decltype(i+j) k;  // syntax error
    

    7.2.7 Range-based for-loop

    This feature is part of the implementation block only. SWIG ignores it.

    7.2.8 Lambda functions and expressions

    SWIG correctly parses most of the Lambda functions syntax. For example:

    auto val = [] { return something; };
    auto sum = [](int x, int y) { return x+y; };
    auto sum = [](int x, int y) -> int { return x+y; };
    

    The lambda functions are removed from the wrappers for now, because of the lack of support for closures (scope of the lambda functions) in the target languages.

    Lambda functions used to create variables can also be parsed, but due to limited support of auto when the type is deduced from the expression, the variables are simply ignored.

    auto six = [](int x, int y) { return x+y; }(4, 2);
    

    Better support should be available in a later release.

    7.2.9 Alternate function syntax

    SWIG fully supports the new definition of functions. For example:

    struct SomeStruct {
      int FuncName(int x, int y);
    };
    

    can now be written as in C++11:

    struct SomeStruct {
      auto FuncName(int x, int y) -> int;
    };
     
    auto SomeStruct::FuncName(int x, int y) -> int {
      return x + y;
    }
    

    The usage in the target languages remains the same, for example in Python:

    >>> a = SomeStruct()
    >>> a.FuncName(10, 5)
    15
    

    SWIG will also deal with type inference for the return type, as per the limitations described earlier. For example:

    auto square(float a, float b) -> decltype(a);
    

    7.2.10 Object construction improvement

    There are three parts to object construction improvement. The first improvement is constructor delegation such as the following:

    class A {
    public:
      int a;
      int b;
      int c;
    
      A() : A(10) {}
      A(int aa) : A(aa, 20) {}
      A(int aa, int bb) : A(aa, bb, 30) {}
      A(int aa, int bb, int cc) { a=aa; b=bb; c=cc; }
    };
    

    where peer constructors can be called. SWIG handles this without any issue.

    The second improvement is constructor inheritance via a using declaration. This is parsed correctly, but the additional constructors are not currently added to the derived proxy class in the target language. An example is shown below:

    class BaseClass {
    public:
      BaseClass(int iValue);
    };
    
    class DerivedClass: public BaseClass {
      public:
      using BaseClass::BaseClass; // Adds DerivedClass(int) constructor
    };
    

    The final part is member initialization at the site of the declaration. This kind of initialization is handled by SWIG.

    class SomeClass {
    public:
      SomeClass() {}
      explicit SomeClass(int new_value) : value(new_value) {}
    
      int value = 5;
    };
    

    7.2.11 Explicit overrides and final

    The special identifiers final and override can be used on methods and destructors, such as in the following example:

    struct BaseStruct {
      virtual void ab() const = 0;
      virtual void cd();
      virtual void ef();
      virtual ~BaseStruct();
    };
    struct DerivedStruct : BaseStruct {
      virtual void ab() const override;
      virtual void cd() final;
      virtual void ef() final override;
      virtual ~DerivedStruct() override;
    };
    

    7.2.12 Null pointer constant

    The nullptr constant is mostly unimportant in wrappers. In the few places it has an effect, it is treated like NULL.

    7.2.13 Strongly typed enumerations

    SWIG supports strongly typed enumerations and parses the new enum class syntax and forward declarator for the enums, such as:

    enum class MyEnum : unsigned int;
    

    Strongly typed enums are often used to avoid name clashes such as the following:

    struct Color {
      enum class RainbowColors : unsigned int {
        Red, Orange, Yellow, Green, Blue, Indigo, Violet
      };
      
      enum class WarmColors {
        Yellow, Orange, Red
      };
    
      // Note normal enum
      enum PrimeColors {
        Red=100, Green, Blue
      };
    };
    

    There are various ways that the target languages handle enums, so it is not possible to precisely state how they are handled in this section. However, generally, most scripting languages mangle in the strongly typed enumeration's class name, but do not use any additional mangling for normal enumerations. For example, in Python, the following code

    print Color.RainbowColors_Red, Color.WarmColors_Red, Color.Red
    

    results in

    0 2 100
    

    The strongly typed languages often wrap normal enums into an enum class and so treat normal enums and strongly typed enums the same. The equivalent in Java is:

    System.out.println(Color.RainbowColors.Red.swigValue() + " " + Color.WarmColors.Red.swigValue() + " " + Color.PrimeColors.Red.swigValue());
    

    7.2.14 Double angle brackets

    SWIG correctly parses the symbols >> as closing the template block, if found inside it at the top level, or as the right shift operator >> otherwise.

    std::vector<std::vector<int>> myIntTable;
    

    7.2.15 Explicit conversion operators

    SWIG correctly parses the keyword explicit for operators in addition to constructors now. For example:

    class U {
    public:
      int u;
    };
    
    class V {
    public:
      int v;
    };
    
    class TestClass {
    public:
      //implicit converting constructor
      TestClass(U const &val) { t=val.u; }
    
      // explicit constructor
      explicit TestClass(V const &val) { t=val.v; }
    
      int t;
    };
    
    struct Testable {
      // explicit conversion operator
      explicit operator bool() const {
        return false;
      }
    };
    

    The effect of explicit constructors and operators has little relevance for the proxy classes as target languages don't have the same concepts of implicit conversions as C++. Conversion operators either with or without explicit need renaming to a valid identifier name in order to make them available as a normal proxy method.

    7.2.16 Type alias and alias templates

    A type alias is a statement of the form:

    using PFD = void (*)(double); // New introduced syntax
    

    which is equivalent to the old style typedef:

    typedef void (*PFD)(double);  // The old style
    

    The following is an example of an alias template:

    template< typename T1, typename T2, int N >
    class SomeType {
    public:
      T1 a;
      T2 b;
    };
    
    template< typename T2 >
    using TypedefName = SomeType<char*, T2, 5>;
    

    SWIG supports both type aliasing and alias templates. However, in order to use an alias template, two %template directives must be used:

    %template(SomeTypeBool) SomeType<char*, bool, 5>;
    %template() TypedefName<bool>;
    

    Firstly, the actual template is instantiated with a name to be used by the target language, as per any template being wrapped. Secondly, the empty template instantiation, %template(), is required for the alias template. This second requirement is necessary to add the appropriate instantiated template type into the type system as SWIG does not automatically instantiate templates. See the Templates section for more general information on wrapping templates.

    7.2.17 Unrestricted unions

    SWIG fully supports any type inside a union even if it does not define a trivial constructor. For example, the wrapper for the following code correctly provides access to all members in the union:

    struct point {
      point() {}
      point(int x, int y) : x_(x), y_(y) {}
      int x_, y_;
    };
    
    #include <new> // For placement 'new' in the constructor below
    union P {
      int z;
      double w;
      point p; // Illegal in C++03; legal in C++11.
      // Due to the point member, a constructor definition is required.
      P() {
        new(&p) point();
      }
    } p1;
    

    7.2.18 Variadic templates

    SWIG supports the variadic templates syntax (inside the <> block, variadic class inheritance and variadic constructor and initializers) with some limitations. The following code is correctly parsed:

    template <typename... BaseClasses> class ClassName : public BaseClasses... {
    public:
      ClassName (BaseClasses &&... baseClasses) : BaseClasses(baseClasses)... {}
    }
    

    For now however, the %template directive only accepts one parameter substitution for the variable template parameters.

    %template(MyVariant1) ClassName<>         // zero argument not supported yet
    %template(MyVariant2) ClassName<int>      // ok
    %template(MyVariant3) ClassName<int, int> // too many arguments not supported yet
    

    Support for the variadic sizeof() function is correctly parsed:

    const int SIZE = sizeof...(ClassName<int, int>);
    

    In the above example SIZE is of course wrapped as a constant.

    7.2.19 New character literals

    C++11 adds support for UCS-2 and UCS-4 character literals. These character literals are preceded by either 'u' or 'U'.

    char16_t a = u'a';
    char32_t b = U'b';
    

    Compatibility note: SWIG-4.0.0 was the first version to support these Universal Coded Character Set (UCS) character literals.

    7.2.20 New string literals

    SWIG supports wide string and Unicode string constants and raw string literals.

    // New string literals
    wstring         aa =  L"Wide string";
    const char     *bb = u8"UTF-8 string";
    const char16_t *cc =  u"UTF-16 string";
    const char32_t *dd =  U"UTF-32 string";
    
    // Raw string literals
    const char      *xx =        ")I'm an \"ascii\" \\ string.";
    const char      *ee =   R"XXX()I'm an "ascii" \ string.)XXX"; // same as xx
    wstring          ff =  LR"XXX(I'm a "raw wide" \ string.)XXX";
    const char      *gg = u8R"XXX(I'm a "raw UTF-8" \ string.)XXX";
    const char16_t  *hh =  uR"XXX(I'm a "raw UTF-16" \ string.)XXX";
    const char32_t  *ii =  UR"XXX(I'm a "raw UTF-32" \ string.)XXX";
    

    Non-ASCII string support varies quite a bit among the various target languages though.

    Note: There is a bug currently where SWIG's preprocessor incorrectly parses an odd number of double quotes inside raw string literals.

    7.2.21 User-defined literals

    SWIG parses the declaration of user-defined literals, that is, the operator "" _mysuffix() function syntax.

    Some examples are the raw literal:

    OutputType operator "" _myRawLiteral(const char * value);
    

    numeric cooked literals:

    OutputType operator "" _mySuffixIntegral(unsigned long long);
    OutputType operator "" _mySuffixFloat(long double);
    

    and cooked string literals:

    OutputType operator "" _mySuffix(const char * string_values, size_t num_chars);
    OutputType operator "" _mySuffix(const wchar_t * string_values, size_t num_chars);
    OutputType operator "" _mySuffix(const char16_t * string_values, size_t num_chars);
    OutputType operator "" _mySuffix(const char32_t * string_values, size_t num_chars);
    

    Like other operators that SWIG parses, a warning is given about renaming the operator in order for it to be wrapped:

    example.i:27: Warning 503: Can't wrap 'operator "" _myRawLiteral' unless renamed to a valid identifier.
    

    If %rename is used, then it can be called like any other wrapped method. Currently you need to specify the full declaration including parameters for %rename:

    %rename(MyRawLiteral)  operator"" _myRawLiteral(const char * value);
    

    Or if you just wish to ignore it altogether:

    %ignore operator "" _myRawLiteral(const char * value);
    

    Note that use of user-defined literals such as the following still give a syntax error:

    OutputType var1 = "1234"_suffix;
    OutputType var2 = 1234_suffix;
    OutputType var3 = 3.1416_suffix;
    

    7.2.22 Thread-local storage

    SWIG correctly parses the thread_local keyword. For example, variables reachable by the current thread can be defined as:

    struct A {
      static thread_local int val;
    };
    thread_local int global_val;
    

    The use of the thread_local storage specifier does not affect the wrapping process; it does not modify the wrapper code compared to when it is not specified. A variable will be thread local if accessed from different threads from the target language in the same way that it will be thread local if accessed from C++ code.

    7.2.23 Explicitly defaulted functions and deleted functions

    SWIG handles explicitly defaulted functions, that is, = default added to a function declaration. Deleted definitions, which are also called deleted functions, have = delete added to the function declaration. For example:

    struct NonCopyable {
      NonCopyable & operator=(const NonCopyable &) = delete; /* Removes operator= */
      NonCopyable(const NonCopyable &) = delete;             /* Removes copy constructor */
      NonCopyable() = default;                               /* Explicitly allows the empty constructor */
    };
    

    Wrappers for deleted functions will not be available in the target language. Wrappers for defaulted functions will of course be available in the target language. Explicitly defaulted functions have no direct effect for SWIG wrapping as the declaration is handled much like any other method declaration parsed by SWIG.

    Deleted functions are also designed to prevent implicit conversions when calling the function. For example, the C++ compiler will not compile any code which attempts to use an int as the type of the parameter passed to f below:

    struct NoInt {
      void f(double i);
      void f(int) = delete;
    };
    

    This is a C++ compile time check and SWIG does not make any attempt to detect if the target language is using an int instead of a double though, so in this case it is entirely possible to pass an int instead of a double to f from Java, Python etc.

    7.2.24 Type long long int

    SWIG correctly parses and uses the new long long type already introduced in C99 some time ago.

    7.2.25 Static assertions

    SWIG correctly parses the new static_assert declarations (though 3.0.12 and earlier had a bug which meant this wasn't accepted at file scope). This is a C++ compile time directive so there isn't anything useful that SWIG can do with it.

    template <typename T>
    struct Check {
      static_assert(sizeof(int) <= sizeof(T), "not big enough");
    };
    

    7.2.26 Allow sizeof to work on members of classes without an explicit object

    SWIG can parse the new sizeof() on types as well as on objects. For example:

    struct A {
      int member;
    };
    
    const int SIZE = sizeof(A::member); // does not work with C++03. Okay with C++11
    

    In Python:

    >>> SIZE
    8
    

    7.2.27 Exception specifications and noexcept

    C++11 added in the noexcept specification to exception specifications to indicate that a function simply may or may not throw an exception, without actually naming any exception. SWIG understands these, although there isn't any useful way that this information can be taken advantage of by target languages, so it is as good as ignored during the wrapping process. Below are some examples of noexcept in function declarations:

    static void noex1() noexcept;
    int noex2(int) noexcept(true);
    int noex3(int, bool) noexcept(false);
    

    7.2.28 Control and query object alignment

    An alignof operator is used mostly within C++ to return alignment in number of bytes, but could be used to initialize a variable as shown below. The variable's value will be available for access by the target language as any other variable's compile time initialised value.

    const int align1 = alignof(A::member);
    

    The alignas specifier for variable alignment is not yet supported. Example usage:

    struct alignas(16) S {
      int num;
    };
    alignas(double) unsigned char c[sizeof(double)];
    

    Use the preprocessor to work around this for now:

    #define alignas(T)
    

    7.2.29 Attributes

    Attributes such as those shown below, are not yet supported and will give a syntax error.

    int [[attr1]] i [[attr2, attr3]];
    
    [[noreturn, nothrow]] void f [[noreturn]] ();
    

    7.2.30 Methods with ref-qualifiers

    C++11 non-static member functions can be declared with ref-qualifiers. Member functions declared with a & lvalue ref-qualifiers are wrapped like any other function without ref-qualifiers. Member functions declared with a && rvalue ref-qualifiers are ignored by default as they are unlikely to be required from non-C++ languages where the concept of rvalue-ness for the implied *this pointer does not apply. The warning is hidden by default, but can be displayed as described in the section on Enabling extra warnings.

    Consider:

    struct RQ {
      void m1(int x) &;
      void m2(int x) &&;
    };
    

    The only wrapped method will be the lvalue ref-qualified method m1 and if SWIG is run with the -Wextra command-line option, the following warning will be issued indicating m2 is not wrapped:

    example.i:7: Warning 405: Method with rvalue ref-qualifier m2(int) && ignored.
    

    If you unignore the method as follows, wrappers for m2 will be generated:

    %feature("ignore", "0") RQ::m2(int x) &&;
    struct RQ {
      void m1(int x) &;
      void m2(int x) &&;
    };
    

    Inspection of the generated C++ code, will show that std::move is used on the instance of the RQ * class:

      RQ *arg1 = (RQ *) 0 ;
      int arg2 ;
    
      arg1 = ...marshalled from target language...
      arg2 = ...marshalled from target language...
    
      std::move(*arg1).m2(arg2);
    

    This will compile but when run, the move effects may not be what you want. As stated earlier, rvalue ref-qualifiers aren't really applicable outside the world of C++. However, if you really know what you are doing, full control over the call to the method is possible via the low-level "action" feature. This feature completely replaces the call to the underlying function, that is, the last line in the snippet of code above.

    %feature("ignore", "0") RQ::m2(int x) &&;
    %feature("action") RQ::m2(int x) && %{
      RQ().m2(arg2);
    %}
    struct RQ {
      void m1(int x) &;
      void m2(int x) &&;
    };
    

    resulting in:

      RQ *arg1 = (RQ *) 0 ;
      int arg2 ;
    
      arg1 = ...marshalled from target language...
      arg2 = ...marshalled from target language...
    
      RQ().m2(arg2);
    

    Compatibility note: SWIG-4.0.0 was the first version to support ref-qualifiers.

    7.3 Standard library changes

    7.3.1 Threading facilities

    SWIG does not currently wrap or use any of the new threading classes introduced (thread, mutex, locks, condition variables, task). The main reason is that SWIG target languages offer their own threading facilities so there is limited use for them.

    7.3.2 Tuple types

    SWIG does not provide library files for the new tuple types yet. Variadic template support requires further work to provide substantial tuple wrappers.

    7.3.3 Hash tables

    The new hash tables in the STL are unordered_set, unordered_multiset, unordered_map, unordered_multimap. These are not available in all target languages. Any missing support can in principle be easily implemented by adapting the current STL containers.

    7.3.4 Regular expressions

    While SWIG could provide wrappers for the new C++11 regular expressions classes, there is little need as the target languages have their own regular expression facilities.

    7.3.5 General-purpose smart pointers

    SWIG provides special smart pointer handling for std::shared_ptr in the same way it has support for boost::shared_ptr. Please see the shared_ptr smart pointer library section. There is no special smart pointer handling available for std::weak_ptr and std::unique_ptr yet.

    7.3.6 Extensible random number facility

    This feature extends and standardizes the standard library only and does not effect the C++ language nor SWIG.

    7.3.7 Wrapper reference

    Wrapper references are similar to normal C++ references but are copy-constructible and copy-assignable. They could conceivably be used in public APIs. There is no special support for std::reference_wrapper in SWIG though. Users would need to write their own typemaps if wrapper references are being used and these would be similar to the plain C++ reference typemaps.

    7.3.8 Polymorphic wrappers for function objects

    SWIG supports functor classes in a few languages in a very natural way. However nothing is provided yet for the new std::function template. SWIG will parse usage of the template like any other template.

    %rename(__call__) Test::operator(); // Default renaming used for Python
    
    struct Test {
      bool operator()(int x, int y); // function object
    };
    
    #include <functional>
    std::function<void (int, int)> pF = Test;   // function template wrapper
    
    

    Example of supported usage of the plain functor from Python is shown below. It does not involve std::function.

    t = Test()
    b = t(1, 2) # invoke C++ function object
    

    7.3.9 Type traits for metaprogramming

    The type_traits functions to support C++ metaprogramming is useful at compile time and is aimed specifically at C++ development:

    #include <type_traits>
    
    // First way of operating.
    template< bool B > struct algorithm {
      template< class T1, class T2 > static int do_it(T1 &, T2 &)  { /*...*/ return 1; }
    };
    
    // Second way of operating.
    template<> struct algorithm<true> {
      template< class T1, class T2 > static int do_it(T1, T2)  { /*...*/ return 2; }
    };
    
    // Instantiating 'elaborate' will automatically instantiate the correct way to operate, depending on the types used.
    template< class T1, class T2 > int elaborate(T1 A, T2 B) {
      // Use the second way only if 'T1' is an integer and if 'T2' is a floating point,
      // otherwise use the first way.
      return algorithm< std::is_integral<T1>::value && std::is_floating_point<T2>::value >::do_it(A, B);
    }
    

    SWIG correctly parses the template specialization, template types etc. However, metaprogramming and the additional support in the type_traits header is really for compile time and is not much use at runtime for the target languages. For example, as SWIG requires explicit instantiation of templates via %template, there isn't much that std::is_integral<int> is going to provide by itself. However, template functions using such metaprogramming techniques might be useful to wrap. For example, the following instantiations could be made:

    %template(Elaborate) elaborate<int, int>;
    %template(Elaborate) elaborate<int, double>;
    

    Then the appropriate algorithm can be called for the subset of types given by the above %template instantiations from a target language, such as Python:

    >>> Elaborate(0, 0)
    1
    >>> Elaborate(0, 0.0)
    2
    

    7.3.10 Uniform method for computing return type of function objects

    The new std::result_of class introduced in the <functional> header provides a generic way to obtain the return type of a function type via std::result_of::type. There isn't any library interface file to support this type. With a bit of work, SWIG will deduce the return type of functions when used in std::result_of using the approach shown below. The technique basically forward declares the std::result_of template class, then partially specializes it for the function types of interest. SWIG will use the partial specialization and hence correctly use the std::result_of::type provided in the partial specialization.

    %inline %{
    #include <functional>
    typedef double(*fn_ptr)(double);
    %}
    
    namespace std {
      // Forward declaration of result_of
      template<typename Func> struct result_of;
      // Add in a partial specialization of result_of
      template<> struct result_of< fn_ptr(double) > {
        typedef double type;
      };
    }
    
    %template() std::result_of< fn_ptr(double) >;
    
    %inline %{
    
    double square(double x) {
      return (x * x);
    }
    
    template<class Fun, class Arg>
    typename std::result_of<Fun(Arg)>::type test_result_impl(Fun fun, Arg arg) {
      return fun(arg);
    }
    %}
    
    %template(test_result) test_result_impl< fn_ptr, double >;
    %constant double (*SQUARE)(double) = square;
    

    Note the first use of %template which SWIG requires to instantiate the template. The empty template instantiation suffices as no proxy class is required for std::result_of<Fun(Arg)>::type as this type is really just a double. The second %template instantiates the template function which is being wrapped for use as a callback. The %constant can then be used for any callback function as described in Pointers to functions and callbacks.

    Example usage from Python should give the not too surprising result:

    >>> test_result(SQUARE, 5.0)
    25.0
    

    Phew, that is a lot of hard work to get a callback working. You could just go with the more attractive option of just using double as the return type in the function declaration instead of result_of!

    swig-4.0.1/Doc/Manual/Varargs.html0000644000175000017500000007514713527234052016601 0ustar williamwilliam Variable Length Arguments

    16 Variable Length Arguments

    (a.k.a, "The horror. The horror.")

    This chapter describes the problem of wrapping functions that take a variable number of arguments. For instance, generating wrappers for the C printf() family of functions.

    This topic is sufficiently advanced to merit its own chapter. In fact, support for varargs is an often requested feature that was first added in SWIG-1.3.12. Most other wrapper generation tools have wisely chosen to avoid this issue.

    16.1 Introduction

    Some C and C++ programs may include functions that accept a variable number of arguments. For example, most programmers are familiar with functions from the C library such as the following:

    int printf(const char *fmt, ...)
    int fprintf(FILE *, const char *fmt, ...);
    int sprintf(char *s, const char *fmt, ...);
    

    Although there is probably little practical purpose in wrapping these specific C library functions in a scripting language (what would be the point?), a library may include its own set of special functions based on a similar API. For example:

    int  traceprintf(const char *fmt, ...);
    

    In this case, you may want to have some kind of access from the target language.

    Before describing the SWIG implementation, it is important to discuss the common uses of varargs that you are likely to encounter in real programs. Obviously, there are the printf() style output functions as shown. Closely related to this would be scanf() style input functions that accept a format string and a list of pointers into which return values are placed. However, variable length arguments are also sometimes used to write functions that accept a NULL-terminated list of pointers. A good example of this would be a function like this:

    int execlp(const char *path, const char *arg1, ...);
    ...
    
    /* Example */
    execlp("ls", "ls", "-l", NULL);
    

    In addition, varargs is sometimes used to fake default arguments in older C libraries. For instance, the low level open() system call is often declared as a varargs function so that it will accept two or three arguments:

    int open(const char *path, int oflag, ...);
    ...
    
    /* Examples */
    f = open("foo", O_RDONLY);
    g = open("bar", O_WRONLY | O_CREAT, 0644);
    

    Finally, to implement a varargs function, recall that you have to use the C library functions defined in <stdarg.h>. For example:

    List make_list(const char *s, ...) {
      va_list ap;
      List    x;
      ...
      va_start(ap, s);
      while (s) {
        x.append(s);
        s = va_arg(ap, const char *);
      }
      va_end(ap);
      return x;
    }
    

    16.2 The Problem

    Generating wrappers for a variable length argument function presents a number of special challenges. Although C provides support for implementing functions that receive variable length arguments, there are no functions that can go in the other direction. Specifically, you can't write a function that dynamically creates a list of arguments and which invokes a varargs function on your behalf.

    Although it is possible to write functions that accept the special type va_list, this is something entirely different. You can't take a va_list structure and pass it in place of the variable length arguments to another varargs function. It just doesn't work.

    The reason this doesn't work has to do with the way that function calls get compiled. For example, suppose that your program has a function call like this:

    printf("Hello %s. Your number is %d\n", name, num);
    

    When the compiler looks at this, it knows that you are calling printf() with exactly three arguments. Furthermore, it knows that the number of arguments as well are their types and sizes is never going to change during program execution. Therefore, this gets turned to machine code that sets up a three-argument stack frame followed by a call to printf().

    In contrast, suppose you attempted to make some kind of wrapper around printf() using code like this:

    int wrap_printf(const char *fmt, ...) {
      va_list ap;
      va_start(ap, fmt);
      ...
      printf(fmt, ap);
      ...
      va_end(ap);
    };
    

    Although this code might compile, it won't do what you expect. This is because the call to printf() is compiled as a procedure call involving only two arguments. However, clearly a two-argument configuration of the call stack is completely wrong if your intent is to pass an arbitrary number of arguments to the real printf(). Needless to say, it won't work.

    Unfortunately, the situation just described is exactly the problem faced by wrapper generation tools. In general, the number of passed arguments will not be known until run-time. To make matters even worse, you won't know the types and sizes of arguments until run-time as well. Needless to say, there is no obvious way to make the C compiler generate code for a function call involving an unknown number of arguments of unknown types.

    In theory, it is possible to write a wrapper that does the right thing. However, this involves knowing the underlying ABI for the target platform and language as well as writing special purpose code that manually constructed the call stack before making a procedure call. Unfortunately, both of these tasks require the use of inline assembly code. Clearly, that's the kind of solution you would much rather avoid.

    With this nastiness in mind, SWIG provides a number of solutions to the varargs wrapping problem. Most of these solutions are compromises that provide limited varargs support without having to resort to assembly language. However, SWIG can also support real varargs wrapping (with stack-frame manipulation) if you are willing to get hands dirty. Keep reading.

    16.3 Default varargs support

    When variable length arguments appear in an interface, the default behavior is to drop the variable argument list entirely, replacing them with a single NULL pointer. For example, if you had this function,

    void traceprintf(const char *fmt, ...);
    

    it would be wrapped as if it had been declared as follows:

    void traceprintf(const char *fmt);
    

    When the function is called inside the wrappers, it is called as follows:

    traceprintf(arg1, NULL);
    

    Arguably, this approach seems to defeat the whole point of variable length arguments. However, this actually provides enough support for many simple kinds of varargs functions to still be useful, however it does come with a caveat. For instance, you could make function calls like this (in Python):

    >>> traceprintf("Hello World")
    >>> traceprintf("Hello %s. Your number is %d\n" % (name, num))
    >>> traceprintf("Your result is 90%%.")
    

    Notice how string formatting is being done in Python instead of C. The caveat is the strings passed must be safe to use in C though. For example if name was to contain a "%" it should be double escaped in order to avoid unpredictable behaviour:

    >>> traceprintf("Your result is 90%.\n")  # unpredictable behaviour
    >>> traceprintf("Your result is 90%%.\n") # good
    

    Read on for further solutions.

    16.4 Argument replacement using %varargs

    Instead of dropping the variable length arguments, an alternative approach is to replace (...) with a set of suitable arguments. SWIG provides a special %varargs directive that can be used to do this. For example,

    %varargs(int mode = 0) open;
    ...
    int open(const char *path, int oflags, ...);
    

    is equivalent to this:

    int open(const char *path, int oflags, int mode = 0);
    

    In this case, %varargs is simply providing more specific information about the extra arguments that might be passed to a function. If the arguments to a varargs function are of uniform type, %varargs can also accept a numerical argument count as follows:

    %varargs(3, char *str = NULL) execlp;
    ...
    int execlp(const char *path, const char *arg, ...);
    

    and is effectively seen as:

    int execlp(const char *path, const char *arg, 
               char *str1 = NULL, 
               char *str2 = NULL, 
               char *str3 = NULL);
    

    This would wrap execlp() as a function that accepted up to 3 optional arguments. Depending on the application, this may be more than enough for practical purposes.

    The handling of default arguments can be changed via the compactdefaultargs feature. If this feature is used, for example

    %feature("compactdefaultargs") execlp;
    %varargs(3, char *str = NULL) execlp;
    ...
    int execlp(const char *path, const char *arg, ...);
    

    a call from the target language which does not provide the maximum number of arguments, such as, execlp("a", "b", "c") will generate C code which includes the missing default values, that is, execlp("a", "b", "c", NULL, NULL). If compactdefaultargs is not used, then the generated code will be execlp("a", "b", "c"). The former is useful for helping providing a sentinel to terminate the argument list. However, this is not guaranteed, for example when a user passes a non-NULL value for all the parameters. When using compactdefaultargs it is possible to guarantee the NULL sentinel is passed through the, numinputs=0 'in' typemap attribute, naming the last parameter. For example,

    %feature("compactdefaultargs") execlp;
    %varargs(3, char *str = NULL) execlp;
    %typemap(in, numinputs=0) char *str3 ""
    ...
    int execlp(const char *path, const char *arg, ...);
    

    Note that str3 is the name of the last argument, as we have used %varargs with 3. Now execlp("a", "b", "c", "d", "e") will result in an error as one too many arguments has been passed, as now only 2 additional 'str' arguments can be passed with the 3rd one always using the specified default NULL.

    Argument replacement is most appropriate in cases where the types of the extra arguments are uniform and the maximum number of arguments are known. Argument replacement is not as useful when working with functions that accept mixed argument types such as printf(). Providing general purpose wrappers to such functions presents special problems (covered shortly).

    16.5 Varargs and typemaps

    Variable length arguments may be used in typemap specifications. For example:

    %typemap(in) (...) {
      // Get variable length arguments (somehow)
      ...
    }
    
    %typemap(in) (const char *fmt, ...) {
        // Multi-argument typemap
    }
    

    However, this immediately raises the question of what "type" is actually used to represent (...). For lack of a better alternative, the type of (...) is set to void *. Since there is no way to dynamically pass arguments to a varargs function (as previously described), the void * argument value is intended to serve as a place holder for storing some kind of information about the extra arguments (if any). In addition, the default behavior of SWIG is to pass the void * value as an argument to the function. Therefore, you could use the pointer to hold a valid argument value if you wanted.

    To illustrate, here is a safer version of wrapping printf() in Python:

    %typemap(in) (const char *fmt, ...) {
        $1 = "%s";                                /* Fix format string to %s */
        $2 = (void *) PyString_AsString($input);  /* Get string argument */
    };
    ...
    int printf(const char *fmt, ...);
    

    In this example, the format string is implicitly set to "%s". This prevents a program from passing a bogus format string to the extension. Then, the passed input object is decoded and placed in the void * argument defined for the (...) argument. When the actual function call is made, the underlying wrapper code will look roughly like this:

    wrap_printf() {
      char *arg1;
      void *arg2;
      int   result;
    
      arg1 = "%s";
      arg2 = (void *) PyString_AsString(arg2obj);
      ...
      result = printf(arg1, arg2);
      ...
    }
    

    Notice how both arguments are passed to the function and it does what you would expect.

    The next example illustrates a more advanced kind of varargs typemap. Disclaimer: this requires special support in the target language module and is not guaranteed to work with all SWIG modules at this time. It also starts to illustrate some of the more fundamental problems with supporting varargs in more generality.

    If a typemap is defined for any form of (...), many SWIG modules will generate wrappers that accept a variable number of arguments as input and will make these arguments available in some form. The precise details of this depends on the language module being used (consult the appropriate chapter for more details). However, suppose that you wanted to create a Python wrapper for the execlp() function shown earlier. To do this using a typemap instead of using %varargs, you might first write a typemap like this:

    %typemap(in) (...)(char *vargs[10]) {
      int i;
      int argc;
      for (i = 0; i < 10; i++) vargs[i] = 0;
      argc = PyTuple_Size(varargs);
      if (argc > 10) {
        PyErr_SetString(PyExc_ValueError, "Too many arguments");
        SWIG_fail;
      }
      for (i = 0; i < argc; i++) {
        PyObject *pyobj = PyTuple_GetItem(varargs, i);
        char *str = 0;
    %#if PY_VERSION_HEX>=0x03000000
        PyObject *pystr;
        if (!PyUnicode_Check(pyobj)) {
          PyErr_SetString(PyExc_ValueError, "Expected a string");
          SWIG_fail;
        }
        pystr = PyUnicode_AsUTF8String(pyobj);
        if (!pystr) {
          SWIG_fail;
        }
        str = strdup(PyBytes_AsString(pystr));
        Py_DECREF(pystr);
    %#else  
        if (!PyString_Check(pyobj)) {
          PyErr_SetString(PyExc_ValueError, "Expected a string");
          SWIG_fail;
        }
        str = PyString_AsString(pyobj);
    %#endif
        vargs[i] = str;
      }
      $1 = (void *)vargs;
    }
    
    %typemap(freearg) (...) {
    %#if PY_VERSION_HEX>=0x03000000
      int i;
      for (i = 0; i < 10; i++) {
        free(vargs$argnum[i]);
      }
    %#endif
    }
    

    In the 'in' typemap, the special variable varargs is a tuple holding all of the extra arguments passed (this is specific to the Python module). The typemap then pulls this apart and sticks the values into the array of strings args. Then, the array is assigned to $1 (recall that this is the void * variable corresponding to (...)). However, this assignment is only half of the picture----clearly this alone is not enough to make the function work. The 'freearg' typemap cleans up memory allocated in the 'in' typemap; this code is generated to be called after the execlp function is called. To patch everything up, you have to rewrite the underlying action code using the %feature directive like this:

    %feature("action") execlp {
      char **vargs = (char **) arg3;
      result = execlp(arg1, arg2, vargs[0], vargs[1], vargs[2], vargs[3], vargs[4],
                      vargs[5], vargs[6], vargs[7], vargs[8], vargs[9], NULL);
    }
    
    int execlp(const char *path, const char *arg, ...);
    

    This patches everything up and creates a function that more or less works. However, don't try explaining this to your coworkers unless you know for certain that they've had several cups of coffee. If you really want to elevate your guru status and increase your job security, continue to the next section.

    16.6 Varargs wrapping with libffi

    All of the previous examples have relied on features of SWIG that are portable and which don't rely upon any low-level machine-level details. In many ways, they have all dodged the real issue of variable length arguments by recasting a varargs function into some weaker variation with a fixed number of arguments of known types. In many cases, this works perfectly fine. However, if you want more generality than this, you need to bring out some bigger guns.

    One way to do this is to use a special purpose library such as libffi (http://www.sourceware.org/libffi/). libffi is a library that allows you to dynamically construct call-stacks and invoke procedures in a relatively platform independent manner. Details about the library can be found in the libffi distribution and are not repeated here.

    To illustrate the use of libffi, suppose that you really wanted to create a wrapper for execlp() that accepted any number of arguments. To do this, you might make a few adjustments to the previous example. For example:

    /* Take an arbitrary number of extra arguments and place into an array
       of strings */
    
    %typemap(in) (...) {
      char **argv;
      int    argc;
      int    i;
    
      argc = PyTuple_Size(varargs);
      argv = (char **) malloc(sizeof(char *)*(argc+1));
      for (i = 0; i < argc; i++) {
        PyObject *o = PyTuple_GetItem(varargs, i);
        if (!PyString_Check(o)) {
          free(argv);
          PyErr_SetString(PyExc_ValueError, "Expected a string");
          SWIG_fail;
        }
        argv[i] = PyString_AsString(o);
      }
      argv[i] = NULL;
      $1 = (void *) argv;
    }
    
    /* Rewrite the function call, using libffi */    
    
    %feature("action") execlp {
      int       i, vc;
      ffi_cif   cif;
      ffi_type  **types;
      void      **values;
      char      **args;
    
      vc = PyTuple_Size(varargs);
      types  = (ffi_type **) malloc((vc+3)*sizeof(ffi_type *));
      values = (void **) malloc((vc+3)*sizeof(void *));
      args   = (char **) arg3;
    
      /* Set up path parameter */
      types[0] = &ffi_type_pointer;
      values[0] = &arg1;
      
      /* Set up first argument */
      types[1] = &ffi_type_pointer;
      values[1] = &arg2;
    
      /* Set up rest of parameters */
      for (i = 0; i <= vc; i++) {
        types[2+i] = &ffi_type_pointer;
        values[2+i] = &args[i];
      }
      if (ffi_prep_cif(&cif, FFI_DEFAULT_ABI, vc+3,
                       &ffi_type_uint, types) == FFI_OK) {
        ffi_call(&cif, (void (*)()) execlp, &result, values);
      } else {
        free(types);
        free(values);
        free(arg3);
        PyErr_SetString(PyExc_RuntimeError, "Whoa!!!!!");
        SWIG_fail;
      }
      free(types);
      free(values);
      free(arg3);
    }
    
    /* Declare the function. Whew! */
    int execlp(const char *path, const char *arg1, ...);
    

    Looking at this example, you may start to wonder if SWIG is making life any easier. Given the amount of code involved, you might also wonder why you didn't just write a hand-crafted wrapper! Either that or you're wondering "why in the hell am I trying to wrap this varargs function in the first place?!?" Obviously, those are questions you'll have to answer for yourself.

    As a more extreme example of libffi, here is some code that attempts to wrap printf(),

    /* A wrapper for printf() using libffi */
    
    %{
    /* Structure for holding passed arguments after conversion */
      typedef struct {
        int type;
        union {
          int    ivalue;
          double dvalue;
          void   *pvalue;
        } val;
      } vtype;
      enum { VT_INT, VT_DOUBLE, VT_POINTER };
    %}
    
    %typemap(in) (const char *fmt, ...) {
      vtype *argv;
      int    argc;
      int    i;
    
      /* Format string */
      $1 = PyString_AsString($input);
    
      /* Variable length arguments */
      argc = PyTuple_Size(varargs);
      argv = (vtype *) malloc(argc*sizeof(vtype));
      for (i = 0; i < argc; i++) {
        PyObject *o = PyTuple_GetItem(varargs, i);
        if (PyInt_Check(o)) {
          argv[i].type = VT_INT;
          argv[i].val.ivalue = PyInt_AsLong(o);
        } else if (PyFloat_Check(o)) {
          argv[i].type = VT_DOUBLE;
          argv[i].val.dvalue = PyFloat_AsDouble(o);
        } else if (PyString_Check(o)) {
          argv[i].type = VT_POINTER;
          argv[i].val.pvalue = (void *) PyString_AsString(o);
        } else {
          free(argv);
          PyErr_SetString(PyExc_ValueError, "Unsupported argument type");
          return NULL;
        }
      }
      $2 = (void *) argv;
    }
    
    /* Rewrite the function call using libffi */    
    %feature("action") printf {
      int       i, vc;
      ffi_cif   cif;
      ffi_type  **types;
      void      **values;
      vtype     *args;
    
      vc = PyTuple_Size(varargs);
      types  = (ffi_type **) malloc((vc+1)*sizeof(ffi_type *));
      values = (void **) malloc((vc+1)*sizeof(void *));
      args   = (vtype *) arg2;
    
      /* Set up fmt parameter */
      types[0] = &ffi_type_pointer;
      values[0] = &arg1;
    
      /* Set up rest of parameters */
      for (i = 0; i < vc; i++) {
        switch(args[i].type) {
        case VT_INT:
          types[1+i] = &ffi_type_uint;
          values[1+i] = &args[i].val.ivalue;
          break;
        case VT_DOUBLE:
          types[1+i] = &ffi_type_double;
          values[1+i] = &args[i].val.dvalue;
          break;
        case VT_POINTER:
          types[1+i] = &ffi_type_pointer;
          values[1+i] = &args[i].val.pvalue;
          break;
        default:
          abort();    /* Whoa! We're seriously hosed */
          break;   
        }
      }
      if (ffi_prep_cif(&cif, FFI_DEFAULT_ABI, vc+1,
                       &ffi_type_uint, types) == FFI_OK) {
        ffi_call(&cif, (void (*)()) printf, &result, values);
      } else {
        free(types);
        free(values);
        free(args);
        PyErr_SetString(PyExc_RuntimeError, "Whoa!!!!!");
        SWIG_fail;
      }
      free(types);
      free(values);
      free(args);
    }
    
    /* The function */
    int printf(const char *fmt, ...);
    

    Much to your amazement, it even seems to work if you try it:

    >>> import example
    >>> example.printf("Grade: %s   %d/60 = %0.2f%%\n", "Dave", 47, 47.0*100/60)
    Grade: Dave   47/60 = 78.33%
    >>>
    

    Of course, there are still some limitations to consider:

    >>> example.printf("la de da de da %s", 42)
    Segmentation fault (core dumped)
    

    And, on this note, we leave further exploration of libffi to the reader as an exercise. Although Python has been used as an example, most of the techniques in this section can be extrapolated to other language modules with a bit of work. The only details you need to know is how the extra arguments are accessed in each target language. For example, in the Python module, we used the special varargs variable to get these arguments. Modules such as Tcl8 and Perl5 simply provide an argument number for the first extra argument. This can be used to index into an array of passed arguments to get values. Please consult the chapter on each language module for more details.

    16.7 Wrapping of va_list

    Closely related to variable length argument wrapping, you may encounter functions that accept a parameter of type va_list. For example:

    int vprintf(const char *fmt, va_list ap);
    

    As far as we know, there is no obvious way to wrap these functions with SWIG. This is because there is no documented way to assemble the proper va_list structure (there are no C library functions to do it and the contents of va_list are opaque). Not only that, the contents of a va_list structure are closely tied to the underlying call-stack. It's not clear that exporting a va_list would have any use or that it would work at all.

    A workaround can be implemented by writing a simple varargs C wrapper and then using the techniques discussed earlier in this chapter for varargs. Below is a simple wrapper for vprintf renamed so that it can still be called as vprintf from your target language. The %varargs used in the example restricts the function to taking one string argument.

    %{
    int vprintf(const char *fmt, va_list ap);
    %}
    
    %varargs(const char *) my_vprintf;
    %rename(vprintf) my_vprintf;
    
    %inline %{
    int my_vprintf(const char *fmt, ...) {
      va_list ap;
      int result;
    
      va_start(ap, fmt);
      result = vprintf(fmt, ap);
      va_end(ap);
      return result;
    }
    %}
    

    16.8 C++ Issues

    Wrapping of C++ member functions that accept a variable number of arguments presents a number of challenges. By far, the easiest way to handle this is to use the %varargs directive. This is portable and it fully supports classes much like the %rename directive. For example:

    %varargs (10, char * = NULL) Foo::bar;
    
    class Foo {
    public:
      virtual void bar(char *arg, ...);   // gets varargs above
    };
    
    class Spam: public Foo {
    public:
      virtual void bar(char *arg, ...);   // gets varargs above
    };
    

    %varargs also works with constructors, operators, and any other C++ programming construct that accepts variable arguments.

    Doing anything more advanced than this is likely to involve a serious world of pain. In order to use a library like libffi, you will need to know the underlying calling conventions and details of the C++ ABI. For instance, the details of how this is passed to member functions as well as any hidden arguments that might be used to pass additional information. These details are implementation specific and may differ between compilers and even different versions of the same compiler. Also, be aware that invoking a member function is further complicated if it is a virtual method. In this case, invocation might require a table lookup to obtain the proper function address (although you might be able to obtain an address by casting a bound pointer to a pointer to function as described in the C++ ARM section 18.3.4).

    If you do decide to change the underlying action code, be aware that SWIG always places the this pointer in arg1. Other arguments are placed in arg2, arg3, and so forth. For example:

    %feature("action") Foo::bar {
      ...
      result = arg1->bar(arg2, arg3, etc.);
      ...
    }
    

    Given the potential to shoot yourself in the foot, it is probably easier to reconsider your design or to provide an alternative interface using a helper function than it is to create a fully general wrapper to a varargs C++ member function.

    16.9 Discussion

    This chapter has provided a number of techniques that can be used to address the problem of variable length argument wrapping. If you care about portability and ease of use, the %varargs directive is probably the easiest way to tackle the problem. However, using typemaps, it is possible to do some very advanced kinds of wrapping.

    One point of discussion concerns the structure of the libffi examples in the previous section. Looking at that code, it is not at all clear that this is the easiest way to solve the problem. However, there are a number of subtle aspects of the solution to consider--mostly concerning the way in which the problem has been decomposed. First, the example is structured in a way that tries to maintain separation between wrapper-specific information and the declaration of the function itself. The idea here is that you might structure your interface like this:

    %typemap(const char *fmt, ...) {
      ...
    }
    %feature("action") traceprintf {
      ...
    }
    
    /* Include some header file with traceprintf in it */
    %include "someheader.h"
    

    Second, careful scrutiny will reveal that the typemaps involving (...) have nothing whatsoever to do with the libffi library. In fact, they are generic with respect to the way in which the function is actually called. This decoupling means that it will be much easier to consider other library alternatives for making the function call. For instance, if libffi wasn't supported on a certain platform, you might be able to use something else instead. You could use conditional compilation to control this:

    #ifdef USE_LIBFFI
    %feature("action") printf {
      ...
    }
    #endif
    #ifdef USE_OTHERFFI
    %feature("action") printf {
    ...
    }
    #endif
    

    Finally, even though you might be inclined to just write a hand-written wrapper for varargs functions, the techniques used in the previous section have the advantage of being compatible with all other features of SWIG such as exception handling.

    As a final word, some C programmers seem to have the assumption that the wrapping of variable length argument functions is an easily solved problem. However, this section has hopefully dispelled some of these myths. All things being equal, you are better off avoiding variable length arguments if you can. If you can't avoid them, please consider some of the simple solutions first. If you can't live with a simple solution, proceed with caution. At the very least, make sure you carefully read the section "A7.3.2 Function Calls" in Kernighan and Ritchie and make sure you fully understand the parameter passing conventions used for varargs. Also, be aware of the platform dependencies and reliability issues that this will introduce. Good luck.

    swig-4.0.1/Doc/Manual/Windows.html0000644000175000017500000003700613527234052016616 0ustar williamwilliam Getting started on Windows

    3 Getting started on Windows

    This chapter describes SWIG usage on Microsoft Windows. Installing SWIG and running the examples is covered as well as building the SWIG executable. Usage within the Unix like environments MinGW and Cygwin is also detailed.

    3.1 Installation on Windows

    SWIG does not come with the usual Windows type installation program, however it is quite easy to get started. The main steps are:

    • Download the swigwin zip package from the SWIG website and unzip into a directory. This is all that needs downloading for the Windows platform.
    • Set environment variables as described in the SWIG Windows Examples section in order to run examples using Visual C++.

    3.1.1 Windows Executable

    The swigwin distribution contains the SWIG Windows 32-bit executable, swig.exe, which will run on both 32-bit and 64-bit versions of Windows. If you want to build your own swig.exe have a look at Building swig.exe on Windows.

    3.2 SWIG Windows Examples

    Using Microsoft Visual C++ is the most common approach to compiling and linking SWIG's output. The Examples directory has a few Visual C++ project files (.dsp files). These were produced by Visual C++ 6. Newer versions of Visual Studio should be able to open and convert these project files. Each C# example comes with a Visual Studio 2005 solution and associated project files instead of Visual C++ 6 project files. The project files have been set up to execute SWIG in a custom build rule for the SWIG interface (.i) file. Alternatively run the examples using Cygwin.

    More information on each of the examples is available with the examples distributed with SWIG (Examples/index.html).

    3.2.1 Instructions for using the Examples with Visual Studio

    Ensure the SWIG executable is as supplied in the SWIG root directory in order for the examples to work. Most languages require some environment variables to be set before running Visual C++. Note that Visual C++ must be re-started to pick up any changes in environment variables. Open up an example .dsp file, Visual C++ will create a workspace for you (.dsw file). Ensure the Release build is selected then do a Rebuild All from the Build menu. The required environment variables are displayed with their current values.

    The list of required environment variables for each module language is also listed below. They are usually set from the Control Panel and System properties, but this depends on which flavour of Windows you are running. If you don't want to use environment variables then change all occurrences of the environment variables in the .dsp files with hard coded values. If you are interested in how the project files are set up there is explanatory information in some of the language module's documentation.

    3.2.1.1 C#

    The C# examples do not require any environment variables to be set as a C# project file is included. Just open up the .sln solution file in Visual Studio .NET 2003 or later, select Release Build, and do a Rebuild All from the Build menu. The accompanying C# and C++ project files are automatically used by the solution file.

    3.2.1.2 Java

    JAVA_INCLUDE : Set this to the directory containing jni.h
    JAVA_BIN : Set this to the bin directory containing javac.exe

    Example using JDK1.3:
    JAVA_INCLUDE: D:\jdk1.3\include
    JAVA_BIN: D:\jdk1.3\bin

    3.2.1.3 Perl

    PERL5_INCLUDE : Set this to the directory containing perl.h
    PERL5_LIB : Set this to the Perl library including path for linking

    Example using nsPerl 5.004_04:

    PERL5_INCLUDE: D:\nsPerl5.004_04\lib\CORE
    PERL5_LIB: D:\nsPerl5.004_04\lib\CORE\perl.lib

    3.2.1.4 Python

    PYTHON_INCLUDE : Set this to the directory that contains Python.h
    PYTHON_LIB : Set this to the Python library including path for linking

    Example using Python 2.1.1:
    PYTHON_INCLUDE: D:\python21\include
    PYTHON_LIB: D:\python21\libs\python21.lib

    3.2.1.5 TCL

    TCL_INCLUDE : Set this to the directory containing tcl.h
    TCL_LIB : Set this to the TCL library including path for linking

    Example using ActiveTcl 8.3.3.3
    TCL_INCLUDE: D:\tcl\include
    TCL_LIB: D:\tcl\lib\tcl83.lib

    3.2.1.6 R

    R_INCLUDE : Set this to the directory containing R.h
    R_LIB : Set this to the R library (Rdll.lib) including path for linking. The library needs to be built as described in the R README.packages file (the pexports.exe approach is the easiest).

    Example using R 2.5.1:
    R_INCLUDE: C:\Program Files\R\R-2.5.1\include
    R_LIB: C:\Program Files\R\R-2.5.1\bin\Rdll.lib

    3.2.1.7 Ruby

    RUBY_INCLUDE : Set this to the directory containing ruby.h
    RUBY_LIB : Set this to the ruby library including path for linking

    Example using Ruby 1.6.4:
    RUBY_INCLUDE: D:\ruby\lib\ruby\1.6\i586-mswin32
    RUBY_LIB: D:\ruby\lib\mswin32-ruby16.lib

    3.2.2 Instructions for using the Examples with other compilers

    If you do not have access to Visual C++ you will have to set up project files / Makefiles for your chosen compiler. There is a section in each of the language modules detailing what needs setting up using Visual C++ which may be of some guidance. Alternatively you may want to use Cygwin as described in the following section.

    3.3 SWIG on Cygwin and MinGW

    SWIG can also be compiled and run using Cygwin or MinGW which provides a Unix like front end to Windows and comes free with gcc, an ISO C/C++ compiler. However, this is not a recommended approach as the prebuilt executable is supplied.

    3.3.1 Building swig.exe on Windows

    If you want to replicate the build of swig.exe that comes with the download, follow the MinGW instructions below. This is not necessary to use the supplied swig.exe. This information is provided for those that want to modify the SWIG source code in a Windows environment. Normally this is not needed, so most people will want to ignore this section.

    3.3.1.1 Building swig.exe using MinGW and MSYS

    The short abbreviated instructions follow...

    • Install MinGW and MSYS from the MinGW site. This provides a Unix environment on Windows.
    • Follow the usual Unix instructions in the README file in the SWIG root directory to build swig.exe from the MinGW command prompt.

    The step by step instructions to download and install MinGW and MSYS, then download and build the latest version of SWIG from Github follow... Note that the instructions for obtaining SWIG from Github are also online at SWIG Bleeding Edge.

    Pitfall note: Execute the steps in the order shown and don't use spaces in path names. In fact it is best to use the default installation directories.

    1. Download the following packages from the MinGW download page or MinGW SourceForge download page. Note that at the time of writing, the majority of these are in the Current release list and some are in the Snapshot or Previous release list.
      • MinGW-3.1.0-1.exe
      • MSYS-1.0.11-2004.04.30-1.exe
      • msysDTK-1.0.1.exe
      • bison-2.0-MSYS.tar.gz
      • msys-autoconf-2.59.tar.bz2
      • msys-automake-1.8.2.tar.bz2
    2. Install MinGW-3.1.0-1.exe (C:\MinGW is default location.)
    3. Install MSYS-1.0.11-2004.04.30-1.exe. Make sure you install it on the same windows drive letter as MinGW (C:\msys\1.0 is default). In the post install script,
      • Answer y to the "do you wish to continue with the post install?"
      • Answer y to the "do you have MinGW installed?"
      • Type in the folder in which you installed MinGW (C:/MinGW is default)
    4. Install msysDTK-1.0.1.exe to the same folder that you installed MSYS (C:\msys\1.0 is default).
    5. Copy the following to the MSYS install folder (C:\msys\1.0 is default):
      • msys-automake-1.8.2.tar.bz2
      • msys-autoconf-2.59.tar.bz2
      • bison-2.0-MSYS.tar.gz
    6. Start the MSYS command prompt and execute:
      cd /
      tar -jxf msys-automake-1.8.2.tar.bz2
      tar -jxf msys-autoconf-2.59.tar.bz2
      tar -zxf bison-2.0-MSYS.tar.gz
      
    7. The very latest development version of SWIG is available from SWIG on Github and can be downloaded as a zip file or if you have Git installed, via Git. Either download the latest Zip file snapshot and unzip and rename the top level folder to /usr/src/swig. Otherwise if using Git, type in the following:
      mkdir /usr/src
      cd /usr/src
      git clone https://github.com/swig/swig.git
      
      Pitfall note: If you want to place SWIG in a different folder to the proposed /usr/src/swig, do not use MSYS emulated windows drive letters, because the autotools will fail miserably on those.
    8. The PCRE third party library needs to be built next. Download the latest PCRE source tarball, such as pcre-8.10.tar.bz2, from PCRE and place in the /usr/src/swig directory. Build PCRE as a static library using the Tools/pcre-build.sh script as follows:
      cd /usr/src/swig
      Tools/pcre-build.sh
      
    9. You are now ready to build SWIG. Execute the following commands to build swig.exe:
      cd /usr/src/swig
      ./autogen.sh
      ./configure
      make
      

    3.3.1.2 Building swig.exe using Cygwin

    Note that SWIG can also be built using Cygwin. However, SWIG will then require the Cygwin DLL when executing. Follow the Unix instructions in the README file in the SWIG root directory. Note that the Cygwin environment will also allow one to regenerate the autotool generated files which are supplied with the release distribution. These files are generated using the autogen.sh script and will only need regenerating in circumstances such as changing the build system.

    3.3.1.3 Building swig.exe alternatives

    If you don't want to install Cygwin or MinGW, use a different compiler to build SWIG. For example, all the source code files can be added to a Visual C++ project file in order to build swig.exe from the Visual C++ IDE.

    3.3.2 Running the examples on Windows using Cygwin

    The examples and test-suite work as successfully on Cygwin as on any other Unix operating system. The modules which are known to work are Python, Tcl, Perl, Ruby, Java and C#. Follow the Unix instructions in the README file in the SWIG root directory to build the examples.

    3.4 Microsoft extensions and other Windows quirks

    A common problem when using SWIG on Windows are the Microsoft function calling conventions which are not in the C++ standard. SWIG parses ISO C/C++ so cannot deal with proprietary conventions such as __declspec(dllimport), __stdcall etc. There is a Windows interface file, windows.i, to deal with these calling conventions though. The file also contains typemaps for handling commonly used Windows specific types such as __int64, BOOL, DWORD etc. Include it like you would any other interface file, for example:

    %include <windows.i>
    
    __declspec(dllexport) ULONG __stdcall foo(DWORD, __int32);
    

    Note that if you follow Microsoft's recommendation of wrapping the __declspec calls in a preprocessor definition, you will need to make sure that the definition is included by SWIG as well, by either defining it manually or via a header. For example, if you have specified the preprocessor definition in a header named export_lib.h and include other headers which depend on it, you should use the %include directive to include the definition explicitly. For example, if you had a header file, bar.h, which depended on export_lib.h, your SWIG definition file might look like:

    // bar.i
    %module bar
    %include <windows.i>
    %include "export_lib.h"
    %include "bar.h"
    

    where export_lib.h may contain:

    // export_lib.h
    #define BAR_API __declspec(dllexport)
    

    and bar.h may look like:

    // bar.h
    #include "export_lib.h"
    BAR_API void bar_function(int, double);
    

    Using the preprocessor to remove BAR_API is a popular simpler solution:

    // bar.i
    %module bar
    #define BAR_API
    %include "bar.h"
    
    swig-4.0.1/Doc/Manual/CPlusPlus14.html0000644000175000017500000000275313527234052017224 0ustar williamwilliam SWIG and C++14

    8 SWIG and C++14

    8.1 Introduction

    This chapter gives you a brief overview about the SWIG implementation of the C++14 standard. There isn't much in C++14 that affects SWIG, however, work has only just begun on adding C++14 support.

    Compatibility note: SWIG-4.0.0 is the first version to support any C++14 features.

    8.2 Core language changes

    8.2.1 Binary integer literals

    C++14 added binary integer literals and SWIG supports these. Example:

    int b = 0b101011;
    

    8.3 Standard library changes

    swig-4.0.1/Doc/Manual/SWIGDocumentation.html0000644000175000017500001101445313527234063020474 0ustar williamwilliam SWIG-4.0 Documentation
    SWIG-4.0 Documentation

    SWIG-4.0 Documentation



    Table of Contents



    SWIG-4.0 Documentation 1 Preface 2 Introduction 3 Getting started on Windows 4 Scripting Languages 5 SWIG Basics 6 SWIG and C++ 7 SWIG and C++11 8 SWIG and C++14 9 SWIG and C++17 10 Preprocessing 11 SWIG library 12 Argument Handling 13 Typemaps 14 Customization Features 15 Contracts 16 Variable Length Arguments 17 SWIG and Doxygen Translation 18 Warning Messages 19 Working with Modules 20 Using SWIG with ccache - ccache-swig(1) manpage 21 SWIG and Android 22 SWIG and C# 23 SWIG and D 24 SWIG and Go 25 SWIG and Guile 26 SWIG and Java 27 SWIG and Javascript 28 SWIG and Lua 29 SWIG and Octave 30 SWIG and Perl5 31 SWIG and PHP 32 SWIG and Python 33 SWIG and R 34 SWIG and Ruby 35 SWIG and Scilab 36 SWIG and Tcl 37 SWIG and MzScheme/Racket 38 SWIG and OCaml 39 Extending SWIG to support new languages

    SWIG-4.0 Documentation

    Last update : SWIG-4.0.1 (21 Aug 2019)

    Sections

    SWIG Core Documentation

    Supported Language Modules Documentation

    Experimental Language Modules Documentation

    Developer Documentation


    1 Preface

    1.1 Introduction

    SWIG (Simplified Wrapper and Interface Generator) is a software development tool for building scripting language interfaces to C and C++ programs. Originally developed in 1995, SWIG was first used by scientists in the Theoretical Physics Division at Los Alamos National Laboratory for building user interfaces to simulation codes running on the Connection Machine 5 supercomputer. In this environment, scientists needed to work with huge amounts of simulation data, complex hardware, and a constantly changing code base. The use of a scripting language interface provided a simple yet highly flexible foundation for solving these types of problems. SWIG simplifies development by largely automating the task of scripting language integration--allowing developers and users to focus on more important problems.

    Although SWIG was originally developed for scientific applications, it has since evolved into a general purpose tool that is used in a wide variety of applications--in fact almost anything where C/C++ programming is involved.

    1.2 SWIG Versions

    In the late 1990's, the most stable version of SWIG was release 1.1p5. Versions 1.3.x were officially development versions and these were released over a period of 10 years starting from the year 2000. The final version in the 1.3.x series was 1.3.40, but in truth the 1.3.x series had been stable for many years. An official stable version was released along with the decision to make SWIG license changes and this gave rise to version 2.0.0 in 2010. Version 3.0.0 was released in 2014 focusing on adding C++11 support and C++ nested classes. Version 4.0.0 was released in 2019 to add in Doxygen support. Some target languages were disabled as part of a clean up and others were given a new status of either 'Supported' or 'Experimental'.

    1.3 SWIG License

    The LICENSE file shipped with SWIG in the top level directory contains the SWIG license. For further insight into the license including the license of SWIG's output code, please visit the SWIG legal page - http://www.swig.org/legal.html.

    The license was clarified in version 2.0.0 so that the code that SWIG generated could be distributed under license terms of the user's choice/requirements and at the same time the SWIG source was placed under the GNU General Public License version 3.

    1.4 SWIG resources

    The official location of SWIG related material is

    This site contains the latest version of the software, users guide, and information regarding bugs, installation problems, and implementation tricks.

    You can also subscribe to the swig-user mailing list by visiting the page

    The mailing list often discusses some of the more technical aspects of SWIG along with information about beta releases and future work.

    Git and Subversion access to the latest version of SWIG is also available. More information about this can be obtained at:

    1.5 Prerequisites

    This manual assumes that you know how to write C/C++ programs and that you have at least heard of scripting languages such as Tcl, Python, and Perl. A detailed knowledge of these scripting languages is not required although some familiarity won't hurt. No prior experience with building C extensions to these languages is required---after all, this is what SWIG does automatically. However, you should be reasonably familiar with the use of compilers, linkers, and makefiles since making scripting language extensions is somewhat more complicated than writing a normal C program.

    Over time SWIG releases have become significantly more capable in their C++ handling--especially support for advanced features like namespaces, overloaded operators, and templates. Whenever possible, this manual tries to cover the technicalities of this interface. However, this isn't meant to be a tutorial on C++ programming. For many of the gory details, you will almost certainly want to consult a good C++ reference. If you don't program in C++, you may just want to skip those parts of the manual.

    1.6 Organization of this manual

    The first few chapters of this manual describe SWIG in general and provide an overview of its capabilities. The remaining chapters are devoted to specific SWIG language modules and are self contained. Thus, if you are using SWIG to build Python interfaces, you can probably skip to that chapter and find almost everything you need to know.

    1.7 How to avoid reading the manual

    If you hate reading manuals, glance at the "Introduction" which contains a few simple examples. These examples contain about 95% of everything you need to know to use SWIG. After that, simply use the language-specific chapters as a reference. The SWIG distribution also comes with a large directory of examples that illustrate different topics.

    1.8 Backwards compatibility

    If you are a previous user of SWIG, don't expect SWIG to provide complete backwards compatibility. Although the developers strive to the utmost to keep backwards compatibility, this isn't always possible as the primary goal over time is to make SWIG better---a process that would simply be impossible if the developers are constantly bogged down with backwards compatibility issues. Potential incompatibilities are clearly marked in the detailed release notes.

    If you need to work with different versions of SWIG and backwards compatibility is an issue, you can use the SWIG_VERSION preprocessor symbol which holds the version of SWIG being executed. SWIG_VERSION is a hexadecimal integer such as 0x010311 (corresponding to SWIG-1.3.11). This can be used in an interface file to define different typemaps, take advantage of different features etc:

    #if SWIG_VERSION >= 0x010311
    /* Use some fancy new feature */
    #endif
    

    Note: The version symbol is not defined in the generated SWIG wrapper file. The SWIG preprocessor has defined SWIG_VERSION since SWIG-1.3.11.

    1.9 Release notes

    The CHANGES.current, CHANGES and RELEASENOTES files shipped with SWIG in the top level directory contain, respectively, detailed release notes for the current version, detailed release notes for previous releases and summary release notes from SWIG-1.3.22 onwards.

    1.10 Credits

    SWIG is an unfunded project that would not be possible without the contributions of many people working in their spare time. If you have benefitted from using SWIG, please consider Donating to SWIG to keep development going. There have been a large varied number of people who have made contributions at all levels over time. Contributors are mentioned either in the COPYRIGHT file or CHANGES files shipped with SWIG or in submitted bugs.

    1.11 Bug reports

    Although every attempt has been made to make SWIG bug-free, we are also trying to make feature improvements that may introduce bugs. To report a bug, either send mail to the SWIG developer list at the swig-devel mailing list or report a bug at the SWIG bug tracker. In your report, be as specific as possible, including (if applicable), error messages, tracebacks (if a core dump occurred), corresponding portions of the SWIG interface file used, and any important pieces of the SWIG generated wrapper code. We can only fix bugs if we know about them.

    1.12 Installation

    1.12.1 Windows installation

    Please see the dedicated Windows chapter for instructions on installing SWIG on Windows and running the examples. The Windows distribution is called swigwin and includes a prebuilt SWIG executable, swig.exe, included in the top level directory. Otherwise it is exactly the same as the main SWIG distribution. There is no need to download anything else.

    1.12.2 Unix installation

    These installation instructions are for using the distributed tarball, for example, swig-3.0.8.tar.gz. If you wish to build and install from source on Github, extra steps are required. Please see the Bleeding Edge page on the SWIG website.

    You must use GNU make to build and install SWIG.

    PCRE needs to be installed on your system to build SWIG, in particular pcre-config must be available. If you have PCRE headers and libraries but not pcre-config itself or, alternatively, wish to override the compiler or linker flags returned by pcre-config, you may set PCRE_LIBS and PCRE_CFLAGS variables to be used instead. And if you don't have PCRE at all, the configure script will provide instructions for obtaining it.

    To build and install SWIG, simply type the following:

    $ ./configure
    $ make
    $ make install
    

    By default SWIG installs itself in /usr/local. If you need to install SWIG in a different location or in your home directory, use the --prefix option to ./configure. For example:

    $ ./configure --prefix=/home/yourname/projects
    $ make
    $ make install
    

    Note: the directory given to --prefix must be an absolute pathname. Do not use the ~ shell-escape to refer to your home directory. SWIG won't work properly if you do this.

    The INSTALL file shipped in the top level directory details more about using configure. Also try

    $ ./configure --help.
    

    The configure script will attempt to locate various packages on your machine including Tcl, Perl5, Python and all the other target languages that SWIG supports. Don't panic if you get 'not found' messages -- SWIG does not need these packages to compile or run. The configure script is actually looking for these packages so that you can try out the SWIG examples contained in the 'Examples' directory without having to hack Makefiles. Note that the --without-xxx options, where xxx is a target language, have minimal effect. All they do is reduce the amount of testing done with 'make check'. The SWIG executable and library files installed cannot currently be configured with a subset of target languages.

    SWIG used to include a set of runtime libraries for some languages for working with multiple modules. These are no longer built during the installation stage. However, users can build them just like any wrapper module as described in the Modules chapter. The CHANGES file shipped with SWIG in the top level directory also lists some examples which build the runtime library.

    Note:

    • If you checked the code out via Git, you will have to run ./autogen.sh before ./configure. In addition, a full build of SWIG requires a number of packages to be installed. Full instructions at SWIG bleeding edge.

    1.12.3 Macintosh OS X installation

    SWIG is known to work on various flavors of OS X. Follow the Unix installation instructions above. However, as of this writing, there is still great deal of inconsistency with how shared libraries are handled by various scripting languages on OS X.

    Users of OS X should be aware that Darwin handles shared libraries and linking in a radically different way than most Unix systems. In order to test SWIG and run the examples, SWIG configures itself to use flat namespaces and to allow undefined symbols (-flat_namespace -undefined suppress). This mostly closely follows the Unix model and makes it more likely that the SWIG examples will work with whatever installation of software you might have. However, this is generally not the recommended technique for building larger extension modules. Instead, you should utilize Darwin's two-level namespaces. Some details about this can be found here Understanding Two-Level Namespaces.

    Needless to say, you might have to experiment a bit to get things working at first.

    1.12.4 Testing

    If you want to test SWIG after building it, a check can be performed on Unix operating systems. Type the following:

        $ make -k check
    

    This step can be performed either before or after installation. The check requires at least one of the target languages to be installed. If it fails, it may mean that you have an uninstalled language module or that the file 'Examples/Makefile' has been incorrectly configured. It may also fail due to compiler issues such as a broken C++ compiler. Even if the check fails, there is a pretty good chance SWIG still works correctly --- you will just have to mess around with one of the examples and some makefiles to get it to work. Some tests may also fail due to missing dependency packages, eg PCRE or Boost, but this will require careful analysis of the configure output done during configuration.

    The test suite executed by the check is designed to stress-test many parts of the implementation including obscure corner cases. If some of these tests fail or generate warning messages, there is no reason for alarm --- the test may be related to some new SWIG feature or a difficult bug that we're trying to resolve. Chances are that SWIG will work just fine for you. Note that if you have more than one CPU/core, then you can use parallel make to speed up the check as it does take quite some time to run, for example:

        $ make -j2 -k check
    

    Also, SWIG's support for C++ is sufficiently advanced that certain tests may fail on older C++ compilers (for instance if your compiler does not support member templates). These errors are harmless if you don't intend to use these features in your own programs.

    Note: The test-suite currently contains over 600 tests. If you have many different target languages installed and a slow machine, it might take more than an hour to run the test-suite.

    1.12.5 Examples

    The Examples directory contains a variety of examples of using SWIG and it has some browsable documentation. Simply point your browser to the file "Example/index.html".

    The Examples directory also includes Visual C++ project 6 (.dsp) files for building some of the examples on Windows. Later versions of Visual Studio will convert these old style project files into a current solution file.


    2 Introduction

    2.1 What is SWIG?

    SWIG is a software development tool that simplifies the task of interfacing different languages to C and C++ programs. In a nutshell, SWIG is a compiler that takes C/C++ declarations and creates the wrappers needed to access those declarations from other languages including Perl, Python, Tcl, Ruby, Guile, and Java. SWIG normally requires no modifications to existing code and can often be used to build a usable interface in only a few minutes. Possible applications of SWIG include:

    • Building interpreted interfaces to existing C programs.
    • Rapid prototyping and application development.
    • Interactive debugging.
    • Reengineering or refactoring of legacy software into scripting language components.
    • Making a graphical user interface (using Tk for example).
    • Testing of C libraries and programs (using scripts).
    • Building high performance C modules for scripting languages.
    • Making C programming more enjoyable (or tolerable depending on your point of view).
    • Impressing your friends.
    • Obtaining vast sums of research funding (although obviously not applicable to the author).

    SWIG was originally designed to make it extremely easy for scientists and engineers to build extensible scientific software without having to get a degree in software engineering. Because of this, the use of SWIG tends to be somewhat informal and ad-hoc (e.g., SWIG does not require users to provide formal interface specifications as you would find in a dedicated IDL compiler). Although this style of development isn't appropriate for every project, it is particularly well suited to software development in the small; especially the research and development work that is commonly found in scientific and engineering projects. However, nowadays SWIG is known to be used in many large open source and commercial projects.

    2.2 Why use SWIG?

    As stated in the previous section, the primary purpose of SWIG is to simplify the task of integrating C/C++ with other programming languages. However, why would anyone want to do that? To answer that question, it is useful to list a few strengths of C/C++ programming:

    • Excellent support for writing programming libraries.
    • High performance (number crunching, data processing, graphics, etc.).
    • Systems programming and systems integration.
    • Large user community and software base.

    Next, let's list a few problems with C/C++ programming

    • Writing a user interface is rather painful (i.e., consider programming with MFC, X11, GTK, or any number of other libraries).
    • Testing is time consuming (the compile/debug cycle).
    • Not easy to reconfigure or customize without recompilation.
    • Modularization can be tricky.
    • Security concerns (buffer overflows for instance).

    To address these limitations, many programmers have arrived at the conclusion that it is much easier to use different programming languages for different tasks. For instance, writing a graphical user interface may be significantly easier in a scripting language like Python or Tcl (consider the reasons why millions of programmers have used languages like Visual Basic if you need more proof). An interactive interpreter might also serve as a useful debugging and testing tool. Other languages like Java might greatly simplify the task of writing distributed computing software. The key point is that different programming languages offer different strengths and weaknesses. Moreover, it is extremely unlikely that any programming is ever going to be perfect. Therefore, by combining languages together, you can utilize the best features of each language and greatly simplify certain aspects of software development.

    From the standpoint of C/C++, a lot of people use SWIG because they want to break out of the traditional monolithic C programming model which usually results in programs that resemble this:

    • A collection of functions and variables that do something useful.
    • A main() program that starts everything.
    • A horrible collection of hacks that form some kind of user interface (but which no-one really wants to touch).

    Instead of going down that route, incorporating C/C++ into a higher level language often results in a more modular design, less code, better flexibility, and increased programmer productivity.

    SWIG tries to make the problem of C/C++ integration as painless as possible. This allows you to focus on the underlying C program and using the high-level language interface, but not the tedious and complex chore of making the two languages talk to each other. At the same time, SWIG recognizes that all applications are different. Therefore, it provides a wide variety of customization features that let you change almost every aspect of the language bindings. This is the main reason why SWIG has such a large user manual ;-).

    2.3 Target languages

    SWIG in essence is a tool to generate code for making C/C++ code available to various other programming languages. These higher level programming languages are the target languages for the SWIG code generator and C or C++ are the input languages. A single target language must be specified when SWIG is run. This results in generating code for C/C++ and the specified target language to interface with each other. SWIG can be invoked multiple times, but with a different target language specified on each invocation. This ability to interface C/C++ to many different target languages is one of SWIG's core strengths and features.

    SWIG is very broadly composed of two components. A core component creates a parse tree from the input ISO C/C++ and SWIG directives (extensions to the C/C++ standards). The parse tree is then passed to a second component, one of the target language modules for generating code specific to a higher level language. SWIG supports many different target languages. These target languages are given a status of either Supported or Experimental. This status is provided to indicate the level of maturity to expect when using a particular target language as not all target languages are fully developed.

    The second part of the SWIG documentation contains a chapter for each target level language. Each chapter will state the status (Supported or Experimental) for that language.

    2.3.1 Supported status

    A target language is given the 'Supported' status when

    • It is in a mature, well functioning state.
    • It has its own comprehensive chapter in the documentation.
    • It passes all of the main SWIG test-suite and has a range of working examples.
    • It supports the vast majority of SWIG features.
    • It provides strong backwards compatibility between releases.

    The above is a short summary and further details are outlined in the Supported status section in the Extending chapter. The good news is that all the well-known and most popular languages have this status.

    2.3.2 Experimental status

    A target language is given the 'Experimental' status when

    • It is of sub-standard quality, failing to meet the above 'Supported' status.
    • It is somewhere between the mid to mature stage of development.
    • It does not guarantee any backwards compatibility between releases.
    • It is in need of help to finish development.

    Anyone using an experimental target language is strongly urged to assist with development of the target language module if they wish to use it.

    SWIG displays a warning when an experimental target language is used in order to set expectations and emphasize the experimental status of the target language. The usual warning suppression techniques can be used if required.

    The above is a short summary and further details are outlined in the Experimental status section in the Extending chapter.

    2.4 A SWIG example

    The best way to illustrate SWIG is with a simple example. Consider the following C code:

    /* File : example.c */
    
    double My_variable = 3.0;
    
    /* Compute factorial of n */
    int fact(int n) {
      if (n <= 1)
        return 1;
      else
        return n*fact(n-1);
    }
    
    /* Compute n mod m */
    int my_mod(int n, int m) {
      return(n % m);
    }
    

    Suppose that you wanted to access these functions and the global variable My_variable from Tcl. You start by making a SWIG interface file as shown below (by convention, these files carry a .i suffix) :

    2.4.1 SWIG interface file

    /* File : example.i */
    %module example
    %{
    /* Put headers and other declarations here */
    extern double My_variable;
    extern int    fact(int);
    extern int    my_mod(int n, int m);
    %}
    
    extern double My_variable;
    extern int    fact(int);
    extern int    my_mod(int n, int m);
    

    The interface file contains ISO C function prototypes and variable declarations. The %module directive defines the name of the module that will be created by SWIG. The %{ %} block provides a location for inserting additional code, such as C header files or additional C declarations, into the generated C wrapper code.

    2.4.2 The swig command

    SWIG is invoked using the swig command. We can use this to build a Tcl module (under Linux) as follows :

    unix > swig -tcl example.i
    unix > gcc -c -fpic example.c example_wrap.c -I/usr/local/include
    unix > gcc -shared example.o example_wrap.o -o example.so
    unix > tclsh
    % load ./example.so
    % fact 4
    24
    % my_mod 23 7
    2
    % expr $My_variable + 4.5
    7.5
    %
    

    The swig command produced a new file called example_wrap.c that should be compiled along with the example.c file. Most operating systems and scripting languages now support dynamic loading of modules. In our example, our Tcl module has been compiled into a shared library that can be loaded into Tcl. When loaded, Tcl can now access the functions and variables declared in the SWIG interface. A look at the file example_wrap.c reveals a hideous mess. However, you almost never need to worry about it.

    2.4.3 Building a Perl5 module

    Now, let's turn these functions into a Perl5 module. Without making any changes type the following (shown for Solaris):

    unix > swig -perl5 example.i
    unix > gcc -c example.c example_wrap.c \
            -I/usr/local/lib/perl5/sun4-solaris/5.003/CORE
    unix > ld -G example.o example_wrap.o -o example.so # This is for Solaris
    unix > perl5.003
    use example;
    print example::fact(4), "\n";
    print example::my_mod(23, 7), "\n";
    print $example::My_variable + 4.5, "\n";
    <ctrl-d>
    24
    2
    7.5
    unix >
    

    2.4.4 Building a Python module

    Finally, let's build a module for Python (shown for Irix).

    unix > swig -python example.i
    unix > gcc -c -fpic example.c example_wrap.c -I/usr/local/include/python2.0
    unix > gcc -shared example.o example_wrap.o -o _example.so
    unix > python
    Python 2.0 (#6, Feb 21 2001, 13:29:45)
    [GCC egcs-2.91.66 19990314/Linux (egcs-1.1.2 release)] on linux2
    Type "copyright", "credits" or "license" for more information.     
    >>> import example
    >>> example.fact(4)
    24
    >>> example.my_mod(23, 7)
    2
    >>> example.cvar.My_variable + 4.5
    7.5
    

    2.4.5 Shortcuts

    To the truly lazy programmer, one may wonder why we needed the extra interface file at all. As it turns out, you can often do without it. For example, you could also build a Perl5 module by just running SWIG on the C header file and specifying a module name as follows

    unix > swig -perl5 -module example example.h
    unix > gcc -c example.c example_wrap.c \
            -I/usr/local/lib/perl5/sun4-solaris/5.003/CORE
    unix > ld -G example.o example_wrap.o -o example.so
    unix > perl5.003
    use example;
    print example::fact(4), "\n";
    print example::my_mod(23, 7), "\n";
    print $example::My_variable + 4.5, "\n";
    <ctrl-d>
    24
    2
    7.5
    

    2.5 Supported C/C++ language features

    A primary goal of the SWIG project is to make the language binding process extremely easy. Although a few simple examples have been shown, SWIG is quite capable in supporting most of C++. Some of the major features include:

    • Full C99 preprocessing.
    • All ISO C and C++ datatypes.
    • Functions, variables, and constants.
    • Classes.
    • Single and multiple inheritance.
    • Overloaded functions and methods.
    • Overloaded operators.
    • C++ templates (including member templates, specialization, and partial specialization).
    • Namespaces.
    • Variable length arguments.
    • C++ smart pointers.

    Most of C++11 is also supported. Details are in the C++11 chapter. C++14 support is covered in the C++14 chapter. C++17 support is covered in the C++17 chapter.

    It is important to stress that SWIG is not a simplistic C++ lexing tool like several apparently similar wrapper generation tools. SWIG not only parses C++, it implements the full C++ type system and it is able to understand C++ semantics. SWIG generates its wrappers with full knowledge of this information. As a result, you will find SWIG to be just as capable of dealing with nasty corner cases as it is in wrapping simple C++ code. In fact, SWIG is able to handle C++ code that stresses the very limits of many C++ compilers.

    2.6 Non-intrusive interface building

    When used as intended, SWIG requires minimal (if any) modification to existing C or C++ code. This makes SWIG extremely easy to use with existing packages and promotes software reuse and modularity. By making the C/C++ code independent of the high level interface, you can change the interface and reuse the code in other applications. It is also possible to support different types of interfaces depending on the application.

    2.7 Incorporating SWIG into a build system

    SWIG is a command line tool and as such can be incorporated into any build system that supports invoking external tools/compilers. SWIG is most commonly invoked from within a Makefile, but is also known to be invoked from popular IDEs such as Microsoft Visual Studio.

    If you are using the GNU Autotools ( Autoconf/ Automake / Libtool) to configure SWIG use in your project, the SWIG Autoconf macros can be used. The primary macro is ax_pkg_swig, see http://www.gnu.org/software/autoconf-archive/ax_pkg_swig.html#ax_pkg_swig . The ax_python_devel macro is also helpful for generating Python extensions. See the Autoconf Archive for further information on this and other Autoconf macros.

    There is growing support for SWIG in some build tools, for example CMake is a cross-platform, open-source build manager with built in support for SWIG. CMake can detect the SWIG executable and many of the target language libraries for linking against. CMake knows how to build shared libraries and loadable modules on many different operating systems. This allows easy cross platform SWIG development. It can also generate the custom commands necessary for driving SWIG from IDEs and makefiles. All of this can be done from a single cross platform input file. The following example is a CMake input file for creating a Python wrapper for the SWIG interface file, example.i:

    
    # This is a CMake example for Python
    
    FIND_PACKAGE(SWIG REQUIRED)
    INCLUDE(${SWIG_USE_FILE})
    
    FIND_PACKAGE(PythonLibs)
    INCLUDE_DIRECTORIES(${PYTHON_INCLUDE_PATH})
    
    INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR})
    
    SET(CMAKE_SWIG_FLAGS "")
    
    SET_SOURCE_FILES_PROPERTIES(example.i PROPERTIES CPLUSPLUS ON)
    SET_SOURCE_FILES_PROPERTIES(example.i PROPERTIES SWIG_FLAGS "-includeall")
    SWIG_ADD_MODULE(example python example.i example.cxx)
    SWIG_LINK_LIBRARIES(example ${PYTHON_LIBRARIES})
    
    

    The above example will generate native build files such as makefiles, nmake files and Visual Studio projects which will invoke SWIG and compile the generated C++ files into _example.so (UNIX) or _example.pyd (Windows). For other target languages on Windows a dll, instead of a .pyd file, is usually generated.

    2.8 Hands off code generation

    SWIG is designed to produce working code that needs no hand-modification (in fact, if you look at the output, you probably won't want to modify it). You should think of your target language interface being defined entirely by the input to SWIG, not the resulting output file. While this approach may limit flexibility for hard-core hackers, it allows others to forget about the low-level implementation details.

    2.9 SWIG and freedom

    No, this isn't a special section on the sorry state of world politics. However, it may be useful to know that SWIG was written with a certain "philosophy" about programming---namely that programmers are smart and that tools should just stay out of their way. Because of that, you will find that SWIG is extremely permissive in what it lets you get away with. In fact, you can use SWIG to go well beyond "shooting yourself in the foot" if dangerous programming is your goal. On the other hand, this kind of freedom may be exactly what is needed to work with complicated and unusual C/C++ applications.

    Ironically, the freedom that SWIG provides is countered by an extremely conservative approach to code generation. At its core, SWIG tries to distill even the most advanced C++ code down to a small well-defined set of interface building techniques based on ISO C programming. Because of this, you will find that SWIG interfaces can be easily compiled by virtually every C/C++ compiler and that they can be used on any platform. Again, this is an important part of staying out of the programmer's way----the last thing any developer wants to do is to spend their time debugging the output of a tool that relies on non-portable or unreliable programming features. Dependencies are often a source of incompatibilities and problems and so additional third party libraries are not used in the generated code. SWIG will also generally avoid generating code that introduces a dependency on the C++ Standard Template Library (STL). SWIG will generate code that depends on the C libraries though.


    3 Getting started on Windows

    This chapter describes SWIG usage on Microsoft Windows. Installing SWIG and running the examples is covered as well as building the SWIG executable. Usage within the Unix like environments MinGW and Cygwin is also detailed.

    3.1 Installation on Windows

    SWIG does not come with the usual Windows type installation program, however it is quite easy to get started. The main steps are:

    • Download the swigwin zip package from the SWIG website and unzip into a directory. This is all that needs downloading for the Windows platform.
    • Set environment variables as described in the SWIG Windows Examples section in order to run examples using Visual C++.

    3.1.1 Windows Executable

    The swigwin distribution contains the SWIG Windows 32-bit executable, swig.exe, which will run on both 32-bit and 64-bit versions of Windows. If you want to build your own swig.exe have a look at Building swig.exe on Windows.

    3.2 SWIG Windows Examples

    Using Microsoft Visual C++ is the most common approach to compiling and linking SWIG's output. The Examples directory has a few Visual C++ project files (.dsp files). These were produced by Visual C++ 6. Newer versions of Visual Studio should be able to open and convert these project files. Each C# example comes with a Visual Studio 2005 solution and associated project files instead of Visual C++ 6 project files. The project files have been set up to execute SWIG in a custom build rule for the SWIG interface (.i) file. Alternatively run the examples using Cygwin.

    More information on each of the examples is available with the examples distributed with SWIG (Examples/index.html).

    3.2.1 Instructions for using the Examples with Visual Studio

    Ensure the SWIG executable is as supplied in the SWIG root directory in order for the examples to work. Most languages require some environment variables to be set before running Visual C++. Note that Visual C++ must be re-started to pick up any changes in environment variables. Open up an example .dsp file, Visual C++ will create a workspace for you (.dsw file). Ensure the Release build is selected then do a Rebuild All from the Build menu. The required environment variables are displayed with their current values.

    The list of required environment variables for each module language is also listed below. They are usually set from the Control Panel and System properties, but this depends on which flavour of Windows you are running. If you don't want to use environment variables then change all occurrences of the environment variables in the .dsp files with hard coded values. If you are interested in how the project files are set up there is explanatory information in some of the language module's documentation.

    3.2.1.1 C#

    The C# examples do not require any environment variables to be set as a C# project file is included. Just open up the .sln solution file in Visual Studio .NET 2003 or later, select Release Build, and do a Rebuild All from the Build menu. The accompanying C# and C++ project files are automatically used by the solution file.

    3.2.1.2 Java

    JAVA_INCLUDE : Set this to the directory containing jni.h
    JAVA_BIN : Set this to the bin directory containing javac.exe

    Example using JDK1.3:
    JAVA_INCLUDE: D:\jdk1.3\include
    JAVA_BIN: D:\jdk1.3\bin

    3.2.1.3 Perl

    PERL5_INCLUDE : Set this to the directory containing perl.h
    PERL5_LIB : Set this to the Perl library including path for linking

    Example using nsPerl 5.004_04:

    PERL5_INCLUDE: D:\nsPerl5.004_04\lib\CORE
    PERL5_LIB: D:\nsPerl5.004_04\lib\CORE\perl.lib

    3.2.1.4 Python

    PYTHON_INCLUDE : Set this to the directory that contains Python.h
    PYTHON_LIB : Set this to the Python library including path for linking

    Example using Python 2.1.1:
    PYTHON_INCLUDE: D:\python21\include
    PYTHON_LIB: D:\python21\libs\python21.lib

    3.2.1.5 TCL

    TCL_INCLUDE : Set this to the directory containing tcl.h
    TCL_LIB : Set this to the TCL library including path for linking

    Example using ActiveTcl 8.3.3.3
    TCL_INCLUDE: D:\tcl\include
    TCL_LIB: D:\tcl\lib\tcl83.lib

    3.2.1.6 R

    R_INCLUDE : Set this to the directory containing R.h
    R_LIB : Set this to the R library (Rdll.lib) including path for linking. The library needs to be built as described in the R README.packages file (the pexports.exe approach is the easiest).

    Example using R 2.5.1:
    R_INCLUDE: C:\Program Files\R\R-2.5.1\include
    R_LIB: C:\Program Files\R\R-2.5.1\bin\Rdll.lib

    3.2.1.7 Ruby

    RUBY_INCLUDE : Set this to the directory containing ruby.h
    RUBY_LIB : Set this to the ruby library including path for linking

    Example using Ruby 1.6.4:
    RUBY_INCLUDE: D:\ruby\lib\ruby\1.6\i586-mswin32
    RUBY_LIB: D:\ruby\lib\mswin32-ruby16.lib

    3.2.2 Instructions for using the Examples with other compilers

    If you do not have access to Visual C++ you will have to set up project files / Makefiles for your chosen compiler. There is a section in each of the language modules detailing what needs setting up using Visual C++ which may be of some guidance. Alternatively you may want to use Cygwin as described in the following section.

    3.3 SWIG on Cygwin and MinGW

    SWIG can also be compiled and run using Cygwin or MinGW which provides a Unix like front end to Windows and comes free with gcc, an ISO C/C++ compiler. However, this is not a recommended approach as the prebuilt executable is supplied.

    3.3.1 Building swig.exe on Windows

    If you want to replicate the build of swig.exe that comes with the download, follow the MinGW instructions below. This is not necessary to use the supplied swig.exe. This information is provided for those that want to modify the SWIG source code in a Windows environment. Normally this is not needed, so most people will want to ignore this section.

    3.3.1.1 Building swig.exe using MinGW and MSYS

    The short abbreviated instructions follow...

    • Install MinGW and MSYS from the MinGW site. This provides a Unix environment on Windows.
    • Follow the usual Unix instructions in the README file in the SWIG root directory to build swig.exe from the MinGW command prompt.

    The step by step instructions to download and install MinGW and MSYS, then download and build the latest version of SWIG from Github follow... Note that the instructions for obtaining SWIG from Github are also online at SWIG Bleeding Edge.

    Pitfall note: Execute the steps in the order shown and don't use spaces in path names. In fact it is best to use the default installation directories.

    1. Download the following packages from the MinGW download page or MinGW SourceForge download page. Note that at the time of writing, the majority of these are in the Current release list and some are in the Snapshot or Previous release list.
      • MinGW-3.1.0-1.exe
      • MSYS-1.0.11-2004.04.30-1.exe
      • msysDTK-1.0.1.exe
      • bison-2.0-MSYS.tar.gz
      • msys-autoconf-2.59.tar.bz2
      • msys-automake-1.8.2.tar.bz2
    2. Install MinGW-3.1.0-1.exe (C:\MinGW is default location.)
    3. Install MSYS-1.0.11-2004.04.30-1.exe. Make sure you install it on the same windows drive letter as MinGW (C:\msys\1.0 is default). In the post install script,
      • Answer y to the "do you wish to continue with the post install?"
      • Answer y to the "do you have MinGW installed?"
      • Type in the folder in which you installed MinGW (C:/MinGW is default)
    4. Install msysDTK-1.0.1.exe to the same folder that you installed MSYS (C:\msys\1.0 is default).
    5. Copy the following to the MSYS install folder (C:\msys\1.0 is default):
      • msys-automake-1.8.2.tar.bz2
      • msys-autoconf-2.59.tar.bz2
      • bison-2.0-MSYS.tar.gz
    6. Start the MSYS command prompt and execute:
      cd /
      tar -jxf msys-automake-1.8.2.tar.bz2
      tar -jxf msys-autoconf-2.59.tar.bz2
      tar -zxf bison-2.0-MSYS.tar.gz
      
    7. The very latest development version of SWIG is available from SWIG on Github and can be downloaded as a zip file or if you have Git installed, via Git. Either download the latest Zip file snapshot and unzip and rename the top level folder to /usr/src/swig. Otherwise if using Git, type in the following:
      mkdir /usr/src
      cd /usr/src
      git clone https://github.com/swig/swig.git
      
      Pitfall note: If you want to place SWIG in a different folder to the proposed /usr/src/swig, do not use MSYS emulated windows drive letters, because the autotools will fail miserably on those.
    8. The PCRE third party library needs to be built next. Download the latest PCRE source tarball, such as pcre-8.10.tar.bz2, from PCRE and place in the /usr/src/swig directory. Build PCRE as a static library using the Tools/pcre-build.sh script as follows:
      cd /usr/src/swig
      Tools/pcre-build.sh
      
    9. You are now ready to build SWIG. Execute the following commands to build swig.exe:
      cd /usr/src/swig
      ./autogen.sh
      ./configure
      make
      

    3.3.1.2 Building swig.exe using Cygwin

    Note that SWIG can also be built using Cygwin. However, SWIG will then require the Cygwin DLL when executing. Follow the Unix instructions in the README file in the SWIG root directory. Note that the Cygwin environment will also allow one to regenerate the autotool generated files which are supplied with the release distribution. These files are generated using the autogen.sh script and will only need regenerating in circumstances such as changing the build system.

    3.3.1.3 Building swig.exe alternatives

    If you don't want to install Cygwin or MinGW, use a different compiler to build SWIG. For example, all the source code files can be added to a Visual C++ project file in order to build swig.exe from the Visual C++ IDE.

    3.3.2 Running the examples on Windows using Cygwin

    The examples and test-suite work as successfully on Cygwin as on any other Unix operating system. The modules which are known to work are Python, Tcl, Perl, Ruby, Java and C#. Follow the Unix instructions in the README file in the SWIG root directory to build the examples.

    3.4 Microsoft extensions and other Windows quirks

    A common problem when using SWIG on Windows are the Microsoft function calling conventions which are not in the C++ standard. SWIG parses ISO C/C++ so cannot deal with proprietary conventions such as __declspec(dllimport), __stdcall etc. There is a Windows interface file, windows.i, to deal with these calling conventions though. The file also contains typemaps for handling commonly used Windows specific types such as __int64, BOOL , DWORD etc. Include it like you would any other interface file, for example:

    %include <windows.i>
    
    __declspec(dllexport) ULONG __stdcall foo(DWORD, __int32);
    

    Note that if you follow Microsoft's recommendation of wrapping the __declspec calls in a preprocessor definition, you will need to make sure that the definition is included by SWIG as well, by either defining it manually or via a header. For example, if you have specified the preprocessor definition in a header named export_lib.h and include other headers which depend on it, you should use the %include directive to include the definition explicitly. For example, if you had a header file, bar.h, which depended on export_lib.h, your SWIG definition file might look like:

    // bar.i
    %module bar
    %include <windows.i>
    %include "export_lib.h"
    %include "bar.h"
    

    where export_lib.h may contain:

    // export_lib.h
    #define BAR_API __declspec(dllexport)
    

    and bar.h may look like:

    // bar.h
    #include "export_lib.h"
    BAR_API void bar_function(int, double);
    

    Using the preprocessor to remove BAR_API is a popular simpler solution:

    // bar.i
    %module bar
    #define BAR_API
    %include "bar.h"
    

    4 Scripting Languages

    This chapter provides a brief overview of scripting language extension programming and the mechanisms by which scripting language interpreters access C and C++ code.

    4.1 The two language view of the world

    When a scripting language is used to control a C program, the resulting system tends to look as follows:

    Scripting language input - C/C++ functions output

    In this programming model, the scripting language interpreter is used for high level control whereas the underlying functionality of the C/C++ program is accessed through special scripting language "commands." If you have ever tried to write your own simple command interpreter, you might view the scripting language approach to be a highly advanced implementation of that. Likewise, If you have ever used a package such as MATLAB or IDL, it is a very similar model--the interpreter executes user commands and scripts. However, most of the underlying functionality is written in a low-level language like C or Fortran.

    The two-language model of computing is extremely powerful because it exploits the strengths of each language. C/C++ can be used for maximal performance and complicated systems programming tasks. Scripting languages can be used for rapid prototyping, interactive debugging, scripting, and access to high-level data structures such associative arrays.

    4.2 How does a scripting language talk to C?

    Scripting languages are built around a parser that knows how to execute commands and scripts. Within this parser, there is a mechanism for executing commands and accessing variables. Normally, this is used to implement the builtin features of the language. However, by extending the interpreter, it is usually possible to add new commands and variables. To do this, most languages define a special API for adding new commands. Furthermore, a special foreign function interface defines how these new commands are supposed to hook into the interpreter.

    Typically, when you add a new command to a scripting interpreter you need to do two things; first you need to write a special "wrapper" function that serves as the glue between the interpreter and the underlying C function. Then you need to give the interpreter information about the wrapper by providing details about the name of the function, arguments, and so forth. The next few sections illustrate the process.

    4.2.1 Wrapper functions

    Suppose you have an ordinary C function like this :

    int fact(int n) {
      if (n <= 1)
        return 1;
      else
        return n*fact(n-1);
    }
    

    In order to access this function from a scripting language, it is necessary to write a special "wrapper" function that serves as the glue between the scripting language and the underlying C function. A wrapper function must do three things :

    • Gather function arguments and make sure they are valid.
    • Call the C function.
    • Convert the return value into a form recognized by the scripting language.

    As an example, the Tcl wrapper function for the fact() function above example might look like the following :

    int wrap_fact(ClientData clientData, Tcl_Interp *interp, int argc, char *argv[]) {
      int result;
      int arg0;
      if (argc != 2) {
        interp->result = "wrong # args";
        return TCL_ERROR;
      }
      arg0 = atoi(argv[1]);
      result = fact(arg0);
      sprintf(interp->result, "%d", result);
      return TCL_OK;
    }
    
    

    Once you have created a wrapper function, the final step is to tell the scripting language about the new function. This is usually done in an initialization function called by the language when the module is loaded. For example, adding the above function to the Tcl interpreter requires code like the following :

    int Wrap_Init(Tcl_Interp *interp) {
      Tcl_CreateCommand(interp, "fact", wrap_fact, (ClientData) NULL,
                        (Tcl_CmdDeleteProc *) NULL);
      return TCL_OK;
    }
    

    When executed, Tcl will now have a new command called "fact " that you can use like any other Tcl command.

    Although the process of adding a new function to Tcl has been illustrated, the procedure is almost identical for Perl and Python. Both require special wrappers to be written and both need additional initialization code. Only the specific details are different.

    4.2.2 Variable linking

    Variable linking refers to the problem of mapping a C/C++ global variable to a variable in the scripting language interpreter. For example, suppose you had the following variable:

    double Foo = 3.5;
    

    It might be nice to access it from a script as follows (shown for Perl):

    $a = $Foo * 2.3;   # Evaluation
    $Foo = $a + 2.0;   # Assignment
    

    To provide such access, variables are commonly manipulated using a pair of get/set functions. For example, whenever the value of a variable is read, a "get" function is invoked. Similarly, whenever the value of a variable is changed, a "set" function is called.

    In many languages, calls to the get/set functions can be attached to evaluation and assignment operators. Therefore, evaluating a variable such as $Foo might implicitly call the get function. Similarly, typing $Foo = 4 would call the underlying set function to change the value.

    4.2.3 Constants

    In many cases, a C program or library may define a large collection of constants. For example:

    #define RED   0xff0000
    #define BLUE  0x0000ff
    #define GREEN 0x00ff00
    

    To make constants available, their values can be stored in scripting language variables such as $RED, $BLUE, and $GREEN. Virtually all scripting languages provide C functions for creating variables so installing constants is usually a trivial exercise.

    4.2.4 Structures and classes

    Although scripting languages have no trouble accessing simple functions and variables, accessing C/C++ structures and classes present a different problem. This is because the implementation of structures is largely related to the problem of data representation and layout. Furthermore, certain language features are difficult to map to an interpreter. For instance, what does C++ inheritance mean in a Perl interface?

    The most straightforward technique for handling structures is to implement a collection of accessor functions that hide the underlying representation of a structure. For example,

    struct Vector {
      Vector();
      ~Vector();
      double x, y, z;
    };
    
    

    can be transformed into the following set of functions :

    Vector *new_Vector();
    void delete_Vector(Vector *v);
    double Vector_x_get(Vector *v);
    double Vector_y_get(Vector *v);
    double Vector_z_get(Vector *v);
    void Vector_x_set(Vector *v, double x);
    void Vector_y_set(Vector *v, double y);
    void Vector_z_set(Vector *v, double z);
    
    

    Now, from an interpreter these function might be used as follows:

    % set v [new_Vector]
    % Vector_x_set $v 3.5
    % Vector_y_get $v
    % delete_Vector $v
    % ...
    

    Since accessor functions provide a mechanism for accessing the internals of an object, the interpreter does not need to know anything about the actual representation of a Vector.

    4.2.5 Proxy classes

    In certain cases, it is possible to use the low-level accessor functions to create a proxy class, also known as a shadow class. A proxy class is a special kind of object that gets created in a scripting language to access a C/C++ class (or struct) in a way that looks like the original structure (that is, it proxies the real C++ class). For example, if you have the following C++ definition :

    class Vector {
    public:
      Vector();
      ~Vector();
      double x, y, z;
    };
    

    A proxy classing mechanism would allow you to access the structure in a more natural manner from the interpreter. For example, in Python, you might want to do this:

    >>> v = Vector()
    >>> v.x = 3
    >>> v.y = 4
    >>> v.z = -13
    >>> ...
    >>> del v
    

    Similarly, in Perl5 you may want the interface to work like this:

    $v = new Vector;
    $v->{x} = 3;
    $v->{y} = 4;
    $v->{z} = -13;
    
    

    Finally, in Tcl :

    Vector v
    v configure -x 3 -y 4 -z -13
    
    

    When proxy classes are used, two objects are really at work--one in the scripting language, and an underlying C/C++ object. Operations affect both objects equally and for all practical purposes, it appears as if you are simply manipulating a C/C++ object.

    4.3 Building scripting language extensions

    The final step in using a scripting language with your C/C++ application is adding your extensions to the scripting language itself. There are two primary approaches for doing this. The preferred technique is to build a dynamically loadable extension in the form of a shared library. Alternatively, you can recompile the scripting language interpreter with your extensions added to it.

    4.3.1 Shared libraries and dynamic loading

    To create a shared library or DLL, you often need to look at the manual pages for your compiler and linker. However, the procedure for a few common platforms is shown below:

    # Build a shared library for Solaris
    gcc -fpic -c example.c example_wrap.c -I/usr/local/include
    ld -G example.o example_wrap.o -o example.so
    
    # Build a shared library for Linux
    gcc -fpic -c example.c example_wrap.c -I/usr/local/include
    gcc -shared example.o example_wrap.o -o example.so
    

    To use your shared library, you simply use the corresponding command in the scripting language (load, import, use, etc...). This will import your module and allow you to start using it. For example:

    % load ./example.so
    % fact 4
    24
    %
    

    When working with C++ codes, the process of building shared libraries may be more complicated--primarily due to the fact that C++ modules may need additional code in order to operate correctly. On many machines, you can build a shared C++ module by following the above procedures, but changing the link line to the following :

    c++ -shared example.o example_wrap.o -o example.so
    

    4.3.2 Linking with shared libraries

    When building extensions as shared libraries, it is not uncommon for your extension to rely upon other shared libraries on your machine. In order for the extension to work, it needs to be able to find all of these libraries at run-time. Otherwise, you may get an error such as the following :

    >>> import graph
    Traceback (innermost last):
      File "<stdin>", line 1, in ?
      File "/home/sci/data1/beazley/graph/graph.py", line 2, in ?
        import graphc
    ImportError:  1101:/home/sci/data1/beazley/bin/python: rld: Fatal Error: cannot 
    successfully map soname 'libgraph.so' under any of the filenames /usr/lib/libgraph.so:/
    lib/libgraph.so:/lib/cmplrs/cc/libgraph.so:/usr/lib/cmplrs/cc/libgraph.so:
    >>>
    

    What this error means is that the extension module created by SWIG depends upon a shared library called "libgraph.so" that the system was unable to locate. To fix this problem, there are a few approaches you can take.

    • Link your extension and explicitly tell the linker where the required libraries are located. Often times, this can be done with a special linker flag such as -R, -rpath, etc. This is not implemented in a standard manner so read the man pages for your linker to find out more about how to set the search path for shared libraries.
    • Put shared libraries in the same directory as the executable. This technique is sometimes required for correct operation on non-Unix platforms.
    • Set the UNIX environment variable LD_LIBRARY_PATH to the directory where shared libraries are located before running Python. Although this is an easy solution, it is not recommended. Consider setting the path using linker options instead.

    4.3.3 Static linking

    With static linking, you rebuild the scripting language interpreter with extensions. The process usually involves compiling a short main program that adds your customized commands to the language and starts the interpreter. You then link your program with a library to produce a new scripting language executable.

    Although static linking is supported on all platforms, this is not the preferred technique for building scripting language extensions. In fact, there are very few practical reasons for doing this--consider using shared libraries instead.


    5 SWIG Basics

    This chapter describes the basic operation of SWIG, the structure of its input files, and how it handles standard ISO C declarations. C++ support is described in the next chapter. However, C++ programmers should still read this chapter to understand the basics. Specific details about each target language are described in later chapters.

    5.1 Running SWIG

    To run SWIG, use the swig command with options and a filename like this:

    swig [ options ] filename
    

    where filename is a SWIG interface file or a C/C++ header file. Full help can be seen by running swig -help. Below is the common set of options that can be used. Additional options are also defined for each target language. A full list can be obtained by running swig -<lang> -help for language <lang> specific options, for example, swig -ruby -help for Ruby.

    Supported Target Language Options
         -csharp         - Generate C# wrappers
         -d              - Generate D wrappers
         -go             - Generate Go wrappers
         -guile          - Generate Guile wrappers
         -java           - Generate Java wrappers
         -javascript     - Generate Javascript wrappers
         -lua            - Generate Lua wrappers
         -octave         - Generate Octave wrappers
         -perl5          - Generate Perl 5 wrappers
         -php7           - Generate PHP 7 wrappers
         -python         - Generate Python wrappers
         -r              - Generate R (aka GNU S) wrappers
         -ruby           - Generate Ruby wrappers
         -scilab         - Generate Scilab wrappers
         -tcl8           - Generate Tcl 8 wrappers
         -xml            - Generate XML wrappers
    
    Experimental Target Language Options
         -mzscheme       - Generate MzScheme/Racket wrappers
         -ocaml          - Generate OCaml wrappers
    
    General Options
         -addextern      - Add extra extern declarations
         -c++            - Enable C++ processing
         -co <file>      - Check <file> out of the SWIG library
         -copyctor       - Automatically generate copy constructors wherever possible
         -cpperraswarn   - Treat the preprocessor #error statement as #warning (default)
         -cppext <ext>   - Change file extension of generated C++ files to <ext>
                           (default is cxx)
         -copyright      - Display copyright notices
         -debug-classes  - Display information about the classes found in the interface
         -debug-module <n>- Display module parse tree at stages 1-4, <n> is a csv list of stages
         -debug-symtabs  - Display symbol tables information
         -debug-symbols  - Display target language symbols in the symbol tables
         -debug-csymbols - Display C symbols in the symbol tables
         -debug-lsymbols - Display target language layer symbols
         -debug-tags     - Display information about the tags found in the interface
         -debug-template - Display information for debugging templates
         -debug-top <n>  - Display entire parse tree at stages 1-4, <n> is a csv list of stages
         -debug-typedef  - Display information about the types and typedefs in the interface
         -debug-typemap  - Display typemap debugging information
         -debug-tmsearch - Display typemap search debugging information
         -debug-tmused   - Display typemaps used debugging information
         -directors      - Turn on director mode for all the classes, mainly for testing
         -dirprot        - Turn on wrapping of protected members for director classes (default)
         -D<symbol>      - Define a symbol <symbol> (for conditional compilation)
         -E              - Preprocess only, does not generate wrapper code
         -external-runtime [file] - Export the SWIG runtime stack
         -fakeversion <v>- Make SWIG fake the program version number to <v>
         -fcompact       - Compile in compact mode
         -features <list>- Set global features, where <list> is a comma separated list of
                           features, eg -features directors,autodoc=1
                           If no explicit value is given to the feature, a default of 1 is used
         -fastdispatch   - Enable fast dispatch mode to produce faster overload dispatcher code
         -Fmicrosoft     - Display error/warning messages in Microsoft format
         -Fstandard      - Display error/warning messages in commonly used format
         -fvirtual       - Compile in virtual elimination mode
         -help           - Display help
         -I-             - Don't search the current directory
         -I<dir>         - Look for SWIG files in directory <dir>
         -ignoremissing  - Ignore missing include files
         -importall      - Follow all #include statements as imports
         -includeall     - Follow all #include statements
         -l<ifile>       - Include SWIG library file <ifile>
         -macroerrors    - Report errors inside macros
         -makedefault    - Create default constructors/destructors (the default)
         -M              - List all dependencies
         -MD             - Is equivalent to `-M -MF <file>', except `-E' is not implied
         -MF <file>      - Generate dependencies into <file> and continue generating wrappers
         -MM             - List dependencies, but omit files in SWIG library
         -MMD            - Like `-MD', but omit files in SWIG library
         -module <name>  - Set module name to <name>
         -MP             - Generate phony targets for all dependencies
         -MT <target>    - Set the target of the rule emitted by dependency generation
         -nocontract     - Turn off contract checking
         -nocpperraswarn - Do not treat the preprocessor #error statement as #warning
         -nodefault      - Do not generate default constructors nor default destructors
         -nodefaultctor  - Do not generate implicit default constructors
         -nodefaultdtor  - Do not generate implicit default destructors
         -nodirprot      - Do not wrap director protected members
         -noexcept       - Do not wrap exception specifiers
         -nofastdispatch - Disable fast dispatch mode (default)
         -nopreprocess   - Skip the preprocessor step
         -notemplatereduce - Disable reduction of the typedefs in templates
         -O              - Enable the optimization options:
                            -fastdispatch -fvirtual
         -o <outfile>    - Set name of C/C++ output file to <outfile>
         -oh <headfile>  - Set name of C++ output header file for directors to <headfile>
         -outcurrentdir  - Set default output dir to current dir instead of input file's path
         -outdir <dir>   - Set language specific files output directory to <dir>
         -pcreversion    - Display PCRE version information
         -small          - Compile in virtual elimination and compact mode
         -swiglib        - Report location of SWIG library and exit
         -templatereduce - Reduce all the typedefs in templates
         -v              - Run in verbose mode
         -version        - Display SWIG version number
         -Wall           - Remove all warning suppression, also implies -Wextra
         -Wallkw         - Enable keyword warnings for all the supported languages
         -Werror         - Treat warnings as errors
         -Wextra         - Adds the following additional warnings: 202,309,403,405,512,321,322
         -w<list>        - Suppress/add warning messages, eg -w401,+321 - see Warnings.html
         -xmlout <file>  - Write XML version of the parse tree to <file> after normal processing
    

    Arguments may also be passed in a command-line options file (also known as a response file) which is useful if they exceed the system command line length limit. To do this, put the arguments in a file, then provide the file name prefixed with @ like so:

    swig @file
    

    The options read from the file are inserted in place of the file option. If the file does not exist, or cannot be read, then the option will be treated literally and not removed.

    Options in the file are separated by whitespace. A whitespace character may be included in an option by surrounding the entire option in either single or double quotes. Any character (including a backslash) may be included by prefixing the character to be included with a backslash. The file may itself contain additional @file options; any such options will be processed recursively.

    5.1.1 Input format

    As input, SWIG expects a file containing ISO C/C++ declarations and special SWIG directives. More often than not, this is a special SWIG interface file which is usually denoted with a special .i or .swg suffix. In certain cases, SWIG can be used directly on raw header files or source files. However, this is not the most typical case and there are several reasons why you might not want to do this (described later).

    The most common format of a SWIG interface is as follows:

    %module mymodule 
    %{
    #include "myheader.h"
    %}
    // Now list ISO C/C++ declarations
    int foo;
    int bar(int x);
    ...
    

    The module name is supplied using the special %module directive. Modules are described further in the Modules Introduction section.

    Everything in the %{ ... %} block is simply copied verbatim to the resulting wrapper file created by SWIG. This section is almost always used to include header files and other declarations that are required to make the generated wrapper code compile. It is important to emphasize that just because you include a declaration in a SWIG input file, that declaration does not automatically appear in the generated wrapper code---therefore you need to make sure you include the proper header files in the %{ ... %} section. It should be noted that the text enclosed in %{ ... %} is not parsed or interpreted by SWIG. The %{...%} syntax and semantics in SWIG is analogous to that of the declarations section used in input files to parser generation tools such as yacc or bison.

    5.1.2 SWIG Output

    The output of SWIG is a C/C++ file that contains all of the wrapper code needed to build an extension module. SWIG may generate some additional files depending on the target language. By default, an input file with the name file.i is transformed into a file file_wrap.c or file_wrap.cxx (depending on whether or not the -c++ option has been used). The name of the output C/C++ file can be changed using the -o option. In certain cases, file suffixes are used by the compiler to determine the source language (C, C++, etc.). Therefore, you have to use the -o option to change the suffix of the SWIG-generated wrapper file if you want something different than the default. For example:

    $ swig -c++ -python -o example_wrap.cpp example.i
    

    The C/C++ output file created by SWIG often contains everything that is needed to construct an extension module for the target scripting language. SWIG is not a stub compiler nor is it usually necessary to edit the output file (and if you look at the output, you probably won't want to). To build the final extension module, the SWIG output file is compiled and linked with the rest of your C/C++ program to create a shared library.

    For many target languages SWIG will also generate proxy class files in the target language. The default output directory for these language specific files is the same directory as the generated C/C++ file. This can be modified using the -outdir option. For example:

    $ swig -c++ -python -outdir pyfiles -o cppfiles/example_wrap.cpp example.i
    

    If the directories cppfiles and pyfiles exist, the following will be generated:

    cppfiles/example_wrap.cpp
    pyfiles/example.py
    

    If the -outcurrentdir option is used (without -o) then SWIG behaves like a typical C/C++ compiler and the default output directory is then the current directory. Without this option the default output directory is the path to the input file. If -o and -outcurrentdir are used together, -outcurrentdir is effectively ignored as the output directory for the language files is the same directory as the generated C/C++ file if not overridden with -outdir.

    5.1.3 Comments

    C and C++ style comments may appear anywhere in interface files. In previous versions of SWIG, comments were used to generate documentation files. However, this feature is currently under repair and will reappear in a later SWIG release.

    5.1.4 C Preprocessor

    Like C, SWIG preprocesses all input files through an enhanced version of the C preprocessor. All standard preprocessor features are supported including file inclusion, conditional compilation and macros. However, #include statements are ignored unless the -includeall command line option has been supplied. The reason for disabling includes is that SWIG is sometimes used to process raw C header files. In this case, you usually only want the extension module to include functions in the supplied header file rather than everything that might be included by that header file (i.e., system headers, C library functions, etc.).

    It should also be noted that the SWIG preprocessor skips all text enclosed inside a %{...%} block. In addition, the preprocessor includes a number of macro handling enhancements that make it more powerful than the normal C preprocessor. These extensions are described in the "Preprocessor" chapter.

    5.1.5 SWIG Directives

    Most of SWIG's operation is controlled by special directives that are always preceded by a "%" to distinguish them from normal C declarations. These directives are used to give SWIG hints or to alter SWIG's parsing behavior in some manner.

    Since SWIG directives are not legal C syntax, it is generally not possible to include them in header files. However, SWIG directives can be included in C header files using conditional compilation like this:

    /* header.h  --- Some header file */
    
    /* SWIG directives -- only seen if SWIG is running */ 
    #ifdef SWIG
    %module foo
    #endif
    

    SWIG is a special preprocessing symbol defined by SWIG when it is parsing an input file.

    5.1.6 Parser Limitations

    Although SWIG can parse most C/C++ declarations, it does not provide a complete C/C++ parser implementation. Most of these limitations pertain to very complicated type declarations and certain advanced C++ features. Specifically, the following features are not currently supported:

    • Non-conventional type declarations. For example, SWIG does not support declarations such as the following (even though this is legal C):

      /* Non-conventional placement of storage specifier (extern) */
      const int extern Number;
      
      /* Extra declarator grouping */
      Matrix (foo);    // A global variable
      
      /* Extra declarator grouping in parameters */
      void bar(Spam (Grok)(Doh));
      
      

      In practice, few (if any) C programmers actually write code like this since this style is never featured in programming books. However, if you're feeling particularly obfuscated, you can certainly break SWIG (although why would you want to?).

    • Running SWIG on C++ source files (the code in a .C, .cpp or .cxx file) is not recommended. The usual approach is to feed SWIG header files for parsing C++ definitions and declarations. The main reason is if SWIG parses a scoped definition or declaration (as is normal for C++ source files), it is ignored, unless a declaration for the symbol was parsed earlier. For example

      /* bar not wrapped unless foo has been defined and 
         the declaration of bar within foo has already been parsed */
      int foo::bar(int) {
        ... whatever ...
      }
      
    • Certain advanced features of C++ such as nested classes are not yet fully supported. Please see the C++ Nested classes section for more information.

    In the event of a parsing error, conditional compilation can be used to skip offending code. For example:

    #ifndef SWIG
    ... some bad declarations ...
    #endif
    

    Alternatively, you can just delete the offending code from the interface file.

    One of the reasons why SWIG does not provide a full C++ parser implementation is that it has been designed to work with incomplete specifications and to be very permissive in its handling of C/C++ datatypes (e.g., SWIG can generate interfaces even when there are missing class declarations or opaque datatypes). Unfortunately, this approach makes it extremely difficult to implement certain parts of a C/C++ parser as most compilers use type information to assist in the parsing of more complex declarations (for the truly curious, the primary complication in the implementation is that the SWIG parser does not utilize a separate typedef-name terminal symbol as described on p. 234 of K&R).

    5.2 Wrapping Simple C Declarations

    SWIG wraps simple C declarations by creating an interface that closely matches the way in which the declarations would be used in a C program. For example, consider the following interface file:

    %module example
    
    %inline %{
    extern double sin(double x);
    extern int strcmp(const char *, const char *);
    extern int Foo;
    %}
    #define STATUS 50
    #define VERSION "1.1"
    

    In this file, there are two functions sin() and strcmp(), a global variable Foo, and two constants STATUS and VERSION. When SWIG creates an extension module, these declarations are accessible as scripting language functions, variables, and constants respectively. For example, in Tcl:

    % sin 3
    5.2335956
    % strcmp Dave Mike
    -1
    % puts $Foo
    42
    % puts $STATUS
    50
    % puts $VERSION
    1.1
    

    Or in Python:

    >>> example.sin(3)
    5.2335956
    >>> example.strcmp('Dave', 'Mike')
    -1
    >>> print example.cvar.Foo
    42
    >>> print example.STATUS
    50
    >>> print example.VERSION
    1.1
    

    Whenever possible, SWIG creates an interface that closely matches the underlying C/C++ code. However, due to subtle differences between languages, run-time environments, and semantics, it is not always possible to do so. The next few sections describe various aspects of this mapping.

    5.2.1 Basic Type Handling

    In order to build an interface, SWIG has to convert C/C++ datatypes to equivalent types in the target language. Generally, scripting languages provide a more limited set of primitive types than C. Therefore, this conversion process involves a certain amount of type coercion.

    Most scripting languages provide a single integer type that is implemented using the int or long datatype in C. The following list shows all of the C datatypes that SWIG will convert to and from integers in the target language:

    int
    short
    long
    unsigned
    signed
    unsigned short
    unsigned long
    unsigned char
    signed char
    bool
    

    When an integral value is converted from C, a cast is used to convert it to the representation in the target language. Thus, a 16 bit short in C may be promoted to a 32 bit integer. When integers are converted in the other direction, the value is cast back into the original C type. If the value is too large to fit, it is silently truncated.

    unsigned char and signed char are special cases that are handled as small 8-bit integers. Normally, the char datatype is mapped as a one-character ASCII string.

    The bool datatype is cast to and from an integer value of 0 and 1 unless the target language provides a special boolean type.

    Some care is required when working with large integer values. Most scripting languages use 32-bit integers so mapping a 64-bit long integer may lead to truncation errors. Similar problems may arise with 32 bit unsigned integers (which may appear as large negative numbers). As a rule of thumb, the int datatype and all variations of char and short datatypes are safe to use. For unsigned int and long datatypes, you will need to carefully check the correct operation of your program after it has been wrapped with SWIG.

    Although the SWIG parser supports the long long datatype, not all language modules support it. This is because long long usually exceeds the integer precision available in the target language. In certain modules such as Tcl and Perl5, long long integers are encoded as strings. This allows the full range of these numbers to be represented. However, it does not allow long long values to be used in arithmetic expressions. It should also be noted that although long long is part of the ISO C99 standard, it is not universally supported by all C compilers. Make sure you are using a compiler that supports long long before trying to use this type with SWIG.

    SWIG recognizes the following floating point types :

    float
    double
    

    Floating point numbers are mapped to and from the natural representation of floats in the target language. This is almost always a C double. The rarely used datatype of long double is not supported by SWIG.

    The char datatype is mapped into a NULL terminated ASCII string with a single character. When used in a scripting language it shows up as a tiny string containing the character value. When converting the value back into C, SWIG takes a character string from the scripting language and strips off the first character as the char value. Thus if the value "foo" is assigned to a char datatype, it gets the value `f'.

    The char * datatype is handled as a NULL-terminated ASCII string. SWIG maps this into a 8-bit character string in the target scripting language. SWIG converts character strings in the target language to NULL terminated strings before passing them into C/C++. The default handling of these strings does not allow them to have embedded NULL bytes. Therefore, the char * datatype is not generally suitable for passing binary data. However, it is possible to change this behavior by defining a SWIG typemap. See the chapter on Typemaps for details about this.

    At this time, SWIG provides limited support for Unicode and wide-character strings (the C wchar_t type). Some languages provide typemaps for wchar_t, but bear in mind these might not be portable across different operating systems. This is a delicate topic that is poorly understood by many programmers and not implemented in a consistent manner across languages. For those scripting languages that provide Unicode support, Unicode strings are often available in an 8-bit representation such as UTF-8 that can be mapped to the char * type (in which case the SWIG interface will probably work). If the program you are wrapping uses Unicode, there is no guarantee that Unicode characters in the target language will use the same internal representation (e.g., UCS-2 vs. UCS-4). You may need to write some special conversion functions.

    5.2.2 Global Variables

    Whenever possible, SWIG maps C/C++ global variables into scripting language variables. For example,

    %module example
    double foo;
    
    

    results in a scripting language variable like this:

    # Tcl
    set foo [3.5]                   ;# Set foo to 3.5
    puts $foo                       ;# Print the value of foo
    
    # Python
    cvar.foo = 3.5                  # Set foo to 3.5
    print cvar.foo                  # Print value of foo
    
    # Perl
    $foo = 3.5;                     # Set foo to 3.5
    print $foo, "\n";               # Print value of foo
    
    # Ruby
    Module.foo = 3.5               # Set foo to 3.5
    print Module.foo, "\n"         # Print value of foo
    

    Whenever the scripting language variable is used, the underlying C global variable is accessed. Although SWIG makes every attempt to make global variables work like scripting language variables, it is not always possible to do so. For instance, in Python, all global variables must be accessed through a special variable object known as cvar (shown above). In Ruby, variables are accessed as attributes of the module. Other languages may convert variables to a pair of accessor functions. For example, the Java module generates a pair of functions double get_foo() and set_foo(double val) that are used to manipulate the value.

    Finally, if a global variable has been declared as const, it only supports read-only access. Note: this behavior is new to SWIG-1.3. Earlier versions of SWIG incorrectly handled const and created constants instead.

    5.2.3 Constants

    Constants can be created using #define, enumerations, or a special %constant directive. The following interface file shows a few valid constant declarations :

    #define I_CONST       5               // An integer constant
    #define PI            3.14159         // A Floating point constant
    #define S_CONST       "hello world"   // A string constant
    #define NEWLINE       '\n'            // Character constant
    
    enum boolean {NO=0, YES=1};
    enum months {JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG,
                 SEP, OCT, NOV, DEC};
    %constant double BLAH = 42.37;
    #define PI_4 PI/4
    #define FLAGS 0x04 | 0x08 | 0x40
    
    

    In #define declarations, the type of a constant is inferred by syntax. For example, a number with a decimal point is assumed to be floating point. In addition, SWIG must be able to fully resolve all of the symbols used in a #define in order for a constant to actually be created. This restriction is necessary because #define is also used to define preprocessor macros that are definitely not meant to be part of the scripting language interface. For example:

    #define EXTERN extern
    
    EXTERN void foo();
    

    In this case, you probably don't want to create a constant called EXTERN (what would the value be?). In general, SWIG will not create constants for macros unless the value can be completely determined by the preprocessor. For instance, in the above example, the declaration

    #define PI_4  PI/4
    

    defines a constant because PI was already defined as a constant and the value is known. However, for the same conservative reasons even a constant with a simple cast will be ignored, such as

    #define F_CONST (double) 5            // A floating point constant with cast
    

    The use of constant expressions is allowed, but SWIG does not evaluate them. Rather, it passes them through to the output file and lets the C compiler perform the final evaluation (SWIG does perform a limited form of type-checking however).

    For enumerations, it is critical that the original enum definition be included somewhere in the interface file (either in a header file or in the %{ %} block). SWIG only translates the enumeration into code needed to add the constants to a scripting language. It needs the original enumeration declaration in order to get the correct enum values as assigned by the C compiler.

    The %constant directive is used to more precisely create constants corresponding to different C datatypes. Although it is not usually needed for simple values, it is more useful when working with pointers and other more complex datatypes. Typically, %constant is only used when you want to add constants to the scripting language interface that are not defined in the original header file.

    5.2.4 A brief word about const

    A common confusion with C programming is the semantic meaning of the const qualifier in declarations--especially when it is mixed with pointers and other type modifiers. In fact, previous versions of SWIG handled const incorrectly--a situation that SWIG-1.3.7 and newer releases have fixed.

    Starting with SWIG-1.3, all variable declarations, regardless of any use of const, are wrapped as global variables. If a declaration happens to be declared as const, it is wrapped as a read-only variable. To tell if a variable is const or not, you need to look at the right-most occurrence of the const qualifier (that appears before the variable name). If the right-most const occurs after all other type modifiers (such as pointers), then the variable is const. Otherwise, it is not.

    Here are some examples of const declarations.

    const char a;           // A constant character
    char const b;           // A constant character (the same)
    char *const c;          // A constant pointer to a character
    const char *const d;    // A constant pointer to a constant character
    

    Here is an example of a declaration that is not const:

    const char *e;          // A pointer to a constant character.  The pointer
                            // may be modified.
    

    In this case, the pointer e can change---it's only the value being pointed to that is read-only.

    Please note that for const parameters or return types used in a function, SWIG pretty much ignores the fact that these are const, see the section on const-correctness for more information.

    Compatibility Note: One reason for changing SWIG to handle const declarations as read-only variables is that there are many situations where the value of a const variable might change. For example, a library might export a symbol as const in its public API to discourage modification, but still allow the value to change through some other kind of internal mechanism. Furthermore, programmers often overlook the fact that with a constant declaration like char *const, the underlying data being pointed to can be modified--it's only the pointer itself that is constant. In an embedded system, a const declaration might refer to a read-only memory address such as the location of a memory-mapped I/O device port (where the value changes, but writing to the port is not supported by the hardware). Rather than trying to build a bunch of special cases into the const qualifier, the new interpretation of const as "read-only" is simple and exactly matches the actual semantics of const in C/C++. If you really want to create a constant as in older versions of SWIG, use the %constant directive instead. For example:

    %constant double PI = 3.14159;
    

    or

    #ifdef SWIG
    #define const %constant
    #endif
    const double foo = 3.4;
    const double bar = 23.4;
    const int    spam = 42;
    #ifdef SWIG
    #undef const
    #endif
    ...
    
    

    5.2.5 A cautionary tale of char *

    Before going any further, there is one bit of caution involving char * that must now be mentioned. When strings are passed from a scripting language to a C char *, the pointer usually points to string data stored inside the interpreter. It is almost always a really bad idea to modify this data. Furthermore, some languages may explicitly disallow it. For instance, in Python, strings are supposed to be immutable. If you violate this, you will probably receive a vast amount of wrath when you unleash your module on the world.

    The primary source of problems are functions that might modify string data in place. A classic example would be a function like this:

    char *strcat(char *s, const char *t)
    

    Although SWIG will certainly generate a wrapper for this, its behavior will be undefined. In fact, it will probably cause your application to crash with a segmentation fault or other memory related problem. This is because s refers to some internal data in the target language---data that you shouldn't be touching.

    The bottom line: don't rely on char * for anything other than read-only input values. However, it must be noted that you could change the behavior of SWIG using typemaps.

    5.3 Pointers and complex objects

    Most C programs manipulate arrays, structures, and other types of objects. This section discusses the handling of these datatypes.

    5.3.1 Simple pointers

    Pointers to primitive C datatypes such as

    int *
    double ***
    char **
    

    are fully supported by SWIG. Rather than trying to convert the data being pointed to into a scripting representation, SWIG simply encodes the pointer itself into a representation that contains the actual value of the pointer and a type-tag. Thus, the SWIG representation of the above pointers (in Tcl), might look like this:

    _10081012_p_int
    _1008e124_ppp_double
    _f8ac_pp_char
    

    A NULL pointer is represented by the string "NULL" or the value 0 encoded with type information.

    All pointers are treated as opaque objects by SWIG. Thus, a pointer may be returned by a function and passed around to other C functions as needed. For all practical purposes, the scripting language interface works in exactly the same way as you would use the pointer in a C program. The only difference is that there is no mechanism for dereferencing the pointer since this would require the target language to understand the memory layout of the underlying object.

    The scripting language representation of a pointer value should never be manipulated directly. Even though the values shown look like hexadecimal addresses, the numbers used may differ from the actual machine address (e.g., on little-endian machines, the digits may appear in reverse order). Furthermore, SWIG does not normally map pointers into high-level objects such as associative arrays or lists (for example, converting an int * into an list of integers). There are several reasons why SWIG does not do this:

    • There is not enough information in a C declaration to properly map pointers into higher level constructs. For example, an int * may indeed be an array of integers, but if it contains ten million elements, converting it into a list object is probably a bad idea.
    • The underlying semantics associated with a pointer is not known by SWIG. For instance, an int * might not be an array at all--perhaps it is an output value!
    • By handling all pointers in a consistent manner, the implementation of SWIG is greatly simplified and less prone to error.

    5.3.2 Run time pointer type checking

    By allowing pointers to be manipulated from a scripting language, extension modules effectively bypass compile-time type checking in the C/C++ compiler. To prevent errors, a type signature is encoded into all pointer values and is used to perform run-time type checking. This type-checking process is an integral part of SWIG and can not be disabled or modified without using typemaps (described in later chapters).

    Like C, void * matches any kind of pointer. Furthermore, NULL pointers can be passed to any function that expects to receive a pointer. Although this has the potential to cause a crash, NULL pointers are also sometimes used as sentinel values or to denote a missing/empty value. Therefore, SWIG leaves NULL pointer checking up to the application.

    5.3.3 Derived types, structs, and classes

    For everything else (structs, classes, arrays, etc...) SWIG applies a very simple rule :

    Everything else is a pointer

    In other words, SWIG manipulates everything else by reference. This model makes sense because most C/C++ programs make heavy use of pointers and SWIG can use the type-checked pointer mechanism already present for handling pointers to basic datatypes.

    Although this probably sounds complicated, it's really quite simple. Suppose you have an interface file like this :

    %module fileio
    FILE *fopen(char *, char *);
    int fclose(FILE *);
    unsigned fread(void *ptr, unsigned size, unsigned nobj, FILE *);
    unsigned fwrite(void *ptr, unsigned size, unsigned nobj, FILE *);
    void *malloc(int nbytes);
    void free(void *);
    
    

    In this file, SWIG doesn't know what a FILE is, but since it's used as a pointer, so it doesn't really matter what it is. If you wrapped this module into Python, you can use the functions just like you expect :

    # Copy a file 
    def filecopy(source, target):
        f1 = fopen(source, "r")
        f2 = fopen(target, "w")
        buffer = malloc(8192)
        nbytes = fread(buffer, 8192, 1, f1)
        while (nbytes > 0):
            fwrite(buffer, 8192, 1, f2)
                nbytes = fread(buffer, 8192, 1, f1)
        free(buffer)
    

    In this case f1, f2, and buffer are all opaque objects containing C pointers. It doesn't matter what value they contain--our program works just fine without this knowledge.

    5.3.4 Undefined datatypes

    When SWIG encounters an undeclared datatype, it automatically assumes that it is a structure or class. For example, suppose the following function appeared in a SWIG input file:

    void matrix_multiply(Matrix *a, Matrix *b, Matrix *c);
    

    SWIG has no idea what a "Matrix" is. However, it is obviously a pointer to something so SWIG generates a wrapper using its generic pointer handling code.

    Unlike C or C++, SWIG does not actually care whether Matrix has been previously defined in the interface file or not. This allows SWIG to generate interfaces from only partial or limited information. In some cases, you may not care what a Matrix really is as long as you can pass an opaque reference to one around in the scripting language interface.

    An important detail to mention is that SWIG will gladly generate wrappers for an interface when there are unspecified type names. However, all unspecified types are internally handled as pointers to structures or classes! For example, consider the following declaration:

    void foo(size_t num);
    

    If size_t is undeclared, SWIG generates wrappers that expect to receive a type of size_t * (this mapping is described shortly). As a result, the scripting interface might behave strangely. For example:

    foo(40);
    TypeError: expected a _p_size_t.
    

    The only way to fix this problem is to make sure you properly declare type names using typedef.

    5.3.5 Typedef

    Like C, typedef can be used to define new type names in SWIG. For example:

    typedef unsigned int size_t;
    

    typedef definitions appearing in a SWIG interface are not propagated to the generated wrapper code. Therefore, they either need to be defined in an included header file or placed in the declarations section like this:

    %{
    /* Include in the generated wrapper file */
    typedef unsigned int size_t;
    %}
    /* Tell SWIG about it */
    typedef unsigned int size_t;
    

    or

    %inline %{
    typedef unsigned int size_t;
    %}
    

    In certain cases, you might be able to include other header files to collect type information. For example:

    %module example
    %import "sys/types.h"
    

    In this case, you might run SWIG as follows:

    $ swig -I/usr/include -includeall example.i
    

    It should be noted that your mileage will vary greatly here. System headers are notoriously complicated and may rely upon a variety of non-standard C coding extensions (e.g., such as special directives to GCC). Unless you exactly specify the right include directories and preprocessor symbols, this may not work correctly (you will have to experiment).

    SWIG tracks typedef declarations and uses this information for run-time type checking. For instance, if you use the above typedef and had the following function declaration:

    void foo(unsigned int *ptr);
    

    The corresponding wrapper function will accept arguments of type unsigned int * or size_t *.

    5.4 Other Practicalities

    So far, this chapter has presented almost everything you need to know to use SWIG for simple interfaces. However, some C programs use idioms that are somewhat more difficult to map to a scripting language interface. This section describes some of these issues.

    5.4.1 Passing structures by value

    Sometimes a C function takes structure parameters that are passed by value. For example, consider the following function:

    double dot_product(Vector a, Vector b);
    

    To deal with this, SWIG transforms the function to use pointers by creating a wrapper equivalent to the following:

    double wrap_dot_product(Vector *a, Vector *b) {
      Vector x = *a;
      Vector y = *b;
      return dot_product(x, y);
    }
    

    In the target language, the dot_product() function now accepts pointers to Vectors instead of Vectors. For the most part, this transformation is transparent so you might not notice.

    5.4.2 Return by value

    C functions that return structures or classes datatypes by value are more difficult to handle. Consider the following function:

    Vector cross_product(Vector v1, Vector v2);
    

    This function wants to return Vector, but SWIG only really supports pointers. As a result, SWIG creates a wrapper like this:

    Vector *wrap_cross_product(Vector *v1, Vector *v2) {
      Vector x = *v1;
      Vector y = *v2;
      Vector *result;
      result = (Vector *) malloc(sizeof(Vector));
      *(result) = cross(x, y);
      return result;
    }
    

    or if SWIG was run with the -c++ option:

    Vector *wrap_cross(Vector *v1, Vector *v2) {
      Vector x = *v1;
      Vector y = *v2;
      Vector *result = new Vector(cross(x, y)); // Uses default copy constructor
      return result;
    }
    

    In both cases, SWIG allocates a new object and returns a reference to it. It is up to the user to delete the returned object when it is no longer in use. Clearly, this will leak memory if you are unaware of the implicit memory allocation and don't take steps to free the result. That said, it should be noted that some language modules can now automatically track newly created objects and reclaim memory for you. Consult the documentation for each language module for more details.

    It should also be noted that the handling of pass/return by value in C++ has some special cases. For example, the above code fragments don't work correctly if Vector doesn't define a default constructor. The section on SWIG and C++ has more information about this case.

    5.4.3 Linking to structure variables

    When global variables or class members involving structures are encountered, SWIG handles them as pointers. For example, a global variable like this

    Vector unit_i;
    

    gets mapped to an underlying pair of set/get functions like this :

    Vector *unit_i_get() {
      return &unit_i;
    }
    void unit_i_set(Vector *value) {
      unit_i = *value;
    }
    

    Again some caution is in order. A global variable created in this manner will show up as a pointer in the target scripting language. It would be an extremely bad idea to free or destroy such a pointer. Also, C++ classes must supply a properly defined copy constructor in order for assignment to work correctly.

    5.4.4 Linking to char *

    When a global variable of type char * appears, SWIG uses malloc() or new to allocate memory for the new value. Specifically, if you have a variable like this

    char *foo;
    

    SWIG generates the following code:

    /* C mode */
    void foo_set(char *value) {
      if (foo) free(foo);
      foo = (char *) malloc(strlen(value)+1);
      strcpy(foo, value);
    }
    
    /* C++ mode.  When -c++ option is used */
    void foo_set(char *value) {
      if (foo) delete [] foo;
      foo = new char[strlen(value)+1];
      strcpy(foo, value);
    }
    

    If this is not the behavior that you want, consider making the variable read-only using the %immutable directive. Alternatively, you might write a short assist-function to set the value exactly like you want. For example:

    %inline %{
      void set_foo(char *value) {
        strncpy(foo, value, 50);
      }
    %}
    

    Note: If you write an assist function like this, you will have to call it as a function from the target scripting language (it does not work like a variable). For example, in Python you will have to write:

    >>> set_foo("Hello World")
    

    A common mistake with char * variables is to link to a variable declared like this:

    char *VERSION = "1.0";
    

    In this case, the variable will be readable, but any attempt to change the value results in a segmentation or general protection fault. This is due to the fact that SWIG is trying to release the old value using free or delete when the string literal value currently assigned to the variable wasn't allocated using malloc() or new. To fix this behavior, you can either mark the variable as read-only, write a typemap (as described in Chapter 6), or write a special set function as shown. Another alternative is to declare the variable as an array:

    char VERSION[64] = "1.0";
    

    When variables of type const char * are declared, SWIG still generates functions for setting and getting the value. However, the default behavior does not release the previous contents (resulting in a possible memory leak). In fact, you may get a warning message such as this when wrapping such a variable:

    example.i:20. Typemap warning. Setting const char * variable may leak memory
    

    The reason for this behavior is that const char * variables are often used to point to string literals. For example:

    const char *foo = "Hello World\n";
    

    Therefore, it's a really bad idea to call free() on such a pointer. On the other hand, it is legal to change the pointer to point to some other value. When setting a variable of this type, SWIG allocates a new string (using malloc or new) and changes the pointer to point to the new value. However, repeated modifications of the value will result in a memory leak since the old value is not released.

    5.4.5 Arrays

    Arrays are fully supported by SWIG, but they are always handled as pointers instead of mapping them to a special array object or list in the target language. Thus, the following declarations :

    int foobar(int a[40]);
    void grok(char *argv[]);
    void transpose(double a[20][20]);
    

    are processed as if they were really declared like this:

    int foobar(int *a);
    void grok(char **argv);
    void transpose(double (*a)[20]);
    

    Like C, SWIG does not perform array bounds checking. It is up to the user to make sure the pointer points to a suitably allocated region of memory.

    Multi-dimensional arrays are transformed into a pointer to an array of one less dimension. For example:

    int [10];         // Maps to int *
    int [10][20];     // Maps to int (*)[20]
    int [10][20][30]; // Maps to int (*)[20][30]
    

    It is important to note that in the C type system, a multidimensional array a[][] is NOT equivalent to a single pointer *a or a double pointer such as **a. Instead, a pointer to an array is used (as shown above) where the actual value of the pointer is the starting memory location of the array. The reader is strongly advised to dust off their C book and re-read the section on arrays before using them with SWIG.

    Array variables are supported, but are read-only by default. For example:

    int   a[100][200];
    

    In this case, reading the variable 'a' returns a pointer of type int (*)[200] that points to the first element of the array &a[0][0]. Trying to modify 'a' results in an error. This is because SWIG does not know how to copy data from the target language into the array. To work around this limitation, you may want to write a few simple assist functions like this:

    %inline %{
    void a_set(int i, int j, int val) {
      a[i][j] = val;
    }
    int a_get(int i, int j) {
      return a[i][j];
    }
    %}
    

    To dynamically create arrays of various sizes and shapes, it may be useful to write some helper functions in your interface. For example:

    // Some array helpers
    %inline %{
      /* Create any sort of [size] array */
      int *int_array(int size) {
        return (int *) malloc(size*sizeof(int));
      }
      /* Create a two-dimension array [size][10] */
      int (*int_array_10(int size))[10] {
        return (int (*)[10]) malloc(size*10*sizeof(int));
      }
    %}
    

    Arrays of char are handled as a special case by SWIG. In this case, strings in the target language can be stored in the array. For example, if you have a declaration like this,

    char pathname[256];
    

    SWIG generates functions for both getting and setting the value that are equivalent to the following code:

    char *pathname_get() {
      return pathname;
    }
    void pathname_set(char *value) {
      strncpy(pathname, value, 256);
    }
    

    In the target language, the value can be set like a normal variable.

    5.4.6 Creating read-only variables

    A read-only variable can be created by using the %immutable directive as shown :

    // File : interface.i
    
    int a;       // Can read/write
    %immutable;
    int b, c, d;   // Read only variables
    %mutable;
    double x, y;  // read/write
    

    The %immutable directive enables read-only mode until it is explicitly disabled using the %mutable directive. As an alternative to turning read-only mode off and on like this, individual declarations can also be tagged as immutable. For example:

    %immutable x;                   // Make x read-only
    ...
    double x;                       // Read-only (from earlier %immutable directive)
    double y;                       // Read-write
    ...
    

    The %mutable and %immutable directives are actually %feature directives defined like this:

    #define %immutable   %feature("immutable")
    #define %mutable     %feature("immutable", "")
    

    If you wanted to make all wrapped variables read-only, barring one or two, it might be easier to take this approach:

    %immutable;                     // Make all variables read-only
    %feature("immutable", "0") x;   // except, make x read/write
    ...
    double x;
    double y;
    double z;
    ...
    

    Read-only variables are also created when declarations are declared as const. For example:

    const int foo;               /* Read only variable */
    char * const version="1.0";  /* Read only variable */
    

    Compatibility note: Read-only access used to be controlled by a pair of directives %readonly and %readwrite. Although these directives still work, they generate a warning message. Simply change the directives to %immutable; and %mutable; to silence the warning. Don't forget the extra semicolon!

    5.4.7 Renaming and ignoring declarations

    5.4.7.1 Simple renaming of specific identifiers

    Normally, the name of a C declaration is used when that declaration is wrapped into the target language. However, this may generate a conflict with a keyword or already existing function in the scripting language. To resolve a name conflict, you can use the %rename directive as shown :

    // interface.i
    
    %rename(my_print) print;
    extern void print(const char *);
    
    %rename(foo) a_really_long_and_annoying_name;
    extern int a_really_long_and_annoying_name;
    
    

    SWIG still calls the correct C function, but in this case the function print() will really be called "my_print()" in the target language.

    The placement of the %rename directive is arbitrary as long as it appears before the declarations to be renamed. A common technique is to write code for wrapping a header file like this:

    // interface.i
    
    %rename(my_print) print;
    %rename(foo) a_really_long_and_annoying_name;
    
    %include "header.h"
    

    %rename applies a renaming operation to all future occurrences of a name. The renaming applies to functions, variables, class and structure names, member functions, and member data. For example, if you had two-dozen C++ classes, all with a member function named `print' (which is a keyword in Python), you could rename them all to `output' by specifying :

    %rename(output) print; // Rename all `print' functions to `output'
    

    SWIG does not normally perform any checks to see if the functions it wraps are already defined in the target scripting language. However, if you are careful about namespaces and your use of modules, you can usually avoid these problems.

    When wrapping C code, simple use of identifiers/symbols with %rename usually suffices. When wrapping C++ code, simple use of simple identifiers/symbols with %rename might be too limiting when using C++ features such as function overloading, default arguments, namespaces, template specialization etc. If you are using the %rename directive and C++, make sure you read the SWIG and C++ chapter and in particular the section on Renaming and ambiguity resolution for method overloading and default arguments.

    Closely related to %rename is the %ignore directive. %ignore instructs SWIG to ignore declarations that match a given identifier. For example:

    %ignore print;         // Ignore all declarations named print
    %ignore MYMACRO;       // Ignore a macro
    ...
    #define MYMACRO 123
    void print(const char *);
    ...
    

    Any function, variable etc which matches %ignore will not be wrapped and therefore will not be available from the target language. A common usage of %ignore is to selectively remove certain declarations from a header file without having to add conditional compilation to the header. However, it should be stressed that this only works for simple declarations. If you need to remove a whole section of problematic code, the SWIG preprocessor should be used instead.

    Compatibility note: Older versions of SWIG provided a special %name directive for renaming declarations. For example:

    %name(output) extern void print(const char *);
    

    This directive is still supported, but it is deprecated and should probably be avoided. The %rename directive is more powerful and better supports wrapping of raw header file information.

    5.4.7.2 Advanced renaming support

    While writing %rename for specific declarations is simple enough, sometimes the same renaming rule needs to be applied to many, maybe all, identifiers in the SWIG input. For example, it may be necessary to apply some transformation to all the names in the target language to better follow its naming conventions, like adding a specific prefix to all wrapped functions. Doing it individually for each function is impractical so SWIG supports applying a renaming rule to all declarations if the name of the identifier to be renamed is not specified:

    %rename("myprefix_%s") ""; // print -> myprefix_print
    

    This also shows that the argument of %rename doesn't have to be a literal string but can be a printf()-like format string. In the simplest form, "%s" is replaced with the name of the original declaration, as shown above. However this is not always enough and SWIG provides extensions to the usual format string syntax to allow applying a (SWIG-defined) function to the argument. For example, to wrap all C functions do_something_long() as more Java-like doSomethingLong() you can use the "lowercamelcase" extended format specifier like this:

    %rename("%(lowercamelcase)s") ""; // foo_bar -> fooBar; FooBar -> fooBar
    

    Some functions can be parametrized, for example the "strip" one strips the provided prefix from its argument. The prefix is specified as part of the format string, following a colon after the function name:

    %rename("%(strip:[wx])s") ""; // wxHello -> Hello; FooBar -> FooBar
    

    Below is the table summarizing all currently defined functions with an example of applying each one. Note that some of them have two names, a shorter one and a more descriptive one, but the two functions are otherwise equivalent:

    FunctionReturnsExample (in/out)
    uppercase or upperUpper case version of the string.PrintPRINT
    lowercase or lowerLower case version of the string.Printprint
    titleString with first letter capitalized and the rest in lower case.printPrint
    firstuppercaseString with the first letter capitalized and the rest unchanged.printIt PrintIt
    firstlowercaseString with the first letter in lower case and the rest unchanged.PrintIt printIt
    camelcase or ctitleString with capitalized first letter and any letter following an underscore (which are removed in the process) and rest in lower case. print_itPrintIt
    lowercamelcase or lctitleString with every letter following an underscore (which is removed in the process) capitalized and rest, including the first letter, in lower case. print_itprintIt
    undercase or utitleLower case string with underscores inserted before every upper case letter in the original string and any number not at the end of string. Logically, this is the reverse of camelcase.PrintIt print_it
    schemifyString with all underscores replaced with dashes, resulting in more Lispers/Schemers-pleasing name. print_itprint-it
    strip:[prefix]String without the given prefix or the original string if it doesn't start with this prefix. Note that square brackets should be used literally, e.g. %rename("strip:[wx]")wxPrintPrint
    rstrip:[suffix]String without the given suffix or the original string if it doesn't end with this suffix. Note that square brackets should be used literally, e.g. %rename("rstrip:[Cls]")PrintClsPrint
    regex:/pattern/subst/ String after (Perl-like) regex substitution operation. This function allows to apply arbitrary regular expressions to the identifier names. The pattern part is a regular expression in Perl syntax (as supported by the Perl Compatible Regular Expressions (PCRE)) library and the subst string can contain back-references of the form \N where N is a digit from 0 to 9, or one of the following escape sequences: \l, \L, \u, \U or \E. The back-references are replaced with the contents of the corresponding capture group while the escape sequences perform the case conversion in the substitution string: \l and \L convert to the lower case, while \u and \U convert to the upper case. The difference between the elements of each pair is that \l and \u change the case of the next character only, while \L and \U do it for all the remaining characters or until \E is encountered. Finally please notice that backslashes need to be escaped in C strings, so in practice "\\" must be used in all these escape sequences. For example, to remove any alphabetic prefix before an underscore and capitalize the remaining part you could use the following directive: %rename("regex:/(\\w+)_(.*)/\\u\\2/") prefix_printPrint
    command:cmdOutput of an external command cmd with the string passed to it as input. Notice that this function is extremely slow compared to all the other ones as it involves spawning a separate process and using it for many declarations is not recommended. The cmd is not enclosed in square brackets but must be terminated with a triple '<' sign, e.g. %rename("command:tr -d aeiou <<<") (nonsensical example removing all vowels)PrintPrnt

    The most general function of all of the above ones (not counting command which is even more powerful in principle but which should generally be avoided because of performance considerations) is the regex one. Here are some more examples of its use:

    // Strip the wx prefix from all identifiers except those starting with wxEVT
    %rename("%(regex:/wx(?!EVT)(.*)/\\1/)s") ""; // wxSomeWidget -> SomeWidget
                                                 // wxEVT_PAINT -> wxEVT_PAINT
    
    // Apply a rule for renaming the enum elements to avoid the common prefixes
    // which are redundant in C#/Java
    %rename("%(regex:/^([A-Z][a-z]+)+_(.*)/\\2/)s", %$isenumitem) ""; // Colour_Red -> Red
    
    // Remove all "Set/Get" prefixes.
    %rename("%(regex:/^(Set|Get)(.*)/\\2/)s") ""; // SetValue -> Value
                                                  // GetValue -> Value
    

    As before, everything that was said above about %rename also applies to %ignore. In fact, the latter is just a special case of the former and ignoring an identifier is the same as renaming it to the special "$ignore" value. So the following snippets

    %ignore print;
    

    and

    %rename("$ignore") print;
    

    are exactly equivalent and %rename can be used to selectively ignore multiple declarations using the previously described matching possibilities.

    5.4.7.3 Limiting global renaming rules

    As explained in the previous sections, it is possible to either rename individual declarations or apply a rename rule to all of them at once. In practice, the latter is however rarely appropriate as there are always some exceptions to the general rules. To deal with them, the scope of an unnamed %rename can be limited using subsequent match parameters. They can be applied to any of the attributes associated by SWIG with the declarations appearing in its input. For example:

    %rename("foo", match$name="bar") "";
    

    can be used to achieve the same effect as the simpler

    %rename("foo") bar;
    

    and so is not very interesting on its own. However match can also be applied to the declaration type, for example match="class" restricts the match to class declarations only (in C++) and match="enumitem" restricts it to the enum elements. SWIG also provides convenience macros for such match expressions, for example

    %rename("%(title)s", %$isenumitem) "";
    

    will capitalize the names of all the enum elements but not change the case of the other declarations. Similarly, %$isclass, %$isfunction, %$isconstructor, %$isunion, %$istemplate, and %$isvariable can be used. Many other checks are possible and this documentation is not exhaustive, see the "%rename predicates" section in swig.swg for the full list of supported match expressions.

    In addition to literally matching some string with match you can also use regexmatch or notregexmatch to match a string against a regular expression. For example, to ignore all functions having "Old" as a suffix you could use

    %rename("$ignore", regexmatch$name="Old$") "";
    

    For simple cases like this, specifying the regular expression for the declaration name directly can be preferable and can also be done using regextarget:

    %rename("$ignore", regextarget=1) "Old$";
    

    Notice that the check is done only against the name of the declaration itself, if you need to match the full name of a C++ declaration you must use fullname attribute:

    %rename("$ignore", regextarget=1, fullname=1) "NameSpace::ClassName::.*Old$";
    

    As for notregexmatch, it restricts the match only to the strings not matching the specified regular expression. So to rename all declarations to lower case except those consisting of capital letters only:

    %rename("$(lower)s", notregexmatch$name="^[A-Z]+$") "";
    

    Finally, variants of %rename and %ignore directives can be used to help wrap C++ overloaded functions and methods or C++ methods which use default arguments. This is described in the Renaming and ambiguity resolution section in the C++ chapter.

    5.4.7.4 Ignoring everything then wrapping a few selected symbols

    Using the techniques described above it is possible to ignore everything in a header and then selectively wrap a few chosen methods or classes. For example, consider a header, myheader.h which has many classes in it and just the one class called Star is wanted within this header, the following approach could be taken:

    %ignore ""; // Ignore everything
    
    // Unignore chosen class 'Star'
    %rename("%s") Star;
    
    // As the ignore everything will include the constructor, destructor, methods etc
    // in the class, these have to be explicitly unignored too:
    %rename("%s") Star::Star;
    %rename("%s") Star::~Star;
    %rename("%s") Star::shine; // named method
    
    %include "myheader.h"
    

    Another approach which might be more suitable as it does not require naming all the methods in the chosen class is to begin by ignoring just the classes. This does not add an explicit ignore to any members of the class, so when the chosen class is unignored, all of its methods will be wrapped.

    %rename($ignore, %$isclass) ""; // Only ignore all classes
    %rename("%s") Star; // Unignore 'Star'
    %include "myheader.h"
    

    5.4.8 Default/optional arguments

    SWIG supports default arguments in both C and C++ code. For example:

    int plot(double x, double y, int color=WHITE);
    

    In this case, SWIG generates wrapper code where the default arguments are optional in the target language. For example, this function could be used in Tcl as follows :

    % plot -3.4 7.5    # Use default value
    % plot -3.4 7.5 10 # set color to 10 instead
    
    

    Although the ISO C standard does not allow default arguments, default arguments specified in a SWIG interface work with both C and C++.

    Note: There is a subtle semantic issue concerning the use of default arguments and the SWIG generated wrapper code. When default arguments are used in C code, the default values are emitted into the wrappers and the function is invoked with a full set of arguments. This is different to when wrapping C++ where an overloaded wrapper method is generated for each defaulted argument. Please refer to the section on default arguments in the C++ chapter for further details.

    5.4.9 Pointers to functions and callbacks

    Occasionally, a C library may include functions that expect to receive pointers to functions--possibly to serve as callbacks. SWIG provides full support for function pointers when the callback functions are defined in C and not in the target language. For example, consider a function like this:

    int binary_op(int a, int b, int (*op)(int, int));
    

    When you first wrap something like this into an extension module, you may find the function to be impossible to use. For instance, in Python:

    >>> def add(x, y):
    ...     return x+y
    ...
    >>> binary_op(3, 4, add)
    Traceback (most recent call last):
      File "<stdin>", line 1, in ?
    TypeError: Type error. Expected _p_f_int_int__int
    >>>
    

    The reason for this error is that SWIG doesn't know how to map a scripting language function into a C callback. However, existing C functions can be used as arguments provided you install them as constants. One way to do this is to use the %constant directive like this:

    /* Function with a callback */
    int binary_op(int a, int b, int (*op)(int, int));
    
    /* Some callback functions */
    %constant int add(int, int);
    %constant int sub(int, int);
    %constant int mul(int, int);
    

    In this case, add, sub, and mul become function pointer constants in the target scripting language. This allows you to use them as follows:

    >>> binary_op(3, 4, add)
    7
    >>> binary_op(3, 4, mul)
    12
    >>>
    

    Unfortunately, by declaring the callback functions as constants, they are no longer accessible as functions. For example:

    >>> add(3, 4)
    Traceback (most recent call last):
      File "<stdin>", line 1, in ?
    TypeError: object is not callable: '_ff020efc_p_f_int_int__int'
    >>>
    

    If you want to make a function available as both a callback function and a function, you can use the %callback and %nocallback directives like this:

    /* Function with a callback */
    int binary_op(int a, int b, int (*op)(int, int));
    
    /* Some callback functions */
    %callback("%s_cb");
    int add(int, int);
    int sub(int, int);
    int mul(int, int);
    %nocallback;
    

    The argument to %callback is a printf-style format string that specifies the naming convention for the callback constants (%s gets replaced by the function name). The callback mode remains in effect until it is explicitly disabled using %nocallback. When you do this, the interface now works as follows:

    >>> binary_op(3, 4, add_cb)
    7
    >>> binary_op(3, 4, mul_cb)
    12
    >>> add(3, 4)
    7
    >>> mul(3, 4)
    12
    

    Notice that when the function is used as a callback, special names such as add_cb are used instead. To call the function normally, just use the original function name such as add().

    SWIG provides a number of extensions to standard C printf formatting that may be useful in this context. For instance, the following variation installs the callbacks as all upper case constants such as ADD, SUB, and MUL:

    /* Some callback functions */
    %callback("%(uppercase)s");
    int add(int, int);
    int sub(int, int);
    int mul(int, int);
    %nocallback;
    

    A format string of "%(lowercase)s" converts all characters to lower case. A string of "%(title)s" capitalizes the first character and converts the rest to lower case.

    And now, a final note about function pointer support. Although SWIG does not normally allow callback functions to be written in the target language, this can be accomplished with the use of typemaps and other advanced SWIG features. See the Typemaps chapter for more about typemaps and individual target language chapters for more on callbacks. The 'director' feature can be used to make callbacks from C/C++ into the target language, see Callbacks to the target language.

    5.5 Structures and unions

    This section describes the behavior of SWIG when processing ISO C structures and union declarations. Extensions to handle C++ are described in the next section.

    If SWIG encounters the definition of a structure or union, it creates a set of accessor functions. Although SWIG does not need structure definitions to build an interface, providing definitions makes it possible to access structure members. The accessor functions generated by SWIG simply take a pointer to an object and allow access to an individual member. For example, the declaration :

    struct Vector {
      double x, y, z;
    }
    
    

    gets transformed into the following set of accessor functions :

    double Vector_x_get(struct Vector *obj) {
      return obj->x;
    }
    double Vector_y_get(struct Vector *obj) { 
      return obj->y;
    }
    double Vector_z_get(struct Vector *obj) { 
      return obj->z;
    }
    void Vector_x_set(struct Vector *obj, double value) {
      obj->x = value;
    }
    void Vector_y_set(struct Vector *obj, double value) {
      obj->y = value;
    }
    void Vector_z_set(struct Vector *obj, double value) {
      obj->z = value;
    }
    

    In addition, SWIG creates default constructor and destructor functions if none are defined in the interface. For example:

    struct Vector *new_Vector() {
      return (Vector *) calloc(1, sizeof(struct Vector));
    }
    void delete_Vector(struct Vector *obj) {
      free(obj);
    }
    

    Using these low-level accessor functions, an object can be minimally manipulated from the target language using code like this:

    v = new_Vector()
    Vector_x_set(v, 2)
    Vector_y_set(v, 10)
    Vector_z_set(v, -5)
    ...
    delete_Vector(v)
    

    However, most of SWIG's language modules also provide a high-level interface that is more convenient. Keep reading.

    5.5.1 Typedef and structures

    SWIG supports the following construct which is quite common in C programs :

    typedef struct {
      double x, y, z;
    } Vector;
    
    

    When encountered, SWIG assumes that the name of the object is `Vector' and creates accessor functions like before. The only difference is that the use of typedef allows SWIG to drop the struct keyword on its generated code. For example:

    double Vector_x_get(Vector *obj) {
      return obj->x;
    }
    

    If two different names are used like this :

    typedef struct vector_struct {
      double x, y, z;
    } Vector;
    
    

    the name Vector is used instead of vector_struct since this is more typical C programming style. If declarations defined later in the interface use the type struct vector_struct, SWIG knows that this is the same as Vector and it generates the appropriate type-checking code.

    5.5.2 Character strings and structures

    Structures involving character strings require some care. SWIG assumes that all members of type char * have been dynamically allocated using malloc() and that they are NULL-terminated ASCII strings. When such a member is modified, the previous contents will be released, and the new contents allocated. For example :

    %module mymodule
    ...
    struct Foo {
      char *name;
      ...
    }
    
    

    This results in the following accessor functions :

    char *Foo_name_get(Foo *obj) {
      return Foo->name;
    }
    
    char *Foo_name_set(Foo *obj, char *c) {
      if (obj->name)
        free(obj->name);
      obj->name = (char *) malloc(strlen(c)+1);
      strcpy(obj->name, c);
      return obj->name;
    }
    

    If this behavior differs from what you need in your applications, the SWIG "memberin" typemap can be used to change it. See the typemaps chapter for further details.

    Note: If the -c++ option is used, new and delete are used to perform memory allocation.

    5.5.3 Array members

    Arrays may appear as the members of structures, but they will be read-only. SWIG will write an accessor function that returns the pointer to the first element of the array, but will not write a function to change the contents of the array itself. When this situation is detected, SWIG may generate a warning message such as the following :

    interface.i:116. Warning. Array member will be read-only
    

    To eliminate the warning message, typemaps can be used, but this is discussed in a later chapter. In many cases, the warning message is harmless.

    5.5.4 Structure data members

    Occasionally, a structure will contain data members that are themselves structures. For example:

    typedef struct Foo {
      int x;
    } Foo;
    
    typedef struct Bar {
      int y;
      Foo f;           /* struct member */
    } Bar;
    

    When a structure member is wrapped, it is handled as a pointer, unless the %naturalvar directive is used where it is handled more like a C++ reference (see C++ Member data). The accessors to the member variable as a pointer are effectively wrapped as follows:

    Foo *Bar_f_get(Bar *b) {
      return &b->f;
    }
    void Bar_f_set(Bar *b, Foo *value) {
      b->f = *value;
    }
    

    The reasons for this are somewhat subtle but have to do with the problem of modifying and accessing data inside the data member. For example, suppose you wanted to modify the value of f.x of a Bar object like this:

    Bar *b;
    b->f.x = 37;
    

    Translating this assignment to function calls (as would be used inside the scripting language interface) results in the following code:

    Bar *b;
    Foo_x_set(Bar_f_get(b), 37);
    

    In this code, if the Bar_f_get() function were to return a Foo instead of a Foo *, then the resulting modification would be applied to a copy of f and not the data member f itself. Clearly that's not what you want!

    It should be noted that this transformation to pointers only occurs if SWIG knows that a data member is a structure or class. For instance, if you had a structure like this,

    struct Foo {
      WORD   w;
    };
    

    and nothing was known about WORD, then SWIG will generate more normal accessor functions like this:

    WORD Foo_w_get(Foo *f) {
      return f->w;
    }
    void Foo_w_set(FOO *f, WORD value) {
      f->w = value;
    }
    

    Compatibility Note: SWIG-1.3.11 and earlier releases transformed all non-primitive member datatypes to pointers. Starting in SWIG-1.3.12, this transformation only occurs if a datatype is known to be a structure, class, or union. This is unlikely to break existing code. However, if you need to tell SWIG that an undeclared datatype is really a struct, simply use a forward struct declaration such as "struct Foo;".

    5.5.5 C constructors and destructors

    When wrapping structures, it is generally useful to have a mechanism for creating and destroying objects. If you don't do anything, SWIG will automatically generate functions for creating and destroying objects using malloc() and free(). Note: the use of malloc() only applies when SWIG is used on C code (i.e., when the -c++ option is not supplied on the command line). C++ is handled differently.

    If you don't want SWIG to generate default constructors for your interfaces, you can use the %nodefaultctor directive or the -nodefaultctor command line option. For example:

    swig -nodefaultctor example.i 
    

    or

    %module foo
    ...
    %nodefaultctor;        // Don't create default constructors
    ... declarations ...
    %clearnodefaultctor;   // Re-enable default constructors
    

    If you need more precise control, %nodefaultctor can selectively target individual structure definitions. For example:

    %nodefaultctor Foo;      // No default constructor for Foo
    ...
    struct Foo {             // No default constructor generated.
    };
    
    struct Bar {             // Default constructor generated.
    };
    

    Since ignoring the implicit or default destructors most of the time produces memory leaks, SWIG will always try to generate them. If needed, however, you can selectively disable the generation of the default/implicit destructor by using %nodefaultdtor

    %nodefaultdtor Foo; // No default/implicit destructor for Foo
    ...
    struct Foo {              // No default destructor is generated.
    };
    
    struct Bar {              // Default destructor generated.
    };
    

    Compatibility note: Prior to SWIG-1.3.7, SWIG did not generate default constructors or destructors unless you explicitly turned them on using -make_default. However, it appears that most users want to have constructor and destructor functions so it has now been enabled as the default behavior.

    Note: There are also the -nodefault option and %nodefault directive, which disable both the default or implicit destructor generation. This could lead to memory leaks across the target languages, and it is highly recommended you don't use them.

    5.5.6 Adding member functions to C structures

    Most languages provide a mechanism for creating classes and supporting object oriented programming. From a C standpoint, object oriented programming really just boils down to the process of attaching functions to structures. These functions normally operate on an instance of the structure (or object). Although there is a natural mapping of C++ to such a scheme, there is no direct mechanism for utilizing it with C code. However, SWIG provides a special %extend directive that makes it possible to attach methods to C structures for purposes of building an object oriented interface. Suppose you have a C header file with the following declaration :

    /* file : vector.h */
    ...
    typedef struct Vector {
      double x, y, z;
    } Vector;
    
    

    You can make a Vector look a lot like a class by writing a SWIG interface like this:

    // file : vector.i
    %module mymodule
    %{
    #include "vector.h"
    %}
    
    %include "vector.h"          // Just grab original C header file
    %extend Vector {             // Attach these functions to struct Vector
      Vector(double x, double y, double z) {
        Vector *v;
        v = (Vector *) malloc(sizeof(Vector));
        v->x = x;
        v->y = y;
        v->z = z;
        return v;
      }
      ~Vector() {
        free($self);
      }
      double magnitude() {
        return sqrt($self->x*$self->x+$self->y*$self->y+$self->z*$self->z);
      }
      void print() {
        printf("Vector [%g, %g, %g]\n", $self->x, $self->y, $self->z);
      }
    };
    
    

    Note the usage of the $self special variable. Its usage is identical to a C++ 'this' pointer and should be used whenever access to the struct instance is required. Also note that C++ constructor and destructor syntax has been used to simulate a constructor and destructor, even for C code. There is one subtle difference to a normal C++ constructor implementation though and that is although the constructor declaration is as per a normal C++ constructor, the newly constructed object must be returned as if the constructor declaration had a return value, a Vector * in this case.

    Now, when used with proxy classes in Python, you can do things like this :

    >>> v = Vector(3, 4, 0)                 # Create a new vector
    >>> print v.magnitude()                # Print magnitude
    5.0
    >>> v.print()                  # Print it out
    [ 3, 4, 0 ]
    >>> del v                      # Destroy it
    

    The %extend directive can also be used inside the definition of the Vector structure. For example:

    // file : vector.i
    %module mymodule
    %{
    #include "vector.h"
    %}
    
    typedef struct Vector {
      double x, y, z;
      %extend {
        Vector(double x, double y, double z) { ... }
        ~Vector() { ... }
        ...
      }
    } Vector;
    

    Note that %extend can be used to access externally written functions provided they follow the naming convention used in this example :

    /* File : vector.c */
    /* Vector methods */
    #include "vector.h"
    Vector *new_Vector(double x, double y, double z) {
      Vector *v;
      v = (Vector *) malloc(sizeof(Vector));
      v->x = x;
      v->y = y;
      v->z = z;
      return v;
    }
    void delete_Vector(Vector *v) {
      free(v);
    }
    
    double Vector_magnitude(Vector *v) {
      return sqrt(v->x*v->x+v->y*v->y+v->z*v->z);
    }
    
    // File : vector.i
    // Interface file
    %module mymodule
    %{
    #include "vector.h"
    %}
    
    typedef struct Vector {
      double x, y, z;
      %extend {
        Vector(int, int, int); // This calls new_Vector()
        ~Vector();           // This calls delete_Vector()
        double magnitude();  // This will call Vector_magnitude()
        ...
      }
    } Vector;
    

    The name used for %extend should be the name of the struct and not the name of any typedef to the struct. For example:

    typedef struct Integer {
      int value;
    } Int;
    %extend Integer { ...  } /* Correct name */
    %extend Int { ...  } /* Incorrect name */
    
    struct Float {
      float value;
    };
    typedef struct Float FloatValue;
    %extend Float { ...  } /* Correct name */
    %extend FloatValue { ...  } /* Incorrect name */
    

    There is one exception to this rule and that is when the struct is anonymously named such as:

    typedef struct {
      double value;
    } Double;
    %extend Double { ...  } /* Okay */
    

    A little known feature of the %extend directive is that it can also be used to add synthesized attributes or to modify the behavior of existing data attributes. For example, suppose you wanted to make magnitude a read-only attribute of Vector instead of a method. To do this, you might write some code like this:

    // Add a new attribute to Vector
    %extend Vector {
      const double magnitude;
    }
    // Now supply the implementation of the Vector_magnitude_get function
    %{
    const double Vector_magnitude_get(Vector *v) {
      return (const double) sqrt(v->x*v->x+v->y*v->y+v->z*v->z);
    }
    %}
    
    

    Now, for all practical purposes, magnitude will appear like an attribute of the object.

    A similar technique can also be used to work with data members that you want to process. For example, consider this interface:

    typedef struct Person {
      char name[50];
      ...
    } Person;
    

    Say you wanted to ensure name was always upper case, you can rewrite the interface as follows to ensure this occurs whenever a name is read or written to:

    typedef struct Person {
      %extend {
        char name[50];
      }
      ...
    } Person;
    
    %{
    #include <string.h>
    #include <ctype.h>
    
    void make_upper(char *name) {
      char *c;
      for (c = name; *c; ++c)
        *c = (char)toupper((int)*c);
    }
    
    /* Specific implementation of set/get functions forcing capitalization */
    
    char *Person_name_get(Person *p) {
      make_upper(p->name);
      return p->name;
    }
    
    void Person_name_set(Person *p, char *val) {
      strncpy(p->name, val, 50);
      make_upper(p->name);
    }
    %}
    

    Finally, it should be stressed that even though %extend can be used to add new data members, these new members can not require the allocation of additional storage in the object (e.g., their values must be entirely synthesized from existing attributes of the structure or obtained elsewhere).

    Compatibility note: The %extend directive is a new name for the %addmethods directive. Since %addmethods could be used to extend a structure with more than just methods, a more suitable directive name has been chosen.

    5.5.7 Nested structures

    Occasionally, a C program will involve structures like this :

    typedef struct Object {
      int objtype;
      union {
        int ivalue;
        double dvalue;
        char *strvalue;
        void *ptrvalue;
      } intRep;
    } Object;
    
    

    When SWIG encounters this, it performs a structure splitting operation that transforms the declaration into the equivalent of the following:

    typedef union {
      int ivalue;
      double dvalue;
      char *strvalue;
      void *ptrvalue;
    } Object_intRep;
    
    typedef struct Object {
      int objType;
      Object_intRep intRep;
    } Object;
    
    

    SWIG will then create an Object_intRep structure for use inside the interface file. Accessor functions will be created for both structures. In this case, functions like this would be created :

    Object_intRep *Object_intRep_get(Object *o) {
      return (Object_intRep *) &o->intRep;
    }
    int Object_intRep_ivalue_get(Object_intRep *o) {
      return o->ivalue;
    }
    int Object_intRep_ivalue_set(Object_intRep *o, int value) {
      return (o->ivalue = value);
    }
    double Object_intRep_dvalue_get(Object_intRep *o) {
      return o->dvalue;
    }
    ... etc ...
    
    

    Although this process is a little hairy, it works like you would expect in the target scripting language--especially when proxy classes are used. For instance, in Perl:

    # Perl5 script for accessing nested member
    $o = CreateObject();                    # Create an object somehow
    $o->{intRep}->{ivalue} = 7              # Change value of o.intRep.ivalue
    

    If you have a lot of nested structure declarations, it is advisable to double-check them after running SWIG. Although, there is a good chance that they will work, you may have to modify the interface file in certain cases.

    Finally, note that nesting is handled differently in C++ mode, see Nested classes.

    5.5.8 Other things to note about structure wrapping

    SWIG doesn't care if the declaration of a structure in a .i file exactly matches that used in the underlying C code (except in the case of nested structures). For this reason, there are no problems omitting problematic members or simply omitting the structure definition altogether. If you are happy passing pointers around, this can be done without ever giving SWIG a structure definition.

    Starting with SWIG1.3, a number of improvements have been made to SWIG's code generator. Specifically, even though structure access has been described in terms of high-level accessor functions such as this,

    double Vector_x_get(Vector *v) {
      return v->x;
    }
    

    most of the generated code is actually inlined directly into wrapper functions. Therefore, no function Vector_x_get() actually exists in the generated wrapper file. For example, when creating a Tcl module, the following function is generated instead:

    static int
    _wrap_Vector_x_get(ClientData clientData, Tcl_Interp *interp, 
                       int objc, Tcl_Obj *CONST objv[]) {
      struct Vector *arg1 ;
      double result ;
    
      if (SWIG_GetArgs(interp, objc, objv, "p:Vector_x_get self ", &arg0,
                       SWIGTYPE_p_Vector) == TCL_ERROR)
        return TCL_ERROR;
      result = (double ) (arg1->x);
      Tcl_SetObjResult(interp, Tcl_NewDoubleObj((double) result));
      return TCL_OK;
    }
    

    The only exception to this rule are methods defined with %extend . In this case, the added code is contained in a separate function.

    Finally, it is important to note that most language modules may choose to build a more advanced interface. Although you may never use the low-level interface described here, most of SWIG's language modules use it in some way or another.

    5.6 Code Insertion

    Sometimes it is necessary to insert special code into the resulting wrapper file generated by SWIG. For example, you may want to include additional C code to perform initialization or other operations. There are four common ways to insert code, but it's useful to know how the output of SWIG is structured first.

    5.6.1 The output of SWIG

    When SWIG creates its output C/C++ file, it is broken up into five sections corresponding to runtime code, headers, wrapper functions, and module initialization code (in that order).

    • Begin section.
      A placeholder for users to put code at the beginning of the C/C++ wrapper file. This is most often used to define preprocessor macros that are used in later sections.
    • Runtime code.
      This code is internal to SWIG and is used to include type-checking and other support functions that are used by the rest of the module.
    • Header section.
      This is user-defined support code that has been included by the %{ ... %} directive. Usually this consists of header files and other helper functions.
    • Wrapper code.
      These are the wrappers generated automatically by SWIG.
    • Module initialization.
      The function generated by SWIG to initialize the module upon loading.

    5.6.2 Code insertion blocks

    The %insert directive enables inserting blocks of code into a given section of the generated code. It can be used in one of two ways:

    %insert("section") "filename"
    %insert("section") %{ ... %}
    

    The first will dump the contents of the file in the given filename into the named section. The second inserts the code between the braces into the named section. For example, the following adds code into the runtime section:

    %insert("runtime") %{
      ... code in runtime section ...
    %}
    

    There are the 5 sections, however, some target languages add in additional sections and some of these result in code being generated into a target language file instead of the C/C++ wrapper file. These are documented when available in the target language chapters. Macros named after the code sections are available as additional directives and these macro directives are normally used instead of %insert . For example, %runtime is used instead of %insert("runtime"). The valid sections and order of the sections in the generated C/C++ wrapper file is as shown:

    %begin %{
      ... code in begin section ...
    %}
    
    %runtime %{
      ... code in runtime section ...
    %}
    
    %header %{
      ... code in header section ...
    %}
    
    %wrapper %{
      ... code in wrapper section ...
    %}
    
    %init %{
      ... code in init section ...
    %}
    

    The bare %{ ... %} directive is a shortcut that is the same as %header %{ ... %}.

    The %begin section is effectively empty as it just contains the SWIG banner by default. This section is provided as a way for users to insert code at the top of the wrapper file before any other code is generated. Everything in a code insertion block is copied verbatim into the output file and is not parsed by SWIG. Most SWIG input files have at least one such block to include header files and support C code. Additional code blocks may be placed anywhere in a SWIG file as needed.

    %module mymodule
    %{
    #include "my_header.h"
    %}
    ... Declare functions here
    %{
    
    void some_extra_function() {
      ...
    }
    %}
    

    A common use for code blocks is to write "helper" functions. These are functions that are used specifically for the purpose of building an interface, but which are generally not visible to the normal C program. For example :

    %{
    /* Create a new vector */
    static Vector *new_Vector() {
      return (Vector *) malloc(sizeof(Vector));
    }
    
    %}
    // Now wrap it 
    Vector *new_Vector();
    

    5.6.3 Inlined code blocks

    Since the process of writing helper functions is fairly common, there is a special inlined form of code block that is used as follows :

    %inline %{
    /* Create a new vector */
    Vector *new_Vector() {
      return (Vector *) malloc(sizeof(Vector));
    }
    %}
    

    This is the same as writing:

    %{
    /* Create a new vector */
    Vector *new_Vector() {
      return (Vector *) malloc(sizeof(Vector));
    }
    %}
    
    /* Create a new vector */
    Vector *new_Vector() {
      return (Vector *) malloc(sizeof(Vector));
    }
    

    In other words, the %inline directive inserts all of the code that follows verbatim into the header portion of an interface file. The code is then parsed by both the SWIG preprocessor and parser. Thus, the above example creates a new command new_Vector using only one declaration. Since the code inside an %inline %{ ... %} block is given to both the C compiler and SWIG, it is illegal to include any SWIG directives inside a %{ ... %} block.

    Note: The usual SWIG C preprocessor rules apply to code in %apply blocks when SWIG parses this code. For example, as mentioned earlier, SWIG's C Preprocessor does not follow #include directives by default.

    5.6.4 Initialization blocks

    When code is included in the %init section, it is copied directly into the module initialization function. For example, if you needed to perform some extra initialization on module loading, you could write this:

    %init %{
      init_variables();
    %}
    

    Please note that some language backends (e.g. C# or Java) don't have any initialization function, hence you should define a global object performing the necessary initialization for them instead:

    %init %{
      static struct MyInit { MyInit() { init_variables(); } } myInit;
    %}
    

    5.7 An Interface Building Strategy

    This section describes the general approach for building interfaces with SWIG. The specifics related to a particular scripting language are found in later chapters.

    5.7.1 Preparing a C program for SWIG

    SWIG doesn't require modifications to your C code, but if you feed it a collection of raw C header files or source code, the results might not be what you expect---in fact, they might be awful. Here's a series of steps you can follow to make an interface for a C program :

    • Identify the functions that you want to wrap. It's probably not necessary to access every single function of a C program--thus, a little forethought can dramatically simplify the resulting scripting language interface. C header files are a particularly good source for finding things to wrap.
    • Create a new interface file to describe the scripting language interface to your program.
    • Copy the appropriate declarations into the interface file or use SWIG's %include directive to process an entire C source/header file.
    • Make sure everything in the interface file uses ISO C/C++ syntax.
    • Make sure all necessary `typedef' declarations and type-information is available in the interface file. In particular, ensure that the type information is specified in the correct order as required by a C/C++ compiler. Most importantly, define a type before it is used! A C compiler will tell you if the full type information is not available if it is needed, whereas SWIG will usually not warn or error out as it is designed to work without full type information. However, if type information is not specified correctly, the wrappers can be sub-optimal and even result in uncompilable C/C++ code.
    • If your program has a main() function, you may need to rename it (read on).
    • Run SWIG and compile.

    Although this may sound complicated, the process turns out to be fairly easy once you get the hang of it.

    In the process of building an interface, SWIG may encounter syntax errors or other problems. The best way to deal with this is to simply copy the offending code into a separate interface file and edit it. However, the SWIG developers have worked very hard to improve the SWIG parser--you should report parsing errors to the swig-devel mailing list or to the SWIG bug tracker.

    5.7.2 The SWIG interface file

    The preferred method of using SWIG is to generate a separate interface file. Suppose you have the following C header file :

    /* File : header.h */
    
    #include <stdio.h>
    #include <math.h>
    
    extern int foo(double);
    extern double bar(int, int);
    extern void dump(FILE *f);
    
    

    A typical SWIG interface file for this header file would look like the following :

    /* File : interface.i */
    %module mymodule
    %{
    #include "header.h"
    %}
    extern int foo(double);
    extern double bar(int, int);
    extern void dump(FILE *f);
    
    

    Of course, in this case, our header file is pretty simple so we could use a simpler approach and use an interface file like this:

    /* File : interface.i */
    %module mymodule
    %{
    #include "header.h"
    %}
    %include "header.h"
    

    The main advantage of this approach is minimal maintenance of an interface file for when the header file changes in the future. In more complex projects, an interface file containing numerous %include and #include statements like this is one of the most common approaches to interface file design due to lower maintenance overhead.

    5.7.3 Why use separate interface files?

    Although SWIG can parse many header files, it is more common to write a special .i file defining the interface to a package. There are several reasons why you might want to do this:

    • It is rarely necessary to access every single function in a large package. Many C functions might have little or no use in a scripted environment. Therefore, why wrap them?
    • Separate interface files provide an opportunity to provide more precise rules about how an interface is to be constructed.
    • Interface files can provide more structure and organization.
    • SWIG can't parse certain definitions that appear in header files. Having a separate file allows you to eliminate or work around these problems.
    • Interface files provide a more precise definition of what the interface is. Users wanting to extend the system can go to the interface file and immediately see what is available without having to dig it out of header files.

    5.7.4 Getting the right header files

    Sometimes, it is necessary to use certain header files in order for the code generated by SWIG to compile properly. Make sure you include certain header files by using a %{ %} block like this:

    %module graphics
    %{
    #include <GL/gl.h>
    #include <GL/glu.h>
    %}
    
    // Put the rest of the declarations here
    ...
    

    5.7.5 What to do with main()

    If your program defines a main() function, you may need to get rid of it or rename it in order to use a scripting language. Most scripting languages define their own main() procedure that is called instead. main() also makes no sense when working with dynamic loading. There are a few approaches to solving the main() conflict :

    • Get rid of main() entirely.
    • Rename main() to something else. You can do this by compiling your C program with an option like -Dmain=oldmain.
    • Use conditional compilation to only include main() when not using a scripting language.

    Getting rid of main() may cause potential initialization problems of a program. To handle this problem, you may consider writing a special function called program_init() that initializes your program upon startup. This function could then be called either from the scripting language as the first operation, or when the SWIG generated module is loaded.

    As a general note, many C programs only use the main() function to parse command line options and to set parameters. However, by using a scripting language, you are probably trying to create a program that is more interactive. In many cases, the old main() program can be completely replaced by a Perl, Python, or Tcl script.

    Note: In some cases, you might be inclined to create a scripting language wrapper for main(). If you do this, the compilation will probably work and your module might even load correctly. The only trouble is that when you call your main() wrapper, you will find that it actually invokes the main() of the scripting language interpreter itself! This behavior is a side effect of the symbol binding mechanism used in the dynamic linker. The bottom line: don't do this.


    6 SWIG and C++

    This chapter describes SWIG's support for wrapping C++. It is mostly concerned about C++ as defined by the C++ 98 and 03 standards. For additions to the original C++ standard, please read the SWIG and C++11, SWIG and C++14 and SWIG and C++17 chapters. As a prerequisite, you should first read the chapter SWIG Basics to see how SWIG wraps ISO C. Support for C++ builds upon ISO C wrapping and that material will be useful in understanding this chapter.

    6.1 Comments on C++ Wrapping

    Because of its complexity and the fact that C++ can be difficult to integrate with itself let alone other languages, SWIG only provides support for a subset of C++ features. Fortunately, this is now a rather large subset.

    In part, the problem with C++ wrapping is that there is no semantically obvious (or automatic ) way to map many of its advanced features into other languages. As a simple example, consider the problem of wrapping C++ multiple inheritance to a target language with no such support. Similarly, the use of overloaded operators and overloaded functions can be problematic when no such capability exists in a target language.

    A more subtle issue with C++ has to do with the way that some C++ programmers think about programming libraries. In the world of SWIG, you are really trying to create binary-level software components for use in other languages. In order for this to work, a "component" has to contain real executable instructions and there has to be some kind of binary linking mechanism for accessing its functionality. In contrast, C++ has increasingly relied upon generic programming and templates for much of its functionality. Although templates are a powerful feature, they are largely orthogonal to the whole notion of binary components and libraries. For example, an STL vector does not define any kind of binary object for which SWIG can just create a wrapper. To further complicate matters, these libraries often utilize a lot of behind the scenes magic in which the semantics of seemingly basic operations (e.g., pointer dereferencing, procedure call, etc.) can be changed in dramatic and sometimes non-obvious ways. Although this "magic" may present few problems in a C++-only universe, it greatly complicates the problem of crossing language boundaries and provides many opportunities to shoot yourself in the foot. You will just have to be careful.

    6.2 Approach

    To wrap C++, SWIG uses a layered approach to code generation. At the lowest level, SWIG generates a collection of procedural ISO C style wrappers. These wrappers take care of basic type conversion, type checking, error handling, and other low-level details of the C++ binding. These wrappers are also sufficient to bind C++ into any target language that supports built-in procedures. In some sense, you might view this layer of wrapping as providing a C library interface to C++. On top of the low-level procedural (flattened) interface, SWIG generates proxy classes that provide a natural object-oriented (OO) interface to the underlying code. The proxy classes are typically written in the target language itself. For instance, in Python, a real Python class is used to provide a wrapper around the underlying C++ object.

    It is important to emphasize that SWIG takes a deliberately conservative and non-intrusive approach to C++ wrapping. SWIG does not encapsulate C++ classes inside a special C++ adaptor, it does not rely upon templates, nor does it add in additional C++ inheritance when generating wrappers. The last thing that most C++ programs need is even more compiler magic. Therefore, SWIG tries to maintain a very strict and clean separation between the implementation of your C++ application and the resulting wrapper code. You might say that SWIG has been written to follow the principle of least surprise--it does not play sneaky tricks with the C++ type system, it doesn't mess with your class hierarchies, and it doesn't introduce new semantics. Although this approach might not provide the most seamless integration with C++, it is safe, simple, portable, and debuggable.

    Some of this chapter focuses on the low-level procedural interface to C++ that is used as the foundation for all language modules. Keep in mind that the target languages also provide the high-level OO interface via proxy classes. More detailed coverage can be found in the documentation for each target language.

    6.3 Supported C++ features

    SWIG currently supports most C++ features including the following:

    • Classes
    • Constructors and destructors
    • Virtual functions
    • Public inheritance (including multiple inheritance)
    • Static functions
    • Function and method overloading
    • Operator overloading for many standard operators
    • References
    • Templates (including specialization and member templates)
    • Pointers to members
    • Namespaces
    • Default parameters
    • Smart pointers

    The following C++ features are not currently supported:

    • Overloaded versions of certain operators (new, delete, etc.)

    As a rule of thumb, SWIG should not be used on raw C++ source files, use header files only.

    SWIG's C++ support is an ongoing project so some of these limitations may be lifted in future releases. However, we make no promises. Also, submitting a bug report is a very good way to get problems fixed (wink).

    6.4 Command line options and compilation

    When wrapping C++ code, it is critical that SWIG be called with the `-c++' option. This changes the way a number of critical features such as memory management are handled. It also enables the recognition of C++ keywords. Without the -c++ flag, SWIG will either issue a warning or a large number of syntax errors if it encounters C++ code in an interface file.

    When compiling and linking the resulting wrapper file, it is normal to use the C++ compiler. For example:

    $ swig -c++ -tcl example.i
    $ c++ -fPIC -c example_wrap.cxx 
    $ c++ example_wrap.o $(OBJS) -o example.so
    

    Unfortunately, the process varies slightly on each platform. Make sure you refer to the documentation on each target language for further details. The SWIG Wiki also has further details.

    Compatibility Note: Early versions of SWIG generated just a flattened low-level C style API to C++ classes by default. The -noproxy commandline option is recognised by many target languages and will generate just this interface as in earlier versions.

    6.5 Proxy classes

    In order to provide a natural mapping from C++ classes to the target language classes, SWIG's target languages mostly wrap C++ classes with special proxy classes. These proxy classes are typically implemented in the target language itself. For example, if you're building a Python module, each C++ class is wrapped by a Python proxy class. Or if you're building a Java module, each C++ class is wrapped by a Java proxy class.

    6.5.1 Construction of proxy classes

    Proxy classes are always constructed as an extra layer of wrapping that uses low-level accessor functions. To illustrate, suppose you had a C++ class like this:

    class Foo {
      public:
        Foo();
        ~Foo();
        int  bar(int x);
        int  x;
    };
    

    Using C++ as pseudocode, a proxy class looks something like this:

    class FooProxy {
      private:
        Foo    *self;
      public:
        FooProxy() {
          self = new_Foo();
        }
        ~FooProxy() {
          delete_Foo(self);
        }
        int bar(int x) {
          return Foo_bar(self, x);
        }
        int x_get() {
          return Foo_x_get(self);
        }
        void x_set(int x) {
          Foo_x_set(self, x);
        }
    };
    

    Of course, always keep in mind that the real proxy class is written in the target language. For example, in Python, the proxy might look roughly like this:

    class Foo:
        def __init__(self):
            self.this = new_Foo()
        def __del__(self):
            delete_Foo(self.this)
        def bar(self, x):
            return Foo_bar(self.this, x)
        def __getattr__(self, name):
            if name == 'x':
                return Foo_x_get(self.this)
            ...
        def __setattr__(self, name, value):
            if name == 'x':
                Foo_x_set(self.this, value)
            ...
    

    Again, it's important to emphasize that the low-level accessor functions are always used by the proxy classes. Whenever possible, proxies try to take advantage of language features that are similar to C++. This might include operator overloading, exception handling, and other features.

    6.5.2 Resource management in proxies

    A major issue with proxies concerns the memory management of wrapped objects. Consider the following C++ code:

    class Foo {
    public:
      Foo();
      ~Foo();
      int bar(int x);
      int x;
    };
    
    class Spam {
    public:
      Foo *value;
      ...
    };
    

    Consider some script code that uses these classes:

    f = Foo()               # Creates a new Foo
    s = Spam()              # Creates a new Spam
    s.value = f             # Stores a reference to f inside s
    g = s.value             # Returns stored reference
    g = 4                   # Reassign g to some other value
    del f                   # Destroy f 
    

    Now, ponder the resulting memory management issues. When objects are created in the script, the objects are wrapped by newly created proxy classes. That is, there is both a new proxy class instance and a new instance of the underlying C++ class. In this example, both f and s are created in this way. However, the statement s.value is rather curious---when executed, a pointer to f is stored inside another object. This means that the scripting proxy class AND another C++ class share a reference to the same object. To make matters even more interesting, consider the statement g = s.value. When executed, this creates a new proxy class g that provides a wrapper around the C++ object stored in s.value . In general, there is no way to know where this object came from---it could have been created by the script, but it could also have been generated internally. In this particular example, the assignment of g results in a second proxy class for f. In other words, a reference to f is now shared by two proxy classes and a C++ class.

    Finally, consider what happens when objects are destroyed. In the statement, g=4, the variable g is reassigned. In many languages, this makes the old value of g available for garbage collection. Therefore, this causes one of the proxy classes to be destroyed. Later on, the statement del f destroys the other proxy class. Of course, there is still a reference to the original object stored inside another C++ object. What happens to it? Is the object still valid?

    To deal with memory management problems, proxy classes provide an API for controlling ownership. In C++ pseudocode, ownership control might look roughly like this:

    class FooProxy {
      public:
        Foo    *self;
        int     thisown;
    
        FooProxy() {
          self = new_Foo();
          thisown = 1;       // Newly created object
        }
        ~FooProxy() {
          if (thisown) delete_Foo(self);
        }
        ...
        // Ownership control API
        void disown() {
          thisown = 0;
        }
        void acquire() {
          thisown = 1;
        }
    };
    
    class FooPtrProxy: public FooProxy {
    public:
      FooPtrProxy(Foo *s) {
        self = s;
        thisown = 0;
      }
    };
    
    class SpamProxy {
      ...
      FooProxy *value_get() {
        return FooPtrProxy(Spam_value_get(self));
      }
      void value_set(FooProxy *v) {
        Spam_value_set(self, v->self);
        v->disown();
      }
      ...
    };
    

    Looking at this code, there are a few central features:

    • Each proxy class keeps an extra flag to indicate ownership. C++ objects are only destroyed if the ownership flag is set.
    • When new objects are created in the target language, the ownership flag is set.
    • When a reference to an internal C++ object is returned, it is wrapped by a proxy class, but the proxy class does not have ownership.
    • In certain cases, ownership is adjusted. For instance, when a value is assigned to the member of a class, ownership is lost.
    • Manual ownership control is provided by special disown() and acquire() methods.

    Given the tricky nature of C++ memory management, it is impossible for proxy classes to automatically handle every possible memory management problem. However, proxies do provide a mechanism for manual control that can be used (if necessary) to address some of the more tricky memory management problems.

    6.5.3 Language specific details

    Language specific details on proxy classes are contained in the chapters describing each target language. This chapter has merely introduced the topic in a very general way.

    6.6 Simple C++ wrapping

    The following code shows a SWIG interface file for a simple C++ class.

    %module list
    %{
    #include "list.h"
    %}
    
    // Very simple C++ example for linked list
    
    class List {
    public:
      List();
      ~List();
      int  search(char *value);
      void insert(char *);
      void remove(char *);
      char *get(int n);
      int  length;
    static void print(List *l);
    };
    

    To generate wrappers for this class, SWIG first reduces the class to a collection of low-level C-style accessor functions which are then used by the proxy classes.

    6.6.1 Constructors and destructors

    C++ constructors and destructors are translated into accessor functions such as the following :

    List * new_List(void) {
      return new List;
    }
    void delete_List(List *l) {
      delete l;
    }
    
    

    6.6.2 Default constructors, copy constructors and implicit destructors

    Following the C++ rules for implicit constructor and destructors, SWIG will automatically assume there is one even when they are not explicitly declared in the class interface.

    In general then:

    • If a C++ class does not declare any explicit constructor, SWIG will automatically generate a wrapper for one.
    • If a C++ class does not declare an explicit copy constructor, SWIG will automatically generate a wrapper for one if the %copyctor is used.
    • If a C++ class does not declare an explicit destructor, SWIG will automatically generate a wrapper for one.

    And as in C++, a few rules that alters the previous behavior:

    • A default constructor is not created if a class already defines a constructor with arguments.
    • Default constructors are not generated for classes with pure virtual methods or for classes that inherit from an abstract class, but don't provide definitions for all of the pure methods.
    • A default constructor is not created unless all base classes support a default constructor.
    • Default constructors and implicit destructors are not created if a class defines them in a private or protected section.
    • Default constructors and implicit destructors are not created if any base class defines a non-public default constructor or destructor.

    SWIG should never generate a default constructor, copy constructor or default destructor wrapper for a class in which it is illegal to do so. In some cases, however, it could be necessary (if the complete class declaration is not visible from SWIG, and one of the above rules is violated) or desired (to reduce the size of the final interface) by manually disabling the implicit constructor/destructor generation.

    To manually disable these, the %nodefaultctor and %nodefaultdtor feature flag directives can be used. Note that these directives only affects the implicit generation, and they have no effect if the default/copy constructors or destructor are explicitly declared in the class interface.

    For example:

    %nodefaultctor Foo;  // Disable the default constructor for class Foo.
    class Foo {          // No default constructor is generated, unless one is declared
    ...
    };
    class Bar {          // A default constructor is generated, if possible
    ...
    };
    

    The directive %nodefaultctor can also be applied "globally", as in:

    %nodefaultctor; // Disable creation of default constructors
    class Foo {     // No default constructor is generated, unless one is declared
    ...
    };
    class Bar {   
    public:
      Bar();        // The default constructor is generated, since one is declared
    };
    %clearnodefaultctor; // Enable the creation of default constructors again
    

    The corresponding %nodefaultdtor directive can be used to disable the generation of the default or implicit destructor, if needed. Be aware, however, that this could lead to memory leaks in the target language. Hence, it is recommended to use this directive only in well known cases. For example:

    %nodefaultdtor Foo;   // Disable the implicit/default destructor for class Foo.
    class Foo {           // No destructor is generated, unless one is declared
    ...
    };
    

    Compatibility Note: The generation of default constructors/implicit destructors was made the default behavior in SWIG 1.3.7. This may break certain older modules, but the old behavior can be easily restored using %nodefault or the -nodefault command line option. Furthermore, in order for SWIG to properly generate (or not generate) default constructors, it must be able to gather information from both the private and protected sections (specifically, it needs to know if a private or protected constructor/destructor is defined). In older versions of SWIG, it was fairly common to simply remove or comment out the private and protected sections of a class due to parser limitations. However, this removal may now cause SWIG to erroneously generate constructors for classes that define a constructor in those sections. Consider restoring those sections in the interface or using %nodefault to fix the problem.

    Note: The %nodefault directive/-nodefault options described above, which disable both the default constructor and the implicit destructors, could lead to memory leaks, and so it is strongly recommended to not use them.

    6.6.3 When constructor wrappers aren't created

    If a class defines a constructor, SWIG normally tries to generate a wrapper for it. However, SWIG will not generate a constructor wrapper if it thinks that it will result in illegal wrapper code. There are really two cases where this might show up.

    First, SWIG won't generate wrappers for protected or private constructors. For example:

    class Foo {
    protected:
      Foo();         // Not wrapped.
    public:
      ...
    };
    

    Next, SWIG won't generate wrappers for a class if it appears to be abstract--that is, it has undefined pure virtual methods. Here are some examples:

    class Bar {
    public:
      Bar();               // Not wrapped.  Bar is abstract.
      virtual void spam(void) = 0;
    };
    
    class Grok : public Bar {
    public:
      Grok();              // Not wrapped. No implementation of abstract spam().
    };
    

    Some users are surprised (or confused) to find missing constructor wrappers in their interfaces. In almost all cases, this is caused when classes are determined to be abstract. To see if this is the case, run SWIG with all of its warnings turned on:

    % swig -Wall -python module.i
    

    In this mode, SWIG will issue a warning for all abstract classes. It is possible to force a class to be non-abstract using this:

    %feature("notabstract") Foo;
    
    class Foo : public Bar {
    public:
      Foo();    // Generated no matter what---not abstract.
      ...
    };
    

    More information about %feature can be found in the Customization features chapter.

    6.6.4 Copy constructors

    If a class defines more than one constructor, its behavior depends on the capabilities of the target language. If overloading is supported, the copy constructor is accessible using the normal constructor function. For example, if you have this:

    class List {
    public:
      List();    
      List(const List &);      // Copy constructor
      ...
    };
    

    then the copy constructor can be used as follows:

    x = List()               # Create a list
    y = List(x)              # Copy list x
    

    If the target language does not support overloading, then the copy constructor is available through a special function like this:

    List *copy_List(List *f) {
      return new List(*f);
    }
    

    Note: For a class X, SWIG only treats a constructor as a copy constructor if it can be applied to an object of type X or X *. If more than one copy constructor is defined, only the first definition that appears is used as the copy constructor--other definitions will result in a name-clash. Constructors such as X(const X &), X(X &), and X(X *) are handled as copy constructors in SWIG.

    Note: SWIG does not generate a copy constructor wrapper unless one is explicitly declared in the class. This differs from the treatment of default constructors and destructors. However, copy constructor wrappers can be generated if using the copyctor feature flag. For example:

    %copyctor List;
    
    class List {
    public:
      List();    
    };
    

    Will generate a copy constructor wrapper for List.

    Compatibility note: Special support for copy constructors was not added until SWIG-1.3.12. In previous versions, copy constructors could be wrapped, but they had to be renamed. For example:

    class Foo {
    public:
      Foo();
      %name(CopyFoo) Foo(const Foo &);
      ...
    };
    

    For backwards compatibility, SWIG does not perform any special copy-constructor handling if the constructor has been manually renamed. For instance, in the above example, the name of the constructor is set to new_CopyFoo(). This is the same as in older versions.

    6.6.5 Member functions

    All member functions are roughly translated into accessor functions like this :

    int List_search(List *obj, char *value) {
      return obj->search(value);
    }
    
    

    This translation is the same even if the member function has been declared as virtual.

    It should be noted that SWIG does not actually create a C accessor function in the code it generates. Instead, member access such as obj->search(value) is directly inlined into the generated wrapper functions. However, the name and calling convention of the low-level procedural wrappers match the accessor function prototype described above.

    6.6.6 Static members

    Static member functions are called directly without making any special transformations. For example, the static member function print(List *l) directly invokes List::print(List *l) in the generated wrapper code.

    6.6.7 Member data

    Member data is handled in exactly the same manner as for C structures. A pair of accessor functions are effectively created. For example :

    int List_length_get(List *obj) {
      return obj->length;
    }
    int List_length_set(List *obj, int value) {
      obj->length = value;
      return value;
    }
    
    

    A read-only member can be created using the %immutable and %mutable feature flag directive. For example, we probably wouldn't want the user to change the length of a list so we could do the following to make the value available, but read-only.

    class List {
    public:
    ...
    %immutable;
      int length;
    %mutable;
    ...
    };
    

    Alternatively, you can specify an immutable member in advance like this:

    %immutable List::length;
    ...
    class List {
      ...
      int length;         // Immutable by above directive
      ...
    };
    

    Similarly, all data attributes declared as const are wrapped as read-only members.

    By default, SWIG uses the const reference typemaps for members that are primitive types. There are some subtle issues when wrapping data members that are not primitive types, such as classes. For instance, if you had another class like this,

    class Foo {
    public:
      List items;
      ...
    

    then the low-level accessor to the items member actually uses pointers. For example:

    List *Foo_items_get(Foo *self) {
      return &self->items;
    }
    void Foo_items_set(Foo *self, List *value) {
      self->items = *value;
    }
    

    More information about this can be found in the SWIG Basics chapter, Structure data members section.

    The wrapper code to generate the accessors for classes comes from the pointer typemaps. This can be somewhat unnatural for some types. For example, a user would expect the STL std::string class member variables to be wrapped as a string in the target language, rather than a pointer to this class. The const reference typemaps offer this type of marshalling, so there is a feature to tell SWIG to use the const reference typemaps rather than the pointer typemaps. It is the naturalvar feature and can be used to effectively change the way accessors are generated to the following:

    const List &Foo_items_get(Foo *self) {
      return self->items;
    }
    void Foo_items_set(Foo *self, const List &value) {
      self->items = value;
    }
    

    The %naturalvar directive is a macro for, and hence equivalent to, %feature("naturalvar"). It can be used as follows:

    // All List variables will use const List& typemaps
    %naturalvar List;
    
    // Only Foo::myList will use const List& typemaps
    %naturalvar Foo::myList;
    struct Foo {
      List myList;
    };
    
    // All non-primitive types will use const reference typemaps
    %naturalvar;
    

    The observant reader will notice that %naturalvar works like any other feature flag directive but with some extra flexibility. The first of the example usages above shows %naturalvar attaching to the myList 's variable type, that is the List class. The second usage shows %naturalvar attaching to the variable name. Hence the naturalvar feature can be used on either the variable's name or type. Note that using the naturalvar feature on a variable's name overrides any naturalvar feature attached to the variable's type.

    It is generally a good idea to use this feature globally as the reference typemaps have extra NULL checking compared to the pointer typemaps. A pointer can be NULL, whereas a reference cannot, so the extra checking ensures that the target language user does not pass in a value that translates to a NULL pointer and thereby preventing any potential NULL pointer dereferences. The %naturalvar feature will apply to global variables in addition to member variables in some language modules, eg C# and Java.

    The naturalvar behavior can also be turned on as a global setting via the -naturalvar commandline option or the module mode option, %module(naturalvar=1). However, any use of %feature("naturalvar") will override the global setting.

    Compatibility note: The %naturalvar feature was introduced in SWIG-1.3.28, prior to which it was necessary to manually apply the const reference typemaps, eg %apply const std::string & { std::string * }, but this example would also apply the typemaps to methods taking a std::string pointer.

    Compatibility note: Read-only access used to be controlled by a pair of directives %readonly and %readwrite. Although these directives still work, they generate a warning message. Simply change the directives to %immutable; and %mutable; to silence the warning. Don't forget the extra semicolon!

    Compatibility note: Prior to SWIG-1.3.12, all members of unknown type were wrapped into accessor functions using pointers. For example, if you had a structure like this

    struct Foo {
      size_t  len;
    };
    

    and nothing was known about size_t, then accessors would be written to work with size_t *. Starting in SWIG-1.3.12, this behavior has been modified. Specifically, pointers will only be used if SWIG knows that a datatype corresponds to a structure or class. Therefore, the above code would be wrapped into accessors involving size_t. This change is subtle, but it smooths over a few problems related to structure wrapping and some of SWIG's customization features.

    6.7 Protection

    SWIG wraps class members that are public following the C++ conventions, i.e., by explicit public declaration or by the use of the using directive. In general, anything specified in a private or protected section will be ignored, although the internal code generator sometimes looks at the contents of the private and protected sections so that it can properly generate code for default constructors and destructors. Directors could also modify the way non-public virtual protected members are treated.

    By default, members of a class definition are assumed to be private until you explicitly give a `public:' declaration (This is the same convention used by C++).

    6.8 Enums and constants

    Enumerations and constants are handled differently by the different language modules and are described in detail in the appropriate language chapter. However, many languages map enums and constants in a class definition into constants with the classname as a prefix. For example :

    class Swig {
    public:
      enum {ALE, LAGER, PORTER, STOUT};
    };
    
    

    Generates the following set of constants in the target scripting language :

    Swig_ALE = Swig::ALE
    Swig_LAGER = Swig::LAGER
    Swig_PORTER = Swig::PORTER
    Swig_STOUT = Swig::STOUT
    
    

    Members declared as const are wrapped as read-only members and do not create constants.

    6.9 Friends

    Friend declarations are recognised by SWIG. For example, if you have this code:

    class Foo {
    public:
      ...
      friend void blah(Foo *f);
      ...
    };
    

    then the friend declaration does result in a wrapper code equivalent to one generated for the following declaration

    class Foo {
    public:
      ...
    };
    
    void blah(Foo *f);    
    

    A friend declaration, as in C++, is understood to be in the same scope where the class is declared, hence, you can have

    
    %ignore bar::blah(Foo *f);
    
    namespace bar {
    
      class Foo {
      public:
        ...
        friend void blah(Foo *f);
        ...
      };
    }
    

    and a wrapper for the method 'blah' will not be generated.

    6.10 References and pointers

    C++ references are supported, but SWIG transforms them back into pointers. For example, a declaration like this :

    class Foo {
    public:
      double bar(double &a);
    }
    

    has a low-level accessor

    double Foo_bar(Foo *obj, double *a) {
      obj->bar(*a);
    }
    

    As a special case, most language modules pass const references to primitive datatypes (int, short, float, etc.) by value instead of pointers. For example, if you have a function like this,

    void foo(const int &x);
    

    it is called from a script as follows:

    foo(3)              # Notice pass by value
    

    Functions that return a reference are remapped to return a pointer instead. For example:

    class Bar {
    public:
      Foo &spam();
    };
    

    Generates an accessor like this:

    Foo *Bar_spam(Bar *obj) {
      Foo &result = obj->spam();
      return &result;
    }
    

    However, functions that return const references to primitive datatypes (int, short, etc.) normally return the result as a value rather than a pointer. For example, a function like this,

    const int &bar();
    

    will return integers such as 37 or 42 in the target scripting language rather than a pointer to an integer.

    Don't return references to objects allocated as local variables on the stack. SWIG doesn't make a copy of the objects so this will probably cause your program to crash.

    Note: The special treatment for references to primitive datatypes is necessary to provide more seamless integration with more advanced C++ wrapping applications---especially related to templates and the STL. This was first added in SWIG-1.3.12.

    6.11 Pass and return by value

    Occasionally, a C++ program will pass and return class objects by value. For example, a function like this might appear:

    Vector cross_product(Vector a, Vector b);
    

    If no information is supplied about Vector, SWIG creates a wrapper function similar to the following:

    Vector *wrap_cross_product(Vector *a, Vector *b) {
      Vector x = *a;
      Vector y = *b;
      Vector r = cross_product(x, y);
      return new Vector(r);
    }

    In order for the wrapper code to compile, Vector must define a copy constructor and a default constructor.

    If Vector is defined as a class in the interface, but it does not support a default constructor, SWIG changes the wrapper code by encapsulating the arguments inside a special C++ template wrapper class, through a process called the "Fulton Transform". This produces a wrapper that looks like this:

    Vector cross_product(Vector *a, Vector *b) {
      SwigValueWrapper<Vector> x = *a;
      SwigValueWrapper<Vector> y = *b;
      SwigValueWrapper<Vector> r = cross_product(x, y);
      return new Vector(r);
    }
    

    This transformation is a little sneaky, but it provides support for pass-by-value even when a class does not provide a default constructor and it makes it possible to properly support a number of SWIG's customization options. The definition of SwigValueWrapper can be found by reading the SWIG wrapper code. This class is really nothing more than a thin wrapper around a pointer.

    Although SWIG usually detects the classes to which the Fulton Transform should be applied, in some situations it's necessary to override it. That's done with %feature("valuewrapper") to ensure it is used and %feature("novaluewrapper") to ensure it is not used:

    %feature("novaluewrapper") A;    
    class A;
    
    %feature("valuewrapper") B;
    struct B { 
      B();
      // ....
    };   
    

    It is well worth considering turning this feature on for classes that do have a default constructor. It will remove a redundant constructor call at the point of the variable declaration in the wrapper, so will generate notably better performance for large objects or for classes with expensive construction. Alternatively consider returning a reference or a pointer.

    Note: this transformation has no effect on typemaps or any other part of SWIG---it should be transparent except that you may see this code when reading the SWIG output file.

    Note: This template transformation is new in SWIG-1.3.11 and may be refined in future SWIG releases. In practice, it is only absolutely necessary to do this for classes that don't define a default constructor.

    Note: The use of this template only occurs when objects are passed or returned by value. It is not used for C++ pointers or references.

    6.12 Inheritance

    SWIG supports C++ inheritance of classes and allows both single and multiple inheritance, as limited or allowed by the target language. The SWIG type-checker knows about the relationship between base and derived classes and allows pointers to any object of a derived class to be used in functions of a base class. The type-checker properly casts pointer values and is safe to use with multiple inheritance.

    SWIG treats private or protected inheritance as close to the C++ spirit, and target language capabilities, as possible. In most cases, this means that SWIG will parse the non-public inheritance declarations, but that will have no effect in the generated code, besides the implicit policies derived for constructors and destructors.

    The following example shows how SWIG handles inheritance. For clarity, the full C++ code has been omitted.

    // shapes.i
    %module shapes
    %{
    #include "shapes.h"
    %}
    
    class Shape {
    public:
      double x, y;
      virtual double area() = 0;
      virtual double perimeter() = 0;
      void    set_location(double x, double y);
    };
    class Circle : public Shape {
    public:
      Circle(double radius);
      ~Circle();
      double area();
      double perimeter();
    };
    class Square : public Shape {
    public:
      Square(double size);
      ~Square();
      double area();
      double perimeter();
    }
    

    When wrapped into Python, we can perform the following operations (shown using the low level Python accessors):

    $ python
    >>> import shapes
    >>> circle = shapes.new_Circle(7)
    >>> square = shapes.new_Square(10)
    >>> print shapes.Circle_area(circle)
    153.93804004599999757
    >>> print shapes.Shape_area(circle)
    153.93804004599999757
    >>> print shapes.Shape_area(square)
    100.00000000000000000
    >>> shapes.Shape_set_location(square, 2, -3)
    >>> print shapes.Shape_perimeter(square)
    40.00000000000000000
    >>>
    

    In this example, Circle and Square objects have been created. Member functions can be invoked on each object by making calls to Circle_area, Square_area, and so on. However, the same results can be accomplished by simply using the Shape_area function on either object.

    One important point concerning inheritance is that the low-level accessor functions are only generated for classes in which they are actually declared. For instance, in the above example, the method set_location() is only accessible as Shape_set_location() and not as Circle_set_location() or Square_set_location() . Of course, the Shape_set_location() function will accept any kind of object derived from Shape. Similarly, accessor functions for the attributes x and y are generated as Shape_x_get(), Shape_x_set(), Shape_y_get(), and Shape_y_set(). Functions such as Circle_x_get() are not available--instead you should use Shape_x_get().

    Note that there is a one to one correlation between the low-level accessor functions and the proxy methods and therefore there is also a one to one correlation between the C++ class methods and the generated proxy class methods.

    Note: For the best results, SWIG requires all base classes to be defined in an interface. Otherwise, you may get a warning message like this:

    example.i:18: Warning 401: Nothing known about base class 'Foo'. Ignored.
    

    If any base class is undefined, SWIG still generates correct type relationships. For instance, a function accepting a Foo * will accept any object derived from Foo regardless of whether or not SWIG actually wrapped the Foo class. If you really don't want to generate wrappers for the base class, but you want to silence the warning, you might consider using the %import directive to include the file that defines Foo. %import simply gathers type information, but doesn't generate wrappers. Alternatively, you could just define Foo as an empty class in the SWIG interface or use warning suppression .

    Note: typedef-names can be used as base classes. For example:

    class Foo {
    ...
    };
    
    typedef Foo FooObj;
    class Bar : public FooObj {     // Ok.  Base class is Foo
    ...
    };
    

    Similarly, typedef allows unnamed structures to be used as base classes. For example:

    typedef struct {
      ...
    } Foo;
    
    class Bar : public Foo {    // Ok. 
    ...
    };
    

    Compatibility Note: Starting in version 1.3.7, SWIG only generates low-level accessor wrappers for the declarations that are actually defined in each class. This differs from SWIG1.1 which used to inherit all of the declarations defined in base classes and regenerate specialized accessor functions such as Circle_x_get(), Square_x_get(), Circle_set_location(), and Square_set_location(). This behavior resulted in huge amounts of replicated code for large class hierarchies and made it awkward to build applications spread across multiple modules (since accessor functions are duplicated in every single module). It is also unnecessary to have such wrappers when advanced features like proxy classes are used. Note: Further optimizations are enabled when using the -fvirtual option, which avoids the regenerating of wrapper functions for virtual members that are already defined in a base class.

    6.13 A brief discussion of multiple inheritance, pointers, and type checking

    When a target scripting language refers to a C++ object, it normally uses a tagged pointer object that contains both the value of the pointer and a type string. For example, in Tcl, a C++ pointer might be encoded as a string like this:

    _808fea88_p_Circle
    

    A somewhat common question is whether or not the type-tag could be safely removed from the pointer. For instance, to get better performance, could you strip all type tags and just use simple integers instead?

    In general, the answer to this question is no. In the wrappers, all pointers are converted into a common data representation in the target language. Typically this is the equivalent of casting a pointer to void *. This means that any C++ type information associated with the pointer is lost in the conversion.

    The problem with losing type information is that it is needed to properly support many advanced C++ features--especially multiple inheritance. For example, suppose you had code like this:

    class A {
    public:
      int x;
    };
    
    class B {
    public:
      int y;
    };
    
    class C : public A, public B {
    };
    
    int A_function(A *a) {
      return a->x;
    }
    
    int B_function(B *b) {
      return b->y;
    }
    

    Now, consider the following code that uses void *.

    C *c = new C();
    void *p = (void *) c;
    ...
    int x = A_function((A *) p);
    int y = B_function((B *) p);
    

    In this code, both A_function() and B_function() may legally accept an object of type C * (via inheritance). However, one of the functions will always return the wrong result when used as shown. The reason for this is that even though p points to an object of type C, the casting operation doesn't work like you would expect. Internally, this has to do with the data representation of C. With multiple inheritance, the data from each base class is stacked together. For example:

                 ------------    <--- (C *),  (A *)
                |     A      |
                |------------|   <--- (B *)
                |     B      |
                 ------------   
    

    Because of this stacking, a pointer of type C * may change value when it is converted to a A * or B *. However, this adjustment does not occur if you are converting from a void *.

    The use of type tags marks all pointers with the real type of the underlying object. This extra information is then used by SWIG generated wrappers to correctly cast pointer values under inheritance (avoiding the above problem).

    Some of the language modules are able to solve the problem by storing multiple instances of the pointer, for example, A *, in the A proxy class as well as C * in the C proxy class. The correct cast can then be made by choosing the correct void * pointer to use and is guaranteed to work as the cast to a void pointer and back to the same type does not lose any type information:

    C *c = new C();
    void *p = (void *) c;
    void *pA = (void *) c;
    void *pB = (void *) c;
    ...
    int x = A_function((A *) pA);
    int y = B_function((B *) pB);
    

    In practice, the pointer is held as an integral number in the target language proxy class.

    6.14 Default arguments

    SWIG will wrap all types of functions that have default arguments. For example member functions:

    class Foo {
    public:
      void bar(int x, int y = 3, int z = 4);
    };
    

    SWIG handles default arguments by generating an extra overloaded method for each defaulted argument. SWIG is effectively handling methods with default arguments as if it was wrapping the equivalent overloaded methods. Thus for the example above, it is as if we had instead given the following to SWIG:

    class Foo {
    public:
      void bar(int x, int y, int z);
      void bar(int x, int y);
      void bar(int x);
    };
    

    The wrappers produced are exactly the same as if the above code was instead fed into SWIG. Details of this are covered in the next section Overloaded functions and methods . This approach allows SWIG to wrap all possible default arguments, but can be verbose. For example if a method has ten default arguments, then eleven wrapper methods are generated.

    Please see the Features and default arguments section for more information on using %feature with functions with default arguments. The Renaming and ambiguity resolution section also deals with using %rename and %ignore on methods with default arguments. If you are writing your own typemaps for types used in methods with default arguments, you may also need to write a typecheck typemap. See the Typemaps and overloading section for details or otherwise use the compactdefaultargs feature flag as mentioned below.

    Compatibility note: Versions of SWIG prior to SWIG-1.3.23 wrapped default arguments slightly differently. Instead a single wrapper method was generated and the default values were copied into the C++ wrappers so that the method being wrapped was then called with all the arguments specified. If the size of the wrappers are a concern then this approach to wrapping methods with default arguments can be re-activated by using the compactdefaultargs feature flag.

    %feature("compactdefaultargs") Foo::bar;
    class Foo {
    public:
      void bar(int x, int y = 3, int z = 4);
    };
    

    This is great for reducing the size of the wrappers, but the caveat is it does not work for the statically typed languages, such as C# and Java, which don't have optional arguments in the language, Another restriction of this feature is that it cannot handle default arguments that are not public. The following example illustrates this:

    class Foo {
    private:
      static const int spam;
    public:
      void bar(int x, int y = spam);   // Won't work with %feature("compactdefaultargs") -
                                       // private default value
    };
    

    This produces uncompilable wrapper code because default values in C++ are evaluated in the same scope as the member function whereas SWIG evaluates them in the scope of a wrapper function (meaning that the values have to be public).

    The compactdefaultargs feature is automatically turned on when wrapping C code with default arguments. Some target languages will also automatically turn on this feature if the keyword arguments feature (kwargs) is specified for either C or C++ functions, and the target language supports kwargs, the compactdefaultargs feature is also automatically turned on. Keyword arguments are a language feature of some scripting languages, for example Ruby and Python. SWIG is unable to support kwargs when wrapping overloaded methods, so the default approach cannot be used.

    6.15 Overloaded functions and methods

    In many language modules, SWIG provides partial support for overloaded functions, methods, and constructors. For example, if you supply SWIG with overloaded functions like this:

    void foo(int x) {
      printf("x is %d\n", x);
    }
    void foo(char *x) {
      printf("x is '%s'\n", x);
    }
    

    The function is used in a completely natural way. For example:

    >>> foo(3)
    x is 3
    >>> foo("hello")
    x is 'hello'
    >>>
    

    Overloading works in a similar manner for methods and constructors. For example if you have this code,

    class Foo {
    public:
      Foo();
      Foo(const Foo &);   // Copy constructor
      void bar(int x);
      void bar(char *s, int y);
    };
    

    it might be used like this

    >>> f = Foo()          # Create a Foo
    >>> f.bar(3)
    >>> g = Foo(f)         # Copy Foo
    >>> f.bar("hello", 2)
    

    6.15.1 Dispatch function generation

    The implementation of overloaded functions and methods is somewhat complicated due to the dynamic nature of scripting languages. Unlike C++, which binds overloaded methods at compile time, SWIG must determine the proper function as a runtime check for scripting language targets. This check is further complicated by the typeless nature of certain scripting languages. For instance, in Tcl, all types are simply strings. Therefore, if you have two overloaded functions like this,

    void foo(char *x);
    void foo(int x);
    

    the order in which the arguments are checked plays a rather critical role.

    For statically typed languages, SWIG uses the language's method overloading mechanism. To implement overloading for the scripting languages, SWIG generates a dispatch function that checks the number of passed arguments and their types. To create this function, SWIG first examines all of the overloaded methods and ranks them according to the following rules:

    1. Number of required arguments. Methods are sorted by increasing number of required arguments.
    2. Argument type precedence. All C++ datatypes are assigned a numeric type precedence value (which is determined by the language module).

      Type              Precedence
      ----------------  ----------
      TYPE *            0     (High)
      void *            20
      Integers          40
      Floating point    60
      char              80
      Strings           100   (Low)
      

      Using these precedence values, overloaded methods with the same number of required arguments are sorted in increased order of precedence values.

    This may sound very confusing, but an example will help. Consider the following collection of overloaded methods:

    void foo(double);
    void foo(int);
    void foo(Bar *);
    void foo();
    void foo(int x, int y, int z, int w);
    void foo(int x, int y, int z = 3);
    void foo(double x, double y);
    void foo(double x, Bar *z);
    

    The first rule simply ranks the functions by required argument count. This would produce the following list:

    rank
    -----
    [0]   foo()
    [1]   foo(double);
    [2]   foo(int);
    [3]   foo(Bar *);
    [4]   foo(int x, int y, int z = 3);
    [5]   foo(double x, double y)
    [6]   foo(double x, Bar *z)
    [7]   foo(int x, int y, int z, int w);
    

    The second rule, simply refines the ranking by looking at argument type precedence values.

    rank
    -----
    [0]   foo()
    [1]   foo(Bar *);
    [2]   foo(int);
    [3]   foo(double);
    [4]   foo(int x, int y, int z = 3);
    [5]   foo(double x, Bar *z)
    [6]   foo(double x, double y)
    [7]   foo(int x, int y, int z, int w);
    

    Finally, to generate the dispatch function, the arguments passed to an overloaded method are simply checked in the same order as they appear in this ranking.

    If you're still confused, don't worry about it---SWIG is probably doing the right thing.

    6.15.2 Ambiguity in overloading

    Regrettably, SWIG is not able to support every possible use of valid C++ overloading. Consider the following example:

    void foo(int x);
    void foo(long x);
    

    In C++, this is perfectly legal. However, in a scripting language, there is generally only one kind of integer object. Therefore, which one of these functions do you pick? Clearly, there is no way to truly make a distinction just by looking at the value of the integer itself ( int and long may even be the same precision). Therefore, when SWIG encounters this situation, it may generate a warning message like this for scripting languages:

    example.i:4: Warning 509: Overloaded method foo(long) effectively ignored,
    example.i:3: Warning 509: as it is shadowed by foo(int).
    

    or for statically typed languages like Java:

    example.i:4: Warning 516: Overloaded method foo(long) ignored,
    example.i:3: Warning 516: using foo(int) instead.
    at example.i:3 used.
    

    This means that the second overloaded function will be inaccessible from a scripting interface or the method won't be wrapped at all. This is done as SWIG does not know how to disambiguate it from an earlier method.

    Ambiguity problems are known to arise in the following situations:

    • Integer conversions. Datatypes such as int, long, and short cannot be disambiguated in some languages. Shown above.
    • Floating point conversion. float and double can not be disambiguated in some languages.
    • Pointers and references. For example, Foo * and Foo & .
    • Pointers and arrays. For example, Foo * and Foo [4] .
    • Pointers and instances. For example, Foo and Foo * . Note: SWIG converts all instances to pointers.
    • Qualifiers. For example, const Foo * and Foo *.
    • Default vs. non default arguments. For example, foo(int a, int b) and foo(int a, int b = 3).

    When an ambiguity arises, methods are checked in the same order as they appear in the interface file. Therefore, earlier methods will shadow methods that appear later.

    When wrapping an overloaded function, there is a chance that you will get a warning message like this:

    example.i:3: Warning 467: Overloaded foo(int) not supported (incomplete type checking rule - 
    no precedence level in typecheck typemap for 'int').
    

    This error means that the target language module supports overloading, but for some reason there is no type-checking rule that can be used to generate a working dispatch function. The resulting behavior is then undefined. You should report this as a bug to the SWIG bug tracking database if this is due to one of the typemaps supplied with SWIG.

    If you get an error message such as the following,

    foo.i:6. Overloaded declaration ignored.  Spam::foo(double )
    foo.i:5. Previous declaration is Spam::foo(int )
    foo.i:7. Overloaded declaration ignored.  Spam::foo(Bar *, Spam *, int )
    foo.i:5. Previous declaration is Spam::foo(int )
    

    it means that the target language module has not yet implemented support for overloaded functions and methods. The only way to fix the problem is to read the next section.

    6.15.3 Renaming and ambiguity resolution

    If an ambiguity in overload resolution occurs or if a module doesn't allow overloading, there are a few strategies for dealing with the problem. First, you can tell SWIG to ignore one of the methods. This is easy---simply use the %ignore directive. For example:

    %ignore foo(long);
    
    void foo(int);
    void foo(long);       // Ignored.  Oh well.
    

    The other alternative is to rename one of the methods. This can be done using %rename. For example:

    %rename("foo_short") foo(short);
    %rename(foo_long) foo(long);
    
    void foo(int);
    void foo(short);      // Accessed as foo_short()
    void foo(long);       // Accessed as foo_long()
    

    Note that the quotes around the new name are optional, however, should the new name be a C/C++ keyword they would be essential in order to avoid a parsing error. The %ignore and %rename directives are both rather powerful in their ability to match declarations. When used in their simple form, they apply to both global functions and methods. For example:

    /* Forward renaming declarations */
    %rename(foo_i) foo(int); 
    %rename(foo_d) foo(double);
    ...
    void foo(int);           // Becomes 'foo_i'
    void foo(char *c);       // Stays 'foo' (not renamed)
    
    class Spam {
    public:
      void foo(int);      // Becomes 'foo_i'
      void foo(double);   // Becomes 'foo_d'
      ...
    };
    

    If you only want the renaming to apply to a certain scope, the C++ scope resolution operator (::) can be used. For example:

    %rename(foo_i) ::foo(int);      // Only rename foo(int) in the global scope.
                                    // (will not rename class members)
    
    %rename(foo_i) Spam::foo(int);  // Only rename foo(int) in class Spam
    

    When a renaming operator is applied to a class as in Spam::foo(int), it is applied to that class and all derived classes. This can be used to apply a consistent renaming across an entire class hierarchy with only a few declarations. For example:

    %rename(foo_i) Spam::foo(int);
    %rename(foo_d) Spam::foo(double);
    
    class Spam {
    public:
      virtual void foo(int);      // Renamed to foo_i
      virtual void foo(double);   // Renamed to foo_d
      ...
    };
    
    class Bar : public Spam {
    public:
      virtual void foo(int);      // Renamed to foo_i
      virtual void foo(double);   // Renamed to foo_d
      ...
    };
    
    class Grok : public Bar {
    public:
      virtual void foo(int);      // Renamed to foo_i
      virtual void foo(double);   // Renamed to foo_d
      ...
    };
    

    It is also possible to include %rename specifications in the class definition itself. For example:

    class Spam {
      %rename(foo_i) foo(int);
      %rename(foo_d) foo(double);
    public:
      virtual void foo(int);      // Renamed to foo_i
      virtual void foo(double);   // Renamed to foo_d
      ...
    };
    
    class Bar : public Spam {
    public:
      virtual void foo(int);      // Renamed to foo_i
      virtual void foo(double);   // Renamed to foo_d
    ...
    };
    

    In this case, the %rename directives still get applied across the entire inheritance hierarchy, but it's no longer necessary to explicitly specify the class prefix Spam::.

    A special form of %rename can be used to apply a renaming just to class members (of all classes):

    %rename(foo_i) *::foo(int);   // Only rename foo(int) if it appears in a class.
    

    Note: the *:: syntax is non-standard C++, but the '*' is meant to be a wildcard that matches any class name (we couldn't think of a better alternative so if you have a better idea, send email to the swig-devel mailing list.

    Although this discussion has primarily focused on %rename all of the same rules also apply to %ignore. For example:

    %ignore foo(double);          // Ignore all foo(double)
    %ignore Spam::foo;            // Ignore foo in class Spam
    %ignore Spam::foo(double);    // Ignore foo(double) in class Spam
    %ignore *::foo(double);       // Ignore foo(double) in all classes
    

    When applied to a base class, %ignore forces all definitions in derived classes to disappear. For example, %ignore Spam::foo(double) will eliminate foo(double) in Spam and all classes derived from Spam.

    Notes on %rename and %ignore:

    • Since, the %rename declaration is used to declare a renaming in advance, it can be placed at the start of an interface file. This makes it possible to apply a consistent name resolution without having to modify header files. For example:

      %module foo
      
      /* Rename these overloaded functions */
      %rename(foo_i) foo(int); 
      %rename(foo_d) foo(double);
      
      %include "header.h"
      
    • The scope qualifier (::) can also be used on simple names. For example:

      %rename(bar) ::foo;       // Rename foo to bar in global scope only
      %rename(bar) Spam::foo;   // Rename foo to bar in class Spam only
      %rename(bar) *::foo;      // Rename foo in classes only
      
    • Name matching tries to find the most specific match that is defined. A qualified name such as Spam::foo always has higher precedence than an unqualified name foo. Spam::foo has higher precedence than *::foo and *::foo has higher precedence than foo. A parameterized name has higher precedence than an unparameterized name within the same scope level. However, an unparameterized name with a scope qualifier has higher precedence than a parameterized name in global scope (e.g., a renaming of Spam::foo takes precedence over a renaming of foo(int) ).

    • The order in which %rename directives are defined does not matter as long as they appear before the declarations to be renamed. Thus, there is no difference between saying:

      %rename(bar) foo;
      %rename(foo_i) Spam::foo(int);
      %rename(Foo) Spam::foo;
      

      and this

      %rename(Foo) Spam::foo;
      %rename(bar) foo;
      %rename(foo_i) Spam::foo(int);
      

      (the declarations are not stored in a linked list and order has no importance). Of course, a repeated %rename directive will change the setting for a previous %rename directive if exactly the same name, scope, and parameters are supplied.

    • For multiple inheritance where renaming rules are defined for multiple base classes, the first renaming rule found on a depth-first traversal of the class hierarchy is used.
    • The name matching rules strictly follow member qualifier rules. For example, if you have a class and member with a member that is const qualified like this:

      class Spam {
      public:
        ...
        void bar() const;
        ...
      };
      

      the declaration

      %rename(name) Spam::bar();
      

      will not apply as there is no unqualified member bar(). The following will apply the rename as the qualifier matches correctly:

      %rename(name) Spam::bar() const;
      

      Similarly for combinations of cv-qualifiers and ref-qualifiers, all the qualifiers must be specified to match correctly:

      %rename(name) Jam::bar();          // will not match
      %rename(name) Jam::bar() &;        // will not match
      %rename(name) Jam::bar() const;    // will not match
      %rename(name) Jam::bar() const &;  // ok, will match
      
      class Jam {
      public:
        ...
        void bar() const &;
        ...
      };
      

      An often overlooked C++ feature is that classes can define two different overloaded members that differ only in their qualifiers, like this:

      class Spam {
      public:
        ...
        void bar();         // Unqualified member
        void bar() const;   // Qualified member
        ...
      };
      

      %rename can then be used to target each of the overloaded methods individually. For example we can give them separate names in the target language:

      %rename(name1) Spam::bar();
      %rename(name2) Spam::bar() const;
      

      Similarly, if you merely wanted to ignore one of the declarations, use %ignore with the full qualifier. For example, the following directive would tell SWIG to ignore the const version of bar() above:

      %ignore Spam::bar() const;   // Ignore bar() const, but leave other bar() alone
      
    • Currently no resolution is performed in order to match function parameters. This means function parameter types must match exactly. For example, namespace qualifiers and typedefs will not work. The following usage of typedefs demonstrates this:

      typedef int Integer;
      
      %rename(foo_i) foo(int);
      
      class Spam {
      public:
        void foo(Integer);  // Stays 'foo' (not renamed)
      };
      class Ham {
      public:
        void foo(int);      // Renamed to foo_i
      };
      
    • The name matching rules also use default arguments for finer control when wrapping methods that have default arguments. Recall that methods with default arguments are wrapped as if the equivalent overloaded methods had been parsed (Default arguments section). Let's consider the following example class:

      class Spam {
      public:
        ...
        void bar(int i=-1, double d=0.0);
        ...
      };
      

      The following %rename will match exactly and apply to all the target language overloaded methods because the declaration with the default arguments exactly matches the wrapped method:

      %rename(newbar) Spam::bar(int i=-1, double d=0.0);
      

      The C++ method can then be called from the target language with the new name no matter how many arguments are specified, for example: newbar(2, 2.0), newbar(2) or newbar(). However, if the %rename does not contain the default arguments:

      %rename(newbar) Spam::bar(int i, double d);
      

      then only one of the three equivalent overloaded methods will be renamed and wrapped as if SWIG parsed:

      void Spam::newbar(int i, double d);
      void Spam::bar(int i);
      void Spam::bar();
      

      The C++ method must then be called from the target language with the new name newbar(2, 2.0) when both arguments are supplied or with the original name as bar(2) (one argument) or bar() (no arguments).

      In fact it is possible to use %rename on the equivalent overloaded methods, to rename all the equivalent overloaded methods:

      %rename(bar_2args)   Spam::bar(int i, double d);
      %rename(bar_1arg)    Spam::bar(int i);
      %rename(bar_default) Spam::bar();
      

      Similarly, the extra overloaded methods can be selectively ignored using %ignore.

      Compatibility note: The %rename directive introduced the default argument matching rules in SWIG-1.3.23 at the same time as the changes to wrapping methods with default arguments was introduced.

    6.15.4 Comments on overloading

    Support for overloaded methods was first added in SWIG-1.3.14. The implementation is somewhat unusual when compared to similar tools. For instance, the order in which declarations appear is largely irrelevant in SWIG. Furthermore, SWIG does not rely upon trial execution or exception handling to figure out which method to invoke.

    Internally, the overloading mechanism is completely configurable by the target language module. Therefore, the degree of overloading support may vary from language to language. As a general rule, statically typed languages like Java are able to provide more support than dynamically typed languages like Perl, Python, Ruby, and Tcl.

    6.16 Overloaded operators

    C++ overloaded operator declarations can be wrapped. For example, consider a class like this:

    class Complex {
    private:
      double rpart, ipart;
    public:
      Complex(double r = 0, double i = 0) : rpart(r), ipart(i) { }
      Complex(const Complex &c) : rpart(c.rpart), ipart(c.ipart) { }
      Complex &operator=(const Complex &c) {
        rpart = c.rpart;
        ipart = c.ipart;
        return *this;
      }
      Complex operator+(const Complex &c) const {
        return Complex(rpart+c.rpart, ipart+c.ipart);
      }
      Complex operator-(const Complex &c) const {
        return Complex(rpart-c.rpart, ipart-c.ipart);
      }
      Complex operator*(const Complex &c) const {
        return Complex(rpart*c.rpart - ipart*c.ipart,
                       rpart*c.ipart + c.rpart*ipart);
      }
      Complex operator-() const {
        return Complex(-rpart, -ipart);
      }
      double re() const { return rpart; }
      double im() const { return ipart; }
    };
    

    When operator declarations appear, they are handled in exactly the same manner as regular methods. However, the names of these methods are set to strings like "operator +" or "operator -". The problem with these names is that they are illegal identifiers in most scripting languages. For instance, you can't just create a method called "operator +" in Python--there won't be any way to call it.

    Some language modules already know how to automatically handle certain operators (mapping them into operators in the target language). However, the underlying implementation of this is really managed in a very general way using the %rename directive. For example, in Python a declaration similar to this is used:

    %rename(__add__) Complex::operator+;
    

    This binds the + operator to a method called __add__ (which is conveniently the same name used to implement the Python + operator). Internally, the generated wrapper code for a wrapped operator will look something like this pseudocode:

    _wrap_Complex___add__(args) {
      ... get args ...
      obj->operator+(args);
      ...
    }
    

    When used in the target language, it may now be possible to use the overloaded operator normally. For example:

    >>> a = Complex(3, 4)
    >>> b = Complex(5, 2)
    >>> c = a + b           # Invokes __add__ method
    

    It is important to realize that there is nothing magical happening here. The %rename directive really only picks a valid method name. If you wrote this:

    %rename(add) operator+;
    

    The resulting scripting interface might work like this:

    a = Complex(3, 4)
    b = Complex(5, 2)
    c = a.add(b)      # Call a.operator+(b)
    

    All of the techniques described to deal with overloaded functions also apply to operators. For example:

    %ignore Complex::operator=;             // Ignore = in class Complex
    %ignore *::operator=;                   // Ignore = in all classes
    %ignore operator=;                      // Ignore = everywhere.
    
    %rename(__sub__) Complex::operator-; 
    %rename(__neg__) Complex::operator-();  // Unary - 
    

    The last part of this example illustrates how multiple definitions of the operator- method might be handled.

    Handling operators in this manner is mostly straightforward. However, there are a few subtle issues to keep in mind:

    • In C++, it is fairly common to define different versions of the operators to account for different types. For example, a class might also include a friend function like this:

      class Complex {
      public:
        friend Complex operator+(Complex &, double);
      };
      Complex operator+(Complex &, double);
      

      SWIG simply ignores all friend declarations. Furthermore, it doesn't know how to associate the associated operator+ with the class (because it's not a member of the class).

      It's still possible to make a wrapper for this operator, but you'll have to handle it like a normal function. For example:

      %rename(add_complex_double) operator+(Complex &, double);
      
    • Certain operators are ignored by default. For instance, new and delete operators are ignored as well as conversion and index operators. A warning such as the one below is shown:

      example.i:12: Warning 503: Can't wrap 'operator []' unless renamed to a valid identifier.
      
    • The index operator, operator[], is particularly difficult to overload due to differences in C++ implementations. Specifically, the get and set operators in other languages typically are separated into two methods such that additional logic can be packed into the operations; C# uses this[type key] { get { ... } set { ... }}, Python uses __getitem__ and __setitem__, etc. In C++ if the return type of operator[] is a reference and the method is const, it is often indicative of the setter, and the getter is usually a const function return an object by value. In the absence of any hard and fast rules and the fact that there may be multiple index operators, it is up to the user to choose the getter and setter to use by using %rename as shown earlier.

    • The semantics of certain C++ operators may not match those in the target language.

    6.17 Class extension

    New methods can be added to a class using the %extend directive. This directive is primarily used in conjunction with proxy classes to add additional functionality to an existing class. For example :

    %module vector
    %{
    #include "vector.h"
    %}
    
    class Vector {
    public:
      double x, y, z;
      Vector();
      ~Vector();
      ... bunch of C++ methods ...
      %extend {
        char *__str__() {
          static char temp[256];
          sprintf(temp, "[ %g, %g, %g ]", $self->x, $self->y, $self->z);
          return &temp[0];
        }
      }
    };
    

    This code adds a __str__ method to our class for producing a string representation of the object. In Python, such a method would allow us to print the value of an object using the print command.

    >>>
    >>> v = Vector();
    >>> v.x = 3
    >>> v.y = 4
    >>> v.z = 0
    >>> print(v)
    [ 3.0, 4.0, 0.0 ]
    >>>
    
    

    The C++ 'this' pointer is often needed to access member variables, methods etc. The $self special variable should be used wherever you could use 'this'. The example above demonstrates this for accessing member variables. Note that the members dereferenced by $self must be public members as the code is ultimately generated into a global function and so will not have any access to non-public members. The implicit 'this' pointer that is present in C++ methods is not present in %extend methods. In order to access anything in the extended class or its base class, an explicit 'this' is required. The following example shows how one could access base class members:

    struct Base {
      virtual void method(int v) {
        ...
      }
      int value;
    };
    struct Derived : Base {
    };
    %extend Derived {
      virtual void method(int v) {
        $self->Base::method(v); // akin to this->Base::method(v);
        $self->value = v;       // akin to this->value = v;
        ...
      }
    }
    

    The following special variables are expanded if used within a %extend block: $name, $symname, $overname, $decl, $fulldecl, $parentclassname and $parentclasssymname. The Special variables section provides more information each of these special variables.

    The %extend directive follows all of the same conventions as its use with C structures. Please refer to the Adding member functions to C structures section for further details.

    Compatibility note: The %extend directive is a new name for the %addmethods directive in SWIG1.1. Since %addmethods could be used to extend a structure with more than just methods, a more suitable directive name has been chosen.

    6.18 Templates

    Template type names may appear anywhere a type is expected in an interface file. For example:

    void foo(vector<int> *a, int n);
    void bar(list<int, 100> *x);
    

    There are some restrictions on the use of non-type arguments. Simple literals are supported, and so are some constant expressions. However, use of '<' and '>' within a constant expressions currently is not supported by SWIG ('<=' and '>=' are though). For example:

    void bar(list<int, 100> *x);                // OK
    void bar(list<int, 2*50> *x);               // OK
    void bar(list<int, (2>1 ? 100 : 50)> *x)    // Not supported
    

    The type system is smart enough to figure out clever games you might try to play with typedef. For instance, consider this code:

    typedef int Integer;
    void foo(vector<int> *x, vector<Integer> *y);
    

    In this case, vector<Integer> is exactly the same type as vector<int>. The wrapper for foo() will accept either variant.

    6.18.1 The %template directive

    There are a couple of important points about template wrapping. First, a bare C++ template does not define any sort of runnable object-code for which SWIG can normally create a wrapper. Therefore, in order to wrap a template, you need to give SWIG information about a particular template instantiation (e.g., vector<int>, array<double>, etc.). Second, an instantiation name such as vector<int> is generally not a valid identifier name in most target languages. Thus, you will need to give the template instantiation a more suitable name such as intvector.

    To illustrate, consider the following class template definition:

    template<class T> class List {
    private:
      T *data;
      int nitems;
      int maxitems;
    public:
      List(int max) {
        data = new T [max];
        nitems = 0;
        maxitems = max;
      }
      ~List() {
        delete [] data;
      };
      void append(T obj) {
        if (nitems < maxitems) {
          data[nitems++] = obj;
        }
      }
      int length() {
        return nitems;
      }
      T get(int n) {
        return data[n];
      }
    };
    

    By itself, this class template is useless--SWIG simply ignores it because it doesn't know how to generate any code unless a definition of T is provided. The %template directive is required to instantiate the template for use in a target language. The directive requires an identifier name for use in the target language plus the template for instantiation. The example below instantiates List<int> for use as a class named intList:

    %template(intList) List<int>;
    

    The instantiation expands the template code as a C++ compiler would do and then makes it available under the given identifier name. Essentially it is the same as wrapping the following concept code where the class template definition has T expanded to int (note that this is not entirely valid syntax):

    %rename(intList) List<int>;       // Rename to a suitable identifier
    class List<int> {
    private:
      int *data;
      int nitems;
      int maxitems;
    public:
      List(int max);
      ~List();
      void append(int obj);
      int length();
      int get(int n);
    };
    

    The argument to %template() is the name of the instantiation in the target language. The name you choose should not conflict with any other declarations in the interface file with one exception---it is okay for the template name to match that of a typedef declaration. For example:

    %template(intList) List<int>;
    ...
    typedef List<int> intList;    // OK
    

    The %template directive must always appear after the definition of the template to be expanded, so the following will work:

    template<class T> class List { ... };
    %template(intList) List<int>;
    

    but if %template is used before the template definition, such as:

    %template(intList) List<int>;
    template<class T> class List { ... };
    

    SWIG will generate an error:

    example.i:3: Error: Template 'List' undefined.
    

    Since the type system knows how to handle typedef, it is generally not necessary to instantiate different versions of a template for typenames that are equivalent. For instance, consider this code:

    %template(intList) List<int>;
    typedef int Integer;
    ...
    void foo(List<Integer> *x);
    

    In this case, List<Integer> is exactly the same type as List<int>. Any use of List<Integer> is mapped back to the instantiation of List<int> created earlier. Therefore, it is not necessary to instantiate a new class for the type Integer (doing so is redundant and will simply result in code bloat).

    The template provided to %template for instantiation must be the actual template and not a typedef to a template.

    typedef List<int> ListOfInt;
    
    %template(intList) List<int>; // ok
    %template(intList) ListOfInt; // illegal - Syntax error
    

    6.18.2 Function templates

    SWIG can also generate wrappers for function templates using a similar technique to that shown above for class templates. For example:

    // Function template
    template<class T> T max(T a, T b) { return a > b ? a : b; }
    
    // Make some different versions of this function
    %template(maxint) max<int>;
    %template(maxdouble) max<double>;
    

    In this case, maxint and maxdouble become unique names for specific instantiations of the function.

    SWIG even supports overloaded templated functions. As usual the %template directive is used to wrap templated functions. For example:

    template<class T> void foo(T x) { };
    template<class T> void foo(T x, T y) { };
    
    %template(foo) foo<int>;
    

    This will generate two overloaded wrapper methods, the first will take a single integer as an argument and the second will take two integer arguments.

    6.18.3 Default template arguments

    The number of arguments supplied to %template should match that in the original template definition. Template default arguments are supported. For example:

    template vector<typename T, int max=100> class vector {
    ...
    };
    
    %template(intvec) vector<int>;           // OK
    %template(vec1000) vector<int, 1000>;     // OK
    

    The %template directive should not be used to wrap the same template instantiation more than once in the same scope. This will generate an error. For example:

    %template(intList) List<int>;
    %template(Listint) List<int>;    // Error.   Template already wrapped.
    

    This error is caused because the template expansion results in two identical classes with the same name. This generates a symbol table conflict. Besides, it probably more efficient to only wrap a specific instantiation only once in order to reduce the potential for code bloat.

    6.18.4 Template base classes

    When a template is instantiated using %template, information about that class is saved by SWIG and used elsewhere in the program. For example, if you wrote code like this,

    ...
    %template(intList) List<int>;
    ...
    class UltraList : public List<int> {
      ...
    };
    

    then SWIG knows that List<int> was already wrapped as a class called intList and arranges to handle the inheritance correctly. If, on the other hand, nothing is known about List<int> , you will get a warning message similar to this:

    example.h:42: Warning 401. Nothing known about class 'List< int >'. Ignored. 
    example.h:42: Warning 401. Maybe you forgot to instantiate 'List< int >' using %template. 
    

    If a class template inherits from another class template, you need to make sure that base classes are instantiated before derived classes. For example:

    template<class T> class Foo {
    ...
    };
    
    template<class T> class Bar : public Foo<T> {
    ...
    };
    
    // Instantiate base classes first 
    %template(intFoo) Foo<int>;
    %template(doubleFoo) Foo<double>;
    
    // Now instantiate derived classes
    %template(intBar) Bar<int>;
    %template(doubleBar) Bar<double>;
    

    The order is important since SWIG uses the instantiation names to properly set up the inheritance hierarchy in the resulting wrapper code (and base classes need to be wrapped before derived classes). Don't worry--if you get the order wrong, SWIG should generate a warning message.

    Occasionally, you may need to tell SWIG about base classes that are defined by templates, but which aren't supposed to be wrapped. Since SWIG is not able to automatically instantiate templates for this purpose, you must do it manually. To do this, simply use the empty template instantiation, that is, %template with no name. For example:

    // Instantiate traits<double, double>, but don't wrap it.
    %template() traits<double, double>;
    

    If you have to instantiate a lot of different classes for many different types, you might consider writing a SWIG macro. For example:

    %define TEMPLATE_WRAP(prefix, T...) 
    %template(prefix ## Foo) Foo<T >;
    %template(prefix ## Bar) Bar<T >;
    ...
    %enddef
    
    TEMPLATE_WRAP(int, int)
    TEMPLATE_WRAP(double, double)
    TEMPLATE_WRAP(String, char *)
    TEMPLATE_WRAP(PairStringInt, std::pair<string, int>)
    ...
    

    Note the use of a vararg macro for the type T. If this wasn't used, the comma in the templated type in the last example would not be possible.

    6.18.5 Template specialization

    The SWIG template mechanism does support specialization. For instance, if you define a class like this,

    template<> class List<int> {
    private:
      int *data;
      int nitems;
      int maxitems;
    public:
      List(int max);
      ~List();
      void append(int obj);
      int length();
      int get(int n);
    };
    

    then SWIG will use this code whenever the user expands List<int> . In practice, this may have very little effect on the underlying wrapper code since specialization is often used to provide slightly modified method bodies (which are ignored by SWIG). However, special SWIG directives such as %typemap, %extend, and so forth can be attached to a specialization to provide customization for specific types.

    Partial template specialization is partially supported by SWIG. For example, this code defines a template that is applied when the template argument is a pointer.

    template<class T> class List<T*> {
    private:
      T *data;
      int nitems;
      int maxitems;
    public:
      List(int max);
      ~List();
      void append(T obj);
      int length();
      T get(int n);
    };
    

    SWIG supports both template explicit specialization and partial specialization. Consider:

    template<class T1, class T2> class Foo { };                     // (1) primary template
    template<>                   class Foo<double *, int *> { };    // (2) explicit specialization
    template<class T1, class T2> class Foo<T1, T2 *> { };           // (3) partial specialization
    

    SWIG is able to properly match explicit instantiations:

    Foo<double *, int *>     // explicit specialization matching (2)
    

    SWIG implements template argument deduction so that the following partial specialization examples work just like they would with a C++ compiler:

    Foo<int *, int *>        // partial specialization matching (3)
    Foo<int *, const int *>  // partial specialization matching (3)
    Foo<int *, int **>       // partial specialization matching (3)
    

    6.18.6 Member templates

    Member templates are supported. The underlying principle is the same as for normal templates--SWIG can't create a wrapper unless you provide more information about types. For example, a class with a member function template might look like this:

    class Foo {
    public:
      template<class T> void bar(T x, T y) { ... };
      ...
    };
    

    To expand the template, simply use %template inside the class.

    class Foo {
    public:
      template<class T> void bar(T x, T y) { ... };
      ...
      %template(barint)    bar<int>;
      %template(bardouble) bar<double>;
    };
    

    Or, if you want to leave the original class definition alone, just do this:

    class Foo {
    public:
      template<class T> void bar(T x, T y) { ... };
      ...
    };
    ...
    %extend Foo {
      %template(barint)    bar<int>;
      %template(bardouble) bar<double>;
    };
    

    or simply

    class Foo {
    public:
      template<class T> void bar(T x, T y) { ... };
      ...
    };
    ...
    
    %template(bari) Foo::bar<int>;
    %template(bard) Foo::bar<double>;
    

    In this case, the %extend directive is not needed, and %template does exactly the same job, i.e., it adds two new methods to the Foo class.

    Now, if your target language supports overloading, you can even try

    %template(bar) Foo::bar<int>;
    %template(bar) Foo::bar<double>;
    

    and since the two new wrapped methods have the same name 'bar', they will be overloaded, and when called, the correct method will be dispatched depending on the argument type.

    When used with members, the %template directive may be placed in another class template. Here is a slightly perverse example:

    // A template
    template<class T> class Foo {
    public:
      // A member template
      template<class S> T bar(S x, S y) { ... };
      ...
    };
    
    // Expand a few member templates
    %extend Foo {
      %template(bari) bar<int>;
      %template(bard) bar<double>;
    }
    
    // Create some wrappers for the template
    %template(Fooi) Foo<int>;
    %template(Food) Foo<double>;
    

    Miraculously, you will find that each expansion of Foo has member functions bari() and bard() added.

    A common use of member templates is to define constructors for copies and conversions. For example:

    template<class T1, class T2> struct pair {
      T1 first;
      T2 second;
      pair() : first(T1()), second(T2()) { }
      pair(const T1 &x, const T2 &y) : first(x), second(y) { }
      template<class U1, class U2> pair(const pair<U1, U2> &x)
                                           : first(x.first), second(x.second) { }
    };
    

    This declaration is perfectly acceptable to SWIG, but the constructor template will be ignored unless you explicitly expand it. To do that, you could expand a few versions of the constructor in the class template itself. For example:

    %extend pair {
      %template(pair) pair<T1, T2>;        // Generate default copy constructor
    };
    

    When using %extend in this manner, notice how you can still use the template parameters in the original template definition.

    Alternatively, you could expand the constructor template in selected instantiations. For example:

    // Instantiate a few versions
    %template(pairii) pair<int, int>;
    %template(pairdd) pair<double, double>;
    
    // Create a default constructor only 
    %extend pair<int, int> {
      %template(paird) pair<int, int>;         // Default constructor
    };
    
    // Create default and conversion constructors 
    %extend pair<double, double> {
      %template(paird) pair<double, dobule>;   // Default constructor
      %template(pairc) pair<int, int>;         // Conversion constructor
    };
    

    And if your target language supports overloading, then you can try instead:

    // Create default and conversion constructors 
    %extend pair<double, double> {
      %template(pair) pair<double, dobule>;   // Default constructor
      %template(pair) pair<int, int>;         // Conversion constructor
    };
    

    In this case, the default and conversion constructors have the same name. Hence, SWIG will overload them and define an unique visible constructor, that will dispatch the proper call depending on the argument type.

    6.18.7 Scoping and templates

    The %template directive for a class template is the equivalent to an explicit instantiation of a C++ class template. The scope for a valid %template instantiation is the same as the scope required for a valid explicit instantiation of a C++ template. A definition of the template for the explicit instantiation must be in scope where the instantiation is declared and must not be enclosed within a different namespace.

    For example, a few %template instantiations and C++ explicit instantiations are shown below:

    namespace N {
      template<typename T> class C {};
    }
    
    // valid
    %template(cin) N::C<int>;
    template class N::C<int>;
    
    // valid
    namespace N {
      %template(cin) C<int>;
      template class C<int>;
    }
    
    // valid
    using namespace N;
    %template(cin) C<int>;
    template class C<int>;
    
    // valid
    using N::C;
    %template(cin) C<int>;
    template class C<int>;
    
    // ill-formed
    namespace unrelated {
      using N::C;
      %template(cin) C<int>;
      template class C<int>;
    }
    
    // ill-formed
    namespace unrelated {
      using namespace N;
      %template(cin) C<int>;
      template class C<int>;
    }
    
    // ill-formed
    namespace unrelated {
      namespace N {
        %template(cin) C<int>;
        template class C<int>;
      }
    }
    
    // ill-formed
    namespace unrelated {
      %template(cin) N::C<int>;
      template class N::C<int>;
    }
    

    When the scope is incorrect, such as for the ill-formed examples above, an error occurs:

    cpp_template_scope.i:34: Error: 'C' resolves to 'N::C' and was incorrectly instantiated
    in scope 'unrelated' instead of within scope 'N'.
    

    A note for the C++ standard geeks out there; a valid instantiation is one which conforms to the C++03 standard as C++11 made a change to disallow using declarations and using directives to find a template.

    // valid C++03, ill-formed C++11
    using N::C;
    template class C<int>;
    

    Compatibility Note: Versions prior to SWIG-4.0.0 did not error out with incorrectly scoped %template declarations, but this led to numerous subtle template scope problems.

    6.18.8 More on templates

    If all of this isn't quite enough and you really want to make someone's head explode, SWIG directives such as %rename, %extend, and %typemap can be included directly in template definitions. For example:

    // File : list.h
    template<class T> class List {
      ...
    public:
      %rename(__getitem__) get(int);
      List(int max);
      ~List();
      ...
      T get(int index);
      %extend {
        char *__str__() {
          /* Make a string representation */
          ...
        }
      }
    };
    

    In this example, the extra SWIG directives are propagated to every template instantiation.

    It is also possible to separate these declarations from the class template. For example:

    %rename(__getitem__) List::get;
    %extend List {
      char *__str__() {
        /* Make a string representation */
        ...
      }
      /* Make a copy */
      T *__copy__() {
        return new List<T>(*$self);
      }
    };
    
    ...
    template<class T> class List {
      ...
      public:
      List() { }
      T get(int index);
      ...
    };
    

    When %extend is decoupled from the class definition, it is legal to use the same template parameters as provided in the class definition. These are replaced when the template is expanded. In addition, the %extend directive can be used to add additional methods to a specific instantiation. For example:

    %template(intList) List<int>;
    
    %extend List<int> {
      void blah() {
        printf("Hey, I'm an List<int>!\n");
      }
    };
    

    It is even possible to extend a class via %extend with template methods, for example:

    %include <std_string.i>
    
    %inline %{
    class ExtendMe {
    public:
      template <typename T>
      T do_stuff_impl(int a, T b, double d) {
        return b;
      }
    };
    %}
    
    %extend ExtendMe {
      template<typename T>
      T do_overloaded_stuff(T b) {
        return $self->do_stuff_impl(0, b, 4.0);
      }
    }
    %template(do_overloaded_stuff) ExtendMe::do_overloaded_stuff<std::string>;
    %template(do_overloaded_stuff) ExtendMe::do_overloaded_stuff<double>;
    

    The wrapped ExtendMe class will then have two (overloaded) methods called do_overloaded_stuff.

    Compatibility Note: Extending a class with template methods was added in version 3.0.12

    Needless to say, SWIG's template support provides plenty of opportunities to break the universe. That said, an important final point is that SWIG does not perform extensive error checking of templates! Specifically, SWIG does not perform type checking nor does it check to see if the actual contents of the template declaration make any sense. Since the C++ compiler checks this when it compiles the resulting wrapper file, there is no practical reason for SWIG to duplicate this functionality.

    As SWIG's template support does not perform type checking %template can be used as early as after a template declaration. You can, and rarely have to, use %template before the template parameters have been declared. For example:

    template <class T> class OuterTemplateClass {};
    
    // The nested class OuterClass::InnerClass inherits from the class template
    // OuterTemplateClass<OuterClass::InnerStruct> and thus the template needs
    // to be expanded with %template before the OuterClass declaration.
    %template(OuterTemplateClass_OuterClass__InnerStruct)
      OuterTemplateClass<OuterClass::InnerStruct>
    
    
    // Don't forget to use %feature("flatnested") for OuterClass::InnerStruct and
    // OuterClass::InnerClass if the target language doesn't support nested classes.
    class OuterClass {
      public:
        // Forward declarations:
        struct InnerStruct;
        class InnerClass;
    };
    
    struct OuterClass::InnerStruct {};
    
    // Expanding the template at this point with %template is too late as the
    // OuterClass::InnerClass declaration is processed inside OuterClass.
    
    class OuterClass::InnerClass : public OuterTemplateClass<InnerStruct> {};
    

    Compatibility Note: The first implementation of template support relied heavily on macro expansion in the preprocessor. Templates have been more tightly integrated into the parser and type system in SWIG-1.3.12 and the preprocessor is no longer used. Code that relied on preprocessing features in template expansion will no longer work. However, SWIG still allows the # operator to be used to generate a string from a template argument.

    Compatibility Note: In earlier versions of SWIG, the %template directive introduced a new class name. This name could then be used with other directives. For example:

    %template(vectori) vector<int>;
    %extend vectori {
      void somemethod() { }
    };
    

    This behavior is no longer supported. Instead, you should use the original template name as the class name. For example:

    %template(vectori) vector<int>;
    %extend vector<int> {
      void somemethod() { }
    };
    

    Similar changes apply to typemaps and other customization features.

    6.19 Namespaces

    Support for C++ namespaces is comprehensive, but by default simple, however, some target languages can turn on more advanced namespace support via the nspace feature, described later. Code within unnamed namespaces is ignored as there is no external access to symbols declared within the unnamed namespace. Before detailing the default implementation for named namespaces, it is worth noting that the semantics of C++ namespaces is extremely non-trivial--especially with regard to the C++ type system and class machinery. At a most basic level, namespaces are sometimes used to encapsulate common functionality. For example:

    namespace math {
      double sin(double);
      double cos(double);
    
      class Complex {
        double im, re;
      public:
        ...
      };
      ...
    };
    

    Members of the namespace are accessed in C++ by prepending the namespace prefix to names. For example:

    double x = math::sin(1.0);
    double magnitude(math::Complex *c);
    math::Complex c;
    ...
    

    At this level, namespaces are relatively easy to manage. However, things start to get very ugly when you throw in the other ways a namespace can be used. For example, selective symbols can be exported from a namespace with using.

    using math::Complex;
    double magnitude(Complex *c);       // Namespace prefix stripped
    

    Similarly, the contents of an entire namespace can be made available like this:

    using namespace math;
    double x = sin(1.0);
    double magnitude(Complex *c);
    

    Alternatively, a namespace can be aliased:

    namespace M = math;
    double x = M::sin(1.0);
    double magnitude(M::Complex *c);
    

    Using combinations of these features, it is possible to write head-exploding code like this:

    namespace A {
      class Foo {
      };
    }
    
    namespace B {
      namespace C {
        using namespace A;
      }
      typedef C::Foo FooClass;
    }
    
    namespace BIGB = B;
    
    namespace D {
      using BIGB::FooClass;
      class Bar : public FooClass {
      }
    };
    
    class Spam : public D::Bar {
    };
    
    void evil(A::Foo *a, B::FooClass *b, B::C::Foo *c, BIGB::FooClass *d,
              BIGB::C::Foo *e, D::FooClass *f);
    
    

    Given the possibility for such perversion, it's hard to imagine how every C++ programmer might want such code wrapped into the target language. Clearly this code defines three different classes. However, one of those classes is accessible under at least six different names!

    SWIG fully supports C++ namespaces in its internal type system and class handling code. If you feed SWIG the above code, it will be parsed correctly, it will generate compilable wrapper code, and it will produce a working scripting language module. However, the default wrapping behavior is to flatten namespaces in the target language. This means that the contents of all namespaces are merged together in the resulting scripting language module. For example, if you have code like this,

    %module foo
    namespace foo {
      void bar(int);
      void spam();
    }
    
    namespace bar {
      void blah();
    }
    
    

    then SWIG simply creates three wrapper functions bar(), spam(), and blah() in the target language. SWIG does not prepend the names with a namespace prefix nor are the functions packaged in any kind of nested scope. Note that the default handling of flattening all the namespace scopes in the target language can be changed via the nspace feature.

    There is some rationale for taking this approach. Since C++ namespaces are often used to define modules in C++, there is a natural correlation between the likely contents of a SWIG module and the contents of a namespace. For instance, it would not be unreasonable to assume that a programmer might make a separate extension module for each C++ namespace. In this case, it would be redundant to prepend everything with an additional namespace prefix when the module itself already serves as a namespace in the target language. Or put another way, if you want SWIG to keep namespaces separate, simply wrap each namespace with its own SWIG interface.

    Because namespaces are flattened, it is possible for symbols defined in different namespaces to generate a name conflict in the target language. For example:

    namespace A {
      void foo(int);
    }
    namespace B {
      void foo(double);
    }
    

    When this conflict occurs, you will get an error message that resembles this:

    example.i:26. Error. 'foo' is multiply defined in the generated target language module.
    example.i:23. Previous declaration of 'foo'
    

    To resolve this error, simply use %rename to disambiguate the declarations. For example:

    %rename(B_foo) B::foo;
    ...
    namespace A {
      void foo(int);
    }
    namespace B {
      void foo(double);     // Gets renamed to B_foo
    }
    

    Similarly, %ignore can be used to ignore declarations.

    using declarations do not have any effect on the generated wrapper code. They are ignored by SWIG language modules and they do not result in any code. However, these declarations are used by the internal type system to track type-names. Therefore, if you have code like this:

    namespace A {
      typedef int Integer;
    }
    using namespace A;
    void foo(Integer x);
    

    SWIG knows that Integer is the same as A::Integer which is the same as int.

    Namespaces may be combined with templates. If necessary, the %template directive can be used to expand a template defined in a different namespace. For example:

    namespace foo {
      template<typename T> T max(T a, T b) { return a > b ? a : b; }
    }
    
    using foo::max;
    
    %template(maxint)   max<int>;           // Okay.
    %template(maxfloat) foo::max<float>;    // Okay (qualified name).
    
    namespace bar {
      using namespace foo;
      %template(maxdouble)  max<double>;    // Okay.
    }
    

    The combination of namespaces and other SWIG directives may introduce subtle scope-related problems. The key thing to keep in mind is that all SWIG generated wrappers are produced in the global namespace. Symbols from other namespaces are always accessed using fully qualified names---names are never imported into the global space unless the interface happens to do so with a using declaration. In almost all cases, SWIG adjusts typenames and symbols to be fully qualified. However, this is not done in code fragments such as function bodies, typemaps, exception handlers, and so forth. For example, consider the following:

    namespace foo {
      typedef int Integer;
      class bar {
        public:
        ...
      };
    }
    
    %extend foo::bar {
      Integer add(Integer x, Integer y) {
        Integer r = x + y;        // Error. Integer not defined in this scope
        return r;
      }
    };
    

    In this case, SWIG correctly resolves the added method parameters and return type to foo::Integer. However, since function bodies aren't parsed and such code is emitted in the global namespace, this code produces a compiler error about Integer. To fix the problem, make sure you use fully qualified names. For example:

    %extend foo::bar {
      Integer add(Integer x, Integer y) {
        foo::Integer r = x + y;        // Ok.
        return r;
      }
    };
    

    Note: SWIG does not propagate using declarations to the resulting wrapper code. If these declarations appear in an interface, they should also appear in any header files that might have been included in a %{ ... %} section. In other words, don't insert extra using declarations into a SWIG interface unless they also appear in the underlying C++ code.

    Note: Code inclusion directives such as %{ ... %} or %inline %{ ... %} should not be placed inside a namespace declaration. The code emitted by these directives will not be enclosed in a namespace and you may get very strange results. If you need to use namespaces with these directives, consider the following:

    // Good version
    %inline %{
    namespace foo {
      void bar(int) { ... }
      ...
    }
    %}
    
    // Bad version.  Emitted code not placed in namespace.
    namespace foo {
    %inline %{
      void bar(int) { ... }   /* I'm bad */
      ...
      %}
    }
    

    Note: When the %extend directive is used inside a namespace, the namespace name is included in the generated functions. For example, if you have code like this,

    namespace foo {
      class bar {
        public:
          %extend {
            int blah(int x);
          };
      };
    }
    

    the added method blah() is mapped to a function int foo_bar_blah(foo::bar *self, int x). This function resides in the global namespace.

    Note: Although namespaces are flattened in the target language, the SWIG generated wrapper code observes the same namespace conventions as used in the input file. Thus, if there are no symbol conflicts in the input, there will be no conflicts in the generated code.

    Note: In the same way that no resolution is performed on parameters, a conversion operator name must match exactly to how it is defined. Do not change the qualification of the operator. For example, suppose you had an interface like this:

    namespace foo {
      class bar;
      class spam {
        public:
        ...
        operator bar();      // Conversion of spam -> bar
        ...
      };
    }
    

    The following is how the feature is expected to be written for a successful match:

    %rename(tofoo) foo::spam::operator bar();
    

    The following does not work as no namespace resolution is performed in the matching of conversion operator names:

    %rename(tofoo) foo::spam::operator foo::bar();
    

    Note, however, that if the operator is defined using a qualifier in its name, then the feature must use it too...

    %rename(tofoo) foo::spam::operator bar();      // will not match
    %rename(tofoo) foo::spam::operator foo::bar(); // will match
    namespace foo {
      class bar;
      class spam {
        public:
        ...
        operator foo::bar();
        ...
      };
    }
    

    Compatibility Note: Versions of SWIG prior to 1.3.32 were inconsistent in this approach. A fully qualified name was usually required, but would not work in some situations.

    Note: The flattening of namespaces is only intended to serve as a basic namespace implementation. More advanced handling of namespaces is discussed next.

    6.19.1 The nspace feature for namespaces

    Some target languages provide support for the nspace feature. The feature can be applied to any class, struct, union or enum declared within a named namespace. The feature wraps the type within the target language specific concept of a namespace, for example, a Java package or C# namespace. Please see the language specific sections to see if the target language you are interested in supports the nspace feature.

    The feature is demonstrated below for C# using the following example:

    %feature("nspace") MyWorld::Material::Color;
    %nspace MyWorld::Wrapping::Color; // %nspace is a macro for %feature("nspace")
    
    namespace MyWorld {
      namespace Material {
        class Color {
        ...
        };
      }
      namespace Wrapping {
        class Color {
        ...
        };
      }
    }
    

    Without the nspace feature directives above or %rename , you would get the following warning resulting in just one of the Color classes being available for use from the target language:

    example.i:9: Error: 'Color' is multiply defined in the generated target language module.
    example.i:5: Error: Previous declaration of 'Color'
    

    With the nspace feature the two Color classes are wrapped into the equivalent C# namespaces. A fully qualified constructor call of each these two types in C# is then:

    MyWorld.Material.Color materialColor = new MyWorld.Material.Color();
    MyWorld.Wrapping.Color wrappingColor = new MyWorld.Wrapping.Color();
    

    Note that the nspace feature does not apply to variables and functions simply declared in a namespace. For example, the following symbols cannot co-exist in the target language without renaming. This may change in a future version.

    namespace MyWorld {
      namespace Material {
        int quantity;
        void dispatch();
      }
      namespace Wrapping {
        int quantity;
        void dispatch();
      }
    }
    

    Compatibility Note: The nspace feature was first introduced in SWIG-2.0.0.

    6.20 Renaming templated types in namespaces

    As has been mentioned, when %rename includes parameters, the parameter types must match exactly (no typedef or namespace resolution is performed). SWIG treats templated types slightly differently and has an additional matching rule so unlike non-templated types, an exact match is not always required. If the fully qualified templated type is specified, it will have a higher precedence over the generic template type. In the example below, the generic template type is used to rename to bbb and the fully qualified type is used to rename to ccc.

    %rename(bbb) Space::ABC::aaa(T t);                     // will match but with lower precedence than ccc
    %rename(ccc) Space::ABC<Space::XYZ>::aaa(Space::XYZ t);// will match but with higher precedence
                                                           // than bbb
    
    namespace Space {
      class XYZ {};
      template<typename T> struct ABC {
        void aaa(T t) {}
      };
    }
    %template(ABCXYZ) Space::ABC<Space::XYZ>;
    

    It should now be apparent that there are many ways to achieve a renaming with %rename. This is demonstrated by the following two examples, which are effectively the same as the above example. Below shows how %rename can be placed inside a namespace.

    namespace Space {
      %rename(bbb) ABC::aaa(T t);                     // will match but with lower precedence than ccc
      %rename(ccc) ABC<Space::XYZ>::aaa(Space::XYZ t);// will match but with higher precedence than bbb
      %rename(ddd) ABC<Space::XYZ>::aaa(XYZ t);       // will not match
    }
    
    namespace Space {
      class XYZ {};
      template<typename T> struct ABC {
        void aaa(T t) {}
      };
    }
    %template(ABCXYZ) Space::ABC<Space::XYZ>;
    

    Note that ddd does not match as there is no namespace resolution for parameter types and the fully qualified type must be specified for template type expansion. The following example shows how %rename can be placed within %extend.

    namespace Space {
      %extend ABC {
        %rename(bbb) aaa(T t);         // will match but with lower precedence than ccc
      }
      %extend ABC<Space::XYZ> {
        %rename(ccc) aaa(Space::XYZ t);// will match but with higher precedence than bbb
        %rename(ddd) aaa(XYZ t);       // will not match
      }
    }
    
    namespace Space {
      class XYZ {};
      template<typename T> struct ABC {
        void aaa(T t) {}
      };
    }
    %template(ABCXYZ) Space::ABC<Space::XYZ>;
    

    6.21 Exception specifications

    When C++ programs utilize exceptions, exceptional behavior is sometimes specified as part of a function or method declaration. For example:

    class Error { };
    
    class Foo {
    public:
      ...
      void blah() throw(Error);
      ...
    };
    

    If an exception specification is used, SWIG automatically generates wrapper code for catching the indicated exception and, when possible, rethrowing it into the target language, or converting it into an error in the target language otherwise. For example, in Python, you can write code like this:

    f = Foo()
    try:
        f.blah()
    except Error, e:
        # e is a wrapped instance of "Error"
    

    Details of how to tailor code for handling the caught C++ exception and converting it into the target language's exception/error handling mechanism is outlined in the "throws" typemap section.

    Since exception specifications are sometimes only used sparingly, this alone may not be enough to properly handle C++ exceptions. To do that, a different set of special SWIG directives are used. Consult the "Exception handling with %exception " section for details. The next section details a way of simulating an exception specification or replacing an existing one.

    6.22 Exception handling with %catches

    Exceptions are automatically handled for methods with an exception specification. Similar handling can be achieved for methods without exception specifications through the %catches feature. It is also possible to replace any declared exception specification using the %catches feature. In fact, %catches uses the same "throws" typemaps that SWIG uses for exception specifications in handling exceptions. The %catches feature must contain a list of possible types that can be thrown. For each type that is in the list, SWIG will generate a catch handler, in the same way that it would for types declared in the exception specification. Note that the list can also include the catch all specification "...". For example,

    struct EBase { virtual ~EBase(); };
    struct Error1 : EBase { };
    struct Error2 : EBase { };
    struct Error3 : EBase { };
    struct Error4 : EBase { };
    
    %catches(Error1, Error2, ...) Foo::bar();
    %catches(EBase) Foo::blah();
    
    class Foo {
    public:
      ...
      void bar();
      void blah() throw(Error1, Error2, Error3, Error4);
      ...
    };
    

    For the Foo::bar() method, which can throw anything, SWIG will generate catch handlers for Error1, Error2 as well as a catch all handler (...). Each catch handler will convert the caught exception and convert it into a target language error/exception. The catch all handler will convert the caught exception into an unknown error/exception.

    Without the %catches feature being attached to Foo::blah(), SWIG will generate catch handlers for all of the types in the exception specification, that is, Error1, Error2, Error3, Error4. However, with the %catches feature above, just a single catch handler for the base class, EBase will be generated to convert the C++ exception into a target language error/exception.

    6.23 Pointers to Members

    Starting with SWIG-1.3.7, there is limited parsing support for pointers to C++ class members. For example:

    double do_op(Object *o, double (Object::*callback)(double, double));
    extern double (Object::*fooptr)(double, double);
    %constant double (Object::*FOO)(double, double) = &Object::foo;
    

    Although these kinds of pointers can be parsed and represented by the SWIG type system, few language modules know how to handle them due to implementation differences from standard C pointers. Readers are strongly advised to consult an advanced text such as the "The Annotated C++ Manual" for specific details.

    When pointers to members are supported, the pointer value might appear as a special string like this:

    >>> print example.FOO
    _ff0d54a800000000_m_Object__f_double_double__double
    >>>
    

    In this case, the hexadecimal digits represent the entire value of the pointer which is usually the contents of a small C++ structure on most machines.

    SWIG's type-checking mechanism is also more limited when working with member pointers. Normally SWIG tries to keep track of inheritance when checking types. However, no such support is currently provided for member pointers.

    6.24 Smart pointers and operator->()

    In some C++ programs, objects are often encapsulated by smart-pointers or proxy classes. This is sometimes done to implement automatic memory management (reference counting) or persistence. Typically a smart-pointer is defined by a class template where the -> operator has been overloaded. This class is then wrapped around some other class. For example:

    // Smart-pointer class
    template<class T> class SmartPtr {
      T *pointee;
    public:
      SmartPtr(T *p) : pointee(p) { ... }
      T *operator->() {
        return pointee;
      }
      ...
    };
    
    // Ordinary class
    class Foo_Impl {
    public:
      int x;
      virtual void bar();
      ...
    };
    
    // Smart-pointer wrapper
    typedef SmartPtr<Foo_Impl> Foo;
    
    // Create smart pointer Foo
    Foo make_Foo() {
      return SmartPtr<Foo_Impl>(new Foo_Impl());
    }
    
    // Do something with smart pointer Foo
    void do_something(Foo f) {
      printf("x = %d\n", f->x);
      f->bar();
    }
    
    // Call the wrapped smart pointer proxy class in the target language 'Foo'
    %template(Foo) SmartPtr<Foo_Impl>;
    

    A key feature of this approach is that by defining operator-> the methods and attributes of the object wrapped by a smart pointer are transparently accessible. For example, expressions such as these (from the previous example),

    f->x
    f->bar()
    

    are transparently mapped to the following

    (f.operator->())->x;
    (f.operator->())->bar();
    

    When generating wrappers, SWIG tries to emulate this functionality to the extent that it is possible. To do this, whenever operator->() is encountered in a class, SWIG looks at its returned type and uses it to generate wrappers for accessing attributes of the underlying object. For example, wrapping the above code produces wrappers like this:

    int Foo_x_get(Foo *f) {
      return (*f)->x;
    }
    void Foo_x_set(Foo *f, int value) {
      (*f)->x = value;
    }
    void Foo_bar(Foo *f) {
      (*f)->bar();
    }
    

    These wrappers take a smart-pointer instance as an argument, but dereference it in a way to gain access to the object returned by operator->(). You should carefully compare these wrappers to those in the first part of this chapter (they are slightly different).

    The end result is that access looks very similar to C++. For example, you could do this in Python:

    >>> f = make_Foo()
    >>> print f.x
    0
    >>> f.bar()
    >>>
    

    When generating wrappers through a smart-pointer, SWIG tries to generate wrappers for all methods and attributes that might be accessible through operator->(). This includes any methods that might be accessible through inheritance. However, there are a number of restrictions:

    • Member variables and methods are wrapped through a smart pointer. Enumerations, constructors, and destructors are not wrapped.
    • If the smart-pointer class and the underlying object both define a method or variable of the same name, then the smart-pointer version has precedence. For example, if you have this code

      class Foo {
      public:
        int x;
      };
      
      class Bar {
      public:
        int x;       
        Foo *operator->();
      };
      

      then the wrapper for Bar::x accesses the x defined in Bar, and not the x defined in Foo.

    If your intent is to only expose the smart-pointer class in the interface, it is not necessary to wrap both the smart-pointer class and the class for the underlying object. However, you must still tell SWIG about both classes if you want the technique described in this section to work. To only generate wrappers for the smart-pointer class, you can use the %ignore directive. For example:

    %ignore Foo;
    class Foo {       // Ignored
    };
    
    class Bar {
    public:
      Foo *operator->();
      ...
    };
    

    Alternatively, you can import the definition of Foo from a separate file using %import.

    Note: When a class defines operator->(), the operator itself is wrapped as a method __deref__(). For example:

    f = Foo()               # Smart-pointer
    p = f.__deref__()       # Raw pointer from operator->
    

    Note: To disable the smart-pointer behavior, use %ignore to ignore operator->(). For example:

    %ignore Bar::operator->;
    

    Note: Smart pointer support was first added in SWIG-1.3.14.

    6.25 C++ reference counted objects - ref/unref feature

    Another similar idiom in C++ is the use of reference counted objects. Consider for example:

    class RCObj  {
      // implement the ref counting mechanism
      int add_ref();
      int del_ref();
      int ref_count();
    
    public:
      virtual ~RCObj() = 0;
    
      int ref() const {
        return add_ref();
      }
    
      int unref() const {
        if (ref_count() == 0 || del_ref() == 0 ) {
          delete this;
          return 0;
        }
        return ref_count();
      }
    };
    
    
    class A : RCObj {
    public:
      A();
      int foo();
    };
    
    
    class B {
      A *_a;
    
    public:
      B(A *a) : _a(a) { 
        a->ref(); 
      }
    
      ~B() { 
        a->unref(); 
      }
    };
    
    int main() {
      A *a  = new A();       // (count: 0)
      a->ref();           // 'a' ref here (count: 1)
    
      B *b1 = new B(a);   // 'a' ref here (count: 2)
      if (1 + 1 == 2) {
        B *b2 = new B(a); // 'a' ref here (count: 3)
        delete b2;        // 'a' unref, but not deleted (count: 2)
      }
    
      delete b1;          // 'a' unref, but not deleted (count: 1)
      a->unref();         // 'a' unref and deleted (count: 0)
    }
    

    In the example above, the 'A' class instance 'a' is a reference counted object, which can't be deleted arbitrarily since it is shared between the objects 'b1' and 'b2'. 'A' is derived from a Reference Counted Object 'RCObj', which implements the ref/unref idiom.

    To tell SWIG that 'RCObj' and all its derived classes are reference counted objects, use the "ref" and "unref" features. These are also available as %refobject and %unrefobject, respectively. For example:

    %module example
    ...
    
    %feature("ref")   RCObj "$this->ref();"
    %feature("unref") RCObj "$this->unref();"
    
    %include "rcobj.h"
    %include "A.h"
    ...
    

    where the code passed to the "ref" and "unref" features will be executed as needed whenever a new object is passed to Python, or when Python tries to release the proxy object instance, respectively.

    On the Python side, the use of a reference counted object is no different to any other regular instance:

    def create_A():
        a = A()         # SWIG ref 'a' - new object is passed to Python (count: 1)
        b1 = B(a)       # C++ ref 'a (count: 2)
        if 1 + 1 == 2:
            b2 = B(a)   # C++ ref 'a' (count: 3)
        return a        # 'b1' and 'b2' are released and deleted, C++ unref 'a' twice (count: 1)
    
    a = create_A()      # (count: 1)
    exit                # 'a' is released, SWIG unref 'a' called in the destructor wrapper (count: 0)
    

    Note that the user doesn't explicitly need to call 'a->ref()' nor 'a->unref()' (and neither 'delete a'). Instead, SWIG takes cares of executing the "ref" and "unref" calls as needed. If the user doesn't specify the "ref/unref" feature for a type, SWIG will produce code equivalent to defining these features:

    %feature("ref")   ""
    %feature("unref") "delete $this;"
    

    In other words, SWIG will not do anything special when a new object is passed to Python, and it will always 'delete' the underlying object when Python releases the proxy instance.

    The %newobject feature is designed to indicate to the target language that it should take ownership of the returned object. When used in conjunction with a type that has the "ref" feature associated with it, it additionally emits the code in the "ref" feature into the C++ wrapper. Consider wrapping the following factory function in addition to the above:

    %newobject AFactory;
    A *AFactory() {
      return new A();
    }
    

    The AFactory function now acts much like a call to the A constructor with respect to memory handling:

    a = AFactory()    # SWIG ref 'a' due to %newobject (count: 1)
    exit              # 'a' is released, SWIG unref 'a' called in the destructor wrapper (count: 0)
    

    6.26 Using declarations and inheritance

    using declarations are sometimes used to adjust access to members of base classes. For example:

    class Foo {
    public:
      int  blah(int x);
    };
    
    class Bar {
    public:
      double blah(double x);
    };
    
    class FooBar : public Foo, public Bar {
    public:
      using Foo::blah;
      using Bar::blah;
      char *blah(const char *x);
    };
    

    In this example, the using declarations make different versions of the overloaded blah() method accessible from the derived class. For example:

    FooBar *f;
    f->blah(3);         // Ok. Invokes Foo::blah(int)
    f->blah(3.5);       // Ok. Invokes Bar::blah(double)
    f->blah("hello");   // Ok. Invokes FooBar::blah(const char *);
    

    SWIG emulates the same functionality when creating wrappers. For example, if you wrap this code in Python, the module works just like you would expect:

    >>> import example
    >>> f = example.FooBar()
    >>> f.blah(3)
    >>> f.blah(3.5)
    >>> f.blah("hello")
    

    using declarations can also be used to change access when applicable. For example:

    class Foo {
    protected:
      int x;
      int blah(int x);
    };
    
    class Bar : public Foo {
    public:
      using Foo::x;       // Make x public
      using Foo::blah;    // Make blah public
    };
    

    This also works in SWIG---the exposed declarations will be wrapped normally.

    When using declarations are used as shown in these examples, declarations from the base classes are copied into the derived class and wrapped normally. When copied, the declarations retain any properties that might have been attached using %rename , %ignore, or %feature. Thus, if a method is ignored in a base class, it will also be ignored by a using declaration.

    Because a using declaration does not provide fine-grained control over the declarations that get imported, it may be difficult to manage such declarations in applications that make heavy use of SWIG customization features. If you can't get using to work correctly, you can always change the interface to the following:

    
    class FooBar : public Foo, public Bar {
    public:
    #ifndef SWIG
      using Foo::blah;
      using Bar::blah;
    #else
      int blah(int x);         // explicitly tell SWIG about other declarations
      double blah(double x);
    #endif
    
      char *blah(const char *x);
    };
    

    Notes:

    • If a derived class redefines a method defined in a base class, then a using declaration won't cause a conflict. For example:

      class Foo {
      public:
        int blah(int );
        double blah(double);
      };
      
      class Bar : public Foo {
      public:
        using Foo::blah;    // Only imports blah(double);
        int blah(int);
      };
      
    • Resolving ambiguity in overloading may prevent declarations from being imported by using. For example:

      %rename(blah_long) Foo::blah(long);
      class Foo {
      public:
        int blah(int);
        long blah(long);  // Renamed to blah_long
      };
      
      class Bar : public Foo {
      public:
        using Foo::blah;     // Only imports blah(int)
        double blah(double x);
      };
      

    6.27 Nested classes

    If the target language supports the nested classes concept (like Java), the nested C++ classes are wrapped as nested target language proxy classes. (In case of Java - "static" nested classes.) Only public nested classes are wrapped. Otherwise there is little difference between nested and normal classes.

    If the target language doesn't support nested classes directly, or the support is not implemented in the language module (like for Python currently), then the visible nested classes are moved to the same name space as the containing class (nesting hierarchy is "flattened"). The same behaviour may be turned on for C# and Java by the %feature ("flatnested"); If there is a class with the same name in the outer namespace the inner class (or the global one) may be renamed or ignored:

    %rename (Bar_Foo) Bar::Foo;
    class Foo {};
    class Bar {
      public:
      class Foo {};
    };
    

    If a nested class, within an outer class, has to be used as a template parameter within the outer class, then the template will have to be instantiated with %template before the beginning of the outer class. An example can be found in the Templates section.

    Compatibility Note: Prior to SWIG-3.0.0, there was limited nested class support. Nested classes were treated as opaque pointers. However, there was a workaround for nested class support in these older versions requiring the user to replicate the nested class in the global scope, adding in a typedef for the nested class in the global scope and using the "nestedworkaround" feature on the nested class. This resulted in approximately the same behaviour as the "flatnested" feature. With proper nested class support now available in SWIG-3.0.0, this feature has been deprecated and no longer works requiring code changes. If you see the following warning:

    example.i:8: Warning 126: The nestedworkaround feature is deprecated
    

    consider using the "flatnested" feature discussed above which generates a non-nested proxy class, like the "nestedworkaround" feature did. Alternatively, use the default nested class code generation, which may generate an equivalent to a nested proxy class in the target language, depending on the target language support.

    SWIG-1.3.40 and earlier versions did not have the nestedworkaround feature and the generated code resulting from parsing nested classes did not always compile. Nested class warnings could also not be suppressed using %warnfilter.

    6.28 A brief rant about const-correctness

    A common issue when working with C++ programs is dealing with all possible ways in which the const qualifier (or lack thereof) will break your program, all programs linked against your program, and all programs linked against those programs.

    Although SWIG knows how to correctly deal with const in its internal type system and it knows how to generate wrappers that are free of const-related warnings, SWIG does not make any attempt to preserve const-correctness in the target language. Thus, it is possible to pass const qualified objects to non-const methods and functions. For example, consider the following code in C++:

    const Object * foo();
    void bar(Object *);
    
    ...
    // C++ code
    void blah() {
      bar(foo());         // Error: bar discards const
    };
    

    Now, consider the behavior when wrapped into a Python module:

    >>> bar(foo())         # Okay
    >>> 
    

    Although this is clearly a violation of the C++ type-system, fixing the problem doesn't seem to be worth the added implementation complexity that would be required to support it in the SWIG run-time type system. There are no plans to change this in future releases (although we'll never rule anything out entirely).

    The bottom line is that this particular issue does not appear to be a problem for most SWIG projects. Of course, you might want to consider using another tool if maintaining constness is the most important part of your project.

    6.29 Callbacks to the target language

    C/C++ function pointers are often used for callbacks and this is discussed in the Pointers to functions and callbacks section. The callback techniques described therein provide a way to control callbacks to a C/C++ function but not callbacks into the target language. The techniques described below show how the director feature can be used to support callbacks from C/C++ to the target language.

    6.29.1 Introduction to director classes

    The director feature enables the ability for a target language class to derive from a wrapped C++ class. The target language can override virtual methods of a wrapped C++ class, thereby supporting cross-language polymorphism. Code can 'call up' from C++ into the target language by simply calling a virtual method overridden in a derived class in the target language. The wrapped C++ classes that have this ability are termed 'director' classes. The director feature is documented individually in each target language and the reader should locate and read this to obtain a full understanding of directors.

    6.29.2 Using directors and target language callbacks

    SWIG's primary goal is to make it possible to call C/C++ code from a target language, however, the director feature enables the reverse. While there isn't simple direct support for calling target language code from C, the director feature makes this possible. It does require some work and additional wrapper code to be provided by the user. The additional code required must be C++ and not C code and hence may introduce a small dependency on C++ if using a pure C project. In a nutshell, the user must create a C++ base class and turn it into a director class. A virtual method in the director base class is required. SWIG generates the code to call up into the target language when wrapping the director virtual method.

    Let's look at some details next. Consider the same function pointer for a callback called binary_op from the Pointers to functions and callbacks section. For completeness, the code required for the module and director feature is also shown:

    %module(directors="1") example
    
    %{
    int binary_op(int a, int b, int (*op)(int, int)) {
      return op(a, b);
    }
    %}
    

    The goal is to have a target language function that gets called by binary_op. The target language function should have the equivalent signature as the C/C++ function pointer int (*op)(int, int). As we are using directors, we need a C++ virtual method with this signature, so let's define the C++ class and pure virtual method first and make it a director class via the director feature:

    %feature("director") BinaryOp;
    
    %inline %{
    struct BinaryOp {
      virtual int handle(int a, int b) = 0;
      virtual ~BinaryOp() {}
    };
    %}
    

    The following handler_helper function and binary_op_wrapper function completes the code needed in the C++/SWIG layer. The binary_op_wrapper function is wrapped by SWIG and is very similar to the binary_op function, however, it takes a pointer to the director base class BinaryOp instead of a C/C++ function pointer.

    %{
    static BinaryOp *handler_ptr = NULL;
    static int handler_helper(int a, int b) {
      // Make the call up to the target language when handler_ptr
      // is an instance of a target language director class
      return handler_ptr->handle(a, b);
    }
    // If desired, handler_ptr above could be changed to a thread-local variable in order to make thread-safe
    %}
    
    %inline %{
    int binary_op_wrapper(int a, int b, BinaryOp *handler) {
      handler_ptr = handler;
      int result = binary_op(a, b, &handler_helper);
      handler = NULL;
      return result;
    }
    %}
    

    On the target language side, we need to derive a class from BinaryOp and override the handle method. In Python this could be as simple as:

    import example
    
    # PythonBinaryOp class is defined and derived from C++ class BinaryOp
    class PythonBinaryOp(example.BinaryOp):
    
        # Define Python class 'constructor'
        def __init__(self):
            # Call C++ base class constructor
            example.BinaryOp.__init__(self)
    
        # Override C++ method: virtual int handle(int a, int b) = 0;
        def handle(self, a, b):
            # Return the product
            return a * b
    

    For this to work from Python, an instance of the PythonBinaryOp class is created and then passed to binary_op_wrapper. The net result is the binary_op function will in turn be called which will call handler_helper which will call the virtual handle method, that is, the Python method handle in the PythonBinaryOp class. The result will be the product of 10 and 20 and make its way back to Python and hence 200 will be printed with the following code:

    handler = PythonBinaryOp()
    result = example.binary_op_wrapper(10, 20, handler)
    print result
    

    This has thus demonstrated a C/C++ function pointer calling back into a target language function. The code could be made a little more user friendly by using %rename to provide the original binary_op name from the target language instead of binary_op_wrapper. A C++ functor base class and Python functor class could also be used instead, but these are left as exercises for the reader.

    6.30 Where to go for more information

    If you're wrapping serious C++ code, you might want to pick up a copy of "The Annotated C++ Reference Manual" by Ellis and Stroustrup. This is the reference document we use to guide a lot of SWIG's C++ support.


    7 SWIG and C++11

    7.1 Introduction

    This chapter gives you a brief overview about the SWIG implementation of the C++11 standard. This part of SWIG is still a work in progress.

    SWIG supports the new C++ syntax changes with some minor limitations in some areas such as decltype expressions and variadic templates. Wrappers for the new STL types (unordered_ containers, result_of, tuples) are incomplete. The wrappers for the new containers would work much like the C++03 containers and users are welcome to help by adapting the existing container interface files and submitting them as a patch for inclusion in future versions of SWIG.

    7.2 Core language changes

    7.2.1 Rvalue reference and move semantics

    SWIG correctly parses the rvalue reference syntax '&&', for example the typical usage of it in the move constructor and move assignment operator below:

    class MyClass {
    ...
      std::vector<int> numbers;
    public:
      MyClass(MyClass &&other) : numbers(std::move(other.numbers)) {}
      MyClass & operator=(MyClass &&other) {
        numbers = std::move(other.numbers);
        return *this;
      }
    };
    

    Rvalue references are designed for C++ temporaries and so are not very useful when used from non-C++ target languages. Generally you would just ignore them via %ignore before parsing the class. For example, ignore the move constructor:

    %ignore MyClass::MyClass(MyClass &&);
    

    The plan is to ignore move constructors by default in a future version of SWIG. Note that both normal assignment operators as well as move assignment operators are ignored by default in most target languages with the following warning:

    example.i:18: Warning 503: Can't wrap 'operator =' unless renamed to a valid identifier.
    

    7.2.2 Generalized constant expressions

    SWIG parses and identifies the keyword constexpr, but cannot fully utilise it. These C++ compile time constants are usable as runtime constants from the target languages. Below shows example usage for assigning a C++ compile time constant from a compile time constant function:

    constexpr int XXX() { return 10; }
    constexpr int YYY = XXX() + 100;
    

    When either of these is used from a target language, a runtime call is made to obtain the underlying constant.

    7.2.3 Extern template

    SWIG correctly parses the keywords extern template. However, this template instantiation suppression in a translation unit has no relevance outside of the C++ compiler and so is not used by SWIG. SWIG only uses %template for instantiating and wrapping templates.

    template class std::vector<int>;        // C++03 explicit instantiation in C++
    extern template class std::vector<int>; // C++11 explicit instantiation suppression in C++
    %template(VectorInt) std::vector<int>;  // SWIG instantiation
    

    7.2.4 Initializer lists

    Initializer lists are very much a C++ compiler construct and are not very accessible from wrappers as they are intended for compile time initialization of classes using the special std::initializer_list type. SWIG detects usage of initializer lists and will emit a special informative warning each time one is used:

    example.i:33: Warning 476: Initialization using std::initializer_list.
    

    Initializer lists usually appear in constructors but can appear in any function or method. They often appear in constructors which are overloaded with alternative approaches to initializing a class, such as the std container's push_back method for adding elements to a container. The recommended approach then is to simply ignore the initializer-list constructor, for example:

    %ignore Container::Container(std::initializer_list<int>);
    class Container {
    public:
      Container(std::initializer_list<int>); // initializer-list constructor
      Container();
      void push_back(const int &);
      ...
    };
    

    Alternatively you could modify the class and add another constructor for initialization by some other means, for example by a std::vector:

    %include <std_vector.i>
    class Container {
    public:
      Container(const std::vector<int> &);
      Container(std::initializer_list<int>); // initializer-list constructor
      Container();
      void push_back(const int &);
      ...
    };
    

    And then call this constructor from your target language, for example, in Python, the following will call the constructor taking the std::vector:

    >>> c = Container( [1, 2, 3, 4] )
    

    If you are unable to modify the class being wrapped, consider ignoring the initializer-list constructor and using %extend to add in an alternative constructor:

    %include <std_vector.i>
    %extend Container {
      Container(const std::vector<int> &elements) {
        Container *c = new Container();
        for (int element : elements)
          c->push_back(element);
        return c;
      }
    }
    
    %ignore Container::Container(std::initializer_list<int>);
    
    class Container {
    public:
      Container(std::initializer_list<int>); // initializer-list constructor
      Container();
      void push_back(const int &);
      ...
    };
    

    The above makes the wrappers look is as if the class had been declared as follows:

    %include <std_vector.i>
    class Container {
    public:
      Container(const std::vector<int> &);
    //  Container(std::initializer_list<int>); // initializer-list constructor (ignored)
      Container();
      void push_back(const int &);
      ...
    };
    

    std::initializer_list is simply a container that can only be initialized at compile time. As it is just a C++ type, it is possible to write typemaps for a target language container to map onto std::initializer_list. However, this can only be done for a fixed number of elements as initializer lists are not designed to be constructed with a variable number of arguments at runtime. The example below is a very simple approach which ignores any parameters passed in and merely initializes with a fixed list of fixed integer values chosen at compile time:

    %typemap(in) std::initializer_list<int> {
      $1 = {10, 20, 30, 40, 50};
    }
    class Container {
    public:
      Container(std::initializer_list<int>); // initializer-list constructor
      Container();
      void push_back(const int &);
      ...
    };
    

    Any attempt at passing in values from the target language will be ignored and be replaced by {10, 20, 30, 40, 50}. Needless to say, this approach is very limited, but could be improved upon, but only slightly. A typemap could be written to map a fixed number of elements on to the std::initializer_list, but with values decided at runtime. The typemaps would be target language specific.

    Note that the default typemap for std::initializer_list does nothing but issue the warning and hence any user supplied typemaps will override it and suppress the warning.

    7.2.5 Uniform initialization

    The curly brackets {} for member initialization are fully supported by SWIG:

    struct BasicStruct {
     int x;
     double y;
    };
     
    struct AltStruct {
      AltStruct(int x, double y) : x_{x}, y_{y} {}
     
      int x_;
      double y_;
    };
    
    BasicStruct var1{5, 3.2}; // only fills the struct components
    AltStruct var2{2, 4.3};   // calls the constructor
    

    Uniform initialization does not affect usage from the target language, for example in Python:

    >>> a = AltStruct(10, 142.15)
    >>> a.x_
    10
    >>> a.y_
    142.15
    

    7.2.6 Type inference

    SWIG supports decltype() with some limitations. Single variables are allowed, however, expressions are not supported yet. For example, the following code will work:

    int i;
    decltype(i) j;
    

    However, using an expression inside the decltype results in syntax error:

    int i; int j;
    decltype(i+j) k;  // syntax error
    

    7.2.7 Range-based for-loop

    This feature is part of the implementation block only. SWIG ignores it.

    7.2.8 Lambda functions and expressions

    SWIG correctly parses most of the Lambda functions syntax. For example:

    auto val = [] { return something; };
    auto sum = [](int x, int y) { return x+y; };
    auto sum = [](int x, int y) -> int { return x+y; };
    

    The lambda functions are removed from the wrappers for now, because of the lack of support for closures (scope of the lambda functions) in the target languages.

    Lambda functions used to create variables can also be parsed, but due to limited support of auto when the type is deduced from the expression, the variables are simply ignored.

    auto six = [](int x, int y) { return x+y; }(4, 2);
    

    Better support should be available in a later release.

    7.2.9 Alternate function syntax

    SWIG fully supports the new definition of functions. For example:

    struct SomeStruct {
      int FuncName(int x, int y);
    };
    

    can now be written as in C++11:

    struct SomeStruct {
      auto FuncName(int x, int y) -> int;
    };
     
    auto SomeStruct::FuncName(int x, int y) -> int {
      return x + y;
    }
    

    The usage in the target languages remains the same, for example in Python:

    >>> a = SomeStruct()
    >>> a.FuncName(10, 5)
    15
    

    SWIG will also deal with type inference for the return type, as per the limitations described earlier. For example:

    auto square(float a, float b) -> decltype(a);
    

    7.2.10 Object construction improvement

    There are three parts to object construction improvement. The first improvement is constructor delegation such as the following:

    class A {
    public:
      int a;
      int b;
      int c;
    
      A() : A(10) {}
      A(int aa) : A(aa, 20) {}
      A(int aa, int bb) : A(aa, bb, 30) {}
      A(int aa, int bb, int cc) { a=aa; b=bb; c=cc; }
    };
    

    where peer constructors can be called. SWIG handles this without any issue.

    The second improvement is constructor inheritance via a using declaration. This is parsed correctly, but the additional constructors are not currently added to the derived proxy class in the target language. An example is shown below:

    class BaseClass {
    public:
      BaseClass(int iValue);
    };
    
    class DerivedClass: public BaseClass {
      public:
      using BaseClass::BaseClass; // Adds DerivedClass(int) constructor
    };
    

    The final part is member initialization at the site of the declaration. This kind of initialization is handled by SWIG.

    class SomeClass {
    public:
      SomeClass() {}
      explicit SomeClass(int new_value) : value(new_value) {}
    
      int value = 5;
    };
    

    7.2.11 Explicit overrides and final

    The special identifiers final and override can be used on methods and destructors, such as in the following example:

    struct BaseStruct {
      virtual void ab() const = 0;
      virtual void cd();
      virtual void ef();
      virtual ~BaseStruct();
    };
    struct DerivedStruct : BaseStruct {
      virtual void ab() const override;
      virtual void cd() final;
      virtual void ef() final override;
      virtual ~DerivedStruct() override;
    };
    

    7.2.12 Null pointer constant

    The nullptr constant is mostly unimportant in wrappers. In the few places it has an effect, it is treated like NULL.

    7.2.13 Strongly typed enumerations

    SWIG supports strongly typed enumerations and parses the new enum class syntax and forward declarator for the enums, such as:

    enum class MyEnum : unsigned int;
    

    Strongly typed enums are often used to avoid name clashes such as the following:

    struct Color {
      enum class RainbowColors : unsigned int {
        Red, Orange, Yellow, Green, Blue, Indigo, Violet
      };
      
      enum class WarmColors {
        Yellow, Orange, Red
      };
    
      // Note normal enum
      enum PrimeColors {
        Red=100, Green, Blue
      };
    };
    

    There are various ways that the target languages handle enums, so it is not possible to precisely state how they are handled in this section. However, generally, most scripting languages mangle in the strongly typed enumeration's class name, but do not use any additional mangling for normal enumerations. For example, in Python, the following code

    print Color.RainbowColors_Red, Color.WarmColors_Red, Color.Red
    

    results in

    0 2 100
    

    The strongly typed languages often wrap normal enums into an enum class and so treat normal enums and strongly typed enums the same. The equivalent in Java is:

    System.out.println(Color.RainbowColors.Red.swigValue() + " " + Color.WarmColors.Red.swigValue() + " " + Color.PrimeColors.Red.swigValue());
    

    7.2.14 Double angle brackets

    SWIG correctly parses the symbols >> as closing the template block, if found inside it at the top level, or as the right shift operator >> otherwise.

    std::vector<std::vector<int>> myIntTable;
    

    7.2.15 Explicit conversion operators

    SWIG correctly parses the keyword explicit for operators in addition to constructors now. For example:

    class U {
    public:
      int u;
    };
    
    class V {
    public:
      int v;
    };
    
    class TestClass {
    public:
      //implicit converting constructor
      TestClass(U const &val) { t=val.u; }
    
      // explicit constructor
      explicit TestClass(V const &val) { t=val.v; }
    
      int t;
    };
    
    struct Testable {
      // explicit conversion operator
      explicit operator bool() const {
        return false;
      }
    };
    

    The effect of explicit constructors and operators has little relevance for the proxy classes as target languages don't have the same concepts of implicit conversions as C++. Conversion operators either with or without explicit need renaming to a valid identifier name in order to make them available as a normal proxy method.

    7.2.16 Type alias and alias templates

    A type alias is a statement of the form:

    using PFD = void (*)(double); // New introduced syntax
    

    which is equivalent to the old style typedef:

    typedef void (*PFD)(double);  // The old style
    

    The following is an example of an alias template:

    template< typename T1, typename T2, int N >
    class SomeType {
    public:
      T1 a;
      T2 b;
    };
    
    template< typename T2 >
    using TypedefName = SomeType<char*, T2, 5>;
    

    SWIG supports both type aliasing and alias templates. However, in order to use an alias template, two %template directives must be used:

    %template(SomeTypeBool) SomeType<char*, bool, 5>;
    %template() TypedefName<bool>;
    

    Firstly, the actual template is instantiated with a name to be used by the target language, as per any template being wrapped. Secondly, the empty template instantiation, %template(), is required for the alias template. This second requirement is necessary to add the appropriate instantiated template type into the type system as SWIG does not automatically instantiate templates. See the Templates section for more general information on wrapping templates.

    7.2.17 Unrestricted unions

    SWIG fully supports any type inside a union even if it does not define a trivial constructor. For example, the wrapper for the following code correctly provides access to all members in the union:

    struct point {
      point() {}
      point(int x, int y) : x_(x), y_(y) {}
      int x_, y_;
    };
    
    #include <new> // For placement 'new' in the constructor below
    union P {
      int z;
      double w;
      point p; // Illegal in C++03; legal in C++11.
      // Due to the point member, a constructor definition is required.
      P() {
        new(&p) point();
      }
    } p1;
    

    7.2.18 Variadic templates

    SWIG supports the variadic templates syntax (inside the <> block, variadic class inheritance and variadic constructor and initializers) with some limitations. The following code is correctly parsed:

    template <typename... BaseClasses> class ClassName : public BaseClasses... {
    public:
      ClassName (BaseClasses &&... baseClasses) : BaseClasses(baseClasses)... {}
    }
    

    For now however, the %template directive only accepts one parameter substitution for the variable template parameters.

    %template(MyVariant1) ClassName<>         // zero argument not supported yet
    %template(MyVariant2) ClassName<int>      // ok
    %template(MyVariant3) ClassName<int, int> // too many arguments not supported yet
    

    Support for the variadic sizeof() function is correctly parsed:

    const int SIZE = sizeof...(ClassName<int, int>);
    

    In the above example SIZE is of course wrapped as a constant.

    7.2.19 New character literals

    C++11 adds support for UCS-2 and UCS-4 character literals. These character literals are preceded by either 'u' or 'U'.

    char16_t a = u'a';
    char32_t b = U'b';
    

    Compatibility note: SWIG-4.0.0 was the first version to support these Universal Coded Character Set (UCS) character literals.

    7.2.20 New string literals

    SWIG supports wide string and Unicode string constants and raw string literals.

    // New string literals
    wstring         aa =  L"Wide string";
    const char     *bb = u8"UTF-8 string";
    const char16_t *cc =  u"UTF-16 string";
    const char32_t *dd =  U"UTF-32 string";
    
    // Raw string literals
    const char      *xx =        ")I'm an \"ascii\" \\ string.";
    const char      *ee =   R"XXX()I'm an "ascii" \ string.)XXX"; // same as xx
    wstring          ff =  LR"XXX(I'm a "raw wide" \ string.)XXX";
    const char      *gg = u8R"XXX(I'm a "raw UTF-8" \ string.)XXX";
    const char16_t  *hh =  uR"XXX(I'm a "raw UTF-16" \ string.)XXX";
    const char32_t  *ii =  UR"XXX(I'm a "raw UTF-32" \ string.)XXX";
    

    Non-ASCII string support varies quite a bit among the various target languages though.

    Note: There is a bug currently where SWIG's preprocessor incorrectly parses an odd number of double quotes inside raw string literals.

    7.2.21 User-defined literals

    SWIG parses the declaration of user-defined literals, that is, the operator "" _mysuffix() function syntax.

    Some examples are the raw literal:

    OutputType operator "" _myRawLiteral(const char * value);
    

    numeric cooked literals:

    OutputType operator "" _mySuffixIntegral(unsigned long long);
    OutputType operator "" _mySuffixFloat(long double);
    

    and cooked string literals:

    OutputType operator "" _mySuffix(const char * string_values, size_t num_chars);
    OutputType operator "" _mySuffix(const wchar_t * string_values, size_t num_chars);
    OutputType operator "" _mySuffix(const char16_t * string_values, size_t num_chars);
    OutputType operator "" _mySuffix(const char32_t * string_values, size_t num_chars);
    

    Like other operators that SWIG parses, a warning is given about renaming the operator in order for it to be wrapped:

    example.i:27: Warning 503: Can't wrap 'operator "" _myRawLiteral' unless renamed to a valid identifier.
    

    If %rename is used, then it can be called like any other wrapped method. Currently you need to specify the full declaration including parameters for %rename:

    %rename(MyRawLiteral)  operator"" _myRawLiteral(const char * value);
    

    Or if you just wish to ignore it altogether:

    %ignore operator "" _myRawLiteral(const char * value);
    

    Note that use of user-defined literals such as the following still give a syntax error:

    OutputType var1 = "1234"_suffix;
    OutputType var2 = 1234_suffix;
    OutputType var3 = 3.1416_suffix;
    

    7.2.22 Thread-local storage

    SWIG correctly parses the thread_local keyword. For example, variables reachable by the current thread can be defined as:

    struct A {
      static thread_local int val;
    };
    thread_local int global_val;
    

    The use of the thread_local storage specifier does not affect the wrapping process; it does not modify the wrapper code compared to when it is not specified. A variable will be thread local if accessed from different threads from the target language in the same way that it will be thread local if accessed from C++ code.

    7.2.23 Explicitly defaulted functions and deleted functions

    SWIG handles explicitly defaulted functions, that is, = default added to a function declaration. Deleted definitions, which are also called deleted functions, have = delete added to the function declaration. For example:

    struct NonCopyable {
      NonCopyable & operator=(const NonCopyable &) = delete; /* Removes operator= */
      NonCopyable(const NonCopyable &) = delete;             /* Removes copy constructor */
      NonCopyable() = default;                               /* Explicitly allows the empty constructor */
    };
    

    Wrappers for deleted functions will not be available in the target language. Wrappers for defaulted functions will of course be available in the target language. Explicitly defaulted functions have no direct effect for SWIG wrapping as the declaration is handled much like any other method declaration parsed by SWIG.

    Deleted functions are also designed to prevent implicit conversions when calling the function. For example, the C++ compiler will not compile any code which attempts to use an int as the type of the parameter passed to f below:

    struct NoInt {
      void f(double i);
      void f(int) = delete;
    };
    

    This is a C++ compile time check and SWIG does not make any attempt to detect if the target language is using an int instead of a double though, so in this case it is entirely possible to pass an int instead of a double to f from Java, Python etc.

    7.2.24 Type long long int

    SWIG correctly parses and uses the new long long type already introduced in C99 some time ago.

    7.2.25 Static assertions

    SWIG correctly parses the new static_assert declarations (though 3.0.12 and earlier had a bug which meant this wasn't accepted at file scope). This is a C++ compile time directive so there isn't anything useful that SWIG can do with it.

    template <typename T>
    struct Check {
      static_assert(sizeof(int) <= sizeof(T), "not big enough");
    };
    

    7.2.26 Allow sizeof to work on members of classes without an explicit object

    SWIG can parse the new sizeof() on types as well as on objects. For example:

    struct A {
      int member;
    };
    
    const int SIZE = sizeof(A::member); // does not work with C++03. Okay with C++11
    

    In Python:

    >>> SIZE
    8
    

    7.2.27 Exception specifications and noexcept

    C++11 added in the noexcept specification to exception specifications to indicate that a function simply may or may not throw an exception, without actually naming any exception. SWIG understands these, although there isn't any useful way that this information can be taken advantage of by target languages, so it is as good as ignored during the wrapping process. Below are some examples of noexcept in function declarations:

    static void noex1() noexcept;
    int noex2(int) noexcept(true);
    int noex3(int, bool) noexcept(false);
    

    7.2.28 Control and query object alignment

    An alignof operator is used mostly within C++ to return alignment in number of bytes, but could be used to initialize a variable as shown below. The variable's value will be available for access by the target language as any other variable's compile time initialised value.

    const int align1 = alignof(A::member);
    

    The alignas specifier for variable alignment is not yet supported. Example usage:

    struct alignas(16) S {
      int num;
    };
    alignas(double) unsigned char c[sizeof(double)];
    

    Use the preprocessor to work around this for now:

    #define alignas(T)
    

    7.2.29 Attributes

    Attributes such as those shown below, are not yet supported and will give a syntax error.

    int [[attr1]] i [[attr2, attr3]];
    
    [[noreturn, nothrow]] void f [[noreturn]] ();
    

    7.2.30 Methods with ref-qualifiers

    C++11 non-static member functions can be declared with ref-qualifiers. Member functions declared with a & lvalue ref-qualifiers are wrapped like any other function without ref-qualifiers. Member functions declared with a && rvalue ref-qualifiers are ignored by default as they are unlikely to be required from non-C++ languages where the concept of rvalue-ness for the implied *this pointer does not apply. The warning is hidden by default, but can be displayed as described in the section on Enabling extra warnings.

    Consider:

    struct RQ {
      void m1(int x) &;
      void m2(int x) &&;
    };
    

    The only wrapped method will be the lvalue ref-qualified method m1 and if SWIG is run with the -Wextra command-line option, the following warning will be issued indicating m2 is not wrapped:

    example.i:7: Warning 405: Method with rvalue ref-qualifier m2(int) && ignored.
    

    If you unignore the method as follows, wrappers for m2 will be generated:

    %feature("ignore", "0") RQ::m2(int x) &&;
    struct RQ {
      void m1(int x) &;
      void m2(int x) &&;
    };
    

    Inspection of the generated C++ code, will show that std::move is used on the instance of the RQ * class:

      RQ *arg1 = (RQ *) 0 ;
      int arg2 ;
    
      arg1 = ...marshalled from target language...
      arg2 = ...marshalled from target language...
    
      std::move(*arg1).m2(arg2);
    

    This will compile but when run, the move effects may not be what you want. As stated earlier, rvalue ref-qualifiers aren't really applicable outside the world of C++. However, if you really know what you are doing, full control over the call to the method is possible via the low-level "action" feature. This feature completely replaces the call to the underlying function, that is, the last line in the snippet of code above.

    %feature("ignore", "0") RQ::m2(int x) &&;
    %feature("action") RQ::m2(int x) && %{
      RQ().m2(arg2);
    %}
    struct RQ {
      void m1(int x) &;
      void m2(int x) &&;
    };
    

    resulting in:

      RQ *arg1 = (RQ *) 0 ;
      int arg2 ;
    
      arg1 = ...marshalled from target language...
      arg2 = ...marshalled from target language...
    
      RQ().m2(arg2);
    

    Compatibility note: SWIG-4.0.0 was the first version to support ref-qualifiers.

    7.3 Standard library changes

    7.3.1 Threading facilities

    SWIG does not currently wrap or use any of the new threading classes introduced (thread, mutex, locks, condition variables, task). The main reason is that SWIG target languages offer their own threading facilities so there is limited use for them.

    7.3.2 Tuple types

    SWIG does not provide library files for the new tuple types yet. Variadic template support requires further work to provide substantial tuple wrappers.

    7.3.3 Hash tables

    The new hash tables in the STL are unordered_set, unordered_multiset, unordered_map, unordered_multimap . These are not available in all target languages. Any missing support can in principle be easily implemented by adapting the current STL containers.

    7.3.4 Regular expressions

    While SWIG could provide wrappers for the new C++11 regular expressions classes, there is little need as the target languages have their own regular expression facilities.

    7.3.5 General-purpose smart pointers

    SWIG provides special smart pointer handling for std::shared_ptr in the same way it has support for boost::shared_ptr. Please see the shared_ptr smart pointer library section. There is no special smart pointer handling available for std::weak_ptr and std::unique_ptr yet.

    7.3.6 Extensible random number facility

    This feature extends and standardizes the standard library only and does not effect the C++ language nor SWIG.

    7.3.7 Wrapper reference

    Wrapper references are similar to normal C++ references but are copy-constructible and copy-assignable. They could conceivably be used in public APIs. There is no special support for std::reference_wrapper in SWIG though. Users would need to write their own typemaps if wrapper references are being used and these would be similar to the plain C++ reference typemaps.

    7.3.8 Polymorphic wrappers for function objects

    SWIG supports functor classes in a few languages in a very natural way. However nothing is provided yet for the new std::function template. SWIG will parse usage of the template like any other template.

    %rename(__call__) Test::operator(); // Default renaming used for Python
    
    struct Test {
      bool operator()(int x, int y); // function object
    };
    
    #include <functional>
    std::function<void (int, int)> pF = Test;   // function template wrapper
    
    

    Example of supported usage of the plain functor from Python is shown below. It does not involve std::function.

    t = Test()
    b = t(1, 2) # invoke C++ function object
    

    7.3.9 Type traits for metaprogramming

    The type_traits functions to support C++ metaprogramming is useful at compile time and is aimed specifically at C++ development:

    #include <type_traits>
    
    // First way of operating.
    template< bool B > struct algorithm {
      template< class T1, class T2 > static int do_it(T1 &, T2 &)  { /*...*/ return 1; }
    };
    
    // Second way of operating.
    template<> struct algorithm<true> {
      template< class T1, class T2 > static int do_it(T1, T2)  { /*...*/ return 2; }
    };
    
    // Instantiating 'elaborate' will automatically instantiate the correct way to operate, depending on the types used.
    template< class T1, class T2 > int elaborate(T1 A, T2 B) {
      // Use the second way only if 'T1' is an integer and if 'T2' is a floating point,
      // otherwise use the first way.
      return algorithm< std::is_integral<T1>::value && std::is_floating_point<T2>::value >::do_it(A, B);
    }
    

    SWIG correctly parses the template specialization, template types etc. However, metaprogramming and the additional support in the type_traits header is really for compile time and is not much use at runtime for the target languages. For example, as SWIG requires explicit instantiation of templates via %template, there isn't much that std::is_integral<int> is going to provide by itself. However, template functions using such metaprogramming techniques might be useful to wrap. For example, the following instantiations could be made:

    %template(Elaborate) elaborate<int, int>;
    %template(Elaborate) elaborate<int, double>;
    

    Then the appropriate algorithm can be called for the subset of types given by the above %template instantiations from a target language, such as Python:

    >>> Elaborate(0, 0)
    1
    >>> Elaborate(0, 0.0)
    2
    

    7.3.10 Uniform method for computing return type of function objects

    The new std::result_of class introduced in the <functional> header provides a generic way to obtain the return type of a function type via std::result_of::type. There isn't any library interface file to support this type. With a bit of work, SWIG will deduce the return type of functions when used in std::result_of using the approach shown below. The technique basically forward declares the std::result_of template class, then partially specializes it for the function types of interest. SWIG will use the partial specialization and hence correctly use the std::result_of::type provided in the partial specialization.

    %inline %{
    #include <functional>
    typedef double(*fn_ptr)(double);
    %}
    
    namespace std {
      // Forward declaration of result_of
      template<typename Func> struct result_of;
      // Add in a partial specialization of result_of
      template<> struct result_of< fn_ptr(double) > {
        typedef double type;
      };
    }
    
    %template() std::result_of< fn_ptr(double) >;
    
    %inline %{
    
    double square(double x) {
      return (x * x);
    }
    
    template<class Fun, class Arg>
    typename std::result_of<Fun(Arg)>::type test_result_impl(Fun fun, Arg arg) {
      return fun(arg);
    }
    %}
    
    %template(test_result) test_result_impl< fn_ptr, double >;
    %constant double (*SQUARE)(double) = square;
    

    Note the first use of %template which SWIG requires to instantiate the template. The empty template instantiation suffices as no proxy class is required for std::result_of<Fun(Arg)>::type as this type is really just a double. The second %template instantiates the template function which is being wrapped for use as a callback. The %constant can then be used for any callback function as described in Pointers to functions and callbacks.

    Example usage from Python should give the not too surprising result:

    >>> test_result(SQUARE, 5.0)
    25.0
    

    Phew, that is a lot of hard work to get a callback working. You could just go with the more attractive option of just using double as the return type in the function declaration instead of result_of !


    8 SWIG and C++14

    8.1 Introduction

    This chapter gives you a brief overview about the SWIG implementation of the C++14 standard. There isn't much in C++14 that affects SWIG, however, work has only just begun on adding C++14 support.

    Compatibility note: SWIG-4.0.0 is the first version to support any C++14 features.

    8.2 Core language changes

    8.2.1 Binary integer literals

    C++14 added binary integer literals and SWIG supports these. Example:

    int b = 0b101011;
    

    8.3 Standard library changes


    9 SWIG and C++17

    9.1 Introduction

    This chapter gives you a brief overview about the SWIG implementation of the C++17 standard. There isn't much in C++17 that affects SWIG, however, work has only just begun on adding C++17 support.

    Compatibility note: SWIG-4.0.0 is the first version to support any C++17 features.

    9.2 Core language changes

    9.2.1 Nested namespace definitions

    C++17 offers a more concise syntax for defining namespaces. SWIG has support for nested namespace definitions such as:

    namespace A::B::C {
      ...
    }
    

    This is the equivalent to the C++98 namespace definitions:

    namespace A {
      namespace B {
        namespace C {
          ...
        }
      }
    }
    

    9.2.2 UTF-8 character literals

    C++17 added UTF-8 (u8) character literals. These are of type char. Example:

    char a = u8'a';
    

    9.2.3 Hexadecimal floating literals

    C++17 added hexadecimal floating literals. For example:

    double f = 0xF.68p2;
    

    9.3 Standard library changes


    10 Preprocessing

    SWIG includes its own enhanced version of the C preprocessor. The preprocessor supports the standard preprocessor directives and macro expansion rules. However, a number of modifications and enhancements have been made. This chapter describes some of these modifications.

    10.1 File inclusion

    To include another file into a SWIG interface, use the %include directive like this:

    %include "pointer.i"
    

    Unlike, #include, %include includes each file once (and will not reload the file on subsequent %include declarations). Therefore, it is not necessary to use include-guards in SWIG interfaces.

    By default, the #include is ignored unless you run SWIG with the -includeall option. The reason for ignoring traditional includes is that you often don't want SWIG to try and wrap everything included in standard header system headers and auxiliary files.

    10.2 File imports

    SWIG provides another file inclusion directive with the %import directive. For example:

    %import "foo.i"
    

    The purpose of %import is to collect certain information from another SWIG interface file or a header file without actually generating any wrapper code. Such information generally includes type declarations (e.g., typedef) as well as C++ classes that might be used as base-classes for class declarations in the interface. The use of %import is also important when SWIG is used to generate extensions as a collection of related modules. This is an advanced topic and is described in later in the Working with Modules chapter.

    The -importall directive tells SWIG to follow all #include statements as imports. This might be useful if you want to extract type definitions from system header files without generating any wrappers.

    10.3 Conditional Compilation

    SWIG fully supports the use of #if, #ifdef, #ifndef, #else, #endif to conditionally include parts of an interface. The following symbols are predefined by SWIG when it is parsing the interface:

    SWIG                            Always defined when SWIG is processing a file
    SWIGIMPORTED                    Defined when SWIG is importing a file with %import
    SWIG_VERSION                    Hexadecimal (binary-coded decimal) number containing SWIG version,
                                    such as 0x010311 (corresponding to SWIG-1.3.11).
    
    SWIGCSHARP                      Defined when using C#
    SWIGGUILE                       Defined when using Guile
    SWIGJAVA                        Defined when using Java
    SWIGJAVASCRIPT                  Defined when using Javascript
    SWIG_JAVASCRIPT_JSC             Defined when using Javascript for JavascriptCore
    SWIG_JAVASCRIPT_V8              Defined when using Javascript for v8 or node.js 
    SWIGLUA                         Defined when using Lua
    SWIGMZSCHEME                    Defined when using Mzscheme
    SWIGOCAML                       Defined when using OCaml
    SWIGOCTAVE                      Defined when using Octave
    SWIGPERL                        Defined when using Perl
    SWIGPHP                         Defined when using PHP (any version)
    SWIGPHP7                        Defined when using PHP7
    SWIGPYTHON                      Defined when using Python
    SWIGR                           Defined when using R
    SWIGRUBY                        Defined when using Ruby
    SWIGSCILAB                      Defined when using Scilab
    SWIGTCL                         Defined when using Tcl
    SWIGXML                         Defined when using XML
    

    In addition, SWIG defines the following set of standard C/C++ macros:

    __LINE__                        Current line number
    __FILE__                        Current file name
    __STDC__                        Defined to indicate ISO C
    __cplusplus                     Defined when -c++ option used
    

    Interface files can look at these symbols as necessary to change the way in which an interface is generated or to mix SWIG directives with C code. These symbols are also defined within the C code generated by SWIG (except for the symbol `SWIG' which is only defined within the SWIG compiler).

    10.4 Macro Expansion

    Traditional preprocessor macros can be used in SWIG interfaces. Be aware that the #define statement is also used to try and detect constants. Therefore, if you have something like this in your file,

    #ifndef _FOO_H 1
    #define _FOO_H 1
    ...
    #endif
    

    you may get some extra constants such as _FOO_H showing up in the scripting interface.

    More complex macros can be defined in the standard way. For example:

    #define EXTERN extern
    #ifdef __STDC__
    #define ISOC_(args)   (args)
    #else
    #define ISOC_(args) ()
    #endif
    

    The following operators can appear in macro definitions:

    • #x
      Converts macro argument x to a string surrounded by double quotes ("x").
    • x ## y
      Concatenates x and y together to form xy.
    • `x`
      If x is a string surrounded by double quotes, do nothing. Otherwise, turn into a string like #x. This is a non-standard SWIG extension.

    10.5 SWIG Macros

    SWIG provides an enhanced macro capability with the %define and %enddef directives. For example:

    %define ARRAYHELPER(type, name)
    %inline %{
    type *new_ ## name (int nitems) {
      return (type *) malloc(sizeof(type)*nitems);
    }
    void delete_ ## name(type *t) {
      free(t);
    }
    type name ## _get(type *t, int index) {
      return t[index];
    }
    void name ## _set(type *t, int index, type val) {
      t[index] = val;
    }
    %}
    %enddef
    
    ARRAYHELPER(int, IntArray)
    ARRAYHELPER(double, DoubleArray)
    

    The primary purpose of %define is to define large macros of code. Unlike normal C preprocessor macros, it is not necessary to terminate each line with a continuation character (\)--the macro definition extends to the first occurrence of %enddef. Furthermore, when such macros are expanded, they are reparsed through the C preprocessor. Thus, SWIG macros can contain all other preprocessor directives except for nested %define statements.

    The SWIG macro capability is a very quick and easy way to generate large amounts of code. In fact, many of SWIG's advanced features and libraries are built using this mechanism (such as C++ template support).

    10.6 C99 and GNU Extensions

    SWIG-1.3.12 and newer releases support variadic preprocessor macros. For example:

    #define DEBUGF(fmt, ...)   fprintf(stderr, fmt, __VA_ARGS__)
    

    When used, any extra arguments to ... are placed into the special variable __VA_ARGS__. This also works with special SWIG macros defined using %define.

    SWIG allows a variable number of arguments to be empty. However, this often results in an extra comma (, ) and syntax error in the resulting expansion. For example:

    DEBUGF("hello");   --> fprintf(stderr, "hello", );
    

    To get rid of the extra comma, use ## like this:

    #define DEBUGF(fmt, ...)   fprintf(stderr, fmt, ##__VA_ARGS__)
    

    SWIG also supports GNU-style variadic macros. For example:

    #define DEBUGF(fmt, args...)  fprintf(stdout, fmt, args)
    

    Comment: It's not entirely clear how variadic macros might be useful to interface building. However, they are used internally to implement a number of SWIG directives and are provided to make SWIG more compatible with C99 code.

    10.7 Preprocessing and delimiters

    The preprocessor handles { }, " " and %{ %} delimiters differently.

    10.7.1 Preprocessing and %{ ... %} & " ... " delimiters

    The SWIG preprocessor does not process any text enclosed in a code block %{ ... %}. Therefore, if you write code like this,

    %{
    #ifdef NEED_BLAH
    int blah() {
      ...
    }
    #endif
    %}
    

    the contents of the %{ ... %} block are copied without modification to the output (including all preprocessor directives).

    10.7.2 Preprocessing and { ... } delimiters

    SWIG always runs the preprocessor on text appearing inside { ... }. However, sometimes it is desirable to make a preprocessor directive pass through to the output file. For example:

    %extend Foo {
      void bar() {
        #ifdef DEBUG
          printf("I'm in bar\n");
        #endif
      }
    }
    

    By default, SWIG will interpret the #ifdef DEBUG statement. However, if you really wanted that code to actually go into the wrapper file, prefix the preprocessor directives with % like this:

    %extend Foo {
      void bar() {
        %#ifdef DEBUG
          printf("I'm in bar\n");
        %#endif
      }
    }
    

    SWIG will strip the extra % and leave the preprocessor directive in the code.

    10.8 Preprocessor and Typemaps

    Typemaps support a special attribute called noblock where the { ... } delimiters can be used, but the delimiters are not actually generated into the code. The effect is then similar to using "" or %{ %} delimiters but the code is run through the preprocessor. For example:

    #define SWIG_macro(CAST) (CAST)$input
    %typemap(in) Int {$1= SWIG_macro(int);}
    

    might generate

      {
        arg1=(int)jarg1;
      }
    

    whereas

    #define SWIG_macro(CAST) (CAST)$input
    %typemap(in, noblock=1) Int {$1= SWIG_macro(int);}
    

    might generate

      arg1=(int)jarg1;
    

    and

    #define SWIG_macro(CAST) (CAST)$input
    %typemap(in) Int %{$1=SWIG_macro(int);%}
    

    would generate

      arg1=SWIG_macro(int);
    

    10.9 Viewing preprocessor output

    Like many compilers, SWIG supports a -E command line option to display the output from the preprocessor. When the -E option is used, SWIG will not generate any wrappers. Instead the results after the preprocessor has run are displayed. This might be useful as an aid to debugging and viewing the results of macro expansions.

    10.10 The #error and #warning directives

    SWIG supports the commonly used #warning and #error preprocessor directives. The #warning directive will cause SWIG to issue a warning then continue processing. The #error directive will cause SWIG to exit with a fatal error. Example usage:

    #error "This is a fatal error message"
    #warning "This is a warning message"
    

    The #error behaviour can be made to work like #warning if the -cpperraswarn commandline option is used. Alternatively, the #pragma directive can be used to the same effect, for example:

      /* Modified behaviour: #error does not cause SWIG to exit with error */
      #pragma SWIG cpperraswarn=1
      /* Normal behaviour: #error does cause SWIG to exit with error */
      #pragma SWIG cpperraswarn=0
    

    11 SWIG library

    To help build extension modules, SWIG is packaged with a library of support files that you can include in your own interfaces. These files often define new SWIG directives or provide utility functions that can be used to access parts of the standard C and C++ libraries. This chapter provides a reference to the current set of supported library files.

    Compatibility note: Older versions of SWIG included a number of library files for manipulating pointers, arrays, and other structures. Most these files are now deprecated and have been removed from the distribution. Alternative libraries provide similar functionality. Please read this chapter carefully if you used the old libraries.

    11.1 The %include directive and library search path

    Library files are included using the %include directive. When searching for files, directories are searched in the following order:

    1. The current directory
    2. Directories specified with the -I command line option
    3. ./swig_lib
    4. SWIG library install location as reported by swig -swiglib, for example /usr/local/share/swig/1.3.30
    5. On Windows, a directory Lib relative to the location of swig.exe is also searched.

    Within directories mentioned in points 3-5, SWIG first looks for a subdirectory corresponding to a target language (e.g., python, tcl, etc.). If found, SWIG will search the language specific directory first. This allows for language-specific implementations of library files.

    You can ignore the installed SWIG library by setting the SWIG_LIB environment variable. Set the environment variable to hold an alternative library directory.

    The directories that are searched are displayed when using -verbose commandline option.

    11.2 C arrays and pointers

    This section describes library modules for manipulating low-level C arrays and pointers. The primary use of these modules is in supporting C declarations that manipulate bare pointers such as int *, double *, or void *. The modules can be used to allocate memory, manufacture pointers, dereference memory, and wrap pointers as class-like objects. Since these functions provide direct access to memory, their use is potentially unsafe and you should exercise caution.

    11.2.1 cpointer.i

    The cpointer.i module defines macros that can be used to used to generate wrappers around simple C pointers. The primary use of this module is in generating pointers to primitive datatypes such as int and double.

    %pointer_functions(type, name)

    Generates a collection of four functions for manipulating a pointer type *:

    type *new_name()

    Creates a new object of type type and returns a pointer to it. In C, the object is created using calloc(). In C++, new is used.

    type *copy_name(type value)

    Creates a new object of type type and returns a pointer to it. An initial value is set by copying it from value. In C, the object is created using calloc(). In C++, new is used.

    type *delete_name(type *obj)

    Deletes an object type type.

    void name_assign(type *obj, type value)

    Assigns *obj = value.

    type name_value(type *obj)

    Returns the value of *obj.

    When using this macro, type may be any type and name must be a legal identifier in the target language. name should not correspond to any other name used in the interface file.

    Here is a simple example of using %pointer_functions():

    %module example
    %include "cpointer.i"
    
    /* Create some functions for working with "int *" */
    %pointer_functions(int, intp);
    
    /* A function that uses an "int *" */
    void add(int x, int y, int *result);
    

    Now, in Python:

    >>> import example
    >>> c = example.new_intp()     # Create an "int" for storing result
    >>> example.add(3, 4, c)       # Call function
    >>> example.intp_value(c)      # Dereference
    7
    >>> example.delete_intp(c)     # Delete
    

    %pointer_class(type, name)

    Wraps a pointer of type * inside a class-based interface. This interface is as follows:

    struct name {
      name();                            // Create pointer object
      ~name();                           // Delete pointer object
      void assign(type value);           // Assign value
      type value();                      // Get value
      type *cast();                      // Cast the pointer to original type
      static name *frompointer(type *);  // Create class wrapper from existing
                                         // pointer
    };
    

    When using this macro, type is restricted to a simple type name like int, float, or Foo. Pointers and other complicated types are not allowed. name must be a valid identifier not already in use. When a pointer is wrapped as a class, the "class" may be transparently passed to any function that expects the pointer.

    If the target language does not support proxy classes, the use of this macro will produce the example same functions as %pointer_functions() macro.

    It should be noted that the class interface does introduce a new object or wrap a pointer inside a special structure. Instead, the raw pointer is used directly.

    Here is the same example using a class instead:

    %module example
    %include "cpointer.i"
    
    /* Wrap a class interface around an "int *" */
    %pointer_class(int, intp);
    
    /* A function that uses an "int *" */
    void add(int x, int y, int *result);
    

    Now, in Python (using proxy classes)

    >>> import example
    >>> c = example.intp()         # Create an "int" for storing result
    >>> example.add(3, 4, c)       # Call function
    >>> c.value()                  # Dereference
    7
    

    Of the two macros, %pointer_class is probably the most convenient when working with simple pointers. This is because the pointers are access like objects and they can be easily garbage collected (destruction of the pointer object destroys the underlying object).

    %pointer_cast(type1, type2, name)

    Creates a casting function that converts type1 to type2 . The name of the function is name. For example:

    %pointer_cast(int *, unsigned int *, int_to_uint);
    

    In this example, the function int_to_uint() would be used to cast types in the target language.

    Note: None of these macros can be used to safely work with strings (char * or char **).

    Note: When working with simple pointers, typemaps can often be used to provide more seamless operation.

    11.2.2 carrays.i

    This module defines macros that assist in wrapping ordinary C pointers as arrays. The module does not provide any safety or an extra layer of wrapping--it merely provides functionality for creating, destroying, and modifying the contents of raw C array data.

    %array_functions(type, name)

    Creates four functions.

    type *new_name(int nelements)

    Creates a new array of objects of type type. In C, the array is allocated using calloc(). In C++, new [] is used.

    type *delete_name(type *ary)

    Deletes an array. In C, free() is used. In C++, delete [] is used.

    type name_getitem(type *ary, int index)

    Returns the value ary[index].

    void name_setitem(type *ary, int index, type value)

    Assigns ary[index] = value.

    When using this macro, type may be any type and name must be a legal identifier in the target language. name should not correspond to any other name used in the interface file.

    Here is an example of %array_functions(). Suppose you had a function like this:

    void print_array(double x[10]) {
      int i;
      for (i = 0; i < 10; i++) {
        printf("[%d] = %g\n", i, x[i]);
      }
    }
    

    To wrap it, you might write this:

    %module example
    
    %include "carrays.i"
    %array_functions(double, doubleArray);
    
    void print_array(double x[10]);
    

    Now, in a scripting language, you might write this:

    a = new_doubleArray(10)               # Create an array
    for i in range(0, 10):
        doubleArray_setitem(a, i, 2 * i)  # Set a value
    print_array(a)                        # Pass to C
    delete_doubleArray(a)                 # Destroy array
    

    %array_class(type, name)

    Wraps a pointer of type * inside a class-based interface. This interface is as follows:

    struct name {
      name(int nelements);                  // Create an array
      ~name();                              // Delete array
      type getitem(int index);              // Return item
      void setitem(int index, type value);  // Set item
      type *cast();                         // Cast to original type
      static name *frompointer(type *);     // Create class wrapper from
                                            // existing pointer
    };
    

    When using this macro, type is restricted to a simple type name like int or float. Pointers and other complicated types are not allowed. name must be a valid identifier not already in use. When a pointer is wrapped as a class, it can be transparently passed to any function that expects the pointer.

    When combined with proxy classes, the %array_class() macro can be especially useful. For example:

    %module example
    %include "carrays.i"
    %array_class(double, doubleArray);
    
    void print_array(double x[10]);
    

    Allows you to do this:

    import example
    c = example.doubleArray(10)  # Create double[10]
    for i in range(0, 10):
        c[i] = 2 * i             # Assign values
    example.print_array(c)       # Pass to C
    

    Note: These macros do not encapsulate C arrays inside a special data structure or proxy. There is no bounds checking or safety of any kind. If you want this, you should consider using a special array object rather than a bare pointer.

    Note: %array_functions() and %array_class() should not be used with types of char or char *. SWIG's default handling of these types is to handle them as character strings and the two macros do not do enough to change this.

    11.2.3 cmalloc.i

    This module defines macros for wrapping the low-level C memory allocation functions malloc(), calloc(), realloc(), and free().

    %malloc(type [, name=type])

    Creates a wrapper around malloc() with the following prototype:

    type *malloc_name(int nbytes = sizeof(type));
    

    If type is void, then the size parameter nbytes is required. The name parameter only needs to be specified when wrapping a type that is not a valid identifier (e.g., " int *", "double **", etc.).

    %calloc(type [, name=type])

    Creates a wrapper around calloc() with the following prototype:

    type *calloc_name(int nobj =1, int sz = sizeof(type));
    

    If type is void, then the size parameter sz is required.

    %realloc(type [, name=type])

    Creates a wrapper around realloc() with the following prototype:

    type *realloc_name(type *ptr, int nitems);
    

    Note: unlike the C realloc(), the wrapper generated by this macro implicitly includes the size of the corresponding type. For example, realloc_int(p, 100) reallocates p so that it holds 100 integers.

    %free(type [, name=type])

    Creates a wrapper around free() with the following prototype:

    void free_name(type *ptr);
    

    %sizeof(type [, name=type])

    Creates the constant:

    %constant int sizeof_name = sizeof(type);
    

    %allocators(type [, name=type])

    Generates wrappers for all five of the above operations.

    Here is a simple example that illustrates the use of these macros:

    // SWIG interface
    %module example
    %include "cmalloc.i"
    
    %malloc(int);
    %free(int);
    
    %malloc(int *, intp);
    %free(int *, intp);
    
    %allocators(double);
    

    Now, in a script:

    >>> from example import *
    >>> a = malloc_int()
    >>> a
    '_000efa70_p_int'
    >>> free_int(a)
    >>> b = malloc_intp()
    >>> b
    '_000efb20_p_p_int'
    >>> free_intp(b)
    >>> c = calloc_double(50)
    >>> c
    '_000fab98_p_double'
    >>> c = realloc_double(100000)
    >>> free_double(c)
    >>> print sizeof_double
    8
    >>>
    

    11.2.4 cdata.i

    The cdata.i module defines functions for converting raw C data to and from strings in the target language. The primary applications of this module would be packing/unpacking of binary data structures---for instance, if you needed to extract data from a buffer. The target language must support strings with embedded binary data in order for this to work.

    const char *cdata(void *ptr, size_t nbytes)

    Converts nbytes of data at ptr into a string. ptr can be any pointer.

    void memmove(void *ptr, const char *s)

    Copies all of the string data in s into the memory pointed to by ptr. The string may contain embedded NULL bytes. This is actually a wrapper to the standard C library memmove function, which is declared as void memmove(void *ptr, const void *src, size_t n). The src and length n parameters are extracted from the language specific string s in the underlying wrapper code.

    One use of these functions is packing and unpacking data from memory. Here is a short example:

    // SWIG interface
    %module example
    %include "carrays.i"
    %include "cdata.i"
    
    %array_class(int, intArray);
    

    Python example:

    >>> a = intArray(10)
    >>> for i in range(0, 10):
    ...    a[i] = i
    >>> b = cdata(a, 40)
    >>> b
    '\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\x04
    \x00\x00\x00\x05\x00\x00\x00\x06\x00\x00\x00\x07\x00\x00\x00\x08\x00\x00\x00\t'
    >>> c = intArray(10)
    >>> memmove(c, b)
    >>> print c[4]
    4
    >>>
    

    Since the size of data is not always known, the following macro is also defined:

    %cdata(type [, name=type])

    Generates the following function for extracting C data for a given type.

    char *cdata_name(type* ptr, int nitems)
    

    nitems is the number of items of the given type to extract.

    Note: These functions provide direct access to memory and can be used to overwrite data. Clearly they are unsafe.

    11.3 C string handling

    A common problem when working with C programs is dealing with functions that manipulate raw character data using char *. In part, problems arise because there are different interpretations of char *---it could be a NULL-terminated string or it could point to binary data. Moreover, functions that manipulate raw strings may mutate data, perform implicit memory allocations, or utilize fixed-sized buffers.

    The problems (and perils) of using char * are well-known. However, SWIG is not in the business of enforcing morality. The modules in this section provide basic functionality for manipulating raw C strings.

    11.3.1 Default string handling

    Suppose you have a C function with this prototype:

    char *foo(char *s);
    

    The default wrapping behavior for this function is to set s to a raw char * that refers to the internal string data in the target language. In other words, if you were using a language like Tcl, and you wrote this,

    % foo Hello
    

    then s would point to the representation of "Hello" inside the Tcl interpreter. When returning a char *, SWIG assumes that it is a NULL-terminated string and makes a copy of it. This gives the target language its own copy of the result.

    There are obvious problems with the default behavior. First, since a char * argument points to data inside the target language, it is NOT safe for a function to modify this data (doing so may corrupt the interpreter and lead to a crash). Furthermore, the default behavior does not work well with binary data. Instead, strings are assumed to be NULL-terminated.

    11.3.2 Passing binary data

    If you have a function that expects binary data,

    size_t parity(char *str, size_t len, size_t initial);
    

    you can wrap the parameters (char *str, size_t len) as a single argument using a typemap. Just do this:

    %apply (char *STRING, size_t LENGTH) { (char *str, size_t len) };
    ...
    size_t parity(char *str, size_t len, size_t initial);
    

    Now, in the target language, you can use binary string data like this:

    >>> s = "H\x00\x15eg\x09\x20"
    >>> parity(s, 0)
    

    In the wrapper function, the passed string will be expanded to a pointer and length parameter. The (char *STRING, int LENGTH) multi-argument typemap is also available in addition to (char *STRING, size_t LENGTH).

    11.3.3 Using %newobject to release memory

    If you have a function that allocates memory like this,

    char *foo() {
      char *result = (char *) malloc(...);
      ...
      return result;
    }
    

    then the SWIG generated wrappers will have a memory leak--the returned data will be copied into a string object and the old contents ignored.

    To fix the memory leak, use the %newobject directive.

    %newobject foo;
    ...
    char *foo();
    

    This will release the result if the appropriate target language support is available. SWIG provides the appropriate "newfree" typemap for char * so that the memory is released, however, you may need to provide your own "newfree" typemap for other types. See Object ownership and %newobject for more details.

    11.3.4 cstring.i

    The cstring.i library file provides a collection of macros for dealing with functions that either mutate string arguments or which try to output string data through their arguments. An example of such a function might be this rather questionable implementation:

    void get_path(char *s) {
      // Potential buffer overflow---uh, oh.
      sprintf(s, "%s/%s", base_directory, sub_directory);
    }
    ...
    // Somewhere else in the C program
    {
      char path[1024];
      ...
      get_path(path);
      ...
    }
    

    (Off topic rant: If your program really has functions like this, you would be well-advised to replace them with safer alternatives involving bounds checking).

    The macros defined in this module all expand to various combinations of typemaps. Therefore, the same pattern matching rules and ideas apply.

    %cstring_bounded_output(parm, maxsize)

    Turns parameter parm into an output value. The output string is assumed to be NULL-terminated and smaller than maxsize characters. Here is an example:

    %cstring_bounded_output(char *path, 1024);
    ...
    void get_path(char *path);
    

    In the target language:

    >>> get_path()
    /home/beazley/packages/Foo/Bar
    >>>
    

    Internally, the wrapper function allocates a small buffer (on the stack) of the requested size and passes it as the pointer value. Data stored in the buffer is then returned as a function return value. If the function already returns a value, then the return value and the output string are returned together (multiple return values). If more than maxsize bytes are written, your program will crash with a buffer overflow!

    %cstring_chunk_output(parm, chunksize)

    Turns parameter parm into an output value. The output string is always chunksize and may contain binary data. Here is an example:

    %cstring_chunk_output(char *packet, PACKETSIZE);
    ...
    void get_packet(char *packet);
    

    In the target language:

    >>> get_packet()
    '\xa9Y:\xf6\xd7\xe1\x87\xdbH;y\x97\x7f\xd3\x99\x14V\xec\x06\xea\xa2\x88'
    >>>
    

    This macro is essentially identical to %cstring_bounded_output . The only difference is that the result is always chunksize characters. Furthermore, the result can contain binary data. If more than maxsize bytes are written, your program will crash with a buffer overflow!

    %cstring_bounded_mutable(parm, maxsize)

    Turns parameter parm into a mutable string argument. The input string is assumed to be NULL-terminated and smaller than maxsize characters. The output string is also assumed to be NULL-terminated and less than maxsize characters.

    %cstring_bounded_mutable(char *ustr, 1024);
    ...
    void make_upper(char *ustr);
    

    In the target language:

    >>> make_upper("hello world")
    'HELLO WORLD'
    >>>
    

    Internally, this macro is almost exactly the same as %cstring_bounded_output. The only difference is that the parameter accepts an input value that is used to initialize the internal buffer. It is important to emphasize that this function does not mutate the string value passed---instead it makes a copy of the input value, mutates it, and returns it as a result. If more than maxsize bytes are written, your program will crash with a buffer overflow!

    %cstring_mutable(parm [, expansion])

    Turns parameter parm into a mutable string argument. The input string is assumed to be NULL-terminated. An optional parameter expansion specifies the number of extra characters by which the string might grow when it is modified. The output string is assumed to be NULL-terminated and less than the size of the input string plus any expansion characters.

    %cstring_mutable(char *ustr);
    ...
    void make_upper(char *ustr);
    
    %cstring_mutable(char *hstr, HEADER_SIZE);
    ...
    void attach_header(char *hstr);
    

    In the target language:

    >>> make_upper("hello world")
    'HELLO WORLD'
    >>> attach_header("Hello world")
    'header: Hello world'
    >>>
    

    This macro differs from %cstring_bounded_mutable() in that a buffer is dynamically allocated (on the heap using malloc/new ). This buffer is always large enough to store a copy of the input value plus any expansion bytes that might have been requested. It is important to emphasize that this function does not directly mutate the string value passed---instead it makes a copy of the input value, mutates it, and returns it as a result. If the function expands the result by more than expansion extra bytes, then the program will crash with a buffer overflow!

    %cstring_output_maxsize(parm, maxparm)

    This macro is used to handle bounded character output functions where both a char * and a maximum length parameter are provided. As input, a user simply supplies the maximum length. The return value is assumed to be a NULL-terminated string.

    %cstring_output_maxsize(char *path, int maxpath);
    ...
    void get_path(char *path, int maxpath);
    

    In the target language:

    >>> get_path(1024)
    '/home/beazley/Packages/Foo/Bar'
    >>>
    

    This macro provides a safer alternative for functions that need to write string data into a buffer. User supplied buffer size is used to dynamically allocate memory on heap. Results are placed into that buffer and returned as a string object.

    %cstring_output_withsize(parm, maxparm)

    This macro is used to handle bounded character output functions where both a char * and a pointer int * are passed. Initially, the int * parameter points to a value containing the maximum size. On return, this value is assumed to contain the actual number of bytes. As input, a user simply supplies the maximum length. The output value is a string that may contain binary data.

    %cstring_output_withsize(char *data, int *maxdata);
    ...
    void get_data(char *data, int *maxdata);
    

    In the target language:

    >>> get_data(1024)
    'x627388912'
    >>> get_data(1024)
    'xyzzy'
    >>>
    

    This macro is a somewhat more powerful version of %cstring_output_chunk(). Memory is dynamically allocated and can be arbitrary large. Furthermore, a function can control how much data is actually returned by changing the value of the maxparm argument.

    %cstring_output_allocate(parm, release)

    This macro is used to return strings that are allocated within the program and returned in a parameter of type char **. For example:

    void foo(char **s) {
      *s = (char *) malloc(64);
      sprintf(*s, "Hello world\n");
    }
    

    The returned string is assumed to be NULL-terminated. release specifies how the allocated memory is to be released (if applicable). Here is an example:

    %cstring_output_allocate(char **s, free(*$1));
    ...
    void foo(char **s);
    

    In the target language:

    >>> foo()
    'Hello world\n'
    >>>
    

    %cstring_output_allocate_size(parm, szparm, release)

    This macro is used to return strings that are allocated within the program and returned in two parameters of type char ** and int *. For example:

    void foo(char **s, int *sz) {
      *s = (char *) malloc(64);
      *sz = 64;
      // Write some binary data
      ...
    }
    

    The returned string may contain binary data. release specifies how the allocated memory is to be released (if applicable). Here is an example:

    %cstring_output_allocate_size(char **s, int *slen, free(*$1));
    ...
    void foo(char **s, int *slen);
    

    In the target language:

    >>> foo()
    '\xa9Y:\xf6\xd7\xe1\x87\xdbH;y\x97\x7f\xd3\x99\x14V\xec\x06\xea\xa2\x88'
    >>>
    

    This is the safest and most reliable way to return binary string data in SWIG. If you have functions that conform to another prototype, you might consider wrapping them with a helper function. For example, if you had this:

    char  *get_data(int *len);
    

    You could wrap it with a function like this:

    void my_get_data(char **result, int *len) {
      *result = get_data(len);
    }
    

    Comments:

    • Support for the cstring.i module depends on the target language. Not all SWIG modules currently support this library.
    • Reliable handling of raw C strings is a delicate topic. There are many ways to accomplish this in SWIG. This library provides support for a few common techniques.
    • If used in C++, this library uses new and delete [] for memory allocation. If using C, the library uses malloc() and free().
    • Rather than manipulating char * directly, you might consider using a special string structure or class instead.

    11.4 STL/C++ library

    The library modules in this section provide access to parts of the standard C++ library including the STL. SWIG support for the STL is an ongoing effort. Support is quite comprehensive for some language modules but some of the lesser used modules do not have quite as much library code written.

    The following table shows which C++ classes are supported and the equivalent SWIG interface library file for the C++ library.

    C++ classC++ Library file SWIG Interface library file
    std::array (C++11)arraystd_array.i
    std::auto_ptrmemorystd_auto_ptr.i
    std::complexcomplexstd_complex.i
    std::dequedequestd_deque.i
    std::listliststd_list.i
    std::mapmapstd_map.i
    std::multimap (C++11)multimapstd_multimap.i
    std::multiset (C++11)multisetstd_multiset.i
    std::pairutilitystd_pair.i
    std::setsetstd_set.i
    std::stringstringstd_string.i
    std::unordered_map (C++11)unordered_map std_unordered_map.i
    std::unordered_multimap (C++11)unordered_multimap std_unordered_multimap.i
    std::unordered_multiset (C++11)unordered_multiset std_unordered_multiset.i
    std::unordered_set (C++11)unordered_set std_unordered_set.i
    std::vectorvectorstd_vector.i
    std::wstringwstringstd_wstring.i
    std::shared_ptr (C++11)shared_ptr std_shared_ptr.i

    The list is by no means complete; some language modules support a subset of the above and some support additional STL classes. Please look for the library files in the appropriate language library directory.

    11.4.1 std::string

    The std_string.i library provides typemaps for converting C++ std::string objects to and from strings in the target scripting language. For example:

    %module example
    %include "std_string.i"
    
    std::string foo();
    void        bar(const std::string &x);
    

    In the target language:

    x = foo();                # Returns a string object
    bar("Hello World");       # Pass string as std::string
    

    A common problem that people encounter is that of classes/structures containing a std::string. This can be overcome by defining a typemap. For example:

    %module example
    %include "std_string.i"
    
    %apply const std::string& {std::string* foo};
    
    struct my_struct
    {
      std::string foo;
    };
    

    In the target language:

    x = my_struct();
    x.foo = "Hello World";    # assign with string
    print x.foo;              # print as string
    

    This module only supports types std::string and const std::string &. Pointers and non-const references are left unmodified and returned as SWIG pointers.

    This library file is fully aware of C++ namespaces. If you export std::string or rename it with a typedef, make sure you include those declarations in your interface. For example:

    %module example
    %include "std_string.i"
    
    using namespace std;
    typedef std::string String;
    ...
    void foo(string s, const String &t);     // std_string typemaps still applied
    

    11.4.2 std::vector

    The std_vector.i library provides support for the C++ std::vector class in the STL. Using this library involves the use of the %template directive. All you need to do is to instantiate different versions of vector for the types that you want to use. For example:

    %module example
    %include "std_vector.i"
    
    namespace std {
      %template(vectori) vector<int>;
      %template(vectord) vector<double>;
    };
    

    When a template vector<X> is instantiated a number of things happen:

    • A class that exposes the C++ API is created in the target language . This can be used to create objects, invoke methods, etc. This class is currently a subset of the real STL vector class.
    • Input typemaps are defined for vector<X>, const vector<X> &, and const vector<X> *. For each of these, a pointer vector<X> * may be passed or a native list object in the target language.
    • An output typemap is defined for vector<X>. In this case, the values in the vector are expanded into a list object in the target language.
    • For all other variations of the type, the wrappers expect to receive a vector<X> * object in the usual manner.
    • An exception handler for std::out_of_range is defined.
    • Optionally, special methods for indexing, item retrieval, slicing, and element assignment may be defined. This depends on the target language.

    To illustrate the use of this library, consider the following functions:

    /* File : example.h */
    
    #include <vector>
    #include <algorithm>
    #include <functional>
    #include <numeric>
    
    double average(std::vector<int> v) {
      return std::accumulate(v.begin(), v.end(), 0.0)/v.size();
    }
    
    std::vector<double> half(const std::vector<double>& v) {
      std::vector<double> w(v);
      for (unsigned int i=0; i<w.size(); i++)
        w[i] /= 2.0;
      return w;
    }
    
    void halve_in_place(std::vector<double>& v) {
      for (std::vector<double>::iterator it = v.begin(); it != v.end(); ++it)
        *it /= 2.0;
    }
    

    To wrap with SWIG, you might write the following:

    %module example
    %{
    #include "example.h"
    %}
    
    %include "std_vector.i"
    // Instantiate templates used by example
    namespace std {
      %template(IntVector) vector<int>;
      %template(DoubleVector) vector<double>;
    }
    
    // Include the header file with above prototypes
    %include "example.h"
    

    Now, to illustrate the behavior in the scripting interpreter, consider this Python example:

    >>> from example import *
    >>> iv = IntVector(4)         # Create an vector<int>
    >>> for i in range(0, 4):
    ...      iv[i] = i
    >>> average(iv)               # Call method
    1.5
    >>> average([0, 1, 2, 3])        # Call with list
    1.5
    >>> half([1, 2, 3])             # Half a list
    (0.5, 1.0, 1.5)
    >>> halve_in_place([1, 2, 3])   # Oops
    Traceback (most recent call last):
      File "<stdin>", line 1, in ?
    TypeError: Type error. Expected _p_std__vectorTdouble_t
    >>> dv = DoubleVector(4)
    >>> for i in range(0, 4):
    ...       dv[i] = i
    >>> halve_in_place(dv)       # Ok
    >>> for i in dv:
    ...       print i
    ...
    0.0
    0.5
    1.0
    1.5
    >>> dv[20] = 4.5
    Traceback (most recent call last):
      File "<stdin>", line 1, in ?
      File "example.py", line 81, in __setitem__
        def __setitem__(*args): return apply(examplec.DoubleVector___setitem__, args)
    IndexError: vector index out of range
    >>>
    

    This library module is fully aware of C++ namespaces. If you use vectors with other names, make sure you include the appropriate using or typedef directives. For example:

    %include "std_vector.i"
    
    namespace std {
      %template(IntVector) vector<int>;
    }
    
    using namespace std;
    typedef std::vector Vector;
    
    void foo(vector<int> *x, const Vector &x);
    

    Note: This module makes use of several advanced SWIG features including templatized typemaps and template partial specialization. If you are trying to wrap other C++ code with templates, you might look at the code contained in std_vector.i. Alternatively, you can show them the code if you want to make their head explode.

    Note: This module is defined for all SWIG target languages. However argument conversion details and the public API exposed to the interpreter vary.

    11.4.3 STL exceptions

    Many of the STL wrapper functions add parameter checking and will throw a language dependent error/exception should the values not be valid. The classic example is array bounds checking. The library wrappers are written to throw a C++ exception in the case of error. The C++ exception in turn gets converted into an appropriate error/exception for the target language. By and large this handling should not need customising, however, customisation can easily be achieved by supplying appropriate "throws" typemaps. For example:

    %module example
    %include "std_vector.i"
    %typemap(throws) std::out_of_range {
      // custom exception handler
    }
    %template(VectInt) std::vector<int>;
    

    The custom exception handler might, for example, log the exception then convert it into a specific error/exception for the target language.

    When using the STL it is advisable to add in an exception handler to catch all STL exceptions. The %exception directive can be used by placing the following code before any other methods or libraries to be wrapped:

    %include "exception.i"
    
    %exception {
      try {
        $action
      } catch (const std::exception& e) {
        SWIG_exception(SWIG_RuntimeError, e.what());
      }
    }
    

    Any thrown STL exceptions will then be gracefully handled instead of causing a crash.

    11.4.4 shared_ptr smart pointer

    11.4.4.1 shared_ptr basics

    Some target languages have support for handling the shared_ptr reference counted smart pointer. This smart pointer is available in the standard C++11 library as std::shared_ptr. It was also in TR1 as std::tr1::shared_ptr before it was fully standardized. Support for the widely used boost::shared_ptr is also available.

    In order to use std::shared_ptr, the std_shared_ptr.i library file should be included:

    %include <std_shared_ptr.i>
    

    The pre-standard std::tr1::shared_ptr can be used by including the following macro before including the std_shared_ptr.i library file:

    #define SWIG_SHARED_PTR_SUBNAMESPACE tr1
    %include <std_shared_ptr.i>
    

    In order to use boost::shared_ptr, the boost_shared_ptr.i library file should be included:

    %include <boost_shared_ptr.i>
    

    You can only use one of these variants of shared_ptr in your interface file at a time. and all three variants must be used in conjunction with the %shared_ptr(T) macro, where T is the underlying pointer type equating to usage shared_ptr<T>. The type T must be non-primitive. A simple example demonstrates usage:

    %module example
    %include <boost_shared_ptr.i>
    %shared_ptr(IntValue)
    
    %inline %{
    #include <boost/shared_ptr.hpp>
    
    struct IntValue {
      int value;
      IntValue(int v) : value(v) {}
    };
    
    static int extractValue(const IntValue &t) {
      return t.value;
    }
    
    static int extractValueSmart(boost::shared_ptr<IntValue> t) {
      return t->value;
    }
    %}
    

    Note that the %shared_ptr(IntValue) declaration occurs after the inclusion of the boost_shared_ptr.i library which provides the macro and, very importantly, before any usage or declaration of the type, IntValue. The %shared_ptr macro provides, a few things for handling this smart pointer, but mostly a number of typemaps. These typemaps override the default typemaps so that the underlying proxy class is stored and passed around as a pointer to a shared_ptr instead of a plain pointer to the underlying type. This approach means that any instantiation of the type can be passed to methods taking the type by value, reference, pointer or as a smart pointer. The interested reader might want to look at the generated code, however, usage is simple and no different handling is required from the target language. For example, a simple use case of the above code from Java would be:

    IntValue iv = new IntValue(1234);
    int val1 = example.extractValue(iv);
    int val2 = example.extractValueSmart(iv);
    System.out.println(val1 + " " + val2);
    

    11.4.4.2 shared_ptr and inheritance

    The shared_ptr library works quite differently to SWIG's normal, but somewhat limited, smart pointer handling. The shared_ptr library does not generate extra wrappers, just for smart pointer handling, in addition to the proxy class. The normal proxy class including inheritance relationships is generated as usual. The only real change introduced by the %shared_ptr macro is that the proxy class stores a pointer to the shared_ptr instance instead of a raw pointer to the instance. A proxy class derived from a base which is being wrapped with shared_ptr can and must be wrapped as a shared_ptr too. In other words all classes in an inheritance hierarchy must all be used with the %shared_ptr macro. For example the following code can be used with the base class shown earlier:

    %shared_ptr(DerivedIntValue)
    %inline %{
    struct DerivedIntValue : IntValue {
      DerivedIntValue(int value) : IntValue(value) {}
      ...
    };
    %}
    

    A shared_ptr of the derived class can now be passed to a method where the base is expected in the target language, just as it can in C++:

    DerivedIntValue div = new DerivedIntValue(5678);
    int val3 = example.extractValue(div);
    int val4 = example.extractValueSmart(div);
    

    If the %shared_ptr macro is omitted for any class in the inheritance hierarchy, SWIG will warn about this and the generated code may or may not result in a C++ compilation error. For example, the following input:

    %include "boost_shared_ptr.i"
    %shared_ptr(Parent);
    
    %inline %{
      #include <boost/shared_ptr.hpp>
      struct GrandParent {
        virtual ~GrandParent() {}
      };
    
      struct Parent : GrandParent {
        virtual ~Parent() {}
      };
    
      struct Child : Parent {
        virtual ~Child() {}
      };
    %}
    

    warns about the missing smart pointer information:

    example.i:12: Warning 520: Base class 'GrandParent' of 'Parent' is not similarly marked as a smart pointer.
    example.i:16: Warning 520: Derived class 'Child' of 'Parent' is not similarly marked as a smart pointer.
    

    Adding the missing %shared_ptr macros will fix this:

    %include <boost_shared_ptr.i>
    %shared_ptr(GrandParent);
    %shared_ptr(Parent);
    %shared_ptr(Child);
    
    ... as before ...
    

    11.4.4.3 shared_ptr and method overloading

    A C++ compiler can disambiguate a method overloaded by a shared_ptr and one using the raw underlying type. For example, either one of these methods can be called in C++:

    int age(std::shared_ptr<GrandParent> num);
    int age(GrandParent& num);
    

    When wrapped by SWIG, disambiguation is not possible using the overloaded names as there is just one equivalent type (GrandParent ) in the target language. SWIG will choose to wrap just the first method by default. Ambiguity in overloading discusses ways to control which method(s) gets wrapped using %ignore or %rename. For the interested reader, SWIG detects that they are equivalent types via the typecheck typemaps in the shared_ptr library.

    11.4.4.4 shared_ptr and templates

    The %shared_ptr macro should be used for all the required instantiations of the template before each of the %template instantiations. For example, consider number.h containing the following illustrative template:

    #include <memory>
    
    template<int N> struct Number {
      int num;
      Number() : num(N) {}
      static std::shared_ptr<Number<N>> make() { return std::make_shared<Number<N>>(); }
    };
    

    The SWIG code below shows the required ordering:

    %include <std_shared_ptr.i>
    
    %shared_ptr(Number<10>);
    %shared_ptr(Number<42>);
    
    %{
      #include "number.h"
    %}
    %include "number.h"
    
    %template(Number10) Number<10>;
    %template(Number42) Number<42>;
    

    11.4.4.5 shared_ptr and directors

    The languages that support shared_ptr also have support for using shared_ptr with directors.

    11.4.5 auto_ptr smart pointer

    While std::auto_ptr is deprecated in C++11, some existing code may still be using it, so SWIG provides limited support for this class: std_auto_ptr.i defines the typemaps which apply to the functions returning objects of this type. Any other use of std_auto_ptr.i is not directly supported.

    A typical example of use would be

    %include <std_auto_ptr.i>
    
    %auto_ptr(Klass)
    %inline %{
    class Klass {
    public:
      // Factory function creating objects of this class:
      static std::auto_ptr<Klass> Create(int value) {
        return std::auto_ptr<Klass>(new Klass(value));
      }
    
      int getValue() const { return m_value; }
    
    private:
      DerivedIntValue(int value) : m_value(value) {}
      int m_value;
    };
    %}
    

    The returned objects can be used naturally from the target language, e.g. from C#:

    Klass k = Klass.Create(17);
    int value = k.getValue();
    

    11.5 Utility Libraries

    11.5.1 exception.i

    The exception.i library provides a language-independent function for raising a run-time exception in the target language. This library is largely used by the SWIG library writers. If possible, use the error handling scheme available to your target language as there is greater flexibility in what errors/exceptions can be thrown.

    SWIG_exception(int code, const char *message)

    Raises an exception in the target language. code is one of the following symbolic constants:

    SWIG_MemoryError
    SWIG_IOError
    SWIG_RuntimeError
    SWIG_IndexError
    SWIG_TypeError
    SWIG_DivisionByZero
    SWIG_OverflowError
    SWIG_SyntaxError
    SWIG_ValueError
    SWIG_SystemError
    

    message is a string indicating more information about the problem.

    The primary use of this module is in writing language-independent exception handlers. For example:

    %include "exception.i"
    %exception std::vector::getitem {
      try {
        $action
      } catch (std::out_of_range& e) {
        SWIG_exception(SWIG_IndexError, const_cast<char*>(e.what()));
      }
    }
    

    12 Argument Handling

    In Chapter 5, SWIG's treatment of basic datatypes and pointers was described. In particular, primitive types such as int and double are mapped to corresponding types in the target language. For everything else, pointers are used to refer to structures, classes, arrays, and other user-defined datatypes. However, in certain applications it is desirable to change SWIG's handling of a specific datatype. For example, you might want to return multiple values through the arguments of a function. This chapter describes some of the techniques for doing this.

    12.1 The typemaps.i library

    This section describes the typemaps.i library file--commonly used to change certain properties of argument conversion.

    12.1.1 Introduction

    Suppose you had a C function like this:

    void add(double a, double b, double *result) {
      *result = a + b;
    }
    

    From reading the source code, it is clear that the function is storing a value in the double *result parameter. However, since SWIG does not examine function bodies, it has no way to know that this is the underlying behavior.

    One way to deal with this is to use the typemaps.i library file and write interface code like this:

    // Simple example using typemaps
    %module example
    %include "typemaps.i"
    
    %apply double *OUTPUT { double *result };
    %inline %{
    extern void add(double a, double b, double *result);
    %}
    

    The %apply directive tells SWIG that you are going to apply a special type handling rule to a type. The "double *OUTPUT" specification is the name of a rule that defines how to return an output value from an argument of type double *. This rule gets applied to all of the datatypes listed in curly braces-- in this case " double *result".

    When the resulting module is created, you can now use the function like this (shown for Python):

    >>> a = add(3, 4)
    >>> print a
    7
    >>>
    

    In this case, you can see how the output value normally returned in the third argument has magically been transformed into a function return value. Clearly this makes the function much easier to use since it is no longer necessary to manufacture a special double * object and pass it to the function somehow.

    Once a typemap has been applied to a type, it stays in effect for all future occurrences of the type and name. For example, you could write the following:

    %module example
    %include "typemaps.i"
    
    %apply double *OUTPUT { double *result };
    
    %inline %{
    extern void add(double a, double b, double *result);
    extern void sub(double a, double b, double *result);
    extern void mul(double a, double b, double *result);
    extern void div(double a, double b, double *result);
    %}
    ...
    

    In this case, the double *OUTPUT rule is applied to all of the functions that follow.

    Typemap transformations can even be extended to multiple return values. For example, consider this code:

    %include "typemaps.i"
    %apply int *OUTPUT { int *width, int *height };
    
    // Returns a pair (width, height)
    void getwinsize(int winid, int *width, int *height);
    

    In this case, the function returns multiple values, allowing it to be used like this:

    >>> w, h = genwinsize(wid)
    >>> print w
    400
    >>> print h
    300
    >>>
    

    It should also be noted that although the %apply directive is used to associate typemap rules to datatypes, you can also use the rule names directly in arguments. For example, you could write this:

    // Simple example using typemaps
    %module example
    %include "typemaps.i"
    
    %{
    extern void add(double a, double b, double *OUTPUT);
    %}
    extern void add(double a, double b, double *OUTPUT);
    

    Typemaps stay in effect until they are explicitly deleted or redefined to something else. To clear a typemap, the %clear directive should be used. For example:

    %clear double *result;      // Remove all typemaps for double *result
    

    12.1.2 Input parameters

    The following typemaps instruct SWIG that a pointer really only holds a single input value:

    int *INPUT
    short *INPUT
    long *INPUT
    unsigned int *INPUT
    unsigned short *INPUT
    unsigned long *INPUT
    double *INPUT
    float *INPUT
    

    When used, it allows values to be passed instead of pointers. For example, consider this function:

    double add(double *a, double *b) {
      return *a+*b;
    }
    

    Now, consider this SWIG interface:

    %module example
    %include "typemaps.i"
    ...
    %{
    extern double add(double *, double *);
    %}
    extern double add(double *INPUT, double *INPUT);
    
    

    When the function is used in the scripting language interpreter, it will work like this:

    result = add(3, 4)
    

    12.1.3 Output parameters

    The following typemap rules tell SWIG that pointer is the output value of a function. When used, you do not need to supply the argument when calling the function. Instead, one or more output values are returned.

    int *OUTPUT
    short *OUTPUT
    long *OUTPUT
    unsigned int *OUTPUT
    unsigned short *OUTPUT
    unsigned long *OUTPUT
    double *OUTPUT
    float *OUTPUT
    
    

    These methods can be used as shown in an earlier example. For example, if you have this C function :

    void add(double a, double b, double *c) {
      *c = a+b;
    }
    

    A SWIG interface file might look like this :

    %module example
    %include "typemaps.i"
    ...
    %inline %{
    extern void add(double a, double b, double *OUTPUT);
    %}
    
    

    In this case, only a single output value is returned, but this is not a restriction. An arbitrary number of output values can be returned by applying the output rules to more than one argument (as shown previously).

    If the function also returns a value, it is returned along with the argument. For example, if you had this:

    extern int foo(double a, double b, double *OUTPUT);
    

    The function will return two values like this:

    iresult, dresult = foo(3.5, 2)
    

    12.1.4 Input/Output parameters

    When a pointer serves as both an input and output value you can use the following typemaps :

    int *INOUT
    short *INOUT
    long *INOUT
    unsigned int *INOUT
    unsigned short *INOUT
    unsigned long *INOUT
    double *INOUT
    float *INOUT
    
    

    A C function that uses this might be something like this:

    void negate(double *x) {
      *x = -(*x);
    }
    
    

    To make x function as both and input and output value, declare the function like this in an interface file :

    %module example
    %include "typemaps.i"
    ...
    %{
    extern void negate(double *);
    %}
    extern void negate(double *INOUT);
    
    

    Now within a script, you can simply call the function normally :

    a = negate(3);         # a = -3 after calling this
    

    One subtle point of the INOUT rule is that many scripting languages enforce mutability constraints on primitive objects (meaning that simple objects like integers and strings aren't supposed to change). Because of this, you can't just modify the object's value in place as the underlying C function does in this example. Therefore, the INOUT rule returns the modified value as a new object rather than directly overwriting the value of the original input object.

    Compatibility note : The INOUT rule used to be known as BOTH in earlier versions of SWIG. Backwards compatibility is preserved, but deprecated.

    12.1.5 Using different names

    As previously shown, the %apply directive can be used to apply the INPUT, OUTPUT, and INOUT typemaps to different argument names. For example:

    // Make double *result an output value
    %apply double *OUTPUT { double *result };
    
    // Make Int32 *in an input value
    %apply int *INPUT { Int32 *in };
    
    // Make long *x inout
    %apply long *INOUT {long *x};
    
    

    To clear a rule, the %clear directive is used:

    %clear double *result;
    %clear Int32 *in, long *x;
    

    Typemap declarations are lexically scoped so a typemap takes effect from the point of definition to the end of the file or a matching %clear declaration.

    12.2 Applying constraints to input values

    In addition to changing the handling of various input values, it is also possible to use typemaps to apply constraints. For example, maybe you want to insure that a value is positive, or that a pointer is non-NULL. This can be accomplished including the constraints.i library file.

    12.2.1 Simple constraint example

    The constraints library is best illustrated by the following interface file :

    // Interface file with constraints
    %module example
    %include "constraints.i"
    
    double exp(double x);
    double log(double POSITIVE);         // Allow only positive values
    double sqrt(double NONNEGATIVE);     // Non-negative values only
    double inv(double NONZERO);          // Non-zero values
    void   free(void *NONNULL);          // Non-NULL pointers only
    
    

    The behavior of this file is exactly as you would expect. If any of the arguments violate the constraint condition, a scripting language exception will be raised. As a result, it is possible to catch bad values, prevent mysterious program crashes and so on.

    12.2.2 Constraint methods

    The following constraints are currently available

    POSITIVE                     Any number > 0 (not zero)
    NEGATIVE                     Any number < 0 (not zero)
    NONNEGATIVE                  Any number >= 0
    NONPOSITIVE                  Any number <= 0
    NONZERO                      Nonzero number
    NONNULL                      Non-NULL pointer (pointers only).
    
    

    12.2.3 Applying constraints to new datatypes

    The constraints library only supports the primitive C datatypes, but it is easy to apply it to new datatypes using %apply. For example :

    // Apply a constraint to a Real variable
    %apply Number POSITIVE { Real in };
    
    // Apply a constraint to a pointer type
    %apply Pointer NONNULL { Vector * };
    
    

    The special types of "Number" and "Pointer" can be applied to any numeric and pointer variable type respectively. To later remove a constraint, the %clear directive can be used :

    %clear Real in;
    %clear Vector *;
    

    13 Typemaps

    13.1 Introduction

    Chances are, you are reading this chapter for one of two reasons; you either want to customize SWIG's behavior or you overheard someone mumbling some incomprehensible drivel about "typemaps" and you asked yourself "typemaps, what are those?" That said, let's start with a short disclaimer that "typemaps" are an advanced customization feature that provide direct access to SWIG's low-level code generator. Not only that, they are an integral part of the SWIG C++ type system (a non-trivial topic of its own). Typemaps are generally not a required part of using SWIG. Therefore, you might want to re-read the earlier chapters if you have found your way to this chapter with only a vague idea of what SWIG already does by default.

    13.1.1 Type conversion

    One of the most important problems in wrapper code generation is the conversion or marshalling of datatypes between programming languages. Specifically, for every C/C++ declaration, SWIG must somehow generate wrapper code that allows values to be passed back and forth between languages. Since every programming language represents data differently, this is not a simple of matter of simply linking code together with the C linker. Instead, SWIG has to know something about how data is represented in each language and how it can be manipulated.

    To illustrate, suppose you had a simple C function like this:

    int factorial(int n);
    

    To access this function from Python, a pair of Python API functions are used to convert integer values. For example:

    long PyInt_AsLong(PyObject *obj);      /* Python --> C */
    PyObject *PyInt_FromLong(long x);      /* C --> Python */
    

    The first function is used to convert the input argument from a Python integer object to C long. The second function is used to convert a value from C back into a Python integer object.

    Inside the wrapper function, you might see these functions used like this:

    PyObject *wrap_factorial(PyObject *self, PyObject *args) {
      int       arg1;
      int       result;
      PyObject *obj1;
      PyObject *resultobj;
    
      if (!PyArg_ParseTuple("O:factorial", &obj1)) return NULL;
      arg1 = PyInt_AsLong(obj1);
      result = factorial(arg1);
      resultobj = PyInt_FromLong(result);
      return resultobj;
    }
    

    Every target language supported by SWIG has functions that work in a similar manner. For example, in Perl, the following functions are used:

    IV SvIV(SV *sv);                     /* Perl --> C */
    void sv_setiv(SV *sv, IV val);       /* C --> Perl */
    

    In Tcl:

    int Tcl_GetLongFromObj(Tcl_Interp *interp, Tcl_Obj *obj, long *value);
    Tcl_Obj *Tcl_NewIntObj(long value);
    

    The precise details are not so important. What is important is that all of the underlying type conversion is handled by collections of utility functions and short bits of C code like this---you simply have to read the extension documentation for your favorite language to know how it works (an exercise left to the reader).

    13.1.2 Typemaps

    Since type handling is so central to wrapper code generation, SWIG allows it to be completely defined (or redefined) by the user. To do this, a special %typemap directive is used. For example:

    /* Convert from Python --> C */
    %typemap(in) int {
      $1 = PyInt_AsLong($input);
    }
    
    /* Convert from C --> Python */
    %typemap(out) int {
      $result = PyInt_FromLong($1);
    }
    

    At first glance, this code will look a little confusing. However, there is really not much to it. The first typemap (the "in" typemap) is used to convert a value from the target language to C. The second typemap (the "out" typemap) is used to convert in the other direction. The content of each typemap is a small fragment of code that is inserted directly into the SWIG generated wrapper functions. The code is usually C or C++ code which will be generated into the C/C++ wrapper functions. Note that this isn't always the case as some target language modules allow target language code within the typemaps which gets generated into target language specific files. Within this code, a number of special variables prefixed with a $ are expanded. These are really just placeholders for C/C++ variables that are generated in the course of creating the wrapper function. In this case, $input refers to an input object that needs to be converted to C/C++ and $result refers to an object that is going to be returned by a wrapper function. $1 refers to a C/C++ variable that has the same type as specified in the typemap declaration (an int in this example).

    A short example might make this a little more clear. If you were wrapping a function like this:

    int gcd(int x, int y);
    

    A wrapper function would look approximately like this:

    PyObject *wrap_gcd(PyObject *self, PyObject *args) {
      int arg1;
      int arg2;
      int result;
      PyObject *obj1;
      PyObject *obj2;
      PyObject *resultobj;
    
      if (!PyArg_ParseTuple("OO:gcd", &obj1, &obj2)) return NULL;
    
      /* "in" typemap, argument 1 */
      {
        arg1 = PyInt_AsLong(obj1);
      }
    
      /* "in" typemap, argument 2 */
      {
        arg2 = PyInt_AsLong(obj2);
      }
    
      result = gcd(arg1, arg2);
    
      /* "out" typemap, return value */
      {
        resultobj = PyInt_FromLong(result);
      }
    
      return resultobj;
    }
    

    In this code, you can see how the typemap code has been inserted into the function. You can also see how the special $ variables have been expanded to match certain variable names inside the wrapper function. This is really the whole idea behind typemaps--they simply let you insert arbitrary code into different parts of the generated wrapper functions. Because arbitrary code can be inserted, it possible to completely change the way in which values are converted.

    13.1.3 Pattern matching

    As the name implies, the purpose of a typemap is to "map" C datatypes to types in the target language. Once a typemap is defined for a C datatype, it is applied to all future occurrences of that type in the input file. For example:

    /* Convert from Perl --> C */
    %typemap(in) int {
      $1 = SvIV($input);
    }
    
    ...
    int factorial(int n);
    int gcd(int x, int y);
    int count(char *s, char *t, int max);
    

    The matching of typemaps to C datatypes is more than a simple textual match. In fact, typemaps are fully built into the underlying type system. Therefore, typemaps are unaffected by typedef, namespaces, and other declarations that might hide the underlying type. For example, you could have code like this:

    /* Convert from Ruby--> C */
    %typemap(in) int {
      $1 = NUM2INT($input);
    }
    ...
    typedef int Integer;
    namespace foo {
      typedef Integer Number;
    };
    
    int foo(int x);
    int bar(Integer y);
    int spam(foo::Number a, foo::Number b);
    

    In this case, the typemap is still applied to the proper arguments even though typenames don't always match the text "int". This ability to track types is a critical part of SWIG--in fact, all of the target language modules work merely define a family of typemaps for the basic types. Yet, it is never necessary to write new typemaps for typenames introduced by typedef.

    In addition to tracking typenames, typemaps may also be specialized to match against a specific argument name. For example, you could write a typemap like this:

    %typemap(in) double nonnegative {
      $1 = PyFloat_AsDouble($input);
      if ($1 < 0) {
        PyErr_SetString(PyExc_ValueError, "argument must be nonnegative.");
        SWIG_fail;
      }
    }
    
    ...
    double sin(double x);
    double cos(double x);
    double sqrt(double nonnegative);
    
    typedef double Real;
    double log(Real nonnegative);
    ...
    

    For certain tasks such as input argument conversion, typemaps can be defined for sequences of consecutive arguments. For example:

    %typemap(in) (char *str, int len) {
      $1 = PyString_AsString($input);   /* char *str */
      $2 = PyString_Size($input);       /* int len   */
    }
    ...
    int count(char *str, int len, char c);
    

    In this case, a single input object is expanded into a pair of C arguments. This example also provides a hint to the unusual variable naming scheme involving $1, $2, and so forth.

    13.1.4 Reusing typemaps

    Typemaps are normally defined for specific type and argument name patterns. However, typemaps can also be copied and reused. One way to do this is to use assignment like this:

    %typemap(in) Integer = int;   
    %typemap(in) (char *buffer, int size) = (char *str, int len);
    

    There is a more powerful way to copy a family of typemaps though. Consider the following family of two typemap methods, "in" and "out" for type int:

    %typemap(in) int {
      /* Convert an integer argument */
      ...
    }
    %typemap(out) int {
      /* Return an integer value */
      ...
    }
    

    Each of the two typemap methods could be copied individually for type size_t as follows:

    /* Apply all of the int typemaps to size_t */
    %typemap(in) size_t = int;   
    %typemap(out) size_t = int;   
    

    A more powerful form of copying is available from the %apply directive. The code below is identical to the above:

    /* Apply all of the int typemaps to size_t */
    %apply int { size_t };    
    

    %apply merely takes all of the typemaps that are defined for one type and applies them to other types. Note: you can include a comma separated set of types in the { ... } part of %apply.

    It should be noted that it is not necessary to copy typemaps for types that are related by typedef. For example, if you have this,

    typedef int size_t;
    

    then SWIG already knows that the int typemaps apply. You don't have to do anything.

    13.1.5 What can be done with typemaps?

    The primary use of typemaps is for defining wrapper generation behavior at the level of individual C/C++ datatypes. There are currently six general categories of problems that typemaps address:

    Argument handling

    int foo(int x, double y, char *s);
    
    • Input argument conversion ("in" typemap).
    • Input argument type checking for types used in overloaded methods ("typecheck" typemap).
    • Output argument handling ("argout" typemap).
    • Input argument value checking ("check" typemap).
    • Input argument initialization ("arginit" typemap).
    • Default arguments ("default" typemap).
    • Input argument resource management ("freearg" typemap).

    Return value handling

    int foo(int x, double y, char *s);
    
    • Function return value conversion ("out" typemap).
    • Return value resource management ("ret" typemap).
    • Resource management for newly allocated objects ("newfree" typemap).

    Exception handling

    int foo(int x, double y, char *s) throw(MemoryError, IndexError);
    
    • Handling of C++ exception specifications. ("throw" typemap).

    Global variables

    int foo;
    
    • Assignment of a global variable. ("varin" typemap).
    • Reading a global variable. ("varout" typemap).

    Member variables

    struct Foo {
      int x[20];
    };
    
    • Assignment of data to a class/structure member. ("memberin" typemap).

    Constant creation

    #define FOO 3
    %constant int BAR = 42;
    enum { ALE, LAGER, STOUT };
    
    • Creation of constant values. ("consttab" or "constcode" typemap).

    Details of each of these typemaps will be covered shortly. Also, certain language modules may define additional typemaps that expand upon this list. For example, the Java module defines a variety of typemaps for controlling additional aspects of the Java bindings. Consult language specific documentation for further details.

    13.1.6 What can't be done with typemaps?

    Typemaps can't be used to define properties that apply to C/C++ declarations as a whole. For example, suppose you had a declaration like this,

    Foo *make_Foo(int n);
    

    and you wanted to tell SWIG that make_Foo(int n) returned a newly allocated object (for the purposes of providing better memory management). Clearly, this property of make_Foo(int n) is not a property that would be associated with the datatype Foo * by itself. Therefore, a completely different SWIG customization mechanism (%feature) is used for this purpose. Consult the Customization Features chapter for more information about that.

    Typemaps also can't be used to rearrange or transform the order of arguments. For example, if you had a function like this:

    void foo(int, char *);
    

    you can't use typemaps to interchange the arguments, allowing you to call the function like this:

    foo("hello", 3)          # Reversed arguments
    

    If you want to change the calling conventions of a function, write a helper function instead. For example:

    %rename(foo) wrap_foo;
    %inline %{
    void wrap_foo(char *s, int x) {
      foo(x, s);
    }
    %}
    

    13.1.7 Similarities to Aspect Oriented Programming

    SWIG has parallels to Aspect Oriented Software Development (AOP). The AOP terminology with respect to SWIG typemaps can be viewed as follows:

    • Cross-cutting concerns: The cross-cutting concerns are the modularization of the functionality that the typemaps implement, which is primarily marshalling of types from/to the target language and C/C++.
    • Advice: The typemap body contains code which is executed whenever the marshalling is required.
    • Pointcut: The pointcuts are the positions in the wrapper code that the typemap code is generated into.
    • Aspect: Aspects are the combination of the pointcut and the advice, hence each typemap is an aspect.

    SWIG can also be viewed as has having a second set of aspects based around %feature. Features such as %exception are also cross-cutting concerns as they encapsulate code that can be used to add logging or exception handling to any function.

    13.1.8 The rest of this chapter

    The rest of this chapter provides detailed information for people who want to write new typemaps. This information is of particular importance to anyone who intends to write a new SWIG target language module. Power users can also use this information to write application specific type conversion rules.

    Since typemaps are strongly tied to the underlying C++ type system, subsequent sections assume that you are reasonably familiar with the basic details of values, pointers, references, arrays, type qualifiers (e.g., const), structures, namespaces, templates, and memory management in C/C++. If not, you would be well-advised to consult a copy of "The C Programming Language" by Kernighan and Ritchie or "The C++ Programming Language" by Stroustrup before going any further.

    13.2 Typemap specifications

    This section describes the behavior of the %typemap directive itself.

    13.2.1 Defining a typemap

    New typemaps are defined using the %typemap declaration. The general form of this declaration is as follows (parts enclosed in [ ... ] are optional):

    %typemap(method [, modifiers]) typelist code ;
    

    method is a simply a name that specifies what kind of typemap is being defined. It is usually a name like "in", "out", or "argout". The purpose of these methods is described later.

    modifiers is an optional comma separated list of name="value" values. These are sometimes to attach extra information to a typemap and is often target-language dependent. They are also known as typemap attributes.

    typelist is a list of the C++ type patterns that the typemap will match. The general form of this list is as follows:

    typelist    :  typepattern [, typepattern, typepattern, ... ] ;
    
    typepattern :  type [ (parms) ]
                |  type name [ (parms) ]
                |  ( typelist ) [ (parms) ]
    
    

    Each type pattern is either a simple type, a simple type and argument name, or a list of types in the case of multi-argument typemaps. In addition, each type pattern can be parameterized with a list of temporary variables (parms). The purpose of these variables will be explained shortly.

    code specifies the code used in the typemap. Usually this is C/C++ code, but in the statically typed target languages, such as Java and C#, this can contain target language code for certain typemaps. It can take any one of the following forms:

    code       : { ... }
               | " ... "
               | %{ ... %}
    

    Note that the preprocessor will expand code within the {} delimiters, but not in the last two styles of delimiters, see Preprocessor and Typemaps. Here are some examples of valid typemap specifications:

    /* Simple typemap declarations */
    %typemap(in) int {
      $1 = PyInt_AsLong($input);
    }
    %typemap(in) int "$1 = PyInt_AsLong($input);";
    %typemap(in) int %{ 
      $1 = PyInt_AsLong($input);
    %}
    
    /* Typemap with extra argument name */
    %typemap(in) int nonnegative {
      ...
    }
    
    /* Multiple types in one typemap */
    %typemap(in) int, short, long { 
      $1 = SvIV($input);
    }
    
    /* Typemap with modifiers */
    %typemap(in, doc="integer") int "$1 = scm_to_int($input);";
    
    /* Typemap applied to patterns of multiple arguments */
    %typemap(in) (char *str, int len),
                 (char *buffer, int size)
    {
      $1 = PyString_AsString($input);
      $2 = PyString_Size($input);
    }
    
    /* Typemap with extra pattern parameters */
    %typemap(in, numinputs=0) int *output (int temp),
                              long *output (long temp)
    {
      $1 = &temp;
    }
    

    Admittedly, it's not the most readable syntax at first glance. However, the purpose of the individual pieces will become clear.

    13.2.2 Typemap scope

    Once defined, a typemap remains in effect for all of the declarations that follow. A typemap may be redefined for different sections of an input file. For example:

    // typemap1
    %typemap(in) int {
    ...
    }
    
    int fact(int);                    // typemap1
    int gcd(int x, int y);            // typemap1
    
    // typemap2
    %typemap(in) int {
    ...
    }
    
    int isprime(int);                 // typemap2
    

    One exception to the typemap scoping rules pertains to the %extend declaration. %extend is used to attach new declarations to a class or structure definition. Because of this, all of the declarations in an %extend block are subject to the typemap rules that are in effect at the point where the class itself is defined. For example:

    class Foo {
      ...
    };
    
    %typemap(in) int {
     ...
    }
    
    %extend Foo {
      int blah(int x);    // typemap has no effect.  Declaration is attached to Foo which
                          // appears before the %typemap declaration.
    };
    

    13.2.3 Copying a typemap

    A typemap is copied by using assignment. For example:

    %typemap(in) Integer = int;
    

    or this:

    %typemap(in) Integer, Number, int32_t = int;
    

    Types are often managed by a collection of different typemaps. For example:

    %typemap(in)     int { ... }
    %typemap(out)    int { ... }
    %typemap(varin)  int { ... }
    %typemap(varout) int { ... }
    

    To copy all of these typemaps to a new type, use %apply. For example:

    %apply int { Integer };            // Copy all int typemaps to Integer
    %apply int { Integer, Number };    // Copy all int typemaps to both Integer and Number
    

    The patterns for %apply follow the same rules as for %typemap. For example:

    %apply int *output { Integer *output };                    // Typemap with name
    %apply (char *buf, int len) { (char *buffer, int size) };  // Multiple arguments
    

    13.2.4 Deleting a typemap

    A particular typemap can be deleted / cleared by simply defining no code. For example:

    %typemap(in) int;                 // Clears the "in" typemap for int
    %typemap(in) int, long, short;    // Clears the "in" typemap for int, long, short
    %typemap(in) int *output;       
    

    The above syntax deletes a typemap for just one typemap method - the "in" method in each of the examples above. The %clear directive is more powerful and will delete / clear a family of typemaps, that is, all the typemap methods for a given type. For example:

    %clear int;                       // Delete all typemaps ("in", "out", "varin", ...) for int
    %clear int *output, long *output;
    

    Note: Since SWIG's default behavior is defined by typemaps, clearing a fundamental type like int will make that type unusable unless you also define a new family of typemaps immediately after the clear operation.

    13.2.5 Placement of typemaps

    Typemap declarations can be declared in the global scope, within a C++ namespace, and within a C++ class. For example:

    %typemap(in) int {
      ...
    }
    
    namespace std {
      class string;
      %typemap(in) string {
        ...
      }
    }
    
    class Bar {
    public:
      typedef const int & const_reference;
      %typemap(out) const_reference {
        ...
      }
    };
    

    When a typemap appears inside a namespace or class, it stays in effect until the end of the SWIG input (just like before). However, the typemap takes the local scope into account. Therefore, this code

    namespace std {
      class string;
      %typemap(in) string {
        ...
      }
    }
    

    is really defining a typemap for the type std::string. You could have code like this:

    namespace std {
      class string;
      %typemap(in) string {          /* std::string */
        ...
      }
    }
    
    namespace Foo {
      class string;
      %typemap(in) string {          /* Foo::string */
        ...
      }
    }
    

    In this case, there are two completely distinct typemaps that apply to two completely different types (std::string and Foo::string).

    It should be noted that for scoping to work, SWIG has to know that string is a typename defined within a particular namespace. In this example, this is done using the forward class declaration class string.

    13.3 Pattern matching rules

    The section describes the pattern matching rules by which C/C++ datatypes are associated with typemaps. The matching rules can be observed in practice by using the debugging options also described.

    13.3.1 Basic matching rules

    Typemaps are matched using both a type and a name (typically the name of a argument). For a given TYPE NAME pair, the following rules are applied, in order, to find a match. The first typemap found is used.

    • Typemaps that exactly match TYPE and NAME.
    • Typemaps that exactly match TYPE only.
    • If TYPE is a C++ template of type T< TPARMS >, where TPARMS are the template parameters, the type is stripped of the template parameters and the following checks are then made:
      • Typemaps that exactly match T and NAME.
      • Typemaps that exactly match T only.

    If TYPE includes qualifiers (const, volatile, etc.), each qualifier is stripped one at a time to form a new stripped type and the matching rules above are repeated on the stripped type. The left-most qualifier is stripped first, resulting in the right-most (or top-level) qualifier being stripped last. For example int const*const is first stripped to int *const then int *.

    If TYPE is an array. The following transformation is made:

    • Replace all dimensions to [ANY] and look for a generic array typemap.

    To illustrate, suppose that you had a function like this:

    int foo(const char *s);
    

    To find a typemap for the argument const char *s, SWIG will search for the following typemaps:

    const char *s           Exact type and name match
    const char *            Exact type match
    char *s                 Type and name match (qualifier stripped)
    char *                  Type match (qualifier stripped)
    

    When more than one typemap rule might be defined, only the first match found is actually used. Here is an example that shows how some of the basic rules are applied:

    %typemap(in) int *x {
      ... typemap 1
    }
    
    %typemap(in) int * {
      ... typemap 2
    }
    
    %typemap(in) const int *z {
      ... typemap 3
    }
    
    %typemap(in) int [4] {
      ... typemap 4
    }
    
    %typemap(in) int [ANY] {
      ... typemap 5
    }
    
    void A(int *x);        // int *x rule       (typemap 1)
    void B(int *y);        // int * rule        (typemap 2)
    void C(const int *x);  // int *x rule       (typemap 1)
    void D(const int *z);  // const int *z rule (typemap 3)
    void E(int x[4]);      // int [4] rule      (typemap 4)
    void F(int x[1000]);   // int [ANY] rule    (typemap 5)
    

    Compatibility note: SWIG-2.0.0 introduced stripping the qualifiers one step at a time. Prior versions stripped all qualifiers in one step.

    13.3.2 Typedef reductions matching

    If no match is found using the rules in the previous section, SWIG applies a typedef reduction to the type and repeats the typemap search for the reduced type. To illustrate, suppose you had code like this:

    %typemap(in) int {
      ... typemap 1
    }
    
    typedef int Integer;
    void blah(Integer x);
    

    To find the typemap for Integer x, SWIG will first search for the following typemaps:

    Integer x
    Integer
    

    Finding no match, it then applies a reduction Integer -> int to the type and repeats the search.

    int x
    int      --> match: typemap 1
    

    Even though two types might be the same via typedef, SWIG allows typemaps to be defined for each typename independently. This allows for interesting customization possibilities based solely on the typename itself. For example, you could write code like this:

    typedef double  pdouble;     // Positive double
    
    // typemap 1
    %typemap(in) double {
      ... get a double ...
    }
    // typemap 2
    %typemap(in) pdouble {
      ... get a positive double ...
    }
    double sin(double x);           // typemap 1
    pdouble sqrt(pdouble x);        // typemap 2
    

    When reducing the type, only one typedef reduction is applied at a time. The search process continues to apply reductions until a match is found or until no more reductions can be made.

    For complicated types, the reduction process can generate a long list of patterns. Consider the following:

    typedef int Integer;
    typedef Integer Row4[4];
    void foo(Row4 rows[10]);
    

    To find a match for the Row4 rows[10] argument, SWIG would check the following patterns, stopping only when it found a match:

    Row4 rows[10]
    Row4 [10]
    Row4 rows[ANY]
    Row4 [ANY]
    
    # Reduce Row4 --> Integer[4]
    Integer rows[10][4]
    Integer [10][4]
    Integer rows[ANY][ANY]
    Integer [ANY][ANY]
    
    # Reduce Integer --> int
    int rows[10][4]
    int [10][4]
    int rows[ANY][ANY]
    int [ANY][ANY]
    

    For parameterized types like templates, the situation is even more complicated. Suppose you had some declarations like this:

    typedef int Integer;
    typedef foo<Integer, Integer> fooii;
    void blah(fooii *x);
    

    In this case, the following typemap patterns are searched for the argument fooii *x:

    fooii *x
    fooii *
    
    # Reduce fooii --> foo<Integer, Integer>
    foo<Integer, Integer> *x
    foo<Integer, Integer> *
    
    # Reduce Integer -> int
    foo<int, Integer> *x
    foo<int, Integer> *
    
    # Reduce Integer -> int
    foo<int, int> *x
    foo<int, int> *
    

    Typemap reductions are always applied to the left-most type that appears. Only when no reductions can be made to the left-most type are reductions made to other parts of the type. This behavior means that you could define a typemap for foo<int, Integer>, but a typemap for foo<Integer, int> would never be matched. Admittedly, this is rather esoteric--there's little practical reason to write a typemap quite like that. Of course, you could rely on this to confuse your coworkers even more.

    As a point of clarification, it is worth emphasizing that typedef matching is a typedef reduction process only, that is, SWIG does not search for every single possible typedef. Given a type in a declaration, it will only reduce the type, it won't build it up looking for typedefs. For example, given the type Struct, the typemap below will not be used for the aStruct parameter, because Struct is fully reduced:

    struct Struct {...};
    typedef Struct StructTypedef;
    
    %typemap(in) StructTypedef { 
      ...
    }
    
    void go(Struct aStruct);
    

    13.3.3 Default typemap matching rules

    If the basic pattern matching rules result in no match being made, even after typedef reductions, the default typemap matching rules are used to look for a suitable typemap match. These rules match a generic typemap based on the reserved SWIGTYPE base type. For example pointers will use SWIGTYPE * and references will use SWIGTYPE &. More precisely, the rules are based on the C++ class template partial specialization matching rules used by C++ compilers when looking for an appropriate partial template specialization. This means that a match is chosen from the most specialized set of generic typemap types available. For example, when looking for a match to int const *, the rules will prefer to match SWIGTYPE const * if available before matching SWIGTYPE *, before matching SWIGTYPE.

    Most SWIG language modules use typemaps to define the default behavior of the C primitive types. This is entirely straightforward. For example, a set of typemaps for primitives marshalled by value or const reference are written like this:

    %typemap(in) int           "... convert to int ...";
    %typemap(in) short         "... convert to short ...";
    %typemap(in) float         "... convert to float ...";
    ...
    %typemap(in) const int &   "... convert ...";
    %typemap(in) const short & "... convert ...";
    %typemap(in) const float & "... convert ...";
    ...
    

    Since typemap matching follows all typedef declarations, any sort of type that is mapped to a primitive type by value or const reference through typedef will be picked up by one of these primitive typemaps. Most language modules also define typemaps for char pointers and char arrays to handle strings, so these non-default types will also be used in preference as the basic typemap matching rules provide a better match than the default typemap matching rules.

    Below is a list of the typical default types supplied by language modules, showing what the "in" typemap would look like:

    %typemap(in) SWIGTYPE &            { ... default reference handling ...                       };
    %typemap(in) SWIGTYPE *            { ... default pointer handling ...                         };
    %typemap(in) SWIGTYPE *const       { ... default pointer const handling ...                   };
    %typemap(in) SWIGTYPE *const&      { ... default pointer const reference handling ...         };
    %typemap(in) SWIGTYPE[ANY]         { ... 1D fixed size arrays handling ...                    };
    %typemap(in) SWIGTYPE []           { ... unknown sized array handling ...                     };
    %typemap(in) enum SWIGTYPE         { ... default handling for enum values ...                 };
    %typemap(in) const enum SWIGTYPE & { ... default handling for const enum reference values ... };
    %typemap(in) SWIGTYPE (CLASS::*)   { ... default pointer member handling ...                  };
    %typemap(in) SWIGTYPE              { ... simple default handling ...                          };
    

    If you wanted to change SWIG's default handling for simple pointers, you would simply redefine the rule for SWIGTYPE *. Note, the simple default typemap rule is used to match against simple types that don't match any other rules:

    %typemap(in) SWIGTYPE              { ... simple default handling ...                          } 
    

    This typemap is important because it is the rule that gets triggered when call or return by value is used. For instance, if you have a declaration like this:

    double dot_product(Vector a, Vector b);
    

    The Vector type will usually just get matched against SWIGTYPE. The default implementation of SWIGTYPE is to convert the value into pointers (as described in this earlier section).

    By redefining SWIGTYPE it may be possible to implement other behavior. For example, if you cleared all typemaps for SWIGTYPE, SWIG simply won't wrap any unknown datatype (which might be useful for debugging). Alternatively, you might modify SWIGTYPE to marshal objects into strings instead of converting them to pointers.

    Let's consider an example where the following typemaps are defined and SWIG is looking for the best match for the enum shown below:

    %typemap(in) const Hello &          { ... }
    %typemap(in) const enum SWIGTYPE &  { ... }
    %typemap(in) enum SWIGTYPE &        { ... }
    %typemap(in) SWIGTYPE &             { ... }
    %typemap(in) SWIGTYPE               { ... }
    
    enum Hello {};
    const Hello &hi;
    

    The typemap at the top of the list will be chosen, not because it is defined first, but because it is the closest match for the type being wrapped. If any of the typemaps in the above list were not defined, then the next one on the list would have precedence.

    The best way to explore the default typemaps is to look at the ones already defined for a particular language module. Typemap definitions are usually found in the SWIG library in a file such as java.swg , csharp.swg etc. However, for many of the target languages the typemaps are hidden behind complicated macros, so the best way to view the default typemaps, or any typemaps for that matter, is to look at the preprocessed output by running swig -E on any interface file. Finally the best way to view the typemap matching rules in action is via the debugging typemap pattern matching options covered later on.

    Compatibility note: The default typemap matching rules were modified in SWIG-2.0.0 from a slightly simpler scheme to match the current C++ class template partial specialization matching rules.

    13.3.4 Multi-arguments typemaps

    When multi-argument typemaps are specified, they take precedence over any typemaps specified for a single type. For example:

    %typemap(in) (char *buffer, int len) {
      // typemap 1
    }
    
    %typemap(in) char *buffer {
      // typemap 2
    }
    
    void foo(char *buffer, int len, int count); // (char *buffer, int len)
    void bar(char *buffer, int blah);           // char *buffer
    

    Multi-argument typemaps are also more restrictive in the way that they are matched. Currently, the first argument follows the matching rules described in the previous section, but all subsequent arguments must match exactly.

    13.3.5 Matching rules compared to C++ templates

    For those intimately familiar with C++ templates, a comparison of the typemap matching rules and template type deduction is interesting. The two areas considered are firstly the default typemaps and their similarities to partial template specialization and secondly, non-default typemaps and their similarities to full template specialization.

    For default (SWIGTYPE) typemaps the rules are inspired by C++ class template partial specialization. For example, given partial specialization for T const& :

    template <typename T> struct X             { void a(); };
    template <typename T> struct X< T const& > { void b(); };
    

    The full (unspecialized) template is matched with most types, such as:

    X< int & >            x1;  x1.a();
    

    and the following all match the T const& partial specialization:

    X< int *const& >      x2;  x2.b();
    X< int const*const& > x3;  x3.b();
    X< int const& >       x4;  x4.b();
    

    Now, given just these two default typemaps, where T is analogous to SWIGTYPE:

    %typemap(...) SWIGTYPE        { ... }
    %typemap(...) SWIGTYPE const& { ... }
    

    The generic default typemap SWIGTYPE is used with most types, such as

    int &
    

    and the following all match the SWIGTYPE const& typemap, just like the partial template matching:

    int *const&
    int const*const&
    int const&
    

    Note that the template and typemap matching rules are not identical for all default typemaps though, for example, with arrays.

    For non-default typemaps, one might expect SWIG to follow the fully specialized template rules. This is nearly the case, but not quite. Consider a very similar example to the earlier partially specialized template but this time there is a fully specialized template:

    template <typename T> struct Y       { void a(); };
    template <> struct Y< int const & >  { void b(); };
    

    Only the one type matches the specialized template exactly:

    Y< int & >             y1;  y1.a();
    Y< int *const& >       y2;  y2.a();
    Y< int const *const& > y3;  y3.a();
    Y< int const& >        y4;  y4.b(); // fully specialized match
    

    Given typemaps with the same types used for the template declared above, where T is again analogous to SWIGTYPE:

    %typemap(...) SWIGTYPE        { ... }
    %typemap(...) int const&      { ... }
    

    The comparison between non-default typemaps and fully specialized single parameter templates turns out to be the same, as just the one type will match the non-default typemap:

    int &
    int *const&
    int const*const&
    int const&        // matches non-default typemap int const&
    

    However, if a non-const type is used instead:

    %typemap(...) SWIGTYPE        { ... }
    %typemap(...) int &           { ... }
    

    then there is a clear difference to template matching as both the const and non-const types match the typemap:

    int &             // matches non-default typemap int &
    int *const&
    int const*const&
    int const&        // matches non-default typemap int &
    

    There are other subtle differences such as typedef handling, but at least it should be clear that the typemap matching rules are similar to those for specialized template handling.

    13.3.6 Debugging typemap pattern matching

    There are two useful debug command line options available for debugging typemaps, -debug-tmsearch and -debug-tmused .

    The -debug-tmsearch option is a verbose option for debugging typemap searches. This can be very useful for watching the pattern matching process in action and for debugging which typemaps are used. The option displays all the typemaps and types that are looked for until a successful pattern match is made. As the display includes searches for each and every type needed for wrapping, the amount of information displayed can be large. Normally you would manually search through the displayed information for the particular type that you are interested in.

    For example, consider some of the code used in the Typedef reductions section already covered:

    typedef int Integer;
    typedef Integer Row4[4];
    void foo(Row4 rows[10]);
    

    A sample of the debugging output is shown below for the "in" typemap:

    swig -perl -debug-tmsearch example.i
    ...
    example.h:3: Searching for a suitable 'in' typemap for: Row4 rows[10]
      Looking for: Row4 rows[10]
      Looking for: Row4 [10]
      Looking for: Row4 rows[ANY]
      Looking for: Row4 [ANY]
      Looking for: Integer rows[10][4]
      Looking for: Integer [10][4]
      Looking for: Integer rows[ANY][ANY]
      Looking for: Integer [ANY][ANY]
      Looking for: int rows[10][4]
      Looking for: int [10][4]
      Looking for: int rows[ANY][ANY]
      Looking for: int [ANY][ANY]
      Looking for: SWIGTYPE rows[ANY][ANY]
      Looking for: SWIGTYPE [ANY][ANY]
      Looking for: SWIGTYPE rows[ANY][]
      Looking for: SWIGTYPE [ANY][]
      Looking for: SWIGTYPE *rows[ANY]
      Looking for: SWIGTYPE *[ANY]
      Looking for: SWIGTYPE rows[ANY]
      Looking for: SWIGTYPE [ANY]
      Looking for: SWIGTYPE rows[]
      Looking for: SWIGTYPE []
      Using: %typemap(in) SWIGTYPE []
    ...
    

    showing that the best default match supplied by SWIG is the SWIGTYPE [] typemap. As the example shows, the successful match displays the used typemap source including typemap method, type and optional name in one of these simplified formats:

    • Using: %typemap(method) type name
    • Using: %typemap(method) type name = type2 name2
    • Using: %apply type2 name2 { type name }

    This information might meet your debugging needs, however, you might want to analyze further. If you next invoke SWIG with the -E option to display the preprocessed output, and search for the particular typemap used, you'll find the full typemap contents (example shown below for Python):

    %typemap(in, noblock=1) SWIGTYPE [] (void *argp = 0, int res = 0) {
      res = SWIG_ConvertPtr($input, &argp, $descriptor, $disown |  0 );
      if (!SWIG_IsOK(res)) { 
        SWIG_exception_fail(SWIG_ArgError(res), "in method '" "$symname" "', argument "
                           "$argnum"" of type '" "$type""'"); 
      } 
      $1 = ($ltype)(argp);
    }
    

    The generated code for the foo wrapper will then contain the snippets of the typemap with the special variables expanded. The rest of this chapter will need reading though to fully understand all of this, however, the relevant parts of the generated code for the above typemap can be seen below:

    SWIGINTERN PyObject *_wrap_foo(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
    ...
      void *argp1 = 0 ;
      int res1 = 0 ;
    ...
      res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_a_4__int, 0 |  0 );
      if (!SWIG_IsOK(res1)) {
        SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "foo" "', argument "
                           "1"" of type '" "int [10][4]""'"); 
      } 
      arg1 = (int (*)[4])(argp1);
    ...
    }
    

    Searches for multi-argument typemaps are not mentioned unless a matching multi-argument typemap does actually exist. For example, the output for the code in the earlier multi-arguments section is as follows:

    ...
    example.h:39: Searching for a suitable 'in' typemap for: char *buffer
      Looking for: char *buffer
      Multi-argument typemap found...
      Using: %typemap(in) (char *buffer, int len)
    ...
    

    The second option for debugging is -debug-tmused and this displays the typemaps used. This option is a less verbose version of the -debug-tmsearch option as it only displays each successfully found typemap on a separate single line. The output displays the type, and name if present, the typemap method in brackets and then the actual typemap used in the same simplified format output by the -debug-tmsearch option. Below is the output for the example code at the start of this section on debugging.

    $ swig -perl -debug-tmused example.i
    example.h:3: Typemap for Row4 rows[10] (in) : %typemap(in) SWIGTYPE []
    example.h:3: Typemap for Row4 rows[10] (typecheck) : %typemap(typecheck) SWIGTYPE *
    example.h:3: Typemap for Row4 rows[10] (freearg) : %typemap(freearg) SWIGTYPE []
    example.h:3: Typemap for void foo (out) : %typemap(out) void
    

    Now, consider the following interface file:

    %module example
    
    %{
    void set_value(const char* val) {}
    %}
    
    %typemap(check) char *NON_NULL {
      if (!$1) {
        /* ... error handling ... */
      }
    }
    
    // use default pointer handling instead of strings
    %apply SWIGTYPE * { const char* val, const char* another_value }
    
    %typemap(check) const char* val = char* NON_NULL;
    
    %typemap(arginit, noblock=1) const char* val {
      $1 = "";
    }
    
    void set_value(const char* val);
    
    

    and the output debug:

    swig -perl5 -debug-tmused example.i
    example.i:21: Typemap for char const *val (arginit) : %typemap(arginit) char const *val
    example.i:21: Typemap for char const *val (in) : %apply SWIGTYPE * { char const *val }
    example.i:21: Typemap for char const *val (typecheck) : %apply SWIGTYPE * { char const *val }
    example.i:21: Typemap for char const *val (check) : %typemap(check) char const *val = char *NON_NULL
    example.i:21: Typemap for char const *val (freearg) : %apply SWIGTYPE * { char const *val }
    example.i:21: Typemap for void set_value (out) : %typemap(out) void
    

    The following observations about what is displayed can be noted (the same applies for -debug-tmsearch):

    • The relevant typemap is shown, but for typemap copying, the appropriate %typemap or %apply is displayed, for example, the "check" and "in" typemaps.
    • The typemap modifiers are not shown, eg the noblock=1 modifier in the "arginit" typemap.
    • The exact %apply statement might look different to what is in the actual code. For example, the const char* another_value is not shown as it is not relevant here. Also the types may be displayed slightly differently - char const * and not const char*.

    13.4 Code generation rules

    This section describes rules by which typemap code is inserted into the generated wrapper code.

    13.4.1 Scope

    When a typemap is defined like this:

    %typemap(in) int {
      $1 = PyInt_AsLong($input);
    }
    

    the typemap code is inserted into the wrapper function using a new block scope. In other words, the wrapper code will look like this:

    wrap_whatever() {
      ...
      // Typemap code
      {
        arg1 = PyInt_AsLong(obj1);
      }
      ...
    }
    

    Because the typemap code is enclosed in its own block, it is legal to declare temporary variables for use during typemap execution. For example:

    %typemap(in) short {
      long temp;          /* Temporary value */
      if (Tcl_GetLongFromObj(interp, $input, &temp) != TCL_OK) {
        return TCL_ERROR;
      }
      $1 = (short) temp;
    }
    

    Of course, any variables that you declare inside a typemap are destroyed as soon as the typemap code has executed (they are not visible to other parts of the wrapper function or other typemaps that might use the same variable names).

    Occasionally, typemap code will be specified using a few alternative forms. For example:

    %typemap(in) int "$1 = PyInt_AsLong($input);";
    %typemap(in) int %{
    $1 = PyInt_AsLong($input);
    %}
    %typemap(in, noblock=1) int {
    $1 = PyInt_AsLong($input);
    }
    

    These three forms are mainly used for cosmetics--the specified code is not enclosed inside a block scope when it is emitted. This sometimes results in a less complicated looking wrapper function. Note that only the third of the three typemaps have the typemap code passed through the SWIG preprocessor.

    13.4.2 Declaring new local variables

    Sometimes it is useful to declare a new local variable that exists within the scope of the entire wrapper function. A good example of this might be an application in which you wanted to marshal strings. Suppose you had a C++ function like this

    int foo(std::string *s);
    

    and you wanted to pass a native string in the target language as an argument. For instance, in Perl, you wanted the function to work like this:

    $x = foo("Hello World");
    

    To do this, you can't just pass a raw Perl string as the std::string * argument. Instead, you have to create a temporary std::string object, copy the Perl string data into it, and then pass a pointer to the object. To do this, simply specify the typemap with an extra parameter like this:

    %typemap(in) std::string * (std::string temp) {
      unsigned int len;
      char        *s;
      s = SvPV($input, len);         /* Extract string data */
      temp.assign(s, len);           /* Assign to temp */
      $1 = &temp;                   /* Set argument to point to temp */
    }
    

    In this case, temp becomes a local variable in the scope of the entire wrapper function. For example:

    wrap_foo() {
      std::string temp;    <--- Declaration of temp goes here
      ...
    
      /* Typemap code */
      {
        ...
        temp.assign(s, len);
        ...
      }
      ...
    }
    

    When you set temp to a value, it persists for the duration of the wrapper function and gets cleaned up automatically on exit.

    It is perfectly safe to use more than one typemap involving local variables in the same declaration. For example, you could declare a function as :

    void foo(std::string *x, std::string *y, std::string *z);
    

    This is safely handled because SWIG actually renames all local variable references by appending an argument number suffix. Therefore, the generated code would actually look like this:

    wrap_foo() {
      int *arg1;    /* Actual arguments */
      int *arg2;
      int *arg3;
      std::string temp1;    /* Locals declared in the typemap */
      std::string temp2;
      std::string temp3;
      ...
      {
        char *s;
        unsigned int len;
        ...
        temp1.assign(s, len);
        arg1 = *temp1;
      }
      {
        char *s;
        unsigned int len;
        ...
        temp2.assign(s, len);
        arg2 = &temp2;
      }
      {
        char *s;
        unsigned int len;
        ...
        temp3.assign(s, len);
        arg3 = &temp3;
      }
      ...
    }
    

    There is an exception: if the variable name starts with the _global_ prefix, the argument number is not appended. Such variables can be used throughout the generated wrapper function. For example, the above typemap could be rewritten to use _global_temp instead of temp and the generated code would then contain a single _global_temp variable instead of temp1, temp2 and temp3:

    %typemap(in) std::string * (std::string _global_temp) {
     ... as above ...
    }
    

    Some typemaps do not recognize local variables (or they may simply not apply). At this time, only typemaps that apply to argument conversion support this (input typemaps such as the "in" typemap).

    Note:

    When declaring a typemap for multiple types, each type must have its own local variable declaration.

    %typemap(in) const std::string *, std::string * (std::string temp) // NO!
    // only std::string * has a local variable
    // const std::string * does not (oops)
    ....
    
    %typemap(in) const std::string * (std::string temp), std::string * (std::string temp) // Correct
    ....
    

    13.4.3 Special variables

    Within all typemaps, the following special variables are expanded. This is by no means a complete list as some target languages have additional special variables which are documented in the language specific chapters.

    VariableMeaning
    $n A C local variable corresponding to type n in the typemap pattern.
    $argnumArgument number. Only available in typemaps related to argument conversion
    $n_nameArgument name
    $n_typeReal C datatype of type n.
    $n_ltypeltype of type n
    $n_mangleMangled form of type n. For example _p_Foo
    $n_descriptorType descriptor structure for type n. For example SWIGTYPE_p_Foo. This is primarily used when interacting with the run-time type checker (described later).
    $*n_typeReal C datatype of type n with one pointer removed.
    $*n_ltypeltype of type n with one pointer removed.
    $*n_mangleMangled form of type n with one pointer removed.
    $*n_descriptorType descriptor structure for type n with one pointer removed.
    $&n_typeReal C datatype of type n with one pointer added.
    $&n_ltypeltype of type n with one pointer added.
    $&n_mangleMangled form of type n with one pointer added.
    $&n_descriptorType descriptor structure for type n with one pointer added.
    $n_basetypeBase typename with all pointers and qualifiers stripped.

    Within the table, $n refers to a specific type within the typemap specification. For example, if you write this

    %typemap(in) int *INPUT {
    
    }
    

    then $1 refers to int *INPUT. If you have a typemap like this,

    %typemap(in) (int argc, char *argv[]) {
      ...
    }
    

    then $1 refers to int argc and $2 refers to char *argv[].

    Substitutions related to types and names always fill in values from the actual code that was matched. This is useful when a typemap might match multiple C datatype. For example:

    %typemap(in)  int, short, long {
      $1 = ($1_ltype) PyInt_AsLong($input);
    }
    

    In this case, $1_ltype is replaced with the datatype that is actually matched.

    When typemap code is emitted, the C/C++ datatype of the special variables $1 and $2 is always an "ltype." An "ltype" is simply a type that can legally appear on the left-hand side of a C assignment operation. Here are a few examples of types and ltypes:

    type              ltype
    ------            ----------------
    int               int
    const int         int
    const int *       int *
    int [4]           int *
    int [4][5]        int (*)[5]
    

    In most cases a ltype is simply the C datatype with qualifiers stripped off. In addition, arrays are converted into pointers.

    Variables such as $&1_type and $*1_type are used to safely modify the type by removing or adding pointers. Although not needed in most typemaps, these substitutions are sometimes needed to properly work with typemaps that convert values between pointers and values.

    If necessary, type related substitutions can also be used when declaring locals. For example:

    %typemap(in) int * ($*1_type temp) {
      temp = PyInt_AsLong($input);
      $1 = &temp;
    }
    

    There is one word of caution about declaring local variables in this manner. If you declare a local variable using a type substitution such as $1_ltype temp, it won't work like you expect for arrays and certain kinds of pointers. For example, if you wrote this,

    %typemap(in) int [10][20] {
      $1_ltype temp;
    }
    

    then the declaration of temp will be expanded as

    int (*)[20] temp;
    

    This is illegal C syntax and won't compile. There is currently no straightforward way to work around this problem in SWIG due to the way that typemap code is expanded and processed. However, one possible workaround is to simply pick an alternative type such as void * and use casts to get the correct type when needed. For example:

    %typemap(in) int [10][20] {
      void *temp;
      ...
      (($1_ltype) temp)[i][j] = x;    /* set a value */
      ...
    }
    

    Another approach, which only works for arrays is to use the $1_basetype substitution. For example:

    %typemap(in) int [10][20] {
      $1_basetype temp[10][20];
      ...
      temp[i][j] = x;    /* set a value */
      ...
    }
    

    13.4.4 Special variable macros

    Special variable macros are like macro functions in that they take one or more input arguments which are used for the macro expansion. They look like macro/function calls but use the special variable $ prefix to the macro name. Note that unlike normal macros, the expansion is not done by the preprocessor, it is done during the SWIG parsing/compilation stages. The following special variable macros are available across all language modules.

    13.4.4.1 $descriptor(type)

    This macro expands into the type descriptor structure for any C/C++ type specified in type. It behaves like the $1_descriptor special variable described above except that the type to expand is taken from the macro argument rather than inferred from the typemap type. For example, $descriptor(std::vector<int> *) will expand into SWIGTYPE_p_std__vectorT_int_t. This macro is mostly used in the scripting target languages and is demonstrated later in the Run-time type checker usage section.

    13.4.4.2 $typemap(method, typepattern)

    This macro uses the pattern matching rules described earlier to lookup and then substitute the special variable macro with the code in the matched typemap. The typemap to search for is specified by the arguments, where method is the typemap method name and typepattern is a type pattern as per the %typemap specification in the Defining a typemap section.

    The special variables within the matched typemap are expanded into those for the matched typemap type, not the typemap within which the macro is called. In practice, there is little use for this macro in the scripting target languages. It is mostly used in the target languages that are statically typed as a way to obtain the target language type given the C/C++ type and more commonly only when the C++ type is a template parameter.

    The example below is for C# only and uses some typemap method names documented in the C# chapter, but it shows some of the possible syntax variations.

    %typemap(cstype) unsigned long    "uint"
    %typemap(cstype) unsigned long bb "bool"
    %typemap(cscode) BarClass %{
      void foo($typemap(cstype, unsigned long aa) var1,
               $typemap(cstype, unsigned long bb) var2,
               $typemap(cstype, (unsigned long bb)) var3,
               $typemap(cstype, unsigned long) var4)
      {
        // do something
      }
    %}
    

    The result is the following expansion

    %typemap(cstype) unsigned long    "uint"
    %typemap(cstype) unsigned long bb "bool"
    %typemap(cscode) BarClass %{
      void foo(uint var1,
               bool var2,
               bool var3,
               uint var4)
      {
        // do something
      }
    %}
    

    13.4.5 Special variables and typemap attributes

    As of SWIG-3.0.7 typemap attributes will also expand special variables and special variable macros.

    Example usage showing the expansion in the 'out' attribute (C# specific) as well as the main typemap body:

    %typemap(ctype, out="$*1_ltype") unsigned int& "$*1_ltype"
    

    is equivalent to the following as $*1_ltype expands to unsigned int:

    %typemap(ctype, out="unsigned int") unsigned int& "unsigned int"
    

    13.4.6 Special variables combined with special variable macros

    Special variables can also be used within special variable macros. The special variables are expanded before they are used in the special variable macros.

    Consider the following C# typemaps:

    %typemap(cstype) unsigned int "uint"
    %typemap(cstype, out="$typemap(cstype, $*1_ltype)") unsigned int& "$typemap(cstype, $*1_ltype)"
    

    Special variables are expanded first and hence the above is equivalent to:

    %typemap(cstype) unsigned int "uint"
    %typemap(cstype, out="$typemap(cstype, unsigned int)") unsigned int& "$typemap(cstype, unsigned int)"
    

    which then expands to:

    %typemap(cstype) unsigned int "uint"
    %typemap(cstype, out="uint") unsigned int& "uint"
    

    13.5 Common typemap methods

    The family of typemaps recognized by a language module may vary. However, the following typemap methods are nearly universal:

    13.5.1 "in" typemap

    The "in" typemap is used to convert function arguments from the target language to C. For example:

    %typemap(in) int {
      $1 = PyInt_AsLong($input);
    }
    

    The following special variables are available:

    $input            - Input object holding value to be converted.
    $symname          - Name of function/method being wrapped
    

    This is probably the most commonly redefined typemap because it can be used to implement customized conversions.

    In addition, the "in" typemap allows the number of converted arguments to be specified. The numinputs attributes facilitates this. For example:

    // Ignored argument.
    %typemap(in, numinputs=0) int *out (int temp) {
      $1 = &temp;
    }
    

    At this time, only zero or one arguments may be converted. When numinputs is set to 0, the argument is effectively ignored and cannot be supplied from the target language. The argument is still required when making the C/C++ call and the above typemap shows the value used is instead obtained from a locally declared variable called temp. Usually numinputs is not specified, whereupon the default value is 1, that is, there is a one to one mapping of the number of arguments when used from the target language to the C/C++ call. Multi-argument typemaps provide a similar concept where the number of arguments mapped from the target language to C/C++ can be changed for multiple adjacent C/C++ arguments.

    Compatibility note: Specifying numinputs=0 is the same as the old "ignore" typemap.

    13.5.2 "typecheck" typemap

    The "typecheck" typemap is used to support overloaded functions and methods. It merely checks an argument to see whether or not it matches a specific type. For example:

    %typemap(typecheck, precedence=SWIG_TYPECHECK_INTEGER) int {
      $1 = PyInt_Check($input) ? 1 : 0;
    }
    

    For typechecking, the $1 variable is always a simple integer that is set to 1 or 0 depending on whether or not the input argument is the correct type. Set to 1 if the input argument is the correct type otherwise set to 0.

    If you define new "in" typemaps and your program uses overloaded methods, you should also define a collection of "typecheck" typemaps. More details about this follow in the Typemaps and overloading section.

    13.5.3 "out" typemap

    The "out" typemap is used to convert function/method return values from C into the target language. For example:

    %typemap(out) int {
      $result = PyInt_FromLong($1);
    }
    

    The following special variables are available.

    $result           - Result object returned to target language.
    $symname          - Name of function/method being wrapped
    

    The "out" typemap supports an optional attribute flag called "optimal". This is for code optimisation and is detailed in the Optimal code generation when returning by value section.

    13.5.4 "arginit" typemap

    The "arginit" typemap is used to set the initial value of a function argument--before any conversion has occurred. This is not normally necessary, but might be useful in highly specialized applications. For example:

    // Set argument to NULL before any conversion occurs
    %typemap(arginit) int *data {
      $1 = NULL;
    }
    

    13.5.5 "default" typemap

    The "default" typemap is used to turn an argument into a default argument. For example:

    %typemap(default) int flags {
      $1 = DEFAULT_FLAGS;
    }
    ...
    int foo(int x, int y, int flags);
    

    The primary use of this typemap is to either change the wrapping of default arguments or specify a default argument in a language where they aren't supported (like C). Target languages that do not support optional arguments, such as Java and C#, effectively ignore the value specified by this typemap as all arguments must be given.

    Once a default typemap has been applied to an argument, all arguments that follow must have default values. See the Default/optional arguments section for further information on default argument wrapping.

    13.5.6 "check" typemap

    The "check" typemap is used to supply value checking code during argument conversion. The typemap is applied after arguments have been converted. For example:

    %typemap(check) int positive {
      if ($1 <= 0) {
        SWIG_exception(SWIG_ValueError, "Expected positive value.");
      }
    }
    

    13.5.7 "argout" typemap

    The "argout" typemap is used to return values from arguments. This is most commonly used to write wrappers for C/C++ functions that need to return multiple values. The "argout" typemap is almost always combined with an "in" typemap---possibly to ignore the input value. For example:

    /* Set the input argument to point to a temporary variable */
    %typemap(in, numinputs=0) int *out (int temp) {
      $1 = &temp;
    }
    
    %typemap(argout) int *out {
      // Append output value $1 to $result
      ...
    }
    

    The following special variables are available.

    $result           - Result object returned to target language.
    $input            - The original input object passed.
    $symname          - Name of function/method being wrapped
    

    The code supplied to the "argout" typemap is always placed after the "out" typemap. If multiple return values are used, the extra return values are often appended to return value of the function.

    See the typemaps.i library file for examples.

    13.5.8 "freearg" typemap

    The "freearg" typemap is used to cleanup argument data. It is only used when an argument might have allocated resources that need to be cleaned up when the wrapper function exits. The "freearg" typemap usually cleans up argument resources allocated by the "in" typemap. For example:

    // Get a list of integers
    %typemap(in) int *items {
      int nitems = Length($input);
      $1 = (int *) malloc(sizeof(int)*nitems);
    }
    // Free the list 
    %typemap(freearg) int *items {
      free($1);
    }
    

    The "freearg" typemap inserted at the end of the wrapper function, just before control is returned back to the target language. This code is also placed into a special variable $cleanup that may be used in other typemaps whenever a wrapper function needs to abort prematurely.

    13.5.9 "newfree" typemap

    The "newfree" typemap is used in conjunction with the %newobject directive and is used to deallocate memory used by the return result of a function. For example:

    %typemap(newfree) string * {
      delete $1;
    }
    %typemap(out) string * {
      $result = PyString_FromString($1->c_str());
    }
    ...
    
    %newobject foo;
    ...
    string *foo();
    

    See Object ownership and %newobject for further details.

    13.5.10 "ret" typemap

    The "ret" typemap is not used very often, but can be useful for anything associated with the return type, such as resource management, return value error checking, etc. Usually this can all be done in the "out" typemap, but sometimes it is handy to use the "out" typemap code untouched and add to the generated code using the code in the "ret" typemap. One such case is memory clean up. For example, a stringheap_t type is defined indicating that the returned memory must be deleted and a string_t type is defined indicating that the returned memory must not be deleted.

    %typemap(ret) stringheap_t %{
      free($1);
    %}
    
    typedef char * string_t;
    typedef char * stringheap_t;
    
    string_t MakeString1();
    stringheap_t MakeString2();
    

    The "ret" typemap above will only be used for MakeString2, but both functions will use the default "out" typemap for char * provided by SWIG. The code above would ensure the appropriate memory is freed in all target languages as the need to provide custom "out" typemaps (which involve target language specific code) is not necessary.

    This approach is an alternative to using the "newfree" typemap and %newobject as there is no need to list all the functions that require the memory cleanup, it is purely done on types.

    13.5.11 "memberin" typemap

    The "memberin" typemap is used to copy data from an already converted input value into a structure member. It is typically used to handle array members and other special cases. For example:

    %typemap(memberin) int [4] {
      memmove($1, $input, 4*sizeof(int));
    }
    

    It is rarely necessary to write "memberin" typemaps---SWIG already provides a default implementation for arrays, strings, and other objects.

    13.5.12 "varin" typemap

    The "varin" typemap is used to convert objects in the target language to C for the purposes of assigning to a C/C++ global variable. This is implementation specific.

    13.5.13 "varout" typemap

    The "varout" typemap is used to convert a C/C++ object to an object in the target language when reading a C/C++ global variable. This is implementation specific.

    13.5.14 "throws" typemap

    The "throws" typemap is only used when SWIG parses a C++ method with an exception specification or has the %catches feature attached to the method (see Exception handling with %catches). It provides a default mechanism for handling C++ methods that have declared the exceptions they will throw. The purpose of this typemap is to convert a C++ exception into an error or exception in the target language. It is slightly different to the other typemaps as it is based around the exception type rather than the type of a parameter or variable. For example:

    %typemap(throws) const char * %{
      PyErr_SetString(PyExc_RuntimeError, $1);
      SWIG_fail;
    %}
    
    // Either an exception specification on the method
      void bar() throw (const char *);
    
    // Or a %catches feature attached to the method
      %catches(const char *) bar();
      void bar();
    

    As can be seen from the resulting generated code below, SWIG generates an exception handler when wrapping the bar function with the catch block comprising the "throws" typemap content.

    ...
    try {
      bar();
    } catch(char const *_e) {
      PyErr_SetString(PyExc_RuntimeError, _e);
      SWIG_fail;
    }
    ...
    

    Note that if your methods do not have an exception specification but they do throw exceptions and you are not using %catches, SWIG cannot know how to deal with them. Please also see the Exception handling with %exception section for another way to handle exceptions.

    13.6 Some typemap examples

    This section contains a few examples. Consult language module documentation for more examples.

    13.6.1 Typemaps for arrays

    A common use of typemaps is to provide support for C arrays appearing both as arguments to functions and as structure members.

    For example, suppose you had a function like this:

    void set_vector(int type, float value[4]);
    

    If you wanted to handle float value[4] as a list of floats, you might write a typemap similar to this:

    
    %typemap(in) float value[4] (float temp[4]) {
      int i;
      if (!PySequence_Check($input)) {
        PyErr_SetString(PyExc_ValueError, "Expected a sequence");
        SWIG_fail;
      }
      if (PySequence_Length($input) != 4) {
        PyErr_SetString(PyExc_ValueError, "Size mismatch. Expected 4 elements");
        SWIG_fail;
      }
      for (i = 0; i < 4; i++) {
        PyObject *o = PySequence_GetItem($input, i);
        if (PyNumber_Check(o)) {
          temp[i] = (float) PyFloat_AsDouble(o);
        } else {
          PyErr_SetString(PyExc_ValueError, "Sequence elements must be numbers");      
          SWIG_fail;
        }
      }
      $1 = temp;
    }
    

    In this example, the variable temp allocates a small array on the C stack. The typemap then populates this array and passes it to the underlying C function.

    When used from Python, the typemap allows the following type of function call:

    >>> set_vector(type, [ 1, 2.5, 5, 20 ])
    

    If you wanted to generalize the typemap to apply to arrays of all dimensions you might write this:

    %typemap(in) float value[ANY] (float temp[$1_dim0]) {
      int i;
      if (!PySequence_Check($input)) {
        PyErr_SetString(PyExc_ValueError, "Expected a sequence");
        SWIG_fail;
      }
      if (PySequence_Length($input) != $1_dim0) {
        PyErr_SetString(PyExc_ValueError, "Size mismatch. Expected $1_dim0 elements");
        SWIG_fail;
      }
      for (i = 0; i < $1_dim0; i++) {
        PyObject *o = PySequence_GetItem($input, i);
        if (PyNumber_Check(o)) {
          temp[i] = (float) PyFloat_AsDouble(o);
        } else {
          PyErr_SetString(PyExc_ValueError, "Sequence elements must be numbers");      
          SWIG_fail;
        }
      }
      $1 = temp;
    }
    

    In this example, the special variable $1_dim0 is expanded with the actual array dimensions. Multidimensional arrays can be matched in a similar manner. For example:

    %typemap(in) float matrix[ANY][ANY] (float temp[$1_dim0][$1_dim1]) {
      ... convert a 2d array ...
    }
    

    For large arrays, it may be impractical to allocate storage on the stack using a temporary variable as shown. To work with heap allocated data, the following technique can be used.

    %typemap(in) float value[ANY] {
      int i;
      if (!PySequence_Check($input)) {
        PyErr_SetString(PyExc_ValueError, "Expected a sequence");
        SWIG_fail;
      }
      if (PySequence_Length($input) != $1_dim0) {
        PyErr_SetString(PyExc_ValueError, "Size mismatch. Expected $1_dim0 elements");
        SWIG_fail;
      }
      $1 = (float *) malloc($1_dim0*sizeof(float));
      for (i = 0; i < $1_dim0; i++) {
        PyObject *o = PySequence_GetItem($input, i);
        if (PyNumber_Check(o)) {
          $1[i] = (float) PyFloat_AsDouble(o);
        } else {
          free($1);
          PyErr_SetString(PyExc_ValueError, "Sequence elements must be numbers");
          SWIG_fail;
        }
      }
    }
    %typemap(freearg) float value[ANY] {
      if ($1) free($1);
    }
    

    In this case, an array is allocated using malloc. The freearg typemap is then used to release the argument after the function has been called.

    Another common use of array typemaps is to provide support for array structure members. Due to subtle differences between pointers and arrays in C, you can't just "assign" to a array structure member. Instead, you have to explicitly copy elements into the array. For example, suppose you had a structure like this:

    struct SomeObject {
      float  value[4];
      ...
    };
    

    When SWIG runs, it won't produce any code to set the vec member. You may even get a warning message like this:

    $ swig -python  example.i
    example.i:10: Warning 462: Unable to set variable of type float [4].
    

    These warning messages indicate that SWIG does not know how you want to set the vec field.

    To fix this, you can supply a special "memberin" typemap like this:

    %typemap(memberin) float [ANY] {
      int i;
      for (i = 0; i < $1_dim0; i++) {
          $1[i] = $input[i];
      }
    }
    

    The memberin typemap is used to set a structure member from data that has already been converted from the target language to C. In this case, $input is the local variable in which converted input data is stored. This typemap then copies this data into the structure.

    When combined with the earlier typemaps for arrays, the combination of the "in" and "memberin" typemap allows the following usage:

    >>> s = SomeObject()
    >>> s.x = [1, 2.5, 5, 10]
    

    Related to structure member input, it may be desirable to return structure members as a new kind of object. For example, in this example, you will get very odd program behavior where the structure member can be set nicely, but reading the member simply returns a pointer:

    >>> s = SomeObject()
    >>> s.x = [1, 2.5, 5, 10]
    >>> print s.x
    _1008fea8_p_float
    >>> 
    

    To fix this, you can write an "out" typemap. For example:

    %typemap(out) float [ANY] {
      int i;
      $result = PyList_New($1_dim0);
      for (i = 0; i < $1_dim0; i++) {
        PyObject *o = PyFloat_FromDouble((double) $1[i]);
        PyList_SetItem($result, i, o);
      }
    }
    

    Now, you will find that member access is quite nice:

    >>> s = SomeObject()
    >>> s.x = [1, 2.5, 5, 10]
    >>> print s.x
    [ 1, 2.5, 5, 10]
    

    Compatibility Note: SWIG1.1 used to provide a special "memberout" typemap. However, it was mostly useless and has since been eliminated. To return structure members, simply use the "out" typemap.

    13.6.2 Implementing constraints with typemaps

    One particularly interesting application of typemaps is the implementation of argument constraints. This can be done with the "check" typemap. When used, this allows you to provide code for checking the values of function arguments. For example:

    %module math
    
    %typemap(check) double posdouble {
      if ($1 < 0) {
        croak("Expecting a positive number");
      }
    }
    
    ...
    double sqrt(double posdouble);
    
    

    This provides a sanity check to your wrapper function. If a negative number is passed to this function, a Perl exception will be raised and your program terminated with an error message.

    This kind of checking can be particularly useful when working with pointers. For example:

    %typemap(check) Vector * {
      if ($1 == 0) {
        PyErr_SetString(PyExc_TypeError, "NULL Pointer not allowed");
        SWIG_fail;
      }
    }
    
    

    will prevent any function involving a Vector * from accepting a NULL pointer. As a result, SWIG can often prevent a potential segmentation faults or other run-time problems by raising an exception rather than blindly passing values to the underlying C/C++ program.

    13.7 Typemaps for multiple target languages

    The code within typemaps is usually language dependent, however, many target languages support the same typemaps. In order to distinguish typemaps across different languages, the preprocessor should be used. For example, the "in" typemap for Perl and Ruby could be written as:

    #if defined(SWIGPERL)
      %typemap(in) int "$1 = ($1_ltype) SvIV($input);"
    #elif defined(SWIGRUBY)
      %typemap(in) int "$1 = NUM2INT($input);"
    #else
      #warning no "in" typemap defined
    #endif
    

    The full set of language specific macros is defined in the Conditional Compilation section. The example above also shows a common approach of issuing a warning for an as yet unsupported language.

    Compatibility note: In SWIG-1.1 different languages could be distinguished with the language name being put within the %typemap directive, for example,
    %typemap(ruby, in) int "$1 = NUM2INT($input);".

    13.8 Optimal code generation when returning by value

    The "out" typemap is the main typemap for return types. This typemap supports an optional attribute flag called "optimal", which is for reducing the number of temporary variables and the amount of generated code, thereby giving the compiler the opportunity to use return value optimization for generating faster executing code. It only really makes a difference when returning objects by value and has some limitations on usage, as explained later on.

    When a function returns an object by value, SWIG generates code that instantiates the default type on the stack then assigns the value returned by the function call to it. A copy of this object is then made on the heap and this is what is ultimately stored and used from the target language. This will be clearer considering an example. Consider running the following code through SWIG:

    %typemap(out) SWIGTYPE %{
      $result = new $1_ltype((const $1_ltype &)$1);
    %}
    
    %inline %{
    #include <iostream>
    using namespace std;
    
    struct XX {
      XX() { cout << "XX()" << endl; }
      XX(int i) { cout << "XX(" << i << ")" << endl; }
      XX(const XX &other) { cout << "XX(const XX &)" << endl; }
      XX & operator =(const XX &other) { cout << "operator=(const XX &)" << endl; return *this; }
      ~XX() { cout << "~XX()" << endl; }
      static XX create() { 
        return XX(0);
      }
    };
    %}
    

    The "out" typemap shown is the default typemap for C# when returning objects by value. When making a call to XX::create() from C#, the output is as follows:

    XX()
    XX(0)
    operator=(const XX &)
    ~XX()
    XX(const XX &)
    ~XX()
    ~XX()
    

    Note that three objects are being created as well as an assignment. Wouldn't it be great if the XX::create() method was the only time a constructor was called? As the method returns by value, this is asking a lot and the code that SWIG generates by default makes it impossible for the compiler to use return value optimisation (RVO) . However, this is where the "optimal" attribute in the "out" typemap can help out. If the typemap code is kept the same and just the "optimal" attribute specified like this:

    %typemap(out, optimal="1") SWIGTYPE %{
      $result = new $1_ltype((const $1_ltype &)$1);
    %}
    

    then when the code is run again, the output is simply:

    XX(0)
    ~XX()
    

    How the "optimal" attribute works is best explained using the generated code. Without "optimal", the generated code is:

    SWIGEXPORT void * SWIGSTDCALL CSharp_XX_create() {
      void * jresult ;
      XX result;
      result = XX::create();
      jresult = new XX((const XX &)result);
      return jresult;
    }
    
    

    With the "optimal" attribute, the code is:

    SWIGEXPORT void * SWIGSTDCALL CSharp_XX_create() {
      void * jresult ;
      jresult = new XX((const XX &)XX::create());
      return jresult;
    }
    

    The major difference is the result temporary variable holding the value returned from XX::create() is no longer generated and instead the copy constructor call is made directly from the value returned by XX::create(). With modern compilers implementing RVO, the copy is not actually done, in fact the object is never created on the stack in XX::create() at all, it is simply created directly on the heap. In the first instance, the $1 special variable in the typemap is expanded into result. In the second instance, $1 is expanded into XX::create() and this is essentially what the "optimal" attribute is telling SWIG to do.

    The "optimal" attribute optimisation is not turned on by default as it has a number of restrictions. Firstly, some code cannot be condensed into a simple call for passing into the copy constructor. One common occurrence is when %exception is used. Consider adding the following %exception to the example:

    %exception XX::create() %{
    try {
      $action
    } catch(const std::exception &e) {
      cout << e.what() << endl;
    }
    %}
    

    SWIG can detect when the "optimal" attribute cannot be used and will ignore it and in this case will issue the following warning:

    example.i:28: Warning 474: Method XX::create() usage of the optimal attribute ignored
    example.i:14: Warning 474: in the out typemap as the following cannot be used to generate
    optimal code: 
    try {
      result = XX::create();
    } catch(const std::exception &e) {
      cout << e.what() << endl;
    }
    

    It should be clear that the above code cannot be used as the argument to the copy constructor call, that is, for the $1 substitution.

    Secondly, if the typemaps uses $1 more than once, then multiple calls to the wrapped function will be made. Obviously that is not very optimal. In fact SWIG attempts to detect this and will issue a warning something like:

    example.i:21: Warning 475: Multiple calls to XX::create() might be generated due to
    example.i:7: Warning 475: optimal attribute usage in the out typemap.
    

    However, it doesn't always get it right, for example when $1 is within some commented out code.

    13.9 Multi-argument typemaps

    So far, the typemaps presented have focused on the problem of dealing with single values. For example, converting a single input object to a single argument in a function call. However, certain conversion problems are difficult to handle in this manner. As an example, consider the example at the very beginning of this chapter:

    int foo(int argc, char *argv[]);
    

    Suppose that you wanted to wrap this function so that it accepted a single list of strings like this:

    >>> foo(["ale", "lager", "stout"])
    

    To do this, you not only need to map a list of strings to char *argv[], but the value of int argc is implicitly determined by the length of the list. Using only simple typemaps, this type of conversion is possible, but extremely painful. Multi-argument typemaps help in this situation.

    A multi-argument typemap is a conversion rule that specifies how to convert a single object in the target language to a set of consecutive function arguments in C/C++. For example, the following multi-argument maps perform the conversion described for the above example:

    %typemap(in) (int argc, char *argv[]) {
      int i;
      if (!PyList_Check($input)) {
        PyErr_SetString(PyExc_ValueError, "Expecting a list");
        SWIG_fail;
      }
      $1 = PyList_Size($input);
      $2 = (char **) malloc(($1+1)*sizeof(char *));
      for (i = 0; i < $1; i++) {
        PyObject *s = PyList_GetItem($input, i);
        if (!PyString_Check(s)) {
          free($2);
          PyErr_SetString(PyExc_ValueError, "List items must be strings");
          SWIG_fail;
        }
        $2[i] = PyString_AsString(s);
      }
      $2[i] = 0;
    }
    
    %typemap(freearg) (int argc, char *argv[]) {
      if ($2) free($2);
    }
    
    /* Required for C++ method overloading */
    %typecheck(SWIG_TYPECHECK_STRING_ARRAY) (int argc, char *argv[]) {
      $1 = PyList_Check($input) ? 1 : 0;
    }
    

    A multi-argument map is always specified by surrounding the arguments with parentheses as shown. For example:

    %typemap(in) (int argc, char *argv[]) { ... }
    

    Within the typemap code, the variables $1, $2, and so forth refer to each type in the map. All of the usual substitutions apply--just use the appropriate $1 or $2 prefix on the variable name (e.g., $2_type, $1_ltype, etc.)

    Multi-argument typemaps always have precedence over simple typemaps and SWIG always performs longest-match searching. Therefore, you will get the following behavior:

    %typemap(in) int argc                              { ... typemap 1 ... }
    %typemap(in) (int argc, char *argv[])              { ... typemap 2 ... }
    %typemap(in) (int argc, char *argv[], char *env[]) { ... typemap 3 ... }
    
    int foo(int argc, char *argv[]);                   // Uses typemap 2
    int bar(int argc, int x);                          // Uses typemap 1
    int spam(int argc, char *argv[], char *env[]);     // Uses typemap 3
    

    It should be stressed that multi-argument typemaps can appear anywhere in a function declaration and can appear more than once. For example, you could write this:

    %typemap(in) (int scount, char *swords[]) { ... }
    %typemap(in) (int wcount, char *words[]) { ... }
    
    void search_words(int scount, char *swords[], int wcount, char *words[], int maxcount);
    

    Other directives such as %apply and %clear also work with multi-argument maps. For example:

    %apply (int argc, char *argv[]) {
        (int scount, char *swords[]),
        (int wcount, char *words[])
    };
    ...
    %clear (int scount, char *swords[]), (int wcount, char *words[]);
    ...
    

    Don't forget to also provide a suitable typemap for overloaded functions, such as %typecheck shown for foo above. This is only required if the function is overloaded in C++.

    Although multi-argument typemaps may seem like an exotic, little used feature, there are several situations where they make sense. First, suppose you wanted to wrap functions similar to the low-level read() and write() system calls. For example:

    typedef unsigned int size_t;
    
    int read(int fd, void *rbuffer, size_t len);
    int write(int fd, void *wbuffer, size_t len);
    

    As is, the only way to use the functions would be to allocate memory and pass some kind of pointer as the second argument---a process that might require the use of a helper function. However, using multi-argument maps, the functions can be transformed into something more natural. For example, you might write typemaps like this:

    // typemap for an outgoing buffer
    %typemap(in) (void *wbuffer, size_t len) {
      if (!PyString_Check($input)) {
        PyErr_SetString(PyExc_ValueError, "Expecting a string");
        SWIG_fail;
      }
      $1 = (void *) PyString_AsString($input);
      $2 = PyString_Size($input);
    }
    
    // typemap for an incoming buffer
    %typemap(in) (void *rbuffer, size_t len) {
      if (!PyInt_Check($input)) {
        PyErr_SetString(PyExc_ValueError, "Expecting an integer");
        SWIG_fail;
      }
      $2 = PyInt_AsLong($input);
      if ($2 < 0) {
        PyErr_SetString(PyExc_ValueError, "Positive integer expected");
        SWIG_fail;
      }
      $1 = (void *) malloc($2);
    }
    
    // Return the buffer.  Discarding any previous return result
    %typemap(argout) (void *rbuffer, size_t len) {
      Py_XDECREF($result);   /* Blow away any previous result */
      if (result < 0) {      /* Check for I/O error */
        free($1);
        PyErr_SetFromErrno(PyExc_IOError);
        return NULL;
      }
      $result = PyString_FromStringAndSize($1, result);
      free($1);
    }
    

    (note: In the above example, $result and result are two different variables. result is the real C datatype that was returned by the function. $result is the scripting language object being returned to the interpreter.).

    Now, in a script, you can write code that simply passes buffers as strings like this:

    >>> f = example.open("Makefile")
    >>> example.read(f, 40)
    'TOP        = ../..\nSWIG       = $(TOP)/.'
    >>> example.read(f, 40)
    './swig\nSRCS       = example.c\nTARGET    '
    >>> example.close(f)
    0
    >>> g = example.open("foo", example.O_WRONLY | example.O_CREAT, 0644)
    >>> example.write(g, "Hello world\n")
    12
    >>> example.write(g, "This is a test\n")
    15
    >>> example.close(g)
    0
    >>>
    

    A number of multi-argument typemap problems also arise in libraries that perform matrix-calculations--especially if they are mapped onto low-level Fortran or C code. For example, you might have a function like this:

    int is_symmetric(double *mat, int rows, int columns);
    

    In this case, you might want to pass some kind of higher-level object as an matrix. To do this, you could write a multi-argument typemap like this:

    %typemap(in) (double *mat, int rows, int columns) {
      MatrixObject *a;
      a = GetMatrixFromObject($input);     /* Get matrix somehow */
    
      /* Get matrix properties */
      $1 = GetPointer(a);
      $2 = GetRows(a);
      $3 = GetColumns(a);
    }
    

    This kind of technique can be used to hook into scripting-language matrix packages such as Numeric Python. However, it should also be stressed that some care is in order. For example, when crossing languages you may need to worry about issues such as row-major vs. column-major ordering (and perform conversions if needed). Note that multi-argument typemaps cannot deal with non-consecutive C/C++ arguments; a workaround such as a helper function re-ordering the arguments to make them consecutive will need to be written.

    13.10 Typemap warnings

    Warnings can be added to typemaps so that SWIG generates a warning message whenever the typemap is used. See the information in the issuing warnings section.

    13.11 Typemap fragments

    The primary purpose of fragments is to reduce code bloat that repeated use of typemap code can lead to. Fragments are snippets of code that can be thought of as code dependencies of a typemap. If a fragment is used by more than one typemap, then the snippet of code within the fragment is only generated once. Code bloat is typically reduced by moving typemap code into a support function and then placing the support function into a fragment.

    For example, if you have a very long typemap

    %typemap(in) MyClass * {
      MyClass *value = 0;
    
      ... many lines of marshalling code  ...
    
      $result = value;
    }
    

    the same marshalling code is often repeated in several typemaps, such as "in", "varin", "directorout", etc. SWIG copies the code for each argument that requires the typemap code, easily leading to code bloat in the generated code. To eliminate this, define a fragment that includes the common marshalling code:

    %fragment("AsMyClass", "header") {
      MyClass *AsMyClass(PyObject *obj) {
        MyClass *value = 0;
    
        ... many lines of marshalling code  ...
    
        return value;
      }
    }
    
    %typemap(in, fragment="AsMyClass") MyClass * {
      $result = AsMyClass($input);
    }
    
    %typemap(varin, fragment="AsMyClass") MyClass * {
      $result = AsMyClass($input);
    }
    

    When the "in" or "varin" typemaps for MyClass are required, the contents of the fragment called "AsMyClass" is added to the "header" section within the generated code, and then the typemap code is emitted. Hence, the method AsMyClass will be generated into the wrapper code before any typemap code that calls it.

    To define a fragment you need a fragment name, a section name for generating the fragment code into, and the code itself. See Code insertion blocks for a full list of section names. Usually the section name used is "header". Different delimiters can be used:

    %fragment("my_name", "header") %{ ... %}
    %fragment("my_name", "header") { ... }
    %fragment("my_name", "header") " ... "
    

    and these follow the usual preprocessing rules mentioned in the Preprocessing delimiters section. The following are some rules and guidelines for using fragments:

    1. A fragment is added to the wrapping code only once. When using the MyClass * typemaps above and wrapping the method:

      void foo(MyClass *a, MyClass *b);
      

      the generated code will look something like:

      MyClass *AsMyClass(PyObject *obj) {
        ...
      }
      
      void _wrap_foo(...) {
        ....
        arg1 = AsMyClass(obj1);
        arg2 = AsMyClass(obj2);
        ...
        foo(arg1, arg2);
      }
      

      even as there is duplicated typemap code to process both a and b, the AsMyClass method will be defined only once.

    2. A fragment should only be defined once. If there is more than one definition, the first definition is the one used. All other definitions are silently ignored. For example, if you have

      %fragment("AsMyClass", "header") { ...definition 1... }
      ....
      %fragment("AsMyClass", "header") { ...definition 2... }
      

      only the first definition is used. In this way you can override the default fragments in a SWIG library by defining your fragment before the library %include. Note that this behavior is the opposite to typemaps, where the last typemap defined/applied prevails. Fragments follow the first-in-first-out convention since they are intended to be global, while typemaps are intended to be locally specialized.

    3. Fragment names cannot contain commas.

    4. A fragment can use one or more additional fragments, for example:

      %fragment("<limits.h>", "header") %{
        #include <limits.h>
      %}
      
      
      %fragment("AsMyClass", "header", fragment="<limits.h>") {
        MyClass *AsMyClass(PyObject *obj) {
          MyClass *value = 0;
      
          ... some marshalling code  ...
      
          if  (ival < CHAR_MIN /*defined in <limits.h>*/) {
            ...
          } else {
            ...
          }
          ...
          return value;
        }
      }
      

      in this case, when the "AsMyClass" fragment is emitted, it also triggers the inclusion of the "<limits.h>" fragment.

    5. A fragment can have dependencies on a number of other fragments, for example:

      %fragment("bigfragment", "header", fragment="frag1", fragment="frag2", fragment="frag3") "";
      

      When the "bigfragment" is used, the three dependent fragments "frag1", "frag2" and "frag3" are also pulled in. Note that as "bigframent" is empty (the empty string - ""), it does not add any code itself, but merely triggers the inclusion of the other fragments.

    6. A typemap can also use more than one fragment, but since the syntax is different, you need to specify the dependent fragments in a comma separated list. Consider:

      %typemap(in, fragment="frag1, frag2, frag3") {...}
      

      which is equivalent to:

      %typemap(in, fragment="bigfragment") {...}
      

      when used with the "bigfragment" defined above.

    7. Finally, you can force the inclusion of a fragment at any point in the generated code as follows:

      %fragment("bigfragment");
      

      which, for example, is very useful inside a template class. Another useful case is when using %extend inside a class where the additional code in the %extend block depends on the contents of the fragment.

      %fragment("<limits.h>", "header") %{
        #include <limits.h>
      %}
      
      struct X {
        ...
        %extend {
          %fragment("<limits.h>");
          bool check(short val) {
            if (val < SHRT_MIN /*defined in <limits.h>*/) {
              return true;
            } else {
              return false;
            }
          }
        }
      };
      

      Forced inclusion of fragments can be used as a replacement for code insertion block, ensuring the code block is only generated once. Consider the contents of FileA.i below which first uses a code insertion block and then a forced fragment inclusion to generate code:

      // FileA.i
      %{
        #include <stdio.h>
      %}
      %fragment("<limits.h>");
      

      and another file including the above:

      // FileB.i
      %include "FileA.i"
      

      The resulting code in the wrappers for FileB.i is:

        #include <stdio.h>
      
        #include <limits.h>
      

      A note of caution must be mentioned when using %fragment forced inclusion or code insertion blocks with %import. If %import is used instead:

      // FileC.i
      %import "FileA.i"
      

      then nothing is generated in the resulting code in the wrappers for FileC.i. This is because %import is for collecting type information and does not result in any code being generated, see File Imports.

    Most readers will probably want to skip the next two sub-sections on advanced fragment usage unless a desire to really get to grips with some powerful but tricky macro and fragment usage that is used in parts of the SWIG typemap library.

    13.11.1 Fragment type specialization

    Fragments can be type specialized. The syntax is as follows:

    %fragment("name", "header") { ...a type independent fragment... }
    %fragment("name"{type}, "header") { ...a type dependent fragment...  }
    

    where type is a C/C++ type. Like typemaps, fragments can also be used inside templates, for example:

    template <class T>
    struct A {
      %fragment("incode"{A<T>}, "header") {
        ... 'incode' specialized fragment ...
      }
    
      %typemap(in, fragment="incode"{A<T>}) {
        ... here we use the 'type specialized' fragment "incode"{A<T>} ...
      }
    };
    

    13.11.2 Fragments and automatic typemap specialization

    Since fragments can be type specialized, they can be elegantly used to specialize typemaps. For example, if you have something like:

    %fragment("incode"{float}, "header") {
      float in_method_float(PyObject *obj) {
        ...
      }
    }
    
    %fragment("incode"{long}, "header") {
      float in_method_long(PyObject *obj) {
        ...
      }
    }
    
    // %my_typemaps macro definition
    %define %my_typemaps(Type) 
    %typemap(in, fragment="incode"{Type}) Type {
      value = in_method_##Type(obj);
    }
    %enddef
    
    %my_typemaps(float);
    %my_typemaps(long);
    

    then the proper "incode"{float} or "incode"{long} fragment will be used, and the in_method_float and in_method_long methods will be called whenever the float or long types are used as input parameters.

    This feature is used a lot in the typemaps shipped in the SWIG library for some scripting languages. The interested (or very brave) reader can take a look at the fragments.swg file shipped with SWIG to see this in action.

    13.12 The run-time type checker

    Most scripting languages need type information at run-time. This type information can include how to construct types, how to garbage collect types, and the inheritance relationships between types. If the language interface does not provide its own type information storage, the generated SWIG code needs to provide it.

    Requirements for the type system:

    • Store inheritance and type equivalence information and be able to correctly re-create the type pointer.
    • Share type information between modules.
    • Modules can be loaded in any order, regardless of actual type dependency.
    • Avoid the use of dynamically allocated memory, and library/system calls in general.
    • Provide a reasonably fast implementation, minimizing the lookup time for all language modules.
    • Custom, language specific information can be attached to types.
    • Modules can be unloaded from the type system.

    13.12.1 Implementation

    The run-time type checker is used by many, but not all, of SWIG's supported target languages. The run-time type checker features are not required and are thus not used for statically typed languages such as Java and C#. The scripting and scheme based languages rely on it and it forms a critical part of SWIG's operation for these languages.

    When pointers, arrays, and objects are wrapped by SWIG, they are normally converted into typed pointer objects. For example, an instance of Foo * might be a string encoded like this:

    _108e688_p_Foo
    

    At a basic level, the type checker simply restores some type-safety to extension modules. However, the type checker is also responsible for making sure that wrapped C++ classes are handled correctly---especially when inheritance is used. This is especially important when an extension module makes use of multiple inheritance. For example:

    class Foo {
    public:
      int x;
    };
    
    class Bar {
    public:
      int y;
    };
    
    class FooBar : public Foo, public Bar {
    public:
      int z;
    };
    

    When the class FooBar is organized in memory, it contains the contents of the classes Foo and Bar as well as its own data members. For example:

    FooBar --> | -----------|  <-- Foo
               |   int x    |
               |------------|  <-- Bar
               |   int y    |
               |------------|
               |   int z    |
               |------------|
    

    Because of the way that base class data is stacked together, the casting of a Foobar * to either of the base classes may change the actual value of the pointer. This means that it is generally not safe to represent pointers using a simple integer or a bare void * ---type tags are needed to implement correct handling of pointer values (and to make adjustments when needed).

    In the wrapper code generated for each language, pointers are handled through the use of special type descriptors and conversion functions. For example, if you look at the wrapper code for Python, you will see code similar to the following (simplified for brevity):

    if (!SWIG_IsOK(SWIG_ConvertPtr(obj0, (void **) &arg1, SWIGTYPE_p_Foo, 0))) {
      SWIG_exception_fail(SWIG_TypeError, "in method 'GrabVal', expecting type Foo");
    }
    

    In this code, SWIGTYPE_p_Foo is the type descriptor that describes Foo *. The type descriptor is actually a pointer to a structure that contains information about the type name to use in the target language, a list of equivalent typenames (via typedef or inheritance), and pointer value handling information (if applicable). The SWIG_ConvertPtr() function is simply a utility function that takes a pointer object in the target language and a type-descriptor object and uses this information to generate a C++ pointer. The SWIG_IsOK macro checks the return value for errors and SWIG_exception_fail can be called to raise an exception in the target language. However, the exact name and calling conventions of the conversion function depends on the target language (see language specific chapters for details).

    The actual type code is in swigrun.swg, and gets inserted near the top of the generated swig wrapper file. The phrase "a type X that can cast into a type Y" means that given a type X, it can be converted into a type Y. In other words, X is a derived class of Y or X is a typedef of Y. The structure to store type information looks like this:

    /* Structure to store information on one type */
    typedef struct swig_type_info {
      const char *name;             /* mangled name of this type */
      const char *str;              /* human readable name for this type */
      swig_dycast_func dcast;       /* dynamic cast function down a hierarchy */
      struct swig_cast_info *cast;  /* Linked list of types that can cast into this type */
      void *clientdata;             /* Language specific type data */
    } swig_type_info;
    
    /* Structure to store a type and conversion function used for casting */
    typedef struct swig_cast_info {
      swig_type_info *type;          /* pointer to type that is equivalent to this type */
      swig_converter_func converter; /* function to cast the void pointers */
      struct swig_cast_info *next;   /* pointer to next cast in linked list */
      struct swig_cast_info *prev;   /* pointer to the previous cast */
    } swig_cast_info;
    

    Each swig_type_info stores a linked list of types that it is equivalent to. Each entry in this doubly linked list stores a pointer back to another swig_type_info structure, along with a pointer to a conversion function. This conversion function is used to solve the above problem of the FooBar class, correctly returning a pointer to the type we want.

    The basic problem we need to solve is verifying and building arguments passed to functions. So going back to the SWIG_ConvertPtr() function example from above, we are expecting a Foo * and need to check if obj0 is in fact a Foo * . From before, SWIGTYPE_p_Foo is just a pointer to the swig_type_info structure describing Foo *. So we loop through the linked list of swig_cast_info structures attached to SWIGTYPE_p_Foo. If we see that the type of obj0 is in the linked list, we pass the object through the associated conversion function and then return a positive. If we reach the end of the linked list without a match, then obj0 can not be converted to a Foo * and an error is generated.

    Another issue needing to be addressed is sharing type information between multiple modules. More explicitly, we need to have ONE swig_type_info for each type. If two modules both use the type, the second module loaded must lookup and use the swig_type_info structure from the module already loaded. Because no dynamic memory is used and the circular dependencies of the casting information, loading the type information is somewhat tricky, and not explained here. A complete description is in the Lib/swiginit.swg file (and near the top of any generated file).

    Each module has one swig_module_info structure which looks like this:

    /* Structure used to store module information
     * Each module generates one structure like this, and the runtime collects
     * all of these structures and stores them in a circularly linked list.*/
    typedef struct swig_module_info {
      swig_type_info **types;         /* Array of pointers to swig_type_info structs in this module */
      int size;                       /* Number of types in this module */
      struct swig_module_info *next;  /* Pointer to next element in circularly linked list */
      swig_type_info **type_initial;  /* Array of initially generated type structures */
      swig_cast_info **cast_initial;  /* Array of initially generated casting structures */
      void *clientdata;               /* Language specific module data */
    } swig_module_info;
    

    Each module stores an array of pointers to swig_type_info structures and the number of types in this module. So when a second module is loaded, it finds the swig_module_info structure for the first module and searches the array of types. If any of its own types are in the first module and have already been loaded, it uses those swig_type_info structures rather than creating new ones. These swig_module_info structures are chained together in a circularly linked list.

    13.12.2 Usage

    This section covers how to use these functions from typemaps. To learn how to call these functions from external files (not the generated _wrap.c file), see the External access to the run-time system section.

    When pointers are converted in a typemap, the typemap code often looks similar to this:

    %typemap(in) Foo * {
      if (!SWIG_IsOK(SWIG_ConvertPtr($input, (void **) &$1, $1_descriptor, 0))) {
        SWIG_exception_fail(SWIG_TypeError, "in method '$symname', expecting type Foo");
      }
    }
    

    The most critical part is the typemap is the use of the $1_descriptor special variable. When placed in a typemap, this is expanded into the SWIGTYPE_* type descriptor object above. As a general rule, you should always use $1_descriptor instead of trying to hard-code the type descriptor name directly.

    There is another reason why you should always use the $1_descriptor variable. When this special variable is expanded, SWIG marks the corresponding type as "in use." When type-tables and type information is emitted in the wrapper file, descriptor information is only generated for those datatypes that were actually used in the interface. This greatly reduces the size of the type tables and improves efficiency.

    Occasionally, you might need to write a typemap that needs to convert pointers of other types. To handle this, the special variable macro $descriptor(type) covered earlier can be used to generate the SWIG type descriptor name for any C datatype. For example:

    %typemap(in) Foo * {
      if (!SWIG_IsOK(SWIG_ConvertPtr($input, (void **) &$1, $1_descriptor, 0))) {
        Bar *temp;
        if (!SWIG_IsOK(SWIG_ConvertPtr($input, (void **) &temp, $descriptor(Bar *), 0))) {
          SWIG_exception_fail(SWIG_TypeError, "in method '$symname', expecting type Foo or Bar");
        }
        $1 = (Foo *)temp;
      }
    }
    

    The primary use of $descriptor(type) is when writing typemaps for container objects and other complex data structures. There are some restrictions on the argument---namely it must be a fully defined C datatype. It can not be any of the special typemap variables.

    In certain cases, SWIG may not generate type-descriptors like you expect. For example, if you are converting pointers in some non-standard way or working with an unusual combination of interface files and modules, you may find that SWIG omits information for a specific type descriptor. To fix this, you may need to use the %types directive. For example:

    %types(int *, short *, long *, float *, double *);
    

    When %types is used, SWIG generates type-descriptor information even if those datatypes never appear elsewhere in the interface file.

    Further details about the run-time type checking can be found in the documentation for individual language modules. Reading the source code may also help. The file Lib/swigrun.swg in the SWIG library contains all of the source of the generated code for type-checking. This code is also included in every generated wrapped file so you probably just look at the output of SWIG to get a better sense for how types are managed.

    13.13 Typemaps and overloading

    This section does not apply to the statically typed languages like Java and C#, where overloading of the types is handled much like C++ by generating overloaded methods in the target language. In many of the other target languages, SWIG still fully supports C++ overloaded methods and functions. For example, if you have a collection of functions like this:

    int foo(int x);
    int foo(double x);
    int foo(char *s, int y);
    

    You can access the functions in a normal way from the scripting interpreter:

    # Python
    foo(3)           # foo(int)
    foo(3.5)         # foo(double)
    foo("hello", 5)  # foo(char *, int)
    
    # Tcl
    foo 3            # foo(int)
    foo 3.5          # foo(double)
    foo hello 5      # foo(char *, int)
    

    To implement overloading, SWIG generates a separate wrapper function for each overloaded method. For example, the above functions would produce something roughly like this:

    // wrapper pseudocode
    _wrap_foo_0(argc, args[]) {       // foo(int)
      int arg1;
      int result;
      ...
      arg1 = FromInteger(args[0]);
      result = foo(arg1);
      return ToInteger(result);
    }
    
    _wrap_foo_1(argc, args[]) {       // foo(double)
      double arg1;
      int result;
      ...
      arg1 = FromDouble(args[0]);
      result = foo(arg1);
      return ToInteger(result);
    }
    
    _wrap_foo_2(argc, args[]) {       // foo(char *, int)
      char *arg1;
      int   arg2;
      int result;
      ...
      arg1 = FromString(args[0]);
      arg2 = FromInteger(args[1]);
      result = foo(arg1, arg2);
      return ToInteger(result);
    }
    
    

    Next, a dynamic dispatch function is generated:

    _wrap_foo(argc, args[]) {
      if (argc == 1) {
        if (IsInteger(args[0])) {
          return _wrap_foo_0(argc, args);
        }
        if (IsDouble(args[0])) {
          return _wrap_foo_1(argc, args);
        }
      }
      if (argc == 2) {
        if (IsString(args[0]) && IsInteger(args[1])) {
          return _wrap_foo_2(argc, args);
        }
      }
      error("No matching function!\n");
    }
    

    The purpose of the dynamic dispatch function is to select the appropriate C++ function based on argument types---a task that must be performed at runtime in most of SWIG's target languages.

    The generation of the dynamic dispatch function is a relatively tricky affair. Not only must input typemaps be taken into account (these typemaps can radically change the types of arguments accepted), but overloaded methods must also be sorted and checked in a very specific order to resolve potential ambiguity. A high-level overview of this ranking process is found in the "SWIG and C++ " chapter. What isn't mentioned in that chapter is the mechanism by which it is implemented---as a collection of typemaps.

    To support dynamic dispatch, SWIG first defines a general purpose type hierarchy as follows:

    Symbolic Name                   Precedence Value
    ------------------------------  ------------------
    SWIG_TYPECHECK_POINTER           0
    SWIG_TYPECHECK_ITERATOR          5
    SWIG_TYPECHECK_VOIDPTR           10
    SWIG_TYPECHECK_BOOL              15
    SWIG_TYPECHECK_UINT8             20
    SWIG_TYPECHECK_INT8              25
    SWIG_TYPECHECK_UINT16            30
    SWIG_TYPECHECK_INT16             35
    SWIG_TYPECHECK_UINT32            40
    SWIG_TYPECHECK_INT32             45
    SWIG_TYPECHECK_SIZE              47
    SWIG_TYPECHECK_PTRDIFF           48
    SWIG_TYPECHECK_UINT64            50
    SWIG_TYPECHECK_INT64             55
    SWIG_TYPECHECK_UINT128           60
    SWIG_TYPECHECK_INT128            65
    SWIG_TYPECHECK_INTEGER           70
    SWIG_TYPECHECK_FLOAT             80
    SWIG_TYPECHECK_DOUBLE            90
    SWIG_TYPECHECK_CPLXFLT           95
    SWIG_TYPECHECK_CPLXDBL           100
    SWIG_TYPECHECK_COMPLEX           105
    SWIG_TYPECHECK_UNICHAR           110
    SWIG_TYPECHECK_STDUNISTRING      115
    SWIG_TYPECHECK_UNISTRING         120
    SWIG_TYPECHECK_CHAR              130
    SWIG_TYPECHECK_STDSTRING         135
    SWIG_TYPECHECK_STRING            140
    SWIG_TYPECHECK_PAIR              150
    SWIG_TYPECHECK_STDARRAY          155
    SWIG_TYPECHECK_VECTOR            160
    SWIG_TYPECHECK_DEQUE             170
    SWIG_TYPECHECK_LIST              180
    SWIG_TYPECHECK_SET               190
    SWIG_TYPECHECK_MULTISET          200
    SWIG_TYPECHECK_MAP               210
    SWIG_TYPECHECK_MULTIMAP          220
    SWIG_TYPECHECK_STACK             230
    SWIG_TYPECHECK_QUEUE             240
    SWIG_TYPECHECK_BOOL_ARRAY        1015
    SWIG_TYPECHECK_INT8_ARRAY        1025
    SWIG_TYPECHECK_INT16_ARRAY       1035
    SWIG_TYPECHECK_INT32_ARRAY       1045
    SWIG_TYPECHECK_INT64_ARRAY       1055
    SWIG_TYPECHECK_INT128_ARRAY      1065
    SWIG_TYPECHECK_FLOAT_ARRAY       1080
    SWIG_TYPECHECK_DOUBLE_ARRAY      1090
    SWIG_TYPECHECK_CHAR_ARRAY        1130
    SWIG_TYPECHECK_STRING_ARRAY      1140
    SWIG_TYPECHECK_OBJECT_ARRAY      1150
    SWIG_TYPECHECK_BOOL_PTR          2015
    SWIG_TYPECHECK_UINT8_PTR         2020
    SWIG_TYPECHECK_INT8_PTR          2025
    SWIG_TYPECHECK_UINT16_PTR        2030
    SWIG_TYPECHECK_INT16_PTR         2035
    SWIG_TYPECHECK_UINT32_PTR        2040
    SWIG_TYPECHECK_INT32_PTR         2045
    SWIG_TYPECHECK_UINT64_PTR        2050
    SWIG_TYPECHECK_INT64_PTR         2055
    SWIG_TYPECHECK_FLOAT_PTR         2080
    SWIG_TYPECHECK_DOUBLE_PTR        2090
    SWIG_TYPECHECK_CHAR_PTR          2130
    SWIG_TYPECHECK_SWIGOBJECT        5000
    

    (These precedence levels are defined in swig.swg, a library file that's included by all target language modules.)

    In this table, the precedence-level determines the order in which types are going to be checked. Low values are always checked before higher values. For example, integers are checked before floats, single values are checked before arrays, and so forth.

    Using the above table as a guide, each target language defines a collection of "typecheck" typemaps. The following excerpt from the Python module illustrates this:

    /* Python type checking rules */
    /* Note:  %typecheck(X) is a macro for %typemap(typecheck, precedence=X) */
    
    %typecheck(SWIG_TYPECHECK_INTEGER)
      int, short, long,
      unsigned int, unsigned short, unsigned long,
      signed char, unsigned char,
      long long, unsigned long long,
      const int &, const short &, const long &,
      const unsigned int &, const unsigned short &, const unsigned long &,
      const long long &, const unsigned long long &,
      enum SWIGTYPE,
      bool, const bool &
    {
      $1 = (PyInt_Check($input) || PyLong_Check($input)) ? 1 : 0;
    }
    
    %typecheck(SWIG_TYPECHECK_DOUBLE)
      float, double,
      const float &, const double &
    {
      $1 = (PyFloat_Check($input) || PyInt_Check($input) || PyLong_Check($input)) ? 1 : 0;
    }
    
    %typecheck(SWIG_TYPECHECK_CHAR) char {
      $1 = (PyString_Check($input) && (PyString_Size($input) == 1)) ? 1 : 0;
    }
    
    %typecheck(SWIG_TYPECHECK_STRING) char * {
      $1 = PyString_Check($input) ? 1 : 0;
    }
    
    %typemap(typecheck, precedence=SWIG_TYPECHECK_POINTER, noblock=1) SWIGTYPE * {
      void *vptr = 0;
      int res = SWIG_ConvertPtr($input, &vptr, $1_descriptor, 0);
      $1 = SWIG_IsOK(res) ? 1 : 0;
    }
    
    %typecheck(SWIG_TYPECHECK_POINTER) PyObject * {
      $1 = ($input != 0);
    }
    

    It might take a bit of contemplation, but this code has merely organized all of the basic C++ types, provided some simple type-checking code, and assigned each type a precedence value.

    Finally, to generate the dynamic dispatch function, SWIG uses the following algorithm:

    • Overloaded methods are first sorted by the number of required arguments.
    • Methods with the same number of arguments are then sorted by precedence values of argument types.
    • Typecheck typemaps are then emitted to produce a dispatch function that checks arguments in the correct order.

    If you haven't written any typemaps of your own, it is unnecessary to worry about the typechecking rules. However, if you have written new input typemaps, you might have to supply a typechecking rule as well. An easy way to do this is to simply copy one of the existing typechecking rules. Here is an example,

    // Typemap for a C++ string
    %typemap(in) std::string {
      if (PyString_Check($input)) {
        $1 = std::string(PyString_AsString($input));
      } else {
        SWIG_exception(SWIG_TypeError, "string expected");
      }
    }
    // Copy the typecheck code for "char *".  
    %typemap(typecheck) std::string = char *;
    

    The bottom line: If you are writing new typemaps and you are using overloaded methods, you will probably have to write new typecheck code or copy and modify existing typecheck code.

    If you write a typecheck typemap and omit the precedence level, for example commenting it out as shown below:

    %typemap(typecheck /*, precedence=SWIG_TYPECHECK_INTEGER*/) int {
      $1 = PyInt_Check($input) ? 1 : 0;
    }
    

    then the type is given a precedence higher than any other known precedence level and a warning is issued:

    example.i:18: Warning 467: Overloaded method foo(int) not supported (incomplete type
    checking rule - no precedence level in typecheck typemap for 'int').
    

    Notes:

    • Typecheck typemaps are not used for non-overloaded methods. Because of this, it is still always necessary to check types in any "in" typemaps.
    • The dynamic dispatch process is only meant to be a heuristic. There are many corner cases where SWIG simply can't disambiguate types to the same degree as C++. The only way to resolve this ambiguity is to use the %rename directive to rename one of the overloaded methods (effectively eliminating overloading).
    • Typechecking may be partial. For example, if working with arrays, the typecheck code might simply check the type of the first array element and use that to dispatch to the correct function. Subsequent "in" typemaps would then perform more extensive type-checking.
    • Make sure you read the section on overloading in the SWIG and C++ chapter.

    13.13.1 SWIG_TYPECHECK_POINTER precedence level and the typecheck typemap

    When it comes to overloading of a particular type passed by value, pointer or reference (const and non-const), a C++ compiler can disambiguate which overloaded function to call. However, SWIG effectively treats these as pointers in the target language and thus as equivalent types. For example, consider:

    class X { ... };
    void m(X const &c); // equivalent: void m(X *c);
    void m(X &r);       // equivalent: void m(X *r);
    void m(X *p);       // equivalent: void m(X *p);
    

    These cannot be disambiguated in the target languages and so SWIG will choose the first method and ignore the subsequent two methods. The scripting languages do this by using the overload dispatch mechanism described earlier and warnings indicate this:

    example.i:6: Warning 509: Overloaded method m(X &) effectively ignored,
    example.i:5: Warning 509: as it is shadowed by m(X const &).
    example.i:7: Warning 509: Overloaded method m(X *) effectively ignored,
    example.i:5: Warning 509: as it is shadowed by m(X const &).
    

    The statically typed languages like Java and C# automatically ignore all but the first equivalent overloaded methods with warnings:

    example.i:6: Warning 516: Overloaded method m(X &) ignored,
    example.i:5: Warning 516: using m(X const &) instead.
    example.i:7: Warning 516: Overloaded method m(X *) ignored,
    example.i:5: Warning 516: using m(X const &) instead.
    

    You can select the overloaded method you would like to wrap by ignoring the other two with %ignore or rename two of them with %rename and this will of course remove the warnings too. The problem of ambiguity is also discussed in the C++ chapter on overloading.

    So how does this work with respect to typemaps? The typemaps SWIG provides to handle overloading for these three methods are from the SWIGTYPE family. As discussed earlier, in Default typemap matching rules, the SWIGTYPE & typemaps are used for references and SWIGTYPE * typemaps are used for pointers. SWIG uses the special SWIG_TYPECHECK_POINTER (0) precedence level to handle these types in the "typecheck" typemap:

    %typemap(typecheck, precedence=SWIG_TYPECHECK_POINTER) SWIGTYPE & "..."
    %typemap(typecheck, precedence=SWIG_TYPECHECK_POINTER) SWIGTYPE * "..."
    

    When the SWIGTYPE "typecheck" typemaps use the SWIG_TYPECHECK_POINTER precedence level, SWIG converts the type to a pointer equivalent type and then uses the equivalent type to detect if it can be disambiguated in an overloaded method in the target language. In our example above, the equivalent types for X const & , X & and X * are all X *. As they are the same, they cannot be disambiguated and so just the first overloaded method is chosen.

    The automatic conversion to equivalent types and subsequent type comparison is triggered via the use of the special SWIG_TYPECHECK_POINTER precedence level and works for types passed by value, pointer and reference. Alas, there are more ways to overload a method that also need handling. C++ smart pointers are such a type which can be disambiguated by a C++ compiler but not automatically by SWIG. SWIG does not automatically know that a smart pointer has an equivalent type, but it can be told manually. Just specify the 'equivalent' attribute in the "typecheck" typemap with a pointer to the underlying type.

    %typemap(typecheck, precedence=SWIG_TYPECHECK_POINTER, equivalent="X *") MySmartPtr<X> " ... "
    
    void m(X &r);            // equivalent: void m(X *r);
    void m(MySmartPtr<X> s); // equivalent: void m(X *s);
    

    Now SWIG will detect the two types are equivalent and generate valid code by wrapping just the first overloaded method. You can of course choose which method to wrap by ignoring one of them with %ignore . Otherwise both can be wrapped by removing the overloading name ambiguity by renaming one of them with %rename.

    The 'equivalent' attribute is used in the implementation for the shared_ptr smart pointer library.

    13.14 More about %apply and %clear

    In order to implement certain kinds of program behavior, it is sometimes necessary to write a family of typemap methods. For example, to support output arguments, one often writes a family of typemaps like this:

    %typemap(in, numinputs=0) int *OUTPUT (int temp) {
      $1 = &temp;
    }
    %typemap(argout) int *OUTPUT {
      // return value somehow
    }
    

    To make it easier to apply the typemap to different argument types and names, the %apply directive performs a copy of all typemaps from a source type to one or more set of target types. For example, if you specify this,

    %apply int *OUTPUT { int *retvalue, int32 *output };
    

    then all of the int *OUTPUT (source) typemap methods are copied to int *retvalue and int32 *output (the targets).

    However, there is a subtle aspect of %apply that needs clarification. Namely, if a target contains a typemap method that the source does not, the target typemap method remains in place and unchanged. This behavior allows you to do two things:

    • You can specialize parts of a complex typemap rule by first defining a few typemaps and then using %apply to incorporate the remaining pieces.
    • Different typemaps can be applied to the same datatype using repeated %apply directives.

    For example:

    %typemap(in) int *INPUT (int temp) {
      temp = ... get value from $input ...;
      $1 = &temp;
    }
    
    %typemap(check) int *POSITIVE {
      if (*$1 <= 0) {
        SWIG_exception(SWIG_ValueError, "Expected a positive number!\n");
        return NULL;
      }
    }
    
    %typemap(arginit) int *invalue %{
      $1 = NULL;
    %}
    
    ...
    %apply int *INPUT     { int *invalue };
    %apply int *POSITIVE  { int *invalue };
    

    In this example, neither of the two %apply directives will overwrite / delete the "arginit" typemap as neither has an "arginit" typemap. The result is a family of three relevant typemaps for int *invalue. Since %apply does not overwrite / delete any existing rules, the only way to reset behavior is to delete them, such as with the %clear directive. For example:

    %clear int *invalue;
    

    will delete the typemaps for all the typemap methods; namely "in", "check" and "arginit". Alternatively delete each one individually:

    %typemap(in) int *invalue;
    %typemap(check) int *invalue;
    %typemap(arginit) int *invalue;
    

    13.15 Passing data between typemaps

    It is also important to note that the primary use of local variables is to create stack-allocated objects for temporary use inside a wrapper function (this is faster and less-prone to error than allocating data on the heap). In general, the variables are not intended to pass information between different types of typemaps. However, this can be done if you realize that local names have the argument number appended to them. For example, you could do this:

    %typemap(in) int *(int temp) {
      temp = (int) PyInt_AsLong($input);
      $1 = &temp;
    }
    
    %typemap(argout) int * {
      PyObject *o = PyInt_FromLong(temp$argnum);
      ...
    }
    

    In this case, the $argnum variable is expanded into the argument number. Therefore, the code will reference the appropriate local such as temp1 and temp2. It should be noted that there are plenty of opportunities to break the universe here and that accessing locals in this manner should probably be avoided. At the very least, you should make sure that the typemaps sharing information have exactly the same types and names.

    13.16 C++ "this" pointer

    All the rules discussed for typemaps apply to C++ as well as C. However in addition C++ passes an extra parameter into every non-static class method -- the this pointer. Occasionally it can be useful to apply a typemap to this pointer (for example to check and make sure this is non-null before deferencing). Actually, C also has an the equivalent of the this pointer which is used when accessing variables in a C struct.

    In order to customise the this pointer handling, target a variable named self in your typemaps. self is the name SWIG uses to refer to the extra parameter in wrapped functions.

    For example, if wrapping for Java generation:

    %typemap(check) SWIGTYPE *self %{
    if (!$1) {
      SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException,
        "invalid native object; delete() likely already called");
      return $null;
    }
    %}
    

    In the above case, the $1 variable is expanded into the argument name that SWIG is using as the this pointer. SWIG will then insert the check code before the actual C++ class method is called, and will raise an exception rather than crash the Java virtual machine. The generated code will look something like:

      if (!arg1) {
        SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException,
          "invalid native object; delete() likely already called");
        return ;
      }
      (arg1)->wrappedFunction(...);
    

    Note that if you have a parameter named self then it will also match the typemap. One work around is to create an interface file that wraps the method, but gives the argument a name other than self.

    13.17 Where to go for more information?

    The best place to find out more information about writing typemaps is to look in the SWIG library. Most language modules define all of their default behavior using typemaps. These are found in files such as python.swg, perl5.swg, tcl8.swg and so forth. The typemaps.i file in the library also contains numerous examples. You should look at these files to get a feel for how to define typemaps of your own. Some of the language modules support additional typemaps and further information is available in the individual chapters for each target language. There you may also find more hands-on practical examples.


    14 Customization Features

    In many cases, it is desirable to change the default wrapping of particular declarations in an interface. For example, you might want to provide hooks for catching C++ exceptions, add assertions, or provide hints to the underlying code generator. This chapter describes some of these customization techniques. First, a discussion of exception handling is presented. Then, a more general-purpose customization mechanism known as "features" is described.

    14.1 Exception handling with %exception

    The %exception directive allows you to define a general purpose exception handler. For example, you can specify the following:

    %exception {
      try {
        $action
      }
      catch (RangeError) {
        ... handle error ...
      }
    }
    

    How the exception is handled depends on the target language, for example, Python:

    %exception {
      try {
        $action
      }
      catch (RangeError) {
        PyErr_SetString(PyExc_IndexError, "index out-of-bounds");
        SWIG_fail;
      }
    }
    

    When defined, the code enclosed in braces is inserted directly into the low-level wrapper functions. The special variable $action is one of a few %exception special variables supported and gets replaced with the actual operation to be performed (a function call, method invocation, attribute access, etc.). An exception handler remains in effect until it is explicitly deleted. This is done by using either %exception or %noexception with no code. For example:

    %exception;   // Deletes any previously defined handler
    

    Compatibility note: Previous versions of SWIG used a special directive %except for exception handling. That directive is deprecated--%exception provides the same functionality, but is substantially more flexible.

    14.1.1 Handling exceptions in C code

    C has no formal exception handling mechanism so there are several approaches that might be used. A somewhat common technique is to simply set a special error code. For example:

    /* File : except.c */
    
    static char error_message[256];
    static int error_status = 0;
    
    void throw_exception(char *msg) {
      strncpy(error_message, msg, 256);
      error_status = 1;
    }
    
    void clear_exception() {
      error_status = 0;
    }
    char *check_exception() {
      if (error_status)
        return error_message;
      else
        return NULL;
    }
    
    

    To use these functions, functions simply call throw_exception() to indicate an error occurred. For example :

    double inv(double x) {
      if (x != 0)
        return 1.0/x;
      else {
        throw_exception("Division by zero");
        return 0;
      }
    }
    

    To catch the exception, you can write a simple exception handler such as the following (shown for Perl5) :

    %exception {
      char *err;
      clear_exception();
      $action
      if ((err = check_exception())) {
        croak(err);
      }
    }
    

    In this case, when an error occurs, it is translated into a Perl error. Each target language has its own approach to creating a runtime error/exception in and for Perl it is the croak method shown above.

    14.1.2 Exception handling with longjmp()

    Exception handling can also be added to C code using the <setjmp.h> library. Here is a minimalistic implementation that relies on the C preprocessor :

    /* File : except.c
       Just the declaration of a few global variables we're going to use */
    
    #include <setjmp.h>
    jmp_buf exception_buffer;
    int exception_status;
    
    /* File : except.h */
    #include <setjmp.h>
    extern jmp_buf exception_buffer;
    extern int exception_status;
    
    #define try if ((exception_status = setjmp(exception_buffer)) == 0)
    #define catch(val) else if (exception_status == val)
    #define throw(val) longjmp(exception_buffer, val)
    #define finally else
    
    /* Exception codes */
    
    #define RangeError     1
    #define DivisionByZero 2
    #define OutOfMemory    3
    
    

    Now, within a C program, you can do the following :

    double inv(double x) {
      if (x)
        return 1.0/x;
      else
        throw(DivisionByZero);
    }
    
    

    Finally, to create a SWIG exception handler, write the following :

    %{
    #include "except.h"
    %}
    
    %exception {
      try {
        $action
      } catch(RangeError) {
        croak("Range Error");
      } catch(DivisionByZero) {
        croak("Division by zero");
      } catch(OutOfMemory) {
        croak("Out of memory");
      } finally {
        croak("Unknown exception");
      }
    }
    

    Note: This implementation is only intended to illustrate the general idea. To make it work better, you'll need to modify it to handle nested try declarations.

    14.1.3 Handling C++ exceptions

    Handling C++ exceptions is also straightforward. For example:

    %exception {
      try {
        $action
      } catch(RangeError) {
        croak("Range Error");
      } catch(DivisionByZero) {
        croak("Division by zero");
      } catch(OutOfMemory) {
        croak("Out of memory");
      } catch(...) {
        croak("Unknown exception");
      }
    }
    
    

    The exception types need to be declared as classes elsewhere, possibly in a header file :

    class RangeError {};
    class DivisionByZero {};
    class OutOfMemory {};
    

    14.1.4 Exception handlers for variables

    By default all variables will ignore %exception, so it is effectively turned off for all variables wrappers. This applies to global variables, member variables and static member variables. The approach is certainly a logical one when wrapping variables in C. However, in C++, it is quite possible for an exception to be thrown while the variable is being assigned. To ensure %exception is used when wrapping variables, it needs to be 'turned on' using the %allowexception feature. Note that %allowexception is just a macro for %feature("allowexcept"), that is, it is a feature called "allowexcept". Any variable which has this feature attached to it, will then use the %exception feature, but of course, only if there is a %exception attached to the variable in the first place. The %allowexception feature works like any other feature and so can be used globally or for selective variables.

    %allowexception;                // turn on globally
    %allowexception Klass::MyVar;   // turn on for a specific variable
    
    %noallowexception Klass::MyVar; // turn off for a specific variable
    %noallowexception;              // turn off globally
    

    14.1.5 Defining different exception handlers

    By default, the %exception directive creates an exception handler that is used for all wrapper functions that follow it. Unless there is a well-defined (and simple) error handling mechanism in place, defining one universal exception handler may be unwieldy and result in excessive code bloat since the handler is inlined into each wrapper function.

    To fix this, you can be more selective about how you use the %exception directive. One approach is to only place it around critical pieces of code. For example:

    %exception {
      ... your exception handler ...
    }
    /* Define critical operations that can throw exceptions here */
    
    %exception;
    
    /* Define non-critical operations that don't throw exceptions */
    

    More precise control over exception handling can be obtained by attaching an exception handler to specific declaration name. For example:

    %exception allocate {
      try {
        $action
      }
      catch (MemoryError) {
        croak("Out of memory");
      }
    }
    

    In this case, the exception handler is only attached to declarations named "allocate". This would include both global and member functions. The names supplied to %exception follow the same rules as for %rename described in the section on Renaming and ambiguity resolution. For example, if you wanted to define an exception handler for a specific class, you might write this:

    %exception Object::allocate {
      try {
        $action
      }
      catch (MemoryError) {
        croak("Out of memory");
      }
    }
    

    When a class prefix is supplied, the exception handler is applied to the corresponding declaration in the specified class as well as for identically named functions appearing in derived classes.

    %exception can even be used to pinpoint a precise declaration when overloading is used. For example:

    %exception Object::allocate(int) {
      try {
        $action
      }
      catch (MemoryError) {
        croak("Out of memory");
      }
    }
    

    Attaching exceptions to specific declarations is a good way to reduce code bloat. It can also be a useful way to attach exceptions to specific parts of a header file. For example:

    %module example
    %{
    #include "someheader.h"
    %}
    
    // Define a few exception handlers for specific declarations
    %exception Object::allocate(int) {
      try {
        $action
      }
      catch (MemoryError) {
        croak("Out of memory");
      }
    }
    
    %exception Object::getitem {
      try {
        $action
      }
      catch (RangeError) {
        croak("Index out of range");
      }
    }
    ...
    // Read a raw header file
    %include "someheader.h"
    

    Compatibility note: The %exception directive replaces the functionality provided by the deprecated "except" typemap. The typemap would allow exceptions to be thrown in the target language based on the return type of a function and was intended to be a mechanism for pinpointing specific declarations. However, it never really worked that well and the new %exception directive is much better.

    14.1.6 Special variables for %exception

    The %exception directive supports a few special variables which are placeholders for code substitution. The following table shows the available special variables and details what the special variables are replaced with.

    $actionThe actual operation to be performed (a function call, method invocation, variable access, etc.)
    $nameThe C/C++ symbol name for the function.
    $symnameThe symbol name used internally by SWIG
    $overnameThe extra mangling used in the symbol name for overloaded method. Expands to nothing if the wrapped method is not overloaded.
    $wrapnameThe language specific wrapper name (usually a C function name exported from the shared object/dll)
    $declThe fully qualified C/C++ declaration of the method being wrapped without the return type
    $fulldeclThe fully qualified C/C++ declaration of the method being wrapped including the return type
    $parentclassnameThe parent class name (if any) for a method.
    $parentclasssymnameThe target language parent class name (if any) for a method.

    The special variables are often used in situations where method calls are logged. Exactly which form of the method call needs logging is up to individual requirements, but the example code below shows all the possible expansions, plus how an exception message could be tailored to show the C++ method declaration:

    %exception Special::something {
      log("symname: $symname");
      log("overname: $overname");
      log("wrapname: $wrapname");
      log("decl: $decl");
      log("fulldecl: $fulldecl");
      try {
        $action
      } 
      catch (MemoryError) {
        croak("Out of memory in $decl");
      }
    }
    void log(const char *message);
    struct Special {
      void something(const char *c);
      void something(int i);
    };
    

    Below shows the expansions for the 1st of the overloaded something wrapper methods for Perl:

      log("symname: Special_something");
      log("overname: __SWIG_0");
      log("wrapname: _wrap_Special_something__SWIG_0");
      log("decl: Special::something(char const *)");
      log("fulldecl: void Special::something(char const *)");
      try {
        (arg1)->something((char const *)arg2);
      } 
      catch (MemoryError) {
        croak("Out of memory in Special::something(char const *)");
      }
    

    14.1.7 Using The SWIG exception library

    The exception.i library file provides support for creating language independent exceptions in your interfaces. To use it, simply put an "%include exception.i" in your interface file. This provides a function SWIG_exception() that can be used to raise common scripting language exceptions in a portable manner. For example :

    // Language independent exception handler
    %include exception.i       
    
    %exception {
      try {
        $action
      } catch(RangeError) {
        SWIG_exception(SWIG_ValueError, "Range Error");
      } catch(DivisionByZero) {
        SWIG_exception(SWIG_DivisionByZero, "Division by zero");
      } catch(OutOfMemory) {
        SWIG_exception(SWIG_MemoryError, "Out of memory");
      } catch(...) {
        SWIG_exception(SWIG_RuntimeError, "Unknown exception");
      }
    }
    
    

    As arguments, SWIG_exception() takes an error type code (an integer) and an error message string. The currently supported error types are :

    SWIG_UnknownError
    SWIG_IOError
    SWIG_RuntimeError
    SWIG_IndexError
    SWIG_TypeError
    SWIG_DivisionByZero
    SWIG_OverflowError
    SWIG_SyntaxError
    SWIG_ValueError
    SWIG_SystemError
    SWIG_AttributeError
    SWIG_MemoryError
    SWIG_NullReferenceError
    

    The SWIG_exception() function can also be used in typemaps.

    14.2 Object ownership and %newobject

    A common problem in some applications is managing proper ownership of objects. For example, consider a function like this:

    Foo *blah() {
      Foo *f = new Foo();
      return f;
    }
    

    If you wrap the function blah(), SWIG has no idea that the return value is a newly allocated object. As a result, the resulting extension module may produce a memory leak (SWIG is conservative and will never delete objects unless it knows for certain that the returned object was newly created).

    To fix this, you can provide an extra hint to the code generator using the %newobject directive. For example:

    %newobject blah;
    Foo *blah();
    

    %newobject works exactly like %rename and %exception. In other words, you can attach it to class members and parameterized declarations as before. For example:

    %newobject ::blah();                   // Only applies to global blah
    %newobject Object::blah(int, double);  // Only blah(int, double) in Object
    %newobject *::copy;                    // Copy method in all classes
    ...
    

    When %newobject is supplied, many language modules will arrange to take ownership of the return value. This allows the value to be automatically garbage-collected when it is no longer in use. However, this depends entirely on the target language (a language module may also choose to ignore the %newobject directive).

    Closely related to %newobject is a special typemap. The "newfree" typemap can be used to deallocate a newly allocated return value. It is only available on methods for which %newobject has been applied and is commonly used to clean-up string results. For example:

    %typemap(newfree) char * "free($1);";
    ...
    %newobject strdup;
    ...
    char *strdup(const char *s);
    

    In this case, the result of the function is a string in the target language. Since this string is a copy of the original result, the data returned by strdup() is no longer needed. The "newfree" typemap in the example simply releases this memory.

    As a complement to the %newobject, from SWIG 1.3.28, you can use the %delobject directive. For example, if you have two methods, one to create objects and one to destroy them, you can use:

    %newobject create_foo;
    %delobject destroy_foo;
    ...
    Foo *create_foo();
    void destroy_foo(Foo *foo);
    

    or in a member method as:

    %delobject Foo::destroy;
    
    class Foo {
    public:
      void destroy() { delete this;}
    
    private:
      ~Foo();
    };
    

    %delobject instructs SWIG that the first argument passed to the method will be destroyed, and therefore, the target language should not attempt to deallocate it twice. This is similar to use the DISOWN typemap in the first method argument, and in fact, it also depends on the target language on implementing the 'disown' mechanism properly.

    The use of %newobject is also integrated with reference counting and is covered in the C++ reference counted objects section.

    Compatibility note: Previous versions of SWIG had a special %new directive. However, unlike %newobject, it only applied to the next declaration. For example:

    %new char *strdup(const char *s);
    

    For now this is still supported but is deprecated.

    How to shoot yourself in the foot: The %newobject directive is not a declaration modifier like the old %new directive. Don't write code like this:

    %newobject
    char *strdup(const char *s);
    

    The results might not be what you expect.

    14.3 Features and the %feature directive

    Both %exception and %newobject are examples of a more general purpose customization mechanism known as "features." A feature is simply a user-definable property that is attached to specific declarations. Features are attached using the %feature directive. For example:

    %feature("except") Object::allocate {
      try {
        $action
      }
      catch (MemoryError) {
        croak("Out of memory");
      }
    }
    
    %feature("new", "1") *::copy;
    

    In fact, the %exception and %newobject directives are really nothing more than macros involving %feature:

    #define %exception %feature("except")
    #define %newobject %feature("new", "1")
    

    The name matching rules outlined in the Renaming and ambiguity resolution section applies to all %feature directives. In fact the %rename directive is just a special form of %feature. The matching rules mean that features are very flexible and can be applied with pinpoint accuracy to specific declarations if needed. Additionally, if no declaration name is given, a global feature is said to be defined. This feature is then attached to every declaration that follows. This is how global exception handlers are defined. For example:

    /* Define a global exception handler */
    %feature("except") {
      try {
        $action
      }
      ...
    }
    
    ... bunch of declarations ...
    

    The %feature directive can be used with different syntax. The following are all equivalent:

    %feature("except") Object::method { $action };
    %feature("except") Object::method %{ $action %};
    %feature("except") Object::method " $action ";
    %feature("except", "$action") Object::method;
    

    The syntax in the first variation will generate the { } delimiters used whereas the other variations will not.

    14.3.1 Feature attributes

    The %feature directive also accepts XML style attributes in the same way that typemaps do. Any number of attributes can be specified. The following is the generic syntax for features:

    %feature("name", "value", attribute1="AttributeValue1") symbol;
    %feature("name", attribute1="AttributeValue1") symbol {value};
    %feature("name", attribute1="AttributeValue1") symbol %{value%};
    %feature("name", attribute1="AttributeValue1") symbol "value";
    

    More than one attribute can be specified using a comma separated list. The Java module is an example that uses attributes in %feature("except"). The throws attribute specifies the name of a Java class to add to a proxy method's throws clause. In the following example, MyExceptionClass is the name of the Java class for adding to the throws clause.

    %feature("except", throws="MyExceptionClass") Object::method { 
      try {
        $action
      } catch (...) {
        ... code to throw a MyExceptionClass Java exception ...
      }
    };
    

    Further details can be obtained from the Java exception handling section.

    14.3.2 Feature flags

    Feature flags are used to enable or disable a particular feature. Feature flags are a common but simple usage of %feature and the feature value should be either 1 to enable or 0 to disable the feature.

    %feature("featurename")          // enables feature
    %feature("featurename", "1")     // enables feature
    %feature("featurename", "x")     // enables feature
    %feature("featurename", "0")     // disables feature
    %feature("featurename", "")      // clears feature
    

    Actually any value other than zero will enable the feature. Note that if the value is omitted completely, the default value becomes 1, thereby enabling the feature. A feature is cleared by specifying no value, see Clearing features. The %immutable directive described in the Creating read-only variables section, is just a macro for %feature("immutable"), and can be used to demonstrates feature flags:

                                    // features are disabled by default
    int red;                        // mutable
    
    %feature("immutable");          // global enable
    int orange;                     // immutable
    
    %feature("immutable", "0");     // global disable
    int yellow;                     // mutable
    
    %feature("immutable", "1");     // another form of global enable
    int green;                      // immutable
    
    %feature("immutable", "");      // clears the global feature
    int blue;                       // mutable
    

    Note that features are disabled by default and must be explicitly enabled either globally or by specifying a targeted declaration. The above intersperses SWIG directives with C code. Of course you can target features explicitly, so the above could also be rewritten as:

    %feature("immutable", "1") orange;
    %feature("immutable", "1") green;
    int red;                        // mutable
    int orange;                     // immutable
    int yellow;                     // mutable
    int green;                      // immutable
    int blue;                       // mutable
    

    The above approach allows for the C declarations to be separated from the SWIG directives for when the C declarations are parsed from a C header file. The logic above can of course be inverted and rewritten as:

    %feature("immutable", "1");
    %feature("immutable", "0") red;
    %feature("immutable", "0") yellow;
    %feature("immutable", "0") blue;
    int red;                        // mutable
    int orange;                     // immutable
    int yellow;                     // mutable
    int green;                      // immutable
    int blue;                       // mutable
    

    As hinted above for %immutable, most feature flags can also be specified via alternative syntax. The alternative syntax is just a macro in the swig.swg Library file. The following shows the alternative syntax for the imaginary featurename feature:

    %featurename       // equivalent to %feature("featurename", "1") ie enables feature
    %nofeaturename     // equivalent to %feature("featurename", "0") ie disables feature
    %clearfeaturename  // equivalent to %feature("featurename", "")  ie clears feature
    

    The concept of clearing features is discussed next.

    14.3.3 Clearing features

    A feature stays in effect until it is explicitly cleared. A feature is cleared by supplying a %feature directive with no value. For example %feature("name", ""). A cleared feature means that any feature exactly matching any previously defined feature is no longer used in the name matching rules. So if a feature is cleared, it might mean that another name matching rule will apply. To clarify, let's consider the except feature again (%exception):

    // Define global exception handler
    %feature("except") {
      try {
        $action
      } catch (...) {
        croak("Unknown C++ exception");
      }
    }
    
    // Define exception handler for all clone methods to log the method calls
    %feature("except") *::clone() {
      try {
        logger.info("$action");
        $action
      } catch (...) {
        croak("Unknown C++ exception");
      }
    }
    
    ... initial set of class declarations with clone methods ...
    
    // clear the previously defined feature
    %feature("except", "") *::clone();
    
    ... final set of class declarations with clone methods ...
    

    In the above scenario, the initial set of clone methods will log all method invocations from the target language. This specific feature is cleared for the final set of clone methods. However, these clone methods will still have an exception handler (without logging) as the next best feature match for them is the global exception handler.

    Note that clearing a feature is not always the same as disabling it. Clearing the feature above with %feature("except", "") *::clone() is not the same as specifying %feature("except", "0") *::clone() . The former will disable the feature for clone methods - the feature is still a better match than the global feature. If on the other hand, no global exception handler had been defined at all, then clearing the feature would be the same as disabling it as no other feature would have matched.

    Note that the feature must match exactly for it to be cleared by any previously defined feature. For example the following attempt to clear the initial feature will not work:

    %feature("except") clone() { logger.info("$action"); $action }
    %feature("except", "") *::clone();
    

    but this will:

    %feature("except") clone() { logger.info("$action"); $action }
    %feature("except", "") clone();
    

    SWIG provides macros for disabling and clearing features. Many of these can be found in the swig.swg library file. The typical pattern is to define three macros; one to define the feature itself, one to disable the feature and one to clear the feature. The three macros below show this for the "except" feature:

    #define %exception      %feature("except")
    #define %noexception    %feature("except", "0")
    #define %clearexception %feature("except", "")
    

    14.3.4 Features and default arguments

    SWIG treats methods with default arguments as separate overloaded methods as detailed in the default arguments section. Any %feature targeting a method with default arguments will apply to all the extra overloaded methods that SWIG generates if the default arguments are specified in the feature. If the default arguments are not specified in the feature, then the feature will match that exact wrapper method only and not the extra overloaded methods that SWIG generates. For example:

    %feature("except") hello(int i=0, double d=0.0) { ... }
    void hello(int i=0, double d=0.0);
    

    will apply the feature to all three wrapper methods, that is:

    void hello(int i, double d);
    void hello(int i);
    void hello();
    

    If the default arguments are not specified in the feature:

    %feature("except") hello(int i, double d) { ... }
    void hello(int i=0, double d=0.0);
    

    then the feature will only apply to this wrapper method:

    void hello(int i, double d);
    

    and not these wrapper methods:

    void hello(int i);
    void hello();
    

    If compactdefaultargs are being used, then the difference between specifying or not specifying default arguments in a feature is not applicable as just one wrapper is generated.

    Compatibility note: The different behaviour of features specified with or without default arguments was introduced in SWIG-1.3.23 when the approach to wrapping methods with default arguments was changed.

    14.3.5 Feature example

    As has been shown earlier, the intended use for the %feature directive is as a highly flexible customization mechanism that can be used to annotate declarations with additional information for use by specific target language modules. Another example is in the Python module. You might use %feature to rewrite proxy/shadow class code as follows:

    %module example
    %rename(bar_id) bar(int, double);
    
    // Rewrite bar() to allow some nice overloading
    
    %feature("shadow") Foo::bar(int) %{
    def bar(*args):
        if len(args) == 3:
            return apply(examplec.Foo_bar_id, args)
        return apply(examplec.Foo_bar, args)
    %}
        
    class Foo {
    public:
      int bar(int x);
      int bar(int x, double y);
    }
    

    Further details of %feature usage is described in the documentation for specific language modules.


    15 Contracts

    A common problem that arises when wrapping C libraries is that of maintaining reliability and checking for errors. The fact of the matter is that many C programs are notorious for not providing error checks. Not only that, when you expose the internals of an application as a library, it often becomes possible to crash it simply by providing bad inputs or using it in a way that wasn't intended.

    This chapter describes SWIG's support for software contracts. In the context of SWIG, a contract can be viewed as a runtime constraint that is attached to a declaration. For example, you can easily attach argument checking rules, check the output values of a function and more. When one of the rules is violated by a script, a runtime exception is generated rather than having the program continue to execute.

    15.1 The %contract directive

    Contracts are added to a declaration using the %contract directive. Here is a simple example:

    %contract sqrt(double x) {
    require:
      x >= 0;
    ensure:
      sqrt >= 0;
    }
    
    ...
    double sqrt(double);
    

    In this case, a contract is being added to the sqrt() function. The %contract directive must always appear before the declaration in question. Within the contract there are two sections, both of which are optional. The require: section specifies conditions that must hold before the function is called. Typically, this is used to check argument values. The ensure: section specifies conditions that must hold after the function is called. This is often used to check return values or the state of the program. In both cases, the conditions that must hold must be specified as boolean expressions.

    In the above example, we're simply making sure that sqrt() returns a non-negative number (if it didn't, then it would be broken in some way).

    Once a contract has been specified, it modifies the behavior of the resulting module. For example:

    >>> example.sqrt(2)
    1.4142135623730951
    >>> example.sqrt(-2)
    Traceback (most recent call last):
      File "<stdin>", line 1, in ?
    RuntimeError: Contract violation: require: (arg1>=0)
    >>>
    

    15.2 %contract and classes

    The %contract directive can also be applied to class methods and constructors. For example:

    %contract Foo::bar(int x, int y) {
    require:
      x > 0;
    ensure:
      bar > 0;
    }
    
    %contract Foo::Foo(int a) {
    require:
      a > 0;
    }
    
    class Foo {
    public:
      Foo(int);
      int bar(int, int);
    };
    

    The way in which %contract is applied is exactly the same as the %feature directive. Thus, any contract that you specified for a base class will also be attached to inherited methods. For example:

    class Spam : public Foo {
    public:
      int bar(int, int);    // Gets contract defined for Foo::bar(int, int)
    };
    

    In addition to this, separate contracts can be applied to both the base class and a derived class. For example:

    %contract Foo::bar(int x, int) {
    require:
      x > 0;
    }
    
    %contract Spam::bar(int, int y) {
    require:
      y > 0;
    }
    
    class Foo {
    public:
      int bar(int, int);   // Gets Foo::bar contract.
    };
    
    class Spam : public Foo {
    public:
      int bar(int, int);   // Gets Foo::bar and Spam::bar contract
    };
    

    When more than one contract is applied, the conditions specified in a "require:" section are combined together using a logical-AND operation. In other words conditions specified for the base class and conditions specified for the derived class all must hold. In the above example, this means that both the arguments to Spam::bar must be positive.

    15.3 Constant aggregation and %aggregate_check

    Consider an interface file that contains the following code:

    #define  UP     1
    #define  DOWN   2
    #define  RIGHT  3
    #define  LEFT   4
    
    void move(SomeObject *, int direction, int distance);
    

    One thing you might want to do is impose a constraint on the direction parameter to make sure it's one of a few accepted values. To do that, SWIG provides an easy to use macro %aggregate_check() that works like this:

    %aggregate_check(int, check_direction, UP, DOWN, LEFT, RIGHT);
    

    This merely defines a utility function of the form

    int check_direction(int x);
    

    That checks the argument x to see if it is one of the values listed. This utility function can be used in contracts. For example:

    %aggregate_check(int, check_direction, UP, DOWN, RIGHT, LEFT);
    
    %contract move(SomeObject *, int direction, in) {
    require:
      check_direction(direction);
    }
    
    #define  UP     1
    #define  DOWN   2
    #define  RIGHT  3
    #define  LEFT   4
    
    void move(SomeObject *, int direction, int distance);
    

    Alternatively, it can be used in typemaps and other directives. For example:

    %aggregate_check(int, check_direction, UP, DOWN, RIGHT, LEFT);
    
    %typemap(check) int direction {
      if (!check_direction($1)) SWIG_exception(SWIG_ValueError, "Bad direction");
    }
    
    #define  UP     1
    #define  DOWN   2
    #define  RIGHT  3
    #define  LEFT   4
    
    void move(SomeObject *, int direction, int distance);
    

    Regrettably, there is no automatic way to perform similar checks with enums values. Maybe in a future release.

    15.4 Notes

    Contract support was implemented by Songyan (Tiger) Feng and first appeared in SWIG-1.3.20.


    16 Variable Length Arguments

    (a.k.a, "The horror. The horror.")

    This chapter describes the problem of wrapping functions that take a variable number of arguments. For instance, generating wrappers for the C printf() family of functions.

    This topic is sufficiently advanced to merit its own chapter. In fact, support for varargs is an often requested feature that was first added in SWIG-1.3.12. Most other wrapper generation tools have wisely chosen to avoid this issue.

    16.1 Introduction

    Some C and C++ programs may include functions that accept a variable number of arguments. For example, most programmers are familiar with functions from the C library such as the following:

    int printf(const char *fmt, ...)
    int fprintf(FILE *, const char *fmt, ...);
    int sprintf(char *s, const char *fmt, ...);
    

    Although there is probably little practical purpose in wrapping these specific C library functions in a scripting language (what would be the point?), a library may include its own set of special functions based on a similar API. For example:

    int  traceprintf(const char *fmt, ...);
    

    In this case, you may want to have some kind of access from the target language.

    Before describing the SWIG implementation, it is important to discuss the common uses of varargs that you are likely to encounter in real programs. Obviously, there are the printf() style output functions as shown. Closely related to this would be scanf() style input functions that accept a format string and a list of pointers into which return values are placed. However, variable length arguments are also sometimes used to write functions that accept a NULL-terminated list of pointers. A good example of this would be a function like this:

    int execlp(const char *path, const char *arg1, ...);
    ...
    
    /* Example */
    execlp("ls", "ls", "-l", NULL);
    

    In addition, varargs is sometimes used to fake default arguments in older C libraries. For instance, the low level open() system call is often declared as a varargs function so that it will accept two or three arguments:

    int open(const char *path, int oflag, ...);
    ...
    
    /* Examples */
    f = open("foo", O_RDONLY);
    g = open("bar", O_WRONLY | O_CREAT, 0644);
    

    Finally, to implement a varargs function, recall that you have to use the C library functions defined in <stdarg.h>. For example:

    List make_list(const char *s, ...) {
      va_list ap;
      List    x;
      ...
      va_start(ap, s);
      while (s) {
        x.append(s);
        s = va_arg(ap, const char *);
      }
      va_end(ap);
      return x;
    }
    

    16.2 The Problem

    Generating wrappers for a variable length argument function presents a number of special challenges. Although C provides support for implementing functions that receive variable length arguments, there are no functions that can go in the other direction. Specifically, you can't write a function that dynamically creates a list of arguments and which invokes a varargs function on your behalf.

    Although it is possible to write functions that accept the special type va_list, this is something entirely different. You can't take a va_list structure and pass it in place of the variable length arguments to another varargs function. It just doesn't work.

    The reason this doesn't work has to do with the way that function calls get compiled. For example, suppose that your program has a function call like this:

    printf("Hello %s. Your number is %d\n", name, num);
    

    When the compiler looks at this, it knows that you are calling printf() with exactly three arguments. Furthermore, it knows that the number of arguments as well are their types and sizes is never going to change during program execution. Therefore, this gets turned to machine code that sets up a three-argument stack frame followed by a call to printf().

    In contrast, suppose you attempted to make some kind of wrapper around printf() using code like this:

    int wrap_printf(const char *fmt, ...) {
      va_list ap;
      va_start(ap, fmt);
      ...
      printf(fmt, ap);
      ...
      va_end(ap);
    };
    

    Although this code might compile, it won't do what you expect. This is because the call to printf() is compiled as a procedure call involving only two arguments. However, clearly a two-argument configuration of the call stack is completely wrong if your intent is to pass an arbitrary number of arguments to the real printf(). Needless to say, it won't work.

    Unfortunately, the situation just described is exactly the problem faced by wrapper generation tools. In general, the number of passed arguments will not be known until run-time. To make matters even worse, you won't know the types and sizes of arguments until run-time as well. Needless to say, there is no obvious way to make the C compiler generate code for a function call involving an unknown number of arguments of unknown types.

    In theory, it is possible to write a wrapper that does the right thing. However, this involves knowing the underlying ABI for the target platform and language as well as writing special purpose code that manually constructed the call stack before making a procedure call. Unfortunately, both of these tasks require the use of inline assembly code. Clearly, that's the kind of solution you would much rather avoid.

    With this nastiness in mind, SWIG provides a number of solutions to the varargs wrapping problem. Most of these solutions are compromises that provide limited varargs support without having to resort to assembly language. However, SWIG can also support real varargs wrapping (with stack-frame manipulation) if you are willing to get hands dirty. Keep reading.

    16.3 Default varargs support

    When variable length arguments appear in an interface, the default behavior is to drop the variable argument list entirely, replacing them with a single NULL pointer. For example, if you had this function,

    void traceprintf(const char *fmt, ...);
    

    it would be wrapped as if it had been declared as follows:

    void traceprintf(const char *fmt);
    

    When the function is called inside the wrappers, it is called as follows:

    traceprintf(arg1, NULL);
    

    Arguably, this approach seems to defeat the whole point of variable length arguments. However, this actually provides enough support for many simple kinds of varargs functions to still be useful, however it does come with a caveat. For instance, you could make function calls like this (in Python):

    >>> traceprintf("Hello World")
    >>> traceprintf("Hello %s. Your number is %d\n" % (name, num))
    >>> traceprintf("Your result is 90%%.")
    

    Notice how string formatting is being done in Python instead of C. The caveat is the strings passed must be safe to use in C though. For example if name was to contain a "%" it should be double escaped in order to avoid unpredictable behaviour:

    >>> traceprintf("Your result is 90%.\n")  # unpredictable behaviour
    >>> traceprintf("Your result is 90%%.\n") # good
    

    Read on for further solutions.

    16.4 Argument replacement using %varargs

    Instead of dropping the variable length arguments, an alternative approach is to replace (...) with a set of suitable arguments. SWIG provides a special %varargs directive that can be used to do this. For example,

    %varargs(int mode = 0) open;
    ...
    int open(const char *path, int oflags, ...);
    

    is equivalent to this:

    int open(const char *path, int oflags, int mode = 0);
    

    In this case, %varargs is simply providing more specific information about the extra arguments that might be passed to a function. If the arguments to a varargs function are of uniform type, %varargs can also accept a numerical argument count as follows:

    %varargs(3, char *str = NULL) execlp;
    ...
    int execlp(const char *path, const char *arg, ...);
    

    and is effectively seen as:

    int execlp(const char *path, const char *arg, 
               char *str1 = NULL, 
               char *str2 = NULL, 
               char *str3 = NULL);
    

    This would wrap execlp() as a function that accepted up to 3 optional arguments. Depending on the application, this may be more than enough for practical purposes.

    The handling of default arguments can be changed via the compactdefaultargs feature. If this feature is used, for example

    %feature("compactdefaultargs") execlp;
    %varargs(3, char *str = NULL) execlp;
    ...
    int execlp(const char *path, const char *arg, ...);
    

    a call from the target language which does not provide the maximum number of arguments, such as, execlp("a", "b", "c") will generate C code which includes the missing default values, that is, execlp("a", "b", "c", NULL, NULL). If compactdefaultargs is not used, then the generated code will be execlp("a", "b", "c") . The former is useful for helping providing a sentinel to terminate the argument list. However, this is not guaranteed, for example when a user passes a non-NULL value for all the parameters. When using compactdefaultargs it is possible to guarantee the NULL sentinel is passed through the, numinputs=0 'in' typemap attribute, naming the last parameter. For example,

    %feature("compactdefaultargs") execlp;
    %varargs(3, char *str = NULL) execlp;
    %typemap(in, numinputs=0) char *str3 ""
    ...
    int execlp(const char *path, const char *arg, ...);
    

    Note that str3 is the name of the last argument, as we have used %varargs with 3. Now execlp("a", "b", "c", "d", "e") will result in an error as one too many arguments has been passed, as now only 2 additional 'str' arguments can be passed with the 3rd one always using the specified default NULL.

    Argument replacement is most appropriate in cases where the types of the extra arguments are uniform and the maximum number of arguments are known. Argument replacement is not as useful when working with functions that accept mixed argument types such as printf(). Providing general purpose wrappers to such functions presents special problems (covered shortly).

    16.5 Varargs and typemaps

    Variable length arguments may be used in typemap specifications. For example:

    %typemap(in) (...) {
      // Get variable length arguments (somehow)
      ...
    }
    
    %typemap(in) (const char *fmt, ...) {
        // Multi-argument typemap
    }
    

    However, this immediately raises the question of what "type" is actually used to represent (...). For lack of a better alternative, the type of (...) is set to void *. Since there is no way to dynamically pass arguments to a varargs function (as previously described), the void * argument value is intended to serve as a place holder for storing some kind of information about the extra arguments (if any). In addition, the default behavior of SWIG is to pass the void * value as an argument to the function. Therefore, you could use the pointer to hold a valid argument value if you wanted.

    To illustrate, here is a safer version of wrapping printf() in Python:

    %typemap(in) (const char *fmt, ...) {
        $1 = "%s";                                /* Fix format string to %s */
        $2 = (void *) PyString_AsString($input);  /* Get string argument */
    };
    ...
    int printf(const char *fmt, ...);
    

    In this example, the format string is implicitly set to "%s" . This prevents a program from passing a bogus format string to the extension. Then, the passed input object is decoded and placed in the void * argument defined for the (...) argument. When the actual function call is made, the underlying wrapper code will look roughly like this:

    wrap_printf() {
      char *arg1;
      void *arg2;
      int   result;
    
      arg1 = "%s";
      arg2 = (void *) PyString_AsString(arg2obj);
      ...
      result = printf(arg1, arg2);
      ...
    }
    

    Notice how both arguments are passed to the function and it does what you would expect.

    The next example illustrates a more advanced kind of varargs typemap. Disclaimer: this requires special support in the target language module and is not guaranteed to work with all SWIG modules at this time. It also starts to illustrate some of the more fundamental problems with supporting varargs in more generality.

    If a typemap is defined for any form of (...), many SWIG modules will generate wrappers that accept a variable number of arguments as input and will make these arguments available in some form. The precise details of this depends on the language module being used (consult the appropriate chapter for more details). However, suppose that you wanted to create a Python wrapper for the execlp() function shown earlier. To do this using a typemap instead of using %varargs, you might first write a typemap like this:

    %typemap(in) (...)(char *vargs[10]) {
      int i;
      int argc;
      for (i = 0; i < 10; i++) vargs[i] = 0;
      argc = PyTuple_Size(varargs);
      if (argc > 10) {
        PyErr_SetString(PyExc_ValueError, "Too many arguments");
        SWIG_fail;
      }
      for (i = 0; i < argc; i++) {
        PyObject *pyobj = PyTuple_GetItem(varargs, i);
        char *str = 0;
    %#if PY_VERSION_HEX>=0x03000000
        PyObject *pystr;
        if (!PyUnicode_Check(pyobj)) {
          PyErr_SetString(PyExc_ValueError, "Expected a string");
          SWIG_fail;
        }
        pystr = PyUnicode_AsUTF8String(pyobj);
        if (!pystr) {
          SWIG_fail;
        }
        str = strdup(PyBytes_AsString(pystr));
        Py_DECREF(pystr);
    %#else  
        if (!PyString_Check(pyobj)) {
          PyErr_SetString(PyExc_ValueError, "Expected a string");
          SWIG_fail;
        }
        str = PyString_AsString(pyobj);
    %#endif
        vargs[i] = str;
      }
      $1 = (void *)vargs;
    }
    
    %typemap(freearg) (...) {
    %#if PY_VERSION_HEX>=0x03000000
      int i;
      for (i = 0; i < 10; i++) {
        free(vargs$argnum[i]);
      }
    %#endif
    }
    

    In the 'in' typemap, the special variable varargs is a tuple holding all of the extra arguments passed (this is specific to the Python module). The typemap then pulls this apart and sticks the values into the array of strings args. Then, the array is assigned to $1 (recall that this is the void * variable corresponding to (...)). However, this assignment is only half of the picture----clearly this alone is not enough to make the function work. The 'freearg' typemap cleans up memory allocated in the 'in' typemap; this code is generated to be called after the execlp function is called. To patch everything up, you have to rewrite the underlying action code using the %feature directive like this:

    %feature("action") execlp {
      char **vargs = (char **) arg3;
      result = execlp(arg1, arg2, vargs[0], vargs[1], vargs[2], vargs[3], vargs[4],
                      vargs[5], vargs[6], vargs[7], vargs[8], vargs[9], NULL);
    }
    
    int execlp(const char *path, const char *arg, ...);
    

    This patches everything up and creates a function that more or less works. However, don't try explaining this to your coworkers unless you know for certain that they've had several cups of coffee. If you really want to elevate your guru status and increase your job security, continue to the next section.

    16.6 Varargs wrapping with libffi

    All of the previous examples have relied on features of SWIG that are portable and which don't rely upon any low-level machine-level details. In many ways, they have all dodged the real issue of variable length arguments by recasting a varargs function into some weaker variation with a fixed number of arguments of known types. In many cases, this works perfectly fine. However, if you want more generality than this, you need to bring out some bigger guns.

    One way to do this is to use a special purpose library such as libffi ( http://www.sourceware.org/libffi/). libffi is a library that allows you to dynamically construct call-stacks and invoke procedures in a relatively platform independent manner. Details about the library can be found in the libffi distribution and are not repeated here.

    To illustrate the use of libffi, suppose that you really wanted to create a wrapper for execlp() that accepted any number of arguments. To do this, you might make a few adjustments to the previous example. For example:

    /* Take an arbitrary number of extra arguments and place into an array
       of strings */
    
    %typemap(in) (...) {
      char **argv;
      int    argc;
      int    i;
    
      argc = PyTuple_Size(varargs);
      argv = (char **) malloc(sizeof(char *)*(argc+1));
      for (i = 0; i < argc; i++) {
        PyObject *o = PyTuple_GetItem(varargs, i);
        if (!PyString_Check(o)) {
          free(argv);
          PyErr_SetString(PyExc_ValueError, "Expected a string");
          SWIG_fail;
        }
        argv[i] = PyString_AsString(o);
      }
      argv[i] = NULL;
      $1 = (void *) argv;
    }
    
    /* Rewrite the function call, using libffi */    
    
    %feature("action") execlp {
      int       i, vc;
      ffi_cif   cif;
      ffi_type  **types;
      void      **values;
      char      **args;
    
      vc = PyTuple_Size(varargs);
      types  = (ffi_type **) malloc((vc+3)*sizeof(ffi_type *));
      values = (void **) malloc((vc+3)*sizeof(void *));
      args   = (char **) arg3;
    
      /* Set up path parameter */
      types[0] = &ffi_type_pointer;
      values[0] = &arg1;
      
      /* Set up first argument */
      types[1] = &ffi_type_pointer;
      values[1] = &arg2;
    
      /* Set up rest of parameters */
      for (i = 0; i <= vc; i++) {
        types[2+i] = &ffi_type_pointer;
        values[2+i] = &args[i];
      }
      if (ffi_prep_cif(&cif, FFI_DEFAULT_ABI, vc+3,
                       &ffi_type_uint, types) == FFI_OK) {
        ffi_call(&cif, (void (*)()) execlp, &result, values);
      } else {
        free(types);
        free(values);
        free(arg3);
        PyErr_SetString(PyExc_RuntimeError, "Whoa!!!!!");
        SWIG_fail;
      }
      free(types);
      free(values);
      free(arg3);
    }
    
    /* Declare the function. Whew! */
    int execlp(const char *path, const char *arg1, ...);
    

    Looking at this example, you may start to wonder if SWIG is making life any easier. Given the amount of code involved, you might also wonder why you didn't just write a hand-crafted wrapper! Either that or you're wondering "why in the hell am I trying to wrap this varargs function in the first place?!?" Obviously, those are questions you'll have to answer for yourself.

    As a more extreme example of libffi, here is some code that attempts to wrap printf(),

    /* A wrapper for printf() using libffi */
    
    %{
    /* Structure for holding passed arguments after conversion */
      typedef struct {
        int type;
        union {
          int    ivalue;
          double dvalue;
          void   *pvalue;
        } val;
      } vtype;
      enum { VT_INT, VT_DOUBLE, VT_POINTER };
    %}
    
    %typemap(in) (const char *fmt, ...) {
      vtype *argv;
      int    argc;
      int    i;
    
      /* Format string */
      $1 = PyString_AsString($input);
    
      /* Variable length arguments */
      argc = PyTuple_Size(varargs);
      argv = (vtype *) malloc(argc*sizeof(vtype));
      for (i = 0; i < argc; i++) {
        PyObject *o = PyTuple_GetItem(varargs, i);
        if (PyInt_Check(o)) {
          argv[i].type = VT_INT;
          argv[i].val.ivalue = PyInt_AsLong(o);
        } else if (PyFloat_Check(o)) {
          argv[i].type = VT_DOUBLE;
          argv[i].val.dvalue = PyFloat_AsDouble(o);
        } else if (PyString_Check(o)) {
          argv[i].type = VT_POINTER;
          argv[i].val.pvalue = (void *) PyString_AsString(o);
        } else {
          free(argv);
          PyErr_SetString(PyExc_ValueError, "Unsupported argument type");
          return NULL;
        }
      }
      $2 = (void *) argv;
    }
    
    /* Rewrite the function call using libffi */    
    %feature("action") printf {
      int       i, vc;
      ffi_cif   cif;
      ffi_type  **types;
      void      **values;
      vtype     *args;
    
      vc = PyTuple_Size(varargs);
      types  = (ffi_type **) malloc((vc+1)*sizeof(ffi_type *));
      values = (void **) malloc((vc+1)*sizeof(void *));
      args   = (vtype *) arg2;
    
      /* Set up fmt parameter */
      types[0] = &ffi_type_pointer;
      values[0] = &arg1;
    
      /* Set up rest of parameters */
      for (i = 0; i < vc; i++) {
        switch(args[i].type) {
        case VT_INT:
          types[1+i] = &ffi_type_uint;
          values[1+i] = &args[i].val.ivalue;
          break;
        case VT_DOUBLE:
          types[1+i] = &ffi_type_double;
          values[1+i] = &args[i].val.dvalue;
          break;
        case VT_POINTER:
          types[1+i] = &ffi_type_pointer;
          values[1+i] = &args[i].val.pvalue;
          break;
        default:
          abort();    /* Whoa! We're seriously hosed */
          break;   
        }
      }
      if (ffi_prep_cif(&cif, FFI_DEFAULT_ABI, vc+1,
                       &ffi_type_uint, types) == FFI_OK) {
        ffi_call(&cif, (void (*)()) printf, &result, values);
      } else {
        free(types);
        free(values);
        free(args);
        PyErr_SetString(PyExc_RuntimeError, "Whoa!!!!!");
        SWIG_fail;
      }
      free(types);
      free(values);
      free(args);
    }
    
    /* The function */
    int printf(const char *fmt, ...);
    

    Much to your amazement, it even seems to work if you try it:

    >>> import example
    >>> example.printf("Grade: %s   %d/60 = %0.2f%%\n", "Dave", 47, 47.0*100/60)
    Grade: Dave   47/60 = 78.33%
    >>>
    

    Of course, there are still some limitations to consider:

    >>> example.printf("la de da de da %s", 42)
    Segmentation fault (core dumped)
    

    And, on this note, we leave further exploration of libffi to the reader as an exercise. Although Python has been used as an example, most of the techniques in this section can be extrapolated to other language modules with a bit of work. The only details you need to know is how the extra arguments are accessed in each target language. For example, in the Python module, we used the special varargs variable to get these arguments. Modules such as Tcl8 and Perl5 simply provide an argument number for the first extra argument. This can be used to index into an array of passed arguments to get values. Please consult the chapter on each language module for more details.

    16.7 Wrapping of va_list

    Closely related to variable length argument wrapping, you may encounter functions that accept a parameter of type va_list. For example:

    int vprintf(const char *fmt, va_list ap);
    

    As far as we know, there is no obvious way to wrap these functions with SWIG. This is because there is no documented way to assemble the proper va_list structure (there are no C library functions to do it and the contents of va_list are opaque). Not only that, the contents of a va_list structure are closely tied to the underlying call-stack. It's not clear that exporting a va_list would have any use or that it would work at all.

    A workaround can be implemented by writing a simple varargs C wrapper and then using the techniques discussed earlier in this chapter for varargs. Below is a simple wrapper for vprintf renamed so that it can still be called as vprintf from your target language. The %varargs used in the example restricts the function to taking one string argument.

    %{
    int vprintf(const char *fmt, va_list ap);
    %}
    
    %varargs(const char *) my_vprintf;
    %rename(vprintf) my_vprintf;
    
    %inline %{
    int my_vprintf(const char *fmt, ...) {
      va_list ap;
      int result;
    
      va_start(ap, fmt);
      result = vprintf(fmt, ap);
      va_end(ap);
      return result;
    }
    %}
    

    16.8 C++ Issues

    Wrapping of C++ member functions that accept a variable number of arguments presents a number of challenges. By far, the easiest way to handle this is to use the %varargs directive. This is portable and it fully supports classes much like the %rename directive. For example:

    %varargs (10, char * = NULL) Foo::bar;
    
    class Foo {
    public:
      virtual void bar(char *arg, ...);   // gets varargs above
    };
    
    class Spam: public Foo {
    public:
      virtual void bar(char *arg, ...);   // gets varargs above
    };
    

    %varargs also works with constructors, operators, and any other C++ programming construct that accepts variable arguments.

    Doing anything more advanced than this is likely to involve a serious world of pain. In order to use a library like libffi, you will need to know the underlying calling conventions and details of the C++ ABI. For instance, the details of how this is passed to member functions as well as any hidden arguments that might be used to pass additional information. These details are implementation specific and may differ between compilers and even different versions of the same compiler. Also, be aware that invoking a member function is further complicated if it is a virtual method. In this case, invocation might require a table lookup to obtain the proper function address (although you might be able to obtain an address by casting a bound pointer to a pointer to function as described in the C++ ARM section 18.3.4).

    If you do decide to change the underlying action code, be aware that SWIG always places the this pointer in arg1. Other arguments are placed in arg2, arg3, and so forth. For example:

    %feature("action") Foo::bar {
      ...
      result = arg1->bar(arg2, arg3, etc.);
      ...
    }
    

    Given the potential to shoot yourself in the foot, it is probably easier to reconsider your design or to provide an alternative interface using a helper function than it is to create a fully general wrapper to a varargs C++ member function.

    16.9 Discussion

    This chapter has provided a number of techniques that can be used to address the problem of variable length argument wrapping. If you care about portability and ease of use, the %varargs directive is probably the easiest way to tackle the problem. However, using typemaps, it is possible to do some very advanced kinds of wrapping.

    One point of discussion concerns the structure of the libffi examples in the previous section. Looking at that code, it is not at all clear that this is the easiest way to solve the problem. However, there are a number of subtle aspects of the solution to consider--mostly concerning the way in which the problem has been decomposed. First, the example is structured in a way that tries to maintain separation between wrapper-specific information and the declaration of the function itself. The idea here is that you might structure your interface like this:

    %typemap(const char *fmt, ...) {
      ...
    }
    %feature("action") traceprintf {
      ...
    }
    
    /* Include some header file with traceprintf in it */
    %include "someheader.h"
    

    Second, careful scrutiny will reveal that the typemaps involving (...) have nothing whatsoever to do with the libffi library. In fact, they are generic with respect to the way in which the function is actually called. This decoupling means that it will be much easier to consider other library alternatives for making the function call. For instance, if libffi wasn't supported on a certain platform, you might be able to use something else instead. You could use conditional compilation to control this:

    #ifdef USE_LIBFFI
    %feature("action") printf {
      ...
    }
    #endif
    #ifdef USE_OTHERFFI
    %feature("action") printf {
    ...
    }
    #endif
    

    Finally, even though you might be inclined to just write a hand-written wrapper for varargs functions, the techniques used in the previous section have the advantage of being compatible with all other features of SWIG such as exception handling.

    As a final word, some C programmers seem to have the assumption that the wrapping of variable length argument functions is an easily solved problem. However, this section has hopefully dispelled some of these myths. All things being equal, you are better off avoiding variable length arguments if you can. If you can't avoid them, please consider some of the simple solutions first. If you can't live with a simple solution, proceed with caution. At the very least, make sure you carefully read the section "A7.3.2 Function Calls" in Kernighan and Ritchie and make sure you fully understand the parameter passing conventions used for varargs. Also, be aware of the platform dependencies and reliability issues that this will introduce. Good luck.


    17 SWIG and Doxygen Translation

    This chapter describes SWIG's support for translating Doxygen comments found in interface and header files into a target language's normal documentation language. Currently only Javadoc and Pydoc is supported.

    17.1 Doxygen translation overview

    The Doxygen Translation module of SWIG adds an extra layer of functionality to SWIG, allowing automated translation of Doxygen formatted comments from input files into a documentation language more suited for the target language. Currently this module only translates into Javadoc and Pydoc for the SWIG Java and Python modules. Other extensions could be added at a later date. The Doxygen Translation module originally started as a Google Summer of Code proposal from Summer 2008.

    17.2 Preparations

    To make use of the comment translation system, your documentation comments must be in properly formatted Doxygen. Doxygen comments can be present in your main SWIG interface file or any header file that it imports. You are advised to be validate that your comments compile properly with Doxygen before you try to translate them. Doxygen itself is a more comprehensive tool and can provide you better feedback for correcting any syntax errors that may be present. Please look at Doxygen's Documenting the code for the full comment format specifications. However, SWIG's Doxygen parser will still report many errors and warnings found in comments (like unterminated strings or missing ending tags).

    Currently, the whole subset of Doxygen comment styles is supported (See Documenting the code). Here they are:

    /**
     * Javadoc style comment, multiline
     */
    /*!
     * QT-style comment, multiline
     */
    /**
     Any of the above, but without intermediate *'s
     */
    /// Single-line comment
    //! Another single-line comment
    

    Also any of the above with '<' added after comment-starting symbol, like /**<, /*!<, ///<, or //!< will be treated as a post-comment and will be assigned to the code before the comment. Any number of '*' or '/' within a Doxygen comment is considered to be a separator and is not included in the final comment, so you may safely use comments like /*********/ or //////////.

    Please note, as SWIG parses the input file by itself with strict grammar, there is only a limited support for various cases of comment placement in the file.

    Comments can be placed before C/C++ expressions on separate lines:

    /**
     * Some comment
     */
    void someOtherFunction();
    /**
     * Some comment
     */
    void someFunction();
    
    class Shape {
      /*
       * Calculate the area in cm^2
       */
      int getArea();
    }
    

    After C/C++ expressions at the end of the line:

    int someVariable = 9; ///< This is a var holding magic number 9
    void doNothing(); ///< This does nothing, nop
    

    and in some special cases, like function parameter comments:

    void someFunction(
             int a ///< Some parameter 
         );
    

    or enum element comments:

    enum E_NUMBERS
    {
        EN_ZERO, ///< The first enum item, gets zero as it's value
        EN_ONE, ///< The second, EN_ONE=1
        EN_THREE
    };
    

    Currently only comments directly before or after the code items are supported. Doxygen also supports comments containing structural commands, where the comments for a code item are not put directly before or after the code item. These structural commands are stripped out by SWIG and are not assigned to anything.

    17.2.1 Enabling Doxygen translation

    Doxygen comments translation is disabled by default and needs to be explicitly enabled using the command line -doxygen option for the languages that do support it (currently Java and Python).

    17.2.2 Doxygen-specific %feature directives

    Translation of Doxygen comments is influenced by the following %feature directives:

    17.2.2.1 doxygen:notranslate

    Turns off translation of Doxygen comments to the target language syntax: the original comment will be copied to the output unchanged. This is useful if you want to use Doxygen itself to generate documentation for the target language instead of the corresponding language tool (javadoc, sphinx, ...).

    17.2.2.2 doxygen:alias:<command-name>

    Specify an alias for a Doxygen command with the given name. This can be useful for custom Doxygen commands which can be defined using ALIASES option for Doxygen itself but which are unknown to SWIG. "command-name" is the name of the command in the Doxyfile, e.g. if it contains

    ALIASES = "sideeffect=\par Side Effects:\n"
    

    Then you could also specify the same expansion for SWIG with:

    %feature("doxygen:alias:sideeffect") "\par Side Effects:\n"
    

    Please note that command arguments are not currently supported with this feature.

    Notice that it is perfectly possible and potentially useful to define the alias expansion differently depending on the target language, e.g. with

    #ifdef SWIGJAVA
    %feature("doxygen:alias:not_for_java") "This functionality is not available for Java"
    #else
    %feature("doxygen:alias:not_for_java") ""
    #endif
    

    you could use @not_for_java in the documentation comments of all functions which can't, for whatever reason, be currently exposed in Java wrappers of the C++ API.

    17.2.2.3 doxygen:ignore:<command-name>

    This feature makes it possible to just ignore an unknown Doxygen command, instead of replacing it with the predefined text that doxygen:alias does. For example, you could use

    %feature("doxygen:ignore:transferfull") Fantastic();
    /**
        A fantastic function.
    
        @transferfull Command ignored, but anything here is still included.
     */
    int * Fantastic();
    

    if you use a custom Doxygen transferfull command to indicate that the return value ownership is transferred to the caller, as this information doesn't make much sense for the other languages without explicit ownership management.

    Doxygen syntax is rather rich and, in addition to simple commands such as @transferfull, it is also possible to define commands with arguments. As explained in Doxygen documentation, the arguments can have a range of a single word, everything until the end of line or everything until the end of the next paragraph. Currently, only the "end of line" case is supported using the range="line" argument of the feature directive:

    // Ignore occurrences of
    //
    //    @compileroptions Some special C++ compiler options.
    //
    // in Doxygen comments as C++ options are not interesting for the target language
    // developers.
    %feature("doxygen:ignore:compileroptions", range="line") Amazing();
    
    /**
        An amazing function.
    
        @compileroptions This function must be compiled with /EHa when using MSVC.
     */
    void Amazing();
    
    

    In addition, it is also possible to have custom pairs of begin/end tags, similarly to the standard Doxygen @code/@endcode, for example. Such tags can also be ignored using the special value of range starting with end to indicate that the range is an interval, for example:

    %feature("doxygen:ignore:forcpponly", range="end"); // same as "end:endforcpponly"
    /**
        An incredible function.
    
        @forcpponly
        This is C++-specific.
        @endforcpponly
     */
    void Incredible();
    

    would ignore everything between @forcpponly and @endforcpponly commands in Doxygen comments. By default, the name of the end command is the same as of the start one with "end" prefix, following Doxygen conventions, but this can be overridden by providing the end command name after the colon.

    This example shows how custom tags can be used to bracket anything specific to C++ and prevent it from appearing in the target language documentation. Conversely, another pair of custom tags could be used to put target language specific information in the C++ comments. In this case, only the custom tags themselves should be ignored, but their contents should be parsed as usual and contents="parse" can be used for this:

    %feature("doxygen:ignore:beginPythonOnly", range="end:endPythonOnly", contents="parse");
    /**
        A splendid function.
    
        @beginPythonOnly
        This is specific to @b Python.
        @endPythonOnly
     */
    void Splendid();
    
    

    Putting everything together, if these directives are in effect:

    %feature("doxygen:ignore:transferfull");
    %feature("doxygen:ignore:compileroptions", range="line");
    %feature("doxygen:ignore:forcpponly", range="end");
    %feature("doxygen:ignore:beginPythonOnly", range="end:endPythonOnly", contents="parse");
    

    then the following C++ Doxygen comment:

    /**
        A contrived example of ignoring too many commands in one comment.
    
        @forcpponly
        This is C++-specific.
        @endforcpponly
    
        @beginPythonOnly
        This is specific to @b Python.
        @endPythonOnly
    
        @transferfull Command ignored, but anything here is still included.
    
        @compileroptions This function must be compiled with /EHa when using MSVC.
     */
    int * Contrived();
    

    would be translated to this comment in Python:

    def func():
        r"""
        A contrived example of ignoring too many commands in one comment.
    
        This is specific to **Python**.
    
        Command ignored, but anything here is still included.
        """
        ...
    

    17.2.2.4 doxygen:nolinktranslate

    Turn off automatic link-objects translation. This is only applicable to Java at the moment.

    17.2.2.5 doxygen:nostripparams

    Turn off stripping of @param and @tparam Doxygen commands if the parameter is not found in the function signature. This is only applicable to Java at the moment.

    17.2.3 Additional command line options

    ALSO TO BE ADDED (Javadoc auto brief?)

    17.3 Doxygen to Javadoc

    If translation is enabled, Javadoc formatted comments should be automatically placed in the correct locations in the resulting module and proxy files.

    17.3.1 Basic example

    Here is an example segment from an included header file

    /*! This is describing class Shape
     \author Bob
     */
    
    class Shape {
    public:
      Shape() {
        nshapes++;
      }
      virtual ~Shape() {
        nshapes--;
      };
      double  x, y; /*!< Important Variables */
      void    move(double dx, double dy); /*!< Moves the Shape */
      virtual double area(void) = 0; /*!< \return the area */
      virtual double perimeter(void) = 0; /*!< \return the perimeter */
      static  int nshapes;
    };
    

    Simply running SWIG should result in the following code being present in Shapes.java

    
    /**
     * This is describing class Shape 
     * @author Bob 
     * 
     */
    
    public class Shape {
    
    ...
    
    /**
     * Important Variables 
     */
      public void setX(double value) {
        ShapesJNI.Shape_x_set(swigCPtr, this, value);
      }
    
    /**
     * Important Variables 
     */
      public double getX() {
        return ShapesJNI.Shape_x_get(swigCPtr, this);
      }
    
    /**
     * Moves the Shape 
     */
      public void move(double dx, double dy) {
        ShapesJNI.Shape_move(swigCPtr, this, dx, dy);
      }
    
    /**
     * @return the area 
     */
      public double area() {
        return ShapesJNI.Shape_area(swigCPtr, this);
      }
    
    /**
     * @return the perimeter 
     */
      public double perimeter() {
        return ShapesJNI.Shape_perimeter(swigCPtr, this);
      }
    }
    
    

    The code Java-wise should be identical to what would have been generated without the doxygen functionality enabled. When the Doxygen Translator module encounters a comment that contains nothing useful or a doxygen comment that it cannot parse, it will not affect the functionality of the SWIG generated code.

    The Javadoc translator will handle most of the tags conversions (see the table below). It will also automatically translate link-objects params, in \see and \link...\endlink commands. For example, 'someFunction(std::string)' will be converted to 'someFunction(String)'. If you don't want such behaviour, you could turn this off by using the 'doxygen:nolinktranslate' feature. Also all '\param' and '\tparam' commands are stripped out, if the specified parameter is not present in the function. Use 'doxygen:nostripparams' to avoid.

    Javadoc translator features summary (see %feature directives):

    17.3.2 Javadoc tags

    Here is the list of all Doxygen tags and the description of how they are translated to Javadoc

    Doxygen tags
    \awrapped with <i> html tag
    \argwrapped with <li> html tag
    \authortranslated to @author
    \authorstranslated to @author
    \bwrapped with <b> html tag
    \cwrapped with <code> html tag
    \citewrapped with <i> html tag
    \codetranslated to {@code ...}
    \condtranslated to 'Conditional comment: <condition>'
    \copyrightreplaced with 'Copyright:'
    \deprecatedtranslated to @deprecated
    \ewrapped with <i> html tag
    \elsereplaced with '}Else:{'
    \elseifreplaced with '}Else if: <condition>{'
    \emwrapped with <i> html tag
    \endcodesee note for \code
    \endcondreplaced with 'End of conditional comment.'
    \endifreplaced with '}'
    \endlinksee note for \link
    \endverbatimsee note for \verbatim
    \exceptiontranslated to @exception
    \f$, \f[, \f], \f{, \f}LateX formulas are left unchanged
    \ifreplaced with 'If: <condition> {'
    \ifnotreplaced with 'If not: <condition> {'
    \imagetranslated to <img/> html tag only if target=HTML
    \liwrapped with <li> html tag
    \linktranslated to {@link ...}
    \nreplaced with new line char
    \notereplaced with 'Note:'
    \overloadprints 'This is an overloaded ...' according to Doxygen docs
    \pwrapped with <code> html tag
    \parreplaced with <p alt='title'>...</p>
    \paramtranslated to @param
    \remarkreplaced with 'Remarks:'
    \remarksreplaced with 'Remarks:'
    \resulttranslated to @return
    \returntranslated to @return
    \returnstranslated to @return
    \satranslated to @see
    \seetranslated to @see
    \sincetranslated to @since
    \throwtranslated to @throws
    \throwstranslated to @throws
    \todoreplaced with 'TODO:'
    \tparamtranslated to @param
    \verbatimtranslated to {@literal ...}
    \versiontranslated to @version
    \warningtranslated to 'Warning:'
    \$prints $ char
    \@prints @ char
    \\prints \ char
    \&prints & char
    \~prints ~ char
    \<prints < char
    \>prints > char
    \#prints # char
    \%prints % char
    \"prints " char
    \.prints . char
    \::prints ::

    17.3.3 Unsupported tags

    Doxygen has a wealth of tags such as @latexonly that have no equivalent in Javadoc (all supported tags are listed in Javadoc documentation). As a result several tags have no translation or particular use, such as some linking and section tags. These are suppressed with their content just printed out (if the tag has any sense, typically text content). Here is the list of these tags:

    Unsupported Doxygen tags
    \addindex\addtogroup\anchor\attention
    \brief\bug\callgraph\callergraph
    \class\copybrief\copydetails\copydoc
    \date\def\defgroup\details
    \dir\dontinclude\dot\dotfile
    \enddot\endhtmlonly\endinternal \endlatexonly
    \endmanonly\endmsc\endrtfonly \endxmlonly
    \enum\example\extends
    \file\fn\headerfile\hideinitializer
    \htmlinclude\htmlonly\implements \include
    \includelineno\ingroup\internal \invariant
    \interface\latexonly\line\mainpage
    \manonly\memberof\msc\mscfile
    \name\namespace\nosubgrouping\package
    \page\paragraph\post\pre
    \private\privatesection\property \protected
    \protectedsection\protocol\public \publicsection
    \ref\related\relates\relatedalso
    \relatesalso\retval\rtfonly\section
    \short\showinitializer\skip\skipline
    \snippet\struct\subpage\subsection
    \subsubsection\tableofcontents\test \typedef
    \union\until\var\verbinclude
    \weakgroup\xmlonly\xrefitem\category

    If one of the following Doxygen tags appears as the first tag in a comment, the whole comment block is ignored:

    Ignored Doxygen tags
    \addtogroup\callgraph\callergraph \category
    \class\def\defgroup\dir
    \enum\example\file\fn
    \headerfile\hideinitializer\interface \internal
    \mainpage\name\namespace \nosubgrouping
    \overload\package\page\property
    \protocol\relates\relatesalso \showinitializer
    \struct\name\namespace\nosubgrouping
    \typedef\union\var\weakgroup

    17.3.4 Further details

    TO BE ADDED.

    17.4 Doxygen to Pydoc

    If translation is enabled, Pydoc formatted comments should be automatically placed in the correct locations in the resulting module and proxy files. The problem is that Pydoc has no tag mechanism like Doxygen or Javadoc, so most of Doxygen commands are translated by merely copying the appropriate command text.

    17.4.1 Basic example

    Here is an example segment from an included header file

    /*! This is describing class Shape
     \author Bob
     */
    
    class Shape {
    public:
      Shape() {
        nshapes++;
      }
      virtual ~Shape() {
        nshapes--;
      };
      double  x, y; /*!< Important Variables */
      void    move(double dx, double dy); /*!< Moves the Shape */
      virtual double area(void) = 0; /*!< \return the area */
      virtual double perimeter(void) = 0; /*!< \return the perimeter */
      static  int nshapes;
    };
    

    Simply running SWIG should result in the following code being present in Shapes.py

    
    ...
    
    class Shape(_object):
        """
        This is describing class Shape 
        Authors:
        Bob 
    
        """
        
        ...
        
        def move(self, *args):
            """
            Moves the Shape 
            """
            return _Shapes.Shape_move(self, *args)
    
        def area(self):
            """
            Return:
            the area 
            """
            return _Shapes.Shape_area(self)
    
        def perimeter(self):
            """
            Return:
            the perimeter 
            """
            return _Shapes.Shape_perimeter(self)
    

    If any parameters of a function or a method are documented in the Doxygen comment, their description is copied into the generated output using Sphinx documentation conventions. For example

    /**
        Set a breakpoint at the given location.
    
        @param filename The full path to the file.
        @param line_number The line number in the file.
     */
    bool SetBreakpoint(const char* filename, int line_number);
    

    would be translated to

    def SetBreakpoint(filename, line_number):
        r"""
        Set a breakpoint at the given location.
    
        :type filename: string
        :param filename: The full path to the file.
        :type line_number: int
        :param line_number: The line number in the file.
        """
    

    The types used for the parameter documentation come from the "doctype" typemap which is defined for all the primitive types and a few others (e.g. std::string and shared_ptr<T>) but for non-primitive types is taken to be just the C++ name of the type with namespace scope delimiters (::) replaced with a dot. To change this, you can define your own typemaps for the custom types, e.g:

    %typemap(doctype) MyDate "datetime.date";
    

    Currently Doxygen comments assigned to global variables and static member variables are not present in generated code, so they have no comment translated for them.

    Whitespace and tables Whitespace is preserved when translating comments, so it makes sense to have Doxygen comments formatted in a readable way. This includes tables, where tags <th>, <td> and </tr>are translated to '|'. The line after line with <th> tags contains dashes. If we take care about whitespace, comments in Python are much more readable. Example:

    /**
     * <table border = '1'>
     * <caption>Animals</caption>
     * <tr><th> Column 1 </th><th> Column 2 </th></tr>
     * <tr><td> cow      </td><td> dog      </td></tr>
     * <tr><td> cat      </td><td> mouse    </td></tr>
     * <tr><td> horse    </td><td> parrot   </td></tr>
     * </table>
     */
    

    translates to Python as:

      Animals
      | Column 1 | Column 2 |
      -----------------------
      | cow      | dog      |
      | cat      | mouse    |
      | horse    | parrot   |
    

    Overloaded functions Since all the overloaded functions in c++ are wrapped into one Python function, Pydoc translator will combine every comment of every overloaded function and put it into the comment for the one wrapper function.

    If you intend to use resulting generated Python file with the Doxygen docs generator, rather than Pydoc, you may want to turn off translation completely (doxygen:notranslate feature). Then SWIG will just copy the comments to the proxy file and reformat them if needed, but all the comment content will be left as is. As Doxygen doesn't support special commands in Python comments (see Doxygen docs), you may want to use some tool like doxypy ( doxypy) to do the work.

    17.4.2 Pydoc translator

    Here is the list of all Doxygen tags and the description of how they are translated to Pydoc

    Doxygen tags
    \awrapped with '_'
    \argprepended with ' --'
    \authorprints 'Author:'
    \authorsprints 'Author:'
    \bwrapped with '__'
    \citewrapped with single quotes
    \condtranslated to 'Conditional comment: <condition>'
    \copyrightprints 'Copyright:'
    \deprecatedprints 'Deprecated:'
    \ewrapped with '_'
    \elsereplaced with '}Else:{'
    \elseifreplaced with '}Else if: <condition>{'
    \emwrapped with '_'
    \endcondreplaced with 'End of conditional comment.'
    \endifreplaced with '}'
    \exceptionreplaced with 'Throws:'
    \ifreplaced with 'If: <condition> {'
    \ifnotreplaced with 'If not: <condition> {'
    \liprepended with ' --'
    \nreplaced with new line char
    \notereplaced with 'Note:'
    \overloadprints 'This is an overloaded ...' according to Doxygen docs
    \parreplaced with 'Title: ...'
    \paramtranslated to 'Arguments:\n param(type) --description'
    \remarkreplaced with 'Remarks:'
    \remarksreplaced with 'Remarks:'
    \resultreplaced with 'Result:'
    \returnreplaced with 'Result:'
    \returnsreplaced with 'Result:'
    \sareplaced with 'See also:'
    \seereplaced with 'See also:'
    \sincereplaced with 'Since:'
    \throwreplaced with 'Throws:'
    \throwsreplaced wih 'Throws:'
    \todoreplaced with 'TODO:'
    \tparamtranslated to 'Arguments:\n param(type) --description'
    \versionreplaced with 'Version:'
    \warningtranslated to 'Warning:'
    \$prints $ char
    \@prints @ char
    \\prints \ char
    \&prints & char
    \~prints ~ char
    \<prints < char
    \>prints > char
    \#prints # char
    \%prints % char
    \"prints " char
    \.prints . character
    \::prints ::

    17.4.3 Unsupported tags

    Doxygen has a wealth of tags such as @latexonly that have no equivalent in Pydoc. As a result several tags that have no translation (or particular use, such as some linking and section tags) are suppressed with their content just printed out (if it has any sense, typically text content). Here is the list of these tags:

    Unsupported Doxygen tags
    \addindex\addtogroup\anchor\attention
    \brief\bug\callgraph\callergraph
    \class\copybrief\copydetails\copydoc
    \date\def\defgroup\details
    \dir\dontinclude\dot\dotfile
    \code\endcode\endverbatim\endlink
    \enddot\endhtmlonly\endinternal \endlatexonly
    \endmanonly\endmsc\endrtfonly \endxmlonly
    \enum\example\extends\f$
    \f[\f]\f{\f}
    \file\fn\headerfile\hideinitializer
    \htmlinclude\htmlonly\implements \include
    \image\link\verbatim\p
    \includelineno\ingroup\internal \invariant
    \interface\latexonly\line\mainpage
    \manonly\memberof\msc\mscfile
    \name\namespace\nosubgrouping\package
    \page\paragraph\post\pre
    \private\privatesection\property \protected
    \protectedsection\protocol\public \publicsection
    \ref\related\relates\relatedalso
    \relatesalso\retval\rtfonly\section
    \short\showinitializer\skip\skipline
    \snippet\struct\subpage\subsection
    \subsubsection\tableofcontents\test \typedef
    \union\until\var\verbinclude
    \weakgroup\xmlonly\xrefitem\category
    \c

    17.4.4 Further details

    TO BE ADDED.

    17.5 Troubleshooting

    When running SWIG with command line option -doxygen, it may happen that SWIG will fail to parse the code, which is valid C++ code and is parsed without problems without the option. The problem is, that Doxygen comments are not tokens (the C/C++ compiler actually never sees them) and that they can appear anywhere in the code. That's why it is practically impossible to handle all corner cases with the parser. However, these problems can usually be avoided by minor changes in the code or comment. Known problems and solutions are shown in this section.

    Recommended approach is to first run SWIG without command line option -doxygen. When it successfully processes the code, include the option and fix problems with Doxygen comments.

    17.5.1 Problem with conditional compilation

    Inserting a conditional compilation preprocessor directive between a Doxygen comment and a commented item may break parsing:

    class A {
      /**
       * Some func.
       */
      #ifndef SWIG
      void myfunc()
      {
      }
      #endif
    };
    

    The solution is to move the directive above the comment:

    class A {
      #ifndef SWIG
      /**
       * Some func.
       */
      void myfunc()
      {
      }
      #endif
    };
    

    17.6 Developer information

    This section contains information for developers enhancing the Doxygen translator.

    17.6.1 Doxygen translator design

    If this functionality is turned on, SWIG places all comments found into the SWIG parse tree. Nodes contain an additional attribute called doxygen when a comment is present. Individual nodes containing Doxygen with Structural Indicators, such as @file, as their first command, are also present in the parse tree. These individual "blobs" of Doxygen such as :

    /*! This is describing function Foo
     \param x some random variable
     \author Bob
     \return Foo
     */
    

    are passed on individually to the Doxygen Translator module. This module builds its own private parse tree and hands it to a separate class for translation into the target documentation language. For example, JavaDocConverter is the Javadoc module class.

    17.6.2 Debugging the Doxygen parser and translator

    There are two handy command line options, that enable lots of detailed debug information printing.

      -debug-doxygen-parser     - Display Doxygen parser module debugging information
      -debug-doxygen-translator - Display Doxygen translator module debugging information
    

    17.6.3 Tests

    Doxygen tests have been added to the regular SWIG test-suite. There are a number of tests beginning doxygen_ in the Examples/test-suite sub-directory.

    Like any other SWIG test case, the tests are included in Examples/test-suite/common.mk and can be tested with commands like make check-test-suite or make check-python-test-suite. To run them individually, type make -s <testname>.cpptest in the language-specific sub-directory in Examples/test-suite directory. For example:

      Examples/test-suite/java $ make -s doxygen_parsing.cpptest
    

    If the test fails, both expected and translated comments are printed to std out, but also written to files expected.txt and got.txt. Since it is often difficult to find a single character difference in several lines of text, we can use some diff tool, for example:

      Examples/test-suite/java $ kdiff3 expected.txt got.txt
    

    Runtime tests in Java are implemented using Javadoc doclets. To make that work, you should have tools.jar from the JDK in your classpath. Or you should have JAVA_HOME environment variable defined and pointing to the JDK location.

    The Java's comment parsing code (the testing part) is located in commentParser.java. It checks the generated code. It is possible to run this file as a stand-alone program, with java commentParser <some java package>, and it will print the list of comments found in the specified directory (in the format it has used in the runtime tests). So, when you want to create a new Doxygen test case, just copy an existing one and replace the actual comment content (section of entries in form 'wantedComments.put(...)' with the output of the above command.

    Runtime tests in Python are just plain string comparisons of the __doc__ properties.

    17.7 Extending to other languages

    In general, an extension to another language requires a fairly deep understanding of the target language module, such as Modules/python.cxx for Python. Searching for "doxygen" in the java.cxx module can give you a good idea of the process for placing documentation comments into the correct areas. The basic gist is that anywhere a comment may reside on a node, there needs to be a catch for it in front of where that function, class, or other object is written out to a target language file. The other half of extension is building a target documentation language comment generator that handles one blob at a time. However, this is relatively simple and nowhere near as complex as the wrapper generating modules in SWIG. See Source/Doxygen/javadoc.cxx for a good example. The target language module passes the Doxygen Translator the blob to translate, and receives back the translated text.

    What is given to the Doxygen Translator

    /*! This is describing function Foo
     \param x some random variable
     \author Bob
     \return Foo
     */
    

    What is received back by java.cxx

    /** This is describing function Foo
     *
     * @param x some random variable
     * @author Bob
     * @return Foo
     */
    

    Development of the comment translator itself is simplified by the fact that the Doxygen Translator module can easily include a main function and thus be developed, compiled, and tested independently of SWIG.


    18 Warning Messages

    18.1 Introduction

    During compilation, SWIG may generate a variety of warning messages. For example:

    example.i:16: Warning 501: Overloaded declaration ignored.  bar(double)
    example.i:15: Warning 501: Previous declaration is bar(int)
    

    Typically, warning messages indicate non-fatal problems with the input where the generated wrapper code will probably compile, but it may not work like you expect.

    18.2 Warning message suppression

    All warning messages have a numeric code that is shown in the warning message itself. To suppress the printing of a warning message, a number of techniques can be used. First, you can run SWIG with the -w command line option. For example:

    % swig -python -w501 example.i
    % swig -python -w501,505,401 example.i
    

    Alternatively, warnings can be suppressed by inserting a special preprocessor pragma into the input file:

    %module example
    #pragma SWIG nowarn=501
    #pragma SWIG nowarn=501,505,401
    

    Finally, code-generation warnings can be disabled on a declaration by declaration basis using the %warnfilter directive. For example:

    %module example
    %warnfilter(501) foo;
    ...
    int foo(int);
    int foo(double);              // Silently ignored.
    

    The %warnfilter directive has the same semantics as other declaration modifiers like %rename, %ignore and %feature, see the %feature directive section. For example, if you wanted to suppress a warning for a method in a class hierarchy, you could do this:

    %warnfilter(501) Object::foo;
    class Object {
    public:
      int foo(int);
      int foo(double);      // Silently ignored
      ...
    };
    
    class Derived : public Object {
    public:
      int foo(int);
      int foo(double);      // Silently ignored
      ...
    };
    

    Warnings can be suppressed for an entire class by supplying a class name. For example:

    %warnfilter(501) Object;
    
    class Object {
    public:
      ...                      // All 501 warnings ignored in class
    };
    

    There is no option to suppress all SWIG warning messages. The warning messages are there for a reason---to tell you that something may be broken in your interface. Ignore the warning messages at your own peril.

    18.3 Enabling extra warnings

    Some warning messages are disabled by default and are generated only to provide additional diagnostics. These warnings can be turned on using the -Wextra option. For example:

    % swig -Wextra -python example.i
    

    To selectively turn on extra warning messages, you can use the directives and options in the previous section--simply add a "+" to all warning numbers. For example:

    % swig -w+309,+452 example.i
    

    or in your interface file use either

    #pragma SWIG nowarn=+309,+452
    

    or

    %warnfilter(+309,+452) foo;
    

    Note: selective enabling of warnings with %warnfilter overrides any global settings you might have made using -w or #pragma.

    You can of course also enable all warnings and suppress a select few, for example:

    % swig -Wextra -w309,452 example.i
    

    The warnings on the right take precedence over the warnings on the left, so in the above example -Wextra adds numerous warnings including 452, but then -w309,452 overrides this and so 452 is suppressesed.

    If you would like all warnings to appear, regardless of the warning filters used, then use the -Wall option. The -Wall option also turns on the extra warnings that -Wextra adds, however, it is subtely different. When -Wall is used, it also disables all other warning filters, that is, any warnings suppressed or added in %warnfilter, #pragma SWIG nowarn or the -w option.

    18.4 Issuing a warning message

    Warning messages can be issued from an interface file using a number of directives. The %warn directive is the most simple:

    %warn "900:This is your last warning!"
    

    All warning messages are optionally prefixed by the warning number to use. If you are generating your own warnings, make sure you don't use numbers defined in the table at the end of this section.

    The %ignorewarn directive is the same as %ignore except that it issues a warning message whenever a matching declaration is found. For example:

    %ignorewarn("362:operator= ignored") operator=;
    

    Warning messages can be associated with typemaps using the warning attribute of a typemap declaration. For example:

    %typemap(in, warning="901:You are really going to regret this usage of $1_type $1_name") blah * {
      ...
    }
    

    In this case, the warning message will be printed whenever the typemap is actually used and the special variables will be expanded as appropriate, for example:

    example.i:23: Warning 901: You are really going to regret this usage of blah * self
    example.i:24: Warning 901: You are really going to regret this usage of blah * stuff
    

    18.5 Symbolic symbols

    The swigwarn.swg file that is installed with SWIG contains symbol constants that could also be used in %warnfilter and #pragma SWIG nowarn. For example this file contains the following line:

    %define SWIGWARN_TYPE_UNDEFINED_CLASS 401 %enddef
    

    so SWIGWARN_TYPE_UNDEFINED_CLASS could be used instead of 401, for example:

    #pragma SWIG nowarn=SWIGWARN_TYPE_UNDEFINED_CLASS
    

    or

    %warnfilter(SWIGWARN_TYPE_UNDEFINED_CLASS) Foo;
    

    18.6 Commentary

    The ability to suppress warning messages is really only provided for advanced users and is not recommended in normal use. You are advised to modify your interface to fix the problems highlighted by the warnings wherever possible instead of suppressing warnings.

    Certain types of SWIG problems are errors. These usually arise due to parsing errors (bad syntax) or semantic problems for which there is no obvious recovery. There is no mechanism for suppressing error messages.

    18.7 Warnings as errors

    Warnings can be handled as errors by using the -Werror command line option. This will cause SWIG to exit with a non successful exit code if a warning is encountered.

    18.8 Message output format

    The output format for both warnings and errors can be selected for integration with your favourite IDE/editor. Editors and IDEs can usually parse error messages and if in the appropriate format will easily take you directly to the source of the error. The standard format is used by default except on Windows where the Microsoft format is used by default. These can be overridden using command line options, for example:

    $ swig -python -Fstandard example.i
    example.i:4: Syntax error in input(1).
    $ swig -python -Fmicrosoft example.i
    example.i(4) : Syntax error in input(1).
    

    18.9 Warning number reference

    18.9.1 Deprecated features (100-199)

    • 101. Deprecated %extern directive.
    • 102. Deprecated %val directive.
    • 103. Deprecated %out directive.
    • 104. Deprecated %disabledoc directive.
    • 105. Deprecated %enabledoc directive.
    • 106. Deprecated %doconly directive.
    • 107. Deprecated %style directive.
    • 108. Deprecated %localstyle directive.
    • 109. Deprecated %title directive.
    • 110. Deprecated %section directive.
    • 111. Deprecated %subsection directive.
    • 112. Deprecated %subsubsection directive.
    • 113. Deprecated %addmethods directive.
    • 114. Deprecated %readonly directive.
    • 115. Deprecated %readwrite directive.
    • 116. Deprecated %except directive.
    • 117. Deprecated %new directive.
    • 118. Deprecated %typemap(except).
    • 119. Deprecated %typemap(ignore).
    • 120. Deprecated command line option (-runtime, -noruntime).
    • 121. Deprecated %name directive.
    • 126. The 'nestedworkaround' feature is deprecated.

    18.9.2 Preprocessor (200-299)

    • 201. Unable to find filename.
    • 202. Could not evaluate expression expr.
    • 203. Both includeall and importall are defined: using includeall.
    • 204. CPP #warning, "warning".
    • 205. CPP #error, "error".
    • 206. Unexpected tokens after #directive directive.

    18.9.3 C/C++ Parser (300-399)

    • 301. class keyword used, but not in C++ mode.
    • 302. Identifier 'name' redefined (ignored).
    • 303. %extend defined for an undeclared class 'name '.
    • 304. Unsupported constant value (ignored).
    • 305. Bad constant value (ignored).
    • 306. 'identifier' is private in this context.
    • 307. Can't set default argument value (ignored)
    • 308. Namespace alias 'name' not allowed here. Assuming ' name'
    • 309. [private | protected] inheritance ignored.
    • 310. Template 'name' was already wrapped as 'name' (ignored)
    • 312. Unnamed nested class not currently supported (ignored).
    • 313. Unrecognized extern type "name" (ignored).
    • 314. 'identifier' is a lang keyword.
    • 315. Nothing known about 'identifier'.
    • 316. Repeated %module directive.
    • 317. Specialization of non-template 'name'.
    • 318. Instantiation of template 'name' is ambiguous, instantiation templ used, instantiation templ ignored.
    • 319. No access specifier given for base class name (ignored).
    • 320. Explicit template instantiation ignored.
    • 321. identifier conflicts with a built-in name.
    • 322. Redundant redeclaration of 'name'.
    • 323. Recursive scope inheritance of 'name'.
    • 324. Named nested template instantiations not supported. Processing as if no name was given to %template().
    • 325. Nested kind not currently supported (name ignored).
    • 326. Deprecated %extend name used - the kind name 'name ' should be used instead of the typedef name 'name'.
    • 350. operator new ignored.
    • 351. operator delete ignored.
    • 352. operator+ ignored.
    • 353. operator- ignored.
    • 354. operator* ignored.
    • 355. operator/ ignored.
    • 356. operator% ignored.
    • 357. operator^ ignored.
    • 358. operator& ignored.
    • 359. operator| ignored.
    • 360. operator~ ignored.
    • 361. operator! ignored.
    • 362. operator= ignored.
    • 363. operator< ignored.
    • 364. operator> ignored.
    • 365. operator+= ignored.
    • 366. operator-= ignored.
    • 367. operator*= ignored.
    • 368. operator/= ignored.
    • 369. operator%= ignored.
    • 370. operator^= ignored.
    • 371. operator&= ignored.
    • 372. operator|= ignored.
    • 373. operator<< ignored.
    • 374. operator>>ignored.
    • 375. operator<<= ignored.
    • 376. operator>>= ignored.
    • 377. operator== ignored.
    • 378. operator!= ignored.
    • 379. operator<= ignored.
    • 380. operator>= ignored.
    • 381. operator&& ignored.
    • 382. operator|| ignored.
    • 383. operator++ ignored.
    • 384. operator-- ignored.
    • 385. operator, ignored.
    • 386. operator-<* ignored.
    • 387. operator-< ignored.
    • 388. operator() ignored.
    • 389. operator[] ignored.
    • 390. operator+ ignored (unary).
    • 391. operator- ignored (unary).
    • 392. operator* ignored (unary).
    • 393. operator& ignored (unary).
    • 394. operator new[] ignored.
    • 395. operator delete[] ignored.

    18.9.4 Types and typemaps (400-499)

    • 401. Nothing known about class 'name'. Ignored.
    • 402. Base class 'name' is incomplete.
    • 403. Class 'name' might be abstract.
    • 450. Deprecated typemap feature ($source/$target).
    • 451. Setting const char * variable may leak memory.
    • 452. Reserved
    • 453. Can't apply (pattern). No typemaps are defined.
    • 460. Unable to use type type as a function argument.
    • 461. Unable to use return type type in function name .
    • 462. Unable to set variable of type type.
    • 463. Unable to read variable of type type.
    • 464. Unsupported constant value.
    • 465. Unable to handle type type.
    • 466. Unsupported variable type type.
    • 467. Overloaded declaration not supported (incomplete type checking rule - no precedence level in typecheck typemap for 'type ')
    • 468. No 'throw' typemap defined for exception type type
    • 469. No or improper directorin typemap defined for type
    • 470. Thread/reentrant unsafe wrapping, consider returning by value instead.
    • 471. Unable to use return type type in director method
    • 474. Method method usage of the optimal attribute ignored in the out typemap as the following cannot be used to generate optimal code: code
    • 475. Multiple calls to method might be generated due to optimal attribute usage in the out typemap.
    • 476. Initialization using std::initializer_list.
    • 477. No directorthrows typemap defined for type

    18.9.5 Code generation (500-559)

    • 501. Overloaded declaration ignored. decl. Previous declaration is decl.
    • 502. Overloaded constructor ignored. decl. Previous declaration is decl.
    • 503. Can't wrap 'identifier' unless renamed to a valid identifier.
    • 504. Function name must have a return type. Ignored.
    • 505. Variable length arguments discarded.
    • 506. Can't wrap varargs with keyword arguments enabled.
    • 507. Adding native function name not supported (ignored).
    • 508. Declaration of 'name' shadows declaration accessible via operator->(), previous declaration of'declaration'.
    • 509. Overloaded method declaration effectively ignored, as it is shadowed by declaration.
    • 510. Friend function 'name' ignored.
    • 511. Can't use keyword arguments with overloaded functions.
    • 512. Overloaded method declaration ignored, using non-const method declaration instead.
    • 513. Can't generate wrappers for unnamed struct/class.
    • 514.
    • 515.
    • 516. Overloaded method declaration ignored, using declaration instead.
    • 517.
    • 518. Portability warning: File file1 will be overwritten by file2 on case insensitive filesystems such as Windows' FAT32 and NTFS unless the class/module name is renamed.
    • 519. %template() contains no name. Template method ignored: declaration
    • 520. Base/Derived class 'classname1' of ' classname2' is not similarly marked as a smart pointer.
    • 521. Illegal destructor name name. Ignored.
    • 522. Use of an illegal constructor name 'name' in %extend is deprecated, the constructor name should be 'name'.
    • 523. Use of an illegal destructor name 'name' in %extend is deprecated, the destructor name should be 'name'.
    • 524. Experimental target language. Target language language specified by lang is an experimental language. Please read about SWIG experimental languages, htmllink.
    • 525. Destructor declaration is final, name cannot be a director class.

    18.9.6 Doxygen comments (560-599)

    • 560: Unknown Doxygen command: command.
    • 561: Unexpected end of Doxygen comment encountered.
    • 562: Expected Doxygen command: command
    • 563: Doxygen HTML error for tag tag: error text.
    • 564: Error parsing Doxygen command command: error text . Command ignored."

    18.9.7 Language module specific (700-899)

    • 801. Wrong name (corrected to 'name'). (Ruby).
    • 810. No jni typemap defined for type (Java).
    • 811. No jtype typemap defined for type (Java).
    • 812. No jstype typemap defined for type (Java).
    • 813. Warning for classname, base baseclass ignored. Multiple inheritance is not supported in Java. (Java).
    • 814.
    • 815. No javafinalize typemap defined for type (Java).
    • 816. No javabody typemap defined for type (Java).
    • 817. No javaout typemap defined for type (Java).
    • 818. No javain typemap defined for type (Java).
    • 819. No javadirectorin typemap defined for type (Java).
    • 820. No javadirectorout typemap defined for type (Java).
    • 821.
    • 822. Covariant return types not supported in Java. Proxy method will return basetype (Java).
    • 823. No javaconstruct typemap defined for type (Java).
    • 824. Missing JNI descriptor in directorin typemap defined for type (Java).
    • 825. "directorconnect" attribute missing in type "javaconstruct" typemap. (Java).
    • 826. The nspace feature is used on 'type' without -package. The generated code may not compile as Java does not support types declared in a named package accessing types declared in an unnamed package. (Java).
    • 830. No ctype typemap defined for type (C#).
    • 831. No cstype typemap defined for type (C#).
    • 832. No cswtype typemap defined for type (C#).
    • 833. Warning for classname, base baseclass ignored. Multiple inheritance is not supported in C#. (C#).
    • 834.
    • 835. No csfinalize typemap defined for type (C#).
    • 836. No csbody typemap defined for type (C#).
    • 837. No csout typemap defined for type (C#).
    • 838. No csin typemap defined for type (C#).
    • 839.
    • 840.
    • 841.
    • 842. Covariant return types not supported in C#. Proxy method will return basetype (C#).
    • 843. No csconstruct typemap defined for type (C#).
    • 844. C# exception may not be thrown - no $excode or excode attribute in typemap typemap. (C#).
    • 845. Unmanaged code contains a call to a SWIG_CSharpSetPendingException method and C# code does not handle pending exceptions via the canthrow attribute. (C#).
    • 870. Warning for classname: Base baseclass ignored. Multiple inheritance is not supported in PHP. (Php).
    • 871. Unrecognized pragma pragma. (Php).

    18.9.8 User defined (900-999)

    These numbers can be used by your own application.

    18.10 History

    The ability to control warning messages was first added to SWIG-1.3.12.


    19 Working with Modules

    19.1 Modules Introduction

    Each invocation of SWIG requires a module name to be specified. The module name is used to name the resulting target language extension module. Exactly what this means and what the name is used for depends on the target language, for example the name can define a target language namespace or merely be a useful name for naming files or helper classes. Essentially, a module comprises target language wrappers for a chosen collection of global variables/functions, structs/classes and other C/C++ types.

    The module name can be supplied in one of two ways. The first is to specify it with the special %module directive. This directive must appear at the beginning of the interface file. The general form of this directive is:

    %module(option1="value1", option2="value2", ...) modulename
    

    where the modulename is mandatory and the options add one or more optional additional features. Typically no options are specified, for example:

    %module mymodule
    

    The second way to specify the module name is with the -module command line option, for example -module mymodule. If the module name is supplied on the command line, it overrides the name specified by the %module directive.

    When first working with SWIG, users commonly start by creating a single module. That is, you might define a single SWIG interface that wraps some set of C/C++ code. You then compile all of the generated wrapper code together and use it. For large applications, however, this approach is problematic---the size of the generated wrapper code can be rather large. Moreover, it is probably easier to manage the target language interface when it is broken up into smaller pieces.

    This chapter describes the problem of using SWIG in programs where you want to create a collection of modules. Each module in the collection is created via separate invocations of SWIG.

    19.2 Basics

    The basic usage case with multiple modules is when modules do not have cross-references (ie. when wrapping multiple independent C APIs). In that case, swig input files should just work out of the box - you simply create multiple wrapper .cxx files, link them into your application, and insert/load each in the scripting language runtime as you would do for the single module case.

    A bit more complex is the case in which modules need to share information. For example, when one module extends the class of another by deriving from it:

    // File: base.h
    class base {
    public:
      int foo();
    };
    
     
    // File: base_module.i
    %module base_module
    
    %{
    #include "base.h"
    %}
    %include "base.h"
    
     
    // File: derived_module.i
    %module derived_module
    
    %import "base_module.i"
    
    %inline %{
    class derived : public base {
    public:
      int bar();
    };
    %}
    

    To create the wrapper properly, module derived_module needs to know about the base class and that its interface is covered in another module. The line %import "base_module.i" lets SWIG know exactly that. Often the .h file is passed to %import instead of the .i, which unfortunately doesn't work for all language modules. For example, Python requires the name of module that the base class exists in so that the proxy classes can fully inherit the base class's methods. Typically you will get a warning when the module name is missing, eg:

    derived_module.i:8: Warning 401: Base class 'base' ignored - unknown module name for base. Either
    import
    the appropriate module interface file or specify the name of the module in the %import directive.
    

    It is sometimes desirable to import the header file rather than the interface file and overcome the above warning. For example in the case of the imported interface being quite large, it may be desirable to simplify matters and just import a small header file of dependent types. This can be done by specifying the optional module attribute in the %import directive. The derived_module.i file shown above could be replaced with the following:

    // File: derived_module.i
    %module derived_module
    
    %import(module="base_module") "base.h"
    
    %inline %{
    class derived : public base {
    public:
      int bar();
    };
    

    Note that "base_module" is the module name and is the same as that specified in %module in base_module.i as well as the %import in derived_module.i.

    Another issue to beware of is that multiple dependent wrappers should not be linked/loaded in parallel from multiple threads as SWIG provides no locking - for more on that issue, read on.

    19.3 The SWIG runtime code

    Many of SWIG's target languages generate a set of functions commonly known as the "SWIG runtime." These functions are primarily related to the runtime type system which checks pointer types and performs other tasks such as proper casting of pointer values in C++. As a general rule, the statically typed target languages, such as Java, use the language's built in static type checking and have no need for a SWIG runtime. All the dynamically typed / interpreted languages rely on the SWIG runtime.

    The runtime functions are private to each SWIG-generated module. That is, the runtime functions are declared with "static" linkage and are visible only to the wrapper functions defined in that module. The only problem with this approach is that when more than one SWIG module is used in the same application, those modules often need to share type information. This is especially true for C++ programs where SWIG must collect and share information about inheritance relationships that cross module boundaries.

    To solve the problem of sharing information across modules, a pointer to the type information is stored in a global variable in the target language namespace. During module initialization, type information is loaded into the global data structure of type information from all modules.

    There are a few trade offs with this approach. This type information is global across all SWIG modules loaded, and can cause type conflicts between modules that were not designed to work together. To solve this approach, the SWIG runtime code uses a define SWIG_TYPE_TABLE to provide a unique type table. This behavior can be enabled when compiling the generated _wrap.cxx or _wrap.c file by adding -DSWIG_TYPE_TABLE=myprojectname to the command line argument.

    Then, only modules compiled with SWIG_TYPE_TABLE set to myprojectname will share type information. So if your project has three modules, all three should be compiled with -DSWIG_TYPE_TABLE=myprojectname, and then these three modules will share type information. But any other project's types will not interfere or clash with the types in your module.

    Another issue relating to the global type table is thread safety. If two modules try and load at the same time, the type information can become corrupt. SWIG currently does not provide any locking, and if you use threads, you must make sure that modules are loaded serially. Be careful if you use threads and the automatic module loading that some scripting languages provide. One solution is to load all modules before spawning any threads, or use SWIG_TYPE_TABLE to separate type tables so they do not clash with each other.

    Lastly, SWIG uses a #define SWIG_RUNTIME_VERSION, located in Lib/swigrun.swg and near the top of every generated module. This number gets incremented when the data structures change, so that SWIG modules generated with different versions can peacefully coexist. So the type structures are separated by the (SWIG_TYPE_TABLE, SWIG_RUNTIME_VERSION) pair, where by default SWIG_TYPE_TABLE is empty. Only modules compiled with the same pair will share type information.

    19.4 External access to the runtime

    As described in The run-time type checker, the functions SWIG_TypeQuery, SWIG_NewPointerObj, and others sometimes need to be called. Calling these functions from a typemap is supported, since the typemap code is embedded into the _wrap.c file, which has those declarations available. If you need to call the SWIG run-time functions from another C file, there is one header you need to include. To generate the header that needs to be included, SWIG can be run in a different mode via -external-runtime to generate the run-time instead of the normal mode of processing an input interface file. For example:

    $ swig -python -external-runtime <filename>
    

    The filename argument is optional and if it is not passed, then the default filename will be something like swigpyrun.h, depending on the language. This header file should be treated like any of the other _wrap.c output files, and should be regenerated when the _wrap files are. After including this header, your code will be able to call SWIG_TypeQuery, SWIG_NewPointerObj, SWIG_ConvertPtr and others. The exact argument parameters for these functions might differ between language modules; please check the language module chapters for more information.

    Inside this header the functions are declared static and are included inline into the file, and thus the file does not need to be linked against any SWIG libraries or code (you might still need to link against the language libraries like libpython-2.3). Data is shared between this file and the _wrap.c files through a global variable in the scripting language. It is also possible to copy this header file along with the generated wrapper files into your own package, so that you can distribute a package that can be compiled without SWIG installed (this works because the header file is self-contained, and does not need to link with anything).

    This header will also use the -DSWIG_TYPE_TABLE described above, so when compiling any code which includes the generated header file should define the SWIG_TYPE_TABLE to be the same as the module whose types you are trying to access.

    19.5 A word of caution about static libraries

    When working with multiple SWIG modules, you should take care not to use static libraries. For example, if you have a static library libfoo.a and you link a collection of SWIG modules with that library, each module will get its own private copy of the library code inserted into it. This is very often NOT what you want and it can lead to unexpected or bizarre program behavior. When working with dynamically loadable modules, you should try to work exclusively with shared libraries.

    19.6 References

    Due to the complexity of working with shared libraries and multiple modules, it might be a good idea to consult an outside reference. John Levine's "Linkers and Loaders" is highly recommended.

    19.7 Reducing the wrapper file size

    Using multiple modules with the %import directive is the most common approach to modularising large projects. In this way a number of different wrapper files can be generated, thereby avoiding the generation of a single large wrapper file. There are a couple of alternative solutions for reducing the size of a wrapper file through the use of command line options and features.

    -fcompact
    This command line option will compact the size of the wrapper file without changing the code generated into the wrapper file. It simply removes blank lines and joins lines of code together. This is useful for compilers that have a maximum file size that can be handled.

    -fvirtual
    This command line option will remove the generation of superfluous virtual method wrappers. Consider the following inheritance hierarchy:

    struct Base {
      virtual void method();
      ...
    };
    
    struct Derived : Base {
      virtual void method();
      ...
    };
    

    Normally wrappers are generated for both methods, whereas this command line option will suppress the generation of a wrapper for Derived::method. Normal polymorphic behaviour remains as Derived::method will still be called should you have a Derived instance and call the wrapper for Base::method.

    %feature("compactdefaultargs")
    This feature can reduce the number of wrapper methods when wrapping methods with default arguments. The section on default arguments discusses the feature and its limitations.


    20 Using SWIG with ccache - ccache-swig(1) manpage

    20.1 NAME

    ccache-swig - a fast compiler cache

    20.2 SYNOPSIS

    ccache-swig [OPTION]

    ccache-swig <compiler> [COMPILER OPTIONS]

    <compiler> [COMPILER OPTIONS]

    20.3 DESCRIPTION

    ccache-swig is a compiler cache. It speeds up re-compilation of C/C++/SWIG code by caching previous compiles and detecting when the same compile is being done again. ccache-swig is ccache plus support for SWIG. ccache and ccache-swig are used interchangeably in this document.

    20.4 OPTIONS SUMMARY

    Here is a summary of the options to ccache-swig.

    
    -s                      show statistics summary
    -z                      zero statistics
    -c                      run a cache cleanup
    -C                      clear the cache completely
    -F <n>                  set maximum files in cache
    -M <n>                  set maximum size of cache (use G, M or K)
    -h                      this help page
    -V                      print version number
    
    

    20.5 OPTIONS

    These options only apply when you invoke ccache as "ccache-swig". When invoked as a compiler none of these options apply. In that case your normal compiler options apply and you should refer to your compilers documentation.

    -h
    Print a options summary page

    -s
    Print the current statistics summary for the cache. The statistics are stored spread across the subdirectories of the cache. Using "ccache-swig -s" adds up the statistics across all subdirectories and prints the totals.

    -z
    Zero the cache statistics.

    -V
    Print the ccache version number

    -c
    Clean the cache and re-calculate the cache file count and size totals. Normally the -c option should not be necessary as ccache keeps the cache below the specified limits at runtime and keeps statistics up to date on each compile. This option is mostly useful if you manually modify the cache contents or believe that the cache size statistics may be inaccurate.

    -C
    Clear the entire cache, removing all cached files.

    -F <maxfiles>
    This sets the maximum number of files allowed in the cache. The value is stored inside the cache directory and applies to all future compiles. Due to the way the value is stored the actual value used is always rounded down to the nearest multiple of 16.

    -M <maxsize>
    This sets the maximum cache size. You can specify a value in gigabytes, megabytes or kilobytes by appending a G, M or K to the value. The default is gigabytes. The actual value stored is rounded down to the nearest multiple of 16 kilobytes.

    20.6 INSTALLATION

    There are two ways to use ccache. You can either prefix your compile commands with "ccache-swig" or you can create a symbolic link between ccache-swig and the names of your compilers. The first method is most convenient if you just want to try out ccache or wish to use it for some specific projects. The second method is most useful for when you wish to use ccache for all your compiles.

    To install for usage by the first method just copy ccache-swig to somewhere in your path.

    To install for the second method do something like this:

    
      cp ccache-swig /usr/local/bin/
      ln -s /usr/local/bin/ccache-swig /usr/local/bin/gcc
      ln -s /usr/local/bin/ccache-swig /usr/local/bin/g++
      ln -s /usr/local/bin/ccache-swig /usr/local/bin/cc
      ln -s /usr/local/bin/ccache-swig /usr/local/bin/swig
    
    
    This will work as long as /usr/local/bin comes before the path to gcc (which is usually in /usr/bin). After installing you may wish to run "which gcc" to make sure that the correct link is being used.

    Note! Do not use a hard link, use a symbolic link. A hardlink will cause "interesting" problems.

    20.7 EXTRA OPTIONS

    When run as a compiler front end ccache usually just takes the same command line options as the compiler you are using. The only exception to this is the option '--ccache-skip'. That option can be used to tell ccache that the next option is definitely not a input filename, and should be passed along to the compiler as-is.

    The reason this can be important is that ccache does need to parse the command line and determine what is an input filename and what is a compiler option, as it needs the input filename to determine the name of the resulting object file (among other things). The heuristic ccache uses in this parse is that any string on the command line that exists as a file is treated as an input file name (usually a C file). By using --ccache-skip you can force an option to not be treated as an input file name and instead be passed along to the compiler as a command line option.

    20.8 ENVIRONMENT VARIABLES

    ccache uses a number of environment variables to control operation. In most cases you won't need any of these as the defaults will be fine.

    CCACHE_DIR
    the CCACHE_DIR environment variable specifies where ccache will keep its cached compiler output. The default is "$HOME/.ccache".

    CCACHE_TEMPDIR
    the CCACHE_TEMPDIR environment variable specifies where ccache will put temporary files. The default is the same as CCACHE_DIR. Note that the CCACHE_TEMPDIR path must be on the same filesystem as the CCACHE_DIR path, so that renames of files between the two directories can work.

    CCACHE_LOGFILE
    If you set the CCACHE_LOGFILE environment variable then ccache will write some log information on cache hits and misses in that file. This is useful for tracking down problems.

    CCACHE_VERBOSE
    If you set the CCACHE_VERBOSE environment variable then ccache will display on stdout all the compiler invocations that it makes. This can useful for debugging unexpected problems.

    CCACHE_PATH
    You can optionally set CCACHE_PATH to a colon separated path where ccache will look for the real compilers. If you don't do this then ccache will look for the first executable matching the compiler name in the normal PATH that isn't a symbolic link to ccache itself.

    CCACHE_CC
    You can optionally set CCACHE_CC to force the name of the compiler to use. If you don't do this then ccache works it out from the command line.

    CCACHE_PREFIX
    This option adds a prefix to the command line that ccache runs when invoking the compiler. Also see the section below on using ccache with distcc.

    CCACHE_DISABLE
    If you set the environment variable CCACHE_DISABLE then ccache will just call the real compiler, bypassing the cache completely.

    CCACHE_READONLY
    the CCACHE_READONLY environment variable tells ccache to attempt to use existing cached object files, but not to try to add anything new to the cache. If you are using this because your CCACHE_DIR is read-only, then you may find that you also need to set CCACHE_TEMPDIR as otherwise ccache will fail to create the temporary files.

    CCACHE_CPP2
    If you set the environment variable CCACHE_CPP2 then ccache will not use the optimisation of avoiding the 2nd call to the pre-processor by compiling the pre-processed output that was used for finding the hash in the case of a cache miss. This is primarily a debugging option, although it is possible that some unusual compilers will have problems with the intermediate filename extensions used in this optimisation, in which case this option could allow ccache to be used.

    CCACHE_NOCOMPRESS
    If you set the environment variable CCACHE_NOCOMPRESS then there is no compression used on files that go into the cache. However, this setting has no effect on how files are retrieved from the cache, compressed results will still be usable.

    CCACHE_NOSTATS
    If you set the environment variable CCACHE_NOSTATS then ccache will not update the statistics files on each compile.

    CCACHE_NLEVELS
    The environment variable CCACHE_NLEVELS allows you to choose the number of levels of hash in the cache directory. The default is 2. The minimum is 1 and the maximum is 8.

    CCACHE_HARDLINK
    If you set the environment variable CCACHE_HARDLINK then ccache will attempt to use hard links from the cache directory when creating the compiler output rather than using a file copy. Using hard links is faster, but can confuse programs like 'make' that rely on modification times. Hard links are never made for compressed cache files.

    CCACHE_RECACHE
    This forces ccache to not use any cached results, even if it finds them. New results are still cached, but existing cache entries are ignored.

    CCACHE_UMASK
    This sets the umask for ccache and all child processes (such as the compiler). This is mostly useful when you wish to share your cache with other users. Note that this also affects the file permissions set on the object files created from your compilations.

    CCACHE_HASHDIR
    This tells ccache to hash the current working directory when calculating the hash that is used to distinguish two compiles. This prevents a problem with the storage of the current working directory in the debug info of a object file, which can lead ccache to give a cached object file that has the working directory in the debug info set incorrectly. This option is off by default as the incorrect setting of this debug info rarely causes problems. If you strike problems with gdb not using the correct directory then enable this option.

    CCACHE_UNIFY
    If you set the environment variable CCACHE_UNIFY then ccache will use the C/C++ unifier when hashing the pre-processor output if -g is not used in the compile. The unifier is slower than a normal hash, so setting this environment variable loses a little bit of speed, but it means that ccache can take advantage of not recompiling when the changes to the source code consist of reformatting only. Note that using CCACHE_UNIFY changes the hash, so cached compiles with CCACHE_UNIFY set cannot be used when CCACHE_UNIFY is not set and vice versa. The reason the unifier is off by default is that it can give incorrect line number information in compiler warning messages.

    CCACHE_EXTENSION
    Normally ccache tries to automatically determine the extension to use for intermediate C pre-processor files based on the type of file being compiled. Unfortunately this sometimes doesn't work, for example when using the aCC compiler on HP-UX. On systems like this you can use the CCACHE_EXTENSION option to override the default. On HP-UX set this environment variable to "i" if you use the aCC compiler.

    CCACHE_STRIPC
    If you set the environment variable CCACHE_STRIPC then ccache will strip the -c option when invoking the preprocessor. This option is primarily for the Sun Workshop C++ compiler as without this option an unwarranted warning is displayed: CC: Warning: "-E" redefines product from "object" to "source (stdout)" when -E and -c is used together.

    CCACHE_SWIG
    When using SWIG as the compiler and it does not have 'swig' in the executable name, then the CCACHE_SWIG environment variable needs to be set in order for ccache to work correctly with SWIG. The use of CCACHE_CPP2 is also recommended for SWIG due to some preprocessor quirks, however, use of CCACHE_CPP2 can often be skipped -- check your generated code with and without this option set. Known problems are using preprocessor directives within %inline blocks and the use of '#pragma SWIG'.

    20.9 CACHE SIZE MANAGEMENT

    By default ccache has a one gigabyte limit on the cache size and no maximum number of files. You can set a different limit using the "ccache -M" and "ccache -F" options, which set the size and number of files limits.

    When these limits are reached ccache will reduce the cache to 20% below the numbers you specified in order to avoid doing the cache clean operation too often.

    20.10 CACHE COMPRESSION

    By default on most platforms ccache will compress all files it puts into the cache using the zlib compression. While this involves a negligible performance slowdown, it significantly increases the number of files that fit in the cache. You can turn off compression setting the CCACHE_NOCOMPRESS environment variable.

    20.11 HOW IT WORKS

    The basic idea is to detect when you are compiling exactly the same code a 2nd time and use the previously compiled output. You detect that it is the same code by forming a hash of:

    • the pre-processor output from running the compiler with -E
    • the command line options
    • the real compilers size and modification time
    • any stderr output generated by the compiler

    These are hashed using md4 (a strong hash) and a cache file is formed based on that hash result. When the same compilation is done a second time ccache is able to supply the correct compiler output (including all warnings etc) from the cache.

    ccache has been carefully written to always produce exactly the same compiler output that you would get without the cache. If you ever discover a case where ccache changes the output of your compiler then please let me know.

    20.12 USING CCACHE WITH DISTCC

    distcc is a very useful program for distributing compilation across a range of compiler servers. It is often useful to combine distcc with ccache, so that compiles that are done are sped up by distcc, but that ccache avoids the compile completely where possible.

    To use distcc with ccache I recommend using the CCACHE_PREFIX option. You just need to set the environment variable CCACHE_PREFIX to 'distcc' and ccache will prefix the command line used with the compiler with the command 'distcc'.

    20.13 SHARING A CACHE

    A group of developers can increase the cache hit rate by sharing a cache directory. The hard links however cause unwanted side effects, as all links to a cached file share the file's modification timestamp. This results in false dependencies to be triggered by timestamp-based build systems whenever another user links to an existing file. Typically, users will see that their libraries and binaries are relinked without reason. To share a cache without side effects, the following conditions need to be met:

    • Use the same CCACHE_DIR environment variable setting
    • Unset the CCACHE_HARDLINK environment variable
    • Make sure everyone sets the CCACHE_UMASK environment variable to 002, this ensures that cached files are accessible to everyone in the group.
    • Make sure that all users have write permission in the entire cache directory (and that you trust all users of the shared cache).
    • Make sure that the setgid bit is set on all directories in the cache. This tells the filesystem to inherit group ownership for new directories. The command "chmod g+s `find $CCACHE_DIR -type d`" might be useful for this.
    • Set CCACHE_NOCOMPRESS for all users, if there are users with versions of ccache that do not support compression.

    20.14 HISTORY

    ccache was inspired by the compilercache shell script written by Erik Thiele and I would like to thank him for an excellent piece of work. See http://www.erikyyy.de/compilercache/ for the Erik's scripts. ccache-swig is a port of the original ccache with support added for use with SWIG.

    I wrote ccache because I wanted to get a bit more speed out of a compiler cache and I wanted to remove some of the limitations of the shell-script version.

    20.15 DIFFERENCES FROM COMPILERCACHE

    The biggest differences between Erik's compilercache script and ccache are:

    • ccache is written in C, which makes it a bit faster (calling out to external programs is mostly what slowed down the scripts).
    • ccache can automatically find the real compiler
    • ccache keeps statistics on hits/misses
    • ccache can do automatic cache management
    • ccache can cache compiler output that includes warnings. In many cases this gives ccache a much higher cache hit rate.
    • ccache can handle a much wider ranger of compiler options
    • ccache avoids a double call to cpp on a cache miss

    20.16 CREDITS

    Thanks to the following people for their contributions to ccache

    • Erik Thiele for the original compilercache script
    • Luciano Rocha for the idea of compiling the pre-processor output to avoid a 2nd cpp pass
    • Paul Russell for many suggestions and the debian packaging

    20.17 AUTHOR

    ccache was written by Andrew Tridgell https://www.samba.org/~tridge/. ccache was adapted to create ccache-swig for use with SWIG by William Fulton.

    If you wish to report a problem or make a suggestion then please email the SWIG developers on the swig-devel mailing list, see http://www.swig.org/mail.html

    ccache is released under the GNU General Public License version 2 or later. Please see the file COPYING for license details.


    21 SWIG and Android

    This chapter describes SWIG's support of Android.

    21.1 Overview

    The Android chapter is fairly short as support for Android is the same as for Java, where the Java Native Interface (JNI) is used to call from Android Java into C or C++ compiled code. Everything in the Java chapter applies to generating code for access from Android Java code. This chapter contains a few Android specific notes and examples.

    21.2 Android examples

    21.2.1 Examples introduction

    The examples require the Android SDK and Android NDK which can be installed as per instructions in the links. The Eclipse version is not required for these examples as just the command line tools are used (shown for Linux as the host, but Windows will be very similar, if not identical in most places). Add the SDK tools and NDK tools to your path and create a directory somewhere for your Android projects (adjust PATH as necessary to where you installed the tools):

    $ export PATH=$HOME/android/android-sdk-linux_x86/tools:$HOME/android/android-sdk-linux_x86/platform-tools:$HOME/android/android-ndk-r6b:$PATH
    $ mkdir AndroidApps 
    $ cd AndroidApps
    

    The examples use a target id of 1. This might need changing depending on your setup. After installation of the Android SDK, the available target ids can be viewed by running the command below. Please adjust the id to suit your target device.

    $ android list targets
    

    The following examples are shipped with SWIG under the Examples/android directory and include a Makefile to build and install each example.

    21.2.2 Simple C example

    This simple C example shows how to call a C function as well as read and modify a global variable. First we'll create and build a pure Java Android app. Afterwards the JNI code will be generated by SWIG and built into the app. First create and build an app called SwigSimple in a subdirectory called simple using the commands below. Adjust the --target id as mentioned earlier in the Examples introduction. Managing Projects from the Command Line on the Android developer's site is a useful reference for these steps.

    $ android create project --target 1 --name SwigSimple --path ./simple --activity SwigSimple --package org.swig.simple
    $ cd simple
    $ ant debug
    

    Modify src/org/swig/simple/SwigSimple.java from the default to:

    package org.swig.simple;
    
    import android.app.Activity;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.Button;
    import android.widget.TextView;
    import android.widget.ScrollView;
    import android.text.method.ScrollingMovementMethod;
    
    public class SwigSimple extends Activity
    {
        TextView outputText = null;
        ScrollView scroller = null;
    
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
    
            outputText = (TextView)findViewById(R.id.OutputText);
            outputText.setText("Press 'Run' to start...\n");
            outputText.setMovementMethod(new ScrollingMovementMethod());
    
            scroller = (ScrollView)findViewById(R.id.Scroller);
        }
    
        public void onRunButtonClick(View view)
        {
          outputText.append("Started...\n");
          nativeCall();
          outputText.append("Finished!\n");
          
          // Ensure scroll to end of text
          scroller.post(new Runnable() {
            public void run() {
              scroller.fullScroll(ScrollView.FOCUS_DOWN);
            }
          });
        }
    
        /** Calls into C/C++ code */
        public void nativeCall()
        {
            // TODO
        }
    }
    

    The above simply adds a Run button and scrollable text view as the GUI aspects of the program. The associated resources need to be created, modify res/layout/main.xml as follows:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        >
    <Button
        android:id="@+id/RunButton"  
        android:layout_width="wrap_content"  
        android:layout_height="wrap_content"  
        android:text="Run..."  
        android:onClick="onRunButtonClick"
        />
    <ScrollView
        android:id="@+id/Scroller"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        >
    <TextView
        android:id="@+id/OutputText"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        />
    </ScrollView>
    </LinearLayout>
    

    Rebuild the project with your changes:

    $ ant debug
    

    Although there are no native function calls in the code, yet, you may want to check that this simple pure Java app runs before adding in the native calls. First, set up your Android device for hardware debugging, see Using hardware devices on the Android developer's site. When complete your device should be listed in those attached, something like:

    $ adb devices
    List of devices attached 
    A32-6DBE0001-9FF80000-015D62C3-02018028 device
    

    This means you are now ready to install the application...

    $ adb install bin/SwigSimple-debug.apk 
    95 KB/s (4834 bytes in 0.049s)
            pkg: /data/local/tmp/SwigSimple-debug.apk
    Success
    

    The newly installed 'SwigSimple' app will be amongst all your other applications on the home screen. Run the app and it will show a Run button text box below it. Press the Run button to see the simple text output.

    The application can be uninstalled like any other application and in fact must be uninstalled before installing an updated version. Uninstalling is quite easy too from your host computer:

    $ adb uninstall org.swig.simple
    Success
    

    Now that you have a pure Java Android app working, let's add some JNI code generated from SWIG.

    First create a jni subdirectory and then create some C source code in jni/example.c:

    /* File : example.c */
    
    /* A global variable */
    double Foo = 3.0;
    
    /* Compute the greatest common divisor of positive integers */
    int gcd(int x, int y) {
      int g;
      g = y;
      while (x > 0) {
        g = x;
        x = y % x;
        y = g;
      }
      return g;
    }
    

    Create a SWIG interface file for this C code, jni/example.i :

    /* File : example.i */
    %module example
    
    %inline %{
    extern int    gcd(int x, int y);
    extern double Foo;
    %}
    

    Invoke SWIG as follows:

    $ swig -java -package org.swig.simple -outdir src/org/swig/simple -o jni/example_wrap.c jni/example.i
    

    SWIG generates the following files:

    • src/org/swig/simple/exampleJNI.java
    • src/org/swig/simple/example.java
    • jni/example_wrap.c

    Next we need to create a standard Android NDK build system file jni/Android.mk:

    # File: Android.mk
    LOCAL_PATH := $(call my-dir)
    
    include $(CLEAR_VARS)
    
    LOCAL_MODULE    := example
    LOCAL_SRC_FILES := example_wrap.c example.c
    
    include $(BUILD_SHARED_LIBRARY)
    

    See the Android NDK documentation for more on the NDK build system and getting started with the NDK. A simple invocation of ndk-build will compile the .c files and generate a shared object/system library. Output will be similar to:

    $ ndk-build
    Compile thumb  : example <= example_wrap.c
    Compile thumb  : example <= example.c
    SharedLibrary  : libexample.so
    Install        : libexample.so => libs/armeabi/libexample.so
    

    Now that the C JNI layer has been built, we can write Java code to call into the this layer. Modify the nativeCall method in src/org/swig/simple/SwigSimple.java to call the JNI code as follows and add the static constructor to load the system library containing the compiled JNI C code:

        /** Calls into C/C++ code */
        public void nativeCall()
        {
          // Call our gcd() function
          
          int x = 42;
          int y = 105;
          int g = example.gcd(x, y);
          outputText.append("The greatest common divisor of " + x + " and " + y + " is " + g + "\n");
    
          // Manipulate the Foo global variable
    
          // Output its current value
          double foo = example.getFoo();
          outputText.append("Foo = " + foo + "\n");
    
          // Change its value
          example.setFoo(3.1415926);
    
          // See if the change took effect
          outputText.append("Foo = " + example.getFoo() + "\n");
    
          // Restore value
          example.setFoo(foo);
        }
    
        /** static constructor */
        static {
            System.loadLibrary("example");
        }
    

    Compile the Java code as usual, uninstall the old version of the app if still installed and re-install the new app:

    $ ant debug
    $ adb uninstall org.swig.simple
    $ adb install bin/SwigSimple-debug.apk 
    

    Run the app again and this time you will see the output pictured below, showing the result of calls into the C code:

    Android screenshot of SwigSimple example

    21.2.3 C++ class example

    The steps for calling C++ code are almost identical to those in the previous C code example. All the steps required to compile and use a simple hierarchy of classes for shapes are shown in this example.

    First create an Android project called SwigClass in a subdirectory called class. The steps below create and build the JNI C++ app. Adjust the --target id as mentioned earlier in the Examples introduction.

    $ android create project --target 1 --name SwigClass --path ./class --activity SwigClass --package org.swig.classexample
    $ cd class
    

    Now create a jni subdirectory and then create a C++ header file jni/example.h which defines our hierarchy of shape classes:

    /* File : example.h */
    
    class Shape {
    public:
      Shape() {
        nshapes++;
      }
      virtual ~Shape() {
        nshapes--;
      }
      double  x, y;   
      void    move(double dx, double dy);
      virtual double area() = 0;
      virtual double perimeter() = 0;
      static  int nshapes;
    };
    
    class Circle : public Shape {
    private:
      double radius;
    public:
      Circle(double r) : radius(r) { }
      virtual double area();
      virtual double perimeter();
    };
    
    class Square : public Shape {
    private:
      double width;
    public:
      Square(double w) : width(w) { }
      virtual double area();
      virtual double perimeter();
    };
    

    and create the implementation in the jni/example.cpp file:

    /* File : example.cpp */
    
    #include "example.h"
    #define M_PI 3.14159265358979323846
    
    /* Move the shape to a new location */
    void Shape::move(double dx, double dy) {
      x += dx;
      y += dy;
    }
    
    int Shape::nshapes = 0;
    
    double Circle::area() {
      return M_PI*radius*radius;
    }
    
    double Circle::perimeter() {
      return 2*M_PI*radius;
    }
    
    double Square::area() {
      return width*width;
    }
    
    double Square::perimeter() {
      return 4*width;
    }
    

    Create a SWIG interface file for this C++ code in jni/example.i :

    /* File : example.i */
    %module example
    
    %{
    #include "example.h"
    %}
    
    /* Let's just grab the original header file here */
    %include "example.h"
    

    Invoke SWIG as follows, note that the -c++ option is required for C++ code:

    $ swig -c++ -java -package org.swig.classexample -outdir src/org/swig/classexample -o jni/example_wrap.cpp jni/example.i
    

    SWIG generates the following files:

    • src/org/swig/classexample/Square.java
    • src/org/swig/classexample/exampleJNI.java
    • src/org/swig/classexample/example.java
    • src/org/swig/classexample/Circle.java
    • src/org/swig/classexample/Shape.java
    • jni/example_wrap.cpp

    Next we need to create an Android NDK build system file for compiling the C++ code jni/Android.mk. The -frtti compiler flag isn't strictly needed for this example, but is needed for any code that uses C++ RTTI:

    # File: Android.mk
    LOCAL_PATH := $(call my-dir)
    
    include $(CLEAR_VARS)
    
    LOCAL_MODULE    := example
    LOCAL_SRC_FILES := example_wrap.cpp example.cpp
    LOCAL_CFLAGS    := -frtti
    
    include $(BUILD_SHARED_LIBRARY)
    

    A simple invocation of ndk-build will compile the .cpp files and generate a shared object/system library. Output will be similar to:

    $ ndk-build
    Compile++ thumb  : example <= example_wrap.cpp
    Compile++ thumb  : example <= example.cpp
    StaticLibrary  : libstdc++.a
    SharedLibrary  : libexample.so
    Install        : libexample.so => libs/armeabi/libexample.so
    

    Now that the C JNI layer has been built, we can write Java code to call into this layer. Modify src/org/swig/classexample/SwigClass.java from the default to:

    package org.swig.classexample;
    
    import android.app.Activity;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.Button;
    import android.widget.TextView;
    import android.widget.ScrollView;
    import android.text.method.ScrollingMovementMethod;
    
    public class SwigClass extends Activity
    {
        TextView outputText = null;
        ScrollView scroller = null;
    
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
    
            outputText = (TextView)findViewById(R.id.OutputText);
            outputText.setText("Press 'Run' to start...\n");
            outputText.setMovementMethod(new ScrollingMovementMethod());
    
            scroller = (ScrollView)findViewById(R.id.Scroller);
        }
    
        public void onRunButtonClick(View view)
        {
          outputText.append("Started...\n");
          nativeCall();
          outputText.append("Finished!\n");
          
          // Ensure scroll to end of text
          scroller.post(new Runnable() {
            public void run() {
              scroller.fullScroll(ScrollView.FOCUS_DOWN);
            }
          });
        }
    
        /** Calls into C/C++ code */
        public void nativeCall()
        {
          // ----- Object creation -----
    
          outputText.append( "Creating some objects:\n" );
          Circle c = new Circle(10);
          outputText.append( "    Created circle " + c + "\n");
          Square s = new Square(10);
          outputText.append( "    Created square " + s + "\n");
    
          // ----- Access a static member -----
    
          outputText.append( "\nA total of " + Shape.getNshapes() + " shapes were created\n" );
    
          // ----- Member data access -----
    
          // Notice how we can do this using functions specific to
          // the 'Circle' class.
          c.setX(20);
          c.setY(30);
    
          // Now use the same functions in the base class
          Shape shape = s;
          shape.setX(-10);
          shape.setY(5);
    
          outputText.append( "\nHere is their current position:\n" );
          outputText.append( "    Circle = (" + c.getX() + " " + c.getY() + ")\n" );
          outputText.append( "    Square = (" + s.getX() + " " + s.getY() + ")\n" );
    
          // ----- Call some methods -----
    
          outputText.append( "\nHere are some properties of the shapes:\n" );
          Shape[] shapes = {c, s};
          for (int i=0; i<shapes.length; i++)
          {
            outputText.append( "   " + shapes[i].toString() + "\n" );
            outputText.append( "        area      = " + shapes[i].area() + "\n" );
            outputText.append( "        perimeter = " + shapes[i].perimeter() + "\n" );
          }
    
          // Notice how the area() and perimeter() functions really
          // invoke the appropriate virtual method on each object.
    
          // ----- Delete everything -----
    
          outputText.append( "\nGuess I'll clean up now\n" );
    
          // Note: this invokes the virtual destructor
          // You could leave this to the garbage collector
          c.delete();
          s.delete();
    
          outputText.append( Shape.getNshapes() + " shapes remain\n" );
          outputText.append( "Goodbye\n" );
        }
    
        /** static constructor */
        static {
            System.loadLibrary("example");
        }
    }
    

    Note the static constructor and the interesting JNI code is in the nativeCall method. The remaining code deals with the GUI aspects which are identical to the previous C simple example. Modify res/layout/main.xml to contain the xml for the 'Run' button and scrollable text view:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        >
    <Button
        android:id="@+id/RunButton"  
        android:layout_width="wrap_content"  
        android:layout_height="wrap_content"  
        android:text="Run..."  
        android:onClick="onRunButtonClick"
        />
    <ScrollView
        android:id="@+id/Scroller"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        >
    <TextView
        android:id="@+id/OutputText"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        />
    </ScrollView>
    </LinearLayout>
    

    Compile the Java code as usual, uninstall the old version of the app if installed and re-install the new app:

    $ ant debug
    $ adb uninstall org.swig.classexample
    $ adb install bin/SwigClass-debug.apk 
    

    Run the app to see the result of calling the C++ code from Java:

    Android screenshot of SwigClass example

    21.2.4 Other examples

    The Examples/android directory contains further examples which can be run and installed in a similar manner to the previous two examples.

    Note that the 'extend' example is demonstrates the directors feature. Normally C++ exception handling and the STL is not available by default in the version of g++ shipped with Android, but this example turns these features on as described in the next section.

    21.3 C++ STL

    Should the C++ Standard Template Library (STL) be required, an Application.mk file needs to be created in the same directory as the Android.mk directory containing information about the STL to use. See the NDK documentation in the $NDKROOT/docs folder especially CPLUSPLUS-SUPPORT.html. Below is an example of the Application.mk file to make the STLport static library available for use:

    # File: Application.mk
    APP_STL := gnustl_static
    

    22 SWIG and C#

    22.1 Introduction

    The purpose of the C# module is to offer an automated way of accessing existing C/C++ code from .NET languages. The wrapper code implementation uses C# and the Platform Invoke (PInvoke) interface to access natively compiled C/C++ code. The PInvoke interface has been chosen over Microsoft's Managed C++ interface as it is portable to both Microsoft Windows and non-Microsoft platforms. PInvoke is part of the ECMA/ISO C# specification. It is also better suited for robust production environments due to the Managed C++ flaw called the Mixed DLL Loading Problem. SWIG C# works equally well on non-Microsoft operating systems such as Linux, Solaris and Apple Mac using Mono and Portable.NET.

    To get the most out of this chapter an understanding of interop is required. The Microsoft Developer Network (MSDN) has a good reference guide in a section titled "Interop Marshaling". Monodoc, available from the Mono project, has a very useful section titled Interop with native libraries.

    22.1.1 SWIG 2 Compatibility

    In order to minimize name collisions between names generated based on input to SWIG and names used in the generated code from the .NET framework, SWIG 3 fully qualifies the use of all .NET types. Furthermore, SWIG 3 avoids using directives in generated code. This breaks backwards compatibility with typemaps, pragmas, etc written for use with SWIG 2 that assume the presence of using System; or using System.Runtime.InteropServices; directives in the intermediate class imports, module imports, or proxy imports. SWIG 3 supports backwards compatibility though the use of the SWIG2_CSHARP macro. If SWIG2_CSHARP is defined, SWIG 3 generates using directives in the intermediate class, module class, and proxy class code similar to those generated by SWIG 2. This can be done without modifying any of the input code by passing the -DSWIG2_CSHARP commandline parameter when executing swig.

    22.1.2 Additional command line options

    The following table lists the additional commandline options available for the C# module. They can also be seen by using:

    swig -csharp -help 
    
    C# specific options
    -dllimport <dl>Override DllImport attribute name to <dl>
    -namespace <nm>Generate wrappers into C# namespace <nm>
    -noproxyGenerate the low-level functional interface instead of proxy classes
    -oldvarnamesOld intermediary method names for variable wrappers
    -outfile <file>Write all C# into a single <file> located in the output directory

    The -outfile option combines all the generated C# code into a single output file instead of creating multiple C# files. The default, when this option is not provided, is to generate separate .cs files for the module class, intermediary class and each of the generated proxy and type wrapper classes. Note that the file extension (.cs) will not be automatically added and needs to be provided. Due to possible compiler limits it is not advisable to use -outfile for large projects.

    22.2 Differences to the Java module

    The C# module is very similar to the Java module, so until some more complete documentation has been written, please use the Java documentation as a guide to using SWIG with C#. The C# module has the same major SWIG features as the Java module. The rest of this section should be read in conjunction with the Java documentation as it lists the main differences. The most notable differences to Java are the following:

    • When invoking SWIG use the -csharp command line option instead of -java.
    • The -nopgcpp command line option does not exist.
    • The -package command line option does not exist.
    • The -namespace <name> commandline option will generate all code into the namespace specified by <name>. C# supports nested namespaces that are not lexically nested, so nested namespaces will of course also work. For example: -namespace com.bloggs.widget , will generate code into C# namespaces:
      namespace com.bloggs.widget {
        ...
      }
      
      Note that by default, the generated C# classes have no namespace and the module name is unrelated to namespaces. The module name is just like in Java and is merely used to name some of the generated classes.
    • The nspace feature is also supported as described in this general section with a C# example. Unlike Java which requires the use of the -package option when using the nspace feature, the -namespace option is not mandatory for C#.
    • The -dllimport <name> commandline option specifies the name of the DLL for the DllImport attribute for every PInvoke method. If this commandline option is not given, the DllImport DLL name is the same as the module name. This option is useful for when one wants to invoke SWIG multiple times on different modules, yet compile all the resulting code into a single DLL.
    • C/C++ variables are wrapped with C# properties and not JavaBean style getters and setters.
    • Global constants are generated into the module class. There is no constants interface.
    • There is no implementation for type unsafe enums - not deemed necessary.
    • The default enum wrapping approach is proper C# enums, not typesafe enums.
      Note that %csconst(0) will be ignored when wrapping C/C++ enums with proper C# enums. This is because C# enum items must be initialised from a compile time constant. If an enum item has an initialiser and the initialiser doesn't compile as C# code, then the %csconstvalue directive must be used as %csconst(0) will have no effect. If it was used, it would generate an illegal runtime initialisation via a PInvoke call.
    • C# doesn't support the notion of throws clauses. Therefore there is no 'throws' typemap attribute support for adding exception classes to a throws clause. Likewise there is no need for an equivalent to %javaexception. In fact, throwing C# exceptions works quite differently, see C# Exceptions below.
    • The majority of the typemaps are in csharp.swg, not java.swg.
    • Typemap equivalent names:

      jni                         -> ctype
      jtype                       -> imtype
      jstype                      -> cstype
      javain                      -> csin
      javaout                     -> csout
      javadirectorin              -> csdirectorin
      javadirectorout             -> csdirectorout
      javainterfaces              -> csinterfaces and csinterfaces_derived
      javabase                    -> csbase
      javaclassmodifiers          -> csclassmodifiers
      javacode                    -> cscode
      javaimports                 -> csimports
      javabody                    -> csbody
      javafinalize                -> csfinalize
      javadestruct                -> csdisposing and csdispose
      javadestruct_derived        -> csdisposing_derived and csdispose_derived
      javainterfacecode           -> csinterfacecode
      
    • Typemap macros:

      SWIG_JAVABODY_PROXY         -> SWIG_CSBODY_PROXY
      SWIG_JAVABODY_TYPEWRAPPER   -> SWIG_CSBODY_TYPEWRAPPER
      
    • Additional typemaps:

      csvarin                     C# code property set typemap
      csvarout                    C# code property get typemap
      csattributes                C# attributes for attaching to proxy classes/enums
      
    • Additional typemap attributes:

      The "null" attribute in the "out" typemap can be specified to provide a value for $null to expand into for wrapped functions that return non-void. Normally the default value of 0 is used. For example this is needed if you change the return type to void:

      %typemap(ctype) Status "void"
      %typemap(out, null="") Status { ... }
      
    • Feature equivalent names:

      %javaconst                  -> %csconst
      %javaconstvalue             -> %csconstvalue
      %javamethodmodifiers        -> %csmethodmodifiers
      
    • Pragma equivalent names:

      %pragma(java)               -> %pragma(csharp)
      jniclassbase                -> imclassbase
      jniclassclassmodifiers      -> imclassclassmodifiers
      jniclasscode                -> imclasscode
      jniclassimports             -> imclassimports
      jniclassinterfaces          -> imclassinterfaces
      
    • Special variable equivalent names:

      $javaclassname              -> $csclassname
      $&javaclassname             -> $&csclassname
      $*javaclassname             -> $*csclassname
      $javaclazzname              -> $csclazzname
      $javainput                  -> $csinput
      $jnicall                    -> $imcall
      $javainterfacename          -> $csinterfacename
      $&javainterfacename         -> $&csinterfacename
      $*javainterfacename         -> $*csinterfacename
      
    • Unlike the "javain" typemap, the "csin" typemap does not support the 'pgcpp' attribute as the C# module does not have a premature garbage collection prevention parameter. The "csin" typemap supports additional optional attributes called 'cshin' and 'terminator'. The "csdirectorin" typemap supports additional optional attributes called 'terminator'. The 'cshin' attribute should contain the parameter type and name whenever a constructor helper function is generated due to the 'pre' or 'post' attributes. The 'terminator' attribute normally just contains a closing brace for when the 'pre' attribute contains an opening brace, such as when a C# using or fixed block is started. Note that 'pre', 'post', 'terminator' and 'cshin' attributes are not used for marshalling the property set. Please see the Date marshalling example and Date marshalling of properties example for further understanding of these "csin" applicable attributes. Please see the Date marshalling director example for further understanding of the "csdirectorin" attributes.

    • Support for asymmetric type marshalling. The 'ctype', 'imtype' and 'cstype' typemaps support an optional out attribute which is used for output types. If this typemap attribute is specified, then the type specified in the attribute is used for output types and the type specified in the typemap itself is used for the input type. If this typemap attribute is not specified, then the type used for both input and output is the type specified in the typemap. An example shows that char * could be marshalled in different ways,

      %typemap(imtype, out="global::System.IntPtr") char * "string"
      char * function(char *);
      

      The output type is thus IntPtr and the input type is string. The resulting intermediary C# code is:

      public static extern global::System.IntPtr function(string jarg1);
      
    • Support for type attributes. The 'imtype' and 'cstype' typemaps can have an optional inattributes and outattributes typemap attribute. The 'imtype' typemap can also have an optional directorinattributes and directoroutattributes typemap attribute which attaches to director delegates, an implementation detail of directors, see directors implementation. Note that there are C# attributes and typemap attributes, don't get confused between the two!! The C# attributes specified in these typemap attributes are generated wherever the type is used in the C# wrappers. These can be used to specify any C# attribute associated with a C/C++ type, but are more typically used for the C# MarshalAs attribute. For example:

      %typemap(imtype,
               inattributes="[global::System.Runtime.InteropServices.MarshalAs(UnmanagedType.LPStr)]",
               outattributes="[return: global::System.Runtime.InteropServices.MarshalAs(UnmanagedType.LPStr)]") const char * "String"
      
      const char * GetMsg() {}
      void SetMsg(const char *msg) {}
      

      The intermediary class will then have the marshalling as specified by everything in the 'imtype' typemap:

      class examplePINVOKE {
        ...
        [global::System.Runtime.InteropServices.DllImport("example", EntryPoint="CSharp_GetMsg")]
        [return: global::System.Runtime.InteropServices.MarshalAs(UnmanagedType.LPStr)]
        public static extern String GetMsg();
      
        [global::System.Runtime.InteropServices.DllImport("example", EntryPoint="CSharp_SetMsg")]
        public static extern void SetMsg([global::System.Runtime.InteropServices.MarshalAs(UnmanagedType.LPStr)]String jarg1);
      }
      

      Note that the DllImport attribute is always generated, irrespective of any additional attributes specified.

      These attributes are associated with the C/C++ parameter type or return type, which is subtly different to the attribute features and typemaps covered next. Note that all these different C# attributes can be combined so that a method has more than one attribute.

      The directorinattributes and directoroutattributes typemap attribute are attached to the delegates in the director class, for example, the SwigDelegateBase_0

    • Support for attaching C# attributes to wrapped methods, variables and enum values. This is done using the %csattributes feature, see %feature directives. Note that C# attributes are attached to proxy classes and enums using the csattributes typemap. For example, imagine we have a custom attribute class, ThreadSafeAttribute, for labelling thread safety. The following SWIG code shows how to attach this C# attribute to some methods and the class declaration itself:

      %typemap(csattributes) AClass          "[ThreadSafe]"
      %csattributes AClass::AClass(double d) "[ThreadSafe(false)]"
      %csattributes AClass::AMethod()        "[ThreadSafe(true)]"
      
      %inline %{
      class AClass {
      public:
        AClass(double a) {}
        void AMethod() {}
      };
      %}
      

      will generate a C# proxy class:

      [ThreadSafe]
      public class AClass : global::System.IDisposable {
        ...
        [ThreadSafe(false)]
        public AClass(double a) ...
      
        [ThreadSafe(true)]
        public void AMethod() ...
      }
      

      If C# attributes need adding to the set or get part of C# properties, when wrapping C/C++ variables, they can be added using the 'csvarin' and 'csvarout' typemaps respectively. Note that the type used for the property is specified in the 'cstype' typemap. If the 'out' attribute exists in this typemap, then the type used is from the 'out' attribute.

      An example for attaching attributes to the enum and enum values is shown below.

      %typemap(csattributes) Couleur "[global::System.ComponentModel.Description(\"Colours\")]"
      %csattributes Rouge "[global::System.ComponentModel.Description(\"Red\")]"
      %csattributes Vert "[global::System.ComponentModel.Description(\"Green\")]"
      %inline %{
        enum Couleur { Rouge, Orange, Vert };
      %}
      

      which will result in the following C# enum:

      [global::System.ComponentModel.Description("Colours")]
      public enum Couleur {
        [global::System.ComponentModel.Description("Red")]
        Rouge,
        Orange,
        [global::System.ComponentModel.Description("Green")]
        Vert
      }
      
    • The intermediary classname has PINVOKE appended after the module name instead of JNI, for example modulenamePINVOKE .

    • The %csmethodmodifiers feature can also be applied to variables as well as methods. In addition to the default public modifier that SWIG generates when %csmethodmodifiers is not specified, the feature will also replace the virtual/new /override modifiers that SWIG thinks is appropriate. This feature is useful for some obscure cases where SWIG might get the virtual/new/override modifiers incorrect, for example with multiple inheritance.

    • The name of the intermediary class can be changed from its default, that is, the module name with PINVOKE appended after it. The module directive attribute imclassname is used to achieve this:

      %module (imclassname="name") modulename
      

      If name is the same as modulename then the module class name gets changed from modulename to modulenameModule.

    • There is no additional 'premature garbage collection prevention parameter' as the marshalling of the HandleRef object takes care of ensuring a reference to the proxy class is held until the unmanaged call completed.

    $dllimport
    This is a C# only special variable that can be used in typemaps, pragmas, features etc. The special variable will get translated into the value specified by the -dllimport commandline option if specified, otherwise it is equivalent to the $module special variable.

    $imclassname
    This special variable expands to the intermediary class name. For C# this is usually the same as '$modulePINVOKE' ('$moduleJNI' for Java), unless the imclassname attribute is specified in the %module directive.

    The directory Examples/csharp has a number of simple examples. Visual Studio .NET 2003 solution and project files are available for compiling with the Microsoft .NET C# compiler on Windows. This also works with newer versions of Visual Studio if you allow it to convert the solution to the latest version. If your SWIG installation went well on a Unix environment and your C# compiler was detected, you should be able to type make in each example directory. After SWIG has run and both the C# and C/C++ compilers have finished building, the examples will be run, by either running runme.exe or by running mono runme.exe (Mono C# compiler). Windows users can also get the examples working using a Cygwin or MinGW environment for automatic configuration of the example makefiles. Any one of the C# compilers (Mono or Microsoft) can be detected from within a Cygwin or Mingw environment if installed in your path.

    22.3 Void pointers

    By default SWIG treats void * as any other pointer and hence marshalls it as a type wrapper class called SWIGTYPE_p_void . If you want to marshall with the .NET System.IntPtr type instead, there is a simple set of named typemaps called void *VOID_INT_PTR that can be used. They can be applied like any other named typemaps:

    %apply void *VOID_INT_PTR { void * }
    void * f(void *v);
    

    22.4 C# Arrays

    There are various ways to pass arrays from C# to C/C++. The default wrapping treats arrays as pointers and as such simple type wrapper classes are generated, eg SWIGTYPE_p_int when wrapping the C type int [] or int *. This gives a rather restricted use of the underlying unmanaged code and the most practical way to use arrays is to enhance or customise with one of the following three approaches; namely the SWIG C arrays library, P/Invoke default array marshalling or pinned arrays.

    22.4.1 The SWIG C arrays library

    The C arrays library keeps all the array memory in the unmanaged layer. The library is available to all language modules and is documented in the carrays.i library section. Please refer to this section for details, but for convenience, the C# usage for the two examples outlined there is shown below.

    For the %array_functions example, the equivalent usage would be:

    SWIGTYPE_p_double a = example.new_doubleArray(10);  // Create an array
    for (int i=0; i<10; i++)
      example.doubleArray_setitem(a, i, 2*i);           // Set a value
    example.print_array(a);                             // Pass to C
    example.delete_doubleArray(a);                      // Destroy array
    

    and for the %array_class example, the equivalent usage would be:

    doubleArray c = new doubleArray(10);    // Create double[10]
    for (int i=0; i<10; i++)
      c.setitem(i, 2*i);                    // Assign values
    example.print_array(c.cast());          // Pass to C
    

    22.4.2 Managed arrays using P/Invoke default array marshalling

    In the P/Invoke default marshalling scheme, one needs to designate whether the invoked function will treat a managed array parameter as input, output, or both. When the function is invoked, the CLR allocates a separate chunk of memory as big as the given managed array, which is automatically released at the end of the function call. If the array parameter is marked as being input, the content of the managed array is copied into this buffer when the call is made. Correspondingly, if the array parameter is marked as being output, the contents of the reserved buffer are copied back into the managed array after the call returns. A pointer to this buffer is passed to the native function.

    The reason for allocating a separate buffer is to leave the CLR free to relocate the managed array object during garbage collection. If the overhead caused by the copying is causing a significant performance penalty, consider pinning the managed array and passing a direct reference as described in the next section.

    For more information on the subject, see the Default Marshaling for Arrays article on MSDN.

    The P/Invoke default marshalling is supported by the arrays_csharp.i library via the INPUT, OUTPUT and INOUT typemaps. Let's look at some example usage. Consider the following C function:

    void myArrayCopy(int *sourceArray, int *targetArray, int nitems);
    

    We can now instruct SWIG to use the default marshalling typemaps by

    %include "arrays_csharp.i"
    
    %apply int INPUT[]  {int *sourceArray}
    %apply int OUTPUT[] {int *targetArray}
    

    As a result, we get the following method in the module class:

    public static void myArrayCopy(int[] sourceArray, int[] targetArray, int nitems) {
      examplePINVOKE.myArrayCopy(sourceArray, targetArray, nitems);
    }
    

    If we look beneath the surface at the corresponding intermediary class code, we see that SWIG has generated code that uses attributes (from the System.Runtime.InteropServices namespace) to tell the CLR to use default marshalling for the arrays:

    [global::System.Runtime.InteropServices.DllImport("example", EntryPoint="CSharp_myArrayCopy")]
    public static extern void myArrayCopy([global::System.Runtime.InteropServices.In, global::System.Runtime.InteropServices.MarshalAs(UnmanagedType.LPArray)]int[] jarg1, 
                                          [global::System.Runtime.InteropServices.Out, global::System.Runtime.InteropServices.MarshalAs(UnmanagedType.LPArray)]int[] jarg2,
                                           int jarg3);
    

    As an example of passing an inout array (i.e. the target function will both read from and write to the array), consider this C function that swaps a given number of elements in the given arrays:

    void myArraySwap(int *array1, int *array2, int nitems);
    

    Now, we can instruct SWIG to wrap this by

    %include "arrays_csharp.i"
    
    %apply int INOUT[] {int *array1}
    %apply int INOUT[] {int *array2}
    

    This results in the module class method

      public static void myArraySwap(int[] array1, int[] array2, int nitems) {
        examplePINVOKE.myArraySwap(array1, array2, nitems);
      }
    

    and intermediary class method

      [global::System.Runtime.InteropServices.DllImport("example", EntryPoint="CSharp_myArraySwap")]
      public static extern void myArraySwap([global::System.Runtime.InteropServices.In, global::System.Runtime.InteropServices.Out, global::System.Runtime.InteropServices.MarshalAs(UnmanagedType.LPArray)]int[] jarg1, 
                                            [global::System.Runtime.InteropServices.In, global::System.Runtime.InteropServices.Out, global::System.Runtime.InteropServices.MarshalAs(UnmanagedType.LPArray)]int[] jarg2,
                                             int jarg3);
    

    22.4.3 Managed arrays using pinning

    It is also possible to pin a given array in memory (i.e. fix its location in memory), obtain a direct pointer to it, and then pass this pointer to the wrapped C/C++ function. This approach involves no copying, but it makes the work of the garbage collector harder as the managed array object can not be relocated before the fix on the array is released. You should avoid fixing arrays in memory in cases where the control may re-enter the managed side via a callback and/or another thread may produce enough garbage to trigger garbage collection.

    For more information, see the fixed statement in the C# language reference.

    Now let's look at an example using pinning, thus avoiding the CLR making copies of the arrays passed as parameters. The arrays_csharp.i library file again provides the required support via the FIXED typemaps. Let's use the same function from the previous section:

    void myArrayCopy(int *sourceArray, int *targetArray, int nitems);
    

    We now need to declare the module class method unsafe, as we are using pointers:

    %csmethodmodifiers myArrayCopy "public unsafe";
     

    Apply the appropriate typemaps to the array parameters:

    %include "arrays_csharp.i"
    
    %apply int FIXED[] {int *sourceArray}
    %apply int FIXED[] {int *targetArray}
    

    Notice that there is no need for separate in, out or inout typemaps as is the case when using P/Invoke default marshalling.

    As a result, we get the following method in the module class:

      public unsafe static void myArrayCopy(int[] sourceArray, int[] targetArray, int nitems) {
        fixed ( int *swig_ptrTo_sourceArray = sourceArray ) {
        fixed ( int *swig_ptrTo_targetArray = targetArray ) {
        {
          examplePINVOKE.myArrayCopy((global::System.IntPtr)swig_ptrTo_sourceArray, (global::System.IntPtr)swig_ptrTo_targetArray,
                                     nitems);
        }
        }
        }
      }
    

    On the method signature level the only difference to the version using P/Invoke default marshalling is the "unsafe" quantifier, which is required because we are handling pointers.

    Also the intermediary class method looks a little different from the default marshalling example - the method is expecting an IntPtr as the parameter type.

    [global::System.Runtime.InteropServices.DllImport("example", EntryPoint="CSharp_myArrayCopy")]
    public static extern void myArrayCopy(global::System.IntPtr jarg1, global::System.IntPtr jarg2, int jarg3);
    

    22.5 C# Exceptions

    It is possible to throw a C# Exception from C/C++ code. SWIG already provides the framework for throwing C# exceptions if it is able to detect that a C++ exception could be thrown. Automatically detecting that a C++ exception could be thrown is only possible when a C++ exception specification is used, see Exception specifications. The Exception handling with %exception section details the %exception feature. Customised code for handling exceptions with or without a C++ exception specification is possible and the details follow. However anyone wishing to do this should be familiar with the contents of the sections referred to above.

    Unfortunately a C# exception cannot simply be thrown from unmanaged code for a variety of reasons. Most notably being that throwing a C# exception results in exceptions being thrown across the C PInvoke interface and C does not understand exceptions. The design revolves around a C# exception being constructed and stored as a pending exception, to be thrown only when the unmanaged code has completed. Implementing this is a tad involved and there are thus some unusual typemap constructs. Some practical examples follow and they should be read in conjunction with the rest of this section.

    First some details about the design that must be followed. Each typemap or feature that generates unmanaged code supports an attribute called canthrow. This is simply a flag which when set indicates that the code in the typemap/feature has code which might want to throw a C# exception. The code in the typemap/feature can then raise a C# exception by calling one of the C functions, SWIG_CSharpSetPendingException() or SWIG_CSharpSetPendingExceptionArgument(). When called, the function makes a callback into the managed world via a delegate. The callback creates and stores an exception ready for throwing when the unmanaged code has finished. The typemap/feature unmanaged code is then expected to force an immediate return from the unmanaged wrapper function, so that the pending managed exception can then be thrown. The support code has been carefully designed to be efficient as well as thread-safe. However to achieve the goal of efficiency requires some optional code generation in the managed code typemaps. Code to check for pending exceptions is generated if and only if the unmanaged code has code to set a pending exception, that is if the canthrow attribute is set. The optional managed code is generated using the excode typemap attribute and $excode special variable in the relevant managed code typemaps. Simply, if any relevant unmanaged code has the canthrow attribute set, then any occurrences of $excode is replaced with the code in the excode attribute. If the canthrow attribute is not set, then any occurrences of $excode are replaced with nothing.

    The prototypes for the SWIG_CSharpSetPendingException() and SWIG_CSharpSetPendingExceptionArgument() functions are

    static void SWIG_CSharpSetPendingException(SWIG_CSharpExceptionCodes code,
                                               const char *msg);
    
    static void SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpExceptionArgumentCodes code,
                                                       const char *msg,
                                                       const char *param_name);
    

    The first parameter defines which .NET exceptions can be thrown:

    typedef enum {
      SWIG_CSharpApplicationException,
      SWIG_CSharpArithmeticException,
      SWIG_CSharpDivideByZeroException,
      SWIG_CSharpIndexOutOfRangeException,
      SWIG_CSharpInvalidCastException,
      SWIG_CSharpInvalidOperationException,
      SWIG_CSharpIOException,
      SWIG_CSharpNullReferenceException,
      SWIG_CSharpOutOfMemoryException,
      SWIG_CSharpOverflowException,
      SWIG_CSharpSystemException
    } SWIG_CSharpExceptionCodes;
    
    typedef enum {
      SWIG_CSharpArgumentException,
      SWIG_CSharpArgumentNullException,
      SWIG_CSharpArgumentOutOfRangeException,
    } SWIG_CSharpExceptionArgumentCodes;
    

    where, for example, SWIG_CSharpApplicationException corresponds to the .NET exception, ApplicationException. The msg and param_name parameters contain the C# exception message and parameter name associated with the exception.

    The %exception feature in C# has the canthrow attribute set. The %csnothrowexception feature is like %exception, but it does not have the canthrow attribute set so should only be used when a C# exception is not created.

    22.5.1 C# exception example using "check" typemap

    Let's say we have the following simple C++ method:

    void positivesonly(int number);
    

    and we want to check that the input number is always positive and if not throw a C# ArgumentOutOfRangeException. The "check" typemap is designed for checking input parameters. Below you will see the canthrow attribute is set because the code contains a call to SWIG_CSharpSetPendingExceptionArgument(). The full example follows:

    %module example
    
    %typemap(check, canthrow=1) int number %{
    if ($1 < 0) {
      SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentOutOfRangeException,
                                             "only positive numbers accepted", "number");
      return $null;
    }
    // SWIGEXCODE is a macro used by many other csout typemaps
    %define SWIGEXCODE
     "\n    if ($modulePINVOKE.SWIGPendingException.Pending)"
     "\n      throw $modulePINVOKE.SWIGPendingException.Retrieve();"
    %enddef
    %typemap(csout, excode=SWIGEXCODE) void {
        $imcall;$excode
      }
    %}
    
    %inline %{
    
    void positivesonly(int number) {
    }
    
    %}
    

    When the following C# code is executed:

    public class runme {
      static void Main() {
        example.positivesonly(-1);
      }
    }
    

    The exception is thrown:

    Unhandled Exception: System.ArgumentOutOfRangeException: only positive numbers accepted
    Parameter name: number
    in <0x00034> example:positivesonly (int)
    in <0x0000c> runme:Main ()
    

    Now let's analyse the generated code to gain a fuller understanding of the typemaps. The generated unmanaged C++ code is:

    SWIGEXPORT void SWIGSTDCALL CSharp_positivesonly(int jarg1) {
      int arg1 ;
    
      arg1 = (int)jarg1;
    
      if (arg1 < 0) {
        SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentOutOfRangeException,
          "only positive numbers accepted", "number");
        return ;
      }
    
      positivesonly(arg1);
    
    }
    

    This largely comes from the "check" typemap. The managed code in the module class is:

    public class example {
      public static void positivesonly(int number) {
        examplePINVOKE.positivesonly(number);
        if (examplePINVOKE.SWIGPendingException.Pending)
          throw examplePINVOKE.SWIGPendingException.Retrieve();
      }
    
    }
    

    This comes largely from the "csout" typemap.

    The "csout" typemap is the same as the default void "csout" typemap so is not strictly necessary for the example. However, it is shown to demonstrate what managed output code typemaps should contain, that is, a $excode special variable and an excode attribute. Also note that $excode is expanded into the code held in the excode attribute. The $imcall as always expands into examplePINVOKE.positivesonly(number). The exception support code in the intermediary class, examplePINVOKE, is not shown, but is contained within the inner classes, SWIGPendingException and SWIGExceptionHelper and is always generated. These classes can be seen in any of the generated wrappers. However, all that is required of a user is as demonstrated in the "csin" typemap above. That is, is to check SWIGPendingException.Pending and to throw the exception returned by SWIGPendingException.Retrieve().

    If the "check" typemap did not exist, then the following module class would instead be generated:

    public class example {
      public static void positivesonly(int number) {
        examplePINVOKE.positivesonly(number);
      }
    
    }
    

    Here we see the pending exception checking code is omitted. In fact, the code above would be generated if the canthrow attribute was not in the "check" typemap, such as:

    %typemap(check) int number %{
    if ($1 < 0) {
      SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentOutOfRangeException,
                                             "only positive numbers accepted", "number");
      return $null;
    }
    %}
    

    Note that if SWIG detects you have used SWIG_CSharpSetPendingException() or SWIG_CSharpSetPendingExceptionArgument() without setting the canthrow attribute you will get a warning message similar to

    example.i:21: Warning 845: Unmanaged code contains a call to a SWIG_CSharpSetPendingException
    method and C# code does not handle pending exceptions via the canthrow attribute.
    

    Actually it will issue this warning for any function beginning with SWIG_CSharpSetPendingException.

    22.5.2 C# exception example using %exception

    Let's consider a similar, but more common example that throws a C++ exception from within a wrapped function. We can use %exception as mentioned in Exception handling with %exception.

    %exception negativesonly(int value) %{
    try {
      $action
    } catch (std::out_of_range e) {
      SWIG_CSharpSetPendingException(SWIG_CSharpApplicationException, e.what());
      return $null;
    }
    %}
    
    %inline %{
    #include <stdexcept>
    void negativesonly(int value) {
      if (value >= 0)
        throw std::out_of_range("number should be negative");
    }
    %}
    

    The generated unmanaged code this time catches the C++ exception and converts it into a C# ApplicationException.

    SWIGEXPORT void SWIGSTDCALL CSharp_negativesonly(int jarg1) {
      int arg1 ;
    
      arg1 = (int)jarg1;
    
      try {
        negativesonly(arg1);
    
      } catch (std::out_of_range e) {
        SWIG_CSharpSetPendingException(SWIG_CSharpApplicationException, e.what());
        return ;
      }
    }
    

    The managed code generated does check for the pending exception as mentioned earlier as the C# version of %exception has the canthrow attribute set by default:

      public static void negativesonly(int value) {
        examplePINVOKE.negativesonly(value);
        if (examplePINVOKE.SWIGPendingException.Pending)
          throw examplePINVOKE.SWIGPendingException.Retrieve();
      }
    

    22.5.3 C# exception example using exception specifications

    When C++ exception specifications are used, SWIG is able to detect that the method might throw an exception. By default SWIG will automatically generate code to catch the exception and convert it into a managed ApplicationException, as defined by the default "throws" typemaps. The following example has a user supplied "throws" typemap which is used whenever an exception specification contains a std::out_of_range, such as the evensonly method below.

    %typemap(throws, canthrow=1) std::out_of_range {
      SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentException, $1.what(), NULL);
      return $null;
    }
    
    %inline %{
    #include <stdexcept>
    void evensonly(int input) throw (std::out_of_range) {
      if (input%2 != 0)
        throw std::out_of_range("number is not even");
    }
    %}
    

    Note that the type for the throws typemap is the type in the exception specification. SWIG generates a try catch block with the throws typemap code in the catch handler.

    SWIGEXPORT void SWIGSTDCALL CSharp_evensonly(int jarg1) {
      int arg1 ;
    
      arg1 = (int)jarg1;
      try {
        evensonly(arg1);
      }
      catch(std::out_of_range &_e) {
        {
          SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentException, (&_e)->what(), NULL);
          return ;
        }
      }
    }
    

    Multiple catch handlers are generated should there be more than one exception specifications declared.

    22.5.4 Custom C# ApplicationException example

    This example involves a user defined exception. The conventional .NET exception handling approach is to create a custom ApplicationException and throw it in your application. The goal in this example is to convert the STL std::out_of_range exception into one of these custom .NET exceptions.

    The default exception handling is quite easy to use as the SWIG_CSharpSetPendingException() and SWIG_CSharpSetPendingExceptionArgument() methods are provided by SWIG. However, for a custom C# exception, the boiler plate code that supports these functions needs replicating. In essence this consists of some C/C++ code and C# code. The C/C++ code can be generated into the wrapper file using the %insert(runtime) directive and the C# code can be generated into the intermediary class using the imclasscode pragma as follows:

    %insert(runtime) %{
      // Code to handle throwing of C# CustomApplicationException from C/C++ code.
      // The equivalent delegate to the callback, CSharpExceptionCallback_t, is CustomExceptionDelegate
      // and the equivalent customExceptionCallback instance is customDelegate
      typedef void (SWIGSTDCALL* CSharpExceptionCallback_t)(const char *);
      CSharpExceptionCallback_t customExceptionCallback = NULL;
    
      extern "C" SWIGEXPORT
      void SWIGSTDCALL CustomExceptionRegisterCallback(CSharpExceptionCallback_t customCallback) {
        customExceptionCallback = customCallback;
      }
    
      // Note that SWIG detects any method calls named starting with
      // SWIG_CSharpSetPendingException for warning 845
      static void SWIG_CSharpSetPendingExceptionCustom(const char *msg) {
        customExceptionCallback(msg);
      }
    %}
    
    %pragma(csharp) imclasscode=%{
      class CustomExceptionHelper {
        // C# delegate for the C/C++ customExceptionCallback
        public delegate void CustomExceptionDelegate(string message);
        static CustomExceptionDelegate customDelegate =
                                       new CustomExceptionDelegate(SetPendingCustomException);
    
        [global::System.Runtime.InteropServices.DllImport("$dllimport", EntryPoint="CustomExceptionRegisterCallback")]
        public static extern
               void CustomExceptionRegisterCallback(CustomExceptionDelegate customCallback);
    
        static void SetPendingCustomException(string message) {
          SWIGPendingException.Set(new CustomApplicationException(message));
        }
    
        static CustomExceptionHelper() {
          CustomExceptionRegisterCallback(customDelegate);
        }
      }
      static CustomExceptionHelper exceptionHelper = new CustomExceptionHelper();
    %}
    

    The method stored in the C# delegate instance, customDelegate is what gets called by the C/C++ callback. However, the equivalent to the C# delegate, that is the C/C++ callback, needs to be assigned before any unmanaged code is executed. This is achieved by putting the initialisation code in the intermediary class. Recall that the intermediary class contains all the PInvoke methods, so the static variables in the intermediary class will be initialised before any of the PInvoke methods in this class are called. The exceptionHelper static variable ensures the C/C++ callback is initialised with the value in customDelegate by calling the CustomExceptionRegisterCallback method in the CustomExceptionHelper static constructor. Once this has been done, unmanaged code can make callbacks into the managed world as customExceptionCallback will be initialised with a valid callback/delegate. Any calls to SWIG_CSharpSetPendingExceptionCustom() will make the callback to create the pending exception in the same way that SWIG_CSharpSetPendingException() and SWIG_CSharpSetPendingExceptionArgument() does. In fact the method has been similarly named so that SWIG can issue the warning about missing canthrow attributes as discussed earlier. It is an invaluable warning as it is easy to forget the canthrow attribute when writing typemaps/features.

    The SWIGPendingException helper class is not shown, but is generated as an inner class into the intermediary class. It stores the pending exception in Thread Local Storage so that the exception handling mechanism is thread safe.

    The boiler plate code above must be used in addition to a handcrafted CustomApplicationException:

    // Custom C# Exception
    class CustomApplicationException : global::System.ApplicationException {
      public CustomApplicationException(string message) 
        : base(message) {
      }
    }
    

    and the SWIG interface code:

    %typemap(throws, canthrow=1) std::out_of_range {
      SWIG_CSharpSetPendingExceptionCustom($1.what());
      return $null;
    }
    
    %inline %{
    void oddsonly(int input) throw (std::out_of_range) {
      if (input%2 != 1)
        throw std::out_of_range("number is not odd");
    }
    %}
    

    The "throws" typemap now simply calls our new SWIG_CSharpSetPendingExceptionCustom() function so that the exception can be caught, as such:

    try {
      example.oddsonly(2);
    } catch (CustomApplicationException e) {
      ...
    }
    

    22.6 C# Directors

    The SWIG directors feature adds extra code to the generated C# proxy classes that enable these classes to be used in cross-language polymorphism. Essentially, it enables unmanaged C++ code to call back into managed code for virtual methods so that a C# class can derive from a wrapped C++ class.

    The following sections provide information on the C# director implementation and contain most of the information required to use the C# directors. However, the Java directors section should also be read in order to gain more insight into directors.

    22.6.1 Directors example

    Imagine we are wrapping a C++ base class, Base, from which we would like to inherit in C#. Such a class is shown below as well as another class, Caller, which calls the virtual method UIntMethod from pure unmanaged C++ code.

    // file: example.h
    class Base {
    public:
      virtual ~Base() {}
    
      virtual unsigned int UIntMethod(unsigned int x) {
        std::cout << "Base - UIntMethod(" << x << ")" << std::endl;
        return x;
      }
      virtual void BaseBoolMethod(const Base &b, bool flag) {}
    };
    
    class Caller {
    public:
      Caller(): m_base(0) {}
      ~Caller() { delBase(); }
      void set(Base *b) { delBase(); m_base = b; }
      void reset() { m_base = 0; }
      unsigned int UIntMethodCall(unsigned int x) { return m_base->UIntMethod(x); }
    
    private:
      Base *m_base;
      void delBase() { delete m_base; m_base = 0; }
    };
    

    The director feature is turned off by default and the following simple interface file shows how directors are enabled for the class Base.

    /* File : example.i */
    %module(directors="1") example
    %{
    #include "example.h"
    %}
    
    %feature("director") Base;
    
    %include "example.h"
    

    The following is a C# class inheriting from Base:

    public class CSharpDerived : Base
    {
      public override uint UIntMethod(uint x)
      {
        Console.WriteLine("CSharpDerived - UIntMethod({0})", x);
        return x;
      }
    }
    

    The Caller class can demonstrate the UIntMethod method being called from unmanaged code using the following C# code:

    public class runme
    {
      static void Main() 
      {
        Caller myCaller = new Caller();
    
        // Test pure C++ class
        using (Base myBase = new Base())
        {
          makeCalls(myCaller, myBase);
        }
    
        // Test director / C# derived class
        using (Base myBase = new CSharpDerived())
        {
          makeCalls(myCaller, myBase);
        }
      }
    
      static void makeCalls(Caller myCaller, Base myBase)
      {
        myCaller.set(myBase);
        myCaller.UIntMethodCall(123);
        myCaller.reset();
      }
    }
    

    If the above is run, the output is then:

    Base - UIntMethod(123)
    CSharpDerived - UIntMethod(123)
    

    22.6.2 Directors implementation

    The previous section demonstrated a simple example where the virtual UIntMethod method was called from C++ code, even when the overridden method is implemented in C#. The intention of this section is to gain an insight into how the director feature works. It shows the generated code for the two virtual methods, UIntMethod and BaseBoolMethod, when the director feature is enabled for the Base class.

    Below is the generated C# Base director class.

    public class Base : global::System.IDisposable {
      private global::System.Runtime.InteropServices.HandleRef swigCPtr;
      protected bool swigCMemOwn;
    
      internal Base(global::System.IntPtr cPtr, bool cMemoryOwn) {
        swigCMemOwn = cMemoryOwn;
        swigCPtr = new global::System.Runtime.InteropServices.HandleRef(this, cPtr);
      }
    
      internal static global::System.Runtime.InteropServices.HandleRef getCPtr(Base obj) {
        return (obj == null) ? new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero) : obj.swigCPtr;
      }
    
      ~Base() {
        Dispose();
      }
    
      public virtual void Dispose() {
        lock(this) {
          if(swigCPtr.Handle != global::System.IntPtr.Zero && swigCMemOwn) {
            swigCMemOwn = false;
            examplePINVOKE.delete_Base(swigCPtr);
          }
          swigCPtr = new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero);
          global::System.GC.SuppressFinalize(this);
        }
      }
    
      public virtual uint UIntMethod(uint x) {
        uint ret = examplePINVOKE.Base_UIntMethod(swigCPtr, x);
        return ret;
      }
    
      public virtual void BaseBoolMethod(Base b, bool flag) {
        examplePINVOKE.Base_BaseBoolMethod(swigCPtr, Base.getCPtr(b), flag);
        if (examplePINVOKE.SWIGPendingException.Pending)
          throw examplePINVOKE.SWIGPendingException.Retrieve();
      }
    
      public Base() : this(examplePINVOKE.new_Base(), true) {
        SwigDirectorConnect();
      }
    
      private void SwigDirectorConnect() {
        if (SwigDerivedClassHasMethod("UIntMethod", swigMethodTypes0))
          swigDelegate0 = new SwigDelegateBase_0(SwigDirectorMethodUIntMethod);
        if (SwigDerivedClassHasMethod("BaseBoolMethod", swigMethodTypes1))
          swigDelegate1 = new SwigDelegateBase_1(SwigDirectorMethodBaseBoolMethod);
        examplePINVOKE.Base_director_connect(swigCPtr, swigDelegate0, swigDelegate1);
      }
    
      private bool SwigDerivedClassHasMethod(string methodName, global::System.global::System.Type[] methodTypes) {
        System.Reflection.MethodInfo methodInfo = this.GetType().GetMethod(methodName, methodTypes);
        bool hasDerivedMethod = methodInfo.DeclaringType.IsSubclassOf(typeof(Base));
        return hasDerivedMethod;
      }
    
      private uint SwigDirectorMethodUIntMethod(uint x) {
        return UIntMethod(x);
      }
    
      private void SwigDirectorMethodBaseBoolMethod(global::System.IntPtr b, bool flag) {
        BaseBoolMethod(new Base(b, false), flag);
      }
    
      public delegate uint SwigDelegateBase_0(uint x);
      public delegate void SwigDelegateBase_1(global::System.IntPtr b, bool flag);
    
      private SwigDelegateBase_0 swigDelegate0;
      private SwigDelegateBase_1 swigDelegate1;
    
      private static global::System.Type[] swigMethodTypes0 = new global::System.Type[] { typeof(uint) };
      private static global::System.Type[] swigMethodTypes1 = new global::System.Type[] { typeof(Base), typeof(bool) };
    }
    

    Everything from the SwigDirectorConnect() method and below is code that is only generated when directors are enabled. The design comprises a C# delegate being initialised for each virtual method on construction of the class. Let's examine the BaseBoolMethod.

    In the Base constructor a call is made to SwigDirectorConnect() which contains the initialisation code for all the virtual methods. It uses a support method, SwigDerivedClassHasMethod(), which simply uses reflection to determine if the named method, BaseBoolMethod, with the list of required parameter types, exists in a subclass. If it does not exist, the delegate is not initialised as there is no need for unmanaged code to call back into managed C# code. However, if there is an overridden method in any subclass, the delegate is required. It is then initialised to the SwigDirectorMethodBaseBoolMethod which in turn will call BaseBoolMethod if invoked. The delegate is not initialised to the BaseBoolMethod directly as quite often types will need marshalling from the unmanaged type to the managed type in which case an intermediary method ( SwigDirectorMethodBaseBoolMethod) is required for the marshalling. In this case, the C# Base class needs to be created from the unmanaged IntPtr type.

    The last thing that SwigDirectorConnect() does is to pass the delegates to the unmanaged code. It calls the intermediary method Base_director_connect() which is really a call to the C function CSharp_Base_director_connect(). This method simply maps each C# delegate onto a C function pointer.

    SWIGEXPORT void SWIGSTDCALL CSharp_Base_director_connect(void *objarg, 
                                            SwigDirector_Base::SWIG_Callback0_t callback0,
                                            SwigDirector_Base::SWIG_Callback1_t callback1) {
      Base *obj = (Base *)objarg;
      SwigDirector_Base *director = dynamic_cast<SwigDirector_Base *>(obj);
      if (director) {
        director->swig_connect_director(callback0, callback1);
      }
    }
    
    class SwigDirector_Base : public Base, public Swig::Director {
    public:
      SwigDirector_Base();
      virtual unsigned int UIntMethod(unsigned int x);
      virtual ~SwigDirector_Base();
      virtual void BaseBoolMethod(Base const &b, bool flag);
    
      typedef unsigned int (SWIGSTDCALL* SWIG_Callback0_t)(unsigned int);
      typedef void (SWIGSTDCALL* SWIG_Callback1_t)(void *, unsigned int);
      void swig_connect_director(SWIG_Callback0_t callbackUIntMethod,
                                 SWIG_Callback1_t callbackBaseBoolMethod);
    
    private:
      SWIG_Callback0_t swig_callbackUIntMethod;
      SWIG_Callback1_t swig_callbackBaseBoolMethod;
      void swig_init_callbacks();
    };
    
    void SwigDirector_Base::swig_connect_director(SWIG_Callback0_t callbackUIntMethod, 
                                                  SWIG_Callback1_t callbackBaseBoolMethod) {
      swig_callbackUIntMethod = callbackUIntMethod;
      swig_callbackBaseBoolMethod = callbackBaseBoolMethod;
    }
    

    Note that for each director class SWIG creates an unmanaged director class for making the callbacks. For example Base has SwigDirector_Base and SwigDirector_Base is derived from Base. Should a C# class be derived from Base, the underlying C++ SwigDirector_Base is created rather than Base. The SwigDirector_Base class then implements all the virtual methods, redirecting calls up to managed code if the callback/delegate is non-zero. The implementation of SwigDirector_Base::BaseBoolMethod shows this - the callback is made by invoking the swig_callbackBaseBoolMethod function pointer:

    void SwigDirector_Base::BaseBoolMethod(Base const &b, bool flag) {
      void * jb = 0 ;
      unsigned int jflag  ;
      
      if (!swig_callbackBaseBoolMethod) {
        Base::BaseBoolMethod(b, flag);
        return;
      } else {
        jb = (Base *) &b; 
        jflag = flag;
        swig_callbackBaseBoolMethod(jb, jflag);
      }
    }
    

    The delegates from the above example are public by default:

      public delegate uint SwigDelegateBase_0(uint x);
      public delegate void SwigDelegateBase_1(global::System.IntPtr b, bool flag);
    

    These can be changed if desired via the csdirectordelegatemodifiers %feature directive. For example, using %feature("csdirectordelegatemodifiers") "internal" before SWIG parses the Base class will change all the delegates to internal :

      internal delegate uint SwigDelegateBase_0(uint x);
      internal delegate void SwigDelegateBase_1(global::System.IntPtr b, bool flag);
    

    22.6.3 Director caveats

    There is a subtle gotcha with directors. If default parameters are used, it is recommended to follow a pattern of always calling a single method in any C# derived class. An example will clarify this and the reasoning behind the recommendation. Consider the following C++ class wrapped as a director class:

    class Defaults {
    public:
      virtual ~Defaults();
      virtual void DefaultMethod(int a=-100);
    };
    

    Recall that C++ methods with default parameters generate overloaded methods for each defaulted parameter, so a C# derived class can be created with two DefaultMethod override methods:

    public class CSharpDefaults : Defaults
    {
      public override void DefaultMethod()
      {
        DefaultMethod(-100); // note C++ default value used
      }
      public override void DefaultMethod(int x)
      {
      }
    }
    

    It may not be clear at first, but should a user intend to call CSharpDefaults.DefaultMethod() from C++, a call is actually made to CSharpDefaults.DefaultMethod(int). This is because the initial call is made in C++ and therefore the DefaultMethod(int) method will be called as is expected with C++ calls to methods with defaults, with the default being set to -100. The callback/delegate matching this method is of course the overloaded method DefaultMethod(int). However, a call from C# to CSharpDefaults.DefaultMethod() will of course call this exact method and in order for behaviour to be consistent with calls from C++, the implementation should pass the call on to CSharpDefaults.DefaultMethod(int)using the C++ default value, as shown above.

    22.7 Multiple modules

    When using multiple modules it is possible to compile each SWIG generated wrapper into a different assembly. However, by default the generated code may not compile if generated classes in one assembly use generated classes in another assembly. The visibility of the getCPtr() and pointer constructor generated from the csbody typemaps needs changing. The default visibility is internal but it needs to be public for access from a different assembly. Just changing 'internal' to 'public' in the typemap achieves this. Two macros are available in csharp.swg to make this easier and using them is the preferred approach over simply copying the typemaps and modifying as this is forward compatible with any changes in the csbody typemap in future versions of SWIG. The macros are for the proxy and typewrapper classes and can respectively be used to to make the method and constructor public:

      SWIG_CSBODY_PROXY(public, public, SWIGTYPE)
      SWIG_CSBODY_TYPEWRAPPER(public, public, public, SWIGTYPE)
    

    Alternatively, instead of exposing these as public, consider using the [assembly:InternalsVisibleTo("Name")] attribute available in the .NET framework when you know which assemblies these can be exposed to. Another approach would be to make these public, but also to hide them from intellisense by using the [System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)] attribute if you don't want users to easily stumble upon these so called 'internal workings' of the wrappers.

    22.8 C# Typemap examples

    This section includes a few examples of typemaps. For more examples, you might look at the files "csharp.swg" and "typemaps.i " in the SWIG library.

    22.8.1 Memory management when returning references to member variables

    This example shows how to prevent premature garbage collection of objects when the underlying C++ class returns a pointer or reference to a member variable. The example is a direct equivalent to this Java equivalent.

    Consider the following C++ code:

    struct Wheel {
      int size;
      Wheel(int sz = 0) : size(sz) {}
    };
    
    class Bike {
      Wheel wheel;
    public:
      Bike(int val) : wheel(val) {}
      Wheel& getWheel() { return wheel; }
    };
    

    and the following usage from C# after running the code through SWIG:

      Wheel wheel = new Bike(10).getWheel();
      Console.WriteLine("wheel size: " + wheel.size);
      // Simulate a garbage collection
      global::System.GC.Collect();
      global::System.GC.WaitForPendingFinalizers();
      global::System.Console.WriteLine("wheel size: " + wheel.size);
    

    Don't be surprised that if the resulting output gives strange results such as...

    wheel size: 10
    wheel size: 135019664
    

    What has happened here is the garbage collector has collected the Bike instance as it doesn't think it is needed any more. The proxy instance, wheel, contains a reference to memory that was deleted when the Bike instance was collected. In order to prevent the garbage collector from collecting the Bike instance a reference to the Bike must be added to the wheel instance. You can do this by adding the reference when the getWheel() method is called using the following typemaps.

    %typemap(cscode) Wheel %{
      // Ensure that the GC doesn't collect any Bike instance set from C#
      private Bike bikeReference;
      internal void addReference(Bike bike) {
        bikeReference = bike;
      }
    %}
    
    // Add a C# reference to prevent premature garbage collection and resulting use
    // of dangling C++ pointer. Intended for methods that return pointers or
    // references to a member variable.
    %typemap(csout, excode=SWIGEXCODE) Wheel& getWheel {
        global::System.IntPtr cPtr = $imcall;$excode
        $csclassname ret = null;
        if (cPtr != global::System.IntPtr.Zero) {
          ret = new $csclassname(cPtr, $owner);
          ret.addReference(this);
        }
        return ret;
      }
    

    The code in the first typemap gets added to the Wheel proxy class. The code in the second typemap constitutes the bulk of the code in the generated getWheel() function:

    public class Wheel : global::System.IDisposable {
      ...
      // Ensure that the GC doesn't collect any Bike instance set from C#
      private Bike bikeReference;
      internal void addReference(Bike bike) {
        bikeReference = bike;
      }
    }
    
    public class Bike : global::System.IDisposable {
      ...
      public Wheel getWheel() {
        global::System.IntPtr cPtr = examplePINVOKE.Bike_getWheel(swigCPtr);
        Wheel ret = null;
        if (cPtr != global::System.IntPtr.Zero) {
          ret = new Wheel(cPtr, false);
          ret.addReference(this);
        }
        return ret;
      }
    }
    

    Note the addReference call.

    22.8.2 Memory management for objects passed to the C++ layer

    The example is a direct equivalent to this Java equivalent. Managing memory can be tricky when using C++ and C# proxy classes. The previous example shows one such case and this example looks at memory management for a class passed to a C++ method which expects the object to remain in scope after the function has returned. Consider the following two C++ classes:

    struct Element {
      int value;
      Element(int val) : value(val) {}
    };
    class Container {
      Element* element;
    public:
      Container() : element(0) {}
      void setElement(Element* e) { element = e; }
      Element* getElement() { return element; }
    };
    

    and usage from C++

      Container container;
      Element element(20);
      container.setElement(&element);
      cout << "element.value: " << container.getElement()->value << endl;
    

    and more or less equivalent usage from C#

      Container container = new Container();
      Element element = new Element(20);
      container.setElement(element);
    

    The C++ code will always print out 20, but the value printed out may not be this in the C# equivalent code. In order to understand why, consider a garbage collection occurring...

      Container container = new Container();
      Element element = new Element(20);
      container.setElement(element);
      Console.WriteLine("element.value: " + container.getElement().value);
      // Simulate a garbage collection
      global::System.GC.Collect();
      global::System.GC.WaitForPendingFinalizers();
      global::System.Console.WriteLine("element.value: " + container.getElement().value);
    

    The temporary element created with new Element(20) could get garbage collected which ultimately means the container variable is holding a dangling pointer, thereby printing out any old random value instead of the expected value of 20. One solution is to add in the appropriate references in the C# layer...

    public class Container : global::System.IDisposable {
    
      ...
    
      // Ensure that the GC doesn't collect any Element set from C#
      // as the underlying C++ class stores a shallow copy
      private Element elementReference;
    
      public void setElement(Element e) {
        examplePINVOKE.Container_setElement(swigCPtr, Element.getCPtr(e));
        elementReference = e;
      }
    }
    

    The following typemaps can be used to generate this code:

    %typemap(cscode) Container %{
      // Ensure that the GC doesn't collect any Element set from C#
      // as the underlying C++ class stores a shallow copy
      private Element elementReference;
    %}
    
    %typemap(csin,
             post="      elementReference = $csinput;"
             ) Element *e "Element.getCPtr($csinput)"
    

    The 'cscode' typemap simply adds in the specified code into the C# proxy class. The 'csin' typemap matches the input parameter type and name for the setElement method and the 'post' typemap attribute allows adding code after the PInvoke call. The 'post' code is generated into a finally block after the PInvoke call so the resulting code isn't quite as mentioned earlier, setElement is actually:

      public void setElement(Element e) {
        try {
          examplePINVOKE.Container_setElement(swigCPtr, Element.getCPtr(e));
        } finally {
          elementReference = e;
        }
      }
    

    22.8.3 Date marshalling using the csin typemap and associated attributes

    The NaN Exception example is a simple example of the "javain" typemap and its 'pre' attribute. This example demonstrates how a C++ date class, say CDate, can be mapped onto the standard .NET date class, System.DateTime by using the 'pre', 'post' and 'pgcppname' attributes of the "csin" typemap (the C# equivalent to the "javain" typemap). The example is an equivalent to the Java Date marshalling example. The idea is that the System.DateTime is used wherever the C++ API uses a CDate. Let's assume the code being wrapped is as follows:

    class CDate {
    public:
      CDate();
      CDate(int year, int month, int day);
      int getYear();
      int getMonth();
      int getDay();
      ...
    };
    struct Action {
      static int doSomething(const CDate &dateIn, CDate &dateOut);
      Action(const CDate &date, CDate &dateOut);
    };
    

    Note that dateIn is const and therefore read only and dateOut is a non-const output type.

    First let's look at the code that is generated by default, where the C# proxy class CDate is used in the proxy interface:

    public class Action : global::System.IDisposable {
      ...
      public Action(CDate dateIn, CDate dateOut) 
          : this(examplePINVOKE.new_Action(CDate.getCPtr(dateIn), CDate.getCPtr(dateOut)), true) {
        if (examplePINVOKE.SWIGPendingException.Pending) 
          throw examplePINVOKE.SWIGPendingException.Retrieve();
      }
    
      public int doSomething(CDate dateIn, CDate dateOut) {
        int ret = examplePINVOKE.Action_doSomething(swigCPtr, 
                                                    CDate.getCPtr(dateIn), 
                                                    CDate.getCPtr(dateOut));
        if (examplePINVOKE.SWIGPendingException.Pending) 
          throw examplePINVOKE.SWIGPendingException.Retrieve();
        return ret;
      }
    }
    

    The CDate & and const CDate & C# code is generated from the following two default typemaps:

    %typemap(cstype) SWIGTYPE & "$csclassname"
    %typemap(csin) SWIGTYPE & "$csclassname.getCPtr($csinput)"
    

    where '$csclassname' is translated into the proxy class name, CDate and '$csinput' is translated into the name of the parameter, eg dateIn. From C#, the intention is then to call into a modified API with something like:

    System.DateTime dateIn = new System.DateTime(2011, 4, 13);
    System.DateTime dateOut = new System.DateTime();
    
    // Note in calls below, dateIn remains unchanged and dateOut 
    // is set to a new value by the C++ call
    Action action = new Action(dateIn, out dateOut);
    dateIn = new System.DateTime(2012, 7, 14);
    

    To achieve this mapping, we need to alter the default code generation slightly so that at the C# layer, a System.DateTime is converted into a CDate. The intermediary layer will still take a pointer to the underlying CDate class. The typemaps to achieve this are shown below.

    %typemap(cstype) const CDate & "System.DateTime"
    %typemap(csin, 
             pre="    CDate temp$csinput = new CDate($csinput.Year, $csinput.Month, $csinput.Day);"
            ) const CDate &
             "$csclassname.getCPtr(temp$csinput)"
    
    %typemap(cstype) CDate & "out System.DateTime"
    %typemap(csin, 
             pre="    CDate temp$csinput = new CDate();", 
             post="      $csinput = new System.DateTime(temp$csinput.getYear(),"
                  " temp$csinput.getMonth(), temp$csinput.getDay(), 0, 0, 0);",
             cshin="out $csinput"
            ) CDate &
             "$csclassname.getCPtr(temp$csinput)"
    
    

    The resulting generated proxy code in the Action class follows:

    public class Action : global::System.IDisposable {
      ...
      public int doSomething(System.DateTime dateIn, out System.DateTime dateOut) {
        CDate tempdateIn = new CDate(dateIn.Year, dateIn.Month, dateIn.Day);
        CDate tempdateOut = new CDate();
        try {
          int ret = examplePINVOKE.Action_doSomething(swigCPtr, 
                                                      CDate.getCPtr(tempdateIn), 
                                                      CDate.getCPtr(tempdateOut));
          if (examplePINVOKE.SWIGPendingException.Pending) 
            throw examplePINVOKE.SWIGPendingException.Retrieve();
          return ret;
        } finally {
          dateOut = new System.DateTime(tempdateOut.getYear(), 
                                        tempdateOut.getMonth(), tempdateOut.getDay(), 0, 0, 0);
        }
      }
    
      static private global::System.IntPtr SwigConstructAction(System.DateTime dateIn, out System.DateTime dateOut) {
        CDate tempdateIn = new CDate(dateIn.Year, dateIn.Month, dateIn.Day);
        CDate tempdateOut = new CDate();
        try {
          return examplePINVOKE.new_Action(CDate.getCPtr(tempdateIn), CDate.getCPtr(tempdateOut));
        } finally {
          dateOut = new System.DateTime(tempdateOut.getYear(), 
                                        tempdateOut.getMonth(), tempdateOut.getDay(), 0, 0, 0);
        }
      }
    
      public Action(System.DateTime dateIn, out System.DateTime dateOut) 
          : this(Action.SwigConstructAction(dateIn, out dateOut), true) {
        if (examplePINVOKE.SWIGPendingException.Pending) 
          throw examplePINVOKE.SWIGPendingException.Retrieve();
      }
    }
    

    A few things to note:

    • The "cstype" typemap has changed the parameter type to System.DateTime instead of the default generated CDate proxy.
    • The non-const CDate & type is marshalled as a reference parameter in C# as the date cannot be explicitly set once the object has been created, so a new object is created instead.
    • The code in the 'pre' attribute appears before the intermediary call (examplePINVOKE.new_Action / examplePINVOKE.Action_doSomething).
    • The code in the 'post' attribute appears after the intermediary call.
    • A try .. finally block is generated with the intermediary call in the try block and 'post' code in the finally block. The alternative of just using a temporary variable for the return value from the intermediary call and the 'post' code being inserted before the return statement is not possible given that the intermediary call and method return comes from a single source (the "csout" typemap).
    • The temporary variables in the "csin" typemaps are called temp$csin, where "$csin" is replaced with the parameter name. "$csin" is used to mangle the variable name so that more than one CDate & type can be used as a parameter in a method, otherwise two or more local variables with the same name would be generated.
    • The use of the "csin" typemap causes a constructor helper function (SwigConstructAction) to be generated. This allows C# code to be called before the intermediary call made in the constructor initialization list.
    • The 'cshin' attribute is required for the SwigConstructAction constructor helper function so that the 2nd parameter is declared as out dateOut instead of just dateOut.

    So far we have considered the date as an input only and an output only type. Now let's consider CDate * used as an input/output type. Consider the following C++ function which modifies the date passed in:

    void addYears(CDate *pDate, int years) {
      *pDate = CDate(pDate->getYear() + years, pDate->getMonth(), pDate->getDay());
    }
    

    If usage of CDate * commonly follows this input/output pattern, usage from C# like the following

    System.DateTime christmasEve = new System.DateTime(2000, 12, 24);
    example.addYears(ref christmasEve, 10); // christmasEve now contains 2010-12-24
    

    will be possible with the following CDate * typemaps

    %typemap(cstype, out="System.DateTime") CDate * "ref System.DateTime"
    
    %typemap(csin,
             pre="    CDate temp$csinput = new CDate($csinput.Year, $csinput.Month, $csinput.Day);",
             post="      $csinput = new System.DateTime(temp$csinput.getYear(),"
                  " temp$csinput.getMonth(), temp$csinput.getDay(), 0, 0, 0);",
             cshin="ref $csinput"
            ) CDate *
             "$csclassname.getCPtr(temp$csinput)"
    

    Globals are wrapped by the module class and for a module called example, the typemaps result in the following code:

    public class example {
      public static void addYears(ref System.DateTime pDate, int years) {
        CDate temppDate = new CDate(pDate.Year, pDate.Month, pDate.Day);
        try {
          examplePINVOKE.addYears(CDate.getCPtr(temppDate), years);
        } finally {
          pDate = new System.DateTime(temppDate.getYear(), temppDate.getMonth(), temppDate.getDay(),
                                      0, 0, 0);
        }
      }
      ...
    }
    

    The following typemap is the same as the previous but demonstrates how a using block can be used for the temporary variable. The only change to the previous typemap is the introduction of the 'terminator' attribute to terminate the using block. The subtractYears method is nearly identical to the above addYears method.

    %typemap(csin,
      pre="    using (CDate temp$csinput = new CDate($csinput.Year, $csinput.Month, $csinput.Day)) {",
      post="      $csinput = new System.DateTime(temp$csinput.getYear(),"
           " temp$csinput.getMonth(), temp$csinput.getDay(), 0, 0, 0);",
      terminator="    } // terminate temp$csinput using block",
      cshin="ref $csinput"
     ) CDate *
      "$csclassname.getCPtr(temp$csinput)"
    
    void subtractYears(CDate *pDate, int years) {
      *pDate = CDate(pDate->getYear() - years, pDate->getMonth(), pDate->getDay());
    }
    

    The resulting generated code shows the termination of the using block:

    public class example {
      public static void subtractYears(ref System.DateTime pDate, int years) {
        using (CDate temppDate = new CDate(pDate.Year, pDate.Month, pDate.Day)) {
        try {
          examplePINVOKE.subtractYears(CDate.getCPtr(temppDate), years);
        } finally {
          pDate = new System.DateTime(temppDate.getYear(), temppDate.getMonth(), temppDate.getDay(),
                                      0, 0, 0);
        }
        } // terminate temppDate using block
      }
      ...
    }
    

    22.8.4 A date example demonstrating marshalling of C# properties

    The previous section looked at converting a C++ date class to System.DateTime for parameters. This section extends this idea so that the correct marshalling is obtained when wrapping C++ variables. Consider the same CDate class from the previous section and a global variable:

    CDate ImportantDate = CDate(1999, 12, 31);
    

    The aim is to use System.DateTime from C# when accessing this date as shown in the following usage where the module name is 'example':

    example.ImportantDate = new System.DateTime(2000, 11, 22);
    System.DateTime importantDate = example.ImportantDate;
    Console.WriteLine("Important date: " + importantDate);
    

    When SWIG wraps a variable that is a class/struct/union, it is wrapped using a pointer to the type for the reasons given in Structure data members. The typemap type required is thus CDate *. Given that the previous section already designed CDate * typemaps, we'll use those same typemaps plus the 'csvarin' and 'csvarout' typemaps.

    %typemap(cstype, out="System.DateTime") CDate * "ref System.DateTime"
    
    %typemap(csin,
             pre="    CDate temp$csinput = new CDate($csinput.Year, $csinput.Month, $csinput.Day);",
             post="      $csinput = new System.DateTime(temp$csinput.getYear(),"
                  " temp$csinput.getMonth(), temp$csinput.getDay(), 0, 0, 0);",
             cshin="ref $csinput"
            ) CDate *
             "$csclassname.getCPtr(temp$csinput)"
    
    %typemap(csvarin, excode=SWIGEXCODE2) CDate * %{
        /* csvarin typemap code */
        set {
          CDate temp$csinput = new CDate($csinput.Year, $csinput.Month, $csinput.Day);
          $imcall;$excode
        } %}
    
    %typemap(csvarout, excode=SWIGEXCODE2) CDate * %{
        /* csvarout typemap code */
        get {
          global::System.IntPtr cPtr = $imcall;
          CDate tempDate = (cPtr == global::System.IntPtr.Zero) ? null : new CDate(cPtr, $owner);$excode
          return new System.DateTime(tempDate.getYear(), tempDate.getMonth(), tempDate.getDay(),
                                     0, 0, 0);
        } %}
    

    For a module called example, the typemaps result in the following code:

    public class example {
      public static System.DateTime ImportantDate {
        /* csvarin typemap code */
        set {
          CDate tempvalue = new CDate(value.Year, value.Month, value.Day);
          examplePINVOKE.ImportantDate_set(CDate.getCPtr(tempvalue));
        } 
        /* csvarout typemap code */
        get {
          global::System.IntPtr cPtr = examplePINVOKE.ImportantDate_get();
          CDate tempDate = (cPtr == global::System.IntPtr.Zero) ? null : new CDate(cPtr, false);
          return new System.DateTime(tempDate.getYear(), tempDate.getMonth(), tempDate.getDay(),
                                     0, 0, 0);
        } 
      }
      ...
    }
    

    Some points to note:

    • The property set comes from the 'csvarin' typemap and the property get comes from the 'csvarout' typemap.
    • The type used for the property comes from the 'cstype' typemap. This particular example has the 'out' attribute set in the typemap and as it is specified, it is used in preference to the type in the typemap body. This is because the type in the 'out' attribute can never include modifiers such as 'ref', thereby avoiding code such as public static ref System.DateTime ImportantDate { ..., which would of course not compile.
    • The $excode special variable expands to nothing as there are no exception handlers specified in any of the unmanaged code typemaps (in fact the marshalling was done using the default unmanaged code typemaps.)
    • The $imcall typemap expands to the appropriate intermediary method call in the examplePINVOKE class.
    • The $csinput special variable in the 'csin' typemap always expands to value for properties. In this case $csclassname.getCPtr(temp$csinput) expands to CDate.getCPtr(tempvalue).
    • The 'csin' typemap has 'pre', 'post' and 'cshin' attributes, and these are all ignored in the property set. The code in these attributes must instead be replicated within the 'csvarin' typemap. The line creating the temp$csinput variable is such an example; it is identical to what is in the 'pre' attribute.

    22.8.5 Date example demonstrating the 'pre' and 'post' typemap attributes for directors

    The 'pre' and 'post' attributes in the "csdirectorin" typemap act like the attributes of the same name in the "csin" typemap. For example if we modify the Date marshalling example like this:

    class CDate {
      ...
      void setYear(int);
      void setMonth(int);
      void setDay(int);
    };
    struct Action {
      virtual void someCallback(CDate &date);
      virtual ~Action();
      ...
    };
    

    and declare %feature ("director") for the Action class, we would have to define additional marshalling rules for CDate & parameter. The typemap may look like this:

    %typemap(csdirectorin,
             pre="System.DateTime temp$iminput = new System.DateTime();",
             post="CDate temp2$iminput = new CDate($iminput, false);\n"
                  "temp2$iminput.setYear(tempdate.Year);\n"
                  "temp2$iminput.setMonth(tempdate.Month);\n"
                  "temp2$iminput.setDay(tempdate.Day);"
             ) CDate &date "out temp$iminput"
    

    The generated proxy class code will then contain the following wrapper for calling user-overloaded someCallback():

    ...
      private void SwigDirectorMethodsomeCallback(global::System.IntPtr date) {
        System.DateTime tempdate = new System.DateTime();
        try {
          someCallback(out tempdate);
        } finally {
          // we create a managed wrapper around the existing C reference, just for convenience
          CDate temp2date = new CDate(date, false);
          temp2date.setYear(tempdate.Year);
          temp2date.setMonth(tempdate.Month);
          temp2date.setDay(tempdate.Day);
        }
      }
    ...
    

    Pay special attention to the memory management issues, using these attributes.

    22.8.6 Turning proxy classes into partial classes

    C# supports the notion of partial classes whereby a class definition can be split into more than one file. It is possible to turn the wrapped C++ class into a partial C# class using the csclassmodifiers typemap. Consider a C++ class called ExtendMe :

    class ExtendMe {
    public:
      int Part1() { return 1; }
    };
    

    The default C# proxy class generated is:

    public class ExtendMe : global::System.IDisposable {
      ...
      public int Part1() {
        ...
      }
    }
    

    The default csclassmodifiers typemap shipped with SWIG is

    %typemap(csclassmodifiers) SWIGTYPE "public class"
    

    Note that the type used is the special catch all type SWIGTYPE . If instead we use the following typemap to override this for just the ExtendMe class:

    %typemap(csclassmodifiers) ExtendMe "public partial class"
    

    The C# proxy class becomes a partial class:

    public partial class ExtendMe : global::System.IDisposable {
      ...
      public int Part1() {
        ...
      }
    }
    

    You can then of course declare another part of the partial class elsewhere, for example:

    public partial class ExtendMe : global::System.IDisposable {
      public int Part2() {
        return 2;
      }
    }
    

    and compile the following code:

    ExtendMe em = new ExtendMe();
    Console.WriteLine("part1: {0}", em.Part1());
    Console.WriteLine("part2: {0}", em.Part2());
    

    demonstrating that the class contains methods calling both unmanaged code - Part1() and managed code - Part2(). The following example is an alternative approach to adding managed code to the generated proxy class.

    22.8.7 Turning proxy classes into sealed classes

    The technique in the previous section can be used to make the proxy class a sealed class. Consider a C++ class NotABaseClass that you don't want to be derived from in C#:

    struct NotABaseClass {
      NotABaseClass();
      ~NotABaseClass();
    };
    

    The default C# proxy class method generated with Dispose method is:

    public class NotABaseClass : global::System.IDisposable {
      ...
      public virtual void Dispose() {
        ...
      }
    }
    

    The csclassmodifiers typemap can be used to modify the class modifiers and the csmethodmodifiers feature can be used on the destructor to modify the proxy's Dispose method:

    %typemap(csclassmodifiers) NotABaseClass "public sealed class"
    %csmethodmodifiers NotABaseClass::~NotABaseClass "public /*virtual*/";
    

    The relevant generated code is thus:

    public sealed class NotABaseClass : global::System.IDisposable {
      ...
      public /*virtual*/ void Dispose() {
        ...
      }
    }
    

    Any attempt to derive from the NotABaseClass in C# will result in a C# compiler error, for example:

    public class Derived : NotABaseClass {
    };
    
    runme.cs(6,14): error CS0509: `Derived': cannot derive from sealed type `NotABaseClass'
    

    Finally, if you get a warning about use of 'protected' in the generated base class:

    NotABaseClass.cs(14,18): warning CS0628: `NotABaseClass.swigCMemOwn': new protected member declared in sealed class
    

    Either suppress the warning or modify the generated code by copying and tweaking the default 'csbody' typemap code in csharp.swg by modifying swigCMemOwn to not be protected.

    22.8.8 Extending proxy classes with additional C# code

    The previous example showed how to use partial classes to add functionality to a generated C# proxy class. It is also possible to extend a wrapped struct/class with C/C++ code by using the %extend directive. A third approach is to add some C# methods into the generated proxy class with the cscode typemap. If we declare the following typemap before SWIG parses the ExtendMe class used in the previous example

    %typemap(cscode) ExtendMe %{
      public int Part3() {
        return 3;
      }
    %}
    
    

    The generated C# proxy class will instead be:

    public class ExtendMe : global::System.IDisposable {
      ...
      public int Part3() {
        return 3;
      }
      public int Part1() {
        ...
      }
    }
    

    22.8.9 Underlying type for enums

    C# enums use int as the underlying type for each enum item. If you wish to change the underlying type to something else, then use the csbase typemap. For example when your C++ code uses a value larger than int, this is necessary as the C# compiler will not compile values which are too large to fit into an int. Here is an example:

    %typemap(csbase) BigNumbers "uint"
    %inline %{
      enum BigNumbers { big=0x80000000, bigger };
    %}
    

    The generated enum will then use the given underlying type and compile correctly:

    public enum BigNumbers : uint {
      big = 0x80000000,
      bigger
    }
    

    23 SWIG and D

    23.1 Introduction

    From the D Programming Language web site: D is a systems programming language. Its focus is on combining the power and high performance of C and C++ with the programmer productivity of modern languages like Ruby and Python. [...] The D language is statically typed and compiles directly to machine code. As such, it is not very surprising that D is able to directly interface with C libraries. Why would a SWIG module for D be needed then in the first place?

    Well, besides the obvious downside that the C header files have to be manually converted to D modules for this to work, there is one major inconvenience with this approach: D code usually is on a higher abstraction level than C, and many of the features that make D interesting are simply not available when dealing with C libraries, requiring you e.g. to manually convert strings between pointers to \0-terminated char arrays and D char arrays, making the algorithms from the D2 standard library unusable with C arrays and data structures, and so on.

    While these issues can be worked around relatively easy by hand-coding a thin wrapper layer around the C library in question, there is another issue where writing wrapper code per hand is not feasible: C++ libraries. D did not support interfacing to C++ in version 1 at all, and even if extern(C++) has been added to D2, the support is still very limited, and a custom wrapper layer is still required in many cases.

    To help addressing these issues, the SWIG C# module has been forked to support D. Is has evolved quite a lot since then, but there are still many similarities, so if you do not find what you are looking for on this page, it might be worth having a look at the chapter on C# (and also on Java, since the C# module was in turn forked from it).

    23.2 Command line invocation

    To activate the D module, pass the -d option to SWIG at the command line. The same standard command line options as with any other language module are available, plus the following D specific ones:

    -d2

    By default, SWIG generates code for D1/Tango. Use the -d2 flag to target D2/Phobos instead.

    -splitproxy

    By default, SWIG generates two D modules: the proxy module, named like the source module (either specified via the %module directive or via the module command line option), which contains all the proxy classes, functions, enums, etc., and the intermediary module (named like the proxy module, but suffixed with _im), which contains all the extern(C) function declarations and other private parts only used internally by the proxy module.

    If the split proxy mode is enabled by passing this option at the command line, all proxy classes and enums are emitted to their own D module instead. The main proxy module only contains free functions and constants in this case.

    -package <pkg>

    By default, the proxy D modules and the intermediary D module are written to the root package. Using this option, you can specify another target package instead.

    -wrapperlibrary <wl>

    The code SWIG generates to dynamically load the C/C++ wrapper layer looks for a library called $module_wrap by default. With this option, you can override the name of the file the wrapper code loads at runtime (the lib prefix and the suffix for shared libraries are appended automatically, depending on the OS).

    This might especially be useful if you want to invoke SWIG several times on separate modules, but compile the resulting code into a single shared library.

    23.3 Typemaps

    23.3.1 C# <-> D name comparison

    If you already know the SWIG C# module, you might find the following name comparison table useful:

     ctype                  <->  ctype
     imtype                 <->  imtype
     cstype                 <->  dtype
     csin                   <->  din
     csout                  <->  dout
     csdirectorin           <->  ddirectorin
     csdirectorout          <->  ddirectorout
     csinterfaces           <->  dinterfaces
     csinterfaces_derived   <->  dinterfaces_derived
     csbase                 <->  dbase
     csclassmodifiers       <->  dclassmodifiers
     cscode                 <->  dcode
     csimports              <->  dimports
     csbody                 <->  dbody
     csfinalize             <->  ddestructor
     csdisposing            <->  ddispose
     csdisposing_derived    <->  ddispose_derived
    

    23.3.2 ctype, imtype, dtype

    Mapping of types between the C/C++ library, the C/C++ library wrapper exposing the C functions, the D wrapper module importing these functions and the D proxy code.

    The ctype typemap is used to determine the types to use in the C wrapper functions. The types from the imtype typemap are used in the extern(C) declarations of these functions in the intermediary D module. The dtype typemap contains the D types used in the D proxy module/class.

    23.3.3 in, out, directorin, directorout

    Used for converting between the types for C/C++ and D when generating the code for the wrapper functions (on the C++ side).

    The code from the in typemap is used to convert arguments to the C wrapper function to the type used in the wrapped code (ctype ->original C++ type), the out typemap is utilized to convert values from the wrapped code to wrapper function return types (original C++ type->ctype).

    The directorin typemap is used to convert parameters to the type used in the D director callback function, its return value is processed by directorout (see below).

    23.3.4 din, dout, ddirectorin, ddirectorout

    Typemaps for code generation in D proxy and type wrapper classes.

    The din typemap is used for converting function parameter types from the type used in the proxy module or class to the type used in the intermediary D module (the $dinput macro is replaced). To inject further parameter processing code before or after the call to the intermediary layer, the pre , post and terminator attributes can be used (please refer to the C# date marshalling example for more information on these).

    The dout typemap is used for converting function return values from the return type used in the intermediary D module to the type returned by the proxy function. The $excode special variable in dout typemaps is replaced by the excode typemap attribute code if the method can throw any exceptions from unmanaged code, otherwise by nothing (the $imcall and $owner macros are replaced).

    The code from the ddirectorin and ddirectorout typemaps is used for conversion in director callback functions. Arguments are converted to the type used in the proxy class method they are calling by using the code from ddirectorin, the proxy class method return value is converted to the type the C++ code expects via the ddirectorout typemap (the $dcall and $winput macros are replaced).

    The full chain of type conversions when a director callback is invoked looks like this:

          type              CPPClass::method(type a)
            ↑                       ↓
       <directorout>          <directorin>
            ↑                       ↓
          ctype             methodCallback(ctype a)           C++
     :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
          imtype            methodCallback(imtype a)           D
            ↑                       ↓
      <ddirectorout>          <ddirectorin>
            ↑                       ↓
          dtype             DClass.method(dtype a)

    23.3.5 typecheck typemaps

    Because, unlike many scripting languages supported by SWIG, D does not need any dynamic dispatch helper to access an overloaded function, the purpose of these is merely to issue a warning for overloaded C++ functions that cannot be overloaded in D (as more than one C++ type maps to a single D type).

    23.3.6 Code injection typemaps

    These typemaps are used for generating the skeleton of proxy classes for C++ types.

    By overriding dbase, dinterfaces or dinterfaces_derived, the inheritance chain of the generated proxy class for a type can be modified. dclassmodifiers allows you to add any custom modifiers around the class keyword.

    Using dcode and dimports, you can specify additional D code which will be emitted into the class body respectively the imports section of the D module the class is written to.

    dconstructor, ddestructor, ddispose and ddispose_derived are used to generate the class constructor, destructor and dispose() method, respectively. The auxiliary code for handling the pointer to the C++ object is stored in dbody and dbody_derived. You can override them for specific types.

    Code can also be injected into the D proxy class using %proxycode.

    23.3.7 Special variable macros

    The standard SWIG special variables are available for use within typemaps as described in the Typemaps documentation , for example $1, $input, $result etc.

    When generating D wrappers, a few additional macros are available:

    $dclassname (C#: $csclassname)

    This special variable works similar to $n_type in that it returns the name of a type - it expands to the D proxy class name of the type being wrapped. If the type does not have an associated proxy class, it expands to the type wrapper class name, for example, SWIGTYPE_p_p_SomeCppClass is generated when wrapping SomeCppClass **.

    There are two other variants available, $&dclassname and $*dclassname. The former adds a level of indirection, while the latter removes one. For instance, when wrapping Foo **, $*dclassname would be replaced by the proxy class name corresponding to Foo *.

    $dclazzname (C#: $csclazzname)

    This special variable expands the fully qualified C++ class into the package name, if used by the nspace feature, and the proxy class name, mangled for use as a function name. For example, Namespace1::Namespace2::Klass is expanded into Namespace1_Namespace2_Klass_.

    This special variable might be useful for calling certain functions in the wrapper layer (e.g. upcast wrappers) which are mangled like this.

    $null

    In code inserted into the generated C/C++ wrapper functions, this variable is replaced by either 0 or nothing at all, depending on whether the function has a return value or not. It can be used to bail out early e.g. in case of errors (return $null;).

    $dinput (C#: $csinput)

    This variable is used in din typemaps and is replaced by the expression which is to be passed to C/C++.

    For example, this input

    %typemap(din) SomeClass * "SomeClass.getCPointer($dinput)"
    
    %inline %{
      class SomeClass {};
      void foo(SomeClass *arg);
    %}

    leads to the following D proxy code being generated:

    void foo(SomeClass arg) {
      example_im.foo(SomeClass.getCPointer(arg));
    }
    $imcall and $owner (C#: $imcall)

    These variables are used in dout typemaps. $imcall contains the call to the intermediary module which provides the value to be used, and $owner signals if the caller is responsible for managing the object lifetime (that is, if the called method is a constructor or has been marked via %newobject ).

    Consider the following example:

    %typemap(dout) SomeClass * {
      return new SomeClass($imcall, $owner);
    }
    
    %inline %{
      class SomeClass;
      SomeClass *foo();
    
      %newobject bar();
      SomeClass *bar();
    %}
    

    The code generated for foo() and bar() looks like this:

    SomeClass foo() {
      return new SomeClass(example_im.foo(), false);
    }
    
    SomeClass bar() {
      return new SomeClass(example_im.bar(), true);
    }
    
    $dcall and $winput (C#: $cscall, $iminput)

    These variables are used in the director-specific typemaps ddirectorin and ddirectorout. They are more or less the reverse of the $imcall and $dinput macros: $dcall contains the invocation of the D proxy method of which the return value is to be passed back to C++, $winput contains the parameter value from C++.

    $excode

    This variable is used in dout and dconstructor typemaps and is filled with the contents of the excode typemap attribute if an exception could be thrown from the C++ side. See the C# documentation for details.

    $dbaseclass

    Currently for internal use only, it contains the D name of the C++ base class (if any) inside proxy classes.

    $directorconnect

    This macro is only valid inside the dconstructor typemap and contains the value of the dconstructor typemap attribute if the currently wrapped class has directors enabled.

    This is how the default dconstructor typemap looks like (you usually do not want to specify a custom one):

    %typemap(dconstructor, excode=SWIGEXCODE,
             directorconnect="\n  swigDirectorConnect();") SWIGTYPE {
      this($imcall, true);$excode$directorconnect
    }
    
    $importtype(SomeDType)

    This macro is used in the dimports typemap if a dependency on another D type generated by SWIG is added by a custom typemap.

    Consider the following code snippet:

    %typemap(dinterfaces) SomeClass "AnInterface, AnotherInterface";
    

    This causes SWIG to add AnInterface and AnotherInterface to the base class list of SomeClass:

    class SomeClass : AnInterface, AnotherInterface {
      ...
    }
    

    For this to work, AnInterface and AnotherInterface have to be in scope. If SWIG is not in split proxy mode, this is already the case, but if it is, they have to be added to the import list via the dimports typemap. Additionally, the import statement depends on the package SWIG is configured to emit the modules to.

    The $importtype macro helps you to elegantly solve this problem:

    %typemap(dimports) RemoteMpe %{
    $importtype(AnInterface)
    $importtype(AnotherInterface)
    %}
    

    If SWIG is in split proxy mode, it expands to an import statement for the specified type, to nothing if not.

    $module

    Expands to the name of the main proxy D module.

    $imdmodule

    Contains the fully qualified name of the intermediary D module.

    23.4 D and %feature

    The D module defines a number of directives which modify the SWIG features set globally or for a specific declaration:

    %dmanifestconst and %dconstvalue(value)

    Out of the box, SWIG generates accessor methods for C #defines and C++ constants. The %dmanifestconst directive enables wrapping these constants as D manifest constants (const in D1, enum in D2).

    For this to work, the C/C++ code for the constant value must directly compile as D code, though. If this is not the case, you can manually override the expression written to the D proxy module using the %dconstvalue directive, passing the new value as parameter.

    For enums, again %dconstvalue can be used to override the value of an enum item if the initializer should not compile in D.

    %dmethodmodifiers

    This directive can be used to override the modifiers for a proxy function. For instance, you could make a public C++ member function private in D like this:

    %dmethodmodifiers A::foo "private";
    
    %inline %{
    struct A {
      void foo();
    };
    %}
    

    23.5 Pragmas

    There are a few SWIG pragmas specific to the D module, which you can use to influence the D code SWIG generates:

    %pragma(d) imdmodulecode

    The passed text (D code) is copied verbatim to the intermediary D module. For example, it can be (and is, internally) used to emit additional private helper code for the use by proxy typemaps.

    %pragma(d) imdmoduleimports

    Additional code to be emitted to the imports section of the intermediary D module (the $importtype macro can be used here). You probably want to use this in conjunction with the imdmodulecode pragma.

    %pragma(d) proxydmodulecode

    Just like proxydmodulecode, the argument is copied to the proxy D module (if SWIG is in split proxy mode and/or the nspace feature is used, it is emitted to the main proxy D module only).

    %pragma(d) globalproxyimports

    The D module currently does not support specifying dependencies on external modules (e.g. from the standard library) for the D typemaps. To add the import statements to the proxy modules (resp. to all proxy modules if in split proxy mode), you can use the globalproxyimports directive.

    For example:

    %typemap(din) char[] "($dinput ? tango.stdc.stringz.toStringz($dinput) : null)"
    %pragma(d) globalproxyimports = "static import tango.stdc.stringz;";
    
    %pragma(d) wrapperloadercode

    The D code for loading the wrapper library (it is copied to the intermediary D module). The $wrapperloaderbindcode variable is replaced by the list of commands for binding the functions from the wrapper library to the symbols in the intermediary D module.

    Each time this pragma is specified, the previous value is overwritten.

    %pragma(d) wrapperloaderbindcommand

    The D command to use for binding the wrapper functions from the C/C++ library to the symbols in the intermediary D module. The $function variable contains the name of the D function in the wrap module, the $symbol variable is replaced by the name of the symbol in the library.

    Each time this pragma is specified, the previous value is overwritten.

    23.6 D Exceptions

    Out of the box, C++ exceptions are fundamentally incompatible to their equivalent in the D world and cannot simply be propagated to a calling D method. There is, however, an easy way to solve this problem: Just catch the exception in the C/C++ wrapper layer, pass the contents to D, and make the wrapper code rethrow the exception in the D world.

    The implementation details of this are a bit crude, but the SWIG D module automatically takes care of this, as long as it is able to detect that an exception could potentially be thrown (e.g. because the C++ method has a throw(...) exception specification).

    As this feature is implemented in exactly the same way it is for C#, please see the C# documentation for a more detailed explanation.

    23.7 D Directors

    When the directors feature is activated, SWIG generates extra code on both the C++ and the D side to enable cross-language polymorphism. Essentially, this means that if you subclass a proxy class in D, C++ code can access any overridden virtual methods just as if you created a derived class in C++.

    There is no D specific documentation yet, but the way the feature is implemented is very similar to how it is done in Java and C#.

    23.8 Other features

    23.8.1 Extended namespace support (nspace)

    By default, SWIG flattens all C++ namespaces into a single target language namespace, but as for Java and C#, the nspace feature is supported for D. If it is active, C++ namespaces are mapped to D packages/modules. Note, however, that like for the other languages, free variables and functions are not supported yet; currently, they are all allows written to the main proxy D module.

    23.8.2 Native pointer support

    Contrary to many of the scripting languages supported by SWIG, D fully supports C-style pointers. The D module thus includes a custom mechanism to wrap C pointers directly as D pointers where applicable, that is, if the type that is pointed to is represented the same in C and D (on the bit-level), dubbed a primitive type below.

    Central to this custom pointer handling scheme are two typemap attributes: the cprimitive attribute on the dtype typemap and the nativepointer attribute on all the typemaps which influence the D side of the code (dtype, din, dout, ...). When a D typemap is looked up, the following happens behind the scenes:

    First, the matching typemap is determined by the usual typemap lookup rules. Then, it is checked if the result has the nativepointer attribute set. If it is present, it means that its value should replace the typemap value if and only if the actual type the typemap is looked up for is a primitive type, a pointer to a primitive type (through an arbitrary level of indirections), or a function pointer with only primitive types in its signature.

    To determine if a type should be considered primitive, the cprimitive attribute on its dtype attribute is used. For example, the dtype typemap for float has cprimitive="1", so the code from the nativepointer attribute is taken into account e.g. for float ** or the function pointer float (*)(float *).

    23.8.3 Operator overloading

    The D module comes with basic operator overloading support for both D1 and D2. There are, however, a few limitations arising from conceptual differences between C++ and D:

    The first key difference is that C++ supports free functions as operators (along with argument-dependent lookup), while D requires operators to be member functions of the class they are operating on. SWIG can only automatically generate wrapping code for member function operators; if you want to use operators defined as free functions in D, you need to handle them manually.

    Another set of differences between C++ and D concerns individual operators. For example, there are quite a few operators which are overloadable in C++, but not in D, for example && and || , but also !, and prefix increment/decrement operators in D1 resp. their postfix pendants in D2.

    There are also some cases where the operators can be translated to D, but the differences in the implementation details are big enough that a rather involved scheme would be required for automatic wrapping them, which has not been implemented yet. This affects, for example, the array subscript operator, [], in combination with assignments - while operator [] in C++ simply returns a reference which is then written to, D resorts to a separate opIndexAssign method -, or implicit casting (which was introduced in D2 via alias this ). Despite the lack of automatic support, manually handling these cases should be perfectly possible.

    23.8.4 Running the test-suite

    As with any other language, the SWIG test-suite can be built for D using the *-d-test-suite targets of the top-level Makefile. By default, D1 is targeted, to build it with D2, use the optional D_VERSION variable, e.g. make check-d-test-suite D_VERSION=2 .

    Note: If you want to use GDC on Linux or another platform which requires you to link libdl for dynamically loading the shared library, you might have to add -ldl manually to the d_compile target in Examples/Makefile, because GDC does not currently honor the pragma(lib, ...) statement.

    23.9 D Typemap examples

    There are no D-specific typemap examples yet. However, with the above name comparison table, you should be able to get an idea what can be done by looking at the corresponding C# section.

    23.10 Work in progress and planned features

    There are a couple of features which are not implemented yet, but would be very useful and might be added in the near future:

    • Static linking: Currently, the C wrapper code is compiled into a dynamic library, out of which the symbol addresses are looked up at runtime by the D part. If statically linking the different languages into one binary was supported, a tool-chain capable of performing IPO at link time could inline the wrapping code, effectively reducing the overhead for simple calls to zero.
    • C array handling: Many data structures in some C/C++ libraries contain array containing of a pointer to the first element and the element count. Currently, one must manually writing wrapper code to be able to access these from D. It should be possible to add a set of SWIG macros to semi-automatically generate conversion code.

    Some generated code might also be a bit rough around the edges, particularly in the following areas:

    • Memory management: Although the currently generated wrapper code works fine with regard to the GC for the test-suite, there might be issues coming up in real-world multi-threaded usage.
    • D2 support: Originally, the module has been developed for the use with D1, D2/Phobos support has been added in later. The basic features should work equally well for both, but there could be issues concerning const-correctness etc.

    24 SWIG and Go

    This chapter describes SWIG's support of Go. For more information on the Go programming language see golang.org .

    24.1 Overview

    Go does not support direct calling of functions written in C/C++. The cgo program may be used to generate wrappers to call C code from Go, but there is no convenient way to call C++ code. SWIG fills this gap.

    There are (at least) two different Go compilers. The first is the gc compiler of the Go distribution, normally invoked via the go tool. The second Go compiler is the gccgo compiler, which is a frontend to the GCC compiler suite. The interface to C/C++ code is completely different for the two Go compilers. SWIG supports both Go compilers, selected by the -gccgo command line option.

    Go is a type-safe compiled language and the wrapper code generated by SWIG is type-safe as well. In case of type issues the build will fail and hence SWIG's runtime library and runtime type checking are not used.

    24.2 Examples

    Working examples can be found in the SWIG source tree .

    Please note that the examples in the SWIG source tree use makefiles with the .i SWIG interface file extension for backwards compatibility with Go 1.

    24.3 Running SWIG with Go

    Most Go programs are built using the go tool. Since Go 1.1 the go tool has support for SWIG. To use it, give your SWIG interface file the extension .swig (for C code) or .swigcxx (for C++ code). Put that file in a GOPATH/src directory as usual for Go sources. Put other C/C++ code in the same directory with extensions of .c and .cxx. The go build and go install commands will automatically run SWIG for you and compile the generated wrapper code. To check the SWIG command line options the go tool uses run go build -x. To access the automatically generated files run go build -work. You'll find the files under the temporary WORK directory.

    To manually generate and compile C/C++ wrapper code for Go, use the -go option with SWIG. By default SWIG will generate code for the Go compiler of the Go distribution. To generate code for gccgo, you should also use the -gccgo option.

    By default SWIG will generate files that can be used directly by go build. This requires Go 1.2 or later. Put your SWIG interface file in a directory under GOPATH/src, and give it a name that does not end in the .swig or .swigcxx extension. Typically the SWIG interface file extension is .i in this case.

    % swig -go example.i
    % go install
    

    You will now have a Go package that you can import from other Go packages as usual.

    SWIG can be used without cgo, via the -no-cgo option, but more steps are required. This only works with Go versions before 1.5. When using Go version 1.2 or later, or when using gccgo, the code generated by SWIG can be linked directly into the Go program. A typical command sequence when using the Go compiler of the Go distribution would look like this:

    % swig -go -no-cgo example.i
    % gcc -c code.c    # The C library being wrapped.
    % gcc -c example_wrap.c
    % go tool 6g example.go
    % go tool 6c example_gc.c
    % go tool pack grc example.a example.6 example_gc.6 code.o example_wrap.o
    % go tool 6g main.go
    % go tool 6l main.6
    

    You can also put the wrapped code into a shared library, and when using the Go versions before 1.2 this is the only supported option. A typical command sequence for this approach would look like this:

    % swig -go -no-cgo -use-shlib example.i
    % gcc -c -fpic example.c
    % gcc -c -fpic example_wrap.c
    % gcc -shared example.o example_wrap.o -o example.so
    % go tool 6g example.go
    % go tool 6c example_gc.c
    % go tool pack grc example.a example.6 example_gc.6
    % go tool 6g main.go  # your code, not generated by SWIG
    % go tool 6l main.6
    

    24.3.1 Go-specific Commandline Options

    These are the command line options for SWIG's Go module. They can also be seen by using:

    swig -go -help
    
    Go-specific options
    -cgoGenerate files to be used as input for the Go cgo tool. This is the default.
    -no-cgoGenerate files that can be used directly, rather than via the Go cgo tool. This option does not work with Go 1.5 or later. It is required for versions of Go before 1.2.
    -intgosize <s>Set the size for the Go type int . This controls the size that the C/C++ code expects to see. The <s> argument should be 32 or 64. This option is currently required during the transition from Go 1.0 to Go 1.1, as the size of int on 64-bit x86 systems changes between those releases (from 32 bits to 64 bits). In the future the option may become optional, and SWIG will assume that the size of int is the size of a C pointer.
    -gccgoGenerate code for gccgo. The default is to generate code for the Go compiler of the Go distribution.
    -package <name>Set the name of the Go package to <name>. The default package name is the SWIG module name.
    -use-shlibTell SWIG to emit code that uses a shared library. This is only meaningful for the Go compiler of the Go distribution, which needs to know at compile time whether a shared library will be used.
    -soname <name>Set the runtime name of the shared library that the dynamic linker should include at runtime. The default is the package name with ".so" appended. This is only used when generating code for the Go compiler of the Go distribution; when using gccgo, the equivalent name will be taken from the -soname option passed to the linker. Using this option implies the -use-shlib option.
    -go-pkgpath <pkgpath>When generating code for gccgo, set the pkgpath to use. This corresponds to the -fgo-pkgpath option to gccgo.
    -go-prefix <prefix>When generating code for gccgo, set the prefix to use. This corresponds to the -fgo-prefix option to gccgo. If -go-pkgpath is used, -go-prefix will be ignored.
    -import-prefix <prefix>A prefix to add when turning a %import prefix in the SWIG interface file into an import statement in the Go file. For example, with -import-prefix mymodule, a SWIG interface file %import mypackage will become a Go import statement import "mymodule/mypackage".

    24.3.2 Generated Wrapper Files

    There are two different approaches to generating wrapper files, controlled by SWIG's -no-cgo option. The -no-cgo option only works with version of Go before 1.5. It is required when using versions of Go before 1.2.

    With or without the -no-cgo option, SWIG will generate the following files when generating wrapper code:

    • MODULE.go will contain the Go functions that your Go code will call. These functions will be wrappers for the C++ functions defined by your module. This file should, of course, be compiled with the Go compiler.
    • MODULE_wrap.c or MODULE_wrap.cxx will contain C/C++ functions will be invoked by the Go wrapper code. This file should be compiled with the usual C or C++ compiler.
    • MODULE_wrap.h will be generated if you use the directors feature. It provides a definition of the generated C++ director classes. It is generally not necessary to use this file, but in some special cases it may be helpful to include it in your code, compiled with the usual C or C++ compiler.

    When the -no-cgo option is used, and the -gccgo option is not used, SWIG will also generate an additional file:

    • MODULE_gc.c will contain C code which should be compiled with the C compiler distributed as part of the gc compiler. It should then be combined with the compiled MODULE.go using go tool pack.

    24.4 A tour of basic C/C++ wrapping

    By default, SWIG attempts to build a natural Go interface to your C/C++ code. However, the languages are somewhat different, so some modifications have to occur. This section briefly covers the essential aspects of this wrapping.

    24.4.1 Go Package Name

    All Go source code lives in a package. The name of this package will default to the name of the module from SWIG's %module directive. You may override this by using SWIG's -package command line option.

    24.4.2 Go Names

    In Go, a function is only visible outside the current package if the first letter of the name is uppercase. This is quite different from C/C++. Because of this, C/C++ names are modified when generating the Go interface: the first letter is forced to be uppercase if it is not already. This affects the names of functions, methods, variables, constants, enums, and classes.

    C/C++ variables are wrapped with setter and getter functions in Go. First the first letter of the variable name will be forced to uppercase, and then Get or Set will be prepended. For example, if the C/C++ variable is called var, then SWIG will define the functions GetVar and SetVar. If a variable is declared as const, or if SWIG's %immutable directive is used for the variable, then only the getter will be defined.

    C++ classes will be discussed further below. Here we'll note that the first letter of the class name will be forced to uppercase to give the name of a type in Go. A constructor will be named New followed by that name, and the destructor will be named Delete followed by that name.

    24.4.3 Go Constants

    C/C++ constants created via #define or the %constant directive become Go constants, declared with a const declaration.

    24.4.4 Go Enumerations

    C/C++ enumeration types will cause SWIG to define an integer type with the name of the enumeration (with first letter forced to uppercase as usual). The values of the enumeration will become variables in Go; code should avoid modifying those variables.

    24.4.5 Go Classes

    Go has interfaces, methods and inheritance, but it does not have classes in the same sense as C++. This sections describes how SWIG represents C++ classes represented in Go.

    For a C++ class ClassName, SWIG will define two types in Go: an underlying type, which will just hold a pointer to the C++ type, and an interface type. The interface type will be named ClassName . SWIG will define a function NewClassName which will take any constructor arguments and return a value of the interface type ClassName. SWIG will also define a destructor DeleteClassName .

    SWIG will represent any methods of the C++ class as methods on the underlying type, and also as methods of the interface type. Thus C++ methods may be invoked directly using the usual val.MethodName syntax. Public members of the C++ class will be given getter and setter functions defined as methods of the class.

    SWIG will represent static methods of C++ classes as ordinary Go functions. SWIG will use names like ClassNameMethodName. SWIG will give static members getter and setter functions with names like GetClassName_VarName.

    Given a value of the interface type, Go code can retrieve the pointer to the C++ type by calling the Swigcptr method. This will return a value of type SwigcptrClassName, which is just a name for uintptr. A Go type conversion can be used to convert this value to a different C++ type, but note that this conversion will not be type checked and is essentially equivalent to reinterpret_cast. This should only be used for very special cases, such as where C++ would use a dynamic_cast.

    Note that C++ pointers to compound objects are represented in go as objects themselves, not as go pointers. So, for example, if you wrap the following function:

    class MyClass {
      int MyMethod();
      static MyClass *MyFactoryFunction();
    };
    
    

    You will get go code that looks like this:

    type MyClass interface {
      Swigcptr() uintptr
      SwigIsMyClass()
      MyMethod() int
    }
    
    func MyClassMyFactoryFunction() MyClass {
      // swig magic here
    }
    

    Note that the factory function does not return a go pointer; it actually returns a go interface. If the returned pointer can be null, you can check for this by calling the Swigcptr() method.

    24.4.5.1 Go Class Memory Management

    Calling NewClassName for a C++ class ClassName will allocate memory using the C++ memory allocator. This memory will not be automatically freed by Go's garbage collector as the object ownership is not tracked. When you are done with the C++ object you must free it using DeleteClassName.

    The most Go idiomatic way to manage the memory for some C++ class is to call NewClassName followed by a defer of the DeleteClassName call. Using defer ensures that the memory of the C++ object is freed as soon as the function containing the defer statement returns. Furthermore defer works great for short-lived objects and fits nicely C++'s RAII idiom. Example:

    func UseClassName(...) ... {
      o := NewClassName(...)
      defer DeleteClassName(o)
      // Use the ClassName object
      return ...
    }
    

    With increasing complexity, especially complex C++ object hierarchies, the correct placement of defer statements becomes harder and harder as C++ objects need to be freed in the correct order. This problem can be eased by keeping a C++ object function local so that it is only available to the function that creates a C++ object and functions called by this function. Example:

    func WithClassName(constructor args, f func(ClassName, ...interface{}) error, data ...interface{}) error {
      o := NewClassName(constructor args)
      defer DeleteClassName(o)
      return f(o, data...)
    }
    
    func UseClassName(o ClassName, data ...interface{}) (err error) {
      // Use the ClassName object and additional data and return error.
    }
    
    func main() {
      WithClassName(constructor args, UseClassName, additional data)
    }
    

    Using defer has limitations though, especially when it comes to long-lived C++ objects whose lifetimes are hard to predict. For such C++ objects a common technique is to store the C++ object into a Go object, and to use the Go function runtime.SetFinalizer to add a finalizer which frees the C++ object when the Go object is freed. It is strongly recommended to read the runtime.SetFinalizer documentation before using this technique to understand the runtime.SetFinalizer limitations.

    Common pitfalls with runtime.SetFinalizer are:

    • If a hierarchy of C++ objects will be automatically freed by Go finalizers then the Go objects that store the C++ objects need to replicate the hierarchy of the C++ objects to prevent that C++ objects are freed prematurely while other C++ objects still rely on them.
    • The usage of Go finalizers is problematic with C++'s RAII idiom as it isn't predictable when the finalizer will run and this might require a Close or Delete method to be added the Go object that stores a C++ object to mitigate.
    • The Go finalizer function typically runs in a different OS thread which can be problematic with C++ code that uses thread-local storage.

    runtime.SetFinalizer Example:

    import (
      "runtime"
      "wrap" // SWIG generated wrapper code
    )
    
    type GoClassName struct {
      wcn wrap.ClassName
    }
    
    func NewGoClassName() *GoClassName {
      o := &GoClassName{wcn: wrap.NewClassName()}
      runtime.SetFinalizer(o, deleteGoClassName)
      return o
    }
    
    func deleteGoClassName(o *GoClassName) {
      // Runs typically in a different OS thread!
      wrap.DeleteClassName(o.wcn)
      o.wcn = nil
    }
    
    func (o *GoClassName) Close() {
      // If the C++ object has a Close method.
      o.wcn.Close()
    
      // If the GoClassName object is no longer in an usable state.
      runtime.SetFinalizer(o, nil) // Remove finalizer.
      deleteGoClassName() // Free the C++ object.
    }
    

    24.4.5.2 Go Class Inheritance

    C++ class inheritance is automatically represented in Go due to its use of interfaces. The interface for a child class will be a superset of the interface of its parent class. Thus a value of the child class type in Go may be passed to a function which expects the parent class. Doing the reverse will require an explicit type assertion, which will be checked dynamically.

    24.4.6 Go Templates

    In order to use C++ templates in Go, you must tell SWIG to create wrappers for a particular template instantiation. To do this, use the %template directive.

    24.4.7 Go Director Classes

    SWIG's director feature permits a Go type to act as the subclass of a C++ class. This is complicated by the fact that C++ and Go define inheritance differently. SWIG normally represents the C++ class inheritance automatically in Go via interfaces but with a Go type representing a subclass of a C++ class some manual work is necessary.

    This subchapter gives a step by step guide how to properly subclass a C++ class with a Go type. In general it is strongly recommended to follow this guide completely to avoid common pitfalls with directors in Go.

    24.4.7.1 Example C++ code

    The step by step guide is based on two example C++ classes. FooBarAbstract is an abstract C++ class and the FooBarCpp class inherits from it. This guide explains how to implement a FooBarGo class similar to the FooBarCpp class.

    FooBarAbstract abstract C++ class:

    class FooBarAbstract
    {
    public:
      FooBarAbstract() {};
      virtual ~FooBarAbstract() {};
    
      std::string FooBar() {
        return this->Foo() + ", " + this->Bar();
      };
    
    protected:
      virtual std::string Foo() {
        return "Foo";
      };
    
      virtual std::string Bar() = 0;
    };
    

    FooBarCpp C++ class:

    class FooBarCpp : public FooBarAbstract
    {
    protected:
      virtual std::string Foo() {
        return "C++ " + FooBarAbstract::Foo();
      }
    
      virtual std::string Bar() {
        return "C++ Bar";
      }
    };
    

    Returned string by the FooBarCpp::FooBar method is:

    C++ Foo, C++ Bar
    

    The complete example, including the FooBarGoo class implementation, can be found in the end of the guide.

    24.4.7.2 Enable director feature

    The director feature is disabled by default. To use directors you must make two changes to the interface file. First, add the "directors" option to the %module directive, like this:

    %module(directors="1") modulename
    

    Second, you must use the %feature("director") directive to tell SWIG which classes should get directors. In the example the FooBarAbstract class needs the director feature enabled so that the FooBarGo class can inherit from it, like this:

    %feature("director") FooBarAbstract;
    

    For a more detailed documentation of the director feature and how to enable or disable it for specific classes and virtual methods see SWIG's Java documentation on directors.

    24.4.7.3 Constructor and destructor

    SWIG creates an additional set of constructor and destructor functions once the director feature has been enabled for a C++ class. NewDirectorClassName allows overriding virtual methods on the new object instance and DeleteDirectorClassName needs to be used to free a director object instance created with NewDirectorClassName. More on overriding virtual methods follows later in this guide under overriding virtual methods.

    The default constructor and destructor functions NewClassName and DeleteClassName can still be used as before so that existing code doesn't break just because the director feature has been enabled for a C++ class. The behavior is undefined if the default and director constructor and destructor functions get mixed and so great care needs to be taken that only one of the constructor and destructor function pairs is used for any object instance. Both constructor functions, the default and the director one, return the same interface type. This makes it potentially hard to know which destructor function, the default or the director one, needs to be called to delete an object instance.

    In theory the DirectorInterface method could be used to determine if an object instance was created via NewDirectorClassName:

    if o.DirectorInterface() != nil {
      DeleteDirectorClassName(o)
    } else {
      DeleteClassName(o)
    }
    

    In practice it is strongly recommended to embed a director object instance in a Go struct so that a director object instance will be represented as a distinct Go type that subclasses a C++ class. For this Go type custom constructor and destructor functions take care of the director constructor and destructor function calls and the resulting Go class will appear to the user as any other SWIG wrapped C++ class. More on properly subclassing a C++ class follows later in this guide under subclass via embedding .

    24.4.7.4 Override virtual methods

    In order to override virtual methods on a C++ class with Go methods the NewDirectorClassName constructor functions receives a DirectorInterface argument. The methods in the DirectorInterface are a subset of the public and protected virtual methods of the C++ class. Virtual methods that have a final specifier are unsurprisingly excluded. If the DirectorInterface contains a method with a matching signature to a virtual method of the C++ class then the virtual C++ method will be overwritten with the Go method. As Go doesn't support protected methods all overridden protected virtual C++ methods will be public in Go.

    As an example see part of the FooBarGo class:

    type overwrittenMethodsOnFooBarAbstract struct {
      fb FooBarAbstract
    }
    
    func (om *overwrittenMethodsOnFooBarAbstract) Foo() string {
      ...
    }
    
    func (om *overwrittenMethodsOnFooBarAbstract) Bar() string {
      ...
    }
    
    func NewFooBarGo() FooBarGo {
      om := &overwrittenMethodsOnFooBarAbstract{}
      fb := NewDirectorFooBarAbstract(om)
      om.fb = fb
      ...
    }
    

    The complete example, including the FooBarGoo class implementation, can be found in the end of the guide. In this part of the example the virtual methods FooBarAbstract::Foo and FooBarAbstract::Bar have been overwritten with Go methods similarly to how the FooBarAbstract virtual methods are overwritten by the FooBarCpp class.

    The DirectorInterface in the example is implemented by the overwrittenMethodsOnFooBarAbstract Go struct type. A pointer to a overwrittenMethodsOnFooBarAbstract struct instance will be given to the NewDirectorFooBarAbstract constructor function. The constructor return value implements the FooBarAbstract interface. overwrittenMethodsOnFooBarAbstract could in theory be any Go type but in practice a struct is used as it typically contains at least a value of the C++ class interface so that the overwritten methods can use the rest of the C++ class. If the FooBarGo class would receive additional constructor arguments then these would also typically be stored in the overwrittenMethodsOnFooBarAbstract struct so that they can be used by the Go methods.

    24.4.7.5 Call base methods

    Often a virtual method will be overwritten to extend the original behavior of the method in the base class. This is also the case for the FooBarCpp::Foo method of the example code:

    virtual std::string Foo() {
      return "C++ " + FooBarAbstract::Foo();
    }
    

    To use base methods the DirectorClassNameMethodName wrapper functions are automatically generated by SWIG for public and protected virtual methods. The FooBarGo.Foo implementation in the example looks like this:

    func (om *overwrittenMethodsOnFooBarAbstract) Foo() string {
      return "Go " + DirectorFooBarAbstractFoo(om.fb)
    }
    

    The complete example, including the FooBarGoo class implementation, can be found in the end of the guide.

    24.4.7.6 Subclass via embedding

    As previously mentioned in this guide the default and director constructor functions return the same interface type. To properly subclass a C++ class with a Go type the director object instance returned by the NewDirectorClassName constructor function should be embedded into a Go struct so that it represents a distinct but compatible type in Go's type system. This Go struct should be private and the constructor and destructor functions should instead work with a public interface type so that the Go class that subclasses a C++ class can be used as a compatible drop in.

    The subclassing part of the FooBarGo class for an example looks like this:

    type FooBarGo interface {
      FooBarAbstract
      deleteFooBarAbstract()
      IsFooBarGo()
    }
    
    type fooBarGo struct {
      FooBarAbstract
    }
    
    func (fbgs *fooBarGo) deleteFooBarAbstract() {
      DeleteDirectorFooBarAbstract(fbgs.FooBarAbstract)
    }
    
    func (fbgs *fooBarGo) IsFooBarGo() {}
    
    func NewFooBarGo() FooBarGo {
      om := &overwrittenMethodsOnFooBarAbstract{}
      fb := NewDirectorFooBarAbstract(om)
      om.fb = fb
    
      return &fooBarGo{FooBarAbstract: fb}
    }
    
    func DeleteFooBarGo(fbg FooBarGo) {
      fbg.deleteFooBarAbstract()
    }
    

    The complete example, including the FooBarGoo class implementation, can be found in the end of the guide. In this part of the example the private fooBarGo struct embeds FooBarAbstract which lets the fooBarGo Go type "inherit" all the methods of the FooBarAbstract C++ class by means of embedding. The public FooBarGo interface type includes the FooBarAbstract interface and hence FooBarGo can be used as a drop in replacement for FooBarAbstract while the reverse isn't possible and would raise a compile time error. Furthermore the constructor and destructor functions NewFooBarGo and DeleteFooBarGo take care of all the director specifics and to the user the class appears as any other SWIG wrapped C++ class.

    24.4.7.7 Memory management with runtime.SetFinalizer

    In general all guidelines for C++ class memory management apply as well to director classes. One often overlooked limitation with runtime.SetFinalizer is that a finalizer doesn't run in case of a cycle and director classes typically have a cycle. The cycle in the FooBarGo class is here:

    type overwrittenMethodsOnFooBarAbstract struct {
      fb FooBarAbstract
    }
    
    func NewFooBarGo() FooBarGo {
      om := &overwrittenMethodsOnFooBarAbstract{}
      fb := NewDirectorFooBarAbstract(om) // fb.v = om
      om.fb = fb // Backlink causes cycle as fb.v = om!
      ...
    }
    

    In order to be able to use runtime.SetFinalizer nevertheless the finalizer needs to be set on something that isn't in a cycle and that references the director object instance. In the FooBarGo class example the FooBarAbstract director instance can be automatically deleted by setting the finalizer on fooBarGo:

    type fooBarGo struct {
      FooBarAbstract
    }
    
    type overwrittenMethodsOnFooBarAbstract struct {
      fb FooBarAbstract
    }
    
    func NewFooBarGo() FooBarGo {
      om := &overwrittenMethodsOnFooBarAbstract{}
      fb := NewDirectorFooBarAbstract(om)
      om.fb = fb // Backlink causes cycle as fb.v = om!
    
      fbgs := &fooBarGo{FooBarAbstract: fb}
      runtime.SetFinalizer(fbgs, FooBarGo.deleteFooBarAbstract)
      return fbgs
    }
    

    Furthermore if runtime.SetFinalizer is in use either the DeleteClassName destructor function needs to be removed or the fooBarGo struct needs additional data to prevent double deletion. Please read the C++ class memory management subchapter before using runtime.SetFinalizer to know all of its gotchas.

    24.4.7.8 Complete FooBarGo example class

    The complete and annotated FooBarGo class looks like this:

    // FooBarGo is a superset of FooBarAbstract and hence FooBarGo can be used as a
    // drop in replacement for FooBarAbstract but the reverse causes a compile time
    // error.
    type FooBarGo interface {
      FooBarAbstract
      deleteFooBarAbstract()
      IsFooBarGo()
    }
    
    // Via embedding fooBarGo "inherits" all methods of FooBarAbstract.
    type fooBarGo struct {
      FooBarAbstract
    }
    
    func (fbgs *fooBarGo) deleteFooBarAbstract() {
      DeleteDirectorFooBarAbstract(fbgs.FooBarAbstract)
    }
    
    // The IsFooBarGo method ensures that FooBarGo is a superset of FooBarAbstract.
    // This is also how the class hierarchy gets represented by the SWIG generated
    // wrapper code.  For an instance FooBarCpp has the IsFooBarAbstract and
    // IsFooBarCpp methods.
    func (fbgs *fooBarGo) IsFooBarGo() {}
    
    // Go type that defines the DirectorInterface. It contains the Foo and Bar
    // methods that overwrite the respective virtual C++ methods on FooBarAbstract.
    type overwrittenMethodsOnFooBarAbstract struct {
      // Backlink to FooBarAbstract so that the rest of the class can be used by
      // the overridden methods.
      fb FooBarAbstract
    
      // If additional constructor arguments have been given they are typically
      // stored here so that the overridden methods can use them.
    }
    
    func (om *overwrittenMethodsOnFooBarAbstract) Foo() string {
      // DirectorFooBarAbstractFoo calls the base method FooBarAbstract::Foo.
      return "Go " + DirectorFooBarAbstractFoo(om.fb)
    }
    
    func (om *overwrittenMethodsOnFooBarAbstract) Bar() string {
      return "Go Bar"
    }
    
    func NewFooBarGo() FooBarGo {
      // Instantiate FooBarAbstract with selected methods overridden.  The methods
      // that will be overwritten are defined on
      // overwrittenMethodsOnFooBarAbstract and have a compatible signature to the
      // respective virtual C++ methods. Furthermore additional constructor
      // arguments will be typically stored in the
      // overwrittenMethodsOnFooBarAbstract struct.
      om := &overwrittenMethodsOnFooBarAbstract{}
      fb := NewDirectorFooBarAbstract(om)
      om.fb = fb // Backlink causes cycle as fb.v = om!
    
      fbgs := &fooBarGo{FooBarAbstract: fb}
      // The memory of the FooBarAbstract director object instance can be
      // automatically freed once the FooBarGo instance is garbage collected by
      // uncommenting the following line.  Please make sure to understand the
      // runtime.SetFinalizer specific gotchas before doing this.  Furthermore
      // DeleteFooBarGo should be deleted if a finalizer is in use or the fooBarGo
      // struct needs additional data to prevent double deletion.
      // runtime.SetFinalizer(fbgs, FooBarGo.deleteFooBarAbstract)
      return fbgs
    }
    
    // Recommended to be removed if runtime.SetFinalizer is in use.
    func DeleteFooBarGo(fbg FooBarGo) {
      fbg.deleteFooBarAbstract()
    }
    

    Returned string by the FooBarGo.FooBar method is:

    Go Foo, Go Bar
    

    For comparison the FooBarCpp class looks like this:

    class FooBarCpp : public FooBarAbstract
    {
    protected:
      virtual std::string Foo() {
        return "C++ " + FooBarAbstract::Foo();
      }
    
      virtual std::string Bar() {
        return "C++ Bar";
      }
    };
    

    For comparison the returned string by the FooBarCpp::FooBar method is:

    C++ Foo, C++ Bar
    

    The complete source of this example can be found under SWIG/Examples/go/director/.

    24.4.8 Default Go primitive type mappings

    The following table lists the default type mapping from C/C++ to Go. This table will tell you which Go type to expect for a function which uses a given C/C++ type.

    C/C++ typeGo type
    boolbool
    charbyte
    signed charint8
    unsigned charbyte
    shortint16
    unsigned shortuint16
    intint
    unsigned intuint
    longint64
    unsigned longuint64
    long longint64
    unsigned long longuint64
    floatfloat32
    doublefloat64
    char *
    char []
    string

    Note that SWIG wraps the C char type as a character. Pointers and arrays of this type are wrapped as strings. The signed char type can be used if you want to treat char as a signed number rather than a character. Also note that all const references to primitive types are treated as if they are passed by value.

    These type mappings are defined by the "gotype" typemap. You may change that typemap, or add new values, to control how C/C++ types are mapped into Go types.

    24.4.9 Output arguments

    Because of limitations in the way output arguments are processed in swig, a function with output arguments will not have multiple return values. Instead, you must pass a pointer into the C++ function to tell it where to store the output value. In go, you supply a slice in the place of the output argument.

    For example, suppose you were trying to wrap the modf() function in the C math library which splits x into integral and fractional parts (and returns the integer part in one of its parameters):

    double modf(double x, double *ip);
    

    You could wrap it with SWIG as follows:

    %include <typemaps.i>
    double modf(double x, double *OUTPUT);
    

    or you can use the %apply directive:

    %include <typemaps.i>
    %apply double *OUTPUT { double *ip };
    double modf(double x, double *ip);
    

    In Go you would use it like this:

    ptr := []float64{0.0}
    fraction := modulename.Modf(5.0, ptr)
    

    Since this is ugly, you may want to wrap the swig-generated API with some additional functions written in go that hide the ugly details.

    There are no char *OUTPUT typemaps. However you can apply the signed char * typemaps instead:

    %include <typemaps.i>
    %apply signed char *OUTPUT {char *output};
    void f(char *output);
    

    24.4.10 Adding additional go code

    Often the APIs generated by swig are not very natural in go, especially if there are output arguments. You can insert additional go wrapping code to add new APIs with %insert(go_wrapper), like this:

    %include <typemaps.i>
    // Change name of what swig generates to Wrapped_modf.  This function will
    // have the following signature in go:
    //   func Wrapped_modf(float64, []float64) float64
    %rename(wrapped_modf) modf(double x, double *ip);
    
    %apply double *OUTPUT { double *ip };
    double modf(double x, double *ip);
    
    %insert(go_wrapper) %{
    
    // The improved go interface to this function, which has two return values,
    // in the more natural go idiom:
    func Modf(x float64) (fracPart float64, intPart float64) {
      ip := []float64{0.0}
      fracPart = Wrapped_modf(x, ip)
      intPart = ip[0]
      return
    }
    
    %}
    

    For classes, since swig generates an interface, you can add additional methods by defining another interface that includes the swig-generated interface. For example,

    %rename(Wrapped_MyClass) MyClass;
    %rename(Wrapped_GetAValue) MyClass::GetAValue(int *x);
    %apply int *OUTPUT { int *x };
    
    class MyClass {
     public:
      MyClass();
      int AFineMethod(const char *arg); // Swig's wrapping is fine for this one.
      bool GetAValue(int *x);
    };
    
    %insert(go_wrapper) %{
    
    type MyClass interface {
      Wrapped_MyClass
      GetAValue() (int, bool)
    }
    
    func (arg SwigcptrWrapped_MyClass) GetAValue() (int, bool) {
      ip := []int{0}
      ok := arg.Wrapped_GetAValue(ip)
      return ip[0], ok
    }
    
    %}
    

    Of course, if you have to rewrite most of the methods, instead of just a few, then you might as well define your own struct that includes the swig-wrapped object, instead of adding methods to the swig-generated object.

    If you need to import other go packages, you can do this with %go_import. For example,

    %go_import("fmt", _ "unusedPackage", rp "renamed/package")
    
    %insert(go_wrapper) %{
    
    func foo() {
      fmt.Println("Some string:", rp.GetString())
    }
    
    // Importing the same package twice is permitted,
    // Go code will be generated with only the first instance of the import.
    %go_import("fmt")
    
    %insert(go_wrapper) %{
    
    func bar() {
      fmt.Println("Hello world!")
    }
    
    %}
    

    24.4.11 Go typemaps

    You can use the %typemap directive to modify SWIG's default wrapping behavior for specific C/C++ types. You need to be familiar with the material in the general "Typemaps" chapter. That chapter explains how to define a typemap. This section describes some specific typemaps used for Go.

    In general type conversion code may be written either in C/C++ or in Go. The choice to make normally depends on where memory should be allocated. To allocate memory controlled by the Go garbage collector, write Go code. To allocate memory in the C/C++ heap, write C code.

    TypemapDescription
    gotype The Go type to use for a C++ type. This type will appear in the generated Go wrapper function. If this is not defined SWIG will use a default as described above.
    imtype An intermediate Go type used by the "goin", "goout", "godirectorin", and "godirectorout" typemaps. If this typemap is not defined for a C/C++ type, the gotype typemape will be used. This is useful when gotype is best converted to C/C++ using Go code.
    goin Go code to convert from gotype to imtype when calling a C/C++ function. SWIG will then internally convert imtype to a C/C++ type and pass it down. If this is not defined, or is the empty string, no conversion is done.
    in C/C++ code to convert the internally generated C/C++ type, based on imtype, into the C/C++ type that a function call expects. If this is not defined the value will simply be cast to the desired type.
    out C/C++ code to convert the C/C++ type that a function call returns into the internally generated C/C++ type, based on imtype, that will be returned to Go. If this is not defined the value will simply be cast to the desired type.
    goout Go code to convert a value returned from a C/C++ function from imtype to gotype. If this is not defined, or is the empty string, no conversion is done.
    argout C/C++ code to adjust an argument value when returning from a function. This is called after the real C/C++ function has run. This uses the internally generated C/C++ type, based on imtype. This is only useful for a pointer type of some sort. If this is not defined nothing will be done.
    goargout Go code to adjust an argument value when returning from a function. This is called after the real C/C++ function has run. The value will be in imtype. This is only useful for a pointer type of some sort. If this is not defined, or is the empty string, nothing will be done.
    directorin C/C++ code to convert the C/C++ type used to call a director method into the internally generated C/C++ type, based on imtype, that will be passed to Go. If this is not defined the value will simply be cast to the desired type.
    godirectorin Go code to convert a value used to call a director method from imtype to gotype. If this is not defined, or is the empty string, no conversion is done.
    godirectorout Go code to convert a value returned from a director method from gotype to imtype. If this is not defined, or is the empty string, no conversion is done.
    directorout C/C++ code to convert a value returned from a director method from the internally generated C/C++ type, based on imtype, into the type that the method should return If this is not defined the value will simply be cast to the desired type.

    25 SWIG and Guile

    This section details guile-specific support in SWIG.

    25.1 Supported Guile Versions

    SWIG works with Guile versions 1.8.x and 2.0.x. Support for version 1.6.x has been dropped. The last version of SWIG that still works with Guile version 1.6.x is SWIG 2.0.9.

    Note that starting with guile 2.0, the guile sources can be compiled for improved performance. This is currently not tested with swig so your mileage may vary. To be safe set environment variable GUILE_AUTO_COMPILE to 0 when using swig generated guile code.

    25.2 Meaning of "Module"

    There are three different concepts of "module" involved, defined separately for SWIG, Guile, and Libtool. To avoid horrible confusion, we explicitly prefix the context, e.g., "guile-module".

    25.3 Old GH Guile API

    Guile 1.8 and older could be interfaced using two different api's, the SCM or the GH API. The GH interface to guile is deprecated. Read more about why in the Guile manual.

    Support for the guile GH wrapper code generation has been dropped from SWIG. The last version of SWIG that can still generate guile GH wrapper code is 2.0.9. Please use that version if you really need the GH wrapper code.

    25.4 Linkage

    Guile support is complicated by a lack of user community cohesiveness, which manifests in multiple shared-library usage conventions. A set of policies implementing a usage convention is called a linkage.

    25.4.1 Simple Linkage

    The default linkage is the simplest; nothing special is done. In this case the function SWIG_init() is exported. Simple linkage can be used in several ways:

    • Embedded Guile, no modules. You want to embed a Guile interpreter into your program; all bindings made by SWIG shall show up in the root module. Then call SWIG_init() in the inner_main() function. See the "simple" and "matrix" examples under Examples/guile.
    • Dynamic module mix-in. You want to create a Guile module using define-module, containing both Scheme code and bindings made by SWIG; you want to load the SWIG modules as shared libraries into Guile.

      (define-module (my module))
      (define my-so (dynamic-link "./libexample.so"))
      (dynamic-call "SWIG_init" my-so) ; make SWIG bindings
      ;; Scheme definitions can go here
      

      Newer Guile versions provide a shorthand for dynamic-link and dynamic-call:

      (load-extension "./libexample.so" "SWIG_init")
      

      A more portable approach would be to drop the shared library extension:

      (load-extension "./libexample" "SWIG_init")
      

      You need to explicitly export those bindings made by SWIG that you want to import into other modules:

      (export foo bar)
      

      In this example, the procedures foo and bar would be exported. Alternatively, you can export all bindings with the following module-system hack:

      (module-map (lambda (sym var)
                    (module-export! (current-module) (list sym)))
                  (current-module))
      

      SWIG can also generate this Scheme stub (from define-module up to export) semi-automagically if you pass it the command-line argument -scmstub. The code will be exported in a file called module.scm in the directory specified by -outdir or the current directory if -outdir is not specified. Since SWIG doesn't know how to load your extension module (with dynamic-link or load-extension), you need to supply this information by including a directive like this in the interface file:

      %scheme %{ (load-extension "./libexample.so" "SWIG_init") %}
      

      (The %scheme directive allows to insert arbitrary Scheme code into the generated file module.scm; it is placed between the define-module form and the export form.)

    If you want to include several SWIG modules, you would need to rename SWIG_init via a preprocessor define to avoid symbol clashes. For this case, however, passive linkage is available.

    25.4.2 Passive Linkage

    Passive linkage is just like simple linkage, but it generates an initialization function whose name is derived from the module and package name (see below).

    You should use passive linkage rather than simple linkage when you are using multiple modules.

    25.4.3 Native Guile Module Linkage

    SWIG can also generate wrapper code that does all the Guile module declarations on its own if you pass it the -Linkage module command-line option.

    The module name is set with the -package and -module command-line options. Suppose you want to define a module with name (my lib foo); then you would have to pass the options -package my/lib -module foo . Note that the last part of the name can also be set via the SWIG directive %module.

    You can use this linkage in several ways:

    • Embedded Guile with SWIG modules. You want to embed a Guile interpreter into your program; the SWIG bindings shall be put into different modules. Simply call the function scm_init_my _modules_foo_module in the inner_main() function.
    • Dynamic Guile modules. You want to load the SWIG modules as shared libraries into Guile; all bindings are automatically put in newly created Guile modules.
      (define my-so (dynamic-link "./libfoo"))
      ;; create new module and put bindings there:
      (dynamic-call "scm_init_my_modules_foo_module" my-so) 
      
      Newer Guile versions have a shorthand procedure for this:
      (load-extension "./libfoo.so" "scm_init_my_modules_foo_module")
      

    25.4.4 Old Auto-Loading Guile Module Linkage

    Guile used to support an autoloading facility for object-code modules. This support has been marked deprecated in version 1.4.1 and is going to disappear sooner or later. SWIG still supports building auto-loading modules if you pass it the -Linkage ltdlmod command-line option.

    Auto-loading worked like this: Suppose a module with name (my lib foo) is required and not loaded yet. Guile will then search all directories in its search path for a Scheme file my/modules/foo.scm or a shared library my/ modules/libfoo.so (or my/ modules/libfoo.la; see the GNU libtool documentation). If a shared library is found that contains the symbol scm_init_my_modules_foo_module, the library is loaded, and the function at that symbol is called with no arguments in order to initialize the module.

    When invoked with the -Linkage ltdlmod command-line option, SWIG generates an exported module initialization function with an appropriate name.

    25.4.5 Hobbit4D Linkage

    The only other linkage supported at this time creates shared object libraries suitable for use by hobbit's (hobbit4d link) guile module. This is called the "hobbit" linkage, and requires also using the "-package" command line option to set the part of the module name before the last symbol. For example, both command lines:

    swig -guile -package my/lib foo.i
    swig -guile -package my/lib -module foo foo.i
    

    would create module (my lib foo) (assuming in the first case foo.i declares the module to be "foo"). The installed files are my/lib/libfoo.so.X.Y.Z and friends. This scheme is still very experimental; the (hobbit4d link) conventions are not well understood.

    25.5 Underscore Folding

    Underscores are converted to dashes in identifiers. Guile support may grow an option to inhibit this folding in the future, but no one has complained so far.

    You can use the SWIG directives %name and %rename to specify the Guile name of the wrapped functions and variables (see CHANGES).

    25.6 Typemaps

    The Guile module handles all types via typemaps. This information is read from Lib/guile/typemaps.i. Some non-standard typemap substitutions are supported:

    • $descriptor expands to a type descriptor for use with the SWIG_NewPointerObj() and SWIG_ConvertPtr functions.
    • For pointer types, $*descriptor expands to a descriptor for the direct base type (i.e., one pointer is stripped), whereas $basedescriptor expands to a descriptor for the base type (i.e., all pointers are stripped).

    A function returning void (more precisely, a function whose out typemap returns SCM_UNSPECIFIED) is treated as returning no values. In argout typemaps, one can use the macro GUILE_APPEND_RESULT in order to append a value to the list of function return values.

    Multiple values can be passed up to Scheme in one of three ways:

    • Multiple values as lists. By default, if more than one value is to be returned, a list of the values is created and returned; to switch back to this behavior, use

      %values_as_list;
    • Multiple values as vectors. By issuing

      %values_as_vector;

      vectors instead of lists will be used.

    • Multiple values for multiple-value continuations. This is the most elegant way. By issuing

      %multiple_values;

      multiple values are passed to the multiple-value continuation, as created by call-with-values or the convenience macro receive. The latter is available if you issue (use-modules (srfi srfi-8)). Assuming that your divide function wants to return two values, a quotient and a remainder, you can write:

      (receive (quotient remainder)
          (divide 35 17)
        body...)
      

      In body, the first result of divide will be bound to the variable quotient, and the second result to remainder.

    See also the "multivalue" example.

    Constants are exported as a function that returns the value. The %feature("constasvar") can be applied to any constant, immutable variable, or enum. Instead of exporting the constant as a function that must be called, the constant will appear as a scheme variable. See Features and the %feature directive for info on how to apply the %feature.

    25.7 Representation of pointers as smobs

    For pointer types, SWIG uses Guile smobs. SWIG smobs print like this: #<swig struct xyzzy * 0x1234affe> Two of them are equal? if and only if they have the same type and value.

    To construct a Scheme object from a C pointer, the wrapper code calls the function SWIG_NewPointerObj(), passing a pointer to a struct representing the pointer type. The type index to store in the upper half of the CAR is read from this struct. To get the pointer represented by a smob, the wrapper code calls the function SWIG_ConvertPtr(), passing a pointer to a struct representing the expected pointer type. See also The run-time type checker. If the Scheme object passed was not a SWIG smob representing a compatible pointer, a wrong-type-arg exception is raised.

    25.7.1 Smobs

    In earlier versions of SWIG, C pointers were represented as Scheme strings containing a hexadecimal rendering of the pointer value and a mangled type name. As Guile allows registering user types, so-called "smobs" (small objects), a much cleaner representation has been implemented now. The details will be discussed in the following.

    The whole type system, when it is first initialized, creates two smobs named "swig" and "collected_swig". The swig smob is used for non-garbage collected smobs, while the collected_swig smob is used as described below. Each smob has the same format, which is a double cell created by SCM_NEWSMOB2() The first word of data is the pointer to the object and the second word of data is the swig_type_info * structure describing this type. If a generated GOOPS module has been loaded, smobs will be wrapped by the corresponding GOOPS class.

    25.7.2 Garbage Collection

    Garbage collection is a feature of Guile since version 1.6. As SWIG now requires Guile > 1.8, it is automatically included. Garbage collection works like this. Every swig_type_info structure stores in its clientdata field a pointer to the destructor for this type. The destructor is the generated wrapper around the delete function. So swig still exports a wrapper for the destructor, it just does not call scm_c_define_gsubr() for the wrapped delete function. So the only way to delete an object is from the garbage collector, since the delete function is not available to scripts. How swig determines if a type should be garbage collected is exactly like described in Object ownership and %newobject in the SWIG manual. All typemaps use an $owner var, and the guile module replaces $owner with 0 or 1 depending on feature:new.

    25.8 Native Guile pointers

    In addition to SWIG smob pointers, Guile's native pointer type are accepted as arguments to wrapped SWIG functions. This can be useful for passing pointers to bytevector data to wrapped functions.

    25.9 Exception Handling

    SWIG code calls scm_error on exception, using the following mapping:

          MAP(SWIG_MemoryError,     "swig-memory-error");
          MAP(SWIG_IOError,         "swig-io-error");
          MAP(SWIG_RuntimeError,    "swig-runtime-error");
          MAP(SWIG_IndexError,      "swig-index-error");
          MAP(SWIG_TypeError,       "swig-type-error");
          MAP(SWIG_DivisionByZero,  "swig-division-by-zero");
          MAP(SWIG_OverflowError,   "swig-overflow-error");
          MAP(SWIG_SyntaxError,     "swig-syntax-error");
          MAP(SWIG_ValueError,      "swig-value-error");
          MAP(SWIG_SystemError,     "swig-system-error");
    

    The default when not specified here is to use "swig-error". See Lib/exception.i for details.

    25.10 Procedure documentation

    If invoked with the command-line option -procdoc file , SWIG creates documentation strings for the generated wrapper functions, describing the procedure signature and return value, and writes them to file.

    SWIG can generate documentation strings in three formats, which are selected via the command-line option -procdocformat format :

    • guile-1.4 (default): Generates a format suitable for Guile 1.4.
    • plain: Generates a format suitable for Guile 1.4.1 and later.
    • texinfo: Generates texinfo source, which must be run through texinfo in order to get a format suitable for Guile 1.4.1 and later.

    You need to register the generated documentation file with Guile like this:

    (use-modules (ice-9 documentation))
    (set! documentation-files 
          (cons "file" documentation-files))
    

    Documentation strings can be configured using the Guile-specific typemap argument doc. See Lib/guile/typemaps.i for details.

    25.11 Procedures with setters

    For global variables, SWIG creates a single wrapper procedure ( variable :optional value), which is used for both getting and setting the value. For struct members, SWIG creates two wrapper procedures (struct-member-get pointer) and (struct-member-set pointer value).

    If invoked with the command-line option -emit-setters ( recommended), SWIG will additionally create procedures with setters. For global variables, the procedure-with-setter variable is created, so you can use (variable ) to get the value and (set! (variable) value) to set it. For struct members, the procedure-with-setter struct-member is created, so you can use (struct-member pointer) to get the value and (set! (struct -member pointer) value) to set it.

    If invoked with the command-line option -only-setters, SWIG will only create procedures with setters, i.e., for struct members, the procedures (struct-member -get pointer) and (struct-member-set pointer value) are not generated.

    25.12 GOOPS Proxy Classes

    SWIG can also generate classes and generic functions for use with Guile's Object-Oriented Programming System (GOOPS). GOOPS is a sophisticated object system in the spirit of the Common Lisp Object System (CLOS).

    To enable GOOPS support, pass the -proxy argument to swig. This will export the GOOPS wrapper definitions into the module.scm file in the directory specified by -outdir or the current directory. GOOPS support requires either passive or module linkage.

    The generated file will contain definitions of GOOPS classes mimicking the C++ class hierarchy.

    Enabling GOOPS support implies -emit-setters.

    If -emit-slot-accessors is also passed as an argument, then the generated file will contain accessor methods for all the slots in the classes and for global variables. The input class

      class Foo {
        public:
          Foo(int i) : a(i) {}
          int a;
          int getMultBy(int i) { return a * i; }
          Foo getFooMultBy(int i) { return Foo(a * i); }
      }; 
      Foo getFooPlus(int i) { return Foo(a + i); }
    

    will produce (if -emit-slot-accessors is not passed as a parameter)

    (define-class <Foo> (<swig>)
      (a #:allocation #:swig-virtual 
         #:slot-ref primitive:Foo-a-get 
         #:slot-set! primitive:Foo-a-set)
      #:metaclass <swig-metaclass>
      #:new-function primitive:new-Foo
    )
    (define-method (getMultBy (swig_smob <Foo>) i)
      (primitive:Foo-getMultBy  (slot-ref swig_smob 'smob) i))
    (define-method (getFooMultBy (swig_smob <Foo>) i)
      (make <Foo> #:init-smob (primitive:Foo-getFooMultBy  (slot-ref swig_smob 'smob) i)))
    
    (define-method (getFooPlus i)
      (make <Foo> #:init-smob (primitive:getFooPlus i)))
    
    (export <Foo> getMultBy getFooMultBy getFooPlus )
    

    and will produce (if -emit-slot-accessors is passed as a parameter)

    (define-class <Foo> (<swig>)
      (a #:allocation #:swig-virtual 
         #:slot-ref primitive:Foo-a-get 
         #:slot-set! primitive:Foo-a-set 
         #:accessor a)
      #:metaclass <swig-metaclass>
      #:new-function primitive:new-Foo
    )
    (define-method (getMultBy (swig_smob <Foo>) i)
      (primitive:Foo-getMultBy  (slot-ref swig_smob 'smob) i))
    (define-method (getFooMultBy (swig_smob <Foo>) i)
      (make <Foo> #:init-smob (primitive:Foo-getFooMultBy  (slot-ref swig_smob 'smob) i)))
    
    (define-method (getFooPlus i)
      (make <Foo> #:init-smob (primitive:getFooPlus i)))
    
    (export <Foo> a getMultBy getFooMultBy getFooPlus )
    

    which can then be used by this code

    ;; not using getters and setters
    (define foo (make <Foo> #:args '(45)))
    (slot-ref foo 'a)
    (slot-set! foo 'a 3)
    (getMultBy foo 4)
    (define foo2 (getFooMultBy foo 7))
    (slot-ref foo 'a)
    (slot-ref (getFooPlus foo 4) 'a)
    
    ;; using getters and setters
    (define foo (make <Foo> #:args '(45)))
    (a foo)
    (set! (a foo) 5)
    (getMultBy foo 4)
    (a (getFooMultBy foo 7))
    

    Notice that constructor arguments are passed as a list after the #:args keyword. Hopefully in the future the following will be valid (make <Foo> #:a 5 #:b 4)

    Also note that the order the declarations occur in the .i file make a difference. For example,

    %module test
    
    %{ #include "foo.h" %}
    
    %inline %{
      int someFunc(Foo &a) {
        ...
      }
    %}
    
    %include "foo.h"
    

    This is a valid SWIG file it will work as you think it will for primitive support, but the generated GOOPS file will be broken. Since the someFunc definition is parsed by SWIG before all the declarations in foo.h, the generated GOOPS file will contain the definition of someFunc() before the definition of <Foo>. The generated GOOPS file would look like

    ;;...
    
    (define-method (someFunc (swig_smob <Foo>))
      (primitive:someFunc (slot-ref swig_smob 'smob)))
    
    ;;...
    
    (define-class <Foo> (<swig>)
      ;;...
    )
    
    ;;...
    

    Notice that <Foo> is used before it is defined. The fix is to just put the %import "foo.h" before the %inline block.

    25.12.1 Naming Issues

    As you can see in the example above, there are potential naming conflicts. The default exported accessor for the Foo::a variable is named a. The name of the wrapper global function is getFooPlus. If the -useclassprefix option is passed to swig, the name of all accessors and member functions will be prepended with the class name. So the accessor will be called Foo-a and the member functions will be called Foo-getMultBy. Also, if the -goopsprefix goops: argument is passed to swig, every identifier will be prefixed by goops:

    Two guile-modules are created by SWIG. The first module contains the primitive definitions of all the wrapped functions and variables, and is located either in the _wrap.cxx file (with -Linkage module ) or in the scmstub file (if -Linkage passive -scmstub). The name of this guile-module is the swig-module name (given on the command line with the -module argument or with the %module directive) concatenated with the string "-primitive". For example, if %module Test is set in the swig interface file, the name of the guile-module in the scmstub or -Linkage module will be Test-primitive. Also, the scmstub file will be named Test-primitive.scm. The string "primitive" can be changed by the -primsuffix swig argument. So the same interface, with the -primsuffix base will produce a module called Test-base . The second generated guile-module contains all the GOOPS class definitions and is located in a file named module.scm in the directory specified with -outdir or the current directory. The name of this guile-module is the name of the swig-module (given on the command line or with the %module directive). In the previous example, the GOOPS definitions will be in a file named Test.scm.

    Because of the naming conflicts, you can't in general use both the -primitive and the GOOPS guile-modules at the same time. To do this, you need to rename the exported symbols from one or both guile-modules. For example,

    (use-modules ((Test-primitive) #:renamer (symbol-prefix-proc 'primitive:)))
    (use-modules ((Test) #:renamer (symbol-prefix-proc 'goops:)))
    

    25.12.2 Linking

    The guile-modules generated above all need to be linked together. GOOPS support requires either passive or module linkage. The exported GOOPS guile-module will be the name of the swig-module and should be located in a file called Module.scm. This should be installed on the autoload path for guile, so that (use-modules (Package Module)) will load everything needed. Thus, the top of the GOOPS guile-module will contain code to load everything needed by the interface (the shared library, the scmstub module, etc.). The %goops directive inserts arbitrary code into the generated GOOPS guile-module, and should be used to load the dependent libraries.

    This breaks up into three cases

    • Passive Linkage without -scmstub: Note that this linkage style has the potential for naming conflicts, since the primitive exported function and variable names are not wrapped in a guile-module and might conflict with names from the GOOPS guile-module (see above). Pass the -goopsprefix argument to solve this problem. If the -exportprimitive option is passed to SWIG the (export ...) code that would be exported into the scmstub file is exported at the bottom of the generated GOOPS guile-module. The %goops directive should contain code to load the shared library.
      %goops %{ (load-extension "./libfoo.so" "scm_init_my_modules_foo_module") %}
      

      Produces the following code at the top of the generated GOOPS guile-module (with the -package my/modules -module foo command line arguments)

      (define-module (my modules foo))
      
      ;; %goops directive goes here
      (load-extension "./libfoo.so" "scm_init_my_modules_foo_module") 
      
      (use-modules (oop goops) (Swig common))
      
    • Passive Linkage with -scmstub: Here, the name of the scmstub file should be Module-primitive.scm (with primitive replaced with whatever is given with the -primsuffix argument. The code to load the shared library should be located in the %scheme directive, which will then be added to the scmstub file. SWIG will automatically generate the line (use-modules ( Package Module-primitive)) into the GOOPS guile-module. So if Module-primitive.scm is on the autoload path for guile, the %goops directive can be empty. Otherwise, the %goops directive should contain whatever code is needed to load the Module-primitive.scm file into guile.

      %scheme %{ (load-extension "./libfoo.so" "scm_init_my_modules_foo_module") %}
      // only include the following definition if (my modules foo) cannot
      // be loaded automatically
      %goops %{ 
        (primitive-load "/path/to/foo-primitive.scm") 
        (primitive-load "/path/to/Swig/common.scm")
      %}
      

      Produces the following code at the top of the generated GOOPS guile-module

      (define-module (my modules foo))
      
      ;; %goops directive goes here (if any)
      (primitive-load "/path/to/foo-primitive.scm")
      (primitive-load "/path/to/Swig/common.scm")
      
      (use-modules (oop goops) (Swig common))
      (use-modules ((my modules foo-primitive) :renamer (symbol-prefix-proc
                                                             'primitive:)))
      
      
    • Module Linkage: This is very similar to passive linkage with a scmstub file. SWIG will also automatically generate the line (use-modules (Package Module-primitive)) into the GOOPS guile-module. Again the %goops directive should contain whatever code is needed to get that module loaded into guile.

      %goops %{ (load-extension "./libfoo.so" "scm_init_my_modules_foo_module") %}
      

      Produces the following code at the top of the generated GOOPS guile-module

      (define-module (my modules foo))
      
      ;; %goops directive goes here (if any)
      (load-extension "./libfoo.so" "scm_init_my_modules_foo_module") 
      
      (use-modules (oop goops) (Swig common))
      (use-modules ((my modules foo-primitive) :renamer (symbol-prefix-proc
                                                               'primitive:)))
      
      

    (Swig common): The generated GOOPS guile-module also imports definitions from the (Swig common) guile-module. This module is included with SWIG and should be installed by SWIG into the autoload path for guile (based on the configure script and whatever arguments are passed). If it is not, then the %goops directive also needs to contain code to load the common.scm file into guile. Also note that if you are trying to install the generated wrappers on a computer without SWIG installed, you will need to include the common.swg file along with the install.

    Multiple Modules: Type dependencies between modules is supported. For example, if mod1 includes definitions of some classes, and mod2 includes some classes derived from classes in mod1, the generated GOOPS file for mod2 will declare the correct superclasses. The only problem is that since mod2 uses symbols from mod1, the mod2 GOOPS file must include a (use-modules (mod2)). Currently, SWIG does not automatically export this line; it must be included in the %goops directive of mod2. Maybe in the future SWIG can detect dependencies and export this line. (how do other language modules handle this problem?)


    26 SWIG and Java

    This chapter describes SWIG's support of Java. It covers most SWIG features, but certain low-level details are covered in less depth than in earlier chapters.

    26.1 Overview

    The 100% Pure Java effort is a commendable concept, however in the real world programmers often either need to re-use their existing code or in some situations want to take advantage of Java but are forced into using some native (C/C++) code. The Java extension to SWIG makes it very easy to plumb in existing C/C++ code for access from Java, as SWIG writes the Java Native Interface (JNI) code for you. It is different to using the 'javah' tool as SWIG will wrap existing C/C++ code, whereas javah takes 'native' Java function declarations and creates C/C++ function prototypes. SWIG wraps C/C++ code using Java proxy classes and is very useful if you want to have access to large amounts of C/C++ code from Java. If only one or two JNI functions are needed then using SWIG may be overkill. SWIG enables a Java program to easily call into C/C++ code from Java. Historically, SWIG was not able to generate any code to call into Java code from C++. However, SWIG now supports full cross language polymorphism and code is generated to call up from C++ to Java when wrapping C++ virtual methods via the director feature.

    Java is one of the few non-scripting language modules in SWIG. As SWIG utilizes the type safety that the Java language offers, it takes a somewhat different approach to that used for scripting languages. In particular runtime type checking and the runtime library are not used by Java. This should be borne in mind when reading the rest of the SWIG documentation. This chapter on Java is relatively self contained and will provide you with nearly everything you need for using SWIG and Java. However, the "SWIG Basics" chapter will be a useful read in conjunction with this one.

    This chapter starts with a few practicalities on running SWIG and compiling the generated code. If you are looking for the minimum amount to read, have a look at the sections up to and including the tour of basic C/C++ wrapping section which explains how to call the various C/C++ code constructs from Java. Following this section are details of the C/C++ code and Java classes that SWIG generates. Due to the complexities of C and C++ there are different ways in which C/C++ code could be wrapped and called from Java. SWIG is a powerful tool and the rest of the chapter details how the default code wrapping can be tailored. Various customisation tips and techniques using SWIG directives are covered. The latter sections cover the advanced techniques of using typemaps for complete control of the wrapping process.

    26.2 Preliminaries

    SWIG 1.1 works with JDKs from JDK 1.1 to JDK1.4 (Java 2 SDK1.4) and should also work with any later versions. Given the choice, you should probably use the latest version of Sun's JDK. The SWIG Java module is known to work using Sun's JVM on Solaris, Linux and the various flavours of Microsoft Windows including Cygwin. The Kaffe JVM is known to give a few problems and at the time of writing was not a fully fledged JVM with full JNI support. The generated code is also known to work on vxWorks using WindRiver's PJava 3.1. The best way to determine whether your combination of operating system and JDK will work is to test the examples and test-suite that comes with SWIG. Run make -k check from the SWIG root directory after installing SWIG on Unix systems.

    The Java module requires your system to support shared libraries and dynamic loading. This is the commonly used method to load JNI code so your system will more than likely support this.

    Android uses Java JNI and also works with SWIG. Please read the Android chapter in conjunction with this one if you are targeting Android.

    26.2.1 Running SWIG

    Suppose that you defined a SWIG module such as the following:

    /* File: example.i */
    %module test
    %{
    #include "stuff.h"
    %}
    int fact(int n);
    

    To build a Java module, run SWIG using the -java option :

    %swig -java example.i
    

    If building C++, add the -c++ option:

    $ swig -c++ -java example.i
    

    This creates two different files; a C/C++ source file example_wrap.c or example_wrap.cxx and numerous Java files. The generated C/C++ source file contains the JNI wrapper code that needs to be compiled and linked with the rest of your C/C++ application.

    The name of the wrapper file is derived from the name of the input file. For example, if the input file is example.i, the name of the wrapper file is example_wrap.c. To change this, you can use the -o option. It is also possible to change the output directory that the Java files are generated into using -outdir.

    The module name, specified with %module, determines the name of various generated classes as discussed later. Note that the module name does not define a Java package and by default, the generated Java classes do not have a Java package. The -package option described below can specify a Java package name to use.

    The following sections have further practical examples and details on how you might go about compiling and using the generated files.

    26.2.2 Additional Commandline Options

    The following table lists the additional commandline options available for the Java module. They can also be seen by using:

    swig -java -help 
    
    Java specific options
    -nopgcppsuppress the premature garbage collection prevention parameter
    -noproxygenerate the low-level functional interface instead of proxy classes
    -package <name>set name of the Java package to <name>

    Their use will become clearer by the time you have finished reading this section on SWIG and Java.

    26.2.3 Getting the right header files

    In order to compile the C/C++ wrappers, the compiler needs the jni.h and jni_md.h header files which are part of the JDK. They are usually in directories like this:

    /usr/java/include
    /usr/java/include/<operating_system>
    

    The exact location may vary on your machine, but the above locations are typical.

    26.2.4 Compiling a dynamic module

    The JNI code exists in a dynamic module or shared library (DLL on Windows) and gets loaded by the JVM. Assuming you have code you need to link to in a file called example.c, in order to build a shared library file, you need to compile your module in a manner similar to the following (shown for Solaris):

    $ swig -java example.i
    $ gcc -fPIC -c example_wrap.c -I/usr/java/include -I/usr/java/include/solaris
    $ gcc -fPIC -c example.c
    $ ld -G example_wrap.o example.o -o libexample.so
    

    The exact commands for doing this vary from platform to platform. However, SWIG tries to guess the right options when it is installed. Therefore, you may want to start with one of the examples in the Examples/java directory. If that doesn't work, you will need to read the man-pages for your compiler and linker to get the right set of options. You might also check the SWIG Wiki for additional information.

    Important
    If you are going to use optimisations turned on with gcc (for example -O2), ensure you also compile with -fno-strict-aliasing. The GCC optimisations have become more aggressive from gcc-4.0 onwards and will result in code that fails with strict aliasing optimisations turned on. See the C/C++ to Java typemaps section for more details.

    The name of the shared library output file is important. If the name of your SWIG module is "example", the name of the corresponding shared library file should be "libexample.so" (or equivalent depending on your machine, see Dynamic linking problems for more information). The name of the module is specified using the %module directive or -module command line option.

    26.2.5 Using your module

    To load your shared native library module in Java, simply use Java's System.loadLibrary method in a Java class:

    // runme.java
    
    public class runme {
      static {
        System.loadLibrary("example");
      }
    
      public static void main(String argv[]) {
        System.out.println(example.fact(4));
      }
    }
    

    Compile all the Java files and run:

    $ javac *.java
    $ java runme
    24
    $
    

    If it doesn't work have a look at the following section which discusses problems loading the shared library.

    26.2.6 Dynamic linking problems

    As shown in the previous section the code to load a native library (shared library) is System.loadLibrary("name"). This can fail with an UnsatisfiedLinkError exception and can be due to a number of reasons.

    You may get an exception similar to this:

    $ java runme
    Exception in thread "main" java.lang.UnsatisfiedLinkError: no example in java.library.path
            at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1312)
            at java.lang.Runtime.loadLibrary0(Runtime.java:749)
            at java.lang.System.loadLibrary(System.java:820)
            at runme.<clinit>(runme.java:5)
    

    The most common cause for this is an incorrect naming of the native library for the name passed to the loadLibrary function. The string passed to the loadLibrary function must not include the file extension name in the string, that is .dll or .so. The string must be name and not libname for all platforms. On Windows the native library must then be called name.dll and on most Unix systems it must be called libname.so .

    Another common reason for the native library not loading is because it is not in your path. On Windows make sure the path environment variable contains the path to the native library. On Unix make sure that your LD_LIBRARY_PATH contains the path to the native library. Adding paths to LD_LIBRARY_PATH can slow down other programs on your system so you may want to consider alternative approaches. For example you could recompile your native library with extra path information using -rpath if you're using GNU, see the GNU linker documentation (ld man page). You could use a command such as ldconfig (Linux) or crle (Solaris) to add additional search paths to the default system configuration (this requires root access and you will need to read the man pages).

    The native library will also not load if there are any unresolved symbols in the compiled C/C++ code. The following exception is indicative of this:

    $ java runme
    Exception in thread "main" java.lang.UnsatisfiedLinkError: libexample.so: undefined
    symbol: fact
            at java.lang.ClassLoader$NativeLibrary.load(Native Method)
            at java.lang.ClassLoader.loadLibrary0(ClassLoader.java, Compiled Code)
            at java.lang.ClassLoader.loadLibrary(ClassLoader.java, Compiled Code)
            at java.lang.Runtime.loadLibrary0(Runtime.java, Compiled Code)
            at java.lang.System.loadLibrary(System.java, Compiled Code)
            at runme.<clinit>(runme.java:5)
    $
    

    This error usually indicates that you forgot to include some object files or libraries in the linking of the native library file. Make sure you compile both the SWIG wrapper file and the code you are wrapping into the native library file. If you forget to compile and link in the SWIG wrapper file into your native library file, you will get a message similar to the following:

    $ java runme
    Exception in thread "main" java.lang.UnsatisfiedLinkError: exampleJNI.gcd(II)I
            at exampleJNI.gcd(Native Method)
            at example.gcd(example.java:12)
            at runme.main(runme.java:18)
    

    where gcd is the missing JNI function that SWIG generated into the wrapper file. Also make sure you pass all of the required libraries to the linker. The java -verbose:jni commandline option is also a great way to get more information on unresolved symbols. One last piece of advice is to beware of the common faux pas of having more than one native library version in your path.

    In summary, ensure that you are using the correct C/C++ compiler and linker combination and options for successful native library loading. If you are using the examples that ship with SWIG, then the Examples/Makefile must have these set up correctly for your system. The SWIG installation package makes a best attempt at getting these correct but does not get it right 100% of the time. The SWIG Wiki also has some settings for commonly used compiler and operating system combinations. The following section also contains some C++ specific linking problems and solutions.

    26.2.7 Compilation problems and compiling with C++

    On most machines, shared library files should be linked using the C++ compiler. For example:

    % swig -c++ -java example.i
    % g++ -c -fpic example.cxx
    % g++ -c -fpic example_wrap.cxx -I/usr/java/j2sdk1.4.1/include -I/usr/java/j2sdk1.4.1/include/linux
    % g++ -shared example.o example_wrap.o -o libexample.so
    

    In addition to this, you may need to include additional library files to make it work. For example, if you are using the Sun C++ compiler on Solaris, you often need to add an extra library -lCrun like this:

    % swig -c++ -java example.i
    % CC -c example.cxx
    % CC -c example_wrap.cxx -I/usr/java/include -I/usr/java/include/solaris
    % CC -G example.o example_wrap.o -L/opt/SUNWspro/lib -o libexample.so -lCrun
    

    If you aren't entirely sure about the linking for C++, you might look at an existing C++ program. On many Unix machines, the ldd command will list library dependencies. This should give you some clues about what you might have to include when you link your shared library. For example:

    $ ldd swig
            libstdc++-libc6.1-1.so.2 => /usr/lib/libstdc++-libc6.1-1.so.2 (0x40019000)
            libm.so.6 => /lib/libm.so.6 (0x4005b000)
            libc.so.6 => /lib/libc.so.6 (0x40077000)
            /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
    $
    

    Finally make sure the version of JDK header files matches the version of Java that you are running as incompatibilities could lead to compilation problems or unpredictable behaviour.

    26.2.8 Building on Windows

    Building on Windows is roughly similar to the process used with Unix. You will want to produce a DLL that can be loaded by the Java Virtual Machine. This section covers the process of using SWIG with Microsoft Visual C++ 6 although the procedure may be similar with other compilers. In order for everything to work, you will need to have a JDK installed on your machine in order to read the JNI header files.

    26.2.8.1 Running SWIG from Visual Studio

    If you are developing your application within Microsoft Visual studio, SWIG can be invoked as a custom build option. The Examples\java directory has a few Windows Examples containing Visual Studio project (.dsp) files. The process to re-create the project files for a C project are roughly:

    • Open up a new workspace and use the AppWizard to select a DLL project.
    • Add both the SWIG interface file (the .i file), any supporting C files, and the name of the wrapper file that will be created by SWIG (ie. example_wrap.c). Don't worry if the wrapper file doesn't exist yet--Visual Studio will keep a reference to it.
    • Select the SWIG interface file and go to the settings menu. Under settings, select the "Custom Build" option.
    • Enter "SWIG" in the description field.
    • Enter "swig -java -o $(ProjDir)\$(InputName)_wrap.c $(InputPath) " in the "Build command(s) field"
    • Enter "$(ProjDir)\$(InputName)_wrap.c" in the "Output files(s) field".
    • Next, select the settings for the entire project and go to C/C++ tab and select the Preprocessor category. Add the include directories to the JNI header files under "Additional include directories", eg "C:\jdk1.3\include, C:\jdk1.3\include\win32".
    • Next, select the settings for the entire project and go to Link tab and select the General category. Set the name of the output file to match the name of your Java module (ie. example.dll).
    • Next, select the example.c and example_wrap.c files and go to the C/C++ tab and select the Precompiled Headers tab in the project settings. Disabling precompiled headers for these files will overcome any precompiled header errors while building.
    • Finally, add the java compilation as a post build rule in the Post-build step tab in project settings, eg, "c:\jdk1.3\bin\javac *.java"
    • Build your project.

    Note: If using C++, choose a C++ suffix for the wrapper file, for example example_wrap.cxx. Use _wrap.cxx instead of _wrap.c in the instructions above and add -c++ when invoking swig.

    Now, assuming all went well, SWIG will be automatically invoked when you build your project. When doing a build, any changes made to the interface file will result in SWIG being automatically invoked to produce a new version of the wrapper file.

    The Java classes that SWIG output should also be compiled into .class files. To run the native code in the DLL (example.dll), make sure that it is in your path then run your Java program which uses it, as described in the previous section. If the library fails to load have a look at Dynamic linking problems.

    26.2.8.2 Using NMAKE

    Alternatively, a Makefile for use by NMAKE can be written. Make sure the environment variables for MSVC++ are available and the MSVC++ tools are in your path. Now, just write a short Makefile like this :

    # Makefile for using SWIG and Java for C code
    
    SRCS          = example.c
    IFILE         = example
    INTERFACE     = $(IFILE).i
    WRAPFILE      = $(IFILE)_wrap.c
    
    # Location of the Visual C++ tools (32 bit assumed)
    
    TOOLS         = c:\msdev
    TARGET        = example.dll
    CC            = $(TOOLS)\bin\cl.exe
    LINK          = $(TOOLS)\bin\link.exe
    INCLUDE32     = -I$(TOOLS)\include
    MACHINE       = IX86
    
    # C Library needed to build a DLL
    
    DLLIBC        = msvcrt.lib oldnames.lib  
    
    # Windows libraries that are apparently needed
    WINLIB        = kernel32.lib advapi32.lib user32.lib gdi32.lib comdlg32.lib winspool.lib
    
    # Libraries common to all DLLs
    LIBS          = $(DLLIBC) $(WINLIB) 
    
    # Linker options
    LOPT      = -debug:full -debugtype:cv /NODEFAULTLIB /RELEASE /NOLOGO \
                 /MACHINE:$(MACHINE) -entry:_DllMainCRTStartup@12 -dll
    
    # C compiler flags
    
    CFLAGS        = /Z7 /Od /c /nologo
    JAVA_INCLUDE    = -ID:\jdk1.3\include -ID:\jdk1.3\include\win32
    
    java::
            swig -java -o $(WRAPFILE) $(INTERFACE)
            $(CC) $(CFLAGS) $(JAVA_INCLUDE) $(SRCS) $(WRAPFILE)
            set LIB=$(TOOLS)\lib
            $(LINK) $(LOPT) -out:example.dll $(LIBS) example.obj example_wrap.obj
            javac *.java
    

    To build the DLL and compile the java code, run NMAKE (you may need to run vcvars32 first). This is a pretty simplistic Makefile, but hopefully its enough to get you started. Of course you may want to make changes for it to work for C++ by adding in the -c++ command line option for swig and replacing .c with .cxx.

    26.3 A tour of basic C/C++ wrapping

    By default, SWIG attempts to build a natural Java interface to your C/C++ code. Functions are wrapped as functions, classes are wrapped as classes, variables are wrapped with JavaBean type getters and setters and so forth. This section briefly covers the essential aspects of this wrapping.

    26.3.1 Modules, packages and generated Java classes

    The SWIG %module directive specifies the name of the Java module. When you specify `%module example', the module name determines the name of some of the generated files in the module. The generated code consists of a module class file example.java , an intermediary JNI class file, exampleJNI.java as well as numerous other Java proxy class files. Each proxy class is named after the structs, unions and classes you are wrapping. You may also get a constants interface file if you are wrapping any unnamed enumerations or constants, for example exampleConstants.java. When choosing a module name, make sure you don't use the same name as one of the generated proxy class files nor a Java keyword. Sometimes a C/C++ type cannot be wrapped by a proxy class, for example a pointer to a primitive type. In these situations a type wrapper class is generated. Wrapping an enum generates an enum class, either a proper Java enum or a Java class that simulates the enums pattern. Details of all these generated classes will unfold as you read this section.

    The JNI (C/C++) code is generated into a file which also contains the module name, for example example_wrap.cxx or example_wrap.c. These C or C++ files complete the contents of the module.

    The generated Java classes can be placed into a Java package by using the -package commandline option. This is often combined with the -outdir to specify a package directory for generating the Java files.

    swig -java -package com.bloggs.swig -outdir com/bloggs/swig example.i
    

    SWIG won't create the directory, so make sure it exists beforehand.

    26.3.2 Functions

    There is no such thing as a global Java function so global C functions are wrapped as static methods in the module class. For example,

    %module example
    int fact(int n);
    
    

    creates a static function that works exactly like you think it might:

    public class example {
      public static int fact(int n) {
        // makes call using JNI to the C function
      }
    }
    

    The Java class example is the module class. The function can be used as follows from Java:

    System.out.println(example.fact(4));
    

    26.3.3 Global variables

    C/C++ global variables are fully supported by SWIG. Java does not allow the overriding of the dot operator so all variables are accessed through getters and setters. Again because there is no such thing as a Java global variable, access to C/C++ global variables is done through static getter and setter functions in the module class.

    // SWIG interface file with global variables
    %module example
    ...
    %inline %{
    extern int My_variable;
    extern double density;
    %}
    ...
    

    Now in Java :

    // Print out value of a C global variable
    System.out.println("My_variable = " + example.getMy_variable());
    // Set the value of a C global variable
    example.setDensity(0.8442);
    

    The value returned by the getter will always be up to date even if the value is changed in C. Note that the getters and setters produced follow the JavaBean property design pattern. That is the first letter of the variable name is capitalized and preceded with set or get. If you have the misfortune of wrapping two variables that differ only in the capitalization of their first letters, use %rename to change one of the variable names. For example:

    %rename Clash RenamedClash;
    float Clash;
    int clash;
    

    If a variable is declared as const, it is wrapped as a read-only variable. That is only a getter is produced.

    To make ordinary variables read-only, you can use the %immutable directive. For example:

    %{
    extern char *path;
    %}
    %immutable;
    extern char *path;
    %mutable;
    

    The %immutable directive stays in effect until it is explicitly disabled or cleared using %mutable. See the Creating read-only variables section for further details.

    If you just want to make a specific variable immutable, supply a declaration name. For example:

    %{
    extern char *path;
    %}
    %immutable path;
    ...
    extern char *path;      // Read-only (due to %immutable)
    

    26.3.4 Constants

    C/C++ constants are wrapped as Java static final variables. To create a constant, use #define or the %constant directive. For example:

    #define PI 3.14159
    #define VERSION "1.0"
    %constant int FOO = 42;
    %constant const char *path = "/usr/local";
    

    By default the generated static final variables are initialized by making a JNI call to get their value. The constants are generated into the constants interface and look like this:

    public interface exampleConstants {
      public final static double PI = exampleJNI.PI_get();
      public final static String VERSION = exampleJNI.VERSION_get();
      public final static int FOO = exampleJNI.FOO_get();
      public final static String path = exampleJNI.path_get();
    }
    

    Note that SWIG has inferred the C type and used an appropriate Java type that will fit the range of all possible values for the C type. By default SWIG generates runtime constants. They are not compiler constants that can, for example, be used in a switch statement. This can be changed by using the %javaconst(flag) directive. It works like all the other %feature directives. The default is %javaconst(0). It is possible to initialize all wrapped constants from pure Java code by placing a %javaconst(1) before SWIG parses the constants. Putting it at the top of your interface file would ensure this. Here is an example:

    %javaconst(1);
    %javaconst(0) BIG;
    %javaconst(0) LARGE;
    
    #define EXPRESSION (0x100+5)
    #define BIG 1000LL
    #define LARGE 2000ULL
    

    generates:

    public interface exampleConstants {
      public final static int EXPRESSION = (0x100+5);
      public final static long BIG = exampleJNI.BIG_get();
      public final static java.math.BigInteger LARGE = exampleJNI.LARGE_get();
    }
    

    Note that SWIG has inferred the C long long type from BIG and used an appropriate Java type (long) as a Java long is the smallest sized Java type that will take all possible values for a C long long. Similarly for LARGE.

    Be careful using the %javaconst(1) directive as not all C code will compile as Java code. For example neither the 1000LL value for BIG nor 2000ULL for LARGE above would generate valid Java code. The example demonstrates how you can target particular constants (BIG and LARGE) with %javaconst. SWIG doesn't use %javaconst(1) as the default as it tries to generate code that will always compile. However, using a %javaconst(1) at the top of your interface file is strongly recommended as the preferred compile time constants will be generated and most C constants will compile as Java code and in any case the odd constant that doesn't can be fixed using %javaconst(0).

    There is an alternative directive which can be used for these rare constant values that won't compile as Java code. This is the %javaconstvalue(value) directive, where value is a Java code replacement for the C constant and can be either a string or a number. This is useful if you do not want to use either the parsed C value nor a JNI call, such as when the C parsed value will not compile as Java code and a compile time constant is required. The same example demonstrates this:

    %javaconst(1);
    %javaconstvalue("new java.math.BigInteger(\"2000\")") LARGE;
    %javaconstvalue(1000) BIG;
    
    #define EXPRESSION (0x100+5)
    #define BIG 1000LL
    #define LARGE 2000ULL
    

    Note the string quotes for "2000" are escaped. The following is then generated:

    public interface exampleConstants {
      public final static int EXPRESSION = (0x100+5);
      public final static long BIG = 1000;
      public final static java.math.BigInteger LARGE = new java.math.BigInteger("2000");
    }
    

    Note: declarations declared as const are wrapped as read-only variables and will be accessed using a getter as described in the previous section. They are not wrapped as constants. The exception to this rule are static const integral values defined within a class/struct, where they are wrapped as constants, eg:.

    struct Maths {
      static const int FIVE = 5;
    };
    

    Compatibility Note: In SWIG-1.3.19 and earlier releases, the constants were generated into the module class and the constants interface didn't exist. Backwards compatibility is maintained as the module class implements the constants interface (even though some consider this type of interface implementation to be bad practice):

    public class example implements exampleConstants {
    }
    

    You thus have the choice of accessing these constants from either the module class or the constants interface, for example, example.EXPRESSION or exampleConstants.EXPRESSION. Or if you decide this practice isn't so bad and your own class implements exampleConstants, you can of course just use EXPRESSION.

    26.3.5 Enumerations

    SWIG handles both named and unnamed (anonymous) enumerations. There is a choice of approaches to wrapping named C/C++ enums. This is due to historical reasons as SWIG's initial support for enums was limited and Java did not originally have support for enums. Each approach has advantages and disadvantages and it is important for the user to decide which is the most appropriate solution. There are four approaches of which the first is the default approach based on the so called Java typesafe enum pattern. The second generates proper Java enums. The final two approaches use simple integers for each enum item. Before looking at the various approaches for wrapping named C/C++ enums, anonymous enums are considered.

    26.3.5.1 Anonymous enums

    There is no name for anonymous enums and so they are handled like constants. For example:

    enum { ALE, LAGER=10, STOUT, PILSNER, PILZ=PILSNER };
    

    is wrapped into the constants interface, in a similar manner as constants (see previous section):

    public interface exampleConstants {
      public final static int ALE = exampleJNI.ALE_get();
      public final static int LAGER = exampleJNI.LAGER_get();
      public final static int STOUT = exampleJNI.STOUT_get();
      public final static int PILSNER = exampleJNI.PILSNER_get();
      public final static int PILZ = exampleJNI.PILZ_get();
    }
    

    The %javaconst(flag) and %javaconstvalue(value) directive introduced in the previous section on constants can also be used with enums. As is the case for constants, the default is %javaconst(0) as not all C values will compile as Java code. However, it is strongly recommended to add in a %javaconst(1) directive at the top of your interface file as it is only on very rare occasions that this will produce code that won't compile under Java. Using %javaconst(1) will ensure compile time constants are generated, thereby allowing the enum values to be used in Java switch statements. Example usage:

    %javaconst(1);
    %javaconst(0) PILSNER;
    enum { ALE, LAGER=10, STOUT, PILSNER, PILZ=PILSNER };
    

    generates:

    public interface exampleConstants {
      public final static int ALE = 0;
      public final static int LAGER = 10;
      public final static int STOUT = LAGER + 1;
      public final static int PILSNER = exampleJNI.PILSNER_get();
      public final static int PILZ = PILSNER;
    }
    

    As in the case of constants, you can access them through either the module class or the constants interface, for example, example.ALE or exampleConstants.ALE.

    26.3.5.2 Typesafe enums

    This is the default approach to wrapping named enums. The typesafe enum pattern is a relatively well known construct to work around the lack of enums in versions of Java prior to JDK 1.5. It basically defines a class for the enumeration and permits a limited number of final static instances of the class. Each instance equates to an enum item within the enumeration. The implementation is in the "enumtypesafe.swg" file. Let's look at an example:

    %include "enumtypesafe.swg" // optional as typesafe enums are the default
    enum Beverage { ALE, LAGER=10, STOUT, PILSNER, PILZ=PILSNER };
    

    will generate:

    public final class Beverage {
      public final static Beverage ALE = new Beverage("ALE");
      public final static Beverage LAGER = new Beverage("LAGER", exampleJNI.LAGER_get());
      public final static Beverage STOUT = new Beverage("STOUT");
      public final static Beverage PILSNER = new Beverage("PILSNER");
      public final static Beverage PILZ = new Beverage("PILZ", exampleJNI.PILZ_get());
      [... additional support methods omitted for brevity ...]
    }
    

    See Typesafe enum classes to see the omitted support methods. Note that the enum item with an initializer (LAGER) is initialized with the enum value obtained via a JNI call. However, as with anonymous enums and constants, use of the %javaconst directive is strongly recommended to change this behaviour:

    %include "enumtypesafe.swg" // optional as typesafe enums are the default
    %javaconst(1);
    enum Beverage { ALE, LAGER=10, STOUT, PILSNER, PILZ=PILSNER };
    

    will generate:

    public final class Beverage {
      public final static Beverage ALE = new Beverage("ALE");
      public final static Beverage LAGER = new Beverage("LAGER", 10);
      public final static Beverage STOUT = new Beverage("STOUT");
      public final static Beverage PILSNER = new Beverage("PILSNER");
      public final static Beverage PILZ = new Beverage("PILZ", PILSNER);
      [... additional support methods omitted for brevity ...]
    }
    

    The generated code is easier to read and more efficient as a true constant is used instead of a JNI call. As is the case for constants, the default is %javaconst(0) as not all C values will compile as Java code. However, it is recommended to add in a %javaconst(1) directive at the top of your interface file as it is only on very rare occasions that this will produce code that won't compile under Java. The %javaconstvalue(value) directive can also be used for typesafe enums. Note that global enums are generated into a Java class within whatever package you are using. C++ enums defined within a C++ class are generated into a static final inner Java class within the Java proxy class.

    Typesafe enums have their advantages over using plain integers in that they can be used in a typesafe manner. However, there are limitations. For example, they cannot be used in switch statements and serialization is an issue. Please look at the following references for further information: Replace Enums with Classes in Effective Java Programming on the Sun website, Create enumerated constants in Java JavaWorld article, Java Tip 133: More on typesafe enums and Java Tip 122: Beware of Java typesafe enumerations JavaWorld tips.

    Note that the syntax required for using typesafe enums is the same as that for proper Java enums. This is useful during the period that a project has to support legacy versions of Java. When upgrading to JDK 1.5 or later, proper Java enums could be used instead, without users having to change their code. The following section details proper Java enum generation.

    26.3.5.3 Proper Java enums

    Proper Java enums were only introduced in JDK 1.5 so this approach is only compatible with more recent versions of Java. Java enums have been designed to overcome all the limitations of both typesafe and type unsafe enums and should be the choice solution, provided older versions of Java do not have to be supported. In this approach, each named C/C++ enum is wrapped by a Java enum. Java enums, by default, do not support enums with initializers. Java enums are in many respects similar to Java classes in that they can be customised with additional methods. SWIG takes advantage of this feature to facilitate wrapping C/C++ enums that have initializers. In order to wrap all possible C/C++ enums using proper Java enums, the "enums.swg" file must be used. Let's take a look at an example.

    %include "enums.swg"
    %javaconst(1);
    enum Beverage { ALE, LAGER=10, STOUT, PILSNER, PILZ=PILSNER };
    

    will generate:

    public enum Beverage {
      ALE,
      LAGER(10),
      STOUT,
      PILSNER,
      PILZ(PILSNER);
      [... additional support methods omitted for brevity ...]
    }
    

    See Proper Java enum classes to see the omitted support methods. The generated Java enum has numerous additional methods to support enums with initializers, such as LAGER above. Note that as with the typesafe enum pattern, enum items with initializers are by default initialized with the enum value obtained via a JNI call. However, this is not the case above as we have used the recommended %javaconst(1) to avoid the JNI call. The %javaconstvalue(value) directive covered in the Constants section can also be used for proper Java enums.

    The additional support methods need not be generated if none of the enum items have initializers and this is covered later in the Simpler Java enums for enums without initializers section.

    26.3.5.4 Type unsafe enums

    In this approach each enum item in a named enumeration is wrapped as a static final integer in a class named after the C/C++ enum name. This is a commonly used pattern in Java to simulate C/C++ enums, but it is not typesafe. However, the main advantage over the typesafe enum pattern is enum items can be used in switch statements. In order to use this approach, the "enumtypeunsafe.swg" file must be used. Let's take a look at an example.

    %include "enumtypeunsafe.swg"
    %javaconst(1);
    enum Beverage { ALE, LAGER=10, STOUT, PILSNER, PILZ=PILSNER };
    

    will generate:

    public final class Beverage {
      public final static int ALE = 0;
      public final static int LAGER = 10;
      public final static int STOUT = LAGER + 1;
      public final static int PILSNER = STOUT + 1;
      public final static int PILZ = PILSNER;
    }
    

    As is the case previously, the default is %javaconst(0) as not all C/C++ values will compile as Java code. However, again it is recommended to add in a %javaconst(1) directive. and the %javaconstvalue(value) directive covered in the Constants section can also be used for type unsafe enums. Note that global enums are generated into a Java class within whatever package you are using. C++ enums defined within a C++ class are generated into a static final inner Java class within the Java proxy class.

    Note that unlike typesafe enums, this approach requires users to mostly use different syntax compared with proper Java enums. Thus the upgrade path to proper enums provided in JDK 1.5 is more painful.

    26.3.5.5 Simple enums

    This approach is similar to the type unsafe approach. Each enum item is also wrapped as a static final integer. However, these integers are not generated into a class named after the C/C++ enum. Instead, global enums are generated into the constants interface. Also, enums defined in a C++ class have their enum items generated directly into the Java proxy class rather than an inner class within the Java proxy class. In fact, this approach is effectively wrapping the enums as if they were anonymous enums and the resulting code is as per anonymous enums. The implementation is in the "enumsimple.swg" file.

    Compatibility Note: SWIG-1.3.21 and earlier versions wrapped all enums using this approach. The type unsafe approach is preferable to this one and this simple approach is only included for backwards compatibility with these earlier versions of SWIG.

    26.3.6 Pointers

    C/C++ pointers are fully supported by SWIG. Furthermore, SWIG has no problem working with incomplete type information. Here is a rather simple interface:

    %module example
    
    FILE *fopen(const char *filename, const char *mode);
    int fputs(const char *, FILE *);
    int fclose(FILE *);
    

    When wrapped, you will be able to use the functions in a natural way from Java. For example:

    SWIGTYPE_p_FILE f = example.fopen("junk", "w");
    example.fputs("Hello World\n", f);
    example.fclose(f);
    

    C pointers in the Java module are stored in a Java long and cross the JNI boundary held within this 64 bit number. Many other SWIG language modules use an encoding of the pointer in a string. These scripting languages use the SWIG runtime type checker for dynamic type checking as they do not support static type checking by a compiler. In order to implement static type checking of pointers within Java, they are wrapped by a simple Java class. In the example above the FILE * pointer is wrapped with a type wrapper class called SWIGTYPE_p_FILE.

    Once obtained, a type wrapper object can be freely passed around to different C functions that expect to receive an object of that type. The only thing you can't do is dereference the pointer from Java. Of course, that isn't much of a concern in this example.

    As much as you might be inclined to modify a pointer value directly from Java, don't. The value is not necessarily the same as the logical memory address of the underlying object. The value will vary depending on the native byte-ordering of the platform (i.e., big-endian vs. little-endian). Most JVMs are 32 bit applications so any JNI code must also be compiled as 32 bit. The net result is pointers in JNI code are also 32 bits and are stored in the high order 4 bytes on big-endian machines and in the low order 4 bytes on little-endian machines. By design it is also not possible to manually cast a pointer to a new type by using Java casts as it is particularly dangerous especially when casting C++ objects. If you need to cast a pointer or change its value, consider writing some helper functions instead. For example:

    %inline %{
    /* C-style cast */
    Bar *FooToBar(Foo *f) {
      return (Bar *) f;
    }
    
    /* C++-style cast */
    Foo *BarToFoo(Bar *b) {
      return dynamic_cast<Foo*>(b);
    }
    
    Foo *IncrFoo(Foo *f, int i) {
      return f+i;
    }
    %}
    

    Also, if working with C++, you should always try to use the new C++ style casts. For example, in the above code, the C-style cast may return a bogus result whereas as the C++-style cast will return a NULL pointer if the conversion can't be performed.

    26.3.7 Structures

    If you wrap a C structure, it is wrapped by a Java class with getters and setters for access to the member variables. For example,

    struct Vector {
      double x, y, z;
    };
    
    

    is used as follows:

    Vector v = new Vector();
    v.setX(3.5);
    v.setY(7.2);
    double x = v.getX();
    double y = v.getY();
    

    The variable setters and getters are also based on the JavaBean design pattern already covered under the Global variables section. Similar access is provided for unions and the public data members of C++ classes.

    This object is actually an instance of a Java class that has been wrapped around a pointer to the C structure. This instance doesn't actually do anything--it just serves as a proxy. The pointer to the C object is held in the Java proxy class in much the same way as pointers are held by type wrapper classes. Further details about Java proxy classes are covered a little later.

    const members of a structure are read-only. Data members can also be forced to be read-only using the %immutable directive. For example:

    struct Foo {
      ...
      %immutable;
      int x;        /* Read-only members */
      char *name;
      %mutable;
      ...
    };
    

    When char * members of a structure are wrapped, the contents are assumed to be dynamically allocated using malloc or new (depending on whether or not SWIG is run with the -c++ option). When the structure member is set, the old contents will be released and a new value created. If this is not the behavior you want, you will have to use a typemap (described later).

    If a structure contains arrays, access to those arrays is managed through pointers. For example, consider this:

    struct Bar {
      int  x[16];
    };
    

    If accessed in Java, you will see behavior like this:

    Bar b = new Bar();
    SWIGTYPE_p_int x = b.getX();
    

    This pointer can be passed around to functions that expect to receive an int * (just like C). You can also set the value of an array member using another pointer. For example:

    Bar b = new Bar();
    SWIGTYPE_p_int x = b.getX();
    Bar c = new Bar();
    c.setX(x);                    // Copy contents of b.x to c.x
    

    For array assignment (setters not getters), SWIG copies the entire contents of the array starting with the data pointed to by b.x . In this example, 16 integers would be copied. Like C, SWIG makes no assumptions about bounds checking---if you pass a bad pointer, you may get a segmentation fault or access violation. The default wrapping makes it hard to set or get just one element of the array and so array access from Java is somewhat limited. This can be changed easily though by using the approach outlined later in the Wrapping C arrays with Java arrays and Unbounded C Arrays sections.

    When a member of a structure is itself a structure, it is handled as a pointer. For example, suppose you have two structures like this:

    struct Foo {
      int a;
    };
    
    struct Bar {
      Foo f;
    };
    

    Now, suppose that you access the f member of Bar like this:

    Bar b = new Bar();
    Foo x = b.getF();
    

    In this case, x is a pointer that points to the Foo that is inside b. This is the same value as generated by this C code:

    Bar b;
    Foo *x = &b->f;       /* Points inside b */
    

    Because the pointer points inside the structure, you can modify the contents and everything works just like you would expect. For example:

    Bar b = new Bar();
    b.getF().setA(3);   // Modify b.f.a
    Foo x = b.getF();                   
    x.setA(3);          // Modify x.a - this is the same as b.f.a
    

    26.3.8 C++ classes

    C++ classes are wrapped by Java classes as well. For example, if you have this class,

    class List {
    public:
      List();
      ~List();
      int  search(char *item);
      void insert(char *item);
      void remove(char *item);
      char *get(int n);
      int  length;
    };
    

    you can use it in Java like this:

    List l = new List();
    l.insert("Ale");
    l.insert("Stout");
    l.insert("Lager");
    String item = l.get(2);
    int length = l.getLength();
    

    Class data members are accessed in the same manner as C structures.

    Static class members are unsurprisingly wrapped as static members of the Java class:

    class Spam {
    public:
      static void foo();
      static int bar;
    };
    

    The static members work like any other Java static member:

    Spam.foo();
    int bar = Spam.getBar();
    

    26.3.9 C++ inheritance

    SWIG is fully aware of issues related to C++ inheritance. Therefore, if you have classes like this

    class Foo {
    ...
    };
    
    class Bar : public Foo {
    ...
    };
    

    those classes are wrapped into a hierarchy of Java classes that reflect the same inheritance structure:

    Bar b = new Bar();
    Class c = b.getClass();
    System.out.println(c.getSuperclass().getName());
    

    will of course display:

    Foo
    

    Furthermore, if you have functions like this

    void spam(Foo *f);
    

    then the Java function spam() accepts instances of Foo or instances of any other proxy classes derived from Foo.

    Note that Java does not support multiple inheritance so any multiple inheritance in the C++ code is not going to work. A warning is given when multiple inheritance is detected and only the first base class is used.

    26.3.10 Pointers, references, arrays and pass by value

    In C++, there are many different ways a function might receive and manipulate objects. For example:

    void spam1(Foo *x);      // Pass by pointer
    void spam2(Foo &x);      // Pass by reference
    void spam3(Foo x);       // Pass by value
    void spam4(Foo x[]);     // Array of objects
    

    In Java, there is no detailed distinction like this--specifically, there are only instances of classes. There are no pointers nor references. Because of this, SWIG unifies all of these types together in the wrapper code. For instance, if you actually had the above functions, it is perfectly legal to do this from Java:

    Foo f = new Foo();  // Create a Foo
    example.spam1(f);   // Ok. Pointer
    example.spam2(f);   // Ok. Reference
    example.spam3(f);   // Ok. Value.
    example.spam4(f);   // Ok. Array (1 element)
    

    Similar behavior occurs for return values. For example, if you had functions like this,

    Foo *spam5();
    Foo &spam6();
    Foo  spam7();
    

    then all three functions will return a pointer to some Foo object. Since the third function (spam7) returns a value, newly allocated memory is used to hold the result and a pointer is returned (Java will release this memory when the returned object's finalizer is run by the garbage collector).

    26.3.10.1 Null pointers

    Working with null pointers is easy. A Java null can be used whenever a method expects a proxy class or typewrapper class. However, it is not possible to pass null to C/C++ functions that take parameters by value or by reference. If you try you will get a NullPointerException.

    example.spam1(null);   // Pointer - ok
    example.spam2(null);   // Reference - NullPointerException
    example.spam3(null);   // Value - NullPointerException
    example.spam4(null);   // Array - ok
    

    For spam1 and spam4 above the Java null gets translated into a NULL pointer for passing to the C/C++ function. The converse also occurs, that is, NULL pointers are translated into null Java objects when returned from a C/C++ function.

    26.3.11 C++ overloaded functions

    C++ overloaded functions, methods, and constructors are mostly supported by SWIG. For example, if you have two functions like this:

    %module example
    
    void foo(int);
    void foo(char *c);
    

    You can use them in Java in a straightforward manner:

    example.foo(3);           // foo(int)
    example.foo("Hello");     // foo(char *c)
    

    Similarly, if you have a class like this,

    class Foo {
    public:
      Foo();
      Foo(const Foo &);
      ...
    };
    

    you can write Java code like this:

    Foo f = new Foo();        // Create a Foo
    Foo g = new Foo(f);       // Copy f
    

    Overloading support is not quite as flexible as in C++. Sometimes there are methods that SWIG cannot disambiguate as there can be more than one C++ type mapping onto a single Java type. For example:

    void spam(int);
    void spam(unsigned short);
    

    Here both int and unsigned short map onto a Java int. Here is another example:

    void foo(Bar *b);
    void foo(Bar &b);
    

    If declarations such as these appear, you will get a warning message like this:

    example.i:12: Warning 515: Overloaded method spam(unsigned short) ignored.
    Method spam(int) at example.i:11 used.
    

    To fix this, you either need to either rename or ignore one of the methods. For example:

    %rename(spam_ushort) spam(unsigned short);
    ...
    void spam(int);    
    void spam(unsigned short);   // Now renamed to spam_ushort
    

    or

    %ignore spam(unsigned short);
    ...
    void spam(int);    
    void spam(unsigned short);   // Ignored
    

    26.3.12 C++ default arguments

    Any function with a default argument is wrapped by generating an additional function for each argument that is defaulted. For example, if we have the following C++:

    %module example
    
    void defaults(double d=10.0, int i=0);
    

    The following methods are generated in the Java module class:

    public class example {
      public static void defaults(double d, int i) { ... }
      public static void defaults(double d) { ... }
      public static void defaults() { ... }
    }
    

    It is as if SWIG had parsed three separate overloaded methods. The same approach is taken for static methods, constructors and member methods.

    Compatibility note: Versions of SWIG prior to SWIG-1.3.23 wrapped these with a single wrapper method and so the default values could not be taken advantage of from Java. Further details on default arguments and how to restore this approach are given in the more general Default arguments section.

    26.3.13 C++ namespaces

    SWIG is aware of named C++ namespaces and they can be mapped to Java packages, however, the default wrapping flattens the namespaces, effectively ignoring them. So by default, the namespace names do not appear in the module nor do namespaces result in a module that is broken up into submodules or packages. For example, if you have a file like this,

    %module example
    
    namespace foo {
      int fact(int n);
      struct Vector {
        double x, y, z;
      };
    };
    

    it works in Java as follows:

    int f = example.fact(3);
    Vector v = new Vector();
    v.setX(3.4);
    double y = v.getY();
    

    If your program has more than one namespace, name conflicts (if any) can be resolved using %rename For example:

    %rename(Bar_spam) Bar::spam;
    
    namespace Foo {
      int spam();
    }
    
    namespace Bar {
      int spam();
    }
    

    If you have more than one namespace and you want to keep their symbols separate, consider wrapping them as separate SWIG modules. Each SWIG module can be placed into a separate package.

    The default behaviour described above can be improved via the nspace feature. Note that it only works for classes, structs, unions and enums declared within a named C++ namespace. When the nspace feature is used, the C++ namespaces are converted into Java packages of the same name. Proxy classes are thus declared within a package and this proxy makes numerous calls to the JNI intermediary class which is declared in the unnamed package by default. As Java does not support types declared in a named package accessing types declared in an unnamed package, the -package commandline option described earlier generally should be used to provide a parent package. So if SWIG is run using the -package com.myco option, a wrapped class, MyWorld::Material::Color, can then be accessed as com.myco.MyWorld.Material.Color. If you don't specify a package, you will get the following warning:

    example.i:16: Warning 826: The nspace feature is used on 'MyWorld::Material::Color' without -package. The generated code 
    may not compile as Java does not support types declared in a named package accessing types declared in an unnamed package.
    

    If it is undesirable to have a single top level package, the nspace feature may be used without the -package commandline option (and the resulting warning ignored) if all of the types exposed using SWIG are placed in a package using the nspace feature and the 'jniclasspackage' pragma is used to specify a package for the JNI intermediary class.

    If the resulting use of the nspace feature and hence packages results in a proxy class in one package deriving or using a proxy class from another package, you will need to open up the visibility for the pointer constructor and getCPtr method from the default 'protected' to 'public' with the SWIG_JAVABODY_PROXY macro. See Java code typemaps.

    26.3.14 C++ templates

    C++ templates don't present a huge problem for SWIG. However, in order to create wrappers, you have to tell SWIG to create wrappers for a particular template instantiation. To do this, you use the %template directive. For example:

    %module example
    %{
    #include <utility>
    %}
    
    template<class T1, class T2>
    struct pair {
      typedef T1 first_type;
      typedef T2 second_type;
      T1 first;
      T2 second;
      pair();
      pair(const T1&, const T2&);
      ~pair();
    };
    
    %template(pairii) pair<int, int>;
    

    In Java:

    pairii p = new pairii(3, 4);
    int first = p.getFirst();
    int second = p.getSecond();
    

    Obviously, there is more to template wrapping than shown in this example. More details can be found in the SWIG and C++ chapter.

    26.3.15 C++ Smart Pointers

    26.3.15.1 The shared_ptr Smart Pointer

    The C++11 standard provides std::shared_ptr which was derived from the Boost implementation, boost::shared_ptr. Both of these are available for Java in the SWIG library and usage is outlined in the shared_ptr smart pointer library section.

    26.3.15.2 Generic Smart Pointers

    In certain C++ programs, it is common to use classes that have been wrapped by so-called "smart pointers." Generally, this involves the use of a template class that implements operator->() like this:

    template<class T> class SmartPtr {
      ...
      T *operator->();
      ...
    }
    

    Then, if you have a class like this,

    class Foo {
    public:
      int x;
      int bar();
    };
    

    A smart pointer would be used in C++ as follows:

    SmartPtr<Foo> p = CreateFoo();   // Created somehow (not shown)
    ...
    p->x = 3;                        // Foo::x
    int y = p->bar();                // Foo::bar
    

    To wrap this in Java, simply tell SWIG about the SmartPtr class and the low-level Foo object. Make sure you instantiate SmartPtr using %template if necessary. For example:

    %module example
    ...
    %template(SmartPtrFoo) SmartPtr<Foo>;
    ...
    

    Now, in Java, everything should just "work":

    SmartPtrFoo p = example.CreateFoo(); // Create a smart-pointer somehow
    p.setX(3);                           // Foo::x
    int y = p.bar();                     // Foo::bar
    

    If you ever need to access the underlying pointer returned by operator->() itself, simply use the __deref__() method. For example:

    Foo f = p.__deref__();               // Returns underlying Foo *
    

    26.4 Further details on the generated Java classes

    In the previous section, a high-level view of Java wrapping was presented. A key component of this wrapping is that structures and classes are wrapped by Java proxy classes and type wrapper classes are used in situations where no proxies are generated. This provides a very natural, type safe Java interface to the C/C++ code and fits in with the Java programming paradigm. However, a number of low-level details were omitted. This section provides a brief overview of how the proxy classes work and then covers the type wrapper classes. Finally enum classes are covered. First, the crucial intermediary JNI class is considered.

    26.4.1 The intermediary JNI class

    In the "SWIG basics" and "SWIG and C++" chapters, details of low-level structure and class wrapping are described. To summarize those chapters, if you have a global function and class like this

    class Foo {
    public:
      int x;
      int spam(int num, Foo* foo);
    };
    void egg(Foo* chips);
    

    then SWIG transforms the class into a set of low-level procedural wrappers. These procedural wrappers essentially perform the equivalent of this C++ code:

    Foo *new_Foo() {
      return new Foo();
    }
    void delete_Foo(Foo *f) {
      delete f;
    }
    int Foo_x_get(Foo *f) {
      return f->x;
    }
    void Foo_x_set(Foo *f, int value) {
      f->x = value;
    }
    int Foo_spam(Foo *f, int num, Foo* foo) {
      return f->spam(num, foo);
    }
    

    These procedural function names don't actually exist, but their functionality appears inside the generated JNI functions. The JNI functions have to follow a particular naming convention so the function names are actually:

    SWIGEXPORT jlong JNICALL Java_exampleJNI_new_1Foo(JNIEnv *jenv, jclass jcls);
    SWIGEXPORT void JNICALL Java_exampleJNI_delete_1Foo(JNIEnv *jenv, jclass jcls,
                                                        jlong jarg1);
    SWIGEXPORT void JNICALL Java_exampleJNI_Foo_1x_1set(JNIEnv *jenv, jclass jcls,
                                                        jlong jarg1, jobject jarg1_, jint jarg2);
    SWIGEXPORT jint JNICALL Java_exampleJNI_Foo_1x_1get(JNIEnv *jenv, jclass jcls,
                                                        jlong jarg1, jobject jarg1_);
    SWIGEXPORT jint JNICALL Java_exampleJNI_Foo_1spam(JNIEnv *jenv, jclass jcls,
                                                      jlong jarg1, jobject jarg1_, jint jarg2,
                                                      jlong jarg3, jobject jarg3_);
    SWIGEXPORT void JNICALL Java_exampleJNI_egg(JNIEnv *jenv, jclass jcls,
                                                jlong jarg1, jobject jarg1_);
    

    For every JNI C function there has to be a static native Java function. These appear in the intermediary JNI class:

    class exampleJNI {
      public final static native long new_Foo();
      public final static native void delete_Foo(long jarg1);
      public final static native void Foo_x_set(long jarg1, Foo jarg1_, int jarg2);
      public final static native int Foo_x_get(long jarg1, Foo jarg1_);
      public final static native int Foo_spam(long jarg1, Foo jarg1_, int jarg2,
                                              long jarg3, Foo jarg3_);
      public final static native void egg(long jarg1, Foo jarg1_);
    }
    

    This class contains the complete Java - C/C++ interface so all function calls go via this class. As this class acts as a go-between for all JNI calls to C/C++ code from the Java proxy classes, type wrapper classes and module class, it is known as the intermediary JNI class.

    You may notice that SWIG uses a Java long wherever a pointer or class object needs to be marshalled across the Java-C/C++ boundary. This approach leads to minimal JNI code which makes for better performance as JNI code involves a lot of string manipulation. SWIG favours generating Java code over JNI code as Java code is compiled into byte code and avoids the costly string operations needed in JNI code. This approach has a downside though as the proxy class might get collected before the native method has completed. You might notice above that there is an additional parameters with a underscore postfix, eg jarg1_. These are added in order to prevent premature garbage collection when marshalling proxy classes.

    The functions in the intermediary JNI class cannot be accessed outside of its package. Access to them is gained through the module class for globals otherwise the appropriate proxy class.

    The name of the intermediary JNI class can be changed from its default, that is, the module name with JNI appended after it. The module directive attribute jniclassname is used to achieve this:

    %module (jniclassname="name") modulename
    

    If name is the same as modulename then the module class name gets changed from modulename to modulenameModule.

    26.4.1.1 The intermediary JNI class pragmas

    The intermediary JNI class can be tailored through the use of pragmas, but is not commonly done. The pragmas for this class are:

    PragmaDescription
    jniclassbaseBase class for the intermediary JNI class
    jniclasspackagePackage in which to place the intermediary JNI class
    jniclassclassmodifiersClass modifiers and class type for the intermediary JNI class
    jniclasscodeJava code is copied verbatim into the intermediary JNI class
    jniclassimportsJava code, usually one or more import statements, placed before the intermediary JNI class definition
    jniclassinterfacesComma separated interface classes for the intermediary JNI class

    The pragma code appears in the generated intermediary JNI class where you would expect:

    [ jniclassimports pragma ]
    [ jniclassclassmodifiers pragma ] jniclassname extends [ jniclassbase pragma ]
                                              implements [ jniclassinterfaces pragma ] {
    [ jniclasscode pragma ]
    ... SWIG generated native methods ...
    }
    

    The jniclasscode pragma is quite useful for adding in a static block for loading the shared library / dynamic link library and demonstrates how pragmas work:

    %pragma(java) jniclasscode=%{
      static {
        try {
          System.loadLibrary("example");
        } catch (UnsatisfiedLinkError e) {
          System.err.println("Native code library failed to load. \n" + e);
          System.exit(1);
        }
      }
    %}
    

    Pragmas will take either "" or %{ %} as delimiters. For example, let's change the intermediary JNI class access to just the default package-private access.

    %pragma(java) jniclassclassmodifiers="class"
    

    All the methods in the intermediary JNI class will then not be callable outside of the package as the method modifiers have been changed from public access to default access. This is useful if you want to prevent users calling these low level functions.

    26.4.2 The Java module class

    All global functions and variable getters/setters appear in the module class. For our example, there is just one function:

    public class example {
      public static void egg(Foo chips) {
        exampleJNI.egg(Foo.getCPtr(chips), chips);
      }
    }
    

    The module class is necessary as there is no such thing as a global in Java so all the C globals are put into this class. They are generated as static functions and so must be accessed as such by using the module name in the static function call:

    example.egg(new Foo());
    

    The primary reason for having the module class wrapping the calls in the intermediary JNI class is to implement static type checking. In this case only a Foo can be passed to the egg function, whereas any long can be passed to the egg function in the intermediary JNI class.

    26.4.2.1 The Java module class pragmas

    The module class can be tailored through the use of pragmas, in the same manner as the intermediary JNI class. The pragmas are similarly named and are used in the same way. The complete list follows:

    PragmaDescription
    modulebaseBase class for the module class
    moduleclassmodifiersClass modifiers and class type for the module class
    modulecodeJava code is copied verbatim into the module class
    moduleimportsJava code, usually one or more import statements, placed before the module class definition
    moduleinterfacesComma separated interface classes for the module class

    The pragma code appears in the generated module class like this:

    [ moduleimports pragma ]
    [ modulemodifiers pragma ] modulename extends [ modulebase pragma ]
                                          implements [ moduleinterfaces pragma ] {
    [ modulecode pragma ]
    ... SWIG generated wrapper functions ...
    }
    

    See The intermediary JNI class pragmas section for further details on using pragmas.

    26.4.3 Java proxy classes

    A Java proxy class is generated for each structure, union or C++ class that is wrapped. Proxy classes have also been called peer classes. The default proxy class for our previous example looks like this:

    public class Foo {
      private transient long swigCPtr;
      protected transient boolean swigCMemOwn;
    
      protected Foo(long cPtr, boolean cMemoryOwn) {
        swigCMemOwn = cMemoryOwn;
        swigCPtr = cPtr;
      }
    
      protected static long getCPtr(Foo obj) {
        return (obj == null) ? 0 : obj.swigCPtr;
      }
    
      protected void finalize() {
        delete();
      }
    
      public synchronized void delete() {
        if(swigCPtr != 0 && swigCMemOwn) {
          swigCMemOwn = false;
          exampleJNI.delete_Foo(swigCPtr);
        }
        swigCPtr = 0;
      }
    
      public void setX(int value) {
        exampleJNI.Foo_x_set(swigCPtr, this, value);
      }
    
      public int getX() {
        return exampleJNI.Foo_x_get(swigCPtr, this);
      }
    
      public int spam(int num, Foo foo) {
        return exampleJNI.Foo_spam(swigCPtr, this, num, Foo.getCPtr(foo), foo);
      }
    
      public Foo() {
        this(exampleJNI.new_Foo(), true);
      }
    
    }
    

    This class merely holds a pointer to the underlying C++ object ( swigCPtr). It also contains all the methods in the C++ class it is proxying plus getters and setters for public member variables. These functions call the native methods in the intermediary JNI class. The advantage of having this extra layer is the type safety that the proxy class functions offer. It adds static type checking which leads to fewer surprises at runtime. For example, you can see that if you attempt to use the spam() function it will only compile when the parameters passed are an int and a Foo. From a user's point of view, it makes the class work as if it were a Java class:

    Foo f = new Foo();
    f.setX(3);
    int y = f.spam(5, new Foo());
    

    26.4.3.1 Memory management

    Each proxy class has an ownership flag swigCMemOwn. The value of this flag determines who is responsible for deleting the underlying C++ object. If set to true, the proxy class's finalizer will destroy the C++ object when the proxy class is garbage collected. If set to false, then the destruction of the proxy class has no effect on the C++ object.

    When an object is created by a constructor or returned by value, Java automatically takes ownership of the result. On the other hand, when pointers or references are returned to Java, there is often no way to know where they came from. Therefore, the ownership is set to false. For example:

    class Foo {
    public:
      Foo();
      Foo bar1();
      Foo &bar2();
      Foo *bar2();
    };
    

    In Java:

    Foo f = new Foo();   //  f.swigCMemOwn = true
    Foo f1 = f.bar1();   // f1.swigCMemOwn = true
    Foo f2 = f.bar2();   // f2.swigCMemOwn = false
    Foo f3 = f.bar3();   // f3.swigCMemOwn = false
    

    This behavior for pointers and references is especially important for classes that act as containers. For example, if a method returns a pointer to an object that is contained inside another object, you definitely don't want Java to assume ownership and destroy it!

    For the most part, memory management issues remain hidden. However, there are situations where you might have to manually change the ownership of an object. For instance, consider code like this:

    class Obj {};
    class Node {
      Obj *value;
    public:
      void set_value(Obj *v) { value = v; }
    };
    

    Now, consider the following Java code:

    Node n = new Node();    // Create a node
    {
      Obj o = new Obj();    // Create an object
      n.set_value(o);       // Set value
    }                       // o goes out of scope
    

    In this case, the Node n is holding a reference to o internally. However, SWIG has no way to know that this has occurred. The Java proxy class still thinks that it has ownership of o. As o has gone out of scope, it could be garbage collected in which case the C++ destructor will be invoked and n will then be holding a stale-pointer to o. If you're lucky, you will only get a segmentation fault.

    To work around this, the ownership flag of o needs changing to false. The ownership flag is a private member variable of the proxy class so this is not possible without some customization of the proxy class. This can be achieved by using a typemap to customise the proxy class with pure Java code as detailed later in the section on Java typemaps.

    Sometimes a function will create memory and return a pointer to a newly allocated object. SWIG has no way of knowing this so by default the proxy class does not manage the returned object. However, you can tell the proxy class to manage the memory if you specify the %newobject directive. Consider:

    class Obj {...};
    class Factory {
    public:
      static Obj *createObj() { return new Obj(); }
    };
    

    If we call the factory function, then we have to manually delete the memory:

    Obj obj = Factory.createObj();   // obj.swigCMemOwn = false
    ...
    obj.delete();
    

    Now add in the %newobject directive:

    %newobject Factory::createObj();
    
    class Obj {...};
    class Factory {
    public:
      static Obj *createObj() { return new Obj(); }
    };
    

    A call to delete() is no longer necessary as the garbage collector will make the C++ destructor call because swigCMemOwn is now true.

    Obj obj = Factory.createObj();   // obj.swigCMemOwn = true;
    ...
    

    Some memory management issues are quite tricky to fix and may only be noticeable after using for a long time. One such issue is premature garbage collection of an object created from Java and resultant usage from C++ code. The section on typemap examples cover two such scenarios, Memory management for objects passed to the C++ layer and Memory management when returning references to member variables

    26.4.3.2 Inheritance

    Java proxy classes will mirror C++ inheritance chains. For example, given the base class Base and its derived class Derived :

    class Base {
    public:
      virtual double foo();
    };
    
    class Derived : public Base {
    public:
      virtual double foo();
    };
    

    The base class is generated much like any other proxy class seen so far:

    public class Base {
      private transient long swigCPtr;
      protected transient boolean swigCMemOwn;
    
      protected Base(long cPtr, boolean cMemoryOwn) {
        swigCMemOwn = cMemoryOwn;
        swigCPtr = cPtr;
      }
    
      protected static long getCPtr(Base obj) {
        return (obj == null) ? 0 : obj.swigCPtr;
      }
    
      protected void finalize() {
        delete();
      }
    
      public synchronized void delete() {
        if(swigCPtr != 0 && swigCMemOwn) {
          swigCMemOwn = false;
          exampleJNI.delete_Base(swigCPtr);
        }
        swigCPtr = 0;
      }
    
      public double foo() {
        return exampleJNI.Base_foo(swigCPtr, this);
      }
    
      public Base() {
        this(exampleJNI.new_Base(), true);
      }
    
    }
    

    The Derived class extends Base mirroring the C++ class inheritance hierarchy.

    public class Derived extends Base {
      private transient long swigCPtr;
    
      protected Derived(long cPtr, boolean cMemoryOwn) {
        super(exampleJNI.SWIGDerivedUpcast(cPtr), cMemoryOwn);
        swigCPtr = cPtr;
      }
    
      protected static long getCPtr(Derived obj) {
        return (obj == null) ? 0 : obj.swigCPtr;
      }
    
      protected void finalize() {
        delete();
      }
    
      public synchronized void delete() {
        if(swigCPtr != 0 && swigCMemOwn) {
          swigCMemOwn = false;
          exampleJNI.delete_Derived(swigCPtr);
        }
        swigCPtr = 0;
        super.delete();
      }
    
      public double foo() {
        return exampleJNI.Derived_foo(swigCPtr, this);
      }
    
      public Derived() {
        this(exampleJNI.new_Derived(), true);
      }
    
    }
    

    Note the memory ownership is controlled by the base class. However each class in the inheritance hierarchy has its own pointer value which is obtained during construction. The SWIGDerivedUpcast() call converts the pointer from a Derived * to a Base *. This is a necessity as C++ compilers are free to implement pointers in the inheritance hierarchy with different values.

    It is of course possible to extend Base using your own Java classes. If Derived is provided by the C++ code, you could for example add in a pure Java class Extended derived from Base. There is a caveat and that is any C++ code will not know about your pure Java class Extended so this type of derivation is restricted. However, true cross language polymorphism can be achieved using the directors feature.

    26.4.3.3 Proxy classes and garbage collection

    By default each proxy class has a delete() and a finalize() method. The finalize() method calls delete() which frees any malloc'd memory for wrapped C structs or calls the C++ class destructors. The idea is for delete() to be called when you have finished with the C/C++ object. Ideally you need not call delete(), but rather leave it to the garbage collector to call it from the finalizer. When a program exits, the garbage collector does not guarantee to call all finalizers. An insight into the reasoning behind this can be obtained from Hans Boehm's Destructors, Finalizers, and Synchronization paper. Depending on what the finalizers do and which operating system you use, this may or may not be a problem.

    If the delete() call into JNI code is just for memory handling, there is not a problem when run on most operating systems, for example Windows and Unix. Say your JNI code creates memory on the heap which your finalizers should clean up, the finalizers may or may not be called before the program exits. In Windows and Unix all memory that a process uses is returned to the system on exit, so this isn't a problem. This is not the case in some operating systems like vxWorks. If however, your finalizer calls into JNI code invoking the C++ destructor which in turn releases a TCP/IP socket for example, there is no guarantee that it will be released. Note that with long running programs the garbage collector will eventually run, thereby calling any unreferenced object's finalizers.

    Some not so ideal solutions are:

    1. Call the System.runFinalizersOnExit(true) or Runtime.getRuntime().runFinalizersOnExit(true) to ensure the finalizers are called before the program exits. The catch is that this is a deprecated function call as the documentation says:

      This method is inherently unsafe. It may result in finalizers being called on live objects while other threads are concurrently manipulating those objects, resulting in erratic behavior or deadlock.

      In many cases you will be lucky and find that it works, but it is not to be advocated. Have a look at Java web site and search for runFinalizersOnExit.

    2. From jdk1.3 onwards a new function, addShutdownHook(), was introduced which is guaranteed to be called when your program exits. You can encourage the garbage collector to call the finalizers, for example, add this static block to the class that has the main() function:

        static {
          Runtime.getRuntime().addShutdownHook( 
            new Thread() {
              public void run() { System.gc(); System.runFinalization(); }
            }
          );
        }
      

      Although this usually works, the documentation doesn't guarantee that runFinalization() will actually call the finalizers. As the shutdown hook is guaranteed you could also make a JNI call to clean up any resources that are being tracked by the C/C++ code.

    3. Call the delete() function manually which will immediately invoke the C++ destructor. As a suggestion it may be a good idea to set the object to null so that should the object be inadvertently used again a Java null pointer exception is thrown, the alternative would crash the JVM by using a null C pointer. For example given a SWIG generated class A:

      A myA = new A();
      // use myA ...
      myA.delete();
      // any use of myA here would crash the JVM 
      myA=null;
      // any use of myA here would cause a Java null pointer exception to be thrown
      

      The SWIG generated code ensures that the memory is not deleted twice, in the event the finalizers get called in addition to the manual delete() call.

    4. Write your own object manager in Java. You could derive all SWIG classes from a single base class which could track which objects have had their finalizers run, then call the rest of them on program termination. The section on Java typemaps details how to specify a pure Java base class.

    See the How to Handle Java Finalization's Memory-Retention Issues article for alternative approaches to managing memory by avoiding finalizers altogether.

    26.4.3.4 The premature garbage collection prevention parameter for proxy class marshalling

    As covered earlier, the C/C++ struct/class pointer is stored in the proxy class as a Java long and when needed is passed into the native method where it is cast into the appropriate type. This approach provides very fast marshalling but could be susceptible to premature garbage collection. Consider the following C++ code:

    class Wibble {
    };
    void wobble(Wibble &w);
    

    The module class contains the Java wrapper for the global wobble method:

    public class example {
      ...
      public static void wobble(Wibble w) {
        exampleJNI.wobble(Wibble.getCPtr(w), w);
      }
    }
    

    where example is the name of the module. All native methods go through the intermediary class which has the native method declared as such:

    public class exampleJNI {
      ...
      public final static native void wobble(long jarg1, Wibble jarg1_);
    }
    

    The second parameter, jarg1_, is the premature garbage collection prevention parameter and is added to the native method parameter list whenever a C/C++ struct or class is marshalled as a Java long. In order to understand why, consider the alternative where the intermediary class method is declared without the additional parameter:

    public class exampleJNI {
      ...
      public final static native void wobble(long jarg1);
    }
    

    and the following simple call to wobble:

    {
      Wibble w = new Wibble();
      example.wobble(w);
    }
    

    The hotspot compiler effectively sees something like:

    {
      Wibble w = new Wibble();
      long w_ptr = Wibble.getCPtr(w);
      // w is no longer reachable
      exampleJNI.wobble(w_ptr);
    }
    

    The Wibble object is no longer reachable after the point shown as in this bit of code, the Wibble object is not referenced again after this point. This means that it is a candidate for garbage collection. Should wobble be a long running method, it is quite likely that the finalizer for the Wibble instance will be called. This in turn will call its underlying C++ destructor which is obviously disastrous while the method wobble is running using this object. Even if wobble is not a long running method, it is possible for the Wibble instance to be finalized. By passing the Wibble instance into the native method, it will not be finalized as the JVM guarantees not to finalize any objects until the native method returns. Effectively, the code then becomes

    {
      Wibble w = new Wibble();
      long w_ptr = Wibble.getCPtr(w);
      exampleJNI.wobble(w_ptr, w);
      // w is no longer reachable
    }
    

    and therefore there is no possibility of premature garbage collection. In practice, this premature garbage collection was only ever observed in Sun's server JVM from jdk-1.3 onwards and in Sun's client JVM from jdk-1.6 onwards.

    The premature garbage collection prevention parameter for proxy classes is generated by default whenever proxy classes are passed by value, reference or with a pointer. The implementation for this extra parameter generation requires the "jtype" typemap to contain long and the "jstype" typemap to contain the name of a proxy class.

    The additional parameter does impose a slight performance overhead and the parameter generation can be suppressed globally with the -nopgcpp commandline option. More selective suppression is possible with the 'nopgcpp' attribute in the "jtype" Java typemap. The attribute is a flag and so should be set to "1" to enable the suppression, or it can be omitted or set to "0" to disable. For example:

    %typemap(jtype, nopgcpp="1") Wibble & "long"
    

    Compatibility note: The generation of this additional parameter did not occur in versions prior to SWIG-1.3.30.

    26.4.3.5 Single threaded applications and thread safety

    Single threaded Java applications using JNI need to consider thread safety. The same applies for the C# module where the .NET wrappers use PInvoke. Consider the C++ class:

    class Test {
      string str;
    public:
      Test() : str("initial") {}
    };
    

    and the Java proxy class generated by SWIG:

    public class Test {
      private transient long swigCPtr;
      protected transient boolean swigCMemOwn;
    
      protected Test(long cPtr, boolean cMemoryOwn) {
        swigCMemOwn = cMemoryOwn;
        swigCPtr = cPtr;
      }
    
      protected static long getCPtr(Test obj) {
        return (obj == null) ? 0 : obj.swigCPtr;
      }
    
      protected void finalize() {
        delete();
      }
    
      // Call C++ destructor
      public synchronized void delete() {
        if(swigCPtr != 0 && swigCMemOwn) {
          swigCMemOwn = false;
          exampleJNI.delete_Test(swigCPtr);
        }
        swigCPtr = 0;
      }
    
      // Call C++ constructor
      public Test() {
        this(exampleJNI.new_Test(), true);
      }
    
    }
    

    It has two methods that call JNI methods, namely, exampleJNI.new_Test() for the C++ constructor and exampleJNI.delete_Test() for the C++ destructor. If the garbage collector collects an instance of this class, ie delete() is not explicitly called, then the C++ destructor will be run in a different thread to the main thread. This is because when an object is marked for garbage collection, any objects with finalizers are added to a finalization queue and the objects in the finalization queue have their finalize() methods run in a separate finalization thread. Therefore, if the C memory allocator is not thread safe, then the heap will get corrupted sooner or later, when a concurrent C++ delete and new are executed. It is thus essential, even in single threaded usage, to link to the C multi-thread runtime libraries, for example, use the /MD option for Visual C++ on Windows. Alternatively, lock all access to C++ functions that have heap allocation/deallocation.

    Note that some of the STL in Visual C++ 6 is not thread safe, so although code might be linked to the multithread runtime libraries, undefined behaviour might still occur in a single threaded Java program. Similarly some older versions of Sun Studio have bugs in the multi-threaded implementation of the std::string class and so will lead to undefined behaviour in these supposedly single threaded Java applications.

    The following innocuous Java usage of Test is an example that will crash very quickly on a multiprocessor machine if the JNI compiled code is linked against the single thread C runtime libraries.

    for (int i=0; i<100000; i++) {
      System.out.println("Iteration " + i);
      for (int k=0; k<10; k++) {
        Test test = new Test();
      }
      System.gc();
    }
    

    26.4.4 Type wrapper classes

    The generated type wrapper class, for say an int *, looks like this:

    public class SWIGTYPE_p_int {
      private transient long swigCPtr;
    
      protected SWIGTYPE_p_int(long cPtr, boolean bFutureUse) {
        swigCPtr = cPtr;
      }
    
      protected SWIGTYPE_p_int() {
        swigCPtr = 0;
      }
    
      protected static long getCPtr(SWIGTYPE_p_int obj) {
        return obj.swigCPtr;
      }
    }
    

    The methods do not have public access, so by default it is impossible to do anything with objects of this class other than pass them around. The methods in the class are part of the inner workings of SWIG. If you need to mess around with pointers you will have to use some typemaps specific to the Java module to achieve this. The section on Java typemaps details how to modify the generated code.

    Note that if you use a pointer or reference to a proxy class in a function then no type wrapper class is generated because the proxy class can be used as the function parameter. If however, you need anything more complicated like a pointer to a pointer to a proxy class then a typewrapper class is generated for your use.

    Note that SWIG generates a type wrapper class and not a proxy class when it has not parsed the definition of a type that gets used. For example, say SWIG has not parsed the definition of class Snazzy because it is in a header file that you may have forgotten to use the %include directive on. Should SWIG parse Snazzy * being used in a function parameter, it will then generates a type wrapper class around a Snazzy pointer. Also recall from earlier that SWIG will use a pointer when a class is passed by value or by reference:

    void spam(Snazzy *x, Snazzy &y, Snazzy z);
    

    Should SWIG not know anything about Snazzy then a SWIGTYPE_p_Snazzy must be used for all 3 parameters in the spam function. The Java function generated is:

    public static void spam(SWIGTYPE_p_Snazzy x, SWIGTYPE_p_Snazzy y, SWIGTYPE_p_Snazzy z) {
     ...
    }
    

    Note that typedefs are tracked by SWIG and the typedef name is used to construct the type wrapper class name. For example, consider the case where Snazzy is a typedef to an int which SWIG does parse:

    typedef int Snazzy;
    void spam(Snazzy *x, Snazzy &y, Snazzy z);
    

    Because the typedefs have been tracked the Java function generated is:

    public static void spam(SWIGTYPE_p_int x, SWIGTYPE_p_int y, int z) { ... }
    

    26.4.5 Enum classes

    SWIG can generate three types of enum classes. The Enumerations section discussed these but omitted all the details. The following sub-sections detail the various types of enum classes that can be generated.

    26.4.5.1 Typesafe enum classes

    The following example demonstrates the typesafe enum classes which SWIG generates:

    %include "enumtypesafe.swg"
    %javaconst(1);
    enum Beverage { ALE, LAGER=10, STOUT, PILSNER, PILZ=PILSNER };
    

    The following is the code that SWIG generates:

    public final class Beverage {
      public final static Beverage ALE = new Beverage("ALE");
      public final static Beverage LAGER = new Beverage("LAGER", 10);
      public final static Beverage STOUT = new Beverage("STOUT");
      public final static Beverage PILSNER = new Beverage("PILSNER");
      public final static Beverage PILZ = new Beverage("PILZ", PILSNER);
    
      public final int swigValue() {
        return swigValue;
      }
    
      public String toString() {
        return swigName;
      }
    
      public static Beverage swigToEnum(int swigValue) {
        if (swigValue < swigValues.length && swigValue >= 0 &&
            swigValues[swigValue].swigValue == swigValue)
          return swigValues[swigValue];
        for (int i = 0; i < swigValues.length; i++)
          if (swigValues[i].swigValue == swigValue)
            return swigValues[i];
        throw new IllegalArgumentException("No enum " + Beverage.class + " with value " +
                                                                             swigValue);
      }
    
      private Beverage(String swigName) {
        this.swigName = swigName;
        this.swigValue = swigNext++;
      }
    
      private Beverage(String swigName, int swigValue) {
        this.swigName = swigName;
        this.swigValue = swigValue;
        swigNext = swigValue+1;
      }
    
      private Beverage(String swigName, Beverage swigEnum) {
        this.swigName = swigName;
        this.swigValue = swigEnum.swigValue;
        swigNext = this.swigValue+1;
      }
    
      private static Beverage[] swigValues = { ALE, LAGER, STOUT, PILSNER, PILZ };
      private static int swigNext = 0;
      private final int swigValue;
      private final String swigName;
    }
    

    As can be seen, there are a fair number of support methods for the typesafe enum pattern. The typesafe enum pattern involves creating a fixed number of static instances of the enum class. The constructors are private to enforce this. Three constructors are available - two for C/C++ enums with an initializer and one for those without an initializer. Note that the two enums with initializers, LAGER and PILZ, each call one the two different initializer constructors. In order to use one of these typesafe enums, the swigToEnum static method must be called to return a reference to one of the static instances. The JNI layer returns the enum value from the C/C++ world as an integer and this method is used to find the appropriate Java enum static instance. The swigValue method is used for marshalling in the other direction. The toString method is overridden so that the enum name is available.

    26.4.5.2 Proper Java enum classes

    The following example demonstrates the Java enums approach:

    %include "enums.swg"
    %javaconst(1);
    enum Beverage { ALE, LAGER=10, STOUT, PILSNER, PILZ=PILSNER };
    

    SWIG will generate the following Java enum:

    public enum Beverage {
      ALE,
      LAGER(10),
      STOUT,
      PILSNER,
      PILZ(PILSNER);
    
      public final int swigValue() {
        return swigValue;
      }
    
      public static Beverage swigToEnum(int swigValue) {
        Beverage[] swigValues = Beverage.class.getEnumConstants();
        if (swigValue < swigValues.length && swigValue >= 0 &&
            swigValues[swigValue].swigValue == swigValue)
          return swigValues[swigValue];
        for (Beverage swigEnum : swigValues)
          if (swigEnum.swigValue == swigValue)
            return swigEnum;
        throw new IllegalArgumentException("No enum " + Beverage.class +
                                           " with value " + swigValue);
      }
    
      private Beverage() {
        this.swigValue = SwigNext.next++;
      }
    
      private Beverage(int swigValue) {
        this.swigValue = swigValue;
        SwigNext.next = swigValue+1;
      }
    
      private Beverage(Beverage swigEnum) {
        this.swigValue = swigEnum.swigValue;
        SwigNext.next = this.swigValue+1;
      }
    
      private final int swigValue;
    
      private static class SwigNext {
        private static int next = 0;
      }
    }
    

    The enum items appear first. Like the typesafe enum pattern, the constructors are private. The constructors are required to handle C/C++ enums with initializers. The next variable is in the SwigNext inner class rather than in the enum class as static primitive variables cannot be modified from within enum constructors. Marshalling between Java enums and the C/C++ enum integer value is handled via the swigToEnum and swigValue methods. All the constructors and methods in the Java enum are required just to handle C/C++ enums with initializers. These needn't be generated if the enum being wrapped does not have any initializers and the Simpler Java enums for enums without initializers section describes how typemaps can be used to achieve this.

    26.4.5.3 Type unsafe enum classes

    The following example demonstrates type unsafe enums:

    %include "enumtypeunsafe.swg"
    %javaconst(1);
    enum Beverage { ALE, LAGER=10, STOUT, PILSNER, PILZ=PILSNER };
    

    SWIG will generate the following simple class:

    public final class Beverage {
      public final static int ALE = 0;
      public final static int LAGER = 10;
      public final static int STOUT = LAGER + 1;
      public final static int PILSNER = STOUT + 1;
      public final static int PILZ = PILSNER;
    }
    

    26.4.6 Interfaces

    By default SWIG wraps all C++ classes as Java classes. As Java only supports derivation from a single base class, SWIG has to ignore all bases except the first when a C++ class inherits from more than one base class. However, there is a family of SWIG macros that change the default wrapping and allows a C++ class to be wrapped as a Java interface instead of a Java class. These macros provide a way to support some sort of multiple inheritance as there is no limit to the number of interfaces that a Java class can inherit from.

    When a C++ class is wrapped as a Java interface, a Java proxy class is still needed. The swiginterface.i library file provides three macros for marking a C++ class to be wrapped as a Java interface. There is more than one macro in order to provide a choice for choosing the Java interface and Java proxy names.

    Interface Macro NameDescription
    %interface(CTYPE)For C++ class CTYPE, proxy class name is unchanged without any suffix added, interface name has SwigInterface added as a suffix.
    %interface_impl(CTYPE)For C++ class CTYPE , proxy class name has SwigImpl added as a suffix, interface name has no added suffix.
    %interface_custom("PROXY", "INTERFACE", CTYPE) For C++ class CTYPE, proxy class name is given by the string PROXY, interface name is given by the string INTERFACE. The PROXY and INTERFACE names can use the string formatting functions used in %rename.

    The table below has a few examples showing the resulting proxy and interface names for a C++ class called Base.

    Example UsageProxy Class Name Interface Class Name
    %interface(Base)Base BaseSwigInterface
    %interface_impl(Base)BaseSwigImpl Base
    %interface_custom("BaseProxy", "IBase", Base) BaseProxyIBase
    %interface_custom("%sProxy", "IBase", Base) BaseProxyIBase
    %interface_custom("%sProxy", "%sInterface", Base) BaseProxyBaseProxyInterface
    %interface_custom("%sProxy", "%(rstrip:[Proxy])sInterface", Base)BaseProxyBaseInterface

    The 2nd last example shows the names used in the string formatting functions. The input for PROXY that "%s" expands to is the proxy name, that is, Base. The input for INTERFACE that "%s" expands to is the proxy name, that is, BaseProxy .

    The last example shows rstrip and in this case strips the Proxy suffix and then adds on Interface.

    Consider the following C++ code:

    namespace Space {
      struct Base1 {
        virtual void Method1();
      };
      struct Base2 {
        virtual void Method2();
      };
      struct Derived : Base1, Base2 {
      };
      void UseBases(const Base1 &b1, const Base2 &b2);
    }
    

    By default all classes are wrapped and are available in Java, but, Derived has all bases ignored except the first. SWIG generates a warning for the above code:

    example.i:10: Warning 813: Warning for Derived, base Base2 ignored. 
    Multiple inheritance is not supported in Java.
    

    If we decide to wrap the two base classes as interfaces and add the following before SWIG parses the above example code:

    %include <swiginterface.i>
    %interface_impl(Space::Base1);
    %interface_impl(Space::Base2);
    

    then two interface files are generated, Base1.java and Base2.java in addition to proxy class files, Base1SwigImpl.java and Base2SwigImpl.java. The contents of interface file Base1.java for Base1 is shown below:

    public interface Base1 {
      long Base1_GetInterfaceCPtr();
      void Method1();
    }
    

    The proxy class in Base1SwigImpl.java for Base1 is as it would have been if %interface was not used, except the name has changed to Base1SwigImpl and it implements the appropriate base:

    public class Base1SwigImpl implements Base1 {
    ...
      public long Base1_GetInterfaceCPtr() {
        return exampleJNI.Base1SwigImpl_Base1_GetInterfaceCPtr(swigCPtr);
      }
    
      public void Method1() {
        exampleJNI.Base1SwigImpl_Method1(swigCPtr, this);
      }
    ...
    }
    

    In fact any class deriving from Base will now implement the interface instead of deriving from it (or ignoring the base in the case of multiple base classes). Hence the Derived proxy class will now implement both bases:

    public class Derived implements Base1, Base2 {
    ...
      public long Base1_GetInterfaceCPtr() {
        return exampleJNI.Derived_Base1_GetInterfaceCPtr(swigCPtr);
      }
    
      public long Base2_GetInterfaceCPtr() {
        return exampleJNI.Derived_Base2_GetInterfaceCPtr(swigCPtr);
      }
    
      public void Method1() {
        exampleJNI.Derived_Method1(swigCPtr, this);
      }
    
      public void Method2() {
        exampleJNI.Derived_Method2(swigCPtr, this);
      }
    ...
    }
    

    Wherever a class marked as an interface is used, such as the UseBases method in the example, the interface name is used as the type in the Java layer:

      public static void UseBases(Base1 b1, Base2 b2) {
        exampleJNI.UseBases(b1.Base1_GetInterfaceCPtr(), b1, b2.Base2_GetInterfaceCPtr(), b2);
      }
    

    Note that each Java interface has a method added to obtain the correct C++ pointer for passing to the native function - Base1_GetInterfaceCPtr for Base1. This method is similar to the getCPtr method in the proxy classes. In fact, as shown above in the Derived class, the proxy classes implement this generated interface by calling a native method ( Derived_Base1_GetInterfaceCPtr) which calls an appropriate C++ cast of the pointer up the inheritance chain.

    The interface macros are implemented using the interface feature and typemaps. For example:

    %define %interface(CTYPE...)
    %feature("interface", name="%sSwigInterface") CTYPE;
    INTERFACE_TYPEMAPS(CTYPE)
    %enddef
    

    The feature accepts one attribute called name, which is the name of the Java interface mentioned earlier. The INTERFACE_TYPEMAPS macro implements the typemaps and can be viewed in the swiginterface.i file and contain the usual Java typemaps for generating code plus the javainterfacecode typemap which is only used when a class is marked with the interface feature. See Java code typemaps for details.

    26.5 Cross language polymorphism using directors

    Proxy classes provide a natural, object-oriented way to wrap C++ classes. as described earlier, each proxy instance has an associated C++ instance, and method calls from Java to the proxy are passed to the C++ instance transparently via C wrapper functions.

    This arrangement is asymmetric in the sense that no corresponding mechanism exists to pass method calls down the inheritance chain from C++ to Java. In particular, if a C++ class has been extended in Java (by deriving from the proxy class), these classes will not be visible from C++ code. Virtual method calls from C++ are thus not able to access the lowest implementation in the inheritance chain.

    SWIG can address this problem and make the relationship between C++ classes and proxy classes more symmetric. To achieve this goal, new classes called directors are introduced at the bottom of the C++ inheritance chain. The job of the directors is to route method calls correctly, either to C++ implementations higher in the inheritance chain or to Java implementations lower in the inheritance chain. The upshot is that C++ classes can be extended in Java and from C++ these extensions look exactly like native C++ classes. Neither C++ code nor Java code needs to know where a particular method is implemented: the combination of proxy classes, director classes, and C wrapper functions transparently takes care of all the cross-language method routing.

    26.5.1 Enabling directors

    The director feature is disabled by default. To use directors you must make two changes to the interface file. First, add the "directors" option to the %module directive, like this:

    %module(directors="1") modulename
    

    Without this option no director code will be generated. Second, you must use the %feature("director") directive to tell SWIG which classes and methods should get directors. The %feature directive can be applied globally, to specific classes, and to specific methods, like this:

    // generate directors for all classes that have virtual methods
    %feature("director");         
    
    // generate directors for the virtual methods in class Foo
    %feature("director") Foo;      
    

    You can use the %feature("nodirector") directive to turn off directors for specific classes or methods. So for example,

    %feature("director") Foo;
    %feature("nodirector") Foo::bar;
    

    will generate directors for the virtual methods of class Foo except bar().

    Directors can also be generated implicitly through inheritance. In the following, class Bar will get a director class that handles the methods one() and two() (but not three()):

    %feature("director") Foo;
    class Foo {
    public:
      virtual void one();
      virtual void two();
    };
    
    class Bar: public Foo {
    public:
      virtual void three();
    };
    

    26.5.2 Director classes

    For each class that has directors enabled, SWIG generates a new class that derives from both the class in question and a special Swig::Director class. These new classes, referred to as director classes, can be loosely thought of as the C++ equivalent of the Java proxy classes. The director classes store a pointer to their underlying Java proxy classes.

    For simplicity let's ignore the Swig::Director class and refer to the original C++ class as the director's base class. By default, a director class extends all virtual methods in the inheritance chain of its base class (see the preceding section for how to modify this behavior). Virtual methods that have a final specifier are unsurprisingly excluded. Thus the virtual method calls, whether they originate in C++ or in Java via proxy classes, eventually end up in at the implementation in the director class. The job of the director methods is to route these method calls to the appropriate place in the inheritance chain. By "appropriate place" we mean the method that would have been called if the C++ base class and its Java derived classes were seamlessly integrated. That seamless integration is exactly what the director classes provide, transparently skipping over all the messy JNI glue code that binds the two languages together.

    In reality, the "appropriate place" is one of only two possibilities: C++ or Java. Once this decision is made, the rest is fairly easy. If the correct implementation is in C++, then the lowest implementation of the method in the C++ inheritance chain is called explicitly. If the correct implementation is in Java, the Java API is used to call the method of the underlying Java object (after which the usual virtual method resolution in Java automatically finds the right implementation).

    26.5.3 Overhead and code bloat

    Enabling directors for a class will generate a new director method for every virtual method in the class' inheritance chain. This alone can generate a lot of code bloat for large hierarchies. Method arguments that require complex conversions to and from Java types can result in large director methods. For this reason it is recommended that directors are selectively enabled only for specific classes that are likely to be extended in Java and used in C++.

    Although directors make it natural to mix native C++ objects with Java objects (as director objects), one should be aware of the obvious fact that method calls to Java objects from C++ will be much slower than calls to C++ objects. Additionally, compared to classes that do not use directors, the call routing in the director methods adds a small overhead. This situation can be optimized by selectively enabling director methods (using the %feature directive) for only those methods that are likely to be extended in Java.

    26.5.4 Simple directors example

    Consider the following SWIG interface file:

    %module(directors="1") example;
    
    %feature("director") DirectorBase;
    
    class DirectorBase {
    public:
      virtual ~DirectorBase() {}
      virtual void upcall_method() {}
    };
    
    void callup(DirectorBase *director) {
      director->upcall_method();
    }
    

    The following DirectorDerived Java class is derived from the Java proxy class DirectorBase and overrides upcall_method(). When C++ code invokes upcall_method() , the SWIG-generated C++ code redirects the call via JNI to the Java DirectorDerived subclass. Naturally, the SWIG generated C++ code and the generated Java intermediary class marshal and convert arguments between C++ and Java when needed.

    class DirectorDerived extends DirectorBase {
      @Override
      public void upcall_method() {
        System.out.println("DirectorDerived.upcall_method() invoked.");
      }
    }
    

    Running the following Java code

    DirectorDerived director = new DirectorDerived();
    example.callup(director);
    

    will result in the following being output:

    DirectorDerived.upcall_method() invoked.
    

    26.5.5 Director threading issues

    Depending on your operating system and version of Java and how you are using threads, you might find the JVM hangs on exit. There are a couple of solutions to try out. The preferred solution requires jdk-1.4 and later and uses AttachCurrentThreadAsDaemon instead of AttachCurrentThread whenever a call into the JVM is required. This can be enabled by defining the SWIG_JAVA_ATTACH_CURRENT_THREAD_AS_DAEMON macro when compiling the C++ wrapper code. For older JVMs define SWIG_JAVA_NO_DETACH_CURRENT_THREAD instead, to avoid the DetachCurrentThread call but this will result in a memory leak instead. For further details inspect the source code in the java/director.swg library file.

    Macros can be defined on the commandline when compiling your C++ code, or alternatively added to the C++ wrapper file as shown below:

    %insert("runtime") %{
    #define SWIG_JAVA_NO_DETACH_CURRENT_THREAD
    %}
    

    26.5.6 Director performance tuning

    When a new instance of a director (or subclass) is created in Java, the C++ side of the director performs a runtime check per director method to determine if that particular method is overridden in Java or if it should invoke the C++ base implementation directly. Although this makes initialization slightly more expensive, it is generally a good overall tradeoff.

    However, if all director methods are expected to usually be overridden by Java subclasses, then initialization can be made faster by avoiding these checks via the assumeoverride attribute. For example:

    %feature("director", assumeoverride=1) Foo;
    

    The disadvantage is that invocation of director methods from C++ when Java doesn't actually override the method will require an additional call up into Java and back to C++. As such, this option is only useful when overrides are extremely common and instantiation is frequent enough that its performance is critical.

    26.5.7 Java exceptions from directors

    With directors routing method calls to Java, and proxies routing them to C++, the handling of exceptions is an important concern. The default behavior for Java exceptions thrown in a director method overridden in Java is to store the thrown Java exception into a SWIG defined Swig::DirectorException C++ class exception in the C++ layer and then throw this C++ exception.

    Of course, should this exception be thrown, your C++ code must catch it and handle it before returning back to Java. The default generated code does not attempt to handle the C++ exception, but there is a simple way to make this all work by catching the C++ exception and extracting the original Java exception by using %catches for Swig::DirectorException. Consider the example shown earlier with a modification to the upcall_method Java method to throw a Java exception:

    class DirectorDerived extends DirectorBase {
      @Override
      public void upcall_method() {
        System.out.println("DirectorDerived.upcall_method() invoked.");
        throw new RuntimeException("There was a problem!");
      }
    }
    

    Now, by default, the JVM will abort when example.callup(director) is called as the C++ Swig::DirectorException (storing the Java exception) is thrown and not handled by the callup method. Needless to say this is not very user friendly and so the recommendation is to add the following simple %catches directive before SWIG parses the callup function:

    %catches(Swig::DirectorException) callup;
    

    Or target all wrapped methods using:

    %catches(Swig::DirectorException);
    

    This tells SWIG to generate a C++ catch handler using some code from the throws typemap for Swig::DirectorException that SWIG supplies by default, see Exception handling with %catches. This typemap code is written to simply catch the C++ Swig::DirectorException class and immediately return to Java throwing the original Java exception that it has stored. The net result is a stack trace containing the original Java exception including the location that the exception was thrown from.

    DirectorDerived.upcall_method() invoked.
    Exception in thread "main" java.lang.RuntimeException: There was a problem!
        at DirectorDerived.upcall_method(runme.java:4)
        at exampleJNI.SwigDirector_DirectorBase_upcall_method(exampleJNI.java:20)
        at exampleJNI.callup(Native Method)
        at example.callup(example.java:12)
        at runme.main(runme.java:21)
    

    More on the Swig::DirectorException class can be found in the next section which details how to customize the handling of director exceptions.

    26.5.7.1 Customizing director exceptions

    This section is for advanced customization of director exceptions. The recommendation for most users is to use the simple %catches directive described above as it should be sufficient for most users needs.

    The conversion of Java exceptions into C++ exceptions can be customized in two different ways using the director:except feature. In the first approach, a code block is attached to each director method to handle the mapping of Java exceptions into C++ exceptions. The code block is generated just after the call up from the C++ director method into the overloaded method in Java. Its primary function is to check if a Java exception has been thrown and then handle it in C++. The example below converts a java.lang.IndexOutOfBoundsException into a C++ std::out_of_range exception and converts a user's Java MyJavaException into a C++ MyCppException exception. If the Java exception doesn't match either of these, a fallback std::runtime_error C++ exception is thrown.

    %feature("director:except") MyClass::dirmethod(int x) {
      jthrowable $error = jenv->ExceptionOccurred();
      if ($error) {
        if (Swig::ExceptionMatches(jenv, $error, "java/lang/IndexOutOfBoundsException"))
          throw std::out_of_range(Swig::JavaExceptionMessage(jenv, $error).message());
        if (Swig::ExceptionMatches(jenv, $error, "$packagepath/MyJavaException"))
          throw MyCppException(Swig::JavaExceptionMessage(jenv, $error).message());
        throw std::runtime_error("Unexpected exception thrown in MyClass::dirmethod");
      }
    }
    
    class MyClass {
    public:
      /** Throws either a std::out_of_range or MyCppException on error */
      virtual void dirmethod(int x);
      virtual ~MyClass();
    };
    

    A few special variables are expanded within the director:except feature.

    • The special variable $error is expanded into a unique variable name (swigerror) and should be used for the assignment of the jthrowable exception that occurred.
    • The special variable $packagepath is replaced by the outer package provided for SWIG generation by the -package option.
    • The special variable $directorthrowshandlers is not shown above, but is replaced by applicable "directorthrows" typemap contents (covered later in this section).
    • The special variable $null is not shown above, but is replaced by a suitable default constructed object for returning from the director method (or nothing if the director method has a void return).

    Utility functions/classes in director.swg are provided to aid the exception conversion as follows:

    namespace Swig {
    
      // Helper method to determine if a Java throwable matches a particular Java class type
      // Note side effect of clearing any pending exceptions
      bool ExceptionMatches(JNIEnv *jenv, jthrowable throwable, const char *classname);
    
      // Helper class to extract the exception message from a Java throwable
      class JavaExceptionMessage {
      public:
        JavaExceptionMessage(JNIEnv *jenv, jthrowable throwable);
    
        // Return a C string of the exception message in the jthrowable passed in the constructor
        // If no message is available, null_string is return instead
        const char *message(const char *null_string = 
                            "Could not get exception message in JavaExceptionMessage") const;
      };
    
      // C++ Exception class for handling Java exceptions thrown during a director method Java upcall
      class DirectorException : public std::exception {
      public:
    
        // Construct exception from a Java throwable
        DirectorException(JNIEnv *jenv, jthrowable throwable);
    
        // More general constructor for handling as a java.lang.RuntimeException
        DirectorException(const char *msg);
    
        // Return exception message extracted from the Java throwable
        const char *what() const throw();
    
        // Reconstruct and raise/throw the Java Exception that caused the DirectorException
        // Note that any error in the JNI exception handling results in a Java RuntimeException
        void throwException(JNIEnv *jenv) const;
    
        // Create and throw the DirectorException
        static void raise(JNIEnv *jenv, jthrowable throwable) {
          throw DirectorException(jenv, throwable);
        }
      };
    
    }
    

    The utility function Swig::ExceptionMatches and class Swig::JavaExceptionMessage are provided to simplify writing code for wrappers that use the director:except feature. The function Swig::ExceptionMatches matches the type of the jthrowable thrown against a fully qualified JNI style class name, such as "java/lang/IOError". If the throwable class is the same type, or derives from the given type, Swig::ExceptionMatches will return true. Care must be taken to provide the correct fully qualified name, since for wrapped exceptions the generated proxy class will have an additional package qualification, depending on the '-package' argument and use of the nspace feature. The utility class Swig::JavaExceptionMessage is a holder providing access to the message from the thrown Java exception. The message() method returns the exception message as a const char *, which is only valid during the lifetime of the holder. Any code using this message needs to copy it, for example into a std::string or a newly constructed C++ exception.

    Using the first approach above to write handlers for a large number of methods will require repetitive duplication of the director:except feature code for each director method. To mitigate this, a second approach is provided via typemaps in a fashion analogous to the "throws" typemap. The "throws" typemap provides a way to map all the C++ exceptions listed in a method's defined exceptions (either from a C++ exception specification or a %catches feature) into Java exceptions. The "directorthrows" typemap provides the inverse mapping and should contain code to convert a suitably matching Java exception into a C++ exception. Only use this typemap if you wish to write custom conversions of Java exceptions into C++ exceptions and apply them to many different methods. The default handling which uses the Swig::DirectorException class should otherwise meet your needs.

    The example below converts a Java java.lang.IndexOutOfBoundsException exception to the typemap's type, that is a std::out_of_range C++ exception:

    %typemap(directorthrows) std::out_of_range %{
      if (Swig::ExceptionMatches(jenv, $error, "java/lang/IndexOutOfBoundsException")) {
        throw std::out_of_range(Swig::JavaExceptionMessage(jenv, $error).message());
      }
    %}
    

    The "directorthrows" typemap is then used in conjunction with the director:except feature if the $directorthrowshandlers special variable is used in the code block. Consider the following, which also happens to be the default:

    %feature("director:except") %{
      jthrowable $error = jenv->ExceptionOccurred();
      if ($error) {
        $directorthrowshandlers
        Swig::DirectorException::raise(jenv, $error);
      }
    %}
    

    where Swig::DirectorException::raise is the helper method to throw a C++ Swig::DirectorException, see above. The code generated from the director:except feature has the $directorthrowshandlers special variable replaced with the code in the relevant "directorthrows" typemaps, for each and every exception defined for the method. The relevant exceptions can be defined either with a C++ exception specification or %catches as described for the "throws" typemap.

    Let's try and put all this together by considering the following director method:

    struct X {
      virtual void doSomething(int index) throw (std::out_of_range);
      ...
    };
    
    OR
    
    %catches(std::out_of_range) X::doSomething;
    struct X {
      virtual void doSomething(int index);
      ...
    };
    

    When combined with the default director:except feature and the "directorthrows" typemap above, the resulting code generated in the director method after calling up to Java will be:

    jthrowable swigerror = jenv->ExceptionOccurred();
    if (swigerror) {
      if (Swig::ExceptionMatches(jenv, swigerror, "java/lang/IndexOutOfBoundsException")) {
        throw std::out_of_range(Swig::JavaExceptionMessage(jenv, swigerror).message());
      }
      Swig::DirectorException::raise(jenv, swigerror);
    }
    

    Note: Beware of using exception specifications as the SWIG director methods will be generated with the same exception specifications and if the director method throws an exception that is not specified in the exception specifications list it is likely to terminate your program. See the C++ standard for more details. Using the %catches feature instead to define the handled exceptions does not suffer this potential fate.

    Because the default code generation maps any unhandled Java exceptions to Swig::DirectorException, any director methods that have exception specifications may cause program termination as this exception class won't be in the exception specifications list. You can avoid throwing Swig::DirectorException by changing the default handling for all methods by adding a director:except feature without any method name. For example, you can just ignore them:

    %feature("director:except") %{
      jthrowable $error = jenv->ExceptionOccurred();
      if ($error) {
        $directorthrowshandlers
        jenv->ExceptionClear();
        return $null; // exception is ignored
      }
    %}
    

    Alternatively an exception compatible with the existing director method exception specifications can be thrown. Assuming that all methods allow std::runtime_error to be thrown, the return $null line above could be changed to:

      throw std::runtime_error(Swig::JavaExceptionMessage(jenv, $error).message());
    

    In more complex situations, a separate director:except feature may need to be attached to specific methods by providing a method name to the director:except feature.

    This is all no doubt quite hard to follow without seeing a full example and some code. Below is a complete example demonstrating the use of most of the exception customizations one can use, that is, "directorthrows" and "throws" typemaps, %exception and %catches. See the Exception handling with %exception and %javaexception section for more on converting C++ exceptions to Java exceptions. The example also has a user defined C++ exception class called MyNS::MyException and this is wrapped as a Java exception. The director class being wrapped is MyClass and the director method is called MyClass::dirmethod. A number of std::cout calls have been added to help understand code flow. You can copy the code below into an interface file and run SWIG on it and examine the generated code.

    %module(directors="1") example
    
    %{
      #include <stdexcept>
      #include <iostream>
    %}
    
    // Generic catch handler for all wrapped methods
    %exception %{
      try {
        $action
      } catch (const std::exception &e) {
        std::cout << "Generic std::exception catch handler" << std::endl;
        jclass clazz = jenv->FindClass("java/lang/RuntimeException");
        jenv->ThrowNew(clazz, e.what()); 
        return $null;
      }
    %}
    
    // Expose C++ exception as a Java Exception by changing the Java base class and providing a getMessage()
    %typemap(javabase) MyNS::MyException "java.lang.RuntimeException";
    %rename(getMessage) MyNS::MyException::whatsup;
    
    %inline %{
    namespace MyNS {
      class MyException {
        std::string msg;
      public:
        MyException(const char *msg) : msg(msg) {}
        const char * whatsup() const { return msg.c_str(); }
      };
    }
    %}
    
    %typemap(directorthrows) MyNS::MyException %{
      if (Swig::ExceptionMatches(jenv, $error, "$packagepath/MyException")) {
        std::cout << "$1_type exception matched (directorthrows typemap)" << std::endl;
        throw $1_type(Swig::JavaExceptionMessage(jenv, $error).message());
      }
    %}
    
    %typemap(throws) MyNS::MyException %{
      std::cout << "$1_type caught (throws typemap)" << std::endl;
      jclass excep = jenv->FindClass("MyException");
      if (excep) {
        std::cout << "$1_type class found (throws typemap)" << std::endl;
        jenv->ThrowNew(excep, $1.whatsup());
      }
      return $null;
    %}
    
    // These are the exceptions that the director method MyClass::dirmethod will have catch handlers for.
    // Note that this is also a virtual method / director method and the C++ exceptions listed can be
    // thrown after converting them from Java exceptions.
    %catches(MyNS::MyException, Swig::DirectorException) MyClass::dirmethod;
    
    // These are the exceptions that call_dirmethod C++ wrapper will have catch handlers for.
    // Note that this is not a virtual method, hence not a director method.
    %catches(MyNS::MyException, Swig::DirectorException) call_dirmethod;
    
    %feature("director") MyClass;
    
    %feature("director:except") MyClass::dirmethod(int x) {
      jthrowable $error = jenv->ExceptionOccurred();
      if ($error) {
        std::cout << "Upcall finished, an exception was thrown in Java" << std::endl;
        $directorthrowshandlers
        std::cout << "Upcall finished, no exception conversion, throwing DirectorException" << std::endl;
        Swig::DirectorException::raise(jenv, $error);
      }
    }
    
    %inline %{
    class MyClass {
    public:
      /** Throws either a std::out_of_range or MyException on error */
      virtual void dirmethod(int x) {
        if (x <= 0)
          throw std::out_of_range("MyClass::dirmethod index is out of range");
        else if (x == 1)
          throw MyNS::MyException("MyClass::dirmethod some problem!");
      }
      virtual ~MyClass() {}
      static void call_dirmethod(MyClass& c, int x) {
        return c.dirmethod(x);
      }
    };
    %}
    

    The generated code for the call_dirmethod wrapper contains the various exception handlers. The outer exception handler is from the %exception directive and the others are from the "throws" typemaps.

    SWIGEXPORT void JNICALL Java_exampleJNI_MyClass_1call_1dirmethod(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jint jarg2) {
      ...
      try {
        try {
          MyClass::call_dirmethod(*arg1,arg2);
        } catch(MyNS::MyException &_e) {
          std::cout << "MyNS::MyException caught (throws typemap)" << std::endl;
          jclass excep = jenv->FindClass("MyException");
          if (excep) {
            std::cout << "MyNS::MyException class found (throws typemap)" << std::endl;
            jenv->ThrowNew(excep, (&_e)->whatsup());
          }
          return ;
          
        } catch(Swig::DirectorException &_e) {
          (&_e)->throwException(jenv);
          return ; 
        }
      } catch (const std::exception &e) {
        std::cout << "Generic std::exception catch handler" << std::endl;
        jclass clazz = jenv->FindClass("java/lang/RuntimeException");
        jenv->ThrowNew(clazz, e.what()); 
        return ;
      }
    

    The director method calling up to Java contains the exception handling code from the "directorthrows" typemaps and director:except feature.

    void SwigDirector_MyClass::dirmethod(int x) {
          ... [call up to Java using CallStaticVoidMethod]
          jthrowable swigerror = jenv->ExceptionOccurred();
          if (swigerror) {
            std::cout << "Upcall finished, an exception was thrown in Java" << std::endl;
            
            if (Swig::ExceptionMatches(jenv, swigerror, "MyException")) {
              std::cout << "MyNS::MyException exception matched (directorthrows typemap)" << std::endl;
              throw MyNS::MyException(Swig::JavaExceptionMessage(jenv, swigerror).message());
            }
            
            std::cout << "Upcall finished, no exception conversion, throwing DirectorException" << std::endl;
            Swig::DirectorException::raise(jenv, swigerror);
          }
    

    Let's use the following Java class to override the director method.

    class DerivedClass extends MyClass {
      @Override
      public void dirmethod(int x) {
        if (x < 0)
          throw new IndexOutOfBoundsException("Index is negative");
        else if (x == 0)
          throw new MyException("MyException: bad dirmethod");
      }
    }
    public class runme {
      public static void main(String argv[]) {
        System.loadLibrary("example");
        ... code snippets shown below ...
      }
    }
    

    Consider the output using the Java code in the four slightly different scenarios below.

    1. Non-director C++ class is used, thus, no upcall to a Java director method is made. A std::out_of_range exception is thrown, which is derived from std::exception, and hence caught by the generic exception handler in the call_dirmethod wrapper. The Java code snippet and resulting output is:

    MyClass.call_dirmethod(new MyClass(), 0);
    
    Generic std::exception catch handler
    Exception in thread "main" java.lang.RuntimeException: MyClass::dirmethod index is out of range
            at exampleJNI.MyClass_call_dirmethod(Native Method)
            at MyClass.call_dirmethod(MyClass.java:57)
            at runme.main(runme.java:14)
    

    2. Non-director C++ class again but this time the MyNS::MyException class is thrown and caught:

    MyClass.call_dirmethod(new MyClass(), 1);
    
    MyNS::MyException caught (throws typemap)
    MyNS::MyException class found (throws typemap)
    Exception in thread "main" MyException: MyClass::dirmethod some problem!
            at exampleJNI.MyClass_call_dirmethod(Native Method)
            at MyClass.call_dirmethod(MyClass.java:57)
            at runme.main(runme.java:15)
    

    3. The DerivedClass director class is used so the upcall to Java occurs, but it throws a Java MyException, which gets converted into a C++ MyNS::MyException, then caught and converted back into a Java MyException:

    MyClass.call_dirmethod(new DerivedClass(), 0);
    
    Upcall finished, an exception was thrown in Java
    MyNS::MyException exception matched (directorthrows typemap)
    MyNS::MyException caught (throws typemap)
    MyNS::MyException class found (throws typemap)
    Exception in thread "main" MyException: MyException: bad dirmethod
            at exampleJNI.MyClass_call_dirmethod(Native Method)
            at MyClass.call_dirmethod(MyClass.java:57)
            at runme.main(runme.java:16)
    

    4. The director class is used again, but this time the director method throws a Java IndexOutOfBoundsException exception which is converted into a C++ Swig::DirectorException, thrown and caught again. This time the original Java exception is extracted from the Swig::DirectorException and rethrown. Note that this approach keeps the stack trace information of the original exception, so it has the exact location of where the IndexOutOfBoundsException exception was thrown. This is arguably an improvement over the approach above that converts from a Java excepton to C++ exception and then back to a new Java exception, losing the location of the original exception.

    MyClass.call_dirmethod(new DerivedClass(), -1);
    
    Upcall finished, an exception was thrown in Java
    Upcall finished, no exception conversion, throwing DirectorException
    Exception in thread "main" java.lang.IndexOutOfBoundsException: Index is negative
            at DerivedClass.dirmethod(runme.java:5)
            at exampleJNI.SwigDirector_MyClass_dirmethod(exampleJNI.java:23)
            at exampleJNI.MyClass_call_dirmethod(Native Method)
            at MyClass.call_dirmethod(MyClass.java:57)
            at runme.main(runme.java:17)
    

    26.6 Accessing protected members

    When using directors, the protected virtual methods are also wrapped. These methods are wrapped with a protected Java proxy method, so the only way that Java code can access these is from within a Java class derived from the director class.

    Members which are protected and non-virtual can also be accessed when using the 'allprotected' mode. The allprotected mode requires directors and is turned on by setting the allprotected option in addition to the directors option in the %module directive, like this:

    %module(directors="1", allprotected="1") modulename
    

    Protected member variables and methods (both static and non-static) will then be wrapped with protected access in the Java proxy class.

    Note: Neither the directors option nor the allprotected mode support types defined with protected scope. This includes any enums or typedefs declared in the protected section of the C++ class.

    The following simple example is a class with numerous protected members, including the constructor and destructor:

    %module(directors="1", allprotected="1") example
    
    %feature("director") ProtectedBase;
    
    // Ignore use of unsupported types (those defined in the protected section)
    %ignore ProtectedBase::typedefs;
    
    %inline %{
    
    class ProtectedBase {
    protected:
      ProtectedBase() {}
      virtual ~ProtectedBase() {}
      virtual void virtualMethod() const {}
      void nonStaticMethod(double d) const {}
      static void staticMethod(int i) {}
      int instanceMemberVariable;
      static int staticMemberVariable;
    
      // unsupported: types defined with protected access and the methods/variables which use them
      typedef int IntegerType;
      IntegerType typedefs(IntegerType it) { return it; }
    };
    int ProtectedBase::staticMemberVariable = 10;
    
    %}
    
    

    Note that the IntegerType has protected scope and the members which use this type must be ignored as they cannot be wrapped.

    The proxy methods are protected, so the only way the protected members can be accessed is within a class that derives from the director class, such as the following:

    class MyProtectedBase extends ProtectedBase
    {
      public MyProtectedBase() {
      }
    
      public void accessProtected() {
        virtualMethod();
        nonStaticMethod(1.2);
        staticMethod(99);
    
        setInstanceMemberVariable(5);
        int i = getInstanceMemberVariable();
    
        setStaticMemberVariable(10);
        i = getStaticMemberVariable();
      }
    }
    

    26.7 Common customization features

    An earlier section presented the absolute basics of C/C++ wrapping. If you do nothing but feed SWIG a header file, you will get an interface that mimics the behavior described. However, sometimes this isn't enough to produce a nice module. Certain types of functionality might be missing or the interface to certain functions might be awkward. This section describes some common SWIG features that are used to improve the interface to existing C/C++ code.

    26.7.1 C/C++ helper functions

    Sometimes when you create a module, it is missing certain bits of functionality. For example, if you had a function like this

    typedef struct Image {...};
    void set_transform(Image *im, double m[4][4]);
    

    it would be accessible from Java, but there may be no easy way to call it. The problem here is that a type wrapper class is generated for the two dimensional array parameter so there is no easy way to construct and manipulate a suitable double [4][4] value. To fix this, you can write some extra C helper functions. Just use the %inline directive. For example:

    %inline %{
    /* Note: double[4][4] is equivalent to a pointer to an array double (*)[4] */
    double (*new_mat44())[4] {
      return (double (*)[4]) malloc(16*sizeof(double));
    }
    void free_mat44(double (*x)[4]) {
      free(x);
    }
    void mat44_set(double x[4][4], int i, int j, double v) {
      x[i][j] = v;
    }
    double mat44_get(double x[4][4], int i, int j) {
      return x[i][j];
    }
    %}
    

    From Java, you could then write code like this:

    Image im = new Image();
    SWIGTYPE_p_a_4__double a = example.new_mat44();
    example.mat44_set(a, 0, 0, 1.0);
    example.mat44_set(a, 1, 1, 1.0);
    example.mat44_set(a, 2, 2, 1.0);
    ...
    example.set_transform(im, a);
    example.free_mat44(a);
    

    Admittedly, this is not the most elegant looking approach. However, it works and it wasn't too hard to implement. It is possible to improve on this using Java code, typemaps, and other customization features as covered in later sections, but sometimes helper functions are a quick and easy solution to difficult cases.

    26.7.2 Class extension with %extend

    One of the more interesting features of SWIG is that it can extend structures and classes with new methods or constructors. Here is a simple example:

    %module example
    %{
    #include "someheader.h"
    %}
    
    struct Vector {
      double x, y, z;
    };
    
    %extend Vector {
      char *toString() {
        static char tmp[1024];
        sprintf(tmp, "Vector(%g, %g, %g)", $self->x, $self->y, $self->z);
        return tmp;
      }
      Vector(double x, double y, double z) {
        Vector *v = (Vector *) malloc(sizeof(Vector));
        v->x = x;
        v->y = y;
        v->z = z;
        return v;
      }
    };
    

    Now, in Java

    Vector v = new Vector(2, 3, 4);
    System.out.println(v);
    

    will display

    Vector(2, 3, 4)
    

    %extend works with both C and C++ code. It does not modify the underlying object in any way---the extensions only show up in the Java interface.

    26.7.3 Class extension with %proxycode

    The previous section described how to extend a wrapped class with C or C++ code. This section describes how to extend a wrapped class with Java code instead of C/C++ code. The %proxycode directive is used and is just a macro for %insert("proxycode"). The Code insertion block section describes the %insert directive. The section of code for insertion is "proxycode", that is, the Java proxy class. This directive must hence only be used within the scope of a class, otherwise it is silently ignored. There are two common ways to get the scope correct.

    The first is to use %proxycode inside a class that SWIG parses, for example a toString() method can be added to a C++ class using pure Java code. A C++ header file can mix C++ and Java code inside the C++ class as follows:

    // flag.h header file
    class Flag {
      bool flag;
    public:
      Flag(bool flag) : flag(flag) {}
      bool FetchFlag() { return flag; }
    #if defined(SWIG)
    %proxycode %{
      public String toString() {
        boolean flag = FetchFlag();
        return Boolean.toString(flag);
      }
    %}
    #endif
    };
    

    and wrapped using:

    %{
    #include "flag.h"
    %}
    %include "flag.h"
    

    The second is to use %proxycode within %extend as everything within a %extend block is effectively within the scope of the class, for example:

    // flag.h header file
    class Flag {
      bool flag;
    public:
      Flag(bool flag) : flag(flag) {}
      bool FetchFlag() { return flag; }
    };
    

    and wrapped using:

    %{
    #include "flag.h"
    %}
    %include "flag.h"
    
    %extend Flag {
    #if defined(SWIG)
    %proxycode %{
      public String toString() {
        boolean flag = FetchFlag();
        return Boolean.toString(flag);
      }
    %}
    #endif
    }
    

    There is some very limited support of typemaps within a %proxycode block. A useful trick is to obtain the Java type for a given C/C++ type using the $typemap special macro. The following C++ template demonstrates this:

    %inline %{
    template<typename T> struct Value {
      T value;
      Value(const T& val) : value(val) {}
    };
    %}
    
    %extend Value {
    %proxycode %{
      public String toString() {
        // Note template type expansion is supported, so T is expanded to 'unsigned int' in this example
        // and $typemap(jstype, unsigned int) in turn is expanded to 'long'
        $typemap(jstype, T) val = getValue();
        return "$javaclassname value: " + val + " Java type: $typemap(jstype, T) JNI type: $typemap(jni, T)";
      }
    %}
    }
    %template(ValueUnsignedInt) Value<unsigned int>;
    

    The generated Java contains the expanded special variable and macro resulting in Java proxy code:

    public class ValueUnsignedInt {
      ...
      public String toString() {
        long val = getValue();
        return "ValueUnsignedInt value: " + val + " Java type: long JNI type: jlong";
      }
    
    }
    

    26.7.4 Exception handling with %exception and %javaexception

    If a C or C++ function throws an error, you may want to convert that error into a Java exception. To do this, you can use the %exception directive. The %exception directive simply lets you rewrite part of the generated wrapper code to include an error check. It is detailed in full in the Exception handling with %exception section.

    In C, a function often indicates an error by returning a status code (a negative number or a NULL pointer perhaps). Here is a simple example of how you might handle that:

    %exception malloc {
      $action
      if (!result) {
        jclass clazz = (*jenv)->FindClass(jenv, "java/lang/OutOfMemoryError");
        (*jenv)->ThrowNew(jenv, clazz, "Not enough memory");
        return $null;
      }
    }
    void *malloc(size_t nbytes);
    

    In Java,

    SWIGTYPE_p_void a = example.malloc(2000000000);
    

    will produce a familiar looking Java exception:

    Exception in thread "main" java.lang.OutOfMemoryError: Not enough memory
            at exampleJNI.malloc(Native Method)
            at example.malloc(example.java:16)
            at runme.main(runme.java:112)
    

    If a library provides some kind of general error handling framework, you can also use that. For example:

    %exception malloc {
      $action
      if (err_occurred()) {
        jclass clazz = (*jenv)->FindClass(jenv, "java/lang/OutOfMemoryError");
        (*jenv)->ThrowNew(jenv, clazz, "Not enough memory");
        return $null;
      }
    }
    void *malloc(size_t nbytes);
    

    If no declaration name is given to %exception, it is applied to all wrapper functions. The $action is a SWIG special variable and is replaced by the C/C++ function call being wrapped. The return $null; handles all native method return types, namely those that have a void return and those that do not. This is useful for typemaps that will be used in native method returning all return types. See the section on Java special variables for further explanation.

    C++ exceptions are also easy to handle. We can catch the C++ exception and rethrow it as a Java exception like this:

    %exception getitem {
      try {
        $action
      } catch (std::out_of_range &e) {
        jclass clazz = jenv->FindClass("java/lang/Exception");
        jenv->ThrowNew(clazz, "Range error");
        return $null;
      }
    }
    
    class FooClass {
      public:
        FooClass *getitem(int index);      // Might throw std::out_of_range exception
        ...
    };
    

    In the example above, java.lang.Exception is a checked exception class and so ought to be declared in the throws clause of getitem. Classes can be specified for adding to the throws clause using %javaexception(classes) instead of %exception, where classes is a string containing one or more comma separated Java classes. The %clearjavaexception feature is the equivalent to %clearexception and clears previously declared exception handlers. The %nojavaexception feature is the equivalent to %noexception and disables the exception handler. See Clearing features for the difference on disabling and clearing features.

    %javaexception("java.lang.Exception") getitem {
      try {
        $action
      } catch (std::out_of_range &e) {
        jclass clazz = jenv->FindClass("java/lang/Exception");
        jenv->ThrowNew(clazz, "Range error");
        return $null;
      }
    }
    
    class FooClass {
    public:
      FooClass *getitem(int index);      // Might throw std::out_of_range exception
      ...
    };
    

    The generated proxy method now generates a throws clause containing java.lang.Exception:

    public class FooClass {
      ...
      public FooClass getitem(int index) throws java.lang.Exception { ... }
      ...
    }
    

    The examples above first use the C JNI calling syntax then the C++ JNI calling syntax. The C++ calling syntax will not compile as C and also vice versa. It is however possible to write JNI calls which will compile under both C and C++ and is covered in the Typemaps for both C and C++ compilation section.

    The language-independent exception.i library file can also be used to raise exceptions. See the SWIG Library chapter. The typemap example Handling C++ exception specifications as Java exceptions provides further exception handling capabilities.

    26.7.5 Method access with %javamethodmodifiers

    A Java feature called %javamethodmodifiers can be used to change the method modifiers from the default public. It applies to both module class methods and proxy class methods. For example:

    %javamethodmodifiers protect_me() "protected";
    void protect_me();
    

    Will produce the method in the module class with protected access.

    protected static void protect_me() {
      exampleJNI.protect_me();
    }
    

    26.8 Tips and techniques

    Although SWIG is largely automatic, there are certain types of wrapping problems that require additional user input. Examples include dealing with output parameters, strings and arrays. This chapter discusses the common techniques for solving these problems.

    26.8.1 Input and output parameters using primitive pointers and references

    A common problem in some C programs is handling parameters passed as simple pointers or references. For example:

    void add(int x, int y, int *result) {
      *result = x + y;
    }
    

    or perhaps

    int sub(int *x, int *y) {
      return *x-*y;
    }
    

    The typemaps.i library file will help in these situations. For example:

    %module example
    %include "typemaps.i"
    
    void add(int, int, int *OUTPUT);
    int  sub(int *INPUT, int *INPUT);
    

    In Java, this allows you to pass simple values. For example:

    int result = example.sub(7, 4);
    System.out.println("7 - 4 = " + result);
    int[] sum = {0};
    example.add(3, 4, sum);
    System.out.println("3 + 4 = " + sum[0]);
    

    Which will display:

    7 - 4 = 3
    3 + 4 = 7
    

    Notice how the INPUT parameters allow integer values to be passed instead of pointers and how the OUTPUT parameter will return the result in the first element of the integer array.

    If you don't want to use the names INPUT or OUTPUT , use the %apply directive. For example:

    %module example
    %include "typemaps.i"
    
    %apply int *OUTPUT { int *result };
    %apply int *INPUT  { int *x, int *y};
    
    void add(int x, int y, int *result);
    int  sub(int *x, int *y);
    

    If a function mutates one of its parameters like this,

    void negate(int *x) {
      *x = -(*x);
    }
    

    you can use INOUT like this:

    %include "typemaps.i"
    ...
    void negate(int *INOUT);
    

    In Java, the input parameter is the first element in a 1 element array and is replaced by the output of the function. For example:

    int[] neg = {3};
    example.negate(neg);
    System.out.println("Negative of 3 = " + neg[0]);
    

    And no prizes for guessing the output:

    Negative of 3 = -3
    

    These typemaps can also be applied to C++ references. The above examples would work the same if they had been defined using references instead of pointers. For example, the Java code to use the negate function would be the same if it were defined either as it is above:

    void negate(int *INOUT);
    

    or using a reference:

    void negate(int &INOUT);
    

    Note: Since most Java primitive types are immutable and are passed by value, it is not possible to perform in-place modification of a type passed as a parameter.

    Be aware that the primary purpose of the typemaps.i file is to support primitive datatypes. Writing a function like this

    void foo(Bar *OUTPUT);
    

    will not have the intended effect since typemaps.i does not define an OUTPUT rule for Bar.

    26.8.2 Simple pointers

    If you must work with simple pointers such as int * or double * another approach to using typemaps.i is to use the cpointer.i pointer library file. For example:

    %module example
    %include "cpointer.i"
    
    %inline %{
    extern void add(int x, int y, int *result);
    %}
    
    %pointer_functions(int, intp);
    

    The %pointer_functions(type, name) macro generates five helper functions that can be used to create, destroy, copy, assign, and dereference a pointer. In this case, the functions are as follows:

    int  *new_intp();
    int  *copy_intp(int *x);
    void  delete_intp(int *x);
    void  intp_assign(int *x, int value);
    int   intp_value(int *x);
    

    In Java, you would use the functions like this:

    SWIGTYPE_p_int intPtr = example.new_intp();
    example.add(3, 4, intPtr);
    int result = example.intp_value(intPtr);
    System.out.println("3 + 4 = " + result);
    

    If you replace %pointer_functions(int, intp) by %pointer_class(int, intp), the interface is more class-like.

    intp intPtr = new intp();
    example.add(3, 4, intPtr.cast());
    int result = intPtr.value();
    System.out.println("3 + 4 = " + result);
    

    See the SWIG Library chapter for further details.

    26.8.3 Wrapping C arrays with Java arrays

    SWIG can wrap arrays in a more natural Java manner than the default by using the arrays_java.i library file. Let's consider an example:

    %include "arrays_java.i";
    int array[4];
    void populate(int x[]) {
      int i;
      for (i=0; i<4; i++)
        x[i] = 100 + i;
    }
    

    These one dimensional arrays can then be used as if they were Java arrays:

    int[] array = new int[4];
    example.populate(array);
    
    System.out.print("array: ");
    for (int i=0; i<array.length; i++)
      System.out.print(array[i] + " ");
    
    example.setArray(array);
    
    int[] global_array = example.getArray();
    
    System.out.print("\nglobal_array: ");
    for (int i=0; i<array.length; i++)
      System.out.print(global_array[i] + " ");
    

    Java arrays are always passed by reference, so any changes a function makes to the array will be seen by the calling function. Here is the output after running this code:

    array: 100 101 102 103
    global_array: 100 101 102 103
    

    Note that for assigning array variables the length of the C variable is used, so it is possible to use a Java array that is bigger than the C code will cope with. Only the number of elements in the C array will be used. However, if the Java array is not large enough then you are likely to get a segmentation fault or access violation, just like you would in C. When arrays are used in functions like populate, the size of the C array passed to the function is determined by the size of the Java array.

    Please be aware that the typemaps in this library are not efficient as all the elements are copied from the Java array to a C array whenever the array is passed to and from JNI code. There is an alternative approach using the SWIG array library and this is covered in the next section.

    26.8.4 Unbounded C Arrays

    Sometimes a C function expects an array to be passed as a pointer. For example,

    int sumitems(int *first, int nitems) {
      int i, sum = 0;
      for (i = 0; i < nitems; i++) {
        sum += first[i];
      }
      return sum;
    }
    

    One of the ways to wrap this is to apply the Java array typemaps that come in the arrays_java.i library file:

    %include "arrays_java.i"
    %apply int[] {int *};
    

    The ANY size will ensure the typemap is applied to arrays of all sizes. You could narrow the typemap matching rules by specifying a particular array size. Now you can use a pure Java array and pass it to the C code:

    int[] array = new int[10000000];          // Array of 10-million integers
    for (int i=0; i<array.length; i++) {      // Set some values
      array[i] = i;
    }
    int sum = example.sumitems(array, 10000);
    System.out.println("Sum = " + sum);
    

    and the sum would be displayed:

    Sum = 49995000
    

    This approach is probably the most natural way to use arrays. However, it suffers from performance problems when using large arrays as a lot of copying of the elements occurs in transferring the array from the Java world to the C++ world. An alternative approach to using Java arrays for C arrays is to use an alternative SWIG library file carrays.i. This approach can be more efficient for large arrays as the array is accessed one element at a time. For example:

    %include "carrays.i"
    %array_functions(int, intArray);
    

    The %array_functions(type, name) macro generates four helper functions that can be used to create and destroy arrays and operate on elements. In this case, the functions are as follows:

    int *new_intArray(int nelements);
    void delete_intArray(int *x);
    int intArray_getitem(int *x, int index);
    void intArray_setitem(int *x, int index, int value);
    

    In Java, you would use the functions like this:

    SWIGTYPE_p_int array = example.new_intArray(10000000);  // Array of 10-million integers
    for (int i=0; i<10000; i++) {                           // Set some values
      example.intArray_setitem(array, i, i);
    }
    int sum = example.sumitems(array, 10000);
    System.out.println("Sum = " + sum);
    

    If you replace %array_functions(int, intp) by %array_class(int, intp), the interface is more class-like and a couple more helper functions are available for casting between the array and the type wrapper class.

    %include "carrays.i"
    %array_class(int, intArray);
    

    The %array_class(type, name) macro creates wrappers for an unbounded array object that can be passed around as a simple pointer like int * or double *. For instance, you will be able to do this in Java:

    intArray array = new intArray(10000000);  // Array of 10-million integers
    for (int i=0; i<10000; i++) {             // Set some values
      array.setitem(i, i);
    }
    int sum = example.sumitems(array.cast(), 10000);
    System.out.println("Sum = " + sum);
    

    The array "object" created by %array_class() does not encapsulate pointers inside a special array object. In fact, there is no bounds checking or safety of any kind (just like in C). Because of this, the arrays created by this library are extremely low-level indeed. You can't iterate over them nor can you even query their length. In fact, any valid memory address can be accessed if you want (negative indices, indices beyond the end of the array, etc.). Needless to say, this approach is not going to suit all applications. On the other hand, this low-level approach is extremely efficient and well suited for applications in which you need to create buffers, package binary data, etc.

    26.8.5 Binary data vs Strings

    By default SWIG handles char * as a string but there is a handy multi-argument typemap available as mentioned in Passing binary data. The following simple example demonstrates using a byte array instead of passing the default string type and length to the wrapped function.

    %apply (char *STRING, size_t LENGTH) { (const char data[], size_t len) }
    %inline %{
    void binaryChar1(const char data[], size_t len) {
      printf("len: %d data: ", len);
      for (size_t i=0; i<len; ++i)
        printf("%x ", data[i]);
      printf("\n");
    }
    %}
    

    Calling from Java requires just the byte array to be passed in as the multi-argument typemap being applied reduces the number of arguments in the target language to one, from the original two:

    byte[] data = "hi\0jk".getBytes();
    example.binaryChar1(data);     
    

    resulting in the output

    $ java runme
    len: 5 data: 68 69 0 6a 6b
    

    26.8.6 Overriding new and delete to allocate from Java heap

    Unlike some languages supported by SWIG, Java has a true garbage collection subsystem. Other languages will free SWIG wrapped objects when their reference count reaches zero. Java only schedules these objects for finalization, which may not occur for some time. Because SWIG objects are allocated on the C heap, Java users may find the JVM memory use quickly exceeds the assigned limits, as memory fills with unfinalized proxy objects. Forcing garbage collection is clearly an undesirable solution.

    An elegant fix for C++ users is to override new and delete using the following code (here shown included in a SWIG interface file)

    /* File: java_heap.i */
    %module test
    %{
    #include <stdexcept>
    #include "jni.h"
    
    /**
     *  A stash area embedded in each allocation to hold java handles
     */
    struct Jalloc {
      jbyteArray jba;
      jobject ref;
    };
    
    static JavaVM *cached_jvm = 0;
    
    JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *jvm, void *reserved) {
      cached_jvm = jvm;
      return JNI_VERSION_1_2;
    }
    
    static JNIEnv * JNU_GetEnv() {
      JNIEnv *env;
      jint rc = cached_jvm->GetEnv((void **)&env, JNI_VERSION_1_2);
      if (rc == JNI_EDETACHED)
        throw std::runtime_error("current thread not attached");
      if (rc == JNI_EVERSION)
        throw std::runtime_error("jni version not supported");
      return env;
    }
    
    void * operator new(size_t t) {
      if (cached_jvm != 0) {
        JNIEnv *env = JNU_GetEnv();
        jbyteArray jba = env->NewByteArray((int) t + sizeof(Jalloc));
        if (env->ExceptionOccurred())
          throw bad_alloc();
        void *jbuffer = static_cast<void *>(env->GetByteArrayElements(jba, 0));
        if (env->ExceptionOccurred())
          throw bad_alloc();
        Jalloc *pJalloc = static_cast<Jalloc *>(jbuffer);
        pJalloc->jba = jba;
        /* Assign a global reference so byte array will persist until delete'ed */
        pJalloc->ref = env->NewGlobalRef(jba);
        if (env->ExceptionOccurred())
          throw bad_alloc();
        return static_cast<void *>(static_cast<char *>(jbuffer) + sizeof(Jalloc));
      }
      else { /* JNI_OnLoad not called, use malloc and mark as special */
        Jalloc *pJalloc = static_cast<Jalloc *>(malloc((int) t + sizeof(Jalloc)));
        if (!pJalloc)
          throw bad_alloc();
        pJalloc->ref = 0;
        return static_cast<void *>(
          static_cast<char *>(static_cast<void *>(pJalloc)) + sizeof(Jalloc));
      }
    }
    
    void operator delete(void *v) {
      if (v != 0) {
        void *buffer = static_cast<void *>( static_cast<char *>(v) - sizeof(Jalloc));
        Jalloc *pJalloc = static_cast<Jalloc *>(buffer);
        if (pJalloc->ref) {
          JNIEnv *env = JNU_GetEnv();
          env->DeleteGlobalRef(pJalloc->ref);
          env->ReleaseByteArrayElements(pJalloc->jba, static_cast<jbyte *>(buffer), 0);
        }
        else {
          free(buffer);
        }
      }
    }
    %}
    ...
    

    This code caches the Java environment during initialization, and when new is called, a Java ByteArray is allocated to provide the SWIG objects with space in the Java heap. This has the combined effect of re-asserting the Java virtual machine's limit on memory allocation, and puts additional pressure on the garbage collection system to run more frequently. This code is made slightly more complicated because allowances must be made if new is called before the JNI_OnLoad is executed. This can happen during static class initialization, for example.

    Unfortunately, because most Java implementations call malloc and free, this solution will not work for C wrapped structures. However, you are free to make functions that allocate and free memory from the Java heap using this model and use these functions in place of malloc and free in your own code.

    26.9 Java typemaps

    This section describes how you can modify SWIG's default wrapping behavior for various C/C++ datatypes using the %typemap directive. You are advised to be familiar with the material in the " Typemaps" chapter. While not absolutely essential knowledge, this section assumes some familiarity with the Java Native Interface (JNI). JNI documentation can be consulted either online at the Java web site or from a good JNI book. The following two books are recommended:

    • Title: 'Essential JNI: Java Native Interface.' Author: Rob Gordon. Publisher: Prentice Hall. ISBN: 0-13-679895-0.
    • Title: 'The Java Native Interface: Programmer's Guide and Specification.' Author: Sheng Liang. Publisher: Addison-Wesley. ISBN: 0-201-32577-2. Also available online at the Sun Developer Network.

    Before proceeding, it should be stressed that typemaps are not a required part of using SWIG---the default wrapping behavior is enough in most cases. Typemaps are only used if you want to change some aspect of the generated code.

    26.9.1 Default primitive type mappings

    The following table lists the default type mapping from Java to C/C++.

    C/C++ typeJava typeJNI type
    bool
    const bool &
    booleanjboolean
    char
    const char &
    charjchar
    signed char
    const signed char &
    bytejbyte
    unsigned char
    const unsigned char &
    shortjshort
    short
    const short &
    shortjshort
    unsigned short
    const unsigned short &
    intjint
    int
    const int &
    intjint
    unsigned int
    const unsigned int &
    longjlong
    long
    const long &
    intjint
    unsigned long
    const unsigned long &
    longjlong
    long long
    const long long &
    longjlong
    unsigned long long
    const unsigned long long &
    java.math.BigInteger jobject
    float
    const float &
    floatjfloat
    double
    const double &
    doublejdouble
    char *
    char []
    Stringjstring

    Note that SWIG wraps the C char type as a character. Pointers and arrays of this type are wrapped as strings. The signed char type can be used if you want to treat char as a signed number rather than a character. Also note that all const references to primitive types are treated as if they are passed by value.

    Given the following C function:

    void func(unsigned short a, char *b, const long &c, unsigned long long d);
    

    The module class method would be:

    public static void func(int a, String b, int c, java.math.BigInteger d) {...}
    

    The intermediary JNI class would use the same types:

    public final static native void func(int jarg1, String jarg2, int jarg3,
                                         java.math.BigInteger jarg4);
    

    and the JNI function would look like this:

    SWIGEXPORT void JNICALL Java_exampleJNI_func(JNIEnv *jenv, jclass jcls,
                    jint jarg1, jstring jarg2, jint jarg3, jobject jarg4) {...}
    

    The mappings for C int and C long are appropriate for 32 bit applications which are used in the 32 bit JVMs. There is no perfect mapping between Java and C as Java doesn't support all the unsigned C data types. However, the mappings allow the full range of values for each C type from Java.

    26.9.2 Default typemaps for non-primitive types

    The previous section covered the primitive type mappings. Non-primitive types such as classes and structs are mapped using pointers on the C/C++ side and storing the pointer into a Java long variable which is held by the proxy class or type wrapper class. This applies whether the type is marshalled as a pointer, by reference or by value. It also applies for any unknown/incomplete types which use type wrapper classes.

    So in summary, the C/C++ pointer to non-primitive types is cast into the 64 bit Java long type and therefore the JNI type is a jlong. The Java type is either the proxy class or type wrapper class.

    26.9.3 Sixty four bit JVMs

    If you are using a 64 bit JVM you may have to override the C long, but probably not C int default mappings. Mappings will be system dependent, for example long will need remapping on Unix LP64 systems (long, pointer 64 bits, int 32 bits), but not on Microsoft 64 bit Windows which will be using a P64 IL32 (pointer 64 bits and int, long 32 bits) model. This may be automated in a future version of SWIG. Note that the Java write once run anywhere philosophy holds true for all pure Java code when moving to a 64 bit JVM. Unfortunately it won't of course hold true for JNI code.

    26.9.4 What is a typemap?

    A typemap is nothing more than a code generation rule that is attached to a specific C datatype. For example, to convert integers from Java to C, you might define a typemap like this:

    %module example
    
    %typemap(in) int {
      $1 = $input;
      printf("Received an integer : %d\n",  $1);
    }
    %inline %{
    extern int fact(int nonnegative);
    %}
    

    Typemaps are always associated with some specific aspect of code generation. In this case, the "in" method refers to the conversion of input arguments to C/C++. The datatype int is the datatype to which the typemap will be applied. The supplied C code is used to convert values. In this code a number of special variables prefaced by a $ are used. The $1 variable is a placeholder for a local variable of type int. The $input variable contains the Java data, the JNI jint in this case.

    When this example is compiled into a Java module, it can be used as follows:

    System.out.println(example.fact(6));
    

    and the output will be:

    Received an integer : 6
    720
    

    In this example, the typemap is applied to all occurrences of the int datatype. You can refine this by supplying an optional parameter name. For example:

    %module example
    
    %typemap(in) int nonnegative {
      $1 = $input;
      printf("Received an integer : %d\n",  $1);
    }
    
    %inline %{
    extern int fact(int nonnegative);
    %}
    

    In this case, the typemap code is only attached to arguments that exactly match int nonnegative.

    The application of a typemap to specific datatypes and argument names involves more than simple text-matching--typemaps are fully integrated into the SWIG C++ type-system. When you define a typemap for int, that typemap applies to int and qualified variations such as const int. In addition, the typemap system follows typedef declarations. For example:

    %typemap(in) int nonnegative {
      $1 = $input;
      printf("Received an integer : %d\n",  $1);
    }
    %inline %{
    typedef int Integer;
    extern int fact(Integer nonnegative);    // Above typemap is applied
    %}
    

    However, the matching of typedef only occurs in one direction. If you defined a typemap for Integer, it is not applied to arguments of type int.

    Typemaps can also be defined for groups of consecutive arguments. For example:

    %typemap(in) (char *str, int len) {
    ...
    };
    
    int count(char c, char *str, int len);
    

    When a multi-argument typemap is defined, the arguments are always handled as a single Java parameter. This allows the function to be used like this (notice how the length parameter is omitted):

    int c = example.count('e', "Hello World");
    

    26.9.5 Typemaps for mapping C/C++ types to Java types

    The typemaps available to the Java module include the common typemaps listed in the main typemaps section. There are a number of additional typemaps which are necessary for using SWIG with Java. The most important of these implement the mapping of C/C++ types to Java types:


     
    TypemapDescription
    jniJNI C types. These provide the default mapping of types from C/C++ to JNI for use in the JNI (C/C++) code.
    jtypeJava intermediary types. These provide the default mapping of types from C/C++ to Java for use in the native functions in the intermediary JNI class. The type must be the equivalent Java type for the JNI C type specified in the "jni" typemap.
    jstypeJava types. These provide the default mapping of types from C/C++ to Java for use in the Java module class, proxy classes and type wrapper classes.
    javainConversion from jstype to jtype. These are Java code typemaps which transform the type used in the Java module class, proxy classes and type wrapper classes (as specified in the "jstype" typemap) to the type used in the Java intermediary JNI class (as specified in the "jtype" typemap). In other words the typemap provides the conversion to the native method call parameter types.
    javaoutConversion from jtype to jstype. These are Java code typemaps which transform the type used in the Java intermediary JNI class (as specified in the "jtype" typemap) to the Java type used in the Java module class, proxy classes and type wrapper classes (as specified in the "jstype" typemap). In other words the typemap provides the conversion from the native method call return type.
    jboxtypeJava boxed type. These are Java code typemaps to provide the Java boxed type, such as, Integer for C type int. As autoboxing is only relevant to the Java primitive types, these are only provided for the C types that map to Java primitive types. This typemap is usually only used by C++ STL container wrappers that are wrapped by Java generic types as the boxed type must be used instead of the unboxed/primitive type when declaring a Java generic type.
    javadirectorinConversion from jtype to jstype for director methods. These are Java code typemaps which transform the type used in the Java intermediary JNI class (as specified in the "jtype" typemap) to the Java type used in the Java module class, proxy classes and type wrapper classes (as specified in the "jstype" typemap). This typemap provides the conversion for the parameters in the director methods when calling up from C++ to Java. See Director typemaps.
    javadirectoroutConversion from jstype to jtype for director methods. These are Java code typemaps which transform the type used in the Java module class, proxy classes and type wrapper classes (as specified in the "jstype" typemap) to the type used in the Java intermediary JNI class (as specified in the "jtype" typemap). This typemap provides the conversion for the return type in the director methods when returning from the C++ to Java upcall. See Director typemaps.
    directorinConversion from C++ type to jni type for director methods. These are C++ typemaps which convert the parameters used in the C++ director method to the appropriate JNI intermediary type. The conversion is done in JNI code prior to calling the Java function from the JNI code. See Director typemaps.
    directoroutConversion from jni type to C++ type for director methods. These are C++ typemaps which convert the JNI return type used in the C++ director method to the appropriate C++ return type. The conversion is done in JNI code after calling the Java function from the JNI code. See Director typemaps.

    If you are writing your own typemaps to handle a particular type, you will normally have to write a collection of them. The default typemaps are in "java.swg" and so might be a good place for finding typemaps to base any new ones on.

    The "jni", "jtype" and "jstype" typemaps are usually defined together to handle the Java to C/C++ type mapping. An "in" typemap should be accompanied by a "javain" typemap and likewise an "out" typemap by a "javaout" typemap. If an "in" typemap is written, a "freearg" and "argout" typemap may also need to be written as some types have a default "freearg" and/or "argout" typemap which may need overriding. The "freearg" typemap sometimes releases memory allocated by the "in" typemap. The "argout" typemap sometimes sets values in function parameters which are passed by reference in Java.

    Note that the "in" typemap marshals the JNI type held in the "jni" typemap to the real C/C++ type and for the opposite direction, the "out" typemap marshals the real C/C++ type to the JNI type held in the "jni" typemap. For non-primitive types the "in" and "out" typemaps are responsible for casting between the C/C++ pointer and the 64 bit jlong type. There is no portable way to cast a pointer into a 64 bit integer type and the approach taken by SWIG is mostly portable, but breaks C/C++ aliasing rules. In summary, these rules state that a pointer to any type must never be dereferenced by a pointer to any other incompatible type. The following code snippet might aid in understand aliasing rules better:

    short a;
    short* pa = 0;
    int i = 0x1234;
    
    a = (short)i;    /* okay */
    a = *(short*)&i; /* breaks aliasing rules */
    

    An email posting, Aliasing, pointer casts and gcc 3.3 elaborates further on the subject. In SWIG, the "in" and "out" typemaps for pointers are typically

    %typemap(in) struct Foo * %{
      $1 = *(struct Foo **)&$input; /* cast jlong into C ptr */
    %}
    %typemap(out) struct Bar * %{
      *(struct Bar **)&$result = $1; /* cast C ptr into jlong */
    %}
    struct Bar {...};
    struct Foo {...};
    struct Bar * FooBar(struct Foo *f);
    

    resulting in the following code which breaks the aliasing rules:

    SWIGEXPORT jlong JNICALL Java_exampleJNI_FooBar(JNIEnv *jenv, jclass jcls,
                                                    jlong jarg1, jobject jarg1_) {
      jlong jresult = 0 ;
      struct Foo *arg1 = (struct Foo *) 0 ;
      struct Bar *result = 0 ;
      
      (void)jenv;
      (void)jcls;
      (void)jarg1_;
      arg1 = *(struct Foo **)&jarg1; 
      result = (struct Bar *)FooBar(arg1);
      *(struct Bar **)&jresult = result; 
      return jresult;
    }
    

    If you are using gcc as your C compiler, you might get a "dereferencing type-punned pointer will break strict-aliasing rules" warning about this. Please see Compiling a dynamic module to avoid runtime problems with these strict aliasing rules.

    The default code generated by SWIG for the Java module comes from the typemaps in the "java.swg" library file which implements the Default primitive type mappings and Default typemaps for non-primitive types covered earlier. There are other type mapping typemaps in the Java library. These are listed below:


     
    C TypeTypemap FileKindJava Type Function
    primitive pointers and referencesINPUT typemaps.iinputJava basic typesAllows values to be used for C functions taking pointers for data input.
    primitive pointers and referencesOUTPUT typemaps.ioutputJava basic type arraysAllows values held within an array to be used for C functions taking pointers for data output.
    primitive pointers and referencesINOUT typemaps.iinput
    output
    Java basic type arraysAllows values held within an array to be used for C functions taking pointers for data input and output.
    string
    wstring
    [unnamed]std_string.iinput
    output
    StringUse for std::string mapping to Java String.
    arrays of primitive types[unnamed] arrays_java.iinput
    output
    arrays of primitive Java typesUse for mapping C arrays to Java arrays.
    arrays of classes/structs/unionsJAVA_ARRAYSOFCLASSES macroarrays_java.iinput
    output
    arrays of proxy classesUse for mapping C arrays to Java arrays.
    arrays of enumsARRAYSOFENUMSarrays_java.i input
    output
    int[]Use for mapping C arrays to Java arrays (typeunsafe and simple enum wrapping approaches only).
    char *BYTEvarious.iinput byte[]Java byte array is converted to char array
    char **STRING_ARRAYvarious.iinput
    output
    String[]Use for mapping NULL terminated arrays of C strings to Java String arrays
    unsigned char *NIOBUFFERvarious.i input
    output
    java.nio.BufferUse for mapping directly allocated buffers to c/c++. useful with directors and long lived memory objects

    26.9.6 Java typemap attributes

    There are a few additional typemap attributes that the Java module supports.

    The first of these is the 'throws' attribute. The throws attribute is optional and specified after the typemap name and contains one or more comma separated classes for adding to the throws clause for any methods that use that typemap. It is analogous to the %javaexception feature's throws attribute.

    %typemap(typemapname, throws="ExceptionClass1, ExceptionClass2") type { ... }
    

    The attribute is necessary for supporting Java checked exceptions and can be added to just about any typemap. The list of typemaps include all the C/C++ (JNI) typemaps in the " Typemaps" chapter and the Java specific typemaps listed in the previous section, barring the "jni", "jtype" and "jstype" typemaps as they could never contain code to throw an exception.

    The throws clause is generated for the proxy method as well as the JNI method in the JNI intermediary class. If a method uses more than one typemap and each of those typemaps have classes specified in the throws clause, the union of the exception classes is added to the throws clause ensuring there are no duplicate classes. See the NaN exception example for further usage.

    The "jtype" typemap has the optional 'nopgcpp' attribute which can be used to suppress the generation of the premature garbage collection prevention parameter.

    The "javain" typemap has the optional 'pre', 'post' and 'pgcppname' attributes. These are used for generating code before and after the JNI call in the proxy class or module class. The 'pre' attribute contains code that is generated before the JNI call and the 'post' attribute contains code generated after the JNI call. The 'pgcppname' attribute is used to change the premature garbage collection prevention parameter name passed to the JNI function. This is sometimes needed when the 'pre' typemap creates a temporary variable which is then passed to the JNI function.

    Note that when the 'pre' or 'post' attributes are specified and the associated type is used in a constructor, a constructor helper function is generated. This is necessary as the Java proxy constructor wrapper makes a call to a support constructor using a this call. In Java the this call must be the first statement in the constructor body. The constructor body thus calls the helper function and the helper function instead makes the JNI call, ensuring the 'pre' code is called before the JNI call is made. There is a Date marshalling example showing 'pre', 'post' and 'pgcppname' attributes in action.

    26.9.7 Java special variables

    The standard SWIG special variables are available for use within typemaps as described in the Typemaps documentation , for example $1, $input, $result etc.

    The Java module uses a few additional special variables:

    $javaclassname
    This special variable works like the other special variables and $javaclassname is similar to $1_type. It expands to the class name for use in Java given a pointer. SWIG wraps unions, structs and classes using pointers and in this case it expands to the Java proxy class name. For example, $javaclassname is replaced by the proxy classname Foo when wrapping a Foo * and $&javaclassname expands to the proxy classname when wrapping the C/C++ type Foo and $*javaclassname expands to the proxy classname when wrapping Foo *&. If the type does not have an associated proxy class, it expands to the type wrapper class name, for example, SWIGTYPE_p_unsigned_short is generated when wrapping unsigned short *. The class name is fully qualified with the package name when using the nspace feature.

    $javaclazzname
    This special variable works like $javaclassname, but expands the fully qualified C++ class into the package name, if used by the nspace feature, and the proxy class name, mangled for use as a function name. For example, Namespace1::Namespace2::Klass is expanded into Namespace1_Namespace2_Klass_. This special variable is usually used for making calls to a function in the intermediary JNI class, as they are mangled with this prefix.

    $null
    Used in input typemaps to return early from JNI functions that have either void or a non-void return type. Example:

    %typemap(check) int * %{ 
      if (error) {
        SWIG_JavaThrowException(jenv, SWIG_JavaIndexOutOfBoundsException, "Array element error");
        return $null;
      }
    %}
    

    If the typemap gets put into a function with void as return, $null will expand to nothing:

    SWIGEXPORT void JNICALL Java_jnifn(...) {
      if (error) {
        SWIG_JavaThrowException(jenv, SWIG_JavaIndexOutOfBoundsException, "Array element error");
        return ;
      }
      ...
    }
    

    otherwise $null expands to NULL

    SWIGEXPORT jobject JNICALL Java_jnifn(...) {
      if (error) {
        SWIG_JavaThrowException(jenv, SWIG_JavaIndexOutOfBoundsException, "Array element error");
        return NULL;
      }
      ...
    }
    

    $javainput, $jnicall and $owner
    The $javainput special variable is used in "javain" typemaps and $jnicall and $owner are used in "javaout" typemaps. $jnicall is analogous to $action in %exception. It is replaced by the call to the native method in the intermediary JNI class. $owner is replaced by either true if %newobject has been used, otherwise false . $javainput is analogous to the $input special variable. It is replaced by the parameter name.

    Here is an example:

    %typemap(javain) Class "Class.getCPtr($javainput)"
    %typemap(javain) unsigned short "$javainput"
    %typemap(javaout) Class * {
        return new Class($jnicall, $owner);
      }
    
    %inline %{
      class Class {...};
      Class * bar(Class cls, unsigned short ush) { return new Class(); };
    %}
    

    The generated proxy code is then:

    public static Class bar(Class cls, int ush) {
      return new Class(exampleJNI.bar(Class.getCPtr(cls), cls, ush), false);
    }
    

    Here $javainput has been replaced by cls and ush. $jnicall has been replaced by the native method call, exampleJNI.bar(...) and $owner has been replaced by false. If %newobject is used by adding the following at the beginning of our example:

    %newobject bar(Class cls, unsigned short ush);
    

    The generated code constructs the return type using true indicating the proxy class Class is responsible for destroying the C++ memory allocated for it in bar:

    public static Class bar(Class cls, int ush) {
      return new Class(exampleJNI.bar(Class.getCPtr(cls), cls, ush), true);
    }
    

    $static
    This special variable expands to either static or nothing depending on whether the class is an inner Java class or not. It is used in the "javaclassmodifiers" typemap so that global classes can be wrapped as Java proxy classes and nested C++ classes/enums can be wrapped with the Java equivalent, that is, static inner proxy classes.

    $error, $jniinput, $javacall and $packagepath
    These special variables are used in the directors typemaps. See Director specific typemaps for details.

    $module
    This special variable expands to the module name, as specified by %module or the -module commandline option.

    $imclassname
    This special variable expands to the intermediary class name. Usually this is the same as '$moduleJNI', unless the jniclassname attribute is specified in the %module directive.

    $javainterfacename
    This special variable is only expanded when the interface feature is applied to a class. It works much like $javaclassname , but instead of expanding to the proxy classname, it expands to the value in the name attribute in the interface feature. For example:

    %feature("interface", name="MyInterface") MyClass;
    %typemap(jstype) MyClass  "$&javainterfacename"
    %typemap(jstype) MyClass * "$javainterfacename"
    

    will result in the jstype typemap expanding to MyInterface for both MyClass and MyClass *. The interface name is fully qualified with the package name when using the nspace feature.

    $interfacename
    This special variable is only expanded when the interface feature is applied to a class. It expands to just the interface name and is thus different to $javainterfacename in that it is not fully qualified with the package name when using the nspace feature.

    26.9.8 Typemaps for both C and C++ compilation

    JNI calls must be written differently depending on whether the code is being compiled as C or C++. For example C compilation requires the pointer to a function pointer struct member syntax like

    const jclass clazz = (*jenv)->FindClass(jenv, "java/lang/String");
    

    whereas C++ code compilation of the same function call is a member function call using a class pointer like

    const jclass clazz = jenv->FindClass("java/lang/String");
    

    To enable typemaps to be used for either C or C++ compilation, a set of JCALLx macros have been defined in Lib/java/javahead.swg, where x is the number of arguments in the C++ version of the JNI call. The above JNI calls would be written in a typemap like this

    const jclass clazz = JCALL1(FindClass, jenv, "java/lang/String");
    

    Note that the SWIG preprocessor expands these into the appropriate C or C++ JNI calling convention. The C calling convention is emitted by default and the C++ calling convention is emitted when using the -c++ SWIG commandline option. If you do not intend your code to be targeting both C and C++ then your typemaps can use the appropriate JNI calling convention and need not use the JCALLx macros.

    26.9.9 Java code typemaps

    Most of SWIG's typemaps are used for the generation of C/C++ code. The typemaps in this section are used solely for the generation of Java code. Elements of proxy classes and type wrapper classes come from the following typemaps (the defaults).

    %typemap(javabase)

    base (extends) for Java class: empty default
    Note that this typemap accepts a replace attribute as an optional flag. When set to "1", it will replace/override any C++ base classes that might have been parsed. If this flag is not specified and there are C++ base classes, then a multiple inheritance warning is issued and the code in the typemap is ignored. The typemap also accepts a notderived attribute as an optional flag. When set to "1", it will not apply to classes that are derived from a C++ base. When used with the SWIGTYPE type, it is useful for giving a common base for all proxy classes, that is, providing a base class that sits in between all proxy classes and the Java base class Object for example: %typemap(javabase, notderived="1") SWIGTYPE "CommonBase".

    %typemap(javabody)

    the essential support body for proxy classes (proxy base classes only), typewrapper classes and enum classes. Default contains extra constructors, memory ownership control member variables (swigCMemOwn, swigCPtr), the getCPtr method etc.

    %typemap(javabody_derived)

    the essential support body for proxy classes (derived classes only). Same as "javabody" typemap, but only used for proxy derived classes.

    %typemap(javaclassmodifiers)

    class modifiers for the Java class: default is "public class"

    %typemap(javacode)

    Java code is copied verbatim to the Java class: empty default As there can only be one "javacode" typemap per class, also consider using the %proxycode directive which can be used multiple times per class and offers nearly identical functionality.

    %typemap(javadestruct, methodname="delete", methodmodifiers="public synchronized", parameters="")

    destructor wrapper - the delete() method (proxy classes only), used for all proxy classes except those which have a base class : default calls C++ destructor (or frees C memory) and resets swigCPtr and swigCMemOwn flags

    Note that the delete() method name is configurable and is specified by the methodname attribute. The method modifiers are also configurable via the methodmodifiers attribute. If a %javamethodmodifiers is attached to the class' destructor, it will be used in preference to the methodmodifiers typemap attribute for the class. The delete method's parameters declaration can be provided in the optional parameters typemap attribute.

    %typemap(javadestruct_derived, methodname="delete", methodmodifiers="public synchronized", parameters="")

    destructor wrapper - the delete() method (proxy classes only), same as "javadestruct" but only used for derived proxy classes : default calls C++ destructor (or frees C memory) and resets swigCPtr and swigCMemOwn flags

    Note that the delete() method name is configurable and is specified by the methodname attribute. The method modifiers are also configurable via the methodmodifiers attribute. If a %javamethodmodifiers is attached to the class' destructor, it will be used in preference to the methodmodifiers typemap attribute for the class. The delete method's parameters declaration can be provided in the optional parameters typemap attribute.

    %typemap(javaimports)

    import statements for Java class: empty default

    %typemap(javainterfaces)

    interfaces (implements) for Java class: empty default

    %typemap(javafinalize)

    the finalize() method (proxy classes only): default calls the delete() method

    Note that the default javafinalize typemap must contain the full implementation of the finalize method. Any customization to this typemap must still declare a java finalize method with the correct signature. Note also that the name of the generated "delete" method may be affected by javadestruct and javadestruct_derived typemaps. Below shows an example modifying the finalizer, assuming the delete method has been renamed to swig_delete.

    %typemap(javafinalize) SWIGTYPE %{
      protected void finalize() {
        swig_delete();  // renamed to prevent conflict with existing delete method
      }
    ]%
    

    %typemap(javainterfacecode, declaration="...", cptrmethod="...")

    The code in this typemap is added to the body of a Java proxy class but only when a class is marked with the interface feature. The typemap is used in the proxy class marked with the interface feature as well as all proxy classes derived from the marked C++ class, as they are all generated as implementing the Java interface. The default typemap used in the %interface family of macros mentioned in the Java interfaces section, where CTYPE is the C++ class macro argument, is as follows:

    %typemap(javainterfacecode,
             declaration="  long $interfacename_GetInterfaceCPtr();\n",
             cptrmethod="$interfacename_GetInterfaceCPtr") CTYPE %{
      public long $interfacename_GetInterfaceCPtr() {
        return $imclassname.$javaclazzname$interfacename_GetInterfaceCPtr(swigCPtr);
      }
    %}
    

    The special variable $interfacename is expanded into the name specified in the interface feature.

    Compatibility Note: In SWIG-1.3.21 and earlier releases, typemaps called "javagetcptr" and "javaptrconstructormodifiers" were available. These are deprecated and the "javabody" typemap can be used instead. The javainterfacecode typemap and interface feature was introduced in SWIG-3.0.9.

    In summary the contents of the typemaps make up a proxy class like this:

    [ javaimports typemap ]
    [ javaclassmodifiers typemap ] javaclassname extends [ javabase typemap ]
                                                 implements [ javainterfaces typemap ] {
    [ javabody or javabody_derived typemap ]
    [ javafinalize typemap ]
    public synchronized void delete() [ javadestruct OR javadestruct_derived typemap ]
    [ javacode typemap ]
    [ javainterfacecode typemap]
    ... proxy functions ...
    }
    

    Note the delete() methodname and method modifiers are configurable, see "javadestruct" and "javadestruct_derived" typemaps above.

    The javainterfacecode typemap is only used when bases are marked by the interface feature and the implements list will also then be expanded to include these Java interfaces.

    The type wrapper class is similar in construction:

    [ javaimports typemap ]
    [ javaclassmodifiers typemap ] javaclassname extends [ javabase typemap ]
                                                 implements [ javainterfaces typemap ] {
    [ javabody typemap ]
    [ javacode typemap ]
    }
    

    The enum class is also similar in construction:

    [ javaimports typemap ]
    [ javaclassmodifiers typemap ] javaclassname extends [ javabase typemap ]
                                                 implements [ javainterfaces typemap ] {
    ... Enum values ...
    [ javabody typemap ]
    [ javacode typemap ]
    }
    

    The "javaimports" typemap is ignored if the enum class is wrapped by an inner Java class, that is when wrapping an enum declared within a C++ class.

    The Java interface turned on by the interface feature is fairly simple:

    [ javaimports typemap ]
    public interface [ javainterfacename ] {
    [ javainterfacecode:cptrmethod typemap attribute ]
    ... interface declarations ...
    }
    

    where javainterfacename is the name attribute in the interface feature.

    The defaults can be overridden to tailor the generated classes. Here is an example which will change the getCPtr method and constructor from the default public access to protected access. If the classes in one package are not using the classes in another package, then these methods need not be public and removing access to these low level implementation details, is a good thing. If you are invoking SWIG more than once and generating the wrapped classes into different packages in each invocation, then you cannot do this as you will then have different packages.

    %typemap(javabody) SWIGTYPE %{
      private transient long swigCPtr;
      protected transient boolean swigCMemOwn;
    
      protected $javaclassname(long cPtr, boolean cMemoryOwn) {
        swigCMemOwn = cMemoryOwn;
        swigCPtr = cPtr;
      }
    
      protected static long getCPtr($javaclassname obj) {
        return (obj == null) ? 0 : obj.swigCPtr;
      }
    %}
    

    The typemap code is the same that is in "java.swg", barring the last two method modifiers. Note that SWIGTYPE will target all proxy classes, but not the type wrapper classes. Also the above typemap is only used for proxy classes that are potential base classes. To target proxy classes that are derived from a wrapped class as well, the "javabody_derived" typemap should also be overridden.

    For the typemap to be used in all type wrapper classes, all the different types that type wrapper classes could be used for should be targeted:

    %typemap(javabody) SWIGTYPE *, SWIGTYPE &, SWIGTYPE [], SWIGTYPE (CLASS::*) %{
      private transient long swigCPtr;
    
      protected $javaclassname(long cPtr, boolean bFutureUse) {
        swigCPtr = cPtr;
      }
    
      protected $javaclassname() {
        swigCPtr = 0;
      }
    
      protected static long getCPtr($javaclassname obj) {
        return (obj == null) ? 0 : obj.swigCPtr;
      }
    %}
    

    Again this is the same that is in "java.swg", barring the method modifier for getCPtr.

    When using multiple modules or the nspace feature it is common to invoke SWIG with a different -package command line option for each module. However, by default the generated code may not compile if generated classes in one package use generated classes in another package. The visibility of the getCPtr() and pointer constructor generated from the javabody typemaps needs changing. The default visibility is protected but it needs to be public for access from a different package. Just changing 'protected' to 'public' in the typemap achieves this. Two macros are available in java.swg to make this easier and using them is the preferred approach over simply copying the typemaps and modifying as this is forward compatible with any changes in the javabody typemap in future versions of SWIG. The macros are for the proxy and typewrapper classes and can respectively be used to to make the method and constructor public:

      SWIG_JAVABODY_PROXY(public, public, SWIGTYPE)
      SWIG_JAVABODY_TYPEWRAPPER(public, public, public, SWIGTYPE)
    

    26.9.10 Director specific typemaps

    The Java directors feature requires the "javadirectorin", "javadirectorout", "directorin" and the "directorout" typemaps in order to work properly. The "javapackage" typemap is an optional typemap used to identify the Java package path for individual SWIG generated proxy classes used in director methods.

    %typemap(directorin)

    The "directorin" typemap is used for converting arguments in the C++ director class to the appropriate JNI type before the upcall to Java. This typemap also specifies the JNI field descriptor for the type in the "descriptor" attribute. For example, integers are converted as follows:

    %typemap(directorin, descriptor="I") int "$input = (jint) $1;"
    

    $input is the SWIG name of the JNI temporary variable passed to Java in the upcall. The descriptor="I" will put an I into the JNI field descriptor that identifies the Java method that will be called from C++. For more about JNI field descriptors and their importance, refer to the JNI documentation mentioned earlier. A typemap for C character strings is:

    %typemap(directorin, descriptor="Ljava/lang/String;", noblock=1) char * {
      $input = 0;
      if ($1) {
        $input = JCALL1(NewStringUTF, jenv, (const char *)$1);
        if (!$input) return $null;
      }
      Swig::LocalRefGuard $1_refguard(jenv, $input);
    }
    

    The Swig::LocalRefGuard class should be used in directorin typemaps for newly allocated objects. It is used to control local reference counts ensuring the count is decremented after the call up into Java has completed. Its destructor simply calls jenv->DeleteLocalRef(obj) on the obj passed in during construction.

    User-defined types have the default "descriptor" attribute " L$packagepath/$javaclassname;" where $packagepath is the package name passed from the SWIG command line and $javaclassname is the Java proxy class' name. If the -package commandline option is not used to specify the package, then '$packagepath/' will be removed from the resulting output JNI field descriptor. Do not forget the terminating ';' for JNI field descriptors starting with 'L'. If the ';' is left out, Java will generate a "method not found" runtime error. Note that the $packagepath substitution always uses the path separator '/' when expanded. The $javaclassname expansion can be confusing as it is normally expanded using the '.' separator. However, $javaclassname is expanded using the path separator '/' in typemap's "descriptor" attribute as well as in the "directorthrows" typemap.

    %typemap(directorout)

    The "directorout" typemap is used for converting the JNI return type in the C++ director class to the appropriate C++ type after the upcall to Java. For example, integers are converted as follows:

    %typemap(directorout) int %{ $result = (int)$input; %}
    

    $input is the SWIG name of the JNI temporary variable returned from Java after the upcall. $result is the resulting output. A typemap for C character strings is:

    %typemap(directorout) char * {
      $1 = 0;
      if ($input) {
        $result = (char *)jenv->GetStringUTFChars($input, 0);
        if (!$1) return $null;
      }
    }
    

    %typemap(javadirectorin)

    Conversion from jtype to jstype for director methods. These are Java code typemaps which transform the type used in the Java intermediary JNI class (as specified in the "jtype" typemap) to the Java type used in the Java module class, proxy classes and type wrapper classes (as specified in the "jstype" typemap). This typemap provides the conversion for the parameters in the director methods when calling up from C++ to Java.

    For primitive types, this typemap is usually specified as:

    %typemap(javadirectorin) int "$jniinput"
    

    The $jniinput special variable is analogous to $javainput special variable. It is replaced by the input parameter name.

    %typemap(javadirectorout)

    Conversion from jstype to jtype for director methods. These are Java code typemaps which transform the type used in the Java module class, proxy classes and type wrapper classes (as specified in the "jstype" typemap) to the type used in the Java intermediary JNI class (as specified in the "jtype" typemap). This typemap provides the conversion for the return type in the director methods when returning from the C++ to Java upcall.

    For primitive types, this typemap is usually specified as:

    %typemap(javadirectorout) int "$javacall"
    

    The $javacall special variable is analogous to the $jnicall special variable. It is replaced by the call to the target Java method. The target method is the method in the Java proxy class which overrides the virtual C++ method in the C++ base class.

    %typemap(directorthrows)

    Conversion of Java exceptions to C++ exceptions in director method's exception handling. This typemap is expected to test the $error special variable for a matching Java exception and if successful convert and throw it into a C++ exception given by the typemap's type. The $error special variable is of type jthrowable and is substituted with a unique variable name in the generated code.

    The example below converts a Java java.lang.IndexOutOfBoundsException exception to the typemap's type, that is std::out_of_range:

    %typemap(directorthrows) std::out_of_range %{
      if (Swig::ExceptionMatches(jenv, $error, "java/lang/IndexOutOfBoundsException")) {
        throw std::out_of_range(Swig::JavaExceptionMessage(jenv, $error).message());
      }
    %}
    

    The utility function Swig::ExceptionMatches and class Swig::JavaExceptionMessage are helpers available when using directors and are described in the Java Exceptions from Directors section.

    %typemap(javapackage)

    The "javapackage" typemap is optional; it serves to identify a class's Java package. This typemap should be used in conjunction with classes that are defined outside of the current SWIG interface file. The typemap is only used if the type is used in a director method, that is, in a virtual method in a director class. For example:

    // class Foo is handled in a different interface file:
    %import "Foo.i"
    
    %feature("director") Example;
    
    %inline {
      class Bar { };
    
      class Example {
      public:
        virtual ~Example();
        virtual void ping(Foo *arg1, Bar *arg2);
      };
    }
    

    Assume that the Foo class is part of the Java package com.wombat.foo but the above interface file is part of the Java package com.wombat.example. Without the "javapackage" typemap, SWIG will assume that the Foo class belongs to com.wombat.example class. The corrected interface file looks like:

    // class Foo is handled in a different interface file:
    %import "Foo.i"
    %typemap("javapackage") Foo, Foo *, Foo & "com.wombat.foo";
    %feature("director") Example;
    
    %inline {
      class Bar { };
    
      class Example {
      public:
        virtual ~Example();
        virtual void ping(Foo *arg1, Bar *arg2);
      };
    }
    

    SWIG looks up the package based on the actual type (plain Foo, Foo pointer and Foo reference), so it is important to associate all three types with the desired package. Practically speaking, you should create a separate SWIG interface file, which is %import-ed into each SWIG interface file, when you have multiple Java packages. Note the helper macros below, OTHER_PACKAGE_SPEC and ANOTHER_PACKAGE_SPEC, which reduce the amount of extra typing. " TYPE..." is useful when passing templated types to the macro, since multiargument template types appear to the SWIG preprocessor as multiple macro arguments.

    %typemap("javapackage") SWIGTYPE, SWIGTYPE *, SWIGTYPE &
                                                "package.for.most.classes";
    
    %define OTHER_PACKAGE_SPEC(TYPE...)
    %typemap("javapackage") TYPE, TYPE *, TYPE & "package.for.other.classes";
    %enddef
    
    %define ANOTHER_PACKAGE_SPEC(TYPE...)
    %typemap("javapackage") TYPE, TYPE *, TYPE & "package.for.another.set";
    %enddef
    
    OTHER_PACKAGE_SPEC(Package_2_class_one)
    ANOTHER_PACKAGE_SPEC(Package_3_class_two)
    /* etc */
    

    The basic strategy here is to provide a default package typemap for the majority of the classes, only providing "javapackage" typemaps for the exceptions.

    26.10 Typemap Examples

    This section includes a few examples of typemaps. For more examples, you might look at the files "java.swg" and "typemaps.i " in the SWIG library.

    26.10.1 Simpler Java enums for enums without initializers

    The default Proper Java enums approach to wrapping enums is somewhat verbose. This is to handle all possible C/C++ enums, in particular enums with initializers. The generated code can be simplified if the enum being wrapped does not have any initializers.

    The following shows how to remove the support methods that are generated by default and instead use the methods in the Java enum base class java.lang.Enum and java.lang.Class for marshalling enums between C/C++ and Java. The type used for the typemaps below is enum SWIGTYPE which is the default type used for all enums. The "enums.swg" file should be examined in order to see the original overridden versions of the typemaps.

    %include "enums.swg"
    
    %typemap(javain) enum SWIGTYPE "$javainput.ordinal()"
    %typemap(javaout) enum SWIGTYPE {
        return $javaclassname.class.getEnumConstants()[$jnicall];
      }
    %typemap(javabody) enum SWIGTYPE ""
    
    %inline %{
      enum HairType { blonde, ginger, brunette };
      void setHair(HairType h);
      HairType getHair();
    %}
    

    SWIG will generate the following Java enum, which is somewhat simpler than the default:

    public enum HairType {
      blonde,
      ginger,
      brunette;
    }
    

    and the two Java proxy methods will be:

    public static void setHair(HairType h) {
      exampleJNI.setHair(h.ordinal());
    }
    
    public static HairType getHair() {
      return HairType.class.getEnumConstants()[exampleJNI.getHair()];
    }
    

    For marshalling Java enums to C/C++ enums, the ordinal method is used to convert the Java enum into an integer value for passing to the JNI layer, see the "javain" typemap. For marshalling C/C++ enums to Java enums, the C/C++ enum value is cast to an integer in the C/C++ typemaps (not shown). This integer value is then used to index into the array of enum constants that the Java language provides. See the getEnumConstants method in the "javaout" typemap.

    These typemaps can often be used as the default for wrapping enums as in many cases there won't be any enum initializers. In fact a good strategy is to always use these typemaps and to specifically handle enums with initializers using %apply. This would be done by using the original versions of these typemaps in "enums.swg" under another typemap name for applying using %apply.

    26.10.2 Handling C++ exception specifications as Java exceptions

    This example demonstrates various ways in which C++ exceptions can be tailored and converted into Java exceptions. Let's consider a simple file class SimpleFile and an exception class FileException which it may throw on error:

    %include "std_string.i" // for std::string typemaps
    #include <string>
    
    class FileException {
      std::string message;
    public:
      FileException(const std::string& msg) : message(msg) {}
      std::string what() {
        return message;
      }
    };
    
    class SimpleFile {
      std::string filename;
    public:
      SimpleFile(const std::string& filename) : filename(filename) {}
      void open() throw(FileException) {
      ...
      }
    };
    

    As the open method has a C++ exception specification, SWIG will parse this and know that the method can throw an exception. The "throws" typemap is then used when SWIG encounters an exception specification. The default generic "throws" typemap looks like this:

    %typemap(throws) SWIGTYPE, SWIGTYPE &, SWIGTYPE *, SWIGTYPE [ANY] %{
      SWIG_JavaThrowException(jenv, SWIG_JavaRuntimeException,
                              "C++ $1_type exception thrown");
      return $null;
    %}
    

    Basically SWIG will generate a C++ try catch block and the body of the "throws" typemap constitutes the catch block. The above typemap calls a SWIG supplied method which throws a java.lang.RuntimeException. This exception class is a runtime exception and therefore not a checked exception. If, however, we wanted to throw a checked exception, say java.io.IOException, then we could use the following typemap:

    %typemap(throws, throws="java.io.IOException") FileException {
      jclass excep = jenv->FindClass("java/io/IOException");
      if (excep)
        jenv->ThrowNew(excep, $1.what().c_str());
      return $null;
    }
    

    Note that this typemap uses the 'throws' typemap attribute to ensure a throws clause is generated. The generated proxy method then specifies the checked exception by containing java.io.IOException in the throws clause:

    public class SimpleFile {
      ...
      public void open() throws java.io.IOException { ... }
    }
    

    Lastly, if you don't want to map your C++ exception into one of the standard Java exceptions, the C++ class can be wrapped and turned into a custom Java exception class. If we go back to our example, the first thing we must do is get SWIG to wrap FileException and ensure that it derives from java.lang.Exception. Additionally, we might want to override the java.lang.Exception.getMessage() method. The typemaps to use then are as follows:

    %typemap(javabase) FileException "java.lang.Exception";
    %typemap(javacode) FileException %{
      public String getMessage() {
        return what();
      }
    %}
    

    This generates:

    public class FileException extends java.lang.Exception {
      ...
      public String getMessage() {
        return what();
      }
    
      public FileException(String msg) { ... }
    
      public String what() {
        return exampleJNI.FileException_what(swigCPtr, this);
      }
    }
    

    We could alternatively have used %rename to rename what() into getMessage().

    26.10.3 NaN Exception - exception handling for a particular type

    A Java exception can be thrown from any Java or JNI code. Therefore, as most typemaps contain either Java or JNI code, just about any typemap could throw an exception. The following example demonstrates exception handling on a type by type basis by checking for 'Not a number' (NaN) whenever a parameter of type float is wrapped.

    Consider the following C++ code:

    bool calculate(float first, float second);
    

    To validate every float being passed to C++, we could precede the code being wrapped by the following typemap which throws a runtime exception whenever the float is 'Not a Number':

    %module example
    %typemap(javain) float "$module.CheckForNaN($javainput)"
    %pragma(java) modulecode=%{
      /** Simply returns the input value unless it is not a number,
          whereupon an exception is thrown. */
      static protected float CheckForNaN(float num) {
        if (Float.isNaN(num))
          throw new RuntimeException("Not a number");
        return num;
      }
    %}
    

    Note that the CheckForNaN support method has been added to the module class using the modulecode pragma. The following shows the generated code of interest:

    public class example {
      ...
    
      /** Simply returns the input value unless it is not a number,
          whereupon an exception is thrown. */
      static protected float CheckForNaN(float num) {
        if (Float.isNaN(num))
          throw new RuntimeException("Not a number");
        return num;
      }
    
      public static boolean calculate(float first, float second) {
        return exampleJNI.calculate(example.CheckForNaN(first), example.CheckForNaN(second));
      }
    }
    

    Note that the "javain" typemap is used for every occurrence of a float being used as an input. Of course, we could have targeted the typemap at a particular parameter by using float first, say, instead of just float.

    The exception checking could alternatively have been placed into the 'pre' attribute that the "javain" typemap supports. The "javain" typemap above could be replaced with the following:

    %typemap(javain, pre="    $module.CheckForNaN($javainput);") float "$javainput"
    

    which would modify the calculate function to instead be generated as:

    public class example {
      ...
      public static boolean calculate(float first, float second) {
        example.CheckForNaN(first);
        example.CheckForNaN(second);
        {
          return exampleJNI.calculate(first, second);
        }
      }
    }
    

    See the Date marshalling example for an example using further "javain" typemap attributes.

    If we decide that what we actually want is a checked exception instead of a runtime exception, we can change this easily enough. The proxy method that uses float as an input, must then add the exception class to the throws clause. SWIG can handle this as it supports the 'throws' typemap attribute for specifying classes for the throws clause. Thus we can modify the pragma and the typemap for the throws clause:

    %typemap(javain, throws="java.lang.Exception") float "$module.CheckForNaN($javainput)"
    %pragma(java) modulecode=%{
      /** Simply returns the input value unless it is not a number,
          whereupon an exception is thrown. */
      static protected float CheckForNaN(float num) throws java.lang.Exception {
        if (Float.isNaN(num))
          throw new RuntimeException("Not a number");
        return num;
      }
    %}
    

    The calculate method now has a throws clause and even though the typemap is used twice for both float first and float second, the throws clause contains a single instance of java.lang.Exception:

    public class example {
      ...
    
      /** Simply returns the input value unless it is not a number,
          whereupon an exception is thrown. */
      static protected float CheckForNaN(float num) throws java.lang.Exception {
        if (Float.isNaN(num))
          throw new RuntimeException("Not a number");
        return num;
      }
    
      public static boolean calculate(float first, float second) throws java.lang.Exception {
        return exampleJNI.calculate(example.CheckForNaN(first), example.CheckForNaN(second));
      }
    }
    

    If we were a martyr to the JNI cause, we could replace the succinct code within the "javain" typemap with a few pages of JNI code. If we had, we would have put it in the "in" typemap which, like all JNI and Java typemaps, also supports the 'throws' attribute.

    26.10.4 Converting Java String arrays to char **

    A common problem in many C programs is the processing of command line arguments, which are usually passed in an array of NULL terminated strings. The following SWIG interface file allows a Java String array to be used as a char ** object.

    %module example
    
    /* This tells SWIG to treat char ** as a special case when used as a parameter
       in a function call */
    %typemap(in) char ** (jint size) {
      int i = 0;
      size = (*jenv)->GetArrayLength(jenv, $input);
      $1 = (char **) malloc((size+1)*sizeof(char *));
      /* make a copy of each string */
      for (i = 0; i<size; i++) {
        jstring j_string = (jstring)(*jenv)->GetObjectArrayElement(jenv, $input, i);
        const char * c_string = (*jenv)->GetStringUTFChars(jenv, j_string, 0);
        $1[i] = malloc((strlen(c_string)+1)*sizeof(char));
        strcpy($1[i], c_string);
        (*jenv)->ReleaseStringUTFChars(jenv, j_string, c_string);
        (*jenv)->DeleteLocalRef(jenv, j_string);
      }
      $1[i] = 0;
    }
    
    /* This cleans up the memory we malloc'd before the function call */
    %typemap(freearg) char ** {
      int i;
      for (i=0; i<size$argnum-1; i++)
        free($1[i]);
      free($1);
    }
    
    /* This allows a C function to return a char ** as a Java String array */
    %typemap(out) char ** {
      int i;
      int len=0;
      jstring temp_string;
      const jclass clazz = (*jenv)->FindClass(jenv, "java/lang/String");
    
      while ($1[len]) len++;
      jresult = (*jenv)->NewObjectArray(jenv, len, clazz, NULL);
      /* exception checking omitted */
    
      for (i=0; i<len; i++) {
        temp_string = (*jenv)->NewStringUTF(jenv, *result++);
        (*jenv)->SetObjectArrayElement(jenv, jresult, i, temp_string);
        (*jenv)->DeleteLocalRef(jenv, temp_string);
      }
    }
    
    /* These 3 typemaps tell SWIG what JNI and Java types to use */
    %typemap(jni) char ** "jobjectArray"
    %typemap(jtype) char ** "String[]"
    %typemap(jstype) char ** "String[]"
    
    /* These 2 typemaps handle the conversion of the jtype to jstype typemap type
       and vice versa */
    %typemap(javain) char ** "$javainput"
    %typemap(javaout) char ** {
        return $jnicall;
      }
    
    /* Now a few test functions */
    %inline %{
    
    int print_args(char **argv) {
      int i = 0;
      while (argv[i]) {
        printf("argv[%d] = %s\n", i, argv[i]);
        i++;
      }
      return i;
    }
    
    char **get_args() {
      static char *values[] = { "Dave", "Mike", "Susan", "John", "Michelle", 0};
      return &values[0];
    }
    
    %}
    

    Note that the 'C' JNI calling convention is used. Checking for any thrown exceptions after JNI function calls has been omitted. When this module is compiled, our wrapped C functions can be used by the following Java program:

    // File runme.java
    
    public class runme {
    
      static {
        try {
          System.loadLibrary("example");
        } catch (UnsatisfiedLinkError e) {
          System.err.println("Native code library failed to load. " + e);
          System.exit(1);
        }
      }
    
      public static void main(String argv[]) {
        String animals[] = {"Cat", "Dog", "Cow", "Goat"};
        example.print_args(animals);
        String args[] = example.get_args();
        for (int i=0; i<args.length; i++)
          System.out.println(i + ":" + args[i]);
      }
    }
    

    When compiled and run we get:

    $ java runme
    argv[0] = Cat
    argv[1] = Dog
    argv[2] = Cow
    argv[3] = Goat
    0:Dave
    1:Mike
    2:Susan
    3:John
    4:Michelle
    

    In the example, a few different typemaps are used. The "in" typemap is used to receive an input argument and convert it to a C array. Since dynamic memory allocation is used to allocate memory for the array, the "freearg" typemap is used to later release this memory after the execution of the C function. The "out" typemap is used for function return values. Lastly the "jni", "jtype" and "jstype" typemaps are also required to specify what Java types to use.

    26.10.5 Expanding a Java object to multiple arguments

    Suppose that you had a collection of C functions with arguments such as the following:

    int foo(int argc, char **argv);
    

    In the previous example, a typemap was written to pass a Java String array as the char **argv. This allows the function to be used from Java as follows:

    example.foo(4, new String[]{"red", "green", "blue", "white"});
    

    Although this works, it's a little awkward to specify the argument count. To fix this, a multi-argument typemap can be defined. This is not very difficult--you only have to make slight modifications to the previous example's typemaps:

    %typemap(in) (int argc, char **argv) {
      int i = 0;
      $1 = (*jenv)->GetArrayLength(jenv, $input);
      $2 = (char **) malloc(($1+1)*sizeof(char *));
      /* make a copy of each string */
      for (i = 0; i<$1; i++) {
        jstring j_string = (jstring)(*jenv)->GetObjectArrayElement(jenv, $input, i);
        const char * c_string = (*jenv)->GetStringUTFChars(jenv, j_string, 0);
        $2[i] = malloc((strlen(c_string)+1)*sizeof(char));
        strcpy($2[i], c_string);
        (*jenv)->ReleaseStringUTFChars(jenv, j_string, c_string);
        (*jenv)->DeleteLocalRef(jenv, j_string);
      }
      $2[i] = 0;
    }
    
    %typemap(freearg) (int argc, char **argv) {
      int i;
      for (i=0; i<$1-1; i++)
        free($2[i]);
      free($2);
    }
    
    %typemap(jni) (int argc, char **argv) "jobjectArray"
    %typemap(jtype) (int argc, char **argv) "String[]"
    %typemap(jstype) (int argc, char **argv) "String[]"
    
    %typemap(javain) (int argc, char **argv) "$javainput"
    

    When writing a multiple-argument typemap, each of the types is referenced by a variable such as $1 or $2. The typemap code simply fills in the appropriate values from the supplied Java parameter.

    With the above typemap in place, you will find it no longer necessary to supply the argument count. This is automatically set by the typemap code. For example:

    example.foo(new String[]{"red", "green", "blue", "white"});
    

    26.10.6 Using typemaps to return arguments

    A common problem in some C programs is that values may be returned in function parameters rather than in the return value of a function. The typemaps.i file defines INPUT, OUTPUT and INOUT typemaps which can be used to solve some instances of this problem. This library file uses an array as a means of moving data to and from Java when wrapping a C function that takes non const pointers or non const references as parameters.

    Now we are going to outline an alternative approach to using arrays for C pointers. The INOUT typemap uses a double[] array for receiving and returning the double* parameters. In this approach we are able to use a Java class myDouble instead of double[] arrays where the C pointer double* is required.

    Here is our example function:

    /* Returns a status value and two values in out1 and out2 */
    int spam(double a, double b, double *out1, double *out2);
    

    If we define a structure MyDouble containing a double member variable and use some typemaps we can solve this problem. For example we could put the following through SWIG:

    %module example
    
    /* Define a new structure to use instead of double * */
    %inline %{
    typedef struct {
      double value;
    } MyDouble;
    %}
    
    
    %{
    /* Returns a status value and two values in out1 and out2 */
    int spam(double a, double b, double *out1, double *out2) {
      int status = 1;
      *out1 = a*10.0;
      *out2 = b*100.0;
      return status;
    }
    %}
    
    /* 
    This typemap will make any double * function parameters with name OUTVALUE take an
    argument of MyDouble instead of double *. This will 
    allow the calling function to read the double * value after returning from the function.
    */
    %typemap(in) double *OUTVALUE {
      jclass clazz = jenv->FindClass("MyDouble");
      jfieldID fid = jenv->GetFieldID(clazz, "swigCPtr", "J");
      jlong cPtr = jenv->GetLongField($input, fid);
      MyDouble *pMyDouble = NULL;
      *(MyDouble **)&pMyDouble = *(MyDouble **)&cPtr;
      $1 = &pMyDouble->value;
    }
    
    %typemap(jtype) double *OUTVALUE "MyDouble"
    %typemap(jstype) double *OUTVALUE "MyDouble"
    %typemap(jni) double *OUTVALUE "jobject"
    
    %typemap(javain) double *OUTVALUE "$javainput"
    
    /* Now we apply the typemap to the named variables */
    %apply double *OUTVALUE { double *out1, double *out2 };
    int spam(double a, double b, double *out1, double *out2);
    

    Note that the C++ JNI calling convention has been used this time and so must be compiled as C++ and the -c++ commandline must be passed to SWIG. JNI error checking has been omitted for clarity.

    What the typemaps do are make the named double* function parameters use our new MyDouble wrapper structure. The "in" typemap takes this structure, gets the C++ pointer to it, takes the double value member variable and passes it to the C++ spam function. In Java, when the function returns, we use the SWIG created getValue() function to get the output value. The following Java program demonstrates this:

    // File: runme.java
    
    public class runme {
    
      static {
        try {
          System.loadLibrary("example");
        } catch (UnsatisfiedLinkError e) {
          System.err.println("Native code library failed to load. " + e);
          System.exit(1);
        }
      }
    
      public static void main(String argv[]) {
        MyDouble out1 = new MyDouble();
        MyDouble out2 = new MyDouble();
        int ret = example.spam(1.2, 3.4, out1, out2);
        System.out.println(ret + "  " + out1.getValue() + "  " + out2.getValue());
      }
    }
    

    When compiled and run we get:

    $ java runme
    1 12.0  340.0
    

    26.10.7 Adding Java downcasts to polymorphic return types

    SWIG support for polymorphism works in that the appropriate virtual function is called. However, the default generated code does not allow for downcasting. Let's examine this with the following code:

    %include "std_string.i"
    
    #include <iostream>
    using namespace std;
    class Vehicle {
    public:
      virtual void start() = 0;
    ...
    };
    
    class Ambulance : public Vehicle {
      string vol;
    public:
      Ambulance(string volume) : vol(volume) {}
      virtual void start() {
        cout << "Ambulance started" << endl;
      }
      void sound_siren() {
        cout << vol << " siren sounded!" << endl;
      }
    ...
    };
    
    Vehicle *vehicle_factory() {
      return new Ambulance("Very loud");
    }
    

    If we execute the following Java code:

    Vehicle vehicle = example.vehicle_factory();
    vehicle.start();
    
    Ambulance ambulance = (Ambulance)vehicle;
    ambulance.sound_siren();
    

    We get:

    Ambulance started
    java.lang.ClassCastException
            at runme.main(runme.java:16)
    

    Even though we know from examination of the C++ code that vehicle_factory returns an object of type Ambulance, we are not able to use this knowledge to perform the downcast in Java. This occurs because the runtime type information is not completely passed from C++ to Java when returning the type from vehicle_factory(). Usually this is not a problem as virtual functions do work by default, such as in the case of start(). There are a few solutions to getting downcasts to work.

    The first is not to use a Java cast but a call to C++ to make the cast. Add this to your code:

    %exception Ambulance::dynamic_cast(Vehicle *vehicle) {
      $action
        if (!result) {
          jclass excep = jenv->FindClass("java/lang/ClassCastException");
          if (excep) {
            jenv->ThrowNew(excep, "dynamic_cast exception");
          }
        }
    }
    %extend Ambulance {
      static Ambulance *dynamic_cast(Vehicle *vehicle) {
        return dynamic_cast<Ambulance *>(vehicle);
      }
    };
    

    It would then be used from Java like this

    Ambulance ambulance = Ambulance.dynamic_cast(vehicle);
    ambulance.sound_siren();
    

    Should vehicle not be of type ambulance then a Java ClassCastException is thrown. The next solution is a purer solution in that Java downcasts can be performed on the types. Add the following before the definition of vehicle_factory:

    %typemap(out) Vehicle * {
      Ambulance *downcast = dynamic_cast<Ambulance *>($1);
      *(Ambulance **)&$result = downcast;
    }
    
    %typemap(javaout) Vehicle * {
        return new Ambulance($jnicall, $owner);
      }
    

    Here we are using our knowledge that vehicle_factory always returns type Ambulance so that the Java proxy is created as a type Ambulance. If vehicle_factory can manufacture any type of Vehicle and we want to be able to downcast using Java casts for any of these types, then a different approach is needed. Consider expanding our example with a new Vehicle type and a more flexible factory function:

    class FireEngine : public Vehicle {
    public:
      FireEngine() {}
      virtual void start() {
        cout << "FireEngine started" << endl;
      }
      void roll_out_hose() {
        cout << "Hose rolled out" << endl;
      }
      ...
    };
    Vehicle *vehicle_factory(int vehicle_number) {
      if (vehicle_number == 0)
        return new Ambulance("Very loud");
      else
        return new FireEngine();
    }
    

    To be able to downcast with this sort of Java code:

    FireEngine fireengine = (FireEngine)example.vehicle_factory(1);
    fireengine.roll_out_hose();
    Ambulance ambulance = (Ambulance)example.vehicle_factory(0);
    ambulance.sound_siren();
    

    the following typemaps targeted at the vehicle_factory function will achieve this. Note that in this case, the Java class is constructed using JNI code rather than passing a pointer across the JNI boundary in a Java long for construction in Java code.

    %typemap(jni) Vehicle *vehicle_factory "jobject"
    %typemap(jtype) Vehicle *vehicle_factory "Vehicle"
    %typemap(jstype) Vehicle *vehicle_factory "Vehicle"
    %typemap(javaout) Vehicle *vehicle_factory {
        return $jnicall;
      }
    
    %typemap(out) Vehicle *vehicle_factory {
      Ambulance *ambulance = dynamic_cast<Ambulance *>($1);
      FireEngine *fireengine = dynamic_cast<FireEngine *>($1);
      if (ambulance) {
        // call the Ambulance(long cPtr, boolean cMemoryOwn) constructor
        jclass clazz = jenv->FindClass("Ambulance");
        if (clazz) {
          jmethodID mid = jenv->GetMethodID(clazz, "<init>", "(JZ)V");
          if (mid) {
            jlong cptr = 0;
            *(Ambulance **)&cptr = ambulance;
            $result = jenv->NewObject(clazz, mid, cptr, false);
          }
        }
      } else if (fireengine) {
        // call the FireEngine(long cPtr, boolean cMemoryOwn) constructor
        jclass clazz = jenv->FindClass("FireEngine");
        if (clazz) {
          jmethodID mid = jenv->GetMethodID(clazz, "<init>", "(JZ)V");
          if (mid) {
            jlong cptr = 0;
            *(FireEngine **)&cptr = fireengine;
            $result = jenv->NewObject(clazz, mid, cptr, false);
          }
        }
      }
      else {
        cout << "Unexpected type " << endl;
      }
    
      if (!$result)
        cout << "Failed to create new java object" << endl;
    }
    

    Better error handling would need to be added into this code. There are other solutions to this problem, but this last example demonstrates some more involved JNI code. SWIG usually generates code which constructs the proxy classes using Java code as it is easier to handle error conditions and is faster. Note that the JNI code above uses a number of string lookups to call a constructor, whereas this would not occur using byte compiled Java code.

    26.10.8 Adding an equals method to the Java classes

    When a pointer is returned from a JNI function, it is wrapped using a new Java proxy class or type wrapper class. Even when the pointers are the same, it will not be possible to know that the two Java classes containing those pointers are actually the same object. It is common in Java to use the equals() method to check whether two objects are equivalent. The equals() method is usually accompanied by a hashCode() method in order to fulfill the requirement that the hash code is equal for equal objects. Pure Java code methods like these can be easily added:

    %typemap(javacode) SWIGTYPE %{
      public boolean equals(Object obj) {
        boolean equal = false;
        if (obj instanceof $javaclassname)
          equal = ((($javaclassname)obj).swigCPtr == this.swigCPtr);
        return equal;
      }
      public int hashCode() {
        return (int)getPointer();
      }
    %}
    
    class Foo { };
    Foo* returnFoo(Foo *foo) { return foo; }
    

    The following would display false without the javacode typemap above. With the typemap defining the equals method the result is true.

    Foo foo1 = new Foo();
    Foo foo2 = example.returnFoo(foo1);
    System.out.println("foo1? " + foo1.equals(foo2));
    

    26.10.9 Void pointers and a common Java base class

    One might wonder why the common code that SWIG emits for the proxy and type wrapper classes is not pushed into a base class. The reason is that although swigCPtr could be put into a common base class for all classes wrapping C structures, it would not work for C++ classes involved in an inheritance chain. Each class derived from a base needs a separate swigCPtr because C++ compilers sometimes use a different pointer value when casting a derived class to a base. Additionally as Java only supports single inheritance, it would not be possible to derive wrapped classes from your own pure Java classes if the base class has been 'used up' by SWIG. However, you may want to move some of the common code into a base class. Here is an example which uses a common base class for all proxy classes and type wrapper classes:

    %typemap(javabase) SWIGTYPE, SWIGTYPE *, SWIGTYPE &, SWIGTYPE [], 
                                                             SWIGTYPE (CLASS::*) "SWIG"
    
    %typemap(javacode) SWIGTYPE, SWIGTYPE *, SWIGTYPE &, SWIGTYPE [], 
                                                             SWIGTYPE (CLASS::*) %{
      protected long getPointer() {
        return swigCPtr;
      }
    %}
    

    Define new base class called SWIG:

    public abstract class SWIG {
      protected abstract long getPointer();
    
      public boolean equals(Object obj) {
        boolean equal = false;
        if (obj instanceof SWIG)
          equal = (((SWIG)obj).getPointer() == this.getPointer());
        return equal;
      }
      
      SWIGTYPE_p_void getVoidPointer() {
        return new SWIGTYPE_p_void(getPointer(), false);
      }
    }
    

    This example contains some useful functionality which you may want in your code.

    • It has an equals() method. Unlike the previous example, the method code isn't replicated in all classes.
    • It also has a function which effectively implements a cast from the type of the proxy/type wrapper class to a void pointer. This is necessary for passing a proxy class or a type wrapper class to a function that takes a void pointer.

    26.10.10 Struct pointer to pointer

    Pointers to pointers are often used as output parameters in C factory type functions. These are a bit more tricky to handle. Consider the following situation where a Butler can be hired and fired:

    typedef struct {
      int hoursAvailable;
      char *greeting;
    } Butler;
    
    // Note: HireButler will allocate the memory 
    // The caller must free the memory by calling FireButler()!!
    extern int HireButler(Butler **ppButler);
    extern void FireButler(Butler *pButler);
    

    C code implementation:

    int HireButler(Butler **ppButler) {
      Butler *pButler = (Butler *)malloc(sizeof(Butler));
      pButler->hoursAvailable = 24;
      pButler->greeting = (char *)malloc(32);
      strcpy(pButler->greeting, "At your service Sir");
      *ppButler = pButler;
      return 1;
    }
    void FireButler(Butler *pButler) {
      free(pButler->greeting);
      free(pButler);
    }
    

    Let's take two approaches to wrapping this code. The first is to provide a functional interface, much like the original C interface. The following Java code shows how we intend the code to be used:

    Butler jeeves = new Butler();
    example.HireButler(jeeves);
    System.out.println("Greeting:     " + jeeves.getGreeting());
    System.out.println("Availability: " + jeeves.getHoursAvailable() + " hours per day");
    example.FireButler(jeeves);
    

    Resulting in the following output when run:

    Greeting:     At your service Sir
    Availability: 24 hours per day
    

    Note the usage is very much like it would be used if we were writing C code, that is, explicit memory management is needed. No C memory is allocated in the construction of the Butler proxy class and the proxy class will not destroy the underlying C memory when it is collected. A number of typemaps and features are needed to implement this approach. The following interface file code should be placed before SWIG parses the above C code.

    %module example
    
    // Do not generate the default proxy constructor or destructor
    %nodefaultctor Butler;
    %nodefaultdtor Butler;
    
    // Add in pure Java code proxy constructor
    %typemap(javacode) Butler %{
      /** This constructor creates the proxy which initially does not create nor own any C memory */
      public Butler() {
        this(0, false);
      }
    %}
    
    // Type typemaps for marshalling Butler **
    %typemap(jni) Butler ** "jobject"
    %typemap(jtype) Butler ** "Butler"
    %typemap(jstype) Butler ** "Butler"
    
    // Typemaps for Butler ** as a parameter output type
    %typemap(in) Butler ** (Butler *ppButler = 0) %{
      $1 = &ppButler;
    %}
    %typemap(argout) Butler ** {
      // Give Java proxy the C pointer (of newly created object)
      jclass clazz = (*jenv)->FindClass(jenv, "Butler");
      jfieldID fid = (*jenv)->GetFieldID(jenv, clazz, "swigCPtr", "J");
      jlong cPtr = 0;
      *(Butler **)&cPtr = *$1;
      (*jenv)->SetLongField(jenv, $input, fid, cPtr);
    }
    %typemap(javain) Butler ** "$javainput"
    

    Note that the JNI code sets the proxy's swigCPtr member variable to point to the newly created object. The swigCMemOwn remains unchanged (at false), so that the proxy does not own the memory.

    Note: The old %nodefault directive disabled the default constructor and destructor at the same time. This is unsafe in most of the cases, and you can use the explicit %nodefaultctor and %nodefaultdtor directives to achieve the same result if needed.

    The second approach offers a more object oriented interface to the Java user. We do this by making the Java proxy class's constructor call the HireButler() method to create the underlying C object. Additionally we get the proxy to take ownership of the memory so that the finalizer will call the FireButler() function. The proxy class will thus take ownership of the memory and clean it up when no longer needed. We will also prevent the user from being able to explicitly call the HireButler() and FireButler() functions. Usage from Java will simply be:

    Butler jeeves = new Butler();
    System.out.println("Greeting:     " + jeeves.getGreeting());
    System.out.println("Availability: " + jeeves.getHoursAvailable() + " hours per day");
    

    Note that the Butler class is used just like any other Java class and no extra coding by the user needs to be written to clear up the underlying C memory as the finalizer will be called by the garbage collector which in turn will call the FireButler() function. To implement this, we use the above interface file code but remove the javacode typemap and add the following:

    // Don't expose the memory allocation/de-allocation functions
    %ignore FireButler(Butler *pButler);
    %ignore HireButler(Butler **ppButler);
    
    // Add in a custom proxy constructor and destructor
    %extend Butler {
      Butler() {
        Butler *pButler = 0;
        HireButler(&pButler);
        return pButler;
      }
      ~Butler() {
        FireButler($self);
      }
    }
    

    Note that the code in %extend is using a C++ type constructor and destructor, yet the generated code will still compile as C code, see Adding member functions to C structures. The C functional interface has been completely morphed into an object-oriented interface and the Butler class would behave much like any pure Java class and feel more natural to Java users.

    26.10.11 Memory management when returning references to member variables

    This example shows how to prevent premature garbage collection of objects when the underlying C++ class returns a pointer or reference to a member variable.

    Consider the following C++ code:

    struct Wheel {
      int size;
      Wheel(int sz = 0) : size(sz) {}
    };
    
    class Bike {
      Wheel wheel;
    public:
      Bike(int val) : wheel(val) {}
      Wheel& getWheel() { return wheel; }
    };
    

    and the following usage from Java after running the code through SWIG:

    Wheel wheel = new Bike(10).getWheel();
    System.out.println("wheel size: " + wheel.getSize());
    // Simulate a garbage collection
    System.gc();
    System.runFinalization();
    System.out.println("wheel size: " + wheel.getSize());
    

    Don't be surprised that if the resulting output gives strange results such as...

    wheel size: 10
    wheel size: 135019664
    

    What has happened here is the garbage collector has collected the Bike instance as it doesn't think it is needed any more. The proxy instance, wheel, contains a reference to memory that was deleted when the Bike instance was collected. In order to prevent the garbage collector from collecting the Bike instance a reference to the Bike must be added to the wheel instance. You can do this by adding the reference when the getWheel() method is called using the following typemaps.

    %typemap(javacode) Wheel %{
      // Ensure that the GC doesn't collect any Bike instance set from Java
      private Bike bikeReference;
      protected void addReference(Bike bike) {
        bikeReference = bike;
      }
    %}
    
    // Add a Java reference to prevent premature garbage collection and resulting use
    // of dangling C++ pointer. Intended for methods that return pointers or
    // references to a member variable.
    %typemap(javaout) Wheel& getWheel {
      long cPtr = $jnicall;
      $javaclassname ret = null;
      if (cPtr != 0) {
        ret = new $javaclassname(cPtr, $owner);
        ret.addReference(this);
      }
      return ret;
      }
    

    The code in the first typemap gets added to the Wheel proxy class. The code in the second typemap constitutes the bulk of the code in the generated getWheel() function:

    public class Wheel {
      ...
      // Ensure that the GC doesn't collect any bike set from Java 
      private Bike bikeReference;
      protected void addReference(Bike bike) {
        bikeReference = bike;
      }
    }
    
    public class Bike {
      ...
      public Wheel getWheel() {
        long cPtr = exampleJNI.Bike_getWheel(swigCPtr, this);
        Wheel ret = null;
        if (cPtr != 0) {
          ret = new Wheel(cPtr, false);
          ret.addReference(this);
        }
        return ret;
      }
    }
    

    Note the addReference call.

    26.10.12 Memory management for objects passed to the C++ layer

    Managing memory can be tricky when using C++ and Java proxy classes. The previous example shows one such case and this example looks at memory management for a class passed to a C++ method which expects the object to remain in scope after the function has returned. Consider the following two C++ classes:

    struct Element {
      int value;
      Element(int val) : value(val) {}
    };
    class Container {
      Element* element;
    public:
      Container() : element(0) {}
      void setElement(Element* e) { element = e; }
      Element* getElement() { return element; }
    };
    

    and usage from C++

    Container container;
    Element element(20);
    container.setElement(&element);
    cout << "element.value: " << container.getElement()->value << endl;
    

    and more or less equivalent usage from Java

    Container container = new Container();
    container.setElement(new Element(20));
    System.out.println("element value: " + container.getElement().getValue());
    

    The C++ code will always print out 20, but the value printed out may not be this in the Java equivalent code. In order to understand why, consider a garbage collection occurring...

    Container container = new Container();
    container.setElement(new Element(20));
    // Simulate a garbage collection
    System.gc();
    System.runFinalization();
    System.out.println("element value: " + container.getElement().getValue());
    

    The temporary element created with new Element(20) could get garbage collected which ultimately means the container variable is holding a dangling pointer, thereby printing out any old random value instead of the expected value of 20. One solution is to add in the appropriate references in the Java layer...

    public class Container {
    
      ...
    
      // Ensure that the GC doesn't collect any Element set from Java
      // as the underlying C++ class stores a shallow copy
      private Element elementReference;
    
      public void setElement(Element e) {
        exampleJNI.Container_setElement(swigCPtr, this, Element.getCPtr(e), e);
        elementReference = e;
      }
    }
    

    The following typemaps can be used to generate this code:

    %typemap(javacode) Container %{
      // Ensure that the GC doesn't collect any element set from Java
      // as the underlying C++ class stores a shallow copy
      private Element elementReference;
    %}
    
    %typemap(javain, 
             post="      elementReference = $javainput;"
             ) Element *e "Element.getCPtr($javainput)"
    

    The 'javacode' typemap simply adds in the specified code into the Java proxy class. The 'javain' typemap matches the input parameter type and name for the setElement method and the 'post' typemap attribute allows adding code after the JNI call. The 'post' code is generated into a finally block after the JNI call so the resulting code isn't quite as mentioned earlier, setElement is actually:

      public void setElement(Element e) {
        try {
          exampleJNI.Container_setElement(swigCPtr, this, Element.getCPtr(e), e);
        } finally {
          elementReference = e;
        }
      }
    

    26.10.13 Date marshalling using the javain typemap and associated attributes

    The NaN Exception example is a simple example of the "javain" typemap and its 'pre' attribute. This example demonstrates how a C++ date class, say CDate, can be mapped onto the standard Java date class, java.util.GregorianCalendar by using the 'pre', 'post' and 'pgcppname' attributes of the "javain" typemap. The idea is that the GregorianCalendar is used wherever the C++ API uses a CDate . Let's assume the code being wrapped is as follows:

    class CDate {
    public:
      CDate(int year, int month, int day);
      int getYear();
      int getMonth();
      int getDay();
      ...
    };
    struct Action {
      static int doSomething(const CDate &dateIn, CDate &dateOut);
      Action(const CDate &date, CDate &dateOut);
    };
    

    Note that dateIn is const and therefore read only and dateOut is a non-const output type.

    First let's look at the code that is generated by default, where the Java proxy class CDate is used in the proxy interface:

    public class Action {
      ...
      public static int doSomething(CDate dateIn, CDate dateOut) {
        return exampleJNI.Action_doSomething(CDate.getCPtr(dateIn), dateIn, 
                                             CDate.getCPtr(dateOut), dateOut);
      }
    
      public Action(CDate date, CDate dateOut) {
        this(exampleJNI.new_Action(CDate.getCPtr(date), date, 
                                   CDate.getCPtr(dateOut), dateOut), true);
      }
    }
    

    The CDate & and const CDate & Java code is generated from the following two default typemaps:

    %typemap(jstype) SWIGTYPE & "$javaclassname"
    %typemap(javain) SWIGTYPE & "$javaclassname.getCPtr($javainput)"
    

    where '$javaclassname' is translated into the proxy class name, CDate and '$javainput' is translated into the name of the parameter, eg dateIn. From Java, the intention is then to call into a modified API with something like:

    java.util.GregorianCalendar calendarIn = 
      new java.util.GregorianCalendar(2011, java.util.Calendar.APRIL, 13, 0, 0, 0);
    java.util.GregorianCalendar calendarOut = new java.util.GregorianCalendar();
    
    // Note in calls below, calendarIn remains unchanged and calendarOut 
    // is set to a new value by the C++ call
    Action.doSomething(calendarIn, calendarOut);
    Action action = new Action(calendarIn, calendarOut);
    

    To achieve this mapping, we need to alter the default code generation slightly so that at the Java layer, a GregorianCalendar is converted into a CDate. The JNI intermediary layer will still take a pointer to the underlying CDate class. The typemaps to achieve this are shown below.

    %typemap(jstype) const CDate& "java.util.GregorianCalendar"
    %typemap(javain, 
             pre="    CDate temp$javainput = new CDate($javainput.get(java.util.Calendar.YEAR), "
                 "$javainput.get(java.util.Calendar.MONTH), $javainput.get(java.util.Calendar.DATE));", 
             pgcppname="temp$javainput") const CDate &
             "$javaclassname.getCPtr(temp$javainput)"
    
    %typemap(jstype) CDate& "java.util.Calendar"
    %typemap(javain, 
             pre="    CDate temp$javainput = new CDate($javainput.get(java.util.Calendar.YEAR), "
                 "$javainput.get(java.util.Calendar.MONTH), $javainput.get(java.util.Calendar.DATE));", 
             post="      $javainput.set(temp$javainput.getYear(), temp$javainput.getMonth(), "
                  "temp$javainput.getDay(), 0, 0, 0);", 
             pgcppname="temp$javainput") CDate &
             "$javaclassname.getCPtr(temp$javainput)"
    

    The resulting generated proxy code in the Action class follows:

    public class Action {
      ...
      public static int doSomething(java.util.GregorianCalendar dateIn, 
                                    java.util.Calendar dateOut) {
        CDate tempdateIn = new CDate(dateIn.get(java.util.Calendar.YEAR), 
                                     dateIn.get(java.util.Calendar.MONTH), 
                                     dateIn.get(java.util.Calendar.DATE));
        CDate tempdateOut = new CDate(dateOut.get(java.util.Calendar.YEAR), 
                                      dateOut.get(java.util.Calendar.MONTH), 
                                      dateOut.get(java.util.Calendar.DATE));
        try {
          return exampleJNI.Action_doSomething(CDate.getCPtr(tempdateIn), tempdateIn, 
                                               CDate.getCPtr(tempdateOut), tempdateOut);
        } finally {
          dateOut.set(tempdateOut.getYear(), tempdateOut.getMonth(), tempdateOut.getDay(), 0, 0, 0);
        }
      }
    
      static private long SwigConstructAction(java.util.GregorianCalendar date, 
                                              java.util.Calendar dateOut) {
        CDate tempdate = new CDate(date.get(java.util.Calendar.YEAR), 
                                   date.get(java.util.Calendar.MONTH), 
                                   date.get(java.util.Calendar.DATE));
        CDate tempdateOut = new CDate(dateOut.get(java.util.Calendar.YEAR), 
                                      dateOut.get(java.util.Calendar.MONTH), 
                                      dateOut.get(java.util.Calendar.DATE));
        try {
          return exampleJNI.new_Action(CDate.getCPtr(tempdate), tempdate, 
                                       CDate.getCPtr(tempdateOut), tempdateOut);
        } finally {
          dateOut.set(tempdateOut.getYear(), tempdateOut.getMonth(), tempdateOut.getDay(), 0, 0, 0);
        }
      }
    
      public Action(java.util.GregorianCalendar date, java.util.Calendar dateOut) {
        this(Action.SwigConstructAction(date, dateOut), true);
      }
    }
    

    A few things to note:

    • The "javatype" typemap has changed the parameter type to java.util.GregorianCalendar or java.util.Calendar instead of the default generated CDate proxy.
    • The code in the 'pre' attribute appears before the JNI call ( exampleJNI.new_Action / exampleJNI.Action_doSomething).
    • The code in the 'post' attribute appears after the JNI call.
    • A try .. finally block is generated with the JNI call in the try block and 'post' code in the finally block. The alternative of just using a temporary variable for the return value from the JNI call and the 'post' code being generated before the return statement is not possible given that the JNI call is in one line and comes from the "javaout" typemap.
    • The temporary variables in the "javain" typemaps are called temp$javain, where "$javain" is replaced with the parameter name. "$javain" is used to mangle the variable name so that more than one CDate & type can be used as a parameter in a method, otherwise two or more local variables with the same name would be generated.
    • The use of the "javain" typemap causes a constructor helper function (SwigConstructAction) to be generated. This allows Java code to be called before the JNI call and is required as the Java compiler won't compile code inserted before the 'this' call.
    • The 'pgcppname' attribute is used to modify the object being passed as the premature garbage collection prevention parameter (the 2nd and 4th parameters in the JNI calls).

    26.11 Living with Java Directors

    This section is intended to address frequently asked questions and frequently encountered problems when using Java directors.

    1. When my program starts up, it complains that method_foo cannot be found in a Java method called swig_module_init. How do I fix this?

      Open up the C++ wrapper source code file and look for "method_foo" (include the double quotes, they are important!) Look at the JNI field descriptor and make sure that each class that occurs in the descriptor has the correct package name in front of it. If the package name is incorrect, put a "javapackage" typemap in your SWIG interface file.

    2. I'm compiling my code and I'm using templates. I provided a javapackage typemap, but SWIG doesn't generate the right JNI field descriptor.

      Use the template's renamed name as the argument to the "javapackage" typemap:

      %typemap(javapackage)  std::vector<int>  "your.package.here"
      %template(VectorOfInt) std::vector<int>;
      
    3. When I pass class pointers or references through a C++ upcall and I try to type cast them, Java complains with a ClassCastException. What am I doing wrong?

      Normally, a non-director generated Java proxy class creates temporary Java objects as follows:

      public static void MyClass_method_upcall(MyClass self, long jarg1)
      {
        Foo darg1 = new Foo(jarg1, false);
      
        self.method_upcall(darg1);
      }
      

      Unfortunately, this loses the Java type information that is part of the underlying Foo director proxy class's Java object pointer causing the type cast to fail. The SWIG Java module's director code attempts to correct the problem, but only for director-enabled classes, since the director class retains a global reference to its Java object. Thus, for director-enabled classes and only for director-enabled classes, the generated proxy Java code looks something like:

      public static void MyClass_method_upcall(MyClass self, long jarg1,
                                               Foo jarg1_object)
      {
        Foo darg1 = (jarg1_object != null ? jarg1_object : new Foo(jarg1, false));
      
        self.method_upcall(darg1);
      }
      

      When you import a SWIG interface file containing class definitions, the classes you want to be director-enabled must be have the feature("director") enabled for type symmetry to work. This applies even when the class being wrapped isn't a director-enabled class but takes parameters that are director-enabled classes.

      The current "type symmetry" design will work for simple C++ inheritance, but will most likely fail for anything more complicated such as tree or diamond C++ inheritance hierarchies. Those who are interested in challenging problems are more than welcome to hack the Java::Java_director_declaration method in Source/Modules/java.cxx.

      If all else fails, you can use the downcastXXXXX() method to attempt to recover the director class's Java object pointer. For the Java Foo proxy class, the Foo director class's java object pointer can be accessed through the javaObjectFoo() method. The generated method's signature is:

        public static Foo javaObjectFoo(Foo obj);
      

      From your code, this method is invoked as follows:

      public class MyClassDerived {
        public void method_upcall(Foo foo_object)
        {
          FooDerived    derived = (foo_object != null ?
                       (FooDerived) Foo.downcastFoo(foo_object) : null);
          /* rest of your code here */
        }
      }
      

      An good approach for managing downcasting is placing a static method in each derived class that performs the downcast from the superclass, e.g.,

      public class FooDerived extends Foo {
        /* ... */
        public static FooDerived downcastFooDerived(Foo foo_object)
        {
          try {
            return foo_object != null ? (FooDerived) Foo.downcastFoo(foo_object);
          }
      
          catch (ClassCastException exc) {
            // Wasn't a FooDerived object, some other subclass of Foo
            return null;
          }
        }
      }
      

      Then change the code in MyClassDerived as follows:

      public class MyClassDerived extends MyClass {
        /* ... */
        public void method_upcall(Foo foo_object)
        {
          FooDerived    derived = FooDerived.downcastFooDerived(foo_object);
          /* rest of your code here */
        }
      }
      
    4. Why isn't the proxy class declared abstract? Why aren't the director upcall methods in the proxy class declared abstract?

      Declaring the proxy class and its methods abstract would break the JNI argument marshalling and SWIG's downcall functionality (going from Java to C++.) Create an abstract Java subclass that inherits from the director-enabled class instead. Using the previous Foo class example:

      public abstract class UserVisibleFoo extends Foo {
        /** Make sure user overrides this method, it's where the upcall
         * happens.
         */
        public abstract void method_upcall(Foo foo_object);
      
        /// Downcast from Foo to UserVisibleFoo
        public static UserVisibleFoo downcastUserVisibleFoo(Foo foo_object)
        {
          try {
            return foo_object != null ? (FooDerived) Foo.downcastFoo(foo_object) : null;
          } catch (ClassCastException exc) {
            // Wasn't a FooDerived object, some other subclass of Foo
            return null;
          }
        }
      }
      

      This doesn't prevent the user from creating subclasses derived from Foo, however, UserVisibleFoo provides the safety net that reminds the user to override the method_upcall() method.

    26.12 Odds and ends

    26.12.1 JavaDoc comments

    The SWIG documentation system is currently deprecated. When it is resurrected JavaDoc comments will be fully supported. If you can't wait for the full documentation system a couple of workarounds are available. The %javamethodmodifiers feature can be used for adding proxy class method comments and module class method comments. The "javaimports" typemap can be hijacked for adding in proxy class JavaDoc comments. The jniclassimports or jniclassclassmodifiers pragmas can also be used for adding intermediary JNI class comments and likewise the moduleimports or moduleclassmodifiers pragmas for the module class. Here is an example adding in a proxy class and method comment:

    %javamethodmodifiers Barmy::lose_marbles() "
      /**
        * Calling this method will make you mad.
        * Use with <b>utmost</b> caution. 
        */
      public";
    
    %typemap(javaimports) Barmy "
    /** The crazy class. Use as a last resort. */"
    
    class Barmy {
    public:
      void lose_marbles() {}
    };
    

    Note the "public" added at the end of the %javamethodmodifiers as this is the default for this feature. The generated proxy class with JavaDoc comments is then as follows:

    /** The crazy class. Use as a last resort. */
    public class Barmy {
    ...
      /**
        * Calling this method will make you mad.
        * Use with <b>utmost</b> caution. 
        */
      public void lose_marbles() {
        ...
      }
    ...
    }
    

    26.12.2 Functional interface without proxy classes

    It is possible to run SWIG in a mode that does not produce proxy classes by using the -noproxy commandline option. The interface is rather primitive when wrapping structures or classes and is accessed through function calls to the module class. All the functions in the module class are wrapped by functions with identical names as those in the intermediary JNI class.

    Consider the example we looked at when examining proxy classes:

    class Foo {
    public:
      int x;
      int spam(int num, Foo* foo);
    };
    

    When using -noproxy, type wrapper classes are generated instead of proxy classes. Access to all the functions and variables is through a C like set of functions where the first parameter passed is the pointer to the class, that is an instance of a type wrapper class. Here is what the module class looks like:

    public class example {
      public static void Foo_x_get(SWIGTYPE_p_Foo self, int x) {...}
      public static int Foo_x_get(SWIGTYPE_p_Foo self) {...}
      public static int Foo_spam(SWIGTYPE_p_Foo self, int num, SWIGTYPE_p_Foo foo) {...}
      public static SWIGTYPE_p_Foo new_Foo() {...}
      public static void delete_Foo(SWIGTYPE_p_Foo self) {...}
    }
    

    This approach is not nearly as natural as using proxy classes as the functions need to be used like this:

    SWIGTYPE_p_Foo foo = example.new_Foo();
    example.Foo_x_set(foo, 10);
    int var = example.Foo_x_get(foo);
    example.Foo_spam(foo, 20, foo);
    example.delete_Foo(foo);
    

    Unlike proxy classes, there is no attempt at tracking memory. All destructors have to be called manually for example the delete_Foo(foo) call above.

    26.12.3 Using your own JNI functions

    You may have some hand written JNI functions that you want to use in addition to the SWIG generated JNI functions. Adding these to your SWIG generated package is possible using the %native directive. If you don't want SWIG to wrap your JNI function then of course you can simply use the %ignore directive. However, if you want SWIG to generate just the Java code for a JNI function then use the %native directive. The C types for the parameters and return type must be specified in place of the JNI types and the function name must be the native method name. For example:

    %native (HandRolled) void HandRolled(int, char *);
    %{
    JNIEXPORT void JNICALL Java_packageName_moduleName_HandRolled(JNIEnv *, jclass,
                                                                  jlong, jstring);
    %}
    

    No C JNI function will be generated and the Java_packageName_moduleName_HandRolled function will be accessible using the SWIG generated Java native method call in the intermediary JNI class which will look like this:

      public final static native void HandRolled(int jarg1, String jarg2);
    

    and as usual this function is wrapped by another which for a global C function would appear in the module class:

      public static void HandRolled(int arg0, String arg1) {
        exampleJNI.HandRolled(arg0, arg1);
      }
    

    The packageName and moduleName must of course be correct else you will get linker errors when the JVM dynamically loads the JNI function. You may have to add in some "jtype", "jstype", "javain" and "javaout" typemaps when wrapping some JNI types. Here the default typemaps work for int and char *.

    In summary the %native directive is telling SWIG to generate the Java code to access the JNI C code, but not the JNI C function itself. This directive is only really useful if you want to mix your own hand crafted JNI code and the SWIG generated code into one Java class or package.

    26.12.4 Performance concerns and hints

    If you're directly manipulating huge arrays of complex objects from Java, performance may suffer greatly when using the array functions in arrays_java.i. Try and minimise the expensive JNI calls to C/C++ functions, perhaps by using temporary Java variables instead of accessing the information directly from the C/C++ object.

    Java classes without any finalizers generally speed up code execution as there is less for the garbage collector to do. Finalizer generation can be stopped by using an empty javafinalize typemap:

    %typemap(javafinalize) SWIGTYPE ""
    

    However, you will have to be careful about memory management and make sure that you code in a call to the delete() member function. This method normally calls the C++ destructor or free() for C code.

    26.12.5 Debugging

    The generated code can be debugged using both a Java debugger and a C++ debugger using the usual debugging techniques. Breakpoints can be set in either Java or C++ code and so both can be debugged simultaneously. Most debuggers do not understand both Java and C++, with one noteable exception of Sun Studio, where it is possible to step from Java code into a JNI method within one environment.

    Alternatively, debugging can involve placing debug printout statements in the JNI layer using the %exception directive. See the special variables for %exception section. Many of the default typemaps can also be overridden and modified for adding in extra logging/debug display information.

    The -Xcheck:jni and -Xcheck:nabounds Java executable options are useful for debugging to make sure the JNI code is behaving. The -verbose:jni and -verbose:gc are also useful options for monitoring code behaviour.

    26.13 Java Examples

    The directory Examples/java has a number of further examples. Take a look at these if you want to see some of the techniques described in action. The Examples/index.html file in the parent directory contains the SWIG Examples Documentation and is a useful starting point. If your SWIG installation went well Unix users should be able to type make in each example directory, then java main to see them running. For the benefit of Windows users, there are also Visual C++ project files in a couple of the Windows Examples . There are also many regression tests in the Examples/test-suite directory. Many of these have runtime tests in the java subdirectory.


    27 SWIG and Javascript

    This chapter describes SWIG's support of Javascript. It does not cover SWIG basics, but only information that is specific to this module.

    27.1 Overview

    Javascript is a prototype-based scripting language that is dynamic, weakly typed and has first-class functions. Its arguably the most popular language for web development. Javascript has gone beyond being a browser-based scripting language and with node.js, it is also used as a backend development language.

    Native Javascript extensions can be used for applications that embed a web-browser view or that embed a Javascript engine (such as node.js). Extending a general purpose web-browser is not possible as this would be a severe security issue.

    SWIG Javascript currently supports JavascriptCore, the Javascript engine used by Safari/Webkit, and v8, which is used by Chromium and node.js.

    WebKit is a modern browser implementation available as open-source which can be embedded into an application. With node-webkit there is a platform which uses Google's Chromium as Web-Browser widget and node.js for javascript extensions.

    27.2 Preliminaries

    27.2.1 Running SWIG

    Suppose that you defined a SWIG module such as the following:

    %module example
    %{
    #include "example.h"
    %}
    int gcd(int x, int y);
    extern double Foo;

    To build a Javascript module, run SWIG using the -javascript option and a desired target engine -jsc, -v8, or -node. The generator for node is essentially delegating to the v8 generator and adds some necessary preprocessor definitions.

    $ swig -javascript -jsc example.i

    If building a C++ extension, add the -c++ option:

    $ swig -c++ -javascript -jsc example.i

    The V8 code that SWIG generates should work with most versions from 3.11.10 up to 3.29.14 and later.

    The API headers for V8 >= 4.3.0 define constants which SWIG can use to determine the V8 version it is compiling for. For versions < 4.3.0, you need to specify the V8 version when running SWIG. This is specified as a hex constant, but the constant is read as pairs of decimal digits, so for V8 3.25.30 use constant 0x032530. This scheme can't represent components > 99, but this constant is only useful for V8 < 4.3.0, and no V8 versions from that era had a component > 99. For example:

    $ swig -c++ -javascript -v8 -DV8_VERSION=0x032530 example.i

    If you're targeting V8 >= 4.3.0, you would just run swig like so:

    $ swig -c++ -javascript -v8 example.i

    This creates a C/C++ source file example_wrap.c or example_wrap.cxx. The generated C source file contains the low-level wrappers that need to be compiled and linked with the rest of your C/C++ application to create an extension module.

    The name of the wrapper file is derived from the name of the input file. For example, if the input file is example.i, the name of the wrapper file is example_wrap.c. To change this, you can use the -o option. The wrapped module will export one function which must be called to register the module with the Javascript interpreter. For example, if your module is named example the corresponding initializer for JavascriptCore would be

    bool example_initialize(JSGlobalContextRef context, JSObjectRef *exports)

    and for v8:

    void example_initialize(v8::Handle<v8::Object> exports)

    Note: be aware that v8 has a C++ API, and thus, the generated modules must be compiled as C++.

    27.2.2 Running Tests and Examples

    The configuration for tests and examples currently supports Linux and Mac only and not MinGW (Windows) yet.

    The default interpreter is node.js as it is available on all platforms and convenient to use.

    Running the examples with JavascriptCore requires libjavascriptcoregtk-1.0 to be installed, e.g., under Ubuntu with

    $ sudo apt-get install libjavascriptcoregtk-1.0-dev

    Running with V8 requires libv8:

    $ sudo apt-get install libv8-dev

    Examples can be run using

    $ make check-javascript-examples ENGINE=jsc

    ENGINE can be node, jsc, or v8.

    The test-suite can be run using

    $ make check-javascript-test-suite ENGINE=jsc

    You can specify a specific V8 version for running the examples and tests

    $ make check-javascript-examples V8_VERSION=0x032530 ENGINE=v8

    27.2.3 Known Issues

    At the moment, the Javascript generators pass all tests syntactically, i.e., the generated source code compiles. However, there are still remaining runtime issues.

    • Default optional arguments do not work for all targeted interpreters

    • Multiple output arguments do not work for JSC

    • C89 incompatibility: the JSC generator might still generate C89 violating code

    • long long is not supported

    • Javascript callbacks are not supported

    • instanceOf does not work under JSC

    The primary development environment has been Linux (Ubuntu 12.04). Windows and Mac OS X have been tested sporadically. Therefore, the generators might have more issues on those platforms. Please report back any problem you observe to help us improving this module quickly.

    27.3 Integration

    This chapter gives a short introduction how to use a native Javascript extension: as a node.js module, and as an extension for an embedded Webkit.

    27.3.1 Creating node.js Extensions

    To install node.js you can download an installer from their web-site for Mac OS X and Windows. For Linux you can either build the source yourself and run sudo checkinstall or keep to the (probably stone-age) packaged version. For Ubuntu there is a PPA available.

    $ sudo add-apt-repository ppa:chris-lea/node.js
    $ sudo apt-get update
    $ sudo apt-get install nodejs

    As v8 is written in C++ and comes as a C++ library it is crucial to compile your module using the same compiler flags as used for building v8. To make things easier, node.js provides a build tool called node-gyp.

    You have to install it using npm:

    $ sudo npm install -g node-gyp

    node-gyp expects a configuration file named binding.gyp which is basically in JSON format and conforms to the same format that is used with Google's build-tool gyp.

    binding.gyp:

    {
      "targets": [
        {
          "target_name": "example",
          "sources": [ "example.cxx", "example_wrap.cxx" ]
        }
      ]
    }

    First create the wrapper using SWIG:

    $ swig -javascript -node -c++ example.i

    Then run node-gyp build to actually create the module:

    $ node-gyp build

    This will create a build folder containing the native module. To use the extension you need to 'require' it in your Javascript source file:

    require("./build/Release/example")

    A more detailed explanation is given in the Examples section.

    27.3.1.1 Troubleshooting

    • 'module' object has no attribute 'script_main'

    This error happens when gyp is installed as a distribution package. It seems to be outdated. Removing it resolves the problem.

    $ sudo apt-get remove gyp

    27.3.2 Embedded Webkit

    Webkit is pre-installed on Mac OS X and available as a library for GTK.

    27.3.2.1 Mac OS X

    There is general information about programming with WebKit on Apple Developer Documentation. Details about Cocoa programming are not covered here.

    An integration of a native extension 'example' would look like this:

    #import "appDelegate.h"
    
    extern bool example_initialize(JSGlobalContextRef context, JSObjectRef* exports);
    
    
    @implementation ExampleAppDelegate
    
    @synthesize webView;
    
    - (void)addGlobalObject:(JSContextRef) context:(NSString *)objectName:(JSObjectRef) theObject {
      JSObjectRef global = JSContextGetGlobalObject(context);
      JSStringRef objectJSName = JSStringCreateWithCFString( (CFStringRef) objectName )
      if ( objectJSName != NULL ) {
        JSObjectSetProperty(context, global, objectJSName, theObject, kJSPropertyAttributeReadOnly, NULL);
        JSStringRelease( objectJSName );
      }
    }
    
    - (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
    
      // Start a webview with the bundled index.html file
      NSString *path = [[NSBundle mainBundle] bundlePath];
      NSString *url =  [NSString stringWithFormat: @"file://%@/Contents/Assets/index.html", path];
    
      WebFrame *webframe = [webView mainFrame];
      JSGlobalContextRef context = [webframe globalContext];
    
      JSObjectRef example;
      example_initialize(context, &example);
      [self addGlobalObject:context:@"example":example]
    
      JSObjectSetProperty(context, global, JSStringRef propertyName, example, JSPropertyAttributes attributes, NULL);
    
      [ [webView mainFrame] loadRequest:
        [NSURLRequest requestWithURL: [NSURL URLWithString:url] ]
      ];
    }
    
    @end

    27.3.2.2 GTK

    There is general information about programming GTK at GTK documentation and in the GTK tutorial, and for Webkit there is a Webkit GTK+ API Reference.

    An integration of a native extension 'example' would look like this:

    #include <gtk/gtk.h>
    #include <webkit/webkit.h>
    
    extern bool example_initialize(JSGlobalContextRef context);
    
    int main(int argc, char* argv[])
    {
      // Initialize GTK+
      gtk_init(&argc, &argv);
    
      ...
    
      // Create a browser instance
      WebKitWebView *webView = WEBKIT_WEB_VIEW(webkit_web_view_new());
      WebFrame *webframe = webkit_web_view_get_main_frame(webView);
      JSGlobalContextRef context = webkit_web_frame_get_global_context(webFrame);
      JSObjectRef global = JSContextGetGlobalObject(context);
    
      JSObjectRef exampleModule;
      example_initialize(context, &exampleModule);
      JSStringRef jsName = JSStringCreateWithUTF8CString("example");
      JSObjectSetProperty(context, global, jsName, exampleModule, kJSPropertyAttributeReadOnly, NULL);
      JSStringRelease(jsName);
    
      ...
    
      // Load a web page into the browser instance
      webkit_web_view_load_uri(webView, "http://www.webkitgtk.org/");
    
      ...
    
      // Run the main GTK+ event loop
      gtk_main();
    
      return 0;
    }

    27.3.3 Creating Applications with node-webkit

    To get started with node-webkit there is a very informative set of wiki pages.

    Similar to node.js, node-webkit is started from command line within a node.js project directory. Native extensions are created in the very same way as for node.js , except that a customized gyp derivate has to be used: nw-gyp.

    A simple example would have the following structure:

    - package.json
    - app.html
    - app.js
    - node_modules
      / example
      ... (as known from node.js)
    

    The configuration file essentially conforms to node.js syntax. It has some extras to configure node-webkit. See the Manifest specification for more details.

    package.json:

    {
      "name": "example",
      "main": "app.html",
      "window": {
        "show": true,
        "width": 800,
        "height": 600
      }
    }

    The 'main' property of package.json specifies a web-page to be rendered in the main window.

    app.html:

    <html>
      <head>
        <script src="app.js"></script>
      </head>
      <body>
        <div>
          The greatest common divisor of
          <span id="x"></span> and
          <span id="y"></span> is
          <span id="z"></span>.
        </div>
      </body>
    </html>

    As known from node.js one can use require to load javascript modules. Additionally, node-webkit provides an API that allows to manipulate the window's menu, open new windows, and many more things.

    app.js:

    window.onload = function() {
      var example = require("example");
      var x = 18;
      var y = 24;
      var z = example.gcd(x, y);
      document.querySelector('#x').innerHTML = x;
      document.querySelector('#y').innerHTML = y;
      document.querySelector('#z').innerHTML = z;
    };

    27.4 Examples

    Some basic examples are shown here in more detail.

    27.4.1 Simple

    The common example simple looks like this:

    /* File : example.i */
    %module example
    
    %inline %{
    extern int    gcd(int x, int y);
    extern double Foo;
    %}

    To make this available as a node extension a binding.gyp has to be created:

    {
      "targets": [
        {
          "target_name": "example",
          "sources": [ "example.cxx", "example_wrap.cxx" ]
        }
      ]
    }

    Then node-gyp is used to build the extension:

    $ node-gyp configure build

    From a 'nodejs` application the extension would be used like this:

    // import the extension via require
    var example = require("./build/Release/example");
    
    // calling the global method
    var x = 42;
    var y = 105;
    var g = example.gcd(x, y);
    
    // Accessing the global variable
    var f = example.Foo;
    example.Foo = 3.1415926;

    First the module example is loaded from the previously built extension. Global methods and variables are available in the scope of the module.

    Note: ECMAScript 5, the currently implemented Javascript standard, does not have modules. node.js and other implementations provide this mechanism defined by the CommonJS group. For browsers this is provided by Browserify, for instance.

    27.4.2 Class

    The common example class defines three classes, Shape, Circle, and Square:

    class Shape {
    public:
      Shape() {
        nshapes++;
      }
      virtual ~Shape() {
        nshapes--;
      }
      double  x, y;
      void    move(double dx, double dy);
      virtual double area(void) = 0;
      virtual double perimeter(void) = 0;
      static  int nshapes;
    };
    
    class Circle : public Shape {
    private:
      double radius;
    public:
      Circle(double r) : radius(r) { }
      virtual double area(void);
      virtual double perimeter(void);
    };
    
    class Square : public Shape {
    private:
      double width;
    public:
      Square(double w) : width(w) { }
      virtual double area(void);
      virtual double perimeter(void);
    };

    Circle and Square inherit from Shape . Shape has a static variable nshapes, a function move that can't be overridden (non-virtual), and two abstract functions area and perimeter (pure virtual) that must be overridden by the sub-classes.

    A nodejs extension is built the same way as for the simple example.

    In Javascript it can be used as follows:

    var example = require("./build/Release/example");
    
    // local aliases for convenience
    var Shape = example.Shape;
    var Circle = example.Circle;
    var Square = example.Square;
    
    // creating new instances using the 'new' operator
    var c = new Circle(10);
    var s = new Square(10);
    
    // accessing a static member
    Shape.nshapes;
    
    // accessing member variables
    c.x = 20;
    c.y = 30;
    s.x = -10;
    s.y = 5;
    
    // calling some methods
    c.area();
    c.perimeter();
    s.area();
    s.perimeter();
    
    // instantiation of Shape is not permitted
    new Shape();

    Running these commands in an interactive node shell results in the following output:

    $ node -i
    & var example = require("./build/Release/example");
    undefined
    & var Shape = example.Shape;
    undefined
    & var Circle = example.Circle;
    undefined
    & var Square = example.Square;
    undefined
    & var c = new Circle(10);
    undefined
    & var s = new Square(10);
    undefined
    & Shape.nshapes;
    2
    & c.x = 20;
    20
    & c.y = 30;
    30
    & s.x = -10;
    -10
    & s.y = 5;
    5
    & c.area();
    314.1592653589793
    & c.perimeter();
    62.83185307179586
    & s.area();
    100
    & s.perimeter();
    40
    & c.move(40, 40)
    undefined
    & c.x
    60
    & c.y
    70
    & new Shape()
    Error: Class Shape can not be instantiated
    at repl:1:2
    at REPLServer.self.eval (repl.js:110:21)
    at Interface.<anonymous> (repl.js:239:12)
    at Interface.EventEmitter.emit (events.js:95:17)
    at Interface._onLine (readline.js:202:10)
    at Interface._line (readline.js:531:8)
    at Interface._ttyWrite (readline.js:760:14)
    at ReadStream.onkeypress (readline.js:99:10)
    at ReadStream.EventEmitter.emit (events.js:98:17)
    at emitKey (readline.js:1095:12)

    Note: In ECMAScript 5 there is no concept for classes. Instead each function can be used as a constructor function which is executed by the 'new' operator. Furthermore, during construction the key property prototype of the constructor function is used to attach a prototype instance to the created object. A prototype is essentially an object itself that is the first-class delegate of a class used whenever the access to a property of an object fails. The very same prototype instance is shared among all instances of one type. Prototypal inheritance is explained in more detail on in Inheritance and the prototype chain, for instance.

    27.5 Implementation

    The Javascript Module implementation has taken a very different approach compared to other language modules in order to support different Javascript interpreters.

    27.5.1 Source Code

    The Javascript module is implemented in Source/Modules/javascript.cxx. It dispatches the code generation to a JSEmitter instance, V8Emitter or JSCEmitter. Additionally there are some helpers: Template , for templated code generation, and JSEmitterState, which is used to manage state information during AST traversal. This rough map shall make it easier to find a way through this huge source file:

    // module wide defines
    
    #define NAME "name"
    ...
    
    // ###############################
    // #  Helper class declarations
    
    class JSEmitterState { ... };
    
    class Template { ... };
    
    // ###############################
    // # JSEmitter declaration
    
    class JSEmitter { ... };
    
    // Emitter factory declarations
    
    JSEmitter *swig_javascript_create_JSCEmitter();
    JSEmitter *swig_javascript_create_V8Emitter();
    
    // ###############################
    // # Javascript module
    
    // Javascript module declaration
    
    class JAVASCRIPT:public Language { ... };
    
    // Javascript module implementation
    
    int JAVASCRIPT::functionWrapper(Node *n) { ... }
    ...
    
    // Module factory implementation
    
    static Language *new_swig_javascript() { ... }
    
    extern "C" Language *swig_javascript(void) { ... }
    
    // ###############################
    // # JSEmitter base implementation
    
    JSEmitter::JSEmitter() { ... }
    
    Template JSEmitter::getTemplate(const String *name) { ... }
    ...
    
    // ###############################
    // # JSCEmitter
    
    // JSCEmitter declaration
    
    class JSCEmitter: public JSEmitter { ... };
    
    // JSCEmitter implementation
    
    JSCEmitter::JSCEmitter() { ... }
    
    void JSCEmitter::marshalInputArgs(Node *n, ParmList *parms, Wrapper *wrapper, MarshallingMode mode, bool is_member, bool is_static) { ... }
    ...
    
    // JSCEmitter factory
    
    JSEmitter *swig_javascript_create_JSCEmitter() { ... }
    
    
    // ###############################
    // # V8Emitter
    
    // V8Emitter declaration
    
    class V8Emitter: public JSEmitter { ... };
    
    // V8Emitter implementation
    
    V8Emitter::V8Emitter() { ... }
    
    int V8Emitter::initialize(Node *n) { ... }
    
    // V8Emitter factory
    
    JSEmitter *swig_javascript_create_V8Emitter() { ... }
    
    
    // ###############################
    // # Helper implementation (JSEmitterState, Template)
    
    JSEmitterState::JSEmitterState() { ... }
    ...
    
    Template::Template(const String *code_) { ... }
    ...

    27.5.2 Code Templates

    All generated code is created on the basis of code templates. The templates for JavascriptCore can be found in Lib/javascript/jsc/javascriptcode.swg, for v8 in Lib/javascript/v8/javascriptcode.swg.

    To track the originating code template for generated code you can run

    $ swig -javascript -jsc -debug-codetemplates

    which wraps generated code with a descriptive comment

    /* begin fragment("template_name") */
    
    ...generated code ...
    
    /* end fragment("template_name") */

    The Template class is used like this:

    Template t_register = getTemplate("jsv8_register_static_variable");
    t_register.replace("$jsparent", state.clazz(NAME_MANGLED))
        .replace("$jsname", state.variable(NAME))
        .replace("$jsgetter", state.variable(GETTER))
        .replace("$jssetter", state.variable(SETTER))
        .trim().
        print(f_init_static_wrappers);

    A code template is registered with the JSEmitter via fragment(name, "template"), e.g.,

    %fragment ("jsc_variable_declaration", "templates")
    %{
      {"$jsname", $jsgetter, $jssetter, kJSPropertyAttributeNone},
    %}

    Template creates a copy of that string and Template::replace uses Swig's Replaceall to replace variables in the template. Template::trim can be used to eliminate leading and trailing whitespaces. Template::print is used to write the final template string to a Swig DOH (based on Printv). All methods allow chaining.

    27.5.3 Emitter

    The Javascript module delegates code generation to a JSEmitter instance. The following extract shows the essential interface:

    class JSEmitter {
      ...
    
      /**
       * Opens output files and temporary output DOHs.
       */
      virtual int initialize(Node *n);
    
      /**
       * Writes all collected code into the output file(s).
       */
      virtual int dump(Node *n) = 0;
    
      /**
       * Cleans up all open output DOHs.
       */
      virtual int close() = 0;
    
      ...
    
      /**
       * Invoked at the beginning of the classHandler.
       */
      virtual int enterClass(Node *);
    
      /**
       * Invoked at the end of the classHandler.
       */
      virtual int exitClass(Node *) {
        return SWIG_OK;
      }
    
      /**
       * Invoked at the beginning of the variableHandler.
       */
      virtual int enterVariable(Node *);
    
      /**
       * Invoked at the end of the variableHandler.
       */
      virtual int exitVariable(Node *) {
        return SWIG_OK;
      }
    
      /**
       * Invoked at the beginning of the functionHandler.
       */
      virtual int enterFunction(Node *);
    
      /**
       * Invoked at the end of the functionHandler.
       */
      virtual int exitFunction(Node *) {
        return SWIG_OK;
      }
    
      /**
       * Invoked by functionWrapper callback after call to Language::functionWrapper.
       */
      virtual int emitWrapperFunction(Node *n);
    
      /**
       * Invoked from constantWrapper after call to Language::constantWrapper.
       **/
      virtual int emitConstant(Node *n);
    
      /**
       * Registers a given code snippet for a given key name.
       *
       * This method is called by the fragmentDirective handler
       * of the JAVASCRIPT language module.
       **/
      int registerTemplate(const String *name, const String *code);
    
      /**
       * Retrieve the code template registered for a given name.
       */
      Template getTemplate(const String *name);
    
      State &getState();
    
      ...
    
    }

    The module calls initialize, dump, and close from within the top method:

    int JAVASCRIPT::top(Node *n) {
      emitter->initialize(n);
    
      Language::top(n);
    
      emitter->dump(n);
      emitter->close();
    
      return SWIG_OK;
    }

    The methods enterClass and exitClass are called from within the classHandler method:

    int JAVASCRIPT::classHandler(Node *n) {
    
      emitter->enterClass(n);
      Language::classHandler(n);
      emitter->exitClass(n);
    
      return SWIG_OK;
    }

    In enterClass the emitter stores state information that is necessary when processing class members. In exitClass the wrapper code for the whole class is generated.

    27.5.4 Emitter states

    For storing information during the AST traversal the emitter provides a JSEmitterState with different slots to store data representing the scopes global, class, function, and variable.

    class JSEmitterState {
    
    public:
    
      JSEmitterState();
    
      ~JSEmitterState();
    
      DOH *global();
    
      DOH *global(const char* key, DOH *initial = 0);
    
      DOH *clazz(bool reset = false);
    
      DOH *clazz(const char* key, DOH *initial = 0);
    
      DOH *function(bool reset = false);
    
      DOH *function(const char* key, DOH *initial = 0);
    
      DOH *variable(bool reset = false);
    
      DOH *variable(const char* key, DOH *initial = 0);
    
      static int IsSet(DOH *val);
    
      ...
    };

    When entering a scope, such as in enterClass, the corresponding state is reset and new data is stored:

    state.clazz(RESET);
    state.clazz(NAME, Getattr(n, "sym:name"));

    State information can be retrieved using state.clazz(NAME) or with Getattr on state.clazz() which actually returns a Hash instance.

    27.5.5 Handling Exceptions in JavascriptCore

    Applications with an embedded JavascriptCore should be able to present detailed exception messages that occur in the Javascript engine. Below is an example derived from code provided by Brian Barnes on how these exception details can be extracted.

    void script_exception_to_string(JSContextRef js_context, JSValueRef exception_value_ref, char* return_error_string, int return_error_string_max_length)
    {
      JSObjectRef exception_object;
      JSValueRef value_ref;
      JSStringRef jsstring_property_name = NULL;
      JSValueRef temporary_exception = NULL;
      JSStringRef js_return_string = NULL;
      size_t bytes_needed;
      char* c_result_string = NULL;
      exception_object = JSValueToObject(js_context, exception_value_ref, NULL);
    
      /* source url */
      strcpy(return_error_string, "[");
      jsstring_property_name = JSStringCreateWithUTF8CString("sourceURL");
      value_ref = JSObjectGetProperty(js_context, exception_object, jsstring_property_name, &temporary_exception);
      JSStringRelease(jsstring_property_name);
      js_return_string = JSValueToStringCopy(js_context, value_ref, NULL);
      bytes_needed = JSStringGetMaximumUTF8CStringSize(js_return_string);
      c_result_string = (char*)calloc(bytes_needed, sizeof(char));
      JSStringGetUTF8CString(js_return_string, c_result_string, bytes_needed);
      JSStringRelease(js_return_string);
      strncat(return_error_string, c_result_string, return_error_string_max_length-1);
      free(c_result_string);
    
      strncat(return_error_string, ":", return_error_string_max_length-1);
    
      /* line number */
    
      jsstring_property_name = JSStringCreateWithUTF8CString("line");
      value_ref = JSObjectGetProperty(js_context, exception_object, jsstring_property_name, &temporary_exception);
      JSStringRelease(jsstring_property_name);
      js_return_string = JSValueToStringCopy(js_context, value_ref, NULL);
      bytes_needed = JSStringGetMaximumUTF8CStringSize(js_return_string);
      c_result_string = (char*)calloc(bytes_needed, sizeof(char));
      JSStringGetUTF8CString(js_return_string, c_result_string, bytes_needed);
      JSStringRelease(js_return_string);
      strncat(return_error_string, c_result_string, return_error_string_max_length-1);
      free(c_result_string);
    
      strncat(return_error_string, "]", return_error_string_max_length-1);
    
      /* error message */
    
      jsstring_property_name = JSStringCreateWithUTF8CString("message");
      value_ref = JSObjectGetProperty(js_context, exception_object, jsstring_property_name, &temporary_exception);
      JSStringRelease(jsstring_property_name);
      if(NULL == value_ref)
      {
        strncat(return_error_string, "Unknown Error", return_error_string_max_length-1);
      }
      else
      {
        js_return_string = JSValueToStringCopy(js_context, value_ref, NULL);
        bytes_needed = JSStringGetMaximumUTF8CStringSize(js_return_string);
        c_result_string = (char*)calloc(bytes_needed, sizeof(char));
        JSStringGetUTF8CString(js_return_string, c_result_string, bytes_needed);
        JSStringRelease(js_return_string);
        strncat(return_error_string, c_result_string, return_error_string_max_length-1);
        free(c_result_string);
      }
    }

    It would be used in the following way:

    if(js_exception)
    {
      char return_error_string[256];
      script_exception_to_string(js_context, js_exception, return_error_string, 256);
      printf("Compile error is %s", return_error_string);
    }

    28 SWIG and Lua

    Lua is an extension programming language designed to support general procedural programming with data description facilities. It also offers good support for object-oriented programming, functional programming, and data-driven programming. Lua is intended to be used as a powerful, light-weight configuration language for any program that needs one. Lua is implemented as a library, written in clean C (that is, in the common subset of ISO C and C++). It's also a really tiny language, less than 6000 lines of code, which compiles to <100 kilobytes of binary code. It can be found at http://www.lua.org

    eLua stands for Embedded Lua (can be thought of as a flavor of Lua) and offers the full implementation of the Lua programming language to the embedded world, extending it with specific features for efficient and portable software embedded development. eLua runs on smaller devices like microcontrollers and provides the full features of the regular Lua desktop version. More information on eLua can be found here: http://www.eluaproject.net

    28.1 Preliminaries

    The current SWIG implementation is designed to work with Lua 5.0.x, 5.1.x and 5.2.x. It should work with later versions of Lua, but certainly not with Lua 4.0 due to substantial API changes. It is possible to either static link or dynamic link a Lua module into the interpreter (normally Lua static links its libraries, as dynamic linking is not available on all platforms). SWIG also has support for eLua starting from eLua 0.8. Due to substantial changes between SWIG 2.x and SWIG 3.0 and unavailability of testing platform, eLua status was downgraded to 'experimental'.

    28.2 Running SWIG

    Suppose that you defined a SWIG module such as the following:

    %module example
    %{
    #include "example.h"
    %}
    int gcd(int x, int y);
    extern double Foo;
    

    To build a Lua module, run SWIG using the -lua option.

    $ swig -lua example.i
    

    If building a C++ extension, add the -c++ option:

    $ swig -c++ -lua example.i
    

    This creates a C/C++ source file example_wrap.c or example_wrap.cxx. The generated C source file contains the low-level wrappers that need to be compiled and linked with the rest of your C/C++ application to create an extension module.

    The name of the wrapper file is derived from the name of the input file. For example, if the input file is example.i, the name of the wrapper file is example_wrap.c. To change this, you can use the -o option. The wrapped module will export one function "int luaopen_example(lua_State* L)" which must be called to register the module with the Lua interpreter. The name "luaopen_example" depends upon the name of the module.

    To build an eLua module, run SWIG using -lua and add either -elua or -eluac.

    $ swig -lua -elua example.i
    

    or

    $ swig -lua -eluac example.i
    

    The -elua option puts all the C function wrappers and variable get/set wrappers in rotables. It also generates a metatable which will control the access to these variables from eLua. It also offers a significant amount of module size compression. On the other hand, the -eluac option puts all the wrappers in a single rotable. With this option, no matter how huge the module, it will consume no additional microcontroller SRAM (crass compression). There is a catch though: Metatables are not generated with -eluac. To access any value from eLua, one must directly call the wrapper function associated with that value.

    28.2.1 Additional command line options

    The following table list the additional commandline options available for the Lua module. They can also be seen by using:

    swig -lua -help 
    
    Lua specific options
    -eluaGenerates LTR compatible wrappers for smaller devices running elua.
    -eluacLTR compatible wrappers in "crass compress" mode for elua.
    -nomoduleglobalDo not register the module name as a global variable but return the module table from calls to require.
    -no-old-metatable-bindingsDisable backward compatibility: old-style binding names generations and a few other things. Explanations are included in appropriate later sections.
    -squash-basesSquashes symbols from all inheritance tree of a given class into itself. Emulates pre-SWIG3.0 inheritance. Insignificantly speeds things up, but increases memory consumption.

    28.2.2 Compiling and Linking and Interpreter

    Normally Lua is embedded into another program and will be statically linked. An extremely simple stand-alone interpreter (min.c) is given below:

    #include <stdio.h>
    #include "lua.h"
    #include "lualib.h"
    #include "lauxlib.h"
    
    extern int luaopen_example(lua_State* L); // declare the wrapped module
    
    int main(int argc, char* argv[])
    {
     lua_State *L;
     if (argc<2)
     {
      printf("%s: <filename.lua>\n", argv[0]);
      return 0;
     }
     L=lua_open();
     luaopen_base(L);       // load basic libs (eg. print)
     luaopen_example(L);    // load the wrapped module
     if (luaL_loadfile(L, argv[1])==0) // load and run the file
      lua_pcall(L, 0, 0, 0);
     else
      printf("unable to load %s\n", argv[1]);
     lua_close(L);
     return 0;
    }
    

    A much improved set of code can be found in the Lua distribution src/lua/lua.c. Include your module, just add the external declaration & add a #define LUA_EXTRALIBS {"example", luaopen_example}, at the relevant place.

    The exact commands for compiling and linking vary from platform to platform. Here is a possible set of commands of doing this:

    $ swig -lua example.i -o example_wrap.c
    $ gcc -I/usr/include/lua -c min.c -o min.o
    $ gcc -I/usr/include/lua -c example_wrap.c -o example_wrap.o
    $ gcc -c example.c -o example.o
    $ gcc -I/usr/include/lua -L/usr/lib/lua min.o example_wrap.o example.o -o my_lua
    

    For eLua, the source must be built along with the wrappers generated by SWIG. Make sure the eLua source files platform_conf.h and auxmods.h are updated with the entries of your new module. Please note: "mod" is the module name.

    /* Sample platform_conf.h */
    #define LUA_PLATFORM_LIBS_ROM\
      _ROM( AUXLIB_PIO, luaopen_pio, pio_map )\
      _ROM( AUXLIB_TMR, luaopen_tmr, tmr_map )\
      _ROM( AUXLIB_MOD, luaopen_mod, mod_map )\
      ....
    
    /* Sample auxmods.h */
    #define AUXLIB_PIO       "pio"
    LUALIB_API int ( luaopen_pio )(lua_State *L );
    
    #define AUXLIB_MOD       "mod"
    LUALIB_API int ( luaopen_mod )(lua_State *L );
    ....
    

    More information on building and configuring eLua can be found here: http://www.eluaproject.net/doc/v0.8/en_building.html

    28.2.3 Compiling a dynamic module

    Most, but not all platforms support the dynamic loading of modules (Windows & Linux do). Refer to the Lua manual to determine if your platform supports it. For compiling a dynamically loaded module the same wrapper can be used. Assuming you have code you need to link to in a file called example.c, the commands will be something like this:

    $ swig -lua example.i -o example_wrap.c
    $ gcc -fPIC -I/usr/include/lua -c example_wrap.c -o example_wrap.o
    $ gcc -fPIC -c example.c -o example.o
    $ gcc -shared -I/usr/include/lua -L/usr/lib/lua example_wrap.o example.o -o example.so
    

    The wrappers produced by SWIG can be compiled and linked with Lua 5.1.x and later. The loading is extremely simple.

    require("example")
    

    For those using Lua 5.0.x, you will also need an interpreter with the loadlib function (such as the default interpreter compiled with Lua). In order to dynamically load a module you must call the loadlib function with two parameters: the filename of the shared library, and the function exported by SWIG. Calling loadlib should return the function, which you then call to initialise the module

    my_init=loadlib("example.so", "luaopen_example") -- for Unix/Linux
    --my_init=loadlib("example.dll", "luaopen_example") -- for Windows
    assert(my_init) -- make sure it's not nil
    my_init()       -- call the init fn of the lib
    

    Or can be done in a single line of Lua code

    assert(loadlib("example.so", "luaopen_example"))()
    

    If the code didn't work, don't panic. The best thing to do is to copy the module and your interpreter into a single directory and then execute the interpreter and try to manually load the module (take care, all this code is case sensitive).

    a, b, c=package.loadlib("example.so", "luaopen_example") -- for Unix/Linux
    --a, b, c=package.loadlib("example.dll", "luaopen_example") -- for Windows
    print(a, b, c)
    

    Note: for Lua 5.0:
    The loadlib() function is in the global namespace, not in a package. So it's just loadlib().

    if 'a' is a function, this is all working fine, all you need to do is call it

      a()
    

    to load your library which will add a table 'example' with all the functions added.

    If it doesn't work, look at the error messages, in particular message 'b'
    The specified module could not be found.
    Means that is cannot find the module, check your the location and spelling of the module.
    The specified procedure could not be found.
    Means that it loaded the module, but cannot find the named function. Again check the spelling, and if possible check to make sure the functions were exported correctly.
    'loadlib' not installed/supported
    Is quite obvious (Go back and consult the Lua documents on how to enable loadlib for your platform).

    28.2.4 Using your module

    Assuming all goes well, you will be able to this:

    $ ./my_lua
    > print(example.gcd(4, 6))
    2
    > print(example.Foo)
    3
    > example.Foo=4
    > print(example.Foo)
    4
    >
    

    28.3 A tour of basic C/C++ wrapping

    By default, SWIG tries to build a very natural Lua interface to your C/C++ code. This section briefly covers the essential aspects of this wrapping.

    28.3.1 Modules

    The SWIG module directive specifies the name of the Lua module. If you specify `module example', then everything is wrapped into a Lua table 'example' containing all the functions and variables. When choosing a module name, make sure you don't use the same name as a built-in Lua command or standard module name.

    28.3.2 Functions

    Global functions are wrapped as new Lua built-in functions. For example,

    %module example
    int fact(int n);

    creates a built-in function example.fact(n) that works exactly like you think it does:

    > print example.fact(4)
    24
    >
    

    To avoid name collisions, SWIG create a Lua table which keeps all the functions, constants, classes and global variables in. It is possible to copy the functions, constants and classes (but not variables) out of this and into the global environment with the following code. This can easily overwrite existing functions, so this must be used with care. This option is considered deprecated and will be removed in the near future.

    > for k, v in pairs(example) do _G[k]=v end
    > print(fact(4))
    24
    >
    

    It is also possible to rename the module with an assignment.

    > e=example
    > print(e.fact(4))
    24
    > print(example.fact(4))
    24
    

    28.3.3 Global variables

    Global variables (which are linked to C code) are supported, and appear to be just another variable in Lua. However the actual mechanism is more complex. Given a global variable:

    %module example
    extern double Foo;
    

    SWIG will effectively generate two functions example.Foo_set() and example.Foo_get(). It then adds a metatable to the table 'example' to call these functions at the correct time (when you attempt to set or get examples.Foo). Therefore if you were to attempt to assign the global to another variable, you will get a local copy within the interpreter, which is no longer linked to the C code.

    > print(example.Foo)
    3
    > c=example.Foo   -- c is a COPY of example.Foo, not the same thing
    > example.Foo=4
    > print(c)
    3
    > c=5 -- this will not effect the original example.Foo
    > print(example.Foo, c)
    4    5
    

    It is therefore not possible to 'move' the global variable into the global namespace as it is with functions. It is however, possible to rename the module with an assignment, to make it more convenient.

    > e=example
    > -- e and example are the same table
    > -- so e.Foo and example.Foo are the same thing
    > example.Foo=4
    > print(e.Foo)
    4
    

    If a variable is marked with the %immutable directive then any attempts to set this variable will cause a Lua error. Given a global variable:

    %module example
    %immutable;
    extern double Foo;
    %mutable;
    

    SWIG will allow the reading of Foo but when a set attempt is made, an error function will be called.

    > print(e.Foo) -- reading works ok
    4
    > example.Foo=40 -- but writing does not
    This variable is immutable
    stack traceback:
            [C]: ?
            [C]: ?
            stdin:1: in main chunk
            [C]: ?
    

    For those people who would rather that SWIG silently ignore the setting of immutables (as previous versions of the Lua bindings did), adding a -DSWIGLUA_IGNORE_SET_IMMUTABLE compile option will remove this.

    Unlike earlier versions of the binding, it is now possible to add new functions or variables to the module, just as if it were a normal table. This also allows the user to rename/remove existing functions and constants (but not linked variables, mutable or immutable). Therefore users are recommended to be careful when doing so.

    > -- example.PI does not exist
    > print(example.PI)
    nil
    > example.PI=3.142 -- new value added
    > print(example.PI)
    3.142
    

    If you have used the -eluac option for your eLua module, you will have to follow a different approach while manipulating global variables. (This is not applicable for wrappers generated with -elua)

    > -- Applicable only with -eluac. (num is defined)
    > print(example.num_get())
    20
    > example.num_set(50) -- new value added
    > print(example.num_get())
    50
    

    In general, functions of the form "variable_get()" and "variable_set()" are automatically generated by SWIG for use with -eluac.

    28.3.4 Constants and enums

    Because Lua doesn't really have the concept of constants, C/C++ constants are not really constant in Lua. They are actually just a copy of the value into the Lua interpreter. Therefore they can be changed just as any other value. For example given some constants:

    %module example
    %constant int ICONST=42;
    #define    SCONST      "Hello World"
    enum Days{SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY};
    

    This is 'effectively' converted into the following Lua code:

    example.ICONST=42
    example.SCONST="Hello World"
    example.SUNDAY=0
    ....
    

    Constants are not guaranteed to remain constant in Lua. The name of the constant could be accidentally reassigned to refer to some other object. Unfortunately, there is no easy way for SWIG to generate code that prevents this. You will just have to be careful.

    If you're using eLua and have used -elua or -eluac to generate your wrapper, macro constants and enums should be accessed through a rotable called "const". In eLua, macro constants and enums are guaranteed to remain constants since they are all contained within a rotable. A regular C constant is accessed from eLua just as if it were a regular global variable, just that the property of value immutability is demonstrated if an attempt at modifying a C constant is made.

    > print(example.ICONST)
    10
    > print(example.const.SUNDAY)
    0
    > print(example.const.SCONST)
    Hello World
    

    28.3.4.1 Constants/enums and classes/structures

    Enums are exported into a class table. For example, given some enums:

    %module example
    enum Days { SUNDAY = 0, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY };
    struct Test {
      enum { TEST1 = 10, TEST2 = 20 };
    #ifdef __cplusplus // There are no static members in C
      static const int ICONST = 12;
    #endif
    };
    

    There is a slight difference in behaviour wrapping C and C++ code due to the different scoping rules of C and C++. The wrapped C++ code is used as follows from Lua code:

    > print(example.SUNDAY)
    0
    > print(example.Test.TEST1)
    10
    > print(example.Test.ICONST)
    12
    

    Enums within a C struct are in the global namespace and are used as follows from Lua

    > print(example.SUNDAY)
    0
    > -- See the difference here
    > print(example.TEST1)
    10
    

    Compatibility Note: Versions of SWIG prior to SWIG-3.0.0 did not generate the class table members above. There is no change in the C wrappers, but the following code was the only way to access these constants/enums when wrapping C++ member constants:

    > print(example.Test_TEST1)
    10
    > print(example.Test_ICONST)
    12
    

    The old-style bindings are still generated in addition to the new ones. If the -no-old-metatable-bindings option is used, then these old-style bindings are not generated.

    It is worth mentioning, that example.Test.TEST1 and example.Test_TEST1 are different entities and changing one does not change the other. Given the fact that these are constantes and they are not supposed to be changed, it is up to you to avoid such issues.

    28.3.5 Pointers

    C/C++ pointers are fully supported by SWIG. Furthermore, SWIG has no problem working with incomplete type information. Given a wrapping of the <file.h> interface:

    %module example
    
    FILE *fopen(const char *filename, const char *mode);
    int fputs(const char *, FILE *);
    int fclose(FILE *);
    

    When wrapped, you will be able to use the functions in a natural way from Lua. For example:

    > f=example.fopen("junk", "w")
    > example.fputs("Hello World", f)
    > example.fclose(f)
    

    Unlike many scripting languages, Lua has had support for pointers to C/C++ object built in for a long time. They are called 'userdata'. Unlike many other SWIG versions which use some kind of encoded character string, all objects will be represented as a userdata. The SWIG-Lua bindings provides a special function swig_type(), which if given a userdata object will return the type of object pointed to as a string (assuming it was a SWIG wrapped object).

    > print(f)
    userdata: 003FDA80
    > print(swig_type(f))
    FILE * -- it's a FILE*
    

    Lua enforces the integrity of its userdata, so it is virtually impossible to corrupt the data. But as the user of the pointer, you are responsible for freeing it, or closing any resources associated with it (just as you would in a C program). This does not apply so strictly to classes & structs (see below). One final note: if a function returns a NULL pointer, this is not encoded as a userdata, but as a Lua nil.

    > f=example.fopen("not there", "r") -- this will return a NULL in C
    > print(f)
    nil
    

    28.3.6 Structures

    If you wrap a C structure, it is also mapped to a Lua userdata. By adding a metatable to the userdata, this provides a very natural interface. For example,

    struct Point{
      int x, y;
    };
    

    is used as follows:

    > p=example.new_Point()
    > p.x=3
    > p.y=5
    > print(p.x, p.y)
    3       5
    >
    

    Similar access is provided for unions and the data members of C++ classes.
    C structures can be created using a function new_Point(), and both C structures and C++ classes can be created using just the name Point().

    If you print out the value of p in the above example, you will see something like this:

    > print(p)
    userdata: 003FA320
    

    Like the pointer in the previous section, this is held as a userdata. However, additional features have been added to make this more usable. SWIG effectively creates some accessor/mutator functions to get and set the data. These functions will be added to the userdata's metatable. This provides the natural access to the member variables that were shown above (see end of the document for full details).

    const members of a structure are read-only. Data members can also be forced to be read-only using the immutable directive. As with other immutables, setting attempts will be cause an error. For example:

    struct Foo {
      ...
      %immutable;
      int x;        // Read-only members
      char *name;
      %mutable;
      ...
    };
    

    The mechanism for managing char* members as well as array members is similar to other languages. It is somewhat cumbersome and should probably be better handled by defining of typemaps (described later).

    When a member of a structure is itself a structure, it is handled as a pointer. For example, suppose you have two structures like this:

    struct Foo {
      int a;
    };
    
    struct Bar {
      Foo f;
    };
    

    Now, suppose that you access the f attribute of Bar like this:

    > b = Bar()
    > x = b.f
    

    In this case, x is a pointer that points to the Foo that is inside b. This is the same value as generated by this C code:

    Bar b;
    Foo *x = &b->f;       // Points inside b
    

    Because the pointer points inside the structure, you can modify the contents and everything works just like you would expect. For example:

    > b = Bar()
    > b.f.a = 3               -- Modify attribute of structure member
    > x = b.f
    > x.a = 3                 -- Modifies the same structure
    

    For eLua with the -eluac option, structure manipulation has to be performed with specific structure functions generated by SWIG. Let's say you have the following structure definition:

    struct data {
      int x, y;
      double z;
    };
    
    > --From eLua
    > a = example.new_data()
    > example.data_x_set(a, 10)
    > example.data_y_set(a, 20)
    > print(example.data_x_get(a), example.data_y_get(a))
    10 20
    

    In general, functions of the form "new_struct()", "struct_member_get()", "struct_member_set()" and "free_struct()" are automatically generated by SWIG for each structure defined in C. (Please note: This doesn't apply for modules generated with the -elua option)

    28.3.7 C++ classes

    C++ classes are wrapped by a Lua userdata as well. For example, if you have this class,

    class List {
    public:
      List();
      ~List();
      int  search(char *item);
      void insert(char *item);
      void remove(char *item);
      char *get(int n);
      int  length;
    };
    

    you can use it in Lua like this:

    > l = example.List()
    > l:insert("Ale")
    > l:insert("Stout")
    > l:insert("Lager")
    > print(l:get(1))
    Stout
    > print(l:length)
    3
    >
    

    (Note: for calling methods of a class, you use class:method(args), not class.method(args), it's an easy mistake to make. However for data attributes it is class.attribute )

    Class data members are accessed in the same manner as C structures. Static class members present a special problem for Lua, as Lua doesn't have support for such features. Therefore, SWIG generates wrappers that try to work around some of these issues. To illustrate, suppose you have a class like this:

    class Spam {
    public:
      static void foo();
      static int bar;
    };
    

    In Lua, C++ static members can be accessed as follows:

    > example.Spam.foo()            -- calling Spam::foo()
    > a=example.Spam.bar            -- reading Spam::bar 
    > example.Spam.bar=b            -- writing to Spam::bar
    

    It is not (currently) possible to access static members of an instance:

    > s=example.Spam()              -- s is a Spam instance
    > s.foo()                       -- Spam::foo() via an instance
                                    -- does NOT work
    

    Compatibility Note: In versions prior to SWIG-3.0.0 only the following names would work:

    > example.Spam_foo()            -- calling Spam::foo()
    > a=example.Spam_bar            -- reading Spam::bar 
    > example.Spam_bar=b            -- writing to Spam::bar
    

    Both style names are generated by default now. However, if the -no-old-metatable-bindings option is used, then the backward compatible names are not generated in addition to ordinary ones.

    28.3.8 C++ inheritance

    SWIG is fully aware of issues related to C++ inheritance. Therefore, if you have classes like this

    class Foo {
    ...
    };
    
    class Bar : public Foo {
    ...
    };
    

    And if you have functions like this

    void spam(Foo *f);
    

    then the function spam() accepts a Foo pointer or a pointer to any class derived from Foo.

    It is safe to use multiple inheritance with SWIG.

    28.3.9 Pointers, references, values, and arrays

    In C++, there are many different ways a function might receive and manipulate objects. For example:

    void spam1(Foo *x);      // Pass by pointer
    void spam2(Foo &x);      // Pass by reference
    void spam3(Foo x);       // Pass by value
    void spam4(Foo x[]);     // Array of objects
    

    In SWIG, there is no detailed distinction like this--specifically, there are only "objects". There are no pointers, references, arrays, and so forth. Because of this, SWIG unifies all of these types together in the wrapper code. For instance, if you actually had the above functions, it is perfectly legal to do this:

    > f = Foo()           -- Create a Foo
    > spam1(f)            -- Ok. Pointer
    > spam2(f)            -- Ok. Reference
    > spam3(f)            -- Ok. Value.
    > spam4(f)            -- Ok. Array (1 element)
    

    Similar behaviour occurs for return values. For example, if you had functions like this,

    Foo *spam5();
    Foo &spam6();
    Foo  spam7();
    

    then all three functions will return a pointer to some Foo object. Since the third function (spam7) returns a value, newly allocated memory is used to hold the result and a pointer is returned (Lua will release this memory when the return value is garbage collected). The other two are pointers which are assumed to be managed by the C code and so will not be garbage collected.

    28.3.10 C++ overloaded functions

    C++ overloaded functions, methods, and constructors are mostly supported by SWIG. For example, if you have two functions like this:

    void foo(int);
    void foo(char *c);
    

    You can use them in Lua in a straightforward manner:

    > foo(3)           -- foo(int)
    > foo("Hello")     -- foo(char *c)
    

    However due to Lua's coercion mechanism is can sometimes do strange things.

    > foo("3")           -- "3" can be coerced into an int, so it calls foo(int)!
    

    As this coercion mechanism is an integral part of Lua, there is no easy way to get around this other than renaming of functions (see below).

    Similarly, if you have a class like this,

    class Foo {
    public:
      Foo();
      Foo(const Foo &);
      ...
    };
    

    you can write Lua code like this:

    > f = Foo()          -- Create a Foo
    > g = Foo(f)         -- Copy f
    

    Overloading support is not quite as flexible as in C++. Sometimes there are methods that SWIG can't disambiguate. For example:

    void spam(int);
    void spam(short);
    

    or

    void foo(Bar *b);
    void foo(Bar &b);
    

    If declarations such as these appear, you will get a warning message like this:

    example.i:12: Warning 509: Overloaded method spam(short) effectively ignored,
    example.i:11: Warning 509: as it is shadowed by spam(int).
    

    To fix this, you either need to ignore or rename one of the methods. For example:

    %rename(spam_short) spam(short);
    ...
    void spam(int);
    void spam(short);   // Accessed as spam_short
    

    or

    %ignore spam(short);
    ...
    void spam(int);
    void spam(short);   // Ignored
    

    SWIG resolves overloaded functions and methods using a disambiguation scheme that ranks and sorts declarations according to a set of type-precedence rules. The order in which declarations appear in the input does not matter except in situations where ambiguity arises--in this case, the first declaration takes precedence.

    Please refer to the "SWIG and C++" chapter for more information about overloading.

    Dealing with the Lua coercion mechanism, the priority is roughly (integers, floats, strings, userdata). But it is better to rename the functions rather than rely upon the ordering.

    28.3.11 C++ operators

    Certain C++ overloaded operators can be handled automatically by SWIG. For example, consider a class like this:

    class Complex {
    private:
      double rpart, ipart;
    public:
      Complex(double r = 0, double i = 0) : rpart(r), ipart(i) { }
      Complex(const Complex &c) : rpart(c.rpart), ipart(c.ipart) { }
      Complex &operator=(const Complex &c);
      Complex operator+(const Complex &c) const;
      Complex operator-(const Complex &c) const;
      Complex operator*(const Complex &c) const;
      Complex operator-() const;
    
      double re() const { return rpart; }
      double im() const { return ipart; }
    };
    

    When wrapped, it works like you expect:

    > c = Complex(3, 4)
    > d = Complex(7, 8)
    > e = c + d
    > e:re()
    10.0
    > e:im()
    12.0
    

    One restriction with operator overloading support is that SWIG is not able to fully handle operators that aren't defined as part of the class. For example, if you had code like this

    class Complex {
    ...
    friend Complex operator+(double, const Complex &c);
    ...
    };
    

    then SWIG doesn't know what to do with the friend function--in fact, it simply ignores it and issues a warning. You can still wrap the operator, but you may have to encapsulate it in a special function. For example:

    %rename(Complex_add_dc) operator+(double, const Complex &);
    ...
    Complex operator+(double, const Complex &c);
    

    There are ways to make this operator appear as part of the class using the %extend directive. Keep reading.

    Also, be aware that certain operators don't map cleanly to Lua, and some Lua operators don't map cleanly to C++ operators. For instance, overloaded assignment operators don't map to Lua semantics and will be ignored, and C++ doesn't support Lua's concatenation operator (.. ).

    In order to keep maximum compatibility within the different languages in SWIG, the Lua bindings uses the same set of operator names as Python. Although internally it renames the functions to something else (on order to work with Lua).

    The current list of operators which can be overloaded (and the alternative function names) are:

    • __add__ operator+
    • __sub__ operator-
    • __mul__ operator *
    • __div__ operator/
    • __unm__ unary minus
    • __call__ operator() (often used in functor classes)
    • __pow__ the exponential fn (no C++ equivalent, Lua uses ^)
    • __concat__ the concatenation operator (Lua's ..)
    • __eq__ operator==
    • __lt__ operator<
    • __le__ operator<=

    Note: in Lua, only the equals, less than, and less than equals operators are defined. The other operators (!=, >, >=) are achieved by using a logical not applied to the results of other operators.

    The following operators cannot be overloaded (mainly because they are not supported in Lua)

    • ++ and --
    • +=, -=, *= etc
    • % operator (you have to use math.mod)
    • assignment operator
    • all bitwise/logical operations

    SWIG also accepts the __str__() member function which converts an object to a string. This function should return a const char*, preferably to static memory. This will be used for the print() and tostring() functions in Lua. Assuming the complex class has a function

    const char* __str__() {
      static char buffer[255];
      sprintf(buffer, "Complex(%g, %g)", this->re(), this->im());
      return buffer;
    }
    

    Then this will support the following code in Lua

    > c = Complex(3, 4)
    > d = Complex(7, 8)
    > e = c + d
    > print(e)
    Complex(10, 12)
    > s=tostring(e) -- s is the number in string form
    > print(s)
    Complex(10, 12)
    

    It is also possible to overload the operator[], but currently this cannot be automatically performed. To overload the operator[] you need to provide two functions, __getitem__() and __setitem__()

    class Complex {
      //....
      double __getitem__(int i)const; // i is the index, returns the data
      void __setitem__(int i, double d); // i is the index, d is the data
    };
    

    C++ operators are mapped to Lua predefined metafunctions. Class inherits from its bases the following list of metafunctions ( thus inheriting the folloging operators and pseudo-operators):

    • __add__
    • __sub__
    • __mul__
    • __div__
    • __unm__
    • __mod__
    • __call__
    • __pow__
    • __concat__
    • __eq__
    • __lt__
    • __le__
    • __len__
    • __getitem__
    • __setitem__
    • __tostring used internally by Lua for tostring() function. __str__ is mapped to this function

    No other lua metafunction is inherited. For example, __gc is not inherited and must be redefined in every class. __tostring is subject to a special handling. If absent in class and in class bases, a default one will be provided by SWIG.

    28.3.12 Class extension with %extend

    One of the more interesting features of SWIG is that it can extend structures and classes with new methods. In the previous section, the Complex class would have benefited greatly from an __str__() method as well as some repairs to the operator overloading. It can also be used to add additional functions to the class if they are needed.

    Take the original Complex class

    class Complex {
    private:
      double rpart, ipart;
    public:
      Complex(double r = 0, double i = 0) : rpart(r), ipart(i) { }
      Complex(const Complex &c) : rpart(c.rpart), ipart(c.ipart) { }
      Complex &operator=(const Complex &c);
      Complex operator+(const Complex &c) const;
      Complex operator-(const Complex &c) const;
      Complex operator*(const Complex &c) const;
      Complex operator-() const;
    
      double re() const { return rpart; }
      double im() const { return ipart; }
    };
    

    Now we extend it with some new code

    %extend Complex {
      const char *__str__() {
        static char tmp[1024];
        sprintf(tmp, "Complex(%g, %g)", $self->re(), $self->im());
        return tmp;
      }
      bool operator==(const Complex& c) {
        return ($self->re()==c.re() && $self->im()==c.im());
      }
    };
    

    Now, in Lua

    > c = Complex(3, 4)
    > d = Complex(7, 8)
    > e = c + d
    > print(e)      -- print uses __str__ to get the string form to print
    Complex(10, 12)
    > print(e==Complex(10, 12))  -- testing the == operator
    true
    > print(e!=Complex(12, 12))  -- the != uses the == operator
    true
    

    Extend works with both C and C++ code, on classes and structs. It does not modify the underlying object in any way---the extensions only show up in the Lua interface. The only item to take note of is the code has to use the '$self' instead of 'this', and that you cannot access protected/private members of the code (as you are not officially part of the class).

    28.3.13 Using %newobject to release memory

    If you have a function that allocates memory like this,

    char *foo() {
      char *result = (char *) malloc(...);
      ...
      return result;
    }
    

    then the SWIG generated wrappers will have a memory leak--the returned data will be copied into a string object and the old contents ignored.

    To fix the memory leak, use the %newobject directive.

    %newobject foo;
    ...
    char *foo();
    

    This will release the allocated memory.

    28.3.14 C++ templates

    C++ templates don't present a huge problem for SWIG. However, in order to create wrappers, you have to tell SWIG to create wrappers for a particular template instantiation. To do this, you use the template directive. For example:

    %module example
    %{
    #include "pair.h"
    %}
    
    template<class T1, class T2>
    struct pair {
      typedef T1 first_type;
      typedef T2 second_type;
      T1 first;
      T2 second;
      pair();
      pair(const T1&, const T2&);
      ~pair();
    };
    
    %template(pairii) pair<int, int>;
    

    In Lua:

    > p = example.pairii(3, 4)
    > print(p.first, p.second)
    3    4
    

    Obviously, there is more to template wrapping than shown in this example. More details can be found in the SWIG and C++ chapter. Some more complicated examples will appear later.

    28.3.15 C++ Smart Pointers

    In certain C++ programs, it is common to use classes that have been wrapped by so-called "smart pointers." Generally, this involves the use of a template class that implements operator->() like this:

    template<class T> class SmartPtr {
      ...
      T *operator->();
      ...
    }
    

    Then, if you have a class like this,

    class Foo {
    public:
      int x;
      int bar();
    };
    

    A smart pointer would be used in C++ as follows:

    SmartPtr<Foo> p = CreateFoo();   // Created somehow (not shown)
    ...
    p->x = 3;                        // Foo::x
    int y = p->bar();                // Foo::bar
    

    To wrap this, simply tell SWIG about the SmartPtr class and the low-level Foo object. Make sure you instantiate SmartPtr using template if necessary. For example:

    %module example
    ...
    %template(SmartPtrFoo) SmartPtr<Foo>;
    ...
    

    Now, in Lua, everything should just "work":

    > p = example.CreateFoo()          -- Create a smart-pointer somehow
    > p.x = 3                          -- Foo::x
    > print(p:bar())                   -- Foo::bar
    

    If you ever need to access the underlying pointer returned by operator->() itself, simply use the __deref__() method. For example:

    > f = p:__deref__()     -- Returns underlying Foo *
    

    28.3.16 C++ Exceptions

    Lua does not natively support exceptions, but it has errors which are similar. When a Lua function terminates with an error it returns one value back to the caller. SWIG automatically maps any basic type which is thrown into a Lua error. Therefore for a function:

    int message() throw(const char *) {
      throw("I died.");
      return 1;
    }
    

    SWIG will automatically convert this to a Lua error.

    > message()
    I died.
    stack traceback:
            [C]: in function 'message'
            stdin:1: in main chunk
            [C]: ?
    >
    

    If you want to catch an exception, you must use either pcall() or xpcall(), which are documented in the Lua manual. Using xpcall will allow you to obtain additional debug information (such as a stacktrace).

    > function a() b() end -- function a() calls function b()
    > function b() message() end -- function b() calls C++ function message(), which throws 
    > ok, res=pcall(a)  -- call the function
    > print(ok, res)
    false   I died.
    > ok, res=xpcall(a, debug.traceback)  -- call the function
    > print(ok, res)
    false   I died.
    stack traceback:
            [C]: in function 'message'
            runme.lua:70: in function 'b'
            runme.lua:67: in function <runme.lua:66>
            [C]: in function 'xpcall'
            runme.lua:95: in main chunk
            [C]: ?
    

    SWIG is able to throw numeric types, enums, chars, char*'s and std::string's without problem. It has also written typemaps for std::exception and its derived classes, which convert the exception into an error string.

    However it's not so simple to throw other types of objects. Thrown objects are not valid outside the 'catch' block. Therefore they cannot be returned to the interpreter. The obvious ways to overcome this would be to either return a copy of the object, or to convert the object to a string and return that. Though it seems obvious to perform the former, in some cases this is not possible, most notably when SWIG has no information about the object, or the object is not copyable/creatable.

    Therefore by default SWIG converts all thrown object into strings and returns them. So given a function:

    void throw_A() throw(A*) {
      throw new A();
    }
    

    SWIG will just convert it (poorly) to a string and use that as its error. (This is not that useful, but it always works).

    > throw_A()
    object exception:A *
    stack traceback:
            [C]: in function 'unknown'
            stdin:1: in main chunk
            [C]: ?
    >
    

    To get a more useful behaviour out of SWIG you must either: provide a way to convert your exceptions into strings, or throw objects which can be copied.

    If you have your own class which you want output as a string you will need to add a typemap something like this:

    %typemap(throws) my_except
    %{ 
      lua_pushstring(L, $1.what()); // assuming my_except::what() returns a const char* message
      SWIG_fail; // trigger the error handler
    %}
    

    If you wish your exception to be returned to the interpreter, it must firstly be copyable. Then you must have an additional %apply statement, to tell SWIG to return a copy of this object to the interpreter. For example:

    %apply SWIGTYPE EXCEPTION_BY_VAL {Exc}; // tell SWIG to return Exc by value to interpreter
    
    class Exc {
    public:
      Exc(int c, const char *m) {
        code = c;
        strncpy(msg, m, 256);
      }
      int code;
      char msg[256];
    };
    
    void throw_exc() throw(Exc) {
      throw(Exc(42, "Hosed"));
    } 
    

    Then the following code can be used (note: we use pcall to catch the error so we can process the exception).

    > ok, res=pcall(throw_exc)
    > print(ok)
    false
    > print(res)
    userdata: 0003D880
    > print(res.code, res.msg)
    42      Hosed
    >
    

    Note: it is also possible (though tedious) to have a function throw several different kinds of exceptions. To process this will require a pcall, followed by a set of if statements checking the type of the error.

    All of this code assumes that your C++ code uses exception specification (which a lot doesn't). If it doesn't consult the " Exception handling with %catches" section and the " Exception handling with %exception" section, for more details on how to add exception specification to functions or globally (respectively).

    28.3.17 Namespaces

    Since SWIG-3.0.0 C++ namespaces are supported via the %nspace feature.

    Namespaces are mapped into Lua tables. Each of those tables contains names that were defined within appropriate namespace. Namespaces structure (a.k.a nested namespaces) is preserved. Consider the following C++ code:

    %module example
    %nspace MyWorld::Nested::Dweller;
    %nspace MyWorld::World;
    
    int module_function() { return 7; }
    int module_variable = 9;
    
    namespace MyWorld {
      class World {
      public:
        World() : world_max_count(9) {}
        int create_world() { return 17; }
        const int world_max_count; // = 9
      };
      namespace Nested {
        class Dweller {
          public:
            enum Gender { MALE = 0, FEMALE = 1 };
            static int count() { return 19; }
        };
      }
    }
    

    Now, from Lua usage is as follows:

    > print(example.module_function())
    7
    > print(example.module_variable)
    9
    > print(example.MyWorld.World():create_world())
    17
    > print(example.MyWorld.World.world_max_count)
    9
    > print(example.MyWorld.Nested.Dweller.MALE)
    0
    > print(example.MyWorld.Nested.Dweller.count())
    19
    >
    

    28.3.17.1 Compatibility Note

    If SWIG is running in a backwards compatible way, i.e. without the -no-old-metatable-bindings option, then additional old-style names are generated (notice the underscore):

    9
    > print(example.MyWorld.Nested.Dweller_MALE)
    0
    > print(example.MyWorld.Nested.Dweller_count())
    11
    >
    

    28.3.17.2 Names

    If SWIG is launched without -no-old-metatable-bindings option, then it enters backward-compatible mode. While in this mode, it tries to generate additional names for static functions, class static constants and class enums. Those names are in a form $classname_$symbolname and are added to the scope surrounding the class. If %nspace is enabled, then class namespace is taken as scope. If there is no namespace, or %nspace is disabled, then module is considered a class namespace.

    Consider the following C++ code

    %module example
    %nspace MyWorld::Test;
    namespace MyWorld {
    class Test {
      public:
      enum { TEST1 = 10, TEST2 }
      static const int ICONST = 12;
    };
    class Test2 {
      public:
      enum { TEST3 = 20, TEST4 }
      static const int ICONST2 = 23;
    }
    

    When in backward compatible mode, in addition to the usual names, the following ones will be generated (notice the underscore):

    9
    > print(example.MyWorld.Test_TEST1) -- Test has %nspace enabled
    10
    > print(example.MyWorld.Test_ICONST) -- Test has %nspace enabled
    12
    > print(example.Test2_TEST3) -- Test2 doesn't have %nspace enabled
    20
    > print(example.Test2_ICONST2) -- Test2 doesn't have %nspace enabled
    23
    >
    

    There is a slight difference with enums when in C mode. As per C standard, enums from C structures are exported to surrounding scope without any prefixing. Pretending that Test2 is a struct, not class, that would be:

    > print(example.TEST3) -- NOT Test2_TEST3
    20
    >
    

    28.3.17.3 Inheritance

    The internal organization of inheritance has changed. Consider the following C++ code:

    %module example
    class Base {
      public:
      int base_func()
    };
    class Derived : public Base {
      public:
      int derived_func()
    }
    

    Lets assume for a moment that class member functions are stored in .fn table. Previously, when classes were exported to Lua during module initialization, for every derived class all service tables ST(i.e. ".fn") were squashed and added to corresponding derived class ST: Everything from .fn table of class Base was copied to .fn table of class Derived and so on. This was a recursive procedure, so in the end the whole inheritance tree of derived class was squashed into derived class.

    That means that any changes done to class Base after module initialization wouldn't affect class Derived:

    base = example.Base()
    der = example.Derived()
    > print(base.base_func)
    function: 0x1367940
    > getmetatable(base)[".fn"].new_func = function (x) return x -- Adding new function to class Base (to class, not to an instance!)
    > print(base.new_func) -- Checking this function
    function
    > print(der.new_func) -- Wouldn't work. Derived doesn't check Base any more.
    nil
    >
    

    This behaviour was changed. Now unless -squash-bases option is provided, Derived store a list of it's bases and if some symbol is not found in it's own service tables then its bases are searched for it. Option -squash-bases will effectively return old behaviour.

    > print(der.new_func) -- Now it works
    function
    >
    

    28.4 Typemaps

    This section explains what typemaps are and how to use them. The default wrapping behaviour of SWIG is enough in most cases. However sometimes SWIG may need a little additional assistance to know which typemap to apply to provide the best wrapping. This section will be explaining how to use typemaps to best effect

    28.4.1 What is a typemap?

    A typemap is nothing more than a code generation rule that is attached to a specific C datatype. For example, to convert integers from Lua to C, you might define a typemap like this:

    %module example
    
    %typemap(in) int {
      $1 = (int) lua_tonumber(L, $input);
      printf("Received an integer : %d\n", $1);
    }
    %inline %{
    extern int fact(int n);
    %}
    

    Note: you shouldn't use this typemap, as SWIG already has a typemap for this task. This is purely for example.

    Typemaps are always associated with some specific aspect of code generation. In this case, the "in" method refers to the conversion of input arguments to C/C++. The datatype int is the datatype to which the typemap will be applied. The supplied C code is used to convert values. In this code a number of special variable prefaced by a $ are used. The $1 variable is placeholder for a local variable of type int. The $input is the index on the Lua stack for the value to be used.

    When this example is compiled into a Lua module, it operates as follows:

    > require "example"
    > print(example.fact(6))
    Received an integer : 6
    720
    

    28.4.2 Using typemaps

    There are many ready written typemaps built into SWIG for all common types (int, float, short, long, char*, enum and more), which SWIG uses automatically, with no effort required on your part.

    However for more complex functions which use input/output parameters or arrays, you will need to make use of <typemaps.i>, which contains typemaps for these situations. For example, consider these functions:

    void add(int x, int y, int *result) {
      *result = x + y;
    }
    
    int sub(int *x1, int *y1) {
      return *x1-*y1;
    }
    
    void swap(int *sx, int *sy) {
      int t=*sx;
      *sx=*sy;
      *sy=t;
    }
    

    It is clear to the programmer, that 'result' is an output parameter, 'x1' and 'y1' are input parameters and 'sx' and 'sy' are input/output parameters. However is not apparent to SWIG, so SWIG must to informed about which kind they are, so it can wrapper accordingly.

    One means would be to rename the argument name to help SWIG, eg void add(int x, int y, int *OUTPUT), however it is easier to use the %apply to achieve the same result, as shown below.

    %include <typemaps.i>
    %apply int* OUTPUT {int *result}; // int *result is output
    %apply int* INPUT {int *x1, int *y1}; // int *x1 and int *y1 are input
    %apply int* INOUT {int *sx, int *sy}; // int *sx and int *sy are input and output
    
    void add(int x, int y, int *result);
    int sub(int *x1, int *y1);
    void swap(int *sx, int *sy);
    

    When wrapped, it gives the following results:

    > require "example"
    > print(example.add(1, 2))
    3
    > print(demo.sub(1, 2))
    -1
    > a, b=1, 2
    > c, d=demo.swap(a, b)
    > print(a, b, c, d)
    1       2       2       1
    

    Notice, that 'result' is not required in the arguments to call the function, as it an output parameter only. For 'sx' and 'sy' they must be passed in (as they are input), but the original value is not modified (Lua does not have a pass by reference feature). The modified results are then returned as two return values. All INPUT/OUTPUT/INOUT arguments will behave in a similar manner.

    Note: C++ references must be handled exactly the same way. However SWIG will automatically wrap a const int& as an input parameter (since that it obviously input).

    28.4.3 Typemaps and arrays

    Arrays present a challenge for SWIG, because like pointers SWIG does not know whether these are input or output values, nor does SWIG have any indication of how large an array should be. However with the proper guidance SWIG can easily wrapper arrays for convenient usage.

    Given the functions:

    extern void sort_int(int* arr, int len);
    extern void sort_double(double* arr, int len);
    

    There are basically two ways that SWIG can deal with this. The first way, uses the <carrays.i> library to create an array in C/C++ then this can be filled within Lua and passed into the function. It works, but it's a bit tedious. More details can be found in the carrays.i documentation.

    The second and more intuitive way, would be to pass a Lua table directly into the function, and have SWIG automatically convert between Lua-table and C-array. Within the <typemaps.i> file there are typemaps ready written to perform this task. To use them is again a matter of using %apply in the correct manner.

    The wrapper file below, shows both the use of carrays as well as the use of the typemap to wrap arrays.

    // using the C-array
    %include <carrays.i>
    // this declares a batch of function for manipulating C integer arrays
    %array_functions(int, int)
    
    extern void sort_int(int* arr, int len); // the function to wrap
    
    // using typemaps
    %include <typemaps.i>
    %apply (double *INOUT, int) {(double* arr, int len)};
    
    extern void sort_double(double* arr, int len); // the function to wrap
    

    Once wrapped, the functions can both be called, though with different ease of use:

    require "example"
    ARRAY_SIZE=10
    
    -- passing a C array to the sort_int()
    arr=example.new_int(ARRAY_SIZE) -- create the array
    for i=0, ARRAY_SIZE-1 do -- index 0..9 (just like C)
        example.int_setitem(arr, i, math.random(1000))
    end
    example.sort_int(arr, ARRAY_SIZE)  -- call the function
    example.delete_int(arr) -- must delete the allocated memory
    
    -- use a typemap to call with a Lua-table
    -- one item of note: the typemap creates a copy, rather than edit-in-place
    t={} -- a Lua table
    for i=1, ARRAY_SIZE do -- index 1..10 (Lua style)
        t[i]=math.random(1000)/10
    end
    t=example.sort_double(t) -- replace t with the result
    

    Obviously the first version could be made less tedious by writing a Lua function to perform the conversion from a table to a C-array. The %luacode directive is good for this. See SWIG\Examples\lua\arrays for an example of this.

    Warning: in C indexes start at ZERO, in Lua indexes start at ONE. SWIG expects C-arrays to be filled for 0..N-1 and Lua tables to be 1..N, (the indexing follows the norm for the language). In the typemap when it converts the table to an array it quietly changes the indexing accordingly. Take note of this behaviour if you have a C function which returns indexes.

    Note: SWIG also can support arrays of pointers in a similar manner.

    28.4.4 Typemaps and pointer-pointer functions

    Several C++ libraries use a pointer-pointer functions to create its objects. These functions require a pointer to a pointer which is then filled with the pointer to the new object. Microsoft's COM and DirectX as well as many other libraries have this kind of function. An example is given below:

    struct iMath;    // some structure
    int Create_Math(iMath** pptr); // its creator (assume it mallocs)
    

    Which would be used with the following C code:

    iMath* ptr;
    int ok;
    ok=Create_Math(&ptr);
    // do things with ptr
    //...
    free(ptr); // dispose of iMath
    

    SWIG has a ready written typemap to deal with such a kind of function in <typemaps.i>. It provides the correct wrapping as well as setting the flag to inform Lua that the object in question should be garbage collected. Therefore the code is simply:

    %include <typemaps.i>
    %apply SWIGTYPE** OUTPUT{iMath **pptr }; // tell SWIG it's an output
    
    struct iMath;    // some structure
    int Create_Math(iMath** pptr); // its creator (assume it mallocs)
    

    The usage is as follows:

    ok, ptr=Create_Math() -- ptr is an iMath* which is returned with the int (ok)
    ptr=nil -- the iMath* will be GC'ed as normal
    

    28.5 Writing typemaps

    This section describes how you can modify SWIG's default wrapping behavior for various C/C++ datatypes using the %typemap directive. This is an advanced topic that assumes familiarity with the Lua C API as well as the material in the "Typemaps " chapter.

    Before proceeding, it should be stressed that writing typemaps is rarely needed unless you want to change some aspect of the wrapping, or to achieve an effect which in not available with the default bindings.

    Before proceeding, you should read the previous section on using typemaps, and look at the existing typemaps found in luatypemaps.swg and typemaps.i. These are both well documented and fairly easy to read. You should not attempt to write your own typemaps until you have read and can understand both of these files (they may well also give you an idea to base your work on).

    28.5.1 Typemaps you can write

    There are many different types of typemap that can be written, the full list can be found in the "Typemaps" chapter. However the following are the most commonly used ones.

    • in this is for input arguments to functions
    • out this is for return types from functions
    • argout this is for a function argument which is actually returning something
    • typecheck this is used to determine which overloaded function should be called (the syntax for the typecheck is different from the typemap, see typemaps for details).

    28.5.2 SWIG's Lua-C API

    This section explains the SWIG specific Lua-C API. It does not cover the main Lua-C api, as this is well documented and not worth covering.

    int SWIG_ConvertPtr(lua_State* L, int index, void** ptr, swig_type_info *type, int flags);

    This is the standard function used for converting a Lua userdata to a void*. It takes the value at the given index in the Lua state and converts it to a userdata. It will then provide the necessary type checks, confirming that the pointer is compatible with the type given in 'type'. Then finally setting '*ptr' to the pointer. If flags is set to SWIG_POINTER_DISOWN, this is will clear any ownership flag set on the object.
    This returns a value which can be checked with the macro SWIG_IsOK()

    void SWIG_NewPointerObj(lua_State* L, void* ptr, swig_type_info *type, int own);

    This is the opposite of SWIG_ConvertPtr, as it pushes a new userdata which wrappers the pointer 'ptr' of type 'type'. The parameter 'own' specifies if the object is owned be Lua and if it is 1 then Lua will GC the object when the userdata is disposed of.

    void* SWIG_MustGetPtr(lua_State* L, int index, swig_type_info *type, int flags, int argnum, const char* func_name);

    This function is a version of SWIG_ConvertPtr(), except that it will either work, or it will trigger a lua_error() with a text error message. This function is rarely used, and may be deprecated in the future.

    SWIG_fail

    This macro, when called within the context of a SWIG wrapped function, will jump to the error handler code. This will call any cleanup code (freeing any temp variables) and then triggers a lua_error.
    A common use for this code is:
    if (!SWIG_IsOK(SWIG_ConvertPtr( .....)){
     lua_pushstring(L, "something bad happened");
     SWIG_fail;
    }

    SWIG_fail_arg(char* func_name, int argnum, char* type)

    This macro, when called within the context of a SWIG wrapped function, will display the error message and jump to the error handler code. The error message is of the form
    "Error in func_name (arg argnum), expected 'type' got 'whatever the type was'"
    

    SWIG_fail_ptr(const char* fn_name, int argnum, swig_type_info* type);

    Similar to SWIG_fail_arg, except that it will display the swig_type_info information instead.

    28.6 Customization of your Bindings

    This section covers adding of some small extra bits to your module to add the last finishing touches.

    28.6.1 Writing your own custom wrappers

    Sometimes, it may be necessary to add your own special functions, which bypass the normal SWIG wrapper method, and just use the native Lua API calls. These 'native' functions allow direct adding of your own code into the module. This is performed with the %native directive as follows:

    %native(my_func) int native_function(lua_State*L);  // registers native_function() with SWIG
    ...
    %{
    int native_function(lua_State*L) // my native code
    {
     ...
    }
    %}
    

    The %native directive in the above example, tells SWIG that there is a function int native_function(lua_State*L); which is to be added into the module under the name 'my_func'. SWIG will not add any wrapper for this function, beyond adding it into the function table. How you write your code is entirely up to you.

    28.6.2 Adding additional Lua code

    As well as adding additional C/C++ code, it's also possible to add your own Lua code to the module as well. This code is executed once all other initialisation, including the %init code has been called.

    The directive %luacode adds code into the module which is executed upon loading. Normally you would use this to add your own functions to the module. Though you could easily perform other tasks.

    %module example;
    
    %luacode {
      function example.greet() 
        print "hello world" 
      end
    
      print "Module loaded ok"
    }
    ...
    %}
    

    Notice that the code is not part of the module table. Therefore any references to the module must have the module name added.

    Should there be an error in the Lua code, this will not stop loading of the module. The default behaviour of SWIG is to print an error message to stderr and then continue. It is possible to change this behaviour by using a #define SWIG_DOSTRING_FAIL(STR) to define a different behaviour should the code fail.

    Good uses for this feature is adding of new code, or writing helper functions to simplify some of the code. See Examples/lua/arrays for an example of this code.

    28.7 Details on the Lua binding

    In the previous section, a high-level view of Lua wrapping was presented. Obviously a lot of stuff happens behind the scenes to make this happen. This section will explain some of the low-level details on how this is achieved.

    If you just want to use SWIG and don't care how it works, then stop reading here. This is going into the guts of the code and how it works. It's mainly for people who need to know what's going on within the code.

    28.7.1 Binding global data into the module.

    Assuming that you had some global data that you wanted to share between C and Lua. How does SWIG do it?

    %module example;
    extern double Foo;
    

    SWIG will effectively generate the pair of functions

    void Foo_set(double);
    double Foo_get();
    

    At initialisation time, it will then add to the interpreter a table called 'example', which represents the module. It will then add all its functions to the module. (Note: older versions of SWIG actually added the Foo_set() and Foo_get() functions, current implementation does not add these functions any more.) But it also adds a metatable to this table, which has two functions (__index and __newindex ) as well as two tables (.get and .set) The following Lua code will show these hidden features.

    > print(example)
    table: 003F8F90
    > m=getmetatable(example)
    > table.foreach(m, print)
    .set    table: 003F9088
    .get    table: 003F9038
    __index function: 003F8FE0
    __newindex      function: 003F8FF8
    > g=m['.get']
    > table.foreach(g, print)
    Foo     function: 003FAFD8
    >
    

    The .get and .set tables are lookups connecting the variable name 'Foo' to the accessor/mutator functions (Foo_set, Foo_get)

    The Lua equivalent of the code for the __index and __newindex looks a bit like this

    function __index(mod, name)
            local g=getmetatable(mod)['.get'] -- gets the table
            if not g then return nil end
            local f=g[name] -- looks for the function
            -- calls it & returns the value
            if type(f)=="function" then return f() end
            return nil
    end
    
    function __newindex(mod, name, value)
            local s=getmetatable(mod)['.set'] -- gets the table
            if not s then return end
            local f=s[name] -- looks for the function
            -- calls it to set the value
            if type(f)=="function" then f(value)
            else rawset(mod, name, value) end
    end
    

    That way when you call 'a=example.Foo', the interpreter looks at the table 'example' sees that there is no field 'Foo' and calls __index. This will in turn check in '.get' table and find the existence of 'Foo' and then return the value of the C function call 'Foo_get()'. Similarly for the code 'example.Foo=10', the interpreter will check the table, then call the __newindex which will then check the '.set' table and call the C function 'Foo_set(10)'.

    28.7.2 Userdata and Metatables

    As mentioned earlier, classes and structures, are all held as pointer, using the Lua 'userdata' structure. This structure is actually a pointer to a C structure 'swig_lua_userdata', which contains the pointer to the data, a pointer to the swig_type_info (an internal SWIG struct) and a flag which marks if the object is to be disposed of when the interpreter no longer needs it. The actual accessing of the object is done via the metatable attached to this userdata.

    The metatable is a Lua 5.0 feature (which is also why SWIG cannot wrap Lua 4.0). It's a table which holds a list of functions, operators and attributes. This is what gives the userdata the feeling that it is a real object and not just a hunk of memory.

    Given a class

    %module excpp;
    
    class Point
    {
    public:
     int x, y;
     Point(){x=y=0;}
     ~Point(){}
     virtual void Print(){printf("Point @%p (%d, %d)\n", this, x, y);}
    };
    

    SWIG will create a module excpp, with all the various functions inside. However to allow the intuitive use of the userdata, SWIG also creates up a set of metatables. As seen in the above section on global variables, use of the metatables allows for wrappers to be used intuitively. To save effort, the code creates one metatable per class and stores it inside Lua's registry. Then when a new object is instantiated, the metatable is found in the registry and the userdata associated with the metatable. Currently, derived classes make a complete copy of the base class' table and then add on their own additional functions.

    Some of the internals can be seen by looking at the metatable of a class:

    > p=excpp.Point()
    > print(p)
    userdata: 003FDB28
    > m=getmetatable(p)
    > table.foreach(m, print)
    .type   Point
    __gc    function: 003FB6C8
    __newindex      function: 003FB6B0
    __index function: 003FB698
    .get    table: 003FB4D8
    .set    table: 003FB500
    .fn     table: 003FB528
    

    The '.type' attribute is the name of the class. The '.get' and '.set' tables work in a similar manner to the modules, the main difference is the '.fn' table which also holds all the member functions. (The '__gc' function is the class' destructor function)

    The Lua equivalent of the code for enabling functions looks a little like this

    function __index(obj, name)
            local m=getmetatable(obj) -- gets the metatable
            if not m then return nil end
            local g=m['.get'] -- gets the attribute table
            if not g then return nil end
            local f=g[name] -- looks for the get_attribute function
            -- calls it & returns the value
            if type(f)=="function" then return f() end
            -- ok, so it not an attribute, maybe it's a function
            local fn=m['.fn'] -- gets the function table
            if not fn then return nil end
            local f=fn[name] -- looks for the function
            -- if found the fn then return the function
            -- so the interpreter can call it
            if type(f)=="function" then return f end
            return nil
    end
    

    So when 'p:Print()' is called, the __index looks on the object metatable for a 'Print' attribute, then looks for a 'Print' function. When it finds the function, it returns the function, and then interpreter can call 'Point_Print(p)'

    In theory, you can play with this usertable & add new features, but remember that it is a shared table between all instances of one class, and you could very easily corrupt the functions in all the instances.

    Note: Both the opaque structures (like the FILE*) and normal wrapped classes/structs use the same 'swig_lua_userdata' structure. Though the opaque structures has do not have a metatable attached, or any information on how to dispose of them when the interpreter has finished with them.

    Note: Operator overloads are basically done in the same way, by adding functions such as '__add' & '__call' to the class' metatable. The current implementation is a bit rough as it will add any member function beginning with '__' into the metatable too, assuming its an operator overload.

    28.7.3 Memory management

    Lua is very helpful with the memory management. The 'swig_lua_userdata' is fully managed by the interpreter itself. This means that neither the C code nor the Lua code can damage it. Once a piece of userdata has no references to it, it is not instantly collected, but will be collected when Lua deems is necessary. (You can force collection by calling the Lua function collectgarbage() ). Once the userdata is about to be free'ed, the interpreter will check the userdata for a metatable and for a function '__gc'. If this exists this is called. For all complete types (ie normal wrapped classes & structs) this should exist. The '__gc' function will check the 'swig_lua_userdata' to check for the 'own' field and if this is true (which is will be for all owned data) it will then call the destructor on the pointer.

    It is currently not recommended to edit this field or add some user code, to change the behaviour. Though for those who wish to try, here is where to look.

    It is also currently not possible to change the ownership flag on the data (unlike most other scripting languages, Lua does not permit access to the data from within the interpreter).


    29 SWIG and Octave

    Octave is a high-level language intended for numerical programming that is mostly compatible with MATLAB. More information can be found at Octave web site.

    This chapter is intended to give an introduction to using the module. You should also read the SWIG documentation that is not specific to Octave. Also, there are a dozen or so examples in the Examples/octave directory, and hundreds in the test suite (Examples/test-suite and Examples/test-suite/octave).

    29.1 Preliminaries

    SWIG is regularly tested against the following versions of Octave: 3.8, 4.0, 4.2.

    Every effort is made to maintain backward compatibility with older versions of Octave. This cannot be guaranteed however, as in recent times new Octave releases have required nontrivial updates to SWIG, which may break backward compatibility for older Octave versions against which SWIG is not regularly tested.

    The SWIG runtime exports the function swig_octave_prereq() for checking the version of Octave.

    29.2 Running SWIG

    Let's start with a very simple SWIG interface file, example.i:

    %module swigexample
    %{
    #include "example.h"
    %}
    int gcd(int x, int y);
    extern double Foo; 

    To build an Octave module when wrapping C code, run SWIG using the -octave option:

    $ swig -octave -o example_wrap.cpp example.i 

    The -c++ option is also required when wrapping C++ code:

    $ swig -octave -c++ -o example_wrap.cpp example.i 

    This creates a C++ source file "example_wrap.cpp". A C++ file is generated even when wrapping C code as Octave is itself written in C++ and requires wrapper code to be in the same language. The generated C++ source file contains the low-level wrappers that need to be compiled and linked with the rest of your C/C++ application (in this case, the gcd implementation) to create an extension module.

    29.2.1 Command-line options

    The swig command line has a number of options you can use, like to redirect its output. Use swig -help to learn about these. Options specific to the Octave module are:

    $ swig -octave -help
    ...
    Octave Options (available with -octave)
         -globals name - Set name used to access C global variables [default: 'cvar']
                         Use '.' to load C global variables into module namespace
         -opprefix str - Prefix str for global operator functions [default: 'op_']
    

    The -globals option sets the name of the variable which is the namespace for C global variables exported by the module. The special name "." loads C global variables into the module namespace, i.e. alongside C functions and structs exported by the module. The -opprefix options sets the prefix of the names of global/friend operator functions.

    29.2.2 Compiling a dynamic module

    Octave modules are DLLs/shared objects having the ".oct" suffix. Building an oct file is usually done with the mkoctfile command (either within Octave itself, or from the shell). For example,

    $ swig -octave -c++ -o example_wrap.cpp example.i
    $ mkoctfile example_wrap.cpp example.c
    

    where "example.c" is the file containing the gcd() implementation.

    mkoctfile can also be used to extract the build parameters required to invoke the compiler and linker yourself. See the Octave manual and mkoctfile man page.

    mkoctfile will produce "swigexample.oct", which contains the compiled extension module. Loading it into Octave is then a matter of invoking

    octave:1> swigexample

    29.2.3 Using your module

    Assuming all goes well, you will be able to do this:

    $ octave -q
    octave:1> swigexample
    octave:2> swigexample.gcd(4, 6)
    ans =  2
    octave:3> swigexample.cvar.Foo
    ans =  3
    octave:4> swigexample.cvar.Foo=4;
    octave:5> swigexample.cvar.Foo
    ans =  4 

    29.3 A tour of basic C/C++ wrapping

    29.3.1 Modules

    The SWIG module directive specifies the name of the Octave module. If you specify "module swigexample", then in Octave everything in the module will be accessible under "swigexample", as in the above example. When choosing a module name, make sure you don't use the same name as a built-in Octave command or standard module name.

    When Octave is asked to invoke swigexample, it will try to find the ".m" or ".oct" file that defines the function "swigexample". You therefore need to make sure that "swigexample.oct" is in Octave's search path, which can be specified with the environment variable "OCTAVE_PATH".

    To load an Octave module, simply type its name:

    octave:1> swigexample;
    octave:2> gcd(4, 6)
    ans =  2
    octave:3> cvar.Foo
    ans =  3
    octave:4> cvar.Foo=4;
    octave:5> cvar.Foo
    ans =  4
    

    Modules can also be loaded from within functions, even before being loaded in the base context. If the module is also used in the base context, however, it must first be loaded again:

    octave:1> function l = my_lcm(a, b)
    > swigexample
    > l = abs(a*b)/swigexample.gcd(a, b);
    > endfunction
    octave:2> my_lcm(4, 6)
    ans =  12
    octave:3> swigexample.gcd(4, 6)
    error: can't perform indexing operations for <unknown type> type
    octave:3> swigexample;
    octave:4> swigexample.gcd(4, 6)
    ans =  2
    

    29.3.2 Functions

    Global functions are wrapped as new Octave built-in functions. For example,

    %module swigexample
    int fact(int n); 

    creates a built-in function swigexample.fact(n) that works exactly like you think it does:

    octave:1> swigexample.fact(4)
    24 

    29.3.3 Global variables

    Global variables are a little special in Octave. Given a global variable:

    %module swigexample
    extern double Foo;
    

    To expose variables, SWIG actually generates two functions, to get and set the value. In this case, Foo_set and Foo_set would be generated. SWIG then automatically calls these functions when you get and set the variable-- in the former case creating a local copy in the interpreter of the C variables, and in the latter case copying an interpreter variables onto the C variable.

    octave:1> swigexample;
    octave:2> c=swigexample.cvar.Foo
    c =  3
    octave:3> swigexample.cvar.Foo=4;
    octave:4> c
    c =  3
    octave:5> swigexample.cvar.Foo
    ans =  4

    If a variable is marked with the %immutable directive then any attempts to set this variable will cause an Octave error. Given a global variable:

    %module swigexample
    %immutable;
    extern double Foo;
    %mutable;
    

    SWIG will allow the reading of Foo but when a set attempt is made, an error function will be called.

    octave:1> swigexample
    octave:2> swigexample.Foo=4
    error: attempt to set immutable member variable
    error: assignment failed, or no method for `swig_type = scalar'
    error: evaluating assignment expression near line 2, column 12 

    It is possible to add new functions or variables to the module. This also allows the user to rename/remove existing functions and constants (but not linked variables, mutable or immutable). Therefore users are recommended to be careful when doing so.

    octave:1> swigexample;
    octave:2> swigexample.PI=3.142;
    octave:3> swigexample.PI
    ans =  3.1420 

    29.3.4 Constants and enums

    Because Octave doesn't really have the concept of constants, C/C++ constants are not really constant in Octave. They are actually just a copy of the value into the Octave interpreter. Therefore they can be changed just as any other value. For example given some constants:

    %module swigexample
    %constant int ICONST=42;
    #define    SCONST      "Hello World"
    enum Days{SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY};
    

    This is 'effectively' converted into the following Octave code:

    swigexample.ICONST=42
    swigexample.SCONST="Hello World"
    swigexample.SUNDAY=0
    .... 

    29.3.5 Pointers

    C/C++ pointers are fully supported by SWIG. Furthermore, SWIG has no problem working with incomplete type information. Given a wrapping of the <file.h> interface: C/C++ pointers are fully supported by SWIG. Furthermore, SWIG has no problem working with incomplete type information. Given a wrapping of the <file.h> interface:

    %module swigexample
    FILE *fopen(const char *filename, const char *mode);
    int fputs(const char *, FILE *);
    int fclose(FILE *);
    

    When wrapped, you will be able to use the functions in a natural way from Octave. For example:

    octave:1> swigexample;
    octave:2> f=swigexample.fopen("w", "junk");
    octave:3> swigexample.fputs("Hello world", f);
    octave:4> swigexample.fclose(f);
    

    Simply printing the value of a wrapped C++ type will print its typename. E.g.,

    octave:1> swigexample;
    octave:2> f=swigexample.fopen("junk", "w");
    octave:3> f
    f =
    
    {
      _p_FILE, ptr = 0x9b0cd00
    } 

    As the user of the pointer, you are responsible for freeing it, or closing any resources associated with it (just as you would in a C program). This does not apply so strictly to classes and structs (see below).

    octave:1> swigexample;
    octave:2> f=swigexample.fopen("not there", "r");
    error: value on right hand side of assignment is undefined
    error: evaluating assignment expression near line 2, column 2 

    29.3.6 Structures and C++ classes

    SWIG wraps C structures and C++ classes by using a special Octave type called a swig_ref. A swig_ref contains a reference to one or more instances of C/C++ objects, or just the type information for an object. For each wrapped structure and class, a swig_ref will be exposed that has the name of the type. When invoked as a function, it creates a new object of its type and returns a swig_ref that points to that instance. This provides a very natural interface. For example,

    struct Point{
      int x, y;
    };
    

    is used as follows:

    octave:1> swigexample;
    octave:2> p=swigexample.Point();
    octave:3> p.x=3;
    octave:4> p.y=5;
    octave:5> p.x, p.y
    ans =  3
    ans =  5 
    

    In C++, invoking the type object in this way calls the object's constructor. swig_ref objects can also be acquired by having a wrapped function return a pointer, reference, or value of a non-primitive type.

    The swig_ref type handles indexing operations such that usage maps closely to what you would have in C/C++. Structure members are accessed as in the above example, by calling set and get methods for C++ variables. Methods also work as expected. For example, code wrapped in the following way

    class Point{
    public:
      int x, y;
      Point(int _x, int _y) : x(_x), y(_y) {}
      double distance(const Point& rhs) {
        return sqrt(pow(x-rhs.x, 2)+pow(y-rhs.y, 2));
      }
      void set(int _x, int _y) {
        x=_x; y=_y;
      }
    };
    

    can be used from Octave like this

    octave:1> swigexample;
    octave:2> p1=swigexample.Point(3, 5);
    octave:3> p2=swigexample.Point(1, 2);
    octave:4> p1.distance(p2)
    ans =  3.6056
    

    By using the swig_this() and swig_type() functions, one can discover the pointers to and types of the underlying C/C++ object.

    octave:5> swig_this(p1)
    ans = 162504808
    octave:6> swig_type(p1)
    ans = Point
    

    Note that swig_ref is a reference-counted pointer to a C/C++ object/type, and as such has pass-by-reference semantics. For example if one has a allocated a single object but has two swig_ref 's pointing to it, modifying the object through either of them will change the single allocated object. This differs from the usual pass-by-value (copy-on-write) semantics that Octave maintains for built-in types. For example, in the following snippet, modifying b does not modify a,

    octave:7> a=struct('x', 4)
    a =
    {
      x =  4
    }
    
    octave:8> b=a
    b =
    {
      x =  4
    }
    
    octave:9> b.y=4
    b =
    {
      x =  4
      y =  4
    }
    
    octave:10> a
    a =
    {
      x =  4
    }
    

    However, when dealing with wrapped objects, one gets the behavior

    octave:2> a=Point(3, 5)
    a =
    
    {
      Point, ptr = 0x9afbbb0
    }
    
    octave:3> b=a
    b =
    
    {
      Point, ptr = 0x9afbbb0
    }
    
    octave:4> b.set(2, 1);
    octave:5> b.x, b.y
    ans =  2
    ans =  1
    octave:6> a.x, a.y
    ans =  2
    ans =  1
    

    Depending on the ownership setting of a swig_ref, it may call C++ destructors when its reference count goes to zero. See the section on memory management below for details.

    29.3.7 C++ inheritance

    Single and multiple inheritance are fully supported. The swig_ref type carries type information along with any C++ object pointer it holds. This information contains the full class hierarchy. When an indexing operation (such as a method invocation) occurs, the tree is walked to find a match in the current class as well as any of its bases. The lookup is then cached in the swig_ref.

    29.3.8 C++ overloaded functions

    Overloaded functions are supported, and handled as in other modules. That is, each overload is wrapped separately (under internal names), and a dispatch function is also emitted under the external/visible name. The dispatch function selects which overload to call (if any) based on the passed arguments. typecheck typemaps are used to analyze each argument, as well as assign precedence. See the chapter on typemaps for details.

    29.3.9 C++ operators

    C++ operator overloading is supported, in a way similar to other modules. The swig_ref type supports all unary and binary operators between itself and all other types that exist in the system at module load time. When an operator is used (where one of the operands is a swig_ref), the runtime routes the call to either a member function of the given object, or to a global function whose named is derived from the types of the operands (either both or just the lhs or rhs).

    For example, if a and b are SWIG variables in Octave, a+b becomes a.__add__(b). The wrapper is then free to implement __add__ to do whatever it wants. A wrapper may define the __add__ function manually, %rename some other function to it, or %rename a C++ operator to it.

    By default the C++ operators are renamed to their corresponding Octave operators. So without doing any work, the following interface

    %inline {
    struct A {
      int value;
      A(int _value) : value(_value) {}
      A operator+ (const A& x) {
        return A(value+x.value);
      }
    };
    }
    

    is usable from Octave like this:

    a=A(2), b=A(3), c=a+b
    assert(c.value==5);
    

    Octave operators are mapped in the following way:

    __brace__      a{args}
    __brace_asgn__ a{args} = rhs
    __paren__      a(args)
    __paren_asgn__ a(args) = rhs
    __str__        generates string rep
    __not__        !a
    __uplus__      +a
    __uminus__     -a
    __transpose__  a.'
    __hermitian__  a'
    __incr__       a++
    __decr__       a--
    __add__        a + b
    __sub__        a - b
    __mul__        a * b
    __div__        a / b
    __pow__        a ^ b
    __ldiv__       a \ b
    __lshift__     a <<b
    __rshift__     a >> b
    __lt__         a  <b
    __le__         a  <= b
    __eq__         a == b
    __ge__         a >= b
    __gt__         a > b
    __ne__         a != b
    __el_mul__     a .* b
    __el_div__     a ./ b
    __el_pow__     a .^ b
    __el_ldiv__    a .\ b
    __el_and__     a & b
    __el_or__      a | b
    

    On the C++ side, the default mappings are as follows:

    %rename(__add__)       *::operator+;
    %rename(__add__)       *::operator+();
    %rename(__add__)       *::operator+() const;
    %rename(__sub__)       *::operator-;
    %rename(__uminus__)    *::operator-();
    %rename(__uminus__)    *::operator-() const;
    %rename(__mul__)       *::operator*;
    %rename(__div__)       *::operator/;
    %rename(__mod__)       *::operator%;
    %rename(__lshift__)    *::operator<
    
    >;
    %rename(__el_and__)    *::operator&&;
    %rename(__el_or__)     *::operator||;
    %rename(__xor__)       *::operator^;
    %rename(__invert__)    *::operator~;
    %rename(__lt__)        *::operator
    
    ;
    %rename(__ge__)        *::operator>=;
    %rename(__eq__)        *::operator==;
    %rename(__ne__)        *::operator!=;
    %rename(__not__)       *::operator!;
    %rename(__incr__)      *::operator++;
    %rename(__decr__)      *::operator--;
    %rename(__paren__)     *::operator();
    %rename(__brace__)     *::operator[];
    

    Octave can also utilise friend (i.e. non-member) operators with a simple %rename: see the example in the Examples/octave/operator directory.

    29.3.10 Class extension with %extend

    The %extend directive works the same as in other modules.

    You can use it to define special behavior, like for example defining Octave operators not mapped to C++ operators, or defining certain Octave mechanisms such as how an object prints. For example, the octave_value::{is_string, string_value, print} functions are routed to a special method __str__ that can be defined inside an %extend.

    %extend A {
    string __str__() {
      stringstream sout;
      sout<<$self->value;
      return sout.str();
    }
    }
    

    Then in Octave one gets,

    octave:1> a=A(4);
    octave:2> a
    a = 4
    octave:3> printf("%s\n", a);
    4
    octave:4> a.__str__()
    4
    

    Similarly, Octave can use the __float__ method to convert an object to a numeric value.

    Octave 3.8.0 and later versions will also map unary functions X() to the corresponding __X__ method, where X includes: abs(), acos(), acosh(), angle(), arg(), asin(), asinh(), atan(), atanh(), cbrt(), ceil(), conj(), cos(), cosh(), dawson(), erf(), erfc(), erfcinv(), erfcx(), erfi(), erfinv(), exp(), expm1(), finite(), fix(), floor(), gamma(), imag(), isalnum(), isalpha(), isascii(), iscntrl(), isdigit(), isgraph(), isinf(), islower(), isna(), isnan(), isprint(), ispunct(), isspace(), isupper(), isxdigit(), lgamma(), log(), log10(), log1p(), log2(), real(), round(), roundb(), signbit(), signum(), sin(), sinh(), sqrt(), tan(), tanh(), toascii(), tolower(), toupper()

    29.3.11 C++ templates

    C++ class and function templates are fully supported as in other modules, in that the %template directive may used to create explicit instantiations of templated types. For example, function templates can be instantiated as follows:

    %module swigexample
    %inline {
      template<class __scalar>
        __scalar mul(__scalar a, __scalar b) {
        return a*b;
      }
    }
    %include <std_complex.i>
    %template(mul) mul<std::complex<double> >
    %template(mul) mul<double>
    

    and then used from Octave

    octave:1> mul(4, 3)
    ans =  12
    octave:2> mul(4.2, 3.6)
    ans =  15.120
    octave:3> mul(3+4i, 10+2i)
    ans =  22 + 46i
    

    Similarly, class templates can be instantiated as in the following example,

    %module swigexample
    %include <std_complex.i>
    %include <std_string.i>
    %inline {
      #include <sstream>
      template<class __scalar> class sum {
        __scalar s;
      public:
        sum(__scalar _s=0) : s(_s) {}
        sum& add(__scalar _s) {
          s+=_s;
          return *this;
        }
        std::string __str__() const {
          std::stringstream sout;
          sout<<s;
          return sout.str();
        }
      };
    }
    %template(sum_complex) sum<std::complex<double> >;
    %template(sum_double) sum<double>;
    

    and then used from Octave

    octave:2> a=sum_complex(2+3i);
    octave:3> a.add(2)
    ans =
    
    (4, 3)
    octave:4> a.add(3+i)
    ans =
    
    (7, 4)
    

    29.3.12 C++ Smart Pointers

    29.3.12.1 The shared_ptr Smart Pointer

    The C++11 standard provides std::shared_ptr which was derived from the Boost implementation, boost::shared_ptr. Both of these are available for Octave in the SWIG library and usage is outlined in the shared_ptr smart pointer library section.

    29.3.12.2 Generic Smart Pointers

    C++ smart pointers are fully supported as in other modules.

    29.3.13 Directors (calling Octave from C++ code)

    There is full support for SWIG Directors, which permits Octave code to subclass C++ classes, and implement their virtual methods.

    Octave has no direct support for object oriented programming, however the swig_ref type provides some of this support. You can manufacture a swig_ref using the subclass function (provided by the SWIG/Octave runtime).

    For example,

    octave:1> a=subclass();
    octave:2> a.my_var = 4;
    octave:3> a.my_method = @(self) printf("my_var = ", self.my_var);
    octave:4> a.my_method();
    my_var = 4
    

    subclass() can also be used to subclass one or more C++ types. Suppose you have an interface defined by

    %inline {
    class A {
    public:
      virtual my_method() {
        printf("c-side routine called\n");
      }
    };
    void call_your_method(A& a) {
      a.my_method();
    }
    }
    

    Then from Octave you can say:

    octave:1> B=@() subclass(A(), @my_method);
    octave:2> function my_method(self)
    octave:3>   printf("octave-side routine called\n");
    octave:4> end
    octave:5> call_your_method(B());
    octave-side routine called
    

    or more concisely,

    octave:1> B=@() subclass(A(), 'my_method', @(self) printf("octave-side routine called\n"));
    octave:2> call_your_method(B());
    octave-side routine called
    

    Note that you have to enable directors via the %feature directive (see other modules for this).

    subclass() will accept any number of C++ bases or other subclass()'ed objects, (string, octave_value) pairs, and function_handles. In the first case, these are taken as base classes; in the second case, as named members (either variables or functions, depending on whether the given value is a function handle); in the third case, as member functions whose name is taken from the given function handle. E.g.,

    octave:1> B=@(some_var=2) subclass(A(), 'some_var', some_var, @some_func, 'another_func',
    @(self) do_stuff())
    

    You can also assign non-C++ member variables and functions after construct time. There is no support for non-C++ static members.

    There is limited support for explicitly referencing C++ bases. So, in the example above, we could have

    octave:1> B=@() subclass(A(), @my_method);
    octave:2> function my_method(self)
    octave:3>   self.A.my_method();
    octave:4>   printf("octave-side routine called\n");
    octave:5> end
    octave:6> call_your_method(B());
    c-side routine called
    octave-side routine called
    

    29.3.14 Threads

    The use of threads in wrapped Director code is not supported; i.e., an Octave-side implementation of a C++ class must be called from the Octave interpreter's thread. Anything fancier (apartment/queue model, whatever) is left to the user. Without anything fancier, this amounts to the limitation that Octave must drive the module... like, for example, an optimization package that calls Octave to evaluate an objective function.

    29.3.15 Memory management

    As noted above, swig_ref represents a reference counted pointer to a C/C++-side object. It also contains a flag indicating whether Octave or the C/C++ code owns the object. If Octave owns it, any destructors will be called when the reference count reaches zero. If the C/C++ side owns the object, then destructors will not be called when the reference count goes to zero.

    For example,

    %inline {
    class A {
    public:
      A() { printf("A constructing\n"); }
      ~A() { printf("A destructing\n"); }
    };
    }
    

    Would produce this behavior in Octave:

    octave:1> a=A();
    A constructing
    octave:2> b=a;
    octave:3> clear a;
    octave:4> b=4;
    A destructing
    

    The %newobject directive may be used to control this behavior for pointers returned from functions.

    In the case where one wishes for the C++ side to own an object that was created in Octave (especially a Director object), one can use the __disown() method to invert this logic. Then letting the Octave reference count go to zero will not destroy the object, but destroying the object will invalidate the Octave-side object if it still exists (and call destructors of other C++ bases in the case of multiple inheritance/subclass()'ing).

    29.3.16 STL support

    Various STL library files are provided for wrapping STL containers.

    29.3.17 Matrix typemaps

    Octave provides a rich set of classes for dealing with matrices. Currently there are no built-in typemaps to deal with those. However, these are relatively straight forward for users to add themselves (see the docs on typemaps). Without much work (a single typemap decl-- say, 5 lines of code in the interface file), it would be possible to have a function

    double my_det(const double* mat, int m, int n);
    

    that is accessed from Octave as,

    octave:1> my_det(rand(4));
    ans = -0.18388
    


    30 SWIG and Perl5

    Caution: This chapter is under repair!

    This chapter describes SWIG's support of Perl5. Although the Perl5 module is one of the earliest SWIG modules, it has continued to evolve and has been improved greatly with the help of SWIG users. For the best results, it is recommended that SWIG be used with Perl 5.8 or later. We're no longer testing regularly with older versions, but Perl 5.6 seems to mostly work, while older versions don't.

    30.1 Overview

    To build Perl extension modules, SWIG uses a layered approach. At the lowest level, simple procedural wrappers are generated for functions, classes, methods, and other declarations in the input file. Then, for structures and classes, an optional collection of Perl proxy classes can be generated in order to provide a more natural object oriented Perl interface. These proxy classes simply build upon the low-level interface.

    In describing the Perl interface, this chapter begins by covering the essentials. First, the problem of configuration, compiling, and installing Perl modules is discussed. Next, the low-level procedural interface is presented. Finally, proxy classes are described. Advanced customization features, typemaps, and other options are found near the end of the chapter.

    30.2 Preliminaries

    To build a Perl5 module, run SWIG using the -perl or -perl5 option as follows:

    swig -perl example.i
    
    

    This produces two files. The first file, example_wrap.c contains all of the C code needed to build a Perl5 module. The second file, example.pm contains supporting Perl code needed to properly load the module.

    To build the module, you will need to compile the file example_wrap.c and link it with the rest of your program.

    30.2.1 Getting the right header files

    In order to compile, SWIG extensions need the following Perl5 header files:

    #include "Extern.h"
    #include "perl.h"
    #include "XSUB.h"
    

    These are typically located in a directory like this

    /usr/lib/perl/5.14/CORE
    

    The SWIG configuration script automatically tries to locate this directory so that it can compile examples. However, if you need to find out where the directory is located, an easy way to find out is to ask Perl itself:

    $ perl -e 'use Config; print "$Config{archlib}\n";'
    /usr/lib/perl/5.14
    

    30.2.2 Compiling a dynamic module

    The preferred approach to building an extension module is to compile it into a shared object file or DLL. Assuming you have code you need to link to in a file called example.c, you will need to compile your program using commands like this (shown for Linux):

    $ swig -perl example.i
    $ gcc -fPIC example.c
    $ gcc -fPIC -c example_wrap.c -I/usr/lib/perl/5.14/CORE -Dbool=char
    $ gcc -shared example.o example_wrap.o -o example.so
    

    The exact compiler options vary from platform to platform. SWIG tries to guess the right options when it is installed. Therefore, you may want to start with one of the examples in the SWIG/Examples/perl5 directory. If that doesn't work, you will need to read the man-pages for your compiler and linker to get the right set of options. You might also check the SWIG Wiki for additional information.

    When linking the module, the name of the shared object file must match the module name used in the SWIG interface file. If you used ` %module example', then the target should be named `example.so ', `example.sl', or the appropriate dynamic module name on your system.

    30.2.3 Building a dynamic module with MakeMaker

    It is also possible to use Perl to build dynamically loadable modules for you using the MakeMaker utility. To do this, write a Perl script such as the following:

    # File : Makefile.PL
    use ExtUtils::MakeMaker;
    WriteMakefile(
            `NAME'    => `example',                  # Name of package
            `LIBS'    => [`-lm'],                    # Name of custom libraries
            `OBJECT'  => `example.o example_wrap.o'  # Object files
    );
    
    

    Now, to build a module, simply follow these steps:

    $ perl Makefile.PL
    $ make
    $ make install
    

    If you are planning to distribute a SWIG-generated module, this is the preferred approach to compilation. More information about MakeMaker can be found in "Programming Perl, 2nd ed." by Larry Wall, Tom Christiansen, and Randal Schwartz.

    30.2.4 Building a static version of Perl

    If you machine does not support dynamic loading or if you've tried to use it without success, you can build a new version of the Perl interpreter with your SWIG extensions added to it. To build a static extension, you first need to invoke SWIG as follows:

    $ swig -perl -static example.i
    

    By default SWIG includes code for dynamic loading, but the -static option takes it out.

    Next, you will need to supply a main() function that initializes your extension and starts the Perl interpreter. While, this may sound daunting, SWIG can do this for you automatically as follows:

    %module example
    
    %inline %{
    extern double My_variable;
    extern int fact(int);
    %}
    
    // Include code for rebuilding Perl
    %include <perlmain.i>
    

    The same thing can be accomplished by running SWIG as follows:

    $ swig -perl -static -lperlmain.i example.i
    

    The perlmain.i file inserts Perl's main() function into the wrapper code and automatically initializes the SWIG generated module. If you just want to make a quick a dirty module, this may be the easiest way. By default, the perlmain.i code does not initialize any other Perl extensions. If you need to use other packages, you will need to modify it appropriately. You can do this by just copying perlmain.i out of the SWIG library, placing it in your own directory, and modifying it to suit your purposes.

    To build your new Perl executable, follow the exact same procedure as for a dynamic module, but change the link line to something like this:

    $ gcc example.o example_wrap.o -L/usr/lib/perl/5.14/CORE \
            -lperl -lsocket -lnsl -lm -o myperl
    

    This will produce a new version of Perl called myperl. It should be functionality identical to Perl with your C/C++ extension added to it. Depending on your machine, you may need to link with additional libraries such as -lsocket, -lnsl, -ldl, etc.

    30.2.5 Using the module

    To use the module, simply use the Perl use statement. If all goes well, you will be able to do this:

    $ perl
    use example;
    print example::fact(4), "\n";
    24
    

    A common error received by first-time users is the following:

    use example;
    Can't locate example.pm in @INC (@INC contains: /etc/perl /usr/local/lib/perl/5.14.2 /usr/local/share/perl/5.14.2 /usr/lib/perl5 /usr/share/perl5 /usr/lib/perl/5.14 /usr/share/perl/5.14 /usr/local/lib/site_perl .) at - line 1.
    BEGIN failed--compilation aborted at - line 1.
    

    This error is almost caused when the name of the shared object file you created doesn't match the module name you specified with the %module directive.

    A somewhat related, but slightly different error is this:

    use example;
    Can't find 'boot_example' symbol in ./example.so
     at - line 1
    BEGIN failed--compilation aborted at - line 1.
    

    This error is generated because Perl can't locate the module bootstrap function in the SWIG extension module. This could be caused by a mismatch between the module name and the shared library name. However, another possible cause is forgetting to link the SWIG-generated wrapper code with the rest of your application when you linked the extension module.

    Another common error is the following:

    use example;
    Can't load './example.so' for module example: ./example.so: 
    undefined symbol: Foo at /usr/lib/perl/5.14/i386-linux/DynaLoader.pm line 169.
    
     at - line 1
    BEGIN failed--compilation aborted at - line 1.
    

    This error usually indicates that you forgot to include some object files or libraries in the linking of the shared library file. Make sure you compile both the SWIG wrapper file and your original program into a shared library file. Make sure you pass all of the required libraries to the linker.

    Sometimes unresolved symbols occur because a wrapper has been created for a function that doesn't actually exist in a library. This usually occurs when a header file includes a declaration for a function that was never actually implemented or it was removed from a library without updating the header file. To fix this, you can either edit the SWIG input file to remove the offending declaration or you can use the %ignore directive to ignore the declaration. Better yet, update the header file so that it doesn't have an undefined declaration.

    Finally, suppose that your extension module is linked with another library like this:

    $ gcc -shared example.o example_wrap.o -L/home/beazley/projects/lib -lfoo \
          -o example.so
    

    If the foo library is compiled as a shared library, you might get the following error when you try to use your module:

    use example;
    Can't load './example.so' for module example: libfoo.so: cannot open shared object file: 
    No such file or directory at /usr/lib/perl/5.14/i386-linux/DynaLoader.pm line 169.
    
     at - line 1
    BEGIN failed--compilation aborted at - line 1.
    >>>                 
    

    This error is generated because the dynamic linker can't locate the libfoo.so library. When shared libraries are loaded, the system normally only checks a few standard locations such as /usr/lib and /usr/local/lib. To get the loader to look in other locations, there are several things you can do. First, you can recompile your extension module with extra path information. For example, on Linux you can do this:

    $ gcc -shared example.o example_wrap.o -L/home/beazley/projects/lib -lfoo \
          -Xlinker -rpath /home/beazley/projects/lib \
          -o example.so
    

    Alternatively, you can set the LD_LIBRARY_PATH environment variable to include the directory with your shared libraries. If setting LD_LIBRARY_PATH, be aware that setting this variable can introduce a noticeable performance impact on all other applications that you run. To set it only for Perl, you might want to do this instead:

    $ env LD_LIBRARY_PATH=/home/beazley/projects/lib perl
    

    Finally, you can use a command such as ldconfig (Linux) or crle (Solaris) to add additional search paths to the default system configuration (this requires root access and you will need to read the man pages).

    30.2.6 Compilation problems and compiling with C++

    Compilation of C++ extensions has traditionally been a tricky problem. Since the Perl interpreter is written in C, you need to take steps to make sure C++ is properly initialized and that modules are compiled correctly.

    On most machines, C++ extension modules should be linked using the C++ compiler. For example:

    $ swig -c++ -perl example.i
    $ g++ -fPIC -c example.cxx
    $ g++ -fPIC -c example_wrap.cxx -I/usr/lib/perl/5.14/i386-linux/CORE
    $ g++ -shared example.o example_wrap.o -o example.so
    

    In addition to this, you may need to include additional library files to make it work. For example, if you are using the Sun C++ compiler on Solaris, you often need to add an extra library -lCrun like this:

    $ swig -c++ -perl example.i
    $ CC -Kpic -c example.cxx
    $ CC -Kpic -c example_wrap.cxx -I/usr/lib/perl/5.14/i386-linux/CORE
    $ CC -shared example.o example_wrap.o -o example.so -lCrun
    

    Of course, the names of the extra libraries are completely non-portable---you will probably need to do some experimentation.

    Another possible compile problem comes from recent versions of Perl (5.8.0) and the GNU tools. If you see errors having to do with _crypt_struct, that means _GNU_SOURCE is not defined and it needs to be. So you should compile the wrapper like:

    $ g++ -fPIC -c example_wrap.cxx -I/usr/lib/perl/5.8.0/CORE -D_GNU_SOURCE
    

    -D_GNU_SOURCE is also included in the Perl ccflags, which can be found by running

    $ perl -e 'use Config; print "$Config{ccflags}\n";'
    

    So you could also compile the wrapper like

    $ g++ -fPIC -c example_wrap.cxx -I/usr/lib/perl/5.8.0/CORE \
    `perl -MConfig -e 'print $Config{ccflags}'`
    

    Sometimes people have suggested that it is necessary to relink the Perl interpreter using the C++ compiler to make C++ extension modules work. In the experience of this author, this has never actually appeared to be necessary on most platforms. Relinking the interpreter with C++ really only includes the special run-time libraries described above---as long as you link your extension modules with these libraries, it should not be necessary to rebuild Perl.

    If you aren't entirely sure about the linking of a C++ extension, you might look at an existing C++ program. On many Unix machines, the ldd command will list library dependencies. This should give you some clues about what you might have to include when you link your extension module. For example, notice the first line of output here:

    $ ldd swig
            libstdc++-libc6.1-1.so.2 => /usr/lib/libstdc++-libc6.1-1.so.2 (0x40019000)
            libm.so.6 => /lib/libm.so.6 (0x4005b000)
            libc.so.6 => /lib/libc.so.6 (0x40077000)
            /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
    $
    

    If linking wasn't enough of a problem, another major complication of C++ is that it does not define any sort of standard for binary linking of libraries. This means that C++ code compiled by different compilers will not link together properly as libraries nor is the memory layout of classes and data structures implemented in any kind of portable manner. In a monolithic C++ program, this problem may be unnoticed. However, in Perl, it is possible for different extension modules to be compiled with different C++ compilers. As long as these modules are self-contained, this probably won't matter. However, if these modules start sharing data, you will need to take steps to avoid segmentation faults and other erratic program behavior. Also, be aware that certain C++ features, especially RTTI, can behave strangely when working with multiple modules.

    It should be noted that you may get a lot of error messages about the 'bool' datatype when compiling a C++ Perl module. If you experience this problem, you can try the following:

    • Use -DHAS_BOOL when compiling the SWIG wrapper code
    • Or use -Dbool=char when compiling.

    Finally, recent versions of Perl (5.8.0) have namespace conflict problems. Perl defines a bunch of short macros to make the Perl API function names shorter. For example, in /usr/lib/perl/5.8.0/CORE/embed.h there is a line:

    #define do_open Perl_do_open
    

    The problem is, in the <iostream> header from GNU libstdc++v3 there is a private function named do_open. If <iostream> is included after the perl headers, then the Perl macro causes the iostream do_open to be renamed, which causes compile errors. Hopefully in the future Perl will support a PERL_NO_SHORT_NAMES flag, but for now the only solution is to undef the macros that conflict. Lib/perl5/noembed.h in the SWIG source has a list of macros that are known to conflict with either standard headers or other headers. But if you get macro type conflicts from other macros not included in Lib/perl5/noembed.h while compiling the wrapper, you will have to find the macro that conflicts and add an #undef into the .i file. Please report any conflicting macros you find to swig-user mailing list.

    30.2.7 Compiling for 64-bit platforms

    On platforms that support 64-bit applications (Solaris, Irix, etc.), special care is required when building extension modules. On these machines, 64-bit applications are compiled and linked using a different set of compiler/linker options. In addition, it is not generally possible to mix 32-bit and 64-bit code together in the same application.

    To utilize 64-bits, the Perl executable will need to be recompiled as a 64-bit application. In addition, all libraries, wrapper code, and every other part of your application will need to be compiled for 64-bits. If you plan to use other third-party extension modules, they will also have to be recompiled as 64-bit extensions.

    If you are wrapping commercial software for which you have no source code, you will be forced to use the same linking standard as used by that software. This may prevent the use of 64-bit extensions. It may also introduce problems on platforms that support more than one linking standard (e.g., -o32 and -n32 on Irix).

    30.3 Building Perl Extensions under Windows

    Building a SWIG extension to Perl under Windows is roughly similar to the process used with Unix. Normally, you will want to produce a DLL that can be loaded into the Perl interpreter. This section assumes you are using SWIG with Microsoft Visual C++ although the procedure may be similar with other compilers.

    30.3.1 Running SWIG from Developer Studio

    If you are developing your application within Microsoft developer studio, SWIG can be invoked as a custom build option. The process roughly requires these steps:

    • Open up a new workspace and use the AppWizard to select a DLL project.
    • Add both the SWIG interface file (the .i file), any supporting C files, and the name of the wrapper file that will be created by SWIG (ie. example_wrap.c). Note: If using C++, choose a different suffix for the wrapper file such as example_wrap.cxx. Don't worry if the wrapper file doesn't exist yet--Developer studio will keep a reference to it around.
    • Select the SWIG interface file and go to the settings menu. Under settings, select the "Custom Build" option.
    • Enter "SWIG" in the description field.
    • Enter "swig -perl5 -o $(ProjDir)\$(InputName)_wrap.cxx $(InputPath)" in the "Build command(s) field"
    • Enter "$(ProjDir)\$(InputName)_wrap.cxx" in the "Output files(s) field".
    • Next, select the settings for the entire project and go to "C++:Preprocessor". Add the include directories for your Perl 5 installation under "Additional include directories".
    • Define the symbols WIN32 and MSWIN32 under preprocessor options. If using the ActiveWare port, also define the symbol PERL_OBJECT. Note that all extensions to the ActiveWare port must be compiled with the C++ compiler since Perl has been encapsulated in a C++ class.
    • Finally, select the settings for the entire project and go to "Link Options". Add the Perl library file to your link libraries. For example "perl.lib". Also, set the name of the output file to match the name of your Perl module (ie. example.dll).
    • Build your project.

    Now, assuming you made it this far, SWIG will be automatically invoked when you build your project. Any changes made to the interface file will result in SWIG being automatically invoked to produce a new version of the wrapper file. To run your new Perl extension, simply run Perl and use the use command as normal. For example:

    DOS > perl
    use example;
    $a = example::fact(4);
    print "$a\n";
    
    

    30.3.2 Using other compilers

    SWIG is known to work with Cygwin and may work with other compilers on Windows. For general hints and suggestions refer to the Windows chapter.

    30.4 The low-level interface

    At its core, the Perl module uses a simple low-level interface to C function, variables, constants, and classes. This low-level interface can be used to control your application. However, it is also used to construct more user-friendly proxy classes as described in the next section.

    30.4.1 Functions

    C functions are converted into new Perl built-in commands (or subroutines). For example:

    %module example
    int fact(int a);
    ...
    

    Now, in Perl:

    use example;
    $a = &example::fact(2);
    

    30.4.2 Global variables

    Global variables are handled using Perl's magic variable mechanism. SWIG generates a pair of functions that intercept read/write operations and attaches them to a Perl variable with the same name as the C global variable. Thus, an interface like this

    %module example;
    ...
    double Spam;
    ...
    

    is accessed as follows:

    use example;
    print $example::Spam, "\n";
    $example::Spam = $example::Spam + 4
    # ... etc ...
    
    

    If a variable is declared as const, it is wrapped as a read-only variable. Attempts to modify its value will result in an error.

    To make ordinary variables read-only, you can also use the %immutable directive. For example:

    %{
    extern char *path;
    %}
    %immutable;
    extern char *path;
    %mutable;
    

    The %immutable directive stays in effect until it is explicitly disabled or cleared using %mutable. See the Creating read-only variables section for further details.

    It is also possible to tag a specific variable as read-only like this:

    %{
    extern char *path;
    %}
    %immutable path; 
    ...
    ...
    extern char *path;       // Declared later in the input
    

    30.4.3 Constants

    By default, constants are wrapped as read-only Perl variables. For example:

    %module example
    
    #define FOO 42
    

    In Perl:

    use example;
    print $example::FOO, "\n";   # OK
    $example::FOO = 2;           # Error
    

    Alternatively, if you use swig's -const option, constants are wrapped such that the leading $ isn't required (by using a constant subroutine), which usually gives a more natural Perl interface, for example:

    use example;
    print example::FOO, "\n";
    

    30.4.4 Pointers

    SWIG represents pointers as blessed references. A blessed reference is the same as a Perl reference except that it has additional information attached to it indicating what kind of reference it is. That is, if you have a C declaration like this:

    Matrix *new_Matrix(int n, int m);
    

    The module returns a value generated as follows:

    $ptr = new_Matrix(int n, int m);     # Save pointer return result
    bless $ptr, "p_Matrix";              # Bless it as a pointer to Matrix
    

    SWIG uses the "blessing" to check the datatype of various pointers. In the event of a mismatch, an error or warning message is generated.

    To check to see if a value is the NULL pointer, use the defined() command:

    if (defined($ptr)) {
      print "Not a NULL pointer.";
    } else {
      print "Is a NULL pointer.";
    }
    
    

    To create a NULL pointer, you should pass the undef value to a function.

    The "value" of a Perl reference is not the same as the underlying C pointer that SWIG wrapper functions return. Suppose that $a and $b are two references that point to the same C object. In general, $a and $b will be different--since they are different references. Thus, it is a mistake to check the equality of $a and $b to check the equality of two C pointers. The correct method to check equality of C pointers is to dereference them as follows:

    if ($$a == $$b) {
      print "a and b point to the same thing in C";
    } else {
      print "a and b point to different objects.";
    }
    
    

    As much as you might be inclined to modify a pointer value directly from Perl, don't. Manipulating pointer values is architecture dependent and could cause your program to crash. Similarly, don't try to manually cast a pointer to a new type by reblessing a pointer. This may not work like you expect and it is particularly dangerous when casting C++ objects. If you need to cast a pointer or change its value, consider writing some helper functions instead. For example:

    %inline %{
    /* C-style cast */
    Bar *FooToBar(Foo *f) {
      return (Bar *) f;
    }
    
    /* C++-style cast */
    Foo *BarToFoo(Bar *b) {
      return dynamic_cast<Foo*>(b);
    }
    
    Foo *IncrFoo(Foo *f, int i) {
      return f+i;
    }
    %}
    

    Also, if working with C++, you should always try to use the new C++ style casts. For example, in the above code, the C-style cast may return a bogus result whereas as the C++-style cast will return NULL if the conversion can't be performed.

    Compatibility Note: In earlier versions, SWIG tried to preserve the same pointer naming conventions as XS and xsubpp. Given the advancement of the SWIG typesystem and the growing differences between SWIG and XS, this is no longer supported.

    30.4.5 Structures

    Access to the contents of a structure are provided through a set of low-level accessor functions as described in the "SWIG Basics" chapter. For example,

    struct Vector {
      double x, y, z;
    };
    

    gets mapped into the following collection of accessor functions:

    struct Vector *new_Vector();
    void           delete_Vector(Vector *v);
    double         Vector_x_get(Vector *obj)
    void           Vector_x_set(Vector *obj, double x)
    double         Vector_y_get(Vector *obj)
    void           Vector_y_set(Vector *obj, double y)
    double         Vector_z_get(Vector *obj)
    void           Vector_z_set(Vector *obj, double z)
    
    

    These functions are then used to access structure data from Perl as follows:

    $v = example::new_Vector();
    print example::Vector_x_get($v), "\n";   # Get x component
    example::Vector_x_set($v, 7.8);          # Change x component
    

    Similar access is provided for unions and the data members of C++ classes.

    const members of a structure are read-only. Data members can also be forced to be read-only using the %immutable directive. For example:

    struct Foo {
      ...
      %immutable;
      int x;        /* Read-only members */
      char *name;
      %mutable;
      ...
    };
    

    When char * members of a structure are wrapped, the contents are assumed to be dynamically allocated using malloc or new (depending on whether or not SWIG is run with the -c++ option). When the structure member is set, the old contents will be released and a new value created. If this is not the behavior you want, you will have to use a typemap (described later).

    Array members are normally wrapped as read-only. For example,

    struct Foo {
      int x[50];
    };
    

    produces a single accessor function like this:

    int *Foo_x_get(Foo *self) {
      return self->x;
    };
    

    If you want to set an array member, you will need to supply a "memberin" typemap described later in this chapter. As a special case, SWIG does generate code to set array members of type char (allowing you to store a Python string in the structure).

    When structure members are wrapped, they are handled as pointers. For example,

    struct Foo {
      ...
    };
    
    struct Bar {
      Foo f;
    };
    

    generates accessor functions such as this:

    Foo *Bar_f_get(Bar *b) {
      return &b->f;
    }
    
    void Bar_f_set(Bar *b, Foo *val) {
      b->f = *val;
    }
    

    30.4.6 C++ classes

    C++ classes are wrapped by building a set of low level accessor functions. Consider the following class:

    class List {
    public:
      List();
      ~List();
      int  search(char *item);
      void insert(char *item);
      void remove(char *item);
      char *get(int n);
      int  length;
    static void print(List *l);
    };
    

    When wrapped by SWIG, the following functions are created:

    List    *new_List();
    void     delete_List(List *l);
    int      List_search(List *l, char *item);
    void     List_insert(List *l, char *item);
    void     List_remove(List *l, char *item);
    char    *List_get(List *l, int n);
    int      List_length_get(List *l);
    void     List_length_set(List *l, int n);
    void     List_print(List *l);
    
    

    In Perl, these functions are used in a straightforward manner:

    use example;
    $l = example::new_List();
    example::List_insert($l, "Ale");
    example::List_insert($l, "Stout");
    example::List_insert($l, "Lager")
    example::List_print($l)
    Lager
    Stout
    Ale
    print example::List_length_get($l), "\n";
    3
    

    At this low level, C++ objects are really just typed pointers. Member functions are accessed by calling a C-like wrapper with an instance pointer as the first argument. Although this interface is fairly primitive, it provides direct access to C++ objects. A higher level interface using Perl proxy classes can be built using these low-level accessors. This is described shortly.

    30.4.7 C++ classes and type-checking

    The SWIG type-checker is fully aware of C++ inheritance. Therefore, if you have classes like this

    class Foo {
    ...
    };
    
    class Bar : public Foo {
    ...
    };
    

    and a function

    void spam(Foo *f);
    

    then the function spam() accepts Foo * or a pointer to any class derived from Foo. If necessary, the type-checker also adjusts the value of the pointer (as is necessary when multiple inheritance is used).

    30.4.8 C++ overloaded functions

    If you have a C++ program with overloaded functions or methods, you will need to disambiguate those methods using %rename. For example:

    /* Forward renaming declarations */
    %rename(foo_i) foo(int); 
    %rename(foo_d) foo(double);
    ...
    void foo(int);           // Becomes 'foo_i'
    void foo(char *c);       // Stays 'foo' (not renamed)
    
    class Spam {
    public:
      void foo(int);      // Becomes 'foo_i'
      void foo(double);   // Becomes 'foo_d'
      ...
    };
    

    Now, in Perl, the methods are accessed as follows:

    use example;
    example::foo_i(3);
    $s = example::new_Spam();
    example::Spam_foo_i($s, 3);
    example::Spam_foo_d($s, 3.14);
    

    Please refer to the "SWIG Basics" chapter for more information.

    30.4.9 Operators

    As of version 1.3.27 SWIG automatically renames the most common C++ operators, and maps them into the perl module with the proper 'use overload ...' so you don't need to do any work.

    The following C++ operators are currently supported by the Perl module:

    • operator++
    • operator--
    • operator+
    • operator-
    • operator*
    • operator/
    • operator==
    • operator!=
    • operator%
    • operator>
    • operator<
    • operator and
    • operator or

    30.4.10 Modules and packages

    When you create a SWIG extension, everything gets placed into a single Perl module. The name of the module is determined by the %module directive. To use the module, do the following:

    $ perl5
    use example;                      # load the example module
    print example::fact(4), "\n"      # Call a function in it
    24
    

    Usually, a module consists of a collection of code that is contained within a single file. A package, on the other hand, is the Perl equivalent of a namespace. A package is a lot like a module, except that it is independent of files. Any number of files may be part of the same package--or a package may be broken up into a collection of modules if you prefer to think about it in this way.

    SWIG installs its functions into a package with the same name as the module.

    Incompatible Change: previous versions of SWIG enabled you to change the name of the package by using the -package option, this feature has been removed in order to properly support modules that used nested namespaces, e.g. Foo::Bar::Baz. To give your module a nested namespace simply provide the fully qualified name in your %module directive:

    %module "Foo::Bar::Baz"
    

    NOTE: the double quotes are necessary.

    Using the package option of the %module directive allows you to specify what Perl namespace that the module will be living in when installed. This is useful in the situation where a module maintainer wants to split a large module into smaller pieces to make maintenance easier, but doesn't want to have that affect the module name used by applications. So for example, if I wanted to split XML::Xerces into XML::Xerces::SAX, etc. , but I wanted all the applications to be able to access the classes using the XML::Xerces namespace I could use:

    %module(package="XML::Xerces") "XML::Xerces::SAX
    

    And now all the applications could use the class XML::Xerces::SAXParser. Without the package directive splitting the module would force applications to use the class XML::Xerces::SAX::SAXParser. This could break compatibility for existing applications that are already using the class under the name XML::Xerces::SAXParser.

    30.5 Input and output parameters

    A common problem in some C programs is handling parameters passed as simple pointers. For example:

    void add(int x, int y, int *result) {
      *result = x + y;
    }
    

    or perhaps

    int sub(int *x, int *y) {
      return *x+*y;
    }
    

    The easiest way to handle these situations is to use the typemaps.i file. For example:

    %module example
    %include "typemaps.i"
    
    void add(int, int, int *OUTPUT);
    int  sub(int *INPUT, int *INPUT);
    

    In Perl, this allows you to pass simple values. For example:

    $a = example::add(3, 4);
    print "$a\n";
    7
    $b = example::sub(7, 4);
    print "$b\n";
    3
    

    Notice how the INPUT parameters allow integer values to be passed instead of pointers and how the OUTPUT parameter creates a return result.

    If you don't want to use the names INPUT or OUTPUT , use the %apply directive. For example:

    %module example
    %include "typemaps.i"
    
    %apply int *OUTPUT { int *result };
    %apply int *INPUT  { int *x, int *y};
    
    void add(int x, int y, int *result);
    int  sub(int *x, int *y);
    

    If a function mutates one of its parameters like this,

    void negate(int *x) {
      *x = -(*x);
    }
    

    you can use INOUT like this:

    %include "typemaps.i"
    ...
    void negate(int *INOUT);
    

    In Perl, a mutated parameter shows up as a return value. For example:

    $a = example::negate(3);
    print "$a\n";
    -3
    

    The most common use of these special typemap rules is to handle functions that return more than one value. For example, sometimes a function returns a result as well as a special error code:

    /* send message, return number of bytes sent, along with success code */
    int send_message(char *text, int len, int *success);
    

    To wrap such a function, simply use the OUTPUT rule above. For example:

    %module example
    %include "typemaps.i"
    %apply int *OUTPUT { int *success };
    ...
    int send_message(char *text, int *success);
    

    When used in Perl, the function will return multiple values.

    ($bytes, $success) = example::send_message("Hello World");
    

    Another common use of multiple return values are in query functions. For example:

    void get_dimensions(Matrix *m, int *rows, int *columns);
    

    To wrap this, you might use the following:

    %module example
    %include "typemaps.i"
    %apply int *OUTPUT { int *rows, int *columns };
    ...
    void get_dimensions(Matrix *m, int *rows, *columns);
    

    Now, in Perl:

    ($r, $c) = example::get_dimensions($m);
    

    In certain cases, it is possible to treat Perl references as C pointers. To do this, use the REFERENCE typemap. For example:

    %module example
    %include "typemaps.i"
    
    void add(int x, int y, int *REFERENCE);
    

    In Perl:

    use example;
    $c = 0.0;
    example::add(3, 4, \$c);
    print "$c\n";
    7
    

    Note: The REFERENCE feature is only currently supported for numeric types (integers and floating point).

    30.6 Exception handling

    The SWIG %exception directive can be used to create a user-definable exception handler for converting exceptions in your C/C++ program into Perl exceptions. The chapter on customization features contains more details, but suppose you have a C++ class like the following:

    class RangeError {};   // Used for an exception
    
    class DoubleArray {
      private:
        int n;
        double *ptr;
      public:
        // Create a new array of fixed size
        DoubleArray(int size) {
          ptr = new double[size];
          n = size;
        }
        // Destroy an array
        ~DoubleArray() {
          delete ptr;
        }
        // Return the length of the array
        int   length() {
          return n;
        }
    
        // Get an item from the array and perform bounds checking.
        double getitem(int i) {
          if ((i >= 0) && (i < n))
            return ptr[i];
          else
            throw RangeError();
        }
    
        // Set an item in the array and perform bounds checking.
        void setitem(int i, double val) {
          if ((i >= 0) && (i < n))
            ptr[i] = val;
          else
            throw RangeError();
        }
      };
    

    Since several methods in this class can throw an exception for an out-of-bounds access, you might want to catch this in the Perl extension by writing the following in an interface file:

    %exception {
      try {
        $action
      }
      catch (RangeError) {
        croak("Array index out-of-bounds");
      }
    }
    
    class DoubleArray {
    ...
    };
    

    The exception handling code is inserted directly into generated wrapper functions. The $action variable is replaced with the C/C++ code being executed by the wrapper. When an exception handler is defined, errors can be caught and used to gracefully generate a Perl error instead of forcing the entire program to terminate with an uncaught error.

    As shown, the exception handling code will be added to every wrapper function. Since this is somewhat inefficient. You might consider refining the exception handler to only apply to specific methods like this:

    %exception getitem {
      try {
        $action
      }
      catch (RangeError) {
        croak("Array index out-of-bounds");
      }
    }
    
    %exception setitem {
      try {
        $action
      }
      catch (RangeError) {
        croak("Array index out-of-bounds");
      }
    }
    

    In this case, the exception handler is only attached to methods and functions named getitem and setitem.

    If you had a lot of different methods, you can avoid extra typing by using a macro. For example:

    %define RANGE_ERROR
    {
      try {
        $action
      }
      catch (RangeError) {
        croak("Array index out-of-bounds");
      }
    }
    %enddef
    
    %exception getitem RANGE_ERROR;
    %exception setitem RANGE_ERROR;
    

    Since SWIG's exception handling is user-definable, you are not limited to C++ exception handling. See the chapter on " Customization features" for more examples.

    Compatibility note: In SWIG1.1, exceptions were defined using the older %except directive:

    %except(python) {
      try {
        $function
      }
      catch (RangeError) {
        croak("Array index out-of-bounds");
      }
    }
    

    This is still supported, but it is deprecated. The newer %exception directive provides the same functionality, but it has additional capabilities that make it more powerful.

    30.7 Remapping datatypes with typemaps

    This section describes how you can modify SWIG's default wrapping behavior for various C/C++ datatypes using the %typemap directive. This is an advanced topic that assumes familiarity with the Perl C API as well as the material in the "Typemaps " chapter.

    Before proceeding, it should be stressed that typemaps are not a required part of using SWIG---the default wrapping behavior is enough in most cases. Typemaps are only used if you want to change some aspect of the primitive C-Perl interface.

    30.7.1 A simple typemap example

    A typemap is nothing more than a code generation rule that is attached to a specific C datatype. For example, to convert integers from Perl to C, you might define a typemap like this:

    %module example
    
    %typemap(in) int {
      $1 = (int) SvIV($input);
      printf("Received an integer : %d\n", $1);
    }
    ...
    %inline %{
    extern int fact(int n);
    %}
    
    

    Typemaps are always associated with some specific aspect of code generation. In this case, the "in" method refers to the conversion of input arguments to C/C++. The datatype int is the datatype to which the typemap will be applied. The supplied C code is used to convert values. In this code a number of special variable prefaced by a $ are used. The $1 variable is placeholder for a local variable of type int. The $input variable is the input object (usually a SV *).

    When this example is used in Perl5, it will operate as follows:

    use example;
    $n = example::fact(6);
    print "$n\n";
    ...
    
    Output:
    Received an integer : 6
    720
    

    The application of a typemap to specific datatypes and argument names involves more than simple text-matching--typemaps are fully integrated into the SWIG type-system. When you define a typemap for int, that typemap applies to int and qualified variations such as const int. In addition, the typemap system follows typedef declarations. For example:

    %typemap(in) int n {
      $1 = (int) SvIV($input);
      printf("n = %d\n", $1);
    }
    %inline %{
    typedef int Integer;
    extern int fact(Integer n);    // Above typemap is applied
    %}
    

    It should be noted that the matching of typedef only occurs in one direction. If you defined a typemap for Integer, it is not applied to arguments of type int.

    Typemaps can also be defined for groups of consecutive arguments. For example:

    %typemap(in) (char *str, unsigned len) {
        $1 = SvPV($input, $2);
    };
    
    int count(char c, char *str, unsigned len);
    

    When a multi-argument typemap is defined, the arguments are always handled as a single Perl object. This allows the function to be used like this (notice how the length parameter is omitted):

    example::count("e", "Hello World");
    1
    >>>
    

    30.7.2 Perl5 typemaps

    The previous section illustrated an "in" typemap for converting Perl objects to C. A variety of different typemap methods are defined by the Perl module. For example, to convert a C integer back into a Perl object, you might define an "out" typemap like this:

    %typemap(out) int {
      $result = sv_newmortal();
      sv_setiv($result, (IV) $1);
      argvi++;
    }
    

    The following typemap methods are available:

    %typemap(in)

    Converts Perl5 object to input function arguments.

    %typemap(out)

    Converts function return value to a Perl5 value.

    %typemap(varin)

    Converts a Perl5 object to a global variable.

    %typemap(varout)

    Converts a global variable to a Perl5 object.

    %typemap(freearg)

    Cleans up a function argument after a function call

    %typemap(argout)

    Output argument handling

    %typemap(ret)

    Clean up return value from a function.

    %typemap(memberin)

    Setting of C++ member data (all languages).

    %typemap(memberout)

    Return of C++ member data (all languages).

    %typemap(check)

    Check value of input parameter.

    30.7.3 Typemap variables

    Within typemap code, a number of special variables prefaced with a $ may appear. A full list of variables can be found in the " Typemaps" chapter. This is a list of the most common variables:

    $1

    A C local variable corresponding to the actual type specified in the %typemap directive. For input values, this is a C local variable that's supposed to hold an argument value. For output values, this is the raw result that's supposed to be returned to Perl.

    $input

    A Perl object holding the value of an argument of variable value.

    $result

    A Perl object that holds the result to be returned to Perl.

    $1_name

    The parameter name that was matched.

    $1_type

    The actual C datatype matched by the typemap.

    $1_ltype

    An assignable version of the datatype matched by the typemap (a type that can appear on the left-hand-side of a C assignment operation). This type is stripped of qualifiers and may be an altered version of $1_type. All arguments and local variables in wrapper functions are declared using this type so that their values can be properly assigned.

    $symname

    The Perl name of the wrapper function being created.

    30.7.4 Useful functions

    When writing typemaps, it is necessary to work directly with Perl5 objects. This, unfortunately, can be a daunting task. Consult the "perlguts" man-page for all of the really ugly details. A short summary of commonly used functions is provided here for reference. It should be stressed that SWIG can be used quite effectively without knowing any of these details--especially now that there are typemap libraries that can already been written.

    Perl Integer Functions

    int   SvIV(SV *);
    void  sv_setiv(SV *sv, IV value);
    SV   *newSViv(IV value);
    int   SvIOK(SV *);
    

    Perl Floating Point Functions

    double SvNV(SV *);
    void   sv_setnv(SV *, double value);
    SV    *newSVnv(double value);
    int    SvNOK(SV *);
    

    Perl String Functions

    char     *SvPV(SV *, STRLEN len);
    void      sv_setpv(SV *, char *val);
    void      sv_setpvn(SV *, char *val, STRLEN len);
    SV       *newSVpv(char *value, STRLEN len);
    int       SvPOK(SV *);
    void      sv_catpv(SV *, char *);
    void      sv_catpvn(SV *, char *, STRLEN);
    

    Perl References

    void      sv_setref_pv(SV *, char *, void *ptr);
    int       sv_isobject(SV *);
    SV       *SvRV(SV *);
    int       sv_isa(SV *, char *0;
    

    30.8 Typemap Examples

    This section includes a few examples of typemaps. For more examples, you might look at the files "perl5.swg" and "typemaps.i " in the SWIG library.

    30.8.1 Converting a Perl5 array to a char **

    A common problem in many C programs is the processing of command line arguments, which are usually passed in an array of NULL terminated strings. The following SWIG interface file allows a Perl5 array reference to be used as a char ** datatype.

    %module argv
    
    // This tells SWIG to treat char ** as a special case
    %typemap(in) char ** {
      AV *tempav;
      I32 len;
      int i;
      SV  **tv;
      if (!SvROK($input))
        croak("Argument $argnum is not a reference.");
      if (SvTYPE(SvRV($input)) != SVt_PVAV)
        croak("Argument $argnum is not an array.");
      tempav = (AV*)SvRV($input);
      len = av_len(tempav);
      $1 = (char **) malloc((len+2)*sizeof(char *));
      for (i = 0; i <= len; i++) {
        tv = av_fetch(tempav, i, 0);
        $1[i] = (char *) SvPV(*tv, PL_na);
      }
      $1[i] = NULL;
    };
    
    // This cleans up the char ** array after the function call
    %typemap(freearg) char ** {
      free($1);
    }
    
    // Creates a new Perl array and places a NULL-terminated char ** into it
    %typemap(out) char ** {
      AV *myav;
      SV **svs;
      int i = 0, len = 0;
      /* Figure out how many elements we have */
      while ($1[len])
        len++;
      svs = (SV **) malloc(len*sizeof(SV *));
      for (i = 0; i < len ; i++) {
        svs[i] = sv_newmortal();
        sv_setpv((SV*)svs[i], $1[i]);
      };
      myav = av_make(len, svs);
      free(svs);
      $result = newRV_noinc((SV*)myav);
      sv_2mortal($result);
      argvi++;
    }
    
    // Now a few test functions
    %inline %{
      int print_args(char **argv) {
        int i = 0;
        while (argv[i]) {
          printf("argv[%d] = %s\n", i, argv[i]);
          i++;
        }
        return i;
      }
    
      // Returns a char ** list
      char **get_args() {
        static char *values[] = { "Dave", "Mike", "Susan", "John", "Michelle", 0};
        return &values[0];
      }
    %}
    
    

    When this module is compiled, the wrapped C functions can be used in a Perl script as follows:

    use argv;
    @a = ("Dave", "Mike", "John", "Mary");           # Create an array of strings
    argv::print_args(\@a);                           # Pass it to our C function
    $b = argv::get_args();                           # Get array of strings from C
    print @$b, "\n";                                 # Print it out
    

    30.8.2 Return values

    Return values are placed on the argument stack of each wrapper function. The current value of the argument stack pointer is contained in a variable argvi. Whenever a new output value is added, it is critical that this value be incremented. For multiple output values, the final value of argvi should be the total number of output values.

    The total number of return values should not exceed the number of input values unless you explicitly extend the argument stack. This can be done using the EXTEND() macro as in:

    %typemap(argout) int *OUTPUT {
      if (argvi >= items) {
        EXTEND(sp, 1);              /* Extend the stack by 1 object */
      }
      $result = sv_newmortal();
      sv_setiv($target, (IV) *($1));
      argvi++;
    }
    

    30.8.3 Returning values from arguments

    Sometimes it is desirable for a function to return a value in one of its arguments. This example describes the implementation of the OUTPUT typemap.

    %module return
    
    // This tells SWIG to treat an double * argument with name 'OutDouble' as
    // an output value.  
    
    %typemap(argout) double *OUTPUT {
      $result = sv_newmortal();
      sv_setnv($result, *$input);
      argvi++;                     /* Increment return count -- important! */
    }
    
    // We don't care what the input value is. Ignore, but set to a temporary variable
    
    %typemap(in, numinputs=0) double *OUTPUT(double junk) {
      $1 = &junk;
    }
    
    // Now a function to test it
    %{
    /* Returns the first two input arguments */
    int multout(double a, double b, double *out1, double *out2) {
      *out1 = a;
      *out2 = b;
      return 0;
    };
    %}
    
    // If we name both parameters OutDouble both will be output
    
    int multout(double a, double b, double *OUTPUT, double *OUTPUT);
    ...
    

    When this function is called, the output arguments are appended to the stack used to return results. This shows up an array in Perl. For example:

    @r = multout(7, 13);
    print "multout(7, 13) = @r\n";
    ($x, $y) = multout(7, 13);
    

    30.8.4 Accessing array structure members

    Consider the following data structure:

    #define SIZE  8
    typedef struct {
      int   values[SIZE];
      ...
    } Foo;
    
    

    By default, SWIG doesn't know how to the handle the values structure member it's an array, not a pointer. In this case, SWIG makes the array member read-only. Reading will simply return a pointer to the first item in the array. To make the member writable, a "memberin" typemap can be used.

    %typemap(memberin) int [SIZE] {
      int i;
      for (i = 0; i < SIZE; i++) {
        $1[i] = $input[i];
      }
    }
    
    

    Whenever a int [SIZE] member is encountered in a structure or class, this typemap provides a safe mechanism for setting its value.

    As in the previous example, the typemap can be generalized for any dimension. For example:

    %typemap(memberin) int [ANY] {
      int i;
      for (i = 0; i < $1_dim0; i++) {
        $1[i] = $input[i];
      }
    }
    

    When setting structure members, the input object is always assumed to be a C array of values that have already been converted from the target language. Because of this, the memberin typemap is almost always combined with the use of an "in" typemap. For example, the "in" typemap in the previous section would be used to convert an int[] array to C whereas the "memberin" typemap would be used to copy the converted array into a C data structure.

    30.8.5 Turning Perl references into C pointers

    A frequent confusion on the SWIG mailing list is errors caused by the mixing of Perl references and C pointers. For example, suppose you have a C function that modifies its arguments like this:

    void add(double a, double b, double *c) {
      *c = a + b;
    }
    

    A common misinterpretation of this function is the following Perl script:

    # Perl script
    $a = 3.5;
    $b = 7.5;
    $c = 0.0;          # Output value
    add($a, $b, \$c);    # Place result in c (Except that it doesn't work)
    

    To make this work with a reference, you can use a typemap such as this:

    %typemap(in) double * (double dvalue) {
      SV* tempsv;
      if (!SvROK($input)) {
        croak("expected a reference\n");
      }
      tempsv = SvRV($input);
      if ((!SvNOK(tempsv)) && (!SvIOK(tempsv))) {
        croak("expected a double reference\n");
      }
      dvalue = SvNV(tempsv);
      $1 = &dvalue;
    }
    
    %typemap(argout) double * {
      SV *tempsv;
      tempsv = SvRV($input);
      sv_setnv(tempsv, *$1);
    }
    

    Now, if you place this before the add function, you can do this:

    $a = 3.5;
    $b = 7.5;
    $c = 0.0;
    add($a, $b, \$c);            # Now it works!
    print "$c\n";
    
    

    30.8.6 Pointer handling

    Occasionally, it might be necessary to convert pointer values that have been stored using the SWIG typed-pointer representation. To convert a pointer from Perl to C, the following function is used:

    int SWIG_ConvertPtr(SV *obj, void **ptr, swig_type_info *ty, int flags)

    Converts a Perl object obj to a C pointer. The result of the conversion is placed into the pointer located at ptr. ty is a SWIG type descriptor structure. flags is used to handle error checking and other aspects of conversion. flags is currently undefined and reserved for future expansion. Returns 0 on success and -1 on error.

    void *SWIG_MakePtr(SV *obj, void *ptr, swig_type_info *ty, int flags)

    Creates a new Perl pointer object. obj is a Perl SV that has been initialized to hold the result, ptr is the pointer to convert, ty is the SWIG type descriptor structure that describes the type, and flags is a flag that controls properties of the conversion. flags is currently undefined and reserved.

    Both of these functions require the use of a special SWIG type-descriptor structure. This structure contains information about the mangled name of the datatype, type-equivalence information, as well as information about converting pointer values under C++ inheritance. For a type of Foo *, the type descriptor structure is usually accessed as follows:

    Foo *f;
    if (!SWIG_IsOK(SWIG_ConvertPtr($input, (void **) &f, SWIGTYPE_p_Foo, 0))) {
      SWIG_exception_fail(SWIG_TypeError, "in method '$symname', expecting type Foo");
    }
    
    SV *sv = sv_newmortal();
    SWIG_MakePtr(sv, f, SWIGTYPE_p_Foo, 0);
    

    In a typemap, the type descriptor should always be accessed using the special typemap variable $1_descriptor. For example:

    %typemap(in) Foo * {
      if (!SWIG_IsOK(SWIG_ConvertPtr($input, (void **) &$1, $1_descriptor, 0))) {
        SWIG_exception_fail(SWIG_TypeError, "in method '$symname', expecting type Foo");
      }
    }
    

    If necessary, the descriptor for any type can be obtained using the $descriptor() macro in a typemap. For example:

    %typemap(in) Foo * {
      if (!SWIG_IsOK(SWIG_ConvertPtr($input, (void **) &$1, $descriptor(Foo *), 0))) {
        SWIG_exception_fail(SWIG_TypeError, "in method '$symname', expecting type Foo");
      }
    }
    

    30.9 Proxy classes

    Out of date. Needs update.

    Using the low-level procedural interface, SWIG can also construct a high-level object oriented interface to C structures and C++ classes. This is done by constructing a Perl proxy class (also known as a shadow class) that provides an OO wrapper to the underlying code. This section describes the implementation details of the proxy interface.

    30.9.1 Preliminaries

    Proxy classes, are generated by default. If you want to turn them off, use the -noproxy command line option. For example:

    $ swig -c++ -perl -noproxy example.i
    

    When proxy classes are used, SWIG moves all of the low-level procedural wrappers to another package name. By default, this package is named 'modulec' where 'module' is the name of the module you provided with the %module directive. Then, in place of the original module, SWIG creates a collection of high-level Perl wrappers. In your scripts, you will use these high level wrappers. The wrappers, in turn, interact with the low-level procedural module.

    30.9.2 Structure and class wrappers

    Suppose you have the following SWIG interface file:

    %module example
    struct Vector {
      Vector(double x, double y, double z);
      ~Vector();
      double x, y, z;
    };
    
    

    When wrapped, SWIG creates the following set of low-level accessor functions as described in previous sections.

    Vector *new_Vector(double x, double y, double z);
    void    delete_Vector(Vector *v);
    double  Vector_x_get(Vector *v);
    double  Vector_x_set(Vector *v, double value);
    double  Vector_y_get(Vector *v);
    double  Vector_y_set(Vector *v, double value);
    double  Vector_z_get(Vector *v);
    double  Vector_z_set(Vector *v, double value);
    
    

    However, when proxy classes are enabled, these accessor functions are wrapped inside a Perl class like this:

    package example::Vector;
    @ISA = qw( example );
    %OWNER = ();
    %BLESSEDMEMBERS = ();
    
    sub new () {
      my $self = shift;
      my @args = @_;
      $self = vectorc::new_Vector(@args);
      return undef if (!defined($self));
      bless $self, "example::Vector";
      $OWNER{$self} = 1;
      my %retval;
      tie %retval, "example::Vector", $self;
      return bless \%retval, "Vector";
    }
    
    sub DESTROY {
      return unless $_[0]->isa('HASH');
      my $self = tied(%{$_[0]});
      delete $ITERATORS{$self};
      if (exists $OWNER{$self}) {
        examplec::delete_Vector($self));
        delete $OWNER{$self};
      }
    }
    
    sub FETCH {
      my ($self, $field) = @_;
      my $member_func = "vectorc::Vector_${field}_get";
      my $val = &$member_func($self);
      if (exists $BLESSEDMEMBERS{$field}) {
        return undef if (!defined($val));
        my %retval;
        tie %retval, $BLESSEDMEMBERS{$field}, $val;
        return bless \%retval, $BLESSEDMEMBERS{$field};
      }
      return $val;
    }
    
    sub STORE {
      my ($self, $field, $newval) = @_;
      my $member_func = "vectorc::Vector_${field}_set";
      if (exists $BLESSEDMEMBERS{$field}) {
        &$member_func($self, tied(%{$newval}));
      } else {
        &$member_func($self, $newval);
      }
    }
    

    Each structure or class is mapped into a Perl package of the same name. The C++ constructors and destructors are mapped into constructors and destructors for the package and are always named "new" and "DESTROY". The constructor always returns a tied hash table. This hash table is used to access the member variables of a structure in addition to being able to invoke member functions. The %OWNER and %BLESSEDMEMBERS hash tables are used internally and described shortly.

    To use our new proxy class we can simply do the following:

    # Perl code using Vector class
    $v = new Vector(2, 3, 4);
    $w = Vector->new(-1, -2, -3);
    
    # Assignment of a single member
    $v->{x} = 7.5;
    
    # Assignment of all members
    %$v = ( x=>3,
            y=>9,
            z=>-2);
    
    # Reading members
    $x = $v->{x};
    
    # Destruction
    $v->DESTROY();
    
    

    30.9.3 Object Ownership

    In order for proxy classes to work properly, it is necessary for Perl to manage some mechanism of object ownership. Here's the crux of the problem---suppose you had a function like this:

    Vector *Vector_get(Vector *v, int index) {
      return &v[i];
    }
    

    This function takes a Vector pointer and returns a pointer to another Vector. Such a function might be used to manage arrays or lists of vectors (in C). Now contrast this function with the constructor for a Vector object:

    Vector *new_Vector(double x, double y, double z) {
      Vector *v;
      v = new Vector(x, y, z);        // Call C++ constructor
      return v;
    }
    

    Both functions return a Vector, but the constructor is returning a brand-new Vector while the other function is returning a Vector that was already created (hopefully). In Perl, both vectors will be indistinguishable---clearly a problem considering that we would probably like the newly created Vector to be destroyed when we are done with it.

    To manage these problems, each class contains two methods that access an internal hash table called %OWNER. This hash keeps a list of all of the objects that Perl knows that it has created. This happens in two cases: (1) when the constructor has been called, and (2) when a function implicitly creates a new object (as is done when SWIG needs to return a complex datatype by value). When the destructor is invoked, the Perl proxy class module checks the %OWNER hash to see if Perl created the object. If so, the C/C++ destructor is invoked. If not, we simply destroy the Perl object and leave the underlying C object alone (under the assumption that someone else must have created it).

    This scheme works remarkably well in practice but it isn't foolproof. In fact, it will fail if you create a new C object in Perl, pass it on to a C function that remembers the object, and then destroy the corresponding Perl object (this situation turns out to come up frequently when constructing objects like linked lists and trees). When C takes possession of an object, you can change Perl's ownership by simply deleting the object from the %OWNER hash. This is done using the DISOWN method.

    # Perl code to change ownership of an object
    $v = new Vector(x, y, z);
    $v->DISOWN();     
    

    To acquire ownership of an object, the ACQUIRE method can be used.

    # Given Perl ownership of a file
    $u = Vector_get($v);
    $u->ACQUIRE();
    
    

    As always, a little care is in order. SWIG does not provide reference counting, garbage collection, or advanced features one might find in sophisticated languages.

    30.9.4 Nested Objects

    Suppose that we have a new object that looks like this:

    struct Particle {
      Vector r;
      Vector v;
      Vector f;
      int type;
    }
    
    

    In this case, the members of the structure are complex objects that have already been encapsulated in a Perl proxy class. To handle these correctly, we use the %BLESSEDMEMBERS hash which would look like this (along with some supporting code):

    package Particle;
    ...
    %BLESSEDMEMBERS = (
            r => `Vector',
            v => `Vector',
            f => `Vector',
    );
    
    

    When fetching members from the structure, %BLESSEDMEMBERS is checked. If the requested field is present, we create a tied-hash table and return it. If not, we just return the corresponding member unmodified.

    This implementation allows us to operate on nested structures as follows:

    # Perl access of nested structure
    $p = new Particle();
    $p->{f}->{x} = 0.0;
    %${$p->{v}} = ( x=>0, y=>0, z=>0);         
    

    30.9.5 Proxy Functions

    When functions take arguments involving a complex object, it is sometimes necessary to write a proxy function. For example:

    double dot_product(Vector *v1, Vector *v2);
    

    Since Vector is an object already wrapped into a proxy class, we need to modify this function to accept arguments that are given in the form of tied hash tables. This is done by creating a Perl function like this:

    sub dot_product {
      my @args = @_;
      $args[0] = tied(%{$args[0]});         # Get the real pointer values
      $args[1] = tied(%{$args[1]});
      my $result = vectorc::dot_product(@args);
      return $result;
    }
    

    This function replaces the original function, but operates in an identical manner.

    30.9.6 Inheritance

    Simple C++ inheritance is handled using the Perl @ISA array in each class package. For example, if you have the following interface file:

    // shapes.i
    // SWIG interface file for shapes class
    %module shapes
    %{
    #include "shapes.h"
    %}
    
    class Shape {
    public:
      virtual double area() = 0;
      virtual double perimeter() = 0;
      void    set_location(double x, double y);
    };
    class Circle : public Shape {
    public:
      Circle(double radius);
      ~Circle();
      double area();
      double perimeter();
    };
    class Square : public Shape {
    public:
      Square(double size);
      ~Square();
      double area();
      double perimeter();
    }
    
    

    The resulting, Perl wrapper class will create the following code:

    Package Shape;
    @ISA = (shapes);
    ...
    Package Circle;
    @ISA = (shapes Shape);
    ...
    Package Square;
    @ISA = (shapes Shape);
    
    

    The @ISA array determines where to look for methods of a particular class. In this case, both the Circle and Square classes inherit functions from Shape so we'll want to look in the Shape base class for them. All classes also inherit from the top-level module shapes. This is because certain common operations needed to implement proxy classes are implemented only once and reused in the wrapper code for various classes and structures.

    Since SWIG proxy classes are implemented in Perl, it is easy to subclass from any SWIG generated class. To do this, simply put the name of a SWIG class in the @ISA array for your new class. However, be forewarned that this is not a trivial problem. In particular, inheritance of data members is extremely tricky (and I'm not even sure if it really works).

    30.9.7 Modifying the proxy methods

    It is possible to override the SWIG generated proxy/shadow methods, using %feature("shadow"). It works like all the other %feature directives. Here is a simple example showing how to add some Perl debug code to the constructor:

    /* Let's make the constructor of the class Square more verbose */
    %feature("shadow") Square(double w)
    %{
      sub new {
        my $pkg = shift;
        my $self = examplec::new_Square(@_);
        print STDERR "Constructed an @{[ref($self)]}\n";
        bless $self, $pkg if defined($self);
      }
    %}
    
    class Square {
    public:
      Square(double w);
      ...
    };
    

    30.10 Adding additional Perl code

    If writing support code in C isn't enough, it is also possible to write code in Perl. This code gets inserted in to the .pm file created by SWIG. One use of Perl code might be to supply a high-level interface to certain functions. For example:

    void set_transform(Image *im, double x[4][4]);
    
    ...
    /* Rewrite the high level interface to set_transform */
    %perlcode %{
    sub set_transform
    {
      my ($im, $x) = @_;
      my $a = new_mat44();
      for (my $i = 0; $i < 4, $i++)
      {
        for (my $j = 0; $j < 4, $j++)
        {
          mat44_set($a, $i, $j, $x->[i][j])
        }
      }
      example.set_transform($im, $a);
      free_mat44($a);
    }
    %}
    

    In this example, set_transform() provides a high-level Perl interface built on top of low-level helper functions. For example, this code now seems to work:

    my $a =
      [[1, 0, 0, 0],
      [0, 1, 0, 0],
      [0, 0, 1, 0],
      [0, 0, 0, 1]];
    set_transform($im, $a);
    

    30.11 Cross language polymorphism

    Proxy classes provide a more natural, object-oriented way to access extension classes. As described above, each proxy instance has an associated C++ instance, and method calls to the proxy are passed to the C++ instance transparently via C wrapper functions.

    This arrangement is asymmetric in the sense that no corresponding mechanism exists to pass method calls down the inheritance chain from C++ to Perl. In particular, if a C++ class has been extended in Perl (by extending the proxy class), these extensions will not be visible from C++ code. Virtual method calls from C++ are thus not able access the lowest implementation in the inheritance chain.

    Changes have been made to SWIG to address this problem and make the relationship between C++ classes and proxy classes more symmetric. To achieve this goal, new classes called directors are introduced at the bottom of the C++ inheritance chain. The job of the directors is to route method calls correctly, either to C++ implementations higher in the inheritance chain or to Perl implementations lower in the inheritance chain. The upshot is that C++ classes can be extended in Perl and from C++ these extensions look exactly like native C++ classes. Neither C++ code nor Perl code needs to know where a particular method is implemented: the combination of proxy classes, director classes, and C wrapper functions takes care of all the cross-language method routing transparently.

    30.11.1 Enabling directors

    The director feature is disabled by default. To use directors you must make two changes to the interface file. First, add the "directors" option to the %module directive, like this:

    %module(directors="1") modulename
    

    Without this option no director code will be generated. Second, you must use the %feature("director") directive to tell SWIG which classes and methods should get directors. The %feature directive can be applied globally, to specific classes, and to specific methods, like this:

    // generate directors for all classes that have virtual methods
    %feature("director");         
    
    // generate directors for the virtual methods in class Foo
    %feature("director") Foo;      
    

    You can use the %feature("nodirector") directive to turn off directors for specific classes or methods. So for example,

    %feature("director") Foo;
    %feature("nodirector") Foo::bar;
    

    will generate directors for the virtual methods of class Foo except bar().

    Directors can also be generated implicitly through inheritance. In the following, class Bar will get a director class that handles the methods one() and two() (but not three()):

    %feature("director") Foo;
    class Foo {
    public:
      Foo(int foo);
      virtual void one();
      virtual void two();
    };
    
    class Bar: public Foo {
    public:
      virtual void three();
    };
    

    then at the Perl side you can define

    use mymodule;
    
    package MyFoo;
    use base 'mymodule::Foo';
    
    sub one {
      print "one from Perl\n";
    }
    

    30.11.2 Director classes

    For each class that has directors enabled, SWIG generates a new class that derives from both the class in question and a special Swig::Director class. These new classes, referred to as director classes, can be loosely thought of as the C++ equivalent of the Perl proxy classes. The director classes store a pointer to their underlying Perl object and handle various issues related to object ownership.

    For simplicity let's ignore the Swig::Director class and refer to the original C++ class as the director's base class. By default, a director class extends all virtual methods in the inheritance chain of its base class (see the preceding section for how to modify this behavior). Virtual methods that have a final specifier are unsurprisingly excluded. Thus the virtual method calls, whether they originate in C++ or in Perl via proxy classes, eventually end up in at the implementation in the director class. The job of the director methods is to route these method calls to the appropriate place in the inheritance chain. By "appropriate place" we mean the method that would have been called if the C++ base class and its extensions in Perl were seamlessly integrated. That seamless integration is exactly what the director classes provide, transparently skipping over all the messy extension API glue that binds the two languages together.

    In reality, the "appropriate place" is one of only two possibilities: C++ or Perl. Once this decision is made, the rest is fairly easy. If the correct implementation is in C++, then the lowest implementation of the method in the C++ inheritance chain is called explicitly. If the correct implementation is in Perl, the Perl API is used to call the method of the underlying Perl object (after which the usual virtual method resolution in Perl automatically finds the right implementation).

    Now how does the director decide which language should handle the method call? The basic rule is to handle the method in Perl, unless there's a good reason not to. The reason for this is simple: Perl has the most "extended" implementation of the method. This assertion is guaranteed, since at a minimum the Perl proxy class implements the method. If the method in question has been extended by a class derived from the proxy class, that extended implementation will execute exactly as it should. If not, the proxy class will route the method call into a C wrapper function, expecting that the method will be resolved in C++. The wrapper will call the virtual method of the C++ instance, and since the director extends this the call will end up right back in the director method. Now comes the "good reason not to" part. If the director method were to blindly call the Perl method again, it would get stuck in an infinite loop. We avoid this situation by adding special code to the C wrapper function that tells the director method to not do this. The C wrapper function compares the pointer to the Perl object that called the wrapper function to the pointer stored by the director. If these are the same, then the C wrapper function tells the director to resolve the method by calling up the C++ inheritance chain, preventing an infinite loop.

    One more point needs to be made about the relationship between director classes and proxy classes. When a proxy class instance is created in Perl, SWIG creates an instance of the original C++ class. This is exactly what happens without directors and is true even if directors are enabled for the particular class in question. When a class derived from a proxy class is created, however, SWIG then creates an instance of the corresponding C++ director class. The reason for this difference is that user-defined subclasses may override or extend methods of the original class, so the director class is needed to route calls to these methods correctly. For unmodified proxy classes, all methods are ultimately implemented in C++ so there is no need for the extra overhead involved with routing the calls through Perl.

    30.11.3 Ownership and object destruction

    Memory management issues are slightly more complicated with directors than for proxy classes alone. Perl instances hold a pointer to the associated C++ director object, and the director in turn holds a pointer back to a Perl object. By default, proxy classes own their C++ director object and take care of deleting it when they are garbage collected.

    This relationship can be reversed by calling the special DISOWN() method of the proxy class. After calling this method the director class increments the reference count of the Perl object. When the director class is deleted it decrements the reference count. Assuming no outstanding references to the Perl object remain, the Perl object will be destroyed at the same time. This is a good thing, since directors and proxies refer to each other and so must be created and destroyed together. Destroying one without destroying the other will likely cause your program to segfault.

    Also note that due to the proxy implementation, the DESTROY() method on directors can be called for several reasons, many of which have little to do with the teardown of an object instance. To help disambiguate this, a second argument is added to the DESTROY() call when a C++ director object is being released. So, to avoid running your clean-up code when an object is not really going away, or after it has already been reclaimed, it is suggested that custom destructors in Perl subclasses looks something like:

    sub DESTROY {
      my($self, $final) = @_;
      if($final) {
        # real teardown code
      }
      shift->SUPER::DESTROY(@_);
    }
    

    30.11.4 Exception unrolling

    With directors routing method calls to Perl, and proxies routing them to C++, the handling of exceptions is an important concern. By default, the directors ignore exceptions that occur during method calls that are resolved in Perl. To handle such exceptions correctly, it is necessary to temporarily translate them into C++ exceptions. This can be done with the %feature("director:except") directive. The following code should suffice in most cases:

    %feature("director:except") {
      if ($error != NULL) {
        throw Swig::DirectorMethodException();
      }
    }
    

    This code will check the Perl error state after each method call from a director into Perl, and throw a C++ exception if an error occurred. This exception can be caught in C++ to implement an error handler.

    It may be the case that a method call originates in Perl, travels up to C++ through a proxy class, and then back into Perl via a director method. If an exception occurs in Perl at this point, it would be nice for that exception to find its way back to the original caller. This can be done by combining a normal %exception directive with the director:except handler shown above. Here is an example of a suitable exception handler:

    %exception {
      try { $action }
      catch (Swig::DirectorException &e) { SWIG_fail; }
    }
    

    The class Swig::DirectorException used in this example is actually a base class of Swig::DirectorMethodException, so it will trap this exception. Because the Perl error state is still set when Swig::DirectorMethodException is thrown, Perl will register the exception as soon as the C wrapper function returns.

    30.11.5 Overhead and code bloat

    Enabling directors for a class will generate a new director method for every virtual method in the class' inheritance chain. This alone can generate a lot of code bloat for large hierarchies. Method arguments that require complex conversions to and from target language types can result in large director methods. For this reason it is recommended that you selectively enable directors only for specific classes that are likely to be extended in Perl and used in C++.

    Compared to classes that do not use directors, the call routing in the director methods does add some overhead. In particular, at least one dynamic cast and one extra function call occurs per method call from Perl. Relative to the speed of Perl execution this is probably completely negligible. For worst case routing, a method call that ultimately resolves in C++ may take one extra detour through Perl in order to ensure that the method does not have an extended Perl implementation. This could result in a noticeable overhead in some cases.

    Although directors make it natural to mix native C++ objects with Perl objects (as director objects) via a common base class pointer, one should be aware of the obvious fact that method calls to Perl objects will be much slower than calls to C++ objects. This situation can be optimized by selectively enabling director methods (using the %feature directive) for only those methods that are likely to be extended in Perl.

    30.11.6 Typemaps

    Typemaps for input and output of most of the basic types from director classes have been written. These are roughly the reverse of the usual input and output typemaps used by the wrapper code. The typemap operation names are 'directorin', 'directorout', and 'directorargout'. The director code does not currently use any of the other kinds of typemaps. It is not clear at this point which kinds are appropriate and need to be supported.


    31 SWIG and PHP

    In this chapter, we discuss SWIG's support of PHP. SWIG currently supports generating wrappers for PHP7. Support for PHP5 was removed in SWIG 4.0.0 and support for PHP4 was removed in SWIG 1.3.37.

    Currently any PHP7 release should work.

    In order to use this module, you will need to have a copy of the PHP include files to compile the SWIG generated files. If you installed PHP from a binary package, you may need to install a "php-dev" or "php-devel" package for these to be installed. You can find out where these files are by running php-config --includes. To use the built PHP module you will need either the php binary or the Apache php module. If you want to build your extension into php directly, you will need the complete PHP source tree available.

    31.1 Generating PHP Extensions

    To build a PHP extension, run swig using the -php7 option as follows (-php is also supported and currently is an alias for -php7 but prior to SWIG 4.0.0 it was an alias for -php5):

    swig -php7 example.i
    

    This will produce 3 files example_wrap.c, php_example.h and example.php. The first file, example_wrap.c contains all of the C code needed to build a PHP extension. The second file, php_example.h contains the header information needed if you wish to statically link the extension into the php interpreter. The third file, example.php can be included by PHP scripts. It attempts to dynamically load the extension and contains extra php code specified in the interface file. If wrapping C++ code with PHP classes, it will also contain PHP class wrappers.

    SWIG can generate PHP extensions from C++ libraries as well when given the -c++ option. The support for C++ is discussed in more detail in section 27.2.6. The generated C++ wrapper will be called example_wrap.cxx. You can specify a different extension for the C++ wrapper using -cppext - e.g. if you want example_wrap.cc use -cppext cc.

    The usual (and recommended) way is to build the extension as a separate dynamically loaded module (which is supported by all modern operating systems).

    It is also possible to rebuild PHP from source so that your module is statically linked into the php executable/library. This is a lot more work, and also requires a full rebuild of PHP to update your module, and it doesn't play nicely with package system. We don't recommend this approach, or provide explicit support for it.

    31.1.1 Building a loadable extension

    To build your module as a dynamically loadable extension, use compilation commands like these (if you aren't using GCC, the commands will be different, and there may be some variation between platforms - these commands should at least work for Linux though):

            gcc `php-config --includes` -fpic -c example_wrap.c example.c
            gcc -shared example_wrap.o example.o -o example.so
    

    31.1.2 Using PHP Extensions

    To test the extension from a PHP script, you first need to tell PHP to load it. To do this, add a line like this to the [PHP] section of php.ini:

            extension=/path/to/modulename.so
    

    If the module is in PHP's default extension directory, you can omit the path.

    For some SAPIs (for example, the CLI SAPI) you can instead use the dl() function to load an extension at run time, by adding a line like this to the start of each PHP script which uses your extension:

            dl("/path/to/modulename.so"); // Load the module
    

    But note that dl() isn't supported when running PHP through a webserver - you'll need to use extension in php.ini as described above.

    The PHP module which SWIG generates will also attempt to do the dl() call for you if the extension isn't already loaded:

            include("example.php");
    

    This PHP module also defines the PHP classes for the wrapped API, so you'll almost certainly want to include it anyway.

    31.2 Basic PHP interface

    It is important to understand that PHP uses a single global namespace into which all symbols from extension modules are loaded. It is quite possible for names of symbols in one extension module to clash with other symbols unless care is taken to %rename them. At present SWIG doesn't have support for generating wrappers which make use of PHP's namespace feature.

    31.2.1 Constants

    These work in much the same way as in C/C++. Constants can be defined by using either the normal C pre-processor declarations, or the %constant SWIG directive. These will then be available from your PHP script as a PHP constant, (i.e. no dollar sign is needed to access them.) For example, with a swig interface file like this,

    %module example
    
    #define PI 3.14159
    
    %constant int E  = 2.71828
    

    you can access the constants in your PHP script like this,

    include("example.php");
    
    echo "PI = " . PI . "\n";
    
    echo "E = " . E . "\n";
    
    

    There's one peculiarity of how constants work in PHP which it is useful to note (this is not specific to SWIG though) - if you try to use an undeclared constant, PHP will emit a warning (or a notice in PHP 7.1 and earlier) and then expand the constant to a string version of the constant's name. Unfortunately it is easy to miss the warning message if you're using PHP in a webserver as it will probably end up in error.log or similar. Apparently this will throw an Error in a future version of PHP, but until then it's something to be aware of.

    For example,

    %module example
    
    #define EASY_TO_MISPELL 0
    

    accessed incorrectly in PHP,

    include("example.php");
    
    if(EASY_TO_MISPEL) {
      ...
    } else {
      ...
    }
    
    

    The mis-spelled constant will become the string 'EASY_TO_MISPEL', which is treated as true by the if test, when the value of the intended constant would be treated as false!

    31.2.2 Global Variables

    Because PHP does not provide a mechanism to intercept access and assignment of global variables, global variables are supported through the use of automatically generated accessor functions.

    %module example;
    
    %inline %{
      double seki = 2;
      void print_seki() {
        zend_printf("seki is now %f\n", seki);
      }
    %}
    

    is accessed as follows:

    include("example.php");
    print seki_get();
    seki_set( seki_get() * 2); # The C variable is now 4.
    print seki_get();
    

    SWIG supports global variables of all C datatypes including pointers and complex objects. Additional types can be supported by using the varinit typemap.

    SWIG honors the %immutable modifier by not generating code for the _set method. This provides read-only access to the variable from the php script. Attempting to access the _set method will result in a php fatal error because the function is undefined.

    At this time SWIG does not support custom accessor methods.

    31.2.3 Functions

    C functions are converted into PHP functions. Default/optional arguments are also allowed. An interface file like this :

    %module example
    int foo(int a);
    double bar(double, double b = 3.0);
    ...
    

    Will be accessed in PHP like this :

    include("example.php");
    $a = foo(2);
    $b = bar(3.5, -1.5);
    $c = bar(3.5);  # Use default argument for 2nd parameter
    
    

    31.2.4 Overloading

    Although PHP does not support overloading functions natively, swig will generate dispatch functions which will use %typecheck typemaps to allow overloading. This dispatch function's operation and precedence is described in Overloaded functions and methods.

    31.2.5 Pointers and References

    Pointers to C/C++ objects are represented as PHP resources, rather like MySQL connection handles.

    There are multiple ways to wrap pointers to simple types. Given the following C method:

      void add( int *in1, int *in2, int *result);
    

    One can include cpointer.i to generate PHP wrappers to int *.

    %module example
    %include "cpointer.i"
    %pointer_functions(int, intp)
    
    void add( int *in1, int *in2, int *result);
    

    This will result in the following usage in PHP:

    <?php
    
    include("example.php");
    
    $in1=copy_intp(3);
    $in2=copy_intp(5);
    $result=new_intp();
    
    add( $in1, $in2, $result );
    
    echo "The sum " . intp_value($in1) . " + " . intp_value($in2) . " = " . intp_value( $result) . "\n";
    ?>
    

    An alternative would be to use the include typemaps.i which defines named typemaps for INPUT, OUTPUT and INOUT variables. One needs to either %apply the appropriate typemap or adjust the parameter names as appropriate.

    %module example
    %include "typemaps.i"
    
    void add( int *INPUT, int *INPUT, int *OUTPUT);
    
    

    This will result in the following usage in PHP:

    <?php
    
    include("example.php");
    
    $in1 = 3;
    $in2 = 5;
    $result= add($in1, $in2);  # Note using variables for the input is unnecessary.
    
    echo "The sum $in1 + $in2 = $result\n";
    ?>
    

    Because PHP has a native concept of reference, it may seem more natural to the PHP developer to use references to pass pointers. To enable this, one needs to include phppointers.i which defines the named typemap REF.

    In case you write your own typemaps, SWIG supports an attribute called byref: if you set that, then SWIG will make sure that the generated wrapper function will want the input parameter as a reference.

    %module example
    %include "phppointers.i"
    
    void add( int *REF, int *REF, int *REF);
    
    

    This will result in the following usage in PHP:

    <?php
    
    include("example.php");
    
    $in1 = 3;
    $in2 = 5;
    $result = 0;
    add($in1, $in2, $result);
    
    echo "The sum $in1 + $in2 = $result\n";
    ?>
    

    It is important to note that a php variable which is NULL when passed by reference would end up passing a NULL pointer into the function. In PHP, an unassigned variable (i.e. where the first reference to the variable is not an assignment) is NULL. In the above example, if any of the three variables had not been assigned, a NULL pointer would have been passed into add. Depending on the implementation of the function, this may or may not be a good thing.

    We chose to allow passing NULL pointers into functions because that is sometimes required in C libraries. A NULL pointer can be created in PHP in a number of ways: by using unset on an existing variable, or assigning NULL to a variable.

    31.2.6 Structures and C++ classes

    SWIG defaults to wrapping C++ structs and classes with PHP classes - this is done by generating a PHP wrapper script which defines proxy classes which calls a set of flat functions which actually wrap the C++ class. You can disable this wrapper layer by passing the command-line option "-noproxy" in which case you'll just get the flat functions.

    This interface file

    %module vector
    
    class Vector {
    public:
      double x, y, z;
      Vector();
      ~Vector();
      double magnitude();
    };
    
    struct Complex {
     double re, im;
    };
    

    Would be used in the following way from PHP:

    <?php
      require "vector.php";
    
      $v = new Vector();
      $v->x = 3;
      $v->y = 4;
      $v->z = 5;
    
      echo "Magnitude of ($v->x, $v->y, $v->z) = " . $v->magnitude() . "\n";
    
      $v = NULL;   # destructor called.
    
      $c = new Complex();
    
      $c->re = 0;
      $c->im = 0;
    
      # $c destructor called when $c goes out of scope.
    ?>
    

    Member variables and methods are accessed using the -> operator.

    31.2.6.1 Using -noproxy

    The -noproxy option flattens the object structure and generates collections of named functions (these are the functions which the PHP class wrappers call). The above example results in the following PHP functions:

    new_Vector();
    Vector_x_set($obj, $d);
    Vector_x_get($obj);
    Vector_y_set($obj, $d);
    Vector_y_get($obj);
    Vector_z_set($obj, $d);
    Vector_z_get($obj);
    Vector_magnitude($obj);
    new_Complex();
    Complex_re_set($obj, $d);
    Complex_re_get($obj);
    Complex_im_set($obj, $d);
    Complex_im_get($obj);
    

    31.2.6.2 Constructors and Destructors

    The constructor is called when new Object() (or new_Object() if using -noproxy) is used to create an instance of the object. If multiple constructors are defined for an object, function overloading will be used to determine which constructor to execute.

    Because PHP uses reference counting to manage resources, simple assignment of one variable to another such as:

    $ref = $v;
    

    causes the symbol $ref to refer to the same underlying object as $v. This does not result in a call to the C++ copy constructor or copy assignment operator.

    One can force execution of the copy constructor by using:

    $o_copy = new Object($o);
    

    Destructors are automatically called when all variables referencing the instance are reassigned or go out of scope. The destructor is not available to be called manually. To force a destructor to be called the programmer can either reassign the variable or call unset($v)

    31.2.6.3 Static Member Variables

    Static member variables in C++ are not wrapped as such in PHP as it does not appear to be possible to intercept accesses to such variables. Therefore, static member variables are wrapped using a class function with the same name, which returns the current value of the class variable. For example

    %module example
    
    class Ko {
      static int threats;
    };
    
    

    would be accessed in PHP as,

    include("example.php");
    
    echo "There have now been " . Ko::threats() . " threats\n";
    
    

    To set the static member variable, pass the value as the argument to the class function, e.g.

    
    Ko::threats(10);
    
    echo "There have now been " . Ko::threats() . " threats\n";
    
    

    31.2.6.4 Static Member Functions

    Static member functions are supported in PHP using the class::function() syntax. For example

    %module example
    class Ko {
      static void threats();
    };
    
    would be executed in PHP as,
    include("example.php");
    Ko::threats();
    

    31.2.6.5 Specifying Implemented Interfaces

    PHP supports the concept of abstract interfaces which a class can implement. Since SWIG 3.0.3, you can tell SWIG that a wrapped class (for example MyIterator) implements the Iterator interface like so:

    %typemap("phpinterfaces") MyIterator "Iterator";
    

    If there are multiple interfaces, just list them separated by commas.

    31.2.7 PHP Pragmas, Startup and Shutdown code

    To place PHP code in the generated "example.php" file one can use the code pragma. The code is inserted after loading the shared object.

    %module example
    %pragma(php) code="
    # This code is inserted into example.php
    echo \"example.php execution\\n\";
    "
    

    Results in the following in "example.php"

    # This code is inserted into example.php
    echo "example.php execution\n";
    

    The version pragma can be used to add version to generated PHP extension module. The version is inserted in the zend_module_entry block.

    %module example
    %pragma(php) version="1.5"
    

    The include pragma is a short cut to add include statements to the example.php file.

    %module example
    %pragma(php) code="
    include \"include.php\";
    "
    %pragma(php) include="include.php"   // equivalent.
    

    The phpinfo pragma inserts code in the PHP_MINFO_FUNCTION which is called from PHP's phpinfo() function.

    %module example;
    %pragma(php) phpinfo="
      zend_printf("An example of PHP support through SWIG\n");
      php_info_print_table_start();
      php_info_print_table_header(2, \"Directive\", \"Value\");
      php_info_print_table_row(2, \"Example support\", \"enabled\");
      php_info_print_table_end();
    "
    

    To insert code into the PHP_MINIT_FUNCTION, one can use either %init or %minit.

    %module example;
    %init {
      zend_printf("Inserted into PHP_MINIT_FUNCTION\n");
    }
    %minit {
      zend_printf("Inserted into PHP_MINIT_FUNCTION\n");
    }
    

    To insert code into the PHP_MSHUTDOWN_FUNCTION, one can use either %shutdown or %mshutdown.

    %module example;
    %mshutdown {
      zend_printf("Inserted into PHP_MSHUTDOWN_FUNCTION\n");
    }
    

    The %rinit and %rshutdown statements are very similar but insert code into the request init (PHP_RINIT_FUNCTION) and request shutdown (PHP_RSHUTDOWN_FUNCTION) code respectively.

    31.3 Cross language polymorphism

    Proxy classes provide a more natural, object-oriented way to access extension classes. As described above, each proxy instance has an associated C++ instance, and method calls to the proxy are passed to the C++ instance transparently via C wrapper functions.

    This arrangement is asymmetric in the sense that no corresponding mechanism exists to pass method calls down the inheritance chain from C++ to PHP. In particular, if a C++ class has been extended in PHP (by extending the proxy class), these extensions will not be visible from C++ code. Virtual method calls from C++ are thus not able access the lowest implementation in the inheritance chain.

    Changes have been made to SWIG 1.3.18 to address this problem and make the relationship between C++ classes and proxy classes more symmetric. To achieve this goal, new classes called directors are introduced at the bottom of the C++ inheritance chain. Support for generating PHP classes has been added in SWIG 1.3.40. The job of the directors is to route method calls correctly, either to C++ implementations higher in the inheritance chain or to PHP implementations lower in the inheritance chain. The upshot is that C++ classes can be extended in PHP and from C++ these extensions look exactly like native C++ classes. Neither C++ code nor PHP code needs to know where a particular method is implemented: the combination of proxy classes, director classes, and C wrapper functions takes care of all the cross-language method routing transparently.

    31.3.1 Enabling directors

    The director feature is disabled by default. To use directors you must make two changes to the interface file. First, add the "directors" option to the %module directive, like this:

    %module(directors="1") modulename
    

    Without this option no director code will be generated. Second, you must use the %feature("director") directive to tell SWIG which classes and methods should get directors. The %feature directive can be applied globally, to specific classes, and to specific methods, like this:

    // generate directors for all classes that have virtual methods
    %feature("director");         
    
    // generate directors for the virtual methods in class Foo
    %feature("director") Foo;      
    

    You can use the %feature("nodirector") directive to turn off directors for specific classes or methods. So for example,

    %feature("director") Foo;
    %feature("nodirector") Foo::bar;
    

    will generate directors for the virtual methods of class Foo except bar().

    Directors can also be generated implicitly through inheritance. In the following, class Bar will get a director class that handles the methods one() and two() (but not three()):

    %feature("director") Foo;
    class Foo {
    public:
      Foo(int foo);
      virtual void one();
      virtual void two();
    };
    
    class Bar: public Foo {
    public:
      virtual void three();
    };
    

    then at the PHP side you can define

    require("mymodule.php");
    
    class MyFoo extends Foo {
      function one() {
        print "one from php\n";
      }
    }
    

    31.3.2 Director classes

    For each class that has directors enabled, SWIG generates a new class that derives from both the class in question and a special Swig::Director class. These new classes, referred to as director classes, can be loosely thought of as the C++ equivalent of the PHP proxy classes. The director classes store a pointer to their underlying PHP object. Indeed, this is quite similar to the "_cPtr" and "thisown" members of the PHP proxy classes.

    For simplicity let's ignore the Swig::Director class and refer to the original C++ class as the director's base class. By default, a director class extends all virtual methods in the inheritance chain of its base class (see the preceding section for how to modify this behavior). Virtual methods that have a final specifier are unsurprisingly excluded. Thus the virtual method calls, whether they originate in C++ or in PHP via proxy classes, eventually end up in at the implementation in the director class. The job of the director methods is to route these method calls to the appropriate place in the inheritance chain. By "appropriate place" we mean the method that would have been called if the C++ base class and its extensions in PHP were seamlessly integrated. That seamless integration is exactly what the director classes provide, transparently skipping over all the messy extension API glue that binds the two languages together.

    In reality, the "appropriate place" is one of only two possibilities: C++ or PHP. Once this decision is made, the rest is fairly easy. If the correct implementation is in C++, then the lowest implementation of the method in the C++ inheritance chain is called explicitly. If the correct implementation is in PHP, the Zend API is used to call the method of the underlying PHP object (after which the usual virtual method resolution in PHP automatically finds the right implementation).

    Now how does the director decide which language should handle the method call? The basic rule is to handle the method in PHP, unless there's a good reason not to. The reason for this is simple: PHP has the most "extended" implementation of the method. This assertion is guaranteed, since at a minimum the PHP proxy class implements the method. If the method in question has been extended by a class derived from the proxy class, that extended implementation will execute exactly as it should. If not, the proxy class will route the method call into a C wrapper function, expecting that the method will be resolved in C++. The wrapper will call the virtual method of the C++ instance, and since the director extends this the call will end up right back in the director method. Now comes the "good reason not to" part. If the director method were to blindly call the PHP method again, it would get stuck in an infinite loop. We avoid this situation by adding special code to the C wrapper function that tells the director method to not do this. The C wrapper function compares the called and the declaring class name of the given method. If these are not the same, then the C wrapper function tells the director to resolve the method by calling up the C++ inheritance chain, preventing an infinite loop.

    One more point needs to be made about the relationship between director classes and proxy classes. When a proxy class instance is created in PHP, SWIG creates an instance of the original C++ class and assigns it to ->_cPtr. This is exactly what happens without directors and is true even if directors are enabled for the particular class in question. When a class derived from a proxy class is created, however, SWIG then creates an instance of the corresponding C++ director class. The reason for this difference is that user-defined subclasses may override or extend methods of the original class, so the director class is needed to route calls to these methods correctly. For unmodified proxy classes, all methods are ultimately implemented in C++ so there is no need for the extra overhead involved with routing the calls through PHP.

    31.3.3 Ownership and object destruction

    Memory management issues are slightly more complicated with directors than for proxy classes alone. PHP instances hold a pointer to the associated C++ director object, and the director in turn holds a pointer back to the PHP object. By default, proxy classes own their C++ director object and take care of deleting it when they are garbage collected.

    This relationship can be reversed by calling the special ->thisown property of the proxy class. After setting this property to 0, the director class no longer destroys the PHP object. Assuming no outstanding references to the PHP object remain, the PHP object will be destroyed at the same time. This is a good thing, since directors and proxies refer to each other and so must be created and destroyed together. Destroying one without destroying the other will likely cause your program to segfault.

    Here is an example:

    class Foo {
    public:
      ...
    };
    class FooContainer {
    public:
      void addFoo(Foo *);
      ...
    };
    

    $c = new FooContainer();
    $a = new Foo();
    $a->thisown = 0;
    $c->addFoo($a);
    

    In this example, we are assuming that FooContainer will take care of deleting all the Foo pointers it contains at some point.

    31.3.4 Exception unrolling

    With directors routing method calls to PHP, and proxies routing them to C++, the handling of exceptions is an important concern. By default, an exception thrown in PHP code called from C++ causes the PHP interpreter to flag that an exception is thrown, then return passes to C++ as if the PHP function had returned Null. Assuming the directorout typemaps handle this (those SWIG defines by default should) then once control returns to PHP code again, the PHP exception will actually propagate.

    Sometimes this control flow is problematic, and you want to skip any handling in the C++ code. To achieve this, it is necessary to temporarily translate the PHP exception into a C++ exception. This can be achieved using the %feature("director:except") directive. The following code should suffice in most cases:

    %feature("director:except") {
      if ($error == FAILURE) {
        throw Swig::DirectorMethodException();
      }
    }
    

    This code will check the PHP error state after each method call from a director into PHP, and throw a C++ exception if an error occurred. This exception can be caught in C++ to implement an error handler. Currently no information about the PHP error is stored in the Swig::DirectorMethodException object, but this will likely change in the future.

    It may be the case that a method call originates in PHP, travels up to C++ through a proxy class, and then back into PHP via a director method. If an exception occurs in PHP at this point, it would be nice for that exception to find its way back to the original caller. This can be done by combining a normal %exception directive with the director:except handler shown above. Here is an example of a suitable exception handler:

    %exception {
      try { $action }
      catch (Swig::DirectorException &e) { SWIG_fail; }
    }
    

    The class Swig::DirectorException used in this example is actually a base class of Swig::DirectorMethodException, so it will trap this exception. Because the PHP error state is still set when Swig::DirectorMethodException is thrown, PHP will register the exception as soon as the C wrapper function returns.

    31.3.5 Overhead and code bloat

    Enabling directors for a class will generate a new director method for every virtual method in the class' inheritance chain. This alone can generate a lot of code bloat for large hierarchies. Method arguments that require complex conversions to and from target language types can result in large director methods. For this reason it is recommended that you selectively enable directors only for specific classes that are likely to be extended in PHP and used in C++.

    Compared to classes that do not use directors, the call routing in the director methods does add some overhead. In particular, at least one dynamic cast and one extra function call occurs per method call from PHP. Relative to the speed of PHP execution this is probably completely negligible. For worst case routing, a method call that ultimately resolves in C++ may take one extra detour through PHP in order to ensure that the method does not have an extended PHP implementation. This could result in a noticeable overhead in some cases.

    Although directors make it natural to mix native C++ objects with PHP objects (as director objects) via a common base class pointer, one should be aware of the obvious fact that method calls to PHP objects will be much slower than calls to C++ objects. This situation can be optimized by selectively enabling director methods (using the %feature directive) for only those methods that are likely to be extended in PHP.

    31.3.6 Typemaps

    Typemaps for input and output of most of the basic types from director classes have been written. These are roughly the reverse of the usual input and output typemaps used by the wrapper code. The typemap operation names are 'directorin', 'directorout', and 'directorargout'. The director code does not currently use any of the other kinds of typemaps. It is not clear at this point which kinds are appropriate and need to be supported.

    31.3.7 Miscellaneous

    Director typemaps for STL classes are mostly in place, and hence you should be able to use std::string, etc., as you would any other type.


    32 SWIG and Python

    Caution: This chapter is under repair!

    This chapter describes SWIG's support of Python. SWIG is compatible with all recent Python versions (Python 2.7 and Python >= 3.2). If you still need to generate bindings which work with older versions of Python, you'll have to use SWIG 3.0.x.

    This chapter covers most SWIG features, but certain low-level details are covered in less depth than in earlier chapters. At the very least, make sure you read the "SWIG Basics" chapter.

    32.1 Overview

    To build Python extension modules, SWIG uses a layered approach in which parts of the extension module are defined in C and other parts are defined in Python. The C layer contains low-level wrappers whereas Python code is used to define high-level features.

    This layered approach recognizes the fact that certain aspects of extension building are better accomplished in each language (instead of trying to do everything in C or C++). Furthermore, by generating code in both languages, you get a lot more flexibility since you can enhance the extension module with support code in either language.

    In describing the Python interface, this chapter starts by covering the basics of configuration, compiling, and installing Python modules. Next, the Python interface to common C and C++ programming features is described. Advanced customization features such as typemaps are then described followed by a discussion of low-level implementation details.

    32.2 Preliminaries

    32.2.1 Running SWIG

    Suppose that you defined a SWIG module such as the following:

    /* File: example.i */
    %module example
    
    %{
    #define SWIG_FILE_WITH_INIT
    #include "example.h"
    %}
    
    int fact(int n);
    

    The #define SWIG_FILE_WITH_INIT line inserts a macro that specifies that the resulting C file should be built as a Python extension, inserting the module init code. This .i file wraps the following simple C file:

    /* File: example.c */
    
    #include "example.h"
    
    int fact(int n) {
      if (n < 0) { /* This should probably return an error, but this is simpler */
        return 0;
      }
      if (n == 0) {
        return 1;
      } else {
        /* testing for overflow would be a good idea here */
        return n * fact(n-1);
      }
    }
    
    

    With the header file:

    /* File: example.h */
    
    int fact(int n);
    

    To build a Python module, run SWIG using the -python option:

    $ swig -python example.i
    

    If building a C++ extension, add the -c++ option:

    $ swig -c++ -python example.i
    

    This creates two different files; a C/C++ source file example_wrap.c or example_wrap.cxx and a Python source file example.py. The generated C source file contains the low-level wrappers that need to be compiled and linked with the rest of your C/C++ application to create an extension module. The Python source file contains high-level support code. This is the file that you will import to use the module.

    The name of the wrapper file is derived from the name of the input file. For example, if the input file is example.i, the name of the wrapper file is example_wrap.c. To change this, you can use the -o option. The name of the Python file is derived from the module name specified with %module. If the module name is example, then a file example.py is created.

    The following sections have further practical examples and details on how you might go about compiling and using the generated files.

    32.2.2 Using distutils

    The preferred approach to building an extension module for Python is to compile it with distutils, which comes with all recent versions of Python ( Distutils Docs).

    Distutils takes care of making sure that your extension is built with all the correct flags, headers, etc. for the version of Python it is run with. Distutils will compile your extension into a shared object file or DLL (.so on Linux, .pyd on Windows, etc). In addition, distutils can handle installing your package into site-packages, if that is desired. A configuration file (conventionally called: setup.py) describes the extension (and related Python modules). The distutils will then generate all the right compiler directives to build it for you.

    Here is a sample setup.py file for the above example:

    #!/usr/bin/env python
    
    """
    setup.py file for SWIG example
    """
    
    from distutils.core import setup, Extension
    
    
    example_module = Extension('_example',
                               sources=['example_wrap.c', 'example.c'],
                               )
    
    setup (name = 'example',
           version = '0.1',
           author      = "SWIG Docs",
           description = """Simple swig example from docs""",
           ext_modules = [example_module],
           py_modules = ["example"],
           )
    

    In this example, the line: example_module = Extension(....) creates an Extension module object, defining the name as _example , and using the source code files: example_wrap.c, generated by swig, and example.c, your original c source. The swig (and other Python extension modules) tradition is for the compiled extension to have the name of the Python portion, prefixed by an underscore. If the name of your Python module is "example.py", then the name of the corresponding object file will be"_example.so"

    The setup call then sets up distutils to build your package, defining some meta data, and passing in your extension module object. Once this is saved as setup.py, you can build your extension with these commands:

    $ swig -python example.i
    $ python setup.py build_ext --inplace
    

    And a .so, or .pyd or... will be created for you. It will build a version that matches the Python that you run the command with. Taking apart the command line:

    • python -- the version of Python you want to build for
    • setup.py -- the name of your setup script (it can be called anything, but setup.py is the tradition)
    • build_ext -- telling distutils to build extensions
    • --inplace -- this tells distutils to put the extension lib in the current dir. Otherwise, it will put it inside a build hierarchy, and you'd have to move it to use it.

    The distutils have many other features, consult the Python distutils docs for details.

    This same approach works on all platforms if the appropriate compiler is installed. (it can even build extensions to the standard Windows Python using MingGW)

    32.2.3 Hand compiling a dynamic module

    While the preferred approach to building an extension module is to use the distutils, some people like to integrate building extensions with a larger build system, and thus may wish to compile their modules without the distutils. To do this, you need to compile your program using commands like this (shown for Linux):

    $ swig -python example.i
    $ gcc -O2 -fPIC -c example.c
    $ gcc -O2 -fPIC -c example_wrap.c -I/usr/local/include/python2.5
    $ gcc -shared example.o example_wrap.o -o _example.so
    

    The exact commands for doing this vary from platform to platform. However, SWIG tries to guess the right options when it is installed. Therefore, you may want to start with one of the examples in the SWIG/Examples/python directory. If that doesn't work, you will need to read the man-pages for your compiler and linker to get the right set of options. You might also check the SWIG Wiki for additional information.

    When linking the module, the name of the output file has to match the name of the module prefixed by an underscore. If the name of your module is "example", then the name of the corresponding object file should be "_example.so" or "_examplemodule.so ". The name of the module is specified using the %module directive or the -module command line option.

    Compatibility Note: In SWIG-1.3.13 and earlier releases, module names did not include the leading underscore. This is because modules were normally created as C-only extensions without the extra Python support file (instead, creating Python code was supported as an optional feature). This has been changed in SWIG-1.3.14 and is consistent with other Python extension modules. For example, the socket module actually consists of two files; socket.py and _socket.so. Many other built-in Python modules follow a similar convention.

    32.2.4 Static linking

    An alternative approach to dynamic linking is to rebuild the Python interpreter with your extension module added to it. In the past, this approach was sometimes necessary due to limitations in dynamic loading support on certain machines. However, the situation has improved greatly over the last few years and you should not consider this approach unless there is really no other option.

    The usual procedure for adding a new module to Python involves finding the Python source, adding an entry to the Modules/Setup file, and rebuilding the interpreter using the Python Makefile. However, newer Python versions have changed the build process. You may need to edit the 'setup.py' file in the Python distribution instead.

    In earlier versions of SWIG, the embed.i library file could be used to rebuild the interpreter. For example:

    %module example
    
    %inline %{
    extern int fact(int);
    extern int mod(int, int);
    extern double My_variable;
    %}
    
    %include "embed.i"       // Include code for a static version of Python
    
    

    The embed.i library file includes supporting code that contains everything needed to rebuild Python. To rebuild the interpreter, you simply do something like this:

    $ swig -python -lembed.i example.i
    $ gcc example.c example_wrap.c \
            -Xlinker -export-dynamic \
            -DHAVE_CONFIG_H -I/usr/include/python2.7 \
            -I/usr/lib/python2.7/config-x86_64-linux-gnu \
            -I/usr/lib/python2.7/config \
            -L/usr/lib/python2.7/config -lpython2.7 -lm -ldl \
            -o mypython
    

    You will need to supply the same libraries that were used to build Python the first time. This may include system libraries such as -lsocket, -lnsl, and -lpthread. Assuming this actually works, the new version of Python should be identical to the default version except that your extension module will be a built-in part of the interpreter.

    Comment: In practice, you should probably try to avoid static linking if possible. Some programmers may be inclined to use static linking in the interest of getting better performance. However, the performance gained by static linking tends to be rather minimal in most situations (and quite frankly not worth the extra hassle in the opinion of this author).

    Compatibility note: The embed.i library file is deprecated and has not been actively maintained for many years. Even though it appears to "work" with Python 2.7, no future support is guaranteed. If using static linking, you might want to rely on a different approach (perhaps using distutils).

    32.2.5 Using your module

    To use your module, simply use the Python import statement. If all goes well, you will be able to run this:

    $ python
    >>> import example
    >>> example.fact(4)
    24
    >>>
    

    A common error received by first-time users is the following:

    >>> import example
    Traceback (most recent call last):
      File "<stdin>", line 1, in ?
      File "example.py", line 2, in ?
        import _example
    ImportError: No module named _example
    

    If you get this message, it means that you either forgot to compile the wrapper code into an extension module or you didn't give the extension module the right name. Make sure that you compiled the wrappers into a module called _example.so. And don't forget the leading underscore (_).

    Another possible error is the following:

    >>> import example
    Traceback (most recent call last):
      File "<stdin>", line 1, in ?
    ImportError: dynamic module does not define init function (init_example)
    >>>
    

    This error is almost always caused when a bad name is given to the shared object file. For example, if you created a file example.so instead of _example.so you would get this error. Alternatively, this error could arise if the name of the module is inconsistent with the module name supplied with the %module directive. Double-check the interface to make sure the module name and the shared object filename match. Another possible cause of this error is forgetting to link the SWIG-generated wrapper code with the rest of your application when creating the extension module.

    Another common error is something similar to the following:

    Traceback (most recent call last):
      File "example.py", line 3, in ?
        import example
    ImportError: ./_example.so: undefined symbol: fact
    

    This error usually indicates that you forgot to include some object files or libraries in the linking of the shared library file. Make sure you compile both the SWIG wrapper file and your original program into a shared library file. Make sure you pass all of the required libraries to the linker.

    Sometimes unresolved symbols occur because a wrapper has been created for a function that doesn't actually exist in a library. This usually occurs when a header file includes a declaration for a function that was never actually implemented or it was removed from a library without updating the header file. To fix this, you can either edit the SWIG input file to remove the offending declaration or you can use the %ignore directive to ignore the declaration.

    Finally, suppose that your extension module is linked with another library like this:

    $ gcc -shared example.o example_wrap.o -L/home/beazley/projects/lib -lfoo \
          -o _example.so
    

    If the foo library is compiled as a shared library, you might encounter the following problem when you try to use your module:

    >>> import example
    Traceback (most recent call last):
      File "<stdin>", line 1, in ?
    ImportError: libfoo.so: cannot open shared object file: No such file or directory
    >>>
    

    This error is generated because the dynamic linker can't locate the libfoo.so library. When shared libraries are loaded, the system normally only checks a few standard locations such as /usr/lib and /usr/local/lib. To fix this problem, there are several things you can do. First, you can recompile your extension module with extra path information. For example, on Linux you can do this:

    $ gcc -shared example.o example_wrap.o -L/home/beazley/projects/lib -lfoo \
          -Xlinker -rpath /home/beazley/projects/lib  \
          -o _example.so
    

    Alternatively, you can set the LD_LIBRARY_PATH environment variable to include the directory with your shared libraries. If setting LD_LIBRARY_PATH, be aware that setting this variable can introduce a noticeable performance impact on all other applications that you run. To set it only for Python, you might want to do this instead:

    $ env LD_LIBRARY_PATH=/home/beazley/projects/lib python
    

    Finally, you can use a command such as ldconfig (Linux) or crle (Solaris) to add additional search paths to the default system configuration (this requires root access and you will need to read the man pages).

    32.2.6 Compilation of C++ extensions

    Compilation of C++ extensions has traditionally been a tricky problem. Since the Python interpreter is written in C, you need to take steps to make sure C++ is properly initialized and that modules are compiled correctly. This should be a non-issue if you're using distutils, as it takes care of all that for you. The following is included for historical reasons, and in case you need to compile on your own.

    On most machines, C++ extension modules should be linked using the C++ compiler. For example:

    $ swig -c++ -python example.i
    $ g++ -O2 -fPIC -c example.cxx
    $ g++ -O2 -fPIC -c example_wrap.cxx -I/usr/local/include/python2.5
    $ g++ -shared example.o example_wrap.o -o _example.so
    

    The -fPIC option tells GCC to generate position-independent code (PIC) which is required for most architectures (it's not vital on x86, but still a good idea as it allows code pages from the library to be shared between processes). Other compilers may need a different option specified instead of -fPIC.

    In addition to this, you may need to include additional library files to make it work. For example, if you are using the Sun C++ compiler on Solaris, you often need to add an extra library -lCrun like this:

    $ swig -c++ -python example.i
    $ CC -c example.cxx
    $ CC -c example_wrap.cxx -I/usr/local/include/python2.5
    $ CC -G example.o example_wrap.o -L/opt/SUNWspro/lib -o _example.so -lCrun
    

    Of course, the extra libraries to use are completely non-portable---you will probably need to do some experimentation.

    Sometimes people have suggested that it is necessary to relink the Python interpreter using the C++ compiler to make C++ extension modules work. In the experience of this author, this has never actually appeared to be necessary. Relinking the interpreter with C++ really only includes the special run-time libraries described above---as long as you link your extension modules with these libraries, it should not be necessary to rebuild Python.

    If you aren't entirely sure about the linking of a C++ extension, you might look at an existing C++ program. On many Unix machines, the ldd command will list library dependencies. This should give you some clues about what you might have to include when you link your extension module. For example:

    $ ldd swig
            libstdc++-libc6.1-1.so.2 => /usr/lib/libstdc++-libc6.1-1.so.2 (0x40019000)
            libm.so.6 => /lib/libm.so.6 (0x4005b000)
            libc.so.6 => /lib/libc.so.6 (0x40077000)
            /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
    

    As a final complication, a major weakness of C++ is that it does not define any sort of standard for binary linking of libraries. This means that C++ code compiled by different compilers will not link together properly as libraries nor is the memory layout of classes and data structures implemented in any kind of portable manner. In a monolithic C++ program, this problem may be unnoticed. However, in Python, it is possible for different extension modules to be compiled with different C++ compilers. As long as these modules are self-contained, this probably won't matter. However, if these modules start sharing data, you will need to take steps to avoid segmentation faults and other erratic program behavior. If working with lots of software components, you might want to investigate using a more formal standard such as COM.

    32.2.7 Compiling for 64-bit platforms

    On platforms that support 64-bit applications (Solaris, Irix, etc.), special care is required when building extension modules. On these machines, 64-bit applications are compiled and linked using a different set of compiler/linker options. In addition, it is not generally possible to mix 32-bit and 64-bit code together in the same application.

    To utilize 64-bits, the Python executable will need to be recompiled as a 64-bit application. In addition, all libraries, wrapper code, and every other part of your application will need to be compiled for 64-bits. If you plan to use other third-party extension modules, they will also have to be recompiled as 64-bit extensions.

    If you are wrapping commercial software for which you have no source code, you will be forced to use the same linking standard as used by that software. This may prevent the use of 64-bit extensions. It may also introduce problems on platforms that support more than one linking standard (e.g., -o32 and -n32 on Irix).

    On the Linux x86_64 platform (Opteron or EM64T), besides of the required compiler option -fPIC discussed above, you will need to be careful about the libraries you link with or the library path you use. In general, a Linux distribution will have two set of libraries, one for native x86_64 programs (under /usr/lib64), and another for 32 bits compatibility (under /usr/lib). Also, the compiler options -m32 and -m64 allow you to choose the desired binary format for your Python extension.

    32.2.8 Building Python extensions under Windows

    Building a SWIG extension to Python under Windows is roughly similar to the process used with Unix. Using the distutils, it is essentially identical. If you have the same version of the MS compiler that Python was built with (the python2.4 and python2.5 distributed by python.org are built with Visual Studio 2003), the standard python setup.py build should just work.

    As of python2.5, the distutils support building extensions with MingGW out of the box. Following the instruction here: Building Python extensions for Windows with only free tools should get you started.

    If you need to build it on your own, the following notes are provided:

    You will need to create a DLL that can be loaded into the interpreter. This section briefly describes the use of SWIG with Microsoft Visual C++. As a starting point, many of SWIG's examples include project files (.dsp files) for Visual C++ 6. These can be opened by more recent versions of Visual Studio. You might want to take a quick look at these examples in addition to reading this section.

    In Developer Studio, SWIG should be invoked as a custom build option. This is usually done as follows:

    • Open up a new workspace and use the AppWizard to select a DLL project.
    • Add both the SWIG interface file (the .i file), any supporting C files, and the name of the wrapper file that will be created by SWIG (ie. example_wrap.c). Note : If using C++, choose a different suffix for the wrapper file such as example_wrap.cxx. Don't worry if the wrapper file doesn't exist yet--Developer Studio keeps a reference to it.
    • Select the SWIG interface file and go to the settings menu. Under settings, select the "Custom Build" option.
    • Enter "SWIG" in the description field.
    • Enter "swig -python -o $(ProjDir)\$(InputName)_wrap.c $(InputPath)" in the "Build command(s) field"
    • Enter "$(ProjDir)\$(InputName)_wrap.c" in the "Output files(s) field".
    • Next, select the settings for the entire project and go to "C++:Preprocessor". Add the include directories for your Python installation under "Additional include directories".
    • Define the symbol __WIN32__ under preprocessor options.
    • Finally, select the settings for the entire project and go to "Link Options". Add the Python library file to your link libraries. For example "python27.lib". Also, set the name of the output file to match the name of your Python module, i.e. _example.pyd
    • Build your project.

    If all went well, SWIG will be automatically invoked whenever you build your project. Any changes made to the interface file will result in SWIG being automatically executed to produce a new version of the wrapper file.

    To run your new Python extension, simply run Python and use the import command as normal. For example :

    $ python
    >>> import example
    >>> print example.fact(4)
    24
    >>>
    

    If you get an ImportError exception when importing the module, you may have forgotten to include additional library files when you built your module. If you get an access violation or some kind of general protection fault immediately upon import, you have a more serious problem. This is often caused by linking your extension module against the wrong set of Win32 debug or thread libraries. You will have to fiddle around with the build options of project to try and track this down.

    A 'Debug' build of the wrappers requires a debug build of the Python interpreter. This normally requires building the Python interpreter from source, which is not a job for the feint-hearted. Alternatively you can use the 'Release' build of the Python interpreter with a 'Debug' build of your wrappers by defining the SWIG_PYTHON_INTERPRETER_NO_DEBUG symbol under the preprocessor options. Or you can ensure this macro is defined at the beginning of the wrapper code using the following in your interface file, where _MSC_VER ensures it is only used by the Visual Studio compiler:

    %begin %{
    #ifdef _MSC_VER
    #define SWIG_PYTHON_INTERPRETER_NO_DEBUG
    #endif
    %}
    

    Some users have reported success in building extension modules using Cygwin and other compilers. However, the problem of building usable DLLs with these compilers tends to be rather problematic. For the latest information, you may want to consult the SWIG Wiki.

    32.2.9 Additional Python commandline options

    The following table lists the additional commandline options available for the Python module. They can also be seen by using:

    swig -python -help
    
    Python specific options
    -builtinCreate Python built-in types rather than proxy classes, for better performance
    -castmodeEnable the casting mode, which allows implicit cast between types in Python
    -debug-doxygen-parserDisplay doxygen parser module debugging information
    -debug-doxygen-translatorDisplay doxygen translator module debugging information
    -dirvtableGenerate a pseudo virtual table for directors for faster dispatch
    -doxygenConvert C++ doxygen comments to pydoc comments in proxy classes
    -extranativeReturn extra native wrappers for C++ std containers wherever possible
    -fastproxyUse fast proxy mechanism for member methods
    -globals <name>Set <name> used to access C global variable (default: 'cvar')
    -interface <mod>Set low-level C/C++ module name to <mod> (default: module name prefixed by '_')
    -keywordUse keyword arguments
    -nofastunpackUse traditional UnpackTuple method to parse the argument functions
    -nohDon't generate the output header file
    -noproxyDon't generate proxy classes
    -norttiDisable the use of the native C++ RTTI with directors
    -nothreadsDisable thread support for the entire interface
    -olddefsKeep the old method definitions when using -fastproxy
    -py3Generate code with Python 3 specific features and syntax
    -relativeimportUse relative Python imports
    -threadsAdd thread support for all the interface
    -OEnable the following optimization options: -fastdispatch -fastproxy -fvirtual

    Many of these options are covered later on and their use should become clearer by the time you have finished reading this section on SWIG and Python.

    32.3 A tour of basic C/C++ wrapping

    By default, SWIG tries to build a very natural Python interface to your C/C++ code. Functions are wrapped as functions, classes are wrapped as classes, and so forth. This section briefly covers the essential aspects of this wrapping.

    32.3.1 Modules

    The SWIG %module directive specifies the name of the Python module. If you specify `%module example', then everything is wrapped into a Python 'example' module. Underneath the covers, this module consists of a Python source file example.py and a low-level extension module _example.so. When choosing a module name, make sure you don't use the same name as a built-in Python command or standard module name.

    32.3.2 Functions

    Global functions are wrapped as new Python built-in functions. For example,

    %module example
    int fact(int n);
    

    creates a built-in function example.fact(n) that works exactly like you think it does:

    >>> import example
    >>> print example.fact(4)
    24
    >>>
    

    32.3.3 Global variables

    C/C++ global variables are fully supported by SWIG. However, the underlying mechanism is somewhat different than you might expect due to the way that Python assignment works. When you type the following in Python

    a = 3.4
    

    "a" becomes a name for an object containing the value 3.4. If you later type

    b = a
    

    then "a" and "b" are both names for the object containing the value 3.4. Thus, there is only one object containing 3.4 and "a" and "b" are both names that refer to it. This is quite different than C where a variable name refers to a memory location in which a value is stored (and assignment copies data into that location). Because of this, there is no direct way to map variable assignment in C to variable assignment in Python.

    To provide access to C global variables, SWIG creates a special object called `cvar' that is added to each SWIG generated module. Global variables are then accessed as attributes of this object. For example, consider this interface

    // SWIG interface file with global variables
    %module example
    ...
    %inline %{
    extern int My_variable;
    extern double density;
    %}
    ...
    

    Now look at the Python interface:

    >>> import example
    >>> # Print out value of a C global variable
    >>> print example.cvar.My_variable
    4
    >>> # Set the value of a C global variable
    >>> example.cvar.density = 0.8442
    >>> # Use in a math operation
    >>> example.cvar.density = example.cvar.density*1.10
    

    If you make an error in variable assignment, you will receive an error message. For example:

    >>> example.cvar.density = "Hello"
    Traceback (most recent call last):
      File "<stdin>", line 1, in ?
    TypeError: C variable 'density (double )'
    >>>
    

    If a variable is declared as const, it is wrapped as a read-only variable. Attempts to modify its value will result in an error.

    To make ordinary variables read-only, you can use the %immutable directive. For example:

    %{
    extern char *path;
    %}
    %immutable;
    extern char *path;
    %mutable;
    

    The %immutable directive stays in effect until it is explicitly disabled or cleared using %mutable. See the Creating read-only variables section for further details.

    If you just want to make a specific variable immutable, supply a declaration name. For example:

    %{
    extern char *path;
    %}
    %immutable path;
    ...
    extern char *path;      // Read-only (due to %immutable)
    

    If you would like to access variables using a name other than " cvar", it can be changed using the -globals option :

    $ swig -python -globals myvar example.i
    

    Some care is in order when importing multiple SWIG modules. If you use the "from <file> import *" style of importing, you will get a name clash on the variable `cvar' and you will only be able to access global variables from the last module loaded. To prevent this, you might consider renaming cvar or making it private to the module by giving it a name that starts with a leading underscore. SWIG does not create cvar if there are no global variables in a module.

    32.3.4 Constants and enums

    C/C++ constants are installed as Python objects containing the appropriate value. To create a constant, use #define, enum , or the %constant directive. For example:

    #define PI 3.14159
    #define VERSION "1.0"
    
    enum Beverage { ALE, LAGER, STOUT, PILSNER };
    
    %constant int FOO = 42;
    %constant const char *path = "/usr/local";
    

    For enums, make sure that the definition of the enumeration actually appears in a header file or in the wrapper file somehow---if you just stick an enum in a SWIG interface without also telling the C compiler about it, the wrapper code won't compile.

    Note: declarations declared as const are wrapped as read-only variables and will be accessed using the cvar object described in the previous section. They are not wrapped as constants. For further discussion about this, see the SWIG Basics chapter.

    Constants are not guaranteed to remain constant in Python---the name of the constant could be accidentally reassigned to refer to some other object. Unfortunately, there is no easy way for SWIG to generate code that prevents this. You will just have to be careful.

    32.3.5 Pointers

    C/C++ pointers are fully supported by SWIG. Furthermore, SWIG has no problem working with incomplete type information. Here is a rather simple interface:

    %module example
    
    FILE *fopen(const char *filename, const char *mode);
    int fputs(const char *, FILE *);
    int fclose(FILE *);
    

    When wrapped, you will be able to use the functions in a natural way from Python. For example:

    >>> import example
    >>> f = example.fopen("junk", "w")
    >>> example.fputs("Hello World\n", f)
    >>> example.fclose(f)
    

    If this makes you uneasy, rest assured that there is no deep magic involved. Underneath the covers, pointers to C/C++ objects are simply represented as opaque values using an especial Python container object:

    >>> print f
    <Swig Object of type 'FILE *' at 0xb7d6f470>
    

    This pointer value can be freely passed around to different C functions that expect to receive an object of type FILE *. The only thing you can't do is dereference the pointer from Python. Of course, that isn't much of a concern in this example.

    In older versions of SWIG (1.3.22 or older), pointers were represented using a plain string object. If you have an old package that still requires that representation, or you just feel nostalgic, you can always retrieve it by casting the pointer object to a string:

    >>> print str(f)
    _c0671108_p_FILE
    

    Also, if you need to pass the raw pointer value to some external Python library, you can do it by casting the pointer object to an integer:

    >>> print int(f)
    135833352
    

    However, the inverse operation is not possible, i.e., you can't build a SWIG pointer object from a raw integer value.

    Note also that the '0' or NULL pointer is always represented by None, no matter what type swig is addressing. In the previous example, you can call:

    >>> example.fclose(None)
    

    and that will be equivalent to the following, but not really useful, C code:

    FILE *f = NULL;
    fclose(f);
    

    As much as you might be inclined to modify a pointer value directly from Python, don't. The hexadecimal encoding is not necessarily the same as the logical memory address of the underlying object. Instead it is the raw byte encoding of the pointer value. The encoding will vary depending on the native byte-ordering of the platform (i.e., big-endian vs. little-endian). Similarly, don't try to manually cast a pointer to a new type by simply replacing the type-string. This may not work like you expect, it is particularly dangerous when casting C++ objects. If you need to cast a pointer or change its value, consider writing some helper functions instead. For example:

    %inline %{
    /* C-style cast */
    Bar *FooToBar(Foo *f) {
      return (Bar *) f;
    }
    
    /* C++-style cast */
    Foo *BarToFoo(Bar *b) {
      return dynamic_cast<Foo*>(b);
    }
    
    Foo *IncrFoo(Foo *f, int i) {
      return f+i;
    }
    %}
    

    Also, if working with C++, you should always try to use the new C++ style casts. For example, in the above code, the C-style cast may return a bogus result whereas as the C++-style cast will return None if the conversion can't be performed.

    32.3.6 Structures

    If you wrap a C structure, it is wrapped by a Python class. This provides a very natural interface. For example,

    struct Vector {
      double x, y, z;
    };
    
    

    is used as follows:

    >>> v = example.Vector()
    >>> v.x = 3.5
    >>> v.y = 7.2
    >>> print v.x, v.y, v.z
    3.5 7.2 0.0
    >>>
    

    Similar access is provided for unions and the data members of C++ classes.

    If you print out the value of v in the above example, you will see something like this:

    >>> print v
    <C Vector instance at _18e31408_p_Vector>
    

    This object is actually a Python instance that has been wrapped around a pointer to the low-level C structure. This instance doesn't actually do anything--it just serves as a proxy. The pointer to the C object can be found in the .this attribute. For example:

    >>> print v.this
    _18e31408_p_Vector
    >>>
    

    Further details about the Python proxy class are covered a little later.

    const members of a structure are read-only. Data members can also be forced to be read-only using the %immutable directive. For example:

    struct Foo {
      ...
      %immutable;
      int x;        /* Read-only members */
      char *name;
      %mutable;
      ...
    };
    

    When char * members of a structure are wrapped, the contents are assumed to be dynamically allocated using malloc or new (depending on whether or not SWIG is run with the -c++ option). When the structure member is set, the old contents will be released and a new value created. If this is not the behavior you want, you will have to use a typemap (described later).

    If a structure contains arrays, access to those arrays is managed through pointers. For example, consider this:

    struct Bar {
      int  x[16];
    };
    

    If accessed in Python, you will see behavior like this:

    >>> b = example.Bar()
    >>> print b.x
    _801861a4_p_int
    >>>
    

    This pointer can be passed around to functions that expect to receive an int * (just like C). You can also set the value of an array member using another pointer. For example:

    >>> c = example.Bar()
    >>> c.x = b.x             # Copy contents of b.x to c.x
    

    For array assignment, SWIG copies the entire contents of the array starting with the data pointed to by b.x. In this example, 16 integers would be copied. Like C, SWIG makes no assumptions about bounds checking---if you pass a bad pointer, you may get a segmentation fault or access violation.

    When a member of a structure is itself a structure, it is handled as a pointer. For example, suppose you have two structures like this:

    struct Foo {
      int a;
    };
    
    struct Bar {
      Foo f;
    };
    

    Now, suppose that you access the f attribute of Bar like this:

    >>> b = Bar()
    >>> x = b.f
    

    In this case, x is a pointer that points to the Foo that is inside b. This is the same value as generated by this C code:

    Bar b;
    Foo *x = &b->f;       /* Points inside b */
    

    Because the pointer points inside the structure, you can modify the contents and everything works just like you would expect. For example:

    >>> b = Bar()
    >>> b.f.a = 3               # Modify attribute of structure member
    >>> x = b.f
    >>> x.a = 3                 # Modifies the same structure
    

    Note that there is a limitation with structs within structs that will cause a problem if the outer struct is not a named variable in Python. The following will cause a segfault:

    Bar().f.a = 3
    

    because the unnamed Python proxy class for Bar() has its reference count decremented by the Python interpreter after f has been obtained from it and before f is used to obtain a . This results in the underlying Bar instance being deleted, which of course also deletes f inside it. Hence the pointer to f points to deleted memory and use of it results in a segfault or some sort of other undefined behaviour.

    32.3.7 C++ classes

    C++ classes are wrapped by Python classes as well. For example, if you have this class,

    class List {
    public:
      List();
      ~List();
      int  search(char *item);
      void insert(char *item);
      void remove(char *item);
      char *get(int n);
      int  length;
    };
    

    you can use it in Python like this:

    >>> l = example.List()
    >>> l.insert("Ale")
    >>> l.insert("Stout")
    >>> l.insert("Lager")
    >>> l.get(1)
    'Stout'
    >>> print l.length
    3
    >>>
    

    Class data members are accessed in the same manner as C structures.

    Static class members present a special problem for Python. Prior to Python-2.2, Python classes had no support for static methods and no version of Python supports static member variables in a manner that SWIG can utilize. Therefore, SWIG generates wrappers that try to work around some of these issues. To illustrate, suppose you have a class like this:

    class Spam {
    public:
      static void foo();
      static int bar;
    };
    

    In Python, the static member can be access in three different ways:

    >>> example.Spam_foo()    # Spam::foo()
    >>> s = example.Spam()
    >>> s.foo()               # Spam::foo() via an instance
    >>> example.Spam.foo()    # Spam::foo(). Python-2.2 only
    

    The first two methods of access are supported in all versions of Python. The last technique is only available in Python-2.2 and later versions.

    Static member variables are currently accessed as global variables. This means, they are accessed through cvar like this:

    >>> print example.cvar.Spam_bar
    7
    

    32.3.8 C++ inheritance

    SWIG is fully aware of issues related to C++ inheritance. Therefore, if you have classes like this

    class Foo {
    ...
    };
    
    class Bar : public Foo {
    ...
    };
    

    those classes are wrapped into a hierarchy of Python classes that reflect the same inheritance structure. All of the usual Python utility functions work normally:

    >>> b = Bar()
    >>> instance(b, Foo)
    1
    >>> issubclass(Bar, Foo)
    1
    >>> issubclass(Foo, Bar)
    0
    

    Furthermore, if you have functions like this

    void spam(Foo *f);
    

    then the function spam() accepts Foo * or a pointer to any class derived from Foo.

    It is safe to use multiple inheritance with SWIG.

    32.3.9 Pointers, references, values, and arrays

    In C++, there are many different ways a function might receive and manipulate objects. For example:

    void spam1(Foo *x);      // Pass by pointer
    void spam2(Foo &x);      // Pass by reference
    void spam3(const Foo &x);// Pass by const reference
    void spam4(Foo x);       // Pass by value
    void spam5(Foo x[]);     // Array of objects
    

    In Python, there is no detailed distinction like this--specifically, there are only "objects". There are no pointers, references, arrays, and so forth. Because of this, SWIG unifies all of these types together in the wrapper code. For instance, if you actually had the above functions, it is perfectly legal to do this:

    >>> f = Foo()           # Create a Foo
    >>> spam1(f)            # Ok. Pointer
    >>> spam2(f)            # Ok. Reference
    >>> spam3(f)            # Ok. Const reference
    >>> spam4(f)            # Ok. Value.
    >>> spam5(f)            # Ok. Array (1 element)
    

    Similar behavior occurs for return values. For example, if you had functions like this,

    Foo *spam6();
    Foo &spam7();
    Foo  spam8();
    const Foo &spam9();
    

    then all three functions will return a pointer to some Foo object. Since the third function (spam8) returns a value, newly allocated memory is used to hold the result and a pointer is returned (Python will release this memory when the return value is garbage collected). The fourth case (spam9) which returns a const reference, in most of the cases will be treated as a returning value, and it will follow the same allocation/deallocation process.

    32.3.10 C++ overloaded functions

    C++ overloaded functions, methods, and constructors are mostly supported by SWIG. For example, if you have two functions like this:

    void foo(int);
    void foo(char *c);
    

    You can use them in Python in a straightforward manner:

    >>> foo(3)           # foo(int)
    >>> foo("Hello")     # foo(char *c)
    

    Similarly, if you have a class like this,

    class Foo {
    public:
      Foo();
      Foo(const Foo &);
      ...
    };
    

    you can write Python code like this:

    >>> f = Foo()          # Create a Foo
    >>> g = Foo(f)         # Copy f
    

    Overloading support is not quite as flexible as in C++. Sometimes there are methods that SWIG can't disambiguate. For example:

    void spam(int);
    void spam(short);
    

    or

    void foo(Bar *b);
    void foo(Bar &b);
    

    If declarations such as these appear, you will get a warning message like this:

    example.i:12: Warning 509: Overloaded method spam(short) effectively ignored,
    example.i:11: Warning 509: as it is shadowed by spam(int).
    

    To fix this, you either need to ignore or rename one of the methods. For example:

    %rename(spam_short) spam(short);
    ...
    void spam(int);
    void spam(short);   // Accessed as spam_short
    

    or

    %ignore spam(short);
    ...
    void spam(int);
    void spam(short);   // Ignored
    

    SWIG resolves overloaded functions and methods using a disambiguation scheme that ranks and sorts declarations according to a set of type-precedence rules. The order in which declarations appear in the input does not matter except in situations where ambiguity arises--in this case, the first declaration takes precedence.

    Please refer to the "SWIG and C++" chapter for more information about overloading.

    32.3.11 C++ operators

    Certain C++ overloaded operators can be handled automatically by SWIG. For example, consider a class like this:

    class Complex {
    private:
      double rpart, ipart;
    public:
      Complex(double r = 0, double i = 0) : rpart(r), ipart(i) { }
      Complex(const Complex &c) : rpart(c.rpart), ipart(c.ipart) { }
      Complex &operator=(const Complex &c);
    
      Complex operator+=(const Complex &c) const;
      Complex operator+(const Complex &c) const;
      Complex operator-(const Complex &c) const;
      Complex operator*(const Complex &c) const;
      Complex operator-() const;
    
      double re() const { return rpart; }
      double im() const { return ipart; }
    };
    

    When wrapped, it works like you expect:

    >>> c = Complex(3, 4)
    >>> d = Complex(7, 8)
    >>> e = c + d
    >>> e.re()
    10.0
    >>> e.im()
    12.0
    >>> c += d
    >>> c.re()
    10.0
    >>> c.im()
    12.0
    
    

    One restriction with operator overloading support is that SWIG is not able to fully handle operators that aren't defined as part of the class. For example, if you had code like this

    class Complex {
    ...
    friend Complex operator+(double, const Complex &c);
    ...
    };
    

    then SWIG ignores it and issues a warning. You can still wrap the operator, but you may have to encapsulate it in a special function. For example:

    %rename(Complex_add_dc) operator+(double, const Complex &);
    

    There are ways to make this operator appear as part of the class using the %extend directive. Keep reading.

    Also, be aware that certain operators don't map cleanly to Python. For instance, overloaded assignment operators don't map to Python semantics and will be ignored.

    Operator overloading is implemented in the pyopers.swg library file. In particular overloaded operators are marked with the python:maybecall feature, also known as %pythonmaybecall. This feature forces SWIG to generate code that return an instance of Python's NotImplemented instead of raising an exception when the comparison fails, that is, on any kind of error. This follows the guidelines in PEP 207 - Rich Comparisons and NotImplemented Python constant.

    32.3.12 C++ namespaces

    SWIG is aware of C++ namespaces, but namespace names do not appear in the module nor do namespaces result in a module that is broken up into submodules or packages. For example, if you have a file like this,

    %module example
    
    namespace foo {
      int fact(int n);
      struct Vector {
        double x, y, z;
      };
    };
    

    it works in Python as follows:

    >>> import example
    >>> example.fact(3)
    6
    >>> v = example.Vector()
    >>> v.x = 3.4
    >>> print v.y
    0.0
    >>>
    

    If your program has more than one namespace, name conflicts (if any) can be resolved using %rename For example:

    %rename(Bar_spam) Bar::spam;
    
    namespace Foo {
      int spam();
    }
    
    namespace Bar {
      int spam();
    }
    

    If you have more than one namespace and your want to keep their symbols separate, consider wrapping them as separate SWIG modules. For example, make the module name the same as the namespace and create extension modules for each namespace separately. If your program utilizes thousands of small deeply nested namespaces each with identical symbol names, well, then you get what you deserve.

    32.3.13 C++ templates

    C++ templates don't present a huge problem for SWIG. However, in order to create wrappers, you have to tell SWIG to create wrappers for a particular template instantiation. To do this, you use the %template directive. For example:

    %module example
    %{
    #include "pair.h"
    %}
    
    template<class T1, class T2>
    struct pair {
      typedef T1 first_type;
      typedef T2 second_type;
      T1 first;
      T2 second;
      pair();
      pair(const T1&, const T2&);
     ~pair();
    };
    
    %template(pairii) pair<int, int>;
    

    In Python:

    >>> import example
    >>> p = example.pairii(3, 4)
    >>> p.first
    3
    >>> p.second
    4
    

    Obviously, there is more to template wrapping than shown in this example. More details can be found in the SWIG and C++ chapter. Some more complicated examples will appear later.

    32.3.14 C++ Smart Pointers

    32.3.14.1 The shared_ptr Smart Pointer

    The C++11 standard provides std::shared_ptr which was derived from the Boost implementation, boost::shared_ptr. Both of these are available for Python in the SWIG library and usage is outlined in the shared_ptr smart pointer library section.

    32.3.14.2 Generic Smart Pointers

    In certain C++ programs, it is common to use classes that have been wrapped by so-called "smart pointers." Generally, this involves the use of a template class that implements operator->() like this:

    template<class T> class SmartPtr {
      ...
      T *operator->();
      ...
    }
    

    Then, if you have a class like this,

    class Foo {
    public:
      int x;
      int bar();
    };
    

    A smart pointer would be used in C++ as follows:

    SmartPtr<Foo> p = CreateFoo();   // Created somehow (not shown)
    ...
    p->x = 3;                        // Foo::x
    int y = p->bar();                // Foo::bar
    

    To wrap this in Python, simply tell SWIG about the SmartPtr class and the low-level Foo object. Make sure you instantiate SmartPtr using %template if necessary. For example:

    %module example
    ...
    %template(SmartPtrFoo) SmartPtr<Foo>;
    ...
    

    Now, in Python, everything should just "work":

    >>> p = example.CreateFoo()          # Create a smart-pointer somehow
    >>> p.x = 3                          # Foo::x
    >>> p.bar()                          # Foo::bar
    

    If you ever need to access the underlying pointer returned by operator->() itself, simply use the __deref__() method. For example:

    >>> f = p.__deref__()     # Returns underlying Foo *
    

    32.3.15 C++ reference counted objects

    The C++ reference counted objects section contains Python examples of memory management using referencing counting.

    32.4 Further details on the Python class interface

    In the previous section, a high-level view of Python wrapping was presented. A key component of this wrapping is that structures and classes are wrapped by Python proxy classes. This provides a very natural Python interface and allows SWIG to support a number of advanced features such as operator overloading. However, a number of low-level details were omitted. This section provides a brief overview of how the proxy classes work.

    New in SWIG version 2.0.4: The use of Python proxy classes has performance implications that may be unacceptable for a high-performance library. The new -builtin option instructs SWIG to forego the use of proxy classes, and instead create wrapped types as new built-in Python types. When this option is used, the following section ("Proxy classes") does not apply. Details on the use of the -builtin option are in the Built-in Types section.

    32.4.1 Proxy classes

    In the "SWIG basics" and "SWIG and C++" chapters, details of low-level structure and class wrapping are described. To summarize those chapters, if you have a class like this

    class Foo {
    public:
      int x;
      int spam(int);
      ...
    

    then SWIG transforms it into a set of low-level procedural wrappers. For example:

    Foo *new_Foo() {
      return new Foo();
    }
    void delete_Foo(Foo *f) {
      delete f;
    }
    int Foo_x_get(Foo *f) {
      return f->x;
    }
    void Foo_x_set(Foo *f, int value) {
      f->x = value;
    }
    int Foo_spam(Foo *f, int arg1) {
      return f->spam(arg1);
    }
    

    These wrappers can be found in the low-level extension module (e.g., _example).

    Using these wrappers, SWIG generates a high-level Python proxy class (also known as a shadow class) like this (shown for Python 2.2):

    import _example
    
    class Foo(object):
        def __init__(self):
            self.this = _example.new_Foo()
            self.thisown = 1
        def __del__(self):
            if self.thisown:
                _example.delete_Foo(self.this)
        def spam(self, arg1):
            return _example.Foo_spam(self.this, arg1)
        x = property(_example.Foo_x_get, _example.Foo_x_set)
    

    This class merely holds a pointer to the underlying C++ object ( .this) and dispatches methods and member variable access to that object using the low-level accessor functions. From a user's point of view, it makes the class work normally:

    >>> f = example.Foo()
    >>> f.x = 3
    >>> y = f.spam(5)
    

    The fact that the class has been wrapped by a real Python class offers certain advantages. For instance, you can attach new Python methods to the class and you can even inherit from it (something not supported by Python built-in types until Python 2.2).

    32.4.2 Built-in Types

    The -builtin option provides a significant performance improvement in the wrapped code. To understand the difference between proxy classes and built-in types, let's take a look at what a wrapped object looks like under both circumstances.

    When proxy classes are used, each wrapped object in Python is an instance of a pure Python class. As a reminder, here is what the __init__ method looks like in a proxy class:

    class Foo(object):
        def __init__(self):
            self.this = _example.new_Foo()
            self.thisown = 1
    

    When a Foo instance is created, the call to _example.new_Foo() creates a new C++ Foo instance; wraps that C++ instance inside an instance of a Python built-in type called SwigPyObject; and stores the SwigPyObject instance in the 'this' field of the Python Foo object. Did you get all that? So, the Python Foo object is composed of three parts:

    • The Python Foo instance, which contains...
    • ... an instance of struct SwigPyObject, which contains...
    • ... a C++ Foo instance

    When -builtin is used, the pure Python layer is stripped off. Each wrapped class is turned into a new Python built-in type which inherits from SwigPyObject, and SwigPyObject instances are returned directly from the wrapped methods. For more information about Python built-in extensions, please refer to the Python documentation:

    https://docs.python.org/3/extending/newtypes.html

    32.4.2.1 Limitations

    Use of the -builtin option implies a couple of limitations:

    • Some legacy syntax is no longer supported; in particular:

      • The functional interface is no longer exposed. For example, you may no longer call Whizzo.new_CrunchyFrog(). Instead, you must use Whizzo.CrunchyFrog().
      • Static member variables are no longer accessed through the 'cvar' field (e.g., Dances.cvar.FishSlap). They are instead accessed in the idiomatic way (Dances.FishSlap).
    • Wrapped types may not be raised as Python exceptions. Here's why: the Python internals expect that all sub-classes of Exception will have this struct layout:

      typedef struct {
        PyObject_HEAD
        PyObject *dict;
        PyObject *args;
        PyObject *message;
      } PyBaseExceptionObject;
      

      But swig-generated wrappers expect that all swig-wrapped classes will have this struct layout:

      typedef struct {
        PyObject_HEAD
        void *ptr;
        swig_type_info *ty;
        int own;
        PyObject *next;
        PyObject *dict;
      } SwigPyObject;
      

      There are workarounds for this. For example, if you wrap this class:

      class MyException {
      public:
        MyException (const char *msg_);
        ~MyException ();
      
        const char *what () const;
      
      private:
        char *msg;
      };
      

      ... you can define this Python class, which may be raised as an exception:

      class MyPyException(Exception):
          def __init__(self, msg, *args):
              Exception.__init__(self, *args)
              self.myexc = MyException(msg)
          def what(self):
              return self.myexc.what()
      
    • Reverse binary operators (e.g., __radd__) are not supported.

      To illustrate this point, if you have a wrapped class called MyString, and you want to use instances of MyString interchangeably with native Python strings, you can define an 'operator+ (const char*)' method :

      class MyString {
      public:
        MyString (const char *init);
        MyString operator+ (const char *other) const;
        ...
      };
      

      SWIG will automatically create an operator overload in Python that will allow this:

      from MyModule import MyString
      
      mystr = MyString("No one expects")
      episode = mystr + " the Spanish Inquisition"
      

      This works because the first operand (mystr) defines a way to add a native string to itself. However, the following will not work:

      from MyModule import MyString
      
      mystr = MyString("Parrot")
      episode = "Dead " + mystr
      

      The above code fails, because the first operand -- a native Python string -- doesn't know how to add an instance of MyString to itself.

    • If you have multiple SWIG modules that share type information ( more info), the -builtin option requires a bit of extra discipline to ensure that base classes are initialized before derived classes. Specifically:

      • There must be an unambiguous dependency graph for the modules.

      • Module dependencies must be explicitly stated with %import statements in the SWIG interface file.

      As an example, suppose module A has this interface in A.i :

      %module "A";
      
      class Base {
      ...
      };
      

      If you want to wrap another module containing a class that inherits from A, this is how it would look :

      %module "B";
      
      %import "A.i"
      
      class Derived : public Base {
      ...
      };
      

      The import "A.i" statement is required, because module B depends on module A.

      As long as you obey these requirements, your Python code may import the modules in any order :

      import B
      import A
      
      assert(issubclass(B.Derived, A.Base))
      

    32.4.2.2 Operator overloads and slots -- use them!

    The entire justification for the -builtin option is improved performance. To that end, the best way to squeeze maximum performance out of your wrappers is to use operator overloads. Named method dispatch is slow in Python, even when compared to other scripting languages. However, Python built-in types have a large number of "slots", analogous to C++ operator overloads, which allow you to short-circuit named method dispatch for certain common operations.

    By default, SWIG will translate most C++ arithmetic operator overloads into Python slot entries. For example, suppose you have this class:

    class Twit {
    public:
      Twit operator+ (const Twit& twit) const;
    
      // Forward to operator+
      Twit add (const Twit& twit) const {
        return *this + twit;
      }
    };
    

    SWIG will automatically register operator+ as a Python slot operator for addition. You may write Python code like this:

    from MyModule import Twit
    
    nigel = Twit()
    emily = Twit()
    percival = nigel + emily
    percival = nigel.add(emily)
    

    The last two lines of the Python code are equivalent, but the line that uses the '+' operator is much faster.

    In-place operators (e.g., operator+=) and comparison operators (operator==, operator<, etc.) are also converted to Python slot operators. For a complete list of C++ operators that are automatically converted to Python slot operators, refer to the file python/pyopers.swig in the SWIG library.

    Read about all of the available Python slots here: https://docs.python.org/3/c-api/typeobj.html

    There are two ways to define a Python slot function: dispatch to a statically defined function; or dispatch to a method defined on the operand.

    To dispatch to a statically defined function, use %feature("python:<slot>"), where <slot> is the name of a field in a PyTypeObject, PyNumberMethods, PyMappingMethods, PySequenceMethods or PyBufferProcs. You may override (almost) all of these slots.

    Let's consider an example setting the tp_hash slot for the MyClass type. This is akin to providing a __hash__ method (for non-builtin types) to make a type hashable. The hashable type can then for example be added to a Python dict.

    %feature("python:tp_hash") MyClass "myHashFunc";
    
    class MyClass {
    public:
      long field1;
      long field2;
      ...
    };
    
    %{
    #if PY_VERSION_HEX >= 0x03020000
      static Py_hash_t myHashFunc(PyObject *pyobj)
    #else
      static long myHashFunc(PyObject *pyobj)
    #endif
      {
        MyClass *cobj;
        // Convert pyobj to cobj
        return (cobj->field1 * (cobj->field2 << 7));
      }
    %}
    

    If you examine the generated code, the supplied hash function will now be the function callback in the tp_hash slot for the builtin type for MyClass:

    static PyHeapTypeObject SwigPyBuiltin__MyClass_type = {
      ...
      (hashfunc) myHashFunc,       /* tp_hash */
      ...
    

    NOTE: It is the responsibility of the programmer (that's you!) to ensure that a statically defined slot function has the correct signature, the hashfunc typedef in this case.

    If, instead, you want to dispatch to an instance method, you can use %feature("python:slot"). For example:

    %feature("python:slot", "tp_hash", functype="hashfunc") MyClass::myHashFunc;
    
    #if PY_VERSION_HEX < 0x03020000
      #define Py_hash_t long
    #endif
    
    class MyClass {
      public:
        Py_hash_t myHashFunc() const;
        ...
    };
    

    NOTE: Some Python slots use a method signature which does not match the signature of SWIG-wrapped methods. For those slots, SWIG will automatically generate a "closure" function to re-marshal the arguments before dispatching to the wrapped method. Setting the "functype" attribute of the feature enables SWIG to generate the chosen closure function.

    There is further information on %feature("python:slot") in the file python/pyopers.swig in the SWIG library.

    32.4.3 Memory management

    NOTE: Although this section refers to proxy objects, everything here also applies when the -builtin option is used.

    Associated with proxy object, is an ownership flag .thisown The value of this flag determines who is responsible for deleting the underlying C++ object. If set to 1, the Python interpreter will destroy the C++ object when the proxy class is garbage collected. If set to 0 (or if the attribute is missing), then the destruction of the proxy class has no effect on the C++ object.

    When an object is created by a constructor or returned by value, Python automatically takes ownership of the result. For example:

    class Foo {
    public:
      Foo();
      Foo bar();
    };
    

    In Python:

    >>> f = Foo()
    >>> f.thisown
    1
    >>> g = f.bar()
    >>> g.thisown
    1
    

    On the other hand, when pointers are returned to Python, there is often no way to know where they came from. Therefore, the ownership is set to zero. For example:

    class Foo {
    public:
      ...
      Foo *spam();
      ...
    };
    

    >>> f = Foo()
    >>> s = f.spam()
    >>> print s.thisown
    0
    >>>
    

    This behavior is especially important for classes that act as containers. For example, if a method returns a pointer to an object that is contained inside another object, you definitely don't want Python to assume ownership and destroy it!

    A good way to indicate that ownership should be set for a returned pointer is to use the %newobject directive.

    Related to containers, ownership issues can arise whenever an object is assigned to a member or global variable. For example, consider this interface:

    %module example
    
    struct Foo {
      int  value;
      Foo  *next;
    };
    
    Foo *head = 0;
    

    When wrapped in Python, careful observation will reveal that ownership changes whenever an object is assigned to a global variable. For example:

    >>> f = example.Foo()
    >>> f.thisown
    1
    >>> example.cvar.head = f
    >>> f.thisown
    0
    >>>
    

    In this case, C is now holding a reference to the object---you probably don't want Python to destroy it. Similarly, this occurs for members. For example:

    >>> f = example.Foo()
    >>> g = example.Foo()
    >>> f.thisown
    1
    >>> g.thisown
    1
    >>> f.next = g
    >>> g.thisown
    0
    >>>
    

    For the most part, memory management issues remain hidden. However, there are occasionally situations where you might have to manually change the ownership of an object. For instance, consider code like this:

    class Node {
      Object *value;
    public:
      void set_value(Object *v) { value = v; }
      ...
    };
    

    Now, consider the following Python code:

    >>> v = Object()           # Create an object
    >>> n = Node()             # Create a node
    >>> n.set_value(v)         # Set value
    >>> v.thisown
    1
    >>> del v
    

    In this case, the object n is holding a reference to v internally. However, SWIG has no way to know that this has occurred. Therefore, Python still thinks that it has ownership of the object. Should the proxy object be destroyed, then the C++ destructor will be invoked and n will be holding a stale-pointer. If you're lucky, you will only get a segmentation fault.

    To work around this, it is always possible to flip the ownership flag. For example,

    >>> v.thisown = 0
    

    It is also possible to deal with situations like this using typemaps--an advanced topic discussed later.

    32.5 Cross language polymorphism

    Proxy classes provide a more natural, object-oriented way to access extension classes. As described above, each proxy instance has an associated C++ instance, and method calls to the proxy are passed to the C++ instance transparently via C wrapper functions.

    This arrangement is asymmetric in the sense that no corresponding mechanism exists to pass method calls down the inheritance chain from C++ to Python. In particular, if a C++ class has been extended in Python (by extending the proxy class), these extensions will not be visible from C++ code. Virtual method calls from C++ are thus not able access the lowest implementation in the inheritance chain.

    Changes have been made to SWIG 1.3.18 to address this problem and make the relationship between C++ classes and proxy classes more symmetric. To achieve this goal, new classes called directors are introduced at the bottom of the C++ inheritance chain. The job of the directors is to route method calls correctly, either to C++ implementations higher in the inheritance chain or to Python implementations lower in the inheritance chain. The upshot is that C++ classes can be extended in Python and from C++ these extensions look exactly like native C++ classes. Neither C++ code nor Python code needs to know where a particular method is implemented: the combination of proxy classes, director classes, and C wrapper functions takes care of all the cross-language method routing transparently.

    32.5.1 Enabling directors

    The director feature is disabled by default. To use directors you must make two changes to the interface file. First, add the "directors" option to the %module directive, like this:

    %module(directors="1") modulename
    

    Without this option no director code will be generated. Second, you must use the %feature("director") directive to tell SWIG which classes and methods should get directors. The %feature directive can be applied globally, to specific classes, and to specific methods, like this:

    // generate directors for all classes that have virtual methods
    %feature("director");
    
    // generate directors for the virtual methods in class Foo
    %feature("director") Foo;
    

    You can use the %feature("nodirector") directive to turn off directors for specific classes or methods. So for example,

    %feature("director") Foo;
    %feature("nodirector") Foo::bar;
    

    will generate directors for the virtual methods of class Foo except bar().

    Directors can also be generated implicitly through inheritance. In the following, class Bar will get a director class that handles the methods one() and two() (but not three()):

    %feature("director") Foo;
    class Foo {
    public:
      Foo(int foo);
      virtual ~Foo();
      virtual void one();
      virtual void two();
    };
    
    class Bar: public Foo {
    public:
      virtual void three();
    };
    

    then at the Python side you can define

    import mymodule
    
    class MyFoo(mymodule.Foo):
        def __init__(self, foo):
            mymodule.Foo.__init__(self, foo)
    #       super().__init__(foo) # Alternative construction for Python3
    
        def one(self):
            print "one from Python"
    

    32.5.2 Director classes

    For each class that has directors enabled, SWIG generates a new class that derives from both the class in question and a special Swig::Director class. These new classes, referred to as director classes, can be loosely thought of as the C++ equivalent of the Python proxy classes. The director classes store a pointer to their underlying Python object and handle various issues related to object ownership. Indeed, this is quite similar to the "this" and "thisown" members of the Python proxy classes.

    For simplicity let's ignore the Swig::Director class and refer to the original C++ class as the director's base class. By default, a director class extends all virtual methods in the inheritance chain of its base class (see the preceding section for how to modify this behavior). Virtual methods that have a final specifier are unsurprisingly excluded. Thus the virtual method calls, whether they originate in C++ or in Python via proxy classes, eventually end up in at the implementation in the director class. The job of the director methods is to route these method calls to the appropriate place in the inheritance chain. By "appropriate place" we mean the method that would have been called if the C++ base class and its extensions in Python were seamlessly integrated. That seamless integration is exactly what the director classes provide, transparently skipping over all the messy extension API glue that binds the two languages together.

    In reality, the "appropriate place" is one of only two possibilities: C++ or Python. Once this decision is made, the rest is fairly easy. If the correct implementation is in C++, then the lowest implementation of the method in the C++ inheritance chain is called explicitly. If the correct implementation is in Python, the Python API is used to call the method of the underlying Python object (after which the usual virtual method resolution in Python automatically finds the right implementation).

    Now how does the director decide which language should handle the method call? The basic rule is to handle the method in Python, unless there's a good reason not to. The reason for this is simple: Python has the most "extended" implementation of the method. This assertion is guaranteed, since at a minimum the Python proxy class implements the method. If the method in question has been extended by a class derived from the proxy class, that extended implementation will execute exactly as it should. If not, the proxy class will route the method call into a C wrapper function, expecting that the method will be resolved in C++. The wrapper will call the virtual method of the C++ instance, and since the director extends this the call will end up right back in the director method. Now comes the "good reason not to" part. If the director method were to blindly call the Python method again, it would get stuck in an infinite loop. We avoid this situation by adding special code to the C wrapper function that tells the director method to not do this. The C wrapper function compares the pointer to the Python object that called the wrapper function to the pointer stored by the director. If these are the same, then the C wrapper function tells the director to resolve the method by calling up the C++ inheritance chain, preventing an infinite loop.

    One more point needs to be made about the relationship between director classes and proxy classes. When a proxy class instance is created in Python, SWIG creates an instance of the original C++ class and assigns it to .this. This is exactly what happens without directors and is true even if directors are enabled for the particular class in question. When a class derived from a proxy class is created, however, SWIG then creates an instance of the corresponding C++ director class. The reason for this difference is that user-defined subclasses may override or extend methods of the original class, so the director class is needed to route calls to these methods correctly. For unmodified proxy classes, all methods are ultimately implemented in C++ so there is no need for the extra overhead involved with routing the calls through Python.

    32.5.3 Ownership and object destruction

    Memory management issues are slightly more complicated with directors than for proxy classes alone. Python instances hold a pointer to the associated C++ director object, and the director in turn holds a pointer back to the Python object. By default, proxy classes own their C++ director object and take care of deleting it when they are garbage collected.

    This relationship can be reversed by calling the special __disown__() method of the proxy class. After calling this method, the .thisown flag is set to zero, and the director class increments the reference count of the Python object. When the director class is deleted it decrements the reference count. Assuming no outstanding references to the Python object remain, the Python object will be destroyed at the same time. This is a good thing, since directors and proxies refer to each other and so must be created and destroyed together. Destroying one without destroying the other will likely cause your program to segfault.

    To help ensure that no references to the Python object remain after calling __disown__(), this method returns a weak reference to the Python object. Weak references are only available in Python versions 2.1 and higher, so for older versions you must explicitly delete all references. Here is an example:

    class Foo {
    public:
      ...
    };
    class FooContainer {
    public:
      void addFoo(Foo *);
      ...
    };
    

    >>> c = FooContainer()
    >>> a = Foo().__disown__()
    >>> c.addFoo(a)
    >>> b = Foo()
    >>> b = b.__disown__()
    >>> c.addFoo(b)
    >>> c.addFoo(Foo().__disown__())
    

    In this example, we are assuming that FooContainer will take care of deleting all the Foo pointers it contains at some point. Note that no hard references to the Foo objects remain in Python.

    32.5.4 Exception unrolling

    With directors routing method calls to Python, and proxies routing them to C++, the handling of exceptions is an important concern. By default, the directors ignore exceptions that occur during method calls that are resolved in Python. To handle such exceptions correctly, it is necessary to temporarily translate them into C++ exceptions. This can be done with the %feature("director:except") directive. The following code should suffice in most cases:

    %feature("director:except") {
      if ($error != NULL) {
        throw Swig::DirectorMethodException();
      }
    }
    

    This code will check the Python error state after each method call from a director into Python, and throw a C++ exception if an error occurred. This exception can be caught in C++ to implement an error handler. Currently no information about the Python error is stored in the Swig::DirectorMethodException object, but this will likely change in the future.

    It may be the case that a method call originates in Python, travels up to C++ through a proxy class, and then back into Python via a director method. If an exception occurs in Python at this point, it would be nice for that exception to find its way back to the original caller. This can be done by combining a normal %exception directive with the director:except handler shown above. Here is an example of a suitable exception handler:

    %exception {
      try { $action }
      catch (Swig::DirectorException &e) { SWIG_fail; }
    }
    

    The class Swig::DirectorException used in this example is actually a base class of Swig::DirectorMethodException, so it will trap this exception. Because the Python error state is still set when Swig::DirectorMethodException is thrown, Python will register the exception as soon as the C wrapper function returns.

    32.5.5 Overhead and code bloat

    Enabling directors for a class will generate a new director method for every virtual method in the class' inheritance chain. This alone can generate a lot of code bloat for large hierarchies. Method arguments that require complex conversions to and from target language types can result in large director methods. For this reason it is recommended that you selectively enable directors only for specific classes that are likely to be extended in Python and used in C++.

    Compared to classes that do not use directors, the call routing in the director methods does add some overhead. In particular, at least one dynamic cast and one extra function call occurs per method call from Python. Relative to the speed of Python execution this is probably completely negligible. For worst case routing, a method call that ultimately resolves in C++ may take one extra detour through Python in order to ensure that the method does not have an extended Python implementation. This could result in a noticeable overhead in some cases.

    Although directors make it natural to mix native C++ objects with Python objects (as director objects) via a common base class pointer, one should be aware of the obvious fact that method calls to Python objects will be much slower than calls to C++ objects. This situation can be optimized by selectively enabling director methods (using the %feature directive) for only those methods that are likely to be extended in Python.

    32.5.6 Typemaps

    Typemaps for input and output of most of the basic types from director classes have been written. These are roughly the reverse of the usual input and output typemaps used by the wrapper code. The typemap operation names are 'directorin', 'directorout', and 'directorargout'. The director code does not currently use any of the other kinds of typemaps. It is not clear at this point which kinds are appropriate and need to be supported.

    32.5.7 Miscellaneous

    Director typemaps for STL classes are in place, and hence you should be able to use std::vector, std::string, etc., as you would any other type.

    Note: The director typemaps for return types based in const references, such as

    class Foo {
    …
      virtual const int& bar();
    …
    };
    

    will work only for simple call scenarios. Usually the resulting code is neither thread or reentrant safe. Hence, the user is advised to avoid returning const references in director methods. For example, the user could modify the method interface to use lvalue return types, wherever possible, for example

    class Foo {
    …
      virtual int bar();
    …
    };
    

    If that is not possible, the user should avoid enabling the director feature for reentrant, recursive or threaded member methods that return const references.

    32.6 Common customization features

    The last section presented the absolute basics of C/C++ wrapping. If you do nothing but feed SWIG a header file, you will get an interface that mimics the behavior described. However, sometimes this isn't enough to produce a nice module. Certain types of functionality might be missing or the interface to certain functions might be awkward. This section describes some common SWIG features that are used to improve your the interface to an extension module.

    32.6.1 C/C++ helper functions

    Sometimes when you create a module, it is missing certain bits of functionality. For example, if you had a function like this

    void set_transform(Image *im, double m[4][4]);
    

    it would be accessible from Python, but there may be no easy way to call it. For example, you might get errors like this:

    >>> a = [
    ...   [1, 0, 0, 0],
    ...   [0, 1, 0, 0],
    ...   [0, 0, 1, 0],
    ...   [0, 0, 0, 1]]
    >>> set_transform(im, a)
    Traceback (most recent call last):
      File "<stdin>", line 1, in ?
    TypeError: Type error. Expected _p_a_4__double
    

    The problem here is that there is no easy way to construct and manipulate a suitable double [4][4] value to use. To fix this, you can write some extra C helper functions. Just use the %inline directive. For example:

    %inline %{
    /* Note: double[4][4] is equivalent to a pointer to an array double (*)[4] */
    double (*new_mat44())[4] {
      return (double (*)[4]) malloc(16*sizeof(double));
    }
    void free_mat44(double (*x)[4]) {
      free(x);
    }
    void mat44_set(double x[4][4], int i, int j, double v) {
      x[i][j] = v;
    }
    double mat44_get(double x[4][4], int i, int j) {
      return x[i][j];
    }
    %}
    

    From Python, you could then write code like this:

    >>> a = new_mat44()
    >>> mat44_set(a, 0, 0, 1.0)
    >>> mat44_set(a, 1, 1, 1.0)
    >>> mat44_set(a, 2, 2, 1.0)
    ...
    >>> set_transform(im, a)
    >>>
    

    Admittedly, this is not the most elegant looking approach. However, it works and it wasn't too hard to implement. It is possible to clean this up using Python code, typemaps, and other customization features as covered in later sections.

    32.6.2 Adding additional Python code

    If writing support code in C isn't enough, it is also possible to write code in Python. This code gets inserted in to the .py file created by SWIG. One use of Python code might be to supply a high-level interface to certain functions. For example:

    void set_transform(Image *im, double x[4][4]);
    
    ...
    /* Rewrite the high level interface to set_transform */
    %pythoncode %{
    def set_transform(im, x):
        a = new_mat44()
        for i in range(4):
            for j in range(4):
                mat44_set(a, i, j, x[i][j])
        _example.set_transform(im, a)
        free_mat44(a)
    %}
    

    In this example, set_transform() provides a high-level Python interface built on top of low-level helper functions. For example, this code now seems to work:

    >>> a = [
    ...   [1, 0, 0, 0],
    ...   [0, 1, 0, 0],
    ...   [0, 0, 1, 0],
    ...   [0, 0, 0, 1]]
    >>> set_transform(im, a)
    >>>
    

    Admittedly, this whole scheme for wrapping the two-dimension array argument is rather ad-hoc. Besides, shouldn't a Python list or a Numeric Python array just work normally? We'll get to those examples soon enough. For now, think of this example as an illustration of what can be done without having to rely on any of the more advanced customization features.

    There is also %pythonbegin which is another directive very similar to %pythoncode, but generates the given Python code at the beginning of the .py file. This directive works in the same way as %pythoncode, except the code is copied just after the SWIG banner (comment) at the top of the file, before any real code. This provides an opportunity to add your own description in a comment near the top of the file as well as Python imports that have to appear at the top of the file, such as "from __future__ import" statements.

    The following example for Python 2.x shows how to insert code into the generated wrapper to enable print to be used as a Python3-compatible function instead of a statement:

    %pythonbegin %{
    # This module provides wrappers to the Whizz Bang library
    %}
    
    %pythonbegin %{
    from __future__ import print_function
    print("Loading", "Whizz", "Bang", sep=' ... ')
    %}
    

    The insert code can be seen at the start of the generated .py file:

    # This file was automatically generated by SWIG (http://www.swig.org).
    # Version 4.0.0
    #
    # Do not make changes to this file unless you know what you are doing--modify
    # the SWIG interface file instead.
    
    # This module provides wrappers to the Whizz Bang library
    
    from __future__ import print_function
    print("Loading", "Whizz", "Bang", sep=' ... ')
    
    

    When using %pythoncode and %pythonbegin you generally want to make sure that the block is delimited by %{ and %}. If you delimit it with { and } then any lines with a leading # will be handled by SWIG as preprocessor directives, when you probably meant them as Python comments. Prior to SWIG 3.0.3, invalid preprocessor directives were silently ignored, so generally using the wrong delimiters resulted in such comments not appearing in the generated output (though a comment starting with a valid preprocessor directive could cause problems, for example: # error handling). SWIG 3.0.3 and later report an error for invalid preprocessor directives, so you may have to update existing interface files to delimit blocks of Python code correctly.

    As an alternative to providing a block containing Python code, you can include Python code from a file. The code is inserted exactly as in the file, so this avoids any issues with the SWIG preprocessor. It's a good approach if you have a non-trivial chunk of Python code to insert. To use this feature you specify a filename in double quotes, for example:

    %pythoncode "somecode.py"
    

    Sometimes you may want to replace or modify the wrapper function that SWIG creates in the proxy .py file. The Python module in SWIG provides some features that enable you to do this. First, to entirely replace a proxy function you can use %feature("shadow"). For example:

    %module example
    
    // Rewrite bar() Python code
    
    %feature("shadow") Foo::bar(int) %{
    def bar(*args):
        #do something before
        $action
        #do something after
    %}
    
    class Foo {
    public:
      int bar(int x);
    };
    

    where $action will be replaced by the call to the C/C++ proper method.

    Often the proxy function created by SWIG is fine, but you simply want to add code to it without touching the rest of the generated function body. For these cases SWIG provides the pythonprepend and pythonappend features which do exactly as their names suggest. The pythonprepend feature will insert its value at the beginning of the proxy function, and pythonappend will insert code at the end of the proxy, just before the return statement.

    %module example
    
    // Add Python code to bar()
    
    %feature("pythonprepend") Foo::bar(int) %{
        #do something before C++ call
    %}
    
    %feature("pythonappend") Foo::bar(int) %{
        #do something after C++ call
        #the 'val' variable holds the return value
    %}
    
    
    class Foo {
    public:
      int bar(int x);
    };
    

    Notes: Usually the pythonappend and pythonprepend features are safer to use than the shadow feature. Also, from SWIG version 1.3.28 you can use the directive forms %pythonappend and %pythonprepend as follows:

    %module example
    
    // Add Python code to bar()
    
    %pythonprepend Foo::bar(int) %{
        #do something before C++ call
    %}
    
    %pythonappend Foo::bar(int) %{
        #do something after C++ call
        #the 'val' variable holds the return value
    %}
    
    
    class Foo {
    public:
      int bar(int x);
    };
    

    Note that when the underlying C++ method is overloaded, there is only one proxy Python method for multiple C++ methods. In this case, only one of parsed methods is examined for the feature. You are better off specifying the feature without the argument list to ensure it will get used, as it will then get attached to all the overloaded C++ methods. For example:

    %module example
    
    // Add Python code to bar()
    
    %pythonprepend Foo::bar %{
        #do something before C++ call
    %}
    
    %pythonappend Foo::bar %{
        #do something after C++ call
    %}
    
    
    class Foo {
    public:
      int bar(int x);
      int bar();
    };
    

    The same applies for overloaded constructors.

    32.6.3 Class extension with %extend

    One of the more interesting features of SWIG is that it can extend structures and classes with new methods--at least in the Python interface. Here is a simple example:

    %module example
    %{
    #include "someheader.h"
    %}
    
    struct Vector {
      double x, y, z;
    };
    
    %extend Vector {
      char *__str__() {
        static char tmp[1024];
        sprintf(tmp, "Vector(%g, %g, %g)", $self->x, $self->y, $self->z);
        return tmp;
      }
      Vector(double x, double y, double z) {
        Vector *v = (Vector *) malloc(sizeof(Vector));
        v->x = x;
        v->y = y;
        v->z = z;
        return v;
      }
    };
    

    Now, in Python

    >>> v = example.Vector(2, 3, 4)
    >>> print v
    Vector(2, 3, 4)
    >>>
    

    %extend can be used for many more tasks than this. For example, if you wanted to overload a Python operator, you might do this:

    %extend Vector {
      Vector __add__(Vector *other) {
        Vector v;
        v.x = $self->x + other->x;
        v.y = $self->y + other->y;
        v.z = $self->z + other->z;
        return v;
      }
    };
    

    Use it like this:

    >>> import example
    >>> v = example.Vector(2, 3, 4)
    >>> w = example.Vector(10, 11, 12)
    >>> print v+w
    Vector(12, 14, 16)
    >>>
    

    %extend works with both C and C++ code. It does not modify the underlying object in any way---the extensions only show up in the Python interface.

    32.6.4 Exception handling with %exception

    If a C or C++ function throws an error, you may want to convert that error into a Python exception. To do this, you can use the %exception directive. %exception simply lets you rewrite part of the generated wrapper code to include an error check.

    In C, a function often indicates an error by returning a status code (a negative number or a NULL pointer perhaps). Here is a simple example of how you might handle that:

    %exception malloc {
      $action
      if (!result) {
        PyErr_SetString(PyExc_MemoryError, "Not enough memory");
        SWIG_fail;
      }
    }
    void *malloc(size_t nbytes);
    

    In Python,

    >>> a = example.malloc(2000000000)
    Traceback (most recent call last):
      File "<stdin>", line 1, in ?
    MemoryError: Not enough memory
    >>>
    

    If a library provides some kind of general error handling framework, you can also use that. For example:

    %exception {
      $action
      if (err_occurred()) {
        PyErr_SetString(PyExc_RuntimeError, err_message());
        SWIG_fail;
      }
    }
    

    No declaration name is given to %exception, it is applied to all wrapper functions.

    C++ exceptions are also easy to handle. For example, you can write code like this:

    %exception getitem {
      try {
        $action
      } catch (std::out_of_range &e) {
        PyErr_SetString(PyExc_IndexError, const_cast<char*>(e.what()));
        SWIG_fail;
      }
    }
    
    class Base {
    public:
      Foo *getitem(int index);      // Exception handled added
      ...
    };
    

    When raising a Python exception from C, use the PyErr_SetString() function as shown above followed by SWIG_fail . The following exception types can be used as the first argument.

    PyExc_ArithmeticError
    PyExc_AssertionError
    PyExc_AttributeError
    PyExc_EnvironmentError
    PyExc_EOFError
    PyExc_Exception
    PyExc_FloatingPointError
    PyExc_ImportError
    PyExc_IndexError
    PyExc_IOError
    PyExc_KeyError
    PyExc_KeyboardInterrupt
    PyExc_LookupError
    PyExc_MemoryError
    PyExc_NameError
    PyExc_NotImplementedError
    PyExc_OSError
    PyExc_OverflowError
    PyExc_RuntimeError
    PyExc_StandardError
    PyExc_SyntaxError
    PyExc_SystemError
    PyExc_TypeError
    PyExc_UnicodeError
    PyExc_ValueError
    PyExc_ZeroDivisionError
    

    SWIG_fail is a C macro which when called within the context of SWIG wrapper function, will jump to the error handler code. This will call any cleanup code (freeing any temp variables) and then return from the wrapper function so that the Python interpreter can raise the Python exception. This macro should always be called after setting a Python error in code snippets, such as typemaps and %exception , that are ultimately generated into the wrapper function.

    The language-independent exception.i library file can also be used to raise exceptions. See the SWIG Library chapter.

    32.6.5 Optimization options

    32.6.5.1 -fastproxy

    The -fastproxy command line option enables faster method calling as the call is made directly into the C/C++ layer rather than going through a method wrapper.

    Consider wrapping a C++ class:

    struct Go {
      void callme0() {}
      void callme4(int a, int b, int c, int d) {}
      void callme8(double a, double b, double c, double d, double e, double f, double g, double i) {}
    };
    

    The default generated proxy class is:

    class Go(object):
        def callme0(self):
            return _example.Go_callme0(self)
    
        def callme4(self, a, b, c, d):
            return _example.Go_callme4(self, a, b, c, d)
    
        def callme8(self, a, b, c, d, e, f, g, i):
            return _example.Go_callme8(self, a, b, c, d, e, f, g, i)
        ...
    

    Each method in the Python class contains a Python proxy method which passes the arguments on to the underlying function in the low-level C/C++ module (_example in this case). The generated proxy class when using -fastproxy is:

    %module example
    class Go(object):
        callme0 = _swig_new_instance_method(_example.Go_callme0)
        callme4 = _swig_new_instance_method(_example.Go_callme4)
        callme8 = _swig_new_instance_method(_example.Go_callme8)
        ...
    

    where _swig_new_instance_method adds the method to the proxy class via C API calls for direct access to the underlying function in the low-level C/C++ module. Note that for some methods it is not possible to generate the direct access call and so -fastproxy is ignored. This happens, for example, when adding additional code to Python proxy methods, such as using %pythonprepend.

    The overhead calling into C/C++ from Python is reduced slightly using -fastproxy. Below are some timings in microseconds calling the 3 functions in the example above. Also included in the table for comparison is using the -builtin option covered in the Built-in Types.

    Method nameDefault-fastproxy-builtin
    callme00.150.090.07
    callme40.260.160.14
    callme80.320.200.17

    Although the -fastproxy option results in faster code over the default, the generated proxy code is not as user-friendly as docstring/doxygen comments and functions with default values are not visible in the generated Python proxy class. The -olddefs option can rectify this.

    The generated proxy class for the example above when using -fastproxy -olddefs is:

    class Go(object):
        def callme0(self):
            return _example.Go_callme0(self)
        callme0 = _swig_new_instance_method(_example.Go_callme0)
    
        def callme4(self, a, b, c, d):
            return _example.Go_callme4(self, a, b, c, d)
        callme4 = _swig_new_instance_method(_example.Go_callme4)
    
        def callme8(self, a, b, c, d, e, f, g, i):
            return _example.Go_callme8(self, a, b, c, d, e, f, g, i)
        callme8 = _swig_new_instance_method(_example.Go_callme8)
        ...
    

    The class defines each method in two different ways. The first definition is replaced by the second definition and so the second definition is the one used when the method is called. While this possibly provides the best of both worlds, the time to import the module will be slightly slower when the class is defined due to the additional method definitions.

    The command line options mentioned above also apply to wrapped C/C++ global functions, not just class methods.

    32.7 Tips and techniques

    Although SWIG is largely automatic, there are certain types of wrapping problems that require additional user input. Examples include dealing with output parameters, strings, binary data, and arrays. This chapter discusses the common techniques for solving these problems.

    32.7.1 Input and output parameters

    A common problem in some C programs is handling parameters passed as simple pointers. For example:

    void add(int x, int y, int *result) {
      *result = x + y;
    }
    

    or perhaps

    int sub(int *x, int *y) {
      return *x-*y;
    }
    

    The easiest way to handle these situations is to use the typemaps.i file. For example:

    %module example
    %include "typemaps.i"
    
    void add(int, int, int *OUTPUT);
    int  sub(int *INPUT, int *INPUT);
    

    In Python, this allows you to pass simple values. For example:

    >>> a = add(3, 4)
    >>> print a
    7
    >>> b = sub(7, 4)
    >>> print b
    3
    >>>
    

    Notice how the INPUT parameters allow integer values to be passed instead of pointers and how the OUTPUT parameter creates a return result.

    If you don't want to use the names INPUT or OUTPUT , use the %apply directive. For example:

    %module example
    %include "typemaps.i"
    
    %apply int *OUTPUT { int *result };
    %apply int *INPUT  { int *x, int *y};
    
    void add(int x, int y, int *result);
    int  sub(int *x, int *y);
    

    If a function mutates one of its parameters like this,

    void negate(int *x) {
      *x = -(*x);
    }
    

    you can use INOUT like this:

    %include "typemaps.i"
    ...
    void negate(int *INOUT);
    

    In Python, a mutated parameter shows up as a return value. For example:

    >>> a = negate(3)
    >>> print a
    -3
    >>>
    

    Note: Since most primitive Python objects are immutable, it is not possible to perform in-place modification of a Python object passed as a parameter.

    The most common use of these special typemap rules is to handle functions that return more than one value. For example, sometimes a function returns a result as well as a special error code:

    /* send message, return number of bytes sent, along with success code */
    int send_message(char *text, int len, int *success);
    

    To wrap such a function, simply use the OUTPUT rule above. For example:

    %module example
    %include "typemaps.i"
    %apply int *OUTPUT { int *success };
    ...
    int send_message(char *text, int *success);
    

    When used in Python, the function will return multiple values.

    bytes, success = send_message("Hello World")
    if not success:
        print "Whoa!"
    else:
        print "Sent", bytes
    

    Another common use of multiple return values are in query functions. For example:

    void get_dimensions(Matrix *m, int *rows, int *columns);
    

    To wrap this, you might use the following:

    %module example
    %include "typemaps.i"
    %apply int *OUTPUT { int *rows, int *columns };
    ...
    void get_dimensions(Matrix *m, int *rows, *columns);
    

    Now, in Python:

    >>> r, c = get_dimensions(m)
    

    Be aware that the primary purpose of the typemaps.i file is to support primitive datatypes. Writing a function like this

    void foo(Bar *OUTPUT);
    

    may not have the intended effect since typemaps.i does not define an OUTPUT rule for Bar.

    32.7.2 Simple pointers

    If you must work with simple pointers such as int * or double * and you don't want to use typemaps.i, consider using the cpointer.i library file. For example:

    %module example
    %include "cpointer.i"
    
    %inline %{
    extern void add(int x, int y, int *result);
    %}
    
    %pointer_functions(int, intp);
    

    The %pointer_functions(type, name) macro generates five helper functions that can be used to create, destroy, copy, assign, and dereference a pointer. In this case, the functions are as follows:

    int  *new_intp();
    int  *copy_intp(int *x);
    void  delete_intp(int *x);
    void  intp_assign(int *x, int value);
    int   intp_value(int *x);
    

    In Python, you would use the functions like this:

    >>> result = new_intp()
    >>> print result
    _108fea8_p_int
    >>> add(3, 4, result)
    >>> print intp_value(result)
    7
    >>>
    

    If you replace %pointer_functions() by %pointer_class(type, name), the interface is more class-like.

    >>> result = intp()
    >>> add(3, 4, result)
    >>> print result.value()
    7
    

    See the SWIG Library chapter for further details.

    32.7.3 Unbounded C Arrays

    Sometimes a C function expects an array to be passed as a pointer. For example,

    int sumitems(int *first, int nitems) {
      int i, sum = 0;
      for (i = 0; i < nitems; i++) {
        sum += first[i];
      }
      return sum;
    }
    

    To wrap this into Python, you need to pass an array pointer as the first argument. A simple way to do this is to use the carrays.i library file. For example:

    %include "carrays.i"
    %array_class(int, intArray);
    

    The %array_class(type, name) macro creates wrappers for an unbounded array object that can be passed around as a simple pointer like int * or double *. For instance, you will be able to do this in Python:

    >>> a = intArray(10000000)         # Array of 10-million integers
    >>> for i in xrange(10000):        # Set some values
    ...     a[i] = i
    >>> sumitems(a, 10000)
    49995000
    >>>
    

    The array "object" created by %array_class() does not encapsulate pointers inside a special array object. In fact, there is no bounds checking or safety of any kind (just like in C). Because of this, the arrays created by this library are extremely low-level indeed. You can't iterate over them nor can you even query their length. In fact, any valid memory address can be accessed if you want (negative indices, indices beyond the end of the array, etc.). Needless to say, this approach is not going to suit all applications. On the other hand, this low-level approach is extremely efficient and well suited for applications in which you need to create buffers, package binary data, etc.

    32.7.4 String handling

    If a C function has an argument of char *, then a Python string can be passed as input. For example:

    // C
    void foo(char *s);
    
    # Python
    >>> foo("Hello")
    

    When a Python string is passed as a parameter, the C function receives a pointer to the raw data contained in the string. Since Python strings are immutable, it is illegal for your program to change the value. In fact, doing so will probably crash the Python interpreter.

    If your program modifies the input parameter or uses it to return data, consider using the cstring.i library file described in the SWIG Library chapter.

    When functions return a char *, it is assumed to be a NULL-terminated string. Data is copied into a new Python string and returned.

    If your program needs to work with binary data, you can use a typemap to expand a Python string into a pointer/length argument pair. As luck would have it, just such a typemap is already defined. Just do this:

    %apply (char *STRING, int LENGTH) { (char *data, int size) };
    ...
    int parity(char *data, int size, int initial);
    

    Now in Python:

    >>> parity("e\x09ffss\x00\x00\x01\nx", 0)
    

    If you need to return binary data, you might use the cstring.i library file. The cdata.i library can also be used to extra binary data from arbitrary pointers.

    32.7.5 Default arguments

    C++ default argument code generation is documented in the main Default arguments section. There is also an optional Python specific feature that can be used called the python:cdefaultargs feature flag. By default, SWIG attempts to convert C++ default argument values into Python values and generates code into the Python layer containing these values. For example:

    struct CDA {
      int fff(int a = 1, bool b = false);
    };
    

    From Python this can be called as follows:

    >>> CDA().fff()        # C++ layer receives a=1 and b=false
    >>> CDA().fff(2)       # C++ layer receives a=2 and b=false
    >>> CDA().fff(3, True) # C++ layer receives a=3 and b=true
    

    The default code generation in the Python layer is:

    class CDA(object):
        ...
        def fff(self, a=1, b=False):
            return _default_args.CDA_fff(self, a, b)
    

    Adding the feature:

    %feature("python:cdefaultargs") CDA::fff;
    struct CDA {
      int fff(int a = 1, bool b = false);
    

    results in identical behaviour when called from Python, however, it results in different code generation:

    class CDA(object):
        ...
        def fff(self, *args):
            return _default_args.CDA_fff(self, *args)
    

    The default arguments are obtained in the C++ wrapper layer instead of the Python layer. Some code generation modes are quite different, eg -builtin and -fastproxy, and are unaffected by python:cdefaultargs as the default values are always obtained from the C++ layer.

    Note that not all default arguments can be converted into a Python equivalent. When SWIG does not convert them, it will generate code to obtain them from the C++ layer as if python:cdefaultargs was specified. This will happen if just one argument cannot be converted into a Python equivalent. This occurs typically when the argument is not fully numeric, such as int(1):

    struct CDA {
      int fff(int a = int(1), bool b = false);
    };
    

    Compatibility Note: SWIG-3.0.6 introduced the python:cdefaultargs feature. Versions of SWIG prior to this varied in their ability to convert C++ default values into equivalent Python default argument values.

    32.8 Typemaps

    This section describes how you can modify SWIG's default wrapping behavior for various C/C++ datatypes using the %typemap directive. This is an advanced topic that assumes familiarity with the Python C API as well as the material in the " Typemaps" chapter.

    Before proceeding, it should be stressed that typemaps are not a required part of using SWIG---the default wrapping behavior is enough in most cases. Typemaps are only used if you want to change some aspect of the primitive C-Python interface or if you want to elevate your guru status.

    32.8.1 What is a typemap?

    A typemap is nothing more than a code generation rule that is attached to a specific C datatype. For example, to convert integers from Python to C, you might define a typemap like this:

    %module example
    
    %typemap(in) int {
      $1 = (int) PyLong_AsLong($input);
      printf("Received an integer : %d\n", $1);
    }
    %inline %{
    extern int fact(int n);
    %}
    

    Typemaps are always associated with some specific aspect of code generation. In this case, the "in" method refers to the conversion of input arguments to C/C++. The datatype int is the datatype to which the typemap will be applied. The supplied C code is used to convert values. In this code a number of special variable prefaced by a $ are used. The $1 variable is placeholder for a local variable of type int. The $input variable is the input object of type PyObject *.

    When this example is compiled into a Python module, it operates as follows:

    >>> from example import *
    >>> fact(6)
    Received an integer : 6
    720
    

    In this example, the typemap is applied to all occurrences of the int datatype. You can refine this by supplying an optional parameter name. For example:

    %module example
    
    %typemap(in) int nonnegative {
      $1 = (int) PyLong_AsLong($input);
      if ($1 < 0) {
        PyErr_SetString(PyExc_ValueError, "Expected a nonnegative value.");
        SWIG_fail;
      }
    }
    %inline %{
    extern int fact(int nonnegative);
    %}
    

    In this case, the typemap code is only attached to arguments that exactly match int nonnegative.

    The application of a typemap to specific datatypes and argument names involves more than simple text-matching--typemaps are fully integrated into the SWIG C++ type-system. When you define a typemap for int, that typemap applies to int and qualified variations such as const int. In addition, the typemap system follows typedef declarations. For example:

    %typemap(in) int n {
      $1 = (int) PyLong_AsLong($input);
      printf("n = %d\n", $1);
    }
    %inline %{
    typedef int Integer;
    extern int fact(Integer n);    // Above typemap is applied
    %}
    

    Typemaps can also be defined for groups of consecutive arguments. For example:

    %typemap(in) (char *str, int len) {
      $1 = PyString_AsString($input);
      $2 = PyString_Size($input);
    };
    
    int count(char c, char *str, int len);
    

    When a multi-argument typemap is defined, the arguments are always handled as a single Python object. This allows the function to be used like this (notice how the length parameter is omitted):

    >>> example.count('e', 'Hello World')
    1
    >>>
    

    32.8.2 Python typemaps

    The previous section illustrated an "in" typemap for converting Python objects to C. A variety of different typemap methods are defined by the Python module. For example, to convert a C integer back into a Python object, you might define an "out" typemap like this:

    %typemap(out) int {
        $result = PyInt_FromLong((long) $1);
    }
    

    A detailed list of available methods can be found in the " Typemaps" chapter.

    However, the best source of typemap information (and examples) is probably the Python module itself. In fact, all of SWIG's default type handling is defined by typemaps. You can view these typemaps by looking at the files in the SWIG library. Just take into account that in the latest versions of swig (1.3.22+), the library files are not very pristine clear for the casual reader, as they used to be. The extensive use of macros and other ugly techniques in the latest version produce a very powerful and consistent Python typemap library, but at the cost of simplicity and pedagogic value.

    To learn how to write a simple or your first typemap, you better take a look at the SWIG library version 1.3.20 or so.

    32.8.3 Typemap variables

    Within typemap code, a number of special variables prefaced with a $ may appear. A full list of variables can be found in the " Typemaps" chapter. This is a list of the most common variables:

    $1

    A C local variable corresponding to the actual type specified in the %typemap directive. For input values, this is a C local variable that's supposed to hold an argument value. For output values, this is the raw result that's supposed to be returned to Python.

    $input

    A PyObject * holding a raw Python object with an argument or variable value.

    $result

    A PyObject * that holds the result to be returned to Python.

    $1_name

    The parameter name that was matched.

    $1_type

    The actual C datatype matched by the typemap.

    $1_ltype

    An assignable version of the datatype matched by the typemap (a type that can appear on the left-hand-side of a C assignment operation). This type is stripped of qualifiers and may be an altered version of $1_type. All arguments and local variables in wrapper functions are declared using this type so that their values can be properly assigned.

    $symname

    The Python name of the wrapper function being created.

    32.8.4 Useful Python Functions

    When you write a typemap, you usually have to work directly with Python objects. The following functions may prove to be useful.

    Python Integer Functions

    PyObject *PyInt_FromLong(long l);
    long      PyInt_AsLong(PyObject *);
    int       PyInt_Check(PyObject *);
    

    Python Floating Point Functions

    PyObject *PyFloat_FromDouble(double);
    double    PyFloat_AsDouble(PyObject *);
    int       PyFloat_Check(PyObject *);
    

    Python String Functions

    PyObject *PyString_FromString(char *);
    PyObject *PyString_FromStringAndSize(char *, lint len);
    int       PyString_Size(PyObject *);
    char     *PyString_AsString(PyObject *);
    int       PyString_Check(PyObject *);
    

    Python List Functions

    PyObject *PyList_New(int size);
    int       PyList_Size(PyObject *list);
    PyObject *PyList_GetItem(PyObject *list, int i);
    int       PyList_SetItem(PyObject *list, int i, PyObject *item);
    int       PyList_Insert(PyObject *list, int i, PyObject *item);
    int       PyList_Append(PyObject *list, PyObject *item);
    PyObject *PyList_GetSlice(PyObject *list, int i, int j);
    int       PyList_SetSlice(PyObject *list, int i, int , PyObject *list2);
    int       PyList_Sort(PyObject *list);
    int       PyList_Reverse(PyObject *list);
    PyObject *PyList_AsTuple(PyObject *list);
    int       PyList_Check(PyObject *);
    

    Python Tuple Functions

    PyObject *PyTuple_New(int size);
    int       PyTuple_Size(PyObject *);
    PyObject *PyTuple_GetItem(PyObject *, int i);
    int       PyTuple_SetItem(PyObject *, int i, PyObject *item);
    PyObject *PyTuple_GetSlice(PyObject *t, int i, int j);
    int       PyTuple_Check(PyObject *);
    

    Python Dictionary Functions

    PyObject *PyDict_New();
    int       PyDict_Check(PyObject *);
    int       PyDict_SetItem(PyObject *p, PyObject *key, PyObject *val);
    int       PyDict_SetItemString(PyObject *p, const char *key, PyObject *val);
    int       PyDict_DelItem(PyObject *p, PyObject *key);
    int       PyDict_DelItemString(PyObject *p, char *key);
    PyObject* PyDict_Keys(PyObject *p);
    PyObject* PyDict_Values(PyObject *p);
    PyObject* PyDict_GetItem(PyObject *p, PyObject *key);
    PyObject* PyDict_GetItemString(PyObject *p, const char *key);
    int       PyDict_Next(PyObject *p, Py_ssize_t *ppos, PyObject **pkey, PyObject **pvalue);
    Py_ssize_t PyDict_Size(PyObject *p);
    int       PyDict_Update(PyObject *a, PyObject *b);
    int       PyDict_Merge(PyObject *a, PyObject *b, int override);
    PyObject* PyDict_Items(PyObject *p);
    

    Python File Conversion Functions

    PyObject *PyFile_FromFile(FILE *f);
    FILE     *PyFile_AsFile(PyObject *);
    int       PyFile_Check(PyObject *);
    

    Abstract Object Interface

    write me
    

    32.9 Typemap Examples

    This section includes a few examples of typemaps. For more examples, you might look at the files "python.swg" and "typemaps.i " in the SWIG library.

    32.9.1 Converting Python list to a char **

    A common problem in many C programs is the processing of command line arguments, which are usually passed in an array of NULL terminated strings. The following SWIG interface file allows a Python list object to be used as a char ** object.

    %module argv
    
    // This tells SWIG to treat char ** as a special case
    %typemap(in) char ** {
      /* Check if is a list */
      if (PyList_Check($input)) {
        int size = PyList_Size($input);
        int i = 0;
        $1 = (char **) malloc((size+1)*sizeof(char *));
        for (i = 0; i < size; i++) {
          PyObject *o = PyList_GetItem($input, i);
          if (PyString_Check(o)) {
            $1[i] = PyString_AsString(PyList_GetItem($input, i));
          } else {
            free($1);
            PyErr_SetString(PyExc_TypeError, "list must contain strings");
            SWIG_fail;
          }
        }
        $1[i] = 0;
      } else {
        PyErr_SetString(PyExc_TypeError, "not a list");
        SWIG_fail;
      }
    }
    
    // This cleans up the char ** array we malloc'd before the function call
    %typemap(freearg) char ** {
      free((char *) $1);
    }
    
    // Now a test function
    %inline %{
    int print_args(char **argv) {
      int i = 0;
      while (argv[i]) {
        printf("argv[%d] = %s\n", i, argv[i]);
        i++;
      }
      return i;
    }
    %}
    
    

    When this module is compiled, the wrapped C function now operates as follows :

    >>> from argv import *
    >>> print_args(["Dave", "Mike", "Mary", "Jane", "John"])
    argv[0] = Dave
    argv[1] = Mike
    argv[2] = Mary
    argv[3] = Jane
    argv[4] = John
    5
    

    In the example, two different typemaps are used. The "in" typemap is used to receive an input argument and convert it to a C array. Since dynamic memory allocation is used to allocate memory for the array, the "freearg" typemap is used to later release this memory after the execution of the C function.

    32.9.2 Expanding a Python object into multiple arguments

    Suppose that you had a collection of C functions with arguments such as the following:

    int foo(int argc, char **argv);
    

    In the previous example, a typemap was written to pass a Python list as the char **argv. This allows the function to be used from Python as follows:

    >>> foo(4, ["foo", "bar", "spam", "1"])
    

    Although this works, it's a little awkward to specify the argument count. To fix this, a multi-argument typemap can be defined. This is not very difficult--you only have to make slight modifications to the previous example:

    %typemap(in) (int argc, char **argv) {
      /* Check if is a list */
      if (PyList_Check($input)) {
        int i;
        $1 = PyList_Size($input);
        $2 = (char **) malloc(($1+1)*sizeof(char *));
        for (i = 0; i < $1; i++) {
          PyObject *o = PyList_GetItem($input, i);
          if (PyString_Check(o)) {
            $2[i] = PyString_AsString(PyList_GetItem($input, i));
          } else {
            free($2);
            PyErr_SetString(PyExc_TypeError, "list must contain strings");
            SWIG_fail;
          }
        }
        $2[i] = 0;
      } else {
        PyErr_SetString(PyExc_TypeError, "not a list");
        SWIG_fail;
      }
    }
    
    %typemap(freearg) (int argc, char **argv) {
      free((char *) $2);
    }
    

    When writing a multiple-argument typemap, each of the types is referenced by a variable such as $1 or $2. The typemap code simply fills in the appropriate values from the supplied Python object.

    With the above typemap in place, you will find it no longer necessary to supply the argument count. This is automatically set by the typemap code. For example:

    >>> foo(["foo", "bar", "spam", "1"])
    

    If your function is overloaded in C++, for example:

    int foo(int argc, char **argv);
    int foo();
    

    don't forget to also provide a suitable typecheck typemap for overloading such as:

    %typecheck(SWIG_TYPECHECK_STRING_ARRAY) (int argc, char **argv) {
      $1 = PyList_Check($input) ? 1 : 0;
    }
    

    If you don't you'll get an error message along the lines of:

    Traceback (most recent call last):
      File "runme.py", line 3, in >module<
        example.foo(["foo", "bar", "spam", "1"])
    TypeError: Wrong number or type of arguments for overloaded function 'foo'.
      Possible C/C++ prototypes are:
        foo(int, char **)
        foo()
    

    32.9.3 Using typemaps to return arguments

    A common problem in some C programs is that values may be returned in arguments rather than in the return value of a function. For example:

    /* Returns a status value and two values in out1 and out2 */
    int spam(double a, double b, double *out1, double *out2) {
      ... Do a bunch of stuff ...
      *out1 = result1;
      *out2 = result2;
      return status;
    }
    

    A typemap can be used to handle this case as follows :

    %module outarg
    
    // This tells SWIG to treat an double * argument with name 'OutValue' as
    // an output value.  We'll append the value to the current result which
    // is guaranteed to be a List object by SWIG.
    
    %typemap(argout) double *OutValue {
      PyObject *o, *o2, *o3;
      o = PyFloat_FromDouble(*$1);
      if ((!$result) || ($result == Py_None)) {
        $result = o;
      } else {
        if (!PyTuple_Check($result)) {
          PyObject *o2 = $result;
          $result = PyTuple_New(1);
          PyTuple_SetItem($result, 0, o2);
        }
        o3 = PyTuple_New(1);
        PyTuple_SetItem(o3, 0, o);
        o2 = $result;
        $result = PySequence_Concat(o2, o3);
        Py_DECREF(o2);
        Py_DECREF(o3);
      }
    }
    
    int spam(double a, double b, double *OutValue, double *OutValue);
    
    

    The typemap works as follows. First, a check is made to see if any previous result exists. If so, it is turned into a tuple and the new output value is concatenated to it. Otherwise, the result is returned normally. For the sample function spam(), there are three output values--meaning that the function will return a 3-tuple of the results.

    As written, the function must accept 4 arguments as input values, last two being pointers to doubles. If these arguments are only used to hold output values (and have no meaningful input value), an additional typemap can be written. For example:

    %typemap(in, numinputs=0) double *OutValue(double temp) {
      $1 = &temp;
    }
    
    

    By specifying numinputs=0, the input value is ignored. However, since the argument still has to be set to some meaningful value before calling C, it is set to point to a local variable temp. When the function stores its output value, it will simply be placed in this local variable. As a result, the function can now be used as follows:

    >>> a = spam(4, 5)
    >>> print a
    (0, 2.45, 5.0)
    >>> x, y, z = spam(4, 5)
    >>>
    

    32.9.4 Mapping Python tuples into small arrays

    In some applications, it is sometimes desirable to pass small arrays of numbers as arguments. For example :

    extern void set_direction(double a[4]);       // Set direction vector
    

    This too, can be handled used typemaps as follows :

    // Grab a 4 element array as a Python 4-tuple
    %typemap(in) double[4](double temp[4]) {   // temp[4] becomes a local variable
      int i;
      if (PyTuple_Check($input)) {
        if (!PyArg_ParseTuple($input, "dddd", temp, temp+1, temp+2, temp+3)) {
          PyErr_SetString(PyExc_TypeError, "tuple must have 4 elements");
          SWIG_fail;
        }
        $1 = &temp[0];
      } else {
        PyErr_SetString(PyExc_TypeError, "expected a tuple.");
        SWIG_fail;
      }
    }
    
    

    This allows our set_direction function to be called from Python as follows :

    >>> set_direction((0.5, 0.0, 1.0, -0.25))
    

    Since our mapping copies the contents of a Python tuple into a C array, such an approach would not be recommended for huge arrays, but for small structures, this approach works fine.

    32.9.5 Mapping sequences to C arrays

    Suppose that you wanted to generalize the previous example to handle C arrays of different sizes. To do this, you might write a typemap as follows:

    // Map a Python sequence into any sized C double array
    %typemap(in) double[ANY](double temp[$1_dim0]) {
      int i;
      if (!PySequence_Check($input)) {
        PyErr_SetString(PyExc_TypeError, "Expecting a sequence");
        SWIG_fail;
      }
      if (PyObject_Length($input) != $1_dim0) {
        PyErr_SetString(PyExc_ValueError, "Expecting a sequence with $1_dim0 elements");
        SWIG_fail;
      }
      for (i =0; i < $1_dim0; i++) {
        PyObject *o = PySequence_GetItem($input, i);
        if (!PyFloat_Check(o)) {
          Py_XDECREF(o);
          PyErr_SetString(PyExc_ValueError, "Expecting a sequence of floats");
          SWIG_fail;
        }
        temp[i] = PyFloat_AsDouble(o);
        Py_DECREF(o);
      }
      $1 = &temp[0];
    }
    

    In this case, the variable $1_dim0 is expanded to match the array dimensions actually used in the C code. This allows the typemap to be applied to types such as:

    void foo(double x[10]);
    void bar(double a[4], double b[8]);
    

    Since the above typemap code gets inserted into every wrapper function where used, it might make sense to use a helper function instead. This will greatly reduce the amount of wrapper code. For example:

    %{
    static int convert_darray(PyObject *input, double *ptr, int size) {
      int i;
      if (!PySequence_Check(input)) {
        PyErr_SetString(PyExc_TypeError, "Expecting a sequence");
        return 0;
      }
      if (PyObject_Length(input) != size) {
        PyErr_SetString(PyExc_ValueError, "Sequence size mismatch");
        return 0;
      }
      for (i =0; i < size; i++) {
        PyObject *o = PySequence_GetItem(input, i);
        if (!PyFloat_Check(o)) {
          Py_XDECREF(o);
          PyErr_SetString(PyExc_ValueError, "Expecting a sequence of floats");
          return 0;
        }
        ptr[i] = PyFloat_AsDouble(o);
        Py_DECREF(o);
      }
      return 1;
    }
    %}
    
    %typemap(in) double [ANY](double temp[$1_dim0]) {
      if (!convert_darray($input, temp, $1_dim0)) {
        SWIG_fail;
      }
      $1 = &temp[0];
    }
    

    32.9.6 Pointer handling

    Occasionally, it might be necessary to convert pointer values that have been stored using the SWIG typed-pointer representation. Since there are several ways in which pointers can be represented, the following two functions are used to safely perform this conversion:

    int SWIG_ConvertPtr(PyObject *obj, void **ptr, swig_type_info *ty, int flags)

    Converts a Python object obj to a C pointer. The result of the conversion is placed into the pointer located at ptr. ty is a SWIG type descriptor structure. flags is used to handle error checking and other aspects of conversion. It is the bitwise-or of several flag values including SWIG_POINTER_EXCEPTION and SWIG_POINTER_DISOWN . The first flag makes the function raise an exception on type error. The second flag additionally steals ownership of an object. Returns 0 on success and -1 on error.

    PyObject *SWIG_NewPointerObj(void *ptr, swig_type_info *ty, int own)

    Creates a new Python pointer object. ptr is the pointer to convert, ty is the SWIG type descriptor structure that describes the type, and own is a flag that indicates whether or not Python should take ownership of the pointer.

    Both of these functions require the use of a special SWIG type-descriptor structure. This structure contains information about the mangled name of the datatype, type-equivalence information, as well as information about converting pointer values under C++ inheritance. For a type of Foo *, the type descriptor structure is usually accessed as follows:

    Foo *f;
    if (!SWIG_IsOK(SWIG_ConvertPtr($input, (void **) &f, SWIGTYPE_p_Foo, 0))) {
      SWIG_exception_fail(SWIG_TypeError, "in method '$symname', expecting type Foo");
    }
    
    PyObject *obj;
    obj = SWIG_NewPointerObj(f, SWIGTYPE_p_Foo, 0);
    

    In a typemap, the type descriptor should always be accessed using the special typemap variable $1_descriptor. For example:

    %typemap(in) Foo * {
      if (!SWIG_IsOK(SWIG_ConvertPtr($input, (void **) &$1, $1_descriptor, 0))) {
        SWIG_exception_fail(SWIG_TypeError, "in method '$symname', expecting type Foo");
      }
    }
    

    If necessary, the descriptor for any type can be obtained using the $descriptor() macro in a typemap. For example:

    %typemap(in) Foo * {
      if (!SWIG_IsOK(SWIG_ConvertPtr($input, (void **) &$1, $descriptor(Foo *), 0))) {
        SWIG_exception_fail(SWIG_TypeError, "in method '$symname', expecting type Foo");
      }
    }
    

    Although the pointer handling functions are primarily intended for manipulating low-level pointers, both functions are fully aware of Python proxy classes. Specifically, SWIG_ConvertPtr() will retrieve a pointer from any object that has a this attribute. In addition, SWIG_NewPointerObj() can automatically generate a proxy class object (if applicable).

    32.9.7 Memory management when returning references to member variables

    This example shows how to prevent premature garbage collection of objects when the underlying C++ class returns a pointer or reference to a member variable. The example is a direct equivalent to this Java equivalent.

    Consider the following C++ code:

    #include <iostream>
    struct Wheel {
      int size;
      Wheel(int sz = 0) : size(sz) {}
      ~Wheel() { std::cout << "~Wheel" << std::endl; }
    };
    
    class Bike {
      Wheel wheel;
    public:
      Bike(int val) : wheel(val) {}
      Wheel& getWheel() { return wheel; }
    };
    

    and the following usage from Python after running the code through SWIG:

    bike = Bike(10)
    wheel = bike.getWheel()
    print("wheel size: {}".format(wheel.size))
    
    del bike  # Allow bike to be garbage collected
    print("wheel size: {}".format(wheel.size))
    

    Don't be surprised that if the resulting output gives strange results such as...

    wheel size: 10
    ~Wheel
    wheel size: 135019664
    

    What has happened here is the garbage collector has collected the Bike instance as it doesn't think it is needed any more. The proxy instance, wheel, contains a reference to memory that was deleted when the Bike instance was collected. In order to prevent the garbage collector from collecting the Bike instance, a reference to the Bike must be added to the wheel instance.

    You can do this by adding the reference when the getWheel() method is called using one of three approaches:

    The easier, but less optimized, way is to use the %pythonappend directive (see Adding additional Python code ):

    %pythonappend getWheel %{
      # val is the Wheel proxy, self is the Bike instance
      val.__bike_reference = self
    %}
    

    The code gets appended to the Python code generated for the Bike::getWheel wrapper function, where we store the Bike proxy instance onto the Wheel proxy instance before it is returned to the caller as follows.

    class Bike(object):
        ...
        def getWheel(self):
            val = _example.Bike_getWheel(self)
    
            # val is the Wheel proxy, self is the Bike instance
            val.__bike_reference = self
    
            return val
    

    The second option, which performs better and is required if you use the -builtin option, is to set the reference in the CPython implementation:

    %extend Wheel {
    // A reference to the parent class is added to ensure the underlying C++
    // object is not deleted while the item is in use
    %typemap(ret) Wheel& getWheel {
      PyObject *bike_reference_string = SWIG_Python_str_FromChar("__bike_reference");
      PyObject_SetAttr($result, bike_reference_string, $self);
      Py_DecRef(bike_reference_string);
    }
    }
    

    The third approach, shown below, is an optimization of the above approach and creates the "__bike_reference" Python string object just once. While this looks more complex, it is just a small variation on the above typemap plus a support function bike_reference() in a fragment called bike_reference_function. The bike_reference_init typemap generates code into the "init" section for an initial call to bike_reference() when the module is initialized and is done to create the "__bike_reference" Python string singleton in a thread-safe manner.

    %fragment("bike_reference_init", "init") {
      // Thread-safe initialization - initialize during Python module initialization
      bike_reference();
    }
    
    %fragment("bike_reference_function", "header", fragment="bike_reference_init") {
    
    static PyObject *bike_reference() {
      static PyObject *bike_reference_string = SWIG_Python_str_FromChar("__bike_reference");
      return bike_reference_string;
    }
    
    }
    
    %extend Wheel {
    // A reference to the parent class is added to ensure the underlying C++
    // object is not deleted while the item is in use
    %typemap(ret, fragment="bike_reference_function") Wheel& getWheel %{
      PyObject_SetAttr($result, bike_reference(), $self);
    %}
    }
    

    32.10 Docstring Features

    Using docstrings in Python code is becoming more and more important and more tools are coming on the scene that take advantage of them, everything from full-blown documentation generators to class browsers and popup call-tips in Python-aware IDEs. Given the way that SWIG generates the proxy code by default, your users will normally get something like "function_name(*args)" in the popup calltip of their IDE which is next to useless when the real function prototype might be something like this:

    bool function_name(int x, int y, Foo* foo=NULL, Bar* bar=NULL);
    

    The features described in this section make it easy for you to add docstrings to your modules, functions and methods that can then be used by the various tools out there to make the programming experience of your users much simpler.

    32.10.1 Module docstring

    Python allows a docstring at the beginning of the .py file before any other statements, and it is typically used to give a general description of the entire module. SWIG supports this by setting an option of the %module directive. For example:

    %module(docstring="This is the example module's docstring") example
    

    When you have more than just a line or so then you can retain the easy readability of the %module directive by using a macro. For example:

    %define DOCSTRING
    "The `XmlResource` class allows program resources defining menus,
    layout of controls on a panel, etc. to be loaded from an XML file."
    %enddef
    
    %module(docstring=DOCSTRING) xrc
    

    32.10.2 %feature("autodoc")

    As alluded to above SWIG will generate all the function and method proxy wrappers with just "*args" (or "*args, **kwargs" if the -keyword option is used) for a parameter list and will then sort out the individual parameters in the C wrapper code. This is nice and simple for the wrapper code, but makes it difficult to be programmer and tool friendly as anyone looking at the .py file will not be able to find out anything about the parameters that the functions accept.

    But since SWIG does know everything about the function it is possible to generate a docstring containing the parameter types, names and default values. Since many of the docstring tools are adopting a standard of recognizing if the first thing in the docstring is a function prototype then using that instead of what they found from introspection, then life is good once more.

    SWIG's Python module provides support for the "autodoc" feature, which when attached to a node in the parse tree will cause a docstring to be generated that includes the name of the function, parameter names, default values if any, and return type if any. There are also four levels for autodoc controlled by the value given to the feature, %feature("autodoc", "level"). The four values for level are covered in the following sub-sections.

    32.10.2.1 %feature("autodoc", "0")

    When level "0" is used then the types of the parameters will not be included in the autodoc string. For example, given this function prototype:

    %feature("autodoc", "0");
    bool function_name(int x, int y, Foo* foo=NULL, Bar* bar=NULL);
    

    Then Python code like this will be generated:

    def function_name(*args, **kwargs):
        """function_name(x, y, foo=None, bar=None) -> bool"""
        ...
    

    32.10.2.2 %feature("autodoc", "1")

    When level "1" is used then the parameter types will be used in the autodoc string. In addition, an attempt is made to simplify the type name such that it makes more sense to the Python user. Pointer, reference and const info is removed if the associated type is has an associated Python type (%rename's are thus shown correctly). This works most of the time, otherwise a C/C++ type will be used. See the next section for the "docstring" feature for tweaking the docstrings to your liking. Given the example above, then turning on the parameter types with level "1" will result in Python code like this:

    def function_name(*args, **kwargs):
        """function_name(int x, int y, Foo foo=None, Bar bar=None) -> bool"""
        ...
    

    32.10.2.3 %feature("autodoc", "2")

    Level "2" results in the function prototype as per level "0". In addition, a line of documentation is generated for each parameter using numpydoc style. Using the previous example, the generated code will be:

    def function_name(*args, **kwargs):
        """
        function_name(x, y, foo=None, bar=None) -> bool
    
        Parameters
        ----------
        x: int
        y: int
        foo: Foo *
        bar: Bar *
    
        """
        ...
    

    Note that the documentation for each parameter is sourced from the "doc" typemap which by default shows the C/C++ type rather than the simplified Python type name described earlier for level "1". Typemaps can of course change the output for any particular type, for example the int x parameter:

    %feature("autodoc", "2");
    %typemap("doc") int x "$1_name (C++ type: $1_type) -- Input $1_name dimension"
    bool function_name(int x, int y, Foo* foo=NULL, Bar* bar=NULL);
    

    resulting in

    def function_name(*args, **kwargs):
        """
        function_name(x, y, foo=None, bar=None) -> bool
    
        Parameters
        ----------
        x (C++ type: int) -- Input x dimension
        y: int
        foo: Foo *
        bar: Bar *
    
        """
    

    32.10.2.4 %feature("autodoc", "3")

    Level "3" results in the function prototype as per level "1" but also contains the same additional line of documentation for each parameter as per level "2". Using our earlier example again, the generated code will be:

    def function_name(*args, **kwargs):
        """
        function_name(int x, int y, Foo foo=None, Bar bar=None) -> bool
    
        Parameters
        ----------
        x: int
        y: int
        foo: Foo *
        bar: Bar *
    
        """
        ...
    

    32.10.2.5 %feature("autodoc", "docstring")

    Finally, there are times when the automatically generated autodoc string will make no sense for a Python programmer, particularly when a typemap is involved. So if you give an explicit value for the autodoc feature then that string will be used in place of the automatically generated string. For example:

    %feature("autodoc", "GetPosition() -> (x, y)") GetPosition;
    void GetPosition(int* OUTPUT, int* OUTPUT);
    

    32.10.3 %feature("docstring")

    In addition to the autodoc strings described above, you can also attach any arbitrary descriptive text to a node in the parse tree with the "docstring" feature. When the proxy module is generated then any docstring associated with classes, function or methods are output. If an item already has an autodoc string then it is combined with the docstring and they are output together. If the docstring is all on a single line then it is output like this::

    """This is the docstring"""
    

    Otherwise, to aid readability it is output like this:

    """
    This is a multi-line docstring
    with more than one line.
    """
    

    32.11 Python Packages

    Python has concepts of modules and packages. Modules are separate units of code and may be grouped together to form a package. Packages may be nested, that is they may contain subpackages. This leads to tree-like hierarchy, with packages as intermediate nodes and modules as leaf nodes.

    The hierarchy of Python packages/modules follows the hierarchy of *.py files found in a source tree (or, more generally, in the Python path). Normally, the developer creates new module by placing a *.py file somewhere under Python path; the module is then named after that *.py file. A package is created by placing an __init__.py file within a directory; the package is then named after that directory. For example, the following source tree:

    mod1.py
    pkg1/__init__.py
    pkg1/mod2.py
    pkg1/pkg2/__init__.py
    pkg1/pkg2/mod3.py
    

    defines the following Python packages and modules:

    pkg1            # package
    pkg1.pkg2       # package
    mod1            # module
    pkg1.mod2       # module
    pkg1.pkg2.mod3  # module
    

    The purpose of an __init__.py file is two-fold. First, the existence of __init__.py in a directory informs the Python interpreter that this directory contains a Python package. Second, the code in __init__.py is loaded/executed automatically when the package is initialized (when it or its submodule/subpackage gets import'ed). By default, SWIG generates proxy Python code – one *.py file for each *.i interface. The __init__.py files, however, are not generated by SWIG. They should be created by other means. Both files (module *.py and __init__.py) should be installed in appropriate destination directories in order to obtain a desirable package/module hierarchy.

    Python3 adds another option for packages with PEP 0420 (implicit namespace packages). Implicit namespace packages no longer use __init__.py files. SWIG generated Python modules support implicit namespace packages. See Implicit namespace packages for more information.

    You can place a SWIG generated module into a Python package or keep as a global module, details are covered a little later in Location of modules.

    The way Python defines its modules and packages impacts SWIG users. Some users may need to use special features such as the package option in the %module directive or import related command line options. These are explained in the following sections.

    32.11.1 Setting the Python package

    Using the package option in the %module directive allows you to specify a Python package that the module will be in when installed.

    %module(package="wx") xrc
    

    This is useful when the .i file is %imported by another .i file. By default SWIG will assume that the importer is able to find the importee with just the module name, but if they live in separate Python packages then this won't work. However if the importee specifies what its package is with the %module option then the Python code generated for the importer will use that package name when importing the other module and in base class declarations, etc..

    SWIG assumes that the package option provided to %module together with the module name (that is, wx.xrc in the above example) forms a fully qualified (absolute) name of a module (in Python terms). This is important especially for Python 3, where absolute imports are used by default. It's up to you to place the generated module files (.py, .so) in appropriate subdirectories. For example, if you have an interface file foo.i with:

    %module(package="pkg1.pkg2") foo
    

    then the resulting directory layout should be

    pkg1/
    pkg1/__init__.py
    pkg1/pkg2/__init__.py
    pkg1/pkg2/foo.py        # (generated by SWIG)
    pkg1/pkg2/_foo.so       # (shared library built from C/C++ code generated by SWIG)
    

    32.11.2 Absolute and relative imports

    Suppose, we have the following hierarchy of files:

    pkg1/
    pkg1/__init__.py
    pkg1/mod2.py
    pkg1/pkg2/__init__.py
    pkg1/pkg2/mod3.py
    

    Let the contents of pkg1/pkg2/mod3.py be

    class M3: pass
    

    We edit pkg1/mod2.py and want to import module pkg1/pkg2/mod3.py in order to derive from class M3. We can write appropriate Python code in several ways, for example:

    1. Using "import <>" syntax with absolute package name:

      # pkg1/mod2.py
      import pkg1.pkg2.mod3
      class M2(pkg1.pkg2.mod3.M3): pass
      
    2. Using "import <>" syntax with package name relative to pkg1 (only in Python 2.7 and earlier):

      # pkg1/mod2.py
      import pkg2.mod3
      class M2(pkg2.mod3.M3): pass
      
    3. Using "from <> import <>" syntax (relative import syntax, only in Python 2.5 and later):

      # pkg1/mod2.py
      from .pkg2 import mod3
      class M2(mod3.M3): pass
      
    4. Other variants, for example the following construction in order to have the pkg2.mod3.M3 symbol available in mod2 as in point 2 above (but now under Python 3):

      # pkg1/mod2.py
      from . import pkg2
      from .pkg2 import mod3
      class M2(pkg2.mod3.M3): pass
      

    Now suppose we have mod2.i with

    // mod2.i
    %module (package="pkg1") mod2
    %import "mod3.i"
    // ...
    

    and mod3.i with

    // mod3.i
    %module (package="pkg1.pkg2") mod3
    // ...
    

    By default, SWIG will generate mod2.py proxy file with import directive as in point 1. This can be changed with the -relativeimport command line option. The -relativeimport instructs SWIG to organize imports as in point 4 for Python 2.7.0 and newer.

    Compatibility Note: Versions of SWIG prior to SWIG-4.0.0 supported Python < 2.7.0 and would organize the imports as in point 2 if an older version of Python was detected at runtime.

    In short, if you have mod2.i and mod3.i as above, then without -relativeimport SWIG will write

    import pkg1.pkg2.mod3
    

    to mod2.py proxy file, and with -relativeimport it will write

    from . import pkg2
    from .pkg2 import mod3
    

    You should avoid using relative imports and use absolute ones whenever possible. There are some cases, however, when relative imports may be necessary. The first example is, when some (legacy) Python code refers entities imported by proxy files generated by SWIG, and it assumes that the proxy file uses relative imports. Second case is, when one puts import directives in __init__.py to import symbols from submodules or subpackages and the submodule depends on other submodules (discussed later).

    32.11.3 Enforcing absolute import semantics

    As you may know, there is an incompatibility in import semantics (for the import <> syntax) between Python 2 and 3. In Python 2.4 and earlier it is not clear whether

    import foo
    

    refers to a top-level module or to another module inside the current package. In Python 3 it always refers to a top-level module (see PEP 328). To instruct Python 2.5 through 2.7 to use new semantics (that is import foo is interpreted as absolute import), one has to put the following line

    from __future__ import absolute_import
    

    at the very beginning of your proxy *.py file. In SWIG, it may be accomplished with %pythonbegin directive as follows:

    %pythonbegin %{
    from __future__ import absolute_import
    %}
    

    32.11.4 Importing from __init__.py

    Imports in __init__.py are handy when you want to populate a package's namespace with names imported from other modules. In SWIG based projects this approach may also be used to split large pieces of code into smaller modules, compile them in parallel and then re-assemble everything at runtime by importing submodules' contents in __init__.py, for example.

    Unfortunately import directives in __init__.py may cause problems, especially if they refer to a package's submodules. This is caused by the way Python initializes packages. If you spot problems with imports from __init__.py try using -relativeimport option. Below we explain in detail one issue, for which the -relativeimport workaround may be helpful.

    Consider the following example (Python 3):

    pkg1/__init__.py        # (empty)
    pkg1/pkg2/__init__.py   # (imports something from bar.py)
    pkg1/pkg2/foo.py
    pkg1/pkg2/bar.py        # (imports foo.py)
    

    If the file contents are:

    • pkg1/pkg2/__init__.py:

      # pkg1/pkg2/__init__.py
      from .bar import Bar
      
    • pkg1/pkg2/foo.py:

      # pkg1/pkg2/foo.py
      class Foo: pass
      
    • pkg1/pkg2/bar.py:

      # pkg1/pkg2/bar.py
      import pkg1.pkg2.foo
      class Bar(pkg1.pkg2.foo.Foo): pass
      

    Now if one simply used import pkg1.pkg2, it will usually fail:

    >>> import pkg1.pkg2
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "./pkg1/pkg2/__init__.py", line 2, in <module>
        from .bar import Bar
      File "./pkg1/pkg2/bar.py", line 3, in <module>
        class Bar(pkg1.pkg2.foo.Foo): pass
    AttributeError: 'module' object has no attribute 'pkg2'
    

    Surprisingly, if we execute the import pkg1.pkg2 directive for the second time, it succeeds. The reason seems to be following: when Python spots the from .bar import Bar directive in pkg1/pkg2/__init__.py it starts loading pkg1/pkg2/bar.py. This module imports pkg1.pkg2.foo in turn and tries to use pkg1.pkg2.foo.Foo, but the package pkg1 is not fully initialized yet (the initialization procedure is actually in progress) and it seems like the effect of the already seen import pkg1.pkg2.pkg3.foo is "delayed" or ignored. Exactly the same may happen to a proxy module generated by SWIG.

    One workaround for this case is to use a relative import in pkg1/pkg2/bar.py. If we change bar.py to be:

    from .pkg3 import foo
    class Bar(foo.Foo): pass
    

    or

    from . import pkg3
    from .pkg3 import foo
    class Bar(pkg3.foo.Foo): pass
    

    then the example works again. With SWIG, you need to enable the -relativeimport option in order to have the above workaround in effect (note, that the Python 2 case also needs the -relativeimport workaround).

    32.11.5 Implicit namespace packages

    Python 3.3 introduced PEP 0420 which implements implicit namespace packages. In a nutshell, implicit namespace packages remove the requirement of an __init__.py file and allow packages to be split across multiple PATH elements. For example:

    /fragment1/pkg1/mod1.py
    /fragment2/pkg1/mod2.py
    /fragment3/pkg1/mod3.py
    

    If PYTHONPATH is set to "/fragment1:/fragment2:/fragment3", then mod1, mod2 and mod3 will be part of pkg1. This allows for splitting of packages into separate pieces. This can be useful for SWIG generated wrappers in the following way.

    Suppose you create a SWIG wrapper for a module called robin. The SWIG generated code consists of two files robin.py and _robin.so. You wish to make these modules part of a subpackage (brave.sir). With implicit namespace packages you can place these files in the following configurations:

    Using PYTHONPATH="/some/path"

    /some/path/brave/sir/robin.py
    /some/path/brave/sir/_robin.so
    

    Using PYTHONPATH="/some/path:/some/other/path"

    /some/path/brave/sir/robin.py
    /some/other/path/brave/sir/_robin.so
    

    Finally suppose that your pure Python code is stored in a .zip file or some other way (database, web service connection, etc). Python can load the robin.py module using a custom importer. But the _robin.so module will need to be located on a file system. Implicit namespace packages make this possible. For example, using PYTHONPATH="/some/path/foo.zip:/some/other/path"

    Contents of foo.zip

    brave/
    brave/sir/
    brave/sir/robin.py
    

    File system contents

    /some/other/path/brave/sir/_robin.so
    

    Support for implicit namespace packages was added to python-3.3. The zipimporter requires python-3.5.1 or newer to work with subpackages.

    Compatibility Note: Support for implicit namespace packages was added in SWIG-3.0.9.

    32.11.6 Location of modules

    When SWIG creates wrappers from an interface file, say foo.i, two Python modules are created. There is a pure Python module (foo.py) and C/C++ code which is compiled and linked into a dynamically (or statically) loaded low-level module _foo (see the Preliminaries section for details). So, the interface file really defines two Python modules. How these two modules are loaded is covered next.

    The pure Python module needs to load the C/C++ module in order to call the wrapped C/C++ methods. To do this it must make some assumptions about the location of the C/C++ module. There are two configurations that are supported by default.

    1. Both modules in the same package

    2. Both modules are global

    Additional configurations are supported but require custom import code.

    The following sub-sections look more closely at the two default configurations as well as some customized configurations. An input interface file, foo.i, results in the two modules foo.py and _foo.so for each of the configurations.

    32.11.6.1 Both modules in the same package

    In this configuration, the pure Python module, foo.py, tries to load the C/C++ module, _foo, from the same package foo.py is located in. The package name is determined from the __package__ attribute if available, see PEP 366. Otherwise it is derived from the __name__ attribute given to foo.py by the Python loader that imported foo.py. The interface file for this configuration would contain:

    %module(package="mypackage") foo
    

    The location of the files could be as follows:

    /dir/mypackage/foo.py
    /dir/mypackage/__init__.py
    /dir/mypackage/_foo.so
    

    Assuming /dir/ is in PYTHONPATH, the module can be imported using

    from mypackage import foo
    

    32.11.6.2 Both modules are global

    In this configuration, there are no packages. If foo.py is not in a package, that is, it is a global module, then _foo is loaded as a global module. The interface file for this configuration would contain:

    %module foo
    

    The location of the files could be as follows:

    /dir/foo.py
    /dir/_foo.so
    

    Assuming /dir/ is in PYTHONPATH, the module can be imported using

    import foo
    

    32.11.6.3 Split modules custom configuration

    In this non-standard 'split module' configuration, the pure Python module is in a package and the low level C/C++ module is global. This configuration is not generally recommended and is not supported by default as it needs a custom configuration. The module import code customization required is via the moduleimport attribute in the %module directive. The next sub-section elaborates further on this. The interface file for this split module configuration would contain:

    %module(package="mypackage", moduleimport="import _foo") foo
    

    When using -builtin, use the following instead (the reasons are also covered shortly in the next sub-section):

    %module(package="mypackage", moduleimport="from _foo import *") foo
    

    The location of the files could be as follows:

    /dir/mypackage/foo.py
    /dir/mypackage/__init__.py
    /dir/_foo.so
    

    Assuming /dir/ is in PYTHONPATH, the module can be imported using

    from mypackage import foo
    

    Compatibility Note: Versions of SWIG prior to SWIG-4.0.0 supported split modules without the above customization. However, this had to be removed as the default import code often led to confusion due to obfuscation of genuine Python ImportError problems. Using one of the two default configurations is the recommended approach now.

    32.11.6.4 More on customizing the module import code

    The Python code implementing the default import logic is shown below. It supports the two configurations described earlier, that is, either both modules are in a package or loading both as global modules. The code is generated into the pure Python module, foo.py, and merely imports the low-level _foo module.

    if __package__ or '.' in __name__:
        from . import _foo
    else:
        import _foo
    

    This import code implementation is non-trivial but it can be replaced with custom code providing opportunities to make it simpler and/or more flexible. This is not normally recommended though unless you have a good understanding of the intricacies of importing Python modules. The custom code can be specified by setting the moduleimport option of the %module directive with the appropriate import code. For example:

    %module(moduleimport="import _foo") foo
    

    This will replace the default import logic above and generate the following into the pure Python module, foo.py:

    import _foo
    

    In fact the above is a simplification customization for the configuration where both modules are global; it removes the logic for also handling the modules being in a package.

    There is a special variable, $module, which is expanded into the low-level C/C++ module name, _foo in the case above. The identical output would be generated if instead the following had been used:

    %module(moduleimport="import $module") foo
    

    When you have many lines you can retain the easy readability of the %module directive by using a macro. For example:

    %define MODULEIMPORT
    "
    print 'Loading low-level module $module'
    import $module
    print 'Module has loaded'
    "
    %enddef
    
    %module(moduleimport=MODULEIMPORT) foo
    

    This will of course generate the following into the pure Python module:

    print 'Loading low-level module $module'
    import _foo
    print 'Module has loaded'
    

    When using the -builtin option, the link between the pure Python module and the low-level C/C++ module is slightly different as all the objects from the low-level module are imported directly into the pure Python module. The default import loading code is thus different:

    if __package__ or '.' in __name__:
        from ._foo import *
    else:
        from _foo import *
    

    Any customizations must import the code in a similar manner. The best way to support both with and without -builtin is to make use of the SWIGPYTHON_BUILTIN macro which is defined when -builtin is specified. The following will do this for the split modules case above.

    #if defined(SWIGPYTHON_BUILTIN) /* defined when using -builtin */
    %module(package="mypackage", moduleimport="from $module import *") foo
    #else
    %module(package="mypackage", moduleimport="import $module") foo
    #endif
    

    32.11.6.5 Statically linked C modules

    It is strongly recommended to use dynamically linked modules for the C portion of your pair of Python modules. If for some reason you still need to link the C module of the pair of Python modules generated by SWIG into your interpreter, then this section provides some details on how this impacts the pure Python modules ability to locate the other part of the pair. Please also see the Static Linking section.

    When Python is extended with C code the Python interpreter needs to be informed about details of the new C functions that have been linked into the executable. The code to do this is created by SWIG and is automatically called in the correct way when the module is dynamically loaded. However when the code is not dynamically loaded (because it is statically linked) Then the initialization method for the module created by SWIG is not called automatically and the Python interpreter has no idea that the new SWIG C module exists.

    Before Python 3, one could simply call the init method created by SWIG which would have normally been called when the shared object was dynamically loaded. The specific name of this method is not given here because statically linked modules are not encouraged with SWIG ( Static Linking). However one can find this init function in the C file generated by SWIG.

    If you are really keen on static linking there are two ways to initialize the SWIG generated C module with the init method. Which way you use depends on what version of Python your module is being linked with. Python 2 and Python 3 treat this init function differently. And the way they treat it affects how the pure Python module will be able to locate the C module.

    The details concerning this are covered completely in the documentation for Python itself. Links to the relevant sections follow:

    There are two keys things to understand. The first is that in Python 2 the init() function returns void. In Python 3 the init() function returns a PyObject * which points to the new module. Secondly, when you call the init() method manually, you are the Python importer. So, you determine which package the C module will be located in.

    So, if you are using Python 3 it is important that you follow what is described in the Python documentation linked above. In particular, you can't simply call the init() function generated by SWIG and cast the PyObject pointer it returns over the side. If you do then Python 3 will have no idea that your C module exists and the pure Python half of your wrapper will not be able to find it. You need to register your module with the Python interpreter as described in the Python docs.

    With Python 2 things are somewhat more simple. In this case the init() function returns void. Calling it will register your new C module as a global module. The pure Python part of the SWIG wrapper will be able to find it because it tries both the pure Python module it is part of and the global module. If you wish not to have the statically linked module be a global module then you will either need to refer to the Python documentation on how to do this (remember you are now the Python importer) or use dynamic linking.

    32.12 Python 3 Support

    SWIG is able to support Python 3.x. The wrapper code generated by SWIG can be compiled with both Python 2.x or 3.x. Further more, by passing the -py3 command line option to SWIG, wrapper code with some Python 3 specific features can be generated (see below subsections for details of these features).

    There is a list of known-to-be-broken features in Python 3:

    • No more support for FILE* typemaps, because PyFile_AsFile has been dropped in Python 3.
    • The -apply command line option is removed and generating code using apply() is no longer supported.

    The following are Python 3 new features that are currently supported by SWIG.

    32.12.1 Function annotation

    The -py3 option will enable function annotation support. When used SWIG is able to generate proxy method definitions like this:

      def foo(self, bar : "int"=0) -> "void" : ...
    

    Also, even if without passing SWIG the -py3 option, the parameter list still could be generated:

      def foo(self, bar=0): ...
    

    But for overloaded function or method, the parameter list would fallback to *args or self, *args, and **kwargs may be append depend on whether you enabled the keyword argument. This fallback is due to all overloaded functions share the same function in SWIG generated proxy class.

    For detailed usage of function annotation, see PEP 3107.

    32.12.2 Buffer interface

    SWIG has a series of typemaps to support buffer interfaces. These typemap macros are defined in pybuffer.i, which must be included in order to use them. By using these typemaps, your wrapped function will be able to accept any Python object that exposes a suitable buffer interface.

    For example, the get_path() function puts the path string into the memory pointed to by its argument:

    void get_path(char *s);
    

    Then you can write a typemap like this: (the following example is applied to both Python 2 and 3, since the bytearray type was backported to 2.6.

    %include <pybuffer.i>
    %pybuffer_mutable_string(char *str);
    void get_path(char *str);
    

    And then on the Python side the wrapped get_path could be used in this way:

    >>> p = bytearray(10)
    >>> get_path(p)
    >>> print(p)
    bytearray(b'/Foo/Bar/\x00')
    

    The macros defined in pybuffer.i are similar to those in cstring.i:

    %pybuffer_mutable_binary(parm, size_parm)

    The macro can be used to generate a typemap which maps a buffer of an object to a pointer provided by parm and a size argument provided by size_parm. For example:

    %pybuffer_mutable_binary(char *str, size_t size);
    ...
    int snprintf(char *str, size_t size, const char *format, ...);
    

    In Python:

    >>> buf = bytearray(6)
    >>> snprintf(buf, "Hello world!")
    >>> print(buf)
    bytearray(b'Hello\x00')
    >>>
    

    %pybuffer_mutable_string(parm)

    This typemap macro requires the buffer to be a zero terminated string, and maps the pointer of the buffer to parm. For example:

    %pybuffer_mutable_string(char *str);
    ...
    size_t make_upper(char *str);
    

    In Python:

    >>> buf = bytearray(b'foo\x00')
    >>> make_upper(buf)
    >>> print(buf)
    bytearray(b'FOO\x00')
    >>>
    

    Both %pybuffer_mutable_binary and %pybuffer_mutable_string require the provided buffer to be mutable, eg. they can accept a bytearray type but can't accept an immutable byte type.

    %pybuffer_binary(parm, size_parm)

    This macro maps an object's buffer to a pointer parm and a size size_parm. It is similar to %pybuffer_mutable_binary , except the %pybuffer_binary can accept both mutable and immutable buffers. As a result, the wrapped function should not modify the buffer.

    %pybuffer_string(parm)

    This macro maps an object's buffer as a string pointer parm . It is similar to %pybuffer_mutable_string but the buffer could be both mutable and immutable. And your function should not modify the buffer.

    32.12.3 Abstract base classes

    By including pyabc.i and using the -py3 command line option when calling SWIG, the proxy classes of the STL containers will automatically gain an appropriate abstract base class from the collections.abc module. For example, the following SWIG interface:

    %include <pyabc.i>
    %include <std_map.i>
    %include <std_list.i>
    
    namespace std {
      %template(Mapii) map<int, int>;
      %template(IntList) list<int>;
    }
    

    will generate a Python proxy class Mapii inheriting from collections.abc.MutableMap and a proxy class IntList inheriting from collections.abc.MutableSequence.

    pyabc.i also provides a macro %pythonabc that could be used to define an abstract base class for your own C++ class:

    %pythonabc(MySet, collections.abc.MutableSet);
    

    For details of abstract base class, please see PEP 3119.

    Compatibility Note: SWIG-4.0.0 changed the base classes to use the collections.abc module instead of collections due to the deprecation of the classes in the collections module in Python 3.7. The collections.abc module was introduced in Python 3.3 and hence this feature requires Python 3.3 or later.

    32.12.4 Byte string output conversion

    By default, any byte string (char* or std::string) returned from C or C++ code is decoded to text as UTF-8. This decoding uses the surrogateescape error handler under Python 3.1 or higher -- this error handler decodes invalid byte sequences to high surrogate characters in the range U+DC80 to U+DCFF. As an example, consider the following SWIG interface, which exposes a byte string that cannot be completely decoded as UTF-8:

    %module example
    
    %inline %{
    
    const char * non_utf8_c_str(void) {
      return "h\xe9llo w\xc3\xb6rld";
    }
    
    void instring(const char *s) {
      ...
    }
    
    %}
    

    Note that "\xe9" is an invalid UTF-8 encoding, but "\xc3\xb6" is valid. When this method is called from Python 3, the return value is the following text string:

    >>> s = example.non_utf8_c_str()
    >>> s
    'h\udce9llo wörld'
    

    Since the C string contains bytes that cannot be decoded as UTF-8, those raw bytes are represented as high surrogate characters that can be used to obtain the original byte sequence:

    >>> b = s.encode('utf-8', errors='surrogateescape')
    >>> b
    b'h\xe9llo w\xc3\xb6rld'
    

    One can then attempt a different encoding, if desired (or simply leave the byte string as a raw sequence of bytes for use in binary protocols):

    >>> b.decode('latin-1')
    'héllo wörld'
    

    Note, however, that text strings containing surrogate characters are rejected with the default strict codec error handler. For example:

    >>> with open('test', 'w') as f:
    ...     print(s, file=f)
    ...
    Traceback (most recent call last):
      File "<stdin>", line 2, in <module>
    UnicodeEncodeError: 'utf-8' codec can't encode character '\udce9' in position 1: surrogates not allowed
    

    This requires the user to check most strings returned by SWIG bindings, but the alternative is for a non-UTF8 byte string to be completely inaccessible in Python 3 code.

    For more details about the surrogateescape error handler, please see PEP 383 .

    When Python 3 strings are passed to the C/C++ layer, they are expected to be valid UTF8 Unicode strings too. For example, when the instring method above is wrapped and called, any invalid UTF8 Unicode code strings will result in a TypeError because the attempted conversion fails:

    >>> example.instring('h\xe9llo')
    >>> example.instring('h\udce9llo')
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: in method 'instring', argument 1 of type 'char const *'
    

    In some cases, users may wish to instead handle all byte strings as bytes objects in Python 3. This can be accomplished by adding SWIG_PYTHON_STRICT_BYTE_CHAR to the generated code:

    %module char_to_bytes
    %begin %{
    #define SWIG_PYTHON_STRICT_BYTE_CHAR
    %}
    
    char *charstring(char *s) {
      return s;
    }
    

    This will modify the behavior so that only Python 3 bytes objects will be accepted and converted to a C/C++ string, and any string returned from C/C++ will be converted to a bytes object in Python 3:

    >>> from char_to_bytes import *
    >>> charstring(b"hi") # Byte string
    b'hi'
    >>> charstring("hi")  # Unicode string
    Traceback (most recent call last):
      File "<stdin>", line 1, in ?
    TypeError: in method 'charstring', argument 1 of type 'char *'
    

    Note that in Python 2, defining SWIG_PYTHON_STRICT_BYTE_CHAR has no effect, since strings in Python 2 are equivalent to Python 3 bytes objects. However, there is a similar capability to force unicode-only handling for wide characters C/C++ strings (wchar_t * or std::wstring types) in Python 2. By default, in Python 2 both strings and unicode strings are converted to C/C++ wide strings, and returned wide strings are converted to a Python unicode string. To instead only convert unicode strings to wide strings, users can add SWIG_PYTHON_STRICT_UNICODE_WCHAR to the generated code:

    %module wchar_to_unicode
    %begin %{
    #define SWIG_PYTHON_STRICT_UNICODE_WCHAR
    %}
    
    wchar_t *wcharstring(wchar_t *s) {
      return s;
    }
    

    This ensures that only unicode strings are accepted by wcharstring in both Python 2 and Python 3:

    >>> from wchar_to_unicode import *
    >>> wcharstring(u"hi") # Unicode string
    u'hi'
    >>> wcharstring(b"hi") # Byte string
    Traceback (most recent call last):
      File "<stdin>", line 1, in ?
    TypeError: in method 'charstring', argument 1 of type 'wchar_t *'
    

    By defining both SWIG_PYTHON_STRICT_BYTE_CHAR and SWIG_PYTHON_STRICT_UNICODE_WCHAR, Python wrapper code can support overloads taking both std::string (as Python bytes) and std::wstring (as Python unicode).

    32.12.5 Python 2 Unicode

    A Python 3 string is a Unicode string so by default a Python 3 string that contains Unicode characters passed to C/C++ will be accepted and converted to a C/C++ string (char * or std::string types). A Python 2 string is not a unicode string by default and should a Unicode string be passed to C/C++ it will fail to convert to a C/C++ string (char * or std::string types). The Python 2 behavior can be made more like Python 3 by defining SWIG_PYTHON_2_UNICODE when compiling the generated C/C++ code. By default when the following is wrapped:

    %module unicode_strings
    char *charstring(char *s) {
      return s;
    }
    

    An error will occur when using Unicode strings in Python 2:

    >>> from unicode_strings import *
    >>> charstring("hi")
    'hi'
    >>> charstring(u"hi")
    Traceback (most recent call last):
      File "<stdin>", line 1, in ?
    TypeError: in method 'charstring', argument 1 of type 'char *'
    

    When the SWIG_PYTHON_2_UNICODE macro is added to the generated code:

    %module unicode_strings
    %begin %{
    #define SWIG_PYTHON_2_UNICODE
    %}
    
    char *charstring(char *s) {
      return s;
    }
    

    Unicode strings will be successfully accepted and converted from UTF-8, but note that they are returned as a normal Python 2 string:

    >>> from unicode_strings import *
    >>> charstring("hi")
    'hi'
    >>> charstring(u"hi")
    'hi'
    >>>
    

    Note that defining both SWIG_PYTHON_2_UNICODE and SWIG_PYTHON_STRICT_BYTE_CHAR at the same time is not allowed, since the first is allowing unicode conversion and the second is explicitly prohibiting it.

    32.13 Support for Multithreaded Applications

    By default, SWIG does not enable support for multithreaded Python applications. More specifically, the Python wrappers generated by SWIG will not release the Python's interpreter's Global Interpreter Lock (GIL) when wrapped C/C++ code is entered. Hence, while any of the wrapped C/C++ code is executing, the Python interpreter will not be able to run any other threads, even if the wrapped C/C++ code is waiting in a blocking call for something like network or disk IO. Fortunately, SWIG does have the ability to enable multithreaded support and automatic release of the GIL either for all wrapped code in a module or on a more selective basis. The user interface for this is described in the next section.

    32.13.1 UI for Enabling Multithreading Support

    The user interface is as follows:

    1. Module thread support can be enabled in two ways:

      • The -threads SWIG Python option at the command line (or in setup.py):

        $ swig -python -threads example.i
      • The threads module option in the *.i template file:

        %module("threads"=1)
    2. You can disable thread support for a given method:

      %feature("nothread") method;
      or
      %nothread method;
    3. You can partially disable thread support for a given method:

      • To disable the C++/Python thread protection:

        %feature("nothreadblock") method;
        or
        %nothreadblock method;
      • To disable the Python/C++ thread protection

        %feature("nothreadallow") method;
        or
        %nothreadallow method;

    32.13.2 Multithread Performance

    For the curious about performance, here are some numbers for the profiletest.i test, which is used to check the speed of the wrapped code:

    Thread ModeExecution Time (sec)Comment
    Single Threaded9.6no "-threads" option given
    Fully Multithreaded15.5"-threads" option = 'allow' + 'block'
    No Thread block12.2only 'allow'
    No Thread Allow13.6only block'

    Fully threaded code decreases the wrapping performance by around 60%. If that is important to your application, you can tune each method using the different 'nothread', 'nothreadblock' or 'nothreadallow' features as needed. Note that for some methods deactivating the 'thread block' or 'thread allow' code is not an option, so, be careful.


    33 SWIG and R

    R is a GPL'ed open source statistical and plotting environment. Information about R can be found at www.r-project.org.

    The R bindings are under active development. They have been used to compile and run an R interface to QuantLib running on Mandriva Linux with gcc. The R bindings also work on Microsoft Windows using Visual C++.

    33.1 Bugs

    Currently the following features are not implemented or broken:

    • Garbage collection of created objects
    • C Array wrappings

    33.2 Using R and SWIG

    To use R and SWIG in C mode, execute the following commands where example.c is the name of the file with the functions in them

    swig -r example.i
    R CMD SHLIB example_wrap.c example.c
    

    The corresponding options for C++ mode are

    swig -c++ -r -o example_wrap.cpp example.i
    R CMD SHLIB example_wrap.cpp example.cpp
    

    Note that R is sensitive to the names of the files. The name of the wrapper file must be the name of the library unless you use the -o option to R when building the library, for example:

    swig -c++ -r -o example_wrap.cpp example.i
    R CMD SHLIB -o example.so example_wrap.cpp example.cpp
    

    R is also sensitive to the name of the file extension in C and C++ mode. In C++ mode, the file extension must be .cpp rather than .cxx for the R compile command to recognize it. If your C++ code is in a file using something other than a .cpp extension, then it may still work using PKG_LIBS:

    swig -c++ -r -o example_wrap.cpp example.i
    PKG_LIBS="example.cxx" R CMD SHLIB -o example example_wrap.cpp
    

    The commands produces two files. A dynamic shared object file called example.so, or example.dll, and an R wrapper file called example.R. To load these files, start up R and type in the following commands

    dyn.load(paste("example", .Platform$dynlib.ext, sep=""))
    source("example.R")
    cacheMetaData(1)
    

    The cacheMetaData(1) will cause R to refresh its object tables. Without it, inheritance of wrapped objects may fail. These two files can be loaded in any order.

    If you are compiling code yourself (not using R itself), there are a few things to watch out for:

    • The output shared library name (to the left of the file extension) MUST match the module name, or alternatively, you can also set the -package NAME command line argument. See swig -r -help for more information
    • If you do not set the output file name appropriately, you might see errors like
      > fact(4)
      Error in .Call("R_swig_fact", s_arg1, as.logical(.copy), PACKAGE = "example") :
        "R_swig_fact" not available for .Call() for package "example"
      
    • Make sure the architecture of the shared library(x64 for instance), matches the architecture of the R program you want to load your shared library into

    33.3 Precompiling large R files

    In cases where the R file is large, one make save a lot of loading time by precompiling the R wrapper. This can be done by creating the file makeRData.R which contains the following

    source('BigFile.R')
    save(list=ls(all=TRUE), file="BigFile.RData", compress=TRUE)
    q(save="no")
    

    This will generate a compiled R file called BigFile.RData that will save a large amount of loading time.

    33.4 General policy

    The general policy of the module is to treat the C/C++ as a basic wrapping over the underlying functions and rely on the R type system to provide R syntax.

    33.5 Language conventions

    getitem and setitem use C++ conventions (i.e. zero based indices). [

    33.6 C++ classes

    C++ objects are implemented as external pointer objects with the class being the mangled name of the class. The C++ classes are encapsulated as an SEXP with an external pointer type. The class is the mangled name of the class. The nice thing about R is that is allows you to keep track of the pointer object which removes the necessity for a lot of the proxy class baggage you see in other languages.

    33.7 Enumerations

    R doesn't have a native enumeration type. Enumerations are represented as character strings in R, with calls to R functions that convert back and forth between integers.

    The details of enumeration names and contents are stored in hidden R environments, which are named according the the enumeration name - for example, an enumeration colour:

    enum colour { red=-1, blue, green = 10 };
    

    will be initialized by the following call in R:

    defineEnumeration("_colour",
     .values=c("red" = .Call('R_swig_colour_red_get',FALSE, PACKAGE='enum_thorough'),
    "blue" = .Call('R_swig_colour_blue_get',FALSE, PACKAGE='enum_thorough'),
    "green" = .Call('R_swig_colour_green_get',FALSE, PACKAGE='enum_thorough')))
    

    which will create an environment named .__E___colour. The enumeration values are initialised via calls to C/C++ code, allowing complex values for enumerations to be used. Calls to the C/C++ code require the compiled library to be loaded, so a delayedAssign is employed within defineEnumeration in order to allow the code to be easily used in R packages.

    The user typically does not need to access the enumeration lookup functions or know the name of the enumeration type used by R. Attributes containing the type information are attached by swig to functions requiring enumeration arguments or returning enumeration values, and those attributes are used to identify and access the appropriate environments and thus translate between characters and integers.

    The relevant functions, for debugging purposes, are enumToInteger and enumFromInteger.

    Anonymous enumerations are ignored by the binding generation process, leaving no way of accessing the value of anonymous enumerations from R code.


    34 SWIG and Ruby

    This chapter describes SWIG's support of Ruby.

    34.1 Preliminaries

    SWIG 4.0 is known to work with Ruby versions 1.9 and later. Given the choice, you should use the latest stable version of Ruby. You should also determine if your system supports shared libraries and dynamic loading. SWIG will work with or without dynamic loading, but the compilation process will vary.

    This chapter covers most SWIG features, but in less depth than is found in earlier chapters. At the very least, make sure you also read the "SWIG Basics" chapter. It is also assumed that the reader has a basic understanding of Ruby.

    34.1.1 Running SWIG

    To build a Ruby module, run SWIG using the -ruby option:

    $ swig -ruby example.i
    

    If building a C++ extension, add the -c++ option:

    $ swig -c++ -ruby example.i
    

    This creates a file example_wrap.c (example_wrap.cxx if compiling a C++ extension) that contains all of the code needed to build a Ruby extension module. To finish building the module, you need to compile this file and link it with the rest of your program.

    34.1.2 Getting the right header files

    In order to compile the wrapper code, the compiler needs the ruby.h header file and its dependencies, notably ruby/config.h which is found in a different, architecture-dependent, directory. The best way to find the compiler options needed to compile the code is to ask Ruby itself:

    $ ruby -rrbconfig -e 'puts "-I#{RbConfig::CONFIG[%q{rubyhdrdir}]} -I#{RbConfig::CONFIG[%q{rubyarchhdrdir}]}"'
    -I/usr/include/ruby-2.1.0 -I/usr/include/x86_64-linux-gnu/ruby-2.1.0
    

    34.1.3 Compiling a dynamic module

    Ruby extension modules are typically compiled into shared libraries that the interpreter loads dynamically at runtime. Since the exact commands for doing this vary from platform to platform, your best bet is to follow the steps described in the README.EXT file from the Ruby distribution:

    1. Create a file called extconf.rb that looks like the following:

      require 'mkmf'
      create_makefile('example')
    2. Type the following to build the extension:

      $ ruby extconf.rb
      $ make
      $ make install
          

    Of course, there is the problem that mkmf does not work correctly on all platforms, e.g, HPUX. If you need to add your own make rules to the file that extconf.rb produces, you can add this:

    open("Makefile", "a") { |mf|
     puts <<EOM
     # Your make rules go here
     EOM
    }
    

    to the end of the extconf.rb file. If for some reason you don't want to use the standard approach, you'll need to determine the correct compiler and linker flags for your build platform. For example, assuming you have code you need to link to in a file called example.c, a typical sequence of commands for the Linux operating system would look something like this:

    $ swig -ruby example.i
    $ gcc -O2 -fPIC -c example.c
    $ gcc -O2 -fPIC -c example_wrap.c -I/usr/include/ruby-2.1.0
    $ gcc -shared example.o example_wrap.o -o example.so
    

    The -fPIC option tells GCC to generate position-independent code (PIC) which is required for most architectures (it's not vital on x86, but still a good idea as it allows code pages from the library to be shared between processes). Other compilers may need a different option specified instead of -fPIC.

    If in doubt, consult the manual pages for your compiler and linker to determine the correct set of options. You might also check the SWIG Wiki for additional information.

    34.1.4 Using your module

    Ruby module names must be capitalized, but the convention for Ruby feature names is to use lowercase names. So, for example, the Etc extension module is imported by requiring the etc feature:

    # The feature name begins with a lowercase letter...
    require 'etc'
    
    # ... but the module name begins with an uppercase letter
    puts "Your login name: #{Etc.getlogin}"
    

    To stay consistent with this practice, you should always specify a lowercase module name with SWIG's %module directive. SWIG will automatically correct the resulting Ruby module name for your extension. So for example, a SWIG interface file that begins with:

    %module example

    will result in an extension module using the feature name "example" and Ruby module name "Example".

    34.1.5 Static linking

    An alternative approach to dynamic linking is to rebuild the Ruby interpreter with your extension module added to it. In the past, this approach was sometimes necessary due to limitations in dynamic loading support on certain machines. However, the situation has improved greatly over the last few years and you should not consider this approach unless there is really no other option.

    The usual procedure for adding a new module to Ruby involves finding the Ruby source, adding an entry to the ext/Setup file, adding your directory to the list of extensions in the file, and finally rebuilding Ruby.

    34.1.6 Compilation of C++ extensions

    On most machines, C++ extension modules should be linked using the C++ compiler. For example:

    $ swig -c++ -ruby example.i
    $ g++ -fPIC -c example.cxx
    $ g++ -fPIC -c example_wrap.cxx -I/usr/include/ruby-2.1.0
    $ g++ -shared example.o example_wrap.o -o example.so
    

    If you've written an extconf.rb script to automatically generate a Makefile for your C++ extension module, keep in mind that (as of this writing) Ruby still uses gcc and not g++ as its linker. As a result, the required C++ runtime library support will not be automatically linked into your extension module and it may fail to load on some platforms. A workaround for this problem is use the mkmf module's append_library() method to add one of the C++ runtime libraries to the list of libraries linked into your extension, e.g.

    require 'mkmf'
    $libs = append_library($libs, "supc++")
    create_makefile('example')

    34.2 Building Ruby Extensions under Windows 95/NT

    Building a SWIG extension to Ruby under Windows 95/NT is roughly similar to the process used with Unix. Normally, you will want to produce a DLL that can be loaded into the Ruby interpreter. For all recent versions of Ruby, the procedure described above (i.e. using an extconf.rb script) will work with Windows as well; you should be able to build your code into a DLL by typing:

    C:\swigtest> ruby extconf.rb
    C:\swigtest> nmake
    C:\swigtest> nmake install
    

    The remainder of this section covers the process of compiling SWIG-generated Ruby extensions with Microsoft Visual C++ 6 (i.e. within the Developer Studio IDE, instead of using the command line tools). In order to build extensions, you may need to download the source distribution to the Ruby package, as you will need the Ruby header files.

    34.2.1 Running SWIG from Developer Studio

    If you are developing your application within Microsoft developer studio, SWIG can be invoked as a custom build option. The process roughly follows these steps :

    • Open up a new workspace and use the AppWizard to select a DLL project.
    • Add both the SWIG interface file (the .i file), any supporting C files, and the name of the wrapper file that will be created by SWIG (i.e. example_wrap.c). Note : If using C++, choose a different suffix for the wrapper file such as example_wrap.cxx. Don't worry if the wrapper file doesn't exist yet--Developer Studio will keep a reference to it around.
    • Select the SWIG interface file and go to the settings menu. Under settings, select the "Custom Build" option.
    • Enter "SWIG" in the description field.
    • Enter "swig -ruby -o $(ProjDir)\$(InputName)_wrap.c $(InputPath)" in the "Build command(s) field". You may have to include the path to swig.exe.
    • Enter "$(ProjDir)\$(InputName)_wrap.c" in the "Output files(s) field".
    • Next, select the settings for the entire project and go to the C/C++ tab and select the Preprocessor category. Add NT=1 to the Preprocessor definitions. This must be set else you will get compilation errors. Also add IMPORT to the preprocessor definitions, else you may get runtime errors. Also add the include directories for your Ruby installation under "Additional include directories".
    • Next, select the settings for the entire project and go to the Link tab and select the General category. Set the name of the output file to match the name of your Ruby module (i.e.. example.dll). Next add the Ruby library file to your link libraries under Object/Library modules. For example "mswin32-ruby16.lib. You also need to add the path to the library under the Input tab - Additional library path.
    • Build your project.

    Now, assuming all went well, SWIG will be automatically invoked when you build your project. Any changes made to the interface file will result in SWIG being automatically invoked to produce a new version of the wrapper file. To run your new Ruby extension, simply run Ruby and use the require command as normal. For example if you have this ruby file run.rb:

    # file: run.rb
    require 'Example'
    
    # Call a c function
    print "Foo = ", Example.Foo, "\n"

    Ensure the dll just built is in your path or current directory, then run the Ruby script from the DOS/Command prompt:

    C:\swigtest> ruby run.rb
    Foo = 3.0
    

    34.3 The Ruby-to-C/C++ Mapping

    This section describes the basics of how SWIG maps C or C++ declarations in your SWIG interface files to Ruby constructs.

    34.3.1 Modules

    The SWIG %module directive specifies the name of the Ruby module. If you specify:

    %module example

    then everything is wrapped into a Ruby module named Example that is nested directly under the global module. You can specify a more deeply nested module by specifying the fully-qualified module name in quotes, e.g.

    %module "foo::bar::spam"

    An alternate method of specifying a nested module name is to use the -prefix option on the SWIG command line. The prefix that you specify with this option will be prepended to the module name specified with the %module directive in your SWIG interface file. So for example, this declaration at the top of your SWIG interface file:

    %module "foo::bar::spam"

    will result in a nested module name of Foo::Bar::Spam, but you can achieve the same effect by specifying:

    %module spam

    and then running SWIG with the -prefix command line option:

    $ swig -ruby -prefix "foo::bar::" example.i
    

    Starting with SWIG 1.3.20, you can also choose to wrap everything into the global module by specifying the -globalmodule option on the SWIG command line, i.e.

    $ swig -ruby -globalmodule example.i
    

    Note that this does not relieve you of the requirement of specifying the SWIG module name with the %module directive (or the -module command-line option) as described earlier.

    When choosing a module name, do not use the same name as a built-in Ruby command or standard module name, as the results may be unpredictable. Similarly, if you're using the -globalmodule option to wrap everything into the global module, take care that the names of your constants, classes and methods don't conflict with any of Ruby's built-in names.

    34.3.2 Functions

    Global functions are wrapped as Ruby module methods. For example, given the SWIG interface file example.i:

    %module example
    
    int fact(int n);

    and C source file example.c:

    int fact(int n) {
      if (n == 0)
      return 1;
      return (n * fact(n-1));
    }

    SWIG will generate a method fact in the Example module that can be used like so:

    $ irb
    irb(main):001:0> require 'example'
    true
    irb(main):002:0> Example.fact(4)
    24

    34.3.3 Variable Linking

    C/C++ global variables are wrapped as a pair of singleton methods for the module: one to get the value of the global variable and one to set it. For example, the following SWIG interface file declares two global variables:

    // SWIG interface file with global variables
    %module example
    ...
    %inline %{
      extern int variable1;
      extern double Variable2;
    %}
    ...

    Now look at the Ruby interface:

    $ irb
    irb(main):001:0> require 'Example'
    true
    irb(main):002:0> Example.variable1 = 2
    2
    irb(main):003:0> Example.Variable2 = 4 * 10.3
    41.2
    irb(main):004:0> Example.Variable2
    41.2

    If you make an error in variable assignment, you will receive an error message. For example:

    irb(main):005:0> Example.Variable2 = "hello"
    TypeError: no implicit conversion to float from string
    from (irb):5:in `Variable2='
    from (irb):5

    If a variable is declared as const, it is wrapped as a read-only variable. Attempts to modify its value will result in an error.

    To make ordinary variables read-only, you can also use the %immutable directive. For example:

    %immutable;
    %inline %{
      extern char *path;
    %}
    %mutable;

    The %immutable directive stays in effect until it is explicitly disabled using %mutable.

    34.3.4 Constants

    C/C++ constants are wrapped as module constants initialized to the appropriate value. To create a constant, use #define or the %constant directive. For example:

    #define PI 3.14159
    #define VERSION "1.0"
    
    %constant int FOO = 42;
    %constant const char *path = "/usr/local";
    
    const int BAR = 32;

    Remember to use the :: operator in Ruby to get at these constant values, e.g.

    $ irb
    irb(main):001:0> require 'Example'
    true
    irb(main):002:0> Example::PI
    3.14159

    34.3.5 Pointers

    "Opaque" pointers to arbitrary C/C++ types (i.e. types that aren't explicitly declared in your SWIG interface file) are wrapped as data objects. So, for example, consider a SWIG interface file containing only the declarations:

    Foo *get_foo();
    void set_foo(Foo *foo);

    For this case, the get_foo() method returns an instance of an internally generated Ruby class:

    irb(main):001:0> foo = Example::get_foo()
    #<SWIG::TYPE_p_Foo:0x402b1654>

    A NULL pointer is always represented by the Ruby nil object.

    34.3.6 Structures

    C/C++ structs are wrapped as Ruby classes, with accessor methods (i.e. "getters" and "setters") for all of the struct members. For example, this struct declaration:

    struct Vector {
      double x, y;
    };

    gets wrapped as a Vector class, with Ruby instance methods x, x=, y and y=. These methods can be used to access structure data from Ruby as follows:

    $ irb
    irb(main):001:0> require 'Example'
    true
    irb(main):002:0> f = Example::Vector.new
    #<Example::Vector:0x4020b268>
    irb(main):003:0> f.x = 10
    nil
    irb(main):004:0> f.x
    10.0

    Similar access is provided for unions and the public data members of C++ classes.

    const members of a structure are read-only. Data members can also be forced to be read-only using the %immutable directive (in C++, private may also be used). For example:

    struct Foo {
      ...
      %immutable;
      int x; /* Read-only members */
      char *name;
      %mutable;
      ...
    };

    When char * members of a structure are wrapped, the contents are assumed to be dynamically allocated using malloc or new (depending on whether or not SWIG is run with the -c++ option). When the structure member is set, the old contents will be released and a new value created. If this is not the behavior you want, you will have to use a typemap (described shortly).

    Array members are normally wrapped as read-only. For example, this code:

    struct Foo {
      int x[50];
    };

    produces a single accessor function like this:

    int *Foo_x_get(Foo *self) {
      return self->x;
    };

    If you want to set an array member, you will need to supply a "memberin" typemap described in the section on typemaps. As a special case, SWIG does generate code to set array members of type char (allowing you to store a Ruby string in the structure).

    When structure members are wrapped, they are handled as pointers. For example,

    struct Foo {
      ...
    };
    
    struct Bar {
      Foo f;
    };

    generates accessor functions such as this:

    Foo *Bar_f_get(Bar *b) {
      return &b->f;
    }
    
    void Bar_f_set(Bar *b, Foo *val) {
      b->f = *val;
    }

    34.3.7 C++ classes

    Like structs, C++ classes are wrapped by creating a new Ruby class of the same name with accessor methods for the public class member data. Additionally, public member functions for the class are wrapped as Ruby instance methods, and public static member functions are wrapped as Ruby singleton methods. So, given the C++ class declaration:

    class List {
    public:
      List();
      ~List();
      int search(char *item);
      void insert(char *item);
      void remove(char *item);
      char *get(int n);
      int length;
      static void print(List *l);
    };

    SWIG would create a List class with:

    • instance methods search, insert, remove, and get;
    • instance methods length and length= (to get and set the value of the length data member); and,
    • a print singleton method for the class.

    In Ruby, these functions are used as follows:

    require 'Example'
    
    l = Example::List.new
    
    l.insert("Ale")
    l.insert("Stout")
    l.insert("Lager")
    Example.print(l)
    l.length()
    ----- produces the following output 
    Lager
    Stout
    Ale
    3

    34.3.8 C++ Inheritance

    The SWIG type-checker is fully aware of C++ inheritance. Therefore, if you have classes like this:

    class Parent {
      ...
    };
    
    class Child : public Parent {
      ...
    };

    those classes are wrapped into a hierarchy of Ruby classes that reflect the same inheritance structure. All of the usual Ruby utility methods work normally:

    irb(main):001:0> c = Child.new
    #<Bar:0x4016efd4>
    irb(main):002:0> c.instance_of? Child
    true
    irb(main):003:0> b.instance_of? Parent
    false
    irb(main):004:0> b.is_a? Child
    true
    irb(main):005:0> b.is_a? Parent
    true
    irb(main):006:0> Child < Parent
    true
    irb(main):007:0> Child > Parent
    false

    Furthermore, if you have a function like this:

    void spam(Parent *f);

    then the function spam() accepts Parent* or a pointer to any class derived from Parent.

    Until recently, the Ruby module for SWIG didn't support multiple inheritance, and this is still the default behavior. This doesn't mean that you can't wrap C++ classes which inherit from multiple base classes; it simply means that only the first base class listed in the class declaration is considered, and any additional base classes are ignored. As an example, consider a SWIG interface file with a declaration like this:

    class Derived : public Base1, public Base2
    {
      ...
    };

    For this case, the resulting Ruby class (Derived) will only consider Base1 as its superclass. It won't inherit any of Base2's member functions or data and it won't recognize Base2 as an "ancestor" of Derived (i.e. the is_a? relationship would fail). When SWIG processes this interface file, you'll see a warning message like:

    example.i:5: Warning 802: Warning for Derived: Base Base2 ignored.
    Multiple inheritance is not supported in Ruby.

    Starting with SWIG 1.3.20, the Ruby module for SWIG provides limited support for multiple inheritance. Because the approach for dealing with multiple inheritance introduces some limitations, this is an optional feature that you can activate with the -minherit command-line option:

    $ swig -c++ -ruby -minherit example.i
    

    Using our previous example, if your SWIG interface file contains a declaration like this:

    class Derived : public Base1, public Base2
    {
      ...
    };

    and you run SWIG with the -minherit command-line option, then you will end up with a Ruby class Derived that appears to "inherit" the member data and functions from both Base1 and Base2. What actually happens is that three different top-level classes are created, with Ruby's Object class as their superclass. Each of these classes defines a nested module named Impl, and it's in these nested Impl modules that the actual instance methods for the classes are defined, i.e.

    class Base1
      module Impl
      # Define Base1 methods here
      end
      include Impl
    end
    
    class Base2
      module Impl
      # Define Base2 methods here
      end
      include Impl
    end
    
    class Derived
      module Impl
      include Base1::Impl
      include Base2::Impl
      # Define Derived methods here
      end
      include Impl
    end

    Observe that after the nested Impl module for a class is defined, it is mixed-in to the class itself. Also observe that the Derived::Impl module first mixes-in its base classes' Impl modules, thus "inheriting" all of their behavior.

    The primary drawback is that, unlike the default mode of operation, neither Base1 nor Base2 is a true superclass of Derived anymore:

    obj = Derived.new
    obj.is_a? Base1 # this will return false...
    obj.is_a? Base2 # ... and so will this

    In most cases, this is not a serious problem since objects of type Derived will otherwise behave as though they inherit from both Base1 and Base2 (i.e. they exhibit "Duck Typing").

    34.3.9 C++ Overloaded Functions

    C++ overloaded functions, methods, and constructors are mostly supported by SWIG. For example, if you have two functions like this:

    void foo(int);
    void foo(char *c);

    You can use them in Ruby in a straightforward manner:

    irb(main):001:0> foo(3) # foo(int)
    irb(main):002:0> foo("Hello") # foo(char *c)

    Similarly, if you have a class like this,

    class Foo {
    public:
      Foo();
      Foo(const Foo &);
      ...
    };

    you can write Ruby code like this:

    irb(main):001:0> f = Foo.new # Create a Foo
    irb(main):002:0> g = Foo.new(f) # Copy f

    Overloading support is not quite as flexible as in C++. Sometimes there are methods that SWIG can't disambiguate. For example:

    void spam(int);
    void spam(short);

    or

    void foo(Bar *b);
    void foo(Bar &b);

    If declarations such as these appear, you will get a warning message like this:

    example.i:12: Warning 509: Overloaded method spam(short) effectively ignored,
    example.i:11: Warning 509: as it is shadowed by spam(int).
    

    To fix this, you either need to ignore or rename one of the methods. For example:

    %rename(spam_short) spam(short);
    ...
    void spam(int); 
    void spam(short); // Accessed as spam_short

    or

    %ignore spam(short);
    ...
    void spam(int); 
    void spam(short); // Ignored

    SWIG resolves overloaded functions and methods using a disambiguation scheme that ranks and sorts declarations according to a set of type-precedence rules. The order in which declarations appear in the input does not matter except in situations where ambiguity arises--in this case, the first declaration takes precedence.

    Please refer to the "SWIG and C++" chapter for more information about overloading.

    34.3.10 C++ Operators

    For the most part, overloaded operators are handled automatically by SWIG and do not require any special treatment on your part. So if your class declares an overloaded addition operator, e.g.

    class Complex {
      ...
      Complex operator+(Complex &);
      ...
    };

    the resulting Ruby class will also support the addition (+) method correctly.

    For cases where SWIG's built-in support is not sufficient, C++ operators can be wrapped using the %rename directive (available on SWIG 1.3.10 and later releases). All you need to do is give the operator the name of a valid Ruby identifier. For example:

    %rename(add_complex) operator+(Complex &, Complex &);
    ...
    Complex operator+(Complex &, Complex &);

    Now, in Ruby, you can do this:

    a = Example::Complex.new(2, 3)
    b = Example::Complex.new(4, -1)
    c = Example.add_complex(a, b)

    More details about wrapping C++ operators into Ruby operators is discussed in the section on operator overloading.

    34.3.11 C++ namespaces

    SWIG is aware of C++ namespaces, but namespace names do not appear in the module nor do namespaces result in a module that is broken up into submodules or packages. For example, if you have a file like this,

    %module example
    
    namespace foo {
      int fact(int n);
      struct Vector {
        double x, y, z;
      };
    };

    it works in Ruby as follows:

    irb(main):001:0> require 'example'
    true
    irb(main):002:0> Example.fact(3)
    6
    irb(main):003:0> v = Example::Vector.new
    #<Example::Vector:0x4016f4d4>
    irb(main):004:0> v.x = 3.4
    3.4
    irb(main):004:0> v.y
    0.0

    If your program has more than one namespace, name conflicts (if any) can be resolved using %rename For example:

    %rename(Bar_spam) Bar::spam;
    
    namespace Foo {
      int spam();
    }
    
    namespace Bar {
      int spam();
    }

    If you have more than one namespace and your want to keep their symbols separate, consider wrapping them as separate SWIG modules. For example, make the module name the same as the namespace and create extension modules for each namespace separately. If your program utilizes thousands of small deeply nested namespaces each with identical symbol names, well, then you get what you deserve.

    34.3.12 C++ templates

    C++ templates don't present a huge problem for SWIG. However, in order to create wrappers, you have to tell SWIG to create wrappers for a particular template instantiation. To do this, you use the %template directive. For example:

    %module example
    
    %{
    #include "pair.h"
    %}
    
    template<class T1, class T2>
    struct pair {
      typedef T1 first_type;
      typedef T2 second_type;
      T1 first;
      T2 second;
      pair();
      pair(const T1&, const T2&);
      ~pair();
    };
    
    %template(Pairii) pair<int, int>;

    In Ruby:

    irb(main):001:0> require 'example'
    true
    irb(main):002:0> p = Example::Pairii.new(3, 4)
    #<Example:Pairii:0x4016f4df>
    irb(main):003:0> p.first
    3
    irb(main):004:0> p.second
    4

    34.3.13 C++ Standard Template Library (STL)

    On a related note, the standard SWIG library contains a number of modules that provide typemaps for standard C++ library classes (such as std::pair, std::string and std::vector). These library modules don't provide wrappers around the templates themselves, but they do make it convenient for users of your extension module to pass Ruby objects (such as arrays and strings) to wrapped C++ code that expects instances of standard C++ templates. For example, suppose the C++ library you're wrapping has a function that expects a vector of floats:

    %module example
    
    float sum(const std::vector<float>& values);

    Rather than go through the hassle of writing an "in" typemap to convert an array of Ruby numbers into a std::vector<float>, you can just use the std_vector.i module from the standard SWIG library:

    %module example
    
    %include std_vector.i
    float sum(const std::vector<float>& values);

    Ruby's STL wrappings provide additional methods to make them behave more similarly to Ruby's native classes.

    Thus, you can do, for example:

    v = IntVector.new
    v << 2
    v << 3
    v << 4
    v.each { |x| puts x }
    
    => 2
    3
    4
    v.delete_if { |x| x == 3 }
    => [2, 4]

    The SWIG Ruby module provides also the ability for all the STL containers to carry around Ruby native objects (Fixnum, Classes, etc) making them act almost like Ruby's own Array, Hash, etc. To do that, you need to define a container that contains a swig::GC_VALUE, like:

    %module nativevector
    
    %{
    std::vector< swig::GC_VALUE > NativeVector;
    %}
    
    %template(NativeVector) std::vector< swig::GC_VALUE >;
    

    This vector can then contain any Ruby object, making them almost identical to Ruby's own Array class.

    require 'nativevector'
    include NativeVector
    
    v = NativeVector.new
    v << 1
    v << [1, 2]
    v << 'hello'
    
    class A; end
    
    v << A.new
    
    puts v
    => [1, [1, 2], 'hello', #<A:0x245325>]
    

    Obviously, there is a lot more to template wrapping than shown in these examples. More details can be found in the SWIG and C++ chapter.

    34.3.14 C++ STL Functors

    Some containers in the STL allow you to modify their default behavior by using so called functors or function objects. Functors are often just a very simple struct with operator() redefined or an actual C/C++ function. This allows you, for example, to always keep the sort order of a STL container to your liking.

    The Ruby STL mappings allows you to modify those containers that support functors using Ruby procs or methods, instead. Currently, this includes std::set, set::map, std::multiset and std::multimap.

    The functors in swig are called swig::UnaryFunction and swig::BinaryFunction. For C++ predicates (ie. functors that must return bool as a result) swig::UnaryPredicate and swig::BinaryPredicate are provided.

    As an example, if given this swig file:

    %module intset;
    
    %include <std_set.i>
    
    %template(IntSet) std::set< int, swig::BinaryPredicate >;
    

    You can then use the set from Ruby with or without a proc object as a predicate:

    require 'intset'
    include Intset
    
    # Default sorting behavior defined in C++
    a = IntSet.new
    a << 1
    a << 2
    a << 3
    a
    => [1, 2, 3]
    
    # Custom sorting behavior defined by a Ruby proc
    b = IntSet.new( proc { |a, b| a > b } )
    b << 1
    b << 2
    b << 3
    b
    =>  [3, 2, 1]
    

    34.3.15 C++ STL Iterators

    The STL is well known for the use of iterators. There are a number of iterators possible with different properties, but in general there are two main categories: const iterators and non-const iterators. The const iterators can access and not modify the values they point at, while the non-const iterators can both read and modify the values.

    The Ruby STL wrappings support both type of iterators by using a proxy class in-between. This proxy class is swig::Iterator or swig::ConstIterator. Derived from them are template classes that need to be initialized with the actual iterator for the container you are wrapping and often times with the beginning and ending points of the iteration range.

    The SWIG STL library already provides typemaps to all the standard containers to do this wrapping automatically for you, but if you have your own STL-like iterator, you will need to write your own typemap for them. For out typemaps, the special functions make_const_iterator and make_nonconst_iterator are provided.

    These can be used either like:

    make_const_iterator( iterator, rubyclass );
    make_const_iterator( iterator, iterator_begin, iterator_end, rubyclass );
    

    The iterators support a next() and previous() member function to just change the iterator without returning anything. previous() should obviously only be used for bidirectional iterators. You can also advance the iterator multiple steps by using standard math operations like +=.

    The value the iterator points at can be accessed with value() -- this is equivalent to dereferencing it with *i. For non-const iterators, a value=() function is also provided which allows you to change the value pointed by the iterator. This is equivalent to the C++ construct of dereferencing and assignment, like *i = something.

    Thus, given say a vector class of doubles defined as:

    %module doublevector
    
    %include std_vector.i
    
    %template(DoubleVector) std::vector<double>;
    

    Its iterator can then be used from Ruby like:

    require 'doublevector'
    include Doublevector
    
    v = DoubleVector.new
    v << 1
    v << 2
    v << 3
    
    #
    # an elaborate and less efficient way of doing v.map! { |x| x+2 }
    #
    i = v.begin
    e = v.end
    while i != e
      val = i.value
      val += 2
      i.value = val
      i.next
    end
    i
    >> [3, 4, 5 ]
    

    If you'd rather have STL classes without any iterators, you should define -DSWIG_NO_EXPORT_ITERATOR_METHODS when running swig.

    34.3.16 C++ Smart Pointers

    34.3.16.1 The shared_ptr Smart Pointer

    The C++11 standard provides std::shared_ptr which was derived from the Boost implementation, boost::shared_ptr. Both of these are available for Ruby in the SWIG library and usage is outlined in the shared_ptr smart pointer library section.

    34.3.16.2 Generic Smart Pointers

    In certain C++ programs, it is common to use classes that have been wrapped by so-called "smart pointers." Generally, this involves the use of a template class that implements operator->() like this:

    template<class T> class SmartPtr {
      ...
      T *operator->();
      ...
    }

    Then, if you have a class like this,

    class Foo {
    public:
      int x;
      int bar();
    };

    A smart pointer would be used in C++ as follows:

    SmartPtr<Foo> p = CreateFoo(); // Created somehow (not shown)
    ...
    p->x = 3; // Foo::x
    int y = p->bar(); // Foo::bar

    To wrap this in Ruby, simply tell SWIG about the SmartPtr class and the low-level Foo object. Make sure you instantiate SmartPtr using %template if necessary. For example:

    %module example
    ...
    %template(SmartPtrFoo) SmartPtr<Foo>;
    ...

    Now, in Ruby, everything should just "work":

    irb(main):001:0> p = Example::CreateFoo() # Create a smart-pointer somehow
    #<Example::SmartPtrFoo:0x4016f4df>
    irb(main):002:0> p.x = 3 # Foo::x
    3
    irb(main):003:0> p.bar() # Foo::bar

    If you ever need to access the underlying pointer returned by operator->() itself, simply use the __deref__() method. For example:

    irb(main):004:0> f = p.__deref__() # Returns underlying Foo *

    34.3.17 Cross-Language Polymorphism

    SWIG's Ruby module supports cross-language polymorphism (a.k.a. the "directors" feature) similar to that for SWIG's Python module. Rather than duplicate the information presented in the Python chapter, this section just notes the differences that you need to be aware of when using this feature with Ruby.

    34.3.17.1 Exception Unrolling

    Whenever a C++ director class routes one of its virtual member function calls to a Ruby instance method, there's always the possibility that an exception will be raised in the Ruby code. By default, those exceptions are ignored, which simply means that the exception will be exposed to the Ruby interpreter. If you would like to change this behavior, you can use the %feature("director:except") directive to indicate what action should be taken when a Ruby exception is raised. The following code should suffice in most cases:

    %feature("director:except") {
      throw Swig::DirectorMethodException($error);
    }

    When this feature is activated, the call to the Ruby instance method is "wrapped" using the rb_rescue2() function from Ruby's C API. If any Ruby exception is raised, it will be caught here and a C++ exception is raised in its place.

    34.4 Naming

    Ruby has several common naming conventions. Constants are generally in upper case, module and class names are in camel case and methods are in lower case with underscores. For example:

    • MATH::PI is a constant name
    • MyClass is a class name
    • my_method is a method name

    Prior to version 1.3.28, SWIG did not support these Ruby conventions. The only modifications it made to names was to capitalize the first letter of constants (which includes module and class names).

    SWIG 1.3.28 introduces the new -autorename command line parameter. When this parameter is specified, SWIG will automatically change constant, class and method names to conform with the standard Ruby naming conventions. For example:

    $ swig -ruby -autorename example.i
    

    To disable renaming use the -noautorename command line option.

    Since this change significantly changes the wrapper code generated by SWIG, it is turned off by default in SWIG 1.3.28. However, it is planned to become the default option in future releases.

    34.4.1 Defining Aliases

    It's a fairly common practice in the Ruby built-ins and standard library to provide aliases for method names. For example, Array#size is an alias for Array#length. If you would like to provide an alias for one of your class' instance methods, one approach is to use SWIG's %extend directive to add a new method of the aliased name that calls the original function. For example:

    class MyArray {
    public:
      // Construct an empty array
      MyArray();
    
      // Return the size of this array
      size_t length() const;
    };
    
    %extend MyArray {
      // MyArray#size is an alias for MyArray#length
      size_t size() const {
        return $self->length();
      }
    }
     

    A better solution is to use the %alias directive (unique to SWIG's Ruby module). The previous example could then be rewritten as:

    // MyArray#size is an alias for MyArray#length
    %alias MyArray::length "size";
    
    class MyArray {
    public:
      // Construct an empty array
      MyArray();
     
      // Return the size of this array
      size_t length() const;
    };

    Multiple aliases can be associated with a method by providing a comma-separated list of aliases to the %alias directive, e.g.

    %alias MyArray::length "amount, quantity, size";

    From an end-user's standpoint, there's no functional difference between these two approaches; i.e. they should get the same result from calling either MyArray#size or MyArray#length. However, when the %alias directive is used, SWIG doesn't need to generate all of the wrapper code that's usually associated with added methods like our MyArray::size() example.

    Note that the %alias directive is implemented using SWIG's "features" mechanism and so the same name matching rules used for other kinds of features apply (see the chapter on "Customization Features") for more details).

    34.4.2 Predicate Methods

    Ruby methods that return a boolean value and end in a question mark are known as predicate methods. Examples of predicate methods in standard Ruby classes include Array#empty? (which returns true for an array containing no elements) and Object#instance_of? (which returns true if the object is an instance of the specified class). For consistency with Ruby conventions, methods that return boolean values should be marked as predicate methods.

    One cumbersome solution to this problem is to rename the method (using SWIG's %rename directive) and provide a custom typemap that converts the function's actual return type to Ruby's true or false. For example:

    %rename("is_it_safe?") is_it_safe();
    
    %typemap(out) int is_it_safe "$result = ($1 != 0) ? Qtrue : Qfalse;";
    
    int is_it_safe();

    A better solution is to use the %predicate directive (unique to SWIG's Ruby module) to designate a method as a predicate method. For the previous example, this would look like:

    %predicate is_it_safe();
    
    int is_it_safe();

    This method would be invoked from Ruby code like this:

    irb(main):001:0> Example::is_it_safe?
    true

    The %predicate directive is implemented using SWIG's "features" mechanism and so the same name matching rules used for other kinds of features apply (see the chapter on "Customization Features") for more details).

    34.4.3 Bang Methods

    Ruby methods that modify an object in-place and end in an exclamation mark are known as bang methods. An example of a bang method is Array#sort! which changes the ordering of items in an array. Contrast this with Array#sort, which returns a copy of the array with the items sorted instead of modifying the original array. For consistency with Ruby conventions, methods that modify objects in place should be marked as bang methods.

    Bang methods can be marked using the %bang directive which is unique to the Ruby module and was introduced in SWIG 1.3.28. For example:

    %bang sort(int arr[]);
    
    int sort(int arr[]); 

    This method would be invoked from Ruby code like this:

    irb(main):001:0> Example::sort!(arr)

    The %bang directive is implemented using SWIG's "features" mechanism and so the same name matching rules used for other kinds of features apply (see the chapter on "Customization Features") for more details).

    34.4.4 Getters and Setters

    Often times a C++ library will expose properties through getter and setter methods. For example:

    class Foo {
      Foo() {}
      int getValue() { return value_; }
      void setValue(int value) { value_ = value; }
    
    private:
      int value_;
    };

    By default, SWIG will expose these methods to Ruby as get_value and set_value. However, it more natural for these methods to be exposed in Ruby as value and value=. That allows the methods to be used like this:

    irb(main):001:0> foo = Foo.new()
    irb(main):002:0> foo.value = 5
    irb(main):003:0> puts foo.value

    This can be done by using the %rename directive:

    %rename("value") Foo::getValue();
    %rename("value=") Foo::setValue(int value);

    34.5 Input and output parameters

    A common problem in some C programs is handling parameters passed as simple pointers. For example:

    void add(int x, int y, int *result) {
      *result = x + y;
    }

    or

    int sub(int *x, int *y) {
      return *x-*y;
    }

    The easiest way to handle these situations is to use the typemaps.i file. For example:

    %module Example
    %include "typemaps.i"
    
    void add(int, int, int *OUTPUT);
    int sub(int *INPUT, int *INPUT);

    In Ruby, this allows you to pass simple values. For example:

    a = Example.add(3, 4)
    puts a
    7
    b = Example.sub(7, 4)
    puts b
    3

    Notice how the INPUT parameters allow integer values to be passed instead of pointers and how the OUTPUT parameter creates a return result.

    If you don't want to use the names INPUT or OUTPUT, use the %apply directive. For example:

    %module Example
    %include "typemaps.i"
    
    %apply int *OUTPUT { int *result };
    %apply int *INPUT { int *x, int *y};
    
    void add(int x, int y, int *result);
    int sub(int *x, int *y);

    If a function mutates one of its parameters like this,

    void negate(int *x) {
     *x = -(*x);
    }

    you can use INOUT like this:

    %include "typemaps.i"
    ...
    void negate(int *INOUT);

    In Ruby, a mutated parameter shows up as a return value. For example:

    a = Example.negate(3)
    print a
    -3

    The most common use of these special typemap rules is to handle functions that return more than one value. For example, sometimes a function returns a result as well as a special error code:

    /* send message, return number of bytes sent, success code, and error_code */
    int send_message(char *text, int *success, int *error_code);

    To wrap such a function, simply use the OUTPUT rule above. For example:

    %module example
    %include "typemaps.i"
    ...
    int send_message(char *, int *OUTPUT, int *OUTPUT);

    When used in Ruby, the function will return an array of multiple values.

    bytes, success, error_code = send_message("Hello World")
    if not success
      print "error #{error_code} : in send_message"
    else
      print "Sent", bytes
    end

    Another way to access multiple return values is to use the %apply rule. In the following example, the parameters rows and columns are related to SWIG as OUTPUT values through the use of %apply

    %module Example
    %include "typemaps.i"
    %apply int *OUTPUT { int *rows, int *columns };
    ...
    void get_dimensions(Matrix *m, int *rows, int*columns);

    In Ruby:

    r, c = Example.get_dimensions(m)

    34.6 Exception handling

    34.6.1 Using the %exception directive

    The SWIG %exception directive can be used to define a user-definable exception handler that can convert C/C++ errors into Ruby exceptions. The chapter on Customization Features contains more details, but suppose you have a C++ class like the following :

    class DoubleArray {
    private:
      int n;
      double *ptr;
    public:
      // Create a new array of fixed size
      DoubleArray(int size) {
        ptr = new double[size];
        n = size;
      }
     
      // Destroy an array
      ~DoubleArray() {
        delete ptr;
      } 
     
      // Return the length of the array
      int length() {
        return n;
      }
     
      // Get an array item and perform bounds checking.
      double getitem(int i) {
        if ((i >= 0) && (i < n))
          return ptr[i];
        else
          throw RangeError();
      }
     
      // Set an array item and perform bounds checking.
      void setitem(int i, double val) {
        if ((i >= 0) && (i < n))
          ptr[i] = val;
        else {
          throw RangeError();
        }
      }
    };

    Since several methods in this class can throw an exception for an out-of-bounds access, you might want to catch this in the Ruby extension by writing the following in an interface file:

    %exception {
      try {
        $action
      }
      catch (const RangeError&) {
        static VALUE cpperror = rb_define_class("CPPError", rb_eStandardError);
        rb_raise(cpperror, "Range error.");
      }
    }
    
    class DoubleArray {
      ...
    };

    The exception handling code is inserted directly into generated wrapper functions. When an exception handler is defined, errors can be caught and used to gracefully raise a Ruby exception instead of forcing the entire program to terminate with an uncaught error.

    As shown, the exception handling code will be added to every wrapper function. Because this is somewhat inefficient, you might consider refining the exception handler to only apply to specific methods like this:

    %exception getitem {
      try {
        $action
      } catch (const RangeError&) {
        static VALUE cpperror = rb_define_class("CPPError", rb_eStandardError);
        rb_raise(cpperror, "Range error in getitem.");
      }
    }
     
    %exception setitem {
      try {
        $action
      } catch (const RangeError&) {
        static VALUE cpperror = rb_define_class("CPPError", rb_eStandardError);
        rb_raise(cpperror, "Range error in setitem.");
      }
    }

    In this case, the exception handler is only attached to methods and functions named getitem and setitem.

    Since SWIG's exception handling is user-definable, you are not limited to C++ exception handling. See the chapter on Customization Features for more examples.

    34.6.2 Handling Ruby Blocks

    One of the highlights of Ruby and most of its standard library is the use of blocks, which allow the easy creation of continuations and other niceties. Blocks in ruby are also often used to simplify the passing of many arguments to a class.

    In order to make your class constructor support blocks, you can take advantage of the %exception directive, which will get run after the C++ class' constructor was called.

    For example, this yields the class over after its construction:

    class Window
    {
    public:
      Window(int x, int y, int w, int h);
      // .... other methods here ....
    };
    
    // Add support for yielding self in the Class' constructor.
    %exception Window::Window {
      $action
      if (rb_block_given_p()) {
        rb_yield(self);
      }
    }

    Then, in ruby, it can be used like:

    Window.new(0, 0, 360, 480) { |w|
      w.color = Fltk::RED
      w.border = false
    }
    

    For other methods, you can usually use a dummy parameter with a special in typemap, like:

    //
    // original function was:
    //
    // void func(int x);
    
    %typemap(in, numinputs=0) int RUBY_YIELD_SELF {
      if ( !rb_block_given_p() )
        rb_raise("No block given");
      return rb_yield(self);
    }
    
    %extend {
      void func(int x, int RUBY_YIELD_SELF );
    }
    

    For more information on typemaps, see Typemaps .

    34.6.3 Raising exceptions

    There are three ways to raise exceptions from C++ code to Ruby.

    The first way is to use SWIG_exception(int code, const char *msg) . The following table shows the mappings from SWIG error codes to Ruby exceptions:

    SWIG_MemoryError
    rb_eNoMemError
    SWIG_IOError
    rb_eIOError
    SWIG_RuntimeError
    rb_eRuntimeError
    SWIG_IndexError
    rb_eIndexError
    SWIG_TypeError
    rb_eTypeError
    SWIG_DivisionByZero
    rb_eZeroDivError
    SWIG_OverflowError
    rb_eRangeError
    SWIG_SyntaxError
    rb_eSyntaxError
    SWIG_ValueError
    rb_eArgError
    SWIG_SystemError
    rb_eFatal
    SWIG_AttributeError
    rb_eRuntimeError
    SWIG_NullReferenceError
    rb_eNullReferenceError*
    SWIG_ObjectPreviouslyDeletedError
    rb_eObjectPreviouslyDeleted*
    SWIG_UnknownError
    rb_eRuntimeError
    * These error classes are created by SWIG and are not built-in Ruby exception classes

    The second way to raise errors is to use SWIG_Raise(obj, type, desc). Obj is a C++ instance of an exception class, type is a string specifying the type of exception (for example, "MyError") and desc is the SWIG description of the exception class. For example:

    %raise(SWIG_NewPointerObj(e, SWIGTYPE_p_AssertionFailedException, 0), ":AssertionFailedException", SWIGTYPE_p_AssertionFailedException);
    

    This is useful when you want to pass the current exception object directly to Ruby, particularly when the object is an instance of class marked as an %exceptionclass (see the next section for more information).

    Last, you can raise an exception by directly calling Ruby's C api. This is done by invoking the rb_raise() function. The first argument passed to rb_raise() is the exception type. You can raise a custom exception type or one of the built-in Ruby exception types.

    34.6.4 Exception classes

    Starting with SWIG 1.3.28, the Ruby module supports the %exceptionclass directive, which is used to identify C++ classes that are used as exceptions. Classes that are marked with the %exceptionclass directive are exposed in Ruby as child classes of rb_eRuntimeError. This allows C++ exceptions to be directly mapped to Ruby exceptions, providing for a more natural integration between C++ code and Ruby code.

    %exceptionclass CustomError;
    
    %inline %{
      class CustomError { };
    
      class Foo { 
      public:
        void test() { throw CustomError; }
      };
    %}

    From Ruby you can now call this method like this:

    foo = Foo.new
    begin
      foo.test()
    rescue CustomError => e
      puts "Caught custom error"
    end 

    For another example look at swig/Examples/ruby/exception_class.

    34.7 Typemaps

    This section describes how you can modify SWIG's default wrapping behavior for various C/C++ datatypes using the %typemap directive. This is an advanced topic that assumes familiarity with the Ruby C API as well as the material in the "Typemaps " chapter.

    Before proceeding, it should be stressed that typemaps are not a required part of using SWIG---the default wrapping behavior is enough in most cases. Typemaps are only used if you want to change some aspect of the primitive C-Ruby interface.

    34.7.1 What is a typemap?

    A typemap is nothing more than a code generation rule that is attached to a specific C datatype. The general form of this declaration is as follows ( parts enclosed in [...] are optional ):

    %typemap( method [, modifiers...] ) typelist code;
    

    method is a simply a name that specifies what kind of typemap is being defined. It is usually a name like "in", "out", or "argout" (or its director variations). The purpose of these methods is described later.

    modifiers is an optional comma separated list of name="value" values. These are sometimes to attach extra information to a typemap and is often target-language dependent.

    typelist is a list of the C++ type patterns that the typemap will match. The general form of this list is as follows:

    typelist : typepattern [, typepattern, typepattern, ... ] ;
    
    typepattern : type [ (parms) ]
      | type name [ (parms) ]
      | ( typelist ) [ (parms) ]

    Each type pattern is either a simple type, a simple type and argument name, or a list of types in the case of multi-argument typemaps. In addition, each type pattern can be parameterized with a list of temporary variables (parms). The purpose of these variables will be explained shortly.

    code specifies the C code used in the typemap. It can take any one of the following forms:

    code : { ... }
      | " ... "
      | %{ ... %}

    For example, to convert integers from Ruby to C, you might define a typemap like this:

    %module example
    
    %typemap(in) int {
      $1 = (int) NUM2INT($input);
      printf("Received an integer : %d\n", $1);
    }
    
    %inline %{
      extern int fact(int n);
    %}

    Typemaps are always associated with some specific aspect of code generation. In this case, the "in" method refers to the conversion of input arguments to C/C++. The datatype int is the datatype to which the typemap will be applied. The supplied C code is used to convert values. In this code a number of special variables prefaced by a $ are used. The $1 variable is placeholder for a local variable of type int. The $input variable is the input Ruby object.

    When this example is compiled into a Ruby module, the following sample code:

    require 'example'
    
    puts Example.fact(6)

    prints the result:

    Received an integer : 6
    720
    

    In this example, the typemap is applied to all occurrences of the int datatype. You can refine this by supplying an optional parameter name. For example:

    %module example
    
    %typemap(in) int n {
      $1 = (int) NUM2INT($input);
      printf("n = %d\n", $1);
    }
    
    %inline %{
      extern int fact(int n);
    %}

    In this case, the typemap code is only attached to arguments that exactly match "int n".

    The application of a typemap to specific datatypes and argument names involves more than simple text-matching--typemaps are fully integrated into the SWIG type-system. When you define a typemap for int, that typemap applies to int and qualified variations such as const int. In addition, the typemap system follows typedef declarations. For example:

    %typemap(in) int n {
      $1 = (int) NUM2INT($input);
      printf("n = %d\n", $1);
    }
    
    typedef int Integer;
    extern int fact(Integer n); // Above typemap is applied

    However, the matching of typedef only occurs in one direction. If you defined a typemap for Integer, it is not applied to arguments of type int.

    Typemaps can also be defined for groups of consecutive arguments. For example:

    %typemap(in) (char *str, int len) {
      $1 = StringValuePtr($input);
      $2 = (int) RSTRING($input)->len;
    };
    
    int count(char c, char *str, int len);

    When a multi-argument typemap is defined, the arguments are always handled as a single Ruby object. This allows the function count to be used as follows (notice how the length parameter is omitted):

    puts Example.count('o', 'Hello World')
    2

    34.7.2 Typemap scope

    Once defined, a typemap remains in effect for all of the declarations that follow. A typemap may be redefined for different sections of an input file. For example:

    // typemap1
    %typemap(in) int {
      ...
    }
    
    int fact(int); // typemap1
    int gcd(int x, int y); // typemap1
    
    // typemap2
    %typemap(in) int {
      ...
    }
    
    int isprime(int); // typemap2

    One exception to the typemap scoping rules pertains to the %extend declaration. %extend is used to attach new declarations to a class or structure definition. Because of this, all of the declarations in an %extend block are subject to the typemap rules that are in effect at the point where the class itself is defined. For example:

    class Foo {
      ...
    };
    
    %typemap(in) int {
      ...
    }
    
    %extend Foo {
      int blah(int x); // typemap has no effect. Declaration is attached to Foo which 
      // appears before the %typemap declaration.
    };

    34.7.3 Copying a typemap

    A typemap is copied by using assignment. For example:

    %typemap(in) Integer = int;

    or this:

    %typemap(in) Integer, Number, int32_t = int;

    Types are often managed by a collection of different typemaps. For example:

    %typemap(in) int { ... }
    %typemap(out) int { ... }
    %typemap(varin) int { ... }
    %typemap(varout) int { ... }

    To copy all of these typemaps to a new type, use %apply. For example:

    %apply int { Integer }; // Copy all int typemaps to Integer
    %apply int { Integer, Number }; // Copy all int typemaps to both Integer and Number

    The patterns for %apply follow the same rules as for %typemap. For example:

    %apply int *output { Integer *output }; // Typemap with name
    %apply (char *buf, int len) { (char *buffer, int size) }; // Multiple arguments

    34.7.4 Deleting a typemap

    A typemap can be deleted by simply defining no code. For example:

    %typemap(in) int; // Clears typemap for int
    %typemap(in) int, long, short; // Clears typemap for int, long, short
    %typemap(in) int *output; 

    The %clear directive clears all typemaps for a given type. For example:

    %clear int; // Removes all types for int
    %clear int *output, long *output;

    Note: Since SWIG's default behavior is defined by typemaps, clearing a fundamental type like int will make that type unusable unless you also define a new set of typemaps immediately after the clear operation.

    34.7.5 Placement of typemaps

    Typemap declarations can be declared in the global scope, within a C++ namespace, and within a C++ class. For example:

    %typemap(in) int {
      ...
    }
    
    namespace std {
      class string;
      %typemap(in) string {
        ...
      }
    }
    
    class Bar {
    public:
      typedef const int & const_reference;
      %typemap(out) const_reference {
        ...
      }
    };

    When a typemap appears inside a namespace or class, it stays in effect until the end of the SWIG input (just like before). However, the typemap takes the local scope into account. Therefore, this code

    namespace std {
      class string;
      %typemap(in) string {
        ...
      }
    }

    is really defining a typemap for the type std::string. You could have code like this:

    namespace std {
      class string;
      %typemap(in) string { /* std::string */
      ...
      }
    }
    
    namespace Foo {
      class string;
      %typemap(in) string { /* Foo::string */
      ...
      }
    }

    In this case, there are two completely distinct typemaps that apply to two completely different types (std::string and Foo::string).

    It should be noted that for scoping to work, SWIG has to know that string is a typename defined within a particular namespace. In this example, this is done using the class declaration class string .

    34.7.6 Ruby typemaps

    The following list details all of the typemap methods that can be used by the Ruby module:

    34.7.6.1 "in" typemap

    Converts Ruby objects to input function arguments. For example:

    %typemap(in) int {
      $1 = NUM2INT($input);
    }

    The following special variables are available:

    $input Input object holding value to be converted.
    $symname Name of function/method being wrapped
    $1...n Argument being sent to the function
    $1_name Name of the argument (if provided)
    $1_type The actual C datatype matched by the typemap.
    $1_ltype The assignable version of the C datatype matched by the typemap.

    This is probably the most commonly redefined typemap because it can be used to implement customized conversions.

    In addition, the "in" typemap allows the number of converted arguments to be specified. For example:

    // Ignored argument.
    %typemap(in, numinputs=0) int *out (int temp) {
      $1 = &temp;
    }

    At this time, only zero or one arguments may be converted.

    34.7.6.2 "typecheck" typemap

    The "typecheck" typemap is used to support overloaded functions and methods. It merely checks an argument to see whether or not it matches a specific type. For example:

    %typemap(typecheck, precedence=SWIG_TYPECHECK_INTEGER) int {
      $1 = FIXNUM_P($input) ? 1 : 0;
    }

    For typechecking, the $1 variable is always a simple integer that is set to 1 or 0 depending on whether or not the input argument is the correct type.

    If you define new "in" typemaps and your program uses overloaded methods, you should also define a collection of "typecheck" typemaps. More details about this follow in a later section on "Typemaps and Overloading."

    34.7.6.3 "out" typemap

    Converts return value of a C function to a Ruby object.

    %typemap(out) int {
      $result = INT2NUM( $1 );
    }
    

    The following special variables are available.

    $result Result object returned to target language.
    $symname Name of function/method being wrapped
    $1...n Argument being wrapped
    $1_name Name of the argument (if provided)
    $1_type The actual C datatype matched by the typemap.
    $1_ltype The assignable version of the C datatype matched by the typemap.

    34.7.6.4 "arginit" typemap

    The "arginit" typemap is used to set the initial value of a function argument--before any conversion has occurred. This is not normally necessary, but might be useful in highly specialized applications. For example:

    // Set argument to NULL before any conversion occurs
    %typemap(arginit) int *data {
      $1 = NULL;
    }

    34.7.6.5 "default" typemap

    The "default" typemap is used to turn an argument into a default argument. For example:

    %typemap(default) int flags {
      $1 = DEFAULT_FLAGS;
    }
    ...
    int foo(int x, int y, int flags);

    The primary use of this typemap is to either change the wrapping of default arguments or specify a default argument in a language where they aren't supported (like C). Target languages that do not support optional arguments, such as Java and C#, effectively ignore the value specified by this typemap as all arguments must be given.

    Once a default typemap has been applied to an argument, all arguments that follow must have default values. See the Default/optional arguments section for further information on default argument wrapping.

    34.7.6.6 "check" typemap

    The "check" typemap is used to supply value checking code during argument conversion. The typemap is applied after arguments have been converted. For example:

    %typemap(check) int positive {
      if ($1 <= 0) {
        SWIG_exception(SWIG_ValueError, "Expected positive value.");
      }
    }

    34.7.6.7 "argout" typemap

    The "argout" typemap is used to return values from arguments. This is most commonly used to write wrappers for C/C++ functions that need to return multiple values. The "argout" typemap is almost always combined with an "in" typemap---possibly to ignore the input value. For example:

    /* Set the input argument to point to a temporary variable */
    %typemap(in, numinputs=0) int *out (int temp) {
      $1 = &temp;
    }
    
    %typemap(argout, fragment="output_helper") int *out {
      // Append output value $1 to $result (assuming a single integer in this case)
      $result = output_helper( $result, INT2NUM(*$1) );
    }

    The following special variables are available.

    $result Result object returned to target language.
    $input The original input object passed.
    $symname Name of function/method being wrapped.

    The code supplied to the "argout" typemap is always placed after the "out" typemap. If multiple return values are used, the extra return values are often appended to return value of the function.

    Output helper is a fragment that usually defines a macro to some function like SWIG_Ruby_AppendOutput.

    See the typemaps.i library for examples.

    34.7.6.8 "freearg" typemap

    The "freearg" typemap is used to cleanup argument data. It is only used when an argument might have allocated resources that need to be cleaned up when the wrapper function exits. The "freearg" typemap usually cleans up argument resources allocated by the "in" typemap. For example:

    // Get a list of integers
    %typemap(in) int *items {
      int nitems = Length($input); 
      $1 = (int *) malloc(sizeof(int)*nitems);
    }
    // Free the list 
    %typemap(freearg) int *items {
      free($1);
    }

    The "freearg" typemap inserted at the end of the wrapper function, just before control is returned back to the target language. This code is also placed into a special variable $cleanup that may be used in other typemaps whenever a wrapper function needs to abort prematurely.

    34.7.6.9 "newfree" typemap

    The "newfree" typemap is used in conjunction with the %newobject directive and is used to deallocate memory used by the return result of a function. For example:

    %typemap(newfree) string * {
      delete $1;
    }
    %typemap(out) string * {
      $result = PyString_FromString($1->c_str());
    }
    ...
    
    %newobject foo;
    ...
    string *foo();

    See Object ownership and %newobject for further details.

    34.7.6.10 "memberin" typemap

    The "memberin" typemap is used to copy data from an already converted input value into a structure member. It is typically used to handle array members and other special cases. For example:

    %typemap(memberin) int [4] {
      memmove($1, $input, 4*sizeof(int));
    }

    It is rarely necessary to write "memberin" typemaps---SWIG already provides a default implementation for arrays, strings, and other objects.

    34.7.6.11 "varin" typemap

    The "varin" typemap is used to convert objects in the target language to C for the purposes of assigning to a C/C++ global variable. This is implementation specific.

    34.7.6.12 "varout" typemap

    The "varout" typemap is used to convert a C/C++ object to an object in the target language when reading a C/C++ global variable. This is implementation specific.

    34.7.6.13 "throws" typemap

    The "throws" typemap is only used when SWIG parses a C++ method with an exception specification or has the %catches feature attached to the method. It provides a default mechanism for handling C++ methods that have declared the exceptions they will throw. The purpose of this typemap is to convert a C++ exception into an error or exception in the target language. It is slightly different to the other typemaps as it is based around the exception type rather than the type of a parameter or variable. For example:

    %typemap(throws) const char * %{
      rb_raise(rb_eRuntimeError, $1);
      SWIG_fail;
    %}
    void bar() throw (const char *);

    As can be seen from the generated code below, SWIG generates an exception handler with the catch block comprising the "throws" typemap content.

    ...
    try {
      bar();
    }
    catch(char const *_e) {
      rb_raise(rb_eRuntimeError, _e);
      SWIG_fail;
    }
    ...

    Note that if your methods do not have an exception specification yet they do throw exceptions, SWIG cannot know how to deal with them. For a neat way to handle these, see the Exception handling with %exception section.

    34.7.6.14 directorin typemap

    Converts C++ objects in director member functions to ruby objects. It is roughly the opposite of the "in" typemap, making its typemap rule often similar to the "out" typemap.

    %typemap(directorin) int {
      $result = INT2NUM($1);
    }
    

    The following special variables are available.

    $result Result object returned to target language.
    $symname Name of function/method being wrapped
    $1...n Argument being wrapped
    $1_name Name of the argument (if provided)
    $1_type The actual C datatype matched by the typemap.
    $1_ltype The assignable version of the C datatype matched by the typemap.
    this C++ this, referring to the class itself.

    34.7.6.15 directorout typemap

    Converts Ruby objects in director member functions to C++ objects. It is roughly the opposite of the "out" typemap, making its rule often similar to the "in" typemap.

    %typemap(directorout) int {
      $result = NUM2INT($1);
    }
    

    The following special variables are available:

    $inputRuby object being sent to the function
    $symnameName of function/method being wrapped
    $1...nArgument being sent to the function
    $1_name Name of the argument (if provided)
    $1_type The actual C datatype matched by the typemap.
    $1_ltype The assignable version of the C datatype matched by the typemap.
    this C++ this, referring to the class itself.

    Currently, the directorout nor the out typemap support the option numoutputs, but the Ruby module provides that functionality through a %feature directive. Thus, a function can be made to return "nothing" if you do:

    %feature("numoutputs", "0") MyClass::function;
    

    This feature can be useful if a function returns a status code, which you want to discard but still use the typemap to raise an exception.

    34.7.6.16 directorargout typemap

    Output argument processing in director member functions.

    %typemap(directorargout,
    fragment="output_helper") int {
      $result = output_helper( $result, NUM2INT($1) );
    }
    

    The following special variables are available:

    $resultResult that the director function returns
    $inputRuby object being sent to the function
    $symnamename of the function/method being wrapped
    $1...nArgument being sent to the function
    $1_nameName of the argument (if provided)
    $1_typeThe actual C datatype matched by the typemap
    $1_ltypeThe assignable version of the C datatype matched by the typemap
    thisC++ this, referring to the instance of the class itself

    34.7.6.17 ret typemap

    Cleanup of function return values

    34.7.6.18 globalin typemap

    Setting of C global variables

    34.7.7 Typemap variables

    Within a typemap, a number of special variables prefaced with a $ may appear. A full list of variables can be found in the " Typemaps" chapter. This is a list of the most common variables:

    $1

    A C local variable corresponding to the actual type specified in the %typemap directive. For input values, this is a C local variable that is supposed to hold an argument value. For output values, this is the raw result that is supposed to be returned to Ruby.

    $input

    A VALUE holding a raw Ruby object with an argument or variable value.

    $result

    A VALUE that holds the result to be returned to Ruby.

    $1_name

    The parameter name that was matched.

    $1_type

    The actual C datatype matched by the typemap.

    $1_ltype

    An assignable version of the datatype matched by the typemap (a type that can appear on the left-hand-side of a C assignment operation). This type is stripped of qualifiers and may be an altered version of $1_type. All arguments and local variables in wrapper functions are declared using this type so that their values can be properly assigned.

    $symname

    The Ruby name of the wrapper function being created.

    34.7.8 Useful Functions

    When you write a typemap, you usually have to work directly with Ruby objects. The following functions may prove to be useful. (These functions plus many more can be found in Programming Ruby book, by David Thomas and Andrew Hunt.)

    In addition, we list equivalent functions that SWIG defines, which provide a language neutral conversion (these functions are defined for each swig language supported). If you are trying to create a swig file that will work under multiple languages, it is recommended you stick to the swig functions instead of the native Ruby functions. That should help you avoid having to rewrite a lot of typemaps across multiple languages.

    34.7.8.1 C Datatypes to Ruby Objects

    RUBYSWIG
    INT2NUM(long or int)SWIG_From_int(int x) int to Fixnum or Bignum
    INT2FIX(long or int) int to Fixnum (faster than INT2NUM)
    CHR2FIX(char)SWIG_From_char(char x) char to Fixnum
    rb_str_new2(char*)SWIG_FromCharPtrAndSize(char*, size_t) char* to String
    rb_float_new(double)SWIG_From_double(double),
    SWIG_From_float(float)
    float/double to Float

    34.7.8.2 Ruby Objects to C Datatypes

    Here, while the Ruby versions return the value directly, the SWIG versions do not, but return a status value to indicate success ( SWIG_OK). While more awkward to use, this allows you to write typemaps that report more helpful error messages, like:

    %typemap(in) size_t (int ok)
      ok = SWIG_AsVal_size_t($input, &$1);
      if (!SWIG_IsOK(ok)) {
        SWIG_exception_fail(SWIG_ArgError(ok), Ruby_Format_TypeError( "$1_name", "$1_type", "$symname", $argnum, $input));
      }
    }
    
    int NUM2INT(Numeric)SWIG_AsVal_int(VALUE, int*)
    int FIX2INT(Numeric)SWIG_AsVal_int(VALUE, int*)
    unsigned int NUM2UINT(Numeric) SWIG_AsVal_unsigned_SS_int(VALUE, int*)
    unsigned int FIX2UINT(Numeric) SWIG_AsVal_unsigned_SS_int(VALUE, int*)
    long NUM2LONG(Numeric)SWIG_AsVal_long(VALUE, long*)
    long FIX2LONG(Numeric)SWIG_AsVal_long(VALUE, long*)
    unsigned long FIX2ULONG(Numeric) SWIG_AsVal_unsigned_SS_long(VALUE, unsigned long*)
    char NUM2CHR(Numeric or String)SWIG_AsVal_char(VALUE, int*)
    char * StringValuePtr(String) SWIG_AsCharPtrAndSize(VALUE, char*, size_t, int* alloc)
    char * rb_str2cstr(String, int*length)
    double NUM2DBL(Numeric)(double) SWIG_AsVal_int(VALUE) or similar

    34.7.8.3 Macros for VALUE

    RSTRING_LEN(str)

    length of the Ruby string

    RSTRING_PTR(str)

    pointer to string storage

    RARRAY_LEN(arr)

    length of the Ruby array

    RARRAY(arr)->capa

    capacity of the Ruby array

    RARRAY_PTR(arr)

    pointer to array storage

    34.7.8.4 Exceptions

    void rb_raise(VALUE exception, const char *fmt, ...)

    Raises an exception. The given format string fmt and remaining arguments are interpreted as with printf().

    void rb_fatal(const char *fmt, ...)

    Raises a fatal exception, terminating the process. No rescue blocks are called, but ensure blocks will be called. The given format string fmt and remaining arguments are interpreted as with printf().

    void rb_bug(const char *fmt, ...)

    Terminates the process immediately -- no handlers of any sort will be called. The given format string fmt and remaining arguments are interpreted as with printf(). You should call this function only if a fatal bug has been exposed.

    void rb_sys_fail(const char *msg)

    Raises a platform-specific exception corresponding to the last known system error, with the given string msg.

    VALUE rb_rescue(VALUE (*body)(VALUE), VALUE args, VALUE(*rescue)(VALUE, VALUE), VALUE rargs)

    Executes body with the given args. If a StandardError exception is raised, then execute rescue with the given rargs.

    VALUE rb_ensure(VALUE(*body)(VALUE), VALUE args, VALUE(*ensure)(VALUE), VALUE eargs)

    Executes body with the given args. Whether or not an exception is raised, execute ensure with the given rargs after body has completed.

    VALUE rb_protect(VALUE (*body)(VALUE), VALUE args, int *result)

    Executes body with the given args and returns nonzero in result if any exception was raised.

    void rb_notimplement()

    Raises a NotImpError exception to indicate that the enclosed function is not implemented yet, or not available on this platform.

    void rb_exit(int status)

    Exits Ruby with the given status. Raises a SystemExit exception and calls registered exit functions and finalizers.

    void rb_warn(const char *fmt, ...)

    Unconditionally issues a warning message to standard error. The given format string fmt and remaining arguments are interpreted as with printf().

    void rb_warning(const char *fmt, ...)

    Conditionally issues a warning message to standard error if Ruby was invoked with the -w flag. The given format string fmt and remaining arguments are interpreted as with printf().

    34.7.8.5 Iterators

    void rb_iter_break()

    Breaks out of the enclosing iterator block.

    VALUE rb_each(VALUE obj)

    Invokes the each method of the given obj.

    VALUE rb_yield(VALUE arg)

    Transfers execution to the iterator block in the current context, passing arg as an argument. Multiple values may be passed in an array.

    int rb_block_given_p()

    Returns true if yield would execute a block in the current context; that is, if a code block was passed to the current method and is available to be called.

    VALUE rb_iterate(VALUE (*method)(VALUE), VALUE args, VALUE (*block)(VALUE, VALUE), VALUE arg2)

    Invokes method with argument args and block block. A yield from that method will invoke block with the argument given to yield, and a second argument arg2.

    VALUE rb_catch(const char *tag, VALUE (*proc)(VALUE, VALUE), VALUE value)

    Equivalent to Ruby's catch.

    void rb_throw(const char *tag, VALUE value)

    Equivalent to Ruby's throw.

    34.7.9 Typemap Examples

    This section includes a few examples of typemaps. For more examples, you might look at the examples in the Example/ruby directory.

    34.7.10 Converting a Ruby array to a char **

    A common problem in many C programs is the processing of command line arguments, which are usually passed in an array of NULL terminated strings. The following SWIG interface file allows a Ruby Array instance to be used as a char ** object.

    %module argv
    
    // This tells SWIG to treat char ** as a special case
    %typemap(in) char ** {
      /* Get the length of the array */
      int size = RARRAY($input)->len; 
      int i;
      $1 = (char **) malloc((size+1)*sizeof(char *));
      /* Get the first element in memory */
      VALUE *ptr = RARRAY($input)->ptr; 
      for (i=0; i < size; i++, ptr++) {
        /* Convert Ruby Object String to char* */
        $1[i]= StringValuePtr(*ptr); 
      }
      $1[i]=NULL; /* End of list */
    }
    
    // This cleans up the char ** array created before 
    // the function call
    
    %typemap(freearg) char ** {
      free((char *) $1);
    }
    
    // Now a test function
    %inline %{
    int print_args(char **argv) {
      int i = 0;
      while (argv[i]) {
        printf("argv[%d] = %s\n", i, argv[i]);
        i++;
      }
      return i;
    }
    %}

    When this module is compiled, the wrapped C function now operates as follows :

    require 'Argv'
    Argv.print_args(["Dave", "Mike", "Mary", "Jane", "John"])
    argv[0] = Dave
    argv[1] = Mike
    argv[2] = Mary
    argv[3] = Jane
    argv[4] = John

    In the example, two different typemaps are used. The "in" typemap is used to receive an input argument and convert it to a C array. Since dynamic memory allocation is used to allocate memory for the array, the "freearg" typemap is used to later release this memory after the execution of the C function.

    34.7.11 Collecting arguments in a hash

    Ruby's solution to the "keyword arguments" capability of some other languages is to allow the programmer to pass in one or more key-value pairs as arguments to a function. All of those key-value pairs are collected in a single Hash argument that's presented to the function. If it makes sense, you might want to provide similar functionality for your Ruby interface. For example, suppose you'd like to wrap this C function that collects information about people's vital statistics:

    void setVitalStats(const char *person, int nattributes, const char **names, int *values);

    and you'd like to be able to call it from Ruby by passing in an arbitrary number of key-value pairs as inputs, e.g.

    setVitalStats("Fred", 
      'weight' => 270, 
      'age' => 42 
    )

    To make this work, you need to write a typemap that expects a Ruby Hash as its input and somehow extracts the last three arguments ( nattributes, names and values) needed by your C function. Let's start with the basics:

    %typemap(in) (int nattributes, const char **names, const int *values)
      (VALUE keys_arr, int i, VALUE key, VALUE val) {
    }
     

    This %typemap directive tells SWIG that we want to match any function declaration that has the specified types and names of arguments somewhere in the argument list. The fact that we specified the argument names (nattributes, names and values) in our typemap is significant; this ensures that SWIG won't try to apply this typemap to other functions it sees that happen to have a similar declaration with different argument names. The arguments that appear in the second set of parentheses (keys_arr, i , key and val) define local variables that our typemap will need.

    Since we expect the input argument to be a Hash, let's next add a check for that:

    %typemap(in) (int nattributes, const char **names, const int *values)
      (VALUE keys_arr, int i, VALUE key, VALUE val) {
        Check_Type($input, T_HASH);
    }

    Check_Type() is just a macro (defined in the Ruby header files) that confirms that the input argument is of the correct type; if it isn't, an exception will be raised.

    The next task is to determine how many key-value pairs are present in the hash; we'll assign this number to the first typemap argument ( $1). This is a little tricky since the Ruby/C API doesn't provide a public function for querying the size of a hash, but we can get around that by calling the hash's size method directly and converting its result to a C int value:

    %typemap(in) (int nattributes, const char **names, const int *values)
      (VALUE keys_arr, int i, VALUE key, VALUE val) {
        Check_Type($input, T_HASH);
        $1 = NUM2INT(rb_funcall($input, rb_intern("size"), 0, Qnil));
    }

    So now we know the number of attributes. Next we need to initialize the second and third typemap arguments (i.e. the two C arrays) to NULL and set the stage for extracting the keys and values from the hash:

    %typemap(in) (int nattributes, const char **names, const int *values)
      (VALUE keys_arr, int i, VALUE key, VALUE val) {
        Check_Type($input, T_HASH);
        $1 = NUM2INT(rb_funcall($input, rb_intern("size"), 0, Qnil));
        $2 = NULL;
        $3 = NULL;
        if ($1 > 0) {
          $2 = (char **) malloc($1*sizeof(char *));
          $3 = (int *) malloc($1*sizeof(int));
        }
    }

    There are a number of ways we could extract the keys and values from the input hash, but the simplest approach is to first call the hash's keys method (which returns a Ruby array of the keys) and then start looping over the elements in that array:

    %typemap(in) (int nattributes, const char **names, const int *values)
      (VALUE keys_arr, int i, VALUE key, VALUE val) {
        Check_Type($input, T_HASH);
        $1 = NUM2INT(rb_funcall($input, rb_intern("size"), 0, Qnil));
        $2 = NULL;
        $3 = NULL;
        if ($1 > 0) {
          $2 = (char **) malloc($1*sizeof(char *));
          $3 = (int *) malloc($1*sizeof(int));
          keys_arr = rb_funcall($input, rb_intern("keys"), 0, Qnil);
          for (i = 0; i < $1; i++) {
          }
        }
    }

    Recall that keys_arr and i are local variables for this typemap. For each element in the keys_arr array, we want to get the key itself, as well as the value corresponding to that key in the hash:

    %typemap(in) (int nattributes, const char **names, const int *values)
      (VALUE keys_arr, int i, VALUE key, VALUE val) {
        Check_Type($input, T_HASH);
        $1 = NUM2INT(rb_funcall($input, rb_intern("size"), 0, Qnil));
        $2 = NULL;
        $3 = NULL;
        if ($1 > 0) {
          $2 = (char **) malloc($1*sizeof(char *));
          $3 = (int *) malloc($1*sizeof(int));
          keys_arr = rb_funcall($input, rb_intern("keys"), 0, Qnil);
          for (i = 0; i < $1; i++) {
            key = rb_ary_entry(keys_arr, i);
            val = rb_hash_aref($input, key);
          }
        }
    }

    To be safe, we should again use the Check_Type() macro to confirm that the key is a String and the value is a Fixnum :

    %typemap(in) (int nattributes, const char **names, const int *values)
      (VALUE keys_arr, int i, VALUE key, VALUE val) {
        Check_Type($input, T_HASH);
        $1 = NUM2INT(rb_funcall($input, rb_intern("size"), 0, Qnil));
        $2 = NULL;
        $3 = NULL;
        if ($1 > 0) {
          $2 = (char **) malloc($1*sizeof(char *));
          $3 = (int *) malloc($1*sizeof(int));
          keys_arr = rb_funcall($input, rb_intern("keys"), 0, Qnil);
          for (i = 0; i < $1; i++) {
            key = rb_ary_entry(keys_arr, i);
            val = rb_hash_aref($input, key);
            Check_Type(key, T_STRING);
            Check_Type(val, T_FIXNUM);
          }
        }
    }

    Finally, we can convert these Ruby objects into their C equivalents and store them in our local C arrays:

    %typemap(in) (int nattributes, const char **names, const int *values)
      (VALUE keys_arr, int i, VALUE key, VALUE val) {
      Check_Type($input, T_HASH);
      $1 = NUM2INT(rb_funcall($input, rb_intern("size"), 0, Qnil));
      $2 = NULL;
      $3 = NULL;
      if ($1 > 0) {
        $2 = (char **) malloc($1*sizeof(char *));
        $3 = (int *) malloc($1*sizeof(int));
        keys_arr = rb_funcall($input, rb_intern("keys"), 0, Qnil);
        for (i = 0; i < $1; i++) {
          key = rb_ary_entry(keys_arr, i);
          val = rb_hash_aref($input, key);
          Check_Type(key, T_STRING);
          Check_Type(val, T_FIXNUM);
          $2[i] = StringValuePtr(key);
          $3[i] = NUM2INT(val);
        }
      }
    }

    We're not done yet. Since we used malloc() to dynamically allocate the memory used for the names and values arguments, we need to provide a corresponding "freearg" typemap to free that memory so that there is no memory leak. Fortunately, this typemap is a lot easier to write:

    %typemap(freearg) (int nattributes, const char **names, const int *values) {
      free((void *) $2);
      free((void *) $3);
    }

    All of the code for this example, as well as a sample Ruby program that uses the extension, can be found in the Examples/ruby/hashargs directory of the SWIG distribution.

    34.7.12 Pointer handling

    Occasionally, it might be necessary to convert pointer values that have been stored using the SWIG typed-pointer representation. Since there are several ways in which pointers can be represented, the following two functions are used to safely perform this conversion:

    int SWIG_ConvertPtr(VALUE obj, void **ptr, swig_type_info *ty, int flags)

    Converts a Ruby object obj to a C pointer whose address is ptr (i.e. ptr is a pointer to a pointer). The third argument, ty, is a pointer to a SWIG type descriptor structure. If ty is not NULL, that type information is used to validate type compatibility and other aspects of the type conversion. If flags is non-zero, any type errors encountered during this validation result in a Ruby TypeError exception being raised; if flags is zero, such type errors will cause SWIG_ConvertPtr() to return -1 but not raise an exception. If ty is NULL, no type-checking is performed.

    VALUE SWIG_NewPointerObj(void *ptr, swig_type_info *ty, int own)

    Creates a new Ruby pointer object. Here, ptr is the pointer to convert, ty is the SWIG type descriptor structure that describes the type, and own is a flag that indicates whether or not Ruby should take ownership of the pointer (i.e. whether Ruby should free this data when the corresponding Ruby instance is garbage-collected).

    Both of these functions require the use of a special SWIG type-descriptor structure. This structure contains information about the mangled name of the datatype, type-equivalence information, as well as information about converting pointer values under C++ inheritance. For a type of Foo *, the type descriptor structure is usually accessed as follows:

    Foo *foo;
    SWIG_ConvertPtr($input, (void **) &foo, SWIGTYPE_p_Foo, 1);
    
    VALUE obj;
    obj = SWIG_NewPointerObj(f, SWIGTYPE_p_Foo, 0);

    In a typemap, the type descriptor should always be accessed using the special typemap variable $1_descriptor. For example:

    %typemap(in) Foo * {
      SWIG_ConvertPtr($input, (void **) &$1, $1_descriptor, 1);
    }

    34.7.12.1 Ruby Datatype Wrapping

    VALUE Data_Wrap_Struct(VALUE class, void (*mark)(void *), void (*free)(void *), void *ptr)

    Given a pointer ptr to some C data, and the two garbage collection routines for this data (mark and free ), return a VALUE for the Ruby object.

    VALUE Data_Make_Struct(VALUE class, c-type, void (*mark)(void *), void (*free)(void *), c-type *ptr)

    Allocates a new instance of a C data type c-type , assigns it to the pointer ptr, then wraps that pointer with Data_Wrap_Struct() as above.

    Data_Get_Struct(VALUE obj, c-type, c-type *ptr)

    Retrieves the original C pointer of type c-type from the data object obj and assigns that pointer to ptr.

    34.7.13 Example: STL Vector to Ruby Array

    Another use for macros and type maps is to create a Ruby array from a STL vector of pointers. In essence, copy of all the pointers in the vector into a Ruby array. The use of the macro is to make the typemap so generic that any vector with pointers can use the type map. The following is an example of how to construct this type of macro/typemap and should give insight into constructing similar typemaps for other STL structures:

    %define PTR_VECTOR_TO_RUBY_ARRAY(vectorclassname, classname)
    %typemap(out) vectorclassname &, const vectorclassname & {
      VALUE arr = rb_ary_new2($1->size());
      vectorclassname::iterator i = $1->begin(), iend = $1->end();
      for ( ; i!=iend; i++ )
        rb_ary_push(arr, Data_Wrap_Struct(c ## classname.klass, 0, 0, *i));
      $result = arr;
    }
    %typemap(out) vectorclassname, const vectorclassname {
      VALUE arr = rb_ary_new2($1.size());
      vectorclassname::iterator i = $1.begin(), iend = $1.end();
      for ( ; i!=iend; i++ )
        rb_ary_push(arr, Data_Wrap_Struct(c ## classname.klass, 0, 0, *i));
      $result = arr;
    }
    %enddef

    Note, that the "c ## classname.klass" is used in the preprocessor step to determine the actual object from the class name.

    To use the macro with a class Foo, the following is used:

    PTR_VECTOR_TO_RUBY_ARRAY(vector<foo *="">, Foo)

    It is also possible to create a STL vector of Ruby objects:

    %define RUBY_ARRAY_TO_PTR_VECTOR(vectorclassname, classname)
    %typemap(in) vectorclassname &, const vectorclassname & {
      Check_Type($input, T_ARRAY);
      vectorclassname *vec = new vectorclassname;
      int len = RARRAY($input)->len;
      for (int i=0; i!=len; i++) {
        VALUE inst = rb_ary_entry($input, i);
        //The following _should_ work but doesn't on HPUX
        // Check_Type(inst, T_DATA);
        classname *element = NULL;
        Data_Get_Struct(inst, classname, element);
        vec->push_back(element);
      }
      $1 = vec;
    }
    
    %typemap(freearg) vectorclassname &, const vectorclassname & {
      delete $1;
    }
    %enddef

    It is also possible to create a Ruby array from a vector of static data types:

    %define VECTOR_TO_RUBY_ARRAY(vectorclassname, classname)
    %typemap(out) vectorclassname &, const vectorclassname & {
      VALUE arr = rb_ary_new2($1->size()); 
      vectorclassname::iterator i = $1->begin(), iend = $1->end();
      for ( ; i!=iend; i++ )
        rb_ary_push(arr, Data_Wrap_Struct(c ## classname.klass, 0, 0, &(*i)));
      $result = arr;
    }
    %typemap(out) vectorclassname, const vectorclassname {
      VALUE arr = rb_ary_new2($1.size()); 
      vectorclassname::iterator i = $1.begin(), iend = $1.end();
      for ( ; i!=iend; i++ )
        rb_ary_push(arr, Data_Wrap_Struct(c ## classname.klass, 0, 0, &(*i)));
      $result = arr;
    }
    %enddef
    Note that this is mostly an example of typemaps. If you want to use the STL with ruby, you are advised to use the standard swig STL library, which does much more than this. Refer to the section called the C++ Standard Template Library.

    34.8 Docstring Features

    Using ri and rdoc web pages in Ruby libraries is a common practice. Given the way that SWIG generates the extensions by default, your users will normally not get any documentation for it, even if they run 'rdoc' on the resulting .c or .cxx file.

    The features described in this section make it easy for you to add rdoc strings to your modules, functions and methods that can then be read by Ruby's rdoc tool to generate html web pages, ri documentation, Windows chm file and an .xml description.

    rdoc can then be run from a console or shell window on a swig generated file.

    For example, to generate html web pages from a C++ file, you'd do:

    $ rdoc -E cxx=c -f html file_wrap.cxx
    

    To generate ri documentation from a c wrap file, you could do:

    $ rdoc -r file_wrap.c
    

    34.8.1 Module docstring

    Ruby allows a docstring at the beginning of the file before any other statements, and it is typically used to give a general description of the entire module. SWIG supports this by setting an option of the %module directive. For example:

    %module(docstring="This is the example module's docstring") example

    When you have more than just a line or so then you can retain the easy readability of the %module directive by using a macro. For example:

    %define DOCSTRING
    "The `XmlResource` class allows program resources defining menus, 
    layout of controls on a panel, etc. to be loaded from an XML file."
    %enddef
    
    %module(docstring=DOCSTRING) xrc

    34.8.2 %feature("autodoc")

    Since SWIG does know everything about the function it wraps, it is possible to generate an rdoc containing the parameter types, names and default values. Since Ruby ships with one of the best documentation systems of any language, it makes sense to take advantage of it.

    SWIG's Ruby module provides support for the "autodoc" feature, which when attached to a node in the parse tree will cause an rdoc comment to be generated in the wrapper file that includes the name of the function, parameter names, default values if any, and return type if any. There are also several options for autodoc controlled by the value given to the feature, described below.

    34.8.2.1 %feature("autodoc", "0")

    When the "0" option is given then the types of the parameters will not be included in the autodoc string. For example, given this function prototype:

    %feature("autodoc", "0");
    bool function_name(int x, int y, Foo* foo=NULL, Bar* bar=NULL);

    Then Ruby code like this will be generated:

    function_name(x, y, foo=nil, bar=nil) -> bool
      ...

    34.8.2.2 %feature("autodoc", "1")

    When the "1" option is used then the parameter types will be used in the rdoc string. In addition, an attempt is made to simplify the type name such that it makes more sense to the Ruby user. Pointer, reference and const info is removed, %rename's are evaluated, etc. (This is not always successful, but works most of the time. See the next section for what to do when it doesn't.) Given the example above, then turning on the parameter types with the "1" option will result in rdoc code like this:

    function_name(int x, int y, Foo foo=nil, Bar bar=nil) -> bool
      ...

    34.8.2.3 %feature("autodoc", "2")

    When the "2" option is used then the parameter types will not be used in the rdoc string. However, they will be listed in full after the function. Given the example above, then turning on the parameter types with the "2" option will result in Ruby code like this:

    34.8.2.4 %feature("autodoc", "3")

    When the "3" option is used then the function will be documented using a combination of "1" and "2" above. Given the example above, then turning on the parameter types with the "2" option will result in Ruby code like this:

    function_name(int x, int y, Foo foo=nil, Bar bar=nil) -> bool
    
    Parameters:
            x - int
            y - int
            foo - Foo
            bar - Bar

    34.8.2.5 %feature("autodoc", "docstring")

    Finally, there are times when the automatically generated autodoc string will make no sense for a Ruby programmer, particularly when a typemap is involved. So if you give an explicit value for the autodoc feature then that string will be used in place of the automatically generated string. For example:

    %feature("autodoc", "GetPosition() -> (x, y)") GetPosition;
    void GetPosition(int* OUTPUT, int* OUTPUT);

    34.8.3 %feature("docstring")

    In addition to the autodoc strings described above, you can also attach any arbitrary descriptive text to a node in the parse tree with the "docstring" feature. When the proxy module is generated then any docstring associated with classes, function or methods are output. If an item already has an autodoc string then it is combined with the docstring and they are output together.

    34.9 Advanced Topics

    34.9.1 Operator overloading

    SWIG allows operator overloading with, by using the %extend or %rename commands in SWIG and the following operator names (derived from Python):

    General
    __repr__ inspect
    __str__ to_s
    __cmp__ <=>
    __hash__ hash
    __nonzero__ nonzero?
    Callable
    __call__ call
    Collection
    __len__ length
    __getitem__ []
    __setitem__ []=
    Numeric
    __add__ +
    __sub__ -
    __mul__ *
    __div__ /
    __mod__ %
    __divmod__ divmod
    __pow__ **
    __lshift__ <<
    __rshift__ >>
    __and__ &
    __xor__ ^
    __or__ |
    __neg__ -@
    __pos__ +@
    __abs__ abs
    __invert__ ~
    __int__ to_i
    __float__ to_f
    __coerce__ coerce
    Additions in 1.3.13
    __lt__ <
    __le__ <=
    __eq__ ==
    __gt__ >
    __ge__ >=

    Note that although SWIG supports the __eq__ magic method name for defining an equivalence operator, there is no separate method for handling inequality since Ruby parses the expression a != b as !(a == b).

    34.9.2 Creating Multi-Module Packages

    The chapter on Working with Modules discusses the basics of creating multi-module extensions with SWIG, and in particular the considerations for sharing runtime type information among the different modules.

    As an example, consider one module's interface file (shape.i ) that defines our base class:

    %module shape
    
    %{
    #include "Shape.h"
    %}
    
    class Shape {
    protected:
      double xpos;
      double ypos;
    protected:
      Shape(double x, double y);
    public:
      double getX() const;
      double getY() const;
    };

    We also have a separate interface file (circle.i) that defines a derived class:

    %module circle
    
    %{
    #include "Shape.h"
    #include "Circle.h"
    %}
    
    // Import the base class definition from Shape module
    %import shape.i
    
    class Circle : public Shape {
    protected:
      double radius;
    public:
      Circle(double x, double y, double r);
      double getRadius() const;
    };

    We'll start by building the Shape extension module:

    $ swig -c++ -ruby shape.i
    

    SWIG generates a wrapper file named shape_wrap.cxx. To compile this into a dynamically loadable extension for Ruby, prepare an extconf.rb script using this template:

    require 'mkmf'
    
    # Since the SWIG runtime support library for Ruby
    # depends on the Ruby library, make sure it's in the list
    # of libraries.
    $libs = append_library($libs, Config::CONFIG['RUBY_INSTALL_NAME'])
    
    # Create the makefile
    create_makefile('shape')

    Run this script to create a Makefile and then type make to build the shared library:

    $ ruby extconf.rb
    creating Makefile
    $ make
    g++ -fPIC -g -O2 -I. -I/usr/include/ruby-2.1.0 \
    -I. -c shape_wrap.cxx
    gcc -shared -L/usr/local/lib -o shape.so shape_wrap.o -L. \
    -lruby -lruby -lc

    Note that depending on your installation, the outputs may be slightly different; these outputs are those for a Linux-based development environment. The end result should be a shared library (here, shape.so) containing the extension module code. Now repeat this process in a separate directory for the Circle module:

    1. Run SWIG to generate the wrapper code (circle_wrap.cxx);
    2. Write an extconf.rb script that your end-users can use to create a platform-specific Makefile for the extension;
    3. Build the shared library for this extension by typing make .

    Once you've built both of these extension modules, you can test them interactively in IRB to confirm that the Shape and Circle modules are properly loaded and initialized:

    $ irb
    irb(main):001:0> require 'shape'
    true
    irb(main):002:0> require 'circle'
    true
    irb(main):003:0> c = Circle::Circle.new(5, 5, 20)
    #<Circle::Circle:0xa097208>
    irb(main):004:0> c.kind_of? Shape::Shape
    true
    irb(main):005:0> c.getX()
    5.0

    34.9.3 Specifying Mixin Modules

    The Ruby language doesn't support multiple inheritance, but it does allow you to mix one or more modules into a class using Ruby's include method. For example, if you have a Ruby class that defines an each instance method, e.g.

    class Set
      def initialize
      @members = []
      end
     
      def each
      @members.each { |m| yield m }
      end
    end

    then you can mix-in Ruby's Enumerable module to easily add a lot of functionality to your class:

    class Set
      include Enumerable
      def initialize
        @members = []
      end
      def each
        @members.each { |m| yield m }
      end
    end

    To get the same benefit for your SWIG-wrapped classes, you can use the %mixin directive to specify the names of one or more modules that should be mixed-in to a class. For the above example, the SWIG interface specification might look like this:

    %mixin Set "Enumerable";
    
    class Set {
    public:
      // Constructor
      Set();
     
      // Iterates through set members
      void each();
    };

    Multiple modules can be mixed into a class by providing a comma-separated list of module names to the %mixin directive, e.g.

    %mixin Set "Fee, Fi, Fo, Fum";

    Note that the %mixin directive is implemented using SWIG's "features" mechanism and so the same name matching rules used for other kinds of features apply (see the chapter on "Customization Features") for more details).

    34.10 Memory Management

    One of the most common issues in generating SWIG bindings for Ruby is proper memory management. The key to proper memory management is clearly defining whether a wrapper Ruby object owns the underlying C struct or C++ class. There are two possibilities:

    • The Ruby object is responsible for freeing the C struct or C++ object
    • The Ruby object should not free the C struct or C++ object because it will be freed by the underlying C or C++ code

    To complicate matters, object ownership may transfer from Ruby to C++ (or vice versa) depending on what function or methods are invoked. Clearly, developing a SWIG wrapper requires a thorough understanding of how the underlying library manages memory.

    34.10.1 Mark and Sweep Garbage Collector

    Ruby uses a mark and sweep garbage collector. When the garbage collector runs, it finds all the "root" objects, including local variables, global variables, global constants, hardware registers and the C stack. For each root object, the garbage collector sets its mark flag to true and calls rb_gc_mark on the object. The job of rb_gc_mark is to recursively mark all the objects that a Ruby object has a reference to (ignoring those objects that have already been marked). Those objects, in turn, may reference other objects. This process will continue until all active objects have been "marked." After the mark phase comes the sweep phase. In the sweep phase, all objects that have not been marked will be garbage collected.

    The Ruby C/API provides extension developers two hooks into the garbage collector - a "mark" function and a "sweep" function. By default these functions are set to NULL.

    If a C struct or C++ class references any other Ruby objects, then it must provide a "mark" function. The "mark" function should identify any referenced Ruby objects by calling the rb_gc_mark function for each one. Unsurprisingly, this function will be called by the Ruby garbage during the "mark" phase.

    During the sweep phase, Ruby destroys any unused objects. If any memory has been allocated in creating the underlying C struct or C++ struct, then a "free" function must be defined that deallocates this memory.

    34.10.2 Object Ownership

    As described above, memory management depends on clearly defining who is responsible for freeing the underlying C struct or C++ class. If the Ruby object is responsible for freeing the C++ object, then a "free" function must be registered for the object. If the Ruby object is not responsible for freeing the underlying memory, then a "free" function must not be registered for the object.

    For the most part, SWIG takes care of memory management issues. The rules it uses are:

    • When calling a C++ object's constructor from Ruby, SWIG will assign a "free" function thereby making the Ruby object responsible for freeing the C++ object
    • When calling a C++ member function that returns a pointer, SWIG will not assign a "free" function thereby making the underlying library responsible for freeing the object.

    To make this clearer, let's look at an example. Assume we have a Foo and a Bar class.

    /* File "RubyOwernshipExample.h" */
    
    class Foo
    {
    public:
      Foo() {}
      ~Foo() {}
    };
    
    class Bar
    {
      Foo *foo_;
    public:
      Bar(): foo_(new Foo) {}
      ~Bar() { delete foo_; }
      Foo* get_foo() { return foo_; }
      Foo* get_new_foo() { return new Foo; }
      void set_foo(Foo *foo) { delete foo_; foo_ = foo; }
    };

    First, consider this Ruby code:

    foo = Foo.new

    In this case, the Ruby code calls the underlying Foo C++ constructor, thus creating a new foo object. By default, SWIG will assign the new Ruby object a "free" function. When the Ruby object is garbage collected, the "free" function will be called. It in turn will call Foo's destructor.

    Next, consider this code:

    bar = Bar.new
    foo = bar.get_foo()

    In this case, the Ruby code calls a C++ member function, get_foo . By default, SWIG will not assign the Ruby object a "free" function. Thus, when the Ruby object is garbage collected the underlying C++ foo object is not affected.

    Unfortunately, the real world is not as simple as the examples above. For example:

    bar = Bar.new
    foo = bar.get_new_foo()

    In this case, the default SWIG behavior for calling member functions is incorrect. The Ruby object should assume ownership of the returned object. This can be done by using the %newobject directive. See Object ownership and %newobject for more information.

    The SWIG default mappings are also incorrect in this case:

    foo = Foo.new
    bar = Bar.new
    bar.set_foo(foo)

    Without modification, this code will cause a segmentation fault. When the Ruby foo object goes out of scope, it will free the underlying C++ foo object. However, when the Ruby bar object goes out of scope, it will call the C++ bar destructor which will also free the C++ foo object. The problem is that object ownership is transferred from the Ruby object to the C++ object when the set_foo method is called. This can be done by using the special DISOWN type map, which was added to the Ruby bindings in SWIG-1.3.26.

    Thus, a correct SWIG interface file correct mapping for these classes is:

    /* File RubyOwnershipExample.i */
    
    %module RubyOwnershipExample
    
    %{
    #include "RubyOwnershipExample.h"
    %}
    
    class Foo
    {
    public:
      Foo();
      ~Foo();
    };
    
    class Bar
    {
      Foo *foo_;
    public:
      Bar();
      ~Bar();
      Foo* get_foo();
    
      %newobject get_new_foo;
      Foo* get_new_foo();
    
      %apply SWIGTYPE *DISOWN {Foo *foo};
      void set_foo(Foo *foo);
      %clear Foo *foo;
    };
    

    This code can be seen in swig/examples/ruby/tracking.

    34.10.3 Object Tracking

    The remaining parts of this section will use the class library shown below to illustrate different memory management techniques. The class library models a zoo and the animals it contains.

    %module zoo
    
    %{
    #include <string>
    #include <vector>
    
    #include "zoo.h"
    %}
    
    class Animal
    {
    private:
      typedef std::vector<Animal*> AnimalsType;
      typedef AnimalsType::iterator IterType;
    protected:
      AnimalsType animals;
    protected:
      std::string name_;
    public:
      // Construct an animal with this name
      Animal(const char* name) : name_(name) {}
     
      // Return the animal's name
      const char* get_name() const { return name.c_str(); }
    };
    
    class Zoo
    {
    protected:
     std::vector<Animal *> animals;
     
    public:
      // Construct an empty zoo
      Zoo() {}
      
      /* Create a new animal. */
      static Animal* Zoo::create_animal(const char* name) {
        return new Animal(name);
      }
     
      // Add a new animal to the zoo
      void add_animal(Animal* animal) {
        animals.push_back(animal); 
      }
     
      Animal* remove_animal(size_t i) {
        Animal* result = this->animals[i];
        IterType iter = this->animals.begin();
        std::advance(iter, i);
        this->animals.erase(iter);
       
        return result;
      }
      
      // Return the number of animals in the zoo
      size_t get_num_animals() const {
        return animals.size(); 
      }
      
      // Return a pointer to the ith animal
      Animal* get_animal(size_t i) const {
        return animals[i]; 
      }
    };

    Let's say you SWIG this code and then run IRB:

    $ irb
    irb(main):001:0> require 'example'
    => true
    
    irb(main):002:0> tiger1 = Example::Animal.new("tiger1")
    => #<Example::Animal:0x2be3820>
    
    irb(main):004:0> tiger1.get_name()
    => "tiger1"
    
    irb(main):003:0> zoo = Example::Zoo.new()
    => #<Example::Zoo:0x2be0a60>
    
    irb(main):006:0> zoo.add_animal(tiger)
    => nil
    
    irb(main):007:0> zoo.get_num_animals()
    => 1
    
    irb(main):007:0> tiger2 = zoo.remove_animal(0)
    => #<Example::Animal:0x2bd4a18>
    
    irb(main):008:0> tiger2.get_name()
    => "tiger1"
    
    irb(main):009:0> tiger1.equal?(tiger2)
    => false
    

    Pay particular attention to the code tiger1.equal?(tiger2). Note that the two Ruby objects are not the same - but they reference the same underlying C++ object. This can cause problems. For example:

    irb(main):010:0> tiger1 = nil
    => nil
    
    irb(main):011:0> GC.start
    => nil
    
    irb(main):012:0> tiger2.get_name()
    (irb):12: [BUG] Segmentation fault
    

    After the garbage collector runs, as a result of our call to GC.start, callingtiger2.get_name() causes a segmentation fault. The problem is that when tiger1 is garbage collected, it frees the underlying C++ object. Thus, when tiger2 calls the get_name() method it invokes it on a destroyed object.

    This problem can be avoided if SWIG enforces a one-to-one mapping between Ruby objects and C++ classes. This can be done via the use of the %trackobjects functionality available in SWIG-1.3.26. and later.

    When the %trackobjects is turned on, SWIG automatically keeps track of mappings between C++ objects and Ruby objects. Note that enabling object tracking causes a slight performance degradation. Test results show this degradation to be about 3% to 5% when creating and destroying 100,000 animals in a row.

    Since %trackobjects is implemented as a %feature, it uses the same name matching rules as other kinds of features (see the chapter on "Customization Features") . Thus it can be applied on a class-by-class basis if needed. To fix the example above:

    %module example
    
    %{
    #include "example.h"
    %}
    
    /* Tell SWIG that create_animal creates a new object */
    %newobject Zoo::create_animal;
    
    /* Tell SWIG to keep track of mappings between C/C++ structs/classes. */
    %trackobjects;
    
    %include "example.h"

    When this code runs we see:

    $ irb
    irb(main):001:0> require 'example'
    => true
    
    irb(main):002:0> tiger1 = Example::Animal.new("tiger1")
    => #<Example::Animal:0x2be37d8>
    
    irb(main):003:0> zoo = Example::Zoo.new()
    => #<Example::Zoo:0x2be0a18>
    
    irb(main):004:0> zoo.add_animal(tiger1)
    => nil
    
    irb(main):006:0> tiger2 = zoo.remove_animal(0)
    => #<Example::Animal:0x2be37d8>
    
    irb(main):007:0> tiger1.equal?(tiger2)
    => true
    
    irb(main):008:0> tiger1 = nil
    => nil
    
    irb(main):009:0> GC.start
    => nil
    
    irb(main):010:0> tiger.get_name()
    => "tiger1"
    irb(main):011:0>

    For those who are interested, object tracking is implemented by storing Ruby objects in a hash table and keying them on C++ pointers. The underlying API is:

    static void SWIG_RubyAddTracking(void* ptr, VALUE object);
    static VALUE SWIG_RubyInstanceFor(void* ptr) ;
    static void SWIG_RubyRemoveTracking(void* ptr);
    static void SWIG_RubyUnlinkObjects(void* ptr);

    When an object is created, SWIG will automatically call the SWIG_RubyAddTracking method. Similarly, when an object is deleted, SWIG will call the SWIG_RubyRemoveTracking. When an object is returned to Ruby from C++, SWIG will use the SWIG_RubyInstanceFor method to ensure a one-to-one mapping from Ruby to C++ objects. Last, the RubyUnlinkObjects method unlinks a Ruby object from its underlying C++ object.

    In general, you will only need to use the SWIG_RubyInstanceFor , which is required for implementing mark functions as shown below. However, if you implement your own free functions (see below) you may also have to call the SWIG_RubyRemoveTracking and RubyUnlinkObjects methods.

    34.10.4 Mark Functions

    With a bit more testing, we see that our class library still has problems. For example:

    $ irb
    irb(main):001:0> require 'example'
    => true
    
    irb(main):002:0> tiger1 = Example::Animal.new("tiger1")
    => #<Example::Animal:0x2bea6a8>
    
    irb(main):003:0> zoo = Example::Zoo.new()
    => #<Example::Zoo:0x2be7960>
    
    irb(main):004:0> zoo.add_animal(tiger1)
    => nil
    
    irb(main):007:0> tiger1 = nil
    => nil
    
    irb(main):007:0> GC.start
    => nil
    
    irb(main):005:0> tiger2 = zoo.get_animal(0)
    (irb):12: [BUG] Segmentation fault

    The problem is that Ruby does not know that the zoo object contains a reference to a Ruby object. Thus, when Ruby garbage collects tiger1 it frees the underlying C++ object.

    This can be fixed by implementing a mark function as described above in the Mark and Sweep Garbage Collector section. You can specify a mark function by using the %markfunc directive. Since the %markfunc directive is implemented using SWIG's' "features" mechanism it uses the same name matching rules as other kinds of features (see the chapter on "Customization Features" for more details).

    A mark function takes a single argument, which is a pointer to the C++ object being marked; it should, in turn, call rb_gc_mark() for any instances that are reachable from the current object. The mark function for our Zoo class should therefore loop over all of the C++ animal objects in the zoo object, look up their Ruby object equivalent, and then call rb_gc_mark(). One possible implementation is:

    %module example
    
    %{
    #include "example.h"
    %}
    
    /* Keep track of mappings between C/C++ structs/classes
     and Ruby objects so we can implement a mark function. */
    %trackobjects;
    
    /* Specify the mark function */
    %markfunc Zoo "mark_Zoo";
    
    %include "example.h"
    
    %header %{
    
    static void mark_Zoo(void* ptr) {
      Zoo* zoo = (Zoo*) ptr;
     
      /* Loop over each object and tell the garbage collector
      that we are holding a reference to them. */
      int count = zoo->get_num_animals();
     
      for(int i = 0; i < count; ++i) {
        Animal* animal = zoo->get_animal(i);
        VALUE object = SWIG_RubyInstanceFor(animal);
     
        if (object != Qnil) {
          rb_gc_mark(object);
        }
      }
    }
    %}

    Note the mark function is dependent on the SWIG_RUBY_InstanceFor method, and thus requires that %trackobjects is enabled. For more information, please refer to the ruby_track_objects.i test case in the SWIG test suite.

    When this code is compiled we now see:

    $ irb
    irb(main):002:0> tiger1=Example::Animal.new("tiger1")
    => #<Example::Animal:0x2be3bf8>
    
    irb(main):003:0> Example::Zoo.new()
    => #<Example::Zoo:0x2be1780>
    
    irb(main):004:0> zoo = Example::Zoo.new()
    => #<Example::Zoo:0x2bde9c0>
    
    irb(main):005:0> zoo.add_animal(tiger1)
    => nil
    
    irb(main):009:0> tiger1 = nil
    => nil
    
    irb(main):010:0> GC.start
    => nil
    irb(main):014:0> tiger2 = zoo.get_animal(0)
    => #<Example::Animal:0x2be3bf8>
    
    irb(main):015:0> tiger2.get_name()
    => "tiger1"
    irb(main):016:0>

    This code can be seen in swig/examples/ruby/mark_function.

    34.10.5 Free Functions

    By default, SWIG creates a "free" function that is called when a Ruby object is garbage collected. The free function simply calls the C++ object's destructor.

    However, sometimes an appropriate destructor does not exist or special processing needs to be performed before the destructor is called. Therefore, SWIG allows you to manually specify a "free" function via the use of the %freefunc directive. The %freefunc directive is implemented using SWIG's' "features" mechanism and so the same name matching rules used for other kinds of features apply (see the chapter on "Customization Features") for more details).

    IMPORTANT ! - If you define your own free function, then you must ensure that you call the underlying C++ object's destructor. In addition, if object tracking is activated for the object's class, you must also call the SWIG_RubyRemoveTracking function (of course call this before you destroy the C++ object). Note that it is harmless to call this method if object tracking if off so it is advised to always call it.

    Note there is a subtle interaction between object ownership and free functions. A custom defined free function will only be called if the Ruby object owns the underlying C++ object. This also to Ruby objects which are created, but then transfer ownership to C++ objects via the use of the disown typemap described above.

    To show how to use the %freefunc directive, let's slightly change our example. Assume that the zoo object is responsible for freeing any animal that it contains. This means that the Zoo::add_animal function should be marked with a DISOWN typemap and the destructor should be updated as below:

    Zoo::~Zoo() {
      IterType iter = this->animals.begin();
      IterType end = this->animals.end();
     
      for(iter; iter != end; ++iter) {
        Animal* animal = *iter;
        delete animal;
      }
    }
    

    When we use these objects in IRB we see:

    $irb
    irb(main):002:0> require 'example'
    => true
    
    irb(main):003:0> zoo = Example::Zoo.new()
    => #<Example::Zoo:0x2be0fe8>
    
    irb(main):005:0> tiger1 = Example::Animal.new("tiger1")
    => #<Example::Animal:0x2bda760>
    
    irb(main):006:0> zoo.add_animal(tiger1)
    => nil
    
    irb(main):007:0> zoo = nil
    => nil
    
    irb(main):008:0> GC.start
    => nil
    
    irb(main):009:0> tiger1.get_name()
    (irb):12: [BUG] Segmentation fault
    

    The error happens because the C++ animal object is freed when the zoo object is freed. Although this error is unavoidable, we can at least prevent the segmentation fault. To do this requires enabling object tracking and implementing a custom free function that calls the SWIG_RubyUnlinkObjects function for each animal object that is destroyed. The SWIG_RubyUnlinkObjects function notifies SWIG that a Ruby object's underlying C++ object is no longer valid. Once notified, SWIG will intercept any calls from the existing Ruby object to the destroyed C++ object and raise an exception.

    %module example
    
    %{
    #include "example.h"
    %}
    
    /* Specify that ownership is transferred to the zoo when calling add_animal */
    %apply SWIGTYPE *DISOWN { Animal* animal };
    
    /* Track objects */
    %trackobjects;
    
    /* Specify the mark function */
    %freefunc Zoo "free_Zoo";
    
    %include "example.h"
    
    %header %{
      static void free_Zoo(void* ptr) {
        Zoo* zoo = (Zoo*) ptr;
    
        /* Loop over each animal */
        int count = zoo->get_num_animals();
    
        for(int i = 0; i < count; ++i) {
          /* Get an animal */
          Animal* animal = zoo->get_animal(i);
    
          /* Unlink the Ruby object from the C++ object */
          SWIG_RubyUnlinkObjects(animal);
    
          /* Now remove the tracking for this animal */
          SWIG_RubyRemoveTracking(animal);
        }
    
        /* Now call SWIG_RubyRemoveTracking for the zoo */
        SWIG_RubyRemoveTracking(ptr);
        /* Now free the zoo which will free the animals it contains */
        delete zoo;
      }
    %} 

    Now when we use these objects in IRB we see:

    $irb
    irb(main):002:0> require 'example'
    => true
    
    irb(main):003:0> zoo = Example::Zoo.new()
    => #<Example::Zoo:0x2be0fe8>
    
    irb(main):005:0> tiger1 = Example::Animal.new("tiger1")
    => #<Example::Animal:0x2bda760>
    
    irb(main):006:0> zoo.add_animal(tiger1)
    => nil
    
    irb(main):007:0> zoo = nil
    => nil
    
    irb(main):008:0> GC.start
    => nil
    
    irb(main):009:0> tiger1.get_name()
    RuntimeError: This Animal * already released
     from (irb):10:in `get_name'
     from (irb):10
    irb(main):011:0>

    Notice that SWIG can now detect the underlying C++ object has been freed, and thus raises a runtime exception.

    This code can be seen in swig/examples/ruby/free_function.

    34.10.6 Embedded Ruby and the C++ Stack

    As has been said, the Ruby GC runs and marks objects before its sweep phase. When the garbage collector is called, it will also try to mark any Ruby objects (VALUE) it finds in the machine registers and in the C++ stack.

    The stack is basically the history of the functions that have been called and also contains local variables, such as the ones you define whenever you do inside a function:

    VALUE obj;

    For ruby to determine where its stack space begins, during initialization a normal Ruby interpreter will call the ruby_init() function which in turn will call a function called Init_stack or similar. This function will store a pointer to the location where the stack points at that point in time.

    ruby_init() is presumed to always be called within the main() function of your program and whenever the GC is called, ruby will assume that the memory between the current location in memory and the pointer that was stored previously represents the stack, which may contain local (and temporary) VALUE ruby objects. Ruby will then be careful not to remove any of those objects in that location.

    So far so good. For a normal Ruby session, all the above is completely transparent and magic to the extensions developer.

    However, with an embedded Ruby, it may not always be possible to modify main() to make sure ruby_init() is called there. As such, ruby_init() will likely end up being called from within some other function. This can lead Ruby to measure incorrectly where the stack begins and can result in Ruby incorrectly collecting those temporary VALUE objects that are created once another function is called. The end result: random crashes and segmentation faults.

    This problem will often be seen in director functions that are used for callbacks, for example.

    To solve the problem, SWIG can now generate code with director functions containing the optional macros SWIG_INIT_STACK and SWIG_RELEASE_STACK. These macros will try to force Ruby to reinitialize the beginning of the stack the first time a director function is called. This will lead Ruby to measure and not collect any VALUE objects defined from that point on.

    To mark functions to either reset the ruby stack or not, you can use:

    %initstack Class::memberfunction;   // only re-init the stack in this director method
    %ignorestack Class::memberfunction; // do not re-init the stack in this director method
    %initstack Class;                   // init the stack on all the methods of this class
    %initstack;                         // all director functions will re-init the stack
    

    35 SWIG and Scilab

    Scilab is a scientific software package for numerical computations providing a powerful open computing environment for engineering and scientific applications that is mostly compatible with MATLAB. More information can be found at www.scilab.org.

    This chapter explains how to use SWIG for Scilab. After this introduction, you should be able to generate with SWIG a Scilab external module from a C/C++ library.

    35.1 Preliminaries

    SWIG for Scilab supports Linux. Other operating systems haven't been tested.

    Scilab is supported from version 5.3.3 onwards. The forthcoming version 6, as of January 2015, is also supported.

    SWIG for Scilab supports C language. C++ is partially supported. See A basic tour of C/C++ wrapping for further details.

    35.2 Running SWIG

    Let's see how to use SWIG for Scilab on a small example.
    In this example we bind from C a function and a global variable into Scilab. The SWIG interface (stored in a file named example.i ), is the following:

    %module example
    
    %inline %{
    double Foo = 3.0;
    
    int fact(int n) {
      if (n < 0) {
        return 0;
      }
      else if (n == 0) {
        return 1;
      }
      else {
        return n * fact(n-1);
      }
    }
    %}
    

    Note: a code in an %inline section is both parsed and wrapped by SWIG, and inserted as is in the wrapper source file.

    35.2.1 Generating the module

    The module is generated using the swig executable and its -scilab option.

    $ swig -scilab example.i
    

    This command generates two files:

    • example_wrap.c: a C source file containing the wrapping code and also here the wrapped code (the fact() and Foo definitions)
    • loader.sce: a Scilab script used to load the module into Scilab

    Note: if the following error is returned:

    :1: Error: Unable to find 'swig.swg'
    :3: Error: Unable to find 'scilab.swg'
    

    it may be because the SWIG library is not found. Check the SWIG_LIB environment variable or your SWIG installation.

    Note: SWIG for Scilab can work in two modes related to the way the module is built, see the Building modes section for details. This example uses the builder mode.

    The swig executable has several other command line options you can use. See Scilab command line options for further details.

    35.2.2 Building the module

    To be loaded in Scilab, the wrapper has to be built into a dynamic module (or shared library).

    The commands to compile and link the wrapper (with gcc) into the shared library libexample.so are:

    $ gcc -fPIC -c -I/usr/local/include/scilab example_wrap.c
    $ gcc -shared example_wrap.o -o libexample.so
    

    Note: we supposed in this example that the path to the Scilab include directory is /usr/local/include/scilab (which is the case in a Debian environment), this should be changed for another environment.

    35.2.3 Loading the module

    Loading a module is done by running the loader script in Scilab:

    --> exec loader.sce
    

    Scilab should output the following messages:

    Shared archive loaded.
    Link done.
    

    which means that Scilab has successfully loaded the shared library. The module functions and other symbols are now available in Scilab.

    35.2.4 Using the module

    In Scilab, the function fact() is simply called as following:

    --> fact(5)
    ans  =
    
        120.
    

    For the Foo global variable, the accessors need to be used:

    --> Foo_get
    ans  =
    
        3.
    
    --> Foo_set(4);
    
    --> Foo_get
    ans  =
    
        4.
    

    Note: for conciseness, we assume in the subsequent Scilab code examples that the modules have been beforehand built and loaded in Scilab.

    35.2.5 Scilab command line options

    The following table lists the Scilab specific command line options in addition to the generic SWIG options:

    -builderGenerate the Scilab builder script
    -buildercflags <cflags>Add <cflags> to the builder compiler flags
    -builderldflags <ldflags>Add <ldlags> to the builder linker flags
    -buildersources <files>Add the (comma separated) files <files> to the builder sources
    -builderverbositylevel <level>Set the build verbosity level to <level> (default 0: off, 2: high)
    -builderflagscript <file>Use the Scilab script <file> to configure the compiler and linker flags
    -gatewayxml <gateway_id>Generate the gateway XML with the given <gateway_id>
    -targetversionGenerate for Scilab target (major) version

    These options can be displayed with:

    $ swig -scilab -help
    

    35.3 A basic tour of C/C++ wrapping

    35.3.1 Overview

    SWIG for Scilab provides only a low-level C interface for Scilab (see Scripting Languages for the general approach to wrapping). This means that functions, structs, classes, variables, etc... are interfaced through C functions. These C functions are mapped as Scilab functions. There are a few exceptions, such as constants and enumerations, which can be wrapped directly as Scilab variables.

    35.3.2 Identifiers

    In Scilab 5.x, identifier names are composed of 24 characters maximum (this limitation disappears from Scilab 6.0 onwards).
    By default, variable, member, and function names longer than 24 characters are truncated, and a warning is produced for each truncation.

    This can cause ambiguities, especially when wrapping structs/classes, for which the wrapped function name is composed of the struct/class name and field names. In these cases, the %rename directive can be used to choose a different Scilab name.

    Note: truncations can be disabled by specifying the target version 6 of Scilab in the targetversion argument (i.e. -targetversion 6).

    35.3.3 Functions

    Functions are wrapped as new Scilab built-in functions. For example:

    %module example
    
    %inline %{
    int fact(int n) {
      if (n > 1)
        return n * fact(n - 1);
      else
        return 1;
    }
    %}
    

    creates a built-in function fact(n) in Scilab:

    --> fact(4)
    ans  =
    
        24.
    

    35.3.3.1 Argument passing

    In the above example, the function parameter is a primitive type and is marshalled by value. So this function is wrapped without any additional customization. Argument values are converted between C types and Scilab types through type mappings. There are several default type mappings for primitive and complex types, described later in the Scilab typemaps section.

    When a parameter is not passed by value, such as a pointer or reference, SWIG does not know if it is an input, output (or both) parameter. The INPUT, OUTPUT, INOUT typemaps defined in the typemaps.i library can be used to specify this.

    Let's see this on two simple functions: sub() which has an output parameter, and inc(), which as input/output parameter:

    %module example
    
    %include <typemaps.i>
    
    extern void sub(int *INPUT, int *INPUT, int *OUTPUT);
    extern void inc(int *INOUT, int *INPUT);
    
    %{
    void sub(int *x, int *y, int *result) {
      *result = *x - *y;
    }
    void inc(int *x, int *delta) {
      *x = *x + *delta;
    }
    %}
    

    In Scilab, parameters are passed by value. The output (and inout) parameters are returned as the result of the functions:

    --> sub(5, 3)
     ans  =
    
        2.
    
    --> inc(4, 3)
     ans  =
    
        7.
    

    35.3.3.2 Multiple output arguments

    A C function can have several output parameters. They can all be returned as results of the wrapped function as Scilab supports multiple return values from a function when using the typemaps.i library. If the C function itself returns a result, this is returned first before the parameter outputs.

    The example below shows this for a C function returning 2 values and a result:

    %module example
    
    %include <typemaps.i>
    
    int divide(int n, int d, int *OUTPUT, int *OUTPUT);
    
    %{
      int divide(int n, int d, int q*, int *r) {
        if (d != 0) {
          *q = n / d;
          *r = n % d;
          return 1;
        } else {
          return 0;
        }
      }
    %}
    

    --> [ret, q, r] = divide(20, 6)
     r  =
    
        2.
     q  =
    
        3.
     ret  =
    
        1.
    

    35.3.4 Global variables

    Global variables are manipulated through generated accessor functions. For example, for a given Foo global variable, SWIG actually generates two functions: Foo_get() to get the value of Foo, and Foo_set() to set the value. These functions are used as following:

    --> exec loader.sce;
    --> c = Foo_get();
    
    --> Foo_set(4);
    
    --> c
    c =
    
        3.
    
    --> Foo_get()
    ans  =
    
        4.
    

    It works for variables of primitive type, but also for non-primitive types: arrays, and structs/classes which are described later. For now, an example with two global primitive arrays x and y is shown:

    %module example
    
    %inline %{
    int x[10];
    double y[7];
    
    void initArrays()
    {
      int i;
      for (i = 0; i < 10; i++)
        x[i] = 1;
      for (i = 0; i < 7; i++)
        y[i] = 1.0f;
    }
    %}
    

    It works the same:

    --> exec loader.sce
    
    --> initArrays();
    --> x_get()
     ans  =
    
        1.    1.    1.    1.    1.    1.    1.    1.    1.    1.
    
    --> y_set([0:6] / 10);
    --> y_get()
     ans  =
    
        0.    0.1    0.2    0.3    0.4    0.5    0.6
    

    35.3.5 Constants and enumerations

    35.3.5.1 Constants

    There is not any constant in Scilab. By default, C/C++ constants are wrapped as getter functions. For example, for the following constants:

    %module example
    #define    ICONST      42
    #define    FCONST      2.1828
    #define    CCONST      'x'
    #define    CCONST2     '\n'
    #define    SCONST      "Hello World"
    #define    SCONST2     "\"Hello World\""
    

    the following getter functions are generated:

    --> exec loader.sce;
    --> ICONST_get();
     ans  =
    
        42.
    
    --> FCONST_get();
     ans  =
    
        2.1828
    
    --> CCONST_get();
     ans  =
    
        x
    
    --> CCONST2_get();
     ans  =
    
    --> SCONST_get();
     ans  =
    
        Hello World
    
    --> SCONST2_get();
     ans  =
    
        "Hello World"
    
    --> EXPR_get();
     ans  =
    
        48.5484
    
    --> iconst_get();
     ans  =
    
        37.
    
    --> fconst_get();
     ans  =
    
        3.14
    

    There is another mode in which constants are wrapped as Scilab variables. The variables are easier to use than functions, but the drawback is that variables are not constant and so can be modified.

    This mode can be enabled/disabled at any time in the interface file with %scilabconst(), which works like all the other %feature directives. Use the argument value "1" to enable and "0" to disable this mode. For example in this mode the previous constants:

    %module example
    
    %scilabconst(1);
    #define    ICONST      42
    #define    FCONST      2.1828
    #define    CCONST      'x'
    #define    CCONST2     '\n'
    #define    SCONST      "Hello World"
    #define    SCONST2     "\"Hello World\""
    

    are mapped to Scilab variables, with the same name:

    --> exec loader.sce;
    --> ICONST
     ans  =
    
        42
    
    --> FCONST
     ans  =
    
        2.1828
    
    --> CCONST
     ans  =
    
        x
    
    --> CCONST2
     ans  =
    
    --> SCONST
     ans  =
    
        Hello World
    
    --> SCONST2
     ans  =
    
        "Hello World"
    
    --> EXPR
     ans  =
    
        48.5484
    
    --> iconst
     ans  =
    
        37
    
    --> fconst
     ans  =
    
        3.14
    

    35.3.5.2 Enumerations

    The wrapping of enums is the same as for constants. By default, enums are wrapped as getter functions. For example, with the following enumeration:

    %module example
    typedef enum { RED, BLUE, GREEN } color;
    

    a getter function will be generated for each value of the enumeration:

    --> exec loader.sce;
    --> RED_get()
     ans  =
    
        0.
    
    --> BLUE_get()
     ans  =
    
        1.
    
    --> GREEN_get()
     ans  =
    
        2.
    

    The %scilabconst() feature is also available for enumerations:

    %module example
    %scilabconst(1) color;
    typedef enum { RED, BLUE, GREEN } color;
    

    --> exec loader.sce;
    --> RED
     ans  =
    
        0.
    
    --> BLUE
     ans  =
    
        1.
    
    --> GREEN
     ans  =
    
        2.
    
    

    35.3.6 Pointers

    Pointers are supported by SWIG. A pointer can be returned from a wrapped C/C++ function, stored in a Scilab variable, and used in input argument of another C/C++ function.

    Also, thanks to the SWIG runtime which stores information about types, pointer types are tracked between exchanges Scilab and the native code. Indeed pointer types are stored alongside the pointer address. A pointer is mapped to a Scilab structure ( tlist), which contains as fields the pointer address and the pointer type (in fact a pointer to the type information structure in the SWIG runtime).
    Why a native pointer is not mapped to a Scilab pointer (type name: "pointer", type ID: 128) ? The big advantage of mapping to a tlist is that it exposes a new type for the pointer in Scilab, type which can be acessed in Scilab with the typeof function, and manipulated using the overloading mechanism.

    Notes:

    • type tracking needs the SWIG runtime to be first initialized with the appropriate function (see the Module initialization section).
    • for any reason, if a wrapped pointer type is unknown (or if the SWIG runtime is not initialized), SWIG maps it to a Scilab pointer. Also, a Scilab pointer is always accepted as a pointer argument of a wrapped function. The drawaback is that pointer type is lost.

    Following is an example of the wrapping of the C FILE* pointer:

    %module example
    
    %{
    #include <stdio.h>
    %}
    
    FILE *fopen(const char *filename, const char *mode);
    int fputs(const char *, FILE *);
    int fclose(FILE *);
    

    These functions can be used the same way as in C from Scilab:

    --> example_Init();
    
    --> f = fopen("junk", "w");
    --> typeof(f)
     ans  =
    
      _p_FILE
    
    --> fputs("Hello World", f);
    --> fclose(f);
    

    Note: the type name _p_FILE which means "pointer to FILE".

    The user of a pointer is responsible for freeing it or, like in the example, closing any resources associated with it (just as is required in a C program).

    35.3.6.1 Utility functions

    As a scripting language, Scilab does not provide functions to manipulate pointers. However, in some cases it can be useful, such as for testing or debugging.

    SWIG comes with two pointer utility functions:

    • SWIG_this(): returns the address value of a pointer
    • SWIG_ptr(): creates a pointer from an address value

    Note: a pointer created by SWIG_ptr() does not have any type and is mapped as a Scilab pointer.

    Following we use the utility functions on the previous example:

    --> f = fopen("junk", "w");
    --> fputs("Hello", f);
    --> addr = SWIG_this(f)
     ans  =
    
        8219088.
    
    --> p = SWIG_ptr(addr);
    --> typeof(p)
    ans  =
    
      pointer
    
    --> fputs(" World", p);
    --> fclose(f);
    

    35.3.6.2 Null pointers:

    Using the previous SWIG_this() and SWIG_ptr(), it is possible to create and check null pointers:

    --> p = SWIG_ptr(0);
    --> SWIG_this(p) == 0
     ans  =
    
        T
    

    35.3.7 Structures

    Structs exist in Scilab, but C structs are not (at least in this version of SWIG) mapped to Scilab structs. A C structure is wrapped through low-level accessor functions, i.e. functions that give access to the member variables of this structure. In Scilab, a structure is manipulated through a pointer which is passed as an argument to the accessor functions.

    Let's see it on an example of a struct with two members:

    %module example
    
    %inline %{
    
    typedef struct {
      int x;
      int arr[4];
    } Foo;
    
    %}
    

    Several functions are generated:

    • a constructor function new_Foo() which returns a pointer to a newly created struct Foo.
    • two member getter functions Foo_x_get(), Foo_arr_get() , to get the values of x and y for the struct pointer (provided as the first parameter to these functions)
    • two member setter functions Foo_x_set(), Foo_arr_set() , to set the values of x and y for the struct pointer (provided as the first parameter to these functions).
    • a destructor function delete_Foo() to release the struct pointer.

    Usage example:

    --> f = new_Foo();
    --> Foo_x_set(f, 100);
    --> Foo_x_get(f)
    ans  =
    
        100.
    
    --> Foo_arr_set(f, [0:3]);
    --> Foo_arr_get(f)
    ans  =
    
        0.    1.    2.    3.
    
    --> delete_Foo(f);
    

    Members of a structure that are also structures are also accepted and wrapped as a pointer:

    %module example
    
    %inline %{
    
    typedef struct {
      int x;
    } Bar;
    
    typedef struct {
      Bar b;
    } Foo;
    
    %}
    

    --> b = new_Bar();
    --> Bar_x_set(b, 20.);
    
    --> f = new_Foo();
    --> Foo_b_set(f, b);
    
    --> b2 = Foo_b_get(f);
    --> Bar_x_get(b2);
    ans  =
    
        20.
    

    Note: the pointer to the struct works as described in Pointers. For example, the type of the struct pointer can be get with typeof, as following:

    --> example_Init();
    --> b = new_Bar();
    --> typeof(b)
     ans  =
    
        _p_Bar
    --> delete_Bar(b);
    

    35.3.8 C++ classes

    Classes do not exist in Scilab. The classes are wrapped the same way as structs. Low-level accessor functions are generated for class members. Also, constructor and destructor functions are generated to create and destroy an instance of the class.

    For example, the following class:

    %module example
    
    %inline %{
    
    class Point {
    public:
      int x, y;
      Point(int _x, int _y) : x(_x), y(_y) {}
      double distance(const Point& rhs) {
        return sqrt(pow(x-rhs.x, 2) + pow(y-rhs.y, 2));
      }
      void set(int _x, int _y) {
        x=_x;
        y=_y;
      }
    };
    
    %}
    

    can be used in Scilab like this:

    --> p1 = Point_new(3, 5);
    --> p2 = Point_new(1, 2);
    --> p1.distance(p2)
    ans  =
    
        3.6056
    
    --> delete_Point(p1);
    --> delete_Point(p2);
    

    Note: like structs, class pointers are mapped as described in Pointers. Let's give an example which shows that each class pointer type is a new type in Scilab that can be used for example (through overloading) to implement a custom print for the Point class:

    --> function %_p_Point_p(p)
    -->     mprintf('[%d, %d]\n', Point_x_get(p), Point_y_get(p));
    --> endfunction
    
    --> example_Init();
    --> p = new_Point(1, 2)
     p  =
    
    [1, 2]
    
    --> delete_Point(p);
    

    35.3.9 C++ inheritance

    Inheritance is supported. SWIG knows the inheritance relationship between classes.

    A function is only generated for the class in which it is actually declared. But if one of its parameters is a class, any instance of a derived class is accepted as the argument.

    This mechanism also applies for accessor functions: they are generated only in the class in which they are defined. But any instance of a derived class can be used as the argument to these accessor functions.

    For example, let's take a base class Shape and two derived classes Circle and Square:

    %module example
    
    %inline %{
    
    class Shape {
    public:
      double x, y;
      void set_location(double _x, double _y) { x = _x; y = _y; }
      virtual double get_perimeter() { return 0; };
    };
    
    class Circle : public Shape {
    public:
      int radius;
      Circle(int _radius): radius(_radius) {};
      virtual double get_perimeter() { return 6.28 * radius; }
    };
    
    class Square : public Shape {
    public:
      int size;
      Square(int _size): size(_size) {};
      virtual double get_perimeter() { return 4 * size; }
    };
    
    %}
    

    To set the location of the Circle, we have to use the function set_location() of the parent Shape. But we can use either use the get_perimeter() function of the parent class or the derived class:

    --> c = new_Circle(3);
    
    --> Shape_set_location(c, 2, 3);
    --> Shape_x_get(c)
     ans  =
    
        2.
    
    --> Circle_get_perimeter(c)
     ans  =
    
        18.84
    
    --> Shape_get_perimeter(c)
     ans  =
    
        18.84
    

    35.3.10 C++ overloading

    As explained in Overloaded functions and methods SWIG provides support for overloaded functions and constructors.

    As SWIG knows pointer types, the overloading works also with pointer types, here is an example with a function magnify overloaded for the previous classes Shape and Circle:

    %module example
    
    void magnify(Square *square, double factor) {
      square->size *= factor;
    };
    
    void magnify(Circle *circle, double factor) {
      square->radius *= factor;
    };
    
    --> example_Init();
    --> c = new_Circle(3);
    --> s = new_Square(2);
    
    --> magnify(c, 10);
    --> Circle_get_radius(c)
     ans  =
    
       30;
    --> magnify(s, 10);
    --> Square_get_size(s)
     ans  =
    
       20;
    

    35.3.11 Pointers, references, values, and arrays

    In C++ objects can be passed by value, pointer, reference, or by an array:

    %module example
    
    %{
    #include <sciprint.h>
    %}
    
    %inline %{
    
    class Foo {
    public:
      Foo(int _x) : x(_x) {}
      int x;
    };
    
    void spam1(Foo *f)  { sciprint("%d\n", f->x); }   // Pass by pointer
    void spam2(Foo &f)  { sciprint("%d\n", f.x); }    // Pass by reference
    void spam3(Foo f)   { sciprint("%d\n", f.x); }    // Pass by value
    void spam4(Foo f[]) { sciprint("%d\n", f[0].x); } // Array of objects
    
    %}
    

    In SWIG, there is no real distinction between these. So in Scilab, it is perfectly legal to do this:

    --> f = new_Foo()
    --> spam1(f)
    3
    --> spam2(f)
    3
    --> spam3(f)
    3
    --> spam4(f)
    3
    

    Similar behaviour occurs for return values. For example, if you had functions like this:

    Foo *spam5();
    Foo &spam6();
    Foo  spam7();
    

    All these functions will return a pointer to an instance of Foo . As the function spam7 returns a value, new instance of Foo has to be allocated, and a pointer on this instance is returned.

    35.3.12 C++ templates

    As in other languages, function and class templates are supported in SWIG Scilab.

    You have to tell SWIG to create wrappers for a particular template instantiation. The %template directive is used for this purpose. For example:

    %module example
    
    template<class T1, class T2, class T3>
    struct triplet {
      T1 first;
      T2 second;
      T3 third;
      triplet(const T1& a, const T2& b, const T3& c) {
        third = a; second = b; third = c;
      }
    };
    
    %template(IntTriplet) triplet<int, int, int>;
    

    Then in Scilab:

    --> t = new_IntTriplet(3, 4, 1);
    
    --> IntTriplet_first_get(t)
     ans  =
    
        3.
    
    --> IntTriplet_second_get(t)
     ans  =
    
        4.
    
    --> IntTriplet_third_get(t)
     ans  =
    
        1.
    
    --> delete_IntTriplet(t);
    

    More details on template support can be found in the templates documentation.

    35.3.13 C++ operators

    C++ operators are partially supported. Operator overloading exists in Scilab, but a C++ operator is not (in this version) wrapped by SWIG as a Scilab operator, but as a function. It is not automatic, you have to rename each operator (with the instruction %rename) with the suitable wrapper name.

    Let's see it with an example of class with two operators + and double():

    %module example
    
    %rename(plus) operator +;
    %rename(toDouble) operator double();
    
    %inline %{
    
    class Complex {
    public:
      Complex(double re, double im) : real(re), imag(im) {};
    
      Complex operator+(const Complex& other) {
        double result_real = real + other.real;
        double result_imaginary = imag + other.imag;
        return Complex(result_real, result_imaginary);
      }
      operator double() { return real; }
    private:
      double real;
      double imag;
    };
    
    %}
    

    --> c1 = new_Complex(3, 7);
    
    --> c2 = Complex_plus(c, new_Complex(1, 1));
    
    --> Complex_toDouble(c2)
     ans  =
    
        4.
    

    35.3.14 C++ namespaces

    SWIG is aware of C++ namespaces, but does not use it for wrappers. The module is not broken into submodules, nor do namespace appear in functions names. All the namespaces are all flattened in the module. For example with one namespace Foo:

    %module example
    
    %inline %{
    
    namespace foo {
      int fact(int n) {
        if (n > 1)
          return n * fact(n-1);
        else
          return 1;
      }
    
      struct Vector {
        double x, y, z;
      };
    };
    
    %}
    
    

    In Scilab, there is no need to the specify the Foo namespace:

    --> fact(3)
     ans  =
    
       6.
    
    --> v = new_Vector();
    --> Vector_x_set(v, 3.4);
    --> Vector_y_get(v)
     ans  =
    
       0.
    

    If your program has more than one namespace, name conflicts can be resolved using %rename. For example:

    %rename(Bar_spam) Bar::spam;
    
    namespace Foo {
      int spam();
    }
    
    namespace Bar {
      int spam();
    }
    

    Note: the nspace feature is not supported.

    35.3.15 C++ exceptions

    Scilab does not natively support exceptions, but has errors. When an exception is thrown, SWIG catches it, and sets a Scilab error. An error message is displayed in Scilab. For example:

    %module example
    
    %inline %{
    void throw_exception() throw(char const *) {
      throw "Bye world !";
    }
    %}
    

    -->throw_exception()
      !--error 999
    SWIG/Scilab: Exception (char const *) occurred: Bye world !
    

    Scilab has a try-catch mechanism (and a similar instruction execstr()) to handle exceptions. It can be used with the lasterror() function as following:

    --> execstr('throw_exception()', 'errcatch');
     ans  =
    
        999.
    
    --> lasterror()
     ans  =
    
        SWIG/Scilab: Exception (char const *) occurred: Bye world !
    

    If the function has a throw exception specification, SWIG can automatically map the exception type and set an appropriate Scilab error message. It works for a few primitive types, and also for STL exceptions (the library std_except.i has to be included to get the STL exception support):

    %module example
    
    %include <std_except.i>
    
    %inline %{
    void throw_int() throw(int) {
      throw 12;
    }
    
    void throw_stl_invalid_arg(int i) throw(std::invalid_argument) {
      if (i < 0)
        throw std::invalid_argument("argument is negative.");
    }
    %}
    

    --> throw_int();
                !--error 999
    SWIG/Scilab: Exception (int) occurred: 12
    
    -->throw_stl_invalid_arg(-1);
                              !--error 999
    SWIG/Scilab: ValueError: argument is negative.
    

    More complex or custom exception types require specific exception typemaps to be implemented in order to specifically handle a thrown type. See the SWIG C++ documentation for more details.

    35.3.16 C++ STL

    The Standard Template Library (STL) is partially supported. See STL for more details.

    35.4 Type mappings and libraries

    35.4.1 Default primitive type mappings

    The following table provides the equivalent Scilab type for C/C++ primitive types.

    C/C++ typeScilab type
    boolboolean
    charstring
    signed chardouble or int8
    unsigned chardouble or uint8
    shortdouble or int16
    unsigned shortdouble or uint16
    intdouble or int32
    unsigned intdouble or uint32
    longdouble or int32
    unsigned longdouble or uint32
    signed long longnot supported in Scilab 5.x
    unsigned long longnot supported in Scilab 5.x
    floatdouble
    doubledouble
    char * or char[]string

    Notes:

    • In Scilab the double type is far more used than any integer type. This is why integer values (int32, uint32, ...) are automatically converted to Scilab double values when marshalled from C into Scilab. Additionally on input to a C function, Scilab double values are converted into the related integer type.
    • When an integer is expected, if the input is a double, the value must be an integer, i.e. it must not have any decimal part, otherwise a SWIG value error occurs.
    • In SWIG for Scilab 5.x, the long long type is not supported, since Scilab 5.x does not have a 64-bit integer type. The default behaviour is for SWIG to generate code that will give a runtime error if long long type arguments are used from Scilab.

    35.4.2 Arrays

    Typemaps are available by default for arrays. Primitive type arrays are automatically converted to/from Scilab matrices. Typemaps are also provided to handle members of a struct or class that are arrays.

    In input, the matrix is usually one-dimensional (it can be either a row or column vector). But it can also be a two-dimensional matrix. Warning: in Scilab, the values are column-major ordered, unlike in C, which is row-major ordered.

    The type mappings used for arrays is the same for primitive types, described earlier. This means that, if needed, a Scilab double vector is converted in input into the related C integer array and this C integer array is automatically converted on output into a Scilab double vector. Note that unlike scalars, no control is done for arrays when a double is converted into an integer.

    The following example illustrates all this:

    %module example
    
    %#include <stdio.h>
    
    %inline %{
    
    void printArray(int values[], int len) {
      int i = 0;
      for (i = 0; i < len; i++) {
        printf("%s %d %s", i==0?"[":"", values[i], i==len-1?"]\n":"");
      }
    }
    %}
    

    --> printArray([0 1 2 3], 4)
    [ 0  1  2  3 ]
    
    --> printArray([0.2; -1.8; 2; 3.7], 4)
    [ 0  -1  2  3 ]
    
    --> printArray([0 1; 2 3], 4)
    [ 0  2  1  3 ]
    
    --> printArray([0; 1; 2; 3], 4)
    [ 0  1  2  3 ]
    

    35.4.3 Pointer-to-pointers

    There are no specific typemaps for pointer-to-pointers, they are mapped as pointers in Scilab.

    Pointer-to-pointers are sometimes used to implement matrices in C. The following is an example of this:

    %module example
    %inline %{
    
    // Returns the matrix [1 2; 3 4];
    double **create_matrix() {
      double **M;
      int i;
      M = (double **) malloc(2 * sizeof(double *));
      for (i = 0; i < 2; i++) {
        M[i] = (double *) malloc(2 * sizeof(double));
        M[i][0] = 2 * i + 1;
        M[i][1] = 2 * i + 2;
      }
      return M;
    }
    
    // Gets the item M(i, j) value
    double get_matrix(double **M, int i, int j) {
      return M[i][j];
    }
    
    // Sets the item M(i, j) value to be val
    void set_matrix(double **M, int i, int j, double val) {
      M[i][j] = val;
    }
    
    // Prints a matrix (2, 2) to console
    void print_matrix(double **M, int nbRows, int nbCols) {
      int i, j;
      for (i = 0; i < 2; i++) {
        for (j = 0; j < 2; j++) {
          printf("%3g ", M[i][j]);
        }
        printf("\n");
      }
    }
    
    %}
    

    These functions are used like this in Scilab:

    --> m = create_matrix();
    
    --> print_matrix(m);
       1.   2.
       3.   4.
    
    --> set_matrix(m, 1, 1, 5.);
    
    --> get_matrix(m, 1, 1)
     ans  =
    
        5.
    

    35.4.4 Matrices

    The matrix.i library provides a set of typemaps which can be useful when working with one-dimensional and two-dimensional matrices.

    In order to use this library, just include it in the interface file:

      %include <matrix.i>
    

    Several typemaps are available for the common Scilab matrix types:

    • double
    • int
    • char *
    • bool

    For example: for a matrix of int, we have the typemaps, for input:

    • (int *IN, int IN_ROWCOUNT, int IN_COLCOUNT)
    • (int IN_ROWCOUNT, int IN_COLCOUNT, int *IN)
    • (int *IN, int IN_SIZE)
    • (int IN_SIZE, int *IN)

    and output:

    • (int **OUT, int *OUT_ROWCOUNT, int *OUT_COLCOUNT)
    • (int *OUT_ROWCOUNT, int *OUT_COLCOUNT, int **OUT)
    • (int **OUT, int *OUT_SIZE)
    • (int *OUT_SIZE, int **OUT)

    They marshall a Scilab matrix type into the appropriate 2 or 3 C parameters. The following is an example using the typemaps in this library:

    %module example
    
    %include <matrix.i>
    
    %apply (int *IN, int IN_ROWCOUNT, int IN_COLCOUNT) { (int *matrix, int matrixNbRow, int matrixNbCol) };
    %apply (int **OUT, int *OUT_ROWCOUNT, int *OUT_COLCOUNT) { (int **outMatrix, int *outMatrixNbRow, int *outMatrixNbCol) };
    
    %inline %{
    
    void absolute(int *matrix, int matrixNbRow, int matrixNbCol,
      int **outMatrix, int *outMatrixNbRow, int *outMatrixNbCol) {
      int i, j;
      *outMatrixNbRow = matrixNbRow;
      *outMatrixNbCol = matrixNbCol;
      *outMatrix = malloc(matrixNbRow * matrixNbCol * sizeof(int));
      for (i=0; i < matrixNbRow * matrixNbCol; i++) {
        (*outMatrix)[i] = matrix[i] > 0 ? matrix[i]:-matrix[i];
      }
    }
    
    %}
    

    --> absolute([-0 1 -2; 3 4 -5])
     ans  =
    
        0.    1.    2.
        3.    4.    5.
    

    The remarks made earlier for arrays also apply here:

    • The values of matrices in Scilab are column-major orderered,
    • There is no control while converting double values to integers, double values are truncated without any checking or warning.

    35.4.5 STL

    The STL library wraps some containers defined in the STL (Standard Template Library), so that they can be manipulated in Scilab. This library also provides the appropriate typemaps to use the containers in functions and variables.

    The list of wrapped sequence containers are:

    • std::vector
    • std::list
    • std::deque

    And associative containers are:

    • std::set
    • std::multiset

    Typemaps are available for the following container types:

    • double
    • float
    • int
    • string
    • bool
    • pointer

    Containers of other item types are not supported. Using them does not break compilation, but provokes a runtime error. Containers of enum are not supported yet.

    In order to use the STL, the library must first be included in the SWIG interface file:

    %include <stl.i>
    

    Then for each container used, the appropriate template must be instantiated, in the std namespace:

    namespace std {
        %template(IntVector)    vector<int>;
        %template(DoubleVector) vector<double>;
    }
    

    Additionally, the module initialization function has to be executed first in Scilab, so that all the types are known to Scilab. See the Module initialization section for more details.

    Because in Scilab matrices exist for basic types only, a sequence container of pointers is mapped to a Scilab list. For other item types (double, int, string...) the sequence container is mapped to a Scilab matrix.

    The first example below shows how to create a vector (of int ) in Scilab, add some values to the vector and pass it as an argument of a function. It also shows, thanks to the typemaps, that we can also pass a Scilab matrix of values directly into the function:

    %module example
    
    %include <stl.i>
    
    namespace std {
      %template(IntVector) vector<int>;
    }
    
    %{
    #include <numeric>
    %}
    
    %inline %{
    
    double average(std::vector<int> v) {
      return std::accumulate(v.begin(), v.end(), 0.0) / v.size();
    }
    
    %}
    

    --> example_Init();
    
    --> v = new_IntVector();
    
    --> for i = 1:4
    -->     IntVector_push_back(v, i);
    --> end;
    
    --> average(v)
     ans  =
    
        2.5
    
    --> average([0 1 2 3])
     ans  =
    
        2.5
    
    --> delete_IntVector();
    

    In the second example, a set of struct (Person) is wrapped. A function performs a search in this set, and returns a subset. As one can see, the result in Scilab is a list of pointers:

    %module example
    
    %include <stl.i>
    
    %{
    #include <string>
    %}
    
    %inline %{
    
    struct Person {
      Person(std::string _name, int _age) : name(_name), age(_age) {};
      std::string name;
      int age;
    };
    typedef Person * PersonPtr;
    
    %}
    
    namespace std {
      %template(PersonPtrSet) set<PersonPtr>;
    }
    
    %inline %{
    
    std::set<PersonPtr> findPersonsByAge(std::set<PersonPtr> persons, int minAge, int maxAge) {
      std::set<PersonPtr> foundPersons;
      for (std::set<PersonPtr>::iterator it = persons.begin(); it != persons.end(); it++) {
        if (((*it)->age >= minAge) && ((*it)->age <= maxAge)) {
          foundPersons.insert(*it);
        }
      }
      return foundPersons;
    }
    
    %}
    

    --> example_Init();
    
    --> joe = new_Person("Joe", 25);
    --> susan = new_Person("Susan", 32);
    --> bill = new_Person("Bill", 50);
    
    --> p = new_PersonPtrSet();
    --> PersonPtrSet_insert(p, susan);
    --> PersonPtrSet_insert(p, joe);
    --> PersonPtrSet_insert(p, bill);
    
    --> l = findPersonsByAge(p, 20, 40);
    
    --> size(l)
     ans  =
    
        2.
    
    --> Person_name_get(l(1))
    ans  =
    
        Susan
    
    --> Person_name_get(l(2))
     ans  =
    
        Joe
    
    --> delete_PersonPtrSet(p);
    

    35.5 Module initialization

    The wrapped module contains an initialization function to:

    • initialize the SWIG runtime, needed for pointer type tracking or when working with the STL
    • initialize the module constants and enumerations declared with %scilabconst()

    This initialization function should be executed at the start of a script, before the wrapped library has to be used.

    The function has the name of the module suffixed by _Init. For example, to initialize the module example:

    --> example_Init();
    

    35.6 Building modes

    The mechanism to load an external module in Scilab is called Dynamic Link and works with dynamic modules (or shared libraries, .so files).

    To produce a dynamic module, when generating the wrapper, there are two possibilities, or build modes:

    • the nobuilder mode, this is the default mode in SWIG. The user is responsible of the build.
    • the builder mode. In this mode, Scilab is responsible of building.

    35.6.1 No-builder mode

    In this mode, used by default, SWIG generates the wrapper sources, which have to be manually compiled and linked. A loader script loader.sce is also produced, this one is executed further in Scilab to load the module.

    This mode is the best option to use when you have to integrate the module build into a larger build process.

    35.6.2 Builder mode

    In this mode, in addition to the wrapper sources, SWIG produces a builder Scilab script (builder.sce), which is executed in Scilab to build the module. In a few words, the Scilab ilib_build() command is used, which produces the shared library file, and the loader script loader.sce (and also a cleaner script cleaner.sce ).

    An advantage of this mode is that it hides all the complexity of the build and other platform issues. Also it allows the module to conform to a Scilab external module convention which is that an external module should be simply built by calling a builder script.

    The builder mode is activated with the -builder SWIG option. In this mode, the following SWIG options may be used to setup the build:

    • -buildersources: to add sources to the build (several files must be separated by a comma)
    • -buildercflags: to add flags to the builder compiler flags, for example to set library dependencies include paths
    • -builderldflags: to add flags to the linker flags, for example to set library dependency names and paths

    Let's give an example how to build a module example, composed of two sources, and using a library dependency:

    • the sources are baa1.c and baa2.c (and are stored in the current directory)
    • the library is libfoo in /opt/foo (headers stored in /opt/foo/include, and shared library in /opt/foo/lib )

    The command is:

    $ swig -scilab -builder -buildercflags -I/opt/foo/include -builderldflags "-L/opt/foo/lib -lfoo" -buildersources baa1.cxx, baa2.cxx example.i
    

    35.7 Generated scripts

    In this part we give some details about the generated Scilab scripts.

    35.7.1 Builder script

    builder.sce is the name of the builder script generated by SWIG in builder mode. It contains code like this:

    ilib_name = "examplelib";
    files = ["example_wrap.c"];
    libs = [];
    table = ["fact", "_wrap_fact";"Foo_set", "_wrap_Foo_set";"Foo_get", "_wrap_Foo_get";];
    ilib_build(ilib_name, table, files, libs);
    

    ilib_build(lib_name, table, files, libs) is used to create shared libraries, and to generate a loader file used to dynamically load the shared library into Scilab.

    • ilib_name: a character string, the generic name of the library without path and extension.
    • files: string matrix containing objects files needed for shared library creation.
    • libs: string matrix containing extra libraries needed for shared library creation.
    • table: two column string matrix containing a table of pairs of 'scilab function name', 'C function name'.

    35.7.2 Loader script

    The loader script is used to load in Scilab all the module functions. When loaded, these functions can be used as other Scilab functions.

    The loader script loader.sce contains code similar to:

    // ------------------------------------------------------
    // generated by builder.sce: Please do not edit this file
    // ------------------------------------------------------
    
    libexamplelib_path = get_file_path('loader.sce');
    list_functions = [             'fact';
                'Foo_set';
                'Foo_get';
    ];
    addinter(libexamplelib_path+'/libexamplelib.so', 'libexamplelib', list_functions);
    // remove temp. variables on stack
    clear libexamplelib_path;
    clear list_functions;
    clear get_file_path;
    // ------------------------------------------------------
    

    addinter(files, spname, fcts) performs dynamic linking of a compiled C interface function.

    • files: a character string or a vector of character strings defining the object files (containing the C interface functions) to link with.
    • spname: a character string. Name of interface routine entry point.
    • fcts: vector of character strings. The name of new Scilab function.

    35.8 Other resources

    • Example use cases can be found in the Examples/scilab directory.
    • The test suite in the Examples/test-suite/scilab can be another source of useful use cases.
    • The Scilab API is used in the generated code and is a useful reference when examining the output.
    • This guide describes the Scilab external modules structure and files, in particular the files that are generated by SWIG for Scilab.

    36 SWIG and Tcl

    Caution: This chapter is under repair!

    This chapter discusses SWIG's support of Tcl. SWIG currently requires Tcl 8.0 or a later release. Earlier releases of SWIG supported Tcl 7.x, but this is no longer supported.

    36.1 Preliminaries

    To build a Tcl module, run SWIG using the -tcl or -tcl8 option :

    $ swig -tcl example.i
    

    If building a C++ extension, add the -c++ option:

    $ swig -c++ -tcl example.i
    

    This creates a file example_wrap.c or example_wrap.cxx that contains all of the code needed to build a Tcl extension module. To finish building the module, you need to compile this file and link it with the rest of your program.

    36.1.1 Getting the right header files

    In order to compile the wrapper code, the compiler needs the tcl.h header file. This file is usually contained in the directory

    /usr/local/include
    

    Be aware that some Tcl versions install this header file with a version number attached to it. If this is the case, you should probably make a symbolic link so that tcl.h points to the correct header file.

    36.1.2 Compiling a dynamic module

    The preferred approach to building an extension module is to compile it into a shared object file or DLL. Assuming you have code you need to link to in a file called example.c, you will need to compile your program using commands like this (shown for Linux):

    $ swig -tcl example.i
    $ gcc -fPIC -c example.c
    $ gcc -fPIC -c example_wrap.c -I/usr/local/include
    $ gcc -shared example.o example_wrap.o -o example.so
    

    The exact commands for doing this vary from platform to platform. SWIG tries to guess the right options when it is installed. Therefore, you may want to start with one of the examples in the SWIG/Examples/tcl directory. If that doesn't work, you will need to read the man-pages for your compiler and linker to get the right set of options. You might also check the SWIG Wiki for additional information.

    When linking the module, the name of the output file has to match the name of the module. If the name of your SWIG module is "example ", the name of the corresponding object file should be "example.so ". The name of the module is specified using the %module directive or the -module command line option.

    36.1.3 Static linking

    An alternative approach to dynamic linking is to rebuild the Tcl interpreter with your extension module added to it. In the past, this approach was sometimes necessary due to limitations in dynamic loading support on certain machines. However, the situation has improved greatly over the last few years and you should not consider this approach unless there is really no other option.

    The usual procedure for adding a new module to Tcl involves writing a special function Tcl_AppInit() and using it to initialize the interpreter and your module. With SWIG, the tclsh.i and wish.i library files can be used to rebuild the tclsh and wish interpreters respectively. For example:

    %module example
    
    %inline %{
    extern int fact(int);
    extern int mod(int, int);
    extern double My_variable;
    %}
    
    %include "tclsh.i"       // Include code for rebuilding tclsh
    
    

    The tclsh.i library file includes supporting code that contains everything needed to rebuild tclsh. To rebuild the interpreter, you simply do something like this:

    $ swig -tcl example.i
    $ gcc example.c example_wrap.c \
            -Xlinker -export-dynamic \
            -DHAVE_CONFIG_H -I/usr/local/include/ \
            -L/usr/local/lib -ltcl -lm -ldl \
            -o mytclsh
    
    

    You will need to supply the same libraries that were used to build Tcl the first time. This may include system libraries such as -lsocket, -lnsl, and -lpthread. If this actually works, the new version of Tcl should be identical to the default version except that your extension module will be a built-in part of the interpreter.

    Comment: In practice, you should probably try to avoid static linking if possible. Some programmers may be inclined to use static linking in the interest of getting better performance. However, the performance gained by static linking tends to be rather minimal in most situations (and quite frankly not worth the extra hassle in the opinion of this author).

    36.1.4 Using your module

    To use your module, simply use the Tcl load command. If all goes well, you will be able to this:

    $ tclsh
    % load ./example.so
    % fact 4
    24
    %
    

    A common error received by first-time users is the following:

    % load ./example.so
    couldn't find procedure Example_Init
    % 
    

    This error is almost always caused when the name of the shared object file doesn't match the name of the module supplied using the SWIG %module directive. Double-check the interface to make sure the module name and the shared object file match. Another possible cause of this error is forgetting to link the SWIG-generated wrapper code with the rest of your application when creating the extension module.

    Another common error is something similar to the following:

    % load ./example.so
    couldn't load file "./example.so": ./example.so: undefined symbol: fact
    % 
    

    This error usually indicates that you forgot to include some object files or libraries in the linking of the shared library file. Make sure you compile both the SWIG wrapper file and your original program into a shared library file. Make sure you pass all of the required libraries to the linker.

    Sometimes unresolved symbols occur because a wrapper has been created for a function that doesn't actually exist in a library. This usually occurs when a header file includes a declaration for a function that was never actually implemented or it was removed from a library without updating the header file. To fix this, you can either edit the SWIG input file to remove the offending declaration or you can use the %ignore directive to ignore the declaration.

    Finally, suppose that your extension module is linked with another library like this:

    $ gcc -shared example.o example_wrap.o -L/home/beazley/projects/lib -lfoo \
          -o example.so
    

    If the foo library is compiled as a shared library, you might get the following problem when you try to use your module:

    % load ./example.so
    couldn't load file "./example.so": libfoo.so: cannot open shared object file:
    No such file or directory
    %        
    

    This error is generated because the dynamic linker can't locate the libfoo.so library. When shared libraries are loaded, the system normally only checks a few standard locations such as /usr/lib and /usr/local/lib. To fix this problem, there are several things you can do. First, you can recompile your extension module with extra path information. For example, on Linux you can do this:

    $ gcc -shared example.o example_wrap.o -L/home/beazley/projects/lib -lfoo \
          -Xlinker -rpath /home/beazley/projects/lib \
          -o example.so
    

    Alternatively, you can set the LD_LIBRARY_PATH environment variable to include the directory with your shared libraries. If setting LD_LIBRARY_PATH, be aware that setting this variable can introduce a noticeable performance impact on all other applications that you run. To set it only for Tcl, you might want to do this instead:

    $ env LD_LIBRARY_PATH=/home/beazley/projects/lib tclsh
    

    Finally, you can use a command such as ldconfig to add additional search paths to the default system configuration (this requires root access and you will need to read the man pages).

    36.1.5 Compilation of C++ extensions

    Compilation of C++ extensions has traditionally been a tricky problem. Since the Tcl interpreter is written in C, you need to take steps to make sure C++ is properly initialized and that modules are compiled correctly.

    On most machines, C++ extension modules should be linked using the C++ compiler. For example:

    % swig -c++ -tcl example.i
    % g++ -fPIC -c example.cxx
    % g++ -fPIC -c example_wrap.cxx -I/usr/local/include
    % g++ -shared example.o example_wrap.o -o example.so
    

    In addition to this, you may need to include additional library files to make it work. For example, if you are using the Sun C++ compiler on Solaris, you often need to add an extra library -lCrun like this:

    % swig -c++ -tcl example.i
    % CC -KPIC -c example.cxx
    % CC -KPIC -c example_wrap.cxx -I/usr/local/include
    % CC -G example.o example_wrap.o -L/opt/SUNWspro/lib -o example.so -lCrun
    

    Of course, the extra libraries to use are completely non-portable---you will probably need to do some experimentation.

    Sometimes people have suggested that it is necessary to relink the Tcl interpreter using the C++ compiler to make C++ extension modules work. In the experience of this author, this has never actually appeared to be necessary. Relinking the interpreter with C++ really only includes the special run-time libraries described above---as long as you link your extension modules with these libraries, it should not be necessary to rebuild Tcl.

    If you aren't entirely sure about the linking of a C++ extension, you might look at an existing C++ program. On many Unix machines, the ldd command will list library dependencies. This should give you some clues about what you might have to include when you link your extension module. For example:

    $ ldd swig
            libstdc++-libc6.1-1.so.2 => /usr/lib/libstdc++-libc6.1-1.so.2 (0x40019000)
            libm.so.6 => /lib/libm.so.6 (0x4005b000)
            libc.so.6 => /lib/libc.so.6 (0x40077000)
            /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
    $
    

    As a final complication, a major weakness of C++ is that it does not define any sort of standard for binary linking of libraries. This means that C++ code compiled by different compilers will not link together properly as libraries nor is the memory layout of classes and data structures implemented in any kind of portable manner. In a monolithic C++ program, this problem may be unnoticed. However, in Tcl, it is possible for different extension modules to be compiled with different C++ compilers. As long as these modules are self-contained, this probably won't matter. However, if these modules start sharing data, you will need to take steps to avoid segmentation faults and other erratic program behavior. If working with lots of software components, you might want to investigate using a more formal standard such as COM.

    36.1.6 Compiling for 64-bit platforms

    On platforms that support 64-bit applications (Solaris, Irix, etc.), special care is required when building extension modules. On these machines, 64-bit applications are compiled and linked using a different set of compiler/linker options. In addition, it is not generally possible to mix 32-bit and 64-bit code together in the same application.

    To utilize 64-bits, the Tcl executable will need to be recompiled as a 64-bit application. In addition, all libraries, wrapper code, and every other part of your application will need to be compiled for 64-bits. If you plan to use other third-party extension modules, they will also have to be recompiled as 64-bit extensions.

    If you are wrapping commercial software for which you have no source code, you will be forced to use the same linking standard as used by that software. This may prevent the use of 64-bit extensions. It may also introduce problems on platforms that support more than one linking standard (e.g., -o32 and -n32 on Irix).

    36.1.7 Setting a package prefix

    To avoid namespace problems, you can instruct SWIG to append a package prefix to all of your functions and variables. This is done using the -prefix option as follows :

    swig -tcl -prefix Foo example.i
    

    If you have a function "bar" in the SWIG file, the prefix option will append the prefix to the name when creating a command and call it "Foo_bar".

    36.1.8 Using namespaces

    Alternatively, you can have SWIG install your module into a Tcl namespace by specifying the -namespace option :

    swig -tcl -namespace example.i
    

    By default, the name of the namespace will be the same as the module name, but you can override it using the -prefix option.

    When the -namespace option is used, objects in the module are always accessed with the namespace name such as Foo::bar.

    36.2 Building Tcl/Tk Extensions under Windows 95/NT

    Building a SWIG extension to Tcl/Tk under Windows 95/NT is roughly similar to the process used with Unix. Normally, you will want to produce a DLL that can be loaded into tclsh or wish. This section covers the process of using SWIG with Microsoft Visual C++. although the procedure may be similar with other compilers.

    36.2.1 Running SWIG from Developer Studio

    If you are developing your application within Microsoft developer studio, SWIG can be invoked as a custom build option. The process roughly follows these steps :

    • Open up a new workspace and use the AppWizard to select a DLL project.
    • Add both the SWIG interface file (the .i file), any supporting C files, and the name of the wrapper file that will be created by SWIG (ie. example_wrap.c). Note : If using C++, choose a different suffix for the wrapper file such as example_wrap.cxx. Don't worry if the wrapper file doesn't exist yet--Developer studio will keep a reference to it around.
    • Select the SWIG interface file and go to the settings menu. Under settings, select the "Custom Build" option.
    • Enter "SWIG" in the description field.
    • Enter "swig -tcl -o $(ProjDir)\$(InputName)_wrap.c $(InputPath) " in the "Build command(s) field"
    • Enter "$(ProjDir)\$(InputName)_wrap.c" in the "Output files(s) field".
    • Next, select the settings for the entire project and go to "C++:Preprocessor". Add the include directories for your Tcl installation under "Additional include directories".
    • Finally, select the settings for the entire project and go to "Link Options". Add the Tcl library file to your link libraries. For example "tcl80.lib". Also, set the name of the output file to match the name of your Tcl module (ie. example.dll).
    • Build your project.

    Now, assuming all went well, SWIG will be automatically invoked when you build your project. Any changes made to the interface file will result in SWIG being automatically invoked to produce a new version of the wrapper file. To run your new Tcl extension, simply run tclsh or wish and use the load command. For example :

    MSDOS > tclsh80
    % load example.dll
    % fact 4
    24
    %
    

    36.2.2 Using NMAKE

    Alternatively, SWIG extensions can be built by writing a Makefile for NMAKE. To do this, make sure the environment variables for MSVC++ are available and the MSVC++ tools are in your path. Now, just write a short Makefile like this :

    # Makefile for building various SWIG generated extensions
    
    SRCS          = example.c
    IFILE         = example
    INTERFACE     = $(IFILE).i
    WRAPFILE      = $(IFILE)_wrap.c
    
    # Location of the Visual C++ tools (32 bit assumed)
    
    TOOLS         = c:\msdev
    TARGET        = example.dll
    CC            = $(TOOLS)\bin\cl.exe
    LINK          = $(TOOLS)\bin\link.exe
    INCLUDE32     = -I$(TOOLS)\include
    MACHINE       = IX86
    
    # C Library needed to build a DLL
    
    DLLIBC        = msvcrt.lib oldnames.lib  
    
    # Windows libraries that are apparently needed
    WINLIB        = kernel32.lib advapi32.lib user32.lib gdi32.lib comdlg32.lib 
    winspool.lib
    
    # Libraries common to all DLLs
    LIBS          = $(DLLIBC) $(WINLIB) 
    
    # Linker options
    LOPT      = -debug:full -debugtype:cv /NODEFAULTLIB /RELEASE /NOLOGO /
    MACHINE:$(MACHINE) -entry:_DllMainCRTStartup@12 -dll
    
    # C compiler flags
    
    CFLAGS    = /Z7 /Od /c /nologo
    TCL_INCLUDES  = -Id:\tcl8.0a2\generic -Id:\tcl8.0a2\win
    TCLLIB        = d:\tcl8.0a2\win\tcl80.lib
    
    tcl:
            ..\..\swig -tcl -o $(WRAPFILE) $(INTERFACE)
            $(CC) $(CFLAGS) $(TCL_INCLUDES) $(SRCS) $(WRAPFILE)
            set LIB=$(TOOLS)\lib
            $(LINK) $(LOPT) -out:example.dll $(LIBS) $(TCLLIB) example.obj example_wrap.obj
    
    

    To build the extension, run NMAKE (you may need to run vcvars32 first). This is a pretty minimal Makefile, but hopefully its enough to get you started. With a little practice, you'll be making lots of Tcl extensions.

    36.3 A tour of basic C/C++ wrapping

    By default, SWIG tries to build a very natural Tcl interface to your C/C++ code. Functions are wrapped as functions, classes are wrapped in an interface that mimics the style of Tk widgets and [incr Tcl] classes. This section briefly covers the essential aspects of this wrapping.

    36.3.1 Modules

    The SWIG %module directive specifies the name of the Tcl module. If you specify `%module example', then everything is compiled into an extension module example.so. When choosing a module name, make sure you don't use the same name as a built-in Tcl command.

    One pitfall to watch out for is module names involving numbers. If you specify a module name like %module md5, you'll find that the load command no longer seems to work:

    % load ./md5.so
    couldn't find procedure Md_Init
    

    To fix this, supply an extra argument to load like this:

    % load ./md5.so md5
    

    36.3.2 Functions

    Global functions are wrapped as new Tcl built-in commands. For example,

    %module example
    int fact(int n);
    

    creates a built-in function fact that works exactly like you think it does:

    % load ./example.so
    % fact 4
    24
    % set x [fact 6]
    %
    

    36.3.3 Global variables

    C/C++ global variables are wrapped by Tcl global variables. For example:

    // SWIG interface file with global variables
    %module example
    ...
    %inline %{
    extern double density;
    %}
    ...
    

    Now look at the Tcl interface:

    % puts $density          # Output value of C global variable
    1.0
    % set density 0.95       # Change value
    

    If you make an error in variable assignment, you will get an error message. For example:

    % set density "hello"
    can't set "density": Type error. expected a double.
    %
    

    If a variable is declared as const, it is wrapped as a read-only variable. Attempts to modify its value will result in an error.

    To make ordinary variables read-only, you can use the %immutable directive. For example:

    %{
    extern char *path;
    %}
    %immutable;
    extern char *path;
    %mutable;
    

    The %immutable directive stays in effect until it is explicitly disabled or cleared using %mutable. See the Creating read-only variables section for further details.

    If you just want to make a specific variable immutable, supply a declaration name. For example:

    %{
    extern char *path;
    %}
    %immutable path;
    ...
    extern char *path;      // Read-only (due to %immutable)
    

    36.3.4 Constants and enums

    C/C++ constants are installed as global Tcl variables containing the appropriate value. To create a constant, use #define, enum , or the %constant directive. For example:

    #define PI 3.14159
    #define VERSION "1.0"
    
    enum Beverage { ALE, LAGER, STOUT, PILSNER };
    
    %constant int FOO = 42;
    %constant const char *path = "/usr/local";
    

    For enums, make sure that the definition of the enumeration actually appears in a header file or in the wrapper file somehow---if you just stick an enum in a SWIG interface without also telling the C compiler about it, the wrapper code won't compile.

    Note: declarations declared as const are wrapped as read-only variables and will be accessed using the cvar object described in the previous section. They are not wrapped as constants. For further discussion about this, see the SWIG Basics chapter.

    Constants are not guaranteed to remain constant in Tcl---the value of the constant could be accidentally reassigned.You will just have to be careful.

    A peculiarity of installing constants as variables is that it is necessary to use the Tcl global statement to access constants in procedure bodies. For example:

    proc blah {} {
      global FOO
      bar $FOO
    }
    

    If a program relies on a lot of constants, this can be extremely annoying. To fix the problem, consider using the following typemap rule:

    %apply int CONSTANT { int x };
    #define FOO 42
    ...
    void bar(int x);
    

    When applied to an input argument, the CONSTANT rule allows a constant to be passed to a function using its actual value or a symbolic identifier name. For example:

    proc blah {} {
      bar FOO
    }
    

    When an identifier name is given, it is used to perform an implicit hash-table lookup of the value during argument conversion. This allows the global statement to be omitted.

    36.3.5 Pointers

    C/C++ pointers are fully supported by SWIG. Furthermore, SWIG has no problem working with incomplete type information. Here is a rather simple interface:

    %module example
    
    FILE *fopen(const char *filename, const char *mode);
    int fputs(const char *, FILE *);
    int fclose(FILE *);
    

    When wrapped, you will be able to use the functions in a natural way from Tcl. For example:

    % load ./example.so
    % set f [fopen junk w]
    % fputs "Hello World\n" $f
    % fclose $f
    

    If this makes you uneasy, rest assured that there is no deep magic involved. Underneath the covers, pointers to C/C++ objects are simply represented as opaque values--normally an encoded character string like this:

    % puts $f
    _c0671108_p_FILE
    % 
    

    This pointer value can be freely passed around to different C functions that expect to receive an object of type FILE *. The only thing you can't do is dereference the pointer from Tcl.

    The NULL pointer is represented by the string NULL.

    As much as you might be inclined to modify a pointer value directly from Tcl, don't. The hexadecimal encoding is not necessarily the same as the logical memory address of the underlying object. Instead it is the raw byte encoding of the pointer value. The encoding will vary depending on the native byte-ordering of the platform (i.e., big-endian vs. little-endian). Similarly, don't try to manually cast a pointer to a new type by simply replacing the type-string. This may not work like you expect and it is particularly dangerous when casting C++ objects. If you need to cast a pointer or change its value, consider writing some helper functions instead. For example:

    %inline %{
    /* C-style cast */
    Bar *FooToBar(Foo *f) {
      return (Bar *) f;
    }
    
    /* C++-style cast */
    Foo *BarToFoo(Bar *b) {
      return dynamic_cast<Foo*>(b);
    }
    
    Foo *IncrFoo(Foo *f, int i) {
      return f+i;
    }
    %}
    

    Also, if working with C++, you should always try to use the new C++ style casts. For example, in the above code, the C-style cast may return a bogus result whereas as the C++-style cast will return None if the conversion can't be performed.

    36.3.6 Structures

    If you wrap a C structure, it is wrapped by a Tcl interface that somewhat resembles a Tk widget. This provides a very natural interface. For example,

    struct Vector {
      double x, y, z;
    };
    
    

    is used as follows:

    % Vector v
    % v configure -x 3.5 -y 7.2
    % puts "[v cget -x] [v cget -y] [v cget -z]"
    3.5 7.2 0.0
    % 
    

    Similar access is provided for unions and the data members of C++ classes.

    In the above example, v is a name that's used for the object. However, underneath the covers, there's a pointer to a raw C structure. This can be obtained by looking at the -this attribute. For example:

    % puts [v cget -this]
    _88e31408_p_Vector
    

    Further details about the relationship between the Tcl and the underlying C structure are covered a little later.

    const members of a structure are read-only. Data members can also be forced to be read-only using the %immutable directive. For example:

    struct Foo {
      ...
      %immutable;
      int x;        /* Read-only members */
      char *name;
      %mutable;
      ...
    };
    

    When char * members of a structure are wrapped, the contents are assumed to be dynamically allocated using malloc or new (depending on whether or not SWIG is run with the -c++ option). When the structure member is set, the old contents will be released and a new value created. If this is not the behavior you want, you will have to use a typemap (described later).

    If a structure contains arrays, access to those arrays is managed through pointers. For example, consider this:

    struct Bar {
      int  x[16];
    };
    

    If accessed in Tcl, you will see behavior like this:

    % Bar b
    % puts [b cget -x]
    _801861a4_p_int
    % 
    

    This pointer can be passed around to functions that expect to receive an int * (just like C). You can also set the value of an array member using another pointer. For example:

    % Bar c
    % c configure -x [b cget -x]   # Copy contents of b.x to c.x
    

    For array assignment, SWIG copies the entire contents of the array starting with the data pointed to by b.x. In this example, 16 integers would be copied. Like C, SWIG makes no assumptions about bounds checking---if you pass a bad pointer, you may get a segmentation fault or access violation.

    When a member of a structure is itself a structure, it is handled as a pointer. For example, suppose you have two structures like this:

    struct Foo {
      int a;
    };
    
    struct Bar {
      Foo f;
    };
    

    Now, suppose that you access the f attribute of Bar like this:

    % Bar b
    % set x [b cget -f]
    

    In this case, x is a pointer that points to the Foo that is inside b. This is the same value as generated by this C code:

    Bar b;
    Foo *x = &b->f;       /* Points inside b */
    

    However, one peculiarity of accessing a substructure like this is that the returned value does work quite like you might expect. For example:

    % Bar b
    % set x [b cget -f]
    % x cget -a
    invalid command name "x"
    

    This is because the returned value was not created in a normal way from the interpreter (x is not a command object). To make it function normally, just evaluate the variable like this:

    % Bar b
    % set x [b cget -f]
    % $x cget -a
    0
    %
    

    In this example, x points inside the original structure. This means that modifications work just like you would expect. For example:

    
    % Bar b
    % set x [b cget -f]
    % $x configure -a 3            # Modifies contents of f (inside b)
    % [b cget -f] -configure -a 3  # Same thing
    

    In many of these structure examples, a simple name like "v" or "b" has been given to wrapped structures. If necessary, this name can be passed to functions that expect to receive an object. For example, if you have a function like this,

    void blah(Foo *f);
    

    you can call the function in Tcl as follows:

    % Foo x            # Create a Foo object 
    % blah x           # Pass the object to a function
    

    It is also possible to call the function using the raw pointer value. For instance:

    % blah [x cget -this]   # Pass object to a function
    

    It is also possible to create and use objects using variables. For example:

    % set b [Bar]            # Create a Bar
    % $b cget -f             # Member access
    % puts $b
    _108fea88_p_Bar
    %
    

    Finally, to destroy objects created from Tcl, you can either let the object name go out of scope or you can explicitly delete the object. For example:

    % Foo f                 # Create object f
    % rename f ""
    

    or

    % Foo f                 # Create object f
    % f -delete
    

    Note: Tcl only destroys the underlying object if it has ownership. See the memory management section that appears shortly.

    36.3.7 C++ classes

    C++ classes are wrapped as an extension of structure wrapping. For example, if you have this class,

    class List {
    public:
      List();
      ~List();
      int  search(char *item);
      void insert(char *item);
      void remove(char *item);
      char *get(int n);
      int  length;
    };
    

    you can use it in Tcl like this:

    % List x
    % x insert Ale
    % x insert Stout
    % x insert Lager
    % x get 1
    Stout
    % puts [x cget -length]
    3
    %
    

    Class data members are accessed in the same manner as C structures.

    Static class members are accessed as global functions or variables. To illustrate, suppose you have a class like this:

    class Spam {
    public:
      static void foo();
      static int bar;
    };
    

    In Tcl, the static member is accessed as follows:

    % Spam_foo        # Spam::foo()
    % puts $Spam_bar  # Spam::bar
    

    36.3.8 C++ inheritance

    SWIG is fully aware of issues related to C++ inheritance. Therefore, if you have classes like this

    class Foo {
    ...
    };
    
    class Bar : public Foo {
    ...
    };
    

    An object of type Bar can be used where a Foo is expected. For example, if you have this function:

    void spam(Foo *f);
    

    then the function spam() accepts a Foo * or a pointer to any class derived from Foo. For instance:

    % Foo f      # Create a Foo
    % Bar b      # Create a Bar
    % spam f     # OK
    % spam b     # OK
    

    It is safe to use multiple inheritance with SWIG.

    36.3.9 Pointers, references, values, and arrays

    In C++, there are many different ways a function might receive and manipulate objects. For example:

    void spam1(Foo *x);      // Pass by pointer
    void spam2(Foo &x);      // Pass by reference
    void spam3(Foo x);       // Pass by value
    void spam4(Foo x[]);     // Array of objects
    

    In Tcl, there is no detailed distinction like this. Because of this, SWIG unifies all of these types together in the wrapper code. For instance, if you actually had the above functions, it is perfectly legal to do this:

    % Foo f             # Create a Foo
    % spam1 f           # Ok. Pointer
    % spam2 f           # Ok. Reference
    % spam3 f           # Ok. Value.
    % spam4 f           # Ok. Array (1 element)
    

    Similar behavior occurs for return values. For example, if you had functions like this,

    Foo *spam5();
    Foo &spam6();
    Foo  spam7();
    

    then all three functions will return a pointer to some Foo object. Since the third function (spam7) returns a value, newly allocated memory is used to hold the result and a pointer is returned (Tcl will release this memory when the return value is garbage collected).

    36.3.10 C++ overloaded functions

    C++ overloaded functions, methods, and constructors are mostly supported by SWIG. For example, if you have two functions like this:

    void foo(int);
    void foo(char *c);
    

    You can use them in Tcl in a straightforward manner:

    % foo 3            # foo(int)
    % foo Hello        # foo(char *c)
    

    Similarly, if you have a class like this,

    class Foo {
    public:
      Foo();
      Foo(const Foo &);
      ...
    };
    

    you can write Tcl code like this:

    % Foo f                # Create a Foo
    % Foo g f              # Copy f
    

    Overloading support is not quite as flexible as in C++. Sometimes there are methods that SWIG can't disambiguate. For example:

    void spam(int);
    void spam(short);
    

    or

    void foo(Bar *b);
    void foo(Bar &b);
    

    If declarations such as these appear, you will get a warning message like this:

    example.i:12: Warning 509: Overloaded method spam(short) effectively ignored,
    example.i:11: Warning 509: as it is shadowed by spam(int).
    

    To fix this, you either need to ignore or rename one of the methods. For example:

    %rename(spam_short) spam(short);
    ...
    void spam(int);    
    void spam(short);   // Accessed as spam_short
    

    or

    %ignore spam(short);
    ...
    void spam(int);    
    void spam(short);   // Ignored
    

    SWIG resolves overloaded functions and methods using a disambiguation scheme that ranks and sorts declarations according to a set of type-precedence rules. The order in which declarations appear in the input does not matter except in situations where ambiguity arises--in this case, the first declaration takes precedence.

    Please refer to the "SWIG and C++" chapter for more information about overloading.

    36.3.11 C++ operators

    Certain C++ overloaded operators can be handled automatically by SWIG. For example, consider a class like this:

    class Complex {
    private:
      double rpart, ipart;
    public:
      Complex(double r = 0, double i = 0) : rpart(r), ipart(i) { }
      Complex(const Complex &c) : rpart(c.rpart), ipart(c.ipart) { }
      Complex &operator=(const Complex &c);
      Complex operator+(const Complex &c) const;
      Complex operator-(const Complex &c) const;
      Complex operator*(const Complex &c) const;
      Complex operator-() const;
      
      double re() const { return rpart; }
      double im() const { return ipart; }
    };
    

    When wrapped, it works like this:

    % Complex c 3 4
    % Complex d 7 8
    % set e [c + d]
    % $e re
    10.0
    % $e im
    12.0
    

    It should be stressed that operators in SWIG have no relationship to operators in Tcl. In fact, the only thing that's happening here is that an operator like operator + has been renamed to a method + . Therefore, the statement [c + d] is really just invoking the + method on c. When more than operator is defined (with different arguments), the standard method overloading facilities are used. Here is a rather odd looking example:

    % Complex c 3 4
    % Complex d 7 8
    % set e [c - d]       # operator-(const Complex &)
    % puts "[$e re] [$e im]"
    10.0 12.0
    % set f [c -]         # operator-()
    % puts "[$f re] [$f im]"
    -3.0 -4.0
    %
    

    One restriction with operator overloading support is that SWIG is not able to fully handle operators that aren't defined as part of the class. For example, if you had code like this

    class Complex {
    ...
    friend Complex operator+(double, const Complex &c);
    ...
    };
    

    then SWIG doesn't know what to do with the friend function--in fact, it simply ignores it and issues a warning. You can still wrap the operator, but you may have to encapsulate it in a special function. For example:

    %rename(Complex_add_dc) operator+(double, const Complex &);
    ...
    Complex operator+(double, const Complex &c);
    

    There are ways to make this operator appear as part of the class using the %extend directive. Keep reading.

    36.3.12 C++ namespaces

    SWIG is aware of C++ namespaces, but namespace names do not appear in the module nor do namespaces result in a module that is broken up into submodules or packages. For example, if you have a file like this,

    %module example
    
    namespace foo {
      int fact(int n);
      struct Vector {
        double x, y, z;
      };
    };
    

    it works in Tcl as follows:

    % load ./example.so
    % fact 3
    6
    % Vector v
    % v configure -x 3.4
    

    If your program has more than one namespace, name conflicts (if any) can be resolved using %rename For example:

    %rename(Bar_spam) Bar::spam;
    
    namespace Foo {
      int spam();
    }
    
    namespace Bar {
      int spam();
    }
    

    If you have more than one namespace and your want to keep their symbols separate, consider wrapping them as separate SWIG modules. For example, make the module name the same as the namespace and create extension modules for each namespace separately. If your program utilizes thousands of small deeply nested namespaces each with identical symbol names, well, then you get what you deserve.

    36.3.13 C++ templates

    C++ templates don't present a huge problem for SWIG. However, in order to create wrappers, you have to tell SWIG to create wrappers for a particular template instantiation. To do this, you use the %template directive. For example:

    %module example
    %{
    #include "pair.h"
    %}
    
    template<class T1, class T2>
    struct pair {
      typedef T1 first_type;
      typedef T2 second_type;
      T1 first;
      T2 second;
      pair();
      pair(const T1&, const T2&);
      ~pair();
    };
    
    %template(pairii) pair<int, int>;
    

    In Tcl:

    % pairii p 3 4
    % p cget -first
    3
    % p cget -second
    4
    

    Obviously, there is more to template wrapping than shown in this example. More details can be found in the SWIG and C++ chapter. Some more complicated examples will appear later.

    36.3.14 C++ Smart Pointers

    In certain C++ programs, it is common to use classes that have been wrapped by so-called "smart pointers." Generally, this involves the use of a template class that implements operator->() like this:

    template<class T> class SmartPtr {
      ...
      T *operator->();
      ...
    }
    

    Then, if you have a class like this,

    class Foo {
    public:
      int x;
      int bar();
    };
    

    A smart pointer would be used in C++ as follows:

    SmartPtr<Foo> p = CreateFoo();   // Created somehow (not shown)
    ...
    p->x = 3;                        // Foo::x
    int y = p->bar();                // Foo::bar
    

    To wrap this in Tcl, simply tell SWIG about the SmartPtr class and the low-level Foo object. Make sure you instantiate SmartPtr using %template if necessary. For example:

    %module example
    ...
    %template(SmartPtrFoo) SmartPtr<Foo>;
    ...
    

    Now, in Tcl, everything should just "work":

    % set p [CreateFoo]                  # Create a smart-pointer somehow
    % $p configure -x 3                  # Foo::x
    % $p bar                             # Foo::bar
    

    If you ever need to access the underlying pointer returned by operator->() itself, simply use the __deref__() method. For example:

    % set f [$p __deref__]    # Returns underlying Foo *
    

    36.4 Further details on the Tcl class interface

    In the previous section, a high-level view of Tcl wrapping was presented. A key component of this wrapping is that structures and classes are wrapped by Tcl class-like objects. This provides a very natural Tcl interface and allows SWIG to support a number of advanced features such as operator overloading. However, a number of low-level details were omitted. This section provides a brief overview of how the proxy classes work.

    36.4.1 Proxy classes

    In the "SWIG basics" and "SWIG and C++" chapters, details of low-level structure and class wrapping are described. To summarize those chapters, if you have a class like this

    class Foo {
    public:
      int x;
      int spam(int);
      ...
    

    then SWIG transforms it into a set of low-level procedural wrappers. For example:

    Foo *new_Foo() {
      return new Foo();
    }
    void delete_Foo(Foo *f) {
      delete f;
    }
    int Foo_x_get(Foo *f) {
      return f->x;
    }
    void Foo_x_set(Foo *f, int value) {
      f->x = value;
    }
    int Foo_spam(Foo *f, int arg1) {
      return f->spam(arg1);
    }
    

    These wrappers are actually found in the Tcl extension module. For example, you can certainly do this:

    % load ./example.so
    % set f [new_Foo]
    % Foo_x_get $f
    0
    % Foo_spam $f 3
    1
    %
    

    However, in addition to this, the classname Foo is used as an object constructor function. This allows objects to be encapsulated objects that look a lot like Tk widgets as shown in the last section.

    36.4.2 Memory management

    Associated with each wrapped object, is an ownership flag thisown The value of this flag determines who is responsible for deleting the underlying C++ object. If set to 1, the Tcl interpreter destroys the C++ object when the proxy class is garbage collected. If set to 0 (or if the attribute is missing), then the destruction of the proxy class has no effect on the C++ object.

    When an object is created by a constructor or returned by value, Tcl automatically takes ownership of the result. For example:

    class Foo {
    public:
      Foo();
      Foo bar();
    };
    

    In Tcl:

    % Foo f
    % f cget -thisown
    1
    % set g [f bar]
    % $g cget -thisown
    1
    

    On the other hand, when pointers are returned to Tcl, there is often no way to know where they came from. Therefore, the ownership is set to zero. For example:

    class Foo {
    public:
      ...
      Foo *spam();
      ...
    };
    

    % Foo f
    % set s [f spam]
    % $s cget -thisown
    0
    % 
    

    This behavior is especially important for classes that act as containers. For example, if a method returns a pointer to an object that is contained inside another object, you definitely don't want Tcl to assume ownership and destroy it!

    Related to containers, ownership issues can arise whenever an object is assigned to a member or global variable. For example, consider this interface:

    %module example
    
    struct Foo {
      int  value;
      Foo  *next;
    };
    
    Foo *head = 0;
    

    When wrapped in Tcl, careful observation will reveal that ownership changes whenever an object is assigned to a global variable. For example:

    % Foo f
    % f cget -thisown
    1
    % set head f
    % f cget -thisown
    0
    

    In this case, C is now holding a reference to the object---you probably don't want Tcl to destroy it. Similarly, this occurs for members. For example:

    % Foo f
    % Foo g
    % f cget -thisown
    1
    % g cget -thisown
    1
    % f configure -next g
    % g cget -thisown 
    0
    %
    

    For the most part, memory management issues remain hidden. However, there are occasionally situations where you might have to manually change the ownership of an object. For instance, consider code like this:

    class Node {
      Object *value;
    public:
      void set_value(Object *v) { value = v; }
      ...
    };
    

    Now, consider the following Tcl code:

    % Object v                 # Create an object
    % Node n                   # Create a node
    % n setvalue v             # Set value
    % v cget -thisown
    1
    % 
    

    In this case, the object n is holding a reference to v internally. However, SWIG has no way to know that this has occurred. Therefore, Tcl still thinks that it has ownership of the object. Should the proxy object be destroyed, then the C++ destructor will be invoked and n will be holding a stale-pointer. If you're lucky, you will only get a segmentation fault.

    To work around this, it is always possible to flip the ownership flag. For example,

    % v -disown              # Give ownership to C/C++
    % v -acquire             # Acquire ownership
    

    It is also possible to deal with situations like this using typemaps--an advanced topic discussed later.

    36.5 Input and output parameters

    A common problem in some C programs is handling parameters passed as simple pointers. For example:

    void add(int x, int y, int *result) {
      *result = x + y;
    }
    

    or perhaps

    int sub(int *x, int *y) {
      return *x+*y;
    }
    

    The easiest way to handle these situations is to use the typemaps.i file. For example:

    %module example
    %include "typemaps.i"
    
    void add(int, int, int *OUTPUT);
    int  sub(int *INPUT, int *INPUT);
    

    In Tcl, this allows you to pass simple values instead of pointer. For example:

    set a [add 3 4]
    puts $a
    7
    

    Notice how the INPUT parameters allow integer values to be passed instead of pointers and how the OUTPUT parameter creates a return result.

    If you don't want to use the names INPUT or OUTPUT , use the %apply directive. For example:

    %module example
    %include "typemaps.i"
    
    %apply int *OUTPUT { int *result };
    %apply int *INPUT  { int *x, int *y};
    
    void add(int x, int y, int *result);
    int  sub(int *x, int *y);
    

    If a function mutates one of its parameters like this,

    void negate(int *x) {
      *x = -(*x);
    }
    

    you can use INOUT like this:

    %include "typemaps.i"
    ...
    void negate(int *INOUT);
    

    In Tcl, a mutated parameter shows up as a return value. For example:

    set a [negate 3]
    puts $a
    -3
    

    The most common use of these special typemap rules is to handle functions that return more than one value. For example, sometimes a function returns a result as well as a special error code:

    /* send message, return number of bytes sent, along with success code */
    int send_message(char *text, int len, int *success);
    

    To wrap such a function, simply use the OUTPUT rule above. For example:

    %module example
    %include "typemaps.i"
    %apply int *OUTPUT { int *success };
    ...
    int send_message(char *text, int *success);
    

    When used in Tcl, the function will return multiple values as a list.

    set r [send_message "Hello World"]
    set bytes [lindex $r 0]
    set success [lindex $r 1]
    

    Another common use of multiple return values are in query functions. For example:

    void get_dimensions(Matrix *m, int *rows, int *columns);
    

    To wrap this, you might use the following:

    %module example
    %include "typemaps.i"
    %apply int *OUTPUT { int *rows, int *columns };
    ...
    void get_dimensions(Matrix *m, int *rows, *columns);
    

    Now, in Perl:

    set dim [get_dimensions $m]
    set r  [lindex $dim 0]
    set c  [lindex $dim 1]
    

    36.6 Exception handling

    The %exception directive can be used to create a user-definable exception handler in charge of converting exceptions in your C/C++ program into Tcl exceptions. The chapter on customization features contains more details, but suppose you extended the array example into a C++ class like the following :

    class RangeError {};   // Used for an exception
    
    class DoubleArray {
      private:
        int n;
        double *ptr;
      public:
        // Create a new array of fixed size
        DoubleArray(int size) {
          ptr = new double[size];
          n = size;
        }
        // Destroy an array
        ~DoubleArray() {
          delete ptr;
        }
        // Return the length of the array
        int   length() {
          return n;
        }
    
        // Get an item from the array and perform bounds checking.
        double getitem(int i) {
          if ((i >= 0) && (i < n))
            return ptr[i];
          else
            throw RangeError();
        }
    
        // Set an item in the array and perform bounds checking.
        void setitem(int i, double val) {
          if ((i >= 0) && (i < n))
            ptr[i] = val;
          else {
            throw RangeError();
          }
        }
      };
    

    The functions associated with this class can throw a C++ range exception for an out-of-bounds array access. We can catch this in our Tcl extension by specifying the following in an interface file :

    %exception {
      try {
        $action                // Gets substituted by actual function call
      }
      catch (RangeError) {
        Tcl_SetResult(interp, (char *)"Array index out-of-bounds", TCL_STATIC);
        return TCL_ERROR;
      }
    }
    

    As shown, the exception handling code will be added to every wrapper function. Since this is somewhat inefficient. You might consider refining the exception handler to only apply to specific methods like this:

    %exception getitem {
      try {
        $action
      }
      catch (RangeError) {
        Tcl_SetResult(interp, (char *)"Array index out-of-bounds", TCL_STATIC);
        return TCL_ERROR;
      }
    }
    
    %exception setitem {
      try {
        $action
      }
      catch (RangeError) {
        Tcl_SetResult(interp, (char *)"Array index out-of-bounds", TCL_STATIC);
        return TCL_ERROR;
      }
    }
    

    In this case, the exception handler is only attached to methods and functions named getitem and setitem.

    If you had a lot of different methods, you can avoid extra typing by using a macro. For example:

    %define RANGE_ERROR
    {
      try {
        $action
      }
      catch (RangeError) {
        Tcl_SetResult(interp, (char *)"Array index out-of-bounds", TCL_STATIC);
        return TCL_ERROR;
      }
    }
    %enddef
    
    %exception getitem RANGE_ERROR;
    %exception setitem RANGE_ERROR;
    

    Since SWIG's exception handling is user-definable, you are not limited to C++ exception handling. See the chapter on " Customization Features" for more examples.

    36.7 Typemaps

    This section describes how you can modify SWIG's default wrapping behavior for various C/C++ datatypes using the %typemap directive. This is an advanced topic that assumes familiarity with the Tcl C API as well as the material in the "Typemaps " chapter.

    Before proceeding, it should be stressed that typemaps are not a required part of using SWIG---the default wrapping behavior is enough in most cases. Typemaps are only used if you want to change some aspect of the primitive C-Tcl interface.

    36.7.1 What is a typemap?

    A typemap is nothing more than a code generation rule that is attached to a specific C datatype. For example, to convert integers from Tcl to C, you might define a typemap like this:

    %module example
    
    %typemap(in) int {
      if (Tcl_GetIntFromObj(interp, $input, &$1) == TCL_ERROR)
        return TCL_ERROR;
      printf("Received an integer : %d\n", $1);
    }
    %inline %{
    extern int fact(int n);
    %}
    

    Typemaps are always associated with some specific aspect of code generation. In this case, the "in" method refers to the conversion of input arguments to C/C++. The datatype int is the datatype to which the typemap will be applied. The supplied C code is used to convert values. In this code a number of special variable prefaced by a $ are used. The $1 variable is placeholder for a local variable of type int. The $input variable is the input object of type Tcl_Obj *.

    When this example is compiled into a Tcl module, it operates as follows:

    % load ./example.so
    % fact 6
    Received an integer : 6
    720
    

    In this example, the typemap is applied to all occurrences of the int datatype. You can refine this by supplying an optional parameter name. For example:

    %module example
    
    %typemap(in) int n {
      if (Tcl_GetIntFromObj(interp, $input, &$1) == TCL_ERROR)
        return TCL_ERROR;
      printf("n = %d\n", $1);
    }
    %inline %{
    extern int fact(int n);
    %}
    

    In this case, the typemap code is only attached to arguments that exactly match int n.

    The application of a typemap to specific datatypes and argument names involves more than simple text-matching--typemaps are fully integrated into the SWIG type-system. When you define a typemap for int, that typemap applies to int and qualified variations such as const int. In addition, the typemap system follows typedef declarations. For example:

    %typemap(in) int n {
      if (Tcl_GetIntFromObj(interp, $input, &$1) == TCL_ERROR)
        return TCL_ERROR;
      printf("n = %d\n", $1);
    }
    %inline %{
    typedef int Integer;
    extern int fact(Integer n);    // Above typemap is applied
    %}
    

    However, the matching of typedef only occurs in one direction. If you defined a typemap for Integer, it is not applied to arguments of type int.

    Typemaps can also be defined for groups of consecutive arguments. For example:

    %typemap(in) (char *str, int len) {
        $1 = Tcl_GetStringFromObj($input, &$2);
    };
    
    int count(char c, char *str, int len);
    

    When a multi-argument typemap is defined, the arguments are always handled as a single Tcl object. This allows the function to be used like this (notice how the length parameter is omitted):

    % count e "Hello World"
    1
    

    36.7.2 Tcl typemaps

    The previous section illustrated an "in" typemap for converting Tcl objects to C. A variety of different typemap methods are defined by the Tcl module. For example, to convert a C integer back into a Tcl object, you might define an "out" typemap like this:

    %typemap(out) int {
      Tcl_SetObjResult(interp, Tcl_NewIntObj($1));
    }
    

    The following list details all of the typemap methods that can be used by the Tcl module:

    %typemap(in)

    Converts Tcl objects to input function arguments

    %typemap(out)

    Converts return value of a C function to a Tcl object

    %typemap(varin)

    Assigns a C global variable from a Tcl object

    %typemap(varout)

    Returns a C global variable as a Tcl object

    %typemap(freearg)

    Cleans up a function argument (if necessary)

    %typemap(argout)

    Output argument processing

    %typemap(ret)

    Cleanup of function return values

    %typemap(consttab)

    Creation of Tcl constants (constant table)

    %typemap(constcode)

    Creation of Tcl constants (init function)

    %typemap(memberin)

    Setting of structure/class member data

    %typemap(globalin)

    Setting of C global variables

    %typemap(check)

    Checks function input values.

    %typemap(default)

    Set a default value for an argument (making it optional).

    %typemap(arginit)

    Initialize an argument to a value before any conversions occur.

    Examples of these methods will appear shortly.

    36.7.3 Typemap variables

    Within typemap code, a number of special variables prefaced with a $ may appear. A full list of variables can be found in the " Typemaps" chapter. This is a list of the most common variables:

    $1

    A C local variable corresponding to the actual type specified in the %typemap directive. For input values, this is a C local variable that's supposed to hold an argument value. For output values, this is the raw result that's supposed to be returned to Tcl.

    $input

    A Tcl_Obj * holding a raw Tcl object with an argument or variable value.

    $result

    A Tcl_Obj * that holds the result to be returned to Tcl.

    $1_name

    The parameter name that was matched.

    $1_type

    The actual C datatype matched by the typemap.

    $1_ltype

    An assignable version of the datatype matched by the typemap (a type that can appear on the left-hand-side of a C assignment operation). This type is stripped of qualifiers and may be an altered version of $1_type. All arguments and local variables in wrapper functions are declared using this type so that their values can be properly assigned.

    $symname

    The Tcl name of the wrapper function being created.

    36.7.4 Converting a Tcl list to a char **

    A common problem in many C programs is the processing of command line arguments, which are usually passed in an array of NULL terminated strings. The following SWIG interface file allows a Tcl list to be used as a char ** object.

    %module argv
    
    // This tells SWIG to treat char ** as a special case
    %typemap(in) char ** {
      Tcl_Obj **listobjv;
      int       nitems;
      int       i;
      if (Tcl_ListObjGetElements(interp, $input, &nitems, &listobjv) == TCL_ERROR) {
        return TCL_ERROR;
      }
      $1 = (char **) malloc((nitems+1)*sizeof(char *));
      for (i = 0; i < nitems; i++) {
        $1[i] = Tcl_GetStringFromObj(listobjv[i], 0);
      }
      $1[i] = 0;
    }
    
    // This gives SWIG some cleanup code that will get called after the function call
    %typemap(freearg) char ** {
      if ($1) {
        free($1);
      }
    }
    
    // Now a test functions
    %inline %{
      int print_args(char **argv) {
        int i = 0;
        while (argv[i]) {
          printf("argv[%d] = %s\n", i, argv[i]);
          i++;
        }
        return i;
      }
    %}
    %include "tclsh.i"
    
    

    In Tcl:

    % print_args {John Guido Larry}
    argv[0] = John
    argv[1] = Guido
    argv[2] = Larry
    3
    

    36.7.5 Returning values in arguments

    The "argout" typemap can be used to return a value originating from a function argument. For example :

    // A typemap defining how to return an argument by appending it to the result
    %typemap(argout) double *outvalue {
      Tcl_Obj *o = Tcl_NewDoubleObj($1);
      Tcl_ListObjAppendElement(interp, $result, o);
    }
    
    // A typemap telling SWIG to ignore an argument for input
    // However, we still need to pass a pointer to the C function
    %typemap(in, numinputs=0) double *outvalue (double temp) {
      $1 = &temp;
    }
    
    // Now a function returning two values
    int mypow(double a, double b, double *outvalue) {
      if ((a < 0) || (b < 0)) return -1;
      *outvalue = pow(a, b);
      return 0;
    };
    

    When wrapped, SWIG matches the argout typemap to the " double *outvalue" argument. The numinputs=0 specification tells SWIG to simply ignore this argument when generating wrapper code. As a result, a Tcl function using these typemaps will work like this :

    % mypow 2 3     # Returns two values, a status value and the result
    0 8
    %
    

    36.7.6 Useful functions

    The following tables provide some functions that may be useful in writing Tcl typemaps.

    Integers

    Tcl_Obj   *Tcl_NewIntObj(int Value);
    void       Tcl_SetIntObj(Tcl_Obj *obj, int Value);
    int        Tcl_GetIntFromObj(Tcl_Interp *, Tcl_Obj *obj, int *ip);
    

    Floating Point

    Tcl_Obj  *Tcl_NewDoubleObj(double Value);
    void      Tcl_SetDoubleObj(Tcl_Obj *obj, double value);
    int       Tcl_GetDoubleFromObj(Tcl_Interp *, Tcl_Obj *o, double *dp);
    

    Strings

    Tcl_Obj  *Tcl_NewStringObj(char *str, int len);
    char     *Tcl_GetStringFromObj(Tcl_Obj *obj, int *len);
    void      Tcl_AppendToObj(Tcl_Obj *obj, char *str, int len);
    

    Lists

    Tcl_Obj  *Tcl_NewListObj(int objc, Tcl_Obj *objv);
    int       Tcl_ListObjAppendList(Tcl_Interp *, Tcl_Obj *listPtr, Tcl_Obj *elemListPtr);
    int       Tcl_ListObjAppendElement(Tcl_Interp *, Tcl_Obj *listPtr, Tcl_Obj *element);
    int       Tcl_ListObjGetElements(Tcl_Interp *, Tcl_Obj *listPtr, int *objcPtr,
                                     Tcl_Obj ***objvPtr);
    int       Tcl_ListObjLength(Tcl_Interp *, Tcl_Obj *listPtr, int *intPtr);
    int       Tcl_ListObjIndex(Tcl_Interp *, Tcl_Obj *listPtr, int index,
                               Tcl_Obj_Obj **objptr);
    int       Tcl_ListObjReplace(Tcl_Interp *, Tcl_Obj *listPtr, int first, int count,
                                 int objc, Tcl_Obj *objv);
    

    Objects

    Tcl_Obj *Tcl_DuplicateObj(Tcl_Obj *obj);
    void     Tcl_IncrRefCount(Tcl_Obj *obj);
    void     Tcl_DecrRefCount(Tcl_Obj *obj);
    int      Tcl_IsShared(Tcl_Obj *obj);
    

    36.7.7 Standard typemaps

    The following typemaps show how to convert a few common kinds of objects between Tcl and C (and to give a better idea of how typemaps work)

    Integer conversion

    %typemap(in) int, short, long {
      int temp;
      if (Tcl_GetIntFromObj(interp, $input, &temp) == TCL_ERROR)
        return TCL_ERROR;
      $1 = ($1_ltype) temp;
    }
    

    %typemap(out) int, short, long {
      Tcl_SetIntObj($result, (int) $1);
    }
    

    Floating point conversion

    %typemap(in) float, double {
      double temp;
      if (Tcl_GetDoubleFromObj(interp, $input, &temp) == TCL_ERROR)
        return TCL_ERROR;
      $1 = ($1_ltype) temp;
    }
    

    %typemap(out) float, double {
      Tcl_SetDoubleObj($result, $1);
    }
    

    String Conversion

    %typemap(in) char * {
      int len;
      $1 = Tcl_GetStringFromObj(interp, &len);
    }
    

    %typemap(out, noblock=1, fragment="SWIG_FromCharPtr") char *, const char * {
      Tcl_SetObjResult(interp, SWIG_FromCharPtr((const char *)$1));
    }
    
    

    36.7.8 Pointer handling

    SWIG pointers are mapped into Tcl strings containing the hexadecimal value and type. The following functions can be used to create and read pointer values.

    int SWIG_ConvertPtr(Tcl_Obj *obj, void **ptr, swig_type_info *ty, int flags)

    Converts a Tcl object obj to a C pointer. The result of the conversion is placed into the pointer located at ptr. ty is a SWIG type descriptor structure. flags is used to handle error checking and other aspects of conversion. It is currently reserved for future expansion. Returns 0 on success and -1 on error.

    Tcl_Obj *SWIG_NewPointerObj(void *ptr, swig_type_info *ty, int flags)

    Creates a new Tcl pointer object. ptr is the pointer to convert, ty is the SWIG type descriptor structure that describes the type, and own is a flag reserved for future expansion.

    Both of these functions require the use of a special SWIG type-descriptor structure. This structure contains information about the mangled name of the datatype, type-equivalence information, as well as information about converting pointer values under C++ inheritance. For a type of Foo *, the type descriptor structure is usually accessed as follows:

    Foo *f;
    if (!SWIG_IsOK(SWIG_ConvertPtr($input, (void **) &f, SWIGTYPE_p_Foo, 0))) {
      SWIG_exception_fail(SWIG_TypeError, "in method '$symname', expecting type Foo");
    }
    
    Tcl_Obj *;
    obj = SWIG_NewPointerObj(f, SWIGTYPE_p_Foo, 0);
    

    In a typemap, the type descriptor should always be accessed using the special typemap variable $1_descriptor. For example:

    %typemap(in) Foo * {
      if (!SWIG_IsOK(SWIG_ConvertPtr($input, (void **) &$1, $1_descriptor, 0))) {
        SWIG_exception_fail(SWIG_TypeError, "in method '$symname', expecting type Foo");
      }
    }
    

    If necessary, the descriptor for any type can be obtained using the $descriptor() macro in a typemap. For example:

    %typemap(in) Foo * {
      if (!SWIG_IsOK(SWIG_ConvertPtr($input, (void **) &$1, $descriptor(Foo *), 0))) {
        SWIG_exception_fail(SWIG_TypeError, "in method '$symname', expecting type Foo");
      }
    }
    

    36.8 Turning a SWIG module into a Tcl Package.

    Tcl 7.4 introduced the idea of an extension package. By default, SWIG generates all of the code necessary to create a package. To set the package version, simply use the -pkgversion option. For example:

    % swig -tcl -pkgversion 2.3 example.i
    

    After building the SWIG generated module, you need to execute the " pkg_mkIndex" command inside tclsh. For example :

    unix > tclsh
    % pkg_mkIndex . example.so
    % exit
    

    This creates a file "pkgIndex.tcl" with information about the package. To use your package, you now need to move it to its own subdirectory which has the same name as the package. For example :

    ./example/
               pkgIndex.tcl           # The file created by pkg_mkIndex
               example.so             # The SWIG generated module
    

    Finally, assuming that you're not entirely confused at this point, make sure that the example subdirectory is visible from the directories contained in either the tcl_library or auto_path variables. At this point you're ready to use the package as follows :

    unix > tclsh
    % package require example
    % fact 4
    24
    %
    

    If you're working with an example in the current directory and this doesn't work, do this instead :

    unix > tclsh
    % lappend auto_path .
    % package require example
    % fact 4
    24
    

    As a final note, most SWIG examples do not yet use the package commands. For simple extensions it may be easier just to use the load command instead.

    36.9 Building new kinds of Tcl interfaces (in Tcl)

    One of the most interesting aspects of Tcl and SWIG is that you can create entirely new kinds of Tcl interfaces in Tcl using the low-level SWIG accessor functions. For example, suppose you had a library of helper functions to access arrays :

    /* File : array.i */
    %module array
    
    %inline %{
    double *new_double(int size) {
      return (double *) malloc(size*sizeof(double));
    }
    void delete_double(double *a) {
      free(a);
    }
    double get_double(double *a, int index) {
      return a[index];
    }
    void set_double(double *a, int index, double val) {
      a[index] = val;
    }
    int *new_int(int size) {
      return (int *) malloc(size*sizeof(int));
    }
    void delete_int(int *a) {
      free(a);
    }
    int get_int(int *a, int index) {
      return a[index];
    }
    int set_int(int *a, int index, int val) {
      a[index] = val;
    }
    %}
    
    

    While these could be called directly, we could also write a Tcl script like this :

    proc Array {type size} {
        set ptr [new_$type $size]
        set code {
            set method [lindex $args 0]
            set parms [concat $ptr [lrange $args 1 end]]
            switch $method {
                get {return [eval "get_$type $parms"]}
                set {return [eval "set_$type $parms"]}
                delete {eval "delete_$type $ptr; rename $ptr {}"}
            }
        }
        # Create a procedure
        uplevel "proc $ptr args {set ptr $ptr; set type $type;$code}"
        return $ptr
    }
    

    Our script allows easy array access as follows :

    set a [Array double 100]                   ;# Create a double [100]
    for {set i 0} {$i < 100} {incr i 1} {      ;# Clear the array
            $a set $i 0.0
    }
    $a set 3 3.1455                            ;# Set an individual element
    set b [$a get 10]                          ;# Retrieve an element
    
    set ia [Array int 50]                      ;# Create an int[50]
    for {set i 0} {$i < 50} {incr i 1} {       ;# Clear it
            $ia set $i 0
    }
    $ia set 3 7                                ;# Set an individual element
    set ib [$ia get 10]                        ;# Get an individual element
    
    $a delete                                  ;# Destroy a
    $ia delete                                 ;# Destroy ia
    

    The cool thing about this approach is that it makes a common interface for two different types of arrays. In fact, if we were to add more C datatypes to our wrapper file, the Tcl code would work with those as well--without modification. If an unsupported datatype was requested, the Tcl code would simply return with an error so there is very little danger of blowing something up (although it is easily accomplished with an out of bounds array access).

    36.9.1 Proxy classes

    A similar approach can be applied to proxy classes (also known as shadow classes). The following example is provided by Erik Bierwagen and Paul Saxe. To use it, run SWIG with the -noobject option (which disables the builtin object oriented interface). When running Tcl, simply source this file. Now, objects can be used in a more or less natural fashion.

    # swig_c++.tcl
    # Provides a simple object oriented interface using
    # SWIG's low level interface.
    #
    
    proc new {objectType handle_r args} {
        # Creates a new SWIG object of the given type,
        # returning a handle in the variable "handle_r".
        #
        # Also creates a procedure for the object and a trace on
        # the handle variable that deletes the object when the
        # handle variable is overwritten or unset
        upvar $handle_r handle
        #
        # Create the new object
        #
        eval set handle \[new_$objectType $args\]
        #
        # Set up the object procedure
        #
        proc $handle {cmd args} "eval ${objectType}_\$cmd $handle \$args"
        #
        # And the trace ...
        #
        uplevel trace variable $handle_r uw "{deleteObject $objectType $handle}"
        #
        # Return the handle so that 'new' can be used as an argument to a procedure
        #
        return $handle
    }
    
    proc deleteObject {objectType handle name element op} {
        #
        # Check that the object handle has a reasonable form
        #
        if {![regexp {_[0-9a-f]*_(.+)_p} $handle]} {
            error "deleteObject: not a valid object handle: $handle"
        }
        #
        # Remove the object procedure
        #
        catch {rename $handle {}}
        #
        # Delete the object
        #
        delete_$objectType $handle
    }
    
    proc delete {handle_r} {
        #
        # A synonym for unset that is more familiar to C++ programmers
        #
        uplevel unset $handle_r
    }
    

    To use this file, we simply source it and execute commands such as "new" and "delete" to manipulate objects. For example :

    // list.i
    %module List
    %{
    #include "list.h"
    %}
    
    // Very simple C++ example
    
    class List {
    public:
      List();  // Create a new list
      ~List(); // Destroy a list
      int  search(char *value);
      void insert(char *);  // Insert a new item into the list
      void remove(char *);  // Remove item from list
      char *get(int n);     // Get the nth item in the list
      int  length;          // The current length of the list
    static void print(List *l);  // Print out the contents of the list
    };
    

    Now a Tcl script using the interface...

    load ./list.so list       ; # Load the module
    source swig_c++.tcl       ; # Source the object file
    
    new List l
    $l insert Dave
    $l insert John
    $l insert Guido
    $l remove Dave
    puts $l length_get
    
    delete l
    

    The cool thing about this example is that it works with any C++ object wrapped by SWIG and requires no special compilation. Proof that a short, but clever Tcl script can be combined with SWIG to do many interesting things.

    36.10 Tcl/Tk Stubs

    For background information about the Tcl Stubs feature, see http://www.tcl.tk/doc/howto/stubs.html.

    As of SWIG 1.3.10, the generated C/C++ wrapper will use the Tcl Stubs feature if compiled with -DUSE_TCL_STUBS.

    As of SWIG 1.3.40, the generated C/C++ wrapper will use the Tk Stubs feature if compiled with -DUSE_TK_STUBS. Also, you can override the minimum version to support which is passed to Tcl_InitStubs() and Tk_InitStubs() with -DSWIG_TCL_STUBS_VERSION="8.3" or the version being compiled with using -DSWIG_TCL_STUBS_VERSION=TCL_VERSION.


    37 SWIG and MzScheme/Racket

    This section contains information on SWIG's support of Racket, formally known as MzScheme.

    37.1 Creating native structures

    Example interface file:

    /* define a macro for the struct creation */
    %define handle_ptr(TYPE, NAME)
    %typemap(argout) TYPE *NAME{
      Scheme_Object *o = SWIG_NewStructFromPtr($1, $*1_mangle);
      SWIG_APPEND_VALUE(o);
    }
    
    %typemap(in, numinputs=0) TYPE *NAME (TYPE temp) {
      $1 = &temp;
    }
    %enddef
    
    /* setup the typemaps for the pointer to an output parameter cntrs */
    handle_ptr(struct diag_cntrs, cntrs);
    

    Then in scheme, you can use regular struct access procedures like

            ; suppose a function created a struct foo as
            ; (define foo (make-diag-cntrs (#x1 #x2 #x3) (make-inspector))
            ; Then you can do
            (format "0x~x" (diag-cntrs-field1 foo))
            (format "0x~x" (diag-cntrs-field2 foo))
            ;etc...
    

    37.2 Simple example

    A few examples are available in the Examples/mzscheme directory. The code and log of a session using SWIG below should help getting started.

    C header file:

    // example.h
    int fact(int n);
    

    C source code:

    // File: example.c
    #include "example.h"
    
    int fact(int n) {
      if (n < 0) { /* This should probably return an error, but this is simpler */
        return 0;
      }
      if (n == 0) {
        return 1;
      }
      else {
        /* testing for overflow would be a good idea here */
        return n * fact(n-1);
      }
    }
    

    SWIG interface file:

    /* File: example.i */
    %module example
    
    %{
    #include "example.h"
    %}
    
    int fact(int n);
    

    The session below using the above files is on an OS X machine, but the points to be made are more general. On OS X, libtool is the tool which creates libraries, which are named .dylib, rather than .so on other unixes, or .dll on Windows.

    % swig -mzscheme -declaremodule example.i
    % gcc -c -m32 -o example.o example.c # force 32-bit object file (mzscheme is 32-bit only)
    % libtool -dynamic -o libexample.dylib example.o # make it into a library
    % ls # what've we got so far?
    example.c example.o
    example.h example_wrap.c
    example.i libexample.dylib*
    % mzc --cgc --cc example_wrap.c # compile the wrapping code
    % LDFLAGS="-L. -lexample" mzc --ld example_wrap.dylib example_wrap.o # ...and link it
    % mzscheme -e '(path->string (build-path "compiled" "native" (system-library-subpath)))'
    "compiled/native/i386-macosx/3m"
    % mkdir -p compiled/native/i386-macosx/3m # move the extension library to a magic place
    % mv example_wrap.dylib compiled/native/i386-macosx/3m/example_ss.dylib
    % mzscheme
    Welcome to MzScheme v4.2.4 [3m], Copyright (c) 2004-2010 PLT Scheme Inc.
    > (require "example.ss")
    > (fact 5)
    120
    > ^D
    % echo 'It works!'
    

    Some points of interest:

    • This is on a 64-bit machine, so we have to include the -m32 option when building the object file
    • If you want to declare a scheme module (and you probably do), it's important that you include the -declaremodule option to swig (if you miss this out, it'll appear to work, but fail later).
    • Use mzc to compile and then link the wrapped code. You'll probably need to adjust the link flags to refer to the library you're wrapping (you can either do this with an LDFLAGS declaration, as here, or with multiple ++ldf options to mzc).
    • Create the directory with path (build-path "compiled" "native" (system-library-subpath)) and move the freshly-generated .dylib to there, changing its name to module-name_ss.dylib. After that, you can REQUIRE the new module with (require "module-name.ss").
    • The above requests mzc to create an extension using the CGC garbage-collector. The alternative -- the 3m collector -- has generally better performance, but work is still required for SWIG to emit code which is compatible with it.

    37.3 External documentation

    See the C API for more description of using the mechanism for adding extensions. The main documentation is here.

    Tip: mzc's --vv option is very useful for debugging the inevitable library problems you'll encounter.


    38 SWIG and OCaml

    This chapter describes SWIG's support of Ocaml.

    Ocaml is a relatively recent addition to the ML family, and is a recent addition to SWIG. It's the second compiled, typed language to be added. Ocaml has widely acknowledged benefits for engineers, mostly derived from a sophisticated type system, compile-time checking which eliminates several classes of common programming errors, and good native performance. While all of this is wonderful, there are well-written C and C++ libraries that Ocaml users will want to take advantage of as part of their arsenal (such as SSL and gdbm), as well as their own mature C and C++ code. SWIG allows this code to be used in a natural, type-safe way with Ocaml, by providing the necessary, but repetitive glue code which creates and uses Ocaml values to communicate with C and C++ code. In addition, SWIG also produces the needed Ocaml source that binds variants, functions, classes, etc.

    If you're not familiar with the Objective Caml language, you can visit The Ocaml Website.

    38.1 Preliminaries

    SWIG is compatible with OCaml 3.12.0 and above. Given the choice, you should use the latest stable release. The SWIG Ocaml module has been tested on Linux (x86, PPC, Sparc) and Cygwin on Windows. The best way to determine whether your system will work is to compile the examples and test-suite which come with SWIG. You can do this by running make check from the SWIG root directory after installing SWIG. The Ocaml module has been tested using the system's dynamic linking (the usual -lxxx against libxxx.so, as well as with Gerd Stolpmann's Dl package. The ocaml_dynamic and ocaml_dynamic_cpp targets in the file Examples/Makefile illustrate how to compile and link SWIG modules that will be loaded dynamically. This has only been tested on Linux so far.

    38.1.1 Running SWIG

    The basics of getting a SWIG Ocaml module up and running can be seen from one of SWIG's example Makefiles, but is also described here. To build an Ocaml module, run SWIG using the -ocaml option.

    %swig -ocaml example.i
    

    This will produce 3 files. The file example_wrap.c contains all of the C code needed to build an Ocaml module. To build the module, you will compile the file example_wrap.c with ocamlc or ocamlopt to create the needed .o file. You will need to compile the resulting .ml and .mli files as well, and do the final link with -custom (not needed for native link).

    38.1.2 Compiling the code

    The OCaml SWIG module now requires you to compile a module (Swig ) separately. In addition to aggregating common SWIG functionality, the Swig module contains the data structure that represents C/C++ values. This allows easier data sharing between modules if two or more are combined, because the type of each SWIG'ed module's c_obj is derived from Swig.c_obj_t. This also allows SWIG to acquire new conversions painlessly, as well as giving the user more freedom with respect to custom typing. Use ocamlc or ocamlopt to compile your SWIG interface like:

    % swig -ocaml -co swig.mli ; swig -ocaml -co swig.ml
    % ocamlc -c swig.mli ; ocamlc -c swig.ml
    % ocamlc -c -ccopt "-I/usr/include/foo" example_wrap.c
    % ocamlc -c example.mli
    % ocamlc -c example.ml
    

    ocamlc is aware of .c files and knows how to handle them. Unfortunately, it does not know about .cxx, .cc, or .cpp files, so when SWIG is invoked in C++ mode, you must:

    % cp example_wrap.cxx example_wrap.cxx.c
    % ocamlc -c ... -ccopt -xc++ example_wrap.cxx.c
    % ...
    

    38.1.3 The camlp4 module

    The camlp4 module (swigp4.ml -> swigp4.cmo) contains a simple rewriter which makes C++ code blend more seamlessly with objective caml code. Its use is optional, but encouraged. The source file is included in the Lib/ocaml directory of the SWIG source distribution. You can checkout this file with "swig -ocaml -co swigp4.ml". You should compile the file with "ocamlc -I `camlp4 -where` -pp 'camlp4o pa_extend.cmo q_MLast.cmo' -c swigp4.ml"

    The basic principle of the module is to recognize certain non-caml expressions and convert them for use with C++ code as interfaced by SWIG. The camlp4 module is written to work with generated SWIG interfaces, and probably isn't great to use with anything else.

    Here are the main rewriting rules:

    InputRewritten to
    f'( ... ) as in
    atoi'("0") or
    _exit'(0)
    f(C_list [ ... ]) as in
    atoi (C_list [ C_string "0" ]) or
    _exit (C_list [ C_int 0 ])
    object -> method ( ... )(invoke object) "method" (C_list [ ... ])
    object 'binop argument as in
    a '+= b
    (invoke object) "+=" argument as in
    (invoke a) "+=" b
    Note that because camlp4 always recognizes << and >>, they are replaced by lsl and lsr in operator names.
    'unop object as in
    '! a
    (invoke a) "!" C_void
    Smart pointer access like this
    object '-> method ( args )
    (invoke (invoke object "->" C_void))
    Invoke syntax
    object . '( ... )
    (invoke object) "()" (C_list [ ... ])
    Array syntax
    object '[ 10 ]
    (invoke object) "[]" (C_int 10)
    Assignment syntax
    let a = '10 and b = '"foo" and c = '1.0 and d = 'true
    let a = C_int 10 and b = C_string "foo" and c = C_double 1.0 and d = C_bool true
    Cast syntax
    let a = _atoi '("2") as int
    let b = (getenv "PATH") to string
    This works for int, string, float, bool
    let a = get_int (_atoi (C_string "2"))
    let b = C_string (getenv "PATH")

    38.1.4 Using your module

    You can test-drive your module by building a toplevel ocaml interpreter. Consult the ocaml manual for details.

    When linking any ocaml bytecode with your module, use the -custom option to build your functions into the primitive list. This option is not needed when you build native code.

    38.1.5 Compilation problems and compiling with C++

    As mentioned above, .cxx files need special handling to be compiled with ocamlc. Other than that, C code that uses class as a non-keyword, and C code that is too liberal with pointer types may not compile under the C++ compiler. Most code meant to be compiled as C++ will not have problems.

    38.2 The low-level Ocaml/C interface

    In order to provide access to overloaded functions, and provide sensible outputs from them, all C entities are represented as members of the c_obj type:

    In the code as seen by the typemap writer, there is a value, swig_result, that always contains the current return data. It is a list, and must be appended with the caml_list_append function, or with functions and macros provided by objective caml.

    type c_obj =
        C_void
      | C_bool of bool
      | C_char of char
      | C_uchar of char
      | C_short of int
      | C_ushort of int
      | C_int of int
      | C_uint of int32
      | C_int32 of int32
      | C_int64 of int64
      | C_float of float
      | C_double of float
      | C_ptr of int64 * int64
      | C_array of c_obj array
      | C_list of c_obj list
      | C_obj of (string -> c_obj -> c_obj)
      | C_string of string
      | C_enum of c_enum_t
    

    A few functions exist which generate and return these:

    • caml_ptr_val receives a c_obj and returns a void *. This should be used for all pointer purposes.
    • caml_long_val receives a c_obj and returns a long. This should be used for most integral purposes.
    • caml_val_ptr receives a void * and returns a c_obj.
    • caml_val_bool receives a C int and returns a c_obj representing its bool value.
    • caml_val_(u)?(char|short|int|long|float|double) receives an appropriate C value and returns a c_obj representing it.
    • caml_val_string receives a char * and returns a string value.
    • caml_val_string_len receives a char * and a length and returns a string value.
    • caml_val_obj receives a void * and an object type and returns a C_obj, which contains a closure giving method access.

    Because of this style, a typemap can return any kind of value it wants from a function. This enables out typemaps and inout typemaps to work well. The one thing to remember about outputting values is that you must append them to the return list with swig_result = caml_list_append(swig_result, v).

    This function will return a new list that has your element appended. Upon return to caml space, the fnhelper function beautifies the result. A list containing a single item degrades to only that item (i.e. [ C_int 3 ] -> C_int 3), and a list containing more than one item is wrapped in C_list (i.e. [ C_char 'a' ; C_char 'b' ] -> C_list [ C_char 'a' ; C_char 'b' ]). This is in order to make return values easier to handle when functions have only one return value, such as constructors, and operators. In addition, string, pointer, and object values are interchangeable with respect to caml_ptr_val, so you can allocate memory as caml strings and still use the resulting pointers for C purposes, even using them to construct simple objects on. Note, though, that foreign C++ code does not respect the garbage collector, although the SWIG interface does.

    The wild card type that you can use in lots of different ways is C_obj. It allows you to wrap any type of thing you like as an object using the same mechanism that the ocaml module does. When evaluated in caml_ptr_val, the returned value is the result of a call to the object's "&" operator, taken as a pointer.

    You should only construct values using objective caml, or using the functions caml_val_* functions provided as static functions to a SWIG ocaml module, as well as the caml_list_* functions. These functions provide everything a typemap needs to produce values. In addition, value items pass through directly, but you must make your own type signature for a function that uses value in this way.

    38.2.1 The generated module

    The SWIG %module directive specifies the name of the Ocaml module to be generated. If you specified `%module example', then your Ocaml code will be accessible in the module Example. The module name is always capitalized as is the ocaml convention. Note that you must not use any Ocaml keyword to name your module. Remember that the keywords are not the same as the C++ ones.

    You can introduce extra code into the output wherever you like with SWIG. These are the places you can introduce code:

    "header"This code is inserted near the beginning of the C wrapper file, before any function definitions.
    "wrapper"This code is inserted in the function definition section.
    "runtime"This code is inserted near the end of the C wrapper file.
    "mli"This code is inserted into the caml interface file. Special signatures should be inserted here.
    "ml"This code is inserted in the caml code defining the interface to your C code. Special caml code, as well as any initialization which should run when the module is loaded may be inserted here.
    "classtemplate"The "classtemplate" place is special because it describes the output SWIG will generate for class definitions.

    38.2.2 Enums

    SWIG will wrap enumerations as polymorphic variants in the output Ocaml code, as above in C_enum. In order to support all C++-style uses of enums, the function int_to_enum and enum_to_int are provided for ocaml code to produce and consume these values as integers. Other than that, correct uses of enums will not have a problem. Since enum labels may overlap between enums, the enum_to_int and int_to_enum functions take an enum type label as an argument. Example:

    %module enum_test
    %{
    enum c_enum_type { a = 1, b, c = 4, d = 8 };
    %}
    enum c_enum_type { a = 1, b, c = 4, d = 8 };
    

    The output mli contains:

    type c_enum_type = [
      `unknown
    | `c_enum_type
    ]
    type c_enum_tag = [
      `int of int
    | `a
    | `b
    | `c
    | `d
    ]
    val int_to_enum c_enum_type -> int -> c_obj
    val enum_to_int c_enum_type -> c_obj -> c_obj
    

    So it's possible to do this:

    bash-2.05a$ ocamlmktop -custom enum_test_wrap.o enum_test.cmo -o enum_test_top
    bash-2.05a$ ./enum_test_top
            Objective Caml version 3.04
    
    # open Enum_test ;;
    # let x = C_enum `a ;;
    val x : Enum_test.c_obj = C_enum `a
    # enum_to_int `c_enum_type x ;;
    - : Enum_test.c_obj = C_int 1
    # int_to_enum `c_enum_type 4 ;;
    - : Enum_test.c_obj = C_enum `c
    

    38.2.2.1 Enum typing in Ocaml

    The ocaml SWIG module now has support for loading and using multiple SWIG modules at the same time. This enhances modularity, but presents problems when used with a language which assumes that each module's types are complete at compile time. In order to achieve total soundness enum types are now isolated per-module. The type issue matters when values are shared between functions imported from different modules. You must convert values to master values using the swig_val function before sharing them with another module.

    38.2.3 Arrays

    38.2.3.1 Simple types of bounded arrays

    SWIG has support for array types, but you generally will need to provide a typemap to handle them. You can currently roll your own, or expand some of the macros provided (but not included by default) with the SWIG distribution.

    By including "carray.i", you will get access to some macros that help you create typemaps for array types fairly easily.

    %make_simple_array_typemap is the easiest way to get access to arrays of simple types with known bounds in your code, but this only works for arrays whose bounds are completely specified.

    38.2.3.2 Complex and unbounded arrays

    Unfortunately, unbounded arrays and pointers can't be handled in a completely general way by SWIG, because the end-condition of such an array can't be predicted. In some cases, it will be by consent (e.g. an array of four or more chars), sometimes by explicit length (char *buffer, int len), and sometimes by sentinel value (0, -1, etc.). SWIG can't predict which of these methods will be used in the array, so you have to specify it for yourself in the form of a typemap.

    38.2.3.3 Using an object

    It's possible to use C++ to your advantage by creating a simple object that provides access to your array. This may be more desirable in some cases, since the object can provide bounds checking, etc., that prevents crashes.

    Consider writing an object when the ending condition of your array is complex, such as using a required sentinel, etc.

    38.2.3.4 Example typemap for a function taking float * and int

    This is a simple example in typemap for an array of float, where the length of the array is specified as an extra parameter. Other such typemaps will work similarly. In the example, the function printfloats is called with a float array, and specified length. The actual length reported in the len argument is the length of the array passed from ocaml, making passing an array into this type of function convenient.

    tarray.i
    %module tarray
    %{
    #include <stdio.h>
    
    void printfloats( float *tab, int len ) {
      int i;
    
      for( i = 0; i < len; i++ ) {
        printf( "%f ", tab[i] );
      }
    
      printf( "\n" );
    }
    %}
    
    %typemap(in) (float *tab, int len) {
      int i;
      /* $*1_type */
      $2 = caml_array_len($input);
      $1 = ($*1_type *)malloc( $2 * sizeof( float ) );
      for( i = 0; i < $2; i++ ) {
        $1[i] = caml_double_val(caml_array_nth($input, i));
      }
    }
    
    void printfloats( float *tab, int len );
    
    Sample Run
    # open Tarray ;;
    # _printfloats (C_array [| C_double 1.0 ; C_double 3.0 ; C_double 5.6666 |]) ;;
    1.000000 3.000000 5.666600
    - : Tarray.c_obj = C_void
    

    38.2.4 C++ Classes

    C++ classes, along with structs and unions are represented by C_obj (string -> c_obj -> c_obj) wrapped closures. These objects contain a method list, and a type, which allow them to be used like C++ objects. When passed into typemaps that use pointers, they degrade to pointers through their "&" method. Every method an object has is represented as a string in the object's method table, and each method table exists in memory only once. In addition to any other operators an object might have, certain builtin ones are provided by SWIG: (all of these take no arguments (C_void))

    "~"Delete this object
    "&"Return an ordinary C_ptr value representing this object's address
    "sizeof"If enabled with ("sizeof"="1") on the module node, return the object's size in char.
    ":methods"Returns a list of strings containing the names of the methods this object contains
    ":classof"Returns the name of the class this object belongs to.
    ":parents"Returns a list of all direct parent classes which have been wrapped by SWIG.
    "::[parent-class]"Returns a view of the object as the indicated parent class. This is mainly used internally by the SWIG module, but may be useful to client programs.
    "[member-variable]"Each member variable is wrapped as a method with an optional parameter. Called with one argument, the member variable is set to the value of the argument. With zero arguments, the value is returned.

    Note that this string belongs to the wrapper object, and not the underlying pointer, so using create_[x]_from_ptr alters the returned value for the same object.

    38.2.4.1 STL vector and string Example

    Standard typemaps are now provided for STL vector and string. More are in the works. STL strings are passed just like normal strings, and returned as strings. STL string references don't mutate the original string, (which might be surprising), because Ocaml strings are mutable but have fixed length. Instead, use multiple returns, as in the argout_ref example.

    example.i
    %module example
    %{
    #include "example.h"
    %}
    
    %include <stl.i>
    
    namespace std {
      %template(StringVector) std::vector < string >;
    };
    
    %include "example.h"
    
    This example is in Examples/ocaml/stl

    Since there's a makefile in that directory, the example is easy to build.

    Here's a sample transcript of an interactive session using a string vector after making a toplevel (make toplevel). This example uses the camlp4 module.

    bash-2.05a$ ./runme_top
            Objective Caml version 3.06
    
            Camlp4 Parsing version 3.06
    
    # open Swig ;;
    # open Example ;;
    # let x = new_StringVector '() ;;
    val x : Example.c_obj = C_obj <fun>
    # x -> ":methods" () ;;
    - : Example.c_obj =
    C_list
     [C_string "nop"; C_string "size"; C_string "empty"; C_string "clear";
      C_string "push_back"; C_string "[]"; C_string "="; C_string "set";
      C_string "~"; C_string "&"; C_string ":parents"; C_string ":classof";
      C_string ":methods"]
    # x -> push_back ("foo") ;;
    - : Example.c_obj = C_void
    # x -> push_back ("bar") ;;
    - : Example.c_obj = C_void
    # x -> push_back ("baz") ;;
    - : Example.c_obj = C_void
    # x '[1] ;;
    - : Example.c_obj = C_string "bar"
    # x -> set (1, "spam") ;;
    - : Example.c_obj = C_void
    # x '[1] ;;
    - : Example.c_obj = C_string "spam"
    # for i = 0 to (x -> size() as int) - 1 do
        print_endline ((x '[i to int]) as string)
      done ;;
    foo
    bar
    baz
    - : unit = ()
    #
    

    38.2.4.2 C++ Class Example

    Here's a simple example using Trolltech's Qt Library:

    qt.i
    %module qt
    %{
    #include <qapplication.h>
    #include <qpushbutton.h>
    %}
    class QApplication {
    public:
      QApplication( int argc, char **argv );
      void setMainWidget( QWidget *widget );
      void exec();
    };
    
    class QPushButton {
    public:
      QPushButton( char *str, QWidget *w );
      void resize( int x, int y );
      void show();
    };
    

    38.2.4.3 Compiling the example

    bash-2.05a$ QTPATH=/your/qt/path
    bash-2.05a$ for file in swig.mli swig.ml swigp4.ml ; do swig -ocaml -co $file ; done
    bash-2.05a$ ocamlc -c swig.mli ; ocamlc -c swig.ml
    bash-2.05a$ ocamlc -I `camlp4 -where` -pp "camlp4o pa_extend.cmo q_MLast.cmo" -c swigp4.ml
    bash-2.05a$ swig -ocaml -c++ -I$QTPATH/include qt.i
    bash-2.05a$ mv qt_wrap.cxx qt_wrap.c
    bash-2.05a$ ocamlc -c -ccopt -xc++ -ccopt -g -g -ccopt -I$QTPATH/include qt_wrap.c
    bash-2.05a$ ocamlc -c qt.mli
    bash-2.05a$ ocamlc -c qt.ml
    bash-2.05a$ ocamlmktop -custom swig.cmo -I `camlp4 -where` \
      camlp4o.cma swigp4.cmo qt_wrap.o qt.cmo -o qt_top -cclib \
      -L$QTPATH/lib -cclib -lqt
    

    38.2.4.4 Sample Session

    bash-2.05a$ ./qt_top
            Objective Caml version 3.06
    
            Camlp4 Parsing version 3.06
    
    # open Swig ;;
    # open Qt ;;
    # let a = new_QApplication '(0, 0) ;;
    val a : Qt.c_obj = C_obj <fun>
    # let hello = new_QPushButton '("hi", 0) ;;
    val hello : Qt.c_obj = C_obj <fun>
    # hello -> resize (100, 30) ;;
    - : Qt.c_obj = C_void
    # hello -> show () ;;
    - : Qt.c_obj = C_void
    # a -> exec () ;;
    

    Assuming you have a working installation of QT, you will see a window containing the string "hi" in a button.

    38.2.5 Director Classes

    38.2.5.1 Director Introduction

    Director classes are classes which allow Ocaml code to override the public methods of a C++ object. This facility allows the user to use C++ libraries that require a derived class to provide application specific functionality in the context of an application or utility framework.

    You can turn on director classes by using an optional module argument like this:

    %module(directors="1")
    
    ...
    
    // Turn on the director class for a specific class like this:
    %feature("director")
    class foo {
      ...
    };
    

    38.2.5.2 Overriding Methods in Ocaml

    Because the Ocaml language module treats C++ method calls as calls to a certain function, all you need to do is to define the function that will handle the method calls in terms of the public methods of the object, and any other relevant information. The function new_derived_object uses a stub class to call your methods in place of the ones provided by the underlying implementation. The object you receive is the underlying object, so you are free to call any methods you want from within your derived method. Note that calls to the underlying object do not invoke Ocaml code. You need to handle that yourself.

    new_derived_object receives your function, the function that creates the underlying object, and any constructor arguments, and provides an object that you can use in any usual way. When C++ code calls one of the object's methods, the object invokes the Ocaml function as if it had been invoked from Ocaml, allowing any method definitions to override the C++ ones.

    In this example, I'll examine the objective caml code involved in providing an overloaded class. This example is contained in Examples/ocaml/shapes.

    38.2.5.3 Director Usage Example

    runme.ml
    open Swig
    open Example
    
    ...
    
    let triangle_class pts ob meth args =
      match meth with
          "cover" ->
            (match args with
                 C_list [ x_arg ; y_arg ] ->
                 let xa = x_arg as float
                 and ya = y_arg as float in
                   (point_in_triangle pts xa ya) to bool
               | _ -> raise (Failure "cover needs two double arguments."))
        | _ -> (invoke ob) meth args ;;
    
    ...
    
    let triangle =
      new_derived_object
        new_shape
        (triangle_class ((0.0, 0.0), (0.5, 1.0), (1.0, 0.6)))
        '() ;;
    
    let _ = _draw_shape_coverage '(triangle, 60, 20) ;;
    

    This is the meat of what you need to do. The actual "class" definition containing the overloaded method is defined in the function triangle_class. This is a lot like the class definitions emitted by SWIG, if you look at example.ml, which is generated when SWIG consumes example.i. Basically, you are given the arguments as a c_obj and the method name as a string, and you must intercept the method you are interested in and provide whatever return value you need. Bear in mind that the underlying C++ code needs the right return type, or an exception will be thrown. This exception will generally be Failure, or NotObject. You must call other ocaml methods that you rely on yourself. Due to the way directors are implemented, method calls on your object from with ocaml code will always invoke C++ methods even if they are overridden in ocaml.

    In the example, the draw_shape_coverage function plots the indicated number of points as either covered (x) or uncovered ( ) between 0 and 1 on the X and Y axes. Your shape implementation can provide any coverage map it likes, as long as it responds to the "cover" method call with a boolean return (the underlying method returns bool). This might allow a tricky shape implementation, such as a boolean combination, to be expressed in a more effortless style in ocaml, while leaving the "engine" part of the program in C++.

    38.2.5.4 Creating director objects

    The definition of the actual object triangle can be described this way:

    let triangle =
      new_derived_object
        new_shape
        (triangle_class ((0.0, 0.0), (0.5, 1.0), (1.0, 0.0)))
        '()
    

    The first argument to new_derived_object, new_shape is the method which returns a shape instance. This function will be invoked with the third argument will be appended to the argument list [ C_void ]. In the example, the actual argument list is sent as (C_list [ C_void ; C_void ]). The augmented constructor for a director class needs the first argument to determine whether it is being constructed as a derived object, or as an object of the indicated type only (in this case shape). The Second argument is a closure that will be added to the final C_obj.

    The actual object passed to the self parameter of the director object will be a C_director_core, containing a c_obj option ref and a c_obj. The c_obj provided is the same object that will be returned from new_derived object, that is, the object exposing the overridden methods. The other part is an option ref that will have its value extracted before becoming the ob parameter of your class closure. This ref will contain None if the C++ object underlying is ever destroyed, and will consequently trigger an exception when any method is called on the object after that point (the actual raise is from an inner function used by new_derived_object, and throws NotObject). This prevents a deleted C++ object from causing a core dump, as long as the object is destroyed properly.

    38.2.5.5 Typemaps for directors, directorin, directorout, directorargout

    Special typemaps exist for use with directors, the directorin, directorout, directorargout are used in place of in, out, argout typemaps, except that their direction is reversed. They provide for you to provide argout values, as well as a function return value in the same way you provide function arguments, and to receive arguments the same way you normally receive function returns.

    38.2.5.6 directorin typemap

    The directorin typemap is used when you will receive arguments from a call made by C++ code to you, therefore, values will be translated from C++ to ocaml. You must provide some valid C_obj value. This is the value your ocaml code receives when you are called. In general, a simple directorin typemap can use the same body as a simple out typemap.

    38.2.5.7 directorout typemap

    The directorout typemap is used when you will send an argument from your code back to the C++ caller. That is; directorout specifies a function return conversion. You can usually use the same body as an in typemap for the same type, except when there are special requirements for object ownership, etc.

    38.2.5.8 directorargout typemap

    C++ allows function arguments which are by pointer (*) and by reference (&) to receive a value from the called function, as well as sending one there. Sometimes, this is the main purpose of the argument given. directorargout typemaps allow your caml code to emulate this by specifying additional return values to be put into the output parameters. The SWIG ocaml module is a bit loose in order to make code easier to write. In this case, your return to the caller must be a list containing the normal function return first, followed by any argout values in order. These argout values will be taken from the list and assigned to the values to be returned to C++ through directorargout typemaps. In the event that you don't specify all of the necessary values, integral values will read zero, and struct or object returns have undefined results.

    38.2.6 Exceptions

    If an error occurs in a C or C++ function, you may want to convert that error into an OCaml exception. To do this, you can use the %exception directive. The %exception directive simply lets you rewrite part of the generated wrapper code to include an error check. It is detailed in full in the Exception handling with %exception section.

    In C, a function often indicates an error by returning a status code (e.g. a negative number or a NULL pointer). Here is a simple example of how you might handle that:

    %exception malloc {
      $action
      if (result == NULL) {
        caml_failwith("Not enough memory");
      }
    }
    void *malloc(size_t nbytes);
    

    In OCaml:

    # let a = _malloc (C_int 20000000000);;
    Exception: Failure "Not enough memory".
    #
    

    If a library provides some kind of general error handling framework, you can also use that. For example:

    %exception {
      $action
      if (err_occurred()) {
        caml_failwith(err_message());
      }
    }
    

    If no declaration name is given to %exception, it is applied to all wrapper functions. $action is a SWIG special variable and is replaced by the C/C++ function call being wrapped.

    C++ exceptions are also easy to handle. We can catch a C++ exception and rethrow it as an OCaml exception like this:

    %exception getitem {
      try {
        $action
      } catch (std::out_of_range &e) {
        caml_failwith(e.what());
      }
    }
    
    class FooClass {
      public:
        int getitem(int index);      // Exception handling added
        ...
    };
    

    The language-independent exception.i library file can also be used to raise exceptions. See the SWIG Library chapter.

    38.3 Documentation Features

    The features described in this section can be used to generate documentation comments (colloquially referred to as "docstrings") that can be read by OCamldoc.

    38.3.1 Module docstring

    The first documentation comment of an mli file is the comment associated with the entire module. SWIG supports this by setting an option of the %module directive. For example:

    %module(docstring="This is the example module's docstring") example
    

    When you have more than just a line or so, you can retain the readability of the %module directive by using a macro. For example:

    %define DOCSTRING
    "The `XmlResource` class allows program resources defining menus,
    controls on a panel, etc. to be loaded from an XML file."
    %enddef
    
    %module(docstring=DOCSTRING) xrc
    

    39 Extending SWIG to support new languages

    39.1 Introduction

    This chapter describes SWIG's internal organization and the process by which new target languages can be developed. First, a brief word of warning---SWIG is continually evolving. The information in this chapter is mostly up to date, but changes are ongoing. Expect a few inconsistencies.

    Also, this chapter is not meant to be a hand-holding tutorial. As a starting point, you should probably look at one of SWIG's existing modules.

    39.2 Prerequisites

    In order to extend SWIG, it is useful to have the following background:

    • An understanding of the C API for the target language.
    • A good grasp of the C++ type system.
    • An understanding of typemaps and some of SWIG's advanced features.
    • Some familiarity with writing C++ (language modules are currently written in C++).

    Since SWIG is essentially a specialized C++ compiler, it may be useful to have some prior experience with compiler design (perhaps even a compilers course) to better understand certain parts of the system. A number of books will also be useful. For example, "The C Programming Language" by Kernighan and Ritchie (a.k.a, "K&R") and the C++ standard, "ISO/IEC 14882 Programming Languages - C++" will be of great use.

    Also, it is useful to keep in mind that SWIG primarily operates as an extension of the C++ type system. At first glance, this might not be obvious, but almost all SWIG directives as well as the low-level generation of wrapper code are driven by C++ datatypes.

    39.3 The Big Picture

    SWIG is a special purpose compiler that parses C++ declarations to generate wrapper code. To make this conversion possible, SWIG makes three fundamental extensions to the C++ language:

    • Typemaps. Typemaps are used to define the conversion/marshalling behavior of specific C++ datatypes. All type conversion in SWIG is based on typemaps. Furthermore, the association of typemaps to datatypes utilizes an advanced pattern matching mechanism that is fully integrated with the C++ type system.
    • Declaration Annotation. To customize wrapper code generation, most declarations can be annotated with special features. For example, you can make a variable read-only, you can ignore a declaration, you can rename a member function, you can add exception handling, and so forth. Virtually all of these customizations are built on top of a low-level declaration annotator that can attach arbitrary attributes to any declaration. Code generation modules can look for these attributes to guide the wrapping process.
    • Class extension. SWIG allows classes and structures to be extended with new methods and attributes (the %extend directive). This has the effect of altering the API in the target language and can be used to generate OO interfaces to C libraries.

    It is important to emphasize that virtually all SWIG features reduce to one of these three fundamental concepts. The type system and pattern matching rules also play a critical role in making the system work. For example, both typemaps and declaration annotation are based on pattern matching and interact heavily with the underlying type system.

    39.4 Execution Model

    When you run SWIG on an interface, processing is handled in stages by a series of system components:

    • An integrated C preprocessor reads a collection of configuration files and the specified interface file into memory. The preprocessor performs the usual functions including macro expansion and file inclusion. However, the preprocessor also performs some transformations of the interface. For instance, #define statements are sometimes transformed into %constant declarations. In addition, information related to file/line number tracking is inserted.
    • A C/C++ parser reads the preprocessed input and generates a full parse tree of all of the SWIG directives and C declarations found. The parser is responsible for many aspects of the system including renaming, declaration annotation, and template expansion. However, the parser does not produce any output nor does it interact with the target language module as it runs. SWIG is not a one-pass compiler.
    • A type-checking pass is made. This adjusts all of the C++ typenames to properly handle namespaces, typedefs, nested classes, and other issues related to type scoping.
    • A semantic pass is made on the parse tree to collect information related to properties of the C++ interface. For example, this pass would determine whether or not a class allows a default constructor.
    • A code generation pass is made using a specific target language module. This phase is responsible for generating the actual wrapper code. All of SWIG's user-defined modules are invoked during this latter stage of compilation.

    The next few sections briefly describe some of these stages.

    39.4.1 Preprocessing

    The preprocessor plays a critical role in the SWIG implementation. This is because a lot of SWIG's processing and internal configuration is managed not by code written in C, but by configuration files in the SWIG library. In fact, when you run SWIG, parsing starts with a small interface file like this (note: this explains the cryptic error messages that new users sometimes get when SWIG is misconfigured or installed incorrectly):

    %include "swig.swg"             // Global SWIG configuration
    %include "langconfig.swg"       // Language specific configuration
    %include "yourinterface.i"      // Your interface file
    

    The swig.swg file contains global configuration information. In addition, this file defines many of SWIG's standard directives as macros. For instance, part of of swig.swg looks like this:

    ...
    /* Code insertion directives such as %wrapper %{ ... %} */
    
    #define %begin       %insert("begin")
    #define %runtime     %insert("runtime")
    #define %header      %insert("header")
    #define %wrapper     %insert("wrapper")
    #define %init        %insert("init")
    
    /* Access control directives */
    
    #define %immutable   %feature("immutable", "1")
    #define %mutable     %feature("immutable")
    
    /* Directives for callback functions */
    
    #define %callback(x) %feature("callback") `x`;
    #define %nocallback  %feature("callback");
    
    /* %ignore directive */
    
    #define %ignore         %rename($ignore)
    #define %ignorewarn(x)  %rename("$ignore:" x)
    ...
    

    The fact that most of the standard SWIG directives are macros is intended to simplify the implementation of the internals. For instance, rather than having to support dozens of special directives, it is easier to have a few basic primitives such as %feature or %insert.

    The langconfig.swg file is supplied by the target language. This file contains language-specific configuration information. More often than not, this file provides run-time wrapper support code (e.g., the type-checker) as well as a collection of typemaps that define the default wrapping behavior. Note: the name of this file depends on the target language and is usually something like python.swg or perl5.swg.

    As a debugging aid, the text that SWIG feeds to its C++ parser can be obtained by running swig -E interface.i. This output probably isn't too useful in general, but it will show how macros have been expanded as well as everything else that goes into the low-level construction of the wrapper code.

    39.4.2 Parsing

    The current C++ parser handles a subset of C++. Most incompatibilities with C are due to subtle aspects of how SWIG parses declarations. Specifically, SWIG expects all C/C++ declarations to follow this general form:

    storage type declarator initializer;
    

    storage is a keyword such as extern, static, typedef, or virtual. type is a primitive datatype such as int or void. type may be optionally qualified with a qualifier such as const or volatile. declarator is a name with additional type-construction modifiers attached to it (pointers, arrays, references, functions, etc.). Examples of declarators include *x, **x, x[20], and (*x)(int, double). The initializer may be a value assigned using = or body of code enclosed in braces { ... }.

    This declaration format covers most common C++ declarations. However, the C++ standard is somewhat more flexible in the placement of the parts. For example, it is technically legal, although uncommon to write something like int typedef const a in your program. SWIG simply doesn't bother to deal with this case.

    The other significant difference between C++ and SWIG is in the treatment of typenames. In C++, if you have a declaration like this,

    int blah(Foo *x, Bar *y);
    

    it won't parse correctly unless Foo and Bar have been previously defined as types either using a class definition or a typedef. The reasons for this are subtle, but this treatment of typenames is normally integrated at the level of the C tokenizer---when a typename appears, a different token is returned to the parser instead of an identifier.

    SWIG does not operate in this manner--any legal identifier can be used as a type name. The reason for this is primarily motivated by the use of SWIG with partially defined data. Specifically, SWIG is supposed to be easy to use on interfaces with missing type information.

    Because of the different treatment of typenames, the most serious limitation of the SWIG parser is that it can't process type declarations where an extra (and unnecessary) grouping operator is used. For example:

    int (x);         /* A variable x */
    int (y)(int);    /* A function y */
    

    The placing of extra parentheses in type declarations like this is already recognized by the C++ community as a potential source of strange programming errors. For example, Scott Meyers "Effective STL" discusses this problem in a section on avoiding C++'s "most vexing parse."

    The parser is also unable to handle declarations with no return type or bare argument names. For example, in an old C program, you might see things like this:

    foo(a, b) {
    ...
    }
    

    In this case, the return type as well as the types of the arguments are taken by the C compiler to be an int. However, SWIG interprets the above code as an abstract declarator for a function returning a foo and taking types a and b as arguments).

    39.4.3 Parse Trees

    The SWIG parser produces a complete parse tree of the input file before any wrapper code is actually generated. Each item in the tree is known as a "Node". Each node is identified by a symbolic tag. Furthermore, a node may have an arbitrary number of children. The parse tree structure and tag names of an interface can be displayed using swig -debug-tags. For example:

    $ swig -c++ -python -debug-tags example.i
     . top (example.i:1)
     . top . include (example.i:1)
     . top . include . typemap (/r0/beazley/Projects/lib/swig1.3/swig.swg:71)
     . top . include . typemap . typemapitem (/r0/beazley/Projects/lib/swig1.3/swig.swg:71)
     . top . include . typemap (/r0/beazley/Projects/lib/swig1.3/swig.swg:83)
     . top . include . typemap . typemapitem (/r0/beazley/Projects/lib/swig1.3/swig.swg:83)
     . top . include (example.i:4)
     . top . include . insert (/r0/beazley/Projects/lib/swig1.3/python/python.swg:7)
     . top . include . insert (/r0/beazley/Projects/lib/swig1.3/python/python.swg:8)
     . top . include . typemap (/r0/beazley/Projects/lib/swig1.3/python/python.swg:19)
    ...
     . top . include (example.i:6)
     . top . include . module (example.i:2)
     . top . include . insert (example.i:6)
     . top . include . include (example.i:9)
     . top . include . include . class (example.h:3)
     . top . include . include . class . access (example.h:4)
     . top . include . include . class . constructor (example.h:7)
     . top . include . include . class . destructor (example.h:10)
     . top . include . include . class . cdecl (example.h:11)
     . top . include . include . class . cdecl (example.h:11)
     . top . include . include . class . cdecl (example.h:12)
     . top . include . include . class . cdecl (example.h:13)
     . top . include . include . class . cdecl (example.h:14)
     . top . include . include . class . cdecl (example.h:15)
     . top . include . include . class (example.h:18)
     . top . include . include . class . access (example.h:19)
     . top . include . include . class . cdecl (example.h:20)
     . top . include . include . class . access (example.h:21)
     . top . include . include . class . constructor (example.h:22)
     . top . include . include . class . cdecl (example.h:23)
     . top . include . include . class . cdecl (example.h:24)
     . top . include . include . class (example.h:27)
     . top . include . include . class . access (example.h:28)
     . top . include . include . class . cdecl (example.h:29)
     . top . include . include . class . access (example.h:30)
     . top . include . include . class . constructor (example.h:31)
     . top . include . include . class . cdecl (example.h:32)
     . top . include . include . class . cdecl (example.h:33)
    

    Even for the most simple interface, the parse tree structure is larger than you might expect. For example, in the above output, a substantial number of nodes are actually generated by the python.swg configuration file which defines typemaps and other directives. The contents of the user-supplied input file don't appear until the end of the output.

    The contents of each parse tree node consist of a collection of attribute/value pairs. Internally, the nodes are simply represented by hash tables. A display of the entire parse-tree structure can be obtained using swig -debug-top <n>, where n is the stage being processed. There are a number of other parse tree display options, for example, swig -debug-module <n> will avoid displaying system parse information and only display the parse tree pertaining to the user's module at stage n of processing.

    $ swig -c++ -python -debug-module 4 example.i
          +++ include ----------------------------------------
          | name         - "example.i"
    
                +++ module ----------------------------------------
                | name         - "example"
                |
                +++ insert ----------------------------------------
                | code         - "\n#include \"example.h\"\n"
                |
                +++ include ----------------------------------------
                | name         - "example.h"
    
                      +++ class ----------------------------------------
                      | abstract     - "1"
                      | sym:name     - "Shape"
                      | name         - "Shape"
                      | kind         - "class"
                      | symtab       - 0x40194140
                      | sym:symtab   - 0x40191078
    
                            +++ access ----------------------------------------
                            | kind         - "public"
                            |
                            +++ constructor ----------------------------------------
                            | sym:name     - "Shape"
                            | name         - "Shape"
                            | decl         - "f()."
                            | code         - "{\n    nshapes++;\n  }"
                            | sym:symtab   - 0x40194140
                            |
                            +++ destructor ----------------------------------------
                            | sym:name     - "~Shape"
                            | name         - "~Shape"
                            | storage      - "virtual"
                            | code         - "{\n    nshapes--;\n  }"
                            | sym:symtab   - 0x40194140
                            |
                            +++ cdecl ----------------------------------------
                            | sym:name     - "x"
                            | name         - "x"
                            | decl         - ""
                            | type         - "double"
                            | sym:symtab   - 0x40194140
                            |
                            +++ cdecl ----------------------------------------
                            | sym:name     - "y"
                            | name         - "y"
                            | decl         - ""
                            | type         - "double"
                            | sym:symtab   - 0x40194140
                            |
                            +++ cdecl ----------------------------------------
                            | sym:name     - "move"
                            | name         - "move"
                            | decl         - "f(double, double)."
                            | parms        - double, double
                            | type         - "void"
                            | sym:symtab   - 0x40194140
                            |
                            +++ cdecl ----------------------------------------
                            | sym:name     - "area"
                            | name         - "area"
                            | decl         - "f(void)."
                            | parms        - void
                            | storage      - "virtual"
                            | value        - "0"
                            | type         - "double"
                            | sym:symtab   - 0x40194140
                            |
                            +++ cdecl ----------------------------------------
                            | sym:name     - "perimeter"
                            | name         - "perimeter"
                            | decl         - "f(void)."
                            | parms        - void
                            | storage      - "virtual"
                            | value        - "0"
                            | type         - "double"
                            | sym:symtab   - 0x40194140
                            |
                            +++ cdecl ----------------------------------------
                            | sym:name     - "nshapes"
                            | name         - "nshapes"
                            | decl         - ""
                            | storage      - "static"
                            | type         - "int"
                            | sym:symtab   - 0x40194140
                            |
                      +++ class ----------------------------------------
                      | sym:name     - "Circle"
                      | name         - "Circle"
                      | kind         - "class"
                      | bases        - 0x40194510
                      | symtab       - 0x40194538
                      | sym:symtab   - 0x40191078
    
                            +++ access ----------------------------------------
                            | kind         - "private"
                            |
                            +++ cdecl ----------------------------------------
                            | name         - "radius"
                            | decl         - ""
                            | type         - "double"
                            |
                            +++ access ----------------------------------------
                            | kind         - "public"
                            |
                            +++ constructor ----------------------------------------
                            | sym:name     - "Circle"
                            | name         - "Circle"
                            | parms        - double
                            | decl         - "f(double)."
                            | code         - "{ }"
                            | sym:symtab   - 0x40194538
                            |
                            +++ cdecl ----------------------------------------
                            | sym:name     - "area"
                            | name         - "area"
                            | decl         - "f(void)."
                            | parms        - void
                            | storage      - "virtual"
                            | type         - "double"
                            | sym:symtab   - 0x40194538
                            |
                            +++ cdecl ----------------------------------------
                            | sym:name     - "perimeter"
                            | name         - "perimeter"
                            | decl         - "f(void)."
                            | parms        - void
                            | storage      - "virtual"
                            | type         - "double"
                            | sym:symtab   - 0x40194538
                            |
                      +++ class ----------------------------------------
                      | sym:name     - "Square"
                      | name         - "Square"
                      | kind         - "class"
                      | bases        - 0x40194760
                      | symtab       - 0x40194788
                      | sym:symtab   - 0x40191078
    
                            +++ access ----------------------------------------
                            | kind         - "private"
                            |
                            +++ cdecl ----------------------------------------
                            | name         - "width"
                            | decl         - ""
                            | type         - "double"
                            |
                            +++ access ----------------------------------------
                            | kind         - "public"
                            |
                            +++ constructor ----------------------------------------
                            | sym:name     - "Square"
                            | name         - "Square"
                            | parms        - double
                            | decl         - "f(double)."
                            | code         - "{ }"
                            | sym:symtab   - 0x40194788
                            |
                            +++ cdecl ----------------------------------------
                            | sym:name     - "area"
                            | name         - "area"
                            | decl         - "f(void)."
                            | parms        - void
                            | storage      - "virtual"
                            | type         - "double"
                            | sym:symtab   - 0x40194788
                            |
                            +++ cdecl ----------------------------------------
                            | sym:name     - "perimeter"
                            | name         - "perimeter"
                            | decl         - "f(void)."
                            | parms        - void
                            | storage      - "virtual"
                            | type         - "double"
                            | sym:symtab   - 0x40194788
    

    39.4.4 Attribute namespaces

    Attributes of parse tree nodes are often prepended with a namespace qualifier. For example, the attributes sym:name and sym:symtab are attributes related to symbol table management and are prefixed with sym:. As a general rule, only those attributes which are directly related to the raw declaration appear without a prefix (type, name, declarator, etc.).

    Target language modules may add additional attributes to nodes to assist the generation of wrapper code. The convention for doing this is to place these attributes in a namespace that matches the name of the target language. For example, python:foo or perl:foo.

    39.4.5 Symbol Tables

    During parsing, all symbols are managed in the space of the target language. The sym:name attribute of each node contains the symbol name selected by the parser. Normally, sym:name and name are the same. However, the %rename directive can be used to change the value of sym:name. You can see the effect of %rename by trying it on a simple interface and dumping the parse tree. For example:

    %rename(foo_i) foo(int);
    %rename(foo_d) foo(double);
    
    void foo(int);
    void foo(double);
    void foo(Bar *b);
    

    There are various debug- options that can be useful for debugging and analysing the parse tree. For example, the debug-top <n> or debug-module <n> options will dump the entire/top of the parse tree or the module subtree at one of the four n stages of processing. The parse tree can be viewed after the final stage of processing by running SWIG:

    $ swig -debug-top 4 example.i
    ...
                +++ cdecl ----------------------------------------
                | sym:name     - "foo_i"
                | name         - "foo"
                | decl         - "f(int)."
                | parms        - int
                | type         - "void"
                | sym:symtab   - 0x40165078
                |
                +++ cdecl ----------------------------------------
                | sym:name     - "foo_d"
                | name         - "foo"
                | decl         - "f(double)."
                | parms        - double
                | type         - "void"
                | sym:symtab   - 0x40165078
                |
                +++ cdecl ----------------------------------------
                | sym:name     - "foo"
                | name         - "foo"
                | decl         - "f(p.Bar)."
                | parms        - Bar *
                | type         - "void"
                | sym:symtab   - 0x40165078
    

    All symbol-related conflicts and complaints about overloading are based on sym:name values. For instance, the following example uses %rename in reverse to generate a name clash.

    %rename(foo) foo_i(int);
    %rename(foo) foo_d(double);
    
    void foo_i(int);
    void foo_d(double);
    void foo(Bar *b);
    

    When you run SWIG on this you now get:

    $ ./swig example.i
    example.i:6. Overloaded declaration ignored.  foo_d(double )
    example.i:5. Previous declaration is foo_i(int )
    example.i:7. Overloaded declaration ignored.  foo(Bar *)
    example.i:5. Previous declaration is foo_i(int )
    

    39.4.6 The %feature directive

    A number of SWIG directives such as %exception are implemented using the low-level %feature directive. For example:

    %feature("except") getitem(int) {
      try {
         $action
      } catch (badindex) {
         ...
      }
    }
    
    ...
    class Foo {
    public:
      Object *getitem(int index) throws(badindex);
      ...
    };
    

    The behavior of %feature is very easy to describe--it simply attaches a new attribute to any parse tree node that matches the given prototype. When a feature is added, it shows up as an attribute in the feature: namespace. You can see this when running with the -debug-top 4 option. For example:

     +++ cdecl ----------------------------------------
     | sym:name     - "getitem"
     | name         - "getitem"
     | decl         - "f(int).p."
     | parms        - int
     | type         - "Object"
     | feature:except - "{\n    try {\n       $action\n    } catc..."
     | sym:symtab   - 0x40168ac8
     |
    

    Feature names are completely arbitrary and a target language module can be programmed to respond to any feature name that it wants to recognize. The data stored in a feature attribute is usually just a raw unparsed string. For example, the exception code above is simply stored without any modifications.

    39.4.7 Code Generation

    Language modules work by defining handler functions that know how to respond to different types of parse-tree nodes. These handlers simply look at the attributes of each node in order to produce low-level code.

    In reality, the generation of code is somewhat more subtle than simply invoking handler functions. This is because parse-tree nodes might be transformed. For example, suppose you are wrapping a class like this:

    class Foo {
    public:
      virtual int *bar(int x);
    };
    

    When the parser constructs a node for the member bar, it creates a raw "cdecl" node with the following attributes:

    nodeType    : cdecl
    name        : bar
    type        : int
    decl        : f(int).p
    parms       : int x
    storage     : virtual
    sym:name    : bar
    

    To produce wrapper code, this "cdecl" node undergoes a number of transformations. First, the node is recognized as a function declaration. This adjusts some of the type information--specifically, the declarator is joined with the base datatype to produce this:

    nodeType    : cdecl
    name        : bar
    type        : p.int        <-- Notice change in return type
    decl        : f(int).p
    parms       : int x
    storage     : virtual
    sym:name    : bar
    

    Next, the context of the node indicates that the node is really a member function. This produces a transformation to a low-level accessor function like this:

    nodeType    : cdecl
    name        : bar
    type        : int.p
    decl        : f(int).p
    parms       : Foo *self, int x            <-- Added parameter
    storage     : virtual
    wrap:action : result = (arg1)->bar(arg2)  <-- Action code added
    sym:name    : Foo_bar                     <-- Symbol name changed
    

    In this transformation, notice how an additional parameter was added to the parameter list and how the symbol name of the node has suddenly changed into an accessor using the naming scheme described in the "SWIG Basics" chapter. A small fragment of "action" code has also been generated--notice how the wrap:action attribute defines the access to the underlying method. The data in this transformed node is then used to generate a wrapper.

    Language modules work by registering handler functions for dealing with various types of nodes at different stages of transformation. This is done by inheriting from a special Language class and defining a collection of virtual methods. For example, the Python module defines a class as follows:

    class PYTHON : public Language {
    protected:
    public :
      virtual void main(int, char *argv[]);
      virtual int  top(Node *);
      virtual int  functionWrapper(Node *);
      virtual int  constantWrapper(Node *);
      virtual int  variableWrapper(Node *);
      virtual int  nativeWrapper(Node *);
      virtual int  membervariableHandler(Node *);
      virtual int  memberconstantHandler(Node *);
      virtual int  memberfunctionHandler(Node *);
      virtual int  constructorHandler(Node *);
      virtual int  destructorHandler(Node *);
      virtual int  classHandler(Node *);
      virtual int  classforwardDeclaration(Node *);
      virtual int  insertDirective(Node *);
      virtual int  importDirective(Node *);
    };
    

    The role of these functions is described shortly.

    39.4.8 SWIG and XML

    Much of SWIG's current parser design was originally motivated by interest in using XML to represent SWIG parse trees. Although XML is not currently used in any direct manner, the parse tree structure, use of node tags, attributes, and attribute namespaces are all influenced by aspects of XML parsing. Therefore, in trying to understand SWIG's internal data structures, it may be useful to keep XML in the back of your mind as a model.

    39.5 Primitive Data Structures

    Most of SWIG is constructed using three basic data structures: strings, hashes, and lists. These data structures are dynamic in same way as similar structures found in many scripting languages. For instance, you can have containers (lists and hash tables) of mixed types and certain operations are polymorphic.

    This section briefly describes the basic structures so that later sections of this chapter make more sense.

    When describing the low-level API, the following type name conventions are used:

    • String. A string object.
    • Hash. A hash object.
    • List. A list object.
    • String_or_char. A string object or a char *.
    • Object_or_char. An object or a char *.
    • Object. Any object (string, hash, list, etc.)

    In most cases, other typenames in the source are aliases for one of these primitive types. Specifically:

    typedef String SwigType;
    typedef Hash   Parm;
    typedef Hash   ParmList;
    typedef Hash   Node;
    typedef Hash   Symtab;
    typedef Hash   Typetab;
    

    39.5.1 Strings

    String *NewString(const String_or_char *val)

    Creates a new string with initial value val . val may be a char * or another String object. If you want to create an empty string, use "" for val.

    String *NewStringf(const char *fmt, ...)

    Creates a new string whose initial value is set according to a C printf style format string in fmt. Additional arguments follow depending on fmt.

    String *Copy(String *s)

    Make a copy of the string s.

    void Delete(String *s)

    Deletes s.

    int Len(const String_or_char *s)

    Returns the length of the string.

    char *Char(const String_or_char *s)

    Returns a pointer to the first character in a string.

    void Append(String *s, const String_or_char *t)

    Appends t to the end of string s.

    void Insert(String *s, int pos, const String_or_char *t)

    Inserts t into s at position pos. The contents of s are shifted accordingly. The special value DOH_END can be used for pos to indicate insertion at the end of the string (appending).

    int Strcmp(const String_or_char *s, const String_or_char *t)

    Compare strings s and t. Same as the C strcmp() function.

    int Strncmp(const String_or_char *s, const String_or_char *t, int len)

    Compare the first len characters of strings s and t. Same as the C strncmp() function.

    char *Strstr(const String_or_char *s, const String_or_char *pat)

    Returns a pointer to the first occurrence of pat in s. Same as the C strstr() function.

    char *Strchr(const String_or_char *s, char ch)

    Returns a pointer to the first occurrence of character ch in s. Same as the C strchr() function.

    void Chop(String *s)

    Chops trailing whitespace off the end of s .

    int Replace(String *s, const String_or_char *pat, const String_or_char *rep, int flags)

    Replaces the pattern pat with rep in string s . flags is a combination of the following flags:

    DOH_REPLACE_ANY       - Replace all occurrences
    DOH_REPLACE_ID        - Valid C identifiers only
    DOH_REPLACE_NOQUOTE   - Don't replace in quoted strings
    DOH_REPLACE_FIRST     - Replace first occurrence only.
    

    Returns the number of replacements made (if any).

    39.5.2 Hashes

    Hash *NewHash()

    Creates a new empty hash table.

    Hash *Copy(Hash *h)

    Make a shallow copy of the hash h.

    void Delete(Hash *h)

    Deletes h.

    int Len(Hash *h)

    Returns the number of items in h.

    Object *Getattr(Hash *h, const String_or_char *key)

    Gets an object from h. key may be a string or a simple char * string. Returns NULL if not found.

    int Setattr(Hash *h, const String_or_char *key, const Object_or_char *val)

    Stores val in h. key may be a string or a simple char *. If val is not a standard object (String, Hash, or List) it is assumed to be a char * in which case it is used to construct a String that is stored in the hash. If val is NULL, the object is deleted. Increases the reference count of val. Returns 1 if this operation replaced an existing hash entry, 0 otherwise.

    int Delattr(Hash *h, const String_or_char *key)

    Deletes the hash item referenced by key. Decreases the reference count on the corresponding object (if any). Returns 1 if an object was removed, 0 otherwise.

    List *Keys(Hash *h)

    Returns the list of hash table keys.

    39.5.3 Lists

    List *NewList()

    Creates a new empty list.

    List *Copy(List *x)

    Make a shallow copy of the List x.

    void Delete(List *x)

    Deletes x.

    int Len(List *x)

    Returns the number of items in x.

    Object *Getitem(List *x, int n)

    Returns an object from x with index n . If n is beyond the end of the list, the last item is returned. If n is negative, the first item is returned.

    int *Setitem(List *x, int n, const Object_or_char *val)

    Stores val in x. If val is not a standard object (String, Hash, or List) it is assumed to be a char * in which case it is used to construct a String that is stored in the list. n must be in range. Otherwise, an assertion will be raised.

    int *Delitem(List *x, int n)

    Deletes item n from the list, shifting items down if necessary. To delete the last item in the list, use the special value DOH_END for n.

    void Append(List *x, const Object_or_char *t)

    Appends t to the end of x. If t is not a standard object, it is assumed to be a char * and is used to create a String object.

    void Insert(String *s, int pos, const Object_or_char *t)

    Inserts t into s at position pos. The contents of s are shifted accordingly. The special value DOH_END can be used for pos to indicate insertion at the end of the list (appending). If t is not a standard object, it is assumed to be a char * and is used to create a String object.

    39.5.4 Common operations

    The following operations are applicable to all datatypes.

    Object *Copy(Object *x)

    Make a copy of the object x.

    void Delete(Object *x)

    Deletes x.

    void Setfile(Object *x, String_or_char *f)

    Sets the filename associated with x. Used to track objects and report errors.

    String *Getfile(Object *x)

    Gets the filename associated with x.

    void Setline(Object *x, int n)

    Sets the line number associated with x. Used to track objects and report errors.

    int Getline(Object *x)

    Gets the line number associated with x.

    39.5.5 Iterating over Lists and Hashes

    To iterate over the elements of a list or a hash table, the following functions are used:

    Iterator First(Object *x)

    Returns an iterator object that points to the first item in a list or hash table. The item attribute of the Iterator object is a pointer to the item. For hash tables, the key attribute of the Iterator object additionally points to the corresponding Hash table key. The item and key attributes are NULL if the object contains no items or if there are no more items.

    Iterator Next(Iterator i)

    Returns an iterator that points to the next item in a list or hash table. Here are two examples of iteration:

    List *l = (some list);
    Iterator i;
    
    for (i = First(l); i.item; i = Next(i)) {
      Printf(stdout, "%s\n", i.item);
    }
    
    Hash *h = (some hash);
    Iterator j;
    
    for (j = First(j); j.item; j= Next(j)) {
      Printf(stdout, "%s : %s\n", j.key, j.item);
    }
    

    39.5.6 I/O

    Special I/O functions are used for all internal I/O. These operations work on C FILE * objects, String objects, and special File objects (which are merely a wrapper around FILE *).

    int Printf(String_or_FILE *f, const char *fmt, ...)

    Formatted I/O. Same as the C fprintf() function except that output can also be directed to a string object. Note: the %s format specifier works with both strings and char *. All other format operators have the same meaning.

    int Printv(String_or_FILE *f, String_or_char *arg1, ..., NULL)

    Prints a variable number of strings arguments to the output. The last argument to this function must be NULL. The other arguments can either be char * or string objects.

    int Putc(int ch, String_or_FILE *f)

    Same as the C fputc() function.

    int Write(String_or_FILE *f, void *buf, int len)

    Same as the C write() function.

    int Read(String_or_FILE *f, void *buf, int maxlen)

    Same as the C read() function.

    int Getc(String_or_FILE *f)

    Same as the C fgetc() function.

    int Ungetc(int ch, String_or_FILE *f)

    Same as the C ungetc() function.

    int Seek(String_or_FILE *f, int offset, int whence)

    Same as the C seek() function. offset is the number of bytes. whence is one of SEEK_SET, SEEK_CUR, or SEEK_END..

    long Tell(String_or_FILE *f)

    Same as the C tell() function.

    File *NewFile(const char *filename, const char *mode, List *newfiles)

    Create a File object using the fopen() library call. This file differs from FILE * in that it can be placed in the standard SWIG containers (lists, hashes, etc.). The filename is added to the newfiles list if newfiles is non-zero and the file was created successfully.

    File *NewFileFromFile(FILE *f)

    Create a File object wrapper around an existing FILE * object.

    There's no explicit function to close a file, just call Delete(f) - this decreases the reference count, and the file will be closed when the reference count reaches zero.

    The use of the above I/O functions and strings play a critical role in SWIG. It is common to see small code fragments of code generated using code like this:

    /* Print into a string */
    String *s = NewString("");
    Printf(s, "Hello\n");
    for (i = 0; i < 10; i++) {
      Printf(s, "%d\n", i);
    }
    ...
    /* Print string into a file */
    Printf(f, "%s\n", s);
    

    Similarly, the preprocessor and parser all operate on string-files.

    39.6 Navigating and manipulating parse trees

    Parse trees are built as collections of hash tables. Each node is a hash table in which arbitrary attributes can be stored. Certain attributes in the hash table provide links to other parse tree nodes. The following macros can be used to move around the parse tree.

    String *nodeType(Node *n)

    Returns the node type tag as a string. The returned string indicates the type of parse tree node.

    Node *nextSibling(Node *n)

    Returns the next node in the parse tree. For example, the next C declaration.

    Node *previousSibling(Node *n)

    Returns the previous node in the parse tree. For example, the previous C declaration.

    Node *firstChild(Node *n)

    Returns the first child node. For example, if n was a C++ class node, this would return the node for the first class member.

    Node *lastChild(Node *n)

    Returns the last child node. You might use this if you wanted to append a new node to the children of a class.

    Node *parentNode(Node *n)

    Returns the parent of node n. Use this to move up the pass tree.

    The following macros can be used to change all of the above attributes. Normally, these functions are only used by the parser. Changing them without knowing what you are doing is likely to be dangerous.

    void set_nodeType(Node *n, const String_or_char)

    Change the node type. tree node.

    void set_nextSibling(Node *n, Node *s)

    Set the next sibling.

    void set_previousSibling(Node *n, Node *s)

    Set the previous sibling.

    void set_firstChild(Node *n, Node *c)

    Set the first child node.

    void set_lastChild(Node *n, Node *c)

    Set the last child node.

    void set_parentNode(Node *n, Node *p)

    Set the parent node.

    The following utility functions are used to alter the parse tree (at your own risk)

    void appendChild(Node *parent, Node *child)

    Append a child to parent. The appended node becomes the last child.

    void deleteNode(Node *node)

    Deletes a node from the parse tree. Deletion reconnects siblings and properly updates the parent so that sibling nodes are unaffected.

    39.7 Working with attributes

    Since parse tree nodes are just hash tables, attributes are accessed using the Getattr(), Setattr(), and Delattr() operations. For example:

    int functionHandler(Node *n) {
      String *name    = Getattr(n, "name");
      String *symname = Getattr(n, "sym:name");
      SwigType *type  = Getattr(n, "type");
      ...
    }
    

    New attributes can be freely attached to a node as needed. However, when new attributes are attached during code generation, they should be prepended with a namespace prefix. For example:

    ...
    Setattr(n, "python:docstring", doc);     /* Store docstring */
    ...
    

    A quick way to check the value of an attribute is to use the checkAttribute() function like this:

    if (checkAttribute(n, "storage", "virtual")) {
      /* n is virtual */
      ...
    }
    

    Changing the values of existing attributes is allowed and is sometimes done to implement node transformations. However, if a function/method modifies a node, it is required to restore modified attributes to their original values. To simplify the task of saving/restoring attributes, the following functions are used:

    int Swig_save(const char *ns, Node *n, const char *name1, const char *name2, ..., NIL)

    Saves a copy of attributes name1, name2, etc. from node n. Copies of the attributes are actually resaved in the node in a different namespace which is set by the ns argument. For example, if you call Swig_save("foo", n, "type", NIL), then the "type" attribute will be copied and saved as "foo:type". The namespace name itself is stored in the "view" attribute of the node. If necessary, this can be examined to find out where previous values of attributes might have been saved.

    int Swig_restore(Node *n)

    Restores the attributes saved by the previous call to Swig_save(). Those attributes that were supplied to Swig_save() will be restored to their original values.

    The Swig_save() and Swig_restore() functions must always be used as a pair. That is, every call to Swig_save() must have a matching call to Swig_restore(). Calls can be nested if necessary. Here is an example that shows how the functions might be used:

    int variableHandler(Node *n) {
      Swig_save("variableHandler", n, "type", "sym:name", NIL);
      String *symname = Getattr(n, "sym:name");
      SwigType *type  = Getattr(n, "type");
      ...
      Append(symname, "_global");        // Change symbol name
      SwigType_add_pointer(type);        // Add pointer
      ...
      generate wrappers
      ...
      Swig_restore(n);                  // Restore original values
      return SWIG_OK;
    }
    

    int Swig_require(const char *ns, Node *n, const char *name1, const char *name2, ..., NIL)

    This is an enhanced version of Swig_save() that adds error checking. If an attribute name is not present in n , a failed assertion results and SWIG terminates with a fatal error. Optionally, if an attribute name is specified as "*name", a copy of the attribute is saved as with Swig_save(). If an attribute is specified as "?name", the attribute is optional. Swig_restore() must always be called after using this function.

    39.8 Type system

    SWIG implements the complete C++ type system including typedef, inheritance, pointers, references, and pointers to members. A detailed discussion of type theory is impossible here. However, let's cover the highlights.

    39.8.1 String encoding of types

    All types in SWIG consist of a base datatype and a collection of type operators that are applied to the base. A base datatype is almost always some kind of primitive type such as int or double . The operators consist of things like pointers, references, arrays, and so forth. Internally, types are represented as strings that are constructed in a very precise manner. Here are some examples:

    C datatype                     SWIG encoding (strings)
    -----------------------------  --------------------------
    int                            "int"
    int *                          "p.int"
    const int *                    "p.q(const).int"
    int (*x)(int, double)          "p.f(int, double).int"
    int [20][30]                   "a(20).a(30).int"
    int (F::*)(int)                "m(F).f(int).int"
    vector<int> *                  "p.vector<(int)>"
    

    Reading the SWIG encoding is often easier than figuring out the C code---just read it from left to right. For a type of "p.f(int, double).int" is a "pointer to a function(int, double) that returns int".

    The following operator encodings are used in type strings:

    Operator              Meaning
    -------------------   -------------------------------
    p.                    Pointer to
    a(n).                 Array of dimension n
    r.                    C++ reference
    m(class).             Member pointer to class
    f(args).              Function.
    q(qlist).             Qualifiers
    

    In addition, type names may be parameterized by templates. This is represented by enclosing the template parameters in <( ... )>. Variable length arguments are represented by the special base type of v(...).

    If you want to experiment with type encodings, the raw type strings can be inserted into an interface file using backticks `` wherever a type is expected. For instance, here is an extremely perverted example:

    `p.a(10).p.f(int, p.f(int).int)` foo(int, int (*x)(int));
    

    This corresponds to the immediately obvious C declaration:

    (*(*foo(int, int (*)(int)))[10])(int, int (*)(int));
    

    Aside from the potential use of this declaration on a C programming quiz, it motivates the use of the special SWIG encoding of types. The SWIG encoding is much easier to work with because types can be easily examined, modified, and constructed using simple string operations (comparison, substrings, concatenation, etc.). For example, in the parser, a declaration like this

    int *a[30];
    

    is processed in a few pieces. In this case, you have the base type " int" and the declarator of type "a(30).p.". To make the final type, the two parts are just joined together using string concatenation.

    39.8.2 Type construction

    The following functions are used to construct types. You should use these functions instead of trying to build the type strings yourself.

    void SwigType_add_pointer(SwigType *ty)

    Adds a pointer to ty.

    void SwigType_del_pointer(SwigType *ty)

    Removes a single pointer from ty.

    void SwigType_add_reference(SwigType *ty)

    Adds a reference to ty.

    void SwigType_add_array(SwigType *ty, const String_or_char *size)

    Adds an array with dimension dim to ty .

    void SwigType_del_array(SwigType *ty)

    Removes a single array dimension from ty.

    int SwigType_array_ndim(SwigType *ty)

    Returns number of array dimensions of ty.

    String* SwigType_array_getdim(SwigType *ty, int n)

    Returns nth array dimension of ty .

    void SwigType_array_setdim(SwigType *ty, int n, const String_or_char *rep)

    Sets nth array dimensions of ty to rep.

    void SwigType_add_qualifier(SwigType *ty, const String_or_char *q)

    Adds a type qualifier q to ty. q is typically "const" or "volatile".

    void SwigType_add_memberpointer(SwigType *ty, const String_or_char *cls)

    Adds a pointer to a member of class cls to ty.

    void SwigType_add_function(SwigType *ty, ParmList *p)

    Adds a function to ty. p is a linked-list of parameter nodes as generated by the parser. See the section on parameter lists for details about the representation.

    void SwigType_add_template(SwigType *ty, ParmList *p)

    Adds a template to ty. p is a linked-list of parameter nodes as generated by the parser. See the section on parameter lists for details about the representation.

    SwigType *SwigType_pop(SwigType *ty)

    Removes the last type constructor from ty and returns it. ty is modified.

    void SwigType_push(SwigType *ty, SwigType *op)

    Pushes the type operators in op onto type ty. The opposite of SwigType_pop().

    SwigType *SwigType_pop_arrays(SwigType *ty)

    Removes all leading array operators from ty and returns them. ty is modified. For example, if ty is "a(20).a(10).p.int", then this function would return "a(20).a(10)." and modify ty so that it has the value "p.int".

    SwigType *SwigType_pop_function(SwigType *ty)

    Removes a function operator from ty including any qualification. ty is modified. For example, if ty is "f(int).int", then this function would return "f(int)." and modify ty so that it has the value "int" .

    SwigType *SwigType_base(SwigType *ty)

    Returns the base type of a type. For example, if ty is "p.a(20).int", this function would return "int" . ty is unmodified.

    SwigType *SwigType_prefix(SwigType *ty)

    Returns the prefix of a type. For example, if ty is "p.a(20).int", this function would return "p.a(20).". ty is unmodified.

    39.8.3 Type tests

    The following functions can be used to test properties of a datatype.

    int SwigType_ispointer(SwigType *ty)

    Checks if ty is a standard pointer.

    int SwigType_ismemberpointer(SwigType *ty)

    Checks if ty is a member pointer.

    int SwigType_isreference(SwigType *ty)

    Checks if ty is a C++ reference.

    int SwigType_isarray(SwigType *ty)

    Checks if ty is an array.

    int SwigType_isfunction(SwigType *ty)

    Checks if ty is a function.

    int SwigType_isqualifier(SwigType *ty)

    Checks if ty is a qualifier.

    int SwigType_issimple(SwigType *ty)

    Checks if ty is a simple type. No operators applied.

    int SwigType_isconst(SwigType *ty)

    Checks if ty is a const type.

    int SwigType_isvarargs(SwigType *ty)

    Checks if ty is a varargs type.

    int SwigType_istemplate(SwigType *ty)

    Checks if ty is a templatized type.

    39.8.4 Typedef and inheritance

    The behavior of typedef declaration is to introduce a type alias. For instance, typedef int Integer makes the identifier Integer an alias for int. The treatment of typedef in SWIG is somewhat complicated due to the pattern matching rules that get applied in typemaps and the fact that SWIG prefers to generate wrapper code that closely matches the input to simplify debugging (a user will see the typedef names used in their program instead of the low-level primitive C datatypes).

    To handle typedef, SWIG builds a collection of trees containing typedef relations. For example,

    typedef int Integer;
    typedef Integer *IntegerPtr;
    typedef int Number;
    typedef int Size;
    

    produces two trees like this:

                     int               p.Integer
                   ^  ^  ^                 ^
                  /   |   \                |
                 /    |    \               |
            Integer  Size   Number    IntegerPtr
    

    To resolve a single typedef relationship, the following function is used:

    SwigType *SwigType_typedef_resolve(SwigType *ty)

    Checks if ty can be reduced to a new type via typedef. If so, returns the new type. If not, returns NULL.

    Typedefs are only resolved in simple typenames that appear in a type. For example, the type base name and in function parameters. When resolving types, the process starts in the leaf nodes and moves up the tree towards the root. Here are a few examples that show how it works:

    Original type            After typedef_resolve()
    ------------------------ -----------------------
    Integer                  int
    a(30).Integer            int
    p.IntegerPtr             p.p.Integer
    p.p.Integer              p.p.int
    

    For complicated types, the process can be quite involved. Here is the reduction of a function pointer:

    p.f(Integer, p.IntegerPtr, Size).Integer          : Start
    p.f(Integer, p.IntegerPtr, Size).int
    p.f(int, p.IntegerPtr, Size).int
    p.f(int, p.p.Integer, Size).int
    p.f(int, p.p.int, Size).int
    p.f(int, p.p.int, int).int                        : End
    

    Two types are equivalent if their full type reductions are the same. The following function will fully reduce a datatype:

    SwigType *SwigType_typedef_resolve_all(SwigType *ty)

    Fully reduces ty according to typedef rules. Resulting datatype will consist only of primitive typenames.

    39.8.5 Lvalues

    When generating wrapper code, it is necessary to emit datatypes that can be used on the left-hand side of an assignment operator (an lvalue). However, not all C datatypes can be used in this way---especially arrays and const-qualified types. To generate a type that can be used as an lvalue, use the following function:

    SwigType *SwigType_ltype(SwigType *ty)

    Converts type ty to a type that can be used as an lvalue in assignment. The resulting type is stripped of qualifiers and arrays are converted to a pointers.

    The creation of lvalues is fully aware of typedef and other aspects of the type system. Therefore, the creation of an lvalue may result in unexpected results. Here are a few examples:

    typedef double Matrix4[4][4];
    Matrix4 x;    // type = 'Matrix4', ltype='p.a(4).double'
    
    typedef const char * Literal;
    Literal y;    // type = 'Literal', ltype='p.char'
    

    39.8.6 Output functions

    The following functions produce strings that are suitable for output.

    String *SwigType_str(SwigType *ty, const String_or_char *id = 0)

    Generates a C string for a datatype. id is an optional declarator. For example, if ty is "p.f(int).int" and id is "foo", then this function produces "int (*foo)(int)". This function is used to convert string-encoded types back into a form that is valid C syntax.

    String *SwigType_lstr(SwigType *ty, const String_or_char *id = 0)

    This is the same as SwigType_str() except that the result is generated from the type's lvalue (as generated from SwigType_ltype).

    String *SwigType_lcaststr(SwigType *ty, const String_or_char *id = 0)

    Generates a casting operation that converts from type ty to its lvalue. id is an optional name to include in the cast. For example, if ty is " q(const).p.char" and id is "foo", this function produces the string "(char *) foo".

    String *SwigType_rcaststr(SwigType *ty, const String_or_char *id = 0)

    Generates a casting operation that converts from a type's lvalue to a type equivalent to ty. id is an optional name to include in the cast. For example, if ty is " q(const).p.char" and id is "foo", this function produces the string "(const char *) foo".

    String *SwigType_manglestr(SwigType *ty)

    Generates a mangled string encoding of type ty . The mangled string only contains characters that are part of a valid C identifier. The resulting string is used in various parts of SWIG, but is most commonly associated with type-descriptor objects that appear in wrappers (e.g., SWIGTYPE_p_double).

    39.9 Parameters

    Several type-related functions involve parameter lists. These include functions and templates. Parameter list are represented as a list of nodes with the following attributes:

    "type"        -  Parameter type  (required)
    "name"        -  Parameter name  (optional)
    "value"       -  Initializer     (optional)
    

    Typically parameters are denoted in the source by using a typename of Parm * or ParmList *. To walk a parameter list, simply use code like this:

    Parm *parms;
    Parm *p;
    for (p = parms; p; p = nextSibling(p)) {
      SwigType *type  = Getattr(p, "type");
      String   *name  = Getattr(p, "name");
      String   *value = Getattr(p, "value");
      ...
    }
    

    Note: this code is exactly the same as what you would use to walk parse tree nodes.

    An empty list of parameters is denoted by a NULL pointer.

    Since parameter lists are fairly common, the following utility functions are provided to manipulate them:

    Parm *CopyParm(Parm *p);

    Copies a single parameter.

    ParmList *CopyParmList(ParmList *p);

    Copies an entire list of parameters.

    int ParmList_len(ParmList *p);

    Returns the number of parameters in a parameter list.

    String *ParmList_str(ParmList *p);

    Converts a parameter list into a C string. For example, produces a string like "(int *p, int n, double x);".

    String *ParmList_protostr(ParmList *p);

    The same as ParmList_str() except that parameter names are not included. Used to emit prototypes.

    int ParmList_numrequired(ParmList *p);

    Returns the number of required (non-optional) arguments in p.

    39.10 Writing a Language Module

    One of the easiest routes to supporting a new language module is to copy an already supported language module implementation and modify it. Be sure to choose a language that is similar in nature to the new language. All language modules follow a similar structure and this section briefly outlines the steps needed to create a bare-bones language module from scratch. Since the code is relatively easy to read, this section describes the creation of a minimal Python module. You should be able to extrapolate this to other languages.

    39.10.1 Execution model

    Code generation modules are defined by inheriting from the Language class, currently defined in the Source/Modules directory of SWIG. Starting from the parsing of command line options, all aspects of code generation are controlled by different methods of the Language that must be defined by your module.

    39.10.2 Starting out

    To define a new language module, first create a minimal implementation using this example as a guide:

    #include "swigmod.h"
    
    class PYTHON : public Language {
    public:
    
      virtual void main(int argc, char *argv[]) {
        printf("I'm the Python module.\n");
      }
    
      virtual int top(Node *n) {
        printf("Generating code.\n");
        return SWIG_OK;
      }
    
    };
    
    extern "C" Language *
    swig_python(void) {
      return new PYTHON();
    }
    

    The "swigmod.h" header file contains, among other things, the declaration of the Language base class and so you should include it at the top of your language module's source file. Similarly, the "swigconfig.h" header file contains some other useful definitions that you may need. Note that you should not include any header files that are installed with the target language. That is to say, the implementation of the SWIG Python module shouldn't have any dependencies on the Python header files. The wrapper code generated by SWIG will almost always depend on some language-specific C/C++ header files, but SWIG itself does not.

    Give your language class a reasonable name, usually the same as the target language. By convention, these class names are all uppercase (e.g. "PYTHON" for the Python language module) but this is not a requirement. This class will ultimately consist of a number of overrides of the virtual functions declared in the Language base class, in addition to any language-specific member functions and data you need. For now, just use the dummy implementations shown above.

    The language module ends with a factory function, swig_python() , that simply returns a new instance of the language class. As shown, it should be declared with the extern "C" storage qualifier so that it can be called from C code. It should also return a pointer to the base class (Language) so that only the interface (and not the implementation) of your language module is exposed to the rest of SWIG.

    Save the code for your language module in a file named " python.cxx" and place this file in the Source/Modules directory of the SWIG distribution. To ensure that your module is compiled into SWIG along with the other language modules, modify the file Source/Makefile.am to include the additional source files. In addition, modify the file Source/Modules/swigmain.cxx with an additional command line option that activates the module. Read the source---it's straightforward.

    Next, at the top level of the SWIG distribution, re-run the autogen.sh script to regenerate the various build files:

    $ ./autogen.sh
    

    Next re-run configure to regenerate all of the Makefiles:

    $ ./configure
    

    Finally, rebuild SWIG with your module added:

    $ make
    

    Once it finishes compiling, try running SWIG with the command-line option that activates your module. For example, swig -python foo.i . The messages from your new module should appear.

    39.10.3 Command line options

    When SWIG starts, the command line options are passed to your language module. This occurs before any other processing occurs (preprocessing, parsing, etc.). To capture the command line options, simply use code similar to this:

    void Language::main(int argc, char *argv[]) {
      for (int i = 1; i < argc; i++) {
        if (argv[i]) {
          if (strcmp(argv[i], "-interface") == 0) {
            if (argv[i+1]) {
              interface = NewString(argv[i+1]);
              Swig_mark_arg(i);
              Swig_mark_arg(i+1);
              i++;
            } else {
              Swig_arg_error();
            }
          } else if (strcmp(argv[i], "-globals") == 0) {
            if (argv[i+1]) {
              global_name = NewString(argv[i+1]);
              Swig_mark_arg(i);
              Swig_mark_arg(i+1);
              i++;
            } else {
              Swig_arg_error();
            }
          } else if ((strcmp(argv[i], "-proxy") == 0)) {
            proxy_flag = 1;
            Swig_mark_arg(i);
          } else if (strcmp(argv[i], "-keyword") == 0) {
            use_kw = 1;
            Swig_mark_arg(i);
          } else if (strcmp(argv[i], "-help") == 0) {
            fputs(usage, stderr);
          }
          ...
        }
      }
    }
    

    The exact set of options depends on what you want to do in your module. Generally, you would use the options to change code generation modes or to print diagnostic information.

    If a module recognizes an option, it should always call Swig_mark_arg() to mark the option as valid. If you forget to do this, SWIG will terminate with an unrecognized command line option error.

    39.10.4 Configuration and preprocessing

    In addition to looking at command line options, the main() method is responsible for some initial configuration of the SWIG library and preprocessor. To do this, insert some code like this:

    void main(int argc, char *argv[]) {
      ... command line options ...
    
      /* Set language-specific subdirectory in SWIG library */
      SWIG_library_directory("python");
    
      /* Set language-specific preprocessing symbol */
      Preprocessor_define("SWIGPYTHON 1", 0);
    
      /* Set language-specific configuration file */
      SWIG_config_file("python.swg");
    
      /* Set typemap language (historical) */
      SWIG_typemap_lang("python");
    }
    

    The above code does several things--it registers the name of the language module with the core, it supplies some preprocessor macro definitions for use in input files (so that they can determine the target language), and it registers a start-up file. In this case, the file python.swg will be parsed before any part of the user-supplied input file.

    Before proceeding any further, create a directory for your module in the SWIG library (The Lib directory). Now, create a configuration file in the directory. For example, python.swg.

    Just to review, your language module should now consist of two files-- an implementation file python.cxx and a configuration file python.swg.

    39.10.5 Entry point to code generation

    SWIG is a multi-pass compiler. Once the main() method has been invoked, the language module does not execute again until preprocessing, parsing, and a variety of semantic analysis passes have been performed. When the core is ready to start generating wrappers, it invokes the top() method of your language class. The argument to top is a single parse tree node that corresponds to the top of the entire parse tree.

    To get the code generation process started, the top() procedure needs to do several things:

    • Initialize the wrapper code output.
    • Set the module name.
    • Emit common initialization code.
    • Emit code for all of the child nodes.
    • Finalize the wrapper module and cleanup.

    An outline of top() might be as follows:

    int Python::top(Node *n) {
    
      /* Get the module name */
      String *module = Getattr(n, "name");
    
      /* Get the output file name */
      String *outfile = Getattr(n, "outfile");
    
      /* Initialize I/O (see next section) */
      ...
    
      /* Output module initialization code */
      ...
    
      /* Emit code for children */
      Language::top(n);
    
      ...
      /* Cleanup files */
      ...
    
      return SWIG_OK;
    }
    

    39.10.6 Module I/O and wrapper skeleton

    Within SWIG wrappers, there are five main sections. These are (in order)

    • begin: This section is a placeholder for users to put code at the beginning of the C/C++ wrapper file.
    • runtime: This section has most of the common SWIG runtime code.
    • header: This section holds declarations and inclusions from the .i file.
    • wrapper: This section holds all the wrapper code.
    • init: This section holds the module initialisation function (the entry point for the interpreter).

    Different parts of the SWIG code will fill different sections, then upon completion of the wrappering all the sections will be saved to the wrapper file.

    To perform this will require several additions to the code in various places, such as:

    class PYTHON : public Language {
    protected:
      /* General DOH objects used for holding the strings */
      File *f_begin;
      File *f_runtime;
      File *f_header;
      File *f_wrappers;
      File *f_init;
    
    public:
      ...
    
    };
    
    int Python::top(Node *n) {
    
      ...
    
      /* Initialize I/O */
      f_begin = NewFile(outfile, "w", SWIG_output_files());
      if (!f_begin) {
        FileErrorDisplay(outfile);
        SWIG_exit(EXIT_FAILURE);
      }
      f_runtime = NewString("");
      f_init = NewString("");
      f_header = NewString("");
      f_wrappers = NewString("");
    
      /* Register file targets with the SWIG file handler */
      Swig_register_filebyname("begin", f_begin);
      Swig_register_filebyname("header", f_header);
      Swig_register_filebyname("wrapper", f_wrappers);
      Swig_register_filebyname("runtime", f_runtime);
      Swig_register_filebyname("init", f_init);
    
      /* Output module initialization code */
      Swig_banner(f_begin);
      ...
    
      /* Emit code for children */
      Language::top(n);
    
      ...
      /* Write all to the file */
      Dump(f_runtime, f_begin);
      Dump(f_header, f_begin);
      Dump(f_wrappers, f_begin);
      Wrapper_pretty_print(f_init, f_begin);
    
      /* Cleanup files */
      Delete(f_runtime);
      Delete(f_header);
      Delete(f_wrappers);
      Delete(f_init);
      Delete(f_begin);
    
      return SWIG_OK;
    }
    

    Using this to process a file will generate a wrapper file, however the wrapper will only consist of the common SWIG code as well as any inline code which was written in the .i file. It does not contain any wrappers for any of the functions or classes.

    The code to generate the wrappers are the various member functions, which currently have not been touched. We will look at functionWrapper() as this is the most commonly used function. In fact many of the other wrapper routines will call this to do their work.

    A simple modification to write some basic details to the wrapper looks like this:

    int Python::functionWrapper(Node *n) {
      /* Get some useful attributes of this function */
      String   *name   = Getattr(n, "sym:name");
      SwigType *type   = Getattr(n, "type");
      ParmList *parms  = Getattr(n, "parms");
      String   *parmstr= ParmList_str_defaultargs(parms); // to string
      String   *func   = SwigType_str(type, NewStringf("%s(%s)", name, parmstr));
      String   *action = Getattr(n, "wrap:action");
    
      Printf(f_wrappers, "functionWrapper   : %s\n", func);
      Printf(f_wrappers, "           action : %s\n", action);
      return SWIG_OK;
    }
    

    This will now produce some useful information within your wrapper file.

    functionWrapper   : void delete_Shape(Shape *self)
               action : delete arg1;
    
    functionWrapper   : void Shape_x_set(Shape *self, double x)
               action : if (arg1) (arg1)->x = arg2;
    
    functionWrapper   : double Shape_x_get(Shape *self)
               action : result = (double) ((arg1)->x);
    
    functionWrapper   : void Shape_y_set(Shape *self, double y)
               action : if (arg1) (arg1)->y = arg2;
    ...
    

    39.10.7 Low-level code generators

    As ingenious as SWIG is, and despite all its capabilities and the power of its parser, the Low-level code generation takes a lot of work to write properly. Mainly because every language insists on its own manner of interfacing to C/C++. To write the code generators you will need a good understanding of how to manually write an interface to your chosen language, so make sure you have your documentation handy.

    At this point it is also probably a good idea to take a very simple file (just one function), and try letting SWIG generate wrappers for many different languages. Take a look at all of the wrappers generated, and decide which one looks closest to the language you are trying to wrap. This may help you to decide which code to look at.

    In general most language wrappers look a little like this:

    /* wrapper for TYPE3 some_function(TYPE1, TYPE2); */
    RETURN_TYPE _wrap_some_function(ARGS){
      TYPE1 arg1;
      TYPE2 arg2;
      TYPE3 result;
    
      if(ARG1 is not of TYPE1) goto fail;
      arg1=(convert ARG1);
      if(ARG2 is not of TYPE2) goto fail;
      arg2=(convert ARG2);
    
      result=some_function(arg1, arg2);
    
      convert 'result' to whatever the language wants;
    
      do any tidy up;
    
      return ALL_OK;
    
      fail:
      do any tidy up;
      return ERROR;
    }
    

    Yes, it is rather vague and not very clear. But each language works differently so this will have to do for now.

    Tackling this problem will be done in two stages:

    • The skeleton: the function wrapper, and call, but without the conversion
    • The conversion: converting the arguments to-from what the language wants

    The first step will be done in the code, the second will be done in typemaps.

    Our first step will be to write the code for functionWrapper() . What is shown below is NOT the solution, merely a step in the right direction. There are a lot of issues to address.

    • Variable length and default parameters
    • Typechecking and number of argument checks
    • Overloaded functions
    • Inout and Output only arguments
    virtual int functionWrapper(Node *n) {
      /* get useful attributes */
      String   *name   = Getattr(n, "sym:name");
      SwigType *type   = Getattr(n, "type");
      ParmList *parms  = Getattr(n, "parms");
      ...
    
      /* create the wrapper object */
      Wrapper *wrapper = NewWrapper();
    
      /* create the functions wrappered name */
      String *wname = Swig_name_wrapper(iname);
    
      /* deal with overloading */
      ....
    
      /* write the wrapper function definition */
      Printv(wrapper->def, "RETURN_TYPE ", wname, "(ARGS) {", NIL);
    
      /* if any additional local variable needed, add them now */
      ...
    
      /* write the list of locals/arguments required */
      emit_args(type, parms, wrapper);
    
      /* check arguments */
      ...
    
      /* write typemaps(in) */
      ....
    
      /* write constraints */
      ....
    
      /* Emit the function call */
      emit_action(n, wrapper);
    
      /* return value if necessary  */
      ....
    
      /* write typemaps(out) */
      ....
    
      /* add cleanup code */
      ....
    
      /* Close the function(ok) */
      Printv(wrapper->code, "return ALL_OK;\n", NIL);
    
      /* add the failure cleanup code */
      ...
    
      /* Close the function(error) */
      Printv(wrapper->code, "return ERROR;\n", "}\n", NIL);
    
      /* final substitutions if applicable */
      ...
    
      /* Dump the function out */
      Wrapper_print(wrapper, f_wrappers);
    
      /* tidy up */
      Delete(wname);
      DelWrapper(wrapper);
    
      return SWIG_OK;
    }
    

    Executing this code will produce wrappers which have our basic skeleton but without the typemaps, there is still work to do.

    39.10.8 Configuration files

    At the time of this writing, SWIG supports nearly twenty languages, which means that for continued sanity in maintaining the configuration files, the language modules need to follow some conventions. These are outlined here along with the admission that, yes it is ok to violate these conventions in minor ways, as long as you know where to apply the proper kludge to keep the overall system regular and running. Engineering is the art of compromise, see...

    Much of the maintenance regularity depends on choosing a suitable nickname for your language module (and then using it in a controlled way). Nicknames should be all lower case letters with an optional numeric suffix (no underscores, no dashes, no spaces). Some examples are: foo, bar, qux99.

    The numeric suffix variant, as in the last example, is somewhat tricky to work with because sometimes people expect to refer to the language without this number but sometimes that number is extremely relevant (especially when it corresponds to language implementation versions with incompatible interfaces). New language modules that unavoidably require a numeric suffix in their nickname should include that number in all uses, or be prepared to kludge.

    The nickname is used in four places:

    usagetransform
    "skip" tag(none)
    Examples/ subdir name(none)
    Examples/test-suite/ subdir name(none)

    As you can see, most usages are direct.

    configure.ac
    This file is processed by

    autoconf to generate the configure script. This is where you need to add shell script fragments and autoconf macros to detect the presence of whatever development support your language module requires, typically directories where headers and libraries can be found, and/or utility programs useful for integrating the generated wrapper code.

    Use the AC_ARG_WITH, AC_MSG_CHECKING, AC_SUBST macros and so forth (see other languages for examples). Avoid using the [ and ] character in shell script fragments. The variable names passed to AC_SUBST should begin with the nickname, entirely upcased.

    At the end of the new section is the place to put the aforementioned nickname kludges (should they be needed). See Perl5 for examples of what to do. [If this is still unclear after you've read the code, ping me and I'll expand on this further. --ttn]

    Makefile.in

    Some of the variables AC_SUBSTituted are essential to the support of your language module. Fashion these into a shell script "test" clause and assign that to a skip tag using "-z" and "-o":

    skip-qux99 = [ -z "@QUX99INCLUDE@" -o -z "@QUX99LIBS" ]

    This means if those vars should ever be empty, qux99 support should be considered absent and so it would be a good idea to skip actions that might rely on it.

    Here is where you may also define an alias (but then you'll need to kludge --- don't do this):

    skip-qux = $(skip-qux99)

    Lastly, you need to modify each of check-aliveness, check-examples, check-test-suite and lib-languages (var). Use the nickname for these, not the alias. Note that you can do this even before you have any tests or examples set up; the Makefile rules do some sanity checking and skip around these kinds of problems.

    Examples/Makefile.in
    Nothing special here; see comments at the top of this file and look to the existing languages for examples.
    Examples/qux99/check.list
    Do cp ../python/check.list . and modify to taste. One subdir per line.
    Lib/qux99/extra-install.list
    If you add your language to the top-level Makefile.in var lib-languages, then make install will install all *.i and *.swg files from the language-specific subdirectory of Lib. Use (optional) file extra-install.list in that directory to name additional files to install (see ruby for example).
    Source/Modules/Makefile.am
    Add appropriate files to this Automake file. That's it!

    When you have modified these files, please make sure that the new language module is completely ignored if it is not installed and detected on a box, that is, make check-examples and make check-test-suite politely displays the ignoring language message.

    39.10.9 Runtime support

    Discuss the kinds of functions typically needed for SWIG runtime support (e.g. SWIG_ConvertPtr() and SWIG_NewPointerObj() ) and the names of the SWIG files that implement those functions.

    39.10.10 Standard library files

    The standard library files that most languages supply keeps growing as SWIG matures. The following are the minimum that are usually supported:

    • typemaps.i
    • std_string.i
    • std_vector.i
    • stl.i

    Please copy these and modify for any new language.

    39.10.11 User examples

    Each of the language modules provides one or more examples. These examples are used to demonstrate different features of the language module to SWIG end-users, but you'll find that they're useful during development and testing of your language module as well. You can use examples from the existing SWIG language modules for inspiration.

    Each example is self-contained and consists of (at least) a Makefile, a SWIG interface file for the example module, and a 'runme' script that demonstrates the functionality for that module. All of these files are stored in the same subdirectory under the Examples/[lang] directory. There are two classic examples which should be the first to convert to a new language module. These are the "simple" C example and the "class" C++ example. These can be found, for example for Python, in Examples/python/simple and Examples/python/class.

    By default, all of the examples are built and run when the user types make check. To ensure that your examples are automatically run during this process, see the section on configuration files.

    39.10.12 Test driven development and the test-suite

    A test driven development approach is central to the improvement and development of SWIG. Most modifications to SWIG are accompanied by additional regression tests and checking all tests to ensure that no regressions have been introduced.

    The regression testing is carried out by the SWIG test-suite. The test-suite consists of numerous testcase interface files in the Examples/test-suite directory as well as target language specific runtime tests in the Examples/test-suite/[lang] directory. When a testcase is run, it will execute the following steps for each testcase:

    1. Execute SWIG passing it the testcase interface file.
    2. Compile the resulting generated C/C++ code with either the C or C++ compiler into object files.
    3. Link the object files into a dynamic library (dll/shared object).
    4. Compile any generated and any runtime test target language code with the target language compiler, if the target language supports compilation. This step thus does not apply to the interpreted languages.
    5. Execute a runtime test if one exists.

    For example, the ret_by_value testcase consists of two components. The first component is the Examples/test-suite/ret_by_value.i interface file. The name of the SWIG module must always be the name of the testcase, so the ret_by_value.i interface file thus begins with:

    %module ret_by_value
    

    The testcase code will then follow the module declaration, usually within a %inline %{ ... %} section for the majority of the tests.

    The second component is the optional runtime tests. Any runtime tests are named using the following convention: [testcase]_runme.[ext], where [testcase] is the testcase name and [ext] is the normal extension for the target language file. In this case, the Java and Python target languages implement a runtime test, so their files are respectively, Examples/test-suite/java/ret_by_value_runme.java and Examples/test-suite/python/ret_by_value_runme.py.

    The goal of the test-suite is to test as much as possible in a silent manner. This way any SWIG or compiler errors or warnings are easily visible. Should there be any warnings, changes must be made to either fix them (preferably) or suppress them. Compilation or runtime errors result in a testcase failure and will be immediately visible. It is therefore essential that the runtime tests are written in a manner that displays nothing to stdout/stderr on success but error/exception out with an error message on stderr on failure.

    39.10.12.1 Running the test-suite

    In order for the test-suite to work for a particular target language, the language must be correctly detected and configured during the configure stage so that the correct Makefiles are generated. Most development occurs on Linux, so usually it is a matter of installing the development packages for the target language and simply configuring as outlined earlier.

    If when running the test-suite commands that follow, you get a message that the test was skipped, it indicates that the configure stage is missing information in order to compile and run everything for that language.

    The test-suite can be run in a number of ways. The first group of commands are for running multiple testcases in one run and should be executed in the top level directory. To run the entire test-suite (can take a long time):

    make -k check-test-suite
    

    To run the test-suite just for target language [lang], replace [lang] with one of csharp, java, perl5, python, ruby, tcl etc:

    make check-[lang]-test-suite
    

    Note that if a runtime test is available, a message "(with run test)" is displayed when run. For example:

    $ make check-python-test-suite
    checking python test-suite
    checking python testcase argcargvtest (with run test)
    checking python testcase python_autodoc
    checking python testcase python_append (with run test)
    checking python testcase callback (with run test)
    

    The files generated on a previous run can be deleted using the clean targets, either the whole test-suite or for a particular language:

    make clean-test-suite
    make clean-[lang]-test-suite
    

    The test-suite can be run in a partialcheck mode where just SWIG is executed, that is, the compile, link and running of the testcases is not performed. Note that the partialcheck does not require the target language to be correctly configured and detected and unlike the other test-suite make targets, is never skipped. Once again, either all the languages can be executed or just a chosen language:

    make partialcheck-test-suite
    make partialcheck-[lang]-test-suite
    

    If your computer has more than one CPU, you are strongly advised to use parallel make to speed up the execution speed. This can be done with any of the make targets that execute more than one testcase. For example, a dual core processor can efficiently use 2 parallel jobs:

    make -j2 check-test-suite
    make -j2 check-python-test-suite
    make -j2 partialcheck-java-test-suite
    

    The second group of commands are for running individual testcases and should be executed in the appropriate target language directory, Examples/test-suite/[lang]. Testcases can contain either C or C++ code and when one is written, a decision must be made as to which of these input languages is to be used. Replace [testcase] in the commands below with the name of the testcase.

    For a C language testcase, add the testcase under the C_TEST_CASES list in Examples/test-suite/common.mk and execute individually as:

    make -s [testcase].ctest
    

    For a C++ language testcase, add the testcase under the CPP_TEST_CASES list in Examples/test-suite/common.mk and execute individually as:

    make -s [testcase].cpptest
    

    A third category of tests are C++ language testcases testing multiple modules (the %import directive). These require more than one shared library (dll/shared object) to be built and so are separated out from the normal C++ testcases. Add the testcase under the MULTI_CPP_TEST_CASES list in Examples/test-suite/common.mk and execute individually as:

    make -s [testcase].multicpptest
    

    To delete the generated files, execute:

    make -s [testcase].clean
    

    If you would like to see the exact commands being executed, drop the -s option:

    make [testcase].ctest
    make [testcase].cpptest
    make [testcase].multicpptest
    

    Some real examples of each:

    make -s ret_by_value.clean
    make -s ret_by_value.ctest
    make -s bools.cpptest
    make -s imports.multicpptest
    

    Advanced usage of the test-suite facilitates running tools on some of the five stages. The make variables SWIGTOOL and RUNTOOL are used to specify a tool to respectively, invoke SWIG and the execution of the runtime test. You are advised to view the Examples/test-suite/common.mk file for details but for a short summary, the classic usage is to use Valgrind for memory checking. For example, checking for memory leaks when running the runtime test in the target language interpreter:

    make ret_by_value.ctest RUNTOOL="valgrind --leak-check=full"
    

    This will probably make more sense if you look at the output of the above as it will show the exact commands being executed. SWIG can be analyzed for bad memory accesses using:

    make ret_by_value.ctest SWIGTOOL="valgrind --tool=memcheck --trace-children=yes"
    

    A debugger can also be invoked easily on an individual test, for example gdb:

    make ret_by_value.ctest RUNTOOL="gdb --args"
    

    SWIG reads the SWIG_FEATURES environment variable to obtain options in addition to those passed on the command line. This is particularly useful as the entire test-suite or a particular testcase can be run customized by using additional arguments, for example the -O optimization flag can be added in, as shown below for the bash shell:

    env SWIG_FEATURES=-O make check-python-test-suite
    

    The syntax for setting environment variables varies from one shell to the next, but it also works as shown in the example below, where some typemap debugging is added in:

    make ret_by_value.ctest SWIG_FEATURES="-debug-tmsearch"
    

    There is also a special 'errors' test-suite which is a set of regression tests checking SWIG warning and error messages. It can be run in the same way as the other language test-suites, replacing [lang] with errors, such as make check-errors-test-suite. The test cases used and the way it works is described in Examples/test-suite/errors/Makefile.in.

    39.10.13 Documentation

    Don't forget to write end-user documentation for your language module. Currently, each language module has a dedicated chapter You shouldn't rehash things that are already covered in sufficient detail in the SWIG Basics and SWIG and C++ chapters. There is no fixed format for what, exactly, you should document about your language module, but you'll obviously want to cover issues that are unique to your language.

    Some topics that you'll want to be sure to address include:

    • Command line options unique to your language module.
    • Non-obvious mappings between C/C++ and target language concepts. For example, if your target language provides a single floating point type, it should be no big surprise to find that C/C++ float and double types are mapped to it. On the other hand, if your target language doesn't provide support for "classes" or something similar, you'd want to discuss how C++ classes are handled.
    • How to compile the SWIG-generated wrapper code into shared libraries that can actually be used. For some languages, there are well-defined procedures for doing this, but for others it's an ad hoc process. Provide as much detail as appropriate, and links to other resources if available.

    39.10.14 Coding style guidelines

    The coding guidelines for the C/C++ source code are pretty much K&R C style. The style can be inferred from the existing code base and is largely dictated by the indent code beautifier tool set to K&R style. The code can formatted using the make targets in the Source directory. Below is an example of how to format the emit.cxx file:

    $ cd Source
    $ make beautify-file INDENTFILE=Modules/emit.cxx
    

    Of particular note is indentation is set to 2 spaces and a tab is used instead of 8 spaces. The generated C/C++ code should also follow this style as close as possible. However, tabs should be avoided as unlike the SWIG developers, users will never have consistent tab settings.

    39.10.15 Target language status

    Target languages are given a status of either 'Supported' or 'Experimental' depending on their maturity as broadly outlined in the Target language introduction. This section provides more details on how this status is given.

    39.10.15.1 Supported status

    A target language is given the 'Supported' status when

    • It is in a mature, well functioning state.
    • It has its own comprehensive chapter in the documentation. The level of documentation should be comprehensive and match the standard of the other mature modules. Python and Java are good references.
    • It passes all of the main SWIG test-suite. The main test-suite is defined by the tests in the C_TEST_CASES, CPP_TEST_CASES and MULTI_CPP_TEST_CASES lists in Examples/test-suite/common.mk. The tests in CPP11_TEST_CASES will also be required in the near future.
    • The test-suite must also include at least twenty wide-ranging runtime tests. The most mature languages have a few hundred runtime tests. Note that porting runtime tests from another language module is a quick and easy way to achieve this.
    • It supports the vast majority of SWIG features. Some more advanced features, such as, directors, full nested class support and target language namespaces (nspace) may be unimplemented. A few support libraries may be missing, for example, a small number of STL libraries.
    • It provides strong backwards compatibility between releases. Each point release must aim to be fully backwards compatible. A point release version is the 3rd version digit, so each of the x.y.* versions should be backwards compatible. Backwards compatibility breakages can occur in a new major or minor version if absolutely necessary and if documented. A major or minor version is the first or second digit in the three digit version.
    • Fixing unintended regressions in the Supported languages will be given higher priority over experimental languages by the core SWIG developers.
    • Examples must be available and run successfully.
    • The examples and test-suite must be fully functioning on the Travis Continuous Integration platform.

    39.10.15.2 Experimental status

    A target language is given the 'Experimental' status when

    • It is of sub-standard quality, failing to meet the above 'Supported' status.
    • It is somewhere between the mid to mature stage of development.
    • It is in need of help to finish development.

    Some minimum requirements and notes about languages with the 'Experimental' status:

    • Will at least implement basic functionality - support wrapping C functions and simple C++ classes and templates.
    • Have its own documentation chapter containing a reasonable level of detail. The documentation must provide enough basic functionality for a user to get started.
    • Have fully functional examples of basic functionality (the simple and class examples).
    • The test-suite must be implemented and include a few runtime tests for both C and C++ test cases.
    • Failing tests must be put into one of the FAILING_CPP_TESTS or FAILING_C_TESTS lists in the test-suite. This will ensure the test-suite can be superficially made to pass by ignoring failing tests. The number of tests in these lists should be no greater than half of the number of tests in the full test-suite.
    • The examples and test-suite must also be fully functioning on the Travis Continuous Integration platform. However, experimental languages will be set as 'allow_failures'. This means that pull requests and normal development commits will not break the entire Travis build should an experimental language fail.
    • Any new failed tests will be fixed on a 'best effort' basis by core developers with no promises made.
    • If a language module has an official maintainer, then the maintainer will be requested to focus on fixing test-suite regressions and commit to migrating the module to become a 'Supported' module.
    • If a module does not have an official maintainer, then, as maintenance will be on a 'best efforts' basis by the core maintainers, no guarantees will be provided from one release to the next and regressions may creep in.
    • Experimental target languages will have a (suppressible) warning explaining the Experimental sub-standard status and encourage users to help improve it.
    • No backwards compatibility is guaranteed as the module is effectively 'in development'. If a language module has an official maintainer, then a backwards compatibility guarantee may be provided at the maintainer's discretion and should be documented as such.

    39.10.16 Prerequisites for adding a new language module to the SWIG distribution

    New target language modules can be included in SWIG and contributions are encouraged for popular languages. In order to be considered for inclusion, a language must at a minimum fit the 'Experimental' status described above.

    Below are some practical steps that should help meet these requirements.

    1. The "simple" example needs to be working to demonstrate basic C code wrappers. Port the example from another language, such as from Examples/python/simple.
    2. The "class" example needs to be working to demonstrate basic C++ code wrappers. Port the example from another language, such as from Examples/python/class.
    3. Modify configure.ac, Makefile.in and Examples/Makefile.in to run these examples. Please make sure that if the new language is not installed properly on a box, make -k check should still work by skipping the tests and examples for the new language module.
    4. Copying an existing language module and adapting the source for it is likely to be the most efficient approach to fully developing a new module as a number of corner cases are covered in the existing implementations. The most advanced scripting languages are Python and Ruby. The most advanced compiled target languages are Java and C#.
    5. Get the test-suite running for the new language (make check-[lang]-test-suite). While the test-suite tests many corner cases, we'd expect the majority of it to work without much effort once the generated code is compiling correctly for basic functionality as most of the corner cases are covered in the SWIG core. Aim to first get one C and one C++ runtime test running in the test-suite. Adding further runtime tests should be a lot easier afterwards by porting existing runtime tests from another language module.
    6. The structure and contents of the html documentation chapter can be copied and adapted from one of the other language modules.
    7. Source code can be formatted correctly using the info in the coding style guidelines section.
    8. When ready, post a patch on Github, join the swig-devel mailing list and email the SWIG developers with a demonstration of commitment to maintaining the language module, certainly in the short term and ideally long term.

    Once accepted into the official Git repository, development efforts should concentrate on getting the entire test-suite to work in order to migrate the language module to the 'Supported' status. Runtime tests should be added for existing testcases and new test cases can be added should there be an area not already covered by the existing tests.

    39.11 Debugging Options

    There are various command line options which can aid debugging a SWIG interface as well as debugging the development of a language module. These are as follows:

    -debug-classes    - Display information about the classes found in the interface
    -debug-module <n> - Display module parse tree at stages 1-4, <n> is a csv list of stages
    -debug-symtabs    - Display symbol tables information
    -debug-symbols    - Display target language symbols in the symbol tables
    -debug-csymbols   - Display C symbols in the symbol tables
    -debug-lsymbols   - Display target language layer symbols
    -debug-tags       - Display information about the tags found in the interface
    -debug-template   - Display information for debugging templates
    -debug-top <n>    - Display entire parse tree at stages 1-4, <n> is a csv list of stages
    -debug-typedef    - Display information about the types and typedefs in the interface
    -debug-typemap    - Display information for debugging typemaps
    -debug-tmsearch   - Display typemap search debugging information
    -debug-tmused     - Display typemaps used debugging information
    

    The complete list of command line options for SWIG are available by running swig -help.

    39.12 Guide to parse tree nodes

    This section describes the different parse tree nodes and their attributes.

    cdecl

    Describes general C declarations including variables, functions, and typedefs. A declaration is parsed as "storage T D" where storage is a storage class, T is a base type, and D is a declarator.

    "name"          - Declarator name
    "type"          - Base type T
    "decl"          - Declarator type (abstract)
    "storage"       - Storage class (static, extern, typedef, etc.)
    "parms"         - Function parameters (if a function)
    "code"          - Function body code (if supplied)
    "value"         - Default value (if supplied)
    

    constructor

    C++ constructor declaration.

    "name"          - Name of constructor
    "parms"         - Parameters
    "decl"          - Declarator (function with parameters)
    "code"          - Function body code (if any)
    "feature:new"   - Set to indicate return of new object.
    

    destructor

    C++ destructor declaration.

    "name"          - Name of destructor
    "code"          - Function body code (if any)
    "storage"       - Storage class (set if virtual)
    "value"         - Default value (set if pure virtual).
    

    access

    C++ access change.

    "kind"          - public, protected, private
    

    constant

    Constant created by %constant or #define.

    "name"          - Name of constant.
    "type"          - Base type.
    "value"         - Value.
    "storage"       - Set to %constant
    "feature:immutable" - Set to indicate read-only
    

    class

    C++ class definition or C structure definition.

    "name"          - Name of the class.
    "kind"          - Class kind ("struct", "union", "class")
    "symtab"        - Enclosing symbol table.
    "tdname"        - Typedef name. Use for typedef struct { ... } A.
    "abstract"      - Set if class has pure virtual methods.
    "baselist"      - List of base class names.
    "storage"       - Storage class (if any)
    "unnamed"       - Set if class is unnamed.
    

    enum

    Enumeration.

    "name"          - Name of the enum (if supplied).
    "storage"       - Storage class (if any)
    "tdname"        - Typedef name (typedef enum { ... } name).
    "unnamed"       - Set if enum is unnamed.
    

    enumitem

    Enumeration value.

    "name"          - Name of the enum value.
    "type"          - Type (integer or char)
    "value"         - Enum value (if given)
    "feature:immutable" - Set to indicate read-only
    

    namespace

    C++ namespace.

    "name"          - Name of the namespace.
    "symtab"        - Symbol table for enclosed scope.
    "unnamed"       - Set if unnamed namespace
    "alias"         - Alias name. Set for namespace A = B;
    

    using

    C++ using directive.

    "name"          - Name of the object being referred to.
    "uname"         - Qualified name actually given to using.
    "node"          - Node being referenced.
    "namespace"     - Namespace name being reference (using namespace name)
    

    classforward

    A forward C++ class declaration.

    "name"          - Name of the class.
    "kind"          - Class kind ("union", "struct", "class")
    

    insert

    Code insertion directive. For example, %{ ... %} or %insert(section).

    "code"          - Inserted code
    "section"       - Section name ("header", "wrapper", etc.)
    

    top

    Top of the parse tree.

    "module"        - Module name
    

    extend

    %extend directive.

    "name"          - Module name
    "symtab"        - Symbol table of enclosed scope.
    

    apply

    %apply pattern { patternlist }.

    "pattern"       - Source pattern.
    "symtab"        - Symbol table of enclosed scope.
    

    clear

    %clear patternlist;

    "firstChild"    - Patterns to clear
    

    include

    %include directive.

    "name"         - Filename
    "firstChild"   - Children
    

    import

    %import directive.

    "name"         - Filename
    "firstChild"   - Children
    

    module

    %module directive.

    "name"         - Name of the module
    

    typemap

    %typemap directive.

    "method"       - Typemap method name.
    "code"         - Typemap code.
    "kwargs"       - Keyword arguments (if any)
    "firstChild"   - Typemap patterns
    

    typemapcopy

    %typemap directive with copy.

    "method"       - Typemap method name.
    "pattern"      - Typemap source pattern.
    "firstChild"   - Typemap patterns
    

    typemapitem

    %typemap pattern. Used with %apply, %clear, %typemap.

    "pattern"      - Typemap pattern (a parameter list)
    "parms"        - Typemap parameters.
    

    types

    %types directive.

    "parms"        - List of parameter types.
    "convcode"     - Code which replaces the default casting / conversion code
    

    extern

    extern "X" { ... } declaration.

    "name"       - Name "C", "Fortran", etc.
    

    39.13 Further Development Information

    There is further documentation available on the internals of SWIG, API documentation and debugging information. This is shipped with SWIG in the Doc/Devel directory.

    swig-4.0.1/Doc/Manual/Introduction.html0000644000175000017500000005156713527234052017655 0ustar williamwilliam Introduction

    2 Introduction

    2.1 What is SWIG?

    SWIG is a software development tool that simplifies the task of interfacing different languages to C and C++ programs. In a nutshell, SWIG is a compiler that takes C/C++ declarations and creates the wrappers needed to access those declarations from other languages including Perl, Python, Tcl, Ruby, Guile, and Java. SWIG normally requires no modifications to existing code and can often be used to build a usable interface in only a few minutes. Possible applications of SWIG include:

    • Building interpreted interfaces to existing C programs.
    • Rapid prototyping and application development.
    • Interactive debugging.
    • Reengineering or refactoring of legacy software into scripting language components.
    • Making a graphical user interface (using Tk for example).
    • Testing of C libraries and programs (using scripts).
    • Building high performance C modules for scripting languages.
    • Making C programming more enjoyable (or tolerable depending on your point of view).
    • Impressing your friends.
    • Obtaining vast sums of research funding (although obviously not applicable to the author).

    SWIG was originally designed to make it extremely easy for scientists and engineers to build extensible scientific software without having to get a degree in software engineering. Because of this, the use of SWIG tends to be somewhat informal and ad-hoc (e.g., SWIG does not require users to provide formal interface specifications as you would find in a dedicated IDL compiler). Although this style of development isn't appropriate for every project, it is particularly well suited to software development in the small; especially the research and development work that is commonly found in scientific and engineering projects. However, nowadays SWIG is known to be used in many large open source and commercial projects.

    2.2 Why use SWIG?

    As stated in the previous section, the primary purpose of SWIG is to simplify the task of integrating C/C++ with other programming languages. However, why would anyone want to do that? To answer that question, it is useful to list a few strengths of C/C++ programming:

    • Excellent support for writing programming libraries.
    • High performance (number crunching, data processing, graphics, etc.).
    • Systems programming and systems integration.
    • Large user community and software base.

    Next, let's list a few problems with C/C++ programming

    • Writing a user interface is rather painful (i.e., consider programming with MFC, X11, GTK, or any number of other libraries).
    • Testing is time consuming (the compile/debug cycle).
    • Not easy to reconfigure or customize without recompilation.
    • Modularization can be tricky.
    • Security concerns (buffer overflows for instance).

    To address these limitations, many programmers have arrived at the conclusion that it is much easier to use different programming languages for different tasks. For instance, writing a graphical user interface may be significantly easier in a scripting language like Python or Tcl (consider the reasons why millions of programmers have used languages like Visual Basic if you need more proof). An interactive interpreter might also serve as a useful debugging and testing tool. Other languages like Java might greatly simplify the task of writing distributed computing software. The key point is that different programming languages offer different strengths and weaknesses. Moreover, it is extremely unlikely that any programming is ever going to be perfect. Therefore, by combining languages together, you can utilize the best features of each language and greatly simplify certain aspects of software development.

    From the standpoint of C/C++, a lot of people use SWIG because they want to break out of the traditional monolithic C programming model which usually results in programs that resemble this:

    • A collection of functions and variables that do something useful.
    • A main() program that starts everything.
    • A horrible collection of hacks that form some kind of user interface (but which no-one really wants to touch).

    Instead of going down that route, incorporating C/C++ into a higher level language often results in a more modular design, less code, better flexibility, and increased programmer productivity.

    SWIG tries to make the problem of C/C++ integration as painless as possible. This allows you to focus on the underlying C program and using the high-level language interface, but not the tedious and complex chore of making the two languages talk to each other. At the same time, SWIG recognizes that all applications are different. Therefore, it provides a wide variety of customization features that let you change almost every aspect of the language bindings. This is the main reason why SWIG has such a large user manual ;-).

    2.3 Target languages

    SWIG in essence is a tool to generate code for making C/C++ code available to various other programming languages. These higher level programming languages are the target languages for the SWIG code generator and C or C++ are the input languages. A single target language must be specified when SWIG is run. This results in generating code for C/C++ and the specified target language to interface with each other. SWIG can be invoked multiple times, but with a different target language specified on each invocation. This ability to interface C/C++ to many different target languages is one of SWIG's core strengths and features.

    SWIG is very broadly composed of two components. A core component creates a parse tree from the input ISO C/C++ and SWIG directives (extensions to the C/C++ standards). The parse tree is then passed to a second component, one of the target language modules for generating code specific to a higher level language. SWIG supports many different target languages. These target languages are given a status of either Supported or Experimental. This status is provided to indicate the level of maturity to expect when using a particular target language as not all target languages are fully developed.

    The second part of the SWIG documentation contains a chapter for each target level language. Each chapter will state the status (Supported or Experimental) for that language.

    2.3.1 Supported status

    A target language is given the 'Supported' status when

    • It is in a mature, well functioning state.
    • It has its own comprehensive chapter in the documentation.
    • It passes all of the main SWIG test-suite and has a range of working examples.
    • It supports the vast majority of SWIG features.
    • It provides strong backwards compatibility between releases.

    The above is a short summary and further details are outlined in the Supported status section in the Extending chapter. The good news is that all the well-known and most popular languages have this status.

    2.3.2 Experimental status

    A target language is given the 'Experimental' status when

    • It is of sub-standard quality, failing to meet the above 'Supported' status.
    • It is somewhere between the mid to mature stage of development.
    • It does not guarantee any backwards compatibility between releases.
    • It is in need of help to finish development.

    Anyone using an experimental target language is strongly urged to assist with development of the target language module if they wish to use it.

    SWIG displays a warning when an experimental target language is used in order to set expectations and emphasize the experimental status of the target language. The usual warning suppression techniques can be used if required.

    The above is a short summary and further details are outlined in the Experimental status section in the Extending chapter.

    2.4 A SWIG example

    The best way to illustrate SWIG is with a simple example. Consider the following C code:

    /* File : example.c */
    
    double My_variable = 3.0;
    
    /* Compute factorial of n */
    int fact(int n) {
      if (n <= 1)
        return 1;
      else
        return n*fact(n-1);
    }
    
    /* Compute n mod m */
    int my_mod(int n, int m) {
      return(n % m);
    }
    

    Suppose that you wanted to access these functions and the global variable My_variable from Tcl. You start by making a SWIG interface file as shown below (by convention, these files carry a .i suffix) :

    2.4.1 SWIG interface file

    /* File : example.i */
    %module example
    %{
    /* Put headers and other declarations here */
    extern double My_variable;
    extern int    fact(int);
    extern int    my_mod(int n, int m);
    %}
    
    extern double My_variable;
    extern int    fact(int);
    extern int    my_mod(int n, int m);
    

    The interface file contains ISO C function prototypes and variable declarations. The %module directive defines the name of the module that will be created by SWIG. The %{ %} block provides a location for inserting additional code, such as C header files or additional C declarations, into the generated C wrapper code.

    2.4.2 The swig command

    SWIG is invoked using the swig command. We can use this to build a Tcl module (under Linux) as follows :

    unix > swig -tcl example.i
    unix > gcc -c -fpic example.c example_wrap.c -I/usr/local/include
    unix > gcc -shared example.o example_wrap.o -o example.so
    unix > tclsh
    % load ./example.so
    % fact 4
    24
    % my_mod 23 7
    2
    % expr $My_variable + 4.5
    7.5
    %
    

    The swig command produced a new file called example_wrap.c that should be compiled along with the example.c file. Most operating systems and scripting languages now support dynamic loading of modules. In our example, our Tcl module has been compiled into a shared library that can be loaded into Tcl. When loaded, Tcl can now access the functions and variables declared in the SWIG interface. A look at the file example_wrap.c reveals a hideous mess. However, you almost never need to worry about it.

    2.4.3 Building a Perl5 module

    Now, let's turn these functions into a Perl5 module. Without making any changes type the following (shown for Solaris):

    unix > swig -perl5 example.i
    unix > gcc -c example.c example_wrap.c \
            -I/usr/local/lib/perl5/sun4-solaris/5.003/CORE
    unix > ld -G example.o example_wrap.o -o example.so # This is for Solaris
    unix > perl5.003
    use example;
    print example::fact(4), "\n";
    print example::my_mod(23, 7), "\n";
    print $example::My_variable + 4.5, "\n";
    <ctrl-d>
    24
    2
    7.5
    unix >
    

    2.4.4 Building a Python module

    Finally, let's build a module for Python (shown for Irix).

    unix > swig -python example.i
    unix > gcc -c -fpic example.c example_wrap.c -I/usr/local/include/python2.0
    unix > gcc -shared example.o example_wrap.o -o _example.so
    unix > python
    Python 2.0 (#6, Feb 21 2001, 13:29:45)
    [GCC egcs-2.91.66 19990314/Linux (egcs-1.1.2 release)] on linux2
    Type "copyright", "credits" or "license" for more information.     
    >>> import example
    >>> example.fact(4)
    24
    >>> example.my_mod(23, 7)
    2
    >>> example.cvar.My_variable + 4.5
    7.5
    

    2.4.5 Shortcuts

    To the truly lazy programmer, one may wonder why we needed the extra interface file at all. As it turns out, you can often do without it. For example, you could also build a Perl5 module by just running SWIG on the C header file and specifying a module name as follows

    unix > swig -perl5 -module example example.h
    unix > gcc -c example.c example_wrap.c \
            -I/usr/local/lib/perl5/sun4-solaris/5.003/CORE
    unix > ld -G example.o example_wrap.o -o example.so
    unix > perl5.003
    use example;
    print example::fact(4), "\n";
    print example::my_mod(23, 7), "\n";
    print $example::My_variable + 4.5, "\n";
    <ctrl-d>
    24
    2
    7.5
    

    2.5 Supported C/C++ language features

    A primary goal of the SWIG project is to make the language binding process extremely easy. Although a few simple examples have been shown, SWIG is quite capable in supporting most of C++. Some of the major features include:

    • Full C99 preprocessing.
    • All ISO C and C++ datatypes.
    • Functions, variables, and constants.
    • Classes.
    • Single and multiple inheritance.
    • Overloaded functions and methods.
    • Overloaded operators.
    • C++ templates (including member templates, specialization, and partial specialization).
    • Namespaces.
    • Variable length arguments.
    • C++ smart pointers.

    Most of C++11 is also supported. Details are in the C++11 chapter. C++14 support is covered in the C++14 chapter. C++17 support is covered in the C++17 chapter.

    It is important to stress that SWIG is not a simplistic C++ lexing tool like several apparently similar wrapper generation tools. SWIG not only parses C++, it implements the full C++ type system and it is able to understand C++ semantics. SWIG generates its wrappers with full knowledge of this information. As a result, you will find SWIG to be just as capable of dealing with nasty corner cases as it is in wrapping simple C++ code. In fact, SWIG is able to handle C++ code that stresses the very limits of many C++ compilers.

    2.6 Non-intrusive interface building

    When used as intended, SWIG requires minimal (if any) modification to existing C or C++ code. This makes SWIG extremely easy to use with existing packages and promotes software reuse and modularity. By making the C/C++ code independent of the high level interface, you can change the interface and reuse the code in other applications. It is also possible to support different types of interfaces depending on the application.

    2.7 Incorporating SWIG into a build system

    SWIG is a command line tool and as such can be incorporated into any build system that supports invoking external tools/compilers. SWIG is most commonly invoked from within a Makefile, but is also known to be invoked from popular IDEs such as Microsoft Visual Studio.

    If you are using the GNU Autotools (Autoconf/ Automake/ Libtool) to configure SWIG use in your project, the SWIG Autoconf macros can be used. The primary macro is ax_pkg_swig, see http://www.gnu.org/software/autoconf-archive/ax_pkg_swig.html#ax_pkg_swig. The ax_python_devel macro is also helpful for generating Python extensions. See the Autoconf Archive for further information on this and other Autoconf macros.

    There is growing support for SWIG in some build tools, for example CMake is a cross-platform, open-source build manager with built in support for SWIG. CMake can detect the SWIG executable and many of the target language libraries for linking against. CMake knows how to build shared libraries and loadable modules on many different operating systems. This allows easy cross platform SWIG development. It can also generate the custom commands necessary for driving SWIG from IDEs and makefiles. All of this can be done from a single cross platform input file. The following example is a CMake input file for creating a Python wrapper for the SWIG interface file, example.i:

    
    # This is a CMake example for Python
    
    FIND_PACKAGE(SWIG REQUIRED)
    INCLUDE(${SWIG_USE_FILE})
    
    FIND_PACKAGE(PythonLibs)
    INCLUDE_DIRECTORIES(${PYTHON_INCLUDE_PATH})
    
    INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR})
    
    SET(CMAKE_SWIG_FLAGS "")
    
    SET_SOURCE_FILES_PROPERTIES(example.i PROPERTIES CPLUSPLUS ON)
    SET_SOURCE_FILES_PROPERTIES(example.i PROPERTIES SWIG_FLAGS "-includeall")
    SWIG_ADD_MODULE(example python example.i example.cxx)
    SWIG_LINK_LIBRARIES(example ${PYTHON_LIBRARIES})
    
    

    The above example will generate native build files such as makefiles, nmake files and Visual Studio projects which will invoke SWIG and compile the generated C++ files into _example.so (UNIX) or _example.pyd (Windows). For other target languages on Windows a dll, instead of a .pyd file, is usually generated.

    2.8 Hands off code generation

    SWIG is designed to produce working code that needs no hand-modification (in fact, if you look at the output, you probably won't want to modify it). You should think of your target language interface being defined entirely by the input to SWIG, not the resulting output file. While this approach may limit flexibility for hard-core hackers, it allows others to forget about the low-level implementation details.

    2.9 SWIG and freedom

    No, this isn't a special section on the sorry state of world politics. However, it may be useful to know that SWIG was written with a certain "philosophy" about programming---namely that programmers are smart and that tools should just stay out of their way. Because of that, you will find that SWIG is extremely permissive in what it lets you get away with. In fact, you can use SWIG to go well beyond "shooting yourself in the foot" if dangerous programming is your goal. On the other hand, this kind of freedom may be exactly what is needed to work with complicated and unusual C/C++ applications.

    Ironically, the freedom that SWIG provides is countered by an extremely conservative approach to code generation. At its core, SWIG tries to distill even the most advanced C++ code down to a small well-defined set of interface building techniques based on ISO C programming. Because of this, you will find that SWIG interfaces can be easily compiled by virtually every C/C++ compiler and that they can be used on any platform. Again, this is an important part of staying out of the programmer's way----the last thing any developer wants to do is to spend their time debugging the output of a tool that relies on non-portable or unreliable programming features. Dependencies are often a source of incompatibilities and problems and so additional third party libraries are not used in the generated code. SWIG will also generally avoid generating code that introduces a dependency on the C++ Standard Template Library (STL). SWIG will generate code that depends on the C libraries though.

    swig-4.0.1/Doc/Manual/SWIG.html0000644000175000017500000034121013527234052015730 0ustar williamwilliam SWIG Basics

    5 SWIG Basics

    This chapter describes the basic operation of SWIG, the structure of its input files, and how it handles standard ISO C declarations. C++ support is described in the next chapter. However, C++ programmers should still read this chapter to understand the basics. Specific details about each target language are described in later chapters.

    5.1 Running SWIG

    To run SWIG, use the swig command with options and a filename like this:

    swig [ options ] filename
    

    where filename is a SWIG interface file or a C/C++ header file. Full help can be seen by running swig -help. Below is the common set of options that can be used. Additional options are also defined for each target language. A full list can be obtained by running swig -<lang> -help for language <lang> specific options, for example, swig -ruby -help for Ruby.

    Supported Target Language Options
         -csharp         - Generate C# wrappers
         -d              - Generate D wrappers
         -go             - Generate Go wrappers
         -guile          - Generate Guile wrappers
         -java           - Generate Java wrappers
         -javascript     - Generate Javascript wrappers
         -lua            - Generate Lua wrappers
         -octave         - Generate Octave wrappers
         -perl5          - Generate Perl 5 wrappers
         -php7           - Generate PHP 7 wrappers
         -python         - Generate Python wrappers
         -r              - Generate R (aka GNU S) wrappers
         -ruby           - Generate Ruby wrappers
         -scilab         - Generate Scilab wrappers
         -tcl8           - Generate Tcl 8 wrappers
         -xml            - Generate XML wrappers
    
    Experimental Target Language Options
         -mzscheme       - Generate MzScheme/Racket wrappers
         -ocaml          - Generate OCaml wrappers
    
    General Options
         -addextern      - Add extra extern declarations
         -c++            - Enable C++ processing
         -co <file>      - Check <file> out of the SWIG library
         -copyctor       - Automatically generate copy constructors wherever possible
         -cpperraswarn   - Treat the preprocessor #error statement as #warning (default)
         -cppext <ext>   - Change file extension of generated C++ files to <ext>
                           (default is cxx)
         -copyright      - Display copyright notices
         -debug-classes  - Display information about the classes found in the interface
         -debug-module <n>- Display module parse tree at stages 1-4, <n> is a csv list of stages
         -debug-symtabs  - Display symbol tables information
         -debug-symbols  - Display target language symbols in the symbol tables
         -debug-csymbols - Display C symbols in the symbol tables
         -debug-lsymbols - Display target language layer symbols
         -debug-tags     - Display information about the tags found in the interface
         -debug-template - Display information for debugging templates
         -debug-top <n>  - Display entire parse tree at stages 1-4, <n> is a csv list of stages
         -debug-typedef  - Display information about the types and typedefs in the interface
         -debug-typemap  - Display typemap debugging information
         -debug-tmsearch - Display typemap search debugging information
         -debug-tmused   - Display typemaps used debugging information
         -directors      - Turn on director mode for all the classes, mainly for testing
         -dirprot        - Turn on wrapping of protected members for director classes (default)
         -D<symbol>      - Define a symbol <symbol> (for conditional compilation)
         -E              - Preprocess only, does not generate wrapper code
         -external-runtime [file] - Export the SWIG runtime stack
         -fakeversion <v>- Make SWIG fake the program version number to <v>
         -fcompact       - Compile in compact mode
         -features <list>- Set global features, where <list> is a comma separated list of
                           features, eg -features directors,autodoc=1
                           If no explicit value is given to the feature, a default of 1 is used
         -fastdispatch   - Enable fast dispatch mode to produce faster overload dispatcher code
         -Fmicrosoft     - Display error/warning messages in Microsoft format
         -Fstandard      - Display error/warning messages in commonly used format
         -fvirtual       - Compile in virtual elimination mode
         -help           - Display help
         -I-             - Don't search the current directory
         -I<dir>         - Look for SWIG files in directory <dir>
         -ignoremissing  - Ignore missing include files
         -importall      - Follow all #include statements as imports
         -includeall     - Follow all #include statements
         -l<ifile>       - Include SWIG library file <ifile>
         -macroerrors    - Report errors inside macros
         -makedefault    - Create default constructors/destructors (the default)
         -M              - List all dependencies
         -MD             - Is equivalent to `-M -MF <file>', except `-E' is not implied
         -MF <file>      - Generate dependencies into <file> and continue generating wrappers
         -MM             - List dependencies, but omit files in SWIG library
         -MMD            - Like `-MD', but omit files in SWIG library
         -module <name>  - Set module name to <name>
         -MP             - Generate phony targets for all dependencies
         -MT <target>    - Set the target of the rule emitted by dependency generation
         -nocontract     - Turn off contract checking
         -nocpperraswarn - Do not treat the preprocessor #error statement as #warning
         -nodefault      - Do not generate default constructors nor default destructors
         -nodefaultctor  - Do not generate implicit default constructors
         -nodefaultdtor  - Do not generate implicit default destructors
         -nodirprot      - Do not wrap director protected members
         -noexcept       - Do not wrap exception specifiers
         -nofastdispatch - Disable fast dispatch mode (default)
         -nopreprocess   - Skip the preprocessor step
         -notemplatereduce - Disable reduction of the typedefs in templates
         -O              - Enable the optimization options:
                            -fastdispatch -fvirtual
         -o <outfile>    - Set name of C/C++ output file to <outfile>
         -oh <headfile>  - Set name of C++ output header file for directors to <headfile>
         -outcurrentdir  - Set default output dir to current dir instead of input file's path
         -outdir <dir>   - Set language specific files output directory to <dir>
         -pcreversion    - Display PCRE version information
         -small          - Compile in virtual elimination and compact mode
         -swiglib        - Report location of SWIG library and exit
         -templatereduce - Reduce all the typedefs in templates
         -v              - Run in verbose mode
         -version        - Display SWIG version number
         -Wall           - Remove all warning suppression, also implies -Wextra
         -Wallkw         - Enable keyword warnings for all the supported languages
         -Werror         - Treat warnings as errors
         -Wextra         - Adds the following additional warnings: 202,309,403,405,512,321,322
         -w<list>        - Suppress/add warning messages, eg -w401,+321 - see Warnings.html
         -xmlout <file>  - Write XML version of the parse tree to <file> after normal processing
    

    Arguments may also be passed in a command-line options file (also known as a response file) which is useful if they exceed the system command line length limit. To do this, put the arguments in a file, then provide the file name prefixed with @ like so:

    swig @file
    

    The options read from the file are inserted in place of the file option. If the file does not exist, or cannot be read, then the option will be treated literally and not removed.

    Options in the file are separated by whitespace. A whitespace character may be included in an option by surrounding the entire option in either single or double quotes. Any character (including a backslash) may be included by prefixing the character to be included with a backslash. The file may itself contain additional @file options; any such options will be processed recursively.

    5.1.1 Input format

    As input, SWIG expects a file containing ISO C/C++ declarations and special SWIG directives. More often than not, this is a special SWIG interface file which is usually denoted with a special .i or .swg suffix. In certain cases, SWIG can be used directly on raw header files or source files. However, this is not the most typical case and there are several reasons why you might not want to do this (described later).

    The most common format of a SWIG interface is as follows:

    %module mymodule 
    %{
    #include "myheader.h"
    %}
    // Now list ISO C/C++ declarations
    int foo;
    int bar(int x);
    ...
    

    The module name is supplied using the special %module directive. Modules are described further in the Modules Introduction section.

    Everything in the %{ ... %} block is simply copied verbatim to the resulting wrapper file created by SWIG. This section is almost always used to include header files and other declarations that are required to make the generated wrapper code compile. It is important to emphasize that just because you include a declaration in a SWIG input file, that declaration does not automatically appear in the generated wrapper code---therefore you need to make sure you include the proper header files in the %{ ... %} section. It should be noted that the text enclosed in %{ ... %} is not parsed or interpreted by SWIG. The %{...%} syntax and semantics in SWIG is analogous to that of the declarations section used in input files to parser generation tools such as yacc or bison.

    5.1.2 SWIG Output

    The output of SWIG is a C/C++ file that contains all of the wrapper code needed to build an extension module. SWIG may generate some additional files depending on the target language. By default, an input file with the name file.i is transformed into a file file_wrap.c or file_wrap.cxx (depending on whether or not the -c++ option has been used). The name of the output C/C++ file can be changed using the -o option. In certain cases, file suffixes are used by the compiler to determine the source language (C, C++, etc.). Therefore, you have to use the -o option to change the suffix of the SWIG-generated wrapper file if you want something different than the default. For example:

    $ swig -c++ -python -o example_wrap.cpp example.i
    

    The C/C++ output file created by SWIG often contains everything that is needed to construct an extension module for the target scripting language. SWIG is not a stub compiler nor is it usually necessary to edit the output file (and if you look at the output, you probably won't want to). To build the final extension module, the SWIG output file is compiled and linked with the rest of your C/C++ program to create a shared library.

    For many target languages SWIG will also generate proxy class files in the target language. The default output directory for these language specific files is the same directory as the generated C/C++ file. This can be modified using the -outdir option. For example:

    $ swig -c++ -python -outdir pyfiles -o cppfiles/example_wrap.cpp example.i
    

    If the directories cppfiles and pyfiles exist, the following will be generated:

    cppfiles/example_wrap.cpp
    pyfiles/example.py
    

    If the -outcurrentdir option is used (without -o) then SWIG behaves like a typical C/C++ compiler and the default output directory is then the current directory. Without this option the default output directory is the path to the input file. If -o and -outcurrentdir are used together, -outcurrentdir is effectively ignored as the output directory for the language files is the same directory as the generated C/C++ file if not overridden with -outdir.

    5.1.3 Comments

    C and C++ style comments may appear anywhere in interface files. In previous versions of SWIG, comments were used to generate documentation files. However, this feature is currently under repair and will reappear in a later SWIG release.

    5.1.4 C Preprocessor

    Like C, SWIG preprocesses all input files through an enhanced version of the C preprocessor. All standard preprocessor features are supported including file inclusion, conditional compilation and macros. However, #include statements are ignored unless the -includeall command line option has been supplied. The reason for disabling includes is that SWIG is sometimes used to process raw C header files. In this case, you usually only want the extension module to include functions in the supplied header file rather than everything that might be included by that header file (i.e., system headers, C library functions, etc.).

    It should also be noted that the SWIG preprocessor skips all text enclosed inside a %{...%} block. In addition, the preprocessor includes a number of macro handling enhancements that make it more powerful than the normal C preprocessor. These extensions are described in the "Preprocessor" chapter.

    5.1.5 SWIG Directives

    Most of SWIG's operation is controlled by special directives that are always preceded by a "%" to distinguish them from normal C declarations. These directives are used to give SWIG hints or to alter SWIG's parsing behavior in some manner.

    Since SWIG directives are not legal C syntax, it is generally not possible to include them in header files. However, SWIG directives can be included in C header files using conditional compilation like this:

    /* header.h  --- Some header file */
    
    /* SWIG directives -- only seen if SWIG is running */ 
    #ifdef SWIG
    %module foo
    #endif
    

    SWIG is a special preprocessing symbol defined by SWIG when it is parsing an input file.

    5.1.6 Parser Limitations

    Although SWIG can parse most C/C++ declarations, it does not provide a complete C/C++ parser implementation. Most of these limitations pertain to very complicated type declarations and certain advanced C++ features. Specifically, the following features are not currently supported:

    • Non-conventional type declarations. For example, SWIG does not support declarations such as the following (even though this is legal C):

      /* Non-conventional placement of storage specifier (extern) */
      const int extern Number;
      
      /* Extra declarator grouping */
      Matrix (foo);    // A global variable
      
      /* Extra declarator grouping in parameters */
      void bar(Spam (Grok)(Doh));
      
      

      In practice, few (if any) C programmers actually write code like this since this style is never featured in programming books. However, if you're feeling particularly obfuscated, you can certainly break SWIG (although why would you want to?).

    • Running SWIG on C++ source files (the code in a .C, .cpp or .cxx file) is not recommended. The usual approach is to feed SWIG header files for parsing C++ definitions and declarations. The main reason is if SWIG parses a scoped definition or declaration (as is normal for C++ source files), it is ignored, unless a declaration for the symbol was parsed earlier. For example

      /* bar not wrapped unless foo has been defined and 
         the declaration of bar within foo has already been parsed */
      int foo::bar(int) {
        ... whatever ...
      }
      
    • Certain advanced features of C++ such as nested classes are not yet fully supported. Please see the C++ Nested classes section for more information.

    In the event of a parsing error, conditional compilation can be used to skip offending code. For example:

    #ifndef SWIG
    ... some bad declarations ...
    #endif
    

    Alternatively, you can just delete the offending code from the interface file.

    One of the reasons why SWIG does not provide a full C++ parser implementation is that it has been designed to work with incomplete specifications and to be very permissive in its handling of C/C++ datatypes (e.g., SWIG can generate interfaces even when there are missing class declarations or opaque datatypes). Unfortunately, this approach makes it extremely difficult to implement certain parts of a C/C++ parser as most compilers use type information to assist in the parsing of more complex declarations (for the truly curious, the primary complication in the implementation is that the SWIG parser does not utilize a separate typedef-name terminal symbol as described on p. 234 of K&R).

    5.2 Wrapping Simple C Declarations

    SWIG wraps simple C declarations by creating an interface that closely matches the way in which the declarations would be used in a C program. For example, consider the following interface file:

    %module example
    
    %inline %{
    extern double sin(double x);
    extern int strcmp(const char *, const char *);
    extern int Foo;
    %}
    #define STATUS 50
    #define VERSION "1.1"
    

    In this file, there are two functions sin() and strcmp(), a global variable Foo, and two constants STATUS and VERSION. When SWIG creates an extension module, these declarations are accessible as scripting language functions, variables, and constants respectively. For example, in Tcl:

    % sin 3
    5.2335956
    % strcmp Dave Mike
    -1
    % puts $Foo
    42
    % puts $STATUS
    50
    % puts $VERSION
    1.1
    

    Or in Python:

    >>> example.sin(3)
    5.2335956
    >>> example.strcmp('Dave', 'Mike')
    -1
    >>> print example.cvar.Foo
    42
    >>> print example.STATUS
    50
    >>> print example.VERSION
    1.1
    

    Whenever possible, SWIG creates an interface that closely matches the underlying C/C++ code. However, due to subtle differences between languages, run-time environments, and semantics, it is not always possible to do so. The next few sections describe various aspects of this mapping.

    5.2.1 Basic Type Handling

    In order to build an interface, SWIG has to convert C/C++ datatypes to equivalent types in the target language. Generally, scripting languages provide a more limited set of primitive types than C. Therefore, this conversion process involves a certain amount of type coercion.

    Most scripting languages provide a single integer type that is implemented using the int or long datatype in C. The following list shows all of the C datatypes that SWIG will convert to and from integers in the target language:

    int
    short
    long
    unsigned
    signed
    unsigned short
    unsigned long
    unsigned char
    signed char
    bool
    

    When an integral value is converted from C, a cast is used to convert it to the representation in the target language. Thus, a 16 bit short in C may be promoted to a 32 bit integer. When integers are converted in the other direction, the value is cast back into the original C type. If the value is too large to fit, it is silently truncated.

    unsigned char and signed char are special cases that are handled as small 8-bit integers. Normally, the char datatype is mapped as a one-character ASCII string.

    The bool datatype is cast to and from an integer value of 0 and 1 unless the target language provides a special boolean type.

    Some care is required when working with large integer values. Most scripting languages use 32-bit integers so mapping a 64-bit long integer may lead to truncation errors. Similar problems may arise with 32 bit unsigned integers (which may appear as large negative numbers). As a rule of thumb, the int datatype and all variations of char and short datatypes are safe to use. For unsigned int and long datatypes, you will need to carefully check the correct operation of your program after it has been wrapped with SWIG.

    Although the SWIG parser supports the long long datatype, not all language modules support it. This is because long long usually exceeds the integer precision available in the target language. In certain modules such as Tcl and Perl5, long long integers are encoded as strings. This allows the full range of these numbers to be represented. However, it does not allow long long values to be used in arithmetic expressions. It should also be noted that although long long is part of the ISO C99 standard, it is not universally supported by all C compilers. Make sure you are using a compiler that supports long long before trying to use this type with SWIG.

    SWIG recognizes the following floating point types :

    float
    double
    

    Floating point numbers are mapped to and from the natural representation of floats in the target language. This is almost always a C double. The rarely used datatype of long double is not supported by SWIG.

    The char datatype is mapped into a NULL terminated ASCII string with a single character. When used in a scripting language it shows up as a tiny string containing the character value. When converting the value back into C, SWIG takes a character string from the scripting language and strips off the first character as the char value. Thus if the value "foo" is assigned to a char datatype, it gets the value `f'.

    The char * datatype is handled as a NULL-terminated ASCII string. SWIG maps this into a 8-bit character string in the target scripting language. SWIG converts character strings in the target language to NULL terminated strings before passing them into C/C++. The default handling of these strings does not allow them to have embedded NULL bytes. Therefore, the char * datatype is not generally suitable for passing binary data. However, it is possible to change this behavior by defining a SWIG typemap. See the chapter on Typemaps for details about this.

    At this time, SWIG provides limited support for Unicode and wide-character strings (the C wchar_t type). Some languages provide typemaps for wchar_t, but bear in mind these might not be portable across different operating systems. This is a delicate topic that is poorly understood by many programmers and not implemented in a consistent manner across languages. For those scripting languages that provide Unicode support, Unicode strings are often available in an 8-bit representation such as UTF-8 that can be mapped to the char * type (in which case the SWIG interface will probably work). If the program you are wrapping uses Unicode, there is no guarantee that Unicode characters in the target language will use the same internal representation (e.g., UCS-2 vs. UCS-4). You may need to write some special conversion functions.

    5.2.2 Global Variables

    Whenever possible, SWIG maps C/C++ global variables into scripting language variables. For example,

    %module example
    double foo;
    
    

    results in a scripting language variable like this:

    # Tcl
    set foo [3.5]                   ;# Set foo to 3.5
    puts $foo                       ;# Print the value of foo
    
    # Python
    cvar.foo = 3.5                  # Set foo to 3.5
    print cvar.foo                  # Print value of foo
    
    # Perl
    $foo = 3.5;                     # Set foo to 3.5
    print $foo, "\n";               # Print value of foo
    
    # Ruby
    Module.foo = 3.5               # Set foo to 3.5
    print Module.foo, "\n"         # Print value of foo
    

    Whenever the scripting language variable is used, the underlying C global variable is accessed. Although SWIG makes every attempt to make global variables work like scripting language variables, it is not always possible to do so. For instance, in Python, all global variables must be accessed through a special variable object known as cvar (shown above). In Ruby, variables are accessed as attributes of the module. Other languages may convert variables to a pair of accessor functions. For example, the Java module generates a pair of functions double get_foo() and set_foo(double val) that are used to manipulate the value.

    Finally, if a global variable has been declared as const, it only supports read-only access. Note: this behavior is new to SWIG-1.3. Earlier versions of SWIG incorrectly handled const and created constants instead.

    5.2.3 Constants

    Constants can be created using #define, enumerations, or a special %constant directive. The following interface file shows a few valid constant declarations :

    #define I_CONST       5               // An integer constant
    #define PI            3.14159         // A Floating point constant
    #define S_CONST       "hello world"   // A string constant
    #define NEWLINE       '\n'            // Character constant
    
    enum boolean {NO=0, YES=1};
    enum months {JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG,
                 SEP, OCT, NOV, DEC};
    %constant double BLAH = 42.37;
    #define PI_4 PI/4
    #define FLAGS 0x04 | 0x08 | 0x40
    
    

    In #define declarations, the type of a constant is inferred by syntax. For example, a number with a decimal point is assumed to be floating point. In addition, SWIG must be able to fully resolve all of the symbols used in a #define in order for a constant to actually be created. This restriction is necessary because #define is also used to define preprocessor macros that are definitely not meant to be part of the scripting language interface. For example:

    #define EXTERN extern
    
    EXTERN void foo();
    

    In this case, you probably don't want to create a constant called EXTERN (what would the value be?). In general, SWIG will not create constants for macros unless the value can be completely determined by the preprocessor. For instance, in the above example, the declaration

    #define PI_4  PI/4
    

    defines a constant because PI was already defined as a constant and the value is known. However, for the same conservative reasons even a constant with a simple cast will be ignored, such as

    #define F_CONST (double) 5            // A floating point constant with cast
    

    The use of constant expressions is allowed, but SWIG does not evaluate them. Rather, it passes them through to the output file and lets the C compiler perform the final evaluation (SWIG does perform a limited form of type-checking however).

    For enumerations, it is critical that the original enum definition be included somewhere in the interface file (either in a header file or in the %{ %} block). SWIG only translates the enumeration into code needed to add the constants to a scripting language. It needs the original enumeration declaration in order to get the correct enum values as assigned by the C compiler.

    The %constant directive is used to more precisely create constants corresponding to different C datatypes. Although it is not usually needed for simple values, it is more useful when working with pointers and other more complex datatypes. Typically, %constant is only used when you want to add constants to the scripting language interface that are not defined in the original header file.

    5.2.4 A brief word about const

    A common confusion with C programming is the semantic meaning of the const qualifier in declarations--especially when it is mixed with pointers and other type modifiers. In fact, previous versions of SWIG handled const incorrectly--a situation that SWIG-1.3.7 and newer releases have fixed.

    Starting with SWIG-1.3, all variable declarations, regardless of any use of const, are wrapped as global variables. If a declaration happens to be declared as const, it is wrapped as a read-only variable. To tell if a variable is const or not, you need to look at the right-most occurrence of the const qualifier (that appears before the variable name). If the right-most const occurs after all other type modifiers (such as pointers), then the variable is const. Otherwise, it is not.

    Here are some examples of const declarations.

    const char a;           // A constant character
    char const b;           // A constant character (the same)
    char *const c;          // A constant pointer to a character
    const char *const d;    // A constant pointer to a constant character
    

    Here is an example of a declaration that is not const:

    const char *e;          // A pointer to a constant character.  The pointer
                            // may be modified.
    

    In this case, the pointer e can change---it's only the value being pointed to that is read-only.

    Please note that for const parameters or return types used in a function, SWIG pretty much ignores the fact that these are const, see the section on const-correctness for more information.

    Compatibility Note: One reason for changing SWIG to handle const declarations as read-only variables is that there are many situations where the value of a const variable might change. For example, a library might export a symbol as const in its public API to discourage modification, but still allow the value to change through some other kind of internal mechanism. Furthermore, programmers often overlook the fact that with a constant declaration like char *const, the underlying data being pointed to can be modified--it's only the pointer itself that is constant. In an embedded system, a const declaration might refer to a read-only memory address such as the location of a memory-mapped I/O device port (where the value changes, but writing to the port is not supported by the hardware). Rather than trying to build a bunch of special cases into the const qualifier, the new interpretation of const as "read-only" is simple and exactly matches the actual semantics of const in C/C++. If you really want to create a constant as in older versions of SWIG, use the %constant directive instead. For example:

    %constant double PI = 3.14159;
    

    or

    #ifdef SWIG
    #define const %constant
    #endif
    const double foo = 3.4;
    const double bar = 23.4;
    const int    spam = 42;
    #ifdef SWIG
    #undef const
    #endif
    ...
    
    

    5.2.5 A cautionary tale of char *

    Before going any further, there is one bit of caution involving char * that must now be mentioned. When strings are passed from a scripting language to a C char *, the pointer usually points to string data stored inside the interpreter. It is almost always a really bad idea to modify this data. Furthermore, some languages may explicitly disallow it. For instance, in Python, strings are supposed to be immutable. If you violate this, you will probably receive a vast amount of wrath when you unleash your module on the world.

    The primary source of problems are functions that might modify string data in place. A classic example would be a function like this:

    char *strcat(char *s, const char *t)
    

    Although SWIG will certainly generate a wrapper for this, its behavior will be undefined. In fact, it will probably cause your application to crash with a segmentation fault or other memory related problem. This is because s refers to some internal data in the target language---data that you shouldn't be touching.

    The bottom line: don't rely on char * for anything other than read-only input values. However, it must be noted that you could change the behavior of SWIG using typemaps.

    5.3 Pointers and complex objects

    Most C programs manipulate arrays, structures, and other types of objects. This section discusses the handling of these datatypes.

    5.3.1 Simple pointers

    Pointers to primitive C datatypes such as

    int *
    double ***
    char **
    

    are fully supported by SWIG. Rather than trying to convert the data being pointed to into a scripting representation, SWIG simply encodes the pointer itself into a representation that contains the actual value of the pointer and a type-tag. Thus, the SWIG representation of the above pointers (in Tcl), might look like this:

    _10081012_p_int
    _1008e124_ppp_double
    _f8ac_pp_char
    

    A NULL pointer is represented by the string "NULL" or the value 0 encoded with type information.

    All pointers are treated as opaque objects by SWIG. Thus, a pointer may be returned by a function and passed around to other C functions as needed. For all practical purposes, the scripting language interface works in exactly the same way as you would use the pointer in a C program. The only difference is that there is no mechanism for dereferencing the pointer since this would require the target language to understand the memory layout of the underlying object.

    The scripting language representation of a pointer value should never be manipulated directly. Even though the values shown look like hexadecimal addresses, the numbers used may differ from the actual machine address (e.g., on little-endian machines, the digits may appear in reverse order). Furthermore, SWIG does not normally map pointers into high-level objects such as associative arrays or lists (for example, converting an int * into an list of integers). There are several reasons why SWIG does not do this:

    • There is not enough information in a C declaration to properly map pointers into higher level constructs. For example, an int * may indeed be an array of integers, but if it contains ten million elements, converting it into a list object is probably a bad idea.
    • The underlying semantics associated with a pointer is not known by SWIG. For instance, an int * might not be an array at all--perhaps it is an output value!
    • By handling all pointers in a consistent manner, the implementation of SWIG is greatly simplified and less prone to error.

    5.3.2 Run time pointer type checking

    By allowing pointers to be manipulated from a scripting language, extension modules effectively bypass compile-time type checking in the C/C++ compiler. To prevent errors, a type signature is encoded into all pointer values and is used to perform run-time type checking. This type-checking process is an integral part of SWIG and can not be disabled or modified without using typemaps (described in later chapters).

    Like C, void * matches any kind of pointer. Furthermore, NULL pointers can be passed to any function that expects to receive a pointer. Although this has the potential to cause a crash, NULL pointers are also sometimes used as sentinel values or to denote a missing/empty value. Therefore, SWIG leaves NULL pointer checking up to the application.

    5.3.3 Derived types, structs, and classes

    For everything else (structs, classes, arrays, etc...) SWIG applies a very simple rule :

    Everything else is a pointer

    In other words, SWIG manipulates everything else by reference. This model makes sense because most C/C++ programs make heavy use of pointers and SWIG can use the type-checked pointer mechanism already present for handling pointers to basic datatypes.

    Although this probably sounds complicated, it's really quite simple. Suppose you have an interface file like this :

    %module fileio
    FILE *fopen(char *, char *);
    int fclose(FILE *);
    unsigned fread(void *ptr, unsigned size, unsigned nobj, FILE *);
    unsigned fwrite(void *ptr, unsigned size, unsigned nobj, FILE *);
    void *malloc(int nbytes);
    void free(void *);
    
    

    In this file, SWIG doesn't know what a FILE is, but since it's used as a pointer, so it doesn't really matter what it is. If you wrapped this module into Python, you can use the functions just like you expect :

    # Copy a file 
    def filecopy(source, target):
        f1 = fopen(source, "r")
        f2 = fopen(target, "w")
        buffer = malloc(8192)
        nbytes = fread(buffer, 8192, 1, f1)
        while (nbytes > 0):
            fwrite(buffer, 8192, 1, f2)
                nbytes = fread(buffer, 8192, 1, f1)
        free(buffer)
    

    In this case f1, f2, and buffer are all opaque objects containing C pointers. It doesn't matter what value they contain--our program works just fine without this knowledge.

    5.3.4 Undefined datatypes

    When SWIG encounters an undeclared datatype, it automatically assumes that it is a structure or class. For example, suppose the following function appeared in a SWIG input file:

    void matrix_multiply(Matrix *a, Matrix *b, Matrix *c);
    

    SWIG has no idea what a "Matrix" is. However, it is obviously a pointer to something so SWIG generates a wrapper using its generic pointer handling code.

    Unlike C or C++, SWIG does not actually care whether Matrix has been previously defined in the interface file or not. This allows SWIG to generate interfaces from only partial or limited information. In some cases, you may not care what a Matrix really is as long as you can pass an opaque reference to one around in the scripting language interface.

    An important detail to mention is that SWIG will gladly generate wrappers for an interface when there are unspecified type names. However, all unspecified types are internally handled as pointers to structures or classes! For example, consider the following declaration:

    void foo(size_t num);
    

    If size_t is undeclared, SWIG generates wrappers that expect to receive a type of size_t * (this mapping is described shortly). As a result, the scripting interface might behave strangely. For example:

    foo(40);
    TypeError: expected a _p_size_t.
    

    The only way to fix this problem is to make sure you properly declare type names using typedef.

    5.3.5 Typedef

    Like C, typedef can be used to define new type names in SWIG. For example:

    typedef unsigned int size_t;
    

    typedef definitions appearing in a SWIG interface are not propagated to the generated wrapper code. Therefore, they either need to be defined in an included header file or placed in the declarations section like this:

    %{
    /* Include in the generated wrapper file */
    typedef unsigned int size_t;
    %}
    /* Tell SWIG about it */
    typedef unsigned int size_t;
    

    or

    %inline %{
    typedef unsigned int size_t;
    %}
    

    In certain cases, you might be able to include other header files to collect type information. For example:

    %module example
    %import "sys/types.h"
    

    In this case, you might run SWIG as follows:

    $ swig -I/usr/include -includeall example.i
    

    It should be noted that your mileage will vary greatly here. System headers are notoriously complicated and may rely upon a variety of non-standard C coding extensions (e.g., such as special directives to GCC). Unless you exactly specify the right include directories and preprocessor symbols, this may not work correctly (you will have to experiment).

    SWIG tracks typedef declarations and uses this information for run-time type checking. For instance, if you use the above typedef and had the following function declaration:

    void foo(unsigned int *ptr);
    

    The corresponding wrapper function will accept arguments of type unsigned int * or size_t *.

    5.4 Other Practicalities

    So far, this chapter has presented almost everything you need to know to use SWIG for simple interfaces. However, some C programs use idioms that are somewhat more difficult to map to a scripting language interface. This section describes some of these issues.

    5.4.1 Passing structures by value

    Sometimes a C function takes structure parameters that are passed by value. For example, consider the following function:

    double dot_product(Vector a, Vector b);
    

    To deal with this, SWIG transforms the function to use pointers by creating a wrapper equivalent to the following:

    double wrap_dot_product(Vector *a, Vector *b) {
      Vector x = *a;
      Vector y = *b;
      return dot_product(x, y);
    }
    

    In the target language, the dot_product() function now accepts pointers to Vectors instead of Vectors. For the most part, this transformation is transparent so you might not notice.

    5.4.2 Return by value

    C functions that return structures or classes datatypes by value are more difficult to handle. Consider the following function:

    Vector cross_product(Vector v1, Vector v2);
    

    This function wants to return Vector, but SWIG only really supports pointers. As a result, SWIG creates a wrapper like this:

    Vector *wrap_cross_product(Vector *v1, Vector *v2) {
      Vector x = *v1;
      Vector y = *v2;
      Vector *result;
      result = (Vector *) malloc(sizeof(Vector));
      *(result) = cross(x, y);
      return result;
    }
    

    or if SWIG was run with the -c++ option:

    Vector *wrap_cross(Vector *v1, Vector *v2) {
      Vector x = *v1;
      Vector y = *v2;
      Vector *result = new Vector(cross(x, y)); // Uses default copy constructor
      return result;
    }
    

    In both cases, SWIG allocates a new object and returns a reference to it. It is up to the user to delete the returned object when it is no longer in use. Clearly, this will leak memory if you are unaware of the implicit memory allocation and don't take steps to free the result. That said, it should be noted that some language modules can now automatically track newly created objects and reclaim memory for you. Consult the documentation for each language module for more details.

    It should also be noted that the handling of pass/return by value in C++ has some special cases. For example, the above code fragments don't work correctly if Vector doesn't define a default constructor. The section on SWIG and C++ has more information about this case.

    5.4.3 Linking to structure variables

    When global variables or class members involving structures are encountered, SWIG handles them as pointers. For example, a global variable like this

    Vector unit_i;
    

    gets mapped to an underlying pair of set/get functions like this :

    Vector *unit_i_get() {
      return &unit_i;
    }
    void unit_i_set(Vector *value) {
      unit_i = *value;
    }
    

    Again some caution is in order. A global variable created in this manner will show up as a pointer in the target scripting language. It would be an extremely bad idea to free or destroy such a pointer. Also, C++ classes must supply a properly defined copy constructor in order for assignment to work correctly.

    5.4.4 Linking to char *

    When a global variable of type char * appears, SWIG uses malloc() or new to allocate memory for the new value. Specifically, if you have a variable like this

    char *foo;
    

    SWIG generates the following code:

    /* C mode */
    void foo_set(char *value) {
      if (foo) free(foo);
      foo = (char *) malloc(strlen(value)+1);
      strcpy(foo, value);
    }
    
    /* C++ mode.  When -c++ option is used */
    void foo_set(char *value) {
      if (foo) delete [] foo;
      foo = new char[strlen(value)+1];
      strcpy(foo, value);
    }
    

    If this is not the behavior that you want, consider making the variable read-only using the %immutable directive. Alternatively, you might write a short assist-function to set the value exactly like you want. For example:

    %inline %{
      void set_foo(char *value) {
        strncpy(foo, value, 50);
      }
    %}
    

    Note: If you write an assist function like this, you will have to call it as a function from the target scripting language (it does not work like a variable). For example, in Python you will have to write:

    >>> set_foo("Hello World")
    

    A common mistake with char * variables is to link to a variable declared like this:

    char *VERSION = "1.0";
    

    In this case, the variable will be readable, but any attempt to change the value results in a segmentation or general protection fault. This is due to the fact that SWIG is trying to release the old value using free or delete when the string literal value currently assigned to the variable wasn't allocated using malloc() or new. To fix this behavior, you can either mark the variable as read-only, write a typemap (as described in Chapter 6), or write a special set function as shown. Another alternative is to declare the variable as an array:

    char VERSION[64] = "1.0";
    

    When variables of type const char * are declared, SWIG still generates functions for setting and getting the value. However, the default behavior does not release the previous contents (resulting in a possible memory leak). In fact, you may get a warning message such as this when wrapping such a variable:

    example.i:20. Typemap warning. Setting const char * variable may leak memory
    

    The reason for this behavior is that const char * variables are often used to point to string literals. For example:

    const char *foo = "Hello World\n";
    

    Therefore, it's a really bad idea to call free() on such a pointer. On the other hand, it is legal to change the pointer to point to some other value. When setting a variable of this type, SWIG allocates a new string (using malloc or new) and changes the pointer to point to the new value. However, repeated modifications of the value will result in a memory leak since the old value is not released.

    5.4.5 Arrays

    Arrays are fully supported by SWIG, but they are always handled as pointers instead of mapping them to a special array object or list in the target language. Thus, the following declarations :

    int foobar(int a[40]);
    void grok(char *argv[]);
    void transpose(double a[20][20]);
    

    are processed as if they were really declared like this:

    int foobar(int *a);
    void grok(char **argv);
    void transpose(double (*a)[20]);
    

    Like C, SWIG does not perform array bounds checking. It is up to the user to make sure the pointer points to a suitably allocated region of memory.

    Multi-dimensional arrays are transformed into a pointer to an array of one less dimension. For example:

    int [10];         // Maps to int *
    int [10][20];     // Maps to int (*)[20]
    int [10][20][30]; // Maps to int (*)[20][30]
    

    It is important to note that in the C type system, a multidimensional array a[][] is NOT equivalent to a single pointer *a or a double pointer such as **a. Instead, a pointer to an array is used (as shown above) where the actual value of the pointer is the starting memory location of the array. The reader is strongly advised to dust off their C book and re-read the section on arrays before using them with SWIG.

    Array variables are supported, but are read-only by default. For example:

    int   a[100][200];
    

    In this case, reading the variable 'a' returns a pointer of type int (*)[200] that points to the first element of the array &a[0][0]. Trying to modify 'a' results in an error. This is because SWIG does not know how to copy data from the target language into the array. To work around this limitation, you may want to write a few simple assist functions like this:

    %inline %{
    void a_set(int i, int j, int val) {
      a[i][j] = val;
    }
    int a_get(int i, int j) {
      return a[i][j];
    }
    %}
    

    To dynamically create arrays of various sizes and shapes, it may be useful to write some helper functions in your interface. For example:

    // Some array helpers
    %inline %{
      /* Create any sort of [size] array */
      int *int_array(int size) {
        return (int *) malloc(size*sizeof(int));
      }
      /* Create a two-dimension array [size][10] */
      int (*int_array_10(int size))[10] {
        return (int (*)[10]) malloc(size*10*sizeof(int));
      }
    %}
    

    Arrays of char are handled as a special case by SWIG. In this case, strings in the target language can be stored in the array. For example, if you have a declaration like this,

    char pathname[256];
    

    SWIG generates functions for both getting and setting the value that are equivalent to the following code:

    char *pathname_get() {
      return pathname;
    }
    void pathname_set(char *value) {
      strncpy(pathname, value, 256);
    }
    

    In the target language, the value can be set like a normal variable.

    5.4.6 Creating read-only variables

    A read-only variable can be created by using the %immutable directive as shown :

    // File : interface.i
    
    int a;       // Can read/write
    %immutable;
    int b, c, d;   // Read only variables
    %mutable;
    double x, y;  // read/write
    

    The %immutable directive enables read-only mode until it is explicitly disabled using the %mutable directive. As an alternative to turning read-only mode off and on like this, individual declarations can also be tagged as immutable. For example:

    %immutable x;                   // Make x read-only
    ...
    double x;                       // Read-only (from earlier %immutable directive)
    double y;                       // Read-write
    ...
    

    The %mutable and %immutable directives are actually %feature directives defined like this:

    #define %immutable   %feature("immutable")
    #define %mutable     %feature("immutable", "")
    

    If you wanted to make all wrapped variables read-only, barring one or two, it might be easier to take this approach:

    %immutable;                     // Make all variables read-only
    %feature("immutable", "0") x;   // except, make x read/write
    ...
    double x;
    double y;
    double z;
    ...
    

    Read-only variables are also created when declarations are declared as const. For example:

    const int foo;               /* Read only variable */
    char * const version="1.0";  /* Read only variable */
    

    Compatibility note: Read-only access used to be controlled by a pair of directives %readonly and %readwrite. Although these directives still work, they generate a warning message. Simply change the directives to %immutable; and %mutable; to silence the warning. Don't forget the extra semicolon!

    5.4.7 Renaming and ignoring declarations

    5.4.7.1 Simple renaming of specific identifiers

    Normally, the name of a C declaration is used when that declaration is wrapped into the target language. However, this may generate a conflict with a keyword or already existing function in the scripting language. To resolve a name conflict, you can use the %rename directive as shown :

    // interface.i
    
    %rename(my_print) print;
    extern void print(const char *);
    
    %rename(foo) a_really_long_and_annoying_name;
    extern int a_really_long_and_annoying_name;
    
    

    SWIG still calls the correct C function, but in this case the function print() will really be called "my_print()" in the target language.

    The placement of the %rename directive is arbitrary as long as it appears before the declarations to be renamed. A common technique is to write code for wrapping a header file like this:

    // interface.i
    
    %rename(my_print) print;
    %rename(foo) a_really_long_and_annoying_name;
    
    %include "header.h"
    

    %rename applies a renaming operation to all future occurrences of a name. The renaming applies to functions, variables, class and structure names, member functions, and member data. For example, if you had two-dozen C++ classes, all with a member function named `print' (which is a keyword in Python), you could rename them all to `output' by specifying :

    %rename(output) print; // Rename all `print' functions to `output'
    

    SWIG does not normally perform any checks to see if the functions it wraps are already defined in the target scripting language. However, if you are careful about namespaces and your use of modules, you can usually avoid these problems.

    When wrapping C code, simple use of identifiers/symbols with %rename usually suffices. When wrapping C++ code, simple use of simple identifiers/symbols with %rename might be too limiting when using C++ features such as function overloading, default arguments, namespaces, template specialization etc. If you are using the %rename directive and C++, make sure you read the SWIG and C++ chapter and in particular the section on Renaming and ambiguity resolution for method overloading and default arguments.

    Closely related to %rename is the %ignore directive. %ignore instructs SWIG to ignore declarations that match a given identifier. For example:

    %ignore print;         // Ignore all declarations named print
    %ignore MYMACRO;       // Ignore a macro
    ...
    #define MYMACRO 123
    void print(const char *);
    ...
    

    Any function, variable etc which matches %ignore will not be wrapped and therefore will not be available from the target language. A common usage of %ignore is to selectively remove certain declarations from a header file without having to add conditional compilation to the header. However, it should be stressed that this only works for simple declarations. If you need to remove a whole section of problematic code, the SWIG preprocessor should be used instead.

    Compatibility note: Older versions of SWIG provided a special %name directive for renaming declarations. For example:

    %name(output) extern void print(const char *);
    

    This directive is still supported, but it is deprecated and should probably be avoided. The %rename directive is more powerful and better supports wrapping of raw header file information.

    5.4.7.2 Advanced renaming support

    While writing %rename for specific declarations is simple enough, sometimes the same renaming rule needs to be applied to many, maybe all, identifiers in the SWIG input. For example, it may be necessary to apply some transformation to all the names in the target language to better follow its naming conventions, like adding a specific prefix to all wrapped functions. Doing it individually for each function is impractical so SWIG supports applying a renaming rule to all declarations if the name of the identifier to be renamed is not specified:

    %rename("myprefix_%s") ""; // print -> myprefix_print
    

    This also shows that the argument of %rename doesn't have to be a literal string but can be a printf()-like format string. In the simplest form, "%s" is replaced with the name of the original declaration, as shown above. However this is not always enough and SWIG provides extensions to the usual format string syntax to allow applying a (SWIG-defined) function to the argument. For example, to wrap all C functions do_something_long() as more Java-like doSomethingLong() you can use the "lowercamelcase" extended format specifier like this:

    %rename("%(lowercamelcase)s") ""; // foo_bar -> fooBar; FooBar -> fooBar
    

    Some functions can be parametrized, for example the "strip" one strips the provided prefix from its argument. The prefix is specified as part of the format string, following a colon after the function name:

    %rename("%(strip:[wx])s") ""; // wxHello -> Hello; FooBar -> FooBar
    

    Below is the table summarizing all currently defined functions with an example of applying each one. Note that some of them have two names, a shorter one and a more descriptive one, but the two functions are otherwise equivalent:

    FunctionReturnsExample (in/out)
    uppercase or upper Upper case version of the string. PrintPRINT
    lowercase or lower Lower case version of the string. Printprint
    title String with first letter capitalized and the rest in lower case. printPrint
    firstuppercase String with the first letter capitalized and the rest unchanged. printItPrintIt
    firstlowercase String with the first letter in lower case and the rest unchanged. PrintItprintIt
    camelcase or ctitle String with capitalized first letter and any letter following an underscore (which are removed in the process) and rest in lower case. print_itPrintIt
    lowercamelcase or lctitle String with every letter following an underscore (which is removed in the process) capitalized and rest, including the first letter, in lower case. print_itprintIt
    undercase or utitle Lower case string with underscores inserted before every upper case letter in the original string and any number not at the end of string. Logically, this is the reverse of camelcase. PrintItprint_it
    schemify String with all underscores replaced with dashes, resulting in more Lispers/Schemers-pleasing name. print_itprint-it
    strip:[prefix] String without the given prefix or the original string if it doesn't start with this prefix. Note that square brackets should be used literally, e.g. %rename("strip:[wx]") wxPrintPrint
    rstrip:[suffix] String without the given suffix or the original string if it doesn't end with this suffix. Note that square brackets should be used literally, e.g. %rename("rstrip:[Cls]") PrintClsPrint
    regex:/pattern/subst/ String after (Perl-like) regex substitution operation. This function allows to apply arbitrary regular expressions to the identifier names. The pattern part is a regular expression in Perl syntax (as supported by the Perl Compatible Regular Expressions (PCRE)) library and the subst string can contain back-references of the form \N where N is a digit from 0 to 9, or one of the following escape sequences: \l, \L, \u, \U or \E. The back-references are replaced with the contents of the corresponding capture group while the escape sequences perform the case conversion in the substitution string: \l and \L convert to the lower case, while \u and \U convert to the upper case. The difference between the elements of each pair is that \l and \u change the case of the next character only, while \L and \U do it for all the remaining characters or until \E is encountered. Finally please notice that backslashes need to be escaped in C strings, so in practice "\\" must be used in all these escape sequences. For example, to remove any alphabetic prefix before an underscore and capitalize the remaining part you could use the following directive: %rename("regex:/(\\w+)_(.*)/\\u\\2/") prefix_printPrint
    command:cmd Output of an external command cmd with the string passed to it as input. Notice that this function is extremely slow compared to all the other ones as it involves spawning a separate process and using it for many declarations is not recommended. The cmd is not enclosed in square brackets but must be terminated with a triple '<' sign, e.g. %rename("command:tr -d aeiou <<<") (nonsensical example removing all vowels) PrintPrnt

    The most general function of all of the above ones (not counting command which is even more powerful in principle but which should generally be avoided because of performance considerations) is the regex one. Here are some more examples of its use:

    // Strip the wx prefix from all identifiers except those starting with wxEVT
    %rename("%(regex:/wx(?!EVT)(.*)/\\1/)s") ""; // wxSomeWidget -> SomeWidget
                                                 // wxEVT_PAINT -> wxEVT_PAINT
    
    // Apply a rule for renaming the enum elements to avoid the common prefixes
    // which are redundant in C#/Java
    %rename("%(regex:/^([A-Z][a-z]+)+_(.*)/\\2/)s", %$isenumitem) ""; // Colour_Red -> Red
    
    // Remove all "Set/Get" prefixes.
    %rename("%(regex:/^(Set|Get)(.*)/\\2/)s") ""; // SetValue -> Value
                                                  // GetValue -> Value
    

    As before, everything that was said above about %rename also applies to %ignore. In fact, the latter is just a special case of the former and ignoring an identifier is the same as renaming it to the special "$ignore" value. So the following snippets

    %ignore print;
    

    and

    %rename("$ignore") print;
    

    are exactly equivalent and %rename can be used to selectively ignore multiple declarations using the previously described matching possibilities.

    5.4.7.3 Limiting global renaming rules

    As explained in the previous sections, it is possible to either rename individual declarations or apply a rename rule to all of them at once. In practice, the latter is however rarely appropriate as there are always some exceptions to the general rules. To deal with them, the scope of an unnamed %rename can be limited using subsequent match parameters. They can be applied to any of the attributes associated by SWIG with the declarations appearing in its input. For example:

    %rename("foo", match$name="bar") "";
    

    can be used to achieve the same effect as the simpler

    %rename("foo") bar;
    

    and so is not very interesting on its own. However match can also be applied to the declaration type, for example match="class" restricts the match to class declarations only (in C++) and match="enumitem" restricts it to the enum elements. SWIG also provides convenience macros for such match expressions, for example

    %rename("%(title)s", %$isenumitem) "";
    

    will capitalize the names of all the enum elements but not change the case of the other declarations. Similarly, %$isclass, %$isfunction, %$isconstructor, %$isunion, %$istemplate, and %$isvariable can be used. Many other checks are possible and this documentation is not exhaustive, see the "%rename predicates" section in swig.swg for the full list of supported match expressions.

    In addition to literally matching some string with match you can also use regexmatch or notregexmatch to match a string against a regular expression. For example, to ignore all functions having "Old" as a suffix you could use

    %rename("$ignore", regexmatch$name="Old$") "";
    

    For simple cases like this, specifying the regular expression for the declaration name directly can be preferable and can also be done using regextarget:

    %rename("$ignore", regextarget=1) "Old$";
    

    Notice that the check is done only against the name of the declaration itself, if you need to match the full name of a C++ declaration you must use fullname attribute:

    %rename("$ignore", regextarget=1, fullname=1) "NameSpace::ClassName::.*Old$";
    

    As for notregexmatch, it restricts the match only to the strings not matching the specified regular expression. So to rename all declarations to lower case except those consisting of capital letters only:

    %rename("$(lower)s", notregexmatch$name="^[A-Z]+$") "";
    

    Finally, variants of %rename and %ignore directives can be used to help wrap C++ overloaded functions and methods or C++ methods which use default arguments. This is described in the Renaming and ambiguity resolution section in the C++ chapter.

    5.4.7.4 Ignoring everything then wrapping a few selected symbols

    Using the techniques described above it is possible to ignore everything in a header and then selectively wrap a few chosen methods or classes. For example, consider a header, myheader.h which has many classes in it and just the one class called Star is wanted within this header, the following approach could be taken:

    %ignore ""; // Ignore everything
    
    // Unignore chosen class 'Star'
    %rename("%s") Star;
    
    // As the ignore everything will include the constructor, destructor, methods etc
    // in the class, these have to be explicitly unignored too:
    %rename("%s") Star::Star;
    %rename("%s") Star::~Star;
    %rename("%s") Star::shine; // named method
    
    %include "myheader.h"
    

    Another approach which might be more suitable as it does not require naming all the methods in the chosen class is to begin by ignoring just the classes. This does not add an explicit ignore to any members of the class, so when the chosen class is unignored, all of its methods will be wrapped.

    %rename($ignore, %$isclass) ""; // Only ignore all classes
    %rename("%s") Star; // Unignore 'Star'
    %include "myheader.h"
    

    5.4.8 Default/optional arguments

    SWIG supports default arguments in both C and C++ code. For example:

    int plot(double x, double y, int color=WHITE);
    

    In this case, SWIG generates wrapper code where the default arguments are optional in the target language. For example, this function could be used in Tcl as follows :

    % plot -3.4 7.5    # Use default value
    % plot -3.4 7.5 10 # set color to 10 instead
    
    

    Although the ISO C standard does not allow default arguments, default arguments specified in a SWIG interface work with both C and C++.

    Note: There is a subtle semantic issue concerning the use of default arguments and the SWIG generated wrapper code. When default arguments are used in C code, the default values are emitted into the wrappers and the function is invoked with a full set of arguments. This is different to when wrapping C++ where an overloaded wrapper method is generated for each defaulted argument. Please refer to the section on default arguments in the C++ chapter for further details.

    5.4.9 Pointers to functions and callbacks

    Occasionally, a C library may include functions that expect to receive pointers to functions--possibly to serve as callbacks. SWIG provides full support for function pointers when the callback functions are defined in C and not in the target language. For example, consider a function like this:

    int binary_op(int a, int b, int (*op)(int, int));
    

    When you first wrap something like this into an extension module, you may find the function to be impossible to use. For instance, in Python:

    >>> def add(x, y):
    ...     return x+y
    ...
    >>> binary_op(3, 4, add)
    Traceback (most recent call last):
      File "<stdin>", line 1, in ?
    TypeError: Type error. Expected _p_f_int_int__int
    >>>
    

    The reason for this error is that SWIG doesn't know how to map a scripting language function into a C callback. However, existing C functions can be used as arguments provided you install them as constants. One way to do this is to use the %constant directive like this:

    /* Function with a callback */
    int binary_op(int a, int b, int (*op)(int, int));
    
    /* Some callback functions */
    %constant int add(int, int);
    %constant int sub(int, int);
    %constant int mul(int, int);
    

    In this case, add, sub, and mul become function pointer constants in the target scripting language. This allows you to use them as follows:

    >>> binary_op(3, 4, add)
    7
    >>> binary_op(3, 4, mul)
    12
    >>>
    

    Unfortunately, by declaring the callback functions as constants, they are no longer accessible as functions. For example:

    >>> add(3, 4)
    Traceback (most recent call last):
      File "<stdin>", line 1, in ?
    TypeError: object is not callable: '_ff020efc_p_f_int_int__int'
    >>>
    

    If you want to make a function available as both a callback function and a function, you can use the %callback and %nocallback directives like this:

    /* Function with a callback */
    int binary_op(int a, int b, int (*op)(int, int));
    
    /* Some callback functions */
    %callback("%s_cb");
    int add(int, int);
    int sub(int, int);
    int mul(int, int);
    %nocallback;
    

    The argument to %callback is a printf-style format string that specifies the naming convention for the callback constants (%s gets replaced by the function name). The callback mode remains in effect until it is explicitly disabled using %nocallback. When you do this, the interface now works as follows:

    >>> binary_op(3, 4, add_cb)
    7
    >>> binary_op(3, 4, mul_cb)
    12
    >>> add(3, 4)
    7
    >>> mul(3, 4)
    12
    

    Notice that when the function is used as a callback, special names such as add_cb are used instead. To call the function normally, just use the original function name such as add().

    SWIG provides a number of extensions to standard C printf formatting that may be useful in this context. For instance, the following variation installs the callbacks as all upper case constants such as ADD, SUB, and MUL:

    /* Some callback functions */
    %callback("%(uppercase)s");
    int add(int, int);
    int sub(int, int);
    int mul(int, int);
    %nocallback;
    

    A format string of "%(lowercase)s" converts all characters to lower case. A string of "%(title)s" capitalizes the first character and converts the rest to lower case.

    And now, a final note about function pointer support. Although SWIG does not normally allow callback functions to be written in the target language, this can be accomplished with the use of typemaps and other advanced SWIG features. See the Typemaps chapter for more about typemaps and individual target language chapters for more on callbacks. The 'director' feature can be used to make callbacks from C/C++ into the target language, see Callbacks to the target language.

    5.5 Structures and unions

    This section describes the behavior of SWIG when processing ISO C structures and union declarations. Extensions to handle C++ are described in the next section.

    If SWIG encounters the definition of a structure or union, it creates a set of accessor functions. Although SWIG does not need structure definitions to build an interface, providing definitions makes it possible to access structure members. The accessor functions generated by SWIG simply take a pointer to an object and allow access to an individual member. For example, the declaration :

    struct Vector {
      double x, y, z;
    }
    
    

    gets transformed into the following set of accessor functions :

    double Vector_x_get(struct Vector *obj) {
      return obj->x;
    }
    double Vector_y_get(struct Vector *obj) { 
      return obj->y;
    }
    double Vector_z_get(struct Vector *obj) { 
      return obj->z;
    }
    void Vector_x_set(struct Vector *obj, double value) {
      obj->x = value;
    }
    void Vector_y_set(struct Vector *obj, double value) {
      obj->y = value;
    }
    void Vector_z_set(struct Vector *obj, double value) {
      obj->z = value;
    }
    

    In addition, SWIG creates default constructor and destructor functions if none are defined in the interface. For example:

    struct Vector *new_Vector() {
      return (Vector *) calloc(1, sizeof(struct Vector));
    }
    void delete_Vector(struct Vector *obj) {
      free(obj);
    }
    

    Using these low-level accessor functions, an object can be minimally manipulated from the target language using code like this:

    v = new_Vector()
    Vector_x_set(v, 2)
    Vector_y_set(v, 10)
    Vector_z_set(v, -5)
    ...
    delete_Vector(v)
    

    However, most of SWIG's language modules also provide a high-level interface that is more convenient. Keep reading.

    5.5.1 Typedef and structures

    SWIG supports the following construct which is quite common in C programs :

    typedef struct {
      double x, y, z;
    } Vector;
    
    

    When encountered, SWIG assumes that the name of the object is `Vector' and creates accessor functions like before. The only difference is that the use of typedef allows SWIG to drop the struct keyword on its generated code. For example:

    double Vector_x_get(Vector *obj) {
      return obj->x;
    }
    

    If two different names are used like this :

    typedef struct vector_struct {
      double x, y, z;
    } Vector;
    
    

    the name Vector is used instead of vector_struct since this is more typical C programming style. If declarations defined later in the interface use the type struct vector_struct, SWIG knows that this is the same as Vector and it generates the appropriate type-checking code.

    5.5.2 Character strings and structures

    Structures involving character strings require some care. SWIG assumes that all members of type char * have been dynamically allocated using malloc() and that they are NULL-terminated ASCII strings. When such a member is modified, the previous contents will be released, and the new contents allocated. For example :

    %module mymodule
    ...
    struct Foo {
      char *name;
      ...
    }
    
    

    This results in the following accessor functions :

    char *Foo_name_get(Foo *obj) {
      return Foo->name;
    }
    
    char *Foo_name_set(Foo *obj, char *c) {
      if (obj->name)
        free(obj->name);
      obj->name = (char *) malloc(strlen(c)+1);
      strcpy(obj->name, c);
      return obj->name;
    }
    

    If this behavior differs from what you need in your applications, the SWIG "memberin" typemap can be used to change it. See the typemaps chapter for further details.

    Note: If the -c++ option is used, new and delete are used to perform memory allocation.

    5.5.3 Array members

    Arrays may appear as the members of structures, but they will be read-only. SWIG will write an accessor function that returns the pointer to the first element of the array, but will not write a function to change the contents of the array itself. When this situation is detected, SWIG may generate a warning message such as the following :

    interface.i:116. Warning. Array member will be read-only
    

    To eliminate the warning message, typemaps can be used, but this is discussed in a later chapter. In many cases, the warning message is harmless.

    5.5.4 Structure data members

    Occasionally, a structure will contain data members that are themselves structures. For example:

    typedef struct Foo {
      int x;
    } Foo;
    
    typedef struct Bar {
      int y;
      Foo f;           /* struct member */
    } Bar;
    

    When a structure member is wrapped, it is handled as a pointer, unless the %naturalvar directive is used where it is handled more like a C++ reference (see C++ Member data). The accessors to the member variable as a pointer are effectively wrapped as follows:

    Foo *Bar_f_get(Bar *b) {
      return &b->f;
    }
    void Bar_f_set(Bar *b, Foo *value) {
      b->f = *value;
    }
    

    The reasons for this are somewhat subtle but have to do with the problem of modifying and accessing data inside the data member. For example, suppose you wanted to modify the value of f.x of a Bar object like this:

    Bar *b;
    b->f.x = 37;
    

    Translating this assignment to function calls (as would be used inside the scripting language interface) results in the following code:

    Bar *b;
    Foo_x_set(Bar_f_get(b), 37);
    

    In this code, if the Bar_f_get() function were to return a Foo instead of a Foo *, then the resulting modification would be applied to a copy of f and not the data member f itself. Clearly that's not what you want!

    It should be noted that this transformation to pointers only occurs if SWIG knows that a data member is a structure or class. For instance, if you had a structure like this,

    struct Foo {
      WORD   w;
    };
    

    and nothing was known about WORD, then SWIG will generate more normal accessor functions like this:

    WORD Foo_w_get(Foo *f) {
      return f->w;
    }
    void Foo_w_set(FOO *f, WORD value) {
      f->w = value;
    }
    

    Compatibility Note: SWIG-1.3.11 and earlier releases transformed all non-primitive member datatypes to pointers. Starting in SWIG-1.3.12, this transformation only occurs if a datatype is known to be a structure, class, or union. This is unlikely to break existing code. However, if you need to tell SWIG that an undeclared datatype is really a struct, simply use a forward struct declaration such as "struct Foo;".

    5.5.5 C constructors and destructors

    When wrapping structures, it is generally useful to have a mechanism for creating and destroying objects. If you don't do anything, SWIG will automatically generate functions for creating and destroying objects using malloc() and free(). Note: the use of malloc() only applies when SWIG is used on C code (i.e., when the -c++ option is not supplied on the command line). C++ is handled differently.

    If you don't want SWIG to generate default constructors for your interfaces, you can use the %nodefaultctor directive or the -nodefaultctor command line option. For example:

    swig -nodefaultctor example.i 
    

    or

    %module foo
    ...
    %nodefaultctor;        // Don't create default constructors
    ... declarations ...
    %clearnodefaultctor;   // Re-enable default constructors
    

    If you need more precise control, %nodefaultctor can selectively target individual structure definitions. For example:

    %nodefaultctor Foo;      // No default constructor for Foo
    ...
    struct Foo {             // No default constructor generated.
    };
    
    struct Bar {             // Default constructor generated.
    };
    

    Since ignoring the implicit or default destructors most of the time produces memory leaks, SWIG will always try to generate them. If needed, however, you can selectively disable the generation of the default/implicit destructor by using %nodefaultdtor

    %nodefaultdtor Foo; // No default/implicit destructor for Foo
    ...
    struct Foo {              // No default destructor is generated.
    };
    
    struct Bar {              // Default destructor generated.
    };
    

    Compatibility note: Prior to SWIG-1.3.7, SWIG did not generate default constructors or destructors unless you explicitly turned them on using -make_default. However, it appears that most users want to have constructor and destructor functions so it has now been enabled as the default behavior.

    Note: There are also the -nodefault option and %nodefault directive, which disable both the default or implicit destructor generation. This could lead to memory leaks across the target languages, and it is highly recommended you don't use them.

    5.5.6 Adding member functions to C structures

    Most languages provide a mechanism for creating classes and supporting object oriented programming. From a C standpoint, object oriented programming really just boils down to the process of attaching functions to structures. These functions normally operate on an instance of the structure (or object). Although there is a natural mapping of C++ to such a scheme, there is no direct mechanism for utilizing it with C code. However, SWIG provides a special %extend directive that makes it possible to attach methods to C structures for purposes of building an object oriented interface. Suppose you have a C header file with the following declaration :

    /* file : vector.h */
    ...
    typedef struct Vector {
      double x, y, z;
    } Vector;
    
    

    You can make a Vector look a lot like a class by writing a SWIG interface like this:

    // file : vector.i
    %module mymodule
    %{
    #include "vector.h"
    %}
    
    %include "vector.h"          // Just grab original C header file
    %extend Vector {             // Attach these functions to struct Vector
      Vector(double x, double y, double z) {
        Vector *v;
        v = (Vector *) malloc(sizeof(Vector));
        v->x = x;
        v->y = y;
        v->z = z;
        return v;
      }
      ~Vector() {
        free($self);
      }
      double magnitude() {
        return sqrt($self->x*$self->x+$self->y*$self->y+$self->z*$self->z);
      }
      void print() {
        printf("Vector [%g, %g, %g]\n", $self->x, $self->y, $self->z);
      }
    };
    
    

    Note the usage of the $self special variable. Its usage is identical to a C++ 'this' pointer and should be used whenever access to the struct instance is required. Also note that C++ constructor and destructor syntax has been used to simulate a constructor and destructor, even for C code. There is one subtle difference to a normal C++ constructor implementation though and that is although the constructor declaration is as per a normal C++ constructor, the newly constructed object must be returned as if the constructor declaration had a return value, a Vector * in this case.

    Now, when used with proxy classes in Python, you can do things like this :

    >>> v = Vector(3, 4, 0)                 # Create a new vector
    >>> print v.magnitude()                # Print magnitude
    5.0
    >>> v.print()                  # Print it out
    [ 3, 4, 0 ]
    >>> del v                      # Destroy it
    

    The %extend directive can also be used inside the definition of the Vector structure. For example:

    // file : vector.i
    %module mymodule
    %{
    #include "vector.h"
    %}
    
    typedef struct Vector {
      double x, y, z;
      %extend {
        Vector(double x, double y, double z) { ... }
        ~Vector() { ... }
        ...
      }
    } Vector;
    

    Note that %extend can be used to access externally written functions provided they follow the naming convention used in this example :

    /* File : vector.c */
    /* Vector methods */
    #include "vector.h"
    Vector *new_Vector(double x, double y, double z) {
      Vector *v;
      v = (Vector *) malloc(sizeof(Vector));
      v->x = x;
      v->y = y;
      v->z = z;
      return v;
    }
    void delete_Vector(Vector *v) {
      free(v);
    }
    
    double Vector_magnitude(Vector *v) {
      return sqrt(v->x*v->x+v->y*v->y+v->z*v->z);
    }
    
    // File : vector.i
    // Interface file
    %module mymodule
    %{
    #include "vector.h"
    %}
    
    typedef struct Vector {
      double x, y, z;
      %extend {
        Vector(int, int, int); // This calls new_Vector()
        ~Vector();           // This calls delete_Vector()
        double magnitude();  // This will call Vector_magnitude()
        ...
      }
    } Vector;
    

    The name used for %extend should be the name of the struct and not the name of any typedef to the struct. For example:

    typedef struct Integer {
      int value;
    } Int;
    %extend Integer { ...  } /* Correct name */
    %extend Int { ...  } /* Incorrect name */
    
    struct Float {
      float value;
    };
    typedef struct Float FloatValue;
    %extend Float { ...  } /* Correct name */
    %extend FloatValue { ...  } /* Incorrect name */
    

    There is one exception to this rule and that is when the struct is anonymously named such as:

    typedef struct {
      double value;
    } Double;
    %extend Double { ...  } /* Okay */
    

    A little known feature of the %extend directive is that it can also be used to add synthesized attributes or to modify the behavior of existing data attributes. For example, suppose you wanted to make magnitude a read-only attribute of Vector instead of a method. To do this, you might write some code like this:

    // Add a new attribute to Vector
    %extend Vector {
      const double magnitude;
    }
    // Now supply the implementation of the Vector_magnitude_get function
    %{
    const double Vector_magnitude_get(Vector *v) {
      return (const double) sqrt(v->x*v->x+v->y*v->y+v->z*v->z);
    }
    %}
    
    

    Now, for all practical purposes, magnitude will appear like an attribute of the object.

    A similar technique can also be used to work with data members that you want to process. For example, consider this interface:

    typedef struct Person {
      char name[50];
      ...
    } Person;
    

    Say you wanted to ensure name was always upper case, you can rewrite the interface as follows to ensure this occurs whenever a name is read or written to:

    typedef struct Person {
      %extend {
        char name[50];
      }
      ...
    } Person;
    
    %{
    #include <string.h>
    #include <ctype.h>
    
    void make_upper(char *name) {
      char *c;
      for (c = name; *c; ++c)
        *c = (char)toupper((int)*c);
    }
    
    /* Specific implementation of set/get functions forcing capitalization */
    
    char *Person_name_get(Person *p) {
      make_upper(p->name);
      return p->name;
    }
    
    void Person_name_set(Person *p, char *val) {
      strncpy(p->name, val, 50);
      make_upper(p->name);
    }
    %}
    

    Finally, it should be stressed that even though %extend can be used to add new data members, these new members can not require the allocation of additional storage in the object (e.g., their values must be entirely synthesized from existing attributes of the structure or obtained elsewhere).

    Compatibility note: The %extend directive is a new name for the %addmethods directive. Since %addmethods could be used to extend a structure with more than just methods, a more suitable directive name has been chosen.

    5.5.7 Nested structures

    Occasionally, a C program will involve structures like this :

    typedef struct Object {
      int objtype;
      union {
        int ivalue;
        double dvalue;
        char *strvalue;
        void *ptrvalue;
      } intRep;
    } Object;
    
    

    When SWIG encounters this, it performs a structure splitting operation that transforms the declaration into the equivalent of the following:

    typedef union {
      int ivalue;
      double dvalue;
      char *strvalue;
      void *ptrvalue;
    } Object_intRep;
    
    typedef struct Object {
      int objType;
      Object_intRep intRep;
    } Object;
    
    

    SWIG will then create an Object_intRep structure for use inside the interface file. Accessor functions will be created for both structures. In this case, functions like this would be created :

    Object_intRep *Object_intRep_get(Object *o) {
      return (Object_intRep *) &o->intRep;
    }
    int Object_intRep_ivalue_get(Object_intRep *o) {
      return o->ivalue;
    }
    int Object_intRep_ivalue_set(Object_intRep *o, int value) {
      return (o->ivalue = value);
    }
    double Object_intRep_dvalue_get(Object_intRep *o) {
      return o->dvalue;
    }
    ... etc ...
    
    

    Although this process is a little hairy, it works like you would expect in the target scripting language--especially when proxy classes are used. For instance, in Perl:

    # Perl5 script for accessing nested member
    $o = CreateObject();                    # Create an object somehow
    $o->{intRep}->{ivalue} = 7              # Change value of o.intRep.ivalue
    

    If you have a lot of nested structure declarations, it is advisable to double-check them after running SWIG. Although, there is a good chance that they will work, you may have to modify the interface file in certain cases.

    Finally, note that nesting is handled differently in C++ mode, see Nested classes.

    5.5.8 Other things to note about structure wrapping

    SWIG doesn't care if the declaration of a structure in a .i file exactly matches that used in the underlying C code (except in the case of nested structures). For this reason, there are no problems omitting problematic members or simply omitting the structure definition altogether. If you are happy passing pointers around, this can be done without ever giving SWIG a structure definition.

    Starting with SWIG1.3, a number of improvements have been made to SWIG's code generator. Specifically, even though structure access has been described in terms of high-level accessor functions such as this,

    double Vector_x_get(Vector *v) {
      return v->x;
    }
    

    most of the generated code is actually inlined directly into wrapper functions. Therefore, no function Vector_x_get() actually exists in the generated wrapper file. For example, when creating a Tcl module, the following function is generated instead:

    static int
    _wrap_Vector_x_get(ClientData clientData, Tcl_Interp *interp, 
                       int objc, Tcl_Obj *CONST objv[]) {
      struct Vector *arg1 ;
      double result ;
    
      if (SWIG_GetArgs(interp, objc, objv, "p:Vector_x_get self ", &arg0,
                       SWIGTYPE_p_Vector) == TCL_ERROR)
        return TCL_ERROR;
      result = (double ) (arg1->x);
      Tcl_SetObjResult(interp, Tcl_NewDoubleObj((double) result));
      return TCL_OK;
    }
    

    The only exception to this rule are methods defined with %extend. In this case, the added code is contained in a separate function.

    Finally, it is important to note that most language modules may choose to build a more advanced interface. Although you may never use the low-level interface described here, most of SWIG's language modules use it in some way or another.

    5.6 Code Insertion

    Sometimes it is necessary to insert special code into the resulting wrapper file generated by SWIG. For example, you may want to include additional C code to perform initialization or other operations. There are four common ways to insert code, but it's useful to know how the output of SWIG is structured first.

    5.6.1 The output of SWIG

    When SWIG creates its output C/C++ file, it is broken up into five sections corresponding to runtime code, headers, wrapper functions, and module initialization code (in that order).

    • Begin section.
      A placeholder for users to put code at the beginning of the C/C++ wrapper file. This is most often used to define preprocessor macros that are used in later sections.
    • Runtime code.
      This code is internal to SWIG and is used to include type-checking and other support functions that are used by the rest of the module.
    • Header section.
      This is user-defined support code that has been included by the %{ ... %} directive. Usually this consists of header files and other helper functions.
    • Wrapper code.
      These are the wrappers generated automatically by SWIG.
    • Module initialization.
      The function generated by SWIG to initialize the module upon loading.

    5.6.2 Code insertion blocks

    The %insert directive enables inserting blocks of code into a given section of the generated code. It can be used in one of two ways:

    %insert("section") "filename"
    %insert("section") %{ ... %}
    

    The first will dump the contents of the file in the given filename into the named section. The second inserts the code between the braces into the named section. For example, the following adds code into the runtime section:

    %insert("runtime") %{
      ... code in runtime section ...
    %}
    

    There are the 5 sections, however, some target languages add in additional sections and some of these result in code being generated into a target language file instead of the C/C++ wrapper file. These are documented when available in the target language chapters. Macros named after the code sections are available as additional directives and these macro directives are normally used instead of %insert. For example, %runtime is used instead of %insert("runtime"). The valid sections and order of the sections in the generated C/C++ wrapper file is as shown:

    %begin %{
      ... code in begin section ...
    %}
    
    %runtime %{
      ... code in runtime section ...
    %}
    
    %header %{
      ... code in header section ...
    %}
    
    %wrapper %{
      ... code in wrapper section ...
    %}
    
    %init %{
      ... code in init section ...
    %}
    

    The bare %{ ... %} directive is a shortcut that is the same as %header %{ ... %}.

    The %begin section is effectively empty as it just contains the SWIG banner by default. This section is provided as a way for users to insert code at the top of the wrapper file before any other code is generated. Everything in a code insertion block is copied verbatim into the output file and is not parsed by SWIG. Most SWIG input files have at least one such block to include header files and support C code. Additional code blocks may be placed anywhere in a SWIG file as needed.

    %module mymodule
    %{
    #include "my_header.h"
    %}
    ... Declare functions here
    %{
    
    void some_extra_function() {
      ...
    }
    %}
    

    A common use for code blocks is to write "helper" functions. These are functions that are used specifically for the purpose of building an interface, but which are generally not visible to the normal C program. For example :

    %{
    /* Create a new vector */
    static Vector *new_Vector() {
      return (Vector *) malloc(sizeof(Vector));
    }
    
    %}
    // Now wrap it 
    Vector *new_Vector();
    

    5.6.3 Inlined code blocks

    Since the process of writing helper functions is fairly common, there is a special inlined form of code block that is used as follows :

    %inline %{
    /* Create a new vector */
    Vector *new_Vector() {
      return (Vector *) malloc(sizeof(Vector));
    }
    %}
    

    This is the same as writing:

    %{
    /* Create a new vector */
    Vector *new_Vector() {
      return (Vector *) malloc(sizeof(Vector));
    }
    %}
    
    /* Create a new vector */
    Vector *new_Vector() {
      return (Vector *) malloc(sizeof(Vector));
    }
    

    In other words, the %inline directive inserts all of the code that follows verbatim into the header portion of an interface file. The code is then parsed by both the SWIG preprocessor and parser. Thus, the above example creates a new command new_Vector using only one declaration. Since the code inside an %inline %{ ... %} block is given to both the C compiler and SWIG, it is illegal to include any SWIG directives inside a %{ ... %} block.

    Note: The usual SWIG C preprocessor rules apply to code in %apply blocks when SWIG parses this code. For example, as mentioned earlier, SWIG's C Preprocessor does not follow #include directives by default.

    5.6.4 Initialization blocks

    When code is included in the %init section, it is copied directly into the module initialization function. For example, if you needed to perform some extra initialization on module loading, you could write this:

    %init %{
      init_variables();
    %}
    

    Please note that some language backends (e.g. C# or Java) don't have any initialization function, hence you should define a global object performing the necessary initialization for them instead:

    %init %{
      static struct MyInit { MyInit() { init_variables(); } } myInit;
    %}
    

    5.7 An Interface Building Strategy

    This section describes the general approach for building interfaces with SWIG. The specifics related to a particular scripting language are found in later chapters.

    5.7.1 Preparing a C program for SWIG

    SWIG doesn't require modifications to your C code, but if you feed it a collection of raw C header files or source code, the results might not be what you expect---in fact, they might be awful. Here's a series of steps you can follow to make an interface for a C program :

    • Identify the functions that you want to wrap. It's probably not necessary to access every single function of a C program--thus, a little forethought can dramatically simplify the resulting scripting language interface. C header files are a particularly good source for finding things to wrap.
    • Create a new interface file to describe the scripting language interface to your program.
    • Copy the appropriate declarations into the interface file or use SWIG's %include directive to process an entire C source/header file.
    • Make sure everything in the interface file uses ISO C/C++ syntax.
    • Make sure all necessary `typedef' declarations and type-information is available in the interface file. In particular, ensure that the type information is specified in the correct order as required by a C/C++ compiler. Most importantly, define a type before it is used! A C compiler will tell you if the full type information is not available if it is needed, whereas SWIG will usually not warn or error out as it is designed to work without full type information. However, if type information is not specified correctly, the wrappers can be sub-optimal and even result in uncompilable C/C++ code.
    • If your program has a main() function, you may need to rename it (read on).
    • Run SWIG and compile.

    Although this may sound complicated, the process turns out to be fairly easy once you get the hang of it.

    In the process of building an interface, SWIG may encounter syntax errors or other problems. The best way to deal with this is to simply copy the offending code into a separate interface file and edit it. However, the SWIG developers have worked very hard to improve the SWIG parser--you should report parsing errors to the swig-devel mailing list or to the SWIG bug tracker.

    5.7.2 The SWIG interface file

    The preferred method of using SWIG is to generate a separate interface file. Suppose you have the following C header file :

    /* File : header.h */
    
    #include <stdio.h>
    #include <math.h>
    
    extern int foo(double);
    extern double bar(int, int);
    extern void dump(FILE *f);
    
    

    A typical SWIG interface file for this header file would look like the following :

    /* File : interface.i */
    %module mymodule
    %{
    #include "header.h"
    %}
    extern int foo(double);
    extern double bar(int, int);
    extern void dump(FILE *f);
    
    

    Of course, in this case, our header file is pretty simple so we could use a simpler approach and use an interface file like this:

    /* File : interface.i */
    %module mymodule
    %{
    #include "header.h"
    %}
    %include "header.h"
    

    The main advantage of this approach is minimal maintenance of an interface file for when the header file changes in the future. In more complex projects, an interface file containing numerous %include and #include statements like this is one of the most common approaches to interface file design due to lower maintenance overhead.

    5.7.3 Why use separate interface files?

    Although SWIG can parse many header files, it is more common to write a special .i file defining the interface to a package. There are several reasons why you might want to do this:

    • It is rarely necessary to access every single function in a large package. Many C functions might have little or no use in a scripted environment. Therefore, why wrap them?
    • Separate interface files provide an opportunity to provide more precise rules about how an interface is to be constructed.
    • Interface files can provide more structure and organization.
    • SWIG can't parse certain definitions that appear in header files. Having a separate file allows you to eliminate or work around these problems.
    • Interface files provide a more precise definition of what the interface is. Users wanting to extend the system can go to the interface file and immediately see what is available without having to dig it out of header files.

    5.7.4 Getting the right header files

    Sometimes, it is necessary to use certain header files in order for the code generated by SWIG to compile properly. Make sure you include certain header files by using a %{ %} block like this:

    %module graphics
    %{
    #include <GL/gl.h>
    #include <GL/glu.h>
    %}
    
    // Put the rest of the declarations here
    ...
    

    5.7.5 What to do with main()

    If your program defines a main() function, you may need to get rid of it or rename it in order to use a scripting language. Most scripting languages define their own main() procedure that is called instead. main() also makes no sense when working with dynamic loading. There are a few approaches to solving the main() conflict :

    • Get rid of main() entirely.
    • Rename main() to something else. You can do this by compiling your C program with an option like -Dmain=oldmain.
    • Use conditional compilation to only include main() when not using a scripting language.

    Getting rid of main() may cause potential initialization problems of a program. To handle this problem, you may consider writing a special function called program_init() that initializes your program upon startup. This function could then be called either from the scripting language as the first operation, or when the SWIG generated module is loaded.

    As a general note, many C programs only use the main() function to parse command line options and to set parameters. However, by using a scripting language, you are probably trying to create a program that is more interactive. In many cases, the old main() program can be completely replaced by a Perl, Python, or Tcl script.

    Note: In some cases, you might be inclined to create a scripting language wrapper for main(). If you do this, the compilation will probably work and your module might even load correctly. The only trouble is that when you call your main() wrapper, you will find that it actually invokes the main() of the scripting language interpreter itself! This behavior is a side effect of the symbol binding mechanism used in the dynamic linker. The bottom line: don't do this.

    swig-4.0.1/Doc/Manual/SWIGDocumentation.pdf0000644000175000017500002211515213527234071020300 0ustar williamwilliam%PDF-1.4 1 0 obj << /Title (þÿSWIG-4.0 Documentation) /Creator (þÿwkhtmltopdf 0.12.5) /Producer (þÿQt 4.8.7) /CreationDate (D:20190821132524+01'00') >> endobj 3 0 obj << /Type /ExtGState /SA true /SM 0.02 /ca 1.0 /CA 1.0 /AIS false /SMask /None>> endobj 4 0 obj [/Pattern /DeviceRGB] endobj 6 0 obj << /Type /XObject /Subtype /Image /Width 167 /Height 85 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 7 0 R /Filter /FlateDecode >> stream xœí?hWׯË)Ö00… ¸pcH#ìÊMЍPT7®Ò5†HÔ ÁàJÀ*W5UÁ0¤ ¸ PBã"ìûûæùöpæœ;£u,íÈÖžbÍÎܹ÷>ç<çϽ³šN—²”¥,e)‹–;wî|ùå—_}õÕØ}YÊyÉñññƒnß¾}óæÍ3¹víÚõë×ÇîÚRÎRö÷÷ïß¿ÐÂ÷‹/¾Ð§èswwwìž.å£D¼nf¢cûäÛµµµ±{½”–íííG}óÍ7P7t}­•«W¯z¬N†c]†g{K9]^¿~ ÊE_o%uº®óI®÷±´”²¼|ù ¡î[·n hc@Ÿ}èëöW¯^=¾¥ü¿¼}ûöÙ³gwïÞÊÞ–Žög¶tA<™L8à³hòÆØc½ÔrxxHnEúl¼-=?o×­p½€6Äñ¿keeeìq_:yþü9¶¦[(ãgû ökÇSn>ð×É=—BÈ­îÝ»§x±ÉZ>ºÏxýÁ•+WŠˆÏë^{âÞÞÞØSòy ýí·ß®®®Z6ÀÕv`æ¬Ø«Apܼ½?éU%X=‰ÀØÓóùQ7@r hfêžÇGÏÃÒWUe¦õǺÌ.ÎAݲû‘²½½­R‰•łΡWÑ–3‡Yºø©¡LŠ*ái„kÆž¶OOlÝʨ»/{ @gî |n‰ZÈ S;ðŸÃZ!mmm=‹Ÿ€DcѺˆrŸ-x¸Ì02…lÕJ w#ü ý•VÔ‚®4í²ž,—Y‹òîÝ;Ì!T¹ûPî×su°>á¾õ ÷·x>÷-ø6íÛà÷ÕÉ¥[7yûö­–3Ì¢3Й«Í]fêgLf†á+™¶§qÃKº—ûP»ø-hN¸¬žùþùgìùMNNN¬ÐíëŸÅ"vp—è@Ô‹`¶vÞSwø4ãåAèáÆÆqão¿ývttDJøÃ?ÀÒÊã²[ fjc<¿¹¹9öÜ/T~ÿýw|ôýû÷uûúg®p3ôáOÅÏEWëq Ÿ¦žÌÕ8Ý#|ñâEq,èCÀºïÏÚù KâÖŸ>} u¯¬¬øZ·£½iÖ)Ö äìƒÁú ÔÎíÛ·íJ±{·3BüÔ¡¡½A }™.óRóùfëР8Ð,Ú/S^m¥èµ³ý§¨t>" ¾¶¶¬¾Nî;X:ýÌöG=|øðÉ“'ýõ—„ö›¶(g~$8—¢±/s”÷ïß4“¬`,-‡÷¥]~Òø9 –½³·ßŒiŽÖ|;ºE…½mh?þø#.‰OøàÁƒ¯¿þ/OðÉWœ©»1üpæ.ÜQ•ñ€úXùù矵tåw(*kf;Ftl{‡2ÖuJ¥ÃìõYq>¼î –Š-vž>{3k¬'æîÕÕÕ{÷î¡ëëë>œøô<¯‘ÒΈ¨ýÙßßG½-ÄÁ¨ýö°,Û(½qyP°GÐwÞÛ²7doøùÓ²nKg˜³»Ý ŠM@â ¸µ"Ï$ðgà–"ô«Ç~n I¯ü®3jƒÕ"poà>&Û€iTݨ,ã•A ül¬BoÑY£ƒ1F‹Ø·¶¶°qÎ4©ÖÇpì|ÕõÝ![7Ðý½$€£BZ–ããc€Ví¶ B0¸i³ë`àö§EkMªŽfú5ë.ZtQÔàãÇ_¿~1òÜ¢™I@6ˆQË_¿|ù3‡Þid⊱MÚYQôJ6.m°i\ªŽ|÷Ýwc#üBPjõOruûõnzxgBƺqÏÉöY=ÝCcÑ¿ÿþ‹÷ÔSú€öj¦§3^ÅçD,»»»ð[ˆÄ4'èþ´NÑÏÝÔÛ0ÀÚEïͨ»§¹Z¨–iû%iíáΰÿôƒõyw“ªjU7eö¬;€uøVN™ Kä€>g¸C²æOrûÉÉ ÷þòË/X:aªõŠ>“b|ø™hŸ9 fÞÉkf 4#‚ýTèÖûVÞ–=¸ñ©Ûɸá3èù@É¥*•F‹ÊЧ\ƒ14Ì|Ú¦T{”û‚@‰F-¢ÀÀgýÄ´ŽŽú&vss3ã>5WÂ}1ˬäV»Ö•LÔkï”û Ù3ùÀ•Þ3ÖN,CÆè™Ág^}Âé­€ÛÙÙÁ6‹Ôѧ3<èÙ³gÓvˆ(¡óÌÆpÙógb‡Kñ=e1‰Šê}´Áê?û{Ç&q»¿Ò{´IÚYjSáç'„CtàðAx¢.¦í|j¤ö™Œ¡êM›Ue>/>[ÊF‡×ÖÊß!Ib4Š+™U]LÌ-x÷# Æ.7´Ð‰-w.úhoÝEXÚŽÍû‡¯2«7]W¢37pm)¸ÛLö™ªœ2ÁOÛXÐi$]´wëªáâà®Ç5mz¾¾¾Nƒœn|Ç­‹QBˆSÞ|: Xf¥W¾`2wœQž¸e/»qX1ôëóx3gJÍB¶P÷@UÇM»¨(ӫħ:Ó™¦]NÕ¿ÿþû'OžàMàä;­@>4‹Kïïÿè^Õ¥÷`ï$Åç :Âp†áú? ¦|×Þ¢ ÓsâžáÃSúÓO?MÛ7 ™g&¹ô˺] ¯ ·›”w¼½3?ø™ <õFzu&Ó2Je: è™Ï‹Ì¦ å€A"¶$Àêñõš,Ý&¡î:‚ wøD`E¦KEG~(WÊþ{÷«gVC%ãÈ¥i²# 7¿àQ.ÞXÍb9[W…ÃñÝ4èMØFÄ(ÀZWr S¶âÐ<¥œ«ÞôYzÓeu‚1¯*M—±çióùóçꌰð1|Õ­g2Õr ºnç–Scx¾’êå´,‚[ŸtWßÂɺ-Æê¡0<1&™QS÷P ]‰rúË*W‡ïóìð¿RËs&< L»éÖÊ2ôÙ~­<µÞ $¬¢tq.†¨ÕUÕ»2û逮Št=÷2±M7–+ÆðRlŽèa¾¬O4:%nè ¶ î´`“¦5&\™¹@‡‹Lo‹«xÙØ°Ìúþý{{«+Cß”¼pæg»EDýæÍ›ð”ƒƒ(%k—4Äœ V-›Tš3iZþ´H 24ЫR ï73¨®(ƒ+¤]UÊÖHÞÂrÕß~ýõWz¢B_1 Î|ê¢8•ú=ŸÐU·¾äYq1ÙºV}ÁF0=¯Œ]áqŸ0Õy¹Y¨ –àÆ\Ü65@·Õm&Ü–?lÖb9|úôé´]!U06)¥êÅF4F¸]÷?ÿü“’,2'£è¿HåèÝ×á/f™•á÷9\oõÁî‚zä®â80[½’ããc±Jˆ÷üö3èQ;Žì‰š €XL,]ÞÙfquUnÛ§í†LÔÃÚpçUö$f×Aè¡ê½9xSS! $Ÿ©òÌess3Ó»÷æ“n”³v…Êik­k­(âÂ*‹L‡¯?~ìUÅ>½·…6¹X‹|ËyÓ¾¢YÜ„Nã¾.—éÝ[ºžk­½ÖÞÒû¬Þ šC—†×¾¸6NÜÚÇפc_‘Ðü̳ó#¦²íLÙ„3Ûî­]d ¬Læîî.ÀáÔ´ÏcwpôÜ^w£€³~±7iÁ7J–moø‚> +$ ð]n]‹ãÚÛVw³¼c·©¨ñ¼½[â¦NYƒÔ¥Ý5‹Yf•±dŸX½½qæ´Uò½½=½® GŽrðÀþq|k)*1<àj[N؃ !ˆL!_iÅ;w¯š[ÁƒäÖÍyè>Qƒ«ƒþ(§à…d2ÏÊÁ›‡¯¼W]èô?{`õ¢™[1ði»…‘bãÊÑlG(Q.5´c>B|6óº”ÂË!ž«¨†c¹´u¸vÙG3{1‡–®â,lKUØéÛ©Ý‹œfì1ˆcì¾¹`ÚtŇ¢h$£ì7EÕÓzeì¡x`ÙâŸþd¶_‰‡~ 5¯¥ÁØP}ôè‘ÿõ³àbügX®g»GÔönïŒcÜj…ûÕŽ`éfì€bÑ>à¢DÈÿý·çHÓ¿§mqLk9.N¸Ü:½¢Ái[„W<0§ÌCâ]‰×_p¶¹]@âvtt$ŸëÍ<¸ò*í7°|ؤÜ1UÌ_« fä³$4Æðöîw˜cÑô +†Ò‰ ¯µ¿§JS/^¼Põ{ÚsT~/Fqa¶%Ú< \³xàcÐìkaødvîÞ§/Æ­[¥´)Õgªn-Ñ›¼\@øÖ@Gµ /ÊjÑÅÖ¾Wô«ñ¹`M€DÜEÌ:«««0p,É¡ÈT!¯Þس‡µ²mÒT‘ÞÏCB¾æ»——–„ÍyƒnËmq}0óÊù÷•Væü9k,—+17kГ†Êéºô9å}wïÞåóøøx§•i«?¶æ’g8Û”¤nsL•OœopÃgŠ’£‹Êñ|16Æ.À­£üÞÒ±{Ü«v6mÅcÜØØ8<<~$usenß|®®$,eHÉ )ÌßšâX¥ûföÎ`6íPˆLæì#%gú6‡k 5¯å2ç'Vɉ•‡Ø&Ê®Ìö C³('Ðë]6h­M% #R•2¨ºJZi¨UÐ~u|: ûŸT%`è>F “Ü·ŒòP›ó‚Ðo&!¶ð•QܼyS³‰)!]€h…ô*¨bÆ=Ø)=§ÛWz×ÏËI%ÔzÆ«‚F°;}Jat¥ÒUí—àítâOº8ªêšR ô3zžkL ƒi׳•A1-¿S>²x±W±rE.s{ŽÌ)k,(°t©¯:¼üõÉɉ¶³6n³=H‚mEè4‹þuÓ²l9(eópvg"9_ȉ­€fhŒd fÑ×îM«lã9’ø9·8\¬e¢ÁZFƶ¯ø–'³e5•\¬cäæ\‰0Qð÷ÚïЦ~ôcN\úÔ`~õ¸2'³boÆŽfBwôÿ¢½¨¨­SÖ[}ÎÐsùKq¸¯éÙ¨µ»°ŒáŶ¸Ò@½Þn+w Øôs¾Øˆ¨ƒ¨žx^kµ§‚b¹á©WÎSŽ«ºŽ;Çc,T;]‹îhã¤HïÁOù)åLEKÕ>ÕÞ¨^uo&3*ÔX ¾ÝeÛ¢ðwÚ‰¤”´ÙÉ:9ÏÙYI(¢†3|H?™É\¦¸˜¢­SÁ†îKÐÜ ƒI«IÆÁhDãh‚~zKâ@o©xÕ2E²t€k s•hÐ{÷P+8áõ–SážS² …,À»i0 _ºoOÅmƒÏ¹›?«n_¹è]à¶´}Èo"òš¯ŒÛ‹¦*píÝ:¾‡&T·BÕ}N)>º¯?FÝX4z¨%ÅOh/¶uª˜ª‡@Î;ô:½ŠÕçȘ.®äAú}€œ[ù¤Àûˆ9k)óØø@fm´veökZëeôÞÞÞg´ˆ7ÄrÁ­PüŸ2áöIÙ@P5¯B!V´“á ¬y –ó$o“ Ór§6´ ³ŠÀ¥Hþöº[Ì?ë¢IÛJ¡,¦[ïÄ]ÀjÉ(^¹8cŸÙºýlÛW6½kÇŠ0U—7ÖÙ‰„'zGŒÚkiíV4r«Ð}‘«%£VYLÙÜŽ`hþ«œU¢ð&Ÿý{P`à™·ƒE+ä†j¹?•jÉ(Âäh¹mâ^W ±J¡o íª¡YZí/+ƇáÛ¾63ܲhåV–D_æßÏÿPцÏÚ|¶ž!¶ó9- ¥¶*Qth$/WyÈÔ­ÂÔMRЗ*ä>[Ñr[ÑÌ:}“%­I©Œï£XðÁ˜m/Q}iCî³ýþ’É$-·¸‹n:Ä{™%|Sk´ Éûô:óç]-Eˆo›ôþZÕõ¿ž±ûl<`Ê*yó[©ðNö§ÖFÜ[rIäÍ›7á‡÷Mú²õŒ¯g€`¼boÎÍlËj;K ,ú=Û\Þ¶JQÜÄÕëÌG‡Þ¢·[L@/“è±Ä»›´#:ZÁ‰{¬ÃeÕ?õò>Iôè‹ !– –î£/û¯|xV\‰þ­’¥,^H…¼[Ÿ¤ÿlXu“è>ê&å×{ÜÚ[²,‹]dÿD¾:WdûD«ZòðáÃeµäÓ[yñ ߤŸ Ð7nÜÀA[Ylì¾/å?ŠvD7Ýÿ›f¿ƒ*s&ä&‰ÞÙÙYæVŸ‡ºÿ[~«˜Ö­–!÷ç'¤ÌöŽ!÷ÖÖÖ2» ¢½ŒÄ–²” +ÿ­/›Ä endstream endobj 7 0 obj 5043 endobj 10 0 obj [0 /XYZ 31.5000000 743.750000 0] endobj 11 0 obj [0 /XYZ 28.5000000 785 0] endobj 12 0 obj [0 /XYZ 31.5000000 703.250000 0] endobj 13 0 obj [0 /XYZ 28.5000000 785 0] endobj 14 0 obj [0 /XYZ 246 703.250000 0] endobj 15 0 obj [0 /XYZ 28.5000000 785 0] endobj 16 0 obj [0 /XYZ 28.5000000 785 0] endobj 17 0 obj [0 /XYZ 28.5000000 785 0] endobj 18 0 obj [0 /XYZ 28.5000000 785 0] endobj 19 0 obj [0 /XYZ 28.5000000 785 0] endobj 20 0 obj [0 /XYZ 28.5000000 785 0] endobj 21 0 obj [0 /XYZ 28.5000000 785 0] endobj 22 0 obj [0 /XYZ 28.5000000 785 0] endobj 23 0 obj [0 /XYZ 28.5000000 785 0] endobj 24 0 obj [0 /XYZ 28.5000000 785 0] endobj 25 0 obj [0 /XYZ 28.5000000 785 0] endobj 26 0 obj << /Type /Annot /Subtype /Link /Rect [28.5000000 785 28.5000000 785 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CONTENTS >> endobj 27 0 obj << /Type /Annot /Subtype /Link /Rect [31.5000000 660.500000 102.750000 667.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Sections >> endobj 28 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 647.750000 81 654.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Sections_Sections >> endobj 29 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 640.250000 158.250000 647 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Sections_core_docs >> endobj 30 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 633.500000 207.750000 640.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Sections_language_modules >> endobj 31 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 626 215.250000 632.750000 ] /Border [0 0 0] /Dest /ti#c9#80#dcwe#ef#0a#d3#ads#23M5#d9#f4XG#09 >> endobj 32 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 619.250000 154.500000 626 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Sections_developers_docs >> endobj 33 0 obj << /Type /Annot /Subtype /Link /Rect [31.5000000 605.750000 57.7500000 612.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Preface >> endobj 34 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 593 99.7500000 599.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Preface_nn2 >> endobj 35 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 585.500000 108.750000 592.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Preface_nn4 >> endobj 36 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 578.750000 106.500000 585.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Preface_license >> endobj 37 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 571.250000 111.750000 578 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Preface_nn5 >> endobj 38 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 564.500000 102.750000 571.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Preface_nn6 >> endobj 39 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 557 140.250000 563.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Preface_nn7 >> endobj 40 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 550.250000 154.500000 557 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Preface_nn8 >> endobj 41 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 542.750000 132 549.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Preface_nn9 >> endobj 42 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 536 106.500000 542.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Preface_release_notes >> endobj 43 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 528.500000 90.7500000 535.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Preface_nn10 >> endobj 44 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 521.750000 102 528.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Preface_nn11 >> endobj 45 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 514.250000 99.7500000 521 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Preface_installation >> endobj 46 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 507.500000 157.500000 514.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Preface_windows_installation >> endobj 47 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 500 145.500000 506.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Preface_unix_installation >> endobj 48 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 493.250000 177 500 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Preface_osx_installation >> endobj 49 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 485.750000 123 492.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Preface_testing >> endobj 50 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 479 129.750000 485.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Preface_examples >> endobj 51 0 obj << /Type /Annot /Subtype /Link /Rect [31.5000000 465.500000 71.2500000 472.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Introduction >> endobj 52 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 452.750000 108.750000 459.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Introduction_nn2 >> endobj 53 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 445.250000 112.500000 452 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Introduction_nn3 >> endobj 54 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 438.500000 114.750000 445.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Introduction_target_languages >> endobj 55 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 431 145.500000 437.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Introduction_supported_status >> endobj 56 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 424.250000 153 431 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Introduction_experimental_status >> endobj 57 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 416.750000 114 423.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Introduction_nn4 >> endobj 58 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 410 150 416.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Introduction_nn5 >> endobj 59 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 402.500000 152.250000 409.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Introduction_nn6 >> endobj 60 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 395.750000 162.750000 402.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Introduction_nn7 >> endobj 61 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 388.250000 168 395 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Introduction_nn8 >> endobj 62 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 381.500000 126 388.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Introduction_nn9 >> endobj 63 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 374 164.250000 380.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Introduction_nn10 >> endobj 64 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 367.250000 150 374 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Introduction_nn11 >> endobj 65 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 359.750000 172.500000 366.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Introduction_build_system >> endobj 66 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 353 138 359.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Introduction_nn12 >> endobj 67 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 345.500000 119.250000 352.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Introduction_nn13 >> endobj 68 0 obj << /Type /Annot /Subtype /Link /Rect [31.5000000 332.750000 115.500000 339.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows >> endobj 69 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 319.250000 130.500000 326 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_installation >> endobj 70 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 312.500000 156 319.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_executable >> endobj 71 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 305 138 311.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_examples >> endobj 72 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 298.250000 243 305 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_visual_studio >> endobj 73 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 290.750000 139.500000 297.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_csharp >> endobj 74 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 284 144.750000 290.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_java >> endobj 75 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 276.500000 142.500000 283.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_perl >> endobj 76 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 269.750000 150.750000 276.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_python >> endobj 77 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 262.250000 143.250000 269 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_tcl >> endobj 78 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 255.500000 136.500000 262.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_r >> endobj 79 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 248 146.250000 254.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_ruby >> endobj 80 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 241.250000 249 248 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_other_compilers >> endobj 81 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 233.750000 146.250000 240.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_cygwin_mingw >> endobj 82 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 227 180.750000 233.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_swig_exe >> endobj 83 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 219.500000 246.750000 226.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_mingw_msys >> endobj 84 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 212.750000 215.250000 219.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_cygwin >> endobj 85 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 205.250000 210.750000 212 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_building_alternatives >> endobj 86 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 198.500000 231.750000 205.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_examples_cygwin >> endobj 87 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 191 193.500000 197.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_interface_file >> endobj 88 0 obj << /Type /Annot /Subtype /Link /Rect [31.5000000 178.250000 95.2500000 185 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scripting >> endobj 89 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 164.750000 161.250000 171.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scripting_nn2 >> endobj 90 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 158 177 164.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scripting_nn3 >> endobj 91 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 150.500000 148.500000 157.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scripting_nn4 >> endobj 92 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 143.750000 141 150.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scripting_nn5 >> endobj 93 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 136.250000 127.500000 143 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scripting_nn6 >> endobj 94 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 129.500000 160.500000 136.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scripting_nn7 >> endobj 95 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 122 137.250000 128.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scripting_nn8 >> endobj 96 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 115.250000 169.500000 122 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scripting_nn9 >> endobj 97 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 107.750000 198.750000 114.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scripting_nn10 >> endobj 98 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 101 174 107.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scripting_nn11 >> endobj 99 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 93.5000000 133.500000 100.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scripting_nn12 >> endobj 100 0 obj << /Type /Annot /Subtype /Link /Rect [31.5000000 80.7500000 73.5000000 87.5000000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG >> endobj 101 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 67.2500000 108 74 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn2 >> endobj 102 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 60.5000000 132 67.2500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn3 >> endobj 5 0 obj << /Type /Page /Parent 2 0 R /Contents 103 0 R /Resources 105 0 R /Annots 106 0 R /MediaBox [0 0 595 842] >> endobj 105 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F8 8 0 R /F9 9 0 R >> /XObject << /Im6 6 0 R >> >> endobj 106 0 obj [ 26 0 R 27 0 R 28 0 R 29 0 R 30 0 R 31 0 R 32 0 R 33 0 R 34 0 R 35 0 R 36 0 R 37 0 R 38 0 R 39 0 R 40 0 R 41 0 R 42 0 R 43 0 R 44 0 R 45 0 R 46 0 R 47 0 R 48 0 R 49 0 R 50 0 R 51 0 R 52 0 R 53 0 R 54 0 R 55 0 R 56 0 R 57 0 R 58 0 R 59 0 R 60 0 R 61 0 R 62 0 R 63 0 R 64 0 R 65 0 R 66 0 R 67 0 R 68 0 R 69 0 R 70 0 R 71 0 R 72 0 R 73 0 R 74 0 R 75 0 R 76 0 R 77 0 R 78 0 R 79 0 R 80 0 R 81 0 R 82 0 R 83 0 R 84 0 R 85 0 R 86 0 R 87 0 R 88 0 R 89 0 R 90 0 R 91 0 R 92 0 R 93 0 R 94 0 R 95 0 R 96 0 R 97 0 R 98 0 R 99 0 R 100 0 R 101 0 R 102 0 R ] endobj 103 0 obj << /Length 104 0 R /Filter /FlateDecode >> stream xœí]MÏä¸q¾¿¿¢Ïö]’ÅâØù ’C€Á àCC°¶c'cò÷#’êî*6K-QêV¿³íwF¤X”Zõ<,‹ÅŸÿåËþû‡ŸßùßïãߨWªüïþüD Lxÿ}ð¿~{ù~øþòùåóðßãߩѷ¯ýð÷_óßÑëá_êôw*ÿóËïwøÛÐèØ¿Îþñëß^~.O6Ô©coã³Ô×Cÿé/mÁt´æð÷?¾üixŒ£Ìt¿ŽNù`Å/î1 ]áЧ‡»w¨ïÖ¡»w‡ÃÞé÷ÔÖ`Ýá÷“ˆ)•zÑû|Úùª<êtøù_¿¹ÃáÃÿ$øÌ{SïI÷™üRòåý¿ÿú¿áíþmøÿ_ÿñŸCñÖ.¾ûúòó§psøú§¡*?cùëë·4n¸‚xøú‡Ã? Ï¡ÿùðõ//F¿‚…Ä é®Rcr ¨W£@$5kÂkˆÊÖÆiöXu®Á\£Õ«Ãª+5þÕG½dGmŽU5;â+˜ [ìØR/öÄ6QlSØQëK>+Š_ýÅG/öóAlSØQÛW“Ð j)±’¤*ÔøÝF ·¤Émä/'þ³Ùq`( ܨ#+˜Ë Án„á,9_Ç×”×úàÜø¯¡Ô —x²ùÓå¯/ξjMºÔk TôpsºöcƒmŠŽ‰.‡»Iש>°Æ‹þóË»ßÝ ëQÂúpÎÎ{KÑǵÆxK‡ Æá°—- z—¾4ųš$Å›T¯a?€÷T@*GÑpú' }i8Ýš.}ÑàŽß¼Ô#oTzº=œšÐÖ™ôá2Ý~î=Õçg;·æÏž´ìËÝ•L£´,Àu-‹âòËbj )ïÅ6Dª—ñ£8@ÉØŸàSÇÔH™Wfx ǧó°2ÒDDËcÌMXà:Ö“ªA°g¬‚u´`Ø£«À} ì128—ì¹yk¤ÒG°Gl=Z.ÝV`OõùÙJß ìV™«`ŸÐ^qŽ61{뮬£²íd—ƒ}œ8µ¤u QžlMü¢òûÈ¿[­'h Þ‘ŸZüE'Þ'ˆ"?u¨ •÷ HÅ* ¤â5-8’Êö`JQ0=G›ŒÕ÷üöb}l}àÉQÃj䣆ծ1jd7ô™×Ó%5J=òÖH¥—QÃjÛ5¬.ø¨‘ëó³Y:j0éûFs÷GkÔø¥VgyHÕLD5Û¤·ˆÉŒ9ëizRp;&KÑüxH|NXî6ôT†žZˆœzÀVC`kèχá’=¹yk¤ÒÇ¡ 5ô€áÒM5ô¤úülÀ†*}¿¡ÇÎPt™1ÞÕ8ê!q™¶âžßÁ)a­&ó‡h¤`ý¨;±”c=V¦Ó’E‘Q³[†XQ#w\ŸP£–xI)'¾™¼Äòiæï?p“'dÛŸ¯×­; "Ì›¯±±î€ÊÓÅtÉÖr=°Æ@EçuTÐXwÀarÈD¾îëk¸èÝÖPWºÔÒ˜¢fÊz!œìEîà™ ŠÝÔ²»Ï ˬuÔ„Åtd+d€)EÐ\ɰU¶tÉ”ê5*ºi°®@2š‹ÖR}`½N«õ]@úؤݗpô'ñ zl¢‹‰ÐnK•H×ÈFZ°bÖpˆYhAÌ"ÃÅ b©Xc ¢ Ä㦱ÁÈf¢U±TXãÀEï1V@ÌÈÜþÈ}4踫zLû 4𸱑àGZ°?Nsü8Ó³LÉ­ð“ê5*ºàÇ©~02Ñ+ü¤úÀ.z?ü8¿?ú-â§+bàBõ;\›/€ç’1Ë‘è+c€¬Ä\PsA·0€#@…¹T¬1PÑs>¶0çíC…9_PF.z?Ì·s¾n"æz°ÐÑÆô̯äÑlYØK°b ÅH VB,F1§TbŽû\ñ3œq’ë5*º@,†Ä"÷ŽD_A,ÕÖ8pÑ»AÌ)\1ÙÀ’!æÄH„ËÄòXu&bÀøÚ|_Oì2û@”f‚ØF–&¾‘÷9,àÙHê] ©=Ë¥ XÌ)â‡5‹‘‚u,æ4wºǙ*<×k Ttf1§[àN3×Tºd,–ëk¸èýXÌØ5,&/+È,6šÓKVšÌ{±M,'ÈDÆÚ‚@Y¼aÒZØc#M¼†ü2WuDelÌ£=Qo‹6 -p´`%m‚ç´y^¯§ÜÅw®8î÷¥z`Š.´y M¹Ó%§ÍTXãÀEïG›ö¸£¡‹6?tÐæGi~5¡µõ”ß|ª Db*›2‡,ˆ6ºðSÈ&¬Œd9Œ|S»:f–a SLÐ ¸Ä’kã-XÉ%è8— oq wbºâÄ$„ê5*ºp b‹KÐrѶâ’TXãÀEïÇ%άàèDsª'x©ÃÚÜüË yê'›7öÕ8GÖ²Ó)X 1bÞµ Æ}–®ø, NR=°Æ@EˆyÛ‚˜.*ˆ¥úÀ.z?ˆ½brè1Ûå ˆ=}Ù.c`‰¦²¤¬£+5=òÀ*[UŽ»]¬«r=°Æ@EM­À*¹Ã3VU¹>°Æ‹ÞMÓ½º®µ=šÞr5a²Ê“¦ž‰cnîµ›p¢¼bVž¬C”×<ÂÊëV„•çn,¯««\¬1PÑQ^·"¬òÍTta•ëk¸èý¥WEXÉmzb¯z‚/L­M÷MÔ?Û¹5ö·[xXNÕƒ§‰å’G©l¿õxøY:öI%t[‡²xiÁ<.A]q š— ËáÑV\’ë‘·F*}äT-.±,“Eºä\’êó³)Æ%¨KpMhÙÆ\Ò1žŠHîXƒ¿ØýDÿ ÑO³ŽfóÐïU…~¯[è÷lW¿÷P¡?×#oTúˆ~[èw,#Aºäèw#ÜIkþì{¢ß¯ rÛý=aÞòöðK:]HîY¯Ñ?±(ÛÁ$‡ìÊìé®´™‰dšß Œ¦7Lï2tD4øIÈk¹új'—ŸqšC¬9ª!G¶×ÝGSr®GÞ©ô‘Chr`ûôÓ%'äTŸ60Bñ9® ‰Ü˜;ö @Ñ·VâÖ+Y=¸H3“Éhò:à fA ¨À!Tl@ äË“’†ìÍ#JFg­‘J/ªÊ1éÊqäúülžB€Iß A¯‰§Û=ÁQ ²/]K2¼,.£?‡Í°Æ‹ÞYƬ@VËPž¡vÅk÷d»ìðº_U¿LÚB õOµbòày\qô­¸âÈÝSÑWqŹXc ¢ËäÁ·âŠÓ9ÌLtWœëk¸èý&>®¡°žå-‘ŽöŸ O<Ì$;¯H̳ÿi+c-˜g,Ä*â8ÆVÄqŒ,â8Æ*â¸Ô#oTúh,ÄVÄqŒŠK¯"Žs}~6q̤ïg,Äp¤ÝËþ¿Ò¶ %ê°[äô;K"¢z²—ÉyzöqÏå‡lÈÐ\\{qY±VÇDÌ#A c$0%ˆ¡”ÅçkFãÈ í pÄP0XsyªŠ%.w”'< ào°#M OáïÍ=1â pÛ4)—ò¶#=Ûù6I±m’»Ðƒ…-˜ ècÚç A·Írùº4Àˆ`"iG@›Ø´ ¼j@Ÿ|Àß`W@ƒ»3 {|ú=Ûd{F¥ý3<]=écY^Ñžñ×é –’)÷=ßk.1±œˆ #-˜ILÇ|Ú'bBÕ"&îZÌ×1¡™ˆ@ÚÁ‘˜lh“õ¼ëkb²~d¢³þ»⽉©Ã_ð$¦>bº eèÉl·iÆÓ7ÇTÇÌLùÄ]V0“©\¨˜ÊÅSy͉Äëš©NÔD íàÈTη˜Ê9Þs5S97RÓYƒ]™Ê¯‰ÏëbªMCvºÖ³:ÿ,¼ ’…ŒS+%Ç¢S´`W_«p¶Êõ¨®Ô«¯UdÑvùšùõËÀÚ•žûÃõ—kKUÄ]¹#°öKßÍ·?¼ùš˜»m!ð Skì(•Û£Îá"rO¬ù Å@õøR{2ö¬ŽöŸ¾2kMg€·=›'ÎЂ•Ô«•cÔ;zƒz‡þ9jUÅc–;€µ*½Pï`V5¨w˜$UÒ«ÌrG`í—¾õj½*(³ã\£F<|•wÛõÙI² ¾ZžîÍ?ù¹"ÕR*™Çò=Eõ1¿[^øBZ°–E r5®Å¢&pž3¡fQ ožÛ•>²¨±-5PI‡šE Þ<·\úŽ, «bf;Î…èÊm7©h‚î6µu7ΰí ?ZˆÁ-\}3¹ë˜K/G"-¸eô!2h>À1ùøÒ+º sµÀ®9È¿[µ5#޵|ıØq¬çc‚õõˆc}cÎíJG ­ÇšJº©GkÊsn¸ôG<}Óž§çH ñ$¢1³¬æMO&ë:³lAŒ…ü^=K¦=®yhèY~´äEy8AM† k‰É'&g[Ää§çjbr®Pѹ=Pé#19Ó"&§+éº&&§ Û.}Gbrkµ{ÎçØßNÛ˜{|…=>¼oòµà²™öç-cÜ4¹Œ6ê´@÷I|G9»ŒuC”6‘Á¥#·‹œÅƈ5òûh9…‡ül²ÖˆÙrdi¿›œGGþ>×2ß,“f$öèù>ï#>õ¸ ÜзñËÍÉä3èao%Sæ„ÿs£8Dƒç€g(HˆY^sKÛ–¥áùR|º®,t°ö@¥–†W-KÃñ0‚t]YéŽÀÚ.}GKÃû5tГ×l÷yùo\ÞP–Ùl,ø@y†Ì4bµ÷ËÄÖÞ¯ì$¤cy¬÷~•; @ÚÁÑX­½_e8é Ô{¿Ž›¼©þ» ÑÝ„ÞÔÜ¥+Æçbià^“ùü1á6ì OÝ$Óä½Öð{ö’¬_ó.ÖP$ûǼ¦7<(cèˆÂù-޳tºc{u—2ÈÚþI4oæg,îŠ?¾–j™-Ö1Ü77Ö­‚Ê·ô¦ÆNçL¨´røþþÇ—wwmS2ÚŸ4èã†ÆýGÛGhyÀÇ™ß?ýDÃ/äˆaèiÁêïoÜîßì[øþ=é6>ÍTêg=××P4ΫÓ3Á«EC,î®!o@Cºò7Ü"CÁ\A²E!-X­3Îî®3Þ¼éÙZ¿óæñ¹êåi„¾§«Õ+Àîêõ[P¯žÍ#òAf¢9£q‘fDI›¿gÜ ’6k†UfoͰúú€ðšÑ³W –|eK2Ë™iÁê¯lôî_Ù¬ U¸×WîØK3~åÊÅ7•Ó`vŒ}Ö’¼ 4+˜ç·¶Z.·¶µ\n-_.O×Ü^î@.i£ÜÚÖr¹µªê ^.Ïw”'dËå´ƒý<àÖ®Z.¿×YAOøÄ{==àå·$Zvë ní?Ãùé_© =pÛ*]·I‹*ïuíÏs¼ìçú7*x}{Á2(oc¿±®c¿I×<þ&߬=Pé%þƺVüE“®yüM¾#°öKß/þƺ5ñ7=ž¶ˆ¿Ù6DV^[¨½@ò@ÙÅš=)ï´%H{‰¼ºÞGþȳ7dÜ“”ÎiÁÌIM¨Âzlh…õØÀÃzÒu5© cX€´ƒã¤Æ·Âz¬ça=éºšÔøã,Ƴ°ÚÁŽ“š°&¬ç^[~;™Soœ%^þ, Ž…éÊ<ôÜ Ñž‘ÔV9Z°Ú#wc@µ&Œá‘w%<é­3Òzbîlªµès®÷&»¦‘$WÄD^ç‚ÛyoRG”YÀާQV‰¬¹kÕí¦þ¡×Œ¨wvB³&Øén£D‡3þ9Jè'ßXûÀ¥ïÈÅþúÜxã°ñ Ÿ.ƒ[fŽÃ~7éÕCÍæ¬&.ñ È Iò£Ý¿ûí aÛf³¿œÎut|Õæ˜Iì$m2xO né®÷Œ·&œÊów·ùêebóe¦G]8»ÇÛXuÁ±µËtÍGËÈ í`\uÁ4G]•XºZÍw”'4tq”v°ß⨠§L›IwË,ßqÚÙÄšžÌá›îh8[¹g±wç]û3×Éï FÓ‚y˜÷ªJáU+=†W<=Fºæ˜/w €´ƒó^µÒcx¥ªêôùŽò„,=í`?Ì{îùÓUÎÉ:a³ôØm·8da#ë¬Ç>¼´YnyšyF¶W$7DADâ ²®mL Ù†G"¥ë Ù%5 €´ƒ#²j![óXªt]!;ÝQžP1dýÈ6þÎÈîÚÌ.‘Û,4vLºÎà^4úyCŽGp–ÌĈ­öQ{ÛÚGí-ßGím½ºÜ\ÒŽÖ>j|uº®0GPÛGM;Ø#ÖÝ#=I¾oœñiBHω¥pqfSÛäâ½. ÖF±äLZ0“QÈO¥À©£8ß}®ŒòÈ íàÈ(ZŒ‚žw€¾fô#…œð7Ø•QÞ›QzV+ädÍñRÁI—Ù{œ9š¿^Ñ‚•+*ž™T®ccEÅ~*ªÏ.&º*’ïÖ¨ô²¢â½o¬¨xÏOtM×|E%ßXûÀ¥ï·¢âƒ]½ç¦«I˜>—IÖ™ ¼LòcGÎ[Qñ;‘V%Î3 (r²ÍXTPÜ_Fƒèl•; @ÚÁÑ€Š®e@ÅÊã±6 Òå 3 HûPA¶ènÊâ/BˆS29¬¤ËU)c³'F‡sQv|ö,·ôŒojÞ(·¹4Š;vµÊ›Ó–ì‰èQyëQÑ›»¡ƒ";nÓáç‚y|tµã6èÖŽÛPy‰ƒ®wÜ–; @ÚÁÈçA·vÜm«ê·ùŽò„lÇ-í`G>7§·÷âóž&ù‰—]¶ŠB¼Wîè‹ì ÏñðÞãá\Š4dÏo¦šSÁLŠ$Gµ®E‘Õ"A Çå; @ÚÁ‘"Á¶( êjŠLw”'´Œ""íš°üH;ݳÈÖ3ÁßÄyËèÿb’oî\pÛÝ_ÁŸ–ÄdFíÙýUT¡¶%îÊ•DÎ…ØRm”†À CU£äg“w³-Ø-<ñE Vú“£â»¥†§lø“£â»¥Ò5÷'ç;€µ*½ø“£jí–Š *éõn©|G`í—¾Ÿ?9ê-Ëš³ín©-ïË-N*˜çÏ‹šð§Z0ϸ‰Ærã&l7ÑðõÊtÍ›rrH;›h aÜDcªLeÜä;Ê5nhû7ÔMP´±?¯ãü­‰Ða­Y!¶=äj"½Ñ5cm¦é—˜\é炽Ï/Ÿß­:C°¡tŸ¯Ýð}blµ2471 /®RÎ!<œò×*qÃøHS¾A”EaÌå–õ‘¦›ÙáÃØfÜ K>±•ùƒÔ\S¥Ö³}ßôró·¥&P­Ý­‡Õã«_¼àhýÉø’­¿ÆkhYšØfóô¢W'Ù‹zΧq§tø““T}UÙ?>¿ü?‘¿’œ endstream endobj 104 0 obj 7186 endobj 108 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 778.250000 135.750000 785 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_output >> endobj 109 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 771.500000 129 778.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn5 >> endobj 110 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 764 141.750000 770.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn6 >> endobj 111 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 757.250000 144 764 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn7 >> endobj 112 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 749.750000 147.750000 756.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn8 >> endobj 113 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 743 154.500000 749.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn9 >> endobj 114 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 735.500000 155.250000 742.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn10 >> endobj 115 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 728.750000 144 735.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn11 >> endobj 116 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 721.250000 127.500000 728 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn12 >> endobj 117 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 714.500000 164.250000 721.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn13 >> endobj 118 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 707 168 713.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn14 >> endobj 119 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 700.250000 146.250000 707 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn15 >> endobj 120 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 692.750000 141.750000 699.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn16 >> endobj 121 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 686 181.500000 692.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn17 >> endobj 122 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 678.500000 192.750000 685.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn18 >> endobj 123 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 671.750000 155.250000 678.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn19 >> endobj 124 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 664.250000 122.250000 671 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn20 >> endobj 125 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 657.500000 118.500000 664.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn21 >> endobj 126 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 650 173.250000 656.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn22 >> endobj 127 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 643.250000 141.750000 650 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn23 >> endobj 128 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 635.750000 176.250000 642.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn24 >> endobj 129 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 629 142.500000 635.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn25 >> endobj 130 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 621.500000 117.750000 628.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn26 >> endobj 131 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 614.750000 175.500000 621.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_readonly_variables >> endobj 132 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 607.250000 196.500000 614 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_rename_ignore >> endobj 133 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 600.500000 231.750000 607.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn29 >> endobj 134 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 593 207 599.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_advanced_renaming >> endobj 135 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 586.250000 212.250000 593 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_limiting_renaming >> endobj 136 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 578.750000 286.500000 585.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_chosen_unignore >> endobj 137 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 572 171.750000 578.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_default_args >> endobj 138 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 564.500000 192 571.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn30 >> endobj 139 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 557.750000 126 564.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn31 >> endobj 140 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 550.250000 161.250000 557 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn32 >> endobj 141 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 543.500000 185.250000 550.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn33 >> endobj 142 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 536 141 542.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn34 >> endobj 143 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 529.250000 164.250000 536 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_structure_data_members >> endobj 144 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 521.750000 181.500000 528.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn36 >> endobj 145 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 515 208.500000 521.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_adding_member_functions >> endobj 146 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 507.500000 147 514.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nested_structs >> endobj 147 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 500.750000 220.500000 507.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn39 >> endobj 148 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 493.250000 106.500000 500 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn40 >> endobj 149 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 486.500000 153 493.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn41 >> endobj 150 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 479 156.750000 485.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn42 >> endobj 151 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 472.250000 150.750000 479 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn43 >> endobj 152 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 464.750000 150 471.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn44 >> endobj 153 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 458 147 464.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn45 >> endobj 154 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 450.500000 187.500000 457.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn46 >> endobj 155 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 443.750000 162 450.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn47 >> endobj 156 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 436.250000 188.250000 443 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn48 >> endobj 157 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 429.500000 174.750000 436.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn49 >> endobj 158 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 422 159 428.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn50 >> endobj 159 0 obj << /Type /Annot /Subtype /Link /Rect [31.5000000 409.250000 77.2500000 416 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus >> endobj 160 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 395.750000 144.750000 402.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn2 >> endobj 161 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 389 93.7500000 395.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn3 >> endobj 162 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 381.500000 132 388.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn4 >> endobj 163 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 374.750000 171 381.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn5 >> endobj 164 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 367.250000 105 374 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn38 >> endobj 165 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 360.500000 177.750000 367.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn39 >> endobj 166 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 353 189 359.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn40 >> endobj 167 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 346.250000 167.250000 353 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn41 >> endobj 168 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 338.750000 125.250000 345.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn6 >> endobj 169 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 332 177 338.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn7 >> endobj 170 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 324.500000 267 331.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn8 >> endobj 171 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 317.750000 211.500000 324.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn9 >> endobj 172 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 310.250000 148.500000 317 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn10 >> endobj 173 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 303.500000 147.750000 310.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn11 >> endobj 174 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 296 141.750000 302.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn12 >> endobj 175 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 289.250000 135.750000 296 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_member_data >> endobj 176 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 281.750000 95.2500000 288.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn15 >> endobj 177 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 275 125.250000 281.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn16 >> endobj 178 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 267.500000 87.7500000 274.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn17 >> endobj 179 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 260.750000 136.500000 267.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn18 >> endobj 180 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 253.250000 137.250000 260 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn19 >> endobj 181 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 246.500000 101.250000 253.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn20 >> endobj 182 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 239 255 245.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn21 >> endobj 183 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 232.250000 120.750000 239 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_default_args >> endobj 184 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 224.750000 164.250000 231.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_overloaded_methods >> endobj 185 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 218 179.250000 224.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn24 >> endobj 186 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 210.500000 168 217.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn25 >> endobj 187 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 203.750000 197.250000 210.500000 ] /Border [0 0 0] /Dest /3#89#3fq#24n#f2#2d#9ek#2d#12#d9t#eerd#b5#b1q >> endobj 188 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 196.250000 173.250000 203 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn27 >> endobj 189 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 189.500000 129.750000 196.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn28 >> endobj 190 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 182 113.250000 188.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_class_extension >> endobj 191 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 175.250000 99.7500000 182 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn30 >> endobj 192 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 167.750000 168 174.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_template_directive >> endobj 193 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 161 153.750000 167.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_template_functions >> endobj 194 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 153.500000 177.750000 160.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_template_classes >> endobj 195 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 146.750000 165 153.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_template_class_inheritance >> endobj 196 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 139.250000 166.500000 146 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_template_specialization >> endobj 197 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 132.500000 153 139.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_template_member >> endobj 198 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 125 164.250000 131.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_template_scoping >> endobj 199 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 118.250000 152.250000 125 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_template_more >> endobj 200 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 110.750000 106.500000 117.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_namespaces >> endobj 201 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 104 199.500000 110.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nspace >> endobj 202 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 96.5000000 185.250000 103.250000 ] /Border [0 0 0] /Dest /#b6#99#3f#23#2dG_#87#40#939#1b#9e#3e#f0#afb#92#96w >> endobj 203 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 89.7500000 135.750000 96.5000000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_exception_specifications >> endobj 204 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 82.2500000 161.250000 89 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_catches >> endobj 205 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 75.5000000 126.750000 82.2500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn33 >> endobj 206 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 68 156 74.7500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_smart_pointers >> endobj 207 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 61.2500000 201.750000 68 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_ref_unref >> endobj 107 0 obj << /Type /Page /Parent 2 0 R /Contents 208 0 R /Resources 210 0 R /Annots 211 0 R /MediaBox [0 0 595 842] >> endobj 210 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 211 0 obj [ 108 0 R 109 0 R 110 0 R 111 0 R 112 0 R 113 0 R 114 0 R 115 0 R 116 0 R 117 0 R 118 0 R 119 0 R 120 0 R 121 0 R 122 0 R 123 0 R 124 0 R 125 0 R 126 0 R 127 0 R 128 0 R 129 0 R 130 0 R 131 0 R 132 0 R 133 0 R 134 0 R 135 0 R 136 0 R 137 0 R 138 0 R 139 0 R 140 0 R 141 0 R 142 0 R 143 0 R 144 0 R 145 0 R 146 0 R 147 0 R 148 0 R 149 0 R 150 0 R 151 0 R 152 0 R 153 0 R 154 0 R 155 0 R 156 0 R 157 0 R 158 0 R 159 0 R 160 0 R 161 0 R 162 0 R 163 0 R 164 0 R 165 0 R 166 0 R 167 0 R 168 0 R 169 0 R 170 0 R 171 0 R 172 0 R 173 0 R 174 0 R 175 0 R 176 0 R 177 0 R 178 0 R 179 0 R 180 0 R 181 0 R 182 0 R 183 0 R 184 0 R 185 0 R 186 0 R 187 0 R 188 0 R 189 0 R 190 0 R 191 0 R 192 0 R 193 0 R 194 0 R 195 0 R 196 0 R 197 0 R 198 0 R 199 0 R 200 0 R 201 0 R 202 0 R 203 0 R 204 0 R 205 0 R 206 0 R 207 0 R ] endobj 208 0 obj << /Length 209 0 R /Filter /FlateDecode >> stream xœí}]í¸ŽÝ{ýŠzàž+‰¢>€ @Ÿþ‡Û@yzf2ܤgò÷#[Þe’[rÙ´·½«Î™ÆÜn«dJö—hj‘üëûÛÿ~ý?ÿùú×ÿö_Ÿþýãß^Ì—ˆ¦þßëðÏ_hƒK_¦ÿ~ _ÿãåÏ×?_~}ùµüïŸ/õ†¿ýø?Êý¿W÷úßËÿÿÛë?þ¯ÒøOS§¡Ã/ÑÆòï¿ÿÎÑ–ÿ2oÿÚÿõåþÃë¿oÃM“á×î)sxgÜ?_nÏhÇþó÷ùk}ú CØìÝ«õàëýÇ?¿üËðLŠIÚûIZ? €¶ÞYÞÐÔྤdÊýRý/;´–)@œ©×¿¿X_¬Í.¥[ä0ôL½é•Ýî3 \7) =ê ßð'ø½ü†{{ïÓó÷^[:?ÙŸ 7~ýí寿”ÑÃëoÿRþ4¾áú¯ßÊ[CW®2Æ×ßþéõ¿ãÜ}ýíß^Êij ÇߣþÅþ4þÅñPW÷ü—÷üÜ»ÇüØ»ÇØñ/Ö| ѦòÇù/¹þ¿˜<Þ5ÿ凮´¯õwûÓŠ¸Ð»Çšîóøî;€î{{OÚÏ¿=šWDK?Ê[~×ô¦.EÚð÷²ØV(X4BÁ¢m)X¾þ˵P°±rH¸)XÈ- ‰P®…‚…›FÍø\ª`1œ¬`®¿„ú V¥ÙI>p ÝLJ _À%ëpÍ_L÷˜¸]LÚ¤1Î*2mX©) •Ȧ¥Ùñ[®…JŒ= @:ÀM%Rj©Ä Ït€r-TbèQ§œ˜J.T‰Œg«„=T%ú»t÷©ºëáM#Ö¨D—XÖUW3I[£‹Iv½kèóó&ÌáM¥ÀmX¥“®LédiÈ÷:éÌ ³ÊŒ×L'§È  êdiˆ÷:YZ \3¬=ê #ÑI6Àe:Yߟ­“ýå÷Äv ù¥‹ 8þnاû÷ÚÚ߻ۯ[U~Ú–Õ‚Dm3mX©¶. µu©¥¶`¸V‘j;ö@.é7µu¡¥¶ùåZ¨íУÎ00µ%\¨¶g«-nWÛþ¶hû ²¯4w›‘FHw²¶ÿ€}Eë¼}TèöŸG [ußäÞ†àg4°™6ü]h†¹ÓŒ.N„A=ýlÔë8)y“†Ž­ù5à›³m¼þý%øIËíÔØý@¥—Þã5NÎïõBúàBâ㗉ݟ¸ô}ùú§#D2@”h@h|5ý¸«ý¿à)é[Ç}]è®xÛ×5¢@Š…'MÝçÑØPŠïš«g½Ó Í.ð@2 ¨0c$Ú°Òb (,¦q‹‰»ËÆka1= @:ÀÍbº¡ ·˜ˆ@ZLC:CÏ,&2À…SyÞG¢ÆÊZ°˜~VXLwvQ¹ß}]tguýç/1 ¬Tð>"+pÊ}íaÎÂ+èã»W «~Yk9EGP!ц•¨¼@…„-TàÃñZ Âع¤ÜP!A ’8‰ C:C`¨@¸òûn‰ƒQAcZu ‹¸»³A÷œ`ÁëÓÿ úåЯ¿¾iÕ•¶ð¤ÓjÛÇQ¶ÂUòÖ°NÅ­®âÖø†Š[ဴ“rÖÑÚ¹¤L*nk¨¸5V `…Š=ê Uq:Àu*nËË?WÅÏ:ˆ{×D]ãEÔlªÌ9kç³fûvìÁËÇ<Ó]8yy~¬^k$Je +9 ª¨Í-ª¨~Ng$U´ö@.é7EÎ-ª¨ÍÂS›%UtìQgȨ¢t€ëÙ™=TQ•"+ÎJzN•…ϧþÂW|«¨èbߎò+ÞèƒOœ7|¦m°cÜ/Ò°yø±²33WÄgNsÃ:¨,&‡Ê¶-¨înç$=·ö@.éT³¬•åSŒ`%=wìQgÈè¹t€ ¡Òí¡çj Ruæ¤awih×ÓÑUßYÆ ùeéAá Z ·àáïÿÆ›?¢ö=ÎeŸÐ*.áûQMù;7³r<$Ú°!ü…ØÂ_áÍw“7Ÿèع¤Üð°…¿àÅ^âïУÎþBxüõ{ØÏ*üÕœgb5Z¤9›Ô˜ƒ‡‚÷?OAôÕÜsä&±'<%'Ú°'P‚¶HÁ9)Ø¡$×È à†Ø";1€$=ê )˜p!N„=¤`NhŽKÅÝ)k×{˜i:ÃW/iØyÀäâ¼ãÖkl0¹Ù]¨ôhìì~ Òë“‹Ð8`rÑ éN0=»?qé×0¹ôþÒÑÒÊ}¡Ãµ€JÃFŸTâä-³ØEÖ@¥Â·ó*?n a̤ +U=Æ,Äc"gÌB”ŒÙÚ¹¤ÜT=´³8cv¸ª&Æ,ÀŸàRU»³U?6Ø©¿TNÔûŒmXœÔ$Ú°rU'A…Ô¢‚ðB–ôÑÚ¹¤ÜVujÑGÿ IúèØ£ÎÑGé®ê¼‹>ªYÕŠ”… qøšL¾Ç&«:v;ôyú‡ˆðSwMb×âí9#ÖâD&©M]¢ 7œ8^3†¨f|kŸâEŸ®õæ—ÚÁZõ¦ÅZõÂÇé­d­ÖÈ `BhoZ¬Uo¸—v¸æ=ö¨3d¬U:Àuíí.Öª¡8ɉªˆhVåv=¡OcYöC“rA‘»â!ot%ð{K²ØÖð@à\á4œï‰6ß¶‘ ~Gï“ü•$#gb‘äü+–þãŸ_¾žŽÍ® ^– ìb´ŠÍß#/uÖóÇÜ…N‰! TlÛ»Ãî»PqŸ×gI]X¢D×Äàûè ç¬ÙÌÙB´a7LqWÃ4î"ŸÓîB×Ý·@áßð9Û_úë멌ßoÈï ·ÿѯɾ¯±û×fc«Ð3YÊÇ@vCG± ¯†Žø¦ÒO gñ'Ž­¬rÚ{?ÃÏ'jþ¤¸UâÌåòˆ´áqßÿÃ@Tå5™‡zfÅ›(3ÎF¾š]€›ì倛Îf½«WS²[úîC;ô6e ÙRoCîJM„Òå¤UôÔ{Láµðš W  „Wà ÞÏ´üÉjS-|aõkúŽ‚~hÿn Œ›ÕuC´Ý±Ÿò¹îÃr»–*Ïvÿå¬ßÞ«f0ïTsùàˆ^AÓŠ^Aq.ŠFF¯ÔÈ `:xEÓŠ^^@F¯Œ=ê Yô ຃W4gG¯¸ŸË\‘.¨-š4× ¿ŸÞ¡_¸¯`}¿<ѶªæøO‘æ_•ßîáUFÐhŸ´a%Ì9탮탎Gû ׿ÜíC às®탖Gû ׿ìíCð'¸æÜÙÑ> ±†>{þëcÉí ¯É·yHÆ„C …\OË9"ñÃ_Rá]\‘är4»™[]žŸ6ìL ƒžW@ߪ<0@ÒÔ-Ã5O 3öv?Pé51 B«ò¯<0\óÄ0cÄîO\úu‰aʂكÖNEŸ òIb ŸdT }]9eô3ÕwHÞEVÚr(b”0´b”0ð¥áZØraŠQ¢p³å°£„Èc”†kaËá£Dð'¸Ô– »b”4EœܲçÍœ¶‰4ušÅñYcº·%@¤ +1&Šˆ1Œ­ˆ1L¯= @:À B‹|ž‚HòùأΑÏéâQØE>?©òP úx´%#DJÎÛÉ—¨åyì—Ýw= D×,DØärL‘Tïp6¬ÄÛ$BRj…$q¶’ ¨= @:À oS+ Ü!¡c:C @¸oÓ®P€³ õ-) ¤\^ÏíàM6Emö…¹)˜^š']øÐÖœü*>šOÆ×µpšH)‚liÃ:8ÍF”"ȦUŠ ž)YŠ ö@.éœfÓ*E2Ïì4\ 8ÍS)"€?Á•pšÍ.ηN5° 0_U¶ÛI!I ʯ©<ÐQœ‡/Àœ"§Á¯ Øº¼ï Ç-ð“ÍÌ/ŸiÃþpŸÔ;ÔÍ¿Žöè¬ðö¸®·ÞYÒ-¥;ƒw‹5<^“ÿ¬ñ—…qRoI»›g ä¬Ýêˆò{{âýCv2räaH9¶ÂrägüÃ5gŒ=€ÝTzeäØ CÊó†kÎ {$vâÒ¯cäø¶%á ¢2÷!ïÜâO«j%õ_|í)gÿ/š]ÿSÄC¦QïÉF4¬ñ º/9óº/9·ê¾äÌë¾ ×‡r­ûBî*}¡Ԫû’¯û2\ Jò$Z÷…J¿‡r؃CšS£~B+ÍâÕ&o¨x”·¬sš³ºìl¤aß:CŠÚ×ÖܯóÒêèJ¯Ù:¯=€ÝTú¸ÎËuº_ç¥5ré&òu^{$vâÒ/[çå‰qÇ:WFtíØ…’Š ÐÐÎʰsÒ&ª©i¬Jé{Mžž4*óLÚu1І½àBʲÕëܰ\ýÁJp NæûJŸÀÅŸ¸À¥» Áeè‘Øý‰K¿\Àïëý$cþ´¤±'E:©³/¯ü„Y~·„õW—â›dq}n¨ÉJØ&YÌ¡¢$Û¤8^½N-Ø.¯›+ ÛC`÷•>Á¶-ØöÈ¥{”°=ôHìþÄ¥_Ûø"¦íc« k¾c~:¸Ìr_nV£Ww¸´³Éø!)¯ñ´aÕI˜ÀK˜”†F “ÒʺÆkv’6õ@.éõ$­44J˜”V/%Lj:CZ„ pÙI˜è¢2×»:?D…€“#M÷r°ó曽AÛŠ²‘覜iÃJÔK(P/5¢›Jkâ ”’D½”&˜K¡^Bz©ÝTZA õL0—×úv“Æyó½‚ñÝì}?–ã6B×´ë$¬…2’Îy<éŸX(´ D•÷û‚zF+à´O· žMÙïfÎv3G@Á/B Þ1s’fNj£)­ü Í&fN‚É®I–™9É3'6ŠÑ”V~T8\ 3'Þ욘™™“ž M™Åžp‡Ó¨ãŠH`ÕyÓwÃD•màz/”&{Â!û¢†æÞtÓ&d6oBk2’MßÀ›âòa 5÷ U“môØü»~å[/m(ž[oñí+ó¢IàL£hRiågžÎˆ¢ISäpÛ¾r£hRi§¶9Êí+Çi¿Ê‰m_ù Š&•§ÞÅôÌÁ ›?˾ïZûÝoŽT(´ab;›„bÛF #pÎrÅvV*¶›4™ @:À¤ØÎ6j•ÖÀ°¢†QíQgHk±.Tl·+‚è$úº½¯U Cj¡,ôIÉ¡´´—Ñu·i6Il_6/Ú°R³I¡Ä©!µ4[œò9o¤f{3©2€t€›fC£Qiåç”õÐlÀI•!0͆ø šíw™\O;Ðf4*±û£ ]žCÛ´”äK´a¥–¢ˆkqØŠkqâtÊ¡Œk©= @:ÀMK±×âЋd\ËØ£ÎŵÐ.ÔÒ°+®Es¢ÐÇÜûÎaUþ– âåw)p®|“†ä:G ýÕëР׹ȒÌל\7öv?Pé•\ç¢oë\!¹nì‘Øý‰K¿Ž\WVÐÉúslø¥*7õ)Öã:¦™£Éšc¢ {uƒ”®«×ØÒÌʸÑÃÖ÷ÐØý@¥Oº‘¡¥Ù éNêÆÐ#±û—~n€Ùµ·ü¤Ø[æh}í gOvižëÝ yëtHFáÁä# ;u,'›ƒm‘ÍÁr²9XI6{»¨ôªó`[dó!¹—.ÉæcÄîO\ú…:o÷ÍAáÏñÝ>ª:eǪë¦eíÈñø¸¬9hY“’XõZËx li=€ÝTú´¬Á¶–5!ÝÈe=ôHìþÄ¥_¸¬aºÏ‰ÒkBd5¹ÅŽ=&ÝEû|»«*sÝå¥b¶Ádò•™iÃ^øAËቖK«ç^Âú 8è(ü åðƒDË0ägÒ}–ðãs4~ð -—Y<&Ñò±õGw¥›¸\ÅUpwl’ÅCË¿o) öUt] úô“¼ç‰[ C8ƺliÃ^ІÃPläY.­Ü$ E¨À-…¡h8 …FžåÒÊ]iõ€¡0OȆâäY.³Ø•g¹Cš( EõwñPóqìWsÇrZ©O‘fOöêSâùœ!·ò9ƒpaA–ùœÇÀî*}Ò§ÔÊç ‰»ß†k¡O©æs&÷'.ýB}Ê{˜P}}ÒÐuûÍ5›Ï±ŸÞª„]} ?ƒ;«ä.×Ö†ò™w 3ñY?¸ãØø²~xÉ#âÿW‚g¦Ô2   ‡*QlÐ|G~®®ÅºVØ}èø}±…§}DuýîsD°þøC¥wB~Yáû3g„)V•A 9;ì5oxŠ|oZ)ò½8~ðV¦È{»¨ôj¯yÓJ‘ï ?:®¹½6öHìþÄ¥_g¯y»‡àº`¯iøéŸ,Š\Uô[“ªìÜš_ëì ogŽó6ìUzǬ{—ZJ/g<Èëc`÷•>)½k%X÷Ž, ×Bé]M°NîO\ú…J{¸¯ J¯I½^|£ä Ocj,h´¢•&žZcs|.jüe.ñ•H”ìëhÿˆŒcЍÂpMÝþªßä/Þ^yÊAï^ç2wÚ{Áö¾Åöžs§½—ÜéÚ¹¤LÜiï[Üiï½@r§Çu†Œ;M¸Ž;íqwZƒò§P뛃ëÝ] žM˜Ä†O²Oî},×$ÈÕRDõ_ÄëIïg*ž7¬a%2Q7À‡VÝ€2\AÖ ¨= @:À C«n€ uÆu†¬nàBdŒ{î#ã±¥Z5Q%}7µ¦è€Â±º%”üдú ÖЇúøx¤ ¯BWœé–Y€4¬„®$Ò÷ûÔJßïOá“Lß_{ €t€t¥Vú~Ÿœ@¦ï{Ô²ôýt€ ¡+›§.Õ™¬¦ЦhHÿ{J¯,{¾4«eBóB{æ†Ç}jÑ…sÁôØØÇµK髯ʕ©a¬]cøŠU^ _´­e¿¼{ ¾{ ñÝ Ï6‚&ˆÝ£ö@.éÓîÆ5v4V `Åî1ö¨3tt÷ \·{ ÙÊrðîñÄå•rn² 8N¢Í|7oÙ¾ŒvæÑÂŽ>7ì<¬BÇã”еâ”P'¡“qJc`÷•^«Ðµâ”Ð!]Æ)=»?qé×V¡{Lœ’&Ë÷êm(sh¢L•Sï‘©ÚÒ¨K$Ä(²†½ÈáyˆúVˆzb„^†=€ÝTú„¾b„ÀCŒ†kPCŒÈý‰K¿9ücBŒ4).ú–˃jÝögÒWþ»²Ö߆ÓàGgÒ@Oo\¤ {•3ðÀ ­À <ðƒ ¼{»¨ôI9±xƒÈo†k¡œ8©#ÒÀ*ýBå ¼Ñ䨀~¼½Â‡¡!w›ExÛh4 kXùqEaL­$Â(<¯˜dáÚ¹¤Ü>Îc+‰0Fî;®ÅÇyœ’ü .ý8O éjıçõ}-R—ûÙ1êê¶þ‹³«IšS79—1‘È ´á<& l骾â5ÞÒ#h½¶L'þ~§C±ûþrf‘¥s+Ks^Ç`d–æÚ¹¤Ü3·²4c~Ó,³4=ê Y–f:ÀuÈ̃HìäTœç÷óý|FЧæMÙdƒ!9ŸÁÓ†u8¬Èùljá„ã9Ÿƒ“9Ÿkä0áD°­œÏÁòœÏÃ5lj±G!ËùL¸'܃xï œPÕúd2Ÿ6ÙkÁ¢´c ŒÄåŠðÍÆ(‰7>”¹M­ŸàdÁUÐâªà\õ’«^{ €t€2C‹«À‹$W}ìQgȸêt€ ‘Ù?ˆ«®AfÅÁô§ó )dlqW¡È'¯¥ üäµlÅÞgÔxŒG¿5*^ÑŸã[ïìÌCÁB/K¾…yÈYè% ½ö@.é7Ìà = ˆ$ }ìQgÈXèt€ 1/<ˆ…®Á< |NÌ[ =a&v¸ÈIåä gC¸ÓWZßa¦H¢×—梜ý³…íˆvÌÔú¥ßÌ(¸ï!¶¸ïAœ_„(¹ïµrH¸flqßCtbÉ}{Ô2î;àBÀLæySÁú˜eb>ÝGú6ß]šY8¬a¥ògA]¹E]²¤.×È à¦ü¹E]Y"dI]{Ô2ê2àBåÏ¢.k”_CêWr[_æba{DTËSfÝúP'ÂG¬aêDë8êD ԉ¡'‡þ µrH˜P§Èk N´F `êŒ=ê -E:Àu¨STõyPGS=¨orh˜±š,v߃›‰1biÃN>cN6ŽÐ"Gàdã’l<öv?Pé•Ï¡E6ŽŽ“‡kÎg{$vâÒ¯ã3Fx ÙXS?ê_ZdcMÀìz§¥*ÛÊæ**ëxù×$Ú°rE#öP´­=T¸!ãä†$›àع¤ÜöPŸ[{¨çŽÔáZì¡þ¶iÎø\º‡âc˜¾}Íø˜¼Æ ÌùGë™"wÑÂþ{V­‘cŸGc)~Ûo‘«ý‚3ÉT {í—À 7ÄØ*Ü#/Ü£,Ü0öv?Pé“ýZ…bà…†ka¿„Z¸ÜŸ¸ô í—¸‹}Þe=¾[nån ÑÂÚð¸ã–a úf>iò’oà;ë¿oÙ;6éÕ7¿qü({QÝJJOJS+)}Ì<)}Ì2)ýØØý@¥O{Qj%¥‰'¥®Å^”jRzrâÒ/Ü‹ò.>w/ÒXÿýúÛ÷á²ë×ê`œKÖ_¹ûfBùɬá»oækál²Ã·Aÿ—¸ã‚KiØ‹YüÒnÈ„Âé°X€‡Áb2©‹Éò\%ÉÊ´ýc`÷•^a1™VÚþdxž•ášÃâØ#±û—~,&»+|¡‹Š¥O‹›rª{&ªaRkü»®ûX“6O“"{!Ä÷€=¤²Ògt²$Ð=mØ «.pXu±«âl%Õ³ C`÷•>ÁªÃ¬:/¤{ «CÄîO\ú…° »bºà©‰ðêW¢þPõÜTŽ å™u›ðf–˜sÃ^|ðÈñÁ‡>xžK&gLLLJÀî*}Âï[øàAH‰CÄîO\ú…ø€»xú}|Ð$Àì²È¼ošÅ«)wö9jQ>e¢„$Ú‘6<0Ú  D—ÿgKô?õþâ«=˜¿€Ìóè}÷\ù{Šß¯„ÞÈtàÏ?` ðÅaUª‡U´‡Àî*}ü-ÀNHwð‡‰ÝŸ¸ô ?¾Aô±€¯!tóÂ×ÞíÿåØŒå2€êøþˆêÊêì.àœ&ËYÇUÝY÷íZïºÛï!™—Öï­},Þ¶OF®ámx`@°O 5ŽÕ%ø¡‹4šÕx¬žd¢ÐŠxi¾‚þxñã§[R¿¾üúúgY;ó¾ÜXZ¿¾×áÏ…Z{©“~틱-íÕ½“ØîƒW³&6Ô½.2wó·‘¿ÔÍ$ÜÿeRY÷e¢ÅÝ}Ù´~®ŸzãÀ{_­¹ý2=é}rxí½\A­ÉÚéÑïpZAýÃõ¾ç£ñ¶/­{Ïôád7=: {Õ.¸1,£ø[¦ÎžQô»‹ý××__þ?“á endstream endobj 209 0 obj 9980 endobj 213 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 778.250000 162.750000 785 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn35 >> endobj 214 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 771.500000 111.750000 778.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nested_classes >> endobj 215 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 764 166.500000 770.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_const >> endobj 216 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 757.250000 157.500000 764 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_target_language_callbacks >> endobj 217 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 749.750000 185.250000 756.500000 ] /Border [0 0 0] /Dest /#17#05y#e1#c3l#5d#86#92#97C#af#fe#88#83#edq#0bGF >> endobj 218 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 743 225 749.750000 ] /Border [0 0 0] /Dest /#dc#aa#ddE#b9C#c8#60#ef#be#eb#e6#e7#f3#91#91#92#b8#10W >> endobj 219 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 735.500000 158.250000 742.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn42 >> endobj 220 0 obj << /Type /Annot /Subtype /Link /Rect [31.5000000 722.750000 84 729.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11 >> endobj 221 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 709.250000 99.7500000 716 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_introduction >> endobj 222 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 702.500000 132 709.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_core_language_changes >> endobj 223 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 695 202.500000 701.750000 ] /Border [0 0 0] /Dest /#93#0f#3a#1a#8a#d7#8b#22#07#90R#fc#1d#b7#1e#7f#11Oq#8d >> endobj 224 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 688.250000 190.500000 695 ] /Border [0 0 0] /Dest /#a0#03#ed#b5O#ae#f4#8e#c2M#9fk#22#e0#04X#b2#eaS#f8 >> endobj 225 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 680.750000 141.750000 687.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_extern_template >> endobj 226 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 674 135.750000 680.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_initializer_lists >> endobj 227 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 666.500000 153.750000 673.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_uniform_initialization >> endobj 228 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 659.750000 140.250000 666.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_type_inference >> endobj 229 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 652.250000 158.250000 659 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_range_based_for_loop >> endobj 230 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 645.500000 192.750000 652.250000 ] /Border [0 0 0] /Dest /#7d#ac#94#06#97#0d#7d#e1#a7#2b#3a#bf#b3#f9#92D#02j#3fC >> endobj 231 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 638 165.750000 644.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_alternate_function_syntax >> endobj 232 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 631.250000 191.250000 638 ] /Border [0 0 0] /Dest /#eb#2f#87#7d#27#01L#3c6#c1#3b#b3#1dc#eb#a2#88#04#7d#09 >> endobj 233 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 623.750000 173.250000 630.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_explicit_overrides_final >> endobj 234 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 617 158.250000 623.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_null_pointer_constant >> endobj 235 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 609.500000 180 616.250000 ] /Border [0 0 0] /Dest /Ne#7e#5d#8b#ad#c0#07U#24#01#92#ac#f7an#a1#0f#2be >> endobj 236 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 602.750000 163.500000 609.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_double_angle_brackets >> endobj 237 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 595.250000 180 602 ] /Border [0 0 0] /Dest /#7b1#5e#87#8c#7e#d3#92#10#8f#df#d7O#9a#d6#eav#ce#3f#2c >> endobj 238 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 588.500000 184.500000 595.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_alias_templates >> endobj 239 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 581 155.250000 587.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_unrestricted_unions >> endobj 240 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 574.250000 152.250000 581 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_variadic_templates >> endobj 241 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 566.750000 161.250000 573.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_new_char_literals >> endobj 242 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 560 150.750000 566.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_new_string_literals >> endobj 243 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 552.500000 156.750000 559.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_user_defined_literals >> endobj 244 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 545.750000 158.250000 552.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_thread_local_storage >> endobj 245 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 538.250000 237.750000 545 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_defaulted_deleted >> endobj 246 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 531.500000 150 538.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_type_long_long_int >> endobj 247 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 524 147 530.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_static_assertions >> endobj 248 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 517.250000 286.500000 524 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_sizeof >> endobj 249 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 509.750000 205.500000 516.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_noexcept >> endobj 250 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 503 196.500000 509.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_alignment >> endobj 251 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 495.500000 129 502.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_attributes >> endobj 252 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 488.750000 174 495.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_ref_qualifiers >> endobj 253 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 481.250000 135 488 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_standard_library_changes >> endobj 254 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 474.500000 150 481.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_threading_facilities >> endobj 255 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 467 131.250000 473.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_tuple_types >> endobj 256 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 460.250000 132 467 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_hash_tables >> endobj 257 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 452.750000 154.500000 459.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_regular_expressions >> endobj 258 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 446 185.250000 452.750000 ] /Border [0 0 0] /Dest /#f5#aaJA#1d#aa#7e#88g#ee#ea#98#b4#60#01#28d#98h5 >> endobj 259 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 438.500000 190.500000 445.250000 ] /Border [0 0 0] /Dest /Nj#18zu#07#a6xo#d9#3c#93#10_#af#2d#e5#89#25#60 >> endobj 260 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 431.750000 150 438.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_wrapper_reference >> endobj 261 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 424.250000 211.500000 431 ] /Border [0 0 0] /Dest /W#c1#03q#92P#fd#3f#0ebO#f2#da#fd#a3#d0#e1#bd#d5#17 >> endobj 262 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 417.500000 187.500000 424.250000 ] /Border [0 0 0] /Dest /#90#ee#ddo#bc#28#e6#17#28S#90#9a#11#fd#ab#ed#e8#80#25#eb >> endobj 263 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 410 264.750000 416.750000 ] /Border [0 0 0] /Dest /n#0a#e1#cb#17#c4#a3#83yzDZU#bf#ae#7e#bc#e1_#7d >> endobj 264 0 obj << /Type /Annot /Subtype /Link /Rect [31.5000000 397.250000 84 404 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus14 >> endobj 265 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 383.750000 99.7500000 390.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus14_introduction >> endobj 266 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 377 132 383.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus14_core_language_changes >> endobj 267 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 369.500000 156 376.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus14_binary_literals >> endobj 268 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 362.750000 135 369.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus14_standard_library_changes >> endobj 269 0 obj << /Type /Annot /Subtype /Link /Rect [31.5000000 349.250000 84 356 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus17 >> endobj 270 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 336.500000 99.7500000 343.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus17_introduction >> endobj 271 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 329 132 335.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus17_core_language_changes >> endobj 272 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 322.250000 180.750000 329 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus17_nested_namespaces >> endobj 273 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 314.750000 162.750000 321.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus17_u8_char_literals >> endobj 274 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 308 174.750000 314.750000 ] /Border [0 0 0] /Dest /X#29#0b#01#ffr#2d_#19l#cd#df#bf#3e#caW#ce#5e#a2#87 >> endobj 275 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 300.500000 135 307.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus17_standard_library_changes >> endobj 276 0 obj << /Type /Annot /Subtype /Link /Rect [31.5000000 287.750000 81 294.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Preprocessor >> endobj 277 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 274.250000 105.750000 281 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Preprocessor_nn2 >> endobj 278 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 267.500000 102 274.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Preprocessor_nn3 >> endobj 279 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 260 135 266.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Preprocessor_condition_compilation >> endobj 280 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 253.250000 117.750000 260 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Preprocessor_nn5 >> endobj 281 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 245.750000 108.750000 252.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Preprocessor_nn6 >> endobj 282 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 239 139.500000 245.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Preprocessor_nn7 >> endobj 283 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 231.500000 148.500000 238.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Preprocessor_delimiters >> endobj 284 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 224.750000 225.750000 231.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Preprocessor_nn8 >> endobj 285 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 217.250000 195 224 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Preprocessor_nn9 >> endobj 286 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 210.500000 148.500000 217.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Preprocessor_typemap_delimiters >> endobj 287 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 203 147 209.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Preprocessor_nn10 >> endobj 288 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 196.250000 168 203 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Preprocessor_warning_error >> endobj 289 0 obj << /Type /Annot /Subtype /Link /Rect [31.5000000 182.750000 75.7500000 189.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Library >> endobj 290 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 170 195 176.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_nn2 >> endobj 291 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 162.500000 128.250000 169.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_nn3 >> endobj 292 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 155.750000 127.500000 162.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_nn4 >> endobj 293 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 148.250000 126 155 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_carrays >> endobj 294 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 141.500000 126.750000 148.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_nn6 >> endobj 295 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 134 120.750000 140.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_nn7 >> endobj 296 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 127.250000 116.250000 134 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_nn8 >> endobj 297 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 119.750000 162.750000 126.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_nn9 >> endobj 298 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 113 156 119.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_nn10 >> endobj 299 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 105.500000 203.250000 112.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_nn11 >> endobj 300 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 98.7500000 123.750000 105.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_nn12 >> endobj 301 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 91.2500000 113.250000 98 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_stl_cpp_library >> endobj 302 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 84.5000000 129 91.2500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_std_string >> endobj 303 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 77 131.250000 83.7500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_std_vector >> endobj 304 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 70.2500000 144 77 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_stl_exceptions >> endobj 305 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 62.7500000 168 69.5000000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_std_shared_ptr >> endobj 212 0 obj << /Type /Page /Parent 2 0 R /Contents 306 0 R /Resources 308 0 R /Annots 309 0 R /MediaBox [0 0 595 842] >> endobj 308 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 309 0 obj [ 213 0 R 214 0 R 215 0 R 216 0 R 217 0 R 218 0 R 219 0 R 220 0 R 221 0 R 222 0 R 223 0 R 224 0 R 225 0 R 226 0 R 227 0 R 228 0 R 229 0 R 230 0 R 231 0 R 232 0 R 233 0 R 234 0 R 235 0 R 236 0 R 237 0 R 238 0 R 239 0 R 240 0 R 241 0 R 242 0 R 243 0 R 244 0 R 245 0 R 246 0 R 247 0 R 248 0 R 249 0 R 250 0 R 251 0 R 252 0 R 253 0 R 254 0 R 255 0 R 256 0 R 257 0 R 258 0 R 259 0 R 260 0 R 261 0 R 262 0 R 263 0 R 264 0 R 265 0 R 266 0 R 267 0 R 268 0 R 269 0 R 270 0 R 271 0 R 272 0 R 273 0 R 274 0 R 275 0 R 276 0 R 277 0 R 278 0 R 279 0 R 280 0 R 281 0 R 282 0 R 283 0 R 284 0 R 285 0 R 286 0 R 287 0 R 288 0 R 289 0 R 290 0 R 291 0 R 292 0 R 293 0 R 294 0 R 295 0 R 296 0 R 297 0 R 298 0 R 299 0 R 300 0 R 301 0 R 302 0 R 303 0 R 304 0 R 305 0 R ] endobj 306 0 obj << /Length 307 0 R /Filter /FlateDecode >> stream xœí]M¯å6rÝ¿_ñÖL[d±øÜmw€,6Å ‹À“É`0=ˆ3‹üýH¢ônU]Ru)龞¶aw‹—,RëU¬Süî_~þÏ×ÿþûëwŸ~þŸ×_§??ýüÒ}Øå^‡O lü0ýý5D|ýõËËo¯¿½üôòSÿÿß^rƒŸ?ý[ÿ·ÿ{µ¯ÿÚÿ÷—×?üG_øÇ©ÒPáËK0¡ÿó¯ãŸ)˜þoÝÛŸCùŸ_þýw¯$ÎÝMƒá׿7ÉÙa+ÿö2ߤÿýû¯{ù.ßþž> F÷jôÿÊþ÷¿^þ4ÜÕvó(r%:ŠÛ ˜ûð±ï:A–Ù?½|í>ÄØõÏÌûü3–úWo¯h¼þõÅ»Æ$£™jkTz_{¼¶¹É+ok„t3Ôgý÷5"k¹ô?¿|ü{æî9˜Ú‹üm¡áÇ_^¾ûœ^ýåOýOù±üòå%öý(Òë/|ý§®³øÏ¯¿üå%~ˆ©óÇw”1?Œ¿¸òœ¿ýòc­M]Z÷©& rc> ó±ÿñÖ&fi·‚\暤j¨Þ†ß?$ãªmlõƒ5±6XS’Ÿ,~ÝØÆÕncáqÕJõAÞ¿úó«¶þžêϼÚf>ؤx·Õײ0‚êkÑ<»Ù5 öÇ_z̽E0{}‡Ôuo€ ˜hÁ__~~Š“± Š“'ƒ ,‡kÅc `íJÏPœz¸‡âd:!½P<Öˆ¬}äÒ¯ƒâÔð(þ^ÅŸªP\Ÿ³w°PÇ£ª•ò7Ü»Ñ߬µÝ¨‚&½)е@ UA0\Á–T°_©1%鯅 5€µ*}RAèJ*h—Þ_ jDÖ>réª „cTð… fódº>®‚õ6]SÃUð6Vu±®¥šMÝ Ö±E±YxnÕõ‘©·QŒíÞ¬7Y˜UG?TçÃŽ‘Ô'Uý—íëæ…çX»~#jC¼-œ2`ÅF¨Gm4%ÔFà¸Ú_ ÔjkTú„Ú.•PÛE.½¿¨í&œ¾µ\ú…¨þÔ†ú\ªëñµ…S}–+Õ_ꈵ€¦RÁìçÕ5OýFëÊ©øÎ®KS}¥}Ú£Ùnë±~åC Í>fÞщ«úF¬ÔúÐ8êU³ÎVøgê¦vA©ÖžÁú쳡~‡¥éQ…wã†ùåoëý\º  MoC2Â¥¶¿žDwùú×~Bé¹rH;êqÂhÖÜÞA=4 Cjä!¿ àw0 üϧƒ¼A;(KÀ“Q~AÚ§‡¡g¸©þžü {:C Äž¾#ú8»ïˬ:ZÔW~uý®~ô/,²w¬Ûz?O2‰ žúý¼ìÖ| |n¡š_^ܸ$¾ÓÕC£01• A2§Çý$†äiF~"i³!ˆ¡d¢çD/ ÁP#00C@:¸Ð$÷<† *íy·¹¶Ú¦„7Ûä<-8Ð6õÑ7üµ€àî˜}ûâ8û‹ãÁM÷ã?Ø`Q9 |yAë$Âè}j®çÔ§Ö_Ç{ŸšëøváxÍ|j¹°ö@¥>µþÚßûÔúRäÒ;ä>µ\#²ö‘K¿Ì§Öß9<`dmuvª¦üÐ%`³¸ñ¾FMÛ®ùëmÒviš.äÉïæFõ£y šð¦O§þ NŽ×ÙäôìÕÛ¯V /îb X\q‘?ÿÒ¤ês™žraOÔÖ0b²ZuÝ5vþiìpƼô!x¿üXûe¡ŸXûH°a’rÔõ_L5dúeìé爣žLVð¨½Â^‡¢½ŽÂ^Ç;{'{˜½Â^‡¢½Â^‡;{&{˜½Oa¯ã›½®¿k½?³¤=ß܆‚p¼°I¬àQ}JžëS %}J‰Ïø”¤> 5€µ*}Ò§~Ù^Чä„t'õi¨YûÈ¥_§O¦³è“Â-Tß9>kõ•~\oSFÓݨ¶Ÿ¤à@wW_LçÚývõ§í+iá$ç­¿¹P|Š‹Nrg ’5ÆXàïänÀâ|ª\Ò²“¼/p÷Nò¾DÀä¹F¡#NrÖÁeNrg¬9¿ßíGn‰UdÇ)âÐ}h506[øåêëÍׯ ,|ý¶õœì&2ì3Y'yË5.Ž»™¢z·Û·3U.ÍR½¾.¾{¥[‡Pô//ÎcIóWŒ8a<KÆÇvÒxŒ5 @ÚÁl<JƬèÀJã1ÔÈ#fèV”'*êJ*º‚òåÑ•P=aôåÇÈ í`Fy´%”G#:0å‡y„–¡<éàB”Ç7ê÷I(_ß\XyUiPwZ¤á.èWÛ@Ͳ­Š *OÍÚØ¶šXO(ÄЂú¬Ðß%ý ÈÕkôÇ3k €´ƒYƒ)éoèDÔß¡F¡aúì3èoˆgë¯Q¨„f›@Á¥¯·¹l1¤ÚKW iñz³©U=ªr ´`£ª'#T=Ù’ª'Ç5qÜ*`º:Ö@.i³ª§®¤ê1ñb’ª>ÔÈ#옪'ó ªžÂÙª®ðU,¶*Tý¬øŒ˜éÄmyÁÛbhÂ]Þ¦>]ÌŒ•ï2ØÈw¿ ‡Öt­18´bïÁN{7<Ë5 @ÚÁ‡¶K8´ß=®9Ž5ÆÞð;¸‡­¦“áP“Îjǹ û³ýûÿúh¸‹÷6³5„Æ›"-بœ6 å„O³/å¾] V*'ØI¡cÊi“PN[àiö¥Ü;=\ å´aÒF™rÚ'àiöwg+§&ÁQ}ƒï¤õzUlþŽ}¢5íVB^M¬àÀ¥Ps¬é*±þN–5Š˜í ï7¬;’xÐà|éA¯@›‹Ú\yè¬phZ4ÚpÆ2—´¹( Í˜‡n`}°œ—Ðæü„e.0hsOÀ<ìoß mŠÄQ¦NØP8!À¨~ùxHVF$ÄþÙ“‚#?¶ÕU„YˆâرÊùNÚùmƒìî3ÓñYï •fý Üû àÞÇÜ ÿ·ü߯ÇÈ í`†{ïKpﹸp?ÔÈ#ô î}x¸ÅÔ+à^“qªž'paÍrÒNÙ»Qp ²¾£ßñ‰ó•íñiw¾ MPÅÂBe+_I¼ò!k_(Í(^@i %(û vÚ_ X8Ö@.i3”F,Ait¢'¡tÌÂß1ü.…Òt Bެ¡ Û¬4…®úúØÙª 6ÉC± ÉI –½oq{÷gGz-l½«¼RõmE숊i·=”ya£Mw·qƒ†Nr7‚éÝ$_†{èûºûÄþ t’}’k €´ƒ î¡+±O†¸ÞdŸŒ5òû„vp܃yö‰†Ûº#èL¤µ'‚^³m»Ë29¸Á¢§GZϦI…&u[5G¿<Ÿ“eÁA®I.¶¶ï¿©=Ÿt0DÝOº¤¶‚ê¶Dõ±™VR=r äv0#µ-Q=ÀZѤzŒ5òÕƒvp!RÃÛD¹©5Éôª•,°Œù²¹¾Òª¯5×Ö©š¦‚2ê+سÒ+(,A«=? gm@žæ’°Ò~‚Ñ ª9„í¡¤»LÝŠ‚â)ÛhÅǺ‚‚Qð€ –x@ v¹ JP®\ÒfŒ%¾O7\  ˆàwp) Ƴy@ (¨Á“$¿j¤L!O ÷«¾M“&ßÌm\°‡XÕ-ïZî>oÛ¥­þ,­ŽV2 ]‡¥Y¸ Ý®œ%ו8KNìX¹Nr–r äv0Cw*q– ‰=·$9Kc«ã,Ñ®ƒn×ÍYZ€î÷ÄfjK5Üà¸|ïæê[ßhé9maL&~+8pÕÝwDµê]§ÞxÄO!žøp8•/½‚˜7‚ýæl‰ýæÄv—³’ý–k €´ƒ æ)±ßœávÃ5‡ù±F2c¿Ñ.„y{6ûmæ5¼8 ‡¿I¾ÆQ½c½¯‡FD9gQîVp4Qî6UñÆy^“xh0° îÚ ¢ ½õ뢉­+ç$é-×@.i3¢A‰ôæ€o¾ ×Ñ`"½ü.E4w6émÑ4t¸ÏUŸƒæ3V“CsˆÝ€}IÇÁ‰ ® NZ°'P°¥ÆNˆ ç%[*×@.i3N`‰-åo ×'pbKü.Å 6[j!Ä_ãªF-dÑ®·ÙžîT•ã¿ÅN•EÎfNiÁ‘;5‘MT•'¹éCS}áoß»‰âAôÒû½‚AP \(Q œØZqAR r äv0ãc(Q \p¢Ikä2 íàB|Œ§S êG+œQ§áãÁ_†GœÜ¿hBµNBº,iØûÊ¡M<×Úl(=èhK‚îãR‰îãÄÖƒK’î“k €´ƒÚR‰îã’Ø^ä #÷skJBš.BWHß÷ü.ܶEG:H tQBäZõ•$zÂà*Å´W1Ž˜Â»ˆþïq¦lðns•üò‚XÔÑ•u ~b‰Ÿ…bsQò³r äv0¯°ÄÏBìD’Ÿ5ÖÈ#dü,ÚÁ…ë<ŸU_(øY×…·j>[ô>ì§Áé¶Úr$ &‹´`#NÁ`ÂPb0¡Ø¤Â L¹rH;˜q"”Lèù6Ûp-pÂO &"€ßÁ¥8Ng0ÕqBs¶†‚iߘô¼=2hOÄw G÷Ó­²îrl ´`£î'AÁT¢À ØÅÁ$)0¹rH;˜u?–(0ù>Ôp-t?Îʆvp¡î§Ó)0uÝ×P`™–5Ƶͮy“ ëc¬ïBi‹†…§¤pYÞ³ª„B =Q“_CsZCÎæ>J"¤”!„ûVpœeèˆBMã)|·a  Š}Äønw¤,(ˆÂÕ¸°õ£H`¡9O]•ëØÃ'®¦¢ïB§s2U¯cƒ€‚//>¯öÖ|'kÞ”k^ì%{# k¹rH;˜e¾+Ö|ÇwÇk¾(kä!3ÂíàºE™7§Öê‹2amÏùð•K£¯ûx®O.M€Ê!µ…TGÛ7ÖÿQ¶ 6.š¼¹…[»9HÁ‹¦.0(XxŠŠ“UÄ ö†?Åþnƒ-=Ö{cÐÛЋý|’N˜k €´ƒÙÞØÐ[‘0\ {c':!ÀïàR{§Ó ëöFA'ì~P|vj’újŽiФ/>+yý´À¦ß¬;®^*?œbÊá>†D ŒP‰©qã$%š-§kŽO¼·+.–^ÁŠ]q‚~ê],Ù±?ìQÒOs äv0ÛW¢ŸzÇw¸‡kaWÜD?%ø\jWðtúi^Õô¿´hÊŒZH*ªñã4âw{¤ÇøEZ°QÁ¼à/z_â/z±±ê½ä/æÈ í`V0_â/zïD’¿8ÖÈ#düEÚÁ… Îæ/Öã95üEV¢­;´>ê'ôêî[‰BÅg÷[ÁщwoóRÃA¨;7êLÍR¶í*Iå’ÑomLÌ&ÁylзÜÝÁVÄGÌ·UV¾ži–~ú‹K㫟*Žã÷ÇýD˜£c `íJïk×3Ç’·!}ØÞçý÷5"k¹ô?¿|üÝéðG-IP4Ï:“¢íǨ*}†Æ²(4¸q’ðÝŸÃë*‡9žwÓ:Zp YÉ:6aÛ$LÑ,>¾„màéŸâò6t‚˜º13ˆ­¨ÐIbf®\Ò¦%lèJÄÌÐYÑ$fŽ5ò1“vpÝ6˜îÔ¤(zŸôË+ójcø—à­àÈó~"Ÿ8 âÓŽ½¶Æj«. ÿæ~ ©¾ŒÐ$Ü­Ç‚S¿E†¡…hÔgFÆá¶uØÓœÝýÕgo|Wd«]NâènAX.&Z°Ñ~  "D,¢ØÙ‰(‰¹rH;˜í–ˆè@Æy„Œˆ@;¸Ð~øGˆû¡âóœ’PrëÜõäH"`†N[¶Ò—¦&êùp_Å]Tlº«¶óê ¶‡ÔÝáõ§£DÜÚBgÜÆ{¯3+xÄéR1”N—ŠbÏ.yºT®\Òf¼¥Ó¥bÑ<]j¬‘GÈN—¢\ˆ÷ñê‚ê`QÍÁyš#Õ5ÔR*¼™m!«1‘îr@¿_*\ɪOÍ¿mg»§nË[¼ª“ƒã>_DšÌ„ß> Ÿþ2ÞBr=t´àñEx¬‘ÿzšÌ[TMlSõ&ë<¾ü KnqXѶRˆJu«GÊ”âɬý²ÐO¬j;ÌuýSßhغíoÉP§3+xS›çÔ&WâÔ&Ç9µÃ5çÔŽ5€µ*=sj“+qj“!]rjÇ‘µ\úuœÚ„o Óªƒ¹-5¬û¾úËY)¦4iœN1&Û­‰ž÷’XÁ£úDZÏ×XÒ'øŒ÷AêÓPX{ Ò'}òPÒ'o…t+õi¨YûÈ¥_¨O¡{DŸ|$U27Í*WÁoËeVe¦Ð0£÷ÐË9TÅöƒè–ì‹é\{×ôrþÐ&NËýS\vT¥(8˜)–8˜)òX“áš;ªr äv09ªR,q0S4¢ÉÁkä2&íà:GUŠéüj»†°?V×ó?ÁÁ)OŠ9Vi©ÆÝÿuŸC>~ç&r\ŒÚ™º&K¬^†¥K¬þ¯p¿ÄêK‘.‚Æk¶ÄÊ5€µ*}\bõ5÷K¬ñKïø+׈¬}äÒ/[bõˆ@Ô·4@­uû]¤êÖ¬u´àà4@d¾ëuh9 PÓ§¸àÿÃnCÀÝ7ÿßyþ?»uÚ fÃÑÔO¬àQc„1 Ec„1 wÆ4LÆ40c„1 Ec„1 wÆ4LÆ40cžÂ˜†›êBßüä¾Îÿ׿3ÂéK¬àQ}J†ëS²%}JŽÏøä¤> 5€µ*}Ò§Ô•ô©ÿeÒc’ú4Ôˆ¬}äÒ/Ô§ѧoþ¿wæÿë_øE5¸²HÁÁþ?2×Þõº’?´ìÿ+<ÅEÿóWô…ì})‹#¯™ÿoª\Ò²ÿMWÈ^Ñ—FÞA'²Wäã;š½‚up™ÿ¯…?¿§—¬S6v¤oÑøØßÔÇ£*>mû™j{ȯm·û‰u p´àÀìêàØœ^x}ҠƱÛ6æ‘i…Ä[NXó¥×¶Ì6 `†BоÔrÜ+ì„ÄÐ1`¶I³-$ èKïÀ Ì6LHl#fû (p¸µ“Y“³'\ç’¸:ˤ~|æÔ³&‹$KsÇ·£~§f+ÃÁýZ‡ˆÃ}Gt å[Hâ¹ö÷©ô WÓEœ®Ÿ lh$râ •.1ätQ §+ägèK=ïÀy‰œÎOPéCN÷ùúÛw'#çêÓV]E¾I¬ààÔ=ä¡Õó²îÉĨYQ7ÉТHS¦9‚r!t½.­îéh{ÒpS†ÄWŽÝBÏzìNF*ÞVãé™ñÃu,xXØS0yOxIÇÀÚ•ž=¬Æû‚‡Õx¾2\sëX#²ö‘K¿ÎÃj¼¨óoÛÿ­uû}lÿ›@Ž`v²oGoÿß&ì»vÓò‡6mÿ·|ŠKÛÿö-„b’«¿Ô·Ë?ÖT{rKúv,§Ò>W]E¶ö%» íc­MWwŒVG`êªþK5Сš0Áè¦íÛQ¡S ܘZ(Së¸1µNÓ±°ö@¥gcj¡dL-pcjAÓ±Fdí#—~1µoa5¾x[§~ݤJÀ¨a³jºÓvCë–²a&ùmöÐ’˜ÛZð¨R’Aù:””ù.¿31ÅjkTú¤”oÙ}x['¤;©”CÈÚG.ýB¥|K7ÓX)ÝgVJMîULÄãäéQåH2“-xTår• l_¹R„(U.ĬdÁS• ÈU.h°})é U.@V²à¨Ê…' Á¢}ËÏÒVåTŸ›š€M~èË·"pÁmT9’®Àv¬àÀ¯¾ŽÏ(ÍûTA›;_›ˆ·4}fò×öR&Ç‘2Î}iàX–‚DÊ26&¤H™GÊT 8÷¥VH·)“ÍØ˜€"ez‚3§¤‚”Š£­L¨jÉŽ½Eñ¶t  ÏiqÐA£Oèg"-xPKÁÓR0® ¥ÐÏRªG0æ§š6ÖÖ¨ô¬¥`lAKÁ!Ý-kDÖ>réj©IÇh©f_wŸ×sÒ×Iõó¡ž'ö|€%ç¥G Õ'à4€M„' @ÒdÆÀÚ•>é”h2.i2cÈÚG.ýB}‚xŒ>­ò³ëû ¾!¦ÉþÛø4šúýT5º滲…i¾ì ¢C:GBàœ·‚GA9w°Äᙔܡ±°ö@¥O ƒ%î8îU®ȸÌ"í#—~!È`8dÇÅ,¡àµÍܼ'Fý‘3[ۆ͜„¦šx*Ͷ¿*­õ5')ޏ‡äx\Ë ¶EcB#%‚ðDÕã5ÆÌ5 @ÚÁ ¾D0Ï FÃ5ÆkŒ#ôŒ`D;¸.Âã$kœzè0¾O`tSf7Ç`Ü~ù~~Ô;>)ë“Jñ‹jÔ÷Ú}ªNÞz›™„15¹k³1˜aAG ŽóÅ1Ì9ëµ­=´o–{ËÄóäË Z_š8+¦; ¤ § A’´\¹¤̦;–(h9m¸¦;N4"€ßÁ¥¦;½ñw®7ÝŠX†o¦û½šîg6Ðkfx«yL„.6d@¸ÈË žëõ7tÇåãï¢_R8'_Î^3×Eæ5s]*x͜،ry3Šx¾ÆÀÚ•ž½f® ¯ÙÀëfÒ;/¼fcÈÚG.ý:¯™33S­±Uj{àêWfaÚ w„Ùæræ:g§F9Ï&îÁç,ª8õ~63FøãünF>ßGÓòàgKÁÿNl;:Áÿc `íJŸÓ–‚ÿå[¦Ãµ@N›ƒÿIûÈ¥_ˆœpLð¿j³ñs9ë+‚zΖz~ ³–Æìþf ""‡Æ=pÝFë·pÂ!؈<Šn޳(œ+±(œØïtN²(ÆÀÚ•>¡›+±(†•.—.YcÈÚG.ýBtÃXmÖ¬šþ…sÎ4G9×ý%š¯' ê<ËÂp×Ó©[ ‡Y•Lo—6‚Þ¢-¡s´à@ÏC縎jh š,¦-òøN¬átƒŸ?ùÁ7cÛ¾Š%~µ‹o¡'ugìûL¼îWV¥_°Êu÷§TµÍ”Zg‹ÚE’ jع<¸Ô@×hJK 4|©1\ó¥ÆXX{ ÒóRMi©Æ ér©1Öˆ¬}äÒ¯[j ]_j,üÒ65êI ŠúÆôe,jU*)Ívìû¶H—¯¶¾Þ,3h‰ýö¬àÀ¥”çtÿ‰^7Mš5ìö$6÷ˆ†‘8`Ã"Ë‹—4næð—ôˆ%ÎÃF(ñ°8{¸–2›´*}²¤Pâa#€.yØcÈÚG.ýBKêÖyØ*KÚö` „*>¦ëÒîaêN鯇yM†“ÎJlUŒŽ•} ÛB“ú<4©ÿ§š„È#‡†kš”k €´ƒ)4©WôBhR¢+B“Æy„@C“h×…&¡ß€Mq£ñ¡Hwëßw©< 4¸Q­Æ`ô„Zì‘lÔ«B¯Bá8ྔ§6®…^?)RpL¯Þ:˜õ*ŽîKèÀH½ fR¤`™^‘.Ô«°Î#>M¯46üN¯žÆ@7Ó•HhÃãú6vût%Y¡+ Jº’Oå„RWÆÈ í`Ö•dJº’:ÑA'ue¨‘Gh˜®$û º’Ö9ÂgéŠ*ïЮ4ͭɃ}?¤VJ“ Ö³‚mJãáJã-(7ŽÍi?ú5é¬Ï5 @ÚÁ¤4Þt¥ñ]âtI(ÍX#°£JC;¸Ni¼Y缞¦4Š4÷3T“ÄY‘Fº•&xCN^s<è ñp3LùÚ¼!^ø+|öWÆXX{ Ò³7ÄÛTð†xË}-Ã5÷†øÉÿAÚG.ý:oˆ‡u®¤F9g¥«·ÙqäZ}õuRÄVã\ÜuМŸ°v§ÛÜžäK¶Ãé^·‚VÏ &•Ç“Ê o‚GɤÊ5 @ÚÁlõ\‰Iå÷‡ ×Â깉IEð;¸Ôêá:“ª­b7vW|®‚â½Õ³Ñ÷iQc¾Õ;ª¼*AzxV¤‘ʋó¼/žå…Æyx–ƒ&ÏϺu0#•/žå=÷0 שütxÀïàR¤ ëìšÓª)çsAYž†`¹°ë­AÃýð]|ùlÅ ’Fí ’Æ³‚1¼ˆ±„ÂGå'Qø±rH;˜ñ"ú^Dîe®^ 5ò=Ëž/Ò:§ä,¼Ð|æ,$–» "­êÛ:jLulur¶ú š<ÕWlõ6ŠG¬âä(N9Øcs4\ŠSÃÚ(Bù's±µI6n×/ƒHÁ6Ô稺P@í œ¤ar’Þ`7×@.ij‡ ¨:':pµÇy„HQ›vpjsL« µ[xaŸðƒ®•Ã6䨑<è° –‡¯[ _ Â¥¬ _kkTzvØ[ _ „t¾6Öˆ¬}äÒ¯sØ8&|M¥UêE=DÜTÓC=!w=ñ|´Ý]j”ú/ï:jx›6lÜÖZ°Ñê94\)h,'ip2h,×@.i³Õs¥ ±à¬è@5òYÐíàB«‡t²©¶6öÂn7rõos÷cõ»£úËÕÖu«¥DE–hÁFEó"Š,øRY>¾àeY®\ÒfEó¥(²àè@F‘5òYíàBEóÇD‘©MEv•¢í¡õìøª^û°Ûª_$%² ŽlÔ¯("ÏB,Ežá QFžåÈ í`Ö¯XŠ< ±Èȳ±F!‹<£\¨_ñ˜È3~µ=`]³T]è§î¹;b{Ž”…Pí“ÎÑÛÌYÈjKÒ¡B—hÁ6µˆ}‹])ö- §Hìdì[®\Ò&µ])ö-$áÖI2öm¬‘GÈbßhשm?ÈçQ[ͦ4‹ªiëµndë'£k´T“Áè.Î[E«:‹ö=±6BW$Ù2‡sHÁ]?½üôú[¯•7+(íOk~[ð¡MZ‹<Üþ÷f©¿¿W;ošO–­ô"³®„ÂζÈÞ狘NJ*d’€¦6“™¼Sìz¶ÛB?°6ÉJcû<ÝéýAÑÕ s¦Ûºê`Ítëw78Í­’øPýÅÕnÃÔ¥UÛLºbvÝ:9iQ;á‚韹Ãß›~è|6Š^ì?½þôòÿfêæ endstream endobj 307 0 obj 9884 endobj 311 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 778.250000 182.250000 785 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_shared_ptr_basics >> endobj 312 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 771.500000 207 778.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_shared_ptr_inheritance >> endobj 313 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 764 230.250000 770.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_shared_ptr_overloading >> endobj 314 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 757.250000 203.250000 764 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_shared_ptr_templates >> endobj 315 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 749.750000 200.250000 756.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_shared_ptr_directors >> endobj 316 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 743 162 749.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_std_auto_ptr >> endobj 317 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 735.500000 110.250000 742.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_nn16 >> endobj 318 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 728.750000 132 735.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_nn17 >> endobj 319 0 obj << /Type /Annot /Subtype /Link /Rect [31.5000000 715.250000 95.2500000 722 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Arguments >> endobj 320 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 702.500000 130.500000 709.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Arguments_nn2 >> endobj 321 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 695 135 701.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Arguments_nn3 >> endobj 322 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 688.250000 148.500000 695 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Arguments_nn4 >> endobj 323 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 680.750000 153 687.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Arguments_nn5 >> endobj 324 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 674 168 680.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Arguments_nn6 >> endobj 325 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 666.500000 161.250000 673.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Arguments_nn7 >> endobj 326 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 659.750000 164.250000 666.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Arguments_nn8 >> endobj 327 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 652.250000 173.250000 659 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Arguments_nn9 >> endobj 328 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 645.500000 155.250000 652.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Arguments_nn10 >> endobj 329 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 638 204 644.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Arguments_nn11 >> endobj 330 0 obj << /Type /Annot /Subtype /Link /Rect [31.5000000 625.250000 69 632 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps >> endobj 331 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 611.750000 102.750000 618.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn2 >> endobj 332 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 605 147 611.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn3 >> endobj 333 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 597.500000 131.250000 604.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn4 >> endobj 334 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 590.750000 148.500000 597.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn5 >> endobj 335 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 583.250000 153 590 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn6 >> endobj 336 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 576.500000 194.250000 583.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn7 >> endobj 337 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 569 197.250000 575.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn8 >> endobj 338 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 562.250000 221.250000 569 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_aspects >> endobj 339 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 554.750000 164.250000 561.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn9 >> endobj 340 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 548 134.250000 554.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn10 >> endobj 341 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 540.500000 154.500000 547.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_defining >> endobj 342 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 533.750000 146.250000 540.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn12 >> endobj 343 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 526.250000 154.500000 533 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn13 >> endobj 344 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 519.500000 154.500000 526.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn14 >> endobj 345 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 512 165.750000 518.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn15 >> endobj 346 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 505.250000 131.250000 512 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_pattern_matching >> endobj 347 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 497.750000 158.250000 504.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn17 >> endobj 348 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 491 180.750000 497.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_typedef_reductions >> endobj 349 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 483.500000 187.500000 490.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn19 >> endobj 350 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 476.750000 174 483.500000 ] /Border [0 0 0] /Dest /#06#dd#0f#40#fe5f#c7J#c0#bc#98#05#d1#a3#d7#1ez7#f3 >> endobj 351 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 469.250000 218.250000 476 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_matching_template_comparison >> endobj 352 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 462.500000 203.250000 469.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_debugging_search >> endobj 353 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 455 130.500000 461.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn21 >> endobj 354 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 448.250000 120 455 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn22 >> endobj 355 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 440.750000 180.750000 447.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn23 >> endobj 356 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 434 148.500000 440.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_special_variables >> endobj 357 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 426.500000 167.250000 433.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_special_variable_macros >> endobj 358 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 419.750000 180.750000 426.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_special_macro_descriptor >> endobj 359 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 412.250000 219 419 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_special_macro_typemap >> endobj 360 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 405.500000 211.500000 412.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_special_variable_attributes >> endobj 361 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 398 253.500000 404.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_special_variables_and_macros >> endobj 362 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 391.250000 144.750000 398 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn25 >> endobj 363 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 383.750000 136.500000 390.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn26 >> endobj 364 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 377 159 383.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn27 >> endobj 365 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 369.500000 140.250000 376.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn28 >> endobj 366 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 362.750000 148.500000 369.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn29 >> endobj 367 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 355.250000 150 362 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn30 >> endobj 368 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 348.500000 147.750000 355.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn31 >> endobj 369 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 341 149.250000 347.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn32 >> endobj 370 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 334.250000 150.750000 341 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn33 >> endobj 371 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 326.750000 153 333.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn34 >> endobj 372 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 320 142.500000 326.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_ret >> endobj 373 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 312.500000 162 319.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn35 >> endobj 374 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 305.750000 148.500000 312.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn36 >> endobj 375 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 298.250000 152.250000 305 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn37 >> endobj 376 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 291.500000 153 298.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_throws_typemap >> endobj 377 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 284 138.750000 290.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn39 >> endobj 378 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 277.250000 158.250000 284 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn40 >> endobj 379 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 269.750000 210 276.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn41 >> endobj 380 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 263 176.250000 269.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn43 >> endobj 381 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 255.500000 202.500000 262.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_optimal >> endobj 382 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 248.750000 139.500000 255.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_multi_argument_typemaps >> endobj 383 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 241.250000 125.250000 248 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_warnings >> endobj 384 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 234.500000 128.250000 241.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_fragments >> endobj 385 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 227 183.750000 233.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_fragment_type_specialization >> endobj 386 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 220.250000 237 227 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_automatic_specialization >> endobj 387 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 212.750000 144.750000 219.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_runtime_type_checker >> endobj 388 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 206 147.750000 212.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn45 >> endobj 389 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 198.500000 123.750000 205.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_runtime_type_checker_usage >> endobj 390 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 191.750000 147 198.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_overloading >> endobj 391 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 184.250000 315 191 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_typecheck_pointer >> endobj 392 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 177.500000 157.500000 184.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn48 >> endobj 393 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 170 160.500000 176.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn47 >> endobj 394 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 163.250000 120.750000 170 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn52 >> endobj 395 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 155.750000 165 162.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn51 >> endobj 396 0 obj << /Type /Annot /Subtype /Link /Rect [31.5000000 143 107.250000 149.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization >> endobj 397 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 129.500000 167.250000 136.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_exception >> endobj 398 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 122.750000 183.750000 129.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_nn3 >> endobj 399 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 115.250000 193.500000 122 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_nn4 >> endobj 400 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 108.500000 169.500000 115.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_nn5 >> endobj 401 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 101 189 107.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_allowexcept >> endobj 402 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 94.2500000 201 101 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_nn6 >> endobj 403 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 86.7500000 190.500000 93.5000000 ] /Border [0 0 0] /Dest /#10#ab#8eZ#aa#12#d5m#ed#ae#c21#82#d4#29v#9eK#ec#18 >> endobj 404 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 80 193.500000 86.7500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_nn7 >> endobj 405 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 72.5000000 163.500000 79.2500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_ownership >> endobj 406 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 65.7500000 166.500000 72.5000000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_features >> endobj 407 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 58.2500000 150.750000 65 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_feature_attributes >> endobj 310 0 obj << /Type /Page /Parent 2 0 R /Contents 408 0 R /Resources 410 0 R /Annots 411 0 R /MediaBox [0 0 595 842] >> endobj 410 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 411 0 obj [ 311 0 R 312 0 R 313 0 R 314 0 R 315 0 R 316 0 R 317 0 R 318 0 R 319 0 R 320 0 R 321 0 R 322 0 R 323 0 R 324 0 R 325 0 R 326 0 R 327 0 R 328 0 R 329 0 R 330 0 R 331 0 R 332 0 R 333 0 R 334 0 R 335 0 R 336 0 R 337 0 R 338 0 R 339 0 R 340 0 R 341 0 R 342 0 R 343 0 R 344 0 R 345 0 R 346 0 R 347 0 R 348 0 R 349 0 R 350 0 R 351 0 R 352 0 R 353 0 R 354 0 R 355 0 R 356 0 R 357 0 R 358 0 R 359 0 R 360 0 R 361 0 R 362 0 R 363 0 R 364 0 R 365 0 R 366 0 R 367 0 R 368 0 R 369 0 R 370 0 R 371 0 R 372 0 R 373 0 R 374 0 R 375 0 R 376 0 R 377 0 R 378 0 R 379 0 R 380 0 R 381 0 R 382 0 R 383 0 R 384 0 R 385 0 R 386 0 R 387 0 R 388 0 R 389 0 R 390 0 R 391 0 R 392 0 R 393 0 R 394 0 R 395 0 R 396 0 R 397 0 R 398 0 R 399 0 R 400 0 R 401 0 R 402 0 R 403 0 R 404 0 R 405 0 R 406 0 R 407 0 R ] endobj 408 0 obj << /Length 409 0 R /Filter /FlateDecode >> stream xœí][¯$7n~?¿â<ðqIu‚  ÈC‡À»›Åbg‘Ù}ÈߪT=M²¥j5».}.;XÏ”ZEªªÄO”Äúþ_ýïçÿùÇó÷?þú¿Ï¿ÏÿøëÓðp(ÿ{ÿ|G l|™ÿý">ÿþåéëó×§_ž~ÉÿýúTnøõÇÏÿú¿gûüoùÿyþÏÿÊ…˜+¾<òßþNÁä ßþËÿüôÿôü·QâIÝÜ~ýMÆF\Qüõéôfúóßÿöô}yü[t`´þÙ8pÏ&9ûü÷?>ýi|ª~§V”J´ç0—`‡uO¿¸¥?}ûÅš}îi·mø±uÏË=gÅ©©Ø6Åÿ4ý‚/`£á¿4ï1®õ‹û¹y4[àšØn[ó¥À xòE8À :« ²j¹÷§ß²±;xÍRr?ÍÝÔóË@㌡}úõ>#D{¸úS{d#üéÃW1Â…' ·?Ϭ§×ļùfb"-Ml›þ?*¢ý@š/ ÝqÚ`áã´[ÐüÔšÏv ˆ¶ók‰“1xùµîÄì´ ˆ!½j@´ÍÁô_ ÆAâ·‚ÍñÜÿKï3pzk=àÖü PéÕ¯³ö©ÛÒ>Õa料lb£ÛŠý_3Œ“>†pÑÇî‚ñ4ãù_5Œ7ïù€ñ×ã) ÿV°9Œëÿ ¯³ýA›Ðßþlmd\øжuÏÞÅÏΪò܃riHG£\2áu£\û+ ÜkA¹d"G¹sÁÖ(Gú¿Æ“Rt‚˹sû;6ÂÅ7}óSíÍ7!̸ì£%8û€syÉ~`ž†ˆå_f,…|æ]ˆrý{ü‹1ÉÆxª\Rcý±À¦rÓ3»}º& òõxiÂXcjáY‚ߟþ,}6hÇ~þqpX© 3”ör‚¢ã”£Ç‚«£=Úm¿üö£·D1=T9[?uâÑhÙ Ây$@O îp¶üîìÆM×8Ì0ãýŒS©}öømKyºþýÉ»gÌ\Øý@¥çÚÓuœ1†Ýë—ž¯s}ª¬Ùý‘KÿóÓ§Ú£â0Bâ6¥€(½×˜S÷íé£Í¿°$£XP#ø¶áâíæÙÞë\XsZw/áþ™Uœl˳Hk-èô=|¾‡O5ßcº&®A¾¾Ç7gƒ@ªàä{øPó=¼ç òµð=Æ¥…ùDÁ¾Gp;öÊ!m=?HSll\­åO´m¦=·§WÍ·4ëéTž mÜn;Ü?½Š­!ãù;? I|ˆæCÖ^Ljv¬[è?wÿbÍôþÉ=6ÓKð(ô|nþRÀѸ“¸ó/m7´©gökPÛ~ÒÏÍ'½æp×ZðSóÅ·¬ýÒÔ3¿ëŽaàÙg1g¬à>ϩǗ¯Ó¥Ççg¨O6]3¯Ôv?Pé“Ç—¯Ã¥Ç—K=—ž{|¥Fd÷G.ý0/?yÇÀÐ ŸYä!4{›&„¢=˜ôûu #„f]\3]ÌE¯ µ¡©íž*üâ½ÜÓùkt¹š¹#ÓÐÒ‚.WÓ˜«™ ⥫é?POpºf®æ\¹¤ Š«™ ü¥«™K‘+È×ÌÕ,5J =q5™‚Ã\Íüø°3¢¬ìjþÐüE³jÒž|)"ÚnXrÖ{°}Þhîîl‹ÑÑ‚N[ ^Øb5[ ‰›J¾¶8Õ@.©‚“-f¹b‹yÚÄ8i‹cÒBd¶Hh‹Ñ>Ž-j‚p¶¸°ù¬Y¦V¬Èjƺ×`Õ+UÈiï’O1þçõ]khA§ñ'ÆŸ|ÍøSä¶™¢4þ©rHœŒ?¹šñ' @ÿX£´Ð1ã' Ž3~3tPgv2~MÀ©-£‘±§Ÿî2äX8ÌpfÈ-èƒc‡c° Æfµã5‡…R¹¤ fX0ùå^‚1V(°¦¥…@a*8l‡!ï šÆÃ}h¶à²ÞdYÂ8 @ :! @@¸dçˆ^BÖT¹¤ N¶Y`„#!k¬QZhdBtÐmö‚¬u·²o`¨^ é¿-˜G gcó¥4QY©†®¦À½…7º.†Ý†:ŽÐziÁ»%Y<Û-1•Ý3ê$ûfZ¤;S `÷•^vK šÊn‰ÉoŒKÄnÉT#²û#—~Ün‰Áˆˆk#PöDÌðâƒáû†íñ\˜ë²D].i*6Ø/V±T»à­bwÑXÅÖÂ[jKÓ|Ò½¼SÉÈ[ç6»¤Ý¤U"22O?Éâ¹â+#|Å`k¾¢X‘6óŠ4qö¦È UpòÃPó=_S¯…¯8Ö(-˜¯Hè+†¶Ëª½òö“iÁúBpãªL,Õ–úûÃê5bÕ4~æŸ´× „«=-èIJ4,KÆH.å ì&IJ3x%ð, Ëb…1’KùÁx-°,žÀ+&†eé#¹Œ‘½°L³}× m{ÇððÐn›©&Âä€H úp‰ã„5C'¬Xq·óŠûÙÐK ä*˜q±‚#S—)‚À‰©Fir¤8A‡ÖtÐ6v ÍNßÇTöíáßaSÙvc›Þ6ï&9O€hÍ9lɤ’t—õ!`TÄ  =¦_4÷¬EÛ=‰=fpHë¾ù%þÃ8~sç¾òÞ›L‚6+`þеXèOÍnl[÷´¹ mþCûË·õ˜Ô»d’¿’!Ñ‚;×¹m`Û•5ËAšåÄÖIÍ*5 @ªà4pBšå,ß|¯ÅÀigjÀŸàЮS³v8Û9‰ÏOªaÆß¬8qà¯U»F7ŒËý»T*?~ë#2²¡–gw†Fæ‰ txâUÑÐD‡À‚Ý´!EçÀî*½„F:w"U±{]äÒ]¡‘SÈî\úq¡‘¯s²T öæ:n8ngÿV‘Çd~nXNÚé쀛øéŽd7žâšÏN\-j\-'6¸\\­R¹¤ NN¯qµÆó™/¹ZSÒdÆÕ¢ t‚ÂF¡Õ{ñÓ •à¦Ír•Áµûý^)’ÞTjù^׃d^†ì¯“‚Nœˆ"VÜÅZ¬¸4.ÉXñR¹¤ N8k±â.ò-¦ñZàDœcʼnþ‡âDÚ(V|¯ôDoÔ7¹!ýêsõÚd¢àŽôÙ$"‡X±I óhdx©\R³MâP Ço-Œ×Ü&§¥…,œ*8Î&Ñl¾ÏZ“¡Ý‰cS¿ËIúãi`>t‚€îhkî(ÑÊ÷R¹¤ N `kîhP #ܧ¥…,Â*8`£w hò'+xU²(Í4ø'îÆ ’s¸àÜNDÅç¯Tà ǣâÑɨøR¹¤ N8ájQñè@(QñSÒBOˆ¸QT¼'4Ñ=m&Œfcÿ†S95 ’ÖÍà¶Ó>ÈÑrÏ¢b’Q¼§wnT 9Bª\ce£=ϲ€Ób Ýl˜j»¨ô²Q*è­nÅFÅT#²û#—~ÜF†ëË|üù`Õ½NVÝJ[Ðmâ“ÊI¼eIŠÜ‰ä{.ètm¢ˆNÇX‹NG±tˆQF§—È Uprmb-:£ dtúT£´E§Sº6q›èô½RÊØŸpt­ïÂ×ù’‡’â·µà-èC?ˆXj?Ôb©½XðôƒŒ¥.5 @ª`F?Ôb©ý02–zªQZÈb©©‚ãÄÛÄR¿•Œväªf³uÕˆ³ÇÍŠÕ…Þ7Eþz’¨œ¡ÛEþŽŠ˜…¼Â±âúû¯sÌgékï÷ [¢ëm-D׋µgoeˆn©\R'<¶µ]oøêùx-ðØÌ!ºD‚CñØn¢»×DsÝè”…ó¢Y‰zUkGnîc¹¹Þžcq\6RÐ «Näà]í /–꽓9”È Up‚U¨äào6Œ×Vá„£Àr  „U·Mаêžk{†½Ë‘ˆÒÁЂí|¢Q{¡ ,ë"tGàsÓò5‡§¶ã0Úϳ×~ÉÌÈG¶z1UôòñpœTëöW0E uvvk˜êy µ÷2ºÔ@.©‚¦b-Ú#¤¯¦âHMð'8Sý6Ôª{4ùÚÐõ }¢ÞA߃lhÁ†ƒFXÙÙYSQÖò4'ƒ­z ïU>õæ\ùv #”$Ïé$C½ý‹ªÕ;ܦ‚û§Â6¿<á´*sa¬W†º ¸>Ô¸^l‡ù(¹¥rHœ†ºPãøÀ7ôÆk1Ô…™ @ð'8t¨‹ÛpT÷h²A)VeÚÉ’@Z“çà#;ç݃z$üiÁ–«ã‘[†fðû1Ù}µ?òþ2’5E¹#jÌ“ Ëu¬D…q q]a‚wù5Õv?Pé%jÌ'_‰ó ™ôñšGM5"»?réÇE…aŠ‹*R]CWQì˜.aè5K+š¡ãiæ¯gÑ;NÆLO‚°´ Ïi Fðd‚©ñd‚Øé FòdJ ä*˜Ö`j<™`œP y2SÒBÆ“¡ ŽsZƒÝ†'ÓF’Ýbߟì9rÑ:¤½«#@ÕÄFKÉê(5 @ªàÔ«¡ÆêBduL5J «ƒ*8°W»mXª^­9’[1»Ì}²WfÇug`[œ [û,í!®Ýêþô2 âÛM’GŸ­ûÚÒfñ›ï~wŽÑœ‚ŠÎ˜‰âЈ€µC#‚ØH ((5 @ªà„™X;4"  ä¡SÒBvhUp fúëãð^˜© *jz'ªúûAÀŸÇã IA'Á ¡Æ b‰9É)5 @ªà¡Æ Á’32Õ(-dœªà@qF4  YŒøG›¨C$ti0JºÇ Ô&òn¯Yнè&ŠÏÝ€)^M~„q¿+åâ¬B–”†gÌþþǧO»£µnüi#¾Éª(tÇBFÇÖîÒ9ÉFO 6ŒÃÈŠè'Àö‹Ö¬â^ÏÔ¥4M`ERuçšmÛvãÐao¿áÝä4§býætˆC:¢Ùˆý°:(„ÚFøªv¬Ûö£ Õ¤.WìI9hbÈMpô?lx2…°™­ûË«Üàï†W'¿#f<¬|ÇåÙjA؈P#lD± A6J ä*˜g«ÑÖÑò}„ñšÏVãizJð'8r¶a#†f$Ф1{…³ÕÎÉ\Â;ÁH 6t]1ò^ñF¦ÑýÊšã× ~@¯Cõº4c’¢i(·)æÆšˆ‘>si½WF8'è3kô™(öL"JúL©\R§ÎÕè3Ññ]ŸñZŒpn¦Ïü áp#úŒf„ÓÄ¿á½áp’LáνâÝp«ppÎøÕu±*çÎëÝù¤Ÿ½“Ûœ–‡ß¢pøåÉ—ÁÝß¿9Æ`Gž—ëT‰ã5‰ðŽÓV,sÄ8¹¨ô?}¨ÄÇ)*‘ŸjDväÒ‹a#ª’f¬‰×aºnTõ™=ð²ëMå¹ãÍcVÐ9c‰âô•cmÆ’x*¿ñZÌXÒ|ú €TÁiÆk§¯ÄÈ“Ž×bÆçÓWˆþ‡ÎXÒFÔ”v¿_5 Ü2…Ì–û\Ãi¯ZzgF‰;¦Õƒt¹#«ç¶˜†¹# œÜ1^s[,5 @ª`¶Å4ÔÈipB$wL5J ¹ƒ*8Γوܡ±EÅ®ç‚õlk#·1oò³(x—è 9úd$šž :ÑÁ ’L²5’L›[ÉJ’L©\R't°5’L² H’ÌT£´‘d¨‚Ñ6"É(ÐAð½`=Šü\m»zŸV gZ†M‰tZ©´Œäj´Œ$è““´ŒR¹¤ NVêj´Œä¬P iSÒBFË  ´R¼îÍîf¥Šˆì¶õ¬›yoå3Š?Ѐ¡ ~ƹ  ¼àg$_ãg$ÏùÉK~F©\R'4ð5~FòF(üŒ©Fi!ãgP¢ßˆŸ¡AÅb߬šD¯œÐï !Œqç‚N4ˆâ\Žkçr$±–¢<—£Ô@.©‚ÄÚ¹)B<—cªQZÈÎå  Dƒ¸OBƒŠè€ëù˜€og¾‘“a"-è2ß2óÍ•cr)[=›®™ùÎ5 @ª ˜o.¨ã’XÿKò‡©Fi!=Æ)8Ì|s+6"2hÌ÷‡ví?¦ówÚ|îj‘ Ù¬ Óæí lÞVBÖs)p›· mÞÂläÖ0›·ƒ°yS YÏ¥‘+0"d½Ô˜Zh³yû!ë¹…¬klþóš6¿p¢•"{ñ‚±¬Š-ï ,ÉŽo-èDH \%¼7—Zn¬ÎJ4pv6704€$Ð*á½¹4p$@˜Í"Cx€ðÞüÔ…÷*ÐVί›Æi/lyŸhàλí@ :Ñ£@¬$_{›®ø“ùcbh€Q VˆçRÏ —h€~6 ðˆçÇß;*O:Š˜æ»ÒØï‡oÏìדз<£&ö‚°ßP } _-›®…ýÆa6X"©‚“ý†Jè[.E®  ´ß€³ÁÏì7<@è[~ü×ú¶nPœ&€TÅËØ)eåûDxÞ«‡Öv?Péó `cm°K·AcÈî\úƒlE­àGØÒ=ýԃŨҌŠlª·¤ÛÕÕFE+‚ÎUÍ4mÕô“ ¡ò¢ìµtb$Ð@ò@ 6<À/+¢°n@ñBH☙½&ñí0ÊË…»5ò(/x×:;Î;ä=)ÏÁ¼“]ëžá×E>üºJ2á`Åv¢E#‡_œ\—èðë"~]%™p.å[¡ãµ~/® tøuL8?ù6´ !É„£çð¹… ëúö ϳגäMcžÃG_’lxZ‚ ¬¾ÍE*ñ:Ç-X/ßï=éHk9BK!lÚ9e 7Öv?Pé3@z_H\ºG cÈî\ú¶á…¬ËÑz]ËW ÏXµ9º—/wÓZD ù•1Ñ‚{m=znë1Ôl}ÌéL­qÚõdö:Öv?Pé³­G¬ÙztBº“¶>ÖˆìþÈ¥hëiǺ|®·bë Z¸f q7ê&Hç(Ë<êÑ‚¾ “†“Îä€A29J ä*˜ƒ(`¨19`¡@29¦¥…ŒÉADf&‡ÆäW> ¡ ¯Ô¾nÚWCR G NY²"Ú¥¶NtÿºkJ³¡{ñj“ÅÜŽYïQcD…«u±+nlˆ3&ùak%§Ô@.©‚†ÛgÌ)ÆH"ÎT£´q¨‚1®ãä`¸†xûÖ0üàÃ{ ³YÁ†{!VôeEä…7¯9Žm]ؽNÞó­°fÜÏÍÕ‹&˜º¡Õ6 ­_Lj>Ïç–b?µ~ÑHÃæm¿ƒöó´yHí¯Íйö»n?)@Ów»i'ÅYúï€lHowÀÍ·=Ljø& òšQD3ÅìW¬á.œjDväÒœ ºmøHë&Hm3•TY48ÞNïÕžÛ®š|y!j¥ ƽØî£%Öv«¾·0%w}Ú/å‹Ucôý[?ÓäÓ‘ãhœ£÷B#r&’ÃXƒFÏ™HÎK&ÒTØý@¥ÏЈ5&’CÎD¯4ba"‘û#—~ 4ú½™HšCâfi×’y\d$ì zY—|ݶlÍ6ÎÂ= ú·†¿ôLqž&ÙÁãz‹íŽØ‰•ž¼´à^¬ œÉåBÉågr¹ ™\S `÷•>ce¨1¹\pBºdrM5"»?rébeܛɥÊÎÝ\O‚Oóš È ö/»åóocñ¹ù¬³ èë&•\É—Š„ãå-¸r|H¾†bSЕMAjãc `÷•>ãCr5|HbC3ć±Fd÷G.ý8|ÀaoÚ—&)a{5^µæ³êTj®J¥v|Òý–4À·îÛÙ> HÁ·¸s8s•<Ò‚û·*b ŒF,‚oámŒh?}jöÎØôý?Ï>DkG¨íh×úí§–´¹×Ô‚ i»?ÉYÁ5ß¿Ö)›âÛ×ÀjÑ|Åóªyížæ¶Ÿæy>XzÃ]-H½f‘ÎË6vܳ?ÜéÄ çN úšƒž;1ã5wb¦Àî*½81èkN zÒ¥3ÕˆìþÈ¥èÄ„'¦¹º½nHA{+ùâ|œ[6PWM»¹rÇ6T®º¤¬án­»(öp™ó§á:P‚¤[ü#³»…Eýþó¢×zˆð‘ ¦ö)–#Ö0 "<Æ#(¯yÄZ©\RsÄÆ£ $~ªQZȈðTÁqk˜:æ¡«ë" 1Yo Rߥ÷{r§o¶<=·4Ñ‚ ‡­¬ˆÂÅ«vL:F)þ^Çê†Ú‹¾2J‘sÃÇZÎ /6}”97J ä*8R¡–sþE:^‹Q*Ì97ˆþ‡ŽR±#çÆ^£”&¢¿™âsÿÞFäx!‹‘l™H3ò^ñ¦|èG:Àý#”…÷é<€­uò+AŠb H©2±}æíÓ3’—È UpR¨ Il'/‚±Fia`AŠ0„¡#À^‚ºqCòÃÝÞ+ÏõNÙ¥Þíìá¶´>íÃnÇck†Û™çÛéfr°Ù´Çy.¸3à<ž wÎJÀy°<A°2ÁTØý@¥—€ó`j‚áÆkp>ÕˆìþÈ¥plG (+`Ú9ÒÚýº½«‹®YÎhûB¬GÖX¨×ð{5‡ tŽOœL—µl8cÉŠ¨¥,øÕмÐ]š]l{èp°ù'7HŒü&÷À;ð¤ jIð¤ dÒ„©°ûJŸájI8!]&M˜jDväÒ„wב4Aïš•…“Ï49Ú)ZNÐ*óú·–õ°sšˆø”74ä¨(-Øp¡~HÜh59«WI€ª9p¨‘S´cÁž¿ßq©¾ðåuš€âüä€µó“ƒØõ (ÏO.5 @ª`^§ X;?9 òüä©Fi!;?™*8pÆoÃAÝ+ö+gnZ¹ä4&;în 6ôƒýÀ»‡&DûÅâþ¾&ýåý2â[ŒG€zùq~yúåùkþ gD«|¤_®UøºàXÏ_1V‡/ƒ ãÙžÖc‡v–‚âP„Ê0S–Ýl%KA*ù æîìËl˜xR³²Ï-=pmÖ^kÛÏó“^bƒoJ›3OȾÕÎã/pî[5ñክTô¥5ï™­ÈÜôèd§EÛáÂx„vQø¾%i²d ñjgÿåù—§ÿg•¶ endstream endobj 409 0 obj 9697 endobj 413 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 778.250000 138 785 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_feature_flags >> endobj 414 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 771.500000 149.250000 778.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_clearing_features >> endobj 415 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 764 189 770.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_features_default_args >> endobj 416 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 757.250000 147.750000 764 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_features_example >> endobj 417 0 obj << /Type /Annot /Subtype /Link /Rect [31.5000000 743.750000 67.5000000 750.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Contract >> endobj 418 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 731 134.250000 737.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Contract_nn2 >> endobj 419 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 723.500000 131.250000 730.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Contract_nn3 >> endobj 420 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 716.750000 193.500000 723.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Contract_nn4 >> endobj 421 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 709.250000 87 716 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Contract_nn5 >> endobj 422 0 obj << /Type /Annot /Subtype /Link /Rect [31.5000000 696.500000 117 703.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Varargs >> endobj 423 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 683 102.750000 689.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Varargs_nn2 >> endobj 424 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 676.250000 105.750000 683 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Varargs_nn3 >> endobj 425 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 668.750000 133.500000 675.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Varargs_nn4 >> endobj 426 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 662 174.750000 668.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Varargs_nn5 >> endobj 427 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 654.500000 131.250000 661.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Varargs_nn6 >> endobj 428 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 647.750000 142.500000 654.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Varargs_nn7 >> endobj 429 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 640.250000 121.500000 647 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Varargs_nn8 >> endobj 430 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 633.500000 101.250000 640.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Varargs_nn9 >> endobj 431 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 626 100.500000 632.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Varargs_nn10 >> endobj 432 0 obj << /Type /Annot /Subtype /Link /Rect [31.5000000 613.250000 128.250000 620 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Doxygen >> endobj 433 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 599.750000 150 606.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Doxygen_translation_overview >> endobj 434 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 593 105.750000 599.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Doxygen_file_preparation >> endobj 435 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 585.500000 180.750000 592.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Doxygen_running_swig >> endobj 436 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 578.750000 201.750000 585.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Doxygen_features >> endobj 437 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 571.250000 189.750000 578 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Doxygen_notranslate >> endobj 438 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 564.500000 224.250000 571.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Doxygen_alias >> endobj 439 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 557 228.750000 563.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Doxygen_ignore >> endobj 440 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 550.250000 198.750000 557 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Doxygen_nolinktranslate >> endobj 441 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 542.750000 198 549.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Doxygen_nostripparams >> endobj 442 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 536 189.750000 542.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Doxygen_additional_options >> endobj 443 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 528.500000 125.250000 535.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Doxygen_to_javadoc >> endobj 444 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 521.750000 141.750000 528.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Doxygen_basic_example >> endobj 445 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 514.250000 138.750000 521 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Doxygen_javadoc_tags >> endobj 446 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 507.500000 150.750000 514.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Doxygen_unsupported_tags >> endobj 447 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 500 141.750000 506.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Doxygen_further_details >> endobj 448 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 493.250000 119.250000 500 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Doxygen_to_pydoc >> endobj 449 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 485.750000 141.750000 492.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Doxygen_python_basic_example >> endobj 450 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 479 146.250000 485.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Doxygen_pydoc_tags >> endobj 451 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 471.500000 150.750000 478.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Doxygen_python_unsupported_tags >> endobj 452 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 464.750000 141.750000 471.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Doxygen_python_further_details >> endobj 453 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 457.250000 114.750000 464 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Doxygen_troubleshooting >> endobj 454 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 450.500000 201 457.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23troubleshooting_ifndef >> endobj 455 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 443 129.750000 449.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Doxygen_developer_details >> endobj 456 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 436.250000 173.250000 443 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Doxygen_translator_design >> endobj 457 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 428.750000 225 435.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Doxygen_debugging_commands >> endobj 458 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 422 117.750000 428.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Doxygen_tests >> endobj 459 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 414.500000 150 421.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Doxygen_language_extension >> endobj 460 0 obj << /Type /Annot /Subtype /Link /Rect [31.5000000 401.750000 93.7500000 408.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings >> endobj 461 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 388.250000 102.750000 395 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_nn2 >> endobj 462 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 381.500000 153.750000 388.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_suppression >> endobj 463 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 374 135 380.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_nn4 >> endobj 464 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 367.250000 144 374 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_nn5 >> endobj 465 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 359.750000 119.250000 366.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_symbolic_symbols >> endobj 466 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 353 105.750000 359.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_nn6 >> endobj 467 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 345.500000 122.250000 352.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_nn7 >> endobj 468 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 338.750000 132 345.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_nn8 >> endobj 469 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 331.250000 142.500000 338 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_nn9 >> endobj 470 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 324.500000 185.250000 331.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_nn10 >> endobj 471 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 317 166.500000 323.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_nn11 >> endobj 472 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 310.250000 167.250000 317 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_nn12 >> endobj 473 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 302.750000 186 309.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_nn13 >> endobj 474 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 296 174.750000 302.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_nn14 >> endobj 475 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 288.500000 183.750000 295.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_doxygen >> endobj 476 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 281.750000 199.500000 288.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_nn15 >> endobj 477 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 274.250000 164.250000 281 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_nn16 >> endobj 478 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 267.500000 93.7500000 274.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_nn17 >> endobj 479 0 obj << /Type /Annot /Subtype /Link /Rect [31.5000000 254 102.750000 260.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Modules >> endobj 480 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 241.250000 126.750000 248 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Modules_introduction >> endobj 481 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 233.750000 89.2500000 240.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Modules_nn1 >> endobj 482 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 227 135.750000 233.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Modules_nn2 >> endobj 483 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 219.500000 152.250000 226.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Modules_external_run_time >> endobj 484 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 212.750000 171.750000 219.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Modules_nn4 >> endobj 485 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 205.250000 102 212 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Modules_nn5 >> endobj 486 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 198.500000 150.750000 205.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Modules_nn6 >> endobj 487 0 obj << /Type /Annot /Subtype /Link /Rect [31.5000000 185 184.500000 191.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CCache >> endobj 488 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 172.250000 88.5000000 179 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CCache_nn2 >> endobj 489 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 164.750000 102 171.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CCache_nn3 >> endobj 490 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 158 112.500000 164.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CCache_nn4 >> endobj 491 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 150.500000 130.500000 157.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CCache_nn5 >> endobj 492 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 143.750000 98.2500000 150.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CCache_nn6 >> endobj 493 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 136.250000 114 143 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CCache_nn7 >> endobj 494 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 129.500000 120 136.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CCache_nn8 >> endobj 495 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 122 150.750000 128.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CCache_nn9 >> endobj 496 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 115.250000 152.250000 122 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CCache_nn10 >> endobj 497 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 107.750000 142.500000 114.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CCache_nn11 >> endobj 498 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 101 120 107.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CCache_nn12 >> endobj 499 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 93.5000000 162 100.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CCache_nn13 >> endobj 500 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 86.7500000 130.500000 93.5000000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CCache_nn14 >> endobj 501 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 79.2500000 101.250000 86 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CCache_nn15 >> endobj 502 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 72.5000000 190.500000 79.2500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CCache_nn16 >> endobj 503 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 65 101.250000 71.7500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CCache_nn17 >> endobj 504 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 58.2500000 100.500000 65 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CCache_nn18 >> endobj 412 0 obj << /Type /Page /Parent 2 0 R /Contents 505 0 R /Resources 507 0 R /Annots 508 0 R /MediaBox [0 0 595 842] >> endobj 507 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 508 0 obj [ 413 0 R 414 0 R 415 0 R 416 0 R 417 0 R 418 0 R 419 0 R 420 0 R 421 0 R 422 0 R 423 0 R 424 0 R 425 0 R 426 0 R 427 0 R 428 0 R 429 0 R 430 0 R 431 0 R 432 0 R 433 0 R 434 0 R 435 0 R 436 0 R 437 0 R 438 0 R 439 0 R 440 0 R 441 0 R 442 0 R 443 0 R 444 0 R 445 0 R 446 0 R 447 0 R 448 0 R 449 0 R 450 0 R 451 0 R 452 0 R 453 0 R 454 0 R 455 0 R 456 0 R 457 0 R 458 0 R 459 0 R 460 0 R 461 0 R 462 0 R 463 0 R 464 0 R 465 0 R 466 0 R 467 0 R 468 0 R 469 0 R 470 0 R 471 0 R 472 0 R 473 0 R 474 0 R 475 0 R 476 0 R 477 0 R 478 0 R 479 0 R 480 0 R 481 0 R 482 0 R 483 0 R 484 0 R 485 0 R 486 0 R 487 0 R 488 0 R 489 0 R 490 0 R 491 0 R 492 0 R 493 0 R 494 0 R 495 0 R 496 0 R 497 0 R 498 0 R 499 0 R 500 0 R 501 0 R 502 0 R 503 0 R 504 0 R ] endobj 505 0 obj << /Length 506 0 R /Filter /FlateDecode >> stream xœí]MÏä8n¾¿¿â=˜KÔ'˜žîC€Á CC0»›Åbg‘Þ=äïDz\]$KtÉ´]®·§·±Óm–D¹\zÑI}ÿ¯?ÿ÷ëÿüãõûþß×_ç¿üùexýPÿ÷Zþ|‡6½›ÿý“ýõ·—ϯŸ_~zùiüïç—Úáçÿ}ü×ÿ½Ú×ÿÿ—×ÿü¯Qø‡¹QiðÛK4qüû¯Óß9šñ_׿‹üÏ/ÿñO¯+/ÃÍ7C¯¿ƒ”\¹‰;~¹|I3ýùǯ{ù¾~ý5cÄÒ«qà^Mvöõï|ùSùVšÛ4··i\!ÆÚu|H³ ½KiŸù_f”¦a¼ž›õú×á1Ù¦tiá©(í'ÁÜé•tž0^—èJ‹z‡_Ðoðëø3þüåÉ—oNŸ|•?Úç…ŽïyùþS~5áõ—?M¸þõËøÔ¼}ýnüÒðúË^ÿyÌÿòúË_^ÆÏC°~úAê'ÖHŸ˜Ó'îƒ:õ¯}†õ}ÌG©Ïð£ÔÇÅé“ü.ÏúXñÄO'Þ›ø}†z×þØd:ï@þ>6‰wP?wÞ…û¾ âTmay_-´Ódœ%î Úl,øë8u;àšƒkŽ-¸æLÑ4^3¸N-ñ+^wÞ(ñËö­|×?°ÅbÃDÌP°›]µX8s],LÆ‚í‹Eær*39zö¤3Y^Dò׿ÆÇð^š{óli}bDr¯s"¼³fzþ]óUÄìÂ8¹óç,ìÑ[÷à±à¯Œ²†Ê <Œšópåïz}aß0Ûßf’Æ×௎ÐrýëK˜ èdæ@úÖ>¶ž®/ÔKûZ¦½p7l‘HÿDµÿùåý?=œºS1²é`n™"d'š¨Mf-YØæõfÛÛÏXt\û7¥åWnu#Ûdò׸¹%™(3–ì‡Ð¬H+nVؼçJz—ŽTàg®+‡M ¶’J6ÖµÈÆJã5#›ÒHÀÚg²MÙÙŒo2T»ádSZ$Ò?Qí'’ÍÇÆcÿû##^þ[wÀoV³epëÔ¸l÷N|Õ/¢Ã‚­|á,å -¾pž"ÚyÎ¥þ€µÏ|1È ¾_̨öóEi‘HÿDµŸÈ.Âûn¨èáf6ËïŒû:Xô°à0’¿ºÂzXGñ®½`Ùh~°gó©NÜå2r©:,8Ò¥ê4å…ô«›Qb÷©{åV½ÊÜ(ùÔ9KجøíÅ9çɖ%.ºÄÛZâ‚£‹Pp|‰+-€ô¬}^âÂÐZâ|¦Ú}æK\i‘HÿDµŸ¸Ä…x̧Øþ‚Kœ-ëì³®Î#±àPO`®1²'P~.¢'ªña†w!{ ÿβWë¹ýŠAü5e†¿©iY›ìó´ o(ñä»Q ÿ ò½Ífcë“â ¨âéìâ©çüÕÅa!bÁ¶•"?^)ÆëÆJ1JÉJ1]“•¢¶Ò°öi¥¯+E×^ªÝ²•¢¶H¤¢ÚO[)Æ»èX)¼Ây¢ðÔ?ˆŸìê‘×Ù‚^ØcÛÃ;y÷å¡kYM´¬åŒ[‘æŠ4oZHó@±à#­´Ò°öi£)Ù@Úøv@´»Ä‘æfl]û'ªýD¤ùp ÒnÊGí‰ÌkuÃ*Ñ 4á/÷6¢;å¯ùvˆX°X!S`Å¡¬héÔ–«´Ò°öX£™ÛVˆT{ˆX¥E"ýÕ~"°®›ë»KåÏû$¾ì¼ÍH0¾k¦ Û5œlE`âMÓ…Ç&ŸˆŸ,,Ú2»¹5¬ƒB,le”(ë¤Übl(/dÃY'Ï(udÁ±ÿ´kM'[çk¾d"ØÈÖfˆ„­Ílm Ù•®)[O-€ô¬½²µBƒ­KˆÑ>xÆÖS‹Dú'ªý<¶6¦#TÃÖŠ—"óIbë§™ð§e}´ØMä½Ù‹C6Õ4ñÈŠeaƒOÇ—$ØJ6P°±EÌsiªçƒ¾´Ò°ö™0¬o†uL»ã„QZ$Ò?Qí'tä¢jCìóÕ†¼¢¹YÕ Û£Òcåo*ßHs .9yÊÈ^ñd÷šì¡XHök˜P®íà°`+:O™Ð…2ϲ©žeÌf¥þ€µÏLè\‹ 0íÀ™°´H¤¢ÚOdBß‘~«aBqÿ{Á˜_tý»!Cg\ùÛ¤Ù·´¹=ÜxrБ†S¤ˆÄNZð×XWë2l¥…à(-„FŠÏ(¥~q"§…+i!8J ¡‘â3J-Ón9-[‰ ¦…ð)>ÉÄáZø ‹E —48˜;u|¢Ú ¾X¾àŠÙ%¤iüA®±&{,Ø –,©‘¢2J©;פÀÁ’B…Gr, (XR#Ee”¦Ýp°$Sá‘,Kz‚•ñ.:RT`M¯¼Eµ‚Æo²1VxW¸÷ ‹0y@аXpl´Ÿµ_6 äh¿$~G1šl0ÒáL&- IŒé›×dcßÝP¡œy|ok²MöQúdá›þ ÎV1ÃYF…}/~"ÇÚ)âæž›ŸŽ"ÇzáY‹/r4æÝ¤ý–u-Ϫ{è]±ƒÖ^ßßìhl!ÁÆUÍzºªYßZÕ¬§«Z¹¦«ÚÔHÀÚëªf}kU³Þ0í|U›Z$Ò?Qíç­jÖw¬j"ïí;(¯jòF'¯ZqëP–×ÍžÂÇ­òãõ'ˆ©v@›Õ·ÄÛ€.ƒÁ‚ã’–Ê@ SMÈ>_ç…½Q"?oy ì}ªì)–"xŽ?Ö-ô-¥ßØÈcMe[„dôœ~£¯„Óo´”~c#u”LûÀé7•p£ÁôŸ u¼‹Ž¼\3LÆ9>) ßàTL¦câÃU˜Ô¶5© ¾ŠÍv¨ïX‘‡Šæ–Ü$èCÞØ–"Ï­øc?ÐøãrM‘W[xªÀã.ÈË­øc—iüq¹fÈ˨eŒ8y~8&þXu0¼ÆâEËxÅÀ³Ô²^·ÈîZòxÌ{TzlÀ‚NÌ›Ì0o‡æ™{ÒÏîI„ù©…§ <`Ƽ7©yo¨ƒµ\SÌO-ê-'‚y“Ÿóö˜øUæ{¯Nò&‹lP¯ƒ8*– lôgy Uö=´ªì{æqòŽWÙŸZéX{õgyhUÙ÷@½eåšú³¦‰ôOTûyþ,ïŽ ~Õ ø›? =?1ßûö í¤ò¨Ä§u€K4:Üg¤ÖÍ|H~ö!¡5vj᩸,Ñ>´–hO½`åš-Ñ¥E½Ã@–hŸa‰ÇăÊ`ýæ¤zR'•Gõ5''ÕUЉItôÍ,ˆ-L2’Ÿ}HTS Ox<À“Ñ·0ÀqL–õ=Ád Ï€ÉtL˜£ “»Ùs¡Ùæyz[±~÷^ô{ŽŠ‚‚ñXЉpt\Ê,-„3_•Ÿ}U¢S Ox<ÀáÙµž™·-GxiQïЄgÿÃ1‹„s†}Õΰ0\ws'gØUЇù`X0`0­`ÀÀ|UÁð`ÀÚÂS0c>˜V0`0– Àƒ§õI0 àDÌÛûvîÃ0ÿÍö9ÂE±rlt† Á]ZÁ]¹«ðனþ€µWgX€VpWôóனE"ýÕ~ž3,ÀAÁ]Š”ùiÕ¹ë"ê÷=óùÆnX yÍÔT_ÐWBës‚‡"µ€:—fÏ"µ‚oEjæ£ žGjÕž*ðx€ËÒì[‘ZÁl©5µ¨wH"µð'.Íþ H-ÙºÛ× öüG¶·’Zžø,®±ýªhü·œ Ñk•xóVbЯ‚£#ø¯xÞ'GCq²ÔªÓÈ~œRHkà¿ÖqS¯mˆŒôäÉ0ùl‰XZéXûlCÆ¡eCzjf¹f6di‘HÿDµŸhCƃ‚çZ.l¨öG".4•ÉG“‹³ë £*û\.‡¨ðW©’ÅÎ!•ɾ(ö2,è´o3‹½ ¹{˜78d{Y[xªÀã.ömjÅ^†DýÙåšÙ·ébÐ&{‰8ѾÍÅ^*Ž¿úvPHÒßà&”L¦½cFq›=¨«êŠ[°? ànͦ{>šñ+¤ØzVËÜãM+Æ52¯{4<Ƶ¶ðTÇÌ܇VŒkè¾A¹¦Ü:µ¨·Lb\ñçqk4Ÿj¸uߺښsäOd¦–!ñ¨³öÝŒøÖ±NÊŽÅᎯ)HpäK~¤ÀÛµ>Ë-™ï»íô ²¿«£Ç¿éD-i ‰zg½´‰­—6·ÖK0t9›v«È‚—)ðx€Ëzick½´`_/K‹z‡‘¬—6=Ãz E‡kέք¾È›h+ìCy¾¯Úù€Â¨!cÁF¯]t‘xí¢K ¯]Y°_-N?Øó6µÒ°ö굋.4¼vÑуäÊ5õÚM-韨öó¼vÑY-öÑ+uc^hb¢vÞym§É¡Ðì#ÐÒç‹þ»UÜ…Hpà ›žMA ˜ ïš(»í'”°'>ŸÆ¹çO°tŽyL‰a¼Á?òÔ”O÷O+_xÌò9ÙòiØâ)ÕrŸ…ÁÅïóæycƒZ>E\>©[þD>ÞUsŽyoYè²&äê‰ 6Z ÉP+!™–•,µÊ5µ¦@úÖ^­„dZVB2ÔJ(×ÔJ˜Z$Ò?QíçY ÉvX ® ›ýñùõOSƒU¦p¹¬¤lªïq@ÕN;^ NÍ ¶" —S¯c i@÷¹Ë5CZi¤?`í3ÒÀ·Žiwi¥E"ýÕ~"Ò\GV•i§k^¿†.àIF烌lÍÁ·/Å7ž¤}Í6ù×883EsêÞ݇s<—¡ÂžPŽ’¸ ¶r:a§^‡—ùDÙÆ'Îe¥þ€µÏ\æ]‹ËÆ×ª8—•‰ôOTû‰\:òÇ\¦:]ç÷sdu†÷ÎÞwE¤ìS/$½oСr¤6y,ØÊCè°œzí[<#eŠ9•@úÖ>óP„EË´[ÎC¥E"ýÕ~"¥ûï*Ò”z‘ß^î[2ï=Ê‚úý€ÿíX‘•pú]‚­•iú]Ê­ô»”iú]¹f•kúêXûLP¹•~—²aÚyúÝÔ"‘þ‰j?‘ rGú† 4¯F2”nC:D$ÈöÑÎj­(²ÁwÞ×YcWdTØu*Aul„mFçïÔkhÀ63¿e®~K½©þ€µWØfc°Íf`ÚÛ©E"ýÕ~l³éHÈÓÀV“ñðAZe÷=ïE¬¥ÉG-€·ðA5R§sஂ­ðš0”¡•0”™32OšZéXû h% eK©åšÁÇÖ„!Ô?Qí'Â:†4ðQ„¼QWçY©±Üû•¨",wÃ;ÁФN»ÜWÁVð£ÓKêµiŸyïrõÞa—@úÖ>ƒßåøõ<–k~7ÃýÚ?Qí'‚ßw$ûhÀ/öYÀF|²7º‚}üòŠ,o(´-xž%å°“JP!W["u¯‚­T‚]™®ãТæ€ËՇ頴Ұö™JBjQI ÎÃrͨ¤´H¤¢ÚO¤’ؑۢ ЀñmÚò÷‘µÉ[ š÷è}s {™ „¤¹7ÍkÒ3c/G\kÞcA_ê@N,u §Vê@Î4u gž:P[xªÀãæÔœZ©9ÑÔrMS¦õIêà¼Ôœ;Rv¥£‡¥1Ëw°oX†“çW…o©ÌyM>M‘Â=^íœm+qø >ù GÞ‡?q¾“;§ •Œ*»ÉÞÉ~ yææ3 Ò-yæñ÷ÅÜ6]òœ[xªÀã*yŽ‚F¡ÿQêé+ô_[Ô;Ä…þɧ‘çøõ 4U‘ç®EÅ5øUÑꊊä[»ôuÖ±ø#ìÌ>ò8G³Ï8éQòEHXÐÉ>60ö±# Fi¦ä`3g›gº±‘° Œ}lãHƒQêØŽ³u3ÝXOØÇ>Á‘yüEŸ†}Tçb‹›@ ‡È}jA¬üæNŸh˜ñ Óße>’–}ùhaœãùÕS†8`A'¡s“fAã†Qš(]¸ÄùÈ¥™€\ |ä<ã#×8€a”89˜ È9ÂGÎ?ùchU|¤v“³Ðoƒ/4åñvÙþzP=‹]¾±ÆÏ½0ί‡ò¼Ø™åqŽ'DTÁÚYƒ„#ÄÐ8b”FÊW!rB qfÀà !Ç14N§(O `9!;3`Bˆá N§ÈC¼ï-x!j¶4Q:šRo2î[†Iau=¸誧³@s2ÉìKsòÅñ4‡j C6XÐIsèä®YàZ4G=üÓ5£¹©…§ <àBsɶh.6€á4WZÔ;´„æ<Í¥câU4·oùåg« ·­ªþù”ûØp2鈿þ¾äöUivÆaA¹™c2 ǘŒRê7;ÆdnᩘÉÍ cLFéÀ`ǘÔõñ1&d€óÈÍ ÇDM«ÈMS¥J.áö6 i2v­¡:oiEž¼Æµp³ˆèÂÖðy+ ¬-NÞMRŒÇ³¶AõŸXÐÉÚèÔ¹Y`[¬Ív.̼shwj᩸°¶Z¬mèÞK¹f¬]ZÔ;k[ó ¬m ÖW±¶"Æwá,؃+é*^ßU”¢xI×x8e>Z`ƒ]ùHÃ:»ñª¯ °`[p6ޤŒ×”‚QJR ¦k\[éXûœ 4R Fi¢Ú¥Ô‰ôOTûiqÀã]“R  €ZØ}/‘Œí•yqk2êÆ§Œ"¢Ã‚C+Ef“¾l†É•"e{^Q)r¸lsßV}+EÊSâQ•"çc/õܹ37öªU)?Ñâ8Ä>AüM÷¨H9Î8ôÆŸ3l${k(Ù[Ó"{k(Ù—kJöS ýk¯do‡ÙÛ’}¹¦d?µH¤¢ÚÏ#{kî“ý£"¦òÇÎO^‘Ýù­°¦è¹é[-*4k+÷ÉËÖfJÐÈ¥–B,' °•"`À„a3% ÛÈ¥‘j·‘†•"l„aŸ KlüÆ÷³Ä%\û¬‹…[QZñ+²¦Ç…‚IƒÅ‚­“Ø%:‰]nMboè4ó†Ob?OÛkÀÚçIìbk»@µ»À'qi‘HÿDµŸ8‰ýýÜ¢G›ÊÁ];G%$’“-–²÷’u¬I'\X–4K¦|Ÿf7q— Î{Þ«NNAµTm X°•SB¤œR‹Sâ@QÎ)q¨,ríXûÌ)¡QÛ}”zª=xÎ)ÁW sJx‚Úîã7¿Ÿró¨€Ñ£O€QdZo8‚~]ê (wM×yÔÉ3GœQØÉ1¨Nj)Ñ€ž"SùCzKElj0ôé•ÂÚœ[(;JÙ©qHÀ(Í”TSæ”r%é1e§@);5 ÿë˜vÇ);¹JÒÉcÊNOpH@¶ù~žÒ£BZA.¬­( «*þ¢‰ÓÇYØ{ë7¨ ME¿jêï[}hET‡ª¨ æ÷‡jh*˜.(ŠdÁë.Çˈ÷6£»åuâ8–á^,À*w¡ÜgáÞÄ8–…»ö"‹¼Ío*~%š¹#£‚xr~Tü ó¶°»„•õ¬@2ê­ôɆ3~»â¦ \|ÎD,ØjÔffÔæ¦Q›™Q›oŒÚ<µ™µ™µ¹iÔffÔæ£6ÏFm&Fm~£Ö _f¢²Ö¾qS Úb²SQ޵êì47 ´`°`ãu†œ†4^7NC¥4 ¡\Ó):µÒ°ö:Eiœ†4J ÓÎNCª-韨ö§¨ÉÇLQ͸¢äéyZÛ -K ueCLrXÐíì@]WÁV(€¥P€Æ C£”îž—kðuò`(€¥P€Æ C£t`Úê䃡OpÂÐxé(¨ŠË‰Iý g«Ê“W.;'»:Ä /ÃGŽRZÐ&ÂÖlH;@gY‡[å –oœ=4Jég¹fÀò®BÉ[ ,o(°|ãì¡ìÝŸ-× X.W(ùË?ÁÙC¹ä’,EЋfU8dZ· 'Xs‚ ìðÍ:ñÙH”)d^µ;ìÑùA°`+€#Íÿp±•ÿá"Ýt*× À±æ þ€µÏ­üñÉPíçL-韨öÃ1Öø”ŸÀ>¢Ü¾±`ë„O4ÁåVþ‚c¯Ö.óü…©þ€µÏ>µò\¢nrÍ&|ªù ¨¢ÚOœðÙ3á5õÄ)ªYIª„Ên¹‹\±H^/N4s@FbÆ‚óͶðC+ÛÂ3W7<Ûbj¤?`ír~he[øº9Ê5…ÜÔ"‘þ‰j?rÞ¸c §©:$OÞ –h ©Âù¾–õÏ”¦àl£¥i Þ¶ÒCÛµâÔP·g¹fІ§†ú'ªýDh»câÔ ­‰`“׿]×2¿*â+  …&{,Ø …@#¾BhE|æè G|M-€ô¬}†‚oE|OtåšAÁÏ“ßãˆ/¬ýD(„c"¾  ñÞ+Ì:'Nxù“²Â‰µ°2Š«Ê%&+¡ˆUÐ8ÿÎw2Êó@³¹`=¥­Ê5:°X°•`#0 ©a˜ë0$a8µÒ°ö™`c+Â0Dêö,׌`c0DýÕ~"Á¦c" V{¨HY *]/¼k¯q TÏd‡[¡iä_È­È¿Èwqà‘S ýkŸ¡[‘!3§cæ‘S‹Dú'ªý<(Äá˜È¿(hŠÂÈ«‚è0Ô8±îšÝ}>¢:^ãïeÂÿôòÓëçñw»NïÆÏúÓ½Ÿ€3ÿî©õ³Ã¸† pq"YGá,çðÇF•ú;ÚÛ“afCë̘sŸù'¹ykͤÒ8p¯º^ëÞ>Íßô–Òä3VæJ ×[Ä›5óW¿ù‚s1‘–ú(~⤯admbŸ¹¼„YõÕQh†vÂÅRè«øo¾sLªïNöŸ^zù¾1¸$ endstream endobj 506 0 obj 8885 endobj 510 0 obj << /Type /Annot /Subtype /Link /Rect [31.5000000 778.250000 92.2500000 785 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Android >> endobj 511 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 765.500000 96.7500000 772.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Android_overview >> endobj 512 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 758 119.250000 764.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Android_examples >> endobj 513 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 751.250000 162 758 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Android_examples_intro >> endobj 514 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 743.750000 151.500000 750.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Android_example_simple >> endobj 515 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 737 153.750000 743.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Android_example_class >> endobj 516 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 729.500000 145.500000 736.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Android_examples_other >> endobj 517 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 722.750000 95.2500000 729.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Android_stl >> endobj 518 0 obj << /Type /Annot /Subtype /Link /Rect [31.5000000 709.250000 76.5000000 716 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp >> endobj 519 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 696.500000 102.750000 703.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_introduction >> endobj 520 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 689 160.500000 695.750000 ] /Border [0 0 0] /Dest /#01#e6#f7#94#3et#7d#b3#1f#10#c2#99#82a#2ceV#cc6#84 >> endobj 521 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 682.250000 189 689 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_commandline >> endobj 522 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 674.750000 153.750000 681.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_differences_java >> endobj 523 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 668 106.500000 674.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_void_pointers >> endobj 524 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 660.500000 97.5000000 667.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_arrays >> endobj 525 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 653.750000 174 660.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_arrays_swig_library >> endobj 526 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 646.250000 255 653 ] /Border [0 0 0] /Dest /#ba#b15#c7#7c#f6#ad#e8#a4#03#8fp#a7#ea#b2#b0#3b#0f#99#87 >> endobj 527 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 639.500000 183 646.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_arrays_pinning >> endobj 528 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 632 109.500000 638.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_exceptions >> endobj 529 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 625.250000 225 632 ] /Border [0 0 0] /Dest /u#a4#0c#cb4a#ea9#1d#7eh1#c6Y#c7E#d6#ae#ce#fb >> endobj 530 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 617.750000 211.500000 624.500000 ] /Border [0 0 0] /Dest /E#0a#ca#b5#19#21#f4#5d#2bo#21#2co#cd#b7#f8#e4#21Ec >> endobj 531 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 611 243.750000 617.750000 ] /Border [0 0 0] /Dest /#c8#f3#e6#0b#158#22#ab#7d#d7#d9#e7#c4#8er#b9#f1#21#86#83 >> endobj 532 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 603.500000 215.250000 610.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_custom_application_exception >> endobj 533 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 596.750000 104.250000 603.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_directors >> endobj 534 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 589.250000 151.500000 596 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_directors_example >> endobj 535 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 582.500000 169.500000 589.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_directors_implementation >> endobj 536 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 575 146.250000 581.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_director_caveats >> endobj 537 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 568.250000 116.250000 575 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_multiple_modules >> endobj 538 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 560.750000 132.750000 567.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_typemap_examples >> endobj 539 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 554 289.500000 560.750000 ] /Border [0 0 0] /Dest /#f2#a9#d9#e1#9dT#97#b9#5c#bb#7f#11S#29#beO#2d#d2z#3a >> endobj 540 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 546.500000 256.500000 553.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_memory_management_objects >> endobj 541 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 539.750000 279.750000 546.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_date_marshalling >> endobj 542 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 532.250000 261.750000 539 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_date_properties >> endobj 543 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 525.500000 314.250000 532.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_date_pre_post_directors >> endobj 544 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 518 213 524.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_partial_classes >> endobj 545 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 511.250000 214.500000 518 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_sealed_proxy_class >> endobj 546 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 503.750000 231.750000 510.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_extending_proxy_class >> endobj 547 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 497 173.250000 503.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_enum_underlying_type >> endobj 548 0 obj << /Type /Annot /Subtype /Link /Rect [31.5000000 483.500000 73.5000000 490.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23D >> endobj 549 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 470.750000 102.750000 477.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23D_introduction >> endobj 550 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 463.250000 138.750000 470 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23D_command_line_invocation >> endobj 551 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 456.500000 99.7500000 463.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23D_typemaps >> endobj 552 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 449 176.250000 455.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23D_typemap_name_comparison >> endobj 553 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 442.250000 156.750000 449 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23D_ctype_imtype_dtype >> endobj 554 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 434.750000 179.250000 441.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23D_in_out_directorin_direcetorout >> endobj 555 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 428 192.750000 434.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23D_din_dout_ddirectorin_ddirectorout >> endobj 556 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 420.500000 157.500000 427.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23D_typecheck_typemaps >> endobj 557 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 413.750000 168.750000 420.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23D_code_injection_typemaps >> endobj 558 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 406.250000 166.500000 413 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23D_special_variables >> endobj 559 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 399.500000 113.250000 406.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23D_features >> endobj 560 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 392 95.2500000 398.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23D_pragmas >> endobj 561 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 385.250000 106.500000 392 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23D_exceptions >> endobj 562 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 377.750000 101.250000 384.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23D_directors >> endobj 563 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 371 109.500000 377.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23D_other_features >> endobj 564 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 363.500000 207.750000 370.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23D_nspace >> endobj 565 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 356.750000 161.250000 363.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23D_native_pointer_support >> endobj 566 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 349.250000 159.750000 356 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23D_operator_overloading >> endobj 567 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 342.500000 161.250000 349.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23D_test_suite >> endobj 568 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 335 129.750000 341.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23D_typemap_examples >> endobj 569 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 328.250000 178.500000 335 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23D_planned_features >> endobj 570 0 obj << /Type /Annot /Subtype /Link /Rect [31.5000000 314.750000 77.2500000 321.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Go >> endobj 571 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 302 96.7500000 308.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_overview >> endobj 572 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 294.500000 97.5000000 301.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_examples >> endobj 573 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 287.750000 132.750000 294.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_running_swig >> endobj 574 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 280.250000 194.250000 287 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_commandline >> endobj 575 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 273.500000 170.250000 280.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_outputs >> endobj 576 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 266 153.750000 272.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_basic_tour >> endobj 577 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 259.250000 153.750000 266 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_package >> endobj 578 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 251.750000 132 258.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_names >> endobj 579 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 245 139.500000 251.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_constants >> endobj 580 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 237.500000 150 244.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_enumerations >> endobj 581 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 230.750000 134.250000 237.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_classes >> endobj 582 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 223.250000 219.750000 230 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_class_memory >> endobj 583 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 216.500000 191.250000 223.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_class_inheritance >> endobj 584 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 209 141 215.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_templates >> endobj 585 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 202.250000 156.750000 209 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_director_classes >> endobj 586 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 194.750000 186 201.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_director_example_cpp_code >> endobj 587 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 188 195.750000 194.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_director_enable >> endobj 588 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 180.500000 206.250000 187.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_director_ctor_dtor >> endobj 589 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 173.750000 200.250000 180.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_director_overriding >> endobj 590 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 166.250000 185.250000 173 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_director_base_methods >> endobj 591 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 159.500000 200.250000 166.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_director_subclass >> endobj 592 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 152 261 158.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_director_finalizer >> endobj 593 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 145.250000 230.250000 152 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_director_foobargo_class >> endobj 594 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 137.750000 197.250000 144.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_primitive_type_mappings >> endobj 595 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 131 151.500000 137.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_output_arguments >> endobj 596 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 123.500000 176.250000 130.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_adding_additional_code >> endobj 597 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 116.750000 141.750000 123.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_typemaps >> endobj 598 0 obj << /Type /Annot /Subtype /Link /Rect [31.5000000 103.250000 84 110 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile >> endobj 599 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 90.5000000 139.500000 97.2500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn1 >> endobj 600 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 83 126 89.7500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn2 >> endobj 601 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 76.2500000 117.750000 83 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn3 >> endobj 602 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 68.7500000 92.2500000 75.5000000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn4 >> endobj 603 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 62 144 68.7500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn5 >> endobj 509 0 obj << /Type /Page /Parent 2 0 R /Contents 604 0 R /Resources 606 0 R /Annots 607 0 R /MediaBox [0 0 595 842] >> endobj 606 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F8 8 0 R /F9 9 0 R >> /XObject << >> >> endobj 607 0 obj [ 510 0 R 511 0 R 512 0 R 513 0 R 514 0 R 515 0 R 516 0 R 517 0 R 518 0 R 519 0 R 520 0 R 521 0 R 522 0 R 523 0 R 524 0 R 525 0 R 526 0 R 527 0 R 528 0 R 529 0 R 530 0 R 531 0 R 532 0 R 533 0 R 534 0 R 535 0 R 536 0 R 537 0 R 538 0 R 539 0 R 540 0 R 541 0 R 542 0 R 543 0 R 544 0 R 545 0 R 546 0 R 547 0 R 548 0 R 549 0 R 550 0 R 551 0 R 552 0 R 553 0 R 554 0 R 555 0 R 556 0 R 557 0 R 558 0 R 559 0 R 560 0 R 561 0 R 562 0 R 563 0 R 564 0 R 565 0 R 566 0 R 567 0 R 568 0 R 569 0 R 570 0 R 571 0 R 572 0 R 573 0 R 574 0 R 575 0 R 576 0 R 577 0 R 578 0 R 579 0 R 580 0 R 581 0 R 582 0 R 583 0 R 584 0 R 585 0 R 586 0 R 587 0 R 588 0 R 589 0 R 590 0 R 591 0 R 592 0 R 593 0 R 594 0 R 595 0 R 596 0 R 597 0 R 598 0 R 599 0 R 600 0 R 601 0 R 602 0 R 603 0 R ] endobj 604 0 obj << /Length 605 0 R /Filter /FlateDecode >> stream xœí][¯ä8n~?¿¢žÌKÔLwOÈC€Æ ‡ Áìn‹íEz÷!?–-Û"%¹d–/uÎô6vº‹¥"å*ñ"Šüôã¿þòß·ÿùÇíÇ¿üïí·ø÷Ç_^ºW«»ñ·ð燔 Ýkü÷Í:}ûíëË·Û·—//_úÿ~{?ðËÇïÿõ7yû·þÿ¹ýçõÄ?ÄAaÀ×+lÿ÷_‡¿½ý¿ºùï@ÿóËüÓíoã$.N¿þA9=LâŽào/ÓCŠáÏ?~ûÛËãão‘Ñϰ» ê&¼’·¿ÿñåOá©ÚYL³D<‹‘Ry€o+üðëËŸÝM˜Û¯êßÄýúõÅÝ~ðVêÛ¯¸ýs׉Oÿrûõ//îÕùÎH=L-¾óSíÎï¨Wã"XÞÃ;¢{5V¸þÍå9¾£_;?|jyªÜÔø9½Õ0!«ÏÓ ïøWk4yççÚ;u9òã87ñª•AOÊ‘#FnæUßZ:ƒÕÏT¿·(çç_ûe¸¬!‘¯!ׯ^iÆeÙ+ °]JøëË/huÙâìjŒMà¬ÕÌy|­_ëz…6fü‡¨öfôl?†×¿½õ*„—Ή8Ðç!åÞ^Ãø‘þ¬$Üeä÷#ú¼ÃÜÿüòáŸSR_SÒ.h©!¿hiU¬¾ó©º>ªŸé>V×»©é¢W¨£ª^b?>†~éžlÆD˜Ô+³$öQ'Ö}X F, ßÉ”ðè·€¾U¥…o ^šýk²ðÃ@Ÿ‡”{\øV–~¸ ºðÇ>ï0÷ ¾õÇ,ü*·úÂ_ui¶:µ]:SýLUVäTŸ§®>“Ãoñ¥ÑÏÃôÔ+•>ã¶ktç¶h´ëf½“J¦„ Ñ«z+T`àåbFDÍà¢êªî_Û¨\ãëßúïÂDõ›FhÌ@§Âø ¢òáwDÀøt !æìüA}9]{EïM{õõîdõÝ×׉ªÊ?¯Š¸†çZñ©UScð7†)«¬5—fôëSª?`ݺÚFÖv¿´ýl"@Û”ÐfcœØÆôß]ÁÆ8¡ ¯±GhÌ@§¢qý:ÎmŒë<пÆ6f1ΰKmL*à:ã„}Ã+VvÊuw–I©ÏúSm×ûŽFwÂ-:/}JhÔyèˆÎƒ(é<VÉþ5Ñùa„Æ t*`ÒyéK:?¼Nô¯‰ÎÏJ¾0ÀOp©Îƒy—uÅИ²<@w×õwVäPYׄºÆåqņ@ãÍ«ü¤%AåA¥„F•Wž¨¼îJ*ß C9ä§Î#4f S“Ê+WRye±e©Ê‡ã”RùDÀ…*¯õ󍼨3mVb¥¯ÊadÖÞ¢–>’ õW/Ymˆð`rÏ™%_ûBrÏ‘ô›ÓoI‚ÎÅt^òyH¹É=gl!¹ç N†×8¹7Œpèós¿.¹ç¬:D¥ŸÚ#W£}°‘[~¾£7ä¾zžÉ1ŽK “Ã:æ$Ñwÿ2õßìûIbYŽ«®ÁæìçÍ{‘ì1Â&e!)÷¸Ãóª´Ãó@¸Ýá…}Þaî—íðD掱Ɯ£åÏÕ@¨º|¥«¦Õªï°²Ñ ÓÛÂ]ŠaêJ^We7V6¿î5?“\q;´¤vÅèo(œ k},2 Á¾ƒ”p`°ß ÂjVõmûfv8Q$_R8QÔô[ã[ožkâ_…ò©õTTh?ýŽc±€TÀ`ÀÃë±VþF>,©RlÇ8ÄÂaWÚpÙ`©O*Ÿ«¹“ê„WÂ#Æ XÉEŽÙP0~q1[²Î¥„‡uë$¨’Nâ´öH : &jáÌR“N‚,é$*@d: "jáÌÂaWê$4tœt–¿rX¸o_A}u×ûgªºÓ;YO«Š¨nZÈÂé”ДîéÇëÙïM„±&>M÷*JF”ð™ÆhÌC§2ÆŒO Œeñ7òùŽÊ …õqLœçÄ?Ç…IŸ0‹†Òú]õaßœwý¸{ß8ùúÜ:§Tv%B?Å&dû¦¶ÔDX–~n•N Çm ‚ ¬ŒdÓJúñ½Ö?Óœd'__ÿ˜Î—¾Ï{V× bu­,Y]œ ÔêZ5™Ù…‡NeÌV×v%«k<‘a|fuŸÌìÌ?ǵV×64œeu÷9³ å–àW¤„·ñ½ ü}Ú]SÔõdH}ÏRÿ g×ôl¼4Ǻ͢06t+_u½LjîêN™QÉ’·™W'+i¦†¬,¡z{5áz·"m[þª¾ñ~Âå]Ÿçë^þ`\K9~ûž‡EMkÈ@bûþõÅtºdðï¾#A…¥ Âqø² ÂÃE,¦·ˆåù85 'x>­ˆç›Ç{¾ù×ùîù¾{¾Ý<_lÄV 3ç;ÞUÖ쉽VÃÙs¦×÷<‘1Ä[òDô\XŸy"ã'׳ðЩŒÙ]òDFQ*óDFM®gæŸãZOdéóâx¢»iâfßaçòÈñlb&~ö¼|Ÿû&pÞ…øî‰žÂý×ýª9Û´ü»`ô;­ dÛ#ic¦Ä͵–TJxXÃ=n‚®Ô(4s]Ö(4ŒÄR“†ûR£ô4÷é³F¡aŒC,p¡†CwP£Pý*“³p£ª:W—:¿“󉇭tK“u)¡1ÐAš˜@”š˜€æ8AfMLãyèTÆèƒ(51 ¹Ú@ þ0&Î51%2. ôAÔÄtï¾£ò¨õµÕfÄè54†Ö€äÒ#5º$y|”òãï †¾o»úI™‘–5ÅjòáXsö¦õ×ëÞóÿƒïøÜî=Z¹‚·ë [ ¼ëìë¿:FÅ5›+âú=7%wq/~Ò 1\!ñ= •µÂc4æ¡Ssü¥V¸êÉ€¬nç‰ZáWÆOê V8NüÄAVxÚøi/4«÷¥4G—j®æ#RÂØ£F`ÕXñÂû&Å«Üê&[I†ÉÞõß_ĹTíþ=ô»Â@½Í{AκÈxÚnàÕ½(¦&kz@´ó%Õ¿)hÒªºÔªô¸tÖª8ŽÑ˜‡NeÌ‘‚.µ*‚VTFÖª8Œ‰óD­Š‰Œ+#sP«"#RØ÷H•uj¸ëÉïÌrÛ×õ„­{GüæPÈ̸àuJ80òë~:ìñ[¼Eì—mkù¬+‰´ê ÑÞz¹¯-Ýù+¨Ï€s:ãÚ“Æñ4­™b.úxÊŠ’ý¸OYÒ ¶Ô –ô‡‚ÍúCÇ1óЩŒ9ž²¥þP°@edý¡Ã˜8OԚȸ2žrõ‡râ)FèÊG Äô³b°·u2½1@pË%„¤„aÈbf€â³r÷Úæ›²œk`8eÆûÆß÷›T¾~ D=¯w0p=–¬ÿ`œK¯9 ƒ³ÐwV°éêƒ)K¶ì^°â V¼.+Þ’@b¨…ÃÁ†Ÿ£“…‡NeÌÁЇR°2 ™+Kt2óÀÏqi°¢º†ä¬`…ãö/Oþ¼çÀCusï t*%xô‚ðÂüx¼ÉôW «ÑÄçéÚ«Ù9U/u9×grXßAý7m_šœ/åýgéÞgê¨åX÷¬Ãï%yS-oÍq.ö”__¬‘%×y'ÎU‚Àr(Q‚åP´Ô[‰ –c£1ʘâ\%J°J*#ƒåÆÄy"XŽDÆ•q®8–ƒç2€rêý#o³fvçý1´7Ônå «Œb‰GÊ]¶T×rŽàø•1ÍÛ¹àx‘Ž<ÀD¯9UJ»æH8Y´ç_—-§P/åeiÜsx@@h”@h­ÍUÐŒc4æ¡S³Ãƒ‚ŽÊÈ@h†1qž„&‘q¥Ãƒƒ@h8Ñ`ýÝáýî^³»’ň”pxéð¢U'»â¦ ^| ˆSŸû$‹®µF5YcjèfÉÖØ=o¦ ìÒ%ØEëG•Î`Æ1óЩŒÙ›éìR¤6¨7SìÏÂ?ǵÞLûÃñf 0-HÆœ¬'Cù¾_³3Ñ ììRÂÎDvxQ?‹ulJV{ŽWVç|‘Í])CâèÁY0çûî÷…TÎ’ª Пf8S¢__´‚’JÞó½¶#¾×Š’ï¥µ†*Ö¦¾s£1ʘ}¯ñ%ßkHÍd P߯Œóœyàç¸Ö÷Úƒ`·¾‡Ž «‹ã6ɤºçÞëòß]öN>ujvövn1ð)á@gk+Œ«Ö+šw<ø«è§ìì¾ß«¡~…oF õ¾ô”Ÿ«ß™¯®'Q‹¹ã/ ôkç+ÜQ!§·f°âØÇß³”Ýú¹öÎÊ“þÔøK¤Å’f 0S áQ<­0Î¥V%œËàÒH] ¼a  ˆ(xJ8—Îe ¼aŒC,p! ^oúïºÕz£äÎ×üT}‡“æâìøX’[JŽ„vãú^pM¼O +œÆ°“Ú”`'{3BôÁd°“Ã@, 0)œ.ÁNjM`'*œŽ°“ ‡\©pæ>ì$Káv½œs±ÚÎÀ$œ®½]ÛXºœ:ƒ¦nï¡|: ûÑ -×;K¯RÂÃVÈ:l…¬/Y¡ÞT`#áDf…Â@, 0Y!kKV¨°±k2+Æ8ÄÂaWZ!wñ’c…8˜ o ®vΫN.CõˆÐ˜]Òžà”iï Ù%Ó‘Óe8eãyèTÆ”]Ò¾„S¦=©…’]ÆÄy"œ²DÆ…Ù%ÓÝÇ)ÛwÕï ïšnÕ2ê]ûó©:+_û ëŠúg8 løØ.ÉhNCÍ®0[`Z=ù˜Å2ËE˜#ÀLh´`Fü$#JøIFsã@ LLøI ʘ,˜%ü$#•‘á' câ<~R"ãJ &ïã'fÁv9â967¬ê96F ¿bažï1V6P;N¶ÙŽ,‚B„V;7Ä@ 7Ä93ᆌc4æ¡S³nˆ 22ÜaLœ' Id\iGÔ}ܳì ‡±ÏfÙ‚ºÓg´RÝA³6-whJ )á@¸| d弓^«“–Ò{ùºøÑ€îó×ÕW÷=_¡ lƒÑ%Ø£ lƒÑlÃ8Fc:•1û ]‚m0ZRlÃ0&ÎÁ6$2®ôæ~Äwš¯``Lí[–¸³ê?©Yî•ÊÛL8пXAVÛ¾vOhJ/_~ïå‹<Ô'aè}ÒPÂ’iÄ=ŸdI‹µ±¥kcI‹µ±Y‹õ8Fc:•1û$[j±€±Œ¬Åzç‰Z¬Wú${¿Åú4ŸÄÉ.\Gõ­’1ùLµø`yl»¼×,Wì‚Ò)¡ÕxÒ|j|©ùÔÐã³æÓqŒÆGÎÝôêzÆLU¹µ_Œsð ô¦t¶[¥•u)¡Õv+R´êT©hÕ)R´êTV´:ŽÑ˜‡Ne̶[•ŠV’TFV´:Œ‰óDE«‰Œ+m·žÃõ¶›Ñ(UäÃ}[þsðΑÇ ì‹i¼k¬ù¼V¶Ù-ˆÀ uJhµF†”+:S*Wt†”+:“•+Žc4æ¡S³52¥rEg•‘•+câ÷Ý\Q!-"²ÒuÜd/p0T~SgOØâ¨¯ QŸèpgÏ@ QŸ˜Ã¼„‡NeLQŸè =!¿FeÐΞqLœgÚٓʸ0êë§q²¡¼~“ÍAÚÙЗ•¨p°x8{CN—ÓÝÎÖ˜H,ð–*%´êµ¢×²Ð#ÓS Ñ9I{dâyèTƬײÐ##†ÛÕ± Ú#3މó”H¯åôÈô³hè‘9K¯÷ÝÍ1ôúÍx|!hEPèB«Î(ItFš>z*I E›>âyèTƬ3ªÐô!ùXmúÇÄy ¤3ê š>úY44}œ¤3¬k¼vÕN†vC¿ùJa']Sß/mTÉ?Qz›ZUÒ¢’¦óÜSIÂP óÇhÌC§2f•4˜g!4I|UIí'4RIó0Ïý,ÚÎRIÐê®*Y¯âXÙÕwÞ·oòóÊã± F‚T)¡UÓ—›+&‚(iº¢…2MÆhÌC§2fM·¾¤éÖÖešÆŒóœyàç¸VÓÝ1Õ‚¬Ïpš Nr¾¬jùûý»…´ >¤tˆð@j\vƒ'îý±îÿüý/N_¥²7ý*•Ý15}û®ÒgN±œ¾²ëÞÔn÷+>“ÑÑ“µ:r&˪pØ5#Å $î…ò WÉ ^[.È™Zt)áaƒ#{Sp¹Á‘ÕNžep.Ïý<ÁY©»¬jÃ΀ ŒŠLÖv¼ ×¬Ô ò¦DhŒÍ%JLCa›Kš´’*«ÄÇhÌC§2¦Ø\B©SI¾‰Í‡1qž¨3‘qal.ÕA•˜œÏp€ä÷M&׋RNjØ·Ðhc„/dEˆ:³­lOjR¶'u©lOÒì•ÔYÙÞ8Fc:•1ë¦.•íI­¨Œ¬loç‰ÊöWê¦9¨lóøü¾ÎþÀÒ?O4³›ÙX ‡î…ðxœnáú8Ý]pÆQÃ˱Ÿ ©S¶kuWn3ø7Ò6Ò * ’"%<®u½#¼ZëBò¦µn×V^N¾ç´{49àšoÉ1¿Ø•V£ FŸ Øç áa£}H}¹ÑÏSÅ1¬Ò«Š9VŒëq•Ÿ†…Źpþí|çÍvfÁTV§„Çí t×Ûx¢r2ŽaÔ»Œ³ÃºCœ£lힳ†wßùÞvΑ´³ÅiM,D+sÅž éÀ…ð¸Qþz+¢Ÿ¨ŽcEvÝ‘s´€£ûô«qìË;RL=Ø©¡ct&<®˜Æ]¯˜ö‰ Ö8ŠÉ9H«¢ ÕW]•²˜óô  vg¾28xUËW¾-RÀEWšDý· F«v)áqýw×—‚¢R@Žþ3ëÞVÉܾ @Ï_2·©#ÿdضf£áÍ’ð)á8í )4+Âùuê>êª~\zÓ¬9 ,,½b€mIÛƒ·&«È:üúb†“4´0òfª»¾ÎT‰'ª3åx3Æí;cÐí{\Í)äâà(ÕWæçê.€“Óãµ:%’rR›t*½ ¤Wo몠ö*†=7m Æÿ~__4¸Òz§QIR¬¤+Ô * õÁ@jÇ1óЩŒ©QÉR}°’¤>8H â0&ÎÕ'2.¬ATðDõÁGP¯¬£õWÏûï^¤±MG±ýÎ]Çœ›8‘-ç^ïân­dT°@+“޼åÇ`E[¹crûóöÝUŸŒDöHêšü¢!uÕ•~â{þE‘w¥J5îJ‘÷@ þEM5î ʘý‹*Õ¸+¥¨Œ¬Æ}ç‰jÜWúý<5îœ 2WNÅëù„úq]›ÜXÕ0õüò´\ض‚u¥—‚uéRB« 0šØ€ˆŸJl€!Ø @mÀ0Fc:•1Û€ˆãJl€*2ÆÄy*dŒ~`Ÿ§À~ß 2ëø°'ìl‹Î:Ž: =fçúFZekj Õ¡îe&†juñÜžòœý|¼*=ø=Ã사r%Yå‚l PÃìfKì‚ì,c6Ì®„ «œ¤22ÙaLœ'BMd\i˜ýü ?±a~à“cwl;ßx¾1Vò øk)áØëX{é/ŠÒ⫞ï×±®ÍíSUNõI£ß«çØš.wíÖdûìS£,èåÒ™øZ.XКÜ=ä‚…a  ˆ,h … ´–T€¤, cbá°€ /XЦÁêŸPŨJc¥¤8Í&gÝüRõU+I}ïP©ßïÓmßè†k!ŽD‘n3Ð Ú«ô&%i­t»^£«hàU/ç2ùÆTboï$“ !êܪŸ‰Ê#6=º]Ö=wÁÙ>*ŠýÔ§_\/¬ï.ö/·//ÿ¯ŽrŽ endstream endobj 605 0 obj 9290 endobj 609 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 778.250000 147 785 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn6 >> endobj 610 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 771.500000 179.250000 778.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn7 >> endobj 611 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 764 208.500000 770.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn8 >> endobj 612 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 757.250000 150.750000 764 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn9 >> endobj 613 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 749.750000 123.750000 756.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn10 >> endobj 614 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 743 99.7500000 749.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn11 >> endobj 615 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 735.500000 168 742.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn12 >> endobj 616 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 728.750000 122.250000 735.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn14 >> endobj 617 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 721.250000 154.500000 728 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn15 >> endobj 618 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 714.500000 126.750000 721.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn16 >> endobj 619 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 707 123 713.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn17 >> endobj 620 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 700.250000 143.250000 707 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn18 >> endobj 621 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 692.750000 137.250000 699.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn19 >> endobj 622 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 686 136.500000 692.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn20 >> endobj 623 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 678.500000 146.250000 685.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn21 >> endobj 624 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 671.750000 126 678.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn22 >> endobj 625 0 obj << /Type /Annot /Subtype /Link /Rect [31.5000000 658.250000 82.5000000 665 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java >> endobj 626 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 645.500000 96.7500000 652.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_overview >> endobj 627 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 638 105.750000 644.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_preliminaries >> endobj 628 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 631.250000 143.250000 638 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_running_swig >> endobj 629 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 623.750000 190.500000 630.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_commandline >> endobj 630 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 617 179.250000 623.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_getting_right_headers >> endobj 631 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 609.500000 180 616.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_compiling_dynamic >> endobj 632 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 602.750000 153 609.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_using_module >> endobj 633 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 595.250000 171.750000 602 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_dynamic_linking_problems >> endobj 634 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 588.500000 225.750000 595.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_compilation_problems_cpp >> endobj 635 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 581 159 587.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_building_windows >> endobj 636 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 574.250000 225.750000 581 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_visual_studio >> endobj 637 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 566.750000 174 573.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_nmake >> endobj 638 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 560 153.750000 566.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_basic_tour >> endobj 639 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 552.500000 231.750000 559.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_module_packages_classes >> endobj 640 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 545.750000 129 552.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_functions >> endobj 641 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 538.250000 146.250000 545 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_global_variables >> endobj 642 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 531.500000 130.500000 538.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_constants >> endobj 643 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 524 140.250000 530.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_enumerations >> endobj 644 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 517.250000 186.750000 524 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_anonymous_enums >> endobj 645 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 509.750000 180 516.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_typesafe_enums >> endobj 646 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 503 187.500000 509.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_proper_enums >> endobj 647 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 495.500000 188.250000 502.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_typeunsafe_enums >> endobj 648 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 488.750000 173.250000 495.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_simple_enums >> endobj 649 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 481.250000 125.250000 488 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_pointers >> endobj 650 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 474.500000 130.500000 481.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_structures >> endobj 651 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 467 135.750000 473.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_classes >> endobj 652 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 460.250000 145.500000 467 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_inheritance >> endobj 653 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 452.750000 231 459.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_pointers_refs_arrays >> endobj 654 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 446 172.500000 452.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_null_pointers >> endobj 655 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 438.500000 175.500000 445.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_overloaded_functions >> endobj 656 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 431.750000 167.250000 438.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_default_arguments >> endobj 657 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 424.250000 153.750000 431 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_namespaces >> endobj 658 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 417.500000 145.500000 424.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_templates >> endobj 659 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 410 159 416.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_smart_pointers >> endobj 660 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 403.250000 218.250000 410 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_smart_pointers_shared_ptr >> endobj 661 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 395.750000 201.750000 402.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_smart_pointers_generic >> endobj 662 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 389 192.750000 395.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_further_details >> endobj 663 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 381.500000 174 388.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_imclass >> endobj 664 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 374.750000 231.750000 381.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_imclass_pragmas >> endobj 665 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 367.250000 164.250000 374 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_module_class >> endobj 666 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 360.500000 222 367.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_module_class_pragmas >> endobj 667 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 353 153.750000 359.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_proxy_classes >> endobj 668 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 346.250000 193.500000 353 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_memory_management >> endobj 669 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 338.750000 165 345.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_inheritance_mirroring >> endobj 670 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 332 234.750000 338.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_proxy_classes_gc >> endobj 671 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 324.500000 357 331.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_pgcpp >> endobj 672 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 317.750000 258.750000 324.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_multithread_libraries >> endobj 673 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 310.250000 161.250000 317 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_type_wrapper_classes >> endobj 674 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 303.500000 140.250000 310.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_enum_classes >> endobj 675 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 296 198.750000 302.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_typesafe_enums_classes >> endobj 676 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 289.250000 206.250000 296 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_proper_enums_classes >> endobj 677 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 281.750000 207 288.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_typeunsafe_enums_classes >> endobj 678 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 275 129.750000 281.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_interfaces >> endobj 679 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 267.500000 193.500000 274.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_directors >> endobj 680 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 260.750000 150.750000 267.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_enabling_directors >> endobj 681 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 253.250000 145.500000 260 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_directors_classes >> endobj 682 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 246.500000 170.250000 253.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_directors_overhead >> endobj 683 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 239 170.250000 245.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_directors_example >> endobj 684 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 232.250000 169.500000 239 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_directors_threading >> endobj 685 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 224.750000 177.750000 231.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_directors_performance >> endobj 686 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 218 185.250000 224.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_exceptions_from_directors >> endobj 687 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 210.500000 220.500000 217.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_customizing_director_exceptions >> endobj 688 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 203.750000 152.250000 210.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_allprotected >> endobj 689 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 196.250000 157.500000 203 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_common_customization >> endobj 690 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 189.500000 164.250000 196.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_helper_functions >> endobj 691 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 182 182.250000 188.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_class_extension >> endobj 692 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 175.250000 192 182 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_proxycode >> endobj 693 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 167.750000 254.250000 174.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_exception_handling >> endobj 694 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 161 219 167.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_method_access >> endobj 695 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 153.500000 124.500000 160.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_tips_techniques >> endobj 696 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 146.750000 283.500000 153.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_input_output_parameters >> endobj 697 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 139.250000 144.750000 146 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_simple_pointers >> endobj 698 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 132.500000 197.250000 139.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_c_arrays >> endobj 699 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 125 159 131.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_unbounded_c_arrays >> endobj 700 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 118.250000 161.250000 125 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_binary_char >> endobj 701 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 110.750000 246 117.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_heap_allocations >> endobj 702 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 104 111.750000 110.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_typemaps >> endobj 703 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 96.5000000 187.500000 103.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_default_primitive_type_mappings >> endobj 704 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 89.7500000 210.750000 96.5000000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_default_non_primitive_typemaps >> endobj 705 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 82.2500000 153 89 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_jvm64 >> endobj 706 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 75.5000000 156 82.2500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_what_is_typemap >> endobj 707 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 68 237 74.7500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_typemaps_c_to_java_types >> endobj 708 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 61.2500000 166.500000 68 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_typemap_attributes >> endobj 608 0 obj << /Type /Page /Parent 2 0 R /Contents 709 0 R /Resources 711 0 R /Annots 712 0 R /MediaBox [0 0 595 842] >> endobj 711 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 712 0 obj [ 609 0 R 610 0 R 611 0 R 612 0 R 613 0 R 614 0 R 615 0 R 616 0 R 617 0 R 618 0 R 619 0 R 620 0 R 621 0 R 622 0 R 623 0 R 624 0 R 625 0 R 626 0 R 627 0 R 628 0 R 629 0 R 630 0 R 631 0 R 632 0 R 633 0 R 634 0 R 635 0 R 636 0 R 637 0 R 638 0 R 639 0 R 640 0 R 641 0 R 642 0 R 643 0 R 644 0 R 645 0 R 646 0 R 647 0 R 648 0 R 649 0 R 650 0 R 651 0 R 652 0 R 653 0 R 654 0 R 655 0 R 656 0 R 657 0 R 658 0 R 659 0 R 660 0 R 661 0 R 662 0 R 663 0 R 664 0 R 665 0 R 666 0 R 667 0 R 668 0 R 669 0 R 670 0 R 671 0 R 672 0 R 673 0 R 674 0 R 675 0 R 676 0 R 677 0 R 678 0 R 679 0 R 680 0 R 681 0 R 682 0 R 683 0 R 684 0 R 685 0 R 686 0 R 687 0 R 688 0 R 689 0 R 690 0 R 691 0 R 692 0 R 693 0 R 694 0 R 695 0 R 696 0 R 697 0 R 698 0 R 699 0 R 700 0 R 701 0 R 702 0 R 703 0 R 704 0 R 705 0 R 706 0 R 707 0 R 708 0 R ] endobj 709 0 obj << /Length 710 0 R /Filter /FlateDecode >> stream xœí]Mí¸qÝ÷¯èµy#²Xü‚óõd`0dadŒí†Ÿ‘g/ò÷£o±J¤.UWÕíö ™éj6KW—uX$Ï)~ûo¿ü÷ëÿüãõÛ~ùß×߯ÿðËKóÉa3üïµûç›Ø ý§ñ¿_Ç×ß¾¼|}ýúòóËÏíÿÿú2üÁ/?üGû_ÿ÷ª_ÿ½ý¿¿¼þþ¿ZãÆF]ƒ//N¹ößíÿœjÿ«™ÿÝÙÿüòŸ¿{ý[×ãän|úó7èµíâã¯/Ó‡Tý?ÿøío/ߥ,êWeÀ¼ª`ôëßÿøò§îcIžS­ŸS™Þ…Uýß¶oi2èOÞ7îUïÿC©ÞÚ>¸ÑÍhøíEý¤TÐÞÏmö±îCÓÿÙ+ý{ ÌGkèþ$~Ž®ÍøœSôsüÖ~›¿Ì_@÷ùé0X2ßÝ×?üþ×—o?·Þíë¯jÕ¿èá_¿¶ï®ý¦¾éžÂ½þú‡×iõÓ¿¾þú——öÑCc5ößËð­s¿Q?ö¿1Ÿ !°üÚÿ7ù'h~Èúþ7ªùdòí/—Þ²OÝøá7ì ð í:zýž7Í»É>´Âìßd7.ûõ|f”ÿäÊfóÓ¯m´..„]„·ÃÆOAíøŠ mÇrIû†E±W©(öÀ"¬5ð(îÛ ícs»Šbç™ÖÀ£¸k3<çÜýu£ØÛÛD±nö ¿Qj÷%Qlr½½ÍЉÒÓ¯–îó=ÿH>ñdPBÁ'Ð^éèE6ÙÐW&û›ìç9ø©ß>z7Á™iˆ¡C xèš&‡®ë<ƪÎÀðphƒ´Œ}Ìx| ƒcxØ8vmÆ÷ñÐ5x<ÌþÍFVc³“ ¼|oànÈfOy(Ëãn6š`x;8¡RQèç+ÿÍåßH6Ðácrø˜Š'רyrð*6Nml²ÉA…Ôä ›ZŸú6HûÀØÇ498哃ë²}â£5°É¡o3>§‹'‡ÈGÍÉA›ûL‚€Ðßç’å Îkþ7á•6&»ÏÙ§~Ï¡¯q^'kþÊ Y@lˆ0gœãÏC¾Z;FbomãÎâ¼%9~{±fŒh5µÒÄÚæÃÏ ¼Ò?n±‚:h í_‡èÚxÒ…§þüòýï.‡ßôh`à4D6`6FòIJ>åÉ?ÁO¹tl½Ü|¯‚wa†O>9‹Å‰¡$9–'†AÀ!g¦HÕhbÃÓ€–bº``!ÚïRÓ0îÚéb ¦0 ýTÌYa@ׯ“.òóW²ãŸ¿`è+•[l̆y?~W X˜ÓØ@ O‚CΦÁy6Nû^:–»6@º€ØÁΤÁw«@èÚxÒ…§jBû1N „ïÙÉP2R%“Ój2Ì7ÍÎù\ùØ­íy9ÿlùmŒloÚgÿ&ŸÇç¿–üS æå÷vH.”ÿ€;ÆPþó¦y¬–,ôvbµ×óÂÅAl(ݳ†íYLíYðÍf7n6Ç{aÞ¤XúÀØÇ¼g µgø¦yЫ=‹e“bîƒ~Žª{¾™ÅEÀ¼qLÿƒOÆ¡œØh®3ȇå¹oÔ’š7±¡p”{t”{e£Üó]3?îšE£thƒ´Œ}L£¼}M‰Qî•â>å}›ñ9u<Ê#5G¹ ÷å2ÊÆæ¿`þÉò'6®ö}ž÷ï4n¬Á%Ç«í‡3R£b¸Ð3iÀƆg04YÀx€ÄÆóÍ6?l¶Åk¾ . v0.`<¨ÄÆCÃ4|Ó·ñ¤ OT\Àxðç Ȃ̩å À·¼|(Ì·=ÌümulxZPQhA‚¾‡ç‡=<‚] ]@ì`‚lRÐbØ.dgàÐÒµñ¤ OÔ„<‡) ’ˆÈó6¾ã`°šA%»'Õ7$ò‡ž`*84Ù@®Ó <úe5¢cÃÓàŠN¥0€o_úaû’„q×H;˜0À†X¶Û8tm<éÂS51ÀóÍ/©AÀêÊsâ7f«|´îYèØSÃs¾ò¸ÁlÊoV¼å­áR|r3åºÝ‰Åð4>ù@ñ)4)|êÀ€ÀG¿G!¦k¤ ˆLøä} Ÿ¼c¼[áSׯ“.I6ß?>•oúëì"QD¿ ‚•ߎS®<øÔ\:…™¡1< K¡ñ–B°”¢¨úW‚,} ]@ì`„¥Ð¸,µ/Ž9h,‡¥¾']xê ",uãr–ݽÍÓñ7~“¹ìYÈU¹Z$®¨%’=áßg¤˜þ¶%‚š)"Ú‡ØPxÔôœýLŸ8ê ÐÐc˜ ?êÚ ícÓQOÐ6qÔ42ùQOßf|NõD>*õ8‡v)„c:%Û¾늫t+ß•ç+žB>yz>x‡“—3›”‰ ¥Ñk,‹^ãRÑk˜¢?˜°ŠÞ¾ Ò>0ö1G¯ÁTôÃ}˜UôvmÆçD½ÆÞ!zñÂäÁÑ+HN–œº‰8† Δm›Ø0…Š|Xø\š× ïèW’z!yh YÊçKÃk'ò&}›ð`¥’ÈØòO°Üô%غãàKñ׳~ »|Ë?ä¹ ¥R•”|$1ÃØðä"J·ã7^Dµ?'Hê­•õºˆÚébÃ"ªý9ARo­†;à$õ¡']xê Þ"J·€ús³èul޳¡OÞq]¹¬;ÉÃf¶ûqg¥lyо݅ÈåulxzüÒñ nzkõlxç¦m€t±ƒiüC‚›ÞZ;àÜô¡']xê æø7ÜtÉø?´êd»PræxðŠA²I'ˆÉ]KööŸIQºK²CYÒ¯¤äÖà ·VÊAî 4éÛ íccÒßäÖª¹ÎAÚŒÏscõ’~ÝØÇ!sl¼0Ï J6°ùûüo®Z²çóâÍ‹óËüï÷¬2ÚÁ0³Š`ˆM»‹9Ý4°Øt ætkµ,ngNmö±96]‚9ÝZ÷Á™ÓC›ñ95‰MwætûÌé«bS0¡n¢ÉŸÙI4½™6VŒùÉþXv^è)€Ö§RIØ Ë”úT·] ºYê% †R¼ šám€ÞdXp…·}¤}`ìcÆÛ Rxî£Yám×f|NEð6è;àm(à™_„·’‚‹ù³ÎƒOÿ¯Ê…$” M^°ÊžgË¿ÑÒm7–º‚ Blx~78###’ï@TäM²ŒÍÏy¥ó±Â‡Ò™€}c©Éõ7ú`&PŠÐn ‰Ú­•Sõ6 mö±i&P*Q@[«&0 / =´Ÿ3. û¨8(U ¸j&”š<8·ÌçU’˜¹höØÈ{Lã5™F²Lìï­˜ù§¨®O)Y:©¥¢iLl(E=hêA¢àxk†HÀ Žmö±õt¢àxkõ̇æLJ6Ãsê@PnPp¼}Š!ÄU¨wl¥µò»Ž¡5lä#QÂV~GX°”> †R,0a&ŠmkÅ÷ìòbÛc¤}`ìcÆ“(¶ÝZÙÙCgàX`ÜüÆ,07(¶Ý~ðÑÁUX ¨¸–¯Lú&fòC³§# Kù/¡8Зú† \l8sñêØ –Ô”®‘,7ÆVù¢Ò±7Ý]§²~Ó Õz©6Q¢Z+~Ô¢/Q=¶AÚÆ>fHµ‰Õ­•u©ÖNjT{ƒÕí+(L\©‚Ú}w^TÞ¹ìޛƚÕlU óKõN°Ml8æmÃíг¯Ð(/¨üÞ¶Yn uÌâ "áð(%F°±ûåµM æG3©wl&õ>5“òC4¸Îhlƒ´Œ}Ì3©OèŒZ+; ì |&õ8MÞ’™Ôß@gÔ¾‚ÑU3© ˆ”ü컡G2+Ö¿9çØ¶y ”äóÊJl Ý¾£µTRãcÃÔäP©óŠí?ÿãË÷—G¨Ö¦‹P­NⵡTÄÍh;ƒŠ˜"'Hk%é|®›ÏÝ?gßAþ[(—R>Á({ 4](v‘8S2M¯˜ çåá#C)_.'ÿÖ$ÓZ©Þ޽¤.ásü­=ÏêÃ3\-»8ž%lÔžåUåÙ[ýò¤ZÌ—ãû c©[ ý’a6<+›ÒË­9ãϘMiC+6õ&›êÛéb£lJHȦ´ÑÜæ²©¾']xê ¢lªgįèšç쀔0û®:=ö. IUï=¨S~r´±’OÍä(‰ßˆ¶ŠòªQAaSÉFÚAå>ÛÈ\$4ý&Ìl(Ü)ÒÑ}J£!%¡Ñüš$=Ó=iŸÒ=i~Ô¡ýJ÷4´AÚÆ>æIÒ§tOÚ7ÜÇJ÷Ô·Ÿ“èž"5'IŽîI4I Vöù[eE¯—ÜNóLhï£Ë%Bl( "h˜dš”d&é ,ˆ†6HûÀØÇDФ$#:0ÉHgàA&ÉÈÒýUƒ¨Ìß%ˆŽn䆖ʡ"ê=Ó§Då—¯ÐuF*]ú°”0î '.†ÒÐ×L7:¥›Ít‡¾žtQû˜C_¥t ˜n¢3°ÐïÛ Ï©ˆn"òQ3ôõ9º Qè_¤{8•ÌŸ’ÕÒÆl¼3ˆ–Ò¿ÚCi€I À0Á˜•à`hƒ´Œ}ÌA)ÁtD0 –>èç¨DæÁ(ˆ½½icåì$Ç®ˆkæ¶`¢êÿ!6<}ü h«¿‚=‡ ~ìX?˜#ˆÉH[É{DJ¸GwÅHö%ˆP[Ãé.Ø™Ëj´Ž ÏÇ–Ãú±åÏá†^[jCvd ù³±òÁü|²qx*Ù×¼iù™Å0ÈÖgÃóês7»$o9‚$»_Å" 2‰áòs†{Æ£iŠ#5<FÕ'ë}Yï²xlIœ=£å—q’ƒù‘Æ£ÖK<ÚØð|<‚®æq®vëx”Œ´<[PÍ|ƒôqèów³pļ‹ …;GÌ`Š#fqÄ:ÛyÚ ícÓΣÁGÌ â>V±¾Íøœ„#ù¨¸óhð>1I©“Ü5¿")Ö[ç:ÐaGÐØùÄJcˆ ¥1ãeĸeÄ8Fé V”‘¾Íøœ„2ù¨3î>”Q- ic=Ÿ4–“IN¹­¸8¼ÜB&qJÃ+02‰ )2‰ ŒLÒxx…‰Lõ±9¼BŠLb<#“t^~"“,}ÐÏQ7¼ÂÈ$ûUŠ‚·C|Ã,ÌÄ =d~aq#n J7P1âFg`a6´AÚÆ>¦0Ã&EÜÀ†7: ³¾Íðœ !nD>*†ªû7@²¾¹*Ì$Eç$%Ú%÷RË.YÍ×ûªX¢ZªX*b( pÍH%)R #•tà0‘J¢>0ö1¸N‘Jzá3ñ¡W¤’¾Íøà„Tù¨àpRIþЃ7½è{N2$I‡Eû®’´{7²”$$ßR1<ÁRÒÙEÙx(JÞ¸€Û´.ôZYÇu”üíq¾**¯ßÖ¤ë|üÑýò%µÙؘÆqÆ<Š+Ö>tõÓÄûpÅ$SØÁ,²|Å !_¤8È7Þâ-=¡@\Šwzb(Mc-«wˆÖ§ÒX¾ŠnUïphƒ´Œ}Ìi¬MÕ;DËvt;OcíTïpéƒ~Žºi¬»§-µ’x¾l›çêr·¹@"uì]X‡‰ÈÑ-… µ '¦ˆ­#2ÌóéúûTt²7ݾ‘ S¯þêzËP×»êò r7ÈcÔìÛ íc3êzL¡®7܇Y¡n×f|N$¨»ø¨‰ºá><È Ôð…¯B] m„~ü$bÌG—1î[æ§È@¤þ9_1‡a¦€S±¡ŸlƒŸlcødùÉ‚O"|Ú íc>ÙÆ$ðÉ6À}ǧ¾Íøœ&ƧÈGE|²ê>¼Ð<>‰´èWe…ÇÞü³C@qDÕ£ÃN%­Zê=‚‰ ¥q­ ‹k©¸æ v'á—F>jƳ¹¿t#žïÌ?ÈW6ÎG­d—T°&xӱň‚KeAbÃÓg,Ö6ÕÏX¬½›U¡Ÿ±dµW"NO>ªyVœï^Ì‚½Ró9û7ùcaxçÖΤ ÓøØpâ§¡ñÂOpÁÍô«ýò‚åßõsPëB}¨õ÷a6 µ’Øü¥8Ë=¦èü] ¡P½_bÙ€ 4Þh=“9²Û¾€ž®CÞô3w‰¸fÎIÇŸUâ.×>¹êÃõû¼ä:¾ . v0Þ%bCHÜ%bƒ§:»K¤oãIž:¨x—ˆkN"Á 6ˆD•|pq09ýÐ0¡]rAìŽJVÇÞâxì×RŠü~ˆþ¨è£Š ççˆÆÙG‰üùù …ŽËvÞ„¨öpbB§SBÇÏKœ^ I†6HûÀØÇ´‡Ûæ1‰=\§Ø¹Og`{¸}›ñÁ‰$òQq×é“„$ÙIòîéTÏO%ç³’ %%ë—û>æ™Ïw®ÖÃÒ]e§5Ê4G1÷Ôgî;ssÿPÌøÀ™œy£8³ú|¥Û?Î,%p‡eÁÓ·ÆÕö ùÉmˆ‚k¯¾ñ’Û’ú>‡ûœVïóQ²ŠL.âЧ’UËä"'«v’‹D}`ìcNV1%qÈä"'«8ÉE–>è稛¬Ú“ä"’‰çÐrÆÇN"W¯AE•ȯºÌñæ©¢]¤–žO]ý’ËΟ$584bßfªøåÕ£\ž¨ù¥²3ɉò|‰²÷ÙÕ>J¼ÏG‰Z` R ˜‚Ã…•‚chƒ´Œ}̉ZH)8\îc¥àèÛŒÏI‘ЉšoNRp`_¢Ó¸Z‘¸ºßñ¥où²ùí' ù“o˜Äc6g_ʘ¹”Н£P´ S¡ø€î&" *%" ЉÈ:£{ mö±‰îš”ˆ,4LDÖÝ£o3>8‘E>*Ò=‚ºˆìM]Ê®óšÉ K0»ŽºËÑD){$¨E¨…JqD{†#:¤pX±¿ÎÀq¤oƒ´Œ}Ì8¢] G4+ZØ8ŽtmÆçtG5qî#,“¤õ*dÓúc¯e?3íR‡ž^ÛƒÕ×¶ï#X©_eï˜Éôä5Z’•ƒ<¸KW¥Ͳ*U±áÌU©¢£ûíÀ{Gýž¼´ç`ÇÖWÝwÕÍUçæç\”0_^-æ¦ æ9ŒV±áDÓŠÆÊ1úŽÚÏâ iϘ‡ú n¤!€˜HwRk#BtûØG&FA,èÄ 6œ b@cå-°—Ön®^Úö 4 ½¢¥5$®hi­t—µ7И± Ò>0ö1îÀ´†Ä-­UsüŠ–¡Íøœñ-±z;0ÐÆÉ}@7ëçX‰Â±$É5o§Ý€Ô~Ÿ³ G÷×ÍΆ'«ÔB›pÇUj۟ͺJmkµ¤ˆlo Uj‡6@º€ØÁP¥¶ýY¯«Ô¶VÅ(V¥vhãIž:¨W¥¶}Š“„D’‰5{í‰d õ;H2kIÕ™£’k·óog&*ŒÌ?ìÆ©vþ¨•@ v¼72×Õp;”[³«>/4°(Â\ˆ 'Þ>Ü:¢#(Ó&â}ï %Kø•Å·Ó7Ý)Q›Ô«”bÍRL©Ó Kÿ ®R̾ Ò>0ö1§˜F¥RLÓpÍ*ÅìڌϩHйø¨™bš“ăoˆù²Ï¶!]8ƒsºï“þ“ÁŘ2›™ý³¡.¬bpau .¬a¡lÍ .ú6HûÀØÇ ¶IÁæà .º6ãs6.5ឤD»è\¢ùœÍ©ßT½ÊA; fÊ(ˆ ¥ñíß^¥âÛ‹=«øîÛ ícs|»Šoç™çWñݵžsîƒ~ŽºñíO¢ÿ_´e¯‡`JÜtµG–ßNHOå_ƘÞ!¡”Ü>“?t‘¤`ýji§¼c+F¿‹ã M gPM‚ãÜZÙ®µj8Çylƒ´Œ}Ì8çÖÊwßç8mÆ÷§Â 8Îí?‰ã,Á)ÉåÉѱW‡‹vÇÞÕ¤H˜™\î)ÑÚ>ñÅ•—jRµó±¡¸”ò ¸T‚T J+\š“ªÇ6HûÀØÇ\J%HÕ­Õ2Š“ª‡6ãsƤêØGMàÒ'‘ª%À%9”x÷ ¨;KÅ.ÚjÚqH°>5ÈgíG­ÛW¼@š ¥ŽAÚˆ Òøö®2üˆ± Ò>0ö1C$î€áw±à÷@ mÆç´Òà÷@´¯à$Z½Ò$,…÷iÇÒg­ÎqlÅÖ=ÔÒÃsÌr3DuËl8ñİuDâKT)*ÿ²Î,–Á^Rûa:AÑú­=Bj´ ©Ñ¥šï¬«qg=FÚ¾ Ò>0ö1#5b ©Ñpf…Ô]›ñ9‘ õâ£&RÛ“”¤þN°7t~þjõ·y6à¸r…†b0´3Û tNCÝÐ!¼1I$&²Ë»Ú)Àtú]y1=¡|ùÏ@¹êBPþ$¡Ã¡y,‰"Ï4ÜÃç ʨËFvÜq"Y/3h‡ËrãE.0Ng’E#õÑ?ëD\Ê‹ö‡åd°=ÃWaNÔÇŸ1ÁWÁQz·ê޼o¤ ˆŒüq Áï Ôæüñ™1¾tᩃŠüqÝ̃ëØÙC°¯yjÜ*FvK¶¸!Wâ-ß)ÒìÀÃcY’[¡³“?rÉ«K1­gbëf¦çó¦•Äh•’ÄhÅ$1Z­$1} ]@ì`„4­R’­w°’Äôm<éÂS5!M$‰llHb$÷JÔ‚šÎkNÞȪoPGr—¤C뙨½‹ ç%â#!eõ .(Elöb[Èî«7ý`SWSphH)84?Ó°Rp mö±iSWCJÁ¡¡á>V Ž¾ÍøœDÁù¨¸©«á$GõÍÈˇó3ìû†OÀ  ùßlÐI%|Ï<áú¢26¢gÉ1Qµ;-ö±4,JK ¥°„L)¢1¥ÑüHãJ)2´AÚÆ>fX”RDvžÕ8,™I)²ôA?G]X“”"X’(Eò{¢ßͰgóK²ˆÝqLtÑ%(…xWNn€xö ÌðÑÛõžV¥¼Ù“¿ µ°®q¦mÕĆR8tLX£]JX£Öt‡nÖD}`ìc†C›ÖhË„5á„5KôsÔ…Cw’°F‡aÍ~Àa /¿Cé@]R1”ºåª°±¡J=ÓþèÒþèÀ´?:¬´?C¤}`ìc†RŸÒþ KøØ‡_iú6ãƒíOä£&”†“´?(hò% Þøa¦`}¬œ±~‘†‹¡ºÁB$‚Øp&Kh´“S¿ˆ¸JÆ›çFïOÛö*ßÃWZÂË^¶I†×ƒ¦±ƒ&¥±Å4v V»¡ Ò>0ö1%Ф4vÐ0]g` Bßf|N¢±‹|TL@¤±“$™í0úº›uc‘¤ÎH;—nòÖ&cP‹|ÍØØpâdÜ:"‘Qmb8öâác·„ á^nçæ™T6¿¼`ãùÀ|†‹Ó®˜ §}Ò§#ª ô‡±„NÓ·ÒÄF.h›àâ€Fæ@#çâôm<éÂS¹8íÿΙÙ~Ü÷ùêø%,òùÛ[º4t#p Â<‡®3e×~Æ™"ÜíE†Ò$×0-˜”–øÙ'˜•–ohƒ´Œ}ÌI®IiùÀîc¥åëÛŒÏI´|‘šI.ž¤åËBÁÁ´Amør)ùáŸâú#¨„½A ;ãí'µIUl8S¨X$ä߀ {º*‡}"³+š.+—ä>й/¨‹%YæmøÙQAðÐ󒯥Þp» ;DWÑÅGBí!*Êe¹Š°õI~”žYdéÙ¸.béçbÀÈňӫ¾ Ò>0ö1§gãúŒ¥g¸X¥g]›ñ9 IÏ5Ó3w’ŒX’žIèoo³@á[F×âTË-’ãžÙ5J#ݳKºÀ§.éN¿º¤khƒ´Œ}Ì‘îS—t×ÜÇê’®¾Íøœä’®ÈGÍHãìªH1»F:~j¸²»‘ç#=›W•µË«Ç$éL>žïmMtºí9Ç óÔþVŠ¡:Ì’ƒMl(„jÓ…jÓ˜T~hkÆCÛj‡6HûÀØÇÕ¦Ñ ¨îïê¦>‡ê¾Íøœ:†êÈGE¨6ÍIRV T ˜c€Ù@Ï冸[²û$YÃ*}—€øF%„[Á…Q‘²2ĆR¸ÐLYitJYi4SV½RVmö±.tJYitÃ}¬”•}›ñ9‰²2òQ.ôIÊJ \fIýÓþ5œäÖ¬|¨¬BPLM$–$«ý½¢„ür9¿TìuŠâ ¤e/cœ ¥ d˜ŽÒ˜”ŽÒð38cV:Ê¡ Ò>0ö1ƒIé( °³ÄÎÀA&åÒýuAÈœ¤£”€  ÑÉ7òˆ êXÏï,å7¯ó«¼ê›ñ¢äO²ó'Ùw“<ž/8‚©a*ÌÙpÞ±h爇¤Vಥu›‹¾Èú¥`¯Þ9ø"2(Ôl yA¿ÔÏð@ãÏ*Á4(ÏôÇC„ê×·ÒÄFž Áà ôÌzÎìÛxÒ…§*ò=Gm ’ Ý®.Ú…–õuì‚‚,’ Ò )xÆÎ4Z­ul(MÍ¢Ÿ¢~*cüJˆ:´AÚÆ>æÔÜ¥„¨Æ±Ó¥ÎÀSs7 Q—>è稛šûs„¨ù(;˜‚—¿øD@¡Øþ’+"¦?³N5ÚØpb]8´l|üóžN†cIÔ[Ÿ^×⣃¹Mûûzä«ÑýhFLyhBJyˆüð›•òphƒ´Œ}Ì3BH)Mà‡Xa¥<ìÛŒÏI”‡‘Š36ç(E3±ף¿Ÿ¤3Âl8}FXÆÇ[ÌR‹¸‡Þ&ÚAõáÇÜ|ÌܧÍÜûfº(jÍ@:ãQû`¦CÅ.}DåS3?·D½ºôqhƒ´Œ}L3ªÔ¥¨Øùkg`3]ßf|Nréc䣿L§ÏQ"Jf:ëMÂo-¯/¶ãàS‚˜¢úÏùš|oTÚ±ô9÷%l”@Øwš‰z¹ˆ¡6€©RªEä'+ÕâÐiû˜aRªEÃ}¬T‹}›ñ9‰j1òQ6Ì9ªElXy²¬¨Æ• ˆöÜÍ,9|ûª°%Ì¢^¢ÅìÏ 2ñ bJ<ƒÈÄ3ˆ+ñÌÐiû˜QSâDà>Vâ™¾ÍøœD<ù¨‰öñŒ%$GÙÒ7 •.îÞèÖÝÎm»Èxlˆ '*¦m ñuçË®Y±ûäD‘÷ Z®S¥£üË öeDVÃþÑTë˜z ]J½†ü|ÝJ½6´AÚÆ>æ©Ö¥Ôkè4÷±R¯õmÆç$êµÈGÍ©ÖÏß}ý©VrÉáû ¦ƒ§vÉ u‡2™ó›¢j%ÏÃÓ8+{Åfe)¶~~ùùõks L%BòçG ¾np¤Æ˜õÉÙ»ê2ÊW=Ÿ#¨ì«¤.‘Ü S»žJÿE¿BÄ®3îëOcF»ZF§Ù9?ðhá›z¶Ïã']׳ÙÞ†Ð0|låsN»þ€ãØÊBäc%ñ1T¾·ìߌQ¤v}ô¨„­tÀ9ÕN̓ÃoTûèÓ7þÝÒõÃÁþóëÏ/ÿ©òLE endstream endobj 710 0 obj 9632 endobj 714 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 778.250000 162 785 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_special_variables >> endobj 715 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 771.500000 216.750000 778.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_typemaps_for_c_and_cpp >> endobj 716 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 764 158.250000 770.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_code_typemaps >> endobj 717 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 757.250000 177 764 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_directors_typemaps >> endobj 718 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 749.750000 127.500000 756.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_typemap_examples >> endobj 719 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 743 238.500000 749.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_simpler_enum_classes >> endobj 720 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 735.500000 261 742.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_exception_typemap >> endobj 721 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 728.750000 255.750000 735.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_nan_exception_typemap >> endobj 722 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 721.250000 212.250000 728 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_converting_java_string_arrays >> endobj 723 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 714.500000 231 721.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_expanding_java_object >> endobj 724 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 707 204 713.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_using_typemaps_return_arguments >> endobj 725 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 700.250000 243.750000 707 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_adding_downcasts >> endobj 726 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 692.750000 228 699.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_adding_equals_method >> endobj 727 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 686 228 692.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_void_pointers >> endobj 728 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 678.500000 172.500000 685.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_struct_pointer_pointer >> endobj 729 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 671.750000 296.250000 678.500000 ] /Border [0 0 0] /Dest /F#ed#3atl#f3#1f#12#af#26#ac#be#01#c4#1au#99#99#d4#81 >> endobj 730 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 664.250000 263.250000 671 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_memory_management_objects >> endobj 731 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 657.500000 291.750000 664.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_date_marshalling >> endobj 732 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 650 142.500000 656.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_directors_faq >> endobj 733 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 643.250000 115.500000 650 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_odds_ends >> endobj 734 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 635.750000 159 642.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_javadoc_comments >> endobj 735 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 629 218.250000 635.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_functional_interface >> endobj 736 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 621.500000 184.500000 628.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_using_own_jni_functions >> endobj 737 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 614.750000 192.750000 621.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_performance >> endobj 738 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 607.250000 135.750000 614 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_debugging >> endobj 739 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 600.500000 115.500000 607.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_examples >> endobj 740 0 obj << /Type /Annot /Subtype /Link /Rect [31.5000000 587 99 593.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript >> endobj 741 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 574.250000 96.7500000 581 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_overview >> endobj 742 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 566.750000 105.750000 573.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_preliminaries >> endobj 743 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 560 143.250000 566.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_running_swig >> endobj 744 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 552.500000 181.500000 559.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_running_tests_examples >> endobj 745 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 545.750000 140.250000 552.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_known_issues >> endobj 746 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 538.250000 99.7500000 545 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_integration >> endobj 747 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 531.500000 178.500000 538.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_node_extensions >> endobj 748 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 524 178.500000 530.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_troubleshooting >> endobj 749 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 517.250000 152.250000 524 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_embedded_webkit >> endobj 750 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 509.750000 162.750000 516.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_osx >> endobj 751 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 503 147.750000 509.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_gtk >> endobj 752 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 495.500000 207 502.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_applications_webkit >> endobj 753 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 488.750000 97.5000000 495.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_examples >> endobj 754 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 481.250000 121.500000 488 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_simple_example >> endobj 755 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 474.500000 118.500000 481.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_class_example >> endobj 756 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 467 112.500000 473.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_implementation >> endobj 757 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 460.250000 138 467 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_source_code >> endobj 758 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 452.750000 147 459.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_code_templates >> endobj 759 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 446 122.250000 452.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_emitter >> endobj 760 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 438.500000 140.250000 445.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_emitter_states >> endobj 761 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 431.750000 206.250000 438.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_jsc_exceptions >> endobj 762 0 obj << /Type /Annot /Subtype /Link /Rect [31.5000000 418.250000 79.5000000 425 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua >> endobj 763 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 405.500000 105.750000 412.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn2 >> endobj 764 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 398 111.750000 404.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn3 >> endobj 765 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 391.250000 189 398 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_commandline >> endobj 766 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 383.750000 203.250000 390.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn4 >> endobj 767 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 377 180 383.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn5 >> endobj 768 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 369.500000 153 376.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn6 >> endobj 769 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 362.750000 153.750000 369.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn7 >> endobj 770 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 355.250000 126 362 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn8 >> endobj 771 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 348.500000 129 355.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn9 >> endobj 772 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 341 146.250000 347.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn10 >> endobj 773 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 334.250000 161.250000 341 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn11 >> endobj 774 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 326.750000 243 333.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn13 >> endobj 775 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 320 125.250000 326.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn12 >> endobj 776 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 312.500000 130.500000 319.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_structures >> endobj 777 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 305.750000 135.750000 312.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn14 >> endobj 778 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 298.250000 145.500000 305 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn15 >> endobj 779 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 291.500000 208.500000 298.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn16 >> endobj 780 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 284 174.750000 290.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn17 >> endobj 781 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 277.250000 144.750000 284 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn18 >> endobj 782 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 269.750000 185.250000 276.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn19 >> endobj 783 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 263 206.250000 269.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn20 >> endobj 784 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 255.500000 145.500000 262.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn21 >> endobj 785 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 248.750000 159 255.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn22 >> endobj 786 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 241.250000 148.500000 248 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn23 >> endobj 787 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 234.500000 141.750000 241.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_namespaces >> endobj 788 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 227 187.500000 233.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn27 >> endobj 789 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 220.250000 158.250000 227 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn29 >> endobj 790 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 212.750000 168.750000 219.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn30 >> endobj 791 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 206 99.7500000 212.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn24 >> endobj 792 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 198.500000 156 205.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn25 >> endobj 793 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 191.750000 146.250000 198.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn26 >> endobj 794 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 184.250000 161.250000 191 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_typemap_arrays >> endobj 795 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 177.500000 209.250000 184.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_typemaps_ptr_ptr_functions >> endobj 796 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 170 117.750000 176.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_writing_typemaps >> endobj 797 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 163.250000 168 170 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_typemaps_write >> endobj 798 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 155.750000 153 162.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn31 >> endobj 799 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 149 153 155.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn32 >> endobj 800 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 141.500000 195 148.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn33 >> endobj 801 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 134.750000 175.500000 141.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn34 >> endobj 802 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 127.250000 140.250000 134 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn35 >> endobj 803 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 120.500000 198 127.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn36 >> endobj 804 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 113 170.250000 119.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn37 >> endobj 805 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 106.250000 161.250000 113 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn38 >> endobj 806 0 obj << /Type /Annot /Subtype /Link /Rect [31.5000000 92.7500000 89.2500000 99.5000000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave >> endobj 807 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 80 105.750000 86.7500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn2 >> endobj 808 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 72.5000000 111.750000 79.2500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn3 >> endobj 809 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 65.7500000 163.500000 72.5000000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn4 >> endobj 810 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 58.2500000 180 65 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn5 >> endobj 713 0 obj << /Type /Page /Parent 2 0 R /Contents 811 0 R /Resources 813 0 R /Annots 814 0 R /MediaBox [0 0 595 842] >> endobj 813 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 814 0 obj [ 714 0 R 715 0 R 716 0 R 717 0 R 718 0 R 719 0 R 720 0 R 721 0 R 722 0 R 723 0 R 724 0 R 725 0 R 726 0 R 727 0 R 728 0 R 729 0 R 730 0 R 731 0 R 732 0 R 733 0 R 734 0 R 735 0 R 736 0 R 737 0 R 738 0 R 739 0 R 740 0 R 741 0 R 742 0 R 743 0 R 744 0 R 745 0 R 746 0 R 747 0 R 748 0 R 749 0 R 750 0 R 751 0 R 752 0 R 753 0 R 754 0 R 755 0 R 756 0 R 757 0 R 758 0 R 759 0 R 760 0 R 761 0 R 762 0 R 763 0 R 764 0 R 765 0 R 766 0 R 767 0 R 768 0 R 769 0 R 770 0 R 771 0 R 772 0 R 773 0 R 774 0 R 775 0 R 776 0 R 777 0 R 778 0 R 779 0 R 780 0 R 781 0 R 782 0 R 783 0 R 784 0 R 785 0 R 786 0 R 787 0 R 788 0 R 789 0 R 790 0 R 791 0 R 792 0 R 793 0 R 794 0 R 795 0 R 796 0 R 797 0 R 798 0 R 799 0 R 800 0 R 801 0 R 802 0 R 803 0 R 804 0 R 805 0 R 806 0 R 807 0 R 808 0 R 809 0 R 810 0 R ] endobj 811 0 obj << /Length 812 0 R /Filter /FlateDecode >> stream xœí]K¯å¸qÞß_q×ÜŘžG€, f€,‚,‚±Ãð{‘¿IÔ‘X%–U‡zÜžñÀÝ}ëÖaQ:¬‹_ÿ¯?ü÷ûÿüãý÷_ÿð¿ï?MýÃ[÷ÉC—þ÷>ü÷»œ Ã§éßï>ÀûO?¿ýòþËÛ÷oß÷þò–>ðÃ×ÿÞÿëÿÞõû¿õÿÿËûþWOüÃÄ40üüæ•ïÿþëøwôªÿW7ÿ=Ðÿüöÿôþ·ać¸i2øçß9ý0‰'‚y{<¤ÿûÇO{û}zü=2”hß•5ýÑê÷¿ÿñíOÃcIæ©ÖóTvá:3~¶K‚ýBçû†ñJT×ÿé'1á§·þïOJEÂÌx Èe H=~ì|^QjüšGÿç4ÏÇø9~ê¿Íæ/`x~ü$ óÝý²ñÁÏ?¾ýþ»ø®Üûê5¾èô×ý»ÝÿÔÏ"¾ÿø‡÷î:õí¿¼ÿø—·~ê±sÆï%ýF÷õÍøûÉš¤óoŒÞÿý÷™îkVÎwé3Ëð¼àÏÕ¬¼¼.ÐA ;?¼!ƒté ÷ ºàѤùÇ ÜgøÙïyi9À'£ƒÂ¿LÖt‚Çàç–>óí½iY´£d1`ÔXÕ=,†—þÚ+^ÉÑš˜mJ&G1=šœ‘ð˘MŽV%“£;*£[™œgš§B&g‘q¥ÉÑá>&çÉñãoâ'rÕÀ8¨4ˆ2Í«±¼j¯øçÒ5zN`%ø÷ÇÚ‚ 9–uñô­+õ0:ô3Õ–EÇŲ@NxX–öZ4ÂZÄÛIÏ.Ûò­™Ï“F˜éC¿Ù³òŽì²ØÐ^#x÷ź¢WÌ.L^ÎÆ2÷•ˬ¶Ÿß Ó¥å÷̱YE›Õ%Çf-q:=:¶‘ð˘›íJŽÍD"£'PÇ6ðLóìc[d\騬¿cã?s£Xz‡¢óöJ"˜UÚûzðj—dÃì’¬Ë µ6ÁuÄ&8U² Î}í Ô&Œ<€Ç€\Æl –l"£'P›0ð¤yÎcàç¸Ö&8w› ¾f·g’pà;6ˆâ=.îØ,ó.·iœzöV#þæ_èjø¬ó³µÐ!'Àö‚f|™æ˜¼Ïþ¹£§/8ƒÝÊ(±†Ú#û9øK?‡.™Xç&똨úÝÁœ“N„ŸÞœ¬¬zð4„Éôìéçì+þ°÷D@Oè?&1ð4DÀþüöùŸN7Ñ¡×a€C,t[kû±’|2íÖU÷Éy…œ†úª>øìúM3†¤Xî¡ÚAN¨ ¼b WŒ…ÀËÓC?:dSâ<ä2æÀ+úRàéáIt«Àkà™æéQàµÈ¸0ðò½ZKFÛˆK§C©³TF’<{Û)É—ñç웽:õZúæ% Â1` JzÇ/åkÁG’§æ³|¦œßñ랟5ûŠ%OÚø0“ß/yúUJÌRu8ˆ®€ëJºòÄÉ{屓ïMxÉÉÓc>?óåN~ä<ä2NÞ+Wpò^‘ãÊ@œüÈ3ÍÓåN>“q¥“׿#8yvnÆç3g|Ú÷HoCï­®?VâÝz¬³*’MÐ'Cü›­ööÚ.Þr‘Þ°¶~ÈÔÚɇ€¯æoL¶~ûDæ\Eëƒ À*ê´*©è³ Ã8dôn¾dÐ#W?¹æAÂÈx ÈeÌA†Ra,•aWAÆÀ3ÍP±È¸2Ȱúšß+ðúÍîp6|ü®¨EÖïcé5ÿf¿iµ9·3ÚÙ•t×½ ´î¿X»Ì‡ßìnýK ¿ÏBýIâܤd«/YU« PdMöðJED‚N‘¤º j…žE$$"WŠH(àÃO€<¢y¹Œ9"[ŠHÀPf‘ <Ó<-ŠHWF$N}„ˆDµLHìûjS"ÊJ̆ÜDWn®IÐŽ Ahù¾Aä¾øoIPÈÒÖÅŠì?û›ÐœÚÿ[}¨ªÙ)ЧÎѦWà>éqy¬ó\½ˆ6ýüf£*©×3ç-ñxJÏ{âFø öX~vqˢ=ž7%ç5•¡WÏÏ.n?ǵ/ÌëåÎOãî@ÄHÂaI Èõvñš”dµï sÙ„±*'¸)· +o—ù+«Ùo¶ þö$÷²f‘Ô™JN²Û¢fš†¼*ŠÓ²ñF«3áX¯~~ƒ²¢=ó‘4 ð±Ô,ÀS¼›«f‰ð˘½p,5 ð‘âöâªYÀÈ3Í5 Èd\é…ã1Í{avnØ}ç*†¾r׺¹8G%€3áÀ]_*8]¾üˆ×¿`$©uag°ãåß¿Z‡CÔ©ßö5 +ýzâpúgÁ'¨R«ˆ@±WA­ZE$Àc@.ãáp‚*µŠª£2V­"Fžiž¨UD&ãB‡Ô1­";Iß~ÛÇÏàòÛÙù¾'fg¿ÛåíǬÏÊŸ<³=»žêÐAÍõbv2‡÷ªa5æý4ïDØÕ:Üཊà0“Ÿì˜{w©æ:V{r²ºû­£‡ÒræÉ éL©7F §`V½1à1 —1{rSê4j êÉõ£7Æ2~Žk=¹9¦7FcO.iõ!=¹$c,njþð{I™Èh¬dëѶ®çYpµO7K³1=5LD÷‚B7Þ6KÞôÝjŽDEx¡Õ*_^÷Ÿd%õþÓèÒÒzæ?ô‘ Pê#('ÀªLâ<ä2fÿiK}d‚%°¢@ý§}ô‘YÆÀÏq­ÿ„cúÈ´õŸ’®Sê;În˜þ`FÐ[A²)Sò†R^¹øb1HÓG7ãÃ’}_«ŠªsI§U!'¸±V[…³ÝÙFCßÞën~´bs‰¿áÙ9Ò¯ü™st‘8Gß•œ#Eî„ ¹“;·‘ð˘£ %çèi Pç8ðLÈ9ºxçèïÓÂç´ökM¡9¢ðêa/M×ú¹†Ï—Ž,üqDîÿ½Õ”08ò>”Þç3“H{¦Jí™…y„¸jÏ”x¹ŒÙd‡R{¦\e P“í™–1ðs\k²ãÇnÏ$iܤüþÄSÛ5B|§QŠs*'? Š,>dcŸÃ¿zþK¾®¶°A×"QþL’ ¾óéÕYMMï`£S¼H¾ÓúâÝË`U ã?³qEÓ€ñ×vññÃ…f¶ä.žÄ\±#ݲb 1W¤H§¨Vݲà1 —ñˆ¹ú‡.Ä\±#ˆ­@b®‘gš'ꖕɸ0æŠêCtËâc.A­ûÆ\ûê~m‘MmDÕÒÎÊÇœpà6¹„Ôé¬ w,ùÙq !)_{áÀStÇч<Ë>«…ž$Õ¾6 2:XÓ‡6Y¾¤úÏ¢ MÚdE]j“)ú*êU›¬Äx ÈeÌÑ….µÉŠÚR«6Y#Ï4OÔ&+“qeta>B›,~4I-þQ³@Éé¹$d¨?S–ÔíoX‰Ë»mdN©ó:ËIT‡Of®´ Ž<»&ö‚QÚbK$¾»Ãî yÚñÚÔâe‰!nü ø4mg³‘’t˜oÑWÄøøne|^¹)Ú9ñ4ýì w#EðÕEq„¢ëFƒ†0¹€én¤hmán¤h `èÝH#O@C,໑"œÝhLt®Æ|ófaÕì¬~‹gÝ*qäórQà®Û "ÌuÀ¦³9áeÛæ,¶mJ¶Í‘kÙâˆêÂæÉ=¬Ù<„Évú?Ç•šßÏâì>"ÍøoËÞÛº±õÞÐ9©S¾¨$·íMtM¡Ýü‰í†¹ÝŽÚ•…í—ÿ\ bÀ愱{AHó¾´ë7²¢üŸmƺÖñJñêûù :WZŽÏœ£VÄ9êB댞j‰ãÒ´uÆÄx ÈeÌÎQZgØNE"CÑÖ‰gšg‡œ£¾AëŒ~g·Î8GÑýCw]¬9Ä™«¦ØQC«ú­ÈÆ…N_=±ºÕþM/m*ÒÍúø6½ ¤<.ÿ#Eb;l¹Á¯Þ*_zõÏl¹íˆ-·…6=Õ;ki‡‰ð˘m¹)´qè©È0´CâIó4Ùr{ƒ6ý,În㠲傛[tRˆR=jÓø\ÔÈ­)®vÿ>àµäJ›™HŠeî—-5Þ;<Ô«õÒÂÄœPke!+ë ýzª&ÐÑ~à1 —1[Y(ô詞ÈÚ ñLÈÊ úô~v?‘•m{–*)âÃG½M ¿§ÑªõÌ͈]ê›]VÄý©ªíü'M?Çõ©ªí‚B‡ž#Ÿª&ƒ†0¹€tªÚÿì×§ª=ÕÞ‘SÕÄÐ ¸îTµú³ëºEϳûï¸äG l{Éž3Ôþ _JÂÎ ¯ïí·Ô†•Ö¯|¼jJk#°YË7VI¯LÁ§.ü2 ;Z 1 ç÷ü 6–@Zë¥Ó„o¹ßðrŒÜmØ^ç³~Râq`…‹Üû®'‡Zz;µ—¿ †TéeÇáU'£,v2Ê–œŒâdq2#AC˜\Àäd”-9e‰“ÄÉŒ< °€ Œ‚ 'Ã/Ô¦Gû·îÁ)òjÓu!-·å®Þ sÂËëßy¼þ](­ß‘åé»Õúx Âäëß¹Òúï·X€ƒÕúx"`W®_QÈ-Yÿ€Ÿ÷`8%BÉŽ¤ic†VQ–ZnÕÆ~!T&TÀµŽ=¡PëØSÉqÙ@ †Äx Èe< *j{ª¥2h­câ™æ™×:æ2.L0 ó9WãÑ —F…\ßn‡Ù#³ó§[Ÿw%%ÔrÇ IºÍ.ÝÔ`ÝÔ+è¦îÈñÇ@ º™x¹Œ‡nêÎtSw†Ê0T7Gžiž6×ÍLÆ…º©UEÍÊYº)p¨_šn·§»ÔîµÚ«UV¨rÂgÓ] +õ¬jÌ/2E¾·áÚ©Xú"Ÿ™am‰Ö…Û{*9Ô ëÙîj@fX[b†uáÆöžª© zc{â™æiÖ7¸±ÝjóÜže†%)bàC Þ¤ž„áÙ]ž¢7œÈëš8™Ôåæ,cNx5 ­A mm! i~K§üVžy Â䦂¶º@ÐVQŠ&Fž€†XÀ… m+*mÊ)ê¡Â/æ¦`ð؅ϾIJ÷åp¯Êd€ÎnÖ/ Ÿ µžÎ‘âíJÅ+Ú‘âíVÅ+‰ð˘=+¯h×Q«â•‘gš'*^Éd\éé\EñJSej› ໇‰2xmU¦mš@à¹7Âlþ°ßÏF7¾W÷1Ë"F#ÂûM ~!ªçÙU»t«Éwa'£_€RÞWûøýÿãÛçÓ ^¿³¿ïPQp¹Ákœ1å³’j"öIé×\ÓÏmC-øßaÑ+šKõr‡íTN¨Œ‚LGí¦+!Û M‰šn…lO<€Ç€\ÆÅ²]GšÚ+dûȓžˆí™Œ £ ÓU ÛÏ2 ’FѼëjÚ=^Ô¶£m[þHD€!ÕJ÷´Z´6¢1Kówcºœð²5Ê_îE®)_®0m½(ß}OÙµ‹³q@È»ü}þÈ,Ý„ „œðúr5îúåjÁ\¶\>a:.¬'>„Z¨á´j–N…f,Cž µQÌråƒJQ ͳG¯È˜x¹ŒGc pEFO%ù¢@¢˜‘gš§CQ ø;D1îd•d•‹’©_f.§:dXzãiçrÂ÷“9‡WŽá#Iþ|TrrÊ¿éUÉsóØU šwÈ<+Oh¾átrãÜ$F'úÕoÂýJá^9ê3Ë}ÓϾpÔ7ÜNâ9êy Â䦣¾~ŽúŒ·T€¥G}#O@C,à£>Ž*JjÄ¿LøÉx&g²NrBm ÐÄÐÐL‘‰+`â<ä2æ8.–@€&ÒŒW\Gžiž˜É¸0Ž2‚ç®úÆgrü~U€ƒA1j#/»ôCÀ¡rý[EÐWV•ÐWc“|m²þà1 —ñXÿV•ÐW©;=’±B_<Ó<ú*“qåú×Ï÷½§­ÉΛÝÇ´ìV½¸—~f:}ɺ É hê·ÿ…(§ªp2H”3ò4„ÉLQŽ5%@“5Š XšFž€†XÀ…QÎÐuãõ.éÑÀšÎ ]Îjº{Ox”]:V¥ÛL¨uE@àQJð(KÓ]Vð¨Äx ÈeÌ®Jð( •±‚G<Ó<<*“q¥+‚ƒàQøMãP¬mkÀ&m¥øüŸKΦ$IÆÿ…NñÕšçCW *'Tjt¤ß¨R¿? ™P«~‰ðËxht¥~БŒÊ@ š1òLGýþ2j¨ƒ 4Íh›¿‹fìëe]_¾{©ƒµ´Œ!'ÔªñÒ]ùAˆ%56Ѝ˜Q+5y¹ŒYµ/©±vD†v+5Öî¡·óø9®UcsÄH¢Æ‚pQf“–Më»opöŽ:úmíÆ÷C)¼p«tµy2 6Ì…œp`I Xj•¹zÑ«e"è¶$Z@‚]æS,UE¡þBø´ý†7›g‚«hžÉ#g~kžùè{VúÌ7¬œÚÕ1® ¿lžÏ ¯:AÄm(!–ÚPºŽœ rè4ò4„ÉL‡NKm(!’S­@Fž€†XÀ…‡N®«ˆWXõj܆ò·6|'´ásK§®„ÌŸ ¯ê¤S¸5¦S¡¤“š´ÆT'õÔsÂä&tªÔÓ)Òs y"`W꤮pKtò·N^[ÎýÈ.{Ió–æL©ñÑL¨Üª;C`:Sj€é 9÷d«žx¹ŒÇVÝ™RLg,•±j€9òLóD 03nÕ­@•6U³ÆåÜüVRŸ)ÉÅÝù~Öco~>­Û]Ó<‰è8žowÉuÔ&#ÜÒzËê˜j 0€s¿;*` u`xœ³1 —1`(œ*cpvð8/càç¸Ö» €óYø¬Ã}ÁÑúÆ~åú,êYv½oGò¤{Љ>äë:«!ÝFÛ9ÉÕÕmÒö‡»¥¡œëÂfB­sðýï| ýï<9«Ô9øÙx„þŸeÌÎÁ—ÐÿÎk*c…þy¦y"ô&ãJ瞛泜Cã*æßœÃÖgXk·¾ÖZ²•døê»wl /ÀûmÜmتæÉ…®j;›j­ÞrsÀƒ`KV/’£}ÝÊê<€Ç€\Ælõ¢.Y½¨¨ µ²zc³ÑŸãZ«+j@βzÖêíènضwÿÊl´…¼9¶À/ÍäŒA„WOüÒ×~úÙN‰ð˘U?” || YÀ@U?< |–1ðs\«úñÀ¬Hõ:Q­ÀŽbI•œäH²¾Êå´3W‰þ[糇;íÇÒ”/5.ž /÷ô\ÞÓ;¨cÀ²mõñ´Û®>´o¤ªÎÕ­[™•U#ä†Ýãª:õìøšvÜy̧þø€¶~·&Ê¿²¥f]aé Þä„Ê-hôºô4Qô èx¹ŒGÈt è´¥2V@ï‘gš'zg2. Ù‚9è-r’šl¾.Š7÷tpÛÖ û”°t‘ÔsB­ÎX‚Í ¶„Í 4…ì ››x¹ŒYgl ›¬¡2VØÜ‘gš'Âæf2®Ô8›+Òû)©óù•¹¤I½–~:¹$؇n Ž ƒ+¡Mî·B7&Àc@.cV/WB7§©Œºq䙿‰Ð™Œ+ÕËw÷Q/¶‰è¸¹éÑñ]‚ßj5[º?7Œf„Z5 NB Nh"-„œ.ñr³š…œnÄÌ`+8]ÂÕth üתY8N'R3VÎ ÔLRCÁ·Öh[÷Þ6Á´ò©Vð¥¤QˆP©à±#™cWjÌ;Ò˜y O<€Ç€\ÆCÁcWj̇±ŒUcæ‘gš'j̜ɸPÁcw6 ŽÿŒùµmí%²|ûÞæ‚Þ Œžä1Úš°Cò–vœyn„F‚;~ÛÌþ¬ê@É·/À®±äûÂø´LµAå„Zï¡ J0êJ0Ò¤]Ô+”`â<ä2fï¡K(Á¨Hòq Pï¡(Áe ü×zýP‚FrhpVàÈ£©á‘ Ð(ò¤ËÉy/õ%CÔâÒGÖÄ.'ÔÚ6KpžÑ–pž‘&W£]á<à1 —1Û6SÂyFC’ÄÚ6óÀy.càç¸Ö¶Ùá[¿ìtUN¨Õg ÓèJÓH³¹Ñ­ §‰ð˘õJÓ$+=¨>ÃrºŒŸãZ}v÷œnèómïÉ«*¢âÀUKhɆz§­'¿ñ=Õ6=º²Ÿ´ª¾îØoCÕÞ=J7ƒ5ì¸ß™ µ†Ò€nô%€n¤ùøVÝÄx ÈĕҗºÑ“s…@ ¥t—1ðs\k(Ã}º¼¡UÜÞ¯¸~C{Mè6¬‘ øÀjöðFaÇf«i•sÛ<©èÂÍ.UÒ×EpŸ§¤ƒÿº¦ä]µY¤¯ýL¨5ëËKBX›õ‘#7¹³•^ÌòÄx ÈeÌf=º’Yô4)Âʬ<Ó<2닌ëÌz?ûà¼7ÌzÓŠŒÆûYAôåÜØÒ.ûYD¨Ógèåö„(·§F¢ÏŠ‚r'Àc@.cÒçžPåöTKePPnâ™æ™ƒrsWê³¾(wCŸ›Þ_ÛXŸYˆ£¨m1fB }®]mQôŒÕ26æ„Z‹b€XS€,÷Ô@´ÝPÈòÄx ÈeÌÅ Ë=ÕP²œx¦yZdQÌ ËÐÙû@–7,ŠÌ|’Eù¯D«Ök;C´ŒV9¡V¯Á½†Vº§z¢s@±Òà1 —1ë5°Ò=US+x¦y¤×p¬4t®ûz-@Q6ß!j`Z¿ßÞw¤FšEænµ˜^­P†~…_]¡ÜÏá> dÉú½¾vY´ •ì5Y¯Ãg÷_f綆ž Ìʆó|HWÖ¾Bf‡Õ^WæØ]¯Ìñ>€ãÆÊ,¹ì\V½ãҌѺœðòT]¼| *õ`‹¢[®%½¬W]üÚjW’Z(µ ô<"¼Øß”™þô³Z÷w_ ¸¿sâ1h“ HýAé¸îïÜS éïœx"`×õwîgqhOÒÊm´¸ E$x8IŽrCΞ+Pá±!öç*7øÊbhô.¦°ÁWtó­€BÛ&Àc@.ã±ÁW¶më©$‰0Èä™&žCÛrnðm;«{s(ïgDÛIýf“†F‚3Å ³/-¡`i¼8)ù.\(ˆ•p\(¯ˆ{Šëšx¹ŒÙJ¸®«§:"ÃQ\Wâ™æé‘•p7Àuõ¯à \—ÄJHöJ÷Co}(íÝ™TT~i{¨lN¨ÕÞà‰ö†|g fÅ|'ñr³ö†|§§‘(|'ñLótH{Ãà;*ßh¯{ù£á;u1ü ºý:]PB`sB¥ÙÐA 鮄ÒA b6à1 —ñ0º+¡„tg©ŒJh䙿‰PB™Œ ͆V¡„$fãW²‰¾ÌlÔê¨V î&-bEp7í×ã ¯Gþ5Þád¾aMê‡|žßа+›hÂÐ`ÂPÕx%Å«õOO?»BŠWÓ ¬NØÕ÷øJð…ðò~"h¼Ÿ…+Á{*p?Ð+ÁAC˜\Àc? W‚÷ÔŽ  W‚'ž€†XÀ•û‰p ±iʆ³ÝqeŒ Ì»Gíë}ùY›ý³®-o%I’2ß²vI²EäŠm7œûvj!» Üä„ÊhÉt¸ÇgO(ôøì©$»o:Úãsâ<ä2Ñ’é =>AGzJiÏÄ3Í3ïñ™Ë¸0Z2ÝA`Y>08 \ô1s4—Ùž Êo»$¦zµG¼Ì÷5ÝhJvîm%î<Ê5Ý ¿²Öæ„ZC¬;bˆu¡!iO%¥ÓFÓ†¤à1 —1bUhHÚSI ø@ †xäIóTb}ƒ†¤ý,Â6K ±¿ÅG³qÈiŠà ¶ñ¬O ‘ß(Þtw¿Ã'l˜ógMª«ÍŸ^ú·FDxuënLD[wc»ÂÖÝXwÖfÌò£Ý÷ÈcÐ&0mÝ …­»1ž0žnÝGž€†XÀ…[wc½K.ôúŽÛâ ‘”ËîèàÚv×-ét*éw’’T1Ÿ¼ý®Üd;£ìÆýçB¨í€`ó ”°ù†·Âæ'Àc@.cŽí „Í7@Ž=íàÍ_ÆÀÏqmlçÂæŸÔ”àƒæ¥xƒÂ‡‚5x³Ñ8ã#Ò¶>¨é=x»½žår­U7¾~…H:Ñ~³/ÐuK£VL¨õžTzJ¾ JV•‰ð˘}/UzO*=õþQ鱌ŸãZ_ªô8«§ÅŽ:-Ém—¹ÓJ>©à3.M`°ö&&ÃRcâCN¨5X‘Ô˜˜Xª11ôôÆÄUIâ<ä2fƒK5&&ÒS¨¸ª1y¦y¢“LÆ…ËvÕ˜œÔE¢g‡tV¯ÂÓHZÓJ²üc´íLô,.¬5 ¶[ŠZrÂëE-KCËßx¼,KËŸÏ(E6’åa^ém–Ž4ù;FÓÛ,À¼øl¬Ž¤føëd ¿áå‚Öñ%)6@àÿ-|W›<–YRNç„WÃv¹ gúÙÃÖEœ·$1<ò4„ÉL‰aë ¶ÎR–&†Gž€†XÀ…‰aëŸ{$þ¶éÆ©JØöb>1,wI\†OñzL8æ3­Ÿ­ê37^ÖÉ€ë¶l(ÕmÙ@ê¶ÕÉ0Õm-C˜\ÀC'C©nk¨F#Vu[#O@C,àJŒÏë¶D:)Ù¢n‹*ªmäsVÝÖˆðZÍ‹Ka•Ö9¡r3)¬‚®TX)¬d3óî+rÍt¥Â*è4•±*¬y¦y¢ÂªLÆ…›1PÏ£­šÝº½qÛÝ›ÄÙ( —41\ýÖøÞ»Ug§=¨¥Êu9¡ÖÖ,7Ž<¥B*ÐäDq P[£…TÙ˘m.RVTƪj䙿‰ ©2WÚý¼ê4[Óôâܶ­Ô·8? ß&9g\'²$©'É~e»ÿÉ]µÕ[šÛ¡a! Vïû·ïßéUy±~MÿþÃ/{¤É„r[ó©SC¦ç]? ›š™¢Q_x%)ÕkPWѨ[ÿfrºúÓ”iÊöÜŠýò¿áä˜gmCKsûnzÒu²Ë±£M):º‚ø•êÖ8­ ÒðþI°ðŠý̤Šj×£ûeÝKœWýî" üê§þøÆ³#ï§‹ýû÷ïßþ]b°Ø endstream endobj 812 0 obj 9759 endobj 816 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 778.250000 153 785 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn6 >> endobj 817 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 771.500000 153.750000 778.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn7 >> endobj 818 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 764 126 770.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn8 >> endobj 819 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 757.250000 129 764 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn9 >> endobj 820 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 749.750000 146.250000 756.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn10 >> endobj 821 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 743 161.250000 749.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn11 >> endobj 822 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 735.500000 125.250000 742.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn12 >> endobj 823 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 728.750000 176.250000 735.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn13 >> endobj 824 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 721.250000 145.500000 728 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn15 >> endobj 825 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 714.500000 171 721.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn17 >> endobj 826 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 707 141.750000 713.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn18 >> endobj 827 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 700.250000 185.250000 707 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn19 >> endobj 828 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 692.750000 145.500000 699.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn20 >> endobj 829 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 686 159 692.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn21 >> endobj 830 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 678.500000 218.250000 685.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_smart_pointers_shared_ptr >> endobj 831 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 671.750000 201.750000 678.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_smart_pointers_generic >> endobj 832 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 664.250000 215.250000 671 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn22 >> endobj 833 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 657.500000 129 664.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn23 >> endobj 834 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 650 165 656.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn24 >> endobj 835 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 643.250000 138.750000 650 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn25 >> endobj 836 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 635.750000 150.750000 642.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn26 >> endobj 837 0 obj << /Type /Annot /Subtype /Link /Rect [31.5000000 623 84 629.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5 >> endobj 838 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 609.500000 96.7500000 616.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn2 >> endobj 839 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 602.750000 105.750000 609.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn3 >> endobj 840 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 595.250000 177.750000 602 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn4 >> endobj 841 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 588.500000 180 595.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn5 >> endobj 842 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 581 219.750000 587.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn6 >> endobj 843 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 574.250000 184.500000 581 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn7 >> endobj 844 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 566.750000 149.250000 573.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn8 >> endobj 845 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 560 225.750000 566.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn9 >> endobj 846 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 552.500000 181.500000 559.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn10 >> endobj 847 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 545.750000 178.500000 552.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn11 >> endobj 848 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 538.250000 204 545 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn12 >> endobj 849 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 531.500000 160.500000 538.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn13 >> endobj 850 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 524 131.250000 530.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn14 >> endobj 851 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 517.250000 129 524 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn15 >> endobj 852 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 509.750000 146.250000 516.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn16 >> endobj 853 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 503 130.500000 509.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn17 >> endobj 854 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 495.500000 125.250000 502.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn18 >> endobj 855 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 488.750000 130.500000 495.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn19 >> endobj 856 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 481.250000 135.750000 488 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn20 >> endobj 857 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 474.500000 186 481.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn21 >> endobj 858 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 467 171 473.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn22 >> endobj 859 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 460.250000 129.750000 467 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn23 >> endobj 860 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 452.750000 168 459.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn24 >> endobj 861 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 446 146.250000 452.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn25 >> endobj 862 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 438.500000 121.500000 445.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn26 >> endobj 863 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 431.750000 168.750000 438.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn27 >> endobj 864 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 424.250000 174.750000 431 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn28 >> endobj 865 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 417.500000 144.750000 424.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn29 >> endobj 866 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 410 153.750000 416.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn30 >> endobj 867 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 403.250000 145.500000 410 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn31 >> endobj 868 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 395.750000 124.500000 402.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn32 >> endobj 869 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 389 198 395.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn33 >> endobj 870 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 381.500000 140.250000 388.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn34 >> endobj 871 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 374.750000 191.250000 381.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn35 >> endobj 872 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 367.250000 197.250000 374 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn36 >> endobj 873 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 360.500000 205.500000 367.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn37 >> endobj 874 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 353 146.250000 359.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn38 >> endobj 875 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 346.250000 108 353 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn39 >> endobj 876 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 338.750000 138 345.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn40 >> endobj 877 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 332 180.750000 338.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn41 >> endobj 878 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 324.500000 150.750000 331.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn42 >> endobj 879 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 317.750000 144 324.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn43 >> endobj 880 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 310.250000 146.250000 317 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn44 >> endobj 881 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 303.500000 132.750000 310.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn45 >> endobj 882 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 296 179.250000 302.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn46 >> endobj 883 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 289.250000 147 296 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn47 >> endobj 884 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 281.750000 156 288.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_directors >> endobj 885 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 275 154.500000 281.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn48 >> endobj 886 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 267.500000 149.250000 274.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn49 >> endobj 887 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 260.750000 195 267.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn50 >> endobj 888 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 253.250000 156.750000 260 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn51 >> endobj 889 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 246.500000 174 253.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn52 >> endobj 890 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 239 135 245.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn53 >> endobj 891 0 obj << /Type /Annot /Subtype /Link /Rect [31.5000000 226.250000 81.7500000 233 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Php >> endobj 892 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 212.750000 145.500000 219.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn1 >> endobj 893 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 206 180.750000 212.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn1_1 >> endobj 894 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 198.500000 163.500000 205.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn1_3 >> endobj 895 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 191.750000 124.500000 198.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn2 >> endobj 896 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 184.250000 130.500000 191 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn2_1 >> endobj 897 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 177.500000 147 184.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn2_2 >> endobj 898 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 170 129 176.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn2_3 >> endobj 899 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 163.250000 135.750000 170 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn2_4 >> endobj 900 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 155.750000 169.500000 162.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn2_5 >> endobj 901 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 149 176.250000 155.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn2_6 >> endobj 902 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 141.500000 175.500000 148.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn2_6_1 >> endobj 903 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 134.750000 213.750000 141.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn2_6_2 >> endobj 904 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 127.250000 201 134 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn2_6_3 >> endobj 905 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 120.500000 201.750000 127.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn2_6_4 >> endobj 906 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 113 227.250000 119.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn2_6_5 >> endobj 907 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 106.250000 218.250000 113 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn2_7 >> endobj 908 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 98.7500000 152.250000 105.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn3 >> endobj 909 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 92 150.750000 98.7500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn3_1 >> endobj 910 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 84.5000000 145.500000 91.2500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn3_2 >> endobj 911 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 77.7500000 192 84.5000000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn3_3 >> endobj 912 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 70.2500000 153.750000 77 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn3_4 >> endobj 913 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 63.5000000 170.250000 70.2500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn3_5 >> endobj 815 0 obj << /Type /Page /Parent 2 0 R /Contents 914 0 R /Resources 916 0 R /Annots 917 0 R /MediaBox [0 0 595 842] >> endobj 916 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 917 0 obj [ 816 0 R 817 0 R 818 0 R 819 0 R 820 0 R 821 0 R 822 0 R 823 0 R 824 0 R 825 0 R 826 0 R 827 0 R 828 0 R 829 0 R 830 0 R 831 0 R 832 0 R 833 0 R 834 0 R 835 0 R 836 0 R 837 0 R 838 0 R 839 0 R 840 0 R 841 0 R 842 0 R 843 0 R 844 0 R 845 0 R 846 0 R 847 0 R 848 0 R 849 0 R 850 0 R 851 0 R 852 0 R 853 0 R 854 0 R 855 0 R 856 0 R 857 0 R 858 0 R 859 0 R 860 0 R 861 0 R 862 0 R 863 0 R 864 0 R 865 0 R 866 0 R 867 0 R 868 0 R 869 0 R 870 0 R 871 0 R 872 0 R 873 0 R 874 0 R 875 0 R 876 0 R 877 0 R 878 0 R 879 0 R 880 0 R 881 0 R 882 0 R 883 0 R 884 0 R 885 0 R 886 0 R 887 0 R 888 0 R 889 0 R 890 0 R 891 0 R 892 0 R 893 0 R 894 0 R 895 0 R 896 0 R 897 0 R 898 0 R 899 0 R 900 0 R 901 0 R 902 0 R 903 0 R 904 0 R 905 0 R 906 0 R 907 0 R 908 0 R 909 0 R 910 0 R 911 0 R 912 0 R 913 0 R ] endobj 914 0 obj << /Length 915 0 R /Filter /FlateDecode >> stream xœí]]¯ä6r}¿¿¢ŸðµøQü‚'@ l ‹<^o‹õ"³û¿Š¢$V‰TSÕRKwæÆÈÚ·ººŠR«©â©â÷ÿöóßþ矷ïüùo¿¦ÿøóK÷j¡þïÖÿó].î5ý÷Í:¸ýúûË—Û——Ï/ŸÃÿ~y¾ðóÿþëÿnòöïáÿÿzûã្R¯ðû‹6üûoñßÞŠð_Ýôï^þ——ÿüÃíï½ÅÑ] þû;këqÇñ——ñ"Eü矿þýåûáò·øÊÜ„Vú&¼–·üöòçþ²8ãËq ]hˆß wi˜Wç:{ÊÅÿ"J]Øä& ~}ʼ á¥s“`ûè¿0tüÚ|_Q*~#è¤qŽ6ðuü~ÍŸ§ ¿~ü ’Êo÷eå‹~yùþ“¿ sûåÏá£x£‡ýîÈðˆÛ/ºýK׉ŸþõöË__ÂÐ}g$ÄßeøDÉÚ'âcüD¿j5„ÀüIÕZý;²«}§û±öñ!^ÃOè‡ówÜ`m ªjÔÌTmu°†1$AWˆú÷^•t¢Ñ± 5~©ezûØ„«ÞÈáIùé—óóc[ åðôõŸCY)$ø‰ˆnU”012-§¿aˆocRhÒ € °Á¯/F§£ŽB&Tî ¨«!¸É—%u ûoàA‡L8ìà//þðt|p]„{? 9ðÀ u?<ÞÝ«±‡zõ;®~ò¤ ¬û‘®úú=¨eõWØ„ŠªÖ¯ëc xÕŒï|ˆŸøW•¾ÔðI}lòÇê¤Pýë÷O¨íŸ<0×ÜO‘ÄŠ;!ôØÙ²ŽrЬ£œ.­£œ!kœ  ë¨¨Øä>¦u”“¥uT–؇X¬£z4N‰ÖQ³3×QÎ?(WÖ^?nWa/²v¨XóªÂwãƒ-M— #ÃtG†éT!2Lø©í$2À6 ÷1F†éD!2LoûèhdD4N‘GFæãÄÈ0»NdTGP mÓd 4/ª ¿œaë+”úR+©;ÞD¦ósù\ÐDR ’²DR“<hEÀ6 ÷1‘ìJA$<ñ4ˆz4ÎÑìãÌ ’ö2AÄY»wÃ*NÈWºŠ[™ªO9g¼â§>)~ Áº²È®¿TønmåŸ?MÊaö+K¡sAkè뎄¾¥Ð§Ù3“²gyèFÀ6 ÷1…¾ò¥ÐW$ Ø hè÷:Ã8'ø:Î }m®ú‚úÕ—¾¦±–ùs%Xëæë³ñÂq6Žëké•;ËñSÿÕëÙÃø¡í„¹ ?Àü0] ?Œ$±“k8þ£`û˜ð\ ?À`øÑë¤;„³3ñÃÀuð£þÄÖ“9ªšö«ã#ý²úœYcÌ3-·Áç‚Ö˜±ŽÄŒõ¥˜¡™“2-ù3uÛ€ÜÇ3Ö–bÆ’ŒQ/ 1Óë¤qZ3³3cÆéëÄ 0fQ™úS^OÖüío³¬¬ú†œöù³ñ“’Û‹{^%ز'°ìö:á¦ýzå!´B›·Ú¼+@›íHªÌ&¤Ê iÐlr´yS‚6OS~ÐÖë¤qm³¡Ívê:ÐöÃ…ÃŒ±„¾z=»&v~çY€ø¶]|Ûé9_€n…Án…-8MãÙ”ÆË<ê¶¹1À­€B€[¡©M<ê¤qBà™3\ÊëøÇ x}_‹¦ý8ÑËÉk®d/ë Îwê/[UNÂ×¼Ùaå´®"og´"˜"œD«JœDK³‘V-8‰ƒ`û˜L•8‰V)êcÁIŒ:iœˆ“˜ù8Áô1œD‚Õý\ÁêÄ”տàWí–3±zfvHе IÔ”¢–æmÊæQS˜Î6 ÷1E-¨RÔ‚¤>ä"ja ÓɾŽs£Öt—‰Ú:FíúfЫ7#ã/~hŸj9ï8„œùšCåc¼­¼ ÕùÃ¥ ý*EëŽëÁ¿FZÙ5¥™¨º?š­@i UÐÚUÐÒįµ ªà Øä>& ´%ª µ‚úXP£N'¢ f>ÎJû¨‚áÓ>Œhªoo®ð{9ðΉô ב„‹ÛFp´ž­/-ÍvZ¿ 8:€m@îcŠg_"8ZO³¶~ApŒ:iœˆà˜ù83žý…ŽõxfPŸÏÕíª•¨ådTë±ùmo?[?1.”ö¹àB,Ùc¸Îß üóß^><=B¥Ô}„:qö$'B÷¥ú«*¡™µQjúÎP7Ï fFâSbdL;æé¦Ü¿þíŸÏ‰¼¡;— Æ }ÿÐè¡Ðxá‡@øþoM~Úß_ 3ô·~ j¥;jÕuت;C-gU¥½³’0ûn"o¨õ¼ 44ª²3 ª\p$ *o´Y9’n@ϵ]Þé;ï¢N²¯ƒÙ×ѹƒÙwÐlr㻨Ó%²¯Ó$Ñß È»hÔIGdßÌljCö­Ã/«‚èSí]t%f8Ì {Öü=®ÔÕºjdAd”=­žÔ(Ešêì¸WZ¿ô 4!bå7®ïËÖk,ž›„iM 8˜¨Y:òÒ'Áip„ lù40JÒë?¾†Öß0R_¼%÷f¦”%Š´—ŠúXP¤£N'¢Hg>Î IuŠôJH2ê»ê38‹sÃi˲ ï1ˆH‹e‡’ÍY ¬øÙ¶f÷j¦WK“ õwµ¦£ñÙ6ÓRu»vÔÂ'~;ا_@ÀkçUi“¤þÓ—’WÕ¬üj]uºù©öÉŠŸÕ+­o€¹Y®‹åc -Z爺&{…C‚G›ýz?M-éoShöë½Ã½x{iöu2¡r©Ù¯÷ºÐìׇ·*â@Ñf¿QÇ!;8¯Ù¯ ?õÝi ÎŸß—¤RÏ ïS·0RÏyWÍËÖ\jß°5ÜÝ™téd.xðù7@Í®Ãß…f×AŠ›]G~þ…L¨ÜÁðü‡¿ Í®ƒTR´Ùõ ã ‡œùüËûË ÖóÏ`¬lsR|Œ½ž• gh_îÂãTê!&ç&•‘B3 ÚÞjL§peD*#‚çÙ£¿Õ$À6 ÷‘Þj‚ P¤‚ú •ƒNg^‘û8ï­&ŒÂ?9÷´XtŸú» §Xz× ZV!‡)ÊyK«÷Õ¯C=d\é¾uüœSV¶­ëwôðÖ¢¦›;ƒª~ït´â-H‚·P¨\ R X´r%é¶¹ o¡P¹¤õA+W4Nð.P¹F1V®\ow­OáP08§9œO¢YYXÕ¿SýM—»Wœý&ÎʱúÖŽ9 a6Qu¿Ó3 ZQÏ ‚z¶ÐK=H5A$K{©'À6 ÷1¡ž-ôR7ñ㡽Ô4Ρž½@/õ0бäá|Ôã0!åOµWÕ= [Y«¼cÛ׎mÛžÈÓ›4pvä'ú³ÔõcÍ7—¥ùdîõ ¢Ë­ó‰ïÈ|â úƒT¬÷´AÒlrÓ|â úƒÔŽ6èt†q:æýaSÅÇùó ƒgø>Ÿ¬¾cìrà'•³aÖØcKä´?ûž¸’8çwqlFæ¹U±˜‘ ‘Yt¸ÊQ¨† R\ ™À6 ÷1"³è ÕPAj‰ŽVC :iày5TîãDdb,!¸23°ç‚‡?+%|™…pk苹‰±ê¹c³ 5ô¥#¡/ e!FÐm¡hYHÒlrSèËBYH’íª^@C_š1Ö¥E¡//Pn¾Nès£Nmî¼ÎÙu1±r¥Œz½}Ïa»{ÂÒ¥Ž³ØPt÷•¥ÔŸœÎhžaæ&ÓÚ›\p`-fp„ÐôjÔ†K|Y¿¿€,^ç½™T[2“jWšIéžZ,–tÛ€ÜÇ4“êB±X’È^@gR ãÔ© šIõŠÅÂ-‹Å.0“îz`È7„hõiNéHÝOu¥SOL©5?õÙ—ƒÃœ5þk }…½Îk >ÑGc‹ªYð(1U̧ڥ¿m˜*ŒÇ¼Q··4ê(dBå1U(S…ÑÔ¦ÄԨ㠇œHLv,ÀÛ‚ßwW¯ôˆLâ¶ó§}õ^¿ívï^wÇÎ<‹d— pJeCœG´>êz‚¼þ¦²‰-æïºC‚Ö%·²äv…êÎ %»}ÂÑêΤØä>¦%·+Tw©¢>hu砓ƩђÛ] ºÓL!ξÕ+ykU{,Y§HÕ?yVÒ»^9X‡€ªÖê,ñ+·¡ª÷_Û£븴]O9Ú÷4Ý•ÎÂÆl[ÑÏýýuÏÅ›p.;|2RNF2’nÊŽžŒ”tÛ€ÜÇç²+œŒ¤’ú '# :iœùÉH¹á\Šûü48gЬ¯¸ Yÿξ”¸¸`æüð#ÂC>q”¨\ðhAΧ3¦¿u!‹ ¥Á/ù2îY¢D@ÔQȄʤ,‚”²ERP‚f¢ŽC&vpbAÊcªëžÖÛŽC#`,+ê/UõT%k;p—ÕÑ®XïÛJzå0Ù íw[iñEVª‰Ù*ûJ‡YкòѤÀLêR™¤û:R/ ÌÀ6 ÷1­|t©ÀLêŽúX˜E4NT`–ù8så£)0«Cξ/²ºÞìë=9üj QÆ×‡IÐD†Ô+ISªW’†Ô+I³¨WtÛ€ÜÇD¦T¯$Ô+õD0Ö+Í6ðuœDæ˜z%Vízgv^¡äì:}.fç};XÔ­íË9Úúsoj%t.h }GJKÂ-)…>MÒJ·(-tÛ€ÜÇú¶TZ"-I6÷úv,-™màë87ôÝ1¥%œÐgÚÀà^lÙ6â”bp¿ƒhnV--´‘'Uª+U(šSÝ¢ `ÐlrSùR€ô4ÅçUQ' Ud>N "ÕSÀ "N}Ö×}ŽÐ3jîØ—c³ 1f” ôy%Jôy% }^É}~ÐlrcÌ(Q¢Ï+Aèó½€ÄLÔIãDôùÌÇ™1#¡Ï³b†SµÇزYánÔ§¾ ÕÔpŽ)Ú^s÷eiU.h /E8µ*=Í$¼hÎBé§vÐlrSx©§V)’{é4¼ÔÈ©màë87¼ô1œZVxíZ²óÁЋƒ®8„ÌŲq!Ø-Ìô´oÖ|¹ 5ÌÀ0ƒÂÁAJ² èÁI° È}La…ƒ ‚TSôà‚A'P˜Á.0ÊÄ›ä„Ù®Ôõ¯3Ì.Uÿtlk÷úVÒâÇ`íˆ-Œ,º‘ðwê›ÑÐ̬B)rA+ZÂ*T¶Ä*T4Ñ£ì‚U8è¶¹ m‰U¨¬¢>¬Â¨“ƉX…™3ÑÐÄ*ä áÇ £a®±KëqÓm׆¢8\ÙËýŠw”›ÏÀˆ$IЊ`žé”/éͲ)¿ Ò :€m@îcB0_"Ò)O³…~A¤S3dyD¤Ë|œˆ`=7ý*V?]‡u¨Á®TVV>ÿ0ãÖhÒÝÜm½?¸t4F“ž¡¥nëšæß´Xt[tÛ€ÜÇMZ”º­k!¨E·õ¨“Ɖº­g>ÎŒ&ñl>‡œQëÈó»(^ïUg¥þõŒ}죆 5rn4n‘àQ6ªžÅJ«Uè@dQs”ˆPu2¡r‰ª•(°Qµê¨ƒŽ²Q£ŽC&vp"U«ƒ¨aœÝ‚z­N=ÐêAS_sŠÓŸ•ï¨##ãzžvw8ÐÅX7±ŽÃ=g?Õ h01”€\ð0þÀø²„@JîuLcëu2¡r#þAWÂ?MšôнŽC&vp&þÁA¬>ÆvΖ:ó ?{Bžß&¬žSÝoiýÒŠ01"¤ö¹àa °Æ+J` ј2ÅaÜë(dBåF 0¾„ÆÆ-0 ×qÈ„ÃÎÄ{½±×T¯Ù~Öù´œ’·ûC×ï5c–ç|g—½¥ ¯˜çwîÿ:PØÚù%rAk¾Ë¨ö%¨¦™]í<ÐA° È}Lù.WâjG2Ô½€æ»ÜÈmàë87ßåâVÑvç®ÕUÚ–îõŒó>9ýÑXǾ)(¨_FÝ]Ms^8ø5š³g~îeí»\Ð\Ð2.t%2.Ð$:ˆwÐlr#pAW"ãBG6z®¨“Ɖȸ™ ÄAd\pí{–ñ®ûç¬ÔߛœmIp0'º\ÐÆ’~AºR+Búµ ý:€m@îc cY"ý‚$¤ß^@ÃXޤßÙ¾ŽsÃXDúe„1§˜«Þ³áŠ¡ò^؉±@MD5„™ÚÆLC#X KÌdЄ™ zÁLtÛ€ÜÇ„ºÄL­©39ê¤q"fræãL,€ƒ˜É,àôoÙЪ~BƒSÆ)åþ6¹kjžýU.x4ý fZW¤¿M!ý 4; Cv6ÏàF…L¨ÜAJÿBúÒ|YQЦ£ŽC&vpbúìA„\¹ök™ÜÛw²žüîýp6ìD<‘`rAë î\‰‹ 4ÓnÁEtÛ€ÜÇ4ƒ»œ¤>\Ô¨“Ɖ¸¨™3gp-½oðî›MÜ·5Ã>'Pr&ÒÓ½rvƒõjàÇ,Öf$\Vž»}Otm/°bÝ¿z7±á.™WŸ“å'ÍK;?qp44N¦#DjÓ•ˆÔ†æNM· R:€m@îcœ LW"R›NP "uÔIãDDêÌljSé"Rs¦N_ÆÖÿÎ}8'ýµçqVÊYëƒÝ+óbÄÜ’Ò»\Ь’´¤4²Ô’ÒÐ ©‘‹–”ƒ`û˜‚U–ZRÙQ‹–”Q'µ¤Ì|œ¬ò Þ1#XYYØ+ë³–i'‡~³æôX h œÅ>¾ ›‘yF'HÛÖÅÔhÒÅÔèRSC³ÑF/º˜:€m@îcÂ]]êbjɪ÷Š»jìb:ÛÀ×q.îêƒøÎÜåd¼ëì›EB¸#ÝÐ4ãüWßÓ^Ûû=¾­Þ]œSïÙÊ•ó3oèg´›ßQ»\Ð ¿†t’ çüҘØE'ÙA° È}Lð ¥N²Hƒ‘^@áÆN²³ |ç¯9ˆjÎ_FdÔ÷'ÞæöüÃ%9ȵ²¨å gyøÈÜú¬³28ÕÓñŒâǯ¨1¬1MÇΕ“ u±„Do\‰Doè–”q ý Øä>¦yÄ–HôÆ’­µ^@ç;’ègø:ÎGÜA$zÎ<Â(u|£Í”¿ÕBÆ„næ£ ÈRYŒŸV©éo_ ²ØŽýeãb£D…L¨ÜA¢²o TãÉáe½€PY¢ŽC&vp"•ÅvÇPÔY]–ê!ÎɼQÞÈ–Ø‹ôÕld˜Ønnc“ qªµ‚ðÅÃý/Lµ–î"X¹à‹:€m@îcœj­(ñÅ­ »!½€LµQ'ñÅ3'NµVïÇÔ¾ VrÎða”´±&­]yâ»í/Z9÷œöHеŠ0»­*1»-ÍA[µ`v:€m@îcŠZUbv[¥©³;ê¤q"fwæą̃ÕÇ0»YQË9­ë«?9áüVKOZpªþ9½‘8ŽOX=wŸî9J³ tŸ¶Pê>mirØÂ¢ûô Øä>&\„R÷i ŠúXtŸŽ:iœ¨ûtæãL\4ÇÝ9¸Èá]Ô{·Ö·Y´dÌþÊKƒ] ýz.ƒ¬M]ìëë7µ-âÍÜ­Yš\Ðñ–0ä­-1ä-MãY»`È:€m@îcŠx[bÈ[+©C>ê¤q"†|æã̈w÷ãíiÏÙñ¯‡Ê†Y™‘dõg¿ N g'Ž¡=³Â™sâ£E3ëà$N*oßcˆ+ ‡æÀÓ~·´>´ž"¼W§J¼WGsuN-x¯ƒ`û˜O•x¯N’œc/ 'GÞël_ǹ§Žá½²Ñtß³êAT§-§Ú'q´X.9yÇzšìÉK•}Ûœ¯Ü%Σ³qý¡fþi‡ràîÇJÝîÝ£ŽB&Tî qœ.u?všô×è„3u2á°ƒ9Ž¡¤î{–L÷¿B–aàß³Øü;úI/œ¯K“o‹<"¶. Ý€?s7basÁÀh<DÛ•ÑJ‚W1£‰1­×QȄʌ€h\ %Œ]b¯ã ‡œ ˆönewnÂX­<²ÉÚ6eÀìJéã¾g\íÊô®ßeG§ú²q*`}°œ= Åó Z{e ¨ggê¨F‚Ö·aGZ;WjeìhÆ×ùE+ãA° È}LoîÔÊØ9’¹îômØ­Œgø:Î}öÇðD9·/Û­ÞyŒ³ªaõ =ý”Œ•pˆ:2ÝÇ^êüÜLY™\Ð$¾#äXß¹xšköbAŽtÛ€ÜÇ$áv€Äw$gÞ D4NDŽÍ|œ$^CŽÝH8¼OÕõÕ› ¯Óéo{l½˜['K$h|I¶^–¶ž&»½\lÀ6 ÷1E¾,l½ÔÔÇ‚`uÒ8Á6óqfä«c¶ûFþ¾³·ÈÚÚ)_õ¬SN/Èâ»›ùy€t,kû`32«™â«!´"³&_¯K_¯ Å×ëÅwÐlr2ëÅ×kE},(¾Q'Q|3g"3CñÝ™TÀoï€T5‰³[Y_ûYqìa¦÷A7 Z‘Å*±7%*±7„JìÍ‚J<è¶¹ YL‰Jì¤>T⨓Ɖ¨Ä™3‘ÅÞ_W]Y84Åêšo—–Ú¢gïð+»wÔ¶msRuõ±ÝãY4#˜éÔ ØmtjïÚ»ÚÓ¤´w :õ Øä>&s%:µw‚úXЩ£N'¢Sg>ÎD0w zgc03ßÖÉ!S?~îÝìt.ƒˆÿÀ¸Ú^pøoÛÉqŸD|ª^eÍç«(Y¯î×Î+ VªjM×&¯úV~µ®ö ¥4já“?jW*«Øé; [‹·þ'ÊÞe.xOa»ùä¦ô·^ò)‚÷Œ‰̧t2¡rŸ"ü-—|Š Ô |ŠAÇ!;8OFqsŸµ=Ø}¨† ‡#Ρ)1œçwC”jÁºBâÚå=žÓÀë^ñL‡ùÈÚãØd¥9*´- mgqiNJs‚o3F^&À6 ÷‘–†AP(Í ÒŽú ¥9ƒNg^š“û8oiFq¿4g_˜Ú¹ÏÏOÕ ª'‘ê»õ„Ð…Yµ’ç%p…½û¬sg÷8÷þºàÚøf‚v>] ï.2 Z1Ô ‚¡¾Pe¤šà›§UVI° È}Lê UV¶sžøp´ÊjÐIãì†ú TY…Qܯ²z†rŽ`Úpžîûšìz°ñpª!<ÁÏT™.<ú:)ªW ê•Âÿâz¥( ¯“QG!*w^'EW¨W RGt´^iÐqÈ„ÃN|â~½Ò³ðbe͵PÞÉôÓaâü&Ì+Ljoàl©Ù ÜÄgþ΂ÆU†¸ù¹ªÐüÆU†…æçAj‰I›Ÿ:iàyóóÜlj«Œþòž‹W>ówÕˆÕa§ÆBVÌýM¥E‚Ö ÒŽ‘.”€X‚<à@K@’`û˜‚HJ@‚Ôš–€ :iœ‘¾@ H¸÷K@žD~v5“ËyÕ_y9ßµä5m#m[00z¡<- ±æ^ž±øu´b€±Œ+aMG K«7’`û˜0Àª7‚”¤U{ÅcЃ0À\ z#Ü‚ûÕÏÂSû›lé~µ¹Ó¸ñ¹ 5ˆœ!Aä …AJòQÂÑBˆ¤Øä>¦ r…Bˆ ÕÔ-„tÒ8‘»@!„íÇs™ bj¦¾=+ñ~<5üÒ!@:“ Ov˜çž{bž{ÀtÛ€ÜÇx²+ð܃TQ”ç>è¤qæ<÷Ülj'Å}žûÓoßÖ˜W>kCcˆ'qN9g±¿Å#[qJÎ-;•5¹ §¤&8% ¬ù %©$))k>é¶¹ §d5¤’ú ¬ùA'S!œ’`Í[©î¯qŸ†SœžŸ_ýQ$׃´zŠP}Hï<Š.×êŸ|5Eà!–f:½‡\ðÀöœìAÉJ-nþùÇo/ž©"T胨’»BžÙð U©Oçõ·™§ô½Aý3±¹m¦ò*<A¦;?‚ÌA,¾gE'~Ö~ÒÑ¥ëüvB—šËëdÞBÿ€#{:%HšWjC’õçC’;ˆ÷$Hâdæ9ï ;WF´sgVz«3êáêlû9þÍn%&ИBêHÔ›ƒ†w§ƒ†êžÍrÛ4;ï q8h|k;¦V¨¹ç£î;lÌ‚‡±¢§1œŽò:|8Vpª\ªXÁ:ívñ ¿©Rª‡2­Tí×O fÌݬKvݰb½˜1³º.—y˜œd‚êrA㾑R„¡©T‰¡©4ahö²o4è¶¹qßH©C36F>Ô‚¡uÒ8C3óq⾑Ò×ahrެzVIçˆIΉœ(‹<Ž®wñxÖº¸¾ldì·]ºËhõ¾Õûq­,ƒëw§>¶êÃÄj%{‘sl†­857í„Xz; ­”Só9éoW¨”ëËóP![/ •rQG!*w*å˜B¥œ h¥\ÔqÈ„ÃN¬”Sæz/+!ø~\ÍC“Ïûq5%kW"gî5¯D.h] [B±V¶D±V–P¬{] Û‘bÙ€ÜÇ´¶%е²šúXP¬£N'¢Xg>Î\ »c(Ö+ÖÞ¥y?”¦})4÷èTÒæ‚V¸ð„®|‰®N„ ÝC gÁÅûÑ3oŸu¨»™P;µM‚ÆøÖ‚ªµ(ªµ „ê^@â{Ðlrc|kQ"Tk!©¡:ê¤q"BuæãÌø– ù¤ø~?`æš©Ÿ÷fZÞ¹ÞÆ3!à'Ö·îsö³ çjFA¡‰ºÕtÓ@+ÚD=é¶¹ U¡‰z êƒ6QtÒ8%ÂßÙÇ™ø«Ža©³ð÷ý™–+þ¦‘±ZÏœw¥sA+~é´«¡ÔiWi ¡aÑiwÐlr~@©Ó®†ŽúXtÚ:iœ¨ÓnæãLü€c8ú,üx?,æÄUÚûa1§`"ÂǬï,èqêóËçÛ—|3^bóó=…/+[s)x])vËïk'zÒàm:#m°–¦ˆá¶…Û8L±òUÆ©7ÿd³ü$ÕcÉ×DZ\Lÿ¥gøcͺ·D/íSºÒåÑæÎÓ­é,\çi™å¦§»ÎQ*}¢k—!êÖªßIó³ØtéÙúžûÀÙ¾h}pøè¦”žÊv©ï>ìŸoŸ_þÿäH/ endstream endobj 915 0 obj 9200 endobj 919 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 778.250000 131.250000 785 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn3_6 >> endobj 920 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 771.500000 141 778.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn3_7 >> endobj 921 0 obj << /Type /Annot /Subtype /Link /Rect [31.5000000 758 89.2500000 764.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python >> endobj 922 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 745.250000 96.7500000 752 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn2 >> endobj 923 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 737.750000 105.750000 744.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn3 >> endobj 924 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 731 143.250000 737.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn4 >> endobj 925 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 723.500000 140.250000 730.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn6 >> endobj 926 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 716.750000 194.250000 723.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn7 >> endobj 927 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 709.250000 136.500000 716 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn8 >> endobj 928 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 702.500000 153 709.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn9 >> endobj 929 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 695 183.750000 701.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn10 >> endobj 930 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 688.250000 181.500000 695 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn11 >> endobj 931 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 680.750000 219 687.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn12 >> endobj 932 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 674 208.500000 680.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_commandline >> endobj 933 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 666.500000 153.750000 673.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn13 >> endobj 934 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 659.750000 126 666.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn14 >> endobj 935 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 652.250000 129 659 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn15 >> endobj 936 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 645.500000 146.250000 652.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn16 >> endobj 937 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 638 161.250000 644.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn17 >> endobj 938 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 631.250000 125.250000 638 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn18 >> endobj 939 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 623.750000 130.500000 630.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn19 >> endobj 940 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 617 135.750000 623.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn20 >> endobj 941 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 609.500000 145.500000 616.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn21 >> endobj 942 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 602.750000 209.250000 609.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn22 >> endobj 943 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 595.250000 174.750000 602 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn23 >> endobj 944 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 588.500000 144.750000 595.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn24 >> endobj 945 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 581 153.750000 587.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn25 >> endobj 946 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 574.250000 145.500000 581 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn26 >> endobj 947 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 566.750000 159 573.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn27 >> endobj 948 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 560 218.250000 566.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_smart_pointers_shared_ptr >> endobj 949 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 552.500000 201.750000 559.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_smart_pointers_generic >> endobj 950 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 545.750000 188.250000 552.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn27a >> endobj 951 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 538.250000 188.250000 545 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn28 >> endobj 952 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 531.500000 140.250000 538.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn29 >> endobj 953 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 524 139.500000 530.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_builtin_types >> endobj 954 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 517.250000 164.250000 524 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_builtin_limitations >> endobj 955 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 509.750000 246.750000 516.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_builtin_overloads >> endobj 956 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 503 161.250000 509.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn30 >> endobj 957 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 495.500000 152.250000 502.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_directors >> endobj 958 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 488.750000 150.750000 495.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn33 >> endobj 959 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 481.250000 145.500000 488 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn34 >> endobj 960 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 474.500000 192 481.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn35 >> endobj 961 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 467 153.750000 473.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn36 >> endobj 962 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 460.250000 170.250000 467 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn37 >> endobj 963 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 452.750000 131.250000 459.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn38 >> endobj 964 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 446 141 452.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn39 >> endobj 965 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 438.500000 157.500000 445.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn40 >> endobj 966 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 431.750000 164.250000 438.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn41 >> endobj 967 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 424.250000 183.750000 431 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn42 >> endobj 968 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 417.500000 182.250000 424.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn43 >> endobj 969 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 410 198 416.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn44 >> endobj 970 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 403.250000 157.500000 410 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_optimization >> endobj 971 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 395.750000 162 402.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_fastproxy >> endobj 972 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 389 124.500000 395.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn45 >> endobj 973 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 381.500000 178.500000 388.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn46 >> endobj 974 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 374.750000 144.750000 381.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn47 >> endobj 975 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 367.250000 159 374 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn48 >> endobj 976 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 360.500000 143.250000 367.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn49 >> endobj 977 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 353 152.250000 359.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_default_args >> endobj 978 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 346.250000 99.7500000 353 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn53 >> endobj 979 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 338.750000 156 345.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn54 >> endobj 980 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 332 149.250000 338.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn55 >> endobj 981 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 324.500000 153.750000 331.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn56 >> endobj 982 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 317.750000 168 324.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn57 >> endobj 983 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 310.250000 124.500000 317 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn58 >> endobj 984 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 303.500000 192 310.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn59 >> endobj 985 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 296 238.500000 302.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn60 >> endobj 986 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 289.250000 199.500000 296 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn61 >> endobj 987 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 281.750000 210 288.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn62 >> endobj 988 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 275 186.750000 281.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn63 >> endobj 989 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 267.500000 146.250000 274.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn64 >> endobj 990 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 260.750000 289.500000 267.500000 ] /Border [0 0 0] /Dest /H#0f#d2#cf#2a#d8#a5M#40#09p#e0b#d5V#9c#aeHu#e7 >> endobj 991 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 253.250000 125.250000 260 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn65 >> endobj 992 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 246.500000 152.250000 253.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn66 >> endobj 993 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 239 160.500000 245.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn67 >> endobj 994 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 232.250000 203.250000 239 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn68 >> endobj 995 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 224.750000 203.250000 231.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn69 >> endobj 996 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 218 203.250000 224.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_autodoc2 >> endobj 997 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 210.500000 203.250000 217.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_autodoc3 >> endobj 998 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 203.750000 224.250000 210.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn70 >> endobj 999 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 196.250000 163.500000 203 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn71 >> endobj 1000 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 189.500000 121.500000 196.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn72 >> endobj 1001 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 182 179.250000 188.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_modulepackage >> endobj 1002 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 175.250000 184.500000 182 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_absrelimports >> endobj 1003 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 167.750000 203.250000 174.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_absimport >> endobj 1004 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 161 175.500000 167.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_importfrominit >> endobj 1005 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 153.500000 186 160.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_implicit_namespace_packages >> endobj 1006 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 146.750000 159.750000 153.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_package_search >> endobj 1007 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 139.250000 232.500000 146 ] /Border [0 0 0] /Dest /#82P#17#b7#60#b6Z!#e9#7e#f6#07c#e5#01#20#12L#1d#d4 >> endobj 1008 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 132.500000 203.250000 139.250000 ] /Border [0 0 0] /Dest /#ad#0f#ad#060#f2mBR#83#0dz#27#ab#15W#d0#21#83#21 >> endobj 1009 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 125 231.750000 131.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_package_search_wrapper_split >> endobj 1010 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 118.250000 258.750000 125 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_custom_module_import >> endobj 1011 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 110.750000 210.750000 117.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_package_search_static >> endobj 1012 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 104 120.750000 110.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_python3support >> endobj 1013 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 96.5000000 159 103.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn74 >> endobj 1014 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 89.7500000 147 96.5000000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn75 >> endobj 1015 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 82.2500000 165 89 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn76 >> endobj 1016 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 75.5000000 183 82.2500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn77 >> endobj 1017 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 68 153.750000 74.7500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_2_unicode >> endobj 1018 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 61.2500000 176.250000 68 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_multithreaded >> endobj 918 0 obj << /Type /Page /Parent 2 0 R /Contents 1019 0 R /Resources 1021 0 R /Annots 1022 0 R /MediaBox [0 0 595 842] >> endobj 1021 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 1022 0 obj [ 919 0 R 920 0 R 921 0 R 922 0 R 923 0 R 924 0 R 925 0 R 926 0 R 927 0 R 928 0 R 929 0 R 930 0 R 931 0 R 932 0 R 933 0 R 934 0 R 935 0 R 936 0 R 937 0 R 938 0 R 939 0 R 940 0 R 941 0 R 942 0 R 943 0 R 944 0 R 945 0 R 946 0 R 947 0 R 948 0 R 949 0 R 950 0 R 951 0 R 952 0 R 953 0 R 954 0 R 955 0 R 956 0 R 957 0 R 958 0 R 959 0 R 960 0 R 961 0 R 962 0 R 963 0 R 964 0 R 965 0 R 966 0 R 967 0 R 968 0 R 969 0 R 970 0 R 971 0 R 972 0 R 973 0 R 974 0 R 975 0 R 976 0 R 977 0 R 978 0 R 979 0 R 980 0 R 981 0 R 982 0 R 983 0 R 984 0 R 985 0 R 986 0 R 987 0 R 988 0 R 989 0 R 990 0 R 991 0 R 992 0 R 993 0 R 994 0 R 995 0 R 996 0 R 997 0 R 998 0 R 999 0 R 1000 0 R 1001 0 R 1002 0 R 1003 0 R 1004 0 R 1005 0 R 1006 0 R 1007 0 R 1008 0 R 1009 0 R 1010 0 R 1011 0 R 1012 0 R 1013 0 R 1014 0 R 1015 0 R 1016 0 R 1017 0 R 1018 0 R ] endobj 1019 0 obj << /Length 1020 0 R /Filter /FlateDecode >> stream xœí]K$·‘¾÷¯è³ø >€Åš‘f=,0€={XÈö†ÆØ±û÷7,&#’ÌfF13«[mÖ:*ŠÁÌb|$ƒ_¿ÿ·Ÿÿûùþùüý§Ÿÿ÷ù×øÏO??‰ÄüŸçñ¿ßåå?ÄvžýúôíùÛÓ—§/Ãÿ{š¿ðó§ÿþíÿžÕó¿ÿûÛóÿkþ)* _ŸœtÃ?›þœþM¤Žò¿>ýçžÿ>¶x3;ƒÿþÎ;ÆN¼`øÛÓí!åôßþú÷§ïçÇßcC:ãü³4Ú<Ë`Ôó?þüô—ñ±8ý”ë~J3™ðnúîð–nÿÁ{ឥžÿEÊQ†Ï´‹f¢à×'©í)ƒò>énrãfÁüµgüýáÆ6ÆŸü ÷cÔ‰ý¼µŸã×á×ü9ýãóã`–T~»o_üøËÓ÷ŸÃ³´Ï¿üeøhzÑó?~Þ¨á¯áèç_þôü/B(ñ¯Ï¿üíièzVÁô»ÌŸÈOÕO~œ>1Œž] }²ÑZý;PûŽøTûŽvÓ'ჳ€¿£åÜÚbXW›WÕÎÎHýA+/‡–Oêß©ÛñÓ'?ý2¸Äò«–Fúð㌿¹tå ü6 ˜Wa±«€pWð0ÄUfÀm@nãæ*  à* µa¨«L:±Ÿ»JfãBW©ÇU~Øï*ÒÕÆ²˜Oc½+ŒØÅ‰„¦‚ºøZ«ŸT[n¿÷ [í[õïôQ^gt1-d.¸ù(<úÊxôÓh4îö,Ÿ_?¥§ µQ""â‰ÖÉñÇ¡ïYÂ4%ºÚš™¿£n5ô`YE ìåOµO6ì|¬=©úøÂ|7ZM7¥|¬öZ4޵ AO`nu.ø`¢Xabuž°SË.MñïˆðÖFpž¥áÙBZÝ΂_Ÿ¬‰ /o:5¡sƒúüw„wòeC ŒSéÄ ãQøëÓÇ?œ>Cx1¹¤o˜ ~ÚöõI¥öÊÖ/û?ÕFûº‘úRm^}jþÓhð i¥W¹àîñÿ`Kã?x2<ÿ£ŽFMèÜÀmüSÿÃRœЫñ?êxÔ„Ç.ÿv˜ÿÕïlŒ]ƪƒš³”©ûúÖaÃWª‹œ…Qýy>Ù¼ü™|Ò •v(ãŽ`4îP¬4x‡b‡åÅz‡b¥Ã»‡Q@v(³à6 ·qÛ¡Øá7YïP¬TÔ†¢;”I'öSç;”ÌÆ…;«ö]°ï¤¥£ÓÊÛˆmY¯×÷õO8XÝKÔŸgc-ªk骭}ܵ3±J.;— Z}Skâ›Ú”|S[â7ƒ€ú椸 Èm$ßÔªä›ZRr団Nì§B¾¹Ø¸Ò7uxßdL¨j¾¹Žœä^Ò0|ÕYSm¾Ž9Õïl,êKˆ}kDšsƒÏ­~ Šø5è’_ nêדà6 ·‘üdɯAPbå×£Nì§D~½Ø¸Ò¯Á?Œ_×{°±PþXs±¸ —¬Ï’«b=lWÇ׃î—< Áꯘz«Îv‚µmYý‚õÞ×›¯ÿêÕ'®CôÆo«öÁ-„Z£sA+Ü:IàÖ©Ü:r@bYÁí¤¸ Èm$¸u¢·–ôŒ ·£Nì§@p»Ø¸nÝ-ìýp+»n ê ‘:J0"{œµ+@ªÏýÖ‰ÍÞëRÐ\ù Z½7â½A–¼7hâYSì{ߤ¸ Èm$ïõ¡ä½ãÿ#Þ¯¼wÔ™û™ÚÀÏq­÷û8Þ˘{p´žô9‡žõâšÉC"iXàDÀXà_c£D‰™/Ï:€Û€ÜÆ œð,p‚DGÁ‚I'vÜçXÙ¸ œ„ÇÁóHüXÅ‚Ë÷/W uXª‡Xëï­ÚšòÕï0~};v×ô´þɆú†é‡æˆÒƱKýEî˜X8¿Ó¾à““‰*`$ä‚V Už`¨ % ¥_¾9N:€Û€ÜFÂPåJªHàzP ub?ÂÐÅÆ•ªÍã`(ƒ’öÈzÖnõê­1Ökõ9®¾Õ?ÖìèúZ²þÞêÀX_eVÓ¾³_ß_acm¼ou¢¦ásA+Þ–wÆ—ð–â¬Øò³à6 ·‘ðÖ”ØòÎ…Q@ñÖÜØòKø9®Å[h`ËŸ…·urg~ªEŸ6ö†œõ'çd®/ªVù?ë sBÕpß%ñÛ^\6…QÆaKµ²#2Cb.ÍçIp?ñ»†B£!„B4ŽŸÕßg}Ïö©º‚kéÈëûúóLGßçK3%É.Ζ’]=qv•ì2ënri¦³¥dg µ±Jv™tb?Q²KfãÊ™ÎÄef|Gs"µ¡:ÓÕcœYë¤xÊÆm}óFfÇ.üF")ûî'7æ±³•K\>£B.8p¶ !$ÙøÝê;÷³â•ͳ~}ÃcNä}ô>ïIFp'#8_JFpž$#8¿JF˜t4jBçb2‚ó¥dç55°JF˜tðO:à먯Œ6xÇö¤Õ°qdPç^Ÿt̰±œ®›™èœPiRÆ”4âBâŸêyö%xA’F¼(%xzFêÅ*idYÚgm@nã¶Ò÷¢”4â…¢6VI#“Nì'JÉl\¸Ò÷òehë ”}“F6ÒÚÏå!ܺæe¢ *+rA«g(’²áU)eÃÓ“/¯V)³à6 ·‘ëïô™¥§‚ Z}&V}%V} ‘– V¬úYpÛH>J¬zhÄ(¬Xõ“Nì8bÕg6.ô™ ŽaÕŸUÏ““·­/øÛw³¬¨z¯%mXJx*§sA£{I×A–׆k‚Z®gÀm@nãæ^A–×A’°Ó( î5éÄ~"ÂufãJ÷RǮϪzZºu/[wµp] º¹™J§®Ê»\ÐêfšðlCÕÄÍh@'˜ÏvÖÜä6’›éÏ6h˜ÔÍôg»´ŸãZ73ÇðlYnÆàÙžæfœ4ì:m§o¹¾ÛÛJÝáf7éÌPK$hup ôÂ%za a›+zᬸ Èm$‡½0€¡6VôÂI'öÑ 3W:¸=†^Èqp½ðUoí'2õÂÍuÌa,z7#œÇèˆ-ËÎ[Ú€ßXÕw÷þˆ8`3TÛ…[§C.8«¨†%Öy ƒ¢³æÛ6ñ»‰ˆºô²^š×yÍÙÒ¼FÉ!†óyiÒÜä6Ò¼æLi^sšÚЫymÔ‰ý4h^sðóš?›uÈ!ÓhNÈþ¬%m´Ó¥p9ãÐvºHœó’úüù–™Á/DÁ rA+¶B ¡D 4ìŠ(8ënr ÛB‰( _‡Q0,`Q0³q¶ù±m á`ãn*ÎrƒÃ*ïuT4  ¥"õ8àA›?{!1½qèƒÇ™'ö稸 ÈmDzã •Ô¥7Î:±Ÿ9½1·q¥?Ë¢7Öý™A|<ÍŸûÖWmßÓmûëìÞ7ûµJ¬=^ý¸ZýZ+â׺À¸¤@|NSÆeÔÜä6’_ëãr jƒ2.gØO‰üZ?ãrèÅã0.ë~Íâbžå׌¨§,QçnÝüYg4J$hõgÄŸ¡@£¤†øPeÔÜä6’?CFé… Ä†¡4ÊY'öS † Q½xå†?w%Xvöç*©„•^_3 \½ê“„fD…X9:Û"¸#]zºqÊ ëŸaøï?þüôñtUÊLꇨÈñÐη8UÓŽXGÏu¯¦«âzó,gfDðLý*VN…ƒûktŸ‰œ2U‘[ž¨]ã„ïá†!üÓŽu”,ý­ïƒZﮇÚð8üÖÎPË tT“ÓXgä}ù?;*2< 44jXÊ ŽTMàñAëž•#y±Ã °ªô¦_Ø‹Jùσ Àö’Æs¥¤ü稸 ÈmÜö¢RøÏƒ”Ä¥GÙ‹N:±Ÿ9ÿ9·qá^TÊÇá?oÀ/g5yÖ^ôÍÓ§ºrãks¢v&#»Û¨*îîØ¿”âÙº—r©*­\.¸³zÙ0ÒÒê3þí×Õ˼Ô›¸zÙ¬£Q:70W/þ¶ëêeã€'êe³ŽGMxlàºêeÃÓD€gDéXeDk°ÎÄtε±Œ¨ûÆ:”lÓ¢¹o‘;?Ë­ùÍ“7æMúê_ÚŒK6#¦D2HÉ¡•44‰$ênri3b I$ƒÔP4‰dÖ‰ý´1DâÇœ;Iö ”olàëÓZ}ÉL¯ Xêå@×ë„ZB"‚Mw /‚VG´@ÑXïƒÔ'±”õu·¹äˆ¶Àz¤šÚ ¬÷Y'öÓ G´Àz÷ÒÄz?)ŒzÖµ(õ°~Ñk¦eœÍ­Ð‚EIÝéÆN-nlsÁÝgÒ«ËÏ*dho]Ök~Ô†såüY·e™æ0&ȰТ§wÜíJÈ˽@‰ƒhÆgygB™GM©häë$ú¿ùt­‹käµb…’‰jmÆ*‹àÀƒGØ×ttƯԥ^áÆý”õç²;™“BlõILã"#èëxUR/쥔"ì}¥Jì}¥{_©{ÖÜä6n{)¥Jì}¥µ±bïO:±Ÿˆ½ŸÙ¸p/¥ÔAì}ÆtÉáèo”ãçäÄ0&«qηBÕ°þ}…^ ¾¶îÌ”ZRrÁ½'„ʤÕnü[N•1øOMÑItÈ7éhÔ„Î ÄBeDá„Pé@ è@O'šðØÀ…'„Ê”Е;Á d6˜”š·d\<»QŒ¸+p.ÆÞXWßÎ:úÓ’ëÝXúÔ÷ä«õ§l7?CÉ’Œ e.h]ðXA<¶Påy’À®²´ÊsÔÜä6Ò‚ Už) Pºà[á@@ ûUž‡^”_µ@ÙDiÒÓ¡o´Â… .|¡Àõ UÄ•=-pu·¹®Pàz:bÃÑ׳Nì¸Gpá Àõðà%pà‚CÙÿ\]+½*'z3gÉÊ'N†–:´úw sJ s-Ã|ÿžu·¹äß¡Ä0ŸNчÃ|Ò‰ýD óÌÆ…þ­ÅA s†sâõÐÿÆÝž}SrÚó"7ÎäêÛ‹ëoy@v_¶iûUAß}pÇÁh+þj±ÑµÍø«%.½>| ilX+Zz=ênr7üÕ²Pz}’÷( ø;éÄ~æ¥×sWâ¯:ˆyÎÁ_[½¾[äv$µ<Àõœc«zk‚a}wÄÖ´?Ô‡žªO%A+~hBÊÕºDÊÕšrµ^‘rgÀm@n#á‡.‘r§À6V¤ÜI'ö‘r3Wâ‡9ˆ”ËÁN‚BºÑƒÐÀ:êíš¾vÚ*mG¶gT'pBh 6ÉÎ#5mgY» Zq gYC‰³¬iHXʳ<ënr § ÄYÖ ©gyÒ‰ýDœåÌÆ•8eâ,spŠqQÚÁL^ÎÉø†}!m^°ƒ\Ðê*ÎWq…Âσ”„Cµ£…Ÿ£à6 ·‘\Å ?REmÐÂϳNì§F®â¡ð³ö/DNsÆ¥g””ö3Æ=›ÆB™u'Rý;œÄú>êÖ²¹à^†ˆi¢Œ›CD‹ z u"’Ǥ£Q:7":¨CDI HÊ™tÿqg÷ópW¶Nô#–jØcþì"h\¼Iø´F–ø´†Æ\ñigÀm@nã¶x1²Ä§5RP+>í¤û‰ø´™ /Fħ­¢`_zÉF]¢ßéZˈ̨/º¦Æ¼_¦ƒ×kF.Œ^‹­°¤IQo£KE½ a½*ê=ënr –t©¨·Q$; (,©[Qï¥ ü×Â’>ˆ¾Ë%E×YªÁ<¬/ƒIeõú$ à\*ùVkóÜ^nÆP˜>ÓÊj´b(æ°sØÐðªsxÖÜä6†šsØ&CÍ9¼´ŸãZ …ƒ˜Ã í{É¡u¦öí¾V‡æœ*N/-b²æÏÚ‰ÖÉX Tß½zY½ùÑ¥ù d+#éà_Cî;Ñ2°”•—"´Â¡%ÌhãJÌhCCèÆ­˜Ñ³à6 ·‘àЖ˜ÑÆ’£€Q@áÐÞ˜ÑKø9®…Cw3š‡ïÌâ\XÁ8¤¿>uä­ÀíÃŽ»fÌvK=õq¹Z1Û¶»ñ%¶» „ínŠí>ënr ³}‰ínˆ}Ì Õz¬´«‹+”í*hµ#§jc-_Ÿês~}TÐu:ø½%— —Ö`Áwx¼ÂÒhäÌŠà;ënr·¥5˜ÁŒ¦6VßI'ö|3.­"øV¡ óÁýx¿îÅõ«¦ëß“Ôxy¦'çyN{;u;]k|²*„]y 0@b6™U`¯,áuƒ-ñºsÁ®xݳà6 ·‘Ò–xÝ`µ±âuO:±Ÿˆ×Ù¸!]´ë’SJ£zm$'°áµõðéI…»®¿ne¯§»…> %A«§{M<Ý›’§Ó Ä`î©“à6 ·‘<Ý«’§{ImÈ•§:±Ÿ yº×àéþ *8ÃÓ9'åzÿ»JgÔÓû^;ÈI^d­…êzKkÃÓ+‘5?h'\„Œ3rA#\XA8ÓV”8ÓVÎô( p1ënr7¸°¢Ä™¶BP+Îô¤û‰8Ó™ ኃ8Ó¸`œ$o, …TN;#}ͧÁ­žnÅBCž®§O‚VOW„†lU‰†l¡![µ¢!Ï:€Û€ÜFòtU¢![IhÈ£€zº¼Ñ—6ðs\ëéê 2ÇÓ9•‡ëÕô·)olµ95úVêÓ2§JñÅÅKOºo`)Í›÷°X“VñoY8`±Fãó;…=Ñɤ£Q:7X¬…«=1 ==`™t0ã,:ÛžJ œÙ‘qHù€ ¡wN—v)]|™Ï:Bæ³®Dæ³4fýŠÌ7ënr %\‰Ìg‰äŠîFæ[ÚÀÏq-JøƒÈ|”àÜZ÷ªò¿^“_ï]û…A§t.hõë@J¢Úà ~íh¨Ê‰UIÔYpÛH~J%Qm !·°*‰:éÄ~¢’¨™ ýÚ‰ƒ ¿fEÏ_Õ:¹>ûÓú‹œÍòÆÉ`ß;9z•§w"+o ¹  œ$åM,•7u4˜å䪼鬸 ÈmܰÀÉRyS' µ±*o:éÄ~¢ò¦™+±@D0ä`#4¾q’Ö~ç‚Æ›OH7U”}ËeEœÊªš"Á½;§Ó"(þm ;Gjn¨åA·IG£&tn Fìœ6…ˆÓšÐ4b7éxÔ„Ç.ŒØ9s RsJ󾑕H{¦*‡½×™‰´+ðèÌRzuJqH‚Ö办ƒEÏÑ  ƒEoÖÜä6ÒrJ=ŠÚXQô&ØODÑËl\¹Ü°//üû:ïYÕËXånzT`gM¤}ú_Ó²†ÅØQ ““]ÒµòÓŽC¬`9£B™‡½¥ª¯>i^ÙD–˜ïÖI‚V4w„†é\‰†éhðÖ¹ sÖÜä6š» Ó9Im¬h˜“Nì'¢af6®Dsw “…æŒñžu'‚ñ¼¼rÜÁùWu©Zg>üKã¡n}"™esÁ nûCËhAËÆ¾¢/‰‰‘ÄÚ9“â÷J–"ƒëëXYm/Mî¦](‘¦=ÁqaEšžu·¹4¹‡iÚzV¤éI'ö‘¦3WNîáÒ4grïœc±£H_×I÷5žñ6•[캵a•´ï[:Ÿ³¯ü½‚w\*„ÄÏ3S±€$ho/ ~x¸x{zäæåŠ?ënr7ðö²Äƒ÷‚ŽÞ“Nì'âÁg6.o/áÁ³À›S;±zÅÊ6@î=D¶Î7`éˆÓÜsîÖ©Ž”ÙÜÍ™‡9—ÑîÛÍy¹TûŽPåßÍáˆX<5ƒ“¼›á¼)½¬—æ3MJ£{]*î5)Lãõª4ú¬¸ Èm¤ùL•J£{E ìŒ:Ÿ©[iô¥ ü×Îgú˜4 Ö|ÆÙÚ¿±ùl¹¦o « “.ÓKß©‚‘óþøˆ§½TOŸH¾IЊ˜†¤øx(¥øxz îa•â3ënr 1M)ÅÇrš? (bš[ŠÏÒ~ŽkŽIña!&ã†ÅúŠù¡ËÊü¾³á=, <rA+X’Àãm)ÇÓ³SïV <³à6 ·‘0À–x¼%gÀ£€b€½%ð,màç¸Ü1 <, è{Ñ1§ˆ\7ªþ¼žwî¹\"}ª‰”™Çí¹FCèÇçìGYwtÕ_pßš0g\åÀ¹’oyä€÷Y Æ;àܾËzׯzÏÁñ°úw6ªu].ýÞ’£ÈìðõÉK§‹{²†–PöÁðŸBöÁМà§ck”@0éhÔ„Î Äìƒa TÈ>„Ä€š}0éxÔ„Ç.Ì>ðá˜ÜÉ:YsjëÕËÕd…e;X¯—«g+½›Ø}H© B.hÜ] æñî*ˆRêd çŸA¬R'gÀm@nã¶» ¢”:„¡6V©““Nì'JÌl\¸» ò˜ÔIôÍrØØw1.¥eÑô81ö:P¾ÐkÝX¹ä)j‘ Z±@‘Ë‚*]ÎèÙQP«ËfÀm@n#a*]Δ¦6V—3L:±Ÿèr†ÌÆ•X IJìŒ Ž|ýžAÎöëú)טÚwÌíR¨pné5ë¢ÎÅÞíV û F':­Æ‚»ï= F]~ïYñª]¶ï”ÿîæoÇÍuµKõŸ¿ÚZ}ÐvšùºKVŸu¹à~ ±òz ±ÇdÉ=м¯'Þ¦ÐÔ‡s? q‚½€Æ‹ëÆ“±s=ÐpòÞæhÊ/¥:ûh|è4!\ 4Aˆc²Kh¹*ï@ó4ÅÖêÎÑ hOôhÁ½@„ô×:†öÿ@Ã8àxšw )¿”·pòu(LªÄ~ñ i´–¡qnB¦›0HqnÂ$À§eQpÛˆ§eƒ ›0H±¡in¬;žç&ä6®;-ü˜Ü„¾°þ¾édBô;m¬ ÃÉ’°"ÜÉò Òr0þÖ,¿á¹$"áMÌò›u4jBçf–ßð·[³ü©%À–߬ãQ¸Žå7<ý1‰u€âœÙ½ª¢õÎn Üª`åg"蛌°‹Ž7|yÉí0>´.*œ#‹ çK‹ /È„ïé­&QpÛH‹ W¸Õd±áè­&³Nì§E‹ çaQáÏfæn|Ò·èpýú_Îf—× fÑ[¯WÉ*0z$>6¯f|b%¡sA+ K`0XɃ4ˆ ”•u·¹ƒ¡ÀJ¤†Ú ¬äY'ö †`%)Îf%³`ÁÐÕj½II«mD=âS¯ÀÉ,õ­ÿÉ©$Ü5×nãípæ zbÖŽ’ø»RqÇXÓÖä‚ãRqGCÈ'7œq}'£¹CÅ?òúÜž¾ð>_À})1}èaÚ.æ˜< îÏ:€Û€ÜÆ ÷¥,0Щ¦6(}Ö‰ýÌè¹+q_Í@çà>'¦V¯Ò^‡ÅhÇgVѩ˫´¿‘)ï¡ñpçü¢º|€\pàü2B¾¿£.Wߪ¬]e%èÛ0á|;ü^½ñ—f mÈ ¤ w; Rrâ"5½Û)ênriÒ…»©¢6èÝN³Nì§F3~€»ÂØ—W01>â‡jß®G©³*ØÖgÔz¯ë3O½(Eýlís­µú'¬Š`õïTNß6F|uìè]÷% .)—9Iç‚V„M ÷% RKÐ è}IQpÛH …û’©¤6è}I³Nì§B¹Ø¸!áìLBrÖq]’UÃnǽےϦ|5ï‰íá÷ã¨RHC‰U©‹SukUæºGÄš'{´Pù=G‰dàŒÅSEi$½ÔN v…»o)9瓎Þ}u·¹Ô®p÷Í Ô½ûfÖ‰ý”¨ÝÜ}3ôâìLP3ʪÊúwÚÉ9}C¾gÝû¶±‚åO»¾Ê®úÌØNF "ÜM—þúœÎÎIéë²})j~Ò}Õ“9gà­ ¦™‡+Câ§i­rÁ12­ðøx>}ØÅ'—s2֫Ⱦ‹Ô׳hlˆrbùúÆPŸ¹ ·•¸>ÅGɳS|NÃmÇáAq[I‡q; Çíe|¼Üf²åãØsiò‹wZµ]6Èæã4Èî:å®:}vÒËY@Ç9Ô¯sZ;‡ïõEÔKÒ†–¹àH”xä¼\v°8ÉœŒÓ¦u¤’¦Ø9Ô‰ŒKa9÷=ªiÁz‰½ Œ¦ÞtÖ{=ÖÃãäuÆú®—¹²ŽÂ9»Î¾!ÆÇ¯ª§*G ÁhžBŽ]jp\¤KMH> endobj 1025 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 771.500000 172.500000 778.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_thread_performance >> endobj 1026 0 obj << /Type /Annot /Subtype /Link /Rect [31.5000000 758 73.5000000 764.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23R >> endobj 1027 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 745.250000 84.7500000 752 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23R_nn2 >> endobj 1028 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 737.750000 122.250000 744.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23R_nn3 >> endobj 1029 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 731 138.750000 737.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23R_nn4 >> endobj 1030 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 723.500000 109.500000 730.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23R_nn5 >> endobj 1031 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 716.750000 131.250000 723.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23R_language_conventions >> endobj 1032 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 709.250000 104.250000 716 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23R_nn6 >> endobj 1033 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 702.500000 108.750000 709.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23R_nn7 >> endobj 1034 0 obj << /Type /Annot /Subtype /Link /Rect [31.5000000 689 84 695.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby >> endobj 1035 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 676.250000 105.750000 683 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn2 >> endobj 1036 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 668.750000 143.250000 675.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn3 >> endobj 1037 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 662 177.750000 668.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn4 >> endobj 1038 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 654.500000 180 661.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn5 >> endobj 1039 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 647.750000 153 654.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn6 >> endobj 1040 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 640.250000 136.500000 647 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn7 >> endobj 1041 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 633.500000 183.750000 640.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn8 >> endobj 1042 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 626 201 632.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn9 >> endobj 1043 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 619.250000 204 626 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn10 >> endobj 1044 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 611.750000 148.500000 618.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn11 >> endobj 1045 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 605 126 611.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn12 >> endobj 1046 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 597.500000 129 604.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn13 >> endobj 1047 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 590.750000 146.250000 597.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn14 >> endobj 1048 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 583.250000 130.500000 590 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn15 >> endobj 1049 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 576.500000 125.250000 583.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn16 >> endobj 1050 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 569 130.500000 575.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn17 >> endobj 1051 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 562.250000 135.750000 569 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn18 >> endobj 1052 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 554.750000 145.500000 561.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn19 >> endobj 1053 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 548 174.750000 554.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn20 >> endobj 1054 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 540.500000 146.250000 547.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn21 >> endobj 1055 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 533.750000 153.750000 540.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn22 >> endobj 1056 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 526.250000 145.500000 533 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn23 >> endobj 1057 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 519.500000 207 526.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn23_1 >> endobj 1058 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 512 155.250000 518.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_C_STL_Functors >> endobj 1059 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 505.250000 153.750000 512 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_C_Iterators >> endobj 1060 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 497.750000 159 504.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn24 >> endobj 1061 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 491 218.250000 497.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_smart_pointers_shared_ptr >> endobj 1062 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 483.500000 201.750000 490.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_smart_pointers_generic >> endobj 1063 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 476.750000 190.500000 483.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn25 >> endobj 1064 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 469.250000 190.500000 476 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn26 >> endobj 1065 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 462.500000 92.2500000 469.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn27 >> endobj 1066 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 455 146.250000 461.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn28 >> endobj 1067 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 448.250000 153 455 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn29 >> endobj 1068 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 440.750000 141.750000 447.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn30 >> endobj 1069 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 434 155.250000 440.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn31 >> endobj 1070 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 426.500000 146.250000 433.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn32 >> endobj 1071 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 419.750000 121.500000 426.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn33 >> endobj 1072 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 412.250000 185.250000 419 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn34 >> endobj 1073 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 405.500000 161.250000 412.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn34_2 >> endobj 1074 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 398 153 404.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn35 >> endobj 1075 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 391.250000 150.750000 398 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn36 >> endobj 1076 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 383.750000 99.7500000 390.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn37 >> endobj 1077 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 377 156 383.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn38 >> endobj 1078 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 369.500000 146.250000 376.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_Typemap_scope >> endobj 1079 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 362.750000 154.500000 369.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_Copying_a_typemap >> endobj 1080 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 355.250000 154.500000 362 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_Deleting_a_typemap >> endobj 1081 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 348.500000 165.750000 355.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_Placement_of_typemaps >> endobj 1082 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 341 144.750000 347.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn39 >> endobj 1083 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 334.250000 168.750000 341 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_in_typemap >> endobj 1084 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 326.750000 191.250000 333.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_typecheck_typemap >> endobj 1085 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 320 172.500000 326.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_out_typemap >> endobj 1086 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 312.500000 180.750000 319.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_arginit_typemap >> endobj 1087 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 305.750000 182.250000 312.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_default_typemap >> endobj 1088 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 298.250000 180 305 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_check_typemap >> endobj 1089 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 291.500000 181.500000 298.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_argout_typemap_ >> endobj 1090 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 284 183 290.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_freearg_typemap_ >> endobj 1091 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 277.250000 185.250000 284 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_newfree_typemap >> endobj 1092 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 269.750000 194.250000 276.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_memberin_typemap >> endobj 1093 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 263 180.750000 269.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_varin_typemap >> endobj 1094 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 255.500000 184.500000 262.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_varout_typemap_ >> endobj 1095 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 248.750000 185.250000 255.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_throws_typemap >> endobj 1096 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 241.250000 188.250000 248 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_directorin_typemap >> endobj 1097 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 234.500000 192 241.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_directorout_typemap >> endobj 1098 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 227 200.250000 233.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_directorargout_typemap >> endobj 1099 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 220.250000 170.250000 227 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_ret_typemap >> endobj 1100 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 212.750000 183.750000 219.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_globalin_typemap >> endobj 1101 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 206 153.750000 212.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn40 >> endobj 1102 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 198.500000 147.750000 205.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn41 >> endobj 1103 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 191.750000 212.250000 198.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn42 >> endobj 1104 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 184.250000 212.250000 191 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn43 >> endobj 1105 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 177.500000 184.500000 184.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn44 >> endobj 1106 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 170 165 176.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn45 >> endobj 1107 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 163.250000 157.500000 170 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn46 >> endobj 1108 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 155.750000 156 162.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn47 >> endobj 1109 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 149 201 155.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn48 >> endobj 1110 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 141.500000 188.250000 148.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn49 >> endobj 1111 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 134.750000 150 141.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn50 >> endobj 1112 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 127.250000 205.500000 134 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn51 >> endobj 1113 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 120.500000 200.250000 127.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn52 >> endobj 1114 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 113 122.250000 119.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn65 >> endobj 1115 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 106.250000 148.500000 113 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn66 >> endobj 1116 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 98.7500000 156.750000 105.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn67 >> endobj 1117 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 92 200.250000 98.7500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn68 >> endobj 1118 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 84.5000000 200.250000 91.2500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_autodoc1 >> endobj 1119 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 77.7500000 200.250000 84.5000000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_autodoc2 >> endobj 1120 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 70.2500000 200.250000 77 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_feature_autodoc3 >> endobj 1121 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 63.5000000 221.250000 70.2500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn70 >> endobj 1023 0 obj << /Type /Page /Parent 2 0 R /Contents 1122 0 R /Resources 1124 0 R /Annots 1125 0 R /MediaBox [0 0 595 842] >> endobj 1124 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 1125 0 obj [ 1024 0 R 1025 0 R 1026 0 R 1027 0 R 1028 0 R 1029 0 R 1030 0 R 1031 0 R 1032 0 R 1033 0 R 1034 0 R 1035 0 R 1036 0 R 1037 0 R 1038 0 R 1039 0 R 1040 0 R 1041 0 R 1042 0 R 1043 0 R 1044 0 R 1045 0 R 1046 0 R 1047 0 R 1048 0 R 1049 0 R 1050 0 R 1051 0 R 1052 0 R 1053 0 R 1054 0 R 1055 0 R 1056 0 R 1057 0 R 1058 0 R 1059 0 R 1060 0 R 1061 0 R 1062 0 R 1063 0 R 1064 0 R 1065 0 R 1066 0 R 1067 0 R 1068 0 R 1069 0 R 1070 0 R 1071 0 R 1072 0 R 1073 0 R 1074 0 R 1075 0 R 1076 0 R 1077 0 R 1078 0 R 1079 0 R 1080 0 R 1081 0 R 1082 0 R 1083 0 R 1084 0 R 1085 0 R 1086 0 R 1087 0 R 1088 0 R 1089 0 R 1090 0 R 1091 0 R 1092 0 R 1093 0 R 1094 0 R 1095 0 R 1096 0 R 1097 0 R 1098 0 R 1099 0 R 1100 0 R 1101 0 R 1102 0 R 1103 0 R 1104 0 R 1105 0 R 1106 0 R 1107 0 R 1108 0 R 1109 0 R 1110 0 R 1111 0 R 1112 0 R 1113 0 R 1114 0 R 1115 0 R 1116 0 R 1117 0 R 1118 0 R 1119 0 R 1120 0 R 1121 0 R ] endobj 1122 0 obj << /Length 1123 0 R /Filter /FlateDecode >> stream xœí]Mä8r½×¯Èó[ïà`˜žž1àƒÆ àƒáƒÑ»ëÅbwá^ü÷-ê“ 2TR¤$fV×4¦«+’bPJ½G2øüá_~ý¯Ûÿï퇟~ýŸÛ×ñçO¿¾ˆWbøïÿü>5(ÿ:þûæ<ܾþíåÛíÛË——/Ýßß^† ~ýéߺýßMÝþµûÿ/·ÿøÏÎø‡±P,ð·']÷ó¯ýÏàd÷/1ÿŒö?¿üûïn5NîÆÆä¿ÿ¾»FÄF¼áøÛËt“²ÿó¿_ÿþòÃpû{|È`T÷·Ñ¦ÿçí|ùS¼-N;eÙNi¡¿¶{J£A‹Wï…»IíûHÙ[Ugp£›ÑðõEjû*ePÞÏe ¯Rñ‚ÁàûËnùõÊ!!^’¶#–>Õ‘ßÇ×îÛüuþâýç_À`!¾»o+~úíå‡_ÂMÚÛoê>êôðã·îÙê~ënn¿ýáöOB(ñÏ·ßþòÒ5=« ÿ^†OäÏä'ŸûO̫іO~¢®YñèMüD]£¡ÿDÊW0Öw.×üH]CצτZŸõG÷y}Èë€ÔÇÜçWëóŒE>:îób™±.ëó-û<0ÏÐç‘-øàT&§Ò½»&{]ÒÝêcÇ R’ß)Ý6²#âÜÜ5LL¤½I ÷w ž€­ïAëÃtÛ¿_=ù‰äWBv3ã“‘ð*‚v•‡X«mxù¤š>ÚЂ•WymxuªôTù„ö£·zšbîq”L EÄ- â&;3k9÷eãïc7díØƒôÖΩ…y.=¾¾X3öDr*£³*tê +>ü>öAùÅÝ»–;±ËËø¬ Ÿ;øó˧ß]ÞùøKw÷o÷bW͵ÔÏŒ±Í…~ë‹:¼3#I©áî7uæÌoê8ÆAoj7²É_$#Š75–ÑY:u0½©ã@ ½©Ýh,wÐð›Ëø¬ Ÿ;hù¦}ΛÊ!­D<î/škM6‰è1º~ÎÀh¥w dïH‡W>í¶1üâ¨'1Ü l°9°ÁÕ€ á®3``Ç2:«B§&`wƒ¤ °»yr` `Ç2>«ÂçZÛªS€M_ÃÂ3¦å0™öÊøœŽ9Ôòq9²+¤CÏ^èеJ•+³1η@·zߨÅê™Ü¤†»ÉÍANnÎÖÈÍyÄ=“[,£³*tê`"7gjäæ4v  r‹e|V…Ï´$·î6N!7Éè†?‘ÓJN €ƒcz’Jc…æF4–ÅŒ˜ÆµÜR¯fJ—îi09HÔ@ÂPpHÃ˹ :˜@t ¤Ñ;PHgXÎUøÜACZñ6Y etNö+9]÷Ê”šé¡ÝðŽÑÑÊ ~ªG"÷Q'DÍhì¾ÎÝ 9ó†ƒÔp/oX©3Þ°ÒTxÃâØ–b[)ôû2:«B§FÞ°]ŸSò†•;˜7ú2>«ÂçZò† çðÉ+húL jõ§1Ê«q·O²µ¬‘~%) ­š#ÐJ¨Ôp7ˆ´ÊA¤u D8ìf‡°[†ƒXFgUèÔÁ"-k Ò;ˆbŸUás-A¤ý9 ú‘Ñùrt3tÛÈ9ý±cçí¾tX†½&5œ¼ÆgÝ(^YÉ£oÿcoZã«H>“~€úDmŽ×Æ—ÄÍSiBj¸—¯ÈùÚ‰_;ø:_÷etV…NŒ|íD¯ØAÁ×}ŸUás ùÚ‰ |MF'^1<4\ˉ ¬p<'ÒÊèVü4†rbaò(ôZ …gNÉÔƒAU„gN™\ Hx6”¼H}LÂ3× ôJá™ë†ì¹°ð¬/3¶sª#¿¦Â3§ÜÅ6ÂÖ=ýàLLŽÅ&GHʉe2ºgú~VÚF?QzĸS–0–3xyžבoͬæÒ!¤†­| h㙳µg΢gÑ€ùÖNÏ’: õ1ó-Ô6ž9@Ï¢ó-LÏ–:òûhË·öígWñ-GoBGm¿#©g•Œd¡qmÖoi,MrœY]±œE·ž®žþÖÉ;fmÊØ§×wvÙz$LjØÊzm=r®¶õÈy´õ(0ëùiëQR¤>fÖsµ­GΡ­GÑ€YÏM[–:òûhËz~ƒhû*ÖcQQ>[Ðc圵U÷é¸À/{wtfØÊÁ!.¾Â>‚3Å©¡`y(yú˜¹ ØDÑ\Æ .ˆeÆvÚŒ ‚{.ðbƒ,þ*.àÌœèè 9×9x)lGÇ}è`IýrÙmE¯‹Þ‡Ô°½^Ú½^ºzqœÕqÖ½}Èë€ÔÇ„^/¡‚^/ öa0zû2c;!Eoâ£%zÕíûUè=TuÒ~þò æôs£c?tÜ£½ö‡ž0ýˆ©Œ~ÄÞŽaá™Â†‘CÕ,Ÿ3RýkÔ^çª{¯kª{¯‘êÞëBuß—ÑY:u0®Q{]SÝ{­±ƒBuß—ñY>wÐpÚ› ª{­2Bêœ]­,º»6 ÌA {tn¡rFÆm½ ^ÚôK§W…òW–A9o&ÝjºS¥MÄ#Þ(ðF-]M 'æ8êÌÇiòÛ¢'dš\€¦Å_Úm|4èQtM¶¢ölÞšj€AS €ÚT/cøq#*À<·Xê€ÔÇ<Õ]›j€Â>T1Õ€yn1בßGÛ©†ßŠ‹úÄÙÈ*+ž!©-Üs–Xi–gLëVžÁ/$/ÓSí;~VÂ5ômÐsÐc;ENÜ‹Žîr;#GV.tRÃݳ—oGò®¶É;´É»b;R_FgUèÔÁ4ëqµíHÞIì ØŽÔ—ñY>wÐrÖã6lGb0&dY“ø–ž¢!£/3¶3“ø'>"#Ès$þWåG3dïÏš« ´¶áqQXrRª~„<¶‚H#-~Ð5-~ÐH‹t¡ÅÊ@^¤>f©š¿û|¨B‹ß—Ú©2-~â£%ˆô9Zü«r‘»WkQíC·‰œøÿМ'Ï"«K’OÝovž [¡o,<@Mp2@! Ê@^¤>f蛚,<O }3É—:òûh }8G~Y¦.†¬bÏ2GYÅÉž³³ÿ\j*—¶‚È"•q°5•q<)Á]¡2Ê@^¤>fÙšÊ8X¤2Ž ";©Œ—:òûh "wŽÊøªLZ+›Ãi1º Ö’2ÝOïÄÌ’§QAH [1ã‘7x_à 7„P¨q‡2ש3¾¦Æ …M¢cÆOjÜ¥Žü>Úb&œ£Æ½,‹cUb%e =êÝ>¥cÉ튋„%âr:5l‚—Š\“Â+J¹l´f1‹ÁÁk*yúà ¥\6Z öä²c™±‰\6óÑ ^*ŽO^ŒüRIÚj0‹ßë’ÇØ»Ô°fÉñ £ÁÖ`–G5†Y_ò: õ1ÃL™Ì”Æ>t³Xfl§É`¦à`¦Ï‘O²`öùaF¯ÍÑÑ Îò''ùϱs¼»|ŠoÔ¼p¦¥N [n ¸)µ`ÑêøŒ+nfDÈn ¸)µ`Ѫ°UÜ̈6:¸i¯ëZoCò*€ÓêÅöWÃD±¢ªÚ“w˜sôI‡fæàœæò=.îDÈÌ œ:ˆÔ°•Á–³&ƒ©1X8 ˜Áú2ש™Á¬ª1˜•؇,,–Û©2³úÌ^­uâh4ç°¤öÜv¨’µ sšîN<»E $MjØŠg¯ž}©ŠV@XóPàÙÃ`¯3<{…ðìK-P´ ìCxöb°—ž}{-PlÅ3h8*¡Ë&#Çæ¹ÙXÑúí8ë°P‚ŸRµ6©a#®¥9®¥(•LÑŠ¢iRŒë¡ äu@êcµ¥’©kzÀQÁ \‡p›Ú)R\'>âZŠR2Ѹæ¤J¼ ׌å%Îûƒ7Ò…g)–§23lųϪUE+ ÛI¥ <+=XÉ ÏJ <ËRT­(ü Ï}™¡2dxVíEU±#ª¢ñ|l*¾ƒñ|lÂÆ>YÖ ŒŒ™ ½äI™ëP-®cÍ¥Èkvì£7†œ\‘/-ý%ÓÅÀ¾.@ÍãljØÚ耺SŠë¢v¥QE`ÔÄùFd]€¨ Ð¥¸.ZQ€:p ÝÄùÚg]€n/®‹7þ8⺕.àPÙÝU]M©=?~#]æy>5l%ðˆ  vV+•V¤`åÄ2RHJ±`´¢˜o4`R;±¸Œ ½X0>‚Ç ®Â¯5]E +‹Ö‡ 4î+m’¾RÃVÞpñ†+“Çd¥ox1ÅR¤>fÞp¥`2ZQl90o8˜ˆÂÙŒ7\{Ád|#˜\áG>“䕹GjÂ9zâýK°ã+]ŽP¥LDh<6õ™zp¢‹òZ«,tõ,03!†n_ZÐmÅÝè¶ýÄÍã©ñw]$’VHó¼†,‘ìXFgUèÔAŸH6þ.‹D²Ñ*°‘'’Ëø¬ Ÿ;h–H6¶â$16ç¬@2ýÁÇw’c4>»Ekâ2ÃÖ1}@úcjúcþ8ð˜>Lúã¤H}ÌcúPÓ÷'„e>|¡?îËŒíÌôlj–cúp’þøÐC¹ŽÍÎ9:»}>|M½Õž´GI•UH¤Ê6B_K$UÖ²&UŽ;¨3XF‚þPò: õ1A_‹šTY $UŽý¾ÌÐN‘I• ¡¯åIR嫎¢'‡®ëìˆr^¦§¥3+3Z°2…eäiÞI Z.™!µN [IA!ñªÖ5ñªÆñ7­ ñêPò: õ1“‚ª‰WµBqÄhÀ¤ &ñêRG~mIAŸ$^½è\…•ÓäŸ}ØÔ‹†Td†­Ø4HCªMMCªiH£c& iR¤>flšš†T¤!ŒM3iH—:òûh‹M8ICzÑT•µ`I÷›g¬Lm:JðÐÍF¬Pò¸6 $¢RŸî ii;Æß}%¤¥qÄI§4*Õ—ÑY:u0†´´µ•–¶(f (¤Õ—ñY>wÐ0¤¥ÝI:S޶‹‘6le÷=Š`ˆ….?cåneäUO‡“ꀡgåehC€~ “G>fÃÝüçmÎÞÕøÏDO} 2§°XFgUèÔÁÄjüç v` þ‹e|V…Ï´ä¿p’Š—¡ŒÿþVüXâ]ÎÎî6ëz„%‡k/ƒŸ 'SF ®FÔr¸™4¢Èá:”¼H}L“)#j9\£< ù(r¸öeÆvf9\ 'SFž¤%½JhO/’ï8týØ{9Q ÆøÐ 7(Í«’[×y¯ÌÉ [sò‘†’J ºuidrš¼O [)T!=¨Q5=¨Áq\£ =èPò: õ1S¨ªéARØG¡íËŒíÌô ‰–ªg|·§PÎÒ'ŠBŸ`Ô±¯³8÷`V8ž‘Û· ¡ò(³}q)£—¤µ©a+¡”´Ö˜ZÒZƒƒÏÆIk‡2ש™PL-i­1û(’ÖöeÆvfIk- Åœ$üd ëPof4¡lW _6Ž{¯£¨äKÜ~ez6l%‹2à[Ë€k,ÊR`l‘w(yú˜ÉÁÖ2à+°"n_flg–7ñÑ’ìI¢K90V¿¾¿¨Î³²cì’W¹Ôpo”Öøyœ1þ®*QZƒƒ¨f¢¦Ö¾ŒÎªÐ©ƒ1Jk¼¨DiCaàh@QÚ¾ŒÏªð¹ƒ†QZãOR«2öŒÑ™ʽHŒ„ñœÍ¯+~v-W¿È6BfØØóueóžDM¨ 8Œ¢je ¯RsÏjBMp84B;ÌÐÕ…L¨™øhØóÅ­ü×¾õk´Çž^EÐí³âþŒuÉ=ƒlÎÒ/#$ú€$¡÷u— åæˆ–}ÊMH¹ ª¦Ü)U(7‡2ש‰%@Ö”› QÄ/KôeƆgÊÍÄGK–P')79,ÁˆÆ=Wº=1Q9˜§¥oÝ×fhªE¸ÙÞ2¶BS#á&èšppÌ L!ÜÊ@^¤>fhêšp4ŠE†¦ž„›Kù}´…¦9I¸É€æ±©ß9ïr>¾(®õ¾:ðÍ\`í¥K [¹PBO_ãb[$ôÊ@^¤>f.€ZBO*‹Ì0%ô\êÈï£-Ø“„–.àˆ¸.WÖz8Ãüº8“.¬Ata÷èè®v¢;8´w\q¢ûPò: õ1Ó…«èÎ`ʼnî}™±Ù‰î‰–táOÒ%rèâÐ,?¬`ðŽÀ8G"ÌIƒÆp¯l@Bf¹?ð~^E×Ö¦†­œ4BM 8¡Fe ¯R3焚4Ži†BÙ—Û™I# 9ÇŠ“¤‘Îaè§›©]Þ3F­HN¨©áîœcVªæ9Ǭz{‚Üþ?6.o¦,„c×|ß{¥¶'ÌÖd]V- 2©á~Xèö©ø¬>I‘u,è•ùÜ×µ”7rdóoj$¿S š$«^f¸¨]{›NRG]TNXzåE>t÷ìw XÔPRÃý€±¡=`ÜÕR¢öDúEfmÏ>6Ñ<}Í0s`ºymÖô‡|̆ûé}{`†ÇQ;±€ÉÙÑH“ÞßÇÈo¹òÒ¹±éÅ›`æÀ Ë9ÌCˆ$¸ƒ€éº¿[ÓÉDZ€É9!˜~‘?&kç!ÉI»tq™á~$)ÛIúô@$1äò—=?¦~÷ÃOÃ?Ÿöðƒ’àpà÷ùHø­,FsòDÐïà¡0ÿN faêÔp?0mû£t{ ± ˜úЩç¬FEžrÌ¿S`ºå]RÃýÀôí^uá!œÕqÍÈ͹2”eˆÎèkhMÊÁ‡µ~¬éç`Kš)£RÃÝ`ö¢½ÔÅKñNÁ|¬¦ÈVÆ:uøuQç¥Ì—5fÃý¨Sí•4^=¹’†FÝ¡›cP÷ºzÌH›îÇ£i/˜ñæ¹3+Ó+¥á$ue“ž¹;ª¿S<š°àѧ†ûñíõ8Þ>·gœda˜Ö—ql:Kôž1l鎲©á~ »öÒïŸ[º³‚aÎ!ïÃ‡Ž¥ß5ºý¢ÿÑ65ÜîÐ^ÿÄsëVÐÍ9¤å} û‘ÅãÃß ¿®âY°|j˜vè(ƒÆ3³zj‹AÀñ. ²½ö*¨çÖ^­°C•Åb¤ï²sjI£äBj¸º½&*˜çÖD­À‚¡–¢{8αô:îÊÛyè™!ï˜&ÑDAjؘ<$JX –°(JX (yÈPò: õ1% PKXÀ`E¢¾ÌØÎ,aQâ£aò`HÃõîÓzÓ vîâ5]Û Ùq²ÀíKRì’Hh€™Ý—H(8”H(¸Z"¡àP"¡hÀ\à¦DBIú˜¹ÀÕ §±"‘P_flg–H(ñÑ’ üÉÆÀ=g,rvãq B/á‘ĵ2÷¦G Gœ÷wÁ!=Á'i‰|j¸Xškµd¼‘ÇGÐÁÇÐÙ†YI9 p®9&ÌöÓXaÀÇK™¦†ÆJ5}´¡z£‰|¶•úùGÑE·KY ÷2ìF‹íH>nÃ@œ£>ÐО’>ºÍ ¤b uROvï]{Ò¤Ôc0G'Ýþ0A jÆšþ¸¯ì(ãÈ èg1‚ºL!­é#É2=§hÜŒ:èñ\j¸u¦¹O x =uGt²û˜UjÚf†ûßlÛ\¥&…{ •çÍæœKñ#cÐÆ‘†pV9½ÅÎ7Ú%GÕAjØ–ÂçGÕI*GÕuÖü¨ºÞÇ…Ç2ש1.Ü*GÕuV‡|x|TÝPflxzT]ê£]\¸»ñÇQ’qöì¿—5¢íÝÝŠcº±d“Î_ ê^±E fdj؈ø*9â»*ˆïþËÑ ñCÈë€ÔÇ„øŽ—*ˆïzMäCàð†2c;ÓðR /å㨮ŽMÀ9oåœ*¼lËÚéÿ”Gg5 º±VÆ# CáDÒX™mOoÈz~ô2æð”ì«ööŸlí¤\’˜Y™¶öÊ¡@ùZ bgÏ=Ë@^¤>æ@UÎ=쬀|(|îáPfl§Ízõçvàq†Çf`ŽJ~ƲXUÀØW°¢”¸ê˜·Ë ‡ 49äÍâj|ƒjk8t¤[½È0•K [éÖXD·¦"Ãì¬Q¡Á2̱ äu@êc¦[S‘avVƒ}`æPfl'dtk@†)ã' [Æâ,}¢äÊØˆÉCcƒ•æjr s¬¢|äêÍì‹0³È͆»CÊÒ6Ï'¥{¡#mÇ ¸Ú¿øN–ÿé#vð*‚vÛ˜‡3\iõ™\1ë¥[Òï9•¶Ž$¼A# µ‘¤Ë1žŽüÚŽ$‚xnc‰,ž)þm~&I¦ IÝ ½‚A+'8 vY+Þ»p–Ö¾œµÜ<Ð ‹6î_ w ôl¤R%æ!äø»ÙÚ‘K«½YùVŒ†¯/ÖŒœ,§2:«B§ºâÃïj`ct±Äâ‚jDWÆgUøÜÁŸ_>ýîrB÷"ò¹' zlèÛ  â(B34ÂÍTʼn‹Ñ»tX''ЃWº?älùߺøê{DÈYûÃİq§”ÊpJéÊNᨸ£âÉl(yú˜pJÉÊN)}<€ëËŒí”é.ñÑp§ÔIúÙ‹öÑZØ•ø:9v*'?ÐóPÛÖ^_©å¬X%SÃVĉoT ñ80«ÆÀlŠØ¾ äu@êcF¼5Äk`ŽŒøXfl§È¿øh‰xs’v÷¢ý7fxí¥™—Кóî>¡®áœŠÆJ¥Å`ÊÆtrÐ}Óqtâ-¢PjL©BóÔ˜R‹“DÚÑ ëà‹:ù “êC!_ÀÃèD Èéd6ÜM'Z6O)*µ:Iñ{0vÐÉÔOÙ¦ó·F'Ê :Q-µn~8´Ôæ$EëUtÂ9úƒN>è¤úPÞÃêÒ©dhfµÈÌÉðËË—Û·Ž‘ê«Ö—· |[!Õ‘Ñ|õЩ_…ŒËÿ·ù0‚QªU{ÀƒÐÇUð RSåV91l#­l¢ÓŸÇkFùAÁ5øLùÑoPkÛ/ã– KÖ6‚C¿ÖØiÿ`qƒ#-Õªwä'†º I×F^3bEîºu·¼÷ÜΉð*‡‡ñû˜žpº…ŸFèRqþÞé›0ørûòòÿ¤}O€ endstream endobj 1123 0 obj 7859 endobj 1127 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 778.250000 159.750000 785 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn71 >> endobj 1128 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 771.500000 117 778.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn53 >> endobj 1129 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 764 159.750000 770.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_operator_overloading >> endobj 1130 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 757.250000 189 764 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn55 >> endobj 1131 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 749.750000 170.250000 756.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn56 >> endobj 1132 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 743 132.750000 749.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn57 >> endobj 1133 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 735.500000 201.750000 742.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn58 >> endobj 1134 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 728.750000 153.750000 735.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn59 >> endobj 1135 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 721.250000 148.500000 728 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn60 >> endobj 1136 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 714.500000 147.750000 721.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn61 >> endobj 1137 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 707 146.250000 713.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn62 >> endobj 1138 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 700.250000 201.750000 707 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn63 >> endobj 1139 0 obj << /Type /Annot /Subtype /Link /Rect [31.5000000 686.750000 87 693.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab >> endobj 1140 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 674 105.750000 680.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_preliminaries >> endobj 1141 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 666.500000 111.750000 673.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_running_swig >> endobj 1142 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 659.750000 164.250000 666.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_running_swig_generating_module >> endobj 1143 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 652.250000 156 659 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_running_swig_building_module >> endobj 1144 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 645.500000 156 652.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_running_swig_loading_module >> endobj 1145 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 638 149.250000 644.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_running_swig_using_module >> endobj 1146 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 631.250000 180 638 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_running_swig_options >> endobj 1147 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 623.750000 153.750000 630.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping >> endobj 1148 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 617 128.250000 623.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping_overview >> endobj 1149 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 609.500000 129 616.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping_identifiers >> endobj 1150 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 602.750000 129 609.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping_functions >> endobj 1151 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 595.250000 183.750000 602 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_nn13 >> endobj 1152 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 588.500000 204 595.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_nn14 >> endobj 1153 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 581 146.250000 587.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping_global_variables >> endobj 1154 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 574.250000 180 581 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping_constants_and_enums >> endobj 1155 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 566.750000 162.750000 573.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping_constants >> endobj 1156 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 560 172.500000 566.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping_enums >> endobj 1157 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 552.500000 125.250000 559.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping_pointers >> endobj 1158 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 545.750000 175.500000 552.500000 ] /Border [0 0 0] /Dest /#1b#ec#91#2a#5e#da#a0#3db#a3#9b#ab#11#9cA#25#7f#da#0f#ee >> endobj 1159 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 538.250000 170.250000 545 ] /Border [0 0 0] /Dest /#1e#17#8eg#18#87#14#a2#83#f2#06#95#27#9a#f5#cd#d6R#af#8e >> endobj 1160 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 531.500000 130.500000 538.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping_structs >> endobj 1161 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 524 135.750000 530.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping_cpp_classes >> endobj 1162 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 517.250000 145.500000 524 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping_cpp_inheritance >> endobj 1163 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 509.750000 150.750000 516.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping_cpp_overloading >> endobj 1164 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 503 213 509.750000 ] /Border [0 0 0] /Dest /1#3d7#e2#1e#c0L#7d#92#c9i#89#e6#04#d3#f3y#aa#3b7 >> endobj 1165 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 495.500000 145.500000 502.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping_cpp_templates >> endobj 1166 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 488.750000 144.750000 495.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping_cpp_operators >> endobj 1167 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 481.250000 153.750000 488 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping_cpp_namespaces >> endobj 1168 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 474.500000 147.750000 481.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping_cpp_exceptions >> endobj 1169 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 467 130.500000 473.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping_cpp_stl >> endobj 1170 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 460.250000 146.250000 467 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_typemaps >> endobj 1171 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 452.750000 187.500000 459.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_typemaps_primitive_types >> endobj 1172 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 446 120.750000 452.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_typemaps_arrays >> endobj 1173 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 438.500000 153 445.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_typemaps_pointer#2dto#2dpointers >> endobj 1174 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 431.750000 126 438.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_typemaps_matrices >> endobj 1175 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 424.250000 114 431 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_typemaps_stl >> endobj 1176 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 417.500000 123.750000 424.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_module_initialization >> endobj 1177 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 410 112.500000 416.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_building_modes >> endobj 1178 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 403.250000 147.750000 410 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_building_modes_nobuilder_mode >> endobj 1179 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 395.750000 138.750000 402.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_building_modes_builder_mode >> endobj 1180 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 389 118.500000 395.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_generated_scripts >> endobj 1181 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 381.500000 138 388.250000 ] /Border [0 0 0] /Dest /n#3e#3bF#f2#fb#8f#ad#ad6#28#f3#db#a3#b9l#d8Q#c83 >> endobj 1182 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 374.750000 138 381.500000 ] /Border [0 0 0] /Dest /#e9#97#8a#1d#dc#1d#0e#e0#be#fc#09#9f#7c8g#025#a2#a6#b6 >> endobj 1183 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 367.250000 114 374 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_other_resources >> endobj 1184 0 obj << /Type /Annot /Subtype /Link /Rect [31.5000000 354.500000 78 361.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl >> endobj 1185 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 341 105.750000 347.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn2 >> endobj 1186 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 334.250000 177.750000 341 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn3 >> endobj 1187 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 326.750000 180 333.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn4 >> endobj 1188 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 320 136.500000 326.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn5 >> endobj 1189 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 312.500000 153 319.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn6 >> endobj 1190 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 305.750000 183.750000 312.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn7 >> endobj 1191 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 298.250000 181.500000 305 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn8 >> endobj 1192 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 291.500000 167.250000 298.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn9 >> endobj 1193 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 284 154.500000 290.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn10 >> endobj 1194 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 277.250000 203.250000 284 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn11 >> endobj 1195 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 269.750000 204 276.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn12 >> endobj 1196 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 263 141.750000 269.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn13 >> endobj 1197 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 255.500000 153.750000 262.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn14 >> endobj 1198 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 248.750000 126 255.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn15 >> endobj 1199 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 241.250000 129 248 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn16 >> endobj 1200 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 234.500000 146.250000 241.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn17 >> endobj 1201 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 227 161.250000 233.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn18 >> endobj 1202 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 220.250000 125.250000 227 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn19 >> endobj 1203 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 212.750000 130.500000 219.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn20 >> endobj 1204 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 206 135.750000 212.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn21 >> endobj 1205 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 198.500000 145.500000 205.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn22 >> endobj 1206 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 191.750000 208.500000 198.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn23 >> endobj 1207 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 184.250000 174.750000 191 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn24 >> endobj 1208 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 177.500000 144.750000 184.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn25 >> endobj 1209 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 170 153.750000 176.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn26 >> endobj 1210 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 163.250000 145.500000 170 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn27 >> endobj 1211 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 155.750000 159 162.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn28 >> endobj 1212 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 149 176.250000 155.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn29 >> endobj 1213 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 141.500000 140.250000 148.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn30 >> endobj 1214 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 134.750000 161.250000 141.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn31 >> endobj 1215 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 127.250000 146.250000 134 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn32 >> endobj 1216 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 120.500000 121.500000 127.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn33 >> endobj 1217 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 113 99.7500000 119.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn34 >> endobj 1218 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 106.250000 156 113 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn35 >> endobj 1219 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 98.7500000 138.750000 105.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn36 >> endobj 1220 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 92 153.750000 98.7500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn37 >> endobj 1221 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 84.5000000 186 91.2500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn38 >> endobj 1222 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 77.7500000 183.750000 84.5000000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn39 >> endobj 1223 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 70.2500000 145.500000 77 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn40 >> endobj 1224 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 63.5000000 155.250000 70.2500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn41 >> endobj 1126 0 obj << /Type /Page /Parent 2 0 R /Contents 1225 0 R /Resources 1227 0 R /Annots 1228 0 R /MediaBox [0 0 595 842] >> endobj 1227 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 1228 0 obj [ 1127 0 R 1128 0 R 1129 0 R 1130 0 R 1131 0 R 1132 0 R 1133 0 R 1134 0 R 1135 0 R 1136 0 R 1137 0 R 1138 0 R 1139 0 R 1140 0 R 1141 0 R 1142 0 R 1143 0 R 1144 0 R 1145 0 R 1146 0 R 1147 0 R 1148 0 R 1149 0 R 1150 0 R 1151 0 R 1152 0 R 1153 0 R 1154 0 R 1155 0 R 1156 0 R 1157 0 R 1158 0 R 1159 0 R 1160 0 R 1161 0 R 1162 0 R 1163 0 R 1164 0 R 1165 0 R 1166 0 R 1167 0 R 1168 0 R 1169 0 R 1170 0 R 1171 0 R 1172 0 R 1173 0 R 1174 0 R 1175 0 R 1176 0 R 1177 0 R 1178 0 R 1179 0 R 1180 0 R 1181 0 R 1182 0 R 1183 0 R 1184 0 R 1185 0 R 1186 0 R 1187 0 R 1188 0 R 1189 0 R 1190 0 R 1191 0 R 1192 0 R 1193 0 R 1194 0 R 1195 0 R 1196 0 R 1197 0 R 1198 0 R 1199 0 R 1200 0 R 1201 0 R 1202 0 R 1203 0 R 1204 0 R 1205 0 R 1206 0 R 1207 0 R 1208 0 R 1209 0 R 1210 0 R 1211 0 R 1212 0 R 1213 0 R 1214 0 R 1215 0 R 1216 0 R 1217 0 R 1218 0 R 1219 0 R 1220 0 R 1221 0 R 1222 0 R 1223 0 R 1224 0 R ] endobj 1225 0 obj << /Length 1226 0 R /Filter /FlateDecode >> stream xœí][¯í¶q~ß¿b?ð oà P°}Ž ô¡€a}(úP8Iƒ êä¡¿’HIœ!©EÍÒemÇ6’ã3k‡ÒÒ|¿þî_øï÷ÿùûûï¾ýáßJ~ûÛøä@ÄÞÇ¿ÊÊJÿýî<¼ÿôóÛ/}ÿöýðÿ¿¼Å/üðí¿ÿõïêý߆ÿýùý?ÿkþ>) ?¿9é†?ÿ2ýœþK,Žò?½ýÇ?½ÿuq6—&ƒÿþ•ÖËq,ÿò6_¥œþýûO}û]¼þ]F”ÔV½K£Í» F½ÿío/Œ5SYÎTšÉ†“Ó—‡5 Ô'ï…{—ÚOÿ!å$f¡]²“?½ Sü$ePÞ/:€Ç€ÜÆø…(Ó×Þñ÷m 6Áø•|£Nšç<¾ŽŸ†ô‡å'¯ÿQÒøõ~Ùøâ7?¾ýî»Áº}ÿñÃGñNOü8Ü;Pï_³pï?þþýŸ…Pâ_ÞüóÛ0õ ¬‚é‡IŸÈÖ'òóô‰ùdtô‚õ;ŸßiÎ@|ÛúŽñÓ'Ò|RÒ;4kßúŽP͹5?¦5šlÏúËô |ÒÊKüIÓŽ1­ï˜ÏéëÈ•JÓœm~¢ã'«ÀSAóŠ7® ¦Oô'0ÏQ¸æ=oα}Å&Úùòã.«{Ô cxÊLJÜÏ¡Aæ‚¿Ï…ç5ÑÈNÄ5ç¶O퀎s=Œ`Séf°ÙXê»îèsãWoÛëߺj˜Áq€´\Ћ®Æt5¾†®ÃÍÂÈ¢@×IðÛXÐÕØº 6E×Q'ÍÓ"t]m܉® _]9!› àŠÅIjÚ $-»¹ Û3_0YÖ”î‡ÝÀf ]ÈϦ‰Œµ(Md¬«¤‰Œ 8‹c¦t2ÊôL: ¡s)Md†qÊ4‘±†04M4éx4„ÇnL§NÁ²öÂR3-.ÑÆL¹ßÚÑe PœŽ‘Â:6ðظ)œôšÙ“†2N/i¨³ 7Šñ@¢okQÌgàcJÝâ(dÒ<ä6–(Æ›Zã5µ¡‹(fÔIó4(ŠYmÜÅù2žl‚Šå€MÏ/–†9þÍ€Ãv§¾m.œÛsk£E;lÏ-fÆjÙAÆÍ×íèåØ'ÑŽÆš‘+æ*l~ú³;p jYqZ$èÄjc5¨`5Ðt>¤t~†µ°€s6ä6f¬¡+X BQŠbõ¤“æ©s¬ÎlÜˆÕ ¯÷^«™¾öfBÛõ:׉“ÝÀÝvôÄÀÂS BsöúUï =HG7›½X 4ÁejX@óîòî¹/O:€Ç€ÜÆ‚JÕ°@IjCX0ê¤y*„«;±@…€œ¼Ô‡Â‚½ÎŽæÃô›x êV"ô:ºQÄÑ®9:MCJçŽ:ér‹£Yst#¨ Q8ú¨“æ)‘£¯6îttã?‚£7gð‚ 4ÓtÚ Îávg;±²· ïË‚Yè;Zú\Ðë×–„‡›WókKÂ` ‚pÔ<ä6¿¶5‚0!ê×0„×1ðuÜë×ö‚ðÁ~ÍX+·Ý‹³mÏY­ÿƒ:¸]Ù¸rA¯ƒ{AÜËšƒÓ¬'¤¬gî “à1 ·±8¸ 5w${; ¨ƒ:qžËø:îupõö`Æ‹»Mämn,´cww#]z,µW·ôm i_éžÝ£«rÈM(ÛH)š?Õß$¬ÖÅr¯ù ''¾Qh²{=ÖÈ~!ÜÄüé"˜™>¾µ¡;bUó®Žü®‰=íÇ%0no¼‰>‰ k´õöÃWYé·g°‘ðÍ—þ—f@¹Ò&þÊæ•¦%ø¾ëé­Åß—V­kn°¹àYŠ…\‰c¡V‰cTâŒB±˜t4BçÅšZ%Ž5¤gŠÅ¤ãѸ‘b19êh4„Î Ì>i}Í'‡%,6`]á“£ŽGCxlàNŸt58‘Ý9¡æÆÒ±ýÉE”Êhh† _7Gûf—ç¹…¨”Ê+aëIŠõµ:È>Ò( +á¨x ÈmÌ+áá稬„­'ûa£€¬„'4OT‡’Ù¸q%lCGÊ¡nvìë²MfaÑå®*‚;ÃÑ{W>6,$=åM.x~åÓzÚFCèi»jqËᘞBÕ~üëãç7ßïô×y€NJ'|$Ûo£€àcÔ<ä6f|t¢VIâÙF'4OTI’Ù¸ì¨$¹ 9ì/Í|`;ti/ Ú´¹3j[ïO—õbª“fÅÔ ÎÄÔ€ŸÐ…uß5mdí®=Â:e Ö)WÃ:E¶$GźIðÛX°NA 딡6Lu£Nš' ¬Sö°NwTš\„uv’lï—¼JµþB4­ ¢i}¢-ÏáÇC´õ®%D£wí¢RAãL­‚ƲëLQAu¹ÑL­‚ÆMm4“Nš'ª Él܉hÐQAs¢1hXZ‰§²uÙG¥½pK€ Ë6V:ôº¾%ÎÖ 2œ%ÎQðÛX\ßÖ 2œUÔFQ1é¤y¢‚ŒÌƮ¹>gW¾£í/çßX¯5§´ÁiO¶˜RÛG›~½ñÉEŒ În+™¸3[»¿jйà¼Pl4„¼ˆÕ/ïÕÈxäöýüfÐûùÌæŸóKø—þn*›Î[¼7ç¦m´7éh4„Î ¤Í?çUeóÏ ÿO Hºù7éx4„ÇnÜüs¾£‚æ¢^,íÖ˜ßaÅî‰è ¸e„kÍéîËhÑ·Ñ­˜CVkoP^DpÛ(1dìµa•Õ ôù¤iûÖ­Íc©á"èŒr½ H^Ô*<Ý:ð¢¨@Š:€Ç€ÜÆåzQ«@òBPEÒ¤“æ‰*27F¹^tT  ”—u*=¤g1ƒY¤öEk~mÅ«¬Ë½¢H-WµZOÎ^µ”Ç[+ÙvÅX%žÒÂn×*qcí´cý}àKÇþ¡Ù_~mši$<ïuÎÞïuþ¶ée^Çàîï¾á ‡öõfe”Ú¥íY3Fc•s~LTì}Ï'ÄY[všøž÷ûø¦>¾©¾,šl ¢à›FÀc@nc –CoêM…‚o:é¤y"¾ifãÆ`9ˆsø¦,„d06šK2ÎRa5—lÛicÀŽ£¬UkœÍÖ z‡µ¤ž‚EÐéúAúe5úe Y¤ úeÔ<ä6fײF¿ ÒPýrÒIóDôËÌÆ®¯Î¡_²\ÿ¢>¬—«=ëdÖ¹sÞŸ·u‚èöÞµg£>œÈ ?©œÐåàéªÂ¬Sy øœy è}jñ´¾}ñÌ9dÌcñíàòÄ_&ö®)ÂÚeRƒÏÏ?ÈöÝþ ÛÇÞK?Èœ,F;wøÐïöµ[£ö zïõ ŽYPëשO4ðvs¿æl Èm,·«õkNRE¿æI'ÍõkÎlÜx»«ÙfÇö|ÛhÓ~–9„Ö¶7¿©Öˆ B.xþÄýï”ð:Džö3øDpÔa¥Ïx› ά;³ø7ب»áäß9´ò¦ ÛüŒ_çÎ5y`†·kÐô z)”án¤PB¾¡‰…œLMf-gía†¸«†Ÿ"ëêësÁ‰)éñS°Á~ý·ÿ &¦÷ø#r§Ó¹•å­ß¡•Иã5*¯AŠ9^“‡ÐIðÛH!´ªÂñ¤žØP”ãuâ2 zp‹iê^œØ"Øank3DïrA¯›YOÜÌVš!Á«$.àh3Ĥx Èm,nf+Í©%6,m†uÒ<r3û͇[ð:ô´öQó/àfŒð‘Õ‚Ó!øØ-‘â}½«)ÄðD­Ýü$ô:¸wÄÁ}…]¥DÄùeW%Àc@ncqp_aW R 6º@ˆÅ*ԈŊ¦lU(ˆÅQðÛX°.ÔˆÅ*ÐÔs(ˆÅ“Nš'"g6nÄ:-N"s°Ž‘ÛèOÍ¡1p²!§íŒj±² ­È®¢%a$jYc$Ž5éè1Ö²`$FÀc@ncv-kŒD-5µQ0'4OÄHÌlÜé*ê$F"ÇU=“õ°ý ­–­øßrÁ³ûZ/¯ôw¨ì_híðö‚ž²ph bÒÑhHûÃË©²¡µ¢Ý¿˜t<Âc7î_hó8²d=Äœ”F»/>${Ÿq"®cSlœîáíc°Í[]Û°s³@›…  Àä‚§¡4†¨{;H-ñ| ÇÞF†Ð¹Z rìí •Ô=ö6êx4„Çî„8‰Èi*ø¥õ®Û¨·áD~FæAyaˆµµ§íÚïpJä.‚ÞÐÕRŸv5RŸ¦Ù&í R_Ô<ä6–ÐÕÕH}Ú j£ õM:ižˆÔ—Ù¸3tu'‘úÎ赸«ƒ'ϲqlÅUàÀɳìË÷i·v¢œZŒ-‚ó}ƒ!ô´N™&|Á3±¸0(¢5¢¦Y  bÔ<ä6 5¢ö$›5 (ù™€¸Ž¯ã^ '/êâø!5® ºÑ)¬DÇ`rÁ³Ñ¼‘˜èhdèh$!:Y'†Ð¹ÍQ#:AˆŽ£€Dó“ŽGCxlàÆhÞÈ“ˆŽœþ†Íc¹Xm®ª‰ãtvi߃‚½Xä9¬ NUÁ®•€‘k/F#sAç[Ø(Bò3ºFò3šüŒ.H~QðÛ˜ßÂFÕH~F’ß( oáI'M‘ü27¾…>‰ä×tëcWú-Üûv4zm¬ NŒÝCèù¸ p:¢{|KÆB×îÑ#\1„*fL*f€PÅ T±¨x Èm,¸bjT1cUlP\13Ul_ǽ¸'QÅ8¸Â9!¨d<¶uÛè@Ðà*ôXž‚WGìEôÈïÑSëëðúÃúÚúà ²<˜rŠx 1êh4„Î Ìëkkë Ä€…bý1êx4„Çî\¸“HxŒÐÊ6×Í(ùàŽ±‡¶j+“söyÛ𠌘¸–p+‡q¢,‚ç‘Í·žÆña±d4¿k>ŒíÍ›ÐüñÚûã-“ðI]ãµ>ÕÓæ –¹ÔH!_ZŸlØ1Íï´›kõ¶,Q ĺLÔ*<‹è 1¢ƒ®!:‚裀 ú¤£Ñ:7t ÑADÑ'†ðØÀˆ¦Ñ/ÚPÚ "3ð”C»`Õc1:ÆÜYà &㜻\йF \_€×€ìŽŒ²F‹:€Ç€ÜƼF¨q} µQp}'4OÄõÍlܸF€÷b<¸À““n§19d¦C©œ± OÍëÙ˜£È•s¥¯»k³n÷:朣xaÖw:„\Ћ·ŽÆÁÕãàa|P¼u3a<r Þºaœ¦6 Âø¤“æ‰ã™;ñÖwƯÂÛCÕn¬ d>{ôXz‡×ÜD¡²PôØ€;ŠT.â<ÁÊîF½µÿŸ&ô¢^ ~!ÔýB »£€¢^X`. F¿‹õB­Ñ/Em~a…¹€ýf6nD=+l»õXí|‡)L™ßᬇ¤úŽ>ÿ »vùS>ä‚NïµkßþYPkëk%ÙcÄ{£à1 ·1{¯•µ¶¾VJj£hë;é¤y¢¶¾™;½Wvø¯ò^NO´öÙçEÒû¢¢|é›mÿõ¼É­ÊZ#A/hR5`u­jÀjR5`uQ5u¹ t­jÀjAmU“Nš'ªÈl܉º£jà*,8´áïýë—‹‹ìöÝ·vî§÷¸¿=뎶˜ú"w½XÎo»lמˆFB.èÅP UjU–æÃ-UQðÛX0jUÖ¼þ( j檇u |÷b(tT=\…¡‡6W¾C¯ à6PsìIÛNó÷iGœ*7V5:£Må±o¿c…Øx'Þ®ÇzŽLЋ·ëù³@Öð–æÃmʇçx9ér ÞÚPÃ[Kòú£€âí¨繌¯ã^¼ue+Wá-§Ôå#èƒíq²òçGœOSä²6êíë:töŸªÚ~c~½ÁÖæ‘c{&èE0O*tl¨UèXšÛ¶¡¨Ð‰:€Ç€ÜÆ‚`¾V¡3Ü bÃ:“Nš8ªÐÉl܉`¡£Bç*ce_0÷ÛI[ÑÑ×ΉZÛ\ð,EÒ­ç–¤¿‡ Ert?Ä`tSz±'†Ð¹D‘tÂU(’N=£€P$'†ðØÀI';ªhþqêݯJÐ7Û߾ؾ ýõþáËý¶vTÑleý«ÈnuÝ‚öcÇ9”åØ*ŒôóTèúœ‡¸=ëvj¶Ý"§q‹;I¼nm"j”Êç•“†êv€ÜîÊÞöÈæ½Ò½=éÈ­¦lmíÞ<ÝzÎ,ð•ÐÙÑÍ$§‹ÆíQðÛ˜Cg§jÛ"›b£€„ΓNš'jÜžÙ¸1tvú¤ ƒæëóà6Wºõ\r°ÕŽòظ»ÌhãeÓk7èßœÔmå‰ícO%Úq†ÎFvü¢ãÂfRµYœ8qÉ­M† ¹ Î ©Wq¦V¯âè¾–3E½JÔ<ä687µzg µQÔ«L:iž¨^%³q'œÃIõ*8ç?óz™väÓnÆÜ>Ešž–+ÝŽ·¶à$ÈOg&Ö£uÒßm-3aI·.7m|à䨣Ñ:70g&Ò—HfÂjj@™‰QÇ£!<6pgfÂSËÀaènëĨµºŠw,«f£‡é޲ÿ#(Èüžv(w'hcQÌhõvñqz½ëóµS²Žñ€ÛWþà<)p¾VþàèÖŠóEùCÔ<ä6– Å×ÊœWÔFQþ0é¤y¢ò‡ÌÆAKx mÇå±kЗ>”aß~‡[û÷ÆósA§gxAJ ¼¨•xAJ ¼(J ¢à1 ·1{†µÒ/$µQ”L:iž¨´ ³q£gxqNiË3á¼iŸ’ÃÉÎoØ«x¿ûœÈ¯ýtÕ´&^½N¤'ß«'ßÓô£W'?êr‹©'ß+AmœüI'Íqò3w:‘:‡“Ïq"Vu]3‰ÇÉdq¢à ;í—"MÈÛoeãdÙ;ߟ^e ôM.èu}C¨äÞԨ䞦ª¼)¨äQðÛX\ßÔ¨ä^“”Û( ®¯g*ù:¾Ž{]ßœC%g¹>£4C%ß³qÌ©Î圑ºcÇša˜Õœc§ý«Eök‡] zñÃj´·5j´·„ímAŽ:€Ç€ÜÆ‚P£F{ ÔèQ@ñfjô:¾Ž{ñÞCfáƒXû1Þë3kûX!ôúŒ#dÜáñ¬ù Í´x_q£à1 ·±øŒ«‘q½#£Q@}ÆÍdÜu |÷úŒ?‡ŒËòNùc v#5ÚøûW³¬¬úa!­_»Æ; zÝ+®ñ>Ժƚ® ¢èu¹Å½B­k¼4튮ñ“Nš'êŸÙ¸Ñ½‚8‡ïÊr/NµÎUµÍý<Ô=Û?…à(7 bm¯î].èt³ /.È/.ЄNP/.êr³›YãÅIS£€¸Ù¤“æ‰xq™;ÝLËc¹£¤ä27ãôL:¶Ï;£4—µ¼m™t;¸Zö µD‚^ׄ)t)hÚ&è‚)u¹ÅÁu)´¡6 ¦Ô¤“托R™;ܜÔâ8x›ªý+]Ú­NdÚ­ù=¿aƒ0¹Œñ£'ìàÜ¥ øÐ¨½ò8yöåY» "LÙÑlgxh–}u3ÑãAïÛHŸâµ>Å&í}Š£à1 ·±¼= Ö§8€¦6Š>Å“Nš'êSœÙ¸óía¯æöq(+š“¿*plScú©üžÈ!ùÚ$ƒFí·Ô¯™/ìJÇ "ôb›#t¼àjt¼@“«Át¼¨x Èm,Øæjt¼àµQÐñ&4ODÇËl܉mþ1Ým¬Ó0îǶCëˆX9ý·vú³—ëJWæ‚^„DBDh67„‚Du¹ÅŸCDÍJ‡‚D8é¤y"afãN/D"lûó¡§-ìÏ¿5CüZ_Xió&ôùµfüzTxƒ§'öë¤x Èm$¿^ã Ôå5F4Ϝט۸ϯ‡Y¼¯±í×,ÆãU~ÍÈmq:uÜÓø0–Y zýYKâϺBV¤†øš¦dŤx Èm,þ¬+dE-T 6%+F4OüY¿Yq˜Åë7üùPãÁþÜ.®m{-'È9µí#çë»E¯ôErÁ“EÉZÀ{¤¿Ë²(yâšáI€‹’£ŽFCèÜ@,JÖ„²(yzbÀxR”u<Âc÷%³8‰ÑÈ€VuÃ)¯:WœÕ9‹³GÍiüÝOÁ>ød„‹Nì<¤#Ýýt¢C‰Ǿ 6’Ó»£}…ÚZ­}vä‚ÞÕ¡º µw*=:JíM:€Ç€ÜÆ¡Ú µw:bÃRjoÔI÷(Bµ/@í.ü$joóåñG˜·s¹´‹d¹Ç{;œ¶Tt+ 8ø\ÐëˆÞGô°$Ý: ¨#9{žÈ½'Žè+$àAj‰ OIÀQ'ÍÓ!Gô/@nÁI$`Ž#2·8 UÆ–Æ_e­9cFO}V–ùQ¼Ð a¡”LÅj«àÙÕž­ö¤ð•Õž”/Æä”ÃE ¶IG£!tn ­ö¤°•Õž@  «½IÇ£!<6pãjOÊ“XÌœ£åÚ­ÚÎÒN©¶Wˆœy®ª:å4Îj¯¯º;œ](N³(˜Ý“îòn2F7ä‚§ñOYŒÊÕðOOSÎCب£Ñ:70㟂þ)C ˜ÿF†ðØÀø§O"y3ê ÷´£ïßÂÝ ”Ü~(f;Ás,ÞžrÜ]/è…ª¢¦Œ÷"x ` 0•6œƒ”$¤¥¡m8£ŽFCèÜÀŒ¦Ò†sjj€¶áŒ: á±;1N¢ê2ŠÛIÊb=ÂaŠqV*vö½ aåv$èÌH‹Iœƒ Bâ¤$&-%q&Àc@ncÎH[!qREmPgÔIóÌIœ¹3Ò‰‹ŸúcSuín÷¬· #êÝxwÒΆ±cò‚ ¡÷å¥[©¡Ñ[Ü.j¨–^”ðjè %9>é)54ér Jø 5tJjƒRC£Nš§B(á_€:Ìâ$j(%8íâOÞôûHž¸3£?¼¤×Œ¾Éž¨!s*Q#s*AÈœJdΨx ÈmÌž¨DÌ©„ 6 2礓æ‰Èœ™=Q‰“Èœ Od5˜ÿP‘ío]+(±A“›í#‚*Eˆ JÕˆ J"¨R4êr ¨TIB äL]ÇÀ×q/¨“ˆ ,¸½kå!å óTï“ÃVÞ¬¿‡è±'‹¼Æ*Î>ç¬*AýÉ~RS¸ü¤³ÕB¨0Jä‚^Ì6‚`¶©t ¤šà©¡B“à1 ·±`¶®t ¤žØÐ´ShÔ‰óÔa¶yN¡Ã,NâÕr0›5ÍsYÜU÷ö³_§cÊÁ4ÐC»Ÿ´ï,«?ò¦»1Ô,4#!ôb(z©²5z©¢ùde ziÔ<ä6 …½TɋС0ÓK×1ðuÜ‹¡ö$z)C;¼{/d4ªb ô[«ìñv!Vh©sA¯Ç;ÂcU®ÆcU47¬|Ác:€Ç€ÜÆâñ®ÆcUŽä¸Gõx7óX×1ðuÜëñþ$+Çã9Íl9ÇõË}à¼Á9̵_q*\ù•Ǫ}.Aáû·ïßžô*Žðý#…_6¸ ÉS|ÍQ”ú$ä¸úW?uµ:®b][ãÓ­Êug:^¨²"ÕŸÓwRö!óÙ|º?·ìèG‰‚ÚܾKWZ&@샥½¡ï³6³Û–˜žÔ6Yµí"•ËíÑšßI¯I¹ëÒÝúÜs8'†È0ÞŒ¯ä0õùÚkˆ/«Ñ‡nðýû÷oÿz€p! endstream endobj 1226 0 obj 9338 endobj 1230 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 778.250000 146.250000 785 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn42 >> endobj 1231 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 771.500000 187.500000 778.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn43 >> endobj 1232 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 764 185.250000 770.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn44 >> endobj 1233 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 757.250000 140.250000 764 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn45 >> endobj 1234 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 749.750000 108 756.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn46 >> endobj 1235 0 obj << /Type /Annot /Subtype /Link /Rect [31.5000000 737 121.500000 743.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Mzscheme >> endobj 1236 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 723.500000 139.500000 730.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23MzScheme_nn2 >> endobj 1237 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 716.750000 114 723.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23MzScheme_simple >> endobj 1238 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 709.250000 134.250000 716 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23MzScheme_external_docs >> endobj 1239 0 obj << /Type /Annot /Subtype /Link /Rect [31.5000000 696.500000 88.5000000 703.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml >> endobj 1240 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 683 105.750000 689.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn2 >> endobj 1241 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 676.250000 143.250000 683 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn3 >> endobj 1242 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 668.750000 154.500000 675.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn4 >> endobj 1243 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 662 156 668.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn5 >> endobj 1244 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 654.500000 153 661.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn6 >> endobj 1245 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 647.750000 225.750000 654.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn7 >> endobj 1246 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 640.250000 156 647 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn8 >> endobj 1247 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 633.500000 163.500000 640.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn9 >> endobj 1248 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 626 122.250000 632.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn10 >> endobj 1249 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 619.250000 193.500000 626 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn11 >> endobj 1250 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 611.750000 120.750000 618.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn12 >> endobj 1251 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 605 219 611.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn13 >> endobj 1252 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 597.500000 220.500000 604.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn14 >> endobj 1253 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 590.750000 177 597.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn15 >> endobj 1254 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 583.250000 274.500000 590 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn16 >> endobj 1255 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 576.500000 137.250000 583.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn17 >> endobj 1256 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 569 216.750000 575.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn18 >> endobj 1257 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 562.250000 188.250000 569 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn19 >> endobj 1258 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 554.750000 195.750000 561.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn20 >> endobj 1259 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 548 178.500000 554.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn21 >> endobj 1260 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 540.500000 147 547.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn22 >> endobj 1261 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 533.750000 189.750000 540.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn23 >> endobj 1262 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 526.250000 212.250000 533 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn24 >> endobj 1263 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 519.500000 200.250000 526.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn25 >> endobj 1264 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 512 200.250000 518.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn26 >> endobj 1265 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 505.250000 297 512 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn27 >> endobj 1266 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 497.750000 184.500000 504.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn28 >> endobj 1267 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 491 188.250000 497.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn29 >> endobj 1268 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 483.500000 197.250000 490.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn30 >> endobj 1269 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 476.750000 132.750000 483.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn31 >> endobj 1270 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 469.250000 137.250000 476 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn32 >> endobj 1271 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 462.500000 148.500000 469.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn33 >> endobj 1272 0 obj << /Type /Annot /Subtype /Link /Rect [31.5000000 449 161.250000 455.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending >> endobj 1273 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 436.250000 102.750000 443 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn2 >> endobj 1274 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 428.750000 106.500000 435.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn3 >> endobj 1275 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 422 112.500000 428.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn4 >> endobj 1276 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 414.500000 115.500000 421.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn5 >> endobj 1277 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 407.750000 141.750000 414.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn6 >> endobj 1278 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 400.250000 123.750000 407 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn7 >> endobj 1279 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 393.500000 135.750000 400.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn8 >> endobj 1280 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 386 161.250000 392.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn9 >> endobj 1281 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 379.250000 142.500000 386 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn10 >> endobj 1282 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 371.750000 163.500000 378.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn11 >> endobj 1283 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 365 148.500000 371.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn12 >> endobj 1284 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 357.500000 144.750000 364.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn13 >> endobj 1285 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 350.750000 137.250000 357.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn14 >> endobj 1286 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 343.250000 122.250000 350 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn15 >> endobj 1287 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 336.500000 123.750000 343.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn16 >> endobj 1288 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 329 115.500000 335.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn17 >> endobj 1289 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 322.250000 157.500000 329 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn18 >> endobj 1290 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 314.750000 185.250000 321.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn19 >> endobj 1291 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 308 111 314.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn20 >> endobj 1292 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 300.500000 179.250000 307.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn21 >> endobj 1293 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 293.750000 132 300.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn22 >> endobj 1294 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 286.250000 105.750000 293 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn23 >> endobj 1295 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 279.500000 167.250000 286.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn24 >> endobj 1296 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 272 150.750000 278.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn25 >> endobj 1297 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 265.250000 131.250000 272 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn26 >> endobj 1298 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 257.750000 167.250000 264.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn27 >> endobj 1299 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 251 123.750000 257.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn28 >> endobj 1300 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 243.500000 147 250.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn29 >> endobj 1301 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 236.750000 102.750000 243.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn30 >> endobj 1302 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 229.250000 147.750000 236 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn31 >> endobj 1303 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 222.500000 150.750000 229.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn32 >> endobj 1304 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 215 137.250000 221.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_starting_out >> endobj 1305 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 208.250000 166.500000 215 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn34 >> endobj 1306 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 200.750000 192.750000 207.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn35 >> endobj 1307 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 194 186 200.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn36 >> endobj 1308 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 186.500000 194.250000 193.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn37 >> endobj 1309 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 179.750000 177 186.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn38 >> endobj 1310 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 172.250000 154.500000 179 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_configuration_files >> endobj 1311 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 165.500000 150.750000 172.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn40 >> endobj 1312 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 158 164.250000 164.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn41 >> endobj 1313 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 151.250000 150 158 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn42 >> endobj 1314 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 143.750000 223.500000 150.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_test_suite >> endobj 1315 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 137 201 143.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_running_test_suite >> endobj 1316 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 129.500000 150.750000 136.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn43 >> endobj 1317 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 122.750000 171.750000 129.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_coding_style_guidelines >> endobj 1318 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 115.250000 171 122 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_language_status >> endobj 1319 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 108.500000 187.500000 115.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_supported_status >> endobj 1320 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 101 195 107.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_experimental_status >> endobj 1321 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 94.2500000 303.750000 101 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_prerequisites >> endobj 1322 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 86.7500000 126 93.5000000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_debugging_options >> endobj 1323 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 80 144 86.7500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn46 >> endobj 1324 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 72.5000000 162.750000 79.2500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_further_info >> endobj 1229 0 obj << /Type /Page /Parent 2 0 R /Contents 1325 0 R /Resources 1327 0 R /Annots 1328 0 R /MediaBox [0 0 595 842] >> endobj 1327 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 1328 0 obj [ 1230 0 R 1231 0 R 1232 0 R 1233 0 R 1234 0 R 1235 0 R 1236 0 R 1237 0 R 1238 0 R 1239 0 R 1240 0 R 1241 0 R 1242 0 R 1243 0 R 1244 0 R 1245 0 R 1246 0 R 1247 0 R 1248 0 R 1249 0 R 1250 0 R 1251 0 R 1252 0 R 1253 0 R 1254 0 R 1255 0 R 1256 0 R 1257 0 R 1258 0 R 1259 0 R 1260 0 R 1261 0 R 1262 0 R 1263 0 R 1264 0 R 1265 0 R 1266 0 R 1267 0 R 1268 0 R 1269 0 R 1270 0 R 1271 0 R 1272 0 R 1273 0 R 1274 0 R 1275 0 R 1276 0 R 1277 0 R 1278 0 R 1279 0 R 1280 0 R 1281 0 R 1282 0 R 1283 0 R 1284 0 R 1285 0 R 1286 0 R 1287 0 R 1288 0 R 1289 0 R 1290 0 R 1291 0 R 1292 0 R 1293 0 R 1294 0 R 1295 0 R 1296 0 R 1297 0 R 1298 0 R 1299 0 R 1300 0 R 1301 0 R 1302 0 R 1303 0 R 1304 0 R 1305 0 R 1306 0 R 1307 0 R 1308 0 R 1309 0 R 1310 0 R 1311 0 R 1312 0 R 1313 0 R 1314 0 R 1315 0 R 1316 0 R 1317 0 R 1318 0 R 1319 0 R 1320 0 R 1321 0 R 1322 0 R 1323 0 R 1324 0 R ] endobj 1325 0 obj << /Length 1326 0 R /Filter /FlateDecode >> stream xœí]K$¹q¾÷¯¨³€íå+ø š>ì>>+É‚ <ÒÁßùNF$#‹•êžÑ@;ÓÑQ fã#ü"øã¿ýüß·ÿùçíÇŸ~þßÛ¯Ãß?ýü¢^¨þ·öϹÀÄ×áß·áöëo/_o__¾¼|iþûõ¥ÿÀÏ?ýGó¯ÿ»™Û¿7ÿÿëíÿÕÿ8(µ ¿½š¿ÿÖý‚nþ¥¦¿[ù_^þów·¿·-Žæ†ÎàŸÐÚƒi{qÇò×—ñ)u÷矿þýåÇþù71Ö*wÓÎ6ÿIÎÜþñ§—?7Í·ÔÉ«ûo™éx3`LÓu§›^dWŸm×\d·"'¾dí ,í~ ½þÚuWÛî÷ß&{Q…›¶±û‡ÖÔ7‚0Ø¿¾hë_µN&ÆIpÛh?Ð L÷±ù¼¦6t÷ÔvÐ)Ô~Ž_”øyþvš?د{  _W>øá——?§[ó¿ü¹ùUÿ¦»¿~iÞ]óÂh{‘n¿üñö/Jõ¯·_þúÒt=)o ûb†ß÷ý±û{u¶‡Öù3¿|æ#÷õûÛýF«Wtl~9Ƴ­õÏÓ¼~çÛd¿ ìg×eØÏ|ê~¯ÖD]û<‰}o¼¶×Ú±¿‰ì;¼Ý¿ëO¿4Î>×’ 7£®tF.l5ä‚¿OP O`ÑÁwiÍØòð³íýÚûÁ%{)Ü•‚1Íl‡m4Œiuú~Nmàç¸6üÉ“$ÿýÓ®Á~?Æï~O†½ÕõÓ@½Ë¬Ý½‚{Ÿ­Žˆ„0ú‘I1<¼€ /`“*-`ÛÕ"Z_6º€mu,jÂæÆlŒ¥l Ä@#  ØV'¢&"6på6Á!¾Éû™å×CÇ.X,8à›_®%± vmÃ/Ì-¿d¯uÁ~ üäÚæ‚ÇבYíÀrvzÈÏwÖ®¥‡L‚×lØ‘e[slȈíÁJD@qãHb0kÇZ.45ìôbÍKáýP³]b¿°a¾ÓîÕh²fe?cùù›Ý’Ý.möoCô¯Â—n툞b&Æ¥\ðèdæOfΗ&3çÉdÖ ÈdÖéXÔ„Í “™ƒÒdæ€Lf­€LfNDMDlàÂÉÌùŠÉLp‚'Y4ªl¼_4òÈÂ;¿q¾<³o¯õ‡úe*ßÙÅZ—ï û=­ÄÓAÁÜ/ ÛVÎÏ«‚äsÁÃP"†²JPÖà Fš¨PÖêXÔ„Í ŒPÖì( PÖl9±àPÖêDÔDÄ®„²è޲OŸáW¼³²çjÚ²½Þ÷ŒŒSº_YÑñµNarRsÁÃNšvÒ NÚöùô^—ûY§cQ670:iò%'M„¯Ð ¨“¶:5± ”=ÄIùÖVd礋á¾3éG0ýKNVÎQøEË":ÀÐóDCieÚßw%Ç?zØ‚5 Ü„5Ñæ‚ƒÃ01rVÂ,yì{˜ é4Ëz¼lÛþšÝáW“ẹcf.h¯sÁ£sxó¼A¨CB<ÍŸÙíÔÊ~BgZ„|ÄñêÈP^Où Öú\P Ƹ0P‚ ˆ+›°€ 3áÃÜä6&¸0¶m!¶apa&|˜ÚÀÏq-\LgÝ×Ã…$v´Â8ÖUDWžòÄâ”Ñ‚€Ú³d†TƒÂ|>m{çÈϧk@Á‘TïJ)¨Þ‘ÔV@AÁ)¨YÛ˜@Á•RP½ÓÔÆ"µÓú‰RP3W‚‚«HA= ãß»†Xœ¡ž4¥/™’¼'JNWßÀœŠj‘  ¼!Xàm <?íÂ`Ø—;Àm@nc¯KXൡXÐê ýÔ ¼y,ðy§gadâ~âýÄÉ*ÛÖü“ ˜ã<'Trr¾‚iõé-ûfïï³ÉzgûØ•Ä5¾’½omnÑ0Ãø97µ£M‚ã’‹ZCMy\NÅÒ«¥§b¶62Gë·0‹ç|ä$ËGœƒëc)×G’ƒëã"·Ó±¨ ›N²|,åàú@rp[9Éêt"j"bžd5_ü1“« ðvÖNz–øLQHŠv‰é(™Xêyš¢4ÿþKgñdžøü‘•åÑ7’$[yéc$!Џ-13(’˜T)13Ð#ˆ ‰™½à6 ·1mKR)1Ó'z”’‰™Nÿ  %ff6.Ü–U‘˜¹+rî|yÚ *}Hj¬0Î%›ý+ð7 j" Y¯rA-ÖèD°Æ¨ÖÐó‹0œ_äXÓénr#Ö XÓÖáÄ6t XÓé ktz¬1¹9ga`eÇókW¶{¶é¶ ë`æLP¹àíIO Öß ùó?½|8}ÔãºQã*Ò .5ûÎj§4ÁÑù"/‰©ì|Î/¯£rÙîâ¾w›®ÞWp«Ç9 jç0dƒXšÃhˆ= !ö|êt·¹i_šÃ€´:‡µ:C?=šÃ <ÃæâÌ EtÎÏ# ެI—çt'5?3UÏOjÁ]?©Åƒ˜Ÿ»£Ó¡ßfá.áuÄv.ǃ‡äD]rÔ³ïæTB¸?؆ùUúë¹·)<÷ö¤û+ß¿³ñ™Ù’\jÉ¥ž‚LÇsÎm«'ø0QSÛ«û2Áã~¯§¦¦ôDÔT‰ß BU|.Ó–¸€’¸²i¾üîx¸=ÀÊ;l´%U`7ä¼ã¬·”¦£q×õM‚G¡È5z55ۧ鵿I(…ëÞûd±vŃ$u&Þoܾñ”‰$ë æ‚ÇÀ\N’múðD$Y ìJtyoעЖ:o ò®¦Úóô†j|±Šà‹U{á‹S×ã‹{"Rœ_“OzFözýzÿ4:û;A-úf·ß»‚ ïî몆X7—Oµ6È£·Ãß{ù"%Ù®l¾a$à®,å_KE¶všß^B3æ‰=¶PËÙÏNù'b?K*Vòûp¥}ãÏ›{X=ßù‰ñëtÈ{j¸œñëT|"ƯÄSÙÛØß¿§îºzx×>3ºpÈûpºœ.ì´z"º°Ä‡Ù¾½{~š…ë7†ZÍüá¶Êî,¨c?:­#b?6‚´d?:mðµw³Àm@nc`?6‚°d?6ROlhOؽÎÐϱs×±›WðD|gÉÚ¿þdŽ»pa[œñ¬‚›¨†Í×8qŠMˆ¹àÁ«uÜ8¾‡«uÜ8¸ÑÕ:®ÒùÍ7_­ÓëXÔ„Í ôWë¸ÑÃnøÃbÈÕ:½NDMDlຫuš§?†f¼3…€ª öФN¶¤@• Êõe[{x²ï¬èrÎÇ Î±÷ñ¹¶pB‚Ú©<™Ê!”¦rHdš…´˜Ê;Àm@ncšÊJS98jÃ-¦òVgè' ©|¶qåTîácŸU×x…Nxîµ({m‡ê±ôêZÕË ?1›­Ñ¹àñ#¨ÈMŸÝØNcX[fÇ6Jì®é·|´÷6I¥o€íÛ0Ke8>±¿aO•øÖ ûþÜM¤Ó𪒠…ÌïPKüW¶+oôÃöçÑ<‘ø#ûÞÌößð}ЯPÐkåIùçá¿SÞ´à[ðÛZ¢‘È~ +íï`‹™ÈÒ|@.xteæk…†ŸCae ¾:´ T§cQ670l ŒÂª¾Žn :ˆšˆØÀ…(cï/oV@{ß4°ïYRì6©ró`ì´”Ð)傇n¾égøÙ—ÎEâ..®Õ±¨ ›ι’Ã5~bÀ.®Õ‰¨‰ˆ \épp?ÏKäp’ü+Ë®Q$Û\ÁgŒÄáx/ÚPw@rSí¦}¼™ëgsÁî8ß>4ü %WôxŠ Wô£óMMØÜÀèŠÍ~¤àŠÍΘ0 Wô£óMMDlàJW ÷7ãWÕ½?é¦XÃnÍVr"É+ÐÂûdýLú@€®Ö}ÔÚÓ±M‚‡Ýw¾cgøÙ•Ü7zâ]Ñ/Ü·Õ±¨ ›Ý7š’û6ÿ%ôÂ}[ˆšˆØÀ•îïg'‰Ü÷ØÒúÎæE§Ü'…â÷+®„ï·MºiJ˜11uTÏ­ÂU¯A¡êu#Åz: ž÷:€Û€ÜÆ<·ªPõº‘*jƒV½îu†~æU¯sÏ­ºŸà³¯‹î»#Ýw¼rþ-Ø«n8x¨@×^Qn«&Šx38sA­kÎ7ÒŒSrMCΜ¬q ×ìt·¹É5*¹¦&gg­€ºf«3ôS!לm\éšæ>¥ý4×Üuï*º½ì ‡0SpԀ˵1_ñ0 tÉ!œ%ƒµ ™àÝénr“CØTr‰ ÑêôýœÚÀÏq­C¸ûÌñ³B²ƒ<Ú!vÍuÅ—vª ×|ÓùÊÄ jo¾ëaxUrgNXWeÔzF"œ0—Jœ0Gcp.-8a½à6 ·1yF*qÂ\¢±Ä´à„u:C?',³q¥g¤ƒ8ag%M|Ì|ôØJÜ8ìSš‡½Ë•Ã4á[.ñ­€{@/øV½à6 ·1{Ð%¾(´jdØw:C?ß*³qá°}ßê¤͇Ä7äã<^¿Ü0—«êy¾“ vp[Â[âNo€]p§zÀm@ncܦÄCâ4­€n3r§æ6ðs\;¸íAÜ©ë/ý\ÖÍoäv¥à¯ôMP¥îiâ¨O}0WײÎå‚Ztp„àP"x‚À‚àÕënr:¸Á !xµŠn$xÍmàç¸à ‚×Iaž•h©„Du–ŸízYÐ ÖìrUãÅ뎚NÎ s¿• ÌuÆÚãLP‹²žÝÀ—Èn@£Ad·^pÛ˜PÖ—ÈnàIT«P”õ#Ùmn?ǵ("»tß²–ýÙ–qa®çit.xôtæŠÜÃϱpº‰Ôó„´¨çÙéXÔ„Í §;KõWÏlûâ–a§a -be_$™óÞ[‚×&Ê×cÀŸ †#ƒ‹ÍyS*6ç )6çÍ¢Ø\§cQ670‘)›óÆR‹bsNDMDlàJ8²q<Ń/¾]ÁAºTYØÛ/º—ÎXë;6«çsAeðÄÏeâG‚'ž†ý>΂½à6 ·1O¼³…à‰w†Ú04xÒé ý´yð$³qaðă:ÙQ¾!ºßkÉVnAÇ“ä3\5_Éպꚪá_=Ä• jÌ¡÷%¡§¡Yï„Ã^p̗ۘ‡ÞkjcA8ìt†~"ÂafãJów½¦ê—õ€r÷€ú±«&ž¿ÆôàùaâÎXãsA­çGB¨ô±D¨ô‘*}\*{Àm@ncòüX"Tú¨¨¡²Óú‰•™+=?D¨<éÞ¬ë<_¾C>€ÒæãÌ× .TzUP„¯T‰¯ákµàkö:€Û€ÜÆèUA•øš>¾f+ ^•F¾æÜ~ŽK½*¨ƒøš¯’T%:Ö«$¹Â’5ïYçM’ˆc!ÙtIò¦6l ¶*j¾Ó%è\P‹S†Poƒ)Qoƒ!ÔÛ`ÔÛ^pÛ˜pJ—¨·Í^™ØÐ êm§Ó÷S#êmfãJœ2Qo%8%)òÁžÌ/ÎÒWŽÝùY~A²×F8˜¹œ @.¨uKئÁ•ئ†Ù‚[°M{Àm@ncr[b›KÂ…­€:„Ù¦sø9®uwÛTâÚÉÀi*dàKÎz$üÉêüܾbgÃõœDóàæzÚç‚GOÀL³ìðs*œ€Oîp]Ü bu:5asà X€P8 @n¡hä¬Ó‰¨‰ˆ \xü1¬Hþ3gUèݹ°æ®LömçÈÁÏõlRÌ{QÀ´ÌJ´Ì -3Ä-³Ó±¨ ›½(”h™!Zf+ ^ZæÜDÄ®ô¢x -“?ê²’=OxÙu×õ\KÉrZ²“æÏÖxF ?øw yÒg¹ØºåâLl`g[¿H¿Jþ½…´(ð×ënrÓ6!• ü…DcˆiQà¯Óú‰ üe6.Ü&Duöŧ<¤í|ãû·w• áöл¨úÝATY¡¿ *=>jRè/êR¡¿H£XQ/ ýõ:€Û€ÜÆèñQ— ýEm©E¡¿Ngè'*ô—Ù¸ÒãÍA7¯îëñ‚³s ûGDú¿|I´âÏ÷ð©ÚkÍÌÌK*Ôz­%̼hK̼HCmÑ.˜y½à6 ·1y­-1ó¢5ÔÆ‚™×é ýDÌ¼ÌÆ•^ëÔðZɹ÷YE'NKÙâÊtèK bA±šËÉ ¢‹F¿_[Zb?±œM¹ ˆ!;ÆP";6Ý' dÇ^pÛ˜€8”ÈŽ1(jcAvìt†~"²cfãJ ÇwbI<“¿FއËx™ý$ÁÞ¿%k=ÁóÊg$ûÊ]²J$ߺ$&þ-Ü’ÃDŠqFç‚ZÜM„S‰i(;¦¶×Üä6&ÜM%:lŒ$$ß (îÆ‘;·ŸãZÜMÇÐawÆ]ßæiΑ¶–¼ZÒSÞí±’å/a@ð¬§]+cnH:^ÖO°EüÝ9M”$çl.¨Dä¤ ñ7éñ7Ñ£†¤Äß^pÛ9©ñ7)rdÒ "w:}?"þf6.Dä¤!þîŒÈ‚Â%+%ù|Z?ìG?~¶¡Ú¥äÕïëн°íqnZzIϵ„“ϵ¨g»;Ù»;Ñ£šdìî^pÛ˜PÏ”ØÝÉ#§V@QÏŒìî¹ ü×¢ž=†Ý½3êIîqûˆ=-+z;ÇßHìL'·>Ôb#u“+UÔMô@&Á¢¢n¯¸ ÈmLXãJu“#K­€b+êÎmàç¸kàîø¾X#a¢[Ëa([Cr „£^¿ÛZÙ†K¶†’eÆ6ÖI‚ù2ú®¦Â$¨u}O.£O>–\Ÿ¤á wÝNpÛ˜\ß—.£Ože´êú~¼Œ~n?ǵ®ž‡ð~}~_™ <$Jƒ9‰©Â—`-ö8žyÖULÈ*øÚ\P e‘ÝS,ݪ§¸ º÷:€Û€ÜÆe±DtOÑQ ¢{§3ôÝ3WBYzÛDw Þ»—ÚP·Zöå_$åÞKò÷V/'øuÊèì.Ôùu£ŠéìÍ¿ töFŠc³ûõ ¸ Èm ~Ýü»@go¤–Ú tö^gègNgÏm\ç×Ð “·í×»‰Û§b¿bàW’›¾7\™$¡™IR[v‰k ø·¢à®L’CŽ8+Aµñâ‰æLÊÇ]wÐB"*—þ|×ø“ž ñQBpm"(ùŠ{£éw.Ìw7ÍØ´dÌ š?ÿøÓˇÓ'&Ó¬ Úqe§ÑóÎ&¦}ó4w .¿Ù97ë¹ïSí¨kÝœ/‘ xmLc÷oßÈ«o¦¯Jߎ‚³d£à ¹+Ô“E¼£¹+ƒà6 ·1m\!w¥‘jjƒæ®ô:C? Ú(¸'È]izñrWøÖD¹uŸÙ@}fÂÊ!ÂI‹Öçäæ‚\zÔ:¸7ÄÁ}!'¢‘q>Os"Àm@ncrp_ȉh¤ŠÚ 9½ÎÐOÜ?ANDÓ‹·±âàgÝØ~ý}&ûE•^9¸Ú¯ýDU²ÃÀO‡/¢Ch ‹X(|¨E^æãøDæêÛÿð—Ѽ´hKßÎ=Ôš n,dD4RG1ÒŒˆApÛ˜P72"@…DlšÑë ýTuãdD4½x +¨+á°ñWÑÑ­„s* ðIîk}“5Ñ6Ì/’¥å o:Jj|g®!u.x<–âå0­Þ5_ gÝZö4ü­mg¼ÖÍÓ»l`Ó*Ì vY­Ãõ.kÞ¯|g—œÀn(.¸sªÝ¾TÒ]ƒ1w3}ªÌĻî‚ïYpài 2Øž‘È»ió¡ô²îì‡ÚÝÚi[`˃¦!`í([~ÐÜä6ÆýPÛÒr?Ôü@lXÊ–ïu†~ælùÜÆ…û!íÞ[~A%w5°Ý%…v$Ÿ1‚Lô•(Ɔ;»œuI¸­’Åœ€ü±BS>7ŽX»©ÒnN!HHpä(ñ}IÍrIìl¥^À÷8ÀΑO«i±oIŸ³HM|Ú[£Cõ<¼m5:$x´Ç…µ’l‰“ëˆ×px†~æö¹ƒ4 ;HšŸãòÐßAÒ ð$½ŽEMØÜ@Iósá’F ÄÐ;HzˆšˆØÀuw4OvJ–(¤ÅؾIœeeöÙµ4›ä”så³·S†7öN8¥2£BðB(¡BHÄi»c2ìØ­ŽEMØÜÀˆ J¨5à¨ÐêDÔDÄ®D…xvv“¨@?;«Ÿu¦}Öªk%`è—8ÀïEüŠ«ðšoýÌ0îõ¦GÏÆ½tÀ_uÿ2~Ðj‚Íï{Õlô®|¹}yù´]Ú½ endstream endobj 1326 0 obj 8679 endobj 1330 0 obj [13 /XYZ 32.2500000 748.250000 0] endobj 1331 0 obj [13 /XYZ 31.5000000 354.500000 0] endobj 1332 0 obj [13 /XYZ 38.2500000 428 0] endobj 1333 0 obj [13 /XYZ 38.2500000 563.750000 0] endobj 1334 0 obj [13 /XYZ 38.2500000 728.750000 0] endobj 1335 0 obj [13 /XYZ 38.2500000 391.250000 0] endobj 1336 0 obj [13 /XYZ 38.2500000 728.750000 0] endobj 1337 0 obj [13 /XYZ 38.2500000 563.750000 0] endobj 1338 0 obj [13 /XYZ 38.2500000 428 0] endobj 1339 0 obj [13 /XYZ 32.2500000 188 0] endobj 1340 0 obj [13 /XYZ 38.2500000 391.250000 0] endobj 1341 0 obj [13 /XYZ 32.2500000 104.750000 0] endobj 1342 0 obj [13 /XYZ 31.5000000 354.500000 0] endobj 1343 0 obj [13 /XYZ 31.5000000 785 0] endobj 1344 0 obj [13 /XYZ 31.5000000 189.500000 0] endobj 1345 0 obj [13 /XYZ 31.5000000 785 0] endobj 1346 0 obj [13 /XYZ 31.5000000 105.500000 0] endobj 1347 0 obj [13 /XYZ 31.5000000 749 0] endobj 1348 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 706.250000 78.7500000 713 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Preface >> endobj 1349 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 699.500000 90 706.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Introduction >> endobj 1350 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 692 132 698.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows >> endobj 1351 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 685.250000 81.7500000 692 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scripting >> endobj 1352 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 677.750000 93.7500000 684.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG >> endobj 1353 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 671 99 677.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus >> endobj 1354 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 663.500000 105.750000 670.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11 >> endobj 1355 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 656.750000 105.750000 663.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus14 >> endobj 1356 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 649.250000 105.750000 656 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus17 >> endobj 1357 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 642.500000 123 649.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Preprocessor >> endobj 1358 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 635 104.250000 641.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Library >> endobj 1359 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 628.250000 108 635 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Arguments >> endobj 1360 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 620.750000 86.2500000 627.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps >> endobj 1361 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 614 119.250000 620.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization >> endobj 1362 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 606.500000 84 613.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Contract >> endobj 1363 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 599.750000 128.250000 606.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Varargs >> endobj 1364 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 592.250000 152.250000 599 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Doxygen >> endobj 1365 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 585.500000 109.500000 592.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings >> endobj 1366 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 578 116.250000 584.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Modules >> endobj 1367 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 571.250000 123.750000 578 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CCache >> endobj 1368 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 542 100.500000 548.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Android >> endobj 1369 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 534.500000 87 541.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp >> endobj 1370 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 527.750000 84 534.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23D >> endobj 1371 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 520.250000 87.7500000 527 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Go >> endobj 1372 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 513.500000 93.7500000 520.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile >> endobj 1373 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 506 92.2500000 512.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java >> endobj 1374 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 499.250000 106.500000 506 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript >> endobj 1375 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 491.750000 90 498.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua >> endobj 1376 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 485 99 491.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave >> endobj 1377 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 477.500000 93.7500000 484.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5 >> endobj 1378 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 470.750000 92.2500000 477.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Php >> endobj 1379 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 463.250000 98.2500000 470 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python >> endobj 1380 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 456.500000 84 463.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23R >> endobj 1381 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 449 93.7500000 455.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby >> endobj 1382 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 442.250000 96 449 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab >> endobj 1383 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 434.750000 87.7500000 441.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl >> endobj 1384 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 405.500000 129.750000 412.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Mzscheme >> endobj 1385 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 398.750000 98.2500000 405.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml >> endobj 1386 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 369.500000 102.750000 376.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending >> endobj 1387 0 obj << /Type /Annot /Subtype /Link /Rect [60 318.500000 91.5000000 325.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Preface_nn2 >> endobj 1388 0 obj << /Type /Annot /Subtype /Link /Rect [60 311 100.500000 317.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Preface_nn4 >> endobj 1389 0 obj << /Type /Annot /Subtype /Link /Rect [60 304.250000 98.2500000 311 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Preface_license >> endobj 1390 0 obj << /Type /Annot /Subtype /Link /Rect [60 296.750000 103.500000 303.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Preface_nn5 >> endobj 1391 0 obj << /Type /Annot /Subtype /Link /Rect [60 290 94.5000000 296.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Preface_nn6 >> endobj 1392 0 obj << /Type /Annot /Subtype /Link /Rect [60 282.500000 132 289.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Preface_nn7 >> endobj 1393 0 obj << /Type /Annot /Subtype /Link /Rect [60 275.750000 146.250000 282.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Preface_nn8 >> endobj 1394 0 obj << /Type /Annot /Subtype /Link /Rect [60 268.250000 123.750000 275 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Preface_nn9 >> endobj 1395 0 obj << /Type /Annot /Subtype /Link /Rect [60 261.500000 98.2500000 268.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Preface_release_notes >> endobj 1396 0 obj << /Type /Annot /Subtype /Link /Rect [60 254 78.7500000 260.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Preface_nn10 >> endobj 1397 0 obj << /Type /Annot /Subtype /Link /Rect [60 247.250000 90.7500000 254 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Preface_nn11 >> endobj 1398 0 obj << /Type /Annot /Subtype /Link /Rect [60 239.750000 88.5000000 246.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Preface_installation >> endobj 1399 0 obj << /Type /Annot /Subtype /Link /Rect [87 233 141 239.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Preface_windows_installation >> endobj 1400 0 obj << /Type /Annot /Subtype /Link /Rect [87 225.500000 129 232.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Preface_unix_installation >> endobj 1401 0 obj << /Type /Annot /Subtype /Link /Rect [87 218.750000 159.750000 225.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Preface_osx_installation >> endobj 1402 0 obj << /Type /Annot /Subtype /Link /Rect [87 211.250000 106.500000 218 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Preface_testing >> endobj 1403 0 obj << /Type /Annot /Subtype /Link /Rect [87 204.500000 113.250000 211.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Preface_examples >> endobj 1329 0 obj << /Type /Page /Parent 2 0 R /Contents 1404 0 R /Resources 1406 0 R /Annots 1407 0 R /MediaBox [0 0 595 842] >> endobj 1406 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F8 8 0 R /F9 9 0 R >> /XObject << >> >> endobj 1407 0 obj [ 1348 0 R 1349 0 R 1350 0 R 1351 0 R 1352 0 R 1353 0 R 1354 0 R 1355 0 R 1356 0 R 1357 0 R 1358 0 R 1359 0 R 1360 0 R 1361 0 R 1362 0 R 1363 0 R 1364 0 R 1365 0 R 1366 0 R 1367 0 R 1368 0 R 1369 0 R 1370 0 R 1371 0 R 1372 0 R 1373 0 R 1374 0 R 1375 0 R 1376 0 R 1377 0 R 1378 0 R 1379 0 R 1380 0 R 1381 0 R 1382 0 R 1383 0 R 1384 0 R 1385 0 R 1386 0 R 1387 0 R 1388 0 R 1389 0 R 1390 0 R 1391 0 R 1392 0 R 1393 0 R 1394 0 R 1395 0 R 1396 0 R 1397 0 R 1398 0 R 1399 0 R 1400 0 R 1401 0 R 1402 0 R 1403 0 R ] endobj 1404 0 obj << /Length 1405 0 R /Filter /FlateDecode >> stream xœí]K¯ì8nÞŸ_Që¦ÚzK@`úÞsd Ñ ddôd2déÌ"?~ȶH‰.›–íªsÏ4’{,«HÙ&)‰üHýðO?ÿÇí¿þ~ûáËÏÿsû5þûåç·æîL3üïÖý÷û´Aú{üûæ¼¹ýú×·ßn¿½ýôöSûÿ{~ðó—iÿú¿›¼ýsû¹ýÛ¿·Œº}sµÿþwÿop¢ý«™þíÚÿüö¯¿»ý­£8²‹ƒ×¿ÒJÕâçßÞÆ§ýÿõoo? Ï¿‰‰4RÛ›ÐJßDÐòö¿ÿùö§–üH¼¹{ÿGþÍcí[ÖÊu¬EûgÎ×4"ØÆyMþÍæk•“×ògóUñmŸ÷Ì—,´49ߟ6PàŽqVW™ª«¼é[®²Cgþ{ÕFµäó÷ºƒlûætNùü7×ÌoNÆ7'š~`ú–ŒR·&õç×øX^èƒ>¢ü<Ë sKFi^çc YxŠ/úÇí>Tˆ#|‰¯T6T]«†ymø\ñâÜ/vä:ÐzÈõØ|]ð:õµ3™›_maí¾¤?þòöÃ7SòöËŸÚÌÀ¯ÿç—nÄ¿oWëÎÜ~ùãíÚÁˆ¼ýò—7)îJ«n?ÓõîÈþŽjî²QBšäŽêïø»•à7z ¦Ç[óÓßÍÝô;Üqw¬wéoÉÇ“¿ äoþ0ŒMÝEøÍµp7QûBòùJþæ}àãï­uïíEM45!¨÷&$Iþ ýåÈwÇöþK+ÖûD²UO[IÝt2©D9j”ñ™i‰ðXõ}ë&û¨…;ñQKŒÉ'4c°ôØèߣÖïÛŸ´™Eĉ’ s´$S µ(Š~×äoÄÆÕÔ¨Å;9¨¯° ‰v;zÔ o”|Eʨ6µLE;™ê’©¢7Ö!9¶™‘Uù„ö…º ¦»ï zoGKšË¼ÎlCÞ õÞOg-ó÷#m÷~´@Ó{«™™žOÓG莊Ò/³©ZOæ†[Øj~#üøÖ‡äoPÜ ²4QöÜ]e2þmÔ˜ì{#ˆvkÓFY)ðùJþæ=Êb¾ø!G=ÊJáˆ(yýüF’ÔèßÐß”þ ÉÄ¿f•*r9¶Vkׯ}ÛMG¼nM‡oÜÍÚþ_!úÖö}Y3yч†_߬¾ ¤÷bì£ •2h»×¶ÿÑ þXÄ mhÑõñ€„‡ þüöãïÀÛÙÛë´Z¬_ ù~ÔmVãÜ©ÈÙûš¹è•…ôä¼A¯F^nIhÚ%~ø¶z ¡LÚö¢ak¿'6ëJÂÖn¡,´ Xغ> P)ƒQØZ:a³3Й°u}< á!ƒ+…ÍÉÇË>zF/pi%6 Klr™” (=¤aÕ¢ÆÏš!ÅG_+îNMâÞ~ô¤a·¸{ÅÝÛ’¸{¤±mÀâÞõQ€„JŒâîuIܽ T&î]HxÈàJqâá^faoFËGêHµâ¬ý7lŒÌ=­µŒ­,­Ï ñH·Q£7¹œÏB?9jùeZvaÿ‘ßdZ‚ €t6mØkZL£i1)˜Ó5¤šß5 ÓbFc2“P)ƒhZL£ ¦Å43Ø´ô}< á!ƒ M‹+œ.ÙlE+)  ν#¬ÐJ5ˆÇ¹OË´a·€J´s;çÚn‰¡ü´ X@»> P)ƒQ@¥, ¨˜È´ëã \) 2<Ъ^AÚ0ËwÒ#¶ÁõK u¦g›Œ­QÍ$ËN§ ke¹¦Û¼ü| ‡¦Rä P)ƒÑiQ²CºÁ šÌu}< á!ƒ+íöOc‡¬ gH ÿWJýÔ0ê0:«³;km–“Íò>mØ=ÿZåÞÊ’ÜcOˆ P)ƒQîmS’{ƒ|9]–û®$ðÁ•ºâí§®¤+1"¿VW¼Cº26ìÖ•€®Ø¦)èŠÅ~;øRqïû(@B¥ F] ¾¤+{6‚Ët¥ëã \¨+¶ÁQàO]©¦+Ø¢+¶±PW¦†½ºb…‡º"BIW°‹Â.  +]H¨”AÔ+\AW¬@N–®éJßÇ2¸RW:¸É .JƒÃ‘ò…í(µõ:Iû Qd5Ú©OÄ—W¹²šÍû&5–S°M™6ìVc!V• ïð­Î }H¨”Á¨Æª‘° ù(º¬Æ*B$f2¸RµúþÔØ“¾0ÒK¦è¸9©¬œè Ú´¤´ZÏÓ¤Jvë—¨kJ¨‹= Öd¨¾$TÊ`Ô/SB…X£1ƒ Ò÷ñ€„‡ ®Ô/;¢Bhèê‚ÑîõKäÖh+—B‡$H{QwQËÑãZA:k§Pš*mØ­yT¬+T,öKX—Tú> P)ƒQó\  b 2€JßÇ2¸RóüP¡g¶hmç…ÏšŒ^Ç‘ ·ö¡ùlНY?ER„1iÃn1 Ì`C Ì`ñ–߆ ÌÐ÷Q€„JŒbJ`°Ó"d`; ^HÁ ƒ ÅÐ5wÚ  ¼ I:ô\AϤ”kËÅÇ nZRÒx\NHvîÅX>܆­Ôt×L±#©UÚ°WÓ€¨'J¨‡Nd¨¾$TÊ jº%THË3ÈP!}HxÈàJMŸÒñhMgÉ=¼‡N“ß& r†zhŸ6ìPáN•àoÅÊà}H¨”Á( ªpªÁ 2¸@ßÇ2¸R@ÕSzÍÐ`GR£÷Ó «z†·E'æ`r8Îÿ×Ü+n³$j gIë҆ݖÄ@†3%†ÃNg2FßG*e0ZS`8Ü&]¶$:0f2¸Ò’˜ €ñmûT'þ€¦ |FëG.i=càг ôzõzæµy¾Þ`ìSžÔN™)”¨hØm§¿8W¿8ì¢q.¿ô} ¡R£²%ð‹³ÈÉÔ5`;e#øe&á!ƒ+í”›À/dlµâ¡eë¤$%–F<Œû-8¬8y›6¹#\Ú°[›<„ǸP‚Ç8ìir!ƒÇô} ¡R£6ù<Æyä+ë°6ù™IxÈàJm æ¡6=Œ— ›|Ãry’-¤”Ñ#¨»Ðw¤WMîemƒ¶©o˜;}‚úÔ°W}};¾)!v P)ƒ¨¾í‚úú9Àº¤¾}HxÈàBõí ×Åõ¶!å~CfPݤÛËQ׃|©œm5Ö»õ‚6Vêµ „Ǥ Gfp-WëñF#±)Të!«ÎH¹ý§ò][f¡ºÍ;9²ZTäØèº7dIÞ¡ß(Íg£.јzgîà bÕ÷¡ß(ý<–Á— žçÀVªQH-> 8]ZÀÉ{ˆžò¾„žò¹»¼dñ=5“P)ƒqÉâKè)ï5f¡§ú>ðÁ•K–°=ÅÃs¶t”ƒ»Ï¶ÞœJš4Š„± ‹‹™µë‚0Wè 2mØ»Þ @µOPPžÐ ßT×€”§ï£ •2ˆÊš*4 3ÈP}HxÈàBå Bäçxu.?°è‘€¦\Ú°[t%MYM‰A]]9 «LASƒQte 4¤Ä 2ÐTßÇ2¸Rt^GveX@UR&¤ »TC¬OÐ%¬OÐÈÕÑ5`Õë3“P)ƒQ@u ë´À 2¬OßÇ2¸R@õ„õ¡] 5j½œèšd|Ú°[t-D[B‹P@]]Q@3 •2E×–P@Á6˜A†êûx@ÂCWŠ®õEwèH¯‚«âv^_ì\E¤¯|45ìVA,Á—@,ïý‚Ï@,}H¨”Á¨¾b í^»¬.‚Xf2¸RübQ8µýq½Kö ·÷³p‹´a§pÛ–F*Üíuùж½Yß…{è£ •2…;”!àÝeÈ}HxÈà:ánGaî,PtYAÆ«fíGL*†„´a·š‰ÕL m«Dj&1$bè£ •2Ô¬½.@"ÚV‡ ‰úx@ÂCWª™! GðÐR÷Îí+›|ã}iï¹a·P+…Z€¶A{Ͼ µQŒUH…Zy(Ôªh[-b 0P`èã \)ÔzŒ#IKnn×§‘l˜o¾ÇBûº'w_opnØ­ÆA…0¾¤hGÛ7`…°MT‰„JŒ a E2ÚVƒ\$cèã \©vÅ9"œ” rË,¿KE°ó'N§ »ÁY¨®m[’S‡ã±CH¨”Á¨®m[5f€ã±CHxÈàJEðò¡"È9ºŽ<ö Êó…ÚÏqRv u0P¨C!NÚ¶z$sÇI‡> P)ƒQ¨C!NÚ¶â½xÀqÒ¡$²f˜ä ‘6ìÖ ' f¸B× ¼]‡p‡> P)ƒQ3\!„k:Ô³oÀšaCÔפšáž „ÛŽb á’5Þò$¨ðeÙÍ[ãÓ†ËÒxl—æ¿ÞûègÎ6^tj ¬CçÐÉ:t¶Àõ9t:Êá©%í|?Õg¶Qó ÙFŸ§º?[R•ÆÜ[ö…I¿«“æä®Mú}H¨”Aœô¥.ÅÜ¥Fn®Mú}HxÈàÂI¿KC_†ÌžÏÊWnX9sÊsÊq(2}ya3»!8«ªÀ©ôqWDr®p.Hö®î¥…8iK8„Ž)ÔC—áú> P)ƒQÑm ‡ -ru XÑmÄ!Ì$ã~¢ý4ÈÆŒ«0¶/äo»­“í7Òóñ:Æ@\“(¾öæ3ŒãÐ5´ÆÁ'¤ïãRñj£ ×S ü¸Á º_ A4·8ÆH>ÁUÖG÷’æýcuªZ…½n ·-•ÛùÅ]WXÝÒ96b}Ú°c÷Ô ‹™:ˆ×² î¦ÑP»$î}—’ˆWˆ{ûwIÜC@âB&îmSc“ˆ{ÂàBq7Í’MÖ›çÀf·©ã@®V×=ÔýÇž+A¥ »a>P!^‹’"H…AªLº>.%¯¨"Á´l á±"tMÃGð ®UùD'`“YB 2¼ádÏGBY+åÒÍ>›6ì–ò¹Øÿp­›’”k‰„PËLÊ»>.%1\©¥\ù’”+‡(—IyÛÇìS)W{Å)×ÏsvõŽÓVÕ‰çôùxܵ𡓓ªEÚ°[3æòòñ:”4à $¸VdšÑõq)‰xå¡fWÒ cc3Íh›â]ªæb7ò vr#Ó ‰eüFrÖýô̰a!Äñ¢lS;»‘Kv+Â\>^û’"àý©é÷§P–»>.%¯TgKŠàлkÀŠÐ6Å1ÚTÜÅilƒ"ø)ާpÎâ¬G>ÆÉƒ4µ…3 ijœ¤’ ÖqšëÄ^F»Øfkü|îõ`küþLÁASç2öñÚ•l v˜Þ9ÍE×Ç¥$â•…¶&˜’­ ؽtfkÚ¦8F“Úšp±«¿·5¶™2É|Àå¡k±3”‡SˆmKÒúY%cë…Ǹ>±vœ#_̸Ùf Òtað¤a¯q³s-ÿxm ÆÍb‡í>À>õ}\J"^`ܬÐãf… 6n]S£NŒ[ÂàJã&§ŒÑwjG±©E›?ÖÁ´¦¯_!Ô9ÆÆ¿T]ã-d«pÊ26U1l­ÆË)Â' hØ­ñJCW¦¤ñØùe{çTZ5êøH"^i¨ñJ•4^IÌ@f¯FIÀ'¸VãõôeéLØGöSiÌ-¥×8ÅBèÍãŒÛZ>«çŒÛÞÍ<5ìV„ù¯uI°¯Ëö¾.(Ë]—’ˆW *‚‘%E03™"´MqŒ2UsqÆí fÅ!眅*g9ZáÏ^êìœÛ]67ì–:¡Ö• ;–¬Ë }—’ˆWºÑ®BJRçÌ ƒntMqŒ)t#ap¥Ô¹º±°à¢æœÍ G†ñî—n— 5lÚ°[ºDjØPBjXìʰ!Cjô}\J"^A¤† %¤†õÈc}†ÔèšâS¤FÂàJéRƒLÊ–œJ|tN8#[üJ`’ 3Ã6iC'î‹B-tGÀ‰y6ˆ 4!´Œ"Õ·ª¶AD±‹ ¿¾uÅÑû¨hÄË šˆ›€¿o<âÑŸqÇÑ÷ц†<þŒý Ѧò;ñøf–Éqrû‚WqÃF˜1ØOTÌØ^4§€žjDÚ°VGe@:ªš’Ž*‰ô§ßvBëú :8Ñ.e@:*}IG¥C<úÃ|à8ú>ÒÐÇ•:ªFèÈÂÁ°ŒH^åÿÔª#µJÍHëÓ†µZ¥=Ò*JZÕîO¡Ä÷{X¨]ŸAk&ñÒ#­Ò®¤UÚ"ý Dp} ihÈãJ­šNã¤Ó”78‰Y ‰a­âœd¼€/ Ái$5e·ÿæÓ T0(f )#Ò†µÅ:dP¬/× eïÝÐ t}ƒ1ш—kKÅÄ£? Ž£ï£! y\iPÜßY(v´ÁkÌ­GàÕ¢åfGãÓ†µ¢5Ÿ°;6¸’hµû~øÙ{ß®Ï :xi‘hGä¢ßkÌCg¢Õ÷ц†<®­ÀHÌd%ØÓ@ÎñakaQèæ#k¥ Çf?vŽ…WßVò½ßTƨuvÌJ̾Ié7úM\Y”¨ÅTn§?Ô݃/§Y†‚ÿòG’Ú;ugŒ)î|¡žtalä“.Œ­"Åÿî”Êé>:4Ï×ךôAÓc£w}u•ŸÆ‰ÒKzþâÄŸè5&ý}h0#z°Wà€Ó˜7–Ž~ouÓo-;2NØVOˆšƒâì5á+m¶ `,s£SX¸nÏXÏõPLcáìµ ÿ5Ž}Z˜hümHUÚX&©.H™~RF¹ªùå©i§ ޝŠÎ{óó…yÒ³ùps¸MuæXŽ£ ňÛ‚…%ñz°?G;¶tà‡êŽš_jÅÊšáêc­Ü6x&ávÃÃ\žiIÇ%Y|8ûѺ‘ôìèÎH›Kú Uòuåj¹¡H¦=ò¹\§OÙ ¢J%“ªXîPNy¯õ€›ý¢ƒ³ŒùÂB¼Ê`9‹“ zìÐãç?+œÿhqbÔVuW7Z°a/óéÀ\”lŽ;¯Æê“óŠ?½k;õiƒOš¯§5àY ŒÛ^ʆ ‡É–M\Zé'f`ó+‡@øßéÈý¤xCyÒFhÁ¹ÍySÀ)Å·M35`ð¬Bhœ÷G¯?äÑrVz„ûV9aˆ5s\ô…¶uU'yN…Qz¾Â~¬#R6lÛѤÆ'Á3XÎõïÃy US›5ŽYæx¿ëÆ“ª®ÓR’›ÙüÈGcF½VŽ}¨§’§0`U×kå^%VP·íçÎqKüœ3jú7¬™éàE§vÙúÄï+PµÔáY܇_ðÀÖ gسý,Èõz±=8c—cž« r6lnëâ*Os ìpãøîk”Uäl(+ÇÆv柴ب“«ñ ·®c[ï'³rÇ÷x­pÒY€ßõ ³¶Ýu,ÅYI«œ)+[7TE¦püŒ´n/,Tj,ŒÔ¨Ên„Q8¼îÇæ`8þ…ºûÖ³vÛg!<¶9GOÁ¼åüUÁ‘)£i´n´ÊªóQ¡ý$6Ɖ€]ål«;m×µ^çé\Ÿ­pÝòच[’æ_)Aèú4îíiµ¶uŒãù8Ÿå‚ìàœ‡6àÇ+^w‘ô’§g±<ªY ÉõÉ££YŸÎ¢'vm“Ì“Ü=uÓŸÏÚ^©¯ÔØâãs^<–FÞ3«Àû‹mÊD#Ñ+|¥ kX¥ÂSݰæÁyW%°ü+Y*䆗sn¼ô½8 mü2[›L8gY÷Ô ºðïŧqô,éšé€Nv'kÀYÓ1BÏìûÙQ©b§]û,BóâKÎJ⺈Æó¡ÔY>Îì18 ^F]Ö©Àë«FœkÃrq%LÑ'>Ö Ÿu¥Lû†Jô÷¨RKxƒÕ¬ؼ¾.WÕmRÂò`T¿™S‚†•œG³•96>|VY]ÎB¼ní™:ų¯*DV¹L“Ãpî@-ê<ì«t'3lfËYIœ¥ãzàÆõ˜ãÏâ<¤‡áƒmR¶KËq`q6ÈUjiUìBh(S½ºééUã™´Yfʹ{÷÷©Å i_פuøÌ¯Y˜zA»ÏB{T)ÁìÓl%ë9äOdsŸÒ'9'²}%CŸÈÅËâ÷#åÝêþ5à®DexsÂçg§‘œct%åü?}ÒÛxf`á7üØJwÂ9&ZH?Žòú*0'EÝ{ξkºp%}‡´ ÚÆ'mšEVjýYìªÕc•üé³’f6Ì"[@g¬‹küðT.ƒ…¨˜¸räÄ4œ™h K'c,ü†\–ÓGTp’>Ä7RlŸP—7¸M_CÒf“þ‚ «Ðî̪OêZ¼:ÁaÚ_û‰}X¡ó×ç×¼ÄTÿ|€Õ«37ÍBàØ·WZ¢°ÄiCÎ;¯™¯‹Fg˜Šº¯˜Ú¢·Ýœ³¡ÖW¤`…÷`n8(gfú´ ý±9nqzþ>bê8Þ§ÝI"IkÖûvÍâÜy¸©:6 ñÛ>©dkÑÄÙ>¯º= Usš;ôùvÓu¾Ž­áp°G"Åv³Éqî³Îwª‹Ë«ªƒ¬3eªVô>Ä> D·NxŸ†‡gx׺‡Õr `iß+ÅËÎJ:bÕOÙN{š *«ì/™ÔyVñ ]êDÁ^hop(ÚÜ¢}ãghxß<ÇR)ÎyKu¬9éܘÓv¡œÜŽ é¶—ùê&Ñ1&ÿ¼ØYŽD;¥œ^ŽŸ©’8ÂZÝVI¸»ìèŠ*®Œ#â±J¯T‰ïUç .Ôƒ«c`Múžë¬ÔÒ°dÜ¡·FœX'ZY9”ïáD_?>ˆŽ^I2gg Óçfßf‡28:ià4ZWËéÀÅ•â{þá·mˆéïD‹íYï j®æBl‚¼³ÁÏÆ9Rü¬Ê…O¬<"í¶Ä‡S*fC"P]#ŸÙ!NÞY6ú ‹öúW\M 2 N’ô´ö¹N{ÂuZ/í·ßZ!X”‘ŸuX!D¾xÒ»P÷Ft±>Ñz· _åà±p…68Üä]öŠ™Þl«ÍïÄê$2Ï8Žr\2_)>êÑœTÛ·ø¤j.j˜VhïFá1MüM4vbÓ£»Yl¹×ýÝŽø±¨ÑÏ„?À!I/Äv=¾kü] ²¾A›M‘šŠGfâöÓÛÿ(q†Ü endstream endobj 1405 0 obj 7836 endobj 1410 0 obj [14 /XYZ 31.5000000 708.500000 0] endobj 1411 0 obj [14 /XYZ 31.5000000 539 0] endobj 1412 0 obj [14 /XYZ 31.5000000 240.500000 0] endobj 1413 0 obj [14 /XYZ 31.5000000 455.750000 0] endobj 1414 0 obj [14 /XYZ 31.5000000 198.500000 0] endobj 1415 0 obj [14 /XYZ 31.5000000 413.750000 0] endobj 1416 0 obj [14 /XYZ 32.2500000 197 0] endobj 1417 0 obj [14 /XYZ 31.5000000 149 0] endobj 1418 0 obj [14 /XYZ 32.2500000 148.250000 0] endobj 1419 0 obj [14 /XYZ 31.5000000 371.750000 0] endobj 1420 0 obj [14 /XYZ 32.2500000 770 0] endobj 1421 0 obj [14 /XYZ 31.5000000 100.250000 0] endobj 1422 0 obj [14 /XYZ 38.2500000 79.2500000 0] endobj 1423 0 obj [14 /XYZ 32.2500000 239 0] endobj 1424 0 obj [14 /XYZ 32.2500000 98.7500000 0] endobj 1425 0 obj [14 /XYZ 38.2500000 79.2500000 0] endobj 1426 0 obj [14 /XYZ 32.2500000 707.750000 0] endobj 1427 0 obj [14 /XYZ 32.2500000 538.250000 0] endobj 1428 0 obj [14 /XYZ 32.2500000 454.250000 0] endobj 1429 0 obj [14 /XYZ 32.2500000 412.250000 0] endobj 1430 0 obj [14 /XYZ 32.2500000 370.250000 0] endobj 1431 0 obj [14 /XYZ 31.5000000 770.750000 0] endobj 1432 0 obj << /Type /Annot /Subtype /Link /Rect [222.750000 329.750000 258.750000 336.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Preface_release_notes >> endobj 1433 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 57.5000000 158.250000 64.2500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows >> endobj 1434 0 obj << /Type /Annot /Subtype /Link /Rect [76.5000000 736.250000 155.250000 743 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.swig.org/legal.html) >> >> endobj 1435 0 obj << /Type /Annot /Subtype /Link /Rect [56.2500000 661.250000 124.500000 668 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.swig.org) >> >> endobj 1436 0 obj << /Type /Annot /Subtype /Link /Rect [56.2500000 607.250000 160.500000 614 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.swig.org/mail.html) >> >> endobj 1437 0 obj << /Type /Annot /Subtype /Link /Rect [56.2500000 554 120.750000 560.750000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.swig.org/svn.html) >> >> endobj 1438 0 obj << /Type /Annot /Subtype /Link /Rect [43.5000000 163.250000 550.500000 177.500000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.swig.org/donate.html) >> >> endobj 1439 0 obj << /Type /Annot /Subtype /Link /Rect [96.7500000 114.500000 154.500000 121.250000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.swig.org/mail.html) >> >> endobj 1440 0 obj << /Type /Annot /Subtype /Link /Rect [213 114.500000 260.250000 121.250000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.swig.org/bugs.html) >> >> endobj 1408 0 obj << /Type /Page /Parent 2 0 R /Contents 1441 0 R /Resources 1443 0 R /Annots 1444 0 R /MediaBox [0 0 595 842] >> endobj 1443 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F1409 1409 0 R >> /XObject << >> >> endobj 1444 0 obj [ 1432 0 R 1433 0 R 1434 0 R 1435 0 R 1436 0 R 1437 0 R 1438 0 R 1439 0 R 1440 0 R ] endobj 1441 0 obj << /Length 1442 0 R /Filter /FlateDecode >> stream xœí]ËŽäHr¼×WäYÀÖ0‚o@ÐSÝ%@n@‡…¬VÂbg¡ÖôûÊ3«H¦E2¬Ì#ÈìœÁn×T4ÉxxøÓÜý—þö»ÿúûî——oÿ³ûmøóåÛSñÜÖÅéŸÝáß?¼ÿ…ŸwmWï~ûýéÇîÇÓ×§¯ûÿÿñtzàÛË¿îú¿ßýËþÙýñß÷¿üÓð—á÷§Öµû?ÿzü³oÝþ§âòçá÷ÿýôoÿ°ûÛáçÏ “ÿ÷\Y÷Õa7¾üãé¼Jwü÷ï¿ýíé—Óú£>â[×u;W•ÕÎõ•ßýï>ýyÿúóË‹ç®þ?sŸîöŸöM±ÿ´Ûÿ˜ö»•oßÝ×EßÁŸ¹ï¶þðáÎïœï‹]Ýξ|üWñn'u]vV¯>ÎZ¼®l\èÕ¶gÜøÚìŒ/ïÖDÓ9³WfmsÆðÕ¶g¼ß-³3¾¼[¯¬^}œµÍÃW›Êˆ®írȦÎ.Ëw½+³|·<Ü`ðݾr®mª¶ø€Šs Î®êÙØ×jÊ{·üRuu×X½ú8kñvœî+~µ)5-¦#ËïîE–ïö. ꋪŸ|÷kÄ0™~ìýþôËë~NÍîûŸ÷twúÞñï¿?UûÿØÛE¹ûþ§Ý?îgSÿÓîû_žÊçºjºƒxøk§‘ö8Ò=w}±×*Þ¼Gªçª<™—÷=SVhĽÀg|ü Š Ž4Äzà ^ ÌZz ÅëqĹóëìûtyÛ|7ù…Ãû‡Ï‰™}7ýp']ÆÈàD¼õs¹W:Æ#¨Üg¸ ¼ÀÓκâ¹iÝÒãž)Ï“[²ùÄ%Áw‡" |MO³þò}ÏFmX`ÙUcè:tûÛ)oG€1Ÿa6wzƒ0%øÈ*J`h1À.1Sœ±øáï9(/‚òì]±‰yÀq¨ðBdVÒ°J¼-"¾X¾ƒRª2~J¥kc ‚Ÿ[UËèŒ5ŸŸA™\Js÷^éê¾Z#š@P`8ƒòó íöxRïÂÍ”nÙºågè|7>DJ¯%˜mõn$i<‚{ÌHÀ€›ùA b€æñ‡ +odþ;Œ÷€!MŠfpá§»åæwëpE7¤9bžw¿?•eÿþ}ú–÷|˜Â˜÷Ê‚w7¸}}¡¡TÁœM«í&£ÒŘ€Ò7’ÒÆrÄPÿ„S Ï‘q<‰ ˜›RˆgbpN‰| jjF€­Ù¸š-6 û¸±¨ZAØB›m¤50G¥eØ”MÀÜ™)a8}6ìà41È`œ]ÚL<. +m[édN0À90š1’8UÈ DMìl¼wÜ2$uK¼“šSzì-‘Sq]°»‚Á¹x¬øâã–"mRáƒc2²%ëlT)_ž¡—*µUŒ>Ï¿ÅÛ ~4=¼kLÔ3“å"—3Š />¼|Å7‘!¸¶šÕÚd—šÈ2_Öh„ùN~³š‰RžÓEb2ʨ”ð­ŒÉ²Ø€´m‡¯Ç‡ž(‹«ríù‹D×°ÉâjúôWgdἫiÍsµÎ9HW²¸ð ˜l±>vT5þ̤ 7Êšñ1¬Žkq,øÌ`fABÆKÄÙ¶‰s Ì€ñ0êr*¯-THçFå]K¯ÚM§½)`ËUb®m}`®õû1yÿ|[óí)áHGjb¤‘Ž´p¤#ÞÖÑOÄ ~…#/7¾s´'†-\ÀI¾îÞÿ"8é$üëöb¡0Â?"b=`pÁ¶AüGža”–#2Ñ×;µ$·˜‹ð¶–'Ë8J EJâ°IÆø{7VÞ,’`,Mܾ‹¹dõî¸ °\k¤âtŒ%F@Ûû–=×’Á¾3å ?Ó¨,ÒYbõ#—;Á”SD´•f—cˆ(™hÁz-±6®Ë&š/ÎæÌ^³.ÿ Òb/çø©×)ךÁJeñ4ÅÙwT …㢪·cí."Q%QÙÀ]$&,/ïÏf2óH±¿© p­ÐNÔækâœ^k+MëŸgª&ÒX©(Ü:øú Jf‹|CÆE ¶\³ÅPìÕE;–{&õò„šº;Oçº×€PÜŽ~†#_ˆ•¾+e(ÏzR±8kêþ’±_Wï‘/(Öºs›déó}@£h# â’ÌÙ‰¡ÃF(µ‰ß¦ê(¶É X`˜¢©#ÒÌðÕXî…ãñ–Ó9Õ}"¢&sú”ÁÚû±P»7ðE+„K’„+¨eÿDŠ•—´¦¸"ãìO˜µ._¹¾ [ªÂ7ÓFLª9¸Áf‘–T•¶ºø`°¸‘'M†:!šbÈ›ÆÌÅ$­F$¼Ý6ªî,:ó€ynæ™]3—àÃÓDM1ˆ~,u+š’¯Öý—¬e5Ñ[ŵÈJHæyXJwg)QBR’Õb ¥ÃF€a²Ämb$q†"èyãÆ]áÆäJäÍÁ8žƒq<ãÆÆŽeÂ裃QÛÀŽXÂø§Ãqc› ¬Ï §«áÈhWøKº`Õ½ÿ…ed4\O¢{+ CÔ“jºEÕ“4¢wõ$¨:Ä3å0UV´À•&ÏœîsûÜwÓýÊ^5âŽö)Wâ(¥-aw Ö€sÅ¢"`«TdÕ6¥T[Dpç“"Ÿç¨o¬`#»Gñ‡‰rÌw´¾§À  ¾6­öT(ÅÏœQ`åÔíGReÿ’L)4Eá­åøÔU;–f÷ÏéˆeÄxU•µ&SbÜîâÕTže“T˜sÌ¥§‚ Ä (-”i[ñ|_€ëD Ä$ 2f¢¸S÷òfL9 ô§Âo‚ W ÆéI¸„W“|m¥p»¨²D#¼qöpn xX ùaPåR­±)¦]†¶ûèªÍoeïi*K8…‡Úq¿jG´‹Ð²~ü ßH‘àITür›­S¤‘¹Ç–*:Lq ‘+a&:e¼BÒü3mãSLiáÚ+˸”Ô×@a±¢È¨·Ì¾i]¦ ò…éԯͧ ™QyE̘ItÛCQÛôn,jó§ÐPýx^öÊs8"¹âL[c˜î»%}XvÈÇЀw¦Æã’JÌ>[qÒ>S©IZ™2§GÙ¹ÖOŒØlàXÅK°^¬Û|ö‹€ÆÀsE{^íoß.NØÑb`½¢Ž™¯Œyæ7Ï:¸4€›/!&cżZ¡Ö×Ę©ò%"B cŠ2HSšwÈ”%º1O¼;/Ýš‹clªE}ª¸áò¾8LÝkm„9"‹—‚+HK©ÍCÛÙÖ•†Á(^»Ät…¤¨Ì¦•Ð#k¶÷žGCqÚ ‘Ú‹8}€>xëó;ë®gk÷¤mD:¿§fEm•*Iùü}kÅÙ­µ´üY­»Ié⼨Iå!¦{Ù'ªä¹’–Ú úÕmf‰%ªÞÖí—z¾m§•]ñ˜kÊ@1ñ^¢E%N²‡îµd¶ü8ÊU«Ð*4­]‰ÆÑ™1³â­»zB+¹àÖÛ,”(îó.Ávhó|"œw¹üÙâFß÷ÚyN“jþR"Æ™"„§–¹5 7ÆR¾…à·Lµ=öÛ~'¡î>5`t<{I¢Œ!® œ¤´Ú$ »Àx£´†ªÔïËȪ!Ò£.oH{'²>( '‘eVáŒZo¸Ô¶Éÿ㜟Há¨n [ÄÇJxLä|Í•îAë‚ÐDçØ3x PåÙÞ_X]Ê‹G!˜rM BKEt7P‰s“Êd„×&àÏä‹Ñj9;fQ«ýû¦›\ÇDú%Uÿ…ˆ‡SlIÀŸP1•ÑsŒ¥$Ui#•%¿IëÅÂgnC®PcL ^y¨ƒEdµ3€ª{Óf…C–'Û®¸¹Ôl›j"5µý$ê@ÿÛT&QÒxªX±ÞìrÙý¥>Óå²ÏÀ.—ƒ¼qݼ£äËYÍS§½½Ö…Ò£8ü ìBéO×Äù%ï‡+ñûÏÉGWæg‹w2ð¶Í-Ð}®g ¢ õœvß;t£N9й¿­Qݺ°“Ä•íyo™Ž¢¯£r‰–CÅ r"½>‹A¥½1E0oV-t^Äå‰7)Ï".{—?ÙVjSEXh*å/жT^gÓQמØ3C×`³’¹±ÒsÈ—?±|—Ä¢W+¢èa„<Í•¬­[i 交$Rr©: ŒúÁˆ¨Tm-îTÛ¥|[ùß >&ílƸ™Žk‰ÊVIüÄÆ‰ß’’kÖžž‚ˆ *&5®-Ù!ákÚê´<ÿ´w‡Õ Ü8Âz2.MÕÍÑêLY„Dz[D 4kÆâ žß(‘ÙÂàÊPb_Qú™Òo³‹ØT Éîa=l,?§omœœñ¡Ü{úÜÖšòs‰Ð_«'-íö‘úPÁÍ4}?§ÙÛDŠûŸmÊ­’ÝÚ ììDöNšD‹8ê²MÖHëD žµ„b‚{+ö ÍQ;<?M„CóÅqIáÐ:ø DùÔÎ/;ÄUùA̱k ® 'ð6ˆ]*ñ¾aœÆo}!æñ{Å+š[‹g˜5Dƒa¡‡WúÀ½íoyÕŸg¹¥„±’™*²ÉH­T}›Ö ú’Ô9Ä(Ðhº§iM¥Dðýê\hzpN½{ûûWƒKbÚÏŽ’Ar0zx#‰„%Ê‚ˆ(|fî˨ºv"«6’„óƒ¶#šnh{ˆ1ÒK™io>ªöv+DtIoúî%2M0›0’Ñ⠥Ĭ ŽTƒË¡zö‹…æà°¦Hµn"ïÞÈÀdÞÈ|ÞÈT˰îaŸÃ@IöÍ-À£E¯R…ƒßÞÖt¹ÕݘâsÆ—ÂÂm`‰ «ÚñÞô6ÐÈëÎPÛ›ŠíKì{['Á£XÎ$¨ìI*¼£&IS–¤ÔýªÅ°Ì72c/ôf*#­›øFô>ÆF‘ZyÓ_-⬔Žó‚µ 9̵g8xDœÄ¶³8½ù^˜ùÁ›ÒâΚR€Úv~‰®+&ë¨o·ÃÒ,ê› #xRÀ„ˆ0sì†|¥;c¿)Q/ÌŸvå ‚#Z¸†Ÿ«ÐFýU Àµ15ÓàzèBˆ7ÂqØ1¢ž«áwð3 ÁÏÀ¹ íŸÌ]|eãnÚX+D¼%K0dža’€"BZ„q£ûW·ºVMä Py+®l£þKܭ̳û–Äq¾ #³,ÖV4™¥p׈ O©Ĥ€ÎÃÓ 7UÍ„˜VLPDÔI2çÅ”´LT*m¦^iCéL£&>*Ä2Ÿpe&«Ø.©¡ÅxÕ£Ý6ºg1‰z¥*¶5„@áÚ±¼³ÌÊÄ6W¹O–ef…«'Bìaš¬g Áж-Kítû Ãm°6]ÎÜÉWx¶¯hf³”%TÍðz°ß Y—D]Pq²ðŠ!3„ú"¢œ ¾éÄç©VPÞQ¡UÂמ»¹*û‹ÙB±(¯âlŽŸÆÄ PV|±n{¿R]ÞfûÓüˆ4{ª¾ ábâªuC­nĆîënLáT—ÇÔ«cBFË+3A¿dÑyæþ3™LŠ3T¡ÞHJ—˜9N 2ðW_Ð~Æcw|Á ¬*x’¸KLŒ{9¢8¡WåïT(NaO$q™"˜"¡ oø CùU g}K»1£m×Å(UÉ[’fëDÓ&PH\rù±3É<ÁR=!r…VgD膡¦‰ƒ8E›WIh®T# AðbSt0÷E ;”Í¿ÝØÒëk7qšð=Iv1cRÎ<‰âô!­ÙÆ»íf­ð“Íš Ð4*…寔& l×Tg¨¾¨hÓUÔÕѦÚ×ç-û4¨êÇiæ×£‘K\©àHGñp¤„#/pä3Á+ýB¬Ïúxü6¸£î›Ç3Àoƒ;ê™gj♆x[îÊT—-žNKl|/ qp«ðwðÛ x |eˆ`¶Qàkgíá¥õ¥æFìu!݃Àwàîð¢{¼×˜AëÁ_$¼šÍ%~ƒ/=^Ü-Ùh®`6îÜH%…“fe êIf.QK¿# 6€øÑ¸gµ D›ô<åwØ&ƒ%16=ãËKÔ)Œ:¹´p$K±Óû±Ü ä@êkKew¿?Zã™ÆŽL/SÛ/"ÛãÞê×§ÆõE(ÏŠãéš¼I¼6eÁ ÌÛh6͇Úhâg` Éó}˜·Ñ,^ÑÛp3ÆÀ3ŽàÆ—ðmx=ƒïúZãKØ7Š ¬§7WJ¾ÖÛ‡$Ó“>#98Þ®ŒàfG~ y–˜K4ÏP¾IÄ©6›<°ä±C•¯gè]{mxGr&Î' ô@Ö¡=¹d(¯4ÊbPšZž¡ÕÄP,‹!tÝX®å·Ë·é‚7™Çì˜ñI*iKqŒ”h›K¸ÐÑ6.²”¿ñl"L½¸öÉ6‚MƒdLÊDw/§‡·öSh 0R†™³»Ö”™ —ÓõŒ‰‡Áãd|FÒe&Uí¸5£ ˜0y„/ˆiM¡mEÍq±³Ašð²©VŒNJ-ڱؤ´="yƒJÁt›(«/¿/&pŠ—§Ê©a‚œR±lí±–¨¬ËÉ€Š/j™‘º%¨+}?Qÿ_ = _ Æ« (í`|Xouî€éʾ|ÿ»ö ƒ³±ò··`-Üäö†îuXSyÙÎbô‹ ESot¢ú1U™ \)$Eƒ¦eì:B##“ðÙâ©R°‚”v©e”F¡W9YµÑÆ™‹ÚL„“/jZëª1Ž)•J8 Å8`|© H E¥ŒÏDëa¼3GX!Ë£ŠA3K®¼‘Ÿ8D Â2 ‰¨Ì©lÉ\Šà‹§n.OûS9©Eæc~o4Ì¿;VÁ ®% AªÀ'3Ê´œU«ó1‘-mÑùÖ´‡é5—$4\œ–+êh_ñU Ô"üðÂд_AYÛ›³?tW.&–MV2yÔð‰ëad š\j{á´<=( äaMgÅtFi øse>ôEþ¢4ó!ð6˜ù0´Â¸V¤nó, Áá "bhHWp~'†E_Ÿ{`ÉQ‰ð¾øÂP¼\âT$&R^%†±aÏ$–àLvmíÞÄ”ò»xµ-‰õHZúå×§´‚§‡R;‚œ0Y@¯f\U.1Ë ‹º‹@Æ-S ¹Ôbf“]Ò³q vr$,:Jú3è߈ÈQ*¯v„«${n&sbª`hû‘3‚»õâK¢èGžÆHÆnrQÓô‰©L÷*aœXÒ{*"¡ªbn3Α) -JD%Z2žøDªP²2†¦€t3OU[Þ¦•õªµw-0·ˆò$Z†ºª\üäy:§ æqÎ#nDìŠñ3ä»ùt"ËWyûdDu‡ô§¾½$D•e÷þ92xS“{ªxåC ål•GäèU?åèwæªÖº!d4µÜcÜv_2ɪŸ0ÉÆ¹™dã§ «´l·Ò”¸3¾Í˜èâÚa&/M_ ¨ÑP….f¯·Ý“me»I˜–Ù ~*þÝOi-x瘶?R}¿ª San“D@/)+ev`8â %õm±ØÊôãÐÖìgB^7YR€t˜äãéë©C°Õ"ñì”ù%u¹ÔÉÏ/4©¡·t6{_oÉM'B†T¼Û\°ž²îßVØÿÙQåê;„w_Ì·%ÄiÜSŽ©²”]…Iæ»Ú­›ÁÙwAeš‰àR­¸½BXAž–¤æ!Ü™º‚A{ÓÆÂyj\\Y ¯“2_ª«ÎÀë!ªÿÄÜå‡<°–”¹HäÿS6`ªb¸8TOÌZ›6K9ß—«Õz€ k`rVµÚþ:”Ê¿¼ás8§+üXJRºÏ§ÅÜ×hˈg†íkóbæ.%¢ÑM`J„Ncm²K@K“@ÝÕ亨¨?÷ÁÄæ·tƒiÒçRWf€“”=|¦3À#ømxp¥tìBG®¿Ú~¶9RD7m&X<ÏfÙRÝÏf Ÿ9S„æm]yf¸mn¿í~’^Âï.5ïç„ó‘âW4âÝù ‡$‰µÆ¬‡š5üÎ@“ÍsyÔÆ®Ðñ•g8<‚߆gWŠ÷Zw+‚®ýÞí/Çpº°îÓ;D¼DšÕ­µ3Åýñdã. rÐûjLác‡qÿãE3Zc„n=‹‘2v™BÇÎäp$íD]5ï‘D]5:a\Õ«¬ñV¶Ó+À„"V°_&"£tKQ-Êa{âjÆwÖä)Ù!߇°1‰C©8><’½*‡8R/ûÔMà DÈLR)ó¦ËÚÔM qߘ»ç Œ¢P%6ÚÜ€Q>`ˆµmqÛ¤\ª<­¶£‘V6®ò/É a<&L‰$¢ŒJb"2fe!öÿî~ìgP®~½õÞîªMºW3 w°ÇÎûµ^;»ÓZÛ+{zZ«>yÃçkmæ#Cº¾¿RäÖAŠûŒ¾SÞ:Õks{VŠê aÞ^M‰g5\ Àxøúö†{e¿ >3\µôölY‚;ü¼Ÿñy昵Àƒöp¿ˆ¤ñ \}C \;‰)©QdÓ]ɇN±-ºçS`eáqúw½É̾î¾>ý?!·* endstream endobj 1442 0 obj 8001 endobj 1446 0 obj [15 /XYZ 38.2500000 356.750000 0] endobj 1447 0 obj [15 /XYZ 31.5000000 120.500000 0] endobj 1448 0 obj [15 /XYZ 38.2500000 441.500000 0] endobj 1449 0 obj [15 /XYZ 38.2500000 771.500000 0] endobj 1450 0 obj [15 /XYZ 38.2500000 771.500000 0] endobj 1451 0 obj [15 /XYZ 38.2500000 441.500000 0] endobj 1452 0 obj [15 /XYZ 38.2500000 356.750000 0] endobj 1453 0 obj [15 /XYZ 38.2500000 177.500000 0] endobj 1454 0 obj [15 /XYZ 38.2500000 177.500000 0] endobj 1455 0 obj [15 /XYZ 31.5000000 120.500000 0] endobj 1456 0 obj << /Type /Annot /Subtype /Link /Rect [173.250000 482 216.750000 488.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Modules >> endobj 1457 0 obj << /Type /Annot /Subtype /Link /Rect [60 84.5000000 100.500000 91.2500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Introduction_nn2 >> endobj 1458 0 obj << /Type /Annot /Subtype /Link /Rect [60 77 104.250000 83.7500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Introduction_nn3 >> endobj 1459 0 obj << /Type /Annot /Subtype /Link /Rect [60 70.2500000 106.500000 77 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Introduction_target_languages >> endobj 1460 0 obj << /Type /Annot /Subtype /Link /Rect [87 62.7500000 132 69.5000000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Introduction_supported_status >> endobj 1461 0 obj << /Type /Annot /Subtype /Link /Rect [64.5000000 741.500000 102.750000 748.250000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://swig.org/svn.html) >> >> endobj 1462 0 obj << /Type /Annot /Subtype /Link /Rect [81.7500000 728.750000 111 735.500000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.gnu.org/software/make/) >> >> endobj 1463 0 obj << /Type /Annot /Subtype /Link /Rect [43.5000000 715.250000 60 722 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.pcre.org/) >> >> endobj 1464 0 obj << /Type /Annot /Subtype /Link /Rect [96.7500000 448.250000 152.250000 455 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.swig.org/svn.html) >> >> endobj 1465 0 obj << /Type /Annot /Subtype /Link /Rect [315 377 420 383.750000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://developer.apple.com/library/mac/documentation/Porting/Conceptual/PortingUnix/compiling/compiling.html#//apple_ref/doc/uid/TP40002850-BCIHJBBF) >> >> endobj 1445 0 obj << /Type /Page /Parent 2 0 R /Contents 1466 0 R /Resources 1468 0 R /Annots 1469 0 R /MediaBox [0 0 595 842] >> endobj 1468 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F1409 1409 0 R >> /XObject << >> >> endobj 1469 0 obj [ 1456 0 R 1457 0 R 1458 0 R 1459 0 R 1460 0 R 1461 0 R 1462 0 R 1463 0 R 1464 0 R 1465 0 R ] endobj 1466 0 obj << /Length 1467 0 R /Filter /FlateDecode >> stream xœí}[¯ã8võ»…Ÿ·¨»€ @×-@ª< òÔdÒt Ò™‡üýH–ìcI^”¸¼HJ>þ_ªdQ¹¹ï{íŸÿåÛÿûÇŸ?~ûŸã÷áßßÉ©*’þÿ»ÿýéöBZŸ†ÿ>VuqüþãðÇñÃ×Ã×öÿþqèøöñßÚÿú¿czü×öÿÿíøçÿh/þeøQ÷ƒ‡ÊTí¿¿Ÿÿm*ÓþWrý·»þÛáß:þ½ñòºa2ã¿ÿdò¢<ÏbáÍ._iÎÿûÇ÷¿~î¿ßé%ic²ähò,?š&Oÿû_‡¿¶Ã_ONu™Vy‘45üoîÕUÚ¾;OÊ£I›v©ŠÙ›ÏÿSŒmäC··| }žµx9LVÛÐ~÷¸(2o{|[¿e^y#ŸnÖ~öíw«¬è«¨ä«u[¿Uc¼ ÝÍZ¼Ãá}îq–dyíioÆVoD–äIîkèó¬}ì±eh¿{\Ô¥·=¾Ž­ßˆ²U\< }žµŸ=†C·™¦Lª:‡ÿͽ¸nßZ׺gêã]/È{ç{äù½&Ò{;r ¸È&O‹ù{¿:ŒÀαµ3UÒ[S%=æÇ¹¹òÈÁéÖµédàu}ä<æi>9üÊ%o+—+g’óÄÒãÍ,ÓÖœü¶‹Í2Ù™Ïxجéț٬vbÍñf–Ín6ËÇɺC›Ø©æü¹Y»QÍ0Ã]ìÒ}Fõ짪—kývõøß1¼¦oÞñËÙ¶ù¿4GSýk+¡ûÕ;ÿóëCÞþ‘6íbýËñŸÚµMÿùøëßõ©n’2-ÎkÝß1¿ôw®ðO“lòS“ÀŸæç;ù)Ïz×èÛ3pø ŽfêóìTäe]ÞGË34ƒä#¼SO>0íjÌåÍo?-ДL ?ã|±b{¨/†Ÿ‘TëÉn&“ÃáñZàg´ˆGƒd6îßü'ÁÔ•¹¿‡9XæÃjŠ´ §„7oåçó┥µY»øS*fÖ¿83ÓC‚?\‹´±I/·|"ü †θ(uððxŸúÑ>ÿÚ*~Äj‘Ö¹ê° ø[×s,=èËÕn€N×/égo² ?ôbËR;lm UŸnù ­hfœÊÊŒ9Eÿ¥¦8%M6~Ï/p´ói%Çl+1wÁBoQi ÕÙòXBÁ­dRÖÖœª²¦;b‰áp^1åã%fFèU¥Æ»5­ ËQË·ÁyZtLôX#ÅŠµtG,üÎz.–±B°{lËRÚ ^üõ*ãÀ¶ÔYMs:ÓòL›õ•6¹H¶žçÍ®8¥SvˆŸæï6~¦AÏdÅE#èÅñLôtçf"òÞh©û ðh–4pÝú3Pž²³¨˜Ÿ¨{Ï”pø Ï~éE¹ó¥‰o.ÛûÓ4ó#¼=[yXt®WÙ,œ»¬ðüT¶h ‰55‹ëà`Ñ®Òzuϲ¥RÝ4­ 5 ÏÞÙ¢„RBYÀOoýñj¨O!S¤c)Ãpc‹/¡”·3±“P‡Zâ´8ˆ`ÜÀKØM@‹&O ƒ¶©&äXJO¯ÌÍ7éÞÞùÝŒÑ{wð{*øLF<óÉý™aïÝù ïÀ/µ¼¯Ûgߪ*͘$ÇöTZ¸v£Íìyì|À’3&EÐÆ"}x›î­#>qXK…ˆâ³}ã„8 ÷P°¸x,Ë‹’ÁXÒâÆHëãSÔYÆ“YQŒ™­µ5ql†Úb>ƒ— s*Æ!ù†±AOÊ,À !Û³™ÑRÈ÷ÁÌs^*ݣ߰;!T*OÇÙuçß™g S`œ>uÇé´}83Îó¿ ™%ˆšu_fjüeƒ.¢=ÊWÈ!õb˜})>Íø=“£Óï”™ïT»àÝzççtçãCš$·FÙÇ3"õCÝÝÆä ; ðV/-ZLÆÛAö´UM6Ùªèé6+“HñvñO3º,j¼ áªú¢‰&pƒ¤Æ¾Å±ç°ØK9•Æ6)MžŽ· Ÿ‚ Òú%Ì~çH“õÒ/ :<Ýgv_Ù\%Ojn/D‘<©™,½š“W>§³J”rôŽ}J¡Dë­L Íûzi•™«úMÏäd}º3¨ØË¼)ïtàÌ\•â:¿ý;gjg0Z˜ $w*²Íµ,íéS}ÄI¸¼éâS –é˜Ô5Q)&À=ÝæùL$þPÆ»ÿn”„PR/X•ªÔ—a!k&«m}!5•ŽÈdŽá`Á,E8ʳOð™Ùð·´„‰:í ÛZYl–Óâ^¦|Œ¡YmñÿbôÅk¾ÉT…ÜUîÇ**™à×ȽшOg‚l À…³J"¶Rkßr.‰ŒX*~Nääº4hõ8‚ëSÕˆŒ+÷%üÓBñš;¶ÁóĈ &9Dî.tƧy9›ŒEϘ…ŠÆüRZ $AT™éTJûf3G½Gî²,]V¨LU„Ô¢”‰è%9Ü)O` jäLV«PY¤"Š&‹ecýYıƒ÷›IHÄeÆÅI„bfŸgE5f}X±u@zi“*Ux ŸÉ>pÁ…rHþ L•Pn‚ü \ó~vôÀìJ‹Û=º…­ñ{rf€÷'ÃN!œÿÆìƒ•Q9Q÷xöYªeÌXXJà6˜g£õvR0cø JXÚ gžÈÂË•—ç'Îøš¯¨ÁJaÌxb££lÐ9JY§L>IuŸƒ]„¿ ›]¹oÙ8¸Ð sÙ¨Mâ´¬S<ãU¡\u/\'F ÍG³è° @C¡žˆ°X¨rœ¬./ûíÅgKä{eûo2Û_ÒÄBCR|' ü¼–ÉŽb1²„"QèXÊãs“¡«:—aåYsù¸/c>ÏeÄrtÇ4U ;)õúgÁà |†ãA°-#‹‹/oVQ?²Y— bŒ ò5ògWÕÖ>Ûm1][àò¨8¸nÃï `qõÖâŒKh“0î,‘r¬â0Ž|&Á0:ŠÀ¾´H‡ˆÈ®’¥õ5$—ˆ †„Åúռ‡¡˜gG”|52B&ÏÇRf_ììÙäãad=6´j-Â^&å—£n o‚Ö¬•£±ê±-þ:5˜ÿš€2N@%ÎR(7š_ó¼é»‡ÝØvÐK‚ï$b}Éç"ò¥Þò¦}ûD?!8áb`9&ÿŽªZhÔ$U=Yú—ÓR轃ënê‰JÎg8»ô=·ö(®qÛWxà¡“æ´n»£÷î`—5¤ƒÁòu¢ìêÇ_j¡DHx…`W?vèK¿”¡¼Ü9<7˩ǴScƒeréAº™TÏNó­}ö+ðæx+«K€cçR KêÉ&“ŸÕŸaùb<¼á©lÅ4+ÆGf׊˜Ïze“ê#µià .ÀüLÖ›´ßi€¸^YŽ ÂŒd„ 9øީˆõ—A.ØõõœnÈÀ†°¿üžïæº3,¡GŠ*šb5ëÚ¡ÃÿÎhÅÅîË¢¾XBÒP¸T¡>Ú!—$P*4SÜ@µbÓ†·Cš¿“«×ªøj")ŸÔÔ¡$fô4Ké@ü¢qfnpÃæxW¡jCVŽë.%59Ok ÕnÖc†*\¬ÌÅó‹ ÅõøïXx¿áYcl Üc\bʶ´¸e–¨êgøN°:ÏèÖ£ XV”ÉT ŸPÐOªiËr´eø’š‹†ÏdÄôŸ5f,Å(Ï#£fxnd SáÙÁq´¨`.§OªS.r¯áòª|¨<÷•,.YŠHQ±„òqį c¥Ôéµw\(+åÙãæPÃT.P¸_L±‘´™ vEµïxõ\LìÛ/Œ.¥^:(óLÄxºÔ3§&¡/Aø•–m„ ¼ø çö Ìß ƒª>ßnÆEÉ”fk=3AäPN ©ÍeAˆ[ÿTÓŒa+ ¤8uR:ëùáf|~R~¬'^¨úüP^T"C—š4€Ñ(ñ)­¨§h”›aT¯U­i5¾ 1jq»ãGúç¡JLLL‰ñ@¯G:ò’1·Òþ(ß™àI’±cË®ó½WýûÝòtyë˜ý ”!Ë 2.A3ã!±lcœQ¼ë,>:ùLÿaÒé ·çS1Þœ™Î¹xAéRu³d¼ Í:/Öš ¯D´p‰hÔ¡“¨¬Ì‰Â ÒNßLV:•J¨|d”C\#P…iüô]M¡¼¶ó»ƒÏ‹©†Ÿa1ig¤³aì< ìQšðµ(R|:|³|ªâèž }Á;X/‹{0£›J= +Ös€1XBp:8BBcYô-Y¾|ËÙ2ñ³ì×Gž¶‡qÄ2ˆ*Úœ¯`EUxÖOXPe°åEXkH÷òYzšcÍ«*.#ÖWÈ”dA„ÊWvàDXOÔ¦V’[¦…çúôMæÄ×ë˜vÏõs.Í´á˜%3HÜÙŒßÒ'pumÆbô٢ѰksiÞ__—ôRÐÖáˆ=mÑ`9´ƒCîí–Yª´p…q‰û°oØô²œ … ,{ß¡¿R ½}yÀ7ÍXà…"ß­BUÈÄ·ˆ6q¦È0lm..rÆG—ˆ³ÅË×Ó:¡%ePt(w‘¶üŽá R8(‹×+$Œ”ɵaâÕŒâ(G:nò§jjîÉ Meîj”TfQNÀ‚!uÖI9²h"’L0x˜™´5MƒHÌ_(XÓ–|†âéñVü7 |sÙ¥#GžÂÕðÛ ™ñ)HR+ÚÔÔs~mß§˜Pɦ™PÞ¦-†zòÖwªœ&ú¤ÝÃδKÜfDÜý•U§Â8”ÞÕåäTÀÒ» œŠ4*Çž©éYb~W×o¦™of·'Ý–”§nèc—j“Ý^øýðÍÂýpÏn c:‰ïñïWíóß>:ù„d+Vöq2¿¥²†qE¾%ÈÉ^Í)÷åAŽãÞˆÈ_ :wŠuAU›)@·cÓÅÊ~Ÿ¥á+‚ü¬0LT-özˆvFʼOØ+¹Æ6ƒhu Á’«Zº%¿1×Xww DzîÌĦ¹ØíßY÷öS]'Õ±,ÏÿÓ_Meqþa÷ÛþÂ÷C™ŸŒiÒ.uøM6"»}AûóþïúüÐñæáîjuû‚þBûÄÛ$†ßÔ£!êñ ~;|øÉ~BûG÷iWñ•á ö¥Tž·iLxE5„6¯4X§ðõpeTª+6þc–‰,z>=ñÛÃFCüçƒkU¡¸\y׬|Ä÷‰ÆãÃw‹ð²0ún/niœ[¾?ã= \4f²!Ò¢9q*l\P¹²sH?J¼)†Žƒ„ˆ‰Ê`âÅïdm9>Tn8 >;]‘j‡­ÒN¢–`ãï ”óEå1`0¡JFôoƅ⳨±5ïÆ|J[Þ?ÖAHˆ”ɾÕ:â…ȆN|Ìr¶ +‹ªg Ÿ¤¤ùlG¤æ‚ô`OYÕˆ¡eä0ÅâùæŴ׬Ò"̦R«CøÒ/ /Å®Wa„N;3u6Ù÷è"] WÅxN}Ô,§›u{ÑmÅ5Ý,mŠÛ ]º™*è^4¦†K.IÀå˜|ðC–™é „N¸ë¦0Z]ä«>šæîv”ç7–×7þr9“½(™ÑcqJgR>3Ìßm´/ð™=“e~Ñsø“¼7ÚG8ë έçy—¶!JfCàââ­ÂÄ20œ{3ÀwðhxðK-d”øVØò³Âf’l3‚[ÿ<}µÌ–¸’¶Ñ ã@Õ@Ø×”ßsC¶0qF˜ S;2 g€ÔS’–ð¨™ìY‰žÑZÑa¼ +‰ž_‘›ÃlгÅ+^N=b{r%mº@ÿå¾a8+¢máDe/\O%¶¡0R©TpE:¥^j7ÁìºXzj•œ·Ò+bíTz*ºŠhƒì§ ƒ>-…údrNÅm²´¼I «°’Z*:fú9[ì¿L$£Ší“õµ¾Zĺgëöñä¬Ï`šzÙCm.5ÓÆK矚i3ÞLž.%´»vÀù±÷þÕöW{'ðÊÞ=Ïý•þuQ]æ‚ýy¡qüvéaÖ ›0'KZ?­Íγô'„ªc0œbB}ÖÚ€ÉåP&Ã7¬i=¢¼ìàvHÐpOZÞ–;FZú³Åj e"Teƒ\ÊäY®Çfü•šéêHTû@íϘ%^¶~‰ÅZsZ öq˜þÑ;ß/…§Ö²°Š”rúŒË4ùXÌ1é@ Su¥Å!`¼ùŠƒ?û1”.ãê!bÓ¾A㨷Zõ寧®]Tž½É±¦±¹H$¡Üj“W((MI×ïÒ8M²1ùjs)a…£I­§cIQ´ï²v­´Ô’¼¶YÔg¤?£d2ŒÛ¢hí­ æ€H5w8 y®bÀ¢¢5FÆ\Ãø`èŸ/ðÄáÂh[Ï£`á÷|‚£A„. ÚVæ> çdÁ ±÷•1k÷Ã>Y€§ ô•å» °*Ë ð{ðÜrwª°€bazÁw–€´Ü(Ö?BÄàÖ¸’Q^ Õ:XOEfµgçŸÄ =÷‡Z…ÄîpI¨$ÿ‚éQ è=Vs‰•;½”!í5o*ƒÅ±k ëØí =û*´lSš=â¹qä"ôïrkÊÅ –(ÊÝ‘¿o‡ô¦Á¶cAl ´Î@|€ýVqúÔY]LXß«$\ÐÓ›­o2eŸ±è¹©ž[XÔ'"þeaIL¾ß¦¯Zw•~¥ph|(L  òý&2øTë°@ýغª·-´íÚ\:V­ ©Ð©4f&Ž\:Xã$|Jpº´7åZ m‚uØrñ!æµ ·gr×[âb@-ªžÔˬ¹d“*LÍrk@ ªûWƒýÖvUIµê#¸³EÞUë]VæåðLòˆAñ˜º²OPê0°~·¿›D>ª8{òõ#§j(O!Åu"”_õXœŠÑ¥­UãùCÖ—2ž¶¸ŸJ±Ð&Š2hV>\¸QÚ§Te1>RL‡¸ÔKû &È–µ$ŠiõÂ}[<ëÙ‘¾±Ü ¦;oÝq»6ˆ1I>º£CÌycÁÊ2.–)CÛI“£ 0.¨òÔ]¯¯_ß 9ÿŽcˆÁ(Æ!ƒÏI!]´á *õ §3­U¥vUðÅxºã[;Œ¾Áí+3ß„˜ïü°PÁ)iPõvë PŸ»´™°Ôˆ}î’>»² ÊÒ½¾p°kÕh¸–jCÖÒÙå›aˆ†É2ó¬@QYfRQú‚_em[Š)ˆôCmûýä0ºœ¸3ÌzÇ.å \lÿ$že­5£Íèa, ˜ð…i&BRš4D c)õˆ³êµï)€ô°O}Ž Álmô²²M×"k[n}V±3¤ÄÙáÕfÌ]p˜;)D ±à9@dŒå1ÈRËãÞ¬!Òƒå=x4ˆ1háN³Æ£elÇ<»d¢Gƒ€Ð°hÌ_*á.UB7ÃP[IÈ¥p¾Õ÷k“ý·ì xÕ¸ºå „‚Š[Y$ÅX8Æw_‡›ªbž1)™ )“®ìÙK˸¤Œ;XËe©)¬FJJfÏßVN;ÑêÊ»’èT"˜´]Ã"_ðÚF»™HZiBŠnÚoA…B"LÒ7†²ù¤öu|X.ßòXY|âþ>LgŒ§âàþ½xE±<ÿ}j$û¬ÖöáVñ ÐY—c2ŠÏ[7›bôb¸ø-QmÖy`ˆT8`p_¨¬¡¶ÔRÀ-•éVeGiµ2Fr;ô4Â\R‚pIüÙš7…2Ycbx•}%÷ÎåÙÒbª×DnÀx&0´˜WâD` nŽ÷jõmÄl±ÚÚ¸’ ,ïsˆé0¦²$öÁHz¼£84à€yÏ(C5È<ý*»tuÉ¦ÙæøÎÓŸ¼EYéÓ4}=õxÃVˆƒ³IªJn:’;T¼/Ÿw¨ômÉ™·ûwVù2ÿb–«FðŽ‹r‹õ+â•T¶þ¼R~q Ž Wx¹¤@#«íQ‹O±tq –¤ įìË2A)K¢D/W£;”V(à¡ÚuyÉ· BöïàÊ+?Ül{eRJd4.ºÀÞ¤š±ëÙ¿¬mÊ1qRhZ ż"zaI|œÔ :X\ €´énÌù×bnïÊÊv T.K:ˆË%-<@Øã=Ä®í½g*½ÿÞ^ªaìz׎ÅÔbðK‰\8ÊMÐÂEx7íÙ"¢7sÉÊ—©•D’ðÓCl}å)åëƒy¼ñÀ<פJ ?Èh|Eái²uÉ&’Õ7@Ëàé/ÍéóâL¸§:(€¨VB QiŸâ³­%ÅÔ¿g²,•„°AX ^|Ó⑉هYÀê,•Â}—1î´&” †¥r$Ç2mŠñ¹;$™þ—~9ƒçî.šÃ^¤Ù]ÁúY0ÕA~‘'¢9M©¢^©WØ¢X1ÝpßKʲ²WÜ«‰©ò ’¢<œ>ŠúþaorO\冀¢^°ÆP3ú 4¦Œ<”½+À­ü³ê¸›<'þ¬è–¦óÎætžË®*º3°=§gÃæÞÏèΔ¹÷ž’˜õGøï¤Ò÷àïÁ£5pÝà¬ñêàц¹yw—”WÀŸ ƒ©+P”(p“@NpK<ÍK oÃê1üµŽb­øÕxA’¸~o=à-?Õì(°“-rëÂS©çè£6é)˜ŸÝ!¼J°&×~Ñ•å³D1)ÇÂl; ž³7]/!uì[ü…L‘ö–EÖsô r8$yŽ ¦ŽÄjëì»?‡´S‘&p¢¨žÜé‘ð. ›ªKÂx\¦nÆ/Í–í.Æ©‰Ÿ¡Š˜sÉ”H}~âòÆYA]…JÒ¢AIJz €Hô„ò?ý{Ò®pm”HÔ–iÚ("‹ñt ÿÉ£=_¹f›°„,®GmÂ$†óœ³Aô†–tIR¢e1Ê(Á©ÃL‚Óf¯!Ò™€/‚²ñ.¸«7°Î@ÜC4:¦ê«ŒÛRÁ¾A Q ²ÃcEl$HÃÁâ |@—”|¦EFË ¦„ïlÁ)>ÎØS”wø‰½I·0@¤n9¤Ú:vmu(c1IÓY-úU ž”ۨ궸lýâem0 $®‹`²÷Ùý‹`«^ÆÜ’Æñ] ¤U¸T²¶n€hćO´eÝ–ææÚ3ÉÇ"6LÑ‚Ûr¿›šPíh’ å.ÚpaŠµÞŸBç«]ÂRÝÞb(¯Co°™äÔ»œf”QœÒ©7 ?3Ìßi´¡fêÞ3 z&š>¦óÊìÎ ÞÎ)/ò6·ôªELrÐAvgnÉ8ƒÆ·¸ê½urÅGäQÄm@7X(¤é £íÒ8óÉ1‚Á°ëÝyCÄ%OéLGØñ.;©í—²§RÀh]e\Ó¡0ó¢ŒùôvfÍXº…rbhÍfÊVz Ž)T™·%‘I[ü7ëñö-£ WÑ"(8ா›NTÈ 3¸@½·\â$L²6ãk{I3Ñ8G°D鈆MRäc±Ê}Cu#–òåüâá8ÃÍ{öd°Z0å%’(¥›/ dÔŒŸÉ¶ìm ¤²:7— z¹Y^nUÙ¼‰CóöÜ SBBW¯ëz-Ð¥¬LŠJªÊX›%Œ­5'ŽH°cʱè²èzüE\M", ¦`*˜¢û£#œh/B¡ÞÇïð»Ãn¬1£ÊïΓMÅø±sXksH<€„ÛÈ@¡".7fZTIÖ" 鉱ø„Qhê±°Ü— ‰½žDq%ÄQ¸áŒ¯ø¶æ|JSÌã hÑœ´œõArq´çI¬ª°¶w\ùˆ†".PöJÄq‹¬žìª¤õ^Ó@!ÎøR™dš¥÷öî¼sMwïö…¦:UÍDêc©…ͨ~ M3Ó!Ì›N4ÍXôŽô”ÙØîýGûŒî\Üwwî|D_j™'xn7ÐÑxÞ6×Ì7·Jí5É©#µãËßæT×Iu¬’ó¿ÆÔç«Ù±lÎ?ì~Û_ø~(ë“1MZ׿ò›êvˆá¯áíÏÏ×Íù¡ãøáºž¼ ½ðý0žD{©Ÿãeˆñ|?üvøðÓh5Ìl5Ì:R7ëÙT}®6M9¦è;vsüþl.&[ ¬±l¢D®í:wË\]ÈÕ´ôvsá÷÷G‚i?ëö ˜ö„ÍB{5ÑéùÂø ô¿©n‡èÿº¼ ?íßõü ´W«É Ú ãƒp¾4̹~;·/ˆwÚ.8.4Ï@[¤ÿvuË •¦Iz{áaúOë1ý§Í=úÏÌ„<Û Súï~SÝ1üUé?­îÑZN^Ð^˜Ò{i˜cuKÿo/ˆIÿÙµ×Ì xUƒ“n2¾|íùÊŠ·óUß^èΗõ™ü<@þ& † uLž4Ü]mù‰ÉÍ@çÃ…ïí#Ép.¿ÉšÑßՅÐ/ÊþŒŸÏ‹É;Ú Ý;nçqþM>#¿ã· g q–LQžS‘-²ãM#Áj;H ¨ä·µg¨Û¶n×òë!ªªÛ Ý!úzøzü£¥ «áùué+¼ õ=ÂÊLvjU”öûŽi>¦­{;Û‹úêŽ&Ý‹úô”ö¹g3Q_Îï å¦éżQˆ Ü”Oè=Ùs¿7·/×ÎDÒ@÷Ø+•Oégñ•ó½á+x'GŸaðhð™Á(2NŸ^½Ñ=KpÝ·3»!œ6:…ëmÙè@$g0DW±yzo'¦¤F‘M}‡v±ê,­ž¤×mç±t~é"3ûzüzø@o)s endstream endobj 1467 0 obj 9027 endobj 1471 0 obj [16 /XYZ 32.2500000 683.750000 0] endobj 1472 0 obj [16 /XYZ 31.5000000 685.250000 0] endobj 1473 0 obj [16 /XYZ 32.2500000 523.250000 0] endobj 1474 0 obj [16 /XYZ 31.5000000 524 0] endobj 1475 0 obj [16 /XYZ 31.5000000 263 0] endobj 1476 0 obj [16 /XYZ 38.2500000 68 0] endobj 1477 0 obj [16 /XYZ 32.2500000 261.500000 0] endobj 1478 0 obj [16 /XYZ 38.2500000 159.500000 0] endobj 1479 0 obj [16 /XYZ 38.2500000 68 0] endobj 1480 0 obj [16 /XYZ 38.2500000 159.500000 0] endobj 1481 0 obj << /Type /Annot /Subtype /Link /Rect [87 778.250000 139.500000 785 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Introduction_experimental_status >> endobj 1482 0 obj << /Type /Annot /Subtype /Link /Rect [60 771.500000 105.750000 778.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Introduction_nn4 >> endobj 1483 0 obj << /Type /Annot /Subtype /Link /Rect [87 764 136.500000 770.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Introduction_nn5 >> endobj 1484 0 obj << /Type /Annot /Subtype /Link /Rect [87 757.250000 138.750000 764 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Introduction_nn6 >> endobj 1485 0 obj << /Type /Annot /Subtype /Link /Rect [87 749.750000 149.250000 756.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Introduction_nn7 >> endobj 1486 0 obj << /Type /Annot /Subtype /Link /Rect [87 743 154.500000 749.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Introduction_nn8 >> endobj 1487 0 obj << /Type /Annot /Subtype /Link /Rect [87 735.500000 112.500000 742.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Introduction_nn9 >> endobj 1488 0 obj << /Type /Annot /Subtype /Link /Rect [60 728.750000 156 735.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Introduction_nn10 >> endobj 1489 0 obj << /Type /Annot /Subtype /Link /Rect [60 721.250000 141.750000 728 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Introduction_nn11 >> endobj 1490 0 obj << /Type /Annot /Subtype /Link /Rect [60 714.500000 164.250000 721.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Introduction_build_system >> endobj 1491 0 obj << /Type /Annot /Subtype /Link /Rect [60 707 129.750000 713.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Introduction_nn12 >> endobj 1492 0 obj << /Type /Annot /Subtype /Link /Rect [60 700.250000 111 707 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Introduction_nn13 >> endobj 1493 0 obj << /Type /Annot /Subtype /Link /Rect [224.250000 82.2500000 269.250000 89 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_supported_status >> endobj 1470 0 obj << /Type /Page /Parent 2 0 R /Contents 1494 0 R /Resources 1496 0 R /Annots 1497 0 R /MediaBox [0 0 595 842] >> endobj 1496 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F1409 1409 0 R >> /XObject << >> >> endobj 1497 0 obj [ 1481 0 R 1482 0 R 1483 0 R 1484 0 R 1485 0 R 1486 0 R 1487 0 R 1488 0 R 1489 0 R 1490 0 R 1491 0 R 1492 0 R 1493 0 R ] endobj 1494 0 obj << /Length 1495 0 R /Filter /FlateDecode >> stream xœí]KÏì6rÝ¿¢×¸->$Q@À×¾7@ È"È"ðd2Ì âd‘¿=»ERÅOIµ¾¶aßÛjŠ¥¦Èzשïÿé—ÿ¸ü×ÿ^¾ÿñ—ÿ¾ü6ÿùã/Õµ­«éŸËðïwë Ò\ç¿_ZS_~ûÛÇï—ß?~þø¹ÿÿïÓ ¿üø/ýßþï"/ÿÜÿ÷—Ë¿ý{ñó aÀß>ZÑöþuü³kEÿ·êöçpýÏÿú‡Ë߇róÃØŸ¿u­šá)Pþýcù•bü÷ûûÇ÷Óï"¢DÕÊ‹ÐJ_D§ååþóãOÞT®ŸT^ôÅÚi0ö´æ¢ª®ýô·çä˜Vh©ý™ñ¨î+ çÕH@^VÔd¿+~ɺxB “fñܙٯ'Ð]VԺ싗bçm¼Ö•ëÆÇVýÂu3¥¬«¶}°^e×iYß–oú®àÕ4ó?äߟØ>­ê¹÷¸îú&¥k*Y‚®Ô]çÐÅÞºð…ªÐÞªŒoßútA^©Úžìô!Æ«zxŽ™Î|á·þ–ê*D'YƨΚcþ8Óèo˜/L·]ìûÛΡÑ_h¬Ÿc£í9´MãÏý–]Ÿ:[[˜®ŠÆï¿üúñý·žzsùõOýWÓJüÚ¯]Ý\¾ž¢½üúÇË?T•èþñòë_zf~mZazýk7}óÃø¹_PÓ…«éªFÖÕ}h%Éo¾ŽßÔW%°¿©ÇoÔµÖÍ@wEXL¤–›öÐiÉoôø¾j5i—w:älÂPÏVýHÍVg¹Â{*òž‰ð×_û#wß4[©÷ë7ËA’uá¯Î~¬¼ýHžÑ^WUBTÕ2óüYL§«­æƒaÆ«êÒt7å~ºðÛGcæ&–1ízŠùSµœñsÕuÓѲn®:c.üöa=Äpi|ÆÛö/ç—?d?=cúnxŠf~µŠ<œ}(È{æÙêkÕ){Wÿ@ÎöeºG._íyú\y,…J2š Ž­ÜyFŒ·A{;"U³¾`k¤°êw”-¬„¬6„•Ò$ÃGXcFatŸcú¸ÐX„U¿³7„•­C£¿à«iŒ¶çÐ6‚ªûÇÙÛ¤ÔB$"7¥ÄŠre=”üé4á€(þDNRKÈæv$çsÑÄIeœ#©º­#©…s\ú î‘ÆLGî6ÇüÑ8GRµ[G²WzmƒìÉqŒ¶çÐ6’G²–YDMÛ¾»¶Mmï$Ùêâ~õJNC…XöÖžíØ„½³CNYô7€J+tÜÙÑõ]ãÓë {ÏNÝ:g§6[g§©œ}ÝTÞÙÆLgã6Çü±uÎNÝlºvhôܳ3ŽÑöÚ¦Qòì4jÙÂ_IÛ‹Öö^;ï—¨Ù»8D]NËE {@lÒ«#g ˜¨4w ßý¶ùäg£—#¬¤Z_ØËÚÆám»Å\߈˜}#ë3<Œ™ÎømŽùcãð€¶Þâ­vihŒc´=‡¶i”äF¾yÀS<@‰Ýî–€"Bÿ Z›?S0êÆ”ua/Sèj‡)tÍSèŒs`GŒ}¨‡1Ó¡¿Í1¬¦Ðé-¦Ð)—†ò˜Â8FÛsh›FA¦ +ñÐÎ…ö2탥-SWë p#z’8Ϥ¬äMOãH· Ïz&¥¸I¿ùs½á™”¢µ‡rt•XÎÅqL»žbþ¤-Ϥ와Bº¤ë™.ÍϨVžÉ‚žI){|‹vÜÑ‘Þ]M»iñH[†?Q¨¢}Nô=_fCZ¹Þ(ú›€,¢Äà¤åý¶éµ¦ß)¯[Š~Þ ½i:{Yãè–òüTºZ_xš3*esF¥·8c¯ØŒkôXÙÌmÓ®§˜?)›3*¹Å•p 3ö—æg”kÎx'P’3öªÉ|Zi¿ mªŸÈ½Å뉦 çGG³ã‘Äô'ö½+šÍßJÜËäô-|¬*µ¾ð4“«¥ÍäjµÅäêÚáA£kÑæSØv=ÅüIÚL®[L®çÊcrý¥ùÅšÉÝ ”drµYÞ9­àÐGq¿#=ÀX5EDÈå.9]¬3“Ëè¬òÇ(¶Wßr”ë ‹†ÿ8„ìóìŠrß½¶?½) w‹+ã¬DÿÄt—æ)‰Ð ["´rK"´ÚaØ££ÙfêØv=ÅüIØ¡­¶$BÓ9šÎ“ý¥ù«µDhÅ$B»äÊ/”ÚûD„s—ÒIó/’ãÐz\Àšd‰Ó¿ ‰B!†4ͺ‘¨¯}d íe©í=űë OóÎNq”ÝVŠ£ìœGÙy)Žã˜v=ÅüÉNq”f+ÅqpyÛŒ—â8\šžÑ¬SWJònIq,¯æ0ó'ÄQ…8Wæ£Ì•½ç«»çGJ±¾°÷|=ÜQ•¿£ÌEêÍèɨ˨fÉH³‹U-þR÷}6×9Uiõû ïé¨{æ7 åµÑãrºÊ“ÐW7'jÞktæ7Ð^;³û fchë›ø=óS7;~aERžù¾0Þo×ÎÃwÅ[t5ì]uÎ/:¤ µ_A¬ z@ „ÔI'gàa.G/  IEx!1vš‰Òñ­L-ý€Øåô/Eêc€ü H½Œ8@ T}@ÒArª•vÙFH¶ ‡"(/Õ÷[R›Ïõ×$L¦u$ÓIB¹RÇ€°dãó /V~ºˆ>³BœÊt Fy1[zF¡7:½eXC/eÉÝ2³©§ ¡+^ÝœÞ2x’ÝJZ<À\Èo´*'P»Ö¨ŸØÔc)P¢^ÜÇ^Žl9Z¬¯´²ˆÂ#ç"Á /ÏQsŽŸxîÝr”&sªIC½1D5†ÞËaíÞ„«/¤¶—?PöŠèZHJ6ÂÜ#Þ D‚!¼¹à¹ò^¼Ó‘^轄Äç†þåáLà·¸Y½8$ ¨–ˆ³Ž™MJçgq·$”]pdäõŒ8±ôR/~ÍUÌþÐ("[ägÐH${"¬(•ŒÞ‘t–ª·æÈ#Ñ Þ$Xzó"OË˪\Ó<ÀjÝq`(âŒ,ï¶¢9/âÕpnߣϘÒ[b•iq¾¨÷È(¼òðIS 1jXá˜cêž„x%Mž9>¶¾1Æç]¾ †1M;½¿M·w"oè1â2Þü3(è” A~‰ˆ‚Ù£ø îç3ÂÚЇ)ÐbŠ¿E¼ozúÀ¢ Q¶w 5ÓOG|W4[ŽÖg™¶(’ñ4 *"ä‘lˆýz/b¯Ü8Îîýy¨¹Øo„É„}! <¡°l+a Ë'òYén8  ˜öa}½¿o°j°Jñô;sþ<Ã^6ͪ`O·Ý¥©WE}z„Îlôªðo£¬)Ôš@?|úiHö÷©²¥ŸgwÔ×ùs³%Ά6<–´A_m‰4ŒQÖjM`g Z«s³r (Oœ cŒ5…± $gõ Õ5'ÔC¬[bEä=žqŒ,J6,kV§ìÛ.‹[®wQðÆ¢0±ýú¢<®7Ø~=$¯¹r=(¯9÷8FYS¨5™í×7eûfé.ÛÇk cHÏöïPÉHÁ¯n¡‰g˜Ü9ºH$!‰G³"V©Âvïнóg½uX^ë¸Lн֑Æ(k µ&°œÇt¯}³p ï<cŒ5…± ¤?w€^R CÌ!½±Z‘gš¯2[[|;=’pÃbŸ#úìñ#‡Ü¿ø±±Ó£Þ”‡dõ—8¢ŒV!h‹.¯Ç(al§WvmAtºƒb%ʈÉ Û‘Ê×Vß¡ËçÏjKÉ`É-l‚.·ô´aŒ²¦Pk‹’wƒ.·o®\•§ä cŒ5…± ¤Wòn€Æ¢%·QDÅvyo‚ýÊZ¨ëàð!Hb, vþyúhùÓµ&7GÞóèI¼I,  ò5ûmHòÓ5¹ ¸Þ™}þ,·ž›ÊPO© –ÌÆ(k µ&°¼2»usã$cÔ#2»ýÃcMaléÞ =Pý\.žåÍwB‚½@$@Ž8eÏGA¶¨Ö9âé'‘–²èÝ'É nî€þóg±%nÜTƒzJ5°$Æ0FYS¨5EÜÜý­›“,Q€þöC cŒ5…± ¤77ØþÏ“š‡@4Àl»d5!rüÆ´CœMˆÐ?Jëîçx6›å8"#—‹æl¾ÚT˦ê,ÚˆjC 6nG3%q¬eâ8FYS¨5Y 6•Ù¨M夡 :Ž1ÖÆ&\ 6¢^Öÿ•–Ÿ'‰–¹¢-lsÐàpZ’«C>µŸçY¼\–6ä˜*£å…ß-¿ÖPò&¢#¾Œâî/×ÀËœôއÛ9eȼŽ”DbÀ¼Q›\é6^R%àû£VÒ{VilEPv[Š ›=ØLÙƒ–.7ŒQÖjM`Qe»¥J'ÿq¸à*‚ÃcMaléAµ´¯£Ó…¡Ô„¨b¼, ,ÎæuÎstÀe;±ºµO¬6['ÖMi¦TëÐ c”5…ZXN¬n¶N¬v’Y† î‰Æk cHbkµl–iSnÔÁâBH_,Då²Röã$ÆD÷{ ŽŽˆs\’…+#èú4a׃‡xªé)ôI8°:ˆã!M¬à¹H‰ òNö:ýÊ+"ѽÃϬ¡]>b])#ÕÙr襊E³žñf¿gj›x•€Jas“’bŸé˜fÏOà˜¹Að4‚jB8ô(ÂÆ[â˜Ò™ÉSÓü—µœàÝd€}L÷2$_Qù#ièé‘fU@¡>F‚høî> —$} ¥4hG<ÎK`uÒ@y æïñR7OW] _ëÈ(È<œ9OÇCF}–ÂÒñà³TU§ìJ\Õ¶< `(ª¯—QÁ~»1¾ ÞX:¯$ÙK Õ‚"™¼ÉCåñØOŤ>ƒæ•T)Ž›‘5 1 DOGûÓ‡û;¹®­ÚÇç)÷Ê€x¹<µ…ßrÜ¢w—òÚ Iåí:ëiÀ ä‡!šäÔ¤@ù &µ¢Y2.xrÎ|(Õ5îíEÞð"«O0›/ITe9üY'´&ùÚ´¢è$F¢¤ˆˆ*Ÿ×ÊŽEu”ápºtä´®ÆWLDÃÞ4îL)Ž;iïÉw3.O˜·óè²ûfž¤âȸãM(‡ì6d6šÿ³ŠØÀðpœ#špLF.ë[€GD˜\ä+…ÂI¼©¬)pGb(z:,b¨ `ÑÙµ _3ÕáÜ_ÀÄc͘g©Ž„6ö“ÝOŸòV«’Ëgø˜ÕóKS7ÀG Ì¥u¦«HJ²/’úN±…ÖYKÒ³…Ýßl9*÷pƒ¢EûÛ: '5[ÊK®Ä=]SG rÅ"…ôáãàLjÎ QQ,ïùÓÕ§$añ ¡lkç¾S»1СWò:Q°]qbóK¼Ø„ÜþCÈϤ!6y¼†,ñäODô¨xf‹ÏÑW´X߯I^>}›%9/³Ž‘P𵦱o÷ˆ˜x¯;š·Y* C49–ªv“#O/àAb ‰Ã/Âë;¹¾ÅÀßÌEêM¯ÚˆVÝvʦ8¼v­¶¸ps›õUîSnÝÓQ÷Ìë%åµÑス,Qè«× ó @ç'j6Ñ‘³}èÌOÝìø…óŽØšeÚÂxO«EjI7ùYŒZ€èü¬4HH&|ɸ /vn̘­ÃÂbYSÈ]åË›‡„¨½iÓt=jÆð.ŠNdš?a§,qì5%KÆà0ò6µÜÓ¥#ÀQt"ª_bâe¼g-Sao{°òíé†kŠæDô=ê•|Ï7P(—ä Ø£Ì§ÈÑ}·½Û±ãSb²5Ò@Ÿ¥“ç;®´IÑŒ &ßàÀU<®tVLld!¡~ÒHz/Œ‚§QeAÀ°ÜXâ Pv8b öZ±.n6Êßfgè©õ×»(|¦c¦1Õ1Ó˜v£c¦1ÝÐr¸àtÌÇ(k µ&0wÌ4¦Þè˜iŒv h·cæ8ÆXS›@òŽ™¦':¿®Âk0°?Yª¡ÌeUDô«Dj둺r¤l#Se{@œ!YÇÅý·ov ® ·R8ß?o¿çT½›»ª¶$QOxCu•±ÅpÁ‘DãeM¡ÖfIÔUzCu•r (WcŒ5…± $—D £¡Ÿ@8¨@IêpsáMä&GÞg1˜æ<@oh(ñþx‹B¿  @-¦†–WÅ|&HQÏ$§c6¼gÄîÏ“ÈözxÕr©¡-ê-ut‰¤@ßµ-v žAÚ j¾ šð)}Cj[ßõ–¾![Gè/¸ú†\4ŒÛjM`Ñ7¤ÚÒ7¤t HOß‹†q›ÂØÒëêöÉd³ÕeH" ­Âs M½­—àºåªQyÜóõ0{ée€!à\ìY+›=k½ÅžuãpÏþ‚Ëž‡1ÊšB­ ,ìYË-ö¬…K@xìyc¬)ŒM ={Öݲþ$œqùºÀÔJ•ÀAf àë‹É“/ŸÏVèÒË‚*• h»3zùAHÒÛþ¦ÉY†7è' „#Æw¸=µÍÛÿšEµ;@"ø;"ÿ FÔ³ê­ìs­ÞöŸ7ÔÛþª­ÞŽlõv£¬)ÔšÀ¤ÞöŸ7ÔÛþªp ¸êí4ÆXS›@jõ¶§µ¨·‚¶× «¾”ý‰›j±8²ÚíåëOÍÚ•7/3£¦tEÊ#ÕžIGŽ0aczœñ6|´»Rš9²%Å[[Á$RyX´ÔhºBƒÔ‘æ¦uÛÊîû‘\kò踓Eøt•JMFf '`M‡KŒ†ö¢™¼ÉÜG®!>{\òxµ¬”´-F¥¶,FU;]Áµ‡1ÊšB­ ,£[£ª\•g1cŒ5…± ¤·ïÀU´ÌH\§Å‹ŸaÀ0ì¨$j,Âäs½¸€¹‘ p啺•ÒnNÄ" ø˜nŸKìë.^î°8¤L-l)SË-)SkGÔÚ“2ÃeM¡Ö)SW[RFwÝyRfc¬)ŒM ½”¹Õ ¢j€Z†t*ŠG²€BAÕÿHh–Cb ý`ÞØ3s¯Íý½cô@–€ÌZ—0+³Ù È™O{jrÉüÓä¦Éª­l!ÙŠ-!Ù*G†µÊ’ÃeM¡Ö!Ùt[B²1ÆxBrc¬)ŒM ½loý´IÇ^`w¼Øøܪüaÿ¬ˆû¼m' ‡ý¥z¤ßïž‹U˜Îf]µÅ*:éœäNz¬b£¬)ÔšÀÂ*ŒÙb¦u˜ÖcÃcMaléYEwk(ECÚî—yž–6/“ÇÿѦhD”pn –7­¥#n¼yÜ¿@ˆèŽÐs#RÞ2á!@¹#,í8ŽÑ>ÇKÖ8&ðJq+ÀzSÇ”€мhOK^‡6äBå€vGB]—š·u¯]ººõ3еÖ:[æ""#$€ñ#M‘œúw!Í."š\ó¢Û²‚¿³{--ÞÒhÈ—@„4—©~äßŰ?‘ò»ì´!(É„ŠRY2Íhi Õ ³˜ VïtÊÆËuWpäÏé»+”÷¼Ï}èž§º q´ÒdY¿]B÷UbíáñÒÕké_wx‹WBðbî]œ¥ì/es…Clõ2?q=!âÜŠpa1Gc#ÊÆCú,§Ùeôɉ¾”IÉÚ)xöú~ÈÑÀV¥-¯ò‚õlFk¸ÄW{K:0;GªÉi_íHdÍ:„\¬} 4‘þŽ”Rœ¡::—7Ÿ)Å4FT±¼ À¬biˆ8» Nic°¹êPOçѸ¬ˆ`f¿ Z™AXëÇé­˜‚j‘…øñÞþ‰äþ Áy¤LÉOB¦¥¦ô›׊N¿~.€Ä ÝÍ@‚´}޶¹¢Ü>á}Bàyxs)xÛ›”ªCƒ…0îtR&¯‹ñ_Ô¼Jç%”«¦¶\åºG²’ra^x>aÄ<Œ($)ƌϑÊÁ›F, ôp ¤ØËÉå?Ðb1 h ÄÍI¯Sq541^ýÿÈÉ=¼L‹l*Ow) ÜóeÞšÊ-  ¿póyQxxÛWæBš@›ˆbUª:,°Ät礹f·¾V²½§­¹UõÂk G`'&^?Vþ]@‹®µ°e"¤e»eȰZƒT%Bœ•·(¯|+^E‹‘êƒ\FYÑJ Ø úà…’Ì sY€SHëüÜšH¼ Ø€!üèp$…¯’õ^yɲµ!—ò~‡J‰ÇïÉ6€PXa¼¾À—dEÇ-IµÝÜË@â# 2½‹¬I$¹½V_ï?è™ÎÉÒéœ,7;'K·s²ô;'Ë¥s²´:'K§s²Üìœ,ÝÎÉÒïœ,—ÎÉÒêœ,3vN–·ÎÉd.–” Ø4-V.Dd¨ô@ñ‰iORª¡çb :<~„œ€W’¬÷Ä‚†bx3ÑrVÇC[Çꞑ۪2–ÜVU·!·•¶X.8r{£¬)ÔšÀ,·UÕnÈmU5þ‚#·Ç1ÆšÂØ’Ëm%ô^¹Í " ]‘}ðjûqf7Kw÷φz½õMG}3o»o”"¿ÑÉMÿ öeõ£Ïf¶X–ðį¬žú>Žêž~ ¬"‹M HG ÈM) \) |) ) -) ) 7¥€t¥€ô¥€\¤€´¤€Ì(Ôn)·7¼I^ô%ÖÐùÛNÝ3d§"\ßól?lGzdÄ[ø åÄQ "Th4Þ| ,2¹B/ØÈ2eÖJ-mIH7ûbÆú`‹Å‘è¾ú)Þ@°QX2Å‚•Ù²¥ÒÖn2W‚Òkÿ¶~Ø$yL5·ÖÃtÆ#Gïqh_——ŸÆt@\Ï)Dá.®¡B®&Vø[fܦˆ@¢‚#… H#Ÿâ€Ìå ²éƼÝ=Ÿ /Ú>n‡¤TÆEk‹KÄgÂSÝö®²f.•„*üÞ©}‰øÌ:²æøB‘ç\`·I“§· TÅÇ’Kq"\ëÀ —„ë錴¥T Fó›LÝ.>D:{¥@t‡ˆ^HÏ}Ã\ËëÓf±wxqM"²›‘T¼—LŽ`îøžkuÑ›¨Ó,ÇAÎåùÓÕ-ǧx}4oç£b耈JSl[¼v;בæÍž€Ï'ƒÍ(©åbå³Mxz)Ó¬H\¹m§øÅIé»›ÊYïrƒ?^LÉ`Ùš§qôƒà ZC­ý›´–U¥€’³ŠÈë5ñ×±tªz¥âWfÏ5B‡V:Y;ÞÄ4S{)t­\íL€^BP›Rä÷à=JŠd&Šªqì·wÿÓ ŸdmÏìÊߟÅ“¢Ì[ïB[Z¼?£ž’ÙqüÈMÞ§%)á"\cHq0€SîéQÂHð1HØx3¯þ™ð,HUۇʄIîÀЋA܃+GŒ ¤Š£«nvŒ7Ž4²Ôm"seŠæÊ~9›çˆ~2C:ñÆ ¼ýýJYñ“$€­ÔŽ6˜ëŒ¡-ÞúÛÔ5S¼:%.cwëB JÄ¡Û_DÎÓ'—Ø¡#@¼:Z)¬<ˆOÐ2…µÛýÔuCŠ27.Þ•¹ôü~˳8ž:‡â°êZmqÚæ:KÍÕS~#ïéÈ{&i#ôÕÂóûؘMü8 n?½¬¢f«Èg›÷W{íÌþ§nÈoè§&Ÿ-ðÔ?ů´]j5cò9Õjé:S^Þ0ëÏ !ñ‰h,NE”IÐAYH;Ê\¬ˆ¨E 3yk‘7—öƒ¹ '“ºQ.ãîÈ•³YvJÒÂHaˬ€†‹ P²õ–ÊÅ.‡îÒæ|—Ïí;[µÙŸÍá[ÌAÊ)T¾€ùT.zKÛ Û±ìÞ,èÍ‚"%j®$Åò*Ùü¸HzÛçÝ€O—é}fµÎ½}Ëûæ^Ývœ;EÞßÝ‹zˆx]+)Še£<Q‡ôwÊäc9àDt-ºÚƒµ~ÿô⑹bp$ž¹#i&Ç×aT¹”%‘U爱³$À’dä!û7M&(PÓ…”Z Òê‡è`GÖŸYÒi6†€Ã½T†æ»KÉslµ¼å’Âk—Ò`Òµ§´9xÍTÍeXA HïjkÓFíÿ &j.˜ ³ã"òÖqCL«0FSBÞ¡¦Üéó(ž ‚(Û°Z"VE–Ù°FL/¦O§&ìoou`¼ÕBge°bF–ÇÒò4¬#cÑ–çúPyÔ§Ázû£·E­©¤-j?‘Æ{ .îó6ÎÈ¢fæWO÷R®^$·¾XÓ·AœÜ >ŒW2) |×ìõwåêçHo¬ù¤÷þu7 ¨·¢ù Šægð€¦D•áÒ¹.Ë •Éu¥›y‰«g–x\9‰/";…•ý6>âS8owm[H2WÓîF¶™9Bjl…̈‚“©ÝÜ1]YÊ€¦F1“™<"Ì`Š´{1&‹½ DeA”èb™ÔÅT‰Ó¿Òôèµ+²¼5å…'DÜ3iQ€ öîô¢pÔ—3«Ä¼Ùwˆ:ü¾‹}ª.Hj–²´Ä£xKæ@×Õ!Øb–.THrB„MNXTJÚrMk@Œy-@éÑ?©T{&æ°M.Î}`®áåâep[œf<^:Ñ#pØôáÖêxéKº9Œ‚ÈãççåHY²3ž€Rå­Î€¢¢ñ(䔣¼ÚÇÖR„—W1<»—ji÷šº7òÒgŠZ™!Hu#”«^/*1ç]{›A8¶B;±TéíK$ùzÓEŠ“.o¼Ð¨>Ü'Q/Z!1´G‡„bE’„Ñ]„?[¦gÒ¬bé™omü¬®\:V³`BIü½7¹7Ëc]~KLñ•¦ÍöeÎåÈ6‡|LôÏà-jÆuý¤,·¶y.­­ZiÌUBŠ˜edŠž¯†ìv Õ „ThP‡öW*} vÉ’RÎÛžÃ|ôVÐ…*¢:~èÛ³#…gGŠ}ÒSD8b¥²ÅççIg>nÒòM[”ß`xmÃ[»âµ^_øëÇ/»\œŠØðöVJƒbSÂç%)»SIGÎæîÝ_QÊÛžÂÏåÍj}¥¼°C÷ÿ¥øâù€"pdFë>@)p®œŸL\-W…ªâùÀMÞÄâ$fiÒVSUk E¤±(OЄzuqðàӕΚԛqvT6K¡¤+°¸ z®æ™€T¿¤6Åô@4ä@ÍÀ>Ѓ"¡ p4 ç ¨g›y“h–·º‡NE=ÚÐÏö"°ý¿—ßû­Üé??°ƒñ™­“ za[‰á7]ä‚Ê={™¶$N7ïŸÑLÖ¤¼Êq®¿ù2¯÷ͬ]õÛÛ¿‚d#?QtÔ#¹¿õlßæ_êYP³Ü§ÍJính:÷©ñà,hS‡– ?Cг‘÷Ì2CDýôUõ<ºá†¿÷O¼<ù×ø-hF¿hrãÎR•–rq«J?½ÞÆÙPIrLóü‹n+s8¢ýÆi£î‡5S|Ä/?ü?ÃèÑ endstream endobj 1495 0 obj 10761 endobj 1500 0 obj [17 /XYZ 31.5000000 689.750000 0] endobj 1501 0 obj [17 /XYZ 32.2500000 689 0] endobj 1502 0 obj [17 /XYZ 38.2500000 500.750000 0] endobj 1503 0 obj [17 /XYZ 38.2500000 500.750000 0] endobj 1504 0 obj [17 /XYZ 38.2500000 358.250000 0] endobj 1505 0 obj [17 /XYZ 38.2500000 194.750000 0] endobj 1506 0 obj [17 /XYZ 38.2500000 358.250000 0] endobj 1507 0 obj [17 /XYZ 38.2500000 194.750000 0] endobj 1508 0 obj << /Type /Annot /Subtype /Link /Rect [43.5000000 710 526.500000 724.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_suppression >> endobj 1509 0 obj << /Type /Annot /Subtype /Link /Rect [224.250000 697.250000 276.750000 704 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_experimental_status >> endobj 1498 0 obj << /Type /Page /Parent 2 0 R /Contents 1510 0 R /Resources 1512 0 R /Annots 1513 0 R /MediaBox [0 0 595 842] >> endobj 1512 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F1409 1409 0 R /F1499 1499 0 R >> /XObject << >> >> endobj 1513 0 obj [ 1508 0 R 1509 0 R ] endobj 1510 0 obj << /Length 1511 0 R /Filter /FlateDecode >> stream xœí]IÜÆ¾÷¯ès·Y ‹$Ð ‡‚ääÈq Ã6¢ø¿²Iö —¯ÈúúU‘=C ÖŒšÍZ^½½ÞòýŸ?ÿóüïßÏß¿ûüŸó×îç»Ï§ìRäYûß¹ùóÝótyé~?e~þúëéÛùÛéÓéSý÷·SûÂçw­ûßYŸÿRÿÿóùïÿ¨?ü¡ûRó…_O…*ꟿ\V…ªËn?›Ï:ýíçßšûéºÅ ÿýryV4«X˜ù۩ߥºþùýëo§ïÛýMbL¦ìYYSÿUY}þï¿N?ÖÃ÷ƒg—ÒuÿÁß¹©Ëzj“ézjUžgæ­¬R…³EvÇö ÝL’—g¥«z«3Û»þ‘\‰íª*ÖÐ×UKÃC§¼cËiÙ l]£Ÿ4pnƒ‹ÃÝfE´#½®ZÝ‘â±k.  ›gU ¿\ÚdÑŽùipùc¶Ukèëªã³gì¸Çì\.“Yq€Ý—?‹ÊÅâýíª¥áÑódìOcàuxõ•ožß~9}ÿ±æ‹îüåÇzaí|×_~=ÙúšP¿üpþc–™êOç/?ŸTvq…*k-®ùÚõIöîúÄ^¬i•»§'=Qúú¤¼”Uætþü×'ùÅèR ž(ßÁ£ÁàU«òúÄ\rëš®ZužàU« >óP0Àç“£f- Ê5àÂK‚ë·ãá È2x§+IøY×m0›lR‹z3Úº2Ä’ ‘x`®Ú%™þ¥û€O6&, HÏ!OP”á6øH´¡Û'Jõ[¾ÛÓøðÅ+–žÄšŠ×YÞZÞµñÜý»º”e-fœ»þTêúi-³\~3ÑÛ¾žœ½(Ué²TýwÌ`ó|‚úëí¿‹ëKçá˹MPP¿1XDór0D9œà§ÓÛ?De+íáÿ&œáDf¾d¾º$–4žÁOÞCÞ$B±XÒÚpyêÑ6àhrÇ+`d=d—Ô5j|kÂ#•ÄX"1$-FQÀ„åÑ„ +ªº¦R|ðic¾€!¢ ºX¦ .†©*eu £ V×ð!c¾¹Ì¢uUâËÜš‘´Ü~¦Þ éME1Ô›ŠrNoªÕ†¡ZSf½©ùŽ ažOÐëM…›Ó›Š|4AýÁXoj¾S†(‡Ä×›J³c½iòUÌ®.¬÷cöA0J‡&Èï”’y;6ö=x€5B‰L¥“3]Q‘¾2QK˃x?ëÕ$fùVyRyޤätå†rº*æätUÄhýÁXN7ß1ƒ!Ìó z9]åsrº²ã ìDN7ß)C”à ¢Ëi•é(rÚƒâ aÈvŒzxbfƒ¢ž}'B”È(±L‚xmO£«x&6£áõÇñPgvàìxÑŒ>êáàŒ—j5 RÖ׳ޙõŠÔ]BÑò¿ÀŠ×UJÄ+•D¼RnFÄ7$póÁHÄ_¿cC˜çt"^);#â•2ã ÌXÄ_¿S†(‡ÄñZEñ2¦8á륄?A ”ý&j(06¬'€;/Ù£0x°=€<¬4ÖJ‹Ã´ÚÐ#•»^„ãУ%#+Ã20ÎÄ $ºå¢ Ì0>¡-3GyDǽæè¸O¦ó Þå,<Á³Šñ3Ǔ؃ó‚TåC±baˆŽ„#âÖkýP½¤|w©âÀ]©pßЃ×xÕL áŸbäöö´ a),aõîS|ªš†Fò3ÀÒ’Uÿ¶·«›C·eÕœ_²Ê ×€­UºtŸ¤^§ÙJpÛ)•¤³¨"{¡D¹»DQÒ—Å*ãá²xM ›LBŸ„\]´ÛcZÚy>’²WLDœ7cÎzØJ¢Ëš=Š1Z#³åIL…hº©˜« …È¢Ž‡AÁšCˆ ›v…„ÊŸÊïqè#BúÈnrL¢¸æ¢šÓ¹ ÉÃé÷ŠtÈÎSÓ._ËÜ#_¡ çÕ>#»çt¥&ÑijAª‚Ô…äxn J¡h½ë¶š]é>^O]=ÿä—ÓçH m}eZ1ØÃä2)0÷Üô-©™Ë§c›˜EÝ`Xw6Ú=ÿ 9šÔu‡š% O1v¢Ã1ë"(†© “ô0Þ—¬Š¢ÞØÃÿjˆ x A0 `‚Áñ Ý^h›§Ö(öW¯@ÆU'‘[éµlE‰º3×“é · •Èã)¾Â¤åÊš{„¯’ò‰2Æ#“”$Bƒ²9Ñ„Íè—híTRz7õ61sm†âó¨2øBüˆË–ZsöÍÑ?e¶»Á[˜jÍøßmé\1š2àŠjý}ðÝÎ#sº9t^Ïv(ÑšRŒ[ï>ðp(Ì‹pa߸˜=WžµuÖ¨+5Vf8cÃý­™;wé ½ EͽS¡wz×h1•2ð>RÎaªõÅÙ+PÇÇ<7J{Bª¼Œ-VÏÌÑFO|Ò·V“½ëî;Y[‡êxmÑm~cÊ~ωl~Êe7y"$b1Uˆayž8öˆ<(*Lƒ1µ6ªñí ‹GÂ?ÅL1ˆ¢Èg𑼣½ƒ£•òÁÑ<GK·Î {‡! H€]Á˜$HîŠ8¼¢&†Wa2Ëð1H¡ð<a1çÃkó@G”˜<$ƒ¥ \†Ž¢¡ì].”nðxs´Üù V RíŽfUʼM†y–/oS/AYøš3ïP‚J™î€“–¶wuÀˆ•‚×#ôð< »Å‡•NCi³Üq$„Ò˜aP¹tÛvúÀÑ»$†GmÝ\žzVÙíëܘNËÞ‹cÄîm'uª·ÑóEZÙöì+%¬ñ<;7Ü“¯<‘zŒAŸtdxׯdë”NžèLwnò¸¼X>’‡Ô6„ (ÆÕB EBYïŠ[mëD97…Y®–¬¦Hy6âz•ŠÁFëKŒ{âbd‹Š‰6ÚA÷º€`ÞÉ÷$Ý¦Š±• */#ÊfQÒ;¬€“* šÔÀ fšf­«‰G@åÊ%Ô$¿’J±Â‘ED2èQcqõ‰¼︵–t3Â<”r¬U1ñYDÁO~Q·eZ5†Áƒ6Cª¦¬ª$“¾%šÒŒYIHf1‘Ò<év¸ƒ.3{ ´ŽÈª¼1&µK4ýÇ£¨Õ²©L*¶h½‡{Z·0…<±±‰Ê°Gôbfo"Šð€p]_ ¨ÜÁP©¨AdM¸Øy(óT˜Ä)–„µ‚¥Ú!ñ}z¹Z^?æ‘X¡Ãhœ Á{¸³€Ò0Ñ(çïØbæ‰bIå¹¹©Â«­–VÜ2ú Üì2Éô,ºõë‰àÂßéÀ3÷NçQ½~6ÑöºÌÕâRéÑGë2qmoÖ¬X‚£uhÕH¼‘¾Ù)áîb”!ÏGƒÎ ..f" 4ZŸñ;Ñwð \x:ž‚Xþðâ¥Ii#…Zi.;Hsñ\ï;Š¡t·»<')๬EË@±$\拜0l ÊìÉ…Ø`笓 ²Â¢¶ãOðNñhØAÍ„yáµáј0/â(Xã€Ì)ˆSð„b>Ê\:àw0ÜðÚ0¿ÆW% VÉž“Æ·áZi³ŒHˆD ¨ptõ‘ùúØwˆÛƉUV?4ú'‹\•}²yzƒ,ÜvòX9u rrT>Þ½p{5ï) ½¼MŠÍådN¶þCóCƒ<4È{Ðßþ)v 2*çî@åCƒ<4È»W½­é j±JM"Ù#Š>"57ŒÔ ë“í $’¢ä‰R†1Ï]¼°BÑDåÓ—’0†CÛ˜xLJ#|gòJuæÙ_®Ü‘´µ6Ý-sC9GUºHÜa:‡0‰Òq³AwÓ°:®©ãŒiAû*ŠH,E6R ©v‚¢ýSEäH Q†q0Ó÷o»”z<–wDkÙŽTûáp‹™"76ð<À%Jñ{ª—ÈZ,›aú-Pd{+Ø€L[kÑÞ@Œ,“æ–(#ö•¨SJ›j­>e˜RÁ ®8ñÞÊr­rDIXmŸtAœ$'²Í§z”lC¡2ö!v2ÑÜ•É'q„;0ùD[1Ée|‚²&6¯ÞàѸ‹+2 ÷‡ŽÜ+ŠÉô^Ÿд6vIÆ[Mè 6ßÑVîA²Þy^SVåZ xp"Ž‚ó¡˜°ìÕ1Óùpó…T •T(#[Û”‘^ØWC씪Ã+*×"kB’-ë=3¬*’ÌÀóàR ö†<#—OçQšyB•„¨Ð;º›gZd‹Ð°”†§4.qñŽÖ¢¯r=­x‚‹lx €ˆqñ;tvëÅñ2úS¶ëÄ¡ƒïL&N'QnÒË>U›ãÞøx°ÚènãHF‡‹C£ßĦM]KŠáDd#®ìIÔüd"y¨fð˜ûH\ûPuíEè7Ñ5  Wå퇨füH†ynðÁ0×— k'Î[¤ˆ2SêwÏwá¸æ'IšÊ7§r‚@ñª1¬%JŠø]™ *b€©(»~rå“´ë àÀ8ORTXp‚’§ ®cåRÁ{f«‡Áµi<upªNSÁ…ù˜sÄiyVÀ48dÒ¢p‚ë’RÊÙOÒ*õAZCÒºAÄC Dy)Š€DGS°¨œ±1«`ÖöÒõÕÀ@bFaĈ“=L%¸_"æixÌÓ˜\Qœ“Êð¢*ƒgmn¢j†µGN‰y¦ªÉúËŒC ¶õ ";¨"˜)â˜ÁaFújDU’ú…Á`Ïb“:,6_Í™z‘¥:±I¾±ÿCé!D„KÂ$Éq››“©5w\`Wv¸JW%jüxØ Ó«ü`Ip4/w…£·åx<"DYzwÁ6KBˤè«Ï¨aX±nYËË©–[u¤DŠÛr0ÑâJr=†u)‚Ùá2_ 3!†°<¼Š8'ªZQ"@©²R>£õ™ò¾ðùö1=tmÝ“(|ñ® í«ˆQë“T+Yo>J|I1,|'¤:øö.é¸E;dÈÉÔÐÆD¸lÊí»¡«Ú²¦Ï ºã"£LFVò"ó™T¾Œþ 'záþºí¼”&ƒûsº¾”N{‰z+äÎ-{«:È;Ðî§^UÃóÞuÍ—ÑZ˜j#TÁc‘mqP9”aêŒõ´¹ð$9î®´#>þ¯=înÌœ1‘0Òr}?M*ðJD Œï:­ÌÈL)RJKbn`Êtá\´‘Ù¥Ÿª‘m@Æn”ÀgL.”Y?qF2G+õÈÜ÷ÈD=!ý"'»$aCÔÓè¡ &LCÂÇÎØ¿‘0I„ߦj©á²b8cü–D« ÷̤µ=&zà\Øê¢Óöæž| Fƒ-(˜–¸Õ…ç›;1Í ¬;½¶¸i3w 6|mžv°E>ÏiÃUg‰Ò9½¥§ì³TF ¬BÈ‹¬ëFË¢À§ÂX¶÷ŒI´#x}îöí¯I™¨‰.1ÎùÅÄËCêÔÌuùŽ«„ەȦ1%Òþ˜Ìï©«3FÈlTÇQ9”‰Ì5[HˆÍúf¹²ÿ21ú­&  2wöìÙÞ¾“E¢htÜuE$aسÁ=÷nÇ—} bˆ^©O{ÍÂF0 [œ¸ª¯IwTílcŽŸ ²ë'øê&êNy.Ó^OyÝte£ Uä8 Ç'ˆì ŠûQCýÁ`Ï5Ô™Sè¼Þq©¶ccÆ-#Åc>9ú·H÷oÁ¤ !Š+hzæÙ\cò¬ Ÿ6®Ô y<5<™%LÁEÙJªKŠH˜ÞŠë˜â2Lõ¸Ì2^Á‚4§1¾¥«ä]ä½ÿíÐN;íôëÕA1ä_šþuôñÙ·zôñ‘Æë›f4!£žæQ\1ÆÂw,¡þxà ¹*¥j£áâó öyæÁÍBð<Ç0.j½\þÖ²òQô½ å£S>nÙÞ¶‰¢U'qUT}GÆgÚ2<¦ÔÒ‚Y> GR*½¸ÆŽôôƒ%:(=è1Âyð“Tݪ4>m¼Èw ^5`çMû*»»û­ë¶ë?çoõþ¼Ûÿ´ô…Ñ÷ålé e.™jÒàÎúæpjW7ÛB¡˜ €mY±¾è6ér"àÝô‰yß½ãÆ9‚|p®ëÌ> endobj 1526 0 obj << /Type /Annot /Subtype /Link /Rect [307.500000 342.500000 325.500000 349.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus14 >> endobj 1527 0 obj << /Type /Annot /Subtype /Link /Rect [435.750000 342.500000 453.750000 349.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus17 >> endobj 1528 0 obj << /Type /Annot /Subtype /Link /Rect [139.500000 211.250000 164.250000 218 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.gnu.org/software/autoconf/) >> >> endobj 1529 0 obj << /Type /Annot /Subtype /Link /Rect [168 211.250000 195 218 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.gnu.org/software/automake/) >> >> endobj 1530 0 obj << /Type /Annot /Subtype /Link /Rect [199.500000 211.250000 216.750000 218 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.gnu.org/software/libtool/) >> >> endobj 1531 0 obj << /Type /Annot /Subtype /Link /Rect [43.5000000 203.750000 252.750000 210.500000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.gnu.org/software/autoconf-archive/ax_pkg_swig.html#ax_pkg_swig) >> >> endobj 1532 0 obj << /Type /Annot /Subtype /Link /Rect [492.750000 203.750000 537.750000 210.500000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.gnu.org/software/autoconf-archive/) >> >> endobj 1533 0 obj << /Type /Annot /Subtype /Link /Rect [223.500000 182.750000 242.250000 189.500000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://cmake.org) >> >> endobj 1514 0 obj << /Type /Page /Parent 2 0 R /Contents 1534 0 R /Resources 1536 0 R /Annots 1537 0 R /MediaBox [0 0 595 842] >> endobj 1536 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F8 8 0 R /F9 9 0 R /F1409 1409 0 R /F1499 1499 0 R >> /XObject << >> >> endobj 1537 0 obj [ 1525 0 R 1526 0 R 1527 0 R 1528 0 R 1529 0 R 1530 0 R 1531 0 R 1532 0 R 1533 0 R ] endobj 1534 0 obj << /Length 1535 0 R /Filter /FlateDecode >> stream xœí]É®ä8vÝ¿¯ˆu%šÃ@NÏ€™€ /Œj·®†Ó½ðï[’â)J<ï’’"Ãwf†$Žw潇¿þË·ÿ<ý÷?N¿~úö?§ß†??}{)ÎuYôÿwºü÷Ëýº9?ÕMyúí÷—§/__¾vÿûã¥ÿàÛ§ëþö'}ú×îÿÿzúãt?þixéòÂï/µª»?ÿvý³­U÷·âöçå÷¿¼üûN¿´8v7 Æý÷/ª¶usÅBÏ?^ÆYªëÿøíï/¿öóêÄØ¶¬NÊ{R­Õ§ÿý¯—?wÍç¦Òµ-‹¶纮u×wU•'¥Ûn…t}ýO¢q%Þt[5©š¾ŽZz=”©T°í¤Û\•I¶Ío‹ïEiª*UÓ×Q§Ùæ@Ûi·Ù6E¿\º¤Ò vk\~/êʦjú:jéõ¶·Ýmçððï\ÏM×m£:Ùg»ÿ™UÉú­ô…ª7è×´öÛZ¥:ê©‹wèà T•$iÅYç­qqú® “Š+ûQK¯GÏ:Ó¶¿F´ÇÑÿl¶?~ùõµc«öôýÏÝÀúþ®|ÿýEW§_:¡^”§ï:ýSQ¨Ïÿ|úþ×Õ¯Òe?ºþIQ_Ÿ”g]õÞžT¢ß´è]öߘs­šÚimµ:—­qž(ƒZS|ò…h­@ßhøÏTéøÕQûoô¹ê—çmQkJ]ŸTg£®ÞžGý®1ÓbXëêÜ´ÅåÑš~àþèîvñz}òå{ǧïã±ö¤ª9³Å•Ǭz´=W´çz2–žÂ͹´•Gáý7͸LZ™{Ò Öð“aߛ۶'y{¶¦vI¤ø„žàæ 8ØÂ¢Öl5´VLZk¼Áâ!™®|‚w#°²¶†— / þF²ÐèF9|SÁ™Â±á5 ¶ŽZ7˜à¨ QŽ]Õ%ž/ 'ôéN·pHx°Mñ`­…ôé›’þt“‰ý¾k°¹v°øŸàÖ0¿~ð¥Z‰ u l4B]^5B[¹º=÷úyÊ3O:óD[Ø|¢ÕÂ7" Ò¢QV»+RÀñ rgî‰O༚™{RÁ'_àZÁ},jø ÜGG `kù|€Oð¨?Á'ŸãWSl`l¯ »ƒQ•*ŸŒê0êÛŠX ¯~°£hkƒ)GØXð0c{4FýiÖ@JKau†çƒG-» ˜K ÅcÉ¥p?X¦áuÃr‡P¨ÕÁ»€ûÁcÃë†U:¡YðZô¦k<Ÿ›B ïä]å3*Œ}®Qq[‘xE°b€ò˜é~µ‰Ù1 °l öl:P»€6ÑZ`u¹Û3 ËŒª©*žªiPM·ÙÅ“…j=tj¡[¬1•cù„ù™ 8L<n‰&\ƒ¿«c¡´3˜Äð°ì„„d0‰+ªñ˜ÖàŠžˆ®(nMc FÌÔ­YÈ?®Ž—Kb£Uãp°äÃ…,ƒŸ¢xyak«t(„44*!„‰“e 5ø ~Â05ó$ÀèÄê`–Áf§e"/˜B jc좀ÊÙœâe¾ÁœˆXa'¯ãa‡2XUcUÀD!E¬€3“‰K:ȡڴº-<Ø"&˜/¼eØ;)XÜâùÁñ€WLÄ@ð06µ¢„@ ûq?ØŒ€Ì„çÇÀL‰eÄÞ…ÀZcܳ¢À€èZ¢WL?„Db¾ìêP<ÌY„ Ðv†ðO²(JÝŽL Å:ó$OÔOYw ‚à¬EøŠ‡> ÉBж9>)Þæp€Ms¡pÂ5!c5fGlõ‰Õ†,iU/zµC #ËpšêøñÃcÃRˆ Ï?3oå¨Ìù”XñE¸0Ýã(s¦[Uz=.gJ¯©2êžÜë³™cÂríEæFK¢akCVJò’hkÇsbƒK¢qY!.dj:‰rVÜ.RdJm§E«Dé5®2Öµ×|L.®ÓÄÊD i þÖHª§1À0%òT ±h8^·ˆí ÏÛŒ˙Ea„ C˜'ˆ%f0 ²‰`w蜀 À’`ŽfD1¶€Z#|Ž€Ò'˜„za(R–µåPBmÙ¶ÚÕ–”-Y¤šõåª@‹ÑoG@Ló¹¹k>Q*„y4”2ŒÃÅXŸx>ú§APÃá ß9ÂÀd6¡o±XõB°ZAxØØ0ÀOF&L© w Æyy.ü°1ÆE»á2*_eKo«Dò²Þbå¾ ‡E1‚€~ÉÛ³?ÍÄñžúr+±ŽˆaÀUÂ+;ЙäÌσ/J¡ä2gÌZ¯:0 ›L܈ m¤”Éâu©ž07«Ý9&>fÿ„ÈäÀûHZ4 .v&š™rЩG›ÎnK¥X—fëxŠËA\ÞVd€bO8¯Ÿh ö çÅìÂPŸ–k1Vªe¢8æ“'œª4œ*fM\ÍάÁæm`lx·qn2®DÅâ–ÁÊÄßÈ¢hbÏfɉó+–€c£žàª—ÀØp}®.Àô–¯³¬o>­Sí®S6Ϩ¼òf=!e÷mƒn){Ì=Ý9plÙÜ@žB^»+²½ ™ÄzÉáVÅ~À8=?OR‹ô/o‰®§ÀØëd¬Ç@™ÛFØ~r™'Lu¿ÁõÈ„¿h-#3ÙêÉL;b¦'¼Fˆá5žŒ½*‰|{FWØÉøiDÀ)#¸Û{AÊxŠ(jšF'€?Ï@U2„Dè9“ïz×ú2² èµZkw8Y:}«›Úæÿ4ueSŒÑ”Æœ5s¹³Õ¹ò¡PFh—™oZô͘£_ùZKÙó:FÇ?³ö§OnæÜ´Ú¡S}n¯h†ƒÑ678÷9U=ÉŒ5Ÿã¿N®ºêúÕŠ'±Uð‰†kPÀýOðnã~­Áý Ì´&v¯¦¢7<`]BjÕý}oäÊØË ¬*…*a#Rr¢òpÜË}È~y#¼Ão¤¡¦¤Q5'S¶…>_åÈïã¿Í¹iŠúTU×?•ê-OUy}ñònÿÃo/•=+Õê¦Qã;ÆiÂÜwнÞÿ[]?:y~×/ÜAtï4NÛÁ_^>þ!;4WáÝÞR•1þ$cÈå±úÀ&#옰aømÄ5~îèßÅ Z¹ ªõƒjëñO÷ƒÏ —wŒÓ„¹ï`dP]Ì1¨j½º|½¼Ó8M4néô–¸Î¿(6Ä>"´®†²‹8ï‘@¯Ë†Â&jÉ2˜Î”¡A|3Ë2xs—PJVØÂ•VÍÉ k£Ì#lBÊßf 6}ºbð 'QO&»!âÎÞY‹\òs=Hv̽Œäc®I&ÎÊÖgU1'Î*íI›î_œ]Þ1N澃Qœ•Íœ8+k¯ƒî_œ]Þiœ&·ƒôâì­úªc*«`ÙpÞ@ÓÕKu;GÝþ¹;×ýà“Æåã4aî;I£®çH£®¼º|Ò¸¼Ó8M4néI£Yq "ëýM8×c”¡ö³ó»MÅP AXo­ˆ §¶v…SÛL…SUx!¯j6wò¥Ç8M˜ûFáÔVs©õƒvm9N—w§‰Æí µpêæx‹0C·8æ(ž¸`‚Ê£ÍtÕ^àR¶Cû&{–öê’M£Nd8Uξ—MÝ¿ë9ÙäEû®?ø²éòŽqš0÷ô²©ûw9•MݯÖïÀz²©§qšhÜÒ˦[±ÖS6ÅáÕ3a1æžN&«Û$ɸΔ.×™jŽë¼¸ÙõŸë.ï§ sßÁÈuÆÎq1~fÂu—w§‰Æí =׽݉š)°ÌäAÉf9R$.qêm-a¡ov¾}~AT(sWá£S1u{您Ê;|ßPížYaQK~7ô”µ7¦u“¯*›€)\Ñùä a®(¡ñ*eC–Öµ!ËrΆô+®?ø6d9Z·&Ì}£ Yš9²Ô~zbC–£Õxk¢q;HoCÞ.+4°tAøÖ°õ, ×w$4‰Zm\B«í¡yG×|B»¼cœ&Ì}#¡ÕzŽÐjåw &„vy§qšhÜÒZ}-àf2ŽŽy„N'3¥K‰¶1FŽ<0¥ŒðØÑ¹{U´ÚíLNp÷kéñgëç÷ï§ sßÁ(Ú™œàîWÿ€¤õs‚ûw§‰Æí ½hÇœàlÑŠÉÆ‹B“0u5T_`ÜH.Þ—†f®E@•2ã™×€ÿ³ÃJ¨¸Ödk™>AÙ Ÿ$®»¤˜IóÌ5⇪$Ž¨ÂµWDnÌÑ]@H2×e‹œt2¥N¹*ZSTÙMŒ51ZÔ:a¬b„±q¥qf1vÓ3 Ùc—^xsým©îøÛË·U¦ž¨ +•·jë[),¼D­Je"˜bø5Gbô±õÖ"çùÂçìOù=nkËmä·öð‚¡ü¾ŒÐ‘ßuk¶–ß—!<åwf‚ùð”ßOùý”ß®$RESo$À½«Q¡¿Ñ‘àJ™rk~ÃËðô¸ê´ÅõÛ› ;Q€@Y9/\:˜ .8&b*2#‹Ìð)µÔŒ ?â€Qkt; Ј•e2e&fÙöÄÙôŠø`XѶõµ#>™jNfp^—Bûúòd™Ò ÑÄ< 2S69QTÃË@jKˆOæ,‡Z?\ʇAtêb|~ÑùP÷`ÊU$[×(kÁ2"$1ÍLa¾%T¹íE}S¹õˆHGañÿt\ÖU€`grÑ)›u«,Ãíáw™’ølØ›™êe€èÖ[\Syá?.qúp_3ÂBfƒôÊ$nD²’ä§¼ÝÁXwW…/#€5˜’û%,Ý3ÆgŒûΤ=3*0"þõÆøA=»Ä(ð6ÒAc"$V–©óÉl&Ôs•6®ž›H ¯ïå‡àÄnÑk"wpSHÚ³Ýðž q¶KiÍLÑ4Ù[e2ññVJœËK2‘©gGÔ<ÊêYg=À>²ÌîØ “u(@›ô^aÑÖ®ºÄw.(Y¢¸.My}âÖA¯ÓUÜ´(øˆ,ÒÔöær`>T¼¨LâÓE…ø†Ê€õfE˜<ÍÉŒŒ¨Ú_´S6çznûÁR’t­=¶<Ô=ع¢u Œæc¢Øðdc"@DžXã<ÎIîTPé΄›öB›œ-?}óäýh)¡^­[ßÜÍué±D²lLZá›1ÙŸ2©/²N®èÁfL¢í¥SòÄÀ¶ì ?ª9i;_ùwåþÒº=^–Çz&KOÕy¸ÓðŽ$+øM‹¾BiªžrÖ`Ù3¸p7£v¢ågòp•QMnÒuߨº†D 4-& UýYi1v"FçÑÒœŒq)<×qlÀ­Âæóc¸b²Ñ\Êdªëdk‡eÑ·/®bLy‰Ʋ‚ºRŒ)˜[ŸGAASl~«’LÊ|u‡5N1YIJÁ—RŸVóÔ¶ÚH±>:mï˜æqk↔‹ºŽdQG² ÉÀÊBh2%b;< &ÙVzž{ùRFqUk½ å¾œÄ Wû˜år;ŠlÎ@À[Ë‹œ>¤h–±¿d0ò¶J|;4BÊï9F“+“#:ñ{/JÃõ¦Ð.Û?­¼¹idª?0MéöWÐÀo`>xAdc2ÒqÍ̉×öC´†óèÕ |FúܨñZ9•ÏùZŸ+{%¹û2мj"z®|€û®ohSó–)Ç\›A –Éè´qi Q¾2.ÉMMk|ÆxØÊñÔ{¢uT^€(àO6/Xöfž\k$Å'^L²ÙQÎ;Ó¤\D t$Ù¸‰,Öo¶ Ze³^ »SVaØÚU‰à!Q…H§bv5ë%s¹fGBÕØuü4mAç4%Gò²$¬%+c`¢À> •¸²Õ}Y|¹Ç†©ˆ“ô}Ò_xÎ!•/6›Ø5Ûì^³ì’\Ô¤ ùÈ_l_é$šYÂ'¸’TåŽL6#Á‡ÌÆô-;ŒQÖûc§zÌ‘~Ú[7²].š"*‘²´¢¨]j}*„÷)Æ[ ø~¹Š¢˜t´WÄlãÄ»n É”‰¤b%s¿Aª‰«43~…{½^È\ÖýÅþ¾ûIWÁB@,­`Á0iFXCÌÚL*Uâò\ÕÀ1)ð¹¢R¹Òæa¼À@»Ê”Ðâ”Õe3…ñiƒ]‹^W&¿çbåpqÿË*öW¦^sÏÿo¿CçdK7·Ýg¿rjºr—¸Ì¿<_‰û÷—î÷?üíå[@´¦‘É—!8›”~ÚŽvLÑÄÝ03Qˆ$ÈÒ2…\¦éPˆµ›Sˆµv5Ûî’vlY¹2®¢ì¦€÷œBÊ/“ÊeV©”…ÙšT.CpVše|GÔ#噸QªŽ¸ #cÖÊÖl~J”ºNT4Ø-ã˜05’¢ÐPøžÅÀ'¾ä'—c²9ÁÑ Ž ã0Y£iWLLznÏ|J‹Ÿ ƒ• Î0UÇ[æÖ͘m_yÊìµñ¼†a¾íù:%GÙXôäV4y2,çÌ“A Ì}óè§O*ø¤]AJqc¬çéS†A„xç›g÷L¯ñ²§VX—ãƒ(¬ì(H¡Õ‚ŸàCoæ ÿÐ5wãìf˜ìvøM &òÀ¦x‚³³#­æ3Üuf!#Ί±å°^ŽÚ?ÙØ¾ÂW¡™B1c×6?á&ß-1B€Å³ §J~c{noéá`hqºèÑ·XhÛÜÿ°I,´m\徿&­á\oÞ¹ìf ­ãaEæž(øä#´¨ñ¨U Ÿ@+Üà~°åþšÚ>¯ímïc{™»JQ%x>¦‡U†bPĘdIÑˉ(ìS¦\¶øõ` éc±Ì;ÛSØ*Ày&’/‹•”¸ôn=hã1!ñÈR`eûL³MB;J›Ö冇?ÂÁÜÈ^ö®»äxÊTÅÖ®Ãu +¬wèÐ䙾¥¶‹£¤N¼7Gft³¬µC×yï ›i.xÃÄØJ²ê;à~,u–Ô²*]a¸ŸT‡\%ey«E• hɦµ‰ˆÆseêIsÕ~ AfóPÃö™bÂW@¬[17á2ÉP;€œÚª®‡I…ÈFùëã'*°óŽû 6‰ ”ÚÓ‰øÂ>IÈ‹egø2°n\Uq;E«Õý›œ¢ÕÊ[¬# ¦Š¤¡N¬pÁŒ—˜Ëƒ¥2¾p&Z‹w!FU2A軿šõMÑxvýŽÕµ0 1V^Ì1¡i3_n¿¡q&ŒB$aÿ>ÝŸàrer¨3¬,fÖû,Ù‚ênAæls}•׃Ör¥ ÕÍ✧çÔëwŒ‰ÙbbÍuÙ\6{Q "óWv3$äÖSR o2ã+±V kŠ¿½9j¦þ“õDTˉÜ1—-åLô ’`9Ù®Š’6Î?IYPßßçó”gé¤ •û¡þ™™ÍO6<Z@êA[ªF¶P*å¹t!=¸¼‡»@’ ìn.È‹_S–uj_³É ˜ôp‡¬Z¹¾UMã®Ý²/DD¶ðIÃßã±…q?²­AThüëvóÌ"úÁ÷¬`|e<6ü F¹Æc¬÷(üë!Ø.5ˆ‘±G×p2ãyçµëpmõÜpàä4\*‹'·/¼…ß`´`qk ’²‚¢Æào0;C¢Àkf,Òà|,ÇÇBš¤có1†-ßAþ²„‹ˆ—7ÀLYj(• î')CÖ \Ü#ñžöЧœDÞ˜§ôO$ýwcFD,6© ¾â¶–‘”›BZ^·&ªvk€ láãàQãÕÁ;'ªçB¶†W§Ä𠶆i4p—Ï£Q<¡ ˜]Ø…nìÃnãSpe\L *ÀL1(“Ž-`Ôã] ($`©¾,Ö‰™âuÛž÷!:ßÀ;o=fÍ=³Ùö>:v"±2¢Ü1)fwB­.Š›éÇ,e¬Ìíu˜é$Ëm85ǹÖ'œL_M'8øã¸š½ÏLCáÖà7Ã9¡ŠšzýF¶,Á]þÞØÕQ­ñlñFC’ì<ÆOk÷{`àLC쟱̼ø›Ã†üŒ5OðØ†ˆÒ 5hrŠ‚»Øm¼ÖxO J쵸Ý&øÏ4@‰¸Ÿ»ƒC–óë¢9«¾CGàä;4ÿEøõôõåÿbÿËb endstream endobj 1535 0 obj 7561 endobj 1539 0 obj [19 /XYZ 38.2500000 193.250000 0] endobj 1540 0 obj [19 /XYZ 31.5000000 546.500000 0] endobj 1541 0 obj [19 /XYZ 32.2500000 345.500000 0] endobj 1542 0 obj [19 /XYZ 38.2500000 292.250000 0] endobj 1543 0 obj [19 /XYZ 37.5000000 84.5000000 0] endobj 1544 0 obj [19 /XYZ 31.5000000 707.750000 0] endobj 1545 0 obj [19 /XYZ 31.5000000 659 0] endobj 1546 0 obj [19 /XYZ 32.2500000 707 0] endobj 1547 0 obj [19 /XYZ 32.2500000 657.500000 0] endobj 1548 0 obj [19 /XYZ 32.2500000 254 0] endobj 1549 0 obj [19 /XYZ 31.5000000 546.500000 0] endobj 1550 0 obj [19 /XYZ 37.5000000 121.250000 0] endobj 1551 0 obj [19 /XYZ 31.5000000 347 0] endobj 1552 0 obj [19 /XYZ 38.2500000 292.250000 0] endobj 1553 0 obj [19 /XYZ 31.5000000 255.500000 0] endobj 1554 0 obj [19 /XYZ 38.2500000 193.250000 0] endobj 1555 0 obj [19 /XYZ 37.5000000 121.250000 0] endobj 1556 0 obj [19 /XYZ 37.5000000 84.5000000 0] endobj 1557 0 obj << /Type /Annot /Subtype /Link /Rect [60 510.500000 122.250000 517.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_installation >> endobj 1558 0 obj << /Type /Annot /Subtype /Link /Rect [87 503 142.500000 509.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_executable >> endobj 1559 0 obj << /Type /Annot /Subtype /Link /Rect [60 496.250000 129.750000 503 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_examples >> endobj 1560 0 obj << /Type /Annot /Subtype /Link /Rect [87 488.750000 228.750000 495.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_visual_studio >> endobj 1561 0 obj << /Type /Annot /Subtype /Link /Rect [114 482 121.500000 488.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_csharp >> endobj 1562 0 obj << /Type /Annot /Subtype /Link /Rect [114 474.500000 126.750000 481.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_java >> endobj 1563 0 obj << /Type /Annot /Subtype /Link /Rect [114 467.750000 124.500000 474.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_perl >> endobj 1564 0 obj << /Type /Annot /Subtype /Link /Rect [114 460.250000 132.750000 467 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_python >> endobj 1565 0 obj << /Type /Annot /Subtype /Link /Rect [114 453.500000 125.250000 460.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_tcl >> endobj 1566 0 obj << /Type /Annot /Subtype /Link /Rect [114 446 118.500000 452.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_r >> endobj 1567 0 obj << /Type /Annot /Subtype /Link /Rect [114 439.250000 127.500000 446 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_ruby >> endobj 1568 0 obj << /Type /Annot /Subtype /Link /Rect [87 431.750000 235.500000 438.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_other_compilers >> endobj 1569 0 obj << /Type /Annot /Subtype /Link /Rect [60 425 138 431.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_cygwin_mingw >> endobj 1570 0 obj << /Type /Annot /Subtype /Link /Rect [87 417.500000 167.250000 424.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_swig_exe >> endobj 1571 0 obj << /Type /Annot /Subtype /Link /Rect [114 410.750000 227.250000 417.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_mingw_msys >> endobj 1572 0 obj << /Type /Annot /Subtype /Link /Rect [114 403.250000 196.500000 410 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_cygwin >> endobj 1573 0 obj << /Type /Annot /Subtype /Link /Rect [114 396.500000 192.750000 403.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_building_alternatives >> endobj 1574 0 obj << /Type /Annot /Subtype /Link /Rect [87 389 218.250000 395.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_examples_cygwin >> endobj 1575 0 obj << /Type /Annot /Subtype /Link /Rect [60 382.250000 185.250000 389 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_interface_file >> endobj 1576 0 obj << /Type /Annot /Subtype /Link /Rect [180 299 249.750000 305.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_examples >> endobj 1577 0 obj << /Type /Annot /Subtype /Link /Rect [63 263 143.250000 269.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_swig_exe >> endobj 1578 0 obj << /Type /Annot /Subtype /Link /Rect [485.250000 213.500000 548.250000 220.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_examples_cygwin >> endobj 1579 0 obj << /Type /Annot /Subtype /Link /Rect [174.750000 306.500000 212.250000 313.250000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.swig.org) >> >> endobj 1538 0 obj << /Type /Page /Parent 2 0 R /Contents 1580 0 R /Resources 1582 0 R /Annots 1583 0 R /MediaBox [0 0 595 842] >> endobj 1582 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R /F1499 1499 0 R >> /XObject << >> >> endobj 1583 0 obj [ 1557 0 R 1558 0 R 1559 0 R 1560 0 R 1561 0 R 1562 0 R 1563 0 R 1564 0 R 1565 0 R 1566 0 R 1567 0 R 1568 0 R 1569 0 R 1570 0 R 1571 0 R 1572 0 R 1573 0 R 1574 0 R 1575 0 R 1576 0 R 1577 0 R 1578 0 R 1579 0 R ] endobj 1580 0 obj << /Length 1581 0 R /Filter /FlateDecode >> stream xœí]I¯ëÈuÞß_¡µßf $‹@àM ‹n #‹àÙŽa¸´½Èß$’’XäWb}:UEêʤû’b §Nyøáß~þïÃÿüóðןÿ÷ð}ø÷—Ÿßª÷¶®úÿNÿüþövïÃZW¾ÿúöÛá··ŸÞ~:þÿßÞú~þòÇÿú¿ƒ>üûñÿþzøÃþqøÑ鿾µª=þûoçw­:þWuù÷éù_Þþów‡¿ŸF§3ýû÷ÊYÛVqgæßÞÆ]ªó?ÿüþ÷·úýGMb×¹ƒ²ÆTgõázûóqøqðê½³Jµm«¦iõqžÆ4¥»ã”]=›æüÄàJzè¶2U¢¡ûUKÃC™FÇ~wÍð?øßÜÌî-eNؤÜa•RΫ›Î[WªkªÖYøßü¼µÒeçceâyM¡yûÍ deu=Ÿ÷§ˆØ5^)¿¾¥üú`sêÿ¥8õ3Çáçp}„Ymç#ç‡\u…œ §ªóÂìáf•öÈÞÇauNtXÞÈÛ9¬îˆE7«4û9¬7k6qRÝy»õñ ºa…»8¥eBõì·jàkçãþÈ{b)å@§*UBþtÆÖÞ¼ÔiÏpî Ú50t >ÿòöÃÊVG±¸9üòç£ÓOyþ×/G¤>üÞ4Q‡_þxø—ªRÕ¿~ùë[÷Þèz\àð¦Co¬…ß|oðyÃãÕÜE™w£:¾òyÈÒ7=¦›÷Ú6®}²ƒŽ©Ô8Üõ›̓WX>[xNý´Ä7ýý¬GP¯Á®ÊÆe઩àó‘Ào|±¾r ÊXiæÚ8ølýŸ d¼Ÿh%AÑ¢S²…ºò…]ƒëd•5X[ìü­3·>-”vuøŒáGŽAêTÕ{Óª•ü.ânX=Á«ÌÒb![¬ ƒ o3g b(º`Œç±šÀ;ŸÂ¸èzÅ¢R€€cÈJpòÒ[`ƒøÞÎäxúñä.!›;…œMØ\à~ö‡©ê÷ª3S°|‚ ìÁ¢ôøjCds~£°vEè4ÂloÒa}õÉt e¾"Út±=Ññ›] 3 Q  ÁƒS]2mÐn¡¾®çÛMr-§7~¹1îx0z.\¾!Ü` õ1Æ|Á4ˆËØÊS716aé,9kUJ{À}vÆóåoƒ ¾9¢ #Ëáµa¡_‚™Â 1<@0P ¹ú[wÇdfmXsdÄ FÐÁœ TXia$`,¼2š=ƒa… <Úžn?¥÷àoàb•ø®)0!·l´™rKJàœA›Q dUŒ4XÈ—Å‘Rü:—CY°×[FÅþ´æUüfvp/…þr¨—;h»,럈—ÒÝtÆ“,nÍñjÞqm&--}ÓÁo†yZänYm@Eeß}‰q÷XzC¬m´ý-ŒÖà}6ø&0ϸ6¼¸Ó!X)î Dñhøߌ:è&-}£ ¬ qrUj9 ·H¨ÖŽk)n–a˜FÔ˜m2µ¬œ#jë“õ·8ÃúˆáH$B9Ÿ;Žõ†8O ƒç¢¾ J¨ "ûa.V„òŒ—tïl“ÆËè)á¦NˆÐʇØÑ%ñD)ü…—ÑsfWJ6\NÖÀ0¼2J:¡0 ³>.BVOdÔ÷¹vFXí‹b"â³Cs3y´)àcS3v²£1¸š»De²@,.oIS£<†!ý´Í°×jvË‰Ë†×Æ°iÙëNiÅ™~„ .À>1eufˆõZ”xÌäÛ)g6Á0HÖŒ¿a{Gù(F{Â÷žQ6"âêÄ Æ(#ëï[/ëQyÊDŽkL\FŒ:ØêA˜( =såüàv¼Ø€|ÍÜ'(' Y›ÌTèT=e’”ï«é„ï.ÂåLqt|vÌÖgT%"ů^$S_ôúËÆ*&ާÞ@ÆBÄbE5Y”ÍÌ&[)“&)œe+z[± »^_ƒg>¹íQ«KÞ:! çÅaLÔ`µåH*ü‹Ù)#ôÍ´øLaáºñfŒ ÿ¿Á!Ñ*6>øµ~oì–¾ð²4J0ÊÍC”á̲açyp9 ’„vãk¼6$=pÒäÄÏTõHç‰Jš,eSˆ$Sà“Š5'AØîá¯ÂÄP¶tÓ Ô"ÕŠ2±&áÑryW@Mˆ8=¾‰ñ'­Ï­ÌV|R4(B6Xÿˆ””ŒÃê)ç ¬Y‰ÚÕ"b¤‘wÌŸã9€ÚÆ¢ ˜|Ò»©¸ ‰„\&ôrûå2ùÌLŽ„G8€ç[ÎÑ)ž"HÑJTi ð|† 0Ü™ÉóÀû!V}×…—ÒsbÇO1&" Ÿ·¨…ÊÃ-¼Y2„Ýä˜n®£™ÅΆÅ>ÍßÂþyFžfêž1^q"ä›Ù™7LI}Æö,ª˜„û§·œiû¬ˆÖMɸÿK†ÿ©¦ž÷\…$ô† o ÞqyAÑx3Ä=.¶œ—„ëÆÇ(¾ÌÁIØþb¸J.¯¾¨QØ&Ìä%ˆj¨ó"pŒ¹mp -(çë½)añI‚ Ik%:«e"íÌJ/ß.B6Uj§œ½¸ NÆÍªŒ¡Ä¤•Òß(4Öe…{v<eÏDºÊÖ°ô(Û]”õÿ0I)Ñ­‰Rª€U×L¹eê:)ÅÃeE„½òæ{*# 3•ç(H•ycê’1ñ¡Ñâzz[ ½¤†–bdKáFêÖËf…ˆÆ D\—dò„HªU3ÅÒ€kI–E¥‹gJ`N]¶f½Å£/e8•@s…&RIFv1¾TÙ²úÁ¢õ(ç s">ÏæËUkAÂQ¬L#9P¹¡÷$ü„Œµ­º)cÕ Ø6L…7å*›KMHa»Je‘©â^¼Qà&€)F´ë}’8g‘~‘† Só¦-£"å÷eÑ›¯™—Òšª•õ¬&²aì¢I8V3Ç$¯ íGNeíˆt)¸‡ÈéM|—îö¹b­â8ž§T7¹Jâ~çØî™©Gºl™±r·C6ý5]ƒ;W¬kÇ%`Ì ,­Jœ‹H‹Ålꇬ‘n—bú+ÔEÜ&7‹¡Àá"Mì‹çRÁ¤eË•ËÖÅ)ý€¿7%“q>—ùp‘Z1#d3Q^>Å•{D‚ºž¾­pióRwÚ„ZThgâœL¥\!ƒIx2C’)ù;¯—2ݵkdøFÉN6®‰hד•)o@¦t̆]“L+6‘tµóÇ‘B †ùúJ”/“i­œ4@X†{Ñ»1¬ ¹%Íž^ÞÃÀõ™šŒ_ó:—’ÑÕSðä H Q~¶ÆZÚaùlÛW³¹(“#Õ0‚–ls`ê5á]ÐX„`b<"¢ §_LH³hHÅ{±~µµ@Ð!F¥gbum=&ÿ ° uD}UxŒI¦rÜ`Û«wêÏæ$}~ñðû«lRç±­Ió¾ûÚ_WV}" LP‘4^>&P¸ef1'õú˜ªbªhx ^ˆ‹Eúä Loo3cíÞ]Ý=*­ëUirq)¹LS{lf×-qÊD`âYŒá`£Ž ŸFùö^ÅÊÎlÀw%›­ÈX·™²I²+Å$÷d¶IA‘-ÊËóŸ¢¶UÊjDrÚ€ü$ŸN5£ãÕý%e¹ÀÞ6õêË&Ú±BV€•:^.È¥¤GPk!?€H‹ÅÖpƒ/…„SHö)0æŠÑëÆ¾.XtÜ´èS ø·m<Ôx2qˆI‘(Ï­Šfz`31ºë.Ö‚ÇŒ^ 8a|Ý\œ&C KûÞvÍãÄ”GÛñÕõ M]´/"à7÷BrU7oßàý¨ŽXµ†ß|¹µY Öš€Û·øýŒâËü ·ÀhýNMõ®+³V‡óöW­·áäÎ×߇ëERó‹Ôêƒi­ßÏrÞ¯ãßæÝ¹ª=´ÕùßJ¹óÓúÐtçž~Û?øþÖ¸w¥:íœÓÞ1ü5Lpüyÿ·:tð>®ü N_x‹¨Ã‡!¦;øþö—·Ï¿›@CÍ ¡Ö‘tÖpíî × Ge˜‘©Ë·uÈf¡ÁÚl½9¦·›ò>…®ì×N¨ÖWV×êöÁßÞ~_yeÏX50>ÐýUèó°Çwjøi'¾?©†‹;þÆt“1†?Õx+Çýg‡é÷ÇwÓ9ŽNsÜ®ãü;ÃNçøËqç¹/¾ªÏ2tcÛý Ø*Ë2.62kQ*”ÉLJÿ–öt®n¼%¦²·þæ![4Ïmª)ÏmÔÏmŒÇ|ž{úM{;ÄðW5å¹u·ÄskçMp|àóÜã£~ãÓ”å¹Í¥faq#ØÇ»ûTÒÓYöžæ»–m6í…m¶Õ탵l³í<¶éª%¶é´ÇÒŽ|¶yúMÏ/côŽs\Øfë–ØfÛzsølóü;ÃNç(É6]}ÿ"JÌ M„˶Tgb*ý(WòÜúª¯û̳Þ#5ÄVä{òŽkFòf«îöÁHåiÁi¢ -`|I6à3ÿŠë«wdë<ÏxÓñÚ˜4f%’y8õë[mjÉH¡Z÷ü®kõñŸüéísv¦¦õÙºÜV—”p¨ñm%ÄNcž†¬/b‹³±Dp¶,KAQÚVPÈŽ4‰v?imªÛ“¯®*ï'íÔè'}‘¯ù’uaÝpí-ïÔÅsomwûàñ[®Ë{î;£_·|·|5þšKL„9KÝ— î½{Å-*©‚­¦D9XªARD×÷Õ†Üé¹ ‘qKyÇBÓÙzj¡él³`¡é¬›ZOº³=uba9ÿæl¹Ž1üYO-4µ šÎã[húߨév:GA MWÁ8Œ_> ˆã7{ö>F wå…ûpö:¼«/áa¶¿óµNÍ›NM®ïK6&dc︎pÕøç÷ˆo±kìÄ·Ø5õ‚o±kÚ©ë¯;ú'îÁóoÚÛ!†¿ìÄ·Ø5fÁ·Ø5ÚŸ@û¾ÅÓ£aæÆ·x3AAßb×>d.šỷ–ux©1üE¸MÝHå”­ÏÄVÂ>Vz;»öŒhzÂÕªäJQÕLoä9ûÒ92j‰ÚÏÖX¯?Mø$8ÿÌ×0+ñBy®Ò£›SmD"¤UŸÆ3õñQQ²Z¼hµ½9”"øS¹MD»(#!00†) ™Iåú€¢ÒžXU³vO%²’¨™ K{ÖÆL™ÙhT.Á—IxÙþž×ö—D$ ªG¸˜öÒLLFâLYR›v¢aÏæSÍE8ò²–”±«ÚzlSÄ=¼Ù2xq®r|§êõ’b&õ#[ÞÕ.û ŒwæWA´îúÜÊ”§g‚«¬½cL²graa£šéâvÈŒåë®FïW`lqbÜb£…æ„·ÑTzzóôž”2i2-­DWm°û-h»(R©óÑ]ZŒŒ•ÕÌØˆÌGÓfì0ã/Kßtè›AæZm6·ó¦šg ©í{çü7~ÓÀà7x4¼¸Ó‘N.ì QÙÑújýÞØ3R®ØOàä¾ÁÀUm”Cx\¾P׊!å­s„XÆ<“©ó¸H©Mk"ŵŠ/T®Ú˜{ò¢0'8—™~eŒ¸='Í–û˜Ž…é@LDbŒöÖÜ!´)]Xµš2I¦8"e´1à3WJ¶v±x!Ѿ²sZ/~Ä´„Æ«gFFxbÐ@‚æ°™8Ò»Zgœ‰™ ÆbdìÀ$´uÊôQ ‰þ U%—ö¦ä5‡Þ¸Ã‘!4—ÃßíDÞ\CÀO»CS_ÃÄϾ¿5öJÞÿÆL†0·Þÿ]qèÓ­?Á©*¦·ˆãoÜd7à‡ž†º^Çl/Í]„¬aŸXHÆb:–gDÝÝÙŸi“VsÙzuëS¼XLVÉ7@_f°uáeýˆ8¨‘Û±e¡@mÐÜù/¦SI*nöbôƒ@4qD–ÉêŽð8†¾;ó¡öšƒ|d07ŠÄÐwÚ;ââ~7&ê/1I¤è·¬^ˆÆLD!(ÆÔª&ì s‹Y.uD$QbáØhQÖEñFó{ÅO%÷'¤VØ:]^ÀÏ'™«î|6µä9|LÀ8Cè¯>è'|9¡ËµNPoGê"ë‰úúËà‡#Üc"†„La ÂDŒPÆ!ªí0ö*á¤Þ—»ÁŠjÛí±ÐhÓ)ç:œÒ3Þn _óF2ž_u‹5ŠO“œ6jvгïv¸²z_ýIô›}3ÜÕ¾wÚãßÎS]ÎÃ]Æóù›QDš¿cÌíh'^-Öïgh~Åf-†5 ŸÏøæ+„A¿ŸæÝœ‰ðüº-Œ¦j8ZOîÇÔ±À×Í¥Ãm¦ø¢'‰ ¬¶-N=”I·Î&®OK`ì.ÂAkë».>ð¼Ê®Æ×çzc¾¢k0 ñáÏ)ÙAÓLùÁÇ+üp7Ö??7KܶÙ1Þ åø__éQ6ÁLØÏŸK;e½%[;wÏ4·`à–®!ÃS†ŽHöP™rÕ) õ,SGó9„0Ùj™ ¸æùP˜ã{Cp$†vPNxQëójÆ%>JÆÀ/Tö¬2fà’0E½#˜Ë=þÞ¸æÜ}™ßFŒ^³z`Œ¨²JÙÌíËï£ç¯€{5Üû-ÿp§î œ³T´ë®í>ÚÛ%âNK˜R¬L…±ŒiÆ™ÂX_á7¸ðÒ`0m|´^(Å„‹h äs¡xÒ®K>EArtÇ]!9ºáÊwÁ7ƒè¥Õ,X@k¸wX@¬‚X”«¨•q—&Œë«ÂnºAû®ÛHl7Êbi¢Á©KÂ窪…C´#ЭTÅ4jõŒCš(…!\“)"›]´ˆO'r¶~LýÒ½µX±Í”ßeKhá\›Î¥ñeòÜÛfØOõ±gŒjØ¥‹I3Ú–Ë)í0„þÁô›]çÂËš+e’¢˜Ä]8ZÀ~ñ’¡¡ ´çJãóQQ±Ìj‚DÜ:;E«»G\2kü0‰¨yÀ”B)%[ÇÃ"?Èq-mD±("ƒŸÒ¯˜"¥³‹|/%5¹}ÌVœËŽ`Ë/Þ9DÝmâ" _¾ä\X+=EÎ=‡1Å+á3ûºtXÏÆ*%^£øˆøƒ‰êßmÈÆà0ýÅ UH¸dE.[#>¦W¨qX¸Å—D2 å™Ë#Ã&doë<ööÒ1Òž9*` Lì:Áb' ³–i=@"V‰ò ’¨j¨/0µ H‚+Ào´D¶và’`‰r+éÇ)­¸º¯BuÃasyC#HPD Ðu$*ÌÉvMÉeg“fÒ[ÓÔ˜O´As{âæiLg$J«ùÀ¶“âË=ÞúçUa’„M¤ìœÝg]^©ä iRûbé\”ñQÔ¼cêaB˜1±gzoÈÚ67S&d§Åsd«RIØAbJ%¸Ä´€Úrþ1SûãKVʆu»Z¥Øgcˆ}^w†äÁSÀga„f€ÏÄ^apáè¥òB%Xcß^(b¬RŒ4ƒ!º^æÃ[égœ«6ÓÓÔWº/Ò{eûrùìº*tÀâ2ëÛ–¢ êýôõ3z±CWc»2®¹}R"ƒý¼†©ª/–Â~Ç[ÛqFœ]ËÈKŒ„Ã$@åêÿ$ÊF„ëJÈŽF¦eý²5År‰åOÊ]R·ªŒhÅèÂÅ£ðÊÇE¤“é1¤^8Ò³^­ç/¿.êÁÜÀM*nz Øv£k0”dKbEh  ŽÃÂ…ð»›Ü–¼CŒí.ZÓ!æ+ñ Ó!†é;·º£ôײ}7³s‡½V†«7ÜîQÃìCTµhm`èà“Ã=jðù§­á› àù 6Œ¥Ñð-+Ü…n¬©ÜôÊ2†p j¬“6R½+p5<Ä{­–V@ k AFæxqS§ Á:°¼S|-ðÉaXãë§àª!tkƒ­µî´äæ­Úè»rRD8UƒY4…ëé|Š› Á(o2Hlr‰1þD„lÚ¨X²Q±ÛoG½ÍëÊTÏ$ú±|ØÚMIKÞy,ñã´3~ºX 'µŒÊ†w ‡Ä©ÏJ-RY´Œ“U¢,ã*ab¨Ü¼u¤"¨¿fÊÉò‘´F&÷79#êºÖcD Î"±ð3˜Š¶GŠñ¾ lŠP)¾ [ð%>Bƈ¢ß:ïnuz XH‡¬tKçÜB|úŒF ÄÍ{߯}>OÒÌæV{ðÈk‰ßäj—P8W3½q¯‹ŽÊfz —™cÔß‚ÜY©Ö.¡Ô<кkƒ˜¼É¬ã€ú&’•‹}²1î±AJhÊò"+ï0æ}ûDS>ý4&Ãb}説¦\®HEzKcíóç—‚÷Rð8ÁJ÷'¸à¥ÈV²89{C0ʳ°·æ%õÊÔÚ!‚¶ï{;MÚ:Ã*KFô*d’tD«OP-_Ò:d"(Bâtñ\þF™öñ¢Yï›éæ“`‹6ù(ÁgéM~íõ D†±1ôT¢Ï˦‹ÃDÇ£¥d—}}—+D€ŸV#â2Ù~¨Fá!:ËË ÌåÞòMb ¤0Rx€;2=›ˆbW¹" ô7Ñâ§-k@ hp[©ù4A7wO;e— íI8/£éËhÊrVÙN€ùêŒ)1ó™âûl)ç²|”¡"E7ñð Š–"T{ˆh¿Hrí¹©êÌb•é#¤ \Lè9¥™8SðKèx SiJ•! •hwcaê³åw¤RÑí”'¦®x†Ï;¢³Q1N+Êe˜ÂÀ‰R¢åm'1mÂs)zëGeã dj%§mdñql«8–ƒª4ʪ#õNnð&Dµ.Åû›IÒh/iÔJßkþ†m¢ó»+Âoˆ›#Û8‰ ‰~ƒ‹l;¤Î˜LU’[=Â6[î7®ömW%îDbÐgw€¾ˆ¶_Úg&œlümŒˆýò$½M*(V%K66!›Œ±Ã3R\„8޽ê)†ÊøŽRè )í¢ªž‘€ÂEl[?îæŸ7}üçðÛqwÁÍÿtï+ ã3‹ŽD¥N&˜Ã5÷WÁ»Ôï¨]€\Ï ô»>ÒÛ7½‚ÝÌߘ¯Ã7ƒ èrêŽ ²0¹G˜—Ööã°Ó¹ï¬¹sWíuI\¬¶>Ûà@”p(&¿ ÛPx4øÍ€Ð*jëímY„;ý÷qÅãÊ!ׯ­ï™—¾ùŒ:;, cTsrp‚yPq–¶ßæññO؆œXa> >> endobj 1604 0 obj << /Type /Annot /Subtype /Link /Rect [184.500000 342.500000 204 349.250000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.mingw.org) >> >> endobj 1605 0 obj << /Type /Annot /Subtype /Link /Rect [150 256.250000 169.500000 263 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.mingw.org) >> >> endobj 1606 0 obj << /Type /Annot /Subtype /Link /Rect [123.750000 228.500000 180 235.250000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.swig.org/svn.html) >> >> endobj 1607 0 obj << /Type /Annot /Subtype /Link /Rect [172.500000 202.250000 234.750000 209 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.mingw.org/download.shtml) >> >> endobj 1608 0 obj << /Type /Annot /Subtype /Link /Rect [243 202.250000 341.250000 209 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://sourceforge.net/projects/mingw/files/) >> >> endobj 1584 0 obj << /Type /Page /Parent 2 0 R /Contents 1609 0 R /Resources 1611 0 R /Annots 1612 0 R /MediaBox [0 0 595 842] >> endobj 1611 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1499 1499 0 R /F9 9 0 R /F1409 1409 0 R /F8 8 0 R >> /XObject << >> >> endobj 1612 0 obj [ 1603 0 R 1604 0 R 1605 0 R 1606 0 R 1607 0 R 1608 0 R ] endobj 1609 0 obj << /Length 1610 0 R /Filter /FlateDecode >> stream xœí]IÜÈ•¾×¯È³Îfl\€Á*Ui€9$Àcy<†á6Fãƒÿ¾¹™d0¾Èä« ’I ÝU"{¼%Þòůÿñí¿/ÿû˯Ÿ¿ýßå‡ýùùÛKv-LÖý¹4?åÕþ~)JsùñÛËÏËÏ—¯/_ëÿÿ|é |ûüûú·^äå?ëÿþzùãÕÿd?j>øí¥EýóoíϪõoÙð³yþ——?üîò÷¦Æ¾9ۙ鿕–YÓ‹;-ÿ|éG)Ú¿ÿøñ÷—_»ñ/jD•¥Î.B+}iž^þÿ^þ\WßWž]ËÜþ¿Óš./ªªÊºëZ”o»²Ð&«Jø;­]¡õEg…*.B”ùEH1k»ýËS;Ý¥‰WwÛoö)Q²òÕýuA¸A2ù(øúýå×/BWÕEä—ï®ûÖ5ÙþøþÛKM¿ÔÄaÌåûŸ.ÿ–eJÿûåû__ªk.MßAûÆÀ7ùò2BÀ2¯°Œ‚eŠöÍû÷zº?6UhžDÍð&•}n›ÔW­:.;tF¿£7¸LÖM‡È®y!ÊúåílߔײÊÚqßÞhB;°Œ¬`;Ý"ª«Ñyӵћ²+󡆳6Ì; <‘°•&¥XގЄvºmf®J–âÑ‘*wÁ(ËVâñý0ë nO(ì½ÀS@Y8Bqo[GdV:Sf¥%ž(ñê¬P`NÝÅopÝq{ŸÜ!ãÏS;M•è»P!.<ë\`Þ,+W=}¸òËW¦„ŒÀµæZ3†cgûé·áî}ËÃE¡ø »÷›„sqWL3l<¡³ðÞ«„3lr£?C…èP¿‘èDŸâõ ö „µÁ7«~z“A…UÀ7¸\›³£àʉ–3*¡ÊœÁÚ$TÀq¯38£¯^…/° ^S8Çc×tÒT"M|Ž"íI24’Áç\ 1ñmåìc©Û}\ êÍ—;*¶O—x#”ùD(ƒûVÁ2¯HSÈ`m–Æò«lKÌ™ k ›[ªZGì·$y %+æÂ snLò˜ï™[|í`ò…}SxÅ>ˆÜL—ê4ødÇ7øœ†˜ÓÃi`hEðˆ‰`@`¯ÀeÆfƒÀÓ ã±÷žT{€¸¶€h|.˜d1ÂS0=`’а,Ƹ \–€ÿ÷0ž%òŽ"vfömÌxáˆIªÅ&¥šªÄ” ÛžqWBùÊ”œê/àE”3«8}'Äv“ÔÍ}‹§›„ƒB}›³ ·Ké‚Äk µO™ ~#z£¡™‡TÛ;Ÿþ¶-W"“}£Ðª‰]â½ÁN 5ÖÓ!ÄmÝÆ6ß ïlu†+‡Ý1xlå° ~£±YŸøµ\p°µ[ø^¸ãì¦àÕ¯æúª„Ü{µaÆ…i'Û8ÙÆÙF`¤˜æX÷Þ!¼s½’Cµ¹š®Ô&ªs/Á¡j£8ð9eªk‘§¯è=“­aƒ–Y¿ŒØ­`‡‚¤¨p( vâP˜Ó=ë·‚fºˆ§<;¾ü ݳ„™¥]W°—…C±»òå˜"Òh‡bŸÄYíÛ§Oùø>eiª¾ÅÓ§‰ö%Þ—«°”´@\f i•,ʾ;ÐÀ¯±±;°»«Ê¸Ìé9fva“<ކÍpmðÀ’áÙÁ#¼¦Ð©v¦ÒY@µop4ïì‘&«Wû®Ÿg®æUjPÛ7ì•ø ‹= =g˜{&»á¬° ö†RUôžßée&TO§ý4¡fÇ7¡>¡—qW®¸¥ËèÌ8L/óÛí¶]zªZ[RmÔ —Óé8%ÈHA7š‡¾½!5Ò~ï?;s2cðU¨)Ÿ9ýg´EÜ•ÿL«áóôŸ±P¨—Ù]¢¿ÃÎÎ`Vñ´¤ÊãÌ0@¯Ð.C×\«ÌŠ^9mt¯ªa”t‚ëô£±ëñ¼|H§‹N2ÅÚ$s8¿ÓZ[y¥¼7ÞñHŒ>æ1bP·ì!䣩õìUfÀÊÇÛðô’ÉÌy7Jð¼r0×é%y>/‰GÛðRAsÛ S|„ãoÓÛP–Ó‘Œø 1¦ÀÃ;ì¡ÒW fKPn<7,ïk%g|ß‚ræ³økδ¤MºUYŽ)NZfEù¼6@Ú¸aìj”œJ^æœõêÈ€ {‰ð"(XòøäVpAõ³#æTb¡ì¿èò´ìb‚>(Ow©wÔ2èf 8`á%‚Ö-âódcG9Vå(BßÝÙ3 ðÃcîÅA¹ ‚€[ëí«Y¯qÌ#)p%U srwm9ïW]6m¸zL#x–ð\`MoÅ´ëÈv„lâ¸üÊ‘Hxp <— *s‰Ä–<¢‡_åâ¼98}™E€‚f¿q\9rÆ-ì5%`§kÀsqÈî® ®vÃ%³ƒƒchaB¢0Þ×”2ƒÏápèÅ'AfŸH Ø ùLOv²§“=í—=ñ^šM™7Ìžñ~OƒfŸW{¸Ü*‰”èAßÉ¡ç3s”ƒÞH¶à»‘)Åp±^à¦Sü2k ¡{F6Èɧ rÔdǨ9#Ÿ/²1¦­P‡‰`>´¿açl™7wY˜íH·mFq QL'ê”:O u"s…ãÇ'=IPbÔ+Zô”ñœÑŽ´E܈DQž{'Ì’‰ÌÜ àè"ÊÜ»V;­+´Ìò~Ø¾Š•Ah÷Ä̧c•=Î(vMaû*FÞ@Ž|ò‘R°Œ5«óû'pÎ?îö`Ÿöød¬> ŒT€ý:+ºOK¹Ö™Þ{²4"KÛ%™ØÆJ+‡1fv»tQV^eë~)óá€ò¥? tÞ¹Ù˜ÍUÎ\zo¬e*TÆÚ|µeƒò_©©Q¡BíØST~UBz5úâªfÇ7ÔŽÝ­ËÚã±á ¾ñFŠgÔ:î=} ôÏ^98oõ!¬¶„os×Ç}µa*©bS¬ÊÊ)ÉZøg!çy=N.|cM;"ïÏ™·É•ps¸ðp¢(ÛÕ…îƒÙ,”åÅ“ë6"dA¸×¤ÕÆsMÙp¤‚”Âêw• 9’°ÌHŠ-R3N¹¹¾¹Ì‡NñÁ` >®à²¢Ü©¾À•”‘;sÍÏ,H¦IåD»)n3Ÿãã¿€ ¯c´Þge =ð& JÿFHó$! §"'fðŒjXýäm3'ãG­tXR7ñÛƩ%ÜN,ñR铟gµ öÀ¦Á î°Ks¯$þt{³´–'˜‡+^’¿ŒG¼€WQ°%¤ø™7EID‰›µÐAYD#Çm ¸m<¢¬¬òÊ9ªñºP’ñYÀàlSNœ«…oc–À ˜c”ãÙ²Ø[Æð‡x¦.WÖVrÅMr­­´­)Ç‘=˜þø€ ËKÃõ|¹º-K,¤sÔP½*îö2¿æ³ \¦Beú$ÞÜ~)¯¹n§Á~_-Ý:ˆò: ‰Á-Ûp=+ÓG¾ÍßàÚìÞÅL”Û8ZϬHØN‚5€s@êµD}õÙèùEíôicÕµ*Û†>6¼Ú2¶îÐØdtã¶tö¯çHnµrsÍÜp0ì'µ{Eö¯á_³Ü_VOÉ(ðø!pµSîž~„ä (:„ô~Ò¾Û‚]oÌ$Ä„ItOâ.bAâºV{I|t8i7V1kÓå¦ÇåµåWõ*3~ð·—o^‡I7]˜N#Áúu7ô!ÉÑ ¦Êxh8€†t$Á¨zpC4=œl]d©7DÓ…7ÄÍɼÌlh+(¿4áU¦*§;Ââ¯ú˜$Ák~I+bÇ‚8Ò៰­˜ ‡ki3¼¶X姨(„Ôƒ€¨g¡KÞÉçÐÉcÇdRâÛ(ÄHÑÑXŠñÝÔ r°,ò—7 Ÿ©á ÝfR/;mc…÷ †'<*n_¦uiO§gÞpYùŠÄ…YòEà)t˜Þ¥’•2êÄZ–E•ß]å% Rd-E1XÉþuÝX³¸–°­7smLÌJ©úÇzÁ ˆ3çž0B$r`aX‘yDÅ‚HHË Å^X §/£ÕÔ;±ð²(h5”2Ÿ` VazaÕ)÷^­›Z¡÷z.ªAByP;=€ëƒá%0Ê] &\ž@m¶oŵ’Nt$éîÜëÀú¬¾¡k•nÈ!ØøÆ®™ŒIÌgA°%B8¹â¹–ªH²wÆ´'ád`zMu57e§0gmÇ.Ü*¼·+Àu•O³Û9Á¯›ì5ÅÄ·é0ßä"cå Ÿw7¬üñ«çIÁ\Éð ÑP¢þY·õjÈOg‰'åwsbÍžÿg“9S"k2&‚5rÒÔZ×UÃ*xÔsÂQø(¾b‰Œ’Qº2~EþÄ7)u—”7lIákáÏ‘8 ÜVL w­ì"tnÛöh¦R^H¨@$-¤•YWIŸl¶Þƒ*¹@Og1ßQÜWÊ'Á#™gô¸¤å oç — DaP4a¼+)—3"â¼åi¡ÅTžžQ‘ñ›µ°öV2”³$.ST—%6[JÐ^ ,WºåvðþÓ)fÇàÅ~NÆqŸ œ(»e1ØA¾Üé¥QÊ|b-SÁM„ó;û+gæBEˆ%$ß›wBm*#áÎKòB1ë#¦õ484L0”ÉÅ&«úŒ'"öñ¢32KÑÏó |?Ó+óôD*o€£€;ŸQ¹À&Ϲ®à²åˆ'lȹûf9ƒÀS<¸,yy©Y–=,‹ý·º–eV\ò¼ý)D÷Ô\rÓ~Ø|Û=øñ’ë«•,KÑ£&U¨qõçÝ¿E[èâÎÜÚÓNÔß”“*Êiyyý]$†]v [—ý:c+:òÚÏöê¶êD`°îÝÑ|oV^ ˜›Dõ®Ž˜&Í”R7‡‡Õô°é`5¤åøA€´¢tø[üüÖR:M.€ñ£([{ ÚUÐI䫨’q^Çe6kÞ°=y®Ù´ñ\Lµñ\ú´ñ\;ÊrýÀÕÆ›oÔ¤ 5n ×Æó̧›Êi ~àjãÍ7夊rÚ@|m<ïáˆ4äÓéOw飄f¯uT:ž~šO(r{Ÿ·YôVaÉÞ„ïNê‘ <µá;«qm”Ó /,ÚÁV{å`ȘX´FOåIUä…;#„Òò–Q"!§]ùXÑ–avôtfµ™q#C®f%æµÈP@QïEG÷W«¬¿ *™¿šdù#Ü"ð=/!©zžrh§ÞŒ¥ƒ¤÷ÔEÞÖ§Ó5ÒRÆ<*uy7É´–7w5dmÞËÛNžÄÌ“6}°[ëø{Í‹&È’ë¿ÄWÍëã… Lž?¼3:î5+¤fhÖ5`|zÐHÉeq”4Ùäð¨Ì —k™íϳj`\éQ[`m¶E8b‘¶ÁZ7ÂÇ“ñ­uRœBöq!»l·Ò3]c s“O>Ù]ݤ6 2o€²ÞA;­ë,™®÷ôùwÔRˆÅ$íòïÛ"zâ÷šµh–bH§Qy5~ÐDuÇÙMCSª‡A'Kdð ÈgÀp#†rwV¿ç9s9bô¼y+|ÍpYÎ+\ œ÷+ ÒZÀ7˜Vpn:|È&Ç9ɯè ÎòÖ:º¸”Åt©’“ÔÊwoí :—ÙßyôxE%aƒräȧ¸Ò›ø)NÜÛ­™mé¶Am•ˆ›ØŠŒæ=‹<ÇèRqPÜ×Bm¤Œ‹÷ÆL ˜ s\cC±¼’òª F²%›Šb<¥¤.Æ…¤\ÁâpcŽª9Æ-±MÙÍ„žMÞz[eÒÑÉ÷ó³eLýƒDðSnÉøp¾&kÄRw謋DtšÊs§Å{r9b_ºÌÍ[_pRÕÑ’Ö’,[ö߯å°c9LÈ/.׸gaû nµå ™ãàÔÆá†[ŽÆ}žpMÅrø,ÊÖkS > cÄøA ŸEÓ…©Œd5¦$>S¨ý_À™šêŽ ÎEÀtL‘Z'¯JÅ«â™ðªRå©yUÓ…eg‹3Ú’;ô$¥ÃŠ`Õ ™–WЇð#ŠA‚bó!œƒî¦"Ew­ «YP )áZ.—¼+¿${˜7ÕƒwY8líQÂ+ ð†xIɤÌè=xÀèvB->ÒJÄa`O²lyJŒ+KÖÛZ)Ú îƒdUvÀLb^ÿ:£—ô [”°ƒÇc¿HW𢚢¨$¾s$îÅ$“Å‚˜™“=?°ËüÁÇž£¾Ð ꪖª?ê÷t‡å*Ti¡XÛ§yý °p­öÁš¯æÒuøÆLë0ã6šÝÙÁ¹:å…Û†h‹LúQcûÙ×1Gƒ »¾B˜6¤@˪_†äFGõ†ÈEâx œáúyye;î¥åoSÇíæ’þòQ‡6ÎÎm¯.™îîö3­ÃŒÛ¨£¿zÄ)Ÿ¹md3êh¾±ýêß_’Ž:¹/@…wŸáýL¢ø&ÐëwXÓ|coæcšJm˜€wÜpÖûÒÇ;ríÐu ´>¥ýö3­ÃŒÛxG”>-o*§k}ÚæÛÏlÂ;ÆhëéxÇ€S8Ò¹ZÒÜ6Ó£`hF4ûd7)H Ì(…JålÏúKí7fZ‡·1@QùH (6ê. 4ßtý꘎#- ”}¼j ÌzÁ‚ùI‘LÌúáJšC€\(ÀØ?ŽI›æ‹eTXUS*¬ÿá¡B“É)…4*ì¾1Ó:̸ «ÒG…UáPaýÀ¥ÂæÛñrB…·6R¡ÉL AØñ„¸{R8ôãʘA`¯/ëøBWÊå\+‘4æÛ–¤KwR¥q#J‡ÆEå£q×Äb¬‰eLãí7fZ‡·ÑÓ¸…‡ÆpLE͇ÆÛol?‹1ÚHIãR“Æ)þìYˆ2Öyõ_ùFÐ ¼dãÔŸ&wÄhäDü¹#£“çŽÜúrÞÁ{š££Ÿ§ù,f‰Ï £9ô;ªÍÛÝ2‘“•w»Ì±ø¸ÒŸ>»–6É¥b> Øf+IšŠHÅ¡/Ç—Š§êtCíMg äE®•ä8.ç¡DœR.ìœÓ)aK© ¦×bÌà2t”‰˜÷ºèÊk©0ì˜A’(¹'ۻ𜤹)–\ÖAQ¾)5%óŒ*º$Ôqö… –9íÄfXÕÅó|™‹,»kAÍÅCȈ#`E–;Ç@ð=VX⢖ͺ4óÚR$ á>X›ú°ƒ²0Žƒ²È}J7LÇØ0±ƒ±ýÆLë0ã6e¡}ÊB¹m¨™ƒ²ùÆöSO”·6R:(Ë>VAÐèû: ”±ªÉnF_K±×½QÀ.ÆÇtådgXÒ1aAòÔZ«ÎÑœ`OHå]'^ÜßµñO½á7ªDµéeYa¦ÒŽ´®ŒOZ»á|Ɔó¥m5ˆç[fÜÆ ­+å“Ö•–XÉ™´¾‰ç¡Žé8’Jë<è”Öb*G‘Öø ›×† ?»âÛ”+¨Øx}.œ à\ø2€s7¬3³ àî3­ÃŒÛèy}.|À¹n³ àöÛÏI𨔼^ôÀ8hÆÚÍÓ@Ñ0C ¯uc ë\cɘk܃Ø0AÁ?½¥cÓû”ž¼nà[žƒå>˜®êJM¥Ë®+ #ørÕcØ@¡è|·ÓGðÝúr”¾3µV­5¦B#KG8®‹}Æ ±B«Å ¥TtM˜#½ -ݡŠ(ºC_0íd´Ç±øD6m8Ûå]\ûT+Ó‹¼})2S“O}c%}#¦›UŽè;˜"£—áÐä…ƒøVó"Ÿ3Ñ ÁÌ‹â[÷™ÖaÆm ÎÄ܇ø–çN(ióÀu&æ=âÛ­Žé8Ò:‹< Ÿ84‹˜Ô‰Có0õ—Ò\^ùær7¤+¯fHsÝ7fZ‡·1PéCš«YŸÓF9Cšk¿±Ÿ ÍÚHIýÕ‰4w"ÍmÆ‹ÌAš+2Ò\á†òb†4×}c¦u˜q=™i®Èœ¤æCãí7¶Ÿ¤¹Q i¼ú®O†éšÆ`X¨óLGà7ÞZLo0¼õ%`GaÝ%[¾ss–©Çu„Àa‚pÌཪ,Ù‰7e¤„ Î \äÆl0ƒ0£(«ø:O6øËZï€Ú€îXpásum;ã!MßÞd#†^ÿ½ü¬;Ë×{<ÀmKß@U½w3ÑÄÐ\Œ]Ë|”ÐÍBáÑ|ºý!¯²Ëܽé‚óù«€È«á1O)á µ£îÑ•¯o_ìHÑÕê˜jw{cCo> ÝÞ8Ú ËÏ0® –±[P,úH'¢n¸æ÷ºÇýB㹃 Ëz¥-èÁ½Y]6ž7´q­½a´=aÃÖMèÛýxs:ØžØyA fˉ}äF^äêãdМvE×É1=èN#½û®4øzùúò/ÍÝ endstream endobj 1610 0 obj 6777 endobj 1614 0 obj [21 /XYZ 37.5000000 547.250000 0] endobj 1615 0 obj [21 /XYZ 38.2500000 511.250000 0] endobj 1616 0 obj [21 /XYZ 38.2500000 511.250000 0] endobj 1617 0 obj [21 /XYZ 37.5000000 591.500000 0] endobj 1618 0 obj [21 /XYZ 31.5000000 474.500000 0] endobj 1619 0 obj [21 /XYZ 31.5000000 122.750000 0] endobj 1620 0 obj [21 /XYZ 31.5000000 122.750000 0] endobj 1621 0 obj [21 /XYZ 32.2500000 473 0] endobj 1622 0 obj [21 /XYZ 37.5000000 547.250000 0] endobj 1623 0 obj [21 /XYZ 37.5000000 591.500000 0] endobj 1624 0 obj << /Type /Annot /Subtype /Link /Rect [60 86.7500000 153 93.5000000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scripting_nn2 >> endobj 1625 0 obj << /Type /Annot /Subtype /Link /Rect [60 79.2500000 168 86 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scripting_nn3 >> endobj 1626 0 obj << /Type /Annot /Subtype /Link /Rect [87 72.5000000 135 79.2500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scripting_nn4 >> endobj 1627 0 obj << /Type /Annot /Subtype /Link /Rect [87 65 127.500000 71.7500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scripting_nn5 >> endobj 1628 0 obj << /Type /Annot /Subtype /Link /Rect [87 58.2500000 114 65 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scripting_nn6 >> endobj 1629 0 obj << /Type /Annot /Subtype /Link /Rect [225.750000 749.750000 269.250000 756.500000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://github.com/swig/swig) >> >> endobj 1630 0 obj << /Type /Annot /Subtype /Link /Rect [531 749.750000 548.250000 756.500000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://github.com/swig/swig/archive/master.zip) >> >> endobj 1631 0 obj << /Type /Annot /Subtype /Link /Rect [407.250000 686 423.750000 692.750000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.pcre.org) >> >> endobj 1613 0 obj << /Type /Page /Parent 2 0 R /Contents 1632 0 R /Resources 1634 0 R /Annots 1635 0 R /MediaBox [0 0 595 842] >> endobj 1634 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 1635 0 obj [ 1624 0 R 1625 0 R 1626 0 R 1627 0 R 1628 0 R 1629 0 R 1630 0 R 1631 0 R ] endobj 1632 0 obj << /Length 1633 0 R /Filter /FlateDecode >> stream xœí]K¯ÛHzÝëWh=@«Y¾€ €íkÈ"€aY ²<™4݃8³Èß)%ñqJ¬£¯Š”.Û˜¹÷Šb±ø½ßõë¿|ûÏãÿãøë§oÿsüá~~úvÈNežuÿÛ¿Ü~ «“ûýXVùñLJŸÇŸ‡¯‡¯Íÿÿï["g<ã¥#ãY=¸”€Œ"2tMXtûI‡i¼vƒR÷ü{rÕ<¶°yc ¨ê8cÔͮʖÙFH©›‡”¶UJ¤••…õEñ}^º2y¬¥Ï»W …ò--‡ÏÚ–0ƈƒæº¸ôÒ:+ëX=ïZ£xm1”jeɪ±áÚòÕYkéó®Åµz‹P¼´>u^Ź׵ånrTÚ]G¹xi9|ÚÌ:ÀÈZ£ÅÅ—ÎU4i~Þµ¼5vÆ(^»¹OÕEVVþN[c:×´Æ’4ü~øõ‹²Ík¨âøý¯’>°ûñ½}µòø‹Íʺ¹ú—ã?5ðÕÿ|üþ·C}*tÞÃÛ]ù ¯|BW”EW4¼Ç(x\M} ßAö¯Tpˆ{à›bˆjø>üà{ð›Â˜ B´SÔð¼kxÁÐ÷ÈR¼gon ÝÞ>o¤blP©|—/+t~‚ïƒaíÁ)Á›ÖÀ+›vN¿ËéÆn†Ó1Dd9ã$ÜéŸáYÎÐ3<Ï«)¨íí—ð{ÖçÀ ÊhGog>‹eo#öË;î+ÍP“ð5[;ä€|QöûÁº˜`eš§ª¯«æ¨j[X»è¡XAí©ÁÃW`µ¡‡*Zö\Å)†æ&O)®Ò$ª®=5é o2u¯Öëù¼K!ò©òE÷T„žc¹;ÍE(hººpËŒ[â4ÉÜ?(àsàAìQÌ…Œ?¢+ø}œÜœ³Å¬¦ )Ê!ª<¦6tž·˜.†Ö2UWÂd]ù8ÎÅáúP&¿3ŒPŽÜú5e¢®$“æõ‰†‡˜c BbÌÍP½»øíšYbãaªbñjˇL–hW‡Ä«©Š¢tÃCøXFÉ&h°ÏðU÷sIC¨>m+V¹DB%U5 ÃâÂRÙJ$PùQŸÖe1òÂða‘„…Gpq¥PÖØCNLÙÒòŽ%F(RuçËKá#K¯dÖó‚ŒÅÜCØšuî”ÞfKDjK¶õ˃~\Y#’g†,.ÛÐ.{·*vK²Êt~—)¨"¹3þíúª«t¥«Ìö3!ô[l°Åð‰«w¥ßì%UWº›ß0g¿¾!1h ºâ©p—ÕhXaÉÂÔpâc¾,/ð ì3ÉCb‘ég?˜ñM–ë}Ù0‘l{£Gùáç0V'P©>ŒÑ"Úiãò7s&ÜÞ³²jÏ]nGj~»Í0ÛÔ–“×`’tËã²>*¥T°èms¤J6ÇØðÀ| Y öqÇ-yª23äf\ ã)AÁ€ÌˆOb\' ŠÇ›­?\lÝñ~0ÆYŒ<ÃWïa"Œjö5òxch—íˆíFÚ}ä—vÄ,Ïo?Y£ñ¼‡¡lY½¯m‹%Û¯Ý\u«J;¢“g.Q^¿Ø1fi›®ëÅqýšë^â{óõõÔNìƒà÷Nu-œÍá™mƒqò ·'×ó œ¤:©“™¾â¡Š{}Èç—bœyqNŒ>'ÓºœÔ'¡8šš3»™{>÷¼Á{àœWê5§¼{LMçÄà‰8x†Ígb58ÃFãé6x"t´‚NÜ›g?xŠŽÁö0¦ø¦Ìá#JRa¡BôædØ~ð̩ѱXÆ„œãXæ"ó 6™>ÐD®3• _=,àÒÊßÅ_¯ï5Û¬.ÀU9“B§Táf÷Çp åÙµÈqW0ˆM5&¬.~wÑÇŒVî¼ÑoÂY¦N—Èxh\SZ’9;€åY#dší…ÃꌩO„Õ…çéc=¦3«º)lW»A}“J¸ïæÆ6ëFx…·`×EÙj5Äë^‰.!˜L12·~‰RÊÁ‡0D¤<]æ#ÊK5n|è¤Ó)²Áî‰Àa×ËkP<ñj‘ù]c'òñ›Ÿ„¼çT‹!êí›]au ÏÔ¿;ÕG®4stŸXªØß´eÍ%æºå¦-¢ÁgoÚzò¦­˜´¯Êñß3§æÀNœ¯:‰Sœô¹¶gIxöw€Ñk0ûá]‹!ÄïQÛkiÅ3RO˜ U¶-œ"Ë$Ú°_H™LS›lŠ;nå«pM‹”ôµonÁG)3»Æް\’:;òùÒ‰@Xzzäªlž.1õOWa£€Df;áP¢lJ…`Ã}ØœOD¤6Ç4îPØ^Þ,u×Ü "t†œ)ùœJq§*Rx†#Ûd$æ[Ùáƒk¥ª#Nx`~AÔ¾45Ԛ̀T†4d½”-^öÜó*¢å;žäS½Äx(}~ÚŒ5 ¾â ¶‘ˆR« .èZ_$¥Êlæ%äwÓõ5ƈÆ^òò‰zLeFm]3Cîªhî9ØéÃMÓxZ¸d¯žÍbœ+¥r3EjçKN4@~Ò“äsϼ§F÷ô¨æÔi»#'ÜÑWØw ïÑð ~'5Š“9Ë™Û7Up5 kø|ˬÍ\QðŠ“ªèó  !Z„ïíÊoú1Û¢™ÂY3*2™ãª<ÕzÄðé¹äñÜ«ApôI]Û;f?¸Z2&«Ðèg±M÷†ŸãÛ½÷‰nÜäÅeª½lÏÁkDezD n©ÞÔå‰H|n`HÑѹEÅã˜)ÐT×_$¦ ñ¡ºÈ‰sý¥MD·CŽ$búà_#ë-C[¢ðcdÛ …ô¹­†:éa§´LJ3.ˆ4[0tˆç`è( üœÏèŠ ø} ¬‚ÏÁXÀ4*X^2ÏåVÙ!›;¤õ©°Ã Œx ì¸}™D%B,.î0·ƒ7¸kü¦UÆBô&j^/ª¾DÈcÜ‹ôÒ`¥Gd ¨<¤h;Çb¦®å¼ëf¶Åé‹ë;:²Åx× D‰™žlÉöf¢&›–ÏŒ˜óˆihy‡¥'V²bÏznFz‡© ù–*)ÑdIÅÞSIÖåº>äÌÙ‘ k—ßq¹S@MäyÎÀkª. ¸“4=:LÞ¯F$9›|Që-ºæ¨«rôöúXð„˜ÑaXcVÂ;Xý$4,5!‘8¦ ˆ6X®ö‹lDZ8g‡Ò ÷ÒQÑUe¶¢Œ ÚÜp긇\¨ªRË%øÚeo·Ž¯À3&ð‰xs§O|Wð‰Fr¯†OÓÀ»ÆW0 ÞÂßÔs¢Ä>ŸÄ…Ú#Ê©ö†éÝ­xŒË ¦`‰BPc¢ò0 <Œæ.!ÆT=U1Ò=De€GKL ¾õ;dcgº‰­zưyÌ£J‹|DÇL0…é¾Åm8ìPYµá1|+Kÿ²›ÍÐpÀjÃå1°ÚÆ;`ŽûŠž!¯l¨Ð£×àí^7¹Z€›"1Sô RñÜÞà=Â"ÓÒP‚OM¢1UcË”vØð[ÑsïˆNxG3z5›°ì£Ìðœ#™w× o ·ûìŠV™©r²ùÄTM¡ë·ã3ôÀÄ¿ˆ³ <î/Nž¥êÿßè鑾”X7ŽîªüÞã3”•Cà®W™d°PgÕåÉT1ºSò\(Ù¸#“Û¡JˆÙÝ©t5Aµô3ù•9f# ¯la_áQ<×…é>¢hQ$R˜³ú00aG3Õ8²]:ÆîB¤€²VU#ÆŽrÙÌ,‘²¼0µ&j¹Rýžâ«ò.4„›Áøâˆ¨ýChlZ ËÆdk£ËÄó>X’Šò®L¥ã MÚà°©-{Ñ/Bµ¥2u|8Ú–èܬׯ¦aºŸŸ*ÓBx!=©ÑR®ÇúùšM9ãÂׯÛÃx^èÈ:ª‰¢Ó[VäL Ñš¤¸é¬ZU#‡cõižz¢@ÖàrN\íÝîç\Ü(\ÑfJ>Sœê9›+6-$Ÿ{f=ëdLZY–Keત$™ÁèÅ:ƒŽ‹ð$Ù>3‰‘/Ux£º^ô+>Ÿº)&æØŸ‘«_‹ÁaÙÄú F{J9µ§SïjÄÿa&ºP|M€? [²‡å÷°ü£îåTíñ²í4²Gn›íàßX¡8Š„»ûpkÅÈ“M|}µ †›É‹áföÈ‚s'ŽFD_Ùq_¯+D”Ry ‰¦ý+mýZÃÝGÚ€•‘`ÉFñIOö¿1~[xÔÆ/Þ[üCv:Øêòþþ%F¥% TW£Ï‰y<O HeÇŠ5ÞUc¸—Ãú"Fwq@˜Y ¯v»øíÇèÃP²®J8¸Jgæ%Ò@A$f?„¯¶{=YoÔcˆ&!Ø¼Ø 6½µ‘õ^T7qu&‚•êPE‰•0Áõ'_à–cw¸á¤$úŽBº~žéŒžt^‘V…nTÈ+ÚëéšÁ• $)å…QÂç„’Äg6Xïᔤ*Oe]Ì5-Ì©ÏnûZŒµ3|B«9iÛr³Ð(Ò¨zbX«k«Å¨ñö® 9³š†W0 z3}fo€ÙÁ[øs<«}{»Ñ昲®$©¦$Yê£Õ…)N-Mÿèÿ.OU••Ç2;ÿTª:Z‹úÔæ>øq(ª“Rµ®*Õ§¼]ÂýåÐ|½û;?ßtÝlǰͣMØ£Û£[bø?¿>þi 5†ZÆ *¤•²åÐÂö‡«Ød.,ñeðôq"@ylDø‰š»Œß‡ñ—Föôgaà-—L;}ªhEf85~o¤ÒEÇ*$ÐNlÑôÍ}ûÁï‡o‰Ê<ŠÊ¼˜•y5’dÍcQÙ~§¼]Âý•EençDenÆ0QÙ|äöhoEåõkŠÊâR%û1œ‚¨Ã$qá#@âFâ¦Ëk‰ƒ\8¾Ç„jDÓ ïGÃ0Õ¸:%5Â)‚7ă.u¼TVú"«;ÕÐÊj¯DVö¼@iûúòN *«<<Ú~ œÌtühnÉœ\í¿Ó˜°·k¸?m/4ûL'SG÷ëñ3ôùƒ}´ß±Ã5ìð¿´T ¹¬Î8tqm7Å ð©N%M4°ÆÂ^>Õ-Y¯üRîjÚâSõÜ¡«üöƒ¥ìU›{Õv޽êbDúÍcöj¿Ó±Ïe ÷§±W­çØ«Vãg¨ {¿c‡kØá3Öd¯K‹²úr ‡Œr†TŒ8¾ÅSÖÊOP*åÄô?Ux¼…²”‰Ê,»0Qao?XÈD¥ÒC&*•™a¢RåCo?1Ñù;g&¹®áþÔC&jÖœa¢Reãgdc&ê¾c‡kØá3Vd¢òÒnŽDë™Î¥ &ÓKU_ÈQW·´äøõðõø³ñ•,gPðõÞd™«9™†(3Õ½Žú’gVPlu6F9û]P]ŸôY8Þ^éÆbzż¹{\ÐíFh(ˆÈ7ôsolÊÜÞ¾¸7EÃ%q‹Ÿ›#¸Ø¿˜¾ “Ëø\ ì̼†Â«Á{œVA¯^^éž%¸ö÷fÇ=¢1ì ¢1q`D»ìÖ&0ƈvê|†^= «Æ‹À¯:ƒwW‹˜´!M¸4³]²> stream xœíÙkrë6PíY­¦2Sñ(| AŠ ¾KŸSù!‘ л;¶ïû À1/fvvdv2òd³³› R‚ä R‚ä R‚ä R‚ä ÏH‰Ó»xÆö9XRâû¶èp1lÄöýÌ;#¯ˆ2=% æ¶ÍN?Õéœ ÓSB«y$'ÀÂô”(×Xÿ>ò¿íõ9fñ¹ÿÁv妎nùÄÒíêÂd˜žW¤™ž¯•ÅÝÆÈתŸ¼WÕ´þ¼ž°ñàç­Í§›Ú»Õ˜³éÆ ´WÙÛ{ù!WÍÃc„¤Äëß>/~ŽY_ܹùuýlãÁžÏíísb鞨ŽN«Õ0HZJ”iÿ€VóúðÍÒí¨Ö«´?oFuZZ^1Ýô”hÔ~OWÙ¼¸÷u¯{V?T‰› õÌhéþ6ÒžjDLÏ+ÒLO‰u]ì}]ß»ØYwß<Ø¿©Ÿ+í9O,ýskóÜú§Ú<ç/MÏ+ÒLO‰×JûîzØúbÏ„ë÷¾–A–;jÌóåÒ”S5–8çªyxŒG¦ÄˆM­ óÚùïYú¶]<2¯øÆ#SâòMmþ páü÷,}ç.™W|ã‘)qC«¹pòÛ–¾sÌ+¾ñ¼”¸öo£§½yéÛvñ¼¼âKR‚ä R‚ä R‚ä /fvvdv2òd³³ø³ùëpƒ¿{Å_ûO·:]Òjt íªV£Û Z p­FSo­ÆS o­ÆS#o­ÆS&o­ÆS)o­Æ{­ÌŽh­F[·š_X/Z Œ¶Ùj~[Éh50šJyk50ÞOüæJÑj`´ÏêøµÅ¢ÕÀ~m±h5p³§ÖËÞ_¿ÿß".j5Å*À=¸"¾l)~ìúÝÜmül¿Ù ÇoRÀ{äïSþh,\Þm4`ÓU?Þøa(}Ùp4 Ó¹n£É'j8ú ð²áh2À%öº&\nÑpô`²½h2ÀU4à6ú pMþÿ$ ä›ÝNZfŸ p™Ùí¤%?B ”_Èù¥üBÎ(år~„@)¿ó#Jù…œ!PÊ/äüR~!çG”ò 9?B ”_Èù¥üBÎ(år~„@)¿ó#Jù…œ!PÊ/äüR~!çG”ò 9?B ”_Èù¥üBÎ(år~„@)¿ó#Jù…œ!PÊ/äüÊÛ†üBÎðr‹ý^µýûOòû§¼ý{ým‰¿ßü^+ã7¿žX}=ù¹©N¯Þ¿åÍÍnn¡ÿ<Ç…}zæÏ¯nbŸ¿ßü÷lNgéz¤sõ;u®^Qû(.ßã¸CûsÓø*ù'ᦽ°µšrÌf«é<ÏÆ¢çZßUþÐ4¾Pþ äG¸Ö_h=ÿ[ß°žÿµïsLÀϰӻØ[½±Í½1ýƒºõ¹Jyhë9g½Žò£äÇ™áZóç€Í:m|m_ïdæ"'ÛŸ®´7Ò¿‹ö³1ýƒºµÕú(:ê†×±ø\nmºþ—8K~„k‡ ­]¤ý ùùÈf ýïÝ:½‹ö³1‡f[(oõDuâ îyå^ÒäG›áÚ¡Bki»jË]žÛßì¢ýlcLÿàÅ#‡n5¢:ÝNÏ|h•E&$Ë3?ÂMWiOáß“Ûßì¢||ónÿཧ:o5V9ÝNÏ|èu¼þQnmºü8ó#ܳ—rï#Eº¹—Æem^’Û=–¶‡ýQÿ཯·Kü\Yrû> endobj 1648 0 obj << /Type /Annot /Subtype /Link /Rect [87 771.500000 123.750000 778.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scripting_nn8 >> endobj 1649 0 obj << /Type /Annot /Subtype /Link /Rect [60 764 161.250000 770.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scripting_nn9 >> endobj 1650 0 obj << /Type /Annot /Subtype /Link /Rect [87 757.250000 185.250000 764 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scripting_nn10 >> endobj 1651 0 obj << /Type /Annot /Subtype /Link /Rect [87 749.750000 160.500000 756.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scripting_nn11 >> endobj 1652 0 obj << /Type /Annot /Subtype /Link /Rect [87 743 120 749.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scripting_nn12 >> endobj 1636 0 obj << /Type /Page /Parent 2 0 R /Contents 1653 0 R /Resources 1655 0 R /Annots 1656 0 R /MediaBox [0 0 595 842] >> endobj 1655 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F1409 1409 0 R >> /XObject << /Im1637 1637 0 R >> >> endobj 1656 0 obj [ 1647 0 R 1648 0 R 1649 0 R 1650 0 R 1651 0 R 1652 0 R ] endobj 1653 0 obj << /Length 1654 0 R /Filter /FlateDecode >> stream xœí]IÜHv¾×¯à¹N1n€1@K%öÁ€ s0|043n FcËsðß73L%—/’ñå‹ “ÅZ¥â|ñâíË»þòŸÙý#{÷áËÿdßÜÏ_^òSUäÝÙùϯ·t}rÿΪºÈ¾}ù‘ýxùüò¹ýûÇK÷—ÿÖþëÿ2ýkûÿ_³ÿöâŸÜC羿Tªjþíò³©Tû¯üúó|ý÷—?þ’ýý¯âÎÌ?^ú¯T—?ÿøö÷—wÝ÷Mbu¥m¦¬iÿj¬Îþ÷Ï/9µR}»RÙlºÚîanµu»Ú2¯Úá¯ë”VÙ“‘yä?! T~™ Înf«[¬ø’xuQFÞhdyàÕE•ÝÌV¥^Ì›ÙQÈ5—e7-à7SR¨Í¬gÁ:«‹+øÜ/OuéþƒÿæÑ§±eK½U=ߘóSX8oc•ªJ[åp¦ª¦)š&SºiÇ)DÑg4¸øÐ­tkè˪¥áÑþTޱ嶴14íaÎupq¸[­l¬-½¬ZnKñØb[z&‹4ÆÈÃý:¸øÐ¶ÕcaËyÕÒðè¶Ô3¶Ü––¹î@Ó ZÒ°¹Ž-ö²¨£ }^µ08܆އæÄ5Õ•= I•1——/bLwÁžêºÊZ©æò¥.W/‚„›Ç]øÖ¾’Ÿ”jt]÷Ϙf0†ûÕÍѾà.èËkÙè}5žC]æ¬ãüŒŽa‡süÞÊ`·0Äõî Мx^|ÿõåݧ––Ù׿´·.î~|ma×Ê~¿žWÑd_ÿ”ýS»õ‡ìë_[íäTVª>³ü¼¿c/wìé" t[æî|¼Ü)NF×J7wT~¹SŸê&/wrÓÝY0¼g8q®á;õxâpb%êfN”hÿÎÑ^‹—gìp ;œcMQ¢)ïêº ?:Œ ÎHÒ˜|`$7„zA})>fϤ¬àw¦â!žïºÃ;Óp ü&\‘AÌ+åùåb‘µ©zÊgUs{a!é¬ófH:k•ÏÎv†dí|aD:/Ï\HãÏ1º_û9zÒYçõ éì&½£½0"Ý3v8†α"é¬UÑïc!‰úÓrv-*ŠéîŽRýDKV%Ì5Ä߃õ$g=K©Q­ÊŸ‚œ¾½°”ézDt3GÆÆÖÚ[o©Éù™ŽÚ\Çp¿Ö#j¤«9j¤GFãó…15ºv¼AåÉYE&2íÜ; |§ƒ†²§±‘Å1É™;ù'bžn´êÔÔ£w´›§žÎó®ÏSÂ;­Ú‘ý™y4¼Ó#öôžÇ3QwÛQÚ™wð<ž]€+Àû£*´Û †Èb"ƒoêCO’&\ ãÛÇØL¾3˜6µ~³*Ny3Ú]F·`´O&¶èg÷!ΆA4@â¶Ûå!¶²ººÇf#!¢P"9cÞÁ,Ù#ÎH¨OiȲ ­I(&۩͈ïHd¶xˆÆÒÕIùä3¦¦¥ "4W=Œ¡^²Ê_€¦*JP™ð8OjâgHàrXx|`½f`áñé?ÃŽdYWðãJB:r¡²B7™5ílç\ILqLU92c›ó{íßß¾gïþå»*[8{ýï¸R´Qõ5˜ø7¸1„DLw©é)ùçAx²&%xb7#CÊÚ¡¬ñúÈÞ\‚JnLá¼ÑCv¶šöÌ8 ø>Šãõ_¢ËC»-}'ÆÊû.]/!ë' úÀgQì 7yª§J tˆW@)Ù/ÀÄ¡ÃU‡ÔM ð|23ØÙþ5T±¯«”‰üãÏ© Æv,¬Ê‘ÈKá97̦cETššZ†1îl –e¯=(ȱ}ÖFçÅ]?µz‚J@h_B¹œ9J `LrÂAd“sÿŠPÛóÅø`BÌ+S)‰ÀÀL.[>å›PLF¡Ë!§°ÐxF}Óõ—ÁÒT.šªo–JõB`P ‹s˜iÀbÙî¨Æêæ¬dª€ˆŒI$U ‘¶#–$&ZZ4V@&ü[D•| FSaNq41 âݱÚÅpÈDä‘…­‡L2àQÁ6˜00ðÙ^úxˆy‰±È3$—ùôÈÊ2@¦Š€ˆï{gÒc0Þröu%g,Âá¬{/Ã8‰¦áÉ ïQCˆK;ä£TÂ5!b1Û*ëá Ië_ßÃY¿blÚ„){*áM^‘uÔ‹6šq¨©îîé–‹{¬_ꑊjŸ´yžXx%ÜßžF¸»ÊÚŠƒ[¨Ñ1Ù™”üHGÛC]Q¥è(>±LÞD…¢¨´½å~r(̉bNOP‰ ú")&Œ§S¦D•‡ò¦Å¡Á¾WV¸¡`ÁÕj*õmƒeëÚ$J<~®èœÆÌ¤†®eÔÈÝò¬ž©$"ýn8mrŸ<‰’†i}ÔøÝ¼©uL!4Ý·#%êjŒ-†ØÖ%ô¾ƒ{&ºwª©­öLd:Jºž‰sq/PØR5á_Š»wzÞÁó|€këîÌu”„Ý;µF0À½3ñhT×Ó£ïªÖøK!tŒ•\Õ1·FgÛªØÔ¼³d›æºÊ7bö|>|™9F0$Ì”ȇ¦ÊÏ10`ÊŒ¤ÒieËZ`DÎJMTôÇ£VOüKØ|(ÑêRð™‰c˜%¢6V*G¼ê¿tëH”oCT3lÏĶR­-÷Ñ\s5¶®‘¢ÂÚze{˜Ê‰Ë͆”ç}9,î6Ó‰I¨ìG&ó¨o‡§Š]:ø÷Cü{5o\*sB@•\FPa¼óLs„x6v¿MÊæMÿADâ«lü2Óö}â­H&ˆ¤BŠ0ÿg¯"ª:•ó'*Ê:ìßN‘êõSë6`zÕ¼<‚“·Á˜íWÉzN„£r\-A©÷1›2uåÔnx”HY-`õ|á<íõC‹7\ªu/§—K¯5–Ð)d+{<¢< k‰Bf©ö7Œ³“¸Ês·£TÔÖ½F¹e2s×¾ÍAaòSsŽÉ`I%B,g7k*Žo¶Óõ]ôzNU(Dt ’ªENÓú};–•ˆªÅìá‚“®,‘ÒC7,/'s>21𩜜 ESº¢$„ ÆHDE–6öv|’5Â<Ü¡ VoûÂ~ÎçùØ>1¥teàï‰Ïùš¦r¾ý»V¯Ô!’ÆU.båÜ^*O¬ ¶#ˆV §ê™3ÂÁ5“ÕI8ÓY[|;_­ïîDŠmZ¨›z'Ù¢X v„Ö§²€½¥w"KÈÆïÄ ¼7)ï/ÒÙàà¹Éyî*Áª…¶C6ÃlÈzä­®À19$íÛp™€ç4tH¦*Ï!†l{» qgú'¥ªâÈŸLû¦Ô„„ùáímbÈÖG‰QÒ"nѸbÄ@SÛ}¨1Âáþ˜Ï0)p© üˆ$:¦²£ô|I•¾ÀÏ×WŸEµØò$¢u‘ttÛY ‹\A ð¦R$ªÅ1‡!eã˜VZ²šo|þ\V#äIå’íD*YÄS²Ñ“jfS`/•ÿ «†¦òÓ¸}‹;AÅIOr!_‰w~ƒï4èIU=LVvMŽª“2ïÌ<}“£VU"Çwú6>ÓÑð ð÷¨¾u–¹ ×í;¯h}+£™µ}€kSh‡ús°~¾מ*>©®5À`Ÿ f½¬fjgâdšîÊ:— ¥¬e…ÐfìOoØEÆTšÄ+˜æc¥ò«Hd³bŽ}u®ÿ:5_l!¥¹ÚB§0u¼cº3wTçÞ±ðÎ{8ÚGtGõáßIõ¥p4ƒßwÌûtHQ¨ûïxÀ ·ÞóÙp1x=£}€(Fl°.îlp’ͪ`¢èÑî‚ÎÆôÏCl½g³Ä¤Öû›U7l ï'xƒªLöÙU^8úÇÐ|gu~êY5&·÷Hçºç´Ò}Ïo“(™ºúé”Âu×Ö×™D}öÉòPãöÙÙž±{Ðãü`5îu2‹•4µû¬ç½•F}ÆŠï1YWUxÓ+ê/‰l ;’B¤Ð'‰•¼›ú‡#wóÈݤV3{lÌE¤P%ùúÙåë „L¦"_GŠ(ôG7¶Õ׳Ñïað %Ç¿R>Œ£ <¯$¿‡Â7Q¸¸§®ÀbXo»FQó³Ù’l"ÙƒÁ”!Áå40ËÁì %ÉÊiØeÖ§+ž‰äDF]Æe E:áÉRªxaߌT³¾G ™º ´4ö´Ä¢!/¢¬*)YaòCò@Æ­‚y –«°éƘú· ëMšÂÜ⡤J D W„nå­¯®•µÒ„][m{ý@»vZÓ¼üà¶£¥8DzŒlk<*k‰ˆ:â°·ºåÌOhû+*Õ: Å’5”£—¦>O|™º•Û!<²í­£úcºØzüΖóЉÚê‰aï\9YÓpf"1H@á=êDì&¤¶S×i7 [Ÿ ~uè¦òSá\棙²Uü—× T½Õó4ŸŠÔ(ëÂeœÞnm‰·#ûa†‚h›`; `Y¤Æœ%‰wWÂÃû.šÛ¹©~Fj¼wLÖ ç\õÛïÖ* p-.![à™û³É­èSU»^_]—pì_ÔJd|ªÊ5Â%ç˜bÎØ~(ZWp›}J3†ˆÖ„âÙxì–œ€Â{L;—£ÄQ"IЄQ}"@ªü;E’ ׃`òÙE£?Ì}oDïsfîo;éϘG’.R!¬§P šGä2àÑðª‰,üŽ……©ÀüÀšÄ¦ äiL•<•ôH¤ÙF"iútÍT‰4Ö^KV»þÅ)oÌЊɇ„:—;5³PÁ¨„÷‘ñr®×WG‹Év{ÃhÀX·—-Ť¥ 4q•àP¢û§lÿѧŠq³)j¤Ø¢Òî(悘¼§©GÌç@‹¾«Î"Œ! c‹‘%ÃÛ+€¼eW†,~{Lþ©|öDˆ edÚ²7ÿõJÁGV ëöNúhÆ*¾ãù¢Ò…½›ÔßmÓŒÜ8Dzo|M–Æ2§aÿ æ«þnI‘?ŠÝ‡(7\ðô(Zæ]ÛVÊ^Æt›£Û}=Í õŒ¼2ÃT1Ü`¯-&“é¨ä–ŽíC®JX®4×¼s\  ÀýXEË!x LÀÞÑž*Q¸ˆ.F@”ÞÓ¸À®³s“‘ÞþÉ~´»ïEŽÏ÷XÀIë9Ì1-³ËÕ™çgúj©Wð8uë®f@ÇeõIwI~“*§w\м>•cë±ë˜‹ý3ó˜{‘œskû侉=Ø+kÇ ‹Êé:z50ó™ù …Gƒï8ʨ‚>ý¦5‹pç·+~`£fÏp£MÕîú”qcÙ; ¡ ¼C C58ãD3»çÁˆY ®ÀƒÛp<Q'Ø%ˆ ‡÷o%ü 'ͽà †(RhöÑašÝD€±¤ Êë“ê&¼¥ ê#üƒð.Güœ}~ù7ƒ endstream endobj 1654 0 obj 6698 endobj 1658 0 obj [23 /XYZ 38.2500000 604.250000 0] endobj 1659 0 obj [23 /XYZ 38.2500000 304.250000 0] endobj 1660 0 obj [23 /XYZ 38.2500000 695.750000 0] endobj 1661 0 obj [23 /XYZ 38.2500000 604.250000 0] endobj 1662 0 obj [23 /XYZ 38.2500000 304.250000 0] endobj 1663 0 obj [23 /XYZ 38.2500000 695.750000 0] endobj 1657 0 obj << /Type /Page /Parent 2 0 R /Contents 1664 0 R /Resources 1666 0 R /Annots 1667 0 R /MediaBox [0 0 595 842] >> endobj 1666 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1409 1409 0 R /F8 8 0 R >> /XObject << >> >> endobj 1667 0 obj [ ] endobj 1664 0 obj << /Length 1665 0 R /Filter /FlateDecode >> stream xœí]KÜÆ¾Ï¯˜sØ/>€ €´+È!€ 99rœÀˆ(>äï‡;CÎîó5ÙßT7{8´`K^ŠÝŪêzwÕ»?~ùûþŸ¿íß=}ùÏþ[÷ûÓ—]q¨\qúgÿò뇷?Ðõ¡ûó¾ªÝþÛ/»ïûï»Ï»Ïí¿ïN/|yúsû§ÿíõþOí¿?ïÿú·ö‡?véå/ü²«TÕþþïãïM¥Ú?çß_~þ¯Ý_~·ÿõeÅ~»˜ËÿÿAkcÌ ;ßõ_©Ž¿~ûöëîÝéûƒ6±¶,˽²ÆîUcõþ¿ÿØýÔ.ß/^jk”©´³íŸ›ÒV…«kÝþ¹2Ý?äÖ•n÷®ŠvÝ´¨/G;I¬­ä—nÁµô ÔÂèP¦T¾¥Uªz¡í ¬t„¾©;œ7N3çµÅ‘îŠÊÅ¢çjattô„K‹ÑÓé¦îãÆ¢áV¬¿..¾t‹œXK¡–ÆÇ‰¢žµåHêz±¨‹F9.šÌuU¤G¨¥ñÑ‘¯U³ºªì)ÑþPœe42׉ÆAåÑT’ÅGGf¼¶ØÉ- k¢ ã7‹‹/ÝÚ•±–>BG{ÖŽzrKmËxd~]\|iÓT±–>B‰Ìxí¸d~5QätÏþ)]43üu=^ûsÀŽÓO€—þÝó⇯»wŸZÊýןZÀŽû~ûúËζÿÓ:æ-¦¿þ¸ÿ} Íû?ì¿þ¼³kN‹—¿vzbá“'ôD©ãeF×J»7ï¸ãspíæ/o½¾SŸÔ‡º)Jýö‰nÐ6SÀÕ4|W+*øüÒœ޹mcüé‘‚aFÀ@_ÿêèøû0ú¢ë¾óñøÄõœ:öf0Œq0B×÷z|ÐŒäqò|×|b{ȃ‰PÄOðjú›RýKÌgX ©1\Ä#Ó±ʇÝNû|üÚj½H«6—*KŸøX‡²R—èÀ< ?3uèûQ꣕-ÐwWîå³+cûÏþtÜ´9¿ìŠ(»òDYôDkâq¶áO<Táïø¥\M—pµ&êÉ{⛩Ãy§€ÔÖ˜¦x5Lµ‡CêtЙ|Ø_ôÐ2bìL@sÐ>Á/Å?ÁÆW{†ï@açYMGWûGGµ.êžî=¯T¥›k8y¬Wl 3~Á‡¡©ˆp 7–pvr‡.„ÇÍÎ]´†pP†DñÏxSp5hð8(Þõ ×HKxÌ_Ÿgèî`Ì5XŒ%"„…>¾¯ÆÝzøŽG>a¼a¡3b^ÝÁ´•kEwX©/U—‡ÞLŒ¨)_<ȳ÷D0r1A^48=â†Õ‰@ˆ‡¡ñq E ¦-!úÆ6Às8.,c]1ŒˆÏûÙêÚ#§ñI#T/cuàXÇÞb´ ÆÎÈeÌ"ÿ@} „ùæÑ²9Y)º Šjj;PQ+1–™´R@nŠ0£=l M-ÊÝ!bŸ»ïéé±T<ÞgýÚ92G2öôHA`¹öi¶.ÁÜÌØ#E§â¯äx°aŠ·ŠÈ%¼ÐîˆÇ éj³Ln°L"H )´™<+ãEÖó£»L,‹1r6oD" ›U“Œ›)AHœÒI#&¾¾.u%Ž‹t‘m‡Õ ‹DžÐ9&7ãåHä¦b3xÀQ-'MÚ"Ð9iƒ(’‘r²5ÞTf > È3‡…IÜÝpøcæÏ´hÂù¥¬ÇD1@"C‹ÒžLr÷–*âÒ‡zßa„!¯=u¸žˆ‰#1|Çäé$R‡¸0‹ÒùDˆ]¸¢]4¸Ù•¶:cõq ˜aÅb¤?ó©–bÜBnUÔŒD)åŽIS¥Õ€¦wy“IÞP5w0‰û†"Õ†±c+sÒWïE'‹0Ögò IÖ0…ÃDÃå=F C*²’tå%wÜçu'«bŸ"mÜàÅ€O’)gb?«W?„ð§nçHHªTž—d@;¦¦²ƒ3¶Ÿ,“_9@a©ò9ˮޫæªN:êîF›Kži-»SHnDTwÐÃh]eØ;Ÿà; |§î-ÈQÙć³ºlÌ5¬_{Ò :Kµ<¥¯Æ'®½ƒ÷Á«5iìö¦œÑ³éž*BrjKäî(#Æž¡±—ê2ífnÙ0 ¦ “‰ïx2ÀLº¾ùZiÈò„Íêɘ†¨pn]¶”S]Öˆ ¸-Z²¶´-³ 5v.Ÿh5rÉBj_˜&K½]ûœ¡F©kŸÉº{¹Vx_âáZ¬ ÷¼Â[p·ÏÍ^<ûàö9¸¹„À1Bæ n.¤ñj6øÄ³ÿ$ [³V¶„¡k ÷ÑÑ^T [Fa1†ý“°¥ÓkeKŒxBŽâ'ºÈ—-£HØØQ§Šþöžpƒ2Âi ¸­û0V1㆔š‰&½eKÍd³ßT,^´‰Ñr×cWz¿!à”ÊÒRùj&0uÖ3-Á·3zouüV_‚ μr¸Rõ%³ã¢¨OkåªË˜4 "#´t³ÃUˆêZ™@T§ºÕ—¤µÓ³IšÖÍÙ@M µ }­ž˜_ëQ,ØÅb4'‘¤ IZ¦*6\·÷ˆýÖßÔ($YK}dÜÑQKŽ1R¦˜b!¢ˆh/Eŧ2ÝÐÖêmQ¥¿LœD"\K)îTeïÔi¿ÐÏÿ®LKªúž-–¥øºÊ4îRÔïP­.åίNTvïTyFS¢²{Ï>°ì¾¿ì©GΦ§´ýÄiÕÁŒhùj£ å;î *ÈÇ«y €Wð•Ï¥æJÀGˆLŒ’€ _~À8˜Â[tO®—êg(G<‰¥“¡d¼X¦%‡˜£åׇ`.Û…ôÆÆ\†KÑfŽT8Ò)U£åÅf/v·7U·•»ÙF]ê”Ç‹„%ë¸Ò€Œpžn²Æ =Írñ;}§é^šñD¦l ßþš_ÈÀ$Ö¨›ùùq9cÕMsõbÙ‘Ç|ѨmÕ@3RW.1Ó@I„5°'g#ÚT¶ë«lZQV™y ¹T­\#±š¿UÐ)`ÊmÚ.(ñ#6ÚN*•K‘ª tν¿…ïA?˜=³7ܱoÕ¬óbÙ,Þ÷@¦á)SÞÀ|z¢±çw::å.­™T²Ð3Šà7*Íœ’{r}rV¬ÉBiÌåÀ‘¤%bí²Lù 1o)¨ÚÄ}I(AV´bÍŠÅ×òs(¢L‰9s”9 kË*2õ­¢Å 9Æ0™—aÍŸ9Àôx¦Æ-ˆZ¨LKe’ jþvÔ•ží)2ÑLF}ÉZ‘²°åÜÜl©Šë´µ¨1ÁŒ’ŸÔMñ£˜öÜÕ «„¸•AÉR¤K OkcÆêÄåtjdckÉŽÍ–ucñ™>!òÚeTF^/Y½^ØËã¾¼jõ%’àÐ@H‚Vu¿£ìÐGædbIψœaúF‰Žb“½%‰õ>•ˆ¹Ï?HDby€}E2íÖå«Põ2ÍàVàƒ%>c^ä9F¼¯ >ë¬Ç©]¾ù¨­íãg—ª"–UWqÏ$”¨´'¡¤“u)ÙÆø%ã³UÕ täV}ðÊåá,â¬Óó{+d0%Ý cÔ%W^ëϯá“'ôDãnò°¡ ÞÇÓÓÿ><3—!0Ô&Ý8ãf ñ.Ñk`ŸKƒ/Ö}añesâì˺‘„'I]ßràÐŒ*, $V;»COðøƒ»ÁâÕàHj5øNB¦°¯³EàÉ’ÇŸú±õYßÕˆÙ¬Íüàl´žJP§²p—× úPÑMìÓÁdÚrùÑ•¬;ûxQÆ„s(9Ï¡ÌØ†ó¨k<õ˜ÓV`cÖ1Þ2·}[îë7ÅŽ>3¢3aI{Ø…°Š=…‡a¾œ¡fD æÞ<ŽY¥'™ØÔÍ$ É<½œI/kN2!í0ù‘QºO•ãÉÑe!Pl=I¬M ˆ›Ç›@Ù +Ppš> ržå³ R 0æþ&P6 \©“@ ø‹f*ÛGü NöTÏœsg¦¹3è˜ð0ýr’ØH´¾^KiÓÅ Q€Tõv"MÒ©Žš·¡³. ­IWT5}yÁºj[YëÎsuïß±[áÇ&µé¯Z™X,g$æÌõ˜Õ Ì1Ó6x^5«~<æ[ÆÑ­ø¡Ô•íbNcªÏRYÇÅãXqªóK[NÖ†›ŠÔ…ÙlfbYG@¿ü`yèHyj,ø´VIÌjIU_ª;&Àë±OG&s€ð"f5÷Ë8–N‰ âî6e7ÈÖ›d#΄‡^3Šbq&Àý_>E9lãV¤4•(u ©#ÃŒtnàç%J @{j›*”Ò—ZLˆmlJ2ծغeÒó“ãË‹³¬{¢¤ºw•ȧfî&zèø~ŒÁ¨X7]Û²¨ÊËÃt[¿€-é<“Œ‰®Ù”÷†µéI6a¸,šóÅCØR¶ƒ!îêA¼M†¥ì4WÝ%¿å=ã¬TÆÜ€ømär ’8}ËY¸Ïf©ÛÈå ¦¨ÎM–¹\j]^w¶¿"]JöñÚw`ŒI(cê‹öýLæ„.zX{Æz%cePŽŸt´Ó‡rÔ¥YAËçíc¦,îk°}ê¾¥Pq }©˜ðXÊñvº×e`ÛëÊg(¼|§³ÊTЧ¿ ˰ ÷òçâU„VØ:…„6=VO?Û7ر c(ˆïN€„±ܧ³¯PÏà ³„ÀÃÛp¼ƒÑî¢Ã¸pyò1)ágtÞëµwÆe@ŠÍ>"9ìa³75VTE}P§ ßÊõ"þMRcR#~ÞÞý³gTm endstream endobj 1665 0 obj 4697 endobj 1669 0 obj [24 /XYZ 38.2500000 444.500000 0] endobj 1670 0 obj [24 /XYZ 38.2500000 260.750000 0] endobj 1671 0 obj [24 /XYZ 31.5000000 196.250000 0] endobj 1672 0 obj [24 /XYZ 31.5000000 709.250000 0] endobj 1673 0 obj [24 /XYZ 38.2500000 660.500000 0] endobj 1674 0 obj [24 /XYZ 32.2500000 707.750000 0] endobj 1675 0 obj [24 /XYZ 38.2500000 444.500000 0] endobj 1676 0 obj [24 /XYZ 38.2500000 260.750000 0] endobj 1677 0 obj [24 /XYZ 31.5000000 196.250000 0] endobj 1678 0 obj [24 /XYZ 38.2500000 660.500000 0] endobj 1679 0 obj << /Type /Annot /Subtype /Link /Rect [60 160.250000 99.7500000 167 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn2 >> endobj 1680 0 obj << /Type /Annot /Subtype /Link /Rect [87 152.750000 118.500000 159.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn3 >> endobj 1681 0 obj << /Type /Annot /Subtype /Link /Rect [87 146 122.250000 152.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_output >> endobj 1682 0 obj << /Type /Annot /Subtype /Link /Rect [87 138.500000 115.500000 145.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn5 >> endobj 1683 0 obj << /Type /Annot /Subtype /Link /Rect [87 131.750000 128.250000 138.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn6 >> endobj 1684 0 obj << /Type /Annot /Subtype /Link /Rect [87 124.250000 130.500000 131 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn7 >> endobj 1685 0 obj << /Type /Annot /Subtype /Link /Rect [87 117.500000 134.250000 124.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn8 >> endobj 1686 0 obj << /Type /Annot /Subtype /Link /Rect [60 110 146.250000 116.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn9 >> endobj 1687 0 obj << /Type /Annot /Subtype /Link /Rect [87 103.250000 141.750000 110 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn10 >> endobj 1688 0 obj << /Type /Annot /Subtype /Link /Rect [87 95.7500000 130.500000 102.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn11 >> endobj 1689 0 obj << /Type /Annot /Subtype /Link /Rect [87 89 114 95.7500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn12 >> endobj 1690 0 obj << /Type /Annot /Subtype /Link /Rect [87 81.5000000 150.750000 88.2500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn13 >> endobj 1691 0 obj << /Type /Annot /Subtype /Link /Rect [87 74.7500000 154.500000 81.5000000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn14 >> endobj 1692 0 obj << /Type /Annot /Subtype /Link /Rect [60 67.2500000 138 74 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn15 >> endobj 1693 0 obj << /Type /Annot /Subtype /Link /Rect [87 60.5000000 128.250000 67.2500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn16 >> endobj 1668 0 obj << /Type /Page /Parent 2 0 R /Contents 1694 0 R /Resources 1696 0 R /Annots 1697 0 R /MediaBox [0 0 595 842] >> endobj 1696 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1409 1409 0 R /F8 8 0 R >> /XObject << >> >> endobj 1697 0 obj [ 1679 0 R 1680 0 R 1681 0 R 1682 0 R 1683 0 R 1684 0 R 1685 0 R 1686 0 R 1687 0 R 1688 0 R 1689 0 R 1690 0 R 1691 0 R 1692 0 R 1693 0 R ] endobj 1694 0 obj << /Length 1695 0 R /Filter /FlateDecode >> stream xœí]I¯äÈq¾¿_Qgªa.ÜCÀôfÀnÀÁ£ei Ìëà¿oî¯2É/‹ü*2ÉzÓ^qË%2öŒŒøé_¿ý×åoÿ¼üôñÛÿ\~ ?~{É®ežõÿ]Ú¼½¡«ëðûRVùåÇo/¿_~ùúòµùÿß_ú¾}ü÷æ×ÿ]ôåßšÿýýòçÿlnþex©}á·—R•Íß_»¿u©š_Ùô·½ÿËËüáò¶Å±»a0îõµ1™mGq§çß_ÆYªîß?üãå§~þ›:±E‘Ue½¨ÚêËÿþ÷Ë_›æÇƳke2¥Îmó».l™åU¥›ß¥þ#».uÛ·5¥ëTù¬çîŸDÛJ¼éÒ”±šîF- e júZÃð7×qÕôZÙ¼A/U]–p«Ð¥Í³º‚¿yH–™©_¦›ÆÅ›VU´¦»QKãǮ@ÛQYHÓl5€KYq€½6.Þ´i ©énÔÒð–·—šm#›:på¥8¼¦¶å—ÂÖѨµ08†E†MÇ%åB ë ³Z\Sãò+Qé,VÓݨ¥á1¬2n»ùNÕEVVþ¦‚JåT’ô» ¡âö[îÔoÑ.oºN•Õù¼ß¯Z`ÇØ·ÚÚJúÖVjè2·—¡œ®ºQþõ\!H«í¼åôË^!§È©¬Xu¹eÕØ³ßžb±êNšÄX,¿åÃ,V30u¹¥zšÅŠAY 8pˆ•ª»éÖÍBÕßb•–Õ[§ª^®õËÕ_Ä_1 Ó×Oƒ¡eþðýå§/õE—ïm$t½þÏ÷ß^lsa‹B›Ë÷¿\þ%Ëlù§Ë÷¿¿Ô×²È w°îŸdy÷Ä\s[T¥ó¤ÿ¦ºVuæ~£4|R¡Öð£úÖ¦Öt7ìÕšÞ±û:¤ð 1 ÜšÁà2Þ`ñ¼póös÷äó÷†"[e3„eÞ¡@YŒý4Ì©›ÐípTžè=É4|ò>ùG`ÑS¥U»nhT ÷ƒˆûùŽYˆÀÖ4ü&Кì tpkV‰Žà³hkù¸ LXº”Eíâ¤Ê¯Ym8PÅó…2„aØÊÀoz¨çW£+å>) ûÙcò3Dë£Yå÷7»±á[ 5܆þ÷“­,V-,zBé =HN©qÁV L ø@±ªø>Úá A˜Ö"+¡P0ÌakºApé/>çú„^ÅOcÖ̬:¯³Gnyc4¹Ò ³ FºapÌèrFÓ˜L (’c+c̑İü 0<ø #ˆ¨™BQ(Û%Ñ™Qbf +O„ÎÙ'ÄÊÍÏÄ7£Ñf†V e](Xo@QÌ7g¾”{°ˆïôªª»ð (G’ú›p ï±ì:°–²„§|;ߪöðKÂÇ—,À¾°„qaÂä:€·i?l=÷3Vfìy ’ŠH1Ü1cÈî€hgÌöý ¦œaÑ pÉê¢í"—T-“¬Lá¡%k–§¸;ø7£ü¿©Ñ7Ãn›*gä8.·½ú¡i- €O>­eè Ÿà™ªBç#z¢Æ]J¤Ö,ATÙö¬¯¼Ö•ßO*àõÑÌ0îÀ~­x¿1x¦p}pk:ßðjK­Ýë'ºPUj„ "’Ý7hr‰b»¶¨ZX ìTñ`[6°¬Îœ;L©Ñûï0QûÈ„ÙÎx?e¬CÂCv-=¦p)JWºÈºO¼]Â;—lÓ„‘á0Øp-'âûÑ%—`Ǩ[öÎ’lÍm 3£‚ÉÎH”SOxtm'þ†(MHl¦Ü ˆ(WëÜDµÚdãhS9ÈÇRQÛŒ¯ž€›ÈŽ3µ“Ŭ¯÷ÞRX¼^à%ÛÇjî'U#¦×ë§LÜÔ\-ºÇ¬Î" "D‰â×Lˆú½°’¨Á\µ \JÅÞÀ=ˆÍG&®HXçÙK•Ç{t©cчÕWÙPa‚Ï)ã{†²]2z(ZHö®"=àk€ßÐ ¡´·jò'ÚhHeá˪iê$˜Ȥ»,+¢¤-ú¨éIëã"^;Y‹Žbö„ç7iÍ„Š®·Á(ÕwØ`ήE›Œ3_5u†7á#ã’<æ¦ÉÆ9PpËÎÄgÊÌCŠgLÄ2ªŸ°ççô0¿ösz˜SX°*Óž`et-QV.ë¡3glÀ;2HvÛµÕ>ï:Uâ{Uý-HF<·™RÝ(óÚ…K£Î΢"Ë<ô,öñ ñÍÏð›}“ šž©Úý·ÈË4FºÎû¢ŠË«™áœÏ?=ïz~KO |’ÃùÀQ33Å#À Þ¾r±ep¦ ¬á7C޲m#€£D…*Ff´¢ ¸AÜc”7a<„N!t†Hñø´.G*Çi™m´ &sú÷qÃqO?Qô½zÙ]è‘ ÏëA@,>9¢§…ñÒÊêÑxlL2ª´Ú«…áÖðúø™ÀR%4‹âBŠ)ÄjOŠÉ½•ÍÁÄR û}Ž ´Ÿsᩜ¾¢¹G„““1Çàæ¬ñô1Ù©^uþÕёߦÛõ=x‚ÂYSE·d£#çdÊxÄαûÎü1wÌU#E\™ËÄê('2ÇÆá¢¡%Ìq-F—K "‘·fK#ëíkŠ?3…%ˆ¸FÆ.À£NW{¢Ìòi Dò}…Ü3žÀ~ÊícˈTþ,öÁ2¸Ÿì#.›ÀÌ ÃÚÀàQ33eJ: kˆÖ-Ô…mý`XÐ ÐB²š*eöšEW'ÅO˜Š¥7Û(;6¦µ@Ù‚qe°M6Ý<“ StŽ üM•x1nt_”h蘕ÌsíʽçÌUuæ y’+da¦ÖBA›(gžl!Lê˜Ãþ!ŽR5è%+HæäÙ,ù<©Á<±9ÄÈTyw%bŸ™”/²õ„L$)Ž8hå{ÙqÌqæŒl&²dGÏD“ÂRçv³ùd‹“¬/õF¹ ˜ÓÇ+Ûö@’¡MS·Œ‹KìhÈGœ™¢úÖgçbrCSõ®°‚“î䌮§r$Ø Ë„§àG¼ÃÈ`70Ü<ÞɨìD ”@À6iáVy bH¥•ž458Дñ•»rÑÙ²Í̸RC±üšù9¥Ïá[¢ê AÝaž ‘´ß?ñf²jô\¯DnÉ™¾vf/X¥Õn8,-šÿåMR)ô‡Ý%)0*ãJŒ#o¿0A"˳_´aÓ“É ë ®-7gÒ~…Œ B5Ÿdñ“#×Ld8ø–ýÿTåž²ho ¾ê†ª‰þ §|²bîué‹Ï#»è# ÷Oø™¬<‚À„숦 Œm2Nu&®…IzÅ̇‰É”Mx}°–ÁäRäõ©ø^/­·£¯p\Þz)¼A¢XÅ%ôu&™üu¢‘tHPÄÜÄ/kE¨m¨¡Ëð±¸>³ç®äv7Ÿ€ó©œM;ºž­<¨¹A#f2w& kIå€MåÕ'Š+VaC çèr®( OνùüË"²‘‘.Œ{c½!þæH8ršùDŸ>Í÷$߆Ù2w—q!&‡±:øÉ™àiƒØÞÍÉõ3ÁÛ[Ó}ƒ3ƒ]ËÜä.~ůèú ~ë[j3‰?Š”Æ¢Qö¤:利ʄѓ„ìá?<‚g*¥R\Ìt$ºrEâ~™­Þª|HåþcXzÜ P²©Œ¨à YŸè™°íÉÅ5…CŒZ¼¼ †a¢¡†”¼Ût˜™E¬gZ8`1U9ÛdÉÈNÕá!Õ!òÁÞØH©‚Ô7ÈÑ>FDÕÜ ÄŠïÖ«uêÀÜ’qíŸ)Æq㘲uØ›Y±¼”X‘HSûŽgáScxê„ëŸØdó|H¢*n à?‘9KØÄÍJ9æ=ò)9*A+ã_Ýœ¢¬&U¯Xõ ö­àÞMÌØà¬Š*ÏØ¿cÄþS!; ãë˜'$q8SDT*d2’á:MÂÑ`éRS*‹§ML.Pž †lÊdý zï¦6D­D\³,ð„ +Ä„ÁÔ”cÐç–ÄHNŒÀà¤+îYTæ.@ˆD¿£"WqöDÈ« wÑÇY2eþ , ̇©=LTñeÈ9£ 1„š3jÍŸ®b™é7Jfú—øæäûd Sg?Áy}1sÀWUÅZž)&3¼ÚŒBTH Ö3X•V9}¶±aL„­áUxkÂg=~_ÂH«»Ã‘}rÚÁ9k±þûHa'€`É´ÿbaD­ÇÄ߈–è'˜“cÉ„‘üÔßNý-¡þð~ò4€;„¾XS‚£fD(æHxå0^ËZ¡¢T˜õSÊ…Ãú(ᇠÌçžZ”DõȧꭘáÃ)` 2Îù€o Cð f\¶U6BS ôC _a‰sõŒA˜cI«Ѷ»%ñ@ž€Mp 0;ùIˆ­¥öì–¢F "c£®0T¨‘%ë~NÄœœ0“<ÏS=V²d9Rª~Þç»kH'Q˜ÊêDŠgBŠÉ9`cˆ¦( ¬a½3Jý‰½é°÷­ ½“JN*YE%IÄ{]ŽËÈÇ©F? VåÚEMyŸ„Ϲ0Û"™^ÓO°9¶9»ÎþŸΓØkpV´žÊ‘ Ìs*1FUdŒ\¯aÇ*»¥rO”@1ÈBÑËã¥Ã{ñ“9åÊ9&¡UeŠ9î¼áˆéî†Þ|]˜#`ÞBËëKQÇÒDan?%PЫÌxºïi4 擆ÕD³Ú»¢B&–ÖözcÔ"®¥‡í>ž3“™b”¬YwDòÄ2ù¢$~Ù1±sÀ8váq"!„Y\9K¦(ŸÍÜz;žgC¶>–,Âcþ@%ÇJ•ÕR4wÔÝ~â;K}” ÝÀÖÙ ¢ËÂʬ3¦Yš’IA)!Ÿ»‚j 1ÆÄYa´{"ªCMŒ{¯H«æH[T[ÖYƒöíè~¯õµª²òRÝ_¥ú»öRä×^Cφ?^ {UªÖU¥ÆwŒÓ„¹í y½¿Îº.ÎÇU]»´7š/nѽS9MTn¿¼|øC,Bí˜S{(CŽmrR¢"Þ™û;ÛXÖ—&Ù€`*%Î<ÌDFO‘üä”–.›Wñ”Ò”MB U£ý•Øgs{تtEÍ”ùÅxu:®w̼)kÒЋ‚qU4áfÀæ“ÕCé%š¨T¦²ÑnQ-q .áôÚ˜Í1:&ãÊ`’(2kËo¨ÆÜ$È}i9Ë%Êì¯Wx™MÉ·¢õA†P¹1¸˜:Iï!ql`CX)k]ôÇU‰•XªS<šÂÍ]¹<¥^ žÀ7ÞÈfNžGUÚd—a›æƒµ˜™äÝ ‹­wln$æ"í-âecnLô£Ôå] ²²3Î*fûžÑ#E?RŸ↸1;ŒÃ“1})ïSN ŸQâ%rã'«')‹ß©Ü¦²‹L(P®„ )U%¸4;K1C«óÊZOeu½µ‚Xö0åT˜ªÑ‰Âi>©DÐ pa¦|G"ìÝRïë(³MƒÚ'q}OÖ͘¬ÒéaÏzÄ-z[?.Ÿj3N,4Êfnh”UK¡QÖx¡QÍ ?4ª}Ç8M˜ÛÆÐ(S/„FÕ¦ò:hnx¡QÝ;•ÓDåv?4Ê#Yõeᬞ¬h;.=Ÿ[à*œ”ÝûñL1;¢ó½0F…“8(r”戧ç×Þጩ×ÙÓ—0lÀMRŠ%Ù  cVÁBƒ1(/² ³ÞßIñÓ½Bpd³Ïß—Ì‚›‰,¦ùȲ’qˆ1¡,Œ H‰lH½pkÌÖ)Qˆ|ÈQ¿ä#Ø6:§Õ  JWœ1{³”CH”58v4/@^»^€"[òÚ3Ò›¾ }Ç8M˜ÛF/@^-yòÒë ¹á{Úw*§‰Êí ¾ ‹!2ö<¥/óƒÝå0Ѭc :LäÞ¸ùàóFY ˜i²h lUúS—u$NÃ7 ®™·K½¦e±8¥<Œ´Ã­áª` ×U‚Ñyö^äÒ78¥<ž¬ŽG€+„çYlño‡pÉWæœjïÉÎhåZ¹€zθCù;=þOáñ?½mS- o°Ë…!FŒ‘DV+ÆhŸLÄܶœsOF¬1Jô=Ï{ÌXµ§šÁ'@†¢€ ¤űLD@Ê~'$ERlÉme"–îçóÙ&ÀŽ*&Î@ÔJÌ!ŽuÆÞ´9òÙ”j²fDnb;JÖÉA%‚=c?T%Yòd1~ûõy{˜©ïi® EVæ$ª%;ͱ{Ði@DlH7% üç:­Àlf¦Ú~Œ›&’Œ˜gé|­º¨z™¯5l­ÊtîB¿Ñùû(žxò«ö|ÔÑojô͸Á¤çöHÿ¤¸¥uã…~ß8‚ÛG=0†¥'°ŸWµbÙ+qa,œÑšŽïˆÎ:ü*Œ §¥â‰rœÈœŽeÛLÝM0ˆÊ7Æò‰é•°›xD VÀT=ð™Û9ml¨H„a!«$RÁ¨£ñŒ'Kö”±¬âÄÀb/1“¶ZÔW¿§ikãŠÂýÓ}½Ù¿ 4,~@»¨eLÅçÌö†í=‘2&ëyÉVÚârf„Ë,®ŠqSÏ ;ñlb4$”œdâ;nLµ³*šÑ 0Aþ]ÌMÄʺRN¸VBÌãUÅe«QŽ$‰‚û"Øpxnƒ«Ž9Ž„f•«Y;eÆÝ½.| qˆ3qôa|X5•üy76g²z">=F¤ïO²Ê]tJæ:¡±&æU¾t&DÖ*‹!L’½Èíãé,oMïÝß[ÅØzGÉ–)–ÄͲ¨É`ßà¥âñ!¢.ºŠÆ·B˜H"KeÝ;whÞ¬¶ünÍD·½”sá½£˜ö3Î!Ye”t9Da*˺²e[‰ŠxÊÖ|ó 5ž«ÖØÎ§v9²e+O¼íÎMåÀ"j¸Ë¦{’ Êzóùá’(Ø?&/• qÚuk„ä›·ëÞ]˜Θ´kCé Ö@…D‰ÉT­TyRõ³! J$W ¡©0n>F¿AÄ f½l½TÙÂV[jmIœ*K¥QEŠ|”t½ÕH֙ʋh HPçii7ûhî쀇oÏÔRÏ‘ZêÝØ5z1FKX:«F¤΃–ײö” Ìt{}G««±fiÁLvÕ™qƒ÷,ImÇG+F û5Õæªúc >Ðæ£jøíãÖI\êK³E1& ®Ë>Óo™½æémîÖ—¢~ÍåÛÝøñRT¯ù~ûwÊÛ&†«bJÜ_çc¦_çcëw`›/¼AØË0Æ¡ wC²à[h¨4Ô:„Vr»tãºwÒAêòsf ¤EÆg¡±QüÁe0 agÖªfÄNU«Û¿¾| cw[¾y¿Ê§†}þ鋲zÀ­înÕÜPþ 7~4ŸdŽŽï˜Úic¸ÌGoôy°/Þ÷ÆïÃt}8ãhß±nÖíã—fæ©q\å]šݬïõì7ÉL´ßtw/ì>’·pmÁªG$ÕVÝÞX‰å&³.–›,_ÀrÓݸÁÀö†‡åfBë×6†Këb¹ÉÌ–›Lû}hËûw¬Û†uûØËŠÊú”­Áå}C…Åð¸—R.çêöÆZ\ÖÆÃåV3›ã².<öDÿb kÙ]‘Ⱦ@Ü­,voN3°šBŠj¢ÒÜÞXK!UæQH¥–(Ä7öÌ`ìÝbxûNOSÃeæQHY/QHé­í ŸBºw¬Û†uûØ“Bª%˜—î†ä¦Ì.V¾Ý)ÜÉNñÌïþ¬&¼ªœ¯2·7~õÐo«ÓÔ“Ðë®m–-x0mcs:FÛÙ¥Ž²{§¼m¢¢õk¹³þºZð`šºt;hoxÌöÖ0æêƃyÓÁŽL›å÷esX öÞß·I2PMÅcÊt@þo8ŠÃ„¼¹êçZÖ9£m6m•åÜX©;XU¹ºƒUõ‚î`}·ƒÜ7²¿{§Ó ^Û.+Ww°ª\ЬòÜ'í Owèß±nÖícGÝÁj;êŸ Ýaöýúó@8çÚ,F‹ª ‹m刼eSXDɘµV‡°zÚÌi]È77Ö )=4Õúž;x^n ¨}§'°©á²ôÐKh<R{Ã'Àîë¶aÝ>ö$@;%E†)Sï*4/±÷šÂ[ÄäØ¿îæ6ÜZëšÂÓµÔ”5åå5ùŽ;8rn©¡}§§–©á²ð¨)Ï—¨)·~vFMÝ;Ömú}ìIMÅt?rMƨŒïº·Å´ï£uu{c-:–ÞV¿-—¶ú­ï5±ål«¿{§G·ÒÙêŸú˜Ð±\Úê·¥ñû˜mõ÷ïX· ëö±':VãV?>qNÕ à lõ3‰`˜ð&’TÚ¦WœÈàm›È¶šváŒ.oo¬åµa륀[{¶žDtïô´^;S/¨—"l­ý>fö•øk' â¦yA»´> endobj 1704 0 obj << /Type /Annot /Subtype /Link /Rect [87 771.500000 179.250000 778.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn18 >> endobj 1705 0 obj << /Type /Annot /Subtype /Link /Rect [87 764 141.750000 770.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn19 >> endobj 1706 0 obj << /Type /Annot /Subtype /Link /Rect [87 757.250000 108.750000 764 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn20 >> endobj 1707 0 obj << /Type /Annot /Subtype /Link /Rect [60 749.750000 110.250000 756.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn21 >> endobj 1708 0 obj << /Type /Annot /Subtype /Link /Rect [87 743 159.750000 749.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn22 >> endobj 1709 0 obj << /Type /Annot /Subtype /Link /Rect [87 735.500000 128.250000 742.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn23 >> endobj 1710 0 obj << /Type /Annot /Subtype /Link /Rect [87 728.750000 162.750000 735.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn24 >> endobj 1711 0 obj << /Type /Annot /Subtype /Link /Rect [87 721.250000 129 728 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn25 >> endobj 1712 0 obj << /Type /Annot /Subtype /Link /Rect [87 714.500000 104.250000 721.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn26 >> endobj 1713 0 obj << /Type /Annot /Subtype /Link /Rect [87 707 161.250000 713.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_readonly_variables >> endobj 1714 0 obj << /Type /Annot /Subtype /Link /Rect [87 700.250000 182.250000 707 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_rename_ignore >> endobj 1715 0 obj << /Type /Annot /Subtype /Link /Rect [114 692.750000 213.750000 699.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn29 >> endobj 1716 0 obj << /Type /Annot /Subtype /Link /Rect [114 686 188.250000 692.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_advanced_renaming >> endobj 1717 0 obj << /Type /Annot /Subtype /Link /Rect [114 678.500000 193.500000 685.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_limiting_renaming >> endobj 1718 0 obj << /Type /Annot /Subtype /Link /Rect [114 671.750000 267.750000 678.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_chosen_unignore >> endobj 1719 0 obj << /Type /Annot /Subtype /Link /Rect [87 664.250000 158.250000 671 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_default_args >> endobj 1720 0 obj << /Type /Annot /Subtype /Link /Rect [87 657.500000 178.500000 664.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn30 >> endobj 1721 0 obj << /Type /Annot /Subtype /Link /Rect [60 650 117.750000 656.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn31 >> endobj 1722 0 obj << /Type /Annot /Subtype /Link /Rect [87 643.250000 147.750000 650 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn32 >> endobj 1723 0 obj << /Type /Annot /Subtype /Link /Rect [87 635.750000 171.750000 642.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn33 >> endobj 1724 0 obj << /Type /Annot /Subtype /Link /Rect [87 629 127.500000 635.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn34 >> endobj 1725 0 obj << /Type /Annot /Subtype /Link /Rect [87 621.500000 150.750000 628.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_structure_data_members >> endobj 1726 0 obj << /Type /Annot /Subtype /Link /Rect [87 614.750000 168 621.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn36 >> endobj 1727 0 obj << /Type /Annot /Subtype /Link /Rect [87 607.250000 195 614 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_adding_member_functions >> endobj 1728 0 obj << /Type /Annot /Subtype /Link /Rect [87 600.500000 133.500000 607.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nested_structs >> endobj 1729 0 obj << /Type /Annot /Subtype /Link /Rect [87 593 206.250000 599.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn39 >> endobj 1730 0 obj << /Type /Annot /Subtype /Link /Rect [60 586.250000 98.2500000 593 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn40 >> endobj 1731 0 obj << /Type /Annot /Subtype /Link /Rect [87 578.750000 139.500000 585.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn41 >> endobj 1732 0 obj << /Type /Annot /Subtype /Link /Rect [87 572 143.250000 578.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn42 >> endobj 1733 0 obj << /Type /Annot /Subtype /Link /Rect [87 564.500000 137.250000 571.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn43 >> endobj 1734 0 obj << /Type /Annot /Subtype /Link /Rect [87 557.750000 136.500000 564.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn44 >> endobj 1735 0 obj << /Type /Annot /Subtype /Link /Rect [60 550.250000 138.750000 557 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn45 >> endobj 1736 0 obj << /Type /Annot /Subtype /Link /Rect [87 543.500000 174 550.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn46 >> endobj 1737 0 obj << /Type /Annot /Subtype /Link /Rect [87 536 148.500000 542.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn47 >> endobj 1738 0 obj << /Type /Annot /Subtype /Link /Rect [87 529.250000 174.750000 536 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn48 >> endobj 1739 0 obj << /Type /Annot /Subtype /Link /Rect [87 521.750000 161.250000 528.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn49 >> endobj 1740 0 obj << /Type /Annot /Subtype /Link /Rect [87 515 145.500000 521.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn50 >> endobj 1698 0 obj << /Type /Page /Parent 2 0 R /Contents 1741 0 R /Resources 1743 0 R /Annots 1744 0 R /MediaBox [0 0 595 842] >> endobj 1743 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F1409 1409 0 R /F1699 1699 0 R /F1700 1700 0 R >> /XObject << >> >> endobj 1744 0 obj [ 1703 0 R 1704 0 R 1705 0 R 1706 0 R 1707 0 R 1708 0 R 1709 0 R 1710 0 R 1711 0 R 1712 0 R 1713 0 R 1714 0 R 1715 0 R 1716 0 R 1717 0 R 1718 0 R 1719 0 R 1720 0 R 1721 0 R 1722 0 R 1723 0 R 1724 0 R 1725 0 R 1726 0 R 1727 0 R 1728 0 R 1729 0 R 1730 0 R 1731 0 R 1732 0 R 1733 0 R 1734 0 R 1735 0 R 1736 0 R 1737 0 R 1738 0 R 1739 0 R 1740 0 R ] endobj 1741 0 obj << /Length 1742 0 R /Filter /FlateDecode >> stream xœí][¯ä¸q~?¿¢Ÿ l¯x' ÀÎeä!Àbȃ‘‡`mÇ0l#c?äïG÷K,JªÃ&¥>Ü=Ó”DRdÕWÅâÇÒÿöëßþ矷?ÿú¿·ßÆ¿?ÿúÖÜj†ÿnÝŸ–ÜÞÇߌU·ßþööýöýí—·_Úÿÿþ6<ðëçÿhÿõ7~û÷ö¹ýþ¿ÚÂ?Œ7u7üíÍ0Óþý×þogXû¯fþ»+ÿóÛþîö÷®Æ©¹±3þï¸ä¦ïÅFËßߦ·dýŸþö÷·‡÷?Ôˆ´J57&…¼1'ùí|ûS÷b¤žòeOùMÞÖ½n¦õÖ¶½å´ÕÏýLQ-“\®k¦@ó>ŽkúìmÑšm¥â׬ƒç¸kž3x°æäƒ×6Àn‹ÖXöÁ{†äæ$éȹ¾Û®87¶”uÔŠu©“\ÍÃ7ü ŽàÝêñ?ôßtñεèÍl`|Ûú¹‘ªqý7­]Ó¾¨“JßX7 ʤœY¿n–¼jÅø³ªî{x8˜Ð,VõsçXµQ?X¼i\ú©˜jO=Š)'ž&@]¯“È8ÏëÊi˜ÆÖ.#“²wö\ÿpi}neÅ6¦Þÿƒ±¾”w¨2¶3üÖ>ÒÜsÜÚéá¼:†ŸSící»ùÏ+Úh º6–ýèï‘~ÒoãÏ- /§À÷…‡ÄþyðÓ··n±Uß¾ý©½Ôôð×·vìZ}ü¡{quûö‡Û¿4ÿzûö—7Ö¾ŽÔ¶]]t÷õWXÓ_±wëÍUó¸ÒôÊçþмK1,TW$zEõWÄÔEØÐ7qÜ2¾è[Ã÷€ ô^AûüMñ^í¯¨éEß7¢b7»çÕ ÙP=w„êW•ü (cφ™üú­…Ÿ‡…@¥ÕƒN ô*ˆeï,á¨d,@%ãB¨d@Œ¶¢RwÏ€:sãO Pɘ* Úh *õ÷H¿é·Q•¬œføg •H:„#Ì'(thõL¦½4*jA%R =Áû+‰à:Â[õ é¹–PÕß3@Ù\ÇøÓ¨s:uN¨k Ôõ÷H¿é·Qêt#&$P(ÔQ•n;`'')NâÏDtÅÊ3)ñx¯JêFÎÞG¯’sÁN•ÔLû*©™ ©$s@%Û¨’Ý=½Ê=êj_%5S•ÔLÂ6$TÉáé×!ý6Jª$ç“0 bïîF+†“ˆÉ;´w·hq1IgrYðW0ÀÍj€Q¡3½ŒŠÙŽŒ¿õ .¦gºaoÚÍûSCÁooÚŽæ{̲Šñ—š„aü-Y Ø€hŸ·±cþtÒöéwÙÅ­ur;i“lšÚaÍÂø„J;àŠ´â"¬1ùhîÚ0ß8á¾àþ5%(°v¼pEC]²Hõ”.½ß"Ø^I[´œµÖ. ö%AP*d`K¬% «ÙÌuŒ?%0J„ ‚â° ¾2j¶:¤ßFIƒ ·Õà]¾==Àql©rš^¤œŒ0:mxeÑ#^* P'2ü˜‰×löU³,Ø F°020®¤Ç¸ÒRÙ»{0˜ë †‡ÀÂ0Ø[Eôë~%Á¸I¢ÐˆzD”Óª !>ÿŠb›Ùœ®äT°WCâDHC`8Bሥ„w÷ 0×1þä@C iˆƒa׬4¤¿GúuH¿’âì4à a‚IL¹qjK«Zé´hAŠí£µáXY1$‹ú8÷°ÛvY°• c>*ƨd`DÆŒ™ªô÷ô¨ó¨cüÉ|T2¬  ’i@d©+¨4Ü#ý:¤ßFATêh¯•Rìõ’´mX²CZÕ.˶Þ- öj•h€V Ò*!€Ä÷q'_+º{­™ë6@«¸ i·  nWZÕß#ý:¤ßFI­zÂZw<‚D‰-­½Ôc°lļ½Åû`ü\°W€$ (µï 1jEPêïDy¥¹Y€dˆ d$ˆïtP€äDPZÔ!ý6J šJÍt9EðF({CÙ;éûà» â ÚÞküMQ—é9 ÇrzД\ìÅ èGF‡èG†WŒYÑú{LÑýhncÆ¢ ÂD]Ä=ÑuH¿’˜c&ú)„ƒk®£8Á1æd£ËàºIÀœNÐ!ñˆvwÓ‰(;r£G™°ƒÀhd¥Ád%âö5j²êÖýùÇß>eÞzíи‰üÓ0Ô;&°¢q2ɘ%uT® ¸¬GèTûC|$’Ñ*‡Ž‰òµªž‚é ¤êÓ¾:ÅçÜ lêwš?oÐK'—ï6ÛÈâÀÖÎæ²?Âõ;°À…e%¿iÝúV`…/•p»C9sƒ±<¤l–ÍÜ’›eÁû•‹òÊ&&%rM°â!ü™ˆ‡ƒ>YüS8e4H;“O ´ŒH æ|)›eÁû‘@òòH æqù鏿\s™1ëûÏtᯱŽ]R¸¸Å·üHÃ$5oã·Ë€eÁüM]C^D–IøQ|®[(6 ±<ír¾×ú€j“qïÇÝÈà쵈@Øþö¦û¨þJú6¶¬ìQ«CìQ ·¬^±Gû{†Nh=:·1m=XbZÍ`+öèpôë~·¬žØ£”“ϸG0–âáÇçP¿#"Ë8–gŠJ§õòI‘y|tðù¡dÅ ׎Åì­™ 4BšeÁ^D±€mÛzé!D±€mÛ@D±ÛöQÇø°m­ ±mÛ'`+¶ípôë~%ÅNlÛÈ®3ç=Ù¸#-ã-¦”„8I޼ÑwÜv‘/Š¥L œÀé&„hÎŽ,4QÐÎ,0Ù°eÁ{ÞºföØÆß ah*B$×5^qï0Ì;½Ç¯Øñ¯ØqÀ+î €WÓß3t‚{¼â¹É«q,Ä+v ðŠ»àÕ ÷H¿é·QЫq|æŸ6GÃ9Ó½êé¢cæÙñ™å-˜[ìUgXÞN†XÞ]Br_ÕäŠåÝß3¨«ôXÞs³:‹ËÛ Àòî  :‹‰å½¨Cúm”Tg¹ÍòN{à$MrŠ´yS¨fâð÷ù‡ `€ÉeÜòeÁ^S€2îTˆ2î`LÕée¼¿g(åQÆç6fS!ʸS 6Ü@Se|Q‡ôÛ( `z¦Œ;ç„«&!PHÚ®x&on{=‚¹VË‚½bo@öBglHìaàÏÙUöÂþžA¬ç:ÆŸ {¡3¡ì…΀fWÅÞLÙ uH¿’bow˜_ŸË'-ü n¹{®Þ\°WÁÈ…è\(¢sàĺs«\ˆý=ƒ;/âÜÆ¬à.” Ñ9 ÛXåBî‘~Òo£œ‚»vÊ7óÞ4ìby‰)4¨óyÐ$Rþ+LÂN j…~¦4ôÙàû0È5LyÔè5µ¥~®/ð1h¸§Ã˜EãOåaP[ ×Ô– ؆4Þ#ý:¤ßFI â¿™t˜—ö\L±3[çºýù>ÌÁkÛ²—»Ñˆó©eÁóø]Cžæÿ E]ÀÐwüñà\lY!eĬm©¨-`bÖážù…ò,ƒÀ2ˆ@bÖ¶”Ã6`bÖñé×!ý6JZ9£"ÎEMâÓ<—,úÑ”i69¸eË‚½Ê¤P& ž¶¥º‚ÔÓážAY”ô”I  L*@=mKlROÇ{¤_‡ôÛ(©Lj¢žž9ù Ž_ó((çs({W„*‰ÃŽ?ƒ÷úãêkžµÙm$ôL›‘F. ÞÉ£s™}¹ñ·XóèÚRåÑÜúŸG7Üc–UŒ¿fþïø›­ytmih®/ûÈ<ºeåxtm/&‚qdɃƒ%…ƒ~üàÀ ‘b°ž±œÝGMk'àAE±fY°×r øQ.H¶-•ÀÇq0‘ìpÏà'9îùQŽ?ÊɺÆ:І…‰dÇ{¤_‡ôÛ(éG¹‰WŠSÓHÞ!9 ÅÄF AZƒ6¥¾ÿ8 Õ½qÂW@->3RîAu^ÁN dÌ'‡¶rh[ ‚¹ŒArèpO¯a:ÆŸ>9Ô±&@mKAPº+8Ü#ý:¤ßFA dLŸÇ"QМÖ"zuRJM¼‰Oh´Rò €6fY°Wi¹J+жÄÙ˜€ÐážA)Eã)-w@iy€Ú–‚xaW•–›IK¹õ”–Ÿ€Ú¾¸Ú†eBòÙòµ<° ž{ή€B?¬&[ìU@iÊ…Ñ1›c R‡{“ÎS@iÊ…±-1Æ®* Ô“ÆIã) <…±ùL›,*í§ü¸‚z‚<¨—UZõ `Z·,xo<†éÙ¿m Ã`¸„õá/¤Òßc–UŒ¿fÊäø[â1Lƒ€OWâ1]ÑØG½ˆÇ,(afþ¢4NE&& ’ ¤·82iýŠ ddIŒƒ~¦¹8W%1—‚³8ôãùûö~#¦—1#~‡Zìõ;¬~‡ PLÛRËbRL‡{¿ÂÏï°ø6@1mK%lRLÇ{¤_‡ôÛ(éw¸‰bJùÈpD\ð8VÒoJdN+F¡ŠòEÆ_·H™¤ô•º‰0zÎ8#sbê þî1•7€˜Ê›1•à oVÄÔþž™uŒ?1•7!b*olcELî‘~Òo£ ru‰?G”+Òÿ é ñ<ÒÆ3_Ä $¤’ßLb¸Wõ9{°@y³,Ø«ú0919Œ$r¾bö÷ ªÍ=æáÜÆ¬ú<Ä<äœÃ6VÌÃáé×!ý6Jª¾ØV<\õœÝÄv ’äãLêO¥]T¼Ê…W{Q )qñø€½k–{¡M(—!(‡1Z.W<Ðþžº¤ÇÛ˜¡M†x \2ØÆŠ:Ü#ý:¤ßFIh“s RÜ? hoñ$f¯RÒü¾~éuAySÊ·%sFz ”íF.õHuªÔ²`/riKRº.Õ*¦:îI ¹4È¥©NÛÒ¶SŽ÷H¿é·Q¹ôÌD$8e$$õ;¢g”̦8q˜°‹A‘ÈÈ,¬„”ÖHuLÓõÌõL, ön{mÊ{³_ÞeÓ‰»àóF%ü€ç)¾ OÊÿÔ¼¤9¿òÙ nétoŠ)i= R ÞÕk$ù6!%íü5?­ze¦m`!EJ«›ØÃÿp‡Þ!C³MoW¾%$Ñà'e¥š‰O_,ÜCQÔ\¹n"j 4å»F¹#ô:í¸%™þ$(™ø½(œÂìÅÍj$#‡«Ónð×ÏÏï^ö…àd ³!gÆÝœ[üÊó$k‡XÉÓ~Ò÷ØD¤XÂ^{íGB-Ê–Xy—›rZã§ýnúkÄ8(xÆ?¡Ö…â#=÷{¬£³ùD¸ƒkr;ñå;àþey¤ÐΖùLëh$˜oØÊ‚òUÅg§’¢Ò3}䜴Ø+GЇ ‡'Þ»"¤‹L¼¯\jZÞkʈO²ÀBϤ˜ýªøAAB Û‹x¢ÉÒ¸($u¡è%˜"ö Ò‹l×s@AŠ´ß&Qºð©¤Žd¯ˆŸE8G–6'^®¯LÔ8ÅÓ$2—Ãu)¿1ñ ž½q\£±ÞÞ¹yx†êR„$CßG"Ìbx~BŸqØ3SVa³^ÜŽAy‡Œ›‘Ž]h¯Ñg8zŸÉ±ÒP8¿kÙK”ÉP-òÙ΂‘sFœßDÊ£JÙ‘§DFOL”xö±’g,o“ rκq Ü}ÿµÐ…®8ôÊOÏV.,x$‰‘¿l›ûÅy¬$vÙù¾|‘íËCTµ) •l||)'à)KJΤUž \f` V~Í`†/¡Hëü^¤5 +£~®Hsü™æzE W8á}Ðv>nè•È =ÀŸaøàïó3Z:Û‘7ýŠ^ù²ÑÎÓ½m%§ôo¸YMü‘‡²ŸµþkWñ@c­üz6!§æÅ¨çÌS¹á¤Ó@IS0 \Ì2K.pä÷™ÖÍ`Þ2‰+eçS¢.¡„ÀÞ Þ|¼?8AYRvÄŸœ?…²B¤¼Æä2‰#¡”äÀôO^ö à–_÷~y¨6vÜ Å]׿éK+4ð½)´U4)+©²ÊÏpt¢œ‹²ýÜ0sâC²¼ü×n^#îLÄÄi:®äl$Ù´‹œš#€p¶/²g^Ò‡^]MßAqz~ØRË÷LÝj2x¨Ë)Á VÚ$k¦ïàdKÑ\©š™ª™ÖŒQÄ9W¬†ôÑ«†^ÃkÂÁ%ÒNRr|.€=zfjf|sVƒMh°I $ƒÅX”{Æ´C¥0à¾àA©±'#àÔE+”B3€>e¾µãAW弄~F1 Å=ÅK»>)DÔ´Õbß «3îo‡ö$ Å[1€Ð•ÝßKBÄÚAk–!l õeuðâ:§!¯¡pìO°Þ…ùOHð @„]ñÍ|2ËŸ1žÁÕJµ¯‡^á(YM ½æzÏ‘qíÎæˆñƒwë­EÜc8°ÈKw0o“­™õ{~Hf#n?~¯ —Ytá¡kØÖ_¬àO¼×¸Þ⚆¿)Þk15BfE{‘|tca‚oáPy6|¥f{¨2]Á LJD<ö@Q@T(Ê[ùù‰Ô†;|æðÙ¦˜ôMO§+âxRÞ”`\Ic¸”¾‚b<‡z¥WNà’¸‡RበOF]@üq—:â¶ŸW»Rá‰ö¦­Àµ\n{C²¼b" iðòW*pÑÞ´¼ŒVÜ€AÃÄÔLb\‚â->g¾Ra0ö¦ª¸ŒV°Û;Á/ L¹ÀßRˆlCàÓˆ?CØg:óüT°Ëv×”Ñ Ä[@¬Ø_ŠP¶õË¿é5¯T Žnjà™TF+¤mAš¹‚Êà¡äˆ=ÅÙ@[_#Ò6Þ7»'–Ñ [9§>³&^T”eåÙU€¤ú|(í<­ŒFz@Þ i{Œ <BŸ‘'ŽžùJH@*ôJTñvjlð 0ȯpR^üèad‘‚C'áXMùq+??cvf­¹ò 'Bð¡*ßës¥dôM !<Òˆ1i»w=pÀ§8 hm‚ ‰Ö·`]_â$Mñ4õJ…u*¬ç’Ñ v[`g/qú†Â>#œlˆxu·¼‚ÑK;³ŒV€ÜH×\á\.ÊáÃéø—?‹Á™¯T€ŒFAñq£BÄk#Ho…Á-äW8±Ãñ F…‚"bõJ…A* *´×ÍÝ„“Ë+¤Ñ!MÏEíOPÒ¾6n·¾Â~H1(ô\/ ·šŒ´&#[F0— B£ÀӞפdצÀSñ±®^MLIÉHQß—QRÄ,“ŒâøÁ75ð±Æßß‘NkÚª7¸e Ü%Hß”cƒø4ÖEq5ÉMî[â«sÉh…Á( ªné K§ºäé'X]‚Ý„;x‚sü Î)Á‘‚€‰ªí%ÏP윤¤¦§$­O:§ÊÕ·lòFÑŸ¤†´¾Ëu!Ú\“…O½Â÷>Š¿Ï«]!-EЙ‹ˆ?u”6ƒ0¾xH+oo0é²<ë[ tì67(²@š»‹*bÍ™ÿ®š™Òqs­|~à¢JbR^6Â7mËuùp#c‡¹“.}IÛD8ÔàrÊa- Åå’[$¹ð m6ƒ#Çd” Y¹ð ÒÖ…³€cú %&ãIßGOº¦}GÌ!‹S"®U=¢L¹ö5)@Œ‹ Þ‚›kdžä”àªI€ ’Ñ+¾£„é"cpÍ _Zײ¦èvÒ^“\¤n^.†~d hI‘ƒ\ûŽ`ö¡7ÅSQöB#ÑÊA&PâP åX@.fi¦È—C ‚\ã3‘*B Ф§Å%„´Ÿ•ö< eµ»åâdqdø¾±sfG&bXp¥Å³ùB ¤Ó^„mc|?«º8W•ƒÈ¸QާýÒ8Ûi‡Òƒ´Ô­´T ˆÞD3uáZ/Q¤”/Q%Ū\aaJbƒˆ«‹gµ¥ôp¸‰"½ÙöÏ¢YY\6y… 3§vÙpØÀè¸y'ˆXdõ^cO©³¤³M‰»2©¥•ª\$Žç›Þ4‹)ÐWÈdóqLAZp¨¦ ¦´$S@ñ‹§Í§ŒÎ5Óæ¿š6^4œ~âY¸€Ã”ÅðÛ+ä{:³á§„ZÊ‹?)€W „`M¬Æè ³PQoŒDs…Qg6FE//þÕÕUh¼×]…¦•ƒ´¹ÎYL¿B S›œ¤£iC•õèJl*ÿ:: •zV)*c:õœVÆ4Ùõ—0m—t=(IÀÒ×Äyh«ëQ]¢)H;‘vŠ#EäJ¦Du¯†H9Wâê’¡$íH——ÑâZ_Í!Q/kÕµ3‚¥%4E¼[ éŽBh*> ‰Í!n Ä%„2 /&‰‘qKšŸ<ñ×{Ó¾)븓•6ÉGý ‰ÂG2ÕG7¥7—\ÓO$rq6]Ã,.޹vî3Ša‰¬Œðg’Ri®y¥º8í¿Ò~—DüJ®µfZ¶p.Kê4¦`à™ùÁc:Q®LiU¾Ú²âšÎiäÉ‹}}ù=ñöÏí{ëE´_¶nØôàÜ͆¼7ÁĽaªíáOAªq¡¤î‚[Öuꉹ+©­ñ® –ß9ë/¬$[¯¯ˆ/ã3Z #ôí¡ò.EÿÈbî¾`íŒcxfÔ Pß~ßÔŒ]€ö9TÛ ‹òÑ¥í,_}õ‚£h„ª7艽ÃkCŸi†£aìЫ›‡ØR®ûwÛãi¢ÑžãÍ>Ÿè@Ï^d&ð+ø¨¢Ï0|¼qÁ}†Š¾k^Mcïlò峯ØËgG Ü¿Û/oÿðWEÞ endstream endobj 1742 0 obj 7420 endobj 1746 0 obj [26 /XYZ 38.2500000 86 0] endobj 1747 0 obj [26 /XYZ 38.2500000 276.500000 0] endobj 1748 0 obj [26 /XYZ 38.2500000 276.500000 0] endobj 1749 0 obj [26 /XYZ 38.2500000 86 0] endobj 1750 0 obj << /Type /Annot /Subtype /Link /Rect [319.500000 136.250000 375 143 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Modules_introduction >> endobj 1745 0 obj << /Type /Page /Parent 2 0 R /Contents 1751 0 R /Resources 1753 0 R /Annots 1754 0 R /MediaBox [0 0 595 842] >> endobj 1753 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F1699 1699 0 R /F8 8 0 R /F1700 1700 0 R >> /XObject << >> >> endobj 1754 0 obj [ 1750 0 R ] endobj 1751 0 obj << /Length 1752 0 R /Filter /FlateDecode >> stream xœí]Mä6’½×¯ÈóN‹ÔW  àvÛìaF7°‡Áö|`0LïöïOV¥²ºRÊ™| ’Jºaw»Ô’(2/>¿ÿÃçÿÝýå_»ïüüÏÝ/óï?~~jöcßœþÙ=ÿúîíüa?ÿy7úÝ/¿=}Ý}}úôôéøß¯O§>ÿø_Ç?ýÿÎïþóøïßvüŸãÿÒó_øíitãñ÷¿¿ü>îø§æõ÷çŸÿõé¿ÿc÷ç'ž_7æòÿ¿ó½ï†çQÜxó×§óWº—_ÿúåOߟ¾?è%}ÓM~纶۹©ó»ÿûÓÓŸ??¼Ù?v}3àŸ¹W~×MýqÆŸŽ«Ð4ÓêÝ/¿4žî”Ý»~jãaW1ÖzÎW(@ÆJ5yö…‚&‡œ>7e$½ÂØò’ +a›1Ñp"Þ+ 3“IQõ$„d*e‘ÖõK¯Ï›j~A˜7\ÅH‘¢ßš\390!_BøLÌ÷”¹¨¦ò§Äš*Ã;¾¢ZpFåÄñn´ÊDb3Ï‘ôRYùvÆÏÇǨW6x¥Â»ô\R]®h+o¦þ€©‡er»„¼ ~=Q¶ÄøèLÉ›ÇRÕÛ^;å£ ë•í]ÁÖ ‘E`ê0¢ Y+ZPªªIœc¡Šº˜v$+ÿG~páÓöÄŒM5£fVÐT¤)EÅžTk¶©Ö<ÆÁz'†'f ÷©õ0oÌ®í ³þ ˆë–ˆQ¡#ÆËÁïaxXqáu(ëVñ2àBŠD5ïl&oºþv‘’%‹Ò`R-“Ã_Š!‡iË`/è–•á4«nÙ‘è @"­²9MQÉ^ ³q,À0k¡å-¨u&NÁT3QÕþÓôëƒïÁd/Êjƒ cÀýÎTʇh¤R x/0 ¦u’1¶‰¹f¯˜þzavˆÎn*ΧZ€*ôË<ŽNT%ðaªtæQ›€øTc›âª=‘?£ +:ù• âÄ+ˆçâfe¦FBÆIj, catE0¶5¦DŒÊàêöId|¥6Jï¡|³­I/‘*c¨V(s%9§q:Ê>ژǨ¸?X†°£^©¾f,I4Ùè}¬N™2’z%‡N mC{LÝ “¼'Â3Ê%.F5´Bã.3]Íé‹ 2n:šaÊ$Æ"˜†àôâ&x]¡(ót— @‚¡ðÆ¡#LØaÞ“3Å j¨%}l}£ ?hŒ5Ÿ M%ð= “ˆ—‘QƒLË6£’uFÉG]0Âê6ýÊQ‘Æ"×”y ˆ™¾PÕ¶cصPÄW‚ÕI¥!Œ˜ÿ™$M™ÉG*ň«g˜ÆR¦·BõIå5%šÆËTºuƒTÏs63jUr;],mim>†ÚrÞè[½ mê+W¡m«Ðf¢¼»X(°ð ”½XüÜË­e8tDe*¡ô9 ¦ˆP`ï`h‹U£îV»‘‰ûg£CL `(¡ïi%ÐíäÌ UŠIð¥‡ÜžÈ0±+ZæjS™&¡ká'ßÛ––÷¡„efI¨C7F³˜^Ý MGL\÷ ¢¥L9 Xƒ ÄiÑé¹àq78F}˜yô6¥¬ˆ†‹ÜÛmgfLM }ȘK'ý¨çŠré°Õ9PVY$p0Ža‰g”%(G ½œÉ—ЋUnÉJÿ=[»¢\€ÊÉà–é™/â@ ŠŠÀ¨)L—­¹‡þ©®éÁ< —0Y„ôùFÜ ª{Æ>V‡aÆ‚¿„ô2ò†9ôñŒRõbŒ®bÊè™]¯[åFd/³8®cêJèý•–~” ]ïC7áŸ<Äûp¾™’ЦªÏc®LM¡K˜k– ˜ºéÕ=ë M¯ÅÌúôt¿Y„¶¼™l01²†¸3#«†Æ3XŸœàÕøáŒ&N«^™Sõθªÿû@<%µþ:š«éP³Õ5åS*TS…‡F ,UºÁù zâ{*èUУAÏ=¿6¥ªK¤ÎTÓévaQtöD«®n²JF)ï"%ÄJ¬* ²‘xÕéJ` ì7†(µ^©ùSYE3JÇý!€1y&êh†‰Ï(sLnA Õq­‹Î(ül‡m ¼+ïx2VéK²ö$ŒzÇr–&H†%ƒ¹&:•==]:nŒ$VâÊÆ2Ãî\ ÌccÈX‰X5dª!#ûYV¼ELq’°¤×Õd“¾'mKà¼zÅ£®Z!´Bh…Ð÷|OJ(ûx‹tRØ€xIT3‘5h.®\z 4¢;cÔ #½Lq’•af¶³Tç@·ÊšÉUã{pÍvÞ$zÎ%0óP`T$ñxÎW*‰›VŒ2–Þw´„­^m¢ü“êþ$XƒrWøS …Qø„‹Mñu2v"!ÊLà†*£·RøÌìàscñ6Óí.´’*]¿¤HyÓe¢x¥0°ô³;Òù¦ÎÊ‚¬öx˜¤€ééblòÚÐQjCÈ·fÔD©ú˜_”Ýr†ÏI$êö¾[“aId6`µðEå|å2µ”É=ƒýܹÅp›èÚþÉ)¢7§{íÂg¾+‚Û„aû«Wrðr˜†Ïôj¥ðW‚8Ìc•fKñ”çŒêc†µ†|xWê•Gº"ÀGÍtÙeºà\·Ìù€«­¸Em¢ %p@è¹ ÄG™€WƧg`‘gp`ˆj¦Å!>üž¾_a¾”Ù?XtO1³Ú§”ŸUõ›å5mS_€àÜP ˆ áäc¥*D[‹Ê z9€^0Ã}ÊdI3†]«ƒ}¶ÖDeº¬Lœmb–‰ñãK`zÐUѱÌÆ`J¬xə̌Ÿ"Kz·f”Xɨ.°ªÒ¯“ßÖ­Þd@ܪpŠ™E¿z,‰Œ9©štj ¬®–å@¡‘ÎÒVUÂ%g#‹©¼Ém&ox£3ä\øK‹lWêÉ“C¥ð«œAäGù8pÕÈOob %pµ[FU”qùÍ;„Bµ3½I ÜØ£ÚÀ(”wŒâ§a£„Ê­É(Õ†¢š<*³·wn{°V”ÂÇbÉ,Vµ©EYá %bxk2}`VåQª]rÔ÷†ÉÑ ¤Û"CU›¤o‘!âL(™9É€ÚFG:Gaó1Ý©&êb¼À å С&ŸÑô°+ø ‹ cEërʃœ¾jNO´ãô^†·HuS ¨ºB#@f8Xož4a`+5hs,Éyd¬€Kÿ¥V1‡Ê~#ý*ûM¹ì7][ûuO>êǹ¢ ,$ÌòFYÁòf”*,¥nº>®J=™,óJMçšØÜ^€÷Yž§J™¨Û±æ,Ê5 ÅúèÆÉ Û…QB„ˆ!DE¨N¦L[øFubÕåÐgz“T!§Å{AW™ƒ—˜h¸Ñ™ÐºÅå ÊPYâ åyµM€*ýÆ ø…ãG& ® üE’ c9TŽÔ3a ¢çaku„‘¿Ëæ2PV&›n‰‹î9Òëo4Ì&õ®Ʋc˜”©¤6v… ×âMËø€LÒ¶‚+EIÎÔdYí9KÙ–À‘뛥âÊ`}°‚dü]z#K•²ð ›\xQ”¯`eˆ˜^y«ãaT»£¶È ¡CZ\Q}3|Y{Œ ð=&€ïé ÁïÁcÓ}O‡g¿Sú«® !xªïiíÊèû¾¾ <‰ø¦á“`áKâHúõaÊo ÍxB kzl Ä™JLå•‹B ‚Êã'f”Ñ£”AÀ!>ˆ@uµU{̸pL:7ùÞöv­ð—b× ×SØ×%²{º5‰×®è2 bߌ9 rk§âàÕ:ÃiA¨§ƒÜè]òf“ôÓÊÚV™o†Vš9'E÷8¦C9ãcêrÖ|‚ËÃà‚î‰JD‘§2%¡%\†šÄª ø¦9©`²!{­kžíµã‹Ï{ì4J×ì‡ÑÆ~µ†ý¾õ÷<Ðå<ö‡©.¯4ðÊi'¹öü¸¥ì_¹g6”¯]9ÉJ·ïÚ±¿¶‡¥ˆ\ù«xH©u÷?>d^ÿvßwÃó”K£‡S_ÜÂE¦F ??mõ«àÉéÂÇ8ÇŸ®M(!bá„´w/œ v„@âÄÙ~„;K&3ÅÌDâyƒ‚(hÔNít µLøI0ÔˆåM†—JuûYßTF™›t"*çð•Zbݤ½Ø3ˆ]ü€¼!‘³™?˜u8ãæ®_çÏ3—“bN•Ü| [ß*\P•ÏtzÔ K0Òheå²Oªî/ÜU Q¥A¸Ã¨Î¬¡½ÛÜ%ÊÔ+oòÕ´¨ZiÉ:¾”Íw=W!l—â2)¢B$ƒ`º® ž¿k ÕÖš‹5ÞƒL¿‡qréj|“›¥Ê%ŠxvtMÌü÷QÌÓaZ@®®G„D·^J„×^‡êNU®úSø3I¬±¶×##Xc3á¢c\×b›[°¦£Ç¸ÍùyÜŸœ£ákdLÜ,àY$ï‡ËôËý¸.]íe¦Öeù¼Ù˜~Þê'¾s»ä«Ë±x~kÊ0Ì”ÅïIÎÛ³-µ÷·À=ã6Æ ’ž’ÐZ·÷xs‰Á¸v •A È!¹ J?ï§I`d‚4…­…‚ÆO±ª fÈ¥,úñÜó7_èùž  }½hT‘îpùmÄ%½_¼3çXïRMõC¸ÊaRL‘/*Q%­—n×pÎe›ºÌ!%ïgíŒ?ôãíɸßÞ¥R›÷ç/BÊï/Õ«G<ìÜtm®çHàðêV×5û“½ÚÁýÞ/mï9Ü¡uÏ„î™×ôÚÓšWÅ0µ—ö¦GWfJë+WfÛ{Ø·Î/4Û|’ѵ{>À÷œøoHºá,=K`º2oó¨£ïË©¹ƒP:nå¨.§Õ9âà§Ï“ÒÀÁ~¸³ˆ¬‹€Uš¨˜Q ´Åe9Mï‹—åZ…š±4ý‹Ý…÷|SÓ ›¯Å#À÷œÝ½v9|…Jò&L˜M·Þ:•=¥×%&õ‰J冰)¨Z¬×øK– F…·4¼f3˜ø*U,³IÔeUÒ'€2“3êR.Ví 3ë_Ö` ס×ècª +ܨ!awX@!c«ª&ïöù¸L:é=”z*T¥¬•›qtÛ²K&íÜ*dD&#=é|w)P8ÁÓ_šc‰Q|w:O”wM'C'ý@ç—ò ‘”Ĉ§R.©Ë6FÙövAUhUrÂ;@Ψq.Búàƒ)—UªXã|&ŠŠ'¿Šq¦ÛŽËdsÊ ’y¸„¦~’b V­Ê6ó¼B#ºÄ÷s¨SE¹¿AUÿn:æ¸H¼‚Åpy/&hÆJfÔ(Ã0™…tG|àºÈûÃ÷‡ˆÒîü©]x?q âôl~V½þá8ÓÐÎʹ]¢Î€CœãVæbù i£]ýUÆ b´4¶`°¹€w£ÈyDŒ_ øzü^Ê©V¼ÍKiî;5|[oáÈyÆõ[}ÑÊ/ÁÚ΀Ñ%+Ö%¿üH|`Eh;ÓyÖZ4ÓYÖqmÖK ¾9§ Žšf¦Xõh*i˜>:ý¸õ±«‹ÌZbûP gLìi•…1;DÑ7­?«{Ø ;aã#¯õÏÂìªÇ}º·ºqƒŽdÄ£öøpÄü¿ÔD(zwS(Z½/og|¼r°ÇÛÁl¾'úÂñšb9`¤·#dTk>¶N”¾tÖÌ×®à: 8êN­Úâ¶ð¦Û{AÍ6¿9×,hI¯Í¼‚åÍ7ášWÃZ£ Þ¸LJÀá{à8¬¯á{Z¼áúà{z|ô0þR|…ØÁŒ¶Ä:DÐø¸r‚ì`}¥Ê¢ºoÞÎßZã £ÄogâJ«Vyx{ªºÁxªZ±\·­¦íÂ|Ç_Н.ððÚ€M‚[WbÇǼ÷¯S“q|Là¡2" ¦Ø¦ð—¦ >„t'`.âÌhaôº1ï€rÄ­qŸæÖOŠf­Ç…jË?SÑwÝåtÄOËu/i¹7¯Ì°XW‡2ɨ}Ú UâØºU:—·òL)múÓVò?ƒóE¾UvîBÙ~r—–t÷kÉq‰SÑ TÇsP´ê¤¨@ÇÍ$ù+èžÄÉ­ÅéY*ž…ÂíŸ_ºûíiòýÛüýé³Ëqðüy×Lˆ÷;ÚÌ8FíøÎuŽñ8ÈH§Rñ¹.CÔ-ìÒõ‡ ƒhþ‰ºK鸙– ËIðᦰx¢A M¡!~~3…Ô¡DÙÃÇGp?WEœ÷œCFÑ<[EŒT0sòãšâb|§þ…ràížS­l6 “1Þi@Ø+ƺQE^¡f‹i&!Ä…vÙh:Ýn#C›JSÍÎç‰×ù¹CÉ ^…ŠT“"ú˜ žC¿ð™3‰ˆæ¥õ†Âj¦«”-‰’ŽЭ2_DÏTèö:LV1øÊŽe(~p¼í2QäÀD S”´]T¦„Å 2Gå2éÕ¼tzPdZäÖ±-ÆE²b4Á“Âtz[)4+"Ô"ü@¢ªí¥ÓKKÄ6SH™•’é‹ËÓDM1CwÆðbæBõxê¥CԼ⥢LŸûÓ ~L„bº†[çáöpÛ‰S|¡4\A‡d =‰50TÕ¥LXöð8ܺg*P9×_¢¥UHÌŠ•S9 QÕˆ’Öe`½ÞÐñøXDõÿÂvùÖ~t7¦Q°®\‰~^ÄÆ›ú›Bé$Æ·ÔQ ÖT£iŒ¢TôÁKa1^Û/¶G ÅÕP\Øæ’Ñk¥uÄ•ô¬Ãºüv9:¾Ì~­ù‘{Úv™&¯ ¤ÀÈHD»HšåÅ0@0UV¥µøE©ï!LS¡ÛfêÛËW»mBu—k:·P^E¼f0]Î’°}T`Sµ:<% :7ù…Pf|Dmú8«Y 3£Ëƒ6©db ÷œ!…ç·D'z¨²uï:þÜ—ûñr –ƒ5àÉ¥x³Ö‘ tŒÎ@‚]Œµ¹u!éÑ0${j1§Peí§üÐäaÜÚ—ŸG×õÍû¡C RÂ@ïwÃÀR®…˜ÐBÜee×¥oÒ €&ûÊhÓûó²é?¶µCñ±wAcä3†@G°!ÂÄõ-9 D·<™…ùkÕû¤¸€¸eŽÛº(“K}h!¹,»Eœ÷ ç3™COuJ—Y¼dUÅΈq$UkvÛöH¬¨B(g,Æû5ÀÊ 9qõƒA®°|R€)ž”÷ó°sÓõ¸Û‹Pg¡š;ÏnÓ)¸²e¿÷˸Ëì4‡ÝóÞ3¡{Î._»t'!rã~ò‹+-|Úü¥Ý9tÇæè̵{æïqû~áTÎNù°o_´G÷Ü|Zt5Ó¹öüÍFǬPNñYʾWÎ O*±üâo"¿(?nñâ{ÎaÔvùéøJ–tÎA†ûË©uC²”ÙìíÖq1› ÒÝ5…Ñ^¢d:⫲öŒKá2cÂr×­E£2/DÉPHE3¤€ÃÈt…Ÿ¾G•e&7ñ˜,aHCd™á(F¦/6iEjsêüÿcLGuTšUá4“±L `3ÆSÓ`u>‹QÀتì˜J]2Z—)ud®Äj @嚘ÂýOÂÛ7ѹã¯Ý×£nU÷§[áÝ~¸z¤èjŽÚýø±;ß]š×¦“dWvêÉôðûS\umz ë+s™ßËØ®‡4î#zO{KJ¯íçùKW1ËYWàG·AlA ëœ ûiX\ù ‡Ÿ® úô7G½±÷üçãˆÏ GŽÚaU ºmÑBãÕV_Á³ ïqx¾±àÆØ¢ïZ×±9ìO‰‹‹v?AíøÃ[xKÿí>=ý)<Γ endstream endobj 1752 0 obj 7317 endobj 1756 0 obj [27 /XYZ 38.2500000 469.250000 0] endobj 1757 0 obj [27 /XYZ 38.2500000 577.250000 0] endobj 1758 0 obj [27 /XYZ 38.2500000 335.750000 0] endobj 1759 0 obj [27 /XYZ 38.2500000 540.500000 0] endobj 1760 0 obj [27 /XYZ 38.2500000 469.250000 0] endobj 1761 0 obj [27 /XYZ 38.2500000 335.750000 0] endobj 1762 0 obj [27 /XYZ 38.2500000 577.250000 0] endobj 1763 0 obj [27 /XYZ 38.2500000 540.500000 0] endobj 1764 0 obj << /Type /Annot /Subtype /Link /Rect [297 476 332.250000 482.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Preprocessor >> endobj 1765 0 obj << /Type /Annot /Subtype /Link /Rect [340.500000 99.5000000 381 106.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nested_classes >> endobj 1755 0 obj << /Type /Page /Parent 2 0 R /Contents 1766 0 R /Resources 1768 0 R /Annots 1769 0 R /MediaBox [0 0 595 842] >> endobj 1768 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1409 1409 0 R /F8 8 0 R >> /XObject << >> >> endobj 1769 0 obj [ 1764 0 R 1765 0 R ] endobj 1766 0 obj << /Length 1767 0 R /Filter /FlateDecode >> stream xœí]K¯ã8vÞûWx=À¸Å‡^@ ž²P¨²dôd2tR™Eþ~dKòµ$”øù¢tÕ…®[ײ(Š<<ïó_þåûžÿûç_>}ÿŸó¯ÝÏOßO٥̳ö¿óõÏ?ÐÕ¥û÷¹¬ò󯿟~žž¾¾5ÿ<µ7|ÿôoÍ¿þï¬ÏÿÚüÿ·óŸþ£ùðÏÝ—®_øýTª²ùùÛíg]ªæ_Ùýçõó¿žþýç¿_Gì×Mføûu¡›šYÌ<ùç©Kuûó_ÿ~ú¥}¯‡äÚ{V·¿j«Ïÿû_§¿4Ã÷ƒg—ªÐ¥Í³º‚ÿæ]êæÙÍýg¥ëfåäÉ·?c+ù¡‹<ØÐ×Y /‡2…r vK•ÛãûØòQE°¡¯³³Çpè°{\©î¬•…øjÝǖ߈ª¶Á†¾ÎZx9º=†C_j«TYØ2{A$\go¬.»…ɧ"áÅ¥y\|輬B }›µôz´;ê[dK•µÍCÊœ•ªŠ³nä€ä; G]ùvì«jìۼŗÄèÚ9¶Ü¶Ú¬.ºÅ1F|yF—[ë*ØØ·y‹/Ém[c‹1`kT§aÖ¢„9[œIZ«L¨¡o³^Ž–ýN†þæ1žFû 0à~:nüøãôË×FÄçiæu{^ûãÇï'ÛüÒØl¶>ÿøóùŸ²LÙ>ÿøÛ©ºTuV4*þík·+™FWtu»b/Ö´vðýŠ‚÷¨ ^iG3—ÜU9˜Eϱ]É>ùÏ-+á8Z–ÃYÃÑ”ñ_¼Ýܾühè- ­¨¼ Þx¼ŽíÅ—]·W”ê‡[²!p uMl<3ñ¦2‡Lµ«c.¦Ñòuî12R6C”¤«rÄv>ÞžZ_n“¼w ¯|EWTï)gžðø›_šâ&íñ©^¢ÌìËíJÞ“Å‹Lq<%[(à xJ;¤˜(w,1~SF"a—‡e ¹Vë°õ ކY ¾ç ¼bü“Θ ].fLÄŽB:E3ùƒtž“γ+væJ@r+K»”ܬ…R°S°¾íà{XíÂ3`lB^8#aÁ`UšRdeÕâ9æ"˪¼ÔoÇsV´ÕêZY;%,OW™1u 'fu9duypV§²±ÉÌЫƒoa ú-;#¼N‹Ã"Z߉ƒÏ8áñ{ÁçuåâÎñ>#½Â|€ë„ïéÕzÓÝ´àJi«†ï¼¾c´3Þ˜“¬»›âËË'KIF·õ ùˆŠX&Âö´>“™ÑaÂÖòÇÐÛèÑd¶©¿1ºD†¹3qÊØÃ¢ƸuEØêrõpòÕÙxf@’ϳô„Ùx}0§Å“¥^㿇”Ÿ“>±lMF;0jñ*EÓÉ'œ 3rhÂ8X¼ìa\W²A*Âñê˜ñ¦C’áõ ÉÄ"ÍÉ1eìGL22Ó¤bYUÝ‘0„y¡øGH£iÞ(aq˜ÂLÊ“¬YMÍ€á j³I{ÓÙ.›IŸÃlåT”3ÌIÔ±ÜÅ|_chÂâRBÛ•}¯Œ±éø·²ªç‰xu+>ÍtÅhqÓóó%¨ä­gÜî-ÚÒ Ù¥(Õ09¸}ŽÊ/Ym†ç{½Z^¤ôe¢"}†ZC‘Œ©Â$tFã p¤h³vļ˜ìœNÀŸÃœÆÐzÜ~*"µbJM^T#qæaž3Áo†MFŠ+1Éo”ô’u•òt%$Æ„‹Ž" Òm…1&¿…&¿p:!^ƒ±VÆdÔ8¤$!‰ì—fay+ŽÉ­îéçbľŽ!ûåbãlðþ3’ (4œA®á›vDñ슂W`潂ûC½~^7H8#Þ‘“ÿÙ­ßOc4xeo;·f½aëÚÊë²Wôc%‡¦’ð—r¦—V’€É9 ê÷ú¾™Ä„Hn%awƒIôb<ݱ½<ª©E¢NðÔLé/aë_Øò]Ó§cŠ¡”©¼g\¸ £“-€ |ÊðÉš3˜XOæHga—ÎrÇ€0G÷HQ]:\£XYƒäM¹dqdE±beŒÄÅGމ{1.Ø Ñzè©Xu–ôó¢7lZ5”|{Kä£jÖWíë|±ºkð8²˜ó`kDî?Ï›Ùuæ9"$JÀ³‰dÙQì³Fx¥3è‚û÷ŠëEÞêðHŸlîdiEìÞ­%¹™|´ ŒQ&zÞ]5ûÆœ©T#Y¢}d9Ÿ{ì!ýº˜á¼à²:NåsÊO¯ÎÀ¡ÑaÝÎ+¦˜˜÷ÌiK¨Ø‘IøqlÑM)ó–T! • áÈY‡BÚJ¬ò%ÆŸë R|ê*ë¹–e­Œê@A%a‰w8ŽßÞ+aÇ1U¹³²ˆmª()þž— äºY¾[ò°QO‘Ì3ÇûrfjñĪïÙ[ ¦äÀ#‚©üNÆ Ë Ÿqoš¼bÂi…²F¤#ÚÅTÌa5iµTÕ“_ˆi$yÝù’ßh~ÒZƒÉ¯bV;’Ôrò˜’Öåa†Î ϿʻI©´È¡Zê‹H|&å’½¥=øÄ`W7Ý‘ Æ2ìÞ1Úòº_ǃw M9{³|8ÔIŠ9ü³qð\ñݹ®†òNxõȃ|GB,´¶ÃïÍKåÒ0þB÷‰ãn3ã\ånoì-†s¾íé÷ Ž'Ùz ^Òä40‰Dø€N†OV“ –»êã@”Ÿ;eÜ"°¢AýìÌ,U‘úUrýŽVäšÑô÷¤ây>¢„-õ`’ͦÖ dãG›&‰6MV©jÒ¸I3žRs: )¤Pc1ÀÜ«CL˜y~þ–0óJkúãt`æ˜yÛ`Å~4Jì‚ÂïƒçÆ ¼­Ži(ŒÀ·úºum7€zãVwn}ôƲ®†’ÕϨ_ß´ocšô@¸ºëäÕn6-ÂçZ>°¸iÿaÉ@—cö‘¾ ²³)—n¶O‡÷Q´$:UwÑŒsä)±l*ïN0U+¢>¿õs…ÈûŒ­ëÛ©r=<Ù۔㇕·U+/ ‘—j;ZÊ; e‡Ù;·?Á âZß«Ó7ˆÃžj´ ±¼¾˜›8FÃsÃþ`ÌkñQÜXØP«|DÕ› NŠi¢Ì¤ `¤¶hUï¢ÙÙq2*íɘ‚JÑd0ÆR ;x4a©ÃœÏÕk+4tsxÖD={rc/Cr›ÖG0,ùnÂU‰•›‚¾¡ªÊc!“®˜:ª¸ÂTq¬W‰:¬;‰;úÔ6'X}’rïDVH$ë÷ Þ+SÍ;°Âš¾I&uD¸À6= <çïµ´ Ó¡wÕãïJ= c˜¯,¤$€K©aRv†žKi|()¬+Õ*5«ºRÍh2¦m’ÞƒøÜ^*ž- Ï=<âtÉÅéŠì9íûyÊ "½ #e°(© 63pŒ©þ°uþP•&¶l¬ÊrôHŸ°BJ’ˆe„õÃå!=‘VJŽ™0® ¦%V?ƒôŒÂÃÓ užœ:¯C²Oð¹Mô5°y:¸ii™²Ï¹(Ð Xo¡˜ß¦$êû©ØÙfRQÊ Ç¨{F–Iyä2Q¼-¸ï œ †.E5”.‘û…uÆäŸoüvÁ1iº5ò¢.‡\Ûœê¬ê§Wo¹iH¼_Ì–TTviÁÅ&§ ¿è1îXW©íwÏWxO ï©zm©ÍžÇõPŒsQZžÂ—\s댆'Ïé4¹âb”‰ý8Ø%&³ó­ÛH8•!¼`š %+ÔEr•CI}óHÅ'_‰¨ö_±NÅDÑdQ°ˆ—ÄÄÊyé–×€Iöšžè-yd36ÖÔó[(ïAðQ­¯<*˜ˆÔJŸ°1æ*"vTàÆñ ¯”™©¤ŽBÚ©ìw¡G:Æ{ö RÎi¼Ë«Fbj¹B¤äífT•CÁº)eE¿9ÆÌ‰Á'©p泡RªTa2O˜C‡É3ÚÌ–JÛfór»© ;¿NŒËIÔŽ§ì¦Œ‚ Ì®îÄ‹Œ¥RÔUÕ(©ß¤«JÖ“ÃàcP©>¢ÞŸõ­JaÄTðxäPÌ•T©¬?¨±UÎ(¨Â÷ÜIdLpÔey1“ ‚*­ïz¨Â£á Ú'¸8TVû_Á3Páí7íDÙVåþ2[iGÈ([au>&ì”eF[î`ðÉ¢ôhµìáê%x;…îtÔ®Ï$Òáྠ¢àZ¶5&c£2˜r޹-?È1êS¡©ÇRf ‘XœX•-LzÌ»bDÂ6Õ~ø®NÔ]Y9·<HÖ{ÂëTQÙA™Œ}¿QW¶„"ù‚=$¦`•Eã4„u#ÆÍÆS¬* Æ57 C`>Š’© ’mÓ“pFàŬÆÎ_¡" DÅ‚pnÆ•8ÝG–8r¾Bx]¡æßL4ØÅä9O Ñž¼“!‚Vôêáòï+Ë"p{ÈÌŽhw3‡åG½ÅÑo ¶#ÂES¸4ª“ç!û³Tj¸P¡ ;F¡K/3ÖîY˜ GóÊÕé«:u9’¸ª3}vç×3Π»4ϘÅÌ3l^z4ÕŒèCeO3µï cwS±—å,‹jt+ ë;¢èŽ\”c½çgå8ÃD8Š"š(çãíe>HVÐ |SŒ,Ɖ²ˆYY˸Sô†Šä¬‰EÙC gÉ,ärDY€ Þ&óœ*4oêüp•š=?ÛªÄK8òIa|ÆN8>e"¤O¨sžÝ ŽÑc~þH%›*¡{¡Þ?¥z5™¼Š ¤MOĉjh ÷”HÉñÁyfwƬÊAŒÕtŒ±ÖðÞ~/Saã ÉÇáPžðÑÖ8c­˜MSÔÕPh wXÚ”IFÈd&2 ‚±zE¾)÷Ú‡;qÈ*­“0DaM„ÑÕbùlD 6DÒ-¦*˜¬À»CúlUU,•¹±|s%ˆå;öŠ˜%Ú‡Fˆ¼\>–VŠ îkÔÙ!'_;ÖÂYã`¿Ñ À³0ÙÇcµoJéË“À¨„®m*lãE¡Ö~Mo­‡ÇžQÐâ…QöjÚ¶¹IÑ£çLä5f79Üc1¤’¡eîpìØ™Îx Ç«ï`EL™9VD;Þ9Ž´G*H,åR¶“J¤(h´€X^ Õ ŽZ[Îß1aYœ¬…âEJT…9óñ—øõHvI`q8–ryñS¶ËCY²aŠYl½°éüE›ÎÿF&¹ÜŠ 7\"®8f\½+ê|tF-„:ãs5a£ë§z06nÊõÁÑà™¶ph#kæh×¹ñ-¹ eª ‹‰ð§¬9FQųZ¯p\¶ð‡?Z¿h`Sté•o4R”ç/>øVFgÍbKßI™r´C4“lß!Æ/눖ïËE'ZìÏœaj@HDZ!eëV=À™ß_ÒtzÈ"2&Œ‡òÌÄydHwT1’«ÛLñµ~»Ç•Pƒ•h?Y´„jù–ª.¡n éY¤é1÷;á¶«®¦«~]¼ëÚ—놞?UJ=~ðÛ黃´Ãœ‰ëÚQWÞïç"ÊŸ¸[ eBaƒ#õ_ÑõýŒDê¿âxì¥ÒGЧ½TºµUå¥Ö£+ŽÖÍÀöªÉ’|èU×1Á)ø¦ÏKG¾Ïº¬´kP\ÌRÍÀàý™ëóÜ´oþëŸX6±G¢`$÷`´¾ÅE§d¯TÒ28G ‹ W*åÙy¡$™š#^ ¦ç“‘`nû¤HŒ¡ÌÉö࿨‚ ‚2&˜DÖ¨O‘P²P6AÓhìHdÅ2£ šdŠà$âGòœÉ4þI›1AW+f¸²Ú*·7Ú6á-ëÑ#)sN-HŽRiˆ(©£º`ùd™.c²Î#ªN+挦DÌ`§!‘ ‰5cƒq{$ÖlÓN‘ÀyJ0èr(Âñ´Å ÷á{D6nuU†ÊDD‡‡‚y s†Î ¢]}HÙkF+¸%'¥áG¢Œ:Vê"¦bSÈ((Lš­l„:0p¯l~/~A¦/A„xà ¯­ªyN!‘¿Mù|(³ñzÉÖhã÷ab"˜#­žÈ¸d…Pï5N£J¬D“¬E{IÏHQŸDhüÞG/hxF eÕ%x>¹ŠÈ1†G<@_StJËê¿ICQ­‰&á&ÝW¯ÓCSNSSöéV0Ç'Bºˆêr(= Ïð/(ªòCèÄúPbÕ=K䦌È1kå÷yÙ¬ô_l‡³]'˜f\'p25ÙaY±À–#謁¡Ùb4¿g½ŽqGc‹®t  Pdª§ò'xDáYÃ7ÅWp—jæŠc| ŸõÙE·¹ÛŽuëCtgÖ Ÿ¬î4Fau5|¨ Àd©0¹hxÅ3ÀË‹7Ü`Gyø>x6ªw?¾G”=9X1Yü)~±ŠTDMBÁRµŠÆÜÖCÙH¹–Â&ûP©jLuñ69ëjP´¾5aÄj(²¾taÒù÷ * Í-¢~Z%„þú‰Ô½U2œ(*+µÜ‘`è)$‰:oöjªÞ‹uõNÖÓ¨ CÞ‡Ù&ÁÆ„¼Þr™5nX™UhÇ¶É ©«c~ºŸsúCXÉKgjH_ލªrŽã0õõ±Ø8ý‚Šƒ/—|"¸ )·v¬Ÿ,\mtÎ"¿}ñúÝöƒ_O…½(UëªRýwÌ`󸀿ëíïÅí¦óðf“Ð|ÐÜ1˜Äõ;Õ`ˆjø€¿ž>þ!Tç­Vé¶wpxÌÞ ›Ä|†T#Röìá`@TãÖA µ¨=lïø{+¢”[ˆí-Œæ¹êÍA³‘#»ÇÙ`¼:| ÷MþlKÁ9¸d ¥x´ý¤L®°ý°'ç°Öß”Qe·ý\̰P+¡ËR÷ ,î¼oBºÞmŽŽEÌeoPse] 7YñB@,¸ìÔÏ€ëò‰ç0xŽJzñ‚ÂŽ€ð1ŽšgŒMÑðhxx ± ‚Q¾"‚«È1˜¦¦œyŒ¬Á Æ Ž{D“ ó¦xE12³ÆüîZ˜©“S•Êçé…á²|ƒÁ[!ž“21:µÊC á÷1b5d hù­”,ʤ>†*9ÃàQ’ÐD(¹)*Ÿ|ÃáYÃ8NÖíRAŠŠsKÝŸ{<†*ðng“Ò>x\"/}Á`z!Þ‡¹‚yç,æØ“+VöÔbþ„ך€eì;lãR¼óh8šãMç0º¢p‡zŒæqÈçC>¿ùÌ<‡ò%ÉÒá1’µ‡(ÔÙ$t¡ZßQ-0%1þ‚CR2ÛtXKÂÞi†b1õ1žÁk |S‡ng`íâ-:f0§wŒáÜÒìló¤!õËàEpD¼%:.yŸ0)>L¸#hÍ„™™ÑЬiá þɶ#« Rr¨¼4¦ÄÞ‘€ÙÛå'Í‘°VQÇyÂËÆÀÂÆþmV§eNÈŒ¼[eú£¨Z-ADR¦/y:Kà‘ö-Û™VäuD[‰Òÿ½“­ßÆpw:@¤¼E¤Ú‘‡9‘G÷܈²²ƒqy–¢VÁT#ÒEmÑM)iÇ+ÊI´Á@¤ÈBCË"˜IØÐ#@¶T@Â<À´Šy ¦!ŸÎ­k!å0Ž ‘#.‰sÞ ¦5š\Ê/"gÂ!ý-»º&zA*År!^L>¤/ì¼£ý7YÞÁtÅñ1¯Ž¥Ó×$,kůN51¸Æ^Ž{&½ ÷ø±¥Ã ˜ 6ËÕ#&Có»žb24ŸÚdÂíƒ!&Cû3Â<> Ådh~Ϧ˜ 6³õèÍCL†ö;Õ`ˆjø€Ð˜ ͳúþ‚Æ@JÃt‹) _‰ÕäiõúlÙ6é±0•§š.Ãа¢!á*ÕfÆÃëèˆáE*Ø]- ÉÐqö?á"FÂŽr¯1ë¾¡ŠªXÇŸ uaÈb¦1¾9ÔbQ$z†9`Q g¶¨:²<ÞÃA%˧gÈÄu–Ó*…] r¢E‘Ê…½àLœouíš9X Jò ‘à A¡µ„¢Ñ32”>³6¡)÷#n-Ì$hmÇÞO¶h^KԱί3ޱ²G—‰¦Ûam9V;Ñð‡#I¸ rüV;ZˆF6Ec}mk½Nk"ŒÚÃÛéaÞ·±Ãîäu,ר!„}Ÿ ~ÇFix7)͸UbÙN[k°SvÉo’öˆWáSá@j\½Ýr`|O‡.Êbåð1QxÿNX ì¸R¬DV.ÄŠZ©kZb%.Sæ@Éb& k…~¯ªÉÆÕ¬6*¤ÀøˆìrÇIežsôà äN x«îð ²`H²P`#Ô„þd@cð›bx–bÁ EŽƒïòÎa udáï» AM{J¼rÊ€d˃QðÌ ô:A×p4<ƒ¹çÄáĶšß-Hƒ¨A*g`Ãw1' D Œ>–ÜuÈC¼n%ÊÖíM~0СŽÝ&hŸzMÀ®/…! #I½$ ­*ú<«h@ù¢ç9ÃT±:¤¡ìŠ2"º€FJªŠù½Ç»…Oq…’ ÿ'K™†F”´çW4 ½è¬ob„*$un’:ÏŸTHê¼0^?UHÞ¾cC˜Çt’:7O*$u®ÇÐã ÉÛwªÁÕðÁ+$uqßuŒb˜0¤•¹‹#Æh:Tòò˜*ãHÞ&Ú–OÐï3Éek–n¢Û*&ç§'A ‹ÎÇ'ë‰FÅ*¥›â@0Aä𵔥 5 )0ä붺sGª0Ô<Ã4˜êNëq„E²j‰²´r‚åÆ=ž^5QßÕ²c¯Ó+]:ˆ¾t’ïâÔ*?£ç˜9kýÙܾvoŠ„/Ö!ì˜Ïb?[1}ÁŽ ±¿{Už¼†Â£Á{:•Ky½úÙ²wýw3ã~£áÌñF+¬ãÀîr÷žl4Þ=ÇNà+xUá= ¯7&ÜGô¥}-³ê¢Z"Ü`õÚNÎYööíüíôÿÕ/Iö endstream endobj 1767 0 obj 7707 endobj 1771 0 obj [28 /XYZ 32.2500000 715.250000 0] endobj 1772 0 obj [28 /XYZ 38.2500000 353 0] endobj 1773 0 obj [28 /XYZ 31.5000000 716 0] endobj 1774 0 obj [28 /XYZ 38.2500000 353 0] endobj 1770 0 obj << /Type /Page /Parent 2 0 R /Contents 1775 0 R /Resources 1777 0 R /Annots 1778 0 R /MediaBox [0 0 595 842] >> endobj 1777 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F1700 1700 0 R /F8 8 0 R >> /XObject << >> >> endobj 1778 0 obj [ ] endobj 1775 0 obj << /Length 1776 0 R /Filter /FlateDecode >> stream xœí]IäH¾×¯È3Òd;oBê‰RkZâ€8 „ÑpàïãLÛU•v~aÇ—ï…—r·˜.Úíp,/Þò½íÝoüóé¯ÿ=½ûøã¿O?u~üñ);—yÖþ:]~ÿðú/luî~>•U~úéŸOßOߟ¾>}mþûý©}áÇ¿o~úßÉž~×üïï§?þ©ùËŸ»tùÿ|*MÙüùëŸuišŸ²ç?/ÿ·§?üêô¯ËˆýçºÉÜþÿliªê2‹‰/êWi®¿ÿûÓ¿žÞµëúHî]YœŒwþdjoOÿùËÓ/ÍðýàÙ¹öÆ”…/³>SÚËwL~2¶n¶¥}åú[bl#>´7Nkè묅·Ã¸Â„†>WE÷ þÌ}¸j¾š× yS4é¨(êö@l&OHσ˟vU–ZC_g-½%á±ÏUCf®´¹¿ïåhóª²ÍÏ¥ë~=²¦Ú÷Çl+ñ {\ü,rsa§:Ç|µô~tÇŒÇV=æüòE­c~\þ˜}®%qÚYës`l1¥â‘>.¿ïu¦v¤×Y+)[ìH‹Ëå¿nMÃÜ„÷æelñm/œÕbóí¬…·£=ÐÑÐ_#†ÀÓhÿØß/~øöôî‹ñ`ŠÓ·_š©]?Ùþñ­ÙŽüôC£p6»üíçÓ¯³Ì¼ÿÍéÛߟês³~‚Ý“>©à“=ÉjøÎ‡ë“Ïßš­{lÙhÍ>»¬Ùû¼û¢kçb²sÑœDc\WæÎ&uyðjþþúÄŸ ,¿]™½>©ÎU]÷òäóõI~v¶2·OJôŽÁ£áähÖÝÞV3&‹—îÌ`ïàL>¢'£A²Î$ƒ[‡ÏÜ`øÀ>½ÇÃ{ wO¶® ü°ñpxâ$¤Ê7> 8š­ã×ø¤![ÁÀ'àëŠÏ^ÊÀhp=”¸X1á6ó=<·–?׿´™iÊ¡ÒÝ "†Fd>ÄQœ,õ`iF06ó)‘vQ=¯¬¥qcû¥Í9ÔDÌo,ó|†ø;#‹9(ÞüÑ ˜jÛ'Æô$8c—ÆšÞƒÓN}6ù9«Ý-鿇£}€„Èèxg#Ž/þ0£P9B[ÇRk¤_cæ%*|W‚`¹X‰Å,7ÀŒñ!B×ǵYŸÝVñæû†DÅÌ êÚEž·‚(@‹PÙ ì#|±RǘgðºËÍ” Á4¿Á éLm ³ b4jÖó·Ëa£/ PÜ~´@|Å×O– ÈÀõ!ôªÀhبù" Ð1P•™‹…2ÂæOÄêeb]U™8¼c}0†gȘ¹1Xf*ñ6Ÿ÷2Àëò ˆ’xæÃEØÃ´¶]&B˜Eì–,•Õv"`Fý!nO€‘§B§§@*}`®®û¹`ëc(«¦À3·kÐ!T˜wFlŒbVóï–÷ˆ¯M‚Ä÷VŒ+øã]ùSö ˜óF¬¥r~îÞ©[à+!ô rc€zÙ;T· ¥£óßÑ„6K?k‰UTe—}e¸…6ƒN‰LZ–;/eã2 3ãǰX㓵qwªYú’(Ôø¸BŽä&ÄfÄÐÞsL²á‰KÅR"8Ú]£(÷L–—Á‡÷ó Y—÷| ÁÀá¼³¼Þ/¢»Šz¼—àýpJxx&x†ðÁFÜKJÉ àr ˆs { ›VG½rSMnÏÞ¢bbdˆQ^DQiá° $[6q2ªIñÞXog-pñ¦œâN5ÂdÅL+ÅʾvÙhç˜3Æ[‘Ò"š"cЉ³²¶£Ü® ‚MÔÓþ¢aœÉƸ-« ÀÒ™[¨-dÖ₎SQ9$ Þ¯0øklÂгôŒÝÛ°áò™B Âø1ù9ó…ÀΤ¡’%JUÆ”Õ\YÅ¥§Iò-ÇÛ7º~ Nàså#d¼I€o£”·©4ŸTÂ}ñx·mAhIÒr™–+Ü€k¥Ê÷ÅšSO‡ ¶œO¢ù¾4){ AS6Â82cThà|jøddì~˜8›{O>ï|†Sú2¡ãâ£ÀÆ.Å¢È' 3äŒ}˜*é…“¡Òæ‡y ”ÃÙ›°iAÌ1ÞÉ£ eæù-ɤ㎌3´dͨô8Qí6 ˆ 8ófáîX#¹ ò›C•ÕDO\»owüÁ“a†×£:Y>¹ÞŽª/CÕ…Œ^¸‡w÷8\q.òëŽfyï½ÓQ¸µçÂ_äe´vk¨KÜùŽížøþC3žtt|o= > ¬´£•bÆ—;.b͈wÖQÀѾğKÇïM9–}x…ïá;xѼ|þ Ítr²<×Õð >Ÿð e˜Z[ĵ(PᆷœA(¥@X @7O‰HBNU'(ŽtxÓ´¼iX{´—­qÇl›¨]6tÿù‘kÁw5ÅOíòg>W‰ ØSQ—ÇŠÈIPH„ÕcÁŽw)†}Šúì¨ÄßùÎOªÂS¢s:”ÇîS„ŒªœIÀ9Âõ‰$"|)TJ6BCËVMçËü­ÔNÍcB’ ¯>ƒùù¾3H9BQd£Óæ)RK5©X­ù!B1\Q¶nñŠÃ ™0Iª 2Ÿ™š“²!Ñ»2ÁôQ6_Ohÿ,µ²ÉVPef{ãKÇ¢[t,4ï=ù€žàVP¾“ÁšQùøw,|§£Ø¸=pôz’°Ï¦w炽¾ðâ˜Ñ˜Æëqb=Ŧ·7¯¡7¿!ÙGb{ñ-Á-Ûà=Å7ØáY‹Þí “%A|Þàmî¦7‡Ÿˆ¹¬¦¯LYmúÊPÜÏš!r8^©…³fD¾2ï`e¯TtGs3„J€© Ï2¿C­çØëÐ^¯‚ ÖÏái ©yy<‘ã' ¸º<œÒTÅ¢½¦§ãú€¯@Ó_xez>…D†@‡gßyâá;ÞüŽÅ³†3À³öX„ºtD‘û½Ôj ž–Áø€1Kƒ·Þ2äÏÇb‰AøN÷uT­Îž óã8´TY›Ù{ÉÀÁå3¼×_:nÏ/CLÅÕ1ê½°ç\W*ÙÊ ˜C"¤§3 4s Û;¯–&q7é×=8W³nÅè…>x? p†Ÿ3¡^&„G¤È&¿EPâ `ÂÆ‹MP%pórÀa05“<³Lõ$ê3'«5(Åu0Å4˜€E”…rhI¬ÐLn­««•HÇ ˜ñšý܆¬’‰½Ã`Éš!-ž¶\’ŽHõcÙÓéEÀL)¢¨lþ:Qµ3ÐàFT3œT~4#’­ÉÂD(’(}ä5¨1)¨ÛéÎ6cÖýH¯Âù,HÅ)2K—¨VÈOX>+•¹ÑÄ ÜËQ¦*Û›”—”|Ηþ³œI¢p2le—˜Ç½Ê8²†ÃSÝ0$.{D¯Þˆ´ì#‹lÉ,2ÑDL‡e¾ž0祮¦s^RŞ“åˆ46·ÄKâ tfq`#|‚gà™wòt›h3ªZÜ]JÂn$ˆÁ:Ù$ œ¡÷Àa8ásÏY…øRo^=B½8–S¦k†[âÛE Ó_öaàÆÅ;¹êȓө§ƒ–·I{rN£1}°÷ÂŒsãü^©êMø'§8w·2‹‰FÖ†›s›õB®Ó?ïù{Q¶†UW5øN=áQY-Æ]C€,錳ܽ-b¡îœÖ[Ü|Ç78‡ëIeØã0ùÐÑ4`‚¸¤ã‰î¹/â* ÷܇#w Üz¸!©Ò™÷Æù0¯Âü€Éóñu<.ï•U<¡pÜÆÝÞÆ7r¹ºG•Vry㎛µß›u}W"w½ï|Í@Ÿ¯Ê[r×O~Àq óÃg¨Þ°8,(¢ÑÂRa±TðÊ‘M²¦l’]V/5"ܯûh»¢ÚvEQPå¶HªT}Bˆ qÙ*ð1T”ª$:ì á°äÀïô¸ƒÊüD$Lš9'&·ó»Gå¾òåuu'*žÈþ“!TQÌ8np‡—ãçeóž0­ÂKE} ú–l}©ˆÄ eêüÃÔ¬À£ñê¢j3onåçîÂ$RyB˜Pºj¥÷. “W‚³²NÊòH¼`uƒhÈø0³t‰¥Äé`ê@Ožh©­‚1@˜ÝŸßXPæ²ãï1¶¥DQÌÀ¶ákCL–):&ÓØ2½åhm}KúÛ†S)Ç}SBÕe„…SêdÁ ÐŽ¨ÃTË…h¯礛,«]̃bTjC·$ÕM¿g:¸Ê ꩳ¸#D3FjðÝTnåµ"Ñk½n©zÞŒ–ÈìÆç. q±†ÕÉÔwÕ+nÝL¶?†ö€Lvn%ÕhþùÙ…X7˸wÞÃwjôNçonΰõŽÎðÎh;ÿÞ‡¾ÓQQÔÜ:V~‘fCÏô4šµè.Ø!nw>»“¡tÁ÷žpàŽâïèW]ìL˪.nPÀ´i^¼ /£#ì,u‰^ Lí™Ã ~O¯ØYœå†Ð d7Õd‚´hÅÔ€3ð¡01fÀA ~ eI›úŒÿu~+ªG,6LpU*ROkNßBÝ\¬y1ž;ÀÞ™÷’*TŽE¼hD.SØ7p>ó£™(-jß•]5‹çå­ðÚÛ‹³ðyŽí¿9e¹Êö="Š¿ w¸Ã:Áxy1Ý1u[#|*ŒÄÓR”ŸêX$j®nB“””/µEG‹YŸÐ‡-ÕI=Gµ‘Öí,…Æ \PQ^›¬ªH Ìz€Å°ˆª² DÍßñ1]cÎZÄIAº¢pb`J¢ÐS¤› ‚Dõ me@‹ôÕ@(GðU†lGË2K9Gý„ãúb@¦$ ¡ùÝÞ,„ñмiàè\6´G6¸6‘Ëš"7ÑÐIù¦oÛ&‰Ô×”:¥»; ˜"Û!%Y¶(Ê™š*KZÃ…§[µæB‡·äÈ×?Ò„rZ_Å«iŠÆ¥Ùꪬ,Â…ù‡ð^ûJ;¤•݇”¤òýóøiªäEºª†—›I4UŒaq)F‘°F™Rùý“@ä¨Ã^HŽã¤F6EW„é/‚"ÜX4Õ=p,‰j²ÈF$P%læ[ø”s-U*CL‹WYÚQLO–›ÜÄ‘y°qU tPkÏÛ?zÙ÷Tˆ«ú{ݫݗ95&gË "æ$™î“ˆV¡G©îŒÔA ˜'ÛûráBºŒkå^˜ƒ $U{k okp½Ú½ƒB“ænWÅ`·±Æ4A]Þ¿·¼M""4 9EdêíDš‰šr©Z“ËÔ섲!磩’™ËÊo+äPøx"U(•í-j¹l3Z`G÷Øñ‚YÒe<|§c¤&jéå Ù²wù¹™qÐpæø »öºq ÷3"B¼«úøð“À~Ã7ø$ðJñå…3ÀtXi׃©Ïú¼ˆÌåÅ3]^¸ŒÀ¥"HFå"b$ï¡+ZfÕÙ´ {}Wñ½s¯¤ø¤¤úzúúô‡ %n endstream endobj 1776 0 obj 6477 endobj 1780 0 obj [29 /XYZ 38.2500000 654.500000 0] endobj 1781 0 obj [29 /XYZ 38.2500000 387.500000 0] endobj 1782 0 obj [29 /XYZ 38.2500000 654.500000 0] endobj 1783 0 obj [29 /XYZ 38.2500000 387.500000 0] endobj 1784 0 obj << /Type /Annot /Subtype /Link /Rect [453 704 480.750000 710.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps >> endobj 1779 0 obj << /Type /Page /Parent 2 0 R /Contents 1785 0 R /Resources 1787 0 R /Annots 1788 0 R /MediaBox [0 0 595 842] >> endobj 1787 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1409 1409 0 R /F8 8 0 R >> /XObject << >> >> endobj 1788 0 obj [ 1784 0 R ] endobj 1785 0 obj << /Length 1786 0 R /Filter /FlateDecode >> stream xœí]KäFr¾÷¯¨³m1|†I3mÀ‚ðaსõÚX¬ïÁßÕEVu“¬/Éü*"“dQiFC2‘ñŽ/~øç_ÿãô_?ýðó¯ÿsú­ÿýç__Š×º,ºNï¿þðù¶yíÿ|ª›òôÛï/ßOß_~yùåüßï/Ý¿þü¯ç?ýßÉžþåüï_Nü÷óÿÔÿ¥÷¿ðûKmêóï½üÞÖæü§âöûûÏÿûåßþáô·÷7^?×Oføÿ°)Û÷YÌ|ùûËu•æòëï¿ýíå‡nýQ)+gš“ñΟLëíéÿóåÏç×__^¼¶Þ˜ºòuñÀgj{þŽ-ÏŸ°íy›«ÉW.¿$ÞmÄ_íl«õêˬ…·Ã¸Ê„^-wžõ™Z.Ó–â;s{·ü¦7®ÒzõeÖÂÛÑŸ'|µÜy6MÓmŒ³N~ׯ/ßõÚšBVÞg-½ý‰âw‹iíËžÖm%Îs?^.¤ç3ÕzõeÖÒûÑiàÝrGÚ§Åu?Þ-¿ímQk½ú2k®‹_-wžmÝ«e-¿éµ–êÒ®T#•÷Y oGžðÕbçÙ˜+¡ËŸçÇ»åÏÓTZW¿›µÊyN^ýKÄ+ð4ºŸËë{àÁŸ¾½üðv¦°êôíÏçy]¾×ýöí÷þŸ³5qž÷·?þ±(|ýO§oyi_ëê]]¿Ì®1ÍeĽ–¾jêÏ#Eui^›¶=cÑHá/#þÕ»Îèý)áwjø8ƒâgôãà3ømÄÜ+…s ¬´€#æ2bÜ«;SÓyè6âà3>Ÿ¯—‘òú²O#4K¶˜y=~.Ï€0ðÛ|ü¬„Á3Þ7LLĬmgÏ3xrٖ̾ tæl _\¼oêÅ̸[Ï×og±£$2*;”Ìe\2†5Lxqg'+ÆðíÆsÃT ߸©ÄíN&þ—‹Jçg+ ™a‰‰Ù|,^àñS‚“ Öo0/!öÀ|‰ßuã…`!t e,p¶X<ã=ŸL‰!7b²¶{›1סosfãáÈ3p1çG¼[_äWšÑ7Eô$¬öcuÅk/¶'ëÆ t^ÆI…—й9VÑD¹+öDFȆ¢WJ‹×ª6CU§˜¦|-Z7$¢áÛºëjìuèc_ÒP†ÔSt¹vm‡Kè'zÇ8òŽès"c† xfÕ@ÄÌܦ/^6°#ë¿ÇìZ¼®„¶p ÷ ŽP1 Æ™…Ý LPq€ÉŠ»J*,ð!eÑÔ~Ä@#ü?X!IÆ>£À G±è½Ÿn±èv\ýÌdÝh²x—(8~füaafEøz°‚J)xD”#›cE6X#sk&B𣀆’?ÅegAŠºæ¢úžý€l \{ì§Ã2+BM'|ÔuÉbôOâŽÅ8!¶¤åL“‚À˜² ÓOµ)©âý;Õù§Ñ‡©Ð3‘´¸•Lßgè*xÊÄÝžœEÙõTW:3žõaß–Ë¿ì3ì(ñŽ`‰‚ ²yaÓ˦ˆ=”Û”˜8k[Qþ•n,Séq‡û`Éuܤû Uñ„2ÏSD‘ Ä¤š§º·¹á{QýÄ”w=°qíÄbOàwl›¡ŒÜ”EÎdÁÄ„5›fÍüm…ƨÿÒÓ~oK-ÚH,ÐáþN¶ZŠéK–Çj: ¶©·Y’š$¡ØÙ‘©°µä´Þ×WV³Gº© ´YÿŒj¾ßhOˆÞÛSÙr¼õéF+”6eƒ4-,m|ÕÏ­˜Ì-UÖo{ÍßnÖïm *Œ5ªRê^Œ3ÃE™Â)Q”UE¸c˜t6ªt,—ï=U°»ªÛ"õ#Gð;î! ¸©FÜq}á*= {\P¶ B[¥T†;Xq1†ýÏ7È\¢fÉó9œWÈ~ › iÙhúØÝ¬À;âÃÛŠoS?ØD`„ð?DÕ DÕ–Hv©ûKs'Ú»NÆ:ª¬ƒtݽ²mþÉ€3SQtYÄeŒØ _s…aœÝÅŒ«§ø™+è•+®xd5`yšÙʵ aÌàˆë¨XãpáYZA'ÓZVt#ð¯w*G‹Ñ-“€ÎÅ¥–0‰hw ¼|ÍUT82\-Æ…‚—Al £A-! fµvUÞ¦ŠØüöZ Ì!cÚM$ókR„u‘ÊŠ¡ÊA5üPÚø¹^„gÈÊê\n^¿>R¯2è,ŒêEäºË¶Ð‰G0W$pkš!…GÀ3I^ ŒI)[°ÇÈ…ú°¨ÔÆ‹ w6Î?Wf¡¯ýž½ÃØH"öÜsJ—‘M%©ŸbÐ˸z©X—°‹V$ÎpŒÓªK$ý$ïr¥!R‘ÇÓ:Ž€"hü²í5ÆQ°8ùÓƒt a¸wÙ ,|`¢¼}…èTÚ lVßåò"]>‹aëóî'‹äމ) un(x°‡l…7§—k7ÁÜm™nÐeïË´—ä§wÇQÑ|þÉ__~MÞ†ü2‡¡ØÏo’M$5 œJT”"¹‹2&tu»Tµ¼euëàƒK½Ö·=”ƒ‰Gíd]óÙU*ªw5¾QËÕŠ#Ep "Ç‚J&Ì•¸êFkÙ厎R¶×ò²ЬÓbùiŠªÊ¦' ³…rî£cS¹OÞÇóa£5oûéª.‡w¨€­V“ÅáH¿¿Š,¥öv´¹ÜC¾„L@ÖÕÃ`3Âeo54ÚÝ›Ñ]Ý–:½Gk LO"õ3 öèª#þ >”1\AHQ§ •*«MÉöz“­W…ÅÌ–¬Ïl e0n«DÙe³„®ïøk1Q7Aþô¬ëß Ò<=í|¢yÐTÅw£òP#>;0É„d¦ù ö>S§’-C_KȪ=a ÇŒJ¶ˆ]6?,pm#œ¯ú•®¦JDFi¢Îa…©Š„ÈO:¿7Y¬1 1#æ"+±ü¦Hša~‹4šöŽ0”Éø$¯[Q¥þd´q˜Èk ˜É@!3Gɨ´²±ß´íæU \½IV‘vÎ…+ʲ¬•#ËŽeKζi:ï=°ÁX`Z`²®oÊ¿A‰¼aUQÂ)X¨¿?²Ôû€¡§Zkë†t¼“ÐäN2»6•ÏGEwzN›J¦¢B¡Ì.1xb²Š7ƒ5µ¼ÿS×?¼•Ìp\T¥#çªÆåܪ{W·Ž’Û"{ÂÊޤñuw‰Üˆ,ê¾DnC1ŠCjØÔÃ7ßšÕ(Ë÷F"‚_Å0ÙG²~J÷“u>ÊÂ@l‹ÌØj$až‹Ì˜Šð“Dß;lšvôÍ\Èd*Q 'ŠRyb+†§Š@õò,Aß hËáÍÎ ~! ³NX† v÷ÔpgPÔ˜*2H8Qä:`ÿ‰ÚŒ¡ùÀ®$û6ú°pí ¼X+€/W“®÷øàMÛL«¨Ý²e ²;ÅWŠÙHÆH0§¡!HÅ+ô-¯²YÖ×› ´ÓŸhˆ‘Ê—UÁ©ÑëŒ\6]öí‡|ÛÔu׆À\!ÁÑ`1êœ4š?CÇšÍC(?¡O"$²™´+öm0pâf„S¨æ…òþMîˆ Eƒ>a¼ùл`¨ðá<Œs8€h¾zû$‰L¤Ö0ÑŠ­A+–õvùÍMØ/BÄ'#<ŒTbúŠC™Œ{GG0&kMSH³Óù‘ä›p&Þ71„°~Èé.7ýÉ$Òt#¦TFTz‚GD¡gŒI+»@=\ÞædÚ»™Ü;¤¹^ë¯ò Ëî™L»|µãÄŸ~–RÏ´è™þŒ¿æõ{Ï|4­PM G,š[à;pÖ}lÍØ‰„ |§£ôúÕ…ûÞŽâ·á•âõ¼Á·µi “ÚÚáÞÞ ‚S*¡*ÈpGÙÒùÕtùÙ(6u.˜¸üýä©XÑ ™ÉD d©öL5]ªT{eW·l®å¾ U­j(ޞǗ¾×‹ºê’i|¶?.>T½*¡›sÝA`×õ-üÖŸD§èNÅŸÐˆ©Ñˆ…ÏpÂsãümüŒ…Ï2Èñ8z=I¸õ³G‚–ƒÛ+|Œ˜\ˆ—ÈjkªfžYEpV†qcU!W2ÕqßÖS'ìE"Ž20;ÎëN–Ͱ<éÐM&¿Z{íð×+jQÒÃãò.\`ö–nq~´ÅQB³'ŒŒâ4°ñXÿÃëÏx¨cyxŒ=8Fv7â0l£»¹xnÌÛ¸ÁI˜jÙΚf#ofÑx«°-”èè‘cdLÕC¦ŠËó <xF¸õn€ñf8"dÙ·¬SGäú¦JÙÎïÊop¬€÷#‡êþtª{sú®Yu?˜÷ºÍŠ0®3ÈCA?ô`qTmýÓ@ZdC•<ª¤Ž*©…‡œ½JJí\¶ç§Rè.‰.?î…WÊ0À˜ö(‰øC‡RÛ´C9wÊì˜ñD@!F4jšÇµ"¸õÚëhSŒ*¦ö<ÀùŒ{"3]Ù6‰ÆS/Qø¯«1G`ÚRpÕxDÜ…ê§ŠŸaÔ`eŠÑoHYøæ–ë–ËY„r;»5¢*Vöò^‹•­ïȪnØ;½ý”Ù˰¯°ÚÜd5…bÕŒè‹U˜?Çôˆ0„6 ß›LaÃŽüQ¢åÉ Ð˜±ÉÒá9Q=—ÛêÂL’þïfp¯µÊäB‹šæx²Ì¦0\ŽÒÕ cE:†¾8­Ê±8ÅVsDÐfðVRŽÿ ¹…Ã$LÓíDnD”ËMµÞÙ gÂÇC0o‰D´ÜÁÊÀÄÕAX?çŽ,ð«ž4d𢭇A¥^ÓB4üüO+HñͱÛ#Юq|®Œv™ŠRK“åaÙV…ˆ±)Ρ-Æâo×ÄÚ ¬€H“4këóÊÙ§§U;ãe’~p’ çÑb®F„Gc¼­˜¡Ã…‰³¨o¥íJ >]KÜýKœÂ!ʤÔ×xÜKl=*¦…Ü–ãU²"åÖÂëi¯JØDûÒ)—lÔ‚QpO$ü6ìg ¢‚(›ÚÇZÅ\]ÕC1·óæÃ댛m°«Y~åïž<ö™¶+B”Â:¿NÈÄÍd‹²…Œ½¥lè=Ü+‡Oãr¶U5² ×ÒOwá—Ê7?5®)f`M±p=:ÆôÚª–±õh 6Å”‚%¹•­N¶VvYÍ=ÏX*¯Iœ¯–^F©¤æšÊzêu‹bU¼š“jD#ŒÏ, X)þŒê.¬g7¾",ªÀ¦™U½i¯¢sî ;p 0¢ù’"ÁÛ@ެËíHî\¥ƒŒh]nŸS‰• gû—;Ž)¦O¨ i溆ƒkª!s ´ôë£uï™9ä)M±áüHṉbÍÉx7œŒpGŒÀ‰È¹Å¬ëoLÑÚŒˆü1ü€àî üN®#Í¢£p5˜òiB¿ï{µë‡]$ 51ÎhÓDÆÅ,[é&RΊw “ÛÆ¬øó'Gò(n fx½“1*ÁÊbiCpƒQzDñ¼ô+›È%’)´¼˜X2¤Ÿ™¨ˆ*_È ÃGÊøG—GE´ÊÔ%Â3TÂgæ`mê½mƹr$˜ôKrœk‡ß|€Äôý e ¯¤¨ÑBá1a‰¤Xm ›R AÖ0•së7'ÓÞÍñïlÂ!Ò·³‰ ûæ†O0Â4†LŸ±6SE„²UÍ0Nå@ [e¬è匃1«ã½8š¡Ü±å$¿ŽpÄF*ãÜŠØu \°'²Ô¶ e=ÝH–Z6©“ðžèHez„ãÍxÖÌd$=aeQÞðåpÞ¢²iêQ𢩗’q —óù/\§³3—s 16t,㎣nöØ#GyÙx=¸•ÛŠ[oâ°€C¯”éÿ{ŒÂx„i³MBª ”"Â…@#\‚ï˜ཆÔKwŠ6é}žvÄæbx𬉀c`¯1õÎíºzbÚòʹàLÆu)ŒŠòLQx.;5cceDó褳éökTv` W+Êú‘E¯@±4¾á ©f¯ø¡ê¶%Bƒ[ƒEóÿO2%Âe)ÀJU¹-¹øÞ$l‡X³;” ¢p e‘çæ…—ȵODTÂ3 òàK>Âg.Œ-‘*\ÉÀ«`Õ¼¨¼fvd*ɪíË¡Ø.éZ_Iañj¯¹Ê脉“©‹eZ°ŽT½P*!B“l† lóÝm)À‰z€`([O݇fÍ ž0—¥¸7Þ‘3)Ö\@‰>Ÿ*¾øD…0ü:‘¤šÿxSnO›G÷Ä}ì $Ä]ÃÉK&9°‰ ¶³_a>ë“>Û÷×’öüàÔBíp¿šòÌ%â2¿“I–jÇ‚£¬} ‹Û—ß‘CuiÀo[±½#Ì¡Ö\c&{ yÓKSÖíP¦JaÀè Ìf‚z¨:±åµŒ˜f Q)gVª³ÍÏÂ÷Þ”eÍý€Ã¿M¶CÔÓ+{˜‚*Èp@Ñ}ËO‰Øsš¤Ê¥ñx¬n±ƒ9KØ‘‚ÓŽN…ÅÉùømêÞS”õ踙$-"élÞU% ’=õ‹Ñ¾e:bbÝqÁ,wšP ]Œ¢³Â¨ôá^ Ÿ¾ŸùTý2÷ð¹æ›sç+Ì»?õd¯‘˜ž!ܲ%ÔwÖÚ1ûj/,dʪéHÏÄíkïÏýDqªa_ÐwÜœkêÞÜÞú•"—2vú1qÞ›¬é—>Y`Oœ8_Ð;Ë0ømð™žlMÔÒ?‘-Kpï>ÏøzÐpæø ûV*q ÷+"B¼«º¼ñH`¿á‰|x¥øòÂ`: ¬´ëÁÔˆg}þM߯\^<ƒÉå…Ë\*‚dT."vy=tEë¢y5ÝÂwò¹žõöâlN”~yùƒë3¬ endstream endobj 1786 0 obj 7388 endobj 1790 0 obj [30 /XYZ 38.2500000 743 0] endobj 1791 0 obj [30 /XYZ 38.2500000 350.750000 0] endobj 1792 0 obj [30 /XYZ 38.2500000 743 0] endobj 1793 0 obj [30 /XYZ 38.2500000 350.750000 0] endobj 1794 0 obj [30 /XYZ 32.2500000 230.750000 0] endobj 1795 0 obj [30 /XYZ 38.2500000 197 0] endobj 1796 0 obj [30 /XYZ 31.5000000 231.500000 0] endobj 1797 0 obj [30 /XYZ 38.2500000 197 0] endobj 1798 0 obj << /Type /Annot /Subtype /Link /Rect [435 548 482.250000 554.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_const >> endobj 1799 0 obj << /Type /Annot /Subtype /Link /Rect [476.250000 239.750000 501.750000 246.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps >> endobj 1789 0 obj << /Type /Page /Parent 2 0 R /Contents 1800 0 R /Resources 1802 0 R /Annots 1803 0 R /MediaBox [0 0 595 842] >> endobj 1802 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1409 1409 0 R /F8 8 0 R >> /XObject << >> >> endobj 1803 0 obj [ 1798 0 R 1799 0 R ] endobj 1800 0 obj << /Length 1801 0 R /Filter /FlateDecode >> stream xœí]ËŽÜHvÝ×WäÚÀd3|Æ’JeÀ ‚x1ðÂèñŒ1èXž…ß™IfVñq‚ŒS7n0Y)aFê¢HãqŸçžûË¿|ÿÏÃ_ÿqøåË÷ÿ9üÚÿùåûSq¬Ë¢ûu8ÿþÃÛØæØÿýP7åá×ߟ~~>}{úvúÿŸOÝ ß¿üÛéoÿw°‡=ýïo‡?ýÇé‡îÿÑùüþT›úôço—?ÛÚœþVÜþ<ÿü¿ŸþýŸ??ñúº~0Ãÿþƒm+ΣXxóϧëWšËïüú÷§_ºïzIÙØª8ïüÁ´Þþ÷¿žþrzüõáűõÆÔ•¯‹w¼¦¶§÷”Íé¶==ÇøÉk.¿E.þèªõ©}µô|W™à³å–´öu75u%>7·gËO{cmªG_F-<ý‚ÂG‹­g[øª›˜²–ž™×g‹OzkŠTëÙZx:ºõÄ–[OSö¢Ëzù½=\~Öý釩öÊyÔÒóѯ(~¶Ü’–U›ìˆÞž-?í•-S=ú2ê4G>úØTý/øwîÅÍé­õy—xÓZcíIüt Ò–â+r{¶üb·m“ìÑçQ OG¿à£wÆÕö$8Nk{^׳urú{íú_üUEq=ÏâküæÙÒ Q¦r©}uŠ5ž>ú[Ä#ð0ºŸ/ðgàÆÏ?ž~y9¨:üøËi\—÷uüøýÉŸþãäøÕåáÇŸÿ|MùÇÿ=¹c髿ìŸÿYw¥¾\iŽM[œdøÛ+þrŽëœé×+¼çËåÊ×§ÙIóeõøË\7–ƒ3Û.|ÐÜ$à‰ÃOƒW˜±îÁ£æuæCŒMvÔ¶]Óõ›)°üÍø!pôxþ¨c9yqömÁd°“¹ÿzùAyt¶1çBif1m„l4Ì,5pÔÄ6À#0¼‚+þ|Ï3œQ¼êŸˆ™_K¬wHª„ê´¬ÝHŸâÀœGü4æÔᵃg+°TÌ©ÃgË\®wž5ï3Œc´–cŒ5î”0¼Ëé¢Loü4âxR †»–QA¨$J‰lж睬?{Ô,i ËäÏÎUžù<N„žÁ˜ºõvE@Â¥yÈ䌎'ì3Æ=tpîÉk¹Í½§3›¹Î¤¬ìÀG+àáµÅv£¦ŸSî.îåÌmý»ØëªŽ2¯9n|\vô /ý'\Æ2³/g®ŸÑ•~AçîÁW,¼ò•xM.áËv8…”-‹Í¶Ä:Ʊž¢Äþ®E‚•Ýä![_b3„±ÍˆÕÈd‘]±Ø„Í£]#¢{x$ŒáŸ1¸âËf$ˆ>L|9›³3cà„sOé Ñ(²°$¾Ç6ÐP†W¨@ƒìæ5Èé-BF1÷Ldo`£Gœ"¦ï:3ÔǪ6ƒù xŒ³Åd<à=÷0¶³ï$,±ÀQÀâ`i° UbëÜP%F˜’Tb lDÌš»ä4£¦#r¼Ø·!ÂTp‹ôÍD½&¹DÓ¼+ 7–€<"Ò‘ö 2C¨P‘[Â#`̾¬>ü‹rúˆ¡[1 Ä[´2R"åÜðË(OH7Èx"é Æ¡cr°²9Båæº‰sŒÒ7ŸÖc÷:˜<‰#– LHZ+~ѬJ›×ñÕHÓ<;±­ôõp ðq¥½RÄkgBþj¶ÄM~ëv:KD<‰ù@á |vL·0´ÿäDD—G ­ò€é¿këä‡ék ê"”¤’ÛˆÚD¤Ï™CL*¯Í¸Á²Ž^ŠÔƒÞ<áf¶¦,†E®¥î¹.$}ü°|Ϭ3¶–l؈9/T$F ÚL;·¶º¬G{û²nMqìb“ýTí8¼Ñ2êžþ|ÌÝÓ¢{®>ƒ;v‰ó5÷˜òæg´n¸ÝÓ꣛̺ƒ£~A£6Ý—VGgìhGàïéãyþ1z½ç31ê¯èžÀìXø=pÞðØÞ CÆ£6ñ³ÓŸ¾¹‚g§€WZø¥FGæyÛôoÄÔab&ÚÍ(Y '•I$FdÐe¿X9 &Ëbà´xß1µvXõ1»X T(ÔÌ’`æ\6 ´>ÉA¥îD4þ ­M…±wØÚ¼»Âú@Æç¤˜‡zR9¯“ШÌÈh.Åó1€åÀQ­Œuùøk,%÷Œ‹¯ÈÔHÔçdC´æOÔÝ”¯àtÂGS²3RRÙ-ÿPM*Ò¼a Zj”(BN¶LJØê€zx¹˜àHò n/[h;­Ä&l™Å¨Oúžoà‰HÀ´^×3ežÜÚᬽ(š‰›öÕòXŒcÒø¤öQd{½´æ¤29iBGQ¹"«(à½[7:#ûñÞmÝŒ6¢¬çzLW¾ãHÊ0¢ö6SÙG^vÐŒ–(l™/ðK¡Agñjã{>¥«KÑW»CË"°=GXÖb PFŸF°¿I°Í1GW„∳HDk´øÍ|ã—Ń€Æ;1;,7Xjo*‚r£EÃÒ"Åøü> SI ³ ±;ñr+•´Æ“1eµWëÉØÂ¿ß|Ú Nëai¥Ü5§©©IÆ[åýÆ“ê”b±eq‹Åf#uÙ‡Q*KQ%KªÁdb¨žt œŒ·©÷»™$MbœIÓåÈ~ì çꑈ”¥P¢¦Ð ŽƒSØšá&¦±R#´Ö¢±"‚I€î„Ó–‘½[nR(ÊåFãì'S콞Œ’MÀÙÄåÆgPúÆÓÍq죖³®Ì^µtS´³Z:å+Íæ£H´ðÞ“©$I[xÅÄd…›e(QÊ%î€q§®à F°2øÚ0ÙólKRË’LœŸ°õnãÆY‰ÀAã\©6¯´ËQöÀù—-mÎŽ}T2ÏMþÞ+™)[y}׸‰< È DÀPû`<ÀvOÖjWíø*P…EƆI{÷oÑo,™Sšz¸×öc”•U9²K_Æö,¹35êJzœª#Zß F6¦UWV·Uþ WY ô­ÆÂ?YT‚G—z16ýǵ”)ªlÛ×{á ¼mòÝè–+¢Zq®¶„Ý4àùçÄ.Ae2Ù:sOóèJ`l^Mðúí5ü4džŸö¸r;CQWðÓ<±¦ùwü;5nòüà{#ÀßS-Œ@E@:·!”Ãâ±9¸Xù™E@Æ`G¬œ<¶ÀŽÇkŠçú9~Îë©ÒnG}ÔÄæË®XðØŠå¡>¶¡> ,:á—x÷2cUÅ+GøÎN!«¨œÚlææ_ཀྵCG_>TNh>TÎݪœí‡rEÊ5œ¡®muö µLg$Y\Ô]å”óÓ.>²¤ùðx¾ÛCí¨8®ËÅÝ€¼i†Ÿæ¿ªypu³›$¿ÁxpØov/iËWò{p¿æá×l]"åÏâXò§Þãý&›ßÛþÙVQïm»ÿ¸ò‘®ÈªwœzÈOñïÁÐ"JáQcuÅm@<1" Aܺ8yMy«Àm7K•‰øÛ“ˆID‚l ‘VAá}ªª”g˜Ñ&ïbʲ ;>W"[•9‚ëK©©–xsáT¢m'¾ÂÔèùª¿§xŒÉÅ*¼U’6¬cêÑù[_üˆt‹²øS=”ìmY´ççÝK†@—}}î=iå™V©ñiŒ×õïÎÍL[È|MZµ2DJdv²I˜Ðo½M$RÙI±7â¼·h"—*0—µôE +¥&ÎL÷À{D=gꪉDFÊL`L«‘R15ÍH3AA˜íi%ØQêÕL™Ó¢¢"â3Lr‰ÙÓ.Pʆaæ\¢sœlø-p¢×ú´úlº‚„1­Fñ£lHR7bB3êȶ1C©F‡1?¹­lòíb¾]-3X­î'«–ÙDM9Zgå3€DŒD¶EHľbºM&gÄ”Ü-³™.óeµÎ‹eŽãêLnmìÛŸüöô=pâÓˆŠË†{({H".çuQÒ¤Í(ŽÆ8b²ó°‚³c×åâšM0®ÙÚòúÆnnç T®¸„iÓÅnn?Z3â¶èžÅpÒÜJA Å”ð=øžjÁ‰Ã'qŽ`ô3\ÝZ\6~®ñŠ4/F[ÏuS·Å˨¥œGß&ÕJ=WpZ-a¯”ÎÌ’M@ ¯Œ”¾£.-¾Æ7ÕP²ì§R¨t~­Ð|ö½3Ï îÛ{}ÿ"[w±·øé]r¥Sõ1÷i4—O¢ñJ1w¦Yîtk¬Ç{0°ï€ÑAØq²ÐµfÃÅ­-N'ÞŒiQS‚í ÑþÞÂ}ıcDج8Mµ~d*lÏ!ÞNØZ'” åÂDH­¤DÅ¢p$Ç¢_Æ“ÂÀ˜r&Ñhë¨;ðìÒ‘2oÖçÕeÅN„ˆ/iæªåÀUÕ¨t”µµ‹vaÊ¿«‡KEÕ¨aéÎ@n™)sTÓV d+# E+4&f%u<[;0]í˜ÝøþÀ•uŸˆ1&$>V.è¡48Jürø”•u#ÝHD§r-/Z¡*Íð£¶L¸¾ŸTF]6#“xËŒŽ%£ÛbšÊÕâBÃðx†ÍåÁ÷‘˜âÒ2mR#½kYÔ#™·é|‘(ÿAšAkmXQ(3¥¢ÂÙ]ÖÅÐhúxg“Owåˆöñá¸ÙeoWë È ÉEÁÇ‹VKRñv´¡y1b=’ Xó ;œÄýx³® ¼GìJFVm~Lä¶¶„¬±$ òËN)q_ÀDöM6¹š¡î²jFâYÌ€ta§Œp'ø´,Ÿ2E÷Z®%“êÜu3™÷!C°¤eŠÆØ|‚F›ŠiBÍÁ+B&Q“oŠHˆ(1Ð ‰ÖGõ¼[sla[)ZOZXܵæyãB|`Hõ±Êc%¬\¼:XמÌâqcÊÔ)].Ër–½ÉÑ} dRÙf:æ:exÈ騃¥Jî¤Tʈ›s#©Å¨ƒë€¥£,C“/áØˆt„sĨ³Wˆ'ÑD›ÿÄÄ^îRÑQÆ S Iˆ ε÷àQûÞCÌeîÁ_Š©¤Jø=æ*pƒWàØú~ÉcÚÆùµÒRãÈŸ»DßܲÁ#oð‘‡KØÔøiøâí7Nà 8µ‰·Eµ8ñ²“XF(7 ”_Cà±íT¯©lØ×hÞ°x»à-†Õì’ÜQùlï7³Cöf«dq%¿ƒm9ëbyÃVî±amØÀ{d9WÕï¹ß­ÜØ;ØÊŒ]EÑ+9€ÞS`“?ëlòÀ¶„OSܰ®0oêõŠž7ål±8ñX}0Æ©ìÄ߈eyI\»¸$;ô\Ù,*×Å+m¦%¼¤n¼»†}ú¢S»`þd,åÑNÚ=ÇßxO ïéq(î8AðÂ{zskæ=½ šÁ+–i”§íÅ^ut¦[ª±p›Ágø´^c3Ý÷ÔG7ÉUŽŸÑÀ÷àTðK_âG˜Yíî$4×x}etò¸±¯o€Ç¯×ñOð ÑŸh³¬@"˜è:¤FOÀ™bàt¸Sцû«m NtÊ”v0À$ÑòpŠÛF µ¾jšê¬UsLj t„Á FЬñ0­ì뱺ÚJ£„*º´Íð£·LÅ®D aC°/1•Ëïh¸5]T?H-é¦ÃWJã3Ò:bk2ŒqŒ ]oPÈÒ41n1ûˆê7‚G'`r0Ímñ¹ÍÚ““k7Ò!“ÙŽ(cÁWLª‘j$@Œ€ªeh:·Lˆë÷”è#JÿñìDcÍèoÀË–%ýÌÎ#R #[O¾X”™>zØ®è ¯µ¨À:JIrU'A¸¼tƒ(Q£Õ(5fºDƒÓ+¿H5¶Æ˜ÊÐìŠ!¿×¢£Æ&Û /W6¥è˜–¡%f° ËÁŠÆz›t.KWŽ4à=ñQÈr•„=Õ4%¿_˜½£sjÎwA§dÉÖÚn9u,Ûù)PË8Ï“ÁDozoÁ­ˆFP¡eèhЉ–Œ(gо#¨Ûˆ´¿ ‰!Cà0 §ˆZ²ÙBjf·B› Ï?AQ?­ï G‰tQ‚'Û7'™Â릧†Ñ§D2׋éÃQÂÒøø ñ“ªùÚ< &bS*ÔÖ¶•ROÙ VÀ|a 4„h 8À£ÌîÉ6cpt LO‰ 2±GLõŒL»pûéåD(ÑOŒ ÏÞ;ý>HHoŠ~¨F2qƒŸÅv•ÉçÉTp‰°1ÌYØï"zÆRÞAþ2=¼üÄR.÷„’éSBpéD$ÿ9m¦B`}Ȉ™ÊQc[ 3G¹Š"¦p °Œ÷µR¶<3åPw18Vo¡/%Q&?͇tÀŠnÜF¢±Ísá§GL_Zž>ŠJ6ІQX¢àÙ\#J’]‰jA5œ²Æ’ W˜vïp)±oüUÅ\ÃÅqâøÕ½†·7ò…¸ç¼§E÷\c˜vÊ?ãà=} ºÎöëfí]é“?6Š{öGlîiøKá¨ñ{ŠÏpð{®¡Ž™{ºÙ©Žîb­u ©nrn´óæÚw­Rkë~OÕ Z ÖTê7m *’²S aÛÊàhV¬ài‘¬ðœ;ä8Z9†•í:cî2;%ÈN0£f í5Å9oýVmªYV”±/ÂÓLTRQiÁûÔ°}“À¿JIÄ£Ójrž8¬ý½¶ÃÓܰн‡!µÊV«š^u—Õhl9òaì-°¨,÷“HÂ3PGOHÝEFŸä°Åtå§)° øƒÃ-£á¶}µPKVε$Ó¯!àæK`dîT®‡·x"Jù‰…|D7__¢ÁRµ#[n#Ž j¼ïðØ&­XE)à^{‰V_væÖéõV¸{öà›Jxw9ÅWžEßïqØ¿´€ï ÜÃÎTØšÍ,01Ëè!.‹Y`æ ~ÏfÀz*[̯˜üÙp»`xëÉ.}àȤ€ &ò™ö wÄ}}f¤/s%ºÒÓ Ì™¼ðÊî,\&úÞ»W¼E£VÌE¢ž^ Çá¯q»^¤èK<ªZ^«ó/ãëgNH̬Œüyå™Íø­~Û ,ƒVù;¦.nÅÈ2USD5JqÚ·U§߇Ÿ§³Sd§”UÖ@ÉùŒÞã–b_sc{é¿t*¬àÓúøßXã°ß'—…¯ÎòÌgü4xO¿¡MÔ§¿©db7Üùï§_Ž/´…óÚ:¸¥ñ×â"Ö(°â_Ñ1èíG¿â[Ö0'f¼ûñüáÝo`½·vææï”O«g ÖÁMÕÓñD i:Kx_4ï?SuÑ; áá‚éI·¨Z¾¾=ý??,e§ endstream endobj 1801 0 obj 7543 endobj 1805 0 obj [31 /XYZ 38.2500000 694.250000 0] endobj 1806 0 obj [31 /XYZ 38.2500000 629.750000 0] endobj 1807 0 obj [31 /XYZ 38.2500000 143.750000 0] endobj 1808 0 obj [31 /XYZ 38.2500000 350.750000 0] endobj 1809 0 obj [31 /XYZ 38.2500000 694.250000 0] endobj 1810 0 obj [31 /XYZ 38.2500000 143.750000 0] endobj 1811 0 obj [31 /XYZ 38.2500000 629.750000 0] endobj 1812 0 obj [31 /XYZ 38.2500000 350.750000 0] endobj 1804 0 obj << /Type /Page /Parent 2 0 R /Contents 1813 0 R /Resources 1815 0 R /Annots 1816 0 R /MediaBox [0 0 595 842] >> endobj 1815 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1409 1409 0 R /F8 8 0 R >> /XObject << >> >> endobj 1816 0 obj [ ] endobj 1813 0 obj << /Length 1814 0 R /Filter /FlateDecode >> stream xœí]Mä8r½×¯Èó›#R߀a «? ø` 1 ø`ø`Ìz½XxnïÁß™)eVéãQâËGRÊÊìvO©$Qd0"ñâÅ/ÿôëþëï‡_>ÿú?‡ßú??ÿú’ë2ëþ9œÿýãûØæØÿýP7åá·ß_~~¾|ù~úÿŸ/Ý ¿~þ—Óßþï`ÿ|úß_ÿöï§þ©ÿ¥ó/üþR›úôç_þlksú[vûóüó¿¼üë;?ñúº~0Ãÿþcž™ÌœG±ðæŸ/ׯ4—ÿþÛß^~é¾ßë%Uf3{0E^L[ØÃÿþçËŸO¿><;¶…1uUÔÙ¯©íé=ÍifŒmOÏ9ýoüšË¿’‡«m²¬ ôènÔêù0yeœÏ>6EnòÚ–ÅyyÏK[6=ý½Îûîš®ºé¦ËÚF¿ׇë—9ÏÊ`tµz>ºev<[¶sOÊ¡ße-Ÿ›Û³õÓ^´6أϣOG¿ ðѺõ¬Ê2ØzÞž­ŸôÚ˜P¾Œ:ÌzÂGëÖ³nònbêJ?é×gë'½)ƒ)ó˨ÅÓѯ'|´n=ÛóœÚŸ·gË'ÝfE0U~u˜ý9~ôwGàat?ÞûOǯ?^~ùÖLuøñçÓ¸.ïëþøñûKqú“Ã~òì~üéðY–·ÿxøñד«Ú4§3Íù×.WLs¹’Ë¢:_Xs%û|¹R‹¼;½Ý“_®4ǦÍ*;¸§‚WJøžÞS dÞóõr¥<æ¶1Ã+Ý—6k>y<¾¾ÇñÄ{£&&ÒþßãÁúÉÇ2„å¿ØÂÏ0,³”pÔ9|OaážÀ#Èlj×výœã1æfý¤~²^1•Ǭ͇ú >íµ»Ç^/½-ÜxþÀNɴǺ*GÒ2žÙ"÷’c³<šæí¾çë“5 c K›M¡ée1¿ŽfÅ´{ˆ:Þ/”î`Œ \!‡Øâ÷`I‰ža6Žmˆé“⡄ñîÃ;¿˜™ø4ÊÄ6xjˆ&?ˆå†à€½B@˜Q;dK áà÷`Sx‡ÖŸÀ¹nŠ´%‡ð€ÖdE9´°ŒÉ ¶9qã!ÐCt¬3!üxY£Òá¨"'Ù0ã‡0sA™&Â%¢\íõvMr„«rüžÉwMÄï(Žf„ ã*´vìqyµ¼“7pM; K/#É—ÇÀC›-}zHÓZWC鱟¡{DX"ûmÑùÖ®.~–ÉO« ƒ‡!»Ð'¨•JÅ:v0Œm0/ÆÒ&‰”HBÂÓ÷1§5b ˜÷8”?s–]„Ôf ´â½ëÀepÍÈD´ÑMVUŽâ°áØ[„™cÔe¬D‚6ŸäpÏ¡¤ Ìc _¡ö#á=ûûz~ÛÝÛ"t-•Ó¥íµ¹pÉc1 b¨”£57jmñg¬Ÿ%Çè‰(ëA° aɶY""ÈòyúŒ1|Ɖc+1gÌ *ôsä“Vø_YÞ£Cl^†HÐ4±Ÿ‹Ã7Äæ£‚›„#õ Þ€ûål¡‡Fšî'é%ðRF²#! Ćšð“÷ž¦Ïù–غšø#s`ƒïqøŸéå!ùfô‰„Äòš·îã_ὤöö©±¢g°öÛs鑨J#˜ø´GæŠ9¾3îAr˜©Ö }8üÜ÷¼Ž„‰ˆiñècùv(ç¸ Ò¦ª5C[EaâÇ‹©•mÙS#ÁD¦\eÎbU¹2Ê̺0IOƒ K=ž17̉…QIجá÷¤?g%39…-q„´Æcm‚¯c^ŒSë“Ç' âµm>´‘Œ<{€ý¨ Àú´c)`:S€?]rbyT¤:>ÒbåÅ€ò·$ ÔåÛ„­›Ý ¸(xÌ+ÏÚåQ2Ø8ÕÍ‘¸²L€iI)‡„ ”£õ¦ŽUëQCT,Cº˜2Z¸š¯ð>9¡ðÊJjK wÓq†&Ÿx®ó/„<0É#ìüIªûÚô{ò訵e"Á Ðî‘àpÄËñÓ6IòRU#K+.OcòJ’x¯¤‡©™æÜ‹¾GZŽOñÛD¾kQ-x”ÂŽDÏE©r&C¸,€ë0ï!„IË!ác€˜!aôhIÞ¼,¦lFQŠÅdÜX&ƒÏ̉ÄÔ31à ¿îÉâ8Œ°Ç©†¯¿³ÍÚ±¸xûx¤)¤x —U˰FÔîNM“‚G–‚é0Á”õpIhkoÕ{¶4í¦Ib’ ƒAùà“]Ï”yKé«|N “¦È °c±ì,X{¼ fF+Ì\é×dîž]±upÛVŒ[4f§¸’@ǪáˆtÊ¡0ÛëOFÚ`‘¸¬€/¤ ýlªÕ~©¶Ôq °LZ츑‚‡ƒ¯à€ÅÀ7DZx{Œý8$H}`ªÂýâ8fM33ÕoUs8)©²ë¢yøýúßí±i²úPU—?¹üôÜp§¼µÛì~ðÛKUimÓ˜ëïäƒGäï_púõî¿ëËM‡áÍe5zÁé§;ƒ8ÿN3xD3|Á_^^ÿH§77V[³c~ŽÇöv…BO'|;홟‚1¤/JÛ>ŸŸeXÝ¥êdþïô‹¬=[j Œ…¦x=n¦.dŸ²ÚÂÇJn2À+Q'.˜Ý`rOÖõ 6aݱ>/瑌Ør?‡Ïl6NÞæùPe?Nœ¼mìèÓÂ×Öõñ½7KJ¥y—UZŸ$®€×f’%ÅŸ¹¯Ü¡„±Ü‰ ¿ˆ28jÁ˜±I¼†ö†‘;/÷b) =ècƒÍ²9p8ëLG±çùÈ|4Q”kOx†ZÒ'MMÎ^J÷%?¬S\YÛÃ<¤C»†ÍlhŠw»…™Rà®ËÌgPD·Ø2}E—*„ï϶õ0?Ú63ùÑâô ƒôåù£üèåwòÁ#ò÷/¸æGÛj.?Ú–£üèéãüèùwšÁ#šá ‚çG‹,¿ÊS$úÐ'í8 -³œ¢Õl ÆËÛüKªƒp‹p«Ä V5ö‹)Qñb-Ñv?ß2ÁYÙ¡1‹¾ÛtòFÙ‘6Zðh°óPÙœºËæ¼“Ï‡ÉæÔÍxë° qJÏ\ÁïéuTuÌ•ý™{ú5<>ûå}»‚gŽÀZ8êWø¥plxð—âQ›nêc>‘cbFí+zcˆíwùÌ=½ó{~Ü?ÌúØ,´ŸÖQ –™¹¾Qºè™Ül¬ÐÅǤõÙ-rPšäí¨ÐÒ³ö]ò¾öbô)d<"«‡†Î£HWSôˆnj›ïiBõih²àCÄmÙ<€ü jcI$Æ_æ°jAâ©&HÄ”œQÍ )`Ë„Kæ±ÆÔ‹=xÔ×o«)J3}9V¬¾Ð É;ÍiÎF2Få8rŽïé4_{ÌÇ1u|åA”Çb<ÏûÆ_µÑ[ »ª4Éš>4+©Ž¥ÎAÉÔ¿G–‡)òe²WLã-Zµö15»ÂÐ(Ü^à8áèkc[®Z¾mÒP×v(N;9n&Î*Þ;hÕ“gGb¥uÌC‘¥ëyB}”j´öÞº%d9IaeƱ]ö(3Ñà9ëKïŠ n°ä$=³\¤~$T ˜¡YŠÅ ˜Í[œp¯k·Àö«;ƒö±5£s¼c‰Öë/-[’Ø×ö§”æ· õÆM"-ƒÔ y·&|.o'Aâ\Š;(¯RÜOA6ŒvYÔboBÌB6»-ÊÑ6Y¢;,ˆq±cx…SߨqKÂŽMŽŒL&dc ¯\ÔüÅp†rÌØò ¯`þ—^IÈòbÊ|øÑb,+ÞO’˜FØ£·O)¼$˜"uˆ™ƒé>7Z².*c«…Ö0A}ifbM\”#UÜW™Ì©H¨¤‹¥+!m»^­îrË݃ªÔ†€Äa §[Îa6ŒÐ 1)E â9V‹EŠGŠ4›6óbr™wô@‹VÍtíõH)Ðóèë&g¼ÃLe¨û\Ë4 ãˆfGЉŠ{$‡í€.fS(1µ=³'bÑ<ŒèT»N­Â^ïJ°b¡9ĘîÐãÑc™íc]ñh÷zæªÛáøÃÛÛ&¾qŸ¦SDc0)Ú§«„GST.%O£Þ³$®Æð°ÚV))…|Úò\ÜÝ@Ý`’ÌZPQŸ$hË 3²j»ÿŠ˜lê(ÿd D~؇{(ÕžŽã–º Ú²mc’ 9à¤Zv½¸²âÍ”`—è †'8€ Ôz°*Æ u,\"(›A[¨±¢WJKu듌”ЉÅ[ZååuQcñ–2Ü“Ÿ®¾Ð„·”`ÙÄ<’½Ÿ676üž¯7!àGÕ²yš])àú8F Ÿæà{Å\§qsƒ:Þ£ýR G€™` 9p|iEŒ ¯¼²(;Á!ŸUW*|ƒB‰ _<=jiÓ[Z 'I(“°úxïÓ‘„)¿/@Á&ÎŒ¿Ãšg'p>É(À8<Á\ÁXûMçÓûêÞ'þ œ¨ÅЄQˆ–0FGÂB©o–òC;‚â«JŠÄä`.‰Ú:k®‹‰)ä?Áø§ãsï4Ûîì49làà3´9`:TÌ&C÷Xx¥×hs"¿´‚#ÀŽ|ãKñ{ðÓ°PÂ{úÃàܼ½*×ËÁ¢¼?8ÔÅ­3¶qÒV©±Ê(¨:i†g%^WzwåÙß@Ãø<¯r/cr-àœ¢xgpUåésÅ[¢ü*s;4|b‚-4ˆÐ½>ܱQXa÷¶G4™©îôæ%ùéyÕµlqb.3¼`ÌÀû˜(Î@G|Qa÷Õ5òAÁä;k³O”Ê9Š“Œ=‡Þ0±ª?:£êb>| §²ûV.Œ³ä±bL}"¿˜r,J[:ŽÒ&íX#c’,¯VK8sŠ\ZB0&hQZÙw´ác’ϸ[l냟Xeªw¨V<Ä=šní‰í¯nëëw<¹BshÌ&dè™ïÂ50d¿ÌAo3-<Óß ŸŒJ)lÐEÕß“ÝÓnêh ÊT0].÷ÙýšØÿLsÃiÉ jÇ&aª§ð"u½ÚfpTýp2>¢°T5T¯%|*!¼]£Âæ`ÚùsîÅrÔ·2ånü&;–Ý©{<·åÑVåh”ßüïé×cîžÝÓÓáœ^WÀ:‘çóŽ(žÌWt%ƒ£îs4Õ17vÖÌÍã=xlpð=½¡˜{ßCÜÓÇxfîéón~s‰‹­0ÕpngèÀ¨Y&LžœªŒúÖŽLpØso¬ŽgâΛë£EŽÃ’4>I*a£¸§>±zR!`Æ£cz³2ÁEoV%QÈ~—Y>47>™ÈI°““೟‚¼Œñè„áHËèæsbÅ!¼·×ç ¨¸ˆ4]ÂÄ_4fny£QñâŠäªÁÙF5TD¬HÛjX¸«FÀA(w¨3ùÀ@9âaØ?`Î Yp¤„à£ð1Ž£–I.ùYƒ âjm~úã=³m°HƒÅÑ8äã±/oM„“÷C ê¬‰nRŽ®Hü‹Ÿ†áD×kÇ÷à’&LÏßÃÐå¸1MúõÁ¨xbÔT¥›Goªçì¸ðDÊ”öZ$šÞœS1`‘4e|&ÌÍø_À8£.d©^”;7CáÞŒJ ånÚáGWXQ5Î#'ãH¿&U}p9Žc3ÞOcô]´†‰ã¹! †[ 1>]"2àœÒ´oø0=N˜øe=×÷E¡R@Z¤–”/i “ÜYc`^¼@ŒR{"l‚lËm1(À°x5ÖÆbLo|3ÚæÕÐŒ¦ßIÀ…cð¨C}bˆ7Žâ9ÛÊN| ¡ŒêæÚ•PÙâ‰öŸð›}¢HOœy‡#ȯQé|ìà+Ϧ¶^Î•ÒÆjàšd­õ|(1¤ &ü&>±ðö.lø­èÃoo ù„ߊ>üVé§¾²Í‡¯ AÇa‡(jaçL¢G”pÁ(‹U ˜È«3\ú“‹Ëåaêà ÙÍý•z`LV$‡ÛÐ=FµT;L 'A¦C†¾3ÔÉOÚàzú€’84ûµ°G‘8VË …AºÀ@y5.A«å˜ÅÌ(ÒXö‰l9–Ÿ‰²/9ŒácƒÍ=*ƒ)p(ÇXE‡Ìv\ò^BòNÚf´TZÒÖÀ)gI„Ê£Rgü«l2ÎHºOè/RètW!ÆÈ¿ÀDÓU‡$ÖõHbÉd‚^É"õ‹“ãŸ$ËÊ WŠ9ks¹š8oà¦öúT#¾§t:±ÊNɃ EäðªµöÕ£€UZMû˜rXžÊL±”éå &ºd"w4Ë‘ c‹¼ y$Ìêf­…¥PY„D;ü'&îúqc›±paÕ¢/ª› ô3ꃈžQ I"RIù$Z’s-ã“YŒ•na¢EÌ*DâÐÐt*JϬ•<«Çð½ÜÑâÄ+ÈØQÃì“ÅyÌ´ePü—¸V™H’œÚœ™öLÿè®\4”lúS^¤VWâ÷0ì^ô"³é'2„‹)Œ¢‰–V—IdQ]1ÖG9S¦{Ûjt:Û#7€¦cˆ}tùðjÌèî‡ã«Ü­¹µ‡ï¹ñWM€Š½†™»µì­õ”YôÛÂ&Â>ÉÜ—Öhñ=xæ+5^ ó«rvð\S²ÓÍuu´}ȪõÁïÁëƒeΛcà¨ï‘xvz ã76ü=PF»^+ñxÔ2f+¤9û°_^.ï¤W8O饕ÙËxðK³àëal=\üiøÊ%‡±À…M¡™Et%~ž¬Ú–6¯ß—³S4¡ÝOÛÕν ¥ƒ²ìÉ€>³BL™·¤]ãz~*;!åFÒ&’?…yHìV9ÚÿìN”‘]ºj®½ùÒ³Küâ fIÎð—b*fÔ…,¼FjŽu̵ƒÅ2_§çÀ­‹ü:J˜ÿs¨Þ@èNY½èV'$øÇ˜ÑG†Ü–v;åìy´„±Gôѽ‘ñ#!mL1ÖÝÇz¤z¤tŸéR‰øè–Öƒ©òb£. Óå! ¾¨]ëöÜW©ZÕ3%Ÿ”ùIO*¿Þ¬ÉG¦„r?ƒT#0Ô`Fcñuã£Ã~<ÅA$|wF3‡*ç:d°(ÏÚYÿòΖÔÒ¢2‡)\o]b•MÕÕu&ŸùÏ´™‘憌•—( ºbqÇÇqü婺¥ó |„ƒí,qsLÇñ·ÚÄO|/#¾‡hVˆ¿·>df·>t¾ñ\3b‰”Žž|φYðpFgLNêóª ®S-GlX2Bš×^I#³—ïØ‹Ï^’0Ãδ³#<ŠZ3lM®¶ìÙAG#i˜²>Æ ­¢ Í–'•YmæÎ_3%H+†6eWYø-&RÕŸQ`Œ(ýå'Ã:â¸7 Æšø´‚=h|Ïkè ]w•nï6´,ÆÑL; ÿ¾4áks3<ö˜ìØy¥!*vÇÿæã=-|Oqó(GxškÉäôi}ÍËÌ=u_çãwO¤D[µ×7–þžcàFm‹i‰°Ú¤-†3ô±•‰étë»éHEDIµK’XÄHeñÔ±aÃí‹(ªi›uú÷ðó´âNø¾ô +$¦™˜ÜäÇÌœÏ:[\‡‹yV»¯g>±‹òÙ–Ó.Ê7Úéï©&@(%â zO¾‚šÛ·þKQªŸZ‹±“‚ÑÖÕô{™Ä‡,“3ŸaðÓà=½´¯O‡cîü÷Óˆ¯ GŽÚÂùÆ ÝWÀáÀVrs3D¬‘cÅ¿¢mÐëbÅ:DÖ0;f,ýxþ°ô;xº8çXR>­ž%<Ø Uaý‡4%,Íý{ªÎš£é¦x°¹°bØŸ%Ûsøþòÿ4¸` endstream endobj 1814 0 obj 7778 endobj 1818 0 obj [32 /XYZ 38.2500000 323 0] endobj 1819 0 obj [32 /XYZ 32.2500000 502.250000 0] endobj 1820 0 obj [32 /XYZ 38.2500000 461.750000 0] endobj 1821 0 obj [32 /XYZ 38.2500000 323 0] endobj 1822 0 obj [32 /XYZ 31.5000000 503.750000 0] endobj 1823 0 obj [32 /XYZ 38.2500000 461.750000 0] endobj 1817 0 obj << /Type /Page /Parent 2 0 R /Contents 1824 0 R /Resources 1826 0 R /Annots 1827 0 R /MediaBox [0 0 595 842] >> endobj 1826 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 1827 0 obj [ ] endobj 1824 0 obj << /Length 1825 0 R /Filter /FlateDecode >> stream xœí]K¯Û¸ÞûWx] ŽHê ’{'º($@EE¦ÓbÐ4Eÿ~e›ò½–ü‰ß=¤$[ÌäNQäy¿ùþ_þ¾ÿçoû÷O_þ³ÿæú²ËU‘ÿÙ½{ý¶>øŸ÷U]ì¿ý²û¾ÿ¾û¼ûÜþ÷ûîü—§?·?ýoo÷jÿýyÿ׿µø£ÿKÇ¿ðË®2Uûû¿O¿7•iÊ.¿ÿü_»¿ünÿëqÅîs~3×ÿÿΙ¬²Ç]Œ|ùû®;¥9ýúíÛ¯»÷çó}¤´&Ï÷&wíšÜîÿûÝOíòÝâ١ɩʼÊÞð™ö¿þ;¶i×)†Ÿ9ýRY\}iÛ±–>íZÆ•F\[¥.¯Î iA¤ ›ËÚú`ÏskéÓ®•Áá —ÖÃgÞ¸3`ªRèÝÚú@/Ê:©w­ O¸ô¡.m•YSßßp¢Òfg`•:´.kë#¢lké㮕Ááq —ÖãÙªvÑðyY[èµkb-}Úu|Â¥[ÞôÿÀŸ¹×íWÛÂ*7õ>¢.wYmcÑÑËÚêÈvÆÅ’ýç]G¡#¼´>MÓÉbçô¡ÞÄôÎÙx´rZU£xm=”æE4Qÿ²¶>Ø[‹%ÖÒ§]ÇaQ¸´>‹²#õö_u¨—Ñø¨*bùOç]kÃÃc¯­‡Ò:‹äxµ¸úÒM+ÈqÞuœ ÇpíÏkà}œÿÄÞ¾ /~üº{ÿÉäGWî¿þÔîíôÉóo_[€ûw¥5Uµÿúãþ÷Yæ>ýaÿõç]shØnƒþÉÇÓ“¾¶Gн¦ôÍ ´[¡'&‡O,|RÃï4èIAe?Âïà]—áçÉàÞðy„Õ t2£ºëÄjø<ðì >ù!ÂÞJÌtwíŸ0p8 R<¦QÌ? UayàeH ÁeM1JH’?ƒ,J `ñ„Á‹ß¬™á'˜(°p DÅš„PÄþ E€,Pà®]“Že\>nz<§ÛNëdÅ0=r,:± †D'þNŸ`õŽéË*Lñz†”;X"Q܈%±Ú2”QëTlÊhSF›2êXñKžùÅÙÎ öÖy}¨›ì´¾KÁ¾®¾ë†ä±.(ÎÖæúIŽ–7xµ³aèE^ÖU¡} áÃõô÷ÿjîààÖœéj[ï²Ü;3Æuh™awࣿ·vq,ŸÃŸ¾ƒ¿ãåâ-*#v À[Px5†tˆ‰É ~%´G‡àÈŒ?poÌw0™Qpcv]‡“ EèIƒò#ªÆÂôuã@›aY‹‡åàĸÄï tˆGi±0!‰"ó&o0Öb‚"Ç ÆçÁ{ƒ'5Ïá¨Ì;ë¾*‹Þwè˜ÃÂêÃd‹H>$3†IòtÁ„Âvu!˜ð Ÿùl!<«š÷ÃïX"-ÀçXÇΓÁy1Ž`ìÊ3ÇÆ&ÜX!s‚ƒ0¸hƒxç{Rˆ„½á|ÌÝx¸E÷ÄËì²]Oœ±–±¢ °í¢øÎ›«fûaÓŸ”¡2ƒìPVæxÔ¾´4Å!kÜ5-a:?ËDc»GS° á0Ö'eñcôŸ÷fL÷>FB»§¼¤ó-‘22âL¼Çòq-®ÖÃ… Xeã“beŽ&—_r%ÆÂ:O*Ø¿º%'Ë·ÍÃŒ­D™è*ë-‚ªa”j_ :›°4…‚#…‰‚å‚m@Äk…0qRÆÒ¥Â@‘ M"^C™ D¨Eö`ôd&XAÄy„“bˆ~œî½@„ é‰ßxrªJÇPÎÀàÁSì£ 8p†™2A Ã\kÀE§¬¦;h .@Ï1ÌM$¥Ò± ·‡äÅt“8Q§Dv‰°œb¾C$»B͈i *,eœ®$rãd‚l Â!²èZ­izZÓð_t7IC1¥i·3DCùNÏÐàV‘þxKD€`+kd´½ â€tT«l'ß;¥dgc$àw˜äÍÐrÁFNŸ £7na¸i¦°fÀ_Ø÷ÓÀñcm—®Š×ã= 6 ®¯¥ï¸¬Í¸¦„4VðI^@…D8뮀;ÀzA¥Xq:š#ç•Uа¸DÇ%L,ù°9²iÝŠbÆ…š¿Rà>ÊÆ—¨}t£? *JH"f8³©{F–*L˜‚Y c5 ÷i\ûèÖõö—V€Ã ’H$jcTz f«m‹jÓ>3i6‚ì|iràX ó¸b[ÅÂ>wdãqþ *“tqÇÖæ}eUÙs¿ì{ƈfŒMœ²dB_£¾büxEy™ê2{éª@°8È;]Ä å2Ptq+IË{€_þÀˆˆdh3ÓãÓL§A¸39†ÙÛçæöv‚•o°@ówkì)3º-‘WõµìÐnªv!ßÊ„òÛeMÓI¬·Øªy×E÷23͸ùþ€!¢åóuÏ©(ÍÙCûÌÁ~p\Û½1Åf»¿Gm'Ûî‰lO*Ú’¨É‚êXr'f¢š% ªyW£^B¹®rslohütm½µ¹Œ3Á«Ä•ÌJáê≃ºfë)žTwJ7n(Åm×°IØáI¸‰JëÊt_„΋rÅÈl‰²€:føÕìÁ‚z'”ƒÐÄ¢›ºy\caþŒfH•Ýt_ "¥OÙb7®aÊÄM”¥šõ^Ì^«ªaUQø/ÄEbÀg†þìºÉÊ«¦Ï H5\_¹®FUçS¶Ùš³˜*'q j±8:®S™ÏÀÌ€¢èY¢ÛèÇÌìc®Ë±FEqÔf›÷¼6,é˜TCƒq ¯u'&›ƒ—»±¤KHÆQ1CßXó1—| Kj˜‹ïTo¦¢ÌP¢'@P©vmc [ «sÈÓ›ˆid=‰ü]ªDŒ)ƒÇ|cprL]å=¢¹wkŸRÄT©„fŒ¹åUrPeŸQ„5ÿ-hJå%*… ŠÝTbB\0@08 ’—5ÍÍác&Ø%kŸ—̓ì[å)ß‚Nª wüð[ï4ðKP­¢ër“ÃÕ|f0쉃;È.žD/háá-î$c^?9kupây†;x ÿ^MØÁ§pX Ð) ¬?†¯æ ½ ´SBŠÇ°þ”ÄÐvٔɺz U·¬J˽j@ïî«^™ÆÓaZ)Ž1ÃŒ-™>¼W89sw™Á™ÕÎ"ežgBƒ[ìS ýãýTÝØACÊbæ·óâZÜÀLÕuæ·»Õo¼Cez–4Ææ+_F´µ>o­ÏëëåuÆt©TÜ.ûeqcˆÃ|—‚ ý¿Ä®…~\÷{Rñ;ĵ±¢Âŵð<¸ŸÙÀë\…kc‰X€pÚs`/‡Ã]˜vV ÌY³w:;S]¾È˜Eª¡ÆhÔm#¥4ÿ\ý”É6{‰¥ò Ôéveª¹„±ç:ªš«2²î¤Ì™°0{V>亜EÅ*ZsúJÏ…ä“ Uµ€"FBÜÙ ¡_ÁˆÙ~úµb” £Ûú•HJί¼î-J’0ˆ`­ë¶³Ê B†¿ƒ{èp +±»·…1(Œ!Œ>Ût˜Ð‡HQø:. s;ެ{C#qR«;G3“ZFÙÁÒ’Qü˜S䯣iº¦¹·Ë¹âÒ‘‚ãϪ¡Bå®ÌEÄäFªrìa¨’Íašwþ£uæšg6¡Î u/l#J7W”=ñöÀi›Spbj¦¢è±Ùr« 2»ü“r6ðÒR3H™«ôb25§qoð i`Š9˜9_ª}Žk@é¢+›Sݵ5× A݆ázäÅŽ y©VÞô, {/ šÿ®!ëåu)3jªDüôq³Íöd/®†ÀZ‹&~„ß°€ïLŸË4Úð}k.³KS#x†ïà–ò§ŽHÏvÜ«wp#¼jÃ=G°µÕ‡çÀoîÜp/×'¾¦>]J¡ê6}3†Ï½¶¹k\¤Dy…*v¾¡¯:$†«@’%Þѹ\*fQö­ƒÎÕçxH@ÌztS_k¹m0é-ѱÊÁ¤”Â%®ÎdJÉ™x¢`€mþ[ » Ve™',ÒÏëîÖî•âÅÂM‚¸êía ÖI!ø6z[Àw¦¬CÇa ™}¢@‘¿éîttĨ¦]“ʪhT•(7.?¤¹¢ï°oó…ÉŽËìOG‰¬è× š­t¼ÐlÓ=暦}o£;ZÅÑè€AسëJ8*.Å‹±µ„gŸû°µ¶ K½[¸KnL ló%J“£ñÞ<û| ŠÓuY—/ECóOž`¤KB¢(p 6™˜ëñ®á¸2ÁIHÕ[fÔ,ˆº\ÿ@¶%C‚Ï„qŠŸþÆœà3ÁÕ,¶¢1ÅcÏÏ?\%½ Iã% Ÿ)› zŽaÂ]ž_@2ŒNL³:¶ÙK'ò¯²æ ä¿Î¡d‹fÀ„¨·u÷ÑDc·ªúÒ}¥ÛBT’/9ÏDUàTÓ0Gª…D‹¾$eîi[õ5«X"[P@ÙWDŸAe«ªÇëD 5¥h­¥Øµ«V`ÇoµLÙм7lo¨-Õ‰´¢Gã½!xË@EU<Ql¨¢h0W½Ê ”.Á |RæFàSˆƒ\°Ùº€øèXä4,u#~"œ‡)º#x›¹sA¸ ÓÄi2é‚yïS/£‰`ù&p#–.ØÁU-—LÑ 5j4æ-•J[NbÅ9‰ÆuõH©rMÝßt¯Á‚ÌxG*ø=˜{<˜þW×ÙÊ£Û1( 4 Ëkÿß;v‡BP"³Qn!6Tæ¬3€$Æ-­´M}y‹Bª7Õ´æé“vŒ‚³®§Þtg(\jJ–úL[½Æ¦;Ùh‹D3Çi`J¨U£®_!FÁQW­3ª}v$/Z%ºfö6°(ôë^ë0—P¦¦éGWÂM]^+aÊ…`&%ê ]fG\Ý¡;q”šyJ€8`æÌroïQªô£ülf°ÁáÈüaTö!¦#\sv˜áÉÜÏÜ?W@,N·\E8Ë|/ ²:¶ñ¡>[Œ£aþ•û1‰`×D–˜KÔ˜TšJÌ|NÿÐæÕ5WD¾ÇoþË•+g˜(ZÀ –Œ@Ü¢°ä€h*^¦öÀ¼!*»7ïL”›©¼³Ù pÑ·û2%bŒe‚1.m‰o1–—-èV¯®)Lȸ£á®->É™,ÊñÉDFÓî¾Nt‘±nù…P‰tìÿÃRmÉÄÄ)MøØ×6L]Y÷¶èŪEMp=_SH·Ò*$ë6Ä騑óLI•\_=wv†1eqM ‹™z“ì©Åùµ%©+ ‘De®ŒŠh“ñTÕrª“2ţ饸qÄš±3˜Â lH¤î 1gÎÓØúLM¬Nu¹JåD¢<œòj ž¤\ÿq‘ù³SŒ‚ÓÍÝ%«LÔQDùÑL}åòzœãª^ç$Û_ûï­–•Øç±¿0AËÕ·”œk‰43Gu¶·ÝHf/so±ãØÕ že®=Ø“”ÊÜrøÄû³¯N_!Õ@"}FßqcdukoŸüIQ¬SDÞ§t, Ëá=iàÔ#æÇ0x5øŽçtôê…lY‚;þÜî¸C4Ü9F4&Œh[""Äò’‡n± }ƒ¤…½9Ènp5ã}ò¤H`@ãO5\/Ïl Ÿ¸~;UVY}0g_‘'dmÿÄKð1é½ÿ¼û?šýô> endstream endobj 1825 0 obj 5090 endobj 1829 0 obj [33 /XYZ 38.2500000 785 0] endobj 1830 0 obj [33 /XYZ 38.2500000 632 0] endobj 1831 0 obj [33 /XYZ 38.2500000 112.250000 0] endobj 1832 0 obj [33 /XYZ 38.2500000 785 0] endobj 1833 0 obj [33 /XYZ 38.2500000 632 0] endobj 1834 0 obj [33 /XYZ 38.2500000 112.250000 0] endobj 1828 0 obj << /Type /Page /Parent 2 0 R /Contents 1835 0 R /Resources 1837 0 R /Annots 1838 0 R /MediaBox [0 0 595 842] >> endobj 1837 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F8 8 0 R /F9 9 0 R /F1409 1409 0 R /F1700 1700 0 R >> /XObject << >> >> endobj 1838 0 obj [ ] endobj 1835 0 obj << /Length 1836 0 R /Filter /FlateDecode >> stream xœí]Ë®ÜÆÝ߯˜uØìn>€ €t%È"€ YYrœÀˆ(^ä÷33ä̽$çÙgª»9ÔX°u-ŠÍ~T×»N½ùãç¿ïþùÛîÍóçÿì¾ö¿?~*öµ/ºvÇ_?¼þƒ²Ù÷?ïêÆï¾þòôm÷íéÓӧÿ=u/|~þóá§ÿíÊÝŸÿþ¼ûëßøcÿ—Žá—§ÚÔ‡ßÿ}ú½­Íá§âòûñÏÿõô—ßí~=Žxþ\?™áÿÿ`ËÂÙã,f¾üíé¼JsúõÛ×_ŸÞtëúH劦ÚgÝδ®Üý÷O?†?^ì[gL]¹º¸á3uyøŽ©Ê)ÛbçëÉWN¿4Æ6êC—¦‰5ôiÖÊÛale¤¡õγ<qÚ?%››wý2¸úЇF+Ý®êîG¢xl½#õµ‰vE/cëo{UÖ±†>Í:Î…CëgU·ÝÆ”ɦ¾ëçÁõw½­l4Z9ÎZ{?úÅc«©/¬ï·ÆZíÍy5¸úЦŠuG»YkïGw¤ÂØûÆYcëÒ»ãñÖ7Myø¹¶ý?·¬©´M,Nü2¶þQ”­‹6ôqÖQ81ZïÚZWG;ÏËØú›îŠXŒ¸›uœó„Cë§;z„ótñ.‘÷±ÔênÖqνoªŸóEÛÀŸoXQUF3X_ÆÖ?ˆªŽÆÞO³ŽsÆph½;[ÛhÖÍËØú›^7ÑØûiÖqέwž­¯ú1…úÖ¼ ®=tUTÑ´ìÓ¬µ÷£?ÑÉØŸÆÀóèþø9¿ /¾ûòôæãÕµ»/?&vú^÷Û—_žÊj÷CåLáv_~Üý¾(J÷‡Ý—ŸŸÌa~Ué»ÙuOŠúôÄï˪{ôò¤ Ç|„ï´èÒvom=ÍÂïè WÊŒVÂ'x=ÆœžT{kNxõÎ;b´®~Ç<ŸžÔ{Û£3}gðþ<š0‚Bì[8·>3èæáJ+xàJû3ýðåÀCn»ÿíÎT×î¿+N÷ߕý5~_Œ)¼{Òì›ÉI•ðI Ÿt»îöÎÖ#š¬Ð;¦9=±{ïªfH“ð[ÀÑଅïàYw7¶Y0|ñ¡'[6føÄ£ãÑ„âeà¹5£eàã=ˆG³ãýƒ³vv2ûåËé™—±çY/Ø-ü>aïñ¶œ $!|'´‹V8•É ÌL0MáO6ÇÁ¿ wØàó&^­ÆU¤x ~ç9¶Ðñ…IF‚LS-><<¦"ÕÝ6=qÎ_sV%ªÚoÝXiº"Ø‹·p´^ -ÏÌ« •b†w'¶tƒÇÏèA‚pa.ug°pÌj Æ­|[Æ 4ïï‚ë&Ûîk`¯ji.øÔß.Ö 1àdnÃSB¼g%>¢|kÛr(ß¶bàóÆ£ÁY—ÇlŒø0ŧ1ƒk´HøQGíOÄÑú!sk÷ñ?½EWžô‹»ò¤ßÄkOÞÁ'ÏpÎŽÖÓµï³6pnx4›ÈmräÓ³† &j,35ÌV5b‘‚ÕBen­ ›ÅøŸcAØ‚Ñcfj͘0ÙÉàâ¹1jœuÙvÒä†×ÔBÃI™`c .2y—»:„³ÅKÇàw›R4–¬Ø}H¦“ØÂÞ·NRÃ'+ÖV„wÞ†Ÿž›µð ÜQ¼×ö]:²,ËÙéà'!›ˆ Iø$1À' Ú»³v!Q·7‰U_&A®˜”_SÔ禃ÄkÜÇ<•}Š™~’ߦ-ã?Áâ>ać ø ¾£|r˜»`Qù(æ–6cå&6[Çì å<2MuŽ<<2Ì:ÿ*<2Mcç öá‘á$:a¨ È „7ÜÁY;Mt­ÁÍY"o‹[ðÁ×ìù¹!]1ln‰x<&؇e >Ì6R^çÒÌ_Œ‡åáC‰B|îòÑD¸Ðí¥δÑ-uŠÜ°FgœóƒÓAT+¬u“r¼4œNø:QR9•Š•-Ã&5QèupTªrìU´7 ‚€žæÑ¦Ê9‹ÁJbŠŸoòEþl>-[w_‚^uBdhQ]) bó;¿/‚ŽXÕ#•Íâl9àˆÑôK°j ÞnyŸVD~TWÕHf°Â˜¦£ø1ß[^f“µ ÌŽÄᨋ‘Žù £9ªœPÜš³È:¬PÚJ g lšPß…¢BÙP.#f” ¶ÂÒ‰-Ž­€ˆ£­t2NT¸¯Ò¿:¿W$[åv ”àrìÞ[K/\TED»Ø®M_?;—ȱq 1Ü—`[ `þ´<t-xz,æ5Tîù¢º´˜$¬D¡ï¨êhLÞ^OºÔ_4õìD©pW¢<1Ýü-œ'¦Z|ä‰m0OÌ›¢ºá2åÓcþöˆà'$rbÖŸÂø]ÖLPRn‘?É*4¼q—äh,·Ó$;xÓž‹4-FN8uz…/ÌüUMÄÈf‚¬Úo¦‹êœÆ}Å`®lÄ}µ-D«U;éów$Î&wƒ“4j¢D3”]‘Ñ ©ÔºÈáÕÐÈæ¹%ÕW3µËîÁ´}~5ûGÛçdmŸ··SÕz™f=™S£cöµ¶#Ó/[ªlJìw ’Û·Rj+ûˆi]ÛbUpkJßé{€MSŦ¶£˜¨*gó-›ùÝ¿Xšfþ¹Å†šËú\2YÂXóäû‰^: 7T+UŤ£`€ˆI!ù àP™Ksåmy]â„e h,ΙŽ1Œ–Hß po‡ÔT1^œÑRT‚”Ɖo5é/\yj§õjÑ›·^’—=«f 3ö.æK! Ÿu—‘³HÒ6C’ß a3~­åYÉ”»‘©ÎÄ“]Ÿ(v(3½a›ÑÌó‹½kïÀrJƒ39q ¶°]ƒÓ«ðhªRX?Ç(@ª§d v@š.GÞÙyÝÂØ8*M3——QÎÂõ•ݧlÍïdphò*$ V0Ù@xx¯u³5 W ˆ`ì„W” Šè–0æM%jG²jÌä)´$&U •{‡e¡Jœn"•…äQAÅ7¡›‡«Q°,$—ݼ©jKUt å:rÕ8÷šÛq2ê CˆÄ;*þž²…ÍWeU9qmÚ.{÷EäZ˜CrÀ˜‚’¬+ðtñ*i ©‡ÜØÃ_æïí;9øÔÌÉaG]Æš&¬\?Rþ»Nu³N””àü¹æ2·-1n´ÔÌ“q#¦¬®žlXc®‹kLD¢ÊÅȈ|M=:„µ4n‰™váv0S¼7U¸DÅ¡@(ù«o”+±S™ÙÛjÎ5£Ë6 ÃáycBc܇ŒçJ+:J½po‡“øqŸ&íw !DHC®ê'[Ä­™¦â´˜î‚ÿLŽÉ›Ú´z߸‘fyŸ½èãgÝ·¥»ªFýäX&¯Õ>iÇTtC¿˜ZmY¢ûÑq*@&`Ù5®Å\a×F?­''DD2†,M·\…Qçˆ!FmTIù¨ÃY Yc«±+zNŽï¯ÝüÙ¨ffkÅÄ0Ìü5ËÊI?¸Äx»„Ä &•¿ƒ¿C Êè h17QŒ]…rĨ¦£õ†ZÏ›"ÝÞF˜ x4ÆR¡²úU3ÉîšwE|¾ð#É7É %Xßôº …@·ñÌæ‘U$†Jk)áÂbý‡q`TU ³dsŸ¶Þï¾Êâï©Â9±ÅÕéØ %á¶LùXÌ>†:¼¶xb§«N÷e=¼«Óï³ÝÁ¬*«ÆÜQ‡Wú¨ud¢Í7åyþ0·;UÂ×V¸x€6‚uj¢=Hd'Y4¬¢’¥Àx1Ìî_DôŠXKv¡©ËvAúW|BW#ø~q…(O[ÚÒœ˜â§¶#º HÃMq±æšVʰ\2mÅ}¦±be@p¿gþ6 †“+¨ÛÈ#û¾­0»A7±žñìö-"ƒú8^ç€Ô&‚'ÏÊ혞¯®¦à•ÔLEN„Ε-`óÉtÔñMe4l¿ú0,È32å˜ºÍ »Dþ•'Ñ}*ÆøÅÖÒ£F;Œ1x,q¯eHÃòÜSJÍeŒf´DÙ}Uq¾?B®âh¥Ò!³ƒp ·¯ç†’¿dq6ŒêÙ€@ÂÔÒ`’¡­ÛoKJ72:Ï k˜ÕZJÔ/“jòÊ”u9/k­5„ e=–ªá,WNÕn3@8`ÆN ËU –ŸƒÉÓe²¥]#•¾µÊÜzð”ÒáVâIªJEϸëTQGW">SÂA 8Ià™z¼×®óWk6¦=Q×EA¨yÊþÌ*™2)B¨ èÎ*%ö‰¼@LT@žˆ`ü$öb2Ñu!ç(mu9Äè 5lqõ kFL(Jßškì5#Hµíšþ½,š‚AcÀèÖ–tµUF5¢¬üf,cc1¥OÝz®ÕஹgΊaµ”û^ëÖoÏ)&q+l*׎˜,°éUtìȪ®¿ØžKå@ãÄ\]„øÄ£¿û½Ê‰øµ©ÊÑ zx™•¼Ìº=åïRÂÞUmy~\«í#>l>H›Á+vCù¸Ða9!Œ-««J¯.ˆR|߯mg©þ®:ÇÅv«@LBIË6âÐBŠÌ=ù”J#ßJ_c‚٪ċ+yóã;­Ñ¬\þ—ÓÑZ×#Y’ß’S5Mv.·ÒdŽãDRù®LÔmÁŸi…¸™>^ª *WH€ß¼„irª£ÏçÂç¼ÁÒŽ ÈWêæñ)@€D€½kÄ„Z3ŠÓíhÉ9iØ¿SKrÅQ5ATáëÊËõñ°Yoj|?Ÿo橉Å—…½(|™ÿ=!\búí5z…kvGô•2ÄÎAÝž7®G1žËí0¿/A1EÐ;ÂwZøÎó™ÿw¾óWûÔ=©÷v²ƒøI‰fp¶‰¦OL¢dëÖVg)…Æmu¥ã"W­ácDÎIÑà”)Ƴ›ÈÜÄaÎýKÔT„BUÄG‰å¾ª7Q­BÔÚD÷–Q­àÅ[xXªÌMJÉ`ôÛ5U}û®‘Ó‹T[s›¡ý3Ù€h.SÃDÈTSL¨ êš±U·àÝHrRAN½§FðÙÉ2Wë#® *!}±ePHL3†;4¦¿m†R3™~‡¹/Éཙ®Š„<,<¢ìC7šË”fd_Qñ×DDËÔ„ëfl11(嬵õu'½«8oBh”¶¹DmÌY®CJD@;% Qp•uªÝÁ³ÚÈC(¡í:\ÅØ¶j^ç9²¬·åüQ¼½˜\ða¾„4ÆcÁ 1i0ñ­ˆ‚5Æ(2y“ÿ¤|øµûv Y‘¤?Íý…êusQÂî sÔ’v¥žê5£¥›w}E$u{ZîË.&5¡Åjúľïß©&¡'\ý}ÇÎ)Ë׿ö±_)BFÃéÒn¬9bOO5]`Ï›qz&V!¯,ÃàÑà;½va‚–þ }”%¸ãχŸÎ4&|Ð=ÆÃ"Ä;Ô³=ìwÄéOWHZ˜›…× Ž&œø˜<)˜Ð8>§‚‡g¦„WÜÜN•uÑìM·Åò„W»'žƒÏqïݧ§ÿî}çJ endstream endobj 1836 0 obj 5459 endobj 1840 0 obj [34 /XYZ 38.2500000 233.750000 0] endobj 1841 0 obj [34 /XYZ 38.2500000 233.750000 0] endobj 1839 0 obj << /Type /Page /Parent 2 0 R /Contents 1842 0 R /Resources 1844 0 R /Annots 1845 0 R /MediaBox [0 0 595 842] >> endobj 1844 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 1845 0 obj [ ] endobj 1842 0 obj << /Length 1843 0 R /Filter /FlateDecode >> stream xœí]K¯Û¸ÞûWx]`‘E ( dò(ÐE º(º(f:-AÓYôï×¾’|cÉß‘øù’m5h“^]Qäy¿ùæŸÿ¾ÿçoû7ï>ÿgÿC÷÷»Ï»â|ÑþgúóÝ·?°õ¡û÷>Ô~ÿÃ/»¯û¯»O»OÇÿýºk_øüîÏÇýoo÷:þ÷çý_ÿvüáÝ/~á—]0áø÷¿_þn‚9þ«8ÿ}úù¿vùÝþ×ÓŠýçºÍ\þÿïœ+LyÚÅÄ—¿îúSš—?¿ýðëîM{þ¨TUaë½)]¹7Mi÷ÿýÇî§ãòýâÅ¡) UŠ>ì¾ò¯öÆ6ÇuL1úÌË•ŵ—®ŠÊ'ZºÝµ6<Œ«Œ¸¶J«ã2-h¯öóÚúµÆ¤Zúe×ÊàhŠ—Öçmêdø<¯­tרd¤rÚu|Â¥õðéMsÔ!s^[è>”É–>íZ>áÒzø¬Ê^Ë5ê*ô›ÅÕ—®]*ÚîZFñÚz(­ëNÍÙRŸGÏ‹«Ã=ç’QËi×ÚðèPŠ×VCi0u•Jê¾®­Q[¦Ò¢í®“H]¼´>mÓ«#?ön†z“J×…²L%uÛ]kãÃ(^[¥>ôlôóº¸úÒ!™Žnw­ ¥xm=”Ög{ô¨™´S'3vCã‹TK¿ìZJGkŠXï£ý ˆz}^üþËîÍGSÍÞTû/?÷öòÉö¯/G€øýwUUuÜ—÷¿/ Wÿaÿåç]s¨¬ï7Ø>)¾‡OôÄø¤„«Yøä|ò~Ÿ?q àj¦BOü†Þ…OÜAñ1~׿ Jx±m!tJHo¹¾ã \û·/GÆ¿iÇ–Å Ç6¡ÇG{²úP7ÅËv†øðgksù¿ÓòXy(]› xÅ»#¾SÁwºÕæl©þêèðÝŽX㱸Há_ž¸ƒ/«:|»ˆ­á;xµ=± Ü,<†3³aÛ'Æô瘃/U²cVÃìÔÁ´à'àÈ }È ÂUaNñÜ›@ð糺.À-¹ü %¶'m-ãgØMØ6z ëeƒ­â‰`M@ý-7l傎Ŷr~‘ÁŒd“,‡R€©ÂÌ-$ƧÑgÒXp™®¸}´ªq Î÷ÕÀZ zçÛ)½Tåàh¼Q£°ÍmÓíµm³´HU8ØÐq{J8ûz6œq‰'JL[×h:+ ¤ÍVl.©ìB0JˆôLÙ<ƒ»Ç,'H«%ê!b';ÜRÙ8³åjÒ•ªQ!ú¯°ÄcJmŸŽn¬ŽèRœÜ’–MQ7sxIÖ6Æ l‰É"Œ¤»±av(-ÂÙab¢Ü/‰«ü Âb+ËéÏHÜ9?c+}h½ìåAYƃ6&L>ª.ƺ×,âÉYªHu ý4¡ˆÌÇs2>:Â]W`BÒ·¥¿¤}ÂG#õp²´ºA<€€ ¤Э2ÞšL9e¯’ÎÌ•*šoJR†‘L`Â6Lsøb-yTÁ}â&Óõ7r>€Â«šz¶ÂKk{3ç¥Q#‚²HÒŠÊŒ-]LêG8öÌ`bÕ€¸NÃ=NÒŒ ùë¶2êzïLZ*‚.Teï ¤2Æ:Ã¥De ã… ° žQóLÒwÒà¦è7F”ãæýlŠa…V¹†g¼¼‘w_ñIµ:‰Ø_Õ$ ®rP@ùïj+“ӧ˧ÌÌE!DJLJb†¹…æ0S6ç Ë <ÙR‹ˆ` °G\|¤:)Kek¶±+óóìB‹y¦BÆï`rªÖ±0f&áæBr&ËN°-§YÃ5ƨL|7 6Ȫ֓¯fFJÝÕ˜KåµÙ¸Þ,ë}î1T9QÊδÞ.ß”{CmrS°*ªiƒ5W–JÜ7"‡3?4@]/+Ær—žàã;XñVÝjÅü½áwt )¾Qw¹U=® ٫٠šÖÔ)«0Ð_Û˜„EøÚ ²âfôȇ¥¦×çRã‚`bò*i[Õ>Cå®ëLièå cé*ùÄÍxµ½ƒþ=Ô>Œ¬;"gA}ÑøæPº…T1E„‹;PºWõý„‰EIDTuÕ.ODZ„õ¡1xI9ÛÏtT¥65n?W¡eÚZ‹0E ñ¯ø¶®ôáH{ö¶Ë9£>L˜ãú9âÃBuþ°n£\.ÇiT†õ,t/U2‘Œ/ÌDÑ/‚ìLíO¶*AÕVÁ8Ôbàf8¦Þ•y!(º–ÑúÃ&)ÃqÞ_*Ôiap'èÂÕ);g¨î­ÍëËÝ î3ûPõÍ\µàT ÛȨ`hˆˆ4¨|bî¼Ïa¿‚´!ÒÕºc€•­@\7e­§½K´ø’ó‹çs•ƒéL§Šh ÐÈŸuŽ„jZ®Ý&­FÒ¹=­ÎXX…þê÷±3êÆ™&w¯ºš—•pÝÀ×,à}íåÀ ‚·N ‚I#¦¤Ó¼ƒï(Áe¸8#WyþŽÃÐYþîs—»Æ«á›^0ÓEÌ=˜0¹ÝjkŒFªr’^M¸ænyrÉwûUp½%ëÔ:§?ê}nÑɨ·›úX ÆêcåB5”“ÛÀ É’!>‹­4üæv²»T9Åmsž"OÜÖÆN»™úÃëª75tãðB7é(\ÈÜÄ‚#Ê%p¶M£{uQíÊGÌ2Id@U«cw%Qû[¦¡áðUþj⺹«ùC™Ngš^F!6¦eI,•·¡ªÓÒç½my©ÂT†—3‘ofòód¢ÆÀg ‡˜t3¶«~FT €Ï—zÑ-†ÖI‘ë3ÍÔUÊL'浌‰køzê !ç5—Ÿ¸z½c¸ìbrrB$Çñ¸šÅqG¼7öÂE8Ë c•ÂjSi¸,Äç¶„pJðúzšO1â ;DBØA.¡B§˜·qÌZU†`r¡ä“°ÇÌdàw ~BÌ2N YÓb,@œ2™Ä5k á¶?ŸO „›Ï™RP¨tw@ >!­ }™‰ÑWžVlšê–yžTäòËÌì°@ÌzÌVüâÇâ*†u&¦Dt¦0öN.Åô&<É–…ñ“ä/0z¶Dz8‚kóf¬Fù?ø¸ƒ‚àF‹¡C˜yT„ s0!«¹£ZÀ³¼Ç²fPw®0Uµº.ÞMnty޳ø<žÞCÊË›áËû̈Î\b#ŸçŠ`'·³y®k`™\shu‰|óª% Ñõª©Û·ß6Þ™d¦UøèÆœ?ºt±{0•¿ÄÔ—¡e)jN‹XSÔ—ÐÄ2×ALÖ)ÇF”áòËßåEMC'Ê©©é×DqvÌh Õ&ã¯LÙæ¨&ޏc„* Nr¥Mâ{Ô2ß™WfÏ_u”RùÝîPŠ[Ô´3ó½—*aÞfaŠjáyfaFp'S)Ï·õÜÈÀª—lSÍcwɯëì™òög.•åÖR ¥r‰› MIuw;ys Rd® {FÏÜž­#ìùfï9-á8g³¦¹Ü¹n4&.Šc´D]‹ÐKÃLy"*D˜›ûJœ1±úÅïö<$g—r0¦4>¹D¦FàëùZ€ƒCÕ¦\âÂAIè’5FƒJÕ«Î÷qŸàZáÕÚ‚© Ž~Ã]°I'øKm™+M$Œ-Á)ŒDœÕРžlw£®ÿö%ÇÌ%£îÙÊ% #îÙ"<ê|c‚³á’Jt¿„žsÌ–»îîÄàÊ[ºï³^óшNª{žp´/t¿ƒOÚ©ÑkØþ>ÛÝ š¸“B¸ ˜Ã«ùø“ øÉTúâýŒæ@,îUopnÏy¿Ch¨Üfó :ãQl°õÝ-ÄT{¨4¦ÅÜrÏåiã ®ùHLß;À'BÂGÕ`tȃ×; §Ô=µ»n†æÃ!>þÄ\Á”µhÔ!¦.é¿á¢-ƒ™ B•d,x¨ŠæW׋¸WÂáÕ°p™bิÅò£Òˆ[ðÄaèÞ5ÞÁÔH¶,ÄW†4€'1:bÊךŸ(³3‹J\½ \ª‚w05¼ñÚæ*,Ò¦„C6«Î—‘?›É·lr¯ªs_ÈŽAÅä[…!jÄj˜sÉ^嫳˜Qi„¬¢.ƒ!î\b†SuŒÍ$ò]ªBq®—ÃRy“°@´n’„!‘x<¡*@ ‹9‹‘׸JUÂêÊÑÍæÓ΄Ð_(çàŒÕÆ)ƒáÙlÖ”«ú¸Ôè‹&2}nÙ²ZñÌ'NaâkÇUÒ¨TÓ+‰ žJÉÜϬh5¥Úë¬ÁW¹1ó‰™ß„?ä¨PȪ ŒM]ÍUéÅ̦ÝÒ æVÜl{ë©m§SRïÉm'fr¯P…¥2AzÁñ¿õК¦Šx™D˜VKu9ƒ;ÓÀAQ€Ì¦K6;~9;ž¹´¶™mêÒ6çqþœG-?ˆÁ`„ÄÅ¿JÌšT]郖M= ž'žºšæ2†û+g´{B#*WX}¤Bß%ÑC¹Ø…,‚èÀ jø F â$dQ}›K~åŒ%©µïïD{ºÔVîøÁj·'kÈÓ;œYǼPä¡øå« ,®HQ¥•E‡™xm£SO²l´n&ñs§U@›$ߞܭÆÈU!›YöÆiM8™Jhõ!Î#LÃø!° ì°Ö©) ëÍ_ êïèÖ“0ÇCw.»Én9L¦¨§Á»fÓ#SÉðöd{òd¦ÇÝ•O »ótü[ÂãŸý×ãŽÄ šú…§úê( ã…9w÷vpQÖµn‹”p%\Ú O{°í@®‘ȯÆOºt»=Tà I¶ÝÁµhù{ô7U¹ymo»“¢ø6N)•¯[*àfûña£v4Œ§ìá,Í•c¼|§“$&êèß-Kp§wÜ#î#Ft7dî buÆNWàJ•+$-ìÍAvƒ« ’'E#Çxªá"xyfKøÄõíTŠúо»$OÈÚáv|Jzï?íþÅdõ endstream endobj 1843 0 obj 4673 endobj 1847 0 obj [35 /XYZ 38.2500000 584 0] endobj 1848 0 obj [35 /XYZ 37.5000000 567.500000 0] endobj 1849 0 obj [35 /XYZ 38.2500000 584 0] endobj 1850 0 obj [35 /XYZ 37.5000000 107.750000 0] endobj 1851 0 obj [35 /XYZ 37.5000000 107.750000 0] endobj 1852 0 obj [35 /XYZ 37.5000000 567.500000 0] endobj 1853 0 obj << /Type /Annot /Subtype /Link /Rect [194.250000 778.250000 245.250000 785 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_features >> endobj 1854 0 obj << /Type /Annot /Subtype /Link /Rect [66.7500000 275 107.250000 281.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus >> endobj 1855 0 obj << /Type /Annot /Subtype /Link /Rect [213 275 306.750000 281.750000 ] /Border [0 0 0] /Dest /3#89#3fq#24n#f2#2d#9ek#2d#12#d9t#eerd#b5#b1q >> endobj 1846 0 obj << /Type /Page /Parent 2 0 R /Contents 1856 0 R /Resources 1858 0 R /Annots 1859 0 R /MediaBox [0 0 595 842] >> endobj 1858 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1409 1409 0 R /F8 8 0 R >> /XObject << >> >> endobj 1859 0 obj [ 1853 0 R 1854 0 R 1855 0 R ] endobj 1856 0 obj << /Length 1857 0 R /Filter /FlateDecode >> stream xœí]K丑¾ç¯ÈóÎI=ÃÀtu·=,Ðèö`ìa1ãŒiý>ìßwfJªJ=¾øUz¤Ü÷L©D‘Á`D0_üôǯÿ{þë¿Î?½|ýçù—æï—¯§äRdIý¿óíÏï`ËKóïç¢Ìο|?ý8ÿ8}9}¹þÿSýÂ×—ÿºþÛÿŸíù?¯ÿüýü§ÿ¹þð׿—n¿ðýT˜âú÷o÷¿«Â\ÿ-yýûöó¿þû?Îÿ¸Ø~®™L÷¿ç\UÏbâË?Ní*ÍýÏ¿~ùÇé§zý^É‹ªHÎ&uéÙT©=ÿߟO¹ßž\ªÔ˜"Oo¿D¦°ç¼L’üllu%s>øÊýÆØFèÒú6ker—ih½ý4Î5„)ôIó6¸úÐ. 6ô}ÖÚôhv­·¥. wD_ÇÖ'{ê‚Ñû¬ÃQ8´Þ~æiÖæú6iÞWº¼i£0Cßg­MfGñØz[ZÙVzeCeý^â¼ ®=t•Á¶ô>kmz4[ŠÇVÛÒʤdÌ u²¿Ž­¿£6±¡†¾ÏZ™õ†â¡õöÓ•i°#ú0¸úЙ %ÐëY‡9¢ÂØz[šç6Ø}[Ÿì…)C }Ÿu˜#Úú‹ÇxõOÀ}ú‡ðâ‡o§Ÿ>Wg“Ÿ¿ýå:¯û÷꿾}?¥×ÿ¸^¡¯ÿöëù÷IâŠ?œ¿ýýT]Š<ËmvŸ]ýÄV÷'奬’î“ÄÂ'/÷'Ÿ¾]ið¾ù›4AK¸ngw Ÿ›%Üç’¿›vç溺¨ðÛéktóî6…1ÁPšde.ÌLÐ4Ô”Ñ2ÆèPá¹ÙÏóù ~3º`›crõZú)†±ž]™£L\ÕóghÕð ´‘ ¶Å Í×l§ßwRh¿=›ÕéEæ ¦(Þm<7LL7Ö/þ3p=IáYxÞÁ4pi<ñ”•Ï'ž6É.º¢æO‡x¢Åœæ¼L\Æ}ƒåœÃ`ÂÆcD¨AÁõ.,bnø(QŽ7Æ!?†˜øÌéŽdKq…°¶D`g'eÄ0†ÞAl÷Î}`ZDôæš"ËÙÒ%¨Ü‘ƒÏνäµjsï#PtDçLI9UˆS—ÁxÓ¹ëªqÐXé 8^E â` Sl0ßy.$%ŒHm X0±Óž´õíÓ;ŽBÈØ³3]ÅçYŒQ_™e¶;A|Ѧü€ø‰ Mû<éæ#<°ÓSX8­œE€Ù÷çÙö‚!†cœ„î„teµ cúùRˆa=!I^3Ø[@QðJLùccï4i nám4·„!ˆðΊUfeá8cVÆsS¥…+Âl8€€£ÙLhNUÂ;9„÷Š…w)zjÓÜuwwÌSÛrÄðjTSp âw&o5c¾˜,m2øüNŸàwàÜšÀÄØõ°‚£%¢Öx OŽÝß‚›ÝRo:l$ät?q(À eðG’‡'ØYq©œrÀ€öŒ/É%g ïT7 “XDn #nÒª'n„“…yûÈðh QYÅ”äî¹)²£<·U—Å„¢ˆX™U+MÌ…NºoŽQ°A¤Ê"3«cÍ%Ø!â–iÑðS±œ“Éz|ÜxLrÉ ÓE'ÀÚ˜)„#0¨ÒLÝò=I~Nª¹±ï ~•™Z,,"n:(=¥Ê¤Uy×皇WÌdÏÄJbQÍÀR†vÁçÓ-<‚P?ÿŽ+»àñ ¸«ÑžÁ>ÓòÕÔ3HE I5ÁãÀzÔcS†*#b©äCÏqR…½{Ø<ï·£b_3ý"¬ß{T© 3ÿ†ª*Àæ›Gdq]¹M›–ÉmÎß=Î-Í›õ$HV‚Óœ¸ƒRV1ëX<ê‘qÌÄ®˜« OŒ‘@)óˆã ²‹`ëL-Þ^žM5nÞ„~fÛêã¦<özݪÓ³Ì.$´{½Ó±±w*ôŽ{i·®èe‡´Âd8Zãß¼‰™ÊÕŠŒÍ ÉBÉÛ y{Ç¡¹áïXø¯ÏMXÏ'â;p=xÖxMXiìz犋œ— y^*Ó=0Ù!S6‚ll{s‚%0qñ;µÌ/ÎØÞ}nˆ°½˜Y47dü{7”³üµ ß} B«ÃwæõN«}R»°ÿ '—Qit0‰ §ƒ i/ 5˜3Nb›´}GV*¤ÞÁïXœF‡÷'صÊoh—cºAK ?/Ö˜:pÖ¿Áï+Å3øä¿Rw˜$P†xnð,èIGÙ›ž'¯ð ªÑ5X^¥¥ßòQ<á;øÍ\J˜èfƒ13øÙlK¥á+(ág°»7µ»"«°a¶¾®Ëty·ñ¦ÍCªÁfØÞÃCg.æ­†ó6²ÿ%0&©)»‚Y·’V(ŽÆ8B0Á9|íkVc©<˜á«eÕS{-þ`„ÿ; 3™Ú^á–Hˆ›ˆØ­yQv÷Ê &-Ú*Q$/à°BBu0Â¥ýñzKÜ`6#‡ÇÊĺß!ÔÞJ¬v‚# »ÊNNgÍvH¬~‡à’Žæ!¸$ê‚K;¸Yæ­#@@ói ð²KÒ¯£«)ˆkoŒmõÏò6 Ï<âÔ‡5pj”cÏ¡&ì ì&V­nØI eÃQk¼tf[˜”åõå^úD ÷çƒ*%ëé”­HÒ¾B^±[Îï6‘EªI¦Êf‚n£Fæb”-$ÕÒ™T #SrX×ãܽ…¤ ¥©ºÄMÛ0ùy&¸¾+mo2+°sŽ2«mgv¿ñWIë§Äy¡Ê(³²¯O%Ý$L¦†2R½ÿZï‚24uŸ¦[$0à´¹í’ã ±™ã&*K°ˆ‰*5ª´ÏM¥õœýTQ—¬IóžèÑIÿd8‚©®ÓÅ` jç…¹Rê"¹®Æ½v ‰Ì´¦¢@ô‡w0©žóUEb©“\¼tÝJS^`~Wñ#f þóEq z*W'ì¢zþ8 Jé‡ ¾RJ…ˆê¢ ¬‹)VË(f³ƒÁM``Y(ÞÑí#ÁÜY°hñ±X$:b]W•õ|ØcŽ“£®kíu]Uµ¡úZ¯ÐÒî‚hG]—ÈÊÕU‡ï”•â‘äÈÁ¿sä`ï+{ZØefZØäJñ1ó%·P¥˜‘`ù$#j˜Y ú›ypÖÍJC·v¼1’I6TØìÞèò±b0–’Jàn›ÞëHîÁ‘F„ÓVX‰äGUÎóÔ-ÏÀmø>¶4g+ïÉ1¼Uçñ †È,^UDøt|õ,ßU%VHOþQ9ôi”ÉN,å¸ÚNj}Nx¢®nGåßàè †#ÇÉÊLÄÅ›!“íï˜ùšP%Efp\T,n,n@wºhl˜âC8ÿ¨±ž–DÜU9쌇ïPéIªQÛ'בò69EH##.»Â&lÛ”6W‹ªO¸âl>½»ýæŒ|£LKøªN³ .`±¿™&‚”ÚÆÉ!8 ®ÔµuŽ>=bð½¸è“XÿÃp¸6¸àš—f<ñ)>c6 byÒˆ:ùå›1mSiîż ~­ËÒ²§,ÏŽÇ»š•Pã(“UL¡¦y3Z2_"¤)šÕx~³Fx„.ÄgyÛíàT1 l½“#U C«Q ðU†Èµ…Æ3Ìð‚YÀ0Èò~ûÅ‹÷„¹Å5Û‚¦DÜ‹ÏU­j+Gêa¾î£1j‘>)ûJ‹JDˆâ&>œt¤8Z¼ú†ÊU»ÚõçEù%ÆãLMœM ¼qŠ93Ú¦“Üýf­Z5cp2ãâœÈd•3ÙÞø;N]œw2¢ÿ ®Rq™”_|ê#uYxÏ Ï€áKË,NCãʺ׮ƒ‹c~3Îkä|ùÅfÀ˜ï`-'ª›?«[ˆ®{­Ã[écö{¸Â<`'.ª¥ÒÀ|‚'ªa«ÔÛq4 LVÈ`ƒë)ÀXxìt›á N*]œk¨û}ÔrÁ V§B7kà€Ž!<<•ÉÊdçb)ÀÈiÝÌõ}‚&{ízs5ó É zÏͲYäl¬ á‡¾ò j‹¥H}ºÂflG&;ˆ)*Ð ì¬0\ˆ5yÄd—÷ªæ(ëJ&ͦÒKiªF0¼Û-sÓ¬IàýQb lFcì$ æpDÐxEßç³8e@vôyX:Ø”Ãf³nŠ5s½Ñ3T" ÎúV=Û‚Üð_œn$•-Ëv 0â@í%“Ûö4à¤L›ÌÀØ´ÔEgp`±t‰T=³^ûFé I¡Ê2=u˜K,S/?¿ÿÑÏÁ¯öÕ*U‘€˜FGáÈå ѯJÛU'Hó ZUQõ´«†\Z¡Qê1G,7(‰òŽ[>ãµ<Ì£5˜GË“j'&Uȹë‰ö-mÙaX†å¦ Kc˲CëaZHmX_ Œ@„””Û€19tÁ÷ªv±¹¤œ>݄ʠR¼BXp!•mÚ¥ U­j…ûØ<;3—ýLdŸEC9óHšœ™U©¨Wiˆº—ÜVâ ’áÃ4Ü¥€ŠT¥…s£šª)Ѐ š-™•<ÐÓª9“9˜æÊ¥‘Sð49@qˆ6”ºÎ øž±´#—ÍSiòØÅÐÇ][u¿fnƒÔÆ× ý!+„ŒV¯±°á65¸wÏ R·ØQ”䦻ˆ'w[ö6•± 1+3§Kãvácõ/žÎ«{7×…ÇÆ4ÐiÎëq›V•Ôþ '¼ЖïXj4\ÜwÊöG™‰êŸÌ¢­ñÒ[=â.§°~¹òÊìõ†˜á†Üèz#ku¹¿ÿýdyüÁo§¯ÂqsŽnSèîµF‰?UKÌܧ˜‚ŒX¬¤ZñJÝÖ1u˜KØü¶[ÔušØÊheÀi[rôΫ"‰­~ÒÊvERçU¥º·\Ê;t!Ɖ¨·`´ñWŸÌJ•X‘iB•Žò"bÚ¹³Ž9R¤nisä6…™æˆ.¤•íA8ŒhÊú8¢{«¼G¬pÉ›q<™Z)Á5¬©!ß(G¥±1½ThÝw‰á.Kx.uÓ ”ó=úÏ«øbµ•ذ8È Å« *<ÁùïéRæõ«b†>Ï}X¥«ý’7×<ÍzI`L+U™Þh)l©é2ãØ%³Í~žÔgʤkz.½3‰U2vÂÝdð;ø|BLâDþ±ëôÈ<ÕÄá£(¤5žA{0¦ÓàÖk‚òÆF‚ï Gz‹’ƒº]F4ü·>ð㩺5_<®ŒªHXÊ9øó“5ö óYõdN ÜœqV7X˜#^÷Š!»g4C¥m6´9<Ù<Ùhà˜y40¯Zð”ÈÊÁ Èç™[œŽ1}0`1Kð†0ˆÚÀ p4! Ÿ€P;ÀF°‘ ®Z)؈œ»ÝÜš/Bm8…âùŒTÌ7d¬:âù}­©wÆ*RíÄ”„ žjÚ¹rÖ_à“­Gò¸ˆ0W‡mB+¬6N´IÚÕjÑòª˜y€‹a*Ò8’ë”*g¬œ™@Âe5Ï«ž¥öÔÝÜ —wÉqX–Új›Á9ÐíýCØ€L‰†M@ÆyÀœ|Û;±Ì JÿàãAa*I<«¾©xäâ/C«pU7œMPG õ&kéÖ\#Îp•n(0Zö,SP<1ÌÖתª 9[ÌyAuøN³‡^ï4ÔðJ¾Âgù\}pahÙýN,Nòz³†©\xnBšYý¼ÍΛõ8ëÉèíH P¿c1ÝðJ±¬ý¿Sñ!=Òº‘&ÁÝû¥3]:¤e1îýh ¦5%uyÛ$0¾YÝ»ümŸûòoÛcëå3"§ÜQm0ç—äé>sÒ}¢ÇöÖRêRc¥=QG5–eBø* U#UZ6¿0IpÁ©ê;a{P«” R •̇Ÿ& Tϱ:…Ī¥_ ü4Z(pë [I4ßdàGÆ3¿—Ѥz (LW2k¬(sIº YÏÓé^ǬUÂÛ[‘=¥ž±&2ÆŽÊ%Ë$_x`¦ª‚X/A•a—”© FÁ8@|ÀâcáùªÚ> |‰f(Ëx®æûšž'޹¶Ö͇eæèzTGŽw¨àU{º·(Q¬šÝXt;2ÅÖ9Y³ŠÕMU¹QµKF%±eOénÁÓË Ë=@ß^ÿœ\‰&ÒôËÔ/Ì z9FsweåÄÜRÿÎ6í^ÆS-n‹*Ô×#;Rl\_FJcÝÇæ&õða 4h>¢ï¸)ΛÛçf¥(ûGÜÒ¾i‹SÏóá¦Á‡Ëß‘e<|§ahãµôâmY†»ýûuÆíFÙãÆÌ7ºé>2V )da½¹°{ŸK ssð¸ÁÑ„ï³'ÅÇûTÂAððÌ”ðŠË÷se‘”S“¸ÃžðhÛìQ‚OIïó—Ó¿Ÿ?ßd endstream endobj 1857 0 obj 6789 endobj 1861 0 obj [36 /XYZ 37.5000000 100.250000 0] endobj 1862 0 obj [36 /XYZ 37.5000000 100.250000 0] endobj 1863 0 obj << /Type /Annot /Subtype /Link /Rect [127.500000 421.250000 448.500000 435.500000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.pcre.org/) >> >> endobj 1860 0 obj << /Type /Page /Parent 2 0 R /Contents 1864 0 R /Resources 1866 0 R /Annots 1867 0 R /MediaBox [0 0 595 842] >> endobj 1866 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R /F1700 1700 0 R >> /XObject << >> >> endobj 1867 0 obj [ 1863 0 R ] endobj 1864 0 obj << /Length 1865 0 R /Filter /FlateDecode >> stream xœí]MÏä¶‘¾¿¿¢Ï øµ(‘ú Œgìr`ØÀ‚v²‹À¬“CþþvK”DR|(±T¤Ôý*ƒØÊM–ž*²ŠUÅâ·ÿùÓßþ矷o?ÿô·_ô¿?ÿôV¼7ªþw{üùÆl(Ûwý|kZuûåëÛï·ßß~|ûñþÏß߆üôù÷§ÝÊÛîÿÿÛíO¾7þªÿ£Çðõ­Íýß¿õÿîq*¦?Úÿ÷í¿þíö÷GãpšûïßT²SõƒŠ•‘¿RôþùËßß¾¾?jºëDy²’7ÑÉòö¿¼ýõÞýØyñÞI!šZ6ÅŽašr§ìŠ›j£ô8úü]×m²®T3Ã!ªZ„ºæâgSu‘ˆŸFßÜ 7…uª®{ªSð3Ð5?EÛ&ãçÔ7?襔ÉDåAu~®ï?]]4­„ÏæÀå]BuWCýßË»¾©»zló?ýÍùéCCýÕ C4¥’Ý}Løl“1)Ѻ¨:îsçÑ} =Öo]Bvãa »ÌhH†ŽÃ‹¯fÃ:J ¶îâš0¾½z e5Ì£Š²]4ÌdT¸ì®v2±¼•¢uè­xÜþ «ÔÉ`2‡ŸF{<ðÃâpáëЋKOÆ‚¡{𹯾fï_†yÕJЮ&º:›Ð]xU…–#³[—~`OÃ’ª` 4‡¦áú'~0üصÚסéÉ@lÜ”jk~2—<µh°q¼¡Ú@b¤Ä„À·Ù ŒÐØ<©ñÀŒÐ8,ø:4ÄBÓ“±à&×Ê,º™<³½œX¹X"»™ WûõX¥z*5wnƒÛµBéR£eR1 ÚëµÄXÒZ-%“Œ™Ù\K·‰–Ù^ºZ­œ—N‹ _W Ê­.³wžž OècvËÓ„,~M£Ú.1B_lU·”IƂŻ×s¯¾¡ï¶–ŽlÕªp)©9ª @FJL$úñ= ŽªÙ-J~Llž8ÃYº/BC¾Z ë@™d,x»kG©„WßPNæÒøäEÈùñN„”°e¨ïÝB ·tñI”!›CŸ/ÍmCÅeÑ5qšË*¨ê/«½Õêø4j:W¼]í·¡TéУJ¿€Ûµ£8]&-“ŠiÐÞ˜JŒÕÈ!mCÅ¢d’13›ËB0ѲÚGÁêåäëŠÁ†ê…ËìÝ„§'ÃÓ0Ú0»åi B¿¦Qk*1B_lj(“Œ‹wÛ &^CCãèÙ¡A.%5'BµÈH‰‰D?¾§Á±av‹’›'Îp–Q• !‡!¶ µ”IÆ‚·»-¯¡¡5ëøäEÈù1Ÿ ÕËPß»…„Anwl˜ÝåGÈæÀã§ÃK³GÛP±@YtMœæ² ”á&³Úå¨Vǧ™PÃæïj¿ Uw=µí1™ˆÁíÚŠéR£eR1 ÚS‰±9¤m¨X””5ë™Íe!(+øc´KGÁêåäëŠÁ†ê…ËìÝ„§'ÃÓ0Ú0»åi B¿¦Qk*1B_lj(h»k0¬PP­»µ4´œT³EI͉Pm2RR[[ðÂÛàØ0»EɉÍg8˨J…ÃÛ†ZÊ$cÁÛÝ‚‰×Ð GÍ:>yr~ÌgCõ2Ô÷n!aÛf·Dù²9$ðøéðÒìÑ6T,PÊ Ðî%S™7ÅŒ—Õ.Fµ:>MÍ?ù tµß†jk‡žÖö˜LÄàvmÅ´Ë<'~´L*¦A©±9¤m¨X”L2ffsY&ZV»p¬nP.A¾®l¨^¸ÌÞ[kC®¼ £ ³[ž¶ dñkµJÃÛ†ZÊ$cÁâÝö‚‰×Ð =;4¨Â¥¤æD¨6)i­-xámpl˜Ý¢äÇÄæ‰3œÙ !‡!¶ µ”IÆ‚·»-¯¡AŒšu|ò"äü˜Ï†êe¨ï½µÝ%~ȬvdžÙ-Q~„l <~:¼4{´  ”E×Äi.« m€UÐŽju|š mf‚ü]í¶¡*7¶iÅöÁŠ©ªcy6¸Ý1jvK”!›CŸ/ÍmCÅeÑ5qšË*¨üÑ©ªcyÓÓDÐü“ß@Wûm(åÄòî ~+·k+F1Æò ZÊŽåÍ£§Æjä¶¡bQ2ɘ™Íe!˜hYíN,olP.A¾®l(åÄò,xz2< £ ³[ž¶ ¤œXž1~j„¾Ø6Ô:P& ï¶L¼†'–§TáRRs"T€Œ”('"åkpl˜Ý¢äÇDùcyËñ“!ä0Ķ¡Ö2ÉXðv·…`â54Œ±¼éÉ‹óc>J±< ƒ ÜîØ0»%ÊòÇò–ã§ÃK³GÛP±@YtMœæ² ˆN©1–7=Í„úãSVû^ª-ýdµ•C̲Á>"gý=5hmå´·©C62J›Rë()'ˆ7p™Ë4P D¥œ ÞØ \‚|]1O¦T™ƒ´ÕH†ñäc¤-@µ•oÔÁšJ ”ÃÛ†ò¥üÑ»ý5n¤J9Ñ;Ý  —’š“Ùð0e¨¤­Æñ'ÿÑ86òCÓºÁBDF2 ¾ØÆ“(åÛížA÷»A)5†í¦'/&ÎùÌ%SxúAÚÊ!cÙà?Ç&J~ Z7JˆÈH›æ’¶šÖRN¼n¿ Yª]ººÞ á8 3¡ÒQúí2Ÿ=Þ@êŒúFçÒ~Ñ`üò7§§thIïh½¥ÄŽŽÃŒÁ$Ú€K+}œäÒô­tU<ØØíj¢«³ Ým ™dô.§ç'‹iÎÓ!$ýà V;&~XÖšVø·[Å·rÒí 6cµ«b"¨fÁd6Lqyô.§ç'‹Oþsb"ƒãXv&~ì-CÇ M+ŒÛ­¿{Lô“£“ñÇ|Ž)'Þ¥;ð¢Áâš¿+N„dpËäaDÈæÄ`Ól€¦•>62iiYWKå ­i7Ì„ [k ;mY:³{ƒxÜ>XÃC2˜J;b6Ë‹ÃmÌÄâRC™÷€Ýà5mœv5ÑÕÙ„î5m92»-H¯A›ûE'MéÇŒùÁðcoÛ4ëÐ"ÀƽÚ|@H?y-»]A5 BµÄHIéu| ¶…±_j0Jl90#~ÐmÓfšBø·Wé'ÛÐql„Ƴ:ƒ¸ôÝ–þÀM Ý64ö Méy-æ„Æf¶pb¡)„›\мô‡md9ƺ¦§™PàÆjßkö(¬K*'hãi°ÃLÖßSƒ¦*Ï ½5”²‘QÚZG©tb]—¹T|éá ƒXšvŒu9ùºb0‚”?Ö5ÀÓ“a<9A&6AÚ”ª|£ÆQb öØ–‘¨ÒëÚ/QƒÒw:C·–úc]%5'&³q¡œX×€D?¾ñä2±ÉU†³,¦T@9|±í$P¥?Öµ_x¥ï„p´¬ôZ؉uÙ”Ø?æ3”ëÒHd,üA&6Qò¥ªÀp–ý” 6Í%m5­U:±®ý2d©v7z£œX—Û0êDs¤§vS´¤”sa×½Á;| }°MgHp“5ü4Zo"±Ãâpa°…bq‘SáP‹¡\ _¹åy9íj¢«³ Ýk)å\ØeáòØ× m‘ý¢‚ÆæÐ4Ü`±ƒáÇÞ²~Ö¡‘neP6ôûåQþÈ—Ý®Š‰ š¡Ú@BSbAðÑ×`[û¥ÆÃá‚3ŽeñáݲwÖ¡‘nõO6qtøÞQNÌm°Ìfö âòèÖ†`8ÐnÛû…džÆá‰€³Bc³`°pb¡‘SÙO6©±ô¶?—FÕ£½3=Í„ši,Þ®v›=58ô^»…< æé÷Òþ{bÐbÜA{k(1d#£[h%kà™ËL*ÞÂÇl¯ëglP.A¾®öA58ú^OµÌ'Ó̯ >AÚ”æ—;ê`%Êaeù€²^ðv¯ú·êjÇÒ ªp)©91©gœ£ïõtúß|²O¹{'vhFžø‡³,¦T@9|±ì$PÖÀ ¦îUÿB}C=ZFÓ“çÇlRížr¯ÝÓÿžûx;»(y9äβŸ’Á¦¹4XMë@Ù”L,¶Iè¤M-›â&îÌá~+Fµ|ï¡ÿcýý›Jvª¾ýòõ­)o]s»¯¾Å­”Íí¹òã£7¢†oZØÛ÷ðÍ—øqª ½‘ŸâÇ)ñoà8$t¾ƒ½u6 {ƒx ùƒq«0ð î-0ÄS¨ø7ÞÜÆœ Ì…2ž¶RP —~˜¹™§ßÿ|Wûo´rËû_š~L=_MKS«žœ§þö½í ûžÕ»’uÛXo†/k]x们eƒP¢î5<›º¯!pàE'…Ýë‰$ÄH$‚B¢7˜$ î—‚S@`¶Öèê½*[a)_ðÍ°Š‰jìn Õ +¢XdÚ•Þf}Àd«ŠÚ™ùç·Ù®ƒUSÙp„WƯq[¬Pþd­Âb±$“²¦hýÚnù.6!†ªë¾ ³Y†Q è… ®*Ì+þ V|Xãb (k.E)o×´b!IO‡« û±º!)ˆÊ% )X3EŠÓꬦΌ?~owØ› ÷¾ —ƦŽrÿ§8a‘)ˆU>ýƒí<]ñJ-½rBµµrDù|‹£øBXÎ>Á7„Õ+×~d >2 hAYFØ…/Ó“Õ¡{QÔÎzpÒݘ —!ŠbëþƒÅÝXC°ÍGðÀêë>ñŽ ‹>öÈŒçÀrsüâ…—vŒ(Å1’\)öq:{ÐÝ'Gr„°¸4î¢î×¶téÍå†y½}Ù ­=„o@ÿb6`Öa/Ïš.Û—E¨„ÄŽp‚ý‡¿+°¯ÅöìvïÅô-¿ƒŸN‹Å ‡—ÞE’Å$aéKž‹ËšâÃÌȹp?`‘rÙ–Ò^·IÁJøÏ‚=Fq¬Q,ÏBÛVÅ{Ý{NT õ^t•-áxÛ¬W•r|µåK¡¡X"–MlªPzÄ䯓î“Û ÅŽ…w»€¢òYbĤØw®x/ÖÖî§VÖ`ĸŸ=„² v©Ì±ö€,䪱S£Yç'Eä“b†RhÃ~"‚i)4™Ä—²•NºLVA ÒCPÎU’ÀЇOªø- ¦: ˆ0Õ Ge&OÀËY/–õ¥éfU7N˜Ir9&WukÓaÀS|×¼8Š#ŽwbÔ2%eï s ·/ñÈ«¬òé:iÙuöÔãÒ²Œ‹Â—@‚URCŠMaÚÕ +ÖŽíts»à9X™Í{¨)‰¸` 2dÏJmô‡Å(î7RâÛk6»Õˆ”BlÉP›¬y‡%Þ'NðßgXê›a¾w•m<Ÿùð"SÁ ü¥¸·KÛåÓv¸°ÅU&#Ô[ táM Œ –,x ÉTZƒÌ9Ù©0‡χãiò–í8"Ž‚ã½7ý¬ÂÇ‹<ý cÂã=¿N*Ö\«²Ùl˲#1JÞ "ËNûø`ïK9Âd)íe7à#œy§œ­Ç'õÓ»‡d'-”^ïuÊ’²Æ³œdf]´^™´u®xuÉ Óà)®>Ò²æú¡”Û8µCáÖß”Fx’pT°{êô¶(Û‚T>0×Ô>Jòã¶¥ÌX/;G3=µç´l²d¢°nT2—ʸ·ãÝÆrf‰âã(»€‘}ÊÂWŠÈ¦å;E±Ô”ÇêŠÎÖ€¼É.¯’ÓÀê:~ùJ0®oˆJ³f zxe ÔSÌ”“ÚùŸ)WñÌJ>Ï•CqŸN‘ïÃ=®ËC7 ðãÓw²Ý¬s·O2JõaR€•7ô‘)Ï+W1SÒ½Uy‹40íH–«üÂpçM˜#lxCV¥„¡wÜ­•ÞwÖ©Uår-ñ*§·­%y®Ž¼ÿ¢+$ØØ$á„p<,õ'°ë.î9Þ¾¤’Ê ³:åøâé-¼n¨~ïÇì—¼j*›PŽá¨e}Á/èÍT>gù›Ï+6¯/¡ «“ïV(HˆWÝJ/^ÝññßÀx§~/û Î&ôE—\ŠJÑ °8¨À SEq¤èÞäøñóBPÂo¯¡A¾è$Ÿ¹RÇK+æK…½0PÂ’¥I§b'>iÔ{[«¦Y‚#©8S¾ÉVi`íœJ_Õ6„$Ã=C×Ðý{ª=T ²§îéœ?Mgø.q!8»™'}9l4ž›ˆß­‘!ç¢qfð‰Ý¶O•âÎW`;´x‰ÆY½$.IH‘\½U:ñçUÅæÏPC ˜5ZÂÞ$›ÇfÕ‘Åèz~ÒRGÇ „Ok€&é ùÓtâaT\„rÍàe€<™bHÿe€<¡2óï% C<ñðù>O Ò4î þ Ôcé ƒQóÌŸ†‹w>SO“ÛwêS¡®(××RBxœ\ÉÛÍ‹€Ë…ÀuRL(må¯Ì©!)SvKwÉepP‚À³”âN™Ë/º!Èk–Içc^Ãn™Ì²éó^ÊêÔfY#íbœY†?›p¼ú Å*†Ñ˜x ÄcÇ×ö¹ Ý#îß”R83è² ·M¦äê—7tYKIÇ|(+8A†òZ¢î4ÎeªEóZ¯$™­×óA2X¼ªË[oñ^±ØX}­-Þ™‰—Å{Y¼¯gñòºÄRÚÏC^±¨~8_Ûe%{»¬ä ¼Íj%Ï“õÛ„£•lØ}ã ­d%ìig!žÿbÂôù‚3„Ï›/¸I ^-ŸCÉ)OýÚ\Z«ª’ÒaÈåÝ"מ‹gÃp‚"pœ˜òƒO þuM0x·Q¤B1kÉö{#x àè³7QH·¿GW¹K¨O[ÑÙú4Iý&Ï¥HRÄq’£…5-í9où[ÎØßÏ¢*›:¯R¾’)Ù Û³Z Q|¾ÜIÃIp¼ã‰0N^/ÝÖ‡w\j/]7å;Q{Š®Ìžðã£+g E ó¾)Äê ÌGA˜÷p­ƒå§L†¢Ô•Ls$³št—Úf­Q¬(ì©ÄŒÃÄnOê;öˆÊžö'˜@¸¤ÕvÑ å‹\JJF‡`¼@x¥À«r®Œ6Þ<&B²2ox%àؾ£dŽr¸ÝWŸ 7°þŽHb§ä’³|×ôŸR–éÀgDh›\Óˆâø'p#ëöͰ+¯½ÊÚÆîL`•gKo줴çk\Våã0K$z#aâ…ÁxÓI)?^bª»ÔÖç¸é¬®c¯›lfŒÀ›Á‡Ì(!”_7Åꤜ좤áüä~`úPMÓ9Óž?{dèäÊÙ8ãê8WG‰8VTН! L[¤¬õgŸ!¤òl’Ž÷#o>¡¡$ET˜ƒ”tÊ‚NààŽä¡„¶®†]8,±×;3•Z $˜Áq"<ãåÛM:ÌÈà@„³˜`q¢™2ÓIA£ˆó–¹²Ö%W1%Ù„yst¦V\ú?\îwäÍ¥uçTÊay…ËÏQ<#Ø;ÄšîSAŽüÇyNÏÄ`Õ£…NŶÚlqSÏîDÊç½ÒeÞ“3ZtÛc÷q׬ÂsNOœç„Ožޜ۱Ü^w:½]ŽåãË9xÇÿ4þ䯙}—?ùò'_þähÑ<ÌŸœé˜åvŸG\¾á “$©oX8Úòò ÏŸ~ù†/ßðͳµk‹fÓË7üR¾á™åÈ7übn© )æ)üÒóû“»óœZÝ}&OóQ`åð4we·c‰* ïðo°ÿO\­1ã–¼H®“ŽÃㆌ¿‡à¯0m”ÅXå2•äsŸéÅæU`ÿ›©lZàâ‘ bM11±¹ˆOJQ®:ؾߢ\´I:—Kðœ!§÷>GL`¿á@¥\gA‰Âàq0 ”ÀÞ5°}$9oX1ȱ ‚ÅWÊÚ^Ê«ÑÄnjå,Ši—xÍ¥T$X“?\ ™ 8P*Zs”¥ €BùtBש .\‹‘â¢,IEuy•%É)É[?r»ºæM¡_¿5‹ym9jþ>[Ù]Q´¥³CÁq+JíÌ"‚š!ݤ´6ƒ2lÿê ¦ o‡…IM 1R >Nsï] Û9° øuß­ÈŸïM{Ão>¯hg¼{OZ´r€"™Êu^çäW®‚Ÿ—–?–OQ)é²´§c.U„ïei4x@™mw aÇ^LÉ ¯é Jêâáw­Äì’YºæìÖìZ6MK±}Z¶ª>tZN+Îðibùi Š÷Ò·;Émg6üööS*lZ×Ô ɨ¼3lÁ’¬ÂÆK<é®<³*ˆÎSš¢C3áÕL‰vëT´gÞ#Ñà®Õ³ÌÅq7ÙŒqlRè Î_,»X ¤ÚÛƒö;ém1ÂV•…Ùð@ [Ui̱ 6ž„x%ÄÇœ±Ér}X¦|óVCZŸ‚¬aÀ>…« @ঋNŠäGòdS:Ÿ˜áRí ùTç\"î­£lR#Šu³nÂxËl«Yæ8©‚¹„o–~D˜•eË{—T¦c}¼÷vüã9R£ÛÂYâ®äZ¤^oÛRy—ø¨“_$fÓ´$fÏpvF$Ú&·žm;á y”3=`òÌ¥TÄÃë_‚W# +YMfJ€ºÂÙ„”C.¼ÇÊ)öë±òÌZ3Cè¹ëÖ? ‹x®t«\}„ÍqQ$%Ë2¢¶j §RsÛ®òû••øèG#íi€­3}'ån¸«lbrܺ’±[Á‘lÇð=HŹÀ)Û­àèó*)Á‘͹ÀQj38é%ÇãIì•Ä€võV@ErGa-îfÎ;&9C9¸üZ©mÞœólw=Ÿö–ÂשïCaeZo:sŠó«»xy."e¹É‘’¢E‰yÒ÷°éÝê÷œûZÊ9IÞ›!)âDI´ÁðzÖ±s”5A)Ûü¿<-'²¦XgŽÞI‰Å$eÂÄTѸXüC'î7ÃîÜТ¹$ð*°OœÎ—nt°C¼SŽ(éï×:Í› ˜¸ªÖ}jlÅ:½]Ü—¦­`ŸH±Ö¸Ï|¢;þ®š\´¼YÞ‰Iì(J¾Âi¶f‰Ëué@³t»’z¬^r‘—Rm†:ù/k¹êk‰gYâãœV¼'LéktúØ¡!‚IÿÓD$™R I7 œ0ÄÇ[)ÏKŠåÂ{xãpG*Åú Õ’yªøþôˆ =!ÌI:ÉŒ +›åR”§»Ô#¸¯‹­ÆYzg‡(šÎk¥-ïU9ûÄç3±…ò<Û™qç­ Cš)”<ç3Çÿr‡Nž3K‚p¬aYA‡²b‘YŽë…r• 'moÓÞóAœQµ¨íóH/x]¹«÷+9£ê¦Ø uzgT=”Ú5åÒFŠ!Ì{hõðsÑëãu%µŠâ-fpT‰WQ³Û{Ò$¡¸'d!l¯Ù–hãZl^ÈÓ÷1¶®äSŠæ²ˆ¥4Êâ»x·²”{•%ZyöŒj(u¹(áØ@ðÞOl’\ŸR¯vζÚP,°ÛfÉ%çÍ ì £oMÏ59“îÖªÒ–€'õ,±XÓÇ(ç ›´¹ØÅkb£$vö©¼õɶå(×9ñîSI6 oZ%«8àωÈBeö°Ô׬ÁP(»kÞ¼‹.}ΩÖxs½Ö»(·ÎEÜsCa sP*Ó|áõë“®#Œi°T°È„,É|e1x(F))­8sºá°¯ h¶ èñ7 .õ6%VÄq´†tÃ̳ÇwÖQ`Ù¥¸îü«•À%0¢è7ï`„etYÕØS¦bJ¾LóÏèæ§ïM {û¾ù?޾ {.™¾§€½áßhï…¯7üFÅ)ů[@ª¤­‚oDS]47øS€q£ £“ò™z«0 ÕXz+6m<ÁÐôÅ„»Ò94Àµ<@€õ­RQÓ ‹…jLA`Qcs£†˜RSdñBŸ×ß‘.ŠVئ”,=P…Þ@…„p‰ÂK{à{°âkr™ÎªÉ&­(GÃd&†P7)°w¢TaÊtœ†ùÚ4–£1”­&kjÏþû(^ƒ³žk}=sVròWd^u™‹Sæ÷ðú¦Ö¯*>K–]òÃ21(±æUð*FRu<£¯Ä]¦å'úpAÒ[þ:G'Aˈtà€%».WmV޳1ÖofÁz‹ýG$““ljíHÞhÍš&̰5kÊuù¢˜Ï™eG9¸ÇKÁñE²ÜKÃbßd¨—ƒ JgzP̰EÀ†X‹ÈçŠ@}ûÅ ˜Ëeøø¸:ËæŒÂ|t™â³a=òX]ö\ÏÀ²Ê°fÅ„õs˜ÎÚ ¬Î¶˜´RJÜ"ï‹r¸‘wfóî`òo»ºÜ¬ÎD¯0Ëá@oî݆÷>Ý ×fWøX‘¾ð@çP—Ú‘k^qœ¡x Î{ðm‹ J9¦”ëÂÐ@²>ÇÚe%Š6ͯÿî‚`Ïà@]Ö@õ‹œaå TÔ*kÝ ÕÏy‰-ioÍçä=˜%jßt½((œ‰ó«Tò¨}[¶›­íÛâÀæÎ4Ò‘M<Ó ‹i[5z_NVG|˜,êWKÏ+p–.æNöË!}z“tÿßêwcJøâlxïqN5¦ ¯²”79rªñW…ͪ@q •-eáu¢ìþ"ü®Ç7)aÆgªupÆ)æ)ÏЗÒYü2ų#B†”[$-ª|© JF1ó_êÔ>T±óór|ŒƒšEÕ£2ËukaÕañd.¡¤Yd”åõóð2Î`Î[zÊZHõtÒV*:,ù‰Ù’渶&[‘ï“ZsÁ33µ­ÈžÀÃ2BQW6w3)5ãvÁÔ©×륺Ŵ᭩„ÓÀ2ÝŽN±JHjöðŠÁ$  {Þ@HT€7‚yÆÕ&¢r}ŠÒF‡8@ºa_>+ˆçܱYa.Сw0æxA`Mûb%ÂI›¸Æ撚õVzÞ4]Þd\”òÞÕÔ–ðë„zª|`íè}ŽÛµNâzÙ8û¦\å¾R¦'žŸ–ÜçBI-Öñ^¦Ýs]ZÖq".N!åŸx›ú\AWŽK I¾_Ê¡ˆÓW†˜.G™8Á®ÏW)+˜¨Êx8[DàÀ!·'ã³¥Y6˜¯jãªQz;sÑ?üƒ¹Mð(Srª œßÆÁQuœ FÉ6ÄÒ‹) p;`aÎa=–Â,ÁшÕxþ@Dy×€\cÜ(ëEvð,ÁܦH"¦ ›ù„6 1(«?ïÑë›ÌQiV›rºëòÃ$Pã/ Mλ—K ÆÆaœ@¹k\ºftñÇéÂqœ;s¹k‚  ιÕì¨e÷ËE® ›Òâ76³¯–ØŒ š”u‡b•pM, ÊõÃaE½×í:ð×›ëÍõæz“ùÍ Ô;«qŠ/ÃÀ$ÞV`£÷F௿¸u÷^u’É„ 8Öð¸ß.)n œ4Œƒ…Û–Ø-LpÓœ²§9åKsùj²¹3v(¸¤ŠÔì$2JÚ3QœÌ„ð@ 7Â!v,½þJð„rø?“ôf;ÊùC‘ƒ3‡?ñÌjó)þRe¶¢‘. ">ŠmIˆZ‘"j”Þ°“™21°»‰pbŠñ$(ñ@5¬Þñ]¡ØÑŽ%‘²àçK¿©¤ɹbm/kSXø0np¢ãÞ°+ˆµ„ÓS€e'à2€¿ÁP®½Å¿yµ q)WØ2G ûm<ëK¼òac’0ú7£$˜Pv`'‹M‚À¾Ë¡øY@Ëà7„’m”Ý!sd•Nu³¨-“ˆå³)\l[’v™2Xñâ€ñ”ôçpÒaœÀ÷¼¦›29&­,>^áÕk/úRÞeCaÜX—WË(<Á~áÃØ°¼ƒÝ“ àv¤DxíѼ_šE–>ûzs½¹Þ\oNó†Y²f—:Lô¥ÉËÑÈfŒMkMïu#ìJÛÙSŠ)1ßæ‰Ïîó^ÃQ[»¬Ý%%¤ªq¼w¸h#U "ÔÔã¹À{q•4î•Re陪3“D/­˜vCPµµ³ žßA–R'¨Ê†#Ãýôª±‡$Uß^[ˆTÏØ¡”ÞÁë5Ë*†gÔ±•«U-7Ï5ÂÅîVJšèÚœNy3K%Á'”ÓpÄ]†K¹b!âÂh($ŒbQôå²t<ÓðJµµ´Õ e ?=í]«¤Û76¥diDYjú&)ï¶lJGOo/H{²³¹&y®‚´¼“œRÞ–² á½ô”´wÏ´“% ¦à†¹@¡/±‚€ÄS¬Ð£TT®"ÂÀ\£”Åò§-%ÜÎ|ù·#Šªv7¼”"¤ô½Xzÿn§ŸC¯l¡…Jl—Âæ@à–èóï„qºGÊRÞ퓆o¿o”tË!|AÚ¶ëÔkÉä˜Ïe>“.¤ÜÝ”+²PÇØ^£ÜuDY+±’ÉwÆUm)Myⵌ7ïxÇ=¾8y.¹­Pã‘Ç[ÎÂV«f]ØÎ®ñ1”ÏüÔ&‚J ̇™Š(×§âù°\hH*®—€‡6‡qÉìóÉë/L»¬?¤þ Öõ”Ûž®±áˆ¸:™×·É|c Ç,$×ö¡1q¸Ô á°9Ê2Ãqç}DvÏ|T‚õÎ)ÒµÀ>eºO—ãX,Z”èû3]Mȳ&ž8Ñ“ùönÂd\.L–Fpƒeu#Íž…\,ÖuB„•¢ésXð^çÁ5ll”(÷Ãâõ âÂí\QkÂe÷KYÙ¾¨$kJÖ#eQÞ>;´žA[xáh/‰ªEO‹†`‡Âßh|ÔoÄð7gt»4µòº«q,ZÈ÷Rx l4ù4:þMh+á›À—Âßè ëûÒïào|ƒ—T<¤Z—À©G¨ß@ncÜV-®8žÒù“rÆùsó” @ø… ö\þÃnü2–c]1ÎA¾ƒrΆtA3kV)Wì2­÷¥8E$¯rx;xä½óæ!q$áÇþäõ`ìpÆ%øXJZÖ²4SjŸº¶ÕÏ r)"AÙÒaåáL%ä<ŠôÔ¸ËÓG\ì)g&xOðžVŒqfQfÚs®X"ŸRi‘r% KÈ™ $„"ñεC×èpÐÖP”…ma>ófÀ²\¥lwX²XÊd;~×¹Ø]ælªýNHJ‚rÚJ2$]ÅšZ–Ø„ åLãÏÀn Jo„Ã)¤©@??–ÜãØÎY,¹v³k8¥<€-ìoΕ¥I1Ô(U“–SvO6^«|»—:ƺÁ  ÷˜¼¾¬\F¦’ÍÈêH msrmA¬;Ê’¬Æ2ØË8e'Ipñ‚O:#FôÃ÷¥§Ù7$T´ª“Žu±žýD±í¯Â›·¶áÞ2¹Õ>kШҖ¨}Ö 3Á^ä¬!TØ‚°#Õ=ažðÂü€4x»=¢O:Ó•âÐU⺅ru¥è4<øzÑoÊ‚+¢(·.7¯…OÙ„ò:2ÓÚñË.æ„ÎS©…LaSJêræ“mLFh•|ÑÐƪ\ý²ã£ˆÌ±Bü†õˆ©>wtɲ”zE)[Fb ªEæ(K•ËbÄìŽYÜq¥"X¬Þ‹®²W8ÛB]¢_m àÕü9W‚U*ç7sðà¯<¾´)sº:eÛ­ €‚YIPbC[RææäÖUçØO¥^Ç-YOžËïg|în¿ßâôãÚ°ÈÖ{WÈý[ ñ`ù­ eðÈšVç[KÏY£A=zN!U_ôo´È*H¬È¶gœjÍÁá£íý¥HêñÎPºSŸý«—¨EgŠaíù {ƒ¿ÑË”ˆútãvgªÀ=ž‹éêæRŽ…3º¬‘b„Jx61À½ï‘Hh«àtƒ½8îŠ'I2ŽùÔÂNp÷’ð·û¥²)Úw1@l‰'œÚ¥Q&vuqþñöãÛÿKmd„ endstream endobj 1865 0 obj 12003 endobj 1869 0 obj [37 /XYZ 38.2500000 85.2500000 0] endobj 1870 0 obj [37 /XYZ 37.5000000 441.500000 0] endobj 1871 0 obj [37 /XYZ 37.5000000 441.500000 0] endobj 1872 0 obj [37 /XYZ 38.2500000 236.750000 0] endobj 1873 0 obj [37 /XYZ 38.2500000 236.750000 0] endobj 1874 0 obj [37 /XYZ 38.2500000 85.2500000 0] endobj 1875 0 obj << /Type /Annot /Subtype /Link /Rect [43.5000000 449.750000 137.250000 456.500000 ] /Border [0 0 0] /Dest /3#89#3fq#24n#f2#2d#9ek#2d#12#d9t#eerd#b5#b1q >> endobj 1876 0 obj << /Type /Annot /Subtype /Link /Rect [151.500000 92 199.500000 98.7500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_default_args >> endobj 1868 0 obj << /Type /Page /Parent 2 0 R /Contents 1877 0 R /Resources 1879 0 R /Annots 1880 0 R /MediaBox [0 0 595 842] >> endobj 1879 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 1880 0 obj [ 1875 0 R 1876 0 R ] endobj 1877 0 obj << /Length 1878 0 R /Filter /FlateDecode >> stream xœí]ɪäÈÝ¿¯Èµ¡³Áj4xa(ªÀ ã…iO˜nã²þ}+SȨ̂á„çݸR]tWõS)Ã;œ;ýøÛ¯>ýý¿§?|ý÷é§ö÷__’s‘%Í?§Ë¯^ÿÀ–çöϧ¢ÌN?ýòòýôýåËË—ú¿ß_š¾~ø}ý§ÿìéwõ¿ÿ<ýñOõÿÒþ¥Ë_øå¥0EýûÏ×ß«ÂÔJî¿_~þ—?üêô¯Ëˆ·Ïµ“éþÿ.«lq™ÅÄ—¿¿ÜVi®¿þûÓ¿^~lÖô‘”Yz2©«ÿS¥öôŸ¿¾ü­þ6xr®RcŠ<-’7|¦°×ïØ“±UrÊŠÁW®¿$Æ6âCWIkè묅·Ã¸Üø†–;Ï*O¢ç}lñM·‰É£‘ÊeÖqÎ-vž6)«Xçù[þÆ–ßt—Æâ·Í¬ãœ'Zî<ÓÄD;ÏûØò›žÖÓ5ôeÖqÎ-wž™‰&?cËoz–Ç’ŸÍ¬ãœ'Zî¸ø®;ã¢Éæë¬¥÷£=Q<¶Ø‘:›¸fkªL|ÛïcËŸ¨­¢ËuÖÂÛÑ(Zî<]<÷1¶ü¦§ÑTÜfÖQX.ú\¦5Ó©elz9Û˹feië?×ï4ÿ¼eEõ£hwö>¶üAdÑÄj3ë8w¶?ô—€!ð4šŸ(ó»çÅ÷ß^~ülÒ¤¶•óÓ·¿ÕS»~²ùí[½Ùé‡Â”evúö—Ó¯“Ä}þÍéÛ?_ªsn³Û›'ÉôÄäðI GûŸ| ÿŽsèIúŽö΀x‚¿ãàJM¾ž}³è‰­à;¾é@ëL-\g¯áhž¹Aºö|ž>S<šç;ÍÉ}úV³‘·±tÿÓärÿ«ô¾ÍM* jŽ¡<—Urßcã ø¤ÙÒôœºÆKôXPßÁߣÇû\ÿr·»œóÂt‘â†zLvN*×ÝÓwp-VmÏ}ѸB<Ѓp`Æ¿3„ϱsœÑw˜Õ€2úa€7_ »ôŒ6X—–57ø0A¨‰ 8FÈ%ÌÖ5ZÒ¨ Ã.Þb/Ç5'WƒÕƄͲ¢'íV +D0YcmûÑç‰`Â+Å£a‹±ò0 íY)5ŸB¡…BÚñ¾áPsÏîÀYïÍ>ßY¨¹5EqÛuS‚5] Êb†T>xÆ”§Lø[è±jV?¶d-k‘,¬ŸˆšŸñ0Ͷ`&Èc@18¡R¼l€%Ey+ðd xË’¼+ßÔ.h@xÝü´(-v©¶K…S3 p“Ã_=‡V™XgM¤Qz)³ùó}铨Kä/kºLOËÌSÒŠ‰)%ew >ÒÊäË)Î Ãö¹Ç¦güÎÔ búÏgWE!&é›ò+¸õ‰xn=&gb"¥HCRñ£šL™®‹àLe"8†¬ÖÉElQªFЗ©´N„M0´ÏhSs‹IYÞ=Æm%Ó82 ©²eÑ1¾,(d<3€£yòÚ§÷w= B¶ÿÅ4?lÅ›ó)rZâN •¨£á™,>¸Sf|>¢—`–û¨wÕÄxvBD$qp‘¦ŒòâCY‹>&|ÙW¬Ó­Li÷W»ÝìœI϶÷„’CZ²ñÞL…ùÉ) œï.Äg+s_rm–çÛ y‡>ƒÖÚª§xbK[€Øž„‘bíÂÃà<ƒøùg.é«èËGÊ+y½ñz<êÚT˜RôAkŠÉ¹„(TŒ Ä9DÜžÒv·' á‚)"DÑ#[¹šaÏ¢…*e£m°ÍåøVUÍù)±Âõ¶#'ô‹î“Ä@)*u0ñ+.»Ÿ:˜¶è-M!5Þt?9ä.øFaˆl)7Ùriõ5•û“eÙ(‘…E!¥gìZ:ÉD¼NyfF7wuÉÃÉ ×]ƒ'Š€Ái¹…’[Q•³ÉMV§^ذ _ä½=õ¬hê¡GhbÙ7…£%Ð0꜡ɦ^èb”Þ|Ež `ˆû(ºLy—eK¹a'9ƒ*1G)[ ŸÏ Ž[´g73n—:Uº)xñaÝâ¾qL8ÉüBi²Â{Ãm3ÚHÙ:C<™ñº‹ôQÏ0ÅSíó0Gë Oį2à ÏŠ$†¢Q?ÊÙçk;Le`Áˆnoül8E¬¹Á²ÁÔ‹×ã…ðãÕ‚OmOA¼\«’^LÑö‹8Þž)ÐöO £,Íåá*¥¢7qëk(«¥aHPÜλ; TÜ]‹-Wa)šL‹‡\80C¡ÀÀ†‰“rH®£å‚I!š3¿¯D…½•Õëþ³3D…~D¶€»YÕ®‰Ÿ(¤¿4µCh‘B+2öð3‘‚u;Hp5Iaz$L4mðÔÌÖ Š‹ ئew§(Þ‡©I4éM¸ΈÑ­³ÔÝw€ÖhíÁZ{Akâ6-V öÛDg¥7Á€3À‘ñêÅ7 w—ÆÕ*c´[ð|˜ÝÁ;-|ò<Î¥¬*»_ë8߉°Ö0O_¿¼»GUßz–¬Jb›®)£’EM)—‹HP¶l €„é€êûZáÏ+ÄU—rK —CØš—+í1æ5Ö¾Y_ûŠý—æÔòr¯&ß˳³²²#íJ&` E‹<ÍÁE/%5Ú6;¢l¬rO•V=ËçðȽMÄk•ÇÎg *ËYã$¦Kpò€ØUÓ׊¾ Ð,%Se.€Hó-mQ6Rp>Ý{ˆ‹@ &eKt 07=€,,7‘ñå2, pë¨-Ýí‰ (z‘kÅð6‹Ã‹ìÍãeÁˆ1ÞŒ ýÆÞ6쳑õ<¨¹o=ÏS#+ƒ3H¡,…§má“ ûÔà^gð´Z\…­ù}ÿ¤†µ¸­MÔ,ÊCÂ4(šJáN¸pSõ@ÄI³hß>_èdÓúáAbP(b:2û7N¹tGÜöö8ë°×™ñ°]jG;ê'óî'WX£H¤…yoÜT9#‰ øå“¤‡œG)Àˆ žD™®ŠÄ ¢äéOÈ}›B ÑLcQYrÞW+‚7V­_T_€èYÓ=╨b|r¢Ð»g;$TqÊߢÄDv²ù˜ëSá+Ad’inaÅ;ˆ*‡ÆÍT,”í¹…EŠÂ¼„Ï„l8ˆËˆÅ^®¾L€~?Á¢ oÐ>¢¶XJMÏ„dJÌĈ¨»®úõ²LgYÍOfí‡ Æ+Ó;¾à ’¯.´xGE í®9)3<©zÃ/û]œ¯jDMiùú?¿|tÒmñ㨙Ãñ\w¢CœG~ýhp‘@D¼.lw3Yмý3MŽ=òûåÅVIŸ1«Ã£/SèPj@`qdFËà 0³…ûf”Bqʇë<ƒ¦­JC…%U6F× €j±¶ŠSô úⱑ$œ×;Ç΂˜±g".P­Ê"˜*¶2Kæs­†EÂé„ÌC¥k3Mü<ú"íÊÏE•ˆBZ²½Ð*»š ¥ŒÜŽï•î t sMœêHÄ`„* âµ4ñ˜Ò¸Ì»D£$$©Òó;7 C¨² û0ÖÔU²È%Ç™ÆÉ+oX©a®­%ËÈeF¢ ܦ`,¦†ÉN=¢ Ìóž ”ui•‡ö¸3ëF¬Úd<„u÷þ.; ײ›¬ZÂäzà“£ö@4ÆE8†ÛhµœèŠ÷M4ÓbÍ·Ä3kLo¢IÅËß…Él-ñ‘ÝêìM|Ѿk`ƒÏS‘è™êç8[¤Ó—éˆÂ=¢p¹v²Õx;Ù å9w£¼6˜Ê$çÆŸ7˜v¶ »HÐ;¶‚ïTð;Ínw.z]D[:­=ÃüìL³¹'ÎàÑ‹¼rchØÈÜZeä;î#\Ï{ô¶×îØ àwZc;è;-{wï>9ÏhÍ})În€“Á¹áó¹õ™ÍoèÁ Á{€÷Z§Ï¬sÅ-k²åcÑñíMÊÎI7šû2† ¶1ÒáX"Þ—B„ÐXü$ªLc ד1a˲Í!0¸ÇT"f@c¦ ûRqŒL[ Çëy0ºÙÍíÔ?¹¹›êèúÌ?‘©šMÜä£ÏZCÂ}ÖÔjp»ÔÞËC2åú yè1ß™J2ØD†3ÀÀ‹§Ô.^ŸàÚ<Ô©…ÑyÑBq«Þ r1¬”(ž)sHÝ\”ÏÚË…pøÓÜ OÊÕ”ð[i9CËßR똀Ua@Td×⦖'è†Q­ƒ€ˆû ¯^sh‚HgaYõU-´P).Y8=o˦}LRš® ybÌ€Yºl«I+ Ä"—Ød‚"w—MJT"`.Qé¡^&B™Hô\i&gó€cVÙö^E÷(ת¾mäæL”ü@—SâÏOÜS0$X´ó«°/ó¨ùI'‘KÕ¬º éüe(ÑÙŒÊÍ˃ʃo… lŠƒopøŽÕÂßÁ 95È@UÍWµIx•%õ¯Ó÷ZhxeÊ—©¿0C蔣ŽrãΉ¹€'›v%êÁ5'UŒ|#QíÙ^eðP¢æÃ'­æjÏy€´^Ôè;nŠŽÍís»RÔø ÓWÚg^ʇ l {løbâ,ÃàÑà;-÷2AKUœ%¸ËŸëßÎ4&|Ð-¾> endobj 1885 0 obj << /Type /Annot /Subtype /Link /Rect [217.500000 97.2500000 303 104 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_target_language_callbacks >> endobj 1881 0 obj << /Type /Page /Parent 2 0 R /Contents 1886 0 R /Resources 1888 0 R /Annots 1889 0 R /MediaBox [0 0 595 842] >> endobj 1888 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1409 1409 0 R /F8 8 0 R >> /XObject << >> >> endobj 1889 0 obj [ 1884 0 R 1885 0 R ] endobj 1886 0 obj << /Length 1887 0 R /Filter /FlateDecode >> stream xœí]K¯ÛÆÞëWh] 2çÅ!¢@ü*ÐEúº(’¦Eu³è߯$Rº"©oÈùtfHêÒFâk53gÎûñæÏŸÿ±ÿ×ïû7ï>ÿgÿcûç»Ï»âà]ÑüÚŸ~wû®íÏ{_¹ý_wßößvŸvŸŽÿÿ¶k¾ðùÝ_?ýo¯÷9þ÷Ëþ‡¿?ü©ýG§ðuç•?þùëùÏÚ«ãOÅõÏÓçÿÞýíûßN3^–k7Óýûw¦¬êê´‹‘•¿í.§Tçß¿ÿøÛîMsþ¨E¼ñu¹WÖØ½ª­Þÿ÷Ÿ»ŸÓ_&/µUÊ—Ö,ãõqÊ'Ðu±w~°Êù·ÄÜJ~êÊ'›ú´kap(SªÐÔ‡Êe¼vöt·§{uU¥?{ÓþzäDµ©[`ÿ“×ËäÒS[¥«T—|Þµ4<Ú[Æs‹=[«6 ñòp™\|jã“M}Þµ4<š+ ÌôåZ«M ®ã<Ò{™\|jç\ª©Ï»–†G{Íxî´×\>Ý5¿L.>µOGûÏ»NtÍxn9íkÝ€Fµ<Ü/“‹Ãý4’ [N»–†G{¥xî¤/×Þ$­n&ŸZ—é0È›T¢U`n±—ë^D7T¼N:ùÇ9JÛjv- öJñ܇ªlÁŸ¹•«ã²euT­­ªö×u?EÌ€Ïß| ß_|ûe÷æã‘–û/?r^¯ùãË×=þå¨>*µÿòÓþE¡«?í¿ü²³‡£@íÚÝ5#ª8T‡ª.JínF GL3òòEÓîœGÜÁèJuGðwÞÁ‹±ð;p6|Í{ÀІëöÏCíÏöþ<¢Ôeº)Å·w@Ÿã<~A¹ w ëx aÖa^–Âų°V‚5…Upטãu¨÷ñ0°Íyêƒ/Ýd¼Æ4cÞõ÷=úŠj„¹¬ü2bàwà%ã-YC<Üÿá…0¬dôâòÜò¨–Må¹ÈÏ"ò$ ï@ìC”‚8Jí)üR¶@(æÝÃJ{ÙEÝÒ¶ó¶ï€ùÎH »{ß±hÄ”p6fàÈ;4¢¿‡ëÀïoáˆ'…#¹`¡càH`¶Ù1dÑ»†·­½(V;…Áü·€©S3íÆäP«º{fåEmºLˆÑ'iÔd1+ F€Ùa©j ÎZŠnFîiÅXƒÂ"4”²ÁàæPBgT7Jô ´×'  0Z30%ŠgàÌ–¦ërÂ:~ƒøÝBm2`¼H¡Y'df®±ú¾p³Ä¼$`­€ðnI–UÉÚD3YŸ^ë—¥Ÿ…aDØEXãçËéôŸ˜¡Q¹î)€¼ƒ£¯ÓæËˆÓEfJN<~Y#0ï½IÈøj_vŸnަŠCéUG¥ò†ÆÄ1£°öúrÕ>„¡ƒÁ¦Í% †4¤0ƱÀàHÀüƒM„!/±é£EË,èR«.öÞÛ1@—L#ØžŒÑ[°4¶üáu ¥,€.pÄ¡Xt±G¶þ8ºdÙ¨¾²ƒLdpó“w ê °ð(‹¶,ûÈF¢ma« @b‡­1ZâkÄHN¬Ój6Bn›6À*ÉeÝwËanAÖ†w BãGpóሺ¡òI\¶(ýRqñ\&p%Å0UÆ-&B Âb1‚৘£ÎÃpŒÊÄ®™ûÑCrùñl®Ì÷̪r”kb ?+Á? F0Ãß!J6èà½a™"Ü5Þ6VḸ3&ø˜“b¸áó`I[~ð:²!A³¯“d9ˆª*Ü(?IÑcUyåxÐ œ!@äÑ üÓ#R\Àµ*ë ™-ȃ Ç#¹¼F$ @7&‘§õŽ},8ˆ®øÎÖð¥/Cvpé3 6àc_NÙÞ`1¸A&þmNE¤b‚èð„ƒ‹YGØ«LD0A£éÉ#yn¸Ø9~^L‰p€ 2’)0q¹k¯9úgÉ—¢Éºàpã7 „áö·4`7L„Më ½†u`(½íc3!ØQ.QµòÜìdu«“†é¸.W{Ê!¶O'Tòˆhd¤Lüw£3“‰ù1Éaø^Äѱ\Gè¸C,š³Í HâÀöÙâ:G…‚ô†3_îŸ1œ^‰ HZRGõà“¦‚l4ðtjBI͉ïmˆúª±g>\i'+3B„l}µr)éùTäÒ]¢ï·Ö,[k–ê"´ë­5K‘³5Ké«Q€l­YBÔkÍ|Î[k–ó3«/ÊéÖš%xÁLb e[ŒhÉ$Yø)¾…sÚ@Í,¿L‚Á7‡Å}¦ NÆ>Ü•yõx˜tnÍnÖÐìcoæ•@LrW¤÷×ÖÎ0 )àpœ+Ž©÷H™íܲB¤ÚS÷þY,¡P¥íðÃÔ„·wU¦ò@.¾'Æ%ÛÎas3/÷•¦l¥£|—&ÉçÛhïí®“8À>mã…UEÜgÉAõÖvßU6bù5³’®Ê¨žÿLIÊUYNEÆ´!j£ï"UÒ%{7ý´õ®#‚æ¶Øš`*íºû»÷Ò¶Ø[ì%Qö¸“.¡¼deí(Rl°COs+€C½ë­ö À-¡šbU]km°WÊ·Ø ‘PêâÉmLQ”<1‡Ïƒ¯ËHx×½-*×z9â×VE<¸ƒE ‹©s£ËVA{ÅèâªÜè²U^1ºøñ‚ë¯Î1’ôJ‚±t®¸¡JñÉF묳ƒ}Šp»Ô…®uïîŸSÃHYåÙÖ]&î9ÍÄÝŠŸŠÖa 8ß`äyw0½ÜÅ ºF6®P¶h.+SHO’·OJfælï9áÄ÷x޾~ìGÇØŠ/S¤ÈM®’JD¯€«à”D  ˜h F„É£.\n~Œ|®èë'«V(“#ó¾.üT!»ÝzÊ`5]ÞWS.iz ¦p'EÙ1evbŠUá…‰ |‘¢¹ˆæ“dd“Spí&U\6ž¸8l³bʯÊR7Fe,É[kÅtú‘]¦O×ò½]âYH³H¨8“$ªkŒ7ŒmQÙE:JFÔÿcjùá=N·dòéå«©úÒÓ!œ+¯˜Ê‚ŒHŒ[¨%- ¹c»äjsÕåp)Ø>/cĸÖe¬Ü¡¨M×>Ȉq3òL[»¦Í¥ Ð\uæ#’ˆ\älV±Ù[WTL ]¶dw ]QJ†1¤ÕÌeò·žewƒeœ*¶že7ël=—„#keàó•§vJçï€æ”Ý: m¯±sÑHÔõ¾ÆrIýÔœªú©ÍH•ðòᎾf9e¤äZ?‚†dŠYF ¹æ£ä .a?ƒ¾6A5ŒƸ&EÔÒÙƒá°~•Ä,µ¹·§©½ E™%*Ë ×/LŒ½J¿7efÌ÷ÊÀqþà „mIk†Ú.Þ~•T‘-p›ùÂù>@–b]Iˆ¥Ñ½CÏÞèr6fð@HË$ŽŒ7KC6¨‹òi¥ea›ì¶šòÓuÑ'"L¯ZÑT)Jh’èÈÞÚ-î-A×dã²[Y*õKƒx6&GT¶|.ò2§ð¡|¼.‘Vi_¥”i±åQÎ"Ïfš$–—³µ"Qr³Ÿ1×Kl±µ8”^uÍ~0ð 7)j=eJ_†¦`“Ô£(‰…˜²2Që‰m*˜Þe!`Eˆ`xLÓªˆpc*È*BJÛó=W[«Ä Œ)ŒÂh½ ÕŒ 8[r)‰•p`¤µEÖ^p¦ê1ÉÙÝMÌUEä7Pœ"­Çè 7¹œr"I:"©îŒåo:Sf ~–1ø12LZË)U`º§|ÉÑó‹Ž…^gª}O}‹i…ÉŸ&6¿Û>í‹¥sÕ‡Öè¿ÏÈ‘Ë!ipJ-†À°ÆˆžŒ"vúg¨Ú“Þ„gktÔ×f".z±0NÁÂØÔv$¥µW×½mŽ m‰Áf|w?¸)‰Æ}ÄÚGàÒ®e$Ø’Ûµ²\.\÷Üú0ðõØäÄH7©õ7ד/›Ð—4­;O±œŠq°Þºó,¢;³úÉkgG9™î<$"`‚H{dn£òX’^ÔlËî6䬽¶`Þº γõiÐ¥Ls¸­ÛÐs¢‹ÏÞœjë6´bt©/Í©¶fKè6äœé®x/ná+ìÇ!›–ºeQÙE Y•#ð81•Ç–ŠçT9’£zôaA 5ð£”(NŸ-‡jº/ƒ D©AÌ\BþDÚ“ÚEVÑTá˜87©ÔFB€ØX±+.]•”3¦gü,÷¯ŒEúÒÒ,2ÀdpTS=œÉ—ÃÍüt&½¼€!ª[›SE’¦ÿöQñY…‹¼.òç—v³Eë1*$’²7QPDLo‰ª®"X”}É¢µÁ…Ãzd¹X¦|zªèÈR„˜®Lɽg¯6]E‹@ä)"S©(g&H49 SÚÀëgâ…a ‰ùÍ\& erg†ûÂ.©6)"z›,µ—]gy¥Œ²YœE›¬3Ëæéyð\µd­ÉX{™Ô~Ù’Æóçb‹Ö£LC²M¥“óSuä=†ŠéccbdLc èfK®NR€ÊnËU(" :ÝlPdÛ“öo…!+Œá…ÊggrvÒšº"ä˜G2¹Õ®,ªQ$a&ñ—Ûñ:"iزÖHBg¢uÌ’’×Vei¨²Ë%#$j“P—9{UB¦99f pªã.>^x)õxϯïöy©Îój>™ô.U-7¦û.q™òus·x`'¼aúJu›ÛUÃÛ=]ÒéŽêÙ|ݹÒÝ~ðëîs€.§!è§-t¥€ôöϲî.)„Δ°£Öy2çÖ&þ=(10Î[¼®ˆ%Q_˜²\ˆ¶™XŒe**Fdö£5²Óˆ¸ôäyM9l˜Mðb5;³.–·J7”„6ƒEqYS•-[àu晸Y‘ÐQ‰ñŸN‹^¬u=½=Rûq&îa&pJ¾CBôÚËk¦, Ö¸_/@3˜~ ˜‘ý ¶1âï\òmMßúˆG„]ä²í$6·ú+R^Dæ>`7žÅžëšÚ‹/4 ¿î5SõäÌw#OK*Æíí§GtzCÕÅÞî½ý`{»oª•ÞH¹bÙ9Õ^Û»¶…F¼ñî‚ùö*Xs—‡VQ½y-ø;5úÎÅ‹WöE!¨«Þ,ׯÎCÁª%|ö0h¿ñí ¯ƒg ìà#\§Ž‡J‹ñ÷f+àÞ>@`èã“âu œí-1[¦ H^_™ci‰y‹7˜õ#Ò†pp."˜ î[^ª,s Êð>Ý$Ü«H¶ßâü±60ž‘B ÙÌ;Âæ5|>M(e«³à+…¢ËøËmÖ˜´±Ÿî²,‘ú9í6f‹›ßAOå-™컌:ÇT™+GŠñ¾)œ!»5óeL*T¦w/7a 4™¬ãT÷»I&È4 ©®U—!­[ȸ5¿ŽØ†NÅ[µ®{kT;þÞ;>àûù4ö&<°ê~Vs(ÔÉq¶ÎÝŠ³÷Cƒ"þš«Ó}fbC}§Ž˜÷íw†æ<é×{´ŽÕ{{ûØžõÎÅnkÛ—Û°kýž½J¼ürïCáÙàwZ„VQG÷/hË"ÜéçãŽ/ wŽ/'pÑ¥1„> ôÄ7>@ŽÀ¥áIà´©ú CX°âž"Wà€Çy¬Ä@y_}QTs Ä…‡37îŸQ²ýiÿi÷lZšë endstream endobj 1887 0 obj 5051 endobj 1891 0 obj [39 /XYZ 38.2500000 381.500000 0] endobj 1892 0 obj [39 /XYZ 38.2500000 158 0] endobj 1893 0 obj [39 /XYZ 38.2500000 381.500000 0] endobj 1894 0 obj [39 /XYZ 38.2500000 158 0] endobj 1890 0 obj << /Type /Page /Parent 2 0 R /Contents 1895 0 R /Resources 1897 0 R /Annots 1898 0 R /MediaBox [0 0 595 842] >> endobj 1897 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1409 1409 0 R /F8 8 0 R >> /XObject << >> >> endobj 1898 0 obj [ ] endobj 1895 0 obj << /Length 1896 0 R /Filter /FlateDecode >> stream xœí]Ko举÷¯Ð9Àöˆ/Q‚3¶'@Œ1CC0›M°È.âì!?ê–Ô¶¤þ(±ºHQn®±ko³ERd±ÞõñÓ¿ý½øçoŧ‡oÿ)¾÷¿¾Ê£5e÷Oqúùáý²>ö¶6Å÷_¯ÅëáùðÜþ÷õÐ=ðíáÏí_ÿ+dñ§öߟ‹¿þ­ýðÇþK§/ür°Â¶¿ÿ}þÝXÑþU^~Ÿ>ÿ×á/¿+~=õ8 ×Ofüÿ?([WÍi #¿†·çŸß¾ÿzøÔ½¿× ÖXUB+]ˆFËâ¿ÿ8üÔv?t^-„­´-oÆÊvœZ´ȦíGèÙ0ç–ÎÙ»n¤ÕõyÖÜë!T%œ}ómic«niT]ò¯ûÐ9ûºWʘ`Ôrš5÷zô[ŠûfÛÒJ—¶_3g·®û[çì]S‡êúÀqnå±²¢nßZš®ÅËæüÔ[ œAù¥{FMkf Ï-õ±nÊJŽÆ±°Eu-oTè«¢$t¯ “}:·˜£’µ·ÔÓÉⵀˌ§ÇÚ¿7u™s‹:]Õvåãgðâãgàö;f€wöF9a‚°?s’Á‹éÎAù³ã»wt‚ žòÆxñ8xÍ)‡ž•º´"ðbÊ™èz{zieX ùcª‰šQ§‚Â|׳XžãH™ýöüf¶q³«„E ‹*Åê}&éG›[l èE¬¡?|:µ$hÌžõÕy §V¥±Ç¸›ÃC)kÁe¤(M3’IŠëàÈ`ñ“8ÂRß§½@144xkÇê|žZ9„…¤(¼¾Ãò|Â;œ±|>×s]‡ˆˆ¥¥GJÒO\$t‰öÈšÓÕZSs<ÏòÊ!ºÖò€ZäØÒøÓÓϵ–GØRqΠ„ïƒ×ÏZ}‰·Á•Z^DÜbýo½‚[R~õßFÇûkŽ»Å;' |†àt87‡ãŸìvÄŽÜŠÇÖ1I¡ZÛ ’Ôt“P’~†5žå ë»Qd2wá^ëâÎi+§FÜ’R…E(EmuÄñ‘‰´YEŽQü MîH¤i.¯Ùéx× ÜÖ_gÀŒíÆëˆó@ŠÃžSV¼~—¯Å-^¢908/”w¯K8HBº¿ï~/Ž˜ƒt³® ¨ž¢Ïzq åz= ž(º¦&äuKj"î(ïJZS $@lE“# H¹óSööá98 ¶Ÿ=š  r=(÷¡cz£¬~SÌc7SX×ç‘2b(j)N‘à¸Í‹tñnÌ´šxÏJ©ÁØóÆ›d›C{+B{Q¶¾’;Xª}Â{àÃD )<ƒˆäR‹}“KÂeܼä‚ã–2¾cË=°è}ò1|!‰!Ϥı¥–(U`ñ\Œ§Já³ÀF£î0ƒmåºM^ 3Pn™áp†c£äTÅ. lQz”:Dºª&V•®zc°\4³ÓƒF]¤[` ñ'Ÿ £D¦<Cx`|“8Å}Éqo¬KÔ)L¼¸·tƒšAã ÍXÎ}øâ^Ÿ )°A©¬ñàQAÎZ¦ÅRºê£â[¤Þpd…P1d°¦‚熙xŸXë»Iùe†-Ũ.Nöçœ)ÊêÄkuÑýõ°S]i×lþæ(§U_”gú ®kÏ4ð}±1&Zí`±Ì{ëþWžé-Õ+ψ'Â3Ý›VG%ä„òðûHØ[‰fà˜§ã4ëÞ¾¶G5£ðG8ƒÿqpoŽà]`ËtÛʵÜË @YLÅ¥ÃbÀ‰˜¥R)Ö8®TÎ7ôÒ¤Éýpà͆KMŠ…O§äè$¬", þvPXÙ‘ñEÑô)’¼0ˆÜ"˜»BE³_…r½<¡J?Í+ ©Ç'Â+†[âú[ð cp©ò3á*§ˆ59¾ŸpŸ •Žko)‘Z|k ¥·.]jª >¡Q¤²ŒcRÙ–– '’âOÛ”Þ<´J «ß™’o¾O G‡Óz±ªÉaHcu…#ô–€w>V?6c)º"e¼!ùXë¶«B.o 7¤YT6cqcjh®\üŒQ‹°•ŽTŒÍDwŽ©›Kgo"æ­ðE7+«¡ÔR|ͤSDˆÑ*ˆêKt9ØQJuªc B‰cJpÐ/ô¬Ç±çENÍŠðm•’qµÜ°î!”˜ÿé;T2!K=YÖ Mæø¤ÇQÞÜ@ÒÄ)øÜ”h %¥‰ÎšÂžéÞ¡w¹0™BH¥ ž¼3VÑ×+Ÿ3åÆq)á8Š‘+ÚÊ‘BBÊë§Ü@ˆxÆ Œwñã½Äo øñVˆe(åhdÊá2f\ÎZ‰›ôŠfÐ…ã,ïÁ>k#µBóã_»µzY^ª§ qÆ8£è¼³mŸ¾:ŠO+VЕ%úÂ{«‡›t»ÞEÿJ!ÓJ³#çá=dcd¶WÐwºÖñMiÍâtræë}e¾ZÙ ™ð9ó-¢[¥VÕ ÄЬ»ÐD1^Ådh*d˜ð|±ð{Ò ´°•ÞLªÇò(Dä-þß_ü]•“Ó“u·TCŒúŒÕ0?ó!‡TS ÅÛ½‚ ONÒ®ë7‹:;’Ö—F“àÄè…µáqÅ"Õ¿ò^,BX/Nç¤C#„”yÑ$ ¸ÁSy 6ËÉ&¬ŸcŸ("†®½…L’fbªDºE†”=Á‹„Ë´½_L¿Ð)Ä›ßé㣘l퓨ÄUÅy{%;ò?„1(”Ñc ëë³Ã»+ë MÇMéøfµ¿Ù<òŠ…Gà´ù}VÀ$chG“Z3ð€Hõë>qŠf|–îÁ¯*5aÛWcSRëï&“~k÷mB‹NDÁå­n½aÀ{^JØÊÁü>°’ëMʹN“¸è (¡1²­¾¤YGÃÈ~„Ï`¬çzP.:•|F´×–1u·©W0˜ñ3$hŒè g ïº?Ûׯ(Ýãwùeœp'…ì'ÜêÊsÁ¶òV(ÉŽN(‘FÃÎ㊠8÷ú»€‹@’ñNÑ=|x£`àÌÛãA¡„À ÁÍì_:ÅŒ®·> ÎÑÇñZêFŒ…L»¤97xqT(I?g!ÌqÆ<6,bæ~Â}VéñAtø/aAi ³ùo¨È}N÷èU\ yB8È>w¢±bôñBIcƹŽ7+?lj^Zˆ|•Y+y‘±|Ô›Hx/>Y !¬ŸÀ‰¥­&\†— –ˆ9ZiŽë¾ƒ_ê-„YÍŸ£Å¤6Wõxƒ9ˆÕmXà®`Ò2¨E¸ø°%Þ„®íòvS\&¼iÕqÙ~XüÉñ²«‹Sxf.cCgçcC·ìÚÉDrQlÊz÷Ë%x”ËÒ“6§Ó+âE¾¡Ü6Í|·L,dfJò‚‡YK(ÒðÑñ9ÂòÌ©ó”Þâ_RuÅo’rM+¯‘Ä£Xƒ¤z./q$Þ‘²Áà èàˆWarþØ<#| =Q†éebfIà}‘Ø_…ýb‡ B49p=Yá–ð¬øm©¼i”­7Cb‰ñ´–Z¢LÔî¼ôÍøS•ƒÞRÀo3]œŽ#¢˜JLóÚ3˜Äð u)qÕ*QݰY‰3‡J H‚ïýÈíOñÚöîüyé + ¾új O«;”â¤éo—» ¨Ît”`¯è ’GÙ%`ÏØC5oéWA«i¦j@}Mg}D㨥Àȵ¹}íß){ØÐoS*ád‡ÄÞÙ ö¼5جºò÷Ÿé­wáõêïÎ •àN·36Îo4~Ʊј¤ñ =!òÄ;>#ǦáNàÀ²©§õpP ¤=A8\ŽÄ4N§J¼(7Ñ«-ëc—–?&\ȡ޹Ùösñ|ø?kƒ}1 endstream endobj 1896 0 obj 3976 endobj 1900 0 obj [40 /XYZ 38.2500000 646.250000 0] endobj 1901 0 obj [40 /XYZ 38.2500000 569 0] endobj 1902 0 obj [40 /XYZ 38.2500000 96.5000000 0] endobj 1903 0 obj [40 /XYZ 38.2500000 646.250000 0] endobj 1904 0 obj [40 /XYZ 38.2500000 96.5000000 0] endobj 1905 0 obj [40 /XYZ 38.2500000 569 0] endobj 1906 0 obj << /Type /Annot /Subtype /Link /Rect [465.750000 456.500000 513.750000 463.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_member_data >> endobj 1899 0 obj << /Type /Page /Parent 2 0 R /Contents 1907 0 R /Resources 1909 0 R /Annots 1910 0 R /MediaBox [0 0 595 842] >> endobj 1909 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1409 1409 0 R /F8 8 0 R /F1700 1700 0 R >> /XObject << >> >> endobj 1910 0 obj [ 1906 0 R ] endobj 1907 0 obj << /Length 1908 0 R /Filter /FlateDecode >> stream xœí]]¯Ü¶}ß_±Ï²?$Q@QÀ¾×.Ї† ô!èC‘4-‚$¨›‡þýjWÒÞ+i%žRܽ#±seQ$g83œ3ïþüåûý¾÷ôå?ûúߟ¾ìŠC]Ý?ûã¯ï^ÿ@»Cÿç}íÊý¿î¾í¿í>ï>·ÿý¶ë^øòô×öOÿÛëý_ÚÞÿ÷ö‡?öéø~ÝÕªnÿåô{S«öOÅù÷ãÏÿ½ûÛö¿G>×OfüÿßçlqœÅ—¿í†UªÓ¯ßøm÷®[ÐGêºrÅ^Yc÷ª±zÿßî~j‡/Uª®l]\ñ™Z·ß©U¹WºiwÜֳϜ~I ®Ä‡n*kèÓ¬¥÷C™v¾±®Òµ-‹ÆÁ?ókrÊVÝv•âT~[œN:ÖЧY oGGd<´Ø±uÆ Óþ+½5/ƒ‹]êXǶ›µô~ôÅcË‘´lL¿5å\à_½ïçÁŇ®­Æ-ÇYKïGOR<¶Iê%c]‰ïÍylùmwM´Czšµðvô…CËѳ±&=Ïc‹ozS(‹ž§YÇ¡'ZŒžÒ½}Ú”â›~[žžZ5±†>ÍZx;:zâ¡åè©kM…¾\|h«£ýÓ¬ã¨ÐùØŸÆÀóè~îØßΜ-ŸL&¼@üáõ'Îv»ôñk+^¯ÊH:ÖåQ:ÖÖ_s8M{´ >ùŸ<¡'Ê¢'ºFOL ¿ó!ü‰ÂssÄJŸáhUø Š÷á£õGõÒ¾™D;JÐfàJ äDg€çf>¤;fU½8üÄs˜¦Ð˜ÀÄÁðl¯(‹i87 ™"Õq6M:FrÕðÑçduÚ>”DNJŸÆ‡’ð) HÏÜ2æx<·ÌÕ¡³æu—­æÃì/Ë|Y+0›Žô•¾‚ôÔÆÞÁRo⃑ó:¢bU­l˜hV‰cáY#>ÃŒšMŒM–¶‰¿#{,d¯Ÿ„IêœP yìçY²x/Šk©76LvoïáY’ÐqlJ›1µD4·žÓU5qªE.ßQåù–2õMÃÑ<+ ûoYªª‡úü%/V/XÂÁs8—"V(áú‘‘ZDLÊ#–e½å´›û³ŽŸl.Íf®ý³c]…OÞ‹õuÉ”ÿl=ÿ-^ó‚â(žÉ‰²' @ê0Åü”#TQA•E5ÖP zD:¼¡˜gøÆ„™GCdƒG‰‚åÛó¯gL°œ‰–ˆ:b°A»µ솨.‘Mƒ£Ôµ¬Y W’k@鬦œè,Ïõs“á—(Ä+œ²=bÞë€{s@ åècô³ÙQªë(s8$œ9ß„¶7è<¬ÉDüoÙpŒïÔìË6Ëî?—1Uîߌê ™ƒÄŒ¶™ÃïÞÕ›lRmHÜjtcÜ.йBQ0Úip*PLõS5cý3Ÿ“€¤ÍCñs´DÓH=ïhö¹`YzAc‡&k€©U$¤2‡)aÇSï[*teæ:¿èÄõÄBdmÍõøâ6ô-Àcz·ööövPÉÓ¡[;UéWÌ@6Ç“¦Š±F0> DíÀÉøž`0M éC &á'ÆâdaŒ#‹†©ÍpïW¢*Ôþ2VéÙ゙…{ºT£ôäpÁÚÌÞùt©Òó Í æ™Q‰«>ÂïÀªZÏîÀwõ¶>wQ»‘ïWO΂̋¥!ª[¶¸]´®_$+–±§ï¶à2çœÞ¸™ êe¿Ã $s£.ƒwRB½yT@¨ sõX…ÈÞ›<|%‘9÷IÛ¸WI ú ·LDŠqavx¿ÚrñÜØ÷%”Ç9"¦*ÇÓ Š˜ãfHžø.™Æt¶nEt#ódÐàˆy¢¦³éÚ:ãìât¨v§LêNõÉ £”³Å·lpÆI"ÞI¹l«)÷Bé„ÂŒ$Ú˜2¡²ÕŠeo/„p Á„§±¾¦­]*†O£ÁÄ"Öóvž8Ù•Hç¼MÉw›‰ž˜>=M“ˆfÒÄpC•#'-ý®ò²<·ÇؼØòád^µK9{&ãÖ^2HÉàFeK-™îÈ›/ ¼€=ü 2‘p&RÐF…n­jÓ&‰]Þ‹®b R⤀Ü^­£Ç *;;èeŸ ®˜azXc×ÑûÛó8kÃÌ::{WNML1}€ÁXAÀ¡í€`TdІ­ºm0­š)ÃKvg6Aþ˜uèVO hÏêBÈéOº%>£chÍc¦ bø‰, ¬p#{æFbŒÃàN) Ñ}•ýóú©Ñ!ê~²êô©€´eÕ儼RÐ1øé,?º¨ù N9ÎÃNúõO~Ù}‰µ º˜Ê Ê ŒQRËVnB¨ã†6Õ”tX=ÄÑ+§9ŒˆÚc?UõàjíEó'¾ç³6Ë„Ïï]âš3Šômº7gW*íߤ0º®ÊeüoYìJΛˇ-&Ò’±d)7± " ‚âÞ"‘}Ö i³ÒÚt™«ÕV.Uʉ' B6aŠ@QÃï`”.¦Ý°ÁÉv‰’Æ0pº…a™Ò%§U¶\œŽ0,–h0ÁÓŠκ$²f00—†0y‹ybI\¸ÄŠž—?êÎ(¸ÁÔÆYt ŒaÎsïÛ&oóLOÏz˜€$†ãÃs»UÅRzùh貂ØCz&‡:gvI§rj=ÔTÈ©¿K°®Ï9ï¸ óª‰v[ ñ0J4d.v²ýð"CÂEqÖ¬ÊbÅcÂ?Êd!wÊ\VïqÙâ0Œ¨¯3Y 8ÃM$§F42àñ+£QøöŒ|¸¹Ä=ÜÂÛŒ•—Ç9ˆ¥$•l„Á#¾0ADÛ‚1©3LÚžÛÜŸœ ÊN4‰ŠúNÜ€jª}Üž†Šp­ß.ªÉÕö¡ãÍÉ’sð:l“¨“]’Ò‹.¼-Ô¦Rh½eM…1Òú°©=S…XãÓ ‹E+š"@AaËšçÚ;Û«Šõù:žH´(äÿ¢•×çÖ{Àšr¼C—ЏíŒ-à»n¦/³Lviض0KõW¼ê𑘘ê×èëɃ­«ÃUjHQ~µ‘Ÿ s]œm®gÝøAÄtÑ W¹ÅéÈ©åvüÀ\©ÅÑèD@>çàKÓ·wý}\¸I"gHŽÁ™+u7(8¡jjŸ8¸ªðÉûØJÆ­6Óxû&vòe9 *ºy«ŠªY»q©ªº<’)Ñ\–›.ŠÉ-ª™Øœ9"¥9´º¬’Z]­v&QàûÂ=^,¢@ aSÅÁLYÛlcüð@}äbd­ú5׉óíÁ'î¤È¬Œî ïø¹µwÆb˜y½>uË£Îïìv%|ÖÝ”’ÃlezEJdúË'yÊ“sqÚÄ¿¡ß&Lx¯2u Öž/‚yP13°'Ñt^+>Ùl„þ|‡ªVc/"ì¹ëQ½Ý=FéáÑeVŒH(¤휵 …ëñ@Ù®ëï£-ôªË".Î$9S…°X†— &Mú´ÊŽ (5ذ]¯jSŸÆ¾Ï3°Œ²(i¹¶BðÜ8ö‚‘:†Kùþ*ÝxAÙ™8§ãGk½¿³=L{:XóFÕõâtnÕ«L-Qˆ‘@vám_F)Ðg{T üôªHtD–%º¬¯šªþżĨÛ0q|·\c–we+=— ¨aT¾Ó! åÉlû=.ætÇËYòáy»É†XX÷ô99g/_JÑ2…›Èɬææbµý)®^šs0Áw¤Î{8;ÔåAÏ‹²ï4è!ãÚêIö4~§gÏKßyñvLî|½€¸ô¤A£õ¶Ju0JOäA7ƒú`fòà}Ïdz8¼4œÞ·p¥ø;øOp÷IŸèVKYë1=.xBRgx<Š„aÃô`JæÎæ"' I'Ëc²^#§2†3‰í§¸3h”ŸWÔoMZŠ$Y'J̸õPÞãõGÏ3ûè÷ƲË0}Ñ„²—@ ¨sûHgªz,Êá"¡‚1?Ì%l*ÓO ŠÚ¾È2¬Î,RH$†ã2Œàz’pyZW1q@fn¢G|¾ù›ÃeRvjÚ r\ðñÉe0A¬ñN|¼S%ï¯oÛ¢Ïø2s6cf¸W½‡éº½éßg×LÀmÞžáµ1°oò-XÔ2þ›L)åüVÕ„X¡žAò/ý…üç.úÔZW¨cj÷þÜ€¦ÀpâsÖ±Lhﯞt'´š?éõ¡š¦–kh7¨gô³”rinŸú•¢6ñXÁØ©ÞÇ)ŠÕ|=ç]¾^Р–¡ðhðþô© ¥¿BÝcîøçvÆ¡áÌ1¡ñ;Bc–Æ;ô±'¦øŒ9> endobj 1916 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1409 1409 0 R /F8 8 0 R >> /XObject << >> >> endobj 1917 0 obj [ ] endobj 1914 0 obj << /Length 1915 0 R /Filter /FlateDecode >> stream xœí]M䶽ϯès÷Ф$J@`?ä`árrì8Ùø¿Ÿž–ºg%õ+‰¯‹Õ#ÉŽ—#Š"뻫Þüñû¿þùÛáÍûïÿsø¡ÿóý÷OÅÑWE÷Ïáùßï¾ý ÛûŸ¾©?üòôõðõéóÓçÓÿ}êøþýŸO?ýï`:ýïçÃ_ÿvúËû_zþ…_ž¼ñ§?ÿ}þ³õæôSqýóùïÿõô—ß~}žñòº~1Ãÿþε1Ï«˜yó×§ËWšó¿¿ýðëÓ›îûƒ^âÛÚÚƒ)]y0miÿýÇÓO§é/“Ǧ¶¾¬Š¶?s¯ööùÝUs0¶-•Ÿ¼ùü¯ÆÜF}joÊXSŸW­¼ÆÕFšúØ–ÆøºôŤÔmL]÷ãœþ®_'WŸºiãÑÊóªµ÷£?Q<·Þ‘¶•é·ÆëoÎËäÊS7…±‘¦îW­½ý‘â¹µŽô´5­‹u¤ßN®>µ«£M}^u”#•æÖ;ÒÚ^dc5Õá÷nÎËäêS{ïcM}^µö~ôGŠçÖ;ÒÆ½mTéoÎurõ©kbMÝ­Z{?ú#Ås›ÒçmU>ïóÑVMcO?{×ÿsÏvU9÷›ÉÕ§®£qn·ê8œ;ûsÀxÝßoí«ðà»/Oo>µS¾ütZØù}Ý_~y*Oÿq²Û?|ùñðûÓjÞþáðåç§òXºÎ}þµóˆmÐHñ8si^~µîþâØ´' W}ó«¦@#xzSÂgà{ FÊîw<ýÔøÁ3eø§ÛnĘcÕM÷²j¾6fE·ù¦8ÖÞ VP´ÝHu,Z7üRxüÅ»î{Z²¼j|>ø´ñ3ÌŽâg>žGª£³Ò(~)~†¡k8fO¼jÌs¦éy¡Òà…Â-Â5ãIðJð b)3Y#C¼ðÅÓÕcÉ-óâÈÂyîÅ¿œô_$ÝÕV#åUAªe$+!!.œRþÕ1•.;¥<ùJßaÙˆ—4a1Bôbr°-¡JÔxÀ”bƒº5C6pŸÎomçÅ 6¯A#½z¿õŒ‡#5³õ¬scÄâgà÷ô;k¶6ü¼ñeYsr†²Œ±°üÃb:@.aQ _ÜSÂL©ª÷6Èâ­k†ÔÑ{;‹oˆÅMáÝR°˜Mïæ¹ ,!T² v°¨Âncª©Šã“¯šðḣpã­¼°ª¯«Å!FHb§ñíbûN @¸ùÉÀ÷”È`ß9'ck`nÞ%PhXd½…‚¶„pWq”@Ð)àݱð¼;Å8âÂ÷ ¯­€§i´ßƒ˜ý9íËz©LKÁò¾mg+áØ†cXD`RLºø=s#)6¾1Í<µÎ$Yèîz¯ ’Ýœ z˜‘Þì Á³•×cê­0ÂÓLL;X5c%‡Õ,^#G7ɧÔ)"ÊXÀÓÆ{Jîôß“D±TWKˆ×€ÑIYØxL–˜5ñÆì,x\ª¤,ïÌm—Ós¶ sÀ”TÞÚ‡³žtmOAO„å Ð\ïëµm’®wkƒãS=kCº´îúÆ-A©lX39ä¦"ò \ g2TÒ¾8é¡‚¸P‡X0abo×d³Þyu7m/\;¸I°T1¿¨‘e€``ò}©‘)xSíFÀN„CÅ@V Í@w‰<=PšžþU8½€gfèoJ6Pd ˜»:"àgÁ5&§¾ã7¶‡ßh›r7âšNAοÃá!"MµÍ” nˆÌõîÁ¦=Ø$ÓI+â«æô.7´òLëœjíh4•^ÞÃÈÄ}d×s»žËD†èê‡M$ …$¸*ÊAX[ʨ¼€æÄÉö¦{’åøvt-È*,GhÅ®3IñܵY‘5×ïÚ,mÖ^®%¤Ðfj£9©‚«?Š«ý0Ñö€šDîHÈ^á%1ñq&{E”&Šr¥‚–¨ÎA¯Ï±Äœ€ƒ/„‡©rQ‡%îb2AkUEOéAðÅc5ÖŒL`V°çˆ;=Ìmmê† #šÝM¥D F]”T%s-¨Ì³ŽÅ¢š ì=ÀèY÷²º¼±´Pvl,ܘᗠÄ×PL¦Ûhõ÷Œ©¢æ3½Ê-µ*4~HZBÞǼ‘m)—ò­ëÀ!šÕ+!DqÁâ¼kGÿê®ÁF­ñç–F³âsò Å]u{L³ØÆgZ%0¤£ªÁ##¥…%cY÷R¨€ÜT@N«C‚U“aíÍÀþ¢]™ëú»/3ű3Á'GWíÄ:gž©á3-|æýeŸü誫é/Ášc5º›&Œ8ôžžxn¿óÂdø£ñ§ GÕ ¶žÛ!&#HÌÁ †W€‰?Qᆰl†¬³²÷Ñm{áÓu›D-‡¸PqOÆQ¬ä~((v@%”Ï×Í„X˜kL(V·Ñå¤? #AæcH*ž)†j…ÆÕ”ô±e.â0¤¿>ÂgpJ¶ÇëEëe£›kÄ©{ÇEÈ««N(ã-c]¢JÎLn«„¹-jG ­ÉØߘâ‹aõ¦¬®L§d#ÓM~u¹3[ ³sžoGÊq­»h•ùDÕöfº®$*0ƒ†¦u/20¯š&®s1׬t+Ë¥Bê© Š»zX7Ñ¥.„VûyÊ ZçQ.8c´ j3-¬ÁÖOèÞðÕ•"Ù`©ÒKË…G2 `€<#¤ñ+¤w¦>&&UlZ®e¤Qw©2®’¹þ­Å|3²>n„"ÄÔ"3›æÁ¯I«aO¯$lq&•_˜¨¬à 2:ÿŠHžf. dͤµ Àc2fT%gL)i& žèr?U ¾ãUt¨õGYRLBqõ ¥é`ÆâÚ Éõ-YÍ ÐÔµ]ݰæŽêÝ釺³îZüð]sižã¥ý?µD®ò6kLØ•‹ø†¾°tdª6×´­S^*m©["çYˆ÷PÆ0ƒ0¸ÒÃ\µÙkPßY¿/Ц ¾‘½¥‰`"–ËKM¬ë ešêÂUƒP¦ V²¸÷¢ ŸM轨Ößn‡/‡Û_9×}D6kãO£bSâRôJ6lHY•ê­º½ Hß<®1U½)åÚâtÝ-Ý8/P«¡ââl·•k (^°5GÖÔcOf™¶Š¸TQªA]A,ã]"ü}ÊtQuïïȺg˜4Œr¬‹zžÀ @®{e‰0õ @Lü‡'’ݲÓ@™E®Ø²Zƒ¢(wbVävíP¼P©-†í™”c1Ñp6¹~€9ô‰±E€#ONe½0t­r=ãJ¨v죖"¤þ ©«vøq·Â ¸&= 5é[8B„hñ ¼68âpˆ‰ñ÷À 1®ÿßÅ­x ½ô¥øL{:HB|¾™ÿ¸¹‘$ mýì™Ú·p¡Ž kÕ>—à˜z!â® —Òög^ŸOéò.ÁzSÏo"Á<‡Ž8x$ºgëlƒ"ÌÙ™š · W+C6OîÒIÑaþÙ$Ïém¢VjŠ‹µTöoÀT=󩬌äÿ¸ aêÑyfCÝiØšføÑT¡{ìé`tB1º…î˜Åª–Qð€I˜e‘àˆSÂÈÍ\ÅBLô~õ²f)ÄTaU;bÿÕ¡{Ÿ²ÈP˜PqÏå¸ó„±«¦vÃõáhÆ»Ê5v•Îýi{Ù*ÜâšLËN¦É&E.pÕBP*—/Mqômaf>at¦µ×=ÀçYãˆv†ŸOŽ AB-qF!ˆ7‘Pü‚Æx4BbÜœé"¢8Âaæá“LP8–°‚+‚Íc¬16Io˜v„‘„âÉÛYRN%ž,öep`šX#ìs2áaµfÛ‡EDœ©ÃÂvoºÃ2&Α$;,æÂsX\R0ƶ‰K°P°ÖÄ×ÀKˆ°³0©ÍKo{†K’!Œy©’N,´Âaîœíh¥eîo›qÉÀøþ6ô8Gð‘XìV¹!pƒúì*[ÜÕM(P¬½+&´ÉåHcC“ppµË@6+:m™:ƵMë Õ ‘¸ÎYàë:ù8f÷h_Zá=Øæ—Býpg ¿ôáÎÃbíL‰¬bJƒ¶¾'ª›Ò mî‰hâh„à¹bÜ-cÄEv´°`œº>s£ÑqLÜ‹In  2 HLœfŪ@È’ó{Jx>¦*H‰Â5!&º¿MU­ Ûèìt»ÉæÌ=¨„&›sÍð¥Q÷M¬ŒeJs½\K¶0ÕxRU¸`Jxàz^“6\¸ä3Þ”Çì¹°Wë‡ä˜XDÆ,ßUVÃO{ˆ6p·øj\Yž©ïÌ,V·ËÕ®—WÂ"2 ¥`†+¸ÇqÔYåˆÅt›?2E­ðþ,/ Épa²Vd«·l/ë~w •޵²ð‹u;ß­^fM·±‘À{ËU"Õ!ŽPÌb±"Šl§êv$ÂÕ)ûÓjܶÈñNŒ§€¢wTݼCjGÔ«mmFz5‘‹–O/Då"˜Ë¿‹*­Qá2ܲ :¼$ EÓY–ŒSÐÇpnõ0ÃvÝd‹™î£˜@2åèvP¾ÃtsWy:aX¦!Q>Â’ïÒšÊČ٠¶ª†§Kùšz˜“ïšV'|Áu~»XWQ"I£ º@ºÝ"Ör$”›j/ïû.ôÇ`\AF3­Õ/`× ÛÕ uQ¼v R:ÂÖS‰#‚5J¿z¦uî}‚¡2Ê!º—|]\?&z@8x±½^Föj„G0» Ö¶ªT[ Ô…;f@ÆXN—R"YÖÏÒ0A¬/ˆ†d³Ù­˜¾š)ÌÈO”µÚ 6J 3kTö¾G7?œsk*ÊÏ$ß0ê)ü­2óç¡›Ï\?2ªaéPR=²ŠÏ +¶‹³Æ ){W8œqºÑ·,¢è=n.ytkmŸú/â{ºÂÖnù²¤.ÖôŸ>ùÀžhpú[®7>ÃàÙà3½Qe‚>ý›hKpÏ?ŸV<4B‚?#4&i¼Cy⟇phxøblšñ‹á^ÔiÏÌ%| ¦qž*ñ¦ÜE¯¾hަ;…áb õ£1+¶?>?ý¶Y} endstream endobj 1915 0 obj 5469 endobj 1918 0 obj << /Type /Page /Parent 2 0 R /Contents 1919 0 R /Resources 1921 0 R /Annots 1922 0 R /MediaBox [0 0 595 842] >> endobj 1921 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R >> /XObject << >> >> endobj 1922 0 obj [ ] endobj 1919 0 obj << /Length 1920 0 R /Filter /FlateDecode >> stream xœí]Mܸ½÷¯Ð9€Ûü’(A€õØCÃääx³ ÙE&{Èߺ¥îqKý¨ÖS‰MõЃõÌÝT©ªøX,>ßÿñëß‹þV¼úúŸâ[ÿýéëNí}©º?ÅáëÝ÷¿0õ¾ÿ¹ðuY|ûe÷R¼ì¾ì¾´¿ìº|}úsûÓÿ Sü©ýïçâ¯kùcÿÿà—×¾ýþïã÷Æëö'uþ~øý¿vù]ñë¡ÇÓãza.ÿÿS¾6)&žü²;½¥>~ýöí×Ýûîýg=¤Öeå ílûWãLñßì~j»?u®öµ³ÚzSºöç¦r^•uûÙVƒ¶ÿC>ڛóMUhÓ¨¢ýiôèã—Hçâ]WÞ¯ÕõQji}h[é`ßûÆiíæ]àMGù½Uj¬râÊ9w.®w£ZO^ɤG©¥õÑ›÷-fR£ê~ yeåõ^¯5J¯ëÕ¼å µ´>:“ú–3iíúdªJ\9çÎÅõnµ*×2éQji}ô&Å}‹™Ôêò4'iqàý®sñ®_Ï[RKë£3i o9“Z×ÏI¦¬Å•sî\^ï•ZͤG©¥õÑ›tÔ÷—}`9ºß€Hþ%ðÁÏ»÷ŸµSM¡«âù§V¶ã#»oÏ­BÊâ]Ôùºxþ±ø½RFÿ¡xþy×ì+Sžä[´C-Ê–'ØÒÀçÔð3f¾l÷æaËGØò ¶ü@¼Ô~Só>¾® v å,Ô(ÖunI¢{"üŒSéŽàŸžÛédí© ñ'cˆ†‚MÐêÐu΢慻Ïs¯sËCb<½Þ *c¼îŸìly2 ž$àËÌÁé0à:™Þ „§€M<Å—.ò,ÃÄäê³äl–Vå–­¶0³ Žˆ±ÇsI`ÎÂèO¼ÏäÌ$\µœ: –oQ­å'4ñUyçõÍ:)ë}ݨ˖^Êk-O1€× ^ƒtƒƒƒØ\z°^Ñ Ú6—êèmàöÎv „¡G^³[yl±ûÒUµ¿hé¦ìroM­oõ‚nÊ®_áHøÁúð“)¯»ÖýP;ñó»Ç½õqM¡õð½ªù¶Š›×^÷6¿1v.lìvØ#‘° a‘_‚N|_¤ÄH_]£S‹Ú†@ˆÀÀ!Æ2î- ƒ¸ÎrmèvsŸVûÊëƒz„á«Ï X)£¡‹ »€Õíï脘ïôÇùâ`Ü%¬s,õ7Ϻ[¦j{zòk‹%f@ø÷)Føx\·ûÊ^̵P¶Ö78„£~"€ ¬.ˆUY`­Ch"¿†×QµÎÇKó6à§VM%bK'V”u(5^Ú&ó¦1L_+=izû!ž8fàB)öÀp†¯-K$€à›n¸`Ú·Ó(Žd§(öcÞù¼‰ì| ”E!^ðrñ,g”<ôq¢'±õB…cTuZ,ØN­O»%¯RâÝ ¼yiw;@¦À²Å`iÕ ô›þÂjMН.Õq7ÂÌ£ðV˜ s‚E4ÞÑýv¤‚Ñ/$6)ÂûØÐ§ªn±úf] Íø5ž £È©!¸æVÕ— ‚i2qŠ_@‚CH1„n&˜üp (Ò˜ð(Jl“Å9†Å4gÐaÊÖÒöw'}Q( )< ‘OÓÜxD£s+ñ»“ ·Å¸•ux,@Þ'±ÆÚAd¼%º\€]Hg´n.-{m)Åä 0-/é„ù(X‚@*'ËÊxÎgëUœ/åìCå œ“òA’CòÃ$˜Ô]¬<ñ’2ßn«ø–ßβp[F—ŽN¡°[bÙÖ[f\< Û 3.Öa\DÛf /e¨a ÏÛñÈ‘Æè%=¦‰aª;b$4§`ØLå<|d ·4wl¹ö†‘/Õà#ù&ý ûN %"ÔØ%œ6 5ŸËÀEž à „l_.ás +ž¨ÍC)ljïñÆdÏß`ŸÀ‘s¨AÎ+>0£9»ÀQZü"®J"œ´¯ â±­©'u˜Oq¢ÉRËV$ü-°¢|´,NÂR /Ó^×[ç§Sžƒbª>¡ø˜ Z²ÔAÕ©sb`“I²¤Áï—KçƲ²Ö¦J#G,€\ûÌØùϬdŠ0c/Öœ„b%¤Àª›%\>Y> st‡É´r|8“I×蓎ÊúˆŽ…˜¯mÏ}02àƒÂS¬”°PRšLÂ÷à€9dA€žvT&’Ò‰—‹oܹ(U.nzÏ€ÂÝYAØ'„6 Bõi“w›K¸@I¢`pÀô<õ² ²D=ÿQÉ~’&]svkôåôÆ -%ÇÌWÌ&ŽDŒT‰h‘7ïYäŒÉ 7 Bƒ‡’ÄãkZÝ ´›óß÷ÍÇÛP3jQMVUxS[mæõv6"/àðÚûD7]éy› À” œsJ:1‡ë9«ù˜H]&{÷¤”Uçd~ Zí+¯/Vx/Éñ ¯wð±'Ñ¥¿ù<ŒÖ‰e ^3‹ÛÀY:áY‚@@/›ELÿ óº3¥iW×Ã+ý©rE°±Ê]ª#€)xáŠ1…qÞ‰øà~vKVyí”{ÊyÆ;pwÖ Ae›fL•ìî´›V"¦.'”ù&Ñ Û$â?hnï¾\ugÏs¢ÝÄe]9ÈÅ;Ó’11žˆëàçÀsO|Œ„ S ^2IS<~ð&tˆ™ÊÌÙ/&¶VÀ½1Ç!"ùNÒAI¾‚3¤¦\:» UGferõç ðùˆQtsƒ®sDœÑ2£%–øbä¤=„8ö‡cã‹ßoK&´_ÅK‹wA8ü2õnØ'­¯nGk»Wú°ïU˜suá.²º¶™ÑYÈ_Ébw~eNw¹Ž,T[ú…ŸÙ÷ûnßÙ¡“ß³vå9vjCçšlŸû7E[x¿Ã½Š¤ °ºõÑ öËàm‡+¯¡qoð3ý2WÏzõ±wø¹•ødh(964þLÀÐØ¥±†>!÷Ä9GÀh¸øà€ÛÔÃC]¼úž&Wà±ó^‰•²È_½ª÷º³Â…ãB„êsA=¶Oázñe÷Ù­SŒ endstream endobj 1920 0 obj 3511 endobj 1924 0 obj [43 /XYZ 38.2500000 386 0] endobj 1925 0 obj [43 /XYZ 38.2500000 386 0] endobj 1923 0 obj << /Type /Page /Parent 2 0 R /Contents 1926 0 R /Resources 1928 0 R /Annots 1929 0 R /MediaBox [0 0 595 842] >> endobj 1928 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 1929 0 obj [ ] endobj 1926 0 obj << /Length 1927 0 R /Filter /FlateDecode >> stream xœí]Ë®ÜÆÝÏWp@#öƒ/ `½d@€,‚,9N`ÄFn¼Èï‡3äÌÕsŠìÃb“á[ò¥Ø]¬wWUW½ýã—¿'ÿü-yûþË’oíïï¿Òc‘¥Í?Éé×›ï`Ëcûç¤(³äÛ/‡—äåðùð¹þïË¡yáËû?×ú_b“?ÕÿþœüõoõlÿÒé/ür(LQÿþïóïUaê?¥×ßO?ÿ×á/¿K~=­xÙ®æöÿßxSdîÅÀÎ/‡ËWšó¯ß¾ýzxÛ|Ð&¥ËÒ<1ÞùÄTÞ&ÿýÇá§zùËâé±òƹ/Ò Û¶ÞÇy—[ÕÏÊÞ6ç_‹õ¥óú‡3-}†ZÆåF\[¤yY¶¨1^ï×ÅÕ—.S3·œ ÖÆGKR¼¶IËÌ7¨ÉÊJï—ÅÕñî}­»æâ–ÔÚøhIŠ×V#©¯×h¯UW¼¯‹ë“´,fã–3ÔÚøhH*¬­GÒÊæ-Ió\9×ÅÕñž™j.ÅÛ@­–¤xm5’fÖ·Ü”¾.®OÒ,Ÿ‹¤ ÔÚøhHÚ_ûsÀŽæ'Àk^|÷õðö“ñi•˜<ùúS ÛyËæ·¯5B²äMí«Ûú~L~Ÿ¦Æÿ!ùúó¡:æ6»8ô$}ßÉá;=±ïˆ}Êp¨ƒT† ÅO *á°aŒ:LŸOá4u ï@ìd˜ 0F1µ„ÀÂ}¬Oà—ZH¹XdXt!øaq@¢áàãâ8€`9uÌ}üZ›­¹MŽ«.›~ˆ·iV^6…úM‹OO°äÎ^vl¨kÌ1óyYdßé³FזDzJÏ€v9âÎ;¾Ñtþè]ìêÍ;Ol ߤ eGgKsûîc,Z­µŸîò9cžû¸p¨1li»Úë%1þ0{x–Ø®Fòƒ„Í[€ÊÅ‹0ê@ >¼…D-1—}ÔÒõƒøÂš[p‚²7)Ìâá¬ä`TìÞc#2™øKq&Gù„ì4‘Oöi8v„ü+Æ‘9r÷ïâ1¬?ˆwBˆ@`Ø0Ið>0ü™ÂC1ó¸Ð>ñoS”EVM }Š+5†žDù¸âêvcj?¤ÚÐã9tW:w+ËwBwØ<÷;8–²‘sÑŠ#3‚S6ÞEf2­1ò1RæÓV·¬<‹¹˜Qm^vdQ—ÏÇŸ˜P+R_ÀˆTª‰Oêx ôeКúvN+TÖŸ7—À(1!ðLäW•s¥±²›[P)ùñJ‹)N£êEˆb;•Àý¶–UEîÂÝ=åÉ '€«!OQÚ»%ïÆK¸j­çü¦±ÊóŽi„øabüÊV €Ÿ ±>9v©æb¢¹Œ9e\$BÇG ¾—eqûÙ{ð}¾C1ø^ËÊ 8 Ä6|{J 0feŒ^,«@¼Í& ~Ï”`¸Špó¼á[^‚ ÀwtM€Ž3É‚œb®"ŽŒFš¯à–"ÙÀWFæ͇ßQm‚(P¯¦šdZQbÉšýû0ΩCab5‘ø@ O$ÒHD8:Ïa9%¬3¥ t/^mÅzÛÆVê£q_3Åâ‡ü5g†pÌ.ÖiC k$°ƒ¾jú0ˆ)ëŽóÙ¼gsKÌ'œBq,€hŽ»|`:âùÔ–Sª¨³»ûƒ²K<¦pé%'1hqÕnºxVqÕVsÍ^ê{÷jêr™d›8x®Üçs¹'VÝ:ùÁ†_6票ÌäLµð*üQWš)"³“¶'€k`KŸ^7ç{sƒ²ôDï‹KЋ‘¸Ì®;õ£×ê‘È\"߆[¸ÂK´’°DÜàÔíÌÜ¿¼ÊtÔŸÐj4VW¡Yºë†uI ¸¯­zwU™›q›…¡¾Òó*dWt´àÜœÓ&¸âqšØÏÚ0Çv¼7©êc…{¸3P-+„~{çy®Gð(®ù;) [ž»‰¶‹!ÞÁŠqž˜e̤||X¾qÒ‚}wLjÜ­‰Užø8¾Ÿå•c²2-ô#MéR6ØÌÉXoºƒ1C¨Do#X¼Z¬&‚Ë·>\ß`7a‰WÝxÐ &?~§õ½æôU~F`Ì"ÖkÝxeK* ¡.žpbÖ9-vžÝr„rxP·ƒ¸ªÛb0/ýw‰Õ96áá†Åès²œb0•pÂÒ˜ñÒ—‘aLìæ¨Æf67âV£ÉëªgÞj$NœŒºÕ˜o:£ÌmÑq‰Ÿ•Š2½nÜXe8,N£$‰àEŸAÁQK©—¢§Ùê¥÷‚‹—r’~²½ùfãÖt,¸Eï ö3¾‡ ó5Ü¿“Ã'ø[[ls#ªv£×‚¶j멵€îy™Ý²‘ׇ5ËÆ Åé3æöëž;ãjËr,±©øcÍ+x@h@á¼ýÓ™ìÝ,™¤9C<¦êpÑâ½ï™ Ñ&Ä.«³&a2Fâ’Káú ¾Ž@”i 5éøÒÑ뱕è9½þž<ªeftãA‡Ôi&xÄÐ̹.Ûe1¾,–ÞÜ•ÅY·ìºÕãg¦?fîFŠÓB»LÔ»JħSÞæÓ…_™(E¬!«ábÜÓHu>ºZ8ë®™ÈT* S.UÇ¢­Q©\1Êsäìe™¯â¨R:"¨.¤§pH›!ÐFL$ZQ…ãcC”¿¥[%Û%6£ÍBª§1I5Ó#Õý¹ÝgQ^4FÅ­O–Mðºev´½¸6óN ß©Ð;­m¬Ù¸è¤aÚÔÀÕLŸ4B‘±úãÕ>^}¤ÊÝB¡f hï<G×ã•‚÷Ä—ÂÕ†p=»};¥Š[.jÄÏØ‹ {ÊXóÅëjg¾†K^ygü- <Þ©HÒ­&ꛘ3Uo¯ZÜ÷C˜ùÝ*ÎÌVOÙ©0Lt\7øI÷ÌáM#ùoÐn dCAíuöA»bÃ"¦6î­{’à®(L»{füE¼.VyU #‘è¤Ït«gzÅ3dŒ%š[ØÔç“ ddZÊÇj×Q 7¥‹ïªåÏQQíf&0Ò*¤$›Ò—z‚Ó«Ä€¬ì˜!$ ÔÏÅ.ÅóÍBÚ˜ª:€ÏÅHÕ¤9…LÔÅ»,3ýpwF`¤ÒL™È ‡WöPpõ6m¸§iDÄ;;‰k>…ê!QŽ¡Wi~ËR&;¦U¬ËäÛp5#„­éroµFgÜË è^Ö(U£n_ÏÜ‚hÞ¸àò]B…$YÝšz! 1ó튭FâÇ1æ &FO]Ÿãúúœ¦$¯:¶«@U¡[uS©å[×2¢ËXÀ^»åõéÂXm„B´ñEeB¶ukBÂ\SÑ­`Õ_"RÃC•.MÊm‚¹UÈŒf³r³ÉèMݶTñ?á“DÌýWYuKëÍäþ÷ü`CàbJ’uÏõEØUÕ¤dîž·{XÒg©™’æÝspÛd 7%™»çÓ¶ÉÙµûéÆÒ:Â×=£w&}e?î1½õ½Rw‹•º™1“†g>d¥®ÇæðA+u3ãFÈÂcJÉCšœ½ôeˆa¯—û·æ#E*}ɬ½Tm-_x²‚ „ºÁsëöÔ&ÙÅäùøOŸ»‡k‡¹×,ê`›fTCîÜõì{=´—å¼²S¤¥*Øb•Ø|Ï+Læ||CªŽaù$»n9j `1‚ûn†É áAè¶)u×Ö'=ÿj°=ǤY䪚B -S׫ÑIŠ*Æ_4µ¼Wª<ýj}¦ò<'U†OL‰1MVÚœ[Ú~o=·êOõŠ™™®Òøhk¶¥F‘Ižð âÞÂóYŽçëf#ØÊµ®ÞˆW‚˜ÙâZô´c¢% piÆNu*`¨aF™¥à0k¦)S>„3¶L¡T¼„¸­¦”ù …y»à* a¦Úù1Ùò1U !LŒÈd0­*Ôãz\¤ºb\GÌg;s)ujÍ®‡7u~*> endobj 1930 0 obj << /Type /Page /Parent 2 0 R /Contents 1940 0 R /Resources 1942 0 R /Annots 1943 0 R /MediaBox [0 0 595 842] >> endobj 1942 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 1943 0 obj [ 1939 0 R ] endobj 1940 0 obj << /Length 1941 0 R /Filter /FlateDecode >> stream xœí][¯ã¸‘~÷¯ðs€ñˆI°X`ºÏéö!@£ÈC°‹Éfƒ loò÷c[’uù(ñs‘ºØÝ˜9§M‹¤ÈbUñ«ÛÏÿñí¿ÿûãÏŸ¿ýßñ׿çço‡ìTæYýçxùûÓýښߥ˿þvøqüqøzøzþÿCýÀ·Ï¿?ÿöÏ£>þçù¿¿ÿø_çÿÔ|éò…ߥ*Ï?ÿvýY•êü[vûyùü/‡?üîø÷KípÍdºÿþÉêRÛË,&FþqhßR]ÿþã׿~®ß?h—[ëŽÊ{T•ÕÇÿÿŸÃŸÏÝ·g§Ê*U¶Ì¦Ôçq´=¡«ìh” sý+ѹï:/T¬®¯³–^eÎöõ}rÖ(SêÜ^¶÷²µ¹súü{iš?¼S¡L½\U.¾^·¾å·¢ÌÊX]_g-¼Í&îåŽmål´ý¼õ-¾èEVºXûyuœý„]‹íg¡ò¬^íÄ7ô£sù ½J¨8]_g-½õŽzú>¹¢ùçFvçaó ùÛ3ó(ÑËL5<³,¤÷ä£oñí.³JGëú2káå¨ w-·ŸªˆÆê?ú–_tÇbõõ¬£°úA×_ºÀÓ¨?·†ž?}?üüEÙ¬:ªâøýÏç©]‡¬|?/G~üé|W(ôñûŸŽÿ–©ñßßÿz¨N…ÎÛ Ö-Ù'Ô¢a‹)`o_P‹‚Ï( [`oxF…Ï@Wð}4ìí3|ö¦1Î{øûd&|Ö˜B ž5œ¦LU Áký ±:p­ ^·%JS"<õšàUóØbêÞÞ¿Ÿ™ylFìÔ4³ƒ->´‘ãè’‹gÖX°Àq4>2+fO¦JFHç‘ÛAßÒ ªªvÝðÑ$Z0ØA,Má>yHÏ‘ØuÏ*ì̳OÄ <¬ŸAb×›[ŘTƒ-Ê À”‚×ïlJ ‚ûSl`L² ì€}¬Å`¿¨32­<]2VEÞ•Œ —fä„GU™¿`X§PoáBÀ¶7ç²ÈçÞ/=‹"+Ø‹ÂÈYÜýü{Ÿð€àºžÁªà!D¬bÀCnߥNß$PUØ¢ËÀ‚À ›Ág0…±w1ZÏ Èé±vŒ×{ìÆÃP3BãÕ@/^\ˆwC͸…±ÁÔëè™÷Á»­tЛ½³†Ï`[Üä NžÎZBC|9àƒá1˜GÓ@£¬MØÒÂÒŠ­ØDŒM†°L¼Zžª…`ø«>Á„¨–µ1/Ï)eΣ1‚¾©gœ"8töqÈ8üÚ+ö”1pëS­Á \,0ù‹ªE–¹å¼ZÖ-1$„ãqè™õâ'‹®ø^ÏôæqµY1Wffx·£»(•¦êžŠ1˜Ñ¡–ålõ„#HCòù ûÚ`8±ÝbG.b=€t€Ý¿aË1[ã1Ž q¾ƒ§Y³^¥ùvXÊ®‡×ñDÀ|6懖÷ÛŠìáç1ü ØÝü™àñ áð4IÞ1¥\Õsxç| y'»¸w> \ |üù`©Z×P¦}Ó‡N”GVÂŒ2‹3 óDÜ’Èê¹½™©·øü”U¦;¨6·¥Û¦¹®{şž¬G¤¨š³œƒ<&t¢eIŸßªÆjïDà|öÙ…F–&)ý3Ñ©ñDô¸MΑ‹Å0<*2ž€U*°¥KÁÂÚ.V´·£E  âÄÊŸßø¨[îÐÁdõP¼Ø~*Áâ=Š6Áç–¼d*£vu¾;6¥|1n²q_#Äw< @A,ªzâ ß<Å=îÒÌ +nuAÀ»ÍØÛT#Ãá©îâ÷)Ùû‚Â$¸=c=ÕQG*NæÊò‡Ìørzú¸ø4ƒ&‡Xy2ê‚scfЄ©Žõ–¡g4lQÄŠâY·¶‘uýÁ¹áÞ<3€û㙆{š‡ÏíNžÎŸ5žÜÜ›‡áÜæ4ŽçMñ ¦ö'"ײYÞc[ ²ø˜XgÙ±ã[8ÌÑ/Ø®l3î¥2 ÊÚùC¨7Û¢ÑD2g”&‘rMK”Âååc¶É¢þ‡ŒÑöùÜeïâ“k7¨Èj×cüSÚ1…-{“‰ï¬–«î‰M$aíA~0‰,`"cÍõp o¹€œ‹cÝ‘SÒì-Óã•G©Dê–á©Ieh€°nˆ¡S™õ$<²á2yÀÿÌ´T>¼-Ÿš˜îmV÷ät;ó+ìæ‰ôíAIg¿æüjKåâfÖ<ä”×Ö½9F'Cn¦|?âã€Õ­ò†h†LÙhy9}2K¥z+çQ¤ð¼EÁ'Kç»I†õr“ñŠ ^/ÅެÜ ŒÑ¼¥eœpžæD'KؾWe6º¸Éܲê•È Úë¤b·“0¾L ‡lÍY•—¹6m*CI*ýœ -¢ ¶„Àï¸ûG¼ç–W qo‹GñÈDÃ2uDÁïd·ô`”#æm-ÓeïºaˆRÓe}c”S4b6U?è‹…¿Ä7 €<3›L+ñrQPft̯R3¸ËÓ\%R…4V6Ÿ>[L)•šŠ‹$“‹ó±Æ§Óרû@Áhj¿Ä»±ÙTe*›°(üHiùóõQ¦nIqãUEÒoPä&ªê3&YßšRÄ„,k¯‘YO” {úÌK9JQ"sדu€'¬C@ i(rÕLJá1,—xB„=§r‚K”âoçwK)”}0Ù€,:Ó`´lnŒ%0G[uà tFTE©WͬŚýÝ)AìÐýÄàù ‡Å™“)¯Ÿ€»‘¬q18¥TŇ« ;ILTÆäùr.rúúQ ¶Õ"\x¥·Ô5f‚ÂgE¦Êvapˆ".|FÔ¼ÃEd˜Â@ЍEÇTУŠÃß>Ã{bj‡®zEq5H½¸Ð®’ê)’õ)ÝÑ4Å4ùãWx rÁÝ3QDoS_3#u=½ùíb’ÆúU¨›#‘*.äîÊl*þu› `Ür©ÙØ$0ŸÈÈ¢ìýÚscnë‹'*¥·Ä „ý'eÝ®Ã8Ø>`€Ži'Sº+÷zÕ¦ŠÁ8ÞTñ¡µ€‰ˆ’MjËd Çt't—"Ri‹žB»æËé&¯ûÍ%8"çuNu7qçê[Ô!¶·”Y]ôk _¥ $sy]÷§B†Õ‰&Ÿ[u‰ôw²1â²J&ZŠA”±YyÕ,àdSÏ,îŸÎøLã{I@vÚ>(ýÍ”-ÑáQh®TÒ—¹R#1<ÍDQÈÆqìê~ è}éiœ†-’ax +æK3iqSÎtß6ìêÿN<! >xL·ø™©÷I±¼:Óít0z1 ü ^x쬀јR$Áq°K‡”±³qh-Þæ8Ãg<(˜vžfu ±nVtE=ü¾³¢ž“…Ï)æb„[ÓB"úûLÒA1¥Õäò¾Zö×"|0ð8„ï«Á®jpÖ«fªðf (ïN¬üÀ¹5¹Æž-xESQv´pu,¦ªuû¾jû `®}X'ÇîïÄ}a£®ìŒ†‚uKâ.£s‚`Óyùê¼zDšm2ö‚r1ÇÞ˜,ñŠ8f)‰¢* "—ÊóÚøöÅ!Õxá¬?C s‚ï`‚Å+ºé»ÙÆTÝTJ¥†cªÂ´³Mý`ň&£'zÆÁ"”àʘBzË!…ëbSÜ%…p5ê‘ð¸WËf[©+øÆo! °xnX%`ãMš½ÌAãT‚áã=Å8’ÅBïÞmÌÖq 9Ø“h7&Ÿ\xaˆw“±ÍOD|鮨&·© iqƒá|žëÿ&±' ¿Æ—®DP¥pƒ5`\¦4Àd†*¬˜17JY³潋3¡çÁ¸RQ¢Çøˆ×¶x<{–gÞ¢§Äã—¶IÑÆ°5«+a´ 1UéÉå}]8È ÆC ‘pë­jÁR%`²E M 'V ò-1ùaBž ÏOÚé‰ ]>|E4]Ë +Ûˆ›-_X’ªãÁl “(+ â w’ª~Tª(óõŠâJ;`ü„JˆoúÌÅÉ£1Dnγ²»²­Ÿ›,µ„ (Ž9èu“ñ½Là Ã÷ž/ñaÀì™LtÊ\\È&š‘)…ÉdCY<y÷1é‰ÊOù-BÖ“Þ…I'°ÂÂFLMÑȬP¶È “†‡á£L~ÐT—T&¢(bŠ92·È¸©´=G› &œ7ƒJ›Çdá]âTYsB.êD¥Êr Z纲*¤¼ Þ÷€Ã ʾ†«cyÔ"e•!;ÑJUÆÎsPûe¥(!.§ºc0î†GHš*š»°±áŒU ÅVXMTrÈž‰)¥‘aê›D­7&¥g•‚ÅDÔâ’YÞ’©2ÑÜu›ª¸{^û*úà©I”÷/Õ“ÖR>>îö‘òçui^ñ¥9¦Ä®}~î(APÓXÿd ›ó+ÝR>„i_FŸÍŒNÝ6 ØSVÒÉ™2ÜQÛÑ“t­Ú‘m^“Æ;áB"ÖŒÑfqjlwï\Àg*ôLÃhT9$ÅFôØSߘҸд4®¬A3h¨±¹epÎàæQ‰J–—§ÊõŸsó¬N–FüªÅò¨²,ˆ0R㈔=YÌ Æä½–¬°Î˜¶C䬱K$«6syaèc°ÔLM•Á^ãÃ#{Ó_¡ËM¢2©p$ Þs+`|:øB Q‹®t{ÕGwUsð n!¢0Öó*u%‘0¸ä¶­Q 8°jç(F—˜_½Ê#{y•(ªÉLõÄ¥°Ó7s¿’õ"•Õß 2±B½YôäÈê7²¤=(,'%gŠ4aoMjçY÷øåÃ2euˆ´o|hΘÉ7“=Ž+ •Á5–ñq’ àæí¢ÚÌz4’*2—*÷ˆ5ZæœHR¬3~‹“1«àÆËëÉ‹áªq5,êÖÇ8+Ëš`o“®³üæ%,õL¤¥¶‹ž ý¥ÿ‚„éÙK2îW¢ãD»#ŠÄ"w³Õ&âôy0$Ù³¼IG²ØæÐ="IJ@t+¥ËȺ_2 BðÜæ¯¬¤ÿŠªÆŽ°®a¨[zÊÖ%; <'Êæ…ô@Ç/Ÿi@æ±g*øŒ½±ÔÞùiô·‘–Ö¯$dœöÌôö†Zí¶8™ëfß¯Ž–ì™µ*‰ÞTËw\¬yŸòTé^‹½‰åÙö_àË[3Ìk)QÊ@-ËËwÌ/e“'Dv è~›ª ÄÁ &üL›bÑô‰ ·,o ßIOì>¦XSÜD™™çZˆñÐ;Q´ì—ÀÝÆô^´Tf™H™šðqqëb’ž`³(c²å¾âã•ÌÝ9䲞Ê[‚4…•ñ& Pãþi¡^ði<7•Ldo©@Â)ˆ&ªc޶]ÁºêÐÁ——Å*½,–òþÖþ[œËÊcQ\*UjŽE~ýâå»õ¿ {RªÒΩö;¦Ó…¹àüõë¿Mu}èØ}ظÞçÎOt&qùŽëtáºüåðéwcØ£<ÛÕØŸmÓ(7•¥Æô‰/hŸog, J=Ÿi¾±g°2çÖœìm1FƒXV‚o=R9ÛݪIg£ˆ“iȦhë2âDMŒs&•[a~8!•ŠI½–*†F6Z]$A€oq_`a˜y)FXIH>H¥ÂÛϨjŒR/ +É:Q¤ ü\‹=%&Tl‹® {¼EÖð”Ì3:n~o‘$½kÌíÅØ£Ema!˜ôª²ºÄŠ+%QÑPŒsÓ^kÉl  1­â>À R@¸eWà-W%«â¶o’-/Ã\žE“›†8ÆnÀÐ.I–® I–Õ$éT1<Ї$/ß1.Ìý-$Y–cdYô8Ї$/ßq.\w€ø¤k£» V¹Û⯎ka`¿[ò·Úkó®ÆÄ¤^|G-Í ¢ywC–]Öú\/wGXaf)‘N¢ ØÉ²Ⱥì,î˜Å) Úx×½-&` Z”A /?á!uæ+„C·Ý­¥}ËmW˜%;Û‹'É7I¸O§*¶÷|~lkökÙ=P “ÀoKyAW’œªÏŠ]%¥§ŠâT9‚€8UuŠË=äúÓéÂÜР§lÛG@®ßq.\w€èˆÓmI(3¸AüÁs‹šÂÆž©é¶hÁ½çå®ÕÛCUÙî&®5±­_öÆ-«q=”<¥ÌVlö£îûеW˜¬2•ÊK#g‹»—Ͱ%èe_:½€Ÿ!*ýÆB]«ÒõXïŠ!uŠJ1[Ü3yÛº˜–ç]0-/ÆÀ´¼€xù ¦]¾c:]˜ûZ0-·c`Znú˜˜vùŽëtáºÄÓ Õ¥ÒC=¹0{j2Ô!)°EfÛž;QÑÝcÉ&c—¨ÿ›Êª•ÊбÑš]æUjÌ·aL°%“2_6ÇÅRZêþ·Å"në:•éê:•Óuªžgó僾®sùŽétaîhuJé:•ê ºÎå;®Ó…ë_×©ÚŠÚÆ ãAéØÝº€´A8H3Y#<φCÏé†oŠ{Óïó™ÇƬœÚè.Å-¯ÌUçcE™ÛýMõ¥ÑìEî®Ú1zK™ÒÖ|‘Z³Ç˜p6dž›ÅtßÖ=yãY(¼! “õsOU'£ÊÛuJV'ã >ƒëd¸öP•ýP?\#âµ04¬Ñ±Tp8ƒk,O(¡#5/ðÜ<«gíYƒöV„Ï a#k` %6+½êFUµéÜ¢h«q}8JÝ{è Ñlõ˜k…ƒÏÀ–†Æžù [tì U¦ê.Çó¹cx”"ÆÀ‹CÍd••Èq³‘KL&JRF­ùü|/Ãh¾¥œ:ÖÙ£´GLÙVö„›çþΠ"¼ŠñFÝBþ’½F½À§Ø,‰ñ¢ôÀR.üŒC˜°ûúâ?…Ñ3Ì…k©Øv,XPV6ïŠÂ85Öí»Ô‹øî{—W)³ü6­õß÷Æó j±¿HÎMÃ5ÀsÃë–á 87ü>4àPÜ›‚s󼤼¢Úy‡-oáã4ošä0Õë0=áazE;… Ò+^Z*}K ¸¸u?rsÊ…’à`²ªQvDì«ÇÔAM•ÆD$ìI6½öú¡’9§ ]Ju[DI‚¥ÅU¥¬îɆM+¤1ehUvj5`ô’žÉDJÎM¯è9$…ê’ ¨á1ƒçËÞQHV¡„!ÑG첕¶7e›½pÉö.×½Ó¼”Õ’ÂÖ7UÆ™å Ÿ1–¨Gê§¼”€gQ”ºš#^Z@»ZéÇÕ ÕÙJD²ú¥w¦ªe ²â)MV¼êЧª™ó|$>¦iÛY25^)`ƒ?´(ëgÆxÄ{¸ê¶+zìMÊb͆‰”cœY ™½m°„žª*[åöyŒ™pM)ý‰·p§2f¦ >­ŠÉ‰.oAõ¨Î˜\ð8™ÆoJ@Oo›$Ïû¬ÿ:”Š®“ZÓÖ]Þµ@W·ea]Ùâ#{KµSµkè¡9u[jæ‡oV¦^HeÌ ”nÖÜ!0ŒŠQ`*1µ}™˜p&ï1³b)X †GÌ\YÑQÂË!š“ƒ²82y<ö% gG^7^³3šDO‘bhTŠ&KÖÅmS†éT ÷³5ÆŒ°ªÚ>dãòx:îüÒHW¡‘îÍõ8 Þ/¤lëš…=Ö`48?Ó‚|¦yhF˦SjGGïLVMS‘èA]Ãh°jÓçB¹î>$+ÇŒyÐüô3LØ’pìŽ(“Å,"4&iì|´ÑC)L<[ª´Q;‹z) ëV@‡)³ˆâŸÎÄ(Îse¤ecø«î0€ðñöl.f<ʵæø\GrCð(_²ôµ<»\Ì]ðiÀíD†óÝë#"µ _'ïêì5£kzI¨”²³o’²ö¯õލW"*ЋԣȬø@˜v“‡ƒ Kb(1r-´m%bÜ×9T7Xâ”7O³Ê–Ë{'‰Wø¢Œ6"|ÑsLegŸ€õ»àGM5®æž ×ý/™³O™Sdfs2çÃæ‹a‹ÈuʲèË ŒÁ˜eÍÇ·˜¢y2ž¦{Å0e æÞƀόv·M·ž}â:£”Rý Ìòy/÷égûò\ l‘e‚«v‘gÑS25(¦uhÚÂA‘³gœÿœßÉûÊ_§¾0cMÜ( Ì)Sñø‘ÐVŠo´ìr„êó®Oº®mz×RŸÝbØÒD_ëSÑ/‘©$Ÿ74Ž™òð›Û—æM<…óöcJœl[ítð‚Íñ뾜Ð[F^CáÞà3ÍaVA¯~½ÏÜå÷óŒÛ†3Ç­sb£ßÂ7ZM Ѱà‚wÜõHÍ3ð;:Kë#2s§ºüo—à¡×w0ø$'üzüzøÌœ€Â endstream endobj 1941 0 obj 6960 endobj 1945 0 obj [45 /XYZ 38.2500000 384.500000 0] endobj 1946 0 obj [45 /XYZ 38.2500000 384.500000 0] endobj 1947 0 obj [45 /XYZ 38.2500000 131 0] endobj 1948 0 obj [45 /XYZ 38.2500000 131 0] endobj 1949 0 obj << /Type /Annot /Subtype /Link /Rect [422.250000 146 485.250000 152.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn6 >> endobj 1944 0 obj << /Type /Page /Parent 2 0 R /Contents 1950 0 R /Resources 1952 0 R /Annots 1953 0 R /MediaBox [0 0 595 842] >> endobj 1952 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 1953 0 obj [ 1949 0 R ] endobj 1950 0 obj << /Length 1951 0 R /Filter /FlateDecode >> stream xœí]Mo丽÷¯ès€é!)J¢€ ÀÌx ‡ÆÈa‘C0›M°Ø]ÄÙCþ~Ô-©í–úQâs‘bÛZc×^ËM‹õŪÇâÇ?ûÇþ_¿ï?~ùöŸý÷þû—o;u¨KÕý³?~}xù ãýÏûÚ•ûï¿îžöO»‡ÝCûß§]÷o_þÚþô¿½Ùÿ¥ý÷çýoùcÿGÇ?øuWëºýþËé{Sëö'uþ~üý¿wûÃþ·ãˆÃëzb.ÿÿƒ-ªæDÅÌ›ŸvÃ,õéë÷ï¿í>vóz‰«‹Fíµ-ì^7ÖìÿûÏÝOíðÃàêÐX­ëÊÖꯩÍðÓþ§hšÉkN_ƒkñ¡kçb }¢Zšº¨´wl¹%mtÙ±ÆØZœ9çÁÅùîtË¡HKz¢Zšý’â±Å–Ô™ÂôKªÄµôypù%µ6–訖æG·¤ž±å–´,E*§öýµÌy\|èÊU±†>Q-Í~IñØrKZ.šá}\žï³±†>QÇðzÆ[ÒÆ½Oj'Ì›ç±ÅÙÞ&–þwT ³£[ÐÉÐC`2ºß€ýÉóÁÏ»÷Ú¶^@WûÇŸZÒN¯ì¾=¶ì(÷\mM±üqÿG¥Šû?íÞ5‡Ê”ý“ =Ñð‰úŸ4p4ŸXH¦úóéÉ×Çv!b3±ÝãÌŠŸ¨Zò ~ŒWŸáhø=X(ðLe—>c±Tø36Ïú˜pª=kÊ̇—Ñ$ ØàY{p—ŽœvƒÏL¡ÏhörveB 0;v]„F$…»ê0É!‚7kàzá0uB,5NdŠÑ/øb«1ÿð{âERЕÕȦŠ{íP‡ªÖGƒ.ª).9÷ ŽÖi½6ãP ¼vø “ž!¨±8!@ØzÏÞ³Ú^²Ý…ë?‰8Í-nð¸9,øpSÇŽcB¼=Ÿ‰ëh™,“éžh=Ì}ÁhæÁ¼19+<õßÏÑôî´©ÜRwêa%£–AÃʸ¡£°”F%Ê|R!) ‹ßGó¨ýêÜÁ ­'.|ópT4Œóð»53‰Ö™r ²º -`ÈnOCVпÆöD}f²>;¢µ¬qx(Ó?——\Ñx½™= a"(gED±ÌæI÷;ñé=¤H §>ÕKFLjȳ겡—li9C ^-êL´ö䈰3ÆŒWÐÜ/÷L"I‰Â¦Dvw-bc˜$SvÀU|Y½â÷“Ýj9ö«É6MX~ ø‹g[ ¦Y?øgÂhF‡e¬Ö"\gò•Âr¹d8+RHU„¡‚ÏZT¼ê"%ÃÕ+STLûÖl×rûÀ ÃQ¦1á(ª³=ïKES˜ ÿCjŒ’1aºkÃ$:Ç¡Ê-lÖ¯=F„¡-Uæ¯Ëdh±“…ŸËµŸ* È"øñ4ºðéZñc­lÑlDQÀÑ—^à<%·2gbå£<ëe~yÃä¾0Àal¦€‚©­QûRìPÐF©01Ë t¸ÚûŠb›P2ƒBÀêÔ¬X"‰%<¼h48[¯Kq®º±CÏEÏ*ØŸi€» *HÕpRmð¹”\fšdé«ûÒ5ÒhÜ9"Úæ×ÓtNÛÓùR´)†%$K¯Æ†2>é9ƒ©îù–@,]ëÕæµ$™½vÊØy¾‰žê´X˜F'ØËànXø-¡s·éw»~KO#Ù†’s«Düí‚&‡É|–SîÜ䯎°7#ôˇ¦ó2¡Sµ„è›ç¡íi}ûD²„*£Õ}£]ªœÖç6~éB]ÌoáµÆrº9Ûg˜—•ÉVâ$Fc‰Âe0­~kËÇB.‰Ö`™30T1ƒXI{×SÐkúÄO†¥Åp^[ô|¦šQJ5X^#O†yž”FS®ÈÜ®ˆÉ)u}éÌ¢tY|Gò•so¹Tk+/È!;:‘%(1Lh büƒDOŸdqW"”<… Å'Ö<ŒD8,{rÙ{b¦ÕM h"ztjg“ôªì¥‡>CØt¦ÇMžÂ‰Ä”Áu3‹å¶œÁÒ&óÊŽìé’­YÞ¼gê*àŸRéƒD­9¢xýè¹;£Ík$ 8·£°ŽRV¸Mæ‡äŠ\]»Ka±0 0cF}Z¾y úrÊÚ+v`¶0`–Ü™‘®òcܺP"r ÓvƒhˆR¥†€o‰aài¸ˆ‰ëbÄ3øb2GSÝmƒ ÓxåðG¸X&òBw4ÌÉ„ðáº2^ˆˆ€œ—^Xe0móíf±…1óK\lîYzÈx˜¿‡€fáÅÊYÄÕd„ÏÐÆ¦Cñ ‚Å+çqØxãøK/Á'·)oXv.{náŸnOÛnjîigÉiÔv¬x œ_«è™Î9·"ÌØZn3Ç·› œ»н Ûç-pÞçgÃUÉÐõV_¥‡¨ÙsцžéÕ&ŒØfj ãÇe¦Ùb”²R\YÖu})Z7€6Œy7°µ#MÃ%6¦1+sfAâ¬Ï´bª«K:÷2—^KΠ€Æ©ü™šè©L3R µN ¬û# ÷ÛUØs„á96tÌ‘ÙÆÑi{ºÆ?;+zc1Rãg"{T6‘‡xE{öøº_õø.Ð9wéS]wžÁ<ùDÌ/È\‡{ 3¶6î‘AììNÓãA„ó«{eO–þÄò Ægp¨ïVc†G¯ó°ÄŽ5ç¦+¢ýÄ×+×]m&YXT³ËÙtxòp+vŸoì%{p;›™cÎ# P‡sS¢Ä®{½¤Ç¯6…íò/‡ÁÐæ-†Á¶0È•xBQ‡£US] b¾SoF½ÕD:›aÒDð LD´º÷Ž2™Äý‰2:œr-±¼¹,ay6d‰’ÐT>Œi*¹"Ä\åÍÔô°2È6rå-^Lß犑”Jì<+„=ëê1oÈ&yý‚Ò[GŠ4ª¹©MX’¦­/õ|Ûš„šÊ²(G¦2›ÞÌZlòÎÌ4ç ¥ ŒCñ™Tûúàòšù¹Gs·ÑÃ4§/g¶>’' Ííq§²ÁËêþ.ÙÅñè“ gìZÜz©§ÞLT¢CB@Y|òMe²“D,µ¹4Ìžä0q££ç |ù?ÆP‹½Qê¥D[ÃT`ÎõýÕz˜°È [‘ÜN\kÇTQ- î„ë-Á¯˜T¢HcTªW+s|Bö@ ñŽ Çlê‘OaðpÄÅnæïYvÑÚKé u¿YÄ\R¯,Ç;Uš¿ê¹«^cˆ‰]•)àßٮꬴ\é©\Äã(­yØ ŒÑÍËßü²ûæQì8áDÃÂ0Óc¹0{D‚lf‰šî œ!޼:™)­Ï½ pç<ãâÝÎ3ãÌpôþZ×—ŒÚJ0±Ï¡1!>s†•Ê^AV‹æÜ›«­RNH(]] ¼ñ¼·•WnV7Uøgþ ¾w¾@Oz®_»¦žêPhsu[}í3QïÇ£‡uhÙ{ª‡øî w ßð*èŽy€)è5öÊL (‰Z¬=ØŒ#kô%7®DÕÉ’Mæn#WÑ×|0g¥_‘áNô‹úÛ\ªŒ0ÌzîÀQÌnb]nã…5À B•¸¢\&#нƒHÀJóL³Y«/E1ÃíLáóÝ4sòd¡ /\<—]ÑKÅ(ì ­ï}¼¤.²~ç)Ͼ£zãe|q« E÷èL÷²©eǶ ‹hü*•2£HŽ9m,ÚIÚlˆ::Ot$Ú÷êôÌô\^b‘½­3ÀfxV98¾¹éÝ´ìh·'2¥*ªU©ì峄C wÑó—FŸý\Àf™ Ɖ%»–8Uk‰åItw7¦:ßuž6'Û «\1K¨çpR*&Â>NøR5tŽæ¡ ŽVà¾Tp=½¬à|˜[²Ò])ÓjMþò$Yûµjßë%ëaîø wæ¢(”>n¦÷æ|">DÕ±±¾båº×Ì ¯õòI§ÃÕôIÏs¨Æ%>£aDq‡ÞSÌ¥¢¯ÑvßÏåpæÙŽ]&Úªé{ ǘ$ì–®LCãÑàgz‡¥ƒ¦^?‹-+pÇŸ[Ї…†”ã…6%±Ðwá ­ç‚Š0 °‚àw#Qó¼ø+Ò¥üD VîÐÁ.e*½yqÁæ¬%|Ø?ìþ™/õ endstream endobj 1951 0 obj 4171 endobj 1955 0 obj [46 /XYZ 32.2500000 721.250000 0] endobj 1956 0 obj [46 /XYZ 31.5000000 722 0] endobj 1957 0 obj [46 /XYZ 38.2500000 687.500000 0] endobj 1958 0 obj [46 /XYZ 38.2500000 533 0] endobj 1959 0 obj [46 /XYZ 38.2500000 687.500000 0] endobj 1960 0 obj [46 /XYZ 38.2500000 224.750000 0] endobj 1961 0 obj [46 /XYZ 38.2500000 146.750000 0] endobj 1962 0 obj [46 /XYZ 38.2500000 533 0] endobj 1963 0 obj [46 /XYZ 38.2500000 224.750000 0] endobj 1964 0 obj [46 /XYZ 38.2500000 146.750000 0] endobj 1965 0 obj << /Type /Annot /Subtype /Link /Rect [402 539.750000 459.750000 546.500000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.swig.org/mail.html) >> >> endobj 1966 0 obj << /Type /Annot /Subtype /Link /Rect [484.500000 539.750000 531.750000 546.500000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.swig.org/bugs.html) >> >> endobj 1954 0 obj << /Type /Page /Parent 2 0 R /Contents 1967 0 R /Resources 1969 0 R /Annots 1970 0 R /MediaBox [0 0 595 842] >> endobj 1969 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1409 1409 0 R /F8 8 0 R >> /XObject << >> >> endobj 1970 0 obj [ 1965 0 R 1966 0 R ] endobj 1967 0 obj << /Length 1968 0 R /Filter /FlateDecode >> stream xœí]ËŽä8vÝçWĺŽII¤Ã@e= xa Ðx1ð¨ñ¸1˜¸< ÿ¾¥”¢tâÉKJ©.Ìd¦(ñyyßßþå÷ÿ<ý÷?N¿}üýN߇Ÿ*ζ*úÿNÝ¿_¯hw~?YW¾ÿxúyúùôõékûÿ?Ÿú~ÿøoíoÿwÒ§mÿ÷×ÓŸþ£}øçá¥î…OVÙöçß.?«Úߊ—ŸÝó?žþý—Óß»Çá†ÉLÿþµ,ëºîfqcäŸOã*Õåß?¾ÿýé·~ýQƒ¸Æ}R¥)Oª)õéÿëé/m÷cçŹ)•²ui‹7 cu7Ž«OJ7í¶T³Q.ÿ$úVâ]—®HÕõeÖÂÛ¡L­B]Ÿ]=üçví¨UE¥r§tpÔ…Sýè¢>’«Î¥O»)´kRu}™µô~\ )Ô·Ü‘š2ᑾt.¿ïU™ìH/³Nt¤¸o¹#­‹q׫92xëæ¼v.Þµm§›¨ëˬ¥÷c8RÜ·Ø‘*¥ôxK éÍyí\|ß•Q© ¥Ÿµô~ôG:ïûkDxýÀWþ |øüíé·/-¾«OßþÒNì2^ÿãÛ§²ý£å:J{úöçÓ?…6ÿ|úö×'Uœk«\Ëmw¯]Z”»´˜sUÖ]ÃkK¡/-îìZxÖ×- ¶}onE'ÅÇKKy.MÏý¿¶XøM [JØ3Ø›nˆMÁsÃ3˜m$\ºRýÙš³ÑNéêmKÇðX <0…g]Äo$îY©!fPïXô—õw©\Ÿàrʾ“j„‚Uù|pð›4÷ß(5BÕë!|&n'ƒÏp0ø'€¿çÕ¯–UüL`€W ª¬‡‹\Ì;¼7Û®›·ôó·–ª¦¡ˆUé¦$‘AgF­¾ŽEé*&oø|dð›ÀÁ`š{Óv5ì3“e <­Þ1ˆôãøH?×K#yQÊ4_:Chg·†à "X¥À0ìfˆ0¾fp<ÜY Í’a˜Bæ¼×ýÀof-0Á[à”޳ž‘¼I”ÒFU¨Ê#ކÈ|˜`åòq2…¨x(,GV„°î?Ü{x<tï<’¬|%{Y†ËŸª³º~ În¡ž À&d"ÊÏRÛ£Êí½‹R5ãï%èæ|™Ëdq j®WÔ7ÃV-õV¢<7óœo«Œ»9QÜRà­‚2\Ô¸oàÆk|Œ²³þgð?7 \,çì “ ÈáîÜçJ-Äýav'â‚oð8ønÃÞsƒ½™~‘ªÂßÀõ0§mŒd>åù¦€ßìàf5ùˆ^5 “üIj:î¤ËEÑVus©t5Aù"<ö¬˜ÏÍÕçºêçùzl~ÓÀoú«¨ìLH4Mª?ZÑÛ Ô-´àÞNÙžçÏú ZÏ :š Ýõ6€îÒî|„-p­ÐŽŽÖ¥…=ÀûVÖÏDoð4sÚƒ‚£^q–ƒçÂ@^‡ã£ÃYeg¬‹ÍK”XŠ[obñnØÊf «zž¯x¶.¬€ëªԘ™l®ž£Ü•V…Šê¾½Aup@QŒ["/ðQn®ò +0äc%c€Ê¥ g”cŒ«a[ˆ¦x´“ÒS¡7Ƽһ‘—œ{Ï0ÊpæâŒÉÜ}pàbTu.—ø{ë9¥Ç¦×##|‹(n€1ÆÌŒ#ŒlyؘÀX}gÝGPMŒè*CY>…7ý¬SMÑQ ¤”›3ÙZ‚£ ÜEfÛDiäûñ¨¥ eCŸ@ÕÂGj ‘q)£ÃkÉB¥(çXézfŸ‘Y„—1ã •šu·ºî ¶V/ÛSŽìÙL•d‡iësäâ¿Qà7 üæ…Ù›EžôçoÏf¶Ù_Ð8Z¿°Â»9ª»æßàqYšuÆÑ°%°pno^”Îý¶­ù&°;x¯ŸãWØQ¼ÒA­ZwkÍŒ*y£ô²µR8Î(ÞÌat@Êžíµ@ØÐKr…h]:oþ©Å3áÐ…¡;S”æh¸tFÙóFiéX°«$fg¥’ˆ¬ºg9 3#]ÊxÈ3œ ÌŠàÎ(X‘SDÐ¥peðs¶Š‹L ß4^“T#ª=‚Ç8‹êvb.–´ˆØëqoÌ­`¬] ¹(ê£<–™+%*N3Ô™Íò)ëb,ÏO‰ ¸RÍla, O;Óªšëj\ªL¸V«vvð¦©=+›‚ƒ`Ü@Ãd WÚŽÔ¡®˜–|ðunÁ๹ÿE´Èª¶e\àÒ·Gµ!v»Á^É/?Ã2y켘âÿ†â¯~IëôŒVFq˜»ÀZ¶B*átA­ c—=ùý¨JMOWX®‰IÄTe= ¤&’ŠÅLq³” Ÿ>#íÊzÃ@ªÀ™²Â(.Þ{qsWX éša?d&-Å­˜õ% gs» ä^“à+Í= eR¨N´ŠxjèÄÛ%ê‹¿aä¦"«l雚ªUÇ’)~.3•^IgÆZ†<>•E$qåLå©Ê:øRˆ  ³3³f¢à6 Ò•‚:ÅÝÀ"ƒÙöGeò[ÕâKÓråD$îËÜwZ”$åª~@!ßC"=$R)/¬@en¦®oÚȽ-=¬1ṳ̀Î:®Ô¡äy3¿óþîÀ¥&±Í6›†“Ùd× Ì⌸¥iKG½!;mJ}®êN\¼õ €jaï1©vrÃ0ÉI›⬃<C7.9•^+XÕo`’(?‚ˆúŸ›àw`fyw?Æü!ïïêfïïl±ïï¬W˜¡{àÅû_Þ1“.ÌõC¼¿«ÝB¼¿«½ÒÝ/ÞÿòŽ›tá¦$÷oáe<œ¦ŠþŽdÓQx,À‹2q;"!ËøF¼%èMY¢-.«xÀxêÕŒÜ”Ø Š ¬e>“Ù€â21ƒÍ`›Çq‹-«)Ã8CÖ…#æºCL'Æ/97å—\³Ä/5^’ÁîÏ/uï˜Iæz€‘_rv‰_r^šÄîÏ/uï¸In:@z~©)G fÛMÑ“{Àd“û÷'®WÒ\y¸F¿dІžñL-ëÔ¼—ÕóŠ8@$ædDrßÓcªÔÇ(§™Q7ËlÅbî1wyÀPÄÈü"ÅO2¹´—îÚ¥A¥*ì”BQYˆØnÏR Çå˜ñc½DʤÔÒ?SFplje(…›l†lÌLeŠµÈÆÜÖ£4%›;ë ÊÙÀ+`#òyls›W®Äòè9ü(nz{]Gb ¡Ñ<‰U„ð›;¡|†Xªm…#A¨ã&Ü=…#3‘mY߀ÕfæiDxÇ›1{¹­«ÕŠºL¹_D$1|"Å©ŠtŒŸŒ¨O_¶P¢ý){e:‘5 GÓ‰jcÑ Hš^¡PµŒ`tî©Ð7#pD1Yk\®ª_i³ÉY²rc"` ˜dˆ¢¶–w,þ2Žho°P§WÕ9s{{r…0èL6¨þ–êto¨ÎKfrT »% ß^1ň ë%€`˜(¦´ákŒ‰F¤yꌢJËÊΘ|깄1ÙTËLôÌ>(ŠLHFëºò8ÙR<5kñ½„Q§–ÄÙPýu »2¦AQ'ü\yÔŵ æRÜ•YD–¨¤ÀƳ5‹Pë°¤Z%›¦žbÉùý'tËœ0^ÛŽ5Î"GyÑÊú>03æœÊ­P\JZd•c`ŠR•º~ò·§ßWÅ¼È ×•ò>—)õÀ@Ë'¢•‚6Ów(Š„b˜`t»¾^3¦ûç•·úr\ÓkmJ³ùµîæ0åöÅœÝI5˵ËO¿6í–¾¨éÊl{›ü ‹Wg=3×»øo†•-}ÓÀoÊ"î]œAœXh)¾Ä3^]=¿º=è){n´×b`oìËÑÏaÍJaoÃÕ]Xé@çë³¹\µU{ úKmÏf†,êm¸ºK;ú¶§˜ÞžÂ—Ô¢zg›hoR­F˜ÌäÞBéyà8”±W4Ç¥_dâËeãEƒ°ïç˜J¹„ëÍy :ÖPA*LÞ‰Í ë‡·AJrãÜ”Þn ²n KpEx¹b˜4Å>÷¹·™uûJgdòÊ3ιآ6"s TªQ¯þ\ Ï ôT!<ReÓ¶W Rªœ.®9÷BÞõ†XÔ2ÉB‹½ ÜãRË8N?ƒ¶¾Qñ3@lé¼o¸·°ö˜5\)>Ó²_¥Ç‰~ˆ—áÎ--Ž1ý,yŒ‹®gÀ!Qs \3¸RÄ´Ê.Vàâä(Œ„ ðÎBÍÍíÕáã›E h b’Cl`Ö˜èá[O´ Iëâ0ì _&ƒO` ¾fM>€Õî®vÏÀ£ÿ†÷ ƒ¿ìu6˜·Ì„PöqeJ{×WÆàǸ#!ŽáoðÕ 0üñÅÀ¡‚çSâ½Æ»Cˆ<˜6æÿ°MÒh5qÉ ChÈbЧI¤X¤ª)îÙuèåS«Ád‹éí0sÀ¡%ƒŸÊÀh÷zÿõÅ|×Ú÷¼ FQ=%x‡y‡#@Œy'£ÉÁØÃä°ŠÏgô?ŒDƒ%(~b•i`„®zç ÓŒ®·R@Œ"tÈqM”á¬5Ö½ïe¥9޾TúæÑÕñ²LǼ?ÛH‰Wú`vÜa¥Y©*nõXdÃíéÔ‡ygÍ8‡yg'ºêεóžvÏ|˜wÄg°‡+ÓÕÿ¸ç+s˜wókÞ©ÜÈ·ëZÌTµ‘dï¹g¨tl¢Uå·Ë Q,ñ†fªš}X4‚sKê&L0c®7*ï0E5u<ë .RV«-­.VMéå¶©EDÇnê¸=ø2,˜MÙÜ„ÉDˆª¹’ o¢GͨûòjÉc§ÏÏg´ ׿° ¯™ÛaAÞ½¹® òWšåèí®,ÈusX¯ævXY@²ª¸ ×ù,Èö¥¬xÃpýîá:¬§·nd9³¥†Mýˈ‰Œbv–×…’\™2­Lf®LÙÝ63@<¼zGf—pBæ>1ŠÀ' V a­ƒ($TB™yM]ÒŠÒ;T€ï ° [œ(V%—éÙÑÃîÌá¾õD˜²¤0L™Håå=Ã*F|؈„9bÆC6I&ޏf„ÌŒ1¸qCËzÓ4Ͱ¬g²ª¾dÞ%p¥&ÐØlÿ0C2³NNS‡Ñõa8®ˆ«'«–• …SºâÞ°c“¬ŸÑÜò§H«:î•~®XaœÛ¿ê8i¥h;ݨôdUi52‰‹OZðêŸN×pÏ&·„‡­u³_«<òtM\ %2$?B£ù >F©k…0LÁæÇ\r+%™­¿”2±,Xnbf¿¥ÆÖkÉÜ}ÙrD?™ ´’YzwXF×á|Ï_î¨ÉäQ2J­’ÍH%€pØ*e8‡˜‚:e2£ä*êÊQ÷š­4*S²´ßÁ…¤¸4ê ®Åó õ¦ØSü“èMk87¾ @Åß…VR¯Á=HQêui T•bÕ&n¨Ý‹Ã6LÅ µ²%K‰*à”ƒÕö)˜#‚è–N´¥L°ÃÁ¥GÄd^QR‡pf F3’Øý1…Åý®<²²YJuÑ`ˆy!QŸœ[Üt[:Œ!x—Ü´¶£Z›éIߌŠLvu©½Él¦EUM̬w`ÙÏdxÇšSaÎ ç:SÔûV?Ù››þ„)ýïtåIm²‘[¢,%lˆä­Ág'¡Q.ĸ´F˜F1¢Ü áŽ!½%®òÎDIQºBÂ;+~˜`N%7À%~Á¨úÇ«9Ž¯Ý©)¥ÏÝôN?Æ¿ÍٹžêúòS©þiuª«sÏéÃï-#zVªÑΩñ3éÂ\оÞÿ­.¼ €ËÓI´ï¸In:ÀOÏ¿$¢klÔ˜g: nÛJ¥ÀÐ ·C“‰ñí‰`!gÛ6“d‰=‰Y_.Nu¶'’›X_Z&MNKFÞË„à"¬Ûêð¦È*ê2%C`/˜+ÿ† I#‹Í”=„Xºt˜ñ¿‰­2Wf{_“ûð—;m‡lâ TC»DýÀ™¼ÏÂÁZ²Õ]1t1ìOÚ<¯ÛÓ¬ù2f—Ÿ°Œ5LÄE†èÕk=ñ‹ñœ]n|î„£v`àL±* Ý^=+œ—ŽÃ8$V2æb&"!—Í º¹Š}“ºÊ¨©ºÊè%u•)=mRûÀWWuï˜Iæz€Q]eŠ%u•n¼Ú¾ºª{ÇMºpÓÒ««ÌXã)àQÆD¸ˆÚ$dÝÞ±ut3Ÿ¬\ù+"(8å—+)^ TÆPI&³ ã`!R´FV•ú ù0{ª>jä•V WTZï}&#Lb Hî‘A°ƒo;cÆÕÒParGZ¡ä.X"¦JQ”€âͲE„à#F7üÆHÁ7IkU1•Ö*µ$­UƦھ´Ö½c&]˜ëFi­l–¤µÒy´|i­{ÇMºpÓÒKkU=ž“Üï1ÐËe˜Íb¡†ôJô­p®lzPY¦†©³Çœ`À£‚¹>8ƒ’];3PÅÈgÝLɧ-–ȧÕukøä³{ÇLº0׌ä³vKä³¶ÞíŸ|vï¸In:@zòi«ñd#|¶¬ ,$¢wrÃ00ª,Ù\&÷á´?ŸÆäDát‚lRúW&‚q©Ú#ê<8·™·ð†!U•ÑSú6¦¡‰ ¼ˆq~Š”q‡y0#åÂr ÷~á”fëIFâ +áĆLðQ¾ŠºÀ¹Œð™*ê0ãÌSîÊÆ‡2 )+­ËÆ¡Gsú)Ó·÷aJ eµgØ’@ÕùÀwðoW87U¸fIeÐ(O¢oø*ƒî3éÂ\0ª œ]R¸Ú }à« ºwܤ 7 ½Ê y©shÜw¤q•ø]ªÑïÛýâPÆp|“ŸñŽ–Õä$I¹“2¥eã<ºs8’¬@T`Cµ^ðQ€oŸ'có³F«²™î)…IeKn1x%S„ˆ°Îâð{ üR× REõ‚`2Õ À*®–Ï0·rÌ–ðÚ‚+¨ÀÊ3¢Â†-*2p¸U­¦ì¥J:p¥x=xn*?pnÌJ•Ž>½ÁÝÙMýŸÔU~TѨq.Øy—¨O@u„çA ˜ <£„ÿĬÓú`Îâ®D&_a*ügûÍç}ÐR:ó¥Gïr™"Ê=ÉzA0Tâ’É«—ÑÉb]U EÚ>¬IÖœ"R€ {«äÒëË:+1¶0ä¯×çÊÎ;w¿•°æŠ¸Mí‰ÎÐí™A+ӱʜGùIÝ}/y®¯©åÁ茮4aÎö5•¶Ü¡Ò¾ZÆôh{¡Þ¡yF-\.}ƒ{S8ãµ¹ÆC*x1±P·îË&—!µùê%gÛÕ¤Sª¬n‚ßö©ƒ9,ªá7œÁ€-¢®ÓÀå/µ|„-Ÿa‹- ¶4p`Káò}]Þ<úe™Ž{1ýⓃû6 ‚¸½†ËÆ0ŠášQ!QAx+áJ wð­ÇÅ|!Äk• \t¡pÙ¸ÐúÎI¯`çİÛÓ©šÛç[0ì”qrš »ð|ÚyÇwöVà»À¬ßz‚ûϵo Fbpb€•bØ/¼;xnø0À–ÀÉçsz/¨¦ýwúÙâ” Êùzë…B¡[ÂGF™s¡:燓.§k]Òôç`Ä›žšè³¾(èç'TÏ[„«Ïµï|1P†%iðÇÜòXšÛ—a¥³0ƒ,‹•÷åë” 8ÙÑ+g¶ÀÔ±w–G–¡po𛼨¨¥ÛW°e®û½ñxÐpæø 5¶ìÀƒ6 i¼ßl0°§€…Ïð‚8|À —®oåÅ:ÒPpôRË-'¥%À…›¯0HãCÆX%<0êŠâË×c®xjöŠÚÂ{çºé]…Hy¸‘9»EÊN_ŸþRb> endstream endobj 1968 0 obj 7427 endobj 1972 0 obj [47 /XYZ 31.5000000 158 0] endobj 1973 0 obj [47 /XYZ 38.2500000 764 0] endobj 1974 0 obj [47 /XYZ 31.5000000 620.750000 0] endobj 1975 0 obj [47 /XYZ 32.2500000 156.500000 0] endobj 1976 0 obj [47 /XYZ 31.5000000 620.750000 0] endobj 1977 0 obj [47 /XYZ 38.2500000 764 0] endobj 1978 0 obj << /Type /Annot /Subtype /Link /Rect [60 584.750000 136.500000 591.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn2 >> endobj 1979 0 obj << /Type /Annot /Subtype /Link /Rect [60 578 85.5000000 584.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn3 >> endobj 1980 0 obj << /Type /Annot /Subtype /Link /Rect [60 570.500000 123.750000 577.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn4 >> endobj 1981 0 obj << /Type /Annot /Subtype /Link /Rect [60 563.750000 162.750000 570.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn5 >> endobj 1982 0 obj << /Type /Annot /Subtype /Link /Rect [60 556.250000 96.7500000 563 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn38 >> endobj 1983 0 obj << /Type /Annot /Subtype /Link /Rect [87 549.500000 164.250000 556.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn39 >> endobj 1984 0 obj << /Type /Annot /Subtype /Link /Rect [87 542 175.500000 548.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn40 >> endobj 1985 0 obj << /Type /Annot /Subtype /Link /Rect [87 535.250000 153.750000 542 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn41 >> endobj 1986 0 obj << /Type /Annot /Subtype /Link /Rect [60 527.750000 117 534.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn6 >> endobj 1987 0 obj << /Type /Annot /Subtype /Link /Rect [87 521 163.500000 527.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn7 >> endobj 1988 0 obj << /Type /Annot /Subtype /Link /Rect [87 513.500000 253.500000 520.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn8 >> endobj 1989 0 obj << /Type /Annot /Subtype /Link /Rect [87 506.750000 197.250000 513.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn9 >> endobj 1990 0 obj << /Type /Annot /Subtype /Link /Rect [87 499.250000 135 506 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn10 >> endobj 1991 0 obj << /Type /Annot /Subtype /Link /Rect [87 492.500000 134.250000 499.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn11 >> endobj 1992 0 obj << /Type /Annot /Subtype /Link /Rect [87 485 128.250000 491.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn12 >> endobj 1993 0 obj << /Type /Annot /Subtype /Link /Rect [87 478.250000 122.250000 485 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_member_data >> endobj 1994 0 obj << /Type /Annot /Subtype /Link /Rect [60 470.750000 87 477.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn15 >> endobj 1995 0 obj << /Type /Annot /Subtype /Link /Rect [60 464 117 470.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn16 >> endobj 1996 0 obj << /Type /Annot /Subtype /Link /Rect [60 456.500000 79.5000000 463.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn17 >> endobj 1997 0 obj << /Type /Annot /Subtype /Link /Rect [60 449.750000 125.250000 456.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn18 >> endobj 1998 0 obj << /Type /Annot /Subtype /Link /Rect [60 442.250000 126 449 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn19 >> endobj 1999 0 obj << /Type /Annot /Subtype /Link /Rect [60 435.500000 89.2500000 442.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn20 >> endobj 2000 0 obj << /Type /Annot /Subtype /Link /Rect [60 428 243 434.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn21 >> endobj 2001 0 obj << /Type /Annot /Subtype /Link /Rect [60 421.250000 108.750000 428 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_default_args >> endobj 2002 0 obj << /Type /Annot /Subtype /Link /Rect [60 413.750000 153 420.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_overloaded_methods >> endobj 2003 0 obj << /Type /Annot /Subtype /Link /Rect [87 407 162.750000 413.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn24 >> endobj 2004 0 obj << /Type /Annot /Subtype /Link /Rect [87 399.500000 151.500000 406.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn25 >> endobj 2005 0 obj << /Type /Annot /Subtype /Link /Rect [87 392.750000 180.750000 399.500000 ] /Border [0 0 0] /Dest /3#89#3fq#24n#f2#2d#9ek#2d#12#d9t#eerd#b5#b1q >> endobj 2006 0 obj << /Type /Annot /Subtype /Link /Rect [87 385.250000 156.750000 392 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn27 >> endobj 2007 0 obj << /Type /Annot /Subtype /Link /Rect [60 378.500000 117.750000 385.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn28 >> endobj 2008 0 obj << /Type /Annot /Subtype /Link /Rect [60 371 102 377.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_class_extension >> endobj 2009 0 obj << /Type /Annot /Subtype /Link /Rect [60 364.250000 87.7500000 371 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn30 >> endobj 2010 0 obj << /Type /Annot /Subtype /Link /Rect [87 356.750000 151.500000 363.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_template_directive >> endobj 2011 0 obj << /Type /Annot /Subtype /Link /Rect [87 350 137.250000 356.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_template_functions >> endobj 2012 0 obj << /Type /Annot /Subtype /Link /Rect [87 342.500000 160.500000 349.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_template_classes >> endobj 2013 0 obj << /Type /Annot /Subtype /Link /Rect [87 335.750000 147.750000 342.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_template_class_inheritance >> endobj 2014 0 obj << /Type /Annot /Subtype /Link /Rect [87 328.250000 149.250000 335 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_template_specialization >> endobj 2015 0 obj << /Type /Annot /Subtype /Link /Rect [87 321.500000 136.500000 328.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_template_member >> endobj 2016 0 obj << /Type /Annot /Subtype /Link /Rect [87 314 147.750000 320.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_template_scoping >> endobj 2017 0 obj << /Type /Annot /Subtype /Link /Rect [87 307.250000 135.750000 314 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_template_more >> endobj 2018 0 obj << /Type /Annot /Subtype /Link /Rect [60 299.750000 94.5000000 306.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_namespaces >> endobj 2019 0 obj << /Type /Annot /Subtype /Link /Rect [87 293 183 299.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nspace >> endobj 2020 0 obj << /Type /Annot /Subtype /Link /Rect [60 285.500000 173.250000 292.250000 ] /Border [0 0 0] /Dest /#b6#99#3f#23#2dG_#87#40#939#1b#9e#3e#f0#afb#92#96w >> endobj 2021 0 obj << /Type /Annot /Subtype /Link /Rect [60 278.750000 123.750000 285.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_exception_specifications >> endobj 2022 0 obj << /Type /Annot /Subtype /Link /Rect [60 271.250000 149.250000 278 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_catches >> endobj 2023 0 obj << /Type /Annot /Subtype /Link /Rect [60 264.500000 114.750000 271.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn33 >> endobj 2024 0 obj << /Type /Annot /Subtype /Link /Rect [60 257 144 263.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_smart_pointers >> endobj 2025 0 obj << /Type /Annot /Subtype /Link /Rect [60 250.250000 189.750000 257 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_ref_unref >> endobj 2026 0 obj << /Type /Annot /Subtype /Link /Rect [60 242.750000 151.500000 249.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn35 >> endobj 2027 0 obj << /Type /Annot /Subtype /Link /Rect [60 236 100.500000 242.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nested_classes >> endobj 2028 0 obj << /Type /Annot /Subtype /Link /Rect [60 228.500000 154.500000 235.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_const >> endobj 2029 0 obj << /Type /Annot /Subtype /Link /Rect [60 221.750000 145.500000 228.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_target_language_callbacks >> endobj 2030 0 obj << /Type /Annot /Subtype /Link /Rect [87 214.250000 168 221 ] /Border [0 0 0] /Dest /#17#05y#e1#c3l#5d#86#92#97C#af#fe#88#83#edq#0bGF >> endobj 2031 0 obj << /Type /Annot /Subtype /Link /Rect [87 207.500000 207.750000 214.250000 ] /Border [0 0 0] /Dest /#dc#aa#ddE#b9C#c8#60#ef#be#eb#e6#e7#f3#91#91#92#b8#10W >> endobj 2032 0 obj << /Type /Annot /Subtype /Link /Rect [60 200 147 206.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn42 >> endobj 2033 0 obj << /Type /Annot /Subtype /Link /Rect [53.2500000 172.250000 100.500000 179 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11 >> endobj 2034 0 obj << /Type /Annot /Subtype /Link /Rect [103.500000 172.250000 150.750000 179 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus14 >> endobj 2035 0 obj << /Type /Annot /Subtype /Link /Rect [164.250000 172.250000 211.500000 179 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus17 >> endobj 2036 0 obj << /Type /Annot /Subtype /Link /Rect [375 172.250000 410.250000 179 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG >> endobj 1971 0 obj << /Type /Page /Parent 2 0 R /Contents 2037 0 R /Resources 2039 0 R /Annots 2040 0 R /MediaBox [0 0 595 842] >> endobj 2039 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F8 8 0 R /F9 9 0 R >> /XObject << >> >> endobj 2040 0 obj [ 1978 0 R 1979 0 R 1980 0 R 1981 0 R 1982 0 R 1983 0 R 1984 0 R 1985 0 R 1986 0 R 1987 0 R 1988 0 R 1989 0 R 1990 0 R 1991 0 R 1992 0 R 1993 0 R 1994 0 R 1995 0 R 1996 0 R 1997 0 R 1998 0 R 1999 0 R 2000 0 R 2001 0 R 2002 0 R 2003 0 R 2004 0 R 2005 0 R 2006 0 R 2007 0 R 2008 0 R 2009 0 R 2010 0 R 2011 0 R 2012 0 R 2013 0 R 2014 0 R 2015 0 R 2016 0 R 2017 0 R 2018 0 R 2019 0 R 2020 0 R 2021 0 R 2022 0 R 2023 0 R 2024 0 R 2025 0 R 2026 0 R 2027 0 R 2028 0 R 2029 0 R 2030 0 R 2031 0 R 2032 0 R 2033 0 R 2034 0 R 2035 0 R 2036 0 R ] endobj 2037 0 obj << /Length 2038 0 R /Filter /FlateDecode >> stream xœí]MÏä6r¾¿¿¢Ï l¯øMA=CÃrr¼Ù‹Eœò÷£JM–Xj©º(©ûí¬gD©IJ¬/V=UüÓ?ýü—ÿúßËŸ¾ÿù¿/¿Æ¿¿ÿù£¹:Ó ÿ»tþ˜6Hÿ¾8o.¿~ûøýòûÇO?µÿýýcøÁÏßÿKû¯ÿ»ÈË?·ÿÿëåßþ½müs|¨{àÛ‡®ýûoýßÁ‰ö_Íôw×þÛÇ¿þáò÷®Çq¸8™üúÚXåºYÜù÷ñ-EÿçýûÇŸ†÷ß4HÒé‹ÐªýOÐòò?ÿùñ—¶û±óæ´Îj×<0Œ“í8BÈ‹¡ýâí]8Lÿ‡£sÁÞµ¢V×ý¬¹¿‡PV,öÝþNÛ8¯ÑÓFöí°Ö‡–š„¿Hi—qç«TwÜŽ0Ž·{ß=?²ÐÒÌÇýiCÔ9Þ$¡L%¡¼èË\>Â9Ýwu­ “…ïúCj©ç=ïÿåšÛ—“ñˉ¦Ÿ˜¸$³ìtÖÏO±XÒUg±`ϧY¬vbú’ÌR?ÍbÕଠœb¥Bÿº²]¨gø«TT¯ÎUƒ^–k¸ØyÅ®ÞÆÿ¡ÿ¦³GðØc¤¯>[ûÛ+¶'Käøå—?ý(tÓšöòË_Zc¢røë—Ö06—?¶›ï/¿üùòí„Ü?^~ùëG¸ZiÆ ®¼óõ—öe›hk×…Ò,¥íf©ô8K©ûEû!‡ÙÀ¹˜«´Ã­éŽô„ßàãì7~ã®A ßî|§;J wÄÕåÒ߉#†ßØ«Ãg_1ƒ…ß|Áf°ÐÛWô7„Þdüúê†[·qÔö÷Á¿èÂúÄ÷±Wš|ø*àsk°(‹Îš_0®ÖMÏ/ÞŽïü]?¢¾jåò¹D®(Üi¾Çîįîo¯êÇ/:û<…;qÌUI/ò;èÀq¶õ†Ï ½ƒ÷I¤Ô[$E5þhÍûhtè8 fú;êj´õ93¸íã4.2þx'ßsQú‚ “RjÿÕT_Ñ;»#”Eðè¬) LPÏ LOP â‡í ,*\ðÌ(åžä¨¨PƒòÀ˜|Óñ“Óñ–íÛ™w¡]"a|Ö=‡ÛoÃo:wÑ0Ðz]_w-DpŸoÝ.¨Y»æu>Í*aãFò®íÄk b“×Föµ‰dp¦êÆbK· ¹q­‚ÞaÞÁSÄñÛŸ,…žï_•e v`¥?”/MØ-PóŒ–(ÆÁÏ&\¿\o+-0 á½¶ìS7p+AÂãv Éš"ø-,#‚Gc¾ú;í#^ƒà4Zøøõ½¬!ä‚—ÛsŸ6¯‹ÿr3+аÁ[ˆ PT1+¡QÜjj¸YðÂˬ–ä‚U¸×8„8ÙÂ>gwŠE·Ì‘oüë@†"‘Ì}ÊêÞ`l,Xæ_RÌ=,æ0³>—ż.ZÌU‡ôwö ”ˆú0W–t1aŸ¯¿Þ>å4¤˜dÛ¡Ÿµ²=Æòòm¼vWïw±¶ÿ[ˆ¡5\¬™Ò††_?¬¾ ¤÷b|Fe]¨t€öñáÚô?º€k8€î~‘O¢}Æg]ø|€ß>¾ü¡a (­å¸2Ò'Ç¥Y#i^3’^Û×À—ÿ’S6¼4¾p”Í%%ŠD0;qé8ÛEûýqyf€<3Eyf <3syfFyf2yf€<3Eyf <3syfFyf2yfv”gVæÔ^²ÏÏ‚/©-gtþE>‡œ‘à¥O¸¡P e‡°×î…Å9ÌŠËЛß\­+]Š膀Å3º`÷ìµË¼}[³ÕWè—Å ±U!¤Hˆõª…hî¥Á­ZÊV‹•sK爪h›óìÅR@vŽls•²ÂO™Ñ_)8€Î`K€qKÏ›‹´HZ LA-½¬C)ÑÞð¹ýˆŽƒ§¦ÖxŸªHL‘/"ÛÒ ¤+n Ü@ºùÒH—m Ø@ºâÒÁ ¤›o ݸtÙÒí¸ôÓÒ ò™#îÎâÇ%#w’¹$ÌÇçÚËJ#áÜvRkÌ›[Êò¯w•1cØf{2|qH6%/f]¯¼ÌÅÔgðêh dó™áL$ Ø) FèüãnÉ®Ú+G㑵æ+½X&KjW,½\1bªÃ=œ"ÞÁVeÁ u)‚/}Xƒ •szq¹MÑÊ;Ũ™÷PkšuIzÜçVS×Î;²š*KÉœ¹yýâx¬†”·„ûÅ7 EYkbPLÉç =ð"È)~RŽ ÁÙE!ÍÆIŸ““?au&×톽ô^EZ"’„}ÄλŸš¡ìiwÄ·¯OÒØËt|‘Jr<;•}S»kWlÑkƒ†•B·ßzÃwâèî]à½vïøo4|}l5 «ÖnùO]Òá5ö¡wäê»4ÕHû`¼*¾³ù =çfŒRÌŽä³¢è¾õU?HY¼xo„Wß-/šcG÷ùÌ&ŠtY0¨X+×îÆwÞ,@¡ÓX¦Ûã¼ VÞ/îG¤¨”{J f0ßõ_%µüm_f¶§Œ¶“\æõx ‘TŸ'ÍÍÅZ¹ñw|ø‹â æ-+~ü×^7ª™BŽÛ0Ž0מƒž³€|©®´D+ãÀ"¿(Efyy‰Õ”Z0#pyB(Ê[‚™Ÿ'“rR9á¡2 î ©!¹ñ&?‚SLjóí¥ëãʌχ|}ß%ï™4¸Çšâ«Ú9ÅpAý°*&’!ÌZ'ô!ÏœÚÎb².XíÊ:¬Áh^¾e®E ¯—)”Pš¼ü»ºX÷® ÿ\³Z¬„7¾kˆ× uf’mÜæ*8Ú‡ïܼDŽñ;ZÀ¼Ç­úÝ«Âø^0m«Lpæmq àÜ‚¾à¼ûÃkgÇo^ßS¦]Ú)F8>‡dÐåvU¿Ì¿Ü“z”žd¹aÇ@ˆA0@FÙⱚÍŽL AQ׺{}!âG©–v˜—zC¡Í ûEø()~½W¼—r¢Å±ÉÝ€¹‚ü¾[©a?ß­±¯®NëÖÙ­ Øä-UFŠ×S0 ,[ ŠLxõ-Jš¥ÁãÕ¡àÜb}û*€bä _–¢ñ¹Í? E{>%2m!µ~}źgp©ñ!düâ¾ÛÊ0.î@ñ%óì£GÑ[ú?¢DTÝxð"³½ ûÚÇ<£aX‘‚vÄc,¸´$8˜ ¢ºUou¯œ3ºÙY×c ´N>;Ç5!i^/,¥„YmÃä™N:Ƕæ¦`8É-á»w1|&ÕAySÂæüå! Ÿ˜ ÍæìŽi<쨬çL;óæ–tÈ{ÖoZ[}ü†j )¸¡&"ÎèÀú <ñôÞ:Ÿ0ú0õøI5jXÃȵÏr! Ê(B–·îie€Íñ8¡ãæ+ogj×Ï9Ød¨œ}§U.¦>Ö_Gå¦û§Æ‡4ùÏéî:a˜åøÍ©"ÍN Y'@£Rr¶X¬AŠK›@•»›ïYðmÔ†sk.ìTùÀ\m?ŸVó.jµM{„=ŽsB_@ÂU{×¶[# ÞaÅsçP|Ã{¥ ó*ôõœq d(@—£*S6cmnP‚.¼R·jUíƒUê;W¥ @Ñá$r¦fIhªa<ðZ—õ·ÍÊh@dA2~H‡wº—BÁ¡Bç=¡lƒÌã=)`‹f¥ø(FÒá sø›Î·ä8eRò˜ðÏ5°;U=Ú²õÇ-Õ½Ž^8S:¤síñL:š^O¾:õ,”ùº$Hø2<±ÇÆ÷iX<‹Ï„}ãL´Q²èréxÁi1ÎzøÂ]]¾tü}ê•⪆¯©J5WÙJ䌮ï¹F¤o­˜Aá…YG…*Â,6 ¾bwÆÖGª«ênßV{ ^á¯Ã’ÎîôKˆ¯ÑmqÅ|q¼´kÚ™v®}Ó\½oÜÅ  áûVy±ÃƒÝ³CïÖ_…Ò{1>ãÒ.ú«i€öñázøÑ%û± . køõ#›D×ç»Èßà×ß>¾ü!ûbö5Ä:R[@–­ûÆŒëŒ×Åe­¢È|”xÝ· ½¡ŸK)x‘ÿ×ÜY¯m¿W\”¾¿™$µÀ˜¹¥ÂŽíÈÌÒ‡´áo??$&|+‚21Ñ ¸‚˜ˆ‰¶Љî—v¯|&&|+uçb·,˜Ð61Ñ5Å9ºDL$)&¤i-ÎN¢- jónw-J3‹02mx˜ •ËÉPùêP‰nfdØ=ãÒ.â•ËÉPÙ*h ¶MqŽ6%ÃÛG’¡žjŒ ‡ÎØ£¤ýLll®¦²–Ƚœ¶ ^¦ ‘/’²Ð}a²=Æ3P¢Ð2RßÚ5ˆHl±á×ö'M$Èñ²>⥩mlP1‚ßK8†ìÇÈæÑ=£ó>t>Æo€½÷ haz¸\hîÛÇ3)Ú77)ÚV Æh,0)â3:ïCçcgR´Ÿ`Dãˆõ½ 콕ɹý”Â,Ê‘#Ý) P¢iÙ.h%ÀÉÒF¤ k²t@ K_È FÓ7@Ü=3Ü©xé€@–¶$¥cH3Èý3:ïCçc)8„t^ömÔà'iíC÷:mXËCÚÒ®ÄC:úî£9tÏ <2õ/-à!mJ<ÔŽÆÐ3êŸÑy:ãH2#æ\8lWA*Žc=sg!ÖQ¶3|5uc"•6¬e"kY[b"aè uÏ L2õ/ `"«KLdC͘¨Fç}è|Œ#™Èã…#%zM¡¾ AxÐh7ŽßÈnØÈ.”}kXË^†ð„rÛê±zˆPžÞ›Œ!¼ á å¶UÂ1 B9>£ó>t>Æ‘ š§Ö* §­Ðá)«i9L°îÝ“†%R4“Úˆ×z(i[óTî¾!” ϸ´‹x5ÁW㵜JÚVPÒ7Å9Ê $à8@I;‹©¦;kJ ©Òç.&Ë:t…âŽèiyjx˜t¥ÌIWªéJ(«ßÔæÔ×=ãÒ.â•ÌIWŠéÊÐÌH·mŠs)éJyÒ•v-s°aÁcœ¸-q>0ÃÞ»vRáÁ{aÖ²¤œ`R¹´áa–Ô"gI]€'ÊÎ,É9FCxâðŒK»ˆW"gI]€'ÊΔÊPžØ7Å96)KêÀÛYŒðDVÖ£T#§x|¸iÕé[äi :홨Î69ÕYQ¢:«Qô›Êœpºg\ÚE¼jrª3¡DuƃŒŸQ]Û4Ìqì"ƒc©ÎŽÈ;JŽ©1klbKÐù4©Ëáuí7ÊënûŸ6<,\Èe€/”Æ“]ªr΢–ÆžqiÕ ¹ p…Òxm«8X¯oŠsö© p'(×¾ô6Á÷1å‡Îg¼ç-Ò)Ççá'!®MÍŽ tÏá²Vø[ý;Û¤ Ë‚àsY õ滑.ÙÀúwÃ3.í"^ù\„Bý»¶:M¬×7Å9ºT„Ô¿kß~B· 'Û/£¦à^(6-ï ±!VµlnA”.kýÖð(Q·ú!#ê–]JD RÂjzÃ3.í"^eÕôÚëB5½¶¸Sº@Ô]SœcRM/àH¢–#B/êH:^u;Fª5A9¬áî¡W[Ž#X&Ë©kvàXZ^?ˆ‚]ï²&±æ¬“Ù"5pg|û0NAVyÈjR6·šT¡iÛ üÅRÁ:¤Ã3.í"^ÙÜjR…:¤m«†À:¤}Sœ£I­&u‚:¤ízLuH_,wŽœ&UÙ÷l€µJJßPc­Õž4<ÌyÆäœg µ*¥„>si`­Êá—v¯LÎy¦P«²mUpX«²oŠsÔ)ç™Ôª”ÒÂsYä¸è7ÚšÿH!jœ­Ué)™\íûZ`ϧAâÂÞ0uN¤ õlÚn ŒH’”rFNö‡DÁçë ÉÒ÷¼ƒQ”`¥+a¥EéfÅþ™ƒxë#^Œ¢t%Œ¢tŽ1Ã(Ïè¼q FQúiq+gÃÉ]ø6ž‚ïÝ`¸Ä¥#¥Ä¥¬ô:5¬5AQ õTÛVÕ+¬§:<3ˆ’ 3Q5¡POµmp XO5>£ó>t>Æ‘¢&LõTñ³…( gÜ©H)¹JpÏmI•ã=qÁ§²kú[Y š[ñRÒ†•²@‰¼xiÛP(^Ú¶‚„R%`ñÒᙞ×o}Ä˼xiÛP(^Ú¶6p X¼4>£ó>t>Ʋ@‰€Kª­¼×©Æ¼çzXÌ¥ýà7¬ÕiCÅmŒÕùZSVçUä>ýd«Uµ™(Ø•cl3@~ß>tcKôxO+ä±’%y¬@r²Rz&»gy;õ/Ǫ)Éc ’¬»(ûgtÞ‡ÎÇ8R«©8ìûxØ·VÅSDMi™6<êwW&Ã+SÃ+èWf†ïŸqiñ*Ã+]Ã+ û]ð»wMÃu †O8Ðï®Ì†ûݹÏÛË›R³dIïWæ†ct¡a±+›ãØ•+áØ•8våf8öþ—v1\ÙÇ®l Ç®,À±w }mıO]äop,ûºûG¼W: çœg'˜Pð4¢KÕÓ~•»•ä 6mx˜C|ŽîV¾„îV »U˜¡»ûg\ÚE¼ÊÑÝÊ—ÐÝÊtw×9ÄGt÷ÔEþÇrH˜N7Çs {T x‘·„ÛFY’ÐCÚ°ró¥PÁM7¾°ùÒÐQ¥Å¬‚[ÿL¯Pn}ÄKPÁ­Ý'6_º·®l¾†gtÞ‡ÎÇ8pó¥…ºK–$ *–õ@.B_¥X'zNÆàÅŽS¼8CÌì^»ùÒâ†Ì•>mXËñÔ›Ó²ToNCWˆ–³zsý3GˬÞÜ4ÆÄñ²ToNK ǘ՛žÑy:ãHŽW#¶Ov‘èôË ”m%¹´º¡ C“6¬e< jÔi]ªQ§5¨Q§õ¬F]ÿÌÀX:«Q711ž.Õ¨ÓZÁ1f5ê†gtÞ‡ÎÇ8’ñÌT£îÅ@½/Çgoø2"QÌ @gdÚ°V¢X Ó¶ Óè´èúg‰a3Ý4Æ$Ql @§­„cÌtÃ3:ïCçc)QܸŽ/·§$¤„nñ"qäÿœûDï–8n4Ò†µ¼êMûM{€@Ó~†@ëŸxÑg´iŒ‰W} ¦½€cÌhÃ3:ïCçcÉ«>|:^ÝûÈ\J}…xœý9¡¦:$ð2•6¬dtÓx™iJð2½]¦™ÁËúgzF¾õ/¼Ì4%xY÷À3xÙðŒÎûÐù2ºi&ÈÑSVÞ}9c~›Ú4Í ¬Ir8ÈH2²2Гdä Ô?3p‹ÌÀAÓ7É8Èàë 7‰”ô¡ó1Žä&¹âähŽsŸ‰ùfãËâGø´a-ë°±.œ2ݶ¿”Ñð”éá™MµÈØX7€Uá”é¶ø×ºÈÆÊ|«BÆÆú§L·³á= J‘‚#¡X¥o3#Ÿé4Ç»´áQà194ÇØ4§ÝAå¸cgМþ—v1\™šcL šc €æt xÐ5Å9§Ðœd€ÆŽÐ…žÊGJ]Xïä efn®.»€`ì-šè\Ú°V38p¦§q¥3= ôY?;Ó³fü.;ÓscÒ ®t¦§qÀ÷Ò5@ÍàÆ3=“>t>Æ‘šÁßÇÅð6·j.!q˜÷`FR=UÞ÷a=x”9;ëùD\ÔÊþvL¦iÃÃZ9äu1Mð­Ü–œ)MÛÌêböϸ´‹x•×Å4¡TÓP³k€Z9ĺ˜Sùª•m3á®^3 q¥6¶Í- hEÚP/7°([‚W³áÏXWon›7MýÓk„œ­¾}t0iÀgh+òšV”jþYjþY1«ù×?ãÒ.âU^óÏŠRÍ?+4`Vó¯kŠsLkþ%©ät,^¢b–¸°ž`¸v_ ÞZÍ oáç(>5TÔ í@ÙRìÁ\°“ן7ºsœò1s5äK-KýpRyYD«Je­Ù“VÍÊ"öϸ´‹x•—E´ªTÑ*˜•EìšâÓ²ˆÉG '->‡pÚT²Ž7–CÁ(ðƦ$ê ¤T¨ L[Ha‘r,5œ7¹­¾A&{tÆÔð°l3:—mÆ”dô_ÛÞ‹'3J³±‹x¥sÙfTI¶ 3ÙfFi6v‘¿Á±²ÍNÔ€Ÿ%ûLåÛIÁ*J(ûÌø–mLjo>+‘6<̤.?ðÙºÒÏÖìVëf>÷ϸ´‹x•øl]éÀ疞᳟»¦8ÇôÀçd€#™ÔðI²à’¡P¥ºùkœÿpôʋջP?`wô`„«‚åN´Fc6 7Ç6>mxX¸…üHpJG‚[è«·av$xÿŒK»ˆWù‘à6”Ž·FB3n! >u‘¿Á±Â-ŒQ¼z†ú‚Ñ ~‡·$Üs8Ëqô8) v/=:kÜÒU5,)äëõ.7: ÃRÂ¥ O}jÊ™–•™zø#‰yý™ +ŽGÊIèÛ‡6)M=¢/™¾tBô¥ƒ‘ ×G22•×?ãÒ.â•Èô¥MA_ºÄbº /»¦8Ç&Ñ—ÉêK'FP¸2¨ÇjC&^€7¡$OnáYjä?þÝm‹ñéOc\©cÛ]v^¿ejxXª¼x¦S¥â™OœšÏìŸqiñ*/žéd©x¦“ üÓ5@y(cñÌ©‹ü Ž•‡jD×ãß-ÐŒ½Lاɨø@Ý ™6<Ì:‡º·¯^âèhwfuïŸqiÕΡîN— îNƒPA×ù@G¨ûÔEþÇò™ î/vØ4I·Sö¨µ¼ðÝ(;kJý™õ[ú-& ŽˆÃw¯f‚UåJo”ó—)»Vtš #ÖU{O6/Oêl©<©ƒáçfåIûg\ÚE¼ÊË“:[*Oê,àt PtÚXžtê"ƒcE§Ó0 øÊ+àwH…\îŸ|T0”„ƒ¸ç¾\Ë^nB9ÉF¦ XiÊ醲g!Í¢œ:¹ Ö(&'Á_°Pê çª{ß`Å'99tÎKU¢;)o΃š»ÎûBÊ›  z‡ ³š»ý3}JÛ­x jî:_ª¹ë<¨BÒ5€”·á÷¡ó1LysaJ<@}½$ã ·g«.˜hOUéóñD•!§Ê… n%­Ljžb%s‚9cá`Þ¾§ñ "hE«S%ª¸#Z}Š·B¬ Z}J¹øfVܸ¦·>â%(nì›Rqcßh8Ƭ¸ñðŒÎûÐùŠÖ–ÎFóò©"Ożˆ‰½VzqCû÷[ª©¡¦ u9y_†çmW²ŠôA?Ï&wŽr9Ãi Ã=â}ñ2O¯ñ²”^ãa|ÅËYzMÿŒK»ˆWyz—¥ô/`–^Ó5Å9¦é5Éz_¼šJƒGǵ¹6Aå©a¼±G ¯ð¢ÇñßPRWv*0±¼Wù*JÜšõëpÖÇTHíÝc^ÝRp„MÖÊ¿»߬çxÝôï§-¥ì þÍ6ø?×'C-(EJâk½RÞfö•f&3!äGÊ`Ù°^xLTi,8˜Ôpá˜Mmã 6×,q·„ðB ”t ք޽ÔÊBæ%!òKú¢;m‚yîâ‡íkºÀ”Ø3‡(&YëãÕ ûäùI³òë?£T®y¢÷Rpþ$DÆ)NSc)vÊ@Ùâ½eÕý¤;¾ü£î‰>R¾”?pò¯ãO¡¿‘8¿®7§x Q@Š—ÿ\3« ¿ñc °É**<Ñ(“k<Êyò¤àÁùÐýOºá2öñcjXsÁI‡Þ.Ô_D iµ]~QêC’’èXN=#ø.ŠÂvð®…ÆÜ%«Gay{G †fòf;¹ƒŽ7¥˜]ߣs[ÇîCQ!n•6áUÇ]ÉtËF¼©¸.K±’Š»µÈÈXIw4wSÈécßu;„)Ô€ò{3EE¦øn%S¨Õ—0…î¡q‡2E7…•Lñ\1=oÀB¦KÎ9¥Ö%ÞO©ÓAÁnoWPü èd);¥¹Ó“â_¿]ØP l8^Œ )Inë NJ¨ ÆÞðŽn®#aý.ÛÆ§—×ÚHAê³ÙHò+6ƒ->™õeÝW£>»o•ïOq¸ÓÏa­Ãë$Þà£mEP pÃá?ǃT¶„ðD?—´w^½f,H*¨iðtk ¶/ŽûÆ_ÕÙ‡ÖwfËé„D| ?É>ݰ§"sRh á°‰xŽ—¥ÇþŽÏ´"àAÉšâÅųV”ãS ¡¤O‘Š5­.ªQA` ›Kì¹¼Þ*Å• Åù°×Á{”jµ$,?‡“ƒYHí…¥¦x)>]êH´£ØÞ_:Æ.XõCPÓÉÅ£¡F£®¿½FèZ2ËïÐßô7ñ´$7‡Çí¾Î0rÃw’bþüÎØÜ"“ƉÊÐ]ƒ‡¿ Ûß|”ï&ÝØ[#ú_­¸³0ëZ¥¼ZÝd¿‰‘ª€y…¯#%ö¦øÈc¥o€~·ˆO­½¯QÍTÅ÷¤m)™Œ %L’*=R¢.Hî…Èë Ç !Ù¹„O°æ ɉ›‡,%BN¼ãÚ ­ºáðA‚©üÀff[R áÜYži)ûVŠ\_¬BÆ[£r}·×‘_ { Þ³(R‹àBà=k”GÓü*³€¢XyËY÷LU ÓšÈ%¥ò¥b>¢Ž·ªçi4_ðé ¹©‚$¥¦<%Y™B¦èwÚMbî•éA8ž—ä<Ç+GÙõ²—]öiPV<–Àñý½ô%oáÕ Ÿ˜`àì€[Ò(‘ ~N êâæÞnà­á½¡ôEê¯÷íÒßÖÓ¦ÖÛµ¯ï‚TÊŽÀæ­S< ¦âŸØlÿ\¸[¨#ÈQ.ŽTÕ›ðÍ´'/Ö•:,,~B´©Ð”GœGNS 5½ÐÚåzïEyÌ_Þt¼wï¸(ÞSUXØ,»Vma²ëñm k¼Ók¼-uYæ d~­­1¢·-T’YÕ5žuùü_Í·Åkž}"ÿÑ^e¿q Ç‹ÄåÊ^ rN¯CØ\T6öwÛ†²Îà}Tߎ&ëYÂ5ÁN+‚î~,ú¹!‘e¼ã¡[¼U5(;RŠ4E¯B‰¾>UöÖ'ë’. Lñ¼Ñ½uÛ> Îô”¯CQ¬Œ 3™SG:DE#-PMoŠÞ‚÷¤À·$ãvnÇSeÀ=¥Sã° $nX“49¥RÓ=û·ºGO4á(ëyzÆ[à,‚Z95›'I|CmÛý_D0€Þx«î¼OêøØ ),ôTNìü·»΂í&œ•Z3¸Aïœß{v$è—‚U=ê»…Ý¡·,ò^EOŽÅ톄žQ$çxšc]k:ÓûÊð‰ZcN½f­¡±°û£,"‡‹Š9ïmþ¸zJg>ûå¨k¯2À„=åÂjSœÀ”@y]ho®Þñº—²à=&‡9œ³S“u‡5ÖÑŸ£Ë?ÙÖ=v‰Ä¡¬ùÚ¤ã‰*gáª}y÷‡×&ÁfžjÖ…ã-[Fq§’ T¬_uõÃvѺð!×GõH5Æ×ok6®èÛ»äVß%gÊ ¬åY™+µQ2FÖoLª”Rª©Hɳ6r…5pðNËÙãx½Årç=­a_APßr”K™w{6sÛP°‚”¨¤Íš¸õZ2_LI.¼úF=jf3M¶Ÿ( ³ð)y•ñN[W$þQÖ×§|s^`³¡µ„‚+ØõÈ£BŸôœVÔy¥ruæaÌy ‰â™Ù×÷\s[*4Ø—žÐ‡Å7Ú„Ü+üE!qŽSÖDùú­ ©Ê }×Vßáæåý7S±Ò\ï‚»NP°®î©!H¶3úŽŸº;&R ~½í|dàT •Ë’W8R¶;•cxuÅ'O—òÆéšÉvü)í$:ÅGÿ¬O¢z㈆ñá^R®¡ˆ 3Dáu©^i`¤Šñäæ=S±Ï·-¾¿-ާPQŠV-(%f/kbÇËËϽ‹”()ÅJ[Þ”"v(©ç,Í{(²W v¨¬¡ž3·GßÉFÜ%˽¡+ŸB@)˜ERJø ö²ö/žsAZÞø8¥zÝ^ñêlû§Š©½<€ê€ºz¨¬œ(“ïĺR\€÷TR˜ÔsV}ç-ó…çÓ)tÁ„¹3S Ý`|íàkåãLûÉdßÊbw¢Ž.܉«Uºó½S]˜9gò—f.`Á¦âµ:(/ˆ¾Æ‚A ®ñú6Ÿ‚Tó©rB{FðÖÓ›ƒ„Ò‡Z4û—òáÉ ¤ ×ú@"É»S6úaU@q¢Ú’JG)¶óL)È7ñ 2¡xÐ(™{–¯ÍÚ?—ß[µµ¨Õ~º÷À µçäеµkÛé]äXt!2w‰âæv©20·¼Ê!MhÆÜv~'f‹Ëkü< ”â~ÀÆQ÷˜­4·ã›b+„3¨†GÚÚù FÄmIÜ¿Wx ÷†þ&*±éÕÝl©×ý»¹ÙXfûB \vâ ýÃö…ÆWo¯u E¯yÁ{‹Æô¹"HPÏóñ; ãàòä+&pb¨S¿³Àèwöq6p¿ŠáÅ2~@ŸLj²ÞÕ?]~úøš¨Ž endstream endobj 2038 0 obj 10793 endobj 2042 0 obj [48 /XYZ 31.5000000 756.500000 0] endobj 2043 0 obj [48 /XYZ 31.5000000 631.250000 0] endobj 2044 0 obj [48 /XYZ 32.2500000 755.750000 0] endobj 2045 0 obj [48 /XYZ 32.2500000 630.500000 0] endobj 2046 0 obj [48 /XYZ 31.5000000 438.500000 0] endobj 2047 0 obj [48 /XYZ 32.2500000 437 0] endobj 2048 0 obj [48 /XYZ 31.5000000 307.250000 0] endobj 2049 0 obj [48 /XYZ 38.2500000 258.500000 0] endobj 2050 0 obj [48 /XYZ 32.2500000 305.750000 0] endobj 2051 0 obj [48 /XYZ 38.2500000 258.500000 0] endobj 2041 0 obj << /Type /Page /Parent 2 0 R /Contents 2052 0 R /Resources 2054 0 R /Annots 2055 0 R /MediaBox [0 0 595 842] >> endobj 2054 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F1409 1409 0 R >> /XObject << >> >> endobj 2055 0 obj [ ] endobj 2052 0 obj << /Length 2053 0 R /Filter /FlateDecode >> stream xœí]KÏã8vÝ¿ÂëÆ->$Q@ ë ‹…n ‹ ‹ '“Á =Heùû±-éûLJ—)Éö4’ª²l’"/ïãÜ×OÿôËþë>ÿò?‡ß†??ÿòVÛºêÿw8ÿ÷Çë´;?´®>üöûÛ÷ïoßOÿÿÇ[ÿƒ_>ÿËéoÿwЇ>ýß_ÿöï§ÿ4|éü…ßßZÕžþüïËŸ]«N«Þÿ<þ—·ýÃáoçÇé†Åøÿþ£mšÊWqcæoã[ªËÿíoo?õïŸ4Ig´jÊ{PÕ‡ÿýÏ·?Ÿ†¯Ž®þ'þ›Ú¦6ú<µr‡Âóžþ¾Æ¼Vµud^ÝÚºêœøwlÞVŸ&Ö®=(ÝŽ»žÌ|ù1¶¢mœÊ5ôeÕäíP¦Q±¡³ÒV­eÚ:QžjÛVw°ŠË®5ÝxÖ-ÿH>§íšlC_VÍÞ’ä±yGÚ©®ß«;úæ¼Nß÷ÚØlGzY5{?†#Œý=a yQmáG䇟~}ûéÛiIÍá×?Ÿv™¯ÿã×ßßìé'Á¨Ã¯:üCUi÷‡_ÿúfÖô Ôùk—'ªº-ñò9Élmù.Ɇ¿L™S›)œO..ݳ;U›Vù+‘QD#6TfžÅ ™@„ÃÎ(ºj×ú²ËŽ·c8ºûX.9“—Ä…ùH‹¦¸ŒëMf€…$³™RFG„Ëì®$WUBŒ›/Ò±˜^BuG3ühÉ@FF´f‘‘òËËDl3¼Ïò q(p×#¬`Yˆ–NŸªZuÃj{ü˜WÈ…³SIQÊS3!Q³›œz‚g%€˜.,±ÍUçæM¨Öt7É2)4bƒqB¥à.GJ€ 7Iy Rë€Z¹®õ qyB¾5 p•«½BHf^5 ²]Ë‘LêᆟMÉ á° ‹AŽæ@5PKiƒ‘7¥ÒrÚþøg@NˆdX‰,è½ò›jq´Ü§·YŠaŸƒÍe”´mÕ,Ö óºÇ¹Ñõ\¦ã/¬Ývmg‚ <`T;®¿yWkú79hslêËò'«œûM'ýf¼ïíD}ÒýÞ*;þhÁÕÖÍœÔ'ñ7Z\õgéÉ 7³E¦ÑãŒíðfm¸~D‰pYÄ;-k•…\oT¢Dzõ±êŠøYm /} ×a¼ .Š I-¦Z%•µBf-@¼dSXÞƒ¼Aç©’#v;ÛsS(6áËA€²’r<9ÝúuíKK$}+"˜/âªBÀùåz?9„s}©¹O±–Oa刽\¬Ë(äžzØr$,<²Åò]9Çhk¦pÙ~H %)r¢ÂB7 €[ß´¾ä+eÙqÓª8q˜¢‰¼Zaƒ9 DS”_C#ìlfø®” Y)53é$§¼ðµåÇŜ߱¸ò„ÇQµn©—ô3]G¾5êÆqC¬}2È„#­ž¸Q ¢v­äü.Y›EbK%––Jü»¥Ê†qQ9{5€„œÔ èJP9¥Õ*k”*|Bõå—bMÕùR,âÉæ–FâÖ"yÙd»°ÉJYBp´<›7Ç‘a/™E\‚9…ÄRsÚ¸~¿bŒ©,ogER÷:wx0¢mÈ qºÜ"眆£RP°ëì R(d¸!Li9ƒ^?V=A²FÐ:€q"Õ"™ª·ZvPÎV ŽnOž±EÑ#®2Ä·™¹N ¥žbBU;jn1'Ï(¿¹ýHeŽ%ªQupÉJÁPË+”©B²©XÈBÎLãR¹¸”pœ æJ®¿Ô-wH1ÆV¯OÉGIˆà*›\”¸©µåLoêZ_žF¢ ¨9‹P©äó <³çê1l3nÔ¢\);Â7@‰Û(ˆj–Oa¨ž›¦~>º\ÛAˆ|NU}O|ÏÕö&.•RjU']ˆ£Ý.¯´VA..¦½Ecê´l¾l:"Á.«K{¤‚š\‚’U äÖ¢¢ lÄõQÂDÓH~rSÉÊiMÀj]O*fÿ—2©õä ='¡|h!Ð/sVøâËVVþiB;ÒÚŠåäPòui‘ÚÊ»ºõâù öj]»Ïp;ˆÙbaûŒ¬B(>o D¨–RK qN#—pyŽ6Ôk+3ôÇímÛ¯`HœŠ j?n"9P‹ôß rb¨F7¬]ùXóCŒÆVV‘ ™ Æ2ê´q˜CçÏ‹`n °‰›y‰ŒV¨xþújô ¼)•X“S”¸P–lµç•å½!P[3®Eö#y éˆôÉ,Ö‡`—YxHOyG!éòZ&º]¬mÙ½»~]ÃÜ¥”2× FnpïêÁ$›‚xmŠF¥¤?¼ë¡éÀ­¹Ké‰P¬¾K©fÏ\´|¶ ¶òZ'ø*ù]Ê>ئ)¾zU”õ•«B<&™›Û¯˜öØu*£ ¯ÔK#!©žš¾•M;†à¸Ã6Œ²N)C—ר!G…"ÙȪ†¤‘-FÔQgéè8ëôíÛ±CÇò˜nÉ`U¦ Ž (CÔf陳] [4âãZíÆ"Q>\v ÔÐòª¹­}‘ ß»T3%ÿN.s\-@›rëÚ䬫l ÷™wYÈ·½L ¹[lz òetG#W{âÆT¬î¶ŒT“߇r,¥¬e."h¨F!o>Å>”)…eH‰aÔ3YSä*eU s‘»ÅÍkJH¸CbmÒ¤Ü8FyÕHJGB×ú¢–ÚTžK‘,ž«Õ{_ŸÕ=bˆ³ʳg½€Â¿»Æ ÏÃ_b´KIãMPÂúKh¾š]´êÞ‡úqÛ‹×,÷"iEœ2͈º¾ýNÅÙ¡ >Ùö’Ñ@£Þt¾05ôºH)q®èXzÉA)¥Ê‘lÝõýßðõLè[–ºr–|PíJB¸3¤ôqbª^ø7¦-ïªÐí cÎ@}ÌV‹â»Ä-¦4ªzžÜNŽW¿Þ&Jkª9z¸ÊE·@Ÿü¨œY ¿ÊL¨€…]__á€\SЕK5îJ™[d4ʼnp¶ÉðÏÛ¶±˜žàGˆ#Ø›Êܦ³µÝoÜL®›üäeYçê­ˆ&á¾—Ê’™ÓÏÁbSr6× QVU›®skÎA\ŸZò âsŒê@)R“è˵èRÊ[”*Ö³aX%‹ÝVJÊZƒºD ½Üçô*%TFƒòjóö¬{™½åÌ^^ü‚;h;_M÷Â;ê÷* Íûåîw7ܧæ8U½Zå7ñ7ô›1N¢ùødpÙã¤j«N2÷˜>Q=õt3TÚ¯©=v.|ñ ÕWqâ»TªÚ z4ŸF«ÔåW žDæi÷ÑâywÄ““÷:²‚.·Àìõ® hqÅš¶ ²AÌ D.'7£Zc 4‘*N˜‚>>z$âÑä @ñS3*¿D™Î‘¶L«·É(fK–*WDÝkûõC˜ÉÒêCÌ©©˜kÜá${t}¼\ÐßÇ7GçªöÐô*ÕêMÿÅówû~{kìQ©N;§Æïos=Áéëý¿û‚›psþ…¿ˆÓwœ7„ó'øËÛ§?ä*žyí­y/W/rÅ•PÇû)ÁZŸl=G ¶ êôAH v<û÷!Ìõ#%X3G V‡è %Øñì߇pþù)¡¾-!d€Q>%¿šÚ#–âM]?[á!á~†ÐŸ!œîé Chšà¾ž>Âù;ÆÂ\O02„FÏ1„F…¨ C8ÇyC8‚ü ¡yÏ´þ&Z}² €ä"!Xââ•]¢ ŸBü\Ì•u-œö¯…3s×ÂÕÕž>¯Åù;ÆÂ\O0^ §æ®Å‰ì‚ ªÉµ8ÇyC8‚ü×¹‘ŒŒt-d2‚’¶J`Pmµ'î»j-ðnôFòe Õ˜/V öu[f,ôš#o\¥Íëʧy­æh>\y4þŽñ†0׌4¯ºšw*€½Î4ùŽó†pþùi^'+6¨Ü­ ¡(ܺfH¸Ræð5˜¢9´û9é|Îc«9΂”®)=æqþŽñ†0׌œÇ¸9Îc˜õüAÈyÎßqÞΟ ?ç±õHâb´7·e$¡¹‘SOÉ6ÐÆ­°™§+WzAñr\©²Ï«ÍRRk狊º›!|ízøÚãöçïos=Á(*êvNTÔþ çï8oçO_T4c’©€À”î¬Hp9l)'cXÛúÖº9 `×Áœ¿c¼!Ìõ#µÍµ”}þ $°ówœ7„ó'ÈO`n S7¢h¦öy²Õ–{U_@ì¢@Dn%ôàBÜoâhC€î{ÕîÌ>—%4!¦µYÌ óî_òuíœä !i×CÒžð:ÇxC˜ë FÉ×Õs’¯ AõÎN$ßù;ÎÂùd—|]¥G^!úX#×|õœkJ­'¨°Â–¹I‰ì”àÙ©¹Ï.Dº;5 ð¼|ÇxC˜ë †«Ô©¹ÏN™p‚I€çå;ÎÂùä¿Jz ð4b /R‘=%i\fë” ,º2~¸hgæÂE»ÇìÌ$\ôòã a®'éÊÌ…‹vF‡LÂE/ßqÞΟ ?]Ù÷ýÿÆ´~#´È1ê?@ø÷nåS÷ߜګì깸Ê.„uºzWyùŽñ†0׌7§ž‹«ìjN0‰«¼|ÇyC8‚ü7§~/Á/:ô!ìI×â֟ߊâ•=#²ëÞ±?šy%Å΂=^‰{¹ ¿q ï”êõJ ÞvR0àÍ%¥ÚJ{ºÉéß3ºÉéS_7¹|àë&ýwŒ7„¹ž ×MNÿžÑMNŸªp‚P7é¿ã¼!œ?AnÝä4ר›DÂvÀ­îÍxõ„Eœ|»RýOLvj£"rM«Ç ¸Ó×Fm@ õ‚B®8’H1¨M²‚‰š#–c¼ö[d4„lõ!6Îå(¦òN «äl‘ÕûH!%èdt¢çõ+…dFn¾,ÓHZ!ˈ[Ùrµ¶*ä6[€P†Ú©—jÚ³¼&;d3*#œZ5wêÁ¿ÅÌr6…²Ú’œötH¡x¸‚ Mpÿå% .¿IÀu 5Û´UwÛÕÀ϶6¡º§¡åZ|sÓ ZæŽiÔ‚ÚÐý‘Cõ8A™ïÔžVÌ+!u‘¡(p´Gk×› [V,sn›ÎçþH”.Ô9kËÊ•I#ݸ—ûnÈ6-ߪ§T¨Ø@)·,`†r!Í”* Q}@+ýIRì °ù~CËåCú[ª b¡SÙÅZgl Ö¸šWøÉ ;¥cü.7¢"ÅϨʤRpíàÒEvG~‚èïˆØyx#7¯Ï?A;„Ì`jÑYˆQÔ_rÆ Þ/';üvëÉ!© "’Húò›a¸akD®‰!G3p#Y'×à{Ÿs/•iRdU3ÖÏBšUòo€F=r{¡ôµšþF|iºSIó@‡ñ‰Ÿˆ+[øDÚ>‰û&·r’ɫ޴’w´(¤ÐÉ anm%FöZ¦™vä=ÈqrÙœVÊ?/„¦"ÌÔ‘ä,Äßó`i)ÍdW1dl"Ö`^›bºKÔš¾ ÅX¹Eò¡04åßpH©§X©NÒŽŒ¸ÔʶØÊìs²ö<™XÓ’•­ÄYµñgÕc#É^[˜nÛÌ“ÚÞx’sÛí¿@$„„´_Èñá¼HVii1{DÝ¡„m•êÊ—!ƒ¢àå=§Æ†“ëGeÎ@Ú¡*–Ó¦«íáœS”^ð)®öBEœM ¯¢V)&÷„GÂÏJ«'Ú“¥´\¡™j} šQÄÀ£žOº?=?ÚöÑ«•zµ¸î¤µÕµŒÇ tœr‰P5$Ì‘«Øpó®¸Ú^©j0Ë#ª&r3‚¢b9‚ã0‚‹"¨òA²Óüp£ì%‚æXm}³74Ç6&`‘HÐ.Pí7ÒX~—ÙÌþ ¡ÆùqѶY¬½pù ªH€×¬N$"­bÙ%Dýàú@¹­v¨yP™P})ÐÏÔ@Š·Éh͆Ô~AªÓå- eåpàç4ìN›x¿…bÙ!Í+W+Qÿñ&¥’Ñșԫ×ÔEjuïªdH©j ºyïä¼z´\Ê]úµ@´~n·£õM§(T)M»Oâ $÷(ÕQtýÐÕ]ôy”R$ÛV& À!»*òªÅË$Ÿ‚¼£òEóeß¾šµÛÁÕ|,›`+‘¥EN[Ü#®@ÉûV‹¢Ä߈ìÖpu `wöI£ ‘µÎO,ö•­2ãéÖ’‰A®rPóÀßÅíìP‚• áÜB2é]v#A. %” ˜jË“)‚ÔL•#d*ÈÜ(ŽÁ‹¤QkTa \†Ai€JµâhÄrY¡^㋬”@9j¾Ìô!¡T_’‹ÁTx½˜Ü“°Ë¥üFîý¹~ìG—Ðæsã2‘D4DŠNèÈ ¦^BÎaª›ª ˜6YâϳÆ:ªÀp„‚é¨}:’-‹UÓ@œ´«g )\)‘EEiÓØ ’ų̀kº.’¦Gmö®SÊ¥ ]¯/œÐ:msÚvNƒÞkTj\,-ýæ¦_NQ©wx:ü›F|"ÿF\ÛÐ×aŽ:i´¡ RÒ^Ë+`ݹ†ì9ª®}2Š\?¹~?¢œ2¢WOóMKtHùºu“•s+ykQ˜$D÷qË·d×ÓÏìÄã*Ü|i¨{•âÈ1õ@!ó%³RšAõXÅЧ†|¶Ó¥ÔérãmD+3ÒRèæZQ·Ð¾í¡cXDr6pŠÒ˜!H7d3ØCÞ 'çl yä ¿[ñi±@¬I$tìçÜ"ºkÔRÅŸWÏ­µ‡TyC²Q$mÃõ|sgíª¦Ørƒ¨{YC½5”FW/OTAO”põrB¶ª`çÏ×Ù˜M æK•œz°cƒ䂠ȵç-dAñDq‹”@á Em"~­=¢Ø¥ÚÖêžv€ƒ…•Öìm@º›OFÛnºëb3£¥™ÇFâI õ>K¿¶‰-ð"ÍñÄ6€Š–gϨ›÷W2¸ÆCªÙn8à‘Üs|¶dM‹ZòŠÜb‰â'¸ΠJî qp"¤)‡Ä¾ðrJ‘û-Ç[ï»È™¨ k_Z>(²£«µåúÝ‘^u ±™»öÄ8a’âaéËÁJXW©šr/e )œ€Xï誚5 ¶E97rƒ¼M6ˆ¸Æ×® +y¥¸6Gψ{`Ôê{1$ì0Fçf?œån3Éi`b¨çmÝB:2?,T°XWEj(Ád¬•]JÇOgß?ƒÍÁ-SœŒ#ndÄIúª©Êa Ü²ÕHZ ¥üEûàÖê/£ìB@Vd©²~gÙ¢Ã秇LíÕ¸¦ØlœñÅ&‚ÈDâ_© q¡ë¾ZõŒmòÆên¹qÃzñ¶ÅÅ^8¦ù‘F3¹®Ô曥þdm^^)_h¾«(‘„eQ"Œ;¡¾%Õ©TX…ÉçuÝ͵¼ —ôx Pqn³Ž“‘ƒ˜Ú,¤¨rÄ)RÔ͂ė޴ÍGfT–'!Îípvzât³é¿Nuî7ø7J±6¨†4ÑœXEx3Ȫ¹'´‚AZ6Gs¡Ñë'=¥µG39Ë/Ò%Yn:µÀÛ ˜HÖØxå *…Ò¬e*¥ôxM¸öÏ[…,%SšÚ\fýÚà2GOaEŠIšP~µR§B¡bŸwr‚2n‹È–„t´ÊÛE7UÁ¼•õ_4BY¶Ï@#E#ÒÛ±r(—£å[f·&XyRÃÃHcE¹¬ŸøDnúhÄ&–‘"@sICk¹x{ãmws9‘^åbD-¾¶‘»SÊ,7ܕɥ\[Ýö½ò²‰È.%Ê ]åF«¦\CñÖµ…···÷©6ÞUMá—/z¤@«¦Þ,™=ÉRF,÷*p©7•ËÊnƒÄtýt$9’‚oí8©Ø|š·œ¸¯È½»º#­ŸJšQC®J™1_¶ rjdÓѼ‰ã‚;Š3Ù™½+SŒ'O,áÇàrtJöäÚ×ÜHÐèp¯ìj}ÛŠ|0ÐÁVéJì= ¶ {t­º¹öˆl¢HbF&™Äd…T¶_Ê"]—Gw_šã>Ñ­¸6™Sø™’ˆbÇiâÔxÿ&ê}CëËsۂ̪+[…îi!ÆaªXƒ¬Z|¢d<ð‰àãºjJÃdž–Âpûå\iಔSâÅ¢a¢P•-LÐQë„X´üÀHYŸuÓ¼·À¢•6Ë¢•Õ…_®”oéå¤\ÊðOÿ~œh)Jjßo}aËͦr*s¬Ô9õÒ֦ߟˆžsô»ÝΠ¤½¨ÔGÝç"N8\3}2\4=Ó§_\mfs+š}nm߆7•reç†ýXR%.vÌhœ6ÈÑâð­øÄJ¯¡äÑÄß €·JzõöƒlQ‚;ÿý´âñ ëôƒV_ÓÚtI+Ñ;'?XØ áÊ{9£ twÿ6·•;ö©ªþ~‹Ë\Õ‘½Ém¾¾¿ý?£"íe endstream endobj 2053 0 obj 7866 endobj 2057 0 obj [49 /XYZ 38.2500000 546.500000 0] endobj 2058 0 obj [49 /XYZ 38.2500000 546.500000 0] endobj 2056 0 obj << /Type /Page /Parent 2 0 R /Contents 2059 0 R /Resources 2061 0 R /Annots 2062 0 R /MediaBox [0 0 595 842] >> endobj 2061 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R /F1700 1700 0 R >> /XObject << >> >> endobj 2062 0 obj [ ] endobj 2059 0 obj << /Length 2060 0 R /Filter /FlateDecode >> stream xœí]I¯Üƾ¿_1ç±n@ÀÚä@€‚9N`ÄFò÷3óÈ™÷†œ¯‡ýMu±É¡[òk±—êÚ»–·üò÷Ý?Û½}ÿå?»oýïï¿<ûº,ºvÇ_o^ÿÀ6ûþÏ»º)wß~yú¾ûþôùéóá¿ßŸº¾¼ÿóáOÿÛÙÝŸÿþ¼ûëß?ü±ÿKÇ¿ðËSmêÃïÿ~þ½­ÍáOÅù÷ãÏÿõô—ßí~=ÎxZ®ßÌåÿ¿ñuY·Ç]ÜXùûÓ锿ù×oß~}zÛ?j‘¶4e³3Þùi½Ýý÷O?¦?M^ì[oL]ùº¸c™ÚîZßšvgl[ì¼mGË<ÿ’˜ÜHO]:_'šºÛµ4<Œ«Lpî}ãqµ-ýñzW[6=ü¹vý?w«íoÂY'm²k®­I†AÇ]Kã»æÀÜb”[6Ç)Ž ±) œóäâp¯ÌÃ]éó®¥áÑ_)ž;)åV¶¨zp•c9pï]¼L.>µ+S1èn×Òðè®90·åVÕI,6òÌøerq¸×Þ§bÆÝ®¥áÑ_éhîÏsà}t?ªà÷À‡ï¾>½ýd|qØUµûúÓaoÏKv¿}=¤Ü½9(€¸|ýq÷û¢0þ»¯??µûÊ–§ æ2R¼‡ßTð‹Fì;b&~×®„ëàÀ÷æ0 >ÆŸÔ9ø †ÞÁ'ø <©ƒ»Æ°¶øðHû<òñëTS“Yk”IÆ}P;œ5êü §S̬ÂÔXü É«05b¼ Å;=¤8Ÿ¹ˆM°„F0*çŒþjÂ(ña}³bñQÕÚ‡ÃBÓ9µ’`a0ž¡¬Ù…k©²` Z¨¼Y,,’»¢\¯ÈqÖ_.šÖh/¾xÞK}R”m‡“Æî½{~£|Á•ýi`¤X^騢yùA7}³oÚâù´/wR ‘ÞPîmÌåH3œÞ¢I¼‹ß½³õBÈíK_5õëÛÍfÌihÂlÎ 1:Ü£ý4xÄ8ø ¾Ú ¨ãg3Œ;]ò]ëôôwAÜÂu0¬ál²;Ü6^ÓÆ‚·ñ ï sŽ$0¦§é 'pÙ#rN¿ôŽ`éà‰Ƹ‹G0pnqƒ„­,êKé&Ë´Ô®ÀIxñR`o;£( ³tBq0-æC< üÉ,¯«²šÈÎ$‹1ïzÈ@2óë÷UÅd ×v;0žªÍ¿‹†ÆñÝÂÍR@Qâ?ùˆkFMÄ´€’(¿ àÞÛH¯O.-ÛÖ ¤%s»˜÷€aƒ4øb ÒĘU²ô9]ô¥0⦯Â;{¹ó(ŸU ;sg’êoO¼¥öË|à½:%±ë1°~sÄŽYÆ÷Ñ¿ {ËÀ͋ߑ¶N„–³h]c #laô'ø¨%Ò!n˜Õ`åñ7#[Tˆ©QRɘû3{ àÆãY´, íxœÑ?pÄkq€Ìfç|#y|iµã‹´xüøÍ…Qhrr¿„X¡-t¶Ør2r—)˜ƒ ¨´#©r¶1dãÃÄ„¿Á#ŒÍ”1Ñ2$ðóaXà :|ž<¤sãµIsþ )†Ð•‚ñ‹1³2H,1ð7Š[.[æÈ¦¶†dÖ–ñUä ê*2»„üŠÐñ5ÞQ¼ßÞï¤íÍ*XŸU@ì-͉÷á†%zæ¶LUåÃ{7[f³en#l½„ 9dm¬,Å7«`ɲQ…¡´kš˜×– ç/×åÉ%ÕgL_IídáØn"íD8½Å£o|ÕSÜ‘9H› ²¨¤&x@&ML6ï6p&‹€(•{<º~œæPÿªRšÃ23§™œ›Û—}¸–¢IdÕõZÔ«¤R¶1¸F5F?¸'sšÏ“L)uêúRìà⺘‹ ˆ‰K" 1Br0©ÇÍ- GàŽ§W(aŠV8¸pL -î™M©VÕ‡éß2Éå½ýfÊ}ѺKügî 3 ™ÃdµSŠæí[SS’4÷”©¼•¿”O‰i/ …"è‡ÑÐáîE eHºq@RBÑ2¢`Y£K¶GæXý&ª–­­rI †Q *€Lq·´œCË6½CONï6;7^ˆ’T †¢˜:8<'OlS4h@ö‰;y·Ý°ü"atG ‰”¦XfªÈP„)Ù=6ýD…a@ d ‰1|R¶ì>©„e¸û%Œ*q w@½?L¯áÝ  ›–? k>Œø' Ž2Ň´n]ö¤éåhU´9ŠQBÖ§E𦕨ÖF¬ v³3íµ[µÕñR;<®¯@]ì;Íd„•åÞŽ”ÿM²kß´è÷þ¤½t˯¾ù„f3-\çÝY 8ð^)ˆƒ‘>Ø¥Þ;@×Ö{Ã'í‘ÇT'"鵓p×ð ¿ ìî-p xoFZíÝ3‘L‚N/Ù®àóÀÙúˆ»¸Û†¸ãðýÀ]ßÄÞä¦hSž÷#8«³To MƒQR#̦÷ÅÌñöà2ÑDüI@Îõ”Ú =½›AÌÛ.£vH¼àª½ûa“Ÿˆ•aˆS¤Â,¥-ËV &)*%êggÊÖ Š‹Tn9휲ˆD vüdo¡<GD^°¡T&x{‡›¨?Z–ŨKOì¨ s“õs0ÈÄ8Õezh¦XÕ¹='ò?NUçÀ:zÍûÚsÂssJpžC ¬¾,xÁ«×ËšhïJDV® {mD¯'^{WŠe AõX@¼+íO«9©Zý¶Œ›­j"Å]©[Q TUaNåL5zWÞÞNyªn—³"Ó;ó®Í†I“IÏ@Å©ŠÚß<Ü#©8UÑÞS5KK ¶0•3ƒ,^=†bÌ=‰ò®úSwR¶go<\™sóõû‚¦§¶QŽÞˆ…G ¢K(Ü3—S%ëa‰ä±ùž}"ö¸ |,=/\eÝÙe6cWÎnêÏ_Íb9¿ŸÇáü†*jJÉ ÌFexLõ.ª×U :Ua\esà©&cJôÆÒ2ÙWÖŒ+ ª°´º¾y%؆ŸßE"Ìn™Ê–ÛˆK .È‹Ÿq1{ `/>³„ö;3ÌÜ©,mSO\DËfªH8Þu£'>Ú³7“ g†E¯MLm#Šâ3âÙ»P‚…xg—‡Æõh¢MƒÝ:szö×b·S΀l#ëc·¢¡)‚ßø< #& #«Ý`€¾h…À:D©vŠ­cW˜®¨" ܹ‰¢ls÷Í9²ˆ‹ÏèoŒv‹;cÀXF´Ý¢…äqD®9=¢;œˆD$/QeU˜²¥LÁ•E¦ªÉT%a*µÂje¨m‰ÐëI„Ö.ê°¨‚ÑDþx>‰ÌÊ%ï“ç‘¿’1Ÿ¢Eªd«ÞSuç|Ù„áRµ ´qˆ ë,ºrF²>Dƒ@§¨HÞÓhb™ w¦ÎIK2Wæ†lœ=]«®³p/®éšqrH”+‹ÈƬP¸Ú)#Ä”xïÜœ(¹»ÊçÐi%¶#«L¦‡Hõ‰(‘§[Ü8gjIˆ´ÖºÖ®idëÛ©X$Z ʺ•c”åµ—KÃÀ)ß’Åf (¢9AÀÆ%šï&éú6¿Ê—ö=¾òöRV±Œ4¸d9XR¡AY N™i/…ÐM5õlb‘ÒpÉv¸äì®´•¸h2ð‰Kðz‘νŒ¬´ïÐÂTÍS|·‰2pœDC5ºÂiy³)\{•9_‹åÉ%Ó#¥¿ÖÕTÉ!£tж=Ój:46F˜î@D ®ˆ"6}Ñ©kÑ)ÄæÁj1 ½Ó¦?G*ªQÜÑ7,½—Ôžµk&¤ŽÑˆØ.¯OiHî3€|rëÍØÁ’ ¯¶,)"2¦k>T‡¡ùí…ÄEõD}ù9÷Ì0Èe-M„}®fJÂïǦ·½ºð—²m0å+†„ÊRÖ>E7æ^d‡WZ öǽæwJ^ ·ªÝUèáºé"˜&%DßT౦2uÒÄ¡¼É–“°f^HçÌa0€ ¸ãÚ•gŸ˜l-ûI€,¨41LJ²þ‘ƒˆÂ{(›ß'µªå'‹¹JÆ@ïMïâôP_KÛƒíÝqAf{AË­Âó¦3öì Mï}¸§°ù‚"ó [’É“|ꎓz-–îª`IéW«†K¦ ­êÁ’³? £óÈ’U0Ó²œÓ¦Ýšr21<¢Sj–s9?‡Ô#)è„gŽýCÛ/Æ8UÖ 9Ke3™˜’SŒöI ¨âeô_¶<õì™6ûàŽ'¤ôîÆêDŸcç?IƼØ•EÉÙ¬ùE©#³4Å›âµKÀ/ÉŒº ÷&¡@_/ö8BL^¢ú&£þ1&rÌs“‹g“õ¤æçÞ›¯®×Ã6Ê&‘SþsFm“%ósF7èí¾±»„R­®ÛK©–³©—uj¸l€Sõôb3óûf3)Þi晸›é¹ÔÃŒ²öR2j%§îyoĺÓaþZð|ѰÄ^jëË‘—üÑõpÃ5E£ÉS·‚H\8Q6""¢¸¬Dt¡V3ßLÈû^u,Fœó‹y§Sá?¾\gúdòr¸äü`ÆùW>TãD¢ôóM™²j;àL[&“ •–߸f(>’ó7‹üÞ;™WºÙòsô23Lr /¬Ë'Nïë‘6·Óà Œ{%ùšÅœÒÇ,&é’õ€‘æ~§Z€9¹ñSÚS'[3D™\·´žVÊYµÒ”7&ÄE6è›zJ’ g–(ª“Aq¿ sòkG&êOL(Fc=ˆP93p¤ðç§,,dÜ¥[}ZîMÁ—Öæ-[;8LØÅi¹>yÛ£ª+òøJ¹ÉùqkTAñQ¬†àXbæ-CÚøW›ò*þ¥ ò°Ã%û\dCï”ßG—)÷d»ÏPa¯iý%’RV)Q¹$ðŠ1‰’š­›cÚ ¢2õ’Ò•mm&>9]xf" aêB[zÓ ×dBa#T$,Ζ˜DEÒznÊEd”ÎtxæŸÞåéϨNx-eü/D{Œ€ ת»-ê ¦ŽùC “”ä ÐÜôv)2J†¨áDÒÎiïoO²¢Š+ó,Nå $·â|[^ ¨ÍÓýêø(.\WL´Ãfx9»$WïF×qVz7 gX›¥×Š£*°àê–éÑêþÀO°ê–ÀÖä@QŽãMˆEmWlý<šjDõŽílìièe„Ñz%R¢cŠ¢Ïo}-ªâDIrÊy!›;´Å¯Ë.ˆæ Z´mæMzbåoÂ)ÇRJ«¯Æ¸µŒ2h·˜©V-ü-7½°$ŠõURãÖÁÁ(3–Ic/ë…ZzµD(#ðœ–ÖÔ¶§e»‘¢œ‚-“ØL° ½F”³•Ðþ"œ+²áv²fóx‘u‚ÉF° #’sÿhþ?™Þ‹ê¹!kC¥Ws|5]½®?îêl (ˆ³‡„ɤEоÏPz•Rwvªðh‰Çˆb LØù£ñµœ¾9Oà1wÄxñC0_ê‰eí¿Ö˜^šƒÝv) ê ñ¸VFÆÂ·ˆ÷6ÊÆ`Þº˜4\…(øÁ»éñ8¢Ö”¢“PèÏs _UÚËGÅ÷º2áNNpG ¹Î{<á_ÀoÞÇÏfq×_¢S°‹‹º}õµ¹¹@{b A刲¢eaÅÊrÞb{T²#²´ µk ã ü€‰8ÄÈת!E]´ÊàÅTb0#†Õ´v8Ü[_¬, a„I"†¨&ŠùzÑ|g~ì s tôäv]UÙÐi€‚•Øz@ä0üÙ5æ•e‰‰AeM^Õ”Ù åÚDŽ,ú[ˆ–+³ßuÛ˜áHnPš1l#Ðј°(fdO]c‹ãÆkœm„oŽ0/¤`¼·ÜĪÜdMᕠÉUu½}8ë”Wbþ¶i·yh··ÊH!loš*¾¬e*% Š 'žâo15»¯æ$ËÁ^hª{Ó¹ ½FWa×ë­€´êÎRQÝßà§ ÆžÃäŒ5ÌÖ!™ec`qH8¦퉩Nàá:X³3zVAke’qŒæ€u$ÂìÃßd ï,UÙnö+Âæ™#=sÅô³¶Ô~yPTÌÚZÛK=?SÅÞ<,ÑKAìšñA.—ݶÚÞ¼Ý&zQ@—º0ÚþQ=v[Î^.:3¬ë ¶ÌãÄAØü>ï‚av‡1f€[M»¤xÛzøµû~8y0Ÿoý… ÉÍÕN¿Æí sLŽß½TÎï4„k‰݉ê+áïZؽ}ÎH#Y5ée†Ý÷Éù¯ ›™šh^mĹ×öö©?)ª€“uüË– ¸YÓ}tÀž7ãD6œ¯påϿ齤&êè¯Ê,Âÿ|Øñ¥ŠuÑæcüE÷Jȵîî0U ôšÂÄŰ ÜÑ¡l{?˜Œpoº½]ÀîÂ]°¤[ìh÷ùéÿžˆó endstream endobj 2060 0 obj 5003 endobj 2064 0 obj [50 /XYZ 38.2500000 349.250000 0] endobj 2065 0 obj [50 /XYZ 38.2500000 575 0] endobj 2066 0 obj [50 /XYZ 38.2500000 249.500000 0] endobj 2067 0 obj [50 /XYZ 32.2500000 544.250000 0] endobj 2068 0 obj [50 /XYZ 38.2500000 349.250000 0] endobj 2069 0 obj [50 /XYZ 38.2500000 249.500000 0] endobj 2070 0 obj [50 /XYZ 38.2500000 575 0] endobj 2071 0 obj [50 /XYZ 31.5000000 545 0] endobj 2072 0 obj << /Type /Annot /Subtype /Link /Rect [242.250000 91.2500000 272.250000 98 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_feature_flags >> endobj 2063 0 obj << /Type /Page /Parent 2 0 R /Contents 2073 0 R /Resources 2075 0 R /Annots 2076 0 R /MediaBox [0 0 595 842] >> endobj 2075 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 2076 0 obj [ 2072 0 R ] endobj 2073 0 obj << /Length 2074 0 R /Filter /FlateDecode >> stream xœí]K¯ã8vÞûWxÝ@»ER t½d Ðd1È"¨É¤1˜¤2‹üýÈ–äkRúhñó!%ûª 3÷^=HŠ<Ïçþò/¿ýçñ¿ÿqüåãoÿsü>üüøÛ¡85UÑÿw<ÿûùö‚¶§á÷cc«ã÷??Ž?__»ÿÿqè_øíã¿u¿ýßQÿµûß_úî⟇‡ÎüqhTÓýüÛågÛ¨î·âúó|ý÷ÿÿtüû¹Å±»a0îß?—¶ªŠó(îôüã0~¥ºüûÇ÷¿~é¿?ª“nŒÝ5Ušò¨ÚRÿ÷¿éš/Nm©TS—Mñ@7>¶u­Ú£Òmq´ÚLº¹ü“h\I7Ý”¥JÔt?jéùP¦VÁ¶O¶þƒ¿s=Ûn¶š¦#¤RÙcBRj¬)ú%1¶_ïkãâëmu‘ŒJ/£–žž”m‹-©5fœšF~ÞßoºJ¶¤ý¨¥ç£_Ò@ÛbKÚìIµ¤7‹7­ÚdM_FfI§mh#h‡ü¼øáÛá—/ª<óG}üö—nl—.ûߺ ©Ž?wÖ‡*ßþ|ü§¢På?¿ýõОj]¼wÇTèNñ!þNYÀw4¼ó‘h ¾ƒÇ¦áè_áì˜<ó†×G7°5 ÇÆÐA?¶Ïß:¢OM°Æ<@°Ì X>åhëuºî¼imÇeÄd ¥Kñ™ e‚,V®øcƒ¿¾ß„ÒÓeóˆLÄVÀ½;Y>®®ŸÁ]Þ°1g0ocžƒ2Dc «6<;øK±õ•^À¤Þ¶Ùªm•Û‚KÂL<&Š@?„bÙ=JΣ̥1£ïB¨Èæ*ba¸“φ5ÅC R>ÛßèGÀ„ÅcYzÕ;5‚õyŽáFñï`€6n™27@´+Ê-0m6E g”ªΛÆàâú&AFÅ_?úÉê`f±°^#f\ßœKoZÆŒ6_Û>0ÐciçÈgF“KY\ÆÒ\ëÞD³'Û—áøŒuG÷ÒѾ=Ú7oNUYÛ¦šÎüL# wÜËòTš>Jñí ß)Ñ;¸5üÎüÏõƒ¿Ôú“‚;6þ£p.>˜ œ‹Òdš ¼½Ò¯NF[µôfÕsõßÑÎ(lmЋJDD‘ ,d¹“À‰Ä“2(Ê9V.†éCŠd|Ö.?¿ ð%Cj*Úës¬hUèK8Òñños²¶hŽu}ù©Tµ:ÖÕ5H»¿ðýP—'¥Zm­Ÿ1N涃îñþouyéè½\ø\ÞpÑ=c&¬ÛÁï‡?%Rgö¢ÎªbT­ª—Iª8Õr8(@,>† +,Üõ†d¯C0;æd¢³–+±©€»Á¼çsùH߇E!žX&æ'ôéftÓÍðÒ‚;C? }¨Ê´®ÖÁ«j ¹QjHœË5U€8E¤¤¨˜¹¡‹ÐˆŒ«4?B¤èb2z,•ñè 9°³s¹€ïW8nZ‘‹à“Gíp|ȇÒÊõ¡´žó¡té¹8Ý߇:?cœ&Ìm£¥‹9Jµ^Ý߇:?c&¬ÛAzJqŒž®ªSÑWx0ìÎXÚSSØÉ®·—ÌÒdôD󲶬N¤H4—NÄb’Xþ€bÐ)ÈØÀh¥· œ¿{«)¥C×i[GîæXs¬,\s¬TsæXiÍ(KÙ•#‚\àenOÙ‡H+½#:±‘ЄÆ)ü{ wm¦ô€“iïò\Ä®‚¬AáÎFÏ”¡”õAdõPŠ=Ú„t¦‹Ú%´WÙ%ÐPáÊÅ!ÉÜK…?a&ˆ‹݃-KH²…³˜ø„ˆØø»nS#db¦—U¼|ˆ`ÿÓ…D¡ß‡ª0pÅ0þõ6¼"ÂYÛÖSsÛÝÅÚ.<°ï¬¼ />áþº=ªvÖ í­ÐfdOÝO‚*N}âËdª“ösb†cÄ¢ÞQ_à;-ì§_Ô3øàUÈw¦µÁ¾šyGÃ;7;¹‹û ´F|é[ ÷I?šèç#œGЯ\}2&Yôî'ð¥Ÿã¿g` ¹±a:À_ZßY…ä`C£®ÇgÓhž³fÜv¢7ÖÞrãB¸¼²hòn@E˜é ä°o23¾ÓKšŠâM è²Y|Û/ƒš4 Z»ZG®0»lí4‘”F¨üKlpç:ŽªJ,q(Ð^¼w †³?l`„Ü'nZÉF!EH7daª–GGd¥ f©[OwÉódìR ¿c©¿|ƒC¶JA¶Œ<]˜/%1YÓN¤VHê`=F%Š& Ÿ‚ CŒp?“é’Nu9'‰Ô%ª®¹–MS3ærø“]Ÿê ˜‡ßiÑ;Å ökŸ£æží—L«‰ŠaÄòà°¹Ö¾Äv ÕLGÐŒ#(Ôå­wp?ÙéÊN¿gLDd;ó=xvóWa„ gZ+RëË`´ê!›Ž‚L NE*ær¹Òd­2Y ùÁ²ðèVž_‹O”fÄù¢²6„¨S8{C$h†á[yÎ$9¨èC ƒ͉N'y¶E OWeíåLÅ@ …¦º|[mƉþ2Lto+L—-ª.ø(®G€K( j*ª5ªäˆX”÷ý%±úî’ \‘c8m¡Æ¹þ5~FqÙ\˜¯¦Lo í”øKSPÕÜ\0GÝu¢¸¦nh4Ÿk«ë™Ïœ7xÓ‚’S.£!U¤¦LoX^Â3²²×À/­à;øN`}àØ4žQX*hýySX7â;¸ð¨n Ð*ˆ9Àòúõ4zÛ^í!”^€`ñÇÁ;¥ÇˆBµÄF6«ÆªºËÛØÚ0Xú4 ±2`÷'Ä”w×g}Ú¹[1mîŽXÌäýI¬Ì“XA eŸÞ~zýÀô2ª‘bŒ10'±ôdž&& è<à¥gZcFçMCcÁà•Ã#`ÜK\ÃqŒÑªÈ20‰D!LʲcX“a&H|ŒLÜ4cl,•ºÿ ›&K¢¦+–â/ejÇîdy,uûYnyz Œ0a‚%$_6S c› ¤Ò>@H°Gð ƒææÆöhÆe¬¯¡› Ry¿C`›V”XR`‹K”ü±¬ZÖ Èk¼y² ùfGÜÒ@«Fn8Á€1«ËÑÅÁcT“ ǪRït“©ª¯~ˆ\6Gªß"À±…Ì϶árT®g¦Ô³ÛØ1¼°o¡¦QÛc·®¥=]œ™?ƿۓµEs¬ëËO¥.W+u¬«Ëƒçgû ßuyRªÕ¶SHÃ3ÆiÂÜvÐ=ÞÿÝ\^:º/—µ×Aw¡{ÃÄùë4aÝ~?|ø)Øž ªò.PÉÑ[† ×–áuÉå‘Â0|vãEf‹É¤|j+w‡n?i¼à^ÊÒ)•§ÝvÔ0j¸a{W¶|cÓ_žsèq/;¡ºSݸ„ÐN!„v„®M˜ÛFÁÎBÖ‡ìB°#„`Áf„ÚBØ!„`Ç;„°C⋽{ðowöÍÇHÕU™ÒÕ]»¿{ðËDíîÁ¿ç)=ø\­kÔ˜k¶øD˜Ë¦Š}²qà¢F:£I)FÅ„ [ 0÷3%L3¸%s|ºhDý«™RçMD¤”%lcø]øÐ§„(òÅ_(X¾©\4ª©æÐ¨¦öШóºÇñ°é,12~Ãó³AÄ«C·Œ-#ºØxá'¿R§¿2P€ÈùéA(]º*k×Âà#eŠ‹ÖÀè—p9&³8tJÛC&kS»&kÓÌ™¬MëY”Ýßd=?cœ&Ìm£ÉÚTs&kSú”“õüŒuš°néMV;“0œ!ñÝü|Ry¶Á£œrmá¾ðÏØ»ÙàðÍø¹iEŽ·I°œ ˆÀžpǸ¼ ð|á‰ô!Ýoš2Áææv‘Ja[Þ[{"a²þÞ㺠Â Æ PsŒ5fäLAS¸µÀFƒˆÍQjI¸NÃ¥Ìþ*žX*˜F6 W7ª‡ù+¢Ù(i(¶n=Ý({ÎürK„ ÓÛ2€ÈÈ͵öÌ¥üeãÄÓh3©1ÛôžÉ2ÛÊÛzPl­‡÷u|@ñüŒqš0·Œ€b[Ί­ñ;0@ñüŒuš°nÉE[ŒÇXî{àsÆÖû!÷=ð%¶p&L9z\&Â/í&5c<…ˆïÚp€ÆQÉŸ g$ÊŠQU5®–cÂ@v-÷rZNÊØ´ªtŒM«ªcӪƵÏÃ;°|Ò –m›ºö¦#ELFÚ%m¬XR\©êÞòÕÊ­©&5tl½˜ " šóGt{PÌ£5žGkf=Zã{´fêњч5ŽGk<ÖÌz´Æ÷hÍÔ£5£kÖdôhËÝ£Ý=ÚÝ£Ý=ÚÝ£Ý=ÚÔmô)U)ß²uàËoϽº×MeH3’“ñ'(‰XªAŠè½}¿ð™‚™Ò6ÞŸù“«œÚÙÝƲzmÌÉŠQ¡•÷SÖ S#o(.Z8ðÕ²Eeuò®~^NHR%€÷³–V²’–©=e¶ºù±eÑñþÌ©½z°8O<#$!»I'`¸.÷¤™² ÂçФ6ÈֵǬ‡õ8_°!* #À`²ù·Éõi;죿éÓÉzãÙþDö#™ê؃eR#ä›Ä+‘OθÒÕ˜ÖÅ¥ìúÕNdÍ805eá‹é¤< ¤™M»·«,¡I³•Óc{mI³ì†y @(i©ˆöÎÌ=Ã.ZâS¼„Ùað×ÈÆ)a6=|”Úà#TÈúUŽrmY"ú”ëÞç,6ÂT®Š(ôÃLäʧÓ$Ôžuäíö9òVäXFŠJ•ŠOµ‹ÎTÙ+ ˜ö¢ÐŒì÷Ä@ߌTÉ$P#èA7ßõ”jG6ŒM¿d0pуÀ˜­±&a-¶Vˆ!UEíy¡Ô‘§˜žDKËœpŠõÀr‚1ö¨˜G<³ŒšÉ%¹Ÿ0G"9DÖªýà˜7.®ñ0°ˆÇ·e—,«2){–×Ã~û±´§¦®"÷IçÖp×§ùõéú^Íò=Wj2…"O›/¯kå±Ù—Í.ƒ)¦ •/¯xg¸ãì{X6Aãwà÷àì{&c?P3 ¹»`ÚÚ]ÄÌ tZ-ÍN¢£Þ&‰Võ<‰NÊ2¨IYµl0*b0g[0çÒ36X®úæ|…@ÁýÊ3 ÕÉ8ÏëyZÛk¡ŒÊ¹ð·Ão‹JpˆîHT&¼T]–n—”-Æ„D•˜-®ˆ õˆÀ8bÓ_64*À¦Ë ÈÀFip$É>$j-_@ØËz1ÎfЗȼa}ÌܯUÊ/Ö„R­§HŸNŽ àÙq¾m>‰²P„äažLäн°ÄôxlmïŽ=ñ›©Q¶Øµ§Ì:Å›HI3¯’¾VÆ£ý}«pµ|÷ÈEšV¶î¿zŸ¾A /õ~ÚZY¹ŠõQY¹bZ²fç¤ Kåé˜WÒËBÐvc&„€)}!.ñ£™ÒðÊÏoËÐý;þèæ;¸_ï=°`½ìì6f÷­…:¯ÌQ_óœþ^Ž43ßÚO²>éKJÐíÞ «§w† ‹ú4PÆ (ÈŸP?æž‹27¶/×"âÄÒ¯ômðRO?p ìnbñ>ó ·ßDŠúô›:ø,Á/®'àé*~¡ñ;…Æ$ 篞‚Í æf¯õ'DžæÃÐÚ‚·äîg(90ÇŸ‹bš ̶05B~¸Ý"e©±)ìIõæ%þ¸£ä®Pþzüzø¨Ï¾H endstream endobj 2074 0 obj 6273 endobj 2078 0 obj [51 /XYZ 38.2500000 129.500000 0] endobj 2079 0 obj [51 /XYZ 38.2500000 491 0] endobj 2080 0 obj [51 /XYZ 38.2500000 129.500000 0] endobj 2081 0 obj [51 /XYZ 38.2500000 491 0] endobj 2082 0 obj << /Type /Annot /Subtype /Link /Rect [189 137 250.500000 143.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization >> endobj 2077 0 obj << /Type /Page /Parent 2 0 R /Contents 2083 0 R /Resources 2085 0 R /Annots 2086 0 R /MediaBox [0 0 595 842] >> endobj 2085 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 2086 0 obj [ 2082 0 R ] endobj 2083 0 obj << /Length 2084 0 R /Filter /FlateDecode >> stream xœí]ˮܸÝ÷Wô:Àôˆ½€ €íkÈ"€aYY3™ƒ™Aœ,òûénI}¯‡O)©›1’ë\YY¬«N¿ÿã—¿ÿùßã÷¾üûøCûó×Cv*ó¬ùÏñòç»·¿ÐÕ©ýû±¬ò㿾¿>>Ÿÿ÷Û¡yáˇ?Ÿÿö¿£>þéüߟýÛù—?¶ÿèò~=”ª<ÿüåú³.ÕùoÙíçå÷ÿ:üåwÇß.#vŸk'ÓÿÿßÙ:×ê2‹™/;t«T×?ÿýá·Ã÷Íú½>R×™ÕGe=ªúü·ÿüãðÓyønðìT[¥Ê–ÙŸ)õå;Ú•®ÏãœÉ2üÌõÈàâC«:ØÐ×YKÓC™B9Ç–ÛRm‹†4:«Å‰s\žî6·¡†¾ÎZší–â±å¶4×Õ•'ÎëàâC¦5ôuÖÒôh·-·¥u^¶¤ÉÇúý^â¼.<´Ê2•U¡öô:mi‚´{ŠÇ–ÚÓ mЬU½º @ùnô»jª€s™·4I®ÛêüTº´yVWðï÷¬Êæ­œKœd·ÁlG®ÙÙnÞÂévŽ-(ÀyQ„r‡{£Ë]špc_çÄ#v.¸¯UÕQ'Ïåéó:ºøØ*³á”þuÞÒ$éöu4øgAðDšß€ø7Nj￾ÿ¤ìÙOWÅñëOç¹]?Ùüøz&I~üî|@ËÏ<þþl?ýáøõçC}*tÞM°y¢*ô${ß)á“>£eÑßëÉ4­öÓ ûWjÑ“ßO \ž~’á¹Á'x4‹×ƒws"äù sˆƒG1u0‡(ÉïìS²ðz2‡µ æüï”SLƒõ5…cOE¿ãX)æÈUŽýObiˬ‘¬_Ϧ;´Ù=ÿx6ò:¾C¼ó£Ù—V¥(:¸‰rÀwðö2‡Ÿ5àE¼@k Œ|5,˜i ÄÚÑœ]ÖÉ”„5%ؽ[3ˆð`à ÇÎñWæXé 9gâð)ÿ—Cδë‰bXêj~q«ÇÇ@"Kð„¤ž6¢žRÜÚÉU žà òötÛð£Ên¢ÛŽês«ÃØ<Áä{À§îžeË:æÿ°¾fßX¿9)"AjsÏΉò›[b0'Šôlù‰p¼ 'ç¤G:pìøÀÁ€Q0u0ïPî~:V<â±Âª½» oÝš»„³pÌþP¼s)øpy@EhØõ³}±JµSV1e“=ë[2ü†eúÊŽwæ´Xp ­­ná¿H@Ú1Àñ0~–AÖÁOKç˜?Qa<Ú:10`·¬Ü‘PVŽYo°k”éoâÓ¢ÛãC”…‘Âx´¢“‡ôNQ oOMW­úŒM±ïÈ@Ê9pÁeÌð$¤¶p- Þ;Fð;PC8„PŒ¹vìMWðõ÷‹ ¯Çwgdï)± »C ÙUsðV¦n{H•ZŒ,þ§¹˜íÛüa,ÉØ4yØzb³™ÊLóYÑhÎje~£k»O¼£^üÉ®›MTYWßrŸ¦Ãú¬yG©n—Ø‹eXÏ¡í±½ëq윇s,+[„¡£ÜYS»Ü? i0æ“qÜÇÔaôã¦ÖÍ´c=øÂÞŒŠöb_~X°Š/x€1ÏŠY†¸Ã8ÿ¢\:ƺPg0Æ1Äj…8ë9êm™ÚY‚”ÿñÞߎ:|°‘¶udÏ2öM$Ò‡YÁ­OEè·lù$btšž0äÌd•–7­åo_ó¢îXê¸C´_pŠ‘«…éÜژh¤GžÂCŒ‚ß„Yµ0c,¼Ã»ÿn1q„ã|ØäÇë‘ç©Æ’Y§+Tâáò­?G,Äžƒ:èëh­([&Åà±0ïìS»ˆb I—.‹‰g"Öçeê…òæ;î…²å'Ö§åy”w*&tÎ-u/Ie†¬Üv™a^ï¤{I¡bv/©œ™Î¢T}ÞŸŠvò2™µ{Òƒ°Z£wf£]SyG˜’º5™¿SÀ'ø8·VN… k4šÕþ´Æ3hey*®'Ö+Ö\TeŸèòXMïP8Px×ÞU,¥ˆ…GÞÕ]c_G³7ïü…!!Ÿe÷ Më‘ÃÇ,$ GNåwig¡ú4Ç;N0ÆY´âƒ2õ-£O Ø¢¨ü”Õ¦ÿ¬“[<šîE4§UU +àÞAL€Æ\Šßyçÿް,["TžTÇ!—öÉTìngŠ)ð¬¬WÅP¶ŠPV RÝQ¢#[®:” ÔꨠŠ«DÊ'[ÆñøfÚ» ?xÅBQßC} Ææá‹ããœRT¢¯ŠðiG›íƒ¦Þ_ÛÝtüxÃÁÏ ˆÊê>q£¯o´pÊÁˆ&/û´ÒÏÖ1¤™Êí$#ýd5ødØòª6M¶L–9|Èz’¸=Y¤Ô‡lQ€ÃôÇFJõáX®h©p´‚@Ñc°ƒ:‘ŽÁŽ´™¬AÍ _"ˆ5¦£wÉò>–„ì´¢'¼&¸ ;Óâ¼8’-¢bŽJû=ØÎÙÜŸÖ–”J™}™h«p‚{éÁ”H9J¦mÔúí[N Ú,Õ¼údÔš¬3.ë Ë:•Ô‘uu¤šƒŒƒˆKŒ,nƒß)ЦKÝ—ZGÅ'.z€ÀuCÔÝÎJ„ Àšz@BÙß? 2mpŽwn6X.LRŒúhä 5É A?™>éÑ„C¢3Œ‹Ì=®Sð Ó¡u9ôÔqÆ!ÉŒ"ë;ëÑZÇztu…nÑ¢w°Ÿ’ ó-oi+%o’}R+õPã<–!dT4+'=gŽÃà‚Š'¬7Û]R6Š)›·ÅsÃñZ&kêÈ.=ÔU¢?¹V+¬,|YH¤Ääú~ê…Iᣤf~)Ôº`’ô¾ì ÕqW¶vVôPà“­z ­¥ê·ª•y¯ß ZöJ¢}1<Èy2V04ïoù\ô ìƒEK…;B0Š{ñdî­Xâ4çP’!’éB²MÝåÁÕÌŠ-;¬'á×o ×-ÑÀÜq/ÈóÞɵÚ!"Î.“à o÷Tfußð.#–ñH°¾ÇäÁ0Ý”É`üP&aÈ„F [âP½kpø@–í.ˆH¯®I±êP"9ëÞ­žr¦VzÀš„"{oè–PO‡O¨bÕÙ1®7^ˆ‹´Ç` •M}ž¬¿ãSv¤$êÛt„è–±A¹ yálLãvÓ –њ̬™à>-* íÑ´-Rï¡[ïÔºî oj½#?ÓCÕ nLøù£[)÷W”„7¢¶ýÍŠÊ–b:‚¬/R”rß QVyûÅǹ§ Rý• 7i]·äN©²¿º¤Æ%c?f)ë<êíà-®¹á¦a‘ÿãáGLÄ(˜V†ŒhB!õdÐ8!L¡†ûÄñSfaR\½ȃvCž[I-Š–¬xµ ÊV».À“L{˜}µ««ÇÓ¥L{• ‘Æ]…„ÂîKô³gf Œô%ÊHd»ÃúÀ›D‰?n Á³±Ê/ÆêÉÊ6Û˜ó9ƒ#¼ª,‡ä!´'Õ$š(6}#Åöê̓¸¾²ŒÖÌ506XÔ­‹”U¨'#{×ú©ÊÞ{Í6¨ìÔØG[—Ÿô(öN¼£>ÁwjôNKAUžjÝGd·â , Ùð;-‹L½ƒgðÎú= GÕpnÍzŠ“QzÀØÍ Ê“ñ× \œ5þŽc=xnºÝÛ%nŒÖº³ÖÍ ?qðžÜ¼R‹ô’¤||ž+!`Â1š=Wu å#4cP{ç(%åˆW‹^0³2.¦‚>•«oÑv8ÈE\¼:[r¾fÈ%éØäü‘zuÏv"(8Z©Á R´g´pòB¶7¾e6ë$;GÙÚàX]/£™‰ÊÁh`Ù‚1Yc…F\­Älå®Õðà&›&–œqÇëL·_.`$—qŠøï„´­Êö‰Ku˜Ú^ÄÆ!ÄL¾vy;&.!RáH,¿Z34¦÷6"ŽÉ2&v¸ ¦Šžéæð!°%Š¥ÂMÙ~ßfN•!-?>\ø„8?Û¢%q&I}š€ÇNÃíõçz–ŽÏÛ$äÊÆCZ™RõÍL 7Ê4~r˜kÙŒ–µaï‡b•-õÀ¥bÀGÉqyíÏq>ŸõÝH¿Ú]|ë,®R†OZ­7uïmGÃǸç}$«Ëg­>íÚØ©ÑÄZ], ¯®f÷;ǸÃÏî ³ž}>Éð.À'x4‰Jž5” ‡ëÂÞÈç[žR=žj~³ˆ•‡¡ÑÕ³7•µ Œ3Åò].—Õ-C>˜;9dÑ‚s‰¦›BlxPyðÂJWNªO—÷=äµ~û‹__*3Œ®½LÖµÌÍ ŽD®lŒØ5ïçM«'ÍTc¥ªÛ¥™º•šbŠ‘0ä'=¬³`ÞÉð;5z§=7žuGƒ•zóÎkGÿXªíÞ8õä½ÿ Z¾šzΠÔ©'5­Õ’ÅÉ(=ûfåÉŒØè}ÏDZ8ëÄT½Þsñ# ¶}—yþ-ßã¥)|ö%ü=YOòD$xöùúrD»j¹0ç4Ê{ñ¸¦HòIh*ªÇs¨û´q‹Z3Ñ“Èë"½d˜P§d¿#aù„ëóbí:>™2'æZ8Ç8gNŽº« ,æšâ7Lƒ‘aK2þ0Sú &é $hjm‡hy ÕŒñ'ˆŠ£©`¬CaÝrLb£–žt ÜÜÉ~GÏ´ Ö„< B=Vqƒh>\ÅjÂRdߤKøUT¿eˆ&½gÓ2Ý™u½§[aeƒOŒ×>ö˜ä=fx‘°T¤îF«ê×~¾®¨°Ìm|Ær•õk«TÐP$/gwh}îÙAÍ@œÝ*‹]ï–ƒç‰A²zh}M˜c,óV¸|“Õ47«ÂØR¢õ•£ÅÖê|±²ØžQ5 shÝ«<ÿ9~;+<§>ü<÷œn«)ei΀L]Ž+GÝUA´õ4Sg’† å„ûØp‚>é®4¢B1~ÒÖ#èS1Äêh‘/è;f.E25·OíJщ Gíë”28Ùr4Z`Ë48¢‚ýý‰e(<|§UÊkéoÊVX†k‚)]Cûo4~DZј¥!ðî)x¦í`{TÅ{„gý‚س=Ø®•Ú’'ø;mùÚ”|D"ŠyÎA ÀÜåámaËeV8`Ÿ-ñâÞœŠg•òçãçÃÿ~¼3R endstream endobj 2084 0 obj 5553 endobj 2088 0 obj [52 /XYZ 38.2500000 276.500000 0] endobj 2089 0 obj [52 /XYZ 38.2500000 425.750000 0] endobj 2090 0 obj [52 /XYZ 38.2500000 313.250000 0] endobj 2091 0 obj [52 /XYZ 38.2500000 425.750000 0] endobj 2092 0 obj [52 /XYZ 38.2500000 313.250000 0] endobj 2093 0 obj [52 /XYZ 38.2500000 276.500000 0] endobj 2094 0 obj << /Type /Annot /Subtype /Link /Rect [210 613.250000 240 620 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_feature_flags >> endobj 2095 0 obj << /Type /Annot /Subtype /Link /Rect [246 164 276 170.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_feature_flags >> endobj 2087 0 obj << /Type /Page /Parent 2 0 R /Contents 2096 0 R /Resources 2098 0 R /Annots 2099 0 R /MediaBox [0 0 595 842] >> endobj 2098 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R /F1700 1700 0 R >> /XObject << >> >> endobj 2099 0 obj [ 2094 0 R 2095 0 R ] endobj 2096 0 obj << /Length 2097 0 R /Filter /FlateDecode >> stream xœí]M¯Ü¶Ýϯ˜uŒEŠ’( (`û=袀a]]IÓ"H‚ºYôïW3’fæQs(ñÌ%%Í(FbçÉ")ÞËûyîå»?ùÇþ_¿ïß}üòŸýÝï¿ì²CUdí?ûã¯ï® í¡ûó¾²Åþ‡_wßößvŸwŸ›ÿ~Ûµ/|ùø×æOÿÛëý_šÞÿ÷æ‡?véø~ÝUªj~ÿåô{]©æOÙù÷ãÏÿ½ûÛö¿Gì§ëóöÿ¿+2Sëã*Ffþ¶ë¿R~ýþÃo»wí÷M¢²¬¶f¯LÞü§6zÿßî~jÆïGϵQª*M•Ý1O¥Y[î•®›Šb0Ïé—Ìèâc«Ìd±Æn×-½%*/•ðƒ5¹Ê+]˜#ô-¬ÕÍŸ«¼ûç¾kþç´cUýàH­Ê*×-¼#¥ñØrXiU·{SËŸßËà6¾áôhcŸÖ-¼#=QáØ‚D5e/ÛŠ¡ô¿{w.£Ë]*mìÓº¥·¤'+\®•²éz]~l[Æ“§uÇ¢+\Ž®:;ËIeÄ÷çjtù±UMm·ë–Þ’Ž®žÁéjTo¿6ÿŠïÏetù±Ë¬ˆ6öiÝÒ[ÒÓ.Hײª"Òõ2ºüضŒÈ3ÇuÇ¢+\®õY–èZÇÓ¯y‘gêVÊnIO×ÁàŸÁ iB-ßÀ'˜CˆD‘a§Ñ$òÒT]÷Ë|OXwó{\pa‹½ì€àѰ;ƒnlû> ^5ö*ð<Ôà/Å. 3Ït—ÄãÒበR–äÙsèòã'”KÌ|æ¡îž3‹pé<,Š™ª€óÇÇä³ ¾g vEÔ|…R®êÛÂh2ã#5]{β+^<®„ѧ8~çV¢Šç8b:1ºGÍ𠘀a€’Ä ?8˜0»aÚÑMÏqÅr"à ã£Ç(ÂÅ+П¦›²gcºÏú"5«õÇÔrÓ'ýL»Õ·²’ý¶UeáX( Ú~ŸN4ÑÃ…V9Ÿ†•º©Ð§É:&”!:À0‘¸ß¡¸ ®ÊÒ¡Iac³ªÜ9©IËâ*;”•z{,ZÉ ŠCVço;žîŽ’Òý£)+ ìgÌ*!ˆ"(à|0Qi ¯}ƒ$‹¬¨É›Ê9†"0žÈôÞ oóÅê¨ö´™ êàxXäI&¾"‹ò£‘L¾®Ó´3¬ÃB´§’X¬l–| ©ˆi 3ÔæéÍPkÜ9ãë\[¸Þݼ¶$e}›$L”*æ–Öî:Õ qˆD+û­òžv÷©êDAñTÙ3Úf;>ªíâA`Ûò‡ç”hÆn¢bË‹ Üïˆ2ÒÖ:Rž¢8f逹dÆe¼->AZš—Å,K…¶ùsT@.€#ËèU—š=ºm³MnMÜ%肞0`^ŠQföŽ@}:muŸÌð‡2BBFyˆÈr¼$&ÆÅðƒlR›ÐX#aÇc@±\‰’(ö˜;Làã²õÓéŽ bú¹,Z0; nÀjë¨ô ‚$!ÆKÉâë˜hg;¦D×ÔÆ8HÄe‘ºÐ,²62›Ö„ÒA(;6êNE†e¦ž‰àY˜€àªÇQ”ã°6ʵ'lÙ ?f,¦Ê%×5©]ɶ9ú‹6ÖÆ|‘qL{f•D¸E• ©lt?åÃ!•/Ÿ¶dj”òx [¡Ê2;®Ü V#§×#Àn<‰Þ PÕùd¡º!0Ir,¥™Dˆ(äm ’/Iw&7»ÊÁ?%ØV6ãFUŽe»TQøÔB‘918)EÇðÞD%;½&ÜÓ)H–Á¤dd‚ÌLÝ!Í Ì–ÆSðÅ„ïsX''RüN±*Q?àÉ+ ‚!b: ¥võþ$¦1NLÍÀ3]UÕéƒeÝLÊ À:‹¶]_ý†`2ãÕT}Ä<ó@\gñc§}öé¢~®æ¼ôígíO&­F…¬¦péF8ë”W‡Ï,X{NDœ§;Îgþh)¢†9nìq_Í醳ý¯»¢|óƒ_v_¢]rÛÚ–.± 9Uó¦ˆ1ù¥¢Ìpž”}$M÷¶¼…`ÕÒw™ïv¤+r5¾¿ø |w®ç—ѽ²(&œÜéw{$nñp…xfÂŽ”õ(…æçæ²® Ê­8i¨eû{Mpógiò·Ä¾£JTxõh.õ†ßÙbqÓ|™ÙQ6Ì¥ 37NÊ ëH°(Š,¢ÎëÊù‚d`â²:[ r2w”Wæ •÷ÓèQÏðÖ‰YUÀyð;%|‚ßkë,L ŠÅ‘–[;º2à¶ê¢U>bÛ«ºYäA.‹"é7seæŠD—…E•€™ÚUW©® d.´c€ „¹ÉˆèôAIÉDe:¸DwÍ­½†1vE9|Ç3ÏkøhLËLªÃV@ ˆp€!ÚÆ„ä}ñwI xBòÌÚ…êe¸éÕ¥èÕ˜]&ºÜô•â  ;7eô, fÉ!Ùv¤žÛ,ñŽ2p`QôJ€Ì`Ú"Ìß)_–)ìD¢VZ6- !A~£¶ãÛñÜ(†ªXCŽ;/àhÅ€»[-"“]UŽóô™ìÊÞ“É–å‘;òÕIöÊföž½‚<âéü†Ï:ÌdãÛ5=û QN²˜)a~Y0Ç.¹`*É>Ú®nîó¬«;Îs{³>Ióu¦ì÷t~ÔKõ&O* ­Ç盞êÜãN…ñ±7]°;Šx˜bk1Í t`Ïãò1Qq¢ŸÅÀ«^ç­QzcMb·Tù Q Žl–iZÀ”Ö…DÉòŦú#j›"Ëu'zÐý £÷KîÞšªŽQö®Ùå]ë²1ï$æ®W©`¸h¹¶Ç:dN'a3èöù˜‚¨Mßµ™É£:ªM=T§ƒèÁ鯩Xe9¼‘‰†m°TɃ”Ï2œ’ÊH$üRµ»cß„ȘfBÏg†É´d~—ãhì"¦úíº\±Àˆ|IŠÍ¥âlÎPeð‰‚õñ+Í]å:c–AeÖ¥Õš:´Ê ’J…âr‰4§Ì}²²&)6û˜¤l×ó5™E«ë[¢B—­¤(ψ¥vÝ*;´‡~°îâ ò€yÇÀwjôN'SUqhérõÎ'8ZWYYöÛ}ÙÜ–vÇTŸ›É£uZª:äÚÁU«vÊCÞ.úê´‚Î.»µ¶pm ÍÓ947ÖÖg¦BV ’å”ëºÔ¥±o<ÊöK`;ð*â'ZjNÕ5þs]iœê6:ªá9Ž‹b_‡žE⢌gÈÄÏú‹¹n`öV›TÍ‘C À©D&'\»"›6ylé3™­]=Çä5&Ù›"ûz aù:+ô[c- ¢I1“µ‘ƒÁOaÒ`P2œÇ‡Uè ‘Ìß~_Ìë ù``6޸מµ{ÍДº¶˜ºãVŸ”Œ÷š§+QÑY¥F×ã%cjáó ùï¯g¢ÔHöÌh,…0ÿ¯R.ù4%òë¬>Ï*ó´*M?ålqðqÛdíô-mpßÄ"×öˆ’gɈÉ-"˜Íè“? V3fŒA)G=üU­³ô[óØ0Em]‹‚qo±‹Ï˜÷cæcD–,[ÐË5K¦2êtvþL\¬Åô…qË£„¬Ép¹X¢n6”þ`c«#$CBWͰÕ©Ä+a F8È“Ìs Fü$‡†~ò>¶ÍËÚݺ€Z£Dw*'»>à‚ÞpÛ«ÅoãZh‡[2qŽË:k@BŠl÷‚Ù.¦äüÑ®C‘¸šê†P{@ÈvÙæë áÌ&Ï%Úõû¬`q¿ók•Oו³DêÚ¸fÕ–0[wÂ,fÑ*ít+\")âÑéxxˆ9Ý^“ÁE2Í"D[O<¤qɘZ_Ê¡Ìe–¸âÈÙÝ%÷f§TÂ[Ð m1ºóƒH2’t+½÷juÑ–LÁÙþ0É:>IíË`,æb-¥kÃ,¯Ì”kO`î$¤¢ç&&¢ÿHËQ%sÌõG˜§‡2< •°VfìbSVjx„L+1,¶‚ÃEs"¶DË‚lÚTr‰ñ’§·(¦Îq‚æpµv“Ýpr@f˜i4M¹ýYªÞZ—g¡ª÷~vQè‘4zØ÷=ÐhªWì¼àY5ì>1ÇŠT}´¾Ü…áPL#GFÉ dσå E±/°Dä8†¬ÚzДdz" "²0] ’B8RÊÿD!0É+bª[ºzg=—',©0Õ¥ ¨*”È$뜽µ?ÊÁˆ´߬ÐǵB“ ¿Líª+ˆoòT‰¶´YikˆäJ€ÊʬqÉøtÖ9eˆBb8eÐêj §Ò}jðÌ©ÎK†›¯à'›œYœébj¹²wœ¹uç•»ÌTé¹gƒö=Núy®ò£d™–¼èOC²L‹…ï)ÿë'-Ÿ–Ã'ý¢¥Û»¬+ô¸Åk/hž|,vkmŸº/E`¬+v±h+‡Øqû­á+øÄ ÏPx4øNÇ­*èÓ¯Ì\–áNvc¦zBá„ÆïxY‚¶Z' oí*¦^õ bÏ.ˆfzc{Ê> endobj 2106 0 obj << /Type /Annot /Subtype /Link /Rect [237.750000 333.500000 267.750000 340.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_feature_flags >> endobj 2100 0 obj << /Type /Page /Parent 2 0 R /Contents 2107 0 R /Resources 2109 0 R /Annots 2110 0 R /MediaBox [0 0 595 842] >> endobj 2109 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R /F1700 1700 0 R >> /XObject << >> >> endobj 2110 0 obj [ 2105 0 R 2106 0 R ] endobj 2107 0 obj << /Length 2108 0 R /Filter /FlateDecode >> stream xœí]ɮܯÝ¿¯èu·Y' `kEA²²ì8aQ²Èï§²ßë"O‘uúV±È¦…DңȚnÝùžûí?ÿýðÏÿ¾}÷ù߇ºßß}~)ŽuY\ÿ;œ}óöº9v>ÔMyøá×—¯‡¯/Ÿ^>þÿëËõ…Ïïþ|úÓÿúð§Óÿ~>üõo§þØý£ó?øõ¥Võé÷_.¿·µ:ý©¸ý~þù¿^þò»Ãoç/öÃu“¹ÿû7¥²•9Ïbbä¯/ý*Õå×øíåÛëúƒQ…nuuPÖØƒj­>üç/?¾ß½8¶V©º²uñÀ8µ¾ ¤šƒÒíéCU1çòKæëâß6E]ÇúöuÞÒ[¢L¥ü—;W£Û펲ò{ÿúuùoë6Ú¹^ç-½%ݹz>.x®¦,ºÝ)‡|ááýyýºü·ËBEûöeÞÒ[ÒŸ+þ¸à¹V¶Œx®¯_—ÿvÝVѾ}™w¬sÅ<ׯ¶×ÝѶ–ߟÛ×å÷Þm<š¹Ì[zKúsÅ—;Wk«NžvI|ëop¬eM%»Î[xGºSÅß>6U÷ü37rs¶jNÚˆ=il#\"êÀMY: øÞùëO€ óÕóâ÷_^¾ý¨Nl᤺¾üt:ŒË×ß¾œH <ýå¤ÝÚÓß~<ü¾(ÌÇ?¾üüÒ+]ö3¼>)Zøä}øý=|GÃ'ÐSÁwàz|GYôÄ6ÄîàwðJá øIægŠóS~uð¼=|„8ïp² õlíIQ†?ñŒƒOáiô <ކÔë9f=pß –ÄJæƒXš¼ ŸG¢b:€ïLîAîmÊ-˦Òö» o·œ‰&c‹ËdTqS"¯¢@ǪVM]˜9–gƒ³|{Ý;æht£ô¼wøäJ°Í±i‹Ëޏ½ì‡™ó5s[óªß™ËìÑšk0Ͻw#Oð”<Ë€O<ãX8Þ>kf¥xÏx`˜0L÷>ñ̯§qƒ9ÏçóyY‚Ç{&Ëœ:Ø¥¸,Òhã°%|ƒ’Ü£#Oéï9®©•Ër™s!(Cîè°4œÛuL¥z²ŸÃÌ1m›ð'Kß”0¶ˆ'K,£S,ÆÆ©à2êpQ7±žýê^ |Ë Ï-À›ïž zŸJý²½¦«? õ+d“ y¥BùÁ¢+?PT3Š™G[½ U‹ÖÜÏà;øµ«(Qº4g¯1 ‚ï€û׉ȰˀÇqõ†e ×…5Qn‰©™b ø¼ôÁþ1‡·kÀ (+#‚ˆØs<˜ÊðñlCÚÈÞyÊ‹® žÄ#𢨸c¤€é–0R‡gßñ8ßçÏEÚÄäMï“««ÒaåŒX“%Dã 9d† c +5ˆýPXd&‹/Ø`ÿæ¯KD7ÃÆ.EÄX· fÌÜÆÇƒ-K,ôsq•F”‰ç.W(îz ¡·,ɺñ]Ŵͬg×bRi1”;"@à¸ö¡GDðÞÈ®«Ê¢QIYµP•5M9àNñì°„Ë‚ºpÅw@té«•rèxèhÅj8¾ÞXE#DŸp¤BTX Ûgó’‘Ø ÞPlÆ`ÊþUòyö~¾•ÔÝå$I/ZÕ÷SÏ2Øà„?œn‡ÃÐ9$úmªû‹”LÈ$âô2ÏÙÛ„;R>’^¶|š¸gü5|Ž8ùÎ:a™ƒÑµ}à´–MœP¡nïÉ_JʤTáE0…:vnáDÆ÷`®RI~ósÆB‚ˆÓš¬ý‚ý„7/ ÙÅåKºÑîíMËc標gZgŒUäb#翈& £ÔŸ˜¢©¬ HèâqâaÃ8U˜Üáà²<}P˜J¿s—Á$‘àð!•í‡tʦiL6j¾† ª°™ «Ž–74,ƒQŽ„Jvq×™å³QÄ–dÈ Oç(ŠŒíÀ WZ^-NΘŸ„ÑÌäif ® É I&*,ƒi¡¸çeŽåeŠâ)ÇÚ#NÃcD>~fÍøø(…¹>™Åm@ìÇÅ*Š*c³‘Þ÷ÓÔZ±DƒÑ%CåŽÃ'!`Œ˜ˆ,¼ÏòÕÞ9;¦ "4ÙŠâ(h C„Â)\1 ô"Æç'wÎØ±»¬6£U¬‹)®3¢Ï 13¾sÆžeä qÚT !±bhü PŒ,êÜÔÍŠO­\)¼»Xs¨<㾌¢áfÆ»cÌ?4ÎŽ1ÏÝ/Œ#NøH3d:‘¸ñ½²ªue"sÐŒÝO¼îÑP ›L9Q“D 5\˜TUÁ6k|dUTÓ·“`¢xÜò¹YŒ+Ûrù xál7‘ÀÍònŒe”Õ˜(O…rXîoO Þ}8Y{GŸÇ;³†{ÄxK<²—ñDÄ5ó–…S„ŽNk\I´ÊÔ0™ )“_¶JÍŠ¤0Y2kÊQ—©]’µ£…‘R%%ÊÆDôŠÔñR±åŒ ,œÓàIIŒªtQ:Âj£ÕGÉZsn¬N‰51˜òéérzšË{]eÑ3_)/ì@O^[ÝÀˆ<}60 ÑI…H[¢ ƒjî@†Å¬ë_éu«¶žœÏÖ€uw°@ߤ„Ð;çºu£&„Ï­M¯Aíð¹éèj‡ÏMÇyøÜ]o$õÆåAO3×1êò¡.n»´Ní›-§Ô>ê±,€o££¢EÞ6í®_3†D †`)òï{®gßlGk‹ñë&À¤IÈ s`39Ãm#0£RA‘c<ˆw…;£ç’Å”,כ뎣ªÊ”çßG (‡ÙQ€ LëóÀ‰£ÉÏrp²JèN©D«G{ƒ¶·ÅžågS‚vÇD+öiX¯T™A>Üž»ó˜°ªOD2jZjÖ^wƒRÆj›¦ofX`$|âñ’aù˜ÇS’±7N–ûzf ¿fß~‡‰bá¯áõˆÒGÖ>»Ý3í›ö?{(kIPß( Gù-ñm„ãÈ5ºŸæÄmqkß¹»²|ÿâôŸÒ/Üš¾¡¬|V aï:¶¨E› ÌyðÈ+ðz–×7vY룃]Öú¾¶ËÚŽ«–{Øè1Y»soßi'Õêú™â³ÇëáËŒýœ(*e–IÛV“óY^¶x$È~·Îçh uËÎÄ9W)çSÞúÚ­Ò[ç‘©„F‡³¤œõÇ´YŽ‹¸¥g]\nm ír‡]§H‘,gßeya> ?ºw }¦-[gõ "ðp%‰°œBsþ¬ðršoKÝ×õ'³ÎYÍ?çrpÎ[ƒÃëaÚ"t†Àíæ]OD Oä¼±—}mŽç÷}©ÌÝ~yùì¹›q.õy £,-"#©®™ŸoÉÓ•xáK@(·æ Ãä$ Ù…ûÇâë¶«dúp1µ; ã Y¢àÁ³ Ц¢ûÌF⯽G*—ù )gd½…Æxd {þi2‹³î»Q'ºÜ‹ge²ád’Öe(¿lBJÇ—ÈM’Mc¶¨‰*Äå²KV\§=’–AÔ­G ÌDkeQ:r-€åÉÖzfë¨-û|ŠÛiè'Ý=µ‚y,•qö=vÑQYÁhÇTç/¦DžÏÁ»å=D‰ò„ §r6kÍzI—J[i—dLý“~…ÈÍyN‡èºPlà¾=\ªFO<ÂF+(ÒÌ.¢ñ 4^O g`cßT¥Uåj£²çLã ‘/(Ÿ?bd¸¶Ø*S6cw º’X;Íßæbï¤â! ç³°›ÚÎ}»ŸóéR;TÉÔǦJµØ ôæò¦ÁîB‹íB“‹ 5~bŒ¾ßÓ± Ú3ÆĄ£yeZÝ/ú¦ª Þ™DÚ‹å@uC•püNŸàwàÜ:±1FFí„®2¶£p¯ñ :Q3f–ÅW~›Ò¡#Oe}Ù®çÌüûåíé®’[öÝt %sÈjÕé®AšRxÐ,fjjÝ#’-À›*ê€ (Å)¥|És²¨3*EkîÇÁh»ËA÷^¹Â{(ŠßMè,cU<øŽ‚Ù@ú=wŒW‚) K•N!š[J!á• ‹0—ƒ(–dœaó¡SB²OçwÛÅĵ\Þ¿lTraœÜ˜íjЫª N”hz=¼I ÎÂæë‰Ã^dâçÈM]¸Z¶'°‰ 6è\÷<ãhì·ðŽƒÃØ4ÅOÄ@ü¦ƒ1¦ÔsçR.à.zž3ð8àiy΄ Š†âñ;Ó‹˜·Ëw#[»¾Èák¸žÃ^1aLãœ/#P·%³Öõ|²ÚIx(í8‰D³qÇõ²Y&aVd˜.+0שÙ2€?ÝÍ ³ö0WÕ­§)¥ÂþsÂMÕÀ7Y–ØüäÇd¾âØÖš_íÇÄÚ².Å‚ï9§ÿî°çpì9DÇ+y¸k—Ã1bÖo¬æø‰êÕñ8°’]EO¸1YΈœ|Š@LS£‹†½:xƒ lf Mî=1ÑnX"ùóTèD¶ô–™Ó£„¨´È¸$UCö¸ù~¢óæÎ‹øyeŠêE²"SÅ—V™ÀŽZ) ¢®=@çQÏW‘^S­!d‡”Æä1CvDŒ‡Ÿ1 ©DËer:°P€ [,ŽiÊ1ÔSùƒ§*cç^K[ß*Tæ…#6ð œ ˆkà!Ö=Îoõd¾N-$9“RU“óÁO<çw^ãäP÷R8”8GÏzˆ˜Î`–‹ÖÍ8GSö£ÂÈf‚èáÕ¥[¶3d‰h›PÆf¤¢jsdD½ L¯iJ¿š oEN}éP¯W$3ñ¤ëôºêåSb…›gæç `ƒ±à&Ê$ á *3ãáiûKÅöàs²às¸¹˜ÎeS;’ì” t~ƒjáøS…1_i£#YmX¶ç+ã‹ÇGI¸ÄeEf ²›â~>2†»p[ˆ5 e5ÒÉÓÐ;ëÓgAŠQ¥«x*¸}ÍÄ1aº;ÀèXÊØÆ]\tq¨L×Á1@Æ÷ÛVêFV‹á+‰FdS)¢ËyZ%ª)E…¨ °Ž°´&æÆ¼9.´‹i:_Õ¤$/ÅIRÁº'6°™erRÙÕv¾Š¨¡2‹•¤G  £@¸ß¦lCæxe“®R!ÈFJô%˜½l‡êFxölðPålëÙà x6»ú³7’‰qÚØ ƒ©àêäÑÛüeüf?s rÅt(5°ÁSi"miV…A$²â¦ˆ‘†‰l¤T)ðÉ&‰vœn>‹N óÄNy錬¶J„¶Rt.€¦­³ LóO–ÈD&dtϽcÑ1ùp4¤Œn"ô²ßÆ¡€9cTã/Vñ@+¥·óN$èŠß2 jFð&?¨Kµ›ÕË>UA3~E´ØIÆ@ËX:IÛqkñJŠu˜§«iX3Æ(«cgv{ì½Óé•§rûIo4w¬û·ö€„êcÛ¸#„sz‡žà¯u‚edž¹‰ÔøZ›ÄìtyIÿˆC!Nxgû8<9‡ýe+²±‚Ixf˜úî¡ψ:ÙfZLRIª¤óT¨‘ïÑJo-íÍ µ>IRU·®„èìâbBKqQodá=<¾õ©6#ïÈú]CÿZ°•N'êÞ]+§"õ"Úl•DFžl‘…Ì5J•‘"‘U›ÌÉcSâÆŽÛ.“ûUpzÀü‰ ò¢]ÃÛÊU Ž´êÞ'T6”™’§Œ›ca" w‹×3d¹C¬„ä?/V°µ|*™l6?BÏ9R5Ž›Tax­ydO‰Ì1 KÐZÓbð­i ƒ Æ…ÛÏãY3û&š§Ž©+üÞAW\4ÉVðbå‚9íüJrV]©L%«‘LëHáØ™Œa%ÒÚÓÓn3§AlÀLDÃUÉXž„O_ -Iã%]sÛ°LR%²íFGÞFGúô8UËËÄœó„+æcðP^Ñ‹I¹Ä°þ'Ñì|¥j쪊…e‹ÇE§ž¦>˜Ë3‘áè} {G^¥EÂlª"cçÚŸÊÇÊ8çM]Úm¯p÷æÅ‚›qI=D$Âl |bêàò˜“æ•0Ý"B–Á8éqƒö®*ë+k~ö\dÞQ¼UF»âíy])H•¸Ïè0²a '°nmÓ:P“‘B¡:«K(Åz#×PÖ¡N .^‹%J³T°™q&J$IV`õŒ"æÌ-] B6ufѧ˜áõ®{Ë«ä£:v31s&‹*nÛßu×øÄöùK¤•Ë Ë2IGÝB;7¤;­ ö¸BááF¨È=Ül7º3½®Zg?<Ø!{%—ŒÞa-šõr0„"É´ò —= ˜Á@ýbÖJjZW¡rÜj?Y@姯hѼ-!ƒK–ÓØ¾Ó9–ÓÂw XŽéÜ5•K#°3ýv<¹~E«ÁUÄœ:F0£çÖµ²›ÃõLBïŒ=+õ€ÿ0+Å_{Ó;ýôëðõD^rý4õf°ûf¼—òI§Qç‰_èýº§ Z‰m·"ÔYIõÅ•8<¡jø¤‹Ýè‘ûûA©÷h3•>56·ÝJšEǼ±P².`—áAkøùzB‘Y†Â_ƒïtrK-ýM§U–à.^èBõ]†´Æ5¸ð µ$ý¡gð®â“pÉ&¿£©‹æ¨®{pwFpMÝ5íØØ ;|zù?£éÉ endstream endobj 2108 0 obj 6970 endobj 2112 0 obj [54 /XYZ 31.5000000 319.250000 0] endobj 2113 0 obj [54 /XYZ 32.2500000 624.500000 0] endobj 2114 0 obj [54 /XYZ 32.2500000 317.750000 0] endobj 2115 0 obj [54 /XYZ 31.5000000 625.250000 0] endobj 2111 0 obj << /Type /Page /Parent 2 0 R /Contents 2116 0 R /Resources 2118 0 R /Annots 2119 0 R /MediaBox [0 0 595 842] >> endobj 2118 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1409 1409 0 R /F8 8 0 R >> /XObject << >> >> endobj 2119 0 obj [ ] endobj 2116 0 obj << /Length 2117 0 R /Filter /FlateDecode >> stream xœí]Ýoä6Ÿ¿ÂÏÔ«oÉÀ¡À&›=à6À=îá°mïPt‹¦}è¿L2¶š1‡’=3NÐ&;ŠiФHФ¨ûòŸâ¿¿üV|í~>~Ù‰Ò[Ñ~ûïïÞ BÙý^ø`‹¯ßv¯Åëîy÷\ÿÿu×>ðåñõoªø{ýßÏÅ¿þ]øC÷Gû?ø¶óÒ×?i~V^Ö¿‰ÃÏýçÿÛýó/ů{ˆýë:dŽÿýUF›='Þüºëg)›ï?¾þºûÐÎÖK¤0Á…Bî?•QÅï?î~ªá÷ÐEY)½3^\ð¯ö/ªTýCU5 ­Gïi¾y ³Ã¶ÂšT°[¼¹I"µ“qàe0Zj¯ê™Õ<Þó׆ êß½î¾.¢˜.¯ßA燭tH»Á;¯#ÀËàº/ø;íÕaÿ^­öúC†"¥ò°:ôKÐŽßs1cÞ óöÚ&ƒÝàÍM’^ 0pF¾ÖZ'!_ß óÃöºJ'3{¼Sñg䫯dKUk~Ú÷Ðùiï„Mg\¼¹IÒóOjœ46½pJô,—†ŸéoÐùak™Ì¸´xs“¤¨pF¾j×-·Ê& ½K¶–q"Èìñf¦HÏU›‘©Vê–6Öóç<á­KfÔ[¼™)Ò3ÂN»ÏsNÉtŒ>OÀ ç}:Ø{¼1Âf\½^õ‹@VüÔyƒÎ;˜t\mðæ&IÏÖðç@0"í' Šøyðáe÷ás’+^~ªkÞ×þxù¶3û‚.^~(þ*„¬¾/^~ÞIQ:/ƒ·Íß5#Â7#¡ UíOXñ6"‘-4]j¤zM¡gÄS3bûGÞAÃϘfÄ”F·ñà·ÛŒèÒ·ŸÎ»¡Á™ŠÐ޼}ðˆ^AÒÀgà{„¢Ä2/HPʼ"ìa!(”˜ˆ”Á÷¨ ²‡•¥2@É„ï¡Hä¸6T€Ô#”y† L˜¢Zž-f*³@0ŽXº(²z?¼íhðôR›Ó4¦Ðª‘-„òDÒP/Gì'ÖXËSäÛiŒ5Ölx>·B››ËEp›A®‘ƒ€q„JkE^cq×°Òà¥ÅóXG> ²™",zþHDF±B¢@Ü£l6NÑ-¡ùª¼»[ó5Rq>">†ã]ì§>ÎÔR}hí³ìyyÆrPðLƒ‡¡­ LÐèùÄEVgxê7·HfxKšG ^BRBJ!µŽí¢e•P™λ ò0û ÚcéÍ@XFL$éž-g,x‚;‰ PX…ŸÉÁå=Œ5Æm[åׄ ‘}Ì⻢\k[lÊ)¹Šªe‰ßàg(»>Vu'?yLððMËÁªôΦ•ž`róætš7,i#„2E 1#ž¸H'@Ôó¶%žµÇZ§*4Dæ3y‚#aþHçLÍÁ<Ÿó1ÐyRûmGº{Ÿn;>…)¦æ#¤UD*LFŠTú´ŒàH eÓW|"KÏĈy„#x@žh¸1nø=7 åã&!n$¬¡FPÊ1ËN¦ù` Á ÎTažb…r­«l+ÝÖ†9#>ñ(‹Áõ‹¾‹~ªÞZŸcàñ&Wå‡GœkŸñ{qHoe°GF W6æ‘Ð)¦õˆ-®cðxê˜ø[¬à:³¡$BbõCIPD4Ií)±–bͧ´YA ŒÖÍ%–Ö°c¶RW¹w¥xÀº{ÀÞ©Rœ-/uÄ\@·<2fÃzdlñýáÉe^Zç‘eï×#Ë+ŽÜ‘”¯… yä¿r«‘ÿå£L÷#å™i>¦üÍv“0+o‹Ój”ÂîÈ&0m1 O6f>$¨”V#Ê* $)’^‚)œ´‰$UêE¢ŒÌmùÑ€&!ÎL*¢_Xž§â:”ÅG˜F—¿˜u~ }á8XH©·YZo§;Oh950 ŠDøL9NïA:ËÆ’RŠÝGi@Ñ}+>WG CS¾‘4Áv/ÛA¾Í9ʲãÚß_q$Â[L3åÍ@lï>¦élu’C×Ûp¾?‘´Ž>^ö1õ-òxå‘ÇyÑqúHú˜›÷òxjSU¿i+üY±§ÃTcÀSÜÌÛªàò£ ô°Nð^Ì©­Â{ÊR`)n¦ìÖ)›LñR-ø­5ÜMS4¾LiÅ*90cgtã Ü…À–%1‘·¦òÆ:¹&ÖÆës(ñ<Š5cηŽÖ"kÍcâ*Å1KYSΜEY6´Áô¥š‰§lñrœ¶¦lñ&§Ô G±· úúKƒB§%ó7eżÇï|Äà äòkf!ãJ^ Ýü™¹¥ÃÜÚ’­¿€Š·˜HØ_——"«)Ü›·Ö·´Ææ5^MÕ%)nP¿¸õ f·Šä¦«—Ä1>ÉSWN„ƒ¹Ï•8ÚŠ3o®ô‹×¦àÆš 1-4]Šó ñ|0¼7˜‘Êìï;Û\ºŸ’Ó\=cœ<p¥ôŒ‘¸gL€#°›Œî–…« ܦÅÍ—U¾?{ÓP:Ðtâ:5S ­šONô˜ºãDzú(øÌ|ìéÁMrr.W·'ÁNÞ ÞS@ï„7³Ê‘âZc¯§¨(®(ÅEd50¤´"¦6ó”ó0™úò*l(®Áù]¦xw'o;ωT%ŠÜ_vеªKV‰G¯ÉJÙŽG™Ñ"é$^zpám-µfmlyËKH-¯¯thùZã¹0+q?³‘†ËUÇQ[–±Ÿ–SÚOjKM碼ÕÇ‹ûÞÓÌNyu’C‘œ¸Tä¥ïò%28 yÔ±0‘…©³Š”¦SÕáU®ä—6îx9ÏÛ%°D(VœpßJ@qüf´ ¥$fìÌ.Š>8åÊgYº:ÔË]¥ bv=°êÎd–¯FÁÐ0 4®»¡\S•’¡(Á®Ã 6ò¢úLVIRp5),}™V-/ïs:Bµ9Ìí™JOt*|žÖÝGé(µ8#o—D°z,sN5¹)¾†c䨻™qL™à¯ÞÚ­ãGª5(-Y6%8|ù)Ò´šR7Ð[·s¡ Ñf0· 'Àu¾s«8GRZÄa»Fh÷ÑE8°NÈPÌ¿(dV‡’N¡<3:ÜLò2f$&rƒ¯†«YP³y1Ô2'œÄ·š‘ˆâ‡;Êyê ÄvC3²4±½ 9 …32ø¼}LNì †û(RÓ#JNy´ñ€Å ÆBó’öª4–~Ê‘*±\†fì’× ’š9áLá~²­¼g+ï¹4ü°Ý˜—¬Â{;”ñC£ÊÚ¹›ÒBo¼ Û*¢UDu+4KXÚ’åËQxŽ„‘H!oTi^*‡¾Çcª(Q8]’!‘r"¥á„<½žxoª¹àzQ’GL)Üཧ{@ØNjøYòIc³D ·a™’2á1­úÚ‘ÁÊXGS[¬ÜæçÐsõ¼ÙFb#¸["®!Ùf–RPL©|¡t²c.@‡X+".'ž "âʤŽÖéÝ/ú"?z¸®ÍWÚC¤ó6¼w#âDæ~O¦k o?»üqoJiÂËÔ¶hù»îg^i`=ý ã®Ì›1¼ª¼Ì–hàJ4dÜzwFÉØâÇ7%>sp­} k~³ßl(Ä’°øßÈ‘BÖN긗{älÎYæú»x­åçó©?8ÃÌ…ÉbÕZÖ ºÆ°é¦ÖÎUB•Þâí'ôg«¸U©šÂü1WÝx¤;A &:uIè­|Bïѧ¶ZS¸}îfŠ ›¡s‡k±'š‡uæ÷/ÄîÄ4$†Ÿéœ9kêïZæR®‰0ÒÊg mzª¶Ÿ—ü„F(DàžÄâ.§ª¡”-úGä…ˆªweg'•Ësñ¼û?¢Á3¸ endstream endobj 2117 0 obj 3366 endobj 2121 0 obj [55 /XYZ 31.5000000 614.750000 0] endobj 2122 0 obj [55 /XYZ 31.5000000 193.250000 0] endobj 2123 0 obj [55 /XYZ 32.2500000 613.250000 0] endobj 2124 0 obj [55 /XYZ 32.2500000 191.750000 0] endobj 2120 0 obj << /Type /Page /Parent 2 0 R /Contents 2125 0 R /Resources 2127 0 R /Annots 2128 0 R /MediaBox [0 0 595 842] >> endobj 2127 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 2128 0 obj [ ] endobj 2125 0 obj << /Length 2126 0 R /Filter /FlateDecode >> stream xœí]K䶾ϯès÷Š"õ‚³ C€…È!È!°ãFldãCþ~ú!õìPú¨æ×U¤Ô-/ì]VÅz×Wïþøýßwÿüm÷îÃ÷ÿÙýÐÿþáû§bßTÅùŸÝñ×wßþ l÷ýŸwM[í~øåéëîëÓç§Ï‡ÿ~}:¿ðý‡?þô¿]¹ûÓáߟwýÛá‡?öéø~yjLsøýß§ß»ÆþT\~?þü_OùÝî×ãˆÃçúɼýÿï*ëŠÓ,f¾üõiX¥9ýúí‡_ŸÞ×õSÔ­9üæ¬Û™Î•»ÿþãé§ÃøÃèžsÆ4µkоӔÇ5e·3ewÈt£ïœ~ÉŒ.?vëµ±Oó–Þck\ð\Ûîr®Naï;µsm SêÑLwÞzÑ-Î.w®MQWçÝ©…­W8VS=’9Î[xGúSÅcïÛºÿþ™ûr{üly$&gÚ&÷ol¥HM—ÁNü°jcŸæ­DMplÁCuµë÷¦Ïí;]~ìÚ(RÌqÞÒ[2+\ð\›Ò*žëëèòc·Íœæ­u®xp¹sm‹bPxÿJïÏ7£Ëm:5.|ž·ô–ôç\Uª·îHOÚR½­‹º—êµ¼îÿ:ºü¡w¦V³+Îó–Þ’ FƒŽOäüàpøxñý—§w/Ƈí¬w_~:ÌíôÉóo_[Rþç`²”n÷åÇÝï‹Â~üÃîËÏOݾ.«a†ý“îôäӗÚn›šŒ+Γiºþ“ÅûÓ'M¹wöäºL¦(OOÚ}Û§™¾>iàüΧӓjoËÖ¼ybð;îôÄ S»ê;íùÉë> AÆ dF³þ”F?ˆXÎèuü–VqÞî+w ’7ïTèIùrýrà‡ñY— Ni´Kî“ÔÍš¿é-‡û\¡›Þ_»¨'Æ¡'eßÁ3øŸ|€£Á'ý†O=±Ä 0‡„£ ¯”Øk|r¶†O |g€çfß'¤òÊÌÎ'0ÓD7£‚”8{xZ˜ÊK<ëø¤$¨xG–.K¸o%|'?wÀ·INçºâÎ4ó§8G†b!½(žã½ÝÀ¤TÑÊxo¨ëÿMáÜÛm3fP¢^7*–= ˜zj~æýõJ"Ô[…ê#T,Ë꺡ÿTwl£`í«ìøÃ×Û5Œ*MaxØò ¾8'ü9 N÷f—Uëß³ŽPk°ØÄOJmb‹Ú[›,!à ˰ Ê‹q‹}N\Ë?#V,|J5–ØeÈëÌY)4vxéþHðÔù‚½N’?2ïôz÷ë2§!A”Î%à†ÕÁTô8䆞§ÎÙªÖ׎fåkýË`üØú"4}ýÍ®­/FíŽÑ'FìÝ|„×£‚O ËÂU‹ù'f/؉‹ŸŒ¾èi\åS÷òõF)×5ã"gvÇxS®Â?‘ ~ÇW¨{‚IGôà"*"$lFʆÔð;X_ÂÜk¢xÖLlÓ”@ÕmD4uu»œaD¬y¾þªa1,Ààwb–Ìe ) ë{ îÄaõx1f›À$hz©kßN=•c).bÁ›yB1áb¢ÂyãK3>}SÙ$°ûO›aÕà8(ªÌN .Ây½50’©k”pŽå3qÆ¢ºQòž:ãO‰è/¿YÊ8@±&ÌÜ &D5"À‘¢Äx»±õÁ¨]ðÔ»¤1¨|y„=ˆ×ð]ÈòÚÍ’ß,ù„§0ÿSO^^§æcR¥Ë˜v°¶ú\¢¨t¼…®î·½p¹®TéÞR”X~dzu%dõ x¾ÊTÅû7ŠŠÖ£à”íØ‰î^0^ˆÐ ¥|ÃÑ0½3>æ˜ Í;N5¥Z×úb-•­8Ú:Æx¹&|ç0Néó'L±¯óF²Ÿ·ÀTû¢³oiäކËêˆì£EPi"5„ÉXqï3FÆXvaëÚ#(w"Š!tšü.žUk1%“¹bGcZg¾¢Øéú|ŸW±C¥š´(«Ä\÷… Û[#b!®ðxÒ„›ª(=ã€pÍ’“SÙh×{#¬‚€[OÌeÒ†]&e9x‡{A0ÅÀ†õ(ƒ¥?˜)ÒxG,•1°ÖxK \7˜œ£¬PSùâ#"$l,*LŒïá­¡rô1`¼B„ºÐûdÓ¸6?›”‚MDÙz¬õñJqD¬ šGކqéÅ(Ôùo.ÖMG7 _>ìêa˜e0"DįGHé€ãHÄK+rS…Ceá²eö2¾ ʱ²”« é-±•/‰ SLÈEB cÂ]=žËÕØÁ@´¾?¡¨“ñàº,U4R½âb§Ä¬™|}™¨ª.‚F¶2¥Objð–g£Ëx;£ÉL‡ŸU6õ3JWÞ²hѪ«4@šÅVÆy›Jå§ŠR’°;±±C²NÄÎâ(wåøÔ“ÉT!`Wž}D͆h‰u@$ OŠàeKåf`éÞ#ŸF]\¸‚ß |”HÆtŽ ÕSŒóÌ7»ËÒê‹`qvêxë}ý¿™æ3z?éwj´þkÿ:LßÅ? |ç|àÆíG<özøÎP†ˆb`S38_”fßµþz>¹Áïàõf]¡w¤Á˜½¶˜fð)Ôh4¼ýŽêësö`Õ¿½Bb³xá1MÔ†R6-Tª÷3zî-÷!aqÀnQñ'3ÖY»1bLŒñx‹£~Õ‰‰xŽиª^É{•PÙ”64œ8/lZ4œ(ãxƒ¬Y4d Hâ'·ãÉÊ:>˜  “P†!ÊÓ5šiìk"5ÀÁPúà ÁÃ@‰šYàÀÑ3 @ mpc bn6Ám ˜ó ´ÇY%…`& ŸZk¬rMZòƒN9wÉ…†þVª²‰ÑõFËæå2EqùÕ™”ÄÚTÙ ‰Êµ±GUßÌ©JÊ=-Zë]ùÅðSÍnÎx«¦`ʳÇÀ[‰VXh·êÔÏM¯H&ŠLt÷æ{DT„²{¯gv©T9)Œ"% ñB¥% ™)m×5K“ÂRmT1d/¶¼1˜/¶ˆáh›_bóKÐÔ»y,»Ãø2ÑŽOçNëÞΑX)Ó ˜ºMé´6ÕkHôqÎþ9÷ÙxEʳ¯ÜÃ=E/ÌÙozV2= órF/ÁÜaÖ›ª±ówóέÞÁ³†OÖÉÓ0ýÞYÅvCMR²&ðµ\W3ãmcâc ‚¨«S8M,•síÎ\Ñ1xœ¢Ú°nxD. ㊾!KP—Z[zìh1F3®Ø˜0ƒ¨™ z Žuþ——*ÁdðdkMR# _ÿ½¬©/¢¹Å}0ÒDåT¿Ñ+ÁÍÊv€Þ1]ƒšºHÃÓó•õfúRÞôE5ßœn²Ý’åj¾V(b;yiÛ:›AfoÀƈÄ€3&û/2Ï'{Æm~Nåß4>çWnt"›U.Ñ\T6å™Ò‰Eë¬6-ö´Ø;Ix–íuJu²”@(ßüÇB×õÿ±*ì«ó¤eXAì©ÍŸ~RÀýÅÅ*øq±"¤—dÀK<ÀÔ׫Øqü‰€3€ Sù‚o` ÷z+rž½ÏÝM…®Û}Þîó2îóV¸~ºÏ­¹¥v»ÏÛ}^Æ}ÞÀ‚TµJ÷±ÀZ[ήa#(60‚åPle†¯¦ª`êŠÁEš-VD%å®)¦w÷PãTŽƒŽ· ÷ä""ú1ˆ¶LAÎÈ÷8"­úVP£Bö›j ç%.—?U‘Š ¢‹¦¼k[Oàéô4ĽŒ#Ê ‘s5‡crÜÇ—ŽÛD•DÅô'[c…ëÝ—®Krle€[`^ÑhŽSôdc"Àa•‘0Ábr¦DJgd&¨y ç0d­)Qð7a¶/šóÑŒýî-JiÂ\‡¨¨ ô“ÍgÅ™¡­º½Ó³ôrHJUîêžÔ‹k=Jše½­¿ #í[Ê€™ ¤ñ6þ—ì@d8hªYfªŠìª;U»Ë(-ÙÉ,3¾šm:Ål9—­ÏŸÃ¡([*k}á"Qœ8{;4—Tûò’R•DÆL/DÆ•ÁûíîXÆ¡läÇ-º»Z:]DžUU£fw¹Ë¬B–·5ð1ŒPÔ×OÑÏU}­­óõEl"2™D%Ÿ7(0R>¡Däò82ƒj›œ]qF8Áw.;Æn2\ó®¾$"vH1c}‹™('¿ አlJ.‰O¿™ën]ðg*UT • ÏQÙ:˜å^3›ÿÐW€µ”"óîU¨Ü;ŠSD WX$bn"ê“Ígb4_*œð´Q‚²=$F›‰6Š$»"FSÉ”M艄Ç9R$újÌ«ŒQã(╠ͼÊ7„bD3?I”nJ]îD^`†UˆÜ>*WZ´÷aÀÇDج–¬,7Æu¾.#Ò†ˆH¢Ë²µ¹kƪ®—ÆUë‰"ùÌ„¥DòãvÔ©[5½€hÍì¥Ë)Ȫ֟¦„ðTÉ&DÓ¨ej]#òE!£URòuÙ}iüK²qû"€Ñ€Ñ6 ±B QDD"Wë£ðxM¹éF‚S$‡#U ¤®”JâÜö’‹¸ Mx,IxDA&9 >“¿)Á¹'inm5Àš`Ÿ ΞxãÏ$Í^uPÙÆá6nµ neª%Ü cÌü½ÇàqSp‘ÙÅY0ùÌüÛØ›$ ¦Hó‹€àkj~Ý\7~ C—óOÒìbÝg‹ÔT´u‡o[–—&†8ù/—s2,’m†ÇÌ@^€J÷Ò“‘ÏqàT%_”Gˆ©6Î_Â&rq²Q¯#|,Œ£N´ [?pM ·š¢ª1¾¬ÊßYɤÀÔCÌ:&OgeÛ@Ù‚&ŸdõE&/HVÕ£êQ‰ZÇl÷–Z ¼ë²åpT:|ÆxZWT¾HÚ¸ˆ^ˆì¥–ú© lPΩ\”sG¯Ç™¦R—áh©°')ã\Ä–`JœòãoÉ–´hP±&jƒµ¾EµÎÚÿ¾š)›Ô 1͈ò¥%k»×£Š¥b¢X«LŽ’,§(,¢Š‰3¢×}Ž01E©e÷" z†— &¾®$t©ÛT³m;_ðˆRÀÃû«óצÅERžý}d8«HPÂuoÞQ³…*C6¢”¼QC0‚þd ÿÖf×w…–#IÅÄiï,LŸÊAÏDå©óÑU|…ÕÛuú\³Bèµ3¦y«kOiICªçÊÀC|:½z \k¼¥-0ëfë&œÑKL%“(W϶>JJzD¨Å‰’¯ð Fzc61ÄøN¤’ŠpÏ‘ž¬êù(}¶, ±ÈÁIEódÁÆú O„5Ô0›º!|4Ò‰nó×E˜IT§1QÕU6mf,DuÌ‚ ñ|K›ÊqeŒéwµo¨å³Yt{µc2‹6~Ø&‘r';Z=Å“°Ó‹3b4*ŒG$’ÌöGÒ÷3Y3x‘ïÎÏôº4Y4Qm?c8×Éò6Ú"ó.u1¤±ýTI¢Ù-kóa†½O lÆÂwßOÖ‰ûC4»W6P„=²AHæ ‰âŒ ·HÃuŒŒ–˜ªÔ9¿vÍØEŒž—¹þ¯ —G2 ±KˆQZD2›®wh 7ÉGBårE§ ©¦êø–“ÎÓÀkûŒ¬œèµµ&‰áH¢KD5yØ<èüÙ>%Ö)²sË® ÏZQú•rÇÒBJŒ¢*…½º·dx€$¹®®pwþåËÒ„ýË »‘l_4Áæt—90IÓ)îÃ#Ž6RÑ÷ŒD¹Y²hõzJ-ãü÷,ŒÝ+Ÿ¦’žn°(ÿ©¬´äÒ Ñ}Ã7(¦ ýõ°5”«e.Þ/åñÌæ±»þ4 p_|D²ê‚ïnGHøäÞª°Ò¤ôkš¤fdBÜ}-"òˆ˜ ¥›n{Údg.½dê‹.ïìåÖûÞLûæ†<£wúLÖ¡Ñú ›úΙ¥·÷-Å^~M<é੹}xÁÈòÇ38§Ùw­?Z ¿gÝ_¢©ÝyQ×üξW ͽ¾?æ%ŠŽÃ_ *Fè×$1 ΗWßM9lVLQI_Šó3Àqø¼p"Ýõ›.ËÖúETuˆfÔ ƒ{®,®²'ð^KÙè Îz'¼£Âý_W00 @"%ö³Å”‚AÝ™œ¤{ã 3–çsKVòÄ\FY FÆÓÅhZŒÅb“ ±ÖšFUîùØszq¨.fG+À[Ô¡y¹Þx`à:GÞmÕÊ­­\ëÍf_@½VàÅœ‚ÀÖ´óGì)£¥ÈÆãâ"u ù‰ZHÆ`„f´“K[z½y¶i¥DlÊÝ0e«1ÉV’à”ÈGžª³cnöœ1<èŽÈÖ÷¦IUQšu¾ÐÌ_âá$Í¥Ó/™ñdS|±ŠÅx™6GÌu¢K´;àþm¤Óî †îEҺשAë{qËÒ÷dK^ •(“/|}I6•ì˜ÊªŠÖñxíº—2›¥-!tûî>A.Ów†æ+{Aü[p¼M³T[p7, ê1»êI­4˜Íâu÷lL9u*Â4P™ˆ‘.ª% kd¢kʬ®ó…Öõ ýë!z¥„ e--¡k ]"ž ¦0;à¦g ¸™TSüÎõ!_ª.ã÷™ÒÀ=aúµ'+˜f "qÚrÄþ1qË[<†‚„©YÛX_6æÂŒ 3c­‰Ä²ãÅå7¯§•¾BðO (EWqVµ˜œ_‚Ô‰®”˜‰ÝÝlfh3'pðU·€ÊŸüç\9Œr¸@Ù“Çe¥X~¬4"™K˜ƒãш¨]¾V¸²]F‰\Ê4gmeÙ›nž¡lŸ»œk[OÀQYˆ×[ã”üÔ5Qdã­²¸1¢h#ÆK£½ ïÓ}¤>gƒ³<Èêæ@É0ÑUBºÜŽv€ÊK•¨ËÜídR©úÑbné7ÜX,²¢˜Q" nuëÕ„?¼d-cÅ왢”MöáÝzBÑ7Ùö21Z+ã eÿ!sΣBªõ["c©ô’õ·%C«ÔõT3]ÁD ”…õiÉiÉÆ°Pó :TÛîíº»ýi2BmâI¿†©wZøÄÀ'Ÿà gP3hà“.áÎW ”8ŸðÉ{¸#pu%|§€3Àû»‚³OsŽM3{޽TH3ŸîÒÀäy†Î§öž] ßÁÔƒ)S)Cq¯t)´LJàÜú•&¡¤ÆTó”ý¬:üÚ}=|88¯Ïsá ¼š´=ÈòÂ…Àÿ·û8¥>Ÿ©¹™òç.÷åÉóÜzü¤ß…r “_¨Å~Dß±sžÿ©¹½ô+EöÖ;Ýë” 8YÓ/}Ü£ „Ã73êÒÄ2  ¾Ó«'&jéÍ+Ù²w2øŠ!WVñÝ÷]°ï`•’@i±vµõH`üø½À¨ðä CÚŸÐå Ц0Hãï`J†³¶ð;½~Õ¿÷o(\q/¸'nA`Ååí· )Ú½9o×›ë'Ú_”^bÌI‹Ýç§ÿ;Γ endstream endobj 2126 0 obj 6006 endobj 2130 0 obj [56 /XYZ 32.2500000 116.750000 0] endobj 2131 0 obj [56 /XYZ 31.5000000 118.250000 0] endobj 2132 0 obj << /Type /Annot /Subtype /Link /Rect [54.7500000 342.500000 109.500000 349.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_suppression >> endobj 2129 0 obj << /Type /Page /Parent 2 0 R /Contents 2133 0 R /Resources 2135 0 R /Annots 2136 0 R /MediaBox [0 0 595 842] >> endobj 2135 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R /F1700 1700 0 R >> /XObject << >> >> endobj 2136 0 obj [ 2132 0 R ] endobj 2133 0 obj << /Length 2134 0 R /Filter /FlateDecode >> stream xœí]I㸽ׯð9@<Ü´A€^ä Ñ ääL63ƒtrÈß\–ì*ÊŸ?R”Jݘ©êR™"¿}ç¿ûú—Ã?þ{øáÃ×~¾~øú¤ŽM¥Î§¿¿~ùÓ‡ïM[~üùéûáûÓ—§/ýÿ¿??ðõÃúïþw0‡ß÷ÿýëð§?÷?üëðK§_øù©ÑMÿõ§ç¯]£ûïÔåëéçÿ|ú㯿œV_7læõ¿]9ÛÔ§]Üyó÷§ñ”úùïüåé‡óù£^¢UÛTæ uÝ9søÏßžþÞ¯?®®ŽÓº©]£xOcN/ªU}ЦS‡ªv“÷<ÿY]‹¯ÝéºKµöyßÒ Ñ¶ÖáÅ­³Ú6¦r'Ÿð[µ­é¿oìðç!ˆ£Ï³J××Õàº2.ÙÚÏû–É€ëÀâǶ6«T×Âï9UÓبy]O€ŽÖ6ÉÖ~Þ·0DFLõå„u×õÊð ›þ?qè\W—^[+ݤcàç}KƒdD+^\ ¯Z3Ò|“ö×Õå×¶]ºµŸ÷- ’3^C‹÷xø¿ç^ÝžÞ[Õ==9Ý&V>‘”ÑU}R§×õÀ}þçC@¬J¥^,žûu—ÊtöDL×þ±ÞÇù'ÀóøøàûoO?|ÖNõ¶r}øö÷•^yþò­HÕÿ£÷7zªþö×Ão”2ÝoßþõÔkS;§.»°«ŒÅœ”²KY^pLb-Ýã¦N·+ÀcÎØRg›G,µ‚ù~kÖCÀ#ÂÖ>)¦KlccK­ÝÝUõ´\UÛ¢òBpÒTàd¥œZpŒ0+î»·—·Øc]…P_§ô˜m)“ë”#Ù%{rØS¨‹ATîžÜîÉ]¸©Ò+ÀcFO®SÍ êY%ßoΓ#²’ûxneèá¶{€.±W¶NŠ-'½qþö,óÝ+;ãÞ<ñ[)îw¯¬êscŒnðÊÞŠ^éÔó+Ò¯§«£êì©#óJ¢ç'í±íÔ3||ôÜzÒÀ'gô¸£³ç¾Ïë{ÎO´>V®nû‡¾@©ŽÖ´úÕjî@Ûø'ø<ûDGÕ³3 :®V=ŸT«cÝèWµg‡¨ñâúñ–à…d F‹õŽŽiˆ¡b†º0}›– Ì-g¬k;>š.†0´0'Êcnp~‚W ÁÉšà×ÀIE©*@ñXþ`b`póZ( 5^eZOå9‡4Ù#ôÄÈ5–¹È5“hffæ=Ø0xïÿ*^~M<?Œ[_çN€?;!ïÉU8YÄUèWݧ|.ÀiÄ€4¢>îÅiz\°Šƒæ÷ VóÀª“Xî”y€/áÜbœ ¶‰6 *¤š)-¢rREg2SE űx ŒlE1”të ne`Z 0Dqxi•¥PÒ͘ ³Z?À›”,‡T±|ŠdçÚ|\»ÎT™©¿@“[N~¶p-ÅÏØÎ"’˜úVmEq`Éú,Ðè·x*³d{0« p—ö,(­†"Æ ¤X?ƒW3ÐsÃ’ÔaÉ…ÏC¬†¡ƒOší ”ƒ]›ŒÔWe»R+Õ@tîz¦|=ÓŽE;»žÙõLn=ãÔe€Þ®gv=³A=Sr¤,§žqfl×d¢/ø ¦KfµýIö'y¨Ï]2ËGÈwYNÊò}ؕ𰫢u1¸Êâl3Ú{{ehÔ:{Çn;¿%y»·¶”-!sÊšv¬ b¢*»¾ò'Yh¬RU,雾ªË,(uNñÞªí&ê© d\«Zn½×\¿ó 4ŒÁæ˜@+Q1Ît@ &®5×>O: ˆcPeà¸ý€é¯6­7p5ÜEØ5$Ó~‹Õ-ÜÛÏŽÃϤ·öÌç4ÌÈÆšß"_ŒXM´±o P‚.¨Î+¢+UŒ2Cûú­î@BhRÃMßæZO9âŽÄ@/&¬~ÌÒj—¿5–" Ñöê©( dŸgK-Jy‰v^QÇGvÀH[•6#èoÚL‡¥$6áî§´”«Cs>CS½Ô¢…lÖuëj_îïu¯—Õê[­çþ®g”–´j·£’›6D ºõyq’³ùýÇ¢úŸ1êj¼9`zçEœ¦7ÁèVbz‹Ç•ç‘åü{!áu¥t®žµ¾Œ?9CA›q7s(A4ËèCj–;cÔ‘Eê<²ãA#òVŒˆˆ˜×…ñ„—Ïe•ï–Z„ܤ¨8a ¸$"¿L2™â€UÎ)f@ßß¹ðœÂ”Z¬óÕØª† Óm×ewÎgûåëiªCÄéÆ/fäu®1¾¢ÙñÔ1Ñ:œ­|„ç#>+;ö˜}NÕTŠäüEÕi Ç¥) •Y×<¢Ì°9HÔ02ÙýÌ`Ù1ÿÄO35x¢Usnì hêJÀ••+©µ”AeöDi6'K:léáDíìöËãKÎ×Vßa«¢SÝïÚx‰k­Z"{CthLC´\KB¢±ÖÇbâÒbÞR¡5¬B²µð¤»¸% 8l[û²´äÔì.ÕV'Õª¦»-ÕR¾³õ%i¶Fl@caËäÅ “#um<ˆ¯´Ø{—0«“0míæÛM|è -µЏèùVÇ@Zµÿk¦VVÌòuàü ̶R UiQ•j÷v1“BÌ\âÕ})³•´>‘~ ”ý1¤™ƒ0‚=Y7ÂÅ¡’¤k²e“EÛß)U[^Á¯p®”¨'Œ©ø’-ýÀ›%z‘¨ù?Ì”,ðg#ïš)¤¦¤0Sj4?ž.ܺ»ùe·"ÆA¥¨ÿJƒ:ü_Øv‹—ЊŸú ;ÂÔIÔ.ÙíÆøýÕ¶Iî)t­ÿÎÌà RÏÃ0·é»Ô0Õ½‡'TÑã½Ô·¼TŽÖµ/ËKŽ8ö;Õ¹)&z´hèÖ´‡,—c.ï,l6K"¢ÆEI¤®<\-=ª±k",+Þ€|1ceá|âÙ†fm³u"ÝŒ„s£ÁrÅ•h¿ÁVƒ C£Dú›J³tkåÓÍ:‹–Þ¶ ÜL$õò~m’2À”0ìj_‚ÎoxU4ˆ.[£§à'‰[ŘaÓÔø¶I†”) ™¯V¨†ÙTô%bÂÛ²SÔ´²¾-^´Iú¦•’ÖõÄÉÍ5©ªQãµí™0jˆQ„[›Q#k&HtqÀ%;ÌNý¹F;S»Žì…éi gJ /e£Fòb®Ä2 ¯&:bxŸjWã´èT«ÆSy{ÁË:cQÙôr17®zcªøüq"÷ê0aóBXµ_™¬öØÌ1w2&ì]c=irž¶Üý€à{v?`÷Ò› øb;vxY¿o?Y~Öãš-‘ Ñ9SßrÉÍ^Ì™CWwø½ –bŠ]ŽÄx4raÿöŽ`©/%ZªÎQmLk\4$¢Ïè¬.ýhí­€q¡™¤)eMEäšñWpý5x÷ž§«£êìë-½ƒ« ×?Þ¸F²ÏÔÅ‚ ~ ÜʺÕLëz $âaÉãÒ½ZÁMå‰tá‰&ð@À)ø­Õ‘Õ,{§ðEK„ÁÈ“DäDÛзƒeŠª2£E=J\q¡ëÿ_H";턘#CÕº.~‘åÛÝU¨ÄÁmr-96]_µ$s?ðtM®\Ð|9ãÄîG ”N6G«Ýk¬G•- '?Â'°‘éP |‚; àyLŸàóà¢Nü„)EÅ3)a׆Aà3¸àžÇÁóˆm k¢—ýâùŸxÀÆO&ˆZxžÀ{ðIq±2îx#¸Þb>Å£ üàvïÖi¡®¿%NÌÞ»†{« ´´˜1~àü,¯Òó)æ,†K˜©¿÷Nš>{ÖÖÝkpÄÍNÊ2hð-¬—ëEë ­4°‘wÈ5ÝtcÉè–[ªlIdŠ'þÌDÞ2“%óÕ¤¿PU[+‹hðÄ쎑RèBÓöÛ#S7T”r#ý ™ç¬Rôsj—í†n+ãIYY¯.àó&÷u:¥} BÄÿ“XZ)Om}ŒÄTK9ŽûöÍ`O=ͳrr‚2éÄ„áÒ¾9R²¨1Šï×e1†>a½ñëªH!W#Ó+´à¸tmkŸ+•!ìÚ^¶¹x°)Æ*À~e̦U°äˆSàîxæ>ŽRÚNÒ*K3LXº’{™ºÒÔÏ–Kg¨S8©§š1&ÇR²$À¯DØÃÕÖTDÉ~ú8«3PµpL¥j¦>çÍå0V©ûbn e|Êu'm#¡M9ËÞ´”¢Ûš"›ŒR7b¾T†èêÄdÌ$*ÖY¡¾ª.‡EãàF2ò5yQ|.ÙP3Sy4³²‰·úÕÚØÚw¬q}(®)eêì‰ H¹ëÖqüOÙÙ|€Öe}%Òê¹™ €ôÏNuðuŒ•Š­FFÆ-î05””Ý%zRÙ™Ó%מ.sÕŠ.Ÿ¼²U©‘Uëíón`31àíîMkN;„è_ÈgÏwã`Rt¤6%\:ã.“ïΕ¯•c!Y,$veÃ|L[{®RÈ’dTö#Ba¦H”ìáÿõ‡ÿ™¨ª&¦õÔ ,ш𬔹R`"ósÜe k;ßXLƒžeËu.6 mÍÇÊTëi>•Vo›RÕ]iï p–S„×aÏ.žÍ5–,Û¤í¼Å‹)yÊtDœrMÓØ(òÍ/6¿[úFÉ—Ó¯6vþɬéù'jü­3ƒ KŒ/!2d5"½xÏ}¿Pÿ™Vô”Vz”Ÿ0nÕñôñŸŸLO/~ðÓÓ×{¤á«Ó^“a@ßçš±ÝÕã±ÍÍØ¾-Sÿ¦ÿV8øÆàKÙ™kñPü™ô6òÐÎz…GàjÂa`¬¢4ý²€ÍÕ„4dóú¶ßˆUIÊL‘lœ|R#Ž% ê®l ß,OåhÊLK=˜ÅM/zb¦IÿRFž1ùºÀ€ŒlãIõiƒ¯½Þ"Çêå³`Åtî ÈÛË…xÄ0?¹áw3vZ÷Y˜ÒR yöÓ­È~+“ÎeßåjáØœ”¤µ]ôÓ[Ì0cbŒKD—w®ÛX>@ÈBÙà@þÌ;Èë¼ÇÀBQSœë|³µ&ꈵhh×#3!‘fàÜ×1͈։Í6Òÿv¦âR»DâȲÒ'ímEOîb~ɱ®f¢ð6z=FÉýþT¾U¶ƒš¸ƒ`Ba¸tŒ­s[Ì}¥1†1°“j€ˆÓÎ)îA[Ð#büEüá˵0EþM_NæÜ˜ÚY¬,áZ”ê¸ñàC ‘“µ‡w jÉ^ß.{©Ýnÿ¯Ãþßm¼ =³—:=" !Lµ¢7®4™\ŸV­óêÄ3`‚WO×±3qIlå7I¢„=ñ)¦æZâVƒÔq¯ù‰DœöEjzCÃ`jŸÍ-.yÄEU¸x(Ä Câ÷à"<2žï6ZX:e“çå»®ó°¸x/Žòý1 KŠ*\ †Ë·˜R¹®"éJëç›>K",]ùu ,¦M6PU߃k0™ºnÌv¸²¯†ë)!te[E³ƒ¬£”–¹Æc½n™½³ÖúXËŒŠæJ{kÊ;1‡Lb}Z¼Ã8NL‡Dÿ'3Ÿ‰Ž,0 àÀ‰Q1éœd®L`&\Gøç|6"ep¬²ž´¢‚’Lëäüœ¤lđ⩈K3Do\ÌUÝ&œ0‹_T@©\ÙÈ:FiD,ÙlyYæF3ákP3¥Ã¥Ÿ}¬‹Ž×ßN1Å©9ÞSpÔ rÌŒ"Ñä Sy½œò-' "zÃ%`D2mD±Ü#/ ce=ÌW¢Ó8˜“2& ÃóïÅÉÚKÐAB‹hÄ‹H¤Š:„Åf¨“ÞúP{8|{¹ï$QµeÔí?ñs5!H´ÇÜ'!ðh¿5æ*èg‘ñ@m>á|Éôj0õ]Ú%}°öuˆìdʘ*ºG| ÑÑŽ2I&z‘¹PlûÈLGS¬Ë ,ã}Z¢.¼Ï¾ŒiÁ´­1ÑbÓb©ú_?öGÙ L\[þüÍÆvhÕ4žÛHϬ “¶Ù.ý-šÚ(íãù- ¬2ηј‰¼”¤“í|Ës›²V•º\È…qźì“nŽUÅÛsI-Æ\Â{ d€˜1DŒa“×dLYîVw·Åh˜\síRô`µ¶õàjpi)žh‹çýåéâL©ìçäŠÀT¾& ʳdu#™Òìj¨sž0¡eì¶•'qåÝóƒŸÔÝP¢m«)MDA©¦^ÁË"RWëÎS—"5X2U¢Ê1 Z 1IµTb5Fd©‰ ¢É•%OÉòˆ1 n›ehHd(> “É^> endobj 2141 0 obj << /Type /Annot /Subtype /Link /Rect [84.7500000 68.7500000 169.500000 75.5000000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_features_default_args >> endobj 2142 0 obj << /Type /Annot /Subtype /Link /Rect [414.750000 68.7500000 508.500000 75.5000000 ] /Border [0 0 0] /Dest /3#89#3fq#24n#f2#2d#9ek#2d#12#d9t#eerd#b5#b1q >> endobj 2137 0 obj << /Type /Page /Parent 2 0 R /Contents 2143 0 R /Resources 2145 0 R /Annots 2146 0 R /MediaBox [0 0 595 842] >> endobj 2145 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1409 1409 0 R /F1700 1700 0 R /F8 8 0 R >> /XObject << >> >> endobj 2146 0 obj [ 2140 0 R 2141 0 R 2142 0 R ] endobj 2143 0 obj << /Length 2144 0 R /Filter /FlateDecode >> stream xœí]ËŽä¶Ý×WÔ:€kDRO àyt€, f€,‚,;N`ØF&Yä÷£*IUÝTJ<}ùPµ<ðtO³‹ÏËû¾‡ïþøåïÇþ÷øî׿~ør(NMU ÿϾ{þÝžÆïM[øõðíøíðùð¹ÿûÛaøÀ—î¿ûßQÿÔÿÿóñ¯ëøãøKç_øõШ¦ÿúËåkרþ»âúõüóþò»ãoç§áÆÉ¼ü÷wUeÊæ<‹…‘¿¦UªËŸÿþðÛáݰ~¯A”*ê®<ªÒôu¥>þ營úþo½§N«ªnkݯðÔfø'9b£/C–ýȺ+ŽUc8|\¤s ï®×÷yÞÂ;¢L­œ}ŸºR©¦.›âd4Ì¿í»¿ìM©Zùݹö.¿óJ7e°S½Ì[zK¦cÅË«2zÚycä÷þÖ»|ßeÕëû2oé-Ïw„«ªÒOøÖ»|ßuìæóu¸sÁ›ÛÖ“´jìÏ­wñ¾ua‚õ=Ì[zK¦sÅŸú¦á?ø=7t{Þ0¥«^‰ëÁLƒ$(­Z5‹*åýÖ»|ߺ Æ(†yKoÉHPŽÎÏÕÔÕ¸;Õœ~^½?·Þåû®T8&t™·ô–Lç:ëü³G'x"ÃO€ÙøÍñÁ÷_ïžzu©>~ýé¬fœÇ¾|ýõPžÿ¡ŠF·Ç¯?_ôZÇŽ_>¨âT7ªí­éóï]ZŠ—–òTšÁȾµ´—–ööƒzøÁ©íŠZWÏ~U©¡{s2ºíùY'}F+uªÊúÅ”tǽ%\^ X cé°·¢-p²º„s+`ox»fg‹÷¯º´˜é˜B-Ð1Îl²x—¢rìܪ·O—–j"”U›‚·˜é  ‡¹X²ûFŒc”E2Êøl>Â-†c¥ð‹p(ÈT‹.–‚<OÉ0ÜfèíÓ×^h†x•é,‰7cødt ÷Ÿ&ÜÔé9Žßa<0!oÔ{{J¸{‚$û‡ÈèÉŽƒ‹àÛåfǘéâE}ôgáå0·îÔÔÕê•2"‰ÙõÊ‹CaÄÝϘ.ì¤4’Âѱ³˜"ñgDueŠíãqDé;¼xé*[¼0ú^ƒƒ·Ía¬dx2Tqfœ˜’]o¦yÈ7”‰¹¡çà–d ;30¥°¯7H™ÇÐl©á9aõ D¼@›u‚ ³=HK"Ö¡…Êä¤+›Èš"¥3`N.CÀS…’Ø:òÇ{IXR¦EZ­žð=\᪣Ø4„À’UÖ… KfßlúÅÎOa§¤¨Cm±ˆ¯x÷¨¯é„ð3YëÞ:®û°ž"jnÎŽŸaAl†2±k,¡¸MožŒñAxžElx‡Õ³ÞIí˜=£Âæ–00Ž¿°ç”>à…É ¶‹ Ï`žÂ\9š ;*"½ò’±>@í5ÖB8÷ƒÚå“a~“±X`Ø\]V3ó‰g§2åd:‰Å#p"c‘b¨­P1t!+p˜D'Gll½¢ã`6"v;Á±U»ðþÁ¶g×›6…B¸¨¶]•‘JY[?zƒ»Óe6/¦ú¶t¨E5°¥D-º ®ÔMp¢r4°xaÒ›E<º²ÂJ6{šY .1ÈÏš™®…?´¢%Ç4Á>3ÈInúˆòõ s×Ö«˜Í‘M¸Ä^g|Œv>o·3–`ØS9IGDÐa;À#†Qÿ·éíÉÇï½>M†šãÇX‰™2:(eO–Éë8M–1±™TøÈ²!‰dkïêßÆÔ¿d®>áÚSâ2¦ËôÀKgôZÙHlROg­¶ä™¬œ‘Í‘qþÏ î°,dò\˜²#Æ­!Z<á±L&©‡‹_¤Àƒº ‘9T'“I€C1~\tì(G^ß=Å8$|#CŽk˨䄚óŠ"ƒ$"ª«KDQ*©,¡…fy9ÏâY¿Z0)›¹ó*ý>™N!Q»¸Ž1U(î‘5H(ý”#ò ý$ppóXÊOR¼Ýhnª»wÖÔïE“Ÿ`Ë'Ø‚£Ö°G ËþŸuÄ(»Øõ¿ðâ2Ü‹¢Ãh½©‰‡§å8Ç2âŽÜ*áá áGþ¦+í?ŽÆÔÓEÜ«k™â¨Â§žO[m€'¨*kž úë¶ó„—;¢ÍxÂ÷ÜAU”:'žpŽÀo€'xvºbh1ãÍhQžÏ£íAöR£ë²º÷êæý‰Äº>n‡iÏÚÁáàzðîà,]<ïc i˜ó‹ù²!¸bÌ{¢ªú5ºÞEÌ¡àÙcsŒCH7|ZŽ£UÖ¶RÍdk±¢åQµ2‹÷V–«9äÎÎÕ(©Œ¹Ö2rçjÚèeJz0®†O‹âjYXoººVïDÊŒT¦˜¢Á~¸ˆ~&0f£O± ­2aѪ1aÔ"U!è!Zâeª¨RúÜ?ÈÄp°{þw~ÏÄâFo |±ìWûrÕr ñËÂÆÔWG¸¿°ŸW4£c¥«-°…qbÅ+Œ1Õ Ót¹Ý&/‡ ,½8N+ãÝaL|£R_w}3ŸýRK”™–*¶³;Qdi~wŠ:ï}$w)s‡1WÌC¶”¦Ž}g-ew¹E»3ÂθÍÝ™GKÙ]KÑÓCÒŠÔu…µ´’ã5â!º.HŸº¶g—æ+l®€7YÕwϯrÜ:;aTc-o…i ®4æ>ÁsFDé¢O‰ƒ`€EM²J1:72!\d [‹ÁVÄr¿'äS'˜2 ¼CXv_w•uÑ_áÈmÏÓQ!7Ìó^-ú ‡â’…ÝxôDz‚§±TýžÚÊÖâFÅD(òí`æLT`‰£3· “6wDT=îG,l‰çì\QôÅFFMóöÑC= î‚,¾CÆ uÌEF“"˜! ð@l$u`K$ŽÙT¶ª&’“¢ÂÚƒ¶R×y{'Ȭp(£h,á*†GÁŽõúÇiˆ¢ÂÉ"ãåèÄØ;;–´e^›Áü!m”Ât¥Å:G8(·žÞ-Z´¶ˆHô,qE…‰ÛýˆoÍX~ÄÛÍýˆoc]Øcæü ó¶Ÿ Š†š1:°#2˼¥7;d8¥²Xx›š!]¨Z[×Ïa¥Šòm+?0¯Ð(lĆ2 ¹ÍP;Õb½.ûÚæÏa£×Ñ„¤„UIÙŽÉ4bF@düØB´çr05ãcOˆ{«tÛÙVéþг¨ÊÁlÔâdí¼ÀæVkÍ4‚µeI‰Ýo¨êTtf¥¢&ü€ÌcbyïÙ(ë\΂ÈbÐ/ÒÁ¼#²ôÂT@neªÎæåL`É&,†ã8žíÙ'l>¼æÝËÀq¥õÎ0Ÿƒ\oýÇz8Èá–#®¿,'ß*×áÙUu…bf¡ögÆ3†—Ú[-±ÎÇ$_£dHiÅQÕJó2ë R'…CÖW˜õôe›-Uò›.ûðGú–*†ÿh¢ÿWêï-.úO/k·Ù‹£ä¬!AшÃQÊ×€Ðî-yKT†.Ó·D•¨µÊfÝÖ’^6m³å§>ØÚ¨ BLæª*Nu£VÓz$UÊã&O ] ÉÛ.š¶Êõ˜ðXÉþ²ä{»Å”ÌŒ+å ‡a{žTƃrGŒ”‚Ãb¢bá FX¶ÛþÏJ̨,N,£D‹³ƒÔû€1‹ N–x^BÃáò±bѯ›ñŠÚʺx¯ˆ>„Ä+Rö<)`–%¡ئQàžq9Þ1r³ëÙ<‰|…Ç YøS¶6m§2WBrJ\5êc"b³g½‰¦]G®S“à4Mßí}’꺻T j€ã”î´xV…V&’‚"t*Æ \çÐ=˜²ˆm눑 #§ç§q*]—¶O —§b‚Â8å½3¥*‚O¸º¾_ èAœÃ’Ž6¯zæ9jáÂò),Q8e¡·éj‹>¹ÍêVY¬3†˜Ò1ŒôA±”Nâ±ø&Î(YæÙG!‡Ê}rh™dÈOÑ E<Úëë_ÜžAä‘-=EY¤4ÆØEJÄ(ö‘Ä{õ3 Ÿ€æH:wòPpõ:†“½ÊzjŠ(€:SÛˆq2èð²_¢DÂ`V;ô1\( Œ– ÔÆÇ†gÏøç<äµÄÛ=úÍÄÃëI–áa¾ÇUÀ#¸Êõ Òxx¸ˆOÆ:ÇóC1a‚85–)É¥âH\#ÿô‰Ô0Üœˆ“80C˜‡ò 1´ø8SxÖVÈ÷žâÍ”Ó_å¥ýÈ&\:²÷?³R|ÚijÃà—ˆ)ŽÍ°Ia 2YSdý;Ž;!Áí£]íMJIMHÔµ¶ò°ë+8’¶c:Í‘'ëÄç³MÍd“.¦œ,ÚQ›;‹¤ìÈÜj›ÆâïyÖ tÅlž ³»;UÛR‘¹‘Éyƒ5w¬ÉHêÖìF¾Ê»S^Ÿ*ˆôÄ,ZFàlReJëzåYaz†r±ù€¬–œC!uîâúÙ¸¯ˆFð7êí`†‘Í|•>㥿ôÄ ¡QW%S³F)@"É0èøöxä€?X¤jC<&¬âSêÎb¿o¡Š¦l[[èDpkjkÌmºa¢!„­ý¡bp ̃H=µhðÊ”¥®Œ‘4Ò½–)âN%@C«¹qÑRÖäÑ ç=˜·>‚G´ ÔH‹˜ù,˜˜µh@຺Ð/QããKfr£±«×ÖŒ¤­ù˜Ó‚ÁUV¾&ôv ºb>êÔvÝD1¢ÏÈhlYãÞ´ÿg´úGÛãžÕ[àúpwóàÞÄðƒ–O¸Sí4j.’{ãàÇ DéÅqZï¦$GopnQ©Ï4Ø_L}TŠÇN—ùÓe•ߨ+2È™;]æO—ÍôÈf©b©%ÎL»rùT1´¨™S%Æqð|Üi^ü;˜ñ¾áSÀ÷ÏÀqïã>ÜèÕ#dzÐÒuoŸÇ¾MŒ½ÇXhXRí·)ö£mB· Ï-Æmr»™tQO¯F…¡!rõ<üê”wi}qS…°×u¸Î6pìœÙbGÎ&À \œ*‹h%zêŽ0Ô‡YÄ‘?ŃNm*Q–òÓ'qŠÑ:耉™EȦCb³*”%7ßÀÍ¿ §ö¨Ëû•jR·‡ë+WVmÓL}óúg;yï3¸·õ6ꪙ‡éŸPo£Cª9u­Ý¢á Æ òd*ŒT{o¥ ƒ×ƒgp5©æ ]šžõx´òÙ78^©Še¨ësº‘Qýòõp–h1[,äÂôðç¡3kRÞãÏ0Èt2&)ƒ`6O”Êè ì2<6Ù,-Ø›ƒ@ðdeA=Da‹(]2Ö ZÞµŽA•úÎ’x%¬¢|Ã61ëXö÷£ „ˆ)qZ«)°é<Á–O°‡opv§C¼#üŽCxœ÷wÞ˜—”ç28áŸÁÀõ8lêÕð´³ÞbnTZ‰‚»“E ‚¾BN›áç³à©1· çôžƲ$ ·BÃÄîöã¶ìÇÀX}¼%è©lÜz½QíQ-{âe8ÇÀ¢P6‹)!Ý/º±ÄÅE˜ø7\ž5©Ge2ñjçF…¢(Å£ Rc.½–øñFL´Ž;6{ÑCΈ¼È•By UÑmJŒmé¹è ž7#Dbccº£ù *fnKhXçX/hò|9‚+¬¬ÏN8s ,ôp|q½@¥PË^ûà2U•¥}¬oÞŠ¿'S4b¡Zû`K¦·é“s«m%œÀÏ~„’ª Õ/d°FóÓ˜÷*„ú@ëá)Ûç‚.ìóZŒ‘M €¦‡$ϸRŠ‘T*7N“f,÷HXïªe$ÇcÌ :Óµ/©oÏ ‹´ó¥šà¶ö ºqGL½xB{sÖ{#ƒ.ëYùå‘qVVÕ~7÷»înæAåM¹Sù6¨<zé¦*ˆ òp«òŠÌ¿Âçgb¦1%YŽ*YÌ &"³6*V>Q2ǯG&‹HÊÿb‘¡6ŽY*¾Èƒ²ÏEJæ „LÔ-kKÎ=ˆ“šÉê~'Ž ¿gìA¥ÒJŸ 2CD±7‡€ŒI†ZB±ãÀ!BYÅăéJdxdp£“Ë^¦2ɧöf½¢8kšÂSx&GŸ JõBP?Y%a•G¾Soò["vB„»ÃcßnÂÓ£BwÈ–Ø=h*ÙUÃ߿Ë5ºÜ¢îtî ¿Xº-žÿä—ÇF}¾ÌÁÒŸñ9DÊ’[Ô"¸Íêf‘È)×ã! \A'‹áÇ$~x(²é˼DmŸ·áHaÄ/ÂábVáx+W6ís¯ÚV“.ë &¬Û¥„AœobÌçÝtÂJ¤ðñ0 JXŒËÖÃd”¡ÂQÈ‘Áx­Œ¬-Ù:i _Ùœè]²¾É*ì^\åA #s{¿²…®h9dà„æml“wçóØ(šá•{BeÁ‰Tø«hþŽÛ‚bR\"óÄÑ Ó}ˆ€RšÈHeŸ³CÁgN’±mÃ0… ]þ»î·ÝoEØ£ºÄ8êÂŒQÓ4Ï"èqžÂË{ûÑá„P²cÆõà}“݇¿„Ql"Qˆlo>ø™B©9òûë²³ø†e•ølÅ”cÀ2 \ ŠK8Â#5º^ÍaÓC¹½½Ìô{¾+x›PðâC$ejêƶõÆB8¿Ô`,ژꎌ¡Ôe뎨‡¹pJ5qï¾èSU$b¶3.Lüš[«òä,‹Qõ[’Úd¼ÌámØŒ†# Å>Vm=°å%RdÖš³šõЙªZ‹°A¶hùÕ­cS Ö|‡7»´®¬ýˆ,ÔÃwÏ|×7/©1P ­l3>R²æ¸…eÄcÄV3àÏ»üøf0N@_Ìc ïÙk²7Ù+Œ¡”<“Id¡ðp#™ß2Ǥ‘2µ¢%¦³¥3ÉCL`Æ1Ζ€ºEöÏ'=ÀÃÜȸæyWoõ&hneS ˜û»æ´±ìàÐ !|hô¤ùqC&/S–/UI^˜Eÿçø­ç N¦ñyéVp•ö®ùÜŸ{¡Î©£žÇúÒ{âw`Í#Ô{}Ò—Ôι۠ž·ŒÈ€ú4Æžñ(Éé#Ç,ñ›{s{WŠj‘îõ6^aûÒá«UÏ8&[LNw–¡poð3£ôS^K¿` îü}?ãé +ÿƒVXÖC²¡Hîê(B½NÂA%-< |zp=Zø„®›‚'žž¶Ÿ'Y²4×íI “|A|ø€ŸeÇ/²ÞÏÇχÿ¯Æ†C endstream endobj 2144 0 obj 5634 endobj 2148 0 obj [58 /XYZ 38.2500000 229.250000 0] endobj 2149 0 obj [58 /XYZ 31.5000000 541.250000 0] endobj 2150 0 obj [58 /XYZ 32.2500000 539.750000 0] endobj 2151 0 obj [58 /XYZ 38.2500000 229.250000 0] endobj 2152 0 obj << /Type /Annot /Subtype /Link /Rect [145.500000 778.250000 217.500000 785 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_overloading >> endobj 2153 0 obj << /Type /Annot /Subtype /Link /Rect [258.750000 750.500000 288.750000 757.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_feature_flags >> endobj 2154 0 obj << /Type /Annot /Subtype /Link /Rect [253.500000 570.500000 334.500000 577.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_default_args >> endobj 2147 0 obj << /Type /Page /Parent 2 0 R /Contents 2155 0 R /Resources 2157 0 R /Annots 2158 0 R /MediaBox [0 0 595 842] >> endobj 2157 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1409 1409 0 R /F8 8 0 R >> /XObject << >> >> endobj 2158 0 obj [ 2152 0 R 2153 0 R 2154 0 R ] endobj 2155 0 obj << /Length 2156 0 R /Filter /FlateDecode >> stream xœí]I¯äºuÞׯ¨u×M@ ÇYhtYYÏqÃm¤ãEþ~j êÞ¢ôQâW‡ÔPzv÷»¼âpxxæá·þþÇÿúûñ·Oßÿçø»ûóÓ÷CqªËâöÏñòïÞÿ@7'÷÷cÝ”Çß~¾¾ÿÿ×áöÁ÷OÿzþÛÿõñ_ÎÿûËñÿ~þáŸÜ/]~áç¡VõùÏ¿^ÿlkuþ[qÿóòóÿ>üÛ?ÿv™±[Îmæñ¿ÿPVF5—]Œ¬üëÐR]ÿýûï;üv;Ô"JéÊTGe=ªÖêãÿþçáÏçù»Ù‹Sk•ª+[O¬SëËBµ=/¤ÛóDÆôÖ¹þ+3»üÜMÝ$›ûºoi(S©ðä‚÷ÚÚÖA§NŸ·ÙÅç6J%›û¶oit÷Š'?5•ûþ[º¹Ìèóªöüƒ”„˜ºv×Rö×yúÒßf—Ÿ»ÔÉÅmßÒ q˜üÔX£L­K{¹ãËý–M£Ï¯ûç9ˆ5E:¦ðnvù¹k¥ÓáQS$c Éßðy–tLáÝìòs·&ÝÜ×}'b É¿á¶éD/eÜG“L°³E›N¸¸î[$Ý]ãÉåÞ°ÕÆQ¸º’ý}ò×jŠd,þ¶oaˆ¸[…s«ËµjUVM¥ëËs.Ìí?Ùõ¬½,gsþã‚IgPIÇŸ>ÁäÕõ6M~ݹ8TŒn'ÿ1 ÞÈí'À`ð+ðáLJ߾žwVüù‚i—õnüøy°—ÿPº*ÕñÇŸŽÿXúÓ?üå Ô©´US—×ß»Ž_®#åÉèFé²x7R^GL÷É»{±'kn&™·}iNM[T³}Bߨ±o¾ü8û9@]x€U«=X¹3´§ëfÞïT@#…A#ª‚³µp6%9›)¤ ˆ@¨êÖ‡¡ØÍÁ5ÏïÑ[b¥¹Á³y£(‘QÝ&Q¦{)¯£>Ã'ŠC UœªZ=>bü„ˆ‰éŒYçŠ ïïZõè š†$j:’œÅgILížI]•û\ ’·%ŠˆÖpa;•ðÞnFõoæà+|õ…óÏœG?üேö²÷þ+xÐ>1´ ;T d‡xa|éö˜í⛬&Þ—w=?eQù÷•[X¹la{ ‘¦Þ‹À7iü_ÅR 9¼Z|x÷º;Àë`ù Œ\\:Òáx,Óiš,P³Éò;¸·€Ž0á1>Ó9Ì¢ä…dBÝX_CÂÒøG8ò9^pè§@DÕpj Ÿï ó5~×xwùC#X÷jRëmYOæP…†*ã7‰#ñ¸ñy0ˆ=˜3¢m„| óP0‹Ï%J0ò#„Á(ƒ×!¤^ÌçœÖ+ðT›ËWS?`ˆév4­§ º¤ìI«ÇCk¾ ༂*…èZÂuð7ÁßÀ½9Š?„,íM‚(„5Þã,;°65ÅWMéáQ€´Üög–Á4ºGÓd)Š„øàqŒñê†Oª<­y<à8Û Ÿ”°lgalà²Ê f(ÇÌkóR¶OBç†ì £¾@ÅÌ.¹mÚÖÚ£Œÿ…2+36KB”`, Iï ãLð[bdL|?Øì‡wK óþ¯ ‹í=˜W`ÖmàzFz Eá10Š2j¥ˆ—.Êí„9C„˜A¸Œ)ë9ïfžôŒxã| Ë`ƒÖÕ¬ˆ{Qöq† 3FN|óÔj 4jÅ0TøÂbM /j.‹ù+ˆi¾#7°%l$Ì`ï(@,e%Œ]=Ï'¦C˜âbN7öäRjV7ó^]TO0ä'”í„G«{GËD$œkaMgµ3=ÍŽPcÉRÄše»!nbœó3§UJaŒEVkXç [ Ä+ŒèD@PSSò ¡EÊÞ)qrV[¶¥Çk…á>?mÝí™ÏÉ=š°>!BG9AÓåÂË%N·ºéÚÿUf=YGg&(-™Ù‹ˆÓ K’ôœŠ w½I˜‰)£$ F™Lied*fñ·Q ß8‘nÐCµQñ+yÂèW&µlÑŠnòàÙÎd§ËyôˆW0‹¿°´?]ƒf˜ eíIÎwuÙxoŠ‘ˆÑ[i“ª"¼8¹øžc"N"Òl2±ž¦æœwê3Œ=5gOÍØR)_¼˜3ß¼RÖÇÝ=h<hsLN0 \“ H4ð $КE¬œEDݶ±:pÄ”†à¸1Ì›ƒ5mFZÓ6ãXŽ1 ŸÞ=ÉuÃu>æƒ|£îùg&á×À8|[ð†w/÷5"¦½¡ÀÝaŒÃ8Ï ß¹¨æTxטSÁóh|Rx<[¶]CÞø†YK9K†±7:Ö¹Ã>'ßkÊN²7PV”Ûψ½U÷%a ³Ä.7“8+ª+Ï_ ‰:)Ž Áºÿô0–Ø÷Pr× pµJ„ŠXXÆ‚1ì^Í‚ƒ¦c"F§W=|‚Ц Ó,¬ÇùRs1Æ÷нMLB]Ä1°;“¨tG‚'ꯓ˜ÏÆ«˜’‹Lå©´QæÒÔ%š™”OÂmAåzcFÄTK›NA®Ù¡ž.bR9"ç±Á*1sTNµßúÌÒø¤6BTÀ¿Ê f!”Â*‚q Û†o+·ÙBB¤`ýbJ\ÚM€g*…Èð¬=b.îZrE[ëÔİ3™évGÖÉå)UØÕ~¨ 'ªJÈÍÎÅଽoØB…ÌDTmÑøå€òË”€ ªãgsÎbÚúa2› t:Ã)Êp˜îCTU8 É^6Å)u‘›é"¤ý"ÅDÆÃqÚF?n}CÍysÞÇ#± þÆ­I1ä‰4„@RC¾USèñ» „ø| ¬˜0ß@ð‘~Y fÌ4Ø5‘N‚“S2@šób£gx©ðsS”ͯ{?ßÃϯ»Î~ž&…kGíšâ›Xê‚#u``:ÃÏJøN)>ƒ_0‘†i ÑIf÷«ö”×=å5¼·=åµ³4å‘‹êzt?ûÈ>²ä‘•‹Öiý Àm•܈Ò/1Dáð®ýº-I9KÛ%|ÏŸ„iÔ½ølI˜Â%CE² %õ"*èâƒþ*ÊÄëí1^××ÉöigDÄ ŒÈµ‰ð8îñ8«èýõDluÊF•¡#Æ{^» Þ4Q ž­3ÅÙx“ljÓ`gJlkSý2œÌZx«ŒèÁdN,¸4Ö ¼¦lw¡[ï9¬Á0_?F ]Ÿè€²Žl[BÊ#VÎ}„Îëâ^g2ELb7öΰ¦÷¶üÀ””¤Ü–¶ì‰ÙQ\…r' !à.{¹Úd‚`9SÖüËKá)ùZÓúLAÖR%j+[u¿ÉyúÊ'ãУ´@ÇîÞò)çì„vMgü¸¢G×®©¶?¸´kJƒ™—…1s£uÆ/ÁƒùÏÃ¥™ˆw ¹{f]¶à]ÓÖû FVÇ–E7¦Að ×:•%ùTÝFrdzõÈ´ŸÞU†µ« +ÿ•._>ÜË»¥¶",ºE¯ì;“õߟlz%–,>fÔÕ—@_ñõa7eÃ1Ú ‹ˆ½’<С‘ºhd/¨q®OoY@.|Që[’ I“±µG›!k ‘M `¬M²MC2EPo%ðC¢+E’– sÆ{íF„%"øÞã`’ˆP¶Q…éM³Ðè¥@ˆDS¶ÛÝc$‚{{é UíKi/£`¥’ØM­»©µXttƨC,%é1ªôHO‰}mÛ7áÙÝ„—-‡—Éy]ds|^¶yÐtæ=˜hö$ÜmO4}esO.Z'MÉwZã1žlM1P×ÔÂÒ²dù%òi.Û¤6Hëo–1”¤Xã"¸Rd|'S4 üü¢dÄÖe%]Q4[¹‡9#„Š.‚ÜŽg¬:>?ή‘ÿ‰B4¥ ’ˆTg%—‹r¸À®EüÆlõ~ÖœŸ·†P0…6§G¼è\ÕLueÑ–ÜU8%]¢ c ŒªXysÔv—Þ8©Q÷îhÕ”Z3ÄǪ“Ë.·Íè×aeh¶Íæ"]TsòÓØ \ǹöFTç¦CRÕÀ:•Àövà0{h/è›ÀÞð7:ÎZŸÚƇÁg¸ë®ó îM¡ui‹ƒÜjã1$p x1X'|d¦ª½W昀V}c ¼§½ ß„‡ÊÅALÙµ}hçD^åà„ëÄØq¶fÞdnÑjá”íBDàžÝÆ$,Aö”Cì@`Ò¥%JÐSÎB§AExlÞ„µ²htÛhŸ‰ì–‘=œdZÛ°e‹qŸ^{#âJ©Îè}FÇ&p=ªO8²,,ØöÂþYJZÍkíKü„$žž¶uåsÀ´¢ˆL,æì‚õü|vIå…$Æ\ gÓsá…AÓC¬X‰ëñoVÝiÐìíÑÙ*ÄÈ¢Û£Í$Y?Vèvü¶25ª¤î„ÀŠ@³g8à ž‡j¹ ßY‰¡Ã´@†y\²ø/×Lr–Û¦[UÌO8aÕª7_‡âòaz&s0€‹:+¦ÒM5~Ã;•ÎF¥Kˆc˜~ãuðl;e{å[Mÿ\mÊê~Ðm6¬ðÍ%.a”« “ —¸A3å[fsŠ˜Íˆ”ÙD=Y¯) ß×ns—²¹g´ØTÊt8egfdZ¬cbÄ’Î'À×ÜC9g—(DòœûÞ4skx…e_¬}âš:*8xî: —çÄù·^‡³ã<Ö{æ¿-··9žž-”€÷0N 'Ô=»ŠÃ¨Ä²êÊJGE& JafÎ'«p§$ÌÌ à ÍCL—ù2?u(pÔ|.Át qg¶¸§¡çºÜgk;O2?½œD–bg2~-ž’ÖÕosk”t¥‘– ‡‡tPŽg4Ç‹ßG=}­[b•¹£ž‹¼+N½Š¢7”(OºW¥òú¦«9+3›³… |SÜ«ÑÞ ™¼›ÍÀuZ¸kWÓTJ¯úIWí´ÿSÝ«“QzP¥ø¦«Ú_ŸTÕpÏp×\î ŸC´«µxR¿ù wÍ|sƒA}2 <#t’Û­¬ª;§h®ÄB&øR6ˆ(W'>ᆲٲMÚö’IÛÍ ]^ðêFb}eëÒöGdúQt/}„­-=Ž7_³DWf*Ù™ylð››¿uóÜE»éôCˆ‰$qÆý×Gëç­/±ÁìÞç5ŠÏßA¢Ú¯3%Ìá£gñ'íÕgjŸ)~Fp0ñËø˜x„)LµBœN ™’°HæÍŠ»ÊµYÅà :¡&1ÖÝFóVkÆ!ÇdËHŸ½êvàâ#²fÔîTUzN5Ê!tª e„w&-{~-H¶ž-Sjúº t aFï˜loÂÂ.Kº#X(õ|z“ôTÙ«(ìÊð$Ä_²2œœÕVg]qªlÅT@¡NñHÄ8ÀøF“¤Íç&<"§ -Ñ?C%wÇÁ”Gï6¦²j& ¯Ó¯kJˆ§"RcèÆ«öSª–Ê6>ÃëÑæ¨;-¦¶K{«—öfnt˜Þ‚§ßº²3¸?ÝFEÑ›Nd'2¯ ±}á>ÙÆ§çÈôzNËÃel&² S¢²¥dKÉ„ô@·•O$Ê sžÙ´MQŒ67½H7Ù•úc*ïnè¨[߈cao–𱮤ÕÕ½­ÔìU{öÖ}‹¯ euc__^£*؈JlLW}%›u”ú¨ø Æ/ª$/0ø0[‡¨¯.`Ë”~·D}=“;O6¨’°D´‰›/E6$4±‡‘1`0zÂt?⨉.e2—î±B&ÐŒIÎÔòõ|gÙ;AˆËçB:™Fž‰ÝÀ¢å 7â²ZiÄ´D¹Ê~.)pcèf+wžâ™6ÏKÎ+IÏl•ò8ÒV¬¾¹¢ô™®*Pžëé6ЀçPÔ¹E¹^¦˜Ìö]0¹:cæ ¥Ïe›ÛvWB¾Ö¶>_Ûšð³Y›9ºhSÙhêÄ&/ŠÆö¸>æ’ ,$ á[q«‹²ŒÑÛÈ`©ÂqщìÛËS›\€p„P5e™÷míáEŒÆÓ'dít»û,J8"@,ü˜1U÷Ó/@÷ŽÐ3ðK“¬æŠۼвNÅ!ÀŘǿ¤‚'UÛ¾ð#“hä.\³D‚»§È–œ=4k]Ö¿½ØŒrc÷€;XŽº@æ=Þ;½ &™É ¾‚»)•M­|FÊx(V„ÎÑÉ…D'‘"ö]b1¾Ò4¸PÞìVwýëTz1®ò—ÓëdZÿ n¦)¼ÍX ñ°k¹ÛW%o¨ìIûwJøÍWˆS·CWÝd=k ë¨a5ž-°¸kóžÂMA ‹Ùúw€OŠ)ÜkÉuRŒ!óÀu“¢T˜áÔ©ßµQ>- ˆõÖ¥ÕÄIïŒß~±ERúkšÒGJF©Ol÷›^Ó@Xäy5N”Ø(À4aÌo»»†¨s8« ]ÝxÉËu‚ôÛ’ ¤ï›Á Ý:E«€ ¿Ñ!Ñð> >> endobj 2159 0 obj << /Type /Page /Parent 2 0 R /Contents 2163 0 R /Resources 2165 0 R /Annots 2166 0 R /MediaBox [0 0 595 842] >> endobj 2165 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 2166 0 obj [ 2162 0 R ] endobj 2163 0 obj << /Length 2164 0 R /Filter /FlateDecode >> stream xœí]IãÈ•¾ç¯ÐÙ@«À0PUYeÀ‡ UÀ íi†Û˜æï%QL)È/ÈøòE¢è‚;3E1–/Þ¾üüÇoÿuøÛ¿?úö?‡_ºŸŸ¾½ÇÊ—ÿNÿ~ºý@×Çî÷CU»Ã/¿½ü8üxùúòµýï—Ë ß>ýGûÛÿôáOíÿÿqøó_ÚÿÚ}éô…ß^*Uµ?ÿyþÙTªý­èž>ÿûËþîð¯Óˆ×éºÅÜÿý“«tÝœV11ó—ë.Õùß¿ù×ËÏ—ýGM¢”uU}PÖØƒj¬>üï¿üÚŽÿ6zql´re]êv‡Çº0—?É•µ§9mmÚuÙÎYøS^>Áàe¥Ó ~^¹8TŒnƒ«TUÚªx6áb+×Î¥Û9„7á.?vcëdcŸ×-®¥ .}{Ï{9=ºÀIëZRo£ËŸ‚Ó-R}^·4Hºƃ§9a]5 O¸=Á)¸¢L‡=§u§:a<¸mve+‘œ¡S•òàéOúʦ;Öóº…!r=U8öñt_­+šþþž=Õ¦JwÐýà £Q:ÙØçu':h8vâƒnJ{WãÆupùÃ( —Lغ¬["׃†c§=èÒ4E²ý6x‚ƒ¶¥K6öyÝinô`ì¯càu\>jýÀ‹¿¿üüEÙ¢•ÊÃ÷_O‚ßiÊËï'ý±jÿjµùF¾ÿõðû¢Pú‡ïÿxiŽ¥v×%vOjô¤Àï”ðÄ;Ÿà¸6e÷'V¡'ÚœŸ|þÞ"jr$+•ê¦5äøä#|ò91‹†@sŒ²ô…!öì _Á\HÏ4/’™~ZÆÞ‡*AÚ³üý~ž'úuHf›ëR ‚ö`6&J•v¦H"Ù%‹z"»6ç±C0§¢–±R× Ý¥º8_¥ª°÷BRGg˺rD®ß>¸|Õ\¿yóÕêòÕcÝçMùbåÈ“î>Ú£5ßÛ‹žtÌel4 Ÿ ¶¿ —¤ |ç»ÜÑèZÍ]’™½¤'ãv O#bâ,>zƒ(¼úaLGÁßw’Ö@ÂÈr°¯ÀJà¡ã&=ýÀ;øH/¢™2× ÍsK1 ðª÷nC‚´ “.f¹HžÇJ‡˜³ý”š¹ÒzŒ(ÀC ­À{3 }Á¤œ 'º&ˆÁL4¼9‹¯±Šâ0´SC(þ ¯w•b¶.B#0®&Æ;ÅF¶m 1WAB ¥àGœ-%[楑 9j©†Ç‚v)R¾zM ¶Csµ/™ l›cU:c±‡iNo€ì ƒß¨ÙÃG°„ÀÑaA$´® .¦œp£˜nÀ–ÖœÂèÂXHl ŒÄÃ0wLˆ>hE˜ t{‚À2Êj€Òâµá*i`n¯„&ô ¡CÜ׈»—D(J©H«Êc^¹lá s±øÈØ{dMÕó¹ µõáÓe æ*å2…ìvÚ·ÓÚÏR´/à®Ü…úõ‘T†qÈapŸ`7"ž‡x‚]xmx4çÁñ_08ÇŒìJmòaEýúô4X!Æ´’s죋žçÖ–Ò+9û>èçyÎ~%/맃|® POÞî@¸k®Uà·U¯®mÍ«ž [š:ÔÕNvê°aêx‡™gå÷¹UçŸî>¯YƒÎE˜Ö¬ã6i·ß¦ÇÀ$ÙÛ´¸Öv3ÜŒ‰‹¦î§d",dTL äÀHxÃN ìu=ǸCEýä1qJD4þâOdqü‰¢ì1Ó+™Na«Úã;1{æÖÁÍ2A0‹…!+|‘Ì-`‚t vàø%âk—ç*Ï¥XuÄm–1ÐÁµúפڀU l:ëXqž=8}cjLŠ'yvW]ƒ,VÒp>9Výeóðóº2ó@¾)¦!ô­A~Íæ˜Uéœ*šI|1ÐÔ¿5|Ù`àSºžFÆ2ßUO`÷ãÅï0Î(Æ!ʸdWœTpïÍO(‚0àò}„LûÊ” ‘½r¨³µx‚ˆæV †OÜG§¼IC*J ·TÚ›mz $LLÑÇ@ßc™âU•”ܬV;£ÈI®ö©‹gyØÎlÂkch„¬¸¨ŒUT3†•ú¢”ꊔ] TK–.œÁÜQû¾®»÷È;c3n´WøNƒÞ¹r?s¼ÐÒ‚©ò Ý·y\Ï1=2ÛÑ´±y ôÎM[ìÙ£uúvy4gÔ¿çc< óàUÃÑ® eøŽ§ÝDŒÌ'‚¢þí@É¢Œ}&ª¾¢Ýó40\Aö*²À*mžïìa–-€0f}­X1a:¨ªú~kqJ$ÁÌé+[ܧˆÎØ/BÈ$‰ ¢(¶ßHÄt1Œ3 €2±ÿ„Ъ?"<§¤£´ú:uDcc(± Ìd¼@ø‚1Áì™Úš1WîìkB&J5õ5%N~߈àME[ì&m¡RsŠ«Ý°©&O• ¼À£‰öX ‚·Ñäî%,ÍÏQ”µÂˆTF5­,Ç !”°L(BDúì}"f¡w®0î‡*ãÿ˜²ùó؈\£˜7ˆLÌ!ÛÅæœ«}Vš¢ÂVÊpµvåžÅ3Þ—ö€JãË:IÜ𠨬Ôü"ä¸Ó²ˆSfi–+.áµXÁŠÔ=‰"ÄlÙ¢[*^»‰y¥^Ϧñ9$e¼–­Eµ|JH‹.Æü(*x1qõ#YµÂÎ-"raÕE )dÍñ²eGUrE 3§ÖjšNS50Øsck2ñK6>)C©¬Ê?g&ÁJÄø»á–»öxÁ·w6/88Áœ 2uå-=*¤?Ð<å>!’ðÚ Ü¾šÂ ¸Üþ ¿HúÀ£1Mg°}ˆ1ú©¸eR ±)>9¢CpŠOw ¬û] ý.N­Oˆ$#|ç0€‰_Æ^lÃÜS£iN`<ÀkÃO0%Ç4ã|‡ºsðpƒÆÝ oL2 ¦ÊÄ 69ù{ÝLcÅÓðwܸpçïkàï¸aZÃP"Ý90³6|rV1MÜp“$Y©·„c(þc&Ñc™ £oémnµ÷/dXÎÎAX£Œ¾=e¹t/\lׄª2Ï´éØº-† LkÒ4þ ̲ËitjÞ"™v¡t7:±B)îSŒ»=ïF§Ýè”SŒ\±Ñi7žLð©²8=ÝùÔu§»ñdÕ| we2Agkj»p>S—ßFÆL$f†˜AU›¾é„n§Ñ!-K7ÎËÔUM™ðk‘¢DDÕ 7mìcæÆ²hË&[`è±êh‹Z·R<„é;—©¡p–òq¼#ˆ6s÷„¤ÕÿÇçN¢¯\€yí¥.}h•ÉÚLmܘ{)š]¿ææTŠÙÌâ­WeP`§L¹Nٮ݌?UTà–õTgËVÀ’v}WÖc¶2 "S5N´aÕ"”Êų\)@Šl=S³¹aÌ1q€N≠nÅÌ3YR-½ÅHÍ4:Í¿öL †_$zû g ˪†Ì%X³‚ÃTÈTÉ2p |Õ¦„÷Q»Æ¿+–Àå:NOѧ>x³k•3Âp—'-Ì•—iªIÐY£OK#dÂLÕ_SK =-«J2BªÏU¦oqóÇÞ[qìø7VÁ%˜ŽùÖÃSC†WÖ‡ÛªÚ%¶3ýÖÿmu]Êòô£Rªû´<”îxÞbûåî“_^J{TªÑu­úo™»QÌíí÷»¿õ鵃ÿ¶Ì¡Nïx+i¿UßRßÏñ÷—¿KÄêëŽÕWWɇjQ·æÊž"¾V ïhârC}éü>†b0ïˆ$•¼§TV@ÒŒî&"bKeZæQ€UVs5—Òî7ëÌQû/8[ HçƒÕ_µ¦Y¤p5¶öVó€Eym僔J¹%¢Ú3ÔSÖ•¿·ù\—2de²uË:w[nœÈ„±Éªµ¾Ë˜pLÙz+%Bßž°gh SRVVj6« Üj‰`Î[còû´îÆÓº›Q­»hÝ͈ÖÝôZws§u7žÖÝŒjÝÍ@ënF´î¦×º›;­»É¨u7½à#dcj—F ¨sx4Ù¶ÝV0I˜ÓJɺ,=üdj‰æ'gÐS»È·½mªëˆ±tD œüƒëöL¦9%uˆV³UFõÉ nkK»ºµ«[»ºõðêÖûey­îey­Ædy­|Yþô‰/ËŸ¿eîF1·s\ey­Ædy­|Yþô‰/ËŸ¿UßRßÏ‘^–×êJG»²…cÑ©¹$Ü´mM’ˆ-qAvLã!Ù8—ˆÀ´¬: '¿`âõA€² ˆÈ¨…}CÆ9(\tƒ(EH«Ïîn½½mJÁ¹:ÅòK×Y×óNL˜0ž0aF… 3&̈0azaÂÜ Æ&̨0a„&L/L˜;aÂd&Ì.L Tt&‘Í7 -Þ™üF™¼¶ÞeÝ“7•ñö¶-&_Ô …ÖR\Õ6ɃªœÜb‚ó7*¸`àF× îN0pž`àF7 ܈`àzÁÀÝ .£`àvÁ@ÚÊÀE¤,ünBØ¥‹€£­ònü;XTRI¡ôÖ¹-I¡ Õ9†• y¶ô™Ê$×sô1avÓe …™ek”¾ž` s v-[Jncì:[rêòaW⢜òá% êÑ$A=HÔ#I‚ºOÔwI‚ÚKÔ£I‚z$¨G’uŸ$¨ï’uÆ$A݇«ºÑ;ÊùÍô´Á~>Ùâ»|=ƒ†< |ÝjíRÚ”2é[LuuÜÎn3B§)}b²)}Á4ÎÛÞvŽÎZëíMŽ{Ùz4{@²ôHö€î³ô]ö€ö²ôhö€dè‘ìÝgè»ì1{@7^â阢EÊXS½†© 9ÐjD2‹˜øV"À‘©[¾êÓ`jƒ1Ñ‘L´'£ˆì"Ý6E:«G³Ó©Úàö;²Mƒ¦Vöˆ]YyGŒFŒØ‚àjêÒçÄ[’eK­öû´ô}ŠÊ‘ hÄ<¸­Sú«UwÝ&np/WÙKóÖ) º¨‚wŒ,™i´åÓœR—ñ\¬8ã ÎÝ”4¶ú—£]a©Ñ˜B]óûD´Q_A–ÝR]Ï“«³ £™3JÛ"5Þ :dk¢¸!B„…{ ÈV|Ì‹¹¸óv±¦OŒo*¿«5(Ûdª+3ó0rÎC7(خܖ¹dÊÊ[uå3C L_Z¦Ó´f#ø´|SàÇ”D¨ ¢<=Ÿ¦ê³¸fíþrg…ÛÞm:J8}¨nÓ”t'«úÈšŒDÚ+¦µU¥ŽM^1¿sz[KWüï{-ß{*-%&BpVJp· ÿdäóÉòÂeÃñ2‡=ß(.ÌæìÛÎBï»÷gyuñWžbPîÎf̯Jø£‹Wø{ѧ*f޽ƒ«yâðhƒŒßÁþh…&`¸Á† Ÿ<ãÇÿ¿Ÿ@Æ?Œ¶ÐOAbˆ; ànN!ZÄWœÅk ¼ƒ¡óÑ.†Á<Þ)oçÁô ?á¨$Ç*Y<`’V²ñ¢wàhÒ^¼fXCJàh]ÈÍ‚œ ß’À=%0$kÌ·sÄ™^¥9«ßA!ðÅ÷ ï›À$Šráw*DÝt“(yÏ#ã¹ Æ‹SA>7‚ G(®¯ 㺎‰)Mg߼מª @€K¤³½y…ðË”ô’É• ¸¹8m^I5eÔkW¸å†' 6©‹â” †G›Ÿ‡G¥dÉ–àc¤W |FT‘Í Â0ýÅÈ–L;B,¸3'Á¶¶˜9e'½Ìžò’U„2ÉÔJqéÂTÎ*ÃȨ’&Ê ½lrcZ›žp‚ÉÖé¢ò- i…*VuNT¯ˆÉ0Ú9 5•aD \Ý%³ÙÍ– •”Ìi «¥pŠ ûIœ ƒ:›jPgSÍcŠ*"¦½Ò¾¤±xíüà£d­Æ¸`/„‚h†Çt5:}/÷)TJö„©gD­ºZ²UUÞ~ðÏ—o³ªÔJŠ”U×åæö²X@ìX§a7„£MÖÈGQ}Æò.Zü&¦ˆÂZÄ4¨rÊtù]—ª0b‘ÖÛ+[!ƒJ‡%òã(|ÅX™Iš¹Moÿ~´ˆÄ£¯S_˜hõhúöŠêdË:h{…1-å…jä.PÐG}†Û åðIç¿ÒÇΖvsv ò‚W4™Ò ÆÖö¥Û)ªÜŒM¨Ö¿†8ª¤n°»8؉IæÈ6 ¾Ó])µõ›P>áN¿·+¾´‹?h… †D.-m=;;œshŸ&wT5 Ìø8Õ”k&î ”"{qý“+± ÊÎØqà ÁáÈR$‚«ãqX*Œ[uýþë]õQ]66ïžß–žär___þÛEEK endstream endobj 2164 0 obj 5855 endobj 2168 0 obj [60 /XYZ 38.2500000 709.250000 0] endobj 2169 0 obj [60 /XYZ 38.2500000 709.250000 0] endobj 2167 0 obj << /Type /Page /Parent 2 0 R /Contents 2170 0 R /Resources 2172 0 R /Annots 2173 0 R /MediaBox [0 0 595 842] >> endobj 2172 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1409 1409 0 R /F8 8 0 R >> /XObject << >> >> endobj 2173 0 obj [ ] endobj 2170 0 obj << /Length 2171 0 R /Filter /FlateDecode >> stream xœí]Mã¶¾ûWø\ ^ñCvfg ôP`°ôPôPl’A7è4‡þýږ䙕üÐâ#’¢,fÌÄ´(òýæûÅúòý?ßxüòŸý×î÷ã—]q¨Ë¢ýgúùáýÒº¿÷µ)÷_¿í^÷¯»çÝóñ¿¯»ö/9þõ¿½Üÿùøï¯û¿ýýøáOÝ—N_ø¶«E}üýïóï¦Ç¿ŠËïÓçÿÚýõûßN3ö¯ëóýÿÿPY§UÜxóë®ß¥8ÿüþõ·Ý‡vÿN/¢*åñ—Vz/-÷ÿýy÷Ëqþ~öâ`*Yë²h ü›{w-Ï//˽Íi!zôîóŸÙýÏ]U&ØÜçuû‰P•°O~h´u¥ëbMµ;0ÂÄëÛìþçn”6÷yÝ¡ðŠ'÷ˆ×Æè:åXV̇ýevïs×B…“çuûIW<¹?¼Ö²è8J• wØ_f€WÝÈ`sŸ×í$^-“{Äk©u89ünvÿsWelîóºÉaËäñZ˦…Ž®ðëevÿ°7²PÁðz^·oôxÅ“ûë‘eÕBG©&ìûÙàµl‚É‚vݾAÒáu<ù³Ã$x!í'à÷jyðáe÷áó‘ÔªýË/Ç…ß×þzù¶Ó§ÿ9ÚðGcæå§ýËùøãþå×>hÕjOß;HƒFŠG4¢Äyļ}µj?8˜¦¨dùî«¢@#xzg+$ÑîÛx¶Ú}Õ–µ=Gʃ’FLÁ0ÀÏඪhʪÍÉÃ0ü( bÈŽ^Œ‰J ¾*‚þ`‚ Ò²$8þÅLÙ>£¥®L=mÏ&Ûµ Ñ?ôöL gƒ †IG·¸}z9ŠÞybSèIΣÞ>KNcúõ<œßÚ΋ù¾ÌH G8¢Ñˆ.Ýß#àlâ3Q>SÁ<Âø Üžà ðNáÚ,Ï`èï‘§p§ˆâg$Ao Ó„›å=Ýßc¡†(þÁ#|"púÉ]Rà¿òMÁýX` g“ø=Xî@βЄŽÒñtNUÔkÐ9˜b žÑ˜3~ÆzŠ‘v˜ú Bfýá]0XÈ’ØQ‹Þ…tˆì”Õd'æ¦l¯g{=uy›íõ i } ÅcXKˆ9…eÈ☋µŸ»ÔÕº BËùœcÝi>ç¬UïæsÎFÎ97¹uqY&¬0qP":HÅNÃFÏ,K"€+~‡ßcÙ G ã"AxÕ8Ò+øla¼jMìG^™¨0Ã%ì‰yŸ ³q¢‰_‡bc](Ÿ¤30ð1 ð ­vp ¨×J¡‡Šmzª‡p„ʪ!‹IÊ`òz,"èa:ç`mBdƒXä2¦4ž:€oÉÂ<5Ì(²Ð¶Ê0Ö}XK”Î% KI+ÆŽ"4ëXr|"ôMx­«òûé=}=`fkIÌ0W ÓÃôÞÀ;f¤(V܃ž1n"; ¶G Ô¥EÓ™¥Ê«qj„AæåìÈ¡ÄᘑºÑN¢XáýŒØ1ÃG¸Å«_JwÚÄ{›½h®±·¬ZæÖì¶ËÅ¡ÕE£e–9TS>®<#51ÛgøLƒžQ=Û×bv8[g—´R£®y®­ åKQõ¸z{FÁýÀ÷H8‚wŠ×fÙÏÓ÷„$0Y (Œ‚n ÷ánî'÷Ù:ÅR”yøàN¯¢¥×ú FÂÓkßó÷S¡X`wŠ¡cYAÚBéýÔuŸ<ï·ìÈo½ŽEICË[H‹”©"üû.f:Q—qÿN¯&àØ¦aªq0ÄrB0GØ‘6üÀ²/ j‡€_¨gvg! §1šú!ÍêªÛFá êëVåhR±êóî^¦‡(@\2ŒÌh"FÅzãûƒ³Q„>’+XF`rf¢’Lü“³¨n¬¨"„¥_îgœêŒÏT¬¯Í•ÝTÍP®Ò“ÍĘ4Œ1Y¨ÅÁ,†¤À¨¯À>Æ'¿-9éËØ^x釪u‡¾t>¤òP }bÐiÒûvd?4L4„psPÉB^ êäëõ=ÌQq†Pàãk.ÅÊ9)ÀÉRsðc8O2ú\‰â©äàáÂG F}BœÏŒŒ)åÏÁkQœÑÕÙ†–B!%ê­)\’J½b@ÞSFy9\1æeØH¼ƒ3ɳ©í×E<=?‚‰:ùM9ÖO8¸+õ3¥X»XÅ*b"Šï-ÐU¸¼É[bÂz1MÿVøà‹)_e™Zxl ³=<¦Â©nÐIx¤À-àˆå=¸Äwy=«±¦QAàï‡hÏf©CØS£©TÏJËÄ 2 RØì$<®–µá0 qóq ¹ûÜuæ” 0{k}×#gwë<Þ Œ²äŽ.‰-E5P}TÞ–WÆtqˆ†ñ‡="•M346°åÃØ’Øfe]wnVÕˆ³«ou®¾úx†Y9;ì5>zu-Ü· ÃÛ˜*v+a`wD.™Åá–„;®.Tu§¼wî%ÀM‹Ã *ÏÔºëv\Ø÷Ѝ‹Fméë½$±BBwBÅ#g;¦¢COæ÷Qõ—…ˆðôòÜâ¥åðò"Ä/Á»XŒ•}L»œêÈ$u.ÞHŽb>6hg]•®×œO ‚Gö Ñh†jÏ(œÃà5JÞ˜¯¬gâdhaTÚà‡õXŸmŸS&ý’¦+¢~/h¼vV1½§Í¬(¹,¨ö¨ðˆ ±„¼ó^KÌCûõüžÈüV5$Œû8ZíqãÂkcn!JÀ÷‹9FQåóLê–Dêç­Ä ÛŽ¬Yµ÷1ËšËL½QeM9‹Æ÷iëê—‚tå/p£Xª”ýAß$ÍÜpú.p¦¥ˆ F\÷A]‘pë¤Uw«¦ú>Òn©V£LN¦‚ nò$¿ û£¼ÐѾ˜žJ8ýoñ|sªû ßI%èå5#›žeíhõD2ºE÷ÆJµöÛž,VU–×”d­Ñ3]þïµgðH龂t¯³Š_ý•“×W˜¼^Ö+júàæPZÜÍÈ$ûÄH¤0âÙE‡Ý”Öðœ$°Ò`÷fxÁ‚b–Ùpê ¾´šÀ.§azš[Üü˜Þ0gáUCˆRnq¬³ð~":Z˦ºÍgy$䑨6Ea¹Á¤a2§àÙVr2¤Å8 <qGT̤ÆJ]n)ÌgäÎȱÒ7óYÜ÷Y<Ÿ‘SÐF÷F£±ÎÈ)kñ 21|MešïQµds¼œì‘£Švˆúhoå7›Å²X¿ ÓK…¡zŒÞ¾#„YôôIfäÕnßu²“ÈÙÌ.˜0!“uJ9À"• E4gÎòtAyšÀŤ Kg¿ý$‰–¢LËyª 7¶v|\Ýp\›Ñjx`ˆDqÓŸv š3×R2{Kq÷“”î¥U°Uc¬Ä*&Ù̹ßB #2`îT‹¬ò#t÷V²ªªH÷NÞ¤Ê𽺈­ŸqÉ£@ýz¬0>¦ßãçXâDG]dµT}!£Ç,õ™^ïœÎ7ꄲžsùÀÂåuÕwÒÉ©¶‘œ±rŸ-NˆÃgFd>›Ågž{rg>[wÇž(\kDÚ\êˆÓ bvC4ÊÜÜݶº!š²¾M#L‡2¼;l A=Œqâ·Ôg;×Ö™BºÎÒ ityÛŒºË — bÛ,Åßcf@GåµX¶bzšfŽŽÏ¶«m§)Û®Ù#m×mÙ®=¦¸¤Fe©º%©š=YªnKªFô˜Bš9Ô—¶GÀúÒž5€)LïIÚ#€-\¬±Ä…§áì+ˆç}‰è0¢Ð+ÀID€Rݦ„l»Þíš=ÙvÝ–íÓ# t {h³TMZªf@–ªÛ’ª1=¢šsãnêã¼çÇÅoÁ4Rõî| fŠ-ƒpUÝôËÁ,/Æ ñæÔÁC˜à^Lù`´žEL'4‡ªX ¦7F 6©šW­ Ø+ QE5”2Óo˜¤ºRŽ:Z@µÔŽcºvh¹³Tvª ¡"’fH#LCƒUö£$äE¶½LŸÀX·`2ksh&‘Aœ;¬¯Ã‘&×pNYAÌøŒ*æÄ|W`T¹y“ÖÙ©â>#qè_ΪØÍôŸB‰ìkN…›t_©™£ýDª9UV9.eÛiÊq©íÏq)–F×—ŠíWFÏ ¾,Um;MYª®ÚËR5KUö¤EªêbNfjêÑ~-/ýU'Eû?û×ã‹­ëz¾õ… Ñs5`'Ô¡'?õ^^2¨[Ÿð5gt»îúŠç·u9˃ç5Vã‘>òÐùÉßÉÒvØ!å=êVÒµµ}îvŠ\õ8ˆ¤ß–TÀÅŠnë£ vBâÚô5ÑhÏŸéDµpÚú;6b îô÷qÅ=¢KwD ÜÃ’€¬yv¢WOAÚ¢äNS9£S`gžÁ@1øØ-„;ä˜ T‰ƒƒzÂŽ-,§g K‰®Î÷„Ó{ÜVmæ³w]˜ƒh76‘ÏßåÜÔrÏûçÝÿÉw°ò endstream endobj 2171 0 obj 4107 endobj 2175 0 obj << /Type /Annot /Subtype /Link /Rect [53.2500000 660.500000 111 667.250000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.swig.org/mail.html) >> >> endobj 2174 0 obj << /Type /Page /Parent 2 0 R /Contents 2176 0 R /Resources 2178 0 R /Annots 2179 0 R /MediaBox [0 0 595 842] >> endobj 2178 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 2179 0 obj [ 2175 0 R ] endobj 2176 0 obj << /Length 2177 0 R /Filter /FlateDecode >> stream xœí]KÏ㸱ÝûWx`ÜâC/ ÐÓYhtYY=™ 3ƒtf‘¿Ù’¾Ï¢|(ñ¸HI¶nã¦{,›¤Šõb±êÔ›?þçñ߿߼ûüŸã×îïwŸ٩̳öÿŽç?ß] «S÷ïcYåǯ¿¾¿>>5ÿûíÐþàó»¿6ÿúßQÿÒüÿÏÇ¿ÿ£ùð‡îKç/üz(UÙüýËåïºTÍ¿²—¿ÏŸÿtøÛŽ¿Gì§ë3üïïòZu^ÅÄÌßý[ªËŸß¿þvxÓ¾Ð$JU¶ÐGe=ªÚêãÿuø±¿=;ÕV©²°evÇ<¥>O¤óâ¨t©Gó\þˆŒ®äÇÎkmì˺¥I¢L¡üƒ îkQ™–:y)Ož—Á#¾lèkì˺…)Òï*[pS+[v´QVž:¯£Ë]Y´±/ë–&I¿­xp‘}U¶QbªVÚ\xè¨JQ†0¸®#~Y¹8UŒ®ýƒKî­±yKŸ:@ —ÑcPßžuq¬Á/+—&J·³plÉÍ«*âÆ¾ŒƒöE¥ã ~Yy¤…cKnlyö»£mìËè1h_éˆ\sYy¤…cKnl]fuòñ¡ê~ú¼/>¸Î”Vñv¶n©+L•nkñàr{ÛЧìÜa÷Þ=ÆÖjÍÌv+?óœWì[rcuo«¢l¬Žg ufL4mÜ­<ÒÆÂ±%7ÖÔºÔ7B\į#jãÂDÓÆÝÊÅ©ÒmíhðOƒà…´Ÿ€Ðè7Ï¿ÿrxóQÙ¬Y\qüòc³¶Ë”í__š3~Þü‡jŽáÍÓŽÌ2]ÿéøåçC}*tÞ¯°}’}„O>À'UøeᓜXÁ»ðy2¼üƒžèïÑS´†ûƒwÎCÑ,ü}<´~¾ÓRç×FR¢sy㯷:îKB‘\ÙiÁ{‡¥¿”ÇL‡ï‰‡ážPïƒW€¥®$äÏC<1X†ñª1 àþLQF'-þ$Ãv>ñÌyTAâÙFûâyÅ|€91Ç+¬]ê„ZÕ˜]«>¡VÅkãÉúXÒ—×Ñ»V}<­Ú½i­šë~¥XΦž¤Yi©zÙ‚ÜcÄìZŒÍ.‹)t´ÏÞ^¦´'kÚd0—8Õ©ª³ËJ]Ãrë7=éŽ6·FkÝœr[TåàI+šÕœ‰óU¥á|£QáW­óÉ’/ö]Uyáp…Á‡W,öiUlD!ÑÚ¸R·»S·a|ݾu~2ºRsÁepÌgxâÎÌaýÙ}•YZþij+!jxÕx8š2Äü¦˜—ð 0gŠ)hf”kg<úxÄÙX<ð¶Žx0€chì[óàß`SKˆ¥^ðªñ_Ìÿ­Í…퇮Jwi\ª ÝÈ…¥Å¤Mñ J~Á)§0‰ã{bç’†pâ¦ü~K¼ÏŠ%xùºTÜëÙ¼" Ë“° Wí ï6¦(ÖÊ8½(¦aÊy˜Ýf¨ãÑñ‹;É¥¥MÄÉÊל´v•ꮥçh€3ª>HAÖ›QÕ<øÏ!fÖTÎ:¢ã°‘Æà9a€h}ØpäË\ø›.ÉsÖ1O4‹‡­˜‹R*öéÓ›KÓýhÆ“U'$º»ÃÉ ¶•Áâ¤/·³~#)G1m”1Žn¢‚7²IW‰âdÂáp& ;L'V#÷ ²ZŠ]ÏÚ˜äQÈÎÔ<ó“»D²~Á I‹X:R,|Áh}äõ§DfÖXØ|R²Iì1^©Ì4“öú1¹‘¬Mé:ð‰.„ÞVâ”Éä1RY²k#4Nì*€¢æ:H­óðÝȺzŒÉìö°Ž©ŸG=<‹áúSu}—‰ÄáœJìeHÂ{¿ãÔ“ †Y«ÉÅÜ'¼^¡ap©y¯¦æ¿ZQº¯æ2u<ƒê«(¹›¯ô¨Ú¾T\#i(¬ì# ㄊ[žTcžlXëÂYú 7w<׺ªë~9|ކ8‡Ëm•ÃîÉ…«×Šg˜(̸…Ü­°KçY_>U*=~È}€ç%Bþ²®cìÊ ¬ýÊÌ#‘Je»ßÃB²éÂ<—Ž¿4]íFµ#B´æ¢P=ܹ3g²lLÑR²·ù…¡²qZϽ.œ÷L,ÑYaÉÂ7s‘s|³r¾’ÅII8áÁØ›Ræ^YºF§;©Û'Ú”E>;ƒ‰UÔ[3¦F{*í*IÎzUeÛaçUf¼î‘÷D8gC®X~Y\v—Ó9M£ñëúQ5þZ€âsù®½w¿r)UÕÈò ‰5R+Q«j·[·[ö…Viõv+±ó¨ŸGw«·i«gʵzÛÄBئXÞNíVOZ~vŽ_ƒÕK“\uÅ;WIÙÉt»ºÖÃMTù)«Í0óŸI r²6ݺaAèAªêZ¢Ïⵂ“UqJWŽmÀ£Œ¨SŒÎ]¥’÷.øú´X{1é_»üÈ 08ÞuO@Ï 'T3/ÈdW˦íTw0fluHÉL®Dz¼¬WCÁjàlÈ=›K(›kYG¤ÊÔö|X‹L¬rd%÷Û¢-Ä$b¢®eVÏw]ex˜r&™œ(/¢ .™jö…±Õ(²‹]±Ó¶˜-vw8ç‘ÙGî[¬õv £NfàèwÒÚ¥["‡;NöÑc²u³º ½ä´ë‰~Mp'›5EÖLµr8jkŠIW&äª 1´}v\×êå–Ã×›âÑa¸Ûù[Üòr ¾h©!Wâdè ͶG@e{ôÒ×ÑZ~½kêy¸‚É`Åàyðûxô<^ÛQºÁÈ€Æ+À;‡w›Ø{åà͹^ÒQ#*eÙ—ôÿÝÌVeÇ¢8ÿU6&þòéù“üÔê¬ÿäë¡°§æßºªÔË·Ì`s=Góýî¿‹óώίËÜ£ù¤ùÍp%çoUƒQªá?¾ÿC¬¶³z©L¿A‘¸Ñ‘qyç_…P [„~Ï­Cñç†NèÐ}®9PÖ«ñZ™>ë©n”âÂÞ?J¯Äõ±N*¬Ç½¿b¨Nʵvu’ì],!(£“&…\Ù3×ëW½kn)KÜàyÞgþ>ÉœÖÜåB¦1 V†Ì«§Ó–µþLg ‚¢˜"œO…Í O,{DÆ‚ ’ðŠ1!åK÷à ޱðE2nD 'ñ;'w€Jzd8°ÅS·Õ…|~—‹ì¾`ˆÞ0Ý+Û£hñ–&ÔQe>.Çcú~ñÇøˆê¹ 詬×ÎL‚H*äb†Keú,lìDªªÒÙVa%ŽÅo+‘Š=³P_âXÁ¹e›W¤rJÇ9¿{^­P^m ”De;IÏg ~âäN ’s¼p&“¯¥°5ék;”Ì êvÏ‹ãnÓ+î㎻ŽwW…L-©ÔÚpò!Sç ¯Û<5¸˜eñncÞÁ4`øHÚÄüæ©PÆ‚C¬€Añ Pä UŠVºí Ë–…pÃ"Y‰ H•QÍ€`qº$››%?;›{Øëù5³ù °Ð$2› B[0À!óϸ&ÀÖðQ®£¨Cåqö03ÃUwozò¢Qõ yÑèìFò¢ÑÚI,<â&/^¾e£˜ë9úäE£ªÉ‹F•îÍ'nòâå[Õ`”j8GüäÅ3ÒC'ZÌåšÈUt@l¢œÚU #Ü S°G!4ˆFÖp#ô.bsë7øI¾‚È©*‹µëΑÙ`µYÂÏôÊL®àNoµQç¨y‚¥c€öx6òM9Þ{“GCÏq¯¾)y¸<”Ã@úpÿdÍpø˜MV“ÁŒâ“2qõ@Ñ€-ÅyOTó/‰^ y$ GL®Î÷ñMe=|7•\DôyЕ™äÝTî¦2¥©\RöâÚå!ÍžUj&¿1³·êf›<;îf/¡Ù{4¤Ç- òïºÉ´íåáËM¦m/›LÛ<Þ2ž?qo2/ß2ƒQÌõýM¦mvtmFs˜ÑMæå[Õ`”j8Gü›L[ª^)ªTµ8LUŸ§(Á½!£ªùÚŒ°28 n…ˆá²Øù²²÷ñLùJHÞü»@êv”< {Ù>~…2/ÊBÂø"0:Ë÷¾`@G¦.qc^®æµk»¦P7 Éž&?†ÒÂË×õŽÔ$N‘P!ø³)@ßÊÐýŠ—4³°Y»ú@6a ×IãÑÆE«ó-e¾$†÷¤+a8Æ][03§nAЯ;f è€@S\¯d>•hF#5¶&p´Ý1HîÄn|`*WæWiÈ”.Jw¡ ül/éÚnä»rW‰ÂuòRt­º;üŠø°4¶ž^æjü“0H°Ý‹ˆëEÄîž«]]Ë•iÌ­ÊKY—mÒ)‰»©ÆæO¸©63³7Uòó•z×n7»ùX£ù(FŠtº¡0µ»NÖÄ{J—DÛ.PçSQØcω¿”صç÷˜f5Pµk×ws²˜9YeLsױϠcSáùжqa.ߪ£TÃ9âÃäÅ À]*Àv?8Uc@ÙsŽ·RW}ÁÕ˜±ÕdárÐú±¢b*ÃÊ8ô JÐñþ‹ø}D Ý/)ÀÁe—‰¿m²ÚŸz¬XEQð ≧0b‚(× CjÈO èo BeÝ}‘×M]icï‰ïAMJ+Šö ñè>¦ñC¢{žT–aÜ]çЈ^ï0†›êµ²B–l›„Q«¿hÚUÃH'€ÆBÌ%‰°nÕ[àT”—%zÎÀÀcdI7€Ò4˜ïˆDCêÕ%òlÇh°7i£B¿€‘­?î°1Œê(¨Ò‰ØÂfÊmïý˜7ÖËßë,.hyý ‚f0ž<ûÐ$± ]¥²“îÑ —§Îid»ÜÒÎ.Û/ÛsX¶Ú[ÖìÇ[TYþ l±|]ö{ ãÀ„oUý”žÔûýVg·:©ò2¢¤Ì*Ka®­ˆW§Ž ²uDŒøU©dçù¹ñT. ³X‰^3ÉŽ+ΕŒ\ |ÇEX̤"£‹çÉ›ÃéF83„QADÑŠÈÛdJwLéöÕ•î½>™ª¸õ$ øßbšSiŵ€Â)JDFܰ´e—´û*Ï8&Ætès×£Â$fQÏQbªÈ:fS–ŽùjŸç—PÞ“œ¼xŠ`€š§…•Ú çt&ÂÇ  ÚH̉st@[¢:ðÊõ:ŸÛJ)m«ÝLQÊ“ÆÂöÖY¬Gþç›Å.{-A<³ZÜÐ$C®I”ôL%û&F”IÝH…ºžFj…±êù=S™r *ŒÉ—Ü_h_gõ Ð¾VÙBûZi§þü‰[hù–Œb®çè í묺Qh_g¥;Gó‰[hùV5¥Î¿Ð¾VýE´…eÂÞ8Ž?böŬÈx3 Ë'‚_®!T#Gg…q R©Úå ·Ráß`ë̈ç^“¿\M~”øJÔÒøÂ±IÏc+8Ì0àü)*Éd´’€¥­°“)&j#qé¿›&qÓ$ªQ©¾²I©’tûé ˆ"mÞ#YZpc^šÕÊ1›žÕ0±8Ê€H"ƒòÌ£6.y—ÈöŠö5`vŸòàçßü 戠!„ÜÄ-³v³ù­€˜«l9ˆ¿e£˜ë9^bÖÜ ˆÙQÐÍêq@ìü­j0J5œ#A@,áªTÈ“‹÷ F @„|4Ï1 ‘4À…`â{‚7›³, ã39HLk5‚ñ=zþ†BpaRœ÷†OËI4“Cåj%f .Ï[(’mÁdž3{FD“SÆŠ“ ˆÖ8ˆ¤ðP àKr’åBlÓ˜ÉÃËw_Ü&­…[Å1Áb0ÀùùN!µŸ †ÐT–Çâ=š“•ª1¤ïPZŒš«¦t€€ú,.õßÊZÆyÓ8ÓgGÃ'Ë à±ž[s6EëÉ×ÓCCŸà„›ïa ±V9sHbÕ4—`øŠ’~’èõŠB€™ ÆàÀx$žÈÂí`X‚:ÆÈ.„úò ¤ïiX©¬ZRꪧ*Tã‰0\t¦r3T†Ñ/åv¤–4l¦³GEFK¶‚ºZÞÄ%Skºè­ÄÅÛR&¢è4²Õ)"ýsëþóøÍˆ|¸=³‰g\ÇÁjåèÎÄ#¢Y°Eí¼sÏ%c%z/¼5\sA*XŒÅ=‚Zêd)™ËgÓËÞË.æÇìé+«Ì¸ᔀ @Lœ¸`&Z'éuQ‹ü½‡=6öxŽÈþDHÆ”/‹é”sv*J5×#ªã„ƒÄK¥ñR™09Ì–qÕÓÙï´À²õN£ë 7YÐSX÷<ÞÜúR “kßä›,‹¾µNØÕ\k×îgÁµz!% Üì|T:A€ß…‡èe[Ï/#xƃóçø­Q¡^ ûiê 3TpuK›f—3uÚuß²;†Ü¢S»uå ~n«qôI_.ãóZ1~Ò™}}ê. ®$JA"¿Gó˜)½skm»7EõQ˜­«± ãìßyb!¿ñ Ó©&ôêWi:,Ãÿݬ¸ßè<|£6꘺67س;‹Ø9›öqr§‚ÈŒ·SM!‹†ý¥‚ćÌîa\Wb¢p%vìŒ7öˆž¡,¥ ¹:SŠí~ت«ûÅ»<ж/6SΦpÊ ?þO!µ endstream endobj 2177 0 obj 5696 endobj 2181 0 obj << /Type /Annot /Subtype /Link /Rect [202.500000 374.750000 251.250000 381.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_default_args >> endobj 2180 0 obj << /Type /Page /Parent 2 0 R /Contents 2182 0 R /Resources 2184 0 R /Annots 2185 0 R /MediaBox [0 0 595 842] >> endobj 2184 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 2185 0 obj [ 2181 0 R ] endobj 2182 0 obj << /Length 2183 0 R /Filter /FlateDecode >> stream xœí]K¯ÛÆÞëWh 2çÅ! €}m袀a]]NÓ H‚ºYôï—’H]i¨oÈ9:3R“‹øÚ¢8óžóš7þüÏý¿ÿØ¿yùüŸý×þ÷Ëç]u°¦:ÿ·?þ|ýlýß÷¶1û¯¿í¾í¿í>í>u~Û_øüò×îoÿÛËý_ºÿÙÿý݇?ö_:~á·¶ûýëéwkE÷·êòûøùÏ»¿}·ÿý8â0]¿˜Û_W²’ÇULÌüm7ìRœ~þøúûîÍyÿA“YéJï…VÝ­–ûÿþk÷S7þ0zuhµ¶Ö¶z`¡õq&Õvƒˆ¦ÞË;~x†¯•ˆ7øiåìPQ²õΉۺQ=|lð_†0xc"~Z9;TzÜâÁ9qÛVæ [GÐeôÐo›ˆ2á´rn ô˜…c3"VTáËž×Ñ#À^ˆª7øiåÜ@9#͉X1½¬#°ìëð1€¯uy>R‹¯@Ãwà#8×VÁyð÷ãY¤Œ Õ†ÃíyžT&ü‰g4Œmˆ… ËøÄ³SÌïàIØ)æL×p‰¡sæà_:A_H+[„tÒ itàNŸG°!]!}Ò¦.Bº鬄´‡5 C{°Ÿ@æ\^!íÃϳ ikŠ.Bº鹘Kdå3 i7UÁ'rV›ÒF¨éa0â˜&•PÃó¨w)A¯ä°T(ã$æ.Ì]Åäë” 1âÁfÉOmÏ>"·ÅÅš‚ij‚¢ÙãhöDä×´[殺º„WÀ­¦©Î‹©Õ픢:ÔV4ÖŒ Óš¶:­Ôe}Ðê\‚âšAwÞ‘ |GÃ'®€umâ̂͜‰Ï’Ä”lÄí ç ªƒÑõŽs&ö€ëãì%õ<‹3 1¬Öµ1Úƒê_šñÏãÁ:Þ>¤Q…#̃d 7‘ܸÃÀmôZ‚ (ž(g±˜x=v<ú àÝ€µ²J÷Àyk#ðæ=LèJÌGEt³¢ßH¼6ˆ%$ lFyä–22ó씃_µ"ðeƒóÍ÷øÊWt|àh_yη}õ®=Í8X[Qß®=K±€áì^]±÷Ø*3¹½'ó[£§©d½þ-kÕÛ+Þãd–Âý•XPÃ'ËL‰˜BòJP(ç£x’ ‚ßÁœåÍ*š#ºZùÉÑ•wà+•Xå]b®ˆ¡Š¡Fl:½ QL,mšá|¢Ï"E胳}+±ÇƒBðx./avlV@rébïm~8‹‚Å.Ý©@MÐhôãÈ^o’véÛCw¼y ©x¢Ä‹bÇ‹HÃ0À«ñ¢˜‘V[; ŽØ ÄŽÆ4ˆ¿š(ïÃù^†•­Í\b!ÅÄðÖßÎVö˜O„ ‡,E|yRò³s<*0€xS;ÊÄ#ñ  L:D1.( Ne¤¤ ä}^³Õ5®Ú*G×’òè05b“ƒ¢& àMÈmUi@õØ $t4R\·©BÖë¬âLZÑšÒöçÁàø@aç‹E÷0‹N‹éMÇ;%6ø(ÍMüÅø xƒFggJV)9û„GyžÓ‰ÙÇDˆ°$²âc6é„L8yeàÇLBÈ/&ysXý»ÌÕ#«ô~SÊ<…N¼ |Ò§ ?8Ã9¦ïY5Žêc‰®% ›Ú]»ÇÒÆVÌ[‚ƒó,¦,úˆ¸¬•qÍŠc;Ej,.ƒ°|ôxdá‰R¼Q"2l’yƒ¡"Š«V(G\yÈŸ (¬Š)ŠX$8ƒyKI&­kfQÌ–è¥ü™$ºy8¬±mÏ °'¢obU«nG{ G;#LÈáÑc0xžc^¦²Õ燖Æ5»òbÆñTå*ÁCUY÷°Ä‘Ä5>Wñž7éN…¸:x]/]ë»Ác’Šlœ½y4>$OÚ,GZaÊH±¨š Ös9¤—ÀÒ3–VVf$à~ræ’B‰^J$ô/Æõ”›QZÉãÎÆœâÒK UQšæW°õïdQÙf(žTvHà…k§÷œ{ÅØø8Þ¥*…Pæxýâþ·Ë¿ëCÓõé—¢ÿ´Ù×f¸§qøäë®Ö!ZÙ4âò-u3Šºž£û~ÿïÓk{÷m5šCßqVÒ}«¹¥¹ãçÝ»ïâ¦3='âÞ‘¤.Œ‰º°ñôˆ¢øðh”­Žwg&ÆSª°eÜ›ØN9RS<Éž°¥¿ÅÛÈ›QNÙ)%`O ưú=QJ´Ÿ£Z‘uô ™ÃYÿÓGm3ªe•ª@…· ‘ÅñG‰Ÿ*?eé ÇÜõ“b Ì_Ò¶¸.HKnŽ7ºc\!J1*88 $‰ŠÒ'6?…Ç’^Àqk¬ŽZØf´{èÛ|ÂËR5¡$)<"mJªÄÓd’…HaJ™&k.‹Þa¾Õ€-€;ådª/‹!äN1çÊP|=õKº°û*ÜÆÓÉN¬Ù´MÑ‹ÈAÒ‡…ÌFÞ¢ñå Oò•¡³t¥s6E8ªJ<‚-U7¸WodÚܾûQ· ¹¡…‘zœ3BjÔ‰ßÁÑ<5Äù¬·â Ò<8‹ó%‘à”Ý:¶Žy›ë.€Cú„'Â3©»ëª1txY0VB^®-×x3J^"ÔåòÓrÈi§©$ã¦ó©„ÔJõw¢[>˜³A±TÂp¸Q=¶K Ó`e¥DÏ<§”öF¼y•›gXºðÕN̸úR4Å…çBÕCÛÀœ-ƒeŠí‘f¸‹«Ø#=Htµîû»6zhb²Öy—À• k5t°Eð %vn$CòRÀ9KK?T ­¸)ÐVÞ)ÐV;IúÇOÜB€Ó·ÔÍ(êzŽ¡@ÛêN!€®[wŽî·àô­æf”ævŽø…Ú^Z‘& .§Îr)R‰…x¢8„æ<ùp”T“ùÕ‘oâîyRQ1”(ˆ£¤²vz÷¬šÂÑ”¶–¼ݦHyR”Ž‘”ÚQ*%ÞL/SRDR\¿#-‰SLR]˜æIr¡dsã|Eœd‘ªßÕ ï‚bJ` "˜dó°ôï*ÚqeÚ‘”_¨ @ è䛪gÚâ̸F©³:AôíºæèØT h‹ÜZ™ÜâÝ:s«ÊTfkÁ¹n÷ ñu‘›rpµõ$91;¸°ˆ ÔètX%ùXxù’+þ,—ÝÆ¬è»Ý¿Òú ®ƒ AØ‘.!g=ÕóVoG¾ì\_E²¯IVŒ"6b­‹ù´®kíÊõáçlŒµ‹T(¶uÜði¿¶nÑ^ðëîs$P'rÄÊ6íÈi$80ï`Ó sb—¬ÎÉÖ¸œ€Õo@¬c©ÖÚ@"x%„!n¸S]÷;­èŠÂã\ŸßzùŽM¥ÀÔ‡JRhwMXt“׈-î3º”ªÌYAÒÔÐãE`SÛ{²ÔPÓó5UoàT»~À5Ðp?ž;Ñ }²1~0¶y¥éV¸jD1àÑ2¿G]t³oZ’顬!E‰Ë„½në¦ô“©²í'ã£*ÛºˆÌ¿=@L§¹®xð^‰Ê›·PÚ:òô|OÕŽ7´ËÓîž·±vŒ„ˆì®[á²{ªx0¦hVw:©ý.Æ/Å!CÐ}¤î”‰Ú˜=Khz#Yj\Ý€ÜĸÅ%©$)PÀâÁåm7—¨Óúòù‰¹Þ9‹[P ר.)–«Ï2,WyXì@µXSÌmfµÆw}YÑNÍòVQÒX§µ—ºþüHAa‘É ï­ÏÃÌ¡4÷(W—P×%ÔueeêšÐ?LÞ£^ ª’PýK3ž¬Ô˼Ě ÎlÛV@òšp€‹ä:fõ{y‚Ž”Þ˜¾7í‹[:o·tñ2…ªKc­£/)mSÜÛQ‡ èždªCmÅ-ˆÏrE˜CÕª[†| GëýÃrx4(ù5MyZ— q¶xÛ¦œÏ£YŸýËéöéO·sX]}ü «ûž<sfB˜¯1¹B˜æòÞ8)ªKqd©×É ^Ç“пƒâÂYÜ[*yJ%[p¸TòÐðS*yB©ijG“n´’'®ZŸïʹã:=Ï+ÞT®YI5X„´7Òå[ψʱJ C‰µÝ)oQÔ¹ù¸À)j5«Q°QÛ‚ %8šŠG£´ö¦ääbƒ°DÛb'×’ÉÀöHPN$älÕß_Êtª´ª8ˤœ&ºUêm|Ÿ]®zÇ{{@í k;^Rjgo ªœdãÌéá_ÞÞc³qÁÀÔ=’ „š¹Ü:†>(‡ …(!÷y2g˜G 8ëàÌ#Ì“7â¥áƒ-óÕˆ¼×40v(\äX[‡wVP‚³ÈQiW–ð¦¾/¢{ú´ï˜÷ÔÆ%Ÿ’P¾²ˆöȲ!4ñáU'9§cSL^Þ¤ú"8K½Lotñ–2w¼;y¯ÇÌ s˜°:fvÙà8*ažþ |ï „(©n¼Ôš¯5á·dãç’ô,ÕVÛd¤žør^á™LDá™·ðÌDp˜Ë´Ep‡§.CןÀµa-ˆu&ÙÒáÇ‡í¬«YTe† à‚gìBÀPJ§Öƒû¨· ¯-•ÏgÔ$Ûã=¡Ü·Z<.›õ¸°”údP—й€â§ ˆ Ï÷¥RÖÒ ‹’úHI4!D&ù*fiIŸIøªÖBBä”ÜЩ0K\ËÛ´ÖÙ¯Çò†Ç|ÀôXÞØ‚œ²ð#⨉¹Â?[VP3aIiq ´{YÛÐFÃ=£ }Âi^#Ñ;“¶{jAÂÀyð;5|‚ßkë%÷x©…£U¢ÖxýáçÎ t‚‚_–F’î³½¯H¯´g/íÙ‰_Ò.£xÈ,†Qæ<áM æhhHÊûLÔÐP½‡€|€„WîH |øŽøe Ý_¾iL@ o¢l<’ɰþòF¤kÛV-¤kd,oKÙǚؚA¿ÜDjl#êå ßW`ªžÄV÷³ÿÖÉ'¯øú4õ…ò­¹{Ší­GÄ^ê[CãÞiëŒ{gGgCCÞ¯‘¡QŸô††<ô>+<ˆ‡÷h5¥Ìï­íc¿Ó±ó :Æz±¬]À¼\7Ø“ ®;ÄõÎ6 ¾Ó³¡Úº}%[*Áÿ^]®qêó¬‚-°ÐÁp€$ kDž½DÏAÚDɃ+9ÌÓ8å ”»‡p]މB•؆Ö3vìa!8<²$‘Á%¡[ÝC]S¥Ú±·­šƒ8olŸ÷'º^N©Áý§Ýÿ¨•uf endstream endobj 2183 0 obj 4657 endobj 2187 0 obj [63 /XYZ 38.2500000 771.500000 0] endobj 2188 0 obj [63 /XYZ 31.5000000 714.500000 0] endobj 2189 0 obj [63 /XYZ 38.2500000 771.500000 0] endobj 2190 0 obj [63 /XYZ 32.2500000 713 0] endobj 2186 0 obj << /Type /Page /Parent 2 0 R /Contents 2191 0 R /Resources 2193 0 R /Annots 2194 0 R /MediaBox [0 0 595 842] >> endobj 2193 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F1409 1409 0 R /F1700 1700 0 R >> /XObject << >> >> endobj 2194 0 obj [ ] endobj 2191 0 obj << /Length 2192 0 R /Filter /FlateDecode >> stream xœí]Iܸ¾÷¯¨s€)‹‹6 `·Ûr`Ø@A'“`Ä™Cþ~T%©Ü–ôQâWÔR´‘Øc¶¸<¾oyóÇO?ýó·Ó›çOÿ9}éþ|þô”Ëõ§T×ß¿}ùõéM{~¯E”ÖÆ'e=©ÚêÓÿñôS3?{v®Šîü;·vuY;/êfmU&®mó£…-³;XêË*…Λ?êì”çj´Îõ·ÈìòsU›»Ý·4H”)”{r¹{5Fëî^KyÐß&p­¦¬ÂÍ}Ù·0Dº[Ås ^ªÍ³6ÆÈCçÛìòsçU8Œ¹î[$ýµâÉÏ•5Ê”:·—;¾Üo^5§l¨é~Ýuªâ"u.«syÝ&p¥GÀ×} C¤¿i8· —• Ç•o“|eÊpsÙw ® çL½UU‡£ÞÛä.£®L8$ºì;õ¹å¨×f¦×8ó±N~/t^Í.?·ªŠ`s_÷- ’îZÇ“ô˜o¤ý`A~u|øîóÓ› ¦§Ï?5»®×þñ¹1Û.ÿÑÍÖ?ÿxú}–)ý‡Ó矟ªsUgÖÝ^;’½\Gò³Ñ•únDè•ÁuQ¦ŸîÛ:x%±×{¶¦õ|©Úo¾ýÃ3úQÝŽ(uÎmQ•¯¶äÊòé³ü:búÙï<¼ ߆õ¿§Ì aá˜þýuäåsC ÷áq£§ÕSx¬‹+Û¬ÇcÝBA5„vÝËÚùYù`›oÑ7ÚúÏ–áÔpUO¥àÈ»rÖ¦œ KUôp_2òí­Ã„‰u:Š-ÎæŠo¯Gjÿ“âóà0³x§´4\žÍ‘ â<®ó¿1C tt&EdHXØVXXS÷‡VýÑŠ_—0~ã?‚Yšƒ bÖ‰%@¿av€EfÑï³[‡<® ¤Á l(”F/Y×þÈäØõf´Šbý£èha‚jÔ‰…T”Ò…gƒü®M*?gC¡õÎÖ‰ Ý}Zï!i?ÏèXS(ƒy1ü¯£•ÿl¢¦½…ú\ƒ€1=‡ycÜ d Ä0ÌÐ2³nL‘L)ÿÂ\Ó–¨ eâu<,´ÑbQAÀKŒëÌ1§Æf„¹ã›!¸JF^Œð„ˆ¥˜ƒn#«˜À ”>a¹‰± Ó­aLÓñ Ä! ²@Áˆ1DX„dµP²ÞaË”¬*ËëÅ¢ÕA³Ë5Zrà闻ìñ¿4Êž™S‡„ÌYFe§¨LTe§dÞÁðú“`)Ìr¸°,ÏÛ€jW…f0½÷*¯æ•ÆG…g‹EË5]aìÁ÷Mè}F-WØ—£A1VÙГG‰›9%? ½h£³OgЬòä0‡W4%Õ1bÝ™Qùd5›H·M‰]‚ù¸0qà… ë^–³y°aæ±GØýü“c{RÔ[áþÛÅÆÄXÿÃ|h}gÜ& Ì2É3›ñƒÀ8¿úÍPŽFìÄÏ;˜N¡_Fr`1¯nLTégf†{ìÊÆÞòcr,¯+Cj£ø¸°þ°œ%ŠÅÍ÷µ™×k‹1á1 ýÂCQÛ§ãq_‘/‘¤ÅÆ–óOÊ%±ÜÿäØ}à‡ÜÀÏs„;ˆá-2>²å°À—¾¾þƒQÕ`듹'ª×A·2E›¡À‹ÅÁ™÷4Q×1ùÀ8¼ VN…@00`D†hbå_?BŒ0°„£‚wù`LÅkŠBGVÛtÜiÒ] Ý5 ¨«ë‘mçx¶ál‡ê‰•¯¼Ç$<—Çz’brÕÛáq„¼¬£èhp£ÔŒ[Ûè}Ò#¬B‡f†Ÿ+Wú¼ÂƽhìõZ†×UEg•­¡ŽÆ nQ&j‘y^½+†õM2,m4 „Åd¤Œ/Šˆa\òxpðáá$x(8Dòšì[Üúþ+aÓ £í (ìVd¢gE½%´;4fÊÆBd#áâ 6çÇX¾1~DÊK’ÛInoJnkí'Q_ã$Å{ã¹h F*æ¦;ÆDeü4µüÑŠÙ’lÔóà“#X…HÛIÃNµ²«¸!MqcívÛÜž¨8£ª0oÑ7ŽÙj4›é"¥«ór®ÓWÆtejø7±ƒ>VÛŽvÐWÆ™Xç}ãØþBïMkb:ø¤-–çºÞ†^§­Ÿu¨"Ëûm¾G\©C½º?ó’‘㿾Ȧi㽺–p~ hɤ”4yŸbèa00&Ö3(eSnhÙlι*‡ëgéß—„ª²±rkúæóÎ7ÿJÀIÐùTÀˆ”gÏxKe8ê;°o)Ãpy,«}‘Ble3˜ÕÖ®*n PÝÖës«•Ü©‘8RùtÈ>1Ò™'S³½ƒ#ïáˆñ?igÒLŒh¸kÇyÞE¼á²œ?÷3Xað c¬Ðþðíˆ-¬êböî#¥?–j8b0D,Å»vÜ=Æ|Ãx6x÷ÎæØ5æV±v-f^Ïãe©òÙÓÉb†¯CND¤ÔÒØ;(uŸòÄÀuŽÆyð7Kü „Ãyv kHµÑ`MÐiÆ|³¾<#ô, JG¼Ö(yMÚï±·Ÿr*7³ûy9åÐð=–¤ÃÎ8¬ñyr¸7| ‰G;qKþõÏó0òƒºŸõÏsDÙVêÙý$~ë<¶è°]€±ð»9ö×ÁvA’üÛÆDYÉÓ‹]Öjv?²#ëËtaË|ŸzMD/k¥Â`Ò–õ¬ àØê0ˆŠcºŽcØËŠu +ìÉt¬C¼øjŒ/X—QŽÁ½EÅ [ÝqÃ1uþª(ïÙéÁ4­£iöyòémßbiö›¾ÓˆVGUÝò0ÒzŸtƼÓÅÒI1'Þ©·K/´ð-¬~Ç+ADm·¾…So]Û­õãE=޶«q4FÒv7€oIÛ«íÖöžX•¤ín›Î¶¬íbNœ´ÝÝÞÂêçÙˆ¶[Ü%SÛ­îycÝ'W| mRjÒv·€oIÛªíšËºIÛ=*mZÛ…œxŸÚ®ƒ×^ëëÂ÷³úyL¼z&S±ã[ÒÈFÖçBG£Z‡¦(«õmX²8¢ÀV¿ŸMxLfv9f²½ Ä[Z²^ï ¦2E&—o8¬C&‚›P—v±G&ˆZ:EÈí5ª¬ß‚Cøˆr¼YÓeÄyå"&çü 6P\…l€ö÷`—äØ&,ð0-w(`@â…=¦~h ,·‚ËbÛ!‘îIT}ètï6Á+JlÔÑìOF]%L&æIÄÕK9ðD- 9zêÆªáDÄðÊ®#Ë¢·Å"±*&’q¢…9>ˆ¸á˜îð’3×z(’–; l…ñ‰‰Z!‡ËÂY.!¬…›%¨›JE‰ä<—5¥˜r ie•÷ÇEtaŽ+™áøZ™°¾f'ØBtÍÈ¥×ò8EþKÙXQ&Ô9Š…z諱$(~4ǺÖdÃÒDE6¼å ‘²¹I»ÖL¦fÉòy„5BeSe%eÄbÙÇ鹲Ĕ>¸Áhx¢É¨²1ƒŸF|¢:vi¦Êá¼ãáÞ”õí ¬³ÄTøqT,Âïö°ÎL·NHñÒ%–¼’/LYŒpÌ3îÈSG(2ÜlÓ‘|x×ÃòL¾¬ÊKYIÛ 6f@ŒþŽzKE¼dßr¡ë°™´ ÑÂ>ÛÍZhÒaU؈ÍOLÞ—êÝzãUzRá]!“¸˜§c„ØS0sŸÃ3fä`¡³¸-J´Â‘VÝ–dR„%Ø©#®‘±O½+¬è’¿Õ“5ÝÐ’½í½sõ¢]gx¬ÎÊ{JûlòrÀÓv „dñÚàÁÄÌ`w%%†¸9[!$€:'ß+‰#¿aQúxÙ±YÊ$z3o‹o@‡¯·­nÆZ–k4÷ÁÃ<Ú¯O-»òg&}z»]Y1”µoý%•ôM†!KBl:LlÃÏíÌõ3âÊ?È ˆ63 ,éå)õ¼ƒ‰Ã·d;qÈæú®~É*xê|ïÿ3G•ƒ²EýîÈûõ²—'Å1’£TÂðâ¼°Cô² ¼²/†‘JX®t¼Ú3ªƒ#xØ‘8ÓË |=aE\ÌGY[Ýúb/¥ì³ñŒºÏgGÆ#¼_±×8Õß)|Чž¬#öÏ3=»GDÜÅ“q¬!Ït‰t¬ +‚@4¾hu¾\;÷.i>5¿y  ‰ ó¾˜ýÖs;—;¦Ç¼îa«>Qqk ¿~7ÕõžlRryJ.'a àÏ@”H(ôy«ŽT¬I¸æ6Û=Êš/h—íß-PL‚ãî/VH2#¡ˆù‹Dj(ãeе ‹Ë‡qŸ3¼Ïq¦$“ÄlÊæâË1]£EÑ8Å03Â8LÈÇÌ>Ý©ØרÝA@Ô›3b/¥ °¯*"cv%ìsaŸ…# öјØWfydìëÒàØÇðX씥¦4rS:ü¾Áx€Ý©8k»Õ3ŽÂ<[ìóyÐAsD¶­Ã±O0}ø);7Þ1þÀäÄ26v¦Y•‰·v¼rå*£† 9¦ž²ÚU» ÷\gg©ç²Ýq¨²š¸ÂΑ!ä‰c¶HMѬÎ{‡n粜ðÑ«äÄÑÎ7ÝþM¤S5QÕq@<‘a«Û:8·G·/xq2ù!­£H"Ê¡125P Eõ0œXä†*mÙÔER…25±(•Èò£Êš¢å´)˜ì:Dn¢Ãb&|…ÁŠ'Á/C×?_~.Ÿ‘lΟOÅ&"ÿ1–ĘQŒÎü:ñ­ù}úÚ°h'ÿ8÷ X|5ÅáMsÖL]NúÖ9RAfÒ²Àr ­WYŸõµ6ÄØ%PŒGºNÑúÜ=f¼B'oè=ZÇÌ™¦S{ûÐeeNÍÖ •!¡bt*Æìˆw;À;q …gƒßt­¼Žþ*2‰E¸Ëß›÷û_´Â\ΆQ « 6ž b—\Ú ÂäNžx_§š{GðûÓÞV©è0ˆ‹Ñ®ó:(œEÜ2«ÎªvwL¬còs þôñéÿwuDœ endstream endobj 2192 0 obj 5278 endobj 2196 0 obj [64 /XYZ 32.2500000 563 0] endobj 2197 0 obj [64 /XYZ 31.5000000 564.500000 0] endobj 2198 0 obj << /Type /Annot /Subtype /Link /Rect [43.5000000 85.2500000 536.250000 99.5000000 ] /Border [0 0 0] /Dest /#10#ab#8eZ#aa#12#d5m#ed#ae#c21#82#d4#29v#9eK#ec#18 >> endobj 2199 0 obj << /Type /Annot /Subtype /Link /Rect [326.250000 72.5000000 435 79.2500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_adding_member_functions >> endobj 2195 0 obj << /Type /Page /Parent 2 0 R /Contents 2200 0 R /Resources 2202 0 R /Annots 2203 0 R /MediaBox [0 0 595 842] >> endobj 2202 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1409 1409 0 R /F1700 1700 0 R /F8 8 0 R >> /XObject << >> >> endobj 2203 0 obj [ 2198 0 R 2199 0 R ] endobj 2200 0 obj << /Length 2201 0 R /Filter /FlateDecode >> stream xœí]]¯ã¸‘}¿¿ÂÏâ?E‹¦?f}ÐèòìÃb²Ù H‚íÍCþ~d[vÛ”%)É×ݘ¹·-‹ÅbU±ªxê§ÿøúß»ÿýÇî§_ÿo÷ëðóã×·fߺæôgwøûÛëtØ¿ïÚàv¿þííûîûÛ—·/ýÿ¿¿^øúñwýoÿÜéÝöÿýe÷‡ÿê?üãð¥ÃþöÖª¶ÿù×ãÏ®UýoÍåçáó?¿ýþ7»¿ZX£L«=¬ña}]ºÿ½5߇(fݰº‘_ë­Xkï‹­õiÜÒ$Ö:ѸÜvm{ÞÃZÔŽ‰Z—§½o@¡u=Ž[š$çu5þ%£<Ó'‡³‡Ÿ=üQ-è®=4ÛŸ|Îÿûš÷‡m¯a¦gÿ ï.¬á“_ß¼Ý+Õõuù–¹iÅ\÷Ñø·?¼¶»}[w.êãðIÿÎÍHŽß 7­„Û>þüöá7éS×÷É>|{ûé—ž‹üîÛŸú%9Rúôã[¯Hÿ8ÌÓì¾ýq÷oý0þ÷Ý·¿¼Ù½5§“èá{§'íñIO†®ñÚ]?ùßùt|¢ÔÞYú‡—'æÃñI·7ÃK3žXûÁ#pÇ'æ<€«'V´µp¢ÎŒFt@O”†$Æ>>q{£ƒºyGôŽQ³Û˜ø«QZUæ<”Opk»á%ÅýÀÖ”…ïÀuÂk›XA±<Ä&Ñ͈Ÿ¿õ ¾ŒŠruA†˜ øFÐdpZ- ‡'8ûz ©³ËÌÏ,ÂK¢R|7²%¨=ïõ)Œ¶ ÇÖ»¨yQ~ÀÓP?ÇÓÀ_ÅÆ¤6èð›9!æÛ‰x°‰æG‚p¾dLؘp—*¬X±*œÚ=Ual¤  †™eDTBuPæl@ÂX岬žàXš`rÔ\âÖMN\C28ñ[@VJ0™­I’ÎN®Qâ æ¹ù$Áœ¥ðNi_{(1j86<‚ÄÊa§‰±Á~^98Ÿg[SÇfà*$ö)Ü%˜:²‚SÇàÕî* B«Î ƒI_u@F?)o¿äÕó­éK^IЇ‰˜µ íyƒë§ÙûVÝD™3K¹}Ó™ÛcŽsŸH¨ôùQÌü÷Þ™+’uüåDr 7XâθT3„Ç&áM®1Ÿ]B™ÒÕn9v5G†‚ÛÔ(ïSÑP»ŒÇY6øW6B,I¸ýð–câ3 #„Ü™ŒŽk‡xˆæ*%ö¦a†„†|ký0Fbc-¡“ô©ù;yh‰Ž1G‹öS-¤?\ÃýÜýؘ`äf-¯»l„h‹ •5…‚íb¡÷œçà’Q`ãgV D(›ÄÎ*ûnM<ëJ`ñÔk‘ec° —a7ca›ž!,Á‚ ã"#‹Ž9Ö2&£o°éK$Q ÂäD­?Eu¹m<ç|*-6g™Ó3.xÞt£¯çè|<÷öNUÄr`ZÃÑãÝȤöU;R`%¾!‘XC%gaƒ‡põ$\²¢™æË'9Nbb4Ç6“ù™„Û„\Àú›°GÆÑ"‰+ƒeðÐϦcˆ9:! 2®U’ËÌ4˜œRaÝ$ëä\*é“Ê‘¦1j™1’ž$qøu£DêFIÍ|dמó‘ N/…¾8&0šðÂìŽDžÎIÁ!8›?4H¤Ø®9ǯé&³b^y`¯<°ãLßeØCx.}Ë7x.^û;x.^‡kåðIŒçrü–¹iÅ\÷qÆsñÚÞÁsñý "îÃŒð\Žß 7­„Û>Êã¹x£n·É=ã§€Æ]Â@|<™»@$óJ¹Ûd¢ só{W2²'eÁ`˜[ÂVÇ»r͇F.Ì!0>ñátṈ̃ÄùÈz úDª'Öø^j¨pœRq‡ŸíBL›w¬Ë.°Ó]< |ø5éðq@gÚûìò²^–Àã–@NŸ‰0–¸šPj€N !¹ 5†Ž‹ª…©Ä¿+éHØPŒ%;rC¿c±ÌØÔƒ3äÞ 5BÎPâĠ!qø(–M“‰§Å¤d­L4F°ý0ù€ %{B$$þªð5|ë¥fẊ3† ã¸fB\²Nõ»´§aîÍÔ¡'‡6 EP²pßôÄïÀ žÅø?ø ^Sø~p ÒÀa®ÂgZ¼Kdƒl8˜‡ÃHDàg›AÃBX¸K0Ýp?8`–ØsŒäB[sêJÅpU¢5"ØjêÈgu˜Ö>À«€G€w=[HW¸…•[coÂÊ­qwÂÊ­i£ïá“8¬|ü–¹iÅ\÷q+·ÆÜ +·FúУ°òñ[ᦕpÛGù°rk/Û‰„ÏE/Çâ ë…ÁQ´ŽxëÙŒ›I¦(Kˆ¨+\D'#h³PE3Qƒ]÷#‚í–Œ~Sµ2eé'[}`òÞDÑ8sK.¬$%Œ#.‘iÂÐð%æ¢q­ ŒÏVÀc~šJŽçT6OO´ò¢®t‚¹°Ïgy@2 ÖH™Ïóqtd4žhˆ¤ý)ãlcõ¼º«ÍD4‘áùºñþYH¢Óx¶èr:Š{‘Å9d.¶R\LÜóNˆ:ü@B åÔ[L/’ÆW1¦õ„8“=ãWF¾“’7«<¬ªàãeÅ2§?ˆÂÇ0j‘IçH¬ü‰%…Ó—P†O 7qÔ®† ‹@9cð¨ç««83æ*š;&ìm¬ùPÿOp¸óz¤fÖ|Z)ëq>_è&üfŸ‰M&à ”dÙ¸`;à½^qŽÊáÄ<œNÓp¼@ãD6"f™HOiò[ÃcÃ)T“µ óWpr"s Mvlxµ‰'‰±á*<6æN绡›)žªTk#!´dÅ¥B,‡DÝ;Þô±BôLEÝ·Ú®6RºuéE8åDT&”ÛÔ޼ϩ™VðF…GÎ4 ßåVJÅ“`xGT¼ÞѪèNÅטƒÅè$ÎDJ1R÷Zò%3ך.Z<*´»üÍ>&õ'0E»n‰Áˆ^„œ\äˆ+6&¯î£ÿ$==~+Ü´nû(zœ=K¸Z §€ Ä!›º»šq?¹pæKFTNW²Z…ÓZÈiÏ~6^Ì5E•@c˜Í?ÿÎB-ÔŠÒ‡=Ùݹ± ù½¢Š´%áðî®…ÝödxXJìòjØi{?è¸ð]£Ï ê/ââDÞ˜P~?Ø5WÃü½3hè{­u°µáv,°<|G£~T—ÿm(âpçƒGpÀí¾ q?°µÁú“blD&æcà¨?À֚ҢŞìãζgB᣾ßÙfòþéò«†ë‘ƒ’…é‘u I$RêjÄ:Er0«Õ{\©¥”¸ãg‚‹EQâ)Qx¸Z¨ë^<1Ñ:Ñ£¼Ájú¤î“0^W‰ì׌›&T!YÆ%¡}ÒE(ØÆ®LÒžquá~Dë%QÕPûÊæúãtê'IÓO˜ñD¶ Uî™ÙiØÀsŒã—Ê×#í[ÉÌ þU2Ê©ãG­~ž óöInQD!–2'dPë+3ebfØLÌbËPëHSÆÌ·ÐÌŸŒŒUpøù6Ÿ3˜Ä•Z‰ËVŒr)<Û£kÁ5ú"pÕ`ˆ¦–¨‚ Á{pek¦~5S99á*!Pè&¡ê¬£é&×qˆÊ× ·[/¯3\»Ä Áy'j©3uª!ÇY8ÓÕðb<.„±fZ‡“Úiç§ôîôx”rðb< ×?ÇÜyQaÌÅ9nø¹Î:šK„ÇÃ’Ã`à<¼ö¾ ÊÛŠqfš¯ð,G eéËÈl1p§&ZÀi ¾cÄgpE«áŠË!÷½Á\Q“òz€òνÖD~M´šÁóË)ÀëˆmaÆæ†b‚xDÙ%®Ã;ƒY9bÏPbˆ³ c>À‰uö™îØgH“X­]¬mx€òÌF¾$ÎQĹCã5Á­á5>Éa‰@ôƒŸ0Zt%ÜçÛÊÜGéqf…Øtâĸæ}&[ËŸÛ1t¼#°¸5hIã‚eUmÒàW³3¨=)ŸðZ¾ã÷a?[%^f<ØwcMáúQ̨×ÜO‚ÖñÆ„GÍTbÂ2öÖÁݨ¡þö¯m“/>Hù2Wá×1›¤üòO6á…HDâq?„¯Áa­·¸=¨ñ;«°íŒ¶•y¬f,ÕØG"NUGêõm¯Eù"ñ䬺„Ä—º‘‘†Î\»«–+X¡«pÑN߀kª( ¸‰è±Ñ ºµp ˆ =né«§ ¨Å¥Ö,¼ðòŒdp‰Lå’ê¬íb™&O…7qùL8É›¸ƒHqZÆÞEæ’-”&\¼e-Ó„F½X½”åËGç6Õì}«nQÉF·\d1 ð¥Jûz~E*<,F¾nÓzJÜeÀ–°³ ÒpׯçAÙ²e ªÈìZÓD¯ÃS@–‹«—ÅŠS­¹hѦ´ñ †§°ëÅœ°ë®} uCÖ\Š^êOèK|UR8q8®è¶Ý…Sq˜kêI•‘º¦{|¤y®x",¤qðçu Wè°®ÀIÆ8a@–“´XQ†”¿ ¦¬šòDò Cy[Sz¿Ê3i Ï‹UûžAùà*S~ù4„€­™Š<}sN&`Ò5NÉ Ò+¨´Fœ¦\i¸5f“I…u¸B›ÇwjùŠïJz`Ü•*_X?½Hºù鉎—öȺÌd«‰dÃ0+f‚ŒÃ ¿ƒûa0·‰¡=òvdTíy ›ªàw(lu&ça¾¯˜ÂyÅÕnÊ'Ÿ Ý•¬ˆ¢ÚH¿­:à–!%ŠþT¥^ÖÅì­‹˜ ršA÷‰æ–gjÍÏ‹’Å#}ñX¶‚f‘({ù‚#UàËÂ7D âSr’ÉlËÆ'Ì•q*“+’_‰ç W[^áIu5ÂcHÅkÆ£eôNb+HÃ Ž¡Ø¬f²L%²Ž©dÙ©cMyW\û#¢ì¶¯œå_TûF”[Ì%Q)ÏçåàX“ƒƒÒ’D-%¶DsÅ(‘º|æšw‹HU.ÑsCBú‹ö“S,DÔýW°`ោÊu*Ò_OäŸ2]lÕû4çäE"ag>9`Æc466FûçéecÙ*VÂ'×¥®÷ËT9dX•¸He9’LýC¢*<;®tÚ]Ò—ªšÖÆ:C6Ç¡R¡hÌÌ­°„ŠxÕ}ZJâ’DÎÕy‚ï˜Z›ÔmD&Å…9©â™§Nw'Á¦Vb^k÷iÕÂPaø /Ð'¨(Wkž—ԩ݈¶dø¯:ÅX°Lp)ƒŸ˜R´[ŠK¾£ Úå½´"‡Æ-¡ìP´`’‡+¥À?KÊc6#–ôk¶!R¨µìä×V*|qgÀMû±²(xSÓƒõ1§?‡¤Yg‹É¦Ž¾ß;"ü©ÿAô³ZX0‹ Xx=T†ÄI­°Ëü„AÙëcÕ®u-+‹Kbç–ñ§‹äùVZ&+†G0å¢t3\”ŒvÌHð}ùS ùSdnð2YH f3,sb k‘ú¬?]íûLVp5`ÌZFÕs\:¹j–XŒTsÙŽÓ„IÃØÔµ¥Õ½žÝôz’t;ûYJ™Mãä C¨Š .ÃÅ &°aÓD‘W"—w…„ÃcÄñ ã5Á(cpµ%Øðš`_/3<ŒF ‡á²mLéºDÁb8<êD‘WÙ2³Äú¬½`w¨^.#­M>©C‘‡J˜×,j*½üÞ`d$–¸XÕDéí.…Hkœ1žKÊmZ=–Xo/4€-%F2²ô]Y~Ý¥¨èJvÐÒ¡ëÒ¿ë½U•KƒzOæÌçu>yOø}æýÖ=ŸT¾}oØê¸ê•ll¿$žlro2{ÆàýŒ©ƒW>I´W{på I¡ÄðÊáõaZÃ|€u(œÏkÏm|ÏÕÑFê¯ôûÑFËû|d+¯$ø’øk~òÒF[ÕFïnÏÕ‘øæ‰(â6ñMëÅ{MgªzeÎn¡WÎ\S/gî;¿BÐJ*_Œ¹`X8¿{Í÷1àªS•¶«`ä AÐÔºõ`SIus°ºÒ7ö´DÊ»e—»•Ä$nªi$Ó‡ãô(1kŸ8¥ŠÉÕÆ4Ÿ,x”7êxwn!&ƸÍ‹ÀÛc]µI¢P÷~ç§;Ë–ÁcÌÞ¥‰RÓÞ¸H‡$xƒ1d›±jª”r_iS/+øbƒl@Y®Ìì(½®Å“ºO§OfÉ5•` ¶Á;«š½oÕÍciOÁE¾Ÿè Æt8Nç8½?4p˜ ³×Ÿüõík!Rž½ZšG›öUL¿'ÀqþêLúÆ^p <Ö¾eÔöa·‹’›ÁÔËÃè28T–=fCÆè¹¢ÇÀ[È´Ãu’-Ù$Œ½^‰#*wþÆJèSâr1ãèÆÃɾ7[Ò1æL,_ÁÕ(Ü4Z…ˆ\¸\ÈÙ^]éVÇsXÿ„’Ð^§R?Wô jY‰b¸ˆØM"(ó«ŽK…«¬Y¥f„º+9Ÿ2`GnŽ >g\@²f`}Ì_ëb'Svª,Î]áªÕբÌvÎÑ“Ÿ’0eç«D#pÎŒ³QŸFÏG—¥!}–¯pY«@J %¶ˆ¸íll9wå0 cC¾Ê0?M¯Å ½ôM<¯iWýaËw¼¿øêÃÍ'Ë8ëC,ˆžÕ[/ë.¸Y•ÇÔ¬g‚ xóáwˆj~Ýv!í¶ÓZÝŽîž0<ßQ9ô†u¸“ y¹‰2zgò +½Ý[ûÁïxø¿Ç6Üà¹Ç ÝĺGQHk<‚ávѽÄ5+ÅFPðñÑ©Í-á>LëvzïÛ3¬C˜½ÜïÏ3,S`é˜@>žÄ^.éS]ÌF‹gýÕ²«Êþ‹IA§Ìl)ˆ/Á&à†ð…ËÃ+Ä'¦¥éÆÛä%mçÌ‹I9©‹ƒ§Ü¾éÌm?¸†Øi‚JŸý˜úG(Πƒ—y‡š)CÑ  ù²*èø`ó’U5dU§ýlYµÂÒ ”Ëv}7<…ý£[ºÑHÙÍÏêÌ]qwY¹Ä|d ¢Y eW†ä˜ªXV4CLÇG‚MUŒ½.©×ÿÝ}ïI‘¤Ô—©/Ì e¸GIÓ¬QØî„8võÈÒÞÙ¤'‰¬ÏžØ‘½àÇO¸½üqWäWpû~Bý˜)~¼7¶_†™Ž¡ÐI;HUï,küx‚Ob_ –w¦¡pkðAÞª¬©_9øX†;üÞø¼Ð.¡Ö.ø@„YàbsDưF·‰ðH`«ƒ¹cç,+ÃX£1.Ämöê´Qæ1Éæäè” Ý}yûËÚh endstream endobj 2201 0 obj 6389 endobj 2205 0 obj [65 /XYZ 31.5000000 770.750000 0] endobj 2206 0 obj [65 /XYZ 38.2500000 578.750000 0] endobj 2207 0 obj [65 /XYZ 32.2500000 770 0] endobj 2208 0 obj [65 /XYZ 38.2500000 578.750000 0] endobj 2204 0 obj << /Type /Page /Parent 2 0 R /Contents 2209 0 R /Resources 2211 0 R /Annots 2212 0 R /MediaBox [0 0 595 842] >> endobj 2211 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F1409 1409 0 R /F1700 1700 0 R >> /XObject << >> >> endobj 2212 0 obj [ ] endobj 2209 0 obj << /Length 2210 0 R /Filter /FlateDecode >> stream xœí]Kä¶¾÷¯ès÷Љ`˜}È!ÀbÈÁÈ!XÇ Œ¬‘ùûéiIÝ3T”ø©H©»åE2ë¡E‹Åªb=ßüéóß÷ÿü}ÿæÝçÿì¿v?ß}ÞWí?ûç??¼ü…®Ýß÷®.÷_¿í¾ï¿ï>í>ÿÿû®ýàó»¿ÿö¿½Þÿùø¿_÷?ýíøËŸ»ÿèù?ø¶sÊþûô³qêø·âüóù÷ÿÚýõûßžgì—ë€yýï?TF©#+ßõ»T§?¿ým÷¦ÝÔ"JWÚXc÷ª±zÿßì~9ÎßÏ^êªûþ[»~^Ûú¸¶ª÷Wn¬R®²®˜±A§O«”Ï‹5Ǯ˜þˆL®äç¶Æ$›û·0F”©TpnÁC- Ûâ¦)å‘sž<âË&ÁœàÆH¨pnÁC­J•'O€x§«dsŸàNtSáÜ‚‡ÚÝâ¦4C6?;çÙå1ïl•Žÿžà–FI¬xr¹sueYvçêäQž<Á±V*#háÆHwªxnÁC­êŽäu-/W/³'À|S¹tó ·4JúcÅ“Ëk]˜&™ºt™\õµJ§·p§Q—sŠ˜ÃÑþ< ¿>|ûe÷æã¢jÿå—#\§õÚ_¾íìó¿_‚¶ÜùyÿcQ(ýÇý—_wõ¡nŠJ—'ðÚ‘âÝiĬiÑç¥N#ÊÌñÔŽ]¾©àlN#eÿÉ‹‚¢n¿¹€TÀIÊÓˆ9”¶ªÝ« 7A2pUÃu[b? ЇHŒ¼°zëO©ƒ˜…³‘€@7ñ OI',è  Ø?l¼ãÀE였Q½?|ørd–ó]½×ö£;*~'Fט~¯Õ™VZÄø`V‡ª W58PžœÝøí6²qÕ)\ÕãÂ6®úH\‡€ÑXóÅ”ð´siØ›NpFæ`Y°¼4ºM®ª ‚‹ò˜h¼æHx„H”ìß9'%sF\'•9“žl ò s-}ÁÐ<ÚË$5'vâ \ Dþ3åÎ l’ŒÇIÖÊËP(¸E%58¶Ï302pØ2ùœÁ<ŸÆÅR¥ †¬‹9/¦RA³;¸ ¹´Ú“€L"GŒ‹U”­È!‰ØF¶$1 <»+ÛøD€ß[Ohë‹£^Ü7oS_ wüõk|¬ÚåÉĨ%›^ YO‡™:b±ÂŠJót„2¸Èéç®.ÁPëçaq¯û\iöøfl?…§ø[V3&ú»¢¯‹·¼}z+Âq«E8öOÆv~“çs›¼F˜ l+(ÑàÊú5 ãâ¦o@Õ‰)OËk±iå’2þimì ;;Hxµ³þm\O1E‰’‰2I ™Jh ] ™jl¯±L ©´üÎ:}ü.‰zšÒZìjïŒa,—5`£e*]ˆ–3fÌCoPLü`.ŒO0¹Þ«6õep¥š,”wAÀƒ½ƒ ˆééÖÛéË:Êe*üµLHOõ¹ú]*b˜l¯`W Õ\Õ‚[¯Œkšþ„»®ÅÁïÕÐm <èA‡'ôMß•Bf¶N´_ûÆžy—JÚiqWFú>1ëØ¶ª?Å í:ÕÁ(íÝ@¼Î4[ßKcu§z]ÃFëP°a\€°øM{ÓÝÁ ˆCð.~?ƒ©êcj.ÔÙ}êKºàVš3uá*K_´c–pÙFÑ2}²UrÕ7¡ö#Ûô@¢_ ïV®Ø8ÑèÓ5w-ZÁ{• À@\à˜m ¥kOŽÂq˜¦€Óh„‹2P²•³xØô/øAy<²±„`´ –"¡µIj!Åmnƒ‰%ìGVœÞ>L¦Tªl¦‚¬ˆ¥Öð9­õ’4œM(µëK-|"xoV{›î« ”QOF˜Ù2¥¡QQ eW\²,&¢‚‰a$æ¸éÉGK>qR ³æJ€y›h¡ü€Æa¼'ÄÇò]7AVGÈ`ºtÕ8]åJŽšÞûFÄñ²¶œ(e­w&›Ž“%7³Ü…´¹™cÃÇ×Èb®²\Q)Œglz²ÓЙ2‚ÊV4•…T¬‰ey‘%Û]Æ/GD­WÂV%ÛÞžÒã34kÿS65&¾–ø¤°+ÑÒ˜ñmG´ò]¡lùœÏÍ 'å†ËUYb³úo/úôÈ Q1EŸq‘ŠŒz"›ža! òÍ3‡!¯S£}t#Œé ^¼°ȶÕY‹M'iH]ã›T²c6J*¬Œê"«òE(ÆL9÷åãÓ¶ Ïóø0E½=pÂñúaÁ1y ŒÖ; ¡ˆº‡ÑæWÅG(l²ŠxÎ"çMU¾Æo\%Ë÷p„iOˆÃ'ذ_( Å0°aÝ kX¸Ížl˼5ïÏ&Ú¦2PèZ¬ýÇ„{vi&€oáÉ ”½M…X¼Q\¹â\Ÿi¸ˆoSR;6Eà“±é€+´žßlÍ#þ +à YO˪8­q#õ]žp5®5Ɇbbü4†œÀ53h>—fhÁ}“·Ži–œQ‡rESÏ  j$“ôh&¢’3À#‰v匦e1FEiÙb9#gWÊ妨kM²Th;Ÿó„M•ù„ïMÓ’¥ a‰˜“’ÊrU1·ÖHiY®Wo[»¤š9–Y (Àˆ0†Û0ZÖ –×sr­æØ€ ä²Y÷`æXF–o¸ ü²dÚÊbÙ ¡Æ<’ÑúmW°ÿú;ÖÎ¥kçÖ 1]íñÙßæë"ý0ZöêïL5Çâ·¼6$« `ýeÍ7°Ä:?a§~ÊJ œZNÛê™ó-iŠ9²¬ê9–žlâí€ p5|knöÝmìÛ E/Xg!ÞÐØ{X‡Ð´Ö,ròlSͱeåjuîXªcöŠ}°x¶µs5[̱=W[±Ö¿?§Õ³,qùµÞªI1Nr¶éÕ Ýu—ÖꊩiÂD®’ˆZ#8ŸÊØa2[$ÊálikHÚŽ(_‘»ÆTЙqƸ³M çÍòº#ÒÜDÉN„É2»D¿ÈtEcxuú^‡uí ¦@‰ñéE$9ãW8 –ãrÓDZèá„°ªÛF!± ýqòÂTR&^‹oÑu²•ŠY¼H^¶ŽL"½—êéÆôL£× $°to¹²I:P&/®<)kÅr+ð¢Ê_4µvŽ›0aÕ s„Añ-Ñ ø›\êr4 eW ý¥ê‡Ó‡n9U<å%ÓÚ7ìPÜ›é"QÒ`Í2µïDŒ4L/B|»™º]LSM|ؼ›Þ@Yªrw_eo+ó¸‹a®ÆÌËY$Rf¼ÍË×`»³JÈ«Q+O3I(6Ë¢ñåæMª+2† Ñö<[Ÿ CËT•u“«Tö6ÉOr3/™ú«y 0¡˜l\å‹Éí#ÌAùÁ.êaX³¦¸OÞQ2s˜m0A•„·{ÅÞj)pIô6HÓÇÒg«q7èóp¸¼`J¬ÚÇ÷q²«-=šéu8êËHËLçÈ~AÓ¢·2 —IxÇ«}>™¯~¸+ÏÙ©wê.^0ç(›¼c2¿îS/™ RÙ>/ÛóáuÛ\Qh/4üÚb eXJ/lXzh7örA°‹éÅ­$¿òè6}þ¦ñSTðˆ f ÒaÚnÉzÖ Æ(ޝBý:PMãÉB*éBÔ[)»E1NÑÞÃÌ…S¢Np 8l¦‡œ-WSN*"+nG—ºqó³p£1 £nš”þÌ.mò…Ôê2v¯äòŽ[ø61ýS×)HUžë¡ãƒ”+pGDýh Dòbà™FháÂ?3ÑÃvWÍ`,«úÚE2 ~“dKq¯¥ìøÜ) g‚LÓ·ÿîåò…XrñùÅcQÛ² ƒ×’u¼F8ÜCûœ=}V´5irS–ü¼ù†KyüK]ú§ÄûþR/K{š’®é‹¸îÖ\ÅL¤ÅÓ")9²Ââr"“Èž ÁëdMT*µ„ "ÂVxT1†¿é¦ávÜöåK-[¢ÃÈPäT_f=PD”‘ ƒ¶à -8èÓNlÅ#l·Gëà†·‹ßÓ à&"L“¯À7’×Dý@+:Ñæ~T[ ¢ñ s·™ÖYo0Þr¼”zjÎu¥1U0Á²¿DYõÇ‘ë(÷ïÊsÀ<ÖQ\)І]bæ  ¸rsÚbäj=¡1¼Ã–¥®™Ó®bùv Õ§VsZBdk—uomsž°9Ãå ÖW ã7 çd”µÓÄrùöç·yë°…"ëm¨æ´i,áëzyªX ~ëY"1F¶fßkà™„ç¤Ø¦Ø†NM¶ahÖÖsÚ‚f;á­áb^ª°½e-暦WI³U­EH`câ£ïõį́Jû‡¿gè¹CÂ;§«ÚÃû½¤-,^xtF7—;(˜h ëÖVº!y醭HìV$–ÄÁª‹F.Î̇‘mÄE$_0#"¨ýI“TwÈvšP\ÖÍ@“HÚ#Óý€ÉÈ$’R4(ZQ#&W˜ 0á6ÑÌ#™Ä0ÙV¡²ú”HHüš,j&‹r€M§;áleÙêH+æwÔHžzÔZûêB5£ÈÄý§Î}e/IõÊ­`FÖX‰:üêLŠDÓl¶~‹¿ï-ñyùwœp£u¢bY‚ˆGàšóEíž²ý\& ˜Le&}?C…ÂʵÛ3@Èf¡LXEdòg’¤Œ¹—uáúëÍ_Xlùšò°-ž‰“1¤.š>¾ÀÙc#Y UjNqd¥Èd÷Ù—CÙ¹â̲atñÌjá\h(ÏìûÔ:kgRU®˜ÄÕ˜˜Ui÷©¢¤,‡W6¶xœù!¢c™lEsø^Àvð£ D㪊+žmì±+ÁdÜqZÐK«Üßð›f„<0“Їò:_HºæÓ¹*Èoõ"o;Îò±þ¢&w¦ñîÝWÈ´† ô(ÝŠŽç.:ž<€ÂAú`7çKo¦QT ÚÄw;¿´Hÿì¿aníÓØ0aïõõV°æP¨çì^ŸkÛ(øi/‘»rH-{Ò}êÕñr¤}YTÑ.¨@ºô „A•Q½G똱wÃ5Ø>v;Eî쵊‘÷P5Ü`Çs°Kó¶+ÛPx6øMwGUÔÖ_TY‚{þûâþ ËøƒV˜#yÌ®‘ëøNûûIg„ÏUAÁ×ñ·+ø¦NSÏ?#WÔÕnlÚau#?ãeûO»ÿqÞ·› endstream endobj 2210 0 obj 5019 endobj 2214 0 obj [66 /XYZ 38.2500000 509 0] endobj 2215 0 obj [66 /XYZ 38.2500000 509 0] endobj 2216 0 obj [66 /XYZ 38.2500000 328.250000 0] endobj 2217 0 obj [66 /XYZ 38.2500000 328.250000 0] endobj 2218 0 obj [66 /XYZ 38.2500000 167 0] endobj 2219 0 obj [66 /XYZ 38.2500000 167 0] endobj 2213 0 obj << /Type /Page /Parent 2 0 R /Contents 2220 0 R /Resources 2222 0 R /Annots 2223 0 R /MediaBox [0 0 595 842] >> endobj 2222 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 2223 0 obj [ ] endobj 2220 0 obj << /Length 2221 0 R /Filter /FlateDecode >> stream xœí]]¯Ü¶}ß_±Ï²I}EÄŽ ô¡€a}(úP$M‹  êæ¡¿Ú•´{/µ‡Ï¡´ZÅHì\ZEÎgÎ̼ûãç¿ÿùÛñÝûÏÿ9þÐÿþþó!;UEÖýs<ÿúæål}êÿ|¬êâøÃ/‡¯Ç¯‡O‡Oí¿º>¿ÿsû§ÿíñOí¿?ÿú·ö‡?öéü~9T¦jÿ÷å÷¦2ퟲëïçŸÿëð—ß=Ï8¼®_Ìëÿÿ¦Ì³º<¯bâÍ_ÃWšË¯ß~øõð®ûþ¨—[›ÊMîò£ir{üï??µó³g§&7¦*ó*{Ã{Îoè_d›v£ËÑk.¿D&7òsÛ¼R›û²ná1®4Á¹Õ6Þ¡^'WØxWåzs^·Ò¡Â¹Oui«¼Èšþù-ߔ۲ۯ¢’ß°ëä ‡‘×z’á²náÎ-ȽE10Éåwç6»üÜe©'“/ë–Þ’áXñä‚çZU¥â¹Þf—Ÿ»®õDþeÝZçŠ'<צ8ª›joÞŸÛìâs7ÆjçzY·ô– çŠ'—;ׯZE9übvù¹S“Ãݺ•ø50¹à¹æe­Ç¯/f—Ÿ»4jr¸[·¿&<×Rñ*{›\aë+½«l·n[ž[ðPë¦RdÖÛìÒs»,ËõÁeÝZÌ:šüSÄ$x!ÝO€óìkàÁï¾Þ}4yÖʾòøå§vm—Wv¿}i·¤hÿ§½ƒgÅñËÇß·+²8~ùùМJ[ +ìFL‰F²pÄÁ‘pä{8B¬Í½G#¶][?br4’Ãkâg[õ—âÙðªñ3˜Bà ÜwñÏd•äH`m³\·;ßi%Œºth-Ëþ­˜^¶&7ð ]‚.SÑ¿ƒ4¶;ë¨ûΙÑûÆ~^QßcÀŠû迟5TôSp¾[ð]Q±6…׆j,v±Âö2sŠÐb¢WVŠžž’Û`¾¬`VV¾el2Yio>ÄK>\Jª²˜mÐ1,·Be¾½H]‰FÓ‹¨@L&JVx<"SºE—Ç ³§)cEE] Šk2í@&ùµ=©¼¡ÖœˆžV ¾ŠŸaÞƒå<…À3–“Ò˜½&+ò0 4+ͯ‰Søì˜ˆ$a D>‰¬A–—«ÉA°ÒF·`]™ ÒV6Íë-Œó^§5«g¹|s8´ÿ†“® 3Î?­µßÄÚŠŒeûˆì ÎÒM_ 8d¿Ï £[$vNˆDÞRNæGÂ(ŸåúÐ.1ò.…ìÊ ·:Ù¥rÝS”)ÅH[3ÎÑÞ¨¸‡=ƒ>‚¥EÒhUbbº^Úju¾+gt´i•s &ŠŽ–šB61=‚cSáG4l ÍȱñÈÃK©0²˜‹ÇS'&³þby}òh“1&BÐî>D_®Âmjm“‰£ü˜C™÷0†,ŒòSž8íTUXvðòk¶v.÷Ùš‡ðê{W+3c™;ø!à5kF3×i‚ ©|Ÿ‘?žA|N’w Ehqæ#¦Ñ)g-Õ…'Àa¡š”c}}‘à¥÷Î>1ûž‘†ÍQÌC„ ¤"Í÷ð +œˆ@ sm`P¼LcªD Ñ´Ë5—?‰Á²Š&FÄXe }~Q½À¶ÉÞ4ÿŽ.,–òâíÂk#Lȼ€rüCª‹O1à„ïêÏ–°tOÄb«Ž¨4Μ…äSŽ,þ.©k¶Zk|êÞ&N]Q@¸¬ööpW·'v7$ ·Dml`ʪÐTleîó>Q½{y÷ ŒˆS6öó(õD÷¦T/dsÎE<[ÂUÖ¹Â÷ä}ÉkËtžH5¯×³™¬©¢V¹WÅ''êO™Vç{Þ®•ïy»k(¿g©ñ#Ùpþ_–ÓË!§xçôÓ7¬7—ät¦ESÙ[±˜ð{pf,ÎRÀ”˜ÅÛÞÌiã/ÅY»U9o¨Ç. ñëã9úÇÓÝa;ˆû¾p½ÉN]çÅbºëKq²~€§O?¼óŒmˆÙ>ÀgôLŸ‚pŽûÍ8> ‘žôî=ó­ ¿<—'gìëKmy¾³¶¡éGÔ à—âô,{oß:â7åpã¾í›…k+á lüî൙T ðM9£4{¢ž.1¹ëŒžñÍJ kÖ\aXÖ€¥0ÕEÁb Ÿ.’ÃïapQ¡dùGóÑ*õÛM"œô²k&wgÖ×DÐ2 —¨´bDÎC úIt³¥Š¦ÊF`%´Ê–»Q¤p»Qk&˜€A1Ú?^e霊Í+¯U×–¨÷#{«(ÛdfCÉ:ä|†i•è@‹ÝTø¦Yv=>²ë> ¹é¢ª°WQA¶U÷LíhM‰yŸ)á\ódÖWààˆìî8LoÌlL±`~À|ŠCÄD“TJçÃP<>Ÿ@[Sâæ{˜æ²z#{.ð¬Éªëõ_ÖzÁå—±t€á7¦ n@âcn‚R•YA ,¦ ,kð |h1s\öš [2€ÂVel‚À{ý­r(oPS.üîidgã*ßaI©,ȉ±ú„-ìµ€ “pƹÚÎ:”°*‰-Wܵf>[ó¾¥àÚ0"¥1åÕ¹·dX{K†—§µµ«Y€¯®ý¯N›Ò¨àïTu5’O3Áߌƒ¨•SuE;:PÀ£´HMådGœ¿¾¾ÀÉð£x1ƒÇ2Ñ®=  GÓïõ/Ôá~F‘h‹÷TÕ#6ËLU«±Ùà˜ZºKåðsñˆ¨(Ç žÑŽ M‚…c6”©ÀN”‹[Añ®‡„†QÅ)·!%EPq¦S*ˆñåK-Ûd&p»-Lá)¥ú„õzÙõ_*vLµXt`>e*¶J´LË,‰>r‰ëN.˜ ¶«â]ÏSÅ*u;hEíËÚúîíQæµEõz=©¸£ÂˆÏKÆÐ­€Çp½9‚X\ˆ‚œ!èDcù'%ÔÃV{jÂ.và½'Q¢®Kô\RÈ™ƾQçB- ó S“JvON„n\9¦Z˜HxB–orô<•{þ\| L-‡=h´™²ID·‹À{˜€ÓÓÊ—?TáÅñ” =º¡ÈòBYSÑ5µ§é O_cñmªËn±(Æå' ±b|äŒÂf$œH!°Då J?Ž#3Âý!›l&kimÜàžv`„@·¯Ç¿fÞžD§‘øÖ3Ùî}ÃÔHš•º+¨whù¢Ú¸û1 -/\jX”o©,ŽKŽÕ ùã²öáör}ž°ùEÑ ¹‹»”–ÂÖ^õ.!9=Å´úIt¦)½OBNSÊbp©¨S”E¼õ¿a›"^³ìvÑx{¸Wz1òHØ‚@P»§‰À…Ûkr-W“K9¥B¸&w‚ä´ÜyOCØëqK•Mc2t™(¡lV ƒ»bRÌŽŽ´~*ú~‘: ÓуÈx—Em«FF‚´µ›Æ{žê‚ÁßàB!ìÀ•®TY1H³mz( ÆåL¿àDýE“­m-!·4Üd÷Bpéilùn½OÇMÛ tàóÁ{Gˆ Éî[ ÀçCÊ…à÷àµa¸ÞÄ„gŠA¦ïÁ+ÀT…÷ŸsMq›VÕâE+—¿|)÷'‰hg¼XØD¤±ªòw­À£÷<…ˆ;?þ ÆIQ¤OÔÁO9ë#ò©˜,¼“ÊC¾Ê^…©)‘ÎTòÀlŽãøÄÝ9À(¢Ì5’+«ä<¨â/#~"бÉ”–EYRUg¦h(﬩§ÍØD0Q­Nu»˜Oœ2´¯¯d ÿxwx¥¾÷ECÌrœlÓÈ`ŽK‡q¢Ë* B‡ áÛ‰È!'ò.P5™˜{f"Ä\êE6&¦e8Lß[Ú”ž‚£îÁD{°É‹ ~ýþÚ]¶Åë÷gx¸Þ}~55ýêê\ïþÞ{ ¸6¼| KVÜ·Æ£½žÉï}³ïð«™ýHV=¿¾õŸî—Yœ2ï¨)5)Û j Á žø%ŠÕˆSˆv¸KZhÿ&6 NPhÿ¶‡“iUq_úòž KYó^¸bª$TÂÙÎT0u 'k ø ¬&#€ó‹aÈbcükf°3GÑ:hôõ=ÊîÍÖ}±±ÃÐÛL;ц˕¼`Ü(󗄃”q.‚[b¸f°­=Å*õ X‚LX «Ü=ùU" ;`z³5c~ˆÖãö€/ìÂèh÷ù•€ïõÔœ$ù´qžâˆJ6KY‘ºÉ¯;Û¼ïIç{šl:n*ëGáûz¨ü¾æÞÏFH+&E3ŸRN™Äl\Q¦E;,Ëñ^ãªÏDrúóȤ5ôÍpíkËÉõhlÕ®ý:{-§“ ×F08Ù.¦~“•+[žjqÚøº@T¥ \Þ"Ü£iÝ̺„o3çÛF%ª"¿Úfİ„û & @xšWtÎH¸#\ö©ÐìT©IÆ1Ÿ$mNS%Õ…O⋇º$r˜ç$èJìâÒœàÕQ¬ß¡Hš¥kfKßd8Ñ‚2Ôª™ôb ˆªq/Z=:µçSj—ÌÛg *²qQ"/”ÃE'<¨†6Gr6"Ñ™©‘ᆷ}~FóÄw:ª£B‚²©]©8•ˆó sêâ2–:mÑ3TäÇ¢j¡°´ëÿéÚѽ—Ídª†ï¦ÆVÞÐ2„\XʡчáC1V:SŠƒPf”§ +&,n eª¦Õ¤"àt`Îv>&7@¢øC²^s"¶2úçE#‡ö×ñk+)ƒ‚ôÓÔ_˜!iëû)î”™3Êðx-Q߇dîm÷ñÕOìÌw{²— ÎË‘.$SŽGúH˜=•£„Syíz›’^÷Öö±ÿR´ÄÞÁÜWX0”ãì[¬˜&ï|†Á³Ágzj5QŸþ"`ÊÜùÏ튇ƒ.âÚ`Å2uï¼G6UϵÝÏg>Wm‘^ÞÙoêôð3õÛϨÊêS—å<ó°úâå½<›’eÇO‡ÿ_¡ endstream endobj 2221 0 obj 4799 endobj 2225 0 obj [67 /XYZ 38.2500000 409.250000 0] endobj 2226 0 obj [67 /XYZ 38.2500000 409.250000 0] endobj 2224 0 obj << /Type /Page /Parent 2 0 R /Contents 2227 0 R /Resources 2229 0 R /Annots 2230 0 R /MediaBox [0 0 595 842] >> endobj 2229 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R /F1700 1700 0 R >> /XObject << >> >> endobj 2230 0 obj [ ] endobj 2227 0 obj << /Length 2228 0 R /Filter /FlateDecode >> stream xœí]Ɏ丽çWäÙÀd‹‹6À0Ð[ðÁ@¡ ðÁðÁèñØx.ÏÁ¿oUj©*)%¾ RR&Ýðtw©E‘±3ø"øáßþ~üçoÇŸ¿ýçø½ûýó·Cv*ó¬ýßñå×o «S÷çcYåÇ￞χÇÃcóßçCû·Ïnþô¿£>þ©ùÿÏÇ¿þ­ùáÝ?zù¿JU6¿ÿûü{]ªæOÙðûËÏÿuøË¾ŒØ®›Ìû¿ÿPäY^¾ÌbæËχ~•êüë·ï¿>´ë÷úˆ2™Rö¨¬iþS[}üï??5ã÷£g§ªÐ¥Í³º‚æ¾]êáãºnˆ_L>}þ%2¸ 0vU‡ûeÞÂQ¦PαOµUª,l™]!PíüµU-mŒ6òÔF@ù¼0ÁÆ>Ï[š$=[ñà‚|-z™¡¬E@…j–lìó¼)+[©•*ZÚh[ÊSg]žò*+t0®žç-M’ž­xp9¾*UwÔÑ…¼¶¾Ž€¯¶ùK¨±Ïó–&IÇWÇà‚|Í+¯Ãèh_Ù`¾w(¾âÁùZg]XSçòä@úº™p°±_æ-L‘ž«pl9¦êÌv¦,€o}\žð:«ƒÂí¼…)Ò1u2ö£ÇxíOÀfüÙñ⧧Çe³ÆðǧŸš©?ÙþöÔ$oþÒlÊš ?ýxü}–©âǧŸõ©Ðy?Ãö‰¶èIö>ùŸøä=ÁsËJøDÁ'p=¾c´ÿh ?ÁsÃý G«à;5ñÎGÿõ`ºiÈmûóÏ@gp´Oð æ)æO$ЏÇwðJ¡þàÑðܰŒ¬§pnšàC °uqè¦5A·ʵ%4Ø17H7ƒmæ6#ñ ç Îaº1–Ba­ÇzÊè¦5ÖF~¥_Ÿšˆ#x´ÐlDR´¢…½G ˤ¨†+Å^Ï¡éØÂï0>Ô!UØr6 Ë9¼Ö,‚”Ä^KãC1¶˜Ö„Œ¦HF:’qŒ†õguKnpLMÈ›l « 1â/|Ùì|i­Þ³Êž¬iá$¯ÂR¡'é¾ð¤ ˆ«SUgçÕ-x§cH5–+sÊmQ•ù²á«Ñ Óà Xø~¯‹£”9]©æÑëßaÖEÌͱÒÍ “É £u»àKßÁ3hõ%hx¥ËYéY<¥ÂŸÉ”@ã`¢³%ig,í´Æß¬5&–ÙŒ0 X2ñÒ1ñíÌ º·<+Æþ ³kÖn,XúaÌ<ÆrÆÁg¬å̇ D) ~¸Rƒ³áÀÄã]ÆíÈŠAL—¥€òžX¦àdeMú¬Åó’jüGtƒm™(û+ »„Ò%aˆ¿=ÍV_f c@§©š¨hä5m¿E-‹|q¬ÊD—˜­ÇŠí9"·¯Rœ˜?Ñ¥}?Ÿ›É~àlÛ–Ï[-‘¡ÛçɲÁ§#D–ßñOµ©6ïÿó¼2ÞLÒ=} ›:â|òkt=Ù¡d‡Ø•*l‡˜“j|’Cœ¢céÅ',<¦5äæ\,ËŽõGVFcú SÔ{ñUµ)?auæÉ°”Á' Â*ª;µ[Â~SØ“õ} ¦ã°Ä+Å%GŸmÞKÒÝœË<Q´‡°&â—X‘€,ÝpôÕÓ6iÆë;8"†LŒì˜õÝèÙ–¹° ­Í³>¯"ŸRµBD4•Ð¥\Š5Ãa‰ f˜Ø™Apn?ªŽ£ÏÃQUòÂ.¹¤ÐÈ¢™7Æo Ïà®âÓÜfI3vÝžm™ 1´vŸ×C²â.(¼/Æ](aì1ó@ ch¡@/±@nË1£xo •¢Ä­£yv*Jõòå±Vù)«Íû)Á”Îf(Ý?Z0\6S¸Ÿð˜^KÇêŠgM ãHZ`éšµ‡ß+;rg‹Ê”ãàÑ„€Ój + }ÇVËA‹]Ú¤õ«Ì(S'áKÇË`ž!äxx²>ZÃ8­õÅšAÒ//Ûq ’ˆQö¤Û'JõºJܨlQ ïÿw8fײÿêk;Ô•Ÿâc)-iI…ZK,\ˆZKÙàQ¨ŽiŸ†f×U^á“X…²ó„JEb×X›C˜+»ôäê±¶EGœÌ#| î'uWþ*œ Ãh|2 ‡;œî¥ Ÿ`Ùgš³î"à,E7ÅÑâý çÈ?Éh5æ)ÓÆbý4ðĤ:D†P‡‡ ¥PLxɤ Dû1m£° P‰L·{ì€.¯¨Æ.O&=Édà`‹Û.€‰¦Ú¾ÄGÐ~LÒ“PЃp¢ÇªcÛ³<Ó½ÁæDLËŸ\äíÇ©þ%„èlÙË; #´©›ÑvNÏe›Né§òìÕØ‘{c¶"Ž]%sd)•æcío¬™à4EÄ8pl’DMŽØ©#ÐåG“ÑÔ.ÏTˆ$ 2Çk’YEµt2{l©žï²½*™s'oÛÒûÅHj|&ÚKŽ(÷•›ô¨7`Ü0Ž®™œ!s)ƒhÂÖ‘ð&òe"ž qù›È29¬ù¢Îƒ—Ÿ•Èú*0F¦ph}0ƒh€g(òÀÓš[†Ríµt¾Æ˜¯ÕO)$ísØæUnGJz£Ý ºÚª±¡cÒ•D°Ç¤Ö©ŒÔêE˜LÔ䲄 Yв &È}ßÃPê0}ÃR_[—5§îìÅ]~ðÜðzðw ÝöÙÿÄ` !ºª­¿G?b¥xnŽ»t±Ä‹Rk0¾˜º'›é”‡u÷j"º:ô4b7öÒ¦ntož07*$»žì:k×cõé*ëá’Ñ[³ŸR0ÙÚÊhÈæ;ÎuEª©qìÆDQ$x4êÒy|NBÔO:f ,HQtGèîXö²‘+œlؼù$ê®w¦g¸L?HõZ¸‡ßÁ6gw%,ÕÏãdxË%× °"RO'&>X,KÙô‰D2Í·r0àwª}ßÙûj€yã¼ sCsÎÖ1yp|Ç¢ÂwTÀ•Zx‹‰…³¶0+ÂÌMá ¾3f8sƒ+uÜ®€ŸàY‹ÊŽÆùi"˃ùsÅ­—L0Ž ¸uÄÁÍȲ#/ù‘xëV® ß æ°ÄĽ1o1©ª2imÒÚ·Oîæ¶”ýjmë_IÄ™©ž¿ßÖ¡A8–Ç» ~Ÿ‡"…I{‹×'±ö²7 »áDŒìëJ'‰.±[ÆÜæ!¢6©fI›âk¾?˜AD1¶ÆâŒ69î§…´f¢gÇ æòQq´I_#±I›8mÂïPXA¼Ò k-UY Q2wc/Œ¿ƒŸàx[T7 3Õ¶ëÑnJŽi£ÍÐjÕl…uª²Ú¾7¿» dë#•«‡®º—Å2 ãk™N„Ô; Td-ÐÅúÂhýƒÚˆ–%Tï@Q\|œŽK^X/ðl¤n "¶£èb4€]33rÑôÑã†@l»)[ÿ°aöÏ^,²}m÷}ŠŒLé]ÞŽ’B*¯~§Q¬>µW4ÙÁ¥Ô#&Ó3q9Z^¶K¯Ü­=ÕQÕ/ð;·¬TÊ ÷÷u·öd§6\ˆV~Ò“Hö#z§3\^£uP˜KïÔpvPÉ1<þŽÖnWTÑÓýuÖíî.Í@£ït«8¥Gê…ç&*AŒW¥q^A^az8VðÒÃ4Ät‡£é> w&zv%¯ðwú2‹ Ò’…6x] K•ýI=Þn ‡«WªÜZàKU£-OQ-ó˜Kû&wg()%PeópmQŽ¡ÐK,ø2çø!s0õê¸ÉŠñÚ–w|vs Îý‰\ÀÂlÛ&)¢g€#jÃÁåâÍL¬ö›³¹Æ>ª4ùV··ÁŽ˯k¡Z¦îêBë ß &\ש{ÓxKÌÃbQ]»+z”ãl=@Úo®0#0€‚¨1ë!Úu:J3ñhxÖ ¬GjB=ÅqñŠ”¶v^Ê ZL+QÍÈ"ÂeôP âSG1ðOÄŒà ~'bÁ•ÒC Ä–yâhÔHù0ÜÜ1"·Ì±ß2·T„2ËCïŒÃìûÙâGÉ.¦|D¯aL}…ÌG‹‡"èÅÒ:\ÞUòê Þç°Üz}©Ø}Ëò ú:bT¦½Ž»°ÌMÂíÃE˵7`?aæ€õkK츓å6# Ñ–¸ñ»À|ܸM²*߇qùŽÁ6=àÑ6"ŠÃÀ8'Vwe«¡îGÑÈ`*WÇ)07…1¬îëŠM‰* 9ÓÄ–`©°X‹\°áªÉ ÜÑã$–:1Ü…åÿam=²Ù7zD²ŠÆc¿‡%^´è‹ñˆ( S9±Á ¢%0(b-ÅÔ'y\½Ú½3"ÞÇçŽp½àC è-a@,Ô*HTloº’ ÇŒfʽ¡ÈLå;ÄÅA‹iÌÈ­1W48L@•×Ú@x‰@ Ò6ÒVä2yáÎL5Y†-”u ; Ç$VâoÚ ŸºË³±ŒÑOÙ;‘||mxïhFsTé0^…rc#ªnT=2tc*–Eù#r…_×8ð‚¥¡rËwÞŽAD‰ÈJ¤N†_­)é„Zb½甸z¶ó¾°™§R‚Ìþ˜O{ÜuK±=ìëØ—¡®®iþv»oiv¿Ì1@F`AûåW#¸«–ֻϮÎÚt[2—!ZÊss!ÖÔÜÇ¢èJ g-êñ¢UV­]¾QU ™1ÈT=ò¾²t9Kñ„…o{Ö‚JWâñyŒÌa&‹%Cæk¯ U¾Ÿ©Ô¹ï–ûBn¹Ç#î]—ºY —j:h ;¿l½geaŠy L=+[Zå×t#q\úO¶ô-íô]¿;Ê}u',ê=tpMý'y—j¸ƒ#õŸl)b®é¹º~§Á}jÝ6ºN½ägxÞ§þ“³ô-®éíšúOºfyÏD¥·ØK²¬®é.›zInß¾TÙ5ým)=I}!ãrX÷¹Œ ô…¬*õ^eÖ¼=rW¨’å)~¦ÊY¸Pá6¶üÖãÑD9s]¼K·/n«ðjŸøÁwSVåØ5%á|õè¥'í;^í|®ôäkd¼ôÄ~éÕfI”Ê»¦ShéSh˜÷2pn;=ŸÆ{ ¹v½7C¹íÈÂÁ'³'ä~ïÌí ýöÂéIzòê]½ž8dŸ³a;ÊÌZëAuóÀ~gÍDYl& ˆ1åæhå1Þ5=¹½'÷1a]pàÅàh²ØÇ cvëß}ôfbÝXÞu1Õ^‹ñ ŠA¥áYc] Ð Ô¬±íeè†Gc²xÖXO«ˆq^©çykqÞ†ý{ÊŒ¥ÌXÌ8/–¼1éâ[}êzM"ìKBó}ÇÌIø¥¹=t+Eíϰɰ¯SÊflU1]`g2. _Î8Š ËPx4øN'áÊkéoºé³÷òçfÆ=£sF+ܼhévIlÊNÓÛŸ/âæ«‚ Þ:û~Þ÷ð;Õõ<*³ê¤Ú…-c–~ÓíeÖT=ÿÞž5- endstream endobj 2228 0 obj 4628 endobj 2232 0 obj [68 /XYZ 38.2500000 709.250000 0] endobj 2233 0 obj [68 /XYZ 38.2500000 709.250000 0] endobj 2231 0 obj << /Type /Page /Parent 2 0 R /Contents 2234 0 R /Resources 2236 0 R /Annots 2237 0 R /MediaBox [0 0 595 842] >> endobj 2236 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 2237 0 obj [ ] endobj 2234 0 obj << /Length 2235 0 R /Filter /FlateDecode >> stream xœí]IÜÆ¾÷¯à9€[µqŒZ¬9$ #‡@ޱ‘‰ùûa7É Ù_5ëëWE6§"$£ Åâ«Wo«·¾ùÓç¿ÿü½xóþóНÃÏ÷ŸêX—ªÿOqúóÝ·¿0Íqø{Q7eñõ×ÃSñtøtøÔýïÓ¡áóû¿tû_aŠ?wÿý¥øñoÝ/þÑéüz¨uÝýü÷ùg[ëîoêòóôûþú‡â·ÓŠãç`^þÿïªJ™æÅ/?Æ]êóŸß¿þvxÓï?è#ÚUV…vÖºu¦øï??wë««cë´®+W«;¾S›ó‡\]hÓª¢û9ýÌùÈâ:ÂÚ­·ö naŒh[iïÚ‚‡ª]Ùã¦-å‘sY<âm£­}†[#ã¡ÂµÕ–#Á[+çÕå×vM<Š9Ã-’ñXñâ‚çZÚfÀN?ϫ˯]«xkŸá–FÉx®xqÁs­+ÕcÇt¿•Çý¸zÜ·M<µ}†[%ã¹âÅåÎÕªQGu&ˆ8~žW—Ç}'ˆ£k·4J†sõ,.x®ÖZª®äÑsY<êŽ& z¸…12ž*\[ðP];¨¨Ó7å1ßFS€¶)ã­}†[%ã±âÅϵuÕ(„<~.«ËãÞiOÀŸá–FÉx®³Å?,‚é|*Ožß}9¼ù¨]§tU|ù¹ƒíüÉþÇ—%e÷ºûvGm_~*¾WÊ–,¾ürh•)Gû'ê]øû=Ñuøj§‚«}„Àw´ƒ@¨íá«©¾ÓÀwŒ$ÔFŸŸüð¥£Óh4fªfBdÔTO&søÄóHJC`ÃIŒOð; ))L˜p?ì0PCF£ð†WÃO Þ¦Bly”#РÄq?Háî¶ÇY×Íx–‰<Îë{[³ûˆm;!‹õ}Ä[ö8{¼Ç؈Yƒñh~ØìWö~'û•7àW6ªäüÊ Ôc[gõ¸d5QÎðH!&V¶:FӨlVÞïdõ˜ÕcVw©GszšÕã#¨ ••“k&³þM0«Gïw²zÌê1«G¸k Ý^ϳìE]]½F«cÙƒó¼é^*—GSõž7ý½3HÐjZô΀\]{÷ôŒ•®­Ö˜®Fw÷ó~zñxŠ.Ló¯àjºuõÑÎ|çêÁ¯_mô}Pƒ ÄÖ5 Ü›n¥ÈõFÕnüdOFA¹E8œbqä“ÉOx=9fËãÝT¢!œ¥fà€*ƯÁyêÔqÚ¸DŠ ëz&tE³¨<8S‰ÈÑóä)BÊŸÇíc¤U]C &&L2l!ùD²Y/D¢±Hb®,ñÎ%‡lúrü¼;WNµ¤H¦‘I)GLÙÄwm ÛòZ©Ç*YZîlKY¼a›ê%èaqo &23=QZÑÔ ÏwޥüS“š£k1hÑ6ITÏ™„©`θ›'äÉYÀÉNW8ÏééCäF`ØpÛ–9ÕáÄ2˜ëááG æ{œ9Ø<`Ú!ò«p¶ Æ›'UCM$RÀŒK¬f ‰­pó9â‰6()¬XzÅ éìMH£à*Íî*“Û7n㥾”í0ž Ó—ƒ‰ä¯ÜÝÙEŽñ3ÍÝ3‰ú€´LéA‘ à-eª§lŒm£G¶#JBÛ¸ eÃ!ÏœR‰µ˜*©ÒÓƒHã!I´Yë¸ßìÑQ¶·e×ëòDTÝ?¸ÃÎ~d}’=Ù [öD¨W扨Ì=Ý}¶î‰¨Ü= vzÓ’"²ÒJ¶ø™‘²O„ey"¼a½™TòT÷ÔgÞ”¦¾-¡t"ÞÜ2Þ6ÂéÍ!ß@< vä •ÐW p?NÆ!Œ“Xp~ðZ©è8c‰UÈ&å2ajl~2K­ßŠ×RªnŒÈB£*ïú%TÊ!†@4Ž—¦ƒ{L…W×ç!ÓDcK6š=Y·ö%è›ô„î1fÑ韛7­×³h¬¾yB9f±mNÍ1 •cßç˜E$ YÞ†ôqcMÕn ÛMó ˜kÕí1j.0¡·<ݾۡåךìÿ_dåØ\ŽÍ%–ù­+3onˆ7·cʱ9oáôj¬Õ\?6g•M_áÞ&+—d¤8I«êÑ“¶eÏÈ-Y«ÚÑc—}˜=F´¾ë†¾7+!û0³Ó [öaª×åôÚÜU™²mOœÕ®Ù¶«úA0g.Ýdò-:‡‹’q¢–¬Â¼¾ú-z‡.k.=Š2Ÿ¥óVe>ËÞ*Ú;dê‹w7±í>)’Ç&Ó=y[*E}£$ª”©w¶º„»÷é%X1˜”CF¯-4k›·úÎÜ´QnÊXïι1Ã<ÙÜŠå‰û!·Ü´igN±-O+g(ò|AÞKó³µBTÏ3ÙàI5ÈH5 1O/DøõSPP0-f¸³îñ–d¦/{œeDc3·˜™‡˜§„Ë0$eî3Z„¸ŠPA4œAõN•mMYÙˆ¨'LjÃD ³gV0uKN•0pêW;ÓS‚.ªµ/Ãõ‰,‘™©ôÅR¢ú¿Ci=lÚÌšoÅÌ‹<µš²ÈNC#1§ ºz*frÄÆŠ4 cy›Æ¯«Í„$„GN/¡®·øÊ%á9Z«H–=E¾é†cØò2@áLøÄÓ¦çaì³5XšÓ*w« ¼×ÓFmË;ÝckÇòÒŒ?·v0ÒÜ50z} %#ñ {VËz/]VêžQßßÝèÊÁë.¤+™6˜©š„â¦jJA›„&­„¨î‘²õV—•K9z<Í8RÖJÑØ¢Ãg‡5æuÑ‘CžïàbŽÆr[PÙ†Û´1hø$¼Y«1;麼½ú[smîaºÓÐv}¸éÆÇ¹¶•çŒé,îÌ«r†p«â\§º>+'CTÓ|µ½¤‰Þ ,¼w{(›¡Eƶ3ò…°ì=ö»;X*b?ã9c*ñEï0 {蘓{d}–DÖ4zô e«@¼Gņ…¼.{¹±yN,JÚò˜Žlû"ž¹QDÓ´D]«ã rØ’œ=µRL…÷òJœ€ôÆ 6ï[¿BÕÓ •)5d2Ú‰¬q*É™É]ÎLÙUHú)S[‹søz,ÉV‚âÜæ[MyãÚ¶ÊÒ;”[L‘¯Û œ² VhîJ7Uc[.G$D©G5t0#ÊÄ(æGþ+›jÊ©Â!ØôK±D»®Ü”ôw5Q§ª§Â*™'ÅC­m-p¨Ô fµT¥þí%±i¸iu¬j½°§`@ÿO=Ö+¢VŽH'(FÔ£Õþ¿šBËS‘¹v¢sY‘${óŒÝ“+À\"×{F€Èt hŠÏ‹ùpüÞŒÊLôNˆÁ¯˜8%˜;Y—e ÚTÈ÷:Ô´Só ­–ë‘'\<Ä„Úçb{‹üÝú l‘æªs¹“ÅJŸ4Gaܸ# ÕC…úŠ,î•€9šóµùÛ'ý^«ù“!ÎÍ5£ÅkFÈô{+¼r ¶ÃN‘òÄæ‰{IA`õ°õٲŠÛñ½èÊ64^ ¾3˜2:hëß”c±wú{ñK‘tÐßnÙO×ȦÌ‹þ÷‹ÎŸ«†ÜÁŒ¹‚oêôð;ÍýgT«æ¨û-;¬A« òì–,+>þ¾;5Ö endstream endobj 2235 0 obj 3740 endobj 2239 0 obj [69 /XYZ 38.2500000 423.500000 0] endobj 2240 0 obj [69 /XYZ 38.2500000 423.500000 0] endobj 2238 0 obj << /Type /Page /Parent 2 0 R /Contents 2241 0 R /Resources 2243 0 R /Annots 2244 0 R /MediaBox [0 0 595 842] >> endobj 2243 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 2244 0 obj [ ] endobj 2241 0 obj << /Length 2242 0 R /Filter /FlateDecode >> stream xœí]Kä¶¾÷¯Ð9€{ŇD ì3@;@AÁ:N`ÄF&>äïG3’zw$}%©ºÈ¦zÊ{ÆÃi²XïbYoþøåïÅ?+Þ¼ÿòŸâëðýý—SyUÙÿS<}ýðý/ls~.BS_9=§Ï§ÏÝOý¾¼ÿs÷Óÿ [ü©û÷çâ¯ë~ùãðGOðË)˜Ð}ÿ÷ó÷6˜î§òòýé÷ÿ:ýåwůO3ŽË À¼üÿêºmÛ'(VV~<»4Ï_¿}ýõô¦ßÿ®EŒsmÛÆ;_˜ÖÛâ¿ÿ8ýÔÍ?Î^ž[oL¨}(¯X'Øç…|]Ûv8/ýlç/‘ÙøÜÞø6ÖÜ=ÜÒ(1®6ôärtõÖ–=vÚJõ—É#Õmîg¸…12PÏ-HT_Ú7.‚°~›=æCYE›ûni”ŒdÅ“ Ò5TaÀŽsp™]~¦„{¸¥Q2ÒO.G×Ê7`§ì\i}7½øÜu7o¬¹{¸Åq2PvaöÏ;fÁô¿Îß#ñÁw§7ŸŒ/;„ÖÅÃOpÏKöß:¤TÝÿ8_[<üXü¾,ÿCñðó©=×¶!\ñpÄVûg3ïÐHÙ‘÷p¤#¸~õ¢cÞ™(˜wpwx6Œ+SC cš@:¼NÈ‚&Õ.ÅXtpä£$g;¸Žã@ÍøL’ qÀÑIŒ#Ú•@®±’Å5ƨÃ8ÀŸùP×Ôí¡u,÷qt@*¿¤úgÕÇÄ(Çß 0úVm!sj(ìˆòNöö£i®±Xj!…K(µ„5úİS Ø”@‚/9°1ô-¡ñág_UÖ²dŒlY¬QIÖ¾'ÖÓT²ˆßX^£Og?L®°:¢#:rä‘ו0–È`?·±(—õNï0Ú4¶~¹ê$Ñz:Nnéö<«9¬4t ×Ü[ô¿»ºH AªŠ¯œo7ÀÖ-"FÆžSW«ÑÄÁíëM„«W ð±ä7–öÆš׎ˆJ=±SlYðl¸JBmñg8ºWôÎ Ö.øAηv0Wa*Pãu0FÅb¯ –¿½œpÞ¾Åù±,§YÁ,£Æ‚8nØq¤„ëÖÎyãRÿéiˆ—?€‘M[O9êýð^¦þÇ£AÂ#ŒS[N¦•²å”rm/ "ÎÐ1mñ11ã =uú…Å:xúçÆ1JbZ¼0UÀ{ ŽhÁ—pÂàÕ¢²²wŒzSŒjÎNw$Ñr6ަåsÊŠ8ž"ã˜]Å“WSNdb9|Íɲˆ¦§Ø†µÈ­‡`q¡˜`WYmÅ%–c±½>aGÅ—ÙléHE6Z«AÁ¨õÛé’û"1Ç‘¸tEuDXY7±€,üo—:VˆÍ1o·¿7EŠÖˆ°FÄ»ê%wHeñ³l>ç¡9³áLQ¢œ%±ÆKDv–›“ÍcúÄÈ2¦‘¦Ê¸Òª›d•-ÄgàÈ1+uðlmÇzuC‚Õêž4RÖë$Uj¥¹œ¨Î}mäöR‹÷ƒí®fq˜ßEó~òÐ(•¹ÜÚõª¬Ù"ä ã7gŸVk÷îµrnïp°)·Zó˜F;¸‹<ç_Öu0[ûz<ä<î¦TþšÎêo§“™{óª_¤¿ž›.©îÀxƉ©z—lÙx—i¬^=ö£Hq/cžº¬£ÈÉ1ãÍ{‹99.Ž÷.«EŽ™-RKí‡CŸ”‘u·øjd¡‘5EG=ÅÎa?¹Gýµ÷ëøÕ¨_£~ÕB´†šã‘^‘KÛ·Sú5ê呦±zµ»‚—Õê‘°‰ÚÌcÇ´zzÖÃô1Ϻ‰3<=ÕQšÚ†~»Šzû‚ /—\j‘“è©}Î3Ó27KE¯ë±WÀW}8·œðsÎå?ÆQÄ5[|·ˆƒƒí× ðÕ%Ü:‹s7kÇÓÅŒ— Dž£'.ká…9÷EŸ$c=Ç${é™qsõào1®]£ö11¯¿;1t‘¯¿÷,r’ò"dh“»ßšB׺[¯3ØÚµŸ”)ô¦ z5…NJ†&¯²ÞOî)ôÆ6ëøÕdBÉ„c¦ r–MM”ç2ÐDùÝúil›Wð²Ú66µmš·9h:œ”=¡9²¥¬/^nŸoíåÕ’^Höõñȯ‰Êž$Ðö‡T3È·%zVÈÙ0^’f¥ìS=-ñ8ó!Z¢ëûÔ"4°ØB³ƒ?n®Iæ%$²-P’=ýüUãtñ`ìóòàÜ,µâ.lï‚ŲfRªå`g@Â¥¶nÇ¡-èÂݶb´šºãR¤DІ£›ÿ zÑp\½T 5t,Ä(±3QÛ6À?uçö†–ÎtjwjêÔ™K¦±:1dlØXe«3g‘ÓÖ£kÊ)„º¹ãL”MãÀÛt<'¸”8*Ye·'UþÛÍÂ)ÇãˆÑyzŸvÌ¥«cLëW7Sž½ƒBuqâ^N ­fÅæ¦—kPئ]"ží{·Í…Çz:t¡eßh†¹êl§­‚†> Ÿ±íþÙÏ~é3-úÌÛy@üÎö-⟄ÊÖ¢‘ˆK8(álpïg ¨ñ:æ#coõÙ;áìOoÃ:õȯ[ðV3vÊ€Í$JÕT©vк­º¦r_vº‡û¬øˆiôªv‚Ca‡»"Í%Ú¶A>œí*G8;mέÔYd¾#)ʹ¼uo­6%Е§;ì›j|ˆÉ9¦Û.º¬Þè7÷œ ‘è,V¦}2F1‹™çôH—m}«­WeŽ8ïK°ìÛ‡‹>9ÀtcÅ•›æùðˆÚÑdv”“µÎ5ø@Ʊi¦¡ÇœàÛ3'¬sÄC:­2¦kÔµ¤mÜxÔtD׈ôê$d;=šPOà–ž@¶ÁÏÍŠÍöqÊý†ˆÆ™&¥Lpê.a\ɆÁ8UKê/hP­¦4‰)}=AµÆ´ÔS ñoƒ™Ø³ jS9êê’™ÌÛ½3)»½’ŒrêD¨ÁSU„ã cG6¶g¢÷,N‰n7Ÿ ß'q`>纰¢›¥›8…·×›ª_qÞÇñ6eq‰M’])»•¶'X³[ «’àЯ ë̹ýŠ,çÆåŽW#Rä¸pn¦™`ŒsÍHøŽ%û"£ÐÈšlÙb§Dße®m¿».w?aMÕ´c×+„#Ú‘f¢CÙ78²Ì‘>BÓ%©-h¦¤¥{…ÐÖa‚C4âG;¢†T4ÅÈ‚Ä4®šò­žªÔÅ—:Ù3¢)H„·Ó1Ø szG1Ž49á†:ag¢Êøúåönè N^‡ñö/~“Ó™h¸ÎºïÍ×t}*SW«ðoÝÙÜ÷†3œÍâzá~8=dde†xMó2£G ñÖ-‡¦Œ·{9o+¯ÊæÒH‚q7Èsã_“dUk/.£ìë×iÀ|…5{Hˆ+?¾zu§¡õ!„~`¼YÏé€-t‰íC§¤ê°ú:.¯ï•—ië”Ë£py{)àP»·‚+gÂ:½5.Ì$.t®^…G{"åíÙ¨–x¹Ò3Ž£û/ÊË/‡[Ä÷Þh|¿WnŒï‰~‘ŒÎYÏ2αÔ£|°”í+õšÔkzƒ,,¯Û;å>õ€ŽÌ—Uy©£V_d WvŒâsöE’M¦äR?ÆœjÕÕªg¤=k§Ü§VýÈ|Y—qNˆNÔ˜öpÄBšl_×:7 EÚ)ýŠúÒ¹KÏ(ߊÀæ$ŒƒTš4ìÇAÊÜT=m§$D-õ„£P«j¯ –zÏê=g䥄æ ^¾7ŽUûм܎çh)3‰Áç"êçSÒ‡Ÿ*¿Îçê竟‡û‚»S?_¥)—ì{¸\vÖèD£“c{t1Wðò½q¬F'‡æewY5atÒÔqîsht…ZÞ(ÙâïjtƒûÚòš2ʱùßjí5÷F4žÐx"®Ö}£“rðyí6¼Ö, ‰3î\š§W% {©)êá^zÊ©‡;,¼gÔcÛžísû’¹ÏRÏGŸÐž‡W-g˜[z€êZÇ­=!¶Û§a§èaMÜÖ©„Àšaë³ LƒŸMÅï¦/lÃàÙàgØìÚúwn!—áž~î  ]í'´ÁOu®uÞYb›~OîÜÿ~0] |”tP øfQ¦¹žF¡lÎ¦ßØ b½E‹²7è³5]V|>ý `‘ú endstream endobj 2242 0 obj 3659 endobj 2246 0 obj [70 /XYZ 38.2500000 584 0] endobj 2247 0 obj [70 /XYZ 38.2500000 584 0] endobj 2245 0 obj << /Type /Page /Parent 2 0 R /Contents 2248 0 R /Resources 2250 0 R /Annots 2251 0 R /MediaBox [0 0 595 842] >> endobj 2250 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R /F1700 1700 0 R >> /XObject << >> >> endobj 2251 0 obj [ ] endobj 2248 0 obj << /Length 2249 0 R /Filter /FlateDecode >> stream xœí]Kä¶¾÷¯Ð9€{ŇD 0ìkä`°ä`ä¬cFldâCþ~Ô-©g‡ÒGIŸŠlu<°{Ü‘Ūb±Þ|÷—/ÿÌ~þ#{÷ñ˲¯ÝçÇ/‡ü芼ý';ý|÷íº:v¿g®*²¯¿ž³çÃãá±ùïó¡}áËÇ¿5¿ý/ÓÙ_›Í~øGóåÝþà·ƒS®ùü÷ù³vªù-¿|ž¾ÿåð÷?e¿ŸFì§ë€yýÿß•®vù Љ™Ÿý*Õù篿Þµë_4‰2Em›kl¦j«³ÿþëðS3~?z~¬­R®´Í üN¸1#Àjì\F€ù:¢Ì?Ã-’ž¬xp9ººÓ·gìXU‰ãçetyÜ;«¢I‚ni”tt .HW[÷˜w1p_Ç£kYFä™ó°Â(é銤«ë¥™5ò§ëËèò¸¯”·_ÏpK£¤§ë`ðǃ`@Úo€õöxñÃÓá݃²ycn”ÙÓO lç)Û§%Eó?ÍVØìéÇìûÁ'>y€O>K†WªkQتåO0læ=|òÎ×£0l£ZAÚy>?5{(:ÿ;³‚—ͧ„Ö:ý¬en.”, á“€`ö|¢!Ϫp4üï(‡òÁ%¤–­§w$–0ÄêR Kf–˜”ü…`sÆAª“ÆêCBî+«5²cñÎ4!h ÄÙk*èB€eù®eLíŒÊíóî۰ƼïŒ;C奸V‹¦´y;ec°¿B¨*ŽymN‘\Ÿ«cUçgüø{âà“–¤öhM/ödä ž§eÊ—ß|Q¢Q•…¤5̱°eõ çC™A0毸)ÅÑèJÍ}‚q1˜Ý¸âù¤UùlHLçSx¡ó ¨+¸†*×ß_!;ѼèI' GV*‹7ÕÊôfà ; —aöÞg^ü§X, 0ŠD\ó`ª+ïdÂh0xwc þÁ_ž‘@‰À‰x4F,ËŠ<Ú@Èû_Ä2†ÄçEû9j¦U¨åؘ€OVpïÍÐÁ+… {רa‰qñI×,6Žà<šx´€‘ŒaøÆO0uqÍ@üNÀQÀ8/±éˆ±÷Á†5ãÁP3ôIeôSÔ†² »rŽ)G¸^˜^%- I¹7æQÈ‚"‹·À®ÇPü ã-FÐ$ÆdÌ š(|um’o&üFIïD»6€7¼Ÿ™õ`j'ràÌaä-ÖA÷}Ðqð;¹˜TpÖëª)wQ •K§NÎ_hŒÙëØÿ€-yè2dƒwçèlÍm¥z—Ú‹rÛ3²é^šñdIÀ.q?a/f`4ìG%|¢ “CŸè] ‚)Øoˆ]Vx“¤bQ"S”Ë¡ð~Ç÷·¼ÚØCC Œ ž‰˜Å݃ÂKÇó£Dð”ã:âÉWäÊ;údb¦Ìb™ï#:!Û/P"d¹$ô q‘,ô¶€¤˜ç1Hw¦B( 5>½Þ°Ú!½—¥`%C |X 31mæôgöÄ|1Gñ£lÆ;M•㛺Î?QÝ- ÕA ás3ÀjXÄ v3¡ØƒÄì¥A¬c–‘“×WçËVÙcå^XC7!/`‰ÌÏ©‘Ôèâ{ÜLÞçª4^†#dµ…‰rË(yƒaKXígJÂc®_¢Ú§B48¬ƒöL…Êcg:N„Áµ=¸böúÉ-Ðr|÷$ÍÞt}m'¬„L¸‘HFHV%“°FÅÔGܽ%(Þd%ÖÛ¨ªÂjš-ÌëŒ޽ pe1j,){Ôêµò¢5zg25Ìô‚é䪀óàw`ü&ð„­£cjZF³z9®1ÝVŠé©”Ç-]ù²X çXè‰Ï-°/#ÛÚ¸² CÏ+Ч|û RÖ@vÇÿØh-¯+}ô}¹Ê%5aàŒÌƒ}ûÌ;²Ž*+›Ž¿.©ð¥ÇmçÈæ1µX60±µ7Wþ¨ˆT³…zêRçIA×F)+ííÑ;m¤Qι²öåÜßX¥s1e¤¸²u…üŽÈ5U]ø\ÃHy‰Ü¦Î™R`d•R+À¬@”¬3 È’ð˜Dk†@Y7q\ Gõo2n² AØ…°(#æg¨É…¨ªLÕc²V—­¨­/%é-ƒ¶õ¶ ¤JqÔGÌ{ôŽ®—x§Fïtßc»%ê7ï|¸žÞ%A¹£ðÈÃróäè ­ã‘òhÚåÌ‚­s=–=˽`TCØJFó0°)1ïíD½0}3Wìe „߉€9•¬DØÚ ÔWÓ›– •[vƒäó­þ€wû¼°Š@ø¨ƒ“Éò'T,œ<$ܰJ4Yeè£`´KŒ|Â÷"+8a°L¸R$‘©Âdk²¦¶\TW®õž„ÃìÊ]¢å&» éQÆ@%‹4Bcšša ^+ªa¢8ÓžDzÓ!ãºÄ+U{².à'NDé­ÓQY•>&·vdÕþa„ è¼#Ú0{²gRDÕ¥ZJ Tzn\FP'øgoUœŽ¨Îx8â…··‰Í#*wÎ×àæ—“ɶè 8«e;BÏfìlfJUŰ=•D&ÒÎî>ã <†…^Á¶²¥<”¿)nÀ'„a޳}eÁ0=V61é–Ú_§ì0\æÅkî*7£iíLú<Ó%–)x¢ú8â®^*!íµ„ô²’!l¹¨ÂâRXìp›å#–(’¢:/nâR¶Ò®¹à2 +ôœ±ºROî{\.g˜ž¢GßëŸ[©hà1‡½Á¡½ªWо€Íõ¹b#ø5k.ŸÝºžãŠ5ˆbÝþÞä¼l¿õ@ë "*µ‘}âÊœtqºÍZb®.V`žy°HpG|¬™c C€iÂh挷‹˜' 1§à6¸¯ºÜæ–Šû¨s·Úav7>»!—ØÀ†ò3­D¹cun•Ÿ2%¤µ7kT ~"  ¶—)N›Mu½H ÎMÇ™”h³¢Å9D²4˜&{6ø–³Á™Žׯeì[Ìçx4ÙŽ¼1:'He§ø8=ÊÊ?>är=Ó:íO‹/{p?þSê}ìs¸Pj|I÷–Ò?‡w¿^j„”bŠí”"YÍ8q™ºK‘~6Ì}ióë©C 6˜x~ƒKÙ–É÷ ˆéEœã®DÑEéìóѵ÷[—N]Äʨ§¸"úú† Õ§…Züšõªöª;S¨öª…Û«Zp¹™Ñisϖܳ%¿O—Å\®!œá“.‡ÅåÅ Õo’_6‘“àòU1 =»%õ[Ênqy= Ïž©²gª°ºÙž©’ßc¦ŠSùš¬ü;Ì:qJ¯É£O˜—á”]“¿Ëï …¯Äu–ÌuÛåšœx¦ºBVsLFÇ7¥Sª*u¾>¥Kà®XÄ­ÌIxCMH¸d•n;LÌÿXhìWdp}$¸2~ µJNçkjRê"Z›×³^seïYÙº¾©«é¹÷ ¶÷ÙûÀLï³z¥»u)bÔªêï½wL‹E³ªÊ|Ã&÷àf5 S¤¶M÷Êÿ`ìîV+ÿqkìÙÍŸ—«Á®_¥å¬­_3ßH¡ •ô5UÙ¹o{é­îÂï1[rƧvä´h‰PêB&Ñd-¦~fOߌ“¾)Äe÷Ö_š*ôd Qorž¤£ö=QŸG]N(Zì°ä&àë—,¸ˆ¹ùu¿W˜*’­® è쟬"åÇ ‘­-Tšâ‚@â,¤Êƒ]¥q˪JÌ ˜ŒoÙìJPNU§Xr½Ê¹D ¨ Ze³­'kƒÁK]£ø2®)ØÞŒÎ’¼‡£#1×לŸªöÞÙòâ0â›8ÅìqQy`2·àR­w¶lÞÇ=‘¯W,|~{Û[­œ¿ÿÞ^ç¨û¸4RÄ+¥‘“nJ ÖTó\]€¯pÆ<ÞëÚ?8E]5ƒ†¹ù}‚—ˆé—¸/±Kh¬…LIÙòƒá÷~Y[ôQì4®ÜA£Ð3:hÜ[6p¢<¨dYx[Δ­1Æ6¸ê#a^WqÉõ¿ënç— çˆÕ4<H1Fp%Æ/S…Ëädc)OÔtm½¦±XU ›[/Ü K+œÃa³0º ª¶qE­!ª¶\i3qq',¦¢|ÃÕ6×—åäªó(„sâ6²ÊËU•7)+)ÊKuË2ÄËúrqõöÚ/ ׎fÂG¼·_ž5šÈM²áVYgßÕS dˆ]7Äg´òäÉ Å«©*_¾ù,L€#àœxÐ…¿ê7“ÁrS!&ñ ŠØÝÕ)GgûÜ€»š0.˜æ¸ )Y (æ¢mJ°%j‡*Û\2PòŠKüå.\šæØÊFáX¦µÓ*À—‚”n´*7+öpª' óâÕþ¸a"Å)i¯/:ÖÞ6¤Åˆ]ÓÆûÞ½Ô™ŠÝŒø Â×8\ýЉí¥Òpl9CzŠ6UÁ’0ÐVYT7 hŽÌBӒݵh,ƒ[ûa†«ðiB–•=é‰Ð1Vc›Ÿì¹7Aiô8õ3œ:Õ¨'«±¡suJPËt¯Íw!é1³¾åy7bC·'ˆ>êóÌCª–Ã']€D»¹”óÃ|Bó˜©8ÆlÝJQŽvÛr¬ê–>X`'pEvï,CáÑà;óQ-Zú7ŽU–áN¿7÷„.–ZaÖTšæÛ´k2ÇöûY4ÂtUÐóÖ #ø¦¨‡ß©ÖÓÈåÕQµ {E,CTßøž'EÕcöxø?†\ës endstream endobj 2249 0 obj 3903 endobj 2253 0 obj [71 /XYZ 31.5000000 248 0] endobj 2254 0 obj [71 /XYZ 32.2500000 246.500000 0] endobj 2255 0 obj << /Type /Annot /Subtype /Link /Rect [468.750000 220.250000 508.500000 227 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nspace >> endobj 2252 0 obj << /Type /Page /Parent 2 0 R /Contents 2256 0 R /Resources 2258 0 R /Annots 2259 0 R /MediaBox [0 0 595 842] >> endobj 2258 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 2259 0 obj [ 2255 0 R ] endobj 2256 0 obj << /Length 2257 0 R /Filter /FlateDecode >> stream xœí][ܶ~ß_1Ï2I] ÀzmèCÃúPô¡HšAÔÍCÿ~µ#ÍìŽ4ßÑð›CRšeŒÄÎÊ¢Ès¿ñœwúòÝ¿~ß½{úòŸÝãïO_Š}SÃ?»ç_ß½þm÷ãŸwM[í~øõáÛîÛÃç‡Ïý¿= /|yúKÿ§ÿíìîÏý¿?ïþö÷þ‡?Žéù/üúИ¦ÿý—Ãï]cú?§ßŸþþa÷ÛóŠÇÏ›9ÿÿïê¶+Íó.¾üíáxJsøõû¿=¼Îïõãš¶µ;SºrgºÒîþûχŸúõ«ûþ¯š¦.›â†ï4öùCq;c»bWºjöÃ/•ÕúÚ­)›PkûÖ‰qµ‘×Ãkëê#^»Rö§Õ൭ê`kö­ ’¯ÂâŠxížÃ:&^_VW_»+º*^ûÖɯxq=¼v/Ò,^»€²²³ulíþáUX|ßÖã?ðÏܧÛçﺲëu»iw!{WÖ#+Ûþ˜êˆ9­éMÑ[û°om /®ˆ×æÄn6ì2sÛ†[û°omñ:[ü³Ç"x#ÃO€7ñMxñýׇwŸLYôb¤Þ}ý©ßÛá“Ão_{Týÿô>D×?ýq÷}Q˜ò»¯??tûÚVdžxR<ÁwjøŽEOì{â;­ÿ®Ü›ëO>~í1[©n€¼ûq§½[zöÕÔ«Üñ«ŸVŸÎ,îóƒÅÜ9¯&ðCCp~·Þ];|üÌOï£ÑK[˜›d.ßòmáàHËÅGͽ9(ÛMñè†ú„“Bˆ2ÔWÂ'ÖD¤KÛÝ@—ø Âj‡ h L/ð‡å æüÌØ‚”$ÈeLIø¼kLå„Efˆ'ò&C;‚ǬSþ—m¶Ó¯ØµÅ|Æð3¶Íày,<Ï(—ÃË´ä\+ì Z‡ºö–>qXÞ2…X­„R@ ΃wÏój‹ºÙ†ÏÚm૦8úôؼ;û[ÜÙº{KÖc±ÜY|¡À»Î>Pæ’ïÅh±7vJdv Päm!Þã:ØÞŽiÿ{Š„gýž%×Û’\Y¿gýž¹„Öï à½áX…çÂ9ÈÚ©Ö²TkÓM³©«Ã~^¶9l¦Ý·]qþdDï¥'BÊ}é†zó—Õ†'Æì«²nû‡SB®öÎö*ÿõj~Ç8ÿ'x×£HÅç kîôø˜ eÓ’< õZSM … n´åÚéaÝ‘¯¡³QĵÂНàNðá%ÜÃÛ Áõð;o¿Ÿ‚˜7ÂÑ1Zjÿ´  ¯æs@,1=à3x§¬ PÔä)TpíTD˜AÝwÜÎ5pg8ÃC÷zq2—g3ŒY«v¬ºfŠÐlãß«P04íÔô5j¹ªV¶¶íKñi •Ï43;|$Sî­9çYkÑ;‚l0P£8$zL¿ƒß©áüÜÛHR—dPU³õ‡5ÞÁȾ Ô´fB-åG¨  š]SìëÆœÚ£Hêè×PÁ˜Ù"³°P¤:Šþ°ÏÜ߬\5Õ‚ÉX—‰‰&§«T¹?&1ÊÀ~12Òêaáû"D×$U7 Z6&¬æÁ¶| )!é¼t1•îT©Ì#î–QÙ/¾þ&¤TØ™fÅôã‘ßÒ•“B>IdÝ„16E%¸DL¬|&Ëu¯I銺\Š«Ü1.㦞~¢¢à¨œqqÊ•&7)ƒgޱ™¶½…5r?¸è5Ö-ÉÀ^Ǫy lŽnQV½¬ÜMIœ(;ñ©´ÃðgL՘Ě¯ÿ3r˜ Û2üA…^u…!ÚÀÙz&À¥Zªâõð ðS-›#N÷2‚j\zÍ ‹¢uÕX]O-5ánSŽ Xƒ?”ëÞ“© ¨RO!E°9%Çëxž0R»ë½àÐ8{—oâú¨º|ÿeÍ{¹ÿ’Sä9E~Áo8E¶?MÙØ©à¿Ïnµ!+ªnC•>HŒ»!\Ò½‡ã‘k ®³«Ü×§¼A¢c™Gž'pAÂ3öá†RMLތݕÉJ¹È²€~Î`aþNÒL˪èX—ꨎ$ É1‘= ¹¼ÂFŸ˜)¬khò8í„Íxu=[¤7”ÎØÚ\m’26£rX;níG„0Zé–|ËÆMв¯zCáÔªnƒ5.ëSY”‹©êä®ÐŒ¦Zi1†/졜NÄç™öádøI·ÃO©Önmyª“ëêóýlÓöðšÌƒç”X<Õ•Ù5îÖLL^œ“îµÚšOjà„éË õB:fro’œ-—Ûw|‡9÷®tǹwEÏ Ÿ0ü\`~&¤0UÓ23‘étŸå%ŸÒó35 ÃcAuêCz¸aª¢f†’B˜‰ybŽâÌ%xoø¨%Xãó¨ÊÞ5K±MÛûq4uŠz©jþôú#Û·Ú|&̾LŽíôÐÙ¦µpê˜å£?plO:%ô.ãó ó«ˆÉ“ºÚUàUݦ«ß7­CýtÁYŒG¨wÕõ ýÞØ ú] >b"SØG%ôD®òíÆ%ï*ÏÔ66ÏöKúhGzïuÍQ¢˜·vëÖD¦ØUÛpÉé2½ “úšâôÕUÜao\» ¹äò!û â“MFS׬¶Û“¢ie-°ï–üvu?ÇIWßfU“T®ø|2& ÃD„êe “o=­âu験b*¨V7Âb "ÉãhñîÿϵîïÍZN·§-¨8m4]€µÑ; ã‡Ê2u¶ÌÍnÆ–ÂOðjÌMõ,•W’]o[¤òHÕLYW«S•·MÖ¬™òíDmºn'&çú5dz™ž`i#Ý­ÁïÀ½viŠB‡V+­?¬ñF¡rÀJk&Ô2PðšDáà$ j¶*1:\Cç1`ÏoÁÃ1à‡cM¼ &ÕàI+é§ X€« $óÖ†P†uU¶1r'cÅu§ ì@Ì bæA1spç“¢°ÌƒG÷À¨+Ƽ~@”@K#»o¨ÄŒ;ÃPši¼Xò™†dÜŸé`ñÈf5Œ…‰âΰ>û!M'–T7m7U7Øݨʞ¡(ÿó‘íé' J«X|a³\Eå2ò™±’A£ÊXÔøj]è0CrG œ 1f‘ôÓË!ðg&èxZ)Žq¿®høçÁ#ÂÄbÙƒãŠ}ݘó ÛÀ¦Ú;ÿÎ#\mÐÆ½Àï”QO:ÐL²Ø!†ïßùHp{rÊöz4{bÆë­Po }'„P¿T°:t6ˆ¯×„º3¢Çdé¥| 5R[•ù)“/¸×YÕÝTÃn2:¨_{3B—°YÉÃ$¹ˆà­à8biŸÈª"R0p£‘Ÿ6~a…'¨½ˆ„ y³YAš¢žº¨‚ ×~š²a1U^[Ž¡‚…'.aYKzoYØGØ!Ÿ ¡ræ; ¥x(ÐHþ´ûZ$cV¶^„Übh-|PY×ëV S¹˜TŽl, P +üXd–°ŽÇÖí„!…¨ÈwÌ9éÝ-Âãd‚áˆßŒ×Ã$ž0Uh±Ê(?h1ñBxW›s$æð\ À_¨…)ü&¤ÃŰ0P ¸Ry W/tÆÃýÐ-¶ŽäŽR®rG+ìÞÒØ ?ßiO™^i×M`(ð6ör˜+)%ÉLÌD£ìO¹Š1²qŠ;®×§‚Ç•²á WSˆáïLNõËù1â ‹£—9΄{©«ka &tâAÇa· ÓÒ”à]QM%¸®*'¬Ú; Ñ199 øLý‚.’Sÿ^ÍÙu>BÖ–ø’†nhÝ#Q)Z†·Tª%YÛút…96Í»S§àRøG4·`ZKP£Eàw˜©k>)nX¢Ûö7øˆØ|ºëÑ·ÈNT"3¤·Ic%­a8Uo­Þ2V Cžj©Ì4dvu£g˜ñ•BËkÜÄBGÐ3 N‰ÄN-³tÅ6öü«Aåª\>Ò{¬'KæÍ3ÎÎÅ]& /‰Dª¦¼¦8bÕQb]Saò‡*—‰2™¤ùÕK"ÖæAT‚¸‹ä ºÚ^Ò^+*š‰£x˜h7@•X1›rÓ Âý>¹ä¥Ç9g•ã¨ë£šö¤×su£‘ŸGÝrÕtÝ"æ8êýÑØ:âµÖ´‹ûÉñZò¯ A±®9ÿjÊx­íì9J/ÿ}µ©Ë¢ºÁ½©ÛBõ8ÑQ^ïóF<‰ÔiL©ž'7?W‡ix¢8åF^+®¼šG <ÂŒ•1bÈ6Ó=2ѧXÍ7î£æ};[^¼Bu¸AÕ¹ò¹úDåäâÊ€‡z?n^Aá½cá“Ñ(¼°ÚñZƒ$Ñ¥Õh[3'èOèqæù¥]ß)÷à–à¥<Á'K;o´¸ö4p-«Nå1Œ®N„½èNÖ³›ÞÚÂOÒ‡n碆éºtK‹²ÀÙzûD—‘îʵú×_©ô(•¦ÒÃXp`íH°:þއMÎô‡Ä2FàI"MÍxñ ƒXÉŒ% ™.íDá1ÅÛj‰u}ƒ]å+XÌ´-¢í…°7‚a¨h Ô¦¡°!’¹—©zGLÙKR¤¶ÍL×LQH{áønÜm(«©G·©šL>#ØYUaÝkLš3L?¹ŠŒ ˜¦œ’Àõ^BØfDîÄ·ÒÌiØ@_ïŸè±aÛâõO~yø"ðv ¡ð¼‡sŠHiƒ÷Ûé&Û¡ºòÏ Á†Pv0wÆÝ‡Ó•Åñ‚]´šO~DžW,ÖÀ†hüUÛÀ 2 ¯«Æ3Ûw‚H Ädêâ™kJ̰ ÝFCɪ¸u'*zc=¤Rië‰VÑ½ÂæQa­«šb]ðð‘ªÃZbU”,ÎØÃBY°£°ªÇ8ð(aì• ‘„ä6M˜hcò²©´ S)å„mS Ô^i>;v„¾P«I¤ý¢ÅYÇdeˆÚÓX-î£ –{K 'ÏGkJ¿Í:DÝò¤¸*.B(̺ÈGKL ’ÿ„I¸÷Õ ã\^Q‚îÀ5從Œk͈§äÊõ†ù¶)ïä{4–%nBPÝÃ1’gR$Ù€ƒ\öº­ˆ±JLމt0Æ„÷%«€ê¦væjñÇ«‹~ÕLÇ: 3ðÂ5ØÑ§´ê‰U®® ñ8ÃÔ8”Ëd”“ÏTŒflÄÒša¯„Þ’9Ðip§;P÷:iÔ&O!ý,c¦.7e_{œÊ<gÎÌŒ•ñ–à…È1SåÈD&™:döc.öxP´‡—ÃtKÕ¸—c2â]¥]ä7ã é&aÓ]aÆšh`r…“wn0ä2Ÿ+Ì”û4nK¨tÌ :Úꇾ]Ëè5Õ UL 1¼ˆêñÍÔ6Î¥ŠÕ”»|^x'f—ϲ«Îwê×c“é}†¿ƒûÂ஀B/CÜ3÷&%úŒâ^nëèðW™rq?ÂØuwª³ð‰ÃôBô¾¤ºÝq½5C÷þ‹ÙÝ´r·ÌZ3|ñ®…¦¸'e¦¾Ôט¨OÀ#Ó©Ë$Ü'Cñ‘ 1ÕžÜLOâ•hÄî É£ûdÅœ*hQLÿ¸ó*¤á;°³ _"J‘ºènÀ=æ-] cl rL­€ï (Ú[:MSÇ\·ô$DÊæ†ÓÅè~|Åêúž1tº³¾‚^ÓÍ©+ç¨NüÊk˜Ë[Lä=YqZ¬tþ½fd’'`’ݰÔÍmèÞ¤‹T<¢ÓNQµC&U¤ÂTu¬¸¼:é4?[OôÎ}º=_±ZÃ)àY¥n¬ò¸dÈΦíe˜šîçÝd¬ƒ‰YY˜JŸ{*ð’gMlåïõYbÆQL?¸çãMÓ?E—0-d™‰ùn:ÂÄ0búãšyóÞâýs:1çò5§÷¿vßz–9þóÒ_¸Âjn/ÖõZ½0Ï6ÈaÄÊkJ¸dh ûn.hõßvoeÆs|×ó'cŒÊ·¨ŒS/¸ÐwÜRð¥½}OŠÌ0\=V¾l©€›5ãÑgÙ›±Ø\¾p ƒWƒïŒ¼ñ:ú«P&KpÏîw|®Z½mpPÃ’À8Xó `¨Rxm§d/Ì èœÒÞâ÷nÂUS´{3ð ipç¯,øE‘õy÷ùáÿRÌË… endstream endobj 2257 0 obj 5595 endobj 2261 0 obj << /Type /Annot /Subtype /Link /Rect [453.750000 221 493.500000 227.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nspace >> endobj 2260 0 obj << /Type /Page /Parent 2 0 R /Contents 2262 0 R /Resources 2264 0 R /Annots 2265 0 R /MediaBox [0 0 595 842] >> endobj 2264 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R >> /XObject << >> >> endobj 2265 0 obj [ 2261 0 R ] endobj 2262 0 obj << /Length 2263 0 R /Filter /FlateDecode >> stream xœí][ܶ~Ÿ_1Ï2IQ `¯í}(`x>}(œ&EÝæ¡¿š‘4»#ÍG‰ßRÔŒbÄ»^íPä9‡ç~y÷—¯ÿÜÿüÇþÝÓ×ÿì¿u_Ÿ¾î²Ci³ö¿ýñÏwo «C÷ý¾¬ìþÛo»—ýËîËîKó÷Ë®ýÀ×§¿5ßýo¯÷mþÿeÿÃ?šþØýÒñ~Û•ªl¾þzúZ—ªù.;=þüß»¿ÿiÿûqÅþuÝf.ÿý]Q×Jw1ñæ—]JuúóÇ·ßwïÚó{½D™ºÒù^å¦ù«Îõþ¿ÿÚýԬ߯žê\©²ÈËì†÷”úø¢²hÖÐõñ/5zÏéÌêòkWU¸µOû–‰2…r/.ˆ×Úê:e!žóââ Ï³L—ÁÐzÚ·0Dz¬ÂµÅÚÀ¦¬[ØÔ6àûÅ U•&Á÷- ‘©Žµ‘ªµ ‡ÔóâoT8‚9í;RáÚ‚H5¥jacÍX|ßù~õ¯³p¼ý´oiôhÅ‹ËáUeyÑBGëJ>¯«ËÃ^ép,¸Ý·4H:¼:Äk^öToåïë›Õå×.t8¼žö- ’¯xñCUè2·Y]Áïo‚XiC©Æo€ŽÆ@GFÇ}QÇkñXï£ý 0Æ_üð¼{÷ù(éöªØ?ÿÔlíôÊöËsÛü£±/MµþqÿçfG¿ß?ÿ²«…¶ý»'Ÿà Ÿ(ø$÷bÞÃÏ|€Oðy |ò=Qz¢á®|¢kxÒöɧç†~‚ãÞ–ý¹K‘©';EÛ̳Ó6wä8*;¥ªŽŒb@:ù!7­ƒíõÉ|?Ó¡§:Tuv:÷ëgìé‰9ؼ8nàÍ“ªýÌŒ« .¢Ñ‹Õ‡áòøWáò¹! TÂ÷à´—_™ƒÑ•ÒvÎGðSÆÿÅÝÍž%|áEZÎhûsÎ:(5±F¶c×ø²@ò¡?£fÃܱü|”ú¼äðÇ$¾ŽÝ3 ï æ£?Ð-ö•êq::ú ~F‚ËáË2ÉåŠ,«ì@f KL$˜æsºñ¯ÂÝSLQTJS“¸0Ì®EÙƒ}©ÌŸ.Dø4¾åò&x ÞÁx³øÄJÂZ"¾ »Ä{#ø„ðI5ßAÙ`,äŒùݘETËಪ.F²ê^u}L‹ÃEýÌÁ›0Ã!6ë`_#ŠÃøÊ%üw”…-fr:æ^:Îó~6Z9¦?ÂV§Ìl [_–°6 ÇAGì£Éq-§ÛI–Qkd7>wÞŠ `Ú$ØZxAªl=À³®à ÕÐ!byÅâ‘\}„ºçP­%UŒ^}£Gdˆƒ#|C æ}è+fÊrp¶N[‰(©+» D½‚J[/àÅ ÆåGàõ;Å!7+L—ž›•0õa*'n¦e  k ©oTîSCè8ØS·Ék)?éT¯'XgÄý´ƒéÀ!§0½Á`: xÞÁñ|çà®™[â€(–®ð<þ†¡Ÿ8 '}£lut¡R\KßÀ>l_àÏ01qh—y„I(ÇO,¯ûÈ^–9v=–9µšGÈGT°ΘÍLDE(Ø$•MCy87ÀªÜrLn‰Ã;Æì`~þ†¢ìƒ˜ò–‡Ï1å@8:ö !¥?KØ4Èü“,§mhuŽd¦ì§q¬ö8š~$_ULŽzõM®ÒƒCy N({‰¸Ø£±}ŽýØ·“„—PÙlÕ4¶y 7/a¬Û4á—Й½|å¿„C)c,al¦&W:YüŒÛc‹OÏ:ñª S&c “ªGåa÷Æ4K´­.ñЪ¿ÁÂTVͼCC—}Åæ:Õ¿X&¦1&ya3Xn ØºX5Ån‹ômÚÌŸ$Ìc{o•iÙε$È‘¦%[˜(¬¤²Å™cˆbTðu© ¨pˆz¾úîHÜÅÇ` Çq•+¦!&æ: Ž0 Df2µšG“þ?Z~>³ í ^{ìH6Ç´Ä {Á¸f~*…x+]Á²ÍGÿûèQÇâ ,,špÔ=A9*›"°E³o6ò׌ðÍm”å8+Ó"bK›Éý0 Á°ãÀ=Æ#|â€"vK`ƒ ›¦i`+×7`ËÀ»Óµ’êr?qÞZ×Wz}BdúǤs«ªè|ðË]•†My †YµåÖ%M±XSŠ)¬-n ±˜Í–ö†:ÜóØÑÍ×ëø}†ÑÂð®g,ÝQô=DÒÆ£ÞÔ:_àÖæ¬o<Û¥Gâð7æ"Lý)fÇï‰I¿E¹Iÿ7Ò?qË»¨êiºZ§îé//‡K>–Ù-6tÊž=á~XL—L/Ù¤ G/¢_Žݳ4dF©oñqÄÔj˼¸|ëÒ¼«Ê'©yyZR¸÷ ¡O94ºC9ôCF¯ˆ%Abr›*3IÝá*?Çyð­#zÝ82Ê/$;ÝCÜEòOßmcvÍ‚  3mßo–é7':ðÀ!“ }yĨ¸ò|–2fGJs‹DgN:°ƒÎJSC!Éä rÀ¥’GÖÔAò Cu„±¨Ç÷’p—Ë6ªŽ#-®ñEK#ÆC:°íáóZêú,ß?ØáMd|"^xˆ £Qz$†ñW;hÒÔS"–2bÓ~ôb;¢êÞ. g|áDºÅ ݬoäº8} Ûé.^Y~L&Vðãv„©† Ó•ÌA ³{cl!Å ÍD"œx‰í¼ù9y²Š1…VB÷ve¿Ž4°@‰á ºÀ7(Ò‰ï-yŒJü½ƒT0ðá³9–tˆ¦ 9È™!™SM S \Ja$¶È¸ 7ïør1µ`LžHÖ¨h¹ãN1B ï±™°ÜçŽsn¤É1:ÑyöhYعÌÙŸ†4*U>º K ÊÅÂf»ËfÜEcŽmÙdfµ¥F~2YÝ“N<]LÂôa2–’5¶#‰ÐX½dÅ;ŽdÕÿT³€œ¡Ô5HÌç6ð7Ÿg ß›¦ü8>Ïê÷ÂÞ¼ëÑ`¦×388RZOŠYq"޵ôò±–ˆPÂVÆ%lØÒöîÄhª²²JcpCBØ ÜÑ·ºÅmá¨ÁRD»Æ,^³u•ÕÕå ñkygÛnÀ–×{"¶ÓWJÝ4¼cñ–÷Ž‘ ĈÜØžS¥á{"´({sÓÐÅq/Ë+0·ÂT‘m?"5â0¥j3}F6Èò¡4dƒVzÕü烱¥ÖÊ´Qâüa"`²ž% û*oéò%VÍ!D>Uö^H&ÊÄäî£XY\¢± ¦E„ãÞί(’íÛ0ÛÀÁ’óL d, Æ„og’׃³Åh*æ¶-‡Ò(“!dE¾²¾hXQºmW!2ënÅÕC¦ 7Zú€È׆ÞòzRÍ W½,‰¡_(üâ«ªÚ ØU^Gè­Œµ'›m$Ì®–J{“­¥À%Zäx·ùƒD æÊ1}»=šSRN¶w¨he,þp_ös_¢ž–H÷r”·!¬&Å&"j¹ùL®)g $Û«[d@Ó9útÎ(¶˜‰8L-Ó’@¶±ÌÔɬº„Z ?ëìØÈ3±.üˆÚ•ÇÊhç °„äމɺ˜¥[¢nEÜ›“6‚“Ö#¾OÕ,‡èó´u¦ 61š²$ kx42¡\oÁ* ßbR]`²ýÉ,P>þ&’Àüœ€ÅäÓ™šÑ¿.§)çÚùÞ¶HSc¤`}q8.Ð`CçÙÛŸüºûê¸Û˜‚;–¢åÅg†É´Îˆå iV4úU¢Í+µ{Ù·¢NSj~†,û-Ü$´¾åºM.5íU8›inêáÇúlc战~!æ.…E1wk®§×X…ò×EjxçÐÝ'øq¦¥<’z•­–s6‰²Ö𨦧VÇJ¤‘5o˜P²Öe5”¬K VŽªÈfzÈzýð %ºe —ŠÅŠß†í7¨ lkÅ(ÄŽ—ÏŠNEy‰àq;7‰6ÀeeÝùêj¨íæ»ùwj¸'Ý[ޱpæ'úQaÔùMz4îÆz.ÃjCÙÈF·¥Ò¼e«ñçÇf–khÞ ~¨™Y=_ó˜sí¸J²Q³Å“g*%!ÕT´[7¥æãl¬$aí•Á6†ŽGä!‘lA&¢ÇäÁ17Œ9 >Ϩ LV±ŸßGÖu•Œ ìµë qý óU´Z—Œ¾2?H9î»ynX`·U,÷¬H.“Gòì|QĶ‹àQ;7NÙ4”5Ù(ó‹(Ì5ÉúÓbEý×Ü]"à%Ó}¶Ïù–; ÉrYѾ¤YˆÖj;î;¦NÆñ·|~ëÃiRwÒ_Æh­]cÅëWi,RìÀÃÓ7»d)s9’ŸOu·cRðÉǘ‡?ÉCcÉIK/±mÝb+v*Ž[q°°G·ï¹–]Ä$ðµÁ&±l(I4bd|hHw¬.ÊÙ>G|w(µî$¥IïKxW]~žî´|Ρ¬ûÈ'ÈxO帥²w•ÑPŠi­`’G¬yT4Y0Ä’}šjÈ?ïõÚ'ìj•ñ_0éÀøèëœ?ÄLšä/LóAÿÐt…Êö#Ñô'ˆÕù'b:/úø6-fù ò•vR$œ™ËçªËTØb*“y¼xk±²¥£õ„}¤»bNâÈÚÀö<†’ÒnB°d:‚íº§½ >áfåD0ÃéšFq{ÙÄšM ç1¦;ÈâyÛIÍ––3z•ƒwyŒÑØ‚s±ƒs!«Ÿë¡€ÛÂ~‹sç×P…V„§Õá0þ$EŒÓ3»íë6<²”LŠgÛËŽFÕx’;Üžäž?ù¦+݈ƒ-OîDZS ùð †oé¿…ßC<ÁÓP»Æ0Ðð=¢uDÜ禫˜rÆ[ ½ñ‡×'6qþP©?Ìàxox5ßCLÆÔ—·)²ó[cÅ< k/‰êJ¼*é„ï €÷b²âcŒ–E¯˜ÙC3AƒÅ’½Ù¢sŸ¢e¸Ê^NÆÇJ´én…qKsQC=™æ,!eJ9*ŒÿÝ#ˆ5…î¹VˆÅtS”YuIð×4¨81ŠÃØ ”º +œPΰ"MÕ(xuï :JO° ?CìÚâψšŽ÷`JÄ…Æ—c5H½ØXÁÔ‹ Ž]·D¿'(ÛñŒÑб€ß#JŽàÕ0æqüŒ9¼Q?ÀœÂ@sÖxoø<D'ŻƷîÚáðƒ»v𠆪žˆ99¦†Njq4&]NîgӘ΅‡BºGžùó‡+ß@ ÂÉèŒDÆÎx†?ÉJ ¢”¬Æ«á'©èº'ÎÕüÙ¿4,ÊÉÁ¾Lý ˾ºÆÞLcagǰ”ÝŸƒ¡–sÍ´o±Z^1g[©£ú”U?†B1~Ò¹Âõ¡KVxCÙí®9„>¢÷˜)÷ȵ½}îNŠò%°K9ÝR7«º£Ø]œæ…ýWŽ¡ðjð3gByý Ù²wü¾Ùqhëh…ÌÌ" U ¯Õl ÝÎ!íM¾ï&\•YuPí/«œtö–¯Mñ´ý—Ýÿ=i½b endstream endobj 2263 0 obj 4782 endobj 2266 0 obj << /Type /Page /Parent 2 0 R /Contents 2267 0 R /Resources 2269 0 R /Annots 2270 0 R /MediaBox [0 0 595 842] >> endobj 2269 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1409 1409 0 R /F1700 1700 0 R /F8 8 0 R >> /XObject << >> >> endobj 2270 0 obj [ ] endobj 2267 0 obj << /Length 2268 0 R /Filter /FlateDecode >> stream xœí]Kä¶¾÷¯ès÷н€ À>ä`±ää¬ãFldâCþ~4Ýêžiª?JüT¤¨nyaÏz¹¢¨b±^¬úêÝ¿ý}ÿÏßöï>~ûÏþ{ÿóã·]q¨ËâôÏþå×oÿ@7‡þ÷ûº)÷ßÙ=ïŸw_w_»ÿ>ïN|ûøçîwÿÛëýŸºÞÿõoÝþØÿ¥—¿ðË®Vu÷óßÇŸm­ºß—Ÿ/þ¯Ý_~·ÿõeÆóëúÅ\ÿÿuÑ4æe#o~Þ¿Rýöý×Ý»Ó÷½DYUWU÷ÃØ½j­Þÿ÷»Ÿºùϳ‡Öªî¯Øº˜ñžZ¿¼¨)ººí&êþußsü%3»üÜm«¢Í}\·4I”©”r¹}ÕEÛöÔ1Fœ>of—Ÿ[›hûzZ·4Iú}õL.¸¯F'êèN0ŠÓç2{ÚW…6÷qÝÒ$9ï+ž\p_kÕSÇtd§ÏevyÚ›¢Ó®±öõ¸ni’œ÷O.·¯¦hÏ'ªêñù´o£W£m49|Z·4Iú}õL.¸¯¦ê5 Ñòúõuö´¯âÙM§uK“伯ƒÉ¿L‚rú`Ô?{üð´{÷¥[Rµú©[Øñ}§O¿ììËÿtv|£öO?î_¦þÃþéç]{¨«²Òåqy§‘¢:Ž4‡¦-œ‘Ç{°æä½Ž|>Ž”£uýŒ†³5§‘ /V§¿j¥­šújäƒ; ~^½E#º…³•hIÃïÂ/Æ‹ÅÅ#xãà3ÖÀµáU>ÒB©ãˆ2ç7¿Ž˜ðÍ6j2eU1íÆ8æóSw´çKe t2;½ïÍ/ýÑ<®æÆžÜQiàlŸáȧ‘÷ÑØơsp!¦¬ÀaW›ðY0˜YñÉÂÂÎ†×æ!d‚Ó•Våj-JRÁà x6ã²ÖZ„ܧ6ó->õdÉ©>…+ËØXåªU½8²ŒúÂK²Ÿ(šº<¦Æ”ëÑ37FŒÏ”pϸ6bÄXø<W]Àgðˆð÷´ ù²´×èÖJÇFÒ¬´6‰y¾À璘 W•a§rœÅg >c>$Ü­VŸA¼RLy|ž0}!ÿzÖ&{¢1¿àUcèpI˜R¦´êâS}JøV“Z'æ,æœÐ•p K¦žƒºjæåñÅIªÔ¬T˜p8_í+ÉÙ<\…9Ÿt|šà.Pkƒ+0pD–:=’Aà6LZuè9? àƒÐHìÃñxð3%ñ ó=žK^†ß|є釦]Y[½Š¤GQ[†I+–ò ÓmUŸßzŸ±Þ -*»©Ø…ÑŒey[¡¢ÔÁÚ-gäèœG„Q­áÙîƒöaü†ý”týC´mªMvF’Ž¿?CЀ’·÷f‰0ˆæ‰ö'g‰¿NÙéñtà©/!­=Þm˜ÜÉLÄ”)¯IÕ1 ó[B­Wj›ø»sŽ£{úŸ`d^ø[Z3Îó8Δs¤`ãØõvÔe5«Üf£KÛè«ì$•sL$gŠnööšce#0R{R™KxDRjM5€Pm dSý×ì•#®4», Þ–3û½¦Õ/Sé³X¢/8yÕÂÀ£xWEáêC¤I@Y/Æ¢Å+´  õ§/6DõÊbk2½*eòS˜:7cNaøÁ£®3D @«‘(ÿÆi$úƒ¤ª( µÄ¼„ùˆ^Œ{¤ se.‹pÀ«Ó³øE:—-Ò“ :íúù„.ôl‘DÉle[1J‘Ÿ¸†;SäyøâÁÖŽ«‹³’D…¿yqN§r¾ ˆºç˜žËœŽÅœ<*ÚŒµ¯èµ¬‡réQ ˜¢ä%B1Ýž ¹V™ŒQÊä>$ºèd&yeœVÑlµ”}=j[_SdCwCwʬ®ªñïÆØ0©º]`ä@ü Ó±@7ÙCQüL.­ÒÆ#«›r_âsOá„á=!úKÜ#ªaSØ»EI(Ed1»°Dðð˜MHy=O’¢<ÆQIC; ÉÚ,)¥_S-Ñ‘¤™Ð›ØƒaGX L+ Exqìð{”ú­jæH˜UÚ@TŸ%̱pãŒÞÝx Ôô(·¯Gt‹x†J9«ôt1·hx/ŠL9™¨„èlLWé±C»*\Ó$ß4‘0U•%÷ Ÿ0÷ Ü( ›îû'»œn CÖ1æâÂ'&À*.Œ#V¶x°ÐÅ#F-Îæ_ t÷Îðr±†IÑ\U¾ú£¸–ž l"ËÍ.Îß̉Ÿóe^;‹1ù[Óu‰‡r‚øíQ³ƒ—biS¸Ï–J9¦ôKdìEÌ2äöŒ)1gro%:­Ì©©Îea.rS®Q¶š0òôÈh"Ç™rõe3Ká\cÆÆô@Þ«‹kòRÎËæ eè QeMc‹2‰,‰RO< ‰i0K¸=Ô™' ””pÁ¶Ð×ß )¡OG.ØWj@ÉQö|8Ôøë3„çÃ]s¦¡¯@+  ç<\ŠßƒO\Æ»Eì‰,|k ¸¶œhˆw Sï # EaË1¨5%E hæ hä<Ó[Úº™Á±3(’æëÚzš–/£cz'åzJÇró1àøk¶Ï„N¾g¯ Úžï²”jÞA|)¶%(Ûž±?mK€{,-lËÚ`ÄþP–9Cë;³wSj·òoíaèûXþDÙžc.›Gƒ¾•šÓ´dó×6í-/eé­<4ckÂý)1uˆ/ex”²(ñªË„ÅÌÚáÌýéÊΊoeá WUsã­Ý¯ýs7½÷í_Çþ„›óæfÅ™2‡Îîè²×_W¯ž¤q}ã锤¡úˆ%1ÔHÕp¤§‚>ôÙÑoNýTŸÐ{ÌX¦Ñ­µ}é¿uÅw¤öuI\¬ê?}ð½ŠÂ $øóÆg(<|¦M*èÓßx–á^~ß­ø¼ÑeøF+œÛƒéYÀ|D,€©Jíkã² ¼Ÿ÷l§Ë{£ï›µWuÑÔé¯6 'd©·rmL¦í¿îþà?ó- endstream endobj 2268 0 obj 4843 endobj 2272 0 obj [74 /XYZ 38.2500000 336.500000 0] endobj 2273 0 obj [74 /XYZ 38.2500000 336.500000 0] endobj 2274 0 obj << /Type /Annot /Subtype /Link /Rect [192 314 210.750000 320.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_features >> endobj 2271 0 obj << /Type /Page /Parent 2 0 R /Contents 2275 0 R /Resources 2277 0 R /Annots 2278 0 R /MediaBox [0 0 595 842] >> endobj 2277 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F8 8 0 R /F9 9 0 R /F1409 1409 0 R /F1499 1499 0 R >> /XObject << >> >> endobj 2278 0 obj [ 2274 0 R ] endobj 2275 0 obj << /Length 2276 0 R /Filter /FlateDecode >> stream xœí]IǾóWðÀt×ÒFR€CC`Ç Ûˆ’Cþ~šì&gXͯºëã«êb³%Ø3šÖòêÕÛ—ïÿøåïûþwÿýË—ï¾¾|Ù‡º,ú?ûãßïÞþ@7‡áû}Ý”û~Ý}ÛÛ}Þ}îþÿm×àËËŸ»ïþ·×û?uÿý¼ÿëߺþ8üÒñ~ÝÕªî¾þrúÚÖªû®¸|=þü_»¿ünÿÛqÆórÃf®ÿý]­šÒw1±ò·Ýù”êô÷¿?ü¶û¾?Ð"ÊšºhŽ_ì^µVïÿóÝOÝüçÙ‹Ck•ª+[w¬SëÓB¶[C·ÝDÝî:§¿2³ËÏÝmîÓ¾¥A¢L¥ü“ËÝ«-ÚòºhÅáó:»<ì­)t´¹Oû–Ép¯žÉïÕ”äË:èËx×jUeŽû†ÈùVáÜ‚—j+ïR/“G|©šxsÜw¤K…s ^jY¯m„[½ÌòªâaÌ ²Â 9_+ž\î^Ë¢,{èmÄáó:»<ìKS×Ñæ>í[$ýz&?4•®»_høý=§ê„‘bu%²Ë䮣Y´¹Oû†Èù¦á܇ÆejÝýz÷˜¹lÝ}_›áÏ}ð*›x}™<ÂeTñ´ ~ß‘.ÚûsÀxýO€‚þÍóÁ÷_wßêvTí¿þÔíë´^ÿåë¯;{üG§·uôçëûß…ÕØýy§Ô¡´US—§ß;ïO#í¡®ÊJ—ÅëˆR§‘ò`t£®FŠO§‘æÐ´Åõg¬=|üÚç¾£µàhrŽV¼œ–´‡î‡åùa¤í]Šö4vÑ-:@¡áH Gð,¡vð"\Õ©~¾ª“1¯l> rÚÍÛC¨ h‹F†ãͦ8RÇÆ7­íl„S^]y1çç÷fä#|eL?2ÏðÂê½;ÉâM_4îôl\x4 Ü£öÌîñcm Co‰µJ@Ð#°…K0€ð>†¢Ì×çÀ÷2á ß üUk ²¤¥ò·ÖY)Ì38q\GÑ~¼Eg ýd(P2Bºø{))²xÏóÁ]ôætCpåùHË&¾–ù\Y}˜ ã¹ekFêW”,Ïa±`ˆ_Æw.€êá8 ³Zˆ5‘ñlF¹è oÃóðÛ‚ÔÊ|©|ô ñ¹deTŒøâ>Iœ˜aóYû€ªq5ïºì©F]_Có–ýŽ|@#X½.ð:&|ÀÃ|h.PïሼŽyŸð†ÛjúÜp÷€†¾à»ÇF EŒcx/yßV£Ê;n‹Á¯NCÌö@cÄ$މxg@ÞØÄgFÀ<šïÛ*M6÷(ü†1Äß=Cqn à:XHtRüf iâr­³Á>¾@ù0)¬Zõðgh•³Ÿ¨ö÷~Éê,Š$3‘ƦTFGÊÐËÀQž“¸jkã ÅòÜÀDÐF¹!²{ÛÃ0>cK6ÉcË+69òÎÇ›–Snª…~R±kYû,ª¹TŒ£äáxn# ´1@]LEFâSª „µÊ‡ tiãêóìxŒ‰ðRñ”¾Ö\¾å© ±kÏ»ÄÀŸ’^ƒ´%mÈHe<@ÍåS„PTN¥®{n›wœ­pâÈ(y3]`Åwã3ÎÒ=¼ßd¬/úàwY•ó!K.’þ.k)ÄÚ&ÁûЇfÄ ¥a³mä grðt梈¬°4 Ï ©HØdÆòìa^Ÿƒ±œŠ-´?íŬP˜!âŒÓ«EáG™TR$‡P(@ª¸$‘hlQû¼G5' 30O޲u-ÆŒÃ[‡úRdÆ›#š Bé$&È>¹E{>’‘L&EiÅodË»,^Ë“ `ø'Ø3“„ãYÇ}5Tà–D±½3}A‹s˜¸:i…‘Q/X‰ik­ŒË5 ­‘ñÕÈFœ1^œAU¼… ŒÌÍHð úÌ'²ÁXÉ #1ú!F ÙˆsÆË6ßjH1“Ååœ ŒO#1tîŽò \œµû#VŒ9U´.èFv9Lõ˜ÐCŒ&‘yU‘)Áx7d}?¢F‡,nÙåÕ–q£©“åa¬Ò[Ç7#ë+ãh•ÝÊ8Žõ²E™¬ªî)Ö˜óȾn}Éãm5©K?nE7{Èë"uIÆú˜Iº°Ÿ‡'âÂ0!eöÐX’ij7¦¯,§™*K†¹S–Å=R†xná!ƒA~d˜ò<G1ßÃô’Ø5ó±T›3×Ö¤Šò‚ÓPo{O©ÑUò³êžÓeQ|Õ꺽ÞO|;©¹T#§*W‰–« "ÈjAL<åÙŠ3–ÌMÊÙ†T ÿˆÇØ+›è%Òd-À{Áxž 2.ä*›VÂe b9d êˆR\&kÑ^ž}…¹7ü,Ày5~÷„rÀTfdr« &Ké€0ÍÙ;”xTv¢Ûˆ¬;ÃÓq‚0NÈ: °9!• „©Ü›Jõ¤ö¶™¼R›¼â«LÇ‚à›Ê”Zeò™Lha€ž(ÓbBJ.Ä­#œh¶îêP[j]B úéRëbæXàƒÖX,ï&•Q6ªzKÇ[[Àw†¼7¥Á¶—æb›a3#¼¢ãfFHgFyé-ÔÖ•vžú ê†=hÜí^±sÞúÚ’U…KÉžÇS–—%­™ð»0•„´˜ûJHV©jÝ ×·É¹<é&L ið™:.SM:•uõy’£eûðæ˜\²Õ›¤Â$¬¿²:cY3¶j­-€j¹²<"-CRÕ}aX9@`!€É‘$†›ê’ȳn6ÃÍ›'¹n¶øpì]|D6å©À·À$ãîâø¤ø5b|ƒ8ê9)~§Ä[ð$©ª„¼í’’¹ñ¶·m¼-Þ¶<<&w]o[%ϱNóÝè\b+è“¶èHuWblÎÅc· OuIô]Û,_ éÛj›ÔúâVÐçùZÕ©!Ÿy„ÚÜS¸m+è³i³4€4¸ì–ß^w}Oé¸<ʛԭ¹ÞOüvp½0è^0 j7<-eZ9‘}fÒá}+NºµU ×ÁŸ©àþ ÜÛ VÜr"¶h¶õ´Þë®ÝÁ#×xèûPªZÍ Ý[.Ó! ¸C6—DA(õø¤ÊCÑšë⮆=>)}š±OŒSÞC6^N´,Šz´:ó5ŽÝb>ó1|×Lì'1ã°ªÒ¥L¼˜DöU9 ¡aâ¤DÃ|“Åc‰²bÙ€iŸ€q‡÷ÌÏbö„pÍB9óÙ'âÙ˜Â9"ÆÖóJ•îZ¼_Ó¶7ä™Îÿ“½õpÙÂMµ.ó"˜,ó`<ˆLì£8MŒ+ÍQ…D«PTQ”¬¤"а¸P¦C”L†È|D°w]åFä8™]©9›²Öcëh”s4\¼ð•‡¢1h)«á áy¾´$l[šß ÃÃ($ í-Ô×½èÕê3æëþ…ªâЫʣ³–=2¼CŸÑp„™mp¹ßúL£YÃqÆÉ‘â±NfS-„†ŸÑp/p„Ùuëê`N¦ç3#z…ø‹x5=Ù±Q“Û RTuûèœsÈN~=ÑcRõdÍ 6#oFÞc(óêF\J6!) lK$û1€ébh1‰‹¢!º9 n©…#ª!O {Ìv›ç`‚fZ§A0×+ýG)þLŒ©›Ùã9z@ðá5 I¯ Ø´,õ%½F(8²’!Rÿ×J¬MN÷ÓßpçS‘¸æG‘T3<‰¨Ì)ÜxRbÌ9…®]µ24µçÅ—«æ³XîŒhCÖíý6 9Ú7Ç.5™RÝžvÜà8"Ü…J6]ÙµD "Ê•e??U¶’Ë´‚Ų.Q—ŒB³°ŽZMÁ: 籬ð¥4Yá»,šs­8ÜÁ×Ò÷ô`ú+1ˆÞvöœ-—… ]3ò.Øxo: ž”¸9O?/\¿ŸéÀg#p”ê†û¯àà>/ àzní„] JUœ;ÍxhZÆ/}{µÞ]ã½áׄoà›Ã‚ßÙ#¿Ú°¾,¢=$×ö‚=¼€éÝw-ÛÓÓA ¿F¢Ë"Õµ ˆ Vm²nïgRÖM#GØrVOÓiõ1e,ºN–ªº§؆}ëÓâ2ÁË×r£‰ºöåÜ wyy;¬Ð…NŒ™÷r,µV‰!’EÿÇR[3¤ÙiyOîîÏâ’ -­S÷ß8¬c3ÁŠvë…~ £R÷BσÃsOßì”Ö”V|Õ‰€±ãž®XíN³² ÞD4•eúxý”.KÉÆ‚µ´qQñi¢ ©ÊåÌ$’pBÚ¹H4Pñÿ”[M› »âgë<ìfaœQ”´˜LÌV³IÕØ28)&, ‡.ÞÏ2U†Õüé¥õ¢¶T‹`Lñ–ïõ'‘EÅ<(*…Uöè¢e’†~·= \\´ Óó$UÉ™T-šÖU-Šb6V²óˆDÅiE$cª&r"ú#SM«Ä­xº*Ëçý„^Ùc0m.ˆJ¸[éïõ¯¬ô@Ê”[™ëÞ2y!ŸžÀNltÃ*؉‰ØõÏcñ:Œ¹Ÿ T%BX=Ÿ!v]Bˆ.ï0Ã{Kä ñÚD‹aƒÂ<»&Þ'(c†5¶ŠaîtÏ:¢xàÙž ß ] BôñͶI*ÔP4¤‘º9 k¼7|¢ž“â]Lh‰‡î`è0XÅ$qàÀMÐÑIù ,ÕèÉý<‘,…÷ö4²”-Â×ñ$Ö`ꀡOêyg?d¤áà0QÆ@”’#ðlDÊÚÈîñuJS__bü@5Ù¿Ua0>EhM¥\äyšÐšå­‹Œ{?ÉcÐCñžW´X3Èh=åÉ¥jL¶¥Ü{HÕMŠ©¬¬,ªl¡éT$~FC¸yÈüüCÏõ3.=æZ¶&s¢IÖcú÷ ï¸ë#ÎPtp$ 1.óX¨ Û€'š1;»ÚÆeó"=±²i,\Ct~÷n*è1UࣉŒš -¯ñŠt—‰¡w­#ÓÊ2 ºlkHYþ-Q6ZË PR†b”í9¯ÿ1«Û`÷ÁÚê¥xNº¸™U¶ÖZη3¬5á0¦ÜöOS;k£.9`<®í‡ë>§Ì`¯ÔZ±|mQrÆr•  Zür†õÆC½XµQ—¥.÷òÐîïþ[Ç,½¼ôóÔ/̰'67½†Ê ul”µ×ç,CÈë-;[¿ïú†²ß߃>è“z Ój<2Ôzч¡Q×›W×ïà– ûZÇL¹2nííÓpÒQ¯°Š`‹¢}ÝR7«†£8¬Ø‚$7Ž¡ðlð3ƒÝFýMÌ‹pÇﻟ/º ¿h…Ý%Ì B Uê^m`YÏuº¸7¹Þ]wUÍAõ¼º´whÑÇtmЦí?ïþ8eT endstream endobj 2276 0 obj 4919 endobj 2280 0 obj [75 /XYZ 32.2500000 657.500000 0] endobj 2281 0 obj [75 /XYZ 32.2500000 214.250000 0] endobj 2282 0 obj [75 /XYZ 31.5000000 659 0] endobj 2283 0 obj [75 /XYZ 31.5000000 215.750000 0] endobj 2279 0 obj << /Type /Page /Parent 2 0 R /Contents 2284 0 R /Resources 2286 0 R /Annots 2287 0 R /MediaBox [0 0 595 842] >> endobj 2286 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1409 1409 0 R /F8 8 0 R >> /XObject << >> >> endobj 2287 0 obj [ ] endobj 2284 0 obj << /Length 2285 0 R /Filter /FlateDecode >> stream xœí]Mܸ½÷¯ès€m‹%``=¶äÀ°‚‚Ýl‚Ev'‡üý¨[ê™iIŸŠ”º‡6vg<œæGU±ªX¬z|÷‡/;þã¿ÇwO_þ}ü±ÿúôåPœ\YtŽç¿ß½þ®Oý÷GW—Ç=|;~;|>|nÿÿíÐ}àËÓŸÚïþwÔÇ?¶ÿýrüË_ÛþÔÿÒù~=8åÚ¯ÿº|mœj¿+ž¿žþÏßwüíÜãu¸~2·ÿþÎéZ_f13ò·Ãu•êò÷¿?þvx×­?he˪<1ö¨«ÿùûáç¶ÿkïÅ©±J¹ÊºbÅ8NŸrEyTºii®ëÑ8—¿"½+ù¾££õ}™·4I”©”¿óS]õà÷ÜÐu;nUèóðª>ƨJ©ª(ëÄóÒ»<Ó+SE¨nÞÒ$éÊÓ¹ _­1=_[,NŸçÞ#Ðþ¬þcõ}™·4I®|Å òÕÕMGó ò´¿ö.ß·S6Zßݼ¥Irå+î<ªpº0ñ €Óå•-íâLé]¾okëh}_æ-M’^ <Ÿjk”iÁžy|æoY׺ýÞ™þϪU•êÊv/ŠÓì¥wù¾«*šQèæ-M’+¯GèO¤û 8Ú|ó|ðý×ûO픪ãןۉ]Æë¾|ýõ`ÏÿhO3UyüúÓñû¢0O¿?~ýå Ô©´UÝžøÎ¿wi)ªKK}ª›¢ÒeñªÅ^ZìÉšîˆøÒ¢ágžàg`oºA½)<ž›è fWúñk+똨løØ ߀‘ª¾ Ûœ.³¹Yn1°å#jéI2Ñ¢*©…ÃU7v°jÌT]‡ )#Vª€ŸéhXžŒ®U˜ðLcágðFÅãtÔ©—ìG LìBL|eˆ–næªÖ^ZŒZ¾t¼ ¼t¼À÷ƒ=â†E§Dë½(¢˜Já¢qßÛö$=ÐvxzP\=;ˆÐ"ž}7Œ’ ä³GôðÀÛ}ô«X⺤ÌULSíK'±\ igBíK¬½±ópó˜Ð¬ŒÖ÷èi(ÚÄ#:ËyëáÆ‡pËd]ïò¸ª\l±¤`šãYÿ°ØtÈnJ<%kÇÑFv§)êÝñx•P<ŠÓö¦ñPŠðcF[v¤¹± bW„¡_ˆY©ƒHå õìÞ| ,ÒP›x$gDaf9¢Ö,Š ‡ñ<M4–Ay5„zÀî¯Ç414À®9£Ù!hÐóHÔòêrVô<Ä•uòDíã¨è¨yØ ûð®ÃN>•Ä!†ö€ŠŒ2N£77?»P‡öí|Ãð§<ðòÓ;Gè7eÜØ¶+/ªÍ™úÖ¦…©‹¨¥—öíåS-µ<«¶ñ8?ÀÞœõ{Øò[>ÁqàÜ<ëyŸP’J7;OK–>ôyh  `éƒëñÌKì>äÒUkä’hÁTôH9æ#§„ãh¬y ™¹yä~kRÓ$”ЦL,Ós Ka ðg<|Õ—©À3€öÕÀÌ…„2V+»F^zµ1Ùv¯²Ý/[[L¼ÜÂXìÕîÂvץζ;Ûî¡T8•mw¶Ýqe¬Y%/ mwÓþ‚ô¨µ?ÞTöVñL]\7Æø:¿1eOZÝË´FŸ™”O]Á»sUÂqðg*Ø‚?çÖ+ù©°`ƒz³:œÖxý±}*ç úµJËö ß6ˆ¦â¤Nžy;Ù¶ørÑ3ëå÷Eráx}@Ð?Õ%=OßøÁD9×2¿æòðbÞÖºj¨Vds"úûÇâT9u«€;U¤ÊSјÛq~€½uJ[ékÓÐ{˜2i!ÝáE®Á ç?#âch;iÔ™‰U«®Û¸“åóµ¯5SL¬N½iMsê35liPo×ò7¾ÿ„zëwSëå_fj{µBY…S+…ãhØRˆ9Ò‰…ÅÅÞq§¦®ÒÓ£÷§¨[AJAº3sSg¨;58NïNŒƒWê™[.㌄yz•~f¥ Á3x‚-s3ˆž„TÏ÷«ý9xÊ8GLrËòî=)¨¸{&Y”È¢ÆIUCBxVL’8v½©cÁ[_7è0 °ƒ$»TYå28”©Ó ȺcN»8CW–LôòÞ[¨¾([íÖ¼¼!†\—a@rÉl?œôŠM¬D¨‚ɶõŒ³<¹6réV@y¨HeN?¦Ðe+‘e¬Œ'‡—![ì÷ –ž3ÎÓH_0evDÖ·°ïÝXªÂ¸µ”©l`ld4S>é1àÄvðœUJ8QŠ’*"KW0UìŒe (Ï$¼'ÙJgj²EÿI<»á ç´æ±íÁ¥¼e—BcG-®ãäá.\V}ÌÝ©l "6¹Rµ#n“3Ððí>¡jÑ %|yFHt*çɳ¬NvxxLÏ€ý%Y¨!-‹ÀWbÌ‹þ$q´aÎËð3L‡ì&%€1¡VY…ž:¸ß:5t÷Ó“8?ï=îe&ÉmìöЂpZ5“ÆäÐ1N€g|*$™ ‡AT``¯Œ`Pž$q¢ó`"S˜Ý)w@Ð<Ä ÿªÚÎ_˜å¼†Í·uõÍbE‘§(@ÑHG¾Œ,q$¦‚~sѲ¡Ï—Ú}¼Ù˜ÐHš;s(¹øÃwv"˜G›»G€‘hÇÀ‚9øf܉øf×(3Ø÷±sD»†ß”z¤C–Í6–…ÞMª`Vœw¦8ïû´v§0ê$ÕA]ô†g7Yèmn­Ýb›;Kݸ8µ-S5Àg¶%&I’tóËüÚÌ¡Ílh²¡IJƒÈöékE˳žÅE³-1£ÉÚªa<+nPu~K³ßëÁc×y0ò¡z¤xó„GåA†*àJ!á¶XÌíR"Â13ðHÑ‚%Ä2È€:\B æ\"äºÜr¯-Üs¸ÅÓÖ½ÛóëøT˜ƒ¼>H'œ›0à8ÌJ=<Å+ŶžÀ˜÷Ì ÛF¡ð}12'áïÈ" 3rÀ ÆâlëF/ðh«ë[&æÑ® |öhÅ”BöÕm /Š>Þ üRŽhUŒ™ªJô™LaÎÉ‚vb|Å€R¬ÔiX@ Íå€"néÆX31ßž)ÌÐFm_ •@–7¢”Ôƒ=ÀÅ`sPoH‹àRŠ”9b‡‡¡,ó°FÀ{BÄCP©@ì°w`«¶¯˜¦g;I²iç– úÙ³¦VC{vWø: ÌÔÃ’ËáaC—Êf¢ž¥™ÆØËG¸…dˆV#@ÎDñ"Ïæ&ƒ„Âç*ÂŒݲÊÌ‹ïþ4-ãÄêþÁñ‰·®aœ%Ø-Ý­aFÏ’$Ì–!Þç±Ì£ÒFo‹>Û r•E…”eN—G9ì!çNYLãG}½3%Ì‹­ª[ Î) ;[Ê´![—ó´Â3}°òêíƒ2ôŽtRU†ÞÉ-lK.Töí¹\¨Ì­4Cïx½€ ½sÇÐ;e±¦¤èÑüÉíázr’§¯%ßdÎ¥ ™#—^ +ëÍ¥õhÓXJ{…HYò\Ö©­c¾oÞÿ}sÙ4ó´"¢Ÿrh/ •ªWpøá@2äP†?íC—W&5Èn†’>÷ìr¨*«5ò²‹èÊ-(÷\{–!‡2äüy"CÝkŒ0ä{yY”)Ó%ªÁwƒ,ùiÛ¶å–À+âÿ1˸L=˜'…n€ED¤Ô’À„b…(T¤„s?´Ñ“ÖÀßq(@Ѳ[/Q½’˜! ƒÝ Ó¦4jhTÀÈda°°:“Àš €*xx˜EY°5Ƀ»€IÌEÌceF2”ʼ$¦ðùDÈAíü™åê€By ¼ÑdFŸ€²Fh…˜ÅD4snhï œÇ~”"Ð|ÐZ7úvWîòª_á¹áë^Ü‚¯®ˆÔc|m³÷kcŠ;à½Á)€˜ O^䚨E\4„¯qs‹(4êMRŠT«žú‚˳-iVW¯)¡Ûþž’8¬ðE ô½ž÷”=0VƒI—ßÜ¢Í&‘'Ù¶XSx±÷}oõ๦¨Ôž¹°Ï¯¨öõZa@ž¢páo/Øzça¬ÈÆí *ñRG8ã£î!úógqªœºEw„Šx«_ïJõµiÕV§îÁˆµ°Ü-ëÈx®6õš*4ŽhæJ­v·ÊÜã £°™¨‘’g⥉ð½Eû9«TØàL,\ö*æå–Èî€ìk"oÎo”}¦‡qH°~M•Çäá¦õÈ4-¸'9Pþ9šÇ|O±Ðfx,dÐäÍF¤~íà}A]VS3žôl‡º@eüd‚?Ôµ/!oÔs_ ¨óf\ߎº½%ɦ¬ðº$Aü®iæ§y—ª(UÑ#„IÚ2ÃAY³\&fãð†Œed%ò”rü"´{I‡º÷Å(CTgénáñqV47O–!Êx²„~Øìñ-&äJ¹3>˜Z•jh|· ÌRCŸ–ûвÂr…2²,Ÿq³ˆ´1M`“Ȧ´Í&ͤ¡¢S·â”ŒâAàyµ†öïñ[;YïZ>Ïý‚}_O-Ô´6´Pg‹©Öíf§ Rë¶›ön­úúÚ݈ÇÕ¸¥OÑã’×¾ê|J7|@ã˜9ŸwjnŸú•"§Û;4X¸Â`ª¦WÃîÝŒvšX†Â½ÁÏôzK-ýU–+pçïÛ_]†3Z}„^!½¢™‚G˜YÀœÀã`aaDz@ÌZA/°7ßë¡äÏÙðpœÞCµ èŒzЉg&×=½ÉJäòzÄw2Ô ³ã­Ò8®¨Oª[àêÁù‚åkë> endobj 2296 0 obj << /Type /Annot /Subtype /Link /Rect [93.7500000 723.500000 188.250000 730.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_exception >> endobj 2297 0 obj << /Type /Annot /Subtype /Link /Rect [406.500000 681.500000 456 688.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_throws_typemap >> endobj 2288 0 obj << /Type /Page /Parent 2 0 R /Contents 2298 0 R /Resources 2300 0 R /Annots 2301 0 R /MediaBox [0 0 595 842] >> endobj 2300 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R /F1700 1700 0 R >> /XObject << >> >> endobj 2301 0 obj [ 2295 0 R 2296 0 R 2297 0 R ] endobj 2298 0 obj << /Length 2299 0 R /Filter /FlateDecode >> stream xœí]I¯Ü¸¾¿_ÑçÓ#.Ú€ €×90l ‡ ‡`&“`03ˆ“Cþ~z¡ú½Géc‹_)J–Äž'‹"k¯b-ßÿñóßÿüïáûwŸÿ}øÁýùîóSulëêúëpþýÝËèîèþ~h»úðïO__Ÿ>=}:ýÿ×§ë Ÿßýùô·ÿôáO§ÿý|øëßN?üÑý£ó?øõ©UíéÏ_.ö­:ý­ºýyþù¿žþò»Ãoç‡Ï¹Í¼þïïZÓöÍyw¾üõi8¥ºüþï¿=}=ÔG”më^Ÿþ0ö z«ÿùÇÓO§õ‡Õ«cg2­®íéï}cÛªî:}ú{kÜ/òÛ­¾|\õ¥ûóFúÑ·/¿eV—_»iÚdk_ö- e^üØ5îü;÷éîüÝN±¬ºÃ‘õV©öL\ót½n®h1Äü0bn«Ë#½Ó ê²oi …OJP­Uz‚êêÊ¡¥¯åq~[<=5•J¶öeßÂqä„×N«Šº6%¢Û„ˆî"ºMˆh¸vZ±Ñ[›^lô•®®Hi++Ž–çÕåQÞ·Ú$[û²oi8z/þ)b¼‘ëO€%þ5ðâÛ/OßT¶:™[ÍáËO§½]>yýãË $õé?N†duzúãá÷U¥ì_~~ꮇ&yò=©ZôÄ4ððÉøDÁïøäzž_NxMŽ]°‚çÖ¾º‡ÇP„ç®4a¸ƒêñÓ |Ç@Üv¡“÷'ý™ßH ¿SaªèˆÕ WØú°Á<ŸàeQ!Ša9=k¸#…'…2k¼šÅ¿¸är{5HÐØê*húþµ UêXÛ¦këItÇ®¯.;õE¢=Zsf>ƒ¿S_ž˜á3#2šxâȵó!7ñaÇÝÖ|®æèwêø;ï ñ®! ñw˜Õ„Ñ‚÷v•õÑèNÍݵñ‘ —wL=õa|@ŒdL¢ÄÄ@KƒÂ ’ß%ÀC˜‘ ¤ªâØ,æW¼Ù÷H.˜AC÷ÒŒ'ï`¼ñ9lÄrø]CÀ“&*HˆîÄ ub­jO)Ê2¦ˆì |øíllăMYá¿Ãp±ë\ÚXX2ZÒAs„9ˆw•Å{ØdÀòË<¶qç©1b7*ÂÍ›øD~²Ûm÷EoBEÚ÷¯H¯ÁVeÀÏÁ¼OÚ²ˆÕçÔÀîÅ#áÍbyТ4ŒÄì ¯Î½0ÌKŽP£;5•Ô|VRºÒ/Ù÷N†5­šk ŽMHÑ@ˆÃ§íÀf ìås&Öi˜Íѹ, õ>µsÒÖ 71î¾PU)?&»æÛmßžA›ŒÃî>Ä'ž•ÊÐù&ã,R´;Ú¶uã‘€,õ c. ç É6R…”b[q¾¨§ŒºùÜJ‘¨[jkà‰3)¯˜«OÂ; ˜KÌáiöFy,Ø,> 3˜uEíæ<ÂW*™.Gá QæºJHûÂU iî·c²žóâ¤Í~Ô6õl©†9 [ Æ&U¥kÊØôw͆8sœ<áè\ YW¹ b0Ë‹¦åöj)à ïF®ì£êc՛׫ᛠ«PWú8_¨3O‘¨D¸+æš>‹Ûž!ˆV›»6£ˆ+Ê(=lyÈèal%c^c$R²+Dz¸é=Ú°/bºÙ¯Y\âý Jí‘T[¹¡X²ã)Å(pE$1>­½Â@Ù£ö¯Å¶à Ì¸';1܅߬»&³º{ùƒ%nÉÎ[x-dî5Wp±¶|š4•ܽT!‚¬—-œȤnŒdLbß«<:_ýɰ^” š§uš™‹=Æ:¾Îµl¨D¸ôù€JùŠu VΞ¹°(@e«ÏˆpPà6›óq[ŒÌxð‚%âzqÉ*{q-—¿Ö´Œh\Eî¹1ÍM Z3¨æèìÑÑ6'ÞÁO\Ðwb5×á¤#n?Ñp•wðÉGôD»ÕìÑ7¬ÐûÎ?‡A»Ñ«UèIàì ®a€¿£>À' Ä%<)þŽ&NªÝI»ñÞð ~0Üð\õ¼V(] Ö poxµÀ®!õº€cúh|g›×ŸÜ^Œ³¼tG¦2™I|aòž(´D”^cchëù.LÒd¶8›hV-Ó)#ù ¼|,9ûyU29}f¬«qyÖo»ÏýHqM\4Ž¨Ž H "6Jiò’µJ.Ç6‚ y&›Á>¡’ß±Ÿµ³+ýí(}ÑúëÉ­ÕHnÛžØ#í 8͹êÌ—¯0Y6w.Ð(Vé¦ö8ÝÀ&ȸ g ±)lX ¶T´ÕíR Å!ìÕ4÷ <æîë涉±Êqšµl/- ;Rª:—¬õŒV*«}~2UR†W}x~:6©…k²dû xÃ*ëà¾WµÚLöÑȘu’ekÂw{t·GhLÉš;Þ¦µ ãÛE» †2T­)*óíØ–¢Ùå1úœ/½MËkÞym¯uý|^)&Löhðl˜xî’í O‡óð»·3\¬!f‡\gL^ÙOðåOit¨FÑY~¦ìâ’Kç3ËÐ\]›p33E»=Wb>>4øÇ)ã¨uëQÂ7”ú°!1‡(‹)SMëfÓ{´¼»Y@ü«Æ—ÿ iP­!#Œ!ÆÚ“˜ò#[jL…_˜3²>æ ¦©|5)[ÍüíÝ!Š8¿‰£7ÂÞÞš2- ¾ˆ&([¦·¥¬ã)’»º§•ÌX"³vV2&~SUc=—Xg3ÝP——1™ÇL\ÀR`&ó1½Õq›j†yeSmDt,Þ¬„<. ŒBà–âÊR$gúxééÃHÒ%¹¤‹’@2MšJÖæÄjÍäcQ~/.!qjWõñLÙ®YŠqï¶Ÿ8YŠ”ÝCìáïi¹ŠŽ !ÛeMÔ´e&F^·U¾ —6·X=ŠÈ<Ê€*ÄÖ£ƒ§ìr\FÙ:»ŠÊ¦óqZ VkÌæ;E‡Ä}q¢™"1¼%ëMzN’¨à¦MôõmsçP‘sà>•ð>Áy ð;NªO=«©~gW@àL ¼7axcà b!-÷€ÌdÁç©!–Çœ1ð ÆÞ5~çýÕòpzÛm”ÓôŸ`úÇ'Å´ w]áó|;2­ úïÛþ¢Cìz§ÿBè¿«T³ÓÿcòŸ —þ‹¡Sïôÿý[œG¾Óùôß“oV]‘åÇ-Ï3Øg0¢%Ël2ç©ZÉ'Økð&–(:ø ! ¦xÌs?|L#êõ.…²ë³Íq¤Ü ¶KçefÐ2lcËD/w-°<··ÛH#Øþ§èb8€{›"MwCIô}žÓuí§ ÜÝ`ÀºB$°ƒoʖз4šÍakqýàa#; |âÞnyÿh÷÷Ê>Žá®ó<8&WˆŒÖõ}(®Ö^ÐÖ0Íã uºŒÕlYU…V˜×׬ŠvsSm)+x{åA—i²ü ¦yQS DÊñÓ&—О©Ûh‘ÏP´oØ ÔSêµÞxâd/}'“ÐW]“°Î2ö¥;’&6€Uïñæò¾ó½S¶áo[ßÔ^¶«{Ûùöìòh0É;!tÖW ”%bT×ø\Ðh™*±â´¹>)¹ŠÞVªÈpõ–…FŠlÍYÿ¶{d §nV Áo—÷ D«FLx@©” þ”&cG‘¦ùÌ%<Ó5yXÍÅwêï‚~«MdÅÒfÙX´mÕÇ™j*Ú²éŸD…{XS]Ÿˆ€b@ôa¹ÀÀ€¨Äð5Æïìܨ\½k%§T^]çi¯$SŠ6·wÿr7ë7cÖ?ÆiIlï8 lTȯԓ¾ WÓ}Tâ‹ H¯aûë¼ÒYþánc%¶±2„ê!ç,pŸO8‚T æÄRÔUÚû·Õ{HYuY[ÒÑÚ'_æ>|•㾨±8™RNc‰p¤d›Vó–LâQÝHv”œ‹š·$%iZ™òྂ4»"½ã=n¿º©5ËÏ­Ó±èÆl!e¦j¤Ì½êFþÓ>Îb—_í½Â€RVÍòÃ$ærX8÷V)ëðË'ßîõÇeŸçnýqZšbˆm9ë*˜SÈ;ÿÐDÖ¨kó5è‡Jî–¸,”-`Ž&o)þ«MãÑÖÿÑ.eß# øß²éH\+Ù‰;®á|mo;Å ðñ@RÑQEÌøLf×7ÿ$â<®)0<žCǹ²ca5Q*un•ô¶Nl3•[˜¨¼#\íEÀ ïÍi?\!‡í‚©wkÜÀO#i꺿{MŒ¿ d×A ¦ˆA‹%ã~—Ä!I¬˜*^ÂÆaÆØïRµðó”!;Ûaü'•çŒm|bm€Ê1î‰ÕÖI/»$IbÜià ]v–}bô &äA ‡n³d-™l#c^rjfêEuBÌu[)‘ >nÆÇÜ á‹Àˆ‹Ñæ Û¿J;Qðœín}e¯¨s5¸'² dÍä.DHQ`À…)r<-2ùEt­}-–-Y|ñfW©ûÑÌOº#>¢ø‘¸¬¤j¹‰ZjÌêšÓ¯ãä3¾Ú' ÎÃÔ5F4×JÜ™¨ •ýŽlæJÑÕ¬™,þåcn!(ÑyR•Ì8GµR)PDÞ¤l– 5o°¿–ï{Å%Ó ŒQ²”ÁŒO:¿F¦#QĈ‹JX3¥n¹æ¿5õPåƒ*7›`²‡›¨6LŒ™6øBE-Ä* U{Z4AR#ëéü¬õ>;@èùøýv`²C ÈBoRË ÝŽðÂtÃÅÒrT#Q|²õ1ÅÄC¶Y;tAm)¢ÒW–b"ª‘™þóé"ñì9‘zÙ8£*]˜ñ…O140¡ìmêÖ“½øÆ1ÀDtFØ5“åºL•@.aÊ©fü&úe:¦ñº­±Ó6åï3Ý"ñ;DO+äÙdð#Ÿ‹íáå %Tób^i.ËtU†I<ÙÇîîŠ.˜&4mÝ ¶ÆÚø<ó½šÀµ¨l† Ñs!ɘݔIÊ×Z¸3LÌt”7$#8‹±é¶¹ `%×,E¢oÊøF>×oÄ •Œîí­Â]Ãügæ ÎÚÔQáÊsÜÕW¶Â„©PÄU½0?="ß¾JQw‘‡úžkCqÍ&®b•Dˆ…ïXHåJkˆ{¼·u> ô‹ÀõÛWnvÍP/~§àÚžÍíºüóä‘Ä·JÓì€ôÁ´î9a ç;çš&)Ñû/¦Äcþ¥nÉ *)2¢ „Žp·pþ ¨#ÆäÎ|(¦'do¾Êeq®>¦ÙI\åñ(AL©Þܰ—.{­ÑÖâÆ¸ŠÒä9!2M‚çOƒ“½@ÇOPMÞ’bR$—Œ!UfµÅ §EâÚ¢–¬ÎÕèV"(‘w¶üÍê@Rn{OI2e‚2Ã3 âÑ%Œ‚ogË}éš!ª«¤Ù6rÕ#NyÚêg< !†D"èL¤ÿG¦ü™PyÎóm1ª”JÄÔc" £åeñÅäÞ0ÞÈÆFaPÞˆhÊ_ ª›ÀiQ’2¿Å(O3-?¨è4íD*Ey*—#ã®Ü€†Ê;J[•CõºˆHDb‚è¢qjFçÊÔ`d‹ð1B_$®ÕËÑËÃt³5j.£gc~Tên\:Ñ¥>DéÄ€é…EžÄ¤pê~œ),¦.µÜÚŒ Q¨ç ¬4)LTV¶3 Ö/æ uW[ÔÌïcÀ$sPnúÊf$j7‰ú™²w’ãI2ýäñÞÔÅŠN¯ðjp’öà#6>Ħædk´~`6žû ÷äºÈOÍãÞÚTt Q¼ë:báë¾ò(c$€EºRÄdyü'—&V³·Õ*uYîYÎ6è×€#½qÔw·ÈfÔο ®‰Ï 6Š˜À!Ó}rTlƸBp³Øp°ªíˆ¼\‰\šlåðLxK6õH6t~ªz€7$út-ßY§¨Fõ¶n|Q.‘¬ÅtUÀ© 1õ©œ)YψÑ.~ýDÌ]P¦1ïiÓTC3‘h‘È"‰)¢P€úN„’ÆB™ÉM-òß;’¡“>´®=}°Dp$‹À/¥F™*œˆ¦k¢?F‰Å’øá«4|@bIfþ˜xb-Ôì„c²®~ù^—­‘#.wmoÞeÆ Ñ¡þÖ ƒ¹Xް«#Ì$Y9¢ññ=»3eš…Ë[|F¶hc’æ« Å’Ñ«VÚ`΢•1óÅ&Z6“'.$Eð™¼tÆ]"L.Æõ‘ fËé—9§¨³MÛ€¦î;O³iØ“'}Ÿ™FµÞnûLÖX¢[4IÕ`Í—Tº‰ì}HD¶ƒA¯Ámq²ªhêâjNä²RZ¶*Œ¹n–m,;Ï›¹.! ww4¿÷½ÃåÒ/ˆI)ÂvÓÒÒƒ‘¨JTá‘#"=Ö2]Ydl„ÜWõ­ólš‹ŸZ Wp5Ü·†¦1n[ŠÍé@bØÈR¸3n‹‰sBXšºÂ&›Xãóté²Õ@Q´uVÄÞ vóòâ1ŠÆ,¦>¢zÉ']^rY¼ø#7\úg~>™jw!OP_€Æp#ã‚å@nˆ%«ßÇ–R÷a%ÛôÃ7 +Ä*éf@D÷ÐïÖdŠÁC2qª!¾S1ï¬SVà]‹BÔà6ÿ¢ÛÄ“ÀÞĪÓfHÛÝÝO6í†é³ üÆ*ì [Å÷®E¢èÿ*ÏCIMû%1O–#¦ ìuÆRqsr9§ ×5PENé©«úúåõIžÓ+C_ÂtaºÐÍ-²"ñö=æ|Œ!†W ‹Y¿!tïãmºSËœ.N*aŠÅRŸE…-ÙávEئڽ}"êo?רF<œ1§>1æßÇ`ˆ`J`nƒ°|À²‹á[|Æ.eü^Ì„~d<©¬ÔW?â/•n;šv°á˰­lÙý¶˜äèÅo‹+ÙXi¼{ž<´üÒMmÍ(ã“n7t®¹ïTiÁZíDÿÕÚÔG}3¦¥füÄAAO´ò½î`ªÖç=ú޹×tejoÝIQá®#±¾ØÆo¦ú'k¸| ŸXt …Wƒï8—BEýEÐ%¸óßO;]Ç#Úu2žz>Á$àú/O•¼½ñ=Â<Æ¢ÂUS`$êÄîr ÒE}GÝ›>0u|Rü |Òw½ñ ~0Üðlç¦M̉†‰ýE{ÄË¿¸`g¹º­º£ºŠ¸Wì »J»'NÞÓ~‡OOÿ˜±ªb endstream endobj 2299 0 obj 6190 endobj 2302 0 obj << /Type /Page /Parent 2 0 R /Contents 2303 0 R /Resources 2305 0 R /Annots 2306 0 R /MediaBox [0 0 595 842] >> endobj 2305 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 2306 0 obj [ ] endobj 2303 0 obj << /Length 2304 0 R /Filter /FlateDecode >> stream xœí]I㸾ûWø<À¸ÅE¤z C€BCCГÉ`¤2‡üýH–ä²)}”øüHQ.Mcºª-‹ËããÛ—wúúã¿~?¾ûøõ?ÇoýÏ_ÅÉ–E÷ß±ýóãõ²:õ¿mU¿}?¼_O‡§æï—C÷Â×i~ûßQÿÜüÿëñoo>ü©ÿRû…ï+lóóß矵ÍoÅågûù/‡¿þpü­q˜®_Ìí¿´ÚÛ®bfæ—ðKqþóû·ßïºýM"t]*Ýühÿªµ<þ÷Ÿ‡Ÿ›ñ‡Ñ‹S­…°FÛâŽy¬l'*d3†¬@z4ÏùËè‚l+U´±Ïëæ‰PFøg{KŸ¼²±¬«Á#‡.b oýº£X㱟ÆÀëè>zú‹çÅχw_`6ÔÅŸn–vž²ûñܤlþÑhçÍž:þ¡YQùÇãó¯‡údd9¬pî‰Ðè‰þGƒOðhE>Zñ Îcà;>ðI çÁ«~O€^5\e?¤S€°.>Ã'ÃWíY›"`åäðÚðùÀâý(|çnÖçç†öD§Õ¯”r71äm8¬ð;Zƒ±ïÍÐïÌØvrð…ßÁw&!þ›¢œß…Za¼ä¥Vòpmb’$À@¨¼úNJ<„Þ©‚üŒ‚åž¶„4ÃßU'¼Rßq3xa¥0õ%È%z™äµfý”pÖJDÑ ¼ƒž³ƒô?ñPiŠô 1Ž$Ùcn€a€y |âY5AÛõïÚXõ’$i,æÖUb½ßSŒÖð‰n„3Í€Rày(÷Ÿ)Akñ¬špÚ}F⌡C€Þi ©%¯FÕÏ“„¿Ûb^ú&Q;Ì 0M£Ð ÂÚRiÆ-WksWW€é–ªñ^+æ®xÕ¬8êÑSØ´t™uÑ]æ²¼R'cEeËÑQé“V]ã뺭UîyW§ª.ΛzÝ‘p¿ŠG­Ð<¼€O Fë/ÎÔ;Ýõ(OJVâö žî§ç'Þñì÷Ó‹WSkë.Ž:•Ú´G;•– ±PáO< †àò²r¶á†,”(ÇCA^¼Ñ:àöìfjIp±lƵœ…ïˆ:ýNã Hª2Qõð%‚îMÒþ1/ÃkÖµ9›[LŽU)ºl‡Šç´îœòK`¢ƒ§P\2em˜ÚbÀÁ4<·OL™“Pü3'H•0ÙõÈxx?¼h}ÁƒU\ Ö2‹å2…ÙöQˆaæ8Ä,HáÑ÷ˆGx œº‹Ö˜z†Ç÷–p¶˜c9ƒ"éP¨Þ)åXèúNDæ[×ÕbæK¹mž!#¾˜¼@% IobI,WvD&GðªÑ~ 7ì¡…ŸÂᅩ·Ö”‹ï?á^zVýÞÅCüUL.1î©ArØ Å`ÿ†¡”×9Ì/¾RL0¯E}ÏÚfÎPTÛ`é0IŠÌOIžõЦ€àD7'í=ÀŸ+J”ÕN•Œå¦ÂüTÓ¸&HØp`Å[®«“R‡SÖ9ÎjãÚٌõ2¸qe`Š2 ZÍz^‚Ï\Ø2ÄV6ø>g34ŒQÄ<¨€“§üp¢âwë—Ò–¸PçF‹l7+ÅìzMÁç°½fM _«û!ßQêêö¢î] B•ó½kAlo—)e+°ŒO±ÍîÁ×Lñl¬ŒmÖ)}¬æQC„…þ6Ê<öt™ R¢ªŒ¤€xJn«ÃcnŠ›˜A²íÅ$³t5Q|¬ÎnJHðšQIui\&•]XÞF&*ÜÇ5ˆ¢Ö®.¾¯@.…káíÑ“£_& ¾d”D½¸"ˆJfJ3\Ù À5Ã8Ú¥™HÒLN!B»ÌÁlP¤Pu’ížbkZ«…/÷e¯¦,(øÀ°Õ¯#dÉäÍW`¢N­=k~ižìó¯86‘jJ8%7õ‚#@˜ÙD¾VW`o¹jŒu¯è*ÆèÚ [‹sµ=µ3}¿ü»™¾*ŽÆ´?¬çOMó Sž:ͪ>ùv0ú$D-«‡o©›QÔõÍ÷û›öµãíÛe]:s´Ÿ4ïܬäü­êf”êvŽ_~ˆtQ«Nt7Åà¬ïkô‰îëßÓ£!Y,øZ(D¹ ÑTåVdº9û¦H9-¦Bl*&ÔÇ$㘄YU%¦DjËéú˜†‰hVY5ƒ8,ùŒ¢†-O<`)üçh@CJÀÇr·?ŽÉ˜=‹õzÓdz¾á¹ xƒ²MQå:Où.5Ñ(y£&¥¦ÔDåªpí'#5±ý–ºE]Ï1¨‰F‰ 5Ѩ‘*ªŠ‘šxþVu3Ju;G5Q]Ì90ì/›Þž9Ir]R‹’¶{OþuªlÿD8»w bõV¦¤´Ù$a«\G*ÅD‰'ÎÓ¡j‡ãem#\”·lf͹Ô‹XC0Õóª*¼+ÈÀœqѼ]ª.Õ²2D‘ìdXÓ§Ä”­&窙¤~ÝÒÅW’_8O” ?AwêAêðPÊý­VÕ‡T>3€Ž¥­¶‘® Æ«r(/RiŽDNÐö¼v+u¹ôd9à$”þÒ‰z&é9xýkIeÜ@WÊÁI)ø¸à{?Ee Hô=]lSÄY¹£øXÆiáºö‚ª¢Ü-˜–JâdBK*©wZâ€D«G %a¸Ë“DGläK]¿aòžŒšqKá ’U"!›Q5êKe·c…Ì9œ„bìˆR„%î]²rÐWŠ*0žãœŒ{éòË]«JŠòŒT•uÎ&>>¨Ús›ŽñYwoÌŒþÒ¥$wTºŽ‹bº¯7ÊBôbFÚYgΑÀ©‚P7HÓÚ|½Ô4ÍîœJÓ¸VLŸäüz(wèª‘Ç W+IÖì©¶ƒêÏ0ÌãZ£¸@S)PF£¬zµfœ„žn¶NlJKp[Ð=rh¡z¿ÉÈ¡Õãá7Ð6j3)ã2¢Õ‘ÅÓâ›#t‰7ðe=v“J¡Ä¬sÚ†(”5„ß±²íTVÞœ³)vî¼sg.îÅžµ¤såòÓT·aí£JU•O,Ü oÎi/ð˜<¶ÚÃiñh…0–ó|J½—Ùî µ˜ßF+Öö#‰ÛÅÌÒ.%e’tU6™÷œJf`ñîo*÷ò Rµã\‡aêóræîY Æ\‡·p:K5¨‘ ÃÚ(Wcª<©E¤$€@­Vÿ7:³4}×…E¢¯)Œ Ê/.«bí·²)ÝÞʶ¶7ÜÊp·Éî6Ù0¡=C«ÃxçôL€¨Z¨(]54À*’q<„î+ôI çZš"‘<˜¼-@° Œ Ka ŠÕj¹-1q‘Œèæ2Qˆ›Î°Æ|ñ̃sX׿›6Ýihý­H¿òªÞÀ~¨räËK5í·^ b€ˆµwЫ½R@±W ˜Ç±ÚÜc>û¹'Iv'ÅPÜgÍ2½V#­3å„ Þ£vðÚ›¥jck±Ëmån¬ ƒ0A¹%\2öJgãIÉHTïöŽ*Þ‘Ë!tѳׄ1ˌѾlÃÕ:IJ@\<Ë>Z RË Þc\Î>Ká­Òâmˆ7¹¾À ʽ ŠÁŠX¡¨|epa‡–<øÒ×+¿«ŠK­Žn›SŽúh#¿BO˦èß„a:z)‰®hÁÕÖ<|†Ç¦*^Fj׺v¢HÂÙeý}…ÉF÷i·”,°”Ä”ðJãR¸õ{¬D—ÖT-]<Ä’(kÈI8ã¢(l²,$²¤ÎIa°9בºór¤P8êZŸE®ôd¬C7ö-á'ÐBLálo&öiV½&—²V¹pÏ¥=NT }$-íAA.ft:²2 ;ò•à™ƒuβõCö'—‹öN1[k(uš!^c5…dâí¾0ÇÓP;ß¢`Ê…]Ê»øñ€’BQ0uÀO!ª \wSHü¤Þˆ¾5X|k½VCw¥‡³Ö¿n-Uò')udyi»d ½÷¼ÀGÉ ¤àé‘J [a­vÄ™^—¤áÇÁÚ@¶NÔFzš€ÇoÞq='oéîüs!#GhÈÒð[“æ23íÊIÙŠÃ ŸåmÎmþ_šSòâÓÜœr5É[š½¢=™ãkU,µwÜÅNìµ²’¼GWÅŒŸôb–<õ˜1º¸pãÄ> endobj 2307 0 obj << /Type /Page /Parent 2 0 R /Contents 2311 0 R /Resources 2313 0 R /Annots 2314 0 R /MediaBox [0 0 595 842] >> endobj 2313 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F8 8 0 R /F9 9 0 R /F1700 1700 0 R >> /XObject << >> >> endobj 2314 0 obj [ 2310 0 R ] endobj 2311 0 obj << /Length 2312 0 R /Filter /FlateDecode >> stream xœí]KoäÆ¾Ï¯à9€gÙ¾€ €µÒÈ!€°r0rÖqÃ6¢ø¿ŽØ3ÒüŠÃÅ&g†»°¥Ukº«ë]ÕÕ]ŸþüõÉ¿~O>}þúŸä[øúùë.ÝYÚüI¿ûø[îÃ÷IQfÉ·_w¯Éëîy÷\ÿÿu×|àëç¿Ößý/±É_êÿ~N~ø{ýÃÃ/~á×]aŠúë/o_«ÂÔߥ§¯‡Ÿÿ{÷·?$¿f<.€9ÿ÷wEV¸òÅÀʯ»ã.ÍÛßß¿ý¶ûÔìÔ"&3¾ÈãOLåmòßî~ªç?Ξî+oL‘û"°NaO Ù*M²¢³ÌÛ_•ÉþÜ™³³Íý·2FŒË8÷¾ÌÃø=·ryX6·õêޔɬܔE ŠI» M¦ËûôêsÛ¢(gã§7¸Õqrä(av=ÒÖ˜ñ ~lZécÿ4»>ö1³iŠnm” “ïKïŒ+læ4>Ð7+K[_¸ðgƬ)ç£õûì3ÐÚÛÙ,N÷L´îNþ,é›M³Ï|^ÖAIwÓEž½AúŽöfÙÞÙÒœ¤X”û²JÏ?ã½ÖÖŒ–¦µµ@¿÷® ¶ÞÁl6`Ò}^˜³M‡­wÜÛûˆE[ Õ‡!€°×ÉáH#½îHÃ#ü †Ù)Æu£ÛÊ÷ ¦hz¼u )ªd âÜ#'c´·.L_B0mñ; 3Œ÷ÌȨÌTÂg0S1 O¨ƒ`ÌM¶O+w¾Î÷p¶Fo{zWïˆ`æ3ÄÎ#d,Gð3x`”ðl*FÉú>ÍmÍבK&?iaïúÈ›ïƒMê€Ùóëálœ­‘ Stì€m 0~_;Mùe#Â:G/™Ò¨M³N±¯Êö~ðg˜uÒã~Ú@¥>ŒÂÙ0„Ù hClû8¼=Að~ ÔÁËîñ9œ câ ïÔT}2ˆ7Eµ_5x—·tƒ®Ä•Ü·k†Ãt¥k FØñÜ"à`h§3:ú!†É³âFk ÆÓy„Ñ"²Œ”ÉaDbFþ¾M'ü«8óˆÓbÐ’cü“– Ÿ—¦eZú2èø$gêñy Î>à:ŸØ@¨<“p0ï/ÀG‚ÿ‡Ž¶šiŠÏ–àˆ0æ¤G8O0÷ gKpáä s,ƒœ¯‘,êiå¬Ü{K]¬™¡\Œ`žîȃXÄëdp¶¼Ÿ?û&1ÐjLÙÆ+no^| 1®NŒ¢Ex~#«;š{zÁTúõ æ“eÕ^Â@έ‰vN6#ÜíÜ.?>æŽÇ·Ež]z@İ+“zdC`LÉöiåÎgÃg—H…늬™’ë4cËG¯.2y±»‹Ùb«Žø¬jŠzy3}—'†™1-¸FËM2¡Š€ó²¼¸‡íƒH¿d.¡ÖYÜÀbØ– ñö¦“>*s¦tšŸ\¤­ÌåÚªL‹–¶bÔ9ã^ aŒCy®×L™.¦~Ûo¶?|¾Æ@ž}üÁ/»¯‚æŸÇd@8'“÷Ç‘¥h4t_,·…q¬»$âQaá¶ó*à‚8¯g*2cÕ„"¿vÞ"e“æU;÷€ÛT¨ð -r˜ÖVø .^W;ýè5%ÙÞÏÌ>6í¤® û,gä.XÎÕ??'Iðï#$0Ë—óÞÈåÏtâ •ÊåÅaTY“Ƹ¿+þ)‚j %ÌÕ©”`ñÓúXåÁ Z•iâò˜p} «/âj€ü0ÙÐ~âPøÔÜ*Å—'‡Fâ@Z YáÂ$¾`ˆ©ªÛYÜ ¶FÕu ð:ÌãÔÈŠÛÃbìX¬ñeNü|=vœ ‹xkÏä\ÇÐ(®6Ì›F¹‚XвÚ4J4²<ï\±:µ|l¢Ó0X #ñÜÃÿ˜+˜g©¼]ø™¨ürj;·ñ‹Ô@kõt<5å[6ò’³ZÎøÓ)SŸ«%VMꈺ ¦ä §Çqi–B#ªÚ'Uë6·"ˆt+‚÷sÕ —÷ ×[™“a¢`tÂûs­Òµ¬ÖˆÜþˆsðË¿@0â*–aâ–4õÈssR×!p0∌9¢î!¶!h‘«*éœù¾ñݹ^áíÀž +Ý7?/ ƒ„·a^uS=$ަuf7’&M«vl·>ŠSÌN\QñÇ”Cæ1æré¼¥œ±"8¡R†yI¡íŽyçèFŒã¼Ñ«¬Ë™Ü sÓ½—uE CU•¼ü¹ægš®ËÂ^þ^ô­ù‰Þ¹¯vA:1Ïl/¼Î–½ßnU®(p>ä^Ïi™*Ó2MÌ£X¶V u ÁUC!Æ‹TqØ•í S•ÎD„B£Þ0`ösÝñF¼²{gO%ATÑ5F(þ Ê´˜Ha?\üÁ”ƒ¥ñú¢8[ ÓD¹ÓÑÙŽé¯K“å;TEÁE©ø3)ÁE©˜¦>Ë÷ÖÙ ïS÷ÕÂ’(‚[ÍýÍqP%ÈÂlø:¶9¸™ Ó[L(Ý&dÁC©·¸¬–)'Šºï¨¿ÚºpÖÞ÷”¾ÖT/l¢W³®‡a0æ íps¾áGà 1¶ÈŒºboá~4—ƒ³ÅÔ\.-#K†p)‚‰˜™þ´ªv†ÑªŒ¾Åü3b®CæõèØHc~³¨›¥c-ßš ´Xæbê4ŸÏ#ª|©|i‰ú ¯íJG†å™‰Õí«ç<³SlCuwJi|]9%Hb²fʹ±H¼Ãœ¤QeN¸0_3ñj$gùG–÷‹¯sô˜°/Åè›óÙV‘quíWgζ³ùUxfºqè&›3ȦOÝ Ç Ï;ªž{n#«Q§”}Ý“ñ‹Ïwùz˜Í'-æü”ó쯪4R+¢Þ‚zƘ‰jŸ?ˆ½žbGLŒülæQ|‚5ÁyC‘À›×XÿM^k÷PôŸ‡~á‚[eŸkéŒÛ§æðü|bý¹ ÷U¿7t(zjÜOÄîmóŠQ‡BywÄ=†Ï„çï?`·Í~DëœâË}°} ;E/ðã[V¾m–û€5aë FÃwðÍ“žm<üL¸®`Fmýë|,þ¯!>¬F:¼|Ûwuã³À#b÷fë¼Ì…G„už³c^7¤úfÃ;%Öx®ÍìÂ$xëI ‡aYbäke¡vêp/±OÊ0";èÂ,Û¿ ¡ÇÊ6Ï:h"(ªëÊÄ#ƒŒ>p0´ÓIú¸H˽i¦=S̰A·û°è [òœ<ïþ”³” endstream endobj 2312 0 obj 3927 endobj 2316 0 obj [79 /XYZ 32.2500000 588.500000 0] endobj 2317 0 obj [79 /XYZ 31.5000000 590 0] endobj 2318 0 obj << /Type /Annot /Subtype /Link /Rect [55.5000000 701 108 707.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_ownership >> endobj 2315 0 obj << /Type /Page /Parent 2 0 R /Contents 2319 0 R /Resources 2321 0 R /Annots 2322 0 R /MediaBox [0 0 595 842] >> endobj 2321 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1409 1409 0 R /F8 8 0 R >> /XObject << >> >> endobj 2322 0 obj [ 2318 0 R ] endobj 2319 0 obj << /Length 2320 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯ès€m‹½€ €Ÿr`Ø@‹o6Áb½ˆ³‡üý¨[RÏ Õ%~]¤¨¶lìÎx8ÍGU±ªXÏWþôã¿~?¾zûé?Ç/Ã×·ŸÅ©.‹þÏñü÷‡ç?ÐÍiøþX7åñË×÷ã·ÃÇÃÇîÿßý>½ýk÷ÝÿŽúø—î¿_Ž?þ½ûáOÃ/áë¡Vu÷õ×Ë×¶VÝwÅõëùçÿ>üíÇßÎ3ŽË ›yùïêª.Úó.fVþvO©.ÿòÛáUþ ETi¬jŽÊ{T­ÕÇÿþóðs7ÿ8{qj¬Q¦Ö¥í¾o+[eÓèîûÚ ȵk}^\Ÿ×m‡‡î§îÚ—¿"³+ù¹­®¢Í}Ù·4H”©”òSk•ªÏ8¾ƒ¦è´uºŠúqò /Ï_b‘Ìyß± çDjU×IYyè<Í.?wݪhs_ö- ’­xòÈŒ¹±6Þ¾N­j£Í}Ùw¤ ç>5Õð~Ï­Ü\ÀU›Núw"á†èã¶0EsCŸ-O³Ë£Üš:çè÷- ’ž<“ âÕjO"<›]~îN&D›û²ïHÁ3y\‰`Ëfd¬ÝDòøh¢±m[ëxwø²oiŒ¸Æ“ Þáºn™¶uØ×ÑîpYèx|ÿ²oiŒxÅ“ËáµT͈×î?qØ_g€W{ÖI"Í}Ù·4H¼N'ÿ0 ÞHÿ` úæùà›Ï‡W:R?ÿÜmì²^ÿåó׃=ÿ£{8–ÍñóOÇ?…yû§ãç_JJ[5uyù½ËHQ]FšSÓ•.‹g#ö2bO¢TGF4üÌ[ø8›nÑl ¯ƒ÷&º椪€Ÿiú‘%Ó¿¿Œ”'£µta gÃHÆ;˜l¶F¿jûéÍ©è‰ëN<Á-©×Ζ”¿Ú [*'[*áˆqOŒž /l”;=µ_l˜.ˆËâ¡%<› Y|³1ü<(… cÊÄ;0ïÐÕ³=ŸhOfXhÉu…ëèîÚ”pßA†Ì0’çÓûÏhŒ$ÖªÖ‘k©ðëá醛¤ ¼ŽGCP¬‡a~§¦¤>!–=4Š¡CðGÏ®E59Lø¤˜FÕ;BCxMÐÎD!€â[•ÖìUUœªZ½T×{¢Uå©hÍKôc ¼é?£O±EÈ ýa¹z;Á†„îÀpÜ@¡ˆÙv|¡ØjW((иLÀŽE ¾I˜-c‘Áè—‰žvvT†kMØãu¶,+žñÞ2P’¸Å~›,ç/ 0©TOGâ3²²~–éî6 …Oº$6 ˜ïÂÁÜY×hߨP ±4äbôy0!fàÍݦ ððâÁàQ°1tý–9oý kÄ]˜\(æjoóM¦±r&YsªÖ˜0 1y|&L™¡®É$ÄgŽ(ðÊB¹3AʘžÞhËÐaþ/êñcœ )xx,ñ4Þès:@ã}4áëݾ—b ʈ;Ôå…9”æ*3{Ã\{ºì®˜^ç[#qkD£ ×P´cЈ}-¹†^ÇX8›èÞÁ0’†Æl»ÓØ‚ ²pct‰gS5SL!ø3ÛèÀóh¸¼Î ößiáĶŸ‘»µ3V’ª°ó¯¬‚Þ‘õ]°ž—ñÔõ(‚y¿?4©‡&™B¼(s©¨ fj dnKª‡Ab»*õ¸$ÈšâC¤La„CÇs þmà›Èjˆ…ôÏÝÛ˜†”ÁyþL(â«àÉÃq©Ïäåïæõ#<µABK†Áá-a!{“Ÿñj9Ëk†Qã]{b7'Ä´üRn3Šë]ßËÍÜB剶O¥#}rTu@téúÚV†2ÉC6„y™áA! ˆH%Ïú=oá%ùQL ðöˆAwã”–8Ù8~ü0¢;ã×7¥Ûâ]/Ï¥2´EãÁ(p%ÒI(!Žß:L/cÇ–Æ:‚u,Èž=Ö9×$µM8 óxñ †(”É0‹.µªªqÅ-NÚ“¯Õ— ÀÒ?¥b䯭ɠ™˜.Y}3•¾‘ßÊ‚ðd.<‰Ìa—cnZíñ°@¡2<Þ–¢F9ƱBñ®-%O$°&«Úº¢uuUZ'?;iÎ)Ì[2 ų‹^óøïŠÀ|P"ü†*žA½õ0³õ'úd •P¡D"Z6'?Ä™ƒÂ4ÍÈ+îWz««Q.ÃIöìJ’_‡ÞEöDv| Ù¦qú­fL/™”ÁÃ#”ǦnL;8²’yÊà0Æ QêUàΩʕ1‚¸"ÊØ¦°+ÉX¦ºÊؼ…âaxDP€ŠÈ P==» 뚬6öhOžGs†{‚º19cVåÖ¡ðDP'̹¯•…³]av¨'À\`ƒs›aN+ÞÆÙ®8GgìgSÂu`N8³7 7œ‘­qvu›ÆÌ<=9Ð0sûáp3ø™\øáé“öÝa* WUÀŸG”+Rœ‡ —¤÷¾ºvsI£Ýh3.-F;Ø´s†M3¸˜îVÛ:úž%Då&ÝZæ’ ÝÅö¨¢OxœŸTèÄZj6ð¦‹Ë­Ï]êo²ë˜RκkF˜ iB-ªÅ1EmWY»é%ªóÉT3Y¿P%öL3ÞìÈVN&¬ŠHj¡ÂÖè”Ö¦æ©ü+TS=–€Ýn#l#ÁÕ÷ðg 8‚m~˜ td­ž ‘pÚ±0½áÏx ?ã©öHØ%Š÷X«vë³:®=ëÀ“RU?1¶ N¡!ï5b½7H£¶šÇ#¦Q ï#9H£T<š©Ä*l?gjÛâÇÆrʺáúzÄúµ”×§k4´ƒk4ê©óLÜFÆ/ÄTffô/ª¢5#ßñ+k‰ÞI,`ÀÙ<4 ùñ`8ÏÃi€sïX °9j{;[ï¢þµÕµò[ª³-Éš[•ê48ŸíúŒg¶Í6#T=uv´h¶AHÝÚ[/ •=M|ŸpïM½‡ŸùOúëhø™ñ `Ý[Ÿé™m}j›ÅpKOOŠ!Šñã(Þ5^c¯CPÈðØ Â¶?x?t0½ »Žì ºDس Ö#‚ 5¤ˆîkoçh²ý¦¦þK¦˜ÌŸÌq/ÒNW6ehyî-ã™a K­ÙÕj`ÈúɈ½Q%/¼¾"ñ"=çÉc #¦O¿r9¬¬;Ô¬.Q¯)U…%| ™Á6Œ„º£WÂÔëO¤úY)Xá¡P·B±‡›áÐ/œ‚G”–Nèú¶E5†ìxìØF˜^S²Ç)Ž5ZÆÝ—.8Ý~y•ƒ "Ø-èÁİ÷é_VjC²æRY—…|ƒ YÝRÁ»³ñ·J_W}—Å~®iË9sYE„QFã„\V=…ví\¶‡ÈSxã¾Æ.;¬ÏÀ—qJ­Ï™· ·Üù¼VeV|^—ß¡6Hj0y~*ü0a+Û„Û#ê/ºÞ_‰DÚ{^‰‰=`+Þ{Ì/ñH2=)¡L>—g|Lz‘åw;½ ô¢ï)áá‘ðt²Ò &YÿÄ…yM+cÌåþ3Ö)©u?3á.¶¸f!÷L5¬:l2¸Dôm9¯˜šÝÛK³Wqˆíqb«´QîEÚƒ«bWák)ؽ+ q¸œ `ÊWSÑcLñèø±2}ßÍg& ¬bHPËZTºÑ®dU/=|†¨åË„ÊÝúWVÚ:d¿þ C.Mžºq/»lêv0}ò ‘„ìÍeG¨¨T±oÌ¥™(åÍ©Â8¿rE£bèâØìå<œ ‘N_¹Mn0hÒ–cPÉ6]©ØÐ„³¸Sš“l]ÍîGãü_¬6¬®žh\ÍeÎæx°‘ß 8âYbÛÀz Só›¡¡yÇ`þ›¸Ê‘s¿;(Ó…Ø&¬+dm;K}?\ßZËW)Ï’Cî\u«\õ;rão2<6%.ÕXüãÑx´….Lý!¦:¦$¼·õeÁΣ}˜Û¦æ»sü=hf8ˆ+AÀÏL€MYµ/Á¡Š±ÕñÓ¡‡úCå©hÊ78(g¨s¤Ç!„B}Åq… ÊÆ‹Ï5B’9K'–i¦Æ½¨ÏeSp˜'LS‡–°›E:LÈÜḊp;Õº2ç ÎiXqQWö}­—¡ÇLãH?¢€ý,‰ÄD]Û8ð TàU«½Î·§]„nO­)²†ï#Lòø-W$„ºp/ó¨dbÑdÅúp=²öÁ:ËTµ%´LY›LžQ.­r5ˆd¯½ïÖ"Ë<¨Ïê1lR}fÓl%:!&˜žª¥´ru­ŠÐÒÕ„aÇ/Ѭ«ÊÕÉvð—*²RÙke¹·"õð€yˆDðXÆœbÎÇaUãœmwèHM1¸˜2kFs`Œõ²>”‰©+M¢ E<ÏjæƒkžÁŒ$ÈP¾è®×|uÚªv™Ór<ÔÄÐ-ñ¬ ¹Œq÷ýg)*6å‰ed±Ž‡ËÜÔÓï:UDލՆ‰ê x¶ ×åÅŒ‚°ƒS¢|Âv˜Ú¤ åó±µ1-½V;2—¡'ªç¨hñái¿HL·Q»Ä‹%ñù2,†œ#6Ö×?®Þ°NH 1[Õ˜+3KŒŸ:qWö¨ KRË5Œ^LúÖ©êüØc±!®¨'P㉉©–è`i>ÃöÈ"­Il5U!ò8Šñ¬ë~0vÊ㸬™ˆ•DTb×äŠom'  0ŽbþÅp¶åíb’ÄKÊšl´ ¦ãkÏí¦rî@”¬Ô›lj5ñÖÇÒ?¤ “(ˆ³ÉS–GÇ>À›M0IØÒ§Ô¦z‰-©R¯9·ôÙ[+dÝZÁ@,<ÜRQb–¥.Ë à$aKŠR×׆I¸³.¦ÌÇ0'……Ã=D«…‹ãRß0ki°æ§ÁIkæO·—ûßB¹ÿ$ôb”~Pz‘•A;½ ôbÆ&c˜çS=Ó1ÏËß\pºr]aJØ[æÓ0ŒW<؈l»OËTâÝ"¬ïM[ñ4!g˜æ°àû´Új pÛ ¨;x´ ‚‡0M‚= }ðyˆ÷+óž¶ga‡¨Ïà¹Äkïy²îïñ['â½Àǹ_Xàájnú=•9u e·Ã£¶/iä–wª‡B}ÃjÚó}Ò—À’)|ªéÈ«¡OCYˆg”Ðïà–¡ýZÇÌ9oííÃpRÔŸûf¬Ë¤pxU5=à@h8¯›íoCáÙàgq©‚Ž^?‘-Kpçﻈ.íޣÏàÙ0 ï[$Ð8ˆö€ "Ma`Â-©9§Õ"ªlÐf=Ôò]ÈĆCíø—ËsÌ=zd\n!Z<;`˜¾K]ÏC!YNPÍIõçyÁ`À–yfžˆÿÖê0Ä endstream endobj 2320 0 obj 5100 endobj 2324 0 obj [80 /XYZ 32.2500000 233.750000 0] endobj 2325 0 obj [80 /XYZ 31.5000000 491 0] endobj 2326 0 obj [80 /XYZ 31.5000000 235.250000 0] endobj 2327 0 obj [80 /XYZ 32.2500000 489.500000 0] endobj 2328 0 obj << /Type /Annot /Subtype /Link /Rect [171.750000 345.500000 199.500000 352.250000 ] /Border [0 0 0] /Dest /#83I#e5z#5d9F#93#f4#f9#98#d1c#1390#19#ecS#eb >> endobj 2323 0 obj << /Type /Page /Parent 2 0 R /Contents 2329 0 R /Resources 2331 0 R /Annots 2332 0 R /MediaBox [0 0 595 842] >> endobj 2331 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F8 8 0 R /F9 9 0 R >> /XObject << >> >> endobj 2332 0 obj [ 2328 0 R ] endobj 2329 0 obj << /Length 2330 0 R /Filter /FlateDecode >> stream xœí]IãÆ¾÷¯Ð9€eÖB f C€Á CC0Žc¶‘‰ùû¡$RÝ*ò+’Ÿ^‹jÎÀîQ¬åÕ«·/ßÿùó?ÿþýðý»Ïÿ9|í~¾ûüT]Y\þN¿{ù®ÝïW—‡¯¿>};|{úôô©ýÿ·§Ë Ÿßýµýí}øKûßχ¿ÿ£ýð‡îK§/üúä”kþrþÙ8ÕþV\ž>ÿééo8üv±Ÿ®[Ìí¿¿s®ª‹Ó*&fþöÔïRÿþþõ·§ï/û_4‰*KSµ?¬±ÕX}øï¿ž~lÇïG/ŽUÊUÖwÌãôi"U·s覅yûŸ?Ïù¯ÈèJ~lëL´±Ïë–‰2• .r®ÊÚÓ,åi2UWmè.¼áE¡ß ^.Þàç•‹CÅè&<¸äÙÖ'êp>ÛªŠþ~ø௔.#"ÎiåâPéÎ~¬«îü›º>C̵Ó[Ub2‚ÊhבÓr8ϽõÅèòc[WGû¼nitŒ 0x‹8ÚÙ²hjøû=»ªZ™â ±R”zƒG8Žª‰wÔçu C¤?i8v\ÊQŸfM9\¡ú B¾]~l]¨hcŸ×- ’Ÿƒkk”qº´§3>oY׺ýÝ™îÏ}+;¡»–§σG8cšxhtZ·0Dú“öÇþ´` ¼ŽË'@‘ýxñí—§ï?*[´À¬_~l—vžòòãK ²ýG«¾:{øòÃáE¡ìŸ_~~jŽ•.ûN>qèIñ=Ñð‰©àhá à;xÕÌ<ÅøDÁyÌcÁMcˆâ'Íùɇ/í}ˆŽËé÷ð†ØwMœVßy›nß-¹ãk¸ŒÙÛðŽX„ïú75x1&ø‰~¬“ËV´ªY?ëûøë©Áblq^LY”Ý”ö‚JK[Õ®A7W•ç•>Ïå°Ë£ÑµºyÒ]’úX7…÷NƒžXû¼é9b‰‚£ªÏ6cOÒÎá×ë¿ËcÝŠ;Uuúá”ê>u‡ª¼:ºO¾>Uö¨T£ëZ]¿enF1/çh¿ßýÛœ^;øoëÁúôŽ·’ö[õÍ(õí?=½ýÈ€°²îÁ^îÂÁìÑš‹·åùfÕèIwƒGž(Ž;ðŽ…ïàÑ>@T,ÏOL×NYÏ>°$¸ÂxÃwÔyl%x_µ¿ÆÁx&ÌFá;¼€°/qÆó·N¡Ý…š)ÓÃkÎ’,¼,Ε$–å|`Ô­aV Ц€ûY€šÄĉ†5ËÉ8…çx1N2®ðVV•Ç'±Vµ±Ö†ßy#µ=´·JY_åÍ"x ™Yàˆµ*©3ƒµú”ª‰ylÕ­º¬ït¹Á„’DÂÇPéÁê€bFˆQ4€:ƒ%ÁSQï—Ÿ—íUÞØ:1d1¼™1P˜R¾ƒaç±eÝ…@6½É:`aÌC„Ù&`d.áh˜ea“ž'…¡±}¥Ìí-‹n§Æ¼:pø6%HŒž<#ü„ESáú†Ôd;]×¼xE‹ò›ü6ýCë#YÎpË1ÝuÚ†ï rE½v®0;õ¨ ɘ¿2Éi·CI* 9[ÝÁ ÛwVÄ`|óñ“d—¸ß²O kø$0æßCà;šÀŒ£d˘¤° ò ,\Sêî.ûå/û¹ª¼ç îº*µÓ\¿îÍfóÿ»‚?jcn‚?jcG‚?jSy§Oüàó·ÌÍ(æå}ðGmôHðGmÔ`5þ8«¾¥¾#~ðGmš[ÌóW,ð8b7vü b1?°ÂvpÂ÷€MØØC6Á@!FÞ£|@&rµN}~œMÀˇxb&2!Þa \õ‚³Å^**hÁ bÔ!|”»»ù¾8¨@¤F|Ÿp„”X  À(•Ï«0ÝÄG”èvøá¥ü»Eãµð) jWè¬jãáÉãê8ãß=Ž`‹qõ5]È`½›ð‰D¢€– U²€Qꯩ4h…Kx&mذn½›mƒŽÕÏ'©í£Q}FÎ>Ƈôˆ5×äÄÝ#Öƒ¤œ>£Ý +½Ó\HQÕÜsø‰èvÖh‘ ïZ·d®Mëõ%Vì¢ @»)Ö÷˜’q"ÒU÷‘Zy„ŽU…îCKrëöбb›Ì¶ÜÀ¡¤”«¢º§8Ñ:zòzBÇö ²b*ËIMD³ˆlØèƒÁ,kr Ë™d/¨o;/àW)GÞà nI[JäÜ øhäöتèÊQgò»–•XO7’¨‰e1™mYú‡7*Ölؘk&¯š E’!«3£t¥*Ü›ˆy0a‹‘™p"¯@¶N7f­þéãÅÊÔÙ_€0ÀibLECòƒ³X˜À0Àj ¡c`…ä;(pÌ3ÍÉLlê‚`d¦Ä>¥“¯ÕÑŠa¼Å PD¯9åj!tÿT6±@FÜQS4€%yfÀâF+Êζ+˜az67\‚S×tMµMµŸß2),êf ìägñb¤Ÿ²Z.ýdþ”aȯ„êZˤ"À™“Œñ ƒ¦p¦j°{ß8%í3šíб=ZiMSaK6¦ÖdøÄÜFx`‹µÙHÀX)«A¥òÒKñNÞYÙ }F+†+`²_·eúª¥¯ÂF‘yTU[ŸG½qe³h(­+Ec8w±ßšêŠñ›ì (‹ËÖÊö(€Odëž3ÝßdwJU^—…AŠ2¼ýÍp×nž÷ÛHÜbìɺíQúÓjê œVªî(Izyt·ÊMï{“=Y’´ÿè¡hª; ˜3Îïª;á²L¸ž kc©® 5½S–éüü«Û?˜ÈödvQ#-ã[Þ€)vc¨C„È„—TêD¦™^Ì¿_­Ðì$½ÉJ*íó†‹&‹R~wkSTŒq˜$¢gÛä7¯Î)¸-NôzÒó^±dE`Õ„»J&ÜwE^Û”n>¯]]¦¢(¶H]e¦ºÆAÑûÁȈ‰c¦"··ëÃ1Ÿ‘8àsÒè öQ}?ûØÔÚbÆ´êÂø”@63B6B=ã0:·±lÐNªÜéÊþ L‘&êÁÇŒ7pþv™ŸÊ}ëW ¸Pò;¾¼~ƒFï–-aµä¼DµYa+![7óÁ™F½$Bê†]>™E½Ô|êejí‘/œƒºQÔcaª! O 8C¢•³Û÷[ÖÔª[/>øåés€GDâŽå€»Ì/ñ!RÃ’Io \]±¢Êõ„¼úÚ7gk»H?Q"_?€ÏYûPƒcá— ªÌSõÜU‚oRr%Ó*•ë?U ‰û  Œ~ÆøŠç7=O¿™,"v—7–аœ9í–ËÝČҕ// |~‰|¦¯<£³`‰y"Ó“Q–¿¥JS$îÔ s”ŒTÉäô&S7w6³³™×ÃffÅñÄe²YÙkúT•Ò¯².Ð;LåÂe›3¤}¯ØÄkÅbâ&ìsUa¦™¹¨›1J­øe"HÆì)Ãk¸º’¬kŽH“m‰8°ð°±`'cœGRée”“…a ~V Õ]6’c~sÝ háÞ7ê>Áƒé·ªO*ivïÌ2&â3†œŒe?F.Ĥgš7øgm”Ç?…¹c6ØcID$Þ-Æ’,»†D)õ€9€´‰cjÑÀÑ&CÙ4aYóìžå“.ªSBÝ&KO`6Ú×;#׸¤ꧬì ,ƒZO3JBǦÐ"n€‹p~ƒl‘¦é“yÇdnãwDEÄÈŽ€=<ð>8 C0á­ó'¦·,6Kتe ­ yŒé(~®k£<6³$è3ãXEªâ SÓ’Q”‘*_ˆiè.ºŸ”ݵ*WÞ®g¬wîBtÊb***:ødªkÊØNñª™ÞVŠ€Û;8îywxçÍòýhØ'ÅhôÄâÞ*D-ÆDk¦3†[1¬!tkÃxW€»Õ@¬ê”B©þkp¸WRÖ“Ãó`¸uTñ~7˜ÀÄcº{aˆbè`zMì4ÐНf‹wß<ጨ9ï’1lô‘³wgzÔ« SÜ»¯À±¸LòÈdìô’›¶V럀«•‹,Òå(Æ|NDWèô™—P6 †Tî(t«eœ†ï`ß_†Ô˜*ÿ#D¸$P/ßn>LšóÐpŸ±pÏ´ØT¦Å둪búÖÛ%û •عâ=dcéû5Åì1Üæ‹{ âÀ)ê.RÙcu.›GˆE“M÷ØC-/iüÜ ìa¶Ù¶#ZñI¶Köæ]åHB$-Ð<6Šƒ‰òá4'QÑ‚èg**™©Y›¨\—°#?ÆùêìV¢„êoŠ !CЧniÔJXÏ«¬!ü^1_Pº”F%ƒ-¼¼zKÊý6ßu›¥¼©ß¹ɨ“ë•6¥N>×!\=óK½ƒ`‡ö@&[L+¨ùäœ Â˜œ1}aÊÏʆ½šÔ̸W˜$Ê¡q>Ž¿{±!„¨¢#[ûkïž*Ó5çÞnƒñ dua‰{C"²i»6@ Y†(JO©š:«™€%dØØ‰'ù%›ÙËÄʵŸ–ˆ4$p†™‰•Êyꃶã.„®ì tèêÊõ­;øêØÛ,säNI­A£õï†J |G•=ù•ÀUonנѺZ #«îŒJîØÔ³÷X†óp?ŠXž­÷ጠæ­×`ó‰lT‚4ÖùRK²¼OÑ`ÈØeßV/†¥äôR½G+0½÷Ä ÜñðI²ÈCâ©"ñ„"¶-ÂßC9ì ¿è¬Ùì³4>_£â‡¦UDÿTE¨“Û0E~×ÎyŒ(§‡íbD„72>"âMvNy{ `‘Á!K÷{†lpWWHn‘@‘1ÆòÁýHŒ©®%c0Äå@á©wE1d#Þœ¦Ô>U äˆ;øû2«2ÓžçrÍG,™j¾Ì Ú¤,/ÜÄ\»¶ Ñ%Ѝ*² Ú‹°‹ ÃS_Fî\àZNBâò5CáÉø2È’—LfÏj';Ü*¤$ó6& ø1ð†ÕË2·¯z@Œ¨ÊóÃ?gx ˜(ð© œ5sé˜ë±‹‘D‡GË8¤87£¼0ÁÙ"ùf¢ê'|†„dYD¸©|J„Ä;`8á\“Ñ $Œ#ºúŒ[K¶ÏЍÍjÓ9K÷•\^ß`80‰Îªë'15SEz0R`'Ã&°Î9=½L mQA:ÀæÓÖéŸQ•÷È™gŒü(Rñ'>¹[žL-‚½¶ê"4ß«1R0 ²÷ûÂUÎÏ] hRó³Z)™KÔj"“\ðä1« +ãqOaÓ SØf.Žëx¨ªÆÍã8œrþ±¿š8mÊ Q_x«‰ ¿@¾‘0º%«iÁ49L,î2Š.#ÖPagE:ZæyW_¥t“"ºà-¹mqëå2 … lîH€’ú½0˜8ª€„@HL”Øú  ÓSéöŒ )˸(SU>ÜTs´¦¹+œ"Qb½ Ãec–'ˆ¸Â–ëùc£Yøä#zb`±êÎð½¨(vĪ5,±Ø).±M<1>+0bÕ\f`_ÕÏ3_ð¾áiáâæò“˜Båò†Ëy`’*®”¶Ÿz’f¥ZÝò ±õÀ'ü}ƒž”ðü$€ ŸÀ÷±Jy{…UÎÔÒ‡‚ôáU¿MxZe3¹ž ¨ùúüzŠþ.“?ì‰,U˜öAÜaš™ÞYý. ƒù+†¤Ä>ì¯ ·‡‘å«:DfÐ[W÷øò>¾DVÔ6¦Ÿ’(þ‡Í"»™l@J¢›É˜Ý2ÝÅÛ5Ȭ+d®>/œ†Â$;%ê®/Ð ½&Éf£(òÅGIuVÂÎŒ„P]W=ä¡Å<ÙUNÅ|¸'Ð,C™»‰nŠúÍómjÿ¾µ×&x«>M}a†tW¦4·Ô¦P'§í¹ÕÀeÝ 2Ü %t#”ã²#Ý7„ào5|Ò µz¤™€‚4ò=šÇLESŒ­íc·Sä·Æ²§õ -&ècõó5ÞM‡#ÛPx4øNÇÏÕ¢­¿°É²wú½]qÐåòƒV £ÆI3:ef 0Tk`†ƒ(_¸W£S àÄ`õƒ¦Þ½ \QÕå:Ü Œ;Q/Â{& á§Ã§§ÿ ë endstream endobj 2330 0 obj 5847 endobj 2334 0 obj [81 /XYZ 38.2500000 674.750000 0] endobj 2335 0 obj [81 /XYZ 31.5000000 723.500000 0] endobj 2336 0 obj [81 /XYZ 32.2500000 722 0] endobj 2337 0 obj [81 /XYZ 38.2500000 623.750000 0] endobj 2338 0 obj [81 /XYZ 38.2500000 674.750000 0] endobj 2339 0 obj [81 /XYZ 38.2500000 623.750000 0] endobj 2340 0 obj << /Type /Annot /Subtype /Link /Rect [256.500000 695.750000 348.750000 702.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn30 >> endobj 2341 0 obj << /Type /Annot /Subtype /Link /Rect [333 567.500000 425.250000 574.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn30 >> endobj 2333 0 obj << /Type /Page /Parent 2 0 R /Contents 2342 0 R /Resources 2344 0 R /Annots 2345 0 R /MediaBox [0 0 595 842] >> endobj 2344 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 2345 0 obj [ 2340 0 R 2341 0 R ] endobj 2342 0 obj << /Length 2343 0 R /Filter /FlateDecode >> stream xœí]KܸÕÝ÷¯¨u€Ôˆ½€ ÀØm@ È"È"˜¼Ìq²ÈßÿªJªênª%ž¾|H¥1fìiYyyß¼÷ð‡ÿûúçÃßÿ{øáã×~ÿøõ©:¶u5üs8ÿúõëèî8þùÐvõá§_ž¾¾?}yúrúï÷§á…¯úÓÿúð»Ó¿ÿ<üñO§þeüKç¿ðËS«ÚÓï?_~ï[uúSuûýüó<ýáW‡G¼~nœÌÛÿÿuÛ5µ:ÏbæËߟ®«T—_ÿýé_O? ëúˆª[S郲ÆToõá?}úÛiüëèÕ±³F™V×öôç¾±mUw>ý¹5ã?ä·[}þ¸®ÍAé¾:tíäÓ—_"ƒ+ù±é£}™·0E”i”wìc׌ÿÀ?s_îΟ­«Ó×­êw8¬·JµgÎz'„ëu5nJa[^F»«úhcó–&É•ŸðàrûÚ©“ƨsúWœö/£ËmN„‰5öeÞÒ$÷Õ3¸à¾Zkê˜.¾ÞF@ûNG3-ü¥IrÝWïx¾óÍšu i0P§[òa‘AŒóW=Û£!Aá“êÓåI}4ºSoßß1jñì=Æï|p‡ÇtÄÌgï™dfUK°*fü¾#ËøÄ†Uσ*QWò¼pʇQã™ñ¥O˜õL8R™ðšg$ qJÀD 1/a)FUæ:ƒÛkÂwßÃ1›ÕËE²7ÖÞãdcš¹¾qì\*!ðpT±XÜ ¶Œú‡ŒåY ·èºMä²mÆVËÝΘ|ÏQ”~žÉÎÉÇ=ùáUý)lÏÜ03–Ýha7s¾G&ˆÑÇs"Ö?ÂÓ;C`o#¯ºiãe-tŠ­ò$ϲAàt¢Gébº1¦ïÏ䤋±k„1q¬°Æ¾éÄ7’UÔü¹E•d´¯ç;¢Y7á@}ùA±­!G>' ©¬®ã8¸L2sÞ;Âc£Î°"`üÆGq¶²ç³ù™žpƒ13Œ6™Ô®0ùSY›@Ùåé?Ê6F>`• j Æ÷ø¥L¶T´¸iç¶1£‹15öb ©:­Uº`ò¢‡ÍT‚WÔ ÉôR¥vÃûDTÞÌêæ¨‡OºvM,féåtÍ^P¼GøˆÂF²©œ†d)¤ø¹ÓcÉöÚÈø¶L4¹¦J.Ëß´½»ÏjØæ^;˜¹v¹¢ÒÇôÿdšwÞÑ?ÂÑz8ÚÀNªEVüÎh£Õ»7~2(,eîyþÎÈWwž çÖ4Ä£=öûÎ4kf´Q ïöyfÖ™R׵ÕxžöªŸÊ³®ÂWíÙLwÌ{xÖpnžY?‡sò, â;-µiÜéˆÄù´D]”TÁö*òi‰šh)'L4j¢¢Ú€ƒ½TÕŒ‡Ä…Ùä€lŠh‹AªS‚éÙ)Q€á)ÍÀÇ-Ë=ýÙ%µã\€hKHqè1-T×;&ÊCË€‰/?à_ïHÔCYLŸÊe¿_o¨š€Ù¨eœ –sBSu'èaï nÃ^Ê}lÅʬªoÊn`q5eñ3§^õ‚ƒzF2íÞüà积‘däü!Ç¡_±5ž§´CØ_žºÚº”Žº…öà<gD@rÉ[-Xó5}ð=Laâ|‹j§–(ö£ÎgÝh4üNÞ5í½Ñª›r:ÛGØÍ…Y_?¬=šÉV}€£}BO^©@÷ÉG´RÏÜàJ=sƒ4,} VU‡áµáàÇtÇ”òìïgÈ{Ä^yvÏó8žAWªá;}øL%ÆG3ª©ÍÕKH”€ÚcȵŌ©Çg¾²H‰IÚs…Î =Ñ2>ØgPã$î“HÞ³Ÿr¬Ô™I0K_ÚÏ׫w¬¤pM, Ö"¸¸'Ldë’<!Г«L•J#Ãë<*ÝÍL™fFôp#¤0“ÑÖŒçË<£bs)7˜ ¹r˜kax@Ÿ¢.⑽ ïx@è#ŠÌ²[áÍYa|2[ާÇ87Aú¬Õˆ¦EŸú®ìj¥z—ÜUW°f“{Åà½nãf1Lp……G‡œ¬:ìpØŠPAy.´çêñ¸Õ%L‘fÏ2 Ζ$óQ¶Y]3­ØOÌÙžj(Úκš‹Â°xnÑ[ÊCæY/çâÆïì9‹è9‹m$Û(ŒÉ@ŠB.ÍÊDÔac“WàÙŸIÏ:£3ÉÞ¨øHOâÓ·ù¸^]'³gœKÎ8g+é’½‹’ùNx1FD¹ÑMçN¾ë5·Q8— LXý‘‰5æ¹=|uÁL®°<[rYÎFå ÈKnn•ë)R÷\ÄÌäcD1S¡=3‚)‚q'›Z“É£ÊFåŒÜ€¶ìazÑazb$éœi!Âðxhã’Ó%;TÖœhŒZ þTµ®%%‚B*˜ˆ'¿è¤biYá{#æÈñ‚gwoŽ=é…T÷¸ÊÛÈž©Šl(Ùb”õòK…Aª+yekº7SƒVîVa¨·Qèë£ÛÏCÀqsWS°Hxo!ÇmØMÀ¡¶hÁ]šP),j vcŠ¥(›êgòxL;Ôü1ÂLaÓ¤ÂÍÕJQ4~åò^d;jò÷}ä¬ó¬GìW6q?A(àið/©‡Âeù;˜7Ÿ\yœ‚FÆ‰êµ ÞQ'"]°ðsMQ›Æ—^YE2G2©¼Ód÷=ŠÄZPT=á3ƒ“Ÿ««o+¦h9e‹†ÔÈŽ¤¹‘ÖÍb†ø™Ã®jç7d•ñF H—†òã¬Ê…£=.ʘVŽÚˆ4)­:%Má\.“XcŠíE8†êbJYÕÝŽ6ÕÄŽNˆÊØ*ÆŽâä!¡–§Š'{)(SÖIÉDwoËž£–ܱ-%u=^¾ã‘©:À†…N–½a7¤{(•.qã¦G:Ké"‡*ãó»š/R-®Ò¤ü §<áÝËÚŠwÔŠ$ÈÝéfV<„‰pûj&íŽQiËêTħŒÞ° ¹eca¦uF0–ñµ.²gŒ ¡NTùG9ÓLØ%Û-¶\C|u£*æ Ê Õ>àV”Œ‹s©*Û+R[ ÷Gâ€E8½2Ôó†:¶3=Ñ•D j*Š>fŒ›ä(0 ¹Eô 2™K”ÈJzNßΤ˜æFÎ,C™\YmFô²_†‘æ[+åfG¶^äQòE©·vðI?*fŸboAHÓ³õ¬é.ú…UBÁo^C<®Qò§îkGÊ·v"D׉0 ¨~&•ÇœSˆ:vhm£eU—–#ì·¼xw{oÆ4­m¯ÓŠ‹ù„ORK.'ÌÞ1µ;êa ÛbcßÍÜ(È8Ëw·OÖ’fC{‹JÆ "•î"­Ï‰:('UË׳ƒî?Ũ+ÇTW’{–П «=•ë;Iàâ-•í¢!ПC*Õ ·àɆ\Ó—°”ÝÃûˆ­uöö»ñº õxt¶É¢Íé{#¨ts ·Ç{Þ)ÂŽ5?ÓÇÑ(5´Z[³gXo¼£ÍõÞ“„­…æÖk ˆCRÙzi°Ìßêh«›Ãž¨û€A΢ºvdœõ.‘«MïldÉ~‰'‹€õ?\ç;Œ/?7ë˜òµÖÝÅ®ýqôW MãJáF›èÂF#ô€g¥8¦)R¦kcv™ÆSZ'Êmm*Ù°bS•–Š–£®àbèˆ:©³ÚÕI¢URžÎ¨ü—ë‡ïÓ–|¦Cº”^ð¸>Pßï>Ðî½å ¥šÝ Zò‘¦£T—¹®gSŒºŸN‘5\ {ÚÌn¾ðE-"˜ÛÈ Ýã,j Àr¸j—¸“êöK¼VªWëq>´j¶ß¨óQs˜Ê:4ܼ­¦4eÁøE@d Ê˜]`LKdËO¢5ç ŽUHé¼HÎ6.Öi‚±ºß.àJ·Bš"ŸÜ[×»XuáGÌ£^îCPÚ, mŒè}HqŒI×MH‡ý \D‘ ˆaÇÀÚ1°<Ùî$¥T¶]€Ÿ°ÛöÍ[=TÎÈ4akƒ ÷÷ò|/^ÙÖʧð‘Ñ("\ì\Á'¢–x’²¼³¾µ®Sìí¤œ•R¦TÖ½·ƒ¤kIé‰ÔÆÎ[{L_ìàV¼n,›˜+ e`š7=º“Z=Ãí-DC Óªâi‰!¼$¦M;ÿ.PÖëuì‘7 yfù€°‡xÖTÓAÏJ1Ý>`î‡ÛšïÁûøi¬Ñ  ¿5ò´ 2œÄð‹¬_#eàïxb F`ûÁXƇܭDÑVbk 5”×Hì¶Gt 5~«çws9±Ü:»{¾Ì.~‚éV0E÷û‚GI¿Ï¤lêon²Þ¡Â6™ðK0Çy$U<ÃcyáܨŒ\Á’š_÷QyQ¼ «! yæñK0\¶µxç°”ZQx¥¢|MyÈu„óv²Ñ¦(ãõá¹AºaOÄão3y¢ DP%&^%fíÑH„V–Í‚0™¿1v›Ñþ²r áJ>g)@ê Éš Nã¿@[%€’Z0Ÿf¾k‡}}»æ=T=/ "loáÞk>r<3ë½¢²Zin ô Ÿ¶ªç¹oÏ×PåºNZ§Ì!·ú]Õj©ì©àót"SÆÌšáØÇñú 8Å!F«q¤¿J]³Òªê"ÎßZû®ÚªuòËÞ…2Çîígñ-]þú‹‚ísÒ½ïrœÈwÕm­ùaí»úéaëï!E–‚÷)mâiÉÅí :®(Â&¬OÝÓËÐ@6Œ¶¥`‰ˆ¡À}áÉPÐÇnïvh“,RCî»f=˜Žx’¾Û´ŽYu"7&ʽµ¥_ìv‘Œ¦¥d¡××ÐØL$ª˜Ð3¢t´º^.Xå^ƒRˆ™”0÷€àž÷x/ÞÞ)Ú«(Q’… Áð¹1±¨zãòmÀ5Ø=Ç>‰(r´°Óp釜°ð5'+NyW{_]‹š´p‹Q–Nµ¶0ëa¬~joÏQ1”í‡<%Ëöª5lëÚ4+ØÇÝŠGâ±{zƒ(n(Æ#½÷ÖÞ[Û9¼ 6™FéO›×˲O˜¸`®ñ&§Ÿ¶N=¸J¡Æ^DÛ²0¼ÖL©( ÍH·4E¿§4z"Åy¾Ã”22¶‰à fnž2XBz¬=†.(ÃÚ÷”Íý„°µ8Mgš*ö¼öL‚"»­Ý-j•æüª…5»'+}²G¢EG¢ž•îO'FéûyÙÌîo`Že²ÿž|=ñLd‘ݯñœ?TÞ×e1~š(8Õ²" ê´_¶²U°³–½œ„jœÃítíN½R]jÛ–(Ë´R©Må?1²™š7e6K™6µd”ì]â.¹©5Õ¥9Xž‰º Ÿ¯I#3uS—‹>YiS7¡—1Õ¬.ÞšÜkuMîÙë4Û¦¾ÌçeÑ¢WÀ§éFˆÞÂéip%È¥?/^FâÎÆu4¿0-ÊLÿ_¶ëã©ÉNšd˜æ>Ñ[ßWØ*hÚÞÕ”%—Ϭù fc°²Î.Æo[«Uç~3w[¼Œ!èlx0ƒõ! é¬ÿ[Vç¶ÉÓÂ÷.+`#r$ÖGŠpÕ(Ô5{oZ‡'˜–t#.aø&=‹ctꪓ™r 'aa& ‹ég€§"G«ÅzʪêÕc¨Ê˜Ì¯Ú‰×Hä0¯‡Ä‹˜ù1‹‹BWx²,ÊûÔXÌeãzIoÖ}Ä da*¦ v ™m™s1$HšåE*qéRÎ3H|€•zñZ“É]dÎJb'XS=Ì"œ&Kˆ`Ù`jàiõ$+rȉjŽÆìÅÑLÁUc}xþY_Œãé×áûÉ zä—¹¿°ÀŠvwK°Nþe¥Îêñp»šqt³î1ô Ríq΂ôQ_¬Üë'CßLŸŒ—é㨞_ñ¢‚Ô~Fß1sÒponŸÇ•¢Â\lð¬+±Ø…o¦ 5>QÆšîÎ2 ¾3j{´ôWB,Ãÿ|šñu£ëðÅ÷žeÁtÀ,ðŒXSu´zwh‡ŸÌ%xÖ.«µÌ/?Ý»d¡˜ð†£fט }ÇC¶OH¯(¼RF„à¬= B>žµGõ`æ£Á»Ä»­º£ˆþFΡû®^ÎÏZ¹/‡/OÿM!> endobj 2358 0 obj << /Type /Annot /Subtype /Link /Rect [60 608.750000 123 615.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_core_language_changes >> endobj 2359 0 obj << /Type /Annot /Subtype /Link /Rect [87 601.250000 189 608 ] /Border [0 0 0] /Dest /#93#0f#3a#1a#8a#d7#8b#22#07#90R#fc#1d#b7#1e#7f#11Oq#8d >> endobj 2360 0 obj << /Type /Annot /Subtype /Link /Rect [87 594.500000 177 601.250000 ] /Border [0 0 0] /Dest /#a0#03#ed#b5O#ae#f4#8e#c2M#9fk#22#e0#04X#b2#eaS#f8 >> endobj 2361 0 obj << /Type /Annot /Subtype /Link /Rect [87 587 128.250000 593.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_extern_template >> endobj 2362 0 obj << /Type /Annot /Subtype /Link /Rect [87 580.250000 122.250000 587 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_initializer_lists >> endobj 2363 0 obj << /Type /Annot /Subtype /Link /Rect [87 572.750000 140.250000 579.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_uniform_initialization >> endobj 2364 0 obj << /Type /Annot /Subtype /Link /Rect [87 566 126.750000 572.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_type_inference >> endobj 2365 0 obj << /Type /Annot /Subtype /Link /Rect [87 558.500000 144.750000 565.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_range_based_for_loop >> endobj 2366 0 obj << /Type /Annot /Subtype /Link /Rect [87 551.750000 179.250000 558.500000 ] /Border [0 0 0] /Dest /#7d#ac#94#06#97#0d#7d#e1#a7#2b#3a#bf#b3#f9#92D#02j#3fC >> endobj 2367 0 obj << /Type /Annot /Subtype /Link /Rect [87 544.250000 152.250000 551 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_alternate_function_syntax >> endobj 2368 0 obj << /Type /Annot /Subtype /Link /Rect [87 537.500000 174.750000 544.250000 ] /Border [0 0 0] /Dest /#eb#2f#87#7d#27#01L#3c6#c1#3b#b3#1dc#eb#a2#88#04#7d#09 >> endobj 2369 0 obj << /Type /Annot /Subtype /Link /Rect [87 530 156 536.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_explicit_overrides_final >> endobj 2370 0 obj << /Type /Annot /Subtype /Link /Rect [87 523.250000 141 530 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_null_pointer_constant >> endobj 2371 0 obj << /Type /Annot /Subtype /Link /Rect [87 515.750000 163.500000 522.500000 ] /Border [0 0 0] /Dest /Ne#7e#5d#8b#ad#c0#07U#24#01#92#ac#f7an#a1#0f#2be >> endobj 2372 0 obj << /Type /Annot /Subtype /Link /Rect [87 509 146.250000 515.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_double_angle_brackets >> endobj 2373 0 obj << /Type /Annot /Subtype /Link /Rect [87 501.500000 163.500000 508.250000 ] /Border [0 0 0] /Dest /#7b1#5e#87#8c#7e#d3#92#10#8f#df#d7O#9a#d6#eav#ce#3f#2c >> endobj 2374 0 obj << /Type /Annot /Subtype /Link /Rect [87 494.750000 167.250000 501.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_alias_templates >> endobj 2375 0 obj << /Type /Annot /Subtype /Link /Rect [87 487.250000 138 494 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_unrestricted_unions >> endobj 2376 0 obj << /Type /Annot /Subtype /Link /Rect [87 480.500000 135.750000 487.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_variadic_templates >> endobj 2377 0 obj << /Type /Annot /Subtype /Link /Rect [87 473 144 479.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_new_char_literals >> endobj 2378 0 obj << /Type /Annot /Subtype /Link /Rect [87 466.250000 133.500000 473 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_new_string_literals >> endobj 2379 0 obj << /Type /Annot /Subtype /Link /Rect [87 458.750000 139.500000 465.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_user_defined_literals >> endobj 2380 0 obj << /Type /Annot /Subtype /Link /Rect [87 452 141.750000 458.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_thread_local_storage >> endobj 2381 0 obj << /Type /Annot /Subtype /Link /Rect [87 444.500000 220.500000 451.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_defaulted_deleted >> endobj 2382 0 obj << /Type /Annot /Subtype /Link /Rect [87 437.750000 133.500000 444.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_type_long_long_int >> endobj 2383 0 obj << /Type /Annot /Subtype /Link /Rect [87 430.250000 130.500000 437 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_static_assertions >> endobj 2384 0 obj << /Type /Annot /Subtype /Link /Rect [87 423.500000 269.250000 430.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_sizeof >> endobj 2385 0 obj << /Type /Annot /Subtype /Link /Rect [87 416 188.250000 422.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_noexcept >> endobj 2386 0 obj << /Type /Annot /Subtype /Link /Rect [87 409.250000 179.250000 416 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_alignment >> endobj 2387 0 obj << /Type /Annot /Subtype /Link /Rect [87 401.750000 112.500000 408.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_attributes >> endobj 2388 0 obj << /Type /Annot /Subtype /Link /Rect [87 395 156 401.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_ref_qualifiers >> endobj 2389 0 obj << /Type /Annot /Subtype /Link /Rect [60 387.500000 126 394.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_standard_library_changes >> endobj 2390 0 obj << /Type /Annot /Subtype /Link /Rect [87 380.750000 136.500000 387.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_threading_facilities >> endobj 2391 0 obj << /Type /Annot /Subtype /Link /Rect [87 373.250000 117.750000 380 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_tuple_types >> endobj 2392 0 obj << /Type /Annot /Subtype /Link /Rect [87 366.500000 118.500000 373.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_hash_tables >> endobj 2393 0 obj << /Type /Annot /Subtype /Link /Rect [87 359 141 365.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_regular_expressions >> endobj 2394 0 obj << /Type /Annot /Subtype /Link /Rect [87 352.250000 171.750000 359 ] /Border [0 0 0] /Dest /#f5#aaJA#1d#aa#7e#88g#ee#ea#98#b4#60#01#28d#98h5 >> endobj 2395 0 obj << /Type /Annot /Subtype /Link /Rect [87 344.750000 177 351.500000 ] /Border [0 0 0] /Dest /Nj#18zu#07#a6xo#d9#3c#93#10_#af#2d#e5#89#25#60 >> endobj 2396 0 obj << /Type /Annot /Subtype /Link /Rect [87 338 136.500000 344.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_wrapper_reference >> endobj 2397 0 obj << /Type /Annot /Subtype /Link /Rect [87 330.500000 198 337.250000 ] /Border [0 0 0] /Dest /W#c1#03q#92P#fd#3f#0ebO#f2#da#fd#a3#d0#e1#bd#d5#17 >> endobj 2398 0 obj << /Type /Annot /Subtype /Link /Rect [87 323.750000 174 330.500000 ] /Border [0 0 0] /Dest /#90#ee#ddo#bc#28#e6#17#28S#90#9a#11#fd#ab#ed#e8#80#25#eb >> endobj 2399 0 obj << /Type /Annot /Subtype /Link /Rect [87 316.250000 247.500000 323 ] /Border [0 0 0] /Dest /n#0a#e1#cb#17#c4#a3#83yzDZU#bf#ae#7e#bc#e1_#7d >> endobj 2346 0 obj << /Type /Page /Parent 2 0 R /Contents 2400 0 R /Resources 2402 0 R /Annots 2403 0 R /MediaBox [0 0 595 842] >> endobj 2402 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1409 1409 0 R /F8 8 0 R >> /XObject << >> >> endobj 2403 0 obj [ 2357 0 R 2358 0 R 2359 0 R 2360 0 R 2361 0 R 2362 0 R 2363 0 R 2364 0 R 2365 0 R 2366 0 R 2367 0 R 2368 0 R 2369 0 R 2370 0 R 2371 0 R 2372 0 R 2373 0 R 2374 0 R 2375 0 R 2376 0 R 2377 0 R 2378 0 R 2379 0 R 2380 0 R 2381 0 R 2382 0 R 2383 0 R 2384 0 R 2385 0 R 2386 0 R 2387 0 R 2388 0 R 2389 0 R 2390 0 R 2391 0 R 2392 0 R 2393 0 R 2394 0 R 2395 0 R 2396 0 R 2397 0 R 2398 0 R 2399 0 R ] endobj 2400 0 obj << /Length 2401 0 R /Filter /FlateDecode >> stream xœí]K¯å¸qÞß_qÖø E‘ý E€Á4…‘EÐŽ=0ÜF&^äïG”HI|”DÕ¥¤sÓ°»E‘Y/¿*þü¯¿þ×í¯ÿ¼ýüé×ÿ¹}÷úõ‰Ýµbã7÷çËaîþß7mÔíû§ßo¿?ýòôKÿÿ¿?/üúéßûýßMÜþ­ÿßßnúϾðϾ’«ðãIsÝÿý÷áo«yÿ/6ýíÊ{úŸnÿp-†îü`âßжÂb£çߟÂWòáÏ?¿ÿãéçñûwu•7²ÿ? âö¿ÿýô—¾ýÐ:»\j¡ ÿ·í@3eŒèÿ­¥ÿØ·CçÚÞ¸°ýd©¬ëáO“Æyû¶¥–‡µ=Œ»ñŒpÙñÕ¶ï¦óÿ¡ÿ¦õl\·Šõ_ÜÜ ¦·ÓÐ?§c­/î8'£;6WuÜñ™óÌA¨BÇ¿ìh‚:ÈY<‹¥x7¸å"ú9|;Ìl§ýæ3ûy MŸ?wlž;á玳qdö¶§íÕè¯/bÁ:¦¸ †åÌ^xâ—¯ôD£­}EßéÐw>¡ïöDˆýïC[û€Ž ígeF?fT¡­Ùý­ákŠÏ5>]SÏ*…''Ò¿•ܤ1œ.Ñùè ãôSR[*Ç¿G ï¬ÐËçýkO’¨D‘ø;×sú.ðy[i ;W¾_9|l„à2@ ÒNàr×S(]K”Úöó2µë©’XUPNËN'È·ÑýÞ¹L2ä¦;•Øâø®·ÅwxŸÐæW¼õÍSvcßa×wLÙàF’Ÿ(,¾G÷ú+‹pÒŽ~eøªÆöòáÀÂÒ¿Tñd…àÑÝõ ÝípžáË‚³k[/$îRÂû9É¥´âÔªwàIò‚œäÑ8Ô¤ŠéDW5&Â\’d:‚•Öp¹Œš"±ñ/Å)šrØ€;ÑÔIšƒ×.—ùçý‹L2þ(,p¬SµMÇ8!â¬@0kãΦÛN1E$’”"ÎG¸€Åûi:×+üŠÛýXkÕºgëÓÔÈZ9s¢œC6=Çɧ bG#{–ç³òX/ç R·î#!xiHaÔ÷íû9?¹<µ}O½p¸RýXMÿ‡ñû¦˜ ¾VøÂÕ[ÛÕc¹:¸ÅÄÓ¯ó,çP9 “9\¡D àMÓItàc»žëß·ô½¥'9ŠvxÍñÏhê_ÁIá¬v†ÁæäÑ›í¯íœþHw­± M>¸§ø†Ž`ÚçË‹›÷2ê»5é;ѱ¡­ †¾ChÍ#ÁwmevðõÉUðÜÓJ釲 }‚ÎhãÙAçÀ‹†%¢´ƒÏÊØØI*EIƒbb7ý‹%“/ÛÛ¶)ÐyíÌ2íÜÔxZ 4%@¢ñCÓ•ãÔ³Z›à7Pµ&hú³|{G‡ýR¶P-ø‰„f"œO¯˜p„%3 |=¨g¬g¤BYqá#¡#ü‹TiíàTôcw@¯žqWxŸ½ˆõžáÅNÂ⮜°à„?Á¹rF~RhÑYZÅÇÀ–¬ Š‹¦­céà¼<S/¤S ¤õáLx4Œ彯Dw&惤Kb‡ØÆê¤„E4ëæ9ø‘²žzYÄo›FØ‹øZD7ÎÞ¸¶ÏIqF¡€›÷+›ÿ«OÛ‰PçI˜íÆ‘D[–é ž6¥ÙD¬èRo`¨;³‰S÷.IqO ÛgÜÅœ#5¦âéâ¥K2(Áñ¸nÀ7W O˜¤(MÐ:Ö‰$k ×wm»5–¾l¤`çnO÷£ì.zË:Òø ޳! <ªApëç£G6w>}Áž¬ô3ÎŽw>²äÌù~‡dî#sÕ<ñGâ¥Q˜×½&c2Ï)b¼Ã¨oÖ%b¾ý˜~÷_eØM3÷—æ|¼vÁ²[g§¸|É÷§ÎÜ9·Â>ÕÒËV¯±¾¾ÿݹ×nÉÛF¥}¸‹¾ž’‘ôea¤c+ñw|úíéãOÑœðlNx—ðz1bƈ¶n:‡]Àㆲ5ÂqÝJ8û$­8F›f¼?‚§MÞ™eAtŸ…ê5ë"ª×L¨^3›P¤+I©~¨¥—­„_]Dõš©ÕkYQ½+ #U ªŸû¸’êõœyÕþ‡ÄL¿í¨—ìÄ€’b‹røX“ÚàoÝo G.J. ¯r1‡±¡‚€ÝÀ„gŸ±t¸¶Ä3Y(ùÞ¿Ä<+Nµ¤š ?•粩&LY7rè&Œ«q3wó["ßÎàe®º‘™§4ª¸;;‹ó%¥J¢c{· Ì}Íð1"PØxYY(Ö~]Gñ<¾eßÒIîfJ®ŽÏ\£Æ»F#>wµ<‡fÂO–ð9·>7¦ÄÄ™¯ÙÚŸ;ÔòLj#|nèffb[ÂçZ“zÎ]IÆÄfæZásçn.ebð¹¯ÂSOŒv‘ª1G þÞ‹yÊ›lSÚø“>¼§øÉ(àж6%ýG=LÇt,»ÌÜ9EºŠ® 3»ÒØo<–ÄBÑ×rBoÑLø™û–ƒ™]©I»a)˜9Ô‚¸ˆ»¹N(ºQ\fn‹íor Öiy.þôJâÈDO±,8N‡È!×ü’B_tàäs¶†Éœ÷s£yi6¨°‰•9üÝ•ŠT²Éþîky)Y$@…M¨Èáï®T§ÝˆþjAÜ ÄÝ\*@å§D}5#R¼n;lÔ“® !Á®ñÕ©(ðHX¹,¨fH0 CBŽmïKòX’1¤â‚LÂcÛ]i—v)¶=Ô‚¸ˆ»¹”!Õ„mÿŠnóš^ºDº®pÿ½ÎL-øOM€£—Õü×é„ÿºøÜ—&Ṉ$ã?=3\h&üÔ ÿu9ðÙ•ª´›.>‡Z7q7—òŸž€Ï„Äî+ÉàδØÂÙxÖ¡/É÷Ôtlϸr¼ž½õ fvYPÍÞ¦KØÛäÀ`WjS¾3)0Ø×òìktÄÞ¦KØÛäÀ`W Y7)08Ô‚¸ˆ»¹”½­8›½¶w›ÞïøF8ÓN€j×µœÉ™Š9“³iêJSg)ÒÔ×9oj&üT1gr–#M]iê1t%)g޵ nân®äLΧ̰øN´Åõ£+¡ÆÜe[$aã-é›àfÎ'àªÕË‚jnp³È1“®4uøp‘b&}-Ï­BEÜ, áf‘c&]iê¾r%7 1±¯7‹ë1“ý(äÄn”Â~%Ê6¶qÖìÚ* õ71$(™•è‰åëYUÎÈH±,¨fU «BŽŒt¥©+ˆCŠŒôµ<+D¬ 2aUÈ‘‘®4ul¹’ŒUO¼ "bÕ©›KYy(XÐ;ÙÖXá) têOv=ïª ¬9z‹CÁ8 + }-Øx–K |’î¤ã˜×E)(•˜)<)^äÒM Û‰DÃv9þÖ•¦Î^Þ¥ø[_ËkÐNF¶‰†írü­+M]×®$Ó°›TjÇ# Û]¿u£Ø¾.÷h” Åž=˵tÒžU¯%;»–BA5ÿžðŸÉ¡³®4õÆr“Bg}-Ï_FDügxÂ&‡Îö¥:õ-»’ŒÿôÌp†Eüg®‡ÎºQL8NBìOã ŒúóÑ=€¨ޱ‡Ói§Ì„ÖrYPËS‚%ÈKÁJÈK‘ùQË‘—C­‘g¦fÂÏyÉm yÉmæ¶9òr¬q3ws%O 6!/ ¢(Ê ÍáK“ìm/`nz'÷Ê,œByø NA›Sâè(‰Û@ð “²I)ÕâQ°€.–ÇmÌ]G±È}ŸÐÍsÔZý¢¬°Áí´âÅ&„ÔQ2˜bÚÍSyutÑ.V<'Ø6?'ìûã©YâçMs‡'8i!J8i‘4 ‘㤇ZÞ¾N:t3™;‚—pÒ‚§Çf®$5wÆZ7q7—š;"à¤÷\ÖTÉåÊnÿúf©h%¹&ê¹›t¤^ööVœ¼õ„˜rœwbYp`tL'¶Z™GB&ýCY±"â%žGw¡©.Mì¦$— À^ÈÀ^dçr€ýPËKjìC7³$—%€½é©ª+É$¹œös3ws©$‡°']'OɘDÉÚHÉ uVò4<~Ó}Öž”7wìuRØ$Å{~M¢Ï o Jø>T‹E•Ä=UŠ{Ùá‘èò¸‡¡–{¡™ð3‰{ª÷ TzæJ2±¨¦¸‡¹ˆ»¹T,vÛ ßWˆ½)¦y%¯ eãÜ,`GtS>tË‚jÂÕ ¢_è¢_d§.Bçˆþ¡–'L!úC73áê¢_èô É•d„«'DÿÜ ÄÝ\J¸& ú¹&Hµ¶~\›> { צø%¾iÃA–C¢ñUŠ”­&Ýe\/iÌ” ø²àï §±ŒÓP¤Ç=‰ Ê7üC4ó:]ú„KðéW¸íÉ2Á`'žUÐ8KÚî-Ã6ã™A¥I6Å0¾,8òªž’R“€Ð¦7ÖÃÐâis 7‹ó¸e)IžÄdH^ŠÉ™sYò<&c¨5ZBS3ág“!y)&CòÔUîJRKi¬q3ws¥¥$ÅÄ&“qV¨#µ½Ã‰Ý8öŠbì´9¤È3aì² šgeœ!e)8CfnD)óàŒ¡–çIg„nfž•¥àŒá6¦¤›<8c¬q3ws)ÏJ»É³+Æ2倖r¡ó±§wS2L¡ Ò, ª)Y% h©J h™y~¤ÊAÐC-O©*A‡nfJV%´T©Ë•d”¬&ôÜ ÄÝ\JÉ*€ ÅGlƒ»BÚ×,ñÆ9Ž÷R²šàÄÀ–Õ”¬8±Ô%8±Ì\ARçpâ¡–§TÁ‰C73%ëœXv©cË•d”Üͤ«#8ñÜÍ¥”¬œ¿2|Å&" ‚H`*ÊmïwÔ"|¨§ä¯~ƒ£÷A¥M ÈÒ– ÈÒ¦disòPËó™ È¡›™M ‚,M Av%š ‚<7q7—ò¡Ð‡^£ä—<’γNJt°}ŽÛmG åΠÈËÀ!<{[Ûx…×vÒ^qe§T«F, jŰB¼!„Ì/<‡µFq45ã²B¬!–zy\I*®ÆZ7q7WŠ+à!…Žv@Ò(g°ô­c5ŸR“JX臕,É5MAÚà!ŽÓÀ…nÓ[‹GN¼oœwjTxÃcâu7Ûv%jÞÇ"Á‚(á!syÌq€C-/nE„ ÝÌâX”p€ Rž+Éı˜p€s3ws©8–ЋcugVê:J^±÷pÛ­é=gß“ÆFÑMB·^gÈ9®]Ts$°2€¬ 2w¨V6Ôò\š ?X@ V:]IÆe0ÁÊæf îæR.SV&$fôPP°¹_W•”dX(«®ø[Ä|¯€Yí@7ႆr‰Ï«Ïÿò¢ Ï;·© Â!¿‹‚j‰Ý%xJèJxJÈÜÎÐåxÊ¡–—È]„§ ÝÌ»+á)¡Kè®$“ØÝ„§œ›¸›K%¶ž2$_•¬†‚&^Ù&PÎÛŸ{ãè)ŰTË‚#7°*YÀ³d-)œ€pG:sÀ‹¶I2q×&>;t¨KÍÞSÅ„(½”JqSÆš$×5˜R®kÈŽÀä¹®‡Z^†š(×uèf–±¦”ëLz@âJ2k¦\×s3ws©Œµ¹® ·µexŠ÷©­(hŒÁ¿Ü(Ýq(é¢JtÌIp;’³×„c0’‘}0°éˆÄ1—¹²s¦ŒZÔ†|l**–+*sPTT#&]©$ñ®G Kb¢»ûM‚¶> ïXì?Á¥ÖÆ…äpÏð#+ê»5I?ü“ßÁäÂà#ÚÚìIˆ/<ù„}éÊØÐ/]‹iоðhf'6,|O}››@’'lGê¬Q¤´*mïº"À ö\^?¡yl %?%û>$Š'@áIiùðÙiq{Þå»))P׳2™‘vë ÖÃÏ? ­áè3B.â¶7\R²%>#ÄñéséfãZS)‘¨Í³R„6æ 4#Žü,©”Æñ'Þú*Ñú¤Éõ7WË?ï_þËl°‰s^³1=°Üßcï¸ Š‰jœ{êSS½HñI§ω«ðòè„-åÉø\˜Í%„’%§Ç‚á,;;AJßÞÔÙAù^¹©å›Ã¼¾üˆd/$—Q6X ÚšrãNÓc߯ö”<ƒ”ïyä]áÄã€mb—©Â¦–Èu´Þ#¼ç‚€*~‡ˆmsYOÓKøvܼpÝiæ‹+~¨‹SG3‰YqµÐ6ÅO=Ršt‘dSß*I‡Õ“ꦧè@MÅèTU½Ì(™ÇC¦¿ºMº_IY¤ßsJ’¡J@ ž§¡@ó(†ÅCû¯GË à7šòí@Ï5>¨¢Xé-„È Ð h·ÃF°.=­ì¢}\oNÊ‘zÑßH¾ JF±qZ¶ŒjÔ~¥Ôvרõ~0jö¬[ÌÏ:ùk{ónܽiãîÍéܶ畤œn”†SÎRÔ¬šéD³®Èòƒ]y”‹²k÷øÈ0‰’« ÀHßNÕ`Ûºñujr¯|“/nj†®ˆKÊý"- ÔÆÒ”Œè!³¢ÅpS€ß¼Øá€½7©‚âìnœpV¸ÞYªhFbtîˆù;ÁÕ5%~ýZ°­‡ i0O›\t­D¸ª‰Çèzd‡r%3eSˆÊk¤pþÝ4t ””Ú&b’‚:&aÚqRh±á<Í9ÕÂùºbñíØFœÞ_E £o›Ã€Bð-Â7ó2#BÚÁì7BöµPñtì ÙÿŒ¾ƒ†ì{Àu®Wð@v<0ÿ+aúD`­áéúO€÷³ÒÚÖ—H,îþâ˜Zð~ë½ë«I³‹Îo8ÜçcÌˤµL˜‡Ý³ì ÚËH‘MÇgÂ;Ðwÿh-“– Œ²pAè0 žtØG/üÏ©hýº1¥)GÝ‹ŸL« ­ñ å }êÞ¡ôÃÐ/ý„~)eðU@GƆöã Þí›Éú¼5œvH_j ­¡£&ÍÇhÇo-Jó†®v;Ù¶á\2¼âªâ³âïv¸·p“”b%×çoÚ‘{ú´ê§14XŸ …r›ÒÊvªé`_býç¹â':¿ú,]}˜l*ÓVžà­p—§9qvÄÒœQïÏ1uÞt_¨·³äYÁçje~qßA?ãô²"7p~&Ð?îÉyßgî)ݦ=ÏúæLª¸×CgnbÉ™Miá éëvÖíñP8{VNÉùp¸³®ˆ8)Ý0)hÓŒÎ/;nœ’øä´ä‡”°bNÔ%¶ÐkMbI÷àç[d&¢„íR •8z„„ê£\EÕbºK{ÊX„L$ÞBßñÆdiÔ—ëÒ}„ .&KJ–OÈ™±Â¸mÁÊ»“òï‹¢pSåÀò»åÓ‡‚+…H4Ý#'û¶¶C4EÁ“6m¯:|ä4:õ—}o¦´9Ö­ÂŘGbéË ’z4µ`£¸òOÍÆ…6É„´Å)7Þ(Ÿ•©I¦˜ËSîqΑ;BcH6Sí½®×Ä*Œ¡ ‹É4ýŽ$Ýîñ®1âé=ÞíÌλ)eÍã'oFŠÌx‘_úŽàZ{R‡ièÿÜ~ïÅÀª”øe«B…ubŠYD{íÀ¸³B†ÜhãüpTÛãÖ½>®¸‹1WV&+ºü‰w+Š;ø¨q¢ôCYœSP^m;;ø¼$Î×ÌÜÇq±@·æžÑ½–ÜÒ·_žþžûàu endstream endobj 2401 0 obj 8420 endobj 2405 0 obj [83 /XYZ 38.2500000 730.250000 0] endobj 2406 0 obj [83 /XYZ 38.2500000 646.250000 0] endobj 2407 0 obj [83 /XYZ 38.2500000 730.250000 0] endobj 2408 0 obj [83 /XYZ 38.2500000 567.500000 0] endobj 2409 0 obj [83 /XYZ 38.2500000 646.250000 0] endobj 2410 0 obj [83 /XYZ 38.2500000 567.500000 0] endobj 2404 0 obj << /Type /Page /Parent 2 0 R /Contents 2411 0 R /Resources 2413 0 R /Annots 2414 0 R /MediaBox [0 0 595 842] >> endobj 2413 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1409 1409 0 R /F8 8 0 R >> /XObject << >> >> endobj 2414 0 obj [ ] endobj 2411 0 obj << /Length 2412 0 R /Filter /FlateDecode >> stream xœí]MÜÈ ½÷¯ès€m«>ô<;@ È!È!ðf,²‹8{Èߺ[ê™–úQ­'VIê©5v=kY¥*‹d‘ä»?~ùûþŸ¿íß}øòŸý·ö÷_v١̳ó?ûã¯^ÿ­íÏû²Ê÷ß~Ù}ßß}Þ}nþû}w~áˇ?7?ýoo÷jþýyÿ׿5øcû—Žá—]iÊæ÷Ÿ~¯KÓü”]~?þù¿vùÝþ×ãˆÝçÚÉ\ÿÿU–×î8‹‘/ßu«4§_¿}ûu÷î¼þI1…1U±7Þù½©½Ýÿ÷»Ÿšñ»Ñ³Cí) _f3¾SÚÓ‡\3†­³}^>sú¥2¸ 0ö‘B¡Æ>Î[™"ÆFûP¶ôyVWðç9k²Í'ƒmôeð›áŒ 6öiÞ6Ž­xz½­Î´) }â\@ø< ·©§y+S¤ÛT8¶â¦¹?Ó¦Îõ‰s<áKŽaNóV¦H·©pìÀ"¹*\8‘|<ÀfÔ¦6öiÞD2[ñôÖugó4ÿêS¾fQYS†ÛÕÓ¼µIÒm+\o_­uöL›Õú´¿Œ`_½Ç3§yk“¤ÝWaðCå³°´ànöø¸¿yUÙæçÒµÿÌ£XN0¿ `;rìŸçF0ã±p‘™3m\à_F@ùº·«§yk“¤ÛV<¸Þ¾º,o)o¾Â}]Ÿö®¡O°±OóÖ&I»¯ÃÁ?OOäü'À½ö]xñéëîݧæŒû¯?5;}ïüÛ×_vþø?ÍuÜTû¯?îŸe®üÃþëÏ»úPy#2OÓ;?±õéIu¨êìúIfá“§'þàÝÙyybzÇT§'îû¢*¯žàï”Ógåè;ÙyÕ=ƒxø¤Ðœ’Á£á¥ãw>žžäg+3+Íé‰qÝpwÌÀ<õIL|8sýA* 6o)$›Éàðƒ92ƒ÷ë~VupŽÎÜ=ˆñÓ…€­àhðLP,Ê2B€)‚€‚ïÔÁLW*¼ÃŸù_Hÿ”¾§€¦H† Çï3#30?ÁÑð> £µ’5;¥9NûåÉY›üÕîz=ïáhgÊÛ=zášçéssç'Æt$½‡¢ø„2âކMá„Ò‹T†‚…i ªý±&$5–ÇŒœÜûO2c# ¶ cl2ÛHÐDfD"Åùa-’)l€õ'–Cφææà õèîí)Ô¥ÌótÊÓ)—§¤z ]óåY¸6¥ûšê}-ä]¥•¬®œ!Y§¸Ë—9lÂñà­å€û`¬ïo„ªËÓCàr|2ꪘ?ø¨è^A˜ÑT%‚re =|…ghM°³Û”–ÅÚOu=þ£–H0>CR¡ÌÏB¡îͧ>œ&sEEž´´ºõä>qðÉ'ôÏ-+á“>ë±9|‚×G3ø‰!(úŽVM§ðÎûéëñpO-~‚÷” ¨ƒ³ÆÅ4È1WÙésËðJáž |)Šg ¬ç‰øŽîz E…¹á³€Ï6ü¦Ž0œ›p²ù†GƒONÄtƒ3ÖCHá;Ä.0¼#Œ†%–; u òš¡3Ãxð ðÙÆï0rGíš[íM}˲ÅÉryÏð6ÙáŒL&?Ø>X¤(i½S‡^téz‹nu¶ñ¦Ïí7¦Ù^Öy?(‡ß9ïtypàJyë’С'¶;½g~ºonázjô–somâ ÓÍÔpng‹³88c¯ïHÝðwàhÂJ!ÝœA«³oÍò°?˜:ø äûÞéæª.œ+&NA×T  n!ÊïE8©§;áy¦b.p‚û74ˆÍ#öénÖ„ _c°¾gËž”°ØYÂ\tS‘r?aWRx$–ñ=¶N%D ƒf›ý¤°ÁLôoÁÀGžÙ>›àAÆ'>%âÈì3Ö"ØM?¾­M‚o ŒNo¯²ôg¤\';]ßZÂOTàÛ0 Ã'¦R…! 3`)«ÁÁS²Si}PA†õ'‹§$¨BUþ[üÌWýû“4¡zH‡:lÂõ 6B‚/ÚœæÖÜô˜S­›ó–wˆA°3PÌfý \Ì|¸ -Ü[_œÏªqš¾¿[O2¶²ÕP÷ˇÇÊå®·g ŒJø@Çg1Ù鮕îZ1Í¿[{ÔñIlØ:†- ·¥îµÊ¨¦2ÇÄæúÂ\[¾žÑB31ëÁXIŒ %ž8HÇ \TùÃtøGŸ,à+1Ss¦èsÄó\]ÖÎs´óì!Ú’yÂà‹·)krâæÔŽžçðšÜå×LyE¹P™Š(x4Ý5&6«Ž‹îzÇ·'ÄãîwœéæFoô¶šâ +ˆ30°&j·=ðÉÔ­¯>eоvT‚LÑ$«%|G(wÅH6ÕÒ{±bÅÌÙ¥vK (½H‘m{Ú•y$¥*/;Á-¥ æŽà¼׆Ðí „ŽóZ„ü&ó çQÁY33hϘ):ny‘8Oç^ñÔ #,Œë>¹xþÌi­yðw¿“] ½D¡”«2N¶ÀÉ+™éQÊ—IxFu=ÜÔ T«ª05Ú¹…”À¾èï/l{š~¨Ò˜å—G¯Ø!oym.Ø+Lj¸ÀÍ"¡á¨rºÞÄõÙû‚Ä!W¬Êâ("ö—aNÁPÆžšäS&Îâeü©® [Ø@÷ðGÚ0ÊJÄ‹…ÊÔˆŸ û™ÜÒÕ¡]_92Õl ðÛÀ® ˜pcN*˜’P£[a›Ê„wž Õ…×ëøð·j_«ÐÕ‡–¨Í].wKÅÄUê…¯¹ãLdÏeȬœºîq c]….×0ßßÖqfKÓ£¢Ã®¡äœºí|Ì«>'ªরWÉ™°`ªšªõ x ‰[1å׈4_ÈÆŽ,oVör{ÔC虹é–Yfì¸D7þQ–X–aŠª–èv¸X¯jJ€…Eö™D‘m>É ?aŠìãdü„i Ð@7¡…(Ñ-œâd)'Î0Å»‰Æ L)pª5€j•.­ƒœŸ(vD™sNS‚T$ë'Y?iý¬ÚŽÀI‡ÄÜ’‘ìˆv|GH¨Ç\Å$b«¶JöWûËv ꙿµ'¸ÍÑD*–7x¥„LcÒó“•%íÏ6­¬XöWļõ®Gàx¢!a²=ÄÑÆthøÜ»²Š{×E'åÞe°;“Ѓ ¿ƒ{dáwp[¬®c¸Îþ#æFõ‹UÁ¥²—xÝ XƒÛ74´É”ÅÑÔÊ鈔3c D+¾Â†å:ç’·×ë_0èB9Ι  ãêfÀØAÏ€Æp؇˜ÛènTwÖÛ>ïW±¶­¼óê›P® Œ`Fl «ñ–ügòÒc{‚{&ˆö Ò¼-¼)ñèVá ÄJ²#ne£š•RÜt«¹P±µ‹TÅ.Í@1G×Á”Ô¦ÛÏ2qü(oÙâm,…Ã|ÿ)`â{+(qÏxtÝ›«i¾³1\UÏÊÓÁ8Uœ¨pÃWb|ÃøL<&ËbãŠùMÔ"›…ÆXp=º<Æ!2eP´›tf¬97AÈ@XœG“Ã-nÀá†uIxˆa›kFNÃû¬·y&ø¾˜îZ„“@L ‹Û ®a‘J ?¬ŽÁ,ÜÏïŠ)ݪÑêL·¾ôƒ2~HeVùž6cöj‚Ôz¾ï”„Q–Œƒ†‰þc8tq0á:×ãå ×%,ôŽ *©Bâ’@Kš\K“c§9Õ“%pz m YË¿-ûê‡e „^¸÷à3`Y]€-¥#1EÉM•VOSV&Lâ‚Jœ+,Ð_¹ ÿƒøyâ–OŽà£+!ç…3ÍÑ'øšB+êpuè!ŒßçýZ »,”eJ|'‡E8VrÎ\9㜠¥?ÆžÄY]Þ•Vqx"uµ±L»þ䪇o¯ÑþU ŠÀ5•:âD× ]‚11 ˜‡xaLo à :8RêÅ«*C/U×ÃtX¡Ø 5ô™V Û´UOñE<:¾fͽ08Цœ-¦ÓŽnÄÅ¥³RJrk$F%PüS¤/ܺjëzùÀÏjúZE˜ÚºGø˜h3[ÜÑèžð·0¨ì]¼x  ÇTY^ðï­…±§ypLÈDäØÊÏౄ|yLä‹Ë.½ÈòåLkGw(ñïfc É8“ötqDÊv£JΛÑ5$¹‘s#ï¬s”s 1·]îMˆ9qOßbÎã{’tõús®œ…|Lˆ¹„˜Óרˆ˜sõdêÚsÞtxÀ æ|i¯?y«O°*žf¥lîï¾ ÜÆ”YºJ݄š¢èL!(  ©dûLy6¼·L“k¢d …4$ R-¬úRÝyOßl TB•-Vmÿ`RÏCé¡ZO–"J$x2s>(e»¦0}T˯® oû¦,- |2¬æYÊѱj¯´ä¡„ô¶¯Si­&Ü è«ácbsÛeÜá¸ó„‰ï~©äé–¨ãáAµ0zçpL ïއ£á–òÌhB v‚GÎkÄË–Wã­‹u©\Ì Ën}‡hl‰ç&t®PM'P.þŸ’LW˜dŠyIXÎò×;|KÐ-”O¤ÆRNƒ0·,| &Ú,ê\+뾚Y¾ìü–ïmo1ß5Õ“çf²%L´š ÷÷&‹%'üùÃÆ¬¹»ãT?¡ÛïZ7z®ÛqJ·¶ÅŒPHÈÇ­çEmR™Ü ußn ¢$¹¥N ݈…ë4SJq–RŠ_NÕ$>ˆ™R\äã-W*âhÞaÌcx `îÛq|¯# ¹(SÒí=»µQuŠ‚>\Ò­À½„.ȈïP'¾ƒö+‘õœôâ$U¥(Kqˆ7RžZij2·á¤¶Ò„9Ϭµ˜‡˜Š8õ?R¢Õ6µ–`Y1»½IŒjî8gÓÎI8õë&œ­Ã”¤ºÕ3³}æç$R §Dû]áÞÄè@¢ôÀ±1w«˜Ó£?Ç™iU,ðÕÊÎñÒ§6Ó’ÌNm¦×@T K|gÅ%ŽR®µØý#£”}Èd» yãéBéµ Õ}&dm/žºæ„k!è~B2e΄hƒÍfòÃ&Ì^…—ˆÂ Ësæâuðr˜Cåz |R_HUR›ž.¡ª¨lŸ3—f)j)®ç-E-¹4ÄÜJÔ²ùµÿÞ,]¤Ì籿p‡%QÝ"›kn`™9Þ>÷¬Xëeº¥ÑÏ+*o(¼3ŸÛ®>ƀϋá“ö.nííw GnYÏè;n¬ÜË­¹}jW:¸€· [ËþeJœ¬i—>X`{o _Ž\n,ÃàÑà;íUÅLZú+— ËpÇŸ›wOßh éM±déöøâb¸*Ä –ÞÁsû‡÷Žfð;Äh­%=mn˜:xÖø 1ßavŸxVu©ƒi°¥“_fÕÁœ§%ž!_Y“£ ðóþóîÿ`b¨W endstream endobj 2412 0 obj 4859 endobj 2416 0 obj [84 /XYZ 38.2500000 349.250000 0] endobj 2417 0 obj [84 /XYZ 38.2500000 567.500000 0] endobj 2418 0 obj [84 /XYZ 38.2500000 208.250000 0] endobj 2419 0 obj [84 /XYZ 38.2500000 70.2500000 0] endobj 2420 0 obj [84 /XYZ 38.2500000 567.500000 0] endobj 2421 0 obj [84 /XYZ 38.2500000 349.250000 0] endobj 2422 0 obj [84 /XYZ 38.2500000 237.500000 0] endobj 2423 0 obj [84 /XYZ 38.2500000 208.250000 0] endobj 2424 0 obj [84 /XYZ 38.2500000 70.2500000 0] endobj 2425 0 obj [84 /XYZ 38.2500000 237.500000 0] endobj 2415 0 obj << /Type /Page /Parent 2 0 R /Contents 2426 0 R /Resources 2428 0 R /Annots 2429 0 R /MediaBox [0 0 595 842] >> endobj 2428 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 2429 0 obj [ ] endobj 2426 0 obj << /Length 2427 0 R /Filter /FlateDecode >> stream xœí]ˮܸÝ߯èu€i‹©ðõ#@ È"È"ðd 2ƒ8³ÈïGÝz\_J‡O)µZcÌ\eQdU±^,žzóÇÏ?ýó·Ó›wŸÿsúÚý|÷ù);—6kÿ9]~ýðýèêÜýþTVöôõ—§o§oOŸž>5ÿýöÔ¾ðùÝŸ›ßýï¤Ojþýùô׿5øc÷—.á—§R•ÍÏ_Ö¥j~— ?/þ¯§¿üîôëeÄþsÝd^ÿÿ•²…¹ÌbæËßžúUªë¯ß¾þúô¦]ÐGT‘+]”ÉÍIÕFŸþû§Ÿšñûѳsm”* Sf7|§Ô—e¶A× ÍU6úÎõ—ÈèJ~l]dÑÆ¾Î[š$*/”pA¾æVw|m$Iœ>ÃèhoË:ÚØ×yK“¤ç+\¯}x¥Nžyú £ËÓÞdU¯×yK“¤ç+ü\™\奶æÂã mUéæ÷eÞýsÅ”é5\38?^F—[—ÑôC;oi’t¼ö .·‡M^t;¡,äÉ3 ôÆäÑÆ¾Î[˜"=WáØ‚L5µÇÔað„·e<=pw$¦Â±™Zöß|Kœ8eÄÝTåe´±¯ó¦HÏT8¶ SkÝm&[Êg<áë*Z4ÕÎ[˜"=Sݱ?ŒçÑþ Æ¿y^|þòôæccè›0£8}ù©™Úõ“í/ Aló?MÞÞ_~<ý>Ë”ùÃéËÏOõ¹Ð¶ŸáÜ“ü-z’=ÃÑ*øŽ†O>À'uøwTG{Wš£'΀¢AÌj´¾ƒ¿ƒ%„à‚‡¢XB ­=<…O©ÂsÓ*œsö=œ5¦u;ë_Ý]o4J¯[·…O]ã•K¨kÖßÏÔÎ`ö3~óçcøhŽÆpNaBÌáöú:mV?…Y0QírH¯OzõêÒ‹9·¾—塜A*OÆc5±-Ásƒ–ÖCQfÖPF±Íê´K§:ü•Ûü•øªu} ™Ç”‡’í±Z8öÄ3À³ÆÑæ0– (}X÷åY¸$­¯ÿ…½ â;[ µªnØgŽS枤Y]^ö4Å|HAm“µó©õ-Ò|D…{ ¤‰ž6Ú•½vmælò¶²íe6m|–Ÿ­)ªË3w•Kº©AFŽªZ»¦òs®+ÕÐæåIkUªsUgW¢¹Ò91Z®ÏQi4¼g]¹;|)áCL sÖîÛ“|ÑÒá¬;?Å'<8Zñ=Ãc¢àá V† bÄ]njåìòÎc “ F3`rãw°`]gGÓ¥Ë"<¼ 'WdáÇâÊhTÍ1eb¸×ãaØûpw^ ÊÎE©.S ,#ðq±Ñ²X?Œ†'fOYØ–qJõ³}aO0æÝK ž0‚8ÒÜž]hrQf'ˆ¦©ª Ç4yˆŠíðhâËÝLl “)8¼.8Z—ÚŸØ Ž#Ñ•Šì Ãïàï,W—º"8H8Ô”vdB87…×#ê»àÆxðxÖØœyD†¡ÁÆV|»_4è›]i’xv•1¡ð(GžH•ɤ]÷!›r(EóXždc ˆlÙÅôÌ ghÞ.Þi³™´ˆêËÚÜ5Xn±/ ]JLW «IÌ<<“T%Â6 Wk¹Vô쑼ÞÞ“ß”æ!¦’sá>^úa1À: ¦± s,e¢&97‘ $op"Z¢ºri™ÌAÀÂY!L±Ñ‰„"#ïŸP±'\Ô“Å”*"ìA²\÷á= ç]ºmѯ«öžK‚åzžÚX®ú¬LݧîÊÂ:ò‹³»ñ¬ÝpÏ㚊Vw­i²/Õè¯EŽQXžµ1¹¯¸…"FQÞ©¡Õ* ©Ìqvá9ÕÀÆÇÑçq½`ÅëæƒÇç/°æ•í= \.„_0œ¼´í)r‚Wh=Xf€¹Àeø2õ–ÖŽÒ¹a?¯_:7%U«3y .žÓi!“™Ùùx`€ ·4¥ †ƒýÀh¬¹°”ã`Þ‹~Gc€FÑï(±ÂßÁà"ø;ëB=ô{Fç¯ç“æ«4¬|kOl X–fi3úûø“€%ò 1>–Ë„0aæ€ [$¿¬©÷Ã{Þ´÷|ÀšÞ«ô°¦^žnÖ4­¾ ò°Õ´7A ž¤g‹ºCHO;€^îÒÓÚ¢§i‚<ÏL r¡ÔëONáG‰”h1~Ì3s¾'‹ÅŒ§V‹8×÷œÑǨâºÓÓ{OSÖŠÏpeoé˜=»ÃìaÊË<ÔÁõ wvGÑfÚ1p[.¥Fè­I†ae¨C\p¸* ËL®ˆ º>¯3yzÇaòã&G…Ç´Ž„Q Œ$fçR%{ó®v @€˜WøëÜ5î’<7´]EvW0S»¿Æ&C¥Ä7!™ê~OÜ$Š"‹• #ø|ìiE.Š& 6àJŠÞ•¥6òòM¢R ¹šç*_ ƒŠÍl‚¨W”CÝÕàdžšQøN¶88´|]­ v‚ïý¸J<F ë3[;F#Þ˜†¯kgñå ¾ô=µXÕ{£kÝ{Î+Ÿ½…£už>tyÂöÕ™¶e˜@̆Ìd ¦ PaAζL·”àÐÕ¸°TÐjzj•-æ%ãb…ØÆ¢úB0̤ô-Å¿ ¨þªvÚ[$ùj­òy·ae˜ÃuüCOÏÉËK÷/Öñq¸%ÛXJØŠ¨5»³4 ()Óv¿ƒv1E1O± c0— ݨYc.ÀY3m”R¶¸©­sí$ÍWË;uÃþ³GzzZuu ”ûÞ4á&xb÷sKÞ¸ÉÌ}ÙÎ+Å4Àtó†\Àö#íÉâbHrŒ‘8+åaš]¶) ¢Û+b̓u,ÑLÁAà'DÛ8ÏžÃÍ}Ÿñ8ÓšÁÓÒGQ„Œz¸ÀкJh†CŠÇ‰ SYŽÆ^~Gy[ld- gˆZ#ì0—~îÒ¬ßðfO;üµPFéaÃt¥õÐDy‡l) Õoâ(WY±\e×Ö˜z,ùž=p5Ÿ™ìò{7ɺ€ýh¶Ó&¦™±¹cgö†ÍÁÀt¥*4õT£¹¸–¢ØÔTÏYSމßÎz¢jm\úÆè:]›Qe_»83O<“€<Ê#¨÷T qðwp€ žÐg®÷nšÝTëÍì&ç)“ÐJ­[f¥4Í|ò[8”Œws‡™iheê­íüèw6Mž ‹Nug³€ïÀ;›¸MܨëŒÎÄhyx§3•a3`îB⻡pž»¡ø8ƒÎXO­ôcô°¨Í¾å¦/Ou•b/×lâAHxtaw ø;¶yšÚãN~Ì©.T Ø<àóD<7ìXÊ9UìÍTî¦Ø0þôX™ìƒÑ³zß± $žGºŠÀPö¨\Yˆ >51çî¶Du ZŽæfi}¹ú¥Z š/w_ÁZ‘¸–J%6‰´5k €$ª h@F55P\»þ6Ju¶w_ž°(ŽÜ8NØzƈIJ.81l×RX×Y½§³–dýe† KØŽ& é¢( Ù·>*"Óšk‚ QÊ£6“ }ÄÝFÂßIyŸÄ¼ö?L~ÄCy¢ª4Ç©t1>Îä&ÍЧ‘Cvä]9õ!¸Ä¡>¢é’å“ÎÝp§–1–!ÑlE•ši ªÂíejXEËFÇxD v0Qs‰Ï\ËÃÚ3ävæmÀ­¿z¬UŽ-¼Ó#&÷;JñE¥»ÂY_y\\~+\D»\ç³\q 7ÈÞy|­pøÛ±ümc‰­ÎßVh5U–[×l ?¤Íó†Ûr ˆÈøI‹:ësÇGUÍ–”› þ‡hXî¡…h“¼`´ cøm4 4¥Z® £ ÆÂaúöŠKeP=R†ÉµbŸ®Bã;ã…Š(ÃeuàúèØÂby‡‚Ó¸çýEí:mQü#îÜR×î ˆä81hD«a±¡§D.`¸\”¾yŒ÷|êî×î&K%ÈÝ·eHâÇ V’¯@,ŠÞŸ¸ï¶åë­/–ïš/—¬mõz ›,—ÄEj ÈÕQ.ùHå’Gáá& á^ðôž$d÷«Ä²“ª(Ò6æ®'{O0qçÉâ2ù]¦6`') wLï#c˜êë"›£]áîñ#™~©åDØÌÌñuP›jk3,sâàAa&ÙÌ ;fÒ[øÆLÂè¡]ãý0M|=x2»‡˜A¦B9œß“g b ávÔÎãõ@™È¿Ã/m~¾5ŒôòùÓÜ_Xà²USr7»)S—ùô8TPGÖÝÎkÂv?ë³n·æˆwÅøIçEës1⃂¶å=úN>ç!MÍíc·R„ûÉ+â§/°Óù¸¨{¿ËPx4øNç&¨ ¥—/bË Üå÷ÙÐuJÛpFkHoJ HwÞ2vI°{1!ÒžwðÜ0÷0àh ¿CŒÖ9 asÃÔÁ³Æ{ˆùüSà^•¥¦Á=íü2«Î­‰|­ ^“~e%ç,äéÓÓÿµr endstream endobj 2427 0 obj 4768 endobj 2431 0 obj [85 /XYZ 38.2500000 551 0] endobj 2432 0 obj [85 /XYZ 38.2500000 221.750000 0] endobj 2433 0 obj [85 /XYZ 38.2500000 221.750000 0] endobj 2434 0 obj [85 /XYZ 38.2500000 86.7500000 0] endobj 2435 0 obj [85 /XYZ 38.2500000 551 0] endobj 2436 0 obj [85 /XYZ 38.2500000 86.7500000 0] endobj 2430 0 obj << /Type /Page /Parent 2 0 R /Contents 2437 0 R /Resources 2439 0 R /Annots 2440 0 R /MediaBox [0 0 595 842] >> endobj 2439 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1409 1409 0 R /F8 8 0 R >> /XObject << >> >> endobj 2440 0 obj [ ] endobj 2437 0 obj << /Length 2438 0 R /Filter /FlateDecode >> stream xœí]KoÜȾϯà9ÀŽÙod;@ È!È!ðî&XÄ‹({ÈßgHŽ$r¾æð›ê&G¢[²zØ]¬ª®WWUøÓ×ÿü½øððõ?Å·îûÃ×]¹®lÿ‡¯^þBWûîç"T®øö}÷T<í¾ì¾4ÿ>íÚ¾>ü¥ùé….þÜüýµøÛß›_þÔ}èðï» BóýßÇïuPÍOåéûá÷ÿÚýõÅo‡ûå:`^ÿÿ‡J;s„bbå§]ÿ–êøõû·ßvÚ÷Ÿµˆò® Í7kl¡j«‹ÿþ¼û¥™¿Ÿ½Ü×V©àíáCô:AR¥+”®ĸÑ2Ç/‘ÉU‚¹ë:Ýܸ…1¢ŒWѹ‰ªêp`çyvù¹­N7÷ni”ôdÅ“ï+k” ÚÙôuU¥›Ÿƒéþ\‡±`ÒmàÓä Èá|HÇF¸m`8·àöªn.È#ç4yÄûNâáÆHOT8· QÃaŽn´M@ÕÓìò˜÷¥òɨz„[%=YñärtõJwBR—µ<îO³' «1É´m ·4J:ºF&¤«©L:+êÅìòs;—gp'²¢"“ ÒÕÛNÿiïåñsš=îke“Í}„[%=]G“™1 ¤ý ðÇŸ"Þ?î>|n@òÅã/ `ÇõÚoßwöðŸÆ¯\ñøSñÇõcñøëN•{TÜñsíHÝŽ¸}Y›Cüâyäî8b÷Ö´qç‘ûöÝ=< gt…FTy©öU]zýÕ>cöÎú*\6bÚ7­.©¬@b攎|:ޏ½Ñ•z=b/6ò^p]C4Áë„ù³év6¥zÊ]°Ž²Ä:ÝJ‡X'ò>øL0ü f ¦œ-‚ÑmÚ ™6ºF[ûã|\Øvúzïêú­)¹XÝ _´“ð¦_ùÙ¥(ɶ/øé±Q€×)/eK¤¿ü ¿”©^Ó³Þ9ƒ¼s#hDßÑzþ:x:7RÂÙ åG8›'ÖY1vÌ}FNrašZp¤„ï­¾Œ`Äͧ †SKc~ù$É—Æ,Qq ßty>Ðwjü>uÆÝ|¿*ä 9x&œm²6°¶¤ -ü 6Ás×`C‹0Ò#`S…1wñˆ("4á!1>ží#B±éŶ:ÊxD=@s Žä4Ête7£l3Ê8É”æ£ *pŒ«æ±µ™k›¹&n®EfÃ2@-ƒœF¦Ñ:£‘yóFRÞïz¹šPó9] TŸnñq&lœ~Å0?‘ñ‘3îÊþü ›ÚÌ쌘h[pœrñ±{k2~œv«á±2@Œ¼›Ð†ÆoŠù…صvÜgíä{w¦w¹\Ýûñ+HcÆÇéPw3iÌÌxd¶‘±Š5¬h.¬(ò)ûƒ0åG†O$1<“e1¾ —Jãåÿ2,¹|ˆ\nƒbºÀÑ!¼ŽhF„óçR$ˆÚ¦SÜ•Ò+íP)fâÛˆÄÆªÇ‰!øRu²êr<ýH€I{LBaz&ÃÄW vc¶ìVrƒ•!Þé×h]0-§A:ìÏbذ?KHbVa>ÏÇNj" …gc<ê5¿©Á”[<%@Á¨æ·H¼ ãšÃCæó5“¶‚ù-C½EU¨úœ¨Óþ(ê‚êE]ç©rß*‘Áâöz¨:í6ï™;ø † F³uÊöÊòyVÜùAÌÆz4[ÇFç x@#ô{£ô@¿&'¢²Õ€ŠÎ>5ÆGçä©ç¿uWGöfd£|Dë0ØíÌ‹sT$ÞsXdvc+ß[+Ï¢EC0v Ôï̯6üL„”'OcQ·î¥eó_˜¨]‡ò½`ëžÁNÚÎL@?ƒ=^« ßqF ìh‘ð†;¼8°X»"î͸µöÆyQ÷C¤ˆfÕD‚ã`DÈ"W¶"Õx“eç½*;PwΓ˜fè7&HE†Ô-다‘.£—hø5¢ sZ,S«žéx‡9f¥2˜f Äé7fÑœêêTãL…Æp°WåU#‡–WQÉSjAqà‡Ôq5‚yºÇt̘ U «QWYí ¬f¬ªü4¤Ëã*rW×ÕÌ媤„ëäÄU­®i*†eîdò<šd‚J%`3X΋Õ^@{ã3Ó~y™Í“-Ï—ÔûÇÌc¾Eþwnãÿ«øev…hòÁ›ÛÏ Þ˜2-œLñåF°“nrãfåÆŠß'R\†½ Ñ}Fõ²Ã©Š ¿a\|€a£x‡€-BSl1|Àà-§T­ÍëU“zÆñ _Ú¾) è® C„©ûà+B¶ƒ¬ËŽw/Ç–lsgÙ¦Ë3€¥ŽPˆ² &g`å¶PNPÍo0v˜6‰Ïð$˳UÌm…¨fHÕÑP)3E¬¨Â9ÔœqJA¦~h¾¬r÷C#lFæ¡b©R¸-1hK ZSbÕ?@ÖH—-øMÛs`¼{ð†–MOÓM¯ÑZ7Ý‘zD„a7wÉÕRã ¿~·ôêÞÖa°&Uü=r˜ÎX(-ž˜—-mYD›HL"\‚q¹áCÙ,3ô'†‘ Ò\®gÜûÊtÁQY7&[Ë&P€Ygñ[PeÛIm#”e •e†ÆG¶b=â7‘R/ªG“l#. ‰šMÎȪ5ÙšÃ\’›1 ßkN˜€@¾pLcØôfÎeï"Öõd¬îzæ§ ªSÑà ´ÜOˆŽÊ ÐñÖzùSÝ©cÅèP‰Ù·Ô!+utøQæ¼&rb”éXU¶t,c±—WοÆü¹ØâÅ^ &ê3Dú-áîM‹ã cñšW¡O•ÞŠ×:ŒÔ×$¾þ]AR+^&šEpñ¹-€HRÏXæµÊ™zw‘ÊË]q–×xO0üÀ,ŒÏc°xË‹®”ºCëòز~o=ëW¾|+É Én¥M‰¬±eùF\qá+Ãߨ|š“Õ©Y®xrÚ²ê&r2Ý ¿|ŒbÑxk¶œFÜU9ï†e›‡®¢i˜·Á\C{ÜÀˆ8ÏÞADünãò5dÆàÙ"g8jÛa¨ϳ‘m¹‚7Å·JnÔ^½–pêZâ/OáÈñ>Û³Þœp\Rxâ7¶zWŸºø­‘»\ñ­ŸzÇxèfw=®Ï̹OÞå¹·ß6 ŸYô–W”—½+ßIÁ˜ú„`‹@ï™ÜË ¹%r)† ¯å#8À`¨½MG{}:_ª§ÕsT«.fºm1'2Lk+ºfúEšƒäHæPu=àX…=MÆÂš²‰nFmÃàÝdûN†ÑÓ’NWzøzØŒgÜœðF¤ÂERû’Keã†L~‹mjSª-å‡RÙ¸‰‘l>ÓQ¶}*ÆÁŒL¨ÒIªiÅÛêŸÃtºÍkI×ÒÎB*íò]rúFZ&ä,ß÷•~½V™¾½|‰Nä˜iÅØÉy|ÊkBÑ‘1ƶ©ñM(ØU#BÑÔû0Î"öˆûu"÷ш¤/_^"öÜM–1ìôRqÛgÙöY¤Ð—¥û,+™kJz7“汈]‚ãWkç1WmppÕÙ¢ÑÆ+ÕÁ+tXÙõ¯<Çëuçwù©UÕz¯ÛpÅ‹‘ûÎkta"½÷£6 rôG´Ž™ç`ûܽéÈ!í,OìÖØgÊ #ß_°ÛSزÁÂéÌk(<|¦jÖ«‡g¶eîðsyª;Ñn>¡5Ä7Å¥;› i¬&ΰtä ¦¦œMágˆÙ:Q;6Œ 5ÞCÌ: ðN{U;·´óCYíÛÀåkÃN8tZrJC_vÿ¢‰ø` endstream endobj 2438 0 obj 3662 endobj 2442 0 obj [86 /XYZ 38.2500000 466.250000 0] endobj 2443 0 obj [86 /XYZ 38.2500000 410 0] endobj 2444 0 obj [86 /XYZ 38.2500000 785 0] endobj 2445 0 obj [86 /XYZ 38.2500000 785 0] endobj 2446 0 obj [86 /XYZ 38.2500000 146.750000 0] endobj 2447 0 obj [86 /XYZ 38.2500000 466.250000 0] endobj 2448 0 obj [86 /XYZ 38.2500000 146.750000 0] endobj 2449 0 obj [86 /XYZ 38.2500000 410 0] endobj 2441 0 obj << /Type /Page /Parent 2 0 R /Contents 2450 0 R /Resources 2452 0 R /Annots 2453 0 R /MediaBox [0 0 595 842] >> endobj 2452 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F8 8 0 R /F9 9 0 R /F1409 1409 0 R >> /XObject << >> >> endobj 2453 0 obj [ ] endobj 2450 0 obj << /Length 2451 0 R /Filter /FlateDecode >> stream xœí]KoÜȾϯ˜s€¥Ù¾€`K¶äÀ°‚ïn‚E¼ˆ²‡üýp†œ‘‡äWdSÝÑhaw$µØ¬®wWWU¿ûÓçìÿùûþÝãçÿì¿öŸŸwyVy÷oøúáû_Ø:ë¿ßWu±ÿúm÷¼Þ}Ú}jÿÿ¼ëøüø—ö»ÿííþÏí¿îÿö÷ö—?õtøƒo»ÊTí翟MeÚïòóçá÷ÿÚýõûß3ž^×sùóµ+òòÅÌ›Ÿw§Ušã×ï_Û½ëÖôSV¹±{ãß›ÆÛýÞýÒΚ=ÏoLUú*¿â=•=¾¨nöÆ6ù¾¨F¯9~©Lnôç6¾ˆ6÷neŒWqnE¢š¦êpãró§Ù#`¾‹Ç1¸µQr"+ž<«½3®²…?Ðø@ߢ®mû}åú×a¬UhÑøÞܸ#έGÔ:ozo¥(ô±ó2{„¹Koî#ÜÚ(éÉ*L®H×êLW}a}™<êk_F›»ê0CXñÜŠD­›xøeòˆoŠh¸ƒ;Q‡s ˜ÃÑýÄ`ž…¾ìÞ=µ5û/¿´pß×}|ù¶³eûC»9wíO?íÿ˜ç¶þqÿå×i,mÑ×äÕq¤ÈlÙ GÌâ™÷èógkÐl¹éž±Y»#­ÛÝôËlÝH™9sœì»‘ÇãH•¹&ÌöÐÍf²¢qÕÔ9±pÄ”jû0³Ò_Zæ‰CxS)1…á´­:‡T4á3˜¾x6ˆ÷üé!(³º#ý’÷@n1>ƒyÏÁ•¼gÔ¸¥Ýø•SÜâóŽYÊz pùHàz"š"ˇhïDÞgÞU—è8-Úž†^Fá3¢ª‡ø©ODa;h$/áÈÇžvÎÖærÄ/6`]¬ }qŸ1H.+|Y_Ô™åë‚ËM"PÅB=|ƒg°„¹¬ w"Ç’÷@ ü æ‡щᇞ€Åˆ$&2âññ$ò Éc›p¶Þƒ g³gÒqÈð= &ÄøZ‘Ö1¾4#½Îi²ÎrŽuÎÄHïLŒôj6Ÿ`y-NËë)>êùG Jú‘ˆ@Ñø¡°Ü‚­æ](=XÂû­ÄšU¿‹šBáW`±eÔ¥xñ374ëР–ÁHÆ©KDäX”TîÐP?xAÒpÿGŒ( Ñ£å|L`lªâ¨µ·1¥S³¥µvA°¹ BýÎד £9¨!ÀP ¸Æ4ÅxÃôÁ< é#`‡ O¯ã¦8$UÅTÕ DÙöü ÌÒª÷ü*»gLlƾCb ž fD‘°õ^¾K§øq Rš‡á2ðô0ŒC-³5– eaT6C6 |ß+°ëñ/õb5p·o›¡©J´aöT;ÁAâ¯6å.Áº3yF=µ‚|Ma/ß#xïÐ×̱¿÷ø¸R¶‡„tôÍ,<ÂȶC”°ƒßƒGˆˆƒTø>s{É`p½íkÓíkW¢¹^Ž|ÍÅŒ@©e¨åðl,gXšð{0í1Çb½A¬ÇÃõà÷º†ÑBªëéCa~æºRPát§.F±ºÊ££1ïPë>Žawù± ut]Íc[ˆ+½Èêü\^.]Cxl±yìKü1Æc7Øòbþ½K;¥wç¼Oìݽ:_ä•ùŠWxßi8¶twoë|n®XCŽýH8"؉œ ì-bÁ+Å<Ïh\ìùaÛ‚uRZ Ÿ†ûìUšýæžÇ‹¹{C‚W»KéWxwU¼ûæQ# 5œ…:Ö¨Ù¢’dÌF?ÒðrqMt%Çù<8<3yT…;¥>ž“ûªQ…%s8­št“*¹g”_B½˜( ÉÜÁÇþD†û8-n‘•p~û¤n¢ BHºÇIKªØ¡2„˜,GœÙ‡“£ˆÀDñŠóæj˜T?AWÎ1|ÌÌ-W Œ£g€¾Ä)uŒÜ3õØ£eŒ~Qà0 ꊇn–)ÆãS ÓC8kI•üñåµð”uf±ufR ù8Oå°®ÙÎQyÖDv¨2ùƒ5}DCÔ”ÍДÛTR¢žýÍ:uÇ™nF#T’ʸK”ÃKt'`j}™Üï‘2¤‚]ÔO…Ù8Ž& ±¿\ Fôˆ­Ø›Û &ˆf–[•Q¨ë5ßÞ¤ÎA‘ˆfDÅ­5Ôë+½ËÖP¾ìg˯‰)D) T jèVF2î…˜Àñv&à‚eƒ‰‰¥ iT ëv RÙa »XL'&©»i"¼óøæ³ôÕúœ Ds²ÎDŒ¼c»FÐg–Ã6Ûº?¾1Oä•pyS8Ʀ ý&‰uT¥ºê3ˆ&Όͳ[b\I)[3‚8¦$ænÖ”Åp;; \a¬ÎõL’þTæþt¥äQå²ÞÛ§•â¢ç­È^;Q'kÞ¼zxܸm¼£®ÅR7ÍýË¢¹dä°óú€[°?£rœƒ“ÄäWæt|³ï&&Ì÷•ñ™«*Ï àº9×Ûux’Tg¯ôœu5VÜSØ2 ˜™¶0_ìN¯T4'QƒRêH=ŠäM—wóãÉTwUèdÃ3V‹»n©Í¦¾¢7ªŽÌ‘›ÏÉç[!—%«ŒmuU³>˜c³(›ª˜Aý¼™M|ùNnÀé8auy½+•”Èøc‰NñÜÓò¥T3Ðßòê›Úøg*0‚£ˆÌ™ >UÀíbp{CÜ<›h™#¼çægUBc|‚ƒ›]Üedx;ß1й*F>L~0l˜ L{iÕ–STËW,sDË’‚i뇱£ú Û ¤d;ÍÜ4Ŧ)6Mq…¦ØÚÞ‰rºéUëaD­íX½7ÍÔ¶Óv¡Žº>/º#•ɳ.X3"o‘Ùa§G{Ø3ïá3%iÐl=K—u)À#Q:46îräéûñM”‚§p¨û¸ÅÄ3ýæ G®€-&ƒåõ€ÃìvÊ­Ê8;™ZÁ#éÅjêˆÞå,3g:Y|IÕ°1çËèñMª0¦Èò!Sw‚0ðêÁž††(\RÍH:¨´ïÁ=r41„š¦sL@½Þ!ŒÏqàÉ®ðdŠ ãOÞ‚r7Ѽ·òºRàínßÊQ8…R­mJÕd‹jˆ)7ºŸux€2[„5óÄ ä[!M·ˆ ë&݃~æ\l¹˜ÏV iË”°¿²n²3‡TÓ¶åý±ðôT9¢jI«ŽAMÅL«)œk‹aÓh”ÅtΣÒ Naò}”«ÈU¹ø '3fSÂÚm-Ñ—D·©}Á±qo±Ë@-œÿÀÙ0Q+Å'6˜[ðJç0ý´¡ÎËsaõvÚ0ô$¶Ó†툆aË€~ÿÂ.ƒ©š‹õÅÝnØÆ $RðM±ïƒó¢q¶ ô3xÎ;ލº\5Ò]·oøÚ‚ ‘ë£GE|]Åé•u(Mu1OˆY8à ª…œ€»5"KQ—+\¸µ©Ô)}KXÃÕ.ãt »`?±5Æ™Š8JB\yl×}Mrm¼½î  M&ÒCùA>!FJ3K!!b—¨S£@“t—úÖæœn¸ŠK†k{>œY³NÀùÓëÐ ÖU›N¸ÄHQÞNÀç/Ie°ý\“Npæü|Î"TŽÜ#TÐÜ)uœs›ß3ÀHq•ß[O #DmØj"oaÞž W?amNœ³ møœ±[D¤.v­ˆ±ƒu@”Ì…4’^-ðQ7K%T2»úÛs¹P©Œ=5ü¢Ö“©ðv;ØáüÌoª+ÅUº³;÷0ì¤ËÑ«}^Ï£ë!ï¹çS»;ÓoË:z[]Áåo‡/7?€‹äÝ^ž7?` ~Àl´n½~@YÌÂsûh¨ QF}í/)tcx k¯Ð©<Û[TÙí눆>uìoó VÄ2£ µÀUx7€ý1f¥Øª¯|§R” ¤i“³ûæ¤0›Áôö%:çéöp\óŽ(©®šYxtGÜ„÷T /3ù3ø=̰›I=ö暨kÊ}aiªË·FÅÜLÉUY6:É®Ä×WÀò¡pB£ŽJùÖ:•$e&ágôp¡ÚigKÊ_åOo· k,•Þ?”b\õ·¼’È{?0Ôtý§¨»GŠ€)MUÉ—¨ðUÐÄõo#krƒ[¢K!Uô@ÜÚf¦þšºÅ—i®÷vo2l1áöø²Gd®á‰1†/ «ßíUä+4H+íÐzªxÏË­š ë1Çè3Ý-nr¨[¬y×{§ð¯u+ÄSÛÕ—uÌç‰QD<ÂÔ>c^§3 Ì«ßË Ë ‘ngÍ÷ß倨nž >u#N¶¦ùœA‹Ü…¨tâßõilÌ.DcÉ4Á*@÷Jt¦-6ŒÌàæW0Ío˜«¥unñf.`|zæ:æq¦9f™UZ΢n†*AW„t/x`:KéöÕã©_ðñ^Ÿ¦.ïe˜*¬#0¡óBN°Æ!â˜ÔÝ9ŒêŽ£Vm&ˆÁ¼"ïà ƒRšº.=n"¨–é2Ó'¼:·ŽXAŸpâÏ…S]œà{ˆþÎÔœD×qa6Ø1[÷¶Ðþ‚ß ^Ú«ÁAT©#ôïÆ|Ôc·<Éü®pÈôÇ=ÌS¥³Uçž îLÐQqÂÛß:É„'‡Ù“©„Ï®ÆÑu>–çé^–HYmfó™êè,UÓtÕ\L…”]Së—®©8‹š¨ýÑíäs4â`E™'êƒq0ÓeO¨¤ÀxƒõÁ¸/ ®6&fn‡ÂÕžª=Ó„ |¼¢zZ·‚ÑBîª*ˆ QÝJj¡® KÑåŸ3U²„”`-&Ü¥Z)lÕº÷Í8‡uun{ Ïܘ,Ç·3‡Šþ–P[øô{˜*‡ ©¼*Ý R%ºWÔS‡1ËÝíñ&H5Üy÷ÅDþ±k›Òm^î]ÃE…¸ýQ¼+ü áXÞ§“¨ëvo.§DŸTΨp'¾”qF‰2r]·ŽÒ!s|pÔƒí×þ¹Ux¢>ü4÷ ¼¼z2Ƹ,7‡ÈãÞúKÚMüt¼XM˜® 6³Ç°á˜våx¤/äµY9:0È‚˜è=nÎÉ™‚í©_)ºg§û¡+ˆO´Êñ{v§ˆØÒO,ÃàÙà3½¸› ¥—ÂÊ2Üáûâ¡‹pB[ˆoŠ K÷ž)Þ0à­ –žÁ°aêaÁÙ ~†˜­wòÂ`ÃØÁPcbÞÃPK ”U]ì`Ü“äWyu‡_—*Öô–µ·’srÿi÷/_?» endstream endobj 2451 0 obj 4280 endobj 2455 0 obj [87 /XYZ 38.2500000 162.500000 0] endobj 2456 0 obj [87 /XYZ 38.2500000 605 0] endobj 2457 0 obj [87 /XYZ 38.2500000 434 0] endobj 2458 0 obj [87 /XYZ 38.2500000 434 0] endobj 2459 0 obj [87 /XYZ 38.2500000 239.750000 0] endobj 2460 0 obj [87 /XYZ 38.2500000 162.500000 0] endobj 2461 0 obj [87 /XYZ 38.2500000 239.750000 0] endobj 2462 0 obj [87 /XYZ 38.2500000 605 0] endobj 2463 0 obj << /Type /Annot /Subtype /Link /Rect [95.2500000 611.750000 123 618.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn30 >> endobj 2454 0 obj << /Type /Page /Parent 2 0 R /Contents 2464 0 R /Resources 2466 0 R /Annots 2467 0 R /MediaBox [0 0 595 842] >> endobj 2466 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1409 1409 0 R /F8 8 0 R >> /XObject << >> >> endobj 2467 0 obj [ 2463 0 R ] endobj 2464 0 obj << /Length 2465 0 R /Filter /FlateDecode >> stream xœí]Ë®ÜÆÝÏWÌ:€Gì_@À’¥Y$ #‹@Ž–Å‹ü~8Crî’§Hž©nr8´`K¾-6‹Õõêz¾ùó§ÿõûñÍ»Oÿ9~i~÷éœò4©ÿ9ž}÷ú¶85>æEzüòõðíøíðñð±úï·CýÀ§w­þô¿£=þ¥ú÷—ã¯~øSó—Îáë!7yõû¯—ßËÜTJ®¿ŸþïÃßþpüí¼cûº˜Ûÿÿ®ð>ÏÏPŒ¼ùÛ¡ýJsùõû—ßoêïŸõ“eêÆ»ê?¥·Çÿþóðsµ»{r*½1yæóäŽ÷äöü¢¢,ŽÆ–É1Í{¯¹üRÙÜèï}ÁP ½/p+cĸ̈{ëj™$Y›”êØyÙ]ó¥5ÁNµ†[%ͱ ›+ž«Íò;yõíæPï*!ŒdÎp+c¤=U¸·â¡¦.©qã$ýÝØ¹îóE¥KCí}[%í±âÍϵ¬,—;•LSÇÏËîÚ{çINm×pk£¤=W¼¹Ú¹æ‰Iª/S}Ô_7p¬Ö‡#™ ÜÊ©OUØ[ñPm83øÕæï‚™Á ÜAÌ`aoÅCõ­ŒÔ7—^mñiJi7p1—„½5+[s) €ëîö.î}[%í±ö6ÿ8c HýàMù&<øöóá͇²RøÇÏ?W€]ÞWÿöùëÁŸÿ'«nÙÕêOÇ?&‰ËÿtüüË¡<åYšÙô^½bËËJq*Êäv%±påÝeÅŸ¼«ýU/»h%ÉÐn¦~ÆRŸù´¼›­a3¦}èå™î–CØà{0„÷ÔßSLØÄ`äC`ànæûHøÅÆÔ˜u'g c_aÖ¸ùgËP—pê˜î"¡XÀƤ¶é4”x‚TYø 6ÿþ²òþs%{ï“›Æ'HtæéYt–‰+oá)O`’¾pXI~€+®|€+ïá ›{Ÿñóßc¿Ÿÿ¥¶†’æáâZxüRWl 1 aÛ1*aÔAP- `þÁtϘˆ’+-nM;-Yƒ±W0F ÄbòV“.~Öå3Låo#ž}uÝû ñë°>ÃôiL >#e6N‹ªÚ@P·\#ƤA0‚¥¹ÀØJ‰‰çÛ·B žÜî¶çn)ÝÉ[1mSšQí"ØŒåÏž’溔”Ï@¼a{3]Z‚ú¶fßaÉ%Ø9†89üHUÌm)Ö­Ìc;bGO×ÊþñÒúìö¨LrÊrsë5®1é))Ý­÷®&°!VMâÆ¶KÝãz¦ë×k8hÈ߆=qp»NZL[‡_ÏNŸ,þ.?C ¾XˆVnPgº8Çø#ÜÕ˹„#E:z#*‘Oã[à&8ú×ȽدÈ|Û='ü]Pº5šiÖ2ŒÕìP›¥&ïª3BÚ ŒI`—âFaõÒcfU¾ÇW)Ç(®ÆæNc´øÞe–wØ…óÈN¤€b³H]WlbÎÅ«,1É».çbÀ‚a†zœ‘‘‚¹~† ÆŸ\M–YÙå 8£+4T&´˜Ù.¹^‘¶)V†¼Ø+´1_–±+á{ð <GÄ—¶†ë­ù …±.í<œ¯q‚T5mNÙ.U9é°Gp8Y‹kWàÓwyÌ÷0ç²Ù§›²ø®Ûs8+_WUsù…‹ùô[ŠÅ`œ!OãÇ\^@92gpã6cnºª8gBT¹‰jxKÀ>~ž!¸…¢bU/ðC]ä#×Ñ…A=•´¼â¡ä Žk`zb¤¦F3áXJ£8`L•„'Q̱¨pËÖ,JúFJQô3–ø|˜ÌBE0Áw!…i†!QLdth^„ªKS½¾£/£©:UQ0#Ói—[œ ÚÊ%:!b0¯à^5Ö•]{ww°¶Ö‚Óù´ëtÓͪ*BBë5,ýíéÌŠÚ[¬±i¤š7@¹.ˆ^£vvHj³Y÷¬÷„îy[Z¾7Â⥚ڨxOg¤†µ°SŽ1NFÆš ì^Ç Í ”r¢—½MxJtîªeÂÕ’a‰ê" ÂË’²£ð”=˜A±÷‘Ù-Rüf¿éwmÍìXaÕE«ªòxù8OhwY»¯úf$.3ÆLØJäjÖ ®Ù²{éÄéS1êˆJVÊÂV8!¹¬ëQì¶ÌuzF(a7°” ïIóÆmÕVÐ(‘¥¢tªºõÞ»Îkò0½^Æf]™* /:„…ý>MXWÞ¬qhú8<£â‚ î3}üz°©{ýƒ_Ÿ¢·š¶MÝ+¾ã7‹ËŠì/ŸUhG½‡ñw3†ãòbR0˜ä`Bïëžv4[K•â•ùgùTœIG€ÏgS) µR•å Âª/”>u·œ^™dµ5Ñ£Šôd»†Fæ¼g¾GÏ”h7—¶§ZÛ‘¯Þ“\ù¬sÇ75Åæ'×;‡SÂ•š®²“»ðì¤÷47ð= 7Ízõ{„ŒÑ&Ëco£ø{Þ»Å*’ò×~Ë7>ÊVÈtì'Øh/¶Å2ž×è2ŸÞ4ꌤZ¯#8þðÆ2UÚt1/†ÈLƒaʵ¨~1褩 ×ÑH · Έ†H\-à‰¥÷¸p S·k§97|[Äbr†;‰¹Þž`¡<]ÕôP³¿Ö\¿ÿ…jý[,棥]•¦{IÚ§Î’òºöòõ‚©3l/>•[§r¢Þ s€9/•[gÚ9°+H_ed"ô6U´;£;NˆʺÊ%¼›-5,ÓHø˜í#ÓÌÝÒŬZ7¡•n±…›éáš:á5… ZNˆg0Þ n<ˆ[râSP=Œ7 jÕSX‰D±ã®€þê‹E/›Èf×ÁäëV™]GÎÜ‚• fx1¶©†®˜o!%àïºKÀÜNUàGÜÜ›Yë˜Vá;Œ]BôÑÀ´Ãôø F†.Å4ªJUÂ{T¥<3Ò·>§Wb‚%1æ|ù»¬.7âvѽa>Ű©Íx™ §®ƒÀ-AŒ¨e(Ihp[…¯Ã#ß5<<š­¸ŠAë¹ówà [,˜â0e à!ß2k¨˜¿æö>¦„Ía"ÙŠk'¬êã¿…Îjø=‘l¡N±Eˆ%öPŒqà<ìçÃä¼ÒÄnâHÈü.ϾªÜð„>£ta=/‡Yµ6"îÌøêÖ¡êûÃòi¿cŠôFÜ1uG,QÏà Ò=Px³>ì%‚`ª & n@15e71}žnƒ÷ù ±é()ÌîÖ]Qõb̧DŸg*úº¸Ng¨/æ ¾°åô3zZøâö­J”€ï zç0R"]&í§­ D–! %ÒM¡­íÕ¶6®Š¡Âa¢tYØ –!3…ÐøK™鯨5Y›+ø‚k ¡Î0åÛ± ¡Ë—Ùï‹Boµê8Z—önÆ;Ó™*šÃùóÓ›â=QÏÕ;­÷Ë)ˆÎzÂIv+â„ò=?Ÿ„VX‹9ÓÖu]èK´ÂLcŠ«z¼h?t~°ätªÔ˜ŽªÚ¬ ë5 e$Ò=uALŸ0†MˆSQn;:£ÐJµÓtüièýù ç—'.J[3½Bt»1àÞ'ùtΞ^ÎçÓ‘ Y—¸üÐí>×m¶)™Ë œÂ誛X +51S㘮{ï€{¨ sÚB‚®´ìšŠ] *¥å„½¯ú9?Æ-¤JùËÏe*bð{p¥þRªã€É_‹JÏZ¢[8Ç 'ÅyoU™-®quQÅT”))‘} 6 3tùG·&YˆŸªæÂãè»Pk¶ó6ÅÛ±$l¼œ™ü|ÝxŠm80FÒlœOvy)á[I»|¡´0Îÿ2ÃbI+ü¥û™Fë²s–x 8«p§^Šz#ÛBC+Ñr)+› OÕß*z­òĸöC£õc&:´ .\ìxÆnlæ=*]þ!ºVÓ÷9,›²èPÃb鑇×i‡Ô멟ÓÀŸ‰xñ4îÅAºü é¬*©©LôqÁÖä>ïÊÝX 3@À“ÊhÔé‰ÓB×ãy4LÔœݽ±Á¦›O§ÒRuÇÓStUúzDKƒdu…àyÓåûm¸u•ùD#|-x?‰Ñfa¸ò[àCÀ^]Õ‰CÔ 9ÛæÝc‚gº+3yu£Óðvw¿ÌÀä–£‘¹V%FËÑÀÏ`ÏÑhâñ³2$„Œœy\%CçraáŠõžû ù²|‚²P½ím%Ñ`úUŽ©°E¸ó4®ø ƒwƒÏ4 jf}zþB¶,Áÿ\AÜt:ÿ -Ä7E¤-,“Nï="iá >=|Fp7Ü^€Ù­qšÏƒ cCyˆys ˜S ¯êbãà‘8¿º„žê:£[»ØWÙ»£ ðãñãáÿDÑà endstream endobj 2465 0 obj 4765 endobj 2469 0 obj [88 /XYZ 38.2500000 716.750000 0] endobj 2470 0 obj [88 /XYZ 38.2500000 360.500000 0] endobj 2471 0 obj [88 /XYZ 38.2500000 261.500000 0] endobj 2472 0 obj [88 /XYZ 38.2500000 716.750000 0] endobj 2473 0 obj [88 /XYZ 38.2500000 261.500000 0] endobj 2474 0 obj [88 /XYZ 38.2500000 360.500000 0] endobj 2468 0 obj << /Type /Page /Parent 2 0 R /Contents 2475 0 R /Resources 2477 0 R /Annots 2478 0 R /MediaBox [0 0 595 842] >> endobj 2477 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 2478 0 obj [ ] endobj 2475 0 obj << /Length 2476 0 R /Filter /FlateDecode >> stream xœí]K#·¾ëWèÀÚæ£_€`½³ ‡‹] #‡`'0b#ò÷#MwK3l}%ñ›"»¥¡×öÌNHvU±^¬úøîOŸÿ¾ýçïÛw>ÿgûuüúáó¦Úµu5ü³=üùîùl·¿ß¶]½ýúëæÛöÛæÓæÓþÿß6Ã>øËþ»ÿmíöÏûÿ~Ùþø·ýéð ¿nZÓî¿þûékßšýwÕñëáçÿÚüõÛß#NÓ‹yù÷ïºÚûî°Š 3ÛLoižþüþõ·Í»áý£&1mÕõÍÖxç·¦÷vûßl~Þ?^ízoLÛø¶zÅ<­=LÔôû1ìþ®2³yžþ¨Œž`ì>áØOëÖ&‰q‘×ã«1½¨S·êä9 ®Ozc}›lì§u+Sdä*[‘©¶ïÚ´MÂOƒ' ¼k}:9¬[™"SáØŠLõ¶ic¼>uN£ë]»tó´nm’LlÅƒïºÆ¶¾®ú~ÿ*Š¥ÔÊuB­Ü$ÔÊuB­ ÇVÜÀͤ8S0µI¨•ÛºN'0Oš3 SáØŠLíª6Sƒ' |׸tcÖˆ©plE¦öfø¾Ö'Îqp}ÂÛªJ§žÖ­L‘‰©pl=¦ZSÕéü§g£ëmM—lì§u'òŸ„Áù꺉:ÎéÓç4ºþصM–™Ö­M’‰¯xpE¾6>a¼óltý±Û:™Öj¿Îÿ1^Èðý&|ð‡/›wÆŒZ³ýòó~mOS_¾ìIRïÿÒV½Ùÿí§í÷û5Ü~ùeÓï[O+Ÿtð‰…O>À'=zbð<ïág|yb~ žÀÑ,ä)³6yj>ÂÏ@n×p4æ‰spmu eô!ž:¤@QHaÏÁyð®V5ÞÛnކ߯­&¤wÍú­‚ts˜ª»sÁ oúñËÞÖ%·S¶Ÿô¤o…µ¦<Á{AwâµboB[ÍÁ4ÀK9±Ó;e¡„X¬½‹ºQ;e±NƒŸq5 ®ËN±`U±`“Û‡zÅ‚çûÌÃ'K¬jÌ"X0Lø$W¤…m[±`’Œ ÆíÆbÛªbÛ&ÛִŶæ;ÝáU/oÛ0uðžÉeÛJ±Ø6Ö¶»±Ø¶êØ6dØüá/­Ùë±iÊìÆìjßtm=þn×õÕÓJCžyâ†m^ïœíÌË'ë™j×´æå<>y€kHèwÞ ­×<ùŸ ¬êN?ððW?¢¬†=즵^C.ƒI|ýbM‡wñO®ãWÇ䂯1á={ KLŒiŽG›1®ÑzH?HsaI˜Jx±˜~Ägœîª‰µ™q¯»‰—¯Ò6Ôöï3ºÑçFcø“X¾á« ¢y½äc*1¯!ð vIîÉÚúÀJŽŽÆFô äVÐåxO1ÔÕaÃ0/?ƒç1¹ü¥zJPþ¡ùýÇx½ë&×¶mêkI(ÈVK„>TÙõ²¨kôY^Ð]í— ”ehõŒ Å¡>sæz÷n…ˆ*Æ@¤ÞU½{)ˆ8tŒ¹±Ó£Ó6mFBV¯kìD¡FÊuŒQ™ý€ .•‚·Äìu˜%1¢:›Xqs¦ô…\X@!ªd6÷LF4œÆ+ »38B„O„y°ÇˆMŒ¨„háA1;bºN¥`üá&cÌ •)Põc­‡£= rÕîH6;gl q[*ôšñ<-ÍAºUİQºÐúÔ7¹ä6Ƚ8]ÄdÆiÁ4`à‰7ÀýrQ”±öŒ0×d©ZEªZ¹Òh<ÈYêÞœlpI qK(ìpúé‘Á7J ݤ8|à YœþÀ1~¢[ÊC¤ t»¨rcÆ÷kÛÛîxcø°Ìsµ¿ªuOÌ‘@â¸~,8‰rúcpI™$Ýõ‡BØ›+€+|™ñ¡uÏeVRÀ«Šêf+‰*§çßù£r —™K¨™Ò \Ê„Š7Z¼Ñâ^ãvýt³Ãžqèšë‚YÝÞ>•šæôšqÑu ] ÷€ž0§$ 2‡‹K¬ð˜SG,:áñ ë›2m§¯î©£0§Žxó31©n__Dh#Oþ(6¥ël`èR÷ͪv>Ï83OÌ0¥Xß¼¿~ƒ2G~ø ‘ƒÈýö¾`š'óª ÄD! "ýâàv:Üüåa<$Äß†Ë ð³2¢ÞõMÁïÍ¿7¤/Õ½™k–}vqŸu]rH¬€ÚgDº€h ÷™2 ò›Ø›ÝÖôç6¦mÓV~Ú˜c4kª]=,'db½³MøüšŸFëáh p€œ5†;gžŒ"ÑîÜ,`x„k³ðÉG4Ï6;glE5è}&T¯3£} Ö†çI/`• $ÌôpQ ÓsÓÃVºZôÓæ¶ê&`‘åáàbî”Õm:™Mœ¶×d=¸w™³–i;kûP¦±§†Ïóˆy¡ŸçaO€¸n[8¹¼t˜PÉ8_‡Áéëë»6g[MH<«‰1=u~’€vfôtá®O…2Eû‚Î"Z/6'ÊÃÕ/…r–§Ô0ι`’ Qc´;a%¢\Ö–D3ý ; çMf+îÃU&—ªˆR³·„êpwµ àÍùNϬqÝËeÄåqnŒñì˜ó!¢&Íý‘¾u{q=Ê÷b0µ¬8‡†™`®¥H@p ˜—j½¨nåeÆkÚ) æ`…sÖõ«ZÊn¸ÕÝ€;#ê8‚suðéïJ÷ð…Äí!6§„ ÝXä¦jŠo0}i|p¶¨Â+6a­frD¥ò”ÉIâàŠéê»\'!UE»‚S†²98¦uÉûbê:Ø X(1[†kœÏ-Ÿ²[zb¦b{aLuôŒÉ›,üAÝ¢ÛÔ}WjåÜ b|'­ò^ÿ–ßüªÆ1¢$ƒ‚LKgfNuÄ+1§¡ ýW ô‰%úF¡º5 ÕséØÛöÆuë(ܱ\oVŸ†mÔì«¢é"Í*cÓßäA1Ó+Ÿ!§Ø¾JE0g¹3ݤèÚUá͉pGpŸ™˜‚à‰—R‰ *8À™„)[ Ѽ-KªfŒJgŠ€ðªhð\_Ý‹{sIÕÌ3ÖÅO_…ê›Àæ2wÃ'Nè‚érÅõ};®o[ŠïºJw^-ä¦Sa¶Šá'‹e,ÇÌEúNXgÞ-Ù ûPq'¬ûPí,]ãp?¤=ÊHØ] ;GnjعžRÜ¡ ?ƒ;?ñ ÆÒݸ>aÜ¥‹{~[¸6HÑg»îzŠâîW¼6ü>ZÇm°c0¥zà^\,GXZ°Tâb¸Ü©,HîÂÆó\⢖$ã>pü™Ryî}îSvÒ'ÝWlùNr*¢ÁÑ;>ÇHÜ¥ÑÒÉ´gâxìú#£Ô­òªmMB ÁØЩºÎ»P’{ý½uٮߛõmeº9:[#úÓûÊš™ASJ€1žF‚å¼B.(¶É[oB떾в¯ƒ9™œ Ý.^nÂ@ËÞ‹~T5‚w›+u¿õãÑMsÆL ’¡nöuù¦o&§¿>·‚ªr»Þ}VÆžW½ËJ²É›‡›>4Ñ ̾ϵ‡×¬“îÅ«¨"&‰GèOÜ–hº¥Â¡¯­I­‰Ì1F qz÷Î|úWÔ„dH[6G©¾Å•Üàš*$] P””xæ39ñ¼5/€Ãw!…£šï1 ˆÃˆÄM£j=Ì ( „s°Œ+ï/¯§pX›Ã5Ä9z;÷ébÇýFïk-{Ay/à›\uïèXM8ˆ1œâ4¼ñƒ¹Ñß -¼)ä©€±÷‚0þLÑ£ÔÍΣìäñ=ê¾ø‰ôm±¡÷ÇÓbCE©Rµ¡å ÷¤øâÎ"t/£‘tW «ýså¥_jõSÛ½boëÊyLk¶¡™«‹u-OÊ“5{LĪX+ ú€¸uF°âøNdÂûaPÔéJ7cE@o3Q$åScÙ«.~«8Ï=ú­ýt“NŽ>.TÙÔµ}©Îµ®!UÙIµ„£ÔV«,¿Š”Ålrá˜*_uw}í¬PÆxq¼ÏëÂ=Âk€KÚÎçxoàrT+Vñ–óJ‡|ñ^í;èÞ×ÛÅ\¬qCYñb/&eçߨœÿ,º,þQÈÍèÅœ¹B¨£‚ÐSü{ö?;[3¤[sùå´,+˜1L÷~ôxIÛÿš¨ÄF_ìÀ\qÙ Pð–¿Œ,×M„*h{™¼½Ò,«•òLk®rBR !¸õ;*¨4„¯jÏÛ}­-ù„¼Ø”×:ô}h‰“Já0¹Cæj fÕ {Q : Tù®Ê´àTÌU'™\/½Ë.Ä/ÍÞåsgvo/r¾/\7-õ<›'¶ö¬‰ºE]=L÷^>Ì0]˜˜´)Q•*!rˆ`O„ ΢ËRzÍã-Ý';·‚k§ƒHfJäÊj܉!/ ]Jd.pê¼u…w‘laÿuó+¨BIQÁš²d¡íˆ$K~î•[‰‰?îK6Ï3â†çÑ8‰¡,ìhT…1‚¯\àÍïÜÒ‰žg¦A.–ûfHÖÙú¢´R%’)¨#lø‰º‰hå ¿ ýH¸04È|Yð+ÔoÚÎFëêP¤Ô`[áœ>œS·@˜¹@û$9¡’›¶)«líU†fÁ󨂲å„#nú×Ü`'¡©×0ð b ƒKâm,}xžLs˜n.G¯Åû²$µ¦}s’$¬€Ðk†=Ê ˜GbÝ”†YHBÛO5Cf”©¤CDD§1s‡cIÉj¹èÄ9,µ‚ˆLÖõUYóRAÕ¼  -^Ç-¬šiõŠÐ™à!„†; ÖVTz?‰ÚôÇýµ žrÆ—9`@ý(BÝôZ’„¥e5²#WËjjG.âädùNŸŸ¶PóÌHÌXÝİêy&0®–â[Ã;0û-sµá¤º10A0ëá×™â­äöVRZÝ[‹”])$.,ð&ܹé êpN ³."±-”6„é6ø2ÆC´ÃgÎäcçfWÕ9¦T6“¾˜¹}ÏÚL÷¶ßöB'Êä§K¿p…ÐvçdÖíe¦2‡#©­õÓr ”ÀÈíå1äÇíÎ>qðù“Axšù“ñ€ÎîÆ#±gÌ4PM> yÜ%»xnm㛢>ÌLjaœoæ/8JÎÐc]{æ5  ~ft LÔ«·'±eîðý~Å£ëxF[HoJ H물ψ´ð¼6Ì=Ì#8šÁŸ!F XÜÚ0uðªñbæa¸€w Ü«ºÔÁ4¸¥ßVÝÎ Ë¡`ž{Vß}Ñ~Ú~Úüêuãâ endstream endobj 2476 0 obj 5268 endobj 2480 0 obj [89 /XYZ 38.2500000 670.250000 0] endobj 2481 0 obj [89 /XYZ 38.2500000 452 0] endobj 2482 0 obj [89 /XYZ 38.2500000 285.500000 0] endobj 2483 0 obj [89 /XYZ 38.2500000 214.250000 0] endobj 2484 0 obj [89 /XYZ 38.2500000 214.250000 0] endobj 2485 0 obj [89 /XYZ 38.2500000 285.500000 0] endobj 2486 0 obj [89 /XYZ 38.2500000 785 0] endobj 2487 0 obj [89 /XYZ 38.2500000 785 0] endobj 2488 0 obj [89 /XYZ 38.2500000 755.750000 0] endobj 2489 0 obj [89 /XYZ 38.2500000 537.500000 0] endobj 2490 0 obj [89 /XYZ 38.2500000 670.250000 0] endobj 2491 0 obj [89 /XYZ 38.2500000 755.750000 0] endobj 2492 0 obj [89 /XYZ 38.2500000 537.500000 0] endobj 2493 0 obj [89 /XYZ 38.2500000 452 0] endobj 2494 0 obj << /Type /Annot /Subtype /Link /Rect [346.500000 177.500000 410.250000 184.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_nn4 >> endobj 2479 0 obj << /Type /Page /Parent 2 0 R /Contents 2495 0 R /Resources 2497 0 R /Annots 2498 0 R /MediaBox [0 0 595 842] >> endobj 2497 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F8 8 0 R /F9 9 0 R /F1409 1409 0 R /F1700 1700 0 R >> /XObject << >> >> endobj 2498 0 obj [ 2494 0 R ] endobj 2495 0 obj << /Length 2496 0 R /Filter /FlateDecode >> stream xœí]M¯Ü¶Ýϯ˜uŒÅIP°ýì]0l ‹ ‹ÂiZqP7‹þýjFÒÌ{”%ž¹¤4ó&FbçÉ¢.ÉËËûyî›?þÇþ_¿ïß¼ÿüŸý×þ÷÷ŸwÅ¡.‹îŸýñ×Ï Ý¡ÿó¾våþë·Ý÷ý÷ݧݧö¿ßwÝ ŸßÿµýÓÿözÿ—öß_ö?þ½ýáOý_:þ…o»ZÕí￞~ojÕþ©8ÿ~üù¿wûÃþ·ãˆÃçzb^þÿ®²ª9R1óåï»a–êôë÷¯¿íÞtóúˆªµ3n¯¬±{ÕX½ÿï?w?·ã£‡Æ*UW¶.®øN­Û™B™½ÒM;²£ïœ~ÉŒ.?¶ÒU²±OtK/‰2• .¸¯Z«~uŒ‘_ŸËèòc›2Ïœè–^’a_ñàg2µ.íqû[:§Û?·³íþ¹jV¶(»«+ù%;ž`;¬+Ò}¤[xE††c àjM)¿8UB¹\u²±Ot ¯È°©plÁMuZwkSÖò‹s<Á»ڥûH·ðŠ › ÇÜÔÆ¨„*Ôetñ±mam²]=ÑJ…ƒËí«-š*Ùa½ ž`[U™Ltt§9¬xlÁMÕ¶Nv­^O°ðƦ“'ºÓ\«xlÁM-UB ültù±+Lwt'’ÀÁ®Òíó¢qðÏW­XJ©\%”ÊuB©\%”ÊþØŸ"ÆÀtt?®´ïß}Ù½ùØ*£ÍþËÏ-]§ïu¿}ù¶ÓUû?µveµÿòÓþE¡ÝŸö_~Ù©–ÀJ—yÝ“¢>=)ºêŸ¨'Ñw*ø¤£Ùîu(S?¢ß¡Ñ´Fï *ô¤x‡¾£ H5|²i |GSêôä×ö˜\ÇâÍ^US,n‹ŽÅ;L@ Û[ÕÊµÔøSSå¡ð'ýöôĬé¼î£ÅÕã˓÷ðn¡œÏóîàšÂÛ»ýšíÔÒ'Ž6ú°E4ªN˜Ci+÷b-Œòí9b‚…iÄórþ‡ñ £¿ŠiăÔz ßÁß)–+1/¼µºÃããïÀU£é÷gyÐq—ÿy ZóˆÓZÞLèD~sèþø|O<éOÈÔ;oá;¾“‚‚”bµU(¼5$Xq$K°Ä˜åÍ”“-7Y,5°àd$và;PE袄Äâc w30AxÁáiæè#VIxQðhOHÖH5~øÎèjÀkÞk@fبë.Ìp!e)¬XáÕy’'3VWcÊÍX]ÚÆÛ<ƒ"­GŠt¿½ÕÁ(=¹Uß ¼튞%â,5LAÿÛŠª£­>püâfJØp=Õém«¦6Ûêa[=l¤=áþÙÁÚ¼†O>ï4艆OzaGž|Òß×Sï` tj1×Jp¯ð±Ä çrÑs¶ïª[@žâSDFÊ«ÉùçËZ(ü1…õGh·`m4ðÈiç ½c°µßéÏþÔ;$uuYwcRŽ6êñAa®a¼ÛCµ?ðƒ9‘8 5€Wvàüàýñ¥.sC–9I-«}áåZ®öá} L}4<\ [õ4#‰U 4Òè#üN؉iär‹´)?”>™ÅÅë q,â9[nC2þj[Âk^Âá[÷Šqíû Ÿr‘A˜ë&àQB%Æwà'"®| ${¯ïŸÅâ óPZL`êï ùxg|_\cf'O9_˜ý‘)ô€„û ”ñ6‚Ñ÷ÆŽ@YeÛZ„^.’Ú€õ€€¥¨V,«ñlÐIN™$Œ¼µúüÍœFZa¿X1àD®O>.ÓÊ¿—Ç+γúŸøg«iLΗ1sþà)ÿ6ÌËÁ3 ІýÛx àZ3k`á-–V¹€ûª!ŒME0à>j˜÷„ãÜ„¹BÅ玲÷’ÅÑö.ã>:;KO í½º&z5µ÷XúbÚðêÀ™¨Æ™‡ðI€j¼?ï‚Gñ¡ ¹q›»€ï ¼¢Sï&œ‹× ·’ëxEñýAdîR¾Ûð÷Þ…Àn‹¥ Íß9ªŒd5#9zÂùxFU1ÈÇ#ª CÉ:³rÄ¢BUC½r©ìàr^@[ ·æ¼…eÇcócjupž\· Ywªa¦þN`ðºaªa¡a26‰,ÂÀhÝþ¨j°¥—ì|G•&Çgl&'}ºÐ3y"Ë•8ë5pÎse½Î­{Ô¹T“Ù{N§øŸÙ'¸?X0ÆÌ)ƒkmàwpmk€Cˆ,kf(éeƒÅ÷–Ax>™ªQ.ÔKÝíŽÁ«å)ßgZò¢h#tXëzùúálEªÁ9–8é!0/&Õtµ*D‘¤‰$«@Î+&"i"ÓÞc8ÎQ´N]$ÓÀ_ &ÉÇÂ$ª¼%y¼ÔÏa¦|»øþaÒl˜dûAjæ] GÓœrcá )ØFXC_ò™°†¨Ó:ð"0ˆßÁ®O&D‘Ó!¨=|5ƒCpžcœ A–{2q©Â!L8Z S¦¶_O ‡ ñLoS¾Ì…"âv»ŒàøšØm¼8tŒ)È.+¾ì)‘ì €ÐXÉD*H ßÁO4<ÛÏò[€C „Å»€p’Ô+Ú9()ú'é=„Ƴª°·°{¦œð7ʤæ|NkË7Ìró$³Î”g­Êz˜w&HSªó'×Ác `£Ï”™€ÄÁÁšˆ a<™Àe˜P?¹ÊŸ`P• rÉBñ@>R0Gø;fv;eмTžðäÁÒ$ç/½‚P–gA´2÷ŸPÐlŠ‚€PÙÎßúAE¬{-w¾§®q_Ĥ‚p#êq$”¨; •ç‚Öaê~‰*¬ ±PŠõK)¯Mí ì«K¢H¥ç}¦Ž–©yYóL 1²5± S1à. ða ¾<¯G62C‰?Œá#ªùô†ˆeT³\ÀN6wˆL;¤ý[S6-ñ^õkâù)[…=™˜Ò ðcÔ Ñü:ù¤LeC?yu™IL’LžÁ•UÛÙCGiÚ" æXBÈB™æÇÈUF{ë/ìÄZž¬Ï\[T–›„ú}@yIÝÿ7ÎMÁ]1X¬1·ïꞃÕPný)à‰# ]Ɯ݀W#m½.ôX³ƒX5$8,¸jñzè‹å UªÇë|¸LYtkªµs‹Ån ŠˆV ÁžY.æîeZWö&ež3kà_Œ¦Ñ›M…p=ôæˆAˆmL?ÁÔ…ŒØ7Ï\ŸŒß{“øñJþÕGõ|ÄÓÎäÇÊ•àðÆ-~á™\Ø3ˆ) ¢Þ½ñ±–(Òík†¦¼oŒ§‚Ë© ék þ¿ÆÀÉÕÄô–Ê“EÊë½önsÏøLÀ„§CWþñ¸ûŒ‡G÷¼E&HÆ‚™ê‚-¾e„_\Æ”Oâï0åy|i¢h 3(ºÙæƒw—bôaŒ$œ±¤ªº`¥ç*ÙÏ´[†Á±^úîx™x‡ÁToW¸:cÙßÛ9Ã¥ãÙÎÀâÆ·0~‚ Þ2 À†$ §áN/D„Òa¦Ä¸¶ƒhØ@‰1SØÙS=Fù¦JKq +ÄV|£±æ-T*Íþßè¿ òtiJárçE¾Åx½)K•õNf€'übù—Øæ³§,½'µvgø´³h9£3¸´Ze=J©»‡éàÁÜóÉS`•QþzÎ\ª€PÖå%Z¨#–ÈÓ£âÉ84W)"ïX¢– [͇l‘}®Öϲõ£LÂ-Q˜øÎšõ϶ñ$•¸-š^A‰ôµlàx¦8O ®•BÉHùÕ’î˜êi‰D0L£l\Lëz"Ýœ¹¯ÈËÝÒݾ>²•ˆ¥§¨,Ži/Ác$¼¬œ«üË*"Á™ÈQ Ta0u ²Ë‘gâÿU¦œ* “f*MÇb’È ìô ›ex'l(‹0—¯EàN½ßóL¶»‹ð}W4‚™©¯._¯¨ùJï0tżQ6V&%3mW«¢†å{Tël¡Z'q©Jb( %H¸ü¡/,Ù§ëšH g®9Y‘ÅàŒ­Y][ªÊ»ÍîͰN±XKVbÈòóIaî %öèåTl 슖…û?­>ÓGg¨àhp>9ÒÅf ¤F?™Â3“Xðio8 ˜—zK•iüõ¸m8rQ _›æî- a\²×ÞŽ°³2áéŽMtÞÉ’HÞøâk$¤0‹38̹'Bë<"‚¢`æãK¹%"ܲ>´œÕ¥MuÛͯo@ŸŠ2-°Ifqu)SsC´ÍÙ4¼q·Ð4<`ZãJŸ-´Õ¶E±©6ß¶ÐêNO4ÓÀsO Ž·¬$ªÁ YèÎá™2¸› ¶! ð¼+ ,檛l¶~›§ÄÂÍå³E=Àƒ˜K¥šŸ±²³Û9CtF¹+¸‚ÉÍ „L°ƒîI $‹¿ƒýQk€y ¡p~2þŽ(_n®Dåà½q¼0è¹ J[õluÙü€2S€¡6»ÅUå¡Óòž½ƒ=jР׫ÉS>= › B/Ù~Íž;¤þ_FÞHf>éL)Ã0¯x¯j4·Þìšš5¿* Š©Æï0°Ù|ÃVUã%€Åë§6eRÂ'ž*\Mý­ÎEÙ–.£¨< Id"ç‚i»—®CWxo¦EñmôL’õ”fƒ*Í…ù\rkˆÏ#–Žšh¹) —«ÀM¢•c¯+<õÆõCöÉʾ•ÐCÞ?ç‹ÌR,T¿ÙŒÄ4ƒ ´2ª\J”Ìrd<î±Ô÷ØúIèL-‚g¶”L,>¾w±{ÑQÖ¿±™´ó«×[QKc%ã'ƒ3Ò »ú°¶ÓÃvÚ‚í¤ñÎf «­Ó[U¦Ð5LÇœ;¶ªLiýz\÷oUÉB?Q)Ï¢bW¶›¹œW8ž ƒ Æm¯V8‚áÐ"v#ÓQ  fÓñ"Íöd«£¯¦tšºZâö"n¢À ‘KÓÄ·S6޳ÖϲÈÔ€ñîDÕC³EØG·aŽ„ý#œÁé`ªÚæúJ˜}u;,ð´)çûdúdmŒw²ÄÒ*°d4ð´ÎIÓ©'!Ë–ñ£ çØÿARWg5º 3øWkå}4r™ŒBÝf¬âœ0©¥½í> ÂqX¨#c§‹ö \Óéb}8 ÜÏað‡\€Pzl6j4œÕ• §túN9)õôj8i> endobj 2499 0 obj << /Type /Page /Parent 2 0 R /Contents 2519 0 R /Resources 2521 0 R /Annots 2522 0 R /MediaBox [0 0 595 842] >> endobj 2521 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1409 1409 0 R /F8 8 0 R >> /XObject << >> >> endobj 2522 0 obj [ 2518 0 R ] endobj 2519 0 obj << /Length 2520 0 R /Filter /FlateDecode >> stream xœí][¯Ü¶~ß_±Ï²I] €íãS  èCч"iZIP7ýûÝ]Q{‘ô–ß)íÅHìZÔˆÎ}>¾ûÓ—lÿõûöÝÇ/ÿÙþàÿøe“íª"kÿÙ~}wù[ïüŸ·U]løuómûmóyóyÿßo›ö/ÿ²ÿÓÿ¶vûçý¿?oÿö÷ýôéð~ÝT¦ÚÿþËñ÷¦2û?e§ß?ÿ÷æ¯Øþv˜±{'æúÿ¿«+×d*&ÞümÓ}¥9þúý‡ß6ïÚïz‰©òªÞÿ–»|kšÜnÿûÏÍOûù»Ù³]“S•y•ÝñžÊ^T›rkìþ'ƹÁ{Ž¿tfן»ÉëhséÖ^ãJ#O®·¯û!ãW§Ò_Ÿ‹Ùõç>kî#ÝÚKâ÷U˜\q_mÙ­Îþ_õõ9Ï®?w^dÑæ>Ò­½$ݾâÉ÷µÈlÄózž]7÷‘îXçO¾«Kÿü3÷êúðÞêðúÜÔÛ˜Š½,¬k·ÅfúÆœg×ßô²rÑ„PK·ö’x†Nþ9`LHû`u~üðuóîµÙîͯ?í ;¾¯ýí믛üð?{C³)¶_Ü~¿'çý·_Þä»Üµ–øáïGlF²hÄ™ãH}þ«eûƒ]Ýd¥-.þªÉО^x¦‚#ÅqÄ튼¬«+ mÂlø™OÇ‘bçlm®Glø—f9Ü–ÎF¼Ç´f\Gö-³1´a>È ª1muŸá$cbkÈLpÏf[ڌ韑»ðÃ(Ly¯¬qá#áÓw…·ïùôu/Àï¾&ϰü­úøåøÚfw¤óJ˜Z-‚ 5¶ìSÃp–°ÌqQÛøÕEÖ+ŒLÅ̇gÇ8C‚|„²¿KèüS‚#SÇݪó¦Û­WtbÌ8R¢¿Šc#XøÏA8‡Fò÷ð= Ïø37öŒê÷`ª\kÏcA³YbÝ|¦À@ªsÌ;p6adJñæà{ðêX8¬u׸&¡*ëk;%hñiÂÅâ“NìÃËx6÷!áÊ×Õô×aJÙ‡OPN>ݶXOwÊ3¼·bž”“V=±³'ß"=Ѿ¦î‡cæ?v@ú9å﻾WèN ^=¦‡Øp\†ˆ|& ؽçRXëöH„"\'‚è†á=¦e¢˜ðÓ•cz1¢0c´õÅô>Cõ„Q¼š$hʾhf´-´týOlÙ`kÈ ªˆÚ­È\ £Ç ¿½x'VW·G²…ÄÖ`]Qª«R)AaÍo7c0±‚ÔÀÓtó]Ë7I"[Ϧé/Ý€…­b ˆª¨Ç…Ò-ö… ©2žƒÜaº(ý^$çwøÖQ6;,æ#t8®Žã7m„}øTëÆxê8J/|i:O½È wÇ¦Šžèr,Ž-dOsÏž<äéΰ´bF°-ϬæeC¼æoñÎ62Tœ'Ö?×ZØmœ#Rå^!ïÍð(Þ9¬g0ïà3‡×¯³ü™K"¹—¬3V9(¾g•ƒ«\åà-r0¯§yïÖsFVƒ<Äù}aì;2Ò›Êt'Ò‡øKSe| ›uN­ë·*‹#=ç­ÂA@ö2Ué;Ø!$»‰Ï`‚¸8YÈLe·‚6Œ 3éœs&˜ôêÚn0~è³3“a€Ïà ƒ{P©÷H“ác )¶¤áÅaÚ¾ˆ“¦ÛnÀœÛ;òâ‘»þbæn]ÙSŽxé¨ N(¾‹ÚnžÉveeäæ°€b *陪¬ÏÆ”)a%ŒÍâ=”šÁT÷…¼Ð‡%UùÂ4¶b•áË!Gf³eð÷0«ƒ·_Ptª,¢ñ˜é Ù•—þ³Á ¡bt8 õu[^)±3¨ÀÖ > ¼ÓQçš½-ÐSº”q`=b·Œ¨ÑœßUüh¢ÉY8KªÕcT½’jY/csùxkÐZ ûƒK€+§kx0ºo.´‡Ò"öµÿW gÒÆï}÷ñAk'Ù÷½ÇøT|Ùy©§-$3ÖD…,n-¡: @Ìù¹â¿ŒS/°Ã(Y52¿…`þ*3Þ[Ì)³/×cB6é´Iàd Þ°ÉúhLZokì»;1KqUbj뢯Uѵp ŠÙÖ)Ì©¼#Ö‡ob…¹ºm1±ŠÆnl<2ŽÒŸ-ÿK<[fŸîL’DÃñ¤˜—øôi£Ïø\ÖgÔkÛrv¡.Ô°%Š<¨˜.HU[×éRMe$*ÆÑ M(ßEW©´•ëG%æÀJDGss™³ï÷pïtl]¼_æôñÙ¥˜ê¶E½d’¸01Lh[¨0Óˆ&zç'Ií¿mºŽò÷5[q_¿—:ÊWÜW‰CV¹'$§˜pÀíºø”„º+‰,~&$ñHÔ¤©DÈžM³-9/G†ª^ƒið*…À{;w ÏsÄTè4¦ÎªËžÒ:Û$}¥•*šNy²o©Èf,MÝ "Ú\Å7TÓͤr™‡¸:Š*UJåÛ3õGË Ó¤‰®©{Û2@ &åíÅ¡[:¿ä¦öÛ¥,s;!Õw÷5€ORçµ¶yH³Qm/è×e'\ÿã¯ÆŽèÖ}SÑ=&¾8Å;1µJcújåv´+J Ý:§‹ýP—µ8P=]§7ܨ/ø °j*ñ¬  R»˜J›­y§%ætKCîiI³p}™ä(̪L…RôÈUXüÉì¦wðI¡‘’E&Ma®9zdÒw­âÈdÄ®\ï£ý6š¼ Ο‰ÁA=òÄÏÀà¡òÄA-‹ÁÉ`ÐŽ…´ ³áP$ lRÀ9x6IÙ¦[Vïìå:ИÕ!nJhcø-Y@¸îîk?èúXÎ;pò¨Ød€¦äÛ‘o¢žÁ0V…a  št1ýuQ ˜öF12¡TË¢Çãö¸Æö%%î€5ñ¸^?÷TãÝÛíSõà{²q/Aü ß¼r±¿ñß9Ô¾Ù»;Ð ºÕhDQ(È×(ÞcÔ•J÷úÓc+= j¨ºÐÞé;Üä…[¬ð¡hVu2¯:iòªÇLO…uÈ£*›É¢^)²?i£¦ÖMô©fƒîГǺ\sµíOnZ;²våÀŒ¹E·P¸ë•Ð?ÌÅj«7«êÍž}˸fȸGþ;°_“íì9Òºæò'¿l¾‚!’D9ÐÚ¸76ï›Oª"áªDw²- A{JdÆêÚì¿22„ú]§£ßN8ô­ÀD”x®t=‘÷€×bŸ_ÊíùcÌØYÇAðlõ~á©.öŠ)d.¼MÁŠûý8V¤À› QG„÷àÃð`ì[6ÛÅŠwJÄ/’:˜^W ~‘ÔTûfü"©óG;_jc‡­Í¸Ô†)Z™êb ê–Ô…ZJ”˜Ò.ü¥ŸÐ.*Â¥PÕDß®Prך)Q¨®WáµöB(Œwp‡2~fꎷÎyÝ]˜MÅ4zæ:_æª $B¦_}M9±Œ±ÐxÃJ¼)|§zs­"„2‰«—lu»½²ÀÖ¤'ÙÕ»%FÁ™¨´¤ÔR½IèJzHô³Â{úK@…–x¨re’^™_°©vö¿¡.I]vf²å‰z’Åöß~}êâÇð{0$’w“ª]c{Õ?„‹;`¨Ë«‡e‚N$EÓ']R?[|WÑ•åôy[2lŽjÿ/¥(u!jWÃ8IÆJ€.'kµV½ZSW•2ÅTB"“j=¦ë‡Í>줪Þe0ïEeÐÍËò¾² @σúfà»øõ*˜¨·‡_„ó9A£ .ÕÉ"’‰å.x-¬ø˜€P¢œùË!C"kËCÝÔ-úsÙía l“.˜¿ 2o/7ž3Ìi2[ô`¢{#˜ûÓ©ªÇc怷Áàž&!d¤rAMÚòî0ù²ÖgÇ®Ï~kݰ‘¯•õ‘©º¸^ð9+U™†S¢Ôz\ Ë©bC‚êÉ;ƒF&×-¢ ¶…ís%#q¤…ÙQ“¨,cWcdHܯÁhës•Zg2 ýLÉ#^Îï—Ìû«†e® P:æ ”•U_J­H°Â \RÆ¥"òø=F9.SöêùXóÜ{ž5ÿGÅmRuB&‰ÍêÖõ—€/ƾ‰œkÊžÒU¾‹tMªÏWYÈ\˜ª|ÃᚢWÕ¤ñkªòlÚú~Ë3YÍdž×l¿fã‰ãÃSèdˆÁ8ß°Ì7ƒ!š ïu‰¸Ó³`:¹P±ˆñÑý{†ØúK®5牶Dfç¨÷`t¢ ·2ê^N*Ô)ãÙ`«iδõ2k A?¯OW3Ï ~¨ä—F¿ªà7ØŒñËÙ‹»0UšDøÕ&eæâѧkz¤M¹ªM¥y“¨ÈÓío¿£Ü!j¯f_›©@¬SØÇЋ©”ÄíkÊnÕ–S B5B«sÇê#]ñÄyU “ƒäÏÙãrñ¸PµG^º°ûg¯€ÂÕL t®L€Ëð3SÄãoêþ^%È8d¶ÿR¢Aˆê½Ú­>¿s,È &ýBÔ¦ ;§RÉ·ú>¸¶òˆÂ‰ù/Ì3® ãc_Çy5~x®ÈÜôú@+DH—@CÝæ±oÏ‹úll¯—U“îjû…Š¢ër¯ÐzR­9*¾_Âßãp-8¦ŽV'¦¯ahsØò†#9~Wʧºð _9Æ×÷‡íþLÞH5Þ9‡û/ðºá#‡0pÓxuàZcP8?ØsÕíÃQ•UØ Þó>üK……ï¡.¿#<~æü< qû-\7álãëD nÐÈM~$ƺ ÇgˆXËü:SàÔP”§w«4núœ`Ju¯êÄöƪ…%-Œ; YNp¬Å´Áuö4ÕPú.Ùâyè8µÒÙÆrÇAíˆOý䤑ÄÎvßm3§Vu=Õiå°•BœTaµ¡ü8Û}ØVħOvê˜x€/sMÃ}ý+xÃdþš(À\îðZc[ËÂ'KeËÌo—`Ãb†iÃv#acØûMŒÆŒ¬ViµaÞÁ|€£QXà¸á«1Ö£àÅìm¿í•²¨³?Oý…^õ轜Æí2sh:ØÚSd¨•pcù·–K«‘Ähk…Ú] ç>äßr8â-i»+M6-c©Ùô7Ul6FÛ«ÿÒnšç\➟IÊ ±]ïÆà=«ãz1œù ƒgƒÏx1i‚>½:³-Ëp‡?ï)î6Ö¿à¶p½…Æ,ͬ*Ü#3u¡no9x6ü¥^)Œí+Üq‡WÓF|wÿó[6¬ʼR [Y¼O˜ÇñlõýÜ_eõ®íãº:¾Ô\iŠ)-±ý¼ù?(à—½ endstream endobj 2520 0 obj 5564 endobj 2524 0 obj [91 /XYZ 38.2500000 726.500000 0] endobj 2525 0 obj [91 /XYZ 38.2500000 424.250000 0] endobj 2526 0 obj [91 /XYZ 38.2500000 726.500000 0] endobj 2527 0 obj [91 /XYZ 38.2500000 424.250000 0] endobj 2528 0 obj << /Type /Annot /Subtype /Link /Rect [233.250000 117.500000 325.500000 124.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn30 >> endobj 2523 0 obj << /Type /Page /Parent 2 0 R /Contents 2529 0 R /Resources 2531 0 R /Annots 2532 0 R /MediaBox [0 0 595 842] >> endobj 2531 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1409 1409 0 R /F8 8 0 R >> /XObject << >> >> endobj 2532 0 obj [ 2528 0 R ] endobj 2529 0 obj << /Length 2530 0 R /Filter /FlateDecode >> stream xœí]ˮܸÝ߯èu€i‹¤ž@ÀÏY0l ‹ ‹`&“`0ÄÉ"¿u·Ô÷^ªOI<]¤­q&ö\YY,ÖãT±êÍ¿üýðÏÿÞ¼ÿòïÃÝïï¿TXw0¶iiž5ƒïœ©ŒnôÇ®œ‰6öyÞÚ$1§ßÅÁul‘Ÿöø´¿E]ÛöÏ•ëþ¹bu~¡XUFØŽ~ðÛQM<6:Í[™"ýNñpSttwu¦Oëèú”?ñt´]=Ï[›$ý¶âÁõöµÊm¼Ãú)³ZŸ>×Ñõi_ç¶Ž¶¯çyk“¤ßW½ùÔª½òðõçv^çï]~ûúí)?ýGk –îðõ§Ãï³Ì48|ýåÉdDz2uëöžþÞåÉÛó“úùöòƒcÝd¥-²Õ\qGgkc_âà;õù‰;yyúîó“ ~'{~’swqПŸ”è[Ãwðhµ¿ô ./>Á“Í>žŸ=_<Éádñ¶äá„Ä+/pþ½…„´æ¬ÎÇÍ xZªð¹aº Û¿ã<Æx•á|bÂhpXˆ 3pHz:3™(ßar».ð´D#3{{Þ˜~*Ó×õñk«_ãèÆ"7žrtø4`Ù‡õAópoÃeŸ ǰa¤|§aVÀ&ȈVóÎ_+XÚS3 Ìoò ñë‘xüßíVs<Ïæ†Ñq㉩à;yø“ŽF7žXøÄÀYw²*h=~gleU] ù)XäÂ!µ©Æùî©%ÞÉ1‡”pîu>ÉÒוýWáêtéËPÄðá3pxxïñ“· àIÇÅaƒÒ¡³*‚xY \ißÁOŠ®Y‡ñÞ9¸?¹´§£4P5õÁ4·-/‚¦éMçKµžLq™ŽoG[žió)üû¾ÓÀïäWó¸q¯L¨ŽõnŒÖ ÁïdxÖMl²ë<ºw^gytÆz†÷Åæ«Žn`RZ´‚t¸ECü†Ø‘ ÖžtÇëÁßéüxSö&ñ„]V 醹E˜5\©ÍÂGÃshŸ|çÖÍ:¢ÑÚÏË{©Ùû Õ@L¨bqØ-À4j ?œ"üQˆPQ þÎt‡{>T¯‹À ¨ÜHÔ/ãÃUBx`”ë #×½4á‰,a¼Ÿ¸!)Ê ÄÄ.P3L¯bØY.'á]g“ÃâÉ|—–Î=µ9­DPC8pã•c¶„B „³áø(AU£DØ ¹¨TaF Ù®KˆüaRûà bcöðÉ0àCÎÌ©¯1_`BNq0q3ÁŒbä6)á¶äµÄÿ8*ÜÔ=êŽÑMÃp¨OðŒ¸Áø…n¾‡sƒ8¡ÅÔX¶07b~"㺉¿ƒ÷Ô$ãË*³Åká{k¦ð‰°÷x4L+Ly&–‰1bu‚;Œù’Á¢1όƜ ŠË tK® Ÿô*!ÿçù8'a*~ß,—Êã¹aé+œZ¼RÌ}ø \©©"dÅñ|š‰‚Ï Ö¨L¬L˜5æÌUøœáÃÒÑtpðùxô]Béðœ¡AD]w‰Â٧¬ñ©%bÅ8/E7;b4À9 Ī6 ÞÝ|Fâ y؆T•Þ8‡ˆ9?x¥”|Ì™ÓåkanL6Θn ãDHk‹yGõ‰ð‚°í!hMŒ'6“w$h Bº¸tù UVÛ×_ÅkH2cǹ‡á+Cdî š›ÉZÃèÚŽUìXÅøÉpÍÃy»o/îÂ*}{&.Àì × ®J‰;˜¢¾ÃŠ|é°5Ÿ{ÇvÜadÖ;îìü0<ºã;0Â! ÇÚÿ½þ*^C’ùX'CÁ`©Hh:Fg0[¤³ûÂ~Jä16 ¿VEðz0ècÛñxeÂÅü†ßÁþG"›‹ò¿qŽ]¢;Ì[“HLž!ƒN0ßaÐ`Aºv2â” [&äÁ:±eà ü&—Ê’%"©,åê‰$Eªüfyô6 Ó`Ì?Lã#¸=‹s’–X0î·cŸ ±ÏT(âÃxw©²¤r¸žù³¤pî6ƒŠ¦Œ·Ùâ®<_U\Ê2²fÁ^3ë=ïF”Ä©PÂ;Ã(#)Ì óã1XI2½‹yóá +SGuOSñ(Ö‡‹æQ¬Íˆ[[‚•µà؃àÃáõ¨žS—îžye+;¾÷‰,¾ª¶‡`ã3ñU+Km™Ýš䯯îu'ůsÏ©]e†ÄžïÊyM©ª·S’ u*Ë—B‚ 'â=eüŒá1;'Ôµ&VÊäW37éð“Ç9%›³Êñ™›ß*'N0öçë®tÑyƪX;ƒŽ§Ì³tæúUµlS¹˜tåÊkjgWòmØ‹«ÛRS3¿K‚èʱC5óì*]u£ô–­4uP„9t¢]DFhã>†ÞÄ<µ¥Ï,›ÏÙœ“D Ïš>=ÍVÙ{P a”Tš`zò‡N$iOýZtêuÄ#œÌÀ¸*  ±˜æQfôv«¬ò4,¶c¨Ð®Fä˜ÑT&ܘY¦ß°ÙÁ ¬É÷ðÚ|áµT¡m&TϤdQVt*Ý´|’›¬!ùp„,f2¾îPP1]UÓØÀrK5ƒ4OX(/®ÝC¶ ºAlT«Ð.ºþ)Q·æªÃ&ÂÉ™{éQú™ï²çU¹K¡] íRèõÜ,…˜: ¸®‰° ¸Ñ-VO¦Dà ׈sÐ3§Ê¥\}So•a]f4]¿N—nØÏb‚Ñ ¨„ ³NwK)ç=†‹yßd)Ȇq&çNÈô—°ë·œ˜LæDi¶«­Ía§%y†ås@H_Uf„äÌ®{…Cs3osYZߪڦ›30˜7 w`~IÀ¼ K˜°ÁF/*¬ó†fÔ{¥¯Ç6v÷“ ¡¦NAÒÈ ±—™Ü¸9ÔöŒNg*Ö% u_fƒ'Ì@zÚ>¡Z(âÑÔJ[ŒsRùœÚ[$üªu;ÿn–36/„çó¾‰OWp\á«õÁ4·>i/&G•õŸì ÇVs]ðåÙŠ£õ¡gó‰xç-|Ï A£¹¢7P/êv`Úœò’¼ ºqkn—Y—Gg¬gŒ¼ƒ£]ŽOutÀ@5e¯“'¬GxÒº3Òo̺³9nÌZXÏGøœµ2Ý0uÞCßÁµ¾óÎÒZà*ȉ>héFpˆ°Rø¼aÖpýÍᬅýÁróæD̽ ÇcŠbºA¾føMX)±sÂhzÒÝà¾5Þ9†©â°U~©ºqX¦ô·ǩ¸i.r—±p÷ÜÁ¦2œµÐ#’±á{ ¨uÇF»hsãïb@“Á­èJ@2ƒ0uh„”¹…4HžV Õ® âñÑŠþœ8¿ú×F.„2Ñý¼ADI]Í|ݷ΢Èëª#p ‘‰ï2‘¡r„“¸B'°5¢íÌ}?üŽSgâa«ûTý)LLQüUêèäÒ$J bDÈF´q‚¨n]ù†ô\\³ž2ƒ&ËTÛÈ8N¤uð¥ \Ž _Z‰žÁdìÔa®Ê+A›*蔬増ë9¡wÅ0M3ŽilßAlDúÔµGeÀ… ‚`L¯D£\jaþî-qK<-º¿㨨4‡‰kÍ1:I¨º¯z5G×£ä§naxUßI¶œo?y,CeLÎÞŽ)CÝmJp·ÄW} œ9:°Ã7¢Ý±uøf+PL@z5”/©nA«®KÕ‹Ü¢ª|'aGlVö7­éæocüâXívøZvµpg¿|™¬ðJ-×é'sÑE01Ýè×­’¸ìñAªþ&Àëq¾ I„š+ßHf&°/€¬cfVÔ¹ÇT:ˆJ‚b‡ÂTê1®Éj‹ÒÛœÝd]ŸÉêºÊª/vQU“­³}F¢œÜÅf¼w¼qŒøT-&¡©¨#žº2³·eç˜Ùô¦° ƒ²ò?¬¢U#[+¾µàriµ¶¢#Îó‡ÿCˆ‚ã LlõÑ‚k±ÀïõyÂ…7ßï_§’$²jݾ€R^ªrT%O][[%Z=½›ˆpX1ÝtPAËÂh|вΖ.¥’Ž•¿†ÈÙ³Å5¯C—ƒS²›†s³x·Év›L¶¢>$ÐT]¯º¸6ÔÄò›iË¡:ÖT¸î^S L oÕWð3XŸ±D>¬»±ÅAQ[DŠP«cZ ær\‘ï‚Ú-¢ ÜרQŠÜaçhq¦ü*õ•%1uî¬g\sŸ 8ng%4ûZòþàõ$lטñªÿ.¡%ÐäÍ=òö`¼Lá °6`t˜®ß.èÊ„¶HSÖãrS¤"¬ÆTÆ<†9[)Ä>2z±á˜õ0u“uí$«œGm›XWéPWã\Nàh+èOäÃ$³¤iaFFëzkLzF?cé€×Ãø˜'Ÿæµ¤ëVý/Ʈɫ‚°7( Æ4ì<ÁFa,}¡$ !½¹¡º<šÅ£íöàºåm©j‹Qúîöàn½¬þ4í¶p–Œàn §º-§1!Wgy>ÎIªOöÈO:Ž’ú]¥»ƒ/ÔöI×PÛ×óIòUc¯kÝfÇç ÄÈù=¯R\én íÖh ¥”±¦èãŽ{ŽYú6å ø—‘åF·°¼d"¾„ÖZ'­-æeƆKÈåÖÜ…G1ÚÛìDŽƒ† ™dŒ6 â ¿¤Ô-Ö]ó—Úï¶Ï«\©•ŽQFÝl¬Õ™s¢©¦º|/˜:8&)Äã *‘0¹¶åå­e]ìž­¸ÒDž­²Dœ¨{6±NÆžàbnM†Fï2'‹ØŸEŸ¬§T­íS=Y •Ê&Ð=ÛLöŽ® Y†èÌ„½ß˜¨Ì˺™['¥ôíﵤô]>Žy&O]ŽÎgs¾,5Ø­2·StÙöØÖbx„=¶RÄ~1¼<ëÑw¬? Œ¹[ÏäHb®`dÍÆ8‰º—žAïßÄ…´nGàƒ\õ8÷ÒéÀäñ.9Þª&Óä2su~mñã˜Î‰º5Òg¯s,0•§¦¸¯„+_n8rcùÚùl¸M¿,f-¼Ê?ÊÊú¦÷»¡ÚOÍ^Á™)QJ5 "útÍÒ«)ºBm$_¡â":®*R~ë(D$¥é¦EIŠ€AViwRÍ øNIqýÏÙ;N[éžv¶Õ´³˜!m㟲èºÐ9ç}3\Uk¹\*ºbº%OÕ_ž¦›­wrnáð(-ÏÛ´¥°¾2\L”(¢ (ªÚ_õ’á€h@@÷&¾“Uì>B¹·9{x ”Á«Ò$×¾í)ð¿ùÀÐÊl†ÇŽõ>r·Û%Æú4ŒI‡·³!~ ‘ Í`¡ ,ºøø6~bà&¨Åuäüß/…yó$li}:À@u&¸#2â“?Ç´¶uððôÝ1ãtÕ9¡Qùºòhú3F_* ‹˜¥ØâŠÔEë ‚øwŘV _«Kþ|b7oHëXø$ ? >78Œ˜IÜ–öÌ¿/Ô¼bÐËO&q¶ @óÒçì ¹o¥&bcVÍ8¶ É17ìQ«¸ ê…ÅÍÅOœzfÔÖÍlßÿöTÙW?øõéK¤3rúg¯­RMÖ)í¶%@c}JcEGŸ¦ðzô:%¹:îZb±A¢q×#0„*pÙH–…Œîí&Ë ’X˜T{Có™qšâ&2Æl È,Â$8‡ÞMöÖ>`‰P9e¸&M@ºªð2y“Hy"l[å’ sÒðfç)r»«ßEÝPÁÙ\Ì“½˜DÆ•çÀmK¾¬Íй0AÇŽµHrfÊìZþîã«;¯¡ýuøÞNV\Ë籿0Á2®oÂa­e•™S\â`û¼ÝÆ[‚òÂÕ w±šíÑž-®—O.§¦>é 'ÙcH›[Èô7¦†oÍíS·ÒAh¦S¶WÍýãzk²¦[ú`XÀ¶n,ÃàÑà;Ö5AK¯žÙ–e¸ÓŸÛ÷ /Ââ¶ÞÂFc–f¨ ÷ÈŒeø`»äÆ1À£á•vfÈ­}…;î0Eñ܈õtîW>eÃüSÖÙùa”Åû„yVßÏýUVÍ…(/ƒ5/,ÄQ%ðùðùéÿó¾}„ endstream endobj 2530 0 obj 5477 endobj 2534 0 obj [92 /XYZ 31.5000000 521 0] endobj 2535 0 obj [92 /XYZ 38.2500000 607.250000 0] endobj 2536 0 obj [92 /XYZ 31.5000000 434.750000 0] endobj 2537 0 obj [92 /XYZ 32.2500000 549.500000 0] endobj 2538 0 obj [92 /XYZ 31.5000000 379.250000 0] endobj 2539 0 obj [92 /XYZ 32.2500000 682.250000 0] endobj 2540 0 obj [92 /XYZ 38.2500000 359 0] endobj 2541 0 obj [92 /XYZ 38.2500000 607.250000 0] endobj 2542 0 obj [92 /XYZ 32.2500000 433.250000 0] endobj 2543 0 obj [92 /XYZ 32.2500000 378.500000 0] endobj 2544 0 obj [92 /XYZ 38.2500000 204.500000 0] endobj 2545 0 obj [92 /XYZ 32.2500000 89.7500000 0] endobj 2546 0 obj [92 /XYZ 32.2500000 626.750000 0] endobj 2547 0 obj [92 /XYZ 38.2500000 359 0] endobj 2548 0 obj [92 /XYZ 31.5000000 755.750000 0] endobj 2549 0 obj [92 /XYZ 31.5000000 521 0] endobj 2550 0 obj [92 /XYZ 38.2500000 204.500000 0] endobj 2551 0 obj [92 /XYZ 31.5000000 755.750000 0] endobj 2552 0 obj [92 /XYZ 38.2500000 148.250000 0] endobj 2553 0 obj [92 /XYZ 31.5000000 683 0] endobj 2554 0 obj [92 /XYZ 31.5000000 91.2500000 0] endobj 2555 0 obj [92 /XYZ 31.5000000 550.250000 0] endobj 2556 0 obj [92 /XYZ 38.2500000 148.250000 0] endobj 2557 0 obj [92 /XYZ 31.5000000 628.250000 0] endobj 2558 0 obj << /Type /Annot /Subtype /Link /Rect [60 719.750000 91.5000000 726.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus14_introduction >> endobj 2559 0 obj << /Type /Annot /Subtype /Link /Rect [60 712.250000 123 719 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus14_core_language_changes >> endobj 2560 0 obj << /Type /Annot /Subtype /Link /Rect [87 705.500000 142.500000 712.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus14_binary_literals >> endobj 2561 0 obj << /Type /Annot /Subtype /Link /Rect [60 698 126 704.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus14_standard_library_changes >> endobj 2562 0 obj << /Type /Annot /Subtype /Link /Rect [60 485 91.5000000 491.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus17_introduction >> endobj 2563 0 obj << /Type /Annot /Subtype /Link /Rect [60 478.250000 123 485 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus17_core_language_changes >> endobj 2564 0 obj << /Type /Annot /Subtype /Link /Rect [87 470.750000 167.250000 477.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus17_nested_namespaces >> endobj 2565 0 obj << /Type /Annot /Subtype /Link /Rect [87 464 149.250000 470.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus17_u8_char_literals >> endobj 2566 0 obj << /Type /Annot /Subtype /Link /Rect [87 456.500000 161.250000 463.250000 ] /Border [0 0 0] /Dest /X#29#0b#01#ffr#2d_#19l#cd#df#bf#3e#caW#ce#5e#a2#87 >> endobj 2567 0 obj << /Type /Annot /Subtype /Link /Rect [60 449.750000 126 456.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus17_standard_library_changes >> endobj 2533 0 obj << /Type /Page /Parent 2 0 R /Contents 2568 0 R /Resources 2570 0 R /Annots 2571 0 R /MediaBox [0 0 595 842] >> endobj 2570 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1409 1409 0 R /F8 8 0 R >> /XObject << >> >> endobj 2571 0 obj [ 2558 0 R 2559 0 R 2560 0 R 2561 0 R 2562 0 R 2563 0 R 2564 0 R 2565 0 R 2566 0 R 2567 0 R ] endobj 2568 0 obj << /Length 2569 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯Ðym‹/‘‚ž;@ È!È!˜Íf±ˆqö¿ªEj$R[ª¡¤î±lØ3M¶ŠEV±^,–Þýéó?ªý^½{üüŸêÙÿ|ü|ªÏZÕÝŸªýûã°›³ÿ½ÒFUÏ_Oߪo§O§Oîÿo§îÏq¿ý¯âÕŸÝ¿_«¿ýÝ5þä¿Ô~áëI3í~þûòÓjæ~«ûŸmû/§¿þPýÖB ÃydÆŸ4VÞbqeäo§0Kvùûûóo§wÝü ´iY1)ÜVòê¿ÿ<ýìàèí“Ì6µ6þNÛ´ckîPÌT» Ì6˜í5°›ñ–ëÌ$WZ‚ŠäËæáÃÍÃ+Y¥¨ûò+VÖÔíôÒ•}\·vrôökW¿¬÷kÇê3^ ñäNÈ}¾‚Y¦Ö"Xú†fYS ñlîˆ`+ì°)F¸ jÙnÂÂËï‚R@f½ùÝåÕ\G²ði[ª×ý¿¿f—hl¤­9°eΘF[ézÙ¢F65oGáÌñ·u¥tIž€§æÞëa·“_ v‹wáa¢aYØër“heȾ†Rí<ðÆ¾†¸Ùk`µ‹“üæœ+y³’VA߆V¯;Ìt5ÄS߇%v!˜Òf-‚E oˆ`JÛjˆ§½#‚­°Ã¦á&¨e» ïä\p¼ J™õæw—Wsɧm©¶®uر“£ ö®Ê99FëÎW°ª¼³Ð_ÁiQÖ‚}Á»ðŠ'Â.FTS×\øµÑÅWg½Œá‘ú`ªö|Áf´F¨‡ÃÑ@hQ_’•¦M»õµ•2^i, æ»K[i’t‡¸e6‡"ƒ ‚Åv9¥”å"ˆ‚ý‰Œs†`x>%hY”1^çÛÛ˜â·S ­T8…‹(]ì ã‚ûqÕYWÇec#eƒUß”º4Ë•/V±~å§0€¸aõïÜ•'ãzz '¨­d)lL%ø¤ÑtÁEk>ÂLŸµüB,ž;ýÃÙYt3ˆi#ê3wZjä{]³ö¹ ]30ð{lk/ì™Mü\öõdÆé8—‹3«­ÅÌ;!Â̹“.szØ{¸Ö³qÎAK9â’RaŒ¸œ?T_ûÏìlL]éºý¡ëîóQ56T„–çScÎŒYn ë¿¥‡P§n ÷ýî3·ícUô47ñ®åùaâÚ<¦Êxϧ_N?ŒÖ„%kÂæí6ÏšÎÞ5¢ z4Ö&—>ã.C呱o6±bziÅošîb’О7Yc† £6×K;æzUOq½â1Gº–„ëÛoé!ÿÉÑs½4S\/u<†kI¸ÞµÌÍëû1våz¥» t¡ˆ9)”F±W)ávÂYéèfþa 鈫¹æÊÏÞߪñ»+1lh÷wv3ÙhL¡Á^v “ÜoŸKk—và7YhyvÕ~+ößv&|4~—õ ú² #MãZÚaFÈ\¾%Ç`äx˜_"ù¶Å^fªé6³–Ÿ¼ý3q:D‰ýÜÅ$nQØ{£8k”m%唟püBÁrv;[´Üva6å7°¨å°áõÞ豆7fJÃÛ:Ö¾¶N5¼íuº‡>鱆7Í”†7*£­[kx×0m†¾cW oÅØ•› 8JQ?ØzÝ(_„²q†)&¶X0ÎÖ¼VÍ[³aCмå9©(b¥;6`¢esÓk’u\+ÏT\Njðn­ÃdªiØ¥[µæÜ¨.Àõ²jïá3=ã 9ÍWdèzéé8XŸ­‰Æéƒr©¶|€Ð> žà‘Lô<¢™fpƒ3ÍàV¯0ìb®ÖùXA<„cM#“9B)‘ÏXdK“ÎùË_XtI~˜¿ © §'fJò£è¸ sá„aBâDfu«êe^8±Š@§ 5(œBÉÞêP[ž^Ï©ssôà(¬—×Üš¹'n3GZ1³©°¾Ä6.¶mJXè”»„»] #m»üJ0»2—¯æŸÅì–¾žq†:¤4ТԠHÒŒƒƒàô\þ ÂZüzvÁ (ט3 Ø%Ä‘/Jú¶µŸJÑÎ\¡] –)!(”ÊuÕålÌ–œ£g2ƒAÃ* ¦à8ø™öàg n>áuŠðB«áŠÂµÆøÄÚ) Xò)4GŒŠøhóLcÑ3\……Ò‘ã5ÕÔ8u/â#“51ÅÀoR·¯Aþ°knÌoìËU®z‚YR 8„†ŸÁ3Í̧!Ì”0Œ[†r·b[éJ”…Ùö}ËÖEá°WÑ‹·™àã‘._è¬óm¦Ë¿²R áx|ÿ(ʉ¤îdÒþ)Á|AA¬1n„ù?m—ƒäÏ}/!†LÝ+lÊ×â8êžlV÷dXÃè5÷C­Tjx?Ô}nÒû¡®5ªIri‰î‡vßÒC(á“ÞuŸez?ÔµŠd ß½´LåËýÐÁ;Þµ²¿svÔ=Á.ÚÌÛ™n5ù¨îIßðÚ[ÑVj9æz­¦¸^ë˜#µN¹¾ý–B Ÿä˜ëµ˜âzÍ“1xÊõ®-`*†\ß±+×›žÀGÝ“£îÉüýmبîIß0³î‰•VŒêž¸™Ö=q­QA’KKT÷¤û–°#0á£Õ=q <­{âZY2 ‹ëžøoÉ19fǺ'‹PmO’—Ë‚¤ÄëdÒ-²$*‡- òò¯íÿ¹•D¬{6ì)k† +V4°&âÊQ)× ›R”hwÙ$¤Ù%Ætúzºž"Ü5a¨ Cå;†Š©HJµ-±0¼|«v=˜ð‘…¡r"†ŠÕÉ0u" »oÉ19fOa¨XÈ3 C|ÁMžLîäÓ^–ÀÊoK8޹–V…rܪ3 · ³E‚`‘H|J$ïU×’ˆ„ö[~Ë0á#‹D‚¨§D·ñ0®% üEô`äx˜]E‚è#aËí£%g;%Ê–“®êSX{©™"ÌØô +š)n ˆ€¸ò=áÝr…kÐ_òýÉˈ‡œ¼T*fªWÅ‹”U‡vŸ'ªC»Ö8‚©TRºû–B ŸFÕ¡­’Õ¡]k‰m[âxQÛæ1•ƒêЃ1öŒ©>]ñ¨¢—ÛwREÏÑ3Ô˜ìÊÁõ «WѲ҇âe UôFë¸O=Ûð¾ .®ˆwTÑ{{Uôš¦UôfÑ£ŠÞQEo¡ª>ªèUôŽ*z‹=ã›®¢÷¢6*zÙ[/ï ¸UôŽ*zó,‘£ŠÞê›ñ¨¢wTÑ›[EïE+UôapTÑ;ªèUôJ†µL_9â–•ë=ÝýÜ¬Šžæá•9G½ì3G½l½>Úß<;ªèUôˆÖéQE¯šª¢7ØÝ÷¤Eß~=‚tTÑ[vZ¯5¯öQE諸«è½pË÷rÅ=[EÏ0mž[¬¢'ûe«èej±Áª€¤Ênz…À¸ê¡Ž_pØš a_5Sïä-Ãàö@ Jn_À®ŠEüš¡^)(OªxH¨ˆŸ©à8ƒ­*Õ×'ºaˉrúL:YàžMÊ$/ltÕ<=¢xYóol,(u¶ ²˜z E3<’ /$cŸBQÌ9·|;µèµ7{)8XË2jvÏ+yb·fjSÃbÅ÷6+[ œŒ 8 )l&3îSl[­`V¼pþæ/’Rµ@nY¦Ô²A\ŒôìyB= –­ñ8°¬'Æ€ã⪄r¨òbŸÁ= –¥@ï—ÏÇ»iÛp·WñÁ=µ&÷l3;Ù—Ð(Ïzè¦ÝaÈÝ®.ÝÓiFÍQjοÔDº^ôjÂ*‡œo&}_`Æ ”©9,ËòÜÒHsš ¿~i9#í !G-­®â“é9(œ1œo„Â/¯¿ Pøà Wܶdœ’[sÅ›s´Ü*¶õû7]‘rÝŒÙ)v/˜êò£f3WLÍE/8¶Ê\ÁÏÀPBsâý²÷Z¢ÿi*³¡ƒ6‘Wy&Ä gz„¨2o ¤äš”}ûâù)\D\y¼s2¯âÍ=ÜIºéwNÞpu^¯eꦌ¡áq¤BÐŽúÀ‰ÕŸõ._—ÖP¸RD‰œ# S‘‚ŸU\IR¦2© »½Øs掯ÁTÎbk¼ã5˜ÀœÉ?å^2؃ƒ„ †Vø™°†dv¾!Öø™’¯´ÌºlÂÄ7uVwÙvLY×"žtÕhþ-mxÜCÈŒÏxb8cÞU x™{8kCÃÙô7BÖ>ÎÍç°'3ÓÃgÌùŒ²¿üqøŒ4Ÿ‘b¿ñ×7,Ê‘=Þ‘Åúž|F )œ]dc½Ac¿}¿çHÁO™³Ø8†=ø½ò^!–:w†vðûëñÙN&…k-á3ØÁç¼䤻‘) `j%#5¾¬0áZ~¸^ÓÄwª>á*9.ÒOyã|¦ä?¥ð~…‚XcÜó ï¦Ú¥¼€äÏÝKy÷·úæ&ž]—O×¾0ô7Së&vŽAâUÿÒÒ²~7¥*­Ûá<Ô9KTH“öø#žr¬/C…ë¾MŒ#®åÛNáöÑÏÙ 8R*cÖÀ×…§‡à5ì‘h CƒÏxû’-šú ³„Êpíïã±f[Dh†M=LhÌž„õöfèãâµc×êÍaµÛ#§®Í¹‹{Œè* GòÁ»d®JµOÕ§Óÿ›¥j± endstream endobj 2569 0 obj 4378 endobj 2573 0 obj [93 /XYZ 32.2500000 103.250000 0] endobj 2574 0 obj [93 /XYZ 31.5000000 420.500000 0] endobj 2575 0 obj [93 /XYZ 31.5000000 104 0] endobj 2576 0 obj [93 /XYZ 32.2500000 419 0] endobj 2577 0 obj [93 /XYZ 31.5000000 785 0] endobj 2578 0 obj [93 /XYZ 31.5000000 635.750000 0] endobj 2579 0 obj [93 /XYZ 31.5000000 785 0] endobj 2580 0 obj [93 /XYZ 32.2500000 634.250000 0] endobj 2581 0 obj [93 /XYZ 32.2500000 530.750000 0] endobj 2582 0 obj [93 /XYZ 31.5000000 531.500000 0] endobj 2583 0 obj << /Type /Annot /Subtype /Link /Rect [60 749 94.5000000 755.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Preprocessor_nn2 >> endobj 2584 0 obj << /Type /Annot /Subtype /Link /Rect [60 742.250000 90.7500000 749 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Preprocessor_nn3 >> endobj 2585 0 obj << /Type /Annot /Subtype /Link /Rect [60 734.750000 123 741.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Preprocessor_condition_compilation >> endobj 2586 0 obj << /Type /Annot /Subtype /Link /Rect [60 728 105.750000 734.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Preprocessor_nn5 >> endobj 2587 0 obj << /Type /Annot /Subtype /Link /Rect [60 720.500000 96.7500000 727.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Preprocessor_nn6 >> endobj 2588 0 obj << /Type /Annot /Subtype /Link /Rect [60 713.750000 128.250000 720.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Preprocessor_nn7 >> endobj 2589 0 obj << /Type /Annot /Subtype /Link /Rect [60 706.250000 136.500000 713 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Preprocessor_delimiters >> endobj 2590 0 obj << /Type /Annot /Subtype /Link /Rect [87 699.500000 208.500000 706.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Preprocessor_nn8 >> endobj 2591 0 obj << /Type /Annot /Subtype /Link /Rect [87 692 177 698.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Preprocessor_nn9 >> endobj 2592 0 obj << /Type /Annot /Subtype /Link /Rect [60 685.250000 136.500000 692 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Preprocessor_typemap_delimiters >> endobj 2593 0 obj << /Type /Annot /Subtype /Link /Rect [60 677.750000 135 684.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Preprocessor_nn10 >> endobj 2594 0 obj << /Type /Annot /Subtype /Link /Rect [60 671 153 677.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Preprocessor_warning_error >> endobj 2595 0 obj << /Type /Annot /Subtype /Link /Rect [348.750000 448.250000 407.250000 455 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Modules >> endobj 2572 0 obj << /Type /Page /Parent 2 0 R /Contents 2596 0 R /Resources 2598 0 R /Annots 2599 0 R /MediaBox [0 0 595 842] >> endobj 2598 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F8 8 0 R /F9 9 0 R /F1409 1409 0 R >> /XObject << >> >> endobj 2599 0 obj [ 2583 0 R 2584 0 R 2585 0 R 2586 0 R 2587 0 R 2588 0 R 2589 0 R 2590 0 R 2591 0 R 2592 0 R 2593 0 R 2594 0 R 2595 0 R ] endobj 2596 0 obj << /Length 2597 0 R /Filter /FlateDecode >> stream xœí]K¯ÝºužŸ_±Çî¾|I""€}lè À… ttP8M.‚8¨›Aÿ~õ t$J%­MRÒ>Œ“Ø[”øX\/®ýׯÿuûë?o¿¾~ýŸÛwû÷ë×v¯ ÖýçÖüùeü@è»ý÷­ÒÅíû—Ÿ·Ÿ/¿½üVÿÿϗ¯ÿ^ÿëÿnâöoõÿþvûÓÖÿl_j^øñRñªþûïíߦâõ¿Øðwóü÷—ÿøÃíMýpv2Óß¿&™lf±2òÏ—~•¼ýóÏïÿxùµ[ÿ®A¸f%+o\IuãF‰Ûÿþ÷Ë_𕑦*ÆS7u›O·{™6]ÝN·TuÿÃDCôË•P ]ÓaÀÞ` , x벸Ç+jÔøš€F²XtºŽ@#ùm<?€0pic‚BÏt/kà™~¬¤4vìS¢xaÿ‹Å».íà¿éXÄ™¬7Xq½ã»QœW¥ªØ2£í(¦°[Q…ÜJ§s¾o^ˆh}·ó .Kîí;.6I^&À&YÉxØ4taÇ•0Ñúnç ›`ßq±©ä26•ÚnŠ2*ü¶ ½‡ßrQÿ7:µó ’ŸpçáöUˆæŒÒB‡‡ß×Qïáû–ªŠÖw;ïÐ ±ûêé<*£ªH vD!{rã6æ­÷ð}—*^ßí¼Cƒ¤G¨Yç{´t<‘î °–ø0¿½üúEßêY}ûK=±v¼î¯o *þÒ¨ü²¸}ûóí_ãþxûö·^Ý+Sêªh_k[˜†-¦mÑwmX) öÖÂ?¶-‚ߥ’Õ¤åµëMÜU!¹÷ö#D×bî…š¶xzûˆ¾a¯p=pÜZ$„Cs]Ëço^Ô|Ã>LjÑYidƒh·ÃouךÝ*ÖüUqÞökÅ»4ƒ‘Ð>ùþRê;çFh͇·ªq/ý¯nŒú}û[4ŸÝܯùl ^ã΄ßú™v½L×ñýå÷—˜À„Ï`·Q ŸSI-áËE*Q™c7HUí™{UÓMeEÛ"û=m·F-L ±Hªîùl‡U°7‹Š¦dqs©ítâ™I ;©ÞümËÐX·fŠ1‹ÆµX?h,HUóŒ1T\.HÅ y›'.´oUã^ú_bB u¯ Rq6ƒÍ¤yÖÏ”ämŒ# ¤ª'y~á¼ã»ò.…žH Ì«=¨ü¹m)úÎF- ÎMïCnzô/ËñƒÇÑ_ò)úK±„þµŠì fýd†þÍ[Õ¸—þŸ¢¿dKè/Œ;Fýd†þb@xÛËt£¿¬ú þÔ¡Ÿ«kNË=³*(Ѱò3¡7L2:?³ö¡ƒy·gnx¥ØµCle†õ±A¢œ<ˆg®kšR)È• ½æò†#i›v­õ½p`_-¥p7#Vz´ª²n—ÊÞC||¸Óa‰/kÈ\A¡¬k-`S÷YxÔS P<ecQGŠÛÜ®P’\í;HÍÞ-P‡‚~ƒ{ƒ˜V{ñßç3Eå¢X£¨ªƒX /» é ¯Œ´c°Û½GFâ3nÚÔºM"1÷šM Û‚x(G’HÌtE:Ý>÷‰g &‹$ØÿCæ5Es¼Ìî! ÓÖuR¦ö±XÌϰ¬¢¤›ÏD!A‘¡6K9¤áÍqRQrÿ=¨ƒwÓ;ÞAHÕ[Ô)§5úq*"á÷¶-VÁáqdd礈É}fI›³| 1u-ã F7ÊÀ»5úˆ¤%*íÐÊ{ø/>uS8þAu'RäX*›æ";ÎŽ.ŸtÂF·ð›Ci‡¢ aOÂóûµý(Gâk×4¸Î€BIÞÍZÇCZ‡e{¤™¾ µxBä0«Ï‰Ã†-sÊ2öEZº•wËhG›‰{3èa¬ÔÝåÛ–'.S¢–¾`ãžxÆahn}ÉÈù8ž¹}‚+5°78·ÞaºÐ …FþógCé ,|)u^®å× zTð€+,¿'h¶{‚J—˜›‡ÍÁ³¾f DP½ãΫ+|•dšÚQ×”²ë1\Jx:W 'N—¯±|½>sqºÐbI~¡EÀoÇZH—Æ©`K]šÒT'6s¥îÓz0ÍRʬ‚y5o·.¨Ï Ȼƛ¸0Ï@ÝK- µØtÌ¥¹IØçFŽEº]ë±è¸Ô¡ƒçfaÿXÀu_5ÌS1 Ëã’øª¦—t@Ä1fžŸcú²+™Þ9Þ9ÆØ}eöÓeR¤žå¨¿ÃÈŒ-ýÛÕ,jqæC:ź#4+º¢­Dé²…”æTî`J⨇,Öê±ïŠÊ Ø¬(ñ;¤JØñ4 UéEÉ;D@±Ç-¸Ý^#p„,ÅëH±ž¥PV*áŠà¬¬€4\&–••¨cº†¤ìPƒ(ÑßçóªNöø$‚Øò0sJtyPë8)‘ÒÛ:•‚Ç á«XÏ- ë¬6EW!yÄ"»Q®t@”ŸÐöà}Ï ÂæìÉ?^SñbZ„„ᮨŽáYo L=é+9f#Æ8­YönñaɦIaØ’’T F$ÿõ×\UΞg³:°Í å@*¶Ò†Í”#AP½˜”>ˆÕŠKë‘ T|²™±5Jõ² v$ÛPÚ¸©˜"©Ð®L¢¤0ægbó`¼&›_çóþØ–ˆè[î˜ÕPR\Â^P{¼•(¬Ûc‡ôjµl¸:³òµ_ÓrÁ]RÅÄE°ý>éýÓW7<…1îÄ­—Cr(¦ãRrõÂ^àH1E¨F•XC?©H*Ý‹zü©!º}¿÷صŽ`¡ˆ!ýÈf­ˆÅ GãW™oY؈ó Eä/%Iáà•N`fÔ|9g@&q¼èâ··‹+Ê5‰‹wÀE)RÄS@~spÅTÁ*—H ;C 4{ ASŠGG¯þ!*åÀ´"©}Ûq“t‡hÐr’A–Ñߨ3_†ìmöÒµÓà–º#‰­­gôÉá©Y«#!ŸÓ£ß&¨±ãf…+.I·ÖÅ­ª6”zO JM«íëÂe¶®D¨É’¨Á$h餬H>xô:¼RñÓ{=NSM"fÍ=fKÕŽŽ…‘ë=ž6þ„®úþ¾P8Ü=ßÅ@!xØQ …R‡„IïA3FÃfö“X×ùëEÃ‪}| gÁÖ-œ¤²Á'6¥“Ôõo wG¶w®M9ÿ'HRYN®¿˜È-øbû À„¥r’E›ÃhR}àÝIØñ5qkËÆNK¥¨¨xKÝT#Ò”v\×8¦ÝÔ˜j…G·Æ(1Ðáe+Âào¬íp)ðã‹ó¤aë_žÆò×òŠ13àfÐ=ÙÄEøž*—Êå"øH8mÏï“MÓ—8Û{`ôÝñù5n-îÍ÷?^L=§Ñƒ¿¿|´ÇÍ@Ó=¶^ý3+Rëuàרù ¢X¸Æ‘Êí‚Ú~ò¡ø•IÅ )‡üT×rÈ'>©ß{] ³J]õãs¢ÏY=—Æn®oò¹“ *;Ž•ÇÛ™ƒšZ)$c3Vk‚:{VÑâ²Qi´Céù" 4m´ñž¦zjØÂa}n‰ÍÝgöf^Û yšÈÇ]1y‡Å'zt(‡3ÂSü‘o8A}ºöóf{ûçHdqRüÃAJˆ$I d0¦dƒ{òð«b„é&ªÈ‘ë”_µ¶A„œk;¸fxÏÅnûⲜ8éUI‹rßÏ\]à°šõåpexàšõ”Šñvœj.(põw[>Ã\WŒÇÕì)s:žüÁjÖ#”Lº8AØJuÊÆØÅøL¬TÕP‡ŠÃž ÃŠ˜ñH< ÛŽkn:>oê½æ×ˆÒ%/’ñ<~¿6Î<.³` ­ÜeŠ)È¢8×6ÈRÆÝè:ç)éÒóÁ¤¤Þ¼AžÚq$Þ øþ4]ž ØF6ç” …­Q>Rùøw¤£b˜·ØæÂg;Ôʘe„‹â->hQô=ºzЄ¤°"¹.BªºW …Juyóª; {‚ý½I×P´€g€a±7XLŸä·Ñ7o¢ÿ}TÞ  •ÉY\7‡ðÅJ Vy<ëÁ³ÆÚ¸·ÃÅpn9CK1²RAc‡§&…Û*¸`¸IÈ)$AyD7ž5äHØL…kïx`6z“ à^w$…Nq},‘á¬1&z >XÎÁY“pc<¥…²)ÒÇŽ$á êÑó¥àL銫Ìú>æ–Ü’[VZ0wÀÌ#?Öàû¤Á$ ¿ÅZ°ç›‚ð Öqpo°…¢ÑRä»G~` ƒâ†"Ø0‡þ‡5»aí‡âØH¤{x΄5ÆxÏ7ZÀº'‰îQk‰wKb¼„3Àv|áqìe»Tn Þ’{ÞP´ ÃÏÕ.ö!!÷~«Ž“ꜥ0Þa8ŽÂßà}<œÒsËóµdîýž¸·‡‹]6DOEbYPÀÞ-ÊýdØ •0*V™Xá¨Ø,§hÐ!­çpîýl-YeiôÄÒh•à#Dä]ðíæñ$X'´}ž¼˜IÖ=Hº^©À™L‡Kä÷Ó’u¬{¼/©w¼î!Já‰açæÁ· ™Y8¶Rb]£Æ4º‡L]GÍàœì]Í-goɺÇ{Ò=<\ Ï:¡wÕë'­À‘ñÇ aD8z²îáÞã¹åHÍÜ’ùzæëëœB„=`«$µV­“Y+q¸ÃøÄà)ÀH)ß–[rK–,Y²¬ã‹yl’¸ÞΗ„²@ë+ÈLa+ÓÎQrËU[²,Ȳ`åÄ@¨íµZ½*…”Œ¥®Òà©‘@¨+šÏ¹å-YJ¼')ááb”Úƒé΂‰Ô•0¬<Õwr%Ürò–Ìñ3ÇÏÅp½BOrìå øY®YWW%”¡*uEŒ°Ø§(1‹¹%·dšeèid¨J—ƒ,X™º"†gÝÐB‰½)žÈ¬|ËNnÉ?süÄßsé4áâºÕC)¡“Wª \g˜[rËÉ[²”xOR‚§Ë¾œ%Ïè‡<ÚSÙÞÿã©6·¼§–Ì£ß!Þ5k|S£Hw—à"u5©‚ á.OŒ,᦬ܒ[2ÇÏ‹‘n!†z«'F6a$lýFb)­õž|‰ïš[NÞ’¥Ä{’˜‹y¤DÂxW^¤Î‰.pŒRÎoÎ-—mÉ|ý=ñõ¸X¾Ž˜ºb-S¯µõéÒÔ]ɪ˜.º›¦¾kÃÚ™¾µ¼¢o,»_øÆjW ëŒ0ò^¨RW“g¿)á8p¥JÂq ,òsv/+ÞLÁE=^Ü™‘Ó¹á]èPœ‹¾iË.`ˆÂý±®”}ÅDZ„©·n²ÕŒö Çñ,¢Œå @Á-¸7{O:çýGŸcDǰžm $¦=Ü=^:þŽÉÂ)a†äfU¸·ÎSÜ¥Ð|+{à ü„ðAbF¿é¥¤tYn±s‹)‰´+Šì)‚ˈ[à.]T€ááÿ.>©„þtQäØ[<çxòòÄ¥b݈0·ã5îÜòžZ°Õ×sNÀyWk÷gì;A2†<ÿ°g? kJ%XX]{³WóâÒpb=dv¸Äc‚g:sâÜrÝ–gãÄ+ÜêÝó81¥Ž^Ê I’ ¹¾ÎE¸ãÛY=ÑC™«æ–“·<ÿç)á•âÞ(ë³Æ½y¼²˜c™C‘¸7B–êªO#%Ä`"pbÏžàj 8o—âUJ4Îñ\(·œ»åé¤Äñ^fß)°_˜°§ž›ã÷ê…­Ö;¿Š;ñ}ã²êžH¾qì#8°wlK$¬Oz$=žÏ î`w]ßžÇiNðÛzÜš_6¯Ë³ Ч5¬Ó|‡[x»»Ö^9ÚIèù“l?ì=;¹Û<»²e);Èw6÷Åa=Û ²yhf;cŒ%¹õñ”(H#8%¢p+„v¤:ÁÐ݃”°!,àd=àÆ3ØŽi$AX \Ï¡kx–¾ƒ_S¨›Âžq EŽâ%)QVž¨˜DÌ‹xBùa;·9sÐ%Æo¼-;HŽ kü4%ƒÀ¤)‘¼žŒƒàâKXÎdå g{…•VBÌ®½Èi×ù`>¯ÊÂ9²äóA˜ó…¨)õ;–AaØ'"§ÇdÌ)¨Þ›*Þ2ÎÖ5Ó_«™9fUÑ+ ßDG¼˜’³ª\Ü8\³á%»¸ø\_Ý~<²é°¬€””–°g„Àìé<*œc‘¢Pª4Ü!•(YÙ1å€t*-°Ùv`ŸÐÄŒAIRÄȺÃ\wiu/¦ÝT]³"éçpɽG¯ÄgX‡õB¡« ¨=ÓÕõ­ »ZPÈ:!£Ôšöa”’K¼m©¥ÃÒòn 3&·ôAߨk¸¹Ý~ä ³¥Þ^QËJ6×u,Æ©»kñÌ­ÛÄš Oàœ„@ýãuX¿ôßH}¸B;NüC 2} alŽ¢œžÎ\J€dÈÁâó'‚ù‰Ô†AHvØóÊyRŒ‹sñ‡(¶ÜÛvÓ0É×V;:^kyzÿï,6…ཟá>[!¹#Ö0Ä(Qa= ”“À©cÔR¤—Ö·7ÚbœK†£œÓF`GDùŠ)±ËµP ã8æ€"R)˜$´å0àaÂ=l\!î-DdØCñ¥•QÒee÷E÷غ¼ã¡å¸¤<ë ¡Žá hýKpRý=Ès)µÆæŒ[1»Ä -AåÚ¼µC(¬¤öÖàM©u瑚ufù©bƃx•Ö ßäWp”¢ÖŒ?1ußÒYQªd)5rÎÖn?ë5x—øÛÚ ` ÝÐ53`¼>·!qÛÚP–¶¤Ãîja­Ý!JÜE{šŸÛPÊy‹üd¿™Y¶‡$ÿ #×T¥¹}±+­ËµE¹¸”K¦{»¯V˜ÎÂ28î ~cšïZúˆÇP®ùw=ã~æX\c=¢î £€êáÝ=ß!KòK°Ã;‘ïÆ…Â)aô´rGŽÓwÞÈ9$¦å–®ñÎÛo/ÿ/-J endstream endobj 2597 0 obj 7038 endobj 2601 0 obj [94 /XYZ 32.2500000 587.750000 0] endobj 2602 0 obj [94 /XYZ 32.2500000 130.250000 0] endobj 2603 0 obj [94 /XYZ 32.2500000 347.750000 0] endobj 2604 0 obj [94 /XYZ 38.2500000 96.5000000 0] endobj 2605 0 obj [94 /XYZ 31.5000000 588.500000 0] endobj 2606 0 obj [94 /XYZ 31.5000000 349.250000 0] endobj 2607 0 obj [94 /XYZ 31.5000000 131 0] endobj 2608 0 obj [94 /XYZ 38.2500000 96.5000000 0] endobj 2600 0 obj << /Type /Page /Parent 2 0 R /Contents 2609 0 R /Resources 2611 0 R /Annots 2612 0 R /MediaBox [0 0 595 842] >> endobj 2611 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 2612 0 obj [ ] endobj 2609 0 obj << /Length 2610 0 R /Filter /FlateDecode >> stream xœí][ã¶~÷¯ðs€xÅ‹$ ( ìµ@ ,²@Š>›¦AÐÝæ¡¿²%ÙcJ%~sHÉ3Ê¢Ó"ÈÃs¿¼ùÓÿ8þë÷ã›÷?üçøµÿùþ‡CqªË¢ûïxþ÷ýÓ´;õ¿kW¿þzøvüvø|øÜþÿ·C÷ÀïÿÒþö¿£>þ¹ýß/Ç¿ý½ýðÇþKç/üz¨UÝþü÷ågS«ö·âúóüùχ¿~wüí<ã°\Ìýßß7J×ö ÅÌÊßÃ[ªË¿ß¿þvxÓ½Ô"ÊéÒº£²ÆUcõñ¿ÿ<üÔÎ?Ì^œ«T]ÙºxÆ:µ¾,dÚºi'Rj´ÎåŸÌìòsW6Ýܸ¥·D™J…'<×Úýî”cüyöþÜf—ŸÛ9•lî ÜÒ[2œ+žüäªþ?ø;·tK$œQEÕÒ åŽ) …Q•éŽÅ4øÁÜf—?tSVɪƒ[zKz„ Lž¡j[f@(WôÇRÖòçr<Á™»àdsŸáÞ‘àÜ‚‡ÚœQ'Õ¡^'—ßx[$D˜ ܉Î-w¨¶(m²C½MžàP•J&¦tp§9T<·à¡ªJ§;Ôëä 6^·Œ)œáNt¨pî¤ÌÜíK‡Ÿ#¦ÀÐ}táoß}9¼ù¤lÑUuüòS»'—%»_Ú“(Û?Z-©Ý®/?ÿÐæ·<~ùåМ*]v#EƒFÔ;8âàH G*b GÞ£SÂg>#p²ˆ‡Zw°}üÒâOò³oUÀ¹³—=­&a|ÁëìgOŸ}U\ÏžðìHHU3¥G:4KïÞ½´-º—nùB°ê²¤»A×½«;¹¦¸xƒ®@#E‡§ödMgþ½=ÓM¯ÌÉh§Ú‡n#Í6 O-àô…E³áu ·|—à@ ÃgzluKÞëãe¤ ZrÌâ½èïñÔÈhC!ôñôx/F /?ôÀð÷D7Ä]Á/ €NK ­=b±¾—”B–Þ[G`HàØá%ÑÝôJJ[¹ú)Áè6Õ K0?@1âA¼Vff¶”ÑŒ‚ØÀáA8E†^Ž.BúŒß8p2˜öeÂ'êœ0ÔxÏá¾iGÙѱ`Þû!“œV+Oœœ+ð a¼JË÷RDÛ^’žBšHT¹¨ø"=JôÓ,¾èÐë™Q³ákI‘ Œ6Y¢µAæ"*Gã ̆µ âX°t¡@öô:J峃þ^WåRQ.@$4<üƹ®ý˜Aïè 3ueî7âå˜á:%\dz©hDæCü¦>ÓcRÔlTþúSȃ}.‘ãbu÷D`bÆ> a3øÖÎÁ–å„Ï/”¾à[‡ï=4Æ0çh ÜH“ð½/ð „ûfðlæMóÜ]ÌßLÙ!Žá·ëgËóvf+h§¯ˆ"`¨³ÞºÒ=ãÖ=¨‹²Qƒøo &&«K¬ØÒ•¨€zµaW@àM±Á™10îYFïÞŒõ- ¼cØsÆ0“Ë*¶žvËfLü ãÉ‘pÆ?5ó,‰Tcò_Ãucõ9$ñøëõosr®8VÕùG­Tÿiy¬Êk²`ÿÉ×CeOJ5]*Qÿ-s7‹yºFûýþou~ìè?]ŒÖ¸<ãAÒ~ËÝÍâî×øùðî»t ßõ¼ÏÎ3|-&€ `šÆ&½ÏwxÿêºäÈ Dï…—%.¾•‘ˆ-Ù"%dØ8,FH1~ã¶$]5Ʀ¿—ºö×düPÂ("á¡bâ „Å߈/ ,q-ëÎ9YÏ(öÇDjâ…‰MÁ 1^­ô|­Tõ4™ˆCŒÑLôÌrnÕ›ÿ'0Ú~èGªZyú¯ï½Ä_µ%ä/Omž'ˆ:Ou“‚¨ ¢nBuWAÔÝ ¢ÎDݤ êF‚¨›DÝUuw‚¨Ë+ˆ:_㬎ØZ…GpúÂÛÔ·T™Æ{ë\¯ioc‰7ƨÁÐÌœd׉¬#bÂD#b t9›dä5Ù$ʦÊX–D%SÆvPk°Š’%ð¾¬<¢€©ozªh:/Äh¤¸²)ôWnÿžàÊí§W¾|âqåî[ænótž+·OpåöÓb´Æˆ+wßrw³¸û5rpåv¹á$Ê9óÐTŒQz>Z4œùøèÍXõ– 9nwcŸ,y„¯QVoæö"-%}g„ë8º¹ »c¤^b6,P°Ei , ËŠðà‰q®4V˜0Î’9æy¶!JeÔä¼yýiu«Gn .¼´•ì¦ôu…ž²Ÿ µŒoÍ$¾ç´ˆTŸoI4éh™2¨«©§)ΰŠ)S¾gÄŒˆ‚˜0é‘d/µ!ãkÈXjè¦zÖ4fq©˜vŠGðlî[ R/܋ˀ³á÷ $å„aSoáløä >Vw'Jü€-_Š¯Ñªœ½Ì ¤Ügºø}Œ‡^°¿ÆfÆì@ +¦¤ÄÎLû2…ìæº©Tyæ6á2 Ì@¨²Ipß„K"ä¼µ¥™ß_\| ã?ÞEL°,3W°J c7L¹L `,¦˜ŸáxrÞÀÀ)÷Yc)c".ú…Kn­Ž;®·e iÄÜ$ è`}µ¸ˆyã¬Ú Ò >!FÃØ€©¡}bŠÀÐÿ½|5rÖúô…áM¶­Ë?F-8{<ÂH,xçE±btµ%q+ÐUs‹ZYýÖ¬¯¡ SB¢dà ^%$ìp¹4hÊREÈ 8ejó|¢ªçoÆ Ó“1ãÿê˜d±Æ™“﹫¿'#ß;wVÚŒ>ñzøcSÞùÞÎ÷ØÝYÔ…°+n÷[mgáy=\4@ˆ(ŒI9¼µ×êÉ99|5–žkêש6¿#åµÛñCFƈr*þS2|ròûx·‚Ü?gœMiÜŽÿÏÂÿ@ÓìgÅKQï s›p£õßç%ÝÍ™d°²ÉÝîJùÂ1ÓLæ\'¦^ Ž:&j!6%¢Ã)“c›b¬[®I«‚n?F:iõéÚÛÄûÂe3Öï÷ÀÐ*ÜfF´j;Û#tV^•º@ÖW;ÿ*EôØfŠz1å>:ŸÊ¹Ä‰jYJ·HUê Ê€Òƒð«c¨qÉ_Yé…Ȧ.æò$íñ} š¶bEÕ½bZ%æÎ¢5Þ¨u"îx˜XŒ†”“²m|ÅÔ®a -3UÆdkŽ3y¤Ëq‘©>@^DׯÀ@ðZ.VQåû\Å…I,–í·|#©ê.LWȈ¼vÑ2õ¸õIYÃg`?\û-P.EÉ‘ÕD£ô–ÄJyIckêúë÷vÜ^ÁºÀ±¬eÊuÇ(ìŠhnËÖjܨ•lÑó´õÀ¶j 5±¥GÒ^G¤ðJû$~ÍbÝZyÐàB6ÔMÉTà; „1¶ÑJßXß ö€a“Dt¼ÍX¨d[Å +Ú£‚MDíÃ\3dKÜ3ˆãOÎu¶¢fj êå~k¦–(u‚¢a°Ÿo–0¥´)–>ÛÌ%}ï~a?K®ö–+âVY¿üô0ý˜V¢¦EYmXÆ®C°Ï@ ã3–í 4Ç>3˜íÌU§ÛI.åÚ~-%feLš…ä1ö6ÙNµÂóƒ"/+'¶™™Ú£'¯;^ÓÖÛ‘þ`²¾ö€ Š20 \uöV]KÍdŠoÍRíÞMcÉ^¬ÕO-†ùKÄVQÍYñ挬¼£ÈUÑv<”퉉Pò]¤1Kà®d Ž›:&ü‘¦˜8>P-e§ £=&¶é„FÌm¸!€$ñJ?ϼ’+³ l†¼)"QeT7mFþÁ}C#è¥,êd$mÕÓ”"‰<hêË#ìL88†×Ë6Ж°Ýlµ!≪0n1SÄÒd@c`ĦkwâÓõãíbDùÀ–½/U®ê”/@D-d :"ÁåL,îÈ*„¡'ųGÍ]è Ö.w-q }îf0¤_À#”ŠH¨L+·GSêÔø¬–#j`ƒ˜ D $N²ÈÖ±¼6CUáŽå|ö ïñRÕ#\Ö6<XG£gzd™ê(þ:°ÃÞéV£7RÕÇ#~ë=l·Nï¿aG/ê¡5û“ù?»ÒÀgpGyܵ}nôD¿¾VÛË¥1⤩¾n”¥BcjŸ ¬óQ”sËš‡ kf óS4ᎊñ ú«FÂeb‰¹Fønd•QÆ|áªÙã<_l=53ʲö8àÞÒz♜-­Ýµák œþV„ V }–hDcØ` Pg ” Åû†Ûò‰–Í-páRb„) /ÜÄ —(Æ%@e[0(™u˜æDTªóêxh?ˆG l²È¸Ä1SJS \Ș€-[[çšûK6¡ãæÊYñDdÊgLíñ)fÁxÜD]bØÇÐ׊Ýj1³P1߯ù—•— Ò£kÎÕ]¯Â>‘´áTR×öKʤdcÕåF*6¶jDœ3cû!äV3TB9 Y,öÎ~*¯# ïÜÙõêí{¦ŒêıÿL°G2U( ëÚ8~ù¬_ó¨tÂ›äšÆç^¯8ý)â ¯_"QTî[;/-ŸVªðõëNnUªòï}¶ŒÎFíŒ7@jd«NàôÌî2§ >´4’ÁX~Qå²Á¢‰&»ÅLÈö@?c[%ǩˌ2Ô·æ‹R ˜Ð&‘æYCzÒœÎ[+Y€¢"¢%©eÃÑbB½˜ ”ˆÍTÛj½úã¢.›˜$YLúµH+a¼p8h~A©óõDë¾±Œ@UªÎ¹l˜è4¯ES[Ÿ‹m`çÊö‹-—c[!ª:2rà€¹rfS_;­?dÀ¢…a£½¹'. šé#pß0l8,ÑའXÔПÁ;ºF>h`äƒÞâMgï\r[´-nÅ.¾'[*‹iBÄØlC¶0N®ºõ»¦|»ºLì©D8lžøÄ. äÉ}d¯¼MM\LQ{Ðöxµ–ßi­–Ef[¸zþÔ·âÕÝs–2ävì9KŽî¢9y>¹r–渚PöÏ IÅw;½ª¡¬¾×ã,ìE$õ±Š9Dø q©è#ªîLŒàžÖË Œ£Dãn^l=‹ÍŸîÖûdzÞ[Õ”÷±«"¯]ÏÄVlÆ"õ–Už]± Üzlo×xßdÕŠWsKäÄ}÷Ïìì)§¢$‡msëkåG­&;ÏM|‚L³@ëô,x*J*¹^¤TãíÕò:•(‹ˆÝ IR‘RLµhãB,sÅš5’­=H±;7ò¼«JK^0wžNYÀÊ´ÿ&îü3² Rš«\é30 7` Í 3˜)!D¸qïeÚól¸cE¤ˆðÏ=)&y$F„8­øNÚŠ^[¦K"šõš§aÊXx3RD0Ëd³Ì–j)šm¼'ã[ðîí íså^­_CŽÑŸÆ{΋ʲË9ÎÞA¯oýèÅV&&//íHiÜ3jñ¦R®ÉÕbo™0‚.檟±B\¸ÓÖ4?ßÉ7y÷,k”í*Õ= ?ƒ»Zõ$æÖêi5¾²°×“î6uªž vtê1`ê=p·)ÜSŠè6…{Ji8²~ç°À3xß*8îÅÕ­£¢­S³1Ä îäêìeM5ÄüQµ&s Š{;ÙŽ©ŽÙ ï^®öôùyeLÐ>®gâªPÆºØ °©žÉ¥àY7EßÝNí5ž ž‚l J&݈ñ¡ ›2E sâ|*hæaºÇSJ S¡e¹EVR6UÍd^uax¶Þ ›§ÿwp¤îwN˜$ñL‚>sU™}¼—&ê“Ð'´Î ×¶šM3)›LÍö=3ȵï!¤×¨w§@°i8Øk !€³ 2jÌ:=¡VÕp¹n#øàlߨêñP÷!Ð- ±XüL_ ÀÿjB*bºªDOÈH¶í/;…·ñ=¬àlð¶ ‘~c ÜPÕkPæÂy–ÁoA6=©=ðÌzÒ¼4»¦F5NÅòSsc{‘ [>IQuL&n@¤Ä‡lXnD¤kDˆãúÑ)²¡i­ñê[åó.Æe³üæŽ=Œ™¬8rŽ‘µŽdëû#ªîÌ ¢¾P*$0“özD䉺ó”÷’ˆ¤§ŒV+S¸×TRÈÜhzûïø­%ÞAÚþyî ˆ¿›ÔS[EºPgâqqÕ>Õ(¦®é¬ñ+vÔXo¤QT㑾8€žpàªj<±Ž™Ц`ûÔ¿)J2Ç—Áú·§lLyõŒpŽqrâ5ž >Óc«Šzõ']OY„;ÿÞB<@ŽÉ-¶CÐx0 dBv ‚q sõ‘ppEO >N÷ü㬠wê 4wçj äýõ¤oŽì?þ^bq8 endstream endobj 2610 0 obj 5139 endobj 2614 0 obj [95 /XYZ 38.2500000 701 0] endobj 2615 0 obj [95 /XYZ 32.2500000 502.250000 0] endobj 2616 0 obj [95 /XYZ 32.2500000 194.750000 0] endobj 2617 0 obj [95 /XYZ 31.5000000 503.750000 0] endobj 2618 0 obj [95 /XYZ 31.5000000 195.500000 0] endobj 2619 0 obj [95 /XYZ 31.5000000 153.500000 0] endobj 2620 0 obj [95 /XYZ 38.2500000 701 0] endobj 2621 0 obj [95 /XYZ 32.2500000 152 0] endobj 2622 0 obj << /Type /Annot /Subtype /Link /Rect [43.5000000 476 71.2500000 482.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps >> endobj 2613 0 obj << /Type /Page /Parent 2 0 R /Contents 2623 0 R /Resources 2625 0 R /Annots 2626 0 R /MediaBox [0 0 595 842] >> endobj 2625 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 2626 0 obj [ 2622 0 R ] endobj 2623 0 obj << /Length 2624 0 R /Filter /FlateDecode >> stream xœí][ã¶~÷¯ðsxy vvg ô¡ÀbèCЇ"iZIÐiú÷+[’ÇCù£ÄãCZšQ¶ÍlÌ1yHžûþüõûý¾ÿðéëö?ô??}݉CcE÷Ïþøç»Ë”?ôß7Þîøu÷¼Þ}Ù}iÿý¼ë¾ðõÓ_Û¿ýo¯öiÿÿóþû¿·þØÿÒñ~Ý5²iþrúÙþMœ?ÿ÷îoØÿvœqX®æõ”2'(&V~Þ »”§?¿ÿðÛîC·ÿ¬E¤7&´?Œ6{ŒÚÿ÷Ÿ»ŸÚù‡ÙÅ!)gqÃ::/¤Žÿj&^çô‡gvþ¹+7÷ nî#‘ÚÉôäŒ÷ÚUð^_fçŸ;¸rsŸà.u¯xr¾{µBÚr÷z1;ÿÜíÿŠÍ}‚»Ð½&&?x×ÿÿN[Ú×UM»®‘~_RXmew-ã¿—óäîÜ(WlîÜÌ'2 œ›ñRM㻳 ¶ÀÁ“8xÛcþÜÌ'2\*œ›ñR2å(õˆ †ÇÆ) à11ŠËNa”zÀ’9{Ã7O7Á‡ñÄ(—Àu|¨xzŠì#Ä:uEPlÆ„9\1r6|ÛøNGhY8Þ…&0H’€2˜8ûÁ ¯ƒ¹;Aàf›/H41Ò.Gàe0høØ(B‘à£# °ÆÞ$#£±hɦÂù½ ×U¸“xkôàQì­[)¶Ó(c¸¯4ý”³W‰¬ïô›¾ö¿Ó¿T×ÈWêKïskztOh¥ÎÊPЯ¯Ïö€¾Ócøµý@zïbÞˆ†§#l Ž$ÎZAàlò1ƒÏ~ciÃöy¶‚$«EÓ,>]ŒaÞ/Ä£ž»J70µ9¸×©Ëî ¥Š˜)† Þ¼d;Ý OSÓœÝÚr3f-ýUK{ñ±„ą̈ú¡Bz ¶çðlZN x¬CÁ›Pd±‚™±p%½SâHJ\5“õÇùê…±‡ïÏFñMU2—H–â»°ÕýûzŠM y ‹ñ—ݸmŒhãÅ]ÊÖÄköæ@¹ªe<öfâ¸ö€brͰú ý¿Á ®ðW²:IëdÈy‚š4Û|Hk>CL¨TX…£DY(^PVß-F¼ÓqÀ‡¢ÔmŠ`E° €}ÜöB@¼U?!=}ß¼6}Á,¶1[äi‘'J“"«(j¢ôëfäéâ5‚ç§ C I|•„ƒ4L‹Þ¤òÊŠ LcÁIu [8­”5E/‘–z4ñÈ2ÒJ½1“ð$ ÅIÀøDp $åNpâ0N†IÖëMöNßp¤‘U–$ù1Ôîæ/ºâÝ{Uûî))è¶0=2—À»Çtopb8\Çbçßg¹Π¿´ø¬q‰ .?QCº¬ÞLlÜ%슋ž$çùÝ#ú”lkÞœDR0RƂج~TR`}U+Êëˆö7ÕºŽjnD‡ÝHNÔ»ç(˜Nðñ M:áJJÅi¼ý(0¥xWhtŠÃ™!FI‡¡Hà eˆ’>Ç+8)E\Fb4,5oô|ŸòiŽ `BѽZ'Ò¾j%„­2ô– „$ Þ”Á»㽉en¥pE\òZ¤ŽrQïŽÚ[:ËVœ–<Çû—ŒWi¡¼‹XY’.È>¥ ñ¢ ŒÃ\›Ir¤;›Ÿ_Y1ßÀ ã__î–o°Ü8µ®™„gË7X|¾-k¥ß#éî1uoîÒed"X)le¬Ø2¶L„ÓNß^&‚•ê–ܼZ<ö æ(Xinɦ«˜£`¥S쫦s¬’ƒ ·ÝENüRî›p¾ÜÝÍÄSŸMp¶Ö ËK¡{yçRñš¤x.' H…,qÕ»#øæG½k$Â(QÛõÐòÆãîN8…CÆœ-ÔŽ:ö/®ì0Ͻ} 5}ÐF_s~^énÈܨY€ß è;C;4÷òÉ` 1û Í?´A3‡QS'<ÛúÎÐíÊ> î`Pã“T×y„gÀØì:2ª^׿ÀFƒ ò£rnßUÏ;•DEüyvqR—Gñú}î“Yg(³m-ÏmO`è(÷‚Ôô‡Ðþ ±ŽcÝùÈñùqzñ²µ¡Ž_?ò1{ùÁ/»¯Åž¸±^~9ú c*‘oCI¸ ¨9¬¥r¶NÉÉ]¬ò•H;ÆçÇj('º¤Pjß9”æ^Äô´Â²†òñ}Ýמp‰cÇ7å 8›‚nDÍöŽ5ÒÏfxØERÈyß:¨d,ônx;h³ø LJ§Œ$`{ ÀF±h‰ ‰J_- Ve´›ÉxÅ€`ØbîOòûàÙF;&peJž#³x[]ýƒ4±ðÙÈ/K?㕘v±îÍ«a¿Õd~ ¿¤”pò©Q*^ÞM B7ižœn‘Z±CœƒŸÈÎgñä—í,ÊŒTSJRÑg ÝœžÐ¹™àºôšògjd¥~ßývHؘ3BjÏ–>åÐÕ ö*KsPñÖfb¶Í$äÑIWmÒ–æ‚… ®´åíŠà¬õRIq ª‚÷önÚñn):ÕRt¶þ¹yru ýs­öÓm€xkTHyýxœ1-àˆ„#8¯VJœsBÆ;…U¸æ‡’Õ"„ú oÛÀuð‰œNÉh_0Ô ‡)5;p§ Ó›Î6ÍŒ*p­®;R¸RS̨ ¯ƒqŒr,OðJ×Tf.+\ùG€`ãÄÜø†ñ`²–¬hÑ„ûÄXÿúâóÜr“íYsT¤ŠX°qø“Âê@ªg°'Þr_B9©€‚’ˆÀj [¯u:5 g­ ·PC-æëĹÃÖÝÓÀ&™ªrqΞ+}6Û÷i\÷·"7ÛW,ÞöuÍPÿ²Ù¾IÛBàOËOÙÎR¹ŠÈæØäQN½#Ï@sMnž±bÏ@ãoi"´ÙÎoËvž z~ñè†î"UÐÚ‡ó›w›¥øŽ$ðým®ÍR‹·ÃK™ÿf)®5J o®š•´qâ%¨_ØÂRËJ ç–,‰N„”dL\ð@iá¶YIiᄼ%bt+icU bUÅû’9á£8W_2<ì¦Õ{g/û’iô»‰¾d½“É»FÁÙp·.Gð>HѶ>k‰Mìç3\§ÃƒæüüþeS³×œÔgw„…’®ì“.”ŽcXÈgÔ¬çÔ=òõyß˨\[ç3Ôëj¡ÆÒÁ¢J“+%#BWØsSÜ]«M Miòde.Ìm¨)ý"(õøÜ0¹ú'HìŽ%‹&41ÊñËSZ;Ïï™Hé #kÕSžoÆ pðq±V`'wPJXq<úî÷³•£2—£bµ©H×”uDK(+Þë)+AÄÐTxÄXŒ¤Õò¥w©ÎC lgx;i/Õê•·fïžô-ëèXé‹ñ#%™"†1íaLÉx‹P—Bj-H—å|ˆVM_æ|•\,ì©IؼM¨6;`Év@‚ÃÂK˜¬O›e¥—huÇn»«ð™xµÆ¥,Úõ‚Óãoh‹^PÞÙîE˜ Çb¡`éB…êf gð2Œƒ¬ú³ËóBÓHLm Ó¨RCÖjá“Ñc„xƒ˜Â63ïqUó³¯ZÇĘÐÀy F:&EQ-ï&t*6½2ÚbʼnÂÜ3ZBS\ŒÀ P>WM‰è™rÕH³á7!ዊ½F›÷n"ΖðáL.˜{EÉ%[Ì‹™Y§“ÈİásÃP—È6,HdÚ™˜Êà¹'öFÈpÄ9‰8‡C 15Oe8–÷Ì)c`î·x«ù]KìÒNH‡¢Èfž—ƒÊùªÄ­Up½áâ^ îÕ‰:JíÀÇÒŒI7:æLuM̲ˆ`„Ÿ‰ÊK\DB(/©bçbô¯°f‹¸-tA ]|ñ/CƃVØ÷7òex5–òªXYtl6¶É¢yOpfÈ¢·J%KÎ3Êx—œC‰,/´|°Ë³Ëx_ ÌˆLÎ7™sª8OŠŒc§æ:£”<ÐùV+é‘TÊAò¢Ù‚õDV,{'ê“TÁ¼G®·¦ÜyÓ›Âó^žE¦¹3«%󣣤GY‘Š$µyõ œ‘DȈ§± B]GŇ –þõÝÜ_òguu2¸i#î…{Åâ^G¸}(^‡w6JÃx|ÖØç{*%¾›¼%`[0Vá>Y ¨±wà%P£aó"Îàzú˜x\7^ÃÆkÞÚm¿w0a=ësoï:>ía1ÊOÁ‹“:¾9ÞšJ]XNÆ;¥« ¥úp¾c‚â$¾¡Ú‡)í›RÑQËwAiЋ/yܲµsU~GÀÂíÏ|3›­­@ZMâ1×YaÑ5}¼&Æ,BÈ [àX#,n“hCŒ[ S^ HuL2ÉK`Aôm-¾ÙÚêºn= iŠÌºMz¯K濘XÆhì§”²fiºÿpÄ(3òêI=¬Ö'ƒËPã°ì£H+¼ÎÔÃ%íV¡¶¶å.®Î^­RS>Ä^«*#Ј«î˜*•]m”Þ {ˆƒB)‚%Ò”§¢¼sÖHJ©üÝcñ—ïöÏþ¹=ˆä9}™ú…鯺RÚ½ ytgŸJz;¸%Ñ7WöÚ²:¨“Âw9Òñ~7éßÅRW^?‘¯~Fëè©Džk°=õ;yô{ÜÆbÈĬ;-¯=F¢àôÍ/¾² ‰gƒßé…µÌÚzó‚¶T„;þ½…x€‹cœyQ@MYA×¾£!²?"ôÄ·'1ƒÅ³ÍGµÚøøWGàe0hðØ(X(T³uŸ­&3çìñ}A ÅL¬ão§Føƒì@¹$ ÁéhëeÉ”ÙÙý9ô_ endstream endobj 2624 0 obj 4245 endobj 2628 0 obj [96 /XYZ 31.5000000 349.250000 0] endobj 2629 0 obj [96 /XYZ 38.2500000 300.500000 0] endobj 2630 0 obj [96 /XYZ 31.5000000 731 0] endobj 2631 0 obj [96 /XYZ 32.2500000 474.500000 0] endobj 2632 0 obj [96 /XYZ 32.2500000 348.500000 0] endobj 2633 0 obj [96 /XYZ 31.5000000 731 0] endobj 2634 0 obj [96 /XYZ 38.2500000 300.500000 0] endobj 2635 0 obj [96 /XYZ 31.5000000 475.250000 0] endobj 2636 0 obj << /Type /Annot /Subtype /Link /Rect [60 695 183 701.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_nn2 >> endobj 2637 0 obj << /Type /Annot /Subtype /Link /Rect [60 687.500000 117 694.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_nn3 >> endobj 2638 0 obj << /Type /Annot /Subtype /Link /Rect [87 680.750000 111 687.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_nn4 >> endobj 2639 0 obj << /Type /Annot /Subtype /Link /Rect [87 673.250000 109.500000 680 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_carrays >> endobj 2640 0 obj << /Type /Annot /Subtype /Link /Rect [87 666.500000 110.250000 673.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_nn6 >> endobj 2641 0 obj << /Type /Annot /Subtype /Link /Rect [87 659 104.250000 665.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_nn7 >> endobj 2642 0 obj << /Type /Annot /Subtype /Link /Rect [60 652.250000 104.250000 659 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_nn8 >> endobj 2643 0 obj << /Type /Annot /Subtype /Link /Rect [87 644.750000 146.250000 651.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_nn9 >> endobj 2644 0 obj << /Type /Annot /Subtype /Link /Rect [87 638 139.500000 644.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_nn10 >> endobj 2645 0 obj << /Type /Annot /Subtype /Link /Rect [87 630.500000 186.750000 637.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_nn11 >> endobj 2646 0 obj << /Type /Annot /Subtype /Link /Rect [87 623.750000 107.250000 630.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_nn12 >> endobj 2647 0 obj << /Type /Annot /Subtype /Link /Rect [60 616.250000 102 623 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_stl_cpp_library >> endobj 2648 0 obj << /Type /Annot /Subtype /Link /Rect [87 609.500000 112.500000 616.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_std_string >> endobj 2649 0 obj << /Type /Annot /Subtype /Link /Rect [87 602 114.750000 608.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_std_vector >> endobj 2650 0 obj << /Type /Annot /Subtype /Link /Rect [87 595.250000 127.500000 602 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_stl_exceptions >> endobj 2651 0 obj << /Type /Annot /Subtype /Link /Rect [87 587.750000 151.500000 594.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_std_shared_ptr >> endobj 2652 0 obj << /Type /Annot /Subtype /Link /Rect [114 581 160.500000 587.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_shared_ptr_basics >> endobj 2653 0 obj << /Type /Annot /Subtype /Link /Rect [114 573.500000 184.500000 580.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_shared_ptr_inheritance >> endobj 2654 0 obj << /Type /Annot /Subtype /Link /Rect [114 566.750000 208.500000 573.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_shared_ptr_overloading >> endobj 2655 0 obj << /Type /Annot /Subtype /Link /Rect [114 559.250000 181.500000 566 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_shared_ptr_templates >> endobj 2656 0 obj << /Type /Annot /Subtype /Link /Rect [114 552.500000 178.500000 559.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_shared_ptr_directors >> endobj 2657 0 obj << /Type /Annot /Subtype /Link /Rect [87 545 145.500000 551.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_std_auto_ptr >> endobj 2658 0 obj << /Type /Annot /Subtype /Link /Rect [60 538.250000 99 545 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_nn16 >> endobj 2659 0 obj << /Type /Annot /Subtype /Link /Rect [87 530.750000 115.500000 537.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_nn17 >> endobj 2627 0 obj << /Type /Page /Parent 2 0 R /Contents 2660 0 R /Resources 2662 0 R /Annots 2663 0 R /MediaBox [0 0 595 842] >> endobj 2662 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F8 8 0 R /F9 9 0 R /F1499 1499 0 R >> /XObject << >> >> endobj 2663 0 obj [ 2636 0 R 2637 0 R 2638 0 R 2639 0 R 2640 0 R 2641 0 R 2642 0 R 2643 0 R 2644 0 R 2645 0 R 2646 0 R 2647 0 R 2648 0 R 2649 0 R 2650 0 R 2651 0 R 2652 0 R 2653 0 R 2654 0 R 2655 0 R 2656 0 R 2657 0 R 2658 0 R 2659 0 R ] endobj 2660 0 obj << /Length 2661 0 R /Filter /FlateDecode >> stream xœí]ËÎäºqÞÿOÑkî#^$’@àÌ-@3@AÁØÎ‘cdìE^?꥖H}l±º¨Kÿ}öLS¯u¯bÕ/ÿòí¿NÿýÓ/¿ýïé‡ÿûã··êlêªûïtùóÇqƒ´gÿõéÇïo?O?ß¾¾}mÿÿç[÷Á·ÿÖþëÿNòô¯íÿþzúÿlÿä_º¼ðû›¦ýû®;#ÚUÃß—ößÞþý§¿]zì‡ó“™þþ£SR4—YÜùç[¿Jqýó{û¥[Ö Â6ZÉ“ÐJŸ„Óòô÷?¿ý¥í¿ï½:;-„i´©ÇÈa éÚŽ„ŽÆ¹þáé¿ïZ×Åú¾Î›{K„jDºóöCášÊX ÿMÚ^7¬nÁI {š¨uŽOªôÀõV·+^sŸ…–õÌÀ_3º NòFå˜(Ê“>Å„ñü¹îl£ê¶ÿxgÁK-õL×ëï]uÛ;é÷NTÝÌšÓxžM˼¾ãÀLK¢ XØõ~ÌUFóTÕq¬†ÍÂ.NËu 6ía¹~އ8)@³ž»<›ëŽÌÿZùÔÎíðÝðß`‰t iEn¤ &xx·ÍÑ™RÈðáûÛ/_„®ZÄlNßÿÒŠ5×!»¿¾·’zÝþh¥é¦>}ÿÓ韪Jè>}ÿë›;7²îgxïIU£'Òä÷¦à7ÕØþÆÁo`o‰ošü$VŠ{ƒO*Ÿ|†ãØü•â½–xß>Â'¨¿vÏ?!¬'1k ôâõÀ“KÌŸ6^©ÌGbؘ€¼RŒ%x*øâÀ{ 4ö–€¼¸ÏŸá´+ £„q0£ìÁöXùœçŸ¿·’@q.ÞŠdt.Žémá?±¿TxœOù½í™$($ÞQ</üãóÁüÏ÷†± Ž#á)ȱ©®Ôndb a™BÇ(xV}yÉ·/ùvòíKî|É/¹sOrg-åKîÜ xÉIl¢ÈŠ ›ìIÉ9T²WLjªfŠœk¬©#|™yâ)¢=[W]—Ò=)ÎJ+3yÒ­YUgY)!ë"æzë OêþÑ‚x(š{Ç î\ë`ºÓò¬ëé¬=&ÍíüÆK×Ó]bƒñ¹w/M£/¦ýÓïÃïúlmu2Õå/#DçlÌ©qCp–oùñÖØ³NZ+†·Ì¸—þW7Fû¾ÿ­.ŸÂ¯e4†l¿ g"OýL»^¦ëøñöÛÛ‡?LöDD{"–ႈq±«;d0ƒ€ß³9ÓÔS‘ä%|Ò‚>w¨0z¢;Ò ôY ;E“U‰£'Žã;¤<3xž1‡šs‰Þð;[Ÿ•´bé Â¥{’13%<°wÐØÇVŒ¿—Ø%<<[¼@Oïyb=ð%„ËðLxÉžSfÁE?NY®@¤×v>|#<éUžú†‹O» ™º 4¥S V†7 b†ß›û;¬ø÷7-d¸ñ5«¦|Íê9¾f›ç´-_»¼eƽô¿Ô”¯Y9Ç×Ú¿Â1DÌ×Ú¶~¦rÌ׆16åkÖM!"‡DÐ0ÚÈIL4"Ò°=ÑÅ"*7Iœs/ÊiØ<Êæ*|R5㆞²AäúÚ©¤ï`hPWÄZz¬éZ¯q¾·ú–íG•ÇÀá-å&Ýô?¥G®¡A\q/ì Š†¹~Læò–žv£§Ãüµ5PXÔ͇Me¡”wH Ÿîh÷Áõ²7×­q=¼J1nX ¯Rð*å¼JRÛÁëå-}7ýOÀ«¬æàõÚ2¦m‰àu C7z:̦ð* „×Ý0Fì.?]`PLà®lA`µ £m‰`ðò–‡±¾›þgÀ rs0¨l8LÛÁàõ-=íFO‡Ùua°ƒ ¡z€ZO mëb˜GSâFm`´ã†ÅÀX»›jBÉÕæÀÒå-l}7þ§æŒµÆÚ„ÃÔ&Æë[zÚž³)0¯ñÉCI”¢Å%˜𦇰JÖüŒé iÿÛÍh~&ÒÊÌU+›ên׷̸—þ—h~ƘÍϘP»¼´„šß¥­Ÿ©i~·1¶ÔüÌ EÑüb K€˜s$Ml»Ç“ņ^åbw»»Ò¥ª™±u€w¾a1ew& ìÎÎPvéLÖëLcÂ|}ËSî¾›þ§ (»kæ(»‹4@WÇ”ýú–žv£§ÃlIÙí·åc–æ  ´BŽ­÷:1î¾À€ç¼¶ê=~JèqÃR `E3¥V˜9 i¡Ök¡ py«Ãð¡›þg3¥VÔ3ÀŠP§¾´„ {KO»ÑÓa6¥C<Š÷Û‹êÜjèSo0ÂË¢†•P(á¢Ì ¬ç¨ˆÔ¼eï¡nÒ°Uà¡jæð0ÒÄ­×Ä'htyËãYßMÿ³ðPé9ôز±4&±G5Ä44õ¸a1:è ¦ÁÕs1 .Rý\Ç4\ßòà^Obúanè çbœÙKK„zˆi¸u£§ÃlŠuÈ8ÉC1ß`¦ð…úñÜ–»Ï(QG‰ ö¶ÄŠ.' uïÉRÒÐó½ÅÀ5Í©nÿüýÏoVÇ.)»»™ÎèvQœU9æY ÛÀfv¶ËŸ-·ݫ[lŒ7,e”DªèuÕ_Ó›«påNÅVŸP›1Pm„ûb‰¹Q ¸B‘hîů,ò$RÂc(Öe‚=˜t“x¹{U«| GVùd¿¢>W.H*ŒC¾; ñ% ïâðíÄQf¤¤£¤fŒ²U~  ïÊ(¶jLðÅ3‚Ðv7gžõåÈù‹²¥ÂCÆiB—?¬¥ X`¬8c:ƒñ„¢ê²*Û‰M¥(5a)Ë;É0KØ”\1ßÁ„˜‘.ŽÀ>Ÿ$¯6i…”b`Ãô ³™µN5Ý%%ÍK†v—“ÚƒoÖ{Ž«Ð[Sà‚\S´¸²M {çUk(¾(Bn#BRè$oj…+-{ô²TZÈ(b!ÅÓ‚{ˈT›Ã[ƒâ“[×d_ÈöÆ9Û‡ %ø0Þ¨ŒÔu¯OCcàéK2dKÂÀ‹‰EPx£µéyõ¶´©b(à`Ew 5L(L’–2.cóæT¤„íR0·þ oLå+9É#Îï Tßl7AAæÕ¨&`^¥¯^Š×˜rðO"†³”,bÍo—à7¬ñºù÷¶6”aVc¨‘äK1ŸòžKh^ý€WX:”ï‰UÐß3kG^Î’ ËÕÿÂöd/”°tNš:.õ‡&óžv{±1ŽPêÎo&IíP«:NksïÊÏÁÀ›97þ¦¹#=à8š9WÍxªöVÁ…{gPÁÈw­‹#­8Jxgº}Ÿ±S“¢¼xåFŽ«¡¥£¼63(lî®8”žÄ‹Y½U‰õÀx@’õò¦•´Õû‹ß#Êà ôG”ŽvèÏ›¯KŽrý “¼]X/ ÄË’œ)+%8Àu²%l™g¼Ÿ2¤Ì³çµJc0ൡlÈxÚ¹„Œ‡#»qÂÖ³ÜmL2•µ• ƒ¨pX26t-«Ý3ħqÑ5ÞÐ*JT'kàÉi°Ü¯Í›|„Y»`%ÿ$ŸQ†æM)E†{»·)太4Òݮ廽<-X‰hWlP‚tR{xë6÷‘B3ËÖW ÝéÜþž0&Þl5Sw‘R•ÂB)u ‡ÎÒÂò,ñ.Y<0&”[Ú»TáêJ/f/‡ ôMˆYe³§P¨p¢úíþª,’´•âr9ƒÎ–„¥34,G/cœ"Yᓜûßðô)‘Â7ywïÎÝ…·‹žä¤¤ÓÈ€I>½Èv#õ|Q·§¶¯†àÏ\Ä-=õ ã'žÿ7g#²è¿é`Lèsrâ1~æ‰9ÉGws“eô›[gðî[ƒzëcæãÞÄgΕâÞ+íÖã`xÏÜ ðt'gÎΆOà †ÊH87x¦‰SÀãÀÓNìu gO!±ø ËÛ7— ”¹aØI`½+Mk­úè çÎ ¯BÿjWHÛýž[–pþŠ#Ù•ëêéƒÏ2Dï•"MŠå h/t³á[ ¾úâ©oGãcJ:óÄÃÉÌ ¿©à8òÇÀ' ×fÁš-vêý%ª¸k0+É£T©8Ž—„n”œKJ>…î/·a­EâÖ ƒÜŒs“Õvˆî”Ó(ì•ZKòÙRòšüXóá­e@¤ Š…™U‚h âT! $ 9ïí$=*ˆ±vZòÚKM_DX”ÏAЄCn(Ù*˜ svÃg¿óý$|{lÚ o®Ïk¡àmÈ à0™Þà™ÅmöS…eÁ؉…=í[@qzÌœò‡´NÕzÉÞ7[€di\WU8› I ëå½ ¸V¶ æì¶xßÖ­ö³%{ÕÕÿÕJìõ6äØk4™²dÇׄ»ZÕˆêTÐòí*ËŽîóÌQ7H÷°£šíAZ ]ܽك´ÜH“Ù>QÅžC¤X"sÒ“Ò’ìU”ÓÀ<ŠåúÞZå½X4Jhó!3žaL+˜o,Á•ÊGl-&¨Ñ¬¬5·GÙp!fëC7ogu׿U´ˆVÈûÖr'fÔP¼›êmNÃÉT(>É5°¸©lˆÅPÈŠ쉅iŒCp‰“Ï„q(‚¾ Ì›10UÚ\ I@ž Ù‘xn„oü½¬MUÄ® Òè=©4·õä‰$W5Vƒ(\,‚Q\È…½ßÕÊ"¬¬Côј„n(¾õöïÛ<™¢•º±\è?fzô§×æ·­×›@rívGȳ–œt/LyN~ºmùÐæZ‹åd†¥p8åÆÔ=ëÈçü¸sH÷ˆìÅ{矷瑄£Ò¹8i o/'ÚqPíRÍfd4ÆvåO"%Ü|ŠÞ³½ç‹”‘JŸ”H± ö%œÒS^¯` ½—}Äñ–×ÖId˜{”ã|]ðÄœJHINE9É•n•2—6%Ì€TÔÏšµäɸA8¹ÄUh,ªPö®ÔWÌÉ3ý@{qb¥ð›5¼Š©€-«B*ÞMhNÑÆj»„O°‹ßU¶¥y—ëÕöaÕƒ«#õnéÝ‹áE“D¹ÜËKô†©UdÙÃ(UCJH[ˆÅfJV5Ò¥>BJJÌ|ªn.ð—íȶcÓü³ ‡¸n3rà—!û½qÓõTÿýii›Ù;ö[°¼|¤/GXÁ¬4OF-±‘ó@Ôò±°øµ×r4ìÀM¾JµÓ¢Ã:d’Ïq9ä ªbß‘kjÕ§ÐTtX³_çÄ©P"KðÁPP“ Y¥Ì98uÛ‰×i»¹"ÿ$D1ÿjÑc&…Þ¼LìÓ#hÕ”ßSñ9s44a h£ÐˆŽ¯#ã@ÚÄ8uy±F;E²ëb€[^#‰R‚)1ðZ1<˜†Kç-„(:L¨Pò@jÓ<>ÄêÉ\M¤xAþ;„üµ"°z´"3ªù.«âC ~Uz<¸0þ¬Þˆõ f˜ÃJy0ŸäÈJ'û#ˆ/$2óJ=½d`ÞRì¬ûÇREšâ»HÈZ_)-äZ5 ¶®£²Î%ÀoÀ©b6]àë¸7ü !Æz—o;õ$Ù-_9,“û¶VõÈF EÞꑟà7¸^]ÂĶJmÀžÄ~{Ãõ÷Uö6¯hˆ+Þõº’xn°J^¢Ò >¶Ú€wT“æ±ý,±3Ü4[U‚'I†*J´.‚J”°°\Ê}c¶ÎbfˆY8¯Ás‡Áu¬²PÂÞ†u#J½wÞx+Vw.o<&$ùš2*îQbü?¡e¬?Ö d; ­˜8±”&ãM§¿}~Êi€¶òÁÜÞbŠŽB—Yøg†U†U#¥\cöOs,ðIäÉŸ·pàòü ic­LÜ;µX"ö)**Œw¹9—¶”Qü›rëÿP±ùÛ{¬ÞB@ î‰˜µñ ¨Ï2ºó‰ð Ç¡o<$Í|Ó_÷ç:̳ö=ñÌinnü¦#FÍY]1g<θ£Ý¬ÍY˜›ÁZɧ=-áÂ+ë±52XC¢ˆLFråRB.wvqáΪøM1ÑØ`wê–eµò“r#S.ïr”MÌÑ_)¹°ŽÀør¹/Ú¥]Ú´/§t#EGÜ ¹s¦TÕ PÞ0hŠáw%Ÿ)5~aÅ>ËZœ(çöæÉù¸Gø¼žÎ]Çä½n¸-Þ]–Wíð¡”Ï[-¥ü÷Ž•ˆÞˆ;¨T±ÖEüçૉ¨+Q÷Ä3æq-oP³Õ £`ÚD@Ê7qêSŠt|à;Z%¢¼öHaT˜Kúë=ÓÍs]7_á‹<Ê„¨¸—]%ÕÕáªÙüJâR~+MöÚ=ïFÕ°ä‡gy¶q\òŸ)~km'ŠàB%¸¸IM˜5&ø¼;ø!î ®T“Ãsد‚{ƒç£0TQö{\>åÏM/î]Ö þm\#jÏ">‹»ƒ¢¤eä‡e­&¶ÃÌ…¼©v˜+¯âàž+¤ø•p¤4 àû¹†·† _ûzs#¾Å8 Ù7IˆÚðÆ~ít°jýy…Íö2ˆ«ÜÞö:K»N¨xP\LhñXÈ…"&ž›‚û¦tixËœ®§+Èræ’*ìP’$Ñ ß÷¡®Émž½‘Çž¹gRZ…8S‚ZÄzee¸‚ͯ.‚ñæQàßßx˜@³ºŽXÁ-Eº>ŒËSt|È wp îIx‹ß?# w%ù‰”Fü©Kv]*S¢¸f€¥~èJ<ÁÎ)8ƒ-5…V' vjϤPõ»«B:~²uªJ e(º% ›eJ_4.ÎéI½k`¹EâíØÀ’ Øïç†×³gÓËöç“HPJ`D8â!±;k™ŸZ.l¦§ø2?-[àËüô^ÍOcœ9¦ùi¼‚—ùée~zæ§1Яd~R¾”ëLö:ŠÎE9yÞøoB Ÿô‡Ñä¤ A¬7„W/ÁJàËXTȸ–•º‰T<ÞJ$¨¦þPî˜â»«˜Õêï¬Í”´TU°¶=ÂÖ0ja‹– YÞËÛðò6$¹ñS{„P!F¼Ü `«¤Ð"³ø ƒ\oaîðìÓ« š:˜''Á,9qNüyü¶Ú_ðm^ñ-Öúl”üo/íL1¿Â74¼ã¶ž'CÜB¨¿ f‘ÀzÊ5¤Í<¬”ö(˜?·@:ÂåѼÊ+X“Š!Êaû‚‘kq ̳ãà¹á'X÷Á1°·ŸkŸà[øpnÛïÎ{Št·œÌØ-s¿ˆvŽ0^O-¬™ºpGÖÂ’žb /Ð[’Ó œÈšœV–g8§ÝM|ñÓù‚¬Õtß³ôÆF¢¬åêÙ£ÿ~Ót )eÐêØŠ RI%U°>u?ÙAƒö’[}®‚"$ЦdÝØMÆ…ïeSË.‘°ñ}éã@Gpy0ËŽ´f±žrF$s‰²ç„M­b—|Ž|‘Ú{Üo0VD¶/™{Ö4óXR´(GîÆ¿ ^ÄhÈ Áø‚SsPÞèUæÒ¾¬¥6Iå”x#ÁYS¯¯¼FÉs9RÆSê)S’¶$ÐDÚ86&0ø^´QáZ)ηlòŒ`õÝj-+"ÆŽ©¥¤2GÜ}‚ìRnLEIä)wx/~ñVT(,ùÀ€Äœ(Ì &²„Rò›% x:9có;|‰ô¾¦ÂÒ)¢)I XË8©ä¿æVy¹û€BÊ 'ý  |¨‚whÂrïú¹Ú2Xïçom×.|sß |7dUø¾Æ!kZ'¢ µXð¬·fàzÑf„ਸ਼-oÍÔ• lœ>ºýsúÙvžûë½L΂è’s%.Õ*OR÷»( ãéNËÌ wGåY^£¦âslâ'ê“ÿÆWËA’€´èGÝS¹ææöů4*Øé)(VÓtH±{¤‰è ìXY†À½Áo<¥YKeZ§ÜåßÕ­`ÒGÏ/â½Ãì‚þƒ€ê÷»kÉ–²ÆÑÖ£ŽÝÓ‰“À°¡E$ÀóžÚµÀDoxŸHÌ \:Æ=ãÓ­˜€Ä‰]ÂãÀ³Å TðÔñž'Ö¿ñf½`ž9/ÙsÊL"¸Hà/Þj=@¡±~ÑKSÙ³èV:&œ NÇGxÙâž\qúúöÿw% endstream endobj 2661 0 obj 7581 endobj 2665 0 obj [97 /XYZ 38.2500000 197.750000 0] endobj 2666 0 obj [97 /XYZ 38.2500000 197.750000 0] endobj 2664 0 obj << /Type /Page /Parent 2 0 R /Contents 2667 0 R /Resources 2669 0 R /Annots 2670 0 R /MediaBox [0 0 595 842] >> endobj 2669 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F1499 1499 0 R /F8 8 0 R >> /XObject << >> >> endobj 2670 0 obj [ ] endobj 2667 0 obj << /Length 2668 0 R /Filter /FlateDecode >> stream xœí]KÜÆ¾ï¯˜sØìæ ØzÈ!€ 99rœÀˆ(>äïgvÙœÝ%ç+NS]$G´`K^ŠÍîªîªêz|õæŸþ~øço‡7o?ýçð%þþöÓCqlª¢ÿçðøë»—?(Ûcüó¡i«Ã—_¾¾>||øxúïׇþ…Ooÿ|úÓÿåáO§>üõo§þÿÒã_øå¡qÍé÷?ýÞ5îô§âüûãÏÿõð—ß~}qø\œÌëÿÿ® ®mg1óå¯Ã*Ýӯ߾üúð¦_ÒG\Ûú&\ð§ÿt¡<ü÷?ÆF/ާ¿ìš:4Å ßq¾>ÉÕåéKÅäCO¿”†Ï0xUû|ƒ?Í\*e×ȃÛàoÊ*<òù‘ÇUÛ–§?7>þsÛ²jWEšUÓu;Õž‡Ï0xS×ùš¹:U"¿ñàšg¹­"ñË¢Ë@¡óðÈß9ÏòÓÌÕ©y‹WämW—QN¿>ÃàÁùšy&9- žYNwá4XO³ÓHXr>ÃàµË§ôû™«S%ò®y–›ªíéS5t=õÛœ¬}š¹6Q"gÇcLÏ£ÿ ¸|^üáóÛ.œ”†«Ÿ:Míé“ýoŸ)Òþ¯mCÑ>ÿxø}Qø8|þù¡;Öe5L±R¼ƒO~@O\ƒž”ðÎÀÕðIH§„ïï xz=ï?Ÿ¶I~—õ<‹;8Õ’¾ƒŽ™7 Ãüð=1kÌH¼e ºeúJ‹·ð ¤ž[¤ŽÑö«Ã0¡ 23²ØCcb Æ'Ÿ`žu·ÞdPöPr~G8œŒ€tÃSÐ'˜nð C xWanãýF|Ǫbžj=Ì>pš‚]YÃ`Y…çÆŒ¥¥‘ný¼°Iýèð“oFzÌ9Uþx¨D‘¢:¼G=6$:ÃV•.‹5íto@Ød„¢,B,籈ÄëÁ⎡>œÄh»Î#ÂY*1LzB¤ŸXé ÅX,®·„YÃͼêYããÄ\αÒ!œ‰‚ýb`# Д½èªá“=¡œ;V¡n›êÅzBµÇǨæãLŸÉß ýñ Çàû<˜1C.=é%Ÿ{ñ¤A3À£•ý \q¬÷jn¾×Áíó ÒÁC¢àɆ÷†¢½í°hs0O˜ÃNy³ #:v¿ý°aêÆxÃ`^xç>Y|élõ0&›ø;Xc ‰åöxàÑp¤s& œÃÔÁçÃÐÚÿ3‘Íև׌wÕ±èüë¸bOÜêèËÖ•Õtë]â9žÄ­×Ž)w!®ˆ‡ÞÁƱH&¤ £¡ž5$¤îÅaå¾óÖÀ +‹f¼ƒ  Âé‚$\ð1Á!ã±)ëz¼jÝHýätÀA". œâȼçÉFSìÒdñð“àß¡cEø%ù“ð=,Ä0…u™®*K°\ˆ2æ¤@”wùŴغbtúü ›º‰Gœ”‚Yt½nº{>SKWÑí×"¨@¨6Ÿ0¹]“e˜æ5þ™7õñõ³ØqÉxî…k+ãnU­Èó?²«;|Sw|#b1(žÈ^ÚŸìO¶û{¿Â½åBm³*¯ÎÚci‰c 8¢0§DÔÑœ‚9Þæ»¢ÚŸìO6¬ŽVÚÕÑ7¤ŽBuÃXsͦp9g"t8FÈ ,îÎ_AÎÕn.¬[á¨ëâ'k5ûÚHHŸŨm± ›ýÖ²?YÉ]!íˆsÊÄ îS¬ž1À¶)V1æ„p¹`ìeŒ±‹ÕýÉ*ž˜ETÏ#]ÉÝ}CU/3Î ¦âßt(ŠŠ×X›™¨ñî4Å[“ÃA„ú0‹’ås8ÌFæÐXÐÛ]kv bžZ™s{€_4Þqu¹ª\àØç†Ïs¯UE„Õ•U ˜H¼CmÆC´)ø3„ðò÷ŒýÉþd²¿ÐHD>Ã(CdéÚgHW\ø(”àê„ÕÁ2¦„r0üa‡ qG@O2×ÕÄše燂—ç' U-¸ÐÒb‹7s9eðã}¹Ro\A;9YyKˆ.'Á. g?Ù‰xxݲCüâôSÅ  •«øŒÃêm¡8‹™,$×öZ((ŸûpÎJȶ6,ÿñNƒŒ Jˆ1‹àVˆ@ ‰yÅpUó€1Å2ò¿êÜhž 믪oHÁm]D ÂGvbסI%vš žÃ…È˺º›_€æ sZîÅølÎÖ¢'u' åøà3É„ EL*E‚äÆQ$<“ É$b?a«2†*a®ÙUÎÈ×%Õf×µ#µù Iá_˜JÆ.“‰ßÁëb²¬¤ÕõÉUf®ŠòŒPýaIµ=ÊÕR*øVòj)úÄ#Vo³â$èܶ²•bØí¸+›s?pîÀ­Ø9Áë pg“B^$ …`ÐÜzŒXÜùyÑ)ÈTˆ'aÀa‚ùâ< ³ÞdT¯€tÃs –ðžÞƆЦñù†@ùºXµS*¥7ƒ¦®"rTn„\Vßl5˜^f=§øæ KzK¶imÊ2`0¥ò,J-¿>¨$çŸ"5L Ñª°.&ªp}G*¦ëgm¥æB=´Å‰šâì ‘–M…#/`gmá'8°£B¸ÜÇdpª# Cá¨ÎB# 10u„Œ2ÌmX¬m5k›cf-ì7ÌmœÁˆ‘†>]…ß¼žf23uUd ëFÛ*Ö†UÜâNúÿ¬¹ýƒu¼‘in¸Hë#_5c9•(.É&K†$BN‚RMgÔKQhåü„¶ b:Æ%™=h·‰k'Ú{—8 í–]SEÜóÒeÀÔiÍ–7êfÖ¨NYOÑ÷$£/ÖÞRÙ0¸¾™¡pð5ê‘s—q®¥ð2k@Ò¥±Jvªn&Éõ¢BO} ÷âʵ³àèfÚN ‡ÑÁ™ó*ÒvW+î‚J™ãnl}¬†u‹0µnÆLµH̱z;7´Î¹;«÷yiÂáéw¤«ŽEç_ ÏAk;>ÂÝ%ƒGÙ»¥˜K–ðÕÜœ¨Û1Ã}ƒ8´Û0’Üû}1Mx0­I&™ÇXn2eaºÐSª)\g£2niFyÌø÷±+›qX«†dUÍãîb<¶OŒîªAÅØ¿+޽ üb2ðI\@u,'†ó;Õw:ôNÜ,—f]Â'ý;ÍÑOÈŽŸÀÑb@øÒw:‚>»Š÷¢îŒG¹ž#±„f‚Ê”T't„`Á06¯J¥Ø|õ‹—>ÝÔo,áŒ0ÑoÝ>{øzK¨Iá–‰µÑEž±½„3ÏÌš×I€[Â¥¬œj¤]îÄ #"tA㈃9ç±æJ±»3˜”™õ‰ þ0£$ïäºN¸ŒRÄrÞ x‚×1K¨M‰ *Yë¸Ø’(©kM"ÉmÊg#(-&{éÞìMÿZnð 8¢”£*"­J¶Í¶TÆõ*÷N*B„“F`üª¨&AÈÌ)­ÜδîD– ²Ì >HUœY4ÍEÎE="ê&€mé¯dn1±>Ý[˜ O¼ ªâ’•ˆKÊÁq ¨så xÂRìNÞ¡¶*‡á‡`ô`"˜anžtDu–˜Ï§QâjR\3ŠGÃÕ¤¸}*œµcPq)~‡À¶f€[È.Žà¹#^>˜¶~=Í­#^2÷á.F8Fîä·"ysèã¶t¥{½)²ãó1)ô Mg€5IX±UBQÅâñ;u˜•b œµÁùþÞìªԘʞaî+´ó•/Yëƒû_î™p¢h-¸b,%rhÜœ>×ÐVÀä,(cyAI»üªœÕœ¥sd…bQ%e•Œ!l¦'ÔÚ5K©-Yi“©–÷)ÿr Sx£?N<ƒ%ÁÁšºÝøõu}|éŠ'Á/a+¶¾X÷Þ ocÞ|Cv°Í·Çv‰¢(Ï™¼31¨2Wá™úe:ŸÓJÔòËà'º^êzÕ^žó”ÅÀ³¶ó¾”e÷z‡]r'0é5+ô¾šz±‹Áš”… _£­+Þ°8ÃÇŸMù¬¯ÚñÍ|w41 V¹Á7h…‡¦Š5[&Pe!ŒH²ä…¡ªý=ž_³¾¬«ÙÍfeZ™Á@<î\BR¡C q°ñJw³~ýVT¿Ã¨˜wH1»ôøsëë¸+“.=B’!“¨s}†Ëò‰¾“Ê*ÀÀcHeîùQ·‡îñÇæÇò‡/¿äërDÝ—&Äé×áëipñÛçþ“k/ÎÍùcá‹Áex‚±4{Z5̳ž÷å±tíëëA ›ÔÓ'±à®<Ö¨Ïá;ô?WŠwinâJQƒDœòƧ`ÔÓÆóŽïsXÔ]X†Ã£Áw¢¥í’–þ™–Ýp.žÂÛ(+§´Ã¢nüÞ~ wÿó©Áï„67Æw8÷Âd¶ha{Îù#“(Œ†øIaã¥3{<ªópÛŠ‰C,P ò/ÐC®cš ëïD÷m¸bѪ»†æÌL&ûB8¿˜ÔЗÅÈØò…iÁÊ˦h®_éKÁéátÊW¶Åœ]qøøðJ`c endstream endobj 2668 0 obj 5158 endobj 2672 0 obj [98 /XYZ 38.2500000 211.250000 0] endobj 2673 0 obj [98 /XYZ 38.2500000 211.250000 0] endobj 2671 0 obj << /Type /Page /Parent 2 0 R /Contents 2674 0 R /Resources 2676 0 R /Annots 2677 0 R /MediaBox [0 0 595 842] >> endobj 2676 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F1499 1499 0 R /F8 8 0 R /F1699 1699 0 R >> /XObject << >> >> endobj 2677 0 obj [ ] endobj 2674 0 obj << /Length 2675 0 R /Filter /FlateDecode >> stream xœí]KÛȾëWè`eö‹ àg€6CCàÍ&Xdqö¿jHi4M}EòSu“ÒÐÆîŒ‡£fw×»ºêë7üò÷ý?Û¿yÿå?ûoý×÷_vÅ¡ E÷güûÃål}è¿ßWuØûe÷}ÿ}÷y÷¹ýÿ÷]÷/ïÿÜ~÷¿½Ýÿ©ýïçý_ÿÖþðÇþ—Ž¿ðË®2UûõßO_›Ê´ßç¯ÇŸÿk÷—ßí=Žxz]?™—ÿþ¡ &ÔÇYŒ¼ùûî´Jóô÷·o¿îÞtëŸõÓΔ{ão¿÷vÿßì~jÇ?^oLUúª¸á=Æ•Ç7ù²Ä”voÂðEO•†O0xiLºÁŸf®¾+¶©äÁ5i[–.%mŸ‡O0xm|BÆ9Î<mñà‡Ú;ã*ü‘ÎG‡º¶í÷•ëÿܸgeÙïY;R’œ‡O0xÓÔ ™é8sõ]ééW”eSÔU·?¶hôwèyøÛßnTH7øÓÌÕw¥£­0¸&m}áÊíÅð .!mŸfžHn…ÁëéöUJz‡”²\™&!3=‰["zãÁ5e¹iz#ªt=ÁîÛ¢uY’‘öiæÚ›ÒSŽ­HXkš*aŸGOAXÒ€næi;ûóŒ1ð<ºŸ€0þ»ðÁw_wo>µv£Õ€åþëOíÔž^Ù}ùúË®²í?ÚàÝ™ý×÷¿/ Wÿaÿõç]s(m8Ͱ{R¼ƒOôÄTð‰‡Oð >Â'àh%|òŽg€G+ìüÝÁŸÞWêÜü÷Ø·ð3p4aG!M-ä¦>xÖކç&p/æDL9Õ÷ò©`á ¨ÝYœw„yçœ5Ôbxn®›Ûǯ­6¿M#5|4LOz¸¬Nïì¸Å‡²2uÚ©~ž~àÁ—ÇÖXê¦xZæóg*ød0ü{­í “iâÑÕk¤ÅåÔã` Kh¤Ì’•P~\UDÜb>¤~gï:còŒc¡hÜ ±³ .KdÇîþà]wõ¼ÑÅt!†:¿XÐpJ…GO„MÁsºèÚ^˜Žîàlmì…5xÏ]<|'á4ÆÅ¯Â½ðîEÅi½‹ù2… O(X¶H–*•™ÌD f"Y‘Ǧ¢¶‡ÿØ`g«†Ä© ¸Ò€ß©€÷M·zq@ð 7#¯},›Ñ-F-‹;eªu­þÚ‘äqéÏqЉøU&gApî¡{r-ËpVgh˜T4ŒcGË:ó'q„c2¢@Ô‰³d†È Y^{²¢lÊqûË=„ä18±ó¯ 3LÉ‹à}­'‰+çÇIL¸ƒÂ9ÓäA´À`âc'I˜õâù(|®R0îÓÛœLÜ8“-¾ÁÛݽ&=™hdÍëñ Çë&¿×CUÍz VHÙNK¶ÓU ÒköÿqÄ…c>ø&ÜÕ­wdzr†¥3::qÌŒS ̉¿jí£õWli–-ͲÂ4KÝ4/÷5ùq„6í+v´fÛ¿'zÔék¦Åí ù'°§‡³AXæ°”à( "%¬Å°ÞaÒ®)ä4ÊoÌéÄ-W! S8B¡áÑ¢a2'œ' «UÆ$«ªïB­8~ cºjtyÊO6JJ?$ÜåKWS÷ÇäUkgu}‘>ºUâ7Ê{x °¹)ª8œ²o[ê™ £•²|8°=ÙžªØCU,H#qÌ ÷ çÑcan&µZ…QÏS°h„IE×[Nm3Û“¼j•€ïÔ*V‘˜ã±ë¹ÇÌYƒøÚÛn‚ĺkb‚Z8uןêÍãcšà÷À's¶‡8‰GÃ:S&Ϋ‡w—åâ ÐOZ¼,×V˜¢,_þ ´·rË‚ þ ƒf±8Ô=ßUÌA‹ß£Ñ'»Rw—e¼jÝZ¡]x8H&xàAåU©3z×Gß vEl0Bòœ÷-ˆ§ªKCËå@‡…ÞWSDÒ‡Ûöß½ððt^ånú ‚ ÄåqXGad!¢ºtÑb.clšÐ§p˜~¦4Lù†¼U2ãnéÒεYЉ*è U1ÈäJVb ·@Õݯ3ßµ=ÑN¹!K±Uò=X>rÜ€„ú& ˜•7-›"ÜžlOÖb@¨Ã©\‡Õ¯LåW·ÔÈ.Ÿ¬eJ§W]9º8ðf¶K¶7“¼ê'º*ß`ï›SZ G Œ—ŸBdRìg¼+†ø+€¨x´–€×£Ø™‡Å‰Ìe÷ DeÅž«•â~U±5ár-.¸û‡Â˜#ÔÝ–ØÙž<â“lyyUidtÓJÁ4 fïãšNAfŸÉ¸AW)`Ž;‰#Lbl–?*gL²PÞL”êShÀL„Ȩ!ìÝÁ• ñيݬûtr¶Cg::[ß#!?ÂܰdR Â$Ñ|™ŒèTzy±ÝžlO¶'ky¢œ¬c®ŠÀ&ŒqÞé]¿{šÉ´T§{ >µÈÂlœ­^îõ•FA¡åBõN{ávzû”.Fqb X¹wNnL„{1Šbœ¸ýл˜/Wš‰+¨’•¶åF òŒfÈèóŒûÅuÛôð{„rwÜé‰ev; ÍLª8×`r¡{ìÅ);ë&6¬ÿ1§a˜t¦å6ËMöiÕp({À¸b é3]Ùb 0ÖÀŸv³KÛcì#Þ.ÆÓå!1²\]„X' ÜÜF¬k“§{H,î;é8*ÒÀøºxÅXr¬'[×:Á)9!¤tIb9NrÊ›P™¢ñ“ÝAóÌÈ‹܉ÑVrÎôîÎeÈèÚQe˜’¬)bÐ…þaœ‡`ä lÊt±V¬“ë#¼R»··²¿~œ)SgryD¢kO–Oboàv:iMæ~8¸ñe÷ZiÅpnÊ×nŽ©ô”IEcbí8#Z#t†®Ƥò©õÄ Șn@G(8ÌóÃ+8 =}‹àÜé $ÂŒ °î°H`êÏ8uŠï!ÙLVÊá`îz;Y~Yœ±ç3Ž4u“‘æxµBȱð >Uª,ïW«äpCËPUUq þ.á% da¤($¨—v!“Ë:#YMy·)´XÚ¤« U$ùŽ©Š_üúÂå«üGd“â)ô÷ú ÍÒÇqÁ‡xî*Ž›®t<7œ—V=¿špiä™ CX‘•ôÍü†š”}}¢J·*-+n¶wgdy¬ÿqg%n•Æ@ D ÓÏF5§¥BùþØz2‘8„qElŒ+!€ÍÀ>˜øß4Äà€drÛw ßÃ×ãs‚3úÊ3Ùâ|Ÿ~ñš¯žd´Ö¼ž\¥9ÖAŸG ƒ9ºËìmqSw¯®YÐ lÕ±S ;L-Ü9$‡Žd˜CY½|å•ïÅnöýA‹Ó 8„Íu†‡“ÑëëˆÌ–Ï·)a¿Ho«DæÚœ-öë y¾g‰²¹õ³â«5ÛÐ8« ŒEV¾žÀb¸Oè¦Uóh Ÿ-“ò|¾cÛ-Þ0QFÑÆ£ê‚C!nF‘…ÐUP…ÚÙåƼé&æ ö°| ™ÉL¾ˆ#>#ÀUªŠíö$ŸUü$"QËàö2ªxy˜ÿ~2)µç[@,„ØÒ—dA$èV  r)5x›E6TVUu§v\Y£ê¯®á´ æ´…Ý®¥@*¢=¸œUøU¢‡‡jJÚ‰ê áX B=ud‰r]+­sWy¦·åJ1 öÀù˜ÇX Cx‚‹0<‚ • ÑNVØ'>´s.šÿ HW›Ø¥_˜tµH. ß+ jSÌ–ÇÇ(€k¼Ý«Ã1véÉmZ>Œ—­–2¾Ëœñfxl9 8$(i ×êš c]qá0[áÑ0Î(„%ô°\×὆£ ˜¡˜ ˜rp=ƒ_eÚQkg>¥÷†:±¨ÂË-œ•"b7]€”´×­¯ ;¢Û!ÈŒ–«Ó?K‰y ¸{s¢r=ÆáÅNÝeA®nrIËf»ó"E"5åiLUD¦‹ CѦ-(S¼£„~mNj[Ö¿Å=ÂÚï]Emª:Zƒ¼fånôìæÛUá_ò1 ã=ºðÄYw…ø‹À†Q„ßâÞ+ Œ#(ânþ”A$gP¥qL*¬·iâ{ÔJ Eyÿú´¿?ûR†0¬íâw‰Ù¢>ÝÍyôPŽÎíË™Bá_„§vç.´õñ ËÛ»>ž{’+Sî~í¢0In帇8£ÍV6<¨÷oxÆÉÕz}¦þa­%ý’WšˆÝWãA¥ qM“PÅÎkÀzD]¡0Y&'¬ V¨ŒñšC:‚«'KsmHzg"TÕdNuªu^ 'ë`ºpèS[ËÀ7,ÕöxÈEÒŽôØþåÆ)¤ ±3ávärVWpž—xSÉ•×é¦Î…RÈ ;.†½Îôß1áL\ùMÁ–2·ÄžS€¹ Æb&eÉ8} ÈÄQÈ•e<üLoͬ¥_äœY†;~ßÎø¥›â®ìN3@ÀŸÁ,àNûÝý|è\áŒÑ¬÷øº3ìÇ”À¼0` "°çXJlÖ…Ñð?" Ì ^:Ãã½)ô·­˜ba—ð{ mñ¤:Þsa=ð3½oé',£w€¦ì93“_ò‹·žc1:Ö^˜yV_VE}0ÝJ/§ƒÓqW鎺 Ÿ÷ŸwÿkÀ endstream endobj 2675 0 obj 5245 endobj 2679 0 obj [99 /XYZ 38.2500000 294.500000 0] endobj 2680 0 obj [99 /XYZ 38.2500000 294.500000 0] endobj 2678 0 obj << /Type /Page /Parent 2 0 R /Contents 2681 0 R /Resources 2683 0 R /Annots 2684 0 R /MediaBox [0 0 595 842] >> endobj 2683 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1409 1409 0 R /F1499 1499 0 R /F1699 1699 0 R /F8 8 0 R >> /XObject << >> >> endobj 2684 0 obj [ ] endobj 2681 0 obj << /Length 2682 0 R /Filter /FlateDecode >> stream xœí]K㸾ûWè`=âK¢€ ÀLÏL€4¦‚‚Ùl‚Ev‘Îò÷#[’ݦü•Är‘’ÜÞÆ®{ÍEÖûÅâ‡?~û{ñÏߊOßþS|ï?Ÿ¾íÊ}íÊîŸâðóÃÛ/´ß÷¿µwÅ÷_v¯Åëîy÷Üþ÷u×=ðíéÏíoÿ+tñ§öߟ‹¿þ­ýòÇþðË®VuûùïãgS«ö·òôyøþ_»¿ü®øõ0ãðº~1—ÿÿCS)ÝV1ñæ×ݰKuüùíû¯»Ýþ£^¢­/”5¶ýÝêâ¿ÿØýÔÎ?Ì^î«T]Ùº¼á=ÊT‡7™ªýP•.\=zÏñGfv•`r«uºÉ+—ŠnjrnIĺ¤ˆu)[¥D¬KˆX8·$bkU&Dìiö°¯SRÍqå‰ çAl­ïð¾)Ú/ZõgE÷Ì. úãÜF—jînÝÒ i)FÑ“ï½m·Ukg8>à×y¯ÛßkÓÿsÄ|ÝAì°y| ³'˜ÛÙts×- ’×ÄärG¾¼´[½m™Ê–h¥­¬TßÚì+íÊË•~D#¥A#ª’ÚÚ€Ò6ÜÁ„¨;Ž˜½³•?ŒG:,ø¼ÀW6\»ñÆŸàH¡_'‡~Ë•—;°f‚ž¯XÈÝÞüÞ7åq{çg4©áH®à÷Œè ’¤®Ã?e¼OôŒÂ³}9ޏ½Ñ^Í|F©ãˆ2ÃCsV aN<×–…aº(6aõ—ÔÌg|y]ô%}çHÜF ÕkÇx…´ -¤ÆÒ^,c ¯à³56¶C¿iɵ—½%ÔP«—X«?ÅkBUð™)ºöL ߃õ$ž ÃÀ¡ !j ðl î‡ÀÂçøýXh©å‚¨µÛ_S ¯Þ,7Ö]‚P©AÜ&dUÝ|éI¼>£Ÿâ·NèlgÀ‘´| ðlCƒ@ëkƒ,¶‰®FÔ E!Œ1KeŒ@Ñ¡¡¢0PD›Üº±ÍuÆ1628nÆâN ¢À ä ðžk̨ð=éígÛÛìg #$Cpš†ñŒQâHs+æ© ÚÂÊôœÛ4—¸Œ3œ°ôû”A„«Ú›PØZbXŒkûJNGb*ѵ ©ƒë“O„P&ØD¯2ÓÂÎèðµä03I·qö¢°Ÿ e HðÚ?GáÚð{ˆÙp ¿3&¸WmšLž¤uvx%¶P8ºzJ™F…×YÎ ¶ÒpÄúkè±r"ä¹"ñØõÏâ­•&  mªí%½µCû†+H>½Ÿ€ –kœÔœh:Š#Y'Ã7×ü#(YGž“0.‘ÉF|è” ø§ œ™pá÷—‘û'‹™Œ¡Çdĉð‹c(Ž4­žˆð@® xL"~¯Y|"06U=´$”FôŽÙ³:#3B¡ñ’8qþÁÈ( ŠìúäuQÙÁY®+7ÄŠ9Îjª&´¿1<>†@eÔÁ°t v§ ÝÄÊÒø»p_£ÆaÁnŽ%qâB-5|IïÂ)­ÃHŠl‘Áª¢ª±y”¥ 1››²±#jÆ/U£—FXbÉ Ž‡Ð_m'ñ‰í)upìù©ÙR"²ýúR„}ÉI$c;,¢tæ MbàôxDØåâD18Q,WG–tƺF7§®Q¶âŽ<*K^ºïQ‰H)÷¨D¼ÃÀø£1¤n‚qn#Y´vP—!O?jµƒ’µƒN…|õ¨qs»X ;T¥8†Wx“Ibæ)»3.ðËî†ÚA—·ìNûðµ[,»ëkÝšÊî2”M;¹Õ¹v;k*"³tˆ)×öpŒ™ ùpŒ)ǸjnÝ1^cÒGûÂõ(œZ/8[Vs¯¶§®вÀ™ClùAFæ3°l¥w®ŠrpXɹeŒ<’Ã6Vä·Acxh=qÞaÐÝ•d1ûm]…T²=³( }#iWatן6ºï~A¬‚؄ǺãžÉvãž2î½9•Nt[Sz0CÓbcg"‚f½"6Ȉü˦ÛXyÎ~ðÑ‚O!¸ÞMõ7F >4C¤„ÒR–IX2ç¢$x¹º ÓÊWC„W‚Ž#x8ø–èLÇ©hˆ8’«`œXì–êÞeåZ®*LŽ""ê>æGçVh÷dÓ?ð»7¥,±ÁåŽp†«Ï®»HE£õ%7Çy‘8ëT¡÷=v…ûmçŠïâx.O`ø±ÄɱBÿTaÕ`»â°+Žà#ôù5†\ûÁt ŸÑ˜’pÔÃÇ=¦ö“ÃU9aù#œsbÐ ÷W»ãUsBÍ™ÎòáÆ\ƒ<4vŠ:³¤Èâð%Î0Êž•Ì’#˜À–i™m[Ë—5ß%ä{ðÉŒQB·|¯9â¼ó:¨ïtZñýðýƒ’RP’Rz’’–—VÄ 0äôOôqÄÞ,¶èðNqÝöY>Õ’Ý'»X»QÕÉDatŸÄ HV=ÎùæÄA÷ˆhÝâÌвUŒ½Ñú„O\ÆÁ‘=™B hÈm:h!¤Ykãà‡oä¡rÓd¦r¢ìV¶ÐqÅŽÌòÍ‘äNíΠ1ç—¡±<»«[Áá "Ä7§y!d$#E€ ‰`Êæ<#Ê .§\mª X7œk]PvaŠÍ)ÕŒr™1ŒÝ¬‡æ”¦>"² jN•¾™©/ÏîÜp¬a›:sªY^§¾+=lj™OîM³$áTp/î•÷„ÞÕЬ óâzÕAgÜïaÑö¾ÓTnÕ-´|•çÙâS+°>4¦R‹c­8r+ªÕ×Ì9mksǧré‰{k¿fŠÅD¶u¼ìHVMuʪ¾[|£‹K°rÒ‹ÏC%r™¼­m6îØýg¡XWžb‚íÜ'ߪb+õ…j®w-î–éO—ØuµáªÜw7½Aé‹]Ü^‡× õ'p£žé‹w®=ÓÀgžàª;6;ü4æ²ÈEÃg:°W{£:ŒÌx†€AòËCúʨêtŒËÀ{©n8n˜˜_t°ÂÅr‹SÖÇh÷R&/vëÛµ½çÐ"qö6K'î1=ºÌ¹‘Ó‚Õ9E¢á§‡ý¸zo©Þ Ë·8iêÓB¯‘ƒÙ»GÚ‰^;‹ÞŽ›¿…*€RŒƒü¬òZNsxN/ÿV‹8åÜÅÕKDY2£[ƒ0sEtk-ëÎÖ—CùX®p®Ôbô!zp¸…q£ Ñß…Î5²IÌõk°æ\œÁiâà7t‘wB…ã*ÑVs"×¥¯°­ÖªûÈt¿Ú¤CEØ{©È¹K8ì ‰Ê±ˆ.=}ãÏ9íÊ8úÆ|„«çÜm¶ç -qö#¨«¢¢7¸0B‰öv黆Q6?àALÂi îË|†èfŒd ’p\•Ä]ŒPŠ/:=sË&#VæÜI‰Ë >b#”2åhkÙ¨GD«MណÁÔ¼|cÑΪ±–Æ|„wJÀ€Û˜òÑ*X×] ÷FÃæòþñ¡5ćX½GEºâÎÖ°àtÜç<ÛØTÌy—#3ú\süzB£f²odaðÓ!)+$J£C_•!i84ÇqÔ²9„KMeN0ƒkù’»bòÞ-SšPà2Q¢|!á rñ3¸¿7^>ІKKq¹¾ÛŠq[QÆË¸G ?ƒ‹u‰Rf¼| ï‡7ÎMf¢7Œe»ÄY”ˆå¸8gÀ+À7Àá’àL÷•™Zî`ÄEA+¬È+ñíº½¬? s2.”ט8wøä&XŸ@C*™r@ËÅ7Ü¢“–u­B¤à“3XM'·ßM²Œ°’«toK‰‘OêåÆm‚6­¶ói3¢b‡Q=(\9ÁX[L¬‚”åm~: ‹3XÛéžž¹ÎU¾Ä3¸36x°Ùޝiy¸büÕF¬­Í]ªÃ‘BŸdi·£kÙšŽfë+6w§ßô^=–±]PGúKõ¾?²0‚éµÖgô3•Iº¶¶¯ýNG§&z' WþØó’J¸XÕo}´Áž]¯M_˶¡ðlð™>¤¢¶^ŸÉ–Kp‡ßÛ+ê¸1ìp’~“€àÝ}?ÐØçzõ=먲1׎ù_æ…z4 AžSäQ$fÃü‚$±‚pëïÝ{ÛŽLL@ ¿âoÐ@¬c˜ûÏô);c}¤sÌ9+ÑÁ¿Ô°#Gƾ=›Æ•—uiö½®½"8¯„öÖ¦š4(ž‹çÝÿ\‹Â½ endstream endobj 2682 0 obj 4339 endobj 2686 0 obj [100 /XYZ 32.2500000 626 0] endobj 2687 0 obj [100 /XYZ 38.2500000 557 0] endobj 2688 0 obj [100 /XYZ 38.2500000 411.500000 0] endobj 2689 0 obj [100 /XYZ 38.2500000 411.500000 0] endobj 2690 0 obj [100 /XYZ 38.2500000 230.750000 0] endobj 2691 0 obj [100 /XYZ 38.2500000 230.750000 0] endobj 2692 0 obj [100 /XYZ 31.5000000 627.500000 0] endobj 2693 0 obj [100 /XYZ 38.2500000 557 0] endobj 2694 0 obj << /Type /Annot /Subtype /Link /Rect [231 64.2500000 322.500000 71 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_ownership >> endobj 2685 0 obj << /Type /Page /Parent 2 0 R /Contents 2695 0 R /Resources 2697 0 R /Annots 2698 0 R /MediaBox [0 0 595 842] >> endobj 2697 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F1499 1499 0 R /F1699 1699 0 R /F8 8 0 R >> /XObject << >> >> endobj 2698 0 obj [ 2694 0 R ] endobj 2695 0 obj << /Length 2696 0 R /Filter /FlateDecode >> stream xœí]Iܸ¾÷¯¨s€ÔˆII@Àk€6CC0“ƒI'‡üý¨JRu7¥*~ýH-%‰{L‹ËããÛ—~÷õ/§¿ÿ÷ôǯÿ>ýØÿùáëSq®lÑý:]~ÿúå_èúÜÿ|ªj{úñŸOßOߟ¾<}iÿÿûS÷Á×húßIŸ~ßþïçÓŸþÜþåOý?ºüƒ>UªjÿüåúgS©ö§âöçåïÿñôÇ_þu™qX®ßÌëÿþuûMûC»‹™•¿? §T×ßÿýñ_O?tçZD5F·?+SšëϧÿüõéoíüÃìŹ6¥*+mMûsãLUغÖíÏUÙÿ"×®ôeÁ¢.OJ7í=¸f´öõ·ÈìJ~îÒªds_÷- U:žüÜ¥ªË¿§Úe.«˜ªE(åôÉV‡x5»(ðûÉmY¤›üºsi è¦ Î}®]ÿ þÌ­\_–uÖ¶DÕ§ ê!QÝ›¨kÓ½7YØy“'xÌí‹K6÷ußòOLçNËl¡t²‹~ž\þ2láêts_öæ¢ñÜr¯×êªLw©·É¾ÔM²¹¯ûNt©pnÁK-ëþ156àët/ÕT.Â\ö- ‘áRá܉I²Õ=eká&°Ûä .Ãé(ÃußÂ.Î-øz+;È<-vˆCçyvù¹ë:Ýó½î[$õâÉﵩL:ª|›\ô.¥ütÝw"ªìÏý%b¼îo€è{àÃ÷ßž~ø¬LÑÊ-îôíoíÖ®Kv|kbÛÿhŒVæôí§ÓoŠÂV¿=}ûù©9;m‡ö#hGÊø‘cc ¯cwvž­SÂÙ¶yžÝ­ãvvž­cÔuäÓ·V²I.•´²ñ–aµ·uÌÎγ·uÌ!{¬zsÈë^çãÎγâu üªŒ†ÕÃ<1¢0â+üMשãïÄ|€ß0#ŸàIßA½Ð¸Z Éˆc•ÊŒc¤c jWø›ÀÈ{_ˆcx†¸\BLÂÐ)ñrbEó–»§°Â7ðRE©C ´GÓä»Ç²ý¯ö“gU]¿{vжiŠn›õ ÀÝ’ª8»JÕ•}.ù.ÏÖ¸ËÀ‹‘îêësÝ×3ø¨\û87õO;Ü6gSvq¾Ï#ôØ85³NíožXWçrè]Ãoàlý›˜Má½AȾÁçÁ2‚,žã>F\ð€=Áœºõn6¥†¡;f+•ôûa¡?ûÿ”Þ4ž­·E4×+ ¼ |¥x„‚(A"FkŒ¼=‘.Ï-Qú.D“âN$³Ãw½4ÁÇŸ«ÙÂylyîã3WÉ2FþŠ3<îÍ|’‘šÙãƒÞ¯Z@Q«)X¼ÅÂ2Uñ7*0x6Õ.¬XP±. úŒÍ•%†(œMÐ ¨žð<ØI‘ ¢«9ŸS“¨JwÈo‡xž^GWzxõ÷pIâÑc²Ïȉu"d¾CtÈ&:`¨‚@³‘P1/,zÉQ#-f«ïî óE`.ŠT=ùŸBë뫹0…Ù[ààöÌñ.£ÄÜÃJ)œ—#Ö¯u¤=«’s?Ê ³ÐÞ§Êæz*[T¯y×”D ~)Ê^c-”£Î-,ýá½aç!6û‹á™rPÃÐÖz—R`¿ ˆ‹Ïpä}ÌÒñ0ø&°Ã»° cåÖÀø±žq(år’fÃ4¯Ã¸áò¸Î: o^Dò5UÞ©S›ÊsùE°¬Ul¡,±šA謹¼+ #tc ˜ë—=`&dZZ°:ºˆøÉ,LYà7 Ê‰âuبl››QYCÝt0&VÎN¾Ï)zóAÁˆ1VÄ`jå ãBY¡£Q¯yD”Dµímžî'ÐbA¸ÞÆDÓKÂçDy°0dñEìZŒ­e4}DlÊèÒ%¤4ʈ%FÚ ì\ã€æ2°H‰± ƒØ¿Ifáô†¯‹'ô5§da n<Ûýœ‚¿¬A !à‚ÁDKTú_Þ&Þ‹aq ´ñaxŒ®A“dõbÈ0K† Ü/ÔàÍtË øú¤Í¤í¥q¯Už Ïë6ú¼8ÒÃÇ{™ùÅ7Ÿá7 ü¦”ªÆ\ÓÀ]wˆV›ÚL¤ã÷RÂu:Qæq5e¤Å Ý8Ðãᘛ¡!eƒõñѱÕR«€›G7ʃâû!h_à…Þ/GQן8\OÔº|€]ŒA*qOäPW¥O]×ñ•§4}ôÞó©)cÒ;8² ¶±6LS™· _“p·Qe+B°d@!Ñ2Øßï±àg‹ñ5[æZ‡ðfb©™±†RçÁT1yØAoƪ”šcsÛEúd…žj:|Üûë°x"‚˜LRÄ»$d8N7>ÃÁTö½‹‹­8ö¥OŠŠ  î´¡OŒ•áð¼€Åá1x$Á ¥‹ãC1ÔOÉ‚¬ž=‡:)Sý”±¯Íž„-ÅL­hÙ&,'@Ñ0ZbZÇDŒø˜¨<¾š(ÿ fÅRÍâ¼l ž˜l¥¤ª£lÑ‚ŒÞ%ñÆDj¬2¥ôÆé’„Õ"`ÓIRfvVÇNiêt÷–ÞD8’ÍË2 v OŸ£unOÎÏ|\qŸu‘#š|&+\Q$tÄ=l<½.F½ëÈ]WÞ{~‡Viœwêå½ù½^TšÄÜ|±ݳvÌ”üÌù¨ ßÃ0§Æ—·”4СÏê±ç¢ñ’Ãp”.öš¸fP¦òú”+fñâ4ŒØ*ÂЕ­DTÂ%6#¬.™êíS&/Ùä—ˆêE„ë+›¦B€8`sÕTè`ÐÔµ/l-OQEPD ëúŠK襤O€ÏE<‚ëøÞÝË‹‘ôT·~g5/md°-Önö…ýãsÕ)Ká9ÿÐpÖ‹?l¦ ñW°ÔÚ/ƒRœG…1àHV{Ö£Ÿ‰oð: ú¦¸•héTí#pj(ÞR*í( wðŒÁžæÞßêÔyZŸG5p×p¶¾¬Ku.GWÂu t G𮇲.ÐÅ;ʺDÁš?iz‚[»[ûh p&Ì͘ÀW‘ܶ‘lAä"x.ÆÚ'ùÏT Ù‰(»šÂkÒZeõ>*~]­Ž€L£­ö_ÆÁ‚‰•Ȳàô¥x!ü†¯2uxM‚~jeüæ­Îë :AaKEÛ7e0üŸ)Tâ»õc.ŽÁ &êb©°åŒ}a­Qó¥·¢¶`ึF`¶¹M!IÁRâ—9Ç" ¶ïà’ån#r¸k…wM@ß).)uôÀ[ ŠÚoóýJ‡ñI”Œ8|ûGÄlOwp½Ò¼–õ¦`57’g§ÏÞmbÜáã8hß:0ñðq>Q>3ãã°E=,I„ÄcÏ‚p±µ4=Š[ÄÚW\ÜbÛ^½c ¼¥À¡5æ ,åDeÙ 6¡Lɼåq¯Y;íÍ£¡ÏŒ02_@öglYPËÁ6&‹u&¼7¬3Áj O × ´aÄÐ…;`Ö)ñ7xï2¾¦ú-o†zM›´&`Àh‘øî38ý;ÍÆ•öõÊK“\\¯ÈµEŪ3mè÷‘¡°ê LøÛl"ç·½aråe³õe³NERX„k­8åwÉh.Óh­ ®ïÃÔ”¢Èˆh‘ŒÇ eÎÖC*Ãké#eí=èmºövĸŽöÈ“´¶Hãkeéë™4¥ÏBqL©lQ2Èvq=ŽÇ‰ÞTà0å®”HàH}Ûûk0“Ñ‚pù\ÑN¹üÌL-,¦–õšK0ô뤠»ž]ü”öÜMíûd³M#=¶¤WªÆÃ×lU¶\3ÔÚXA•-ü ¬ï4”~+Ï]‘­â,X1«÷Ù)7pŒ;Ö) z¿š2ƒÿüÍ{4®ÙÕ{4'vwÐõ¨ŠYÊ\øxžÀl°j>"`ÀÔn @ž§g­¸˜ ƒ1d®ÚZz¯cõ´Ô:»cá£ÖÙ*k1ji@IÃЉˆ‘dŒÎŠ8S”V´k@L¡´,| $g,ÌVÕÕ2Úbœµ¦KÄÖ˜ßÊ™å¶ê[=¼Ÿ|W|ÃÙp¨ Ô05Æ œ:Oè¸Løçjì5Q÷üŒ&2iBxÛ¢@>Í4 n9“hkmgo+p+O¼­yËéʃm‚˜òàuˆÀó5Óˬ˜í†¤ëR̾6£Ü6êMé¢éOÙÒûz¿U¾ïíÊž ß²ƒŽa—߀°Ï¤bˆŠFɶcØ]0ôýêçò‘¦›2íE[Ç›…##=‡”0Í_–Ÿƒµ ãs Ñn©ToJ‚ÆRñ«‹ç‹.Oœ„Ãàïoš`ج%Ò.«8ä–Ò<0P0Þý1®†ÅÃæ³ ØD}Yê<Òes#˜ÙÒ•÷ÆaFÎg±˜¸3 m¤œ£§Ûœ6|«z†³rpã ñÓ·–ׇˆ>òk%«Ë“·lv•ÿðp¹4lYÄVB<‚=jð›—€ßü :5U+]éA—ªTE6Fa“ˆÍˆ0RÈñŽYû­kYå£bq”½_ØžÏBï }ký¶n?’+Œ¿»Å=±ËÇBä*ËèTq[’Ét•ÈLZÞèC颂Üz%-!pÅtmgò «›M§‘u)á cì‘„M8Úò¨‘ºê©Š–¸Úc_1†yBŒQI”\Éäúî#喩䱂ø Y=Ò6ñ…E‘"Ðí`ŠëfŠfðÎ;?Ûñ,cq= P1#.Áϳ«R)}0•óøgàòÖ—ÃLÛ4ˆµ^*ìHö‰ðŽgjð'›%v¸’R‰Š›2}`9†ñ{P‡èCØuDì"¼.ð†—µãf“¨˜½¥½Ê±9PÖdD üK^õ’©W̨û›»¸˜Šk7ÊccºÃ Ö CQ…i¬D† ãehE®(ܾ–˜2g”½,}»G¦ÆìòV®O¥Ý|;a+Öîå_üòô5 L&’Bkç‹¡‹sYÅ—R× ’ñ®Ä€®ø×þ>}o±!ˆ,_æþÁØTOÎ+Ï…ºyœô­ˆ”‚ÓºjâˆwDãÅH§¸ñHŸ)¦ÏTj›º˜hrŽ—LíísRCCúÍó–Š™WáÆìqrjújFJš8†Â³ÁozÜ y}–9}yú?n/´ endstream endobj 2696 0 obj 5423 endobj 2701 0 obj [101 /XYZ 38.2500000 785 0] endobj 2702 0 obj [101 /XYZ 38.2500000 785 0] endobj 2699 0 obj << /Type /Page /Parent 2 0 R /Contents 2703 0 R /Resources 2705 0 R /Annots 2706 0 R /MediaBox [0 0 595 842] >> endobj 2705 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F8 8 0 R /F9 9 0 R /F1409 1409 0 R /F1699 1699 0 R /F2700 2700 0 R /F1499 1499 0 R >> /XObject << >> >> endobj 2706 0 obj [ ] endobj 2703 0 obj << /Length 2704 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯ès€m‹¤$J@ÀžG€6CCàÍ&Xdqö¿Í´Ô3M飚_)©›6vgÆœæ£X/«>~øã—¿ïÿùÛþÃ×ÿì¿õ_¾ìŠƒ­ŠãŸýËßÞÿƒný÷{ÛTûo¿ì¾ï¿ï>ï>wÿÿ¾;~àËß»ïþ·×û?uÿý¼ÿëߺü±ÿ¥—_øeg•í¾þûõkkU÷]qúúòïÿÚýåwû__z†ë'sþómStŸêf13ò÷ݰJõú÷·o¿î>×4ˆjkUê½*MÙ}ß}÷ßì~êúz/m©”­K[\1ŽÕ/iÓì•n;š×õhœ×¿"½+ù¾«ÂDëûuÞÒ$Q¦VþÎEöµæe”úe0Uë}[ /â¬wQâ÷ÛªŠ×ùëÌ¥‰¢[ëíûДF««òe“_6¸jÝ}oMÿçºEu?FÜìSï1ö£-"rÒëÌ#m6ì[PŠmQ›xûÖ{Ú[UÅãšãÌãl,î;²[]´7ûÔ{Œý0EDNzy¤Í†}KJqYGTÏo½Ç }ÑÐgicaß±¥¸V1Uö©÷ûa#úãÌ#m6ì[RŠÛ¢é©ccÐç­{ùλŸâu~œ¹8Uú­uþ9 <‘ã¿€£üwÏ?}Ý}xî¦Ôî¿þÔMìu¼ã—¯¿ìtÝýÐÞëî§÷¿/ õñû¯?ïT7ÁZWÇé͵öµ¥:èúØôö™çðÏ5üL ?ógÝÂõÚRŒzmx×rìÍL[8ë1p¥Åqu¨Zcß·hØâ¡Ûqœ§¯ó\·ñ³POm|Y7¾mú!Íq2íÁº“ÑG6‡Æ%G¡a˃ÔTY 5Xí¬¡Ÿi{8nõûù4°EÖØÇQxœ°ÅÎŒ‘ TÕ:4ìW]Jc«©µ™CUÖÍ9#W¨ÅCžzæ7ºQç̹ ~Æ…¹q7obºA-xž¥Ï‰À!Mø{­8ñõÉ]:^FIHrs1e=?S·{¼P¸ ÔöŒ.ÃùO¶ê0ZÀÞ<<‹wã(Ê ÌtÉ>ˆB0$☘֬vÍ™‡bxâx±˜Ê„Haú3*sšÂ+ÅÚñáä­ºdPr<®¡Ÿ6&XÚóËõ&C? ãâàÞdw0픆ÜgMQ”±x#ÆÀÝc¢$RŒ/†ÇÁÛ‚·ÒCb,{˜¢R)j'°^õH ÞdW«Í*ڈƷ­¬{† 8:Àƒ÷tO°¸Çád´ôí™ÞnE‹@'‰QºÔ1ƒ1VÌa k8ìÜN’°ñÅ|À˜å[·ê1\^Í)Y[uîW3'E|‚øèNÿ*vŸ°›;iÇYjÕÌŠ!s^o3VØÁæ—Qc1Ã~EëÐòVN]ÄaÁ/ct6aÌ=QÒT¶ïB€ÇÌ„t?Ejìœ0Ûà—‰r>&1æ.Ù°¶GŽbXš=*T ºÛå“”‰ðݯUG#aÕÀIøvëlÁweðÞ«?/Ý¢õº:è†Oá>[žÂÇ)j1pÏ]&ìÍ37¸RLkï%!ØÇ|JÈËíü|<ÜW…·àÞÊ‚&ÌËÿ=wÒ˜c1÷a{&öÎZC(¦kB2ðþ` IÍ󤵇w0­á ¨<¬!W1»àÑ6®1Ý/\¡k°ÔbÛ$›±‚u æ<7l3ˆ½/¡`°dà•BíÍôæ™±R¬!=š˜ÐBØÂ~šÇJàÞ°½a;…uÖO¢ûƒiõ ÞÓ¼ >ÒˆåÃ] ½õ)3ò1ᨥ=·Taù‚)­[]GñŠã?^nÞåÃaYÇ4Àãöˆ™ã/xz#NÆÌ¬ Žà¹1ÞæDœå‹{Ãv<¥æiªŠ ÏãeQ^á#/#I'*¡Î×PÇj87gPâ@Z§´Ê¥6ל©VnSËR_³º»‰&›Á*<ѲV·Ìó͉¦bÖn&ƒ 2ƒ©+d›¸/Ô}šnrÞZàM9•u@ä²yêG.ϾÆ%nÑú;¬0r}”$þ8çÉdR¤d+€ˆLU&-ˆaÙ*ÜRÆ$Õ_žq+™4u_DÕŠ~v»__¦Ki–R)ñ ¦Zí˜BOá“›‰EL%Êò¬TV%=Ê'#]^æ9]b¼dé÷Œé ²†BŠS©"Q¼|åÞ8ƒ.Ðã­É–ˆ1¥–L¹ž‘±ÇØø±~pf¨ ‘ÑL˜’îuÇתĬŠjca=VŒñðª±NØø€÷Ë5ëØëÝÕ²‚7YlÁžÌ @•-Ôù UÉ38žãŒ¬ ÄÌ`} û7k$"]^>EÔK—)²Â)2[Þ)Y_¦¦‰GxìݶË3”µflÖâ  ²T¦ul¢pÅ$Ý( ã ¸2õ‘ÄÉT¦ŠTÖ§ ŽÞ¸:p&ö&\K&qÎ¥*’ˆkJ¿$:ç »®xÖG–DÀžûYgI¤MÖ!E¡ ¿™‰Z=­ÝÃc˜(æØ°‰lÿÁ¶.N—æ=lyÐjÒ—žZ¾sSPD޽ÕÃ0#Êá+¶) [*,ŠúÌ)pÜòˆZðÜÔìíÎ ~¯‡š5Ü­%{ësâƒÆñHä^%OpoŸc7¥ËÚ?Ñ›§ÏK äxýäê?È2F,­g‘·.çV*¡Bä¶šq¢dó(d‘ææ®E$Ò¸êöröÜ“ƒ‡ëpÖÿsl¦Õ¦tW ø“ Í09X7~žò„‰¤‚œÙ㧆¨Ö‡M2ɦòdÂù‡¤ËÁ®;¶|[6eÈÀÜ S¡–þð€SL’õ 0,áà¶(ï$ jŒÄ†‰ËâØY1€Ós~G\´ij×^á"Iì€âBD\8‚ npŠXq†ã5—»³—‡LeG!iÍ ëK\¶ôõûAy¢ÌUÇr^ÁM!N]"¥@ISý-gÝ¥¬4d›áR@8 ,‘ö;áÒr ‡ËÄñgˆÂn¨Þ îFô¶Q¨¸T¥štKªÒé…ËHeÕP;½ÚšÐÓTÍP!'Å%%ëuÈêÌí‰mì9ëM¹a©ÒLEKad_ ®Qˆ"F*¸ÀÔÌa™ ARß·955”,¦%kå“FJ´‘Õ€YéAõÂÆ@¡ £2b§Ÿ@KÔ ¢-ÆÏÃP˜¢“acmð]*^)#N ž&¦æÜ‚Ãyxœ9‡%‘ ÙÓ˼ƌƜsH˜/²x%¥”Äšs‘=U¿LÎ ‘¬(üÇ g¤ª^Âss—.ü¾eäg¡»h#n”1gRXQ¢ò„®„߮ޡïbÖ&)ë¸ËóEîµFϸF™ÉÒ’-›Ž0åE‹=Æ$›Ë2!Y÷WEKbeó¨ÜÙÙÜ£ØHL4HdJ‰Íã›a/›È* Ú²¥ôÎ>F0•F8\Ë> YŒ} T´üs£  Ljá&ÝJ™÷"eIÌl2“®ƒ…W¶¤%U†dÜ“Üô âj•Þ Þˆ‰æAƒcš[Ûº¬*f¸A‘Œc†0†*:¨xÕª!®ÕXL¿¬ Ö¿bguÕ¹>fZ>`³µ°l]Ö®QÌұ‹)p·[Ó‹×2Ê&º ã÷Kž;ûˆD-&Ù(_¯Ð*ŽÞYHÛ‹ÐTQ®ÅÁh/wÈ­KÆKŸ$!, †ò@æ@DL*Ђ3À ¡“äÈ«m×- °ª•KaœIÔ8Ï'²áÄ<±(d9­›‹¥£hõePSÙǃˆ…Mžƒ EˆCŸ°7ñœ…r†1ÓºAá*£3Òµz–%(ð2¼‰x«0Üî Î ÃÎy6~ÎC›ÒëñÍLS¸{…™³nÞâ1Èp .V ØfQ"O63ÊÚ#eÐùñ¸EX2‹å¯zŠÄ <+ÅÜ‹u䲉-ÍGTÏÎåjÍîÕ¯Ç#dª§ƒŒÐésY„ÎÅwûFP=mqz:£zÞ ªç»=ß(ªçûdTÏUß™l*§d£¨žïÅa“L²©‹µÈø]X pU –|”˜ïeå©å0*ÀU¾žªe0jc€uÝ\lû’•Ž|!¹R—¿ùÅØt•ø¬ó˜.{ëz?ÉÞ3ƒZ7`7= ŠUdXH)3ÃB:Ø=Ø¢­þ¿XHHŒ…ÄH'â±ð؇fcÐk`'²„3(1*”’#A”ØãÅÔ4¨0ŠÞ…U@VZ¥†GÇÖYi•9ÁÿfÈÊ5H~Ö¥Ò]Óª¦=gñ)WtÍõóΠ1­.tè-k1íŸNÓêZ NTù\„Æ[ \Bb•øU837œ†k©q EKì 3ã`¨OÑõhxP^¤†U­ p(Е™µ‡¯E©ƒ{Ã|-» ï‚,ÝDÇÁ²€ßEPã…åò(µRhZ„õe,kKð[²ú ·T)Oðº¹ÆKÉkb"T‚ÈÝq—7¾ Ãw"K]µ‡Ñ€Ø19D¸¨Qî4ä†O _'"JØ-ýzE®W\ÕeŒruÂÝ\2å·Ç¼ûÃ_LÅDÝ­\æ12kÉÊ {÷’PÂU‹fS¡2Ê~ä,•!ü&.“Ú¸fŸ€÷ ‡œB)ú"rãhÙœBI8W­­¦ÉóñæÆ3?ÑìCŸ‘-DJ„¦ã©!Q^–Ý¡€·T˜ÛçÕæ.'ˆfU§“kNP† Ê1aªÚÙˆÍá vúmþHþHWÖ%ð]£]^,2ühãàGA`½èË»zQe#³½ˆ”ÙŒ^”Ñ‹¼’ ½È´CzÝý yXœ11XÁ?ÁÞ0ëÁÏx°Q 0Š<êÒÍÃütg›XH°7OL›08ÛÂ5*u}>dÆ5Ò·Žkô¶ç[Å5z·‚mâ1Ùe 0 ÖlLô˜ u¯²&"›šÆ:l*[áä ý3šŒ «¯9?…á–Œà”jc6­T–ÏS½eÂ"L™ŠGȈ¢>gOeïÀ½ƒžì™«‘ØêLþô²Ž.Ì"Q®ñÎnK€låqâÛʸËõ؉ÇuI+ÍUÂwëâò3AÎ'Z–±77î¹yL¨ûaJ7nkuÞh‚_9o³3›Ùu8³”·9_Ÿ˜ªòaYßИÆù»ö Ë¢rék¼hÝ1ïÌéLS°þ2“^¥çªÏ­V}bT¦êc9`ºaxHø™m‚ëy(** è(ÆOÁx#Ÿc®¬سR' ¿µ{VGÑShy`O¨-<’O«y ñJ±—[<5†Xº²îñQgyΪ5ç>ƒt†Î-ƒt¦é¬O'•d Y“{4y OX“{f€#¸Ÿðžgω ûåùÒ-)ìi]EØSÌÌšJÜ¢01(f2܆dųƒ)=ܺ ëW |gÍUàß²"N-‚Ï–¬¦?ãÊ^ R ®qŸf ˆ£Ê€ ¦òõG\Ù y‘œÀH‚Ý%›cÊÅVcÊw€$XWïÛÌ÷ÉxawÈ/0¹Ì%h‚™¹cµàs]ÎüxÏ<[ìñÐW«,ö(ýª5È! årlõå Z¨Kü™Dˆðëo%,,ošÄ‘ªöš½[q‰ÉTÅb˜ÊœuÜcæGÛÖå [\JSzDŸx1›Âe®DJ¥´ 'S”2»£í_ŸF^ÁqEB|°¶ò¸ 'Pæ½à•9ä3ÉŠ OÌ8á‰!(Ûžö|3¤VV®-ÜRÁ× OjTä䊗¦°"À5?L å7ð^ ìA9†‰^vêçËM»HtFƒsuÈìÞs¸X<š#US™zs) 1ÏoªPŽÑZµ³ qèÃ3É!É :˜{ ¼-Káñ ÛŒÅÔýúžßˆÿÔÁÿ³CAÇï`šæWd^Puãn×]¼: JXܬMå’¤Š-4ºtÇÌOä' üZ-?i@òN~x ?<à÷>òÃkxx QCÅÄý<<ú½BF‚ R‡÷Ç4ÀñG†Ø€xŽF˜G5T÷©Þ hÊö|Èüf€ÞtÂæo¼íùVß x·‚üf@~3€ºyMðfÀ›æ7ò›ë‡hÙÑkCiJ}É0«Ò>Ð6aV)MxÔwª8ÔVíO ÐQdµš¾¤çsE¤N¤Ê"”M+Ï' Ù‡ ÚÚe%\fÌ@š[à-.Ï®c‹£*sùagd:±€Ô饵)É&I• …á”P†N„e“Ñ¢b÷Wîy(˃ñUª¬¦n‘ðÜ*24ãÞäSjèÕRÕ—ïÊ tΖ‡Œ·ŽÇñ’ÉFc*ÃðÜ G sqªZôÅ ¥ ä(YÜÆ9¹âèÑþTJ9hy˜üäS¼åÀÛtK¼q³Îï]ç‡ Ül¬TuöÅ=§¥®WÏõa÷lÊ=Daj×â"[…”=€±2±õ€ô!þZ!A|¨qJtn?>”ôå°¶TïÞ Êk~iË7ëüÚÍ5âT;ˆE.›Ÿª=>òkV«~%Ë÷Zä»é¸;›Ël.£‰“g‹?LI½Óg€_¼Á½á—u0÷âl{œÏRa~ƒs[‹‚2§—–Wî€4E5¼ µË7–.BÇ1ºÇ£™™'а RÜš;“Lÿ^¤-º¿ûï¬yEñóÜ/\‚i&‹0”9êå*t¯Ësú`4;E:úÖæOQö77úÐ_žۻã pIÅÄ8f.H:5·ç~¥ã:n\|Ú7ºÆ_å×ãöì„SêpT{b ÷?ÓUÐÒßY–á^¾ïf|®öÌíp̲€†;áaGÈø3Ã2?!÷ldOI4œ¬žC>bB5÷ØÔzø•^Åj¶0‡^MMðÜÔ•5^Ü»çiguñçýçÝÿ´> endobj 2710 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1409 1409 0 R /F8 8 0 R /F2700 2700 0 R /F1699 1699 0 R >> /XObject << >> >> endobj 2711 0 obj [ ] endobj 2708 0 obj << /Length 2709 0 R /Filter /FlateDecode >> stream xœí]K¹¾ëWèÀróÑA{lÈ!€a99Þl‚E¼ˆ³‡üý´¤nÍLK_µúS‘¢$z°žÙ¡ÅG±XU¬ÇÇ·üò÷õ?[¿}úòŸõ·áûÓ—Uµiëjÿg½ýzóò¶Û ?¯Û®^û¾ú±þ±ú¼úÜÿýcµÿÀ—§?÷?ýom×êÿûeý׿õ¿üiøGÛð}Õš¶ÿþïÝ÷Кþ§êð}ûû­þò»õ¯ÛÇá†É¼þÿ7!TÞng13òÕ¸J³ûúíÛ¯«·ûõ/Ä„®êüÚx×ÿúßþ÷«ŸûþÇÞ«Mçq­­}ÿsh|[Õ]gûŸ[7ü!Ç6®ÙŽnLXÓØµé{š¾ûRê>Bç¶6ñ:ßÍ\*6´rç›ài·û|_ KðµÝÓ'Ôtè=õkßÄë|7sm¢ ; ûŽ}ëÐEÜìCï1ö£ 19i;óH› ûÖ<Å]ózAûÐD<Å»™GÚXØwäS*ÓETÇ/ºÐ¹©«xïfI +ä`ƒèc| =w¡s_µñ:ßÍ\*ÃÞâÎ5÷Ö7UoÖpð¬M[à8 üž¢¿ö,»_!Ž5½`زìö€ ¬dvÆÍn6¯˜Œh1µT`ËGÔâ*8N[žà¬ßøå-xœƒ½ùw°7Lk<ƒOD ¤Ž°§x˜Ö:xn¦]N7çS§Ö ÃÖpª5fæ—×-o1˜Œp# f2Ü<¶Â¬![ tK´]áGI?H¬A!,k½YÈJ‚Á'’‘=pnø§’¥Â,²4Yj«ÑšÆ²4gƬ°”…-…1¥]Hª¬í.× S¹sÚ·s¤[ÛÔ¯oÂ-±Fw§j¯»»éVžº€í×jÜx|nÁ07íÞ#+|‡ÂSòËWl;Ônn²x=çSV˜ Þ§aq–õÕ”c¡ ÌhS f–BpƒÇêPŽøšŠçÆh0á3˜nð/\® 3V Öð3ØTÔ3l÷û0å~Á‡¥r"ï¡ ¸ç\©ÿ šª›žT]©*èÈÙ‚É¢zR‰@È$ßBº%’댦¼5Íb¬Ÿ^éÅ…'¸«t†a±È‡[2e;6a> jO-mÉèÿó ‚-C‚„øÄ ªK\æŒà§*ÝKZûÂ=Ë|”°¾€‡Ì½ƒ4 f ¬ A@€B"¥ÑlnÛqÈwP~àC†cÜŒ2ÆÇJJ,Ckì™"°8\Ö Lo¬¡|2Ü Q‡wÁîgð„­´f9¹¹Œ%$ c#é’8ÕJÄLØÍûzÈ‚¬ ¶®Y̺‘GÕü/*ç‰ðî n]Ý\T¢*†ŠVèîé”á©mÁÅJy>ÊegÌ>á@¢8é½$Ð¥Ïå­‡Ò‘g„ëÿ¨¸»já#_¨<>2·:ºqnº]ŸP7 aY0x—n5mßky½êë¿™-csÕ5Q¹ö8¬;Ü´(³”©+uO.“H¨n¢º‰'„vgVzÍÄØÐ´“ƒ/T0°eGXøp©šœ€ÂžéMµiZóJ1ë$»$ÊvSÎhŠ{¤Lèó g˜Z•¼þ%‰?x&Äþ»V*•^ž­&Oà¼rv~›¯n$ƒ¨¹fÝHÝLv$ë”ÌüÒœ¯¿3_jB™ì;4©2uUƒÀAdž«QËÃ=EQØ‚ËztÍ| ‘€^L…˜aÉ›^ó¨à¾«Gzðb¢XXLdzc Š…W3p’!¦(Ü‹ гñ!.KeÞ;ëq˜¢xç˜S‚ùMõ]+ßRQÎÀ©ež!Vëʿ֧1×’hªö_ùK2̆s –æ¿”‘¥©¸±H¿"ýîLúÍ8jêv|f¦¼*º—tAêÊ›¡¼lÜøÈa²WóGÏÁb&‹/3ðs’/ÃÔã°ÂKn¸Š +xlfAu$0 œ~…†ye_ ™7m,®qƒëñð•9æAIü8¯ph˜ ¼s˜«0ïàü‡0B“¾s×4ã3‹Y¿s×Úñ†X²±_ |K™±±5Ž¢3¸V!ÑûLˆL9ÍH7–€ùA%YØmöQ3‘•nƒÊ¸­xvâPiÔÜî©~ùÝTDM´3¿ðƒ÷ʰ6¥’¼FÕˆþ½=He ÁÌÔI†9'ð1"5gNQÉýÔMԒɘIç¡™¨Íò¶©òE$÷M©Wg˜-%®*¼L¤'Õc§”êuPõ^ ïRÇ 1—›À!æ/zGlÇ*öw"“ø~ÞC7]=a…Û4È ²ö)»Àñ-9°ôÀçÈÛåW«%ÂDGc°ÚCÞIAª²FÂJ¬W0²°*Y§Ðθ×C–¨¬ÚºnÐá£eSŒ¬‚‘uá¢`d-#þ½`d=k¤‚‘uÑå. FÖ‹íÊ¥Â#FÖóª¯ï¡`[˜g¡u¼²ˆËØm˜2vªœøìÛyöU•¤ù¼!:‰u~º3L5“E„Sã;ˆª\ß–Ò´{šÜ­@1Õ€w–D)Ø€9(^¤ÓT™l9bÿÞ/³=•6à1 |ÎÍ’ãQåAÃÆÉcÒCìžWN„6¨’çŒÃ»É¬×s†b³@½)gÁÜ”º9‹º)‡Göž•—ŠïœÂÀ¢Š‡9Ü j,@Èp"|·Ç) oÕêEK/0ÔçñC]n ­!ªÏÇ»© ,ÕœQ|“1î¼]ÜIºìÕ‹ÈQêR!”tõàý>îV‚y®‹]­QS•ªØ;)Út¨ Úô‹•æŒ6a«ðþÈq‡ZBbź~üLÎH¬N­*Fk2ZçPìÍ TÿxÕɸ±ÈÅ"F.ÎÜxB(ØÕGmÙÜ vuRìêþBu¯ØÕhÀ;Ä®U;‹±«±2ð™/¶XŒ Unñ¸7bÖ)1‹CÕ)`—Sü8§ØTݧc¬c׊Ð{Kz†Œm/?CÑmÌ`ºÑ«^*̵ץ°Âö#‘ÇÔl¦ 1QÔ‰ŠëÌ`â&ÃT!3ÙdK@Ã1‰ÏO¡ÑÅÝ» «,®„÷þHt–èQÖÑ#Æwˆg€)ŠŸjÁö ž«¢7áW&éf°œoTEÄÛ»G¼U®è×…S\°tÝô“+&ð‡PM…“ØÂ¤Ö©a±“nW´ªÑ^$©š/Ý`¦N¢‹Iªœû{:º–xŒœdH½ÖÅ–¾ƒSÈVvþŒ1—eÆ„¹õ|еëç5jÚªÀVfÂÖÏé”Ýd\Íœê™%äRA8dòå3ξ§Ü–g¨ÖoæZ2,xôjÛM¤žnÎõî5öÁ©¥ÈCz„zJø•Û!œ¯yˆ;Ž.ÀUW’{>XW°çŽK–Øó³™^§è[àÝžóOž2\î „^®TØü¼R¬1­ÐÛúX!†û¡Ïú.uSÅÁ·ôät2ÚÇ 5 ®4"ŽA é\ê b^=l=QtBŽã·%TÜøú!Ëœ®U=1º ñƒ×›Êsuä(Äu]YÝï…,˹p2>v0ÓKŒnH› ÇÏ¢ða²jAúM±°Q@áåQ²æ‰ú×/ç6x¢å6‹©…Bbœx‰)ŠËxß§d2ßÌo>S[ I"ôFTwß&+1lÁD~*˜ÿ-´àLjHQ¼ ¸r¶BìTKBäàšú‚£!¤Ñã ›n=>NŒdf¤ áq•LbJ1U€°ÛxX?â݆sú»Æ» ÷Ó:—#Øà;.zly*x7–'Có|ßD†Žíòò@ª`Ìyý§zƒhW£SCêÀ–Að,JWNóÖÝT¤xûÎ4V<îŸ{!´ 4EŒÕ:þ ´k ®*T»ØáÇpý„KàÝ×áQ,?)„ŸqñÞS¥Š'KÔ|ܰ#¥ønºÖ3gÌ®Œ×u‰ų[T_7ËÞ/7o™È‘ +R=Ùq¾ÁÜIùêkhj1/Ö½‡ !Q¶Iìû“OQb7““>:.|8¤&ެ!8®ïy%8œT}ÔÔãL‰¿Ê‰ÞŸº2‚€žu|e àëvBøÑCߘ阛 `ˆb>¿Lƒ‚MpÖì 6»S6e.Q!”ýD[l‚{Šö_ë={ˆÜóyîœÁ^ÝI{¸_ke¶wøµ±+\°7ÚkÝÙžÈßsë‰\ñÁoa7ƒá…à2i> qÜ\B橹}VŠ‚Ôør꟧T͘ÍñÖÀ¥¢XýžX†Á½ÁÏ GØ,Zú ÿËpÛŸû3*1XÄî„À àÏtÈüñ¸°„ 8Y‹«8&4øÊßÁõð+½ˆÕÚÊm1u‚çN™¤øÖT½ØsÂzýyõ'Ãç endstream endobj 2709 0 obj 4694 endobj 2713 0 obj [103 /XYZ 38.2500000 268.250000 0] endobj 2714 0 obj [103 /XYZ 32.2500000 535.250000 0] endobj 2715 0 obj [103 /XYZ 38.2500000 268.250000 0] endobj 2716 0 obj [103 /XYZ 31.5000000 536.750000 0] endobj 2712 0 obj << /Type /Page /Parent 2 0 R /Contents 2717 0 R /Resources 2719 0 R /Annots 2720 0 R /MediaBox [0 0 595 842] >> endobj 2719 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 2720 0 obj [ ] endobj 2717 0 obj << /Length 2718 0 R /Filter /FlateDecode >> stream xœí]ϯ䶑¾¿¿¢Ïü,’"%‹<Ï9ØÀ‚v¼‘ ÖÉ!ÿþvK”D–øQ­RQýcÚƒäéQO¬ÒWÅ*’U%~û_?þÏéÿuúöûÿïô³ÿùýoÕ{c«á¿Óåß7aƒnßýõ©iíéç/o¿Ÿ~ûüöùüÿ¿¿ üøýŸÎWÿ>éÓÏÿûíô翜ñtùƒ/ojÎ?ÿÞÿìu¾ª¦Ÿ—ö¿½ý÷Nÿ¸ô8’óÌÄ¿£Î?•¹°±Bú÷·ñ5Uÿï_?ÿãíÛ€mTôùZ»“ªM}R]­OÿüëÛ¯gc÷Õ{W+Õ¸º©öRÆM¤”Ó§Î.õÿ„ºW%zWº*Ø{Ï»8.ºk²¿·µQ¦Ñ¶¾Hú"eÛ¶ú|Ýÿß^Ð]RâS÷Ed¢]Q}ºð^Jâ°sÑñlL3d›MÝÁßt¦dïÞÅqñÒ…‹J·®mɱ;u_kº‚½÷¼—»°ó÷Öùÿà5“t{¡Ûèó€¨ÕùzIÙVªsUÓÖð:¤|ö”ue<±óü¨ÿ½>O„ŒVóÕx?øÓ¿“G/S§_6ÔÅUugšð:fcšÝ9«#vœ51‰r•ê‰r·¤ D,h/Ù( /ýÕ:JáYº»¤¦‚×´`¢†™ÜyÒºh˜ù²dâ®vÊKŸjmyŸçW1ùeCÀgÜSA´z.(µËïòèa|Öqé /$¹U×aï_HC„êÒíz櫎݇(ìÝK*¾ŠTÛÊéL!/!› /IZ_¢ö4^ÓòÛ5œzÖ£á*°n€œ™òïµ3³uìÍ¥÷3a¨ž¤ÅÄK!M'lÄ$ý—¨=MO NÊìꆚ݆8)Ò0³Ü3Ü7ìuR¦%ü˜6M·{7Ñ_ƒ)$?Q뽕8,D Þ;mÅ¥gc!P)KÜã7¤}UÔ®g¾ê˜Ñݾª×£°ÛX`é†ÑWìV,4±„lHXŒ4ö±“Z‡Æ+uZŒ»Íó0¸†«´ËŠÚg†üÃr.k°>—nC ÅÄèÙÐD‹‚KЉ|˜iÐc_µMÏ’Ÿ”I6]¨Ís{=y®za»ÑdWû˜­ÒlYE˜Y6T¡¼ãßKƒÖ3C‰ö~­0d£ ¼W[G)$.T¬ÛD¶» y4Ô. 5õjõlACNâ‡åœ[d™.Dz$Ì„‰¡Ê“~¸4^&ir‘ï+”¡Êc¨ò B ¡J™k«©¶Tƒ7Ì,kb°û†½ÎÍÂ3iò¸Ýû•þ¢L!ù‰ZïÞÄa!Rð~l+.= J럸!mù¢v=óUÇŒîvg½…ÝÆK7Œ~d·êd¡‰%dCÂò`¤±=×:4^©ÓbÜm¬‡Á5\¥M^Ô>3ä–s`ƒõ¹të ¡˜h žc¿Á‰Áˆ¥@èD®LŒ4豯Z‡¦gÉOÊ$»:Ôæ } ™ŒW3çu€h²«ý¬q„ŸÆ¥ 2n÷ž¤¿(VÈÅD´wh…±%äÝÙV”B6faKÙì­¨V†½`(Õ•€Wë•+ì=_ºat.»õé„byÙ~i„ˆ\b·T¬ðDÄ»Íz4þú{œÄ˹ºÁN]z‘0£g“=\“X&„\äK!d¨ Ci B6²•2åM´É´·£-¯fΣXIª«ýޝmÓlµafÙ@"]áï¥A뙡D{GX²QPÞÿ­£Ôаi#Cj¢è_ÐÞs84èC©®<^¨U!/·øŠ†½¤é ¼¼l‚Ò@ñÄŽ/TB§»5j°âáPëZb‡†'ñÃr®.²L"=fÂÄPåI?\/“4¹È–ÊPå1TyP ˆ îWžÀÊvÔNwÑ^¿Y4LltÔ`wÎí|#æçÜ$ŸiüÊpQ ¦ˆüDíâÎäa!RüØV\6•2ÖµÒ!‘ÐòEíz櫎ÝëÎ= º%K7x?²_urÐ Ù€p0ÒØGžkšQ©ÓbÜm¬»ÉJ‡Ý@ÎÌ ù‡Å˜·>çn# ÅÄèÙÐDK‚A¤@è„.KŒ4葯Z‡f`ÉOÈ$Û*ÚdÚ7tÓÕÌy+Iuµß)“fKÕ„™eCéŠ~/ ZÏ %ÚûµÂ‚ò^m¥Š„M) 럨ÝÄÐ7èC©®ÜY¨U!/·øŠ„½Äé ¼¼l‚Ò@ñÄ>.T•îרÁ|‡C­o0±Uô Nâ‡åœ[d™.DT=Ò®Ò±09c”„ÆË$M.ò}¥€2Ty UT•Ž  (Oh–-µÓ¤îŒ6Ì,“ʪ¡a¯sÓ$ævnH“ÇíÞ¯hÁ˜Û&Ûf²ò°)x?¶eS•2ÖÊR+.?‹ÛõÌW3ºÛi^#K7Œ~d·êd¡Ñ$®–#}ì¹Ö¡Q6#ÆÝÆZÙÉJ§«Ðâö™!ÿ°œÓc$-‚ÀPLŒž Mô°(:B[# zì«Ö¡Q6#?)“¬Óa «ÇØÙt5sžY\q°Ý™tììò•†˜™eC¶Š~/ šéD{¿V²QPÞ«­£DK)Kk D"›9ÆÎC©®Ü™IÇÎF¹ÅW$h%¦H×eºÕÁÍŠˆ'öq) @Ùá~Ì7  ÝJÇ,8‰–sn†ÄÎ$Ì„‰¡Ê“~¸4¦Ë‹|_)  UC•‡ª”'°²5µÓ5‰Ñ†‰šìD©ÁvçfiìÌ‚n÷~Å ÆÎ–0…ä'j— yXˆ¼ÛŠK¨”±®©•‰„–/j×3_uÌènwfiì,Xºaô#»U' M,!–#}ì¹Ö¡¡õ†b:Ô[Øz²Òa·33Cþa9f§ØY¡˜=šèaQ0b):aƒ iÐc_µ --”S—Ѓ0bg–ÆÎ,‰}†ìlÿˆ9Z6°•+;C ¹:A´÷k…!å½Ú:J´äp²”±¶ $diìÌN±3 BBrÙX«B"n W4h%¥H×åêÕÁÍŠˆ'öq) @Ùá~Ì7 Y;³SìÌÒœEšÝ„£±37‚‚+´3FIh!6Še¨òª<(P}( <¡Y¦A!GcgÄÎ %ª ¶;7Z¯fAÅU¦ÝûÉzµ%L¤Pm&+ ‘‚÷c[q™ê#JkGDÄÎ9.ÀËz= »¥V©†ÑH–¦-¡¡5iay0ÒØÇžkZh(¦CƒmžÂEÄι)\$`uT€ÄÈ ­¥J5Ï!R…€ÊÏ–„ÁHƒûªuhh1¡œº„„¦º3KëÎ,(¢²‚ugÔYZ@•h a«ug´±îlÁDiÈFAy¯¶Ž­;³’ug”SYZwf§º3 Ê©²±V…D¦"ªðŠ­ ÔA ¦º³%¥"â‰}\ (Pw¶_£óMD´îÌNug––S Z¤ÙMк3;Q…W h%Yw¶„†ÖA6Še¨òª<(Pw& <•]TѺ3Ú0±A ¬¬DÝ™£ugÔQeÚ¿â$ëÎ09Rw6‘- ‘ÂàǶâb»¤@¥Œõ¢¸ ÔYZwfi©•^ÖëQЭ£µT©ïGö«NGëÎfÂÀHcy®uh,­;Ó¡ÞÂÎ¥V îÌÒº3;•ZIX á9q´–*Õ{ƒá@ÝÙ‚°$iÐ#_µ¥ugrêZàtÈMugŽÖ9PDåëΨ;s´€*ч­\º3ÚXw¶`¢4d£ ¼W[G‰Ö9ɺ3Ê©­;sSÝ™åT‚ÙX«B"SUxE‚VbŠt PSÝÙ’Ò@ñÄ>.¨;Û¯Qƒù&"GëÎÜTwæh9• Ešý­;sSUx•ZÉ£$4´î ²Q (C•ÇPå!@º3å Ͳ¥všÄÎhÃÌ2 9‰º3GëΨ£Ê´{¿"Yw¶„‰ÔÍdåa!Rð~l+.SÝ™+Pwæhq•ugŽÖ9Zj%—õzvKk©R £‘¬;[BCëÎÂò`¤±=×:4´îLL‡Ûl'+Ž9Zwæ¦R+ «£$FNh-Uªx‘º³ Pw¶$,FôØW­CCëÎäÔ%´Àé0›êέ;s ˆÊ Ö9PwæhU¢![¹ug´±îlÁDiÈFAy¯¶Ž­;s’ug”S9Zw榺3Ê©²±V…D¦"ªðŠ­Äé ¦º³%¥"â‰}\ (Pw¶_£óMDŽÖ¹©îÌÑr*A‹4» Zwæ¦"ªð*´’3FIhhÝd£P†*¡ÊC€ugÊXYZPåhÝm˜Ø VN¢îÌѺ3ê¨2íÞ¯HÖ-a"ug3YyXˆ¼ÛŠK¨”±¦ÅUÔ9Zwæh©•^ÖëQØ-­¥J5Œ~D²îl ­; ˃‘Æ>ö\ëÐк31ê-ìTjå@Ý™£ugn*µ’°:*@bä„ÖR¥ˆç©; ÀugK‚`¤A}Õ:4´î,£.]­Tãê¦:©ó¿•ß߯‡.Ïõÿ¢ß¿QçŸÊœ~þòÖè“®TÝž»Ðݹ'cNÿüë™Ìç™PÿO¨û»ó/Å:ï9GE§ò½¿·µQæ¢êA_„lÛVŸ¯ãÿÛ š³h+!’±÷"iÎC¤œ2]8—e7ì\r(7Z•ÊS÷Ð×UURo.œ‹£2ÊvÑûç-½`V†–¿ÿÓùêß'}úãù¿þü—sã/g øÁ?½}ûIÕUwRîôÓ¯gæšýŸ.Œw§oΈW¶;ýôËé?ªÊ|úÏÓO¿½uïNÛ‘ÇáŽîЪ…w4¼ó=¼é(Lç;ø ¦ó¾)¼“y#Ù[†ëà(¹ÌŒ–6æ¿c¼)–6äMCÞ0Kc èÀ7U5ä Ù~ãf0:ÖhÄzÀxÓŒ@½Îè›(: m,mÌGG±†`Kn!ø¦™;ƒ†üðÓÙÛ•wTM;ŒfíÎA¬v͈Ö`¬?xÜÁ×cé)ãÎËb¾,æQ6²ótþ2È”Õñ°~¯McS£¾}o»ªç”*Xê™Ýñ*žêMKÒQ¸·A)í»Ñ­Šîx!nã r€¹ö*aÞmíÚÆ^Ç5”æZUð¤ÃÁ þá@¿ Ïë[¯JÐ&rîÜÞú{{pŒºöd-4„šUÍ74ù54‘5^`A:Þ° k8¥cшְ7ˆ(ž¢rèè½ÄÍÀ7µÕŠMq·;8\gôZÜÖkY)h,YÜDéà±Pcg5^xœBe½)t-Âö ¾¶þ²¾ÄˆŽ,lßð{äZX×fÿœ§üjBwãî‚mHãl%Î{­éCAWe•"¾ [« þœ}'ŽÓâì½yKZ½»FEÃÜo­*û^u&¦ƒwÿ†µ…Òã­ùM?2Œ-¤“qpx´-t±–±—ÐÙg¶Ï>P–8†b‘y ¬)æúaŽYL¸ìŒ‹3:3,Pb¼qF‰qox;O‰rœÉ_†Žì´»$ü>†Ñã}8Ï,ŒY†Y¼oV4¿ gUÕµ6Й‚§áƒŒÞÊž,-(~/¼æBx‘1dØ]BÏh‰gñ]Ž1Ï`1àpÍqŒigAͱ‚•XÑ×Íô|Sš‡3:¡´Xà ÙæÍ|8ÒtMU9 €;VÌÌû0žùzLäã-4®ör{ ûQŠl hÖÕ@²Q1:©Iñ¨ñËM¸Arª~׊L‚ðO+Ë™¿³–ZfÀ ZT<\S¾¯–àºöt†ÈUýgN_¦ßÕ{ÛV'ç.?¥|ëåÃUÓ§±|ËÏo®~WªÓm«¦¿2Q/&¤qþûþwÛu—ÇNñÓ¶k KËù™ˆ“þ¯Ú¨—6¦ñ··(´lnµrÕ¨É8c$³zåDn8ûÁœµ£hþà<ÑÂf¬íˆðó»™"åâÛNºqt‰¦µfÒÊå“Y:N ñ†¬"Ñ­WM«¤Bƒë²Àˆ׳UËrb¬ï†rÒ“{ž)`ÓsóÕ5ÌLÝ"feºsrí±Åö b±'ký1稅÷³ewð3e Œà҆⬱÷-5Y êäQ/ˆ:±@ÔÓQG D/J-¢ ÄK ] öÕF½´1ˆzÚê0Ðý<['Ýœ1‹å #œÞˆa9A; ñb:ÏÜaÓÁ­œX6kÈQëņ³0]he¦€œ´äÅ rVœŠjNæ7GSJÐ)Y¨[âà2i¡ ³¿a6+S“+Qh%\´H]Ù2%›£{½ýäd ÝlÿõÞìcµT:ªêmYá*[“´a<ÇN@‘hUÑ:¿ZQ÷)š*‰•ƒµbq<œ¯“ˆÆ2#†¾`Æ*b–pö&cÓsÃð–Ûá1]¼ÃSW©žZÓÝ—sËb‡çòW&êÅ„4¦Ó¦vxLCiœ[;<—¿j£^Ú˜Æ;<õ˜9/ûa†Œf,Ì»lMì¤n6˜1ÝÆÐ ¾³ZvO³Ëg™úH("‚­l¦†©4£8O"“9èJOŒQÔ–û1±ÂbpŽŠgÙc10R!YÇà¯mâoÒO˜©­I«HQš ¡yTVXf®Èù:ƒ·-R6à™Ùä½y­ûí¦IGE…à”ç°é gú5[¹ñl¥­ZjâaaÙíÏà:âü©Öî Û1ëwžÄ<ÞL¬ÓtÑzûã£Ê«K×Ð%·cbÉŽ‰KŎ‰K옸iÇÄE;&–ì˜ØäŽ‰]ì˜ØÄŽ‰vLl´cbÜ1q6VŠM‘»ÛOøC‹œ rÑPk&ø€·ü9Ÿd®ÞôÓ¸«&j~7uÎ%·0´"oÍÊŠÁâædA\ÿí‡ iµœIü×òÇ¢›U°'ý<ä.iY_ä^„©8ÕM 3_YÕw˜ðX–ÙŒÚm°£œÒ ŽrÉ¡.vÖ8“˜… '"m:ŒÐ¡,Ú¿œ —HæÏ×ó_§¼8¸:N Âw×¾„…!wÙ-¸ÇüÚnÐÖDxO²ÿ—ù¶‹#~+]€’mËï=e7 ΋–å=ÉÐ˼:g+z„®ì'­dœúÏà¶„Â9©Œ×ç#¬~t¤ “tMCä“ì"n˜ ‹FT8Çp±tž3ÖJ¡ÊO¥[eFa¼æ¬,dKßX'™´±|û.nùâ °V(|³¿aìè¨2§{ÐGí+B ;]/QöÑk«ñb™ý8ÑÉïb>ÎJý˜÷]G÷8AdÎŒ ÕÌA rn¾Þd½Ì´ Ù/A?[hõ•‡’ÿ¾ü>ŸÏpª½[kb|RÓÌ¡ïx‹Ší3^Bl²Mø 7%öù¡îÔ0Ôcá÷2éÒùt„Ô3ƒDÜxÜÞU¸Ãg|ÂyJÿáûøO¥F~¨-þ› %O]ÉgæÎ-pÑc çx\a¤g#fNZÄÚ‚¥¸æRw =Âä^ÆÅZÙè;W¸uxé0ß-Y¸paãÏPO<ƒï°VóŒ9Á†©§?”4EXt ¥°ƒ†wj[Z5&g;ô|¬ˆJªý8p…õÛð[iw& ­¸yãÒi- ²¨qa¥JÀe_FðþßZ•óc|ÑÝ|³ð€Ñ/­˜ŒÑÿê—²?w`Tê›ÏXnw V§ï³3þ_# “ VC¼»[”ïk®ÑÜ~®ÁH#Ùq´Âc}^Þ>Í»MXXa°>:œÛsÓáÙáú£†§Äù`Uñ¯}Nc¯Û“wƧ%,j<°qÙVÆuШQ•675ŒouúÙFùAtŸ|ú1!.H<&ø0Ü¥ãPU}{ÇÁÈñÎØ&Æ—kd¥úÚ÷^1*õz½ØHþ³&<89fíþq§†µ¹ç¹ÅARÝ’ŸÌHƒ|ÙÓXÓQàG˜Qá¡xÇfTdÀ݃õ¼ƒý ΗíÖ>P„9˜76810Nî/£ºî°`¤¸*1B;æ.ƒ„JÝ~ãä®<Í8ör¸Ü#”ª=‰R·ß¹õIGŒÊö²Ó¥+Zà{û}ô×ÁŠw^ºwç{¾Ò ÃðR…çÛuVw°oòÒ«;Ø|9ØCì5{n/íí?ÂŶ#ùRÆÇVÆûœdèÛïþ¾4û4ûÞ?`n1¶—Ò?¦Ò0¥6ɯ)Å“éà}Æ×ôíãk/…~ùñcüxýÚ#¸w/zX¾õKžÇ‡ÝADyÃYNz¾á¹P“Ñœ#—O÷Ž“Õ9,âwï3…Qß>R¶å›úO“5ì ÿ¯†ið ¸_”ïs“ÛÜ~“{ÃÁ²G6Èf¿³Ô鵘ÌZÏŒv>©’`‹¥‡üõKŸ'•Ù½ÍüªAÌîè² I¥ð1Ñøè€-ÇÅqö58§]bÝ9¤ùVV³NÞÀŸ±ø›Ù÷wŽí“žÙ¼Máéx×Ç:ñ‹szWù²Œ"^l¨™S`ʆ€ôÄiÆÙ™ñ(qâïaÇÝìlòg7³ŒåÄ9¿?ƒ1À:Ä9 q~ž’ûÓM¶)Óݺ™YÿàsÒ B‹õuá /zC?§Î6–8:ÎÑÀÇóéêi˳T÷PÈÝÁ †&¸œc1o¯œë†ÙûÚç Ûk `çÆªÉ¿þ½[¿^ËLƒ7l“r¶ìD•ÊÏë–:­"ÇÌ—uZVÙ¢^Ë‹{Û{ñg•ÇiuµoÂc{ ZÃÁ$²‘0ݬü‚ƒ¢,ÃÌq¤8³!ÎsóäϧßnË$“1\+Ñ`-¢UÐ&yIû‚@à ÁÙää­•˜<ÛÆaêFT«†koáIé†s69SwÑ”­Z,Ù5·…0LƬªGÿ NQ>Â;М¾IÚ™ ¤XBãº%nTsðÄohØŠ1fðF¾ƒ'èxÞì¥ä %n û…Zbˆft>ã·=wéOS™wo{Š” ¶ì¬ØÏ§ÏoÿÓßB endstream endobj 2718 0 obj 8460 endobj 2722 0 obj [104 /XYZ 38.2500000 612.500000 0] endobj 2723 0 obj [104 /XYZ 38.2500000 612.500000 0] endobj 2721 0 obj << /Type /Page /Parent 2 0 R /Contents 2724 0 R /Resources 2726 0 R /Annots 2727 0 R /MediaBox [0 0 595 842] >> endobj 2726 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 2727 0 obj [ ] endobj 2724 0 obj << /Length 2725 0 R /Filter /FlateDecode >> stream xœí]K¯ã¶ÞûWx`<âK¤€¢@æU ‹ƒ ÐEÑE1iMÐiýû•mÉ÷šÒGYß=¤äkeÐÞ™+›<:<ïßþé‡ìÿõûþíûþ³ÿÚý|ÿî:xWÿÛÿ¼yþ Ýß÷>¸ý×_wßößvŸwŸÛÿÿ¶;á‡÷iÿö¿½Þÿ¹ýß/û¿ý½ýå݇Žøuç•oþûô³ñªý[uùyüýÏ»¿~·ÿí¸b¿]Ìõ¿ß¨ªj‚=‚1±õ·]ÿšêôç÷¯¿íÞž0o]©¦{eÝ«Æêýÿ¹û©Ý _¾:4V)_[_½d#¯;ùÆì•nÚ]•ltú#³¼’_\W•˶ørq¬(S«ôê‡`2^;{<èã!»tûwoºÿ^ˆ4çÏHk\Ž#éWÏqÞÊ©ŒÄt„\)ÝqãÅYYk[uèñ9ô´|†Å­Ê¸ø rq¬ôg‹W—<\§ëœ‡û´|†Åë&ãâ'ȳ.^]òpÓIMëê (º,ŸÿÆ4:ßáž ÇJ¸xuÁÃ5ÖÚ3‚Le3àÿ²|ŽÃõ6#åœ ÇJw¸‰Õ3[XÆ7Íiu=´ÝΤ_>ÙX[çÓÃgÈűÒø`õÏsVÁ œܾo‰/¾û²{ûIÙª«Þù©î¼çéÇ—)nÿæèëµ´÷åÇýªÊ|øãþË/»æPk׃Ø=iNO>~i_êeð `Z#æÍÑPmEâyËêûÓ–ö`ÍÙ7¿SùÓ“pMu‚ôéÉ{ø‹žè®¦%÷Qxµ§'î`tPWOTMÀ!ÀP«pzbÎÖÁ»Û †§€¡V|÷ap`?J‘ë$û誹P’Eì£à­ç§‚lª¿‡«½‡«øÂVÁÕô;ø¤™¿1ð ÄŽœ¨š>{Õ~`êì;>;ˆ«Šx"KcR’«àj5„úñ„xS¥Œb΀°)x¦oÒâ}dŸ`逩÷#!7ð,0lpµÔ˜ )TAªJ@ *U1Ô;FËÈAú]¡Ä~;B¦-/£W ¶'œ\1]32ú1$ׄ³©‚é³¾v×®DÂ=tÈiêPbüŒy^gÝ¢LïüÅ:lÌ#²„=<ÊËÅ>ö !FÝŒ®folæ?I¼ôÑþöíd€ '=>II^ã@{±#[°­]aöÐÒÍ„X¼%äßò§YYå¢×K„°ɸ/SÊ9ó‹{³ñÓÏBí>äæAׄè¬Ô(ü!w곬WÕ¡öê¨4oÑTØ,Áqs¬Ãˆ¨õó'‡ø™—2 L™.O2öê&~ubù!þˆ~âx Îu%âl‡ø›mÓ¥^³˜1²8Ÿ:õŒâ«i•P$¾ ¡àTQç ¶±0Ä 'B¾“c ½â”$>S¼æÝRáV)¨?Ï–†r‡ª1ׄóÎgcRéþÑ-¯ÁøšëÓà*»ÁÔ…d´ê3jË…d°‡Ë‚“­4#TÂEá(‘Äià×`‚]"A(|púü¥úõ‹› Xª$è¯ö½ékËBü„1Ïu!ظ¸]u$‚„x‘بŒˆs¤C:'ªuÀâóúþfÜ ‡a‹¥Bé¯-6SˆuºÆÅxg²˜¬dMñRrŽÑÉDë;fŸ„]Ǹ K%[Þ°fþ±`’I˜.Ÿn×jé9Y³'·Vc<²ØLHX¥Ø’%h©@t¨V±Ðe˜‹ã{ÀãÔÍ83¦œ›)ÚÆ¤'Z–¥ùÌ Ê¨éŃ) VÂÇ`\ c+Â6Ò o€0€ÞÈ(Ù4 ý¥ò@Ã2ÿDV:¸0?Qæ ËhÅuð;‰òK\À†q€ ò¦Þ§Ì 7zú„ —*Që÷Ágé…9{\ü.ë —jf‘-GÀEÆx[°ˆÛ˜dQÚ/[º‘X"‰–¼–<̵ ŸÉrSɆ)c›IHqÆ|‹Œ„#Z¶pÉϰly¨‹rF}i¡ÁT1õ¤ ¤¡oÑ6§XƒàÂœŠ©G¶=Kö»ä- µš*Ñ>µ–*Û;“"“e¨³ žl|ž‡·BOº(̬'¥tí}z 첬¾9¶Ä +ܪFøÏ‰ˆÓÀ8 b ªš²‰¬…°?¦FZê“©`mo*tñ>UÎÇgÀÀ'QãD)g}§‹“Ž}§ßi Ôç d}0êŒÝ§'çƒ?æD£ÊBkÑwðƒ±ó >y?ê¾¶qµÊžNêJÿlpýK3¥òa)ÛXGïPJGa<‰e† 04¦"^‰J…ŸÈk¯øL+àÜ Ný‹7Æe£LªuF&ò®š~™‚\Ù¤[©Qg9ŠC3WéY›UL3a»ÕðœUz.Vñ ²©ÁH—¥ Šq#luÁÖ”rPZEÆ!y0D>âÄ@Yäo=$/;§Ý€M ÌÙƒED ‰B¼˜¨`š]Ù–³ŒO5±T–íÉî¼BS›ØÅ‘l 013&öƒcLS°åô¼ªÚži÷¥J‡uDÅå ©D)ÐK´)VáLCÛrÅÒD‡°lïpâl #"c’H˜/xÁœŒ¯Ã@¡0¶ôíã/˜¶{Šñ™Âmß]ÜÔUnšR‰Ù +˜ÂŒ2Ÿa9Θ`³X>o‘åµ”T°õ=B C[½õÅû–™Q(ôÆ”ÏNOÆÇ2<³qFM(ÐÂÆ™„«½µÐÜa s—I1[ Í«l¡q>LŸðÖB³$é d M}|:A}[› I±8ƒú®à 7 OÒ×L{S|sÓšå Ü—]'N{Åoj ÝZ¡áÝ9%›kjg7®}µ\›hm|®MÔ$áùp#q“[;ëO#–¿æÔ?]˜ÑRÑ;¢BIv„V"^!„xAJf©âU»èðïSÖ8ìY«Üü£Ž(sªõá3˜BIyJÌà*3\ÅL¢ÀŽÉ®4g‡kŸCÌ9²Õ‘LåæŒ9ÐDf‡ê òyØû–{ÜÕðXë°?ž Çûá÷¿^þÝB¨öu}üá•:ÿ¶VûÚõÉ÷¿ùº«íA©F‡ .Ÿ2W«˜ç{´Ÿïþí_ÛGßvu¼Gû›ö;×?®V ×{ü¼{÷]&‚în¹òuïÛáú©5W›—Íe.0²yFÉëúJyKM@Ç´›¸ ßT‘Ù&Se?Ë[$wÚèÁØ’¸ó­¨¡Ä*aQ$ìBL; ð›Nä쳪m¬—ºEe¨XEƒ”-Ÿ¹ŠdñJåÊeÆKÂgk5¤L‘Êÿø°™áë™{¦Dæ´Sw ˆŽøN0‹È!0DvG7ZB„ªÊÇTÊdD0ŸÍÅ §+™[ë§Cû²™MQ#\<Ê„£%¦‚ÉŒœQf|_iØ;9éîC~&hxK"# ]\4TÓ`nµDåj‰Ä’AÕWI‚ üH’ ƒñWüãoâ$ÁéSæjó|>I”Ie{ØA’àô©pµJ¸Þ#’ èË=­¸|˜)dÆö`vÜ’B•3[bai×É(3éëtr&ºäÌ™H“A]á\ö9U©‚ᛜm]MˆŽ·Ø”óØïaªUêK¤Mä.Küï¡€¦Tz_¤;I8)´|Šì Å-^±¾xÅÖa´Bm|lsnño0Q¼ÁŒÆÌ Þ`Fâ æo0WñÅÌh¼Á â f$Þ`.ñso0ã ¶'«RÉYÊ,cÊ‹1Ô²‚‹ÁÁí¶jbyÙéw8R~•JI$2E5zu<³›¹Lx(ÆŒ;2O ÈlÊÉvjŠ\a„?*˜¬ÌYñפyÒ‰%ŠZR•x]"ï  Wo\Y©F]Ç„°9€KÆŸnïì£|¸d2G 3W”a]+æO¹ÈŸr£þ”øSnÄŸrÊ]ùS.ò§Ü¨?åþ”ñ§ÜÅŸrWþ”+èOÕ™ò··Û$3sÂ|)å(ˆNXc§ÌÅ"ŒÏw‡ùNíꈨ—¿Ÿœ™œ€ Ú,‰Îü¯†ŸÀ‰Ù‰ x+GþëT­ŽÝV÷5¨é#%ìG•°(a?¢„ýE û+%ì#%ìG•°(a?¢„ýE û+%ì *áÐÓ¦>óƒÒ=%¬HõÉBa'*„4°§EâD RÖ(_á¡Â†‚(¤²ÐUth¯ðP,ÑIòÂ7 ‘$H¼D%ŒøaÒú·‹Ÿ,ä–3@©]¤ß²´Ï#~Â}¢µìµÌ/iLÂꌱ–ÇÅ]õšÝ³70ëXÝGéxÑö"f”l4jù¼ò#;©âXýâj§ÄÅæÌ•·‰«uqâ“/{[Í£KÓrE)LB2W6'ŠÔ æqÂ7qm;A±¸°mÍåxr­¼7P…öUÜ"yðÅÙo¢Ç'h Ê$,/‹Ò˜­7{úQCáÓ‹ìPP‚gŠR_í6ê»å}°´‚R$aAc´$½¨ËP«DùÁÃãJÖJ‡üÈØ­©5ûŒm–ˆþ<Ži`~\óÕ$—<—8ßx¾M&áÙ8c㌠:õ`Öa›éKÃX2””X£ÊêMÌ38¾Gðf"ò©O4¶Åì£q¼Ó?†š€ ùcêÖïŸ áÍá› 1%®‹ì¥©'ßNö ¦‹éâ×2§…+¥®5X§3’’ȹ—œã}Ʊ¬(‰yoû] ÆeŽ×LÙF ës£SE#Œ•žÂAèûÄjD­ “›Ø²)¨7ÿêÑ"­¸»kÿjãÍGâM*ƒMàZ¸öFôLÿŠñ³)+ÿqòá¢þ/s>Çœ Ü rõÄ)0±æäJÆ'Œ»AW‹>IôψRù…èN¸î«ä|átË»±úâ~‹¶¼—šxOA@Œ²J4ÓâÖÜnJÌÈ8ÛnЭ;T¹†ßÒw6#Fæò1íÐÃi4Ìm§Ì\9bPùÄð†4e§ŸmÝÜ庹 v ë/óCp< wÒ=*LÝ,ÓÛpÝÄeN¸©'O¸ddÇ©Çë±²D—Ëj¨t–UŠ3ÊИ±Ó4_0w㼞„çqh^66Šs7kŽ€&8gËKrPÓÇß±§‹Ÿ$´2>aÑz]jà>Ó-ÚÑ“ˆ701aQm û¦øL±Ìg…jÉpLXc ¿Y¨²¦V7ð&ñÞ õ%p%šÕ/U5½Žln­›inÀb™ôʤ"Î5Pz‡à™b¹a†BVlé-ßu_2PÛ—tŒlœÞZùDíJ±I"›ÜXܸÏ™¢R¨¾Dµ Fy|ÕG6—÷™×b¦ÓQû«%â˜j©Díb©Ù­ø}D'Rs©0lXÂ1Ñ ¶ˆk&)m@sŞŔ—\FvêéˆýãDÈï 24öE³BUCþ2ÖÄà4>‘ú§ûãŒíªŽûªJaî½bî¼ÜÖGMÁ/täòÇ2¤ÕÁýDá”ðm²üERçİfmŒÙk0 Ø–¼ÏÑZi íb—›èvÆeºg„Ž”­‹Fe/™»ýÝ„>À×9B6d.ñ,Y‹ÌåBoh/2O(_›ñåˆÍû´ô©^"6æ|˜ž2_Ê*L剹0LßÊ^⼎ŒêZõ¢~Æàh3ݤT%Q™öÚ2XY2ße¤·v]ÒF)Ô¥-;[™IDUsŠÞ,‘è¶$ær3º *Ø·ÂÅUÅ1]âÉ ôŒ¨•TjæcsUÏòííŸý·–0’tóyê7D@ÂQ™ÖK­Ô±CwÉòt±ðÂn?⥞9ZôÉÇJÂzø¤ËÿëC×!<Åc Ð>fªws ¶OÝ›¢&e|ó¯}©‚ÀªîÕ/Ø)̱å=|bÑk(¼üNÛQ³^ý™+ÆÜñï-Ä=äç£1#¸ÃÍÀ0Ù$H»éOâüç8´Álð‘ZWìkûøØ-OðûtJwì\á‰HÁraÑÍÁïõrúñ•9t²g„ÆŽõs)<%÷ŸwÿµBßà endstream endobj 2725 0 obj 5118 endobj 2729 0 obj [105 /XYZ 37.5000000 179 0] endobj 2730 0 obj [105 /XYZ 38.2500000 433.250000 0] endobj 2731 0 obj [105 /XYZ 38.2500000 433.250000 0] endobj 2732 0 obj [105 /XYZ 38.2500000 195.500000 0] endobj 2733 0 obj [105 /XYZ 37.5000000 179 0] endobj 2734 0 obj [105 /XYZ 38.2500000 195.500000 0] endobj 2728 0 obj << /Type /Page /Parent 2 0 R /Contents 2735 0 R /Resources 2737 0 R /Annots 2738 0 R /MediaBox [0 0 595 842] >> endobj 2737 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 2738 0 obj [ ] endobj 2735 0 obj << /Length 2736 0 R /Filter /FlateDecode >> stream xœí]ËŽÜÆÝÏWô:€[¬_@@I² H@A'0b#Šùýt‹=’ç’uúV‘ÝC ¶Æ¢XuY÷ý¬7üü÷Ã?;¼yüüŸÃ×ðûãç‡âX—E÷Ïáüë‡ïÿÀ6Çðó¡nÊÃ×_¾¾=|zøtúï·‡î…Ï>ýô¿ƒ=üéôïχ¿þíô‡?†¿tþ ¿<Ô¦>ýþï§ßÛÚœ~*.¿Ÿÿü_ùÝá×óŠýv˜—ÿÿƒ)L[>1³õ·‡þ3Íӯ߾þúð¦;€¸]láZSŒwþ`ZoÿýÇÃO§ úå‹cãqµ-ýéç¶òuQ6=ý\»ð»ymÏ»×m{0¶-U5Þüé—ÎòFqï«"Ùâäê§b\eäÕ­7¦>#úÊê¨4®; k›çY>rkŸ¹äê§+¬®‰Ü¶êO¿LÀ¹ß-¯¿xiŒO‡Ü'ÈÕO¥G.^]¹¥µ&pnÑ&8ÿËò)ëm:™ßA®~*¹ÂêšÈ­Êp@eà„.«§8þÚ”é‚\ûPzÔÂÅ51[WMwõÓ“_Nâ/¹ä:©Š …Jižx—Ò“ƒ½ËØkd¬‡x´ðaÃç†)‰YÍAÞ¢`ƒçæ±Z_’î[âSÌs§ŒÄ À߃!€2$À–Gª6æ6ä¿?ï›YþcÝMP¶úž’Ø»ŒÝŸd”òe‘‡kìå²/L;+°Õ6+±“[z‚\¶&u>#†]sÓúŒñ ö ?¼^ s–ð ,†M× Ûuz6}f0@Ý$PU“Qn”uò˜Ó‰XEåØó"öqÐÆ¨ãÆñ Ïéþ8y ±€O”Á– Ô‚lþfE¥QH]ᯀ4ç™:›=’ êÇàºL͹<ì_o÷¾÷¯÷Ú‘½vDß2ØkGЬ6ó¹kš·1÷ÚéK÷Ú‘½väÂgÍ5¾Ü–ùLÐ&D'† 7‰˜¡P‚ùgRàÜ×B,l™Ÿ™Ê ¬ ¨^}ÕÊaŽÀÜ—æ‘im;“Lù,ʉN±’Äj',!±TÅŸ(®$21L%#ãCaüà*a¦Ÿ5Ö¡„vÅúPȮݤµ x¥8*³×Qq0Õ'¯H*3öW^©œÅ*ñ¦Ï÷ŒL„…%×mÖïo¹šYÙ—ÐÅ6†øTÌۺ̼„¼Uy¤ƒ»äXùÜ•¤L_t`¶}šÅõ$ZWåHaµ÷è{\/Š]xiÁaŸ¢žÀøÜ†tg\üÆÁ+k¨ýÞHxÏxµ1c ‚!æ üΈççÈ;¡†* ;PQÁ¶XÞˆ|<; l!¡¼d/VÐÅ„¼¡öa¤äö¤J¨e‰âK¼± n>ƲÔH#EØ?ÌÆ‰%‘À.Fœ-XØú€†…]6"ŒAGÂ'¥`$3«A$ úKë IðîÚª(%Á±Æ.*Sþü6µÂ5'ô>ŽR*Œ€øI 1{ìÎnÂ>XÒ1;ºÁÜaMiØÈ”i “ÁÛág6† j ÏÜÈ ´BHêVÏTª…BH§ô殈K3åD¹†yl9È-'á\5=´€b?K}LÒVH•á}p¢WµØ\“ëR,N˼ˇáªp³ðb9¦š&Õm#f` ˆä£Á†öLó󖥯P8®Ú‰ÓL.c{de/™¦÷w­æ-Ž$~Z•îÚM„ÐnY)»nçyPw a¦òTå¢drËò[àç-kÑŒœQ›zÂ7`ùÂŒP`Ægál™b×·8„VÜ¥s=>k,!ñ¨6¥nYním¸‰c?Q“O\úT×—óî ¦R´ýAb–!@8™ ¿‰`ŸZu*’»|šÚ[­Þë& ¥Rç~#ÎO±|#}uÒrbòD‘Ÿ@LÂäð3„,çò$7•ÛÂX Ä\«Ú¼xï›òX´îå)Á§ $í-€@ %ü¥DºX¹PpiÊ*¨ÓDú‹& NúibjT3yTÉ<`ó&cóÄYuB% ûDh@B¢êžß¦É±n˜[,@™jUÅQDSe¡ ýr± +u„r Ì>y‹¢“V9CšºÞ:W_¦…ˆ—õU9±šPd͸ XXÜf‘u®‘‘À$z†ò7Pco¦¨—Oß‘X·ý ¸ÔbÇ¡°žÇÁL4øø™žH,g0l£8£«æ>#¥ÎU×Ï´‘«ä~5‘±±àö㸉 /躭 9Šÿ5C2Ü‹Hç‹HSê W0Â8*!å4ä0£T±íF´Á%®ùhÃfzéRw–žL>¹b«BëH¢<.è3¬ð±=œ©‰M0®Vo£[O§ãˆÏöºÄ©9 „%’+D°^ó®.Y3dÉ kë{ÝZLç•*kµÊå™Ú”Æö…swW›òüi{mÊ–†ø(÷È®îE °©¶›2©*¥µzÍMÀáwŒ>J£ÒÈ„%PsѽØ)ýïªõÐf3¥¯w%mµ˜nÎŽ¢ f–®•­hÔÁÆHY©¦°uUŸnhUP·T£<îÛûŸð`H¦cÌD 1Üõ6¥¸±zNë/ ìQ¯«[Q¥ZCp!&Ô–mã†.c&«Fž©‰Nº©fF=GY/¯}QuïÛ) °]éQSÕ/™ö$:GwÄÎOi”G éD½®Óžz§…û˜Þ{%LüÅ”ø"½?ö°…«5§ ~„OàjÖ"Ø‚}V±“Úi êwpµ>IŸ*ë"KmÑßSòQQ,•"fó*w˜äÊ@ÿG«L¿O®R6ª"– 1ácc2ÀªØáB¨0¦t‹¶•ç­f2Fô@1ýh‘QÞ'SUl.Ž)˜¼"œ™²?*˜TÏzRÄ,T&É.à÷õ0Uã0”cx)W8Žõ nŽJ,=Ä4°b æÒíËûˆ˜jêŒ-Çå–;ßL›©J“¼€l¢QCû1Ÿ‘¡ÇÉÚ¡·§4Á8À–-SÉäÿ5*Á(];¢Êˆ<ÆòóM5N]« ª$ñjA A0eyŒ…!oÑkÒ‹ÎÎ…Èl?u8—ºÅ+ÐRª/;DÄÅK4ÝNIâÁbbâ?Œ¾~Bqáƒl¿¯Ï1ä{Ô¶ÔùcÕ®?KlõÐÈf|™”-I}@õ¢|w)rëR„š‚ÆÒéÖô^áЬWÄÈ ‚ÈÕ$­ÛP¥jÈíwÛ­+öÍI åþêúvOE,²˜2]ŧl‹îÝ$HÆ2­í°0U ¥qAûlì3Cлkð­K¥ºœª~ÇËëÖ¯P%û|=NJíZûaÝVf9S6•é U6«G’ˆië„yÍ !‹É/ÜÀLsQR’¶ëùÀ›¤‹õÇÆæÐçD„<‰ZH”ñšñ¿²Ú@)`ÆðÐàvFÖãóif1ÖÉD #†ÐV¯QÞ#5Ò¹ù÷¶à5]iÈë¦Gã^1°„?r × ìWÚÇy`pŸœWÚ·í‚+íñµÎÄ%ôÂ5²æ:Ta®'¾F“¸,–¹Ú:À–ÃeaÊy — ÓQá>÷Ô…¬_»Ï›Ÿ7‹O4Å:?O±ðDt/ øË |µ)–Ãð*PØ*ˆ«­™kã׿øŸ 0lÄY FãÕð|U+s•:!UCIJPºYxê+ãŸ0Þ ”DпÀµøZ[Uû‡¹^°ð—ª^!,Ж7 ò‰°\³ Üï¹éù¦&µ€»>_DBèqJ'¶¸ Ç ذ†Ïu5µÁO™t›ºËÖ÷úWÈë].W”Æ_‚ «õ#®–eÚ«tà8[¹ƒîð´Õ/¾¢R̹êßn*ÖJ$5,+Ó_Ÿ@J:;Ç2Î4ê¶XÉÏTåë®¶~DF<íÝËÔ%sö*øl±½ >w|ÊÈ®( ;­¯Ïà¬6—äàu ¹txŒ×ºúuã·9%6›¡‘xìéÈPÓ¨n¥.PÞº¶–îØXݦãle»÷jÐÜYpé žH?%ö{-QŽ?)¢þ™áûLˆ)«¦{åaŠÑ­N‘Ò¡# çCï4kŸòVL7’LÌ|dæV؈àKÚ«ÆW뺢çJ·‡odI鎷CZTi‘aR=G÷æB2!.ÊR`úDrõZW´3A9&ÉHB*ª\أ̺Él §šðç&ò¦þÙÂ\Cq79—–i(™(¶I?Ö¸z€p]fËsv1Ÿeì8+m¹ »ãÕô#Ý©¿wƒ]G¶µ³tùz°µ.gÌ,+Xƒ‹»Ç6r"nÝ'–¨œ§j©W.-8yß^qŠŽèàN‘èYVƒ•âÂ÷@ %ìÃh ¦—`à ¯Gƒ”ª=kLJV¹\5™år–N=ÁüŒ©÷-A]ùzhYèêZ X 3ò–9Q¢³ÍàÕ˜Þh¦ w€òIðnð;DwªÐ©‡§` ‰Ÿ¨õˆ-M}½e•R_Tê»ÎD&}e^¢d¢ü@'F½þ -¦Þi¯ÉXpæ*·²g¾ò:}qý|7sƒND^—H¸Q‘5fyn¹Œ/[‘hDK21ž•ú þª”ՈΠ”cDË‹ë©.±»32cùu½FŒæ`Ú)¬†Óò’š ªõ¤Ü; >RºObÊ£%µÞiÑ;¦EïqxÖ ƒÆ’€¡©/í >ºî>Âw> }ʽc-„­ƒº::cd‹a#N'Я©zÚ»êt0Ô6|ÁÁœ:¿´ˆ?Q§jBµB5ô2—Þ¾d2Áæ…*9.ë¯úŽ[ ßRÏõ>úØ‹À æ1 ×v“GèzçÚ§„êÊZ›ªÃ†O§$Î둹‰ xµôÞvÙôÄKjÌ}v¶FU<Ýfÿiâ[}tŠ¼ÓŽÐ§JâÒÉÕš¾WóÎ*®cܦR‘)iê– ºÍ‘YJg·°CÝDœ”À\ª¢ËãS:uíØÏg†¿è†UF›¸›AWúRò_w¾cÖäj!Ôhðß±®%~VÄ04×<1I‘õ'2dºP}Ýf]Ü¿WUíò¼²ñÈCFut"«çú¢ ^ZðÄ`>¹Íî›zLJ[Ì`LSN“ùŠ…‘L™ Q´Æ\óB•¦ehrꮢÿÁŒTà±yŒwËfù#}ܯ*ì,0‚4±1ã««j^lã†:±)<̉è”$kËňXIjújá„&Óá‚ïFÙÅöªbÛ¹vHawÖf¯;tï ²(œ¿½"©{ñFð(âzøÌL¿9['e°¶¶C†‰Ä=K#Òz®i1LY+12EEÜÌ„$©–¾ÚÜ·HàÆÝ«×vÓgUÓ§u~±é“:Ä«èæ¥<±¦Yî¹ÞGÔ:Û(ðÊõÍœB„ ‡3õþÌt®¼cgSé©Ln}3Äùúný®YÔXú<Öå%~™+Ÿ¶šÈÛ…rúT„-Âk#߸~àôµ¬ÍH%g3ßøÁžw’¼c.GRNÉ//®cŠ¡»ŽH'ë6HR9‘Q'þ@|(Œƒ¿‰ñzÕ‚1f÷6^O¸RwWyÛQySb2¹tµïgL亊XˆÔ9•0obê;É dqöªz@ pööî¹›®Ê›ýn†T%²âSj“z$@6h¢ÞYwÑ~ŸÙ)°|Bã½»”_7Äl —TÛîÑI°­ÄlCúÈJºg;ØsbF1sºšá˜ ­0.,!ÂfL8k3e!%|âñjxÒ*¾ù‡á>ÆÏÃFœŽÅt=vKœ¨ÃtiïÃ@€yC"’GÖØËwïAõÝÛ’ 6T?ý:|;±€È!Ÿæþ‹ª™Œ†üÕ“è;Ax°þ%î¦Ü¹î‹ê ‹£“6vbjUÇ ó¬BÄܫѨ;ƒ¬!óíãæ*¥§`û¾t”iÎ.Ž ú¡ØÆ!jüÐpÕv'>ÃàÕà;Á¬4QŸ^?“-Kp矋gÃð1˜°ã³ÃH˜l€ÄîzLtoŒM…©ˆ fƒ÷ˆÔB¯¶ï»–<ÁßTÙ^!Æ¤à ¬'XT 9øŽ3×ÓO]¸c=„4…SùÎ>™°ŸŸþ²b5ÿ endstream endobj 2736 0 obj 5275 endobj 2740 0 obj [106 /XYZ 37.5000000 467 0] endobj 2741 0 obj [106 /XYZ 37.5000000 467 0] endobj 2742 0 obj << /Type /Annot /Subtype /Link /Rect [273 445.250000 332.250000 452 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_smart_pointers >> endobj 2739 0 obj << /Type /Page /Parent 2 0 R /Contents 2743 0 R /Resources 2745 0 R /Annots 2746 0 R /MediaBox [0 0 595 842] >> endobj 2745 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1409 1409 0 R /F8 8 0 R >> /XObject << >> >> endobj 2746 0 obj [ 2742 0 R ] endobj 2743 0 obj << /Length 2744 0 R /Filter /FlateDecode >> stream xœí]K¯Û¸ÞûWx]`ñ!QŠyè¢@]]3ƒÉ iýûµ-ùq)”ôù¢}9A›ä*ÉÃó~¾ùã—¿oÿùßí›÷_þ½ýqøýý—MµsuÕÿ·=üúáúºÝ Þº¶Þþømó}û}óyóyÿÿß7ý _Þÿyÿ§ÿmõöOûÿý²ýëßö?üiøG‡ðmã”Ûÿþëñ÷ΩýŸªóÿkó—ßm;|ñ´Ü°™—ÿAUºÓÍaKßœŽ©Ž¿þûão›7=–­¢«º­õVYc·ª³zûŸl~Þ/pú|µë¬R®±®ºg!§+µíVé®ÚÖn´Îñ—Ì×U„wÖÆûøqçÒ@Q¦QÁ ÞlSíÿ«Zy]>úÍõc}ü¸sq¨ wøú®µF§k{¸èÃ%ïAïÿìÌðß}窛zš²Àvù|„7.£èw.•Ó…ã¯KRs[›@.ˆ.Ÿ—ÿ¸«t¼÷;‡Êérñ×#S³«Ü@n]ãJ\í…^³ýúó~gý‚Çß¾~ÛØý_F_ã¶_Úþ~¿Ÿ·Ø~ýecwÖônÿ럸ã“v×vU£ëë'ïá; |çãñI½3ºU/ž( ßÑ˿؛%v ¿¦*øNÛ?™sŒþó¿î‘æ¾ûV¶BW®lëݹéÏÛ펻y‰wÄ“>Ñð‰%žàu|ò>yž(åàøµÊÐC „Fi'¬ÔAP”îšNA fϧs#†ò¼6”¿õî êb“I­:_\bÐß•ÙÕ¶iÝ Ä®Ñƒ…—„P4ÊIðº…Ô8úµßZÇ—Ÿf7Ïx³En6pƒÌÑ!ˆʘñÀ8  ¡ƒáwìÇœÜÕGÒì´:]ŧ Fq‹‰A«á;\GC±`£˜õBMÈ@fY„Ùƒ ³[X¥b‹¹Á(ì\s"àžQ¨j×8uà!wqÜ¿ñ.Ì4e­Qø5Ì=QIãPè\²ë´„TÖ‚ Õ»ùø‡=X/b°{)F'Nuqó2 ~Œ†ñ ¾cÈ2Þ$FUÃj䈷0|vê1EˆSž ¡„¯ˆ@,Œë4õ%ÃVÖ·¡Ä f¾Æx[1 z*Pæt—sxÄÑó`½€0ñ: ã¬d%øq±spu‰òG£¬ÇADSehãùQŒu•öÅØH Ê·Õ1üç{|^KÙXâõO”:-4g ×z¦X„ª¬ó°-àÃ*Þ“ÊÀ¯Yì+³±y†Ríˆi0bcNŠ%¤j&¾‡©š¢)FãHB‡ºõéÐÆÇÝù‹RÂh,1wnÔhç<óMàÖìNÛd„­lvÊï"¡ )&‘;Lð×V·íE`âÀÑ‹¾£!"rŒŸeVˤ Ôxá•NLëq¡¢É…"˜X“KkŒ/1¦¼KQ]ªÚÛ9Ý›kjÃð6Îj,4.ÝÕ¦ó _§«­¿æÓûòžp0˜PqÂxÆx ±£™pWÖñŸ²~lÓSý­0ýü`%|©`\oç«i‘¿´Còê•|bò¶0ò3>Á<‰Éid¬†^üµtÏ„)rMUŸv/~€Oˆ¤6œ‡“ç˜D8üŽÆeX•Æ0ÀÊïÔyÒÜpÓMßpI‚,IYë&AΠ¦¶¦¦rpŒÂ”ÁPæË¢ ‚°– "McŸÒ3‚/Ça¾Fql¸ó.!|mýÒ†(²rUY9ØŸ…Ç.••xðIJùªZs¾@Xaj Ð&–:Øêx2éà ù²®ô4ä±UÇHDâî þZ*]D¬êuÆœ‹ë˜;y6:ÁúîúØgš!ÞÉÿá-ÈBÇÀ½ QŠ4h½U׿îdS²ã~û0Õ­.'(Ï$£BˆR:OÆ<6p¼¾SÙÛ~2I‡OZã½ÁóÜÁ}Óð´ÎMß0¦Z®İ DNð:ØKÃðhqf ûJ:£Î~¸„òÞÔ¶È×"_ãqö ®Ãì à K¬¿¯ï‹,mé„Ó9ŸM3ÒðNY›»fdœ™ÜÏëÑŒ4öûHýÈԯ[ãCŠéÍ£WKäVEÚ?xñ|K‚ŠÝypO°¦!y†jþC[n”Y!Ûmk´86)+‡e;ÒÍ7Ž…Uv¼H%lTÆñ”ªéuý ü#„áT„]ûl=3eÍå€Í8јÎÜÖÍ–k»šßÔHf^”hçµ@SQ ª+õKdŠ˜l £ ¬3âcë›"ÓÈúTqþR} ½tuÇ ³kfv3󵊞Ó38ëjºYúƒÓËèŸ&Ò2 eq™Ï½4£²øý&¡Kn"îûI, §(¶Õº]ttccÙpÛ×{n2,Bå5Ñ­¸½jë Í%7#jf=¦©ŸlvÃʉ~­ò•«—£B7ä_AW6ËvpÂÌU”íʺ'dù ¥€ˆN).¼ûÚº_<~°²¾”-6IzÿV*/ „=Á¸„mºùÁhfŒ(5‚šÉŒ›ç›lþ÷TöaÇÚ¹_rdDxÔ43Òºdö塈/ªuÕù¸>rO1Ø)š%ýØa»˜#5`9‰a !z•¥Ÿ²ÓÓ‘›,"Ê%©~ì2 Ò1E¯|þó­'„ç™I‡£Š5æWËå¡­ð˜îªªõ…¤hªßj.è’'„ƒ$ÜÈ:Pe)t~3ŽZF)c"ÌDÝŠÌtQ¬ðÐŒ \œø-lÞ¦R´qfþ†õHwey.I'1}Ǫó…-Uþ‰1+UI¤,¿i~Œ}&ª-2¶c :ƒK"'r8`§áeX†¥Ïq22žóœ*ó‡šVÎäµBXcë4»•Ñ'^OýÓbªŒÙ(pèpuác”«ƒsE †Di‚Baâ‰XYÏØÓHuŒ`„ã`òTR ¤û‹ jÆk`¡×@Ö'صŸûJ"ùŸª ú±TŸý#X,ˆЬLjcV…ÚÚ—©ª<à;«HáÙZFjÎ‚ÛøþSœ'c¼mL®~@°jâ·b­·¦»ú×]ûòÙ¨hÙì 8SÏ‘À_Óxš1ñ½"Núlw˜[ç›x ×±xÒž“pH£Ü$.g=‘Þ–01óËðy0þãʃ¥ãÚ–2-ÙLifÎqR`šÉ3äÌ0_.< ð€ú`Æ3˜ Õõ$|õ[xn†?ašÁ÷ˆ@L LÂÃÔ„×Áw1I”¯¸Æ1¢ujè¤:+\ã½õ»¾Ã{ÃЙj7ukðžµÙo›V@q~ØÂËKȺ¨²ØFOk´~&Ñ9²É’'+¨ÉbfHA8sX‡jŽÆ0¤Å3¨bÖˆjÝz²Âj¨ò.HƒfÊ”ƒ*ú(£&pË:û :£PQ…pWXB b\vt¿Ë¿_ì2ðœ3²±H¢€j±åìÛ,È‹+/Ø4ö3Ì8Um5\‡¢Kbæ–pCØù½á„Û"1ØœJâÎwÓœæ"3¬Dšd?™á.<¿&}·„Ö¶ž°\Òõ…)3ÇÄ–‹nÂ$œ-:éÑ+ÛæPCôŽ—mbA«@FÏb²AæK>ÙrV‘Ôˆu­€@¶»R®ñ˜›¹·e:’¤{³™`)õo›ò0Žh‘`±˜Å{‘ÀÓØÙ˜Ì¤˜ÐÁ ¬5î² !|¶Á[%› Ž*šòùg†ã|D¼7eT¢PŸ/Âÿˆëî›7÷}hv@ù}†ú©õEL'™ZÓz’IxviÏo÷ö˜T®¨yˆÛÚ©%0-‰i•"†65ë-Q`0ç4<Šäðyˆ$…2¯Þˆ™%«m F{ûˆ•âÊèÚ7¹¢—§ïíüEû SöT8~ΩmʸÂ#mô¹³Ê4Î?Ï\ã{$[ež”›æ3‘­0Ñà׈QLŒÁ¨+u,lò°–m 2+–ʆÕG²+EJ…øDë˜r¡6ž`UwJ6ß2›€±e“Â0 ç[©KJ÷pÈ:nP*%<>]bDăZ«—Ócˆ/ܵäã¤j²ÜS¬éßõjÙ8eJÑ"®.;ŽK6ÒÅ«Rò‹šª"d­!5‘]E3ÈY3ˆnJàë3âñ£†_•²ÕB ‡c,^"ç&`¨1¥ãÄ:)§9µíi&DцC{Ã}Í-1Y¯CMšbàað sžÄÂrÓ4ÓUõ4Í0øE¿ÆÌ9Ãç1ïÂWŸãwÌÔH[¯¨ù$¸ÿáp„À4?bÖÂëNRJ·fò…βÆ$fFQÎSÆîÐ> ÃǼS×1rÕFßÁU©¦ž¤9]«^Âô´ÓÍ3s‡u'µg±Ûû™\usB)”ô©èõTÉŠŸ£býÊå¸a¦9S*'ÞÀ½(™]æˆÓQÅáÄ\ Š=0¸èáºê<‰DÕ鈊™õÙòjER2­?ä 0ý³G±åDMÑdûî&+¼eR&qp‹i…%:wG¶ÕŽ€Óçyµvë"…T'èÕ¬,3½»¾EÕ•pJªndzOÁ ‡›ñ$aÙ©ª=­Zü±øÔ>ì¿a` ×Ñ:xoÄV Žæ€£l üN|·ð¤{Ì4ŸÁ;µ›Ä¤¬c%RÜ®£±Ÿã?ŽeAø¦gæië j(çÀHo$R )Võ®êÌKXà†G½^«ôÎ÷ÙËuÊöÍÀ; nP´U_ µ…R!,†=Š 4ãû®Ïÿo§ hKT`3¶Ùwa¼¾Œò½DÙ’Õ #o–™Ëð$‰a) ,D˜Í&š{Øhø]†º‰¾*”>À°¼Tƒ½킱ұ@HÛ¾'ßN«IàfØý‡ÒÜÌlU¦ñ®¨t"×Á¸Ghþ)³©ôœi‘D40Ñab0Dì*“ó=18z÷xÂÄJ±Süµ¹òÅ01Ž·†šºÒëqÎÞùX8¦* ‚6óÈÒ0fFدtƒáá[Oï4ðÊ–g“¢S÷êR´‚¹›…ûV!)Ša€wŸh±,3¨¶éî ÚÇìû¤ð9X^ñ%giEÇ!gÚö¼džr*1ö¹gË™ü;|žòò‚ÿ¡û ôºyÔN3ÎVîÊÈ¢‹µõgxLI•3wÌ*<){™l{™’É9cßSJÄöžŽ–yHÄúz=Ñ`?¶Á oPÀÛ *÷r¦û<¤NmãÈ–"ur ¦g”-u}O-ÙâNþ— ºe6fz³p‚³Drïƒf<˶Ð[?=úAªÌ•Q>%S…†±Œi…Sñ™ìL"[šjÎÊÔõˆÖ˜Qwš(±2eâRs$ôlåøÅ·1Àª6‚eS6HJ(¨w 0[°Ú†Õ]Œ Dq¨CT4í‚I2`öØ5Vù±ùZ­“,7Ìqâ~BÜÜÓÁ Óñ]c3› n0Î,ey¦`œöDpÙ6-â5• Äè.¾x"ƒ;‰ßö†å¦ÙvWLcÇtMœ;,šsHsÆ ‹æœƒæü ­UŸL_ßõ^tÝ¢ë]·èºE×}mºîD¸Í5gt…ÃépO“@·“Tñœõòw×@RíqJg‚Fzè¬y{Ž5ç‡Ò3h †cŽx~ŽÕ:]Ç÷¿¶ß÷¨ļÏSÿ`j¶·0Óìñ¬R‡®*[m_Ò÷-äéïn±‡­Þ飸KêfüdHKÑ»¡«Ë¤Žh3½¿µ·OÃIQcÜqÈ^¶TMr3>àÀŒp?+Œ“7Ž¡ð×à;¶ªEG¿RlX„;ü¹ºt2{?ÐÌv˜ABÀh@ˆìætý×;¨Ñ:“Á„jC.œ=©nsžàó ÌôÖ½Â7ƒ9rƒD8ß1ê~üq•Ù ¼ç"ݺÌʯgL2ØÏÛÏ›ÿl7U endstream endobj 2744 0 obj 5356 endobj 2748 0 obj [107 /XYZ 31.5000000 132.500000 0] endobj 2749 0 obj [107 /XYZ 38.2500000 112.250000 0] endobj 2750 0 obj [107 /XYZ 37.5000000 635 0] endobj 2751 0 obj [107 /XYZ 38.2500000 379.250000 0] endobj 2752 0 obj [107 /XYZ 37.5000000 408.500000 0] endobj 2753 0 obj [107 /XYZ 32.2500000 131.750000 0] endobj 2754 0 obj [107 /XYZ 37.5000000 727.250000 0] endobj 2755 0 obj [107 /XYZ 37.5000000 408.500000 0] endobj 2756 0 obj [107 /XYZ 37.5000000 727.250000 0] endobj 2757 0 obj [107 /XYZ 38.2500000 112.250000 0] endobj 2758 0 obj [107 /XYZ 38.2500000 379.250000 0] endobj 2759 0 obj [107 /XYZ 37.5000000 635 0] endobj 2760 0 obj << /Type /Annot /Subtype /Link /Rect [126.750000 650.750000 191.250000 657.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn25 >> endobj 2761 0 obj << /Type /Annot /Subtype /Link /Rect [131.250000 643.250000 186 650 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_typecheck_pointer >> endobj 2747 0 obj << /Type /Page /Parent 2 0 R /Contents 2762 0 R /Resources 2764 0 R /Annots 2765 0 R /MediaBox [0 0 595 842] >> endobj 2764 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F8 8 0 R /F9 9 0 R /F1499 1499 0 R >> /XObject << >> >> endobj 2765 0 obj [ 2760 0 R 2761 0 R ] endobj 2762 0 obj << /Length 2763 0 R /Filter /FlateDecode >> stream xœí]KÛȾëWè`eöƒ/ °{äÀ°‚‚Ýl‚Åî"Nùû¡¤¦4&ùÕßT7) ׈=1ݯªêzwÕ»?~þûþŸÿÝ¿{úüïýáϧϻâP—Åù¿ýñ×w/ÿÂ6‡ðó¾nÊý¿î¾î¿î>í>u¿Ý|~ús÷Óÿövÿ§î?ïÿú·î/ ÿèø~ÝÕ¦îþüåôg[›î§âòçñïÿµûËïö¿gì— ›ùöÿg ×´õq3KÝõÇ4§_ÿýá·Ý»3âV±E]·~o¼ë~k½Ýÿ统ºúé‹Cë©+_¯Y¨¶§•šn Ûv3ùj´Ðé—Òô &om•nòÓÎÕ¡b\eäÙ‘ÛÖT'ÀíuöàoжI8ùqçÚ@ ¨Å“kbö™Óou ]§O0¹¯N~žW*=nñìšÈ-=ÈV)îíeúð¯ë:Ýä§«C¥G.ž]¹mQÆæšBD×éÀ¿uM:äžw®•€\aöCãqµ-ýÑG$—Mc»Ÿkþ{ݹ¼kÓ áëì)PRŸnòÓÎ a<ù¡©Âðgréæ±ª#3oºŸû•?ÅÌapþ`||¾ÿ²{÷l|ÑÁ£Úù©ƒÊyÍÓ_:d”ûï:…´éîÇ—÷¿/ ÷ü‡ý—Ÿwí¡²e¿Åó—¢E_Lƒ¾X8¦€ëØ÷p~©à¾¸'øÎVÀ½ _ t w ÷&Ìfà—ð \G€(ÆÞµ‹‡Þ[w€iÔž¡óñKw%“ß&[Ïߦ …ƒ³¼Þ„æO¾È„‚;8ÌÓÚŒTî«Ê_EåÍÒXUn4ö*sßÐ!´6 ƒuPR[¸yíø‚õKư<°ÂÔ‡¿0Ú*Cÿ<¬¨¢$aý™$ªž$Ìù’4‡¦-Nû¹ ~ ÛôïÎÑ«ë—*Ïó Ç´pL‹Æ¸žÔU9€…Ð9Ku°¦9-4dSc>¢uʱîí¼ëòàlcn݆>iwÏS¨±7HÈE5 äÀtŒï} F 1M\H<<¦¨ÎæðýÃç˜,,jMÀ“óeŠÂ ÙB‹Z$ôÅ‘Xšâ" ƒü5Å¡ªO J)@}81‡ÒWߌq=]tÃa3›8d _ãzâaŠzÊÓןb¤,O|) %„[7qƒ"ˆ -ˆ€©/pú “£Žô’[¶„aî `Žq gÀå!Ìñ Hf „ް¸k e¶p'0ú1EâÙÞ/#q„‹…ƈȌ@Áä„c“ˆ†F—“0=fL”<¹˜ÑâË8Ç4ŠÂ²,²á¾º—Làò ÂlxHX‚@ÀGÇÇÀGg8ss0 ‚³Ù'¤ÖP fHF•¥Ž™ÓâHmI`˜9}€ Ã-ùÞÕ0¶Hðïú{Å ƒ‹QY=4Q˜ Ô¥{é´dâ¸xÛ°Ö…ÛˆçÏ0¡ð5EÕ¥ïšæì–²éÓŠ¡×Û7‹ Ãz(µ‰_¹œþ£Ö™ c4EÙ]™t!á„ cÀÐà@•&ƒƒø<øËH’¢¶” ¢R¾YBÚÏ}€˜[C˜µ)ê>`ÿhüi£ ?%¤ËG¢ÿ™ÈŠqÅ·ÄoÊCѺoÔJ{'TÁ¡A¸GÛ“1â—òÃ9>ð‚ \Ç =Œ4B¸Þ6qj?cÕ3æE„õ‡Æ›ÅGÇ”‚¯^gtŒÛ½À˜@¨Xé›wY§Œk;”D[P/æ¦2 4ÆíÆ„#8P.g+ãnÒ`±ÞB‰Á<ž›Í‰Œ#TÎ…£c>¼üŒóÒXà§) äæµ¶`9·…ðìÍÔ¼ +iÂŒÌ6L %ä…¹|Ö¹¢çp&ÍDPºs‹O¡`;TÍLœ;—uK9ˆ|KAðÜÔbb1f”ê ÎëèÉà++—×é2qT!ü%Ö½5޾êx{ú„ÆhP'Ë“°^1m̾E‰SÕ±TŸ“4'D¼„´•¦0·¡ÈÜŽ"[Ù!Šàc…å]›LúSŒÛZW‘|ï¼°–3Ýš1ÝÉïD}æX«eßI-W¾ü‹_vŸ“Uk‚Ó•ƒ+‘žS é|»¦J˜bœz!é#T°ÛKX‹Â´9¾Áž:FŒx,Eyf°2‚¯4¡¼c$¦ºSà.¥àºEGdÜʦ»Æ]¼ÏÐõÒq­´îËnÕ¡¦F”ru°‹/bPd¶e=-¦ãx}†ÇQ’OºÊ}©º~_ì_Æ)FÉ‘j _ ¡5¿DÉå+f æu.‰Œð“è—™7—ª!q¼êÕO^·rÊ[l›!o¦ÀËPðHC×Д˜{>›†•Á÷[§aT:/²u³¶x~þx~DÖÍÈã…!¬éymúXvlío¾º:HŒ°Þ#&yVà­:™ñ;_” $ƒc³Ãã Ǧ-^þÅ"ŽM; –SñækyD¥l0©ÈŒk_ñZº‘\”°±æ²ä]%ÆlE ßRQ—” á1‚  p‡åýfÓº£öfr=(³W÷ô-ûAzj‡gØJ8çprÔÍîLtKš#OTQ•„˜‘!£û(1õû'U¥ ¦ê–V.0²¼ZOhäºn]› C>I]™cÐÝîÚ§ ðÏQWð¸5Âm¼æJULÊL¦jj¹JÎ2bE™‡«ºº#” &GçÈ9q †ª|‚ªK¬à®g0ò.¨ÀxXqŸÛ[Ê´¢œV›“®ÙnÒ0“4\uºÆÃUÉO½=YN7i" 7&DØ®Ì@¹>Ñ@HxnŒ+ï©5ZÄi¥¹ÙÅ‘85Zàt +_Y“ NÏKÑi)OV ‰­Ê¨R}8«ó¢’ µ1ZDÄs¤7c5æ,6ëì AZTJ÷£u…žÍ?޳œˆäu ±±»qsì±þ¶dî33µ°î S`–)©,P¤Xá>ëÂ`qµWàï3ÞÀf~?Ud¢eeó%cc×¶¯€ïšéWèÌP1F™*ày0˜“:¸7§–6O—Þ4¯¹÷Œ4 ä+æ/XNèîzk Pdk °jnÇìâ”ÒÀ°¶ )ÄÁ½1eëu¹pR‚®…v ÌÓ^¢«ú ¸K& 8ÅŠùÛÆw¤/Ì­w„ Ϊã¸úÛU“Ú3®hßÚ~Éù·Ë?¶}]À„ ³©f½(ûôÓf¥ /Vâû­å6*åG)˜UcI9#¥ïÛ=1E_.B ªMÞ§Æ–Ë"°ÿ!c”¤lÜüÍØðHyðV­á—ð >)ÖðWÑÔ¯*ìFËo–=¦Kì¹Y;-ûb––sÆòªò5±¦·“—á‰Ëß­Ù4I|Ò<ÔW7ó·!£÷§jëÙýl”½Qö<%ÕîËôÑò—îRÿ`4f&ªµfd³'2jZué·xÔÇèùoç*[Aéëïœß5¦¿~÷YH ¶BRâÞ®Ô J†»1ðU"ƒÅÀ&âÊE½‡{ƒ;ÈVHª¹ÊâLìGkȸtUæ¸÷¶£×ÏJL{ æõ³Æ1¶²™"Yãdˆñ2& àë<á{ jÎVeëþÛÍ iVšj Î6×@‰hTHµÍbºÄ1Õˆ"Ú*0— TÑQzÛ鯗g oÖ›)g}íá—p{˃…K¢ÆKljL‹Æ„Ë65æÃ…8yŒA·®ÎØîÞ£1ÁªšX'XUQëM½>8`sN´…' %l«žän€Þ¸7  ÑÀ¤¦NZ˜{ž9izÛ§uö[@M¤Ð2ý©>YÊùá¹—彬‚çg`àÈÜ뵡Ø \1­"ž‰«‚Ú¢!²uëcPÀºM%®n }]ÞU¹a:>þb°+ ~¡JtÝn"R=Q5ŠŸÅܦÎÜ*mßŽÄØR/4˜rá1mÎ5¨[Iz¹ß‹——ÂÀOÌ^Öü8Š…øvFtc.r„Z@ôâÄATÊ}s&ï­Ž¦¬¤[ÕsB’ HN2j¬þq«‰«†v›Ojì Õ=›tq É£´Æøýªšp#alŸ¥¢¤º ×ÛÇñøa'?ų5 ñ3'f*jºä%†{×aig©ˆRdWÚc`Σxæ'‚ƒùIDg±ž)Œ« —&úX® l4ƒídoáÞT¢zwÕõFÛZž}Ü%6²Ë!ýÅø…0©êòÑÄÉŒòÂÓlZÃÃ7v(!7»ãîìŽÊÔC,¦ ? 2Œ¸äw•2«ÎR.òUûµ—ž^‚Íœjß\^¾bé•XßnQIŸ!·åû åRèKr!'oýmls¼l ß÷x;o¿WPKê­©Søµ^*¯Ûy*0œàW±¿åe^ìâ;¿„w¬ypßÎWÛ º3¨ÎFñ±5ÔÒi髇0<_—®„z‹Óü*º˜´ÆU³Üó;üú›¹ ½dä¦,g1$Ô2‡•"ððlX:}€tû` pÃÝ‹°|dtJ¢/† ¡‰;,ì©Ñ¯ÚDaN1Ü0wp°2†…m¦¦¦#ޮȈOªK‰™$]Vî]ûYˆlÝy¶—%3¶®C³¸ÞÈtÀq¸Be&iÄTkÊÕ#ÏáÙðI¯†ß(WmÝì~t¿lŒŠß-'Æ<ñøL=ÓÅ¡#ôEZ1¿]E}ìÖ;‹áUtŠj»µ_Ãå3IxÁ®%¤‰!ºÅ)Ó¯nMVUŸ%·.ˆRg{,—ç¤ëîd×ÚK†‰ —`]žŽ‚¶bɰYÓ"÷eÆÜ'ǾK½|å]á[g«Ù®@¾OŠÍhy¹k/Å ooØO5_¿_ÎåtÝÖ›KÚT®N¼k~ð•©ê]<늨'ETsZ®Œ.ŽñCÀLÔ̤°«¼™’Á™š-¸êÉŠŸº3µo©*éÌ[«?[)edgâ’yé)Àxº‚û‡+ò}„XÌ×E»õuïs_>v"X;°{àß%,…åa€ßÜg6î!æ‰þN9mßöo‚ÞŽI÷6á[+¼”ÙbVª}º¬Ÿ.út"ñòÚøû‹hóƒúÚðK@bu¨FõÏ=Ó¢1!éÛÔã7g±[Úf¸7‡f ™ú‚ÇÀuâ£ÎZ$ý¢¦vPÂ1=‹G¶Íæð¸ƒ¾fúÄlš=·„ömuǨ¶Z À1Â:°ð=.;ïpc‚'øÎF5€ö…¢ü°ô¾7—ÚÚ¾¹êê¸Lá›K¬hØÁ„gDƒ 0™d5Ýt‰%+ÖÍîºÅi·á¡Âc"üP[;xëØÇA¦0ÈÔfÓmÒÀ@”!ì]Ÿó ¦”Q#ÿ(µ —¯ÍpÒˆ*R™ª2üK8:AC÷`: ,ÖžctnµøõQî³Å~Þ@UÏdŒ¦Uß/ýІz ]§ãCâªS%оX榋LæâÂËw¨yŒ«'”ËÚªjÛ™ø®°qõ£!Ö©â…LIÏÙæ& Å0%}6Oeu‘PŠÕî»î;#cîáÆ¢Ú[3-¾ WÃJ• îh1¢MQ¹•JiÄë ]”Œ[€QŸt¹£U0MAÆÒ‘0gt»m¦c>Ó‘rP-Ön‰IŽW´³R¦P†Ô£º#½0m0·@µg…à'ØcD—^ÁÎ`º¬꾎ñÏøä‰n]¥¬Y£^f‡-ßGõ:?è»JºÄ%¸°hW|‹ÙΘuѯêar…ǹ×D\ƒk9â\e\W‚¨Ï)dqâ\¥ˆxIoñð:xoø ®‰ËT `-dóêî ÃÓ›.ܘ*¶8q gÀã-œ·Œï†þ‚+QU…ìó•Ûu¿ö_;¶&r½OsÿàMº™b‰Î¸CaŽ!­SôK(Lñü3¾ë 9{>«=Ø“G}ÌǪñ—Q·)Á*¿Ð:nNÝšÚÛs8é(ª¤ùþº¥n¶O/g[8}=#¾'ŽaðlpL¸l&êèõ•lY‚;þÜí¸ßùSPÜÆ°Ã–6$‹áI dÓO‘» .¦ Šá × †¿á!!ëÆ ;H¸A[˜¸™©Á1ÂÑñlÍëI­.Ü!°© š›R·±‚üB=åÅŸöŸvÿ Ä[ò endstream endobj 2763 0 obj 4682 endobj 2767 0 obj [108 /XYZ 32.2500000 426.500000 0] endobj 2768 0 obj [108 /XYZ 31.5000000 570.500000 0] endobj 2769 0 obj [108 /XYZ 38.2500000 392.750000 0] endobj 2770 0 obj [108 /XYZ 31.5000000 570.500000 0] endobj 2771 0 obj [108 /XYZ 31.5000000 428 0] endobj 2772 0 obj [108 /XYZ 38.2500000 392.750000 0] endobj 2773 0 obj << /Type /Annot /Subtype /Link /Rect [60 534.500000 118.500000 541.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Arguments_nn2 >> endobj 2774 0 obj << /Type /Annot /Subtype /Link /Rect [87 527.750000 118.500000 534.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Arguments_nn3 >> endobj 2775 0 obj << /Type /Annot /Subtype /Link /Rect [87 520.250000 132 527 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Arguments_nn4 >> endobj 2776 0 obj << /Type /Annot /Subtype /Link /Rect [87 513.500000 136.500000 520.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Arguments_nn5 >> endobj 2777 0 obj << /Type /Annot /Subtype /Link /Rect [87 506 151.500000 512.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Arguments_nn6 >> endobj 2778 0 obj << /Type /Annot /Subtype /Link /Rect [87 499.250000 144.750000 506 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Arguments_nn7 >> endobj 2779 0 obj << /Type /Annot /Subtype /Link /Rect [60 491.750000 153 498.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Arguments_nn8 >> endobj 2780 0 obj << /Type /Annot /Subtype /Link /Rect [87 485 156.750000 491.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Arguments_nn9 >> endobj 2781 0 obj << /Type /Annot /Subtype /Link /Rect [87 477.500000 138.750000 484.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Arguments_nn10 >> endobj 2782 0 obj << /Type /Annot /Subtype /Link /Rect [87 470.750000 186 477.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Arguments_nn11 >> endobj 2766 0 obj << /Type /Page /Parent 2 0 R /Contents 2783 0 R /Resources 2785 0 R /Annots 2786 0 R /MediaBox [0 0 595 842] >> endobj 2785 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1409 1409 0 R /F8 8 0 R >> /XObject << >> >> endobj 2786 0 obj [ 2773 0 R 2774 0 R 2775 0 R 2776 0 R 2777 0 R 2778 0 R 2779 0 R 2780 0 R 2781 0 R 2782 0 R ] endobj 2783 0 obj << /Length 2784 0 R /Filter /FlateDecode >> stream xœí]I¯ä8r¾¿_¡óÍU”Ã@×Ò| PÌÁðÁ¨ñ¸1p\žÃüýÑþR”>JŒ RÊ¥ºßKIIRÁØëÏÿöõ¿Šÿù{ñóǯÿW|~üú&.Ίþ_Ñþüt}AU—áïÂU¶øþûÛâÇÛ—·/Íÿ¼õ_øúñÍ_ÿ(TñïÍ-þã?›‹jøýÍI×üþßîwídó—˜~·×{ûÓŠ¿µ#ŽÓ ‹™þI S•U»Œ©¼¯)»Ÿ¿ÿÛÛÏ=âfQ¢vº,¤Ñ¦µQÅÿÿ÷Û_š ÆáÅ¥6RºÒ8qËD²™£Ê©BÊRJU‹™º¦ñeŠÑ› GïÖÎU»ðè<Ü ¯¤•+š›‘šÿ8_Ã>ÁàÊ•éïVΕsdxô曲.…« ü›8wÕÁ¬á™ÒÈæïÃf^îVò™ËÃf¶- gœVeWfþ3u™ïP]K@U˜b)o"£¸ºl¸ð po¢O£ÌÊØ€O¼ƒO à“¢_š+®êmåë½ì™­M²=óÆ>ÓžÙÚ× µ÷´g)èl αauÿÊU³_õ¸ÈûØ,À»ž€Æ™×ïÚø)ïÆ]ªrøÿ¾…TœÒPmc< T¶ê5ê†Cñ«ÔÓè)ôõÚªtƒw+çÊx€ƒ3Hxλ>ÁàÊÔéïVžêœýR-µS¶å@u»É¶ªTó·ÓÿÛÞKÛñä-M°½Ÿ`ðãS Þ­œ*ã†ãÑ9©ÙºúÊñÊyoøð¯L:)Яœ*ãæ.F§é?‹¥¼«+¦ãvøáÛÛÏ¿6̱,¾ý¥YY?a÷ë[‘ŸZ;¢•Å·?ÿ"„ÖÿZ|ûë›”kÊÊÙî¹îŽTÝêRÕ¢TV¼ß¶»£Ç¯\Ý©úï¼_Àƒ,ýØ]0£{Ëþž•8xކ—$ñ—¤w¿ŽÔp%®ñd}c<e4ø>ª†£á$ÌÀ‡ÏÝ{Ѫ’óýÁÅ£áøZ!XS°¯Z xã(òÓ >k8ÞmÌJø•n`s†5 Y}éÖ9[ÐtG:x§äz ô¦9¥Í߀D¨û¹%‰wPèΣªô8Á]û.¿ ¼5¦bÌ-àÜ?"YN‘nqÂGS-½ ²¿ õȢ߅¿À/„:~Å£ÚZ.E°áá±ò'6Ÿ3pl©ëŽ+aç¢jûJxGÁ;Þùˆîè-þ¿&M>ÅËW ~+Àò ޏ³µ¶L›¯Ìi6?0گϵ)FŸgS>CJÁZ\Á×&ðFBúÆ<á1Ñ¢TçA <ÜüMå~ ÉÌsmq%O³Å‚ËHçy.Z­…8ÏFb@ÐkÌÂñvQ¾C"ÒÆ#¦ÅV,·,*Éú4¨„1Œ0KŒ²pÊ2Þ£«ó \Aà EQ±šú\DmÝy6ŸÌávaúœ7žŒ¾]yž-&Ðw@OÀk#˜jó;°lí´7‹Çw0©bžÜYÓÓ i5‹ï~#{À ý¡Ù<”y œg¿U?YŠCž(Ø p0à­¤àáM)®€C€yçXC)ðÚHî+üBèAGgJWmçÛ¿f¶ ŒýºxGnCñõSrH‰P娄O-WZHY}Ú¤ ¤H"y8ϵx Lgk)"!¸È˜E!H%,ªJêK3Ã!ˆÃ ècÇ«+Ó¦?±jÅX[¥D‹R JX) $¹J`¥ô$ÝóEëb.O¢6Ì )ló/ŸÙnŽ®Ü1P­!‹8BÀœk3»(0ϵålGwRM<;D ý [ØA»Ã,Áã/¡½ÞlÙ›¢¬ÿøMö3h!%¶Ph Dñ<Üò८7ñòyv ã2ÉŽ÷ÏïP¶î€!J¤¼Ï¦5š x}xrÄŒTk«ÍõpC‘f{ˆ8wD(w–ãØ·M¡G:‡Ëùº¼Šš@i(bß„o`4ì“ÅïƒeØáã Ök#x^q˜P`4|îv@#HKÀQ<š¦PIFNª¤Ý~;Þ;ÇGE<†‹ùÓ váÙbÔ×öó4Š<¤œX)r ëYMX¦¬âu`mxˆ‰ ΠFÌC°N€¿CyS k¸j,ÛHwêŒRO›M:ÛÔbó¬ÔjöY«B«µ)«nF­§³U¯=IwqµWÓäº# Õ}ðæ)}‘¢Ö³Ñ?Ÿº«g`ÕK)Y/=€ŸàÇUµm°‘®½œg´N‹Ë”Žßô|SEXÁgx{±åÎ3ÀºÃ¯=åtäóú‚nº¶m™žâ÷ésy©*Q8ÑþrRö•/ëª(뱞Ïxåû[Y]¤¬U›j5>å®G?õs4ÏŸMûµÂÿ¶^Ì¡›ïø+ÑŸÒ~”ù{|ûííÃf0‘ ˜È}Ô(÷ûð†¨#¦C™‚U°ënY…€à¥D¯æ‰ð—aÇ#ÁeG D°á(>zàÎ$$"˪+/j„ÈRy}¡-ä$kiú¤˜.ØŽ$¥Q=õW][Ns ºñÊ÷æKb Íé)]φ?šì¦ º£Jµ˜FuÓÌÓ>eæÃ˜ù4¿]2ÍDÜÒ–=uOŽÂÁT±†·”Bœ%i+Âï¿â-<;pÊ ÇÅõ…Ý8®µ‡ãÚ¬áx×$d†|Í•Ž·O 8<3~ÔŽkµ†ãZ.¦‘Kïž2óaÌ|šCq|r:Rp|S•á*8†ç¡”I#ˆ?R5zˆÉ~¢2b$*ç®/ì&*«<¢²z¨¬õ±½¹² ªö©hÆaÆÊ#*+׈ʊÅ4bITÝSf>Œ™Os(QM>AUN§§;n"¹Nn¶É­ª¯/ì&7'=rsjÜœñé ¹² ·ö©œÆaÆÒ#7'ÖÈ­¬ýiš+ r+ßékÆÌ§9”Ü&‡óñ2LüXÁƒ±W ”¬U}}a7+¨…Ç j¹Æ jíÓhg'ñ(¹}j õq˜ñ£ðXAU¯±‚æ—7MU-YA÷”™cæÓÊ ¦ÝŸhÖò)¹R )Ÿ8¹&vCÁþAôq|˜—7ÄRsíFjÉÎMÔ|“ÅÕŠQe>K±bqµRyÖPÛYLæ6Óî)w=Êði˜c´¸ZQ­X\­pþÂ-,®íµqåÕ•Åõ}Ž#-®v ‰\R­ñßɹéË,BÐú2/WVyæÂ¬$(%§l1WŠ<%Þþ\Ø(F‰sØð’ng¡½ ÛÊrä Z]_Ø«YUÍõ!«ê}È.ìnv°»]«3ÝS½¾3 3~¬æúUnE²Ê·"¶W|}¨Ê̇1óiŽÔ‡ìäKï¾R]’r™Y³^k£®/ìæÆy<ÂTk5Ð×8Ìø±ô说kôWúVÒöÊ‚þº§Ì|3ŸæPúscmêבæñøÊaGBœ@M‚Q‹RâŠò–À§hNêÆX£äõ…½ö¢¥“Ju‹$€JP- ”q •¥ X4qñ \†@Ôr|°ع½ô‘¦Wwðþô§ý/‘)¾$n©D JÂ[I¡pŠ:Å{Žb­d(ÀÑ’£‘ÓcqâT=3Ê4¥B–̼jGµJ1¯$N_9I•ž #U…Z,|Ac„ fÀbÌ?1Å ñ }^Ç?)òtQí–Pm²XŠ«ˆ$o ½…oá„) 1ÚÍ"ß`ltÀ0C‘?é˜c -­*µ Ô±òºü|¼ª•¿Î¼2>í6ÔÍkyb 'Š Ahœ\ºU8*á¦Ö•åØTÖ à¼éL¤„*‚ºÉlа¹aàS¶eÁ)j4o}^kæykiß\ͤI‡OlÑ%ÉV¾ªyi&Qð`u†7O*);™HëA÷ÅU#Tꈲï¼õÒyÙ !)¢$=óiì1 6Ù(ަ'Ð@aޝÎõ¦,ÎQŽ”âÀ Ê$ÉU³°(Q„ñÂí5¢ß"¡ô,…òu b\ìKñƱ»¹¼²äUœ Ì„§ ÖK`S Š!>Àa)²˜Uþ<ª3âX,QQaP’´ª3I.ðŸ÷·è 8L˜#—ÒÒÄò Ìj|£”JÝI‘%¬‚¯”x–¾Z,ŽX¼Š–‘«9WZs-s«Š•ìü±O,xe™fC(½‹rYvX#¥XÚ“” …@&¤[LJh¥”©µñòAôÕWC-&qEQƒ—ÇrJS_J" PÁŸ¨ :)Ž7*õpƒ'³)s†‰ƒ¢ËQ¢2åµÔ}[¬x€ö(¥-ñÞR¨?¹ðuÂyÂ7—Ü×-€{®ýd<\Åóè%KmV& ‹TÜš¥e5Çaøø„£ûŽR¿%7Àõ)<æÌÝé·V4f üÝ!’"ÎÉ·ÅŒ Ÿ­)%¬9°2€¬Ä™³FðÆ*²°pÉØÿD™uï0ÜÉ©9Ì/1s ãØeyg€i9ö ¹úm°d®}§‡©4‹ö#ÃIzåÎØæ$jž~4w©+ï;£gn9Úã·‚¡9‹DÑÒQó ¼âvA£;è”ñ£I W=6•Bކ5|ƒßQlÍ7¬ÓÎN½£ÓÕ" ŽR~_*Úiu›@>Rµ‡ä²°©(nøHi>hÖFi;»Õš>!ÑÊúнçŽ;9Ý0Ú9tÿŲˆ±ðˆD €!Û(ƈˆE£|WŽÿ;ŒqâÊÚ&4öã…N,B.Së}Ú¬“K•JúR…¥lKteLÈÝ8ÍbFõª.ÙW©Ä4åpð—Å!ñº3¼€½¨ÅñŽFúN¾3`ÄÚhCQy±^àÕ@!å¥k¼:{Ó§ÝE/¶êí3ºsU.Ì¿ó¯ ¾i`m"5ÇîJžp$\€eQ2Í1UEœ¿ !¹o(Ñû•¿}tŸ ïOýÊ€ˆ‰íÕæ3‡Øî^ÕS“`l€Å>\ ÑwGÇf‹Àhðî>š‚'LÐÑn¸Gý]ÂÏó<0PxÕãçÁf?ü¦ø}°éSã]À»Íæ ØæƒµÜ/¶'÷!|'À½áw,+0`3GïÀ5ù´ØŽ…ú|]Þå@P9Å2„¬!¼$-úÌ)#¤# ~„å“£&Å1Éœ{TNaD¹RjÖb$k=kž/=üÑ6ESÊŸÒx(¦ %Š-WÏÓ»Jޏç{iu²R–‚¾Žv"Í1"eꊕ>›ÉTüÌ¿_5QR–õ¦d£0W5°Tµ}$sœ¥·~¥D¥àÒµÝWJÔ^G†ô%\¦”¨ã ƒ„ÅC±qò:0X­¬JD¢ðùœí¯àÙ„A@RÔz¾À5ïÍĆx‰}XÀ±z¯ðw!hìø÷ xɰb@ii U @°Ý=+TYhSJ5*ا‰ßî=ö,S¼ªJgyvXËí&УÂ<΃÷>º@Ø{ƒ©ûž9刅¡“ûÊzû(!PÞáçI~:Ç ¦3¨QFÛLqxê;MlSÜÎA>˜1 AÊjÌñå•XF#¥zÁdL ’J¸Íwh]¯0fcjÀðÅP|%užš+¾’:_I÷+qRgN¨ÔXW8 3r9ÏU5J)µ.uÜ9å¿ÃYŽ6)c´¿s$ß?¡;\â¤1ÑÙ_9%ï%¢çú‰£O´KÝ ‰’—HqBáx‹%'E‰dê*z„WÝIÞC3=Þ¬Ô’y£Àï³ß#Ž>¹Ë^ª$"9_ƒÃ$jîÊ<†Mƒ)À}ÍäkVö`ÇÉÓ˜ÉSfõIÿcƺӃƸ@¸”«Qþjî²oì z?FŽF@*ò¦!_Cù.ey®#%œDÉ”TˆþU˜82%·=Q Ú-•>½}S ¹ ö80ñY—0Ú]•o u¦jn¤6ÒÏVT?¹ ÍcCHúc=6qר”íyjíCꮚß®Á‘zÆDw{NˆV(2‰)0ŽïAD’Ô[îùÛõF'(ÇÊwx¤Ô~DÂïˆÂ…¼¤À[£oa¡$mrô7cÎH©ów’ÔuîÌ5ÓT© ¼³Zéë¾éµà|…ƒ=P!È6±ÒÛ`lÀÏVEë1‡™DúYj´r™ÉÞ Ê€âSà­ Lè%ÐÁr™µ“ Þjÿ¼*¥_âè©¡K!þLåäî±°M”yõ«c¦´G(ã ºG­Ð_ ätþ ÌŽ/#˜#(E÷ñ<=ίÜ.)eãÔ`,zœõ?t=½„*6áo“%æfN¬Y[Š5÷Ç@ˆj¶ £m¬hÈŒ8±IY¡tLÊy5föCêŽY»}¿ÓŸ_[wð%8âeÛzÂóD„6Ï¡~|õkÞè¹WÜKòslÀ©í5¼~غÃg2;‹w+åVV¾äËÅ#xe"FzÂ^=OxVâ$ŽCIkÜ/þ34J%ý\Ž’»¯`aíaµµPh#_><Ëíe±Ý›ZT9_ÀYå8ŸrJ ¹ ®5«ÈÔ˜G9=êØN›1N…óe|=?‹ÛRü‚þkúPè*¢Ããqf°Ú)¹½Í'ìZrLÍ e‚®6ä„MéY›öä}âõ ÞJR¾ã q§Ëx'Æf(éƒê Ò8°Ç«ð4ØàÕTy»µÓ¹˜E ˆB¡¡€#,­‚—$Ú9¥«KOŠåJ`'©K‡­»¸@ŽôgÒêY´r¿ËR‡ÃÍuÌUÂâž4°" oRH`Õ¿ø›LÑe)ŠÖ]õR†È-´N– ýóŽç=¾ùôáFŒÀÎSôJT5kRuάRNôújóúm^Kµ£Ñæ«Íë«Íkì+Ý6ö½Ú¼>_ýú¨÷yµyç©\·s»Ú¼6?ņݹї­v(ÜÕzÑU}²=íÊŒï*¡^ݯۭèz=QÕ×XZ`\¹¼3ÀG]†ÓæÕI¤ïÊOh½e\[ۯÛ¢/>|™÷% ¸X9¼úâtÂö|ØXy ‰GƒßÔvõêWÁ T„kÿïÅ×°=æs< àÑ0 èÞýõ¥’‡Šq¨wb0\!¶8À‰1ªaäÌSùK‚0à„Å X¯}ަ!• *Ô  ÐüŽ–·ã¸ú2ðÇ}ÈŽy—¾*F°)¾_Þþ 4ê endstream endobj 2784 0 obj 5860 endobj 2788 0 obj [109 /XYZ 38.2500000 416.750000 0] endobj 2789 0 obj [109 /XYZ 38.2500000 125 0] endobj 2790 0 obj [109 /XYZ 38.2500000 416.750000 0] endobj 2791 0 obj [109 /XYZ 38.2500000 125 0] endobj 2787 0 obj << /Type /Page /Parent 2 0 R /Contents 2792 0 R /Resources 2794 0 R /Annots 2795 0 R /MediaBox [0 0 595 842] >> endobj 2794 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 2795 0 obj [ ] endobj 2792 0 obj << /Length 2793 0 R /Filter /FlateDecode >> stream xœí]Iܸ¾×¯Ð9€Ë⢠°Ûî90Ü@Ag&Á 3HgùûQ•–vIú¨ÒW”TE÷xºÝ*‘oãÛøþO_ÿ‘üó÷äýÓ×ÿ$ßÚïO_é±ÈÒæOrúz÷ý/tylNŠ2K¾ýzxM^__êÿ¿š¾>ý¥þé‰Nþ\ÿý%ùÛßë_þØ~èô_…*êïÿ>¯ Uÿ”ößO¿ÿ×á¯H~;ØM×sùïw*ÍJSÀ˜™úõÐ-S¿~ÿöÛá}ƒ€e³h¥ò¢L”56Q•ÕÉ:ü\OÐ Ÿ+«T‘Û"½e¢BŸfÊŠ"Qºªg-Æ¿d†W/méoð3äâXQ&WîÑ%7·2y‹ c< èmxùÁuš{ÜÜ3äâXé6~,­Q¦Ð™=môi“³²ÔõÏ…iÿ܆´m-Ò2ÜüÝð×µpö6ørq¬´î]›µ±¦EPýWEoÃ{<3ÚßàgÈűÒm.]rs³ÚÔ9#(+| ¿Ýúsë‘qÏK#¥ÛZ8¸äν–ô¶…O%\itS4jÒÛâÑ%7·êìÛ*ó~Ö³I}êÛ3äÒHé¶.¸³¦üÙö»á= ^îoð3侨Ö1ºgÛÙ˜ÜúÓÀo£ûØëÑ.o ÷¤ñà’¬œ™÷ZUÔïûEæ‘•Ï‹c¥ÛÛÑè_–Œ‚Ai~üp¯Ž?¾Þ?+›V‰Ê“—Ÿkàš9Ïß^j¤dÉ»úø^(•¼ü˜ü1MÍóÉË/‡ê˜ë¬±y’Vè‰*á;¢£©>±è ^ùx~òù¥Þ$ïø5ókÐp ©^Ž‘ô‰À/Æ"ÞáÄË!H?£Á'Æ,¯TÃ'ï¤K†Ê1v ÆmŸ8Àó<4†Ë äz¼R‡Ä‡RÌà=­Êh[E}›Œ&èÅÁµQFß|Š2:Êè›dt^F}›Œþ$I/QFߟ|Š2:Êè›dtYD}“Œvð œCeôýɧ(££Œ¾EF—iÞÍŠm»OáÑY‡9¼«sO E`Ú´³ì§üpžÒ­iÒ¸‡À”DzJÏÉrê‹žè Ž–Ÿ˜cfó²ÈƤ\^3±|Ti8ßhTøQkà|²(ÀÀ> ]•媸7Aªà<ŠK ç±)=šGÖÖ•ò6&ÒF¹fG£KuAp*E¤Øš S|:G¾SHp=freˆ'xX •Ÿi¾|4vàJ8ÀPCØZvÀòÓ§¦Ëì|Hæ©Ñàª1s9”íP³9ˆ“)&<ñíK`Ö¡ ñ œã¥S\€i½M©î¥·ÑÄìÏ«®R½1ÜiÂ"Ï.Á4jh(AyèmÍ Êtúã&‰LÉC¬À0]]Oê 99@"еE._`c3gL:¯¶Ø™‰ –ÊŒaƒ—ñázIN,ÐaplÙHÁ¼ÁX¢×P!CP>8Fƒëq˜xž9æð¨¢2¥:jÄÕ”½ÊðîPäµ z‘Áa¡†e4„ˆ8qà3™(ñSþ’‘}+¢Å0»b’ڸ͸Â0 ûYJTÌ{S«¼Ëd“ÍæÖðìÂî-GdŒpbÙ6è‹×ø3ÃN9˜Y#VxpøÁáþ´Ø C}e9O} FðL}p‡ñE¦ÎG­÷ìv]“Äœ¾a\§˜Ÿ‰˜>†-UoDÄvxƒëqHH¬?°$†ó0ë1PFŒ¾êTwÆ|k¹L­>qÄñ1%á=ÁÚǽ‰|¬Ï¨šüÖXç`ºÄ+Å4†!ا¬Ù0§±ðà\k»…õ3Ä0N§è’àt<š&$—ƒÏiGa¼²SÛaŸrp}¼m_{µ¬Üq<­ÒÁÒbvÖ¦³³î8`ŸÑŒD~ÚN¸…á[á\&"‹ÃÁX8$KDóy17k}ê¹¢(:Ù¼ƒL¯W/LlœI!ÔÏWƒ´šjôÑ*3èÐ|cž0Ça76•™Cqtvø÷vt=š…tϨB‡¦ŒEè6 욃ùªkf1~!®Ú'A ­5g¤‘¡Ä ƒyÝ¥$h\¼ ±åí4âßÙaÒNÝ;œŒå;ÊéņN!”ÝHoƦ,qÚÎ}ÅGr ‘+›¶ªFÚdÆ®gÈŸˆñ<÷Tij¹~)Ž6“ôãQ›² aL¾˜éðA’ñJ8;—” (EˆX©~\Ë˪Lq¼Œ*oDE˜V)/ê£ÙWQV¨Úa‰úCŠ !K0”¼#B"~÷$Œq±ZIÙjfµˆhÞŸ}…`•é¡\¿ŽÚ"VDŒmÐÂÂ8K&¤%ÊÔ¢bŽDÌfãõ`ËÑ®Ðs¡ÊÑB+´çoÓרâѺ:Ô“ ´û%ò©p G6âà Lñ÷™·Œ0g1-œ£| -ß´k™¨jòvÓÆ²Ï‹Nµ¶6†J‘3²™&ž´þ‰ì¨‡–Íñž§Bï´ 35ZcHžòè+sÙ L£'-ËNѶʎ=aÜ¡Lâz”«>(©¿Åë()j­P_Ÿíð@ÔueX+Íìní3`s»U¥]‘º#ŒGp#øøàRz&öPe½‘½¨TìéÙæ7KŠJê½gi÷S-pªmæ*°PYôÂ9ØÿvK/cÙ*ϱ"Æ!/ZøâtÞ[Àd³ "=*±,͇ZlW馌Fº¾7䯩ßDáÖóÛ…ñî/a  1i±Ô>Ï\±I™BÛg8°ãh¬A$OlÕfÒþº2*Í›I,Åçh&‰—H#f¨<“¥ŠpžLÚ_ó&×ÎÉíY0êíŽ$|%ްÑhڀѴd¼ÕO\ÃqA5æÒ[ŒÊú 䨛ø{U\Ñ}:ö&ÞiµÔÆ{UÙyHçž´þo–OBšæÚèY*ÛrGÌ}ò¢ƒ€<G7À6:ûuÝ×7ÑÙ×èâ&‹,ʱ(Çòpà4(I·º «wÜ5Æö¦óê :^ZœÝoHŽr^íáfoٖňjŒ”]W:’E*­pw¤ebºÓ^O úHYg°ƒ˜¦}¢°N|ôšï3TŠL *Ù++"ºå*<_/ÿ‰æÛãáúÂTcªâr¹ËŽ˜Ú¿9ŒgâP‡B-zш…µ[F,WÞÝVÊØ>Ëpm¥`C#ܺ©õ[+Û¥w¾½C´ˆŠ §œëÙpÃ)cß®¢ §bé…Ë @QÝPDÊ@d+n¶œ³~sª}ÖMøuÒón§sÇõ:>zyíR¥Šm½êµPUJëWe*›Öwžo°ºuÜOŽ‘"ÌýZŒù„qŽGcúL7@íên(‡™†Å>Q÷¶¤Mb -É\ƒDù½™K¶ƒÇ»fUišT+>I‹CޮĒ5óW?Æpª”ÚÇg¬í¸Sq&.-j¼RÈaùÈ̳çó’o_¦ú;ÇvÐÒÃËý·>¤*X– ø:Ðç½ÄTLÍòA;¢Eé›Â½ž¶r|Ì—ù%³NáwËýj·ò´³Æ7ÝopS{R%¯5ò{óeîW(ŠrjãLmì¤êdK´½ä§) ÞH¿bÂrnvHõ9Î0Þï|ü¤Mô×Ç|ŒÔ êOh3w‚í¹])j,„Oyv¨ ±=™Ø |À粉e(<|§=©EKÿ®â%¸ÓÏ5ÄäØàú¼œðh˜L‡ïæ÷ãÓ.>_-#5¸­Cê;‚Â.81&5LŽyÊ!Hç:‚¸hýÔ;p4¹¬58'Ĉƒ/à;ínÜDãEj­|œ v3±Ø~¡)æ´Dòåð“Q/Ë endstream endobj 2793 0 obj 3485 endobj 2797 0 obj [110 /XYZ 38.2500000 489.500000 0] endobj 2798 0 obj [110 /XYZ 38.2500000 141.500000 0] endobj 2799 0 obj [110 /XYZ 38.2500000 489.500000 0] endobj 2800 0 obj [110 /XYZ 38.2500000 141.500000 0] endobj 2796 0 obj << /Type /Page /Parent 2 0 R /Contents 2801 0 R /Resources 2803 0 R /Annots 2804 0 R /MediaBox [0 0 595 842] >> endobj 2803 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 2804 0 obj [ ] endobj 2801 0 obj << /Length 2802 0 R /Filter /FlateDecode >> stream xœí]Kä¸ ¾×¯ð9ÀzôôÌ3@Ó@AÁl6Á"»Hgùûq•åênÙŸl±(Ù®ò4fº§]–(’")Šwüö÷⟿ï>~ûOñÝ}ÿøí$ÊÚŠþOqþúáõ/TSºŸ‹º±Å÷_NÏÅóéëék÷ïó©áÛÇ?w?ý¯PÅŸº¿?ý[÷Ë݇ÎøåT˺ûþïË÷¶–ÝOâúýüûþò»â×óˆÃt˜·ÿÿAŠª‘â ÆÌÔϧa™òòõÛ÷_OïzÄÍ¢¤®”(¤Ñ¦­QÅÿqú©›`^”­‘²®L-n™¨Vç™ìyÕžgmG]¾x†— ¯­J7ørv¬t¤•áÑ9‰Û‡ýÖ&ÀÐuôèoÚ&áàgȹ‘2ÎIÙÖ ‡ž:‚^†çÜH•nðrv¬ ´Å£3×(Uõ²uô_GOA[Õ¤É=äÜHq¤Åƒ—Ñ®QÖœ©|¦°mºUv&‹vn[•Tdjë„ Øè6¡˜¸@žŠÚppÎ}l:óµ·­DÛêeøدZnð äìXh‹Gç$nmìK“E/Ã'¼±éŒ«rv¬ ÄÅ£s·•ƒ`ëþò£èexþÁ­hÛtĽ@ÎŽ•¸xôÄJØv_é”ðËè)è­Dnð 䉔0œq+[#‡J §_†OýJ'$írv¬ ´þ5f Jÿà„{¼øáéôî‹4U «â駸~ÎË·§)¶øáìyë ç‹ß ¡>ü¡xúùÔ–•²ˆýÙ '?iá“÷ñóÈ >©á[`¥*~…aûß8äÑ>?uŒšœÇ¬~<ÃPKøbG|<ø2_vŠááøRs_x=÷Íq_+géˆi‚9VC~Á´ðØAÇ:Öòºn,¿ »N|>d~,µ©ŒèIÕ Æ®ÐQWöÏ ˜½ðnʦoŸ8´O=é—Ö,ùh¯ÉMitðB‡Þ.ºÔª‘ÝKKF3h´À2*ôÄqÏ¢Âeí}Tbèëx,iA Æ9m9IhÃGðFµÿQ ÑU?¼”¥5USÛÛÈ#ì剻m4^Ö PÏÓ a;ìÉ‘Q4µRŒÂ<¤õ¼_¼±Ô‘¾ƒ—Žçù—h Æì<‹È„ZÆ ã©™]‘Èèxa^wê>j4-}Ù‡u–Üpx,ÈÿÀ ÚIjK‘ ñ wŒ%H¸Î±8öÍŒ‹ÀŠñv'èó9ßá ÑõÀÛøØQI9úÃE`4øDëøw¶|œÅØÑop´}âÏó88Àew£Æ8À¸þQ ÙjžZ¬ ŒFp^à½i)¼ÜfÄ|÷ÝÍú)µù霭ö*EYÕr¡öw·Sï¸Ñl)ZýV=¿‡£õL.Õðè&“2 ì±QA8r, <ÚÈÎ!؉›"…b铜Pì[ÀÖ-&† ¯Û‡¶/‹­hÊQ<üžÎ 9Mä¶n‡5ö’Š7%°ù ^S¿£ª.€hŠÏ®'…M·Þy b2°ù׸éŇ í ¼Å·7 ¿ƒ[Ø,Æü‚y s>¾b3ÒÇa'÷)9éÜ“<‘dŸn £‘–‚ŒÇ #l{‹dƼaÜN¿‹‡ iÓ®ƒÃ…t¸.l?Ö"ʉ•ÑabDÝÌëŒL®#í`¸\”›èÕîƒ"‚3–@. W:ø>¾8¤Ä,´ ø¨°›„×…Cº3… ¸b&Œ ‹Ï¸’…è €DA$ËŽÃñ„¨®Àñ¡'Q¶T¾ÍGÃï8e0õN ßÑqU:^QÇ”O^…òž8WKUj©ÞÊU—r1Kà“f0Énš‡jŒQ<Ó³SÒ §ºÔÀ2EÓ~ÃÈjPH¾šš¯¿ƒaËe¤›Ê¾EûD¥’‘ÎÇŠßÁwÔØ~[½VILÒ ÅóQþŽåoù ˜GBT;å2„9ˆs—+Ä–°R’ëx—qzÌ]J|•8œ™¥,s†z¯ºò5ßê12:S¼7”À³Õc‡GÌPí”kGBTö6k/+‡lë ôDÂuq ?û¿yü^Ë¿î´Ð=ÒäZ sÓ½pîó×b˜Ôoé«)8©}À®…‡Ù÷Uòûº2/i5K­ÆºÜ#µì5ÓiŸ=àvG“™ËˆZ]ë®SŠ mS’§ÊRü¬,nAŽdçÄõ„¶\…¹ÔÄò¼¶lý3ù/è©ÛõnýR-rõÚ¸KÛÁ$Íc¬ï,¢>Ð’†Ǽ‰&=¦nëycÅoD›‚…@t+sÖ©mäàEÎV¶ÊÔ”ü=‚µÍ7E4J|`ëúCbH"G°Ì,w¡ä÷Ȳ¼X`”€¿\ÿš5²ö4ÞýËÿ;= 2÷ùÛp,æÑƒ©€}NBkŽæs#vŒÃÁƛϵÕÑ|n´§`;šÏ¥à¾f'ÍçÎ3Ïî0+ä¾K¯éÃ!}` îJÛ±ãüîfsd.€ÇÖÇî>v÷îwwæÀ™•äKøbÂJ=9šP%I´~!Ì\>Šˆ‰Ñ!ŸÐâ(¨±Dêüµë4Ĉ¶¼E*cÚ-Gsù¦ÕSïÄóKêΆö)i‹ƈ`ÑŒþ<+óEÉÃöi‡á²@³öDvîí !q!'âLmÔø„Ã{.Ã+žW¼°÷—Õ/LImÁx ¤vadêec•nß2˜Tƒô_¢Ý8¬albap ë=Ö åê¹Ñø‚€½ „õxø~r`”ÕÞÚ6Ðc.q’õ“S†7ÞÓ1'ÀÍx’dN¤TcÆß'¤P-ÂÚ{ ŸÒ0¦X’ ¤”! 0#GøJ`R ¥ë5%Æ+¢ÊQ„“ˆäÁàèºØF¼–OãóÆñQ:ÜŠ¤axžˆ2DâÍbÁ”ˆðáE”Ý2g ‰‡$GôÎÔgk|z}+l5—ýãm˜õ"–3ç’ .,äYÊãò&phtf©Å‚%JòÖTn‚¥çrV@ Q®<ƒsë(—@y£ÅÖT¥ÛS0p´³BM ¡aµ¦ÐtŸU 7¨|%[‚&l‚hiÞRuJY0ã¬îrΔJzV°BïÌz2¦ì xº–΃ߩàü„ÍåìOÑ»9lMaâCà²z¢ ÈpšnZòù‰²dU(ëo »q„¨Z/&Ýú~–+ü$ Q£ñv›‡Ÿr¯öñŠ7~F7Ó;/»V6닾«šŠ¸ŠÉqÜú8ÎvC 4&Ü$Rœq³n‡%g%žˆJÞ>ŽÒ9Ëùd'‚»\/+[ŠV¿]à{8Zê‰Ô\ÞÀ³ˆ`‘Æ"•ÄÞXkEtyÊ é®‘õÙ{»ÉH ¥qSW¾4fé½EIà‰Pµ†^.-1ï“â±±ÊÛ€(ÃL§ˆJJ*\ «O£<·¸mb‡Žˆ.Œ¢“áý±rÌħ&m©F'p8~ÇUvœz§Eïh;HÙÚóªÈ®GC¨ÅUãxšTÁ'6ù½€ ÇNUj©¼ÝŸ8ŸÆÔJû½U—zÄ®ø¸R§Ñ¦ À8À£)Hm‡·jØK ÎUÕP·×Òð¸…èZze¬¶o„€çâÊ5àÇb=~?H’RÒç\\ÚˆR†Pê_±[Ç~¹Ö[õ®®„S'e§-‘ÉëŸÛ£Ó2¥"²µÇÙk"B² Pߟœ´ƒIìã5ê–ÂÀ'kÞRØÚxk›U~‰‘Ý(Ù¬õ¯·I†jdD’ÚÏ¥HOKîj¤ïç°V¾<¦ˆÅ‘l œ (ù Iº !è½sõ÷^á’õâ7H9àÆÏT…€¹)ö5Rj– ä0—³¤lQ ‹ w(†Ò½™pɶ«DªœEšÏxŸšÂàæ&ð´­±¤4ý»³ö*âÐ6ܲÐz1PÒšR:›ÐjˆB¹@Ai\žRÖ›Ò ‰P¢;Ð81_+ÉNšUÃê¶âW{hé°™ƒdÜÎÀ¼ü0”Û§\×°©iÎV~Vxñ÷c½`š`m‚½ ¸Å ö^&4‰Èf;PX}oªÍݼ¥çÖݔٟ^s2m¡Þ쾊çn÷è×¹,pH6SXK] yöÇêª_qrQw=ááèwr¿F–Z5~âð£ÊÊvQ=8nb=ç?›‚í‹[)rIá›eó’€ÀñD£:VÇ.=ìZŸX†Ä£Áwœ©$£–þª/;•áÎ?wc'îçxÀ£aоûß¿fB˜/ f5H w1òŠ¡ð•œ³fŽÀ<Äy€ .†ìÒ‰wàhî2gXLˆ‘À¾€ï8jÜÄãµ°¥“Ì®'(1÷ÄiŠ9-Q|=ý³Û- endstream endobj 2802 0 obj 4055 endobj 2806 0 obj [111 /XYZ 31.5000000 688.250000 0] endobj 2807 0 obj [111 /XYZ 38.2500000 505.250000 0] endobj 2808 0 obj [111 /XYZ 38.2500000 405.500000 0] endobj 2809 0 obj [111 /XYZ 38.2500000 646.250000 0] endobj 2810 0 obj [111 /XYZ 38.2500000 505.250000 0] endobj 2811 0 obj [111 /XYZ 32.2500000 686.750000 0] endobj 2812 0 obj [111 /XYZ 38.2500000 405.500000 0] endobj 2813 0 obj [111 /XYZ 38.2500000 646.250000 0] endobj 2814 0 obj [111 /XYZ 31.5000000 260 0] endobj 2815 0 obj [111 /XYZ 31.5000000 260 0] endobj 2816 0 obj << /Type /Annot /Subtype /Link /Rect [60 224 91.5000000 230.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn2 >> endobj 2817 0 obj << /Type /Annot /Subtype /Link /Rect [87 217.250000 130.500000 224 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn3 >> endobj 2818 0 obj << /Type /Annot /Subtype /Link /Rect [87 209.750000 114.750000 216.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn4 >> endobj 2819 0 obj << /Type /Annot /Subtype /Link /Rect [87 203 132 209.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn5 >> endobj 2820 0 obj << /Type /Annot /Subtype /Link /Rect [87 195.500000 136.500000 202.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn6 >> endobj 2821 0 obj << /Type /Annot /Subtype /Link /Rect [87 188.750000 177.750000 195.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn7 >> endobj 2822 0 obj << /Type /Annot /Subtype /Link /Rect [87 181.250000 180.750000 188 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn8 >> endobj 2823 0 obj << /Type /Annot /Subtype /Link /Rect [87 174.500000 204.750000 181.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_aspects >> endobj 2824 0 obj << /Type /Annot /Subtype /Link /Rect [87 167 147.750000 173.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn9 >> endobj 2825 0 obj << /Type /Annot /Subtype /Link /Rect [60 160.250000 122.250000 167 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn10 >> endobj 2826 0 obj << /Type /Annot /Subtype /Link /Rect [87 152.750000 138 159.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_defining >> endobj 2827 0 obj << /Type /Annot /Subtype /Link /Rect [87 146 129.750000 152.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn12 >> endobj 2828 0 obj << /Type /Annot /Subtype /Link /Rect [87 138.500000 138 145.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn13 >> endobj 2829 0 obj << /Type /Annot /Subtype /Link /Rect [87 131.750000 138 138.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn14 >> endobj 2830 0 obj << /Type /Annot /Subtype /Link /Rect [87 124.250000 149.250000 131 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn15 >> endobj 2831 0 obj << /Type /Annot /Subtype /Link /Rect [60 117.500000 120 124.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_pattern_matching >> endobj 2832 0 obj << /Type /Annot /Subtype /Link /Rect [87 110 141.750000 116.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn17 >> endobj 2833 0 obj << /Type /Annot /Subtype /Link /Rect [87 103.250000 163.500000 110 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_typedef_reductions >> endobj 2834 0 obj << /Type /Annot /Subtype /Link /Rect [87 95.7500000 171 102.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn19 >> endobj 2835 0 obj << /Type /Annot /Subtype /Link /Rect [87 89 157.500000 95.7500000 ] /Border [0 0 0] /Dest /#06#dd#0f#40#fe5f#c7J#c0#bc#98#05#d1#a3#d7#1ez7#f3 >> endobj 2836 0 obj << /Type /Annot /Subtype /Link /Rect [87 81.5000000 201 88.2500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_matching_template_comparison >> endobj 2837 0 obj << /Type /Annot /Subtype /Link /Rect [87 74.7500000 186.750000 81.5000000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_debugging_search >> endobj 2838 0 obj << /Type /Annot /Subtype /Link /Rect [60 67.2500000 118.500000 74 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn21 >> endobj 2839 0 obj << /Type /Annot /Subtype /Link /Rect [87 60.5000000 103.500000 67.2500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn22 >> endobj 2805 0 obj << /Type /Page /Parent 2 0 R /Contents 2840 0 R /Resources 2842 0 R /Annots 2843 0 R /MediaBox [0 0 595 842] >> endobj 2842 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 2843 0 obj [ 2816 0 R 2817 0 R 2818 0 R 2819 0 R 2820 0 R 2821 0 R 2822 0 R 2823 0 R 2824 0 R 2825 0 R 2826 0 R 2827 0 R 2828 0 R 2829 0 R 2830 0 R 2831 0 R 2832 0 R 2833 0 R 2834 0 R 2835 0 R 2836 0 R 2837 0 R 2838 0 R 2839 0 R ] endobj 2840 0 obj << /Length 2841 0 R /Filter /FlateDecode >> stream xœí]KÏä¸uÝׯ¨µ©I 0ý …F7à…‘EÐŽ30fŒt¼ðß·¤$>KºEIU_˃¤¿"%’º¼/^^þü_þûú¿ÿ¸þüþËÿ]¿Ùß¹T7UWÃÿ®Ý?Í ¸¾Ù¿¯J××o¿_¾_¿_>_>·ÿÿûexáËû?¶ýóʯÿÙþßß®þ¯¶ð/ö¡îß/Š©ößßúbí_ÕøoWþëåO¸þ½kÑugãÿþ‰UJiÖ ãN×ß/î3Yÿß?¾ýýòó@€u½pV× ¿2)ä•ɯÿÿ?—¿¶¸æ«›‘Œ©Fªê‘Žïz’¬í„›¶W.£ŽúÿÊ4Ï6h¼j»Æû‘§  Ë·^rr›Ž6T³ù]ë[_5õ†ŒÓ·[˜(njaã7ÝØÿÁ¿‰]ë®_]·“¬ý{KžjªÊ8…¡ËOÍÔüóÞpÑl×x?òâT±\•i½ää í¤NmA¢©ù ¯ë ïG^œ*nrqë%'·©™%P«ˆÇI45¿AãºâÛ5Þ¼8UÜäâÖKN®vÜ¿…©ŸZß‚üFlçG #ßÈÔãÆÛ™i*¥%üûSßRÌ@S¿SÏ Uµqϲ:ªgћ޻e’׉ž?¯iƒ:Ì¡Ùn•Ëç«\~•×x¥ûuÄUo=ÉqOÙ®«â¶ _5‘[ò±j»ÎÚÅ%¾¼ÈœiQ±­æ,lû‰æ¬¿ÎÊ_hÎ6‘³3<Ç„™á“»ù2n¯1Y@wý26Ø<;kö×ö‡ ;½š÷æfûÝ×ËÏŸ˜ììÍõë_[ >аÿçkë˜Öןºoë7~ýËõßZ×ÿ~ýú·‹¹5¼v$¿WÃ$ª ¶ö¾SÁ~šõ#¨>Ášw°5 ßùeý8¤‡ïd¾ÇF ¿”ÚŠ÷5¿¶"¹9÷™ÚÍ=ž-È/• ÔÀ~8a†Ÿ™Ç‡ï`9ÃÔ£–^˜ûž˜¢XjÅXcJI¥vEÚ‰RÓ˜Põª¦îÇ3‘cP£ú¦MÔ¼ïkäMŠa4%R[ÜjÙhUÇš#Ñ<ƒ5Vºë›àš-R¦5ü°VÁQ¾T 8<6‰j¸_zÛêo¦tÈuXu@Ã……üŒ9(öáè«»ÿ«3L*áÕ­°0àéås ¡ˆþ.6É¥1n«H{ùq?çFqñl²±Ê2ìÂÜJGMøRŠùÎÐ º»0Ð%+ç&,àKÉ_›/!3Ž v†á¨î‡Â}„囀t{Í%IÆÞËMVFÝu“ ]^±Þ cC#L8còoêÜÅÏXî3`O—â¹gÞ!ø&™E‹Zî+Po ÷CY6ý~¦R4¥¸U<Ù°&‰ŒÑ>òPጒ ÀŠ1VƤe(€—R:ø3p?üÓò5ÆrñÅØˆUjU kÊ,³6_‡Ö‚Æ,óIX‹a1„l´s#Å`˜]± cµ‰MȽùMÕÀd槨eÏôC¡~g/CNà7R”s'îͼi@2pE9q/êP¸—âWQè¶W šbÂ3²š­Ì„»'jÛ4LÓ„‹ºg‰hlhýY»Ž>û\®Ó¨JÍ‘¾¶s‘š#ÖÏ–]a—rX&Qc? ¹ÙÅ¢w z‡<ÂT¤Xø0!LÞÂH®±¢‘êçüR¿§‚#€5øK­4¤¨ó~ì‡ø=ƒªV7£ÃÖDÌ_ˆ:™ÀQcºáÖ0Ý2­Qfò[õa= ðØ–FßÈûßMØ¡Íìl”å<6Âݸۂãé–¹`§5Kæ*3BÍ©ñ(¿WŽÔÝ›$Ù¶7´2É£¶Þ¸ нPÛ0.å\t|$œ’r2øølÖ%@ÓÇÃËœÅ-‘åeÅ} E2eF²õ~TBJ?d4åpîŠI'¤ÌZÄsë8õ))ƒ"áìù¸=]ÛmšC¯ÌÛn7~PrŒSßzR6ÑŠ#G%,.){;øø’ðøÚ¶´xæ„ͤüm¦ºŸ!MnÆHRèW4IaFQÅØÛÀßs`ò<£DhW\ê·üˆSa®)š&rvŽtzo§,>…•{‰Û«I)›ÆÌav„2—dè·âˆ0eyƒEáÓbŸ9¤óßU$eØêû³v#juŸüô³â~€bÁ¼v^üŒ´4ÜŠ´še×xu‡&V¬€^éîÒLâ!BÜ”¬×k–x—¥Dº¿2®DÙ0KÜÖpôår¹¼]ࣂ=>o~æx²º¾eùÁ1½sfÀÊä¬Â¹±p?VÇ'Æ–¡õÇ;´ÞÞ ƒxîµ—úÃå 9èÅìWÙýÑò…r3eHúm¼E»æÊ2J¬ ßÝA_ùãaû·v4öx€ÚYóÜ5øYØG8›i î Çã㤄XIIì„`+~‡5Æ:z'¾úî£×Ç4oíèåñzã¬yîšS¯gõ-ÅœzýYôú˜Žá< Z‰«æÔë4St§ØQ§ÇðËê´3¢qÖ<{Í©Óh¾êÓë´ñ ùk¦¡8^2ΚW­)|”úðO£;wÑ\5›h®ã¾Ÿ5gÍ®šëLQ8 %Úøš_ú4é.R´Æ#P¥ìÔäbmÜ EO€\$ÜÝé Z1rß'I¹iÒ:(…PˆÖœ·”fGGÁ¶bÄ'¤[¦5›E®b¦oË î Ê·Œ(;ÇEÉ•ñ-pžE|šç‡ÓZ™/^q¼÷I/â΄æ5|y|±NÛM‰‘˜U+|5%}‰„«žRŒn™ ˆÕ¡Õ*‘.{j}üì7˜7ZúÒžbí²wÀm!\ë¿x£oxœ7åæ(ŠGMØF¦ÌOº7÷6d6V(÷Cà9Åü[{྘]tªÜ†ùÓåB›žÏ ûqÀ‚Y9\oPtt†˜ßv¼ZIvz§Wñò^ÅkB"(Åi°«ïÐŒzì%}l…_““Þä‘ä;`ïÒ:£ñ ÚŽ4s„›Äöð*îìÎk1^H·×î|´Zä¶ ¼uGHÕI‰Çïq.{¥X±v9–gßãÿ”‹(H®a4úøôxlöP*¡5Ž—Å‹ìDë5Œ Û˦Kßk/13•ôlÈî´®¿2h‡=÷É®e¤ºìE:”tÁ‘;\m‘ I‡+§‘Ò¼‹ãsΗñH6¾aÛ«ÖŠ ºVÀBH÷[P6ˆË^}³“,’ÒÍcUŒÓÙ–@ëݽ1dÓÛxThÅ~8L3骓-@¬ÛâX¥y¸Ç¡渷IÙ@ÝË8Y†å(ÖigÃòVN+°oEW8{"z´ÖÏ&ž?ÀŽìž»«¦R¯=Ão,n^nîõUð$Às˜wãvÕÝY^uS&u~B5¾†~øff¢À©;É·æNòÅïTxq}“µð‘•|}?ós˜¬Ó|°x>¿r¦*Ù6Þ’ãw÷»®nZWWÕÿ£ÓC)¿6ýƒýÜÛ’o—Fß3\k6>¥æ­Ø_¶öyû»í¼-UØG[ò팤-s#Zñ¿ãÛå×Ë»?x4aMØ2e+@ȲcÒö»]Ž:|8)ØB¹7 £û±'Pµº»æuC¼Ù’³§fcy³5ìó‚ß._ò¼ÍäÐ@Ëa¶W`z¾d’[¦êKkK˜e=Wò­}©² :>%Œ×Œû©-ïªgÍ ¦ »iKºn¼ÁôOI¿éwókûý{s8«›ÅÕý­È­CZE®œ^±ÀÒ·âÔÈãRÑMA?µåj®Ä¼`±Xhˆ…Ö)±0Uȯ¦ŠÅÂLràšq?U ºI‰…®ÃnÚ’H,ú§¤ßŒô»9T,ŒØG,2'4(×9땼g¤ã=ÁæKyUÏ{¬R ÞcÝ2ÀcŠ®$ä½þ©·ÆfÜÏÆç=VÕ Þc•Œº‘ï OI¿éws$ï1æÒ_à=kRX¹lÀ™¡0ûúKv ICDà=Ybíg9=®æ‹e‰×,ñ&%K\‡LÞ–D²Ô=eeÅ5ã~Ö,q™’%.¢nD,KýSÒoFúÝ*KÂ-3m®°Ô‰Z¬h>_ºÿÆã±æˆ îDÈ2¡-X,BR"$딵«Î€·ûµi ÝSVD\3î§ DHŠ”IuÃc꟒~3ÒïæPªƒ¨ «oU˜# Çc(ŠýDèqp²H¹•”r'(e7ïM©«Y†µú«fVýcæ‹õW#ýÕÈ”þŠB̆<õÓ=eõ“kÆýþjxJ5a ¥+‰ôWÿ”ô›‘~7‡ê¯Æ¼-ý%+»U‰\'§Î;uÞC:OUVeÉÊ+X¬ó4tž)Å•˜+y*«{Êê4׌ûɧYJçé0JÖ•D:¯JúÍH¿›CuÞ¸o^1B(›ß„€£€w);EN~v §eo°&Ö¤Ãw1¸¢7‡?iY®Ù´ÛKm{Ÿ8ÍV^~Å€Š˜ÉoæØ e‘üˆ”]ˆ’!òñH\0O­IR,5q÷L¯˜o’xÅ&‰GáfnÃÍs‹Ò?5˜œ±÷“ù&‰WUÊ$™(xnLl’Ìhƒ¦f¤ßÍ‘&‰O@Ÿ½Î<–€Ê“¼ü¢‡IÎi‘$•Ëãë$Ï“¾±X…óÊ!Óó‚ßIX ´áܹ½î7Km8†÷At*Ó?¥æ­¸_•´áÌ$€6¼í*èƒéhÓ•Ù‘ÚVüï8hÃysW9<ãâéiÎ[gËòsp¤X!ñȆÁ€(âÜ!xÍæ‹ ½0¡—UÊÐG|nùž¡ïž²†Ü5c z¡†ž‹p[¢+ ýð”ô›‘~7‡z9‚æ>ÁP N|KadÌO;íÊÝ=¶ôRa¢åæU:ô7b^°XþêÑÇë¢GhÞĈ¾þ)+_µ‡èsÝLòW§}¼Ãê]I$õˆè›š‘~7‡Ê_³¢ï0[º0x÷»–óz3ÁôªyÁb^WL«LGH®c˜Ÿ1·kÆý `z\¥`z\…áÔ®$âu5Âô¦f¤ßÍ¡¼®L/sÍ9â §!ÙÔh½‡ÈM€Cä&…CäQ(…›‡Ø?e…Çx8D×Í$\&…Cä& ™‡8<%ýf¤ßÍ‘Â%*‡C¤8r¤| ”eÆ)ËŸ¨„/®`©ü `Ka»(Œ/‚ÅØÅþ©A¾ÆfÜÏ»(X »(Xˆ]ìJBùž’~3ÒïæPù㻘ÁS¶Ý"÷‰’¢ìvÎá±Ô£EµzRp·‘Þþ5/x8Ø)„3Ïîwv žø}øÂWöO©y+î—;ºß"ì"<¹Ø•„ÁήÌTÌ‚SG;…¬îËõ‰ïß ß_hK)“֌⭋ƒ éö+¹ô ›ï:ÀŠ:…;Q€DÔ1î°ÊšçÚún&ó]§p‡¢Ã=]Id¾ëw85#ýn5ßµÃò1_qÀ`E>»S@wPg›·]ØzÖó‚Ū”œP)”œˆÂ:BÅ(¹þ)+ÊCɹn& U)”œPaª+‰$T(¹©éws¨„ª1»ÌÆ‘RŒI¢l„”Mõö´yÃë½¢ª[®NÔMkؼ`±:1ÂI˜ÂID,ab„Sÿ”UÆC8¹n&ubR'¡Ã°\W©=éã!œ¦nU'Æ!œÊn|fÖŽ›Vô>Ôg\6¿)•ð6¼3°t5/Xª®$«|u%K¨+Åý¤û͵MÿÔ ŽÆfÜÏÊWW²2 u%«0ŠÙ•„êjxJúÍH¿›#Õ•dsÅ”‹² Šø—ºÀ¢S8ù8%Ò <˜Å²$ÙˆyÐή`;T:·¨ô‰c^Ë ,ÕVA[måäuªLòU&E U&Eˆ*“"F•õOYm$š:‚Oten¤Í >1õq$|Bª‡0¿„­˜ŒîÁj—5 Ä:Ž?³õ, ™¥h ©F°±dó‚Å®™ÀÆR§ÀÆ2ÚÕ:÷OY×K{`c×ÍäšéØXêp¦+‰\3=‚§f¤ßÍ¡®™ÁÆ8cÉç>¤¡±›tÜòùòùú½ýø‰k´ù|ï÷ùè¤n qź ë+—>õR¾È`]UB²†äöüƇ;Fg5Ãʯ‰klÄ–ßì†ùTÃÔ–P?âÞ¦TjlŸì—¢ܰË!CE„7‹šø-á»°[™ø †[ƒïXÎV}ú,-9•ếÛ»‘c³øq= àw0 Ø,:)ï1ËÔhDU»’K&²ÃSƒy<ä×»ó‹·äÆúˆ¤:æZdF 7B!5eJ1/A½’5›½Ü@.˜ ÌÄ™!á¹yVT¥¡*y³'¡=Dâîé•~8w­êçëçË¿YÆ„ endstream endobj 2841 0 obj 6226 endobj 2845 0 obj [112 /XYZ 38.2500000 422.750000 0] endobj 2846 0 obj [112 /XYZ 32.2500000 477.500000 0] endobj 2847 0 obj [112 /XYZ 38.2500000 422.750000 0] endobj 2848 0 obj [112 /XYZ 31.5000000 478.250000 0] endobj 2849 0 obj << /Type /Annot /Subtype /Link /Rect [87 778.250000 164.250000 785 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn23 >> endobj 2850 0 obj << /Type /Annot /Subtype /Link /Rect [87 771.500000 132 778.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_special_variables >> endobj 2851 0 obj << /Type /Annot /Subtype /Link /Rect [87 764 150 770.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_special_variable_macros >> endobj 2852 0 obj << /Type /Annot /Subtype /Link /Rect [114 757.250000 159 764 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_special_macro_descriptor >> endobj 2853 0 obj << /Type /Annot /Subtype /Link /Rect [114 749.750000 197.250000 756.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_special_macro_typemap >> endobj 2854 0 obj << /Type /Annot /Subtype /Link /Rect [87 743 195 749.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_special_variable_attributes >> endobj 2855 0 obj << /Type /Annot /Subtype /Link /Rect [87 735.500000 236.250000 742.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_special_variables_and_macros >> endobj 2856 0 obj << /Type /Annot /Subtype /Link /Rect [60 728.750000 132.750000 735.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn25 >> endobj 2857 0 obj << /Type /Annot /Subtype /Link /Rect [87 721.250000 120 728 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn26 >> endobj 2858 0 obj << /Type /Annot /Subtype /Link /Rect [87 714.500000 142.500000 721.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn27 >> endobj 2859 0 obj << /Type /Annot /Subtype /Link /Rect [87 707 123.750000 713.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn28 >> endobj 2860 0 obj << /Type /Annot /Subtype /Link /Rect [87 700.250000 132 707 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn29 >> endobj 2861 0 obj << /Type /Annot /Subtype /Link /Rect [87 692.750000 133.500000 699.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn30 >> endobj 2862 0 obj << /Type /Annot /Subtype /Link /Rect [87 686 131.250000 692.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn31 >> endobj 2863 0 obj << /Type /Annot /Subtype /Link /Rect [87 678.500000 132.750000 685.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn32 >> endobj 2864 0 obj << /Type /Annot /Subtype /Link /Rect [87 671.750000 134.250000 678.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn33 >> endobj 2865 0 obj << /Type /Annot /Subtype /Link /Rect [87 664.250000 136.500000 671 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn34 >> endobj 2866 0 obj << /Type /Annot /Subtype /Link /Rect [87 657.500000 122.250000 664.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_ret >> endobj 2867 0 obj << /Type /Annot /Subtype /Link /Rect [87 650 141.750000 656.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn35 >> endobj 2868 0 obj << /Type /Annot /Subtype /Link /Rect [87 643.250000 128.250000 650 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn36 >> endobj 2869 0 obj << /Type /Annot /Subtype /Link /Rect [87 635.750000 132 642.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn37 >> endobj 2870 0 obj << /Type /Annot /Subtype /Link /Rect [87 629 132.750000 635.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_throws_typemap >> endobj 2871 0 obj << /Type /Annot /Subtype /Link /Rect [60 621.500000 126.750000 628.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn39 >> endobj 2872 0 obj << /Type /Annot /Subtype /Link /Rect [87 614.750000 141.750000 621.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn40 >> endobj 2873 0 obj << /Type /Annot /Subtype /Link /Rect [87 607.250000 192.750000 614 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn41 >> endobj 2874 0 obj << /Type /Annot /Subtype /Link /Rect [60 600.500000 165 607.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn43 >> endobj 2875 0 obj << /Type /Annot /Subtype /Link /Rect [60 593 190.500000 599.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_optimal >> endobj 2876 0 obj << /Type /Annot /Subtype /Link /Rect [60 586.250000 127.500000 593 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_multi_argument_typemaps >> endobj 2877 0 obj << /Type /Annot /Subtype /Link /Rect [60 578.750000 110.250000 585.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_warnings >> endobj 2878 0 obj << /Type /Annot /Subtype /Link /Rect [60 572 113.250000 578.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_fragments >> endobj 2879 0 obj << /Type /Annot /Subtype /Link /Rect [87 564.500000 163.500000 571.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_fragment_type_specialization >> endobj 2880 0 obj << /Type /Annot /Subtype /Link /Rect [87 557.750000 217.500000 564.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_automatic_specialization >> endobj 2881 0 obj << /Type /Annot /Subtype /Link /Rect [60 550.250000 129 557 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_runtime_type_checker >> endobj 2882 0 obj << /Type /Annot /Subtype /Link /Rect [87 543.500000 127.500000 550.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn45 >> endobj 2883 0 obj << /Type /Annot /Subtype /Link /Rect [87 536 104.250000 542.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_runtime_type_checker_usage >> endobj 2884 0 obj << /Type /Annot /Subtype /Link /Rect [60 529.250000 132 536 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_overloading >> endobj 2885 0 obj << /Type /Annot /Subtype /Link /Rect [87 521.750000 294.750000 528.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_typecheck_pointer >> endobj 2886 0 obj << /Type /Annot /Subtype /Link /Rect [60 515 142.500000 521.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn48 >> endobj 2887 0 obj << /Type /Annot /Subtype /Link /Rect [60 507.500000 145.500000 514.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn47 >> endobj 2888 0 obj << /Type /Annot /Subtype /Link /Rect [60 500.750000 105.750000 507.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn52 >> endobj 2889 0 obj << /Type /Annot /Subtype /Link /Rect [60 493.250000 150 500 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn51 >> endobj 2844 0 obj << /Type /Page /Parent 2 0 R /Contents 2890 0 R /Resources 2892 0 R /Annots 2893 0 R /MediaBox [0 0 595 842] >> endobj 2892 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F1700 1700 0 R /F1409 1409 0 R /F1499 1499 0 R >> /XObject << >> >> endobj 2893 0 obj [ 2849 0 R 2850 0 R 2851 0 R 2852 0 R 2853 0 R 2854 0 R 2855 0 R 2856 0 R 2857 0 R 2858 0 R 2859 0 R 2860 0 R 2861 0 R 2862 0 R 2863 0 R 2864 0 R 2865 0 R 2866 0 R 2867 0 R 2868 0 R 2869 0 R 2870 0 R 2871 0 R 2872 0 R 2873 0 R 2874 0 R 2875 0 R 2876 0 R 2877 0 R 2878 0 R 2879 0 R 2880 0 R 2881 0 R 2882 0 R 2883 0 R 2884 0 R 2885 0 R 2886 0 R 2887 0 R 2888 0 R 2889 0 R ] endobj 2890 0 obj << /Length 2891 0 R /Filter /FlateDecode >> stream xœí]I¯ä8r¾¿_‘çú5÷0 tUuðÁ@£ ðaàƒÑãñ`0=pyþûÖF¥¸%E†¨Ì|9…é*QJ’¢bçÁÿå×ÿ¼ü÷?.?~þõ.¿Mþõ½[ÍÆÿ]ú??,„{Ÿþ}±N_~ûýíûåûÛ/o¿tÿýþ6þà×ÏÿÖýëÿ.âò¯ÝÿÿzùãtšêøýÍrÛýý·áooy÷/6ÿÝ·ÿåíßÿpù{ßcnšL|ýgÎjÑOceèïoá5ùðç¿ýýíÇqö"x·ê•ìþ㕸üï½ý¹7ÜdÅr²â¢.ù„LJ‘vý„™èæ}™§JÒ1WBú¾aØuÄ´ œCðËrÀžL~m¼†N2~Ô¦}°†Ýâ²Pœ°†‡ÐaéãÐ. §Þ¯Ÿƒµ]<€×ˆ•Ð×Uœ® ùîÌô?ðß7‘’6pç®°Ìï^qn²ìbE?Œé>%ž]´%ýœIïüˆÎ­9°ó~æÔ‹Â¥áÕÎ)¿¬n\žn™è×gîýˆÅwL×ù0sêE _ìœòË:ÏÇåæˆO;wÀê{®dÚaæä«¾-Ü;áÇõ‚ȶ×Þø¶ÂǶãÌb[¸sÊ/+¥>ðËν±øŠ§ÇÇ™õeÓΑö$Ï}y®[XsÙÿ|0'§õÞi°Îxýß–ó±u0禑BËoÝØ;ïYÇÍOIu.Çaº_„Ñÿð’vÀ³aø0L<™þ)w£âaþÒÄË/ÿØD9¾W~øéÛÛ_»áÌåÛŸ»[ã‚}ëV°S? ³ð—oºüS÷ _ÿùòí¯o¼{#eºÏ2<8ÞÃ÷î<3B³Å9Þ™¸dèãú(‡;ùy¸£ß¥p<¾£¡Þ˜…zãçópG½+9·6ô¿ºø .8¼: žu¶Äà”*ÝÃSú´¹{Ìw‚{“ ñðÜÆßüü­“:W†)‰’Žî{²l%ÒˆeCìœVd‘‰,’²$‹z™ ‰®%“EýS“¬ Ý„K‘È"ÉK²H²l–Ë¢á)w£âaN•EÒ…ÏÉGæbïÆòˆ¹¸ÜϪ aèõÅ\Û™Kú‰7„63—æ siQb.­RªïZ2æêŸš˜'t.yÂ\š•˜Kùt˜®%c.u妹s*siûb®{d.ø§ï$ô·¼iö5àW‡M޽ü®]P¦B-þ–Ð;Ëè”bâ*ã.ºûÓ¹Ÿš³ŽndNŠ+£áO¯¬ãÒµãëÁ„ 3± `˜À(Î Gò”gGéäÙ¿áóÙ@ž*j Ogï€<½^%σ? FTÁãÀ”Sá2ðÕ…òÌçJ‚Üõy'Áz3;'fÙì'zZêŠiéhŠSQn°ü‚ï`Œ0°Yô$î÷7¥yéK®Y†¹Ø6Ì,a“Ţ̋Z²ÃS£¥;w.]l f –°aid­oI-áñ)w£âaδ„ W/Kø-áÌÚ*7';ÔpüNÇ— ÇÉÍ~ ˜¦*kÇ,aãŽY>’F¯Ð.­´Gw…ˆæA%!ÞNwLÒ3¡æUÝ!l¢;„+éŽ,vh¦Øa$úåUY„nÂ¥Mt‡0%Ý!ÒHhß’éŽá)w£âaNÕR¾tÇSê©Ý154ÐWšÊ¨öC@ù /,f;­¢!J«²iÏ ã¿Áj3%”·žÀ­óLÄÃïoZëT^ ƒJFÃ|ÆpmukÙ¤'GuªüÅø€¦-¿½7é\>?e—½„+3)Óp­]›þZecôû+éLÔ%Ìtì%~^aúCsíÔ(\µ_ø ({R¶‰‚i –²Ooæßqàn3ë»ÑÕ…$¬_6l¶ËNìrcJv¹q©ÁܵdvyÿÔdw‡nÂ¥Nìr£Jv¹‘Ù02·Ë‡§TÜŠ‡9Õ.·<„è¾LÂ2Ëo3*½= Ën·†m@·¥— ›iÜ©„Æ.Ѹ³)ñu-÷OM4º —*¡q'K4îD6ŒÈi|xJÅݨx˜SiÜo Êci/3µ*’xG'_“†Êu>À^$Sˆ­\gYµ¬µYß² ;<5rÕÜM¸L²–•²–¥›}KÊuãS*îFÅÜÉu–ùuª„­DñƒR¿å’)F*4l¦~‘@2­(A2mˆ´"‡dOMÔ-"HfæJý¢É´" «ö-õ‹’yíFÅÜJý­R%&QAic‚TˆàÑGå2‘`3CÃf.S 6Óª6Óª›iUŽÍžš¸HEØÌ0Ì•ËT ›ieŠÍì[2.“W¶R6ó:Ì©\¦ì:—!fÂþ8LP˜Hß‹Ë.S¶![6læ2Ã.3¼Äe™ón'ç=b’þ©‰‹B7á’%\¦}‰ËtŠè[2.žRq7*æT.3f*_Αlaì¬|Ô²a3[XŸ°…c%¶Èü};ùûU÷OMdº™.§a®la]‰-l½è[2¶žRq7*æT¶pz]ùКx/w‰€—œ™yÉ-6ó’O …Ö— ….óâË¡…ÃS¯øZ†¹ò’/A ­Ïb>‡ŽO©¸s&/9¦V©6Ê*û–0ÿÁEʳ”Ë»B å²a+—9ž€°/°\-p"a O\4w.–ã%–ãiì£oI¹l|JÅݨx˜S¹LÈuª$Ménų•ËÄ|å— ›¹Lš„ˤ-qY-pS´ b’þ©‰‹B7áÒ$\&u‰Ëdûè[2.žRq7*æT.Sb*1Ôÿ²äêW3 `L ›©_'€§K€—yñN瀂ᩉºu(Ã\©_—N§1‰¾%£~= ®Ý¨x˜S©ß¬ 0 n³Qé”Ê&ìI&— ›ùÏ&`‡nñJü—… œÍÁÃSÙ솹òŸ-œMƒ}KÆv;\»Qñ0§òŸ[§ÊƒÑ°/FIÅ…­1ÂFCÃfFñ >Áù>Áe±çs|ÂðÔÄ>Â'„a®ŒâKø„¡È`2LŽOŸRq7*æTFñëøFyEíng!ÏfƒµË†­,äyrð¼rð™£ïyržYdî&\& ÏK ÏÓ°Eß’²Ðø”Š»Qñ0g²çë ÁK• ™4s売¿"ü²áæÌ /ƒ~ ×¢yáešáï>Ξ²Ë^ÂU„kVȼð"Íîè[ÒÌ‹¾-Ì”-2/®cœ™yáåzÁ)Læ&­è~É~ßkÀ½ý´YÃW& ×ä8²jܘVáå ™0rÙ°Y3ê2áu 2á³ð„×9dbxjÒ|:‚L„a®šQ• ^¥Á–¾%ÓŒj†L\»Qñ0§jF rt†ü»5:I ¼C²KÚŽì#jb¡êÀ½Áûtp¢fú5ösóz®–ÅIJa3š£ám £á³0…·9Fcxjâ3a4Â0W>4%Œ†7iÐ¥oÉøÐÌk7*æT>´sY¦Ÿ@ k$×QšÞƒ+i´*þ¼=é¾ò™ÄAÔ(©È (žÁñx~ÂþC™n{…­ëƒI·l¸Ý—q.öeœ/ù2ž§~ÆK¼‘þ)»ì%\¹Ø—q¶äË8“ŽáLîËtma¦véË8w¾Œ¸ž—t£¿ )ðS•¶”<7b4%¦‚âˆTa3D̸Bè˜5Øé…ú°•.MÔp«@vÝ*-rwírìºu‰…åÐ’äñ)»ì%\Ù¥@î®M.»VŽÁt*‡¶0SsÈ‹1NÈÝ ˜‰‚‹@Ë[ä"Fl`$3¢ÄÏžP˜šÓ0çc¸ ²CÙ¿/´KˆÉÁT‚!ÅZUöìuqñÕ6ÊìNø…´rÙp`¹än X Áè<"CQÞ«¢§×pDªÇëØ{'ÙÂÞ¦ …‰•¡(Ô¸êZ}ª¨DVãj|Ê.{ W&V†¢PãªkUÙY«¡-ÌT/•¡¸ƒWŽÉ€ÔäölëZ~¤­Õ[yŸVñ©²˜„­œÁª&j¸]&(ËeJ2A¹”_‡}•„«û§ì²—p¥c™ TI&(™!s™Ðµ…™ª¥LPúd‚øÕÇŠX 0ÔÖJ+Sf'wé¹î÷ˆ۹˨˜»Œ.qWÇ å»% ôOÙe/áJÅÜed‰»ŒÈÆ9wuma¦rÉ]FÝwYödÜ…HpÂjš)ç|ggd«0ˆ›žŽ¹ÙÚ5­]k‚lZ’MÏñ)é£nÂeŒlí ÈÖ®•gÃdÈÖé)w£âaNÜôìf1#[A&{Pê<ËtÜYÝ1Ïkϳƒ]ë~ øë?DÉn°7a7ûô‡D¹6T´Ž?múf¥o½&9‹¡É]CšÜµ&Ðä¡%•ÃS£Œ›» —14¹k(@“»V– “A“§§TÜŠ‡9SræžUnß›lu¤¦(æLET‘{ŒlÈdÞNñÏY€rI%– FV»b¬hÊc<ñÀZ,¡Ðßß4S)ÉÞäAsetׅ쀮5's‘eŒOÙe/á*Êè® Ùnh‰ÇàYv€»úÌ¡—ø=Îõ ¹Ù°ÚYCìŸU¤;¨_à87íæòf;ìØ»>¦zÞêÞòV·Ÿ‹kÎ[6l6yKL^UÈ9èZej‹ª,ç`|j2iL^Å“WrºV—#³œƒé)w£âaN5yUÈ9ø8Xç»Ó¦ÁTsÁF£— ›Dû„AL! k)åš,`|jbÃ"Ñ>a]HèZm:ŒÎ’¦§TÜŠ‡9•ALH# lI½U·ZÌ\’‰eÃí¶—u±íe hf×ýIí"—¡™Ç§ì²—påbÛËÐÌ]«Iǰšyh 3µKÛËÞš¹[gG37;„öñS( «,x`xeáÄïyn6µÜ\HÑÚeÃfMâm¢I¼+h‘…ýË )ŽOMš"t.m¢I|¡bך1}VHqzJÅݨx˜35‰`ë§Ù²Ñ„çúyÓhž±‘ø ˜\õt¨@Q¤47!¡;܃ï(>Aw0½ipEá5€ßF9Ã_A‚ˆ x­á7•´5vF›ñšž-Œ*vÅ_Q3œm—ÃHaŒK±}`LÎGå5¶ë7ÔA·­8&WñC2/yÜ9Ž¥PçcS‚í,xŒv¼„vYTWðí<Ld¥3HÆá£ÕUˆÞŽ–TÇBF1¢ U™ ¶Ù®çP‰G˜,*IΤN´$ª:2âDQL (±p0-FÕöÔdEd&a¬I⪣Û÷QD…ÖÀq–çipÅCp@ÇÇ¡_?þøw¸oÜ0l„R:/v•®ÒŽÜÛÕ=j…T ÙÒ,!,i2‰'˜ÇÓ²#"Ä‹©ÉÚ¸:? Œ U¬¥ÜB¼Ó.[)&Ÿ˜R´lG^lŘ%†ŠQf|®2EÄ`GpňwþAT« Æõ›ñ<Ño¹¦ÆÒO„Ú\Ê(m; ź_’B­¤{ZCÖno”‚Ac¶qwœ A @…q—à|ÀjOó¥=3æÌ«`©[x¾\F…wì ¬VâðLõ$™Õ´nZÖý-p(w4E‡èœ¼E>ɶ&¦8 ìETέ¹¿ìø×qû„1úüe¿˜ nTf€ b ¬‡ýYºŠ1iÄf9F«—1ZœMRô»-­2¤*²S³ëçÄ7ŠŠ5COÒCidfTfÐ(ò¼J¼©•‹®5¦>*˜RÝ~¸JrL§* –V˜t%L½h m…xR$i…æwjp¼tDì3ìÙsA8-0¹)MjØ~¼2¡´Ö»M•ý•5—@sÛu Dïº{©Hæ+ÌY!‡Â´RáÜ›ôîr‘÷%¿’‰b@‰ð¾:& ¢Žýy23~Ïv Aáß㢜ÊÇ|¸Ã@«[Õq N |¨,\ÄÖ¬Œ+Œ±ò É]’©x=­òšÛF;Ž š:‘ŠEÚŒLN-hæ¡R´w¸v0̡ީ4™' £Æ0'wÈo”!¼c‡XC¼j;ô±[a\Ûì,Þ™óë¬Ië]å ]LAS„Áìðc ´Ò:©ççnœ¿ … À7²›÷ð.L€˜¸'EašÙ#· “˜A%zèogUHÆ¡úŒJõ&4$9¶µS¸*{ ðÆ>­êY“l^‚ïÙsƒsàèr£|”'BR±ãŽ •${\XK™U1ÓloQ‰”&ttlaPL™œŠyôl^ø‰Nª06á‚WHˆ*z}~Õ Z/ê;ÒBvlÿóÇxh!( råNÒê×Â%EVâéÛ-¼:*iŽ5潈íiRtÑC-Ô|Ö˜Dó½Üú}€’šîÅz7^å+€ö  ­Ð*9FzfÁ•ŽÚŠßaáµ=îþÐÌMÁSå(Í› ˜â‚(â@|ñƒc“çáÙI:ÁÔ¯À»v ÂcFƒ«@Š7¢=È„x«“öHæF™ Äð¹³>ÿ{Œt‹=w4[íÓ7 Y™5Éu*<0…j0–Ø/Ù,Ÿ¨UE1pì<Å„ì1^1¼í³ã¸/Lí/D<e…¾† ’ŸÊÍ abv¼Ž>ÑÖ§ "À¹¸Gÿv Æ?sV¤Í¶RÛ:ë‡ùcO¡-ÏAš]€J…ÝžUþŠ/6Üáj$vPõ·;R´E—‰7p1AxÖ°wûàˆt'ZÀKEëåÞ®¼ ›?/Xd U§þ 0 ¬Œ å€d›—0qb0Fç4>V¹ L‘FŒÙöPabD£R‡QiÏQ;r´01š=‘˜³¶~ÔÏT*„+ÂJÆÈ§Ñ2LÃOZd˜wa w¦Å+ýFw>½ý ÝàÜà0xœÏàxpnSe…Â)÷C¼Ö`oü<¼ðñdÀXæ1`ÚžçuXF0ETáéU@eƒlBX!ÆE) sÛŠöœîµ”"61’SлUÕ±ûû”ËÝC“…_£²ññô"šGÖUà6ÑsÍN”ØátÓ†ei+†ÞO Ò*GÍN:#Å ÜOÞ f#\aLLÚL⟶¯_£xCKGÓšù”eÐa‚]¶Š[ôÓ~·H1莀{ƒÝ/ŒËº  vNÁq<Ò…ZÔŠÂŽ³ïp°7ð7˜àL;Âî_kÌû¬:èû§ß™ÔᮥåàJ¨ü þ©ÐÈÛ•;0ʼnºÖ µ„{I”ÇÐSäçJxÉ~¹_Ýv¾½"`Ni j9ØHF?¨k %V¶ œ CâÃÕ0AfL4“¢γDåŽU¾â`‹×8-Ö*ËçF@Ìh ÜT M4':OZ×üü ¹3ó­•KuÔCí)=[ÈS0_ p và Î?s 0v¬;oŒKá/êȲ;Ì&opçÿî3î VŒ5AZ|êe³¶¶YdÏ}Êú/kx»urW;¯wlæaÑ­ËúÛS´XÈç€A½LÖÃMÖfMÎÎ’²¤‡¢žàx¶‚ÇObbж§]a '®BÅ$Ü1õX[1#EŽÝ“ÐùÝù0§e„‰*U…Ï“kæ»—›F};îPÀYh |†p¼2ñ^”¸ »æ¯5LUürÄPÝgû>0ÅÃüƒH9¡ˆÍ§†úCÉÕùT E­rnïø-% ¬E—C¼*ŒxQÅmT[°üWGÀÚÞW´)%9~Ã*¾4#N¸ ùâûq_TqUܱ|!NÚiI—ÒÝ@—½Ã1`+ô¯4©çUIŽCØ/•$0õÀ‘y؇‡¥4LW°6 •žGWVüXZÁ2´ßï@¿Þ1õÞ‡Næ<`šéäÓ}{¶$7ŽÇeØÕ”€¶ž»9tV‘l}D5êLDò,æ ©×.ìÄs0ù7¤¨By¿‡¾Ÿý ºsÅ@3Q–`RüttfÓ]¦ìk%Hr0êÚz­´Ç4ÁweúªàJ”|BË»•jãÂ×õ¦­2³àlXØ¢C¦…:®Ñ)§Oý?I5÷† ^(/^)–ÆÅ*‘p¶KCÌŽ»Ã3À¼«¿é³‰|ݹ‡;­ :Wb‹ðŽŒw:½ðçÃgö¬˚ÊÞ(,kô‚‘ƒ0Þ•Ç¢Á7­ÈèÇÔ,Ü­æ¯P"f_ýÃhÊW¡å†šåô¢É^ò¹¦´ ¢¾]~¤9ìÚ7ô@¤™Ã|2¿*Hnx÷¦2xÖ Ö¬ì~£chsj*ØøV_›ö˜Œ$„é # i¹‘ô}Pyë­è€6Wìôœ?ÌZßÁàêÐÚ§0f¦’ÇsHMéì‡ãŒVo ç Tä Œ$¤Õ,ôîù2àcpúŠŸ¡T(ÆÐªòuR„Ù…ÉövÔtÆÌ†#!€"˜c·+»÷·VqQá½>®&uL¡jl¤@{CÀ9`Ô[+ðI¹öó‘^ȶ`º#eÌ$ºU¯–ˈâÑ„Êéè >¥7¨£àÛN/~6%T½æG8^a;óÏñ@I-½cPƒçà·J2’œÐtœ/½<ÎÅðT›aŽÆÃøð‡Ø._€Å£Ïï ué±;°ôÂPY¦&:ôfÌÅXU'c§2\·ëü)M³”sìQ$É,˜œ…é½ÍÔý¹|ïTPUCý²öÀæJLvoÄx„¼Ìè§l¼’tIÄa ‹w1ä9,ïŒæ®ÉïLß]¼OAÐ)ro¾@ãÈ5ÉWšÛ×éM¡´Xd¨”òà,#“¿àĹpæÜÂkp¸7ð7©ó]¯n¯d‹%¸þßÝŒÃÌa ^UàÞ*$.âKLй@Òðªr8F®AF„÷÷¡-Sï“(|qYxÛ5Z˜Ä嚨¼üòöÿè[ž endstream endobj 2891 0 obj 7908 endobj 2895 0 obj [113 /XYZ 38.2500000 771.500000 0] endobj 2896 0 obj [113 /XYZ 38.2500000 771.500000 0] endobj 2897 0 obj [113 /XYZ 38.2500000 293 0] endobj 2898 0 obj [113 /XYZ 38.2500000 293 0] endobj 2894 0 obj << /Type /Page /Parent 2 0 R /Contents 2899 0 R /Resources 2901 0 R /Annots 2902 0 R /MediaBox [0 0 595 842] >> endobj 2901 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F1409 1409 0 R /F1499 1499 0 R >> /XObject << >> >> endobj 2902 0 obj [ ] endobj 2899 0 obj << /Length 2900 0 R /Filter /FlateDecode >> stream xœí]ɮܯÝ÷Wô:€[¬ôžd@€,‚,9N`ÄF/òûaw“o(òY§o‹ýhÁ–ü(²¦;œ;Ö»?~ùûñŸ¿ß}üòŸã·þ÷_Å©.‹ë?Çó¯^þ@7§þÏǺ)ß~9|?~?|>|îþûýp}áËÇ?wúßQÿÔýûóñ¯ë~øcÿ—Îá—C­êî÷_~okÕý©xúýüóþò»ã¯ç/Ãõ“yýÿ?¨¢­µ9Ocfèï‡a™êòë·o¿Þ]7 l­Zk«£²Æ»?êãÿqø©`ø|qj­Rueëâ–j}©¬ºè¶µhG]~É|^Eøx]5ñ>~™¹ø®(S)ÿ×%÷Lï— *ë;ôôuùí×E¡ëxg{™¹ô¦ G ?.w²ÝöÔm²<Û¾ø|Œ£­ªhGÛÏ\|W®gëûºäá6¥'“_|>Âþ«¢Òñ÷2óH2Ù÷uÁÃUÊ ‡ÛŽ5ûíûÿôù‡kuïã—™‹ïJ¸ã¯ù žÊõ'~÷¼øáëáݧNšTǯ?u3»xùíë/ÛýÏvsÿúãñ÷6lÿpüúó¡95mÇaåe~×'JÃ'®Ož~PÀ¿Z|¼0f`¼ÀùÉì>A†;1“4hÝAJQıx6ï#E‡þä2føy}ý¼RÃî'T¬eS/Æ 7¬ L8á#Âg@°ÝøXGÚ ÎÄZôU†•d49KWzÎk´9¢Í£w†”©]*èJÐ-!+xÖîŽç œCož¹Aºîy! VJß6˜:ø¤÷l…ÉÌ›ð 3#̇„ôbÔì|<4iLCùïù±WŒSxæ¡ä±X–Ãq,ž!I ¸˜›ð™RôÇÁú î5æZ#€]À3åÓ¨bQý£6ÍŽ­6­(ôÙl÷e­ê¢~{Ø ž£¬ü~[¨«ÖUÔ…%œ‡’à.zN˜ ÿ·ƒû Ôϲ(g¬ˆñ®¶¥8†›IÝk g¡SIL&8ÓÄ^ϑ󖘒§B´î" J¦‰AË0íÊ“ú‚CLò “}ø8•gT× ›¤òA1?áZ8&F‚º0ëy*ÄC¢Y³LÈhH*)£ñ0‰Hq1./˜“a1•Xíj1á„&¢9MZ¶Ò„“!é=D¥ÚqØó½+p<’ªZ‰Ï²©G²YW‚ÀÈÕ B$ê©ÈDuö¡ŸAo-,:[œUŽ¿vGÉdX†ë‹˜©|¥«j#çÚ$ºÀSIQš1ÜÉRø@4]ߣ)ðvýëg"S½Epâ1S‘ÄÙÞ™‚.}±ñØ*KŒÛxÕSVk@J½ˆðÓ!1Õbå.~K¨d£“é7g½CÏ&cïñÆ“dÚݤBI„{HØÁw¥­ÎA“¨°\…šÊY%ÂæÂÝ~Çlc1E%ËéVֱ𡆭GE ™‹QŸ±úRõMƃkÅÝUK5(Ù†TcK—WçT/ Igˆud“ÌÁm³3aÚÞ;AyWYwMšã£53WÜ[/*O' á.U/îÈÊ8ŸFDä m+‡-R{©¨èDä ` œ+Lß83$|WYà'kÓoPú)•p+a¯Ÿ+Û­íN!‚”«àÞ )–x&’2›FZ1¯þ©J“îî™Ò0Õ0y®ÛôÕ¬V—ðœ€Xõ)$:£2pKüµ1P ضTÒ~t‹þˆÈŸ_î>§’Íöô°m§‡Åt&ëªvª‡KdzULÝ–D´*JCìn¸²Þ™3?æÜ†‹€)é¡ðRÎÉ<›Šå/—t:†„eJú «Õ®ÐÝ}C$ß'ò íª/ Õ—¸!9UÚ9ú¼h娮e¼?ž@ú½iÿ ô‰r@D×ÔÚ53°".À¦"5LP6ém;,LÑÓò KæÖiCp5«‘F‰ÿå÷í2,™‰'š\bægÆ‘m‡‚ÏgtaŽ£18ŽÐ*²wBçüDv›Ïz\]Ý@‚«%çX ?PÇØ=ÄeÁM\[ï™㤠èØ©r§VÏ„x{fýz*Õ»ûÔ¼°-_zÔ‹lW³˜åX{H_Ѳ`™Â*QpAe0ÉÞËž(À³é¤¹û-O |™wlÚÇ(’t”¢Õ©§Kx[Gfgs-NÔ;ÊÕT ºú”v§G'Å5_dCTtQØåÑDÃ^`›Ûø2=2¶V(‹€ÁðkQ¾l‘Ë&úÉšX‰zéEq–$ðj¶OîÈz±S€‘Z9kØÀ@1óyMã쇇w,!„%v}4‘riâ“õýhÆ‹“î×­÷- t¶fFNYXW·í®M:¸âB ó5ÕK1»ΦtQåŽ@„²hö0mü0mƸ‰gåBܘÎQ34£dM¢X'ÃÊ¢ÔEÆ9æì¿µ˜{z*KÕ‹–ʦÅјü1Ù,Ùö8yÞ€pƒ#. UFÕ®hæ/*ê-z¹-«¼Ðˆº„j´×1¢ÝñÝЭªæeÔ(#›gDVª'¯µP©.ÏnK5(|yörõÏ$Ï _±%ðh: 2±¡ƒSËð±È^UŠMïхщì¨ÕÚ×oók¦ƒ‹pMÍr¼F¥4b$'škÆdsŽËLþ*“ã#i;¦òj]í•{;Q„ˆ‘Ewâ,—¶[PIö1ÍUŸ3õy-·[\SïXøÎ{ôDãÔ艹Ÿ©Ö£áóHìNªYÃS0x=mû¤#ʲ}=d}’V؃žB…é\Ôe2:†H(kBãSÉÜF=jL€PÂ8¤’9%ª›wØp;lPJ£á*FÁt+ûJÆÄ€‚R™„8¦àr…¿–Tí§]xR|=iÁpL fàã~>^Î"øŸ6ÊxÖr9ú d´Q³óYß‘=­>]-ªñ²`çËùußÛÎ8ƒ¤;_µ[Øù\ KÖ>­¦¹á´v]W ÷Z ­'é©‹z§ŠŒ¨"É®uµSÅmT‘±Ö¦Ø”tYÙèÒƒ8àŽx¬ h·—¢½Åø@ŽØ«çFaWÂn·˜Ï0ýãö`*Ç'GH.ü¤H°Ã³füåÃêÈ(ãY{47–!Œc4 œ›‡³ð8˜·1cÉ¿f‰')µ‘)ôìº=ç©£ æÂ>5ÂÎöH;¼LcxnØûŽió3áå§Òd½h˜áJñî'.@¥0±Xy«²íoj5Ëgø‰ôÏÎÔÎÏGø –ìØfÀ’jDÏþbÔ†u?ž5FïX¾`*ÅÒë~¼×ø!{fùK8l%C:°P›`:ð¼ <ÍòÙSž%’´KêgÚÞâ“ÛqE±ãŠÌq¶•rÇö¹.s\aM¹i\áÉ¿ÙqŘòÀ¶´7ðLJ\aÛ›üG4Çâñ=cøL ú·Üž0¦öÓ­s"oØ<2Cܦ®JeGv¬Š|„èÍ f‘v€ëó=cl «^D‡¡=QÅ ü½Ô›w» ܇Ÿ&Ø?‘å–6 €¢y 9ƼS)GRìNÜò;ˆ•¡Wœé¹Çñˆ1æþæ2<·f[+.´¾ïß³â‚BáËgÏCùŒ#‡á½H‰ÝÎÄ+©0Ÿçªæ(™ûmdûo¯(TEåjÅM›Ò÷[ ¸Ïªœ .ÐxohÞØ±CNØ!8Ô›À½hêùÓM…“òK/aòì(f  ŽGò6r¹m%˜‘ŽuaBNµ ©îç\ëb’€hPeÀèêcÚˤ‰æN ç'`ž ,`Yãu¬bG!df޲ù[0@0*sÎØY¡`ŒŒŠl™¤HŽr7u›&“¸ÏøØ"ap¦Ú)Àz!YôR ÌX¢|û(ÅvóM½šì˜Ö»†h½‹[½1-=Í•uøzpûIÏ8̵ÄU°Ôà«qÃHø5ÏÜ’ µ[âÎqSÇÉÈրY7~ÆÍ\‰Ëkf/kŒÛÄS…s\ž žë!—°t_]ü _ÄԆȂH¦ÒŠ£¦úV¶›lÜޢɞæv8‹Ox¯ ã)V¯PA¦´u|¥X¬%b†™Vzö$³ñ¹‡UܤªˆÃï0ã`ÍŽñy“ò`£æw£Œñº ÇÔ/z(–±ˆ'yàS,X7æÔ;“<Û”j",Zlƒæ.ÇŒ*I ^]Êù”O¾šõ«¿‰'I«X_lV®VßPÅúO©€“® -°-¸hÇw&–¡ð×à;½kZ-ý…þa îüçâ¹yâ]…$€¿æ!L¸ÄIôB~‚¤ñ®ª¹z£%D˜ßA×…=õBbâÄÍÄj1-¼Hÿœ•„ŸŸÿNh}` endstream endobj 2900 0 obj 5394 endobj 2904 0 obj [114 /XYZ 38.2500000 181.250000 0] endobj 2905 0 obj [114 /XYZ 38.2500000 506.750000 0] endobj 2906 0 obj [114 /XYZ 38.2500000 181.250000 0] endobj 2907 0 obj [114 /XYZ 38.2500000 506.750000 0] endobj 2903 0 obj << /Type /Page /Parent 2 0 R /Contents 2908 0 R /Resources 2910 0 R /Annots 2911 0 R /MediaBox [0 0 595 842] >> endobj 2910 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F1499 1499 0 R /F9 9 0 R /F8 8 0 R /F1700 1700 0 R >> /XObject << >> >> endobj 2911 0 obj [ ] endobj 2908 0 obj << /Length 2909 0 R /Filter /FlateDecode >> stream xœí]ˎܸÝ÷WÔz—Ň$ Øn;@ È"È"ðd2dqf‘ߪ%U—(Jü]mÒMþ´sq¨ ‡‹g—<ÜæŒýeŠÃm^.]ÔUºÃ}Ú¹8T†Ãų î B€Z@Ƀÿ<{гÕ.Uèv. ”þhñä’'kÌp¯Ú?òzž>Áä¥NÇÍ»‹Ce8[<»äá–u±š2øë„×¶jeãtˆsÚ¹4P†£…“Kžl= ~‚\§¼XuÓ$œü´óTN.y²î¤kÀSÖ àsž=ð›mžv. ”ádáä‚'kZФ;ÙçÙß(—Žw;Ot²“É?ÇL‚wÒ}Œ/ß¾ÿúðö“²E»«êðõ§voÝšO¿¾¶ )oN¶„B¾þxøC»¥æ‡¯¿<4ÇJ—ûåÐH¡á3>ƒg3pä#yD#¦›íã×ö(®…bƒ ¨*íQ$Uüˆ†¯‡GL ×)ãÁ¨áïà:Zôuå|ÐcœƒøcàH?[Zü1­êµãÏMðÇ*³ °ÁÏ4R/ß è^ e:#ˆÚ£5_áÖÝ™º£kЧ>|€ÏX4¢8[‡!æXÚÊÕ£‘Žì»5 ï«=>Ì­7™~Õ¸ž,ðf‰uŒòaaâVÝ$ÊvªZÙÀ:ø5DNòU¼^/²Dà-1P Œà`øáXIt+ªLt‚¸$Œì˜x9 ÷š÷aîQ`wðl ﺈ¿ã÷Á\c¸É)ù\SûŒ_‡÷«B6žÈœ&|&°Î­Ø d€p2躞‰¨"¦pð5lÕÓåbB—ñ=a¸ ä º›M©ahÅl“³!1`á t²HœK Pwëe¸°}ìùAU«ÕrAÁñ:ê1~×gm±®ÊÕ”JBN >$«ŒÀØìz²šžI6®ò™d&)/ Çàë7¡ŸÖ+‰¹Y„ª’#4ä€dJ oà™õª9¥ha¥‰Ê "Œ¯†vÄl=-Zû<ÒGU‹ÆŒ¡ƒ8l«ô0ôŒøx„b*ðM1t"ˆ@€gÆ5¤F^ÌÉ`j¬«ÅmÊ*¼:½t»‚Õ8ŨMŒÆˆ±.¡ô\¨ÞßD Öª€pñ7Bz¡_Ì⇄Ó85. z ÇaP”x†á_£$ôŒˆcÉÅq¶è|ˆ¸âÄ¿½a«µ1þ±õ¢}z6ZjµX‘F·c,¶€B=!¬PnIF§Kìµ#(xŒ­ž¹— S™\‚ˆ«5A.âub¸€¨}' ÉÚsq’÷Ù9avNø"üL 9¡RÅDÃ5úS.rBm‹  Lä–šÜAdJOÏ ¼ið†#_A8L?ó>9"ëªöm#©í­S¥:Ç2‹Â¨ ¾!¹e ò„;ûöA‰\FÅ Ç^›“¼o‘‰Y8ưƸÍ&»'p7àgó‰ÊÃàûDdÀÖ3lp6]ËÉ* ¹[i”ÏÞDÉôc}gF`³Œ$…,ëÚÏ|¥(s=0¾†ðWÂH!˶)“% Ò6¬c€BÅÔ‹&„LY<«1q=ÌUÀ¾hBãÞŒ]0¥ÒZ”Æc±é¾+Y“lF”šèb¢ð %µ¥ðh9­º¬Êáè?õ¤wjôÉd(¹™´j¸ŽÁIÚD9NŸÌ’~;Xïž o5`Uƒi±äW,œ[Àu([ ~Žö†s¯?À¼D2­ö–öz›Úøƒ€ÅŒ­+賋ûÁ#Ò(QÏF…°0ëÓBƒ³Ñ1Í}OÐBü>µ-FzH`,ÞÑp§¬cè`b©>ƪ ^CžOŽäüå»Y抻€"„H€&çÈÐñ?@7°ÌAÀ-'õ­ôr Ù†^*,r`j…ÏL4ΆŸ ¼C“0‚+{>ßü>ø|}SL…°è)ЉžŸY,û3w¦XøÅpû†³8<¹¬e‹wá:?x×¢;ÀrM˜Ââ½a¼Æ*"¡<T*B"ÅôÍ0{ƒ ¾ ‘¹¬ÊÌ‘\ª¬ ã?¶ó`ºÎè6˜CŠŸõ«kÎĈE­ØiÝÜ`ÕS—¥»º8’g§æ†÷ss=—*[ÉØ=ñý¾Kè` uü .Ëû†/¦Ó„ܵc_fì«í]ÃcRÉhrØ^—¥do£üCÙ}>»Ï'à󩬇0Û *î9pû)qºÔ]RI…mJx„Å-+Žu×gBy—콉ù“Sè¾ބ |ç5·ç5Æ¿wá5åjkBR;ÃBXS j^¶ˆ×ˆ„q¢P™pP;zQ[bxEÕïˆSÙ ™ú8Ç0ã7–Í=xi÷냦Ç"R‹"¢Ú S†xÏÏÇÎÔYK’&—2ÌV›Ûr.*Û W¥Šõ}C4SAÆkJÏä*&Aj#`?½å Äé¤Dÿõ0Z‘Y{ÂÙ ÿΘ€Ò”n`e{Ê5 (·2iUx‰½0L<Ž=Áf ‹›M°ûpÌ'Žùg|šx¯CãTŽ8 ãŒó76ÝÔõâ~^ZÒʖÙeÓY¶ü¦/4%Î]Å$£`¯7&óLP f'D¨u`˜AËÂ;(3R⦺+ð1UÝ)q0Èï§ŽéBn{D–gëýÎ8÷±„! ÑMPb]¨sáˆ|a亽8Ë*ÑÂÈõ©RK^œeBoIqÄÞò„ÔÊðnoØí {ƒµÂ0I•ÐpÊ\†Ð›p@‹V…Ÿ¶PIãÄ¥–dü¶ëýD²íáb܆¢%‡©žWw‚½@Øón5õ-S7H‰ðT1]0ñ‘!Œë^¸_SÈ–ñÞ2°Æoʸ0e=ôÖ€Ûž¤äYµõ˜Ö-ºUÇì»r–o°vz pé®2 >Áq* OÜšBUÙ°ÏL½*d›øÄ(ÌÁñ3룦…uûÈKõç&êüš òD&!OlªÒWädë„çêy2!'Qø²mKdž &´³R~Å©$îd¥lãaêb„EÒ†h•󶳨ä§P]­PïøL  Æ§,ÂVF£Œ LJÙèp‚åËõ2sÕÌÆýõHf‡rB½l®Šc§-\læéÏ®’an ƒ]U5àžS£ÖQÙìÔnåÃÚí}'Q®l¯[‚ÆQàÂrŽDóú=e)ˆ2¯¥1Tê&Š7—x^œí󿝲µÚ»`g”Ãi„iÅú;ÆN=63®ì²ÀÝ¢0*H¤^ï¹Ñ*,›ýRz—FôZç‚Y¡¨‘MM'dÙó4Štõ«†®’ ™æx"]‚¯pq¤í–Wú\£Z._ŒˆƒTdÙ˜‰Ë%Sg}ìSÀ”©ÕÍÅØ½ïáõáÙÚžÉÜžv.œvèÀ¼)Ï0·L‰hÐ’¤ <÷¬lö{–èžRßn¬3pEÕ@2 3BÐ&1 [JÑ×J¨dRÒ˜þHw‰½²éÖ›Æ7ÑÈ ¤¨u.‹Î¶ær«I¨vT€9Ök÷hˆ»¬ï»’n "*q»æ˜TöÇ¿+cßÂ'«(âXN¤x©ÎÆØÀ¸%ñi,EW%ðƒ®?Õxì,J#RõR6ÜŸ‰(ÈóÎDH0A(;Ë?½SÒ(~-ë6Ø"ÅfF"â€"ê˜þLlË„ÛÝ>ö¤ªš„†—10Ûͽ©½ò" ’z‹ÚcœÙ"Ⲅ%Î*(ú¡ ¹ƒ·D$=çÆzÍéX2Õ^Ïx "0fÆ\¦¯Œµeµñcâ "Z]Í`ì#êDQÜqÝBÆ„‰Í«D­6a컹[“1™ã½ª B*Ä’©Êh›¨˜g‹kj—n½ÞÕ·¨híÙ¦ÿz¸-QÍ©Dúºø°­Ì5·S”S Z1–c¬À\ƒá;· á2Þ5ÑZ7*Á´¥ßtúš¸qþXçF©büqÁá]–g㜖Ü^žº>é^™Í@+êØ Á/×,ãç&¢»ì+N$¢ü]xˆÖz„»S¶š•ˆk,‰m;¥[»pÓz VóÒÿ­2…qâÎéMðU¡ü·Iì¹OÇý-Ó\*•FC ôÙÂv <‚õ¬1vMl#ÂÁ®x&(φÇaÐ3£ëe ¾K«[ •sr l…?Ü¡¡Ò{²ÑšûLÙ|ï/÷Ô=þ6ÙWÉp{ßÊ~Ï^Ô=[°ÑÖ…¿ÀŒvÏÙ í:[ÎŽ¨A%pr¹ŒéiÒzr•ùN›&S6žqÏ\6>›™ 6§p椌¬V>ÑÆ’£}ò’¤Ýrï­3tèqÆ[“±íS¬.¢W„SSš\y;Œ˜T0Q¿—°Õ6qí-Ùœ:¦¼ÔúÚ¸²Yî´Á±cZ*Áész ê²cÇî-ؽè™Ý[°{ ÈÓÞ†· ®ïôf¤øMÞMójðÒ@êĺx+û~oztFm ÿSö·sÞK Ç32õ¨EJ @‹¬1Å`BÖí´ e·Ñþᨅ÷Åš;Öhb—V“7x51Ñ[ŒUN[fˆê¨‘·aSB\7ñp}ï”<+‚ÈVÿÅ-Œmq˜.àDð{ê’gLU¦\Æ9üŒ,×Ú`M‰ÆF›§ È.Úãö6Q™JAYZ%ä…®¶¾ÜÇp¯ÉËbÏ1ö‹z`˜"œ1î",î‚`L7_†S„‡e¨"Ú®Rë]1•i­C´ »Ã ¥‹Ò·1@>›±Ù¥,(¦§Džˆ‡£Ô¼¼31b]¿Bã2οOrÍÙ—L¼ÕÙ¡ûŽù×óá’Ì[N¢fÚ^çbù7·e¸§ìl ]öÀ˜u"‚Í®hsÇ0˜WÓTग़¯ï-Íß:çs¦íˆþ7'ŸI\q1ÞL½Š›ëº˜Å#‘VÔ­*ëcy¦'…U(üŒX™=qÓ·«†cµ0ìYØ-ƒqóÝjžàŒãÛn™~ò¸M,a»Il fhoD|mz–×ô [Ö°<™>ºbáËAtVco™Âm2¼nË¡rÙzó5õrÕ'ÊbÊØl{Ê=“ˆÛ§è–Ç¢1ã;ˆÍ+ê)= ]%8#ÒBXL ²I˜¡ŠGVÚ²d‡Žíjÿnn²á‡i?ööùê̹`¦PbäøX^rLšk= è¨DH—­zpFÓ<òrr!bÑ@´)§“Û‰zrŽ#whµ’9¢ÿDKM+eUÞö²v:÷Åf>¡‘þÕÊ£öu<~F[øLƒžéñWÕÇVA‘˜þTOò„'Ãõ82÷¦Ý3ÕÑ(ía6ÞÁ8^§@{Ãë¨>ƒÏÏöÎöÂ ïšØîÏÇVŸ_Ííž>í àl} ¨™÷éëÅÁ ‡u5Üó‚×y.ñî?cU%Îå¹L¦Ù «C8õž =“p­„›ˆ ®—ªu»D gs®Ì d\äêGŒõ"ø’цdãÎ0`¬X¹BSñi39,éU¶.Gé’%Q@2ª:±¶o¯šÛ5áòŠ©®Ä¨‘e—¯·E(ˆ¨lHÇÏ Þã›ØñÃZ™Æ<³¡$Y9^¶òè¥Í6F{,išöƒy~%æe‰za2Å &’4&R~¨Å}ŠTuŒÈ}c¬0¸$qJ¬(3¦ìp²µZéº/Ãѹ]ó@ÓXm—·‰,2Ô1’\®æ  ƒECìæ÷q+Õ±3ä_¢t¤“s™·éHotµÃtÏ#Ÿ¤â™Ùzlœ³p æfèwðŽT T"çä½B %cÊŒªôŠÉc°p|.ʇGŒ`ü]ÓÊJí Ó1¹˜°hàÅ‹øÙ½¡q(®NŠ«+BT »…A Ž$Þ5 çSpWÌó.¾éÊ}_ 3nr“ˆW|Þªšnµr‡v1}b6íÄ¿žÿ­Î‡ª:ýª•ê?µ‡ªÌlB£Œ²Ù^†2dKx7.ÂŽ®#¹¦“\£æH®1>9l?™ÜÓ·Ìhs¹Æ™äêfŽäjç¯Ñ~2!¹§o¹Ñ,n¼F’kÎa­;ÉÝɽU1½ ­§lð“I&Aú¹û¹Š,n&¿X$̇ª ![ÓH¢­E€*}\£š,ˆ)ºÄøØ™<Eš=˪ô˜%¦%¾ºyê.8 ޶ Že1'8–ÚêÚO&‚ãé[f4‹¹\ã,8Z7'8ÚÚ_£ýd"8ž¾åF³¸ñdz£YwDc&‘w‘RZ¤¤|sDôUØXTèc¸€,P)fðLwÚ.@Û+7¦íU3GÛkåÓÝö“ m?}ËŒf1—kœi{UÏÑöªò×h?™ÐöÓ·Üh7^#m?û“w£À(xD¿`¦¶ón.àô‡]À¿&àê1pnŽ 4…O ›bÊš3Ùf1—kœ™€«æ˜€+ý5ÚO&Làô-7šÅ×ÈÀšsCæ l€ §Q1}§™8T\ ¬^ÍÔ2gmS³Ètü;»¹žÝ˜¢±SÔ3ìÆLâ2L—1bOß2£YÌå»1E9ÃnLáÇ—œ>ñÙÍÓ·Üh7^#=»1êiÖç´ÏädÙ§‹aqälgQ1>)ŠlŠ&ç:þl>‘Íöçð½¥ARñyé +h‰›¯ÕeŽ…:ÅôÙ‚±D]Ïs'ðêiPx:.Þw ÑÇjRUvUh³Dgæöö©STÀ«ñÖ¿ØYM_°GA¬`ÜŸy …gƒÏô‚ŽŠzõúmY„;ý½Ýñ°sl‚ÇP…(€g  F\â$zö4ƒÒª ;v &H¸½ƒ® {ì‰Ä̉›™·Å¸pQ²p‘~>|~ø?§oæ7 endstream endobj 2909 0 obj 5664 endobj 2913 0 obj [115 /XYZ 38.2500000 433.250000 0] endobj 2914 0 obj [115 /XYZ 38.2500000 99.5000000 0] endobj 2915 0 obj [115 /XYZ 38.2500000 433.250000 0] endobj 2916 0 obj [115 /XYZ 38.2500000 191 0] endobj 2917 0 obj [115 /XYZ 38.2500000 99.5000000 0] endobj 2918 0 obj [115 /XYZ 38.2500000 191 0] endobj 2919 0 obj << /Type /Annot /Subtype /Link /Rect [53.2500000 355.250000 116.250000 362 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization >> endobj 2920 0 obj << /Type /Annot /Subtype /Link /Rect [255 114.500000 279 121.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization >> endobj 2921 0 obj << /Type /Annot /Subtype /Link /Rect [102.750000 169.250000 226.500000 176 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://en.wikipedia.org/wiki/Aspect-oriented_programming) >> >> endobj 2922 0 obj << /Type /Annot /Subtype /Link /Rect [241.500000 169.250000 286.500000 176 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://en.wikipedia.org/wiki/Aspect-oriented_programming#Terminology) >> >> endobj 2912 0 obj << /Type /Page /Parent 2 0 R /Contents 2923 0 R /Resources 2925 0 R /Annots 2926 0 R /MediaBox [0 0 595 842] >> endobj 2925 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F1499 1499 0 R /F1409 1409 0 R /F1700 1700 0 R >> /XObject << >> >> endobj 2926 0 obj [ 2919 0 R 2920 0 R 2921 0 R 2922 0 R ] endobj 2923 0 obj << /Length 2924 0 R /Filter /FlateDecode >> stream xœí]ËŽä8vÝçWĺŽEŠ¢Ã@½Ò€ U€/Œƒé˳ðï[ I‘!J‡O\RÊÌèÂLfêÁ·îãÜ×oÿòí?OÿýÓoŸ¾ýÏéÇðóÓ·§â\WEÿß©û÷ëí…Ò‡ßOµ«N?þxúyúùôõékûÿ?Ÿú¾}ú·ö·ÿ;•§mÿ÷×ÓŸþ£½øçá¡î?žjU·?ÿvùÙÔªý­¸þì®ÿþôᅵþÞµ8v7 fú÷¯J)k/ÃXéúçÓ8Muù÷ú­_€¸^ÊRk]œ”Ñæ¤Sžþ÷¿žþÒv06_œ£TmM]ÜÓQ]v=™ö²*›âTÕ³~.ÿdZW)¯lÂÆ»‘K/ŠÒV—ÜÙÊ©„;{m=Åâ[]§kü2òT; —ÜÙº4 wöÚzŠÅ¯]B‚pyª…Kî¬sIkªësm=Åâ7)wö2réEw6.¸³¦°uº}i=ÁâeÓ‘ú~ä‰v7.¹³­’Ž¿´žbñM‘pg/#ODqã’;[•.áÎ^[O±ø•KÇÄû‘§ÚYØøÙ­Z6\™n—»®œ+Ûßk=üw߬¬¶ wûÚzŠ ±M™°ñnä©v6.ù×füª¹2}ÿ½4Ÿ q×$¤ÿ—‘‹¯Ê¸·³Ö¿Æ´‚‡Ò_ép5Ça¬ëñ“¦k÷ôÇø·iÉG+ ZÛý¨•®–'[]ѦáÊ'kÎJ5¥sêú”ž´¢oûhŸþvÝk'ïíV•õúh¯´ïLGÒ=å&­¸i¿?}ü%Œ@ý ,ÙÇïO¿=7'eOßÿÒîI¿Ô—ßÿxjgôëevÕéûŸOÿÔóÃ?Ÿ¾ÿõÉœîa¹î¹þN}¹ãή)lYÝÜQÞ)ÐÂÀ~>¡;ª„­}¹Ü©Îºtj:?6¥.w”›{é®3S<ŸÀ\çå1õ@ÇÚoï \ÙÀÞâsßÁ»ŽG½ÿ®ƒß|îØZ¹úöNéDÏ^ÑoÏ'ðMÀÕÊ;š˜ 1Û8f°SÁEé§þå{Ëï£éÐt3Ðtw]Ÿ~M•:WÆvËý²Ï+˱tzú 4çÚVÞ;}?ö\ö›:#8 ï ÜÕôw¿tzà¨ñƦàà±Á5P_à8Ÿáè-Ýý”…ÔÑS¦AE]]NŸiU² ãhΗÁLFZ£;]iFª ã U8Ôp¨Ä —d8rK#pð¾çSÂ;úK|k„kPâÕ±°µg8øN` >H®A w®Pðìg`ƒq#À»ÏŽÆç yùïÒÇŒ+'ú˜qzA3®òt¥îН]žÒ“Vôm£>fœZÐÇL÷¼×G1ÓÇ.O¹I+nÚGz}Ì87 ã¦Îyâ±T:ⱘÚK0z”nî`áw,«êÀQSš 1ê܈œ˜ï;´ÁºÕ|o‰}šÍ+0¼ 3M4ÓYb(JK†çï¡ØÜÏ0ªBMFU” £j¥·)1ï®ø ãò”ž´¢oûFûûÃh¥\a´Wf £Yĵ7í#=èŠz*[.){zšœ1=08_$œ¬ó`!,¤,¦,¤TK,¤Ô> i¯ÌXH÷”ž´¢oû¸²Õ,°ªíÊ룽â³ËSnÒŠ›ö‘…”öò |¯œò, x>xÃ0­Â£†3-!‚¥åc ‹aÞ ,—Šçï ¬!¤8X ?SS©ãùD 3R"Ë­EÏ_.ûÛC*Ho1«¬×§ß;UŒËý²rk|gé´0•#t?G÷ ý [~®`; ãìo׊Ë*3¥nǵq½ õaãzظØ5xk6.Ü>o™Âù¾¸§Ã÷“–[xä¡,àPáQºúVÄYüAãÏ Ž Ð¾CŒMãÕ©`koB¼ GY·´Í:åÙ 6lkõO²Ö,àIÖZë鮸xÒå)=iEßö1âIÖ– x’meT¿5Ó.O¹I+nÚGz<ÉÚfÊ—´wwZn@%ÇHÜVã m: 'âÖ>£uÓã·®‡—6Ü ôƒåù¾*¾‡ ¨”û;ø£ÿÎ׎>°ûxÆ"`‘ì‚Ζísü©¦08ÁA$Ã&ñW qžþ’© 3]9Už}*ððÅèGï0žÄ²ËØg£¸5!xÚ¿2…ÜYß%pAšÅ᳃…uÛ— @55 ŒBEù¡‹X…¼Q#|-«+)´…b›xÀºLXÿ5Tüo†@?3î‰v«ãî¤mã'hƒwÈà3‚Ï"„sŒà*bçœÁ”ù²Œ:ç~EÜ4´ßKPM1EµÚ¿P­öª‡j]®xzFÿ”ž´¢oûôŒöïT«½jf}ÌP­þ)7iÅMûH®g˜âj¥Gµ°1™‰–cÂÌðdÒàæ†Fìôÿá_Ð8³Øì]¼&8ÙÖ!¶»žS¡)¢‘(ŒvuJ&z;›Nyà5HG puÄ1ªÒgU7JÕ5…¥¡ú-z„½‚þ Æ¿çë‚ê1ŽX(ÛX9];,²± 9dd£Šk¯Ø‡{qb;2VA çxÆ1«Ç ; ã;ØaÛfÜ­+d¡áH Vþ1Â@#Øñ^4ü!W˜…‚'É`&ø€›ÎúûxçÓÁztð7 w Ciü5 +n}áL­à¹dBRp?Ó‡Á*üÍÀ±QÁDÐ÷Èàw0MÃk@„¾d@ƒZ¡b‚)çÐ ÕxéÚ.W|4èò”ž´¢oûÑ åì¤ü´s—+>tyÊMZqÓ>Ò£AªÑÓ{I@%”Ôxçr§—HU0Á TZôÝr'íæžy'™=¤O`,×¢)8´²Ûû ¸Ç<²&¤DN`ðhϘÊòj|†ŒILÇ& ìC³=©ˆ0×a8¯ÿU¢\rMƒ‰À‰°ˆZNø¡Fœ?„Ä|Æ;ŽÓ%ä.™ô³² ’ü œw†Icú·=³#wa›r Å>0²›Übås¦ˆôqÌV¬ŠÊ’Êf á@i$Ѥw””ó!œn#H9ÃCbòÖ"1ŠL¤L£²íád|ã3ᲞéoUªaH ›’Hs¨h'š±"=/lëñÂ1Äû, ë1ºþd#È1“ $ðcà/XßC8ëjÄágˆþ`»*<¦WP±Üü¼}¹"¢f^§$ô:%“‚!–Ñj D{q?JNK°Ô‰ôÐ)á"«¢ñVù­JYÙ’x‹Ø 7ßÑc °Ýk*OÂ¥ÉÓ%‘züÐðúa¤—’Ì|z¹"ä£ Û)}»mí3/ì"’Ô‘¿…wƒf¾Êtƒ”pQúïJ¦³#{>å’ãp?T(”,#æÃ軹 ˆ·4K¼£À?wÕ.{°Gçmº÷3º3œßê\ÎB1`kø! `é½3ìªÏMé•ãPWVØè%²4Óþ{Ö—SµmŸ`k¸ŸÍŒ!9•Zã‰Ûà€¿ÐO÷·ö¶ö®5œ)3‚rØS3b¢>Û\5\7|Bk[SYÏç3„'Ä­Á°Öv$0NîG5è! "=Œ¥Ëj\vˆk¿n€%&+3µ($ähYoßßî´E9ÚÈ€ƣÆG”AÄ-ƒî(´ù5YŽšÂXÄb€vѯ%PigmHQ %ŽR”¢”‘d8ùÂþ:i´u,Y#„‡,㜙-ñâÃÔ/dê@, úØ ·õ9‘gòbâoƒà‰Œ¸Fù2<.\®¤>`Îç|„E´ôMG²1"®_F°hÞZì¾®¯Yû2¥š ?„1Û8Û®eÈEcêe×`ÿ⡸µmåæÒ|ÉÌbô žÄu¦…ë»ËQ± F-ö5”6]J39@‹Õ¹ðÁM¬P鼆ÓaTý´|¢¬÷µ>Ètv2’—Úß_|°™ô‘²i*  2‰^â©ü!f`FÈ•ƒ(¥!S?R–au?†¼Þqàr„Ç‘˜$›“m&§ÀHBšÔÀÊ^.šÂ¶™Y¤;ö(Ù½.ea$²éû‰&f>mÄRb=Îú*"a*§<¿ —É\®~«irâðghù¢L j¹]ÉK' ù*í߯&>*T‹¤´åC[×VÓîʈ÷Uzu<éõݪñ8ækÄ@bÙê¶Ù B3R1¸P¯³õ©Ö„Ø…;É1dU¨ÍûHùÞ< ßÝ)!Œ‰‚Á°c)õFŒÐ·'§Š¥Ù4aÒÁQÜþ8D®bLiƒ¿³ÈkÆiŠ'±B§DU–Þ$wJ)Fû}2´,†]0ÑÚ®Özb»˜|Ð{M8¶‹qÏf`WQ—4‘ºkæÉOÖ-“ÉŽˆr œÑ)\Ùpóûö ݘßıìzíñ=xð͸=…œnO+M¹ÝlG£_³Ç%†ÁŠv€kIá*^ìÂÐvÔùЙ«»—JU¾$…aö; ¢Mìc¯ µC›‚Ó"ò´ ËsöN¦’Á´Ö÷œ¯MðíÕ¬P”Ú65µ}jC¶œ›©akÝCºÙ.ÝÄ41ÖÎ\U™= „‚µÊêÓå ™¡VY©íí…¿=}ÛTMò»í†àîíÂ<„ v&/Ž\VÖóƒŠ!¼ydW‡rÙ 15¸¨ðF§Ïd+ÊVí©*®QOo4ÕÛ2ÂöôH-’]KÔ‘­²‰[c‚V¿O†WeÒne×`^Ë)ûÜß¶J͇ ×f¶ÿIëÒçx”§&ã‘É+V¦~ë#«…Œ ‘JçúÈ2£1fŠ?ŸˆX¢\ Ï[ÍÞðEЦ¯go¨¬¿ìâ‹í.Øaæh±þ9ûåjhÉ d°€#Œßq3lý"rh ¯ƒíîæ ßT5E”C†t½n´BXµeò\ÊÁi}„µà\ޱo]ñu¹“£§ü¯eÃo3ž„$õÓm<žÁ´„óâdúÌŠËCqYU\¬m2« æC¼Ðp€ƒît;pÔxl”zG•ƒ€Z÷~îÀ]¼ƒ÷ïTSç *‰Ñ£Þ3 lW4à ãµó!¹Þu¸.Ít9âÜCÞ|2Ã\JáC%» A9raR‘:®ó\F²ç|¯üöÂù£Þ¯FÀ¨÷µ›){Í€TÇÌq¨|æÈ¶M’M¸ðÖ¶0–áwNøì–!ËF( ®Ç²Ž8Fm5B,N)Àª ¡|`ÈAÚ TÚ‚Q(ñêà™âý‘]1æ†sÙØõsÉØ¢E[ œl †#*[eY_§®Uw÷]xsß Á‘}0”ÅÀ ¹’·—ø;#(vÖ/P›ÕñìïïX_æTìZeÞ¼Dì‹Ãlèµ.×yC®:ßs€:ß¾ƒ«lBz9Ë€‚+?j(ãjÑÞ)áºõ»>kàÇUG:0¸?¸¾3SÉWóTæþ4*QýölUû\¢>úÀ–ê‰{ØX=0jÜ®Ã.FT9ÑvFO>Â/®!>a%^)¼#ðËÄ€¢ plèÓÛ½šÚ'ˆû¥„¢l="éED‹9R6‘@ÐdnW¹k¨¦ñN§nàéœE1¨²D—Á¥céÌ3f„#W£Ã´‚±ca;*cÞ–M”ðŒFXÑí6JÆI4@ÇrùÔ®%N[ªO?`üÙ”½3dÿZO¬ÒQ’ !QCf•ªœ\Ø#³J7„)u;@’Ô©}e·S{æ°P|‘ ˆ$LÏ)"ßÁåÐÔÆO©Û¦É§d›bïO©‚'Æ9¹9ŸBêâ°§×îêÆ› Ó’¸Ë–§e{m:¦Šf¶z£`{’ÖV©”Gû˜#Ù˜B [ØÆRÖxEq?¸µg¸ pOq?*yHzÙ—ûº9•qØ_!ÚäÇLÔšZ/)4Xò¶Ä-Sy§ÅãùƒÏa€! îlˆT²ôÉi>îªåzË!ÒŸÜI™bcÌ^½Dʲpå¸è&À‰WUa0[Õ[Õ÷qAÁLŽèÙJk‹ÆöPáøÛãs Ê—›÷«ŒÍBQ.,SLv°³°L*Ã#‡tf&djenÿ£gê ÃC¥1 - ¶ïÎbeÓJ­VLHuGíI©ÄgPt0ñ x§æ³†³§dNy{… ô>EüΈÚißê„ïÜVO¸ö® ]Oaoí–`oSø°·)æ°·)FØ{lEßö1ÀÞíßv{·W+¿öŠ{÷O¹I+nÚGØÛ\‹ÿbÏ¢1^a^kâÊù>'?þ}ùá›YV}Uêc%À­E^Ne¸Hð¹Ä¼¨"‡ÕãШˆÝãáQBÙ xë|RÀZmf Ä_…„Ki¶’ŸŒùP¯óî„õ©$¬-Á2EŒÖÒ‡Е ÐU½$@W/ܶWft÷”ž´¢oû¸ ÐUµ$@WfÖ‡™ ÐÝSnÒŠ›ö‘A€¶~”Ö‚ÿöe ü,°×ÆÞ!)…nc¼•:²ÐMI–MÜ."H¼3½ÔΖ‹If¶[ª<æüí¾OLŽ9F3M’S-eêˆÑ]éån ßÃþʰ–ýNŠˆ™•Áæ Ý‘ªk™+TV–ÀÛ/¦4ÔÕTi¨í’ÒP;_ o¯Ì”†î)=iEßöqUj³¤4ÔzÖ‡ž+ ÝSnÒŠ›ö‘Aipcý³êé[9f{š;@C7g¬dP´öfM)ljw¿²u Á6~1!<®¥Ü&¿8¯ÕþM8¦+PSÙŒ#·Ç*PžŽ²¶ˆˆÀ ÆÔ´5Q†²7¢àˆè¢á¿1°‰%–ê0œ#«¥ײpû­§ î¦fG‘©;øˆ*¿ Mœ;²¬Fl‚¨Ù”©~SøW¤Ž #`EŒ‘s• 9®‹©PÌWtL¯–>[Ä 3£´u¦zÙ¾Á¹ÓQÙ¢òVÊ 9Ì6¿åË`D_,ëàÕ]CVÖ;u¾Ì÷êP|Éôt½°Kb§>'Øíq•-s”í¹Ó:£¥x$zÕ.p™Ñ]¡½c‚S£ã"8y=.Ĩ “äê\â‚0¿J^Ó5þG¸?ö»›†òHû!#¿Ÿ´ù™P/&h@‰oNã!Zƒ1ŸAR›¤òeÚ8»DCY >}•#d)Üš ú˜<Ž˜20˜h†Û—Ú=N>q‘Ê> Õ»[–…«€ã³ºÈG¦ï:Bzx+Y™2Õ̪T}3ö¯™ÅTxê7d¡^Íphâ*/á~ú·T燨XÅÔqÂõ„†Â•Q­áàu T "vnø†Þ Œ Dïà:[Tõ©ô>æ½pWª1 D¶˜vôow[¥žŠÄ.nÇ,)%T´üƒpB-,În·«RÚhöÁ4/ša€ÊV—ÉOÉÆÎ9²K¨ìP_^¦ÂqÞ2ÄP5¥Ç਌„‚Aè­8%«01QzTð$#L±?ù¼ßÉŽœ«”–ˆ|ó`+\¤ÈâËú;‰V¥–x»}P83zr×TÆcp²I)a„d»Û”pˆH£÷þ¢dVø€øùC¿N õ~Ä#&Åå?ASòŒ„ ÕÎc¨‰¢¢pÑ2ü™G°ï"&v/–I·‘eO–zaj,*g!ì5ƒ,oݺ ÅhêiQ˜×€ŸïáãÁ„`0šœDm)Š{Ø8[‚ÙÈR׈Øþ\~¢¢EiŽÈÇgQ³¥Ž 5]MÁ“2X»t>ŸÛ/ˆ\Ø®ÌRàs™üïÉÕp¼|Æ1dQSLMNQZ/-aY œÐý…¦BÄ-JH‡!!ÂzM9 âwDÜDà<² ÑŽ™œOCÌÄ ”IÎ"nÚïu73¡jî0Â…?c&yâ²€J@LÌÔ©ADÞŠ‘Š@5"„™‘y}]ÍF!¾í¿Óϖʉð×µ6Pi·D¤uˆ Õ¹Lž^*¬âz==£©>—Þ§¡Ó+ÝÜ鉊ßòd”g;‹NRp?£~ôšDº4¶ça¦óäB¶6œ<Ÿà- v ¥šMp8éØqóÿ…i(Ü|g |*jê71üìë~oG<ŽË[xUáÀ­Ž>¸ÄN äbáHãUUk9©¶Âãmt]˜ó@$v\/ÌŸ…ê–\®‘ÊÓ×§ÿÄ3ö§ endstream endobj 2924 0 obj 6681 endobj 2928 0 obj [116 /XYZ 38.2500000 728.750000 0] endobj 2929 0 obj [116 /XYZ 31.5000000 763.250000 0] endobj 2930 0 obj [116 /XYZ 38.2500000 728.750000 0] endobj 2931 0 obj [116 /XYZ 32.2500000 762.500000 0] endobj 2932 0 obj [116 /XYZ 38.2500000 169.250000 0] endobj 2933 0 obj [116 /XYZ 38.2500000 169.250000 0] endobj 2934 0 obj << /Type /Annot /Subtype /Link /Rect [345.750000 473 422.250000 479.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Preprocessor_delimiters >> endobj 2927 0 obj << /Type /Page /Parent 2 0 R /Contents 2935 0 R /Resources 2937 0 R /Annots 2938 0 R /MediaBox [0 0 595 842] >> endobj 2937 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1409 1409 0 R /F8 8 0 R /F1699 1699 0 R /F1700 1700 0 R >> /XObject << >> >> endobj 2938 0 obj [ 2934 0 R ] endobj 2935 0 obj << /Length 2936 0 R /Filter /FlateDecode >> stream xœí]KÜÆ¾Ï¯˜sØ6I  ]iä@€‚;N`XF”ò÷33$gv›üzØßT7É-Ø’·Å~T×»ª«Þýñóß÷ÿüïþÝóçïì~þ¼+UY´ÿìO¿~xý]º?﫺Üÿøu÷mÿm÷i÷éøßo»öƒÏÏ>þé{½ÿÓñß_öýÛñ‡?uéô¾î*Uÿõü{S©ãŸŠËï§Ÿÿk÷—ßí;ÍØ/×mæíÿÿ ”vƶqcéo»þ˜êüë¿?þ¶{× n­K]é½²ÆîUcõþ?ÿØý|\ Ÿ¾8Ô®ûþ™\¼>-nÜq]«Ž®ÜX¥*g«âž#w\æ8¸Wº)öe5XçüKfv•bòÒ%œü´si (ãThruº[­JW;]0©0íÿÞw×4 Ê!2ݪëô &¯Ë„tÞ¹8Tú[†³'ºæ¦*[P5eX]fOp®p Qè¼si ô— 'dÒNÙŽ*€€¯Ó§¸Úú§d“Ÿw.•în³K^nÓt2Ga/¢Ëô à_™¢Nw¹ç‹C¥¿ÜÁìŸbfÁ[iôÓoŸ¾ìÞ½Ù Ûùù$"Î žûòuwÄÄNi]í¿ü´ÿýq?öû/¿ììÁšVi?ý½óˆQç‘úòeÚê¦pº|õW GžÑôÚ¢oTGà:ª>˜Ci]]½ÙA‰Ftö†¿ œôãy¤<]«·#µÈ(¿q%Í5­ ïž­…ÛÃ@ý€¤\ü7Ö@p‹ÁãÈi!HjëD7çe›Ãùo6ô„F:<ûèÔ×­ö¯»D×}óÆF ¹&LÖ…™<}`L˜fýsQÀ©vÕòVeúÝ2›Åü/<ubà`D!€81äÿX{J`K— ¸ ¬C`YàÈó1é tˆô¢¯lœÇ øÄ\,#€{ `4¦P¬ëàuðl­øWªŸîŠ ï‰oz9lº&Œ`$°k¸·€ŽH„ Á›cÌì°¾†*VÝŸÑ…1ëX7Áó >c¤à“¦1 Ö„×ÁÔ“ý˜Æš±%þ1)àÙÊ žÓà@"0“a´a“Þ,ŽÒÐ3ü§«]H¾G]8ÃcmO0®R)Ud¨\é­ÓH²,µì¤¤*úmOP¡×B(dŒIÐQÝ!°kL:%aé; O#ºëgx?î ½ŸêÐÔ“¿ ¬¡ÓIý¸už :Âi2ÙR¶¸KapèEDu#†XNâ­1Þ:ÌÕ±)5=z7<fÌð\”Ë9âšd%‚¬âAØÚ1ÞiQ›QÖ™äZÒ¦ÀÓø¼ç¥ã=-ënudD¿‡ß4Ò©mcß|€#o¬“’I+çA*½#Àj_2X&F­—àîC²fœDŒG+"„:%^PQVͨ¨Ã5«rÆÄ„—lüKøì6!eOŠèZÓ'a(€É$ à9VŸ§?#£^£a°Ï)Ã+§KUgÕŠ¦ì—OóIئl< xsHŒN¡;»ÑÅdâfÓǽ ðñck¥*Ï8VóÆÊȈ3cÔ¹ÖÈx ¹Ó Fø~¶Cú1`•p¾¬•‹ÖÐGw~ùëÁ;ž=²![Á;‚÷ÚÍ–öötÇh§ÜÞMxÝ+&æüþº€#bNÌãÃ:ŒÏ@,ÉrãfÀö0íQìÓ8<8¾qo‡–-}æ–åŽì€§bÖBQåSØ•…š|#ǰ«ã´Á`CY×o™öŒi@ ´änºGFÄ‚ˆP“6Þ¡ç3Š#Žp4Y´@D6'u®\ DýQ”ßfúÝRÕ‚‰¹Š÷D8r %¨õËd(ɾDºÃ‡š4oFû¬oUAß´|šJNÌ•˜¿Êà²l á’|z$\¶ Ûw,¦©*un?o쿪jÝZÂöÇÖL7[BQ«Ê?Á¼¥éj]N)4»56È¡qØ•o˜PeÄøDðÄW×4Ó¯ûR°gæa¡©œo–‚4[¶2‰G}íO"†¸è¬‡›‹¹'F>3ÇÀ!9¬ÄFDª£5º”Å‚ôÀ¢Z÷c+*Q4WAÉ /toûJÝé ïkö6FP·¼›X}ÆïT0Iãü2l^ã줤µµJ†ó¹^™©K6)Ç”‘ñˆ¤lI{™l ‘0Þ“Y½˜¡àrÕøÌ×ǶŒåât}Ë. å1{ƒ9ØfÁ»No³Øf:k¼¤|cOÉ`W‰¨ö¹²í›%Äcm0ÑÏĘª¬”(Áþ§˜I¤wO^ï,5c!¹ZÕ>³"""¹^j,úÕ@.úxg«³—È”)‡Ãè…ŒÅ/Š‘”òϼ.Ék—3>”J”dS 2 Ù0˜ˆñmvår†ž"Êt5:^™f¹à3. Ñ¦/ðàlŸaØšèŠx²&[°YBw~ÉL(í²Žü€,ѱ)«_ýúìæÃãéÆ}bãÛ’!|$yñÃf–åe)¯Ñ1™>X‹×ÉT­|¶F¥”ãa¢ŒF1½ÍÍ¢“ÇZçVU—W|ì1Ô‚€Â…•L•"¡ƒB¹é>Ãù ›­LHnå`¥«l…U¦0ÍA·ØŒõ*£ß|úª¸ ~¢z«m6~?|?d¦fËu ð›@`?¿Æ·€w€‹<àGÌ)j*l·y DQˆñÌH€²ðóœ/øoK°jñûxç:%# ‹ï”¹m¦ˆ æÄ-ØœX7wàË6r©3÷0˜+%uãKáuQ/†šÖ9"Ë0.ÏÏ7æ÷PÔ´qAŽr#E¤®{·Tß½pØþ5uðJŒ %&λdêÐÈ ‰fr«ª&[RL„H˜*Ì“1¦‰Ú)e‰3¾0̓d3Osˆ<ÛùËe®Ó²eoåä"¥)D2g¥ Ú8¤}¬({ûI„F|âAUàQÇc2Ú”I¯JyÂj]Ùbï‹E3ùe±ºÂ4}ŠH‰Z ƒÍzžrƒó[Ï2Š˜žªü* |&Pö‰=s•¸g5YS`^±2É·7õ©ô½¦P·1!¹-¿™G7(ùÏ"dªÀobjüN¯¨ÂP3ž-ð4q÷,¯»^€É2Vaï®E'Ìoå;“ÛÞ"5~›ÄSÊ;]yoþ·;²gD©Æ?À´Ù»Ôð‰)LË4W¨ÍŸóuc\¿ªó)¨Jšž:»Ô™ë¾#îúQçÌæú¥j73ÂlzG%÷ÎvOkr‚RÊn ò :¬Ìö¦qQµÐ­«|NŽë`w® iYã¦.óòhÐíœo®¥È+‹°%¥Ù|JQÚXa„â@”õµlŒ{ÙŒ{y¦¹lÁ™˜2þìt”!\–™TºU¥7͘x¦Œöo&±!07¾¿©PþzŒÂHÃG‹÷­³S¦VÖÙ*šÍXQÊ——À¿æÄ|ð+Kæú‚G˜ªÃmö:1F.ÔwÇtµ˜{\òó¦7óšÇäšyMÀ1ësKapÌÀ ‹æpx×b¼/l>9uIä1X›Áº“ý½U„ŽJdÚxP³á;p& <‰Ó›Ú1~ŽùsÍd²Ãr¹§gó{¥xR0£W–ø;£†ØíÉr`'¨îRÄó‡€ÙÉ<‘c\Ÿ1¿l)DG£ï'µŠjˆ¼¿Ád+‰Ü¡Û;í;á×èû¹+å °“IÁú×rD½‘#íO& ÑHÖ:Oé #•º6-9wU¨WUË·]¨ÕOhxÆB}8}ÿõˆ~¥zý“_wŸ:Våì¼O;#â…]»û1Iİ-و٪º«‹ˆ¢/i×%Û§çQ"]4ûrnn–Á ¨!F,ñYPD6A¦J*³ÆGUeÞj¬Þ.áîÌÖ¸ªº¸n,®O ½àL„6[Ía|R\o—¨¡Ìįqr\)™©Ìt§`bø¸V3ÑÓBG?y¨¶éËrá(Ð:q9P£w~­*ͬCUý~ʇ/Z©›û à<Ä1 eF`6VJŒË ¯ÃÜ#äcs8¸ŽÅ;`ø„¦&|§þãuày0¬1Õfìää´¹¬š1—HÛ¾{ÍÆÙ×ÊÙqÎÒÆI7Nº(N…½Y¹¯ëóv7>¸V>xG^]«ïÉÛÝxùÆËÅ˳Ќ)ÜmêΨ/k{ȉú/-¦ÔË–ÏÇ;À>5ì‡Sñ;x ,ãW @‡ñ_b-S7ÓUR¶Ûüì½0—áA5®{lúåZõËÀl„¾Á7‡ñ@4ºaˆ½-Ãól®Ý®LâßÒd9½>€É¨óXÓûeu¿ H4‚{4ŽG‹óF†{fc8á’!šI_^†–bËÍ ¶-Å0V^ÚW˜ž–Šì®1&Šziî¨;‡6«u{q†V@ÛÄë@î°yÛîÀ±æâm˨_–fó©MℳûÔ'%jÚ¨SþC‡ˆ ,]S+ËÍŸ4IS#4ŽÆB¼ÄY¬XVâÈ·°G‹ð'1ÔˆäÏ®/¯3{ó§@Ö4öž{€¯ãÙd-ÇÔçâè'£X6½qÓÆÈ–`„¿‘Ñxï0˜Ø'S• Ÿ”‰T0² Wæ}¡€7ˆ½ç°øzm §.rf³%„½¾íS öÆ4Caƒÿp”×7“öOñ4CLÆ7¶N77Ͻp#ë¤gƒsáíÚØ¢¹ž û{ðy tLÆ8’³—oƼçÖ½¢rßqM&Ï”Áy¼7ÑLú%ŸôAýGy¨¶¾§ 8†¯!(p£ÚÕ2õO(IµQMMUÑ÷Ê]¯lšŠ;çÏ=º¾è+«ôç Ÿ‡©-Dxe¡³^¿d嶪CS°œÊqÀ‘e“>¿„DÊ1†àûYp¾B€6qv QÑûaaH1ÊW€Õ¬°­ZÜ1û–ØuýþÙžÎ~0?B@Ëš³™º¯Êj:+PíS²c<þϰáŒR³–×—P²9œ¿¦)ÂÂtÛÅA€‡—Ì:C?ª¬•'+ÛW©ô-@:nae‚é3MxôÓËÀºi<ã3ŒÐ©fI²=§™ë•õQ2NåL‘ÊõDEÛ§þT¾oB–Ѭª{ÆnÑU¡oW†Ä#V=Zç˽¯ »ÕÐÉÊ2Å3æ›UÅå­ÆÂ{(TE=C…J]òñ²u+ÁY£j5,ˆú|Âuo½á\dþò6²„‘M{È«=¨K>k¶7<¸2Þ®—3û›$üâwÉõr0þoÜ{ãvËí*·AþJÏ:#ä›KEÍJ}+õøkÿíˆA¼ùtë/LpR×cHe”9êäéÛ_ýN­WmÌ×§ñµx¥úI{=ÒžÕ G:[TÜ uªÝÁ˜“øZÇÜrÄŽíí¥;)rvâ¤@{ÝR7«º£Ø! ~ñ‚C#ÇPx6øMÇœUÔÑ_¹,X„;ý¹¸´tTØGŽ¡ Q@}ŒGÓûýùëå_4NÉ‚€Q_Z`ŒÉµÀf¨‘¤ aÄ!Ö€ròâ-~,tFW…=tÜpµÍÈýb¤ÿZ.Ü’ ûO»ÿ’„k• endstream endobj 2936 0 obj 5101 endobj 2940 0 obj [117 /XYZ 38.2500000 361.250000 0] endobj 2941 0 obj [117 /XYZ 38.2500000 214.250000 0] endobj 2942 0 obj [117 /XYZ 38.2500000 616.250000 0] endobj 2943 0 obj [117 /XYZ 38.2500000 616.250000 0] endobj 2944 0 obj [117 /XYZ 38.2500000 361.250000 0] endobj 2945 0 obj [117 /XYZ 38.2500000 214.250000 0] endobj 2939 0 obj << /Type /Page /Parent 2 0 R /Contents 2946 0 R /Resources 2948 0 R /Annots 2949 0 R /MediaBox [0 0 595 842] >> endobj 2948 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 2949 0 obj [ ] endobj 2946 0 obj << /Length 2947 0 R /Filter /FlateDecode >> stream xœí]Iݸ¾¿_¡s?‹‹$ Œ—Cà ääx2 ™Aœ9äïG¯µt·¤’¾W¤–Ö3ö4-²XU¬*ÖÆ÷üú÷䟿%ï?~ýOò­ùýã×Kz-²´þ'¹ýz÷òÚ]›?'…Ë’o¿\¾'ß/_._ªÿ~¿Ô|ýøçêOÿKtò§êߟ“¿þ­úáÍ_ºý…_.…*ªßÿýô{Y¨êOi÷ûíçÿºüåwɯ·Ûå`^ÿÿ;¥Lž70&–þ~i·©ž~ýöí×ËûËVѺÐÊ&Êšê?¥ÕÉÿqù©Z >½–V©"·EzÏB…®VÊ˲šB—ib”,ôôKfz%?yaRlòrq¬TPþÙ‰[×`_çyü»€ÄÍmsn‹c¥!®gvIâ¶Á~VÀP7{ôepòäÒHiI '—¤¬³e@Êv³‡@~™fá&‚<eáä’”-³–ñ+ûY¸såÒ‚ñÍ rq¬´´Å³ ×)mj”íóì!h«Êp–T ¹4RÒâÉ%)«3²Ýì!ot83ª†<eáä’”µºÁ}™ÀO7{äg*œª­!—FJKY8¹$e3W<³Ýì!Ÿç: ÛÜ ufáä’”­d~ã²pCßÈýꦀýR•µøäâXii;˜ýË’Y0(õO€[í»ç×÷ʦ•Ýž'?UÀÕk>ýöX!%KÞÝ|iÚ%?&¿¯@*þ<þ|)¯¹ÎZgŽ|~¬¶R[4«šOWuY»×aA9ˆ ¿±ð¸NŠ×1pä#±Î'uŽF †@oâÍàuà7çȶGÒlùˆg6ÈUú‡å' Ÿ|~ÒÏË×1ZJÚ!QgÓ'Qgl‡ŽzkJ_­y =õ¾»º2}‚´Ü±‘ZÙv²9ߨš ®7ç[!±’šÌ5³¹+^}“ÃÙ0.ðŽ1xb6]ŠÒ ®cT,äc‚Õ“(s57—Eöb„!2Þ†›d*HÏz˜u ƒ(†ØµìÈZ$½˜-…ë8fƒ– H ±ñ60—a6`¿`ƒ;8®a­`[]¶_ëó°\!jB%ãٰ٨Į#™.{øðœKµ/‘ð ö ,)ð7‘T£ú׉ÁϹîÛ:o›Ÿ+ŠÎæg#,PPW 'ÁÊŸ¬H¢œ:HŒ~ë˦À['Œv]ϦTKíç1¥³y)OQº%;Ƴu 5;^€¼Ql‘.¸J` vûðb‚ežï‹ sµ#NæwüÍVŒ—1Ó¾¦‚J¯y¡^ Ò¢ «B }Êœme/@ó­k–ƒäÁ,PøV\7*“f}‹m}EsQæ§E d0˜±¦f {ßSEŸqÞö}O›¢‡LTø1×n2ó/Œ7‘Ñvýóƒµ+FŽÕ9ó%“Gb¼qg%Ԫҵ؞ߟá J;®/DÕ$sSòØpaʼn,Áb…*=' A†È°OÂ,£Ç %¯îb¼ \Óp;Ôel±Ë=¤[Öå—0aŸ#`¼8¶M,òl¶XaüŠó3b˜ )䑪x6<‚%>¾w@>Àú•á^+ 5#‘p5þcÆwJðSQç™Ù)³y(Ï©ç,œèš±"Y%)–£X¾A\OR!Šõ“§vrßçÈ9Õú!lÊúa´ã»Ã²“°0<2 BíY‡‘ÑŒ–ÀØ9˜7Ês~°¦<­¬¨~¡\·žç¾Y—¨r4eªŽzå®sƒ×l­Òk z¶4Ò -»ê~ü¨‰F-û¯SÂoj’*s­Ólp K—æuÈRÑBÂÙàˆg?šÀA-ó«Q5ÍØÆAŠ©Ðä|çmÌlÔ:Vm¡Õë³3–š~øRp‰Z¶Ðåã¢õo8aq@8™ê½Heñwe‰@=`è!ïzeˆ£3a‡ù EÑÞàfI¯×U8~ÁÄ<0Þ <ßàÛŽ­ˆv £ºl‰YÕƈÓmøZX®4‹(9œë2TNÉqJŽÛN!®=2%…#ØS…oÝ„¯Lv?²òN㾆˜ÚØKÃÄÓߎ̯®Ñí’Ð*¹L.iK+Íž©ÕÅyé|Ù刻·ç6„Í{¬é7x㕨qðø˜"s‘ºŸX E‹Ó=l÷#\ZňÑ*¢}yàµ[q^„l§Êž¢;Ý"àrSžéîá.7±Ò â¦Õ/ƒO}_[¼Äu—v)ÿoèÌ@Ú{®¯DùóÌôÌ<—˜¼™3c0'1©'«k­óÌD>3Ï®œg†;3«k­óÌHž¿cÓ©´‹Ô07Ö°y&">¯;z"n³¹äßñáßÍØU;á-­ãSêX*Øñ5¬aJÕ—‹L64QM€³®³$¤2°eo×1Þ<€Ðd®Í™ ¶®ÏÓ©lºñ@äãp›rŸ “¶ëØÈêÅôG‘-3øþ‹ï~ðSçË,wp+”ÕåÁ>} T‰¹háõdb½[´-dN½{êݧ,‘rŸvÄ©w}#ë˃Sïúx‡jFxÿ=åü“ÊÌÉ’m ·>f¡M&ô ÅêÐ.û¨"•Ã)ñ´Ž'x±jº¢ï™œ¬èsÃVLäᨬ·kY¢RÑ2 _wõ¤ù]jáí=޲¤ ýH2Ī|¾ Ù¾IRõ–¦‡©ÍdÅŸqœùþ$íf”ôŸþ¤TãlÑü(Ï-ž˜íô½)šnØ?vŽl{DÖiñ™ÛŠi´ ;¦¡6ãcrz!vŒF±0LÚ5@Ü¥…󬙿ÖL6£Á°¿ëÜvýæžuˆ‡Od«=[êä*ïÈ.°xÖÁ³á¦íx?¸Ñ ý‘¬Fá)äQMM¸r<úÐ?Tsl¦fê9&öÃÈQF”íáovìL¾fǹ¨ÑoCıfÇê†Tc³áo`Cá³ rwü6ÙÙÙôž6ÈT;_™6=ƒ‡”‰€ìAÊ –ã HçÖMGΑM¸|ði$.±^d‹õ¶™ÅØ!Î)žíh)ö¾–}/„£C‹¼]Òþp:” `š2/ëAjS°áup(Œ8›[¶JNê£Ï©CÓ ÈÑ]ëÐSŽJËÑ8VIy¾(´«äh ¸ëÛwŒ„IfvúeábLø'L…}Ã5KÜÙ4±ÁF˜G3ç»y÷l“©P;zl7H]ÝXôB#ª/i߈ـè©Ê´Ì<×wmåæ¾f^Èž#¿çÈîF„›21í6˜L´|£ÚÈ6¢ße®“M‰ó‹bå?29lØDs…bA½þÃÖ²;•}—zt{û¹¦ql6Sž6ÛŒuvš}¸áÜäÃẔ:µÎï>Í˶LÙ>·¨éÇ*Ú nÙÍÅsì.]~ì<Ô©ÞÖ<>ææ<Ò¼†IûD$!©é´“]Ó~!/iZévè™y³Áôž ¥h/ ‡ƒ ÿþl¦» ãkºê0»Éök U¯ßdƒ­cvåÛ_ é-ʾÀ^-–©³pdK-"AøñÙjÑàžÈÁô ÙL?,5!ßìR×?›«^B!œ¦˜môm +‡æË9c›QNcÈÛEÑç4Jüίcar…©.Ì®ÌE¨çÛ¤CK 'àíˆf¢ ¡g,… ÛÚÂ5rÌ«~Çʰےð |Ganµc–Im§Ô'!m †Ï¸,”Üš‡9™DaÑnÊÂ)}ÛK;öh>Æ¢Âo„2œÍø¹°‘ñIŠç':ú]7Ïõ;úk ¿Á=ë;7pß©Œûö{zã„#D7{Ïû°£?îÁïyÕàœ­X>Û^Û©X\iJI<7É9š[´9DíðºÑëËß%&ÚÑŸLlÙˆ‡pQ{$[ {Ú™á=ÞYÿóà,hOHD¦Ð†q‰RTå»I/CÐWTOÑ5ù•#8ìžé3ý <aü$‘›#’yµg~J„lØú…¼;8c¸ŽÅÅ"êrÒa¼™ª¢½77‰YûãlÖrÖÙas§6™‡_r; Oüñ8»s]|1w×ôª¥VÓ|Á?¾¨¢ÄS…!ÀyæT-s6 ÷lãÔ”vO^5‘ÇïáŒ_¦k;ó8¬h…‹§‹¶˜n…³ò ŸºW\÷n˜/7"“ wÇQû—eqÏŽg1”ém4þª]dnËIázjÑ ¶ˆgµL»×™˜Ú'CT~c‰ç¡½X¹Ñ Œt¾@JEÒª»ƒ«õ ‘©ý½Æºgø´e¼a›Ë$†w° `Ö;eî‚íôR)5ɧîãªÆVöÖ{žÍhgsö2an$»½«”ÊÞåoxqk¨~%ß+¼™ú 3‚»nl;F™ke²W&º+'Â¥î5#Ñ”ZÊê«®ßHH‹|8Ò`A_óAVW ÁXœïZÇLUèŒÁöÐì…¿p4Ï>ƒ”B`ÛĹÁ¡‡CÞ8õdd Ï¿i¯jÑÖ_0–án® ~-âÇÇ«Ôçå,`Z|×?9¢ú„ÆQ{H̘hžu0';`¬™¤Éz_ÆXƒ“—oqÂÒ]]¤öÚHÃÖ6#ôÅLÿJ/Lé„äËåÿ‰žÉÌ endstream endobj 2947 0 obj 4016 endobj 2951 0 obj [118 /XYZ 38.2500000 478.250000 0] endobj 2952 0 obj [118 /XYZ 31.5000000 519.500000 0] endobj 2953 0 obj [118 /XYZ 38.2500000 478.250000 0] endobj 2954 0 obj [118 /XYZ 32.2500000 518.750000 0] endobj 2950 0 obj << /Type /Page /Parent 2 0 R /Contents 2955 0 R /Resources 2957 0 R /Annots 2958 0 R /MediaBox [0 0 595 842] >> endobj 2957 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 2958 0 obj [ ] endobj 2955 0 obj << /Length 2956 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯èó–Å—DAr`Ø@A7›Å"»ˆ³‡üýH-ª”>J¬.Rêiy°Û3b‹bñ«b±ªøöO_þqü×ïÇ·ï¿üçøÍ}¾ÿr(‹Ú”ý¿c÷óæú´…ûýX[süöëáûñûáóásûÿï‡þ…/ïÿÒþö¿£<þ¹ýï—ãßþÞ>üÑ}©û¯‡ZÔíç¿OŸM-ÚßÊóg÷üçÃ_8þÖÕ84ç:sû÷!´©m×™¦¿†aŠÓÏïß~;¼í ׊”0ÕQh¥¢Ñòøß~jª/‹F QWº.ïi¨–mKÖ y²)ÊŽ:ýðT/ø+oD£’UÞ÷œ*BU"\;ãä6²ÒŽ@&Áä^UŸ r-LºÊO=g§Š›Ü@휓«+ÛH¶(™€þCõ)è_›„°pê9;U†Éŵ¶rÿàïĶm×°mÚ†µhOÈVªT¦ì§ÆÔìssU;ÿÄ«R—UºÊO=ç&JÏT¸rÑÍ­lµ[ɺã¤RõÞI(Ó8B bÎÕ'¨ÜÔÉ Ãõœ*Ã,ãÚ9p%T6-Sñ“è\}ú·4H¦Ñ¹ž³Se˜ÜQíŸcjÁ]韀]Ç÷À‹/_o? ]¶üñøõ—CSTÒ ]t%Í©äã×vP÷õuF—§ÎHi\“eߤ0EÙ¨nsxîŒìKla›òÔÓsI)aI KÞŸJt¡U¿=—\|§Ô¨D‰¾¶Kõ*~¢¯D¨BÉva–t6Ðaè¸6Òx0‰?žJÌ0Ыë20æT¢ Ó*mõB~U+šÀˆ¼ì‡˜AÈC^ûD °®Dù”¥Œ¸"p ®Íï’°p²—gô@+Ø ïBŒ Ô6ê#¬ta©—âûÔRÇ´ÂÑ;pôÒ¢±á’‡aVEIw¸ tpUP$!I~ãv2?Üà LÿúÔq`_U-º©»”@ýª|k{éß‘CQ¢….˜ã ëGk$2´„k÷`9Æ–4^jòƒ`Ux\H$‰iØŽ6èñ!žÄÒq±(¹d¿‡ï`Eëeù´@¢T‡à’P 7MåKá×±¢(Y1‹9BýÊ$oð…a¤„ãI ("#*T/Ø5 s1ëÀX†`‚Rö˜#¢DP‰U ¥@ºêÛiŠº2Þr¢°7ADe…*5–8­ïÁÌê Á‚s¦‚Í›ReSßÕ„)ÕMúT 4¿Š ¾ƒÛQñ=póÕGù¸¾IX[ߎzÉ7ê+é.Áô-?øÓ–ðΖ[ºS%˜“p;ïà ³?,˜aeî˜a…çRQÂqã5@ˆ"N‚í(Œ"„VŠn™/7‚IFßÁ±”’¢ôlIŠÔêž5ü!cOÉÞêŒb§õ ¤ð(i%–²ÁÃ%ãc ¼ÿ!œØ4{Ê~ŽbåÝé½öÃkæ­Øê6•ÄÓÂgß À’ÊÖÝA‰eÕö5‹”˜/îóŠî j!ÜSu¬LÑkêåðäÛ¡Ò…´Vœ¿¥njQ×m´ßïÿ®›îµ£÷vmý6Ú'í;·=é¾eoj±·mü|xù!ÕÆÁ±Š­fr‹ëü‘²u²DGøˆðäl\í"‡éA6Òcÿ$¦‡„X¯”ðFðªý©ªò†÷h–}Ê$p=6A'Ê[A'Ê)A'J_ÐuO|Awú–º©E]·qtͤ kF‚®™tÍYÐ5ׂîÒFzA'Ê]Ðí‚îiÝ…ýUÐ]F@2&aA·œ‰ø\z.'\Ž\N¸<¸¼py àí+Þ5åµ!Æ~ú–½©ÅÞ¶‘ÀåyþaÈØì‰jÚÅÖ(¯§¶Ö„’>­7˜n/E\ S.ož'Þ ³\. yÜ™o?„Y¼”Ü~àcæ0¶9f‹ l€0ÌàÃq‘|Ó$}š=IÙ›Aõ8÷†Zâ2-ûëºY.Éò2lJï1U/–~¸‹7—ÉÓ;Þ”¨Ì^„¼I?|=lËŽ9«9A󤲌¸ŽIEq!¹ÃÙ?¥¿Z3ÚÍeR>w¼Üñ2/לØÝ"ƒÍ·ÌH5®dtûÅö|™¹,S®1Š þ8%à&ì´íæèdàÔƒ¡öü ·± e´ªÚ'µ3£O¾µã©œ±õò-s[¹n¦{£ z3«W²~3Êž^ºéL÷-×Û¡šÛÑtæÚ/‹,ؼÞIno¯÷“¸ý$îéNâT¥=ö终¶Yûm¾*'‘®ävxç$rº&õzÓi.ªò%T5)¡ª‘„ª&$Tu‘PÕ­„ª| e&%”I(3!¡ÌEB™[ UmBBU»„Ú%ÔóJ¨j U-8qÎçÝ‘í{Û—,åÐï­z2åõôÑ<œÛÓ©yãÙ"îJÁ‘,™º°MG\à.Q’žAú‘‚¡ÒîI=–ß±“_g1 ÆŒcû)Ö9ЍÂG¹n)ã°8rç”àíl„.“C€’JX?ŸMö£Â%"ŠUMcÎ^EØð&î Ìor¡\qè”(}<ÒL™Â·ãÓ¦'^¸¯=Ý£¥3kJ_ ïÄ)i3ÈPÒMƤçZÿ`˜P ­X=<²)-«»mì"éNûû†3ÉPP- ÀaBf3{Êy)X†¬ž\0;÷øËˆöÝq°}w|ß•8ý¸E%nqQÙ°ò…ÐBß$ô ÌÜ·”¶X—ìj~wBI³tû_m òIJ⎃º´¸%ÊÆ¬\OkôrÜȇ•˜±¤ZM"ÖɧUÚ‘Q3›ÕØ6[w=÷ôQÝG/¤^-%š’²Ç$„l#êMž§ì!Î4­ŠÄš>ççò,âõme>fŠ¥ïJu)­½Iu)m3‘êR6ÂKCÙ=ñS]ž¾¥njQ×m ©.¥­'R]Êv#äµÑ>ñS]ž¾eoj±·m¤Ou)=€£‚ApÀ ¬Fnñ¬þ*$„Åí`NçuÈŒXëþúÍî8ee<.×p#ˆ£v‘¾X£LŸ¬X(olë{=RT•€3Êg’ɘ×i8 =QV=Eá^~ÿo†xºòøvµ=ÄzÎ`¬ÁØÙÌJÍï¤(Á”/J$‹é—×”ä*áöB±FG¸HdÊÅ3ÆʵlX†‘ë"E,')ÐEäDȵó%ùVŒôŒ\‰Í–oÓ§³‰qß’ÝkËʪ¡™¬èµàC\âv²ëöp­ X“[—„Lñø Tá\õ®½:±«VƒåœW+yÌ«rJs]C—Ë[–”À– –0›˜2>o”ÒÞ ßü.Oz†Æ¤­cß²¨jqk„î©+LQ6êsáÑ´ã !‡¢%ÀC89»Ã²œÒ¹TÞŒÄÜ¡L±ÉD§yàßÏ‚M'Ysë¥yË…»¤cÛª¶Ÿ{Éàè4EkøžÓ‡ø-àþ¾ÁâzGŠ×œÀÉ~ñ,àuŠ×ÏÖ‘ÂÚ=Àó3‡YPÕ±£ê]¨º|zÌ’UŸ kÔâþìZÒ^ÂX‚ßw-)„5€\Q}ÃÇ_K#|̆Çßdž¸üœ &Rt6Üî5^Y¤5W‰;€Ë#Ûtó²m}$ÞK^¡lÛGüW†ø3ŽU©o=qø¶þ­¤c¡õý)Q]™²?ÖqÍúù})L›)Es:'J4%ƒ(%!Á·–ä¡öf¨MXgIÙ’Ô#Âz‚mí[Ö¸ÎÛ¤Ô2‰DܱǚwçÆ¾ˆ¸XQ8%?*¦—YkÚ^ÊŠGL(·É8šqê w龜ûçxŽÈ†!™÷ò<Œ éwpB/Uû;ÅLZ V_cbFÇÅ®¹Í`ÁKVp'«Rà‘â6 õgôç«L=0,¶e:‡'Y0a;ØæH ÃaD»Þú¹ ½V/¹¯®fû /ö ”¬ï‡ÂËÿ~1g¸1_±%˜oµVC€èŽj¯Õ¶]µ‘³ýÙ±‹»[–Ú3\^¹9±Ë–ƒÃŽ]ÜØµeïêõqUbï¸M ®•v¶?;âÒÖf€_ªŒ3¬Ï»ÑœˆkÏ:ꎸª-Ò&B%û¶ ¼k.§€;ÞeÃ;1£‘ç}jF¼kª³^»ãÝëûib·‹‘v¾?;F²c¤Ê8ÃÍy?œ#O‡®U¼n)žÃîÁ+šïr=̦d‹êÁc–¸è’õ¥ïIöaøþCIE‰™ØrI`m¿2i"!ÇgŒ¥Î"×G|)²ećܷ#~ùêÇõñ©ˆ¯àx²"~}¶û®Žø cçC&‹^ŸÖß¼6ÄßuüñÓêøíÏñ{ íAäÿ<÷…îâ\XU´ªwÛã<»‹÷§SþÈýz¬'|~û’…¢eà8Ìs¤ñøÌîô/T6ÅPp³^³\…haß0QìýÌ^—ºp@9Áõj¢£8¶æÊ pV|>~>ü@1 endstream endobj 2956 0 obj 4982 endobj 2960 0 obj [119 /XYZ 38.2500000 737 0] endobj 2961 0 obj [119 /XYZ 38.2500000 737 0] endobj 2959 0 obj << /Type /Page /Parent 2 0 R /Contents 2962 0 R /Resources 2964 0 R /Annots 2965 0 R /MediaBox [0 0 595 842] >> endobj 2964 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F8 8 0 R /F9 9 0 R >> /XObject << >> >> endobj 2965 0 obj [ ] endobj 2962 0 obj << /Length 2963 0 R /Filter /FlateDecode >> stream xœí]Kä¶¾÷¯Ð9Àöò©`ØyÈ!À`È!ÈÁXÛ ŒØÈØÿý¨[”fFÒÇ«‹Ô£å…½ëáŠ,VëŪâç¿~ý!û÷Ùçû¯ÿ˾¹ßï¿ı°¢ù';ýúôþª<º?gEi³o¿^³×Ãóá¹þïë¡ùàëýßë?ý™©ìoõ¿¿dÿüWýÃÝ_:ý…_…,êßÿ{þ½*dý'Ñý~úùÿøKöÛiÆv9ÌÇÿÿ$¥µ¦:qaé×C»MyþõǷߟ„­¢´U™I£M&+£²ß:ü\/ÐN/Ž•‘²ÈM!®Y¨PõJ"Wõ"ª™µb°ÐùÏô’ò:Úä äìX‘:—þÙ‰+µRAvÈE×ãÿmú“›ˆÄm gÇŠ#.ž]žÈ«¤ÍË\ÕÒéX Ýüïu»±*oPUäpÕ̓¹ñ&?CΔ–ÈhòH4έ‰Hãnöd(T‘NÇ¢1œœSH—õÏèQy ÒvÓGÀ¾¹GÚ3äìXii‹gg$®:)3‚*ýÝì1h«L<¹ß@ÎGZ<9'eU多±Ð°_Åš*7eÂrv¬´´Å³s7¯bÛnöè/ʈÇö y¬c 'ç¤l©Ûc+c¶›>ökˆã¹D äìXii;˜ý9d Jó“yõ|x÷røü$¨Áʳ—ŸOfûyÍóo/5Rlöéb*{ù1ûN]~Ÿ½ür¨Ž¹²-ˆÍˆ¸ƒ#‘1hÄÀu´F# B€¡–x§xD…ïǃÖuĵz„…³i 5üƃ>âÙéNmµ=PßÃÙð©‚ëäáà³±£¾Àoàl6ñG F=ë`ÊAÜi||©ÕFt‰¯åb$¾„³y¸"Õ9Ãz îÔH8‚wšH§á•ø©¨ÍKÓ%ËÛùGnGâcÞI*ñm·êì_C°N‰¯à~öY#KÖ›“øXF ø ”Ñ»–¸)‰¿á“ø%÷FœÅ½öã‘òhM^vDܹ=CÚG‡4G%OŸ¼#ˆBßÈf¤<–•è4 е*åÇ‘Qæht“õ6bá:ø›Žào lîìÇ §±ÙÄ(Ä5†Àæ !«A–¶ÇGNìZ4;â˜ò#‡5˜’ö(*ýÄ8[ƒ)©Ú¡·ÃóùèòÞZÇE¦o<Øi8Y·ÇïÝHg3p¶GÈ-9ÜÞ©€4'¦ìËè é=H)ûÓSv 1ëÎû°p„B' qîÙ:Ü© lŽÍ‘ïÖ‰( Œ){’@øÉ£JˆwHUNÆ!æ°›b²bVÀÇüY¯<9çøÀ…1=Pf#œ$pºI·Ä‚(ÿ1lÎiÓùåa&<ÆõÝdYr(Ðã£pÒ¨;X•#EVz¤(æÙ›—ãÕf%4Åܺ¾q²–Ç!®Æ¡ò†¦sˆ¿´¢ºñÄÞó„FNíQ Ü7Ê7ð› ~Ó ýäÆ÷\)ç¨ŽÌæœõ‘o„Ú¹Raß4;ÍZªKàý4Wõ€)°=À‘{8›DP;vºuN‡ë8‘96R] vTæ7=îoC;y{û¢=S»ZB|@ìbº˜kL7ÇÅÍJÝn F($¶jIVzß×÷8¢”0ÇtÓ΃YÝÀ1 ì·S¬2¼N€i¼üPBí1±9ˆ!px©DˆôxØvÅVÕÀ¯#¸d!l`$bä ‹¯žbüx0d;¾;bEÑÓoOŽàS¼?AÀHrVK9aÇ$Ÿ~C²)(2ƒå. Ñ‘%…—¬Gãòé°ÚH$ޤœ0Š• Î¶Á/r3 ý=„ììžÄ¼Òö)Åi¡„ñç·öc«Þ+æÈ‡‹pI¤Ûl³azEká+ Â5Aˆ@¸o!Ilø É–ïoÃã»R®€0œ#Ì:}ž%yt8ð%ˆGUDOBr19-ÚòÄ¡È $½ (ÊåÖÝIBz(Ε`ÙFÆ-ÉxÃ(¦Ø¼ÚísË©j7’ãWök[ö¤Ý „˜ ÅÍb`À.J 9¦ÊªLŠ ÔdÕçœ=õpO=Ü@êáb | —ÿZ_]/áëÚ"O¼»ùG!r0—gƒó–­óÒ¹uåÞ$}««LOi­ûR%UÙ¯td®ú¤Ô·³ÖÏ$»l¥8ž,+"›8¼‘H1ßÛ°†Qx! tRÅbH~ÖZ/–Â5ªÀå¨áòOSôu-o_J°-À¡Üêð^ËöE7Oá!v| î™{]kŠ2+ž’Äé-ŒhQ¶ÇQðúôFâ‘$ùÂÒ]™«•,®”tÌÖÉ*-X^r"Ъlü”ñ\ývu´›Ä3›Ä¨eåb¨µb,b1XœŸç ~vµ4°B6)Ëj1tÜ"~js|%¾O Ü Pîap7~$•ÔyfvNJõTí:¸ JsfL¾jü.YSñÞ©,ž“r»QNÚ)ì(\šRx~YÅêš‚$|i…Þ(_îü…_L•¸?ac'#•×qE–e^Î ]™®¼-«ËUb ï˜w˜¯Ê›;[»]Aç—\‹9©;/äæEêòiR²¡’‘”Æ›ú1ýiêu×^¯êHªY«õ™klWUï>½¬ƒäÉA\ð;î,í =,z7ýlP*ÓÓ6–‰ÚGPöôÛÞ¶ãÝ¥òf2{N*%±sÚô.ˆ³=P)©¿N€ˆ%p3©¥¥}Àç­ÉÛÍb¶–|˳ˆÖö2¶*Ô^å>8w7OY\˜ÍV¹óÖãÛŒuòåÍÔUî””•ÆÊ;ž7îÑ È—Ó€òŽçµH{O߀Ùiï¹Åw8ô÷}âG_KY~<Úa­cç²õx:çM÷æ–ëÚë/}¸æyU…Ò³¯³õ2RÞ‚ü•?WÁt¹õP›UUOm­õC’>(¶}4®ÙäŠÈp¹){˜J~*»;…[§Ï\Ur=¸J‚‘Jue‘·“Ž»dÚ§*èÛÃn{ØíwÒÈǒعo­;¥H®eXU^ì¼¼ó2/§àX-DW"|;–Þ*9‰dn¯¼J×=±ŒåMxØeßõz¼þ•½ÖÌäåµçKaBh§í/+õQÈSBÖñ¢»¬ ¡6ÜSŒ\p4ØVGuÎUri>ÑîW1ÀöXHý­£/Ç`{r;E5øÊͼ$ °Òm}°AÇÐøúG©G¶!ñlðwW%ƒ¶þN™SîôçârûÇX…,€¿Á,à* qšcVñží/Àý`ž#í§ÏìÎzÁžc ·!1«á3 Ñå9ˆ%„ #¥¼žÙ ¡NPNãzg„ŽÝì~P—ÔEö|ø?r«#Õ endstream endobj 2963 0 obj 3723 endobj 2967 0 obj [120 /XYZ 38.2500000 602.750000 0] endobj 2968 0 obj [120 /XYZ 38.2500000 602.750000 0] endobj 2969 0 obj << /Type /Annot /Subtype /Link /Rect [426 219.500000 516 226.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn22 >> endobj 2970 0 obj << /Type /Annot /Subtype /Link /Rect [43.5000000 50 549.750000 66.5000000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_debugging_search >> endobj 2966 0 obj << /Type /Page /Parent 2 0 R /Contents 2971 0 R /Resources 2973 0 R /Annots 2974 0 R /MediaBox [0 0 595 842] >> endobj 2973 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 2974 0 obj [ 2969 0 R 2970 0 R ] endobj 2971 0 obj << /Length 2972 0 R /Filter /FlateDecode >> stream xœí]I丕¾ç¯ˆó-’ZêZ˜Ã…*`†F{ìÑ6¦ìƒÿþD¦¤ÈL*>Jüâq‘‚ntW9™¢¨Ç·¯?ÿÇ·?žþòÏÓÏ¿ýßé×éÏßžªs×TãÿNÏÿüôöº?O?u}súõoO?N?ž¾>}½ü÷ÇÓøÀ·ÿuùÛ¿NúôŸ—ÿzúý.?üÓôKÏ¿ð·§Nu—?{ùsèÔåoÕõÏçŸÿïÓÿÛéïÏ;ί›óþÿÿ¤TÛèêù+¯þñ4¦zù矿þýéç~oÑÆTuuRµ©Oj¨õéÿóôçË æí«óP+ÕµuWÝó¢N_Þ¤{3œ”ª“QÍâE/ÿÈl¯ä7¿œØÛ|<¹8T”i•{wÁ˽@h†þå_yø¿n`ó¦êÃmþrrq¨L—ëØ]òr;Ó†¼Ü×íl>è&Üæ/'v¹xwÁË­«FÒº—Ñëöà_ë.åŽ'‡Êt¹ŽÝ%/÷ÂÛF5]]wþº ÇÆ“Ke¾Z¸¹äÍÖMðf¯»‡~£ê€hó|òP7 7—¼Ùö²8iûfû›÷u@¢}9y(i»Üý«Ï.ø(ãO€-÷Ãñà/ߟ~þ¢êê¢áµ§ï¾n|çËß/@iN?=pM}úþ§Ó¿W•úåw§ï}έnæ#Ž+±b>Âg´¢zøŒ†ïù w«á Ü9já3ˆg Ü´òÿRݽ¬|þ~AÇà˜4èù<ø»ñà{„°Rünˆ—c~ÏÁ0É/¢Øw¥GÁX¥ÔÃñ>ÙÜÁ“n­ÔïÞTåîSݽÀ £ë­«ñzûfÔŒn]Û¼œç„ãô¯ç6ãÎýP½ÿÕ 7VÔ¸‰2g£{uY²eígð{Fì©Ïµã ¯+ã}7ók6­†+<±€RÕðHÍËŠ97uÛwï6iáö\éíCX`È2PbÞ3ÑËOŸ$¨Ró݈҆( ŒeŽø]ŽË&ðÏçÝ0R»Mz ­;nà î¦{ÿS›O¿1rÀmføˆEø«ìÝ:8ÇÚ§”YM¥-¡%KÕ e8©5ê“?Öè)•ž—6HLdKŠ_ ù3Ű8Ãx‹Ÿa8\Ñ ðèM\œÁÀaD£8b*Ê@‹¨-¢öÌC(ܪº`‰%Q Ÿ<0ëÁÏÈ2%ŒCÖX_cÞƒáæ!&!¸|29ßÌü%»–ŸŽ‰¾Í'ߘ®æ£Ñ0ÆÕäbí·@Ó2C}XT36‘ˆ’z³UõƒO ; Þ¦C‚n×ï™í±þȸ«±èಘ,0êÉêsÉøo$?ºø<ç ±ª•¶èìqBVû °O¡±.îµp¢6„ƒ¹$fÏ„áºÊoBêò> R…“¥âdªq²}ò‘l‚üé³ïl-’qÞ§× mi‰úÒ;¬ÂÂÖåoÃA·fÎõ>¶m§ªsÛ©÷Yø°íŠÍ o¼Â€w{(ŽÑK(ŸÒšce“q.² $U†Pb9*»->ð·R‡Å·as­Á+Ñ`Ÿ©Ûé«;ÐÊÙ!øÄjà-‚çR_õF¬03Ô'´Ù}v€R6Ð/BÓLŽß )˜§ÜßW4r(” Wb¸_qÒÝà¿Là5ÖµìVÙ®ç'ȦsQ!E ?¿G›C@3Nµ‡ ‚P¢I"™/–Ð mud)-Ûºµ¤¥êaøc†à †íš.Ëj;Ø>’Øñà–„ éãè"(—ÊÈc˜Ö§X†N3ÌX =G23Dâ’¦LüšI„”Í`ZnX:Šz1¨DçH™‡”‡ÑÖúídy/¥L0œ›d€){aHŒÖÝæ_u{DJA¿#µ*ý-›m\…¬ç,…«8KDŠ…ƒ¬(G×zÖÃäŽÎB°)ü} ¨#èÚ³~Ñ£Þ~ÁøÕs~‘á[}‚+Wxõ-×4¡¿ ÷LFJ@òíªÚ†.£.b‰éka2y&‰Lx‘*ÄX¡Oa¶ƒQ¨ A3™:͹ÌûX![u¤LÎ.Æü .V‡º±é’©)epc»#†2•<äyܼ¸`Þøb7èvÝœQv˜ŠKa¿Â:‡_ìÈqý®|õ/¡ƒÕBà‡öûåwO”\å?=‚+²ëï@ÁÀ¾µâürú­0]â[`RSªÑ96¿ˆ¿ÏPeð ã<âlTE C¦L˜^ôÉDƃíà;ÅQ Eà3„÷/hG(e ßhVÍžÔX‘VT5¬âf/~°?C4ÜÃØ9 —wL*á 27NqÞÐØ 5QÆËinà²_Q,Ñ“;|fyßë«£¬ä‡gAò{C:B›Úº<¦äÑ=:hΆZ$7±pá¡D^ £0§×¹îàa…Åóè‹ô*\¬ürDi£m€Dj Æh‹ô-á“íJáãgÄ@ñf'Û»L~Öá‘Ô®¡·>:tr‘uÎÈÞ};/ñöõçÈ(RL£ß_pzJðëY” ýzÚà~+p` ³b>Á•!"ŽujVör™HJhX•ãx'GþœO]ãq6cHLjzþ…é­_üá+ Å òl à÷¸ÂôY2ÿ edÀ;± TG“Õº_Ç Üÿ‹—Öq¾®îÞkqÞú: ë”X´Ž1ߦ ÌÍ1ÕdÌ0ÈßYäÅ¿å¤mRÃ-DÖc)MS_gh¤ªó¶|Â/he"ôæ¬Õ²Ï è™ ù•9ÙßoVàn‘µg£´e¼kx‚‘¹<;Û­dòIdÜú…Þƒ¿?3¡Þ³iΆa0ŒjgÛ| ïÁ÷C¼Ç·è™ÉQrë~ „u…žÑpÅqsãÙº³YxLÜq`¯kXñ 6½yOd~!äÁMGî”DYêÒ&ëŸm½èpŠöG8JÕ%ŽÈ¦ÿKtôØž:½lÍWò wéW6B‰b wZìMìl‰—¬õ “¶(+’Ë™a ,Õè¶œSЄ ш0½°èÛaJ]VRòqU¼ýŬŒ%7“åÖÉN€ ]>’:ëŽ6óÒƒÙ2hW2„w䵕N½$™¾*ÌÄC‰QäpÓ[÷|N&ãÁ•Õ3Ò·ˆei2¼sÌíÞ’ÕÛØ7}g3K9žðÿÖ Ž]È;Îz©aöSÏ><ÔÖ6»IEÁét¹R,ªí;¿Ð‚Ò·¢fT‘ÖÑ*%{ï‡N貕§]ó}¯¬)-–§‡Ë¡›Í²Â!°ç/Òx‡_FÖi‡™É=-L §¨Q­¦œ¹GdMðQJimƒ—в¦ä¾à³;„[o¯Dõ©_$z¤¸š¿«.Y'™o$‚sR_5ƒ}ºV^“;- z­þ0ÓCVïé|¹µ¹yH>?»ôº·RvN 1Ùa¢˜|á!²‹ Ój»„£N¿}°Lúö¯Fõ9!#U6î> !RI&Ç D‚k3†¨¤-¤kröŽ\E!¶Ç)­…á3;윚g"hö¯Cs”CíFÈë¢WqÆËÑ4â¢A kÑ’°¼ÛhõšÎ’¤L¯:Š™KÌåŽ5‹‹J¶Ê/gLfJºÇI<& ‰ê-†‘í*4Î>½ZÝò”ÀLì^Üij}Ë/ád9êH>¶»$•¾#e=l§å]%•†î­/*Z¤M:D-§TjQ²ä„ÉÄ`‹+é8®¤])ç|%^àL¿¶·%Ñs‘éNæè †;âÈž-|`W[p/)%^zBIz¢)MÂÉ”±j‚³ÚÐɽM¥“ÜøØüYi3Ø‚1¼ÇVׯ~)vS0æüÑ+ÙvRÂJ®?³§±½r«CåÇ„föƒ ½ÇáõÁù©®Z º±¦!â(Iû£B3Mø:eö ~¼e0ÃÜ^ž*, 1M4UÛ±ÇõëÊyÕœ+»M1ìØ;i´JÏK[¨šI!ÈÎaacmŽ ÛˆÆ™Þ€{H\=J£$‰ Êa ÛÏ’)@½ÛÒ÷QR1€½h•-x(MH(ZöjaÓ?h?}á—°û °°"úï9ÞãÑò8›°{¾yÁÚ˜à-“•ÊôO™pê¡MÓ€Æ Ì†D­t¢f?c]vžBN÷#·W™X²D„²DDÁæœÖwT[%ZVÊáU³šñnn/8¤”v&ηV5¼“®{^½}ïä˜q,LÇÐ5r Ú»]Y ó(ãõ©†a@úœ’À º’wq¤1éé²³ÊdSMqVÁ"¡4–»l»µW–bë3m»¶LÝ^`”ÐÔíX™¦eåB3ùYÖ óÉð„iý|”Ä*Ǥdb*z,Z½mŒUr³š7ðè~žå^x´8ÆØ³/3ÞE)ðh+…GKcˆ0ΘŽÈ×ûêí-|]˜¯+Œ—Öø ƒÂ× _Ïœ¯çL ‡ä뺽ÿë✴nŠ $r®/‹e7ðN‹Ê\‘/·uávÈí2¶kY¸ô-’Û]ç³n÷HÜ.gk¯p»ÂíÂp»áuÖ`R›{%imhf—¯£À“)ú’ÈCÚWÖ샔£ eS)£8'g’‰tÂäûX…e6z06GÒ –[ø™_Bs5Ó.Øšhí§Ìü3¦,(Öè§EîßZ9GÐïöm2•þwÕv1iÓG¯6Éy¶€H £¬b@©&LŸsÙ¾LÞøá«tò#9‘!mÇ*XÙ¢4Ç)+ Yjz[ÓyÜ‚ªþ™]‚Ûx0ÅÙqºìµC1ÞOij7Ûé›3}W( ½}ì‡GÉ£Ç8ˆŒp¾È 1e¤…¨ÐË  ¨·à£ìºu( æ] fàLœd­K£A§”a£AÂZñqõcÍ—Ág6´«ËÑÚ{Ü$ºÔ#CÎ"Rµ…”£Ä.©í=㩤/Ñ$ Jpʶ¶cÌË=ø•µ Ó ¥b‘ôP")Ö`­ú‚p3´Ço½UþÀ˜XL¦zà¤F†ñ MešïæÌ×¶'bPÆ‘2a=P[|£LŠ 5¥ãRÜîë›Ô1Ãî!…XßZRlW}‘0ƒƒƒ328VÅãÝE7,ºá!uÿ/úqÑ÷¡¶×·ݰè†NݰÆÃ– 'Öð=޳ÚéÑVrÖ uoNv 8ÄwcúPcˆbI‰Ï†å;£G`·‡¯á¬‡cN޵’¢ýí§¬W7솢Ýp“nˆ¿Ô¡5=ïxº!3zã–ÕXk$|?h€Œvš\7,`<Ê*+e%#Ýpè‹nJ7d¢X2±Ñ‡ÑN¶’³nx¸˜òÃè8Ž[À+DT;=ç3nX–ÀûqXCXš1VJÑAËJ6º¡Vód„¢Jë†9çý¤çÞ£·2E7,ºá~uÃÂùœøVr.‹î¾ÝÐÌÃ?Šn(î7|íÃÚ@ ©!¬qö¢¢p¥Â”Že¤g Šß0oÝð`µ(}…à½ßié¼S"Ôe%÷ÏC7lš¢ÝðNݰ¬<’nÈäç9hÓ)Ä^ÆSq8¶èRE—*+‡\‰¡®Ìg4Ê"Ù[ƒqˆ‰€Ë±dÄ fV5€¶†(:ÅÍñfxèöy¦²óݨÉÓ§Ó?ÇS«æ\ æý„!ˆ‘“3GéyéUáOmÎÕ=“<ñÝîrP£0b@èPseǾaV…w#¦u/‘ DÇã˘“ÌY< …¸0áQéÞÓ JËF–¸L&àÒ£K†ü³Nxňt‚íS$:Yxör¬Yåq™{`÷ëÐ[|ãq¼…Sä5 Wî‡Æ†î'ÂT!X-#ê¨i¼!ˆ;à ±ÍÊ]iJSü2™7½èqs³ë‹M2ö;0·î8Áv/†ãHÄ\yÇaÍmqƒuh^;{ðÌ.Ym`ÖäA–ŒŒ½cT|@ŒPmm¡„ƒ[`ÊÇÃá±sN»â#(>F)¡ORzãÑŠ%cnˆ#àM_Æ|.®¯¤Ád|œ•’S•4÷-”4˜’SV¹‚Ó`T,#ú¢·™I©k›÷š«C—ðÅW' QÇ‚·!œ`„ÃØ[ˆO`ÁŒ ÚÃI¡ãÇK`G ”FöhÝ"&y ¿Gâ’´Ž¹ ö3(›“>éEiK8⬊„0¿Üžôèàp8éSã»õ¶1ôáàåø=ð±Hòp‚NVæ7ÈÇ]G÷˜Ì†ê²ÂØ,0“Ò¸l>!œ—¿8ÇdyBè/¨”J§H™‰ÒKx1ÉKqƒY!÷)¥ Òs\‘Ì­¿H˜Œž¾ƒÇŒ7ÕÃ<Úáq„Tì[Åby‘í4°wHÀ^qü ŽàqÊÖØ—¿ÇÜѶƒ9l8ìI7ØÇŽqg—0À”…c¢ÑŠõ.Ìm~%㥌 ],Q[ß ‚„ÌÈ1öͥˈbjM°gDÔ¸ö°>4QO€‡E[k¸½‡M˜ÞË–a¦–hl¾Y¢A³<¹ÖµÍ”÷œÅÒZ©ÛâËÏÐ!¶¡Ž!y"3~åßf|]É=x·U§WhÕr¡[6ê‡íúhØ ëjéIÈÂAÓÙ`Xø‹ Òñqš™éCÛûŠÝ0éL=Ô1Ú+8ì›7YXo N½#¸ñ'›(UyÐUk[жÅËrûÓ r ˜<ªA9‹÷«–÷ûrM/·ÔŸ7¸\œêôÛŸüöô-Ѝ…k)pÁd|eLxˆé§#[ä‘ ¶ † ëT´ïÅ §lTÄŠCãå ï‘´nའ­Íå^Ït1"Çþ\Çoº¢7UXƒG™Þº¿bð܆”V©X9«ŒÓÔƒÖ¨ô`Yv!¶×ŸãÓÇÊ„¥:.>Œ*¼ ^×6 ˹:š¡6™´+FU eÎI„(, 8à‰Ÿ3è‘ø&kóD ùÉf‡ïªxk»=»Ã–{}WÝx[Šl£,HQl-Rgç}÷#eú¹ÆjÄã8‘¹Ìî»ã€pûe*3V£q\C–ÉÈÆÅ!LÑñLàD´‰Þ@7ªð «Î"½¢°)FÔ:N«¾­f1 ì[(Œrd§0®„ä ä·§Ãi‚W˜ VQ‡èª›ÛÏì¶Ae1 †hîŽG2‡†ÂhxMÍÈŒTȉë€&mÂà~‰¤‰ã,ÆÉš¹qm ÝBŠÞ[VQS– ¥§·§lPFÑÚw,’pR¼LY¢™L¬ !Ÿ´o"ƒ„ S†ŸÇîC*ÿ…Ï^ÝâÍ1_0ÒÐ%ÙðŒCäÆjp~Œ„¾hY$­éæW6þ÷¡ 2ËM„P}<ŒLb!c@ʶÕÙSðñd Šcµ5``@x0¨`ãõL.‘öŽ“ ¨Æª“„–´#Ú4ðÄ#Ø0¥½¦²‰4É"؉ƒÑ,b4G3IfP‘ öüf€ín™Ä@G<±Î¶û­b…R©¢QU(fªv¸~w{"<öÄÑ‘7¨Âð 14¡ÁÉED1Ç 1¾£YkúþÐ+9D1b~¥uÎÕ]~¡p®Çã\Žf…ð=ŽQ4 ¯ÙsÒhBN\8×Ĺôu¢Há\Ò£æ wØ)wÈy¥p®‰sÕ³s³p.qÎUøF”~´•¹&ÎÕ^û#ÎU8ɹÊJá\±9W_ÕÙØ69{1¾à!¢ríù7Ü£žÌçì]Ëù†±Þè am4CßÝ5@V4Ÿ,Ç'&¥‰È'ˆT'Ž©iº²Ië‘ Cõ-”H'I?ÉB¶tÖ'¡Å£ÔƒÈ¡:CóeRò Ð;K/èЄÖŽ»N,õKÃgóèÉŒk#˜:^¢~¼ÐclzL©Õx4ý7%…t WHaM aN’i;_Ø…kêWö*$cõc¢ÌB($™n¸B1ow‘Ú§-¶/7Aàªôä·áhýŒYö(ˆ éÎÐXU’ɨ<ŠÃµÆl—FÓª…rìê4lá†Âž1‹¡nÑ.ò¦L¦°žù@Ù¡vì%Úx9¼¥ŒûD¤Eºì¼FÂ,zLˆŽ;q µÇ‹cu̵d¤HX²êULZ"#>„›Py´ø`Úu0žŒÛhn„îãÙQ¦”&hrp´Xº¬Þ˜ Ì¥zKòQ홑„žáÓ7}—†gz¿¼ƒ ”júƒé}{WtÊ mrƼ‡ðò;¾# FæúE SJÅšéà†ºŽêFÎ GóóUó¨ªRÝf‘*Üúl{vÅ5ˆl3Ÿ13Ló?b:JäÔ)µÓä×Ï¡Ã%B„ñ3>Þ ÑëgT,†1 #ÝÎBdfÔ¬™Ia‹"f`£Þ£‹WQœÁ¥¸áÝpéÇàònwWH9†$Eˆ«¹FOO-0_ê¨tÁÀ&aú<¯ºÉ½!‚ÖÍfD`Zj/m“(ÍOÀ¤.–T&/9‡ÕÆ~gòSæÃHœ·Ò‘;›û4jËšf¦3:ÜZ²ÁsÑ€25‡RÖ¾Þ>éBxRƒ‡K™a­¢1Jæ. ‹‰d{]UR· ñäózJ^ƦÛǹÐr19aîƒÕëðÎZ¥m;¿$ipˆ»ouƒbh±¯kfS„ĸîèZeÎuo²¹1ÂE‡„î#ëñ(YT"˜‰˜ªÛÌE„…¬h®4µ¾ðí ÐKDÞ^¨,;o”©¶wØe‘j÷}dìt#bÍTnDÒR_Gø¤iMÆL ‡\`KÇ XQÁÛgµFÛðˆTøÚÅž| ,cèøðÓà"¯k 7bEð™¨X 3Þ(6•*ƒ¨8‡Ï9”eL/GS8Ã&4±&ê*•;•ª„LŒ•xÞu«ëÞV¿DƼng[L"_¸¸ò[8ªwp²é”ÇÕZÀø´™ÎnŽLŒ«<·¹bñDµâ ,^@¡ÏÏý?^O§ endstream endobj 2972 0 obj 7386 endobj 2976 0 obj [121 /XYZ 38.2500000 751.250000 0] endobj 2977 0 obj [121 /XYZ 38.2500000 751.250000 0] endobj 2978 0 obj [121 /XYZ 38.2500000 610.250000 0] endobj 2979 0 obj [121 /XYZ 38.2500000 610.250000 0] endobj 2975 0 obj << /Type /Page /Parent 2 0 R /Contents 2980 0 R /Resources 2982 0 R /Annots 2983 0 R /MediaBox [0 0 595 842] >> endobj 2982 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F1409 1409 0 R >> /XObject << >> >> endobj 2983 0 obj [ ] endobj 2980 0 obj << /Length 2981 0 R /Filter /FlateDecode >> stream xœí]Ko举÷¯ès€í_¢fðõá¯Í_ÿ;Êã_šÿÿrüñï͇?u_:áûÁ Ûüþõò»¶¢ù«¸þ>þïÃßþpüí×Ùc¿ÂeåÜ@éONÎy²u)#rãëì€_*"C¸¬<7†“3žlYÔEÂä „âM~Y9;Tú³Å³snÙü#Ù^g~[ÆDœóÊc‘-œœód+QÅ$ÛÛô&¯UD¼¹¬<Ùfÿ2Ë를=ÿöà-}ñ<øéùðá©á‚åñùçf¨}áå×ó÷ƒnþqöÖöøüÓñÍzôŸŽÏ¿ôI«Ö…|þÞeD‰ËHuý@¨öƒSU¥4¯¾ZH4"ÚI„:)Y‰fè6‚ŸÁïy¸Œ<>7@¾ÁG á£[/p}q…›Ã*Ê×üzø ¾ç½0Þ †>Ïžíñ2bú#x5b' =òʉzV­$“5œÄ\FÔÉè²²ó¶!Ê™ã È÷ƒ”ÆÅÌ6ÚOfáR1—ÎKpˆžJQ¨ Ÿ 5|—*çŒ=ÛpÑÁ³¯OîW)€™&F…ÀF" Ê~⡞Ïo©‡Žâ•W™BÉ· ¢‡ám™íy×'[šQp}’â-Ø¥DÏx¤@Àí(iìà |~¦„#ø¸6ù o g+ D!¬ñ Š'´­¹ÐJÝÊ8x„ AY´7èÁ¤ˆ™f p6YÁÙ0¾p²#ÓÁ dƒŠâNÔ—  bá@ ”ùR]>@¦Î*³]ó€ŸÑèʺ â“GuÁ¬" f ÄbÕn(ì™­ƒ[q*­x‹- s*jõö=ál­À²º1§Ï'ôž1VáFyÆC1ø´1]`|Ã8Šù$Aä X‚‡¯@dÂ<ÏÃ[!ƒÆ+H­€}yVÅ öP¸/Ål#@z7EkòˆZ‚,\NØ6øõ3¢Ä«ËÚU­]0`½Âƒ¥ñŽÅ EŸýŒ”Õ[?j LàH€Kƒä%n€O…àaàecÌÞLîW+FD‚{Ìc«`& O †ÕХƻz¬±Zwõ4àõD®PR0xµ#Ø9_ΈI2‰lU²ú ëQ7{Ùîµî÷*>ö¦Ië zµ£'4Ò–9ÉÇŒðL‡ÛcÏÔ±ÁQiJõöX{ò£"Ô±Ô: GKhåIµ“ ¸÷8 |F£jIÝžÔÀŒ(Ъñ~zsÙcìm¯€ïñÀ ž8ø ˆvNá‘Ù:ÇøØN1ºBàSÀïlˆ<ÁĬ߂pı@R½y¥ ¯ ;„ "a[ݳŠ½È«ùoÊ“=_Ñ')¹,nž¸ji*×§†q·Tæ|ˆO »¼pxéÉžÕÈ"aÙ (>k ã˜ÿâøN#+WVEÎ{ 0K´Ý6ïÝ+O$…(°e΋{Jð•dØ.F00…—¤aŽïÙzVýÑÝz"_%^’~äBHØ6‘ET½·]=uGÑZVÃ•ŽŒÈð…F:l{æ3y ‚#y6¶¶ Φá3p¯@ÂtÑê0<„¯MZ¸jx>ò|eãÜ‚0À;¥œ6ÆxÏ{ ýà2ãÛ§t|Cbr=X™ðÏl›äOÚ4 ÏQ^±‡Íÿ=ã­¦ÊR'Ȳ…&[VÂW­\Oæ«Þ÷às” ϱ.à«Jéþ­X·TãáP¢=XŠßCɺt֥ɺôŠwêÁ^xÚÜ!¬ ë à ‘ÊTŸ©žLõl—ÁfÈ]£V#w1öQð?Sà=Q w°ŽÏâ¯ÌÉ#³ÜÍ´=ƒ¶ãg”é¢w“u‚ çså|.ç™-ås‘ÒþÛ`½žE 3Sbï”Ù[Ç8‹§Ç ƒ$Ê=”€$¡T~c\| ºlŽñœ% oƒt…$~ÒYaq¶X2c2N·Ø-Bê%q_j\ó%Í€KÚËçè’2â0'Å 3¬„µM%’Žè¹±Š\žW9ḬË\hƒ÷—¹ÿ^ WJ®¯À)5~²E{UX̬¹M*ªc½;1Tò —¥=zÁ;²ßCrÜÝý¦h›=`cÓ“"*»KZtÌ >0W$Ö l†Wߨf¨="~ÉÞ½"å~,ž¼ÂBAw#¸m€–¬&ƒ.íÛ=/X“¡cFAWóqéOáx¿Ã•‘gº»f‹*àòž Ñ«O«Ü“‡…(å'<å¥ð‰ô CJIxŠ%Ê\xvú8q¾AE&<;ųU=»µnÅfÛÏ6¨ÑGH«&”¹ðœ.wB¡ó)¯ó™Âôjsª«€ ¯ À áµ1)Á^åƒ`K¸êI%ª±‹B)ÊzÞãÏÈAÁâåKî­B KýÛŸtï< }~üƸ§øÔ°£»ê=µ#àRùþ¶•¥²BKù~ëçSj²œê{“K#o¤Æ“"€½bK¹ÙIêt@¤W'çÍ; ðDòÖ£™Ê‰Ùz§1¿‰šªÃŽGrcÕ’¦ÈŠ%!E¾9;lز¢˜Su]K”<¶XzO‹T!n¦$n{•À}&õ$Ø×¨õoI%%¡-…Pã‹Ðj€5 g(¾5fEÿa¼]döÖVâ~̼Ü@#YTá=©f”¸ØøfÌZéñ¬µ+]ðñ乸~U0ß3¼G]n[É×r—‡ h=ëH)äŒhNzÊŒÉê×ûd-_âå”ÃôRåÿìMYèšÞÁ Uçcxrº@+ ÜÒ#Ýmâv§ªT²d‚M©yK6P"€‚ˆ¢V²Æ3ðÕ™wÿ.»ÛÆ4“µq$ßNUÀ{ppf½3ŠÞ¦å2ÃgH‰¨\,õ(ÎÞ-3Œ˜ÅŒt…HfE©"Q’Å­S+ [ºö6oo JMjBíRÝ1!„Ñ.maÙ“°UW)Ô$xHMpËJÑWÂÚ<iaéÐTÍ)<è‹aaM&T ‹±z ňpÅ%W=¬c\µ«^¾ôîÞFfåø™ÅËžcjÄ%ÌyËP+HõŠí6í )¡ä4e)‘¥Ä]I Œ!ˆn@A[5C¶)%pñø=I‰‰˜kc÷¯Ltfù4 %õ\mc ólÀÙB +ñc÷è`¹‚¸©"Òk.oA*ÿÏQí-öí_ŽòµÃËÍÅŒ£ íH³€¸oJ¿ÕqôÓTM¡Ri”yÄ Q<<ñ6Ó¢¬ €:zM|ÝÙÖýåó&³o³®}¢’,ï(d¬± l 4‹+_¥©šÜ´Ë&"óRÊ:Ê)Á0¬\lÛ™`ù”‹”Zy¥ûèþ6µrÜ s5 í,¬+TZ9^ÖÊ£øÇÓÐsÙ·ÍÙ(=/Nµ™£xm\L©¬lµß#=_Ýz™ž×M3kÁÔ¤qsúDôŒW°=zžðšÕºOJR„‚‰Ø/´“[ZÂÇíFÄìôaé…€—Ä[ksg×À·}Ñ™BÈHÈËzw'ÖÄΠD%(~%ÀĹ7$¦šÛºåŠÀÝ•eH赫¯ÎW…³Žåüzr¥qÎ/ÖÒp~5Ž¡F°6èÑn 8‚íl3Áâð†§­ñÚXõø5Prqy±j2ß5w(›edî¹C4î°MŸÎ}p¿¢,Ê>Ü—*çÝ£Sœ¼ÕAçl'¯ÒNN’F£­C"›æè1S@¤v ÛšçhnŸsö)‡­q‘åÞo„ù«ªt†ƒ×Òi“êã+>ÂVÓ Î Ë9a™ÈsÂrpÂòkšÜ²¦µMÛ9*ËÕÎùîÄY²­ˆ¶.Ñ,.'¥Y?ÍVÔ—©›Îý¿ë ç;é–0–XÊ[¥¤œ³Ï(g@ÞˆÔ_¾ù컳·ÅÝ}2c_Ékz%YŽ· Ag!ɪŵ¦;Ò2w!­Ð8Ú½R–»ÃŒmÒÛ’Âİ©DˆÌzVM¹ã;èɲʛۦ Ûݤc” îKºgs~EÉìÌ !kórüR ~":Ú}ë•ÄÛ)r‹8Û°µØ âœÌZ*¯G–ª…Pnˆ}‡ò€”‡AéXÃê7ö(žéB:õ®ÏRy‡²ÆD—y–oˆ½‚¤ŠÅ==©êX£þ›Q$ëÅ•·âM¼Ÿßb>J/HRr?G¦.Ï$ÑNÑÛÃÏ’ÞõùN¦€¤hŠN†û%{òN(:E"×¢„|ϳ‚9êAÞ)ÙB³2®Àƒ­¬IÚøy=¹¬îHÏ3¥Oà’BØJØ(¶ EžîÝc•ʸH&2IK3ä¥ÛM¦åMj <|v§í‘ßaÌÄlÛÚìô•§½™IÉ”C e1N(lKèå³ yÓ"oZ­KjÖÂ{åµwà8J™±­soÛYïɽm}³m³·-¾§·|ý©Üe|_ýcgpâÛ ŽÌ‰3òB'×b÷­mù*íÛäĹ“wÆMQö(Ñ‚c,sgüo* ˜(!*v‘ž^á¸v‘ ²oá~| ‘Ãk €¬2¥CĘÞѾMÅlyå'xa IÉšNV°½¦Ó3(ýVýf“”¾òwÍ…0%kdIXÁ.)½îßm”Ò§çÌ…ˆ5U‹K öHé¥è½7™Ò×M3ÛÁt–¬ù%a‰›_†Q¶9àˆn8hƒè8 Gð)ÂS„§À#8¬‡ag“p6O( ¦´ýÁ‰:©RhK{ôâË©K5NÝö½ð5—ƒXΟO85Æy¶Ðä#Uõ–T¸t7áÒ…±Á=JÞ«P«¼‘`déH1OeL‡¸ôÁ|ù–[{¥G–<.LâÁhB©ÄÜ~9þUÁÜ$°ºi¿’•¹ êûFrÔ5ø¯–O8ß^ÔÜA÷½Î2wHDzO~ <à޹įÏÖ}’Iª&ÉÃ<¬¤R,uŠ-`£Pr’ 7È=Å®ìBijñ:gs±Ó;,vº|óˆ|#~ÅYë1}}Ê•bµ¤(}1xK-ñJ1æ0 Å{Í)بŸÃ}æñÎa”¥#\¹JUÒ†â9$©QËÇ®âÆA)Á‡:›p’Åzµnú^bÌ]…°®˜\êÊ#%Í!÷5çBÜlžíß> endobj 2984 0 obj << /Type /Page /Parent 2 0 R /Contents 2988 0 R /Resources 2990 0 R /Annots 2991 0 R /MediaBox [0 0 595 842] >> endobj 2990 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1409 1409 0 R /F8 8 0 R >> /XObject << >> >> endobj 2991 0 obj [ 2987 0 R ] endobj 2988 0 obj << /Length 2989 0 R /Filter /FlateDecode >> stream xœí]KÛȾëWè`eöƒdØ;@ È!È!ðf³X¬qö¿I¤4#R_QüXݤ4½ÆzÆj±Y]]¯®®Ç›?þçöß¿oß¼ÿüŸí×îçûÏ›bW—Eûßöð燗ذë~ßÖ¡Ü~ý¶ù¾ý¾ù´ù´ÿûû¦}àóû¿îûßÖnÿ²ÿÿ—íßÿ±ÿðÇîK‡/|ÛÔ¦Þÿüõø³©Íþ·âüóðùÏ›¿ýaûÛaÆÓë:`.ÿýƒ1ÁWöÆÈ«¿oNË4Ç?¿ýmó¦EÀ´·XW5Öowû¿o·ÿý׿§ý NÓ»ÆSW¾.漨¶‡7¶Æ6û™Œ¼èøGiú“7ÎÄ›ü¹:VŒ«Œ<»ææ6Áµª«è?ÍýuQÆ$œäÚH9m-œ\qgkcŠˆlûbú“[‘nŽÇb[avÍÍõU‡ ¦Œ€¡óì1Ð_–u¼Ék#å´µpò]¨líË¢ ð÷Y«ªŠ¦EYYÆ@Úyú“SÆ›¼…\+§ýƳ+²rpû´Úÿ¯ÿçé#L~ÀM´É«c¥Û\avÍÍ­NŠÌ16·Š¨'Cc#RÎru¬œ6w0û§)³`PÚOÀùî»ðà»/›7÷Ò¤Ú~ùiYûÂã/ß6~ÿƒU¸W/_~Üþ±(ì»?m¿ü²1fWú*ìϽ‡ïGŠê8v¡)*[Ï#ö=|Æ¢gLûžpÃW‹Ç‘rçl0#ÞGüλö„þüÌ{8RGÜ ÖËÓg3j A Ÿ(ÆÏ¸'„ÂõQLL_„þ$žÀ9|Æ™ÞôÆAHTÃÍ® ïqq;r0½{UèUö K,÷\úáË^àÍ“UÆH\ÕåA\ÕÅa´¥ŸÇ·6»#0WVweľ…Ï84b*øÌù0ý=Žt[®4â<\))àˆ#p \©‡x¸ÛÃÖ+½Ë÷nú3ºT%Àö”P:¸2K‡äÒ¡À|¦ï~O 1º<®yäuHùœS͸YdÂÅöaSÀCÒrv3óâþ™¥× !ÌWKxØr'Ž’Â!Swo1EŽ…Ì>áS>d2³áMnmNãNXé[–מÄ$ ›@Lj‚þV ’ƒ8Kb+…eÜ.9>qcqšJ8¿®ßšª¯àVãýH“ã.É~µgèUüjtýbr-- §ß³ø=)½tÆŸ.òÙðñF:ƒbÒˆ0ã'Á>HoöTb¤Qo˜®ñ9>Ó]°]{Ÿ¶áz „ãÚâg›@wé—[W,\¯lâÕYHå§|†9CóÁ¤ÆüâøÍ{ßî½-RË”Õàw•öO¶¦ŠlMek*[Ssî£ly¾ª>‘^]•Gxúì·àmuŸÂxRt»ª·@_Ž ¼×pÌ5W¾²šç³œ°¥*I•«‘ØÞFL9ð&nãO÷¶@à+Õ 1&Ë uï_Æf‹¨KSöT òU¿Ê &f¶>H‚”†iC¸Ý&nÓ-öqŒM1ƒ•ò ÕÅ3ø=+¼cL;©˜az{ÝT¦ÿ$ˆsLÂ3LàªL ‹Š¨jÍþí=]K‰¼„Ûó`“›‘øÅ*'9&4bp"Á´‡… aœvîðh)G¯&ïÑN FÍg¶¦¹&Fl'Dš³ÁÞ:M±k]V/€ùˆFº¥•;Û÷s1ÏØ >Ó gŠ·'r­MíÓnÕ!õq—Ï<¡[LéævˆÙ0:–­vÎØ[¼C8°¾ï\+ŸMu¢×>“M{\~¿ãÒ šzçÀ ¯'"Ë:oz<Ë숀÷è™îd¡KãñòÎbÖ²C^´qÊ?4®‘aíGêôÄ8×!lŒ«:AÞš,XmÌ9[5’[×fÒ½ŠN Ø>ÅP«„Ž‚bPCØ[ÕcµÀ ªw`QŽ“Q38úhyA#ˆ T.±»r]ösôV(näXåëI醾88"¸ÀÀ áOp˜cÁÁ*¶Ñਈ"£nlo'aÅ%ß`_/ù „Ýa'")6¥»SEW¹ª‰s˜KAýµí­áõÿkÝÖÔ½ý½ÓÃÈújH¨”¤RÐ5®Áîs³ïî´åLýòiK¢£5ž¶&è†Mˆ¹=£³Š¦E2f†X†s©–FÒ=ÓÑ}xovª¨ |að(Á[wV1¦qU_âh f‹˜h LX„yøxAA7bDâ÷ÌI²˜ :˜æ|0XÎâFrªë³T2=›Ì’^£ä2 |e¡å“5e޵ÛÅî<ïLäBôÉN ¯Æ+ÂäaNO¦®ßç•h q&Éy1Ñ$nÁÅÕ”\>—+UHžÀOXtáÎ=ôF|UX9ÛS…ÉL\¬r±> ôˆ¨‘g5!ç]õ€˜,Z3;5¢ZU¹èc”%qþ¤ŒÜ)¦ØUmÊH*•ªöGr›S×;t{n¹ [ZB»óPhº² /Îë÷xÛµ¼óŠÂRä20ºÖùí±ß‘/Ä4Ï ñ=a¾ã"#LW[­Øû+¤á:ÄÁW ‰ÅKø$Sê„“)!Cj§Ýhɨ˜‘wMÝçs‚Žt¹LÙªÏîÍH²õ¾â^T‹ž—cº‡-&³T•±gökhøUFP3jyñšbÊ™¥ê¥övEg±èz4ß×£Œ5DDª0‘kî ô õh¶¸Öf¿$å3Þy¼f£ ‘Ó¹V]ñ-jdÛèîB€lΪʷV¼¼L5¹Dê$Yª?·Áó0X*™kûm_€$ªê‡A¢Ünq:pâÛyærH£4%S¾G7¼Ž)îž,~kBµ#fãfø¤tK¤¬¼”˜æBb¶ŸÜ$jÍQklOÖâÀÔ»ê“À¨a!ÂwB°OÚbVg5ÜÒ†ÒÆa‹;ìw‡ç¿mJ^~ðëæ³ ¨ãhø—d§âº«ÔAç3´KPõÿÜ¡qIÎ0iÊ͇¶ñFo¦ÛbmùVa?ü×7» <+Ÿ8µ´¢q;4zyL»Ï½Öƒkèàš@›Cz¸?Â3Ÿ“Ò²ó§·-)™„)ï~1â0Ÿ%¢ A–ãêR¸º¦K ›°Zˆ7báJõhyÄ)UžÃG…àæ Y‹»‘Í·‘s«¥cä ô¦ÚnO§ÀŽF«8!$Qp“­&@ýjîEýS[5èQBðž0[üBkµï)œ»ÊºMy¯¼5Q³³ÄÇhˆ=™þàx6Øïœ-B=‹5ÝB¨Ó&£ØÄÇPcì@J¨ ã ÒŽ^›žd@eÆáIixØý†4_`™„߃ùëå{ʱJh ʽA8½0Þ„gàJq5„ k-†ðJË1©8‰ðl®9¹ƒ9 ¿']SÒ%;ôæ8ôÒhצßG8âç4v CmtŸº óÌcòLmBæ™Ì3AˮδœiyUòßãs$¤O#I¹©¬27enzt*¯ËLåk¢ò [^é†áÌCKÃϧ±ÌÏ™ŸI~Î|ÖòY0.óYæ³Ö›QlÚå!H#œ§Ø,²tP×™kgpmiÆ))sm2®M•Ž·¼®}e¶s}õe>{8>ËôßÑÈq¯‘þ—×3Ù:ä¹¶)r¤ÈkäÚÌMQ¸ÉæX•5q“=€oÊ17a« ï)¦K ÞŸ¬…Snø•“åÆr#ós~®rüQæç%ø9Û‰9=äȤÌéKpzæÀ#†=Ýg̸Zœþ˜Z8 ?Ûe”ùy]üü|æs\Pæ³%ø,kÇ\[Ý@I™k3×Þûy3 7Õ9f)sÓÜ´˜’Ïše”ùl >[ý3'.ÈbêÃ#ª´ÌИƒ;|Ÿu q[׸ñEæÚÕp­;·[´±ÜÀ$˜æ\(9r«„TÍ.<IÕ|;Us¦‘Ä”ÖÒª=Upg ¡ÑBžZÑê@xO¿7¢°ë:a\à~,Lg ̦ªx1ñNiCÙmÜ•žK]7¦rW4îroál­ýlìièTšÔÄq•œ¯MO}dûBÓ¾€r뺯¶ ²Zaƒó4]n -×f¾kïÁHyÛß5w‹l%ö§÷n½Ø%=l˜<ø`‚Í6Øl\1&Ôj ¥ˆ‚µiûk½Thت¹]é3l‰q94Ö'總s;cQÞ•º›ÒßžéÞˆ{òM;ŒÕ‹"ö_,0Z O&r/,Meñ}EÖ˜Q0rb¦}H ºƒÊ® Ò?ƒÉvL8F¤S…)[„1…mÌÆ˜Y1¦˜†ª˜H˜÷0Œ¢+w‰¶ÀÂlÖ8úv›dŠÊ†û¤|€ƒï0›ÈÁ§ÛJXùä18e¾hO‹%ã³H5C‘ºŒ¹è‹Ý†oç›]Ŷª?jcºOݶ*wG ö_î>ùº©üΘƆ`Îßr³¸—ïØ¿ý·km{O»ÐÇþ“ý3—¾.f —ïøyóîñüˆ¡³,Î)ìùººX÷u5|n̈ÛcÂ`Üœ˜¹Oµ?ÂÅ<¦Q¢¹k‚$«z’¬º*ɪ$«®H²ê,ɪ IVõ$YyU’•IV^‘dåY’•’¬J+ɪ,ɲ$Ë’LM’M vcJ&›#`K…Ñ6­zZ#\Õa 5­ÎZ#\hÐÓõU­Q´F}EkÔg­Q_hVk„‡Õ„ÌfÔc^Íœ¯ ›Ãmq\/QoOÏRvžDqÔ»s¼;™uUö|oØ[¦ÓD¸*Wí2RuL3Wì‚S;Xñ&«ÆI ^SÕÐÚá¸îå¨jÈ+q.8ñz0™¥ºúdnŸ²F rX^Æ»>Eb\@ºc¨Ã ë—C1ƒ)KÛS—˜˜‹ZÝäAÏè^/—¦b쪡̻WcÂÚá®{qˆí"’¥3W¤‘E£1®o0Šn Ÿ±ú¨@³Ë§$P)X oCS†ëªç D FíC“ 6ô•áš#{’)Ð{^>æÓVÇLÔ,ž ï­f ½rÄ2£–á– TFÌÆI¢3Þo…·…0àT8gø²ø½%€eU5Z@U÷ P=³õŒú¶97°w¤>M­ÄM%YÌë⫎ Š`!–© P]IÈÑM€£‚Ãå†Öcœc)ªëE»ý:ªËŸf‡®6/7¦O´jú&BäŒ_âŒÇT>ÐÍ@(î]xOKXWMC¥šy…7Ì—h^Ͳ/¼äšSû¤WËȃP1¸d"ÆÞ8›…+Å¥qT n²K¬I+-2-.Sij 6>Í@y+œ‘Uí.y«?“†ÊË9Íó¨‘åéî½År ó3¦$FkaÍ@ذ6ÁÖ † r-æÍåé·!bì4ìSfcšº¶w29HØO[¾Ä¹@ÐÈ+Îý¬1ìu#²ñ3Âé Ûøxç0®eäébïåAS= ç]&“QÕ‡×a4%SÏiOšGòHÙ©Êé˜7€×ÃÈNAëÝeæø ôn"0tÀ`gÔ«ƒ1šF4s¤ƒÃº6áÊbN{RL‹øÎ\÷‡º=XœƒÊÆ'²Tw«ð¥–6\òIüx÷2œÜ·T= &#‡O1!L*SxA7½åöXR¦¼Âò!xkMžxкºÇT?Yµ gUõà¤^ î`Ú©1ü©›À›*˜"l&‹3nº ùë1õXiúì(³bcÑ€©S—§4V]”þѳL´DÁ-Iü@bNSíx1(žA¥)À ¥³˜¬™ baB6“yÊd×F9ÕM1ÆÑ(fÁ _öu"Ql@¥!ò ”‰JÍÆÛß)}À¤Þ§ýœªR†€©»Á@°xÛ5ªyQQ×Ê`jѤJržP`FÈÐWÕt9ß.¿g¨åø.ʪpãlÈ ©˜%9ú ¸+m˜k‹.y:b´q˜rŽQ­æ™¬:Í£;>ò}Êó<ߧܰž˜µ2Ls³îJVà]œ ÿÝe8¬²¥zßÀTQ)P§{m²|a””•>ªòÔ5'YþŽ"àj Bå‚ß#DœáÊ8~ gqàØŒkœeƒ3%˜\|U#i˜ j¢z •CŒà8£Lé$îã…9?#@ ñæ!…`:ÀYPX"9œ#Þ˜z8·ó‚nvRæíXE"¯lµSªúTe¬À¸Ii3§ÊK®À”.♪0r·6‘ª ¬¸VTÞûnïݹèÊå]]ÎÉý»OêY>>×»í]¢:&¶ukø-_»J¨ÂÉÔ(}´*œ×Ÿâ=jc`¼aiITöbìªJ¡ks%¬N»ÖsÖ+aI³Ýg%,¦†òÚO÷u˜“;›+a‰””+aåJXòlwY ‹’ƒ¹FÖÖÈÒ½³Ëª8z»ß U¡£ðä‘<ÂŽU† žÊU Ö YRÝ“à.˜B°ß÷}zÅ@›@˜-W¨jõ‡­gH‡uT¨ ¾š±e»dñªV©ø^¨«…íFBŠ0ܽæêYÔùî…gvÿgû}Ï6"W}û ÁêáË9ãv…9$voí)¤;“]‹ÑoᮯÄ·˜³;{l:8Ô÷Õp¤“6v×%–¿Ài Áµ„'ô7–‡s ¶ÝJ¹í]ô'Ž8÷Ï XÓ-}°ÀŽAqŽ0ŽØ¿² ƒgƒÏt¹pfÒÒ_\׳wø}ñ rœ\‚± I?ƒI 3]pfÏ4¬â<ÛÄ-Àõ`š£ÖÓ'öγ‹{G_#(¸ ƒI ó,D—Àˆ†‘æ{]¸]'(o£ú.œóC§2ÆÔÅöÓæÿƒ¯_ó endstream endobj 2989 0 obj 5419 endobj 2993 0 obj [123 /XYZ 38.2500000 224.750000 0] endobj 2994 0 obj [123 /XYZ 32.2500000 258.500000 0] endobj 2995 0 obj [123 /XYZ 38.2500000 224.750000 0] endobj 2996 0 obj [123 /XYZ 31.5000000 259.250000 0] endobj 2997 0 obj << /Type /Annot /Subtype /Link /Rect [43.5000000 743.750000 542.250000 758 ] /Border [0 0 0] /Dest /#06#dd#0f#40#fe5f#c7J#c0#bc#98#05#d1#a3#d7#1ez7#f3 >> endobj 2992 0 obj << /Type /Page /Parent 2 0 R /Contents 2998 0 R /Resources 3000 0 R /Annots 3001 0 R /MediaBox [0 0 595 842] >> endobj 3000 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 3001 0 obj [ 2997 0 R ] endobj 2998 0 obj << /Length 2999 0 R /Filter /FlateDecode >> stream xœí][¯ÛÆ~ׯàs€ÈÜ / l»@ 6Ї¢…Ó4’ nú÷K‰¤ŽDê[’ŸfWµ1ÚsŽ(îefvæÛÙÙ™7þüÏìßdoÞþOöµûùþó.ßWEÞþ—þ}þ®÷ÝïYUÙ×ßvß²o»O»OÍÿÛµ/|~ÿ׿·ÿe:ûKó¿_²¿ÿ£ùðÇîK‡/ü¶«TÕüüõøÓUªù-?ý<|þóîoße¿Zì»ësù÷÷J9kÌa]ÛõÓTÇ|ý}÷¦%À²^´©ë²Ì”56k>ÖÙÿµû©é o>ß;«TUÚ*¿¥£Jz*µÉ”vyfšçÃŽŽÿdšWwZ‡kü8rqª(S*ëûæYe‹ÜÕð÷ÛˆæzŽcÉà‰ Çp§¬ (M‡‘‹S¥g8n=0Ã6eG´æSyž¼6 qSÖá?Ž\œ*Ã=­ ªïÆ:ä-lU Ñ©ùô¯]¸ÕÜŽ\œ*=sqë¡W³³ýr«BíµyñÆm®T@Uq¹8Uz†ãÖÆvÿÁßɾëÍLÞ`«šßê›Û^‹;y5rÖz©*L0Õ\š(­Py—älQ÷ ÙÉüóæ4^5ë-œÜF.N•ž·£Ö?-i¥ýlB¿y^|÷e÷棲¹Ë-üå§fpmŸÇ_¢Ù÷‡gÝüõcöC3¤êOÙ—_vn_ê¢âÌ'¾4Ó >Rçº^Í‹T¯¨K›»t…í'ªŽ]ª|_Vª®Š3èã“z_»üHŸÓŸäŽOŠ½Ñµº|bÚwNhÁÍ׃Fò÷ÇìÞšÖïòÚ|žä%1zØêègú—^Ÿä~íØÌ¾°åägýX8ê½Ó Í•Q3|R:žù@xXYÁ'˜ ø£"£Ìr¹ó0¿ƒû™/ÅÔJÃï`úanàÕBð)š¤ÀÕâ™î3Ù.§5^Gx±@YŠÈÝûÐ&ªPÕÀF1ËÏ# ,#Ì*,`Ɉ$#"fD°0a„ESry$e¸ä0©=‚©—~2b©G.pÇo‡`…1¢#&ÁËrÙµýN¦*‹ÙL'àîZxø…W”wÆZ#©¨ Kpk©r=4—˜ã襳„híþ¶ ž31ðÉGôÍCEŸÀùhØÅ#€­)ü$'fŠiýÎÇÔït ôÚ;o ¼ƒ­á'p¦¸L7Ï;p¦ ÓZ/›Ár@¬<Ó¯BpkZCêh(UX‡xÖÖHxeá~"É5£]¨UOhÏ `¹Æ+ SÔó˘ÿd†u-í´¼À'ë[BÆ ´9©ñÓÊxè•Q›V†TôØgh7=öÊ‹ÆrIÈ ^Mžù@{æÁx=C$Ë{ô“gmBZ+~OxçÝ¢Êõ «VcéÃODmc3 ¡7Ö,ÿï¿ Z†¢pÉ>ϰÏׯÆìq™•ÅX f¿:%oq´V«ÐË~O¼SUïl4ðÄ^øò?,Ç„Äy<Ð8&VðßÝO¬™ãaƒÏÇðÌ<ŸHrËÏQÂjíì`=ãM†X©2̳1Á›¼‚@Æ3 £±ù¯zõP÷RGm² «¸Ç€D­‹Q=d˜?p& ólä7ÿ¼4ZœÐCE.8´ÆÑaó –)&H’‚\ø‰oBÇ.àwbßvx7"Cü†—‡+ °yØÑGKÈp¸†×Á­Û!¿Ò2¬4.؃Q«Ÿ£2H4HÐFÈÐoeÍl`û˜&H$òÍ3Xæ–㑸†²5|ÍÄ^ƒ«{üv®„$ņäO}pžÁö‘ öQ*Æ”¹+ºã^ã>KTýÈ¢ó%Û7¬m˜ÛÌe_‘ Š:9©Ý ³WbîaVÆÚo3 [ÿ…·÷ås;0Q[C ÛðÄ1·Q£¹£qk„Å“½µ8éX´†©¼) Ü4ÄM²Õ\SÞ.j¢d•!1sÇ7ÒM^ƒ’\£­ØÇù‹dêRẽ,Õ°fh?×|Ȩž»«‘¦پΠ{÷Ð 樞Ox”Vd&$¿pÞ±‰” ÍÎ?–ö±×CªÔP´1bY’½éñîtQ(‘î¶tpgs3TâynÇøuË«eù†e“M„ x‰†WÖo,¶–å+ J(­ª„GÊ´·Â4hÂÐì^»Ï’e¼DQ)ã™ø,}æî0ÂǾOs£D‰UT˜¾‚¦Ë¾ŽƒÆ×èˆ469¾Ä)<@ž¹‹[#¨ó<  ·k–]­ßZr1± ±: ®·JEÑmÌå~‹ûYñþû'USxÔ¸œ\ÊǶa IŒëA ¥Wð äœÅ—î‰t ±6¤´kà‚'i$^?8a–Q¬-!O-!ñxÍÙˆv×äU²»Éî&»;sÔOdw#Y0&ÓN ™ÐB.’ì$ŒóÃ)ÑX$sJGŸLB2 É$$3ƒÛ˜§Ø3,Nƒ½ã •x)J ’瑃çA+ñ¢¤3 {Ì]›‘°‡a +àÈœ‡23Å)ƒ‘Ò[½d‘¹µ°fþY%ᯱØü4¯KÄøRWj%²/¹Ã„;®%V*ùK¬ƒ÷OSÌ”%äÀ“hA¼£,ûñ`ŠzG, i‹¾ðÇ–aƒ1€hI¦”Üàû8vj’Ãæ]¼ñj=¸—ºŠ…w߸ ž)–8È-OÊ9!Š yb|‰b± °à2+%xJ!b\\/bLx¡û˜p~‰9ž²šÏÖvgyººæòJû>±^Æï`ÍßÁåÉp!NüdR‹ÄY›u99ªD”¨/ªÀë óžÝ Ù£ð¤Ì‹xBñŸ32N´|!³Ÿðœ1gº„cô%U[ÔHE{cqKb'½qÖ¦¾¥`sLÔUZs^k5©Sð÷eo¨aÞ7ûT¼SOÑ6¤G‹XÉ{¸ ï!Qp9qŽÜo–߃~°ý O±®äLÞÁ#O“wp{ú-¦wÐõÉ22KÈlíÈ,]mör.V*¬—fKþ¼uóç!KçÙfB§Œl½Ò¨Êâ8ž!¨IÞä ¼Áwð…ìqM@¢®[gÏ^ñ\ÝÇWÐ1•DjâîÄ=vÙ»ü±†B…—E|¦jàã$ó›÷d<À óVÍ|*©Ä°l!“Í7ï‘L&3^zX–D ÙaÿkUEán0-mcaÌÀ8ŽE“®Wez:ÜÄpO?x‘Ëϳºñ¨ç«ÆèOV© ëG(‹b Ï“0ƒÚ 2y”¦vy°-À'¶ÁݽŽSÇYÖÙ¡³ªÞþíô·Û×už•åáG¥Tûi­²²Ø·$ÉûO¾îJ»WÊéºù£ÿ–¹hÅœ÷Ñ|¿û»:¼– Þ®ÊaÍ'Í;—#9|«¾h¥¾ìãçÝ»ï‚q¨eP}J;i‹âÑt>ºŽß2­˜ó>Nn wÕ äFn wÅ äNn wárñÜ@:îz(aÅÚHàM .lj…MÙýЪ> '95A—ÁyQkŠy§¶qІ†ï´B]í]=|b 0Ýð¨1਻{H×ú)áØ0u\p{Ñ®7cnÊäÚî‚ ýh©ܺÀ%4šq¡Ú³-`޲ÂÇS„‡fÁðŒ iæàÕ#\ î¦l#ìnlj¡=ŸÌy³Df·XYž¨ ò1!ƒ´³hÇûx֌π q• ·"äÈsBŒšºÌ/8% Bd_£ÜÕÀ¾Ö7cª~5ôûš|?³Ñ“NJ‹½‹ÞÁ#è°öµ~:3¥G§﮵öî$‹îQwW®<éPxx¬mUy9iUìóá0õ${^¹yXøÒ>,u'„0ŒgNÆñ¢¢B%²í<Ï÷vÛâž.T`Kׯ‡GN‹²,]7N| =TÒt¢Æ£Ú+‰#/u=9ïÇ3ÁB²ïpiOÜÃGè±¶8‹&QˆŽòôãbJ¸˜%ÖŒüã~DSé1gåôš)òªïU GOÀ¶cFÞUnh%ÿOòÿpr.\¨bc ¼‘ðäÅ<]á¡Ê‚Ú‘ }Pfbóæ‘ÕI7ëÅód©e®NæÜZrJ(‘©U6޶ƒ|Ë$É )«7 „¥”¸–å±^£ýüZ®>=™¹~cÊ:Q…¥Vx±:ùánÞ#–ª¸dÉ¢X7ªì$n €‰ÐÞ\„©‚oÞa!Sj/¢·­4vr<ÿ#.â:õ$Îì sËìpéX—¸µÒ±TðT¡8RQé¤"êêtꆑR2OÄA{ª6%ŸûƒúÜ™|Ún,ëðŸWê–5³ì{¥Ý-«{åöºz­Öë£Î{ˆ »ãû¾ B¯=;W‘Ê·wßΧS˜é'r ÃD=D•ÙÍÏÕh‡/²‰#0!RØÞfÊ™¸¾T ¬ø”bAóÁU#&{I©¾ùz&ZúzÑ›sÃxù ,I ° ³‹h¹6JkI\ŠUÚ10žÃKÏÓ1ÁAÙóà­ Ãùy—(B¦„©hlÁjrM†Mã6ÜÙ=V˳3¡æ_ö­!…—RŸ¦¾0ƒ”õÕt&Í\su`zöšOAζÛÌêÊ\["ë½n“ýŸ=i­S9~Òíÿõ•«ø ªÌÔ™¡×Æö±›)’{¼«´Ã%m°ª›úøþ»†ÍWz÷Ê4n ¾Ó)µhêgn"Và¿7#îGŽM<¦*,6xY.j k.Âôf¤¿ó-·Èò³Œ?xÔXBj86<ÓúvÙ®r³ïôâ> endobj 3007 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R /F1499 1499 0 R >> /XObject << >> >> endobj 3008 0 obj [ ] endobj 3005 0 obj << /Length 3006 0 R /Filter /FlateDecode >> stream xœí]Kä¸ ¾×¯ð9ÀÔX¿€ Àì<ä`0ääÌf,²‹Lö¿Ÿª²]Ým×'[Ÿ)ÚUímìvo«K¢HФHŠ|ûÇ/Ïþù[ööý—ÿdߺïï¿òcUäí?ÙùëÍó_ØúØýœUu‘}ûåð=û~ø|ø|úï÷Cû/ïÿ|úé™Íþtú÷çì¯;ýòÇîÎðË¡2Õéû¿/ߛʜ~ʯßÏ¿ÿ×á/¿Ë~=ÏØ/×óòÿß›ûÜŸÁ˜Xúû¡ß¦¹|ýöí×ÃÛq«XŸ×yï|fo³ÿþãðÓi~úüØxcªÒWù’…*{]É6§™N¸.tùš>ÁäM•pò äâX1®4áÙ‰kòÚ'$î³éLn‹„“_ OEÜÀì’ÄõÖ¶*ªºÎžý>áÁm!—FJOZ8ù±öθê̵'*Ÿ)\Ôµ=ý\¹îŸe»*\žÚ×ÙS¤¨Ë„“Ÿ!OEm8¹ä9.‹”øÙô &¯mÂÉ/'ÒxvIâÖµidË2þûéàߟðÜ^ ÇJO\<» q­u>L~š=m/ó&›ü y"™Œ'—¤¬óõSºÇöiúØoª*ÝäÈűÒÓv4ûç˜Y0(íoÀÍý{àƒ?|=¼ýdN7ÍÌ”ÙןNÀµk^¾}=!¥ÈÞœosÞd_Ì~ŸçîÓ²¯?šci‹Äv$·hľƒŸqhÄ”ð3àÈÇøuÉ[ góð3p$‡³åŽüGÞÇÓÃæÚu>~=1jr+§á `ó%Ħc96Æ/Ã˘c1_x{´‘¼€R¨ŠŸÍcDiJg,íàg°$È|J0ð4Z|!F1l˜¦èH®ªY±øµPˆQ±ã  k½P ck0(7'ëwf§6,Ÿ0v˜ýXKhÙ„¬*0ÞëK$Ï)–‰yÇC¼1ØQµ–›ZÛ²Âø%äzàœáu0í×ç1,…°tÀ#XïÂÏt÷îkLµ€“ÜEH]¹R¬u,´³17p¬áW÷PÞÝ[²…8g£%}~^ÒäæÊT-ÚŒ=zwÉ1zb·–A|?0"ö­‘¡õÓ/ÚéëcÝä$?Ñ+G#ݽ°8:[›—#õpz‹&ñ.zgË+4Ò×õœéüi`=Œ‚Vp¸cá˺*fAï ª;•xc6ŒÙ10;x4ÒÝo„†³aÆäa“ÔÃÏàm Ï&Å ø3˜N©0ãÙs&ƒ%攌8bÎÿ¬i'1®'Ç `ë0[çù!¥¶©ëº¡XaÄiX`4Às?˜fz†f‚tô§p;|–CO¨JŒ=Æ)1¢D%+¥”#ØcéÝì#8ÖžXmc1!zÂ;Á-¡#Êø1¦¦–á€E CSf\B…ÔTÃûÏÈ(ØBó-a‹›xüãÙšQó æh(H)^Çx‹g]ÔÕYIIÚvĘžg ‹ÑoŒ†eã: °Øé^Ì)XPˆš`Ùt)ŸqW–m&7°Eóo³^”„$3¾Ð #5àNÀr3*á; Èù~ÈõþØ»bj0ŽšñwÖ¯0ЇôÔÔj„Ò÷Ü #ce:º¼EÜ+EÕm€@Ø GFú…‰>Ü—úÚ ÷¶X†Ä°Â‘ÛŒE=¢ÄEàÒ‚ž¬«4Bá l7Ȉ„³˜—€-À¼„O, œ ùÊ\¨ÆNšƒ…õC ˆ NÜÝÂH"|ˆW3¾Ïy®Êb¶Ë޹hÎ÷ö2ÖRÀñ@Øx^ì¶:™îaÌ5ùi JÊ£ÒƒdÓ–qZ ¤Âú)_>çƒ×að“ÁÓÀuÞõâ½eãg#ê÷p§%„ÍÂÏ´³UGxòÖlùõf38cŽ`àÙ0lwþ}ïÉœ³ÄNþo@€q1Š×°9̽²”óý@ú±L)OCÝ'}TÂCùšï#¦"’êÁ8˜Ô²õ¬¤:+Uð{îdß Kp©‡Ì¯¸ìÈúÎĈJŽ2,:¨•R«5å@­1õ%„]‡L”­t°Õ2+îÔ%Êäv01QÕt1¶×XL ’5ÐjǪ–©B͸3£ÊĦeVô]#e™Þ¦(ß-× ”-ûÄ4!¡jÂv½­Z«¢¶•ã9‘“‡9¡0Ù~(xÇ[+%< {˜‡@ó[QqÜ:ùu©uúÜ"¸©¦²©bå³°s3à cìZ‰× I±¥>µ„aØ_¶m æHú¹þõ­Æ5ñÈÃßR(¯"~6Ê3]?ÕKLìN¿’ö×8Z5p{ñ@›H\£‚iT‰¡ÆÝqí|‰÷V%äÕœÆû¥CÆ÷Á¨Ju0Á$YíL¼ÇdŽœV‚’ðQK~©èÝ{®¾÷àD¡lYV}Ê(|¤´’n¶§ŒeË{ïþìY–(àÂ<[‹±w6ÓïdƒFÚ=Ö^LéU3å@ªPzWS„°–e8å¸$˜‘ÊäUúõpfôв¹öÜ»×J÷%ßÝ_ÂoyºÏˆœŒ ç†GÃböÃ9/xYȱ²÷‚ÓD‰Â»LÛGØøÌQÆö&<4X®î®ðd1µSYý-3Œ-å®)hÊúڧЉ5¨›ÈF¬ËÁ‘‹{ór±õ…¯tç—ŒLßJËƨ•âÈ$­ˆÛ w [9>"Ï?m³3*Igï5ƒúÂÍ%î³üÞ#4J©ÖJ;”3Z”‘-eµ·*Ú[m´àü$×õ› i¦H6Æ¿DxÜ•—H]48ÅA©“ÚÔ87 Ïž˜)¸|=ŽQqmEG¡ìp¸×q ãÆcÂÔ6"Ñ0À£x¶»taòa a’®p’^`Ìñ¥¢–(ìäîûÆjDgwÍ 'Æ.Ø ?¡RVñ©ÃxÊm»®íIl/Ñ¢z¡=]•m„Ë{º9jcdOÉz})Y:¼\.I6yÈÓ] v'ˆœ†Ôäþé`¬Çi8¸kMU¿P¦8æ{ùΙ¯•åhN]œ9¢ý'öáªÄr½çÞb¹µî@«a[È t‰"BÒÂ-g¦¸6®xt™_Ž&¦6ÜüÈz ®(àPŠŠÒavcŠƒ(­¢»¾J> ½fõÆ=êºÅ¨ëú5 …û!.I›#‚­T1%Ñž]L·y†ê¶& ¦u&$RÆdÊÆÉ6‹(»EXFë¾fŸp2.aŠ$ÖÊê’€v©N™¦¶!îÃlGëÒÑ ˆ±bq:-c•+UY®ûLj³WRPR(õvÜî«S¬»F“hÕ_9Á;¥îjü@y=Jêx„õü¹äÂÕ=™ÊÍó•?ÕÒ}ÃÞ“=åW*åw{ýbi2Œº)oï &éâ”Pó5U5Ð|¯Ù6_[*æä[{-„‹¸QÏ©™÷J9ù{Öz.\N=£ònvúHÓ÷óÞé³ú@*¬ßoÝ:Û'ãþ4©‹ˆL’Ö])âR•uÈèLôа¢EJPa& ×m÷`ãVA˜/ˆL´¦Š±ýÐ2{2ÂÙ¯L«Å·˜KæsY¿ŒD- ¯Ô=êZæQÜ£¢ÌOÐDÙXàHœ Œói¢–úÃä²hEPDv”‹˜ñÙ1ò™)‚#¦5eï0ç‘- Æ’# S°ôù³Eû\RYq*”ר‹hgnªU-s—IÓc2dãU¢WŸ˜˜k`’gת<è}†2Ðqjö¨·âÞº1a ä´—$‰óîu‰RФYôÖQ©Ìo ¶€lQgXcbý ?Z˜†7bؘ>øÕ÷«)áMµÛD oÕ3{0¹á lš5¼[T=èÁhbáIU¥I1ÝbuKG€µêº¼"{ÈZ X„UÀèJ¦Â•VMÂõ[Sm5ˆÚzÌ:wZ…m¶YµHnì:gÓ:g#¶f½¤ÎÞÎcÛæ±mØÎE¾¨]÷ÆëpvIµCMaáµkÙl0hP6£É·ÐÊÞå’jzMˆª×j­TW·¥©æu²u/5¹¯^5xDi^æKü¡[®]‹}{U[ÅÓ½‰ª¶¥]âa¦¸\)¾Ð{²>îÕO­*¿ø%ÞoÍš¿e¹„K5­ñ²ZróÞ­ñ$4i´kùïÖøn÷ÜWõ¾ ·Æ+§^}uïïnoÍ?}eßOìäöÏS0#/½¾uœqÇÜœóþ3{-çØêë[©õ-ÜՔіªöh/O3Ÿ´:¨t–›=vïžé­\ÝòÆ:nê¹É-Ø>u;E‰p&¹)‡Àšnë£ v‚¿€Á9¾7¶aðlð3]¨ÑDmý™pfîüó ârœ7± Y³M€>ij€™z´Áøf¸æ#:nÊüG 5æ†wZ/çí*wÇN.Îcró²¿}®!¦´CöùðFL¸õ endstream endobj 3006 0 obj 4560 endobj 3010 0 obj [125 /XYZ 38.2500000 506 0] endobj 3011 0 obj [125 /XYZ 38.2500000 506 0] endobj 3009 0 obj << /Type /Page /Parent 2 0 R /Contents 3012 0 R /Resources 3014 0 R /Annots 3015 0 R /MediaBox [0 0 595 842] >> endobj 3014 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F1499 1499 0 R /F8 8 0 R /F1700 1700 0 R >> /XObject << >> >> endobj 3015 0 obj [ ] endobj 3012 0 obj << /Length 3013 0 R /Filter /FlateDecode >> stream xœí]Kä8r¾×¯È³©I½ ÌLwðÁ@cðaáƒ1ëYcQ³p{þûÎÔ“ ñ£¤P™Y¥m씊*)B_< Éÿå×ÿ¼üõ—ùõ.¿ ?ùõ¥xmª¢ÿßåöï·A·¯Ãõ¥i«Ëo¼|¿|ùúòõúßï/ý¿þòo׫ÿ»èË¿^ÿÿ·ËŸÿãÚø—ánðÇK£šëÏ·î§mÔõª˜~ÞÚÿûåßÿéò÷ÛGr3þï?(­LÓ±±BúûËø™ªû÷ßþþòcÀ>*ºÔW4.ª4åEÙR_þ÷¿^~¿__¼ÚR©¦.›â¡Fß(™ëû•¶Å¥6õ‚P÷Oæõ*ÁËmÓ¤{yǹ8*ÊÔ*þvAášâö’@¶’Gh~{øªËt/ï8—e-~¹¤dMQ ð4)š_Ÿàåe“ðåç⨌²Åo¿>©l]4m ¯]Ú•™:¹RÙáúÚk¹íúÖMÕµ™¯Æ¿sy¯ºup¿;ì©FW¥½ò¯=öÊK]–>?׆ùå3‘öwåpá³#Ž–ÇÅDôz‘«QBtW{Qòؘ…}HxÕõ%êOw1¿^©b"뷫ñуҪfø0šÐ 4t xÏ áÒ[Pqä€ãý‡×¾ŽKÇÝx”Ò>Õ«ˆ*H®®õÄAH;HŒœ¸t = îâ`øR tÜA0 ÿᵯCÓ±äwÔšŒ™Ùê~/‰n ÊýÓ7ò¨œw™}jÏNYÔ+·_>+KGóœO"ˆH|—BÉ%¼ça»rñéJ¢¤Cƒ¦œhILf«u§#Ò!ÑÑw®J“ÀÃ) d&ç¹¢T@¹ø(”Kx!Ô£¶UÖ£QÕaõÛU÷ÄÛø¨œ¯©šª!ô ÄÌ»1 \z *ž×"Œ·ïVÖqéØ@¢;lI>ÃUXýv=1¤EÒ#'.Å@1ëúBÀð¥@èx~FŒ0è¾#Y‡¦cÉï¨5UíÌV÷»%º94(÷OßÈ£rÞ¥¶>;Íd4óUídƒÏÊÃÒĈyÎ'HD$¾Ë ¡ä^Èó°]¹øô –(éР)'Z“Ùj]Åéˆ4“ýÌW®Ð§€¦‰‘ó\Q* ˆ\|Ê%¼êQÛjÆTDr2 ÍÉ4c*¢‘ÌÉ´cN¦¥©†@1óV"'3Ñ‚œÌ‚¬a¼}·²ŽKCs2dN¦™Ò ÈÉ44'ÓLi„´ƒÄÈIKó bÖ‡u…€Ñ‚œÌ‚° aÐ}G²MCs2RêÒI>´4'ÓN9™–¤Ú9Kr2vÊ18W bs2Ks2ˆ‰T ‘ø.'„R r2­HN¦¥‰‡–ædÚ)'ÓÒTƒ&³ÕZš“±S‚Á¹É)Í CciN±‘ ("ß…€jANæ°òt¶4¦",ÈÉXš“±c* ædª¢™u}yU´=÷*œ-ñÚ¥ðèÉ"*žóÃ# »ç]B¸ô„‘Ì›ò$c,MÆØ)ÿ €‰ž¿½yõŒ¹‡àFѽ 'IÄ”ÄÇd”B˜Žçgä0 cï9’4=a$¸ƒ†Sv4ohèh®×®º'ÞÆGå‰=ˆ)½@1q# „KoAÅó,b@„ñö=È:.…ˆî¨íôø WABÚõÄAH;HŒœ¸t ÄÎë סã990 ûŽdšÂFäwÔšŒ3Rë~×D7‡åþéyTλ”Úg§4#uç*œ ñÚ¥aé¨#bžóI‰ïrB(™pæ¬)ÿððé4QÒ¡ASN´$&³ÕºŠÓéèè;Wá´ˆ˜æ„¡d&ç¹¢T@¹ø(”Kx!Ô£¶ÕWKvaõÛU÷ÄÛø¨œ¯¹¾°çcj鈙w b@¸ôT<¯#Doß­¬ãR–Ѷ¤²œL¨ ë£ß®'†´BÚAbäÄ… £h f}XW¾ÏÏÈÝw$ëДeD~G­©rFjÝï ÑÍ¡A¹úF•ó.5I¸ÔSbÁ¹ —Z.á²€¥¦yÄD*ˆH|—B© gÎ*‘òŸ¾¡!J:4hʉ–Äd¶Úšfaê)Õà\,Œ”æ„¡©i2±‘ ("ß…€ªÂ9µãÊÓÙÒ˜Š¨AN¦¦9™zLEÔ’9™v4î–¦ ÄÌ[ '3áÒ[Pñ¼Ža¼}·²ŽKMs2’=>ÃUXkš“©§4„BÚAbäÄ… £h f}XW¾ÏÏÈÝw$ëÐÔ4'#XYVµ$ùÐÒœL;ådZ’nhäd,ÉÉØ)Çà\tˆÌÉPX,ÍÉ &RDD⻜J-ÈɈ”xøô 4'ÓN9™–¦ä0™­ÖÒœŒ ÎH†HiNKs2ˆd@¹ø(T r2uf•Säd,ÍÉØ1as2u1äd®>½Pƒoæ}ƒ½ÏëˆÆÛs+ë¸ôl Ѷ$;¥!,ÈÉXš“±SB!í 1pâAp£jðÍú¸®ø`):žŸ‘# ºçHÖ¡éÙ@ò;hMuá'®ßàëæØ Ü?}#Êyåçdj5æÜ«p:Äk—†EµbžóI‰ïrB(áœL/Ï£våáÓ7œÌØ )'Z“ÙŒÉÉôHtô«p2DLsÂШ6BÎsE©€"rñP¨"œ“9®<-ÙѨÂ9Ò®º'ÞÆGå|ÍX'SÓòP1s‰:™P'³$+Doß­¬ã¢lDt‡-IÙÉ„Â9Ò®'†´BÚAbä„Ö~„ˆY‹ÔÉ8`€:™%aA0 ûŽde#ò;jM¤ ¤¦u2õT'S“:ALMêdê©îý §CjÁ:™,´N2‘ $"ßå„Pu2µHLM‹AjZ'SOu25-ÿÄd¶ZZ'SOEîU8"¦9ahh d#PD.¾ êdBÊ#·£]YØ„{ÎoO°ç\©Út{öœ'Ú«¿\R²Ú4 %;½=øÆ¨t/ï8O%YørIÉ–W˜N²ÓÛS€_)“îåç©$‹^®n²ÕªªÛZ7×ë¶0ý¯Ç¾¥Ö£ ´)„<¿>ÁËÛ„Û˜öœ‹£2Jyñö¯{Þ‚Yé[À&Öß#þüíåÇ/êÚc\T}ùöûMÝ:šÝoWPªË·«ëòòí/—. Uþéòío/öµÖÕÈbŠ;Ågxçxç'tÇèýhÆ3Õ'È~[ ŸÁo3û¿ÔØîÎçoW¥K®/­9 {ó)§m¡púsFN¯¾#¯ j õOIÚm„ƒ¾­}=oË4ÈGù>ÁXXÂЗb:Ø“)(ÇHy‹|)Ãg_ßóÚWÙܽ2¶Çµ;yiÚ܈dê×5~Fûâ»û ¿4âÙá÷d³n ä´{Û¶‰ínA÷w”AßbXÍ«ði;¬²,I÷¡q޽ ˜Å08þÂ1(ŽñÅÀBHUZ¤" {Fwñ½ØiѾ«4ìÀ.CÁ.Qa¯Ìñ‰8¤ÀN‹ãÉ\ãþ‡Ï¥Ú"@âè†q¤K„V±W†b ã–]oÃϨO 5T¦x­åu…XÍÁíj˜ÐÙ¶vÑ-½“ o‡ÁPÈŽ{XÎ[~Ûâ‹F ÜGaáô*ð™ :¬þ&WŽ]8Gi9ñ~ã&ª‰‘ñƒkáΊÑëã°3¢£X¦‹ÜI¦<§ÿ,a -ÂÁçÔâ˜éÓv]iøÏIDTÑó=ç$ÒKbNCVÆ~ºQT¶ ‡‘:'§¹=ˆaõ°PÝ8~Z6ða è='‡ÅéùX)tL»Ë´¡džä™n‰G~êäY®éÓ”Iº1©­¸"`šT "¶Š­k{†=âÕe‡Vx`³6”Öîj­Ã‘ÐÓèi]«°ž MwfIŸcEÖ;Â"F6‘5H½{`&¬€œ@f»X8ó½ãô‘¼7´v1J]ôlŒL÷ð§ÚÓöRê¥ááCu»JU‹Èá—•œajZ [›#N •£VÉMɘ†|Üj†/1ܦ¬î÷°/Cî·´ëΈ?*H\«È7d.ÎNÚ±Xòm¥ØtÀj¹±¹F£"â`b­qèeɇذðâÆ¢1¼¨#RjÎY‚†‹Ð1Q"‹58‹íð²Æ‚Îá˰È2Œ¡¦¡±úá5®ø# X¾Ãâ ›-G1+ø6Ì5g­'t)xEKÍXGFg w§¿d誖ÀC,n7J¯/Ã?°¼Gj±^úÌx[d8އðœÅ×Ϻ`ʨrÜò Û‚)eǵr¸Z2’•]^ñT“ý;Vjácb8W1kÉÛŽ„>'§Œf5”0gJç•0³ÛËS#¯÷Ù·íÆR–ð3ÖŠÎöUó‹N³,TD¤ 7´ãõ;ædkÞ)kŒ¢ØS.¯ØjY!UçTx«òC}~®2k‘E5Œ"ZNèÂ*Þäëî6²Mq´ŒUêðxÆŸ­öð}®DL9ß_[ÚIQì©¡Æ1ÐŽÊNP¾=‰hg'|¦n- sjG0Ä™[=y¿³]›÷/"Ýç„Óv–œ¡sùiPÕ!Ž<¦ªe®ì—VÕ3jíê @¹v¹jb¦ÿ€P-å˜Ö]¬ày¶/ð£Å&ÌÖ”¢”bU¯…5~¾)S)&«ìu‘’Âõ©¢Ù$NÝâòͧï{kNes`‘ïá¤ÿ8£pÑÅ•wSŒEÌÊ0*E"ÔàˆêßžÒKl`ŒLÌzVÎúEî%M¬6´+Äå¥x-§Ã;ç`fëËTý€A+a—bÄ,óþÆŒÛxŸ•‹Ò•‹‘Cd`lØ|VUÂU•¬-ÓO)¤©mÝçN)°¤mq§jÍFÊi±¾ðØkVb‹é6ôâU“ä»YýDG §‡|É:jJ´N—s¸ÖÑHüÅY„‹{,9Îa ®#õÍk‡²äñOÍ47-ë—Ïûô\qܰ`›aø´ŽVE¢XLßá %¸zlÕoØ) (º"%çÊŠëWŒÈ–3ÃrúÿþÿÛ¿¿±ý™O;mîcIáþ6—+ŸfpTƒcU,|Ü5^ÒŽ#±­d6ĆոûQãÛö¢lèt¿³Z¥¦Åä½HUñÚÜ9Bø‚î lV¯ìò¾ë™ é e z± Iϵ…¤¯Àt~ȵ†ÏÔkø=KÓé¹n^ ( ÛÇu…p‹|DT‰ÝºRyYUÜ@å¥ð)v™vœŒTG0*Rž«ÌQ¤6.S;§ò’%[N9U¦ÂÛåBNÑßbù£ê#Wk‰,{j1–Óâœ\Ö+»ac ÍÕuÒ)ë*íèXÇT‹¬™–x Öù=kW9kö5Ŭúê[ÀÊ®dر“J¦£‹Xç¨p }wh¦èêí#‹ï¿G’ì¢m–0„Íê8Kͱñs0Øqw–¥I·²W¤Ïâl\éÃ9K"dK½EÐ3|~®ð¸XXâ¥ß¢=kcºÅÂûoï!»‘¾hJè@â"C¾­¶«6ö¤tònQ)ŠanÇÉUmwO;F ¬HCÀMlßã&ýFjØ[»žgº°Ðyó ÿúU÷ûf, Û—f§—;.Ôn±}˜RMyí[‹Ž(ÌÀnùø~<†>3¬6HêAúSxjS4+1šª¹~ :E²EòcRô0S9ÓŒì<ˆ=Ò'©ë‰ïb‹œ‡?éîè9ãDÎVvjFt›?ÉiÄ´>«*,õY*Ye²»ÊJÓ^á †*wS»ô³×Øs渰ýʆö5X kª1Ì«ƒ>VÎõZŽ"Gì3á‰}žy{Õ]S{®qüÂ:þ˜±_öp„šÒã­-_*±¿ï޹ÎñºœôÏCŸÏùN:Ÿ;ìüTµÄ[qqV:1W~÷Ü*›çËßå†Ö9¡ö>ù6ß E™‚Ð,a5»¦ý9â·vCîê½Ùü“Éj4¹¦°÷0¹™l>“›iFLî±=k–Ö,&_F1«šƒ“sÆU0Œè‡óLâ}[œ5ÿÔiHcv®V†-I'ñKÂM¾äNsŸ9«&c"vr°f=¦álŠý˜®wúØ<Ÿtº-nG-´ÿŽngr4¿›ÉTwˆ±ªõ‹“ùaUP­%×rx‰ aÇ€ûµPrHöä…ÈPètrÔÉ5%µï;:9Ó6TÓÓ%\Üuà”¥^È`Çš?NR<Åñi7([K5ï‰wƒÏ¼ÇÇÚÞr9:ýi/¸¼þ¼]¾N¢éô9'',²×‹Ä:§ê‹Sh»æ„r„Ó #x%lêShÞ·÷оc…%{¶ŒI{á—ˆ®IrÖVÊ>ztOmŠ£ Óºó²^ð~ÏüYc7ãÜ}ácDbÕR~ø„¸«ºÂû½Áè­„{ª•pwÙó†w¶û‘eS´VøÜÛhDÜ2'Šàd¢8tv¶%T£Öè°3Ø¼Éæ8 Š9ú²%s¢È;N¬d­ò]UÁÚr‹S,ÿÒ{Ṉ6ŸÐÛXGÁfÚ'%õ$ÕŽ ¶‰þ²Ùeq‚Ë!  éÅà Ž9Õß*ù™ác£-¦~'Sí+Æ0Çñðk‰ÂÖŒ4ñê2Ç.¥ÂPŽbMh¾›Ú¬ù“ÎÚ¬³6ërKcm–cçP›åp“>38Œ¤gšØ2Ö°røœ…Þw%quÎÚ£Èæ„Û×c¬î¨š#ª¨ÈôãÝ£Š*çÄdMh~€‚ÄùcÏ‚ÄÇék‡‚DGûïY«3T­8Ü3”/š˜iž%Åéb”峤ø,)Þö’³¤Øw‰O<Ž%ÅïPRìpó(Áã99s†x‰C¼-%r…á‘ÏP†2„x¥"4ßMɇ=K>>sNC%-ù°UòaïPòaÏ’§*„OÕ{ìPaKGÖP!gÇ*|¤:{Öq<`ª¨&>B‡=ë8R k©§;;Ð'î@·gdí@sgŒèYœá÷±gqÆ&rgì/ΰUœa?dq†=‹3ÎakˆP[*.2†CÙB‡æYq‘,ðpP>+.Ί‹m/9+.|—ø4áPqáò~ÿŠ —›G‰Ϲ‘3nãÄm´Œ"Ë»Ùl[ì:4qt9frGÇžeÒ>G¤5Oôöf8„L—»í¬”âȱ}ÁÄÝ» NÍ §šæI»‰+rÔl-?™2šéó[®™ã‰á#Jʼn­±*¤«È‡3‚c |ǘ¢úÙfbs8º²z-¬Ù¨,ß–éÐfáíU²Ç`—ò¹Î&Ö-U¥ôabÓPš¢5ÙÏ–Øå:‚z»e…j‹Dl'²xýãíö™-V||štLSGVàœª÷e†¬mLù'´ãÀiW/yžÓ n°´ oÜ¿Ø*žqP:Ë?3¬q¬¬^;n í‘MÕùa¥Í(>xÞEÏÕÐ?Ágð©5|æ¼óy?ïø”Ž¾ ž¢àŒ5¦£ø –<ßn¢!×ø̵;dƒ–×j¤šk ®owS„hŒ W GÌìsvd|–V3o*Iô䣹‹”“,UKÐåšÅOÐr0>‚Î$œn_–.œ´xƒ>V~Çùé‡ãU#Ñ[m?9k¦déõõ”c8c[éØV–N7Á Ÿµeª!×Ò‰t±ðm<½ó=œN^7ƒ;yÈA‰±~ðq„ní*?Å2Y»“åëLÑæ%™zL?œ£¤s”„GIŽž‹ú|ZÔ},Ê #ãYO2+i?¯,júy e(ªŸñÈVªd¬õõ(Tà =DäŒÈ%cŒùŸHî%Óœè7ÃÙ¿0Ó©–œC¶œ&u-É«WC_œ«äZâÓ±"â¹ÞHõÞ"½ºGN1…lý¶lUÐ"¯Ë*CgœÒ+ƒ9vj8c¾¶DÂþ®R‹/S•«ÈÙìÂÕçXÅ,air–‹Vg°ºBFíÊž>X 8;ãàÏ8ö|µT~ßÔ¬ø™”`¹åâÙÊ2F²ûeX)VÕ\y¸<Ÿˆ{1‡à팰ÀÖ|XÊ¥…¦ÝåýüÇ¥rÌ1r”-=÷á>‹uºâc±ýiÖg©ÊJ:pÎê ÏêçªeåÌ©˜NSÿ ïà ¯,×XG!oD¡ö>ÆüxÙ¨:¦!Vºb¼1é‡-ÅÖ±»{.Žwˆ”zb½ÄRàL×BDKŒ5ž—ÁˆÚ&G«XþÓÁ~{;l%b³V<Š¨æš·ªÊÊé®<{æEB›’;–ýmOH¬.8K\b¨´žÚE§¬ )ª×ió]¬IIÆxdOö[vë»o+”m‚á} ôfn i)ÿ¢ûI^?Þ¾³œ~Ws&bŸvÀáí…rͼ“œþý¦=EúrNÙgÕ½hk3„\;SÁ|»Áà üÌ8²3ÃCî|äî>ÓÙÂ*“yo™uÊlæ>jG™kóÀL;Å!wœv]5-suR¸¶¡ÈÓm»ÎضI¾q]©Í`'DÑÊ=ãòÇ«þz˜ìÑÁÜ>§s* ßÞ-ÙÃÉ;s\,'þd Vf§P!•‰ ¾°iBˆ²lOvÎG+›óß²|q®Te]¨u6rØ!În¦œ¥Tœ³ Àêùð™bO¹sìPš¸ãxnÙ;¹èpVdaϧBßGiëžðúa>ö]¹zÍ» õ–»”e¬g®«Òg0yí§6ó¼Ã¬›~º2¢ ÛL{kÀò©ûß¹¿ìŸóÎý%wÞ™îtö|ýwù~5ܨ]]ûƒ ã­6¸aÐ5Ä*Ôm­ÓEO=•‚±j?ön}xïÕô«îÓ©Î>*¯—w†1¾~ÖZ9øÀƒjÕ'DǬ§B¼}¾-÷Â9¹rf©€ÌªáÓ8t¸ö‡ŒÏPømð™a¸¦v}º³]!Wán×Å<¸ÇÃŒ*T¬6ø´_ÔZ9Ë.Æ›£%ø™ÏÈÜ2ëÏ>ù`®±†´7ü¥íqÝn ó:øÅmJ>l”RgN~Õù½|}ù¤ s endstream endobj 3013 0 obj 7243 endobj 3017 0 obj [126 /XYZ 38.2500000 377 0] endobj 3018 0 obj [126 /XYZ 38.2500000 377 0] endobj 3019 0 obj [126 /XYZ 37.5000000 332 0] endobj 3020 0 obj [126 /XYZ 37.5000000 332 0] endobj 3021 0 obj [126 /XYZ 37.5000000 286.250000 0] endobj 3022 0 obj [126 /XYZ 37.5000000 286.250000 0] endobj 3023 0 obj << /Type /Annot /Subtype /Link /Rect [394.500000 295.250000 472.500000 302 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_runtime_type_checker_usage >> endobj 3024 0 obj << /Type /Annot /Subtype /Link /Rect [99 264.500000 158.250000 271.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_pattern_matching >> endobj 3025 0 obj << /Type /Annot /Subtype /Link /Rect [445.500000 257.750000 497.250000 264.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_defining >> endobj 3016 0 obj << /Type /Page /Parent 2 0 R /Contents 3026 0 R /Resources 3028 0 R /Annots 3029 0 R /MediaBox [0 0 595 842] >> endobj 3028 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 3029 0 obj [ 3023 0 R 3024 0 R 3025 0 R ] endobj 3026 0 obj << /Length 3027 0 R /Filter /FlateDecode >> stream xœí]K¯·ÞëWh] òœ'Pðõµ tQÀ°.‚.Фi$AÝ,ú÷+if$™£3ütHÎÈlÐØ¹¼ÃÇááy?ÞüùÓ?öÿú}ÿæÝ§ÿìþ|÷iWšªèÿ·?ýóÝít{þ¾oÚjÿï»/û/»»ÇÙõ|z÷×ãßþ·×û¿ÿÿóþû¿øãðK§_øuרæøç/ç?»FÿV\þ<ýüß»¿ýaÿÛiÆq¹a3_ÿ÷wJkSÖ§mÌ,ýe7Sÿùý‡ßvozø­¢Ë²îô^•¦Ü«®Ôûÿþs÷ÓqëôšӪªÛZÏxh Óÿ'»d£Ïkêã®uWìÕêÖ’ýBÓ˜¼-ªp“Ÿw.ejåžýЕJ5uÙàS†®l©2ˆ®ÓËO^uîrÏ;‡Êx¹xvÁË­”Ñ=€º÷:{ˆ»Õº7ùyçÒ@®O.y³ºézðTMೇ¾1áHr¿si Œ7 '—¼Ù²)f5aðºN`òªjÃM~Þ¹8TƻųK^n­TÈ˽N`ò¦HîÏ;v¹xvÁË­µ›.åëôà@8Ìéw.•ár³K^n¥Íp¹µ ¢Ëô!àÒ–ƒM~Þ¹8TÆËÌþÑg¼•þ'@eÿâøðåóîÍUGI Þþé¤sŸ×<ÿñù”jÿÝQ¾oŠãèû?·Ôýiÿùç]w¨u5n±Q-)4ü¦Ì#éG¸Ó÷Ÿ(ûŽ$±_UÃ/ÄD16¿Œ'ž²ÌØwÑMj|Y ö1p‹ƒ±Gù"îéJˆ¥‚#xoɱbÍ#O‰±­Þ4Æ:f3ÿcÝ©°Æ\Ë02w§o=˜²8?˜Ö4# Þž—,¥é}ËWöhmWœwzy‡¾Q=ò+s0ºUÇ®ßÔp¶þÛëJ¸%¸pa¬I”^¾žÇ¯â“ãIð7ýôæP•uÛ|õ QöA \˜ØRQÁ--‡ÅôWá¬að¹0Ø&ÀqìBxÓ¥úÚP»]‚%<:Þ<óM`,Óï P0þ1†w€A\øßñáytK¼A ë÷ç‘j|Fóï6$“i&\ƃÆã“`*‚i·øù9ž9doøžñˆz%8 ,#' ã€ñªß`Qžt¹¼ ê œGážmʵDļG†Ùòs êe¹ä…w1FöEcüÃï ï ƒ ß-¦]x6Ù]Kð›˜EPjšÑ  >ôòEq¨õ•|A½Ìwð›ÆR–$ô)øáN&oš¤|ô,1ÁÃaR²A÷ÈpGÝ®^ш®Ðˆz‡F°ÉA¿…ß@S€ªC¿]¶¤¨[ÆÔ~Žè†Eݚň€í;ß"˜Ú¦Ÿéå ÕZn¾‰'›É S:ÁàÐ4 ÖÃÆÂX%p¡TF,’ø@‰xåLTB°UÌ»ÂßࣧW£Eað\Ї—Îo:¨9ÆzåÀ˜5lc"wǵàKžóÌd¨™H)ø}a!½]a…·°lÌáÂßàuì3æ@aÁà )¡ìcî×!ÉG²ý®Ñœ:Ùæø…Ž=Æ;‹ÄL{ÝÆ‰>¯û®:þøkè:H(ÆŒºŒþ‚(*©ÃóLþƒEéÁ…#¹¼·Í±eù2±qçæyöÂLœƒƒËKx5Ò q“Ž·HðJl {{Ä kÕÙ¬p5Ï"šµÓóQ¡c2cjÀP˜ÐT:²Ü6Ž‘}ÂeuÆÐqœŒ£1Ã.eè¬é.yNR“GÀ´lü¶£.WŠ…%…ÄnH/…26ÍÝ`HÞÒ–sa”î)º2ÄŠñö¬`ädz-©o‹qŽ\RZšºZ,µ^3ÇSz»¢™xKå{©4ŸçÖµ2cY‚DŸÜûO Wîµνb²¿pVVú,3&Ú‘™¶å˜&¿ûÁ°fpc";æ%" èºÙý¤‡¢ÿ™lÛÂû^‡yÏðe”øÍÀuJ¼¦„C7(:ˆ×çÁ°Æ/ЈåÇξ³êxÜÞ™ƒ.cê+úfpps4Jó¶.©f&’µ¬*.¦BåbJY“õ4‹$ô2¶Ù¼PBÁˆ•Ç'bdYñˆ0æ8¬-D€å½ÊÆ„øÆ _â³ä[‰†óQo 7VJ[Ì‘‰ p€Žá7˜CˆæY3bºÂÐÍMQGÆ /[\%SÇǨ£ˆ»$“ÜRŠNör>È>C&?‡ Ä<îÔf›kË«.´ÍÙ)¶–%÷hD¶š ìís»o.‹Š^aʶÈ*÷¸ K=ì­H¶7‰°`ªrÔdz&4¬àéãÂeXè$:Œ¹t,¯Ï]zxë¢R 8ÁÊ­2ÜSiÊ>ñ†Døµ@¢„)m`äl|36cFO~’€éu#u#*άÐrãHˆL, ­SY)K1ùxÞo¨ê±7HލÚjD®´õPMÔUÇëŒ!¢õÛ#ÆUª-g÷#ÿm+‰¦ÐÅØ$Z4…®Æpá: ±¼pŒ¹|}Þ*Ó'–u—×(—,ŒÃ3êRÛ'Ídw )áG“Íñ1U @Ds‰f] QxŠQ±{ôÄêçKúÛž¤1ÃóM} Úd"(E"ÃNBÑ=üø±…A4NéY2×Ô>BÝç²isdãôÆ\%JóxÎn|úì‰à¥ Â/DiPøÝŠ´hb*TFÈgî,æ%Ò܆qQA±nË»CïùÀ!1¤ÔRQrìã QÒmU d<¢¬6Nœ´Ÿ’—l\¦£‚c¬ðõaÓêɃΧªCÑ™¯×Á}«zk·ÒãÐ’û!úºÉºÀ¨bþ‘ Ž’$1l8dmóØôEþ6U>QD`ÌÓ…àoØV'Ê@eù˜h±6 ±JäU¦­Gºóâ/±1…'Eê‚Rá2‘’~©Ð®y,‚ä&H2LHßÌÈ ¯¨VYبJ Â_ÂöhZalƦ7ÍÑ7c•” ñÄH,êJ÷a›Nl{Ê®”uQY4Ü%€ŽS¢¨Øà YT¹.­SG(ä\·ÖšÑDj‰Z¡2[= Ò©x£#—7’Ú.ÜÖÏ£€¬{F"*cˆ\çÖÏË„×at~^­Íé"ji‹´Veyy;ÉÖsJ Ö9¥ nJAY=Rºt5óS„æ-¸­æ‘˜†ÕÜHœÓuÍ#¸HÐÈgK‰¡èwò"ΘâbZAÑo%I¥™°z®Œ®×l²#æ¢]Æ…–XE@ËLצ¸<4‘ºæàgUá®1DMð&ƒˆÙ]4Ød½Ä×èKeVwذÇÅoÒu›¬þ>ÕãorƒHŒ¥V|.æJ™øU‘>ÎËÛPÕ•DC’WP¾>dçK/ºÝ±Š8 „ø›‘ÑÛ ‹G"d†èÊâs+jæÖ†ÃûÈFÐ? ¸¯TYÚX±±Âxuk¬0`‡{…ðâ9ªêáˆ4"bǧ§›‡š,>g{å0[­-ì“­¤åè2k¬ÀÚ'V )pŸü ®Xiˆ£ÓFpØ•Më¯Y){ÍìÀXµc5ú ÃDd;†;v€Í¯"mF—[Põcþö­ËþugÊÚ¾ýز¹éýÔ7x‘ó ÍÆØV‰$ºXA›ã ÛÀÆñJçBòRZ]e¹³DÝE HÇ;ò°ºÕn©Ž/O”> ãöŠÎ&Ç97pÕ¹ëÓG¨zžÌ;Iïìõ(ÈËÈ.[v˜H᪈Ä/+”m)G`5¥‡ƒR¶ÆæZ[º£Xò²O(Ã&%×Fëë:g Œ`ÍìRÕ_H_|h[ýIž-T¢‰Õôš¡*i‹éèÑD|}¬¯w<輦޹_”4Œ‰ÇñÓ*¸¿åb•³æ!׬&dQ¤çSΕ‘Ñ™øKˆM ?RKÆÈæ½°¤­ê´ýàpþ_gÏ/«ò=Á$'sààÄ™àâ_ÝMXJàÚõ‘3ÇfŸÂ+5­VÖ8àáÌåE*בºŽb×X70±0å„§ƒršÐ¸Ù5årж]מ~ÕmÎÖo NÜ£ÔD¾ù€tVÙ®ìÀGŠ=Y!Ë@ƒYØtºìó]_ÏO+Üü$I๞ê´9ð|‰mT=â^¤>ˆÙϽ?÷rÁ5š—yýì5»Z㳤à„À5Š£•ёŇ¸Í“BÖ;0Êbt²VTi"½36SÅo*>ãÔtPŒðßn™ôX˜²MYò/·I­&02hà ›\aÀ«ŒŸz¹Í‘ª½Hp á¦UÄr ¦ÔŠˆÙdysŠÅ*¬.u¶“ãß³ɱ !hG°ÅU* OÝtÖõìB!s­mÜÈ…ï– e.|ºð]úV›¹ê¨hÕÑmßL0¶B0ÂsËZD’’íÔÍ'áA“d£lÂ*Ô"y*2V8Ñ›ãJ±QÌác–5%ãÃo… ôÎì,³3‰C¸ƒæõªÖâ›aÒ£ýÛ+¢œk/ø›1»Ì -Ij~”F´ª¥ÍÉQLw ”†˜þŒ²…Õed«T ç¿n“ð<‰“d¾qÐísgº ˆ¶¦î* ›/F8ec—]´àk]TãË|í¸ ™cPe!‰"†Žx˜°D.Z@ f9ï ìJ%#D“NcW€žü*Óì{}*m.²à~¬" ñ ôUcs>€05™XœÓ—úÉn7if²<“"¢"#æÈèbŠæ2ÈÄÌf †*:äª-0G|.,¶%ާàç0ùQº]V˜li*7ôÜARlE)FtvßWë–m¦ÊCV‡„…-EÒT=œ«vD¦-W"¹×”Ž8Zí½ea`p»r8¢qY?|<‚¡OŠ×Á'u´ ‡'-0Ž20Àç!n)áðÊ6§v‡Ö\{meZ“iM¦53;0øæðI ZƒgÃ'uŒ@¸E¥5ÏQa-8­q|3W,88­Q7X…Óà;Å‚×!¨ã¥Ã ^ï(oƨjþNð0DY† ØŠ¡VpÄñÎ2EYƒôOš¥—bÒ‹áÃ%t‡àò#–»€›2ˆ¾ùl#™™gJ 'Xå+.JP^·TÀͪáè“ȉ+`C×c(<üf0 (¯£ßPX„;ýý¸ãqçØÜ†¡ Q£^ýQ@ÍŽðÚÂðf°ó=·Èøãw?x×CZ¸7|ÒöqÜn sèâ2$Wï!úßÈô³Äÿãþãîÿsh2 endstream endobj 3027 0 obj 5798 endobj 3031 0 obj [127 /XYZ 38.2500000 161 0] endobj 3032 0 obj [127 /XYZ 38.2500000 721.250000 0] endobj 3033 0 obj [127 /XYZ 38.2500000 404 0] endobj 3034 0 obj [127 /XYZ 38.2500000 161 0] endobj 3035 0 obj [127 /XYZ 38.2500000 721.250000 0] endobj 3036 0 obj [127 /XYZ 38.2500000 611 0] endobj 3037 0 obj [127 /XYZ 38.2500000 611 0] endobj 3038 0 obj [127 /XYZ 32.2500000 437 0] endobj 3039 0 obj [127 /XYZ 31.5000000 438.500000 0] endobj 3040 0 obj [127 /XYZ 38.2500000 404 0] endobj 3041 0 obj << /Type /Annot /Subtype /Link /Rect [481.500000 188.750000 549 195.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_multi_argument_typemaps >> endobj 3042 0 obj << /Type /Annot /Subtype /Link /Rect [43.5000000 50 546 71 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_overloading >> endobj 3030 0 obj << /Type /Page /Parent 2 0 R /Contents 3043 0 R /Resources 3045 0 R /Annots 3046 0 R /MediaBox [0 0 595 842] >> endobj 3045 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F8 8 0 R /F9 9 0 R /F1700 1700 0 R >> /XObject << >> >> endobj 3046 0 obj [ 3041 0 R 3042 0 R ] endobj 3043 0 obj << /Length 3044 0 R /Filter /FlateDecode >> stream xœí]K·¾Ï¯˜s›~Ai%È!ÀBrrì8aQrÈßOÏ6»wÅžÓým‘ýXZˆµYºù¨*Vëùý?ÿýüÏÿž¿øüïóîï‡Ï§âR—EÿÏùúç»—¿ÐÍÅý|®›òü璘篧ÇÓc÷ﯧþƒÏî~úßYŸÿÔýïçó_ÿÖýòG÷]ÿƒ_Oµª»¿yú»­U÷S1þ}ýý¿NùÝù·ëŒÃrn3ßþÿï”6¦›¢ÛÆ¥¿ž†cª§?ÿýá·Ó÷=–­¢mU{Vöú¯Öêóþqú©[`˜¾¸´V©º²uñš…j}]©Ôæ¬tÛ­Z™ÉBOd¦W&¿’G´ÉŸv.e*ž]¹­r*ëgþëU7ùuçÒ@P 'Äl]h³Ï³G~]4EÄɯ;„Y<¹$fµrà©«ðg|‘÷;—Ê€Y8¹$f©#bvœ=ð­Òñ&Úy,ÌÂÉ%1k+³ãì1€_š6"Ù\w ³pòKS¹àÏäÒÍÄÚNu³ªû9*MÕÚÝç¶Œ€™qöhot<Ý­ß¹4Pš‚“Kb¶©MDn1Îø­m"’Íu籸œ\³Ma*eåôbú“+Oô;‡ŠÃm`vIäšÚÆcÈϳǿ­â]Û~ç‘òdòÇ%“àô¿¦¼¯ß9}ÿIÙ¢»+ÕùËOÝÞú5ŸþúÒ¤<wµßu|òËçß…²8ùùÔ^*][Ì#È©ÐHñžùDì ³}„#p6 GúÙ>~éH8:õUõf0¼å‘£QŸ†çIJ}Mµ oyDcJjál˜^ çIE}VÁul:ê«‹ò5á}Âj›˜âŠrùH`z9 ì Ó"¾'à:˜³Ã{R@ú¥î㻄”dÍkhþCÂVzXJK¹ýtžöÖftõ´™F›Q=²T÷’è·ó ¶Oh¤èÉ¿¼èªz©–£-ü¦…ëô«ô¥ªUS—/fë‰\©KÙšú›oðy ÚÒð› îº^Uúø5¿ø=<ê‹i ïÔ B:ÂëôTY]Œêo¶¯ðÜØE¯noÕ¥é4ã¤u¸Á“Fª‚´ãà-ÌÁÜ¥*›‰¤€-ú‹Y¼~$dŸ…9} ñù“½XS{'êoP3 |7ð<›‚[r›-/…‡wp¶÷vC¾˜+/F7êÛ]è<êZǩ؋¾ÑïÐ7èX¸å!Ìô­é5ܬ¾ â_Ã[ßàuà1ðlø€‘•N¯6—²£úoHÆ`$ÑÀðyæß#ý0r“~·3ŽáàE# Z³MÙA€¬ñÂïf“u€¨jø ¼·Íú'fnZa|°a3Xyˆ.KêÊ&ê½|zâÆâÙwHâÆfŠ›ÅUBø€„Ôœb3Ô ]ˆ½Ýï©íhæƒ*ä”u3zf÷²8ÄRd| Œ)bK“…u 'Á*8¡T˜#Û¡Ö8®µtˆ©ÀÀÅðÃÓã\O¶r».æC‡ÑÉëäwI?îúÙÜáñçßÄëÄ”H­/’R«K3¾¡þô¶„`gÈUäÙI¨²ÏÎ%V¨Dì‹Rö1ê]Ù€0§ ÈøxšÝ& ¹hÇp3ìVÃŽOg¼õA#+tÊ‚ à:Žhè”MuRÏpsCgv ŸŽXxR )DC‡¾Æá0‡C¥Â† × àL½p×x ¤ QÑð£iÀdêaÝ”Rw»»¯&,Ѓ ÖØG…E16»Í·êQ–¬áס2QÞŠDªfà]5$F3ß°õhùÛ ®Æ§«Ê»µe‰Ÿ)Ïù¶gÕ øi$¥wùN\2¶¦ñÉ8ëW÷õ«ˆ—¢,­‡‘„/غ(‡”•ü‚MwÒ¾`3§ ^bù=¼,¿‡3^s¢'ÔJ¹˜ë'àor’ÁBôº$ƒøÍI!üÐ7¨òãó`èÀd†ÀI‰4íî…½ÔýМ½Á |ç=Z–˜ñ³ƒ›ycäh÷'pKˆÔ•~ ðK•êQ«r Š€y9˜tÎfW 2ž€šŠQÛ^ÌÀÿ7~3`R$b³)9ã@!Éå`û‰(ÇÞ¶˜&Q¥=!f†‡k=Ñec‰óõØÀõIÄÁÜSŒy@2‰J3F(3nja´ˆ:ä'¡„ëÓÝjÚÍ>S vľ#ŠOÕ­îÉÏ£H†ý(N žøí¸˜ŸAåÍOkb¤SÈ«óx"¦»É>»ÏYð)?e$†‹‰åHŒ"ä+M£‘}óɼ²ø­z¬gð€eú2HÈö§•ig§´sÐòEÒ5GËmA"§ÊË)áËé5)¾EÇŒ1m9h£xÕf³Cjï)ª¶ ñƒD2iªª”M›s'—uGbªjˆÏ~¨£/NÎŽ)(ªÚ—9í[&ý2¥­×Ô#Y¯®÷dÍ8¿,Ã'ͶÞ(< i3ØȶÞL; i'ËŽGgËñ¶ñ“-Ç¡u2Ë÷ç•ü-¾ÚÚ¡C&G£–|ST`’T¦(&šyƒ¶×¸¥©RÚFl›+mŠ÷gÝ)ÛFD¥Ï}Pª¡•yæ›àû´¤½™wéݹ;®Úœ¯}íodƒ©ž¥6c×{WïÅ\Œõª“|B#N'­.Õ¤æ…ß´è(UO²6†Ê)öj·h5ýÀÙ†jE7ÖÁ»îcrêKÛx',Oa0Tº±†5<ÏP¥fÑ:ð<¸Á½aw€±ðޤª“SéÑ “¨ÄlaÚä1bä9 ·xÞu2Xà\Lh×$,‡±0Iœ¸iUí/œ¨€Lz=þça2¦¢%]ªþn@4P œgõ í%$#j:eCkVÁÑ'¢ôs]¹ÙyÞT—·qs–ÖH ˆœçÍq«£c†bÂ`ÈŒ`­[ŒÇF ±7í3§J(>"\mISh9wÊ"ØU5ˆÙ"ØÃ£É7x¸`«uÖ_ŸC,ª?<™$PÚ D¯PÑ_¢­['þ“¸.F\¢'±ýàâ’^' ³]Š4’[¯æ˜l³¶ùì€b%"3ˆ †€•ˆŠXà-%êaO)Ì£œÑ™d”·ñëƒ(@8`ÚwVÔVï­'šð d ‹yDd•8/‡5Éîhn©P­¡ê–ŠÄ‰1ªŽ-# w)C¼êjÔ®ÞLxã6fÂR$™÷ é¥nïî‡*a UàÙ˜à­b9-+¼ƒGXxÃâ’p‹wÀ¯àð,…ùCÿx"T ßZ#æÕžqgÚfX5UAÚ¦+X®îKCvüýÔ¼ÎbØŠ–ÒXs"¼$ÌSj¬ÝÚ;<Œv”GF&¾l6F?K„m¬…â­–¿˜FÚ]Ãàóà²q8 ™º§XOÇÚž ¿,ñ[kÖ8(Ãâ' Áã“â{ PñºÀXØð›Ó5ïÁ4L½@ Â*`sÁa÷ ýãÙJz;#ŒÓÐ*‘ ?ûLp!ü “RÃȶ@² cÖ) ]r—I÷a¤D*Y]0²€°3j%&%îØoÚfDc¿‘ˆ= `À¿x´Š>t—de¤ªÆIš‹TZ]’ýcÌî±iNq„…‡)¸KÏe"CE£|vjEu±žßÑ[$‹â³×õÊc&TXë˹c´"¶À6ßD±Éb¶PôÜØ`<#'òm(~r~CJ‘~—©:x6…l2îͲ,aƒqýà4@L"Œ¬ÅЖSÉrìºBÅø•…=öEÔ„ZcÎJD‰%fPD\ÐØQ˜7a—ã,uú¿¹Â‡‹ÖÉå ƒt-Zžp3á'GÓbâ›ät1 „8j9£œ0q¨ñã5¬0B×ÐD{˜bi;Twjþ¹/d)r…Yé ‰:~ ?X­Õà4üÍ`Xp½è挈¤ª½âº§ÒÌ7ù (ÅX~-°?=b"«˜¦4ÛÍrˆjík=Y¸ Ô]àº$K4r†ù v”£@D¹êM·zºýúonÙfŽN\Ѿ¤oQ²aº{æ1žÊÌxª­«©‰«¦‹|Žªh'ïï1F•¥ôD `ì@ålŠ2g r È$¡ZãÃ3û¡—¥n&÷*²¢Æ»@X÷´‚—陌]ØœÅè„ÃI¶-ØÞžœZk¢eëu1¢zãÚÞZ¦JàƒäÝeè–JU”Ê¢{d›‹Ð³p¢X\á_©"ˆE ¦ ”Ê"[Ödg’®ªŒ¯»åâ4ûvã¿.J~Þ×µLéëUs S0È”L3xkQí.¡ñ…ÀŒkU¾kæ|:íËã¨oŽÓÿfÔÓWÑøOä*†²Z\¿g¨³8eQGè¡÷VS?áé MúrºÃœQíËßürú‹F®+yweWÁÍ\ { ½½i| cއU VY;㤌~3 îÁž?Æs*û¤Ÿ_l˜)Ú,ìÕ›:„¹„þ¶¾%|:R~]O§/çgKí3÷Tf¹üäÎOîð®ó“{;Oá×EA1æ»Èu0(Çã0HÅçDËȤ@¢7¸lYϹÊÕD’2!šà“óõpáfN‡× åÚÐ4wÞýµW¶üVÐ〡i)áÚÊ^´×²d¬u7ùænà[¸ƒA ª„ëào*8‚¿{sA‡·ðÝÂÙ Qk¼×8üÉÔ§šÒ££Gq·iZ`oµÀ¿iXmŒx‚¸Aººªo_å£Åè2¥k#’¾©Í|Ò[Ùq›Q#Vû2f*ç#½°5xƒŸ°¦‚ÚÄsƒi_¶~i¤Ã·IÕýÚÛãé^5TÛu­:ÉÜ+/6ó 8|—=)–b—ã}ë›}c]ufÕÅ(í]Ð÷hz'A®j¯W6²ÀG@#Žœ¤fƒ€œC)PÜ[ (Ú¿xøI'¦´LÕø °©¸Ìh-lÉ$~á’óáØ!çi·n¥:0Æ.‘ê$ØöD¤´SE™£Ä»   Qa™nŨà:%¶Âêao¹jnÜ:\x³Ø<¹¤akäZa‰ÅQr&–a’1‚Ëff‰2Þ –çKà3TÖ“€»ê[Ê0_YAŽ;§ÊV…§´ÆM½z =ÆY˜½RÁÙRy¥R…D34Šå%Ñç#»­…t¼½e1´­òåå‚ú*øî2…I„Píɽ‡Ã§‰0NÝÌ}3÷Ý4÷²6L`R¼&Û¤`±ñež³Ë¾8¡5ÊjΦ† î…ˆífÃ2 ¿Må²Êî]ƒ1– ‡ê2Ânj³#¸¸ì Ä’m@̸I¢©¢xoÇÏk*¥ênZ”÷oü §î@[nD纵þ "_¦X’l=TB ¢’äã&ž­QÌÐT>±ä¤-¡Œ–µ€ÿod=@¤7SFB6á/^]Æö±Km‰rÝÎÈÊvƒ]/_2Qß7Ÿ!Óhm'ºáõç×eŠâN²id¹¤l§ù%b€`›*®ŒPN倔0¤2µZ)y.ñާ$í ®¼ôj“çŒB1{`˜QjÌi$ÓÁñ Œåsõò7×'§Çó×YAÙ÷xï?˜!››uû:˜êŠÓn_ÃÑqqÍž’ë7¦7oê¡öé‹‘þùYMG\|³¾T“RHÐv£> uÌ=†ykoŸÜIQ¸3Ö­ÏÃñó³šÐ]lÄÄ æÆ1ž ~㘟Ztôú™òY‚»þ\Œ½ß)ª4†&ËIã5€ñ{P]¶kˆWÇ_'6+@pˆ¿¹g¾¸E¸ÌG×°Äp•÷ÊP¿ŠØëÂ\£œGõ.îÖ}xa€¾+ ϧÿ@ùÍÇ endstream endobj 3044 0 obj 5190 endobj 3048 0 obj [128 /XYZ 38.2500000 554.750000 0] endobj 3049 0 obj [128 /XYZ 38.2500000 771.500000 0] endobj 3050 0 obj [128 /XYZ 38.2500000 639.500000 0] endobj 3051 0 obj [128 /XYZ 38.2500000 428.750000 0] endobj 3052 0 obj [128 /XYZ 38.2500000 554.750000 0] endobj 3053 0 obj [128 /XYZ 38.2500000 344 0] endobj 3054 0 obj [128 /XYZ 38.2500000 428.750000 0] endobj 3055 0 obj [128 /XYZ 38.2500000 344 0] endobj 3056 0 obj [128 /XYZ 38.2500000 134.750000 0] endobj 3057 0 obj [128 /XYZ 38.2500000 134.750000 0] endobj 3058 0 obj [128 /XYZ 38.2500000 771.500000 0] endobj 3059 0 obj [128 /XYZ 38.2500000 639.500000 0] endobj 3060 0 obj << /Type /Annot /Subtype /Link /Rect [361.500000 647 492 653.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_optimal >> endobj 3061 0 obj << /Type /Annot /Subtype /Link /Rect [357.750000 443 429 449.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_default_args >> endobj 3047 0 obj << /Type /Page /Parent 2 0 R /Contents 3062 0 R /Resources 3064 0 R /Annots 3065 0 R /MediaBox [0 0 595 842] >> endobj 3064 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F1409 1409 0 R /F1700 1700 0 R >> /XObject << >> >> endobj 3065 0 obj [ 3060 0 R 3061 0 R ] endobj 3062 0 obj << /Length 3063 0 R /Filter /FlateDecode >> stream xœí]MܸѾ÷¯ès€m‹¤> €í±ä`àrXäx³ ëEœ=äïGÝ-õÌHzJâ3ERÝ­×xcïpD•ê›Åúx÷ç/ÿØÿë÷ý»_þ³ÿÚýýñË.;TEvþ¿ýñÏ/`ëC÷ï}Uû¯ßvß÷ßw»Çö¿ïÎ|ùø×ö_ÿÛÛý_ÚÿÿeÿãßÛþÔýÒñ¾í*Sµÿzú»©Lû¯ìò÷ñçÿÞýíûߎ;ö¯ë€yýß?›Ûº>‚1óêï»þ3ÍéÏï_Û½;#Àï-6¯‹ªÜ›Üå{Óävÿßî~n_ÐoŸšÜ˜ªÌ«ì-/ªìñMeÝìmZÜ£÷œþèìnl^Õ.Üæ'ȵ‘b\iÄÍ5)[»âŒž–—ôñsÙ=ò“…Ûü¹6RzÊÂÍ)ÛdE/U&×GЋílnÚ¿‚m~‚\+m…Ý5‰k˪CsPô¼}€Í]sN«c¥'.Þ]“¸efC÷yû›WGw$Ôæ'ȃï®IÜ:¯Ï²YE—íõñß.e8âž WÇJO\¸»9’ך¢¬KÛžuæÎÿù6T™¬æ1¿Ø=•m8ýÐAÆc6×à"˳N¬Õw™_lû¥3á6?A®Ž•ž¶£Ý}vy ÊkúŸÎëß…?<íÞ}n=™rÿôóQ‹œ^xúëéÛ.oÿãxBoÌþé§ý[xÊ?íŸ~ÙÕ‡ºÉÊ£*=þÞiÅ|8¯\~Yô«Ù§ÓJqp¶6¯7©O+îPäe]½z¿¾Ç䂾§‚»!øôÔ’ìÛfŒíüÕh쑊û–ôÖ½üÁ¯»/K²ˆŽÙr:AòãékòCîÎѨg ÔË é†¿šÃ]1Æ!eZ<¼¦±VÓ6Skôˆ°£¦é^ùþôJÓÊæ –À|F+Ý[¯?ÀæþÏïiÐ3ùù™æùWÏbjÌ¡hÜk:< cN+åÁ¤UÜB‚7±ÐwY Ÿ8+Sö\3Tø= ì4£H˲é^éÎdnÕˆ5(X¡4çAÊÊ,Ö¨|”oá=XÓÀÝœ(ãü‘Òqœq½Yb2ð{ðg`Õ6R¥pçËõ±`ð"Šï6²Œv×p%„ï‚ÐÛš üŒdÖѽ‡ŸEB@1„ZÐTX·0,ЉL@-¿Kô‹­Ý^Xüé@ë4o…5û†EIÀ2æÌ·˜kžý™3VߦÊ1è*PFÚ¿@æÜ†¿”PA¦° à÷Ìè¼< Aˆ tç/äÐsø Ëæ õûåš û`ÐÓ‚ð=ù'-gò i¹ª8)¹ÊÚÞÐvÇŸÃù<1†tbž‡Ï8´Ò±ÖÔ3på“ÿ{\éŽSßW0\¿®t'Ë©gjð{܇ˆœ”›YxðŠÅÜ÷‘à$ˆEÂÿ ßC<“gþrfð{N‚¸v…?}°œaIÏ1Ôp7áK!Þ°vÀœh!°pMD ,/oU )ÎÄ€jSô¯Œ|qìaO‹ˆÑÛÐç#ñ~þîðPÄD”Æ'z=sØS9K ®¬ÃŽ0á¥ùÄØ$dC “Î1f‰‹.Îõ®Jæµi]Ö7ê›l+%î·<…¬™ÚØorêîÊÂëK-<ÓPP3’…Ï©×ø=rS_ ¡<^f7|†Æ<>wT ÆeŽðú>ÀØapPE´Su5o§°ÂxF0±ˆwÃÒ”ÜJ¤_aì”…q„Xô4¡Óð3Xž12v Ç먨Ž¥T †V\€š°`Ø f" XcNÄ`«GD›™x·Q³3Qšc)bGª-Sçf2uFA |ÔÆ×SøÅÌý¾U –‰ »áO•ø©Vc.§ñ yb=„h뇙ؚFU©D&46—‹ÒÌ”n`g(ý¯*”†xÇßÃd=PVX#1Seæ†ÊÙXž~)0?“N”œE=èD©}U3¦kÊ©œJ•¤e†‡˜Ä3â~E9KšI Œ›äw2V± Ä꺘1{cû» cµB•JåTbfd²:W¬'qF%BŒ¯9+=RV>¾Œâ©åçë6ºì¤ÊÜsáfùò'‰*7ˆÝJ7•n6u°ô¥›¢ÞVº‰ë»ÄêàF‰WÙEM‹:z±ažÙJDuÏMK²^…&<+—‚0>4~f po¥¨ZÆ(EŠV¨IjV˜Êª\I¯„¸Á¹õÂãaó¦XI]%\2¥ÓDѨ{@P +„8(‡¤US¯…ÒöåÇʵ"Y¢XAh‰Ü{\``G¸Ýñ1ñ‚ý°r·P aJ2®ó¬¬U½x©–€Ö¬©‡g>*€;6áö¸ƒa.w„héfB`«CÜ bA{6ÆŽ>Ç1ž)uÍ¢zÁÆhc†ÈþÚäZKán¶ZÌK-ŽCsÍü· ~ ~<²›¢ÓF ·–6$YÔvÀ[ƒ“éò˜&kìk¾óJÈŠ`‘…ri”jÙ–PÅ€¨6+Ñ-„ÃE0B›Oàݲ\ê"4Ó J%~JjˆÂ ¡ ‡(©qD±¦ ?˜¯U¡f ¨0Þ„‚w:DÑÑÆô­ƒî¨ •ª^§Ê©ˆB¸57»²¸t ®T ©Wш«1n÷B4âÂítÛ`ŲÜ[35&¿ôÊŽ”2Ô窼:$LžñHê2]|²c:ÉŸÈÂÁÙ1Bïø»¥ i…;lÞ·3XAÊ‘-Äñ¹›‰>n)C[Ê·[´¦áª)ê·–±æÆÝLÚÏu*ËxY>φíÖ8y5÷­ñ÷ò‰Ë.þnb.Bs&" aÓmí·æ˜‹€¢¥›ßbâïc.Î4ó¸ZqÌ%ÇÑkÈI¸%x#˜Tc”hW.¼ߣ`cU1£KÎõ­jõ¢K ÞZôM†ã«s+q ­ÊõèEbE¸Eˆ[ÇZ–ˆ†Gƒ·ÿ_1ÔémjŒq3aÀü2«4VPˆ71]艈—GRjàèU¬ò"ªîL%{|‹w.Àv$ß(—jôš¢ªM˜vŒ FªÖmV¨&”±ªðZ-è J;°…Wc½‡˜¾J½£¿"§Ýc¦òqUîí–á$ RQ Å;76p5ZC1¾R:d D«ãæQ×1ÒÑd î ÏåeÇÁ™†î¹®⪩]LyJ¹2ecŸ‡œÂxõpÄw^@`U˾·aÙu·Æùœ:¤Æª[̋ʜÕbþ_•v onój@Öm´ÂÕ:éCÖfzxȇGt"Âr]ꆖZgdjúèÐyènº¦œI†èÄ![¡…íèêÑïH§÷ÑŽA·½Ìš£É©{å´ežmãjâq‚]U=Q©tÏÞî9Qam¤òÄ¢ûõª˜¾M>×÷é›2í‘}šFè»>wˆ­‹^ÁQ >½Ku]È»¹%¹õ¸…%%Ü‘j´¢u¨ZqEÞV'a”9ŽqUBZ•ª˜•[£b긶û0m£)ÆÂéE8Åj}Î#CwïnÜ™t¡f‰ÝXy“õ ÞæfÄ L¥,X5µß7ç˜ûs´{OèËí.è ö‚‰r-Ÿx¸ì'ÊeUöò'I&Êaˆ–ÊÄSG”œ&•”ßB\YGKí'òuqMÕ%ç·uÎÌ1.ÚÒ+ðÃ*‹,¿Uu7õ)±¦‰6E~a–ô­5¦‰v<2±Iöë‡wƒ¸µùóÔW—¶éÛüù¤'-÷GIÁ[_¾­/ß°ºy¥*™L©su¦ÐGH£Uœ.èÇø·L,•:Þ…@WÈ’ZS ÌÏý¸Ëw3C2Ú0DÕ öôõg h´§ªÚmÁ½ÀÈîîV0ã`9›z¦™Œà€:¸®ÊáWß[´=ê\ÎrÈdÉîqÓ'(­ÈªVºn-xý,|O̼¥ëCØ÷Ó‚Wûeü¡Æ»9ܘsÅít1F…¶‘ªžð3̈µu4ç-‹|ŠöÄXBA2T›;Ü‚—àK‹%ÀhTÚWî ´§Vð`P¬á0M°.Ç튱¾$Æ1 6k+B¿Pc‰ÆÌѨÀXT¬0v°öŸ†P +ÄI¦Ínއ‰â—„Ee¼ Á¦c*à¡› ìKJp‹r̉1$/°m—ÑÖŒŠÙ*¾zð+Ç¡ª.M3Óç8Ôðñ‡ðÒ¾³AÕÁÒœÎVp*mà\Áã·!‡JÙõe6gúìå®_Dðue¸¥LÈ»1 OÒ?\M••TŽqEߢÜï O´Ûho…´uy>0t:ú «ÒGŸtl èñ-”J¢×m&œGq¥STRt’& =îp]"~¦¸a?¼¢\4åÑ7&V5Ð5Uï ŸAdÌ*± ­Ì]14—›M5:  õq³*ÕÜ‚k8*¬9wr‹aÜZ #B¤ÍÖo©Tç XìhâÝÆG…øgE“R©œ¶„dCfêéG8èɋԋLÐq®o^cºþǃ>‰jÆÀHÌ——d`ÁÒ颭ëùn=¹•{c>1á­Ð'^M.uÐŽåÍÐænYÚu¹ um^KËTÞ ‘ã#d¨á\&§çø×Ê9Ò8ç918À¹D8ß fÿ°Áœ?£ºä˜ÚD¶2•‡+W^÷K‰LE&P¨³`p¹—àx\Q¢œ¿‡¡Æ™Šp7‡q óý†u|g¢X£&»|÷ÝÔ 1…É<Æ»1?½=ÄÁ¸D·Ò#–-dâM×ÃÐå^]{¨kÖ^ñÓ˜f“T«°˜Z«Ó$…#æ°7®?€ÆÌGoªòþ¬¨êHW¯n¶e5Ú³)fáhu$^*Á0_b.'$ó U»¥Ê±"$éë°bÙdݸ† kUÁ0'9 AoG½Eo`;·çë\_E®ç¥ˆ‰ í+ë‹c)½fÕÓpbµeŒ<·Uy6…ÇÈj"/ZH#aòñ4êW¨dô–7Æ@˜Åb çz½Ç絩Éûµ+°ž~Äm¥Wâ~»áh튩ýE|'áT»\QP3’…c!ÄÝ”pÞÒí¢¡{CˆwS¬(ßþcŽÇ2‡Ï‚Ì8ƃƒˆ^¿)œò’ßò¤×ø×¹Âة˙n. sã­Žâ2ÜKă®4kè:í;s€q­j«£j謹´7ö!±Ìà/Ff˜Œ±äº3ý £½-̸ŒEÁï$3S’YwáâÚN'êÒsU'P|ŒPœëîgö¥:¾ºqBu3°§W•poœP‘å®y--^…ÐB18“ÖÄ´—`¥ís„$)ÕVLá½rëiL¦A.ßV›¹º€Ë‹K÷Òûi°ÎŒ)¹ÎÆçLÆ>¸ùÌ š¥·\^U³ð¤§£°ÛŠéÈŒÎÈ™fED[ ¦µÖkn.‡õS¼!!­œ5åä,ýH—ôð.§,cQ1—ãÜàâMÀ5¡-Ó˜–ð5cq¦¶0ÂtÅöc™~jÿì¿·ŠHÔSs¿°àt\O)1מ_3s<Çïm_=ÚÙ‰©Ãúîjâüz¶Gö`Ï’Ç•ã•n\=”£ää3Sq¸ô7¾œ‚ís÷¥(”ÃÙù3H¶Ïÿ}`Ç‚8 –&>ÃàÝà3Ý1Þx}ú‹ÞW,ÃÿÝBÜCŽ/Q1V! XŒÌþ,€é*P|«~PCºvAÆì‰[ @t ˆŸ™kY0ŸŒ€ÀOïì.ΞÁ9ºøúMÌ^eîÐ)Êe\ßõšŸ ¿¸›žµûÇÝÿ3 ‡’ endstream endobj 3063 0 obj 4975 endobj 3067 0 obj [129 /XYZ 38.2500000 404 0] endobj 3068 0 obj [129 /XYZ 38.2500000 254.750000 0] endobj 3069 0 obj [129 /XYZ 38.2500000 313.250000 0] endobj 3070 0 obj [129 /XYZ 38.2500000 284 0] endobj 3071 0 obj [129 /XYZ 38.2500000 254.750000 0] endobj 3072 0 obj [129 /XYZ 38.2500000 573.500000 0] endobj 3073 0 obj [129 /XYZ 38.2500000 715.250000 0] endobj 3074 0 obj [129 /XYZ 38.2500000 715.250000 0] endobj 3075 0 obj [129 /XYZ 38.2500000 404 0] endobj 3076 0 obj [129 /XYZ 38.2500000 313.250000 0] endobj 3077 0 obj [129 /XYZ 38.2500000 573.500000 0] endobj 3078 0 obj [129 /XYZ 38.2500000 284 0] endobj 3079 0 obj << /Type /Annot /Subtype /Link /Rect [55.5000000 581 147 587.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_ownership >> endobj 3080 0 obj << /Type /Annot /Subtype /Link /Rect [43.5000000 224.750000 531 239 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_catches >> endobj 3066 0 obj << /Type /Page /Parent 2 0 R /Contents 3081 0 R /Resources 3083 0 R /Annots 3084 0 R /MediaBox [0 0 595 842] >> endobj 3083 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R /F1700 1700 0 R >> /XObject << >> >> endobj 3084 0 obj [ 3079 0 R 3080 0 R ] endobj 3081 0 obj << /Length 3082 0 R /Filter /FlateDecode >> stream xœí]]¯Ü¶}ß_±Ï²I}EØ7.Ї† ô¡èC‘4-‚8¨Û‡þýj¯¨Ý½ÔJ<;$µ»ŠÓÚ¹²(r8œÎ¾ûãç¿ïÿùßý»Ÿÿ½ÿÑþþáó®84U1ü³?þúîòº=Ø?ï›¶Úÿøu÷mÿm÷i÷©ÿÿo»á…ÏþÜÿé{½ÿSÿ¿_öý[ÿßì_:þ…¯»F5ý￾þÞ5ªÿSqúýøóíþò»ýoÇÇÏÙμýïï”®tÕ»1óéo»q˜êõ×üm÷n@ØWtUTªÝ«Ò”{Õ•zÿŸì~î?06_ºR©¦.›â–5úø¥²¨÷JwýWu=ùÐë/™æU„Æk£â5þÚsq©(S+ë’“Û´ÚNnÙDÑ©ùòW…nãMîkÏÅ¥2N.n]pr•VãÊ-ºò?5crK]ÆküµçâR±“ëi]rrkÝ êª:µCü6ñí¹´PÆ©… ά.Ê6¢M>7AúZwñ–íÐóX6ÙÓºääš¾}k“Û":5CþUqr_{..•qr'­ iweø ˆø¿y^|ÿe÷î£*{'Ñ{‹/?÷¾ùúÛ—^(Õþ»c˜oôþËOûß…yùÃþË/»¾ô]þÕJÙ¯ÕëW»C­«Q0sOT‰žÜÚØZM<=(4|¢D¿ó>éà“6¼×¶i´¢9Í#ì©þ¾cÂ%_¼À'?„Çà¼O£±ž^ÃïP¢ê¥Gc¡^*^/¯éAC¬ üFCàx<–ë}ÂuÖv³ýñY›ñ“ãÂhêêU g± "hmW¼}bƵ'Ãd—‡Ò ÀééI9 ­:Ôj›7ßiÑ;Öpùxz£ ¼L bd ^[ÌìˆDLÈrsêY·sºÑ¡ª¾cŽGŒG'°¹Ÿ4O O˜Ç,”ÉüŠÚej[&j[=Cǽvç‰  '’…² t ø½Û{&È':ëqÂx LƒíRºvÁ'f‡QYøƒsc”YcDÓD7¤Æ4®!hfŽd;Á­&€™ìÞ*¾¯ìW ;Ìü~ƒ@‡„#o3¹/üuy|„±-J²Ì>Òõƒ²ÇàçÊ\€ŸguzGY€Y¢ðØã¢(onãSmKׯáõA@fŒ†Ùˆ ÄÔ½ˆô¶{Õ]›]¿ÎÃ1éÕ~rÈÛPÅa@5.úý=±K²:è RïÀØŒ+ï”6Úw§ìhÖ;óÖÁah«4åéœ[:[ŒÒŽj K¥9˜‰j`qÁ'“aà[ ¿Ò%»#¹6@.«áªÙ]Iø;ñ7M=¦æÏO`ü’'"K”í°å'܈9>ÈvL∎:½§ÐÓ³WÀ=`¶³i¥âây¥n\[¡9œüˆA;üBs'‰Ö2º#¬´q¤› xŸÌ¨Ç€á…Áø1 ›B0PƒlÕ};)Ù1qšÉœãxŽFp¯]ͤ’E„Ña18BÆžM1rÐûd9!kÎ’íõäT—9¯d’mùäÔ¨‰ºs=+i?Ì$å” R"‰ÚâgKg£K$”xöø?$óm‘J«ªÙ(ÿáÊðDw-ÉJ¤˜2<¢ØÎS"ÈõA aŠúÖQRךr¶?ž'xtXû˜ä¢ÌÑ3'L^Âb»¶:U¾%,mo›SAýÓXOŒÒxR«  6«¶«Ö©Ùþ0öñ‚x†=:F¬@ÏxˆwÊ"|¥+øÎ t~‡¡ÞÀv[®5KG¶d]Ã^kˆpcÏœ¬íÄ2ð”௢8¿S§¯&Œ:=’1˜¸bîIšžÖÍldó §?aÑ<¶jÄ“¤+ ­ïCUQTQ¬× "?Yía¬±˜ÆùSTQŸ`a´bÌaq'‘>¿ì¡š0«©eCSˇÖghz°:JäYÎÉÅY2çª ¦Žó&˜d^Œ×ºÇ L%&“Jå4ø´†ESSEëõåU]Ô‘pÿu§¾üÁ¯»Ï‘õø¡·šZ¢WåAGÍ‹ÃJ–fEÌOŠ3 _wFµî¬Ä¢lDóuì‚c4‰Ó#Ù#ꔊHfOU5DÕZ3ÕÿØr-¯rN•X®ú`küdöÄrÜ+ŸSΉTpœÅ½¥‚‡ÅƒÊœØñò§‚‹&pl)Ú7òeà„(B]ar“HUeH“<Ã$½ñt`a|Dxâ˜mP@& ‘fuC™z,e"9†E#JdÓ3µÚqMŒ*L&êÕ""%f#<ѧæ Þ–T¬ Z$ò8yªqC#Æ5¤ÁNò Y¥qó}=ÔeŒ:,gÎbê)”O–§ŽHögX½rÒ­Žìpnó> Mé—§E4Ü£/‚^•J©°l·ˆŠFB”µgB”ɦ‚a¬¬`dP‡!ZP»ú& ߦì†N¸Bß8&Àèª1 ÄX3ÛŒ)”­Ÿ_i]6&Y,ñ ŒLŒö¼h檱©€ø› 5™jlæ;Æ›ØsGÆ£)ºM"@Ä·RuÚ b~xc³ˆñÏwîʼ6•Ù0%¶Äò“ˆdÏ¡qbxt¶–Ÿ½"•Ù¢î€MÃËÁ§±+7º¾DG2ÉNrÉüvrkΉ¹ËT;Õ…{¼«À…Ùpʶ0~‘øÌ(‰òEˆ¯ÖBŽ”[kj8Sgˆ0Ɖñ ÑÅ·Ñ¿R³´Cq µ´ž(õŠ+µ ¢jáPðTáFGð©ÝÉNÄöDpêÉLc‚ÓìDÁŸ§âŠ7EwzÝóšs'dá§µ{+Ñ.7EéØeOX±¾Ë‰…É^™;íARùÁÑ$‘[[7w¹åŒ¨ºÒ]¹[DµET[DµÌÿDE-«Î]™[°ö4ÁZXJxÜ*Uéâr»z^VùÉUÔÏér¤ýz"šP†öñihBWA†Ñ‘BíMHTªtÝÎö”"l“¥ë¥‡\i¢Òí<)`B:Eet5«Í²Ö“!ïÆ硌Ã$…ÐrxìÖlQºâ5[\Ʀ\[¦,7]Þtù¤k¦Õw0[Â1¦d…3l ¶g¥¯˜zÛ'e¥@ר²Pw ±k¶/ÛÊðÍœÁvyÍäÀeU»“¸‘ÁÝGÎ-s²é/qºÄ-° ×lU7u±žD9þ yÈ(¶¦•rŠy\¿©+dä6OÓ·4Ê‘{Nšœ²¸ºDE䌵•%8{ NCjƳ;š)ê–ÍEñ8‰.2ÞŠÔ£Çw"´ö&‘³sX h3£ÎÞJqu|7ÜÙºˆó7=*F0©M·)ØÞ3yDÈŒýã¾´gÐTU —™þ{ؚ幟]R PW¶®Ñ%ì˜Æ|!Xðä­%Sà¬s‘g3ÙÔí“ë»˃Fˆ&͈Խ¬àæBæ;Ù¨'(ž×îû]ǵD!#³ªÆbnËÉ®ŠÃ€¿]LæGôÄŠ²:è hW†¿ãé|bó ¯´VÚ½•»T=Êÿü¾£Î×ĺ ˜°5[yÛ °^ׄR ïLeaE}0J;Nì=ê¬ÖáôˆKÏ|'ÖÜÖlörWYoOUé{Ør>1%ãÜsUv ßÞp0 E-f0Û¥YRè°²æ$HìÕôÍ"sh{hË °zàý×µ'Lk-¢“gD‡ÑxН=yOÜ+iŠ$sÑ6Î\ŒÇ'2ÓS'(+|»™N˜|¡VX¥Ç@ÚµÖÞF÷m"HF…;à«W;w±ËfSËbª¹=ž.ᔫå× 3Ig‡ŠdƒG¦’ÌS±– l‘‰M%8ëL?à +Ò®#{Œ6Õ=ô77cH±)"®*¡‡Ïoµ"'BQZ,ËÂe5é´TºXÀáE@6@0„ä»n¸™3>~VݬÖx±§˜|æ‰&Å%Ö>=Ï•ð;Lßp>’§5Qò,êÒ†¤‹ Û<ه阭Uâ¾a Ê„ Ô­šíGò¢Úçy‚3èˆL=ák àzöðÌ`ûÄè2¾ø“¦ãÁúiÈ=dÀP÷ȾÄÄî{+jk<4´« n>B§ö«©jRšêt¿Å b“–- ä1Š¡’! ˜Ü‡9«%TÙN²9=XãI¶»HÌ \ Ä“T”eÂÅeŒ‰$PË Èl¥ãÖî‹QCš{¦Sðá-ŒC`Î…¯ùMB†º*˜ß]•T’µÄÉ­p‰ªÄ¸žîˆ æ¹¢¥“¿Ø”ÁQãà±Ôáv,¤([úvÓœúšÓ·_`kËÓ· næo ×9®[cƹ˟píF©”ëÜö“[f´×ïJdF‡ž1JÌì*îÀç¦b‰MÆã¹~N¹˜.ÄÒ4ž}ȱÕÉZž—SXáÂÊÙ÷¯ÉŠ«Ekg=¾pùÆRñÂßóÌ +Êr¦(ÏÚÀÖ7;ïT²ìu¸: Åñ;ãy²qárüÄ3‚N•‰dÓû"GúÌ­ Œ:—>t©;‰ œÈywÜF6PÜ+bY…{$áM†ä/#³Ÿ\3’‡{ Ɉ¯Àf/è †ç6Œ/ ãën#ð]!Æ·]¹¡Ò;ƒûFÿm_³F43ÿ•‰èV+ȨùTµãù6|9¾|­oOƒS—ôÈ.ïDI‘©Ð¾Góc>·f|îZü~?(ZÌ[s ˱ănwö6€.@×U§:ÕtV#nè0²eˆkÐiÛZ9ÄskÆÐtíÈÚ £¶6R穤›äwoÝm‘d‰0ŒçBW°/Ë_b‡c/ö¥\Õ`ÉvnL´ÉOæ^P¦@™(Cž½Ê0&†×¸ÎQ]NPïî1òÛÞaɈˆ¿ò T4Ñ’b1ÌvšØú÷ð‹s›œøSïàkí0•¦ù­WîÙYŠJíéK*q˜€ŒSí&Ȩ[äp°ía`¥€+„×|‚¾âk¸òGfe)[/Z— @½YÃO­€«Æ5ÔgpÈÝÿà}«zEr]l6KÅ›¨bˆ¹UšÚ°É®!Ù»ž—Gá†kÒca>OuϹ.Nw6?Ñ=çp<¸lêVÐÀÅ\©‡Ðåž2|_1¾aXôžs¦DÆ3Ûp<=€·F{nM‡k!á}êZó=õÜ£]„¯Z…g ë?žüöÍc°öÁÖ<+‡¹•J[!ÙùÑÄ ôÌ\øxæÎr,kì °†Èj¯Ç®Ãw˜ûî5.V¬Â½DÂݵRÝìè?"b¬WØzzdûFy]Ü$?a´O6®!0–; i “5^gŒµÃ#%v¬”Gebüc ¢3Çx#O¯ñœnOÒˆ§ÿ÷–ˆçÁ¬ÐÉâ€5G±Ic”Fݲ·=‡àlÍ’]¿ýä5êÙ€„Åž"Qç'P©3"ZÄ0<™9LÂ"Á†‘,ùÉŸdæË’¢¤º’†©/ÁÊ$šJŤEQ9®Ëë>)&QCÁܬƒ ÚK…²öï˜Þ¥«÷òhËA¦`# ^â.ó‰&‹æ¿fÀÃ8Â$æâdG¬U©¨¤VšZ®šóû‘¨´)Úé'ñ2å6!—†F¥qÀ&]5ŽP_Ís³šd”)r#‚Äi—>.ŽB"h")˜F>÷lË¯Õ l·\-QüDG¬BTìÏÜ™0ÇδNO¯ÅsOÒô´ëÞJ;YõäEcd5a¾~©ÚÙþ< ½@V¦¿ŠO+™ó¢DgsÔ9[ª³¬5Ÿôáó"G:›»°ý¯ý·^½Úþiî/,ˆþÛ«œÏ½Ë,Ô±îq¯Ë·:r-|fµ¹v vQ4þ“ù®§OìªÓ‡zrŸ©šñiW¾cæè)®õí£)*ýÄ!@yîR;;^; UÛkÍ73!Ô•a(Ü|ÇFÐ*hènšU¸ãŸû¿]p×¢[,U¨Ë«ÀK¸ àyõÌøœTÃz çÕ†Óê‰O ¸<ÄïÌ>\S\fÀ¡[Ÿƒkå1w>ª½Iٛ¬¡¼Uë­y³.cÎ]ì?íþ÷µ?} endstream endobj 3082 0 obj 5668 endobj 3086 0 obj [130 /XYZ 32.2500000 720.500000 0] endobj 3087 0 obj [130 /XYZ 31.5000000 722 0] endobj 3088 0 obj [130 /XYZ 38.2500000 687.500000 0] endobj 3089 0 obj [130 /XYZ 38.2500000 687.500000 0] endobj 3090 0 obj << /Type /Annot /Subtype /Link /Rect [53.2500000 729.500000 148.500000 736.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_exception >> endobj 3085 0 obj << /Type /Page /Parent 2 0 R /Contents 3091 0 R /Resources 3093 0 R /Annots 3094 0 R /MediaBox [0 0 595 842] >> endobj 3093 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 3094 0 obj [ 3090 0 R ] endobj 3091 0 obj << /Length 3092 0 R /Filter /FlateDecode >> stream xœí]KoÜȾϯà9€Çì€À–­9l ‡ ‡À›M°X/¢ì!?œ!9’Èùz†«›äLKXkV›ÕUÕõfÕû?}ýGö¯ß³÷_ÿ“}ï~>|ÝåûÒåíWvø~÷úºÚwŸ³²rÙ÷»çìy÷´{jþ}Þµ7|}øKóé™ÎþÜü÷Kö·¿7¿ü©û£ÃüØ•ªl~þzüY—ªù”Ÿ~~ÿïÝ_ÿývX±\ÌÛÿ§t¡M~㣟wý6Õñû÷ï¿íÞ·˜öí´-òLYc3U[ý÷Ÿ»Ÿ›ôËçûÚ*U¶Ìç<¨Ô‡'[fJ×ÍSójô ã·Ìò*ÀâÎÙp‹!ÇŠ2…ò¯¾¯Šî ~&Ÿ]\¦á,Õ|ÊV•Ñ-i\€6§ÕC¾ªª€‹ —FJÏTpqIÊ6Kµè±®€ Óò°oL]„#írq¬ô´Å«ï+k”)u# BˆìªJ7ŸKÓ}ÍCš­l¸£ü²zz;›‡[üy £Œ<ÊÆÕµ&iOËÀ¾Íu8)ÝB.Ž•ž¶xuAâÚ¼êiíB ¿ '¦­*]@Æ9@.”Ž´xqIÊjÝÙÔN8¶/ˇÀ~iM¸Å‹c¥§íhõ§)«`PÚß·òÙsã§o»÷Êæu¦ŠìÛÏ pí3?¾5HqÙ»ƒ/YÚìÛOÙ‡Õf†|òȯ`Ï™¿˜ÂŽŽ}\MœÒýS?G|ªQ=JˆŸKW E`6Þä̪è‘Ó2…R{g‹ªt¯€i]µ¯êüéË•–•í¾qÜ9wîžx\­ØgVSø96 ;^1= ^APM_Í´‡¶º‘ÝÉ?·öܹ½Ñ•º‘´P¦¿é²È÷ìÇÂ{ª!Rð6ð"˜#1mKb5‚‡^íÄnu 0ºð=xë]ØC`ÍÕÐw:iªá¡ôŽÙñ3=ÀbTpÁˆ¼ãáò”ü‹„P…šGÜ]:qUb£ :‘Š"c}Kô1ÛÀzB ± qrf‚ž#·‡AÛ#Ì60/1fb$EîÁÁˆ¶˜u0/ä°nJUØ¡½5/ñx…Ð/õ¬†½\«B«…C¶ò-¦¬!\‹Î&Ï÷E©ÞÊÆÊíóÚ¼ežpµÖ`Tº¿QMÖu9T“¬|xcÙçÃÃK<˜ÑtŒEiTŒÂvð(¬}ñ• JŒ7Œ,v‹GÖ~Â8€Þ¹úL°³ArŃk‚rc'ê¢z€=˜±€'@¯C Ð.ôVäaÜŒ×à5„j”©S×mM]¿µ¢l­K@œcÏm›÷¢ñÆÎ÷œ˜Öè*³mq ì^««EÜvøî$ƒÚƒªÆµ9oÇãVRõÙÑúõ/~Ý} –¬G"àÂ@¼‰ˆå•–?é8€‡ŸÃ„ókš°™)eCìË ¼Ó ±3Yûwâü*Mæ0»¢æ[¬×Ø·J,Y\eÚžC®jã …³o1xð ìÛH€zDWºûµ±‘Î-à=5º§R/¿ùÔ«Øî‡G_«q–C ŸÜyEå¾®÷tõ5gVÓ†!€PwçyÚs0&!>C€¡Æ°u&Ý$Ø”X]Æ%ç§®{tôEåp}„þõa÷mc˜åá6<Êð.d’!Œ!W œ«òD:pø*AÊ8 mZÔú3Ä’ˆŽÅb¼c&•W£Œ8"mæáŒH&†KˆbŠ> š«¶Ñ*oµ •H¥30˜J+Yq¼¸&Šæ¬-œy¾ù/âШúÜñÓ­³Xšú-ZT¾™ûèJÇ‚n¯Gö`1ý AgºŸ»Çž”^}Þ¯Ö›áã{r¼Ó/³ÕoÈ=“žóiŸ°ÓÞy4ÇÃñúžOð9£fF‡Ÿ÷ƒWó\ÁØô‰æØ”eÙ;60õ!bÕ{ä#( Á?¥@†‘¶8+Ncc=9 -2uŸj0A¯ ^¬ˆ+,[2€÷EŽk£áŽ™Z…)õÀØ Äšã‚1Z˜z—Hæ™ÇU”-„W¦dÀÙ©Êz  É@É&Ë‘rȸF\8ƒÅð HÔ ³+Fˆäo.¦;°´òXxƒ‹Åm×Wý-Âçã?ÅÅŒ)y=½¨7ædj„1èwŒçâ_ðrªÓ;µ¦o„Í‹-Å^¨ñÅÌM g-ð»%ÔK•²BòæU‘=ñ¼Ü8ª²ôBøØ~‘’–—ÛT…ëO n ‚›/à†%°…n3‘C¨V3¸õñÏËA¸e Ó–6Ç šÝ`ì`*à¤`³›·ôÀQ˜,£ð%1ˆ—Ä0lžóƒŸƒ_mÃÍ{ F-D§¯ñX<¦õ×RÍÛÆíµ™ÞM BW8ý$|S57Òg²Óo#I]f¨Í„–¶QCmfœ+5kùŽÛ®ÉrÓzèçﱉU¾˜_Ìd]Z,/9#³Î’N˜'!2çóaˆN„µfíÜPkÆò.ˆIc¦aA 4>'‘f“1ÊÿF†Ä$dìé .RªÜ>NÝ¥l%æ™2b×ÓÅ™˜‰;ÀbZF;3«v|ú‘D°àšƒ17b߯ŠxºJ¶EÇ9yŽ\,tÅÒ|aù;H§û€ºÊåå@Y݈šŸ0ˆ\VVDl®mœêÓÛ&Š™+iÀÖ‰&•¼­yð.—÷¤KaŠ•À`*à&Ñ8]Êà@t5¼ü*°¶K/l…÷X\Ù¿Ïš†emlX–ÇbpÀD9-ê²YY&ÖÍûõ™„9’€©y˜k޵ÁÐÁô ž¥èx­ Ùãj­6½æÔÌØ!F´^?ïˆr{®ç4 l•³Àngö“i€ìy-Í~J³Ÿüω5û ºõ¸ƒ…°¥yQÒUИrT%8~ãèày ïg³³¬ ;§nÿ¾fYÅœyi–Õ*ÞøÜdŸ›U÷­Úl§¢ÚDg¿ÔÍ u3ø§nÒ,+¿Më±=Ò,«Õ÷ü.óؽÓéAè¨çÐ$æ;Û¥™Ó•kÍ6ïÇkI³¬ò››eµÍØÚ½½ÒÅîw—¼=¯ÜHÞ^òöbz{iΖ/›æl ûÜÛÔâ÷Óqõñ€2zW»AÇzN‡º˜ñ€JÍš:—f€­zØ6õQšOvñÔš9ÑüÚ4Ÿ,Í'óÒ'Í'[y\ôç“UnÖÔÓËš¤ùdÒu[·8Ÿ¬¾gÞ/eÎÙâ•Ìi>™ i>YšO¶"; Ž]{“æ“]¢I­Ö£MRŽ7åx÷¤ïFs¼|ÜM6ŽÉš§ùdi>ÙÌ+q,{úmÊþæ+ÉþÖ6vÕaÌŒq]Ì©Qˆ i5' Ÿæ“ ‰ml/qNð7¿³y1p&Ò|²×óÉÆó•˜ÆÀ£F¸ÄÀ2jSš®výtµºÈ‚ ”ƦpCÙÈL1 #³˜.¢?.vý ©´Š¡Ö¢Z«3tqy–N²âw…#—0ßÞhDf \'«ÏY>ŒbƒŒèÁù­ÓéVNÚý6aÐ(ák`“+†agi=ÐULGcÏ  ”$Ô Õ›˜Yxô+%ð=ÌìD|؈^±ÔùíkNèŽSéÏh©GLxÛ–‹¯ó¬Uª¯|Og}y¥[ë<+ûæ+S£€ë–ïI»<Û¬H\>ö~?]q7ºSÁfûÿZefõ´Åø%®x2f˜Z¸FëCf¼ÖŒDD%Ûªü‚«yªìBpUœ3ãú7 ¢å-uÞ'Úcy²^!5¹jA *£): žñª'„‘g›¦…A ÿ”!©Ì¨R‰á¢ËO°’ú;%ê‰7(cðÇŒ¼jÂóoC¤é‚Nñ*ŠnY'÷ο¸*ƒ†Eß„Œ‰è\k*zL6J‹ž-|Ï”èMUÅL㇠éªáŸz$3óŸ"ènó—GpóÙ²|•>Dz#†É’BªQRµ‰Áa¶ïYs-§gì)ž~)ÊsÔù5({BŽÛ¤xÜ3fMY/sµõ3­LB©xïXX}*ýHùØ{ÊǦI kÉæè2ÐDÛ›æh¯ÁUšæ¸‚Î€kî ¶ê.[íKfŠÝ/;õ~ñÝ“z¿xé“z¿¤iޤk7<÷¤iŽQ­KcæôHý;òuôï°ÆÍ™‰±Ã…5åœ>ðkîK|?^Kšæ˜§iŽ~›¦9¶Ò®ŽÝ¹=y{^¹‘¼½äíÅôöÒ4G_.-MsLÓý”»±þ±sãÍwöÜ&^»åéÒ\QÈSmÁ¤Ì>W‡‚¶LÛ·'õ\Eb wy¦„¤Å‚Þku¼0’ØÅøJç£ê}WP÷НZÎ-|FÏ1—^a8Ûc·STÓ‡k<ìP!à7$Šñ;FÃ=q]Í™m(¼¼§+–Q“¶þêU'–áŸˆß ªs•T«:80³C> endobj 3100 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 3101 0 obj [ ] endobj 3098 0 obj << /Length 3099 0 R /Filter /FlateDecode >> stream xœí]KÜÆ¾Ï¯˜sؾ€ €´²ä`!99rœÀˆl|ÈßgٜՒüjÈoª›ä,-Ø’ÕË~TU×»«ÞÿñËßÿüíøþáËŽßÂï_٩̳öŸãù×»ïÿÂV§ðçcYåÇo¿žŽO‡ÇÃcóß§CûÁ—‡?7úßÑÿÔüûóñ¯kþòÇðCçøåPš²ùýßϿץiþ”]~?ÿý¿ùÝñ×óŒÝra3¯ÿÿ±¥ÍÌyW–~:tÇ4Ï¿~ûöëá} €y«ØÜûÌwþhjoÿýÇá§fnúìT{cÊ—Ù- •ö¼’µåÑØ:;æ œú =ÿÒ™ÞD˜¼ô.ÞäÏ;W‡Šq…‘g×Dn•g@ÆGÑËô&¯‹ˆÈ}Þ¹:T:äâÙOUaKŸguÿ|˹òÌ-ÐÊBj/³G@IsvqòóεÐ'W¼Ê §¨xò¡@¸@/ÓG˜Ü¹x|¢Ý¹:T:ÜâÙO•wÆ•Íu?#úŒä¼ªlóçÒ…n;—weÄ«|™=JrcãMþ¼óXWNÛyÕI»f¦©â Ó¼4yDZ:ï\*¾ñìš¼»,ºËÖüþEÄ»\çeþóÎÕ¡Ò!Ïù6YVEÔ»¿›>Â䯯ÓÃÚÇÒ»…Ùosa« *Ù"r/ÓÇ€žÇ“ÌíÎÕ¡Ò!w0ûãœYðVÚ¿^'áÃ_ï?Ÿ5Û*Ž_j6×®ùüÛ×(ùñÝÙ•sýñøû,3þǯ?êSaón‹QF28bàˆ…#Ž<À‘h$ûŽÔpä3qí7?|mˆ!:]~Nܧ„;mÄ¿S ¡msb6LWV˜â0]Á]g -»¶%<…ì±k :ÞGŒŠv0x„›Å»ÆëTów`!~L1 ˜â×|K0Å #)yyén‘¯VxS9Á1õérb|g±f׎€Û6¹.Dsø aä”û˜ðÖÖ6±&í¡&m?ÀÙ°¶ ù¿Ãz9üËg]íEMª¼†‚5¶t Ür,¹ñIálj?Âl˜ aiµ Œ8"|ƒ×ÜŽÑ)µ1¼–ÈX{ÁÁ‰×¡ñäÆ$æ Ž‚)‰áƒéS9¾ÏøÎà›G}”Ž}ãÑH0EÇfkÑãNg¹Z¾i™]5ea×ûÑ ÂŽ­7˜þ¨wp=¸aa Âl-¿ÏOÎVfâž-d)Mµ¾ðN‚­:2=É ¥tiH`ˆóPšM§L jHKÃâ!OsvÀaÖ’î‘­º²ê:8Zg±שVe‘¿FÀ=1=§@·7ƒƒ¯ßNˆ)_«¼Oþ„°pãàv™…ÿàÞ1®“S˜/^'®< ]I;ƒ-«ÊAî\cåcß`µ€¹Â7úU2zPÕ¯°„Å4„/#EŘdˆ“ÚŠ MF/M‹íˆ\þ\Pà5—Ç0ø Æo_k¹/æ{Ĉ˜Ã °êƒ¡„§Wåÿ3,ÊD!d†Iå¨.äÁïa²SQšó ¦Àšî½f8Ëà&aæõ%̼U "ÀnV›òLlJ¡ž¡ÇÕ°5S8Æ>¾zûÇ€'4læJôá'hpðÄ,0d1”ÝN¸¿ÌV{ç#JÂÜ›ž(Þ-Œ|FÌÒ§ëxÂ$„µ' —0Rð7”J‡Ï3¸©„ƒ-8éøÊ«Z¯”I?I 0ÇÔEè¬ aþ y:f_cchˆ1×t1s+Óˆ¬SO”$‚Ê x•‰¹æ Œ(ÎLfmOž-'¼U4]Ƥÿ„îØž‹ðêD°!,|à— àG¨•ÞB-|†¥Ê,ü)]pBLº‡ƒ…§GS…˜)5Üc2,‘¿û&ÀuåÊÛõõØúúUõ<¦ð+}Ÿ6˜,§ôD„ɰv°BáÄxÿ‡Nå-)¼Ù}é‹Ý=Ø^ÂÚË€yà% µ9>Òq‚9ëéFS…Q#«¬ºT½âX¹ŠÁ¸z<Ì¥ºÁ%Qf5;éˬÌŠ‰Y0 N5Sv9ç»F4m—ÉFÕˆšÜ¿¦MÈüð a<¨éáBÿƒ_»þÌ¡ªÜëmÌ{Æe®™§WB1 âµòºÉ"£)Ÿ^ÕÙMÅbWü¼o£ÿ õáG|)XÕö¦§z¸ Þµ‘4§ó˜â’ Ñ_@w\]_òÞC&Y~Êj÷Z0&Êè•3ÇrÙàÞGQ{eŒí†¦ì€Ñ~¦;¤(¥›p<Z*Ž<2.uÕè…rŠÎÒœ¡ÈêZÝ‘üAº©Wqs$˜8úöÔ¥—Y¶îqd¬B\Uc ޼êKŽèÎ_ØÞš›¥Œ¹¿2(ûTÝLN¬Ž÷xFtIhÁ§3Õˆ™®U‰ÞP)+c°ì/U3~ƒ rã–ö}»Lïݸ¦·Éо.±7LLô›÷Ñ×LV½0n÷`&éa -P™âD†Ö¶t›AèúMpò&Å;û¸MPê øÖ*È9ï^ç¤Òðq²Ñî$ˆÌ}ω-ìh¬z†K‰)²JPZ²6ÛqEݶ¿º;®­.Èpޭ׍¸Ô×Ìlî¬$ö½:Ù“eå{Ó…6WP/P£W¬àÈdn…®Ã?È"ª hYþ^~lá‚2TƒDÛҦ˪ûo\ªR³3Õ­Y¤bqx¾]w̨¥+ú²PµSw*ò^¶$z'¥KãþZé¾VbÞ¹NfA+[ŸØÉÀ•ª2Êôœ5ÝjÊwf¾¼–bF¨’ZªÙÔ{é]Kx†Æªz54†‹â’Œºt‰3éñ«ßñ ™ë¸~Ç‡é…ØîlL!IŸ*Ö—{ÿúÊÍjÒNe¥ŠäEN ¾Gê½e+/¿]¾éIäš÷*™’h3¢\~Œ“,Uö‰.‡bn¿.—YÐGåkדg;Ç^ÇÖx1 3 S$ÎFÕ*”ŒÑ­ý‰¨ë¶…³aÒñ–` 3nÚZ1ÏÓnï¤]r¢G¨ID¯}Ñ—H÷N‹GrŒß.–*©^Öh¤ÌÎicÅ´$rËC‚?3K×¢§è !3™”vF=LU4/ú•ίVôš‰ß«õ)WÙƒåª-œ¥ Æêúcb×ÕfúFLoS;£º-¥à`ÏÿÒCÉ—Ã<€O‘Nö†n›üaº;SWûŸ£!®Ù»¨èŠ™FW÷UAÆ—L÷íAÈ)³<ŠóhË(ÀïY÷™åQ¸|54¶gyH0سOº¡wUmkQE•€(b¤"”·Y°0e÷v|’ªkIèx+ë1ÜÙçÂ…5îÂ{R“ZÙñÝf>£‘À ó“´“/æ=öM¾ üxl$xR‹º/{{ñö|cÁ96†\h~l-'glÃÀ“âÙ, úOú†0À'mwPžP¾Æf# #ìîÃ-،ﴯ){ƒ;< c."kp…ëó¸ÏÎ}1„¾eÌ]˜ns¢NWÏ}Íö†.t¦ãa¦Ú=cyzº–ãT+/¢#ùœš“‹—:œãfaУÛö“Qa˜Ò3ȱÃctÇŽß eKŠkê,Î(åcJŒ¼/2R³ PCìy3W–’k„…œ s3ªyQhQñÙáë ûA„[ÕS«Ù‚hë „CeĨŽëŒHºWÛ¼'àg]Ÿ©# &é÷À{+ÞÂyŒ&ˆQH xEäd/*Ò·'e`1¯ð˜Ì‘é›] tÏÅ»IÏÒ]XP¯ºLàx+jŸ8¢äîºÚôé™bDŒÒ7CeU5Íð7Â1f¤ò,nÉÞí©aoíåzÇ4¤„Ï€íbIB¹^\F—·Â½ˆR#Â#\ü)þ‹d™œ4¿ŽO ðEÜ<^û 2¶6ô—™óm9ZÿzwcW¢Kåýµ„o»M¬ÑPÄžŠA´Ï@¾÷ ­ã®ùµÆöö9œ1 ¬£ù>óÄ9[Åð€4pQ¬-ŒÃàÙà7AP™YG/_È–%¸óŸ›w;ÇC’@x180±ãçn ^ñ Ž‚ ö©ak.Œ7‹ÉFXÏö¡ f³ø‰a)c£º’Ë̼™¤¿“ÑWYýãññða [š endstream endobj 3099 0 obj 4784 endobj 3103 0 obj [132 /XYZ 31.5000000 429.500000 0] endobj 3104 0 obj [132 /XYZ 32.2500000 428 0] endobj 3105 0 obj [132 /XYZ 31.5000000 582.500000 0] endobj 3106 0 obj [132 /XYZ 32.2500000 581.750000 0] endobj 3107 0 obj << /Type /Annot /Subtype /Link /Rect [194.250000 464.750000 257.250000 471.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Preprocessor_condition_compilation >> endobj 3102 0 obj << /Type /Page /Parent 2 0 R /Contents 3108 0 R /Resources 3110 0 R /Annots 3111 0 R /MediaBox [0 0 595 842] >> endobj 3110 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R /F1700 1700 0 R >> /XObject << >> >> endobj 3111 0 obj [ 3107 0 R ] endobj 3108 0 obj << /Length 3109 0 R /Filter /FlateDecode >> stream xœí]KÜÆ¾ï¯˜sؾ€ €«9$ #‡À޶Ňüýp–äh—äWdSÝäpi%’¼4ÙÕÕõêz¾ùóçœþõûéÍûÏÿ9ýÐýùþóCv.ó¬ýçtùõÝóØêÜýýTVùé‡_¾ž¾>|zøÔüþõ¡}áóû¿6ûßÉžþÒüÿçÓ÷o~øc÷]þƒ_JS6þòôg]šæoÙõÏËÏÿýð·?œ~»|±_®æå¿gleJ{cfé¯ý6Íӝ߸íáM‹€°Ul^8ïOÆ»æ·ÚÛÓÿùðS³@ÿùì\{cÊ—Ù- 5¿7+Ùª>[7«~´ÐÓ/Ï›ÏsïãO«cŸÂÈ_×<ÜÂõØ/c èÛç#|¼Ê"~ü ru¬ô‡‹¿~®Šîøwríê²pmªFl4¿Å•uíb’Õ·Ïë¼4E¼·G#+üõ¸dU:[& «Ò—y{4®®#œüõó1Ȫ*#ÒìäêXéÈJøú¹òÎ¸ÒæþrЗCΫÊ6/]÷ÏmûªmQŽ<û¼þÇíïã-ä±äˆðuEn®LU¶ªóè¿~=ÆÙ6ÿïãOk#¥;ÚÑÇ?…|CÒþÜ|¾ /¾ûòðæ£ñS®8}ù©­]óé/ JòÓw—ëNYž¾üxúc–¹:}ùù¡>6ïAlŸd=±oá;=1|ç|ò¾ŽƒOl ¿f¡Æ_s|âá:øI ¡~aƒO>Hj|>ê¬Ú\ Áã—F(DççF9ÎR>-HËbQØ7æ@ˆ_›ë¼Çb¹Aà-å {“ßpÂÌA^BÌ Ü e¹ /áiy¨ „ÚÒŠ‘ÿXo |e_†wŠ÷qJbã2ØqX3rãë l£`m"X<0]cùäê„RÈù$ŠûÒÜ­±jmú3Æ6ËÜ“$ææ¾­+,{rFoA©„uÐâíÕXæ)$&b2ŸµLVõâÒõˆ*‹ü ž¡!Q«:{ù$kbwÎ}Q•ùø@ª!eû³wm\÷~ü|k%ägg+óòIÞéîÕ;œZØÂ'ûÂïŒ>/|¤$NÅ£…Y¼¯Ž?«%ô¡}äãrà.0Yà¯wŽi+#(.lÛ'Æôç´àk˜0 ü…‡ÙO9ã ñ@„SÇôŽé.l>Àu0E¾ GвàÀˆÄ$ƒ C@œÂX$Ïm0¢ÞËM9P|)@º5­Ð0®goâÓº*·EV½Œ>?ú¦8¬qI{üµÈVÎN¤£wiäYç5Ù¹(ÍKåH°QçP™Â¦LÅo‡È¡¦S e`Ù1Ëàœžø 3*„×UÅcèÏ®Qš®á r-KZù‰™Š±Ë¡¥@©8Ëe|>MU ëÒ£M‘œŒÓb->SH;žxÂp½€†â17‰ÆLz´°B³V¶Uñ ‘ Ó·ž ]Úzþ„uŸ`Í‚ímL/X¦aZ&ŠN„HcIÏÑW7œIÊ”÷²(ÕW T¾7ëתSÑQì„Hæb¥r=æ²3bª ã‡ô±<Ö¹^ÊYZ ‡BêrôÄäjø„Ò¨˜0ñ‘ΠœJÃŒ\C˜&ãˆK…8gR_;‡þþ:Ìæç¬v/!€Å\7¶´‚¸¹ T^CÖlû7|£ë¨ª,†:Š‘}ºΔ àceRÃRÓC)ºµ<ÊçøÒ…1ª*ÔÔ˜rFÁ-Tζ!ˆ»pçtQJ£Ø&Qæ8NÔcÒ0„.'Z RHÅoäBŠõ/ѯ¸½_°0óç¾Óò"ŠŠÖ—…©Ò©¢š®“7§Ö4•ìZÿŒE)hO†¨”eT0aRP;TÒÂSU´6Ó” {ð;½?Ø ýøI‚Dd[ tâ}ÖñéÕU'ë'k-Í¢êì9{Æ¿t™èIG Å¹Ët~ÆÏ|§FïthüyTõ}­Ëî›x'ÃP·GeÍí6|.·(l§-ÞÊs] ßy×éÃ,cr…ëàöŒ=±N¡6êŽÉ¦èã ®#œÆ(† ž)Æh—_DUjŒk 5„M€Ÿ6¦x©ZŒÕùM-ƘàÁè„•cI¬_%Ä“Kodÿ0½¤ÍÉÜcìa•9ËËýÏ$sYP¹t1õ“„%Km¨õvJ02ÕM÷RB8ô™8¤ Jp 3• 4Âg7õRâJ‹_*iTHßlnc¢•{“8ú&@!0Ý™øq‚©?!mATƒ>÷mïèö§ÔÍùĪÇ.Š4¢V©»LôgZã#ÀjM”¿'ØÀËe-Ý7§R‘ÈÑÕ•éô46aìhxÖ8CHcØ>UÆÕÞm*•‘7 ø˜Ê~–†rÒŸjD" ¿€…ùt¤˜m!]58EÀp æU¢Í™r«-VQBXþhx”Þ¤‡A4äûì¹.ü6OøÚNŒ0¦pH•ò×ï\¥•ðÔñw;(·ÁY‡*ùˆñŠ#¢þ,|>Пº*‰:ÂÄ®’Õx½éÚš•™½N;ÅÍQT›7á†B ÕöL³ avY¢¦ ¸9 nDc`ÓÜž¥k¾‘†úü-“X_O#>†Ê™¦bÊÍt˜&D‰¸%k.‡>­N½TsEܪË[| x,q õâuˆM³‹0/¤‘·ÅÕ­Û´“# a Öö¸›’ËãæM)-„ÊÍÓËa!BB i”è°ÜÀ`…àæ—‡F!ŸLÖ·WÖ¨sº)Íîì-MŸÆ–Џ#¦EÕv¸º>ÙÇìMòw©ïÚ¢LÃÏ~ž7H™Ùõs7ƒè!÷ÒÔ½“)UY‡îМÈ_¨ÌKÕ![»Ëb È$eûGA%"ß)`è3t/yÞXäÚ")”Â=3’—¨,ë±ú¤ž ~óBð·?Y¤1L€Æðv 2p­:Ós„J¦MÔE¹ó7&‹†êM¶ÑØÕÂiéÕŒéõBvOTWœ/ïÿúPóü¿<|l 8ÆSÑÖò?gkc­~ÓTSÑTeÀ÷”ƒÆ¤8©!XTè [H`]ÎÊ…ŠMmc–“˜r(D2¢0Aã*+ÕF`L^Ÿrk˜å‚”*[Ñ–`j/¯@Ü@Ó="IQŒI4ÕðØD©§º}çBÚ²a]?ÊêÔ­6ffsÜU™îÜ5¾£ÏškvÃήÌh鯸³$í_ì£wf Ú©\sXqMg¯ƒß)àü„­ rNo=#¦0 q!肊SEÑ9ÑTù€Ž’Õz'`€›Dw©~AwOüÎQø*â`g>Ä¡½rM‰n1bL« *‡:íèe°Ü^ÓªÖÑí'·z™ãî$Æ(*PíCÉ•Tî|ãÂPšnoo Þ¦+„™:3uq×ÙÃQ›UÓF~Ì5+«¡ÌÃU#bÌ º&&òÛÝU *EwFAžô•bâ$¬¦êâp‡Ëâ9ñj݆£Pâ(”1úÚ %ð¼HÁTC(Jgª—ºIk1š¡›^bªq{ý®UþD}b03„B™€G@¼‡8À£&Ñf45H€yŽs0ʜƆcÇ zëœZxSÍ€˜ÙÛlÈÍxd 3F±À'ñÏ—°G|äðkp¨ °|d¤Ähw>ñÁ®¸ö$J”Á'´+c¼¸¥þëm‹¦’ÈŸÌKÌTF¼âY)ë{6Ïž{€Y›ÉþZëUZºS"8.¯o—b )ÇûÊ/SÉxV"°þ cÝšª.?!Ú4 „™ šné.ø¥&ªã º3¹tãþ”Ý«Ê6”†ØÁû¡Â20vK©>•Œ ÍÅ(‹¥²Ð¨~’ÄàˆS7•”¼O³u{¦ë¢;µ;©ho¢Îr»s°¦îvF¸çtä–$þçCåÈX8Ë]Ò”tdRW#ÊTUdªcgË$Ó1®èÈåJ‰îbÉ2(TXn”5>r-§ÚhäÖÞ£`ÁùæŸJ<¬ì½‹™±_WCµå›ƒêí_ÅÂNEƒû¿±F.ÇJ”F¹[™jß^–Tl|h„ðF¢êØõÍ÷ä6˜Ýqç`žßrdºv SµÈßocfgØvïÒØ¦:e«¶ºØte‘ŠÀR©=%R/nðËÄÚ†ò•[µ<šªÒÈ” I{d2Xuƒt‰Ø5<•_iaÁb&ÙáL€´²?¦§µö‹- ¦P–ŠÓUî«mÓð_÷æyÃ8—Eh¦7‰nv(“÷°ü’âDÄGÊXûD‰}²!šŒí¤Úi"Q&Ó_uºüzÔ•  .‡ª«IÆó¸úìÕõ=¶‚ñÆèf¬õ>Š~”™±¶±e……i'•(7Æ?jIabGÙæIäYßjúMì€tgàYרã'>¸S<÷ÁÃÓö6<÷Ïc€ëtcÒP¹-çÏOöÀœñž r8#C >‚7u§›àÉÂNá×Âx Þte–BÂäÈgXr “WT'ðìí|ðNs¨°Äg°3;Ë&„ô}î‰ ±Õ*ÀSùYx¨9Dª_cèj±Èúî óAvaÞÀR ÎÇ¢0å!q¹JÙ Øö…Êêuî™§$kgÏQÀÃÃbû…Á/cÝaí„!ÀÜÄÐ?e à u µSQÄá:L±‚#¬¦BŸr,¥ž(ëyÞRÝ·`18¬[°GhÆsÀh*ü„™š™ê|0©p ÈKÌPöa[ÏŸvšÐ®.êjW‰ø9ÕÔX¼Î!Q¶-QÖ—®ŽëCÞn_Þ–æϳ.7mÙ¯¨k!cßpŸÇ÷“Á÷@ÌM‡ÎÙ´Î9¸äÐ,w¡Y®Õ¢©4 CI‚e…e “;€}»Ø¿‡%>† Xo=¤Ð¡«_—®Þ×¼}X)- *‚ˆs)=GÐÅØ!$¹­ÅöþÖ­¹kª7eÍÁì’##ÑØúúpý“;äífd@éçq¥ݧ¬$ˆE![!‘½!È ÝÌ,Q˜LÐR5 ÅÖ¨ü.íe%AI)³u*co8á”·ræåªkc.¿®š w¦…Põ&)UNŒùvky__õìfŠ2,?ÖY«'Õ#‰è»3*›N©id ŸUÚí$*(=ºÔn’¬SMÄ5ìî‘€šhïtLÖ’Þ™­NÐzü›ÞÜbÓÂ×2t‹êP±þ•ñ‰ë÷?ÙU‡Ù¸¦冿6s[ÌðyŸÞ’˜ý¸}1ä[îG˜$³“a¢v·1#ô&2Þuo‘BG%ft䜣@6ÝMg¸”]T꼯’еI³‡²Š²‡YoešÝÕ}ö‘rd $¦¾ê¢ò:xÒÆ{ÓìÎÝb¹Tº*Íýž©´tw»;9RÓÜ®Mܰ}„o¹Ø&Ýþ(Áøm1lª7{ð*7&ÖíɼZ7M¦¿î8“Š|ÄÒ&‘WOeº}œ·3ÅOð&©-uµÇ ºX;PB/V¦ƒ,&WÌu‡¾è¾–©Än‰1g©á ôšJ^xK6-ÁÜÉ"ÎÜ€iŽÃº†|eê¡#b„LÌžÉÿ¡ì@[AE‡¯Bô0Ô!(3¸Õ]‡ŸQ¡Ä¤-JYh’u†H`\0naªiJ±™-rŸ¸é¸*œ„„ñ­Û<÷)õ7_¦˜ •ÀÇç¯ÛÖJ©šÍÐbuæoÆÌypvxˆËåð]åw1A}jjß–çÇÆ5gÖÒ£|O4V‡rV0Ž2fØ¥ªC8y’ïΊ"t²pU,mÞÅQY1PgÔLf\çùñ:&uæ*²Z” ª&æ°‰A¯ÊÓNùÔð°KʈV­§š²Y¸½2«°»ìMíªW Â:9\C=¼eX9HlsÆaHvG¼#i Ôd8üŽ]Ž.$aëÄÙvÙS&.žsÈ 4È8´Ñ]ü&+‡7yAˆÕK]3ƒ Ü*‚?b7BïÜ—¿ØS5á&•)AøcËA5pÁxÑ|¢^ •)ÊY0tQ ÊŽfê^r%`wJüGw‹˜9ˆë¬¯lòbh¡4Á¹Ï4Ñ­cª¯¡Oo3i9;áœMùŸUl«åÎ7ÊœXŸÊ†¸N?Uj†jœ'¹‡øS¶r‚1}¯u5PM;5ªƒì—Ã*ž’„¾ë&YËtÝ"ì ÆPÄiÖòD$,]¯¬½RðêÃØñÀ]!ÓgíâÁƒªM¤„Mwø Ó’—Â(Ô !ÀM¤ñà{f°ÐP4ƒOðHœ%ŽGâFÚoÃÆ´¤ÞÂùʺ[[,k˜:X£ ð3!í˜?ÌHra§ÄØoŒkÌ›·µX]KuwÙJ`oç£;†ÁÎ&Ú`WÍÿæ%ö³BóëôµYX„ëÓܰàbYMíšÛ[f.íO¶oÑ…e§îA-Ë c¶¥%{¶íåmÄiÅøI‡{îÚK?;côÿ€Öqs^€)Ø>v;u¸î$.v™ù¡ ‚£åÅxƒSN}¾œ¹}LlÃà¯Áwº{‰ ÚzùlY‚»ü½ø¥@›ºQa¬B°8=’€ëñÝþüù3ßGÄxaƒø+H{½bt ë`ŽÁ‚á?ˆQƒOáf|>ÔPa¨…ÓÆ„Îà º]•™;wúëVaÔ=é4ùœ?}zø?$7² endstream endobj 3109 0 obj 5937 endobj 3113 0 obj [133 /XYZ 31.5000000 278 0] endobj 3114 0 obj [133 /XYZ 32.2500000 277.250000 0] endobj 3115 0 obj << /Type /Annot /Subtype /Link /Rect [134.250000 528.500000 165 535.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_exception >> endobj 3112 0 obj << /Type /Page /Parent 2 0 R /Contents 3116 0 R /Resources 3118 0 R /Annots 3119 0 R /MediaBox [0 0 595 842] >> endobj 3118 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1409 1409 0 R /F8 8 0 R /F1700 1700 0 R >> /XObject << >> >> endobj 3119 0 obj [ 3115 0 R ] endobj 3116 0 obj << /Length 3117 0 R /Filter /FlateDecode >> stream xœí]IÜÆ¾÷¯ès·Y 7  i¬9$ ‡ ‡ÀŽ–%‡üýôBöÌû{d}ýªHöЂ­±J¬åÕÛ·úþŸÿ¾ÿç÷ßøüïýÝï>ïŠC]—ö§_ß½üÛºŸ÷uSîüºû¶ÿ¶û´ûtüï·ÝåƒÏþ|üé{»ÿÓñß_öýÛñêþÒé/|ÝÕ¦>þþëù÷¶6ÇŸŠëï§?ÿ×î/¿Ûÿvš±_®ÛÌëÿÿÎØÖxwÚÆÈÒßvý1Íù×üm÷ýq«Ø²±Mµ?þ¿ß›ÖÛýþ±ûù¸@?}qh¼3®¶¥?þÜV¾.ʦ±ÇŸk×ýÃ.^ÛÓêÎ÷oÛ#ü«ÁÚç_:³›“·UÂÉO;׊q•'?´Þ˜útË÷ ÕåÞ7xŽÿêèyú“W®N7ùyçêPéïÏ®y¹UÓv:2€ð¿NŸ`ò&%S8ï\*ýåâÙ5/·mzÒªS€èyzýÉ[S&d ç«C¥¿\<{b!ÜZS$dÕ/¦O0¹kÓ±ŠËÎS±jaöÔ^u:­ëyöWrTXN~Úy"­ O~hªîø3¹tsZ·:žÍxsü9¥ÔhkßÝzY'¸™ëì)®½)\ºÉÏ;×JSpòÔ¤)Ë„·}=Å…´&þwÙyªÛ†“ëÑqUîJÇúz1}ŠÉ«t’§Û¹:T.w{cöO1³à­\þx’¾ ¾ÿ²ûþãQ·ªö_~>îì²àù·/_wþø?'GBaö_~Úÿþ¸ÿ‡ý—_vþàÝŽvú{çÛžGšCÓ•-_ŒŽÔpä\ç2bÌ¡ôUs̾eàuÜå›ç?¨Ð$Æ«.\žG\á#M¸%<Éç‘òàlc^o¶Ð¼ h0¸0PðÑáÞ¼ƒ0˜‡0 ð-À½§9[jüU8«1žâzdrâÍæL°°¿Â_ŽÌþ>>m|Xu]^XõQ¼¬Z^6ØÎû~ <â±pÄùŒ§«]†2þt̹õN7"c½mzP¿GS3–Šóó ÿÔI‚ª65cîéNà' }céé[8!¥„óà([1 äÐï&ð@ÀQˆø¤öcÈÞ#Dƒ†|Á€3˜ž‘ŽgßÓ3âKW96‹uVLFæÓ¥=Þ,Ö3sÑ”âæhå¾–7©» ƒ-†;ª"Vb[Ë<d~ASŠÖÕéAFUaS–mnÄžœØUôŽœ6£oz÷^Gñ7ì ŽvnX8­*ÓÆÛhïí#ùÎæá7pÄÁ½ïá<©©ãw`‰o²Ý)\ÃÚC¸¹wð›pãn€- &ð<†5ü†ñ~àÙ,Ä^¼ëNÂÄÁãœmÔgwÛïóñÛã¥ÚãBSƒIÃJ ûðyÚŒøbÚ;ð…âp¶%ßVÖ;qÍw²d( tO|Ã`_á†÷ö`’*+.—õ=òèÁ8;ƒåsR|R8¢KMöáh¦&x øN™ûÑ•gåSb†lŽö¬ŽöÚ›Ñý<Z§² G{]Màòoò›#ls„É\~sî“Îýep»úž°â椓èy½Nººí›ÙœtMÙWõ¸^á©«òµ­¯œI8¨üeä–O(_ö†=!Ыa4ar7©Ñh¶’Ô…¦ê DiHd1|*!_°­½}ê8¯-ö5õž ‘ ^høÍ zTàʬ'xñál‚ozñg­yq.À'ª—L,{UH÷¡œ.¦rŽh4 ̆KÜñÞð:™ªßYŽ÷†Ñ2Á,’­*Û€&7krÞBôº³&I]} Ó Áуgc˜0#d“‹¸¦ªƒËÛ*½Äà›g*ʘÊèˆZp ݸæ@…MÁ [³f „næì¼æ¬±uò3Ý K¦‹?¡Ç(+ )ÄT/bë^/¹€Nø/¥5°NéËÌ&p"LŒ×ïY2DqPˆÁo•vèicïL ADÊób;iµ=_UP²0¿Ø–É%dS†"2½ÏµiÇÄ²à‹ŽD>/½¬äãä^¤l'\g ít£Ò-ð:‰}¼*eè¦éúDeÒŠrˆˆ¦/u ™òC—º4}©K{W™W&SºGÍ@äÍæv‹ L¶ðòrFçÖ[{‹:ôrÌ©Pšb¨Ým²m“mWü°Æø±9»gvv; H6é¢.ăl% Œèߋݚñ%¶9œ$B‡PÍCš-§ƒyZ[7 ´µHå®k‘ÊáAâ¶‚FÄTÒäª%ïPs˜Ÿ(d*c´{Íx˜ÓHA4ƒ%RY"‰I‚3¹ºê´þÚÈ'SW«n\u·Áש ÃÓëÆÉ×”é¼Î"/Ý ‹/‹Ë!Gg’”…¬r¬ƒè¦ÀçOÙ- HGÝÄ/ÊRŠ(wfØ1Ö1@ÖJ={Ϥ-CÂrPt«V5 þìŠH‡×•7HDœ<Ô)'Ex:¨ÜšÁN˜’öU½•1½ÿƒ€S™” Šû¤í BÝFD„Ww’¼L„M°ÑŽsåF'&UÝV-‚ÈÕí}Ë„*Ç÷¹g³SÀÖün œòù «þ5X\ŽNõ‰KÜÈèa1gr”€[Øç@AÀ¸X´Í7ƤNüG^"y…—?™„=&¦óŒ °§{yËøƒ ÕÓS…".Qו;J£WJ¼ÀÒ ayÉ"Íáôý׫ʗðëî³@«iˆü´…€È×QÙîšpã‡Ñ0Y¨¬×'Dè:ê¶t{1U±o¦9c”PföDBI“Ö‰r{¼ÃÏ}”>K$" é†0A§â'øFŸìJÙ\ÛµÓ%Á:mˆŒd¦¾HÕÇ’ñÕß¶°æ­Tò÷ìÞ\FtÜkgß2¾ÂÚ~ŽAÈ[ü:0>wÎÓ•÷¼¢‡‹V0^ ø»P¡8Šuðê\ñéêfƒ¯®óQj6ø&1Ë7¹'½¼*È FääŠm=ºŠž!ä…ò^‚2”GxD8)ÆKLMøü†)Áí”5ŽLpè CkCùÞWmÍiô¥¤Ë³ª+ÇuÂL¦Ö´*ÏYj ’ý¢šËI%ckôVÍ8Ùê¿¶JtÒ\• o7÷-q<‡Â;Õ‚gÆ9GÖTÊœuW…rŸ€‰|19\ºÑ}ݲ‚ùû´ä-çR¨b2ê˜è\^ò»3 >H‰×Í3Þ"¢Ù¢ÏxTƒBLâªçɲ>x"6Êû&ø Kð¾1Ág‚ýFØcýÀø<„gÄ0^ì3Áž[ìÅß1Ïã!Dñ7 DÄw°·ï {{ñ¶(g¶(§àùÅÅçÁ´€½‘ø~0îà<½º»VŽ£`‹ïK Ffá]±j|R‡%-·`î߯xL?x×w1AŽoRí§²›öó|Ò2¬Þ´mˆ2']²dÑß Ùð¶1 ÔÈH0¼Ãw|ÛXÇäΈÂ#x6|s™8“›$P0#‘™ü|Û0ú¨¶ …ñŒÎØÄIM“·ÇòhYÇËUÚT>ã©Ó ²Ü£+–ž»ëÌ=¹»‹yž"‰o6Ÿç³Ê™WæÜ–A=IOÚ2¨· j‘j"›Ê-ƒz^nÔo,ƒÚÕúÔ#ËÞ]Íœ}ÌôÌ óN„|œÁAôqe¡÷ÞcÊx©”Õ4u¾Á¼®) `øèÖÿr ضàI ç%–”²¤v0aØÎ!cº9+¿iôh--¶6‡wU©öMÜü4×CìÊ Ãôg怹ú¾.••KÏû2àæs>@ÚT>4T’˳¦jÂ5§§Ñ ŠLÿ" J¨Ò2Õþû¹:¹¶þ¹×®³()UmŽžº?¼2êùˆ\ \g¡•é®ÅôùŒx¶DÃÐHØSàó¶ªbš“ÏÛ¦ I鈬[ð§«1åvŒ­ø zz^2c kïCdŒîcS¸„ðAžbPy~tÁ¦µP(ˆRBHQb’©6ǰaÙÁ‚2é¦K®çUö}2ºáxf[㇄–'<zšÊ‹ã«r ¤¨­3¡v—)®Âü9æâWÙf‡jRÆ &ÞùTé 5§.å~Eª-¨…uæRäVÕyl¶®(«nF”ÁƒØÔ´Ó6S}å/¥€.°¬³ÛÈ|ÏŸêÒ¹êÑ“û’?NV›rvx)}ˆ¨ìàG«q:¼Àêç­Æ™¬qÆx ÚáE·ZFÀ*U¼V®¿`*eu«…‰ÚÉ­–H;c\àÊDÏ!7~ö:âU×ÝFeÚ R†à‰¬Ç¨>&óüºÊ¦ÉrwÓW– ¯©à…{[t®?ƻ彻˜ÇrÒZ[þòöóK™0c’«¯l°› ¹Œ]šï‹55â‹T?üLA’ù¢@*w˜äªvTM ¤’²á”¶ÎZ¯¸¥Ù[‹RÍ%Gªª®¯¼»Þ·€b>¢‘CU^Ü3ÁÙ:këÆ7?×´‡¶9ôüÍÆ÷…ÿÆlþÖýdÙv㛎þo}c!tz{| ¼mvÏÓ©Ö ©Þ‚ë`jF‚YïC ƒ»éM§áÙº>k· …±Âß"^ǨAjÄ’¬‹¾õ˜%Æ<åÂ$»éŽ[Ý×}u_x¦Ð(¢VlvyÎ$0«4R¡ì¸A5Ë\At‹²õÓaðžTHògz$au˜¸…Ñêٔ⦭yCi¨„ßkþÇË”ÍÅÓOõèº>˜¿¤’ú™ìÔAŠ+QàûØp=Ðß®ÃÒÒT:h'¨2=Ý,VFû\ÍS{Ã(ÊûVR¦™W&4¬e¡Ëzˆƒ{ÚjªåÑ1ú uSõR3ˆñðeÚ‰ûPÕÌ+L/Èà4³5Ä"UÍC žS ?; ŸÙÔ»±¢JÕ+õ/¨Ôaªv$DÃ0Á‚cº«êŒ“I+ÓmàÄ´‰Ëe<,±j™ðçS½«Í”к×n…Ò–r§—feiBq¶¹c¦ÜÌtQKu:XJ“Úµûë”ûuÌüÜp˜¦V‚_‘oó7à£MK’ʾG…€™3Œ›±AÝ\÷Ô‚¥ÔÃÃp—ëæ:S‡Kpi´ÃO3…Öº†x¸ÈRnÞ©‡;ðÖ¸h:WâVãÊ×WuCÌS¦é&É= î'8ýL^/‘ @™?¹r›u]™ZÇ.PÅxüðÅôʃ%så‚ÈpíôX‚®¦©ü Xz¿ŒiC¸ª˜1“ªñ°J.[Mã­*e35Â㘶cÜlò'§mØ4}Š‹…Ö32¿m(ظýÓ¾6&Àë0vž°kÜnLµ¶Ù²”°êuÛ]à½ZšéíÉÖ÷SŽÉmÕí¸0÷$B&‰­Æ\]ä©Ä •w˜æ‚M\å‚-ÕºMõ\€êyº%î$aë@dö'>^§¶¾8ÞòÏ)ÍhoxPâû˜u{ÌDÎV—´ÐŠ>¢ª®ÖáƒVTKHkµkCH1È!Ã<«Ãd—LO–¤^üÖ0S>šl}p‰ÙjÁÁœÁË䓨êÕX4$~fLÙ+Ë$ŶUò;úÍòÌ*õ²ð­ÀdÚØÂ-òˆüÍÙS×Ý~%[c›%=•hœ iâ[¼ƒfð¼^{UmÕRJ5*9LÓA [”µh+|z~;å“c*Õû> endobj 3120 0 obj << /Type /Page /Parent 2 0 R /Contents 3122 0 R /Resources 3124 0 R /Annots 3125 0 R /MediaBox [0 0 595 842] >> endobj 3124 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R >> /XObject << >> >> endobj 3125 0 obj [ 3121 0 R ] endobj 3122 0 obj << /Length 3123 0 R /Filter /FlateDecode >> stream xœí]IÜÆ¾÷¯ès·já ´9@ ÈÁÈ!°ã†eDñ!?½=3d¯Y_¿*V÷T„DÊÔ°X|õöõÍŸ?ÿcû¯ß·oÞþÏöÇáï÷Ÿ7f×ÖæôŸíáÏwÏàºÝðïmÛÕÛ¿n¾m¿m>m>íÿ÷ÛæôÀç÷Ýÿë[·ýËþ¿¿løûþ‡? ¿tø…¯›Ö¶û¿=þÝ·vÿ/sþûðóoþö‡ío‡Ç× ‡yùÿ¿³ÞX[ŽqåÕß6ãgÚãŸßüm󿀰·¸Æ8×mmå«­í+·ýï?7?ï_0nov}emÛT­¹åE­;¼Éøvk]o¶õ6ÓÿèlcóÆDÜüxru¨XßXywÍËmê~¼ÜàwþÖÖçprm ŒW 7×¼ÙÎùÂæ¶îâm~<¹:T†Ëv×¼\gmDÊ}¶}„Í}qóãÉcQ®°»æåV]“rŸ¶°ù^댷ùñäÑ(ï®y¹M;È­Ö41à߯‹Î·ÙòñäêP/w¶û§]ðQN?æÜ7áÁw_6o¾·•Ùã\³ýòóþp§wÿú²J½ýî`Ãí-·/?mÿhŒ­þ´ýò˦ß5®c¥2hŽ…»}V|W,Ü >ãz´b\ø—ºîÖ»'``]Á³ ü >õ{¸âÃoNx\žÁïùñ žÚAìŵ¢ø=ï¿Ô Ç*|jŸñ§g>~Ù3ÆècT9¾‡ÐÁ÷ƒù @¾ùw ©©‹C3Ê+˜÷a9±¯0\Þcìû|îQWoÄ æc_ð <¥±dÌ—1þëÞÃz0þ|?Pk3Pÿ1ž±ž%pUL4·c4½j}+йtõzÆVû :º*t°],à(þâl©8>ÆÞ<ä®·]6ÒUXÁ² ëÛc±m¹7¦̽1wÀzZÊ»÷mâ{ô~]Ý$þ:Fû®°bO…y×êž»œõFLÝ>–¼©²w %OÚÿ}'ü¥¯ ¯xzb\J쩬_ªzôõzìe‡0ż{Ù)ë)øîð ùº„Sc^JèÜŒ'œâÙŒ•© ÁÛLXçB´jæÌ÷PN]ÜÁ6<æ¾¹{Üy ¼tK‹ÒõwÏ~LêFÏ~J™\»Ñ¶5u8ç0óHx«5ö0c¼"|µÆ1_ŠÏÆPÆEÈqkø ^aü¡L|Dn˜Ã·€wÃòHø,÷°æJx¾ð—*[ôŒVP'äBÕèƒZß2`4µT9 ëûw+ìƒ7‡ýc8Ò&p;ÕÝ*Ìíˆ2†Ž 1^ã/en>\Á»a<(Ve±*‹U¹H6·xw± ä Ž¿~Ddý\朳³ÎK&p´&2ì5 ýdᣯ»1n¢ç@¯¬Ìñ•ï_~¨5»¦µ][Ϙwµ«ü©ÃÂTµ~ç]gݳg…©Ûu½9ÂtŠ¢~··¯™]Ü…÷ †É…g@ÕãfJÖ… bêÒ3 <5þƒOРæà uòÒ à{ð- L¹[rX|$ˆî´›µã҂݆ú¢Ž9ãìWhá;öÓ÷Að¹Ž9†c~µ¢÷Ž`ƒ»bVâÄ„&@ ÃïÏ&€ ’ú G„¡ÛûècRO"ãáXìrY’€>Ì…cF ys-º€¤xü€_%ÄÍ-ò@ø>ˆÞÆ`¶ò!\8ÇmS/=›€(X½Êü«XuÁèHøžêc:-¾éÇšíõ=Û©r^‹´ø‹o…[6¾Á0ÜÁÐ!VRäz^ñ´Uû’ül½3½É”uõ!B9O¬‚½gf^1¦f2À̤ÅÊ<6¯°öáÚNªR>–è4‚2‘Wðc0Ž´`¥7®bäÝ”]\WDä]~o¿¾<ÍUÄ‹ žýA–‚gHi‹ ž¦ O˜ÝŸdâ;7Ìô«ç¤BøxÏcŒ©:g€ð= ?$Ø:s ‚ä\î¾¥@WîS®úŒÕ$]=†qžà –¶‚ÆÅn"Laëßö³/wý3 •˜֤欞ˆDâg°1ïÁ “v<µ Ô®jY ^ÀkÅ1b¼R9Hî*h¤Acº–¨2«P½l*(ÈìFhÂ%'Ö f…5ý”×4»¬µÝTÅ&äãUm22PíÌõµ¦±fm=½c&b¨l `*šF†( ¸¦ÁÆ„·s3xT ß8v žOöFFМý$U8a#EH”€Ï¬ìÈêì"Li&NÖ4É,ªnŠ!ëÞ­›Å$dÞ2•rwvuÎûЫ S±Ò8õ; Ô]gX\gÆÞ!CõbIø]5á÷¾Â‰•Œ•:áôSÕÒÿTµ÷y(—É'fð}ù‹ã ÔL\b†(X¡N”Úöàl"¢t;”ÜMÄ[Œ¨å¥›@w¡ÖçѼ…»pÞºqéAX-ƒD­Š”€€ÄäNx?„„€|Ì3°âE0‚˜ ¼.÷•Sn”€3ªV“P1M˜N9¨t]…ŒŸW5lΠ˜2#Õ:‘BÍ1½¦sSqÉpU{G×ÅÊà)uYL‘H¢ª4!JŽé[Å&b"ÞI¤,øèê|Z=ZÁÇ£•ud00 ¬”•,Vr.¡¹O~­ÜHåîÊ•Èêsý"«µeu)Î)°g&+Î,+EVçίX3œïeõyŒL‘ÕEVY}²úÁ`-Œ ÀÔ¸ºöSdµIgW3ãZPV÷~lz”J~PC8ðȈ"ï”Gg-1m–AY9`"ôËâJ0GbFâ0£ÕL¾ë•ð-¡ça™©dCÏpÕ"Csˆd;|ÛE••\)2Ôd-Cõz ,¡çá¬Éd1rE€/¼“"]‹…z„NñØÞ©Ç6g-«ÈP“· ^ò~ªõ¶{iý’…ugŒ;C)2`= >¤ Ã)åmPüD‡©Æ  ÁÊØ±Ò…`….ó @SuÆÓ­kŒßg¹w1Ã@w†`¸n*Ucª^¼¸ˆº6frÚ¼ƒÁ@ohïvé3°[ÞCP!žÎH¼TàJÕæàÕsÒ åE·:™Ç4gÐ9 cM.cÓ¢–c?5Øîj"[~µú!ãm¢B=8Ñãó†VÅZUùËG'¬à¶¦íF+™æ—iw<Ù0SÐáìZâÔæ¢aãq¾&>q‚’4'Øš~lžZ¸êrUëÂU6W-¼ó•ñNëÏ} 0þã»Ç<€©Ùab¶e0(4#_f2àÑEó-š/˽3Îq.ºGB¼.Ø«½„-‚³ú3Àøkoñ³–lþ´º^j†Íø+uC?ØŒý¢*Íý‰cH'ý€äŠåó:UA q«UF¡;ÛLVðž aúy›J][M¾úþ&‡KÜM¿øRv Ÿ¹ÁÌŠ:(¾U¸T!v<€=ªœ©§‚‡æˆ€ñ0ˆkѦG4#ûJþeÖù—‘$³I¢ Wç˜é0íª-ÓÒªa.Öõ]f¥ÈíñŠÜø@DªmüÕóè®d@gÅ5]\ÓêôìSÊÚÎE¡Í¬©¶8Þ‹ã} m&¡@oƆI·MPsA/8›Xz— }m%ÍI}ÕNH쩺7NXô—¢¿ÄÒ_îŠVP´ãSÊçz,óXW>_ fWvt ‚6,ÆÌÕé¿3.xÕa™Œ >Õ(ѫѥÕÂZa£±±;G9–Ïâ¤*­U‹ÙC2ˆx˜0Êœ‰m]ûÀ#7yÎ.ì vqúÉ">c"·¦›2š»ê呈'1õË!Y3˜“ƒ@$KÕª>H—‰î¥˜?‘Ÿ“ߊŽDTíÏÝÔUõü¿n> Š@ âp„—”ÍÔY¿ö$­ÆÚ ×/`£Š#ˆÝ)QËmM;•>q»Æ 3×zWÄCã&`H%½¨÷¨jÇB= Éʤ®x˜º¢ÒÍ€j° !è°–1ï³_L¤';¨\Pªï“‹(¼ú¶/¡Pq4-ð9C5¾Æd€#k5íÅ\…R^‰¹º3TG;Ó%8Uàý¾ÜŒ74²rf°É‡ŸQF o£ ümMw¸LQð(¦\H˜ëšB7JnÇ8î®Bž)Q€sSqƳ^õ üꦾüÕÑÊÄ™)± Ǹ°'+àôrøž5¯Û5É—ˆ„¹ê0 NÕƒ0‰E<ËsZKóˆ0~EóˆÚ¹«Tª›Ô$t£ÅÏ‚©’¼‚¹nyAôÐ¥zõ®^þ†Oà°¨Ç0À2—ü$,)©›ä_]ÉJõ¥¥ãS3t«wØʽàm{œÜ‰áƬúÕ}5cŽ"œš(…f&A$åimË®ocn'Â@—Ûáû)Ü®p;}Ÿ`ã«—¯¼ƒ'—;ƒ|€ü²É™`NH—nñ¯FÌú—ýúB7LçÞT?…ÊUJUí΄ZBÆFþSj43ã%¼–ˆ™ÅÌìòéŸDaªñà‚§4  ô–-&w&G3œYÂQZA¥àp&Q³D¥0E$ Q3ã8TZ¤ÒÉtŠås¬• úÁ*(pdŸYašèöy™#F>K%âã›?ŽL2SCÅÔõÜe1îú¼5¶%§+…„— Ó5aº} îÊ2MVPÚÔçN'ÿf…+XÅq+.¨b¬Šetí' ÙºžÜf)šM§ò­6n'gðƒ0â6ÀETÂ&óòéÿðSnÊxßRõµÐM“ìˆbØÂIɦ™ê<ºŽXŠ1¤•Sú’ª«”ªKHðÈÅq9;+˜¢5ªÓ‚ªD½ó)k5QI3å9a–|kš—¼”'W„ÜšD9÷Ìôyá=D>5¨€Ø(äÜã݈±øæp=•k‡sƘQ›¹dÔ¥¡ZWß½z+_] ÔÍ\¥Feⳕ\Ó’k*RÖú¹¦yŒ€mσ›™ÁÍÕr˜žk¸R™pÞiá3‚D%ê(¹‰)Ë‚؃îÇaÙÆ@¿‡Ð…„lïÜi3ùxfŠšp= ¦¬oãx6AžaþŸ1Àt¦{?ŽD'Ü£]â! „ö¢‹‰ŒµÈhI•êÍ)øÀ´ÈZ¬lFï\¶ñmçQƒÙ&..ðu¬×`¾Žñs.Lé˜sCŠSÞcwQM |WKZpRw ö`ÍÓ¾PGØ‹÷é…`tß×ckUøØ·›ñ—>œå–’“žGÖëò'Oð†?½ªN­êo,Ôt5Ga'Õ1ú;]¤‹ßgì” -ÁæÅ_Šo¡ÄN#PmoKìt &½¢ØiéJVb§2^'ŒÏôþÆN1V0]ÉJ´³D;GjªK´óÙJ‰v–h§,7K´ó5E;ÙÅLSáK m9÷iß–é"n—y„´ïï$BêöpÃIï4‘ÈÎ`"}á!)Q»¤ÔíöbþšIe›ëÒ¦'<ñîÚŒ£\íE·'Ãb/.ÑнXìÅ´ñm gcf+V!Ž¡÷ó`vœÀa±m¾º¥ÏLÅÊÜbu¦i‹Åº„ßæm±:Ó57ÜIJ‹Õšú†“–œ^.:ÎhìT^¶>ñ îo€¥¨ªÝ”/¶®Zƒ›ó„MÕü7Kd;LŽãÇ[¾ƒl­K+ç´t‚÷a]\ÐÛ0O‚³‰2Žê+¡#3³;IGäN ´ÍP03‹t}¾Ãœc>õµlÉ£ÌÙÿÙ~Û Qö|ºö )v—“·~g졉ßö,î{©ÿÚ ãÚ -¹Ntâvî8p@ÜD÷P»ðïŸÔ ôéíÚ²wø·y*ŠÄí1T1 `8@ÄÒ…;°#àÉ@¸×ðx{ëã©@ˆð™¡áâ3rÃm6áañb ïén'ƒÖøÝÀBo¥÷B˜\$ÛO›ÿs²¨ endstream endobj 3123 0 obj 4838 endobj 3127 0 obj [135 /XYZ 32.2500000 330.500000 0] endobj 3128 0 obj [135 /XYZ 31.5000000 366.500000 0] endobj 3129 0 obj [135 /XYZ 31.5000000 331.250000 0] endobj 3130 0 obj [135 /XYZ 32.2500000 365 0] endobj 3131 0 obj << /Type /Annot /Subtype /Link /Rect [417 338.750000 461.250000 345.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_nn5 >> endobj 3126 0 obj << /Type /Page /Parent 2 0 R /Contents 3132 0 R /Resources 3134 0 R /Annots 3135 0 R /MediaBox [0 0 595 842] >> endobj 3134 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 3135 0 obj [ 3131 0 R ] endobj 3132 0 obj << /Length 3133 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯ès·Å‡^@ÀcäÀ°9Þl‚Åî"Îò÷£nI=c©¿Róë"%uËFbïÐ"‹Åz³ªøöÏŸÿ±ÿ×ïû·ï?ÿgÿµûóýç]v(ó¬ýµ?þ~óú¶:tß—U¾ÿúëîÛþÛîÓîSóÿßvíŸßÿµùÛÿövÿ—æ?ïø{óûtü¿îJS6þrú³.Mó·ìüçñçÿÞýíûߎ3öËuÀ|ÿßoŒ3Y ÆÄÒßvý6Íé÷ï_Û½m¶Š-¬)³½ñÎïMííþ¿ÿÜýÔ,ÐOŸjoLYøã?â*m³’)J·7¶np£…N¿u¦7ú“[WVÑ&o!WÇŠq…‘g?TÞWÚÜúxÈyUÙæï¥ë~݆4ßüÇ iκgrž>ÆWYoòäêXé\˜]‘›mÕsD^Æ@D~³õQÚE#œ#äÚHéN®y²uU´è±Yûýô°ï%‘nŽ«c¥?[<û¡*º_ðïäÚÕgÎ6$ãMó÷Ô+{ãáÊzírß[e š{™>Â䥉8ù ru¬t-Ì®y¸eÕq¼+"X•/ÓGÀCþuDÊ9B®Ž•þpG³ ™ƒÒþx>ß„Ÿ¾ìÞ~4¾Ÿ¦Øù©®]óôÇ—)ùþÍÑÝiàþòãþYæ>þiÿåç]}(lރ؎dØwð‡FL¿ùGžÃ×qpD˜í=Á;}‚Ø#£ÎC¼Á¼SW…CÕ‚26 ¿Á¸vB0F 3‚)Ãiã çqmñ:jƒ©Ò›5”p§]·'÷ü¥¦±å ÍÜ$TŸ ‰\ÙpMck äò õ#þ°äo¿1¦P×h?Lþ˜”s$»ðÃ%Øàˆ€oX—b=q0ÔWÔ!Ct1Ê•QBC¿ÚƇYµR‘¹SE1“Cšåü6"ç‚e† CðJ>B¾ L1Ê|ãÌ-¡é9y,é¶²#º%‹A><¬ê„u8‡Ñ<˜6°§„×Áz sΔñy‰!l#êœ_Ð`#B@1F¤n"ÇØ²ÂN¼Ú×4àlNák„ ܦÕkæH#šgÌV¬¦Â|2åµÄ¤ ; ;bÄŠà ¶ý±èǨbÈΆՅ·„_$p‚`²›Þ‘w b~h3D ÞR‰W‚˜ë|>‚(V¥ 6hæø|â› 8_`Q3ì~LÆûµÈˆ [¯ÀN`ð7öTÝ* gˆ FÝ3®,ƒsŠ…¯ßº€Y,õuƒÜ‰" c–Àt®z—àw ÓDAF?Ј l8’ìöàúm„G“"ª®<+ºk ¦tF˜0Ölrq¤ß0}¼žZuíÃëýþ.;$I"Nnú´Y ˲˜&mJ7IT(&cÊ”qƒ\>I´QÈp¹Ž} W„v ¸l¦h: 5ĨP¸‡¡&Z—0§ ìT-Âpoº25oÞÏ0Ñgœj ×Á<ƒ)–Iéõø´§ ˜ÓPlÞ'ÔæWS<{œð?Ù´î£éúŸ*¾Uš-ÇPã}|¦Xráu0Î~¦©èß :]•qr9Co I#¹ÊÞ'Útí¦kW¡kkÿ=ŸhÉ\¢…Ï[ßÐ’VÖØÏ Jç—ÿ©tƽI!\rÏÐÖŽBQ"–5XrA¨ýœh$¥.LߊqÓÂÚôOµúÃ’˜(WôsB½Y¸¾õZ§ÇÓ¬š›Ä”-”›od¥qVªq¢œ„½|ot ´ÛÁºó)Æ(.â†ö©ÐŒ…h—3­í¶ÓVn¯Œ-Jl2|нW}Bì 㑤:½¼E‡nvc&ùöD›¡a7bK†ŠëàˆÓh[Õ„½-Xs¢ ‰@;ª1þeÜ£UßNh‹¢V%2 O™%ϹؤÕÝI+là˘ðº³1-®ˆ“âÛp¶õʾҞsH°u—0Rú>C`“}÷ád_Jš?ç·¦Œð•ççÔn ìø…+•롮ߛÉEi®lz dôâ„m˜ÞNÕÎáç¢PŸc<·Ù©·òSŽ­—^r…^,c ÍN/¸)ä¢#j륾²Ow‰ÞþuÖö·o8 rÚá$NQ÷ãäÕøß*B¤OãêæëP­uðõ,žíú¤Öùßu(φ ~ă©zg’‹óB·îs±Lz#ÃiTÞ f|‚SܳJãv~¯ß˜õ§œ5=R&C¦V>Ä’²! ã&:œ‰¯›žÅ$ã$Ví?½ÐoœÉ$ŪL¶kç=\Jf$ú6¨d…ãƒcòS©ÌËë9Ž9ÁT‰ª³õU»Á²ŒÚµ$«ÊKçqû[ n™Â©:“ÍV&â+©ö"Ò)TíúGµm#ú¨³mV‚„îT•g‚€•?7D†Úª:cè7ÀïĤ1-{U½ÌúË—ƒ£º;ÿ5À‹˜«”ï8¤ßæ Œœ%GͰGÀÈn\©ªÑ‹P°Nb¬¤›!ÀÅØ£¨æƒ„T*„UÍš±ƒ=:É)£,¢î*|1Ð]!…XÍ1#({×yðó[ûQ ©K‚‡ûaÌ&¢rg·˜P@¤Fh/Ä:×hT¬s*Kø¦{ÌSÉÇq}áÀT‹ß‡¿bºzÆçC_o«Òßž”¹ø ^'N2ŒP<2%¸ŠAÂtØÁ¨v Üeâ¶Šq»¨£" g#äaëßÕ`D J;eÜÝᆇø›>ýÓu]1_Ù²rݽéˆ!QæE¸:¡:k«ÆÚ’Y˜( Óì› g®1lE>q#ÄOTýÙG鯔 h͇ éè>U_¯•yñhz-YG[Â÷™¯¿áÂEÃÝ™•ÌøHÌ+m Ý%b0Ýzd]0™áTЬ‚†¨öÖ_Ý„3çŠÇwgÐná˜h¤Û@qèR¡^}gëøÿÒH gk‘küaTœö„fëê'/|“áý´$a ’íaëÀýtO¤›jô ^çüËXMg‚În¾„QøÅ³%zZÁ¹s©…&?dõŒµHÑQvdê€fªÚ9Bkè^¥ÒAw?×H›_@úv‡¿qQ Â+-±ýÐ5¬À¤ 2†ó˜&cŠDábª%Ëñøuйh<ÊžÎÆ‹Q¿tÎÊIÙq ¸‚V¯€âVD.Ùg’HDøÜ 7Bn¦J £]ªxºnAT´(ókõd¾SOíO®Òk&¤†ÑCW.N2y¢ €•0Õ÷L{Ðf|Чó:Wu8NpŒ5¦É«Ÿü²û,9q¬£ * pm®+§$ÉÂz>;çã% ë ¿‡ ëuh”‡ºº>x‡!€8¼Œ!Hh Ô©~>?[·L2&”…Y¦µ c¼¨Tá*^¬2± †‘ëdÌOÝ7,ñ7D4E¸_àU·J•¿n(•H9œµëó¥TÚ3)cL" ¨®„1lºÑÖ»©Wð•èŠ:™€‹j´–ª Óˆ¢ÌßMs]᯹ÄIäkEê½åÙ¯û”»½Ü»-‘¬3Ñ$":"ÂLî°Š-ÆKĘï®VC—k>!5ÿ=òš²/tÛ3 ¼˜nñ: òU-s±•%Ã6¦š…á‰"±cªrp1h)AÜ«¨'h/uc Óo”¹=~Ñ»+‡ww§Ußç3ú8$äŠé—3¿Ý¤Û¹“Éq»0ÕõY÷Æ)9«÷òR…¹’Ø›1û¥9?Ô…©zF,?󿮦"ßD1906¢äï,½[÷}¬¿ƒÄ8°½ÈvO§År*&×õ/—0‹ÂYŒ¸<‚÷cá~<%¤å:Ÿ„g;­j¼† îÇ>AØ § PCY#|ƒe€ZMá4õÎÝ@}<-fDX‡±X*bÎ ÀœAÈeA›<“aZÆ#ª¸ÎÞ‡ï§ë¢ÄϺç“bá:Âù`^ ¤P>M#…JsÃî,>{H— b!P£ˆoæ×ŽIµV}^5U@¤|yîp¶È(á¯Q.¸j©þhThiêFtW‰‘ËT9+×ů²òX9U/ G\#t¦û¤Örc[—Ö¢z22³U¦éª5>¦ãû×TºÆ·± ž âãÙFœD)Ë%oË5 5SÕpùÉÜ@©¾ ¯‹|*”.¨Û¬3Q·è+ŠIªT)¡LeùÏeQêö+MP©_ŽcäEÖ|ë|Mýƒ+r «KÌèŒ;dæ˜È¼·çdÂ6.~)W¬…»¼²ÕÒˆ=ضäõÕH‹¹b<ÒÙpöÐ%R¿Âv nv{a7•y ¶ÝNQ.7N'ó/ eXÓm}´ÁŽh.M_¶aðlð›.ûÎmýU@ž%¸ã߈{Èq^2Æ*$<C®?‰öç¯GÌpŠ9<Lø8…uà6º—Å.и@6ψ3òÄ¿1˜ÔªÛI­ÌÜ¡S·ÒœÍ_ ì)a½ÿ´û?†:š× endstream endobj 3133 0 obj 5323 endobj 3137 0 obj << /Type /Annot /Subtype /Link /Rect [383.250000 737.750000 440.250000 744.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn42 >> endobj 3138 0 obj << /Type /Annot /Subtype /Link /Rect [214.500000 675.500000 279.750000 682.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Preprocessor_delimiters >> endobj 3136 0 obj << /Type /Page /Parent 2 0 R /Contents 3139 0 R /Resources 3141 0 R /Annots 3142 0 R /MediaBox [0 0 595 842] >> endobj 3141 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R >> /XObject << >> >> endobj 3142 0 obj [ 3137 0 R 3138 0 R ] endobj 3139 0 obj << /Length 3140 0 R /Filter /FlateDecode >> stream xœí]Ë®#·Ýë+´0wšd³@`ž²0˜²0²ÆqÃcdâE~?’º[’»u¨æQñ!‰Øw,^ñY/OU½þóçlÿõÛöõ»ÏÿÙ~¾û¼©^Z[ ÿl÷^ »—ñïÛ¶³Û¯ß6ß·ß7Ÿ6Ÿvÿý¾¾ðùÝ_wûßVoÿ²û÷çíß}øãøKû_ø¶iU»ûùËágߪÝߪãÏýçÿÞüíÛ_÷=NÓùýÿ¿RFW¶ÙOãÊÐß7Ó2ÕáÏo_ݼ6ÀoÝÔJé­ªM½U}­·ÿýçæ§ÝS÷ÕK¿û…¶©Ûê–Z½É´ÝnÝW[Ó4‹dºWòתîƒu>Ì\|W”i”»wÁíuk‡ êm€í?öâlMîl‡™KoÊx´¸s™“Uu½¥¶íV©®Ùî~Š®bÖ½ìö½[eö~˜»ø¾Ý;;=]ÛØaƒtäxý9€N©Ä³Ÿ»üÆŒç‹{=à®ï‡-’B³îƒœ@߇dßÃÜå…óp¼°sÉÓµÊÖÃÕª °E§þC€µm@öæ.¿1Ãù:z=àÆvµï©û 'ЪÔs˜{ í‹;=ÝNW!O÷Ø}ýïÚ&dïû¹‡:]عèéö:(ﻲÿ}’wsuºóÎ?ùt‚g2|¼2ß_|ûeóú£ª«AÐl¿ü´›Û0æáÇ—ÝUÑn_í z×úãöUeÞÿiûåç͇/»©ß6*²®†!;5Yõ‡!•}©z³w‘íïТ‡–î¥ë«FŸ·T¶´°åÝ¡¥~©Íàˆ;µÔ¨…š§6×¾4­ê~·ÒÊZÌ‹­›Y \£7¼ÒÎúÃØ›Ñºy=êí0Îé¼]xàX›ߨù2Œ?=¨¡e¦®ØÇ8ÝlJx]º‹CªE \ì_5RÓ™ž:éÐa;Hg±ë7‡"H‚ç™Þt 颂3ÀÌBÌ@ÁÔ®4®| ©¢z;×QfNX˜ƒ°‚Û@©3ÜÛz.ÀËpäzÔ17HëY ÷KnáÃ;:§;Ç2°…-Œ`Ì3šxÕÔ„i5ceBÙX,Kè*|LŽ=tUc™\‚à£dÆaÎÇ1k(î`@Øwý\'./i¡>1Õ`†aT.Ö!ïðpÌ€¡Nⓞ?°N¤4AëAM˜Q”d[oó1lÎÒŽM›/+ÔÍ%“ïÝ?¼ NW‘H]Ò< ©âì|[ˆse´‡¬DSïý‹~ µ!ÃÖ r•‚Ñ” sýcæÆ0›78^tßÌ8¢†í_³©–üz¡Å´¨E¿ß-ÕGØòÁncK@¡b:3—*¢6)uí‡30Ø¿X¬HΔbìþN’m½ äXþ>ÌŒ¿ÚqŒ…Ç<˜$3·ö~EbÄ!,–ÎÂ;¼ät]•5Ç(¹œÌKîñžBXÿ*äB›#Êc2ÉÚÆ®µEüI“Cª0 SVª”‡§ òO+Ì'ÌQŠÚeåø¹óq¬‡˜µ°¯ç®ß*bFd(QÈ»Šîf*ïN2t¬4¹Kí‰$h†.uQ‡Ã½_ÝÕ!{Àˆ[f`æÙ¡Ùô.ˆ0ÏÕʹÞP ,½Z§p”ÇÛQÝÎF'e@$XxJX¿'·˜°£ËqÍÇ3˜³¹þ8ߥÙ;Â@`jI`{:9I»Ù~ÛÑGUòËæs°@D¼‡9̨7=ª\Ô¼À—TÙÇw<žº{CÉ[îKk–¾¯:ÐX¨'Ýc"uxŽÎŸIkCZlдó޹ÉXqx=ìVÙÚõ~ÿGÃSÆüG(ÈàcÝäÐZ²‘[¢·~ uO˜ Âø3fG=ÅÖ?ÏÉÚúÊ¡úƒ”fºÕmªnÚ"šu/A£0Ô ­0lë=œA[0lK£cPKMÌ ÔÜǬñ¾»ƒ×cà8#]úíŽòŸ^©‚`@Gop¯{WŠ÷s‰\‚{«àJ™jÖbÀ‚²F·EÖYSdÍZ®ÍY¢Ä”õ“TäF‘EnÐ{^nŒs ï6¬«)ùN”=|…¢ï0Ô[~XÀ°üä/ó×xY¯ºcJÔÍdèaz[ÿÂéC¼‹b–0dˆyþõX±lÈ ã”}Hñ” wTlˆH=FSž´—¸îü¥HF"<ûý:àdOu¢Ó#àdGjç¤À›ì§ð{N¸o$õìCp¢!nÓ›‰±ÄB¬\ Z•(ß•%âf2ùÇè:»[2OXeDRMTÌB†9e=ža#I‘‡‹]Xä7<{›ŽmØOUŸâuÂC¸šù×ÔxÀÉtÕl2Ž”™ÏC¡%­&‘$exWúD±|OÉ"˜ûÉ5¤ïm©¢EQˆÃä•#24SrER;Þ‚mkæÚ/ÿœa^Ocº oÍÌ-ˆGÉx#¡ÐQ,·ç5Lbå.bì…'Ò¼%ûc±CZëþÈEX&bˆN¥%1p@ˆ ÄyPýã5¢ó<ûf ÃzÆ;}x7‚­ƒÆÕ]’–÷™^EöΞêN˜>o,U_ŒáõÉž\"U| ^µˆ×åÎâÔ\1m ÛC•žFƒ%ÖsC0BVoT{uBA°Ì‘–wòaÅ£8ÛÖù\Ò°`#ðóQÅŠ#ò!ÒRsŸ?S÷& S§f÷Vé[ŽióTŒÚj‰PeÅpqÊBiã“‹áLXCæFeC憱¾ ™g@æøär!s»Âº¹_Û´mú–ÍtФÿv,I– ?tG·Lð"£ëº«'KÒáœõx™e@@YaÇ»,N]=‡1rsŽß•¨³G^©XOw…¬Èï%Cö˜sD“Î O61]uoæR]ìY¢ÉªÅ˜áëMTílÌ\ã_\0<ÓÍ1ùA‹ ÎÇ̦"làÍîô|áyß Šyì/súÁ¹r~Ùή™q©8ÊÞ‹‚ÆyëC±ÏX( Î?eY×Ý Á‘1ÈìlÈôAf§É” 3'sÏvJê3…'²•DEAD8–ÐQSoÖ~b?–C‘ê_ Xf’0‰&•ŠpŸn•íìÁ#¥\a2‰¦©Éæfí'zðx'ˆTËáÑH&°lV§1„üº1˜I>À䙂&¾¬Ÿ@Ø9ÍX…“½ ;תš<ñ'5œ,á.“½gÊ$aÀË`hBÔ€••[5Ì'›hʱž7³caJ¡Q/Þ8&‡±àˆâ[u² U&K6‰ BƒÄÈôf—®ôôúºåµ¥èÁÝK!vÇÁõ8ÜÓæøÞQ&Æb,ªdÍQä[dyQ±À}{Ü»¢·ŠÞ*z«è­§Ó[zËýæow:úê…-tÉò”ðÔÈÀÏ´ù¹ÞñC{´B8;‹1ˆŽ|‹ø‘°¥ÀÅÇeÒGbéƒ[D+ Ü´>ýën¦ðd…¯ÃÉ”Ú ”ÉÃð<Þ‹EK‹9$žÁ¸)“0µC 2Bé©iͬ‰H9Fɧ¿#ôè$k»J4Ù›Œ–$ÞÇNÚˆY…Ëá$Ô›jw6ó›b¬Ü¡w(Ñ;i«^Í{i¯Œ#·GcßË5/SHºUÍÂàc`R8Њ6e€òeâRÝ0)É+‚`< È$1X2‚±¾î_¤ª àsð(°Â3jHÉUÛùÖE*ú”c.ŠE1:ê„=UÄ¢$7¦|ÒÚˆjÉ-ç+%áž6ÐÅ [ä…JÓ#PGåtYo8˜„AÏK {Ÿ7ðøHôfº#UmÖe±“+‘dO¨ã{¸×{¦AÜ[Ž dzŒž^ŸÛËáÂÉÀ—þåY¢H£O^°HœíãBO‹Íˆlv­H9™[Ü é‚zÝÌ\£: B;âe;L8N´Ë¤l”كܵ$ x^F\\M}õ˜‹, $ËüžÖçðd¤‰ rq5$uiz`D,Ô:Ø®¶y®b꦳U?E&ë*´išÙéSMæá¼ ˜ó°T%4¢OàÀ E&Î;ÕÒ'Ox਻ŸGŽkl–r ¦”ƒÊL¶V‘äàiÈ äài2%%bxAÄŸ> ,x }:­bãß6’‡¢P¶ðóp¿ÈS¼,0òAÒ·D,©lwÊkRi%ÀÛØ‹WJ@.ñJ©@X¼8 W„-%ô[<ô©ŽX—Õꪹ:UG >Èü1Ç~ÇõlB ù­€¯ÇLÝbuW²u­y%ëIQ}ì<ÿàÚÁŨ$ÊÌËÙ[SÝRîú>¡#½\Ïó¨ ‡­ü×£°5D”ÕÆâÎarCñÀÐp™ðìŃ^¡E[î“iR2x<7æþHܱ%àø1+y[c»È$+…šƒ0±!ʘŽxØA¨7C÷7yö˜-ÁdAä¹tè:(1ñ dµã't|²†…¦#6¬¾‘Ãï`ëAá[/œ›ƒB`h¬ïÓg(uŒÃ¨#fÅ/íð#8®Þ²¿BÔÊ^Pú–ìµ`}‘ź‰aÓ÷†}²˜‹y• m[“ ß3m·: mGZ^‹õ!OܪèL€íL,³°ÍH¼üPVQrQTßÕý½0õ¾ð®ô°W ÛM5iáø€TÙÐ|0ÖëQÑäSŠu¹žÒ2Œ ÿ§_ŠXÄq ¼#]ƾG;+“¿iá…ë{"\sàô|Lð…'‰1_¶¢$Uƒã/ŽåZ4rÐŒóv®ˆð60ùü1çàU3ôÖí–HÇâ¨áF±2Òà|QDµÖôêÓN—3~i wcV•¤ë³³áíª{´À¢s«B[3]ItðL!chëiÈ B[O“)¡­NY6´U²²µ_ð&“*†ÉE"š¬Æ'Ý‘yÔÇÖÕïTͼ³8Kä'* ™)kÉ),„“>?ŒÌ68ä-®×3uYB‹‘—·9>Ý”(*gœ~CÁx ¤{°-‘W%òÊM!LäU¬=Ð{TÎô^Ï×/gz¯gªáJeã±Ôx1ÁP[O`q\¥ô‰žtñ ˜x„y´Ûã¶¾‡ îÔKg¬w.f&Å[ñ–’Û® é_1ÍLaAm»ßAaçÆˆ‘ VúÁ¥”›aâŒ÷MC$¼o±òu Bj. Œ}𸥂©ª%[䀩á^j £½褾îW뤬/ ~5 JÕ`.У~G]C‰ëÒߦø’%qÌT£Á¥ø‹ÄÑbÑ8€o±ºd°¥©XÅ ©Ë#¸å{ušŽê–|éQ낹l‡¯77iê㎉>"ÚžXu3ìì¨s'Zõ“2˜‚Ê"µ± ~^ÈD(øù5&wús*è¶t¾Ï 0ê]uÜmZ•ŽõÓ`ÔO“a0ê÷U 5Ym¥dNÁ°EÒ—Göª‰j=ÙÂV¦ r¶Øµ6½ÇŠ—WÑz’ w„WЅ“NàK;.á yÙÁå²X±8vAFXð`f\Y#}•îØ•©1¹‰¸ deTAÃ<žàã¸M1D&+[ÞÉ[µõ\;zxl1ö€ÐZÔ«·¨Pgò#x¼¿1œµˆº€¬7p)™Ï6j¬\wL†‰cåÈzŒí‡ñhŽ8$&Q=®_@äéÆÑ%Ž"ó8 œk9ã“Ã=9Ï:VÌŠÁë-Þ-d_s½0© ±^]ŽNR!¡4Æ30еyêÊ}+u qÿjôÍõ€ùbä-”s6J¢׎¥éRšM¥&ôsú|¿c™TÇ ÐŒ2J\lÖ^B*à‡ð[8öq>Êú¤`oÚÁ'·>½Ý9Fg÷gû}'õœBñÓµ_X!5»KBÓì­Rv7½­žjÏŒf.=~ ¬Û^8²A)é=PÓY˰-ͲeT ú¥±ƒº8‚Göc®YÚ—æöq\i;Na~ÌØc]Ï…<Ær4ËޤŸß°D½° …{ƒß¹Oy-ý¬zKpû¿W§zÔXƒá]…$€{cˆÃL'1|~Þ¢æ$€ŸqáÑ`âÀÇé.c4.иƒl> Ît'&(ø…I­»ÔÚʼŒbêVšﬣÀ¾&¬·Ÿ6ÿ]äÁ~ endstream endobj 3140 0 obj 4701 endobj 3144 0 obj [137 /XYZ 38.2500000 314.750000 0] endobj 3145 0 obj [137 /XYZ 38.2500000 146 0] endobj 3146 0 obj [137 /XYZ 38.2500000 146 0] endobj 3147 0 obj [137 /XYZ 38.2500000 314.750000 0] endobj 3148 0 obj << /Type /Annot /Subtype /Link /Rect [229.500000 575.750000 282 582.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn42 >> endobj 3149 0 obj << /Type /Annot /Subtype /Link /Rect [69.7500000 341.750000 101.250000 348.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Preprocessor_nn3 >> endobj 3143 0 obj << /Type /Page /Parent 2 0 R /Contents 3150 0 R /Resources 3152 0 R /Annots 3153 0 R /MediaBox [0 0 595 842] >> endobj 3152 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1409 1409 0 R /F8 8 0 R /F1700 1700 0 R >> /XObject << >> >> endobj 3153 0 obj [ 3148 0 R 3149 0 R ] endobj 3150 0 obj << /Length 3151 0 R /Filter /FlateDecode >> stream xœí]ßܶ~ß¿BϲII¤€¢ÀÙ>èCƒèCЇÂiZqÐkúïWÒJ{·’>JúvHi÷#±s´ÈáüæÌpøáÏ_ÿ‘üë÷äç¯ÿI¾µ¿úzH6OOÿ$õ¯Þþ@»cûçĺ<ùöý𒼞OÕ_§¾~úkõ§ÿ%:ùKõï/ɯ~øSû—ê¿ðý`•­~ÿµù½´ªúSzþ½þù¿ûCò[=c·\ Ìåÿÿ ŒIµ­Á˜XúåÐmS5¿~ÿöÛáà ËVÑE‘æY¢2Sý§Ìtòß~®è¦Oe¦”-2›^³Ê²f)W&J¹"Éí`¡æ—Ðô*Äì*ËÎÞÀ.Ž£Kïä¢ÔÕ÷72Eç2{nCÎÞÀ.˜–¾xvQ™kQdL$½ÎbvëÒ€³7°Ë#¦%0ž]”ÀÎèŠlGçéƒP LC p»8^ZòÂÉE©[æ­y,ó øÏZ_›æ&$ïÔ°‹ã¥¥.œ\’ºV¥E@Ù}>u•S!g¯a$»xrêZ]/bªÃ‰Òe*½‰Þì²Ø?Mži¸ÉÈå)[9R¾É%)›+sBÖ.‚ÎÓ‡À¾Í’¶\+mñì’Äu¦¬, !·çéàßi¸ äâXéˆ;˜ýiÉ,”ÓO@PæÅóáÇçÇ/•P$Ï?Wl~{þ~¨Žå?Ôgô¢LžJþ˜¦úáOÉó/‡Çç î0KEoIõ¹Y2;fæ«ÿ^3’~ LÅg—Àd¶Y²<Ú"/tþ˜¼1Ç<+œ½9}㎮L/¿QŽ841ê4Ûù™™ÀÜÈÈ`’´€0¦hOŸšÞômxzíàÂpéc3’vêr¤lŠÅ;Î °%œY‡à¿!50Ûab»>–0$˜±ñl6€³y‘a7ÈT™Ç’vJeºéæp Æ(äH ;²³A¨‡Š Ooàô˜ñ!¶N­ÜÎåFõ ],µ…™žbmü !úb!ÎŒ¢ÇæâéäãoJ]Ôæ2îGÝŸ`Sªûo#{”%•¥HšTvr›•ÖòúÒº à$øˆFZŒ<‘8òBPÀgÓhÄ4’AØ „ -—ïôÞ0êÁ[GÊH'#eí¤z 6†}•ˆ'aN9Âç¬Ù±x˜}ÂÞvt'õªÒcðºp¡0—aU){x˜R¼!F¹êÙ¹ÛR Âmó¡l(OB4Œ(ìÂa_,8b í9žXãz<í9ž@WVC绲Œc¬lxW6ïáã=[ã86*šôcÛ±•X~@Î.]Ö·^DàÊÔX°ã$š`2h Ä]¾!6õ…̪±Ý(½EˆNíl«d§KÛ öòe¶öfÄ“®!¼:óp¢’—ǼÒ"ºSX`NÌÌl€˜!E2ËûÍ@ÇJ¹Ý[ÖºwÄÉéÔÛ˜´Ow– r:x§ožlܩ縟ãÀÂ}8âÁ¤¶‚ ž Æùó›‚8ðÌ©Íd¯0°Ì™1•Àkq"± … ™‹­Æ‘¥¡‚bˆï!×{S‘ØÏ¹iyˆi.¦±Š)¹ó©‡ëñAòiŽz˜·c*S¹ž¼Âñ0ôÔH¤íÙÛ»@Á†9Ë™kL™,¹v¿ùý™ÌÍU<Íš,Õ±…»ÞXhðAÇâÇ<[Ë\$NÆ„°y°ƒEð- † «.ìÖ1¼ÓždZE Ê#Â-|4†Œ)K|æ åÁ´Ž(u†×°ìAAÓ6LíΆ!`ÂX¥{Ï:„SIA°ì=^ æÌoÛWßÙv”´°ÊÇ*ûVX Þ#h²Q¼Ó¸îs~Uø4–ËO‰x6ÌJX/2`#ÚºÍk×^„p7ÆŒ«GΉøõfRÄAI®Š»Þž¹&Ô<»\6¨´LùéŒ&a;dP£÷ž¯6„¨(º·JŸ%|aÍàŠKªP_âN#`" ¨kD]¾ðÕ¾ªkõö+Aî+7fç­]QƒŽbjžARK:=‹t[E÷ nÉaüGº±vÁøÙ¯9±‘²QÍ 53¨¦ã]òýPXûö¿¾FïyWƒÐ󙘋ñŒfÜäÅv3Wˆ ‰kö5[K=lçR…È­ZêvÕü^ƒ{‡§K»F7•.ï[OÆ.,p}ˆ^m:g¬làÛ³LW—í©¾í^È ~ÈeZ²2íqp‹ `Í-z´îš&{9[¢Éu4 c¡pqZ§w!:}Î¥HDBŸß£xe!/óYÕCû~Ü€«ËDé¨È²¬ gzÌÈÞÜÜ^ðþî‚Ï{šb–ˆP½W3›Q»ÛN]rÝ¢J8O–ÏF\uÄ¥ ®aÄ•}1ËlzFÉ6®½Zµ_{ÅÁ˜³ˆ[D6<àB ­_n­»ÓMr}ÌB›ÏèH´ß\ÛkÂý؉psm"ÂPù<‘OYTÍÅVºÊ Åš˜PãTÀ›L8b¦õDf±?¿·yTïÝù%ýnÌ{WxmxïÎë? ów›Ž¯ÇümÿP‡÷Þ4—¦;Y˜ÍÎ-2qç×§x¬í–5$7Up¶º=ôä ™8..âdÚ€.Hä­þL¬Dµ>Á—¨“e=O]s2ˆU ë‚þ†9¹-0—²U87uŒ‰äÿ3<´ ­Ýûzf‹¤ÂßO¼£í !ÆgÎÆd“:Ë Æîý«TKÑfDŽÑc9±÷Á8‡S-õ¦ÛèÖˆmðšµmtU™½ýÁmtk.‰­ÄníÃʰ–¿Šs+5‹hè¡”DU%Õßœ »ýEÔ9[,kxƒ¶žzâÖ¯H{\Œbêö<ë¢ÍœÜ5,¬ƒ‰½z˜—ª~P%xƒX:%‡Ý~,mg–YZ'plB¤×°h;í%¶EßFeг€ÒD{wAõ¼ jÍlPø½¢—ü’€JØ®¶”Ÿµ :› ÆÄ2Û²+á†~R`uÏÈ5ñš‡ÇWºç"lxܬà꙾!dµ‚TT¥è:Ÿ E „òDëX}gÓ]“‡#ÞóØ: xNÑpXÉé3çV¯žtûm:ì·ó¸D½pý p²Š²GêÖ]ÃD G骘 w¿júŽéú¼†Uøü=Uƒ³i›>x¡ƒî,DqÍýúh½fûb: ¯ÂïQL>|•¨eÊ~©R &¹J?O{ª¦ÎÔô½ç›nó4vï™xóÞ)±Ïmm¸s÷wZİá2]-1ï0ï|xZà^œðϽtf„ æ^i ùšé-ÊôJ¥ø€ZF‡xºÏÞ™¶”•œÆxvª³zfuêF¬¦B$ ià~v‹¼[ä˜y·®÷§•cY×vw"Rš_ŽîáÌþî[ézû¢BBf—µíï`µX^¶18AŒ¿éô‹é§ŽñÈzIe",Ù>í6¶¤àð’‰hEí샘œYŽê»«àZ'!Ò2}ÍT]/(…öRÄMUnÍ/òn‰Æ\Z'..{2 ¢êCk-Ùæ<ó3L¡¥ÆÊ¯Ç¶Á© ¬é>ð1m©pû+|t"`c²bžßò@høÐ‹ƒ9p$Êki¿¼–%0PŒyxÔöЄiP !˜ !ÅÁïù­aêx½˜}AOÙùDŸÝc‚Ò˜—±†›Ô"{P:^P:ŠF)R3 ìH¬0cN4t__Ò1ÔŒb I„Ü=;Å#ØíL5–Zl%˜@ôY½ 2G ék^rŽ™®/ŠktŸ§¹o¤”žçL†9®ƒý,FÇ2þ½ɰ†#»çÑsݺ×fËiɸI¯òòñ©)6Äß³áÈ…'ÊÃ@£*F)¯zõ¢”ÝöéhædqoÖ•Š;ìÖUغÞð9¥tÓ2³‰sŠUv’&øçöÎ{õO‡œ-ßyÿ ¿y7wÞñíoÏq|Cðwž)Í€+áÞTgÍïo‚c* ßE‡·î=TŒÕy€Àg½Áýõ1pªw¹}¬SÜ3¿Sí^I·ÁÖ [ªñ\Ò^›™~Àª¸)Äõµv¶ŒL¾™²b{¯kÞ÷Ù4W3Äf´¨Ž‘饎4dÏv30oad¸WÅs¯…ýÌ O§§w\"ËØÌ™D³Ê¡^êë5ì„­[=ˆ87­¶' Ö“wŒR›[)fY·+öN;o0ÿnBÿšâôþ†(Èß‹Eo¹XÔ[;SÅ«sŸp‡!¬ Æ$ð)‚‹%V§GG§PßâŽ1jƒ;¬zCö ŠÆ‰Nˆkf?[×5•t®‰[â#:¿bw1“Ïe–­±ªëŠˆw¯ö=yµŒuòàC°û®}×êWòR©¯–xšú 3‚³nL…eŽ©ª#h‰Î.é0&;Iƒ œð£ºIWy±Ž´|¥Å S[lF똩zÆ`ûÒîqÚ${)…ÀvièÁ[ņ_áÅ1Þ‘m(<ü¦Ý¨E[côY†«ÿ\A|锎0V! àÙæ0%N?:—oXÇ]!i0s`rzÖÛh}ð¸‡m‘dzØ3üFaVs׳šMͱUS×òœ~ãÎMêâ§äéð{ÎßÕ endstream endobj 3151 0 obj 4210 endobj 3155 0 obj [138 /XYZ 31.5000000 630.500000 0] endobj 3156 0 obj [138 /XYZ 38.2500000 519.500000 0] endobj 3157 0 obj [138 /XYZ 32.2500000 629 0] endobj 3158 0 obj [138 /XYZ 38.2500000 519.500000 0] endobj 3154 0 obj << /Type /Page /Parent 2 0 R /Contents 3159 0 R /Resources 3161 0 R /Annots 3162 0 R /MediaBox [0 0 595 842] >> endobj 3161 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 3162 0 obj [ ] endobj 3159 0 obj << /Length 3160 0 R /Filter /FlateDecode >> stream xœí]K븙Ýׯð:@»ER¢( pŸÌb€‹¾À,³:ÉÁt0w²Èß]–\%J‡?R”­¾HªÊ´HŠüÞÏŸÿí—?þ營?ýò‡_ûŸŸ~y©ŽmS]þ;œÿýôþíŽýï‡Ö5‡_{ùqøñòíåÛéÿ¼\øåÓœ~ûçAþýô¿¿þë¿Oþ©ÿÒù ¿½´ª=ýüßן]«N¿UןçÏÿúòŸ¿;üý<ã°\¿™ñß?)cºÎ·qcé/Ãkª×ÿøõï/?_ nmÛ®³U›ú ºZþÿÏ/9-0L_»Z©ÖÖmuÏB­>¯äLsPº«um' ½þ“™^ÉOî´«’M~Ù¹ø©(cUxö£³ýðwrmw>³º6'ÈR§ßý•Õ°´j¬³º=¯W™ËŸ÷]Òš6$…/ש„“¿B€ð¡ôà…'$®³úr<¦ªÐuú§ßi›n^w.~*ÃÝÂÙÓ pgNÄârTmŠ›x›>ÁäµK8ùëÎÅO¥¿æÀì‚8ÜÙ³Œq> ®IpB×ÙS«ÞíëÎ¥e¸Zòo1“à\>òéÀƒ¿¿üüUÕUwPöðý/gBòºæëï§#i?O¥NýéðûªRõßÿöÒ­n†-ÞùˆFª¯p?óŽèø½U|ÆÁ‘Op¶Ïð¿ëJÅŸŽj‰]·€O§ú€FŒA#u…F4œMÁ]xÖž(¾ !„7 ïŸ5ó>†ÀSsÙÁ—ï'²”œ¢èîŠBŒTøäoä9‘ÚÝñvæsÆÚv…UUÕ ·ÒÀû‚#“ÃÔRóUÂTR <[)f€ŸÀ]8'\§Â\c±ƒ•Å'йÆ Ìá‰äBzÀÏ$üÌ-7u}›Ö?ùÀ:;u¦YËF¢ozSʃµ¹ I›¼{|à n¸J¯Äx†ßŸ5¡Õè?¾m8Rã½gൌ^ ÏïÚÀu²Qx§Œæ”k×eènÊê{4Œ7!íÔb‰Sĸ[B»VXâ#Ù0ó©LÓeÄM§Æ.˪ºº-/3¼2‹¼6‘çDŒ»y"»QQÄúþ„2p]7íc‰`,›O$$!0ª«W02jçªËfêcm.Ayo×{ÙŒ;º®zÝ©s#-ù„ÖÞ\GøÌÀš£ÑNG,z&0Þ^çS¢ã]þóè˜ð1٠ݯîZ¹1ÒAÀ^HêžH³1 ä X7õ<(&]ÓykjÁ¹‚Ô[a^pQ•¦»SB~ˆÑY_F”:6µuíû\Ü£f˜@NÔÞ©Dy5ží²7·`úÞ~33R›ø#Æ€¯ï ³8”–fÛÖúؾÈr‹ )«Ó­!/š¤_×4;øæFi×E)ðºŒE ò÷4\¿7ç¼½z@c^ƒ˜Ã6œà]\, ÝTêC9½šöˆÀãpae*@áÒ.:ÑäJ5(£}×Ö˜Ø`ž5·Í³½Wò±d,’Ë™M@°Ã×^žêG½àòSÂŒ7 þ‹ œa$¬CÜm€7‹JWSó/L¥·xõ˜û'?ÈÜ­mÆû°O =R!¶zá+#.&œ¢AäPJ¤*ø,ÂbÞK†X­ïÇKÌ1õ P<¼Nëð¿ÊЉg΂±_n¨ú[¯Ž¶UcUú²ŽjŽUgÆïóÎv.•†ü¤dD®õ8Q€œÀ» (ö„D€Ÿ™ ,Å×xd ¬8Œ¤±°o ¼A,ƒ‘bñ%ŒŽ2#ã{‚Ð̸û"Ô©^îŒâÊ”à(+W1¾IYõp‚ Ä ÷ê#”£B"#b»‹ ž²ôó¦p}¶ïÌl}æ.sÖ Y;ëAré3»¡ ÏVÃgàl*½=òÂ.ëöZü«…¢"¦Lö€Ý¾ööÌ£Û×—MT ;B‡nˆJ#²ÆuƇ–K”ɦáãÓÁ¶8¸ë>egŽ2çÆhëÙLÙÑyJæÕu÷Ú±zcXÚxʨ~“-a>9+c|ÆF"†=`¸Ia©Xr·èDÈ– MÐÙW“%ü#`ä¶ B¡–ñÈå„ÓûÎ\ãs¾åÈ&›ñ4´éS)‘…Ù¡¶3NÏŽNãœf4ü\2YZÿT„1€JSÃH‚™ãΫ7Ë×¹›¯–†2ª#v”šÍå²áD¶Ö»³‡3å—†!,Æ5Ç·`f¾šµT4ã@¸×$ ³Qm™+bnƒÑ—D¿v[V™¶¬Ss(¢þ¦”Z½\æ®2ÈjÆWŤad ¢. *ÂV!Ër¹#¸‰¬½ìy9x¶$âÆ\ˆÈïqh6<¨€‘c”X+¸€ä±ÇH‚A¦I("¹;„ê/oX¸¤;ªšâ§}íÞX}îºzøíú·9:W¬=ÿh•ê?m¶Ú³Ÿüúbë£RvN]¿eF³˜÷kœ¾ßÿ­Îü§«É¯Ïx;9}Ëfqã5þúòñw©JÀõ”É^å)ÌãEeÒÝî¤"V‡ÕÝ©iV&^9‘f˜úe‹q?ìJ¹tؘ(úWØ…Ï|زéKE&­4Í„ÓE™`†À0¸å~o|39ÂÌq‰ÁÕ¢u‰²emIl̆¡yuGÌ{û>Yß©±¬ïôœ¬ïj_?}2‘õÏß2£YÌû5®²¾«ædý¶ó×8}2‘õÛ«t?ÌâÆkdõÝ5kÊú;r• Ü}—6‹GY±±‹°9ÜïŒðªƒxAµU5"¨¶R3ÕVÆ#vçO|‚úú-3šÅ¼_ãJP»nŽ vÎ'¨§O&õü-7šÅ×HOPm5äA3)p«ÁÌj¡õ Q8D¶ôËúÕô˜û‰Q &&ZC‡‰º¥ôѨñj‹ °Hä u'RÈ€ H#Zä$SZ.´öÙ C¤˜wcì\fÎé͈É7ªË7ºš“oNGîÉ7§O&òÍù[f4‹y¿Æ ßXåfä«ZÓ'¾|óú-7šÅ×È ßèf¸—)ŒS‡?a~(9çA¤Ðt6 rÊõ1Ž3qX¬IÛ&Bšn>ƒá—ÌS.,‘>OµÀÝg;–‰›v,7nN&ž£ÛK0úXªµW)x˜Å¼_ã*7vN&nü úó'™øü-7šÅ×È Û!g¨¸;S=>ÂäGÄ<R!Öý4H>E$Ƶ1qTaÁƒh0~7ÚVý¿\QÙƒd” ÿPUÖ CÕÿ[§+n혷í+žÄŠÚK¬è˜™ž¿eF³˜÷k\YqÛ̱âÖy=2aÅço¹Ñ,n¼FVì®=Ý÷ð©ü”‰(Z¼Í+¦eÕ"ruKÂó&Kö39ù6GS«¯D«ï@R'½/¾¢‘µš£žtùÀ³}–œ­/Ø1óLO½æF.h¢ìp#o૯:”Wþ£ýçfç×ÁÏ ÝQfvp{4¯¨=%Is³ágðé|„;¨¤€òF}‰Ö^ñ.W¯Ñ+†_"M•é§“DôydÊeHtß ¹’ÍÈ 3b´êåÑÚŒ(àVÄG͸ùrU5 S1æ¢a{¹êkÕ¶?ƒª€VMÕyÌkªž®+*1Sº\Ö›æÁŒÝ•ÁÃG³=oªÝû.‚í"Xœ¹C´,Cʘ„ðñ0W&z i&i{^5á¨ÄPn Ùξz„@‰†½i}~-%/[åÈåOawk17‰wûìko½n]â ¿XÞ"- 71”6¿²ªZçA‚™ÄYâ‹Y^Fp}‡Ã¢Ì¸NÉjÒó5‰Î)7O– BU™þ}‰ågf!¢ Ñd ™È¶ˆ5f £+¿ë”=ú†ÌoŒ5WŒ£ŒÅ!¢c…hqéÄâ?Sx’R/Ó“ø^â‚ÊçlË™Lñ¿íü Q,äáE‡lYœ’¾0–S×Ìdöo²”oêÉDåí@^õÍpÄ’Ë‘`0ÀêM­!€Hq+Ð]¨Ë”´` Ê FÊ&Ý014¢ V¤Ô™´à„i1NÑ<°Ôžƒˆ ˜ÖNê”Èj(²@²½¼ä+ÊV¶MÑhÓœœ1æ×И/¬“aèúà¿“E"Zr&—H)LSDÜÖ‚­’F̘ gåKUu…÷Z;o¯¦é±îu£3‚ZÔHOŸgFú AB ^_àpnä3$xÔx8[`ø>Ü5~梟ެÚék£kX1\ØGšØõ/Qé…ªW¸\wÎlzø\õ-õG¦¬z“¸Ý¤HA­Äù5_7•÷Hù™Øp¶‘mñ^Œ«Êz¬Kت¶ÜdAY¡"ù\ý“7XŒ1ŠEê·Š¾§ «™Ø;%!wÐÚe€e‘Ú L0XDÑó´Òå ¹z¨' nJj¸ÓÇ>oâsr "’ZÖÏïMÞ´x‰@âÊ`1~؉©òÇDåÝîé¸rªtcQ­ïy"ÄŠ2Ä0 ½@ʼnø}#T~¬(2#2ì>â°¥$KtKBDÒö1 õ\ѬTYkfo¢éy\ÙÉ„ú´¹ôÙÒ;%ÎBf’'£QQçȘekoQØ**"gË àgKš´ç<¾³[9—¬“ÍÊIì:F9QM6ÕWsqLE5ÑÐÄ]|‹ßöX!¸ËPÔuÍ>çc¾Â‘/pÄÅàØÊ\1œF,èæÉwÕ['Ë‚ï``XVà¶à î^¬zÔ‚1ææ áüv âŽ_Gcèé2žU3•†ÔeÝO·–V§# Ó¼dXQU·Ó‘ñ‰h·:ò¡¼Uu[Qî å‘LT©b°¡`š’ë~ ¼…G;·GäºÚålïDô&älq9ù‘®sÊÙáX€NwíøV¬Ç“-ú1S I–ìÔ¦öî±A"¥ÿ]izû%™êDkÎÚà„ÆÖõëc0Þ¦2-q-"½d+‘Š]¡Œô"u ’£{m[Ý×b²7CñO‰Ú`Â¥<ŒqG»YÓòxk•O0‘)ó–ðK,¾ëÆ{½2…£v"Jözˆ h ¢ÚHË gŒþŒ´ BÌñÍ0²Ž¢!$¨^¢Ò#U3fy]Ö=xa{Á iTiztœ‰ ×pÁ#*~&×Þžf„9Ñ€9\toIÜ"yð¹½çŸgDú 0õ—r¢y ÜuÅ@RÉ#Ê×§ÿÛÙ&×ZWq¿ÏuuO¸ÑóŒ<ׂ\ȵjÝI%ì\+×Êåµ-’Jy8ZN„øm˜–Û¦H*yd§ååÒò¡rçn@#Ôž«±¼¼ô@À®¾¥ Ý\¾ìÊŠé>'ú²eÁwÌ^?ª¢`¿¢LŒ H—;j[RÑ}Rqø"ÓqT–L”_u5eåäÊgHÌ%¦ðw®Z²%#2ÜL@nœõ.G8sgÈ:’“÷²¶öÁX”LQU¦ˆHá*&·=¼X#R“‡¨tOSOẟŒ<œKvÖøä%ÈGHw‘iÏ„Núµî©Âw¢Ý×¶Iè¶Ù2uS%&©ðO‘ÚvÛ „S‘nÝS;[}cÁ·Ê ÇjU@™Fã·î;e?c½ËKÝË(—®@T°‘ŽY™ª°n“£%*…™É"Óy6Sº\u.¡x‡¨VÎÌ–­ß&ßS%±ù¬ñ…ƒ½òØ|†}ü-YÓVu>÷Ä×-Û¢VêN`„s$€ÓYZ³Ä½ #ˆ2¾ÕýA¹jÙS]d˜Æ ¢RÔzÒÜîëwÚ¦j›²sfÂü ÜJi_©ktdI $'Ì©ÛÜJ­ €ŠÆÈÅ"$**ÜQ‹-ƒåÎnAø©ˆËŸsÔµD~õW÷u”ÜÂ’Râ—Ëh ,ÈaÁnÊêBp¶$­wãvއñ_2x@ȶ”˘@&Æn£òðÊf…”œÈ9 êe2e߃vX¥$ÈH¶@†M¥l -$s¥‰­¯”3¹ýɱ½ÅïÅh¼‰I¹¬J/Q\tb˜‘ás)š9& ök}n‰I€¾Eô¬c¢æ™£Û«Ê- TU9Ñ²Ï ïš†2£vn3ç‰õ¡ŸŒÿd·il˦q‡>ŸÞòf¯-õå|f’x§xÉ€ Aì’$IDRúTtçŸ?Æ7,,ŠV ŽQg$Pr! H<u ²L6!!¨ÖLÑçL®tì-]/T‘‘ÜðqmÒ¨wÍ9OO"aÚŒ:çrV¶ÖëŠ5/È4ƒ†íâ8Òsí¹\·×+Âëà$a8[ Ñ%leWã¦gŸ•ù5¿áéà˜V…Ó»áÞpuªž~¯ƒï‡IW7ðæ4\‡i›‰w]LdqÔˆaªNAœcŠT4,uÀÜ\.¬¯ájLÅðÞ0„àe(Òê ixб‘ àvÆJòÖÝUÇqu†9 ®•hø‹ùæ˜çà&¶w œÆ L‰¦á%K2˜ÚáêÃúáÓÁgÁ#øæ0…$hZÏ€¨¨B 9r³0þ@Ø à!¯4øŒõøNq;f UŒ$ñ¿%¯–Á¬@Ëo‚ªÞÕÈñ„© – Då"L’LÆfâm58¼M®àåÖz²fð²HáÆ´†ú›^ÄÂò®m׫éU);ž[ë#_âj¦™ü%{\¾¸Rª¥äQñ©]1÷Lõ]¥ãt£}j#Ü sÅZ Í 9½AH®h;yÜ(y)^W^UH‘JeTçmf¥UIÙˆÜÕ>¥‰&Â/‹%1ë“~áÊ-ë×t”È  Ú0H¡TÓËFÇ0…²Åú46 S2q Çg¯W© ÇÆÉ–ÊUû#q~CBR@WK¨»‹Öb"%Ú`eOLçH+•Y¡)0´V6w—úÁÉÛ˜x`N¢vT¶rm‰ÙL.f²\( Ô¶ZâKiiš±`PhÄÛ’ÖwP>b„oÙÞ6D„8U¿¢>a–ãÍe™‰hæø£ÙO lBR@5”\…/w¥œRMYN¢iâ²IƼ-o/(FÎäèß*շб|ŒW֚ĔÖÅ×¹Æ{‰õCS÷$›`ºJ°•ª;_h$²·U`%qÍZ ¯©=xŒ ™H)I*}, No×tÕíÈæ #4ØJÕ"ü§QÔð®±à‡Ëw'î]PŒ'BhݕϕP€gÍâ°}ÌøF b«Å Šö8´Rßlx"âÎN/¢Jìv:aÆMEO> endobj 3163 0 obj << /Type /Page /Parent 2 0 R /Contents 3167 0 R /Resources 3169 0 R /Annots 3170 0 R /MediaBox [0 0 595 842] >> endobj 3169 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 3170 0 obj [ 3166 0 R ] endobj 3167 0 obj << /Length 3168 0 R /Filter /FlateDecode >> stream xœí]IäÈu¾×¯È³©a,\0 ôôbÀƒiÀÁcdÙ$Ámü÷Uɬ®Ö÷ÈøòÅBV¨!u«²’Œå­ßÛ~þçßþãô_?ýüñ·ÿ9ý>ÿýñ·‡îqì»ëNO~zý;=Îÿ>Súý¯ßNß~}øõò¿ß®_øíã¿^þõ'{ú—Ëÿ|úÿ_~øÇù—ž~ᯣ/ÿåùïóh.ÿê^þ~úù?üÛ?œþöôÄÛëæÅüøÿ2Ο‡óÓ2V^ýíá¶Móüçï¿ÿíáçëĽÅç³›NÆ;2goOÿûŸº¼àöøîñì?v÷¼h´/o²çîäÞxÑóÇõ‡Ï©>¯\ýTŒŒüt½Ë»~®dý˜àü_Ÿâr'kÓ=üyåê§r½\é銗kºËó¯äœþ½z|‚‡›tœ;¯\ýTæËž®y¹n23çvçGôòøçßO /÷yåê§r»\ütÍËÍ,7ûRùûÓSÿ8¦“ÊוkÊíjÇÿó¼’ëO€QøMøâ/_~þbü…Ô. ûú§ËÚ®ï|þëëåHúÓOO†ÂÅdýúÇÓ?^–ÔÿÓéëŸ΃íoK¼~bGô‰ñð“}ÒYøÉG¸‚_à'çø÷à§á˜!þ „ÂO›4ߣ¼Sx ®Ú൫î>ÁO>熩 ßÞ)>·òOS¥kû~Çi®K¤YŠ}þzÀÉeç9û‰`IŒ¿“KÖd’ÞÔªáéœoÎ`)”‹ð 2Ib| î—\8>mwÝÁRDUÊ3Lß…Ö3²“°Ê³ù”å}°â1PÝ>ƒãª% Q(|:Lþ»n¶ETQ5ç{jËÛEU#4ºš¥â,÷÷s Œ¨ŒÏ¿ÔMWçTÉDh=F³”ÏsÙ§íÎØuhqkî©÷n^×0µæ½xÚ6 ŠãËi"ýÕ|e;áy šIm&î‰ñKO²Xd„—uÝ^ “gœÀZe1îLá¿¥U’7Xkzµ`•·P—Í×Í'ÍÇ ¶VÞU>FQ„‘ÆÈ%™,Ƨu êÃ…¾¸ õv©ÙÇŽãfþÑIMR­|Œ7%P´A vͨgû„,<øÌZÅ[ô˜ Çz ¥u¼ r©±Z7’Ýu#9/¼ä÷W!F•zGðû"‚ð‚õTi„X¦›BUyKÞº)壇ÊÀ(S‰ l¤OO´vf0ª˜ñ¡pÐç3@2eÊ¿ÛNé33}7¬’SaP°ŸÂ•7ÚN1¥4<»ðߟ1¨Ò‘ŸÞ†J?(^J&¤+çÒ÷žó`Ìß—Ú ¸ýAqþlÂ[dLðÐr"*•Sò·g…æªèUnјÉl-VT­)7ÌI^IëÅwGaÇD#ñ)î /ß3±ù‚wu¬ -MBq*c ðpÌL'N÷P¬t‰b_bq¥¸j‹1kªtÌ隽õL:|*|¶ P]‰!åêÊ vX'Îò;Ê'cD0(AóBäp¾ Ì·*SþˆQŒ(ÁL3?vףΓ˜–I±Ã¹§~@ "Ô‚¥ýBàJKw5%¹™`?CPLÈ7âž4»Õš•ôèXß­íMÌ 1õ¿Åçš´ìi§ 4™Í˜,žø´+”9GmÜŠ Æ\\¶y’¼C €§„‘´òý¦¨lÉÕÁ?*0 wR­žJœî$ÓfIÕaRζWÛ ^ !0”3™ÑÉÝÔ ¢«§ë¼`D­Õß^-qæ›Í,3ß`>.?îpYb¦ ;&‹MxÌÊëFÕ~H-wŒéLha3ÙrXx¨Gæö¸q¥~Å'\ê"jåÇZ§8ô¡½£á‹’1;f¹l|Òšõ[UP¾‡G˜«¸ï_šZC»ãë” ×S¼Z_RÍ·Þr˜jš›ÆÀy1`#²Ò&fÆÄä‰r¼ˆkùjx¿+"Ê0Ýî¿ûÏZ[<áñ:Îr¸üšëj¡«‡ûæà1"‚K K³,,³¦á‚2\´W ”áÞAø=¸  ¿‡¸ᬉ^HÌ´(¡“êYwŸˆÂn§¡V¢ä0ꬅsÃSÃðmcnÄ· –ݱAÚÙikiGÌ^$´t4úÇ…Âøi„ì蟠rá=xmø Ö8Cë¬é}0Œ©WûñÐ1fø¬!× RÞ©ƒt-¬ S¢®U‚%sÖõ AFëA©LÙ“„v(žä ow9õ»“èwAK0çËèÆ^Wå3ÊgiÚˆ³ rIââu:ºte´®ßÆÜ6£ ð'˜àwO@–؇OÃítí<|s”Èp#±jŠƒ±ß‡“:úŒZ|V÷ Ü ßþN.-“Ö£V«9XÍèFÞ†bQ7çÔšmàÚ©_]OÕ4vÌtqV£2›€uàs#(qŸŸèFï<¦QæŒ3¶® )Qðs˜[MÆ'ªë5éZ2M^g“×5Û“êúÕ™°ö£EåêðÇÎߣue4ÃSÁxžk×lœöÉníI 4A¦Aى˯[ª|4&—ŸÔô®x§Mï^õ®u÷ÈŠ-Òª½™š)¶bHÐFD¼Ú2M×2SÆqpvÅèF. #…+À§Cð)•m¤ë ©Ú-Æ­-~?1îê­,oWWZµ½ÒÐת£eºçF5!j"°t¨ÚÊz?Ѳ]ÒŽ²Þ=XÍŠn¿²Û%ÎP>¸g0«+­ÙÆîs c«ÌÆÙ繕×SÍÆi6N³qj±qrI1ŠÞ˜;mSýÓtÄwø†´ŸáÆ&`pL]<ß=Ó~§åðÔý‰²Å„)‘¨îÄ_˜zýÎhÂçg¢>‚σ£>7V¥ÇŸI¾U¯]Ï·^gŽ©ù-ŽGTM}Å1ŒY»¦oH;õ/‰É­!mªÆ Ä¸"•)tLëkêixD×ê˜9›ºÂqt|ƒÌ L)ÌGt9fH4Ç$ ç‡@U  vÜ^U6)UÊdÂ[LÞÏÖOýÛ”s¼ŽÍiå>̴֨À«ÆÚZ_‹îÄUå”z(䮿.©Œ×®Øìd½Íå(o z#úÞS]às™›Fùv×…±*4j¾ó´ðà*¦èijà²&¾Ã [3ªÀ(¢×pEª·g.Rµ>/¥Áh9<›YÔŽ‡w2ÂÀ[éçʹÅeòV(iï `Ÿ–A67v»ÕHa  ¹Š–‰Îçv¹)¯ï!†JÍÊT¾ÆFÖ (Ìì[ósSNö:ÛÍ /7dD‰ ]_²–‘àÍ`Ø¿ÁÀ #Ý—ˆ)€Q’à0‰Ð¯ .6¼H:|?+P)}¾n5œ>ìÐFl?$eÌÛÈD œï^2ö–ÿ0úuV?*ôaš^¤²1§6Õv r<ß#ÉtÀ–¤¡jZtÌD)˜aßĬwÁ$\KjÚ|4Žlí<_ú;ݺ[´aúàèTp°²Ø.äÓò ¸Å„rÄ„ÌÞ|ÓÙ@@ÛÑvaI ŽÄ¸‡ª©º‚ÊËkťɩbv«YC %Â0.$‚1@/|§1쇟õH qñöËfõÏpµØí²}6ÌHp:™óÛæÈ3žÝËøª«ý`ºÇ«ñõj1_Ð'óñ÷6´Ø„§}"ž†¿sFßq×{0îñšäøêig¸6‹>™[¹?ïg÷ã­~ÉäàÇ[‡jÊPÖHž»+k’qÚ÷'Â+Å 2ƒ×¨·a FÊŸäëz’¡¿¹¢jKÂ8á,0©ã‘ÊÄ!GLø˜¯p´°Tr^’ÆÁïÑHÕÀò=GõL0.ÐCTÁ#H a¿O‰º´à‰8®p-MÖ6Y+’&·ÛÏO•Å©LÕ *õdû­{OÈ=LˆD¿Ö XÐä|¨‰@‹‰ ¨Æu! ÿ…ÐkÄ~°ñ#Ø: é[œC}¶N¥ÕDh¼ò®Ð+}Í‚æ¼þd 3Øyq?™c(ˆ¶8ËD¨˜,ý= ¦¿R/œŽþ Òa Ö–ýQ^yÊ,yê™5ž9Ã?>=ú©4iúá'yø-[Þ0ƳEÄ´Dò#B•kÞ÷úá\ø¼>7ÍÙ¼þÿOƒ‰DVˆ l׸©^ÈA¦1ÓÙñ¶˜Yð÷]ªgkpôFNÅ‚é ª î™ÌíÌÑè½£”QË®ØÓAêÄ·ˆ:åj=F"–,š³6Ð^LeˆpR‹|…{²Œ™Jx×”v©Ù)Ù$÷jyÝ«|M÷Òßá®ñ™j)„”QÜU¾ÇÁO¨ižÌôØý\˜ ;±¯M-5u½t‰¦zÈ=Ê…}Cªè1ÅâI®~‚g#à÷À´dü4a2ägù ŸNù3pXÖ`:Àü¬;[îT˜ŽïŸ<7«:»KU!îÇýíñN«žÉ?aôGùß¶…:‡¹æ=‚ÃgML¦Zå˜â>%f,Q·€yóñIÖ‚1ÓÖõIqÝ&Ìn!¦© ÜÄP9æBï gÀLÝ!f`Õlãx|ÛºUëŒìÄŸd’ƒŸS¶GÌ$8 ó¤¦R°°U‚mC¬]ñYãÓ!æs1gwÊP#{•§p²Wy’e®n™°,)»HmÚÑÇët‰WªNݰÒ~PëJךÛsåª}ÕFc*ÎbšY0Í•ðw4’Á™Ø7ë3'«R“Ö‚„Jaëú΃§p›ÕÎÛ€PrÖ–ö8ɯ ƒZÐÖš«)ÛŸ¬å†2`=Â$W.dšê ì‹áTÕÑ–ØØò6ÞØŠ)› ¡¹FªI¬š+ÑOÛ>”{6õKoP¤{yeÅUÀTS¢Þ*…%ìÂe9fÌ<Û=X¦ŸÕþŽiGÜ:®ÉŽ™oQ¤¥%n”{>|Ý@©®RPÊ[Ü•²C¡Rcªëñ qJt°³áEƒ—&W?uUÇ‘jä‹u-dƒ+È‹•b#Öœ«M—Àô¯XëS uLÿb ÷.¢q¶’w;ÜRI”³%rÍÄS)8Wíf•­é¸îä’ÅAªv¸ÅN>®˜ilÍçÛ"aéóŸ÷îäæ[v•ú–ýàƒ»j)U¦ ” ·4—ò4›:ÕðqöUˆ=iòB¨ôær—·bGPšàùñ³’0ööÑâ'[0ÜÕ<%bÑ! ³»Æè-ªéÃ'ÅÁÃÔX”Jûçˆ8„sj”³Û4œl ÛØ¥é¢B:L‹Ñlz{J­wnà×4®ó #^’+ÎÑ(&i¨ h8EhJa—ù”Ø%º© ‡²ËΕ¹ì§lMìÆ%€ål}î‰äždk¢7J.¤„û>ÔÂ*BquTÆœVœ¤˜Kéò‡²nЍ&W˜3×Â|GÇTM °P$ʘ™Bë1rø²±ÿGÓ:ÂLT8¦ ›2ݾsn»RÌ4•@˜×§Rª:H3qdJPòºù$iPÊÉ/XÁaaqÏÔ£âžiDûõ¹Dîðm+C­éAK× ë,–©M•}Wa5s’WÇMŒ.è…™›1…FDÄLË@Dé ”¿>¾\R­ó/õA×»|+½:_/&†§;o+­Í^aM5{ë:¬˜Vd ¢ëÑè–Àh9³Ðu†Ñg¥f,$¡gFšRËL} fv1ãŽhìtQ‡ÊnQÍ5)™±]]è%[E'áñ('À&AVóHÅ–š]MjvÊÔâþ(I*X‘)Á"û{uSè|¢wW 5È#W;û¹™|Rk´¡©¨‘®c*ê:©LŒ'"`™Æ€VŒ%qE¡mã7 ¶®9hÀ¾aM¾tq’l¶Zñj ÖM¤†DÇâÝDr¥…1B>&j~u—ßÂ^žÆ žA úލ$e€b¢qºµq¼¸7þFm¼x/ž†Æœ[]O/Þµñââ´ñâm¼¸|sm¼¸Ô¸¨—è ¯ÆZèíÖõ ¶Ó°Ý‰©œ˜Æ(kÓKƪ~4™ï±YŠÍRl–b³›¥X@³¨Z—ÍR%lq{E°.›}»fY±ºŸ×â˜Ó-¦$,½±Ü`øKÂÂÎË ÌéxmPÞÖlÍáÙ†ºÑ<õPÐø“LØ€Çg@Xs‚om³0ÿ@Úø‡°¿zla+Ûø¬ñé`s0qÖx§ U1²—á9Á2#d¯pÖðæŠÏõ,?ddU.4 Ë7Á̈rõ—_Èk™9µÛ »³SæÝQü4l‰0xBñx>¦ù#"Ƚ÷Â'àþÖ•¤ØÁÞàuå±RL!“ó¨Ú>wÛª$•ˆ‰ËWÆ) œ†¿I+xÕ+ÎÛ€&·Sf†”év}ÏÖ!Å„”j¥BRØUÛ…ÌÕ€T£e•çÍTîë–VÁâª(oáª5h–n¤µ·6¥Š™Òâ™úTTDôÄ”‰‹Í"š&cu åjÍ™¢[oÊêøÙ5ü®O©>*¤G°.õb zbø$¦#c°1z;m7úò…£TÍ73¹—!QœÂ㚘OrÕSêtúeÜ¢Ó_ òB¼xµà>(ç7{Â1¡[G“FÂó™†ð|ˆâkª%*áñP¶|«ûjE…[0} Óvò¾CxpÙ:†$.tßg#ò]·&Û"wøkÀÎ`fŒ/Ó±e]Ä(¢?©2b©¢"B~*-‹·Ûa˜ì;ì# Ú×-'Õä Ù§?åäFãCUÑ‚GÅ(Ãz¨5*Ò±€( ˆÙƒðRO­ÈÙï¡»|Š„†¸4³ƒôª×5v³D{RÊÜj ƆĘé·£ÎÊæs“%q®“Ž­¯ªù„Ä,â=K[+“ø¶A„YôKø£Òeñ¹môèεMœÏ"´ u1dŠî º›ä:÷Õh÷ÄãmÓ+YÓ Á¡2Á´=°Œ‚À¡€•yZPyW³üTÌ Ý0¯nÏûl“ÚŠãÄ”Á$’¤uœt“½©¢¥âʼ‚ÖêéñÆ[ºåw«!s¨Wg`o“P> PÁÈ;Æ8Ûž_álº}›,G› œºF6E¶Oòáo.P0 LHî‹_üFêUFS`áÁÄQ4’ú#¢%-^¨/Ì8ØdôçÚø4®ÈœisD´;š£ðN™–_LÝl;ÅTE´dTéîGh5HìThõTüæps ¼ÜÌØa®Çí5ˆf`T3Vµf=+XýÔݦHax*Iƒ‡´ªd®Zù¾»jTIJ“ÏûðNÓöI<Út§iºGËo€y[Âkæ )„7¡4i(>’Dz/"ñy±jÆ&…ýàƒÔ€£R‡#b™ªX•ôR"x$`L‘›n›&Ii;Í*·KÓÍYÖMc­†Y«Æ)èµ=f)i…«˜P¹ ,'ÿâ=@—ê«T¼¯eãªVtÆFB[9šLD‘ÉÝÉUËÎô cÒä™èŠnc©R¹ éHÝàâ!¥rÓ÷ÉÐí_Áø|T²:m×¶Oo] %…3Ädº Æâ=Àjvÿ³u­Õͱˆ¿ã_er¯U«G„.[LÎ:Óï‡AŠ‘O%ê]ÅÎ[õYf@¥¼èêôR“(-Œ’†SäÅøAÊtüªÖ´™‹”œÜN ‚>#¨SÃ#,ߟ¸8n’'CÒ‚'8ßf7 ùxü~~0‚ö0 ç‡9?8…ÙχäÂÉÍ#"¾_ðfdoÈ®#˧ m‰·IˆžÑ”’d’®†rh¢L‡à÷ý¬ÑxÝåÉ-O‰B³¸%1¡RY»ÄßW=Ž„ op>Px”/£‘ÖYŒ+t’RKùÅ”°€Ò±ÎLjq ÄNÒæ+Å )MRó%~1ûÉ ÐÜg¹î¾g¬1 ´5s˜>¨Û3>Bjੇ‰§ådŠ) »( “ŠéRs²jò ÙtS‘t}ÊðÖ³<¹ü9}»Q®üºö Ïôædã;ódŸ¬ÿq¯o‰—ë^Ç7çºWûhŸOg¹×aùÉìûØÇÙ:uCRÏ'ô·F#o­í˼ST©Žm{’-(Ë ÎlˆÓÓ1»¿± ƒŸ¿3+qµõWð5KpOÿ¾¬ø¶rl~àS…$€Ÿf>LJ»ÝÄõçKñŠMÊ8"üŒØS¦ÌT -PŒw W0[ ¯˜ W.2/y–ºÁÅC¾?¾ûù~Î;÷8KÝ,¥è,+gý³¦{N¿>ü? m°[ endstream endobj 3168 0 obj 8250 endobj 3172 0 obj [140 /XYZ 32.2500000 770 0] endobj 3173 0 obj [140 /XYZ 31.5000000 770.750000 0] endobj 3174 0 obj << /Type /Annot /Subtype /Link /Rect [43.5000000 155 548.250000 169.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus >> endobj 3171 0 obj << /Type /Page /Parent 2 0 R /Contents 3175 0 R /Resources 3177 0 R /Annots 3178 0 R /MediaBox [0 0 595 842] >> endobj 3177 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F1409 1409 0 R >> /XObject << >> >> endobj 3178 0 obj [ 3174 0 R ] endobj 3175 0 obj << /Length 3176 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯ès·Å‡^@ÀÏ90l ‡E7›`±»ˆ³‡üý¨[RÏŒÔ[üT¤¨6mìÎx8M‹õ®bñõŸ?ÿãø¯ß¯ß}þÏñëðõÝçCqªË¢ÿs<ÿ}õüº9 ßë¦<~ýõðíøíðéð©ûÿ·CÿÏïþÚ}÷¿£>þ¥ûïçãï~øãðKç_øõP«ºûúËåk[«î»âúõüóþö‡ãoçÇå`^þû•2ek‹3w–þv·©.ÿúÛáu¿Ut­š¦8*kìQµVÿûÏÃOÝãôÅ©©†?ð{rñæ¼x[ênqÕ}?_¹µJÕ•­‹5[¬u·Œ.t}TºíN¥œ­sù+3» 0¹Ò*ÜäÈ¥‘¢L¥œ“Ÿk”©uiϧ|>á²it÷}m†?+QV›eºhCœÈ8}ˆ1MÀã¾@.Ž•ñ¼ñì’¬lÍ€ýªh è:}ü›¢ûG°Ã½@.Ž•ñpñ삇kŠV÷27T‘þÇéCnXÊ9C.Ž•ápñìê|¼Z•USu¼Ü…éÿ¹n7•ÏA×6¶žæ—ŸÜ6¡ìœ/Ë£e<èùôŸ|¦Á°ô?öê7Çß~9¼þØUuüòÓ™Ü. ^¾|ùõЭúêl¡v6Ä—ìà±:~ùù`OÖôFüù÷ú‘ê2Òœš¶¨tù|äúŒÂŸÑpC€×Á³ÁϘB6<‚gûp)OF7j!ÔEÓ϶dúŽxL!Ñ A)ÄŽu gƒëè~6¥N¥­šnÂé:¾t|†¥´­ó”Q“ƒP† ÊÙi2|‚O†  ÕïK™qº%@rÅŸa䋲pä½mtÞ¶½EJ]H£µf\òÍQ=Ÿ€ùˆFDU§ª¼Àÿì3Ìl-œ­G”²ãÐ{½E³i>S`zÒÓ ‹×:ª%v ×Q\çÜ)\§x‹>càÉa¼©žýÚ9Ëláp§ƒ´º…Qˆ7]„ÀƒMÓ6͈Üz@T=ë–ò2bFB‰[=k¦¿Š ‡ØÀB JÇ:ZÊ,^XÔjÄjØ1Ò c™iyÇÖEÍo<›ƒð u??[¸°Cÿ3?åÇ‘Âã |p"6žƒ1yã3F¤?)YÃÍÇÎ…[Ç´¤?ú:E!uXÛN•Ø<rß.þUÊUÀ4BPiñ¹jæšÍa]BJŠºKX¶ÏŽ’ÉÁ xaFa9Mˆ]Ž˜ÄöJ2™(€ˆm‹‘#+9Ä+«-qÈ §æ‡ƒb6ÖU~’·—:íè .a­È¾ ¨XU¡Ë‰f¥lì¢0ZÖ(Ž$l÷¥›" &wÀD¸P‹("^°½"eÂÛ+RTÁcXº;‡»|²OgnˆµûYjoàÞÍQø„ Ò7_C¦Çô”´™ ž°Ï–¾¬ñ l>˜°˜©4&P ü^œªZ½Ì )£òT´“ä –8C"EŸ–ÂaR¬™™8&“ÄwœmàHêKHˆ0=Uœ€ÏÉÃØŠäneƒ= öªš™aö®@¬p/#pÖÝfYÓ™"ìY óÒ²TVz3ÝþUl.)Q ¥Úq Œ°¨çºŠ0€d§>’[´HrÎ`Œa²§zˆ~[È€¦2j¢’UƦCg4ùòô‹ý E>ʈ‚ê²§Ÿjâµ§ Ü7ð|cd@Þ­ÏX8òÎFŒ?i?Ž<ÒF<áº}ÐVµÿl¯SÁÙ>BàgvL/mó ô¢á~†(Ñ­‘päqö˜b!F „¯Mö½Ù’–ï¤QT9ÖÛÛ¡.ùFPÔÈ÷(L¤rvóì%$Ñ­HÉ¿ï϶•MÒRN SˆDÞ mÂ?¼ŽG˜Úáóá –18Џ9ËÍiuÆ5xÇ8#ôqk^‚VñVýC1³èÕRÞ™šVQØbº»¿;bš.ØÜì/C›U£·ƒHŒƒ+=^ef Cw ›“·"PT¾Ï«ÎZÀÖ&Ãt)-œ-sSÚœ‘r`+*ŸU&2æ-ÖãP[c\aü:F Ô6&DM:$Ìg)·ûÅätS¨5v9Æ/>áw§ÃP¶ƒ®ˆÄDÙ«Û1ß›6Î`,éèrû‘„9#[ÒŸ•Md>ÛÞ^fl߸i—|–-é"ŠF½“ò¶jt˜q÷+ª¥NèD*¦ î™äÊÃß°ͦíóJÖNïþî*ÑÐÎÁôÛc‰(``£î§‰Þ_}”r™à©ú²3‹_êÍXý,´¼Ê‹i<ó(jì»éì‘ï˜myÇ,Rµ•£8 KlN~x%âÑÜ ›L3|3në̪(ÍDåQµaŒ [ÞQM¦`‘©»”÷±ºu1ç„ ßxÄ—X%z@äû|ë½¶ª^x+PG1´…Á:G€§²ph–€À±  ðapÊ€J@à`*±Îuêk®%£˜*"Q†@8×ѸÄS/`bS… ó™Å‰X¼"¡bˆÔQÊ#²?/Ü“veaלV¤;šÂRRÌ;Ê¥6{À<Ö@XB°áHŽc>‰yZV¯9-lA݉³»J­Ù]$ît$Î Ê6XÓ`¨1ý¾‡`ØNÅ\‡K+k5–uÇXPØ&el«¨R¤Ye%,‹ey3šÝË®HƒúÚ66õÁ³wP^G5ˆ²z‡7üh;a¹‘gTêúX•ØKª V-¯¹s¤É%=s¤)GšÄGöiÊ—ÙY—k¨"a,nïgGÕ¼í.â)[PO«V«b–‰GÁj³*Æ—£`Ž(˜%´`4½•c]!¸©\SNXâæXWú±®º^åäXWŽuÉ[jipF3Fcƺ}}v(Ǻ ƒi$Ǻr¬K|dŸ±®|!¿H¤J¬±Õ êKù1¦ÖTkb£Ñ^ÌØ<ÆâÐÂ1O«ÉЕvuÄÓj‹GŽ€¶:G@AÍÔÂÆëŽöê†ï±$ÌÐÜdÓ©ªÅºn§Üôhq«íù ž\ò|VݧË}Z69Óàô©6T9<ˆ48£Î¿Khùá´IÂ2-Îhå+~Ý-MQΕÁMZ–7# ˜&ALO=Ü&eÞ0÷ aÚeâ¾³.,ôm1¨^¸kDs´GéyÄ<+éÑCòÁÚgbjŽØ¹Å(ýýõÎÈÛ"Œm*·"öDÖy{êc|TÆ{e*Ρ—jMÎ eÃ~“£Õ£ùZ›KRáyêÜÔ¬ÉQEãÀ]ÆN¾«-w<ã`Ãò)‰¸ŽÑÅšœ3±ŠÖhfû´$ò"'v²½ÐóŒY“ÉöB¶îØ ¹oÅží…§GÑ^¨ë½@Ú®©0Ï15²Z‹ÈÒ¦¡ÕZÕÿ#a£bj¹¶4KŸv ëñˆƒFsÔ5Ú‘­—L]Þš59¯ìEe/ʽN¾í‚-u/Ê”±3œ1}S¯É8E…´]ýf¤ s«ƒÐ÷ó-¶} »ß8qp4Ö ÌÍgQ뛹 àx ×ãbk•y# BPBÚ) ÛÓ[×*yùr§~Ù^¯•ø4«ð‹¢¸º—²â‚KüF$.]þl8ó\±ã¥æíŸsÍÕݹº{ÚÒ«îvlƒyšt¹`Þtö9„¸R!¤N©íD©8DfCÙg™Ù ¹ÊÖ÷;N¾×ÿ7.]»X™áC F¾cɃ_)w¥‡hÀ‰°˜ :¶&æñeæij¼Qi8³]L¿üÔüþ˜æ.Þ±ñ΢Õ7”DÄÔ ©Ì!fìJ,ŒåÄ– µm§^EÙP8\,¤°X!D#@eIαF­Œ­Í¨ ›‡Í‹¬=l£8Uµzy9»—lª<­y‰®7p¶ÞÒRú4µ´l5 ¿âèÈ*{uÙà®Â ØžúäA'˱i¢`,,¤Îâ±Bz¥ºö‚ŽÒÛç½ëXÁ)Ì‘ÂÐçHa°>ŒÙ„£AD`PV Y½u±Ê9Û†6z¢‘»'¢qs–šúºhÓ^Dƒ™ÎÁŽ˜ðv°z{ï¯(ýˆ0ÇŠê½àM¥)Å ‹Êz¦$sàœˆô{ˆôñ!kGcl[Y·]4#æY3;aöÂßZr›yQCïÁ[šIÖ)KxPþŸQ ‚€Lèr¹Å☗ÚÓÑ ÀÈRµ¬Ó;Å+hðpIÂ&¸ë2hÓÜGá}íÈÈF¢žÀÑ/°DÇ|·¯h@$«NǾIJ#]/k&câ^îk;xW á…E#›Wc¸—‘ÌjèÏV~!£Ëç –»°säÚˆŠ/J³aÛ„)ÚñˆÞ.×>%´l*˜É"HHÓ "—e;ÕLÙŸªPxB3O"ABÕwzÈ!!bú}èpÓJòŠ£d[ôK,ß‹ªÇK8ì´ý¥¤]qòf—°…Ë> ›Òö©ÆÐAü-⟹óR9b”òÒ$Š¡™ØKhö .y9J™hI,D¨Œh7j—Š{T¿E<2M%ìr˪×âÝðj¯ÎÂ^"=Q•>LûÙı˜ª`£iL;ºÆô‰p|†h¥LQ<ÓÐÊGkè*¢ì¬ÆV0žpÉ#ß×#;·‡:¬‰#o›ëóP×*ø ãé)âA‹í¨µ°… ð£/Ðö.Eg³Ø¾Å8Àà§Šñ#p6Œk¼SE<–“GŠñ)º(ü\×m2?'ÀÏ£²h‰SpH”Ìé.¯4&?ëë³O™ŸSàgüB?[èsc¼9ø9s-§ŸásŸQ5·½Bš9=N‡TáàtŒæñÐ<Ó£êôrl*–9=N×ÄÓÚŒg­™Áó÷4+>¹˜œ^_GeNO€Ó3??Þæô¨:½½ÞÔÌœž§GÓ騢ÄþÃæ<³Ï+;"rzsÍœž §g~~¼ÌéÏuz÷÷ø­ci'Ǻ÷ *˜›[âÀ(s*Ôù¾ÍQ5KÆ[u¼=7Ô7Ê[{nÐ'Ý7x6ÒG‡«ùÈpNŸ†û>Ï0×Cp«æ÷=Zgxö_L¸ÛÇa§èʾ@bŸ@* °jØúlƒCáõ­ék8bÑ6ž ~f( W^[¯ŸÈ–%¸ó÷Ä/â­ºlŒUHÌl˜8ÌxýÏŸ¨) à›Bðh0qàãt¬ÓL@ÂûrP ¤=Å0¤£¡˜]€¥¡ô†ŒêS½ØY¼AÌ(]ÕzF© s„ìBŽÁBóY)Ö]Mòéøéð)> endobj 3182 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R >> /XObject << >> >> endobj 3183 0 obj [ ] endobj 3180 0 obj << /Length 3181 0 R /Filter /FlateDecode >> stream xœí]KÉ ¾ëWô9€åzö°gì9Ø@Aw7Á"»ÈdùûiZ¤­¦JlªÅ5Ö3ŽªYEò+’EV¿ÿÓ—Tÿü½zÿðå?Õ·áëו[7Ùmÿ«6Þ}ÿƒÐ®‡ï«¦ÍÕ·_WÏÕóêiõÔÿý¼Ú~àËÃ_úïþW…êÏýÿ¿Tû{ÿÇ_Úü¯«Æ7ý׿|íßçö_7?ÿ×ꯨ~ÛŒ¸{ÜÀÌÛ¿ó±î¼ß°1òèçÕnšþåÏïß~[½ß.À´§„&¶!T>ÅTù.…ê¿?­~îð:¼[wÁ纭C?ÇuëâöŸÜG6aóÌÚ÷Ï ëÿjÒá3·#¿üà©í5åZƒo9/¿,ýw~døu—¼oêÔ¸KTêeÙõÊò²Dmù`wš0KXè×—Eon0N' ­šÝÒËb€¨Æ%lp«~€Y­ «NJ²UéiÂóÞ—G!ü'€¾±ú=MP60?@…ƒ¢±@g•}·Žfµº)Dԯᶬ¼ÕüiÂâ4Qûo±€Êhæon ˆV ¨ ÊÆ¬L¾«Kßä5»ÎOá`€d,²Õ ªÂüXc±Õšï ‡*êBcu‚š0€ÈïA´Z¢3Ⱥ|4`€Š³ÁÐY * `ÜÕÃÊ#EèèŽÞê5a!ìÌ®åFaú*êb;Ô@Á £V8«Ô„ø&/¢ª¯Æ,«-”;Ä9A7 ôÿ:hB‡²ïþàø(† Ðð*$Ñ¡¶Ú££²ÕpC:èèDN­U. Žá½ÉÐA:༃$:dgõˆËEÖ›‚ 4 ƒŠÎÅö³3tX:~ç¨á†:¨ÈJæh5ŒšÐAÁÛ  ƒŽN§œ­ºQ:¨~ã¡á†œï ¢æ)7V÷¨ ÄîI6K×€ÊoPÎUDjBÕ·§¢ˆ¡ƒŽZÉÚ[­¤*tÀú5)cù”½ƒÍÐATtV×Ñj%U¡Ãü•Ôe½—Ùms~ ëvgu¶ZIMè@d篱6ÜCÝØucµ’šÐÁ0`y”²è ê;tV+© Ä|‡²†(¥# gßÏÎÐA:,R$}‡&X­¤&tóÊögnF'šM²ZIMè`°œ5À3ݪŒ»Å>Ü&)-1 ½„È‘¥"‘}»÷°'ŸÒ«1§§ÄH7.Šˆ#fŽ£ÁZ.‹àÎ$>Bð-‚+HûgGÂøY4,+bÑemoÄrq†-íé©uÛR¼ß w8#1Èõî=Ü× ú¹—:–Pd±t VdLa(ñ†1¼1BLPäó÷Äð¹À&‰=EB òt5ÀÈ@<çpOdÅbI*4=ÆÔñšëQdœ¿~БÇ^ŽX´Ëñfa+µ„¦o»ÑåyªýÅc7°œ ¹ „ÑáŒ%'p¨¾,Ë=²¢qÃÇÉbÙr‘Š‘Û$¶S3Ò÷,· o^¶Ä±´º•+Lu7ç/WP\9YÒ’¯¸‹åm¥ßwÛØñé0#à`áåу±òcQaãÔaàœV#œÛ¦×?àúʧl2A1?Ä™9‘ÇßÁÏ)‘-Ü™PÔg4ç8LÊÿ=?<¥­oñXu9!A+aÙâÚÙøáš'=Mw°› MIÞí@ ã k²E·Õå—ŒóœÈ‘G…mŠS÷Ï©»rÖù%éS)ÛmÍí]ÆO5ÂŽ¢¶˜ÜY[Ll uø |qäs@pÛ_a׿ àŽ$Ü‹›¼qË,”î‰Â+Š»¥ˆµÆ—&B™:ÜPŒ;¬z€5Þ+G?Ã6›î*¶‰/—ÃÖ„-ƒXù²×@ÙKYíü¶!×jyd¬5ÑÉAUƵ^k€G#䱆Ø?ðºa+Á|ƒbçH?kïY0Çðºa­bpMø+x—ÁŸHÁá @ )‹|:v~¿ožØ æÚ®ÒpÖDÎ%`°|ðg ÞÆb{gØsÜ_¼]Ô#"2(Ö„ŸÃˆÌ o¬,×;YãFÁ|ÏùM‘51oLaÜžBde8Þ‡b›¹£µ¾It¸#ù,›4:o–Æ*–#Ç'ât|y¬Y“)ÈXS/±&!|™Ÿ³ R˜ŸIÛ >\`›Z•ÕKœUòÑñs2Ìi°ìYóŠÎœ]käŠ~¡ÈuG{ºa´éWwl72}»«øCɾ›Ç9½M]ž_Âós`ÈeÈu—z-ƒu7Ê)AáTCa×b`„*bÄê^$eß¶È>â*JN½(\Å¥¡¼Ôº"ˆŽÅ×+F> >5\Rð ea_1GG01úŒ¼ãh6ã%œóWNb™²2>ø9ŒŽNÝn†RÀ”²ÝkøEÉ…=(Ó71}ci"§ë£œî*üÂÇØ îFiWÃ%wÞvWã`5õVSOãåü5õ ïØÃÙ ˆ/x×"f*X9ŸÜ%ÕD§#ßATq­LÅ$ÌÞ÷ˆøŠÑM-§°ÔóãùõÒò˺íLG¶"¥ýì³)_’ƒ]Z¶"B®Å°Â"NËpÐ^¾åÍL«˜Zey³åé›åÍ®â5»óIɼYö»³#Ë›YÞŒÆËùófÞÞéÆn˜†"BƒDd"ÅåxÑM ‹â0:·^âŠç²w4šg¤Á‡h‡)¦½”ö\CÎqâœøÝè(ÆQÂb$·ÈB6²Èyw›†hdÑíßdi‘…EÊ# ,â.;¼›0îÌÃ’»Íh„swµdSû‹ÎŸg`îÇÓ³8E0N1oj 7âþ©‚ÞT]ï³Ã³{Svoxq|±{à ßn^µ¯š˜®š’ºogÿ9UŒsnNMQ»ÆÀ"ãÃÈÞÜOßê G=m3.-Ì)CË ?˜s?'ü ÁÃÃ`E¼œ,© Ÿ¶qzn°'žÃðkXïãTÏîoQ2£Ò [±ÖŒ;œ0úrlóFãt†¿AÔñ á «_€“5ÃVψ?0°Þ/†?ÃYkÆíh,)02Í¢»Q¸íÚ’ù÷<±bcMÑæÍ2™W±³tê\¸ÿS=÷ÓOû…3^ Þžb-ú¸v>÷ëR…wCîÔ;Ô·«ÕœxíòÖ ëðò.ñc”­)Ã*„u·ry•×–ƒS/DÏt¿GþoŸ‡™6 ¯”޶եt?ø­åõñ‡MéÔð ¤$4 GƒŸ^Àç'M½yU[®Âm¾ï9~ ©§ÞýWªg4¬q'‰íÏ¿§øCˆpx(¬XœÄsÚ–ð¼mºç9ÆõhhØMg¬ÒpÂq#†ha’+‹'ˆ /W}¹¡4.®=Ób0h~×f>º“> endobj 3188 0 obj << /Type /Annot /Subtype /Link /Rect [150.750000 407 181.500000 413.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_overloaded_methods >> endobj 3189 0 obj << /Type /Annot /Subtype /Link /Rect [219 170.750000 249.750000 177.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_overloaded_methods >> endobj 3190 0 obj << /Type /Annot /Subtype /Link /Rect [43.5000000 149.750000 550.500000 164 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn19 >> endobj 3184 0 obj << /Type /Page /Parent 2 0 R /Contents 3191 0 R /Resources 3193 0 R /Annots 3194 0 R /MediaBox [0 0 595 842] >> endobj 3193 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 3194 0 obj [ 3187 0 R 3188 0 R 3189 0 R 3190 0 R ] endobj 3191 0 obj << /Length 3192 0 R /Filter /FlateDecode >> stream xœí]Iä8z½ç¯ˆs-’ZÁ•µðÁ@£ ðÁðÁ¨ñLcÐ=pyþûŽ…Š Qz”øò#¥Pp Ó™ qýöõ—ùú_‡¿ýóðËǯÿsøn~üúR›ª¸þïpþ÷óýº=ÚßM[¾ÿñòãðãå×—_Oÿýñr}áëÇ;ýö}ø×Óÿÿ~øÿ<}øû¥óþxiTsúùûågרÓoÅíçùóß^þý§Ã?Î#öÓÙÅ ÿþY™¦mõy3Sÿxé·©.ÿþùý/¿\ lÝTM]TiNÿéJ}øßÿ~ùëi‚~øâØ•J¾ÒÑç™ Ý”îŠCkÆ]þÉ ¯" ÞVm¼Á/+?ejå]ðrëâôãr@Z·òGô6|„ó¯u×Åü²rñS±—ë]òrM[_¨«"œÐmôÇ_¶E¼Á/+—>”þjáàǶÖMY] ×®*cq­©#œÙmôr‡xƒ_V.}(ýmÃÁ%ñ¸½aš*#P‘»˜Dú²rñSéï•›¢)"^øÝðW­‰7xqE§8î=ö…kSżð·á# nÊx2öuåÑ..H¾›²+ã1æ·ÑcUÇ£ÞוGbÌ£Á ¯äú Ððx^|ýöòËU§ó¬ßþzZÛuÎËo§#©?ŸÕú®9|ûËáOEa¾üùðíï/ݱÖU¿Äë“B£'ú|Ç 'ª†£up4%9š)à¼jøŽÂkƒç¦ð<Ñ“²„OàÍ•xÕøtàV¢£•Ÿˆ3À+€g€oAÃÑðYãªÏð ðhøNáÚ0Îá30KŒ(faJwª›ðwÌëåÉço'2›B¶ç§3ëñìÞ‰®ˆÑˆóÅ4 ¯­ÀPÞ†S|ý* /ž‡>8ÆZÓ%„¾“Ähgý$5+š²,®Sv·ë¹’šòXš«3äíâJøä#zb¥2G£[u:Ô·w®¨`ŽUY·ç·\"ÔO‹ºÜƒK„&ž0kÃïXö1µ‚+ú´.4O-  ñŽ•_¦ÞI >ü–͸LJ/ânáAb¸³bØÔ;-„H|axmøZˆ3(MøácQ˜Dñȃ¯øtZd$ Ë2ƒ©•Ȉ÷å”åûòM<üU­úW! x+!Ž“5#N„ñnóÏÍ`Ê¡Ô °Kø€ôá!RðI2jÏQ^‚~˜È ÞñU>Sªåm½ükìK ž0';ÂTÌß±ç,\þJ‰œXÄ£¥2iuº·¢•½µ¹©«Åj(¦;¢²ùMòéÑÚ þà!g ´*+eoa«D Æÿ±¢ÍÀad Pr<Ôk¹Ç#~2—-Á»°Šë¡kTyæAë[WűnÔ@oµ^ U‹Î ׆W^¢tÿh Pá# ^6µ(¨‘‰UJ;\Ìc‘Áò;c-Â6¡ë®'¬©TŠ÷ây#ãmñ˜‹!å.?¿AØ’H!5†½º=§xtUyŽ@:üqû»:¶mq¨ëóF)ûis¨«[Æ“ýäûK]•êtÛªÛ·Ì`s?Çéûöos~íྭGsèó;ÎJNßj£´Ã9~{yý)–ÑÁŠŽõíêjDÚÆ*FÐ!°Ðƒ‰ a”u‹¡¿Œ]"ÀÍ"êLaä 1Á+mqÙ-7ezVÂøe pÃæ~ä¦ZQÔ÷ð;ìµ€øäñú3À›ÊD †€á‘ôáA3¦´§‡ñ0ÄÉãü$`Rö1I)„wv ÷ 8 8M9%à4µ+|œ> 8ço™Á(æ~Ž›€Óè)§Q£9ÔXÀ9«ŒÒçH à4] Í.x9¥š0ÛXŸÁŒ‰± eÎFq¶ÝSåõ¥ea<‡ò¬ÂqL1Æt.{É.··%­år 1“fr)'@KNzîôPzîÌ”ôÜU®d{úd$=Ÿ¿e£˜û9nÒs§¦¤ç®ÍQŒ¥çó·ÚÁ(ípŽÒs×ö— =Ë2מ(ðh-°öD«áw𫽧(I^«¢ÞÚTaw¢¸=nº Ûf¤€' ØÂÁ3n €ËÞã'ÃçÁ«ö4ÀM>pá}¢ýAÛèð3 Ú|HˆºìÏwõf:²PŽ›H0wÂ4Da IÁÖ"žgû°¼ÕV)µ*Íìz<7ŒOÒK¦í ÕZ¾³»‡ó`*¿~C­-7Ÿñ´~!à:)Öúø˜ Ž2gðQ‡LO;Å+€óly§ÏCU¶ÚªU«ÞA ngˆGÃÒ;¾G ±p´mð&]Äá@ž'«7íôHS˜bLÅð‚õ3L­pG,ocî![§Êêܸ9¨‡3à'„•ȶ ŸÁ†å†ªbœnWŒ¡Ã”HñýlƒojÕÍßÉßL³RÓ®1kÕ·Ø–µ—{´{L9°DG`š‡ öfž½5 ÷hÆ ·Æ­•‰[HåÏÀô޹µ›XnVíá¢Dƒkû$ }jú×OäµxŠ’}-E2É“j@¾aš&'EÎD^Ó›^p­T}C=qsLÓG¸àЦ@'ù ÷ƒãe©rC²zÿ©RÈR…µÅH!Û].•lˆU vèÒêÁl+í²¾ÈL1ŸÜ_&vMú æP2ÅðeûÊËÖUdú½{Þ‘HìØI*h2QE´ßÀC‰ë×ðÛî;EI€R-f›Tõ¨ÄYZɺc>Ê€Q?$$umÉY™¼H“—då(MÝ[Äʨ±eΔ¥Þ=º<”‘cuF™ReK1&JNÎr–¨h"uÕððŒ2Ïôåž•R£¡ŒËð)ëUFÁ‹MU‡=•ø)K Õó©í3ú*c dêSH‚Z1«¾ï+ÿ>ú2dRÞ‚sÉþ‚L<¡$0°Ñv@1{à™à|"Ÿ ¶ƒá'Ì <á'Á/!=À j8ÐÞSØ@t´§û`xÃô® Ÿ^µç~ð;ç0žbܦ‚Θ -"à*eÊSy 8ÌÔZ*EÏÃÜcNnO–†‰á "ÂÅÅ¡žy°d–0 ¦¼%yÈ¥–ÌX©+5_š-YkÉ4]ˆ\  +í8C¢_”¬]>›'·lr&âN]e«ëÅîÑEq§:ü±‡Ÿ_ [TL{raÖ”iÅHÂKïÊXßw7ËfFÝëÕ¨{½Z®* Èmã‚+SOÜÈžx“ÿ }¯ç¡ÆçqÞÖeW§áOïŸdTÝÝðûËW‚Ç¡ ç%8Bkäãƒ,o‚ÁЛ”föª®†Ð2¥0•D=&slx…J°Ç4MØÈM¨ 3#›©‡ ‰òK¸Ÿžh‰ó2™…°cˆúGžÌPl¨Á¦ìž`\Dv8ÆFϵ¨Ê²õàÙŠ´²æ2Ï<„ÁŽÉÓöñ¹á'D}Ù8LW˜*Éx#s¢ikª¤‘qÚrþ¶¹RqdŒgL'`Ìcf'* 0t0»øI|&n›’¥ð<¢®Ý\ j g°·^¡_2R#žË“V÷à¡­ßqX›>Ï*mSVäþØGuX¬²;eí ã4­—w…®–ؤ¦Ì]íÙ¸U×­µvõwǶ-u}þÑ(uý´Q‡º:^O¾è?ùþR—G¥:ݶêö-3ÅÜÏqú¾ý»9¿vpÞ®kwŽÓ'§w†+9«ŒÒçøíåõ§HÖ¸ÖBsëWËîäT›KÛb=Ùþ\„‹Š ö(ø!Zg"Jæ†ÔAbè'¸‚\LäÁ‹‰Pü®6ÕÌw9YõÜ“v&è]Y”{Û@Òåî(&ñL8µGÄ'‘/\ІðËt˜86¦9o@t¼ó“`«µÔÞ»`)ãðÞ^|VÙ .–O½ožÑT¤Ñ#nóÐÊÆ}•÷iäm3ÔÈÛvJ#ï W[FÞÝtð~s?ÇM#oë)¼­Ü9NŸŒ4òó·ÚÁ(ípŽy×wPLUK¤ctÆ¡I°z}ÄΈÕÈ0ž¤tB-aI‰Šæ‰Ê±ÅFB )ãÇ(‡TL´háFhb2Ïe3æQ>™êF"ÕÁFª3¡³ zÞì3.¼nö–¬‚0!,Éd ,¯@BËæƒ,·…Xz–S}¬e'F‚©Ã± 4aT»®MUÇ¢3CÊëÆYÇšÒý£%+X^ìZ¶ôÎ{àÁ¯²¶+)$ÌX2Â!!Úz,‘†%žn0ë2@:”µÅÈZikP6¿êŠÀ«¬Þèáˆ×&+¬á'ĬL5a\⎟l@fÜž2&cuçÉHD$¶–žæ-Šý´bö](q‹Ð‹8Ã(gÎꌙqÇ…€¯ˆ¡E”•>ˆkØÚžD•+Êë1¨ò¨]ƒÿ²¦XYþ¡S$å›q#o¯ÝÆcÞ:#ÈΓ,`CtÕ9èê1‚®âs ÆšBß8 ¢ <ø±+cpb av3ªTc˜IUz'DJô¸l^ûÔ~¤Â!] Â!]O„C4ºuBΟ¸á—o™Á(æ~Ž>¢ÑåD8D£Íh3 ‡¸|«ŒÒçˆÑ,è üP ‰pœñz^a2~¥g†u¬„1Û•ˆ…“ ð~¶×ÄA6Ü™Q<µÔˆkY é™VŸ” -›„%‰wÄWÏUÌ`‡²u˜×^ª£®l¤}e˜+[哉 {Äà€í„é?îÌ`æYcDˆéÛ KªP4.gbŒ(²¶fÑ@ÙdõLÝ]BøGÙœRyw¦ÿáHÑBS}y ¢-ªy–ãÁ逺Ќ}—‰²!Ì8oÝcêYNè4D¦Òî;8FD@Ó¦r -qŽczitµª'ŒÁÆE‹m|L—âÕ{±PŠ6g‰FñHˆŒò-O*aO¥¯ñ%èöqC\D†§\Í#ú_ä\ƒµºërÊ58ª+Ö\ëŠ {ço™Á(æ~Ž›k°ÖS®ÁÚ­vþdä<«ŒÒçHà¬û"v¶*gCƒ-}DéÑØvÀčІ¦Q.üõ5¡e}-I_8ïNNÝnÅèÆAÝ‹2ßÍå|jçCk Ë#JUܰF7—óœ›LT—&eX=é3•)S6›IÄD©Œà)‡XÏöp¦ìõƒÚâ&Æ|è!îr·˜/艅„ê¨GUzf±aâƒ4ªE¨šc§'Žv½^Uö±3·'¶¯÷ÔNËd;˜jÃ&Ö¦^ÑÛ•~ê¶@]ÓŒm34ñ„­*á|x?¯èDñ-ôõ¢Ç+Àgwj>¢Ñ ±Î½ýŒmýö†¶?öÄlêæhFãÒGø¾c{°O¬ÀóNß!V€±ÙŠ+S˜ G3˜jàýàyðÚtøéxÎÏs¥hõÑ\˜ÅX! º9fÛìcb4 ½ ŒRûÁ£•> u/,€*;OüßmÙ jBèLÖá[¶Âl@$T°ZE‰§WhWŒZ’íež*ø|\8‡ñTÉ–ƒZ+ŠºùŠ…¢¶Iì)6èR*pž¯­*‡­y SÆž$j ,²Ìh„žJÿMEi•îɉ ^ ð«n8Ö0YËÄ'‹s.™” †ù¯fúd¤]­$Ú'¬W?r‘k*êêÚe@¹D`§-à¹\&¦‚sw¢‹‰J¯; M¦Ï4G"ZÕP=ž^¦y´i0‰÷#$–“'0•H»]LZÏmÌØõÆÝZ®C!¾h<“g «#eÏ•È9)ú  ýZ]–ÖOKe ‡K¯heîdâx é™:ƒõM L^a@ q‰i‡lºåŒ•I]ZÎq2U.mêªï¹¢ŽPuâÿ0&0õ9°šñYŠf¨²€•¯Þ‹NÝ"†: |—eNó |ò>iߨSœxRïÜL›ïäÏÚ>Á'b±b îÞ´ý¬ø¶à)^q"># (ÇðBÀ²Åû0(‡g€Wm0ŒáûÁ·P…?Á£Y©rj§pmš€7ôbúi^µàmøtðÍ=6µ½âÓÐΪyºÛÂôÉJbÑéÓ–ŸdÚ™iç6hç;°1 ílê|[o+€ódÚé{’ig‘iç–°1º[¸)_Íã&5ÅDÖ`ášï9î*ÈÈÌøz²§2{*Ù3ñìɺ.—w¼ÜLU‡˜>LÓ9 Ž)ÿÏĬÉTùÆ—‡Ÿ¬UYw/•­·Üˆm}úB°Jö’­L¸V¡¬g©væL#™ÇÄW‰à(]Ì£Öϯ•ÃtÇ =Š£ÀøŽ)Så(Uk±'u1:¤ªö.Ñø[&9€Ê§*&Àó†¨jV+-ééš=PüX¢èG| 8йÊÛ1kãWµƒTø_^ËØ5)ý‚I5a°ƒ„hÊo*½ ËÔTÍ•.7£„"±ÞÑÔàÈ‚NÂØßFfxõSž2ì«Ã>N'½kŒ_Ô“‹£<á~Jìƒf|ÝŠ87·áñcÿ+~çCø~Jxs>)ñÍ1' !û­=°ÏÚ펽àðN=^pìïõœ{ÎG`èÅQÒö÷ãÈEìÕgâK>üÓ^LÅðÍÑ*¸  â¡Êx4&&ÓQçLJެuæÈ xNæÈ[àÈLöEˆ\ÏhÌÚðÍP…i‡¦aÊ%*GLwŠŸ³º(ÙÃÒÑ4<§T³ôD·®H…O‘‚dT¬ÓGC!("m·;ˆç–×Û[?ÒÅÓà³äª=¡›˜<0 öJ†¶Ÿ)3ñLw”½&n™‚èÕsj6˜"–ë æ> ÙË#%'1Ñ¥L¿K&ª|'ñ­)£0uÝøÜÖ¾…ÉYû๠Ÿhö¿eÿÛŸ¶…™ýH³œ¥mfWúDœ%û‘6ÍY<øV?ìÁHG½…÷ƒ© ã™K—gŠzvOD½s\Þ¦©wÖ ²^@s=Ѹ¼¬Ìr]Í®ô‰8KÖ 6ÍY²^õ‚çÑ f"µL{C²«£rªø+w»¬w@ ˜¬ï4 ÷óê.ôìš}4×,Žîàˆ"%SšÓt‡[Dƒ#GÒ1ñ^Ôc Ã#8+Æ ”*\´À±í—b¢ÿÂ+`Z㈖ NÂWß®;å Áæ«­˜-"‘¦j]" ¾Lô)&"D«áZs¢H‡ßñDu&"—³•>÷NDºÚå¼"ÂØ$™.fsöì¨uËu³˜Š$Ëv` G¢üõú¤È‘ÂÎ(Nqå Y&˜‰‡Œ‰hý« ¯;‰üV/ñÝ~ŠM'­Å°,nlãÁT4ÚÙ€G‰Æ€oÀ“€C1E–rn¹ #v‰ä°‰´~óÀƒD7‘c3}@K‹<#=fëFœ¿ÚëÖÆm”‡Ÿˆ´™£Ì‹˜kÉÚ‡›ß ¹çjÀ#®Ÿ,b.*ÄžÙ:Üe/Þ^>ºñòëq«ñqŸOírh'¬8½:ÆNÝðûËW·#&TÖÈv''$“­LHãiÅÉA /•G”m%Qma‹ê2ao»­¶b’’2.od´š^¶[™Lí¢Š„g÷lDm˜31UaŸ‡>Ù§èµ\6ó’Õ«ÇÒV%‰’Ø‚)Ë™©0§ÝÇ%rõ{ /²þHY-vµ^âŒLÁ­Úr˜„‰I¶¶Š‚Θ6cXi¢:Y®Ò‰r|,™á_[Ûuâ‰êઠp¡¿ãX6dpã­‹tEÞ‡1ö!wÚ,”0‘7;¯b‘T¦T. ºÚ¦Œ¸´ƒÌŒ+¬Òdh3¼ìë²­Ú •éôý'g«aœ3íítU9Ë—¶¨žòPì~Ò©Bn1ÉuÛZj;Å'HºReaX«Ák¾ÏKB7E&7*©y"âtY:·@”©pn®œó$aL^‰×†sÝæ²í"ŠÂ76ôF4ŸÎÚEQ‹éêmz.F¼ÏX@u8OeA!.³6Ù ÇæÈ"R¼¼\ Þ‚†£á³öH-bu¨°ÓöÜX"œØ-LPa9¦-?” ü¯YÀÈYc¹’@EPˆh'Lý‡å¨*09d/"šGˆlò) –÷T½™îdƒ¸Ñ´žýíC›MÙf¤Ò}1xOú82 „K;zJ¬áB‘8å΃Kí¥Ú§<«‰Ñ õ .Z‡Kíás#ÊàUS¥t‰rÌ 4Vn²ª”U¥%ª’PáËç1ã‚¡ž2´˜^Ïå zbçIÑ˾ÀæÈ™#gŽœ9ræÈ™#ǃ*¦Þ8òŒ5·.T¿è£ì¶ =OŽC¶•=¸­,$òCij½§ˆÙR»4. SY˜Z$LEd¼µÑ.çÅ8=¬oKZËÃJå¬èPRÔ㦕Ȗ÷ø¡7GY.Šá­H¬ºªqY(ƒºñH¤“j×ÀtÑŠºc¶h­¢È˜³éj×¢ ònƒW3>Åŧv$­æ÷*[&–Éù,×µ.Gí*n"Å”›'ŠïHš²½ò<Õšf!QébËE§©TxÙb¢a…ÂwRLôÂ6]gjgÑ«xª S°vEÆVÕÊalž®,ŒX/J0™Ó¥²â°áG–Ä1­c˜šJø%–ie3ðÚ<[‚‹l¦lIVÈÞ{ø©7¶šííçÖ:”§ᣪ…ÕH/Ä®ÿ9ò9 ·¹ð‡Ú¹ ÝUÉ¥lÏwb^ôêJÕîB7Pæ‚àGk'ÀkU>Æ…÷Íî´µ  Ê VM¼Rò;6˜Àx\*te²M‡×—¹Cú»‰ØU™Þó„pœ­´f¥Mæ5•hXjxø.QQO¸,Öè0Àôûe¶þô¦ò˜†PÝ:œowFøá+ X< §1CàRõЫ›[d¢ULtÆ•/\¤Ã×Èaÿ¡# Åûã[‹F¯”ÍÛ6¯&Úá;öÈÕËé6\;¹ýø‰jÎ@6)7C?Ä Yú)"ç`¸"vìQ;™¨ÂÚD©}·’¥¶B²nxÌ„ûå´©ÇßÖCKsâaN<ôï4A Ú¢U.‹Ï™‡Kˆýöj»¦ñcwŽ_9æe55.…©«g—题 cæ+ÖÎæ±â⤕°C0:*ã¯Ü[²e2kÆÞ[+ÉWPÛ.Yߟ*\Hxì,b˜!ã°„‚' zDqEl'Œ{'¾ÍøVÁ®s¥ Ypݲo“Xåã>‰·ðð¼AQ;áÚMˆ6ý¥ò‚>!kúhwc_Zð$ÄnÇøp™ú/{b·×§/ÀG†Áìk¿¾³·‚›ÄòÕf\âjržþ‰äy"@eL# ¾ó|í‚ħ‡'lõ"ó¯s_X€ííd§ðÐê«uзVn Òì+¢6Ðzum裾–.½{rÝk=~b>Ùwl¬ØUQð†>¡yÌcžZÛ»ÓQ¸še̘ð”.V`M¡oÐÂ>V1c™Ø†Â£Áw,þ« ­ßeѰwþ½x«¿†Ef|ª˜Ñ0p˜þ&®Ÿ)Ê`˼ ø:=ó´Î’ð¾<ÐaO1ÈáÈš%ʧdåÇ au öœì\ÐæÔ<ø¸ê÷#JS˜£%² 1M ý–Ý̱šÃ¯/ÿ;” endstream endobj 3192 0 obj 7999 endobj 3196 0 obj [143 /XYZ 31.5000000 681.500000 0] endobj 3197 0 obj [143 /XYZ 32.2500000 200 0] endobj 3198 0 obj [143 /XYZ 32.2500000 680 0] endobj 3199 0 obj [143 /XYZ 31.5000000 201.500000 0] endobj 3200 0 obj << /Type /Annot /Subtype /Link /Rect [207.750000 689 273 695.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_std_shared_ptr >> endobj 3195 0 obj << /Type /Page /Parent 2 0 R /Contents 3201 0 R /Resources 3203 0 R /Annots 3204 0 R /MediaBox [0 0 595 842] >> endobj 3203 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1409 1409 0 R /F8 8 0 R >> /XObject << >> >> endobj 3204 0 obj [ 3200 0 R ] endobj 3201 0 obj << /Length 3202 0 R /Filter /FlateDecode >> stream xœí]K¯ã¶Þß_áu8"©2™I. f€.Š.ФMÐiýû•-ÊcSú(ñó!%ÛjÐÌäêŠ"Ïûùíï?ýõð_ß~ÿé?‡ÝŸßz+ŽMUôÿ;œþùæúÚÝß­?þüöåðåíãÛÇîß_Þú>}ÿÇîoÿ;èúÿÿëðç¿t?üÉýÒé~~kTÓýùïóŸm£º¿—?O?ÿçÛŸ~søå´âð9·™ÛÿþFk+sÚÆÌ§¿¼ ÇTç~ýñ—·o{Ä}E7MSÔUšò ÚRþû··¿w–/Žm©TS—Mqχ}þRÝ-¢Ûî_ª}èüÐò ·I·øyçâPQ¦VáÕ¶vÿƒ'¿m»Û¢#Uªîï)ÑÊ­vWS?t÷å\-Ÿ`q]¦C«~çâPqhX]òrªzUM]VO~ÓI€t‹Ÿv. ”ájáâ’7[5Ž]›¶M Ëò) ßÖ6Ýâç‹Ce¸[¼ºàå¶E©Ò‘í×Õ€¿-Ú&áâ§'"[¼¸äͪ²íÁÓV àsY=ðS Û~çÒ@n.žVƒku›CƒkMëèY DÁ×åSÜ{Õ&ÄØóÎÅ¡2`Õhõ1«à­ô?Æë—À‹ï>¿}ûCÎúðùïÝÎúžÿøüó[ÙýÇÉšÑêðù§Ão»ý˜ß>ÿ«CÔbøAÝÿàhÛ¢ÖÕyÃý¥ÎO”9mU÷èëƒÞ)ªós¬ÊÚ67«Yô¤Ðpµç'Õ°«'ߟŸ”ÇÒôމËSÀóÀ'E‰VÃß)¸„(ó¡C‡¹m|?ø;F8 DüÄ(¿ LA‹|øÜQ{BíˆÔ§Tw!űnÔé_wÓöOªcÑš[à~/ä]ÿŽ}…å{ù3í-@%A~‘íb¬ÙéþÑé^ÿàÿ*q¥º_^©a+KP‚M·Ì%HصOÆ`IÎë˜1fâëÇ{ÕY¨ë_β‹à£'—xMSùîSCn`†X}'ÀŠÀàÁ4F,/@p³¥‰ßR6“,³Úr4KQ@ ` qëIŽÅ&V–0Ó`¸<„FŒÄj£Ý_A õˆ 3˜9’°! {H=Ú.f)²ÊÌ,%$7JÊ“7eí T,gîO/‰@a Lø Ö  …Eñý2u%¤¡Á›X^å½»*çȦ¶Œ¸ÅtF‹øŒ?p¾µ6F.¾ƒmlàjYàzDÕg³ =ðyd¶1ÇpÜëžXû%î*ÆE –½VŽó^êžUY@o€s´æV oçÍLPØÄý|Ç 'àS'O>ÄÇÀ'¹Îãh|j5%¹šÓŦž@¸9:©#¡]ãwTC¼c%w !†(k…﯆± º„7WB .ñ®1VAZ¨DW+!Õ`€wa€oAÃÕ0¬ñI¤9†1ŽVpú¤`|?~¼Ú ÓW†OJŒ£ð;Öòüƒo>1ð;Xþ`¾CIMHYø0Íáwðw |‚oNc‹y"†(–€ð~˜'³{Ë¢çY38á”Nð€¬Æð…‹u6†ž+L/1Õb<`R æZÔ“]R!~ËH£—áX¾ßÁòpïê±ok×xòi<\MV¶íÜ{çÞáÞ<ƧݵEu˦<²Y«ç 3¡,&ù„ÊVfBçI ¢gwD‰â¾C æjá™DLd ûºé+²Y°TâS€OÊ„(ey >©Èõcìš~BiYë‰Ë˜Â9†Û –)ÅqT0›d*eƒá¥†ø”8‹3“ØÄÙ›cñ"rtL >‹M¹|#/A² ÔŒÎÀ!‚1YÑÎý0¥Çã`’[+O?`Ü`ÂZ¾Y Ô¹fugAÏ EMO¢%ú›]^ÆHe6n˜5äÊEÌ¥‘$V¬ê+ SBL$Å g2çaŒ×9ÁI¦Ë$J]€î·’‡6~¤”ñHóÄéŠ8HøŸçÒSŠT;B8,4M÷'˜ò–ÊZ+;Qè+!öõ˜DŸFÊ?TÁé¢Ö—Œp'¼²a%¯^9 ìêA®kÁ«1x·¢ÍX7¾ÀgN`u„úÍD:"bHäIÂøôjÇŠnà—·ÚÚ×Q°p.Io1ºñ9ªX}ÞœY\_øÕüÒÔ•G2¢zÃÞ¡aïУCCD GDQÔ ÙL ¡]3Ýe £ôb‚*…»%2º2fÎ+ô¸\jÔ7Y-“x*Bâ5­'òFäM5íc Y¸Û8/ ÃÔ÷ÞB²éí¦Öã­ãí ýÎØ§NÄ]™ëüûíSöVâ§-x$/H÷ ùL¦|µˆПíᤔO…=N³¹ ŸüîB&åmæ³+ŸxâP±>:•û긚Cù©'-ZͥɫöØÚóK_ßq¹×åÑ×ú/¥ñcÆç;p·: íïÍYkS»î1¡ºdo®HV+Äà&ví Æ'v€Ÿ8Krb®ÌD ¢ÜÁQ:ŽWLížãNà<É]š½1l‹jèT(VÍO °AÑGÙºQ½Œm“?&ª&䣨99n©Îøˆ1G´çuæ”I|8ðÀ¶¨k˜‰3vNL@“ Ó´Z¸™t´/)¥DjF"i´ bþUšFðôÔc9"ªå"v2²|%L‘-'_RÄT‰ÖDÈ8EæäŠ7>T»ÙM§Dh)Ÿ€!3a,¾–ﳬ\ ø¬ O(5Û¶ö¥¦¬y3ÂcÒ嬑­í"âv“ŠŽa¤1“1”Í‚ô‘‰R·œPÃ茥º¾æ#Ò/àET¡ ~¼F?¤&ED0fìÐY³ð°Ô‹¯Šªé1×RGší¥v„Ë^§ã9îø„{'1ÝŠq'3\„a@ìC'°Ü‘ Ÿc¾¦G&Üoœè®…;jk¸ƒ@rØSY-ÐM”ˆÞaø(V™wùmYÎî'€—ûˆ.ƒ¾þLá\7œ¯Ó¨UõeH¾)$VÙAÑx!™Ìô*Å'…Ò‘{»¤Ê(©2òâÓHFžËv|eŠG<€)7'ºÊöÅ»ÐÅøs¥5SïÀ®Äïˆê,Àr}¹­L•:V7£’ ;QìÈw%¤Þc‡K„ÛoiÃIW²5û2NÀÕûÍnÑ¿— ˆbwìbø÷e[ßæê û˜Á¢­µBNÙ¨U•žÄËÕç7[“‘Ð_²Ê¬dÚS­[_—ÁÆ8a ž`YlD<µm¼SËònŠÛFt•_^HMå†1L ÷¦-‹ ÐvÚˆoLR¿ÕòטzúÙ )Ó†úv×úPzår\ Ü&“üN¤«SÔ‘úÌtäÈ^M ËUÀ³z>cO3 Ú„ÇsDô7ÍØ“Í/–5›„aÙÐÉœœÁƒØV³PxÄ„â(•¡—±"%Û„y úŽ„‚Ô¾ˆt-#EóÎ|S5ü›±F÷°h¾°èƒÁZ6¨¹~°‘I”½÷&{s¢ ²iˆ*ÁÃ73 ¸´e1_ÎCù<‰bƒ$¾5þÍúŠÕøòWç½›‘s iN—µwlî”È(܎˦¬à"ÏV~¨\ÙXîšµ-eß ýš‚$ÜùLrJæ™Pi%Båj†¶$ZOó¬íb)’$ºŸØsPŒH|7Iî1I¢¢ÕËQ1 ÐlTƒ†§®ËŶÓ¼þ#ÿÔÚrµÆ·¥io±7jv} (=¢Åq1H%’¬‰´x—éaC%Ѓ 3Z€9`šèBÞ fZi®ÛÖ£øÍ²9S5Þ©eÕ=_¶c­Ðë¯TþEŒÆ bß"Æ™èèòñÉëM`B÷ lÙÜ߈úŠõ#ß”Üܲž)‘q)‹óo™›UÌõ7ŸEULù,ªÂ÷Yœ~âû,οeoV±·ßHï³8u¼áýSšÔËôµ|VÍ0±Ÿˆñü¯ßp÷*¾ÖŒî/×KÅ¢ ë›Qp˜w·{ãú\®Ð•TaT-†µŠ*¿+׿U­òÀø `]¶>ò¼^#×rœì.«¢ª†Oîs—'ÞÉ9à°¾¾Ð0%fÀác9Â7;–ìC÷H}Ø¡{µÖ³ûYвƒú \HO< |w$ºJ<æ¨)EŒÛ¢†Pa Á²mõ±±¹p4ç`Ⱥ¼gtÜ>Æ3ómÕ—¯fãY· zµ>™æ©!·Ácòð®ñjêp©Çb÷ñSø¸·€‹Ïƒå†Û&ô¾F5÷è}øtD7ÞÍ@¬•ê"Œ‘ìž+L}VPO0¥b®ˆïó¢Ã›Æ7ŒñËlóâV\Xf`:Ã~ õo‘²6 †5¶T¾ÃôÐ.± σñšÑŸz ¡/+ÆÎfzcjÄ7‡5ølÏS8\-`±ânáx˜óAŒ¯à-Tw°'Ò–»9m­¦ªæoKô‰l_Ó\£Ó±:à…&žd½û¦¼ãsÚæMkVøª5ƒ×èu<Õ°^OÊXê„ÜzL/÷Û°_SIN{ÑVó;ݲ¯÷%­çÛ_æäìm1xšîˆiäÙ©®g!·O{Ôœƒ\OtÙ³ÉÇ ó®p”r°øv޲Gv޲s”{rgÛÓGoÌÀ¸¾kM}–Ô\¦G&ÓïCV¶&‡É¥Þþ<Ã\º3°Æ#ùÍh)‡ô=ô¯Ý^šhd‚±oštxBé_íĘCn¶…õåæ#‘y¶¾ÓŒlbtÅåÃæ—i(²Öx=löQ}µ5¢ä¬W©2!/ÕÕ×Å)Q±wÐY‚ˆ|Q|ZW…2}G½k!Ä{ŸÓîup¤ê ¼ÙP±Pªñ ÅÈjWÙ4ÕŸ\¤b†n!į[F¯à£ÓÚÇŒ§ŸŽÅh»—êi¼TŒNƒ´Ò”>Ôªô 3¢}„Aø¿e{ŠfkI?{²å1yÌ„] « 3)L81F›l[C «^vRàÓϳ’IEƒÇD²¬Û¸›[îúŠ—ÁƒjF†ÎZ¡Yêz®}zÈ êhl±E¨;Å™¸æg®'¥­]4µ„IõÐiŒ{aï ¹nɶhæÇf¦Ó=K6C–l¶ŒW¥‡b¦Ì¹N»Î(ö= ³»b°xLJ8C‘™9À€;’1Ûñ±¸ª » ;‡D1ˆ¸š©6„ë¯6k§œm |Ñ8u„%½\ÓwuÙv ØWø:ÙdT²TX*ÿˆIZ$øKjSS‚=¨6ˆ÷Áo È„ —J„3=0hG«DµÁZçô(;t˜¡Î>/3eâÕý󸝋×ëlµ÷ºÞ©)5-ɵ{2jÚûÄ혋íA—ÓùÀ=ùÙapƒ‹||@½þu›? 'N¯.\wõ\Í5+žZ­…«õ 쉧OOí¶%žøå^ ©ò8*N‚Oçø€Þ œ§°Í±µþøN`Ü5¼e¼íü†6bµÀwˆâ½½ƒ¨ãaà_+䞎úŽÊn3fèýh0³½ò´€_e´<“3ˆM{"¦O… Ìׯ·¢ *›žŸ),J9,WÄ0‘¨!`ânø;1þÖˆiÖ¢ÙÓLih€!aüöݬ¿Ã[ЍÔdð§z§MÉÏPWÑ6¾pÜ^Bó8]©Î…X^R–ðÖæ=p²…M'…\˜PKMjDþèö²q¨ÛȤ >¸ eâè£Á6áÊ?&óŸ¸Ò@n0‘5•£S,´‰Ñ@ÕáL"¦Æ¹)%÷jW%aš¾Ä”‘ŠöÆÊ•ˆ$£Íú?è0Œ]—+ CV·eð¨¢@ùĦ]Ì9ú*=»™-ªÂ™ Ì);Ä®gµˆ”µe¥õ.\VÄåòbQ®„VUVß2ýoDÛ´0™ñ3é±³ØrÏ„'wŠÅñ"¦Htý<Œ9ÉhžŒ®(븑m€€íÊ;´Õ ÕíHž ëF¢b"«§LÛj^‘Z¢…ñ"ËA©+fŒŸ!S«Õ-Ž:¡šãŽ3˜„¡A‘6uÙT<X„!š‹­¦7U¡|ßé͘©V‡áã.©Åw$ÛQ™‰àc 4ËIuÃy/ÌÈUãbið¦Só•Áب;ðK82G÷ ñ˜k–Õé0r»¦Ä“l; Ùˆf^»8FÜ}.ìcîOŒÇ<-0ã¡X•[âz]øïWŠâw ÕüX~0·¿ÏÃ`HΪô²Ö³x @\ \å¡ç s”\\>çmÙKGŽ÷ù¾Z©¡ŸÛ éc² å[Öû¶¡óTÆÎîGXBCš1¸+‚h¯á>Xv‹rö-kCJ·wÀ”yÚúT.)ÐÔD91†N€ÃólC‡«ªæ;SúÜ“<§kjqg&(Tu‹HBi°‘9°¼Tn3ù±‰g»Tµ‡À¬’ŽÑ4>•<}šrâ aÁ&ûuý `Ù\çÕcˆZ7˜Ê#²=o` yT+s#¦pHçn>°}àΰh)þúó„Q&WyôÐô5ë±d³†ˆ`ánY)ê¤ìÑ GòrƒÙš)'ÞÙÓ ‹%Uh훹üKUj TE3òämíøòTá“X¶[òl`¥*ߨ®šfô`ŸH©!\™²Ùî¨I_„»É´Y¥Û‘#eõa}I´2ûŽ ðó5vÿ¾t÷¼Îs¿°à¾íÔu›Î6-ÔÉ<\òÝL‰©}÷Ðn&Ô‹žÇè£î§l]=émõø‰óœëq[iרz ÚïÑwÌ^MííwR”'-¶ÒçeS›Uîè£:À<ÁÄ1^ ¾ã”luô« ‹p§¿—. Û§ª«A„ÂÈ¡`wý„> ”Ü8Þ|Ç@èà½a< ` Ü› 7GU´fÊHÃMâžX„§.¡¼ ˜ÜÁO0PÆ\ž cJàW‰ð,e6…9:®¾D!Q¹'N¾ÍɶÃÇ·ÿ1kÉ6 endstream endobj 3202 0 obj 5979 endobj 3206 0 obj [144 /XYZ 31.5000000 764 0] endobj 3207 0 obj [144 /XYZ 31.5000000 448.250000 0] endobj 3208 0 obj [144 /XYZ 31.5000000 512.750000 0] endobj 3209 0 obj [144 /XYZ 31.5000000 448.250000 0] endobj 3210 0 obj [144 /XYZ 31.5000000 270.500000 0] endobj 3211 0 obj [144 /XYZ 32.2500000 511.250000 0] endobj 3212 0 obj [144 /XYZ 32.2500000 762.500000 0] endobj 3213 0 obj [144 /XYZ 32.2500000 269 0] endobj 3214 0 obj << /Type /Annot /Subtype /Link /Rect [60 412.250000 155.250000 419 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_exception >> endobj 3215 0 obj << /Type /Annot /Subtype /Link /Rect [87 405.500000 167.250000 412.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_nn3 >> endobj 3216 0 obj << /Type /Annot /Subtype /Link /Rect [87 398 175.500000 404.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_nn4 >> endobj 3217 0 obj << /Type /Annot /Subtype /Link /Rect [87 391.250000 153 398 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_nn5 >> endobj 3218 0 obj << /Type /Annot /Subtype /Link /Rect [87 383.750000 172.500000 390.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_allowexcept >> endobj 3219 0 obj << /Type /Annot /Subtype /Link /Rect [87 377 183.750000 383.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_nn6 >> endobj 3220 0 obj << /Type /Annot /Subtype /Link /Rect [87 369.500000 173.250000 376.250000 ] /Border [0 0 0] /Dest /#10#ab#8eZ#aa#12#d5m#ed#ae#c21#82#d4#29v#9eK#ec#18 >> endobj 3221 0 obj << /Type /Annot /Subtype /Link /Rect [87 362.750000 177 369.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_nn7 >> endobj 3222 0 obj << /Type /Annot /Subtype /Link /Rect [60 355.250000 151.500000 362 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_ownership >> endobj 3223 0 obj << /Type /Annot /Subtype /Link /Rect [60 348.500000 155.250000 355.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_features >> endobj 3224 0 obj << /Type /Annot /Subtype /Link /Rect [87 341 133.500000 347.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_feature_attributes >> endobj 3225 0 obj << /Type /Annot /Subtype /Link /Rect [87 334.250000 121.500000 341 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_feature_flags >> endobj 3226 0 obj << /Type /Annot /Subtype /Link /Rect [87 326.750000 132.750000 333.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_clearing_features >> endobj 3227 0 obj << /Type /Annot /Subtype /Link /Rect [87 320 171.750000 326.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_features_default_args >> endobj 3228 0 obj << /Type /Annot /Subtype /Link /Rect [87 312.500000 131.250000 319.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_features_example >> endobj 3205 0 obj << /Type /Page /Parent 2 0 R /Contents 3229 0 R /Resources 3231 0 R /Annots 3232 0 R /MediaBox [0 0 595 842] >> endobj 3231 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F1409 1409 0 R >> /XObject << >> >> endobj 3232 0 obj [ 3214 0 R 3215 0 R 3216 0 R 3217 0 R 3218 0 R 3219 0 R 3220 0 R 3221 0 R 3222 0 R 3223 0 R 3224 0 R 3225 0 R 3226 0 R 3227 0 R 3228 0 R ] endobj 3229 0 obj << /Length 3230 0 R /Filter /FlateDecode >> stream xœí]ËÎäºqÞÿOÑkî#^$R@`®²0˜²0²Æq #'^äõ#µ¨î©«‹”ÔŸ=Ó¢ÄK±ªXwþò/ßÿóôßÿ8ýòéûÿœ~º¿?}«Î¦®†ÿNýŸ?Þ?öìþ}2¶>ýüíí÷ÓïoßÞ¾uÿÿûÛðÁ÷OÿÖýëÿNòô¯ÝÿþzúÓtÿì^ê_øíÍÓýý·Ëß­Ý¿ªëßýó_ßþý§¿÷=ŽÃ¹ÉLÿQ¨ÖJÝOcaèß߯eŠËŸüüûÛ/ÒF‘¦m´= ­ôI´Zžþ÷¿ÞþÒ 0v_mãþƒÿ&nûÁj»ÁE÷ïpäV amªG–hd?L[5'!Û®§nWü.˜ºgïÜV•ÉÖ¹›9;T„jD¼w¾Íµ•èø :Ä¢Çáë>Cç²móu~™9;T†Íõž•gØJW˜gÔ•h›ÊX ÿýÈȵT[«]VET×pÃà8‘oð&Ûõ†Æà‚½)  b¸ [äW†ÊNCŽÃ‹⣿@<% Ù ë"A‰°ÙȘ™Ð ã|ùÑ™8¸” §à`dÕ˜d)0T>’øLðs/¼wÆ9 qoþB1"Ý'°Z,˜ùžÁúeˆAj¤î‡5ÒBa/\þ#PÂRäñA9ш± ƒ—ge¼a‘oàJÄĈœÀz@„Ç(æø,Æ;ˆ†ßˆÏéÜ[ ¸*ªscD?¹‡Î‚,QÆó´•­¯qHG èJQ´"Ì0àµpC´" K°.?{FJ8«BÝ‚À’(E@Í*,o/j–R¸ì‘óÓ/u"ã$ˆ‰ë ,²q©èyNÉY½¬|`šÁôC’s)f<·%µ ㆩ½¡ aÊA wÿÁ'ô5[ö8$Üb\08hm‡ì7E!Íaš[1îæÁ–~æ¢v{êÈzŽÚÅ…Øò(«Ÿ÷‡Ûd¾¢ŸæÜÔ—t:ól`o-ìm€0Lå0¡Ï•¸|µ¢£ÝJň•æÜZoÖ÷»q\w>Ì­§E0À3À³–Í úH˜[¿0¨ †ˆü¶×AŽ0¦7ªÎM«{Ûó{,¯t*þ‹yi‚½10Æb…iÙêL°ËD< ¬båûSh(ÝSœÞ,ÒÅëY}Ù´›ÓmJËmGN¸¦…$è¬ß ù M6‚:¬¬’eæ‹ÖœÇO+¼óG~„àÆ¡”-bqò]E8¶›SN™²êø–¬óËG¼·[©g,Æ€Èîc!Šâ~¢Àž0’.‰a°=à=„ó²Æá¯˜À[Ôg¸ëýHÌËÀ––ßÙQ™w²†–Ráç…In4‚6ƒñ)‚i‡ó%‹K‚ç<*‰:@%éNÜÁúq?#[ZØb³Sƒh¥¿J0 !‚ÄÎ)Ç !Lb4&Ês 8-¹¥°VÙ‘tÆ£SÄfÜ[@Mv5ÌYÛ«o”qšô¦™bóÂñ Ð\E²²¡ìÐHDÑŽeÃ+eÛ,TõG^Öè›b6j_|‹ysJá·ö‘dß “õ9.G˨•ñO¾çÔË«Ñ4Ýã)8¦Ð4uí¯€"·&¸JÙh0ýQB` bEôe>M(6UBÌ}dÖ¼™jw5“5ýI×h²ÌI ±r„ܽ–1’ŸÃñd›ÄR<ñfþžRq5˜­`—$f­ë{IhÀšÞ_,›ÿ€¶bYù¦¤£‰VBªvµlõl 3ޤ Yô¼¼â+‹¡ÐÉXùí°VÔìëyòô‰ðëÏJŽoÆ0O“B¡IÈ•kì¤hÌDx¶ì‚%6P_'ó®•""R’»ú%oL/‹¡1å Ì$ápŠÊbÝXT”2ÀòƒIвný¼A‘¢l둳×TD1PÂÇ0‡ÅxPª²Qþpo]{ó,â׿I%ÜSn^‡¼Ð"Îì0}Žg…ß|Ì›ukWss^š§É»K *‘·Áx£ÄÁ1Þ˜@ËìDÜ©”Šd…ñT*¥ÃÐõ6ã…rþ©ú\µjºEX}tÙV3 ymi›U\¥80™¥{Ž"Ë[nä•a…ÁöF”,X Ü(Õ¨ 娓꯷2'Ræ+}²dœ´R'˜ €Æû ¥$Ù jP¼Ç; ØB.œR±¼ÊŸL¨ãE:Å(!ÖòÀÛnÓ_J¨rƒUªUít§çô5h£–à7Š ~†-_ÒÇQ°Ebû9´¹ãYãÞœ¹m®EÃqp ìMàYÃ:Î@C Ñxn:x¥ÒÀýÉamHš¦Åf»XAµµW‡áKYÄŠS„ˆ¬9ñ¿(|Y¦ÇÍ)ÕUJ›Û-ì;„œTAÚÂß`^ñ^ÂYWc+Hݘ¿HÌ_0Í`.w!âÁÅç ¦M¸ ˜6áÔŠŒƒ[ ¼h¡C¸R‰ñË\„³6B?ãñJñ.`*»ðŽè´¤ôÞ6ËÈÚ¢±ÄOÀ1 EhÏJ”PæFÀ1 ƒ÷Æç.ÄX{£œ Â@tÈÎQ$~ü ÛENdeQðk˜è`m>2k âSÏËC(ë‰à5e¥LÄëÁ¼㛣¹§‘í¦^/Â7‚I¬À–), áq0'Æø‚wöÆ+Ýa¥ÇQÙ|.+F­Ç;"Ö—2> Û)4WÓ o€z©+H Ñ‘Ø,–»;©³ÅëÚi°N,¤¼’^.är†‡KáSÉÓg!eŽKðS"@(µ_X£vPv§TO"¥<"ã½Ôk Äþðf›oŒ¸ýåy›‡CÏO.•›7vs·B„QÚ?¶–—fŒÏŸ-/R¾§0§È–n1Çza™pÏ×9Q”F V&¬c±{Ïw¾n]i1ŒŒ¥g'¬ü˜eܶ·|lVËlû;a^$p+­ÙEÑ)-ÜCÖ²zuŸb|+uEëJðqÞbÛ]À´¾€RDnßþ/ÖxrÒÁÇš|Ç[ë"EV¢Ò§R͵BbHñŒŠÀEƒI‚ ïgˆr–<þñIIÙOÑ1(:¥ˆ/LVc°™»ÃëÍØJ÷Û^ª‰|ƒMз×<.¦m”2XJE%\‰P.­cÈVL #-zhó<˜H|Îx€]GͱU_ ™¾¯|›Ø7¯|›+·ÊÇÿÊ·Ù5-¼òmb´ýŽè´ Œ"E»L›·¼rt¢s{åè¼rtˆrô+G':ëWŽÎîst¤²‹ðåm9f^OÑ=©©6Q2GšGò1/ÞÞv"á8ë3¹œRɈRK s(¡ƒi+’ËF1Jéé®#Dh)Á¿B>”M¤ [û±™Žºç0xÖÒ<ÉYïŽ`I®{•’ÍmûD“ï0PªöXËÑ*º+£ý3b›À ;}sžpµòvq³«oIñ xóXîƒ,:¤Ë1(¡0rÀ‡¹J …0 Qõ ±¤jФÃ’›ù¦ –kô(I¼ñHÅ¢w7Ïu‹TªOHâ Ð-Öê–IâmˆE›kl¥Ê³o¬{°4J²F¤†>3(7÷2rSôæbÊ»©å@ºFyûúÛù¬Šu¦bIôÈì²hüÕ̰!Dí­€ï¢{’z~Ì˺º.óÕvô´N€øŠZÜÆ7g—np÷ ìÍ ^s½µ¨7G;Rž}Á°Ûéä(^Ÿƒëyଯm¡|W çæxŽ9·Öÿæ#œìÍźÍ}CèÍù†’æÞŸƒIò]Ê8”]P°B”:ŽqÎa"ļžÈÜàJµ(tÂôW ;Â,”ŠD©„Ê‚™†p£Vf–×.BÑ™Ese+±ØXª2¢¼õ<˜má…’±™kœ²bÅBrÊ@;”Ë©û9ó/÷)ߟ;4vo—ºÉzak17Ùæ)yŸÞGI¨†ß„tOpÔ9)<íðeà(b£’ê&PìYå,¯EÖCñ$"¤Ñó ±¼V^æRC˜K/ÉåtNYë쬛R⤆EvžBBG*È¿H‘ÿ)¶¿ÊÂÇ“wPu&s‘3V½¢ƒ?jSÀ€×èèeá ŠU€ûxc8BûÒKŽçu› Ýú[ޝþʼnƔòá„äH"þ{û>ä¦'©kº‹Á™¯qq·k¶›R‡ RW’·³ËMU—ÜxS•¶þ¦â„JœŒ…“??ËÖiéÓãöõiÓƒØsÈÕÝ¿ˆ¹`8%äd{i´×u€›˜ŠñILa瘾)é«”Ó;{JeS‹Õ”_8*øiì䇲RóÚêX2‘ЉR"3IÅÆîÉ~8Y¨§ø$æ „åM¦És ÅZD_IP»)'·«¿6çlcÍÐN)"Nñê`³>AFÜÌaËœÂÏ{qØ÷h’âõõSœˆ…¢û#ÀǽÑËÌ3™n). s‰„e?j…²ÁY»„–ìÒvœÌ1½ÀÇö eñ:¯éà§Ô¡"–@y/pä­q_h+·×<_Q<»ŒâIp»EtÊÅ®ô;.sF*ãp„ B‘C‘7¢˜`–`¾.ñIÒbwâáp%ʉºýÅf¯Ì îÒH›r¡¥€!ïãÝÙés†uºœëÛ©Åœ–Pò¿J~x«õqC¤ã…·Bâzº/e;!Õ[Ê[†·h³!îÉt¡¸ÿY£EÓÍù ku¥cŽà[-œÇœÕ4Û®Þ³R™Ë¼õb"ÐõQÁUÃOrÌ’RŒññK SýM€ãø'÷<³”ÎQr6a BSO¡"ÌÙ´³%@çZ0Ù ’ê,†ÌÒÛ7ÃÊD˜¢Ý`3㈛YÔ“ {+™Ø³®ÕÊ­“Ã7ßòP#iNZƒ³«žÌ¬ÂعÁç¾ù gMXOdÇœ[A0ŽÌà.T£î çEˆóFž:ÔmTGbÝ4»þÖgk«“©ú¿ŒvxÚœšö|á ÝËîÉÏ·Æž…h¥µâú–¹ïeü5ŒÑ½ï~Ëþ³“ÿµÆÝ7þLÄiœéÐËt?ß~}ûø‡ LD±Žˆ„ ¤¡îf£Z CNÀ8ê½ô¿BV¤R§?%¾7­R€dÕñ¤HH¹Ã¾ùtåHYÖÍýƒ¿½}Ï„öý@S¼×®¤›>K±öÜ>E,ï…ûþ²…vn3 _zØÍZº®Ô…§ -CžÖÝáØæøäg÷Qå˜ëõ-7±›ñ§t|óú@\تßA sùÈ›Lÿ–žv£§ÃüÚ­¿4w#šÖã=hîÖ£~6fõd÷ ›™×>ÿrŽ˜îئe$ ªÛ‘™êþÁjd„Ç‚ŒœcAFû¼¡{° þ-ÇbÆnÆŸÂcA¦šcAMëÓ= XPsã9×nôt˜MY¹^û÷’Ÿ–é–¹bÅ 0ÐC±úè3f4]'2?cGæ×ªû«™_[y̯s̯ëÝãJÝ“€ùõo9æ6v3þ¬<ægÛ9æ×ýå Ó= ˜ßå-=íFO‡Ù”ùµãM¢ïHþ‚â‚K¸RÀkZÞ­œ·žð[sU¼Ôýƒµ„oªvJøFT3„o„ô(²âþå­°¯Ý¸Ÿn˜+á›Êξ©Œ?L÷Ä'üá-=íFO‡Ù’ð¸È_ROyVwÀÕônD3Ò»¬îä³zõyXâF(ø[,Äm-¯õ@ÝÄê9Ø/òZi=^+Û9^«„Ï/®Uöo9^:v3þ´¯•fŽ×ÊÆF6!¯½¼¥§Ýèé0›òZuÃû µRéQ…„,Jô ^))!‘IÁz±ÒÓ €Ïy²®?àTíx¤úþÁj&«Çdµc²‰ß8ÿ„GÖ7®:v3þ4“ÕÍ“վâ0ÙË[zÚž³)“­Ç°+œ¬GÉ9 )“ ¬¿Òy÷j=º…ºÑ¥(”áç®öSýrÖN±º—cÍš/²Ø¦ñXlcæXlàÂ0Î…1áý[Ž…ŽÝŒ?Å6õ‹m|‡Lÿ$`±—·ô´=fSkäH‡5”c·ªì\êJ«í/x NÀå:ÙK³õ¸ÃûT;yð7²“ÅÒñw38h:Ž4 ê3¿Å4ôïò–¹ïeüUOÕ3ƒÆª` öÏÆ™ê»ÀÁÛ[šv¼îS6ˆF1Ža'\ФIÑ9Yke°Ø)#ü‹€˜mž¤‘Ñ€Œl ÜÊ2x·6ÊÑ´òjïµ÷æh¶ÒŽf«z†£uÿò¸½8d¦<éò–¹ïeü¥'ÍVj†£ÙJcÈ€£õÏÆ™ª;ŽvcKŽfÅK ¬DÊéÄ阔¢êZ±Ñ…êè`–C±Œî`+Ó⨭ÃÞ¤±÷2=Œõˆ†TÅ…Ž$´0m¨¢áÞi? ò%ÜJ5UÀ­Ô3 ¸ <<ÖyxîõçË[ƒ‚}ífü©¦ ¸•rF·Ò÷WõO||xKO»ÑÓa¶TÀ­¼õ“ƒóÖ3Å-£cÄ´H¹xöq®Ó­ºæ8QD¥¥-Xí¥-X=—¶`/€ÕaÚÂå-Ghz’¶0s#D=—¶`µïÓ蟄¨¯i ·nôt˜M QÛ'%ÄH*BýŠˆ!/• ô&u{ÿ`54^è¼mæBçm`©µM:yË¡y3 ‡¹‘A3:okßîÜ? È ¾á}3 ¿ ³)4cè<Ž©¤8fxÝIÌäǸSÉ­±žÄݤkwHì‘› Ö¶ÖÖ¶6 Ö¾¼åÈÉN‚µÇanäf悵­ñƒµû'¹™k°ö­=fSr³Í±Oý)ð‡¾Sv=5ÛkveîdŒÈ¬Œ‡³¼µ¹˜ï¡Ä}­͜¼wi«¹MXd©­ßVsaðmå‡Á·Uyk`™×nm½0xÛÎ…ÁÛÖƒïŸ,µ½†ÁߺÑÓa¶d©mU›¥°NÐj¶Õõ|Bêûk *²µÍu5Ø©OqqSêÔÂq*¿%”«J¹ØÅuñ*δðŠg”¥¦.A^H ‰!„&«©Ëzý KñU’fǺtæëŽ,¦%]tá@©œRúõ9«ˆ¶Â;´"0¤Ø\XÊ#Rîjc­RObêÁ2X'»ƒâô[Us¡°{æ¹±Vî¦0蔸MÊ]ŽX×)U!|µJ)*Ï•X”K…°çŸDXVa=ÛIÌzkå–7µ·¶]}æ’®¯å¸b·–4Ï]§ûKÆIQ1.&Üxð*€²æÛí8Œ\$–ÿÞÖ´Ë(l‚yˆW¥ØjyÙÍωœ÷)´ÆÃE^ιèÙ)'t1;–E)ÞUŠ~ ôP¤.u*2VMÛ Š­’5e‡$×P.ã+ue‡©ÿX׃eöX´Áa›çêÚ\Íœñø4•ðŽOæÓ%AÚKа0ŽãXÅ "?Çím³yd½±1‚„ºR’pÑcúB\öOJ*ÏzÌäUy«o-3ýâLðyó¿' F~ííaµB}{º Ã,¡&sËqÍê‹ìÓöˆÂ•>À¨ XçÚ1ûhû&÷¬¼FŒ ðzʈO‘RPÓðRfÔK°~ÊsQUz= sˆì$oìúó+2{ì¿ |x&¼ål(Böú[\ÅU[%{î9¸<ð‘À"ìv+#Ö¢Är®ÔórxÏnD¥¯i8®;€Ù§µ¹–¢šñ Õ@ šû¦Eߨà6Z%a/Ÿ`ËWÔ"]o:¼Áv`VæÜZïwPÏÌv¬Ð7Ó[…Z"k°7<Žø[¸cp¥xIX©t+µèá¹ÀýÁp«ÚÜ$¤´ñhHX/ExèA¬<4Žg×iDu-·—¥'Ä® ­]úkøêÖ0:$Ì™g'kiÓ{s‡Ý\‹„-pœê#œÍ ¢±t™íž{«ÑÄ$¸FÒ 7ÑEÄíõb\æpYÞ` ÞdR„ o!¥'³áHŸ©}¾þ,Ö¡çvk$y¸÷|1É+·ƒ Ä;ÌíH .§øAC]Þ»OðÉ—’‹^(þ‘’@PLœbõQê/%ÔŸúrL =ÖÒxwêÏ\ \K¥(³'^œn‰ÀêÜ­;‡ˆU@„Ò"!5¸s7 ç÷ª¾/C^Vò(*6SùŠ™JñÈ~ã}€ûw5Ò› @òEç[0÷«0€<[à•Bni8¿Q¼,È»¤Îá"'€ál‰Œq™‚}Ï ™Dà†åB›eçÊàrÝ>€—EOcÙG]ð†(5 )ò#T(ÊÅæª×û3=±@ìÙ~Uªî*É‚AÉgLÈ9*”¼ÁLƒ8~ˆµFkdn„r¤K“I¤FM (6É,•/2gµ ?ºgOo6–Ã73÷ƒ††P ½8NI# ºÖ{~÷¢6êk‘ã—ÐAD>b}€¼~ÄüZRíÓÍ#æÊ—°zóà¥}Ä8MiÑϳî£À-pn¹Òîr b^L¡Lµ¼ûC’Áðþ`XÌ·ÉqóNLspç(XÅ Q,+BèH 7|êvAààýÁœ‚°’[~ƒñŸSŠ-%bù4êõ̲§Q„ãcYs!, až†qËO˜ AÍ è>Š£¸cj5çŽéþœ~ﺎþmé…†.;›"$Ô¹}¼åéªY:É|Îî6ì«™1E¹Ä¢ñšï€5a‹ƒ‚„)Xs¶ÔÏhµd™›ÛW·RrŠÃµOÖ¸ ö\Þ’„ÝØ¢Ñ2î ~ãœ;"iéw^V*Âõÿîf> endobj 3233 0 obj << /Type /Page /Parent 2 0 R /Contents 3239 0 R /Resources 3241 0 R /Annots 3242 0 R /MediaBox [0 0 595 842] >> endobj 3241 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1409 1409 0 R /F8 8 0 R >> /XObject << >> >> endobj 3242 0 obj [ 3238 0 R ] endobj 3239 0 obj << /Length 3240 0 R /Filter /FlateDecode >> stream xœí]ËnäÆÝ÷WpÀ=¬Y$ÐHšYF@FÁ8N`xŒ(^ä÷Ãn[ÉSMž¾UM¶è=cÕ°÷]÷UŸþüõÙ¿~Ï>ÝýOöÍÿ~ÿu—ï]‘·ÿd‡_?¼ý®öþÏ™«ŠìÛ÷ÝKö²{Ú=5ÿ}Ùµ|½ÿkó§ÿe:ûKóï/Ùo~ø“ÿK‡¿ð}ç”k~ÿõø{íTó§üôûáçÿÞýíÙo‡»åüfÞÿÿÊæ®>nãÌÒ/»î˜êøë÷o¿í>µ˜·Š®TQ癲Æfª¶:ûï?w?7 tÓçûÚ*åJëòKrú°RY™ÒÍr…¬sü%3»Š0¹Ó*ÞäÇKE™R'—Älå¯Íá"tø{ÇÝŽTûªÎKýv$×pÄÁ‘ûãˆÝ[Ó^·N#ÊÎ_GWh¶¼8Ž˜}aËÊMÜ\ï͸xÒÜ¢ ÖxvoÕëÊù¤f£¿YUA ÂcäUÿÄJçbˆ ÎfrøÍãq¤Ø›†GßïCv€lüWPbN,2 ÛtLbhaF“¥‹À7øèx×3p ˆ¹Ç¨¸ˆÃ0ÇlÛîàñ¹Qšqô]¡l_á%ÂŒÓílJu½"ïJ¼¦õÏÓÅ%žƒpÊÌ¡„>´6åÓ^€s0bžš.ZÕÃ|Æ´Ó×{W=╵a›e=5h€þ0X@c‚$6‹m FNÈÉçæÆƒDtUÕ=­¿x;î&kdÄSߨ7Žào>£ƈ*«.ʾʊ®&ërp/1)Å ¬QñE3/±ƒÀ:ø‹Õ䄿ŨxÔ4RPÓIAåeÕ£ÛNÙ½V“MŒ»>•L¿§D}*U¹é¥E륞n¹@ ¹àHÌGZ.¸¬!oíÌÛŸüºûšÜ wÜ舟Dp”Œ¥Œ¹ãú×kÂä׉¨+;ªîp§0ñ0g¨W• Ȉ"Î'†‹{æ~ŸÖe‘8u> N¯–9¢ú)਽ë€r} ƒw¤Ís63N-Q,ŒfB+©Ö¿©L7I(YKPÕÍû–¦£‰G˜8C)”"`Ân¢Nù¡£ãv:žRÕYÜFT¤eUNW¤x„¸^.QXV¶:e‘$Ï%qÉþ¨h;ƒ¯@¹- `Üê> #ß—N½·t™ûáÜ2X_p‰”òV!'êjÕZ"!úD‰L>ã˜cEaQɘo½fET’J®§%™‹yì4”éÒñŽö8ÝÍ9¡ƒIó¢D¨g0Y|:r²Sôaç’´ö<¾…ä°­:‡l±  †¹þ”,d]’¼97\¯ªªGl†ë=€ÇÂõŽÀ <žÍ ÚþëÊö ›Àg<À(JA|&wÓ‰¯"¼ì\Õ£Í8Á.3œƒu£ âæÙ3æ…æÏ<}¡MÍ\X;®cˆ&W´|PWU-ŽŒ¼kxRfÄËY#x6K臜À6ÆBàët`Ö$Æœ¾#ÖÁôv?ÿ¤ëo‚F5ÁÅ8e £Ü|(¼kÌY˜Bð:xoÛJ’Þð(Î3F«ð•ÛæýÑÆŒ›‰CÜj$±RkôÍYu:‘€áUÀuð7%ÁßÀ½yƳKj8[! awà lÌpˆžL¦ª¢GGó¹…îXŒˆ‰ BÃD¨fŽƒfzR*åû˜á’¨I•Œî¥ìÒaåv~gkA­t74=3pœ*ýóÒ³c^ÊkÝ×NË«T u†@Háu*|EÎ+8Wp·‹™ã}>“”–hŽß–ò0 šk¦<ˆÆ\REû¨<®5µ¬"1ù˜…‹y=]Ó1l.*ŠâS 7 ð#‘#ƒ‡ý¯NO®&Ò¢òºo†P‰ú˜¢±hž~W¤ ͸\¥j¡4¸GQ fá© îEDpLÂd çU/9EÈ9)gìÌðà<6¦7c㈖—ÌIVÂr€¹éÈʦIÐàÞÄ&0 ‹+U¦êÑŒ—V‘Vʼ?«Ê÷í5b€»±çq§®f<óM¾ÑÅ95Ê#³y.?„)z^CõGJ¸kGà:Žà“zýÈy <©ç“±8›»ŒÁ åîro”5µÆvýΆ±Pϧ Ù*DUü`Xc@z󸉝 «BuK>œ63Þ‹EÊ3ÃÔÍUJUk+\¾yõ.2 ®ïÕ®Âí#Y\3\[ÝO¿TRI‡©’ÉeËCE×™x”./3ÊWh×ÓbÂM4O‘ë^ÍS$À"ß^qò±7á¶ qS„ ª%ä3£¼pú{*Šœ“°Ž-<ÆÏ!ÛGDÈV€Æ$*ÊO2‰¢}„fäWɦõ#\ÔH‹SýûጶôŒª¸íT§y<ŒÍ ¡rI¶ºž îU×Sçö=‡ŒÅ§‰,zƒ+Wpšˆªòø™Jœ%Gï!;À»Æu EBê³ú½ÔŸXÁä@PPÄ´LT‘ª‰ŠÅ³Fp]ÞžíØ5¦<‚!Šë™à,ä ©ÊB~¶PZH;þŽ—†KµjdêÅõ‰ëä³D˜cj ²“À‚†|–”gêº[•èÅ X¦Zck †.±FÔÀ.Àš’­‡;¸¾…°ô ~H¨Q ao›ÏɸV7è;/å1Ÿ12c ×§czÁ4†q¿Y´>[¥Ýhpu8¦*Y$v kÓbP?ëܸ 8}Ñœñq,=Lc))©(»USTšt«Ö§.`W·/úˆé_ÁX6›}ÐãK·º”2g÷³ÉâÐ7 ÅK¸uke:_qJY¬N¡Ò%ß䘽¤'öLæóùd“Ò+Òn‚,f|°ŠøÜë¼³.X±vO(©ª/ $ŠúÉCÁ—ðæ¬Ô²Y§ÿ%¡-¢óK|‰L·Í€­W&<·¾È³òa¸[C;IÃÙ,1’”æ­¼/$\Ǧ>”É‹›×¬”EbK7Ò~Aäµ[…ÅŠ’œ§$§Ê6¶ˆ¤0kÔ%¸á²]¬¼³E>ÙÒØ×zO¶0 ƒÃ{£žÀ}6‹‘—ØNbžÍÒ8Y— “bÌ-#Y×–[ÀøBÛ*%¶ªKŸ)·ŠÜ‰¯z&\U”§ 5Ñp•ŒlF ™ë·)¿ÑþˆTïA …y¶L„¸˜¾°9TÀ§F4Löò./”¶±Ñ$r»~›QÆÙ?"”›žŠšÑ'_DuÈôN¤˜®ÂTT·EÄr3Q[ÿHè”7)ÀgÈð}¢çØo•2ýW!ahܪ˜¿ë”1œRáòÑIZ¬?¯4öì~–Üä(ЀL4:åMºì¿ì&…“­,sþÒeøÖJwI$LãȤ—].ôYº P¬/‰¥Šþ¦*›.-Ý ×*ÇV›ÍáÔùýÈŽ¨œ‰aBé‹©<•tX†Þsú’˜RÊ(…³•øªg¢U~z*ñ^šEûÚÜ" ágx°§×ÒP•%ÄK¿„-qy„d—%J¨ÈÆÕžS Þ šQ®ð—&zW\¶ÀA¶Ä‚‰M¥rNÆW4+öuÕÕESkðúêe#2J\ͼeÈ>ˆ"èå ƒlœr†PgôÌŒéEunåÝ·To ¦ØŠáèTOk29Xª1ÕÞ ¨A£«ØÚ™Å©Xƒ/¤.“…2AEï…Œá|kqø¹Ê]× ¦´í‹¡ÄÎÒ˜ïíéZõe,æPFK0?÷æ[¤6ˆ¸gÅÔ¯ªwV,‚ÖbdMÿY‰y–«LÕcgÕmÛ“ª<õ®ÏmúûàDc#΋gÝÏ™̆¿y€ßÔèß?_éRñ]òÇf»‡#_Ј”¶6c¦b¹7J÷ăA»ö²ol¶` àlxõGJˆ9xR¼Ž&NªýImW¤1e?nx N1 ,^Çã§ì¤Æõepc0p‰HŸ22°ƒíFï ÈpOtÛ\™B½û;ý%õ@AìõLÛ|³“ £Èº· 7Ã%&úä±L‹ÉTü´¾ë¡-\Oà¢7SÖkpj3~³ 'rá†=poŸÄ, *LºLh“o@Ð1¡eì6ìWH2¡:ýjrõ¥ ãe<Õ> ÆEp=0NH¦ ’ÑÅ3ÀÅXmÍA .U (å<"‚ÂÁ!Y‡9¡Þ¨óÄw5ú°'—™@Ã9"Áç«£•’¾„uIÅš™['e›~ÝâvÆ5‡Þ¤,G¬‹â=ÕÏ+/ÃI¸yšhiV °D´ÙJνn•†^Ü%¥’F‹ØÎ'^ôa^°gZ¬1txe’(Ü ´×#Š™—Rf# ÅðI˜Ãë`Ng$lIÀ6Ó¾cKb,ñ™wŒ0%bªÂkÑF½Ìë‘lÑû>ˆÒ;Šª˜·r‰÷·)ÙKð6õ"(Ó°c®H¦‘MþÚÎc˜À#£s0ä­5›—3%ZËž—Z†ŠjûEÛõ²öS*X3¶Ð‹˜¼8ù€v#nõåË~ÿ5%õÄnþ–…s¡­—n+ªSÓßÍV I„ÍV½çƒ»R,e_£az×RøÈv*¾~í>nÅ<(A´ó`è`Ð'p ܱçjmÚp[®¥ôÀÚ¿v›c«S@_4¡êªX¶äV6%›¼‡ó*¡ƒ]8 kÒ8…7[R„ÏÂ7 ¬Ô%¯6Rð% ЩP¯hú°Æ¥P¸… v[âË)¦Š7‰«Í¯ì¥A:žÎý… vw5F:¦±‘šûu³ÃLwWH(³ßÚ}»Í×^Qô^»åb9ñ/vê}9hð­ 5ó€Ö1çŽíí‹?©4v.Ϙk¶oóá¾€åð€ž ðË¡Øô9†Â³Áo<ÙªYGÓŸš%¸ÃŸó×öÓØÄP…$˜­ ˆã‡W€¶ë™=e¯c»óTvƒØóÆ6î8†×ªG¸…áf¾?a²Á["ˆ=À:—“§ËÍÞ‹¶‰t EÕ[_öYùý”=íþuZ7( endstream endobj 3240 0 obj 4468 endobj 3244 0 obj [146 /XYZ 38.2500000 371 0] endobj 3245 0 obj [146 /XYZ 38.2500000 575 0] endobj 3246 0 obj [146 /XYZ 38.2500000 255.500000 0] endobj 3247 0 obj [146 /XYZ 38.2500000 575 0] endobj 3248 0 obj [146 /XYZ 38.2500000 371 0] endobj 3249 0 obj [146 /XYZ 38.2500000 255.500000 0] endobj 3243 0 obj << /Type /Page /Parent 2 0 R /Contents 3250 0 R /Resources 3252 0 R /Annots 3253 0 R /MediaBox [0 0 595 842] >> endobj 3252 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 3253 0 obj [ ] endobj 3250 0 obj << /Length 3251 0 R /Filter /FlateDecode >> stream xœí]KoÜȾϯ˜sÙ¾€`Ë’ä@°‚ïn‚Eveùûá É‘Dòk²?V79ÆHä¨Íf³ÞU]úúã??~üüõ?ÇïÍÏÏ_É)O“ú?ÇóŸo¡‹Só÷c^¤Çï¿^Ž/‡çÃsõ¿/‡ú¯ŸÿRýíG}üsõß_Žû{õË›tþ¿r•W?ÿ}ùYæªú[rýyþý¿ýÃñ·óŽíëšÃ¼ÿÿ”Uy–1òê—Cû™êòç÷ï¿>Öð{‹.LjôQYcª´úøßŸ?W/h·ON¥UÕ?·y2çE¹>¿ÉÚâ¨tYí”—½]þm`óLgá6¿œ\*Êdʽ»$r³¼þù­àŸ‡C®MLHÊ9Ÿ\*-rñî‚ȵ*+ä&6ü¯Û‡@®­~Ûürrq¨4Èuì.‰ÜTÛ@eB×ÝC€?S¥ÂåäÒ@iQ 7—Äl^š<ÆÐëö6/unóËÉÅ¡Òâï.ˆÜ4É[‹¤ú¯8ˆÞl`s…Cn}rq¨4Èuì.‰\Sy rå7ÛØ»2 ¡ Ó³03–B¯jÇ!/Eͯhþ`—\•XP¤8ªri:» L]kšÚ•œjû©÷EC+ySÝ5º»ág¾ÀgJôŒ~luC]|ÖÃêÀn†>[Eº´&+mh%ƒ§6p¾GÃü¥ Í|©ÎÛݺuvx¿'X0¢ »­ÀÝ´†°®µmv2Jw„„u[78°ƶXdv$ò¨®eúõ˜ƒ<šŽT°Õ\a|©iï¦[â‰Wî°øS"rë± ƒèmÏJà˜ŽYàrG_Â1)¢HÓájCÇ2p°œ "-ŽÄ—Šp¶ƒx#Ý]D¬Oµ:i³¯÷ª¹•ä>X­çäýn°jÎj;~ž½j.äÓ9ù„›Ë]¾Òhñz¢•gÀZÏÉó»ŸÌ±Ðò^5ÇSy9'?rkrys@{ÕÍFÍjdy7òs<³WÍEÕ@ÆÌéd²5 ´WÍÝpÕœ5éœÞ0÷£3öª9iÎX½”Ïçô Ùš”wôä#VV/Ë9YîG*î5x·zß³vékÕœ› ˜5xÖÈ¿u$&M®ë™:7&{t«ù!DÎp/Ùñ©µw“ˆNU5ÜR&¬,ð'ð !‘/÷ ‘³ŠäPá#˜D‰L‚ FKgBjÒvTˆCzaæ§(¦1û/W<+:ʃ!#Gê#߈<1GæQVËHò˜É_iš¿ÇÖYM$Â8BþŒ;²üEõâ×Ñ£¯àKL&ͳ ±Í]†­øù†i¹Lo€–÷«¨Y ­ QßHm]–^o[¯­s¼V‚™¦N÷&»m­Ìw‹T_ˆá¦jXç'Ó3½Kl7ó›`í€(†¹þëÉ}æÁ'ÐŒ;câ .,¿ˆK>ê*—k3(¶Ë„­w«b«‚iÁˆëÄ™Ûs bÐè6ºËÂj_"rƒËç ÔoEžwô6N™ñÞNå;“Þ‘(bl:¦Ù5~†ÊLa”ÖF1HÝ£3M¨%Úà÷«ë™°;ÍÞÍF³thýÖ„!seFaJYc«XNwù Üæz¾ªŒ˜azÈIx®LRc9bÓ娬íDå39`²I†DæÚ Ü·H=·ª™bå8â“£º1äÜ„¦mó«:Ã]?A-̘֧eÛãÇB+Ó:Tø{¢Äʇ¤"îáˆíhæ3{‰Ø”.\<L±Ï^ñ4å=‘ª|¨)F„ÃâÐc ¨ Ë\wu!c_FÊã6qj#v_XGña,Ë}N©™lÊ qɺü|-ÊcìÀ˜Ûj±`–#§¦g™»íÓrÚŒÉ:н‘,•vî3¨Q4—bòDTQö—žÂ~u¬öQò‚{"xüàÖÂð 0À ì!¥c × á¨„µ‰2]L6ŠUwø¼Â´`ÚÍ2Oë&o=ý f“iË$=Ìp¤¼&læ`¶_|Š6•`Cˆ”íÕÊ.D6)DTbó€ÎÝQ¤¡aí¡ö#pYÙ•%A <ïßqë ·/qÂ;é„ðf&ÌÎLËT¦? <ÓPs·.üŒ6­ (!t¦:ôJ¹îqíˆyò~±‰°E[³­#Ôª¼Ã" {L( vØÇ¨˜s-ujÙ„¤È (1ÎÛµ‹F·Žæø$³n$0,{Ë0=¿–É»¦t•Dø7pùÝMK}©&“݃¨dƒ×«,4,ÝU’„UÄX_+è"SgZ¶J\oêÒ@%¦˜îk¯Øÿ[i¸MÛå÷©F9ì#|6ÆG$:ZøTƒáò&ÄÓEå}—¹þ%eAÓ’ÌtÝIáWV|GÈ‹ŸæŒ Á`Iàûí²óQ»¢d®,í’Ìî:Èäí9ïásÞEKZdÑ Oð1¼µÊv„ÓpÈçúS6u$Ä€¬À£¥™¬÷ûÂÛSÙÉ'«áÛt©Q ª¿te‡‡¡K4Gë¿O6(+qÂdÄ »>á;¹YÕá ­ñÉrý²ãwú0cÄ Ï \ªZhÍÍeâŠVóÇêàƒuÆÓ‰ÜÚxû®#hàe R¡Û‘^»IžÄ6Éñ"¯aGûÊV8¦ ¯8v“Mé%FQ£êðn8A˜†I’&dU3z,Ž$¶×yE»$^$v ˜Äãí" L0Ÿá‘xpŸcÀþRü=P ÅÒm»$v ŸZt˜­c /~S<”‰„å¦Dbx¬C¾anÄ_Jp–CòÁÝ:tì†:Ž>,& žÂPÄxÜuè®CïJ‡Þ‘>dVvM¹kʛ֔çìü]SÞ¶¦Üã~kXÙ5%§)ï=ºg‘×ËìšiG‘7Bph¥6:‡ŽãÝà3àôß W™S·|Ö1¤Žw P¯ïՆƤÏh¸âvÿDœ)\qÀ­ƒçÏ`¸)xŒmø£!í|†+p7­ýO±<ÀÝÆè  0MMëh҆Π¡ëÀ/¦×Ì¿˜ö”¤ÜÅ—ã4äñÔ³[eïSKÓZà}<ÎÓp$¢0¢…²·XÅY7õzƒó½6F°½5èRlÂdûß@îO2Ñ|ËņÞí`˜J+ëòÕH„H€¥͘dÂ[jïµÂÙåGEÉvÃXA~Qúv{˜d°Ä‘Ðo”¨ Û‹H–£žˆÖ³L´ Uߗ³|Ìø£Oʺùû[5n7©JÞÀ½™{LiÄ#—¬M•D˶M´þÊ*tvxpf¢pÙÑŸ%%ìC†÷˜vÐŒn_Þ5KRˆ‡/. .aé8=ßU!B¨RÏaC‘þ£Â%«y ËëˆXcvDç1R^+‘)à}æeŠ ï5µN%%êP3#<.t¢•NC3I)3¢Òçþ+–5Ë8ZÓç¶2—hA:2Ô§ii: 5Œ0œ5ˆ8ÌÕ Žú&Õ¿“ˆ! G¹%FúPÁòÆ6¦øD¢C”+ê~ ÷$dN Ûǹ½)pË7%A“å]ÿy#—0r};Æ"éµT6ž¬†M‚ž)²Ô ª¥wÏ”fšco¤Ã1aYÆô¸›ÎEDk!Š2™ÛYÌ‹¢÷©YošÑS¹éj=ÝRÎ}¯½¿îý¥[2麩{ÑíÒ(*r)Óš¸Â ìoÈøŸ²¾W”áCÈ^êBN6}ˆŠë2”IxY£Ñ€ iC¶+k=Ò¹DLŸ>({æ@Äeì(1Áå¡ÇÑaFEYÆÉf"ˆÓãý*‹•,c¢zÝà UÕ?¸S‹Õ¯UÆCDœèbô<Ž‚qØH‡YÁïÁmy0ä©â| ƒ.«%¸‚[ßà÷` !¤Õ°‡§Þ8¼ióV"Äk%ª¬m%›eh‚‡-¦EÜ8†hNä 8ü‚‡©æD;N@´Ñ`šŒ0­¨ÐÁ§Ž$ápÓ-¦ #ñn%2ÒWöK1¶™vQ»æhâ‡Ò›Œ´Äz3§Átbw?ãºbÄz~L€¼íÌ|½kÛiÖ‡ŸÑSwÅÅg»’D³Q>ƒïFœm·k\\²fºŽaUŒ¤jé2Oâ ¦×P×™— aÓÆ©ÜRæÞŒ©p»‰Ôgí¥U]A·d†y¬‚Ä[Ê3dF@:Zlà,žýŽ¿å2„LPJtW#1, "<Ò[bÌï Ôn]´FjsFå=õ*™éöUEßÛ^´‰j_#1‰WD¡Ìò¼á s"kãRYBfze]7jO’!T“^‹=xMMÛ‘jB…6qxŠÅL2Y9z*Ćƒ×xâÖ: RÌIbV419ÍA¥+-À‡¼MòPŒ™2c¯Ó×)|‹JÇnøzCj> endobj 3254 0 obj << /Type /Page /Parent 2 0 R /Contents 3258 0 R /Resources 3260 0 R /Annots 3261 0 R /MediaBox [0 0 595 842] >> endobj 3260 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 3261 0 obj [ 3257 0 R ] endobj 3258 0 obj << /Length 3259 0 R /Filter /FlateDecode >> stream xœí]ˎܸÝ×WÔ:À”Ň^@`ìnÈ"€aY ²<™ƒ™AœYä÷SU¢ª»%J<º¤¤*ÅHì´Z"yß¼÷ðòÝŸ?ÿãø¯ßï>|þÏñ«ûûÃçCv*ó¬ùÏñòç»×?ÐÕÉýûXVùñ믇oÇo‡O‡Oçÿývh^øüá¯çýï¨9ÿ÷çã?ÿðG÷K—_øõPªòü÷/׿ëRÿ•Ýþ¾üü߇¿ýáøÛå‹ípn2oÿÿwÊêÒ”—iŒ ýíÐ.S]ÿüþõ·Ã»†a£è*·¥=*kÎÿS[}üï??h?Ÿj«TYØ2›3P©/#™3y”®Ï_ªóÞ@×?BŸðñ\©x¿Î\œ*ÊÊÿuIææ•m™›Å ÿíó>^–&¢ä\f.N•–¹øë’Ì­ “¹/Ÿ—ÿx‘åY<æ^g¹øë‚Ì-T¦å¦oÿçÓÿöùÌ-L<Ímf.NÇ\Ï×™[*U72uæ¾|>ýË\ÅÓÜfæâTqÌíýSÈWðTšŸ€¸ð›çÅ÷_ï>*›§U¿ütž\3æõ¯/g¢äÇï.Á`U¿üxüc–™§?¿ü|xþržú¼QÑ6»™[ã†Ì¾¿iOÖ4!úå÷š'åõIuªê¬Ðùë'à;=Ñ5üZ~}bN¹-ªòÍ“ªygÊÀ¦ó«JÃñz_…¿j O–x²xøŽú¾»À.q<ï8¸. ø5B¸0ý<̆ã( ŸTp=xœçë“üdt¥¦rPDð ã5y`ͱ¤À'ž¯u…—Q#ÌlF‘=4ÇäÂ3˜¾tÌ8ý dR”Õu çà%§Ðñ€XO°<5z¢LKÕH2hŸóŠRMe¸GH°aÃÌ p¬Xj°‡Å | ÷½¦ae}*‹üí8‘ÃÝ"»¢ìH¶unBAv˱mèkÏðÉÓÈ8•DÛÕÙÜLOšz±è™™°7Ùžpù”÷ôÌýr‘¸h¦öµéx­ªW RÓ4H¸Óõ3Æ@Êl2'EÈ-Þ¶¯`Ó,»5†Ôñ¤.ˆ¯a] ¨xÌc€Ñe‚G¼â6âæã U} ½(ÚUÏì¥6}üõPTêõ~9|ŽVFÊ™Â[ågò±nûgÄQój¡ŒÆQ»oÙ¢2”?O¨ŠS©=-eÌ‘ gÌ*SUØ^éauÃX&Xõ ¡ÅùûðÂÁ;Ã>DÙa‡É]@Æ FÀ„1áXºzŸ€F1(‚^äÕýãÖ";"f#eÏ^›¦bLä '¹ŠÏ>KyÍqle¡ÊVÖ-õ?ô®GA긧½aÅëÁ4€³ö<ÁIIœÅO ­=ëÁ3€+õ¤_áJÍû„ÚdŠqIÂ<Á† iýýÊ)’ç3(Â<ÑXJ¡ÄQZ·hÑqåK;ƒŠrHû 3­Í~‹ZÏ×°5ÇT„íøñ°\„%޲˜ðkž'ÄÜ #± ­Z©tj«ÆðSj†KžɲŒm±ÆsÃÞ{Nlqñüµ±²ì‚º‰iuÆÔ 5èxË–RzÔDJ•µÁ T~Êjó6ÙÁT„‰„•øI“)ñL'šˆj“WêçO#_ºtä~Ppʺöd¹W‘ãjš§ð¹bÅÚZ½.WyצRóžî2… P†Ç40‡U±l¤íG7[¸Æ¢Ÿ¬]<Újã:šì ÙÇDœC\JÕÛòá=c?<Ðôj¹ìééÔ㊛ßëYÈT1±‡Ìv Qt#ë®)]'hàòž“vª+öAuŠÔa›Ç³7Ëöh ‰˜ç%MÑ¡®L;+Yüät½b¦Žõccƒ¿6]ÓVÐ{Æ0»oÆ 7&)/›Ø¡…Xëèñ¶UuÇxìY‰°àîSU¤<ØÖ£‹‰Oœ‰÷Ä¿‹gÝd’Þq=Ä~&J¨*’\Õ-pìá¢Û|G` XÂâéâg°v°Z­æÀ+ï”\›äð½”ÜP>ß <¬.gñ{%ï äÔV­ªS[µ”¼ƒ’½´^(¹8of·áuŠL—â£ú‹EVé·,QYÛlúE(ëXŸ*™r¯Ф±hÎ~p¡é=ödòLኋÐez’{VŒóÁ j„èö˜Y%Ì×–Uǹ0Å(Obç­§›g¬pª&þ²å Û&Röž;²ˆ"häÚ>u{Àô¾zÉjûKá]¯Ý ãÆb¡óìnÍk^®çîxÍ; £qQ”A?b&JÜÇtŽd¬2u_LHÕ ƒR‰Ê÷!Ø„ P¦=õài²O$',PxR·ˆÁ“&$€ÌàÃØzÒp8‰$,~ª4oUO¨ìï)qe,¿Œ,â´{†a XO˜gÁÚÀPÇSh‚_óvM#±µ× „¥m:|ˆrð‰GJ±6`™ÇRJè0£[)žXi–ÈÝøë°‡sxl+ˆèÁc“˜!Ö¢ˆë¡(öP(Ð"–DBë=r)Jø&ðÄ}XBx¬Îeéà`…¶-de‡ïPãmÚ¡Æk‡ º˜´¹C¨qq¹”§È5æ)o²9½¸SžÓ#{‡û$n‡G‘X;§·ø5ޡƬn®jlº÷­×ë¼à~Žjõm­ûŽï‘v|ØFbþ0\ vo{· okÍœƒ=÷¸«²ùœ}澫šAùrÎ~6©§©çìÿ¶¹«RxnDU„±ÙûÞiL./°÷½Ó„½öäD‰)™ýÖª÷uDÕIÖ:¬}÷–›Ü™Vä¹YbÔòLÆó±'ifZ·&dÑ,ØÃ #žD‘)T½™AͬF!,ˆªJf¡n¶ïOvÔãŽzôÎZõXù[ EþVô†n%hYÕÇî7$Tö¤UçÔŠFïŒÂî‡VûªTÇÁïð ~ÎÍ)ÙÐù…~-ƒ…´Æ3p`耕#Ø!ºÊ;rä9m π̸%®Q×Zu–÷p9òˆÂcT9Yx¨î®"Ý–‰£’!Ýq£a4}eþ'ŸÍ\+°üÅKwrëuìÏÎ:à8Õ9= Iµè…?LëÜq@ä ¼¬œSD‰Ûûž:Õ/ÊAûä–á:rM'ñ!~Ï ¡êI&uŸ>SËøœ±#ÈýiUw£–(íÖYD݇M9ÑÈ„ÑnÙ[Ö< 0 ö&!©ZÄȶÿ¡¼2ÕxDçq®>eõà¾}XvÆÂøÍ@‹ª“¡ Ûh=9=¶[†„Ñ]µR]zº¹ì@eoæ’½Ê8•2Ñ<ÖZl‰ñ8¢Ô‰ VÝÓè>’Q˜›ÚE»àÉôee.¶“%ÊŠ¯$LÜË1¢×:ï!»žŸ¸N9 /!ÕÍszû`ÏìÓ^.þY¦êÎ~g]÷fâœÓøÏ•ǃ’=ž.v@RZXÿ§ü5Óis#îÒlÆ2“wüUˆÍÐT]˜´%^ ;½’þºg* $™Rb&Ǻø† Ù–›° LžÙ:$XÕuèø)»2³ãât¨•0Æ\+‚+QÓo™íÃÓ×¶# Ôö”hTOÝÃ-v^¡:ªzGW4äxiRÑØ •šŠiO‡ž”nº‡Ä_ƒïh?ór¾ªêº³éE2#nK[¡íáìªÃÙTÕ)*`àÕ̃q£Ù‚f²2ßÚ9~º­ÊÚÖ@»˜´À%1õ¦èðlSÇÉe¿ÌnÅc¯ÄêpPßLû[ûÚœ9‘û‘ :+;dHµ!*u>‡ˆÉ<ÛCÆ#­é¸MŒº(d3Y b:o ©z321ɹíXЀN Lr‰AæR§&˜ ŸIÅŠžÿé× ±ÔˆtÔWŠ·w²O‰æ4Sêþ€‚À3"Ô“C˜B·yª°¸hóˆ8,¦Ú)¢±n‘Ñâúxìš8,ì¶Oq/Mxcéÿ…<óqD=…{Ï´è•#ª¸¹÷m#Š ìáí ŽÇÎФÍÚÒ*yç§Ý^M‰™²§­RÙ'ša,v^N¦Õ¡¬‡¸wxh•Ÿ².â‡b—ÊŒXÎZµw2y,g@ßÊT±ãZgíEbÉŒkÀ+-“Þd@1ecÆÎ'BælËf/ÂîÀb—éÔÛÙ90(>ó5 ZsB—A€¾*ë7=Çã©—Ë∖êÅé1ºøk oS!N™V6‹»Òˆo¨£Jc1"Ÿ¡Ÿ¡P)¢|]Ž“îÞ=]²D^·Câíh*Õßì¾ôFÃd`¡ûì÷»Èkänrkö¢T}fñ æ3= ‹›É‘.ÚfÔÆ«¯w_S[³ðä'“µÅWcsÌÜúD´›],}G^aðö¢éq&Ñj¨•ÐgŒñDÙ Ü0ä¨.ÛKÃ=H|Áæ´)åÛ’–?áL]$Ò,‹£,z_6Æ•µ+€í Ÿ…\Áj²™1#ee;–m›yEêøI¢|ùš÷Ìk>3È\™·êÓϯP‚ ³.FƒÎT1ÕÖ‚Ûéöàvn÷àvnï&¸½Y¶=¸ÝƒÛg°“†I…-ÞInƒ7—™šÐ…Þ1¼cŠˆøìÑ#ÁEl¼bo2ÄÆš…ezoÙHb´â+ÆÈâ8àNÏrºâT„#Ù}š F²¶¹tç•Þ¯9’Mþ+3;ÞÕ`Õ†+‘yz¼ƒÌ¯D#ÙY;¦³(Þ#1(DÂC>sÕ†`%LL“móŽbî±ÑãÄF;À’ ‚Ém¨nü^ªßÆÒ=˜÷fê¬jñM”¥JL£æÖ´;9Iß›¬è0+(DE¾ò*‘*¬Ù3%Ôê¢ãš"7@]¡1¤ŽVOf­Œv_Ì.ƒÅ`LDÜ[ñ’u’ÞrE›uÒÞ[Öî1Ü1¹˜À'Àò¦²ˆ1ŠÝQ/ꪻÞR¢ÅsIn²~& ‹tC¿IþÕT°=QP6”½&š²ËL~S¢·g ¾MS I—I$«¨Ë:˜ËÞ²™x'*kDKW2ýh.¾Ãš·8ŸŠ°F­B²îE¾9²“ ÝíFOv;ÂÍ2…\Ù"‰ìî2rè³|ØŸê¨Ô&snû¯'öYÊ~)›!V6ø•߀sÐ]'ó†IzâRCOêð¯9Æ=Ñð '{gPÁ'p=ÎßÍÚC7œËàza¦Õ"£¾@i™ !–f,‹ï`=rNT—=•UÂF2‘'‚Âùs<È9Êâ2tÃëÁÎ`š:ÿ9~;+”Wß>ýÂèY5¤ŒF™S¦.-#ŽÚ¾å÷ò«™w9€Kiè£Oúz@´/ÙEÿ‰³6úäZV¼’„fCŸ'4Ž;«14·n¥½®.ÿAöeJœ¬rKï-Ð)(>¼‡fËPøkð1RAK/_Ä–¸Ë¿Ï3ngŽʘªP<_Ë áxBÂá¶¶==å Ƕë©À5sï8c¡cC|­:‚ëNVa”;<%BØ=ªó<_<ËÌœœi›(§ÐTéWÁÔ¨ýþtütø?ãú„Å endstream endobj 3259 0 obj 5026 endobj 3263 0 obj [148 /XYZ 38.2500000 630.500000 0] endobj 3264 0 obj [148 /XYZ 31.5000000 311.750000 0] endobj 3265 0 obj [148 /XYZ 38.2500000 630.500000 0] endobj 3266 0 obj [148 /XYZ 32.2500000 311 0] endobj 3262 0 obj << /Type /Page /Parent 2 0 R /Contents 3267 0 R /Resources 3269 0 R /Annots 3270 0 R /MediaBox [0 0 595 842] >> endobj 3269 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 3270 0 obj [ ] endobj 3267 0 obj << /Length 3268 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾Ï¯ès€m‹¤Xí90l ‡ ‡`7›`‘]ÄÙCþ~ºGT{L飚_)¶ZØ3¶(²ªX/ÖãÍ?ýýðÏßož?ýçðƒûþüé©:vM5ü9œ¿¾{ý mîçCg›Ã¿<}9|yúøôñôï—§áOÏ>ýô¿ƒ>üéô÷çÃ_ÿvúåîCçüòÔ©îôýß/ßûN~ª.ßÏ¿ÿ×Ó_~wøõ<ãø:·˜oÿÿªMWÙó2^ýåiܦzùúí‡_ŸÞ ˆ{‹¶]­ÚÃéWõAõµ>ü÷O?^0N_ûZ©®­»ê–uúü&¥úƒÒ}u0ýôE/_2Ó«“7ªJ7ùËÊÅ¡¢L«Â³K"·iÍ ]w)à?NŸþ¶JI9ç•‹CeD.ž]¹½nÜÉmS€è2}‚É­¶é&V.•¹pvuF¯VMk[}=G[™á¿·ÊëÎð fò˜¸LŸÍ­Öé&Y¹8Tš³mëþÀŸÉwÛó‹;u‚Y­N?§ä¶kG¼«:r¾NŸ`rkUºÉ_V.•‘¬ðì’Èí­“]›B—Ù€¿¯Ú:n_V. ”µprAÌö§‰ÛWÓ'˜\›têú°òTÇv:ûǘYðR†ß“òKàÁ·ŸŸÞ|PõYGnŸ:+/ï|ùöù”æðÝÙŽ<üó‡ßŸ–dÿpøüóSlu3.Ñh8òŒFô[8ÒÇ¿GÕp¤‚³øLK¬ ¼‡#â÷c¸½ÿ|" ä¸¯ûeøâ•bz¸ÇPT]ü ‹Wð.ž*ô¯ˆâUa i9@±<ã'°6 7|š ¯ ¬R^›Áßg<›'5p?›÷}6©÷ç ¿§Z¶ÝøVˆa¹õ ÅÔÕËbšZ,``5ª:¶: L`gkã¼RqæØœh÷z¤jÑ3z`\Jù,­>žÁfîøXŸ_ÍLO½ØŸ>°’–áx†ù÷Þb•Å/îàÈM<Žc¦‡ пx âæh´Uׂ:JÕóõ@K l>äê@Á«Vo} àé!Ö…O“9Q[<óœAæÔñøüFU‘„¢²™ÈÊÓÂB)&ÌÚásLLkÀ•2ãC×¼‡áø8âTž,Ñ&^‰b¸Wý>Ÿ¾Úôí ¶öúØ a]ÔðÌð4~3<̈°­Î°OÖwêýƒžŒŠª(ê-ÃfmUsß<¾û†ô‚}o%s¼j<9Š‚'CaŸ æBøæ„Àv!gÆÔ÷}fúP9Æý]ž™lÐ!Îæ.íË–ö;'Î̉sל8pãÄœg¼Ÿ‡±9ðN#ߨûõ\wØ%ßðÃsŠù`ñ¼³Ó‹û.šwâÈ+¼¼j¬×Ì£×Ø¥DÖ»”Ø¥Ä}K‰^Ý"%˜ˆZÌñ‹ˆ&íÔ\Qt$yEœ-|îuO‹ãs„“î<6#•=%®º ŽÝ離Ýñ9«3%*8@¿˜ V™óÈðrCؘ+8)#y1 ð Â#ÄÚðÙ*D+h»(V˜ÊÈÓa …GYíÐ& XíL¬8–TxÏÆh¹Î&/¥õnéW»~ºk¡ ´ÐÒ-ýÎÞ èôF•Úƒêç–©Û—eÚú²Ì ª:6Ãr¾¢´…#⚣n‡¡¯[óÁg\ðéÜ3=zÆ F¶2Ç!Žt¢dÍÌæ.uçV=0åsTro¾™Mü6‡Þ™gŒ‚³}ˆ‡c!J£`ZÕ È|;a๪Ý0tÍ àªy7·Ÿg8gÓÁÍ]î·G£†³t¶ã››Áv G0½5ptº£ist ŸÑbªûBšœµc,×Åþê&ÇœOŒI̹µ·‡€¾EÈÙ€æ‚=’X§‘•çPWÉ3,Ug=¸Ò,pžL¿sW\F‘…à˜úip­3Iv8/§sDä ám¹a1y§þGÄ>•4ÄdÁIŠÙr:Y< ξ"2œÙ²0'Vá­‹‰(ßÚ‰p€ç‘I'Æ{ 0Ɔ“{ÊàŠIerõDWÈÇf2¯ÏMŸžCJÌiK››Îžm*a‰SC±If„rB€Û\OTS±ù.žÞ±Ê 2¬¡` NèO–©AÄÕ†`×׉À9ÄUJ!¤Ž&’}ÓúB/£—`µT8[-æ} X›ê„oßfÆ~wÂOÍDMâ[#&n3àùÜ-ë–µ®jÄi7£«0™ôÛ…x~!¾º¿AVk8 1*mrKpðtöÕ²Œ»oWJ€& B œe|ú&´ŸËÂÉánV]ïSÒ깋#—‘cb‘yóÆó²Æ(‡Üõ>BYe;àžgüÚVãb-²(<1Æ/u3±$#tˆ”UÂTçÿ„ÍcéˆMd\€‹WÙó.t,Êez¼ =êÎmsŽîÝa+kë1*d®Ë7¼6,‘„ï`13c$,aJê–\ÍøC>¢æ/þ¨¨³uMªN€÷$jβ‡}3&—T0á `aM”;b‚vò8‡ÎP*°œIo!ËeW [ÀþqŒÕíáã N– |åáBÝ¥YÀ~‰²9ú_¼D‰ƒ[)#9N†­.%IñÉxJ*"½ÑV·•¼Ü^[ÝTzŽJøÄrJN¦ Ý ô›ò7®ZLpƒb¦„rìüWx¢VG@ÞïÉáK{Sjd¿˜+àb®,à$t"™:`'”Ì0$’u à·øÔ¯드­º©x×Öt‡š((9‰×Æ<ÃØJÐk‹­‰†÷E­ºtEÝT6j×Qv…ÅÂÎ…2r!Q]hs˜Ãœs ÂO¥1D±]¼6vS™¿­icÂ¥Ñ0GÁÜ¡à„ÅëOÙ ®/¹wý©,”|j×÷H{öò•ÂR¼Ž"Qo3:J ®)]¦ëê–æ¨»Lße:|£ÏD#1%dÆÖ¤½ÆžLU˜v˜²ÂLœëW¼V¡õ-ñTrÅv¯XimÄßÎT·FuߢDUÓB±"iá8›„Iú }²õ»ü­/VùIœ^[mÈχát«¦…WÚÃ<“nŒÏ§‹x¤êå*½Ääª1e6¨¼3óIMª”aD•NÌO™š 8£¯†ÇzÒÜr埠LE¨DdHƒuOT26QèàqÎ;¥L礲b®döÉJ0Y ¨ ÿ\å¡$x,U|Œ¨žÌð¡øªw_*[¶XK)\'e1ÎÞ7ÿRë/imHJÉ—oM§¾=G+ÚkwêiËëïÌC}U UfÃÑ-ÄÉùÅàd¿™(…*´-‡*ðl¢õ8°÷n“®Ëñ¨ÖØo ïZ¨ú-[ÄcÛ–ƒÇ­Ål—mŸ‡’lS %a Ó _ñhûËèùä11ͬàJŸJÕ(O ۋ(¢¢Öñ¢"ÆfËÞïVy½˜R}›²#d»©3YeßV=*¡ ¯ &™p©0 {ZK cŠ­Æ+lƒ1âK¢𥐝°ïšh»Ã”Ö*½–ÕËë ¬tu 3…ó4Óä‘ ~$š=ÈB”¡Ëœs¬¹¥<=s(©G„Påš0¶rBþÒ.7[ ^A×%JÃÜÑLr‰2?¥›j¸ÐsQ!«<¼z—öiåu1ºFÊ;ïÖz»¦L*gîÍø¬7»9V½çt‡,ctûëqèJ‡ç&`E8÷0m¾/Y[‘±ûDycó²À”"¯í}™ÇTÀ•7˜ª ŒAüÖ#z&#°X†E<çÌ‹ Ï,VDj§PØÀ>ÌœDîZdCZÊsÜRu…×ÂÄðcøQD©Le~”.‘I7.\IîÞRVÒ¾òqyÀ°¼°ƒ™ˆšÀÜ‘¢'沟¸gŽ‘b²—»¸¦L^4$B¶¶yƒ'&D&¢ ,¾Ì„õ?×7%ÕÑ Ž5c ‹\V2¥¶¯7 7™^øÀò¥J¢[µ‡ï€oƒŽ± D¢ä17ÛŒW„‘—ŒJrOöLŒB8ˆ)˜/Öµ¥85ᑚŠ/Âé8¿×ï+pg"ê¡$¥UÜ8SöÊ];3¥lÖ\.GÞ”P¶uïkT²eâª2õµÆZÐ)ØšÏåÌÄåôårÒ–L…öríψ22+¢Ïjáq„ã1qÔAê„ZY—ËD¡— oµàDb™™&TÄ-CÞLGâèQwÙ¹TŸµZÕPÍ3DS>(iVdë€ÚOhÅ$ÐgÊL*52!»Ô4ÚWpYѸ×@¤*|Æàª)¸Î ®2¢ÓÛÖƒ.åªÂäËXu±xn»=cIÈß•1q£¯ôXwòáØA\ˆ~®@Ï|áà}UïI;¯FÖMŽlõ¾êÛG=)/ÑLëA— ý'DÒôÆ Âõ&!´bBÙD¢³dS&Žó"Þ¯:Œ²¥!,m©UNÊæÀ¦¹úø”z¿@·é"xï6Ë,&Š÷y/c(âw§æä²–=aªÈÊŸÀÑÚâ”׌¹Ëö· ¥L‘ ÂÞ žp¼Q’0ÙJªèõåxîOx"ÞnÛÎçíØ"êÖ¦ ›1±[D{jg妪ëJÝ]ˆPÙ뇵ª°‰„E0,B8fkwÄnÉ«š i=šã'®þ1rΟj"ûÈæF*삇#÷<$Ф 7ÒÁûÁç»6ð>§Œs…¨àp»!n¤F4 ð7¢%_æK°<ÒµkNíÒ•ãë¯ú>%€?- nx…q /]1âºh D1äÒ‹¶&]wº¾WºÐ(Ñ;àäyä»}بÆ(ªÀ8Œt ¬ ‡ AŽ‚ùàn#ï#9å»ÁÖ™(]ö³í§9C¾°]qõåLŒ±]«6ÀÅ] k?Œü ÏX–¡ºêÆ·b)±4’<›±×­þ–Üfª½P±ëÖ–µ­·»‡SdRÆZíÓNÚR“1UàrµÎb’—‰ ÙþT"‘§TXÈD5Ó’- ¶~A¹ˆ&y ¥MϽ™( *¾‚Ék­-›S:N´àÒ¶š³Åmi¡¶—³)±‚6U†þˆÔÙX¿µHÁ­\_bñuž÷§¬,ÜÕ¾Å$ºëÜñ{HQú2Uy},=sübu B º;‹ªã®eÒœ„ˆ¨;Â06‘ ÑdÌQ“x^ÒgCˆØü¢ `¨Ž ²ÆÞ»T€%ƒÐ^l°ˆÂ1¼F•pG£cö²#w}•Ð~ÒëÍÖÙADeê3Å™<‰”qª@˜h=™Ú¢²Y±LÒ ö1ÌœŠãPލþÛ„[BA×4Ê—Ý%»¸Wë™Â”²Ÿ‰üÞ{ÄÓ㑈æ¹<ÔØ÷ÊH Ñü¾MÕ%´ºõŽþ~ñ-Ù~K{Ð}¼º„ëWà…|‡¬1Êà°cE´oQµ¿€~’«z¶\Q¹ T_ g犒­kÿX¦u R½:'!DŒ»aÂk1Ge”KâdMØ ³/FÑ„Såº5]ÑĪŸæëñBÃuÑ»J‘ÅáøJ‡0Ú–óx?Û ÓÕêd _¬Š¸åóJ{)q¦ˆ‡Ä­»…]y†6‚'ê”p•Ò^º$¼’’wʨ’¹Ú­8s[ø G´©e‘±«7“:[ûr‚#0žc‘«Ñ\3©Ø˜ë£¶K‡&vLh—¨´{&RÈŸÑ_hì"ºW+c(ÈEÙë«'Fe.ášL8GD.bS–¸ªM-û·abFTm¥â¬;ëÊä1Fø8™‹Ùš¾1–QD(Æ-ÊdúRJ¿¦ ©•'$ﶨìéëðå‰  >.}à HÚÙ¾§½VêŒóƒ®Çu+ˆØAéfö:Yõàw¨lítÄq}t4÷JýR«¿Cï1KÖíÜÚ>¸"²Ç ¹ö3¶šÚéi`O–+3ÛPx6øŒã˜*jë¯â·Y‚;ÿ|Zñ¸rlB$ ÞÇ“€n!yB¼º>ïs°Ã˜ðÉ&€L¯5Î✣dLPx±ïÑÉtÒæë6œq‚µÓ(©¥¨ð8‡TK¨­cqÊ/(Â2€ˆÊ> endobj 3275 0 obj << /Type /Annot /Subtype /Link /Rect [151.500000 196.250000 245.250000 203 ] /Border [0 0 0] /Dest /3#89#3fq#24n#f2#2d#9ek#2d#12#d9t#eerd#b5#b1q >> endobj 3271 0 obj << /Type /Page /Parent 2 0 R /Contents 3276 0 R /Resources 3278 0 R /Annots 3279 0 R /MediaBox [0 0 595 842] >> endobj 3278 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R /F1700 1700 0 R >> /XObject << >> >> endobj 3279 0 obj [ 3274 0 R 3275 0 R ] endobj 3276 0 obj << /Length 3277 0 R /Filter /FlateDecode >> stream xœí][¯Û¸~÷¯ðsuÄ‹n@Q`““èC ú°èC±Ûm±Ø,šîCÿ~m‹öq(}”øyHI¶´IŽHj83œëÇ7þôý¿~ß¿y÷é?ûÝßï>íŠC]Ýö§?ßÝþ@7÷ï}Ý”û¿ì¾î¿î>î>ÿ÷ë®{áÓ»¿ÿõ¿½Þÿåøß_ö?üýøÃŸÜ/~áË®Võñï_Ï·µ:þ«¸þ}úù¿wûÃþ·Óˆ—éÜb¾ýÿß)k«º=-cd꯻ËgªóŸßüm÷¦#@Ü,ºiMÙì•5v¯Z«÷ÿýçîçã—á‹Ck•ª+[÷LTëëLº=ŽdLo¢ó¡á nOã¦ü¼rqª(S©ðè’›[y?áæ¾Ÿ`ðÚ¶é?¯<ÙæâÑ%7·)TG ]´ Ht^žþíñ§ 7÷¼rqª\6.·¹m¡JÓ¨¬ÿ:zнÕéöÖ­\š(ÝÖ—ÜYÝ:¥YW)ˆß&SÉmaŽ¥c›ÓÊ¥‰rÙY8ø¡©Üà¿É©›Ó¼ö8½²êøï¤Áà¦N8øyåâTq›ÛýcÌ(x)ÝO@ðçkàÅ·Ÿwo>({2Š«ý矋ëæ<ÿõùH”rÿÝ) ЪýçŸö, óáOûÏ¿ìÚC¥ËË»'…FOô÷ðƒž¨ ¾óŸ¼ŸÇà4ÄÚàõ¾ó.~üÄXø|¢[¸6EÐ^AÿŽ…\•Öw4”]ÆïœûƒiàÞyÿù¨bRk«®ô…û8ú$ÏJu;ªÇdå¾€¼h0_A©Ã+È0ÔËX¶ H6Âz$ ]Öjº†Æ…®Xã’ë'ÐÐUUû NÄšö1ãîKÔ1¸*å)âÂl, ØP©šÇpx©D ÜA&'y¬D)Éñ§3"¥·a nÔ‚O™Ì±­§V(_‡9­ð†cõå­#3…S¢¬@¹l=]Ë„}˜ Ñ,8N Y¯Çb ‘ ΧÉÄu2"“ƒ‘©°ÁL,µ«±®Ìãjeˆ¶kò§ìû ~Žë4©Êë¾=[ Jª3ƒèB ôlàµážF¼\Ý@<ÉÙ«UUzûÓýŽâKŠ¢µ5˜n¸Sü!9¶YKwa]\C[°™¡6ÓU¶éÕ õd3sv­«Ë¬Xsàï†;Ð]›¾“æ¤Ù%]øKçï9­› ŒŠp V´TŠ©]-ÁÁÙ"ÍE‡ü˜ýé… 3ú…±›ý=AßÉêÕcx<؉˜Ó~ij=¾÷˜/±MI Bäâ¤Àyñ;ŒŸ‹O¼?ËFï±’á ²ùŠù%À—ø0ÿ‹Æ+²ê±+B£ÇJŒ›'z .=²Ò6Õ·|>×zÎ.m{ä qdеúSölž[o©+ìüK䥙Ë$å ó×83¾?Uz2{[ ´©¤Œ`7&ìA`öfïy ÔÖ]¶Ç:é"ê)O FŠtÊ"û¶w3Ð0²Æ"(gWæoƒ¦àdL º'¢ÜV¶v;6²ŽasEàLf÷AŠJcI`•Pö®,b”¬ˆG—•§.9Un¯ÌE‡d †`˜Iwû02‚(ƒ¥=ùñ«L=™î4ÔSÆÔVµx´Hࢽ{QQ \' Ñë(ÛÞ-ëwláž$ç2é OqW„-Ç_îƒBO?H·°ÎS…u2]Fòp€o¹n È$§¶rßSDÄß"œ_|'ö/ !ñb…-Eÿ䦲䘻¦ÓT œŽ ¨sÖbE>?5‚æñpl¯•I™°¢SC‘ñq$¿×=Š?['~BvÖªò¨;Û¥4‰}Ê·c’$DV6꟫6‚27D®ªI4ç.y'Vʳ©T¾0G ,3WÎnò. 2tÇ¥¥Ýˆ€©c ÂfŽ¥ƒ>½õðt?™$u*³³ñ¥î)ÓkkŒñ“*ø‰¯7º/Pý/8-伎úp¢Í—]]˜Ûüºû”ˆ§‰<<‰6¿SÊeu®¬¸/Ýo\<Æÿ²kšÚ—|Ʀ9œOK˜liGxtsÝ2,çj7aW[ïJ×!#õ¢=ûø¿‚Pö ½+–´FïŒB÷™ð0£J8~§‚Oð;pm®…xh{[8Z) iWàJ†TFú+á\™ü+Ü ŽºC]7Œ•Õ3â Œ‰û`3YÄœœ^zDe $gÔ­±³·ZQ@Ö²µÓÏ"*¸Û;¥pò‡ åDÚFyz$I 2¡&,µ¢n· LÏ·Ðî`RU"ØôÔT} ᇤß!ð!Ö¿JÜf®|Ør ‚OQyÔ¿d‰òt¢ïoLIÔÊ?…˜jSªŽoÄRšmçlIcî&÷ʘ.Ð^Û‰hÙ?•ÎJœˆ"äv‡Ð{ž Sñ¨ÒšÜ~ Ï#;a´"ŒoK ÅÊâ…a¼Œ<‡ñŸ0¢P€¢/Œ@¾½`Á»=;Æo[èk¯k6íIôÔ|1Y»aÁ]‚ŒW-Š}Ñ#ázfÂn¥¸,S* 'ÌŽ7ã܈hÉöVH„„r•GeKiéúbéhX*€Ó,ÚÙ~°33*9HáÑ  ¼Æ("ÒFTB ®-ìÂ+x+è䤺d§Ð'»i½:þK©@œ¼#8$°§ðKóà/åô‰Eí?^¥Yt`Þà¨1Êû¼-8*h@».»󤜳·£šåIm^Ïì³Å£j ˜V/¦Ÿ¹>›ˆ«S÷¿dIØÍ‚Ç6+`X(òYW9ÎØ”ù(Œ ¤s¶OrŽ1yŒ ¡9í³ÄˆÄáÝ`À‰ë¶™3öAótû)gîȘ«#°9))èkÛñõ,8W²eÆB4Ø2câ™1[\/Ì@Ù3I|JIÜwAU⌦,“WÉäîËÂÃc[+×ýýò8¦ËA¤F¤fÃS &Ž´lbé"w¶Ôß~âI^¬×šPÁ'W§ˆn>à|§Eï8TÙH ŒæøkèIÇ+õ¡mü¼ y®×F£~£¡yÚø/ ¬º€k{©ƒç4p’Ek<íxG«~ñX waÁ{ZˆêHüLÝ“?¸¿N× í/ómïâ©‹W`°ÖøË0j/7ãiG¾+âXÅIÉó¾.à‡b_°Ã¾+¾¥{C¼/’²…³6u3#‚¤å]4Ó™g bD29zbÌÃxWQ>[cîhú3åiÕ;®˜L¡,×Ph®D_ “ÉeJBlŠÝA¼6¦6T:±—=hÙ'š˜P‰‹¢ÝYS9NþAáWûéÙ2wf$Îûâ¤ÕYø“άcže4IL¼&hñ§f-ôˆ’xmé›I+ݢܙ`ÌQ¯±TÙ˜¼0Ü/ó‚ž0¹tª˜ {pž@ãcG¯};â%ÙJá»ÄÓ‚3-FÜÃd “ôÞ§–ªF“yˆÒ*½á·ÂÜ(»zºAEuî/ÙPÑ;²†G×o1VΚ/mIŒ„¦§ªñjœ6ÀQi\@’,\t”q­èjɹÒÅ»_çܪ£'ÊKŽJÒ²V 4¢*<]ÁÅÊrÁxÕ¸¾×q*¸Û™SCOàªO0¿Á/ <œø‚ã1Ýðι« òh‡v'á=!ª¼5–ÍEP¤*Ú;(Â<јK!ÇQR7k­ÉÊëæ*±šÐ +µõ=û-ªa˜Žq?ì œ‚/ñGiL8Zà ±6æ„ΪժêŽær†òP2LÏËûêâ€íJôù4.~‚Gƒr6¿l2V­\×ÐÉhÊ•œ:õk‹SÎYí¬îçñEËA²©ƒy¦KIé¤z éÓÄ~7ÖPÙzë׊X| Q:„i);¤Pä×eWå¢ÞZ ˆ€v¸%õƒ¶”¾ˆo-‚-¶šÎ<š|Aé뤘yÚ#{¶~ æö7¢V^¤üO¶]‚‚‘½ãyöÆ áò5Ñ’ø“Š(&”A.ÇüÐS8 ˆ[Ä=‹Vc®)Ñ0ܳÉtZ¤« ‹2Ü-y­„RV{LÂÀåÆà z• °Û€˜‰« ue7jš(ë@ŒqG7C¤Ù–£\¾Å_SùsL]¶¾(3@WÊÂ^m=Ž^)Žáá"Ì3Œ8=jp’yìán`…“ ÷/Sä¹#&ª›’!6YY$Êa!H‹>§¿<û ÙL(&‚.¡kŸN¨SÝé@ÝS–üˆ6 âUÑ<<zŽ‹T}P¼µ¾jW#ú`èÃ{æ þUåçûäǘ©ýÝÜ„U¦­„J ¨²JæÚ7‰º·Ù]™“¯‘!èš•”¡aÛSçi¸^„–HͯŠd‘@†3“ÄÖã³ÌOãÏlwQ …—òy¨âõZØŒ1$íÆD½Üü-þ¸b/ðl’fî:À-þÌm üÜYä4Áhì>Àó`¤UV&PíÉ`½–5Š¹àš¯ºšvŒ‰ɇ¯Šò„ð¼#Eµ½ƒ"Û)wP¾5wP1#n¼RJß#5øt{’ç댚ƒ¦U{?}â8Ÿ(„u${Wì LXà{}¸…°FdíÚ‚±xg•áp’[Ú‹§€zJ¬´ÿ k6~Su(¯7”Ú:w+Yt›BDð£õœ‰#´LqÅ碽Mî×÷ó¯½HíXÀ9å™Uúj,>á¢Ó­óã•É&bRàE‰¹ÆéÍ?£¨dª¨~É™ìÐõå:ÓU[g[h2Ö‘|´‹·™Ë%ñ p˸ B+22ᾡ'7WÞÿì¿^P~û… ¶M3\ j…:Ù0{íÕ&«Ýºës¢“a}Ðçf¯>M«þG}p6ÔÍ®ÂêHõ‚æ1cVíÐÚ>¸/E Øk³þÙŒq.ªþ:æÄ@¸øoà3 ¾ãìõé7Ñ!–áNÿ>®ø²rlù, áN`°zw?Ÿ´G ½1—8å6 .i<&ÄX,d5ÅÈüt§£±)·aÓA§dÌÏ=´¶%o%Þ¹±ÀÔð2+ð5£5œ)mýùîRuaî ™¨5àGÞ^b0zš~ÜÜý5g¦ endstream endobj 3277 0 obj 5115 endobj 3281 0 obj [150 /XYZ 38.2500000 736.250000 0] endobj 3282 0 obj [150 /XYZ 38.2500000 554 0] endobj 3283 0 obj [150 /XYZ 38.2500000 554 0] endobj 3284 0 obj [150 /XYZ 38.2500000 736.250000 0] endobj 3285 0 obj << /Type /Annot /Subtype /Link /Rect [151.500000 560.750000 216 567.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_exception_handling >> endobj 3286 0 obj << /Type /Annot /Subtype /Link /Rect [109.500000 447.500000 155.250000 454.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_clearing_features >> endobj 3287 0 obj << /Type /Annot /Subtype /Link /Rect [274.500000 447.500000 349.500000 454.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_readonly_variables >> endobj 3280 0 obj << /Type /Page /Parent 2 0 R /Contents 3288 0 R /Resources 3290 0 R /Annots 3291 0 R /MediaBox [0 0 595 842] >> endobj 3290 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 3291 0 obj [ 3285 0 R 3286 0 R 3287 0 R ] endobj 3288 0 obj << /Length 3289 0 R /Filter /FlateDecode >> stream xœí][¯·~ׯÐsÈKr¯@QÀ±}(`Ø@‚>NÓ"ˆƒºyè߯¤]éqõQ»ßr¹{&ÉqD‹—áð›áp.oþüéûý¾óîÓö_†ßï>íŠCSý?ûÓÏwÏ?°íaøó¾i«ý—¯»oûo»»Çÿ~Ûõ_øôî¯Ç?ýoo÷9þûËþÇ¿?üiøK§¿ðuטæøû×óï®1Ç?×ß§Ïÿ½ûÛö¿z¼ 7Læöÿ¿3eUWÅi†þ¶»,Óœ~ÿòÛîMO€y£ØÎ¸ã§¦tåÞt¥Ýÿ÷Ÿ»Ÿ\º/]iLS—Mñ’{É–ÕÞØîØ“3£Î?BÝGèÜ5;?Ï\œ*ÆÕ&Ü»äæVE3È”HôÔ}„Îk[ÄëüBçm±óóÌÅ©rÙ\Ü»àæÚÂ\äœ<‰žu¡sóû™‹SeØÜ@ï’›kÝ€›®ˆËOÝÇ Uƃå~æâT¹l.î]rskc"Âò³î#tÞ´;?Ï<,z—Üܶ²=lÑE ѵûôwEñäžg.N•ËæâÞ7×`ÿL ®Š@þkï1öÖÚxßÏ\š(ÃÖŽ:ÿ8§<“þpWÿøâ÷Ÿwo~0å‘ÕL½ÿüóqný˜ç_Ÿ$©öß®žGåþóOû?…ûáOûÏ¿ìºCm«Ëûó=l©QKñ¶XÔbá8Å»ù3pµ”oç÷fKØÒÔsÃÔÁ³vpn·ÀÝv˜¢† ¤^ighyOìž\iÏB3ð™sx̉°7|©ýÁßÁ³nE©wÛõsûðùÀѱóùŠŠŠ7-‰°3À‰¯!|·ÅÁ•ã ¤5Ã}ë(Øk‰z5p&æ­ß=žZunq‡ª¬Ûæf`<%Üœ¬,AmK¬§G­êàlknÇñ·/OiŽí„í ÌÎ>О,¦E {#vÝö-Æ\š²žv~K€øx=˜nx¥ÄÎQûÃ@IŒWÃt­õq—0Œ 悘âÁøó”#³öÆ(0kGÀ^wáå)°Á°ò ØÅ绀Ý:ÁT”% :n˜xÖ¸·éôK%—rEv˜¯X@Oç‡å%v`1áÐîMw¨í€Óe{«c›âÐ_F ¸×Ò |eýûÆpÑœ÷<ƒ}g¸ÔŸ6¾s·[g0pö½–^†Ôg¬·½ïÑ8¦g‰æàFÛ‹i×ÃÌ-ÐçfœA)Ši€é†w!Ùõ¸­/*WŒëqdk¦õ×°fkfÄÍ6eçQ* 9±âÄܶ1‡8_€’s$æ=&`ZÁ²n$~± #gôž´#t“éÚ„» ¼º17ÚÄ`í»sÉ`óef4<û‘-°o¢ü (n!ÔMoD»s}›qÉàM‰1¥ÚH$$» ù¤   ¾Œ3ÖQ¨ÝãŒ-Ò¢—IêÀ3Ÿ{ }Änv3ÃÌ-”%ÃÕgý†§–;€Oê`lÂ4ÇH'kÀ$¼6¨„˜%!|•%@%â‚â”è¨s­/€F‚©±ú9z-#̨%z‚ ÐC+cñÂ(BØÜHJ\.ãägJ^þI/@®ÑÙ[ãÓ?s$Á‡yõÀDÁðÏ#ü+?HIŠÇÞx§ÀÆ]Öl¿’òƃÞ^õžN©<ë³ÈxR­”áª@ ä*ì)ˆ½ñÜ gðÓ«` á¯Yâ•nŒnžÆTwNÖc´€gÛÂq0VáýÁ–˜n)ýÉ«ªS ¶r ¦¸®¸®¸ž?®œ&aoËë yÄVÍÅ¡Gå”Ê©ÜñVåG7•S™Ë)"‡B,óÜU×<œ©Ê¶àzT¶©lËœn*Ûò–m+}Hån^_O`gQê=2Qp¥¬ ÷£¬Üngë4É™t>C21Ÿ‰h 2ËþFØï”ðHãGO¸µ2Ñ“²Aò™*¢ðªLëK/"{F@CξuÃír’£ûŒ \| ±·<>[Øk "јï;amcº»YÊ. ’Ÿ@† ¶¦¾­%þ(`Žëœó„…Úã‚ö„œs앱U cŠÚ×-rþqω1¥¿r*ù6Öa¦ÇìÓFßp[”þ²ù7{Nk‘Àp×\¹_²E¼&‹ÝËæ46^á`¥¬(Á›²y7¨”jÖï`¬Â`Œ¯µþ=mF˜.uD".åe=ps‘:TØ„@dßKbc‰-“'Ð6‹·°%—4²1­Cˆï“HÔpÓ ‡åg]*ݦ{õ©›Òã eãÇn¯ÇË_©eÓ¼;üàO¤­ÇŽño­õ±c#Ü[»¤¢[Ô›DL3Æqµ>'/}IIâ.|}I% E/CÉpEµúÀLiõI»‰ô›¯û¡ƒqVÎÅZ/äD¬:xF:xt÷b-öœAªrªjƒ¤‘`eõ˜_„h@”G´JC‘º|E˜– KCùÖ½€Š8-@yLFýaôÄëÁr¢ ÓÂH”ç±-lâó(K_ŠûIƒ§ü&*W-¯3á….W­8k­ï\…ù ΀ R  KÆwáTŸ_€£i$‹5/×7ÒÌ´ôF½7ŸTŒmw¹2”Ðõ’JQº|å4¢$!“»–©=¶‰ìã³,ðqDiΜR%ñ ã…_p7yŽ(æQúO&A‘™EnxL~¢ä~‰32SG.`”ªú±hhxའ0|ô^x‹=/š1/žXêÌQõáôý¯»ÓŸ}ðëîS@pÆ‘¸§qoÙ\$ØU¤þÃ\ÉÊWv®º=K–¯|¿ózÊW6hÃùœUòÒpÖ©”ஹØ*±œuÖBM¡žô1JˆDŠ.}±êÛÂ*Œ8†ß „AÉ7Ë:*1NGÓëØ¥"ŠlàuŽÕ`t%ÈEMvcµYF(ÄtQI·YI—_‚Ù˪pðîŒ[¶í-ž?d†~CñyZ×õ¸–÷vuz‚¿U»xƬûh*R²i}–LÕU¾Låý½N…%°óÓ®é7Õ Ú˨¶ÄQøÕ…y'Iû>;K缓=d÷›ÅTmœv°4ûØ®ôÙÇEgWøƒ&ˆvs…¯ ç–ÈÖR“ÀŠÜ©Z1ié|mlQjL×ÚWšA ŒD¾Êël)`!ÜÂøZ2|(—€ñ€ˆÓ ¬'ÿ3—‰kϹg´R$^‰EKš§*£H¬Hœ·—˜HEâµ®tsHÌ¢Zo‰ Eâ ±)6ñ©H¼%$&vî!1ŽuÄq˜ŠÑkÆh«åOÖ¾Ò­aô:‘8F2q0؉9g»P¼x~Bµ¦¹Ö~ï7чº1·y,§Ç»Üy%Ø2§|áº1§û ³°Áâ9–/lo™žL¦}*×ÿÖ¼˜Ô·ã%1.÷œ!1'бdE²m=1¶|‘Oª@ØâÜŸ£)cÀ¤!œx£T¦ŽF$1Ã,}ºj÷°äÊ’§†Hyˆ›#R»6ŒÀ® Q€òÜ—8$óK3F.\ùW¶ø.÷]í™Ái$´$ÌD3®z¨Ï‹WüP•›T¹±uecÔ‰­ÏM¯”BQ‰áÑx´˜þº‘±BÉc4ŽxQ«²×>q±Š ÷YJA£äþŒœjYæI´ãÝ|Êøå™N’áPÔóûHq¦D;ä÷³mñüƒS~¿H›ÐúxµRÁØN%õ-e¿îœk}R§N¥è\ëm¥Á8Ëì ܺ\ã/{%ííKh>íøè­:‰4u‘“°Ü”–¸Žºg5Ñ‹ßÎfl©¬ÿHŒ"Õ‘ó¼e7Y{^?žOïFï ŒßlÔtQ}ö¹gÌÇ`_”œ{“ Û¢no² Ð$S}Ç·t[óØ;H8÷^´l×òŠJùŸý8¾µ®ˆlkóøv±\Ëå‡jÂøcï`e:¡-Ú’{‹pæ*s&$ˆ =b ¯3¨5P<®Ï€)dO•oÆ\…ËÃãïàDZ¬—$eÛ=ä—@&<“Áð?.šŽg½8vjËkj‘•”+0Ò$Á'gÕÜ7I¦¿6sŸÊ‚eñ ó(Ök ¿xŸSÌU˜:¹$ãJƒ×ÚÉt;!1}sÃ?Æ[EmÉ;·)ÅÓ`š&@Ý>'ÍÓ3N¡—³ÌQ}pÖÓ$¨Z^“™¦Ò6[‚V ª)jK¿¬NƒO¥Q­Oµ¾xZŸh1‘œå‡0>1¶†ß q¶ñi$ü(ËNCKXÐø¶5­üUYiËú1® [i1W0oóÄnåŒÚ²ÖµÒ¹`Zת¾¾uNZP_ßšVž ÓÖ™^_ö^°9m9M"sª§Ð¬Dz4ƒ˜Šê¹ -y´¨ [¹é¤ÝÀ¯3µz¢<Ì%qÓ¬Èfpä[ÿ(0Õ ðI›žÇ6€a³³?Å”f]鉳 2™Ë¦Ãë!6/U-,† üN`–*½ö‚¼D±¤ÊkKu-”+€tÄ‘ÌZ¶È #> µcFNzŠ\²É™d†Êõ‹Ktž”d$^ ÐŒDFX*?*sÅø, Ó»¹Ù ç{Õ7†ºÕ¡èÜ-AßÂÞú4öÒô2XYwòâÙžˆú—”’†ÙçÌ©·FˆYmø*08cŒeèÖ»îê~:Rµ˜%&ÉÜ3báÓ%k­îõÚ!_éC¦¦LÆõÍrÔ %à>p¿a®\„}B„ „-–*t"¦FSæ@d™ àì’™%ëRãGwõlól“Daâ ²ÉÔ‘æ<×—ÈW=ÏzžW|žs‰éHsj[ûc5k¥¶hËC¾V_¿øÔWØf^S´Ó–\ði›úmL³©¨9‚r83Ú’w‹ê\QðÉ%¯dË;K.×–µ¶¨ÎUä‚iUûŠÓª-Ú¢:—<>=ðŠkÍõé,†ƒö:œ`'Ø¡ û9e¾gTg<]eC~ð2þ+"e`EˆRy}1nÆŒïðæÃNæøLâ)-ï6£$6†ŸT;ÈGSE^•±žô €Ǹ*÷òp¢Á+¯$’QX RLE¸pª”Ü®”L–áDTŒÍ‘ŸdÔ¼£H’<ŒÈŽdKO´2'“Á†À%…9ç Úâ­Çò…Éi‘Küô¬x“c˜š\´&‹dŒß,%bE!²W¬¦0gs-Ή0ƒ­0)cÜÃL>õêb bJæ®õØ4Ó誶­.‡Z£1¶úr:‹9Gc¤Œxè ;Ô“ñdˆÖ= ¼œÆˆ£Is­F ê \ÿ \Wušó\^SrëyÖó¼ÚóœØc/ÍÙ¬“ÇÏi|¯¶l°Eý£àSûXnj|oü¯-y·h¬I‘ ¦u©ãçVpÍòÌhKÞ-ªsEÀ'wŸÔ:—Æ÷jË[Tç*rÁ4§5kµE[^Þ¢:—´S£+ºëÙt'nhFÜ ö5NTŠhØïµ‡G Š+îLk}–·uÕ'fžWÛ´u™rpÌVÕ^WZ……X/˜Ó7æ MÙ˜oŒOqã¶«µ²rs$ép”lÚ ¦Ô6oA”7Ž„<ÿÆuÌM+° £êR9‡­)/­Š—¨š¦Óeei!ùâV½_2v·+;ObupFÂ!&ìY¸dmÚ쑯QEi¼m*°ußUð ¿x@_7joc3´1Æ¿N^·²\@Ad2<Àį̈H¯1èœq$Y"3&6˜ÁI_H7Û 06¾}Ó˜ÇѰª®KÜ\@¼“„~F%Û`8s¶4‹«7ÙÎú'~•=§`<7ho˜v}Þgtßš8argêúrŠ6°…¯³|¦^þiS§‚×ÂÀnÃï8fO‰p>a—?ü(ˆOv¶ÙØ9eK×¹ÒTˆ´ÎÄ'Œ3 …Ê¢û#FŒÍ^õäÒh2SÒ<áÆTÌŸ¾¯ZûQMF5™<Μj2Á¹å¬É¤JT%«Éàç3ü§:Ίu;!aŸÅ{Ïì¦"¦Hþ»µ2IuÕqò8%ªãç–±Ž#«É¤Òq–—f[ÖWŽ?ûoGÅ$¨·||ô&<åµw_òŒ;æä¹³·½f¨&uï½¬ç„æÎkrÏÙö`ÏqdcÄ®Ç-îýðÁsèMûÜ{å{Æq<3ïÍí‡a¥#ç¥Á«‡\”OS*àdͰôÑvº×}[J´ ƒ{ƒß”3kéÍÛ² wúóqÆ—™ãgc‚,Ü Ìå…Þýç“öˆ¡7æ’t´â& YÍ0g .}Ø`Þ†µ¿¢Ýàipon9o%Þ¹G~`÷/3ÑÔÄmé÷"°h wÍDÔÀýÌé¡4ý¸ÿ¸û?³"£† endstream endobj 3289 0 obj 5079 endobj 3293 0 obj [151 /XYZ 38.2500000 323 0] endobj 3294 0 obj [151 /XYZ 38.2500000 771.500000 0] endobj 3295 0 obj [151 /XYZ 38.2500000 771.500000 0] endobj 3296 0 obj [151 /XYZ 38.2500000 323 0] endobj 3297 0 obj << /Type /Annot /Subtype /Link /Rect [300 300.500000 348 307.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_default_args >> endobj 3292 0 obj << /Type /Page /Parent 2 0 R /Contents 3298 0 R /Resources 3300 0 R /Annots 3301 0 R /MediaBox [0 0 595 842] >> endobj 3300 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F1409 1409 0 R >> /XObject << >> >> endobj 3301 0 obj [ 3297 0 R ] endobj 3298 0 obj << /Length 3299 0 R /Filter /FlateDecode >> stream xœí]IãÆ¾ëWèÀÖ x¶9Ì99vœÀð™ø¿I$Õ­¢¾¢øéU±H•v·›­ªâÛ·zïÍŸ?ÿcÿ¯ß÷oÞ}þÏþÇþû»Ï»âP—E÷ÏþôõÝë_èæÐÿ¼¯›rÿã×Ý·ý·Ý§Ý§ã¿íº|~÷×ãOÿÛëý_Žÿþ²ÿáïÇ_þÔÿÑé¾îjU¿ÿzþÞÖêøSqù~úý¿wûÃþ·ÓŠÃvýa®ÿÿ;e«J«Ó1&¶þ¶^S¿~ÿñ·Ý›óvÑ­ÑVï•5v¯ÚãOÿýçîçãÃòÅ¡µJÕ•­‹G6ªõi'Ó–{¥Ûb_*3Úèü%³¼ °x[Ôá?Ÿ\*ÊTÊ¿º rmÑ4€êJB/«¿U• ·øùäÒ@éQ‹—ĬVe@Ì^VüóºÁ?<fáâ’˜5•îÀs”òð¹¬ø¶¬Â-~>¹4PÌÂÅ%1[„„gËlUUÂùä¡x..‰Ù“Žg/«‡~£T¸ÅÏ'ųpqIÌ6ƒ„g›FNkšg瓇âY¸¸$fÛA^–uà”ÆeaêÙóÉ¥2`..ˆÙ²hz=/«‡À¬ªÃ „îäxv´ø§9‹à“t¿1—ož¾ý²{ó±Ý«jÿåçãÁº Ïß¾|ÝÙãÿœ¢,GBüòÓþEaê?í¿ü²kuUVº<Ÿ¯{¢Ûó“æÐ´Åõ“BÃ'ïÎOìÁš.¬õòÄtŸyùE©á“Ñ"ð$ÊÀE,<#>=<¬nˆÕÜ×PÝ"æPÚª©ïµÂHøp~RŒnÔõ“îa®0žà z€Â¼D˜*à}—º01 ï_DYx’Ëh ÃdôÙÑ/0vðY10ã}¾w„‘ÿþüä×£Ä}LXåw{KXꪖm}}:uççcÄ­'uO‰Ú°ê£ègZø™ÍÊjuMM=oßøL÷éùôÖ“ŽêƒÂøÖÙ:jUêP¶æêl>ñ¼i·ê`Î<ÿèû(¸Ú{t6 Ï Z)BžÐúÆ”ƒÖo‡ÃTMlW¨cñ4’~øHpy£&e*£D°äÄ«Á3bÄ1(Û`„=åÁ1~u¼¤Ç°bÐÂXŽ– }‰í^,ðGÈ&€ƒ7sO‚63aõ¦É,By:‘RßU­£ðdØpM4è¡4ˆÍ9üè‚ ÓˆG$Âj|ÆHN­qb­lhº².M›Î¢l=ùú¨oá“ =é©ïÖžh¸O|‚€Ü_÷~Û+î—õÁ™7ÃjÂÖÌ[wÂìÕï.¾K·þCºÝ$dâ [º@Á|Š…ŠGÁáÕ¦”|@oÚÚ!q 㸠bB1EñŸv2\™aç‡4B KÃ#˜O™ æOŒAOì÷pµ†xŸ÷óφO`à>½ÐŸµšgšÛ•jŒCb±<Œ˜¼«v”ní(õ>X!ÏpŽaÄb¢eù|f8L[#AC`†Y,Eò¨G§÷XÃË;©Dìɪ3’|äÏ`(AXÌÈwÊV?DžÊdÕ<àλ¨UVYXWgakŒ(¯ñÆ‚c²?+d3nLT„¡hŒ0ÂÖ577¢61{ÂÚL@b¤’?®è±qÃc^‚˜)m› ’g ´Á\“5óiö€*¶m*WÅbIŠõ¸\‹:¦Œ"V ®×/%q#NV§3ö¬í7£íE“pžìQåä!¦°éz¹²Ý©È^m‡30¹1 Í,[£í¤'rÐl…uàOñ(¶êW+$Í+ê:Êh?̼DÔˆÒ!|Ò°ùSm—^`¶OÃÌ]ÿzó2«0¯Ùƒ$ —è¶rÞúy$îÁa^¼hPÇŠ%ž<$o íª(\2 3Üz÷)p¡C\ÿ·®@±%"_û!ºëò|«›k’½7øÄS´@•àBŒS\ÒáÙžº€äLU†)ŸÁ<O½Qnœ‡95Öž}j?n1,–Ÿíåu.øJš3&‹·fÑ¿y‘ƪjZ&aNŲR…ÆN"MùD˜'ë#È©˜²Sµ¦¦!J?óP4¸¸“”ŒÄ«Aæy,‡°F#ž¤.¡Jmbó#Æ#”j˜ƒ0%õ÷¤„ô£Æ|‚Oà)¯ÆoŠ­t 4ðMKøü$[Üœ•bÄzÜÁéV?.ÿ㜴RKìÚ¶Ù¿B¾]µ§<§˜ªÿÈÙ0Ñ%AÄ „ãcÄe(ÅcJÄïƒéá|6|¼q¤N}†a[Ø?#8¸ˆèåVjˆÒç¨^ÚZ\6ª§±´Ã\›°fÁØN=¢P™zò<Ïó¬ÊG¢ÀEõ«Góö©'ŠÆø6„MKÅÒ" ÉØ˜1‰ªÎÙ€ã@¾ÍÙ€{$Âsej•³wiƒœ ÈÙ€UkÞÚ¬%P—Kdêæ’ Õ›°~=4Ëйh­'ÊHÄÄ<û`î$"“”çá†1GHiOŒËUÙ÷Á:™°ád%.ÕÆ”Èpay.iZgT›Â6/É£èœF‘3Ù 4CcT$œÉÆÊÐ`‹‰Å3R¹'O€÷˜c¢¡Œf‰V£@ØR+ÈðÄ‘(vˆ<çlXÚÞg2Pçi–œu‹êµ7Íåºi$¯TVÊg3{˜¬ ™=Ì"{˜$tžÃÜè¨rü¶ìŒ€y3o¤èã†;àŽÓ8¦çyzV%:EQ³a!¨¾o‘Mµ…`zÒáž/Ä ’9”"ÚFm¹ ÇLãH-ó)ZÅ÷º¿qQÃTʶ2à}‚¶±Ž–LšäDçXb„D#Çe%2åÂ# ±fÅèÁ²¼þÄm¢ë‚j-N¨1ªÑ\ÒÓ(’hnõÀ±[Ýa»Cªõ挦z£îÖx\ÄŒ‘ LƒêmŸ¦íÚ|m´¬]ŸrM¯)ª‘ÄIÈÎ.É>Qö‰HŸˆQ…}Êð–·„q‹=¬“Œ9”@4ðS„ÐbÙ$Â&!§¶ç]WÅ)Ç$Ƈeâu¢Gb戄”…<Ü?æoFèÚãÄòùEç1x ƒQ]Ñ C±ïh|ã3ÑF3ÃûD&2éq×EçTàæÄ‡Øº¤ú,«Òµ˜‰#±EPš'_83ÄÆ[‹I,7kfc<J úÅJÞcAMˆ}ÌÀŠl>­Â|Š6•¨m‡ Ò[_Äx2ÙO¬ámËÅ|—ŸÇý4:~¹‰ÌŒAˆìGy*ÎFÇÓS¹ãl¬ „î'´u?A2%ƒkÀ!á¾O†×ƒ6oåØ×õÞb©iˆòx«Ô* óF‹§ErcJ×`Í7ó @ÿ>ùàô À£W‹Ò¸Š4ü¼×¢¬ÝM×dñgkz]µ}cω·ÔBù<ñ…-TÖ Yƒ^½·¬[—Õ­¦jnöHÜXUÛ²~ ‘Þ¢4‘,[¾Ä(ÅpR¤˜7DÌ ç*á9YÀlßüsmEö«ä–¤®š4]ÝÐkÍ^¹(“(¤ªð›2¹eBÂ%Xò#œO¹Æ*«hÖ)/7V¡®‰VöD ”á=ꌩº‰º ÄLLJ©õ›Œ ^îe c&é0W>Æ+±.RP7zˆÄ”Y'jxN ÷‘½',{'[¶hQ¶1M·>[`ë…›k»c+ë(œuÍT˜iÓ‚Y5–È^ÞÐ^uF:Å€|Âõ¡ëxçcm.`–«aäjÈnCÖ¸Úq±ëù‹…? “:Öµ([T—©ëùZTN;Éó>ĵìs÷Ç›aøGc'=”yAv¸$ÃYcóÜ*¡ãá9±ÇzÊ^vÍzj­z*7ÓHZ»ÊÓžÈYª¶¶ÄépÑ×”*Ñ‹#–SÓgÐö’rβx­²8û ÙgÈ>Cö6ì3èªÎzjíz*eŸa•ú0š•o´^ºÏ⇪V×FpwUŠÖ\ÛØð>oB¥‡G.+ÝÊ0u 3zžb[ž¨¾˜SÊÏ”ÏJÓÈL~-cxâk ²×BSLlGäJs²?UMˆ’ÙÕ³¤Àd熠µ„­«ÅdëfLàÁ¢wUe j©º)|YÁÆÔ–¬î ¬Ïe*ŒKîÐ-°í-bÁQ æ߇ u32o±L%,Óáf’„J•¹\@±e‹dcuÿÄ<=¤ÇÙÀbæ~I>Yá:à ñ{ª{—o¥ÆÈî°£ý˜rÒ”+ø…• cüƺJÄm.«ù"/VûÒLÅ$oóBi„ˆ¡ÕÓèÅDy¿Gå™Hñ0Ùn(d#VíÂgk" w_¥LH3J¹JæXúÒP&ôW:—÷V#ß!#´Ö:Z1³^6¦*|Gôþ¶fÌÈjãÅÊ3cµÍˆ$Ií0ª¡O´ßE]‘»èzθ1 ³(×\jª.‚¡v\bâ)dŠ ñ>¸`o%\Ò« nù'¹¸.mJœ,z‹"Ÿ¬²Ï'Ÿp“àŒå)i2-˧´©j³CãHÈK‹Õç‘L 5Å›Ÿ-ÏÑ.ed ™4$s=B@6{ÕÞ‚ºê„`ëAUºHé+@UðI'˃vëêãüÏxöiÑgúûZ§è—{¡ž TÜzÒ4«ƒQF^V{öQÃÔ3 aà´óßÔsêží„ŽØ­H`EíR> †T0‚ááÁU¡‹1Ï`Ò„†¸Â§î¼ª†ˆ×=pÃ4ßTź©Tš¡ Öò7•Øuz¶ˆöfn/MÆÒB6<([W£B혅zê[ꑆfå‘•G8å1Ù-'Y ­U EÿYµÃôÝb°k*EÍé#n›+á4 'GÀIüH¦båI…CV÷÷ÞŽ18Ñn¶×`?f[0ŽvÏTmæ™uðLôÒ4™^î —<°Æô\<›‹g'°‹gsñ¬÷sñì&çÆ4m5襜eÍYÖ$l§líìŸæLæRµUÃ4®ì%¥Íé9“™3™~tûR¼ÍJ›1œ#wSš—LïŠC‚Éojr6Ã"Ócsæ4Zæ4¢O\/•ÇÙzKÚzË–X RYÔCR(ß§ó Ë-”³ÖI@ë,YÎRª—6ÏY ¥­†RHÍ—*—?ÝE/÷aëøµÿvD‹kŸ¦þàÍÚÜl)y‡…:]<Ük{ Ó[µ;w}Ûé’ú ÏWKÇ«ÆOú@©>Tî7­ ö1SZ÷ÖÙ>öoŠî^âÎöåHńƩÆ/Ø‹lp`áÆk(¼üLY¯^¿-Kp§Ÿ'NŽ­‚4Ä&;À»ûý]8b੤·en°‡J‡ñ z IM1¼_½7•pŒoš^)÷²zK¼u¶”Q‰1‡±€™—9+Ñ©Ñçî­»ßC¢.Ì¡W4wJ ŒèWõ¤6ý´ÿ´û?ÞÔ0' endstream endobj 3299 0 obj 4865 endobj 3303 0 obj [152 /XYZ 31.5000000 551 0] endobj 3304 0 obj [152 /XYZ 31.5000000 424.250000 0] endobj 3305 0 obj [152 /XYZ 31.5000000 173 0] endobj 3306 0 obj [152 /XYZ 32.2500000 422.750000 0] endobj 3307 0 obj [152 /XYZ 32.2500000 172.250000 0] endobj 3308 0 obj [152 /XYZ 38.2500000 751.250000 0] endobj 3309 0 obj [152 /XYZ 31.5000000 551 0] endobj 3310 0 obj [152 /XYZ 38.2500000 751.250000 0] endobj 3311 0 obj << /Type /Annot /Subtype /Link /Rect [48 778.250000 100.500000 785 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_default_args >> endobj 3312 0 obj << /Type /Annot /Subtype /Link /Rect [60 515 122.250000 521.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Contract_nn2 >> endobj 3313 0 obj << /Type /Annot /Subtype /Link /Rect [60 508.250000 119.250000 515 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Contract_nn3 >> endobj 3314 0 obj << /Type /Annot /Subtype /Link /Rect [60 500.750000 181.500000 507.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Contract_nn4 >> endobj 3315 0 obj << /Type /Annot /Subtype /Link /Rect [60 494 75.7500000 500.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Contract_nn5 >> endobj 3302 0 obj << /Type /Page /Parent 2 0 R /Contents 3316 0 R /Resources 3318 0 R /Annots 3319 0 R /MediaBox [0 0 595 842] >> endobj 3318 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F1409 1409 0 R >> /XObject << >> >> endobj 3319 0 obj [ 3311 0 R 3312 0 R 3313 0 R 3314 0 R 3315 0 R ] endobj 3316 0 obj << /Length 3317 0 R /Filter /FlateDecode >> stream xœí]KäºuÞ÷¯¨µ×% 0p»g&@3@FÁ8¶aø™x‘¿UIª¥¿:¤¤îº;Ý]l¾Ï‹‡çñË¿~û¯Ã_þyøåíÛÿ~ôßß¾½GW݇Ó×ïo?Ðõ±ÿùàêòðã·—Ÿ‡Ÿ/__¾¶ÿþ|é:|{û÷ö§ÿ;èÿµÿÿíðÇÿl?üSÿG§?øíÅ)×~ÿûù{ãTûSqù~úü¯/ÿñ»Ã?N#Óõ‹¹ÿý÷ʺ²Ñ§eÌLýóeئ:ýóÇ?^~é7‹nJUÛƒ²¦ý§±úð¿ÿýòçv‚aøâØX¥\e]ñÈDNŸf2í7¥›â`*5šèü%3|ŠÁI8øyåâPQ§ƒ£·=US®Åô39w}†YKRʪöçÕf^aÏÕj3·{Î jeu91óט1Øe^¤¾eú`c&ù[WU;Á¸ѧÕvbìÀW\Á§{ð©¢[š;Ü.ÔµÂìÛ^ά©‹dgæ½¥3kju¸]¨ÚÓ™¥ ³)dØÆ5Ý–ëö¼ša‘û8,À»>õ2¯;µá·¼wl¡Þý~€T*Õ² ¤¶ÉÝ*m\§Q뢑ש¯Ã'PØ+kËtƒŸW.•þ6½EílY45üù¡}UºêæR€í:|‚Á]“pðóÊÅ¡28=1©Ë"iŠžÐM´º Ÿ`p§]B&u^¹8T´ÎÉçÑR®¢pÂòÒ^^¿¿üò¥9¨êðýÏíʺ Ïß¾ÿöbÛ_N¶®¦9|ÿÓá_Úõüú‡Ã÷¿½Ø£59ðôwç]£–âíÜòù»K5Ú€Z¶µ|¥ñ7`΋©¯««ºŽuSTº¼Y·RçeŽFתmº¶ØG£–ñÄLY8ƒ/I°¥ÍK[ÕînxÕxëŸÏ-åÇ›>øE}Eš+j¨1j´'ܰ.Î4sÒ-›»îÔËLTsZ‚‡uo’PÃX€ç1𬣕 Ä|¢o÷'*w]5Ü1†÷øU/&GkfxÞT $ ÝG"Û 0jc6 ³±€|‘%! ÑÏE‡øÀºy” ¹d4YdòéËÆÀÄ#ÈbÔâA`_S À}0þáÑð!ày ‚<ŽcPÖ³ÒËQWùú‹¬n€T¹)®…a8’þ˜Nd¤Ô=؇‘|y°E“¨*€hıdb“ªÆ—@Ü‚éÅç±xIX¹LÌhv¸Ïò´-)Fkg$FŒT Ýbå 3MQt£4cAºM(£”.*_Háse„#ò®ËÜ;Õ')ðÖaß6öžL!óë¹¥9ºªœ”²G­Pìð®J8îSÁÜ®M¿B”hfñD!¬ñ Š/hÖ&§Òºôð(p3vhoO³©åŠZ!ð)höuùÕŽ¸.PR Î3û‚ñ~tóüòÚšÚç›1@’ΔBˆWÀk3™ª²í‡a Ì]oÏö ä/r»²Ú`Ô¹»RF!¼/L{ø4ðåÓÄò †½=`)K(xjg|ÁÓ£kq¬œºg[ Rå±hÌý ßC¯’+=4]•¬OÈÞfnvSÉöQŸ!ÛÂHBÐÔ»{¹”µÂ0ä½\ã¡ôÌ‹ˆw” ºr½1’NVãÁŒYB:æRDw j¥¼ õÖµÒ<5µÔšÚrv˜a"kÛu›i©óš æý:(CÑmă¦Z\“zd…üßG[ا}¾\ÆWÔà úãj騢:š3…ÝŽö ÍÓ«pîhFa÷ƒû¼jØ2ØÝ«îpÓp?ÕÌÚÒ³CcÔ°éj茅!ôåÃSŽ\i]¯}"  0KbŒžXÂ1¯åÄ<pãÌei`D¡ª1æ_]ÊR/ë¿—1˜¯²ä¿jÄ€;žß;Ér{J¯°¥B-=§Z4jÑpž$x)%Uí—ËymìO'ânF„‘Þ*¿FƳˆxk§|Z£BÚky¿¬^TÆS'Ä¢W êr“\6®ö%aÚø®\têðD e=eí¾c\‡ò€ºe®ÏZwe¹g욌š øý`µCôº.{3 D­çEô ÃR%áj6 ,v‘ŸÒwW•”wá±7žá© D5?JøïWGDÌ10÷ Q·(êz9"è„ wüÌ!ªÜQ†GÆô¹Ü 0æ—uEÖ@ Ÿ(6šëµA„‘c$êÖ²¦‡`Ù8OÐm™ó0ŒÆÑ0®Õ Ç5tRrSPuKûã*_ñz>Çß^«}5“ņyNaÜ$©û1£kÉz¯úâ~$= ö§^îÕÀ˜"(Oˆ3,£øÏ áÔE¥|RŠÈ”ÇXõÒ¾Ó1ÀáaAÍà“¿ û9‡X養-ÊY©Ò»½Mµ`yãPK@v`¹¥WkQ}4ì…†ÞOžÖvþ„ç¤öTK- E<ð5ŒNƒw [zGÍ(,7/a‹ì~0ÜûÁg uA× M7ÌQ0ßÀà(øäzMª­ô½Î7µ;Ø€<>- EÜBÐ Æ$†Ë碆žñNr“‘M˜¯ã,…‰S(0ßÀó² €×x5æƒ 0‚k Ц,æL1ÕcNÌH‰_óqÈ“r=§×ìÀÅ…ì¯*Q¬ ø^5¥%ayˆ×†[0=¯.s„õ4Ö²ÌkFJWÍ,^86!ks°ÆtFÌSÜc…\Üë‚6õ¼„m У›1– |&˜#¬ŽKG¬ñãÑ0æÄËÒeÆËløOè%ÂúÖŠ™;¦Â>§±ÆGÛ½1êT`Û–¨†ín›¶ïV¯ÌÜ;‡tÕ“s=9דsÝÏ#{xòšŽ×4óo•F,gÊüz*egÏá–<{0fžž°Åc¶PÜS˜nñ<­UyyáÁöÑ7/Æžó¶U9õÕÈZËÖ· åÚ–ñÛx ­š‡´Å'VHcÅ;{ïÀ€x·ÈI®ìârZÏLŒ«•ÇÂú TrúÕ£U(§E&d »¾c¯Âˆ@¾žAZœU-æÜcЮŸmSÖ­µÊƒ”HC®8=™ä< 5ކ¹,ŽõLî‹ÌéÒw”v Ší<œg|ö#rùäJ}»tëçÀ{_âÏ났r-’-ÙèÉø²3‹ªÍåM¸O–쎮ñ* XÔRÌ¥kÓæ¨ºr×>}M‰fœ»€-ת¾zÞ¢è£-ÍTF©U¿¡–À<77! ðëI©ñI9}8¼)§»ü^ëº8¸âôÍ)UwŸÖ‡ª9vÚZ1|ò㥪J5º®Õå¯Üí(ÃoÝíß÷¿ÛS·ƒßÛŒæ0m%æ0¬´å~?^þúòú»;˜¨LÔ2ìU1Ñ‘gômŠKi¦ {¶¯9®ûS&[H'¢ž†på¨ýdä¼0R…ȳŨ3BéžÇm?qõÓ_¹ÛQ†ßô=W/ÕWo9Ÿ?G1æêígÃJÕ-W¿Ì±*W/‡¨ƒ“C ÞäÔƒ²é[éêöƒ¥ˆ$ÿYjpX äË[® 1‰Ú³ÅÒE³ðÈ&Ôßgžt&“gÌ{–HªšÕëª~œžmš0ÿSˆÌ•˜ÁU‘ê‰"©0WçëúHÀ¼“ÊzŽÊÝ-Z Lxž\TÍ\ªÆÐ Ð;ãþCdý‹(ñ³šqLòn´ä]X˲½ž3r€Ð}D²[gzmbÊB‹Ø˜*+¦x®ÁÜIçh"e ¡¦òdî;Qq¨c…ì1B˜Pµl¶Y¦J sÏ©ȼúbà‹Ö  DaíŽI޾4–q.š½ñc5”ñ]˜S¬’&T…Ñó„“K_Z]ŽVØRæ’6Î;!ak7¡‘V¢hj.ùÏT*_ß¼8¤hÕ‰˜²3˜ÉbÔ‘¨ìõîÊÅc^([i/K ””÷ãã@Ë)ÃQDÁØ-»6VêN(+¥=¸åG„fÄ U©D–˜>–«8²Ä3´È“ŽŒ}°~YwÙú>Ë# #˜SoW˜®–œl!¾e:¾ 껿N ñ'ª`R†ÚCõ¯ô ¨0Vb†IHBñL]b8×óª, {žÕò¢nÄÞíd78Æ.x¶êO°øÁúw-S–ëÆË<üV.ªu„õÈ“z©y6[nenÐI'ã¢ÿv»"æ¼®±¿¾nïš[»Pæ›\é±rÖCӱؑMëEŒÇ"#õ^¾VÎÙ+8%’dßJ÷ê(á’ År¦ÔÎ|©QbùÃÄürñv¶È(ù;'÷ˆˆãõ›øà–ÛM¨ºÙ¢ ¹ò¼:Äá> g [ßz’vy¤2E‹²×Æ­’šéŒòå§Hæ?Q·ÓîËh)”¼èËÃ`¨ ªHf †23=?3 4Λ+`ìÒBx²R®88žÐèR»E+Iéímª(çO7B!âŠdb„VãÊ<wTkc ìÓÏcGõOzuz¢¥¯R5íÖ¦¢Þ©Ñ^Ñ †º1-ݪݱ©½Ñ.ÕÎÏ™Z\ž'ëÏpÕö«œ±j¼ƒ±ê‹ÁÌ(­†’EÂéã7ãþ¸~î&˜J6Tàér°3—ƒ}E}e2,~Àâ4ï¡ZcöOšL·ò$__ë7ÊmT8â ±{Üö¢¼)(íÊ×é³"ÏV{¯´»h”°pvÏŠ§ Zã’Ú5ì£aËle¸kƒóô¬qª\u‰çÁ«†+0®ÍÅÃ7¸°9.“û`¸iØb` ͼfÄÿº™=G Œ"ð& Ô‹CÏÃÊõìÙ18è£` AÝRi2BQ»yJÃܶ0nëxe«ð*Ïþ`XZ ¨FÌ;?«-.³±œkɳR}±ïRb?5ܰÖ"Gƒ3ÖUë.ÖÕõª“äሉC yFú -Ï›ÉÂøq,è[M•¦¦t>³[].™ôé¥Téï:¹éҪƛó¸Òo¦jPZJLÏ×ó{§öº”± …™¦»ô|Ø1¶nG¼Š–OÅÆs™ìŠ$TZ/&6—peô2áT`+:„×Uí“{®ògO¿¡'LÆ«õ"Ñ‘ÖkI´ˆìº”=`+)Þ>Ò>Wبÿš°‘rU_lÝŒ„SD  Õâ–A"‚ æÐærïÁ\œ¨óEUK­¥Jg-/ÁÃl0Õâ •Õcì¨ô á+ãÑäG÷€öÍ÷Šñ§Û ÿOo§,F%%&îÕcˆA¸x8‘Wô‘2Šm1v«µ´‡Íd´Ü’9,Àö™Ô¢É6c6ZñùNÞM? G¼ö—pžž-z²Jä@]*ÿõ¾‘: ð$Jq2ð—©æ¸š+ŠHÌD„ز×ÀÚi?NöËí¤øû U¥›ø>׳£›¾&Mx[øÂoswÝôÌR=/´Ï íóB»Æ…R¸Ðw¦”]Ïk«ˆRŸ’é÷eÀn¸þ/ÄRZàfîl²åe3?ï“¡A"ÒÌ3VEœþŸ ž‡9ýÍÜ ©ÜÕ|:ŒlÚÑ]'çNi m|ٸϗëGÝ€+L’ >™z'{r+|ÞrŸ·Ü‡o¹km}ö½8ƒuÍThG»²®­YÊEµK‘bµ”"H† ªaì ©Ä½&æY%ø¾\*æ9jv*‰¾”-þÇ Ä Ý·¯x„ºÇð¶U¿¶B$”s{©cŠïà‰±õ|µÂ‹#ÖĘi29™É*¸£­ãx·ÀÖq#‹úØ޶O[œ`zÔ”9guåËD¼%BÊ÷é½â@‡%–b¢¨22‘(‚Ù$•‡°›b ¥.)̃K¦tÔ>ðä"]´r›°*)ûÞɘ/ˆ0I¦&c.tj4ÂØ«3Tn¨ú¡Ëx(ZŒcp4ÜC¦áÙ[y G ¬ÏCôÁU ,±Ÿ:yðååõä<{å<޶ žäÔ 3Z|Â"Dvâ@­|ÂÄ<ý¥' ÿñ9pG®™ uFˆ8Xæ˜üÕ<˜Î0߀< À0Üðhx p¥“œ œ)g!À¬—às­¦Ó×QŸZæB Æb™iG¯CYØÄ> —‰USõ ±>Çì‡Y5­¬2ÒYi‡õ`Ù$[#S ”MfôÜBdo(þ©iõâvŠWMÔ¤ d ƒ‰Ì)0• ÷œ%SJ#Å'‡±ÒOàÖOÔd T^Ì© 93¿‡¹•Öm'úd.µžà{KëÉ|ÚÙg¯‹±¨¥¿üVÇÞ<|ƒTŸ`ŸõéÕ­ÆÖó78Z_¹Ý} uo=Ÿjé€ëŽMí¦äEÕS+€kÃó`àyûùŒZðé½5êz°?ì0+–Óþž•¤"Ñ@•CYÏÇ}W’Š fR%™"<ßrù!Ê–” l=Ebþ4"T9¤ùˆ¹ ™€jUP®•Œsãn$Á„¹'v1ŒˆsÆ>‡˜þ#x/ãÿ ‘¿óé’±²KFc/‚ä}*\RF{lØÀ-sÏS+ î0Ü&Â\L=Záf2rS«ÆO Œáé5#=_\¬vmØË«‹óÀ‡1;Їp$ Å, `õÁ’UÏBÄwêyX”Ï¿CŒsÅåù݈Å;-˜õbè~êC›Ð‡DW°¾>„Onãš…+ýÔ,ÂJ)5{v ެÁçÛ¯ÃÏ(A˜}ûƒ¦ªz²Xa{Û.ÔÉ6p~ùë࣠ [·›¸m÷¯qG­j/€µÃ¿jÜÒË=~;ê¡=e€ú„æ1sa{SkûÒï™G°iÊ^—TÀŪ~ëã5 ‡w°Å¢m(<ìÓ[ˆUÔÖoêf°wú¹]ñ°rŒ ÷„Q†QÀ ðî>‹zl튚ÇÖ=é¨Q™v¡f î ?#*  ÍhIxx¸c5÷5…{p±˜G,NÜ¿Y¾‡p½Õ±=Ÿ|éuq+1æ¤ÅáëËÿÖ@²ô endstream endobj 3317 0 obj 6008 endobj 3321 0 obj [153 /XYZ 31.5000000 462.500000 0] endobj 3322 0 obj [153 /XYZ 32.2500000 461 0] endobj 3320 0 obj << /Type /Page /Parent 2 0 R /Contents 3323 0 R /Resources 3325 0 R /Annots 3326 0 R /MediaBox [0 0 595 842] >> endobj 3325 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 3326 0 obj [ ] endobj 3323 0 obj << /Length 3324 0 R /Filter /FlateDecode >> stream xœí]Ýoä¶ß¿BÏnOüHA€;û\ Œ3Ї¢Á%i4A<ä߯vE­½Òþ(qvHiW<#±Ï¼%‡3Ùá|ñã_¿þPüûâãÃ×ÿßÜ÷‡¯»roª²ûS¾>¼ÿ…´{÷salU|ûu÷Z¼îžwÏíÿ_wݾ>ü½ýéÏBkÿû¥øç¿Ú_þèþÑáüº3´ßÿ{üÞÑþTž¾~ÿŸÝ?þRüv˜±_Îsþ÷BÛªV0&–~ÝõÛǯ?¾ý¶ûØ! lÙ‚)ëBh¥ ÑhYüþÓîçv~úrßh!L­MyÍBF¶+ÕMi !›²P-n† ¿x¦0¹‘&ÞääìXªþÙ‰k”n‚„Ž€ÿ·é#L®koò#äìXqÄõÌÎIܪ¿;¹ME§éc࿉{„œ+=qñì{[»?ðgâÚ¶]Ø–²e-ÚŸc²•-OBµ/t5qÞMar)m¼É³cű•gvNâÊÆIìÊÄ@OXUUç97RzÒÂÉ9)«{C+ euD3Îêö/ñ&?Z‘( 'ç¤l%ãËö6Ä Óô1°obJ„#äìXéi‹gç$n»Œ#®‰`¡¿Mÿ­ ÏBì gÇJOÜÑìÏ!³`PºßÁ«çƒŸ_vŸ„.ÛãR/?·Àuk¿½´H©Š¿€nÿöcñ]YªÇï‹—_v_^ZУ¯j¬[U6ÇU›}-«1ÝHùG¾À>"4QœísøˆgÏ 1ߘR…à‘pª&P RØC{#ò0:A¡T<¢ M0æy ×Áûib^UW`ž# cžÇrèaq CØRat%ʼnB²™±Áà²b”t¢Ü(°NÄPôÓ”¥Q} UÉþÔЈœÔ& \ž²™f˜ù^Ì'$¯ \G³ágÚE­¬<çÛUCÍxi6ÒÀ°Ag¼'ÏcÊ¡º”¥YU÷Q߬iÒE—·£ƒ–×'žsÿéVuP]‹I gäpegœ{Ü¥j‘‡$«ÕßvÖœytÙ0­1;©ß¶• Ó¢ä i‘³a|ûYÞX>æÞr^îÍ7³ìçÈO#U›”í/¦á±*ç:Ï’V9×ù†­»C3¸õÓ$¥ugÍUº;[wÙºËÖÝ]Zwx6O2%Óx3æ;µ¤Óè)»¢ àFŸ2€»%Eµ/uÞÌ€’ÑEÉÆº”ÌJjo‡ J>1%ùt{Y¯¹#Û…&JvwªŽeì¶ê €<ìÍõ¢¹¢…ğb®õÚ› ¤$¬êG'éj#®o(&qy Nùfmiæ2!ÃvÊQ=ÂÒK·¸‡R¶Y:bÉS@9~‹W?LJÞv-"c–™ß9BRxÓð±ÍB!ØüÊ”öTêÑÉ]£DÙˬ·Üˆë ŽDWIëßüîV†ÑM±x«íXÅ0¥–·j•¹vŠU®xÇîÆ¨²MŸmú%ûK¦º¡r–&pÛÕ jÐ{¨&ŒÙÝNÈ)fA–ÙÍ ²\A[®17äÅ%®wI‚«œÔÁo{®–7ìS=üÞ¡aCÀKà,uýÞiÍ›ªïNa ?“¢q_Va~zà>[ž0y±ï +R?lJ,˜ƒÍ&»äÄMÝhT=wšëóâUJ5Ô! [EQwÛûrO»eî…/fø¬Ä wÓð—Œ` ©/ßóè·­8=7K,¥ N8yWï]¯œwx‚Ÿiàg:ô 3–¸æ„Þ›ò8v¿4Ò Üá1ûÆG$ü ^ÎæÙ)\GÂuðˆèsýÆ×SHÏlo í”B9 Þ<ôù2±NÄC¦j;8eº;eRŒ÷ñ^§*¡lx@#îi­KTÄ’ÏÆVwáwDÛ²:½õÞIô°UÀÝk^‡«£›9'ŠÒøî;>Cr4 – ÅçK¹ô¯ù:9ÿÖ,…ï~‚•ÉkOòÛÂÙ(O¹ñ&ö„¤ddžˆVˆ¤¸'Ëšß% tŸëhè[Hõz‡ê*!WœöÚWh\%…††=‰d"NRéꧬÐvs\!p#®A†~È r…æ•l‚ÏàŠÚlŽ+4^†«~yiïZ¤ã YöŸ®1¥P˜Pìññã> NÂ=<1 ŒÜYó2ÔT82¡p_=øÞþ Òtùî”׺x»:’º±Ö‚ß(Uï„NžŽ9ø4NuÛˆïY”õÀŒ²¿¿¡ƒ·&š7áƒõ®ïÄ㬻>3RRN°K»F0º(yjÐÑBòÈRœuô´„°Mޗݼv˜È„­ø3o~Ldwk@~¥ÐŠ7"ÀÛbâ~‚2z ^H™û”úß8'z±”jÆìJ&ܱ¼ÄEÿO Rq\¸ÍÞâuB ‘®ÝgÊk”VªV9ØÎÁA(VíåY3OQ`É®ù`¡@8⤇è†yi¤ÚJöǃmŠò`[üRuSÏ×£‰žÂ¥„èI•NÈÛ à&jžŠ—AvázKIþÄÂ= Ò„7Ù&n1)é ÂùÀŽoÞ©L‰€DgÊ5Š`©Œ¥þ·%ð™>HìÂ!B菱[!è)œ`í9èY‡ÕÖO³iGºŸ&Ú®.Št9ºâ4Σ$jEäVÙ?¼cWÞ–ãKD€Ô%t(ä¹´Ä-±K™Á¤Ôô[{žê³öŒPÞæÂ³aØp<G!lž8kPÁXçš{¦/L¹iäÎæ£¬“*?Œ[¢| lËgP­ ¦ªìééqèTXaq;ÉàÆíç_è(·]RGŠÃ’åVM¹}R*C)=°á:ô¹à bj¬/„Ãë^sù†'ð”0£Pë8Öb¶ Wn&º5xø`Í–…nN‰¶Ë"rm]O× «âî®u Þé°ÇT*¯|ˆï5šNRç”ö‘SÍn2jŸì¯&RÍë-I#„þ'Ãê1;㕊AòÜ­óí6îló_= LÏÜgŠ# øÕ ô b?xÆ‘H¤)‰D”ŒÊ›ê š0FX*—sŒ0Çëäá­úƒrŒðVãpkŽl&ðäÍÐS¶žÔS7ýÎsísÝ~®Û§ro®ÛOG,;=}‹>§“ªõ© …ŽĈ$ô/!Ý ØzŠÎÀ•ÔÓ'([Èë>÷XŸm«°çj}jAÏÖv}ƪVôøÙLG®ÜÓqŠ+LYnŽ+rOÇI®Ûëô¹¼'dí=Ú^§ÏÜÓq’+ÌÉ;•{:fß_ZeßкïG÷F…ÜÓÑ—%l•8_òB OŸ·#îÏHÉFfym~Í©m o6hNbºç¬ÍöF By·ÒijNܶ/$jð>Ëû¼Ô-µ! y›zµ©kQ“‚Í@áå¤8p³¶õä¤8_àhù VNŠË!??MsR\NŠ;~æ“â9£Á¤–Äú»ö°6ÂnG¬à:X®//U)I=«vݤ\_GU£Å4M(\1‚÷¥ïŠOS¶Q¼Ò';C­åÑM”¦æ‚…àáL9‚ííÑ`ø.±8¬€ ý޹cßC §Þ3‚C‘ð3$‹§ Àì ¿ÂÛ‘£×+±×OéS&=6ÍöRVrÒãW4-É7Ç9éq’+T½9®XÞÓµò¤Ç¦¬ªÍqÅí'=¶_ÅkK~/w> endobj 3337 0 obj << /Type /Annot /Subtype /Link /Rect [60 658.250000 94.5000000 665 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Varargs_nn3 >> endobj 3338 0 obj << /Type /Annot /Subtype /Link /Rect [60 650.750000 121.500000 657.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Varargs_nn4 >> endobj 3339 0 obj << /Type /Annot /Subtype /Link /Rect [60 644 162.750000 650.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Varargs_nn5 >> endobj 3340 0 obj << /Type /Annot /Subtype /Link /Rect [60 636.500000 120 643.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Varargs_nn6 >> endobj 3341 0 obj << /Type /Annot /Subtype /Link /Rect [60 629.750000 130.500000 636.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Varargs_nn7 >> endobj 3342 0 obj << /Type /Annot /Subtype /Link /Rect [60 622.250000 110.250000 629 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Varargs_nn8 >> endobj 3343 0 obj << /Type /Annot /Subtype /Link /Rect [60 615.500000 90 622.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Varargs_nn9 >> endobj 3344 0 obj << /Type /Annot /Subtype /Link /Rect [60 608 88.5000000 614.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Varargs_nn10 >> endobj 3327 0 obj << /Type /Page /Parent 2 0 R /Contents 3345 0 R /Resources 3347 0 R /Annots 3348 0 R /MediaBox [0 0 595 842] >> endobj 3347 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 3348 0 obj [ 3336 0 R 3337 0 R 3338 0 R 3339 0 R 3340 0 R 3341 0 R 3342 0 R 3343 0 R 3344 0 R ] endobj 3345 0 obj << /Length 3346 0 R /Filter /FlateDecode >> stream xœí][㺑~ï_áçÇG¼‰,pæÒò`0ä!؇Åd“à 'ØÙ<ìß_Ù’Ü6¥?)Ùí3Hº[²Éb±X÷*þü‡¯ÿµûû¿w?üú?»ïÃÏ__ª½wUÿßîðï§óºÙ¿ï|ãvß{ù±ûñòååK÷ÿ?^ú/|ýø§î·ÿÛéÝ»ÿýºûËvÿ:|èðß^¼òÝ϶^u¿U§Ÿ‡çÿxùóïvÿ:Œ8N7sù÷OÊ¶ÎØW¦þñ2.Sÿýûû¿^~î6‹nÛªnvÊvTkõîÿûåoÝãðÕ¾µJùÚúê–‰¼îfj× ¡ÛnVo'ÿÉ ¯äo•¶Ùï!ÇŠ2µŠ¾oêá?ø;9wsÀ™V¦£,Õý>ÙUª­+ßXøûM3×íÚ3Oé$÷̇#ºÎ̇5Eµ²ÚÍÌü%e Ì7Ö¬ÏY³ÞÙÝ”=ßt€È5®ã—3Ƚ‰3ØŽ›MÇ^}Õúô€>Uõ ©Ý9 aúõ^ö̹6ÛžcoiÏ\]íÙá¯;Ú³çl޶±am¿dÝíW;y›x×;8cƒÌëwmü«ìÆeV½Áj›œÒ6jÐå[—ÁR8žÃ i«&ßàGÈ¥‘2X!xpÉm}Û£ÇùÈGG¾é—‘lK#eÜY8¸ØÎvèQµÐcLì¿ ŸapÝæâ#äâX9îmttÉÍ5Üèädz8|†Áòù?B.Ž•qsñ蒛냽~Ýtð?ŸÿM6¦|{ùùUÙªƒ«Þ}û[‡–~ÎãoÝv¸ÝOo¥vßþºû}w0šÿØ}ûõ¥Ý×Ú öoªðM‹Þ(ßX8Ú§t0Ôª†ß1ð;5†@½BØ0Ô*} ÷§Òéû£ážšÏÄncÚÁ”H@)CP},ƒëÞ0vn*Œ8Þ¹+5ýhŸ¿u"à6îX·­zÖíêK†¦ÔÞÙºñn‚¨fß´ÕÒpi3oº½Ñº|G«ztؽ5} yÁG3„ºßD3.t›Ók HÓhdné) "1l-}8'Í’A<œÓ ï ‚;¡ê÷V™“ ˆÌƒi#RDG.BÖ!‰2„Hí“‘$^ݰÁÑðÞF°3!x¸¥‘áñw “‰>ëx!¹QLf2ÈkˆÀrJ¨¶ D>/‘ãÈpcŒmŒBÈ1‹ÐÕrn¬>0TL“˜Õâ‡0ªOéÂrPé’¸ò„bQ/,#±à#Ä[D.@æÈˆÄÈwdu b4L‘‘ï,§ÈÈ Ÿ¤ØW³ÓvŽ})uä^º²ã”¿œH½ÇÝÛ~[ôf ¸z_»ÞFÅäÜwZôÛ£Cù)¿é™ˆ²ã—Bå÷mÎóŠ P¥¬mÛ˜OP4`}g¬9ad¹t ¿\]‰ˆ¨©Et8Æ’#–Á¨¼)¦ ¡ÃEÐÅp',Ó Ý!‚b MçÝX‚¦ØÃÒ«}íÕÍgû& EH‡ØÖ"‚7£ÿɇ\2Bwxé„`]º…`1ÔŒ6+jâGæ!¨8bTb³· Û¹Æï2 ¼CŒçRâEÔ|†ÿ3ê£ðÛ*«G¸T¯¶(·¯Ú@ÕùŽ6(Nz|õÆ,>AMáã­tŽ´±´‡ßQŸ!…» ©=GɽQoô2Õb¿÷í¥F kô¦‚¦û È´š*¥6ìÇaYªàÑzjUíTÃÁ¬ó5}¥Ú yðhƒÎ8ó ߨ·óâfåðê×ÚìUÈì†mÔúgÞô´¯›Éh v0ÎM%x5=I}¢™ñí!°¿ÏLS훦Úùã¯TŸkÝè]ÝŽã“ï/u³WªÕM£NŸòç£  stŸþ>~m|ÛûpŽîÉ÷—’îÙy?Êå:¾¿üãåÃï.p¢&8Q˸‹Z.'›^LšÆ]gÝ¢æ_$ð€™-öÌ$˜ŒX:^ÓºO\^!ÚlúŒñ¦hSÕÍùƒ‹üiŠêÛæ’êÛv†êm¥Š<< ©þø)>ÊøWsIõ­Ÿ£ú¶©¾{2¡úîÙ©?§úÓkR½=ùš°¥B…°Æm 2Eœ&d{Õ_Jä¶r#‘ûúüÁÍDn;YsNäV5sD®«Èu5%r=’õ8Êø—¿ r«ê"·Ê…stOB"?<!­ÏˆümŽU‰\›@’§d,D\ëD:B–„o,!’C¹!ñw° Hp½mÖA¹˜h;œÓƒ•}öàv`êK`ü0mx:»'pø”?eü«¾äÆÍqc'sØ)螺spšcU`õ(0Útñƒ‰ ÔÊ:ueƒk„c;%б¾³R¬Y/Oûu‚Ú~be÷Z8ß,ß_Ì9­ø›qíùƒÛ9§s—œÓÕsœÓ5!WëžL8çáSþ|”ñ/wÉ9ãœÎLæ0SÎÙ=!µçœó4Ǫœ³>yÝ^çÜ ñ-J~)YÀô›žLo÷l„ÔœÞÓ«Þ¦z¬ÃIç#€¥ŒŠB²ýÄň¥ !ÀîlE_ Á.æJ¹’7çnçJ­¹äJ­ãJ =ú¾rø”?eüË\r¥VÏq¥vâ×lÕ”+uÏFHõ9W:ͱ*WjO)X8|ú`Çû""ä/áö±¯„'*¡ä#Í_Ò5ÑžRÇ7Q§ôÅuf4=¢nâÍtGoæå!;~ÊŸ2þ¥/ލë¸óôˆ:zeOÂ#zx6BªÎŽèÛkQ×9l0Ì’4c© ™ä1À7‘‚ƒnš[î6¼šŠ¾˜pÕkUõÅƒÛ ×¨KÂ5zŽp'N¸c wH¸‡OùóQÆ¿Ô%ášjŽpuèL<<™®>‘ê0Êå:V&\ãÇ Æ®þöz°R¼D n#©°«3͉LÕùƒ¥dÊ¥íD3®]{ò½Ö„Aá¡røˆœ„ß””9ÿ\Ob~ï|¸ž±LwL=•ÓOS+¡¤ÆDFû€Þ Y3õèT\ò† ï^Ïo1¼az3›ÈV>Qk9eZ¾€H-ñòòEÊFäÏ3U˜ŸbBYÃ$‚!!ŒöHJ·3ÕÆ[I,I«65ß‘çŒ)…Ä¡Ä"iuåOÕÁ€€Ï3-gýµïä,°è,¡K™(–‰v.¡ vEKÖ)ÁÃ4±¹Ñ†Î„)íÙÕ”œ UÜìý3z3†cgÞ|D+ÀW­*$j¼?õ$ZSÎn|î®EÁ…¼73*TL&› Ì\YF…¦ÜmD÷‡”(6c®NJ¥ˆ«c¨¤øw>ß²G+%f‘‘dâL¢ì™4ƒcò®ò´¼¥òÉ µ4£nZ$ ˆhÕX¨0%T8ÿǢâpýÊ\ÊNÁ{z-:g íаìÌÖc’ëV¥SúÃÙð•~ úŽuˆÆ©D/;!|Ÿ)ï7Z$wÕœ(Añ­ºfr{K+øWMñÞA×^EØCèÄYþš—ŒC-¥\˜©Ø­1—1ðÁMa•MTÅ^tmÐܳã™m/•m_*‹ÌT‡åŽð”ÊTÁñ*8Z$ ãb868Œï!ýŒÐ>#´¿/¡=°“ú””ÊwºÜTLjå1§­‡1³§v#áóYÍ”¥šÊ15€…ºª¬Ö¾gJe…z8L¯Fb|Ï¢ê¾pÑë µà .Z}oõE9˹+Jæö¦…­l_‚‹ª”¹BÁtj£6´ú™1Tqç[ÙÌŒûûîÙ,Z,VÜX¨A)ã/åY(Õ‰aýž’T‡ùRW2Hä:0$#Ûãþ÷¬i^>E¦ž@ {3ètÎbLw"£Å•ê$ÂDP-R¾-kØÜ÷…«7 Ëí_)”“ÏdV$Üz,s!¨+†R]ø2½h(K*dή&´Ò/•Ü¿å¦P"ÍÆ¾¿3w)`¿ÀÄUIhç ò4­Pšý†‹¨J †­:ùb·×êZ‡œä.#´n¯5¦ Q•CÀI¤áñ»êv(àýÓ§%2¼´LØŠ× 5m€ŽÏ{Kcž7ÜËÔ3¹¦Ô ’°Ô‰iŒ•õb´ˆ11eʦ"ÊZ2ke9l¦°dNñåyµ[OÄT'"iP8m·3Ú¤ â´ñ‘?lÔüäÑmÒN3@Ë¡‚<«FIÞú¼…à6ZbâMLUJh5Î\â.[~ˤƒ²¶T)_æk*¯†Or:?](‘Ö¯ÍÜA^X&“(ÍNh¨}ýð‘q™ÌâÕS"e»“FæZ"¦#×:)ž\™¶¾N4DP~q\·ádMFAg  uáº+÷HÉ<ÓŽ·Ç•Ê£YßvxæO<^NÌúÔ¹¢ GN1ÞD£“˜]bUsûêÊ@êNBú™]á—[Ï;±Þ]=ë‘5Ü¥¬ÄY~G¼‘ÍÆP˜.±D„óX¼ÛpœÉú€£m„ã¶§|>Lï†þ æp„>¶ú‡ú>¥è¯Ô.ƒƒ)cÊg‹éŸt&+ Ó5ÔD,¤üfYiÎŽ†l$l+ZŽÊøØ2·H§Ü¥ï檫g(áŒ3ŒŸrµXçêÁŒÌ—í¬w;ï6ï*𠽉3™«®VOÅy´¬´” µƒ×¦„æE3r©ü8ÙDéUÓR£–¹ Ø…Á¥0Œ#¼P1eÄQ ­r3ãfÈy:cÆ[I#ÍšøfƒUßUc’’ÑÓº2ã¬øpሞld ûïáQ5ÐKñ¢µv²8xFvcL–Š¢`Ï膣ó¡ Ðú*<H1a̯~#{)çrŒaÔVݰ[ësyÙ78N\tOê[Ö°õèíÛíð‚)EŸÝç`¤Óªµõ è¥mn9 8*‰µ ¢ïÓ=$²÷ÄžlCú{å7ó#üŽ8[²vìH¥Š’'Õ›ºðÞS¹S„–!,uD]EëK§•ÉY™9µÎÝp‡žÚe õöHEÏp1žÏœámÐUknØ­ÈIÃäçÍáyÙ² Ì7J‹ŸÎf§íl¿â>ÞÒ4'äô‚êàÖî=ÿoȩћAQ«÷C@à ÕŸàwZø~”݇ñ…!F9ófPìÓæn§ª§ìb¥ø€f®+˜{S£™#Њ9û¯¤—µÚKÓc¤'9²ñS—e05ó²÷žL:˜1or‚æN¥­.¿—W8“VVäm0‡¯)bJFD#L053W,3ÙŸ ¯Å+ä ã£À´_º¡Ámdý—QCEeý6ÓÚÚ¶-¹÷SùRÊú{ýïžîß)g‰|‰*Œ§ÉZÊd-à#³ö†MÜ´Å;iÑ´~Ó[þðœ×ùÕN€¨ú"¼­OAv‚ly%åºaîwÍQ´fž¬ÇSÔ}B]å"¢û:ŒŒ‡`HÚ˜óäuQÕxy‹¤Ez'HV3çlïiÚ@ŽŠpG[È­27¦e.s`šk‹†ÏEèoXÆc&?=˜LKll†k%(@T;vf¿VkÇNø§Ü¤P(Vóðæ.µt|~¯Uàç4P•QdÅbŒº}yäKÖº˜ºã0'ܺö¼á=+ ×F+àT¬Ç´ZÕ°L™Ùxw„ÐÄ2^¯íé,íE­Eïñ¹¶ˆŠûN†Ÿ< Ú)ɆI„¯"ݰeú(Bãž\Ë+]`³fxè˲öÙóXÃøŸ(ÆJ´sZ‡ÂzûýEr¦£6m€b[‘; ïú>u 9¢éHÅ’¨?„lj™aý#âú’ âȧïUÈP‘ma»vh&gÒ¤r‹Å$^uŠ¿‰w/å­?ÄS´ž9R;Ó0$„i»ìðÑ\nQž!YjåýâIþ€”;vETY—ˆhqurBŽl©š B&âc%åæd‚Ɔfä¶ò}»»Ýú¢Ëÿrí ðÓÌ¡Çt–D¥ÕüÇn =Ü L·ŸÁ\ßcAïõQ;ÓSj=}3´‚ÐÓnCßh¬dÎÌc®1·9Ø^‡•¢¾ÏX•´¡¼šV KŸ¶KÐpx…µÌ,CáÑàw†³¯’–~Qb îð{ñ¥²5wDàš0 `²Á$04cO#ŒU¼Íí¸ó•ÙçîV$ê3íó*sù²ûòòÿ¡ÀÏ endstream endobj 3346 0 obj 6081 endobj 3350 0 obj [155 /XYZ 32.2500000 521.750000 0] endobj 3351 0 obj [155 /XYZ 31.5000000 522.500000 0] endobj 3352 0 obj [155 /XYZ 32.2500000 241.250000 0] endobj 3353 0 obj [155 /XYZ 31.5000000 242.750000 0] endobj 3349 0 obj << /Type /Page /Parent 2 0 R /Contents 3354 0 R /Resources 3356 0 R /Annots 3357 0 R /MediaBox [0 0 595 842] >> endobj 3356 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1409 1409 0 R /F1700 1700 0 R /F8 8 0 R >> /XObject << >> >> endobj 3357 0 obj [ ] endobj 3354 0 obj << /Length 3355 0 R /Filter /FlateDecode >> stream xœí][ݶ~ß_qž äX¼èl¯] ŒèCч"iZMP7ýû=éì.¥¿3$%ÅHìX+Šä çúÍðÝ¿ÿû៿Þ}üþ?‡ºß?~ÿT벸þs8ÿúîõ_èæØýùP7åá‡_ž¾¾=}yúrúï·§ë ßüóéOÿ;èßNÿþ|øëßNùc÷Cçøå©Võé÷_~okuúSqûýü÷ÿzúË￞Gì?×Mæíÿ§Êâôë<‰O{ê—©.¿~ûá×§w× ûŠ)Ôé×AYcªµúðß<ýtú@?|ql­RueëâžÕúò¥æ4ˆn‹CY¾sù%3ºŠ0¸2U¼Á/3—Þ”ÓŒ•wpIÊj[vÛsúW~ƒ^†0ø…õc ~™¹ø®ô´Å£›ªûþ™üvsþpmO{fUsˆ+0ÕF·Ñc¾©#²ìeæ±\’²­®#Rö6zŒÍoqðóÌcQ.HY]˜2e_F°ùºhUÄÁÏ3DY<ø±±F™Z—öLå3…˦ѧ?צûç¾U©J_·¬-#ìÙmôÑe<“î:séMé© MmÓËÕºŠ°g&¢ÔÖ¶ˆÈJ—™KoJOm8x\OÛ³4ŒnãNaQ‚ÜFAöªŠ¨/.3%Aàà’”­•‰h ÜF±ùuÏ5¸Î<–%—¤lccjýÛè16¿ȹÎ<Ö™uÿ2žÉõo@¤ñ›çÅ_ŸÞ}>“êðõ§ÓÄ®¼üöõ—'{úŸsðI—‡¯?~_Jÿáðõç§æØ´E¥ËËü®OŠO—'åÑèF½y¢*ôŽ*àuy¢L?ÜËwð jøÄ^žØ£5× ñË“æúÎË_|„?Рģy6/ÎM·ð‚”žõ|p6’âQî  ­nຠ‹zèdÜcÖ)/O̱´USÏ$6ü°z†ßÁlýž`x8šÕh=žЉø°²Ä©Áì6˜Üs[u+.$–¡¯O”ê7pÎ2àÙПÝCyeO_Oj'®Æ¨úOšëεǺ*ßΛM˜±Ð‚£yäÍ€ˆãÈèϦ`Q1_ÐíÇdÎ1ñ|’'„—RÙ ±™=ÇœÉð¹ì©!D ^)&²QD¦¸‹9>Û0wºFÔfe¡u6X,¦Œj -Ÿ„ˆrF`Ì2$/öç ×¦L¸ZóìÞs(òÛØBÛ…Q3ž-Æëy?ŸÝˆÍg¶Ø‚‡\¶öxþx²˜‡|@Æ´Ì.°‡Ú…ˆ©Pn=Þs<žqj†Ïf¿y‰®«ÚºttÕ¶ÔüÕ$¬Œ1ñ;péC/#‘( pí').U¶@ŒÚñ©Ræ-ÛãeÞ#qìI‹žt´{GÃw> 'Î;GOÊ~§‚sûL<³îÌ ±õàÑð¾Õá߱Ĭ5|‚ùÏóç;Ïpß å<4%fùÓ‡¡¶‚4-ñ)3ÀgÁ|’¤\GÔÃô‘ÅU˜rml{¡‹ÔªªyËzª<­y«º˜ðJª°(£E×äÒRf;þ6Àà“¡å"b3±ˆÈæãÚÁO2Øj"ì‰ÔJ„¢×åô2œI¤’ò9)˜ÿpžx*ü×°µvUÏ*=€N{ÇŒ?ÛÖÝ©%çg$˜a|("gc(AˆŽÍ£­dƒòTè3rʳÅL*A6:¿›0&LÌØnY¹z •«„Bœ|BEýcÁ˜ø‹ajéèJ|˜SÅëSÙú²§ËeæLÀ¹ ¬%Oh#r– KŒešŸuö$gj÷GEà\S¡ ?«> ëð5ÍÛùàMÛxØíùQ[6ƒEW½u>éqžñ“NztüàÀ£Ì&fŒ¯„‘?Œ[ˆ`[ÃW„j("ä©BÊ0P@."™Üòú.þTu­7^±ã*ÝÔø©»ºk½ñj§ø:?i»-»‰ÂàÒtX^d5¤Óš©øÈÙ\vx²ÉV&ù=(beÀ˃AR¥á™‚µÈ½qáq,0¦o×O2h‹)¬ü€­ jP.ë@‚0Šˆa‰³!\ïCœ'“ Œm›êžÝ^òAMP”¡= {žD¬±F¨ Hª¾ð¢ÈØí{«¹ àÖà?Q­{¿„rbÀÜ”•ÉX³ÁIÎl7£Pá?׺.*6Úç*_t£l- >Ì¡ˆ¸}­d"OX˜É‰^ÔâwîM·gjçº3™ù&zí¤7OÐÚfÜmÙóÎN©B»Zl2Úu:Æ:Ó1DPˆŠi3òêVXL bv¸iŠ«ÉvÀ†øÜx§y©{¤)ኘˆ Ó‹é%†­ª\l²Æq"åĉõØ] ŽŸY¾ ‘Åv¨A ˆhóÉ8 T¿Hèëa.ÞÈžýÇ|Ae¯¦Z¬ÆÔjmí¨5Ï}±\³¼¦\«nm1F ¦ƒ)Ó¥rÉÆ- à "I~ÙîVKf ¼‘‹6÷Hd¬0ú"»·Må(ÅŽÃ27Ê g¦‰«£¨ æ`t“½‹Ñ DT€Qå‘ñ9"f;Së!N¥lKî&| âjVÝ1oÙFm+âŽ`-‰S.i PÙ“&\ÌŒGÓ8l¹¢nѱöȪ'¿A¾ßb–ü³×û‰Ý“6Â"—¡¥ºÒ2'” jKW±îHF`ÇF$ºÂšR×"é-& @¨3On' ô±5%O—¥: ùšÁ§²FŸ KyMuÞ9;¯+UºžÝ’T¸A„KD»8 ã”Dë'= jÆ´žxH–»,K¸«fìÏFkò…k=ö]`–áá²¥Ϙ®­sÈ8r"‚ÚÈiK M´nû®Ò—¿Éz„9”¦r@¢4¨> ‹ÌòÖ¥’špÇwôì¢2¥;O#p¿Ýü@½,Š4•;OU•3e.²Q݇Á…æ¿Â›êÍ*’£Šð‰©éŒr…q„’uO–íeM8b{­ød 8mËq÷E’y‘mûTmSÔÈÞX¹[¢ÍÇèOè‰Ç»Éž]›Bmõ@¡2M¬ˆ@ Õþ‰Ûc©HÌ@–&ëØ2⧨}cL¢Ô—âªm [ò-CÖWM¥ÜÑ8‘˰kÁw¦ “jLëI‘hM*x{¥,Üþ9ݘ=ñ[wEù#LÉ“¦~!ˆ‰v±!Í h@&]¶{ÂÞšu¿ßÑš•I û(Œ%$<Ë%HÔÔâ!¯´(;t™G?Ëžrª.pï4•¯Ó”GöÕÇÔ%’Knd÷&°/p(¹BÙ„lÒŒ ÄÊDpŸ?,²ŒÏhrl­1¿3*:ub GÓEjÜA@ùRûHŒcM5ö• ¼å&Uò‘ÑþžúèÌð€Y™DFò0ް¬¼ì,“«Å";Î>¼C@‚8¡1=ɈžÈ¦“MÁžõüðФ)èn·l±pÍ%5@ZxâÿØÆM®ª¦Ÿf—\/EkæÚb²ŽX6¨ ãJD{emÙ{j°™™bJV#S–S7·@æs éPnº4gwD£‡5X2ýE#©W³´a{/ILJ˜!éî*‘Wš/U8Ç=ÔÇ)‹«Š öò§Ê­²™9@Q5Ôà,ÀÝ7s8iϦØM˜ÖŒqÆÂ\–þÖHU ýÃü0¤UYÔV–êÎ&ZûGE«VmÖ 1ŸX_36‹(€²Îd£7Lç­è÷öª©ïIÙÚœwÆc´í|kE–m—é"ªZ;ü´±\îÖÊ5öÊÕE†@°~²—w\($Ó|t•6CâË”7g:n4"³¶E5ŽbµíT2‹6w]îã퉅1 &Ûá[´&ÈãùUm²U¼²5[B¡K¤m™hiä›;RÅ“]œµJ/0U)=ûcPyh<ƒh˜ñ¥Zë¨ÖÛÿ˜4„y’ÌÀdèÊ·A VsÐvœXRÕ¦o£ÑÝ }V¦ö­C¦+ô¤[Zuì.3{µ€Ïð½Ó9~ªp´.{XÛÆ}¢á :ȶ=ºw°u[BßÁë1pGñÜÔ•‘[hT½£ ¸Ò6œ>žwàŽjþ¤wóGfwGÅ–n]|·nœ‰`P_&ø áº2­!Rµµ¤Fc,"QŸíû7§êšI1z*Hªè§æ&z!¦ç2†€4ðGpcÆM<‡ƒ‘§SžRLü¢ªeHµˆœ •í“'ò—õ¯1w2XƹZjuцÎÖLQä‘ ÜSv¢eþ±Kx™)Éö§œßnɽr'Û_ƭ›?=EâÌ¿> ‰ f|*îØ£J87ø„Bœåž©œ c¯skõ "$kÊáóý~¶ÁàºÖ”½8f¹:Ê HÕBpÊ$IolÛIÚ­êRÄŽ¡%î.²y\ëëšR÷LÜt²åÓ~=ÓðI‹ž¨>±p4 Ÿ|„O>¡'Ï­‚£bø;xGáJÜkç†WŠ)ç™3kHSÏÜT8M1<3Àœˆùú9| œµ‡ãáܘ'~§»’!¾,n‹>¯MU¼00’ì}`¨B÷%ÃeëŽ$ºÈšk¬™È:£ØL6™ÊØ ÀåLl„‰ÎäâU¦ç,…xcêÜeØOéLÍöv}ïnj»©¹›š¼©™ÝÐÓ…*ß2eFO²––Û/ÄÎàF¾ B6äÅ„çGçe[$ãó» Sp`ÛĸP\j´ž§p :¦ªº^ÒôJWí¶ù¸m®‹—2»eLYÆŒ%ÙÁùÇö­„3 ÂŒÈ}ì ÜK‰ïI<³zš‹æG@&Å;ÇØ’Œ{žÍXŽ’•Š©R«Öå,æ™FWwäȨ[µ7[@}Y@Jq>g3±½EA‰`˜f”ŠZ´**rSÈ)͇'Vk‹xÇ¥‡-¤‡T•uõQ©/Â=Ùbd¸°l‡ }åž‘äíPF‰ÞÁ´„M ÔPí ËA­Ì“*í[)±ÜQB8†g>O0$R[a¨4†0c*À¹aÐ>Þ7#vCÍô9;Iùýœíç,Ú93x4¼oD¡‹%f­‰“î‘(p=žïÀ¢)ç¡)1kÌט> µ±,ñ)ÁЈ©³ò¬8Õ5FXô×wNÌ«'Wj({ÔîøN²F&.§‹ß´ý8ã‡ÑÌ­ *ã…ãJuÙJ(7À‰IÔrôŽSS—ÖÖá * ÇÔÔ1àWYC5À±%ªÖ)O†€YR•” kDË -˜JЬêÆ3?àòæ„À?s랺'z½3ؽ{¢×;šl¢§se<nâ¼à'PSÛs²ˆŒ9ƒ¥0‡xºcù¥†Ÿy ®x=BÄÀ܈.ÇžNÜD§çIY•FSÖ·û€vM¹kÊ]S.DS®T‡š÷õôQ`íZKÉΉ¨•5}ÍCwdÃjà!(ìHŒn5RUD_*mÎDÑ>¦M2^z®6#]îNàH5mG£}×|¶¹ÕŠ^eÂ9Ýs]í 1+ô¤[Quì²…ƒ]{§Eïô)¢z˜tëuÝ€5ºÎÁÊ ËgøäÊhZ [ŸÑ¬üN—&«m3{¥x=xZÃTð;Rá#|gß0MU g`àîÀ¹y¸ έÓê#»càÉÂôÁ¼ƒ×£Rõ½.õ-«ð ÕÇ…zfÀô@dó­ò:÷GéÆ;¶À½gî{æ2}m¨V;L2³ŒèÕñ ܈jpÐÖ,N[9šnû· Ä_SÐ-&ÑM`úBš1'`JOÔ¹ªŒÃ—žKbbÜ÷ñÌÕÊ=s›k…”Î~B@ïhfÏ`smÝzÉYèÔÚÖ=ÌÝ6Œ\‘/õô¸—Ýͺ4‡àíM/"ЍûÚ‘p±&ÛÇÕ¨JéÆU©8«Ä4!²²žwp¶§‰}¦•.ÊÙšöžH7ÊpßC("\?9Íø¢²eq"õd*U¯ŠÒÖÓ„™rqb:¬3Mª"?WÐÅ”·…Å —WƒÖ¬’@Ÿªâ&Ö¬0ƒ@DÂ0& ê€À&¡B @MÌÚÔ!À0ø î‡WŠ©-–6›qfT¼#:“f¦¦IÍó©è GóÀw8²èîxæF@q¢Æ|É\Ta¬p=LÆüÜ‹Áª8&Þ7FŸ1û#zUúNXðUÛ7¯”Étàª2hy3Ô€Ô·lYöŽä:) êj[-FíÚtצ»6M¬Mw¿QØoLf74…zË,a`Çå]«%ž‰„JENã—Z«JEdkݵ |Åב1A¹n ^ùµå©Z÷bxG_A.Úƒ† è…=¥cméT‚%ݘ;Ñõ€ ÖˆjÞ"ê2 ·«ŸÆbÙ2”Ͱ–Œðl VVDçÒüýw×Ðê8U´À¿®‰ë‹ÖÚÈí³ F{Œ"7UµÕ.—ÃX¥n² Ø¿œuÙ³A™k²©Ìæ3þ“¨KÁÓÏÏø’IPT}xQï« رªÊ†€¥r¯óÛšPbg #ç—¬yÎãQ0b›[²fsK@³é©†G°²$:ðSŠJ–W%Œªsæ!æZÁœh‡ÓL¶ ÓÂТ·/Ÿ@d¬©0™dx »Æ-üˆ'Ts?ÜàysÆAà<{B tÓöÿ–ŽnÕ 2˜¿±hÙ‘^„ôÚiJÒTÔY rûôëðí$r½ùËÔÌ4câÚœœ›B«/ 2_s˜Çww=bhwmÿúK±<_ Ÿ˜çîa L½gô3åËŒÍís·RT‰]2û2¥NVuKvpÔpø>±h ßéœw´ôWËpç?·—ÂbÎR‚b¸«AD —4˜zp=]ÄÎaŽOèüQï`¶iœ)y¨áþ¨gÛ j?ñ°6\Waïgúº0ÇN`Îä~Ì{åkÕ1¥6_žþI1´ endstream endobj 3355 0 obj 6212 endobj 3359 0 obj [156 /XYZ 31.5000000 513.500000 0] endobj 3360 0 obj [156 /XYZ 32.2500000 512 0] endobj 3361 0 obj << /Type /Annot /Subtype /Link /Rect [86.2500000 703.250000 134.250000 710 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_default_args >> endobj 3362 0 obj << /Type /Annot /Subtype /Link /Rect [330.750000 618.500000 385.500000 625.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn26 >> endobj 3358 0 obj << /Type /Page /Parent 2 0 R /Contents 3363 0 R /Resources 3365 0 R /Annots 3366 0 R /MediaBox [0 0 595 842] >> endobj 3365 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1409 1409 0 R /F8 8 0 R >> /XObject << >> >> endobj 3366 0 obj [ 3361 0 R 3362 0 R ] endobj 3363 0 obj << /Length 3364 0 R /Filter /FlateDecode >> stream xœí]ËŽä¶Ý÷WÔ:€ËâCæÕ²0˜²²ì8a™d‘ßO=¤ênª%žº¤¨*y`ϸ5¢ø¸¼ï{î÷üò÷Ý?ÿ»ûþ×ï~èÿðå©Ú·uuþgwüõÝëh·ïÿ¼k]½ûá×§o»oOŸŸ>þûíéü—>üé;½ûÓáߟwýÛá‡?öéø~}jU{øý—Óï]«ª.¿þ¯§¿ün÷ÛqÄásýdÞþÿwªV¶mŽÓ˜øô·§a™êôë¿?üöôýyâ¾b*ÝÕz§¬±;ÕY½ûÏ?ž~:|`¾ÚwV©¶±muˇZ}ú’kwJw‡‘”}èôKhxùÁ:ü8Õà癋ïŠ2 .x¸F¹.áá¾>Áà‡MJH9Ç™§:ÜÀè’‡kãŸ7Ș[ô2|‚ÁkÛ¤ü4sñ]¾wMÿü3ùmwüp«ŸµÊí’ Ó6Ç>ü+8/Ã'¼«’Õiæâ»2]ðp­ª†K]©èæ-z5|‚Áu]§ü4sñ]é70ºäáíΤm›`‹.çØÿºMH9§™‹ïÊp¸xtÉÃmêw.[~>Áþ×Ix¸§™‹ïÊp¸£Ñ?ÇŒ‚§rþ °%¿^|ÿõéûçƒzÙì¾þt˜Ùùƒ§ß¾þúdÿs4.²äë»ßW•ÒØ}ýùÉí]W5º>Íïü¤jÑeá;NOìÞš³¹þò¤>=1ûƒbçÚ7ï¸óhs“Õ½ƒŸàÑ*ãOÉÆ¯K½÷ßS bÔüÍí#^qèøÃò§d?~ðéëá–ÜFàÊVˆÆÛúHã*¿L£;}µÛŸfW7þÊ“~‹®½cá“=ÑÌ;pÖÕ3|bП¾óžØ7Ñ ÌMÁ'Ÿà“Ä Úø½Ìî^£Qû¶ièL‰ïTïè“ËÃM7͹¶'eÓ%qñ tM̹é|×c‰'…ܳÚCË%?yœ{f˜;³Ý³©{Ö¶ÅÐrÉOçžihC­ôžÁ˜Nêž…DF=|r8Ķ©Oóñ ìšÝ/áìÑç'J £¼¼Ó « >.Æ›˜ÛùÕ{£z;ìþ13HËWUãŸù:FL¡Ò¦õvJÄ+F ‚i:<ñí¸ý$\¡øÂ2þF<Ì‘‰×ÃËh»F?`Øž#`kö9Å¢¢Î)@b  ¸Ö¿Ã_ ¼6,‚˜S½9A… EëXÔ1ú¬”*3 7ƒÆÜïµÏ}ÕÇxÐ ®kòŸ¹Þ²18LLx´© w‰31õÀ¾äŒÏ'ð_(| ¾D d“(ǰ†¸ÌIؘQàŒ£, rÃ\ Ÿä«“3H(7»Öùº¯¬Æ0 f4F6Áw´N(èM`ÚÇ0Re ù¼ÒU0£Æ·ïÞ?|NI@ÉàÜi†HåÜalRQ†€uJgÒŠ×þó~}²j”¦æ‘„šOª®=šh–DúUà‚¾:ac}ÍÌ…MœiBiâx´§“íŽÙ‡»_Ÿ´3¯ðËÓ—ìù‡Ç)¼%·ôš‹v­ÿÍœPKdUÈÑd…™)fr²¾¥Q:$Μdv)…ý˜ÖïnkŸ.™´­ê#|B$¨f€f0̇c ¯Ï ¿ƒã8œ(šêå3ey.Ö_y£, |§ /£UfÀ8âÞ{°°O#!‘´¦ñYÊ*I!qA`²óí7,wZ.§@`=ïæÛæØǸJuaÛ'i}Ék€2Ë&,Ϙ”ï€<ÃÉ6p8.n¡ÔÚôàÜÊ×7¢N§­´¤E,jß°j’oœÔÆœ}&z a^#[’rgéˆ÷–t¸q‡IîÐ\æƒilêIž™¶C1ÐV¹E&à¤[QäýiÞ¢H†wF=) ½Þ;,Z""ÀDÑ™øzÀI]8”†f‹§‰]¢áÄÀܘP'>mÑÈP Š)‘Ù¢ƒòÔα6Ř¥G ¢¹NuùDÛ$2–g!LžâÈØ<<“¢<4QëÎ}ÎC¬€ º3t>Áçq’S^!þ0©Å£Ì8|¶"œ;Àhj9©­xëë«4¯±“Ç6aRFƒ»“kø&û)Àkç3p¦> 4ÞTI¹jç‹-J‘Ŭ”ŒÑÀhJá)ηM ¨ZW EÀäm{|-°´gv6ÂàX\ƒŽÉý S&ø ò¨38ºê Ûôí=ÊiÅ(ù"*éâ5ç$¿°’ªlëŸý¦¤nJ*9ƒbÀ­–ͧd×Míßټٸ‰Sí]ã-oK} έüÔ·”©öuçQKz;³iŒÿMÄô\±ò2ª…­”’1-îÌ#Aõ(ÏïÄÕ%[n˜Vêv­/u7C`3ò(´J9ß` „®› :A´0ˆŠ2QÒbÊ´8Dáܨ©sÊà†kí ÄW8%$——µÀ¤”\KgB:ø4LøŸ‰xˆBÝ:7£%3ñ æQ8 X(²byfÈ‘hg䨮3ɆHÈ8÷•ГzWRŒwÀ¦ÂÌb~»5|ê«B\—ƒH4™˜òD07h¡·áÈâ¤Ïuú1Z™ˆ¡3yê e®kœ/sñG¤ Ü€¦(¬73l¾c>¢£2~Mž¨n5|Ó•-Ocq˜«Œ*[\€¹ƒLÿFﵬd@ÝÏ›¯ê}Õ™7G™MvDÈÞÉ8ÔÞ{œ:óvó¶HûiCs*ãQ eî¤M§£œÑó¯6ŽôÉjѲN´Ç1ý–ùËë÷ïa. 𱮕Ç@s^T²s˜pN¦Ž²·{áôí¦k}’‚‰©íkp ðêÁ3ÀZ^k4©¯²«€.´H_WùT`›žïU½£yDñíS<ÍÐöøöÎT¯pÄ·O´9Æ7r0µbú€QXDË>*¦ˆŸ`–ͨ¸Ø8žRâfÐÒ[Ò9V»ZŸ–r÷Jè†@æËdÂSLŸ@Ù@µhà}R¢ °h‡’ʪ‘w£—fØì‰ó3âb2ïœÁEšRÔ38I³×êt¾³xÃùž+;¼ôòä™X~'¹:­Tí aÆ“hanàí¬˜5 sim;È“ æ{óÀ†çV¾–É­ŽÊî.:/?#¯mšI¾±Á|KbK2Ý`¾7îp wpõ$wèøÖÂÕ4,Ÿñm"jŸoÃ76ãÅÇ(tk‡c ÆÔ³õO²p”ºòÀ0¯­»ˆÆµ6·Ü­­qÀ2æ[ã€û;Ó­q€t!gÝ^Z·ã¦p#SNË ˜h‰A˪ÎÛà$:JJßµuþ —åêÅ Ábf Šù-ý›é1¿ðq@Í™°kÌ3Ø2LÁ•cª*“Gçì`‹\8\bØ©,’§VÖíkö=§LvìÔl ÇÀ2QŒÏó-n†P÷{%‘Ðù:ë:Mú þ©X<g›s é68}]&ýfã}sy|¼@fÍ|%í”u©º$ÙbtÏ’©Ì$Òöekwc,Z¢–;[}SyE¤ ªÖýLæÇ±cl6Æ÷•\u܇ÝÅÆ`*ôe‹‹)TÊcß§tý5Ú;^¯bÒ\â˜X`Æp˜O’ÒÓóÇT/2)Zרȉp bh­©‚ŸMŒ¼ù«ó{<3Ì÷Ìè¢YyÉ¡\~ìx ܦŠ7…¶œ´­ƒò¤$Ã@1áÑÆr- rùÅYqßáDéä¸1Ü¥@0ï¬(“ZAϸ¥ô®³ÞíM’2Ò7fŒÏ>f²ûšK÷Ò>SEUû¦UoÅà:U*Q·SñPqF¬G6_Av»D‘ð2"‘DSG* ÏŒ†=à¹À½EÝÍ1FKhOaøW&p°¼Ö”ŠBÄž£ Ì"°µ'³ÌürmÆÃB!?®‡…Y:åÁ^ c£È¶)f c·ÁÖÝW,ÉñðÌma²d‰ïPþAÁB4³vãf²Ü,eȪê´'†õ³¿ZÙ ¾ L>ÞfGovtºÒŠ\]Y–OIhj3y Jl÷'kiÆv€Óšà˜ùf &dŽË¥3×Ú£h†¤0bƒ™ò ׄÝPÇÒFû!W°§„™#¯869d#O÷¦:¯Á?6?ÉxDªLÂ"9k¡Ê§>¤÷Â0(¸"IVôã‘ô©üÃW–¦l–”³q¾êÖ#×DYC÷Ò…¿Ã04† ‹¦L7&¯H¤C “…ÕJf#™ "㑑д¨FÇ™EÑãiÆT|X$|š8Q5s’Ö Ü.)pt_øöJB‹¦ȶ~ háóOÞZ¸ŒÑqFÈzQG6xò· Àà˜6Ü^{~a„­¡Ë)s;m¯Óú‰ÒÛJŸ|w¡¦óš^v®AOz®Ôì{„ôWïXøN‡ÞéoÇánzlâÊ(j°$üz§OBTv?ÂØïâטþÎ'ô$ð3=µûÎù'öž¥†ßy†+=ÏM+[úŽÊ…²Õ^àãÕ32l¨€!Õrõü£Fc,)ÑšŠ»s[IäZÆ"äªÊÔ“>Áñ>Ú<­¢°""—t)k¯˜Þ0IÓ%'×Õuæ“ÔMc$»ê 6|ø>²Od5Ow^¸›#¼3:ªòòÚPàLË—yn“b¾r~"BÑ9÷–@¤€¡Eà1ÓÀœ ˆa05}Dœ€Éa“ÅAä£ “#ÎI$ã6ÆdÂ*²ïLu›L1lÕ€ýØoæ3šHÈ'ðaÁ³”É9O"ÅT`à\Š%ؘ äèb1LÙTOÑzΓ³4·hì3G(^éV[ÿJ—èŒJ\‰`DãòÇå! dS3ðua¥ H»¾fŽÀ¡Ð ™UÍŒa„e3µ „¨*‘*Ø~²‡¼Gy¢*ç_ÙÔø †h é¤B–˜Œ”‘~ÄìŸrû§$0]éX%étÔˆÞ{¿Ð•I&Aq~áz6f/‹•¸ˆ á£I·d)É}Êö°·“FêxE²Íy%ÒAS»Ò4;ØRÜS;>(|L_á¦NCôðñS{â^êw‰âF‘Ns²µÀ„@%æ|÷¦ %zŒwxD9DñãO tƒ¥™Å˜ä‰]£‡'o¹Å#Ø Mã¼U?H—Ÿµ/EKé%w­ài³¨“‘k.9¬áòÁ—,"ÉEfKJY] u5`5Ð É2*R’Y¡YæJp?°Ñ2ðÙ2 Ÿ“h©hë»%;[(­#DÜ\- (è%ØoÀX`L+ÑèäIÁ‰¨Ýä…Þºäw¥Àš˜²}Ñî ñèFq÷å|"ÊÖÙDúžœÐ9ÈE=áXA£M¡” &·VÄÓ¸|£˜@8¶Gíª÷UgÞ®³‘¾CæÌ@ÄW ÉØ*•‹Ìqmê‡tmê®Í…~ øc¦”ˆ”>ÈÚ§Ç»Sqs¹sUÝGà”j™Âs% ûõDsoÇ‘SÆ€é;’—ÐY©–#õ4Ëßh â>W‡Ñ´Eùj¶@ïjmç Û´ Õã>Ýb\šÖIž¬r+ë½K,„˜ZY†ðÑe‚n°•» E0r \‘#œe½÷Ä©2úÖ$¹3"hœÏÇhÌ¢J‡LˆÑ¶ÝB¶ÖE)ÒzæŒó¹ëÖKˆ¡ºõw*=HD£üoŠâ²ãþsc†1 ™¸Z>ài«Ìbr{ÜÀÃsÛÀ ìѪº™œì ¹&À5Aÿò´‡„700æB™öz{²=¹Ç'6 Y0¿Åð³â•Y–mø 6G]Šre@òe(ÈaøÙ€þ…)„ ŒöÓÓuÉßÖIî&#ù £Å2ÍB°-QJªŽi+ø|›à;Ütø‹g€ïfÁ+ Ø”˜ 13ÀßÁ--|çDµ`YÉŸ«IÑJeèÀÕ"‘»¡ñ‚;bÄÚÜNÏG«‹C¶ì6:V}ËÝ`nô*›WróJÎ’Öé3´»´ -ÁZ®#Äü’Æ:Ÿ–RØ•¼À^¸ÄX¤\ù¢üÅZ 0T<÷©˜”éoò ˜²¶R7O\I)ŽÆò'"å*lIþJŒ"·T±º,øM`/pv+#†ÀSFD2ë!f¨4“ün¬@PJL í¦)-¨)•_H˜P8vºñ…£p #;ÒæïP³X> G>9 ‹%Èð ¼.Y¼&H«XÞX רÇLVD/epú" T‰á…ëâDÑäÃmT¹JèLÕNÓW.Oà²"Îz;RLZBÊÚY«}:¸ÏjÔ8¬4Q*êf‰òËl°©ë»õFÿÚßM{/snÈ÷—›Â#„c²6Åú.¢°Z×…Øcøî1"Àed›3¥¶V§#º‹¶ñ B”Ec‰Ñer Pˆ-‹ì“ÖĦ6R´"@ßøL¸ªt‹Né¦íFÂ/ÃÄŠ´"’ÆûŸ l¾¼ÉYÿmõöèãr‰ºlœ«¿Î¬ÉÒkxðSóYgÞ¥p:¬È™Umºî†Ó*Æ!˜ü´pMXÎÓ²ÊÝpZ¹²Ñ©¹á›Šåœu ºƒ@ÉzÂ7! äâP«F@ÈsŽ7Õ³æâ][=ëVÏÖ‘§ž5×Ão ¤3P÷ÍQ;3ƒÛ]j)nWx=_}©<¼7ÍF–ÿ¯ÓžÎfÕ1uv¹l˜"¸H}©›½K.Rž/“ ¿¹©cÂ`·6v*3Áº¥:ñüö¢9ô”+öar d gD¡«W‘\~Zÿ#æ äJª¥:k2©zxw¢ûŽ¥L¡Q¾ôÂÌi I5­\ªÛÄò½b˜ì€ˆ$¨lz“½¨j²E5x“™¼×ˆ§ûÀ‰Ø:ŠDph©be¬:Š6¢cfh‘3¿ýQŒJ"›ƒ>J a’ÅŽ.Ú$f«™+AB (-Ö)Otà»-V‡é:Š*‰x²ŒˆXà¨7”ˆú‰iI4Ó~<{¬Ï3鸌p–-Â-¥Ú#ê;‚ˆ7B“â(´ž¬¢˜.‘ÀN•±0»+ªÎÔLÂî ŸËÁ—ñÅgb xSDÉŒÒMe; ìSfTxGQQ‚P=F®pXÏ™Æápf¬T,ã{ÊWÖ¬‚µŠ8I”Ùª¯Ê~Ùîå "0ÃØa”MŠ/#a´‘Lo¾›‘Š£Jp…ƒ–ìÀ 5‘ù°¨‡0[eðâ®jÙx@82ø²h¼3$eèØÕ¾R"еŠ3†¥$pV¨›‹+ÈëòdåÂt]OT$¹Woy¾Lùˆ<¶À@ÍGÄ–²%MtCÅV©ø¢¨·ÀØ[—tçö‹“È…–DÉOŒ@§ŒÇQî®QÞÚ¬% ]‚j“8)•% 3(µFq'þËŒ Ö¶d4+…Ý’pòåʼŽOŒÈ×Ã*;Ç´"“¬"ëÃ`ÂÀLR VKxnQ¥gløÑV9–ßÑ« C®l4B]Q/‚îds|÷FÇHI†f——’S|(½ã®U5<²ñÆ„+ê;V¼¬([O²å6Д“=¢Ë©[dà}™l ‚}ÄèËGÔ—r&SÆ+£èHœFÉYë[–vP"-ž¥MÙ¨)âÑ)3,ºÆ±1¹V¢ k¡ôšÑâ‘"#¦¤&;‘uD2ïÌh„ËK8+ϧ.ÆJ9 E=]Ùâ¨Ëg¬I…´5´>£‡ ŒªÛ¸…æÛéTyíT$4e~ýa–SÖp¶¼6 »iùÈÍb˜9¹ ¶–/Ë+:ãÌ%7™(™>/ðJ¾Á˜ºµiJ/Ìà}3v’ ‹&/®`”Ú"0á¤jí>ÆÖ ¿ƒ»¨`”`ŒÞ>Õ‹&á-Ѻóv*½. ñ¯æ½CŽTa VfJŒÀ"zö¶˜ùŽh €Ñ (üÇ=Ín¥\5[&zTÚwD©%q× @>[˜DÖ+_AÅÝxý]{QÔûþ,ê ­k½brº›Ë7v[6OUn‘ÞÊL‰0Æ(çL†ôÈ¡­ëí(Z74 ´WÓдČ·`Ån>B€0T™63T£Õ¼…JQ3(¹µª°1¥ \ktç†[úh¸×îuéí{Ý¥kwÉ-Fñwr6,rú¦f¹öJ¶ÁU;ooi¯‰Û„ÚQüŽ’G¢-Ù0‡2Ä ˜YFNWv=5|?¡8{Árï–n™©7¯injn™‰û ·d&ÜZ<ÌU1‡„¶ ¶&pÛ@KZ¸£7lÄZ™È¥¸Èâ쌜7ÐÝÔ€ßH—”L_þ¦C;NXÖÞhÃ~í¾#H7Ÿ§þ ­ð"ûJ#m;} *ŸwîšSï|í'Îùìô^Ÿ2SÆZd3~Ò·þÔû>Ò7:»k>¯è;fʱymnÏýJQ°§YŸb7s3^`oºàJqìu»² …Gƒïôþ8µôWy@,Áÿ|˜ñ[!uÍ“XÇ“€ÆûI@=÷ï t¢k£}B„K½ƒ÷Ûy¤XAPй1 z×ù«{ã>p²øÆà¾ãn§×¶2ûž×Í$\8Ñ^[ì¹þÇß}~ú? J`‹ endstream endobj 3364 0 obj 6741 endobj 3368 0 obj [157 /XYZ 31.5000000 374 0] endobj 3369 0 obj [157 /XYZ 32.2500000 372.500000 0] endobj 3370 0 obj << /Type /Annot /Subtype /Link /Rect [222 319.250000 308.250000 326 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.sourceware.org/libffi/) >> >> endobj 3367 0 obj << /Type /Page /Parent 2 0 R /Contents 3371 0 R /Resources 3373 0 R /Annots 3374 0 R /MediaBox [0 0 595 842] >> endobj 3373 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R /F1700 1700 0 R >> /XObject << >> >> endobj 3374 0 obj [ 3370 0 R ] endobj 3371 0 obj << /Length 3372 0 R /Filter /FlateDecode >> stream xœí]IǾϯà9€é®¥7 `Kv€CC`gAQrÈßgXœ¥»¿GÖׯ^9´`KžRwW½}¯oûùÏ»¿ýw÷í‡ÏÿÞý”~ÿðù¡Ù÷msüg÷øë›×?ðÃ>ýy×íî§_¾î¾>|zøtøïׇãŸ?üþð§ÿíüîw‡ÿ±ûãŸ?ü9ý¥Ç¿ðËCïúÃïÿ|ú}ìÝáOÍóï?ÿûÃ~µû×ãOŸK›yûÿ߸ÖÇØ?nã̧¿>œŽéž~ý÷§=|{@ÞWB‡1î\ ‡ÿŒÑïþ󗇿>pz}³£s}ûf͇zÿø¥¾mwÎÍnšÙ‡ž~é¼Þ鿼íTèåÇ«CÅ…ÎÉoWDnÛþç ¾ü_^_àå£+øò§«C%!Wxû~èÒ?ðÏ䷇ǻƨ*ºaWTftÞ 5ÁÀΫ÷뿼oC¹—w®–DX ¯ÿ”ó¼Qµ}üþË÷?ºØŒ;×í¾üõ°»ã7Ÿ~ûrK»ûæ îÆfØ}ùy÷ë¦qñ7»/ÿx÷oO[,±´â¿ƒoÑJó!Åá¸7×Áïøü·ág„ó@¸>!‚ ~<¤σñóžô¸ò#ÜÁ÷ùØÖ¥Äî?àIžƒ˜‹ðaonømæ0] ”ˆw€)ã~Ó>©@U˜ƒ±¤€Ï`lp¤ë¾Wqã{c#ÈuW°\‡²S\˜^0]bYeš)c·'á£áN»v õ’P°>0D ] ºëWL¿ø¸ƒ@ì€Ùu à¦,Ùá®uaÐÂgð –ßD¿7ä³!^ƒ7¥'ÔÐë ø ¦$ÁgÀ¼Ù÷A®Å0À’‹‚ªbpŠíXÁRÃòRˆ`ÃaÉ…íÆ«Ä!~Z«Xl­2’XUzc«˜ñ›°ô®Â’>|9Ë[A¦AéÀ`˜’ƒŒÅì „eeC/ÞŸ¾Š%æ-lÿ,å#Þ‡%ö1îqœ ¿ ž§ÅÏ`‹ÇK obZÆ+Äôð3ØJÂÏØ®Øp`tw ù:,dUmb*å»2”Dyú„fÀ–g«šµðÃB<g:0-c@ŠeüŒ€iY•7„µÁÚÜG,öº£*mÓÆü|Ïë6÷¼®ˆŸ{^W\Ù<¯Ë`Ëhe cëC"ú/<£jÛérpåÙÛ¶­+†îß¦ŽŒoëœuæÞ0Kܺ°&ŸMùM›û¥ÛgnnÍ ‹XOàø®åÁœÑ·áXèUZ®UûŽ–Ò·]UÅr•qí%díÑ×[×\Üí±¦{l´ÎÿZÚcÞyãÓÕl[)ï ÚDî]ðİ-u<>*•RQilùa]G¬Ô1c–Êïýýb”äÞßïï_Á­[)¢üaÆÊ>7ãÌVá>•ï¢g®r*ö¬ÎsƒöÚ¶5¯ö6²"Íæþöyuw L<&æ ëÆyêˆ`¶ýšx¥ÇÙŽkfmÝb¬µsN蓱9~²ëÞ2]ÜÇp¼Ñè8G° ûalžà3eá¥g"ZI…Koóù߉G2û߆þÍ3mZig+ð<ÂÛˆ“¦dÇðBK!ÿè)+íÂ>øÁ–^Vð3ð;1ÀclŽÊ¤]Ö+…† È@€ßIî>ɉá‚×'•Øž0z Íâ·¥¢Ë¼cœCOYqÜ8>W01µ ,C7ƘK°X›ò@¬ø‡ŠÇÏ40Ó6” +¨>OÄuù;H†×ÒÛmåàÌ »&Ä!†Njå¯Saè|7e.¸%,Þϲ]«âï`ÒÄ í Ø0ÄÐÉR˜Çñ–f¯Ÿýãs'¶?#Ôå Íjw—c‚TÀÇ™½ž XP•W…Ãà/V…º‚.E]³ïz÷Õsrê´P[Â@%|IA4aAyY„å[(„?æë¹p Pô];Ñšºzîš|V3³€!M¬¢20Cro¥wÜRN2–包Ík˜ƒ oör½–¢ë’QS‚G ¢Ãs2øòð‰À?ç®W1¬C˜ðެ̊- ·gnlX9”|JDë(ŸbÙPœo‡ '^[ðÌýT–loyá CÅø¹>Û0)©´B;¥´5qëg¼'Õ¨Æ¶î² ®Zï&(8[m_ Ú™CŠ0s]Y1‹ë²Hà”¿ò¸Z Y^–çº1N¨¼š.’‚¼Ý·a™·‹~sfÊÜTVy‰f1\¬`#$ÃïP„>Þ>ÓW­ãT‡w§äàq'gÓ §*GçNÔsRýø 6¦rG`$È|f¾Ná’cSÞ,{^—óÍT+Rª­ w”±qñ‡©ÀÕUÖUº5#»K” 1–Aª½]xfÅJùXzßtrŒÉFÕhðX…@€Ÿj¨¦´ï‰·„Á¨FM1%KXbJ)a/gÕ,`2›§ù6,Ó ¾Š«Ú¨È9 ër5"0™j=‹`ÎïŒj*Hí‚ùÂx÷ºz ¢åæF2"7ÊVf¬ •NÔSuh6^Ï0£”x³—g"É«›½bê4Ê{†¸‘B½÷Èe €¶#LÞÍ’R—ÇÏVÚÊ#ÂcŒb`TûöÒJÕïÀy•쌲VQ¤àXaÛ’@²`ÞRÚ×ùnª°„iïxÖ3!O“P›T¼Ÿêé›rU "‘ÏÃÀ˨¸í…®‹MÅ—˜’zLN³Šs&€V6›¨Ó˜dÕfK8žLºt"ŽªœïÊ@v¥Å 0&ÚµSGĦ„ðSjÎX0Û' õHù/*¹ªÍ{ó+ boæx ¤sy]†U©UµÖ}×Q& á"®ÍºHðÀU~^Ѣ̙Ð7('ߤê 5 ËI£b;ž"AµåÅ Ø; ”ë‡æ¸;k&¾& ïš¹¬N¸’ C_9¢:@MµcbûqÍ…ÇDà q¦¯’¹FC¸`có1±Vל\)~˜èª˜ÃCê-GØn͵ƌ6c­E\“¢Kÿ5Ky¡¥C—báuæÚ\å‹Z N™½m/½ñ¸l<°^—}k0€”ø~`€)þýÀëÐ÷ƒ­¬³0°±0ÂU\U}_¹¹ Dã]SžZbß7 îš²ñøb–wƒhd-à+ø<Þ5±RÇ%8CûœÕ2¼ÐfOWOY]Swá;D䜹û:#»ÖL>Ÿ‡’/wœr8Õ811/£ €õäÿ™òÓ1žR;TW£J_ÃfÕ™*snï…œ/ÏèvZ¡žUq¥ º­1š·ÝH%~ñªÝÁ‹º­¬Teó¦ÀhÍ,¨âÅa§¨/z®ð@ù¨¼ûä²rÂršB—­êÌT•^óŒk³˜{Û1Ætz×\\vÄ,ÕPªÒa´L^^`^Zþ1­ C*˜iv º«pŸQÉæÍ&5o¾Ò3l3¨#,R]3fÎ'ªwê( ߊí[Ý.ŽÇ`®R.Oµê©ÜpTÖÓ½¥yÞKÌø÷ºøÜ¸NƒpX7 Ã3ÃD±ÆLã"< |Q=3µp­nà…éoGv|I5ÜÒà ”š¦ë1Æ=#•.”Ê¡·úŒ{æ†bAG0Œyù ` 6rºT·3–\áóåfF…äª{²‚ÂÂä& c,ÃòÑC07„Ï× j¦.8Þ(¢mÒᥫøŒDP7Mƒ”°‚¥¬²DN­¨iØù¸hÁ=±I׸î-l“?Çýà½C+éÝ>eß/zfDÏ$ùxØÑD{,¼Åj';™õLªsq?-#pcþ9|J£ ó·»N}c {Ã+ɳ]Ø›ƒ'Å0 NŠwp|¦ßÃä¤Idí ™™K+x-„[ö&¬Xwtó»¦s'@%¢lö]ïÞúZºWÞÚU$Œ; q‚^ÅWÈÉÁ1ƒt‰¼J1Èv#Èr f–(O“Õ½©€ö){ËWû™É0‡$oRQ®Ý7ãÄP€ÑÌT8ëüi©]‘E)Yår¼õë•^£®¾ÔÕLâŽ+Y]¾i_ÂÑ_ªBcXiÕÕ:ªš'çÎ&¦ªpŠÌ9 qÁ&^|é›J€23ˆêÍŒ±“ºõØÌ|[C¶èݱ~ªñ˜Á™ª•<4ŠB㇠‰kˆ&»9ýlP Õõ¹{¬ÏMS¯j0䉋Ot/Qו9P9̳ug.á»á<91.iNi‘ö3öaJÖ¬¸a‚jŸL 9ãŒMÜo(xV·”g)ÃÍæô2h MΩkÐMëŽ/+VtI5'¦|óÍ‚Œ7¦['0Ö1Œ$!lqÆÑé),gÊk+½¿=ñ @”/)ë`&Õ‚±0+xÑuˆ %ÌÌÔÍ„L?Œ®ýü~Í)]@–îÃRm9R¹•öÝFÈŠ6ø 3yñ}ù_5‹Æi´[ ’©„d¥š.7ÏU’hŒ"§ª]ïCr@lÕo×5Ï7‹”¾œqóžªí'ÂÔ|8U v¹IR^Ùz&­\^dÔ&žs9W}w°Räj”DR¾¡žé;ÒÙÂ`N¥ÉÄ(:&GðÞékÕ-ŠÙøeåMN‚O 0 µ »®L0’ TM^}ÎW…Cœr: tëH/”§8ó툈5U ‚Û!˜þu¦ºRq„‰Êèo&Šš#†2 :TЇ³[Jê–ãMί”‹.V©Q0Xâžùø©× po@qüÉE0tù³Ãß©td69AÖO÷/q0&ŒW„|bEˆ=eX¶Œ#pù°3*<”±aXAlêbÜÖÌïi×ÏòïÈ»nλ,øÄíþñù_úØ¿þÁ?> ²Œh}ÜÂ[±®.ZBŽ­q…í[ªèèF¬•Í'*×L3©{;ilÝ„™Kãù1pLŒèüÎhij\·P•!>¥™Ì(²Œ2Á˪ rØw¥3.mæ|­É,W<mžÿÄ2TD#ÛpÖ  bÌa—ÛèBƒÌfT§Ÿ5sJÖÊ´íϺź5 *Mš9­Àº`›Nu ¸ ¦uÑyJpUw`UÝ@¥´u«˜R¡5^_71#R_Ï*¯k5ÄêF<áŒÒÍsÊ·äÐÐ&Š”ªeg*Ußf£oŒ?¬k~2Bn„ÓÊ…œF@V®¡ÕD*¦UÂlðaõ鎷§&R1â†O8óÃi 5¾ô–ª¢!Œ9a%£… ¾©ÒUj¬lÙŽr§\Å:—j%¸¼¨Dˆ%lUÙ³}’)?»¢ %]xí²  ›HÊ4®‡p‘*†ˆâ ÊÒÊwZ ÁŠ#LáQ¾V) õ|ù¦YKÅñ5ÞÖ­ÛÛŽóÀL_ #mUëÑ‹\í¨!ýbc~˜p^ª4÷Oû|s¼ˆV„gF´’ÂŽK+­¼µ€‹~švY.V©e3’­9y9ÌH¼„-«Þ‡9Ú zTu WŠ+ä!Â+úÍqúÍûÐÛúÁ¤tã WÕëSaW(S¯…I”ªiWMœæ Ú²š»D”–S5—ð5‚*´gñŽUÉJš§~ëŠ`ù`°ožüûmGÛßvÄhÛÈh[Æpº&@¦–¨²žr´ÂýóþDäKNoVt¡#\Iè[rzøèãàï$œ(½-ÝÒyà®Fðùßaöæ¿Ë‡†[¸´´ƒùÐÁØÆç0÷æð Â;PÅ©.6œ | iG€Ž*Ÿ \OÈ7Ôpo8¬HI>ü6 —l/{Îòj±¯ ôîpþÜÌŠ®´ÃHÉ4†.¡|b¤¶d’õc‚ûàž‹X°¬€ðÅšË$A£BY.p‘Ð`púv€qO¬P{ûÞÆB¿BŠi.§)¥NxXÕþ ˜.GC<¶Ý <êZºšÊÌŽ…00Åãá÷w‡Ç* ]¸Z$!Ç#)ØzÀÁ$¼ Á£ÁzžÓ˜Ç>ÜPùŒ¡UªÂ–0¶RL90øj8ãQ—1%]§mÅØ»”o="¼å“ û±äœ®*kOý:© ÓŽð Æ‘Fnñ®a¦D·uHâÖÅ£°‚í¼BPEP•ÞÛĘ]&Óaë7)Áó^©=ú{k_‹±øÔ¨87 6¡Š¦ÞÄñ"Â}÷®ž«ò¬ 7œÀÏñé›óÕ˜Œ/–ÑuØÃxö V1'&ÿ…i¬…+”$ÆñÍólXnLåªZ× –"ö¡®Öªh_ê¸IÙKÀˆ¨²ò…˜è2eÿT,Ë1Ïèâ× ŒÕ8"¶·)¤J‰L´„±£*æ˜êÊóÃX`êô«ºâª'ŒÓJ´Q\S¯`¶‚%>¶\1ÅbÎÀ2 Ë,ÓˆæsSÜwkj˜• 6wê‚Ó ÑøtVvlÄ5Hq±âJ†š-0,"ÞÎYW|ReßÜPŽuÍšŠ!K™Ôùk¨¬¨Y¾x,_ðyˆSúk²¼{N0ïmU;#Dö±=…)‰ð'”+dn°bù >·„ãs˺j«c*{ˆþE¦#”ê Ãv³g¢ÀBü÷—2ý²øbT¯„j•rËD•eïbJÄ0À™ L‰D5UMt®ƒ¬¸W¨8fì¬TíÃ)šƒ;ÕÈc9ˆ9÷½©æ•„H8Îjý»Vò‰‰ êv¹[ M¬#۷ﯟǬ;ˆÐtØö­£ÿ«ïWEuµž ‚9Uµ®F¹'•Ø›)îÇ5ñ$+Ü[uœS¸gº­:è«ðº·&¸}\eûª+Š©4U­L¨„úªˆãæ½KÛ¯l?ïà2J:üÚ}=ŒHQŸÎý… &?‹—[¸°oÜã¤Àoidiàqß=¼vÂï½{Z˜É»n¾’¢™~Ÿ&¾Â¾`ã#úNòÊð°Ä¥½ý˜NІ%âKâË–¸Y—Ž>;`R¥øÊ.<âtá¿ >“‚+.ëèý Ù²÷øçÃŽßOKÓPÛ|ÀÏ`H-;^$/’Z \ê ïaBjøi²ð%›upn5^ ’´ptæ¤x ’¦Ì#™~î @!‘²¢K{ƒ+¯gk±ŒØ7aŸ„ø… ÉÅ¿JKÕTŸvŸþÛw§õ endstream endobj 3372 0 obj 5696 endobj 3375 0 obj << /Type /Page /Parent 2 0 R /Contents 3376 0 R /Resources 3378 0 R /Annots 3379 0 R /MediaBox [0 0 595 842] >> endobj 3378 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R >> /XObject << >> >> endobj 3379 0 obj [ ] endobj 3376 0 obj << /Length 3377 0 R /Filter /FlateDecode >> stream xœí]KÜÆ¾Ï¯à9€Fýâ  H+)@-CC Û ŒØÈƇüýÌ.9»Òp¾šå×5Åæ.-Ø+«E²ººÞ]·úòꟿWoo¾ü§ú:þ¼ù²sû¶vÃ?Õý¯7ßþAèöãï«¶««¯¿îÝçÝçÃïvÃ_nþrøÝÿªPýùðï/Õßþ~øÃÇ¿tÿ~ݵ¾=üü÷ÃϾõ‡ß¹ÇŸ÷þ¯Ý_ÿPývÿÆãçF`¾ÿÿ7¾ŽÉw÷`\øôÝî¸Mÿðë÷¯¿íÞ˜÷•èš.6•O1U¾O¡úïO»Ÿ8¾Þíûä}Û¤Öå|¨ ÷_ ¡«|èoŠÞO¾ôðKéýú/oëx½—ë£ÅÇÆ_x½âùÞR(êkw…#xz¿þËûºO×#žÈõÑ2žï™×žó ‹(†î„ßßîÞ~òÉõ•oªÛŸÐ ß|øq{@K]½¹—=M_ÝþXýÑ9Ÿ~¨nÙõû&ÔG/­Ä­„~þÛB˜ÿLrðmïà3‚÷hÅE¸ò BÝÀ•¸÷ã FÃÇùD¸|¦~ÇÁýPÏÀ“s¶ˆitÀÛÇÛK^›º.ƒ›¤L˘.ñÙc,2P3\‹©ÏCÄ+˜30ŸYáZÀ[;S¹@UÞ„2MXçƒu …ù„¿SãSÀ’89ÌYºÒãsÉÆsg•¡Yz×^ÅNcd¶’tuŽ®fpÀP9¤¤Mâo¿t‰_2//‰C“cãùC lV’s­óšx+@«ž¶ ¹,é¿I9ô_ÏǼð-$)AËL\HÀŽ%azPcžQ†€‰ñ@K„:üŒª iÔ†›º˜ÃM‹GŒ–¤ð;É(6\cê{i/†s:³Sl7ªr­¡>k gp`Éžõ:ySÙf‚ö†)ÿ\³'åx› Çé ~¹jåuàÖ¥AʶáZWçÜ¡mÃAN_^Ol6œÛl¸#¶9÷î+µá æM] !l–4æ}VÜw³™¤( Á”eDèŒ-Š&Bé¶™u× –^!b‘ø®DÐ㪲G"u„x£nŸˆ;cÝâh¼ÂÜ1Å÷†ÜTçÜý¼4ïÛ%ø„1½,oµm•Û<ª#§·9÷R¯Ç {i2À*?c”ÁŽ)gôY÷Eì þÙ·óäá+}Œe>ã—âý`;ß ¸ÆÅÜ­ ÎcÄt€ïãàŠÇâ:aªÂRGÔð™b ‡W07âý`%ðFœUîGC ¯cËl+e¯l>ÛUõtY³¼×ÏDb°%NE°Œ4¥‡>T‚\Rzœ*¤œyÝH±®Ü,8ÕÚž•Z—W¼õL- Þ©jtËÎÀ<ƒ)Ó(Þ)A!BäCõvRЮx§Föúòñ´"*¹ÚÐde`’à *ðÝ+Qmª…»œšeåûZ‚»™î)%[®–¼]N¶Ì:Ï~“¸©"dec¬’*Ìj@Ë8ád!ÀtÃ1`áL0½ݼ¨Ì-Ü W‡âý0Qœ£‰+ŠTÏ{BÇ9|>7éKÄÀ„š¦†B•z™L6ÆIø´qÕ?^ÁPCØjÓ0ZÁ8(Dz7ÖY‚„ÄuíXB·²‚…€57Ç0=Çn-9 Éåä(`ÝmþÞpŽaÝVúæ»]<á˜u§²ø ¿.?,ÕÇØ¦©4ïQÝz'!›G÷®é2EDa©n>Äw0×1þ€QÆóa<,¦VŽð.) W°Õ_zTíë‹§¥[·_ô­"Ó·Ž¡eÝN÷Ô³êwÆD%¶3%ÏÔªK“=†¡&V,ì9$ “tû¸éQݾëÝ<§ŠiÖJÄcwªuâ¾NM×ÖSüœy‰Ç(!íS>==à3 =ƒß†Ÿ9èÜwðN»S¤àÃmøw'/Á;í÷1tþ°ô´á3„~'Åù˜þð°Ç@Þ<2À[‡Û˜‚„gr’P‚P}ñZ¤*ð/|[V¼?ÒÁsÞ†9Ágì`@Ö‹)æat¤!·oZÿ=æ÷õÞõñ{&yß6(}ŽKYû™!JV°ßWTouˆ§ú 6†j0Ý2ª âpŽLÂzxBFøœ Nõ®Ã|aƒÝs€…¨V¶T ó0¥61Ń@FèÆçÛŒVad-–pºÃÀBñ3ƒxñŽWe‚ ŒŒi sA³§a51‘• ê·¾?Õoë´Ø0ÔøÀgèÄk“8Æ&qü <ÔŒos¢$ˆ?ÆÁóÊ©À¤ƒÅ2†@×8Ãû$ʘz˜0Æ{¶sØ™hKl‹ac«iÅ}«† Âqp®0Rm,A7Òu÷ã£ãyÆ%%ø„²^·œ€@9އUà¥ý\ñx}lNÎWE_ Úo–%[FáætÍ#?šY6Ì—÷p™· ž¶Õu}lŒ7îcµœ§„aDßfQeU=_à…ÎÄËgî¨gð9诖íO56>©øÕÄÆô‹O•Ð^/NPcŸïkc ³fB)ø^°C+5Ü~[ Âi y&&!“LÊÁÏàC˜(/&XIþ ѧ2е³¡e,ÏŒ++ù|eye7(⼦7èštª ÷xÎ]˜‘ÙÇDÃ&Ô"ØŽºi¬ùø ÂÕBÓ3T.á` Æ™Zêÿ…ØWŽUßǾf˜áŒœ'._u5ÀŒl0Æ»^·~Ým,ŸÔfuáÍä¥`«CÀXôŒ¡¦Tֽɟ‘€ùüÛ^e&Y,bñ(=õ6把!Âw£D¢W§»n)RÝu§È"úµ+×/½×ãÕ¯›¦>ÁÔ¨LjÅšÇI‹ÊžDu ®Å£¦¬azcêõ‰ýXMÍ«_ÂxÃP«öEN×&â ¸X·ÿpá«íã,Έû­vºl§ ZÍùd:~an`*»ÞR­•7“ŠL¯)H}¸C´™|aªn‰ÊVáL Ši³ë™É©/¨Nš³ª—Æ]wt§Ôêv¡(^;fMé4›L‚¥cåàý0\k¤CËèÓÝšÏz´ê3bEË–Ú¬ùƒÌ Õ ÕHâZòI—5Oñ¥ñ–ÔËwæ³äîné°CtÃQ Á¿b×*§ˆÌ€Îµ9±¡€½YHIÂÛˆ³§fI<5Sðš‰,—’w*ø0D¬þ‘;UÄ,§Îûœ©ÉÊ©Œ”'h ¿Íê¶zÁÔ,¨-²x]ëcVž‘×±¼~Æq[úpLŽáZ[ÂO¨ÆÑ «¹”LõAU…O¬ì|“×h¿Ñå@Š’ Ž¢1‘MÊÅV(^!rÍæ“bù„µ#‘ÍÉH;án‚© \œ®iW†l³2†ê¯¨{6UÙ00PG¦nÍ6>­„ƒ>ƒW ¿åê|oNÅÃp¾–pĤ\ÝzAkùL›o㎠?æinŒ7ìÁ3•‰8Çæ¥yJLî–ÑEØÁ_GÚQº–˜Æ(y‹éŸ¹-…Ô1õ©Jïq XpØ®_­¶a UVQŒDô;HØBÀo[>VÁd2”œ?m©’uíÇÆ3Úµ,o\ù¼/`e0™¸²€Ê#&²( ÁRr59™3V•X‚G…ù™éì³JK\Èw#büTVÛf½—b½wYU|›%²Yï¤õ^tµ ¡F.'«mãÀ²}’{m,ï ”l‰PþqGlÕf½>G 9„›ÏQ‚ÏQrNþæ”âÄdÝq³…$|EÞÈ*»s˜jáÆºßæÆ›†wwe+ 3ܨӞnþ÷ë±Ó^O•hñ¾Zgû¹N_ÍÒªN®ýLå×3sT˜8ˆU§š"85ù5ämQ: ÛYø1U‘Tæð*õ‘îùláýàóQ­£,WUJdꌘ¼ê„«b°$ºéQ¹ÿ„e$`”ÈÉߦ9‰;5Š%a-D»ÆUdx–•ò$<¦ë"³¯˜ÒK½P^ÍîÚœ,#SHûœl ÜÃ)2µ~[t«€H¯¥¨}Z€æëúÙWî‘ÅôD`æ2¶Ìý:Ó¡JuÒ+3Œ©?6›Iô=c:”l“±­'c[Ù»6²³=Æ»q¿óXÚ¹lº“¨…˜öä ÔËK!ÆcxÇ!tcrXƒ19]†·uŸå™®²·¶²w®:Í[¸eôbo\Ö}„®vÃs±LR;¤¼OUØLÏ>dEËŒÎ~ù<9Æêì1«9DEøÖMÊš¸xôdù†Æ–Ï+„úš¬èâ½K¦>³U†ôÒºœšÆÖ[¾¬è.q[ìwÀnCVìÅí$J^ªÞ½›²rªZewnF>áïà·x’ÆõKëè½ñWËhªYÒ•&z.îmy ›Äß$¾­Ä/™Š—ÄMÖL^#H9&²MÆ)!w ÏMü†þ¿ª»¡‹|ðùÒ_¸È(}Õc’èãÞùúaõØMeÌZª÷1tþôS™ÒîëÔtm=ÅBØÿ°0‘PÍteÌe û¦0ôtªiŸâÃ#ßœÝôñ¼Ï<3žÝ9Ø>;mGžVø¶~ÓHëÇ­O682ι׷p%¡mxü6øÌ˜tãgm½}"[–àîïžÆ¤ß oj àg0 ŒmҔج~D„K=ƒñÝÞF¸”L;ξ˜µ"$iaëÌN1 F‹tÉtð;‚…ÄX›p6¸òíœN–[÷£&GBrݨÎ.©²êóîÿÆ!=Ó endstream endobj 3377 0 obj 3842 endobj 3381 0 obj [159 /XYZ 32.2500000 326 0] endobj 3382 0 obj [159 /XYZ 31.5000000 327.500000 0] endobj 3380 0 obj << /Type /Page /Parent 2 0 R /Contents 3383 0 R /Resources 3385 0 R /Annots 3386 0 R /MediaBox [0 0 595 842] >> endobj 3385 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 3386 0 obj [ ] endobj 3383 0 obj << /Length 3384 0 R /Filter /FlateDecode >> stream xœí]YoìH~ï_ág¤éëZ¼IénAâ)º‘x@< ; hÄŒóÀßÇvg±û+»>Ÿ:¶;¾“§ËUgßëÿý=ûçoÙ‡Ïßþ“}ï¾þvÈU‘Ÿÿe§¯^ÿÂÖÇî笪‹ìû/‡Çìñp¸oÿûx8àÛç?·?ý/³ÙŸÚÿýœýõoí/ìþèô¿*Sµßÿýô½©LûSþüýôûþò»ì×ÓŠ—×u›yûÿ0…wusÚÆÈ«—cš§¯ß¾ÿzøp@Ü[\^WUï|fo³ÿþãðSû‚Ëòù±ñÆT¥¯ò9/ªlû¦v•"3¶iWjŠ|ð¦§/¡õåoŠÆ'[ü¼sy°Wš‘åµwÆU¶ð'\Ÿð\Ôµm®\÷oØJ_v`3>V^–O°xU4éÚ¹8T:ŒVOðÚ˜3Ъ2ÔžWO’ºNHLO;—ÊÝpñc]vÿàÏä«ëÌ™}{hRd?´¶êIÎ=ü˜ý>oùêÙÃχæXÚâ²Å±'yžØ*~5“Ã'%ÜýWsÄ®ñj_$w÷–…O>Ÿ»¦°€?÷À¤ªŽ¿>´Œ—œgܪÀx„°² ºÄð­Ñ¡há{|C`‹ òSä³â]cÎPÂO`˜Ó™“B:åZ×(r ofp ÃÁRñ.^›¼Þ¤4ä& ­ U««Ý2še4<Á”ÍDèŒÝ aaí¶Y“—3¸6`Ià'„ë0%)Ér¬M±f׎¤K w {žkG¼kÆFù¤È3¶˜Ã3ŒvÄRK+ˆ“€ÅŽ?cÞµrÃÛ€9^MÉÓY=ý{¯LÿºÄ4†u2ö1ñÞ áñg°ÄÆ”-WüžÜ+â¾tʸ¿¹˜ôt°FdäØgâpŠwðöD£Iš^{SÛÕpíÍE nŒÓoÍž“¥ª€Ýˆ}­ÅéZQÖ4í>V#Q²†ÉÀáÏ@<:hé©âÄjÃ÷Öly¹s*>ÔCTÏ3hZ²] ïžÁì…÷ã¬ûáI±¶h (QV¢á‹z5œ¾{ë–»7¢*ü,k–§kUYSÍ©7ؽ‰$8ife“wo"÷¸rë~Ñlö& †¨¢ŸaŒvöu÷3òU[ïÇÏØ+]G¥ƒÓÎMïÈVåÆî„¨*ÏÀµp‹Óµª¬)¶P ñ¾<S©ç³±§Ž5<ÖÖ¾êÌÃP^ªZìÍò~ÊÆÜ@T9ê>°\ÅÜMhQa¸ÉvnÀ:S\ÀÄiÁt®Â`N/°%¤/S!Lõ3`ëƒÈgª—±î‡vV …0± ‚®WÑíÑX³y»‹Eö¤:¶ÚYx÷Eñt~N~Qu§å¬nHLD¶+Ô"g8nÅp4>®ÝÅ€5†(Ž6ïJµà>aøç¨Š(\ ‰ëž0NqÄ?ar2˜F ¸Q˜#úøpL.Ð/þUQBÖÚ¹ÂýÉžìyÅNBÖ,Ÿ¹dúqf€ÉhiJœÓ÷KVÞÚ¸\=?¯$7¨Z›…O6j]2Y!?Dôï Çe1W&NËx„×$œí¥@&Vtòl¦DÖ^_>¿?šKÐÑvN†Ã6$^¨ª—­TÕÂ^=7ÍLüÁPÄ~,Wl¹ªòV©ž_÷»Ä¥ŠZ= ¿8UhUx­Ã>O„GøW«ò·ØSÁ8Áô‚ŸÈ΀„«jld­tQLÿ²ø±8úBxÓ¸› } &PË@Ì”¥^¦~ˆñG<Æöâõ6ZO0 V"½zÿ<–¸Ò KH"+ËÔAøGÔ4ñè¶R£à‹Y”Ë[w»¿wÆc•h†ïî»­ÃͬœÊâ~_~Xa.±MMi^—¨lEv`î(QÍP)ãòaŒ§@ì`íµÀEeFÏM匶™ÏÂBQª½¯™×ÍÈb†–eïù¢*Y0ŸO4t bYŸ?±liŸ ½ó6;:[›vC/à8;uõñtµÃi§}ö«ûÔsíOÏ”àÞ¯ª~yâá“2~5gz[‹Îu&âŠ)/îÜØkï1²ð3¼:±<þLG“מ@lxñ„q{Ö>îXø²®¦½'°†Á§Éà ¿¸ž¾<ƒ§ÁòJÌbÏOŒ¹àgÊj7ìÝôc@ºè*°£èB†ç˜CX ·$Ê#^±ªº¬.QD -æ Ó«ÐóÌ¢ž—©ÁYæªÀIÇf9êÐKS+ÓË g1nÒ« d„˜ó`뜘Ž3qs¦†K¶SÕ˜¿ ?8†Ct®S5ð8Š){O õâ||Rà÷àž0œ͵⾸@2Q(|(㽨·Î¼Ó¦Q±À}qÕ0/ˆò¶Sì!¯Ìs^p“º@‹Ï„k©ú_±þÀ»¶Øfü‰­FœºSäw ÍͰ£ÓG«çQLØŒ½ø«/›!œúAlQ87=¤C¾ ë‘â >þ ©”}ÏÄ8c õ$fK˜¨˜°*†9Þ,>:Þ2 `@K >ˆã«K…9#DIÌî1â¼$‹kÆúêç{X÷ØÍ» C'`•cl3“-‰ÕnmoL,JËgÇqM³~¹E˜éÒÀôÏTô3=X¦-^]´ülYªŸ€ŽìM,Ð!43WRŽ7GüÃÆ\ÒA]Q‹ÉeeÞf›¡Õ…M)Ê+cì>Y[ÔÖ1Þ,> ¶¨Eß@I¬Û„ë,DªDða,ƒ ChÅ ˜¢š=pu±ÛkŠñD’¬ÀU%DäbÂ’ÞA`onZÞ¹, |N®×Ê¢§Ø˜°Y@J‰F¨0àtUX„a®é²ˆ‚Å ¡ñÖ¾Äó=6…á"fn°„#ª{»ÜЕ“KäDÈÐ~³`ÉÍÔ“2 ˜(Ô ª¶›1–xS<¡Âk*ÛSxÌæÇˆl’õ•Äòˆ³—ðj­˜øq™5äဈàá€ÊÝ” Ñ0°:–wbú[’•¬”ž1 ‰Jý€l‡<`Vát5ãÔŽé`…ð«Æ·Éx}D¤*IH$¥âlz ¤¨ÇFãSF¸#,lWÎCØRb>Í$J0ÿ)@Œü•íǵÆ7£Qnú%}R•ÅdW˜Qq„vÇ”Ñ{FÅš˜#¢¾+ƱN܈m ¦”pŸ…Û>šDB)À®Ék™×}ãD¨gÂL£`XÒï\Êr–­=¥ì¥¦x™è•VyïÀü"ÂhJ0Žy˜ÄÃ-d9Q×LZr›~ cûyhû1æhzhÌP)ÞT„{ÁD¦‚dK)±5;òIê“BjE9 ŽÔÚUËí#S0[°7‰¡4Ö-”¶JÙ”}ÜS#J‰Ùã0²‚µUé5¤u¦Ïý‚@ÊF'¨G言¦RÜ@Ëü–N©º÷ë·2&2¸¼m0'—›xà¡L-vOÉ]¾®m^j÷D?c%3ɾ D:›‰&^Æ}B¡ý„Z³òe_kb+I,Eù²}µJÕd7§ ˆl³kªV„¨vd$ùpÎ’A¦¢?b†ìxÖ=Ý Ã•jIl‘¹ÕV™¥ ÃZ׬?ÊCUlÁVFc……lüWÖ%#i…pâË]=ŒÆ$ämÌpcÙv9l2¯&qyk*g±©=jÉÎéAÀ@^T¢jžÑîØM–펢%”|®®z¢/͈'*$µ|ÀsºEÆ4¼Ü¦Ï…ñ±d›!–ª ¹µ*‹m&‘—PÝt²%c[*6b7àÕ™õ×KiZíbNMro]’†Î§}¡‘=é8µ]%š±Ý”®OTM´ri5µ¯ó“{ÓÓ’Â-”L`šqþ¦Wø;‚"„ Sd±¶…§·† 䘋¢Fñ®¶b]¨v=µ¬ +«¨‚âö'ªs~Æi§™æ2®ìÆÝ°ôúž±Ø“T6ÙÍOH©³Û£ÎÅz4(drñ‰›Ãd;7mЍ©8ÂdÄ{“½3ÆP]1vb®Dm=’©}Vª©ZAºcóDã²ÅHeYõ4ç2Î)ç'9ß·$vU_Nж¢~ÆcYq‡Š–ž`ÜEÙ[wcÐ/Ú³ 2'Ð3…Ïõ²ët¡Óp}¿OÒÙëf äqFÛ^eÝ\; ÄX•é°Wš½&ÛwSqKÜ. £*DåËÂf§q—R„ÝîÌ_…W­y¯.23jÊ«2sH`²ö'䎘ûÕ—4¬ò&›ûé­@0‹F³WÍJL$lú5Š+‰†HëTnfȘ¸-ìEJà²î¥pGY[¢=·”ºÚ1¢QrF«j›…U Ú–)n¦ÃZLêI!ÄÅ)2ñÈá‹ô"<í±’”…×¹éé›LßÐê4’U/²AIæê€'A+X¨•Ñc’q³16 e³Ü1÷Ãbâ¨F˜^­~£«hªÝ6.ùd’)ý˜ ›´X;oúšUkè¬!jDõùÅQ791éYê*v ºy;ýÖlË$:¿ñt½ó›ÓúgŠ(Ü*;Ž Æ• °PöÒ@BŒòI¯µiúྱ˜~â0cLi1%{ôzãô‘Ï´õ%j—´¤k¢HwgûÒì} w× }%neÎd5°tÇŒ$2ôU´àEØ àåvÒh_'ÝÚj#&.7e_úÁb¦¨' ™Ï|„OêÔ$_6n²\\îÚÁåcŒý²¥a™c0^DÛAë¸i‡L/9¢q¶Çº·Òï¼x÷@ eqP¾¤•@c)F”e]­z†M^…!WU6>²ØÙËU‡ÛHÌ/›°_¤ñ-÷ÊûåÓöÊï~„ò)T^®è HEE)íó›ð`w9¦ Ç08J8 qŠ%ÏF5ª¢|ñÖŒòs€*J"˜ú îñ{0×n÷;ϬŸgŠfœg˜s‹®àMlÙ¬ÂóòÏSDµ<¯ƒvûçý¸îyÂè&U¹ñÜ÷³û¼yÈçUÔ¢…)g`KM3¶/Æ£ÅÓ –šØ*üzx‹À0EÀÇzœá:B² ë–UĺŠÊÍ ±5sjÀzØók°“6.;ƒgdå2 2ØÚ”•±«ÀViÌ lQòI@Âá÷`WëLH?(Ým ׎Qãc Ô½w4>‹*«Ü;ôÏ%O÷j;£bû>»?ü¨±÷ endstream endobj 3384 0 obj 4674 endobj 3388 0 obj [160 /XYZ 32.2500000 784.250000 0] endobj 3389 0 obj [160 /XYZ 32.2500000 497.750000 0] endobj 3390 0 obj [160 /XYZ 31.5000000 785 0] endobj 3391 0 obj [160 /XYZ 31.5000000 498.500000 0] endobj 3392 0 obj [160 /XYZ 31.5000000 163.250000 0] endobj 3393 0 obj [160 /XYZ 31.5000000 163.250000 0] endobj 3394 0 obj << /Type /Annot /Subtype /Link /Rect [60 127.250000 138 134 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Doxygen_translation_overview >> endobj 3395 0 obj << /Type /Annot /Subtype /Link /Rect [60 119.750000 93.7500000 126.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Doxygen_file_preparation >> endobj 3396 0 obj << /Type /Annot /Subtype /Link /Rect [87 113 164.250000 119.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Doxygen_running_swig >> endobj 3397 0 obj << /Type /Annot /Subtype /Link /Rect [87 105.500000 184.500000 112.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Doxygen_features >> endobj 3398 0 obj << /Type /Annot /Subtype /Link /Rect [114 98.7500000 168 105.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Doxygen_notranslate >> endobj 3399 0 obj << /Type /Annot /Subtype /Link /Rect [114 91.2500000 202.500000 98 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Doxygen_alias >> endobj 3400 0 obj << /Type /Annot /Subtype /Link /Rect [114 84.5000000 207 91.2500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Doxygen_ignore >> endobj 3401 0 obj << /Type /Annot /Subtype /Link /Rect [114 77 177 83.7500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Doxygen_nolinktranslate >> endobj 3402 0 obj << /Type /Annot /Subtype /Link /Rect [114 70.2500000 176.250000 77 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Doxygen_nostripparams >> endobj 3403 0 obj << /Type /Annot /Subtype /Link /Rect [87 62.7500000 173.250000 69.5000000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Doxygen_additional_options >> endobj 3387 0 obj << /Type /Page /Parent 2 0 R /Contents 3404 0 R /Resources 3406 0 R /Annots 3407 0 R /MediaBox [0 0 595 842] >> endobj 3406 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F8 8 0 R /F9 9 0 R /F1409 1409 0 R >> /XObject << >> >> endobj 3407 0 obj [ 3394 0 R 3395 0 R 3396 0 R 3397 0 R 3398 0 R 3399 0 R 3400 0 R 3401 0 R 3402 0 R 3403 0 R ] endobj 3404 0 obj << /Length 3405 0 R /Filter /FlateDecode >> stream xœí]ËŽäÊqÝ÷WÔZÀ­Ë|ð¦çaÀ ƒÀ Á c$ùBÐ<Ò¿oV‘¬®Jòd1OEf’ÕÔHši²™ÏȈÈxœøõß¾ý÷áþyøõã·ÿ=üþþøí¥8ÖeÑÿçpúóËõ݇ê¦<üøýåçáçË×—¯Ýÿÿ|é?øöñ?ºýßAþ½ûß_ü¯îំ_:ýÂï/µª»¿ÿvþ»­U÷¯âò÷éùo/ÿù‡ÃßO-ŽÝ ƒ¹ýùU–¦*NøÓõÏ—qšêüçŸ?þþòk¿a½UÔº8(kìAµVþñç—¿tŒÍǦþÿMvÞœ;/»~­j3=·V©º²uñÈk}ê¦1]ºí6ÜÖ“ŽÎdšWòwkTGk¼¹øª(S)ë‚›«tÝ dL„õk>BãVñ?\|U†Íõ´—g¨²cñy†ªªáÜ颰9—æcì|S—ñ?\|UF²Â­KnnÛÑ`¿¹º‰°D—æ#¬¿V­‰·¹ç‘‹¯Ê¸¹¸õîËîmQ7þûž¡MYAž‘¨çénEï¹ÎÖóy›v«¬.gzþÒ;̾ٓ®®¯uu}°‡©¾þÐ1:/®5u×Átq:ŸVÛ™¶3,_ñ¶|zX>UôCk×mº{Õ·ì™) kÏܶW´gÝÐìáz vC{åœÍÃ:6¬í§ÜvûÕŽƒÜÆfÞõÎØ óú]~Š¿qxaß>1Zùvûõû˯_:Ý̾ÿ¥ßýžÿúÞML~9YŠlyøþ§Ã¿…úð¯‡ïítÊ£éö¼<¯wÿFWèMQŸßTǪ¬tY\ÓÂoZôjúoê£ÑêÞ½µÖ÷£ì±P篼ÁýŽŽ¿)>#š{{óåNkŸ¿w4ÿØö¶UÍm¯-úímåPå±h |>¿)ÇU¿¦>¿iŽM[ÜNM™ð7Ey~cŽ¥­š92šk­‚­}<¿±Ç~i¯ßÀot¿Á­ Û«Æa_Þ˜×ó›vÜÝ%op?J]ˆÅ!þïüÆpÝ`k˜ð¨ñŠ*<¸ÛÃÁlÞX¸-˜˜0ÉàŽ·cLpHË›Û'¼æx‚˜Rpk“õ›< N´ðñ7¯Î`=`R…t[ÇeHsTFLÐÃæð²ñØiDùVWÀ1Ô‚Å ³#žuÇœ®å<Ésvñ†ãÁN:Î6¯ýq:‹ËöÑ„yÅo9‰ªO᫤û}RűªÕ­f§“¨G"Äb³ …„’^˜RX VÛ!ý©ñ½`9x†tïQHªÂXGJRJ*>»6‘æÄÐ8&µm_¤ž8Â.V‚;-; qe H溨27½é¥=öžëCÝ 7[ž{óQô›ðM#èÆ¸†!Liðt{Ž£pJ\û'·G¼"”S›V»V¾8P|û_£D9™ç¢9¦¸Í‰ïê1œjœ•³”èbô'ÂÐÇÜ Bt®É%„1W‹Rtˆºà²CÏ:(ÍÊAC€7gš²üvêéŸvH÷úËûÔ¬ª„Õ#¬¶ ÷ô¹7ŒJõéN?1ecc]á¸ë@ ebYºôh¡vEqaƆñÁeº„×Í#fåÄ~NÀê²ßŠÊ>ÃÍiŽX8ƒÞè¾ß8<‚AbÌÍGI®›g5ñ&¾)à¸s–xcàßh }Ÿ–±²g‡y sÒEwØÓÏk•×êVu˜;[pŠÃ»wس÷6áŠØû;äÙ;LqxvXRA‰÷ÄsàžPóÁ#€3U„œæj˜ÊW,EeµFÇ(ð؈7X¾L;ÄiôÌórøÆÓ\k|ÝÅg›’MO¦Uãxø–Sxbf‚’¥lÇñ@³ER­«­7 u)¨óc…1a½ÚC¥+Ö™Þ•«ŠÓÛÕïIB=Vuۼ뱻»ë±·­ízì®Çîzìc’¥¼Xùóê±}tJ7 ‹^½e¯CÔð‘ÚY)&ZÞã}š¸ú‰ˆD[Ëxï¦^úåáž‘Ñ0L\ÂÔ+’ކÁ8·ey ŠÝ¯î詨vœ™ƒ#v˜ &5/×¢¤ cúA[1ã8ªÆeŽxgdÃv˜ØƒT‰ÄL2>m­S¡8«.UÚø“qî=ƒyÉBŸ==ùéh‡˜·èQ÷J]@UF Õ8Ó‘ò²™Y²Ä„Æhp¢GÊ“9Àg4ˆ‘$!xOš9z]&½B4k‘:ó“pf,mpŠÄò˜è€bÊ”Z»B% •ƒÐD<«zšÈZäÙx†¯‰Â0xÂÁñ†1ç„ÈgŒšA̺yvïì½{KÙ×n!L<¸&Œ© ~ o²etÉ®fûa¬„Ó5gº¨Â’‰.Y[Õº’ó>LX‰4kÊ339x‚Xôá ÏJà Ê ž];—%SäiKÙõŸ±1å‚¡Læ b ëÀÈŽ[»,¾ÏÝ/©œQîj˜Œ–ÔTby—td.Ñ“2N¼O!@;Ü É—ÝÐí!o†5Ê&¼2¡™FØ W’Ì(§õ¾!»f-• þNšŸ,®ÅhD²î5ßnSa$ã ƒ¡<ËœO¾†zöòP•ÈÀ…ÞGxKøiÚ÷5ÖÑñ7 }cKtö’¡¼êr¬Â†Œ/.ö}sF!`8ëòhjªùT×7w²Ø§e®~AlÜ'}LÈ‹ F0$`^II…”®•C•Ç¢5·¤]ÿ½Ú§ôq¹ÚÇX³š˜2ÐŒ0À_$®SQ„Iä hEí’ãÆàcj[¹3x?F,þ6—¬5ár¢æt›¬š²qfÀ„hé rã§ Um•rWêýb‰¤Rˆ²‰ÃÄF·¸lJÍDüÉVôîèÆîÊ¿»W‰È‹ªŒËüÅJÃzÊ‹šÐEr SçK¤Z©(j ua[ iLÊ2Åäp`^ûÁÙWª‚ (t†ýœâRÒCZvÿÙ(,ƒ¬`iiOoÌàÝGÃ~0Ã#ÀÅî-.ª G­ñí ßåð7xEaÉir”aƒ áŒãlø¢™tž Ѭ”Wµ­qå>‡îe¼‰+Ž·¦¼…ÌÖ/UeÕØì?r87‘—ª6n²tÙlâåð)²qÉRÒˆœWêȠ+Q=܈'F$0*~dAe R>"+VI ×ã×ßÑ òdyì ï‘“ÅQeNøh‡„©‘ýÎdL0¿qp×=®–ÀúXÎd <3ì^OÄ–8 Q,Ýu§ _]MŒ - G a‰Ò6w€ÜŒê„\^esÐv>í|’ÊâââþpÙ;{›2ÆOß ¨ŽCœÔÕ7°µ!Hdæ›Áå¨jn4ója?á›áÙ£Þ…[ó¼c=R3ý‰TY^Ê{3²¢ q2j¯Gì%ÊŠ ”õ\òÈÆ! ê…±v`þH„ï§A© }ØÀ=GË>ŒyÍ`“æJ…® EÜÔ÷²¨1“d'2qÛxh+ˆ.‘õÝÊ]LÄŸE.“LÌ Ð‘e6rM™[u¶ VLó[žD"²E Vˆ ¢CðéQë}[µX’ ÃO2u™èH¦â³L±8ÂbØO•_(×ÄÜ*eå¿„’MEùmD™¢qÍR0yÅÀT*A4">ÉxW©íý#&[öCÂä;Ö\’xž®6ä©BZ3Þ/ó¸|ê·H…uá@ Ð~bLœ¸Iû¿›5¸ÛÑ::wCξUâQKì¦ 12ðÅ4ZÖÚ‘;J>,â!=Æ;ç®ÿóç³Äx,'ÎmÖ\‘E?¤y ý/Ã×Dnà·D€: ÜEÔ-$Swà:5<©6þí¶ºy ™˜Ñ5cu¦²K1ö‚»U8B4­Õ+¦¶+dR‹Vèæ ¹ c¶†éc¹]‰Ê_ÌnNvo%X}Ä3õ¬>Èñó£K刎M!Ý…œûMâ"PV•‹!CBdVwŒkA hƒ˜{âó„Ï-æwsi8j‚ó)Dù*5sn=£&ñêx(îg¸Fêà]X¿««gæwm™ß5ÆÜ* aï¦2H™žy1æ‘ žAõàóDh=Ô ~ÇHfumÑ£»M­ž#Ãð.ì²EX¶0#`Z£îaXf” ¹w9VöÜΉU\3'öh«‰xôš9±G—£V4~”O[Ô·ƒQűªÕÒÀ ‰´ì¡â5ã`-Ö‰´¼ ²pܸ€ ?OÌ Q$ZP„Â!H 6»-YØó¦oe}‹’ Ì%£—Qk²cp1& FåJ…”¬@BkÇ\œ áqù«¬»¨²– ìuÙf5ð€:|‘áù™òà+Ž]b zdÖ<®¾IÅÒÊâ÷4;ñ.Ê/e,ùXøÚJìã7/€2’ËVãäýcšXëÆZ±ÁÅ/š¡îdc;DìÛ 817þ. sÚöÏSÖpržl:‘~©q’eßàùÀ”5‹ûÁ‰™0YÝo†~RP…îNÅ8ž`ä=Œl2;!¼‡.L}w<›…÷ÐEy¹Û§ƒ÷ÐE=‚Š`䑘3ã5½'ÑÒÌ»µ»ì] {”AŽ­dFùüÚåµR#@Î.¯}£Þåµ—£<¡¼VfY»ìU¥Ê {U}Ù¯'’½~¿ÖzT8¨Âk¢6°€ht*`@$©VÔp䱑0V`ÆöîÔ£Ç%S®’åE¨æe£D £VÃíðKÈÆÃ3I—L@)òSRXåˆ *ßpåà²VÉöŠÙÅwSvl!Į䮯„¿ ¨œûô±¾¯Mv„JX-Ï¶ó ‰¨@¯qࣈdJ8úó×­ÝZѹvr÷¢ªÄ\gˆãB‘Y"ð ‰þù¶Rá 1±TW´˜/…°BDd3ÙÔ…1Uˆ`Ü(ÙˆTñ­QpnX묽Nd‘Q×’®5J9«ëáL®wªjv‚Y¶l+F‡îIA•Ç¢5·$‡ÁÔz £ôøŠQ4"§ü‡¤W1én#ËÓw<ºä&5*Æp” ¿D‰¹§î1þzŒM4-qî·Ä¼R¹\ÞñEwºƒYÊLRDvœÆ*fFKY;Â1?`f2wM*ëèEAÄ]ã‰Èž7KµÆl˜(殬Œa˜”7•ññ?©ÇrµˆÜ /OÔ4@k(·Â{Ñ¢Ú¿JëRÙ{€,÷õ¨]Dž÷£tuôˆ}.q2ǺÓxοÐ&ò“Þ‘-Iw—µ&°„µc>& Q) ŠõmJ²~ÙëZ08EDjÕJ»ä 7bª–0ë2¡l—…½Šù!u–³êU;÷1ã'‚Ê£<£’ÄN-`Œ 3¤C6ÔX€šB­d‚‹–—²¤ðºS•(x*cVDYXÕÖ•…»™l f2 +.—ÿ‡TùÆD%Z ðYWI!8ŸÈHtE¹ ¶\LýÛk.Ô¿Üõ<¢bÊV®”ÜoùE0q0β»"þÌöÓ:¢â›ýŒº_ÝÖ3µ€`¬»ké5"S$2)!\ åµ,0¦©µQ‹xæ*«2ŽÛª¢ŽüÇ/¤LQvJ‘µõ˾Žä”p£‡Ô’‹|“‚ËF~‘‚jrG8±)‰FQDÕÆ¸"*@×"V,±Û‘ ‘ÉdO„Sû"º¥À;‚î ba‰ÄÐÂ%“Æ„¿`IÃæqí¶òIäù' O`^ ¥¤Bþ(qâ)ÃN ì’N6šV6s2¡S# d[!m?$Á—)ºv'žUÍK`24‰JÞ­PÙbD›°Ç$nqÙ5ëXŠhB,$eD­ÁÝ\Ì(¡=9‘)•ÊdŠŸ‰à¯/W)ÝW™>n8ÀHOŘ&ªÈJ•àµmÓ[ÿl•œíFc£€euÆã s?‹›ÖJ)žŒé“ñ|!ÃL-s+±dÜHE »Ò‚gÄO ÈX$\²ÂYCŒíP¶B*ƒÔÝÆDa´<,߈ ¦0 šÖpLtÆÄüçš¾äPۚé¦Òt*½Ó—|‡Þ?¢êcÝÞžA=™ySàãܳR­Ž¦ßs—´LqÔýQOî!i;¾Z0‚¥ÍŒzØÕNÕáÏèg¦ýºisT=~ä„ì§­8¶1Õæ uñ%|¦žu³pu>^ŽqiælºakÝÂoðÑÇý¼yY\¦*¸?èϧ¯·s©¦ç²Ö‡Óñªªã©Ëß/?×Ǧ)uqú«VªéŸ¶‡ª=ž™f÷ËÓ/UsTªÕM£.¿U_·2þÔ÷Ñýþðsyúìà~m'}Øîw$ö0Ž´oåv?^~{yýÃÍš¨Éš¨e¼J-g»Mvnkí|"ưt¢îQðݲUÚ‹Êr³ÖF‹Úã-•ˆ´ )EpÏÄr‘× ñ…Ž”Ï”l¾ [}ýào/ßä8MyËqšjŽã4Ë º'Žsú­úº•ñ§ò–ã4vŽã4fÒ‡™rœîÙ8R{Íq.}då8íXåQ›‹€qÝøÌÍ9‘û%WŽÅ=òoõ@¤ª.¯œÈßKäÊž( ;60>(Ϫ¬¨«ZwOÔ@ƒã“ÝGÅ@©—ßêôúëfÆí@„—æL£nzÒ>ws;˜ÓoÙÛfìm7¿9Ç?©«²:Óz©\Õl†Ö °d*<6Å®GlZ¸ÏpNÔ}&n50 S™ë‹9Ž6Ç9ÝF§GW.+èžL8Îé·Ž263þhŽ£õÇÑjÒšrœóoÙÛfìm7Y9Žn7tq¥GĮǕ^8iG£ö{ÔjqÇL¦Aªš#ع´0#ˆÈ ¹ì,UÇFîhйYU_?xà:¢d‹CÙýùÇŸ_^“3­{+giò­†ÑØÏ8°ˆ&ðe¶¥$è…$}Úóó–·£Àï/”ã’.ÛtU?ISEVïò43©ìiG×…3uêˆÐhÙÊÔTÉ"Ó¶g¶jF1TÙëg¶nVpf›Q18³Lª %ºUk?Öë;ÖM=뺺~ p¬Û:ÿ±®Šò9Ž5qDeMxÓ  ÷©¼VÅè66muýàñSu´œÿÄhûnOL@ÒÉJjJ–ò³Ô,1]^޽~°Ôh[™úÖh[™fÆh[Ù±¦žž¸FÛóoõFÙK3ãõ­Ñ¶2ՌѶ2¥ÛM÷Ä5Úö¿eo›±·Ýä4ÚVÖŒÇgTàDÆâ– ¡†¹ŠJ€IæW*eÑÍ¡~̽hú¹±}f:È3û6¤V SŸLp8¬XïÁ.é™i(Üüf8*hêWža–àNÿîF<Žç”á$ ïÐÏ­Ã'DæuhmŠ„ßxúÁ¤qjòS˜‡ŽšÇ÷ª.Ìq8çoÚ• ºË̾¾¾ü?çér$ endstream endobj 3405 0 obj 7474 endobj 3409 0 obj [161 /XYZ 32.2500000 578.750000 0] endobj 3410 0 obj [161 /XYZ 31.5000000 629 0] endobj 3411 0 obj [161 /XYZ 32.2500000 628.250000 0] endobj 3412 0 obj [161 /XYZ 31.5000000 580.250000 0] endobj 3413 0 obj << /Type /Annot /Subtype /Link /Rect [60 778.250000 114 785 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Doxygen_to_javadoc >> endobj 3414 0 obj << /Type /Annot /Subtype /Link /Rect [87 771.500000 125.250000 778.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Doxygen_basic_example >> endobj 3415 0 obj << /Type /Annot /Subtype /Link /Rect [87 764 122.250000 770.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Doxygen_javadoc_tags >> endobj 3416 0 obj << /Type /Annot /Subtype /Link /Rect [87 757.250000 134.250000 764 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Doxygen_unsupported_tags >> endobj 3417 0 obj << /Type /Annot /Subtype /Link /Rect [87 749.750000 125.250000 756.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Doxygen_further_details >> endobj 3418 0 obj << /Type /Annot /Subtype /Link /Rect [60 743 108 749.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Doxygen_to_pydoc >> endobj 3419 0 obj << /Type /Annot /Subtype /Link /Rect [87 735.500000 125.250000 742.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Doxygen_python_basic_example >> endobj 3420 0 obj << /Type /Annot /Subtype /Link /Rect [87 728.750000 129.750000 735.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Doxygen_pydoc_tags >> endobj 3421 0 obj << /Type /Annot /Subtype /Link /Rect [87 721.250000 134.250000 728 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Doxygen_python_unsupported_tags >> endobj 3422 0 obj << /Type /Annot /Subtype /Link /Rect [87 714.500000 125.250000 721.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Doxygen_python_further_details >> endobj 3423 0 obj << /Type /Annot /Subtype /Link /Rect [60 707 102.750000 713.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Doxygen_troubleshooting >> endobj 3424 0 obj << /Type /Annot /Subtype /Link /Rect [87 700.250000 183.750000 707 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23troubleshooting_ifndef >> endobj 3425 0 obj << /Type /Annot /Subtype /Link /Rect [60 692.750000 118.500000 699.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Doxygen_developer_details >> endobj 3426 0 obj << /Type /Annot /Subtype /Link /Rect [87 686 156 692.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Doxygen_translator_design >> endobj 3427 0 obj << /Type /Annot /Subtype /Link /Rect [87 678.500000 208.500000 685.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Doxygen_debugging_commands >> endobj 3428 0 obj << /Type /Annot /Subtype /Link /Rect [87 671.750000 101.250000 678.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Doxygen_tests >> endobj 3429 0 obj << /Type /Annot /Subtype /Link /Rect [60 664.250000 137.250000 671 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Doxygen_language_extension >> endobj 3430 0 obj << /Type /Annot /Subtype /Link /Rect [365.250000 602 388.500000 608.750000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.doxygen.nl/manual/) >> >> endobj 3431 0 obj << /Type /Annot /Subtype /Link /Rect [219.750000 587.750000 285.750000 594.500000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://developers.google.com/open-source/gsoc/2008/) >> >> endobj 3432 0 obj << /Type /Annot /Subtype /Link /Rect [337.500000 552.500000 363 559.250000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.doxygen.nl/manual/) >> >> endobj 3433 0 obj << /Type /Annot /Subtype /Link /Rect [363 538.250000 423 545 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.doxygen.nl/manual/docblocks.html) >> >> endobj 3434 0 obj << /Type /Annot /Subtype /Link /Rect [241.500000 518 301.500000 524.750000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.doxygen.nl/manual/docblocks.html) >> >> endobj 3408 0 obj << /Type /Page /Parent 2 0 R /Contents 3435 0 R /Resources 3437 0 R /Annots 3438 0 R /MediaBox [0 0 595 842] >> endobj 3437 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F1409 1409 0 R /F1700 1700 0 R >> /XObject << >> >> endobj 3438 0 obj [ 3413 0 R 3414 0 R 3415 0 R 3416 0 R 3417 0 R 3418 0 R 3419 0 R 3420 0 R 3421 0 R 3422 0 R 3423 0 R 3424 0 R 3425 0 R 3426 0 R 3427 0 R 3428 0 R 3429 0 R 3430 0 R 3431 0 R 3432 0 R 3433 0 R 3434 0 R ] endobj 3435 0 obj << /Length 3436 0 R /Filter /FlateDecode >> stream xœí]K¯ä¸uÞß_QkS#>$’@``ú ‹n #‹ {`¸t¼ÈߤJ¢ôQÒ©#ªT]}1s¯(‰¤Èó~ñ×ýò_—¿þóòëû/ÿsùæ¿ÿòV\MYtÿ.ÍÏ/Ãi¯þååÛ÷·—oŸß>×ÿÿñÖ½ðåý¿×ýßE^þ­þïo—?ýgÝøgÿPóÀ÷7#LýûïíogDýWÑÿnÚû?\þÑô†ó“_ÿ"ÊJ)ÑLcaèoá3EûóÏoÿxûµ[€m£(!«J^„Vú"œ–—ÿýï·¿4ßF›¬NV^ôe:áîaâ„m3a­L=@?U–Ž…–z¦ï;–¡¸-ƒôË Šn{hkù’y UQ¨½Ö0î{‡5¬‡Ð—á€ú€5Üç6‡w]7uW¯Ÿ ƒå]<€k'‚A-ËÛ*ú+âB^måÿÁ¿ï%!â.ìÌ2ïnÃ+‚O£Vù‡ «1Gªs¤žÃœ‰Fn½F>üæ)¡›p©"Ì‘rsdl_hZ&˜Ó>¥ÇÝèñ0‡bŽt/Åÿ|Š¿UÁƒáÿа—´ŒpI«9\šhäÖkä#Thžò¸º —2Â¥º³\Ò±}¡i™àRû”w£ÇÊKÚ¾ÿ»$‡âoµë8;l¸[ñ·ÕØio«9§½(å¶š:ḭ́ۧ—p5vÚÛjÎioËØ¸Ð´ÄŠÓf:tÚ߯8Rñ·UpÚ+ˆM XÆ&ˆ 3¯%õa oL +æ øæsXSƒŒÜs¦µ ¿­zŒsÆÕìÇFøpçØÏD·vêoŸòìÅŽ<ða˜û1sxkb»BÓ2a?¦÷ÀߺÑãae?¶÷ÀC%ˆ‚0¼hµ÷„µë=M1¬S˜&–ö&zFLŒd˜‹>#ñenxÃð&¿ßÈymp6)¥‡ jðãF3Ð76ì$ÅÐD‘`Hj9}÷—÷+ÚžïoZ”ñ~Ý')97’”\QÌHJ®‘ãZÛÔXÖiŸ2Ã^¼däÜXRrvNRr&–”œ™JJu[˜¹JJÎ=€¤äŠŽ’p‘¬KI<ŠIF"Œ*¬* Eê‘–lõš3ÞarñhÞIqõëAÒŰa­çD‰ãÄ\$Ž›XÊœœFâ´OuRZßM¸Œ"qœ˜‹Äq"¶û5-±×=¥ÇÝèñ0GJqNêed>·¿ó©ÌßûÛQÖ{â{»–2xQÍÉàUZ V“95Xä&†?§§EíSõC7á2 ,rj.°È©ØŒÙ´LHƒê‹nÝèñ0‡’­–I„£„‡ï`BƒAn~`"0$«(çÔd8áv¡ˆ_ZD—áÖÓ"æªóu„†ÕÆz 1ÆQX¯[鹨æ %t¼Ùµj‹¹Ý_äDeq¢ÒÌq¢ÒÅ,¢5™GŒ¤yÊsšÐM¸¬"NT–sœ¨Ô“aô”µOéq7z<Ì¡œ¨ Ay Ûü‰ÃÑF玫úWî6Y8SŽM¦š3Y›,ZKrd²hž2Ã^ÂU92Y8£gLΨÉjb²hÚÂLõÀdqãP“… Ái¢cÖsÁi1¥¸ö™­±™$JH(ÅU”ÍLa.„µNH²” Œ% ¶ÚÐbû˜AW ÖR¥E ,Öc`­KýÒÔMRÁ"ŽIx<0ŠLˆûz§ /±}ؾH!‡)õ·ž \{¬âm™ Þ/Huá‰xy-œƒÃo°·Îî,d¸ÕßÑ•ÿÀâà:Uhv}²š¨Ÿ_ïÈźÏcè™Ô¬Äż„Ç»ŠC(˰¤\¬¡&4L„úñš 0ÏÜ+§Åk ¸#XúrÙx(R7©X«˜“@JÔ&‹@ «>ÖÈñ¦ð ‚ òl*Üv!sGFê:³È‘bΚ°÷µMZŸR•€€L‚AæxmçÉðP|ØN‹ŠHú&¥Wà;¼Pwn¢¬|x“9~¸JG{ê5^­)Ë{P‹">Nöêfߎû!Tmȹ¬;ð÷d‘aQí¥‰(›YTÑ®©(z÷o=wÕc#žýgîxð¯®Þt<øØ›7μã…ÂLù»7êkl£VÎú¼S Þ‚]gúŽÀïÀïñòйÖò]Ô[‡3Õ6Í øÐfÞ©àÜð8xÖ îÜŸÅuÛÄU!#OÀ†W pqo‰5„ãH‘‰ã‰>ƒ•äú颫(™‰ç²šóê.XÛY$oº&AäN˜Äw¢QlV‰µÆÒæzs ò9j 1;·Xuó© Æ›CÞÙMY3ä1¿Iý n”©¢óÈi”„äÏ-Þ(£\1j;i¥,>%¥”ŽÌê~N|)Æ0§´e*Àó’½v`ÙE‹XÄé +ÂÿÚêõ7„tç&pzÐpDü_3…ha3E1S“\tæç i¡TÕ!”õ qKlÍ¥p¾W´ÃÞÑ/—ð])üû™úúòZÏæQæµ?‘¼ÃQɤš@¬œïøØcf[ó+ðêÐóðÁd¾Ù9;çÆú=-”RElò°È›g1t<‡ üpqP{y^οôt²ËánÃ}ÿT0KÚlºwψºB–±øÈü~šB¤¬ О ÏãÌæ`úÌþˆ;²Á)™u ‘…@HùÔ¹â.XU}’@·Ô[#V_Ö7›¬ÊZ €Ù‹J Н8¿œlWŠ2‚ÛWáîÜGŽ ¤Tù`.½È4³Å¬±¾ ©Ta&#ù–#鎵CB0Ê"r+žõFÂ& [4/úAÝ™âW$yóFnn² SçêC3˶ža A¡pÕ–A쎀i¦5¡|*)H‚’p6aܬÛrJìQo b ¾#?,ÈôûçJêÎ3ç~€ïà¼9Ïfª[ Ì´JdMù ·™œ4œûFÉËË”/'Øòå´jiú3A±vB "ÄÿÉØêL²¼`;Ά‚Ö¹8u.©âŸÞ;š+ <þŒ©Æ¶¡:3E \P;¦s¤]ã-íù ^|,ÓZÙô6`^ç"p9[øÔòºCxËfSÔ(‘‚沟.㘬#ïP‘8.b%ç#ÉæP„zËÃé»Ö©aÃæ˜f Ñ’?ƒéô÷ž{ÞDf/<…Ql°ñçR{X¹çq6…ñÖ;><°îg©¸¼k¸ÒFLd—¾ ¶7gQ„hº´E:}•´fNI¢œ…ÂÌHX{#¦Î[†‘#ˆT]PX&_YIA‰“Ã7äåªBIíà47djå *ÜŸyk'cÖw8UxSå¨åˆèÍv°/gÚÊ¡5¤£HžÄ]xÎàöõŠÉŸ7ÙAH$)áJ[Œ?¹r@Në_¼z8t CM¸F×WB¤hl””¹lç4m©N*;RÔ)Rׂbw#ø÷™YÖ†T´\S"¨½Ù¢ycçY bg²:íâeÙõhDó*ˆ²$ú‚)¯vÆrÅSÂë<ãM69•¸¾~µ†²8!´uïš™²jûÄZ§/ÛAh7¡¬áÎD†9†²·“Én¨½Ìkãå‰{Ìz×Úç*VInºõP©KH#²©¾F„Ù=ûY:$u9—ÅÊr”˜sÑÖŸM–ðGnP_)&7ÞR[§¶;œK˜ä+¦K}؉›:YV KR.kÃõZöáa¥à GÂðI,;´üråbÖýr/ƒ®E\µ‡q+#C-âÊ÷é>;Ù íäSz¨£ýþf¤‹W8·ƒº™BD;–¤ñm®KìIÊ”ÂÍ KìÀ¼9êú#º€ÐЕ÷ÒRi‘»¶“-žY¸“g¦ZñsÓLñ;¥@wüÞÍÜQvû;ÎÍûç¾ÇmÿžÏMÂq~ƒï|‚3¨¶Ï ^¯¥oº“˜auÞS¼ pn)\k<·¯(î C\¿¢y0½’w`º§cyfjÅxÔM3-U¾™6üeê©!nh<Î{¸w/Úõ¢]§¦]¥pwàYNÚU*;õa%¿²4‹kª!MÁp)G7 |÷†qJ¥Ú•daoøK±ô‹çF¡Cxn :W4±:x 0…"ì\BÎçýLŒƒWóq wÃTï„*Ê÷P(v‰gm3RHSÝñ Y¹Ž+¹åþnoååÂVi3! ï!=›¼›b+±l!Ãw¼Ž·M§"È2‰=a•10Í'Y¤^øÓcàB¸NUõG°ùtM¹ÌïôVU8å¡i‰:8$fCIÖ¢\qP¨°Ú7Ä[«˜Pʇ÷è8gªµsª@!õ~àa†ç Ë],4ƒ7D~ Y ¡Ü3ØÇW?¹±@ÎáÙÔ〹kÍÝK›s”¶„wº«®²eø«îÒz çˆrÍm©¢×þs#ÜYœÛžu~´‰¡…ž¾°/`WUÉØøÎðì¹ N¬Þ†ãÓg™a¤¤ðP*%eÊQÚR«‰^`vG`´JÅÜú»!¦Ë[g/³úl¤a *m(ýK)›ÆÈzfÌy7 |Î q[§‘”ðfl~\´f°’Z»8Jº‰R 3¬6PlRÓ)m3o&5ž‚åˆ(³Îf&å=ÖœB“^YÇK<©ƒŠ|³œËÀ{îæ‹mÙDåýÍ¥¢Œyá†Ó]XK—‘ÔÿÃO¹e® ´»1ÊâEÉuTø$kkªXÀÊä{c®ÑtxñXÞò@O_V–Tïƒ#Bbçƒ]8O+XU—€¢ÏÀî€Dá«êݸdbG8ªúŸ ƒ¶ØÆOã‹B‹X2ÊäŒ=é¶€hˆ†RL 7êñRZðyÎ;»‰©bZ«Jš‘!ÛþTGÈ0k¸DAÒbñÈæªfþˆE¾÷=`‹ný¯ÄxO’ÈtD<6-mÎÏtªïñÈ{—¦Ýpæá6:âU Ó<ÁVGQG(4ðÊtòºœYl‚ÿvM›ÉÑDÑI…“*pýЕYË铌íqö I"-´Åt³Þ@Ã#£s :)êTö¦Ý™¤32f’c±kcé]~ú¾è'ótólÆ…²7$ÁìµûWæ:yoÊ@QNŽ y%Þ yà“œ|‡rÆ$(j7œÂΆlÑÎ9 %“"D wŸ,’±f®÷T}ÌY9ͪˆÂnš)©¦¡2Å«6Æ;¬ÏRoÐVAèKTOÆ{‡k®à7Q‘†~)U1Y«ò(L¡p½B\1‘R€©x ÖSR¸Ž ËåÖŒqëayCÍR_¼á©yƒ“å;œ“78j¬ý<¼áE™óRfgåòZa~+bxÁÕà(Ô“pNE«誷)äØ-]Ïcy­0/ñÞ<ß Wì7á…++\5CÄŒA¤ ñ™ªø_m;Q=Ëö” þ” •y ò½WÏ'éšÁdÆÀŒR“.z7 ‰FòV Çãà*ûæá8¸6./n=¸4£ ôL•Ék§…’ã B}€/Ë©,$ÏÄá.yæs㟭6p&/PF§¶?¸ ãÌe¤Æ¦/‚ K9¬#q ï^„]ÐØ€C9œ‘õÐ E(ÆeKðžÔ æÞ( Žï$|@8 (ñ„r(Ç(P†K¬6<`#³¦QµÄ‰÷h ïh:-‹Ç1²“Ã¥8–(Çt±bӊ䋳d€ª>Sfé€f%ðPÒ—²x»`ªeo÷;¾Kœ !š¤×N°bCà/Sß·XÏ>™,¤äoÆj!Lɉä¡õÕ°Hg…°ÆÔæ ”%!Úë\›4&§G‰Þˆ}¸üŠ4I}éb¤IxQ÷Ä!œóN6'ų}¸šs||#Žê!lñ;„Yóž#í× ¦—ƒ9|Ì *”.zk®<ÉsF¨\OòÂR’fOj~ +Q\ßf¡Û;rù1“…ä[@%–°`ŠSÇsÃ,»È¸·à—Œ!©Ú-'L0ßÁ zJìY¢ì7ìbM<^¬£X¯)› (— áU ?ž*&Ö€"XbÿFY)Þ‰gM®ª7%´™7®[‰}<„"pXü’—) ŸjÎÁ83ŸÂœ%ÑœÁ‹ÑL¸7Jze"íâ3É+ùÀˆ£ÏøJI¯ J/¯âSŒ%î C–|3ó—e¨Í¦°Ä2˜OýsùQœœ×ç¥VXˆìܤ•P×Zy¬gx‘–> endobj 3451 0 obj << /Type /Annot /Subtype /Link /Rect [483 332 547.500000 338.750000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.doxygen.nl/manual/commands.html) >> >> endobj 3439 0 obj << /Type /Page /Parent 2 0 R /Contents 3452 0 R /Resources 3454 0 R /Annots 3455 0 R /MediaBox [0 0 595 842] >> endobj 3454 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F1409 1409 0 R >> /XObject << >> >> endobj 3455 0 obj [ 3450 0 R 3451 0 R ] endobj 3452 0 obj << /Length 3453 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯ès€m‹¤ž@Àã±äÀ°‚‚Ýl‚Åz'‡üýt·¨žJ%~S¤­5víZÅ*Ö‹U_½ûã—¿ÿùßã»_þ}üÑþþáË!;UEÖþs¼üúáþº>Ù?«º8þøíðýøýðùðùüßï‡ö/þ|þÓÿŽúø§ó¿¿ÿú·ó²éò¾*Uÿõú{S©óŸ²Ûï—Ÿÿëð—ß»ÌؽÎ.æõÿÿ ŠÊdú²Œ‘W?tŸ©®¿þûão‡w턽Ũ¼Ìò£ÊÍù?M®ÿùÇáçó ºé³S“+U•y•½åE•>¿©ÈLqTºÉŽEÕ{Ïõ—Ìì*ÆäŠ8ùeåÒ›¢L©¼“KRöÌ?){›=Ææ«¦‰8ùeå±( '—¤¬®K»=ÆDØ —é#Lž«:Þäו‹ïJG[<»$q‹BÛ ªblÑËô&¯tÄɯ+ߕޏxvIâÖ¥lFÇ8¹·é#ì©bªÛëÊÅw¥#.ž]¸¥.óvƒtÖDØÿÛô1ˆ›WñNn»rñ]±ÄíÏþ9d¼”ö'ÀÜÿîyðéëáݧ3Õǯ?ŸWÖ¾ðúÛ×o‡üü?_5ǯ?^ÏóŽ_9(u*ò²>»A—¿wQÙu¤>ÕMVê"{É>^GŠ“Ñµš:¢álɯ#ù)7­ö²¶ú:bºE¿ŒÕÎö2É4IV†/IæÅÆý«p%ªU™nG'ŒÈnuVOþ.•Ãé ´mÇôö/.£|àuM°³ {ã÷`Ú2_Š™ ±6üÝ„SNæÜâ£À¼b‹=’#à¬3ûô_ÏÚ3Žâ+Tåj>÷c±ÂS&|„:~ 5!§©g8æ´OÈððú{g#{¢Uá½`tÁ”Xôy/oÛªxiú)ߪ¥ð]”yŠ¿ Krüâω›ÎÄž­†lçñ¬6Âõ Î~tµÓ4=‡+î‘ò°fl¬¸,‘›p¢? B™g²FòMÇ5 Ra7‡17Ø\Ok­s&[èvA.SÛ\XÓ`Rm;‘0Jk‡2{he­<„¬fœqÓJ׿T•…ÃÌæ÷´:³]ê#¤·é"[ò 0$x Ÿ_*ÐB„Ùâ«Í²§6=œ&jÐ`õrÝeY<;••zSlŘ*NYc^Ÿº÷p¶§öÝ ½£™£4ÿÉáÍî0{6@™ô~€&kãf˜õDÄÍîêÆÐ Z E@ŽÕÇK´«/ÇtÙŠ±êæ—½ï$Ckßô,ßûiÅI»F‘ý€°gà ¬lxÆ|ì$+Ϭð½Dºyfydà=ª€Ï”pÕŽÀh8‚¿ÔJá³qÒ~h_ ÷g3ðKõÁkû÷økl•'s•Á÷#íé®N¦w,0å0µø ¦)~^5äL»êøá—ê2úŠˆë¼TÜjè–òܘÅöîF¡¯å™/+AÆÎ`‘3¤zûw ›ëÿVÔ²q˜•yœ~f»dÍhQ÷ƒ1Ÿ)ò‹ÂÒf¢Å R‹Lå*<¼©®ZóD)0bYÑÓUDxS&Ç•áù 6O\eºç+œ¯±ÀØüüqNLAæ<1ULà¨ãVöúΖçpm®ß|u—ùä~1>zO“ÿj'/A,ÎÜÌ„–.ãd®$Í–ˆ­’]ITU·? ¸’ÀÏl-Pß~(° èZ‡¯ÀÚ¡µá‹” ® Ýá{0årK¹²;VàÙkâá®ؽ*€—"ž½nbYc´{f?Â/Àôe¾ óqEcðÕ#¦¯ØîŽ(ŒZåÝ2aÚ~MäryÜ´–ãmöæLâ*ˆ :y.9ðaabæxÿz$]ÞõQªhwñÐ ‡'±H•UQbÐWµs¯WT±DMSH*@!5…£‘rkˆç'í»Š`6%” å<3>åòêI×\ˆ¥}qÐ9~;”FÝÿà××ä:—%8 ùQÐæ|§ÎÛWÝ+;%u–êC|öœè¸jë6 =óÚŸOhÄà4'8’Á÷|‚²>ƒ#qøü=Öšíƒu<¬(œ"×ð —>cÅ0C’èS*7¦wc(a>Ý‘u('bOôÚ=¸Ýƒ›x$–œˆÁŽà#Îðsï·µK×ø eYãh¯k÷ÝaQ˜šž²&®Þ>Ì]-SÄøÔkª8Ç Œ‡,Là$F"éÉ‚30w-¸ömþ3μ&ÃÁ³M°Rù9L/Ä`Th-WKRx ‘cùµ!ÆL“BM|1ã$õ­æ¸ú†rs™4/Ù‚c NÙ¬ËÊdÔMß6|X„C3elùiCd—üè(b\RÆñœÑQSYíî!“ä:=73•í¾äø\*ÈÁ=ªãÕAÛŒê%j„@7Ó”ß'Ö^^í™pÞzï2ƒ©` Ø¢enÄÑ…­æ¹Ó#³žÈ ­øˆ[lXÚœ[ë~¨ð#1uø3TébôÙªÔÎ~ŒÂbÇ%PU¹¶|†7ÛÀLÔ¾GG¯m©µk}3èä8„ÅŒ$ªeñ% 5kOÂÏh¬áµ…ýc_ä²!ÊA*XÙ?̉G¨Ô&Ì!øÈâÙÆ<³¡ï’?Å•]¬çåBbr2ਰ#ØÙRw´ø¢R¢Z{ÑmÖÞ˜ •ùÏøì³G˜|ŒTt†‡˜t"r› 3^ä´Åæ÷xø=³SÎýð{0M±;߀·>¹Ò·œRÙn×Lè=nbˆ…J\óÉ6¬õØQ=ŸI¾iGɬééß„=¿é€ žz è¨ÍEßgï*cH qÜæU7pÛíAH3{,lSဠ¶‚à ´¶°e»‚>OAv‹‡ ÚØFôÌÆ¬m÷"<œh°mMxl»O²û$I}mT·°[Õw2 5\ôæÀcËð¸ B²l“±ÜÈVþÏ'ƒÄgÌyZDr_·Ñym]­ùDÓ—eÄ̓ϣ ©uJܼ¯³«ƒ\½ï˜µRÞœ`Ì}ŒH è2¾N[AöbR‰‚BædN@+eAÉùÞ†NÊv’—-Q¥,Efÿ£Ÿ±úˆ"Yç7„ÝÖTžõ†ôΘj§põÎ’‹Læ¿ÍY`yùãÝó0x[TYïu.Ž9Ñ”í²€´0»äLÌå£IÆ„„ªKW7m Œn¹ªQâ"I®˜Í¥ õ½j »ÂW0Ìõž¸ºRî 'ƒ*xáVÀÙ< ¤°²$O‚šg)lºÄÙ=‰`O"ðŸgÙ$Ï÷`>Àgsžá78’ 4UâA޹ЀÊÄâ‘ÞøÌa‰„!9™Ë}¢’ª2dN#–£Xº`šÊRNölò9Yž=ÀôÁ+ÀºkZ&9FV¾á¤•´ò-õST£ö­ÇÆÁ\ÏŒXg“ _·'ˆî¶Ýë‘ݶÛm»Ô2¶)Þ cˆÑˆDü´„Ë5Ñ+Öy¤²*Ám‘ÁPlšÏ µ ƬßEZ÷Lă¥ËÚ¡ÕÖ`$öîiÑ/B×ÕB\iGí½î DY8ÙÌ&iR¤)q2FÞ¡bóÒ®1›~CÆÜ¦*…eè$Û4ž©õe²…ÒzˆcÄðƒ,ñ–AH$Y…$Áò• Q[äf®?(k›–Ó£aÝsÏ´?ñ¤2}©FZ$®þï‘ÅtNc¯_ñ°›…kèW„âZQ äª)\‘7]ÏJ›ÂÁæYÔ*q¼ü¼6bRv̦|ÏÞ.Î;Û˜Ä^d»¸¢¸ÕþÍÖUhµ÷Ÿ(-ï‹ÔˆV¿mµŒKa=×hm2 ‘b{r™yÙÃ"Šî·Ìÿõôñˆ¦U®ŠZò•ÅÏO„>¥ÎeÝK&Ö†}n¦Xd:¥p}’¨ †¢ØTa˜iÁµ¯Ôñd„«^(%-DÜ´Š&/õ´çÞeoɽ‹¡®z¶„l†Âtw©­Ë¡o. apŸAà3ZY¶LrÏSóŽ:Ø´ù’EÝåKîYÛÔX à0©‡}<«ÆRð=LW7OÝÃñD’¥‡ã±f‡#²ùܦÝkLS¦€¨¡ÃyXRà}3 ëâËÌéï4ôu¸Ca•p¥·#ž 2ÑOÅ;Sö1Î~ j×”\^ªÄ\Ž v]™QºÒ£÷°Õ¶à>´T­õì6 þƒwSCí'ª÷HHÌUøÈÊ1uú·†9ÛD½¹,R€¬Þ••; M=z®À£ßœ$ì1§ÔÈõøþb ÙZÕiVÚ4o9Ä´Âß½û~sû~#IaU1ÞØ—¹É}•,É KU)‰¸Ç'Òöl“QQ©‹ûï^θµQ™²t)²õ¶@ /ÍdÍ øP_¹µFW©êj˜ŒNÙ4k&×sz¥—çFU¶R6?T¢ŒÉÝ÷dOÅmâ9$DÝ]@ʤ0Ø»lŽY¢ÄõdÒfº@§à‚f’DÔ¬qM™ösuòbìYXʆ›´%rÖ™,öÄ|ÅOÌ‹±Ž ˆ-$ñ3eë©ݧÒDw+jÑa½º¸Zu“ñkY1Š“Rµ³©É꘨%ãÿ‰´p"P…Ô»0ßõ¸n’p|Iô 'ƒÎKÕ5µÎnw^ë qO±0ú÷(¢†ýZŸÈn?ãÜǰ¤ Àâ"έ´L•K„«¦"ɳûx›éP ©Jr¶r;3&©*\Õ+‹ëdž‡âÞÆ•»#{6êRïi«Ìµ¸„ÕÊlÍÚ‰Øtšç¶ó¶]Zpeþ® é+‘Ú8Òd~ä Ùκóã׋”¥c ÌäÊ™xêü@¼u=~÷çK½:_íO&LrÕÊ=™ëެìÍ(Ÿ÷&ú[S}»2Ê…O΢á2Á™uL]Üÿä×Ãzˆ£W®k4SÄ"u3Ja ¤­k¬È=<÷¬Dþ_H?Ù tÑÌ)J0'‰£vgº‡D]¿ò¾S̬êB;2Éc_3 8²Áæ¸=>úw)²™S¢x€T_Â`º%Ë I•ˆ/+œ˜kxÙ¨C*¤°ýTî§r‰§2¢F­m.Rz+Ÿ UH`yzb1ŒãÁd²ˆöâñõDd ·ªÙHO,Ê’#.ÓeÚt%:Œù³¥“ ‡®J<Îh´xöMÄÇ—H®–Étš~§Ou cL< zÎfs¦Ë”¸éÚšúTÀí¼Ä‰›UÑ…#óúõ7H%H£&o``I€Úo×fW“Ÿ‹r˜"ÒM¤ÇRéÿÍu²b²,™H´žˆ;äb?ãÀKM¦_/A…6â”·ùáõ0ØNl#@”ànê{ 4OÚ ‡Ó Å:Nàe­¦òršõäã'ˆ:[‰@T=0z ä'„c ™´UϪñÚRõ§îÖíS„>”¼ÄßwÔciãeÚ¶ˆ‚Üøügnk'‹Ñ K>s)A:›â”_†Öªê©ë ãÆóÅ÷˜¯Ü’$™D`¤<-ÊØŠ¸éü{rŒ¢‚¨GEùt ø¸,l°(Œ·,h¯,”¹§éãs3Í‹0uê=Ç3ÒŸâ^/r{"xwÆö UÒTQ¬ÜÝ‘z… ÍBy¿K°vËì2ÚîâÞXoo¬ÇZŒ~o|¶ª§MÑôf¿7žpo<´×¢Íæ˜6OKrQ›xáí ËÌÅ2Ú«%´7,³jAí e}áóïÞÄ0/+µœ&†»]’ǘ4Ñ N¶qÛÖNºGFC¾öxq¢ ÃpE&NµÎ³M5ÚÄ’‚á7-Ä+Àq!¸‚ß­3ÞÞ&úÉÜ/1§$‘½b0WA*(xãƒ&¾÷Œ`ÁÍà½%ÚâoœÑ€Ô ö/Š\¨5KS9Zsw3—éf¦“9'CK´Bm¾\3ö¢‡ÈÏ/’àüëøý|ä½áóØ_˜ 2êÁë®3;eª8/ïø"3$Y»ýÕÀ.´V¦>éÖã¹iqÙ1Ïö™²hïP^Ȭ Û>£÷˜1“ghmŸì—Vv .U1Óä®6´Xe?½÷–[±dÀ§bà3ž >cU› úô»L<–á.>¯¸[96@ DÌx6Y°.Õ X+çŽ'ð2”Ç«Çôýˆ—‡[ð j÷kÄ>‰™1l»0IŸœôÐ ïloü]pz}g%²‡¬ÊÌÉ è‰§­€#Ù½ªSSÇχÿycÏ endstream endobj 3453 0 obj 5948 endobj 3457 0 obj [163 /XYZ 37.5000000 357.500000 0] endobj 3458 0 obj [163 /XYZ 37.5000000 327.500000 0] endobj 3459 0 obj [163 /XYZ 38.2500000 298.250000 0] endobj 3460 0 obj [163 /XYZ 31.5000000 268.250000 0] endobj 3461 0 obj [163 /XYZ 32.2500000 267.500000 0] endobj 3462 0 obj [163 /XYZ 38.2500000 298.250000 0] endobj 3463 0 obj [163 /XYZ 38.2500000 233.750000 0] endobj 3464 0 obj [163 /XYZ 37.5000000 357.500000 0] endobj 3465 0 obj [163 /XYZ 38.2500000 233.750000 0] endobj 3466 0 obj [163 /XYZ 37.5000000 327.500000 0] endobj 3456 0 obj << /Type /Page /Parent 2 0 R /Contents 3467 0 R /Resources 3469 0 R /Annots 3470 0 R /MediaBox [0 0 595 842] >> endobj 3469 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1409 1409 0 R /F8 8 0 R >> /XObject << >> >> endobj 3470 0 obj [ ] endobj 3467 0 obj << /Length 3468 0 R /Filter /FlateDecode >> stream xœí]KÜÆ¾Ï¯˜súÅÐJ»r h‚ÙN`DF6>äï‡3lÎîüŠä7Ír¶-Ø’·ÅîêzwUuõ‡?}ýÇþŸ¿ï?|úúŸý7ÿû§¯;u(2Õü³?þúáíLyðÞe¶ÿö}÷²Ù}Ù}©ÿû²k>øúé/õŸþ·7û?×ÿþºÿÛßëþäÿÒñ/|ߺ¨ÿ÷é÷ªÐõŸÔù÷ãÏÿµûëö¿gl—óÀ\þÿ:+Ma`Œ,ý²k·©O¿~ÿöÛîCƒ€y«Xg.ßkgÝ^WÎìÿûóî—zvzu¨œÖEî uÍB…9®”›zSÕh7eo¡Ó¯0Óë&/]±Üä'ȃcEÛ\˳‡$nYUAÚ-ÿóôá'/”6 rÎòàXi‰‹gHÜBå®APðßN¿qÊäœ#äÁ±â‰+Ì’¸.óªÍ¨j ügËiÎ"Ï$î òàXi‰‹g?”¹ÿþ™\»<.\eemðu¹_”­JUy¥jKž8¯Ó/@ùÚØëå&?A+ž­ú³™3 ¥ù ðH_„žwžj#•!k<ýöü}çêÿ9ú 5ìÏ?íÿ¨”-~Ü?ÿº«EýC“àkFLu)e¥.GTv±‡Ú•-‹‹‘²ùæõŸN?pg›SÀëˆAÓëI4þ«ú4¢íÁšR×C¯#~SBèá:Â6º;Ж£ÓL¯u ƒÐÀ ãÛ.y\¸½ƒ³B1á:/Aæpu9˜§ŠùÜf1ª ÞC8Œ6G ÁRO#YË9SØ GAó4¾0±z²\QZ.,ÈH³ÁÇçÚþ-cº2—ulWK±ÒhÖ¥7Æ‹)!y1.{ÓG’ õ©vûàM¾õM Ë¿ŒÎh ¥\ÐZÓ…ëiBÜN!f8#%¨¥ì)öÀ1Ø ït 7¦„§t9ã¹>’`P1ÞšKè½SŠËt*(rŒ> ÚM]k‰Žáô/ÞÂt·_Ð#Aµ¬@qÌYXVñÖ1ÿ|&,4Ì3 V”3Ü}(=§ÔÙ8Þ°€¶°ªãðZ„b% ÿØyXÛáAõØFÄÊkôÍ2±-X÷bûH8Ý)Þ°¤a®òë Ú£Ž9„$×o=®ß” òÆÄùH £³(ÎÜ܇¼»se¤ÀÓs‰Éé¨Ò—hæäðŽÄâ‡Ù™¿íg A×u›‘}™îq0çê(7ýhµ)OYÀXD¶âÜ>'‚0!òâÛ<æ`%)0Ý`ò;Œ–Ãx‹u^¡”_Yò4¨s7fÎ(÷ã{Y'é†PñÀ q[&å:f"„åªj¾AàqUXÜÔwœj§°–q¼zÙ«'h.Äôxd }cà7yÈÙüÆÀoÜG8›…#päÓ|Ø0½Âoð:ÂN±4a™ «k0W­X;Dµy±›‘Î~Ðÿe>~FľbÒRe­~`âxa½ZÈ‹ÛôßqD9Æùs$ã[çÌd¦V‡¼Ð…¤Tu SÎöšhÛÈ0ͳަnd„½göU#ÊÔãǪ‘šžàê#pê“)ÁšqÓõeÊ ©ªž 5‡Ti8„s¦À³!3—\Ù6þ™rÉ)—<²N¤\²p¶ ›‘Ä>(ÃñD¤ûÔxdí¹–*;wâKº&éšUè&KìoýÍ;#ãuˆÓ³ 1Ô¶X&œIu+’Æ'rJÛÍÈWÅyÕd%’•X…•òP‚ÍÁ:0šøæÕYÛÔÑó>k×ÄežNš8iâuhâT­s•ºÉHŸj Öͽ©Î\½û:s9Ï_(ç.ż·LH 62…ïí®š…–!Ã\Žu›Øæ¸¨z¬2‘¹<Ö ®¤—àc—áŠtK\m!r‡Ç\ìN÷fyïÍ"¦[⡵CLãØús-6#enׯÿ­Š¹Æü’î½H\!ĉSášckŽO3Ù¦ªÛ@wpí‘Û`¢Ð”¾ñ‡P²ÍäjbùÌ}– z‡¡©àùbK‰õ5Ö.„Çôà¬[O´;Ý#¥)èí°5Ÿ¥ï­ $“É,2Sç´ö;ZÞ1’lS^#Ö ¿a?Cë—4„ è˜sŒÂ/b䇒’H¾¡Å\© ¡,§®˜~D>žS]Eÿ·Â–æzšï;ìYz›ÕskîW8Û… õÍwö’œÐã ?ƒÍ”ýö^WÃHaÞÒúpÓVîÖ/$o½ú;VS2Ü2LçCâm͘…ﮚàîbÅN$ãbãÓâ)ó™ŠÇæ_鉃+½Á|ºô.=È”K—Ò¥RêoŸøL—BÓg»—²<ú•›'RaÞ óF¯ÔñΊ‹³˜ýÄ”ô\ÅNø¦² T4‚ÑT”Ê‚Äs[* Rq­„‰~Eråñ§ÜžN§Æ8aQ):Œ;¡£PgtøÖ6ðIøzÖäsœo„ |×iÍT‘goЈÅž<À×yBßhø?h %íð:p?^q a>T„×±0çsLCP7æ0?˜S®æíÎøA4LÛ;Åë@¨=å–ÏXg=u.3éoç‹ñÛAL¯)Ü-Œyí‡x ‰zÏI‰2 jœÄìeiñÖq«6"Gjž: ÛÏ –p5‚3¤ OpÍȃßI¦1‘tövt–èa%³t%CI,A ö«e‰F tå ƒ„ZXx¬ðhAK˜)Ý1…a«wlWK Ôì¾ý'H9óÔS;Ô°0Pã*!ÂÀ†­,òš.Â1©Üö1ÉàR¹tL’ŽIøXÁlàÑêÜ>ºo~ሠ­ˆ£•÷—´k?êâ`ù#OiÞß‘§ïä­ðf-á…DëóL 8œÓ!D u­ì/ùQè>¶‡ûXùÔ‚BhzRHy2˜Eƪµ—%ªññßIDÅ9»!·u]&¿‹NéKZ)íº[¶ ?°”…8“¯àÝy¬”°­#ÞX Ï;Ü×[{¿p4 YâK=vý?Þò,~3åöχ0x›² Àœã.c×—‰ LH°rYmìvAËZiÛµ¬)*<¤õF…¿y™b·“ ~/±ÛjðÈ—7Zåµ¥As&ÑêÐèÉžáñ[˦ŠúL|ó¿©Ð7íu{(º‘¹Ç󹬲SG,„­!|~°Ú zÖßøÈéÐ: Ž„o²‡ÖØñÌ?„Q[ëÌ[~0"@w ©€÷ƒq PB ÆømAñ³:ëȦˆrá0WÆŠrWJ·6¬j‰Ó½¯®3¨O5úÆ4Œ£M«j¯ó‰ÙÌ#ÜÜ©þ‡£àˆž †“LËø% ûN3Š"Õ]QOˆ¬vTðÙÂì­ ÖÔ¨Ü7˜phêª×®úÏ>˜ë(Êx§#?ä=õ¿©Ð7þR„.ú^ W®î’¿CP?À…fSj¿ûñf¤8Tep?x¶V7 Àq`!Mñ7ú†¡^>î Yå.™%TJ4ÕôŠTΕ0©†H!lü¬§ˆ8XØ@3‘rAX–?Çêܵ©–W3D¯ûW™TèP¡PôÕ"ÝýMaƒÄsðsbÛDœZÀEO¨ÃêŒMfñfh:átD$Ÿæ$ü˜›,ÓMá ® WÖÌe ƒô\fÆÓc(´òJ‹à+Ž»VQ•ÝóÛ"å|³l‡ÀŒWT˜Q5.(`¨Ù˜HY¯RYw‰§PY/œQÀß@„¬WÖÊh/ë…31Á¹œ?Â9'ˆ‹aƒ#8ç$dEp¦,ÒåRm±†yM·t#èLqcËBÄ@¨Qéé-¦Ô*a0ÛÃöæ%”¾g,ÞO,îb\Ξ“lØ¥Áf?èÉñu©ð\ÐòÛEÜŠmqŽ;¼„tVã» ·F|7#™&Qx¡Ó2šxË(lÃ4¦!—p=&è{høµ1lcmBãÈó„÷3|Í îŽiÈ4æšåa:BÍ…×±1i²•·•Js®QJr+éo¡åæCDj™ñ=`¹l¦0ш8⃥±W=Èqs¾bXÈ®â´BÙƒ×RY.ƒ#ú­¾ÓÕû/»ÿÜrSR endstream endobj 3468 0 obj 4090 endobj 3472 0 obj [164 /XYZ 38.2500000 355.250000 0] endobj 3473 0 obj [164 /XYZ 38.2500000 355.250000 0] endobj 3474 0 obj << /Type /Annot /Subtype /Link /Rect [156.750000 362.750000 207.750000 369.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_features >> endobj 3471 0 obj << /Type /Page /Parent 2 0 R /Contents 3475 0 R /Resources 3477 0 R /Annots 3478 0 R /MediaBox [0 0 595 842] >> endobj 3477 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1409 1409 0 R /F8 8 0 R /F1499 1499 0 R >> /XObject << >> >> endobj 3478 0 obj [ 3474 0 R ] endobj 3475 0 obj << /Length 3476 0 R /Filter /FlateDecode >> stream xœí]K㸾ûWè`=âCA€éžé9hÌ9,rf³ ;‹tö¿Ù–ínÙ)~¢Ê’›ÓØí-ªX¬wYþüåÅ¿~/><~ùOñ­ÿþøeSn›ª<ü+v_?¼þƒn·ýÏEÓVÅ·ï›—âeó¼yîþÿ²9<ðåñ¯ÝOÿ+tñ—î¿_ŠÿÞýñ§þC»|ß4ªé¾ÿºÿîÕýTž¾ïþþïÍßþPü¶›ñøº˜·¿ÿ *§­ÝxõËæ¸LµÿúýÛo›ĽŨֶm¡¬±…rVÿýçæçîÇéËmk2®l÷³«mSVm«»ŸÓÿc_ÞèÝÛ+m ¥]‡/£.^¾ÿJ3ý “;[Í7ùòäXQ¦VÞÙÕn›µªê¶ÖÍnûKsøuªUö¨²¦ža+Îó'Ÿ\+e«ùˆhyz´ô}eúç˜i0,^ õâyðáëæÃ“+T]|ýyGnûî¿}ý¾±Ý/;ò,Mñõ§â<êOÅ×_6ªÜÖj;ɽûÜa¤Ú˜meëÝÀyDõϘ­Ñ­Ò¯žQf?Òn[WÖúÍ3-šÍfkÏ/~ÜÿÁn­9h’óÈçýHu|ï«éKôâ²!FàÒñ3ª†³áõ`ä»ÃHµ-y ÁG8ÛÃá}A;@¾vppùxו%з¿Ôp¶á`K AÂÀ4ä™ BàÙ0ŒøÝBðöãMÆ…³élJ’çJ3Hx阊 ä,Äðls åó×N‹Í¤€:7à­Â:# ¿{>Šùðöü5æwWêAq„àü„€µ ÒÃpzŠô”-õ5=ñußßìšÛî¡{# ›Àˆ ¤Î¾5Qâg,é)ïÚˆƒ#m<igSuü{4†í1~=CŸQ¶Þþ‹ÂŽg=Opäs<Þ¨+ Jİ™x:èaáçZ™ðnü\=ÄãJãg4±'x6È3ª€r¿ó™è=}‡e ­ÔH{Í)ië‚ü©Ù#±ôƒËÒ,'Éßk;÷ GcnÞÚë×V‘´^‹õÚ´óX¯ ë§Oñ”Éh.†„¼á±éàlà•bî$¬W<#Wk\R'¶åûLR'¶:lgx¼¯UêQƒ9ó0~!yF—î=ªV¼¦•qN)“É”yð’"4¦Ë)§ $ýJ­§Ô1­Ó¯\§× Å'«Í`9mgò4r+{N’žÓÍ9={NÞ÷Ü_žÊé* _†§¡Ýéä×Â= £¦Ô1eOÃÇi”Åh*¦ZF¾˜]``“ôuŒ ×À-Ã×1Õ” §ìëú:ï†S×ëm™fJeKö¶Êìm-ÃÛʲ&û{ïÎß3nÊytIÏ*•ü­þûvÝîÖÃþ•G‘ÖÔÕ Cc,Ñ]’·»Äòiðâø;¯|´ß©+WAR÷…F\yWçRW‹w]R´ÄÜÉ÷vHøúÃ×ÓñâMö\· ‰—¹æ“¹¶ÔÃ>7'ZêªÓ¡L»ˆ—¡ïÙ¯Û­Êj €<—ÿ2+ÀÏà»ÚÆÎ£3 liå>u÷0Á\ã•~0äÅ}ÿ‰)’¸Ûœêpa`1Ê /ßÞÍè3‚¬cú2ûä±õ˜ú ù€/´ö¬öe 8mÁúøkœap^ŸQªR›Ñ¥òðâ..`ÇÆ£QñNàk÷±f€-a¿“êÑÁÐ8³-Ž5£VȳaŽ.ÞÁ™ƒ ¸g&©Ö „H ²ÜüA¥ª´ñûÀ`γV¦éÅxšôL‚ÈèG¡Î20>"رT¤ƒW3Ò¾ÖÍ€øÁµnG&‹Ýù{ö0³Jš WR5•9ÔKÕÌ“ÊglïË=d´ï7·+_ Þ³V[”j .Ó^0·ÇÓ×}Š‹«ÕñÞá|\ínŽ«­2ncÊO&vÜáº"2 ‚'‹^ËõF6þ2J¨¨ñBÅX3*ö°$e·ZvÚ–L¥LþÛ† )ŒÒ˜b¦A¸÷@5ê’jv›¿ßûî}ÝóŠiÜë?üºùâQV3i¹Æ מ$««m å®Þ¾t¸ò¢®NwýÌ`UnEHÜqe¤WRÕV_T.=Ï|‚Ï8ôÌ9[1|¦çÏ+#®?£>Ÿ<šá5pä1~=½&¨·fO£`ëû±\@%ë2ÝÜ ˜3:†®ŸT(8I„Fêf&—»¼céiôÝÅU¶qI«yÕKeòp{y„Ma¼$HÅç¤Xœ¹ßS¼/DCÈš3oÒÙwou¢XôN"K9~p-²½´ÈT’>[F5ÕÁ¾kÌÀxŽk;Û)*Üh7cÄZÉF5&ì‰ 6•nS`ó³Ó¦TÇ.›•†%s$=ãyZb¬M©vD[mªÕ!Þܺ·ÕÃxÃM‰÷xâõÀö•žÖ¿‚1c™ ÄwM=–ïâ@b'^=-"óª ¯2­½3ÏÂÅÎMàbO‡h‚”°”Î]#N(aëbdáÖØžæÂ˜S0ý@¨KŒléÂÙ*¼ùïƒüŽÙj½ŽÄÄ,ëgde^ͼ*Ï«¶ òª©%ùáP¶g9ÊbìYaËVë<|W·A¾Óɲ¾cøîPæ;9¾Ó¬Õ02 s±Sc¹8ù)Q]|Z^– r2!G„¹Ø);…‹yA-ÃÅçåeSÎÃ4ðì{JYà,*1b’8ÃŦ™‡‹!1÷¨ââÓò2 Ɖ0mÃê… ¤”ÊIJæž=%¬†=öñP^)Æ(\˜×·JÚÁk%!½6©nÀîŠÆâ0üq©TмÒNuxyžº2ìšoä½ùiµÓ ˆ9J2ËJ˜6\ÃǘêÖ Í#ãæ0Ü„dÏ õÙ2^B5“ù Fwï W+ Æ•^”£Ã^îÊÑáõF‡õNšŒå»8…€:Q.>-/[îrüí±ÜqDÃÆY”Eí‰i‹jÂ*\_8 GFL$Jˆ‹O(É\œ¹8€·ÉFÉ„ÿäâŸK‘¥M¸þÓ#8$|'×äÊй$Yö7¼"êo¸pe(“Ü„¹ÚÚ–×È¢t$¡==QAâ|~qØÅcÝÜS1Ô‘»”Wl.€»–PsòYÙ«(àU`ß!Lˆ{>ÒV|¬ÓÚÏ•2¥§PÔ¯Q6\Ó›VÎ/$t^x–Ù¤LŠÉòC®ŽMÌÄø=}ßM!:!+{^’z+$˜w¹ðòÒr—arÄñ_¦`Â#t%ã…çMÉ\,ÇÅ™0ƒÒB«µ‚¸¸‰p(ƒo§I†óÏÎd,¨¢–þŠlY‚Ûý\ž¢‚Íæû Y h¸iI@}€QCšÀ8dvC÷Cg3OÃe@`û¨ã¨bÆ 1Ù$JkJ³í¥ÔH’«àÈ«ÔtP?Ï›ÿÈãøQ endstream endobj 3476 0 obj 4052 endobj 3480 0 obj [165 /XYZ 38.2500000 69.5000000 0] endobj 3481 0 obj [165 /XYZ 38.2500000 140.750000 0] endobj 3482 0 obj [165 /XYZ 38.2500000 509.750000 0] endobj 3483 0 obj [165 /XYZ 38.2500000 509.750000 0] endobj 3484 0 obj [165 /XYZ 38.2500000 140.750000 0] endobj 3485 0 obj [165 /XYZ 31.5000000 110.750000 0] endobj 3486 0 obj [165 /XYZ 32.2500000 110 0] endobj 3487 0 obj [165 /XYZ 38.2500000 69.5000000 0] endobj 3488 0 obj << /Type /Annot /Subtype /Link /Rect [354.750000 488 417.750000 494.750000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://docs.oracle.com/javase/7/docs/technotes/tools/windows/javadoc.html) >> >> endobj 3479 0 obj << /Type /Page /Parent 2 0 R /Contents 3489 0 R /Resources 3491 0 R /Annots 3492 0 R /MediaBox [0 0 595 842] >> endobj 3491 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F8 8 0 R /F9 9 0 R /F1499 1499 0 R >> /XObject << >> >> endobj 3492 0 obj [ 3488 0 R ] endobj 3489 0 obj << /Length 3490 0 R /Filter /FlateDecode >> stream xœí]Kä¶¾÷¯èskERO àÝ™ C€Å.CC`Ç ÛÈ&‡üý¨G5#õW¤JdéѲ‘ìz8"Y¯¯ø¨*~øã—¿_ÿùßë‡O_þ}ý¡ûóÓ—Kš”yÚþs½ýûÝÛè*éþ~-«üúï—o×o—Ï—ÏÍÿ»´|ùôçæoÿ»ê럚ÿý|ýëßšþØýÒí~½”ªlþüåõϺTÍßRûçíçÿºüåw×ßn=öÃu“yÿßß©"ÕêuŽ¡¿]z2Õë¿ÿýá·Ë‡–óF1:ÍLzU™É®ªÎôõ?ÿ¸üÔ 0tŸ&uóÛEUè†Æ¤JMûŸÜ!K}5ªáM3¦®_.Æc¶=ê?xçZ©,Õy7óðlQ¦Pt÷Q$­•Îë–Yye"ÈÂvCÐU¦âuþ:óà\iåLôIÌUmZViSÅDß}Ihe"‚Åë̃s¥3î=©ŠîøwæØÕgºÐ Ѝêj=Æç9}`&Žïñáǯ—/*K½/®_º)ú똯|mXÖ ßw7w× ÷ׯ¿OÓ\ÿáúõçK:ïçØ¶¤Q‹©P‹*`oŸ`ËËü¤ÏpåkËó×FÑØhL=bcj„×Èà‹ %C-y‰Z2øMªæÓÙ[àÞ°ÂpzÛ³iÌšñ æü†Ó‚u”#m µ ·¼†’Ã|cYý÷Ä…»²ñâ#¸cx ,® 3¶hØ›†Ì"؈ €„ð1=.¸‹+b»0hÖÀÎ…‘t±vB)@!¶†ILÖ,è–ñ ä 9îE3fM,@0wžæ»Xbx¬oßKZq­|­xŸ$-ßA¸YlC˜<¼¨b,\d,Ä)@z4lÁ‹D‚;Žb´€’ÃsÃèv MÈ4Ÿ/ínÖ2H–«,&’ÍûæIý mdAl2p 1ñ¬#fÐHŽw"GR2k]¦t[ÇùâåƒY&•´;Ë’sÕ‘Š­:ˆCŒd²ê71]” Ùw‘îǾ×:ú°–_,bÉiù§åoÈò+Çò!á/\[=!û¶,9WÔ›XQsÔŸ pÆ‘+›‘Ë"•$mD±Ç¸#YçÁ3ŽèÅ”ÜýÌ:f «‡WLkŹGô Ççs"Yø5„¬8?£_V°b<|RµÅÜîž½ªÜ±4úEÒºì„öYFI3ÖD…¾nËèOºãUrÉ3ÐaBûÔ¼Z9¦þhwäG.™2Lh§úƒ½û!õ'wÇ6ä’§HÄvª?0kî˜úSºïèó\Rì„vª?°ŠÈ1õ§vß(ÉJIÄö©?¸>ÍõG¥Úí¸EŠìtúófBûÔN¹=ëOæ¾ûS‚§co&´OýQ®òªÓŸÂãþFðüçÍ„ö©?æ¡ÎTZ¹o2Qü±Ú§þd…?Jyär –ñ3¡}êŽ 8¦þ|IÌ,‰ŠéV³Ì¾O¦%ØX]U}‡ºhYh/‡ºešJ“¼Î ÌjéL#OtÑ6 D¿ý¦FߘöpD™¤TUù®·¶¼”RI^›÷-5ç }ÓÇÕÒ]ÊÞ›A«”ebêtăŠÄ¨V'†Þ wºR^÷fù†ÇQê‹£Ô™|Ö‚“Öcv4“ÉŠ›ä¢Û;÷*©&ÌmU¼´G~ à·åßk)aK+æ,ÉLùžÉ¸7GƒKP<„‚QOºË)Ë£+µØ½" þÊÌo!¸ôŒHg¡1–Óö<.¾˜) t$ô›Þ„ )iðÑàÊßbõû£ÛŸx¼òùªƒü.(H÷f´Ë˜fÜit$/ÃZÏ`s-åìâ¡Õ+5Õ«›z¼j‡º={ýµÙÔšúíO~¹|‰öN,g%Í0Tâ^ [Ø;&No˜xÖ ç<Å&Î0Ž—ÂCg®ef¬>³lƒsJ&u‚‡W˜‘ÁCs̰7²,Û“r¨¼ø‡ª‰n9#:º:×.GÇBžÈû¨#Ó8 +3¶~A¯Ÿ‚\fϹŠçÊíÉ›…=µÕC°˜wøMØ›ª9÷Q«ãuìkµÕŽVÛ4EÞZf ª]±Ìºìý‹ÁÁ¾¸ N|ƒ)¹D7ãÁUåŠà¿×‚ÓpX3¤ÇàÞpõ*\p Ä¡Ðx˜X>ø(Žç&‘GÚ+³I=;°’á,ÌF„<1T-’4k±‘Q¶‹(sÅ(O<@gXŸ§YÖ3^…!²m\oòÅeI‘™,!4‹S’Ž“ö²ñBŒÊhw:Q|™“=„,R¶«Ç¹E„ˆ!‘{jÃÂú5…‰$ãàŒ5‰E…ÅŸ 1˜U"öHB±˜•¹K¸BáT0]ùä³–Îx¤@Cý9”S°xº!sv ÄBë6ÇR$´Þbð.„Bì.‚eú`cé.OHÁ¯á,„€‹ÈÛ ÊÄ%âèÛe‹ ‘Øx(µ¸P»ËNrNºDN¬õ/#µã´³gÄ@-ÁÆæÔm!4‹$”T¢³Å’¸DÌk†–H>ï¬2å.AÊ9Fc¯«?=2ɳ„8ºÅ˜K-^ŠƒšÍ$OÇVJКIœb×a” Ò® ¡'k4¾ÝŸ Y¬ÏRiqaâ¼d´?Ö[Ÿ²%Ö»Ö´Bˆ.ϼ?æ,íö§·ÅYOàéc¬c,%·¬'ÎqD0éqny„–¸KÆXÛÛ{YŒÅ,)<•<ôÊ*w­ñîíá,"O$ÌĪ­ÇT‰xRÆK ¬“_¼­ÚŸ–XǽˆõÄŽ–Ã`Îþ˜ñÂ6ñ '$ö¦AË¢ÕªóÔã]©“¤G?1ïq{SBÙß²¸÷)^lÄúc 8kœÀ‘¦’!ËXÿ æn1ØxÄ0oŸYѱže’!ñy¨è ‹Î±˜õX×%±Øh8„3;Ygö7·s÷\Ö×SlÔÁØ?È®v}|^Ñ-@Úe æ{j!ô!qgÈ2j¼5Àã¸R„…p®tGQŸW¯=f-bg3ˆÓ)Xi?®s!dZ¦sëÞ9[ü‰KÄ‚ «§&ÝíÚ¬Ðîèó.=-jÆ"“Â|¤„h‹šËÌ@MÑ䌅äáCQÏÜqÏaŸéeñm#Íó ÌšeRÄ©U؈mDE1c5ÅÚbã\tÑu–<9ç® &®K[Ü.ÓGeð _„‡ÚZ8KOÌGâzÓzEldíÝ9a~’ç»bÉ „ç¨Ý¡úÎÍɽɘ—XDHÝøŠ¬,šíœY¢1„{g«Š’« F3Ì*•G²À†…B°qBé18šPpáÓ­†ÅõH»Œ%–ºëŬsÕÖ! ñmÇçÔÆlByÂÏ<±µóÄ,ž.>qõŠ,Y*p5òéÏÊ¡˜ `t]Ç!æéÁ¯ÃïÆcî´sSªÿhø¿5%G¼•Žyýg€yÐêèðòºQ£3Ár¹֋òx`¢{3¿3Óáfž]©ðdÌèdæŠe— bú‡Ça KêÁvhÐáÕùØã™± 0ð´8£L/Nà@±ffÃî :b†£c-ö$dLF·›œÇ.lïc¦èÐň0¹a'Ha†âo0 c˜ÌPKönsS»N,jÕã”Â÷¡pÈ:ÜÅ'#øvoµsÔb\wµ®[0wzp€0¤'帻c#9÷8ƒ±£¹íQÓƒðÍ^l[dŠKÄÑ=¨Å’El\ùylkÉ•;bpï„õöºˆ¼y'Ì₳öWgÒÚë"ò$ƒIu3E÷¾è|ú*b,dýùôÕÛfSš:ôþYØŸÁ{aðVS™­Ðq ³?H}{‹õlÜaåi‹fk‘7oÿ¾ÃÊÓUŸ•§×®Ì:TMƒO}ßljY^ª~f‘WWUßã®.Zæ½CèÒüTšäít†iV¨¥ ÂÎ]´MÛ_æÓ ñÞ75úF µyŸñ„ZT+ª21 ¥HŒj%2¨„‚ã@Jñ8˜õÌκK.¸÷3(`K°ÇèüèÛ1ZÏöÞµ”ÁwÊ¢û<—±%ÞK™zîÙQ”ê]ÊTGÚ";ƒ³la 1üM° ²êz{9îÞr£HnÓb:”0‰ÉÞëgÓ–Î⋤˜Øu¿©á7Ý ÊiZX §*KÆÊb4œõGØ’¢ÞzL¿QøHOg½eRWc@zˆÞºo  {¬¹Ó?9~Êh‡uõ^à¡j$à<@˜¶FdÐâô¸q^QJw'‹9¹|‘üÃLaeerÉ¿Ú ŸM€ÏH! [í‚°œ¥ËQ^ÜÂÓQÒgØÓøWYß 3⛫3³<¦—©Š‘›!J8` °49šÖŒ•Ÿ Qåf‚gD \#…ã'F3‚ÖÞ*1éˆì|FÞþt`F… Õ6°Š QŠaÓZÆQÉ:˜³|ãH0há,b€‘‹+z˺;Oöñ–ßpLTÑÂʸ ”YØzT,iN æi>¢çfA!¬xïì°ÉFÞî2à˜å½ö° åP<ƒÕœòD1ê»Å?3ªt+¶ÿ:%Ìm»á˜%aþpàiu­¨Êó‘w^‰“³½ÀÞj,*ÂÜ>úÿjdcUœà—Ђ3L‘˰Å}÷­æq/¢ƒ‚ålñÙô„ ¯rÑn$¢c* buÁ©øâhqŽÂ­Êt<©jÜBç6ËWs6ÞœÞð¶:¨ þ9(Œc색½QÀ(2VÍäqbÕˆ¸3ßg@Īå½&´›ò‰&܋Ӫa Œàê4aÖÜpt™Ásƒ-Q«¢W¬Ú®ÇQy0îìmÎ\óïõ[£I¤¢}vý‚‡»¬î7²KÕmz¯ñRíì°–Ûå7ÒjNt«oZÚýM1m1OÝ7“˜­¦ygãÚÜ›ÛKGéäP±³ ¡Ù0¥Ô±ã¹ò¥a÷¥ôî¡poð›Î©Y¤¿IBç*ÜíïÍŒû™ãc6#…U«MXè rPn½õF'09’dzÇòÅ3€½é€'†?%Ð'€-g‘ú”©I:èñÔ£ÜÑÒ° €¯Ÿ/ÿ!ÉÊ• endstream endobj 3490 0 obj 4898 endobj 3494 0 obj << /Type /Annot /Subtype /Link /Rect [428.250000 355.250000 446.250000 362 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://sphinx-doc.org/) >> >> endobj 3493 0 obj << /Type /Page /Parent 2 0 R /Contents 3495 0 R /Resources 3497 0 R /Annots 3498 0 R /MediaBox [0 0 595 842] >> endobj 3497 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1409 1409 0 R /F8 8 0 R >> /XObject << >> >> endobj 3498 0 obj [ 3494 0 R ] endobj 3495 0 obj << /Length 3496 0 R /Filter /FlateDecode >> stream xœí]KÛȾëWè`eöƒ/ `{Ær`Ø@‹o6Áb½Èdùû¡Dj¤¾¢ø©ºHIô`wfÔÃfuuu½ºïþüåÛý¾}÷ñ˶ߺï¿l²]™gí¿íþë‡×øj×ý¼-«|ûíûæiû´ù¼ùÜüÿiÓ>ðåã_›Ÿþ·õÛ¿4ÿý²ýñï͇?u´ÿƒï›Ò•Í÷_ßëÒ5?eÏß÷Ÿÿ{ó·?lÛÏx|]ÌÛßp…sU±cäÕO›ã2Ýáë÷o¿mÞµ˜ö–à}(ýÖÅ·®Ž~ûßn~n^pœ>ÛÕѹ²ˆevÉ‹šW4oŠY¹u¾nÞZeƒ¾t¦w &/›_’M~€\+.Nž}WÅàšýÏã~£÷›œW•o~.C÷ï²uU¡j‘VÄ"Úž§O°'!V!݆ WÇÊqÃñ슧9ä Õ´*Sàÿeú“—>áäÈÕ±Òm®0{âÓʲc>«SìI™ŽÃ†ºJIM{ÈÕ±rÜp<»âindD‡ý¼ÔÇÐËì Ð]ðé&?@®”nkñäš;ëR2ɱ}™>öcLH7ÈSÛá쟧̂Ai?–Á“ðà‡¯›wŸê­+¶_n k_xøöõû&6¿ìmªÜ~ýiûÇ,óþ´ýúËÆ¹]‹ª±˜öwÉüa¤ÚUuVø<{5òxÉwÁWîí~æãa$îbhͲ—‘ü0޼©ÚÙΘÄá—Hp6÷¾~±s-fÃM/#>SA\0˜à[L_†Æy„ÀÂeø >ƒ ‘Yua‚dz…>ÝAJq\z„ÓcÂÀÏà «‰÷00Š!3¸a£çõñk#.cå.fˆ›—ù›Ç؃´ÞÐñfu%Éé0b$‘ÌÁ‘ŽTÓ!ÐÍAìtŒqÒ{<†íãôõ |ÆAز÷Ó±#¬çyœŽ7jç2‚1lø,†ç9¯G×ûé«ët½SÏàÙ0ñlÊ…}„œ ¿'XîIYŸÈE:¾li¾]Ïí(ÿư…†»òÑ5às+ȼÃ*z‰†Éã8õ,˜®|&ë1¥Å2\‚yf„à)Vûˆ!ȱTÆûXîcí/Ø“ð`iáÜ%ba4p¨ z¦8Èê@+W»€ÆB"Þuc\ÍÓG,¹ZÇ­¢Q®6÷Šq+‚ñR`IWwd´iÁ^»i^˜ z6ö“`ÿ’ª'-01¶É!-cŽÀXë‚Wïæpp6x¥˜+>6<›î)a,åexŠçCeM Ó%>µØ[k$á…ˆù-Þ{BëºRY¡Ö•7‡,ÛÆ,Î+“zØ9ædQwN„—œ¢ƒÙ­½¥K£2+Ʊx7~ƒëävŒ'œg¬Áaþd¤•0Oh˯ô*epÇÉPsNñ{,?¬NÖ⥄ÏG!]¥D¶l)Áø8´èŽÂÀ¶Ê©UNÝ™œº›³½xI/‰¹nµ²ð ¹B­‡‰«d¼ÛWyOhy_VLj‹û»‘¤™ÊUo7Áe»¢to“fp¨¸j:Hhg;'5ÇÂãL!i 8íDXF~K .ßeux Á{8[—ÿäCç@ÐÏ«p NÓÀ©D2•¬Õ_ ,“êC¥ÆàÙ L† •9‚·o2Æ(œ­‹Ð8•Ågu*û JÂÒ™„øâ€™ž-RR  *ïI ,3TλUjŸòy‡’Ÿw!ï £xã|@Àâé;Ùn¢`5/‹ðSªà؈ ¤µ¯Þnæ$×Óý¤5!Øt&Ü|p;Í'씲LJ¨ã%á/ÌH„Wþ£#6).¹‚¥0²&®I§+— ›ÍI¯.¹F£N:EŸ=…U $»= ÍËŒ÷ä‚Ýyé7dñ’t¨”Ý!+.I»±YC•ˆÎ±ô_¶…²ú’™eìªs%Ȩ&ÕÒr¼%‡Œ šÌ¡Ö b= —®µ–`gîëzZÓÿ*[ÌçÖö¬ÕÈRg[p¥µÅ¶r‘óµ¹]f¥ý^e(öyÏÏOÖIg‡Z¸EX5ÜkÐpMø`óu«vÜìiKfT¾‹ÈçI}U«.ƒ1_.WÊ#˜Ϯ˘ž­*©ÇpNmõ6SíL¨"dæ>ؕ㶘÷·êý[­G‘W¬ÖãýéÕ6¥0÷ZÙaw“<¸ŠY[ Õ­úV—®—Ä̼0ôj šž­èÍýu·f Þ<²´Ec\½3ñüb9¸ZmÑÕ5µE/ƶH^¾!äî¹Ó¬ dr«6‡œP¾A¨A´?dÚ• 鮢‹iÍx~»W!^w‰œªªÆ {c§Lã u&™ÏF4×dP¬K‘TŽH@mÔ6Y€ ïÜ ‹,®ëaÕöWµóìÔI(èrû’®ȧê‚`¢ï·¸+¡†n£ä 5Epu%#BŽaºàQ&0Lü ÇÆÇoB‘ÁbHpå,\ˆc~)©Ñ¼~ c\`Hæg±xŸ˜RC)Øò© ËæTµu3JÔ/ð ¶ 1[zê2zUtpà“U™z½÷f9í'gáÁMÁCQô5 Xk o²p<Tõœ¡í²ÝpÙèÀ»ýÍz\³ŽWŸüºù"H"ÚÚÃÐÃé­+û?K!ÉSò ïëþ¾ž/ßrÿПD×ÓEóùuÐ0ÑÇ£ï¸,ò³‰þ1õþ½‰!ŽîÃÀ’b¼oLuØ$“{¢ü¹1SˆÝÖG(.jDÀ;Ê¿OD!ãg„ Oºñvøž‡iViTš›)O¾€œ†+}÷øÔ2yŒø|7Š×Cð ª] ¦ f=ÄIgj!RuˆÖ@ÂI'ÚQôÆð[†{3qËV/ŒÎ‚),¬ãP¯“ 'П˜<›À7p‹ j3+®j¶?˜â¯r(쬜8'®ÆãÅÑÚ*”™¥RÁÞ$´3®Èz7<Ž_lGÆÚSõ.°1±¯¸Z2޾[YÙPL­3/Óª§I±ÉØwiÔò-”ÏE!…K³·ø¢Z áT Â„;"Œ”ùã Æ"XLt™*{®×b”e½j,ÚÒ@èϳJÞU"’Ñ2W¸òÖõ0F–žEY™÷ZÍÿ×;çõÎY†`wΕy×§Œ e©¯Ñ~ºƵ°?·c²¢GûÈ™ÐmÞaK ÿß5®'cÆ ¥ãqÅw€µ·ŽÆX²†°z.2Iæ0»ÍÛ]6ôoÞWò:5„õdhŸŒ5Ni ;·Æ)I²%m§ÛSgsV´|Ÿ3w¼Ï0¹N7‰_œËŠàÚ*NàÚ ™ÛªwÇBI*ÕKfuî§"Ùš=ciê? } çS ÛÍžŠuÙ/ñ¡ÃTWBùä$–*úÙ ŽŸÁïÁÄãܨêý&I[c‰)g%0¦ÒU*uáp=\˜`ÁÊ Uš 3wL!„dRüãTqB‰Q®Å™\&ÖeìÉDáÈb„ÃŽ™Ê­º‡L£’oçÊšT“Áå³F ФuG¸¬ª{ä@¥”à”*Æi|Cú¸ÌV÷oË—–}׎°­ªÙE‚G§5÷b 8bge¹äÄò>1Æ|ºN†ó=FË(¸ÃòN×ï…UnÂ!«ê¸ÕQ§à.áóŸÎÇ£j­q¦D®nFXô¸&øÔñg7 »ÃZv8Þ‰…î¡3FN¥ì7jœa¶?‰ÙAeþ¼/±aG°Ê­fEŒƒp5¢JêÖœ‰QZNšJBël9–Nç«!ºQ@T´éŒ=âc¨ûçF”¾¬¨u ÏgÔ0 s "‚cJÅ„|„IŒ|ßóÙ‚ë…ÑÜF)0CÞ?ºfÃYy²t}ƒÌ©c⸠˜ùË UN€mÀNT#¢U‚w•©kš‡•5¼q„×5q*eâ[F½R¶-tïx ¢¶JnÝ´)ïŽm¢ò£×g˜*I¸ábf›3l³r ‹Æg/zþy¼Òðžêðì`˜Ý¶Þˆ•¾àpŸXt+Íú+Í»g\+¹ÏyÆLE`ÒÈ|NÝÁLÇö€UÕÙ±3Ò¡•Ü4V=L#¨rߓ˜ÊuºÕ(p9!ΔâpaE0Ý j L] áèéßSüœ*y—ªzcºQé„×Y¹@í\$R×·àMî¤ó-–\v,ôüB烀-F²óõГFTeO&šñLj˜Gh”(™ +Z}»”ï"RN·ÁÝS‚ˆ)i"p]Ã> >> endobj 3505 0 obj << /Type /Annot /Subtype /Link /Rect [245.250000 611.750000 265.500000 618.500000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://pypi.org/project/doxypy/) >> >> endobj 3499 0 obj << /Type /Page /Parent 2 0 R /Contents 3506 0 R /Resources 3508 0 R /Annots 3509 0 R /MediaBox [0 0 595 842] >> endobj 3508 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R /F1499 1499 0 R >> /XObject << >> >> endobj 3509 0 obj [ 3504 0 R 3505 0 R ] endobj 3506 0 obj << /Length 3507 0 R /Filter /FlateDecode >> stream xœí]K·¾Ï¯˜sš¯~Ai¥ CAr0rì8aQ|ÈßÏÌök·»?²ûvM÷ -Ø’Åm²XU_U±X$ßýùË?ŽÿúýøîéËŽ?4¿?}9d§Âeõ?Ç˯ï^ÿ….OÍŸEéŽ?üzøvüvø|ø|þï·CýÁ—§¿žÿô¿£>þåüïÏÇïÿ~þË›ºüÀ¯‡Bçßyù½*ÔùOY÷ûåïÿ}øÛŽ¿]zl‡kˆyûÿß©\+W\È ýíÐNS½üúý‡ßïj,Åhk”=*kÎÿ©¬>þ÷Ÿ‡ŸÎ´Ýg§Ê*Uä¶È®¨Ð—‘´)JWg¶gÕh —_qºW+tnm¾^ç/”GçŠ2¹òö®.â=ÿt^æú¬À§23õÿ^ɪª•ƒëSIT+Š9·ÕŠ:t¡<:WZ1ÃÞWsy6p5«T¹·úþãwžgn½ÎkÊã³¥4î~Iç*w5³òj@÷ݯ!èÒ­g·kÊ£s¥‘ó¸÷ÏKzÁ¤xc‹ož?|=¼{VöìHT~üúÓEÝ^Æ|ùíë™)îøÝ% ÐåñëÇ?f™²:~ýùPríZë] üyB-™†-𭢎{ÃãxfúŽó¶ uE 0_>Îí[âê?#…ÛK÷æ‘6´Ñ·—éN¥½_{›çÉÞ®eo?´Ýg;E ´q܉í­'ŠÅ±êÍ=ò¦¥½_{[ºdo¯C üÆñ`ª·-mCxWL5nÁº#ä«7-íÝÚ[›Yi{Ëð ê²VgͰåå¼6Wp¾ábJ™6«É,ÚV“iOÖÔECñ¸“Ñ¥ºPÚ³ºiy*«,Ó’°¥v9eßIýæäl^3»ÇÄâo†7êwŸÃîaoº6â*;兺̰Wo5$ ܬ³¦Æ$a!@b=<òÏ~’ƒ“3ê çb¡¹Âéò /lñ";eh®¶ÊpÑ]ã¢æâmˆ0Û_Ãf»¨áŽŒ–çÕZ®qà–ZRËœ-/Ã¥q­Õãl­1Üyœ­(I[žgá q1-¿³ †;³ ªå:¼ YŽ“F¦¸ó0i×xZ^úMyÙ.àM=i¥ÛäCGL³šÊ=<£UO ?é—ÔÊXõ¦’8-Û‹Ü zƒÙõ }ã¡ S!Úš0b"ÙÖ™Þ1Õç Ò¦Ð8Ê|ƒ¨*–‚!ª3;Ð0Ob¯žõD*®É¸Nd!=Y´šS¯Òw8yF$Ü<‰QØÂä4=©Eb>8©>ÌgN9ã©ã1‹íò©{¾Á)àŠ?ƒ½-Ð;œ¯Æjͤ¤Ðj‘8™ßGÉ“Dö£¡ˆyßd#“5«†èò;÷eç-ã‚(ùÑù{Q;5RD4Î$¶ãRM!HhuA%Á7³!ÀÈvåØÒ³€†¬^Äž‚’$“ÃJx˜±Aè,“1®iÖÜDpzèùîdóK(©'†sLdÈ„åpœæÄZ¨ „}–§šÓ–SlÃz)¸1ëlϰþ´Q6ŽcËG".h«Œê5©ø­X}Ô¤à\{§³ž€r§¬2oMLÛe°$y3kn(;à®ÕΙ4&ÞZà® SZ²Óœ6¥&ˆ½ÕE RÒðì°`Ë|E °ålœÔ®;ãóâîT2‹Õ¸kFF‹= '¶|¨º &&T.̉¬è6ó¬¸M\¼·²äìÊ;Ƙ†ÔÖ+3ÛWÒzŠ`GøKŒŠ×8jFklfEXÁÕo[jhqj'oD›-Øà_Y˜z¸ê^P´ÀÔ71õgŒ¡Mƒ)¹Y{l }3oyA rbpƒEɰÂÈhÄͲ 8a¿¤lkVáÆkQ¨Ñ[jž ÕãêìPˆç;AIGšíjÌö ÷^˜g/O¦=hç^ÿÅ/‡/«=š¯!pn Qœ²O[ù×ù›Ûoå¯]Q:ê„°èÔÀ —0mDxãù§µž#ð|¥MàÛöÕ!iOåŠjè©¶ÆÂ°Ã¸LâÃȽµÃ¸0×aˆ™5Æß<èÉX+Ê‘1‰w¤<ªj2vÈ_4¡Tæ-(Ϋ—z{þu%jÉÚ›£ôè¨|ù7ͤ§¾©à7Ý6úpÍÕ\8Ñ[sGÖEvÃíú°å‰ ­6ùɼHûuKÝ[q2 êcŠê Ѧ*øMiÃã@ª1wÔúõèõ´tj Þ Ý³ ;z{{Å„8qÊ+¢^ ¶ µë•±§@ óÓ¶àÔÃÍêEF ±s¡*ƒXe6ânžD~[; ¡¸cý½¡ØbßuŸ ³]|+­Âø–Ìœô¥Ì‰‘wX!à” ×«xL^‡Þ‘Òínzq+˜ ¶€£õ¯W1m¼’-òúHYDæášU¹,¤ù ‰âŽ% Šž…Tv‘MHÙ-.»µ[ZuÃ2¶4ÚiÑ96®#5Eá^ ¾Ç(\«pµUÜ¢ÔïöÌJÑÀ&0Dä½('VâîÃíÓK§ýËÌs¢HÖΛp­`\;¿‘\?ñd³I› ´‚“Ń ×$z¶#E)Ù†Zwƒî¶€;:¥ºlÕ‡=n¨&qªeûcº ×1nÅ«u¤&tm] ;‘”ûËýyø¶¬ ÉÂÕpLÙ³0 ••ËØ«~âÉ^íÕ^áq®P¿d“]<›®<ô@½’´dúšJ½t'„éNˆFÉÜŒJ=ÉÕ|OPòßrºíÁ7¦©\™ÖH´Q¹}œ]$„ÕbFcÔI´Ž±Ÿ^B¾ò±WÓÙ ª´( —õ„ÕŒ{ÄàÄ c@qÒ«,f=>þ+Y¹Ð³ñîΗ0ymŒb‚¶È½çřʅ@c};WóD ³a|U}7³Oܰ¡^=?³š¹Ës34wQ/%À‡Ùpož½b|ˆ”¸V—1áãù„ÌL``u‡;,bìën»vhÝr?‰\û Î6ÉÚˆK…˜ä÷*nLÅvÆe<Š—}#YtßO<]*äÕm¡K…ðu“Á»¨§l)Q¹ì”)¶!òWÉÉÂvj‰CÔÕyb2bƒÆ„¬ùÊá°rcÃì|PW~à]JìH™{XdK'oî.óp7Iâ2y«&“t¤yªïÞR­ph"«~±œ¢(¾ËpUúfð}« @‡ü2U˜'äß ò/o¿­‚|ˆá5 €dÍhÏ’„ïÝâ{ õÛ0ŠÍŒúnF™ñz•Ùò‘ôÒ=KŠŠ÷b7£y+(¾uÞ3+á;á{ø.ÃÕÕžƒàª¯HMèÚºà Óæ"›¸9Å£²ÄTQDæÙŒ·‹™‚sÉJé~ « «÷‹U=£";ê³]Ae·NwÁîß«(Ù†é²0"™§Qùë_„é¤&DÊ!2Ý1Æj1£àQ«˜B(.Ò­ª³Pœ°*ŒÕjFµSŸ:u!„»*UNíÃ{*ÈQÏëZX Û@W¡fÔ:=Ö¡€ž%éP@:à[:\s( 76éP€··­ (l¸t0òi"½»‘k©{f¥ ×+.©$.áú„sÃ!t>£Ü³‘ð¸–ð·E!¿cV ®·\+þb7)ÅÜ0òËp‰¢~–DW¹ïÌu܉¶~ia©Â%pN2Ù´OýqqÛ¼þ˜pÁ–“<,Ô´SýÁÞý.õÇ…‹ˆœdêµ'h§úƒ×Qw©?e8ÎIêOGÐNõÇ=”þTY¸ ÃHÞ×´OýÁpܧþèpi@ó‡þtíS˜ÇKö¬?vÆó“’Ù±ž }ê ]<{gúSÌØó‘ÌÿôíSÌcåª*¼s`EíOGÐ>õÇ>”ýÉÏ| êO&øÀÁ+‚ö©?ø>^aýYô‡æÉQ ¶3cqITêtºm÷—`cy¼”3Mð0¯YØmO5¢ÊN®&§Wæµ4àt'×M}K¾ü›¦2wê› }cêôŒ2§B•Å›ÞêSpJ\eÞ¶Tpœè­—·4ÛÂSÔJYœL• xP¨üdT­}o;ÍÍS@¾áqšP§ô ÄÑêŠ okÄ«~5ÿÜcó‹ä‡ªWžÊsk/{íQƒ¿PðÛùS-l©ÅlOö…]cÿ0E#§‹»÷t‚Iz‚ …½áqjÚÎF¦mS0ÕXØÕšú÷ióÌ«Ì|~´±^S½šÁ2l‹¢eÍÖŠÊOÚ¼4ξg`È{þ Õ£;2ŒæPPǼˆjRš7­Ë¬öLÛ?,h-tÕÈcÀ¹5/M1ÃÐA2•²’Œ»!´Oƒrk¦ò:óxZÈsÖ M_S$»hƦB4®ì`›Õ¢;]ª¹±Å|¿ÀxÜÉc„È #ôãÉ n`#òÐ6XÜЛW"RYßkVE5ðšÍáÛ)«…g€-¶¨†À‡‘ÈÈ»¶–"3‡óí³5ÌÿÖ#ãÅ™€:Q¦•ÆU¦Ï㢈𪩸.¯êÄãÍ!àqp#¶)—°©•-l´â¼P*ͺ°Ü™uu'•—ƒ ,‰’±›-Q÷%5)Oöã"n&Žé óSMøÑ±aL‘ Š»X·† b` LfÉ2˜‘ŒÀpð ¹Cå­ Œoqs*Æ’Lì‚èbþ²ðŠðzEO茺B(ïqƒzÁ‰ÈÛ¬œp_²]ÀdÆöäKšhr*YB¤Nu¿¡={‹ðŠr™¡[7I'¶,Œá®¥6E)v-0Ï7[ƒE|É¢ Õ[©²µÝ$á‹ññxpÉSêF¼‘¢BuŽS-¸(—^ÁùÜ.©ÃÇ’‰{æ=óÁ<ÀòÁßàb¶Ð­¥2Ń:›QþŠ• ×zb–U|Ì]Z¢°ÑØüVl$.7ñ\B܇ë¹Ð°Þe6ë™›ÜpMrèõ³•/ij&K<šÅ\ÜÔænõîµÎjšpɵanýbîQ“¸Ü¤³sWMÜc1$NètcÆ$<ègÉÁ-ŒIÆàªz‰ ¢³?b0uùÞ „rþuüvæ¾W8ŸC?0#1UNâ[™Óyr¦ð¨í[ꦵìЉÕpÍ9}ÒuqÿÈrçãó±ù&Õ¯+¸jüˆÆ1¡å÷mÏÍL p*g•lOR‰mK÷Gl\ .ÎÁKé‰i(Üü¦YÔ¨ESuŽU¸ËŸÏ·”ã Öûå*€Õ&® 4ÙÉ^šlè+À> endobj 3525 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F8 8 0 R /F9 9 0 R >> /XObject << >> >> endobj 3526 0 obj [ ] endobj 3523 0 obj << /Length 3524 0 R /Filter /FlateDecode >> stream xœí]Ko举ûWô9Àöˆ¢DI@`=9Ì99»Ù‹ì"“=äï§Û¢d[ÒG‰ŸŠ%©ÝcìÚnZYï*VßýñËßOÿüíôîý—ÿœ~ðßßyÈÎU™µÿNׯï^~×gÿó©ªËÓ¿<|;}{øüðùòÿoí_ÞÿùòÓÿNùéO—ÿ~>ýõo—ôtýƒ_*S]¾ÿûé{S™ËOYÿýúù¿þò»Ó¯×»×ùżþý;ã¬Éëë2f^ýí¡Û¦yúúí‡_Þµˆ{‹Í]^º“)lq2M‘Ÿþû‡Ÿ./xž>;7¹)]íòËÏufÛ_ÙWVùõÆ•'“7ÙÉ5£W¶ÈLoL^_á•jò§•‹CÅXg³ŸkçÿÁŸÉw××7u}¡1SŸ&ÞÜÆT®¨²5”ü½Ê4U‹šüò©8rž§O€ùªÈ‹t“?­\*ž¬³K"·¨\JäöÓ§€•Ù„”s]y2äâÙÓÊŒª*+ ™ÑãQcmä}ûzY·¹üv5Ž/Vü×O¿Ï²2ÿÃéëÏÍùb0wklGòdŸàÈG8RÏŒ|üz^²ÛÂIlüŽX8Û÷hÄ:8Û{8×fàlæQÀeVìÀ¦ŠVW m†S4¨Þ]éq‚ßã×–X½llŠY`6©Ïæ4%àªííEʤÝÄö A„5&è9–R’ ‰ÀxSB´“ ÖTkäÞÞ{Eî_¹ H¶›w˜°-gcŒRÌl³´­#ÍR!Ń^G–$ÞDœ°&¨Dã½,)²Y`1ÙÆÝK™Û (aÈýx{VÏýêÀ²øÂ% ¸±„-`ÝšÒL)+‡Ð“6Ó”fÎ*k·Ú°—€ê É Áljdl@l›}¯)iõ‘B°îlœ J:Þƒ¥ó'MI«&|M¬-/nˆ‡zY_;mta!Ñãñ@ßë”=~ÎCW’èú ÁÑ>ÆQ=5ör[ôyú6ì˜N_ÿ"èQi ß«“së¶ ¬Ý1ýÀ®#IL,-yªyºXøÐFÃ,îyÜæ+–ZTšüºn©šöº¥Z#ΞV×-UC`÷´Z–+–ºÛ`}Oß«¶g4\Oß –ŠEøö´˜ãa­8•ôüº ô@`&ì„Ìëç‚KQ³å˜üæˆLIVõäËhßú±z/·÷„”ãy›½NYƹS;Y×*ê=Œ¿@¾ª¿² ôo„Ý;\fóI®bU†“\5åÜ¢ït¹“?K¶wÏh˜•%‹¨D#ù´ç×|>ùôÂ-9³QúK#RÑËŸDˆ¼©”ë^š¥ÖÛÊHF¬H'ªµ¨£k¦^:óé¼; SÌÔÀX?èZmK|ÏTY!iט×ÔJpÉö§†ajìÊïÕyêå\•%ãMf ­¼Á®£. ×¬^\IsÛ¦^õò'í&â”ý^‡z)Ó,HreLÏ9fS’ [m/в-µ±±ØKŒuÆŒCä‚¢cº»l˜AIj.@¤,úXím3gæSLhzvR3Ùö0³ ¡fë6ŠRs%€ ©©Zq½r{8¨¢Êãv>%“ÙÖTˆo½[nXQ,ˆZÉf,í#ƒ/Š kŠr±q?M;k02qW‚‚ÇIß½ÜvóéÉ7 à»ø h¨‘Ål?¹¸÷hoöZ`)ßIËÕŒ7 $wÐõ‚Dù9çdjD3ç%Õ&´N|Ul…^šXª9¿GÕu®Ã#–f:2«Ê$bï)0) N†"Íxã´¸NÒ®Éë`±Xw«ÍK@» }c—YaÊš£S%)£¿ñ{]çÖu½<]…üÀÑ+°fÿïͶ'D?§bö²±\ŒŽ—ʰ.#ÍW•§«€YP]àØÏ¬¦V’2«@B…¶Ž—5ÑË,}`Ým@/çª)çJ ¿#r ^‚Hâ&–PKsÙÚqè½»â€Mzm³ ùTŒI3+jÝöð½UŒaµÛ{”:‰^gÙ,°µÑŒåº ˜lãŒRÐŒ.ÙøŠ"X_· á–ûoQ $Kò©íL967pâ–Zô2k€ß|ä^έŸ'ú;K³kÌ"02Ñbf㘩‰CÕŽÝu1Ÿª/—MUŸL3µšÜË‘¾É´00Ù¹l—ó¼˜d­¶)Ϲk‡†Â]ê™=ãû0s.[•cÖ˜1-TgÛd¯g3í ;[ÓbäY½øžOhÕø=x?æ#ñ¸j“Ãg,\ƒ#bD‰X¤h9¤é"lgÎT#Ä{bÉÏÅœFl^t/žùØÃU¦¾ ·61‚g³ø™g¢,Ü‘À ð3bÒ¿>]{èLɬ!U—AßI {¶Åkúì¤ÄxÄs¼;»‘d)à3 zÆøgŠóˆ>;ùnóÚ¼æ·GôL'%&f+áˆCkëP5ÞO‡ÞñH'Y&Ö†W G¼,¨ÎM=\…ÍÐl¹Xo¿0ÇWYßÂÉ#Þ”çl ½N¬ÏõHœæp¤‚#¯½¡RŽÉÈ*î=x¤%0Û±õ’g<éÅíÇ@ÉaíÍ«©Ù ¹ûÊC ƒΆéà%þzhkLØôœÚâÉA€^ŽEmÃ{ZSà"ˆ)À6nÎQX5&ô9–Nì€Wn ±rì7Sb?4Žž;Ma…¢½´H&8BBˆ`a¯ ëáô AW^Èo@dPèá…cŽ ðª¬*%„x@–?¦òÃr> ð jÈÖÄÚ:ÈyÌĘ®ñ~ Qç*ë%, JèÔ{"ìl_À3Ów`ëX¨7HY{xú²1•=þ4 h ³Œ1ÿ^„´ ¶=a‡‚ lFeéõ§¹,l @µLtÚÛJÂ1;Vóî0b¿œ±±q„A ×fáÚRãÚ¯ÔukSS¾;ö}}(8 nàúÜ"‚Eql~”Дìës¥Ôâe1 …ÀÁ æÍï@ù󠪬7œ6I-£7ÂZalFþâm` Šêü½È‹ÄÛXó¢€ÕÒ†ØÁñ“:0˜Ó°Þa‚# “0,7Ú:¤l…1®.AÔ8ÇK:ê² Ž‰áÀÙ µ§kFÚST2`Æ)JQ‚–uÏ·H‹b!†·†’9ƒAÙsÊÚ¥»Ì©¨–ÑÄ oïj§@jyËŒä(œGX¶"€ÈPdŒ(=”™¦t:M#€1Ð"ŽI¶³Ø°-ÌXÖØ‘‘Âè¸Ù˜Ï ÇQ!læº|nJ*¶–,eéXDÁô1“ZŸ –[„·²ÃƒÍ ír °*™3VJ›Û¡Xy„¤€ƒc˜|ÒzõZñó&%Ê]Ÿ€,—/©]S|Ü8\ãcb_ vÄqX%2i-¢I( Ð.ã53Är–¶ç˜3¯†ÞÔ!¡Ö¬Ë¡1®“Q—_)A”{>Ád‚<%N&ø>`÷0ZìÖ­µ3€Ñ’0cÕΤ0É–»ìð„~¸$&9L–kv ‰vÞ´y3ÔM.ŠHì’OoSˆŸ5]pk!FÀgsý¨e ÿ-"ä¾YQl! .ì ,6"XÅœåÈOßX]×®³¨ï%Òûò"Ë<¨¤=' ë´â¯†Zú^|zvUH1îðšqÈf,÷ŽÅá胈@ÙÈ/Â%¹„_.f–5ÆD¡%’¼Ô¥Ù#­„B¥é::<"šãCñ“E q–“%,›`‰ý&"ÙYÖ™ÅI-Ê¡N¼û„j>áæ!œÄVÀ@,š4AY(¢Íˆ$âÆ‰VFÑqû•Í*|Díí⣔ÀœªV­ÈÎmMâJ²Àõ>øz(|-<ˆ-ð/|Æj\£ØA±hf׃G<õL@Ããl?¢³;W¯ØÁ» ̆o|ÃW@Á‹Ï‡õxÄ-qÔE€š®+e {šWÙÍÜÒ=<­§{¡½Ð,[éøÁ¹•ú¶=/VŠSOðu“ý­¸ Vˆo½125oJ3vŒ­1y$§«‹ÛÃóFàŽUâÁ‰ !qâ“–ô³ð²e[(JŽçv †-ÛgöS+Õ¸Q²[i¯Ñ5|â]\ºàœ”UU‘™×šÂÒ}UQvÊiEá8OùFj¶ŽT^ˆ'`àKdÕš}¼¹Pw ¨ƒyã6}¨0£fÜçzÙÔ¬zûÌA1_ú*çÚ”®vµzy-¯Æ–¬N¶Ðï|±»ß¹{¿³,ÖDköm,ÝâhÍ=ÚxÈhcY¯‰›ì=Úè²U1ƒ{Th÷Q!—¯Šµ(Ú'®XkÑŒ 9gÖÈ„7rõCI£BõézÞTÏä§ÅTÅÀtœ¸í¾+ xµ3q?}îà3 zÆgâšjì¨}B³Y¸jüŒ'ª©øÄäâ<ŠŒåh$ðžÎý‡ ¼‰:5’¡x‚¯ÎM=„ÜO`m­s˜”]2µSƒV€÷X›VxÕtš€ ‰ŠDÿÐÈ'q2x †SÚ¶b ’Èõ¥šrlN²0 ‚À͉‰þL1°HЦU"ˆ)Û—t,”êWŽÖc´¨ëÞ9x¢58Ì%Ë%·pq #Ÿµ*wkk_ã]ªr×Å?ÃTîf½ÞîŽ Àq …Õ†]'û‰Xÿ‰+wqÍh ×;ÂJä@õ$®Zmà3¢UšZL\Y¡ë€XÀ;…¤ÛjÎC]™×$gmÜ®4j±TÀÍÚŽ2fQÓ!sõ–DžH=¢×àPÕ2©@6ï-¨Qa¬•5ŦGº©iû¼ IuüäËøRVƒfåP¿1ÁѬ6µ|£=K‘ÄwY‰zyLÙ4uÁ'.Ü–½¬cŽH»Ž‰ŠVSŠ_Røfš„PA †+™Û6™ük‰TOa[…·jÓ ›+^ëÛ·ÝÙd® DûD­fÇ·ß=!­[+Ûñ'ÆàQºžŠé/ƨ¾ñùqáŸìUŠ 7s­°Û¢M/¬eÿ¥8©KzÓ{5÷¡OÐvÐþ»¼Ìé^Do~Ñx¦°xR’Ù1wèŠ_Žô$s]q3Cª17¨ãÛ"[nÜ9o³Øž—Ä´2'Ô"[Ž¢1å–»½+e@ÕÞDØþÚ&ar½»’’ú­8oÃkÙõE› Öï1ò¨¹l»p1nÇ­ûÄÅO)n˜)EÝ[BÜ‚2¶ á’\½¬¬‡zß?Ì$ÚÚs<¤ñ­Ù"¡é›?1%Ó%,U ´;ÀE™°X—¤1 dgcŠüñ{Å˰MÞÅ+ÀE~¸8Ÿ„l_Ú Û°Í´tÀ…¤EÍŠ•Í‚æi%†"äô@›L±øÜXŸÝ1 "˜tѦ t¨r^f?Lé>C˜7ál™[ùxüèðÙ‚Ö>ƒûÆò2 û°Fųíˆ !û¬Nê,›/¼àCÓ"œ-€GüžÛÓGu–/ì ÍNÂG–uVõ}\´ÂuLàfÅMÃZ ë÷@Gª ®šF|èÈŽÞ|U§p_U†Ó˜ F­ pt¾WÊS5c‡ZlÇ(bnÛ ô˜[ÿ°Vé‹!Q^ˆïâ<­[—ë^JZÝÏÁ„•nM“m¡±wjõ%éOÜôɰBN¨ ›¶¯È ]8N,cl«y×kóN@·Ò‚dû n­”“É Æ$Ãø^„Ð èå÷LW¥šePˆ•5}W`†ï‰\z*CP)ã<8BÀ ÷”©$…`1a&nâÂö$ Ãi£Ú¹ÉÐ+ñá >Ü"Ž×йp~\÷i\I—ãýŽNðq!¾³`n¶„|còÍV=nd;¼z8Àä˽{å}ÌdL]wOD«_mloܾßø Ówhky{ª«Û4‚;´z·Á~o¸O^ ïÑÃϺDõ¯»ÑÞ‡ YÉfõ€—ºöê4{â~‹°£`L·C¦¯#îxï9Ùí'½CgªU­ß7¯o’}OÀî",m4É08R-^€R˜Þ–DHæð.pܦ)w&œ*&Úê¹=TÖ`j”R'Ï• %mïˆjl"Ú $I߬¸ð6C¦x„9˜¸ßù±ƒd êJ´‰ÍËHÂåëôíÂêAIðyzÒMºPÂÅ÷¾,ïé¯vG´ñ®À ­šŸóÖ ân<â¯&Ë'nö2> ÷Ø9e7µ¶O~§èsÅPDàhÚÔÅT9œ¾š± &¶aðlðOÐ&jë/ŽÂX‚»þœ=`3¶ÇÁ$c8@°¼ÛÏÇ¢e‚<1„0-XL%5ÄÞO= Bob-7 $Ü—õC,ÙT™={‘³~Jˆ‰ü¥ð¼§Ïÿ˜Dòœ endstream endobj 3524 0 obj 5163 endobj 3528 0 obj [169 /XYZ 38.2500000 757.250000 0] endobj 3529 0 obj [169 /XYZ 32.2500000 159.500000 0] endobj 3530 0 obj [169 /XYZ 31.5000000 569.750000 0] endobj 3531 0 obj [169 /XYZ 32.2500000 568.250000 0] endobj 3532 0 obj [169 /XYZ 31.5000000 332.750000 0] endobj 3533 0 obj [169 /XYZ 38.2500000 757.250000 0] endobj 3534 0 obj [169 /XYZ 31.5000000 161 0] endobj 3535 0 obj [169 /XYZ 31.5000000 78.5000000 0] endobj 3536 0 obj [169 /XYZ 32.2500000 77 0] endobj 3537 0 obj [169 /XYZ 31.5000000 332.750000 0] endobj 3538 0 obj << /Type /Annot /Subtype /Link /Rect [60 296.750000 91.5000000 303.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_nn2 >> endobj 3539 0 obj << /Type /Annot /Subtype /Link /Rect [60 290 141.750000 296.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_suppression >> endobj 3540 0 obj << /Type /Annot /Subtype /Link /Rect [60 282.500000 123.750000 289.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_nn4 >> endobj 3541 0 obj << /Type /Annot /Subtype /Link /Rect [60 275.750000 132 282.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_nn5 >> endobj 3542 0 obj << /Type /Annot /Subtype /Link /Rect [60 268.250000 108 275 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_symbolic_symbols >> endobj 3543 0 obj << /Type /Annot /Subtype /Link /Rect [60 261.500000 94.5000000 268.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_nn6 >> endobj 3544 0 obj << /Type /Annot /Subtype /Link /Rect [60 254 110.250000 260.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_nn7 >> endobj 3545 0 obj << /Type /Annot /Subtype /Link /Rect [60 247.250000 120.750000 254 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_nn8 >> endobj 3546 0 obj << /Type /Annot /Subtype /Link /Rect [60 239.750000 131.250000 246.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_nn9 >> endobj 3547 0 obj << /Type /Annot /Subtype /Link /Rect [87 233 168.750000 239.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_nn10 >> endobj 3548 0 obj << /Type /Annot /Subtype /Link /Rect [87 225.500000 150 232.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_nn11 >> endobj 3549 0 obj << /Type /Annot /Subtype /Link /Rect [87 218.750000 150.750000 225.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_nn12 >> endobj 3550 0 obj << /Type /Annot /Subtype /Link /Rect [87 211.250000 169.500000 218 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_nn13 >> endobj 3551 0 obj << /Type /Annot /Subtype /Link /Rect [87 204.500000 158.250000 211.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_nn14 >> endobj 3552 0 obj << /Type /Annot /Subtype /Link /Rect [87 197 167.250000 203.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_doxygen >> endobj 3553 0 obj << /Type /Annot /Subtype /Link /Rect [87 190.250000 183 197 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_nn15 >> endobj 3554 0 obj << /Type /Annot /Subtype /Link /Rect [87 182.750000 147.750000 189.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_nn16 >> endobj 3555 0 obj << /Type /Annot /Subtype /Link /Rect [60 176 78.7500000 182.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_nn17 >> endobj 3527 0 obj << /Type /Page /Parent 2 0 R /Contents 3556 0 R /Resources 3558 0 R /Annots 3559 0 R /MediaBox [0 0 595 842] >> endobj 3558 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F8 8 0 R /F9 9 0 R /F1700 1700 0 R >> /XObject << >> >> endobj 3559 0 obj [ 3538 0 R 3539 0 R 3540 0 R 3541 0 R 3542 0 R 3543 0 R 3544 0 R 3545 0 R 3546 0 R 3547 0 R 3548 0 R 3549 0 R 3550 0 R 3551 0 R 3552 0 R 3553 0 R 3554 0 R 3555 0 R ] endobj 3556 0 obj << /Length 3557 0 R /Filter /FlateDecode >> stream xœí]K¯ä¸uÞß_QkS#>$’€`ºoßYhôYYí8Ã62ñ"?R‰Ò-‘ú(ñÔ!Uu»¦aw—(ñyÞ<ŸÿùÛžþû§Ÿ?ûŸÓwÿ÷ço/ÍÙ´ÍøßiøóÓõiÏþß'cÛÓ÷¿½ü~úýåëË×þÿ?øöù_ûýßIžþ¥ÿß_NÿþýÃ?ù—†þöb„éÿþëåogDÿ¯fþ{xþÛË¿ýáô÷¡Çi8?™åïŸD§ç†il ýûË´LqùóïùyÜ€¼Q”´ÂÙ“ÐJŸ„Óòô¿ÿõòç~€©ûæl;itÛô/¡7r]„tÍ©‹Ç¾üáé]è\¶º\ç—™soŠPHv^ú´uÓ[Öš{6÷^â@t¿]å:fν)ÓiÃÎKŸv«TÁÓž{/q ­u;f^ê´açý©úÿ࿉CÛa\Û˜ž{Z¡*N a:mš[˜Õ¸wÎLD·_'ÿѼwÏß¹%éÓeæì»2AîýlµÊ ̰?èá[keÿo£ü7nZký¦µ$„«î t®šrTdœ9û®øOôÞ)\׫á¿o #NYéH¥‘ãÓ*>²¨Ó»´*y­UÉ“>ÅšÕMhtÙÜAd”+›{~j©Wú>`ûš÷í“~ûD3NM®'ªz øÛ£œ™ÕåÎ,èûžÎ¬gâ§ë‰>Ô™•À³5`¸sã’u^nšäc ]?Žyž7žÚô«îÁ•Uÿ\¯!@±­¬™Á¹ÖLW@Ìž{ç—áUÓÈ‚ÚÇeæÜ›2é°ó¢p¦!B8£¡x´ïØ´bqOÀO¿¾üü&ô êu§_ÿÜïÊ8æå¯_ûÃhO? Öb!O¿þéôǦúŸN¿þåÅ;ÙNSÜj‘Ÿá7¶t¨EÁù µ4¿pέãH¼pxnx„Í_O£`ËØ‚{ƒ3À³Æ½Q Š·%ðáÍåï[â|ÞòOÃi=w ñx= ñÍkþ)`Z• ‰ª§€1ëpJžh؈¡*£øäãÎ%`ÆxI bÇ•~ùµmŠK%J<¥’‡ Ñ ©CþÂrŸq »&fMÀÚ§TòCI%OˆJ?Oéç)ý$¥{nMô‘Ý(ú¸YôJ4çvœÎ;YÔÒŒàÚže76½Óå#Þà7~3‚‘çÖ)ÓÆˆ¹Ò›p°E\Zº³㉄ß0’Eus9%]°€~iº³ýÚÞ—6n®=[×Û1¢}'"x à·‚×Z lqHŸµ2Ë k4lÁãØ`²‰N¢WáL¤ƒ»gâé‰Ý3i8°j[Íz‰êü<·Ä7Á Jè ?åL=hσñÞÝÁè !Ä35áþž3MÌ ¯GL´°3bId<•lÏMHY½h#äÔt<¡P¯pSÂNði4-: ÊìÅ+üÓ’I04§¥À7ŠýÜ rÀV¹€’`€Õ‰q0ÜBzœÀjmjšöm¼‚‚ïy)/ *ï‡ÉSö/! a|Ç\·zKÌ S†ÑΆ¨øöBQœhY݆r;F XÕyJî”S!LÍŠX(|DzLB’…4U¨|é*ƒn),ýp"MJ÷O Óp¼â„æH‘Ô~®…I78VÓ_K£ãdoèÚiÈ6+å[¸-¼Ò$‹Ñ†QDf úT¿²dÇ£`_ÕŠSŠe¶Ü´\K¯" <\`SV´j±è]IÒ®lHÛŸ’Ö‘´{‰(ØîˆO¶$Ø(Öb¡¥ ‹¬‚ Ë3XA‘#Ù~ã2¬ôÓû¥¬Ýq°&Á®÷Ÿ-/Ö0ƒh‹Ç„—Qš/k…rÚ|Œr3ïÑ‹ÉCCâÛ|‘?î Ïšâ—ð,ƾ°·Ä °çÅ›lk=e(!ZEÅÜR ËbF=Q(€¡›bÂd]àz6]îñËÂìd˜²í‡#*ÖKã½ Þtœ(I/etlô%t¥ÃïA «€b¸Ž½’ð«Ø¿Mð¦` l‰,´¼¦¹ØbmK±Cþ£3ŽgÁ”è4Ø›:œ1%<±Ç.<…„°:öǬÇDà–;ZÒ©§!ô?ïÇWwª‹èÉ àRBb ?âs*…šG¦léÀÎN£îŸ—Þ{DÏý—Þ÷zÏ’`î¶•!ÒBrÝ¡(LŠPGbíÑÌý‡075ª]ç“eXÎ%-E[SmŠf²÷w9«¿T ª>._+·˼XÊ'!þ¨„8kwÖÙ°¶MÐ'Ú6†JüòCÚÚ<ëYsñF]?­É;íôr ׌¬q2åaˆý8à¦$,Øxå’p²£rÂ߆×U˜Eâc1„Trç©æ…׃/(>[‘‡b‘«´ù¥ýÿ(û÷HÎÊ LÃãPìR%ࡤ_˜9ò†îïg@$´ ˜½ñ xù e¤lû*å^œÌÁK§ˆ7¼¹K(»C¸k¸ÁmžÃ2cún‘e&’”Ťî‘r¼ˆ÷5qõþªËŸ‰W³WZ$î ¶Äë*ž6ÈÆªK ñ¬,TY#Ö¡ªô°m8,Æo [ 8<9á‚m XË¡ŒQ`Ìág”€EÜÛ~a–”£Û£ÜýàY³\±S$‘ÎöpŽÏ« “ÚDPÌš·„$ÒìWv)YÞHÆÛJ¨ì¨ëC®È}-ÄçÕäc¦ôy™® â&KêBü'И5-qº¦ì;΃ z¬F‡„NÎAny#`vý€ŸÃÙ–Q’I±aål<œ¢x=‡ÆÓAG~gC²üôÜ öÈkÔm×-Qàé¹óôÜÉÞÇôÜIxá`ìåE±ß ¥òŽy!ÔÅ¢„ëR`'±£¸c ¡ÖFƒ {á`Ì¡Ä%ÖS^…éäT_@)$’ÂA±\ƒ/UXe»ûÉæÅ6¥Â$ Yò)f§ãs‘ÕÀªùVðúôdèf%WÑÄæà9î céždDÝOc*§#XÛ%B&¥CÒAo™VŒâ:Hò&£Ø‚Šv´Ý$Ÿ˜(ö⦳ßâ“ðÒä­ÎAI‚vTšZÆ¡ :£%ÜYÖÄ» Ûîb5<Ü'H,x¥dDìc×ÂoÊFÇmx£ï³Ž3‹z(ú,’^x¨0Å3˜Õt›s=G‰I¢âˆ9ÈÈÍß^e•x %Ù'É›q‡é(ÕÇŽonFQÊ7ÍæxjµŒ4Ì)J¤Æ/j„otÈG)¤‡ª…ÓS \,YMX2e°á©ˆ)BcFµ„.˜¨\%(NÿÌÁ>%ʨ®Y$­ íJ%Á«T±é\»ÜÕÇž¤^¿¢ÆÙiÈ_f²1®)D¢•½ÝÙ§ºØõCߨq·{(ŸŸHÔ‹'ræìlØÿüfäuBŸÃÌâ lQh¶¸7 [ðÚëù”ßþãÅ£µqðŽN11~°UlD,­ !¸ƒ»‹áˆrНpwá8‰Þðî¯z鵜¦ÉàhZŠx{Ç!Ó¼e|xKA±Ì"mqFŽÞ V—ÒiàqxåABbV’®D)OI¹”¤à8ëU´Äf"¬Üò:l— yÆJ IUÆÄ‚YŽs %…ÁÍ ¼^ÕŠ6àŽÌ¡&,ék*E¿ï[s7ª|Ö8¤Â»’J1Îý0l%a:'$°!äfuuŒí˜2e$l*œí& >þ¢e(¨å¸pVº`H„:DÞ¹QMÎH£¨IG›€³)ƒú·C¤¤W8˜„"€72ƒxTjAŠžÒýøÞ%$ÝM žýÐU0xurÚ¨Ã6’)óƒÉ7<¡#¼ÖGìcÁR„1®dîúVÈ@*]I¨’EÊI [¤”¬®s÷¬´ò^¯æ„plçº<œý—Žo©•9œ¥à&敜–/$ñQ"l »åñFF?˜#ŽélÀPs–0‘*œB¦’wb† ‰·/sÙ‚13çZ5£˜2¥ÂK¼3G ãã+S´H´gN·ÁêõKeŠ›âDèÅþKNžKbV½…9\½¼xÊp|›úIqè l/é–¦–ãH5³™ÛÛN¹åÇÂÁP(²g"ë(JLâ~·µtnÞ¨jRË tϱ\GeuM¼ŽH,ÚsãÔrœËÊ‹±rjºI(¦ãÖ³k·=Mʽáþ˜a¼ 8ÈþŠqáÙ—*e1ÄÖ‰L­¯uÿ¡‹%½‰¤ ±}¿ü•´Z"á=_¶>æ]Í#[û?ޏD /½%lö‘ô¥G`ñòCÒ:ö»0[Õ¿o9Ô½Èg@xg›Ç_@Ô ¡},0e˹纚9iX²˜°øôì_Ž|»?FôÑq„»”qö{ÄqÖ7HÛ?Z½œ÷Š¡È +¼|S5ZÃm·!ô­µ`€†½ùŒòk³†ãx“ÅÚ8¸0'±R¼;Ÿ8{Ã'‡×ƒÇñÃ5‰ÎZAñwåk-xGyOACñ¾;Ë1;Ü.ˆÇð†\º|LÁ&* ÝÀô—{ ×Sø%vçËd¸iPK«PË|ZQ‹†-€-¶Øüðö&àîxxÉGâ¹}Î_Â3€ß87OQòvç\)lÁ3HìŽ$œ6ax¥ âÇ·ÔÁtÙm®¡Å»1Ý‹•y‹¿yÍßy‰¡Ó åø´ðÜ ž%f@Ø\B*DZ†r¼o8À¸ {Kд·ó©ƒgº½Ïàº1½LÐ>ÌQqoð´Tž@ûTÍ3éô-g‚wÃ"ì-qŽxœÈ¬Ú\–<½´Z\åvBÙå‘~•«M uó3lÁʯÿíub¥mþùà•*l€"Ì+Ö¸7MPDñ^oZÿ°9zm<6/¡mâ"ܜۉ Öâ–§ZûTkŸjí=‰RìPMÅùH·w>YçÐâÝ~ªæOÕüOÕ|nj[7Ÿê|‰sìLís|šJœ£Ý6I×0¤£œÒ³2½ü8¢)^Y ßËó6R†ü;L¡x‹9BHHhM ‡Ù(â8K-ÞŒ?ÌY¶Y—~<úäÄYÑy*Øï:±yÞ¤=%ä;¢Èç$ñ’K˜EÈ¢ÛüJ¦îd usð°8ª)¹÷{Y™V³;ü1gãVÑ­´4[J¯jβƒY•¨7ïY6ìF|3²Lá"u8ab‚ßH؂ףÆqdwáJkëû–h»“˜õÖ .P„Áä¾D _Fž0qâ<,úoóoy¶¶9™føËaǧúÔ¹ó(™7Ó“ï/= áä‡{zË\÷2ýÇèß÷¿›á³Sðµuáý“ï/ÁLúgÓLÇ^–ëøþòÛ˧?,öDD{"öáœÈˆµ×#Ò9³M(V}B6Љ¡ŽÖ0Ó>`³ßÎËnZ›¢³×þúòí6¨o{2 õ­+Pß @äð$„úË[溗éW³€ú¶q+Pß66£BýðÌÏÔ÷²\DZPߊnIfWX%){(Æ”ã³ÞȦVò x`l‘¢$äd)ÌXf/]i{†:b¿jÔõƒÛéŠtKº¢š5ºÒËmÎ÷O"º2¼e®{ñ¿ü3]‘v®HŽÑ?‰èJÿl𹽦+ó‡Ò5GN9(œc|ÇŽç{%ŠÃS‘‰rCHý{×DÝæÑÕyÌ•íâÁí4AÛ%MÐn&´"Ä×þID†·Ìu/Ó/»¤ Ú¬ÑÝ…côO"šÐ?›fj®iÂ<Æ¡4á=ã –°·90¡L×ñ…µGºÚM,Úv"Æ\?¸XtfI,z ^!¦ Ù41±03yð½L¿Ì’XtݱèÚpŒþID,úgÓL»kb1q(±0“ [÷b_ •‰û¬…S$ŠH ß/â·œL~kô„BB^?¸…l·D!kÖP(²6µkS€Ã[溗éW·D!Û®¡ ­fÓ…úgÓLÛkšÇ8…œœøqŸ{ö‡¥pFC»AÙ©ÉLeºë7ƒr×´ Pîšn”»È„Ô]LHK`¼¼e®{™~µ Pî½Ê]šÂ†'!(Ϧ™ê+P~ãHPîÄ|×ó˜fªýž<¥e({A0T'¾Éã)3Oq×nGD©—ˆ(Û5DŒl.ÝÅæ Òð–¹îeú¥—ˆ(Õ"ÊÐv4<‰±6ÍT]#â<Æ¡ˆ¨f85w¦äÙj(•E0§Úºðdòtæ­Y‘àð[޹»ÑZMW”Rw×nGk­–h­õZGf“îb6 sxË\÷2ýRK´Ör ­uhþžDhÝ?›f*¯ÑzãP´ÖsyŽÇ䯄ry”‚ß$7AJlá~&A(s£ˆò EønjÑNW»Ò, Ô"I„ßï&)b~ .ø,´ôÈ8>mû'£ìôä{ÿQã{~K¹E7ÓOéqv~ .(vÐDÃ\> &3¼¥—Ýèå0¿Ô²em7’†nNšE‰˜å½‚Ì|¨”Žœ‚u”Y“ žq¨>Òšü@H«•hy%Œ³• jÍ·ÝI“¸Àÿt/¬RÉXR)À0òò’lX­A>ôä. ´¹~°›|´& ­]#‘MÒx›äû»wz1u3ý4ùh»5òцÖáID>.oée7z9̡䣛}Ð:õÏceÁc‘902·uˆF™£Ó³ÌÑ\?ØM4L cÖˆFd34Þf¸Àùá-O¦n¦Ÿ]@4L»F4LhžDDãò–^v£—ÃJ4ìäu' ¨=KÝßE­Èù„¢bF´•7Wâ~â5„õB˜E¨×C©¡> endobj 3560 0 obj << /Type /Page /Parent 2 0 R /Contents 3566 0 R /Resources 3568 0 R /Annots 3569 0 R /MediaBox [0 0 595 842] >> endobj 3568 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1409 1409 0 R /F1700 1700 0 R /F8 8 0 R >> /XObject << >> >> endobj 3569 0 obj [ 3565 0 R ] endobj 3566 0 obj << /Length 3567 0 R /Filter /FlateDecode >> stream xœí]I䶾ׯ¨s×pÓevþòëéëùëéãécýÿ¯§æOïþZÿô¿³9ÿ¥þïçó¯?ü±ý£ëüz*tQÿåö½*tý“º¿~þïÓßþpþí:c÷ºv1¯ÿNç™*Ôu#¯þzê¶©o_¿ùíô¦À¼·X«´Sgí¬;ëÊ™óÿyú©~A7½º”¹)\¦ªþL¾¼0··WÙY›ª†Þ{÷íKfvarSÿmòÛÊ¥¢m®ƒ“_*§u‘»ëÎx´jv`iÀS¿L>÷Ùcßé<Þä·•K¥;Y8¹äɺ¼jÁcm èß§0y®tD¼¹®\*ÝÙâÙ%7/l ú…1àßMþU‘no+‡Jw¸xvÁÃÕÊ”-€²¾¨D/¦0¹.â±…fåâPi70{­FµÿàÏä»Ëë‹MYÔº.ÏÉ;mkŽ++"œ×}öÈàT<Å®Y¹4P:Dƒ“Ç>m—™ˆ§}Ÿ=Æd*"Óº­<ÖiÃÉ%EF–«ˆ'{Ÿ=ðóˆj|³òX' '—<Ù£j#ñµÞ÷qÎÍ'À/ù5ðàÛϧ7OµŸŸ?ÿTƒ¤yáíÛç_O®þåê–ʲóçÏTÊV:þù¤Õ%/tYd·¿»èò6b/™Ë¯SFÔ»Ûˆ»8Û¸~ï#¦Ѻ{èy6s)/e¥rój¶·‘ìbM}¼¯F øLןÑ9œ îGëf?¶[Üó3x? ÜJü†E`3Þ‡§‚/ÆKzëOW‚áH<8IG˜óÂø‡±ÌN†yÿOákGœ>~±“D<[`~Óq¶÷§xõ²˜/x ³/f6âœFñáÃçZBE.•ó¤ËÁõàú vbî­/ª¦„}?ŸyØæH«K‘gSÉ| È;$€Í`Lbž1tpÌŽîˆ13ÍdDkY}çà¢é¹¨³#gQŽêÞž ]^M¶ðJNDnöWíëåÎIÐ’º<>¯·¯RÚ*… ˜GàÙfh$Ô„Þá°Þ'¦€Þ6 ªŽò¢¡ÓÐþôظĠÄ¥˜vGëÔ*Ü(Ô{e ´–[ögªu«eUÙ×ñ=œ­ñ§hÓ =¤0Ê~€ÑmÎHÕNAùZ8aZ0V—ÛjÄQLi_Y}E\FP’FpMaæŽÈŒ‰ÀèFnذaL¬zbˆÊÊ&¼F;òöûéú8F@lac”Á:ü‡̤ÈnÔkLÙIÞ'ÄKZRâ2åÿ©àÈ÷óWà€>ßÓžÉЈ†#oáª!t¨ý@ˆ:¼S<’Í_›†+0C>À‘÷óONaÅøVŒ`b:sÅAg½´t e0ïÁÏÞa}ð4|cÄ2¬ÙFwˆDºåC"ܯTˆjž3¢óxë=/ãŠØ¨ûz§ŽµmÆ»о×L6Ô?}_8.£‚=´Ã(4Ý3`·K‘!QzI–’¨Ù0ôÀý ‹ú!˜2BÊW&Ë30¹3ÁìDé+ÂâK@"ù,GÄìdåî'ûœÐ Uô€ÂMB¨¼ø c$lÚèIsÂ÷ð€Æî¼l¦cXá÷`(ÂÙ'¬à4¬5t|hƒÀ °[c96x1Dá)à¸ÓÜ(i0¶²Æ+ƒ±{süÅwz9×E¤¨ÄÂMÅT ‰x˜"WRØ÷Ф`ò³™@6aÔ¤ WŽ¿m8þ˜?½o/–±·ž,ò2ö=U¦ÕÃ!ÌE·Ì" ¼L—žÄñð§)Ä­«îñZ‰ÂÀ9¹Ã©ŠH¶—%YXëSv-%2-46np–^56Éð~¢s³ÒVÜ…e:¡ë)Ø‘#ÒkIŒxÎUÏN;’+'){Îß8¼Û»ôngFBfª-á¿¢|kcñ†1b&•fÎÓú楱‰8MXiVâbÀ7Œq1Õ©b>$ºŒ¿Iñª(wzZXrâÙ°Lµ˜ÒvôìçAôQPêà&ÇHë€GÐ)~NéÀ)D`â„XgÂÐI Gâ]¹íÂ͸AÌz-Æßá§è´Q”Ü¿=_‹lSÀ¶*šÓ)†éL3ýÅhM6 è¡Ý ‡»:`/,¢,èóseæñ›#È4/Š ”IùÀMzˆa åfÑ4Á<ÍqÕœ<÷ñ? ç0j(Vw §©œÇØ|½/Eß±ÚW¦ñ­Å‰Œk;±MRctO‰{Ü¥›nw`{  Ácªƒö@ ô² "TºšK©i„©;O“/¡öú2Œæ“IàÖ3À]ZÜ è´»=YVc}›Ðqi%Œ™çÑwC݇á7H¸ë%çk{ÈL¿üä—Ó§H§p{Ód}u;Vð8Ð}×°¨ÿùPO}{Ãm SÅÑ^#ì£ÕÕ’ÙŒ0b¬Ÿ¥NR¹äŒƒD6%y¬x7[<»³ŠMv~8:i§ðƒwêÖY,@¶ŸI³g¼´Œj̸”Ý Bµñ>@²P‹zÕ(bžÞõ[¤f-uƒffú~0]_ñ3©2ê§W¤Lo-TÞ!ÅõÝjò#„Nn²¸X§ãSÀi(8¥d‡Éœ…ÉÆa…1Sv]}3׌/xÕömÂst÷~蘆ES 1‡ @Ñ%„HnÇñŠHÛf ꆋÒ'üüž#ÉøHÊ žÂ‘”;!)7 ç*•~ûV^vSš;uÃl‘”r¢ÌºÂ’5븎ÉÀm¿àN-^‘°ÀR³W¬»ÖÉX8á”ÖIYåãxõÍè®{´N*'DzÅÀ×R2p>]¡ýP÷ѧÕ^ÒH°ì^°¼×è»Ñ#ÛfOÖý$qDÀ¿Æ¬àìU]¼á’ðõ³›tBÎ2æ*´ØZ牺ä…~U¶Šc,­0š­aùÚtCV°éÂY©ÒQLan˜žñ>ÆI¸Ö^¨Ð«´'fÔ[êQY‰žª $ÓV`ùÀ"†±Ó9QBÛÀ÷i2# ÓDTØÇ. 'èˆê:£1Þ`ªNë×QU¾”dÏ„æ¢HÂE=-jD欷áV'â’ÙˆåèÃÚÆø1ÎH‹böiQUîÃ!QöĄŸ™m\¯ ‹÷cìõßýcë.À–wÆšu¸-[« uvGLfª P¢zÎr¾Õƒ ;â2Ãm<±~ý^ IʳqÃHÒàÈý&¯6çéJLîµÇ­åa#-póKëƒy±'øL…ž± k¤öÐG»‹ïäi1z`þVKz&‡«µp®ÀÀ¼C¡bñ~j+.Uét,Ô'lôMËLË9°Æ+À'' k*£Æ"~t++}))꽦BãX÷Úçc¹ÆŠ‰«Ã÷P\>U›{"t +Ï(!Ïø‹zâŸñèUt+ˆ„ϸ]ao ê^+deo~!do*™˜À·¦lîIº{•È Šw_ÒcP ¤„j­2°'ê2¥/8Q7­ÀÉäbåx/®õuªMæ`% B&tÊP{o¸8SN/Çå Lú?N—_?ïÚO —gàUCèà‚ ¦œ‚5qÕ)†Óø(P—Êíl×Iëý"ìLZØz.ŸïYRqŽ¡?&íÇÃøÑöf)î+”±…k~d ì96ÛZòbÊ–*ó„Ë.®CÆ ´¬Ùv›ãÍÊL•Q'[s7#°@±Ë§±Kr©¢ˆé.5Y³|NÄY6Ê#Z5ã:ȶ¹+/6ØÙwÖ¯žÄϤ*¯R³Œ¡Ôž<Ý›ž˜ çA@‚¤â:QµÃ¹°Ò•]Sö½y ñ 2<ö—á&t¸uô¤á8èÄ­p,Óæþð Δ6­g0s‘8ÔQnµ‰r+ªŒ›¨M Ì¬Èþü ‘#õ@Ý}ɘU÷ÔáÁ܈K}aþJD¹ð¨–1øŠ¼¦¡X¢mît§zC|™™»òõ!.LÚ…::/OY5î¼¼SRaºp®ôöó2-žâBOLÀ„×ZºöÿØt]öæá:£Tn.\qŒuê½»§GeزzxŠŒTk­Ï|™œ"m+î Þéü³žS=Ä/Ó.€©EŠïžÃÅl>¢5IsÜX3Õ¸œ:rúN £7–µX´L;8µ‰ie&\¸p©J\]f¾µ0ƒ‰(RÊÂ_ •æ9æéŽ ÒÊx›Ø€Ë1f`?óu¹N=c6pÕ帶ʬ$ëËÁ”µ­úÖ±l\I"LA©&3Ó®Ù`O.FÇÛ½Yž,“õ[¹a>ÀøM?TéI¦ãƽv õ1e ©:–i[ ‚Uº½¦mí®p¯:Q¤ìH)[yJY¥î`qÝÊ·¨‹¥ºÅJöX(wu"^ J+O“Õ´TµCs«3NAŒ])†±Ã%‹SÀÁ˜–gL1mSxQ´Ö„cåÈ8…¶Y°I¸¥d˜Ó>lÁ$aƒÂf5mÀ¬Š RÖƒG²êQ‰[a™’>JÊÇ­‰Þ—Op × tedE/|„½öÁ˜>¢)€í½CÒSê4BµZÁÐÁd!jHQ"JP©LÓo‚®Ê–HF ¨1 þhå;« a£¶SF»>~*Çú¶Þcr€Ù`än^Eø.PÚv¾ð ì ºá.O™/XeuYòE6qÕñÊhŒGwËè«•ñÃÞ §PÙE­¿É×¼ǽÝ ¢zXu5Ý –mDz½4mzâ’í µéâÞòQQ¹¤àòlÜphå (£®£/Ùåµ Î úéFÚ ä—6Ù ·é¡g*øŒE#®´ÌW»‹Ÿ ¡ñ{zÆÀ¼Ÿ–ù΂A[( Ëþªálº£¸~„®: Z>ht¿¶òiþ™F t«ŽîRmFåÕk@ 8ÃWmqb}‹7Å/Ö,”º!TÄ?Ý k9\pL5Æ6Q’°%|Ü¿—þþ½Tü¡Û5ß:?ñÞ•¾L-¬ T"®"_d$qô³ƒóÂyø’ØÅ3QÝŸ¾=¼Ž›c¬£VMfr˜ÜtÑ·D§Þúëüµ¦ }ûƒ Væ/Ô{UúÊêÎw?‡Ò(Œ(öÚøFÌÅÜ®*x9Ò`zÞ±ïÛgó«ÞcÇPchmOíN{ܾÅIl9_'Á(?dô›ÝêÀ64ž >ÓžµõâmY„»þ¬îןj¬LCáQÀÀ“À(Ð:L°ïë´Ø~Å…ðCðÆ'W€Ï#;\uëØtSÐæ¢ÙÂ%µžðú ÌW Y—“A¡ì¥e¡év¤Ð/”ÌQ9ññüñôÖg_R endstream endobj 3567 0 obj 4831 endobj 3571 0 obj [171 /XYZ 31.5000000 246.500000 0] endobj 3572 0 obj [171 /XYZ 38.2500000 225.500000 0] endobj 3573 0 obj [171 /XYZ 32.2500000 440.750000 0] endobj 3574 0 obj [171 /XYZ 32.2500000 378.500000 0] endobj 3575 0 obj [171 /XYZ 32.2500000 343.250000 0] endobj 3576 0 obj [171 /XYZ 32.2500000 245 0] endobj 3577 0 obj [171 /XYZ 38.2500000 225.500000 0] endobj 3578 0 obj [171 /XYZ 31.5000000 593 0] endobj 3579 0 obj [171 /XYZ 31.5000000 441.500000 0] endobj 3580 0 obj [171 /XYZ 31.5000000 379.250000 0] endobj 3581 0 obj [171 /XYZ 32.2500000 591.500000 0] endobj 3582 0 obj [171 /XYZ 31.5000000 344 0] endobj 3583 0 obj << /Type /Annot /Subtype /Link /Rect [300.750000 635 345 641.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_special_variables >> endobj 3570 0 obj << /Type /Page /Parent 2 0 R /Contents 3584 0 R /Resources 3586 0 R /Annots 3587 0 R /MediaBox [0 0 595 842] >> endobj 3586 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 3587 0 obj [ 3583 0 R ] endobj 3584 0 obj << /Length 3585 0 R /Filter /FlateDecode >> stream xœí]]㺑}÷¯ðs€ë+~H,‹îtÏ,°3@‚}XÜl6rƒÍCþ~lKV·HZ*iË­;HºÛ²øQ$‹uªŠ?ÿÇ·ÿÞÿï?ö?¿|û¿ý¯ÃÏ—o»æàÚ¦ÿoú÷Óû4†ß÷ŽÚý¯¿í~ìì¾î¾ÿÿÇ®áÛËï¿ýs¯÷ÿyüß_÷ü¯ã‡¾túÂo;§ÜñçßÎ?½SÇßšñçéó¿ìþð»ýßO%^ª3ýû'ÕuU§f\©úÇîÒMuþ÷_ÿ¾û¹À²ZŒÑ é½²Æî•·zÿÿÿ³ûó±‚KñÍÁ[¥\g]sKEN5ißì[Õsþ'Sº*P¸2T®ðsË¥…¢L§²…Kެ¶mÁ‘K/!|Ó¨r…Ÿ[^jdaá’#kZÛ‹Ç·%„)½„ð­-¸fÏ-—Êedaáê´³mã þ~S¯Ž{‘¹®€ÌÆÒK Hë ‚Ä¹åÒB¹Œ6,ü8ªÃðwfÕtª·Óþ¸ñ+Ú—Ýõ]SroK/1ì®+¸7œ[^jo€…KŽ,)[pdÇÒKŸ\A(:·¼ÔÈÂÂ%GÖë’šúXz á{Wp×?·¼ÔÈÂÂËî¦1îekVG}å>5…©¹¤Že uÃ=®dñ)ú®ø…[ïË~n¹¸T†Õ•)½ðTk[Lµ¯KÊÀBè?6¢™?}ßýüEÙæ8–ÝþûŸbéë<ÿø~ŽvÿÓÉæ¡Úý÷?íÿ­iÌ—ßÿëÎ:Ý^šØ?i:øä3|ò‚ž(‚O,zbO`Û´Yþ¤Á-€OŸxø„!ÙÒ4”hó ¾ŸdF÷Ï7<«`OÍhA¥yG.óŸÎÞa•|þ~ŸÛp†mzÐp—*Mß5Õ:§ÈµQ×Ì¡µÝéÁœ'ƒpíÁšÞ|ÿ6õú'J]^z+­x:oÎ ±=œôééßiaÛà;ªƒ¥Áþ¨4”¹4.œÈ©Òz¹þË"ÓÆõáîp¿ëi`7”¥YXl,.< °ðKÁ¨ùÂÇ]g_Órq©_ÂÆbYØå£nôÎ)ái =cm|¤Ê”‡£ÊŒ¬±t^Jox­¦`ÇËÀ gÀòˆÐ¯©WØ$<¬¿À Œ¯Ðhb Æ=¾ûöÂÚ%ñ e´:ÓSÎ6&Š2ƒ|m1/ZXl3ÃòlÐ…5Ë0FlÜuýe6BeÆ6Òa9S‡QqiÈÂzC·¬æÐD3ÃBñÍQ5Z»£È~¶RedÁq OQ½œ³7qtV ãz0æá)“±jp4Žp‰2´$Ö|à CyeIÏx* »#y´šð«µ¬#¯•Ä¢µ½¬Õ¾1þàº6˜%üY/Ð)£Ã>`#9¦ é8cnæ˜ö±ù¼„a½¤"ã(;kïÆ †£¹J¬TõIB麆ud~[bçØà9;6RY(1í ±¤äö |z—¬S›°N<#zø]ù!ºT…õUŒ8²¥]gÔ8GDÞìÙ¬Të¦B£ÁÚ×8ö{<ÃøÊ™¢kbfe‡@È:–ÉÎY†'êF†¾?sÀ8â•ßO}žñDtӌрcf˜:8 ž…ÇÛÌàqØ—ù* Gׯº Ç¢f?WP­×I}<5®F³¾£û›¹æ°–r5„m³-¬ºb·ÎŒDa«3…ÒÉH·š1ÚšãùÀsT¹åsÇÀžfdðaæÁà±YÞkŒ™N0ÕonVt¶ ¯>¼ÁGŠ)ç|ÂðÞ+mf‹>ÀrŒl-ؤÊѳEÙÖŒÓ Ãn’9L1,D‘WEÆ4ÅQ9&°æ˜Þ µÜ/KØÍ˪ÇÖ«pxü@‹’>¤-…òåýñ¼‰Âé›ñpÀ«ƒ|µØ}Žýj]ø¶Y©Ž›©eò΃›Z ¹ËĦxäÉÄ:rw¯ŒÍ Öƒ#œÍÌÀ<[$>à Ç CsS&VÏQFlmfä8ãƒM-¸Žq· K>Á+8ÓjF„³ìÍ´aì,Ni³#–A¥ˆúL<;m<¯ñ<à¬9<3Dã•ñMa#f¥¶V2k6ÔpdMÖ¯FNf¸æ2£ó™Vª§5Ú¦»ÚžÌ „½»ú¤Nïô˜¹¥–oµ¥ì…èTöÀ—6}Ïw²çàmáéOÌňšòe«³3œTœà±»S-OâÝ÷¨ô܈ȇ;ÑsØjE¶³ „Ï&ÉDÒÞ-ÃH– Æúç0ᬀÆbËðý:SQfA5oªù Ôé.\ ÑæÊX†"=gŒð—¥&1+iÄÐõ¯â?ßyøÔ)Wåþ·Yûþƒ¿í¾ËV‰æÔ© Áœú0ÕJÓ;²0V b%6¾ŒP8º*'ÿœ(,p4_Îy”ã¿Qž‚ævôÁEÍ¡†0}‰©HhPÌPØH†øØlˆMθ £ŸÂÔÓ¡™ÄÉ•(ÏL 62t#CómÛÈÐ ÍKG” ]'q–SFTE®mõ¦ÉÌÐd,^é›&³i2›&³i2›&³i2O¬ÉdË8rÓqhJ8‘È×:uz¬²Ÿ,'C”Fº1pzZ8«,9Ü‹ù9؃“8`†ÑÓLÛ  N/¥“™!¸Õø žpŽr|d2¼3Ë*³ê1îð©üvìü˜Îq± §,æw*hà†‘F>1F\ë&^ìk2Hd»ð|%ÓXÙnðÛ–LO<\âý6ŵBí4ø›xÌÙ¢×}HÖM±Y¤ŸÏ"ÒpO7rÓ!7’^ôÍ% êêVâ}»qÙsZ3to¸AâCbªœ<µ8¯zøDîú²|P‡iôh=“ êèà;8ä¡^åâ$—0H‡Ã…zA.¾Œ…s½Õü ×…39ÝrÜ–]÷‘²ëŠ„\,(„1§î–9“uC’HÊNÙìjQ\ Œ•òÖ1Q5óš`ãã·—¤ÃÄè%²%hŠÌP‰äã•M+‚kx¼ð„æÄmpöäÔ¶Æs6³»çǼ!&Bjñm~œäØœ$¼"Ä#Ç#z8ö$ÂÜ. (8«… 4ò— ìRà=Š:vÑΊ‘O,(o¬ƒ,ÐÔâ¯r¦6‡|­tñn–ß’Lú¢¡œC4+ ä·ï5ì‘A6zfEî¹X¬Æ;P9á%ød‰×eؘ8õÔºÍO û×vQSJ(¾ÿjCáú€¢c ÇÞSöÖž R.™èÎð²aeÞÏïiLä• ÔO‚’ªÒ ŽFéÑ åIŽ…Uµb9û²È=`K i²ËÿV­—ßh¦µ¾°CÄ l×£˜0a¾À&/a |ÄëíD¯“(6òCJв[m¸¿‰šXXwk- *©Kˆ@ã»E…döYEþjÆ9Ùì‘QζPŽÊŸc¤]`Òg°A,K/^,‘möã*5µB¨XÆ–ù#ÈJî)k¢“ÕSõE©+­Âm“C3°(³b𦪬§×O #a|¸½¿Fç#åö ë9ØX»å|)eZ_b3©`Ó² öu3•Þ¶`euÿòZçƒ)±Jf9sð• E~zô r!ø¾¹¤—ևΞJ{Q I&`ÞF‚ßѸ4,΃ûÃ(-´ƒ¥Ÿdn=Á¥UºõÄhc§âHؾWÅû,H&ÃÒ *%†‘Õe2¶ÇJ÷SˆÜIÿûíüÆŠ¸Æ,9tÕRzJxë” Ï7d°Ó8†Ç™3"Ý3Op¤nqζ:ÿ uvae#jEŠÔÊmË1 e^[0'ò­–íD$ 84¼r¢†E.»É‹Db²ØIB8,z>EÄ ÷–T²7sePÖ¼Çñ1šo_Š÷‹qWí™ÀU|?õýe^ï÷Ó{Íð%9#ÄcÈæ¸…q–ÉJ% S"Ì"ªRçh\Í©©P–†!mHô¥ü%•ÍÛ;ØÄëÉ<æ?lfÄ-Èqn Wôgó2C •–1Ž:øÃ4™¹øaUéíp0g›tË!Böð…q ;2aQZ-WÖ!üî­f™ry8*ûJõŠÌã±&“ñªŠ%nŒœ¶H!¬Òºº,Dª ¶¾ZY2@€· Ά j‘|dKÍÝGpÒ6ÄÎv²åØ(88†–_à&<œDbã¨Á¥qPŠ#ΪdXé± îߟGTDD§Ù”Š’öÌ!åÏÛ6¶ò´ÂáMë –”u¾·Sá Š¨¼Vøx­,ÐÂÉš¡Þ°Tdwñ(6  fA{=‘MŠ¿`×:t“‹e™LòdF§þ"°÷Éœ¬ÁÝL‰…Â-;^,ŒJ;‚ÛcY'S‘|…²)MjIöî*äã-˜wœ>/nư\U7kØ,ßöåGQF¤æg…{Ý+ã¡ÎðèaY9^Xœ!]àEµ é>Ç—“‚sNÃþœvϼãa¥\Ây÷"®k…½%>8ûõ|+ƒôww (²oÍ6aÂî¶%­tKzÅVÄȼ*†²™DXÖ?¬äs|§"®sXÁè×up‹Û"Íž.Ò,šœÖÜocÖ æ`-ßÅç—ÌΆç:¦TN^¶ÞåÜÆªKb /XÆWî6ð:àÌ…Þø¢mxí0nYnà5×Öƒ/ôn`4YÎ\CÎèOæzc< ¸?ðÚîL«ÝòÒp¨7. K›k,íÙò„fÞñ;0°>ÖÞÂwyB3­Æïàzph?§mø,Ñ8ß¾È-¥“í.aeíSʵ^K©9 ìñ“a)µM=X~·`øÄ;͸dû(Ÿx@ý¦:´a¶Ö—aJ˜Èœ K» büä‰'j˜ÈFõ :£õµKG9F=œV¿JJTáù{j:Զ̬"Æ“vy=x-à'æÝ^ŠWø4¨:ÚŸHm'Aý6þ݈š}×~8¥†Oݾký†Þ\>ùu×ÙƒR^©ñ[fRŠy_ÇñûÃßæôÚ>|[GuèÓ;AKŽß¢I)4­ã/»O¿+D=QÏ~v&˜¾)Ÿ Ì5Ãw8n 8‘å1'á7/dS×6svÕÆÜ0ŽŽ™c-6B0:ªøõîz¸³àM«ŠÜÈ8‡Ì÷JyŸoì6ðµøÚ$øÚ|m|í¾v¾6_›_¯M€¯Á×NÀ×Vßö&ðý¼ï Áws ¾ÛD°åPì{`UЃ .ùpÙpÙ%᲋à²KÀe7Âe7Ë.€Ë. —]—].».» \váÒÝ—»ánpù¸p9Ž9†Klø¾j(®—îúlÚàò\R—”„KŠà’pI#\Ò.)€KJÂ%EpI ¸¤.i—T.ýMp©6¸\!\Žcž9ÚsüÆ©Á‡~†Ù!Ój ÿůG3 rß@ž ò®™‚¼kR ïšäOŸ„ þ–™”bÞ×qyפ@Þ5!ÈŸ> Aþü-š”BÓ:ʃ¼S7üµAÝ@þAþmÌ9öÛŒÃ҆rí)îå|(¨8—¤â\DŹçF*ÎM¨8Pq.IŹˆŠs *ÎTœ›Pq®"çn¢â/¦ Ê×ås¨8>\ ù^cXý’°ì| © –ù°t.IÒ¹ˆ¤s ’Î$›t. é\’¤sIç$I:7!é\E’ÎÝDÒ dƒåuÁò ’Ždš £¹¦Gõƒgú±|ˆ ˆ=—$ö\Dì¹±çFbÏMˆ={.I칈Øs bÏÄž›{®"±çn#ö^7ˆ]!ÄÎ!ö8”Ö|¯ùN<5È_,Õn£#@> #]’Žtét¤éH7¡#]@Gº$é":Ò%èH7Ò‘nBGºŠt¤»‰Ž4›¥z ?ƒŽÌ[b(Çï<‚½‘·C,d %É@ŠÈ@J4’4!) )IRDR‚ ¤‘ ¤ HÉ@šA²<7ˆ}Xˆ¥d Öb3aðå[+Xi#ö`9 ö(IìQDìQ‚Ø£‘Ø£ ±G±GIb"bÄÄMˆ=ªHìÑ bõdƒåÇ…åĆeì·œñÄøÐ 1oÐF €|@R’&¤ˆ&¤MH#MHšš’4!E4!%hBiBšÐ„T‘&¤4aæÉË·F¿‰&”ùmËX¼eŒâ¶e𷌀ö¤$íIíI Ú“FÚ“&´'´'%iOŠhOJО4Òž4¡=©"íI3hOüd‹g\å–1‡öÄ©ÈqŠpì$SJf²rÈ&uÅm«w.ØhOhOJҞў” =i¤=iB{R@{R’ö¤ˆö¤íI#íIÚ“*Òž4ƒöÌ€ü…¹FŸC{âÄG–Ãêü½É2Ü› Ø> Q}’Dõ‰ê$ªIT?!Q}@¢ú$‰ê#Õ'HT?’¨~B¢úŠ$ª¿‰DÝ"*ר~‰Z °9IÁF™ þ0CD¥ßˆW(ˆWŸ$^}D¼úñêGâÕOˆW¯>I¼úˆxõ âÕÄ«Ÿ¯¾"ñêo"^·ˆÊUBy¡ä¦Øî|gGùôSCrS¿¢à¢>Iˆúˆõ BÔ„¨Ÿ¢> D}’õ!ꄨ Q?!D}EBÔßDˆnq“«ß„hæú ¤åuÕ![ŸßÈ@¸ È@Ÿ$}DúèG2ÐOÈ@>Iúˆ ô 2Ðd Ÿ¾"èo#·È5Âå2gõÎ Äâ›çpÜ$¬ß¶õ0ºwªÕ¶ô6cÚ.\íb s>IÎùˆœó rÎ䜟s> ç|’œó9çäœÉ9?!ç|ErÎßDÎm1‰«Ý›b× º¬ „ÔrläA×ëófе͔`;þÝã§èž? @·ÿ–™”bÞ×1€îñïè?ÕQèöߢI)4­£8èÚfÁý¡·(EYÐM•;;X|ïŸrºÖ1¼?Át’Ý,uÇÇtØ‚ÌbAb¹á9Ä8ããz2ý­¶Íbó ç7œù º©fÚÆ±sÀù†GΚ刑‘îŸuÊ­…­~·±ÿíw‹ìfòõÚfì6”Üô=jÔé®ÉóË}»^Ar‰µÕ+Hú ûKW#5¨‹Ÿ sD'®]V­^Q=ê lÛ—¡§.ºE¶»û6œ‚©Æ^®GEwD§Šwð‰EÝP¸4øÎ0ÕÕ¢®¿»‚”;áN¿[> endobj 3597 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1409 1409 0 R /F8 8 0 R /F1700 1700 0 R >> /XObject << >> >> endobj 3598 0 obj [ ] endobj 3595 0 obj << /Length 3596 0 R /Filter /FlateDecode >> stream xœí]ßä8n~ï¿¢ŸØ^KÔ ÌìîÈC€Å.‡ Á^.‡CîÍ=äßí²Õ¦(ªÊl•{ªÇ·¸Y•Š,ÙþHŠúHÿO¿üÇóýýùû~ùŸçß–?øåix‰~¸üïyúç»í€Å—åïÏýóo}úýù÷§ŸŸ~ÿýûÓå ¿üð/ãßþïÙ>ÿóøÿ¿<ÿÛ¿ƒ\&MþúMÿüïùÏÍø·!ÿ9ÿùé_ÿðü·Iâªnù1ô¿¿3!ÆN?ãŠêߟÖešùŸ¿ÿö·§ï/`Ÿ7X÷lŒÿJÎ>ÿï>ýiZÛ1ëo¹LÛþ–×e¾Œ€³z€Iîx×ÿv/ˆÃsÓјe4<ŸoÖ2òÛSp/Æ$‹hò, R`«cœ¿ü·¾ö\~Û0fúNñKÆYH¤ Õñç§ÏhßÀß—ìó¯OßIÏ&<ÿú§ñÎ^.õüǯ}Wôݬ+=ÿúÇçóÃ?>ÿú—'|Á4ëç;³|ò“ø‰üçOÜ‹ƒ Fò'Ãâ'_æOŒyñ.àøáë'VÔÒ'ÃåWû°hè'¢´a‘ö*^žêÄeÈ?Ö‰Ò.å§_G¸¼í~7H·Ü¶¸çp¹âéeþ5ÛE”>Y®kí“Ei¡×òĵùòy–Ÿ³Æmðó'°>€Ÿ¦Æ3#*6ŸK!òãõãëU~›!õ…!õUCê™!õCê³!õÄúÂúª!õÌúŠ!õÙzbHý†Ô¿ÅZßÓB\€ƒ/ô$ña•cQ ËS;0¸D…¼. k½KØïCì—Û=…l:DÅf¥‰WV^zã>‰÷Ö¢ââ+¼ec¥“+²igÏÆs|ôeë\ÞfHqÜT]x¸Ò” é§ bÇÝÂ%¢(ÍXå“þÅ2Ó'J“¿³,ºö$~çâ°} Ñ;³8†øìV}Wj³ÕJ@YÚgé;Ë“][ø Œx­åOä_ÐøÕâ…‹ù /`lGùþ â¿_üTÉŸ,îùíqšCâ43n#yœfÆ 9¡¦‘2N›g‘[kœf`¨ÄiƦRÇ8RÆió,$R긜f ^Æ@¶‚]7¼àÅDöò¢íÑ“.›¹šïÓxRٯȔ&Î=öµ¨Ç>:Žb…½¦âQŒ¸ˆŸÄXˆËñññÄ Ä ?Ì—ÆÀ€”zî¹_±„c¯Ý«ñµŠÞÔ¬¢‡Òb#Ì*N³€H­Žl]ªYE‡¥Žq„YÅi)Hu`Ç]ú¬¢œ ԤܿQ“w²í»š«ý6y_+Û>Ù^Êzä½ÌÉ¡±tùruÝN¨ø©\`ß Ûí±ÙïÈ÷xÒÝÍ,ÀÚð;r R^ß%X—·®wt ´?ÝÜ@HÔ Ä¡æ¢-Mô8ÂÜÀ4 ˆØêÈn `Í „XêG˜˜f!‘‚TÇn ú7¸+[…°?­û§r­1µÄ§&e$»–ŸÑaMšIãä}œ“-«"3©¹øKà\ [žB‘âmä,ßÿZwÍjž·¾û6MFÒ‰[«ÆJålóŽ0@~ÐàoØÊôóõˆÔ×cªùúT&N#Ì×O³€H­Žìë1Ö|=–‡¢ÓóõÓ,$Rê8À×'÷_oŽÙòY¢ù“FÂM>€OUFXFnW«â`ÿµvÝrZ)20ÅCf?K¸‘ ñËçårZMN‘ÝŸž‚±¸ËmðëÓ{«h‡H¬¢°b­ ‹5”VqžD lu¬VÑ¡bíàKãHiçYH¤ Õq«8åvß`¯qsÌ*6‚IÙö)èòw¾^ 7¤âi¤\D;Ö°pø~Yë XÛÖÊj­l¬Y+vÐh/ÔÞL³€H­Žl­¬¯Y+[˜N#ÌZM³HAªãkö-Öª/éLq˜Ù' Ü…€©'ív:"eŒ²Æºä ºƒË¤ÙÚkÎdpÍ#Ý9>” Z²aÁeÊ»”Ä»$+fÄà»ÚB`Wì›&Y¿í*_áÁÙ˜mûûóàDvXƒ·ð¬à¥ àÇýß±qõ.CÁ(“?Qqô¬´R™¹ÖàÁɬº¾<8ùþôåÁÉ<Å÷äÁÁàH胯„Ž0”ÇpÓH:γ€H­Ž5t„*¡# åqâ4R†Žó,$Rê¸è&ß 1C|Ü}kœŒñåò.xªÕ+‰ÕO'¹. ïí~ÍrXþº¶ÆééíÑ$˜bjßJ Mü¼ç˜Fsr¤H*4Ø•òÕ0ŽbiŽ©*ø¼–/ÝðIãÁÏ~Ü0Í9W¯¬ØÂ5Ùªk²Ì5ÙŠk²Ù5YâšlášlÕ5YæšlÅ5Ùìš,qMö@×orM}ɈŸÍÆ]±kQÁwݧ»n'}ºA(‹‡#;ÛršŠ<Íîø1™Ή×@ÞÜ_cmöâ i"/†MÝ<£ÅÜàjÅÜàJÞÂ4Â<[‹¹³ØêÈÈÕŠ¹Á•ü‹i„y ·sg)HuàÜZƒ¨ñ@oàA´9r74€Ò'Ö‰[ »_šÜhÂtãT‹×mq=>GNUw¥±}]ù¢ª¡†}º£ÌZ&±u%iªN›ºüØëuﺥênÖ g+P´Öè„"0ÕÀ °À Tƒƒ@ƒP¡„J`r`H` ›ƒ®¤IÕ{ ê=X‘ƒf³ÆNÈÑF7Gdi gk=€œ-{M#ÌÙµP–[Ù™Z gÊ@ÓHéˆæYH¤ Õq€#²k•#úÔÓÉ|M@Ú°€æÌí$U$Üõ ¡FkÚÅiÖ£ÈËatãWËÔ sóÁö0Ðî@c¼Ts®äLM#ÌA¸µ;P–[ÙA@­;ÐxÏJÀ»ͳHAªãáÖî@*!×h’ߊz}•…` s9-¾£FEÓ¤EaL ßqø¾ÛEë\ñô=Ú¹ŸÅrª-ÙAÄàÎÍäzG™eÞ—è yåÆii¬X®bÕúWãU‘ÐA=Ž!$[¹⃙ ¡n2:D>žöJr¾Ö+ɱ#yx¯¤y)°Õ‘#_ë•äØ dœç½’æYH¤ Õq@ärEä]m†ÿ,Zî‘oókÆÕ°Âľ©FÛ|¯^^Ž º&.;{Kùô=qì`?掸_Ê4ÒnQ.bÍ/0v€CÞ-ʽz‚U lud¿kÝ¢\,YÓó qí•¥ Õq€_ÀµANƒó-5j˜º¾ô«ñX)Z©ªÈ¥]ÄAUG©¸ÅCNMè TïÓ4FìÑ…¦±§ÔP…ie…Ñš«ÔHr+^¦é‚¤*À~˜ôÐJ \œ®´ð8½ç¯ ¥k;Ϥˆ)ÑŽu.Õ:Ö9ÆDr‰w¬›g‘[9bJµŽu.1FUâëæYH¤ ÕqÿˆÉkW#MÄÔ·¶[E W¼˜KsîÐùå4ïõÒÕ¯¸hé°Fl¡š7žj:£)·å›°#ú†‹L>¨¯¼'gØO¼¨7¡âE=£Qù ŠøÁy)°Õ±zQo\Å‹zSÒÁ¦‘ҋγHAªã/jͼhß÷ô¨¼h—F2IHƒ(¹ÍJ,÷u„=ˆ“ªälWö*󪆽ïÛÓ†PÀëÑö’Sƒº¹s÷éÅzz1 }¾<Ôú|yÆõòÀû|ͳ€H­ŽìÅ ÖçËCÉY›F˜ƒµÏW–‚TÇ^ÌÝà‘d/Öµ˜úÐÊ—×…Ÿ•/ý+_^¯îûU¾Øž¦é•,t½ þ‹üJék}ºe»}×7P¸rmÝê´ŸŸñ´i‡÷µ¦ž1k¼çM;æY@¤ÀVGö3¾Ö´Ãû’!40?ãצY Rø½iGÃÏôeüi¸¾%c]™~|Šh¯BM(þræMQp¢IÃ˜Ž¦xîÏ0£ã Ê«{@¯&i{kíA<#ÎøÈۃ̳€H­Žlöc­=ˆ%haf?®íA²¤:0ûñz{†Ùïûr$-œ‚ ¡9–_^+á^lù¦°®½»Uå‹}ßüaÞcó6Ó”hÏŸj=?<;¡ö‰÷ü˜g‘[Ù4¥ZÏåIû4ÂLfc”¶=?^u`šÒõž ÓÔ·Ôze¥sQ—W®)JÐ4m,K¯2…2¤5éMùšË¡°Ü–µïI¶øüv¦>‡¨'ÃT$\¿3G „âŠË˨dòñ»œdèÆ|ßS*—ôþèùf‡r_í‰}çÄ^tåSþ`‰=gØ Љõ«ö`¤À#â–@ûÆPë#•/ÞGpžD luä¸%ÔúÆPR§·„µ`–‚TÇqK¸¡ ·tí#8|Ù·¨Þ¼ãpî+n9xïwk(X(_óæûÎ…òp\æÃ)öÍW3ïìÄÑvãá£og|¹¤¯ø1>æ½£ëëõ’D2„ûÖp}8kN¾q{Úf=Ö ÌÎt1ð63ó, R`«#CØ×ÚÌ /Ϧ§a¿¶™ÉRê8Âáz›™„»–Î|4»ËÕ ë‰ï á뎴µÆZk dI5Œ¼µÆ< ˆØêÈ޵ÖËäà4 ×ÖY R@¯·Öh@¸+eõ£Aä÷ œh3LµfÈÒ`˜x3„y)°Õ‘!œjÍ0±t^âÍæYH¤ Õq§áz3„„û²·>„Ä«Âu'CkГ©Õ '–jJ†× Ï³€H­ŽÂÉÔjГ)SfÓH áy)Hua{}_Û€pß·¥~0û ¡4®ÏÁ áëZû• Vû•Xª)¯ýšg‘[ÂP«ýJP¦Ì¦aXk¿²¤:€0\¯ýj@¸ï (?„Ýrf])ù>!,@ØÓ2ˆäke‰¥š’çeó, R`«#CØ×Ê ’/SfÓƒ°_Ë ²¤:€°¿^Ñ ±œ{á–^›!?å„ðuGÊCK±ÆCK,Õ”"ç¡Í³€H­Ž áXã¡¥P¦Ì¦áA·<´W@8ÞÀCw¼'­ áËu;Ï…w@8QæXJ5æXb©¦”8slžD ludc9–°L™M# ¸2Dz¤:€pº9&'­NæX šß4„G™„åSag£Eªi) |™D lu,ÿZag£±Ô10vÖe)HuÜÂãên`gÉ>ÙY-:½ð^[¤¶v–ÊTÓ< f­M[[¤¶vÖ8J–±³.³HAªãà ì,Â';« a{Bx/„]¤vXƒp™jšG„}í*¶:2„]…5ŽúR‡cì¬Ë,$Rê8Âþv– á“ÕÊH§Â{!…p¨°³ÆÑTÂ+0vÖe)°Õ‘!*ì¬qÔ1Œu™…D R@8ÞÀÎ’!|f¤Uegˆ½Üè)¸±ÂÛG±2ÞÖe)°Õ‘ÁÞÖ8 Lãm]f!‘‚TÇàN7ð¶dpŸ¼-UÄ îÝà6atÿ]at£ezÊ ŒÑu™D lu¬à6C…Ñ5Ž–i¶i¤÷< ‰¤:înc®ï…à>]ªÒˆÜûÁm‚ÛV¸^ãh™¸2–q½.³€H­Ž n[áz£enaà¶f…³µ[pÛø^£®¸^2¸O®—ªhâ÷~p;KÁí*,°q´LiÇX`—Y@¤ÀVG·«°ÀÆÑ2570p»a…³3[p»ÃX`£®X`2…äÜs«Ê)Npïw0Ü¡ÂGËd— Œv™D ludp‡ ?Ì_&í¦nŸá†-¸Ãaü°Q× ü01ø>ùa-=r¡Å îýàÆ‚+̱q´LvḏË, R`«#ƒ;V˜cãh™´›F¸#®pŽi n<Œ96êº9&ï¬O昪ã÷~p'Ê)³CSfY²ËœS6Ï"¶:2¸SSfKÚ%Î)›g!‘‚TÇýÁm‡8e2¸ON™ª8ã÷np; nSc›Y–ì²–³ÍæY@¤ÀVÇ nkjl3kʤÝ4R‚{ž…D R€ÛÞÀ6Á}²ÍšàÙf'm?¸òÐ,` Ü,Ùeç¡Í³€H­Ž n¨ñÐ,”I»i„VZ–‚TÇàv7ðÐdpŸ<4­ÁPûÆ!ì)ÍúͲ”–õœ‡6Ï"¶:2„}‡f}™š›F„ýÊCËRê8Âáš á3'ÞÙ?Ÿaù~ØGÊP³±ÆP³,Ùe#g¨Í³€H­Ž ûXc¨ÙX&í¦û¸2Ô²¤:€=ÞÀP“a2Ô:{îöûaŸ(wͦwͲ4˜Mœ»6Ï"¶:2ìS»fKç%Î]›g!‘‚TÇýaÃõuö'wMU¾y‚{7¸ÁPî˜w X ç®Í³€H­ŽÜ`jÜ50e:o)Á=ÏB"©ŽÀmnà®Éà>¹kªö '¸÷ƒ(w  Æ]–àܵy)°Õ‘Á 5î@™Î›F¸aå®e)Hun¸»&Ó[Î}ºnŸ~‚{7¸=å®n Ü,Ažs׿Y@¤ÀVG·¯q×À•‰¾i„Ûe8û-wíUÇàö7p×Dÿ|r×t»ñÜûÁ)w b», ‘s׿Y@¤ÀVGw¨q× ”é¼i„;¬Üµ,©ŽÀoà®ÉÁ÷É]Sq×ÎÆÂûÁ”»©Æ]–ì‚Ĺkó, R`«#ƒkÜ5À2i70pãÊ]ËRê8Üéîš î“»¦ã®-‡÷‚Û ”»æ†wͱd—3œ»6Ï"¶:Vp»¡Æ]sC™´›FJpϳHAªãþàvæîšî“»ÖÒ#÷h9_R»Ü–rלŸY²Ëç®Í³€H­Ž n[ã®9[&í¦n»rײ¤:7ÜÀ]“Á}r×T=ZÎ××î·£¬6çj¬6Ç’]ÎqVÛ< ˆØêÈàv5V›seÒnaàv+«-KAªãpûXm2¸ÏlykÏ ŠkðC8P†š 5†šc)-8CmžD lud‡CÍ…2570‡•¡–¥ Õq„ã 5Â'CM×CM< ;ßZ½öHjk 5Ç’]9CmžD ludØc¡æ°LÚM# ö¸2Ô²¤:€}º¾nÀþd¨u†ý nÜ~  5?Ôjž%»üÀjó, R`«c·j 5?”I»i¤÷< ‰¤:în?ÜÀP“Á}2ÔZa¹?ñçž{/¸-e¨y[c¨y–ìò–3ÔæY@¤ÀVG·­1Ô¼-“vÓ·]jY R€ÛÞÀP“I,çž»uöY’æåkp‚[·£ 5ïj 5Ï’]Þq†Ú< ˆØêÈàv5†š‡2i70pC†³Û2Ô^unw¡&Cød¨5ÃòoæÀK^½ñy“×Ó¸sò]XNtn›úY¢@ét>Ôètžåì|àtºy)°Õ‘-‘¯Ñé¼/sÓ³D~¥Óe)Hu`‰Âu:]#˜8étªÁi‰>¸%Š”ûç±Æýó,è‘sÿæY@¤ÀVG¶D±Æýó±L‡N#ÌÅ•û—¥ Õq€%ÂëÜ¿†%:¹ªAœ–èƒ[¢D‰Š>ÕˆŠå<ÃÀ‰Šó, R`«#[¢T#*úÄr·‰çYH¤ ÕqK†ëDEÙDŦ%úf NKD-Q0”U Ö,KÐËY•ó, R`«cµDÁÔX•Á”‰æi¤´Dó,$Rê8ÀÙë¬Ê†%:Y•-LË+•m‡|­»fV#•?9“Í=Pöf€{3°DpÎÞœg‘[Ùˆ@½ LhO#̈ÀÊÞÌRê8Àˆ¸ëì͆9O’TF¤ÈW%p7®¼ñ;§I¢&émðÃç©S‡Ÿ øá ?ói}Ë:;›¤O– å_lð0Eiòw–‹[ûN’¾³\Âɳ% ·×~×c¥ï _¤ïùȿ͊Òé,™¢Úo“õ¬ù˜¼»]ƒåãÍåy½a¥²Í… ­´ñì â¿_üÄËŸ@ìyDCÙ§ÑÔØ§Ñ”éÖi¤Œ<æY@¤ÀVÇyDScŸFS¦§‘2ò˜g!‘‚TÇý#h¯oE‡Ù]—@ ÐGô­‹Á®}Gô†-¼ü ÄõØ/Å^ãRå]KCšòÈŒ9¯!„òwäGR ¸\r¬Õˆ±¼æl@Nú„Eß°ã¹ãš žFd/ÁÐ ±ü T‘¼øúÙG‰úÞæ€ò•#ÔøÊÊœ÷4Âܬ|å,¶:²;€_9B™»ŸF˜;€•¯œ¥ Õq€;€ÌWÖ¸ƒ®'|ö§5b(óÐ{à/O= ‘Æi6™;–®ñÍì~5<–x-ääÆQ[þ~†ÏS.wô5.wôeŠ}a†Ï¯\î,¶:²áó5.÷ÚRçrϳHAªãÃç3—[aø:(þ(…|§!º)È•õ(ò`}„"Èm„Ù O¥ çÙí——¡IÞ2c,Šïgð"å·ÇXã·ÇXL#Ìàŕߞ¥ÀVG6x±Æo¡<Ö˜F˜Á ÙÄÅ-¿ýUÇ/f~»hð䃅Îüö/âW6&òa„b;ÂC¾¾®]AAõ0j€æ`¦ i®¹Å£âr).~#¡yÌ¿ÃäjR*ò2˜É•q+¦¿^¾æšc?9 ¸ëbb¢% 1ÕJb*K¦æ\ÒZ²¥ÀVGv.X+YˆX–,L#̹àZ²¥ Õq€sI¹dAá\:—,) Ú¾ÉŸ”UÞ±Ûml™w·ÿ9TÖXІ Vp¥ÍçÛ=¼ü“äýƒ"W%»žÆo+#‰†xÅ•ó£ÍnN³ÓÔ ±x«—oÁ¡ ©¡ ;MDËPæY@¤ÀVÇê[p¨¡ŒÚJ/B™g!‘‚TÇý} š\„¢ñ-]SÔû7.{RÔrUZ³«{«¥u hku ÈÎ:xÂ< ˆØêÈ«­Õ) -Ïl¦ö°ÚµN!KAªã€‡ÜÖÃÒŠò(FÄœ"”Ðì95û¯Q +îQj"ù†]Û*ÝŸ«ñAr·çÏU1¦&öS0Y‰ÍÜ{žô££u+è°æ™Øaz^·2Ï"¶:²grµºtå¡Ú4Â<“[ëV²¤:ðL>×­ÈžIì)Ú7ÿ ^4&Šc¦£6\*šº áÙî?v¿…í@È6q[>­‹Åºdpj«Jâ'ŸÊ‹öùÊEë°* rÓ»ç‹%i\F¿£HÔkJw6Ü&³ÕÕË :ù¢hõÜÿø­ØÂP«ØBv´‰Wlͳ€H­Žì>C­b CyD;0÷ÖŠ­,©ŽÜgÌ[ ÷Ù™7}ºÏ»»OM¸Þ÷¬RañÈé'(`õðNl,—Ô—õø¡<ù}/7ìx¼D«=È›žAtùwΜ»ý9ë2 }¿bíýȬùû=æY@¤ÀVG°ö~Äòà}a!®ï÷ÈRê8 dHùýš¡ïÁÅ2ì 4)í~àܨY“S‹ VÑzP oêþùÚ„~ÖÓ2ð2˜©¹Ø³uô‚×\øå‚ÇÊCy¹à¶R\r¹ò•²“å5"ö%°¶gâ-7?JzàšK­ý¶/ËJ£ÐPP/\éRå"ŒÀ¸@©&>^ÁpeF–&~gÙÖš]Kßœ:i¸éïã/^¹lgEÿ$?V¾ò# >ì‹et7ÜNùb.¾vä[S>{ua1õý–ƒojâ/‹Å¹ññKv—Dßb{¯ÙÝ矟þOUÇŠ endstream endobj 3596 0 obj 9268 endobj 3600 0 obj [173 /XYZ 38.2500000 506.750000 0] endobj 3601 0 obj [173 /XYZ 38.2500000 145.250000 0] endobj 3602 0 obj [173 /XYZ 31.5000000 116 0] endobj 3603 0 obj [173 /XYZ 31.5000000 73.2500000 0] endobj 3604 0 obj [173 /XYZ 31.5000000 73.2500000 0] endobj 3605 0 obj [173 /XYZ 38.2500000 707 0] endobj 3606 0 obj [173 /XYZ 38.2500000 707 0] endobj 3607 0 obj [173 /XYZ 38.2500000 506.750000 0] endobj 3608 0 obj [173 /XYZ 38.2500000 449 0] endobj 3609 0 obj [173 /XYZ 38.2500000 145.250000 0] endobj 3610 0 obj [173 /XYZ 32.2500000 114.500000 0] endobj 3611 0 obj [173 /XYZ 38.2500000 449 0] endobj 3599 0 obj << /Type /Page /Parent 2 0 R /Contents 3612 0 R /Resources 3614 0 R /Annots 3615 0 R /MediaBox [0 0 595 842] >> endobj 3614 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1700 1700 0 R /F8 8 0 R >> /XObject << >> >> endobj 3615 0 obj [ ] endobj 3612 0 obj << /Length 3613 0 R /Filter /FlateDecode >> stream xœí]MÏäºRÞϯx×Hô]þ”ÒÌ™$HG÷H, t/B€8°àwÊv¹“jÇÝé7`f·+‰ãzªÊUÿð7ü§ýß?üòÇÿþøÓôç/üÒ]¬î®ÿó1ü÷—Ëé.Óß?¬ÓúÏ/¿üþå×/¿öÿÿ÷/×üñ—¿ëÿöòãoûÿû÷øÇ¾ñÏS§¡Ã~±ÂöþÇø§·¢ÿ[þÚÿíËßÿÅÇ #Î⦛ÁÿþKa¬w0ÜÆÑ¿™SŒÿýïŸþëË®/`›íù Ô‡ðJ~üÏ?ù—^À<|wqfúòïLá®n‡·.”pɺÞtÖ)òïHvJ<[²h/Y>Mòð™¶|ÕBI‘üë–1ÂmŽÿ-oä¶>Eº>וÕø½z˜ÿm.Îufüà 1µº£ƒšZþôŨ‹^:'B/@£ÀRFßú÷ø³ø×È€á7Ñô½ÅaÿöåÛ_”5Óï…Wöí·/øé?„ùøí_ú¹¾êñßú¤ÿÇ «¿áßþüñW]'Å_üöï_ÜÅùÎH=ÎÌtEo¿"¾WÔEÁUù‡+Ý/Ô¸Ž&ÄE+ãú‹·ßXJNç®Wn‚;ò–`û•ÎW~ŒWô¤øŠ"]’w H9äëßâG'‡/ÜìõÃüÊ»£ýŠ5ýèôÒ/Düèô ^ÿø­WD­$aûaó‹ :­¦NOåÉ+_£§ê¾ÝyižŠÒýÓD4-éQæczÚ+¬§½ÎéiocÚ·$zzèhXÊzÚCNO{™È©žz94ŠÃ2v×Óf¸½ôôךzZ^•¢ó%Z%–=©’ J„ÔÆ´²*hÖ{¿ÙWg-èŒïwAî!L<@¾WòMz•F¹Ü-‘ Nò9šÞ[ÓÉd‰ ‰6DhK¶h9Ÿ×¬Qj»­R˜ˆW­C®_§€YòšWÌ1x/²‘ôCCw‰ŒçLzÆ'ƒüŒ¿Æç$è…CÏt iøN.©ºšŽöUèOV8ëç–¥èá7hÆlpævƒaUžžlŽf}šJj¤žõ|¢CË¡ÍxG> Ç< Ý4°¦½ò1ŠÃÏö6¹ñ{o.]¼LÕÂJ~Ä77ý—´ôÍû«Ô7ï[ ö›Ç–È7¿ö4 ,eL¾yÿo™úæ}«HdˆØ7¿örh‡e4ðÍ{©øæ¤oÇŠ¡^¯äb¨ ئ?8Z´1­<È{“äóîíÝ57Ǩ)h{øWuùZ!Qá®HØ`bÒ3H{zô;§ŸøÉ¦Ø¾>ì‡ceÚ0„þd‚Ä ƒLÐ1œõ- d½K2Aä ºDF—BæÐË¡Q–Ñ2Á=™@¯Å§CfeEoÏ1¢UfyhŒ'-à­+«Äh%Í™Ê#yÒ§½ÒÜ^i¢A½DµÀ ªeDµŠ®oI@tèhXÊ ª»ˆ*Ëè[U6çQ–ÑDµ½¢äÎ/Л~½.=±FGwÀñéåÊXÈð•|€pâÆ4ÆÐ›uåÐʙ܄ؒuÅÑãŒØ9à¼HÖÖiÕ]#Û'lÖæ†,Xšœ-Ž­ËYŒä_ø¬i9ôëj´WH§Ö%_•Ä@z³¨ðþž¹Yld},k0ùø9¹ $ª•Bg:ÛasÉŠœ¹§!-‰¹4ô4 ,esÉøœ¹d\,øÔ\z94ŠÃ2˜KÖ<`. :ѪQªó+'ä²rh “¬OÎ;2œ¼AÀVzˆ–Õñsž¥©QÊÄ»D¿è$CMœÕXð)é@æ"©÷1ìuc¯ïrا–- ö½K{Ëa¯³± gSìz94ŠÃ2`¯×`/ýö ûJŸânúY½zZ?Oè–{%¤ÙCëtyØ3W¾×z%dš·Ôñû¨ašÜZrÌ:E‚ް0Ì V2ã®ëîš³v2‰’… }׌àý¤[ŸþhëfœÓ³À DqÌ þnÎŽ FùDá6Ú l¶f9_ØÛonÒ¯8qcŸ>·œËBŒQ©Wˆà·ªÇˆ} ÖNK£B0ZݳJj„\8;æ•#GËŠ‘ÀÚœ«‹µG¶ŸvÄZÑ?e ¶*ý;ZªEþ†è¬wÚ’ß{ÞÕž ¢s(*":Ÿ‰Šˆ$©_\“úQ\cìhXʘ£"¢³™¨ˆèââ„¡%ŽŠŒ½ÅaûGE„P3*r¢"U³ 騫J‘£ƒêVÙÖÀ–éSÃêëZÔLI ÑgøÉ#DɲdųîqÁÈ¾ÍøfÆ‹j‰Þѯú®0“÷ lX¯‹#›¥gXï01ï3~ö.ñ³j™OBZìgH—ó3’J(q­„žÏb–2‚Ÿ!MÎÏqE×Ð’øC/‡FqXF?à?£*ÉcG'cs²/9 Âr4iW+Çç—ƒn‰ÿµŠÆ®ÏŤ­°)8“ù }….Gú9¦¶úYó–¶Ìm5|Pヲ9|HŠ|ĵÈkø¡ Q`)#àƒÒ9|Pq±ÒÐ’àÃÐË¡Q–Ñ´|ª’KÖ­Æ}—¼º§³mT‰j½ ]z­®ø"w&Ovi¡Ã$»­"Iœ&~~¢‰_Dt—kud²€3W¦C_dRRIŽVø"ã©ßL˜ß/5+¢ö[P°QóƒºÒýÜ~S xÓh‚ó›ë'a/,5Iþæú•š Œê5U7™ç)¼7ú®É·†ºƒÂl;ƽ]Ná ùõNEÄR"†ñþ߆ñ¾5NŸZb#pìhXʘ@)3 ã}kœ>´ÄFàØË¡Q–±¿(!L]hDÇÁ«–G}†ñÝ ’t¯“ÞÑlµ3ÓŠúêiª¢Ú.gÉâR2Zòm¨ç÷,ݲ:z$–ÞšÌÕâyl–]Åøô·„ìöß Ô"~˧Rª´£å,|­âUrø…¯­Ë/ü V¤Â\¸Rå¸p¥ŠÓ͆–ÄŠT3n–2‚©r\¸RÅisCKbEª™ 7Œâ°ŒV¤ \¸+òÇiEîlEîÄÃ!8¢‘íYUʧÍX°!Zà‡‡˜òšntÚŒ{ØŒ2~˧Íx(›1^%‡_øz:s!YølFƒÉ ¥É‘AK§ -‰Íhf2è0 ,e›ÑäÈ ¥‰S †–Äf43tÅa lFÈ 6#KÎJOºþ&³Ê©䜟ð|òÃ'å2Œxû, ç2NGæ³±N.$Œ ¿¡•áîºOêøírÒà†²ªx{eC'ƒÁ¾Æ¡6zZNŠx bIÑh;+5,‹Ê„¨Î^:דgÂ1‹«™EÓ{K—£÷–.ΘZ³ÈÍôÞaXÊf‘ËÑ{Kgþ -‰Ydƒ!ä–ôÞ7 Ì"è½9fQUÎ,EÒ{³è£7ÄwøNÖÎVÊ<³Tp‹h‹ã^a]p¹+UVür !·D!8Ö0™ùX@¥ qߪÈy’‘ÖòÏÈò‘£DhÂQè0ï3t9ÞgèbÞç¡%ÆÑ± Q`)#à¨Ïñ>Kó>- Žú™÷9Œâ°ŒýqºÀûÌÁѺ, !1s¢–œÒ’V\ѬÑ8•EœÔxŽn§dFžE‡Ëq!ֻˬR‰dø ÜZô ­ºZO÷ Ìû 2Çû IÂ'È”÷wìhXʘu/ˆï/ˆ8quh‰uïØË¡Q–Ñ@÷ÊÀûËѽu+OÏÐnØk¡>7(/«`UäHϧ?øØx.Ü=Ã@eå^Ü« ®k^µ@5À¼m9Þ6HÐ@¥¼mc/@£ÀRF@5Èñ¶õÿË€”·mìåÐ(Ëh€j*ð¶qP­n½l¨K< úãá˜zu«þK‹Ub_#àCGÛ?kðSZ-„÷ ~‚0ñ³1>ãº,À) 3œ3 «–¤×ÝõTмƒC&k*MÚSÕ ]cŠ$Ð.éI~˜”"iìhXÊ®sI ã<§¡%t=S$…Q–ÑÒM Hâ@:™†ÂrT’îÀ™¹%ûs2J“§yƒíöÕ %‡¼Aüœ4¢×X›z4ªìKtræ1׊1$&qÒðH†‡t“¿²ë 36ZtÊXÛÖž×VŸ-Ã`ƒïÔuU<þq­m€Ò¦çXïÂ=NÉ©%ŸaÍ4±Ylb)׬ö ãó´ò¡½ÒÜ-qr»i2z½·®wSžö«žçh1y"Øy"$)”`Sòı Q`)#xŽ6Gž6NZÏÑÎä‰a‡e4ð] OdxŽP5½ä¬xÞ”¡øVç½J­£ï±MÞ©¹£‰°ñD06i´/D5ªð“ÖØL¡5E²ùýnÕø,Ûƒ{»»—9ˆ¾_í5¿žyÕ·ñ‚‘£ª¨EÇ&¦´/š˜él¨MžŒ&¶‹a½žµï5¶ö½ÉYûI¢7\½±½>ô4 ,ekß«œµï“„u©µ?ôrh‡eìoí«Nܵöi.ÌóQÕ¢,NÊ8+ª*õëfSlÛ±n³ƒd£ïñx;Hñ°vi#VSáJ`¢c%rDÇ*ÉW"%:{–2f®DŽèX‰8ï}h‰UøØË¡Q–Ñ@…Ë Š*¼.Ññ+ç¤W9,üL˜^£‘•0ýü\ûB¤íó†9ßÅ®JR«a%`:W9:W•d¡+Hé\Ç^€F¥Œ€•£sUgÓ- VÂLçFqXF¬„ût®D<é\Ïͪ›·ïñ G=usc1oæ›±â÷/x®&çE’¿¡§šóIï¿ÿ!Eô‰%«­:•ì+(Y£M%[g¹Ñô©q/iv•ÎÑ쪤üDé”fwìhXʶ¼ÎÑì*—Ñ -‰-¯gšÝ0ŠÃ2Øòú>Í.mËšÝÚrB.­òS9!¸F¬u“Å·„ªøgžn:7‚ayeªÙ—9ßH¾·:9âw«GêA–Å¨Êæ(PU’÷ªlJ:ö4 ,eȲ9 TeâüÝ¡%,@Ê.)Po2@–½OZ€¬{¨&Õc>>ås||*IoP>åã{–2¤ºŸrqšÆÐ’Lª›ùøÂ(Ëh0©þ>_aRï%L?>©ºÃD_Z䈾t²á©EJô5ö4 ,eÌ“ª»Ñ—îâÛ¡%žÔ±—C£8,cÿIÕâ>ÑWaR«}â3P|ûÏÆSÅ‹‰8ÅÅû.1¥D~‰í-6YÙçúÝ3 Öï;Ç µÄÌyZæ˜ót²×¯!eÎ{–2‚™(sÌyZÆ9 CKb&Ê™9/Œâ°Œf"ÜgÎ+˜‰÷˜ó*LªÂÜIZ¹Ü¤&A_­S Q`)#LªÊq' g5G2TÊ4örh‡e4˜T}Ÿ;©0©U¹“ §qV%9ã0€ÌÆiIgàD€Y|ô´¶¯ºë­È3×XÅœi‘-|™é˜ÊÛú*ø2œcèhÓ‡^­ øeüÔUSQ abzºezœ ™[9û=¬ÚOÎ.£ÒæÉ5’Ê@~}î-ÖÆb[-þjÓ Wfõâ¯Ì»³áäŠåu|&ÎrÚhx=ÆåÀzÍ»HM§*n*{} â}Ãþjå£p6ÜôÄN®/‡µ†-§Ü´Ó#§þ6+ibv SH²!SéY3ȯèÝQù{ˆí] '~‡C_¾aÕÌŽæs¶i8Õ&ã‚Nù(èÑ{»N¹+NBk•è³7ãÊ!Ó®4˜O›5žNRk´I©ñÆ^€F¥Œ49jgÎëKÊIÅÇ^€F¥Œàõ™£¸ÑqÙãÐ’x}:øyfÉ(~“ÑÀë3+Åi¯ï£ø6GŠdHì˜Ê'(pò 9^£ìµÇ)/dÓÊ©"+L?'“Á–V†·Üª6ñœ¹fno–^éÙB #õ½`pŠ2„2 ¼4‘¼ÃýeN‡Þ-d&ÙÆ Jœz8œOu»ŸL'g:ýÜ¥³ç‰vµOòIïU«Q9H½>âtZjo‹œ•lš¢˜µ¯±3M!'–¯•÷dS2RA,gÆ'Ǫ£¹ÊhJ=ú¬´kñqæDœSç:ïÑ8óHß™L@vnµyDïθ1èð!ml‘W L¤6o°£Ò˜X V‹F:|žq¹£ðLB½a\zÞØ Ð(°”¢‘6wž±1…ÈÐ’D#í|^Åa ¢‘nÅQxt4²ªYÒ]«fs9(ï°å´³vr>šÐóØ1ÚÝ“ÙÄŠx"öu4Ya ÎŽ&iE4_˜˜¸V}àÛ¼“,Þ*4ñŒ£Ÿ ’سAšèÕÝdæ!\IzÝÕHOi–öÐþ|ëǾ÷ÑÛP9•|ýx¬œ?žÉì}ÛëžÏB™zêÊ´dôE&œéäh…ßò7žúÍä]÷ÊÆùhß‚åyä…mîI¿‘W:j´ÙBK#èßÐÏó ùÈ百caæ/mÍÆ]O¶…¹À¸Z–Wè/„|R0ÔhR‘³@!޼¢rèµ@^™6MwÙ¬Æ'Z;ÁК¸Ô{h‰]¶± Q`)cvÙ¬Î`hu\²>´Ä.ÛØË¡Q–±¿ËfÍý éã¬iFFΙf…²ÒÂHÉ‘ÆHáP Îî íyÒÁ®8™°M±B[5*Ü4Í×Äarbä)7aí…©ˆë¶T¶ðá‘Î#í"œÎnèþœvŒ^Pµ(œµøüRk]N¥»¸JkhITúM‰Ï£ÀRFPé6w~©µqµÙÐ’¨t;Ÿ_FqXF•îîŸ_J«tš‘ª•Jß{§fƒT5£Y‰FÕò¸ÍšíÓÕýt¶<:ãT¨º†O¥¡²Ÿ…c}î,ëã¤ð¡%?Ÿ…F¥Œ2>wŽõqrûÐ’€ŒŸÏ £8,cqÝý³p Cnq@fïÄó§Æ©zßÒ‘¸­Ã:é['ðÉNäNÎp"ÞöZb};ö4 ,eÌúÖ‰ÜÉNÄÛ÷CK¬oÇ^â°ŒúVÞ?9ƒÖ·t Gß[/ÉoÔݪ7,¹Äè屿h‰¾Ru›¦à"ÔÝâd«5a?-¸ÂÎ0™Mp·cÏýß)9ýömÐMmxqœ³hètéßp&•¾ë„¨Áï=Ëj:óæöº«ùC0 ¼ƒ ¼ƒ˜~hIðfø0 ,e|† ¼ƒ˜~hIðfø0ŠÃ2à³ ”ƒÏd!n]èùøR8o‘ƒŠëᤠ¿« ôº®ÙÞå¢ÅzXl'P‘2zAML‡9!kͼœ¦C ^¿nZ_sR¯¿3”ãÓC@ïv¢-=sªUŽÜ`ü™9rtž™i5—6f2ºÈL8: ¬ ÷}»N^]!{ŽÎw#³ç¦ þ¶ç1ä0îšÎž›Œðmo‡Ì XÞÁõ{Ëeö‘¿)d*rrþèïšs…Îù£ßõ3sþ¼ÀTÁ^䨂½ˆ“7†–ØW{–2f_Õ‹U°qÊÐûªc/‡FqXÆþ¾ª*˜¬Ý)œµ\÷È2ºü—ã‘ÖuòžÎÔ§ù6ësœþÜ å*<™I·3Ñ‚;\-‘ŠŸ€&Tšô¿Šþôáf•EîÇr— Ç­Œ  ¥pV£W¹¬F¯@ÑiVãØ Ð(°”@Kå²}¡ïUšÕ8örh‡e4-²IТ¡©gš7:_œ£Š$å^œH:ÎÉP i ’‘&ÃñÓ rªr ×­j­‹kì¸î||§÷ÑÊcE¾’øÖ·;ïh×­Qˆ‰@qÍIáÿ¶ºk Ü18ÑÑ›\¢£7q¢ãÐ’àŽ™Ã(°”pÇä}ÂâëMšè8örh‡e4À¸S×Yj†;û"Å Q'DÕJÖ±Ñ"=>Di?Ò§‚(‡sC½Ëå†zç†- D¹974ŒK¢\.7Ô'ÔNÞ¥¹¡c/‡FqXFˆò!7”Qu„nQ멚NÌ:1ë•0k¢º­Ú7À,?Ò'¬~ªQ¾dÿïL¾dßåKŽ-f]{–2&ÌêÿÉ—ì[e"#É—¼örh‡eìŽY¶a¡20«îq•ô+'‘´«ºoõ²ªOxMþ–ü;E $ôD<'‡Ù‘6~…œsßèííüÛ{£¥XÿÉpæ2ù v&­$¾È]OÃ4ñ+ÜŸb¯‹Õü»%Ñ,iºXŒqf^aÛ›~£t’=ƒ’¿î ©¬ƒ%äê¬C´6)Ô}]ë Zw!ÛÌ]I˜é—þÜhG”³€[ešT=øw·¦rJÅa]/ Øõ’*çzI»EÒ¤®×Ð Ð(°”\/)s®—‰ ‘º^C/‡FqXF×KúG\¯{gFV˜T%ñ¤ªLNgߪã®’œÎk/@£ÀRF˜T•Ééì[»DF’ÓyíåÐ(Ëh0©ê~NgaRëž‚Ø(\EI=Ÿð¼p†œ­auœñé3>½Åã62Ò(ÇOÏðí‘>•‘„Öîÿ9X»oU1Ö¥k_{–2žæÖ¶]|°öؒ੺ƒÅ .‡ÁI®‹P Ý̵ Q`)#`0dèfúÖ8gghI0ôŒº`– Íèfúç\A7CVN“næÄà5¿9û':?‹ôÓñÑYÊø‘>:kƒÑYgHyúÖ8sFè„”çÚ Ð(°”ÐYgHyúÖ8hhIÐY«µ^¢³nFÊc…YAÊCóÜ#å©0©VãIµ‹¾5Þ&6¡±¸ö4 ,e„Iµ‹¾5ÞîZ’Iµ0O£UËIµÍh,¬p+h,èI­JcÁ¢°ßegøþ¬²%ŽEÂ1Æèb+ÚZâTP?ËŽ: ´VMÜY õÖ™ÏØtpÓç ìy59û…šOFNháýÑŽ2­VɺŒBÅÆî6±žRn˜ø2jy_ÿÆ\µ[>ø³êýâ>™Ä|ú\î“Çä;ÂçÈwD’¹"|J¾3ö4 ,eKÛçÈwú¿%2Rò±—C£8,cK[vAc2,íºä;‡ nn9u¶DÖS×Ñʸ À7Fϰä–¬´ih#Írü°äd‰,é3᪘YAг‚L’j¤H™Æ^€F¥ŒW¥È1+H' -1®Ž½Åa pU¬`V qõ³B%¢-44Ï:_7Y63á+ãå0p!} Ðr¢z4ªÕÝÏlLy—íß3ë´¦žfMéNDx2YS{‹Õ±Øc˜j’ÿT¦`¾$ 9¾$™ä^IHù’Æ^€F¥Œ`ªAŽ/IBœC6´$¦Ì|Ia‡e40Õ`_mªÕåeû>}"SÔÿýдJØ„ ž‹ž„ 2"ïœ`=Ù"_Nšƒ^ª°St?㮜½Ã&2ÒFÇ›\Ï<]>RƒPM¬ÔéÕ|Fˆ÷ÖŠ‡òvNÕ«é¥1E˜Ô9Š0™$JR„½KÁ„Ô9Š0©âDÇ¡%1!U0õ’"ì&£ ©WP„Ñ&d]а«.ñkt$‡Ã·ÍInJÒ‘è5·A{2î±àÖÓ«±Uųhà 7KœëP+W‹ƒ´êmrl;ØhÄöß8}Z{Ý,ªÊ¹_UKlà;µ«¨(¹óéµÀ(ìWëTô=µÂΛbhó™ãÛ×Õœë] Ö~Ã¥/Ð~n êl• ½áýÑOL{(Œ”RÖlÔHJßÇ1amqVö™}¿Æ¶|½´Ä1ù±—C£8,cÿ˜<ˆû5ätýÊ+ÓölØ´«ƒœï±¿wf3®p&Ûá|[›‡Or­ãGb M2ä¶a Ü‘¸¢d®¢d\Q9´$¸#çŠÊ0 ,eÜ‘¹ŠJqEåÐ’àŽœ+*Ã(Ëh€;–!wîÒ¼î¬ON9袗"-ÖãQ¯>£Gz# R¸T®T\‚8´$@¤æÄ0 ,e R¹DPq âÐ’‘šKÃ(ËhDê~ bˆª’hµ¢Bâ Q'D¢”ˆ–ññ!Êêø‘Þ¢ .½êñ8Q&.½Zˆ2séU–2D™\阸ôjhI ÊÌ¥Wa‡e4€(s¿ôІ¨ºì3ÓúÒyx|¿†V_¶Ó^V±‰i[þ6ù^/«/ ßÞz¢¯”ù‹CÖQ€»¿"•6~… F½~6ì¢Ê&îšXÿÉìK·ëÙààûÅ+lP«ùB¦'9œ“Űë’®ÒÃèlA:¡‹Á'R7+‘h¬aE]²ÁÉ:¨Q“R¥†ãÌmÜ?çº.ï Ãi©›üðªn“Ãå†àrå†àârá%q›Ü\nF¥Œà6¹\¹!ظÜphIÜ&%·,7¼Éhà6¹û冷鹨ã“Ú?šTՉ̤ª$—D]sIдŒ½KaR½ÏMªOrb¼K'uèåÐ(ËØR‡jù&µj UópmÕa!àI>¤ik€þü=ƒ¿›‚¿>R Çþ:ˆé}¬%<<Ùå/IbQ×$ xC/@£ÀRÆ xJ¸ à)'ã -1à½Åa OÎÇ`³¯.iBcÀ£CoœÊÎ-—'@´‰AE‹õø@d\üHoDà0ÏQ’Ä¢®I,J†^€F¥ŒD`s@q2ÎÐ’ÑÐË¡Q–шÔ|4 ˆ¾ˆÎÃmOÜyIÜ™vünkóø¸3U ,épGãƒå•v9ÜI2S”I–{–2îèÜÁòJÇ6CK‚;z>X>Œâ°Œ¸cî,_Àšiî¸s²êŸèòA ­q¨Ö¹P„§µN @Ç^€F¥Œ`%ë\¨Öq˜}hI¬d=€†Q–ÑÀJÖ+ @I+¹nhóø{uFçÏè|¥è¼Q‘r8~t~ªy^<ÒŸÅ%<ÚæJxt9×6-á{–2ðÙ\ 6ñÀÐ’Ÿ Pg—%<7 €Ï®(á¡ï^ O¥ðýYF£•T²"××S6£4¶îITorHJ!'¹jÅKÁÃfD ~4c*é¢*Ï9šfÌŠ…Õè¼ VœmUÒꄤÏvð󞑤©DèŽO>”Y{ßPK”žË\”“þž¿í=cÆÄæÌ›¸Ÿ¢ö^{\¦­}®L['ÙÚ§eÚc/@£ÀRF0Ü]®L[»8ËchI w7—i‡Q–ÑÀp÷+Ê´iýn™¶Þnûp– «ÔšsÚÇ‘ŽF¬¾ãðÓp"G?ªñ.8%øw÷°¶YR Ûûî£7(¾é—ÉÔÈí°’T…“©‘{W[@ÈùÒ h~’OMç÷F{wœ’‚!@¿ή/½›ÍÑŠ´¢©Jþ(´$®–š+ÝÃ(°”\-•«t7*®tZWKÍ•îa‡e4pµt˜T†«UùldÆæ9«°mCc~Ô .gmjÐ •ÞÎc¤ ÜMXØ×ê—VFŸn!ŒÌëš^$Ûö îå‚íiÂC¼”½)÷ÑëÒÜ—s­u4>ˆü:?šï2y´Ì•iáë‹4:«'·ý†–ã©ßÌz.×ùX¼Bz´ŸÔ•I‡Û $Ÿ;yÆ ©ãtZÎõ˜ ŒÓž[Š©œŽ!‡¾7úêÞ sêWôv9œ+P-—öáÇ¥d¥Ã"ýÅŸøƒ[Ä—ŠœÒî ‰m¬b Ú:ÙàÔUÙñjTdRØ!Z?¥ã‡~Œ …=iW3§®¢Q5 +ñš0¢½ä _s£Môš†‡TÙ½kÀÓÚ_ñ5¨…Aj6Ò+Ý  &ŽÉùË}ô»sÑÇQ˜ú5ÿ ÖŤšÛÁeZ¼+g‚4"äâvîj¨_?~ýòÿQ endstream endobj 3613 0 obj 11115 endobj 3617 0 obj [174 /XYZ 32.2500000 512.750000 0] endobj 3618 0 obj [174 /XYZ 31.5000000 514.250000 0] endobj 3619 0 obj [174 /XYZ 32.2500000 712.250000 0] endobj 3620 0 obj [174 /XYZ 31.5000000 713 0] endobj 3621 0 obj << /Type /Annot /Subtype /Link /Rect [60 770.750000 115.500000 777.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Modules_introduction >> endobj 3622 0 obj << /Type /Annot /Subtype /Link /Rect [60 764 77.2500000 770.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Modules_nn1 >> endobj 3623 0 obj << /Type /Annot /Subtype /Link /Rect [60 756.500000 123.750000 763.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Modules_nn2 >> endobj 3624 0 obj << /Type /Annot /Subtype /Link /Rect [60 749.750000 139.500000 756.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Modules_external_run_time >> endobj 3625 0 obj << /Type /Annot /Subtype /Link /Rect [60 742.250000 160.500000 749 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Modules_nn4 >> endobj 3626 0 obj << /Type /Annot /Subtype /Link /Rect [60 735.500000 90.7500000 742.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Modules_nn5 >> endobj 3627 0 obj << /Type /Annot /Subtype /Link /Rect [60 728 139.500000 734.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Modules_nn6 >> endobj 3616 0 obj << /Type /Page /Parent 2 0 R /Contents 3628 0 R /Resources 3630 0 R /Annots 3631 0 R /MediaBox [0 0 595 842] >> endobj 3630 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F1409 1409 0 R >> /XObject << >> >> endobj 3631 0 obj [ 3621 0 R 3622 0 R 3623 0 R 3624 0 R 3625 0 R 3626 0 R 3627 0 R ] endobj 3628 0 obj << /Length 3629 0 R /Filter /FlateDecode >> stream xœí]IãHv¾ç¯Ðy€V3n€1@×fÀ…*Àãfƃ{àòü÷MI¤– ¿ ãÓ‹EJU¢;S¤Œxñöx˯ÿüí?wÿõݯ¿ýÏîÇøûã··jßÖÕéßîðóËõÝíÇ¿wmWï~üþös÷óíëÛ×áÿ?ßN|ûø¯Ã_ÿ·Ó»þûÛîßÿc¸ø§ñK‡/üþÖªvøýßÇß}«†¿ªóïÃõ¿¾ýÛv?Œ8½nœÌíç_TÓõµ=LcåÕ?ߦeªãÏ?~üýí×ÂÞbLÛWÝNYcwª·z÷¿~ûËamÜdõõdõÎîæ>}™œp7MXïÎSXYmƾ Õ zƒáÝï®_Øò-1 »ªícÁÐ; »ª«vW/ìª 0Œ‚‡K›# Àþ8uu€_?½,-ð­=Z]_ 8~"¹ïšñüûTR¾nU·æ}o•jÛV÷ˆV^£;³Sº¯vu+ºÎè*ÂàÆôñ?Î\(Ê4Ê;¸äΚ^EÜÙóè1€omm3µ³pðÈÜ¢iêÜ¢mëqcŒ‰°5—á# ÞW‘ê8sq¨LX…G—ÜÜ^Oj£À_ǃÿ ‹GÜÜãÌÅ¡2m.]psûa €´ .ÃÇØ\ÓÄÓ"N3‡Ê¸¹žÑƯ[[W}ÿ¾k]¶yi_G€Úyô[RÛxŠÝiæÒ@™¶.IÊU/­»:ú]ÓÅü8sq¨L{;=È4ÅS9]9Xjî0<.¬íM{w÷ûùs·ïºj×V‡_­R'¯†­vMv‹ŽW~¼5Ý^©^w:«½eútzÇðýñssxlçüá&j…œ¨?=~øþöë—{4»ïn6áøëû )ÛÝ/G˜Ý÷?íþ©ªTûÇÝ÷¿ ;¼7ºSº>~ïx§jŽwõU£ëêrGYx§‚wºã³¯mÓµ×w*ž©NÏt— ìÞš“ürç7x§…Ã[øÌçãz‚I, TÆ] žR á§4.ýó÷N/è´@bÝÉ¥eíHbÚèë ÇÐ}Ä[7·Ä[·KÄ[÷.a WfÄ{øV{=Êô©¹%Þº^"Þ¹ï°sâ®M3­¯‰÷üެÄÛèqƒõ OUµoZuÀŠ ÎƬzvaÕ˜qÛ•Q×îG¨¶¾E¨¶YB¨¶s7{¸2C¨Ã·ÚëQ¦Oõ-Bµv ¡Z3{‡™#Ôpmš©½F¨ó;²"Ô°”Ó›Çè÷mSߢî!BaTÃìZ!Ä­NïQõ¾êÍ-6bÿáôŒžnm™dñv͈H]JAÉË@tF«„¤_¼™¾;= Œº¾¾p?}÷ö–¾ûz‰¾ûÖ¥½áÊŒ¾ßj¯G™>Ù[úîÍ}÷zö=§ïáÚ4SsMßçwd¤ïî0ñqë{(0~Û®Š`ôÄz$,©<*#$Ü›ÈìB€Ì ÐL1±âFŒ&Ì Ëg¹Ô€ýjâR}{}á^.ÕUÊ\s©á³s©ájsËAŽW.uúV{=ÊôÉ\s©á³žs©áªš½C¹\êxmš©¾p©«wdåRÃ|F-r)Œ°útG© “¶Fr,"1ÉÀ÷è>³]ž{ø$¦ÈædP𬠞5Ö\˜•bϘ8Ä#VÏ$†–pxd1Â32/pM’næÝº9¬©õõ…ûy·Ñ·¼Û˜%ÞíúúŽWf¼ûð­öz”链åÝF-ñnSÍÞQÍy÷pmš©ºæÝçwdåݦ›Ï@> ‘ÂôÄÏ`¬ nÆ`ÓO>¦¹¾p?×êƒk½„Á®Ãëxe†Á‡oµ×£LŸÔ-×ÕÛÞ}‡íçlÏ8;Žr»ŽÌ\·w`°ŒóóSl=lCxT2B)~‡bx=˜Ma+†9öÐXà‹u»ÌÑ6ó­º;[MÍõ…­|k•F«9v;m—ht°[4:lÔ­·â`Ú[/¡†wF"jö£kój“ð3=zfâý¾ïŽ]ž½‘vïúPÕgt§úŸiÐ ª/hÖ“—'d=#7Z‚Nçv2ÑÛ WwN(Ü/—(tFRY‚ž\©gnÕ-ñð(ŽÄ­N(Þº›t¶ãŠCÇL†C\nƒåÒvÃ6¿ù*lÓ|êáÑÎÝo÷¶z ?ƒ=ùC ðV2uÙ#'Q϶Çk!¡)QJâv Ñ )sâS8Û‰r¨QÖÖ¸²ðE¡Ü 0î°TL˜³AŒNvr–7²ŸÝˆXŠH}-‘kƒqp{fÀ謄“ß3knž=Å$ÀÀï~HüVñ¢Þx "¢PT•Õ$=% 8%$̳¸.£6KGìäÄL²xeÅŠˆb@HG†¡É˜˜_ªÉƒîºãŽçÅêúu°¿tà-ˆ†íJ"¬Å³Àµ˜P©s† Á>EÄãCŠ“ƒÈ²~ÅT¦ÀK.@¶&©?@#g8¶çÔVÖ×’Š ò˳€ó&`”óÏqá?'oŒ(ášÞ8îÙ¸nD¼ý"Ä eV,«,2° œ’"ºì¹u¾(a<`K9nòÓF~ÍGv¥‰<ÜÉ‚Ð2œøm‰é0UëŒ`TATLv8WøA½žÁ ÆD»wMM6åŒÁ‚í2Š1U*—®¦þ’dòŸ k•Ê‚¹ƒÄÚly..ÈÞ%̧ߎÚÉœÝüÅ£LàÉŠH6H´@¹'‹Üõ0 .ø 6I…‹!¸QÙ²YžLn¯ˆ)b`L4c%‡d¦BkwÅ«ªcDAÔW$NSu$À¾5Ê3£ò‡1xpSö<…1{?!mÇ³Çø™+ì§<¡-w|fôQÊ0¸X纩*=¨µ™ÝKù0v6Þ'Â,aŠd‡ª3çœ [=5ÎnÃ"ƒ©ÍCÄÞyÒÙy‘„O3¤Î× r&üP"ªîŽ˜éGºqda9Édçžž"öÛCÂÄ{¨´äT>‰7û“_€”­ ÝW¹t`¾Œüî8Ï }‚w> ;ªEw4|¦‚3=41íàÖ¸|‰¢’ÍŒ–ðPÌ“÷EÓ:())´ý¤›_öÖ:¨î93 ˆnaŽ`P®QÆ“6×#ºÑç9â‚9Ü}ãnáÎX†/hn~FÃ;=ƒ †wà ìoð=#ÉÁïÞ¼ϬáÜFæð`{jà{sOñz„÷r æŽïñÌ `þ†ñ̓p=ñd£.fÚ©£S)A¸êwvë¬è3îü'Ùqk‘ÈÆÒPŽÂè8èI,”Ê—iûõræQŽKŒ]²1\‰‚„SH™÷dô•OÕ*/"¯dNÕmÂqæÄº`è0mMùâ9©)êø ÜÞ@)ræHÕ(-˜sÈ„/ËêïÅÄåÈÆS/(j=K嚊UŠ(¥“Öº¢œ8ÓC:i׋†N¦bVßbÛsKÌT¹òY¶g¦*¾#*µh%‚wä+9ùCÂeö¤!½q%²5ÙG0¾SAUWÖGKÕ¹ï)þ‘È…ÌÉHUG±d´«(Ì¡Sžé’&{ ÖÇ(_¶‹D”YÕ:;Ïxqß»bâpc°vÕŒ—ªLÎ@$Qñé󗳺ýKí $£@Éf‘zö' ÆëgL#¢Þy•*¤Ýö}j’J˰£ÖU. ‹qÅ¥bë8¡+·30®ñ¡uëìýœD­%i]Zxw©Éj(Õ¦ž&»zS”ChbV¡ŠÁà´Ã/›Ù±pöüÞóDÝ䩲Õ-DjÊF¶¨3O‘À£í´H…ã”-£mÌö‹iÂDi'b«Å‡cžœ(㊨€¾¸L9nQoRÉ>°Téá•%²R 10§{¢p;…XcÄ™ÙX3uKÞOµGb!©”¦W©!OÂü.jôjåJÒTÝî9¶`tߨQ„¢ndêl°äBÓÖ ÓÁ™PZl9¨¨pv;Fn§Á´’íׯ$i1M@xªLàz«mìyÈÊKŒÖ°zÊS¨Ž™”—]|ÐŽG¹Ø¹lL»lk°Tm#’Ú‹x8EÏÝ)i]ÂùÞL³Ù®u‰JŒRÑÍŠmAFôXYÀ<ï“Dô“¤€^Ì6ð¶qd®°üļ ží^êÜL¤ÞŒèŠeû¥Qm [qwÃ|BKgîd+øï‰èi%DûCV~w†NØ™ÿ˹˳RL󪨉+ke‘=™‰•]—§зH* WœŠã\@÷šþ”ÀÏמûR¤ÒÃpeBw ‰‡a‚\NdeŠhéáÌ HQoB2µU4ÞKÖÙ_˜š±9Õ'`¤À4ï–Ű÷A \M˜9L+K·ˆºKÈÀyDµ(ü˜ÌÉd¤ R߇ZÔA¬¬NÏTa¡õl½®›s?ûlêü™T¨(Ó—uœC) ðž²ü%Ö ;ÛÒ»œÊårôšªkÜc†•&B@D¿)F@‰âg‰ÛRÄÌö0+èâÆã3…)=-‘"_.RªÐý€YU"ùW¸h‰¬Œ*8UI¤Â»ê‘Ä‹||_4d‰çRK2ÀrV]ãH¢çÙôž{òœ³Ë**¬rvF†£äã&¦xŽç³/Èò™9Ì1z?@ b²È›D6ŸœC¬Û ,E&œ¸s=õ‚‹–d¬½]€†wÆjö£m¶€¥gzôÌØQTµÈ‹º0Ú¤’,Ü1è=ãöâÑâû!Ûjj€‘ªÈ?sÌâZ™‰" WN²Óµ'響ŒçĂю™2N1ê?ší Çâ–ÿOu”ú$»áQsŸÓP,c Fm\)Fa„Ɖ˜@–³w/x"Ö “‹iH¹›1^ÝqXëI,³pŽLñKÂC•ŸÁ/žª¨Õ»Q!(ˆ2¥˜ÑŸÌÀŠ;ú˜µAw<ö,£±†D¸Æn¢––±­#Q=kJä<®:ÅÄ¢"ãÝákŒ `ØfqØŒf*´eÈb[<³}"2‹QÄø°­†£D®XZ—p¬®bfÿš^ŸfÉ™—ž˜6 v·ë”gxlÎàgãHbŠÒºv1`»S¶×CTÀõ¨=›â_€1'´‹uÜ™z6ëa·½dS&¨²å¢xB¨¨,¡Bt³gRÈ•Œ-íëÎU8^•…„ì´TU½(*éh‹zð¨­C‹Ñ?"×ð)%œnSô‘D΋pg^Y¿ðûIÊÅJ VŒd% ápòôUÊTÕ*G´fKeÈï_’=pNÖ"»¼r^ùÛ‘ØŸ,ñ·­§šýø€‰rlj– zNñyhwf%j]àx‰ªÏÕÉ8rС¬þLEZl7YŸ.K(ÿ˜ в&^ÜjÔ‘s‘Ù¶¶WŽt¡|†¢ÚX²J°LÄ‚«• &O]V&R…¹³ÇÆQ©>ïGÃЀ˜ó<ÆiúZãnZ øM–3Î¥NlTïÒ®á&Ñj– Šd´ÛsZ…{Tc$dª¸Èž*Bô´Ÿ¥JÙ áT{Š é. éõ¨Z½°†…;#-Ü1x´ÞùßÓÀgà ½÷`…X€âˆ4õêá;xu c©‚{Rw Ü{ƒ±T,){ÞtS™þ1D2ê|ÐdN%¼z=•9–S·Ö!Ð7ë2ð%INüޱ Ó’‚²óQ ¢X¦'¤Ì¾í§Ý¿`(¾°oÜR`R?L}“jFý€~“”öŒî‹÷ï7ƒó®´KÏ: V\üKÅNÏ7̧µ«óyaésa©W?í•Ê Ÿöª~ú)ƒÕ–öp=†Ñ*ðÜÊ×7JÕv{Õ<«¶ûÂåGÖuµ®;{ø%†ô y¼LxO?W~Yÿ8ÆðËÌz´¶ëz4åKòa½êf² J>kyP©ƒ½ÿ̉AÁç.xÇJ8%ëug`·ž’õ¦ÒëÔý”ŒÂRÈ_ ?%ë>W/NpJ¶a>vƒLL”iÒ›þ¬p0‘«ÏQ"$U4àÓèíÁ%:ë€B7TºùA»q™Ù«Þ2ÕZË·ccJºqv±€LŸôÙÛuÕ¹`M*š×Ù!Â¥=Òƒئj¶‰q,µE”‡é5¦wµ¦_DLoÚ¦—›¼¬¦Nþz³Lb¶H;¦À¡Žá@ÿ€:<ÂyÄ÷´.Ã<2 Oc­¡wÌyÖå~Â-}9»èÁl&·5Uó'Ù‡™U¥NÅÒ¯u†×aäë0ò‚³™#WƒVÕëäÈè@R7mËú˜ù¡ªq€šÍ")ТV¦àt"jâÓ ¼ò$·ŠfÄ?•‰mTçJŠ,M8Óº³É_G:®­Cu^7òK)ù{mm|ye/¦cu<%˜ÑOÔwÖî;Ej&3ýÅe±¾üæ ‘Ý¯óMÿ gc]ZOVç(re:¢°pV¬¡s“ #Qh©¹â—¶oÆÙW@³µsJUØÃÀñYÖéâ»hÞl½?[}ó’Ý­ó^ñ¯Ú‚2¥d.ìÍ9g጖Ä$Êö{Z6híQ*˜j¦Öâ#ÙŽ« |·®©×—–Ÿ]f÷&ð ëÎÙ‘üíc×ôÎPR´4À—–-D# ÅÃ?,&E2»¸tOkÍH$""¸Z05ûqÈÓÆF䊩—.mÂwðˆÚWð%ËâªÇ_p¤Ãh±¢†O@´·ldÒŒ¸=¬^¢Eed”¯§q„¹ê[BUÆ%Äô.Mߢ:`‘˜ªøvþ …žAá:ïMÿft~_ˆH¬žRÀðqÛñ1JŠß“®(}o»©(ý+é¯ìxQ\zCã•2Eß`?¦¤€§ÜS"Æ'{bšáz4.u‹ò1Å£%*%Rr‰œÒBª˜s<¦À‡G1܈/ÙÂ>¿?ƒù(\éhåKAÀÀÄ’%†‡»`¸a*+¥fÀ´j ð-ñ[ 0?Àw`†.²»ª‹%Ñës9Æg }ݰnÝDÙ;O˜¡ˆï`(bÈ3£a¬ÀëÁùj Ü’— — #ì6/‡;ç)¯'+MD b{vATjy´eHYxÖMï\&ì©Tœ/¿^ãáøNv¸½ΗÖFsŒ_аP=\ GqÔñã‡éÕÝT³Ò“Ð,[g& îc{p‘ìɳç’yOÀ9Ó‡7àX¨þè |HpI…”;è9±M-ʆƌF¥Š–¹) ï™ Ÿüå„Ã+ßÁñ{])W:¾ßÂfùÉ.Yy¾ÈÅÖлɆ@¤Šn–-ó' ¥z%íÅW7eÓ R¥–DÂGgSÚ•¨å™x4»B¶ÈûÕx<Ò –*–V6ãV´½•™€M*"B›Šä3]‚"E=ÚQ@\þjÆw6Õ¶òòVe³ºu¶(ÜÂ:|fë!um2ó왨Ü*°ð¼Õp×1C H?~L}I4igž_F ¨lŽÓËÍK2wQÓ„Õ¢ŠáŒ›7kþ¯uœMHFfÜzJT=û(í$dÝú”$[ªŽ¯Æ´žÔýÆ0h73cEÔ©D6j2g Óâ8ôgð‘ñIb¤{«]ZJHVTdåZ¯)¼ž•+®„­¢|‡ÇBfº®=§ë=v«å"ã„êEm[ÑÎŒž [Yp{ï a²ý3q§¤ÈõéG×ëã•¿<;&)÷ÖÙùr¶ïœwàCpͦš‘§LŽhÛ»lá!!1L-6ÂU*kÔR­ w»È‰(.¦’¥²e·6™Rð”?—a²•dVxiZ{»†%©ïxr_ðh¢yzTÅ—.ôTºÐ,ïͺ¡W0_¸œ|’àekÔ:^–â€X üžRöqi4¸žW‡[¢¸ò9ÿ.¬¶¢Ä³NÃ7šþ¾áÉM6gÚ|HßsÝÃ’k£=¨ìÇyù¯À’s8!ðßSß${­*Ï RSw©UðnØ—"çJQêNUHK!Áº"ÖLB±³çV¾PÓºžÏð³û9¼Ø;¯¯k_Øàtï–Ûg›}¥‡N;}öàœt“%gçiÞí‚ꤵè½>6H›k•Íüν½®¨ë4ƒ%ç÷'ô³϶4·/ãJQ²öuÛË”*8Y5.}¶À‘Œp¥mì ]X†Â£ÁgFgœ ZúU9á3¾5S–ü÷pMðhFci ÔZ»YœT³o¼{ƒjLÆôG ÔÈ—(S(3Z*_ÛÊìG^· q5,À£¯NìWú×Ý×·ÿ–3Më endstream endobj 3629 0 obj 6482 endobj 3633 0 obj [175 /XYZ 32.2500000 743 0] endobj 3634 0 obj [175 /XYZ 32.2500000 376.250000 0] endobj 3635 0 obj [175 /XYZ 32.2500000 326.750000 0] endobj 3636 0 obj [175 /XYZ 32.2500000 284.750000 0] endobj 3637 0 obj [175 /XYZ 31.5000000 744.500000 0] endobj 3638 0 obj [175 /XYZ 32.2500000 544.250000 0] endobj 3639 0 obj [175 /XYZ 31.5000000 545 0] endobj 3640 0 obj [175 /XYZ 31.5000000 377 0] endobj 3641 0 obj [175 /XYZ 31.5000000 327.500000 0] endobj 3642 0 obj [175 /XYZ 31.5000000 285.500000 0] endobj 3643 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 518 155.250000 524.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_runtime_type_checker >> endobj 3644 0 obj << /Type /Annot /Subtype /Link /Rect [366 77.7500000 414 84.5000000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_default_args >> endobj 3632 0 obj << /Type /Page /Parent 2 0 R /Contents 3645 0 R /Resources 3647 0 R /Annots 3648 0 R /MediaBox [0 0 595 842] >> endobj 3647 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1409 1409 0 R /F8 8 0 R >> /XObject << >> >> endobj 3648 0 obj [ 3643 0 R 3644 0 R ] endobj 3645 0 obj << /Length 3646 0 R /Filter /FlateDecode >> stream xœí]ÉŽäHv¼çWÄY@GÓ¹Ô’)@n@‡BF { ÖôûŠÌ #³œ4º…ùB§0S9É"éôå­öìýøÏ?ÿÇé¿þ~úñËÏÿsúuüûËÏOŹkŠëN¯~øø‹²??Ÿº¾9ýúûÓ§?ž~zúéò¿<]oøùË¿^~ú¿Syú—ËÿzúÓ¿_~ùçñ½þƒßŸ:Ó]þþííï¡3—ŸŠÛ߯¿ÿï§û‡Óß^Ÿ8½nÌ·ÿÿÓCù6Œ;¯þãiúLóöçï¿þíéÇëø½¥ª†¾)N¦®ê“êòô¿ÿùô—Ë ¦Çç¡6¦kë®xäE]ùú¦¶¾<¢.Ó^ö³½ýÑ<Þxxßöáþ6rù¬˜ª5î§Ÿûvüü™|wÿúâa¨.;Ëô§…mòÍuÑ”µãÍeW7ÅÐßX˺hëâºQšN¾S><]¿ /Ú€¹zR®[ÜñðÀûl¸|[’nLáÚá!ß\š¾Y¦,êˆQYƒ~;¾?>À^7Iîáo#—ÏÊx’O¿Üi†¶èúþüȶ꼡#½y¾ZÁßÜ${sýºÌ_kêËßó7ÿäó ¼Ó —½ü‡ãÆÏ¿<ýørÙòíé—¿\Æu}áÛ_¿üþtÑ*?¼Ú1—qüòçÓ?EõåŸN¿üõɘsS·ýÅ8MWŠöíJ-›âÕúíJ}®««ãñ~¥„÷|÷À§•zšÁïÁcƒ#¨¿¾]iÎmg^§àýJU#è¯WVLJýo®ËR«²7åªe15¼‚?ã:ØjZý5K‰§Ë±È |Ïlº¤;…Ù‘9O¾cv:ÿ½êøRfÞð=xlpÞv²™fCÊ`5ÂÎÒÂùù—‹ú £ùšª±Tß|e*bá+{.áæ,{bCãÍ¢=8ð€êVÆ\¼K°8íÅF·ì’«jÎo£ùæ#¾Â+ŸÑÓ¡+%¼§€#0mèÍÚö­½Y··¨]aDÕÂÉ~†Wú;˰tåKö›géøžb½áúʬÞpÅRb¿‹ ‡´ðذ²v(Q<çÌÀ/uxUù´qK/ bNxpº°Ç¬m9œ]l-2Þ<§"žÆ¬¶Ãb†GÍkÂ+ÇÌ>ìà@…TMƒ±tÓl%‚#¼Ä™¢‚4Ru©UŽŠÏ;a2—/ö®!â`Õ'b°xù™H\.Ñ»¥9À€8æŽÙaœvâiÁ‰-,¶ð>ÀAúCQsv;a)R§q½m§‰ è¾Rs.†êÛ9‡2kôqM9]ЍQ‡¾±4ªÃH`ÎÔg{RñFfì05c”/£ñÓì„Ò\zÀ0žâW¸’Œ¬Å# ¼s&EË#e´qzg2v¼£®ˆ1ÆÒÒU×ãúSY/G¯â¹¯§W~ºú[SÂ+ã´ç¶¹1ß?àÞ3À{®“kêéÒ»X1èJA¼gR²­½ÊòÜÖo+a‹Ö¥§Œ£íçcÂ_8ªç›ñ+úÂñ ,]¹~Gw¾,bµdº-úzJ3‚ÌL~÷|†£~¾³–¡#Ðõ«€œÓA+›ÑŒÛt•Ñ  NF2ëvøE (åEbéª œbŸ” 2!#¬•˜9ððl˜ÇcƒF*ÐâŠïYÖÓî;­ À÷8ì1¼”3 f Œbi3#¦¡\|ø¡(A $$Ʊ©,8w בy`Ùân¼J"Gw¼¼!êü3QE°Kà‡¬·¨©]}?eá¡LðnÀ’ÉŒ3Îæsh 4µê>Ò9’hyiuŸ¤MH9N½‡ï’ ê5à>.ßÐèë6²‡Cøˆ`ñÉZ)D«ÄÏçٵоõZÅg.ÿFš÷ÖFé6 Ïü2ï6Vƒ‚~1ØC£.EÊMé¼¹ÙVM5$•µÁWpüÃåÀµý½ÉlÁ](`@õÖÆVo„ÿF‘o0°‰TT”Îgäÿz}ÃÀQ}â4aÍum¨åHÑ&LÑRy‹&leÛ쎉]o[0Óç˜-Eà?×Zp\7ÚÚц½: ÆÅA†7‘£6K7GÃFäµ!‰´Fr’cEøó¼œ@J§ÆTPN‘Ô Œ†Ìgæz7•2UYÙç~“‰=m”BKÜW–ÎB-÷âáè2×ûŠí'i¤•Šð'ÇoìÍQð .K¡8’2ƒXg)½ÕÞÌ4ëÀ|D·‡w~LQN»\ ÓÜÙ‚XÒUê#g,éúÀe,ò|ÊK%ªh50´H¢—´çœéŒfÔeÌ{×! YVS>KV®ŸuÊøP؇Â^'œâ—Y¸„q[ Ðâ*;¼¶Ì1eŠÝ²I 1Eb¹éÄ‘ˆ¸)—¬QCk©Íh²b=ŸÔ|gÃêÈk9Ô¢”!‡w&"™åE=Lˆ‡T;ÕL‡ð×Òu¡‹ü»8Mw-ìüÝÊ¥B’= Ý]G˜n÷Ûjm4EiPÒ‘PÏZfo?3ZÍU×L³ }xI(‹2ò$Ä ±Ê¿w†Uw© lÎÆâú,÷Ç  ›08§( ŒfÂoÒŸÞ¨«À$>kSâ‘2²õˆÊþVëSaõ­ÃsëÆzF¢gsÀ‰Œ‘½ºQsQ¸‹d(C¡›3_T´"M¦óƒX`íõt±ŽÄt,Jiêű1§edQŽF{oÑNL‡=£ ×iýóï°(ÄÛO ¸[Ë¢´¶ëN¢HYwŸHî+î­ÿ…€4έñu$m/¤G,žëô‡¤~AcÃJ«.ÐØÊ ]1°M-3Üô¶|†#hà™€O bå…,š!ÐgZÝ´¾ÅƒXÐh…Ü, ·u[ñ’$®¯ÝRê‹ å0ÑŸ®*Zj®°U*ÆÏuâm-mK„?<(sdo쀇¹Š³¬Xøa$mIEU¾'GÒnº±f„ÀÕ­Ñ5¶K£õ>Âúp&›?ÝûVbÔÆ¦¦B±1âEÊÛãÓú…ÐJ}BJ† ï µu¨q+b\Sw¸â9¸âͧq3ÖWl#øxL„7\—Äy÷HYǪxÝ+‡Ä¼dà}RD‹ÖX…2§JÈ™MK„ã£Tµ,g>šÊ÷$ëG·ÔH†nl¤ D´b‚ÃôÊÀôò"HQQy&Y&6¶w)X ¡,PF‰‘í2ÈU79VÝPL>XÁIyU™ªø¹EÇðE!ÄmÉH,»A´LÉ¡”4mý°ZÕfè;h fÄz-—íó˜Îed’c" /IœÈ>œJ©S2³]î‰azoÃxä-²vž¼Å*ÝFxY—£jséyÖ®¦796eWf/ É0Ñ5¶¦;"1kl¥#CEbZ_Ú*Ñ@¹5¦XWÌg¶¸NÝŽ/2æGÊV1x™…˜¥o(Œ­’wÐaÈõb1¯jŠ ˜†á¢\â)ñQÙ%m’tùŠŒ}‡x˜§¦Ö ¤* –ÙâS.6ã­Õ‡sN&gäé6é ¿ãŠSÍ¡Oð¢×gßðã)sÔc»1ˆ ˜Á¸‹©$§TÑMKR´n{뺤8JøÀHꤢúµôžÌ—JšbŸe½LŠV#%÷Éš°éˆrçåŽCÝÝÕ ¶ëȸK ÄLhB\lÔTdŽCv¯öINEÔ6ÛÈLà†‰2åe’Ú(¬ÒJ+ÿëî ©î¥ñ"Äân]{sN3ù²z’™(PÖ8ž õá3_]io£TœöÄI nåÂ{ùø> ÇsÂ<žK‰?«ñdrªøt¢µ°Ë¸¡Š¦°–hì®-2‘Äm1þ*eÒe,–*ôñ­‰ìhÂœÔ 6^Ÿþý™ØÄ±²©xºD&SG¥ñ­gŸËZǧWµÉA±l=ŸV|l3(ûkWÙ töMM±ECÄDcí# ‚CŒÀqÎñ) UÜT´/Vn¨'ArýÖ¥ ¸¶„¤g£vc¥¼Ââu(äEƹ~-´?ks%0¥¿4ÝœRUWUo §y s.ã Âh&¢ ‡X1®ÅÚ’_)fd`ô½üƒ!:„hïõ[†‘j±úäÊJÚö°èÖÛ½á5l?´¶†•†ÒBÃL’cGŽjÁÇÌ¢9W˜GóÓë[ãv‡ªóS èe§%òm¡QhõL˜ÑŒcøý´­”¬xJVGm8js½g)·C˜ÏæÅßÇsàX\Ãã…xÞ(|7¤˜**˜÷ÞTÕjõ‚¿ÀÑ â™íÃЂ0uD/VŠdýgÄ Q»“÷Ú$y*ŸJËc¯•°MT‹cf‰(bY|ܵ}¶sô;•'6Õ¹Ø!ĈMTÉÖ=Q”Ö©­míËœ.¼ëóßx %´5²RŠ« 4EN }Ãr‹Ø‘Œ3ìSÀX}ë‰øÄÈþ>´€™bG¸Ý5…cŸÚjsïPzžºô±°Œ ¤¼B6ém[ëÀÖn ‹½¬hÄ•Œ•‚ç@áçÍÏ”÷@ÇÊx!üÀžŠdU¬¢I¿9žœOëwŽG²)}Ÿ²äa'%F" nìšÒ6&÷m—çT9º‘¶§Uhø#±Nu W=}ô€üeX8r×™ç®x¶ÃGŠ«ÖåPrÛlPŒG&B”ªí¦ÕÑW¥šX¢Ž´ ¦8ÙÉ8u(7Ï.ÉÕ)¦VCáA3jHó6Q},f°Þ¯!TM¿Z{í®{K*&äX¶6&.îau´ \³¶9³°F¡?•õ2µÆ› l̤ñÓm:êo;^? =öÓ죗îÐ=#‚þ"´o¿)ÑSÆÅëÎCo?ÿÞóe4÷PDÓÔgÛ4x-üvø…øiãAñ»‚¿tð¿â5žëÏhÞ˜§géiðKÇ÷<(UYÛ'î£â+ÜGx‡ÁùîÒ»ž”ÒÌUóKhëitý›ö¾¯ä•g蕃P1ˆÄÅ—Ï|³|×߬ZwãÏ“Iž 2¦‚´. ú ÷D¤f¶‡s]+3_«×)›ñ‹Éz¹ÿ÷§²î>þâ·§Ÿ-ö닾]ìt†¢GÕ©GéªðóÊå²Vçʉb-ºa¤õDËò¾9·Ša>XçXžB´+|0J()hñvn±û•"0œÄX‚JÙi»ïL.…ªÐ¿‡Šˆøìá¦az.:f¡Ç”"|5u~’*eé–ßT™@´£å‘öBôG:…¤1.û”+£Í!DëÅœT-íjˆ#:êÖZ‡-p»ùŒlá8YÑ¡+¥,] ÃE¦²cJIÁfŒ£Íë›÷P¬¡ ZHѾÀ1X|ÈÞ¥h$,¯ÚꪭdîFõúûÓ0+zfð}ÌšiY¢©P.^ɯ+ÞÞ‚k¡ÃaéýŒäÔ#;ba-·„JÖ’Ä‹8áÁåX¯ðÁ¤†1ómÛÑ+JxÂO¡ÝSÃá#šmñÈlk»]3…‡¡>ÌãáTa3œoªèg8ãjy†Îygtbé Ù H™Bw ½KÝ X c‰¸TÍ4ÅÈ‹MIPmz/½–…N¼S¤sbÀàà{tz½‘r©>-®ÓæÍú~° u…y³âËÅ`[ êÅù9ÐÅ_ê@žc;8Æðå1´€ç-(¹~3³"‡•TíE5=ˆ8µN£¢ºßÄÚfLlXÊ ab!Û2CC»Yx5"ùàƒœC|1V×0­Hr`T±Àf‚ Z˜¡j^> $5V†‰šÖLÔ”i‡Gmó•3ÜTŽ]Ì$³¬Úï ®ÐXñÙvÕ´M ç`°¿ƒ½ìï`/Vçâ8¼ˆTtTcß™ârMì#1ßsø£ù£^kZá%J}ñŒ:ÆÆ¬1eðRßÑ*íʉÞ8L,-ê0•b‘&2q"ù­¡_*”Cj+fô#ЈÈ±{j‘“m)´LLzß9•õÓsri² ¦h-í¸7ùïG §''¥S‰P•SÚ(AáC#sÚuƒ%Zbùþ”¯õ aecÜßéûÆšwŠÚˆð0„ŠŒ¸1Š”¡«ì“Àଓ簨 EbE¦Þ{LãI)h—Ò…/ù£QSZ_ë­¦J˜j°*íH¨…P0´ôýãXE¢0FxÃ)°Yß×*Ù #BÚ=õêéˆ\t·”ń;^ÉrÄs°ò›¥™H&‘‹•Ù¦”lÕ“5Çèw¬'m¸3 &³ âfš{>éÅu„PðL&““ÚL£ØÄ-7ñtIaaÛ*øŠ1Gs÷á—3ö†¦JÙ¼©ˆ÷–7‰E=µ/Ƥ°ÉSŒŠÞµkúöG×_ɘ¾´–1qÛc; ”~c}OŠLûž˜ª­–7p`úÙq“¶ùlÒ Ë8"ã[aä6æ ¿Ôq0j9<÷×ä;ÞÖ7Æ;{{OÅ •¥,Ï(ýc¥2kPQIãÃMxà”9'°ÒvpR*î¯-;úß¼_IEêØ™Ø«Ç T¼p÷Ng@ØŽ=?¨Àœém´ñ|Èp<‡` £ˆ‰v”ŠE%DaÂ× Î¦•*R¦à9¬”Õƒ:y>î8`Y°ð>ž™@äïŽåú=NåY÷nœ2*S5<¢ÚÙaès¢`~ }¨ÆX\_ÔÓ`0ñ¥‡%Ž­j-£Ï‘èMè‹æQ!—6—ÓÆ¯ç˜‹çõ@×X¡åX›*G¤¿©B¢âÊÊÖ– ¢IÚî;Ú‚çß43!º;k07CÕõtàæŒ/2¥–™@~T {ë'#ÙI%ºG•ZJe8´¶ëÈ„Á˜F›†â~«ŽlònÌvu¦(Û¯xÕ%òR›ÛM…RÁš ƒ ÜW,›Dêc®c,,÷Ôf„ØbYÝŸB‰žŒc·¿h*ïHÕÉSu߯ŽMÇÌ sœœëXæøiÜPÄ<ÃÏ€`Ð~zÝÀ÷0æ¯k»Áa"¸LŸ/ ëæúšøÈaôÏ›ÆÛ<+] 1}Ô*ãä6 ó%<*VÚS+HtÁqØmŒÉì||5ž|xÃî Z£¶›+j Æ Ê‹ù.¢!ƒ£c§Èw½­·ØìTÏ$³ÎZ.úHü¸Ût*)ˆS±ÔSrl=Ë3ƒÒv<ížj;!R`Qø¤=BØÙ‚—uù€˜Nù‹ìe…ÖŠP†AáNjᑡŽHr¯ë ¿‹è_2¤ê9K 49f-ö}ñ¾c*™:ñ»bZã˜ê¤°*)#˜Â'1Mc)ÒÀ Î.jÛ2|ƒYSÂ]v¸ y±6¶»éóŸÍ¿ÏÅ<ÇþѸXÜZk“i-p)íy6¸Áž\Ñu– Œ|“DJ÷)Æò¥KMâ£Cà'çØŽõ#¡džE¨G™C¬òT¦âMMc‹lò¬ùôG…§C†< ÆÃ£‰ÝšMMVHU:´Ö¦ÜSÃ{xÏ(¥º¹lÅ÷Œò¸?ÛFÉddÕ³+·îˆ}cá<Ç{®³Ó‡~õŒ[qaÞÆ­¸4£_á Á(Sý¾§ðŸ<êÑ\z󥎱 plxÞð÷0s WÛ1ê^ïÁsí8 øKñ=øK_àÓ†8¦®¹HÙ»>[¬¸rh`^$e›òGÝÛš!”ö’J‚بïc[PL:,tùL¶¡F/;ÛÄò7Ÿâ ­› ÷Æ{(!³¯±´dhXÉ„ìü‘¡(©aXLÊŒãë;L3YùX}#˜æ­É”Õo=zE[yÈ–Çd Âqô© ȵÕ͵—QÔ\½É¹¼p¥jÑ•q;.=¹ÒÁ+Ï¡•µ¹a{ªâ–BÄ@Éàõ”ò@7I ÓõØcX/5w¸Á^^äØM„(^Ù¯Œ—­’’È£3Ö§mÊ6 L_“&Zf}xs.na –ZÆJü4EÛ X Li«÷¯”|&:·¤ÖTHÞ %Ci‘2„Y¶‰ a#a‚s‘PßéÉôÍD“•Ãj8”="a’³ÌRFutªCÝ#Û¸ëíC= qÖ%ÒáôóÆSP,õ¦µ¿@ ÔÔrŸ…#ä8Ö"u‹æ„®æ0ó5C“:2ì[9³|àMÏÞÌ2Y ÖÙ#æ§Yi¾ÏaãDY·~óâ!Ia”ë‡e,1ÅTᆴF“,dâÓxR˜f!p‚B¤uwWÛ0Ã$.ª©Jk‰°Ü[bxR™¿>‰­eÝôpc˜öŒñ¾ûUÖqé[ [©qþ¥oh¢ÀIÈ0<:Ey„s$rp? °-KæÛŽwc¡~% 4xá¡)†[«¶ð°…÷À’ª â²%\܇ï…SŽ{pÑ.K_lej{0 ¿H4 ±ºÄdØ½Š¾Í´+¡c’%}—WTYwèåœôrú|ÆN+-CâLeéÂÝ{ù$½ü‚"x“0ýå™<©ÔxÑö±wh:ÒC¬6¢pö©Z){à‡ÄâQª«Œê†å[‘²½2ˆÃìÔ–"¯'wÕ6™¯fV-#4ïmª õO×Ö—U+ätÌGÊ‘Hî×íø´âäX=±âå.F¿XRÅìõ ÍVU!åWYs 6Â%(èŒ"7£½G,¢¸ ‰ð¹/1Åï@ôFÊî;Jš|ŸoªªFà1Æ­ÂåÖò½µm½’¸Õ'ø°Ägäþi§îìü/©‰Ã#½;š‘!ýäÁžÂh9ÜabP;r¸«\—ô®ß‘ÃUçp3ŒI%0o4°Éš3šii<Þá3eL®è‰Éܲ´TŸw0–L*{a˜i´á.)ñüF3YΕ¯ðÓ%@X-/;;Š• %ba” Å>ƒÑ¢pm¥'|¡þõŒúZ–l±ƒ'r=g–Ô­ŸUúÓÁFÙ]ûëw&¢ë‘ÁT^ô‘%¤œ,1µ%|Ï(ì–®4ðiÏð üÒñÐz úqµ:sFðHñ ã5+ŒW ¯½cM *õ=xðKMç?LÆŠw’ã4ÿïÁ£® l…gTÖrÅ^Vœn<óð»ï^‰òu¯pÓqNá‰9ÛÝàwcr¾Æ'Ÿ4,»àذLqèFr{þûÒuMÛ> ]çúÒC×E–¾}óÀ^Î]×µEQ×ÝɆµ·~Böç t ‘ âL¶; »eÀ!µÍD‰´î"ÍèÀï‘¶É:Æ®èú‹åB,Z8ÇvܼÂÍ´ä°±TÒ“8piqŠ45ÕYÁC"$îo³a“HŠƒ·-1ÖFBÐwe·ÍÌ9®ä JRTÚ6Uÿ”±SîIøÜà„™‹Oµ ÓKÙÍ3“UŠÕהɊî.ñZ„PU÷HëkÊ \:ëíö…ÕI¦¬¬‰>tÒžtRÙvöAÚ’ïEqK‡¤­®ò(£>CË3c¯†–ÀÉñÄ`çIF¯m°V5¬~hÊf{ú!dÀr(—åiÐw¶ö;%FJ~pÕXÑÙÐb8y4îˆö¬xOXÉÙWÆ:µ±ÀI‡- âoµm G+ïÌ„n©¯%à œÜîïÂø`ŠÃa©9AÕ¢÷Ô×{ºsÓmË|I>>ñáõkê^Ÿ*N>ÕDQ»ƒoS† ’ GÓ¶c¦Èòa¿TA™ îZì‘oÁñèÄ’Tu÷io²ï£p3ß·ëoVIEã(lŸá8Ì›8Ì7MyÝf¾'^—öme›óë“_™lËþão~{úÙ¡LÃhá·1|»á(½âá¤Î\7J$Y”üuoNx´L a6fªw-õKªÖ¡£Þ—?§?."Æ)~º÷Vˆ¨~IBU—I.Ì«‰s*o" ®¯'¶[˜–kP½\\_Ê Aα³<&Ö‡³làb~Eï©îiË¥±½Œ_:(Ã@ï(ak[ `ÿ¿à(p Ò…Ï0øiðžq‡¯OÿGf7ÜëÏ—O#Ç8ü&¼J¸x TÓ|_?WOX¡ømµH‡Ê1‚gtÜðfv#ÞYÔyÀßcD¼qͽúÔ‡¶tWTçqåÖíí6z*›ŠážR8ýôôÿmGÐ_ endstream endobj 3646 0 obj 9665 endobj 3650 0 obj [176 /XYZ 32.2500000 481.250000 0] endobj 3651 0 obj [176 /XYZ 31.5000000 785 0] endobj 3652 0 obj [176 /XYZ 32.2500000 368.750000 0] endobj 3653 0 obj [176 /XYZ 32.2500000 136.250000 0] endobj 3654 0 obj [176 /XYZ 31.5000000 620 0] endobj 3655 0 obj [176 /XYZ 31.5000000 585.500000 0] endobj 3656 0 obj [176 /XYZ 31.5000000 524 0] endobj 3657 0 obj [176 /XYZ 31.5000000 482 0] endobj 3658 0 obj [176 /XYZ 31.5000000 785 0] endobj 3659 0 obj [176 /XYZ 31.5000000 370.250000 0] endobj 3660 0 obj [176 /XYZ 31.5000000 137.750000 0] endobj 3661 0 obj [176 /XYZ 32.2500000 619.250000 0] endobj 3662 0 obj [176 /XYZ 32.2500000 584 0] endobj 3663 0 obj [176 /XYZ 32.2500000 523.250000 0] endobj 3664 0 obj << /Type /Annot /Subtype /Link /Rect [60 749 77.2500000 755.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CCache_nn2 >> endobj 3665 0 obj << /Type /Annot /Subtype /Link /Rect [60 742.250000 90.7500000 749 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CCache_nn3 >> endobj 3666 0 obj << /Type /Annot /Subtype /Link /Rect [60 734.750000 100.500000 741.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CCache_nn4 >> endobj 3667 0 obj << /Type /Annot /Subtype /Link /Rect [60 728 119.250000 734.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CCache_nn5 >> endobj 3668 0 obj << /Type /Annot /Subtype /Link /Rect [60 720.500000 87 727.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CCache_nn6 >> endobj 3669 0 obj << /Type /Annot /Subtype /Link /Rect [60 713.750000 102.750000 720.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CCache_nn7 >> endobj 3670 0 obj << /Type /Annot /Subtype /Link /Rect [60 706.250000 108 713 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CCache_nn8 >> endobj 3671 0 obj << /Type /Annot /Subtype /Link /Rect [60 699.500000 138.750000 706.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CCache_nn9 >> endobj 3672 0 obj << /Type /Annot /Subtype /Link /Rect [60 692 140.250000 698.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CCache_nn10 >> endobj 3673 0 obj << /Type /Annot /Subtype /Link /Rect [60 685.250000 127.500000 692 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CCache_nn11 >> endobj 3674 0 obj << /Type /Annot /Subtype /Link /Rect [60 677.750000 105 684.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CCache_nn12 >> endobj 3675 0 obj << /Type /Annot /Subtype /Link /Rect [60 671 147 677.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CCache_nn13 >> endobj 3676 0 obj << /Type /Annot /Subtype /Link /Rect [60 663.500000 115.500000 670.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CCache_nn14 >> endobj 3677 0 obj << /Type /Annot /Subtype /Link /Rect [60 656.750000 86.2500000 663.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CCache_nn15 >> endobj 3678 0 obj << /Type /Annot /Subtype /Link /Rect [60 649.250000 175.500000 656 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CCache_nn16 >> endobj 3679 0 obj << /Type /Annot /Subtype /Link /Rect [60 642.500000 86.2500000 649.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CCache_nn17 >> endobj 3680 0 obj << /Type /Annot /Subtype /Link /Rect [60 635 85.5000000 641.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CCache_nn18 >> endobj 3649 0 obj << /Type /Page /Parent 2 0 R /Contents 3681 0 R /Resources 3683 0 R /Annots 3684 0 R /MediaBox [0 0 595 842] >> endobj 3683 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F8 8 0 R /F9 9 0 R /F1409 1409 0 R >> /XObject << >> >> endobj 3684 0 obj [ 3664 0 R 3665 0 R 3666 0 R 3667 0 R 3668 0 R 3669 0 R 3670 0 R 3671 0 R 3672 0 R 3673 0 R 3674 0 R 3675 0 R 3676 0 R 3677 0 R 3678 0 R 3679 0 R 3680 0 R ] endobj 3681 0 obj << /Length 3682 0 R /Filter /FlateDecode >> stream xœí]K¯Û¸Þß_áuñˆ/‰Š¹7I.  ‹¢‹"}aÐ)švÑ¿_Êm‰ÔG‰Ç%ûj‚6eQùÏ‹?þöËŸOÿïéÇ·/ÿ>}ëÿ~ûòRUuÿÚ?? ¸>÷ÿ>5Z¾ýòòýôýå§—Ÿìÿéøòö{û¯ÿøéwö?Ÿþø'Ûø—þGí~yiXcÿþçåoÓ0û¯êúwÛþ—?üêô¯¶G÷º~0ãëXSiS·Ã˜yõ÷÷™ìòç¿ßþõòc7io’5†Ÿ˜òÄŒä§ÿüõåoí·Ñˇƒå'y Üý˜8`ÝX+»p§ëP³tÌ$—}ß1 Õmx? ¬ê^ÁNö0ùRx9gl­9ôû^aí+øiøB¾Á®‚éÅÉ;¦z;ƽ¬ìäZ{ J®n³Ø_'ò¬ëþ?øï» dŸgv¤Ó¼ò›…2½Yq¾Ñ›ëVŠnòf#Ä6oJùoN"6LõQ(ÆŠ^¿¾üøÙŽŸ¾þÍêFÝ /}mÇüCK¹œ¾þåôëªbsúúó kΩµÕ ÛŸ]îTÞ1—;ú¬MUsUÝîu¹ÃÅ™UF ŸaõÆêUÝ3æ¬äøïà±U¬;ÛUkFwøåŽ¨Î¼Œ{ƒc«d×›t·Œ€3ôLdºgXu®•7׌0opMáÆÓŸ‰Œís:ª*…æàA¿~¦ v0•ˆŽàüÒ†° ŸºQë³TcÊÂs¡zŽîàÞ"œ¢[ŸO_£º× ³ 7ü¢5¦åîí>¸»ÖV¶h»£¾üÕ0ÖiËšŸjsÝn÷-ß^j}fÌp­ÙõWͰ—þª‡ý}}yìä=Ý4þ;lË·o$¶Í¼ëeüßì~ýõW£9aÁœ°e’‰…’ɪEõ¤d’hÒÊ®':Â×\¡Ø°1zгàz 8s[îÛL,ªî”s]÷‹ÊD5lhUÜûàbô.ÆLÀÅTÌ[ʶŇËåWͰw¥Çp1Í\¬ âÁ¥UJ|¸Ø67Òf—ë;¶„‹©äX¾O€BVè†ï9$?wÊÂàŽ@½áTW•®³à™¥°4•r°´zë ánXË<‡°4LOÁ’W>,yÂ’; º^ÜU3‚¥aõ, Sþ;l‹˶ʹÀòöŽMaÉ…§„c‹E€ôòDî`ða(÷ÂÞœ›@ØãÞ Éôd¶äVËéAnİá~‹z rÑL\€¶%yû«fØ‹»ªÇ j äv«ì¿C† ·mn¤jòë;6¹äwpËU 6LLo3\yjÔ ’3V=à¬È`rî¥Ùbb’¢‡<—|Øp?1)5&&UO“Ò>ÐmK@Lí¯ša/îJ‰IÉ)bR"x‡‰É¶¹‘Ê!1]ß±)1Õìqˆi1øjî8¹ª‡ ÷ƒ¯‘cð5j |Á†È\6D|Ú_5Ã^Ü•ƒ¯Sàkü]ۀ϶¹‘Š!ø®ïØ|z.‹aÙÂ)h ƒw"|tSEF³«"£‡ ÷Ã߈1üœ‚°Á3— žàöWͰw%Æð7| þ&بÂß¶¹‘ò!ü¯ïØþÆÌêä“ÙrC!Ž‹•’ç‘ Ü>à”&† ÷¯†½!aØVo‹yiñ£ûU3ìÅ]ñ!aØk†m­‚wT>a\ÚÜHÙ0ïØ0ì(ô-ÆàÓ±+¶Õ7v0Ä®t¿j†½¸+1Ÿžˆ]±­¾Ñ¦m À§™ƒ›æCðéÄ®ØQ˜Y^…M-”íÿ¬2·b¦ºBŒ–BŒ–kuó‰édì2\9G¨ËŒa¾¨†wºé¬]ŠÜ€Ê?Àg zF^³Ú‘ù†î8>cÎFËQ®ø4^ú"DÊê2…¢rÛ —>{ûV¿¡OÜ›JôÊq–!ìDtk¨Ü4k¨ƒ)`¶õwc°¨5Þïã!a¯3ž%-¦ ½ù“Òg9O©€X9 Î’KnžðXãÄk¼ÝÁéT“VcUg Ï'ÔuÜy9î r8·ý©oì S«õsÃ}±ƒ½Œ˜üð3¯H ŽÜ!DQ¢SI±»  Ç € €ä}‘È%ìd%&)Ò EøGx±õ£^òxáª$0ù2ÒB³èY˜hð{(„†åÁr’ •¬$õnŠNFkpH#X]à1 K_⊠fþ(<ý±ÝM–o‘!•<˜ÁPTDÂG‰!“wÞ(ûµÃ‚‘N,LLM³—¢({‘í_m,„=x„)cÌ`%v걦¼ÔšÈv•òm”zY7{Éٶ׺7Ÿ‚2÷Èv¨³`Èè(JŠôÂúe«…§k9tH”€WO$†(Pˆ¥˜s(«‘w'—¬ú¯(ªêÆ×oHŠ{ÀÆð"Rvƒ:asMÝŒwÙhüÊLÞå~¶“¼Ë)ñ—«øz§üÏaœgBô©K”HŠ«‡w"QúðŽkÓ`¿Å¨¯IK‘$àBÂr;ŸqÂN›wðÂü¥º¿ª”™0iÔ‘-Y)ß`Â&‰bsx·ªz>ÉÉdså.,¯¹ÊÒ‚9w!üÚ‰;½;îw’ï`Tõ:ÈÔWx§Î:ï|"c©PyŸ]çÚ ßözWæj¹…ªʱf)^™ŒÙU+ÎñÚß’eQUK±:øJnr„©¿c t°Çâ;å¼ÕÖÞ|{,É /Ž”TËæB³Wi=O@p1#jR^BÅDG9­±ˆXS´ æ/Þ“°ê¦‡¹ÅCÕÚ¼t~Î*G1V#ªk¥†þp¡”iG÷ƒ¹eEãS™0NóÖcËk7x¥æ±«øDÔ+BIáœÇÈÆIôV¢’hîX5õh± KËeWdR(¾òN×òÓ¨3‹Æ„c°q'šõ^Z±êÛ‘ÓþÎÝÊAðÞirM·›žÈ*U’8e )„š·ŒqÂÑo”!•rüˆÃƒÅs,\Ž2…+3,²"%—ñÜcš¦ÐHÂ1AJÀƒÍá!Þµ+ò±¥h_þw"ì#Xž5¶YQì]{bçˆÔI2/Rdb)~È#Ür³ãK·’6Ï©†>–ªAñ(³ÕOTê-DŒ)ôE‡¦òPÇK®ˆnA2 iבל¸C]Ÿ‚AƒŽ8 .å™bÊ[æ ô‰÷˜Ú5\I¹\±ÀþCò­R*Ø?é>âý*!ÅhŠWr–¦zQ¼>MñÛ!‡+iû­`D¹âþ³D‘äubÂ<)¾ÒѼ٤Ôyߎq†ä½¾nçÈûæ¶î³_CË%P‰¢êî¼÷˜|–÷LLÂ&,bûY>P%„šá4EÃȪû?+2#FõR§·'DlbAP*Ú,/¹.—ϼY®H®”¾¸Ùí¦9ÍE‚íí›§§ä9±µƒK*À¹ÛT‰LŠ:…n#x ¨ð”Q'ØšlÀoY9h6‹#}¿›Û”Z„”® âžX%øb‘ø¬º$…È#‚`)½¹àK‰ìJàUX/$èï™ëBàÄ;œT„GÉ”9#«~yw*”‰,k¦(`ÛºeAl#>Þ¡“d•Èš.îVò&ÌF•JY¨òîU(ß%â9**KYH ÷gÛ4çøôˆ0L Ê݀²*”Xì•KT2Â(~Ê"¶»…dS1OHR‡#ˆQ³Cæ~öÕ Â’´»È›ñš¥|-!a2³õ²{NˆÙØs³÷G`kúáŽmãBzÉx%<™ÙƒAI°J°樑wK[,ÞR6žä©O+•˜!nÕ¥²ö\k ¯¦‘7e7rJ ‚̦d‰S´þ@ÅY#S4oúÕ}¥>×Nä%x\ŠÅlm3/´ÑTŠ;Á+L 1h~”;e»?Ä% &Ïܯb¼ª ”<¸{ª˜ZÕÏð=qòµ„“×ô†íLž Õ–)?öa1ƒŽtO©¹ÿd€L%‘)¶ÏÍXv1‰J‰ÖÈ[S‡’œ´9?Dá5Êo­ž,¥'šµ•þR€UâvPôŠB Ë-s‘!™ KäÁs}ØamþRǬ]™+o(M¡ =ÅW1ÇSjÍn( ™…²' *ô&KVO¿ž2½æéY ¤”ÂúyºKfËÍò¡âí@Å£/vKÕµöEŠ' ò>µC`g b˼…(ŸóùZŒ+¼2yØo?!ÔE¢d3P¶c$åšpüMÄ$•ÕT´g±OÉ¡Ì\Ë;A²Qlä”PXJ e§–5òŸbfo°7¿§”ûO.¨©#Zø¸ÿp¤tÿõeõÔ½~å|{×dÖ÷wøööm¾\'†“bnÝ OUÖË{&gÂÜç¨c±Y&s“î#m°îðe®ZöGxb!ÉE¨Oµ¸ˆu€ JžCPäž‚GIÅ~„¹(•¿fuS,ÉpHû™¶”‘ò)QsIþÂB1¡ÌvÌžñ³¿ Ñ|CP™²RbPÙxdƒÅšgÅãK±­€Ýã¤ÙÕ(yÉxòšiVÎ0R}g×@<œ5wÍßÖÄfª[µ—,&§Gö¬K¢Œ7݇ï…H’‡ïåð½¤ù^Þ;9§“‰ËI>Ö•?i£ÄG¯lqÜÜÝÔŽ„ës¯ü Ö£†ÏôL¯ÉLÜ‘Ý̱&ÜaöÔWûÂÉs ‘½¡^Ü10Ïà;°7<ü…¢ß‘ëà¹zdPïoTÚ4•Y©Íš‡\ì$m,±ì&HÛâ‘/yã—sÄ@¥Ôüy€D¡gñ|áÞÕi33 ȬGÈ“ÿ46d©GIë|¨è÷õ]zB{0Ïå­Å—ã(hÊQÚ$¢ÆÜñ8’¯g9K%ÒªS&ekÕ¸X02ÅZ”pðç“8)(‡µQÔúÚ®(çêºñå\0©Ý÷iOL°’P\ØÆ…Xž"UL™BöY”6JFÿ¡û¯«û¯%(JKµŠ HRHDI0ïçTï×4¢²Æ…‡õàút)"+U0§A´€7"{¶§ng5­ù¬*EÚ¸g)ZK8Þ©TÌÌÔ¼œ_F>‰ÀȲ¤Û+Æx˜âó¨ã›Y.Sø5äÊ)ÈÜZ…Ø¡·úpMIe„'ªV¶eÞ¿ä 2ÏzZÃfÞîHRVæXN2ó%¿=ju=ªXÌa\I¡äƦ¬S^ÏeºJUy!„L†‘yó rÔ<”[‚ýsúnyw”µÿ4÷ƒ¼_O±~a±R±–É_2&»á2È´ºo&>±ËÿஆæàN»Q‡wzí‘OäQ2ˆˆè=bNaŸÛçþK‘œÃJ·ôµ ̽¦’>9ì¾™ÁäÄg0Ü|¦G+Kúôæ[*àÚÛ»‘‚j–÷ Ó3„€xC‘ƒ À}õ×»f¨©Ä¹§®ÑTaÅäÃÌžÏÌñ˜ÓO/ÿ8 c endstream endobj 3682 0 obj 5749 endobj 3686 0 obj [177 /XYZ 31.5000000 632.750000 0] endobj 3687 0 obj [177 /XYZ 32.2500000 701 0] endobj 3688 0 obj [177 /XYZ 32.2500000 631.250000 0] endobj 3689 0 obj [177 /XYZ 31.5000000 701.750000 0] endobj 3685 0 obj << /Type /Page /Parent 2 0 R /Contents 3690 0 R /Resources 3692 0 R /Annots 3693 0 R /MediaBox [0 0 595 842] >> endobj 3692 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 3693 0 obj [ ] endobj 3690 0 obj << /Length 3691 0 R /Filter /FlateDecode >> stream xœí]ËŽ$Éq¼÷WÔYÀöæ;³ÀÎÌŽ v„%) xÐï«{*«{*²,*ÃÊÂ#2+¸ w9µùŽð‡¹¹ùÏÿôÛþó?þö?‡ßç¿üí©zûêôŸÃë_?ýøÍô<ÿóaœúÃï}úvøöôåéËËÿ~{:ðÛÇyù§ÿ;4‡~ùï_ÿöï/øÇù_zýþú4ÖãËßÿûûßcýòOÕÛß_ÿü¿žþõ{=ãùróÍ\þÿŸê±ž†ñõ6n\úÛÓù1ëïýý÷¿=ý|zaWi»vl»Cݽþϱkÿû§§?¿\à|úêyæÿÀ&/>½^üx¬^.^Oë+wõØ;WþrŽ·Ûüþ×7âýtß<~øúôóçº«Ž‡z8|ýóËg=]óûß¾¾ÞöO¯Ÿëåú_ÿxøÇªª»?¾þåéø<4ýùoýÒÑ/U«<›ç:¿ÇÔðÞx¶ðlüž­Â÷öKø{«zx׈»ÆO ¯S}†¿À;`¾©ç:ðÞZâ+ᅭϨóë×—ý{kNÃ[¿*üpž­I,ÿ²`3Z°ÅÜs»«Õ‹¿ÜÍuma¼§ª/Æ»,ÿb¼×®ƒb¼hõâ/×Ã/7ÿbb¼›®ï²ü‹ñ^»Šñ.«×8¾îÚb¢Ë"/&zí:(&úVo”u 0ë7lúq:¿§q¾—qè¿ßŽû¥¦çéX]þ2¿ö¹ï†iì—ocr—U÷ܵ§â­»µêú|–§Ÿ?PÐ/Ô ðÑO‹´n›©¾|]ŸW?zÝÀÓ¯ž'Æw?¢_j|LÜÇh§¯ÖŸ~Ïé™÷×:ƯŸßR‹Ÿï8øIñ;_<~âúä4ëöüjß‘|}üÄðôÍŸ‹Ø¶žÇÀ﯃&ÛLâ:u ? >soÄ“zÞ5~žõkùc{ÆîX9¾±ë ±‡®ƒòšîÃRŸJá”l.þW£è1—õê»×ZÉdžIëºÝAý ¾HüRN+³®ž‡±¾\øØ,c#‚Í6ØÚÏ¿ø`ðfµËš¹Y&H[nìëñºÃÆøuìh&IX|ÒôޝfÏ;¿e²"ºÂc7¸®ðÓüó¶ÏÚÞgà5‹’ˆ-µL>™°v½‹OO3púˆ> óò¼bæå/.L¼%­7 L$±-“kZy鈇!üåSlÑr§c{®µ ¸FŠ=³Û?÷†Ï†5ó¤q×…æáðŒ1Ï8‚ë7™IêÚ]|§Å…!8:©ëÓ6™êËK¾ÞÝé­ºwwí—ÓWžçŠôsDÇ´§/ô²¯ßV@åþÉl;ëîÙ-‚ŸÃØqñvø‹ç^N´ˆzZ\§þ°þžfÓtþ®w[Ûä]Õ —/¨îŸ«ãåg¤²m¦‹Vé 4xð&löÿ­û=åÂ$Sþ¿|b­2ÉÏm4Ó³t€V&KÙt!q¶–×NËIqH ö»Þè˜!¢‹åÀD:·.Ñ»õmãº7‰í%ªZë¢M©µßöLLÁø‰ÿÎp?î=pˆ]×fÉ”Qš?SèC2– Ï“J˜GØiýr+Fó›ÞÊEwŸuÕM®ÿÔr/é¨7jNbeösvµ8NæëT‹½{Fù–¼;øKòtÊsk NÓ"èÇŽ~@üú¬Œ¼˜Å‘Ë"6ÓºžX¤ –aM¤â9˜ñùˆ"Iž…­zìn­§|@¥â‰yô2Òܲ {]’ÞlV˜^$#ÁÇH NHbcEnb6 “×â–*욈ça…€à'•â¨*PÑg$÷Ý´(’'$ Bq¤Æô.ŒmÜ Ž©Y5Ggbô÷.,Þ“¯7¬˜×]5½Ý·ØJàÙ!¶C!&C·”ž{ö'³Û™Þ¢.&o¤‚mÅ™j¾i¼ÇÕã#©¡2ÕéŒa(*FÃ[/˜Œ“UÑ4Ž[ÛVTØvOJà6Z–»'¡6z×L¶ØßH 8-É·àCføPz3°ÿ-`ÀÅh'×ëîȹà!]%Ôf_X…ÝÒjŠ ÊÀÝ̺ à¹ã±„«öÛÏvéÅtÍÓè¬#ìP<;ýQ´ 35«öb&ÒÀ .nDŠ,õcæ0·ŠoR{תìG°"¨Æ„ºÚóÞÜ,§4ª|1g£´ÔJƼ­W\É¥š“ý1n¤&Ñíd][ªx¦®Jì·¦Ç@i!\¿£ÂØ,+GkµYJq)akpòÍBÄ–øq`©b&uß»>1• Iú„$²Ó©¸”‚YÊ~V«8>zY×ÓíWhæzpMkÎP³ºÚÅä†T›Ú7³ŠÛR_3ä§ÒLˆïª›¹ï}§–èÖ=™LHdZ°xFÖzÉ 3'ŸqÙÞ¬)Ĩ7OÌ1/ðÃDÀÞ8ËÆ¼;¼ 2ÄäÁ±yÔ³ßKËä} ¤´L’›~ï Ék?X^f™9ÇáVr÷]= ——TÉÝá1!r÷§sEú½]á{¤å?³¢óíé:õñù8}4êþ=ùøý,ž ùãgÆï Ÿ­éá/-zŽåÛ0“ëoêúòa““?îDô’¹1l 0 ÍŒc2ꋠ襌¯ýà~줒ÿTJ&íA_<:ÅœÁ‘#Æ_¥£i4uQ&ö³É|8b¹ÝùSœLC¢ÅÕ’ I}»pxp4;5†!%K†I¸é(Þ2r Å3^Ži¶ƒb¸Y÷¼%# æÜ~yÎf~}†ZíJf”!Õy³þE’ŒŽ‹…Cñb þt±._î•O…ÁŸ×s $¿´,Òãø \`° »›LóËú››IŒjcf~íx.<¦ù?<<[÷>ì Cº3¡*éìC¦³ë;'¨ül‘´Â'¦¼‡"žaDVÄsƒ³ïQK½ÄL–‡ÎñH!ãq˜B0ô(‘’8Šգº³Ú3` Q)Ç)çåæƒq{oðäwœàø´9-ͺ9_èýÑG¸Õ`LÛÂøÔ³ÌR;<üBÍÒζrÜÆÒÎy£^1ølçŒåÊúú€ŽÉ:½më7Q›’ÞzÒ[ì=ðÙ°1:³®£c<]‰°bçñxÀD¸q üWà¿»weÿþªÎqTÝ}}§™ç5à5¯ÐÑ£–àz2ºk[‘´£ö2ˆ v¯ÆÁd• —‹|€¹´Âoã2QÅD>`ehí¶ ÐJÖ$'irâb|G×[x.È2q-þ…)½YAyxa0º£î tM+??ÓÏ”y“D+˜d&ùzO´1LËîxî ÿ4²×~cÁöo-“U75õ6ëaTÒd'$ÁŒ ºn Å}«øÞ<Á&¼7ª"È8ïÈéªt6¤d­RaÚ (R)Ïô}ÌÙˆE%ŽŽë+ ­˜Dè)ü/Ð䉟4(mN ;'°Ñ¦Šæ No5刺7ífÌPî))à×¹¹]qpÅÁÅwp””æz+Oe¦ëÁÉ’RŠONŽ÷H˜½6ÀÞ{ÇK‰Xdo¬„Ab4AÄÔýiÛTK?µQ³UùË Ë ž¿ðV¿¢r‘0QÓΰ¿Ð…]fBF¦r}È{Dv6i¦Q0GZƒY)tãê,7ïÚ ª{ëg+eÍRÖd}ï&ËšÌ][91â±p_é[rNŠržÖþ Ùr̲æÔ:®OL/PFK¥¦Tj6V©ÙVÞY¡R#DÂÄbFýH“BÐvIôm9V¦¦ÀKñÄm“pý§å¹éã ÃÆu0Ç«;àë0²¯3šÀÞšuÒõ7e 9P ¥ÐºxìŽD{L+\Ctdy²œEÜ {.n.h¥ù¢¬kaù†Ýžb)ÓR·Þêˆ Û «ãýX;ž/r«y2Á´m™¾äÐÕŽçØá{“Œò (IäŒVïFõKÓµ…a†#cﵤÿ3Ò·'ªìÑKxÇ]ÕÔÚeTZÖÓÍÒÛ±í/ïncé-U‹ÇÎ&Ëx:ÃìNƒßÙ¾$¾}gm56Ü㹞Yø®aª€gà…ŒÃ~O»IIÆK2~g4Á8²‚×óB3=|æ{1¡¾P¼ùvbp¨]_(é.Ðè€Hª%©Šm‘·!C]bT1 ¢)DK5l(ëï®%m~­%ÅSò¶Æ*ìl0,i>5ò;m•ñoð#/_жõGk Ò#ÅãÈÒ±ÖÕqJ•eZ»¢Ý·ÆÐÕ݇(Uo!à ©¡G¹xÔ›Úˆf=3‚a›¨˜ê3µ4PVu0y´Ÿàu°i=<3~ޏ“Úºw¶RúJ~lçDtÄ×””¨´á&}»K²ð"6EžiKÒ"Ú<³¨]Ùë°kŸ­‘MÁJVN8„…Àpÿµþ :0 ø`6fÐ:w‰ýàjó-M¤×6÷¨âça€N+[»øØÒ¸–©ädÀ ²ª?1ZÁ„‘Š'Jàz36ÐTM—÷½16管š‡ç«¹ˆÓ›Tʦ0ÃÒžR1¤ÕÍš³ÉÈs˜Ïà_ê_“G ¥¡$Ó†’áè:-£Š}lÚŽ•¿1’ºò¸Šõé7•¾)/h5†=åz™Ï×`:æÓ×9™/öZÐ<¿v²œµÉ´òo¸ôF]¿·ÙõÛZü¤»¨4š~r½tÄì¥#›>¬Âì¹7x £$ÀèMß4Ë[ÿb$C Æ.íQ䡞\§ÈtÜ$«Ý0_æžiɆ^Qa™ÇHÖ»žsÑ×Ãa¶‘¶Þ‘ [3ÊCañ…]H ªÒyG6\\ùØÖõk’ü)¹Pº„sLiš1F+CŸáñ&qÓÅN‘`Ÿ1øf†Î÷½_ô§ÖÞL˜e ²o‰å·¬ø‰%y¸p"%¡¶jw‰o2ûÒ¦:Š{d iS±%" dVŒö–’Uº¬ÐR»êØ›øäãTÇ0 9›—kIøIá1võ¬cs¾d©gÙ¥žUêY?þò8õ,hHq‹'~R|ÌF+PùòŽö£7Të“ëÅy„A0joBÎë“1½X2Ùr±u¶üà81ý”Q#BKι Ð*ƒë«7]¯½epxÂ=¾N ‡–ãcðu¬2¸¾zëà£Ä1JÖR²–’µ\ž­‡ï Oíù ÁÇÀë0YK}ëÊØðPÜq+Ly6D#—à<¦X÷qt¼£*;ó3C;µ2aL´PíŧWd̼¬+Ò”8ÙIØ9„bæÂ™©Ò ¢1³ÏÄëÈÒSPÕ=›O•«8¹Ž”jÜÇ6Ñ$vìUò‘ØnLžk4dW+ãé1 Y’}¬‡ˆJоMõ¥UÝú†Ï†ï 'Ý3ý Ë« _#ƒ}Û$ϸ\]9V˜–rÁ( Fùã/›Ä(ñÙ<\<×N ÷ ‘x~84å}á\ä™,ôSí¸¦ôaª„o5êYêàè9òdA }ê–Œú“t$SóÙ})òEik‰t'{ú\:?G¼P1ñŠor ­ ƒ›É¥Ú¡9Ó•´e³¬Ç©a×G챘Œ•œEd©£NxfMz¦õ®b`Và–ÒTÌz˜w¤Z%^u={9ަuÌÔ4CÈÝFB)̬*ÊmÄûq5…=«Ò¸)°vdˆÇð±CøÈ‘UYÚâÍvÃ|ú* Rˆy ëo _8gÍ/* SŒæËÒá5‹w Pm ¡­T{ÌIyÝà†ÚiJR¹´Ç ËîÐF óèx¹Æ•›sWº•ýI'uÙŒêd™f,¤ºï.ï{c,$fŽ€ñó@“¨j†ôlM)hhµvt×£_Ì„+$n\"Ï@°FBtb< ØÍðÜ?‘¾Ï$rŸ:Ó¹¨ŽÒVjÖß’ܦùpŠ0rS"ç”_5hbî“(Zõªh ŠøÂ Fš§8ÀWÄÅdU“Ÿ¢Ö2ÄŠ…mtG6Ç:mõvÉd!c9™2J¡k2ĸ¸Ylu#Æ%1ˆšT‘Ñc‘ˆÚí²hl¥³Qžî[ç 3Ÿ¾š`=Vyý5 ôô@+°eK¦\Œ?J°Dج|§IÆÄ¦"ÕzÞyª²åi·”²FîзI#b²yÇÎñsÚöiMGSäŽ #z—VŒk»)3¡#¯Õ-Âg“ÂàTÇ^IC÷‘† eoŠ9—ÅÞ1/&›eæ‚¶+´ŒÒ^cÚì¨|“‘!bZŒL4¥”Zéµ$zC)øj½â/ÅÕ¯¤ϸzG{->x¬^øÙ“Ö¤dÓãß±Cã:ÖbP·‰JÐàôyS¾ G©{ÅÊ.·×{ï@HøŒÚäp\÷ŬÆ!s-d³~t²å‹å­Nj<[ æXeH&y¦Çbu‹€&È ¿ÀŒítóÄIÝNclG–žYÂãl1;$ºF±%”ŽÎQrƒÚÞbÍXŠ®™¤k4`•m³$® {l|–½TúN2%g'k)g¾…‡Ý~‘ñýéØõ®?ÍPÏ{gdÚmÇ·7jדü3ÒrLš¼P±{„Ǭƒ²}ŒÝf%ÖAkA=sumœ™ à˱ÙGd›^ÞÅH¾zÉ`<c$˜xR2æâÑ©´WÄÓ;'ÜRÍØ™1|Œg¨ <[÷9Ü(z¤¢ µé` ¦«à“æ&åKnbRÓ;ä|c¶j޽ãÎ"f2óxßÃä9æÃ¼·Úù ¿PÙ2Þ'Ú¶Rñ½ôš¡±;Zw†YhÛÔÚO蘜¾µBöL޹ðµ‰ÇìHGšy–¶èeßèYWýÑÍú2DVµÜòMÒò6ÕEmF´b\ÄÎb”8“g<_3.pòpë‰ãÃZ]}VjÓ™þfÿKGcQÃãÑý¸á+5g5Xû8*QhtWçNxYÉŠ*@-꺳ÌQ‘p¤´wÏÌY&HôÔ¼ FÒH*Mé`,b FùœHU²X˰˜Í™Ç£ã6KJuqûÅšpù"w°{,nʉý⃠ç¿QU"#JÃùJÅÅõé+"[›ÖX×Sãæxëm+5­•ÙÖ­òŒ+Ci?¥KP‘`¼·Úz µ–¸ïÈJ¢Õjå®7¢FMÒÎAbð”ȽàŒÇ–çÜE4"mwt¬HŽ­…}§fßí4ôÙ”Ž½MÙäάßD@lë…ö|»cÆŸmë ÅN«ítäv ügyÊZþI\ÞSÐMÙ¦êm*)™[A­qm /vÑÕ –toÊédƒ`P)*ŽÙÞ|†;°¨ºn’U(¤l硪åJk[ÄíB w­¸]äa­ {KŒb3J‰ó˜­„ýàx¾Ç“ ÔVž)‹ƒ8l< @CåtZ—¡•¸³ª ¥×‘•t\çŒéIU)>/‰ÅâbôÍÖH1 ¨Æ×Ìé¦îr}mM3ƒ19½’ÈyΆxjt Öæ™âëæü“{ø(B_Å’¨R´Q;P±ÓŒ¸«RÍÌ 9Y”®,qf¡‰bH»dU3ù4Å !¶ºY Ÿ\J«þe}F$é° šy+3}îÇyEVâÑæOâÅj33¥C¢OLoÃÂ"ùâùé²6·>¼ñt»œ^KÚdE_gIeºØÖÆÓ £ ðÔ“›Ú1Ф!vK@š§ãŽ©$Cˆ’ëiñ# ­ZŸ®Éù“‰F41È$‘³Þ€àPMssyVx€Ï†Ë·æ7W)J ‘g¬RcÇ­²˜õi²6!Œ}ž¹g‰§çMæØcE!ÂÇdÒ6Z!OJ–2l›Ó;¸RYÁ©µ‡a; ³1!\3ŸmYÁ¡r6wï-#€>U´†hô ‰F².ö¸‰Èœ)!Bs.×qtœezôœ[ ð1ØÐa³çl8œÅ…o<íšMÏuG”~ê‘™è~N=£ÔÇT&Ó‡‡›ä'§]ÒÇoéZcD$KWß~EáôÊfۻ©Ö5uç]>oØ5ïÀs Q<Ïp¸ÜNF0%Œ]aÅçíÇáò6ÆçÅI…‡µ‹S–ϦüÚuÌÜð±¿/ågÀrŒ©¤”¾úøN€A aµB¨†ú,`¦ø*!—h›þ÷FRL~mÛ;Ë”1Ñb½&j‘:#=×mj¾H¶*ÓÝ0øÏƒÙ`0t—Ë û•°—:J]FE9/DæIq¡ÛÓ7Œb¦lΤîR’”X&"`kKOs öGÁJz1¹·]íÆ{ø›1/—¯ò¼®ͲJaAûúODm?+®Í¦•u<ýúŠÓ?Èd]n–YéÁqÆßhS&dÕÔS$qbª) ”NÓJ«…ÞÒ“¤†wÝù‘¤æ×~ UÄ}ÃVƒ †aºæ?r,þª+†Œ JLÞ9æ4Øì‘`©'Õ*ÀÇVqÀa4z†æ× ¿wb™ŠE±‡áax_Xʸ0¶)1™OCëz¼Éõ)“¾d@µ$„„,5›2=5±´=S„W« ©Ç q|eÜÏÆà©$¼ï˜Yu†\³È*#w¦hC†iÈ4Öke[µœ®|YøÚ-Eîûæzùëðíey7Ù—[ÿŠ]8]Û„í‹c©êWë¡9—Žf}m!œ¾ÐxeÏväbQ`+ŒÛÛ~¨<Ü4–__žþêvž endstream endobj 3691 0 obj 8291 endobj 3695 0 obj [178 /XYZ 32.2500000 707.750000 0] endobj 3696 0 obj [178 /XYZ 32.2500000 665.750000 0] endobj 3697 0 obj [178 /XYZ 32.2500000 555.500000 0] endobj 3698 0 obj [178 /XYZ 32.2500000 493.250000 0] endobj 3699 0 obj [178 /XYZ 32.2500000 388.250000 0] endobj 3700 0 obj [178 /XYZ 32.2500000 333.500000 0] endobj 3701 0 obj [178 /XYZ 32.2500000 242.750000 0] endobj 3702 0 obj [178 /XYZ 32.2500000 180.500000 0] endobj 3703 0 obj [178 /XYZ 31.5000000 557 0] endobj 3704 0 obj [178 /XYZ 31.5000000 494.750000 0] endobj 3705 0 obj [178 /XYZ 31.5000000 389.750000 0] endobj 3706 0 obj [178 /XYZ 31.5000000 334.250000 0] endobj 3707 0 obj [178 /XYZ 31.5000000 243.500000 0] endobj 3708 0 obj [178 /XYZ 31.5000000 764 0] endobj 3709 0 obj [178 /XYZ 31.5000000 181.250000 0] endobj 3710 0 obj [178 /XYZ 31.5000000 708.500000 0] endobj 3711 0 obj [178 /XYZ 31.5000000 113 0] endobj 3712 0 obj [178 /XYZ 31.5000000 666.500000 0] endobj 3713 0 obj [178 /XYZ 31.5000000 113 0] endobj 3714 0 obj [178 /XYZ 32.2500000 762.500000 0] endobj 3715 0 obj << /Type /Annot /Subtype /Link /Rect [60 77 84.7500000 83.7500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Android_overview >> endobj 3716 0 obj << /Type /Annot /Subtype /Link /Rect [60 69.5000000 107.250000 76.2500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Android_examples >> endobj 3717 0 obj << /Type /Annot /Subtype /Link /Rect [87 62.7500000 145.500000 69.5000000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Android_examples_intro >> endobj 3718 0 obj << /Type /Annot /Subtype /Link /Rect [415.500000 362 513.750000 368.750000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.erikyyy.de/compilercache/) >> >> endobj 3719 0 obj << /Type /Annot /Subtype /Link /Rect [147 154.250000 229.500000 161 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://www.samba.org/~tridge/) >> >> endobj 3720 0 obj << /Type /Annot /Subtype /Link /Rect [383.250000 140.750000 460.500000 147.500000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.swig.org/mail.html) >> >> endobj 3694 0 obj << /Type /Page /Parent 2 0 R /Contents 3721 0 R /Resources 3723 0 R /Annots 3724 0 R /MediaBox [0 0 595 842] >> endobj 3723 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 3724 0 obj [ 3715 0 R 3716 0 R 3717 0 R 3718 0 R 3719 0 R 3720 0 R ] endobj 3721 0 obj << /Length 3722 0 R /Filter /FlateDecode >> stream xœí]K¯ä¸uÞß_Që\#>$R@ Ÿ²Ðè²0²ÚqÆŒ‘‰ùû‘ª¤º"©Ã¿:¤¨º×†}»ô )>Îû|ççùþŸ§ÿþÇéçOßÿçôcúûéûKs6msýÏiü¤=Oÿ>Ûž~üþòÇé—o/߆ÿÿãåúÂ÷Oÿ6üëÿNòô¯Ãÿþvúó ÿ2=4>ðû‹føûÛåooÄð¯æöw¼þëË¿ÿtúûØâÜÝ4÷÷Ÿ„‘VÙqwºþãeþLqùï?~üýåçë¤õ¢tÛ™î$´Ò'ÑkyúßÿzùëÐÁÜ|s¶Ýôòß`çvìÜtfè\ØSñž{¡÷é¹kd·SÏJô;õ¬‡ÓµOϦ۫ç^È}z6¢Ýio%²ç¶}׫É?Ò³Öô©*Ô³(ß³Ù­çᛋNµÐ²]éù[Jè0_¹±\rcyÒ§#_~dr[i†ÂÉ}¤áaúôJÛ;L_ó:}rš>Ñ\‡fOËÚArú~”53Bf[3¯íšÖÌuZTiÍrœ³µÍPÇ‚õ×Oî‡õêçAc±ÚõÎØÄó®«6ÿʾpôľ¾º¢–ÆVûã//?”îôË_ö}ÀËŸ_†33üÑ^œ~ùË韆ùUÿ|úåoÃYjæ ÝõÂÙöM'ÛËLw¾\î´g%­ØzG’­ëË}Öêj5¸ÝörG[ÝY³lD ¿‘OT#òzGˆ¹•×wZªyzH²'¿‹As¬hÎî®­‰öÜôÊÁ²µ×wä|ëuº>“ïcSær§?:œû=‘/¥×–ìG4ä;Ö_J yzóJ{gR¾ü2P¢<‡N5½ê>“›‘¼£zrûïÈÔA¶¦¿’óN÷£¨Öè;â °¾ôQ ¶½ÉEš°yšLÒ£g!“dÇb¢/jnÃHdžìG§S„È;4Ŧ,£v§Ë‘IÎN„^"ä‘ägÐvÞ~&  HO—–ŸÞšHkôtç•þÀ`þˆÌ½}ž‘Ym=v&‘ýK“ròÛä×{3¦Uºì‘phq‚–&éöqûÖ §ùÀz…®µ;ï¢&ù„‡shÖμÈ4»a›âe’þ™©Iºh^á2¬B“úLQúN¦‚´Á ‘`BéÏ |ZÆ wÁ—ì,ñjV1â6šs#[`‘ãKd+¦¨.€JQ³©¡½ŠTêK‘SGo3@A‰ŒÃ&ù@špÓH‰¦ SNßhë*`.li•™þ D˜&…WŸ£e‹ˆ±ˆ&£´Ìa¿‚ LÙõÅÖ(Ÿ;&($ôQ¢))`Ìx·)@¶³Óô{oQD:OPÀ·Çb<8 ô¨õõ…>Kᵆœ8š"£d>ˆNo?q÷-Oû ƒÐ¦z÷ámcb¢ÑÒãbº›6V¸¥Iû Â"þ*Ä„,I! =£“ʰÀö$õê‹ëò¶ÖírœBí}š%ï\twž¼è‹½û|§§Þ™(—0Á"Î<'¼yç3ugÚ®ÃÆ¿?¦y+,žUÔ³m7ó?¨ ¥G5™Iûso/S·a´LŸ¹‰| »a´ô˜Âgé±LD>#ÕÒW»”mÔüù_¨“œJƒXkhÚ!oOG¬p™`Kg±¾©ÈXD€?óJt-Ž–ði†HŽ€–Ã#84è„æˆP6˜ywÉ´žs›`džAh.¦cæ½&Ùz|‘ŇÍkižæYôѦéò“"U¬‘wèõl³Á‘E ãº!5%Ä…²›·ŸÃ±À+v –FzëD6¯už|dÞ*–*´ég;2²±ÞôÓsÌÆDM¡³Ð&ÂP{1ò¡»ËyÜ’•ÓTÚŸ'–"}‡D\W¤^#'Ø¡• ôØÈwèœE¿}vs§|ic‹¾C¯)sX{GÄPÈZžr´øŸå2в%>sŠšé†Sáv™=j&OCF¨Dâ\Ȉir¥„—‘Ëšf<>·[åX‰.6UžÊe®$/7@v)œoÞ’ Ú%Âß¶{^Sh`…<‹79µ°o¼bÍ&òC‰°…}OyQø•ÏkK9¯Š¸ +”œ$‹¬òM V3âåÍŽ(Uº‰‹åÀ‡°Ë×›^Ôo¤ Ç+Å!Åéìi¤ý Å ÿ~û-ÏÖ6§®ÿ!¦«úԵ爇§+?^:}¢—ÖŠÛSÊiE-ûžŸ~7ãk'ïmÛû} W†wÜ‘ŒOY§ëöñëËÇŸ²Ö´úºeàRQ¾•"]5 y™–Bߦ‰>ý¥´ˆFò3K1Þ=àYc¤‡Lf»<1Ù–½{¦U³v¦•ôÏÛp%8ÓãSÊiE-û¸ii×δ4~ÕàLOY§ëöQàL«¶ô™f ³¯1!½O°ÙÚÃŒQøf¬= Â)ÇêÄc±ŠKa)+Zä‘vŽúgŽ‘dA¡/!–Û)Ázè*U‰œò¥HïGk€r0Iæ´`Š3oQݦóíbšÄ²*+H f -ÈÉvúÎã;żâ…DÜÞªRùÏÌyã»… p¤·ò"”ƒ´*”pýã‘ éU›²8‚Ü Z¬›=qÄÄ@X<š¢jm߯σ_10ϱ(”ê[*W/…¡Ò&?÷úئ+È4›žß.%[/-UÁ´ûwN†ÖjoÁi+ –\Dt¢) à˜,kÍ mNc@"›¾Tèa‚¿‘ý=„˜Ë*+}nH³LI«ú¥I³ bøŠ –ת0Õ€Ì)GÒ,rf$ì‚@Í Ù…˜ë’“°¹pÁ´3Ö”ý ¿ãIìm…̉'q­}esïºW±Gûûf2CEÐO„;#îh$ð‹ÿ‰9ׇõT@†¨Ü| ç@ûÍ]9<Z'ÎYAß}¾Ùsi/92NÔ2±|Ìpv™âªÑ暇â±fV! É1Ÿ{,Z¯©,LÁŸ^Çà=÷ì-9}5¦óv â`Í]²Éõe•ÜyäWÿÓ途ö*Ý­„×e~ènº[]É [½©°ûT¾}­• {(xOß™<é¶<,|Àˆ#påô˜"#ø@¾CŽ \]zLw×#?ßVmëóAUf»ë“ƒœ³hçÚ;êV‚…™w•×ïTÌÄè#vñB¨zPÜ)ËADQ)…UŸÀ_sÐtŠ# IS» —ßñÔHŸ«±¢—³Œ°¢Oê1«Ì ê½ê,F×À©Ëjîß*Ù…ÂC%N1G½sœìHˆV!L³Š•’Š9ÝZÖçš»û1 úí ´GD‹'©~t)ª yýPCï»BØ%‘àðCìpFߟŽ2,¡½Ì„ZˆHN˜¶ÞÂïÎt¡Èè@7¢IRI²ÂCñç½>ƒÙE D泤EìRÙ)˜âSð®õœïðOÝ܇ŸƒrBòVÂÛÙW£ß,šŽ6Äñ¢åÇGÌmO5XL\øL#òŽš—Vj’ïÈÔA¶¦¿Rß#õŽR@?4I&Ï‘êÈ9(¿$=¦Rsm…š«LNñKI )ü>vˆ=…E//Š o¤a1jˆ0œ„º»¼ðª¬|²XúŸöhr¨§w;ò¤¬8t]ç1[ÝM[¬I0²’CƒŒñ¼ÐxõªKˆ.É GÄ[’Âbö *àÆÕ–^+`0’öþv*åÀadBHF6žCmõZ"Ý2©”w>Þ7Éþô0Mé>¢üT,}L›Îí2úØW²5:õ(H#¢˜è-EÞ)•rF ISË’Œ–_Öh¥˜»¤uW'ɳaœá GGJÈ%gGX1bÞåçÕàEÐߎ€Ë[æ•Å¡ú¬à@L'„ÜÈ›ƒúãaz›ÎÕöÂ.¼ÆÖR0ÎÜc¢õØZ=§’píÓ¬«Ûs†'s!F€!'Š/`5á„@ÛÙ6Q°‹ ¦=ÆÞrGHÑÍÓ Hƒ”ð:îxÆÛCa ZË€S–â#â= Íôç JO‡)ÏêçRÚ㚥J1ÔCKáu×#·CVùý+}f’+VìJM~Ä“œ€iCG¨˜ïô"“’rÒrDÊ0ëéG>Š.Ún‹G°q"é÷ÔœœS*oº!ņì ¾‚®)£Gl~¡DäšÜÙô/â®C4@`¦W0oŠ6"žA~±!‘«¤Ã[+œ¥ŠÉ“ð*õ™Z½k­gd’Ô>“DR²‘h<Sdž’Hˆ†Þ¶ =ÞäP pl?Ð ˜YOC¾‡Å ‰tüöì,ˆç™ÞçA„,KPR!\)ÃÁ®ªXÓÚͺXèÃÂ'Sµ!;sf‚ÃÁ«JÅÙ§|q!+ 3</CœÒ¬ (¢¥!H`‡êZu®AÛö÷gaS‡ZÜÕ¸h½%‚”ùÌ’ß1“>JÕÌ…X(%Ÿ·¦BÞܵoèÔ¼G›ÐsÁÏæpPç´6Âã|H H{@"áê«)ylÞú V¤'ÃPáuHA>ò{ô"‰>Я”@„” ³§ñ8[{»üýö»?[Ûœºnüc„¸^íÅ©kÏ—1 OW~¼tú,D/­·§”ÓŠZö1û‰1TþokýyGl⫟ ±)§iL·þd8Ëázœ+wq¸rר®Ü‰Æã˜ãŸ+_žRN+jÙÇÌ•»¦[áÊ]Óú} W|®|yÊ:­X·ü\¹ê>WNskqäd¨¨üëÔ=C¥[£Ç¦h­’dÏÄÛš5ŽdÜ3rBØZ›ÝÓ „òWþ¥¿]–ÎÀ±dçr,iÖ8–ì}n2\ 8Öø”rZQË>nK¶kKê r¬ñ)ë´bÝ> p,u+go¨]K/w‚Û'Eóü»¼fÝLE” •Râ‘#*,crHäUZ¤O\dÔ‚@È;ïlõ ³ÕRÆëœà½õx•" óôñ…ºSÌuÆ’Ï…ìõÌöHß³©¡…« ââ~a „Ý«ºT±â Ï*Û²&„-B4SÝã…Ú¶;Ôâõ1ý]·®þ®»5ý][_·®úûø”rZQË>nú»Ökú»VA*Ôßǧ¬ÓŠuû( ¿·7h–·§¿ï.LƒÃ©']˜ÙŽƒ3"ã¬(¼ˆ«=7AH(R‡°î#3h.­ ñÛòÀ}Bsªú³7ð•­=):f _“”Þ£bÆš _ 5þdŽÌÕÿÞž(Á ľ[œb©,–úZ™„nÉÓæ$šš£$zÚŠ’Ø_®Jâø”rZQË>nJb§Ö”ÄN}ÈPIŸ²N+Öí£€’hnËð®$çe»Q&Äí1'!ÉVHbo ŸKæÀÖy¼! ôÎ0‘y7Ù®—³&÷®Ø6Ý"WEI¾‘¸:­†ÜøS5!„Ž—!ïD*?w"›‚58Øôyÿ=V¤=Ãïª(¤+Nz#™‚ ѸÅËIœƒ4„ìÛå•ß^¾oŠÿ୹ط¾mlwi¤”õ%³¦»éц*`ñ”^—5X!’ƒ¦³Ê#þ<ímŽp¶-À/ bãÈCJNVàA;&–kþ’:J†Œ«{ך£6žÄ‹Ù14(2 3#ÚòhX‚‘òÃ\ͦnYÑ) µùIþkÏMï9Ði5‰ŽIe‹4¸'Ôµíýaòºzàwh5ÔJ³Ø>zÎóݳY‹‘dóÝËÔFDŸBx«û#Í ¹’ÌPG ñ'€Úf¥Jóêw·YNÑ Q>÷z‹ãvv¶÷:¦ýíð(8Éaç@¬%àÜviîie¢0 ¨lÚI‡È*O’›q0`±¾×>—Ü+¢1Á]aDã2–Šå&ôr»Ìž› 5Ù™›0WNÉM˜œn+™ô9u÷5ŸÎMŸÓ•Ãgç¤ä-­„9‘œ úKèqÓyStîíei6Œ òe@?sºu·e}Ç*Òã—È;dÍ4¦ü&À^ÏYª¥Ð£km=ì*,hôX-wD$ÞôgZ°z¤V¯±“–´h‹3N‡@ïè±Iî}kH56CH©9ì2Yx>ÿ©Øeà A¡¼ý!”¦Þ¥©7v¥©·>‚ÒxÅGiêo¸L·VÔ²¥©7Ý JSo|$¨ñŠÒtyÊ:­X·ü(M½Uõï7–0©gËÄcƉ'‘§4žHè8’ —°»gO–Dñ'spFà Y”VŸ]D-%ÚI¥BbýWH)Ï*îÀÉ)`Ië3¼„d:Þ=X(„—A, t<ÄÇÆBI§‘(ŒíD*âØŽšðSæ’TA¤½!‘Ú¬.d ª»°» ´"U<@qÌ_Ù¯ï;WáëÍšÂ×÷¾26\ ¾ñ)å´¢–}ܾ¾]Søzô¡C…o|Ê:­X·ì Ÿ¶Ù¾„‘ð Ð|yx¾c }ŽèíüHñÎR` ¶íÌ€%D a³­o»€I#.@A~÷áSïÙ¬ˆ›Ò.qS+¥ª‡«Æ'<*(U}}J9­¨e7â¦VJU›SÁï#(U}}Ê:­X·ÄMÓ;¿â–[ eÅ‚~zñø‰¼õàè%† àó{‰ Ô³U.õlõõl;Ÿ² Wê9>¥œVÔ²õlåõlEЇ©çø”uZ±n¨gÛ“§¤š³™zVü¡PéÒ·X}Pl…B­bæwÄÙlkÚöCÃWp,APŒ=¼>VŽê´‘Œ>DdvÀrnÛöCJ ` ÔÈ[Jާ)xBZÎ#±³ÕðJöŠ>%4Ãàˆ>‚`‘ ªOšfÍlJ¬ú?§5(&¨iŒtu³R™t¸Úúúˆ *“^ŸRN+jÙÇMç1+•I‡«MÐGP™ôú”uZ±nts€ëÌ:/À{.¬T½‚ i>ЉÛeGè")Òyª ¾e ðÉ[ÀÀ{á2À^®1@?>çr%`€ãSÊiE-û¸1À¾Yc€¶÷û°}ÈíåÍ­X· °7õ3ÀˆÉ:Pu}‰¦´™¡w_ Í©èP~^Λ;¾Pð#«¿÷^ábuJ‰…€¾!·óæý"ü(P1}‹*”,Š« ùûJÌøÅœûtkt5 Ú…ßRwh·|¤–]Y"»€;¹òUÛ‘ŠM5ÖG(7ííâÓÔ0ç*ÚW„°@£, àh‚ìÓt0=’« }†" El£b;…PÃe—DDN5°é‚&`úµ's7é; OàN$ã4[‡HØÂ½œ&&…€Þëô·ít'¦»i§ì~B§ï¹q]AiýãѸœŒYío•Y^øíåû&ƒ«ÅJï¸B¹ÐoV ˆ'z“!ðgǬޚàïEÜ:ˆh”]F6ªMHN¨X e½[£˜ù)ÁÇJ^YISœ &®ˆÜ“0Þž›ÞSbiìŠI¹”ç€çÕ"ƒ¼žPia/‹üMê!Ëʫ޳ôâîŽCüìá¾Bœ˜¼‡:¡q)î‹0[ZAÈr¡‚8¼ÎzÞœ<„xìïIAóåM€{{^›RÎ^rX òGq4Úç^ÀéŽ|,Ƶ»‡m9Š Ü«…d»A¹f4 ß é{·r7¼Úf$šo·­ÃQq(4‚í<)c™ÂU6ñ›ÒΔ^w'*åLyß /}ÙßCRŠhÐ_ŠlÀȨ=|Òw2ž„ËA˜áò„hÕòÊΓÉÊ¡e5†^8Aê@, {) Pl4m-BâxáÀJ i¤h®Hj:G8¥D]DTD‡æš7}4Ì ÿÄQ(ƒÎÑKiY'¯K Xr‚¶UȬI¦ÈaÌi)™äÓW)xݸô¡â"Gwg3Wf­fG6ƒ”šdÆÄûLêÅšè¢êm£*b+æRgaM»ñD\C "»˜(LÁb¯äj^Õ•€÷ÖíQ˜³é=µûu§¡ ÃUó“"Œ£¿NœjβQk vô2H=ßÚ0‚iÖ¾g:°}h`øBÝ¡û™, RÅÕ þP?âÓíø·Þì|$ß¡}5o5rT¶Ûv.Ø=ÿ¾–Ú6Í2O°mûS×/³ Ç+?^:»Ì9¼> endobj 3735 0 obj << /Type /Annot /Subtype /Link /Rect [87 771.500000 137.250000 778.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Android_example_class >> endobj 3736 0 obj << /Type /Annot /Subtype /Link /Rect [87 764 129 770.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Android_examples_other >> endobj 3737 0 obj << /Type /Annot /Subtype /Link /Rect [60 757.250000 83.2500000 764 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Android_stl >> endobj 3738 0 obj << /Type /Annot /Subtype /Link /Rect [90 694.250000 124.500000 701 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java >> endobj 3739 0 obj << /Type /Annot /Subtype /Link /Rect [107.250000 483.500000 165.750000 490.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Android_examples_intro >> endobj 3740 0 obj << /Type /Annot /Subtype /Link /Rect [113.250000 644 147.750000 650.750000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://developer.android.com/sdk/) >> >> endobj 3741 0 obj << /Type /Annot /Subtype /Link /Rect [160.500000 644 195.750000 650.750000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://developer.android.com/ndk/) >> >> endobj 3742 0 obj << /Type /Annot /Subtype /Link /Rect [169.500000 483.500000 285 490.250000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://developer.android.com/guide/developing/projects/projects-cmdline.html) >> >> endobj 3725 0 obj << /Type /Page /Parent 2 0 R /Contents 3743 0 R /Resources 3745 0 R /Annots 3746 0 R /MediaBox [0 0 595 842] >> endobj 3745 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F1409 1409 0 R >> /XObject << >> >> endobj 3746 0 obj [ 3734 0 R 3735 0 R 3736 0 R 3737 0 R 3738 0 R 3739 0 R 3740 0 R 3741 0 R 3742 0 R ] endobj 3743 0 obj << /Length 3744 0 R /Filter /FlateDecode >> stream xœí]IÜÆ¾÷¯àÙ€[¬…dhF£9$ #‡@Žc¶Ňüýpî&û«&¿~U${h!™YË«·ÕÛêÝ_>ÿ3ù÷É»çÏÿI¾v?Ÿ?Òc‘¥íIýïûóڻߓÂeÉ×ßß’o‡O‡OÕÿ;´|~þ[õÛÿüµúß/Éÿ¨þؽT¿ðÛ¡PEõó׿gY¨ê·ôõgýüçÃß¿K~¯{ì‡ë&sù÷÷ª0.-ëiÜúÛ¡_¦jþýñõ÷ûóF1¶È•K”56Q¥ÕÉÿuø©^7Y}>YØd<áöer®žp¦‹j€×©Št¬¬¶Wú¾ é ºƒJÛ!\r> «äslJƒá ï0,”IÎ4KÀ0^ÛY–íÔË ~e?X\àZÛZ ØÿÅòèòî?øû=¨äR]1÷ŠÃÁxäRYÏȺ°YZ:ø;9r¡«¡]jËDé²’Á™(r zW:¯q¸Î›™KE™\y;½ÛºF´dYf¯½‡Ø]¤;¯g. ”~·aç¡wÛš´ýÚ{ˆ ÉL@ÚnfжaçÇÒ*Uä¶ÆcþÒÇåÝÎæeè÷Ý€~™e¹D3sq¨ô{;êÔ•Ôøœªl£‹U„_Þ¨JÝwt®–ÕõÏB©æ©©Ÿ¨n¤þÉ×ê£ô¨T©{}Ë”Ýô¶ÃT_ôòúÃdÐA¥­ †©žÔÃ\L¦yË^vc/‡ù¹RöηâÿÛ'àÿÍóáӗûÕpyò姪©xóãKÁ,O¾oÀ`’/?&ª– þœ|ù¥:óB¹"k^l[²¦Å3›× §Õ}cŽF;¥Ï¾Q¦i©[¦ οq¨·T£oÒç¦Å­im.§–í TßÝ”oà8ê}Ûrz€_ ±ô—/Õœ6ü)TûÖl›íHA»ìüÁåÁÁCK6Ð’-®ÑR­Œ]"yõdDKõ[­ôÝôæZ²Ù5Z²v4ŒÓRó–½ìÆ^³(-eú&V𧦥<š-'´x0Ù ñbÆäÔ :?xhRÊLOJezþ`2)åÙ€”òü)ånˆãÕ“)Õou¤ÒwÓÿ™ H)·×H)7£a̘”š·ìe7ör˜EI©PÝvê¼E}‘…EX©Kˆë˜ ^š–¬ÇÁm LæÓé¢Ð=]äîüÁ¯¼HGx)¦ÑC‹Üõ«ÿ;k½H; m‡sE’—¯n•îÉ×Cî:lW¯oç½ôÙû¿Mƒåïõh ]}3œ‰Nú™¶½\®£&•§ï¢Óг-©”·u!a©5ESt½ULt€±ÙDìs-*Õ+O-ÎLE¾›€N§Ú¦   ›Ý\¦‡ó@%zޏÊ{<ž‡á@¶‚9ª,ßT–àÏ#( aá™ „½I%fBPJÚnœÊŽii.Ñá=ìí ‰B›w LïA®á« Ç#™0rå a„ÄË€ãh7¿7SÂ, 0zã•bèàÓ7G}¸ä¶nõKõTyõ¤Ý´Ël ˜QT߸¥C½ì¨G‹†½y¾Áã”èÓ¡„µk¸ØÒm¯Ê{î0ÚÞJ.»í½2·~{¯Ì œ¿ÒŽ,®µ¤pnªC=Óߘ0+*±Á'ØÛ j9³ã[ž! ðÜàJ=sKC_: uYö)N±â1·-D=ë"B@4ŽÆ®j"~q5A(‹ØÕu/N¸þhG œáñÀ²AÈ74¬×àk ×gâ™6!­°„a½žÂå–F>,‚ȦÒn‘o£^½à Ô³Ê Q/ ¨ë Æ¦Œûil°®jü6ápI«§0•ƨhÊéÖO'QRŒÛ™ÊÙ“u‰tÂÎHˆ‰ÆzˆÄ/S&5Ù¬‰}ò¸!1ºLwŒ_’1kÏÐ×ñq ©:\ú¹.¼ƒgA¯™Ë‡rGFͨ+ãÑB0g˜óëÁ‰è­ñLd 5pCàÁØŒHŒ^!ÌH%èéQ­C"ZŽÕËÍÈl`H/’Ä• lÆ-¼% ¸%ÖU{DïµýyÞ*¼5{.–#„“®DÇ=‘„â-0#¤4¦eœ˜>.¡sæ#1TªÄÀt‰Á$Þbɇô™…k1¨ƒ)š!¹§¸"MçfÖŸ¬¥+ Ô¬ošˆÍ0‰4Ó㺘 ÅÔ&ëb(• 1[þ˜È8$Ó0cf“ÈÜefó ­„ì`Œ¹MÜ‘€3Õ)[ÎÄf ÑlsáÓïu¾ö̓œFîô)‡‘–ªÚ฼ß¹õÝ“ÍQ« xöX•bG˜OIkŒ5ZàõŒ*«X¢2™|²™ð7(²á^3œ…ÄAÞD*#é*l…dÏdÛ ,Ë—‰ŠV´+ ƒ )ý\>ÀšMÇMÍ‹ æ†ý 2œe†ÇE=''¿Åü'Ú tÈèñìŸÂÆ''ÕÉX-'ƒd^6cù˜cÑÕ ×,:dXúÎ3l>Œl¬/îhTKذµÅ¾HAÙA¢ÈZ@¸þþ¬.b«<6+º¢®_kÉQ‹†ßt,òZËly†-zþ¬m [à8ö–ÁÞ4œ†5îMÁo^eçø›Â-ƒ-/°7[à <;‡wÎÚ3΃­GãqˆYŒ£xˆožõÀ¹iÌ)œþF€Œ1·@ öì6nÁ…pKñJw²ó‡¬Ÿ‡`}Câ›Gßa8Þ9ÏnïÜrç–›]ÆkfַħkO` -9E9ǪTÝ\>bn‡÷у±˜`çUQ¼ŒEMxÖyˆ[ðJÅÖ'à˜¾MAx5Å+&`Exÿ«*vO :u/‘o Œ@Õ«Ä™ËL çXqŸ¸7Ñû[»3×5ìÚRQW*ŒO–Ù~Æ7öÒ ¦ä-U 0Á±Š¹‹fv/”8Gja9ÃÜ *‘íáòË_»>ºð- ²EDEy´»,BM6Y€JgÚXdFiË¡˜¹A4ãÌ“ÍÉœ›ö3É]—,¬¹ÄÙ8=“¸ˆÈ“ +ªËã¥Ï 'dªyá}Â-±4Ô½ HxÃZiï >Ï%²ÔG:S˜‚ņBæX;ؼME§G£kY…RöòØQ¨9SŒþrõMjT”¥h†æ1=[Aî:•Û~6mû;Æ(_î&£<ë!b¨<2D¼´'®Ç)a¸½‡3À± x±|€&íåcù™„G*#„)éK T?h¤Ì§9ÅÔˆ¢²ŒW‚*Ê ¢hî¿Ç ‡+o½‡½u9ºoš‚2Ä)šª´|iÕð>¹L ˜ºçÆú 01M¸fÅâ†õÇ*±ªëÜôšå'§èeÝT=’Ò-¶ÍŽ ÜãW‰+Jcù¨@LMKÆ#{¿ÆòÔ²XÎwï]6¨”™Sä&œ-$o©õ]êŒÕ—C.yU(þ^ Ùëßã«B=NFºÔsí§ëѨô¤•ÂqVs)jk‹{]ôRáŸ"o…õ~<ÙÓ®“‹älŠQʘ8¯–8–/H¢J/S¿— Ö'ð«ßT`Âb…­vEŚć°÷3îë%ßM1…±Î6L)lÆ.ƒ SÆ<‚¿aê7Áo<ÇaÑzçs¢1`%&RÔ#gc¡HYýDŠüÒæÝdÓ°wXJE6.fI_ÔLé ÛÏÊl¨˜Àªi)ŽñÆÑì8bƒ{ƒµÞ˜J ´d½@7F™üᎠ_¶(áçÃlÊÃÚÞ\øà[eJ.7CÆI1Ã,J ˜Å<ïçôЇ=çZ6çú>ûÒ²¨CÚuUwKöÙ¡”¸„ö±2“ÃrY¥S;9®oLU›a;µÓ“ys,o@´ôI«^ÏĽ”Â÷’3Ñ7²Å+6ÂbN‰V½m>xŽÃê‡Û'“_ͱ’ª!öo:Ï,š…•p zn•Çb;J0ß+wmL¬Æ“Mtz¬¿ÿí`rwþà×Ãgÿ øë) pw’n›ÆL‘çI¤sysL†qkÔ^ㇰþж/Âõ„0œkËŸDq@óš¤XÕÌ$ib¨•CZ3 š;»4­§pɘb•CÞ«¶’È+RnIÔÒBÕý†€Ä¨ˆ9<:g†ô1Ãî(ês•¹/€qöJ܇Á$¸PaÅ„#Ä#ÉeKàÌH؉T‹i…T$îT™cÚ$íc·^ÄJs¶¸çöëG«4‡o¨ÂsóXT™;,aož]ÀŽ8¢guÖÜo¥ðVCYè`jô@:~}sñ0á1Ïà;)¦zÌw˜›Qׂ~à.0ÜCÇ0…ãhLY;m¯š¶1Vá\=œ‚€NÁÜ¿ gàá;˜D1‘šÁæB¬&œÊ{î–½ömA>SégÎmŒ~ëÙGHø>o¹È{)ÈßâÈòìri+,ÿJ=„‡î°äÉ5GYÂh¨²2d“:2žõ®¦½[U0/öhö/Áù.‡t¾ûª)÷˜Ç7ÅŒ×âV¼mÈJMv„-D¶‡ÃêÛúS~r¹íg­ý¬%. ºÀ€8¸œaÖÍ`qJئɃ—˜Ò1¬q Ç2úõŠ-ŒQi¦ÈwšYÍàq0öaë<¥`·µK†2Û±|EXÎpRÏi“8‡*¼Û¢3ˆ‰å…²;–¯Ëýß3Žìm‰¢2Ã3n!$PTj2f§¦šî¤&‹}BØ¿CÜ¿úò,Ó;îx¯<ƒ–H&ÊÕk|;3>="ÕêævªHµDŒ5#<3 "h™MFIÀmÍ|Ã!ødí„5 Ÿà={ÊDRq8x=Ëã[LNìÒÛ¾=|¦ÃñG ^zbܘ,<ìsÀ˜„qyõå²dÏ6wðp|b·7íaŠÃk´ë×ðqT[ÜÆEÑ–G;Ï3ñ”@¸·h»€e ©ÛB;Œªcäyd \³^¾ªÅ8¶ÞÚÉWÌ!wëžôJwëÞÊ1žà+‘,&vD¦‰w+a©Šèòl7o*kÍZuÝ6ìMÅ\uÜ#ÏÙ‹U 3b|f©\ì8 ˆñ™¥N]äÕíö=qûžhurÙŒGG8‘©©%š¹µû:^£7Åܬ+š ꉌ”GLÙçbb’ÝBTÃ.µÒ7$µ ¾ýñSyÚTN<–@)›òÕùÆã¬ÛÅ®¹![§Ãs{!‡¡G&Û‹ˆ?Ú¨&R”‘,—§l`LlTˆºµQ¸ƒI·àí\5eÈæu25¥™ØåãNd-ÊL–(á `2X=¾ÓUXŽí—Ú=D+÷᲌Ge»”acWnXsËÛ‘ÂX”­½¸æ8‹=*¥nëÃV"OÍ2h;ÑXã»  ¬-QOMA›“ÆìUX|L¾޹ݸSl¡J†t¿\,c{ácâˆ5±½5V×—É=¤¼¢Ö:tàþào28nñÄ€c]„Èg`칫¨ÚZÚ,¶ßc?us§î=.a‚­ ͱ}f1­•6²½mÍ^DOÄß›'¬(;œ©GÎ4ÈŒº2jõ/ùVuïýÓ­nN¯Lܵ©eŽ©Ê*¸$úõfûöäœvªØ7ÇÌæ®¸hiù¬>jÕ4Œ¤P>né  yÖîËI¶3°GkšOÎvò§ã³W¾él8׿ö±[iÑMáÔ’ÃÞZNoOSJádU·ôÑ;ñw­û¶X´ …{ƒßtŒEÍZzqB[áêß«÷3°{žøŒ:GèÙSí”M{A˜<îÃv¯Ÿï‡{‘šcG³A¦? –sæ&cú”|:üžAia endstream endobj 3744 0 obj 5548 endobj 3748 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 518.750000 176.250000 525.500000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://developer.android.com/guide/developing/device.html) >> >> endobj 3747 0 obj << /Type /Page /Parent 2 0 R /Contents 3749 0 R /Resources 3751 0 R /Annots 3752 0 R /MediaBox [0 0 595 842] >> endobj 3751 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1700 1700 0 R /F1409 1409 0 R >> /XObject << >> >> endobj 3752 0 obj [ 3748 0 R ] endobj 3749 0 obj << /Length 3750 0 R /Filter /FlateDecode >> stream xœí]KãÆ¾ëWèÀZöƒ/ °Ù9ì99ë8á52ñ!?”DjvH}EõÇê&9¢öŒÕ«~Ô»ª««ÞýùË?öÿú}ÿîã—ÿì¿¶??~Ùe‡2ÏÎÿì~øþ[Úß÷e•ï¿~Û=ïŸw»Çæ¿Ï»ó¾|ükóÛÿövÿ—æß_ö?þ½ùð§ö/ÿ·]iÊæç¯§Ÿuišß²ËÏãçÿÞýíûߎ3v˵›yýÿ?˜Ò—UvÜÆÈÒÏ»î˜æôç÷¯¿íÞ¶Šóu^d{ãß›ÚÛýÿ¹û¹Y ›>;ÔÞ˜²ðe6e¡ÒžVª‹½±u¶Ï,tú£3½QŸ<ÏLVÅš¼Ý¹:TŒ+Œ<û¡*léó¬®àïÓ€v$­ÂË(éfokbÓqçÚ@9£[˜<6¶mUžAVç1ÒÍ!®2Ié¸sm t؆“ÇÆ¶w®™ñ€ö2}„És‘¹O;W‡J‡o<{l„¹=­,"@í2{ ””6¢ì8í\(ºáäzvYžU&?ƒÇ]1§è2}è“GdåÓÎÕ¡ÒáÏ®ˆ\c³ºPþ/ÓG˜Ü•'?í\*-r…Ù#Ë鯕3ñŒî—Ùc ÄG´ñÎ;dt& ™ïäü < _üð´{÷¹¡Àbÿôs³±ó‚§Oßv¾ùŸ£_Xæû§ŸöÌ2WþiÿôË®>”E^Øü´¿óˆ­O#Õ¡ª³×#™…#O#þàÝ9Òr1ð;.ƒ³hÄ|8LÚRVõ'ÉO¸Cc$Vå«õÌiĸƒ³•iæqpšÍ™þÂØŒžxlᇧ†ž§‘¢)›i¯S£5U37tÞª1ÀðÐ,¶ñÁÍ(KL:ÀÁT†í¼ð~*‚[,xz]P3vaŽrBD­Y×yߊ 0¾0¸ñ‰w„„¢O`‹1G㊬Àª y.—Ϫi†®z,õát¦W@*ÐHËÂ×Fr8òŽ< û~çüi‰+lןÂwÕ¢n%<'öö9¶Ì0¶¶7»¾*F¸`å©ú‚‰=›þ1üCf.Ïb»°u'S +ç•'×5‡³9Hú‚˜çd>,20[Z(2<M Ìä.| k QᤠÜày(ˆ!Ê`P+H‰r Þ›À&¡ÜðÕ¨ÜðŸa œŽ•)³·Ù Ì›ÊòÃà@¸ 8Å2Ko QLUXvÒ¡½h3ñ”Þ¬±–À#Œô†'¸‘1z Óvô&hqB‡ °Æt€±)± =„­“Ê5\%´Ò%®.Êq«Oud8ä-^ï °ýùgv?GÙ£#N*È[ QhK%åçªØøy?/8œh0t0g0ÐÁ<­>†Ó±_,H!ŒìÍ`¸a ›ðu¥wJ¹Qf—ĆMnÜ“Ü`¼8Ì›ª~ñ&QV-Q¬O,QRÆ8Kï:kãú¥ÔU"³ËÓ@¤°›™¦AÅ(sxž\uo8.c°F$|ÌÅðY˜¦£ø4\[™kïÑî[¥¿(쟔ˆic¸Q·Ù„¥Åî[¬ª²8²f“BÒI …Þ˜÷¹É§7*ŸL}ë~6ù¤FIBF‹nÌHÕ²ˆ‘Ås†«6ΘÆ9¬°@ÜvâÜJ;2¾ýÝD æÇiÊèp•'Ï;Á¸O7®Êî~^ˆc®ÃÖ#ǘ{œUFä´´örÈ×Û çDMu?ñé%s ác¦”ìµI}ï÷æøl±œUF”·| ÖIå†ënÔ7¹qWrãÅ€7‰"A4©DÉSg¤¤ô$Ý Æ[['NSéaXlÈ‘7¢[Ò…üµƒL]z\o—7Æ5Uëç.¹Î¶·:UÏq‘K\b—âg@ŒKêÒê։Ɣ҇Þ=Õ”—k¾½:iº²žL¨»‹6K”Ûd¦œvN°špX¥b!­fŽˆbûRñL&;¥yÝrex‘`0LÍ Ï+ i¦:=S;Xu¡Ôf'/cz0dÈ‘¹ƒÂæ‚`H¨š%±EôMhýoæÞΟ܄ps;­Í{º ßî‰éš…o”—-ü{eHϤg†¤w¤ U‡ã÷¿í\]|ÿÁ¯»/‚4Š#ÆŽ[xMÕL+é%Ga7«'Èka:Ó½Ò» æå¥Æ(Ô^á}85FB¢J«Š©¦ï‰‘müv˜ãÊTFr0à:ó?5 3û“\ ªqGå¬7 7|“ÀìÒŘw}‰‚¾óÃðKU»(zÖVnÊžvÜbßÓ®ÞÖù΃Ê9f2!R0ÉÕÌÝ"Sµxž€KhRe#f§‡Tºªª¨›¼¨b¦òM¨Æ£檼E˜†[6Ó‚JEÕÓJ­í|mCØc«33ºY¾„ø)ØÍÁú¾.S¦—ÈöO¥õŸð½‚M+úX Võ#˜'…T !!MÙ^`\ó‚ý>°,5^—ÆÆú>¯NþÙr  ¶X©b2´‚+<$™ÖåtV™…Ù#c)^N•7ƒ;²þ£B+X=0U Ç”M|²/\×4ÕMÁs “›%¦WŽö2þÿý^ÓD~3ª‰¹y[J0y?SåÃbV3–/ÉMÞÓ’B)ÿ¸k ]«¯MC̨!ÖY(y]KTpO×nc Í UªUk#Q¦P@µä€ÚÁ‰%¨—í뾿†kJ¾I:ôÛã«óÑ"P·"õ2·ôØÏ9™¦Xѵ…þå¥ëèÔÍb‚f‘Ë÷11p¦rdÂrJÅåeÕ’ßjâìháã{ß)´I†YûT6=†nvfi_H$áÀòåÍÕö: GÞU søî\÷¾}öV[‘‹„0ÇPiCµ—º»†Zo®²÷ü¯ˆPÒðêbö^ºå¢Uê‘+w›­ lüà¼-úê¬O`‚~{×÷!jq $Á´V'ä ý=fÎïì OÚ`½~ÌÎzÍØnèeo©r?ʺ3‹gkáÂlªuËt#l£6I\7Ǹª‡P‡k‘Œy~1“¿Š²·Ïõ„mS!¥’é¾ÉXº7¼„á{Mv_¯›È¡‘µd‘ÆØº¶ð'hE7Ðü@,…€qEUZ”ÌeåÍ›#¨—f?zê%¬` .oÂTYOTâE(h]Å6¦iß¶KxÕQ½tsÆ£ÇêÉ_»ÐÀ¥‹0U˜®˜RYo“zî•ð„Ú»œè²*¢Ð%îE P¾®!J„ %I‰K3±\ÇëàK3¢°™pRUN_ÅÖYwi,”®ÃWV ½¨BQØø’•èc‰.5¸„'SŠÒ©éô¨Â»×´¨¥_±LÂØ"ô‘P”Ž(j*ÈXœJÀtÀad9Ö ŒÄV-ùÊtvJQ2‚Gˆ4¦7Ö@LoÖDJIªþZ‚݈wÍ@s#ŠO™D%†çpIRül%1e–—a½6ä I,x-8sF¢ó`Ñá„ÀTôw ±àÿÙ}HH±•×&³ÃSyB+Ô×+,#u­üeÀÊÔS`…µ´cSE݌IJKÀÑÂoÅE+p¡JÅó‡Åj¤é†w¨šyLÙ–þ1R:°¾ð¯É%L!%*¤$¨*(˜q0GÈq'²ì™½ Î\@B{wìø™r[á.q³·6§(‘08Š¥Py¸ p6!ƒš1lºÆë¤¢kfoŒ®w ÿKXÀ°fr«ñyð®U_FnØž~ÙÓüÙ?7f¨h¥>Žý…<ªêêžq‡Ì æìí¥ÂÁ«×îdÏû.¯ígyiöäá ¥H1iÝE{h ö|‡UÜ=ïZÇè¹¶·ÏíI‡5ƒ 8[{ãú²¥ nÖ´G°UÿØmÅ×ÞWŽaðlð;-³™ £—/dËÜñ÷fÇÝÎ ì°3 I“@ûò y¶a Ò%'Áp‡ÓÛÓá^fîÐòì+`wv 0ßmgT0=îwÿBþõ¸ endstream endobj 3750 0 obj 4373 endobj 3754 0 obj << /Type /XObject /Subtype /Image /Width 256 /Height 400 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 3755 0 R /Filter /FlateDecode >> stream xœí”UU½Ço|¸ö*Ïû?P¡úŹçž{ÁÌœ9s¶Å‹û?jï…^¨œ®Ô¸qã&Mš4cÆŒÙû#+ç™gžytè•Lœ8qÚ´i‘zPºöª ¼ÿ£tˆþu>W]uÕ§ZI$>øàßþö·ÚÚZÅ]ú¼yó¤vWj„ W^yå§|477æ3Ÿ¹í¶Ûî¼óÎþð‡7ÜpƒÛõÉO~R—üþ¯>ȶ_qÅ7ß|s2™|衇V¯^ý­o}ë›ßü¦õ¹Ï}î–[n™;wîØ±c#ËŽ1üäÁ'|¢ÂÁ¡ÈE†v-§PýŒââ‹/žëãÖ[o}ñÅÿùÏþ⿸ãŽ;ü»¦NêJ©/¸üòËÝ®ÊÊÊ7Þxã¯ýë»ï¾û—¿üå׿þµÚ‚Û«œ¥¥¥‘G‡Þ‡”yíµ×~õ«_•ò¿öµ¯)ò•¯|eåÊ•uuu_ÿú׿ño|úÓŸV ,WRvñä?;±êþ³ï¼‚¶ªûÏq‘…÷O¸eÙø™—NöxuÊß!ú—ós‰Ù|­ì¿Nûšk®ñïšÿ50¼ì²ËªªªäÈm(//¿ôÒKÊ͸îºë¬a´”š2yÊü;Æßÿl¿åÏÇV<{ðùX òÀsºëÑS§L9³dÜÈÂõ?< y2ŸÈF§-K~ÓM7É“yçwô=¨å*ýüóÏw¥äÿ«;°ùW­Zµ/Š5kÖØ Ê)ÿ?òèЩ<úè£R¬~ éߦÜ~ûío½õVSSÓOúS¥«¯—ª®®¶¿à¾ð›òì³Ï¾÷Þ{RþÚµk—/_žÿ #FŒS¡ßýî»ï~â‰'^ýõ¿ÿýï¿üå/Ÿ|òÉ%K–(]{¥öpÁó'ÃÝc–oûpͶ˜Â»Ö;ë²KãñYñøìø¬9ñøeñø%sfÍœ>szÉ™%Ê_¨þ‡DqÖYgɰ«>ýôÓ2Úú~d¤uaòjÞ~ûm}ê”G6ß•Òè[GYY™®E_ò‹­È¤¸¸,F™‡ÆÎ§Ÿ~zäÑ¡ó§-ñ¯[·NáÏþs—®_ÜFä©îÙ³G‘ùóçë‡þîw¿«¸<iU¦^¿ûç?ÿy»Wq õ[ËïÝïqO9å ÷dðÿøÇ?JQÛ¶m“´¾òÊ+þóŸå`hï°aÃ¥Fqa¼dÁýƒRÏÄRO÷Im‰}jáèOLûÄìY³¿üPí;ÿ÷ÎÎ/TWvúÔéS.žrúiFN¢DÔ»©·ÒÙê2å³i`+ý«·š>}ºÎù'?ù‰R”çŒ3ÎÈœí¨Qú*V{lذá[ÑÈ×Å¿ÿýï«kÐÀÇÞ8*䧃ŽáÆo”žõ³úõ¯¾;éK_²}´RÔãÿãÿP§ ¸~Pµ…Ç{Ìé_½¿â?þñªc¼ßãž}öÙò+díeWÕû+>eÊ)Jã_yÚ;tèPþáÇŽ{Ú­rÏÿ|ø¾§b÷>õ/÷>›{ëÐILZ’L¾þêk»_ß}eâªIÏŸ4q’j9zäÂõrR²½™© TÏ8cÆ yk² jõ’®®WNà8iØ•RûUs¸çž{”þƒüÀù<²'.®V{/^¬œê­"ô°#Kg¨^«\»suìöGbU+?TõpŸ[îsÛÃ}*îsëÃ}®{ Ï âAGsÔ Âõ_EQ6j°:[ëɨÑöºRGu”K¼÷Þ{æwïÞíâ2þ.òG:¹"Vÿö£\i^j—ó£¾~îܹJT¨òs\);æÕpÕ~¬ªª’e“W ¯øšk®ÉDÙºÃ?Üþî²ùÖ%øÍo~3{öl›¨½jáR'Ÿxò¨SG”Íû+«ú\v‡·y‘+¼Èœ;û\^õ¯C‡sú5)TÿÇEqÈ!‡|ÌÇ%—\b;Áwß}÷ꫯþX6®”.¡ÿþ6Qm\Våw¿ûJíܹS¡FIrüÔÞmå<ì°Ã"½ù N]t‘”/IhX!ý;=}ôÑá‚2éLº`ÖÌYS§MM“™6}úŒøŒø¨Ñ£lÿÒ!úÿèG?zðÁÿ{+žËo·OLäºtå9è ƒ\©üã*èöqÄ:y9j˜ ?òÈ#Ý^å<ôÐC;éÛ†ž†ôÿ‘|DjÑO¯Ë–-“=ÔpR>¿Rì®Hý åÑahäwi,yìqiçªPý…ÎDš·§m™8qâÝwß-¯Ï¥hïØ±c•Ó_êÔSOUŸY§å9í´Óüe¡w£ßZƒ\™ÁȽvW‡è¡Cô/?JRŸ¶?”G¶Ý•’ªÏ=÷Üý–²L˜0Áß¾ w#m=Úø+QL™2Eö°CT¨þèEªÿ"€^ú‡™Bõ8@/¢Pý×­¬«[UGHØ;Âvè¿fe)ëmŠ×¬Ho©):qâ=?^¨þkjMA¦–§’K“©e­á²¤i Ùy*›i ­ax¯©gY2.Kùó‡kËæ? !a8,Øþך‚vS¼zIuõ¢êÊ…•Õ «7­@ò[^ãÏ“n&ËÒ ÄdhM·»RKS¶m鸪r ÁWOþ¸­ßnŠï7?qâÛÏ »PBmÙÞòö{o‹;wHÀjÉ%I.õ¤¸Ä„J—¯¥<M/݈|IRmG›*ÙûÖ^m;^6•¨aªÎÆ é ]Ù5ÛÞ'®£,¬®YU³oß¾¦MM¦5yíÑä´­2ûÌ Û©ßÖ°ÖüÇ¡yk³$×¼¹¹²ªÒoaµ‰,ôº/¢PmÞÒ¬#V,¨ÐG»™] *ë×Ô›J¶x•l1•H±-ÛZ²2/¨t[³ [#ö¸Ú¥"ªJ­Ìæwylà œ<[¡úøØM›¤7™ëò9åó+×'öîÝ«Ž â¦ YríÒ ØjRÚVذ¾A’Ö.û§xÛvÖ5Øœ‰y Ô¦ÊmfiÚÜdz‡½{•²çÍ=*Û²µ%qSÂÖ\¿¶^»”^½´Z§dô¿¾1>7®îCé&óöÓÝȹÊYlÿ—×Xß…o¿eœÉÛHw~…q‡Þz»|n¹+Mªƒh•A#n#éu Ví¤Zô™XP\™m%2ÚjDiý¯k÷bþ7úÊ.s Õc›,¼šŒmAjFçÛZÔÒ—&»µ¡QylÍÉE^:Â9,Tÿéa©·).ÍKT2øRBÉÞzDR$­ÞA¦[²Üµ{—¼qk«µ)RQeZŠˆŠ”Ï/w•(Q)VöÊiKIÏ¥•îÙ³Gõ”]T&÷ÆÔ° Âª]î“ÕF”!p;¦°MÃú`ó'~€Ç Õ¿+h7é_rÏŽïØ¾cß{ûór3ŒŒ·µÈJËVK±’¥ZSfù¼r¥H“R¦¤«*%ÏG”J)]®KPÿkʦ–©±HäŠÈª§õïöJÿ»wù[™:Û ­ì•n#óg;À·‚íÿÒdjië]—¥ÉæMͱÊ>KÒÒ³1æsËm\š—D­ùUC°’–VÕ@¬gR·ªN5Hù²çªDmaÏî=Æ#š›Hyn¼uclDMÌê_‘´þ«Òú—ìUVuÊrùµËš}]£GÔÖØ1ràü‰àñ‚ív%Æ·—ÿÿÞÛÒmÝê:cÉç'vl3žŒ>šQ€7ÕXÕIºra¥…üš¦Q[#õÚlRxýêzÕàÆ¿©Öñ¬š‰Ñÿî]ŠØA·yè°¤ÚýSX{íQ›_#·Õ*TDüÄÃñ‚í¿ÿ>ü’¤¡fØ{½ÙÌ-G„¥mÙp™å²eŠ›nbS“"ö¶ÉÖz«ÓÞMßö´5x÷?mUêYT*éY{ÓÐæ”›sðvÙÛ¡™shMÌz6AH¸¤½ú÷mi±Uùn¶nË/L? 6›§^jsƒtA…}"&õšfâ«ÁöE™R™[ýÙõ«*×§¨-¤[Нlº¶ÖsH?`cóm…êߪÈZÉ) ¤G攟ïÝ×[bT©-ì·l8T©ôÓ® f,ܪpB¶‡í°ÿí>\õ¢jçÃhK\ŸH›ývI×Ùvgá»ýË$üÀ…ïßþ·£ H®nbCûÄŸôõ;Õmë} ÃaWÚBžv±ý'$ìQa¡úKÿýK'•ÆçÄËç”w^¨C´ãúJ¿ƒúÕ¬¬1ÓÛ¶¶4omî¼°yssݪ:µµî¾b€ ©å©]¯˜)g&ì¼mw:LÕ'nõ?zÔè¶ëßÕœn_=£I+Î-&Lëß‹*nÜÐØ¼©¹èè"»K‘ú5õjFÿ^³ÈóÊÅSËS6?âêÌ4ô= +K³mN‡Ò¿×ÔÖÈò+.‘«-”N(ÏŽËÚ7m4ú·yÌ"‡+kÔLŠŠŠ”’Žliv)þšM¸µ¹»¯ ƒùg–çææ¦ÍM6ÒIqÛ t÷d0¯+Úl–÷—WÓÙ›mÝ}Ŭñ·âÌuS'Ä7§ß ÖÝW !#û]nnêî+È`ýó.¿× t÷dH‹cSãÆÆN½&ÐÝW !=òÅþÉóÿÓöyc'DZÿГh\ߨCàÖ­qCcw_1@†äÒdúA•»º¹©Ããéa[šÛñª&€Î£ÿþõkêíÌœ6Íálw¸µ¥amCÑÑ, =‹¢¢¢øŒ¸}ùcâúD‡‡ö•Ž:DñÀâî¾V€^NÓÆ¦ºÕuõkë+TÆúvL£O]½Ð¼Œ¸qccýšzm•Um­Ü•u”Œ+iÇ9´½Tûê‡ÞAz*N_ó ¼ÒI¥Rgñ`³jhVåËÚZ¹+›¦o¬nU]ÁgÐöRí«z n*ZùÜrmýôO.MV.¬´ªˆÏ0K=h+oŒ¤öÖ¬¨©YYS·²®_¿~ú˜Z‘R¼¦¶F]J/›Zó¦Õù+/:ºHÅmŠŒ¼ ¯©°¶¦zQµYeqiRjte-‰ù õPÚ;dðÿù(⿊À™¨”ºW*¹,©s®_]?dØ›Ù]c ~8а5ïÿ­­‘ï!mH9V EEEêbÞì †u 1O~åóÊM~Oíjb^Â}Œ¨Ük\Ú+qŽ5Úè¿6¨ÉOõǼ9xʬ¢o¬amƒª¸i•ž¥zŠeæQÏÄWÊ%ªòä3ïΜp aüYÔ•i‹*mÈNÚ]òX¤ cðkkäë¨Eh¯,¹â1¯¨¬ûÆøÿ«ëÕ ¬I´ÿÎýФdBÈ÷é³ô¢Rç©ú»€à™¨ÔºWCÅõR¾zÙùÀ5¢ÿœÀT|¿ Ë.*3ƒâldKã³ãÒUZúãšúÈ&`+—e–›³úwöQPÿ *J'„Æ>}ê|œþUgÀÊ:©©efô­‘Å âtwæ;(ú?ÀiXŸõëË‘«œŽ0“¢­ó`]ççÈW‘ÿø˜³roŒ)ñ+ýÚz›¢š»å;œ´aÿ}gh ­™åPù瑆ÏÄ•ŠÏ‰[×Hû¿ÿA³¾¾±ôÐ#^JýÇ<ÈŽ7í=I}Ô^mÖ¢>æ©\¶¶7q}BÊ—Uaõ¯Êuvè*5Ú#JÌþ<á3q¥¬µW{É¥—Ó¬kê5Ïp>èhÔi§èØ›$“¶±`sjœk‡®= iØ-EbîpöùoŒä£Í9Ñ?ôX“-Õ4nht·Ð1S}VÕÙj ÕKª+«*•ÈénKº¹”åsËí]G%¢豤–§¤j7&ëv·7ÓFêU†˜§i>œÓÌ=óîí»Ç[æ9¯í¼lèz2%JÒO”²õ/#/åËÈ»ÇFþi.gé¤RÅeêµÙçÅJI\Ÿ°{MãBÿгI›nŸª3ÓfG<6ÍÖÖŒ}/ýCÏÇÎê‰y"·ÚnÇ´™ð4¡,ÿgçÿ0µzò|¤Oy5f”ê9öí˜6 MеŽíx™©5нØ;öÒ«ôØ]vô¶Ï5*4s·`gzî8r¥¿âsÌj›Ï1ïgµÿ²ìí£ù÷¹ÀEÄ<–¾&Ñÿ×'»:‡ÿ‰ýÚúôì²Öûá–ý~Ñg:b‡Zžþ/agüF9iû\£B3wN!ýôÌ+½ÝHlî¶CÊ×jõ߯_?{J’}FßnÂúW…RµScúß©}³þ^gm¥üßF䙎ØQøõoïaÚ[—voxnC9“K“ 딿xp±›Y*0›(ÿ "‰ÎJeÊô•2;TJšžË+•ùw䌸«DæÑÌñXX]>·Üš}óyvE׳"e/Ö}-ŽÀL'gCLmž8í·êÒ—y8ÿ7é¿X6…úæU•_–EGé$•3ðÿÐHËžß¾Ì<ó¸¬DÍCÏy §(ûwosQäù6rå ±£ðë_2³0bóžæö8äØ3Ñ¡oÛ?;(ºTöl¢ü3ˆô ê›w¥‚“<üËÅ¢þoOÉ>˜SNû¸M§êÎ6zWÞz³Ã3Üï¥ó·ÕZa¸ôÀ¥å:\ ¥Gþ÷_gXyI_£]@, }LÔOÔü.ÿeîw—_æÛk]‘ù‚*eµp_s}agÞÙúϬFrS…Œjxn+åæŽ:E¹²‘¥³‰òÏ ²}¨ªuëY…õïŸeø¨oL¿…ÿ”tP{ã([ž]ùë±_KäA­fÜ/ëæØé…‹—}iù—çêb!ý«NÛâú7.D”uÍ3¿Ëýúùç±ä׿˦¯Âήqäú6‚õ‡Î¼³õX!<·Çí(íÚ¶þ²áRáÙDùgÙ vté‹ê›¹×p€`o5˜˜]B¿ƒÞð@=‘zOu #×-€žŒ›ü“ëQ];ÐpÒ>Ôs#S?áY"ÝEø¾âûÇ<À²þ[o…9"g‰tý&™D¦´ÿÀ„™üOIº¿þ#žÅä~å„”lg,Ø-ð¨B#b{+8ðü.ÏSr€®Çùÿ•U•á‡ì‘ÝÛŽEÀÉAÿУðÛÿ‚ôŸßþ;S8ð GÑnÿ'Nðf‘“5é~Ù©‰áY"ÝHÎñïœÐøwN[;ÄNü¶ŽµŸÀ,€. ëçÿäZÅÅ­Z™'¼’Œ"þ•{#WŒé? ¿]å Ï¿8á@¦‹çÿÄr¬ââ_µ&2Oà9šÕ÷OºˆcV¤xÄyèâù?±¨U\«Öò„W’ñgÖ!"ÿ[ù¯=@ºxþ% ÿÈUkÿ­¬$cV_ñZ–Y2(û¯ÙnŃœ(eSý¼k"éâù?–Àº1Ñ«ÖDýÓÙ¿’Lb^BÂV÷ÿýXöŠ1ª0`éâù?¿¶#W­‰åþ§`%áÖÖ¬#ïËÍ5Òø—„éâù?–Hmç±ÿyV’Q“´K¦„WŒI¼Ì؈¤ëçÿÄ ×äJ2öƦòØÖ¹bŒ†´cð½ ÿüŸ<ï?ê¨×Z¥ßŒ0 gÌ»(”€óÜ$ŒÜÕ>ý‡ß&Ð-dÝÿ÷¿•)ûUP¹^ØÔÆW†_#Õ7ߛѺŒ\ú¼ *çë«ÚðʰÈ×Huàtk€vãŸÿã×àUP¹^ØÔ–W†E¾F‡™™ÐÈeÿƒ/BÊñ¦¶¼2,RÿJìÜ h…ê?øúª6¼2,â5RÙÓº‹BõxaS_xT`:À‚ÿØN¯S endstream endobj 3755 0 obj 7788 endobj 3756 0 obj [181 /XYZ 38.2500000 89 0] endobj 3757 0 obj [181 /XYZ 38.2500000 89 0] endobj 3758 0 obj << /Type /Annot /Subtype /Link /Rect [66 638.750000 141.750000 645.500000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://developer.android.com/ndk/) >> >> endobj 3753 0 obj << /Type /Page /Parent 2 0 R /Contents 3759 0 R /Resources 3761 0 R /Annots 3762 0 R /MediaBox [0 0 595 842] >> endobj 3761 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1409 1409 0 R /F8 8 0 R >> /XObject << /Im3754 3754 0 R >> >> endobj 3762 0 obj [ 3758 0 R ] endobj 3759 0 obj << /Length 3760 0 R /Filter /FlateDecode >> stream xœí]ËŽä¶Ý×WhmÀ5")Q˜~L,4¦/‚,‚vÃp;éx‘ßT’ª»$[Ò)’’jÊ O?X|]Þ{x_$?ýéë?’ýž|ºÿúŸä¥ý~ÿu—î‹Ý—™R…ÍŠô’Ž ]÷d³2Qº¬Èž–ƒŽ_~šWwy®ñÃȽSE«äÖ÷Îê"ËÓÒÁŸ/šW©]K4cí½yÿëÔ¦áü0rïTé·îQšµ2º!M]ú›±¸… ÍȽS¥]\¡õÀÒ¬‹R5D+óKÒµbI\µ¹‡c¦z侉Ò-w¿ñ§9à‘ˆúÅ›Pñîy÷éK%<6yþ©XÓááÛóë.«~©5ŠJ zþ1ùC5õÇäù—J÷¶P®Ò»êÏ5%eS’ïÓÒÔ Ù{ÉçCI¶ÏL£¨½—Ü5utWô^rê({(q{W¦VŸô£aIAÔy<”ä{£:)Q¸NgŠë¸¦dÂÔqóº$&ûÑŽ_5uÌ>Ϭ+¦•àÖt36¥ºJïurØ\deÀ3¾üYÃwÏ"𼋻Š»u3 ³5ŒTÖL÷{±w®ÚÝmý­Pªýk™Øüh4µyÙÙl¯j½Ã©ã§ÌI+æcÕçÛßóºZÒ¯ úÈê:½‘TŸr'­¸Ó>~ÞÝ}w!Щ,EXçZ¬ËõéÒ”ûÊ ÓHI+ˆcurXr7¿ŸSçõƒçca žßà~`‰%_P‰Â3…£Æut[{\z>¹‚£NakŽ @%öƒi`0xC?ÛC?;Š~v€~výìýì úÙúÙQô³ô³#ègègOÐÏÆE¿â†~7ô›VgÍè·=¼r=¼r£xåxåFðÊñÊà•ëá•Å+7À+7‚WîˆWî¯\\¼*õÙuUŒÜ]™<(Œ¥X†p<÷ ulíc³’èXp0~ <ÁŒ¦at·ÜãúŒ6Ωá×=ƒQÌ‚ œ=pHBóØÑWPh û¹~0­pÄ?HŒZX~Ì]Ø=ÃÌËëT’c)î'…Ô%Œ#Š’ñ>Ó¶[­cØZÛ–l¦[í)pËKwïk‹Tš<ÍûÛT$&ƒ;=îGÁý\а­G-ôƒK VÕÊY@]ÔÝ`ÌS´¼ã:}XA UA=Õ`ÛscÁà±Ýx4¿©êè‹©WØ@ë%ôƒë@¥Ðä¤û?±K4ô™âÖ4¦(´Ÿß¶Æ`?‚Ôb@ŽÕ4–Z,x¦°5“E”SžGÈåÂ:Â5Ñ“0_€W¾0K:¤€òË1n(ȱT?7¢r_Qœ§ïâˆm0_±eË5Ãc˜ÿý–øÝ36àwŒÃÿ¥Ýÿc¬Àø‚Ç&ÈöSC£dfqiü?kåVãwÿV!Fìá!†0¼dš‚ÈÃe6øŠ‡f ˜` Srë ¨Ä(­ºa”‘ë5ÕYX%Z[³Ò ,r„ q„º´} ða`PDe Ô뢘9Õ¥írdqœSˆ˜ÙÉFq>¥Á‘y"£Yˆ²)ïzÌØHñì˜ì¯yîBn ¾ißÛ@Ìs…ߌ¶kËÎHàÛnYMëÉjŠƒOå1~ç>Ýði%ÔY:èJõ;5fI“@Eœ…ùRga¬ÁRK¡<æXâ £_tNPÔ¹6in4º‹(g¦;#ä9â‘â¼F:q·Í’›œE—³Y´Æz€Æ÷ DZ9a¦øl:±³à5ÖŸÜanÃó¹ÉÂÂ{ŽŠÑéû¥cØWÍÜmì5þK…ë@· 6‹:f-IŒUDœ“xåòê2§V}zL› €0QèÅsM1[gf>§x¾ÝmFÎAba°˜#‰ÄB*á¯/Ñxêƒ$4*}`FšÎÝðšØsöþ¼€û\®²ÞF7ƒ='py‰ž/%Œµó1ý`êÌÈ`ZjcrZGÖ¬C"‚ÈBúáL³áÔ8x™Ü‹>•¾Ž+¸N°™€]'Ø„Árh&aÞEX]fûÀʇ"4{á¹ñ‹×1»Ô¦OúÛ ÷·îß-ŠàtúYž: Ü—b•¶ýl±ë«£)ɱÎaÍv´„wÆ)m”XFœŸËª]Ó)ÆyÖ[Þh-ˆãŸ~¯Î÷lWz9GËÊG†.ó¿j䌃Ø&ÅîÅéÇ!üÞ‹àw“b‰2þíèÉ”:sü^Ä–#ÆÊ qoAÈÿÚõœX‚³¥C³ÔeOa†L 3°òñ¼ŒV6?iøŒ#|— ÎÅ7 âÜÚîÆY~Ä’‚›–È+¨××Éa?¸DÈy–Xwd⌖<¢lº,¶lâ å…|*"7йçVð`y}„97x¥a—±~ð«ÞŽÝŸ—šÈ2c"fOWÿEžß^ðë/¾ óÁoÑ"¡ü2 VgåqÞj4 îÇ&PQÐ \DÙÌÔj$ÐßE'æm׃<±4nAsdô]¢Ÿ Fú lÍDq¯Z‰ß{ʨ[µ˜ÓÄî*膘ÖL•ˆsPÑRænâ¥{&bñÕbmÊØ1Äå‘ ¿Â¼¼õLéxl„&‚m#&HÝ çÕÖ£0€y¹6¢Ôfj ±qÁ^%üW é¼Qû¦ßÛ®n>l±5óóª 191mŽÌ¬.ïIÒožjQW쩎ePY‘<±ö›Wæ,BÚMäeÄÊ $ÎË š8±s/oÛ\¥-à¶Mruš+‘¾¼æª™›éáØp^žPk8«kpøüÎ*v \ÛõH`,ï¼MFؼîLô8–¿^È:"nd›ˆ'Þlû›mObÀFmûkÓb¯Ìÿzó–\°ç¸o0Œ5+¯™¨TÞ$“ r…þ ›n"Öym;Ã&ý~}ïëÀe«cÇùÌCÄÙå±}ô±îäñü~qVœ¹_„ºÆïvøŽklo2ñ¯gÖq‹Ž-bǶÉå1ï1±åNR%ЇÏmP縰Æõ$,D¾²à½²÷kÏÐ6ußµÛã…Š;ò§÷¹½(ÔébÏz§pù«=—¿Bø›y‡ÌËöÂÝÙýFðG™7˜·ú„Áz½BØËõëÛ|.‚z¸³5^ʾèQmÖ /6sË5A%áIˆÅ×VàU¸;ûFø' ÛçŸ>ì‰ÄÛo^^Y`6ÉhO'.†V^/øŽõVˆ'øéÄXgS ¶8 D­1oû…º˜7±;ÝÝö¬™;J™|(æ´qÏ6¶à…,oORM |fÂPçš0YrŒ¯™¹¯Î¯÷2ÒM¼ÔëŒD¤ÏóëŒÌâ¾?G­Þ€^›4 žUf¦·7;%¯/ŽŸÅÝQç¡‘¯y6“9¼/µ<^XÙºîGTHÊ¥´¸Ä’Ÿ×ñðÜïL/i/2kŠg:Ý5Ky#˜ȱ+}ð¬^u,GøùTlØÅr· VSiÅ!jY°ÏCÑš ÀDHjƃžÂ` ÐY乕Y?Ãs#FÌóÂLøf m‚0/‡x,rI©&ØtNÐó!Ìž#"_eŸ± 3: ¦ßšÙmý/`ª´ªQhm´M•ä®LjÈ4Eòò*¯Îmƒ¶Ù¡ßúß—×äÓŸ_«©fIòðï‹QÝ%ªCumkP7¦8æÀµ îóÆfz§ÝgTÒ2a¾×6ïѶ&Ôùë”°Žë4ÎBõBrEÇPii&–à~Z&£Ž…cÓ°N9¿D¤›Á#€%-î+Û Ä;ÝôQD{tÃ4hÇÜÚ6™ê毿-úƒ üX8õ8ÖB§ïÂç÷YùÀûb, n5¦ó[™¶Ò„’m¥f1JãŸÁË]x)gH¡JQÄgÔ¯év%CYÊ•K#œ±¶ {uíQyC&*¥®· » ã|$Ëyn32=7e$c‚~ž.îDJ5•2õ0QÍQWµò}Ù º…Ž‘R ™W=,È!œ”á·¦²¾â³ ±bKs0Ùï4‚â¬Þ¦8#];ê &Ü#Ô~ÊTèKì0„·˜ oI3²Ì‹šïÓ L„ß -b™®¡ƒAŒÙqΈ‰àD3]öïriÔš S}%oÕ ˆ ôtîVÐ- ©æšªÚß™3¸Û{+Ç$¦YÃbd® ‘õ^7îô%h‡%íñ½·}_²VPÎP?æœogll_Ú™\¾­ðâ"ëkCcƒUíÔlY5À*ïÈ4n Öi…NÍšú> endobj 3763 0 obj << /Type /Page /Parent 2 0 R /Contents 3765 0 R /Resources 3767 0 R /Annots 3768 0 R /MediaBox [0 0 595 842] >> endobj 3767 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1409 1409 0 R >> /XObject << >> >> endobj 3768 0 obj [ 3764 0 R ] endobj 3765 0 obj << /Length 3766 0 R /Filter /FlateDecode >> stream xœí]Kä¶¾÷¯ÐÙ€µ|“‚»3³r°˜r0rÖq ÃkdâCþ~ÔzôLKý•Z%ŠMµå…wf›-²Xï‹úð—çÿþ½øððüŸâk÷óáù JoEû_qüóýûT(»ß lñõÛáµx=|9|©ÿ~=´Ñ'8&F" â°R|†U.C™ª)ó@;SG/ƒ]MCÇJÀÓp„޵Т5°*… k9œ~W=²n¨zV#S Nê¡Z}œo”4ôÜ:L]"ÃÙãÓanÂŽÀhz¼c¨ˆ…1ëCÁU-RöqäôÞœVŽûG(rLJì€bý–@W!au8°tVqS°œÆ|û‘áô>¢Ùô§Nóèî¡+F8̈•1ÂѤ0êÂŒ…c‚µ£DÇkp׺¶\Ö‹ù2¿x¤ÛÅ<3gƒ†Ä‘ŒZ[›H9ÊÐpÂV¬Ž™äz-[ÏVêÞì]Ã8¶ÁòÝ}ìãuø^ðËY0' =œ ;ŸàÌdàuð~ˆ¼„pq°+Ý/<A£]BmlÞðN1¶ìÐÎÛ©Mƒ,vcòè;Öçk,Û í"°lcí‚õ5äÞÄùåõ©aãh>Ì×ï”±ŽÂZl—Ó äóŽÆTÀ8`Ø,Bê±ÇŰš„Á”‹Êo‚ tö«ž7¶Ûbßß%ŒE¬\‹`:FŽ6V!í2#N¸^¹àÒÆ^Æ»UZ_WC*aWmÊIX3ïèÂÎÅîý”ÊUiÿDåÈÅ/NŽù®Ä ˾‚IoÌLYÖBLP¤¤ãDÄ+¾Vøx¦aV¿¿t^¬!×fE§‡¬H-t©qÆ6o¨K‰I°ŽcH>GÖ8Õã9%2\ºÂª)6OíF-'sJÝ3øaÎ Z `6¸ÞAÄ0r6¥ÐÛHTBÁèð1>‚7CF\ÿ¬yJ`½ºÐÞ¹is£aº†³aTˆDN¥â‘û4¬ó,Se…4|Y…sÝ“eBšHÊC̰A®àð¯$¡Öñ.‘©=(\ØÆœ) ¹‚à“#ÚMsOÆ|¥á3š±Ÿ¤¼híÌsF:%1îèhyÌ+èèÍšè„Gµ|¥—@ÊI 0ŽÛ`ýKp£ÜcqÚb×jl«£È]«]çˆ@J­´\@“”Z-ØE܃£¨‡âzˆ¬Ãp8*Â4ÁGmñløø .–ó¥; ¿¸j gc’èˆqÜ"öÇ\Î8ˆ‚-ÚF%Š*w‡¬Q²ðæC ¤éÞ|ämrçÀ>§ #®—®8Çÿ1 e¦~—™­Ë 'ºÁTÀ”c4…pš0l»ÔvR«–d~‰ØšÓHÅhu ŽëröƒgcìôÞ²IùÒôyq uERx‚žä¸ÛWøˆv†åì4Uí;çÊ]Ε²,òæÆÞä8~áEFm¢NX›5B-ÉÁnÔe´P;Å2Œ£¬ f ú.©4ØEyÛŒíã½åF‰Ø‹cï9Ïä¬EvoAÕwÞ3éêvFø=ÓºyIÏ8ÓšÔZW{tó¼¼g@3‘&)Oj9d€Œ´ý ¿œ3@8Ã`9þKT;g€ö ÐIš¼žÜÞêpU-:M¹M;̸¶‡Ø)ã*³”¶EI9) ·×j)y^é+8{“VðîòDo8Ýà»°´Ð­°ßŒF!ÎȽºÒ7~@_â.®DWþ%¼4ÉèÊMrâ~iÒPæfá-‹‹–L-Ä=¤Œ£\X{sJz8¼!z\n7òo“—q‚­ÃA³z’ÇXæ´†3𬠡†¥©tÉizâh8hg äâÈ˧jáN cŒâ(›jƒ¡Æzƒü 5–ô”Ö¤:•ÝâzFŒdç:Â3â¼»‰³ÎÍÛÕX8`”Qˆ#ÃŒ6?Â:rvŠË¼89‹=ž¨ š®9ïTÊ µrZj“]sóE8 #Fö gö gRb‡qáLå¬ZRRÇ\A\‰õšÇ&,LY³¤ÌËy7b2üN]Û–¿nPøK²ªýõÉ®tؤÞæEwx‹qFOJtζ7çÖZ–‡šñ1¨<<ç–Kga‘s Šñ6óÛgP‰87ã¦æmBTˇ>ã˜Òò²šÆén[ÒÙ–ýXböÖÍë%qáF­ÃíQdb[¼½E¤í+;ÓŒmKέb{ܲǹäU=ÛÔì·o‘#ô÷ÍaK©¥ƒîó<)µtðrs»–N§¥÷ ;Q]Á—wf'ˆu»þn¸¢}.%žþžhW«œ9ç /{ϹŸŒX÷uY¢t^žï´%¶´¥¨ôy»ÅG8[+>RõC×@Àé‹âà R7£52Ÿª †n~Ã"·] 3Æè5êxa(ɧ;ôWñÈœÆSˆ?¢¯5jsçd[áÊí~Á´êÞîG:%S©²  •jh!Ã%l©³5cLR{o©Û8_ÏÂA“­Ð§0>Î8zK2ÃIÜ@þ<–†ÂÞNR8alEµ7dnŠKçiÂ2­”zšçÓ%S­´ë´N»L—XLUNi'†eQÎ[õ £Œ×4Õ1’}„U/ǽUŒƒ7NQŸ“¸&|FkWd/ƒ·¨7vçáïJ’gÆM·»÷AÊóÂû SïV©S N.ã›âZ–¸&ù¦>¿ºÉ¤9‘˜¾>7ÊIþâô3‘˜ÆÔha»Tgn£»³á°˜N8гÛ7¿âU.ºù%ƒ]`p©*0LGμc^…wf}àŒâ£©`õ¡;û1¯Ã)‡2îõ\¥Nµ¦Y«ÂЮÝG!*eö_ÞY§81Ž­)ptGøîŒÖÜ´ŒG8à<Ë3¢Ul„ß ×ÁÕ¸aûä ß?ržgù¦¸Ϻ$1Õ»6›±¤„qŒ”È2ªtœœASN#®ãÆ•9¼N*™Ãð]æ29NF?õB5¯òèCPßüÊßCr=Õe'õ©—$ƒÌŽw9¯R`—|œyFº#Q*+ë¼(ã¸'Á2·?š<Êó¾K0`©}w9wŠ£Ð:UWúvú·.C…sÇ^ÊîS[8[¶šEôŸ|=8SJY©äé[úlý~úûÝ¿åñ±bø´­Ñ<3€¤þV8›%œ¯ñóáÓwë%]B§ëN¯ãÚ]uÒÌî®z:»49÷+â»ÖH¾5³þS¼Öj€Ô_¦¾p…¿.ù—ºÒÖêt\"?¢“-Á\´²¥JÕøXc]áÆ#]ýI•ζz£·„¾Ô#ZGOUÚ.Áö¹Û©ï@ꜭ7C†¾¬ì¶>Ú`g]qûR¶!ñlð™N@嬭û7¶å2Üñ÷âò'ˆ;ìNCÀÏ`è®è¿ÀžÝs Ñž''Áx‡Ó«‡åx÷B—Ìž»“pD¼×^Sš«ørø?²¬˜ endstream endobj 3766 0 obj 3333 endobj 3769 0 obj << /Type /Page /Parent 2 0 R /Contents 3770 0 R /Resources 3772 0 R /Annots 3773 0 R /MediaBox [0 0 595 842] >> endobj 3772 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R >> /XObject << >> >> endobj 3773 0 obj [ ] endobj 3770 0 obj << /Length 3771 0 R /Filter /FlateDecode >> stream xœí]M㸽ûWè¼ÀxÄ/‘‚™î™9Ì9,rf³Y,2‹tö¿Ù–ÝmI¯d¿¦)ÊÍ4²ÝcZü(V½*VKïÿüåÕ¿~¯Þ?|ùOõ­ÿýðeSo½«ÿ«v?ï^~ Ã¶ÿ»òÁUß¾ožª§ÍçÍçî¿O›Ã_þÚýõ¿JWéþÿkõã߻꿴ûÂ÷W¾ûýïýïÖ«î¯úô{÷ù/›¿ýPý¶ëñ8\?™ó¿SÞ7­ÙMcfè§Íq™jÿóû·ß6ï¸n㜠M¥¬±•j­®þûÏÍÏÝÇîëmk•òõõkòz7’s¾RºíÈ®Ãh ýOœîÕ :÷ÁÞ®óýÌ£SE™FɽoC£½uuà߯ZW0MO47æ¬×“í¹ûtÞ†rÓ~æÑ©rÜpÜ{Dinj[÷Ò\7>>žû¿ÁUߎu3O–~{'ºÿ|M7x.ÏJG•NöÊ¢u»~;wüw³ ¡®šý/¯Tÿi¨wR­ý'ß6Ý*ÕêÔé[æ¬órŒîûý¿÷UçÍh ³{f0“î[ᬗp>Æ/›?ÈêöI Ù‡¯›÷Ÿ”­ÛJ5Õן»}9P{ÿëë÷M·¨wÝp¶VÕןª?t3 ¬¾þºi·vÇÍé[P‹ná3¶|¸~œúOÄ8x= lÁë!f PçlùH¬¶(¸Rm‰<ÂsýJñÜ0E×¹§à¬kØ›†3ð¨ÅÀq0 æªÃ3¿ŠZâd¶ê™­šBf«†È¼ûdˆÌûo™³^ÌË1ŽÈlÕ2[5DæÝ'CdÞ+œõÎÇHƒÌº sAæ¼ìÞy}XjXj&±ÔŒ°ÔL`©9a©9ÃR3ÀR3‰¥f„¥fKÍ KÍ–š´Xj –,Í { E ÞLk†{ßbºbºIÄt#ÄtˆéNˆéÎÓ ÓM"¦!¦›@LwBLw†˜.-b61 b^8ƒÅSÁstM žõ=á¢࢟ÄE?ÂE?‹þ„‹þ ýý$.ú.ú \ô'\ôg¸èÓâbP³ûªðNYU³± ágYÅ)à/îÍ<ËÝëx 1˜=0˜SþÈ`r(µí´qðîÅdÎÁ° m½Ÿé3Ùê(<õÀ#vkÍ!¹`Hí‰M Œ{ë÷aêÜ^ %f€iн™!‰Ìé¶Fué2ðÒñd â ãàm½™ƒà¨zÛxuΰ7aÃ0Ýð¶`Ò9óuŒ!HØ'ÔÒ;ó§h€Ç©!u`‹°Ò“½‘øÌν^ ø ‹ªžlæ¸Û—àP€ãÄaÄG˜fQÌÖ7×!~¨DÆh'Ž·H™˜\ŠŸP„jȦ½pJÂã<"¬0Ç#­éº åŃ·ÁÜ#p§`E7V­œDf´…Æ%GAR0U±ÎZ·@C¾×67„ïý`Õãõf¦9®Í7îœ_!Ÿ·eß † ט­Žúã–öÖÛÝaÚP«Ü\“ß®@“anœ3®26‹\ŒÆÄšydBUm›¾“zÔ q½ÆøÄ4Çë1ìoÂØb^þ0õ}38–ÅvÏâ/w¨G ƒ-Öº–92âe7Š$аʸ¡Še¼E=ø%pŒÆàB‘ð‰òôa–Ö‘|á¯ÅDg[cà8ð”€[ú ìÄ8öc,nN Gs¹(‘©C áÀŽ›Ðg€çVÎÒ·à—¦ûBO_LE¸Ã8iï–0~†Ú…q '9œƒ›°EÃC2îMcŠÂ` @ÄJœÚ¥Ór¬†| ¸*°d gÆ&”ëggŠ1‰IÄÑ“0…0yT¾0K:¤€òË1n(ȱÔ87’r_p+@lƒùÎÍB.×p aþÛWg¬ %' ÿûÚ®€ÿ1V`|Ásä §pA£dfq›iüÕέ:%í ì\®©| ¤6+@H<Æ4<Ž`ÏaŽ%0-g ážÂÂpùóe‘r «¾øe“°°ÎØBØCÏð©’˜µ€iX6±5gͬÔb‰v‰Œ„]ëaHœ {E„gB$ŠpRñEœ;øa¸@F–¨è ž#˜ÈÆÆ½ ¡H"èŠch=:¾È>„ñÌœS …ûÌ 0ÃGIí\>·iñŒ[!Ûp$À˜0¹–ÏH¿]·,8Xp0wI/8x—ÁðVŸ\>¸^–MLù¹ èU´ÂÁ&Ü–tJa.'.ÄE!™¡¦5–g‚ÿý!\Hxvl­›—¦Æub\†)2“NfîMk ð!¡œ5ÇTV!¥€¨´I鳨WEÖÙRä,¹œ]Eklok\Ðgy«_ª$4 ÞSapÊ9S}¯§ÈÂÂ:GNÚjju Uq†~&ãÛëËWd"k£\&LbR&"º˜ÄãxtÜzCÌ®_ž˜B…*ã–+M”s†Ùš)Õ¹úÉ2Õ˜¢fÛŒ$Z(Ý3L¥2uò+K2[ßø†zÎ);PtWðbäôJ"k8rÑè¥*[-¦w˜¬ ÞÁ4•dˆ¤NãD¥Ün\µõCQ)/])/]Éãżt%êž !ëD;·ÄË]n£”Uôj˜lw¢t?“›ìBa åZ±YƒO$Äébµ‘Mí×¢°‚„¡ç= €€ãCD†Bd…Êx°â*T&Û (Tan&ÝÅìF©ù‹ÙÔº£^b¤ _0^g¡A&ëÈGÄ™©%²hS†Gê“ÊŒ¹` EfÒÉ ‡0Ø…â 8 ÊÐ-wÍ`ÛÂåq9ƒ¤Â¡ˆ‰âqg”Ë›P¸<#.gÎ&Â8ÄÉM°r¢ê ªd¡’JS˜/¶[¤©HÓÌÙ$î} Ìw¨ÏtÝ ,øZ}†o‡åÞZ3yÌ÷(µÚÍ®¡HmB©Å4ˆª˜ŽP’ŽƒD™ÌuâSxT9Þ(|‚ö”àa=C„W,ÎoI‘¸™;â3¡Oð%–áÖÅò17l½¿™tÈ7Ê mDé]b=«Ž#¥A” kHw[±1µšçŨ-÷vjg28(o¡gpoÉv!îëBpé÷¨6`JKÂèÛÈ£_—·¾3Zæõ©¨CT:(8+.$–@!¹gÉá“®r„-ܸ5ˆJu0—ãጅµ®•ãId¦fc_·R<s:bêˆbŒfj1'k¢RS«Š‘FÁW‡WŠ{s ÑÛûy~‰Úâ°o ë3Ƨ‡9·þí„/zlLÛ$Þ­uúçÄŽÛ`N¯B ¶7Ç>ê5[‹gr2çæÂeÁ-^ߊyœ°ÒDµ$µéØ*7Ëcq[Rú5­±‰W—LŸ1'pŒ}ŒõAÄ4ïMgô½[ôjIè²îY^kR!“;ÀÔŸg2âæO$ËJÈe†°\±?T\ŒÈpƒÈþÉ7ÚÔ‘Üd¸Q⨑£8î-:e“ñ!3§þdMìÅÀþz¢6~dÍ5û_ßR䡜ÊGm›Ç˜j2ŒŸLf°>„Øiñy•ñ[DÍu!±½Nœš„q®"ªÇG~_qÛE¢Å^Ì£™èÝÎîã:[Š.¹<®¿§Ü¤Iw“Ûø E™·fœ£ZnˆÝ_ š2Ú¤ÎrZ>*°¼¤/Ÿo- qÆY¼{±WZ¼{™s<™h–:#Ó<¦[]£Sç•|S/£æ›Æõfe]¹«Np®{.h†Åï쥪y™2?³±©ó€RægvÀœÍ ¤ø÷ÄY'ªA·FщœÈTΊzs«Äz¬ «ÈŒ"2ŠãÞ2cÝ#¦üs 9É×ñKÑZEkížÁ¯ÊcâÄ=mêN<Ö@÷¨›¼Ê.6žfÝ&u͸u:„—âqydn{ùG+Ï$Ê2Š‹ò”ŒÉºEuÚ4èàÖíÌZ2âÞëd*G3¹ËçÄõ(3·D‰XsƒUˆfá!ô>u\ªDˆ2á²LDe½’Ѧ®ÜsËÛÑÂØŒ[{1ç<‹’USïäÃ^"¡fôhlñÀ]PÖ–¨§¦ ÏIãvŸ îµ2Mʼž`ÖP%Ã@¹Ï„]ê(|Ri“Û"wV×—¹{HE¢zëêÀýÁÏ88nrÀ±-BÜg`ü¹yTmmëÔqrêæNÝ%/á_A™Ñ©cf)½­]…Ï?jDPcV¢X°<™L¥{J¿&ª&)dP0„\x' „5x6K~U}wùUx·… ¢Å+ׯ½‰ÎøØ+”¹oNÈÜòÚH >;FÍe,¸üL¾›{6èMù «‚yÃ*užgÞþõÍ_‘ïre¼ XhìùË;§ÝwÌF‹Í%κØ\9è‚ÅßJÀxñ\UãòA\¯|Üqðzîðnƒ¯íîøâŒ‡=ùXK÷Aãfå¯ÓêËyîÒêkÖp'¶X}u±úŠÕG[}XK,ªË[}TeíbõÍi–6»­S{ÿf⸖8Å1ïo‹[Á^x륈ú¹¸>Lœ?ƒ£!‘k™Þ_ôÙ+³Š ”b›˜µIgrs)¼enùG½/ŸÊîêŒájç_ ˆåÓ€¨ÞŽïâ0Õd"Ó ÑÍи'ÊúYœ¢Â¬ãÚ+Qãç9ŸùßVþˆò«È |3gJꋟY„šÌ)9¡âê"ŸÅïñ¬§Õ*²^â" ¶ÆK>*Ç 4 ÞÄD K„²*0n²)`ZÔŠaÂ.#º1õ¤eA3õ7ð ¨Lã¨wK({÷Fœ˜¬$æÍ>”_vÎï‘FO™5äÐÄÕS 1ß^›s2óÎ]f‚ML JïqJ#3n ¹-ž$z£ªc<`Ø×—yÆ“öùì}Î\a‰[ðkøÌ¹ÂÔo¯5udÎ@„-OÙ ‚vú2ê-Èr‘fÀœŸSñŽPI†°³"{$naîÑ»û©ž:˜QüóÜfa¾­ÂÄe¶µrÝ «Ó[ û]u[£ƒÚM}ÈW~ëlüYËá4 ·ZíF<ߌ[ú:gzÛ¸…ž÷á0»µfÿÈ‹½{Dãôºrâ™þÔ15·OýJ}?…!–OõvÐÖöyJ5œ¬ê—>Z`/RSÝ{ØbÑ2î >Ó+EuÕÒ_PX†ÛýÝÍø8óv׳~³@o–M°g¯Hì%›öqò¸LwØýK§?Kw_›m/³gI¦a‹z‰^sÈU}Þüp°põ endstream endobj 3771 0 obj 4190 endobj 3774 0 obj << /Type /Page /Parent 2 0 R /Contents 3775 0 R /Resources 3777 0 R /Annots 3778 0 R /MediaBox [0 0 595 842] >> endobj 3777 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R >> /XObject << >> >> endobj 3778 0 obj [ ] endobj 3775 0 obj << /Length 3776 0 R /Filter /FlateDecode >> stream xœí]MoäÆ½Ï¯à9Àβ¿Ø$`Ø•´|0 ¬€Œ‚uœÀˆÈ>øï‡ÒÚÕ̼šáS³Øœi ¶dQÓì®®zõÙÕïÿöùŸÕ¿ÿ¨Þß|þ_õeø~óySoc¨wÿTO_ï¾ý…m·ÃÏUlCõå×Ícõ¸¹ßÜ÷ÿ}Üì>ðùæ‡þ§?+[}ßÿûKõã?ú_þ4üÑÓüº‰&ößÿûü½‹¦ÿ©~ùþôûÿlþþ—ê·§Ç× “yýÿïLl›Æ?MãÄ«7ã2Íó×_~Û¼ß`Ú[\ˆÎ¶•ñÎW¦ó¶úý_›ŸûŒÃ×ÛÎë·¼(ÚþMMíûAlד½nâÁ›ž¿ÒŒoÒÞšº™mðÝÌӓŸƜ>áþ¶&v;ãæØqø9¶·éÌŒ¼ó4óäTvW}Û66úPw-üùMëŠÞíˆÖ…¨ö2ú[Òº8ßàÏ3OM”q»÷¿Ÿ2ž‰¨q…~|ؼÿd|Ý3aS=üÜÏm÷Îço=IBõîIÍôÊåá§ê»º6þ¯ÕÃ/›nÛØ0N1›'5zRøä>qð=Íô¹Õm¾s³6åz\÷üäî¡gîÙù²—ªl¸/㽯ãô¹ £A~ ˜+à¬í |à8šƒ» Ê—m>ÜWø²®ý§é|é3ç1oÚl8Ià±P†á¼˜Ç˜Ñ<^ä1‹WŠg¹œ&J÷ci‚sÃ’wÛ€šÛpnÚs@mBYmO ‡@¼VŠç†i€m@8š Yð=Ô.`mÄØ§X~ðzð 0­ñžâÏÀ4€+e$ Ë)¦h&Z¯wýsÑmE뉳.ZOßœ£%°.¨¡­wìubAk:˜ãñÜ”¼lŒÞi©ÃìÂõìã‡.¿sxWf{„& £Ø⬋í‘AÖ%0>%ÞŸ¤žý:mÁC-¶GÖ¶Çò;WlUÛÏÆÂ¸fì𣱇ªô„ò¸±ƒ(øÕ ¢`íz›R‡2£11p!^Êäsá7Ün •;Åg©‹ÏBêô ²„J>Kˆù çñܘŠü"'¼‡Éïb=…Ÿ(e‹³®*YÏSZ<¬¡Îqùú[õ”ǰJÉHÙÂö¤›ƒ+¥ª†¡žR•³˜‘4á'X£µ:L¼SШi«xpŽ&Ô3€ù["ã†àe0¹}ü!ìš´;‡#”øÉ`è PÛåƒ5§t† Ešz µÎ%òQ"ònkek3Èj-®é°/€5öÅ|½~ì)áѰ½ÁXc8ã–q6ðº¼þÆ®¡Ö¹h½¢õòÐzË?I› À£-¿Ò´ñ§b¯(Ú+JÞ9áÄ·VߦŽ4©ü0§NìE fWqB!©c2vލþvDm|Öš…ˆ[¤­L§0¯‡@bÁîdúWõôÔémæ„[Æç˘˜¤`a±BLkAëa9%ÖãàÜ”®ŽŠzªÉG©yZŸÀõXΰÌ5®i1£7c•Û¤õ·i+Œ²á7ÜèÖP»Z2iuɤ}ÇÅ“ ±ÛÔÙÆ~Âlˆ“Œ›¶›"¿ÂscÎæbZ3ç“áJ¯+³Ñº5ÔhäÇd†YiR+‰Šf#Z¾ûùõDA„£C‰óx¥”Ï~ꌪÞ†5d’Óâ-îÇXÿ”ÅÃxXf˜è\R›‹ñÙ³Ö9ÌY¦Å_8kLä¨qTSèÔ˜V~(Ÿ%m,6\kè“Èt"§ì¥x'S ê]u«¨’"º6®à¹¢skèªT"³ÿ_ZdvùZZý¨…èOÆÕõ9ׂ¯ó¼Bâ:8X3"¬‡ˆ´]Wtº ùèâ)ÅY_¦¤‰¹û‘¨Ñ\}éveˆÒh÷8S<•Óöb¨}ø®tÈ¿ø eI`L"ê_©S9I#jLMÿ ²+Ó膵IP”&«_'—+vdlk¿†üõú¥BM%Óõ–ña˜š%"OmOd×…Œ λ™¼?ÔÍmŒ]Žg÷[«Dœ–¹IKÑîkëF;?£j÷µ.ù[Ñ+}ýüJãÆòâ¡!µ1Ûà›6†oiÇ.í¶íêgú|}²#›ßzÃ1à:ö™ø8ڠΎƼgBí/6xx¼ômãF:Èj{ÎþoB„OÎ_è=aëlk^ 2(´cÃÌg_Œ‰#ì ¤Å áy2$æ¼·ŒèaZãÏLà!b3$—û´7%º>Àɦ=©Ò²ÁÁ&¤å%] ˜W—úÎíi6ÁOêt1å\³\9£Ùðt¹Àkê 0½K7âÍ9,Â0!Ÿæv:0¸Ñ­‰Mx=Zbu@À4¦µ ,¨PÂøÅ@˜ “x€ž·AºÅê ï#GËB»`ƒ±ã£¯²RªxA&ö·eÈM[àðÁŒÞuÍ„c¶÷|/‡á8a‡#–0—(XaÌõó Iá !Ô‚·¶8DòȨÍûâ‡w+ ì!O°Ûo!ÀMd`nÆö$¨ÀTŒ¤áMøp>Ÿ+-èÅß‹—¡µÌ˜>l í[3›.üµÎÛÂ.>…Ý(Ü»ki«‡ð¬•*Ôp®HÈ_à¹Íî˜Ú!†~ÀGók¾$¡Z&¨çØzÐc:aÕ`xKƒÖ"—oÔû4²’G,Á Œß#Dà{„`Ùc¤’`ôY²s†Üb·lvßaŽÆÆ”6á ¤¥ÀiÍJ"rA ˜&¸p&Øóöw ¶× 3­{¨â[‰SÏpʘ–‰OÚáL°“Vûá{(p­…Åֶʘ¢ªœê–LTG§íGíÓE{¸îJ‰Ðg K£QÄ—7˜Š/á sºž™Ûâ PU›o™:e¢‚9×Aõ^Æ\…±“@áäöê‰ÓB­‰î.xO©®¿iÏѱˆuò› Å™Þ˜Ö˜ˆÓ\¸Ó—ð­XÞ*ùÀëÝ“ÐZõ3˜ëÜo‰³1  [ëôˆ–Ÿ“Ø£KzN†)¿R•gõ'Ïç ¦– †:D5FÒ±_, Ó“ Ó [ØIo"cÐ[7Zí~ò7²À Ƌò™Ô/.ˆ²fDqêÝ 4cœîåô8ŽqÜ=©ý`º¨¶ŠQ?»}qD)Fàzpç0j¥¸›4ÖˆÌ=g¹ÈÙ4MuŠãu¤VýäôÅIí:í¾Uú‹Â¬™ž¸?ÎʦíùÃÜÇÛ}ù¢P«ÝI¹ P(taÞgÁ§ËÄ'_kß&~qøDpÓ©”Š%õF„ªâIö’aµ»Ý_œd<&´‡Àv‘íĵ”vd|û«‰,¿§šÑaïçAª—­bÜØ‡1?/ıÔ1w ¦½Ý W•5-ƒ½¬CùX2œoÔTןÎY SÙ;õ.å—&gëŒå¬2¢\ê$ZkâF0êýØ nä€.ˆ"QTQœvEЦ'˜¹NY'y™¨ëz½ÂKæñZçz¼BˆÅ×sœ*~w%ëv•á*=É’ûÏß"lLÉV^%¢\˜Y°fXãæA”Ü3œ?á\iæe/wéÝjÚ7ìVéâÄiªt;|¢t´cxCh$Ž[?mµ…^ãJ Ó6Z=¸UJèB¾ßúQh)šá 'îúƒœßóÿ)sŸw Ìd“^t“äbA¦ ëòÒCµ•=ÕT÷¬®«ÌE!çß›¶õ0Mh[½øÞ ¼Š/]Àzcþ†ÉÖíëDâ6„ÄWì- x4Fü´nÞ$îrîÌ=ö™UmØâò.…hd­…+š ³cKX,ÑÈš 2bqØO¸;«ØýQ ¶Ä.ÌCyH+L¡<€ 1 ¯Ó¶ dB%iÛ%b·‡°1 Ò†|™¦­D]XPR¿x8ü… ŽN•1« CkÆR™œÑáÒ$Ó€Z)2N+éÔ­¤òŒ/ PÖéÓ8iSét‡[O„NÛ—NªioTZÞŸÅqŸÿ>µÏ /=ãx2uOí„Ø)v ñnh¦R\\+,Për-N7â³;¸>É0ã ðsOLVi'w¾ 9ô_Õc¯‹DUuêÎÐeí1UæzjÔ&ôÓ«ìh5*Çh»cßxD€vjßn­i÷ØjG–æðÉw³Û&ì”ø×}7P3Ý¢÷¸SèulnŸ†•Æa û\„…ÁïCí±Éšaé „ÇÐ0ªY†Á£ÁÏ Xh&-=~e[–áž~îg<ÎüÒ'ðg0 رç ÏþœM»Cœ|8¦;ÞÞ¼î±vÛAf_mÆÞ[øÄ~‹^§«ºßüU ¸ endstream endobj 3776 0 obj 3362 endobj 3780 0 obj << /Type /XObject /Subtype /Image /Width 256 /Height 400 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 3781 0 R /Filter /FlateDecode >> stream xœí}”EÕo¼õ¼'Oó)êª D‚$BÂ?³È³$!Ád’ Y ”ÿ%J\áã‹+hÄ%HX£Æ³ûžñløŒnT4 'º¨` " zPðÈTÞ¯úöÔÔTU×ôLOO÷LßßéÓ§§»ªºªçW·oUݾ÷­oe0Ú^8™Áh#0ÿyF­ü?ɆOö±«¯¾úšk®ùÁ~ð¡}H^zï{ß‹&Ço/£%Ùþž÷¼çòË/¸õÖ[·nÝúÕ¯~õ+_ù õÉO~òŠ+®X¾|ù)§œbÍ{üô㎞rÔ±SŽÂ~Šq0ÇM‘=§VþoÃyç·\ÁUW]õÐCýë_ÿúõ¯ýÑ~T½´`Á™ ï‚w¿ûÝòR__ßã?þì³Ï¾ð ûÛßþð‡? /È«HÙÝÝm½;£ýf~ðƒ¼ãŽ;Àü/|á 8øüç?¿yóæ¡¡¡/}éK_þò—/»ì2ô3c׬®yçóáÏYsÓé×Ü4Ûš›Îkoš}ÅúÓ¿kái§Ÿ†×Ò7„ÿP~.P™ÚBþ£ÚøÀÔKçœsŽÌuÚi§-Y²D^ú¥ûï¿<ðÀo~óyo½3Î8#¡§Íp㳟ý,„¤™vþÞ{ï}饗ŠÅ¢vgž|òIdÙ»w/tƒ(Y4``xá…®Y³:Ô†žžžw½ë]ØC͸ôÒKI0µ\óÏ™ÉGO»é'6<èm|лåAO;¸ùþû¯±`þüS»f_;ÿ³šÌ;+jC’¯^½šÌóÏ?&£çâüYg%sAÿÇë€ÒoÙ²å%FFF(RBÿ·Þ‘(¾öµ¯A"á¿ÿÕóýýýô}æ3ŸQσ¥/¾øâSO=µ{÷n\á«f11}út(øß¯¿þúo}ë[¿ýíoÿñüîw¿ûÎw¾³nÝ:œÇU°ÝÌxÖܳ>tý‰ö¾lp¯‡ýŒ¼iÉ…ï*– K K–  ,[²xáâ…]§v!}­üŸjÃÛÞö6vôÓýèGÚùÈG.¾øbð¯0h5Ï=÷šŒ7Ò@æË\}ãÅ1oÞ<´ù¡öïß/¿ùÍoÎó±óÉ'Ÿl½;#9@Óù·oߎý¯~õ+yºØ’ãŸýô§?3—\r þèo|ãPWpòsŸûN" Þ ‡5‹Çs †{èJùË_À(¼G@-ìyä‘¿þõ¯P0põØcÕr͘>ý…®+oš\ü±WüÑAÅ{½÷¯ùÎóß¹tÉÒÛnÝôüÿ{~ÿþ_ô÷|á‚…óÏ›òI‚N á?F"oûÛñ¶BmÑ:èlØ‚ÿx[-\¸uþéOŠ3HóÖ·¾µ\Û30ØêcçÎÿ·Œ|åñ÷¾÷=¼0𡉣Úÿ@F\|øÃuñ·ªüÇ_¶ßyç’ÌxãÿóŸÿܵk×·¿ýmœÄÐ'¿ÿýïã:°5‹§Ÿ~:ô H{ÈU¼ýq<þ|0 ã_h¸:mÚ45ýqÇM›uÊIW}ñUŸøöË>uwã=ÿíÆ{¼åWM›{öÜu¿ýÍ£ýö±‹zß7wÎYsçÌEiÇÏ<~jíü?Ú0™&3øÃ>óÌ3‹-‚¶†1,d¨‹·!ô½Y>Àa™ ýÝáŸøÎÓƒ"<ñÄòøg?û®^wÝuH‰·•õM›øO? …˜Œqè¿øEœÿÔ§>Eç!ßÀÉ{î¹'ñ×ã Tã%–żî‰3ëׯ߳g†“‡‰@…ÀI\2eŠš~Ú±ÓÐ)ú·M¸î¿^6ð-o`§Ø–~ðÈËW_þ‹~ñè#î}`ï‡Bhò¤Éo<ì“kçÿ$:+‹Ú’&ƒN§]•¹ÞøÆ7Ê“7Þx£äüc=&!üe¤·Þ‘4 ŠÿµóCCC8)Ž—/_þì³ÏB»Æ1Æküã_xáè-èaY€¬{Ýë^Gÿ;J •e.]º”Nâ*z™ë裎žqÂôy+þ×Ekºð£þæ¼Ç?XvÍAï^óß§M;âÄ“OD÷A–Zù¸ ¯zÕ«þ]Á\@ï;<‹/¾øß+!s¡ 'N¤“èãx@h ×þýû±ê©§ ø¡¿S¤|ík_k½;£ý=ArãÜsÏóA Œ ÀɇC=ÔÌ‘~öܳ—,^²àü*Î_¸pQaQaÆÌô~iÿ_ñŠW¼ò•¯üŸ%`x½ý%źŸ<4|°Ìõš×¼åÕ׿þõ¨<HtLìqü†7¼A^EÊW¿úÕ =mFÖþ¿üå/[ð×ãçúõë!1¦€Î3tÉÊi0F˜¨ÓK¾éð@¹ª•ÿ‡Ù€š€óTmœ9s®¿þúsÎ9GžÁÕSN9)Õ\'œpÞYÖ2U ÍI'¤æe´7ð_c 1h½J—‡†ðz¨~~5 d»ÌVŸyæ™UsfÏž­ö/F{Üž9s¦ÐWl˜?>äaCnT+ÿ_Ï`´jå'ƒÑF`þ3òŒZùÿ:£P+ÿ‡6 mâ=ïÛc_ÿ7мþ†ãÁÁVÜXTÏó1gÿ¸Vþn徸¡8pÃ@q}i¿~@ô…Ê4Ø#™è ¥½v{œGÞ ¿LwzÞó¾!ûšåÿ&Ÿ®þ†ãþuýý×ö÷­íë_Ûcbïà†A5MÐMÖD$(§hì(gàÚ*{J/úTez>æãF×,ÿ}ñ.÷`éžö<÷âsÀ¾ýûÀ[0y`Ý€Øß ¨+Ž×àê5HŒ¢  á':ˆÈ¸~€:ÝðÈððöaïú‰Ä0‚Ãg£ž¼ç½¹¯•ÿ¤`Ó†cpdƒÀ±WI#‚ØÿATvÏÞ=ÏË‚¥Û†‰í«Öˆž‚RXZ€ øI/iP(–ä?J¯’ýûHþ‹’¡ÿo*Ò0E–гè'ø¿jå*Òµ´zò1[kå¿ÌHÈ ÎƒÃûØ÷Ò‹/À`¯øêmïˆw0Ì3Ñ $ÿ{VôàŒPWžyzhë²£³‚Ô»¢W¼D®zxNü‡ „¡ÕøoœÇípkqG_AB?ÑãˆÿZ=yãͺÕ,ÿ1À¼¡(g]Æï‡NÁ JƒÏ 36:çÁdšÒuIÉŸÑAÄDÐÎ1|” ²”zºÀØŽ1¼0æ¥N’‰ÿPoè-#›‘W¨^Ï=‡áƒúýNŒ—i ¬Ô“ùØz\³ü¯,DèöÐÿ_ô‡¢[…ƒmß^AT’í8Zb<Èóí£Þ’&ˆ®±ibâô~Îúdx ÿûãY¨IÈ‚®«k£òLéú"FêÄ)iP©?X>n‰ãšå?Íí—ö¶BcY)6ÓOy`žDï8ðÈHéy‹æáX¼&0p^)tž œÕþìè•¥ÙÑR^y 1A¤”©ý¤\j yÏ{Ǿþ+MàËÉüò¦­¬í›?Õa.&H¯\E+bPlo×öÉ¢ÄÁÚ>šÏ§ŒÚ%¹p`þ V*+Éoa[­ü'v©{âª0]¨ºç¾=]³ºpÜ=·}DÍëÞSH»Å F‚œ{÷¨øO]§uí»îÞ…:#üÂm¿w:ö8SXT=¢²„Ðí±¥Ýb£ áámï>ˆtÁO/ôÿc§¢7q¦Ìÿûö_D0:ƒ1t$™·Ê~¯x ¤Ýb£ p20Q¾7Ø“üï÷}Ahü/,+ÿgΘÿ²ä 1™à$‘ó^±øïOš:¸q°>þ¦8"^÷Üî†TiÒá5´¢ðõQ —ytxèÝ5× z®úÊgdP~ÿ7Åã¿çõ,ïÁ6ñ‰7 ô­í#V WغNBWÑÑ7m‚Þ…ŸÅEãîø)ËÄùy æy¾YZxç¡ÈNg ä!xE›û¯í^oe^Bï%½xCáªPð”úà@m…Vä«GæX?€:o†¬ Ä²ZùŒ–C\ùïSTÄÿÝ4ÝÜsˆ x)x¾unáùôëYÑãùƒìAÔÞ½ò§¥p¿sá*ȉ~*ø¿Iç?èG5'‘F/¢ÃÝ6J‡È.z¥¯G¡œI“ËvzM”\ò$ X'ìîÔ6j)-’ÿC›†ê×ÿ!Q7Ü€œ¤KÐXÀ !ð7 B‡GAÀUHr{~A^ùÓ„Ðÿ·£H·Ê©~`Ò5ÛPÅ~vŸÛ-U#tCõ ×¹¶ÊV­\æã-9¯µ‘ùßê€üÇ_Wÿ/A%ä¼sç‰Aq% K K à1-ø92líT8$3Ô ø/åÿµ:ÿW]¹ª{¶1FPø‰úHþ£LMª¨‰škÁ<1úÆÈbò¤àu¦Ü”ùßê€üëÖÿGwTüû(ªrp|ˆ0Š&å —ztèÚÏÐÂý1&ÈôÃÛ†é Jê–r;pÛ"ÿ•ŠÁB)1*ÕŽÔ¬‰ÌUXV ÕôÝzÓŠ'ÐáCó€‘UÄ”ÿþ{¾ DãMš“ÄO\ÅFUûé(Ä&ÙÛ»²ÌQ`Dþ£pT€†®`#ÝdVÓ˜5‘¹HÚ£¿„ñ_¦~Mýîi02 ’ÿuëÿ FK#¦üg0Z1õ£¥ÁòŸ‘gÄÔÿ1ê$š$Á˜4ê}£¥Ä8—†® Fˆ#ÿÁaéŠDdïðÔ‰"§dþ3Eý_3¶Ä+`l瘜BÇ0õÙ2D?Q~ÿºþ¾5}8©¥”Ó’Ò–²gyÍ:â$óŸ‘bêÿÅ E°ZÃTLwwå#çóœ7S Û3n_.o‰u^z;øÉ˜ÿŒäþ¿kvW°¢TÉy0B^.©f2e÷ÜnCÔc£õbœé]ÙKWEçbþ3CCæÑ­°ºl6sÄ$˲i%ÿ+,öý3ÌFsGÿ—Y@râvf3¦™P…þ3âë?lZÃHqä?4ðSdÇ(ÕWìë0›ñ 3!¯4þ¥ñ2›Ö0’Ûÿ0ò ^ÿeälÿÃÈ3Xþ3òŒ¸ú‡É’ ­sÕ\’!6@Î̺ÕTÛèfQŒ&#¦ü¸a€æ9=e:´TM<$£ï +Û£Ö6ºY£éˆ5ÿïOÝWœQŒ|<›af¤IŽá ¸±Ø¿V¬Ëw ýÝ1JßËÛ7!¤'s‹òŽäÂO°jõ*a§±¶¿gy ÄU¢®Y= ³´…àî´®§ö³œAJdÁ­j…y7uÄšÿŸÕ¥é<ª‘iØ#PiTa¤ð…Њ­ÿB Öê§» (-‹5¿pW‹B3iÉ %`³WÏs•CU®'dmmöKÒÑÖF­Â¼Š—:âèÿVþK#Ó°Ç3Œ‚Âø_öj²zî" M‰ºåÛù«l8C…«† :‹ZîH>ºfw!™µz²æŽrÈY–¬­Û~Ioce…©#ŽüU+0 {L£ 0þ›^H²8Âí¼jÄ“¼•E™üת'áæ?~jüwØ/imÔ*l½;£™ˆ9ÿOt,\z:ýÿ˜FAžjäà‡¸‘ywÍoUo ã¿Y=‰Pýç»þc·_*i8juGC¬ÿ¤˜ó?4à…|ÀU·ÿÓ(ÈSM†œü§)VárvE¯Z¾æ·Góðãà¿Y=f9ôö±ŽÍrÊŽý±l£Vaÿ¦Ž–°ÿ[‚)t.1 UÍòj#:Zbý·¸¡L¶“¿ý „ª!—éiׂ-aÿƒN ²AÁÞêä°ÉÀËݰQñ>)¢%ä?ƒ‘š¡ÿ7ÎFÈ ·³”({êZ}­H½ÂaÈlÅ44Aþ7ÖFȪ΂ªZìdá_«É* ¶"³Ó´þßX!kz‡³ ÕG_Õ*`¦±ÞH-V³R Œbª„cº„Œ4‹»hÈÖr6.©wtØJQåê$Æ54‘k-ÐjL)·²WDF‹`•$-ÿl#T‹³ ÍG³/ ‚”…¥©Ý:ˆ Œhª„NMÃg1¨§Ð+z1´—+'¬ÂæsÓîhÚJ™ ÄdG2šgxp²S)—Pm·}T¦´þßX¡šœivVû¢°4u[E4UB2RÔE3EŒ¿ "³Êk9a6Ÿ›vGÓVÊl :^7rIÚáÁI_L¯Å>ÊË’–ÿµªÉYƒÿjÂø_“uªëF1U"‹dG…ÁIò!¦ÕÍZNX…-ÏÍ3l*m¥Ì¢2xÔôšp{pª‰ÿaO2 hÂü#m„¢8 *A³Ã±ò?4MÖAªR±.V²ð1CŒÑŠÁtµ9¤œ° ›ÏÍmÍÒ@žÊÇU·'“ÿÑí£2eõÔ„ùŸÚ™é=ÃYzkÕÇÊÿ°4ÖI8¬Œ4S%iácš*Ñh‘Ž‘††*ÿ­å„6ÊxnU£­i ¤ 㞯zÑ‚»Ãƒ“Uþã/ˆb•)«§–°ÿi!4ÊT)ƒ&O´Êl§ ^ÿm,eª”A“'Z—ÿ-aÿÓBh”©RÖLžÜh]þ³ügäõÿÓZp¡igŒ—µcu6‰ÆÔ"úXiJЈ\è Ø„™Á²”L–!)ú’y¦¾\¡ü”L%i5––ò³¼šÏ¨ ùÿ©ÏÆg°AÓ˜”“ú²ÐÝ1*Å2)U ay¦¾\^Iá—cµ Òt™ÑHÈÿO}66HIKäèx³ÈuýªÃO‘är^h¢ïœ%›gêËE#UÏ Få>Ô~Áhu$äÿ§nÐŒ>*‘åkw”L†~B 96ÒÛÍ3õåBJ¼,‚ÇȰöþ4/} ¢VÑêÈ ý¸J“ÿØx²‘(xý—‘g°ý#Ï`ùÏÈ3òãÿ§uQ«uef­13X±\ùÿi]°S „ÐÆþ&o´/%;í”–?ò{+Ó黶쨵±ÿÍã™ÒÊ«ÓWmK3?Šg§@Ùw ÔÆþÑÁ(¥•ÿ§7ìÈý|ZÑ)Pûÿ¡¼Öè`”Rõá^]n§7ì¨ýœµ±ÿÍ㙲üòõÏõµÃé ;j?§@mìÿÇôxŒ”7I§õ|kÔJU_þ»ÞXï.ÁNZÑ)P횀&Ï”²S Ì"Ÿë¿Mæ?;Ê,òiÿÓdþ³S Ì"ŸòŸÁ ÄÔÿ1ž <çT~¥ÕX4ß#„XPüÿHÈw{jÄ‘ÿ‹ÉÉŠä^Í÷¤.nšopâ?{jÄÑÿår¤Dã lÒð¤:‹@ÝÈÌF³2b@í˜ú¿°zZ×/ýü4ÜÀ&@ôÝ}P‘ !¦•{jÄŸÿ§ezp) ›´<¡’è&¨3ö8o±²`@m†Ìÿ¸NÂÀ&u@äÅl{jÄòÿYÊ2K+ñ»q6©x’(,*ÈÕy­iì¨=Ëÿçì.²E‘ó„IØ4ß#W¤ãÖ²wèVFì¨-ýOcXÙ##!$´þÛÆŸâ2Ú Ùÿ0ÿ-¶ÿaäù´ÿg0,ÿyF>íÿ ËFžÁú?#Ï`ùÏÈ3Xÿgä,ÿyëÿŒ<ƒå?#Ï`ýŸ‘g°ügäñõÿy æ™>¼jA»W#ú +,_å÷’äG‚>c1öÔQ~;!çÔˆ/ÿ‹Š(AÿдËy5"?ÅM•:O˜0þ;ŸœHÄ,¿}ÀÔÂSÿ'ï Z8/¯äO¡ )4Pƒvi±±Ô«U=Ì4þã<þåÀ·[¥2¦E¹2ùo­ƒ»Ê3|™Á³$¬a¼Ì¢³†÷²—Ù¸jyÛÿX‘»9Ò¼‚×­`þçlÿcó?'`ùÏÈ3Xÿgä,ÿyëÿŒ<ƒå?#Ï`ýŸ‘g°ügä¬ÿ3ò –ÿŒ<ƒõFžÁòŸ‘g°þÏÈ3Xþ3òŒ˜ú¿ü°È+}KRwM¢˜\J?6Q§kÃÑåŽjjj;#"bÊÿòßó¿]r]VüØDä@•“Cd—;U4¡²ÀÔÚÕvˆ©ÿ[ù_Ÿ—Ié0¿:ª«ó¾²@µªSÎC;¥;¤„°Us¹› *¼±ˆÊ nTÍåŽl Ã§}Ôoº*¢;jm— ±d¯¬ Ú¥ySa¨ˆ)ÿ¥ÿrÇËü[ÃüêTø±1|øXï+ù/+ ¡9Õ±ò¿\mgTgA ÍÁ‘Rgͧö]¿éªHuΣ=(3»µ&(3Â?™S4\ÿ¯ÛËú·ZýêhÐ|øXï+ù¯ù¦ð §"VþË\î&X …ðßô©¢ùu1]9øoÉnsmÄp áúÝ^n*Tú¿:&¢Ü×:XÐê2Qòúñß:Üp70Pëå¿Öö:ø¯×„áDÃõÿº½ÜÈd¿:e?66&a÷µò_sªSÖÇ|78þ»(Y§>YˆéSHS`®ŠÌ¶[õ³'²þã@ó?õy¹QÅZ˜_²× åÂî6Y¤:Õñ|§= ¶9:å¿»²2ªËYˆéSHókäpUdm»–ݬ Ý`ûŸ¦çí3^ÿm˜ÿÛÿ4 Ìÿ ‚å?#Ïh†þß!Æn´F†Ñ_sLwÄÜàŠÞ‰¶ `4ì´Å: »4éˆI´,+Ë5•C•‰ÓFBh‚ü‹þ¥?˜0¬f¾Ÿÿ4Ei æ ;‚U¶Š›†_¢©x¯4ùYG9Z´2FF´þ/ S>b–£…¸2§ø¢¯f–Cÿ7UE± ÔEp\’@¨äZËÁž‡Ï ’–ÿ’0V³3Ä•\â ³ÍÈ65ò…Lž¡ú´p‡ŽK¢!³»hΟ^^µ–ƒç`.g0RGÒú¿›ÿªQ5ÄÃ^È¥ [5(XÝü' —Qk-uÑ(ÙAÒòߌ‹d]–uðß+Lþ«Ê†,¦þãùQoPZ­åà93ÿ3ˆ&ÌÿS,:ÖÌ2%ÿÃB\9ì… ë2ÏL+™nGÅrIæ*uaN02\G9ZgdM˜ÿ¡q.ÔÂ<Ì,',Ä•#*VdL7kP0hc£/ U í’§ÏR¤ªSS9¨<[#gíjÿeà 2ðÊofѮ뿤¢§]‹x h†ÜŒŒ€íyF»Ê# š ÿcÌKÃÏtm`,F8bXª.KÕaäù®ƒ3>øoúç‰è½G .·?xÈo?{àuÍy rèCu4–>NÎI–Ū¹ð‡RTµ>Ž»é‚< É{…Å;ÓZW®žQj]…C˜Ê[àÖÔåE Ï©‘7ìÏr7_oKÉQ@Šh¸þoúç‰î½§>·?ô½<ÈL'U xÚŠj9ò+`TÉ\Å*¹È}DXÀ2ó.”Þý(¬ü·d©l„Y¯ÿå­Å?5ËòO…=R3¯ûÏ m~H[RDÃõÓ?ODï=u»ýè<ÍâÁZ™)Ë1ùV¬•ÿÖ€eþ;Eÿ-õQZ'ÏÕÁyë°*ì¦f^ëŸUµùamI ×ÿMÿ<½÷ÔíöG>É@ѵi&aüw«¾ô!è´¨LaúOEzç£PŸžæ)HÍ¢µ®\½(úíŽ*ô‘y­VÕæëmÉ€þ“ÄüæŸ'¢÷žºÝþà< ²ÌaÅÝsðßUô­ƒ>9þUëcÞEK_õQ ™?[A0-‹Ùº° x6þ[oöO…=Rkß1ÿ¬ªÍ׊ÍÂø—íÂPë¤_OFA‹6Ÿ×ÃÀü¯ -Ú|¶ÿ ó¿&´hóYþ3òŒVÔÿÛF2G­X‡ÆÒ"#˜QrUMCëV4{!­ÊØÒ±Ý,,ÞYM¹h)œ†Ãr^«wEo½Y†4-*ÿk²–iuþ »‚’óö`µZóÝ%ƒ]b¦´ ¬…䇋Šêœ’–Ýï¬Ö\|ŠîNËÄrF×n ’ÓÿMóÕx¦­>£;FñXdÌÍ>DÆŒ@F]³º ¬Ô?×ZŽWr<i£ÍÛ›V+š¡K˜)-zÊuŸî¹Ý4§g-Ðjkd5( 3û‘0#” {$k“õ’ýëù«fTyð¼•ÎÛqYˆÉft3k¼³úr™Í‘a!Ž„äØò‘š€®!%†g؇ТçsŒþ2œ“Ï¥VþñKòM[uõ«펦)‘i!Cf(0ÐÂÍ`t[#›AQ˜Ù’i‘ûTžÈGÖd³dŠ0‚\ôèÐ^TžºµY$“'ÑÍÌ3uç"¨¡ÙdWmš§ú„ô·y€ IĹ4û$ƒ Å_Ú£ ‚çìCòßZŽcEå¿nµ¢º¦D¦… ˜†×\¸t˜ÁèkÍáS7ÿ­öHj³dÜšŒ¨ È…¾€MüMË tR2YÂŒn&ÏÔ—‹ ”i×Ú!D%YM¸ 3Š„ä¿ÛÇó¹Aïnͬ±Â>Ä $ ð`)ˆžg¬çšå„‘Á´ZÑïèé¦DæÊà$‘å¶Yª‰ÿaÿx ؘ ƒ£ÉfÉ8ƒ ¢ƒÆxÂRÿA–Àšw›°æÕ"fjÑÍä™úry%%AŽeÔ&8‚¬5 éÿn#"v9uÉÄ´uA2Á«Ž€`ºÚRNí¨$UdzÓjE»£iJ¤[Èø_”Pù¸ê¶Y2ùfPd½‘|Ũó*ª5šz¯°&›%#%½4Ñ/P ñÅðª28šªÉh)º™%ÞY]¹hD ê9Á¨Ü‡Ú/Eró?# uGqÁð䥈iëB£E:¦ð‘^%ÿ­åx^ ÃÅLZ%Í4«íŽf4 7’o  )½›%«ü3(Òn¤¶…ƹ4¨ÿµWªµÉfÉž?úY=ÃøÍS˜lF73ÏÔ— )ñ²iïOóÒd‚Z½D‘Êü¿çZôôzoݨršƒLM«4fÁ–ç¯VS™ÿ'É)Ž:„ô;x!†=Ú½¢ÿ˜w·ÖÐ4XÊ2ZTþ×3ó\o+>´9«õÁ4¿‰b_dõ‡SÕø'ÈÕÌ’iu–_IXm™Ô4V¡ªfEæcÉ8² ÿ›Žqë—/V°M)# bÊÿþuýô±•çîÔЪåÓçZ“Ž˜D!Ô™ÿŒ"Žþoýš½ ¸±HÇ2>»élR?EÊý§ ɤA!nþÓ7†¨’ø‚XIP5|˜¨ÀFáAçµ€Jfs¬ÞŠ‚b+GÞ\@Èïߥè@­ôOõÍBù?Î ¿e!Œál”èYÞ#Røl×~ªü'8øûª!àÕOΫ†Sýiw´ò_óV¤VO+'ðü惎çƒp BFÜõ~´xò!%Ä‘ÿ¿¢ÿàÏ ¯•M€øoy¿w.aÎk?Khÿ«†SK¼U¤±Ù7ÿµrLþ£¥(ÇAixœ’"bÎÿ‹ Ñ%ÿ+ü Ž “þ£9Û‘$'oœÚOµüšôò1K·Ö\î¸Ã‡9øoiŽá­È¬ž,ÇÔè@Ü·#è€Ú ‚ÑLÄœÿ= Ášÿ <Í®ìÅO1ô¦g8ÛÁOÒ_¯ý”Pç?éŒ{üKolÚø·jø0ÿÍæX½iÕSË)Kn‚hìLÇh ©€íjϬ¶xý·V0ÿÛ lÿS+˜ÿí–ÿŒ<#¦þ1¬U É̪*#>âÈÿèa­Z‹Tõc´&âèÿް¦…M?ÒÌ!¥1p¢D³Z iÑ»¬¹Â„™Õ( 1 b´ âÈGXͤG]3‹\”2Ü', X˜¥ÐD5:XHl/k˜0k5ÌàbÚ2£mGÿwð_·ð±Ø8ŒpB£€…X ©yݱ½Ì0f5ÌàbšQ£mGþW k¥˜ô˜ £V#œªQÀ´bå9mµ×ÛKã¿ÃȽ(ÌhIJÿk¥™ô˜\²áTf)TÉÛKã¿ÃˆùŸÄœÿ k¥™ôX ÃL#œªQÀÂ,…´ù%Gl/3L^˜-ó?ÈŽýOkÍ‘2ÚÙYÿeþ3šìØÿ0ÿÍGvä?ƒÑ|¤îÿ‡Xø3RAêþ˜ÿŒÑpÿ?žáñÆz¦gyM<’í(ŠŠrò—‚åxëÙÜø01Ñpÿ?æßæ™à[uÏçö¶aâ¿XüšX^ü¢¯é½’{(»#îÿÇôøá>ø‰2ŒÈüÒ w"³á †—€ÿŸøüG²IŽ¡J_ØmŒxh¸ÿŸšõŸEÿ©tªƒ8/–hV= F|$áÿÇôxcž¡ñ/}´Bü§cÕø'GwŒÊÑ®fÕÃ`ÄGvì¬ú•á—Áh²¼þ;uÊTõŒD‘û ô‰n15 ‰,Ë#iÄÔÿÇvŽAEK·‹†°Kµš=Ƈˆqqµe04Ä”ÿžs¬—êã?/3…˜ú¿Ê‡çœŠKÕü™v>š±2ºÝm1Ñ@ùïðœ#/Uõ dÚù˜ÆBž¿Ž«Ù †FéÿZp^ÍsŽê)ÂíÈ´ó1%<¿³Än:ƒ‘”ü×½=¨z¾Ó/içcå?ÇLa4 éÿaü¯êÈ´ó1…p@> Œ˜h²ü¯êȳÙùhÆBÂî”çäÿèöÑÌÚÿ0‰âüçõ_F>Aò?ƒö? F€A(Æ¿ë˜ÿŒbÂÁºfuá-Àfö ƒÁ`0 ƒÁ`0 ÿÏýÿ endstream endobj 3781 0 obj 14559 endobj 3782 0 obj [185 /XYZ 32.2500000 236.750000 0] endobj 3783 0 obj [185 /XYZ 38.2500000 161.750000 0] endobj 3784 0 obj [185 /XYZ 31.5000000 488 0] endobj 3785 0 obj [185 /XYZ 32.2500000 575.750000 0] endobj 3786 0 obj [185 /XYZ 31.5000000 577.250000 0] endobj 3787 0 obj [185 /XYZ 31.5000000 488 0] endobj 3788 0 obj [185 /XYZ 31.5000000 237.500000 0] endobj 3789 0 obj [185 /XYZ 38.2500000 102.500000 0] endobj 3790 0 obj [185 /XYZ 38.2500000 161.750000 0] endobj 3791 0 obj [185 /XYZ 38.2500000 626.750000 0] endobj 3792 0 obj [185 /XYZ 38.2500000 626.750000 0] endobj 3793 0 obj [185 /XYZ 38.2500000 102.500000 0] endobj 3794 0 obj << /Type /Annot /Subtype /Link /Rect [60 452 91.5000000 458.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_introduction >> endobj 3795 0 obj << /Type /Annot /Subtype /Link /Rect [87 445.250000 144 452 ] /Border [0 0 0] /Dest /#01#e6#f7#94#3et#7d#b3#1f#10#c2#99#82a#2ceV#cc6#84 >> endobj 3796 0 obj << /Type /Annot /Subtype /Link /Rect [87 437.750000 172.500000 444.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_commandline >> endobj 3797 0 obj << /Type /Annot /Subtype /Link /Rect [60 431 141.750000 437.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_differences_java >> endobj 3798 0 obj << /Type /Annot /Subtype /Link /Rect [60 423.500000 94.5000000 430.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_void_pointers >> endobj 3799 0 obj << /Type /Annot /Subtype /Link /Rect [60 416.750000 86.2500000 423.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_arrays >> endobj 3800 0 obj << /Type /Annot /Subtype /Link /Rect [87 409.250000 156.750000 416 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_arrays_swig_library >> endobj 3801 0 obj << /Type /Annot /Subtype /Link /Rect [87 402.500000 238.500000 409.250000 ] /Border [0 0 0] /Dest /#ba#b15#c7#7c#f6#ad#e8#a4#03#8fp#a7#ea#b2#b0#3b#0f#99#87 >> endobj 3802 0 obj << /Type /Annot /Subtype /Link /Rect [87 395 166.500000 401.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_arrays_pinning >> endobj 3803 0 obj << /Type /Annot /Subtype /Link /Rect [60 388.250000 98.2500000 395 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_exceptions >> endobj 3804 0 obj << /Type /Annot /Subtype /Link /Rect [87 380.750000 208.500000 387.500000 ] /Border [0 0 0] /Dest /u#a4#0c#cb4a#ea9#1d#7eh1#c6Y#c7E#d6#ae#ce#fb >> endobj 3805 0 obj << /Type /Annot /Subtype /Link /Rect [87 374 195 380.750000 ] /Border [0 0 0] /Dest /E#0a#ca#b5#19#21#f4#5d#2bo#21#2co#cd#b7#f8#e4#21Ec >> endobj 3806 0 obj << /Type /Annot /Subtype /Link /Rect [87 366.500000 227.250000 373.250000 ] /Border [0 0 0] /Dest /#c8#f3#e6#0b#158#22#ab#7d#d7#d9#e7#c4#8er#b9#f1#21#86#83 >> endobj 3807 0 obj << /Type /Annot /Subtype /Link /Rect [87 359.750000 198 366.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_custom_application_exception >> endobj 3808 0 obj << /Type /Annot /Subtype /Link /Rect [60 352.250000 93 359 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_directors >> endobj 3809 0 obj << /Type /Annot /Subtype /Link /Rect [87 345.500000 135 352.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_directors_example >> endobj 3810 0 obj << /Type /Annot /Subtype /Link /Rect [87 338 153 344.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_directors_implementation >> endobj 3811 0 obj << /Type /Annot /Subtype /Link /Rect [87 331.250000 129.750000 338 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_director_caveats >> endobj 3812 0 obj << /Type /Annot /Subtype /Link /Rect [60 323.750000 104.250000 330.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_multiple_modules >> endobj 3813 0 obj << /Type /Annot /Subtype /Link /Rect [60 317 120.750000 323.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_typemap_examples >> endobj 3814 0 obj << /Type /Annot /Subtype /Link /Rect [87 309.500000 272.250000 316.250000 ] /Border [0 0 0] /Dest /#f2#a9#d9#e1#9dT#97#b9#5c#bb#7f#11S#29#beO#2d#d2z#3a >> endobj 3815 0 obj << /Type /Annot /Subtype /Link /Rect [87 302.750000 240 309.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_memory_management_objects >> endobj 3816 0 obj << /Type /Annot /Subtype /Link /Rect [87 295.250000 263.250000 302 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_date_marshalling >> endobj 3817 0 obj << /Type /Annot /Subtype /Link /Rect [87 288.500000 244.500000 295.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_date_properties >> endobj 3818 0 obj << /Type /Annot /Subtype /Link /Rect [87 281 297.750000 287.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_date_pre_post_directors >> endobj 3819 0 obj << /Type /Annot /Subtype /Link /Rect [87 274.250000 195.750000 281 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_partial_classes >> endobj 3820 0 obj << /Type /Annot /Subtype /Link /Rect [87 266.750000 197.250000 273.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_sealed_proxy_class >> endobj 3821 0 obj << /Type /Annot /Subtype /Link /Rect [87 260 215.250000 266.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_extending_proxy_class >> endobj 3822 0 obj << /Type /Annot /Subtype /Link /Rect [87 252.500000 156 259.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_enum_underlying_type >> endobj 3823 0 obj << /Type /Annot /Subtype /Link /Rect [43.5000000 188.750000 533.250000 203 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://msdn.microsoft.com/en-us/ie/aa290048\(v=vs.94\)) >> >> endobj 3824 0 obj << /Type /Annot /Subtype /Link /Rect [383.250000 188.750000 398.250000 195.500000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://www.mono-project.com/Main_Page/) >> >> endobj 3825 0 obj << /Type /Annot /Subtype /Link /Rect [411.750000 188.750000 447.750000 195.500000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.dotgnu.org/pnet.html) >> >> endobj 3826 0 obj << /Type /Annot /Subtype /Link /Rect [254.250000 176 354.750000 182.750000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://msdn.microsoft.com) >> >> endobj 3827 0 obj << /Type /Annot /Subtype /Link /Rect [240 168.500000 311.250000 175.250000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://www.mono-project.com/docs/advanced/pinvoke/) >> >> endobj 3779 0 obj << /Type /Page /Parent 2 0 R /Contents 3828 0 R /Resources 3830 0 R /Annots 3831 0 R /MediaBox [0 0 595 842] >> endobj 3830 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F8 8 0 R /F9 9 0 R /F1409 1409 0 R >> /XObject << /Im3780 3780 0 R >> >> endobj 3831 0 obj [ 3794 0 R 3795 0 R 3796 0 R 3797 0 R 3798 0 R 3799 0 R 3800 0 R 3801 0 R 3802 0 R 3803 0 R 3804 0 R 3805 0 R 3806 0 R 3807 0 R 3808 0 R 3809 0 R 3810 0 R 3811 0 R 3812 0 R 3813 0 R 3814 0 R 3815 0 R 3816 0 R 3817 0 R 3818 0 R 3819 0 R 3820 0 R 3821 0 R 3822 0 R 3823 0 R 3824 0 R 3825 0 R 3826 0 R 3827 0 R ] endobj 3828 0 obj << /Length 3829 0 R /Filter /FlateDecode >> stream xœí=IÏä¸u÷úu605âNA€îþºƒä`0øä´ã N:>äïG ©—G‰¯Hªª¾rÃÓ]ZHŠ|ûúó?ýúçÿúûùç/¿þÏù»ùû˯§î¢D7ÿï<þùi}ê‹ù÷Yiqþþ~úqþqúåôËðß§ù…_¿üëð¯ÿ;Óó¿ ÿÿËùßþ}¸ø'óÐøÀûI5üý×éï^‘á_Ýò÷xý÷ÓÿpþÛ8¢Î,ÆýýQ½dÓ26¦þq²ŸI¦?ÿþ·ÓÏóäÍÂDOUw&œñ3é9=ÿïžþGfî9!JòqyøOTtœ¦âLh?œ² æ™þ”\vëj nV^zS“$9øð"ée§4ÿ‡©qÇ`˜j4sxVµgæÝQ3ßÜt« §"2ó/9c`—y¥ËtM—陟CÚ|M›KèÀ£"›{zrÊ#c°}Ýuû¨Ù>ÒÍK#çõBGNú룜™êújgæ}Og¦H·:³ñ×Y <‹Ã}X?2Ϋ·‹|ŒÃh×À1ÃóæS³¿Ú\UU`XœäõUIˆT³<-Tyiý:zU`8{Voðiå¥7eVÂÁ\A01í¹ù5ÜXcW°$*ätí'>=;þ÷ûûùç~gJwçóÛ£9˜êŠ3ÍÿvúùÛ  ÷çßþ*~áL¹o>møh©ˆV"qíŸCdxW„]ÕÄ8¾£§;ì"¸ÔjçghoIìø]ð \ßùj€Æ|_€ ±wô‰yàs‚ßçI¬ÞæmqÇ¡%%>œØÐ½ã‹Ã•ÀóG ¯> ð†Âóø Õà’:üˆ¢ð<ð9Ádá(H✾,,dÏΠãCsbý(¡rføŠÌL0æs3²< †ÒmíG}O‚ƒ t0ap«Ù§c ^A°‘0߉Tâx‹‹RáÅÐøNYÞ.£–™A–„‘¸ÈçÝoJ‚ðíçx‰ýy!êœZb0j|eP3Ë>1Û£†J"P+AxൎÜ\é28Ÿ¶¨ÍGȉÅ> öa$‡ý/!² >¥ î—ãb/ÓJèHÍ8îsX? ­ÉKdï1Øþ€y€¡¬ð ÞòYŠmÂH†°1 Vމì ú@ãè/̼´ãN–bü.,FÃX‡1š$JªA0ðODhÆ!Œ73r4bAÓС»Tˆ8HþH€&F°Gr }bìâ#l¼AN¬ÈHû€‘Â_AÂ1hƒŸ3f»1jZQƒ^3ù2°Á`Ì\û-‰e™‚ôã«?ÞõÛL½DxFsÜ~ê"VÌ¢"j9ט>S%éd¦è›räVÜ ôüÝ1 /2ôü¾ÓƒïÌCTÀ/é<á—Ž¸¸ðxkØ>Ö £1¢¬•ÐÓ oy¡š@@„?;ak¸g«T+K-x ¨HHŒE¡9cN¶æa\wѶ°×  `ë$†‰c¼ˆ%ây9e‘¢&[.ÀyŠeÙøÄ„MF(xmE}ŸeUõc#S ïÀàÔNzœ‹1@63ÜPÊ»ó ¼ÓCw(xÇdìÍŸ§û Ý1T.öŽï¼Aw :U?$'¾üQgVJJÙ*avÀDô¦ŸjlQƒÄKÁÀÆRøc|r|Ù†£šþÍ>Ðèj@\]æN:¢vsw˜ç˜çÁ²È[a~œ˜ç.¹.!„íf»Ÿ+c±Q|fž„ÄÖ(pïø4Lä *?¤•´'UK«P°šäµÛ¿S)='I¨h nÂ*‰ÐŽ—‘Åß ;Þ …?ȆMéù½,ã:œÌ>¦’&àÐâ Éô5…i¨]ÜŽ;0ÕMÔñ(Eª3$˜+Æ%…Ï£­™¹¯zŸe$F""Mr÷—eaܬ±â9 Áˆ °µÑ<ì =øpxÕ‰;0ñIQB˜e•9†Ù¬GÀˆ–è×|i)a¯†ƒƒaVQ9ëïz’ ÇêAÜi»S¾úóòÌ=žgŽÐNø2Ä=»æÊjØSýæÎ;Ö|ËšT#&»º™%‹-]¢ J äf&)¦w>ôJa¼4÷ʃ߲†öÊ–Gþµ¢ óÒ¶t"cœ™ƒ\V $P:1^—Ø;à ൽdªû•©¶àRŽ Ü1ŒµàÚ(ìÁ‡á†KŸa ÄÌSgh±J×úÌh õ Ç=±»a¬kê¢z× ßé`™v(( 8æÝ`Ý…vÌuvlÕ!¡ÜÞÚ±[­<ò=3&‘>°·¯ÐÄ<3¬Pv!ÝTâüJôõ ÷”Ð'áéÎ]ÏïÇÒügÛˆî¢uwVÓ_йm‹ gÙ/-üÌ•ï'©/„ôTk²<¥Ö£˜_fŽáyó{zíì½Í•?ÇpåûÉ[ÉpÍ®|ÅýŽï§ßOŸÿàì ö„ìƒx²_ìÒ|y"„KœòEeÁ L´y“¬²…ò6õÜ|FH›Dêõ…±K¶ ŸÚ`/ô\N PMW¢ØæÊ÷á¥ÎèòëaìOm`o¹ &ÐôÒŸf¸2Nã,fzŠ»Ãpwšß×­hAø°÷3ˆ+¾i'0ˆKçwš€ÑÂt´½ •ãë^E „´ñ³¦¯R(q.XP+¿¡ãDÞ†‚N¨–cŒÚEÍ ;ƾ‡(¨a, Û‡ííû )èØaoÒ­<º¢uŒ®ôð}Ò•þJHì0ö§ò芖1º¢…?ÍØb×§+ÓS܆»ÓJWú¥æÜ®fi˜@ÔVÓ^‰Ôm(ZIÕë¤hQ¼²Î¸;(Z¨wR4˾æ^#EÓb}á¯Fgë´“Ž~@;Ñh×{²ûxÅצ§ÔzûK:úíDD? æà~0^³++ýà:Ç‘ú%K•0R †$Ø’‹©æ‚ŠÃ‡!vMÐÃ2Øš…ŽúÞ¾2~ „G²¬v¸éñØ«ØÑa©V£ë ·“+*\rEeŒ\Qí“’áJ@®Æ§ÔzûK¸äŠò¹¢,˜ƒ…äj¸fWÊ×äj™ãPrÅ ÞÒ7/ÐõZ5GÃø‘1¢¦®ÃV½È݈Á¨U,”Z_¸18wƒ‹b68:Ùà<ПRëQì/î"g1Äà¾-q¼ ÆpÍ®”­c™ãPÄXj%оl'òÊ< †ðÖ‡>ùL8Ä©p.ìÕ ©d®M%hÐ40™Qc2[+ÀÓS³†¼ c2Wƒ¦’F4h*}àxÅנ秸; w§9Rƒ¦²·ÇÛ¨±èñÀ„É šÚÉž$ g·rJUg¥=ÎÖv M=b¡YŒXv0jì`®Ob`‡±?©G,4‰ í[õÆ+±˜žâî0ÜæPbq ~QEmA°ª‹iø’ûP[?'¥j}¡¢Ÿ*«òd„q5J/‡SIàœ2Œÿ5¬Çë—è}¶¾ÇwÑ`íŒêÿ˜2¨†¬xLÛás âûIÈ.F!·Ø4ëˆË¦YG#lšuÜãŸl²ãº\vzjfÃË0ö'qÙ4뺛î{ŸM÷}Ȧû…/_‡áî4G²i¶Ä>4›¾+bñм0aûj”ŽÙ-“±Î†ç0Ù¯/Ülíb´s¬]Œ’ˆµ‹&Z6™h]{Õô”Zbu޵‹‘>bíbÄ75W|k×xͬԌâ~DZÖ.FekýÝr.ϘÆèM¢åúÂnÆËzñò.Æx9õïdxõïø”a¬vó“õãe:ÂxSþ4LŒw~Š»ÃpwšC/U`þÉÛ,î§ýÜÆPÁ×*êã‚ûGûiåw(¦p[eÂPö†j”I:Ä×Ç @ÄB$ªó¦¹,Û‰V½Ÿ¸îbhµÉK„2ÍD,dš&Ãéé)Ã+„2m§¹ò ™fÂ÷ÿŒW^"–éë0ÜæP^"·#|_¼ä^"…ÇKdõàmËK®Gûâ%µx‰i¾Ã/Ô'åÏ€ûiûæœGÁ|“¶+/l©XØ: \L‡aëlEÌí0ö§¶ÎT,l}ØB†­ÏOqwîNs(m_Zß@Û÷S:ÍU‘¬/Ô£tãDÞ‡>ÖÕb´/ÚþaÒ_ܸ¤"¦üRX_öøê®»3"\Âø~¬‹QÊMfÙKYö*Æ,73n&‡×Ofh‡±?¥Ç,{c–}à4ëyÈ,§§¸; w§9’Yòk“^Yæ)Dv@"VÓØ¯gç ˆ¤¼[_¨¨ÃL¥®Ö§’ȼCô`G¹³ïò<­—âź’‹=ƒ®$˜N7¹9q3L8‰e˜ðÀíÇI˜a2=¥Ö£Ø_n† '± N|÷åxÅw-Ž×ìJ×&×9Žt-rJn'²1F¤×ÝacšLO"§×ôº¾°WèጻBg""ôðÀÅÇ‹o-³LOÍBÍ2ŒýÉ]¡‡3z8ó–ã_號âî0ÜæP¡‡?'PîÊß|`Nb3n£Ú¨A2ž—ê20 §D,Õ…®.ÂT—é)ƒ3ÂIu±Ó\qJÄR]¸ð7ã•§Ä’êr†»ÓŠS¢ÿ¸8§U6²0=iO™ý$A. -Œ®/ì& ÊKhá*–Р9WaBËô”Ayå$´Øi®$AÅZ¸òíýã•€$¨%¡å: w§9”$(ýd$a ˜Œú…›éfÖ)ájÉÂQd}ávµ¬'®ZÖÓ˜ZÖû5DødFó«ñ)µÅþ"®ZÖw1µLûµPÆ+Z¦EÌŒâ~ÇÁjY¿#ì¼lV ÌÕZyGÆí¥¼·A<´cë 7£™ n`µ ±ÀjX& «§§ÔzûË ¬],°Zt¾…e¼â£Ùxͬ´[V_ç8Í©XhÂvp Û“Ø!oGQAl,ÆXMcua¯ )¨ô-X,è[6Á ïé©YF\†1?©ô-h,è[Pß"4^ñeÈù)îÃÝiŽ”!ÅÒ4f{(µ¨`Oêݲ–`K„µ¡…¬z„5Ñþ>–-4X6k­‘›Hl»³¡‚¢1®ŒÞ+ìˆ wн±¯‚{7ŠÔ¬LÔ7Á7Z­:£&<<¢Çiá^C{=¼Ÿ¤ 1~±)‘p/u@ðXê€,ÐB„©ÓSFâàNê€æ*‘ðXêÀ°Sþ4Ó¡ 8^‰/Î2Ôµ![_¨(d yh{·ùÜyÀܪ%Ç-² ŒûSUÊÓÂ[¯Óµ QÄ5AÓ0¬f¯uÀÃß÷“œËÅù½)¡h/ŸFèX>Ð~>Ða>Íô”‘@´“Oc§¹J(:–O#´ŸO3^ $½äÓ\‡áî4‡J(ývæ¦üd+©æ±|Eëx¢L3[Ùq»Ô\L-hL¸^zÚ/eôK‘¹]‚½PQÊPÊC½—hž‡ópM]Ø,V#5/¯¸"¦+&±žƒƒØ¿‹Xï'Ç´-ö?¼á²ÿáO„ýËN{|YNQ=.÷žžšÙû2Œý)\ö/;aÿ²cÁ4,`ÿóS܆»ÓÉþ%Y’§7P¼Xù‹•ßÂÊ%±!ñLŠõ…Ь|˜ÈC£F6.ÍVwûƒ]1Ñð<Ç[P{ƒÛ~¬ÁlÊó[’žÓ¼±Ç™WÅ›ÇZ*-e·äèÒñ÷“šãL|¾)9R/'yXiLr "P% s’§§ŒdHœd;ÍUr¤±œdIýxÚñJ 9Ò%'ù: w§9Trd B‚¡âÌWX…óe׌˜0K ás¾%j HN)*ò¥è¹¡¬(˜<#„9%[Êe6Km,Õ´ºPQÊí¹‡ò÷˜;Xˆ»IcáKÛµM½|Éc)ø2”œ2’:ìÃ9=e¸•ÆþôúpJëÃ)•Ð5^ ¸™º²¯eîNs(7Ó¶  qÂ0"„qÆ‹Ü\Ä?r¼ñ%~À¾ØcœYPIꥅ&'ë {+½l"K"‹>SE–¹S„KöÿÛòóŽ^w¼cöS^Œ1!bïôÐ;†‚ÇF›O‡ðK`µ˜OG]zí¯ú‹±t„óí+tÇòªÈ/à¾Ák¿4±¶Î…6­r\¹+&…ý‘£+’@¦ˆGáÀXš‡é\c5a–ƒïh4:Ÿ"¡ö¥=gU6ï% wüþÂÏ èÜÏCŽwcèf@SW0YÁËÒ0…«Ê†ÈF7-Ú*_!Сjƒe.Vg@ºc>*›ÿ‹jÏ©Ö(2•K„˜šišÞª[X}Æ€ÁáÆœV‘>/»3Îú"´Ú„¥%£DAÙçe¥šrÔ<Å™*ßv„±é„Ùe÷®p-Ày„ËñádÚq ¦Xzª›Ò2öJ½ Öp'Ôæ÷$$Ì^7JäHX†Ê ‰ø@åmá3|ˆ¥Ã­$ë 5³­A¼•ćŒþ š!æzXg5©ÆÇ™.Œ¡à„ÆÅ G$Ì1É©EyaF´]bC˲g„UóÈXÖ+ý^—=ÒdY»vÙ<¡»i›°GA q8ÂIÝÉ }&±Œ³º# ¹ sÄ0%÷eΊ²mW0ÞIDÿ6¾ô<Ë2\‚‘‚X¸å Æ`óêü®ï¸/nÜd÷m¹ç>ÛO°cŒà"wj$ý\ ûª’ôZ­’ŒKðd¢¶¨Œ¥£Ôûì„ÎûU²þwØeÆuõn279Tñ×Õ¼Äw];¾Â¥0…j1… 0’|+/¦'[¶/1OUÁTºçPŸ"®ö‹ÿ¨VXb W¯‚!¥Q‰Ñ T(Ìdz íá9( IÁ0¢ŠœOؤ´…õaº¢al®eû²%Üö÷’ôzˆø,ƒóý€N뙈§i÷ͺW{dùGh˜€ÁvlR¼__¨çˆ'òDl„ë#!IUöLÀ—KI l_AÞ.¾×ïöûIÇüêô[«{Zùª×a™æ‰A0šâ*tî˖ňçE2Z1Ú bS´–$Jh- š9uî0Œ³Xª·V3£•Xÿ÷B¹õX–±Z"ìžõ#”Ëf¿²²ÀðST¥†¹™ ´'d[~Á»^ò žÇ§X7oâ¼}é?yˆ‚VÇ—8¾Ôññëe¡U ±×œ"à`?ÇàÑÑryÕ8´€*–¨z”!X¤Òm"ýCp^2ç¡2gk¢ÂC‚g9÷ÄÌÚ·Ãʉ&hBN¤c"F1‘s[ÌhÛ‚6b„¶£ñØmuá Ú¸EÓôy¬¨ÎIçú¼½ð¦$Ý%èÞ1 /.4èœö©è;=ô޵ÃÒÐ;à Q—žzw8ÚŒŽ„[¯ÑŽ$v§¯}ˆ¶ûæêµ••Ãç…@úé*¦Ÿ´hu%ƒzÇàu Zæ‘6auHÖc{(Àyàw$x~\ý\[µÊ¹^J‡b80& &Îec"%J'TUŒÅÑ $Q¨EàͨlkL~‘"Ö˜T¦Œð‰²ŠCå¢ÅßfÈGU†US z«|¦¢iÛ kaÆߥD„¯¬®±ÛcºÞ ãE•9<¹Y»£;¤R%¬w¨½(ênf¬õÜþ²˜µm³YµA¡ ŸÄcYúX9¯pFo#&HaN€©…pÛ”)XѨºFár¦Ez´¢NEz[6Jθ¡rJus6슟=ö¡‚óˌWmÈ ½ýçàŽ% ‘²‹ÂDLUwL¢1¸‚ÃÑ2B®[Œ‰á­—ZEx†0é!µÅ#gÇG¸ÂغCàw>ÕFr¦¹÷m˜¢ªe³ÀŠ•ä¸È‹tN„¿åÛeÖ´~Îáß+ÜBe$–È!ÇÄm$6Vo(ˆ²ƒ¹ñþ`5—’ÏšnyDsÞ²¡F ÈÁ4Fb•)ÄØ*¬®‚€LéfQñ÷ˆÀhLÉp̧ù@Tu øXÌbÂãÊöú8°x(!ÄgŸ­:sT¶ÝÜ•:\í$˜–Kˆ=@1Ã"E4÷×÷,¸ƒ7«4°åћھ”ˆ‡¨œÎ|ƒa¶®c1çу¬±w8x§ƒîPp´Äª)8ßyƒî°bA½ÐYQÁ¼³ªÏo©Pþœx¦Z”©’/P.ÊGû ®Üëľ«†O^uâKáï÷­ì^ïÀ0Êòa³†À c ¼pžú¤S2'/ƒöƒF˜U%`9¼L!FÀrYÓ†µUcS½Â€8ƺZ¶8u ÂÁiX¶xÅÓKa›TÙ6©~ƒ #ûCÜcöûÚ Ê¨ö3y\3Å [¢WHexrc£×ÐÇ¿<—©µåUŒäŒ¨œû×Êz;?p0í½*A)ƒšV¦' ¼›K@ƒßͰ\µïppØÆ»ú¤—ù´·:çç]Ÿ{‰*ã(± Áö¼pÅ_ØuWØ%ú@²ÁXÈ22H¡‹¨Dt(¼¶Ñþd‘¸ÇÊëNzhõ<òZøD¼>CÖBûŒãå±xE©U¿ü Çû>AþŽ7´Qí‘;2²7õšÕ4'3Úß`EÜ’›X?%h/[8®pïñV…‰Š.‹˜óžM˜/[T,‡®ËÁaâÍViáZ¶*ªP!ÆV)ÞvÏ 5×äH6¡TnhQ<Q®%$'ÚÓbP(‡öÝ¿O¨šÙ¬ âQ%ÑŠðB”×z[þnÕËùñ|’šùò7} IyZõ´ôsבµUMö²÷ç,·‚q†"ÌeÛÔ¡$@ ­kT–°p„ Š¢˜Ó4¼o¾a)Ãâé5¸TílGIâæ›˜÷Îd³“ª{œë|ت' !]ïNydO˜­î*‘w,ö†=P 3Œõï º‰ÀïÀ]X næõZ{ $:æ|wÑ!¾“X5ü¥à)$úï`úÀ€+°ÝÛ³zû–èŸÓ vªçÜK9áÊJ¶C[Ùb×e»•ÀÆŒ©ª‘jw|ƒÚ2ý_J„ú7‹TFXñQAúl¢ª>W®|öaô0T{ÌV XÛ»’¹±%\ùÌ«÷wõ¼Ãf–ë7ˆ‘2D©¨{ŽÀi湄aô–8”¢6{ (Bj*ë2Í [häù­Ôœ¼¨PË¿–b Kš™í¼*kʪ;2àj+‰UƒŽŒ4ü'ªÔÀµh߯-Q=æzm$ Î?IBÔ/[ìRt´ úÀs:2é3åî.Äøî|Þ*‚O3\ÑËܹ8´Èð{3ïHßrA ˆüoп±þRqû~«Ž] ®:Kê ¼GWËÙ$H¿œ9ý?n¶m" endstream endobj 3829 0 obj 8401 endobj 3833 0 obj [186 /XYZ 31.5000000 686 0] endobj 3834 0 obj [186 /XYZ 32.2500000 685.250000 0] endobj 3835 0 obj << /Type /Annot /Subtype /Link /Rect [384.750000 659 438 665.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java >> endobj 3836 0 obj << /Type /Annot /Subtype /Link /Rect [70.5000000 544.250000 110.250000 551 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nspace >> endobj 3837 0 obj << /Type /Annot /Subtype /Link /Rect [303.750000 450.500000 342 457.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_exceptions >> endobj 3832 0 obj << /Type /Page /Parent 2 0 R /Contents 3838 0 R /Resources 3840 0 R /Annots 3841 0 R /MediaBox [0 0 595 842] >> endobj 3840 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F8 8 0 R /F9 9 0 R /F1409 1409 0 R >> /XObject << >> >> endobj 3841 0 obj [ 3835 0 R 3836 0 R 3837 0 R ] endobj 3838 0 obj << /Length 3839 0 R /Filter /FlateDecode >> stream xœí]KÏãºyÞ¿ÂëÇG)‰Šs-ÐEÁ ÐEÐEqÒ4r‚N³è߯dKþ,Rm>~II¶rÐÎŒ)‘ùÞ¯¿þË÷ÿ<ü÷?¿~úþ?‡ß†??}+ŽMUœÿwèÿûåú‡Ò‡¿[~ûýíçáçÛ··oÝÿÿùv~áû§ëþö‡òð¯ÝÿýõðÇÿè~üÓðPÿÀïojº?ÿvú³mT÷·âògÿû_Þþý‡¿÷3ŽË ›™þûe‹º¨ûmÜXúçÛø™êôß?~ûûÛ¯çˆ[EתTåAmª5åáÿëíÏÝãôű5J5µiŠGjÊ~%U7U¶Å¡j¼uNÿÉÌ®L^–:Ýä§KŠê&N~´õð?øwriÛ¯[©î°Œ²‡T0¥Œé×iŠr•­m%{~Îô²?ÎÞÚ”³÷{?]¶ÁÉ%o·TMs> šåè}þ$³W:åì§½ËÌù~³‹^peÛó5u’§Oru8œ÷.~.ÃõÂÉEo·QuBâü>}’ó·=K6ûi3ž\ôv[Õ¤ÄÝËôIοmË”³÷{O…»prÉÛÕ…I)X½OŸâüµÒ «óÞá®7ù·˜IðNοògàÅ?Þ~ýÚf}øñçncçOüøýÍèÃ/½zÔiŽ?þtø§¢PöŸ?þú¦Ô±2µí4íþ¹Óˆ>Ø£m‹Žÿï#E{1G£ÏªùeDµè²<´Ç¦®œÙ¾Âu>¡¥ášÓHuÔ?¸ó¼þÒâ#úü¥J{ƒë¨ŽœwýåG‹Q{Œêj–ÏðÓ ¼Ä3€éòî)*øÎùp•·àîÜõÖpä úžÂÜ£™‘j = =t:&ùõªÖ½ßò|RªÂv?EõÛ¼YéI&Ëê¿‚*Sà,ÌÚÁÑAi§ÝLNâ#)áHQ¢…ßiáÈW8[ššUV;'µ¼¿Ž²Hacc‰ÎdÓ5%íi.ÀÔ&OöPšYuUÀ©*ÔtÉžÑ÷çnffd`õqˆU»ë½3Ô†U WæÖ9ï 9¶ÖÝ5åÙ™/‰ø3±UæèÕïþÏÏÖÆŸÛ ¢Ì}éG¸7b¶A?Ÿ› ~^GÃ/ˆÇ̈þÿN!–APIkãàÒ@bJå ðFÔxºŸá;5Ä¥¯©Ò !wq¼œL‘«²ÁÁØçE ”Ç„ ܯL3Z—¬4’KVÏåÒ_ïVzbjÈl¯¨@$xe3&š‰1ÕH| lYwR¨´óô nÚ:<1±±Žb*²±´Ø:Qfc7i* ûÉD]ÌT˜ÂýRåMåÓc„"w(ë¨hÈÃDd19æúÔ´"f ö¾¦ÞÊk¦î#û*"-«R®*”[ØÚ©0A…/’À$”ýÍž.¶éÛÔú Ö\ÿò··ïÉ:Õá@“Ö¸bŒ ºMÄèJ®–V‹y[2eŠÂǺQSŽŠkûÁÎ\Ž¢ÑhG5eNØÎ`»4¥z9«YÒ¼¯Ò9ÝÄ2z¶ºu÷{ÆsÙð>9Ù¬Äå‰)öçŠ2 p2ÆÞ""`¬IvKêb 3Ž˜‰À,kµ|"`´{(eŽØè}—E"ìKµ,Š`’T[ ™ ñr%„PJ¸d˜l=àûÍóC ”C6Õ£kպܳ²öÝn—xeDK>;¥ªŒ«‡2î12Ïú¤q*÷M”‰0Å>° Èèz”¤Á§ˆçªxÈÄÜÈ`¹³æöMYËç:ìø²@*enÁFöìÓçŠÕÚźå‹60½)‰®/”xO¸«Ì—÷[¼Çg:ã­mï|­;ÞOüûåßæhmq¨ëþF©á×úPWÇÓ™v¿üöV›£Rmi­º<¥'³èë5ºç‡—ýk÷må­¡úwœtOÙÉ,vºÆ_Þ>þ!dÛ3;©»U‡«ƒFë$åp…tx?VóKë^ÇëºÙÇ`?`XÝíÞá'–8ñÏÂG¾Àœâ¨S3ºî(\z8ÓœÑÏDëdP:1S[ƒp¬¦XvʨhÕ¸ ÷òí+gU·.’c¢§ ¦19ü’šjã 4×¹²É•Ú‘+õ¬\©=¹RÏÈ•ú"Wê‰\©¹RÏʕړ+õŒ\©/r¥žÈ•:£\©ÇkHbÆI‹'J•ÎG`Bž-¹Ø lëœÔ.6ìbƒœOKÄb–©:ML‘K §‹«þVÍò·ÊãoÕ «.ü­šð·ÊáoÕ,«<þVÍð·êÂߪ «2ò·êø[u›¿¸ ”1¯| qj1ä‰é«ë\ø[µó·¿íüm›ü­qø[3Ëß¿53ü­¹ð·fÂ߇¿5³ü­ñø[3Ãßš k&ü­ÉÈßšgàoÍCúæHŸop¤8S±(‡Å;ÔW^ütJ•š“—MãÀÄ“pò_süzùºøÏÖb‡*ÜÊŸhJׄ1.±xÝ>öÙ’ 1ñ“Í6ô‚™n•Á]i•L!o'D´\ÊD]c8–Õ‹K+)ZU»âî ÈB¶qÉUþ_4sÜÇvÊôàbR£ãÝSöøöîŒD¼å¢MI6NÜÓf>È6K}» EŠÊLްU­¦­Ñ Q}±Z™KŸEJ¾<ØÞÚÛ$þ9©fJONS9‡»¼@¸ @„ŠÊô©HPPª¸lB2ôBÉùÙ@úpšûy!CUdkWÉ KEHSÏS‰Ýs•†£ßà Ñøt`ïÀ`DA`ßÜuwoÏv+÷9JÈW›1Š»½íWadÆå¹ôë˜é_ÙÈ-kÌz¹ÝˆÅõ‡ÜùæLbÝì¬wg½Ûb½qs¢SUßÜ ý­‘LŸ×ŒÅo´XÓ¼†«Æ*šQ7eyùâÖæx__\T%Ü,6ž¸/Sä eÍUéÉÄYÊ%+íy~¦ãØíãN(ùcúÁÉú„^OÀNÚT—¯Ê•X°|å·åë"¯¢%<¢b7SÚ”©ËØ\ÜEÖ2ñ¬¤îÙkî4Eˆ¦P…”£ ¶'-ÈZ—éQû~«\¦Ö-Ô”•UDx!ƒJ¢¼0FÑ–(ö¤Ü2ƒåHkxÚ™Úí® ;ÅnÍà0huö±Ô]kêIê®5ÍLê®5­“VÛÿâ¦îžžÒ“Yôõcê®5ÕLê®5Æ[Ãx©»§§ìd;]#}ê®­Ê”Òñ"­TÇŒÞ÷o‹¨·X~ÏúsÝîuÚýéäÇ$úrõá‡%Zö[pÀ!±(·TÜâ¶Òbx¶–²´©qE¦ù-ãMï‘¢³9ÓËi=–²ô/Û˜ÈHE‘oºkÚòM¤;„°qKÚ”™¶‚—Œõõ¥,dImZ)M Ú•ÿ1nQ$Ö%TÇ6¾U†ôÀg¤mY›Í𑸤ÿ&­AC¤×Ë•Ðý´L!ãe*ìäê(ƒ$¹šl¯W†*ëÖÕ pHnÞé”^;]6óV†¤‹jårñõ[‘fÞ1ÉkæÎ¦L‰ZQ\æic5žŒ3‰Ø²U¹ÈUHqdöç4ÓJ‘&Ôy9—­¦>.[Ïù¸¬uýOÝ/ž«JOfÑ×k\|\ÖÌù¸¬öÖо«ÊNf±Ó52ø¸Z5^ÐvËÓ¾D É'Óàì+<‚sÆpfÛp–ü*+jñü|åißab/OûÒÊó¶kC.m0K™@QºÔ{a¶›´Ö |jFêR<78²)r¥EêÖ8Àl0S'Ù}f#e«îfÝ”Ž…GDƒöÑÌälè(’Ð(¢Æž!z®4nóœ¦åõ‚Œ³mjO(&ÈY&G‡©ˆ o31líúÅ è›2âÙp°"?#s!‡ÄÅî϶³Ví²íž«ç sT®Uîš™§(¶"T*—>ë™l2’H<ó^ža ¨- ^±^Wò ¿ ªbÀzq;sÀWJ›Náñ\ëC› ´Kiò˜Ûã@¹g 6g@VÕ±hõt÷Ø”sÞ½*Ç¡‡¸¤l¥º€þ$š5@AÞ›DÌÃׄCÞ8& yghÊ6…>¯¨1¡ôûÖ`ÆÒŸ¡ÍÐ励‰Xû°¼GTi_M‹Ñ%•I‰4•\¼B8D^° }úøãV«ÎGV¶¢RÓfB ¢–/±ÎÖ˜Igkª™ÎÖ4Nxeÿ‹ÂyzJOfÑ×kŒ!œ­Ñ3!œ­)½5J/„óô”Ìb§k¤ál«Ë¥âè[,SãwFñv¥m<À¨ˆ OÂg øé%dІˆ6‰ $~3‰óLñ ÑêË'²Ë&¥Î Ãcdà‘Q#‡lýÁLŽÕ4¹îåùâæÌ'LÆÚ‚vÀªj]fuaQO'Öx˜c&ÊŒAТTDZüR§$'Öz*vRâŒ@Z×®°Øýâ ¤ýSz2‹¾^ã"Öåœ@Z+o å ¤ýSv2‹®‘A ­/ì Á6€Á’œl ûÕæˆây|á¥ü¹$Ô5ŠÊV[tq›Æ—…ôij¿® 6¿(j/ý˜AdU.;{Æ L¬XdZEÔa“m9•­ž“måÊnÝ/ž|Ø?¥'³èë5.ò¡Usòaÿ¼³FáˇýSv2‹®‘A>´v§l²Ùj2ñÉ äµ\ոςôí!ŒQ É‹¨NëQhÊX=°L‰áû~¤”5ZÜNI[– Ì]°‚u¥[‡Qjæ½¹"ð$"cRJœ)»©®Å™îߥ/Ît¿:-N¿8âÌù)=™E_¯1ˆ3Ý¿‹9q¦u[Qô¿xâL;0ï³ØéÉÅ™n­±›z¶&j›ì廾fj¦˜ á]3̈:±ŒóV$+aÍ>ÛL~ëÅ$+*W4“ü”Z(Ï"F§”°lë0ÅÅÀ覩5yHcY”õ˜Á0ð)šÀ´2gpÇœoH™c©nTÄ¿£¿KZÓ«1Pø†Â—©âI6ì$‡Í4½¡LTÌ…1•LÁh¹J¯¿ŽhºæðÕ¥ÍL)Yv§†O™Õò˜»ü½fÁIÊG-âa‘˜„â^ÀaG‘i1³M°c®” Ö‘0é3YÄÒæòÒY@2anƒÈÓ ê vTO™,ZØÆe±X{geTŠÛs¤¸fË”ÒÓåK:>ä‹åe°.™*7ÇÄZ*cCJ›Û°³A!µ&IbIÊuåâG®Z;`E&cÀÛ,®FZ_\ˆ¸¯ŸC*’)~(«‹ °˜ƒ¼Ei¥¸W&b¶%wMDNmÀ{ÂëÚ)+èéÚáfL,*6Z¢É}Lõèg7¿ˆØ/–iß=x÷-£x‰à¤pjçBEÀÜOÓ–·rPª«ñä!¥±´,Z—ᥥ›”˜éj/œKñŽ'KÞ~ÀΑÁ¤W›4ü£§KUÀ×ˤ-oÁvSÏšSð|†8%Y×ØÞš¬'cúÜb嚎E„I„M.ó©i¦™OË|r“¬O¿x™Oï¹Nã,úzKæSSû™Oݯ•»FS¹™Oç§ìd;]#Cæ“Õã-ËVÌ{»pDa&,“ ŽMyvžÈ¦päj‚²|Ç`"`$ p<ÐÞ)™#÷ev„+ dJYoAޤÅj—ŠÚÃN´‰lv©D:¦kj`FUx™>ÔO"çäªë@\qùÉ&çà]p©oD®5··ËSP¦ÑRÞîIc¥«Öå¬ëãx[Š8ÐܷغßE%–‰¤È<•\›ÞËøodóngÆÙ|>ª(o#Q7"&‡r%È'MÁÚÒv:À]ÝŸ†-Ýf®ÕúøŽgìfFšiãg ´›/á\·¨À/¥ÇB¹X(÷![a2¦ø-ŽÊö*+ƒ-_…@4›vãjÓý¢ Ü( íI›;å¢QÒ³ºl\zö2ms±°âÙ)¡‰Ü×W¬<‡µº6TL(¹+±ûm‡žÞ~ ÄS» Ö*JÐðé|ǦAV7×?üííû]Q ¢Z†v ‚l¸;ÓÉ'Š*Ï¡T=‰çPª™‰ç8ÅMLb-ú_ÜxŽÓSz2‹¾^cŒçPªš‰çPÊ­–ÛÿâÆsœž²“Yìtôñª¼h2¹*ÙnS¸M8V"Õø€1ãeŽqqò½¬ady&šâ3‘«2“‡ÀêÌ1Fp, Îï'”¿d¸ æN»,¿jò°C|"ˆÏC"Mq!wË“Hâºv jÙ0‰ä!>yPwĘg²Rè<®ƒÄ˜Ž±!z—Ežndyò°ˆÏDlô빬9eÆ1¿Ëƒù>²†‘å‰MˆÏDªÜë”ÆÇÈ÷0`î]èï¢ ì`‡ÅYÁ$ÞC¤²Á$Ổ2Põ$„Ú #` )ò)(vi-s²~à4ÄÒø„¯ 1”D•O©P¿Ú”.‚Kôæ{®(p¨€€¿ãn–T‹ØRn1Ôà{ƒ§€¶ÖµR%VcÔB¬‹EíÂo³Æù¶$%* ƾ{H)Ã(ZÇÈ(¢Ç•oæÖ9(5~ê³1lŸ<ˆ›Ãç køN=I“÷Ä‹ôœ´­”KÙšÒp0bˆ&Ö @^‡ÑIð;(èÏ=ÙOOH-CZDÔ…iLN²Ei„*ï©IË뛌0 }ø¸›ƒÉ+M1D˜oTé“@Å"ð¢Ê]”’ãŠ#ÇÞ$„Œ0¯ ÆÏv<0Ÿ²B[Œ,͘u°‡iƒ€ -•€<™I0—ÇgÁȺ²VÆÂ„Ù½Ç8cèýAJîÄš!FÊ\Ð̬³M™8­:—#±È5õ¨­.W€-RëÆœ Ä‚#LIÙ/ÕLLeB§_ÊÔ•ÃI¹ðÜ™ LqÑmr6hßK½ :É&‰h&›?…~n6¸k æx" ™ˆG\F“ ìíJC|$ OwPx…×ý»õ£ðtQ:UÍN¿8Qxç§ôd}½Æ…×ý»ñ£ðº_kw U»Qxç§ìd;]#y^÷cIÍ€ÖŒUŸ\¢.#qb6Và½a1R¤ø@ÆÓEhËŒ…b‘¸Û2€.Þãà 'Yu·T¦‰îžôùB#²•0–dë–ÊC|&’ò^sf')\Ž;2¼ë½ŒôNR^âó5¥ª›×•­Ò>´•0‰íìC¢$AÀŽÃ̆MhŒÙ)Ið2¹Úk&j;Äg‡øYíþ;üìèg¼~»õÀ†;G{u§Gª·°.¦—áîæ çShf,g«fy,Ï *Þ ÕþÈ`i+ƒ…ÇÆ9sÍg´Ž¾e˜ÛÛ×áKQhv?›÷-p³jøtïÄÁ&쳜ù …gƒï $õéWÝuX€ëÿÞíxÜùxvx‚~‡xBCPÄÌlx$pã_PPâ‚g`ë>ŠO Æb¶qaûiÔ:ƒ¼BU8É@ùïy¯ÀwxJê–eznÄBܽ2B°Úú8P÷ ªâèz|ÝÏý& ûvøööÿ‡ô endstream endobj 3839 0 obj 7825 endobj 3843 0 obj << /Type /Annot /Subtype /Link /Rect [211.500000 590.750000 282 597.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_constructor_helper_function >> endobj 3844 0 obj << /Type /Annot /Subtype /Link /Rect [200.250000 575.750000 269.250000 582.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_date_marshalling >> endobj 3845 0 obj << /Type /Annot /Subtype /Link /Rect [282.750000 575.750000 387 582.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_date_properties >> endobj 3846 0 obj << /Type /Annot /Subtype /Link /Rect [99.7500000 569 190.500000 575.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_date_pre_post_directors >> endobj 3847 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 437.750000 524.250000 452 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_directors_implementation >> endobj 3848 0 obj << /Type /Annot /Subtype /Link /Rect [425.250000 202.250000 476.250000 209 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_features >> endobj 3842 0 obj << /Type /Page /Parent 2 0 R /Contents 3849 0 R /Resources 3851 0 R /Annots 3852 0 R /MediaBox [0 0 595 842] >> endobj 3851 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1409 1409 0 R >> /XObject << >> >> endobj 3852 0 obj [ 3843 0 R 3844 0 R 3845 0 R 3846 0 R 3847 0 R 3848 0 R ] endobj 3849 0 obj << /Length 3850 0 R /Filter /FlateDecode >> stream xœí]K¯Û8–ÞûWx]@¹Ä‡D 4¤’f1@³hô¢‘žîB£Ò˜L/úï·d˾6å?‘Ôì rsM‹¤Ï›çñË~ùóñoÿ<þòáËÿ¿õ??|9'S—ÿŽÝŸŸï?õ©ÿ÷ÑÔåñÛ÷ÃãÃçÃçöï‡Ë_>üwû¯åñ¿Úÿÿ~üãŸÚÿÒ©ûÂ÷ƒ¦ýùûùgcDû¯âö³ûü·ÃÿütüG7ãu¹~3¿ÿ,jQÓmcdé‡ëkŠóŸ~ûÇá— üVQ•¥> ­Ú¿-ÿÿ¿‡¿¶ \§/NÂTÚsZŸ—ª›£uuåp¥óŸPóǘ]é"âì罇Œ’{ö ¬y‘,š(Gp?ÊTEÌ>ï=<`úƳ=àZª ˆLF·é£œ@ÝÔ1gïö.ýñÂɃžnSöPšºMþº(ªˆ§{Þ{p¸ô§ 'yºZ(SúÞÍcvYG$ÞËÞcI_ÇìAø¦ Ä‘¾:ª¤Kó€Ï{%}³=`Sõ,Nê úmþGP"¢òvÙ{xÀô<˜ý³Ï,x+—O:;O í¼ª>«î•êæmÍÌëïúT×űªº¦…èåÓêX•7k¶ÿäÛ¡ý²MË<Åí[êau¿FûýþwÙ=v´Ÿƒ5D÷Œµ“ö[õÃ,õã¿Þÿä¶p8@öþëá—O­5S¿þµ=“ ¨Ï?¾~?´oôóy­æøõ/Çÿ( ©þpüú÷ƒ(N•ukùwß;Ï#åIÉZȲxòœGôI«‹Kâm>#5ÜA×)Ï#-øuÕàî™÷—g¦¼z&Á›- ÑðÕ1PàlŽ]Ãcq캶€¢/˜òñkKõóÐVèa®hyK‡ºRÊ~Yõé¼ls:oï Ž|€#áÈ;8ò«ÿl îM b¶šxF£‘GV0"!ŽJˆ!x¶½Q‰làl˜ÊrÀS°Nɵeƒ‚Ñ`ŒJŒxpDU!×p¶åI=¤c„ã1ƒÚ)-$bPÕ¸f³Mµü2õ=„µñ‡µ€³9žÁ(‹e*FÙÅÙPfP™ …DLÚ\=A/Ĥ ´ÈZäVG2“ŽD ‰TSï”A1¨äðÙ`é„%Ü—>¶Í‘Ì 6A iØæåØã}à¡0еC‡oŠáæØAfž™ÝeZ0ÏYaªªÂÀLÀ qðˆÇÀá+Ìf ¡â>r`Kl±5?-ËëQC)”*Ddy éƒx(ñ³÷n #a5?L%LˆÈN1>ëÒzôPJ¸ÕÌÔfñ*I}o#©X¦’ÌÔR3µÖ•4ðŽ$3µYG¼J&°·‘dú¤’ÌÔR3µZŽ×6Y—$F2ëÚßÈ뙫Áø4¬«,Ä衤b]Ôý NiÁw1øÎgqBË#¯Äºc|"–"Ç•, 3,àÈòÈœGÖ0’Š¥Ãài!ãPÍ(HV­‹l2–$›kûcÉt‘Œñ‰Íµ²=üåï3*ÍB¥U²®½±È°w‚ãga|"æiÌ(Z,÷˜Qi*­’©íy†½{Ì? ãçgTò1  ’ϲ*igtŸØYço©‡YÔý×,€ömždTÒÎè>±³Îߪf©׈ŸP©[żK<¸×Xî·£Ã!Ö8üF—÷äXÛ4à ¯ÑHÏ~) p}ÁÚòšq7"Ñ :âÎ=2 üðiàÍ2€ì…»ÍÉ LeO¼ŽVð5VŒ)Ä;• ¶¨{QÿìXbÖ#±ƒÉ5q, aîXÇÞÎâÁðs@oçE1¯ƒôØXH$–Æ–‰ºê ³0y w ]›0‡‡·ä  T|¬x„Hžs¤Èá5¼‚?;`àÁ “^Y~¢‹©Ä«ãt7\’òX/ ší¸{.QÆCƒ L ø,M0;ª)`;X±7 0µ™Æ–H”Ð_RnŠÂ”–àê¼vkPüd°0¦L¬uc0cÞŠt<8“h½8PZ œêÍ(xo¿ú‹uuLšª|\gFkD^tuk•bô07eónË$œ®l9 „5P¬bœLÄñf”4‰H²Ö6Y`yŒ‘dý0|mã×ÃÆ¸"˜3ú™ƒv±”Â.Q)å—Œü ë|ÁJaõ¬Q¥¨“VOÞNõ3JJ2ö²‡ÅÅh1îF"ŠZSVYÍè&5P/’ÍzbÖ7£'f hŽÓw,¥mš&S®öjVl™]%p æT±$®Cææq£ÂøýÃF¢-ƒþ:÷ ‹…{-ïòHVû7ºÔ…´˜Sÿ$„"LªAn ìB„‹A@¸˜vÂã êÆ–Aï@å&D±C¬FöÁXø/P~½3ðDˆ_uÿÁï‡/‘έ[È" ‚L"›aUÈÒ >}ŒvI¢!ÆñÂBƒï‡ÊÔ6^LIýÉr»-X”Ž އ£‰ Þ!ø6£Æ0* #±™°Â°ù!l^\ie—=coΡÞï`ºtͦ¶5>þ%]C­8¶8ô \CÙ“˜iˆJL`9;a}ô_ƒlpN$±‡e´ç˜÷Ýd§hÝ P:no<2ÃÎM 9¥Њ zlÑ…0Å#Ä ^]Q7”HæŠÊ x– ¯ÌçCQ ³Áì`ïLª70=Lj°3‹›×º<‡grgdÉÆ­Ôe m‹P\™'l=¡w±ÕSÚêAŸQä2ö9J'ázݸ´.dbP-§Õ¹vz}ƒa©Ÿ¸v[’ê ÔINÅC>M¥¦'*¼Di®+Öѵ`…ïÑ׈êÛmJ‹KeŸ«k×Í<Ê”Þg…qß”xLå×ÑU¨‹SÔÍø9 `ô¾<ŠóðÙy3Yð:Ó©

    A"ÄÖ*›É²´1šÑ•Âú•=Ûã.ʃ0V¡£Ë ,DqÍ>œ‚·˜ <¸9Ã=&Id-L£“äq¡ecQPßSè‰-6Ìjzðey¾4-æuÏ·{nÌýñ‚/»…,ö’å‰à]¿³^‰lw$CŒ±¤ h÷ˆeß•Ö6Ú%íÔÚ¦Ö´VÒ"<ª2«çQÝňD<ª[(ó¨9< >ã0RÂÅ[\ÿtÀ:H¶õ†Å€EÈßM9 ìÔb ÛÂT1ÊÒ¦<T¥lÆs@¤¥8ÄgÎKÝú0›]?çéÂC“(,6†0p·Ð–©ÓCñrü>ÓË|PWÆasˆ÷î–©ª¤ykÙV±dê‚¡hìsNl曆¹²/Uüviótôu&¯æêqUêþƒ%lžn Íg›'Û[‰/õêK,Äo¥n,ù6'`|…²­ÿ3Ò©¶©}¬ ¹zýñãæ[Ör âÂ|KGªlüj(V•ÍD§bÏäOWs™|xÿDÒˆøÔcáÓî3I˜Jéç%–+ Š/f6y×Õ{6òŽ8Û°.Ñ IÚ›Ò–2ûOž´OØÀn€[s ݉Yqo»&ˆâ¨ÕèénºPWÌ 6-'Ã0²m¯t@±µ ^füñV…³*ÌRZØ62‰8GÑ3,A ¤eZ›Z;1º¨îªÂzI) ; É5Qs±»‘û*Φ¨õÊÊĆböcmÌœ™QÊÊ–vªrQÅ–÷éðŠ,"â»$ëB¾Šþâ(NN}àÏ´šMÌf}õŽ;ÄJåئ'îMÝzy[v¹ç»G°ª6ó{ד€êXV›R9:H…³ÅpÅô¸ŒpFÑóȽdi‰R ;ô‰(ÏF>‘hDÀ~ 2zW„În|kÇqOï2䈈ÅÉßvh™/œ«±bÑÈä\bõÀ¡80ÆXÀLÚ低ò2ƒ ¿6v…‹«q0I¡{{£¬®ûž„lí|FA& [ÇôíŽü˜1\GÁÜðÆ±ƒD0PðM±p™jþì8¢ñ›âŒUpo cƼ†noT§{VAˆR´`àlxboÂ?ƒU#Œ; ŸV§Ö¢Ðy=ã â|ð®gôUûN$ŽL¹é#Æ]Ö0+Ƈâ€F ü ±,D×|>˜¥ô~ˆøº-™(Ýy£~ÜÅ\£K9}.ŒˆèÆÂÁÅ©‹ð׉w\ËÅÔþkzV|ØzJ(u³’Aûñ£ô¢œ,iõØ÷Ť”‡­ÐÆøË˜°¦“#ãÄÕAˆ½ùtªâÛXÏt^3% C06ý1¡ÍÔ¼Eìamq¶`— îMOì†aŒ_lI–³kìºÁ]³)G¶Œ ܰΎºì¨scUöm¬Ú‡ÏGõ»àÈî`’ßeNÝM](y_w³ý] ën¶ŸZ51ÏŸXu7/ßR³¨û5úº›íïbXw³ý´¬QØu7/ߪf©׈^w³]ëV);×Ý œÃ»èäë$/„¨ ³‚Ò’¹c @æB‰‘ã8}ÜqÓÛ'ÆÅt_•ÚxT¤Ö{.aw®É˜&´2•­þ0š8ãij%`+› ïqX²ulú4´OdsE€E@ýzA#³2*†ìœ P1Ꚇ´)}![)Ù(ÉÚõlj ©L{£C˜Ä}ézuíèá^º(ëQÈeUÝq•iƒQÀËÇ%¾ÔÀz s u°—Yß F§êÒ5òžP÷dz¨ªÞ;eSj¥¤Uš Ü• ³ÞäP)ŤU.Öt#ì±8fóØlˆ ´TÓ 9ÁkìÃʼ £Zãg°Á âtLaj”¾ê |a vPí0‰ˆ`ê(ƒÚƒ ÊJŠBØŽ Êe€ˆiÌØõâ#L¹Ð½0ÊìãLÞ´Ôˆ{Tƒø21 Ç…ŽËJNÇñ žï?›wÁM'”T÷Ÿü~ø üWœ©Ç ?K9dêK¤¹aA]ßÐ!Á”èÏ ¨®-ü îpp•-¦ömÐqQJtÅϪdØ£ƒ]'l*Ó û 7E‰¨âêJØhƒN®Œ³Í`Œƒ„iæ¸'X·#ý5¬ˆ˜ž›‰_T‹ÕÚ¦ªbq‰• ÆôÙd][ Ê”p6<²|XÎ •!f,šT¶Züºì>О´ÎòŒÆÃU´«+ȬͶš›Œ>…ɇ) ô¨g âä3ª¤ò&øÄŽÝƼB)mÐ-¯½m¡„ÔbÆÂª%h"Ï–C½'X•‚Îó sƒ¨fØÜ5yëM$f¿|àû& dè‘=2¡£h¸¡„Ѧ9pØ!#ÈqÑXüÌ5YõMYL£dÜö)myÓÇ0 ‹™ ÓãyÃöÜñ‘–I4•¨Ñy¥°ÍòÅ+*­Æ¬‰œò&eeÁ^ᔦ€Î+c ÅÁ²zl1X ek‚Y«»š­ñÝyB\Á®¡Õ˜oà—^_ëÇ”e€µ074˼ÖÓÉ+Ñá×Í£>áWÙu“#9¥zBÞç³uàl¸A•ƪI®(½†ŠÒ:Lmfª3ܵãMUÈfª«;rÔ±0€¸Ãì@á7e*ÙœŸÏNM/åCâúûø}ň’f¸~8Ä\1BCnXmÄ;€0ÀÕï152×6׿M/S*‡²°òÒV©ÎVs¹u«D©‡åF”q°Uß²œÕà¬g58«ÁY ÎjðãHªÞï gø(³·Å›b3}éÃâÎvûÒk©«Œ~‘ÐO0,BÇ!’ $Ãba] +üÁnl§ sUŽëVXïÃTÌ>£+.~ø™ pLÀ¡÷1ç³R šPr€®±Ss'ë@¬±‡8ÂpNütÐd& 2Yà‘n²XŸT1‹L ±GR?‡®ãH¬ ’©°t(‰þ1ËëÚk0˜Ñ‡ÕÆÍÛî„!îD¾ÍŒÒÜhM•$’Æ¢*£Æ­|_…­†rØžøNߘá½aÛǯBà½9<½ø~?ƒï«ðý~ûÆ,²DˆÙÈq´À‡ Û±‘4¯§…˜ñz9È3ßnŸGòív¾Ýîø†¦F,Ñ0¾1’“i!…ýÆpÇÝØ6µ‡±D? йÑ#n1WÆÚuƒA욉‹SÌkPc¿aÿŠ/ꘃ>b!‘j¦&£šå@ʬjfU3«š›V5s e¤ቯH™H-ÑsÇñ¡`1áÉXð2 ïšTLPÐ]SöfP†ßµ|éë„$ª¤,¥6ãÎNèldË [ãšZvBg'´[–d'ô+9¡Wœ0°z'tYTãä”­½lí9Ù#–'çQ–[6z²Ñ“žlôLà;ù:$_‡¸©dŸ×!ÑwÊ·¬ÂšPp²ô‡uR?q)oiè©RoËúö¦Dÿá° v˜4ª„}ÚD È¸c*ë wêŒH ²R sÏ'™éFI¤Öâdo<Û0¯ÑcûìjË4ŠŠH~z ‹† †iÙ'ÇŸ Nó ’ŽÑÕ‘\¤õ¡ýC,e `0§áÐxp3Áϲ˜ñbÇ{-I¬;Q%®·+ìÉ›Q~É&‰sŠó俦aš›® àâ QýÆ‚ªÏLý­°À+£Á(£¯‘ žÎ›ô¢xªƒ¹ãu‚–™Y¬×/æyT›ÝSL0„sa¨)â L„hÓ,—0f°FêÐUêL}D‚$¬hqùùBš*æ¾1p£˜sdÍû¬:'Z¬°Åä–Êqùp÷Y™EÒxaí ÆA{A;¢Šò y R t„ð1}c¥-à¢8´ý诃ÁQ<Ö8l8&b ÎÄÇ17wAâØƒdÚcŒIu­Œnð©…í•ú¨µ°ø‡‚e;·?ùZ3ÁÝKSU¶1³³Púeb²±Áë;‰Œï·&v¿˜öNÂçJûú"dBŸ¤˜œ™¾b”Ù–§:H­‹Ñä.:ŸþùðMï0¢)ï?ùýðe’/*(u{°TÖõ§Äd<²¿S¿c<‹GšfŸ‰.IÊ0Ä04r‚=™/Ο¼ ö áSÅ~ûRÌ#8ÑEæz#—tZx¼z¶cرZÔßÊÖê‘‚J['²X‹°ñ|Œ¶ª¡³/‡Wøé¥Ø‚b?hÊuUÅÌFXAªD2‰iCýÄC:ÛèCL×]W­^µI´´†šÂ«èÊwjwd>îEàèAäk8ú1à®%¸Þ?ž ÷gÁíé°v´e]+¦£H4ÂF$¦>Wªˆ!‚˜™´vª”Æš-)¦f °JU¶ 0¸:Ç‘šLÍC"U²®Ñ‘ ä¥pŠŠpmp¦îiXʃqž½@å©hÔãp¥Ò‹@ò:Äh7Tx£VÙ4ÆD|9Npºo+ð©\¸+ôx‡•0Aˆò ÑJ/Ke žÀ¹Ó‹éP‘«ûˆƒ]ÁeGªT¤DMA“HÃl:l ½C¨P¼·é×~ŽVKP/ÕÁêáMh‰gšæÊóqó2hçîIôÒÄë8ú|æÛ0ª{,îâˆ{ObÏ–búLãSÀ'Gt OwÏ[WØ¢iØw-êQöÙÇî¶ÉÔ Lœ›|,Æ…¾ˆ’Yß½[qëmÌŠq ö̾“±oVaîB4¨wp¼7|Ú+:Êd¡“…N<¡ƒÙ†(ÆÌÔ0ãÀLÛ›‹ëòÙfpáõš…ÃÅ0GÚ²h1·¢þ˜u1…ƒÎÆè}ø}ú.މÜèq ½¸ÿeͲÎqÄ)²êºUìè jí`Jq ’N %çHµãÜÞŒ` F‹Rø}‚Å5MA¿RÌ@?…Ñ›Xvae'+ä@%c-ûlCMÊ Õãׄá ä",[câÊɘòžA»Í9ÂñˆÈ¦[àšÍaÓZÂÆE½Z:ñ}$@ûçø£%'e}ûÂÒ«Ÿ¶ÙêTˆ.P÷(¯Ä×óñg@¿°&ó„.@—ׂ+Þ_ Gz¾"O} ð"# ªüŠÖQc žííSÿ¦(c£ˆ~ÛR7+úW¼`O§Ï¦7pD£×x6øLÏG…׫›7´e®ûw»ãëÎ?BØáˆø  „úŸ'³áljDd@a‰žŽIjû«J0¶³õ'–l^ëô*Í©ÂIz·ß”¯âõô¡$ÆJHᤣg´{W:…¥PS¨SÏÝHÀÃ\qy§9ŽŠ°ÏÇχ Jm endstream endobj 3850 0 obj 6926 endobj 3854 0 obj [188 /XYZ 32.2500000 211.250000 0] endobj 3855 0 obj [188 /XYZ 31.5000000 290 0] endobj 3856 0 obj [188 /XYZ 31.5000000 212.750000 0] endobj 3857 0 obj [188 /XYZ 38.2500000 163.250000 0] endobj 3858 0 obj [188 /XYZ 32.2500000 288.500000 0] endobj 3859 0 obj [188 /XYZ 38.2500000 163.250000 0] endobj 3860 0 obj << /Type /Annot /Subtype /Link /Rect [53.2500000 340.250000 102 347 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_module_directive >> endobj 3861 0 obj << /Type /Annot /Subtype /Link /Rect [432.750000 140.750000 473.250000 147.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_carrays >> endobj 3862 0 obj << /Type /Annot /Subtype /Link /Rect [426.750000 305 446.250000 311.750000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.cygwin.com) >> >> endobj 3863 0 obj << /Type /Annot /Subtype /Link /Rect [454.500000 305 474 311.750000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.mingw.org) >> >> endobj 3853 0 obj << /Type /Page /Parent 2 0 R /Contents 3864 0 R /Resources 3866 0 R /Annots 3867 0 R /MediaBox [0 0 595 842] >> endobj 3866 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F1499 1499 0 R /F8 8 0 R >> /XObject << >> >> endobj 3867 0 obj [ 3860 0 R 3861 0 R 3862 0 R 3863 0 R ] endobj 3864 0 obj << /Length 3865 0 R /Filter /FlateDecode >> stream xœí]M¯ã8vÝûWx=@»ÅQ Ðõ ‹…* ‹AAOfƒîA*³ÈßlI~6¥C‹Ç—”ä§i$UõôDRäåý¾çþü¯ßþëø×þøíŽ¿ö~üv(NUYtÿ;žÿûéöº>õ?Vuyüõ÷ÃãÃ×Ã×öÿÿ8t/|ûøïíßþï¨ÿÖþßßúÏö‡îéü ¿*Uµþvù³©Tû·âúçùç;üÇŽÿ88L×/æþß?©Z—¶>/ãÁÔ?ÃgªËÿüõ‡Ÿ» ˆ›Å¸²hÜQYcª±úø¿ÿ}øK;Á0|qj¬R•³UñÌDÊÚëTªvG]4£™.ÿ ¯RŒn ›pôËÚå7Æè&<ºè·Cõ[TŽII`“ÞÆO1zétÂÑ/k—ߘþ€ñè¢ìÔpš"Å&½Ÿbôº0 G¿¬]~cúÆ£‹pSWÝ•UŠ=ºŸâ\aSžïeíâûÒ/üT»þðïäÔõyËlÙÒŒUõ1ã¨ôyšR×G¥[â­œèöy£Ëž{7¸;3Tƒ_V.½)Ê8<1M¹–Œ3ÐT}¾è—ƒ1&ÁѼ /?xU¨„{Y¹ø® T5ýkÌ(x)ÝO€Éó#ðâ‡ï‡Ÿ¿(Ûê¶Ê¿ÿ¥]\7çåïgö]jYl»ßÇï>þKQØêÇï?4'§Ëaý‹ž >ùˆž(ßù ßkS1Ú‡øµÙæòäó÷ödÓJKýG´ ?Âà þŸ4pøDA²ÀïV«¨ãŸàµYH˜æ—õ®º€Oï0ßÃPÞ<ó¥ðªkü¥ø4Á >Á'˜AÁy,Ük|ß9>ÓÀhðLî‚wS¯ù“áºêá‚ þÃ'™>¯ÕNøÏÛƒÐÚ ¼wx4Šcb©×†Ï4§:£‹ò™ÛµIhÍjF€d1¿‚{-{ Œ¨«WäæÚš›gçæX_Ä{€¯Æúy¶ÓïŽgÌK U=@ÌŒÔÀ£á}Ã$‹/4&Y¸|i^“ÿÖjø¼ORÓ¢9ëâ2¥1ƒßõödM—±ñFñ5zÒ3¨©'Ý(u*­«Û‡o'×±ÕúT7Åe»gŒÖ›ºSïX¸ü¤[Ay2í†ßV^ž˜aÑ7«.Ð |Xþžn¯ë9[\ÁAðððIm„Ž˜n>þÒžEE­:p,¢£õ‚"î|>f`7F—þÝ'LÀþ#²(SZøðÑáÛže³+7ÍhW¶Ù¶…Øöà9oNeàMÇw0¾é!­@ ÂÝ ìüžÀh²{ùú|1hMüæëhó)ÖŒÅ-±¼‘¡Š/>Ê\B:Ô+ï ¶‚é_šñ$pm>xÄDñ¸‘x´€ÒX/t'dÕ£æk«fþ!7 oõCe+½bË+Ý …oc|°dFVÉâºúÚõÄhÖõßSŒ¾Ç§ÛÑ^$f/xC‹f,i|p„i¸ü†b½‡0Ø™­Æ£Ø&£Š©ne†oJƒˆñ;à=Ÿ/»(åsD9„Î9"®ÀC!=>ÀOñ¢Ø`åsÊG.¥ ÃÒ=\ fΔ'osÎèè5õì=aA!ìE†3š÷á,¨:lÓ(Ñܱj!4Ò¸´•î†Înyj~FoKÌË^^c”á¨ÝÆä©S'OD²¸AðŽ¢˜˜Âð½øe6sà<1"jy†-"i·Äò–wa®Y¿?ã@ä$£‘C‚9ªŠFí‚t…‚TeËk®©g…ªâä*uï–bXå|yXæ`eš‰°-î´¥ìÀh¾1G)%¢¡ž÷s©E”¹ÕäªÅ}:&¼ù„ÎæZÁ—Ζa– o*ŽÖê ¼ÒO⸠8; Gs2¥3$±j9ÍcF⻵vøp\‘kEÚ¸)ÅÆµr¸N׫0¥Øx¸"ƒ(/µ'¸–×ßPñ¸Æ¨üTFÕ‡La`4\膫yà÷à"¼´!x³260”˜‡€fPD®?~ï®+c*Á§€© ¤哘vœœà°3ÅœFЖY%†tMQ<Á‘‹Ï”úÒG¶x´Lj–ê»±šµ«%3ãÝaˆ™¨Ú‰Ð“]‘(vEbW$V¯H`> 7xr¯)àë[cð¡ xÈVóà=À«ÞÅø.Æw1¾‹ñm‹qü=äC£/)úËâšÀA€Z.´èh^+\AV$×RÏÐð‚Nš Ö8ÞM Ä`N¶bWŒÁF ^5¾‚XžàyðUÏõ=‹ëË®Àä„B,ÍÐ"!Àãre–̓§pSpŠGDª¤‚+}qº ΔH\õÌ‚0u±Ë—2dJ²¤™IâYG‡ŒÊ•žf?gäšÎú»scwn„GÛ»s#|¦Ø¹ñj) O8721vç’ÅšQ¾w?‘Ÿ‰üêgš‰ìºÈ®‹ìºÈ®‹äÖEd³"V¯#TÅॢ¼ðkñÿfÚ,ýL?Ÿ ¸3m£}¦cÍ®ìŠÁ®ìŠAvÅ`ñ<‹õ+nÈ™ äcŠ0f¦¯¯'q^œÓ,^äêc;d­›súãïÿMqªÛiœ;ÿQ)ÕÿT]9t«~òëÁÙ“R®kuý-s7й£ýýþßõùµ£÷¶®ü9ÚŸ´ïܯäü[õÝ(õý;|øCÚkmÕ5W®¼†Ïʤ˜À qÛ[`ŒIŠèÊ€×öT;ˆŒ€Pý‡é´*(Ë@9§CuuZR¥w«,THqïtßÁü*<¿#&èà~ÔÚÛªáÓtF}%SϺ@ú(|ظRû7.À{p n©"Û?‡è¤˜‹ËRr9†,|#ß<-­l¨ _ã*a£Ú€HÞc¡Ò/ØÆg¹ ö7î—–Îjm}™‹]E„ÓE6Xp"a—!aõ¾o=¬©ëùz˜˜9ÞYÀoæxgýúæxûÐ3•ÛŸŒÌñóo™»QÌíWs¼{Í7ÇÛ‡þflŽŸ«¾¥¾Ÿ#ƒ9^]KhR˜ã‰];Jû![Ìx»°{T´M¼, Ô5aî‹ßa|ujž¤ëÒ£J› ÔÊZ-ÆC—i„ÌŒÆäçó}r£ˆ—JòXS'ÃÆú¶Ý«Ù27G¢™y *ÁÄ–OÝœo g:Ãyù £ÅŽR8V˜;2Ÿ¸–óèÊnÎâÚ@€T± Â9ëxGmjÞÞ{/¥.“É x)Ç€2ÆÛ¬÷íÐ…O‰o°–J(2D©GÎÃe¦½¦üX²Vq¦T¶ýü—XUcÕ]UcõDUc­WÝtþ‰_Auù-s7йc¨ jl1QA՘Ɵ£ý‰_Auù­ún”ú~ŽôTÍš= Éò¥Û|Íó‚ ;Lhm+‚YªœI¶ª(¢ 󌓄)& Ül&°‚osñ-ð™o2qÿ¡å2ÝÀ9O® <;?|²æì¹T†[Áò¶˜î¨j*"ýþ®º‡w˜Mwt0+(aL¢~˜ZÛ“µn˜,ÆêÌ• ðšü-e†zQiOrR%ši’ûÂ/Ø–­¶, ?!6òol0>JSûÚüÁÒš@®®Ä?”ÄážM)/³‚€o¿ìž$€²\õ˜D´_eêq$¸ŸpçÈ¶ÉØ,Â×6á>ìkÆ„Ã͸0 üÎ[C-Ñ`úH¼?2Ñ)dÕt½1IÚ±xWTWÐ@h1/Œ­Úo¥[Ûje´¿×iu–lAžQ©o&ÏÓÚ áµðΪäòµL=ÿþÈ’þŠ»Ù¿o¯Žu£·x tq‡¼p÷1â=ì:#ìšV&¹Úî2)þX^)4h#®PïD¦,SÑ6†OìAR̺Ò7ª„ò*îáÛO ÷?õá/?ñò»ß2w£˜Û9ú¼ÆößÈðíOÍhŽ2|÷[õÝ(õýÉóR‰á×W-K\½€V vîŽuý;Åür §Ä¯¸øk•TJ'6 ð¾1úú|%< š2XYiÃܲpÆÂô„b²›SlJÊTD£<©ÈN…3•…/gä&f©‰‘Û—w+Qüd·"êìxËÕ‰;ß5¾ [ÂÎZØN TrckŒ±!ñ ð;R3Ôºª¼=”Å7±:­P'è9ÿ9BÂZ"Ø çÊ—}1õ1²æ˜,ëaTšQüQÝ3qêÀ±ˆ‚±2YaHT³¾\CYD:¿2~Su{ÞætÊ `–"jj©L€ñN•òR¤Í¤÷¾€9ÊÀ`f™‚†ò_¢<Æß“ ·ƒÖÄŽÚOR­l ú[éÜ0+6+Ô/ü§»â c¾ÀôÐþV%Í|sÞîfÈ é´¦ÌƒÃš¬þ€ÑÝ:š(q4Ÿ%íŒ[†Ì#F…ÊÜID6øò*6× ¾%hŠå ‰(âÔG7›¹®Œv˜'† ¥`jJO21Ö*£ðR*·‚ÃFñÂ#D<ÃÏF\kŵ㻠^µ ^A£¬Åq£©¾˜>mÆo'jgCY[°Q}ãŒ'³¹Œçóˆ)È¢˜½h EFÕŽ±WêO IØÚ£{ Ñ´™P8Ó¦;àÂ>+œæü÷>iwRëëÜ©ý©²ÞmìÍ|‘ ?¸UЏô¾D]¸‡ËÌQ$;ÿùË|QB¡}“esí)œ¼ˆî>² ž‰ÓÿqÞQ›šE–²i¾ëϵàQ5*âîšÉÝ2©­³|äSö¤•wVƒ2rˆ\sþFO®ŠÎøw7}ß]5Ú©ÕX O¸gRîXå Àqü䌀k{ÍêÀ6³–í•¥âŸì&<þ±fNÐj)w"Ù¢æÚ=Uˆ(¢!l‡¥½GsL!¦*ˆA&–¨¢YsVëÞL#´¶M%åfˆaBŠrüuö8+‹Æ“YÂyOiQC׃[À~Me]Ú•?KÙX-‚]T}‰tŰaÛlçÀ”[‹øæ«©ñËùðáCf¶xk-;›Fû&˜¿uæ4ßì°%$=»NU€0É3J×âjzà‚fÒH—Ç&d’e¶Ü"YåEc{O˜¿übuRf2B]S#Ô55ïÓÔüOs•÷i¶;é‰àÊšŒËy…6?WÚVv¯:^Žqh'|îMsóƒßßfú‰z°»ö87´%ÉxpS ³µ×Z!™.²Î'ÀõØÞoǦ`THãÆh –EË¢\%üÿ£áøÞå2©o¥®µw¾ Ø€ˆ·„ª¤Äz3aSeLCYd˜ÑvŽpyúxhYùtøbÊÛd7hd$ì@‹0ddË*…ž;¦lŒ’é (<–€_z"±ÆXŒŒ¸ø‰Æ.‚¿0¸¥Œ Ÿ ŒT6Ú üh1Ð8Æá ãRdN‡tKéKVÎת%\ÇTMáâ+IÉêGðfˆ?¶Þòà³U Vèä_:" ‚GHIªƒúŠUá´Ž^ÓLÖ_6w¹1W«©§„òT4æyÞ„µ"|0oŠ6’R&ý*ëmÝb¸”a6Ÿ=Qb„Ôc áÜËåQ¬Xµ(‡‰é‡0^Ø‹ˆ¨ŠºËv¯Ir¯ÉU¸SjÌ(ð½! Êȹ\¢«Dq…ñu’ù`@ᢻœ85öÕÜrÛ¬ÉG4>~ÆvÜ€¢ÀDFp¦êrˆ±±ôÇfüô¾{"«Z¸²i>eÊÊ^ê‚m¬·—*\ã‰KʪÅG`V Œµž+ „™D ÷¯û¢ü5q¡1™P 3gr–Ei5W°o9¡ñÈ›Á½XÚxU~›Î\Ìúdr¢0åÉj“áL¸P’fʺ!Aòæç÷Td>I¶}0†úâÁä\F£˜z– ^Ó4>ýK lÙÇ£SJ•ñ“5X0ù¬”Š.l*™ñÝ¥ÞSˆð0æNåðZLJ_nôusSwa$ÎZ`²0ñ–·[ðªe:÷Ôʦ­ä:ŸÀªñµÁï ¨ŒÆ¿PøÉë§îHôߌHèNšd4 ù‘oªãè#:O›·ãkT¡9“ZËh?DÞ'…ºœ‹ÉnJ‘M›€$ëò–µÜeÕ›¼nqð4V/u ¬‘ZŸ ¥<› ÊH >[=qù²³àb[ [dËBWJ ÂÝâwpiuz÷‹.Õô&³ôç­‘áû½ƒNÇÒøç‡ŽÌ½Ãï`‚ýæÇ Ùº™¾ù—#æJr˜¨=ãÆß T&Ðä Εqµ¥:TVIÏBÂ;\õ`õ7w8mWæÅªS–ït¹›ÎOšÎ"UD™jjcXE®%­ÇNµk™V§ò(ÔÆ0üÙ€„´í²è˚˶í\xó“EpÛ®Uˆ34²gat³Ó‰2¾¨¢ª¹±ÌÂÑÃf.Yœ×è‘E«$/NŠúž/—Û¼1˜je ŸÚSþÃX;²™ùÙ¼Ë ‘ÇŠÉÎÍ^M…Dò*ß]IÓ‰«;Ö¼ñ¯.%›¨…É:ÆkÌ܆2·yŸxW]R´IË „5;cšÙ¬ÙÁ+zU )ìñpvË: …Ë^£Z†2Fr WËïˆæñSÐÒ û¨r1À”0—eã‰MY‡µï»cD( " ò³) Ìísâ$êRuÇT7aB2Èu*©ÚN»S/\ËZ}?åù²Ùûà6~ÒŸ;õà€7ï|ï4è^OjÙìõw{g¶=ùèƒýALÍü½ƒg־ì €ïtt[šÚ߸_jÈè›$‘yã ƒ˜À¶}ýfM= -Ô€,l]hñÚ°+póDüNý0¥wÑšùºÞ‹€ˆÊâÉúE‘—^EoX>²xH?sƒšÄ¥Z•³¥ŠþòMÌk±¼Áue¸¶[éxbmXzáwräB޼tyÞô~Dz¨³ ‰È ã “‚Ìæé`¬¤´ý|¯¶éï¬ÅÊdÉfºag‘À)*Lk”3JW`žÝD}¤M È–oÜ<³“>ñçÕÎû<„ëé¡ÍŒu‹+ú¡ý‹GÓP»Á–>žëJÑ’Cw»>ê}£XˆJd*rö"i‰Eå˜SQ9îLïB îÐÚÔÁ‰º•©6À¢ê³‚ˆ*=JšÒÛÙŒ ¿]QM¤¨Z1i Ot~¤Ò©ag žƒaÙ±Ÿ?ð΃ýU8§c5Y%»NÉé”q§Màn­šBðªÅÒLgð€zÛ{¥àÚ äBkþR¼6ƒéE,ãôAZ²³õ={JK¨´ä^¡TÕH÷[5ÚHôÅO4ZA÷7µo¹Ò†]c’Xb²Þm*ÔÊÌãWÑP81–¹hè}lÜD8KeíLÙÆÙHÔщ_Ïìðòe–ˆ•²M±ï@±¼ÇëE+8 ¾ÒXOò­ Ñ3.ßzkP6Ê e²¢·Y¿¶6…r+KœÆºëf"ö6•@±'ã¯Ë¯ Uyâ,Wžâ‚YÃŽdfP°dïr%¶áy‹Ò£î½t"øžçQ2mŽô×&Epú'ª Ó;Ò*µ›Oaèg°¥öÎ÷zq«ºò¿ŠçQÁ ƒ6¹Ï[ÛÒÿê•Y…ðÜRG—5Á(ç}[6›HþWuY’‹ÂVú¢ðEpæréK²¶DCéŒI œî˜Y˜H¶ÂPÍtÔ³»/•l™ø¨ >é¦<édŸ‹§ï«9õNß±WÁÓMúMžx2´ˆ™gÐŽôX;ê«ÑªS£½'ŽÖ¯ÚÕ9_z­»ë0ë Ï´»ÕÉŒ.~Gêî&æiìuR/|wp§àY©Ñ³Sø~Óû#juÅ%ÈT9³+ö+Pìê{„®œ-.Do¶pÛ w\ñ}ZcŒïC¶•âšÓ¶±O™9Óƒ2¿ -¦øbLrLnÈškS_C%ÝA# ÚtèqðˆV“QI™¤1UNE8?n6Q~)›~€‡”¥ªõ•ŸÆ³ƒ¤MI´/‰ð'aª™Ÿb­°lªÞúU¶ ‘ÜRº£‚î'³ÈGŤ.UµG?1ˆ©ËøãÎwËÚÉ•qt'¯Æ'9ÀËùéÓy€3lWínòÛá[€¹¤áJ—5xd•>ï@5¾+)&-I$y“é¬N(ð8´IÒGH_Ñ‚&^)\V"›¾ÈÈ…GÚD׫aÎ{©û"›`F…™d~¸;²ÖÞ[˜Èœ†Xþ‘ÿ\Q¨“æÁè»òºH²òC2HYÏg¯(g`í"ò®s™îÙnP®ÃóàÜ]ÑBƒ>Ü?ë(sá4E”c0УX4‰æÿäBü_ÇV¦²f~n•ñž©Û‰lž¾\Ò#Ø•ƒäÄ @×ÏbÓbT4¥·WTK Œr„ŸÀÑ-%àhN^ãörCC˜Ž@kRü±‚ô†£¶wò/"jWÐ/”ØHMc" J¨ dÙ`Àjuò”’¨òÙ+£3á8Fctƒœ}šs6æíŽìЂ‘M°(ÂbÒàâ¸#|cVa… €sE`cáµibm>êD7­@¿vÜ­*Ñðùl’ª,£€Šª¦¸k‘.áÜéèQÏ 8ŠÇt ׆Ÿú_ÁÝÁ{ Q|çð­—å;øf1œ"%æ‘»æÚ> ÷ÙÂOðÙcJ¼3‚"žËœÀ}&n-^;Jñѵ•ðüÄäh,>ÐrY=üºw¤;ì2r7ŒÎŸŽI‡©*ÀUáîB+p.¦(æ·˜zñ 2iVï牬°ì‰›%kmúb;'c·°Ë(+÷¢²-0æë²Ú%!–·W²`çû“ýIVyˆ½Éò(¬÷=Xoe:»çô[4CÔåÕd[ w¹¨ FyÚvò.‘÷'/ùDX¶=²€âd–Søžb¾ƒ½B«òý·ÿ´Â2(K¿>ú… õt s*Ô9§î¨í°î.?•8×ñ¤j"Õ¤û"}ꀮÆ'äÆO̧þ7êV0•jò Íc%®L­íKÿ¥(­×1Ø·%p±ªÿôÑö¤Ž!.qŠÓÄg(<|§¿î*êÓošR±wþ{»âaåŸáÞá'4< Lê $v¼pïA„ §»+`è'@ŸÑ½Íodi¡*Ì©ç#wD+-`™fïcî9ê#nzüzøO3‹† endstream endobj 3865 0 obj 7789 endobj 3869 0 obj [189 /XYZ 38.2500000 185.750000 0] endobj 3870 0 obj [189 /XYZ 38.2500000 722 0] endobj 3871 0 obj [189 /XYZ 38.2500000 722 0] endobj 3872 0 obj [189 /XYZ 38.2500000 185.750000 0] endobj 3873 0 obj << /Type /Annot /Subtype /Link /Rect [162.750000 645.500000 240 652.250000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://docs.microsoft.com/en-us/dotnet/framework/interop/default-marshaling-for-arrays) >> >> endobj 3874 0 obj << /Type /Annot /Subtype /Link /Rect [123.750000 136.250000 164.250000 143 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/fixed-statement) >> >> endobj 3868 0 obj << /Type /Page /Parent 2 0 R /Contents 3875 0 R /Resources 3877 0 R /Annots 3878 0 R /MediaBox [0 0 595 842] >> endobj 3877 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1409 1409 0 R /F8 8 0 R >> /XObject << >> >> endobj 3878 0 obj [ 3873 0 R 3874 0 R ] endobj 3875 0 obj << /Length 3876 0 R /Filter /FlateDecode >> stream xœí]K¯Û¸ÞûWx]`‘õйÉM.  ÐEÑE1Ói1˜ švÑ¿_Û’}}%GâçCJöå3É\F|ž÷ãÝ¿ü}ûÏÿnß}øòïíýï¾lŠ]í‹îŸíá×—?°Í®ÿó¶nüöÇo›ïÛï›Ï›Ïûÿ~ßt|ùðçýŸþ·µÛ?íÿýeû׿íøSÿ—áÛ¦6õþ÷_¿·µÙÿ©8ÿ~øù¿6ùÝö·ÃŒ§åúͼþÿLã¼iÛ˜XúûætLsüõßۼ붊«êÂ5[SºrkÚÒnÿóÍÏûNÓ»¶4¦®Êº¸e¡ÚWª÷‹Øv?“)G )MarÓÔñ&?î\*ÆUFž]órËÆuòug~ïÚx“w® ”ÓÕÂÉ5oÖ·&æ³}™>Âäu‘&wíÙâÙ5/·öU ÖÇÿiöào|q;×Êéjáäš7ÛÚ¨ÏöezýÉ›ÂE|¶ÇG{¶xvÅËmЦŠÇm_fq·f/eÆCœÃÎ#q[<¹æÍî¥ðˆÏöbú“»"žÜí<Ö³f×¼\çÛxÜöeöà/}< ¼Ûy$n‹'×¼Y_ø˜Ïöeú“W¦‰7ùqçÑž-ž]ór›ËŠÂm›˜ ±i#Þíq籸ípòÏ!“àt?–µï‡O_7ï>í)Iµýúó~cÝ‚Çß¾~Û”ûÿ9˜ZöDòëOÛß…±Ø~ýeÓìš¶¨¬?î¯)j4bJøÍ‡ãH¹+]g¼<Øœíù8âwÎ6fæ:E wÐÂu0 ºuž¿îoõ¶ 1eîÄì%ñ×—â>—mwÇÝc\ù@ŒÀÙì{4bàl=€¯­Ãœ§™Q¸t#ÖÕƒ"é`ؼüÿUs1î„ê/#~ÓÁí|Y5õ<|.1&%L”3†~r£Û èžU*0Þ,Ž^"îIx®øè FyëŒGQ¬I—Ñ­%JõÚ: í‹Â6uc†…°8L_†äX@~ 6†Lââ€7LÈÐ>ŒÖø’Bƒ))#ƒ12 A8™Jæ P’Á³õŠÕv)D$›eb¢Ê®K¿…“¹#"»4{Õs¨2tß+¦¶Þº2(³ƒ5Ÿ‡Á9!¯CȽA;ì¤½ÅÆïŠ¡U„‘gÖl¼xt™DX'@¥º¹³Ñ ìuI-ö¿˜¤r¥ñPpP%Ø %¥b<>evž]›n0ÒîxãøBIm7X®}3ß„Æß1!x¹ÙJ¨)”%3Bþà‡&½0¶®¸›ME§…ÎO_Ô•£²ÍѽÑ{bỂE­ÿƒ¢8‘kVm9›k2Jž €2Ï‚‘åçK:Œˆ@õ)û‘/B°SQÂX¹|–¼n½]y'kçZÚy\ú@Ù~`hÆš1eiÃzLÝÒx;d“Ùf¯cØÒ‰‰ì?­¸áéù›øæ8WÜ´Íå½ ©$÷c8ó¸U+èܧ “Õp]v»vÍÖ¹vHœæ??L“„3ª^/CIuÃ©!`þˆ¦<MR†”êVì°¬1­PÞd"P)Åz©ÀÂÞ4®‡)!7‹©S`¯£F¸ÙÕH@9kc퀳®PÉúù‚ô2ëç·‘¯7ЗUï9A(¦‹«H& ­ põO’Ÿ˜öfçü€Å®F)J`N<”fà劸ÔayË€€ øè£À…€8­û´Ddá*År"o;™¸üðö†hbወxL1F†Â~âÎe.†ußoÍ{1¦]b›è}dóòèòŒQd4}Ü ²`™jÝhÆXåGéê9D…ÄŸ«ÁjSÖÃ*FË+È!OX7ç>Q#²ûÊJdÌIN™ÅÇcŸºáç*ÌëÑ2>ìbÔµý‚ÞÔv©,ËéæO,–»8jg;ǤBBáàÑ1o*m8± ¾1ü Ì)O*ÉÛè |`¬ê7t¼Ñ ÁÈ»*8C sQ®?7&ja¢¢òXŒ%âØ`*lê„Ìåó{»¦òÉ…ðŒõÅB`õo|®T0*ZRœJ«ó'0|Õ.ü¬L=U* R#å[¹·4öø0¤WÕ®¦+ôiÈ‚\Ñš!ºRÁh8Dypd•x¶€GÍÔ`fl¼Lx > Ap”¹UVéE¥§É=Ž“vÅþ*+„1ŽKbVީ롌EIÙ7‘Dˆ·¯Ó'`tÂÐÅd$K]œW1 +ÌûЧ{›ßsi›X|Ý®,š“ü ƒ”ý÷ªåS5oX¶|$ÝÙRÑ™QH)¶Ò-唡t¿2¶/䑞],óŠ`u?™EéL@ ß HÝ©Oá=!b­ ¡XM“¥Š¥RARÅ£ Ñæ‘uÔAçöîå˜ñË9<€#þ·»Ã„ß6¾ò—?øuóE"∇- ¥®@¥F(ãFMÄ>ñ›/ DHH÷,[’N-OpªðÚÜ/óNØ[î—™Þ5:_j,•LêCÒ߈_›=ÓGt¸Ü|!Äý]´»ãn®<Ö°8›}¿iЈëôš­ç™A»NêàH GÚØ|ÖWfx¿LÄ7cîdRT:lŒ8/vm®EG:°Ü&7JPð¢š.t4ÞØÓÐM;Ð=Ïòþ=êNU!Êàõèí1!Tí=¼NpÊxDÛz? ±8M„ɶ/«ž~·äÿ2Ù* ó¶Tü8D—ÝV#ÿS1N§Uí!Ê‘ ©jbÞSÈÓò<” 0Á€ü-™†œÌ¦U¹I°ßU²}©VýKPD뎇úÃh'u`½íiBŸº¦9B¬ë×fûˆF°îZ2:²ªöì°^áuWa¬ïâ[ÀwjÃïÇb½šÀ‹¡CXz µN ßoaù;…³QÖ|sxùN¥u„Ù°Õ¯ƒïÒkLܵ‹n›ëå_›×à¸Òø=r­9*”ÃHºŽ#Q‹JØL‰e4ÌkÁc‹Ñ;";îuÅJ”¬^ˆFæòªRö£Joâñý¨wm½Á¿™D»«ì¹šÚ'M©DðþÁu°¼/èŠPöÀÒO‰õ±ìiMíiÅ÷“ÿ+;ÿ"øÜxã?Ö€–×à7¶€÷G,Ü[‰_-ĤßkŒ-+[QÖ q«Ù“gÐsïáL7Äw†wÍЀS”UÓl©KB7&ìJµ;»Rp¶B@£´«´!TÕ”© &l¶b, Lé8ÆÀ”ËéJ¨¶îCôÍä3¹ÄL™KåD ùyF·ÔúH髯›öõá‚ô‡¹7at,•ò ÁàoTwã"¤[x;qºúDÖõ×í]W¾í¬¡­ú¶-–bÒŽ‘D^iÎi猥ÃÊb¬À¯ ×°É ´Ú°»»Æ–·ƒ1Û–²ìÁÉ™¿kSüÌC•!zŸ¼M/Np³õiÕTV䦱¯Q4̘ʦºTvSî‘*‚¨kF\܈`ågª¤´CW®YºbC}Háp¢ŠUˆK‡©Âdb/_}%QëfÆÁÀM³vC̲ň{¥±¿«¼>&yy¿æ kS*ÓéÅ#ö©“¸øÏ4!̤ê«ÒrJ÷™®¿u28T"Jðî‰D¦z‘ †o Ämç,°M k7„¡ÊÞX^†4•Z•åÅ$|À‚¸•0U6€¨@I“¸ÀQ>SW:fºÜ Üžaló‹’…h¨ƒjÀѬ@ma&¯Œ){£¢3ª(û¥‡È“(’"/LÝòD8Qõî'fË:_ ÞTäÔÙœÒ*ò†GOiMU?Yü'sÉŠµ÷— ¶lÏ]Ÿq(v" !•L€&vpâu°#;q‘Òªì*Ä“Ø]ŠSŽ™PTìÅ!ø¤ø<nº°Æh"Hã³!è– îÅ;Àëà@ üq(Æ7&d‰!Á¸ƒÃ[p’ý†méV¨' Á?8 ¾F*hصÅÁ2Dئ.©Jà 9DN<)ÞNÝMâÓ¾ô„ÍI5É’j(.¡*ã`š–SÄ‘ÓA^É:\ÖáÄטu¸·¤Ã1÷C­gê’©K¦.oŒº8,m0:©n™?œ8FìK\¸d“€£ømcÚ‹gÃ0 ¬WXZÇ%¨šˆ_ AJ\ —ï[^+˜ÒÿƒÞöòIÞN×áf=-¡¤±¨´vVy$ä‘{É•¬ód'ë<çÙˆÂï‚ç9ÛZ2ÝÉt'ÓÉûɶ–lk™ ‰ÙÖ’m-2D1ܦ$”•¦0f"y$ä‘ÇIUì2™òÝåÛƒ6E•ªSógD½l‰Ir>u‹³ãR`Di3*Suº²LªVºÂTFÂÙÚLU†&’Á-á B²>N¼g’õÏïÃë0–ªÛŠ0Ëmè0Œ_QK-~úsÙº_cÚ·è&¾ U1 ™ç Ú)Ià¨8ã›INT†á<ÔI1¾5„¨J%‹—”x”l\µƒ©‡R 3 ÷<&bDa†d™ùájÂB™‘ÞÌHÛjÈH—/!7.¦imä†çL»BAVÄoxTØIWœW[¼—ªVÍU}š)ÄTd£n?’2yŸ}øÖ÷ZÞdi˜Æ˜S¾œZPîH!Ÿ »ÞT½á¨®ÍŒI]õn$ÏåÜÅ«„è[ï3á2õ©˜Ã† ¢Wò *Èjô/ï‹(Œ ,v¨§+®K¯kµbìs”6¹>ƒ VÐz‘3‰@i_ÚLUc0ùÆ1˜82QˆÒÅâ)ŽäÃqg8^oq6ŽÙ®%ÀZ7¦”¨]%´w„»îï' þW~ÿ ñŸ©'(-Ë jL Q|RÉJd}QQœ‰jÑݧ2!¨gjÍg¼Í¦Ìo3¿Íü6_C+ú‰…6έ'@Õ•(Ÿ‘Ý*½ u«Ø?¼»SˆÆYðU, ‰»R^(æJ§.! Óv7•àÈ…PÅoTw=HÒ-¼’®ð¶¼€´fßÒ£Á:{Òy&¦$ü½LŸzŸm°êͨ븰NôÇß`,ÇŠoæÕ¯^œF+óÃÅÏ£Ësî“èE Ì øîêÌ(U6'ONªäʊä`W8Ó¼ŸÇr{ H…Ì&š¤&ïšt®¾˜« M°Ç\í UAË= sO ^’{æž„òý¼CÁÊ{6ÞŸâA³ûNzÏË»ïrÃìtÔ§O¹aÖûX*–õ¾·¤÷å>†E¦.™ºdꇺ䞙îdº“éNbº“{zH@¹§‡øJrOÜÓCÄÑ•÷Om|]MÂ*ä‘<òÖF²õ7ëIYOÊzÒ-÷“­0™ºdê’©ËŒûÉÖßLw2ÝÉt'1ÝÉÖßlý ‰Ùú›­¿2DWÞÑÙ·~"y$ä‘<‡z/O‰—íÝl]\ÆÚVG]ù3î{ª»®¸âáH/løVdìѾéñkß´è›^´4~×e„_Ìfáy:qçP~P½cá7Üu¯P^ûžGØu‡zõÎÒ¹ñ>Ï\§ ¿…‹~|CˆÂÙúúù×`a-ÜÜ[Ÿ wmoÄ„þ<ñëUT­{M§Âš-0U)4Zê Å9GÓ3-Éq <Û Õqå*¤ø&u¡¤ZYöA:+®°û»ò=1u`ˆj¾*Õ^ÖÜø^èY‰÷ö^ãÖ1}T;&‡òÍ€E Ä#K@‹'|úzßâ{TnŸ ·$ô…—, Æòì¬$öƧ×hFIO‹W1K%51Ô—yÉêÏÁ]Suÿ™ñ-N¶4ÍÚb6rwnÈYó“]Ak‹T}…Ûf 6b¸}DçqØØ€¿9 ¸aŸH<ÂÈØBóLŒ×|SU–dÔ‹ÅÚå(ã*¦ ¸Àå|ÉG€…ªü>¶:àÝイ¦‹&6{éM‹µ±ÓïfŠGÜfe‡Û=b|+Ç&'àÂŒ$(X 5IÙ®@h¯øÛO¡Ï š¼§Ëþ Ý{ B,Q‹ƒ ?ªP4~$˜kákÑhF1Æ_ ¼ˆ( <Äæ UU·Q*Ó>’ˆÌÒû!·dè³ÀñT£¬¬Ñ=CØ7K—”ÏW5òP2$q ÁrÌÐt»œ—Cõ=1€Ä †ñ¨zÈ•e½È.>]·T*‰na‘𢬇êæRˆ1Dè!ÈcÆê“L±«j3S]^ âá©Î*D„®`gH±%R§jEY# RìÛÀ¶çÎý×d¬ãy€Ð5ŸH 6Q|™¤""œ5n€q©¤‘{ åðdܘs«ÚQCž5}7¾0L[±OYY ~0ÃJ@4eÂÀIÀðÑ [a,C"Z^B1ÍvªŸ¹BÌ`cc|M'$Õµjä ›U‰?¿Ï”;ˆÎ‰”ž*Ö=òA™),ØËrj¥>qP²÷à fô+¢®CTB)3¥®2CØW’Õ&Òõmà0‘?ëKá¥lZL€jÕ'Ûº`PdŠ;0.´<ž½ÍÃWå/Š'3؈ì6‹ûÐxÌä!+/Ÿ¢³ËÑõ377âUT5BÖÑo±)a9“p€j-¯s©ÕÕ•½F% 2âþÝQxÈ›rÈ‘1À²K ‚Šõ9„D,…ÙeÂŽ=ûÝž8Všq_7Ü»÷©Ã@`§/l8XAÇ*lÔ úá ë`cC¢*5ܺm&Ü!mÂô]þNálºýr„ÞvpùN¥u„ٰɯÃt]Ž!ô@šÐó[7‡ñ»bØ_†è‰ &JGX‡kÕ-M5aŒ„£Œ;&Àî.kÌ0êL:’r• »¡¼·®¿‘*¸t|¾a ¼T®Z¯Q!YÐÁ‚*ºwCîu_ásk.8?×¥¾ÿµý¾¿6ñV?Oý…×Þ\³ßÓ«Â" ¶¶AdÇp€°3Ìïˆ0ø#`ã3z¢—õàY\¨ ·ëéÈ+¤ÀÁPp£î‰;I,?o?oþÙ “‘ endstream endobj 3876 0 obj 6478 endobj 3880 0 obj [190 /XYZ 32.2500000 508.250000 0] endobj 3881 0 obj [190 /XYZ 31.5000000 509 0] endobj 3882 0 obj << /Type /Annot /Subtype /Link /Rect [379.500000 474.500000 443.250000 481.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_exception_specifications >> endobj 3883 0 obj << /Type /Annot /Subtype /Link /Rect [43.5000000 467 522 481.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_exception >> endobj 3879 0 obj << /Type /Page /Parent 2 0 R /Contents 3884 0 R /Resources 3886 0 R /Annots 3887 0 R /MediaBox [0 0 595 842] >> endobj 3886 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 3887 0 obj [ 3882 0 R 3883 0 R ] endobj 3884 0 obj << /Length 3885 0 R /Filter /FlateDecode >> stream xœí]Ën$¹•Ýë+rm ³ƒd<Á]¥’Y P¨¼0¼0Úã1 ÛpóûÎTF¦$FFðä%ã‘·…n©E%ƒqyßÏŸûí‡ÿý×áçÏßþyøµÿþùÛSqlªâòÏáüõÓû_ØöØÿ|hÚêðëߟ~~<}}úzúï§Ë¾}þïÓOÿ°‡ÿ:ýû×ÃïÿpúåŸú?:ÿÁߟÓœ¾ÿíõ{טÓOÅíûù÷yúÝoÿ8ïx}\˜ÿÿ“i˲+Îǘxô§ëkš×¯ýú§Ÿ/ˆ{Š«Û®-¦tåÁt¥=üßÿ<ýùô€ëöű+iê²)îyPcoO²§ß4õà9¯_2»ùÍ»¢ª’m~9¹4PŒ«MpsÁ›íLÑôà1eè¿mŸ`skâÍëÉÅ¡Òßm`wÉËuWè[Û&‘Ky¹Õ™¯¥ÚüõäâP¹^.Þ]òrkkÒñä·ÝS€ÿô•póóÉñd¼ù±­ûàÏä£ÛósOŠÏIÔ›öRÎ7Åéÿû‹©†º÷jÞoŸ`sç’ úþäâP¹`UhwÉËumÏ®]×¥€›L4ÅYÇO‡9ç“‹Cåz¹ƒÝ¿Æì‚rù 04~>øéûÓÏ/¦,ºƒ©ßÿ|:Ü噯߾Ÿ€R~:+ÎÆ¾ÿéðEá^þóðý¯Oݱ¶Õõˆ—Û¡•¢…+ÏhÅÔð3®¸ò >§‰?µ„Ž»>ƒ¡ó9þLû Z)ñ ˜•/ñ'ppß\á⟃áVâàçÀ³9|Û1î`:ÅïƒÏf0mãx§˜0ÆcX»Ë›~ù~b³É9¤³¡(ðTôȲ¸<ò$L>¼¨)ŽucÚ³~xÛÝÚcÛ¯ð™³r¹8w¬Êú¼Ù;€^lëÓmy,ÝÅ÷¶R¢•ÿFÜsö±ø?üz™ÕÑÙÖ|\©Ew«ˆñû`ˆ2pû .9ð‚ø—MŒ»¾û]Ö³’ûðßàš±8€CpïAÀò!¸uˆ)@2¤€écWù%ŸÜ8ýŤfСŒ hãXƒ'ôZ,—)íj¹tÇ€– ŸCY>ØVa`µÊ‚°HúûɃÿM;ÿ"ø½ñ ÆBÓgh[°ø9®‚Ÿ»U—ñÝCPBL* ‹Â1V¯(D-¦ üxjÌ;1Õ,1lí,o]?gäÝÍÄQî ÜaÜûɱŠð€î‰;Lx?luu¸¸Ë sµ¦ß^›|Ø‚€¦yÏ4Zÿ’[””O —M‹Í*:ø.€>˜qàÝð bk·Œ?máÙðûàkÁo:1ã[uû¼0vÁK.AaØWXˆR²ìõÐÉö¦{ðV&”‰ÕI‘þ(4ÁIEØq&ê@<Ç€€xž…jõ^˜Æ°‹ÓØà â6„´´—K‰DõAÙ±‹Ã+ølŸü„‡µ/—Ûp7,·\^)ŽÊ1 •áxtF—Å/xuQ´6Ùl—‘Û¸2Ì-½Ý?’,¶2ªf•cŽ·fLÔr È3_|?™$’l|1p?¢„ÍG)ã‹ã[Öt(î"¢8bˆP)—Œ*»Òoœ×ZsÔ„sÔ°&¼Ö?3þŒ(¬! xîqvf¦R™©Ç·Dã'²Q»ïs¤LñGáÛÖ8Úªo; 9àÝp&~¾\Oà}§6çÑ̪îÍŒZ!$²Å»a‡âXN-åT~ÆeL˜s1ù~˜«ÂÝJ k¬ëuF*ŃøFà¨Âšƒõê¥Ä-+V¥„J‰]J ÕþóI …õ>¥Ä-;:—”Èùvåy5¯ dV Îcé :lñëݬ€Ÿ”jñgpx¶Ë@¢WƒzƒCúSÀOŒÏ†ã9LtÓ~¦,L§{™Z@aoÖ‰ñsÿ-„£b騚¯úGhžHø½•‹)S.–™‹©M9ÍÅòØI®Z5¤+º²Ç•MF¼sö?+«2óäìCP6nÏo×Ù¿]eÌ*N:QRÕWw§½°c¯©ÊoL`›¹ßkγŸ_((>À Ä«ªúDkí™$úaÙQε<® §ñUJtÅ  (Ä;\Ä(ï‘í×€ÙNÚ–«nÙ8Ÿ" 'u?Φ/?¢µ_«až …VÝZ_h=[tH©„”í®5_S\@E\8Í–°HdZÅtyšUùžhÍ¢½üfµ›÷kž?ÎN*Ú÷¿ùÛÓ·€´J#æ^Ïàa>¸u×¤ÂÆÏß¹·$:7'0¦äáXÁã´®£bxSÆÜ4/xŲÌÀðÑci0üê<´·šñ>ñ°½lû>°ïDàü\BÆXgÏÀsÆç% L›ÌE}Ä0ŘxîR“WD<áLÑ«°jÑýhÅ]ö¦[Ä$q?H5yJW««¬/S ¼Íà s· ï² Ž²µ´•m…}^wZóŸ*ù—J—_¾t>I ÖÒg«·îså0u'ðj‰[k4[7ئK¨ì(WWÇUw\[,Slñ’¨€í#Ò@yñ^G+°—RÄmƮϙ/ð&¡”"ªsžŒÚ‹·L¶ ö&»»¯š 2éûS ¥¼pL]‡Ø4‚u¡v¥Oª<ç3R4{ SA/™! L¸þŒÅ'xÏù?ƒaðÞÕ'xjüœ—Ô¬¸­;ÿ~çkíö§2 ‰NN2Ñé)U/áÍtµñn†âD¤…êÍØŒ I;à}Ù¾1™;¦*“S|A+ý›ÇÉ1på3\tz*Ošã[Ö>åäªxZMÆÍ|1YAzULîLZ%á¦ð"Ú.“:Ò”ÐËà¢ì ÄVÙv0LŠSó 2žB$ßuqS+[Ðd©ŒeáX`.pmÉÑâ`ñÞ\#+J—Më_Ÿ°¤:ßco0>ÁÓLÚhÒz60ûD6>SmÙ ªÁ´n|Îݦˆž§·ãTQEä!™.æ¹°kA÷¬)êÆ·b™¨ÄaEùE“𓀜ØÏ«l‘ 'ôœUÿÉ“ ØœÅÇ$8¶•.ì3ÇÉn‰Ã3Æy€¾©‡1O10Ó󻱃镖±ÏÀ³b=0¦ˆáScèÔp7’Ø GÂLO#n¸¾¸›-á >†¼…@ÌÇadÃÀÁ¸ô5¯ƒhßSf’ô­´ì¥,•½({Qöîc^p³8uáY0t–d—­m}NÃTH÷ÊÕ±èÜe/[Ó¨õå É6d“µDöbdpû ô ÆÕÓ—>q›´„ÈŒ¨U@KÖ¾|dŠqíí¬õ\ ÒF¨å²öÃVMÌÀó)ºÍàr3 Àôí °Gxlî–"ƒb± qÒ¥‡”13tD£k©¥ï>:`ç)©Ð’8âc,‹ˆHåš»‚ÌžLÁ1m­„è–õÛ„b³±õ¤ØÜGÓæÇa¬¼ù™ òË–øgSM5 kYXÇ/7’O¹Ø4δJ35-&Ë ¡”ž\[ûNYG °ÂœeèfTÙMÒY€•ÝÀ˜J>a'‚lË?YñÄ´dĘ͌óÃwª†Ë qÀP&ž©Î D£ÝÇ:©pòü¾‹º€Õ•/¦jyÓóù ù€ç]þD•eìmáªN›ê!¶°s"iSa=雨›KÑßR9Œ]Æè•T¼?¢ÃÒ {$ËÊé5¬%0… y xþÓL½dÂ?XôÉæòò¯‘Á]V·“÷@i²iÏð9yOPÅi_IÜøWÔ—D¥0RX>r¤lÃTez’,-JË;0d‰ Jjšl õN„Ÿ¿}L ?£Câ,¬›0S\$ôbS\ÏYÜÃ"L”[·3ëÜhþ\n¸µ4sJ9S ì|Ý÷Ó×ù Ï(ý»ÚG2™Ì$`Ø*)[²’líZ„Fž¤|/I’yR7jSûòmg¡½Ý†Â2wäߨÞ#ë®…€dlÌlWŒ0å¾Ïà:l›$`×Ü«H‚– ¦¬!uë‹¥Ëjbi'bPUêªØlB±ÉÕgF8ó.íè¤Õº´âªªõø¡N CŽÉÊ—œ¡÷Lé'EùòrÕ‰sóP^ eÔm!sƒN8?YNXyÝžnbŒ±¾øƒ}3™¥Þ¡°çªÉ0Ž´øcvBaÌˇQkîðN&n&}AGSÜL„— êØ7}˜ê‘Êy¢ ™R¬ü„8*ÿ8l€‰–‚I’'Rú(ûæíï,×|&ý—iòX²yæj*¤v^¯QïIÝèTëÆÌlÿ–xR:å¸]<¢š8#v[üèÑB–)ûÜÕ/6÷ ݇-ßö½Þg…TWÚÙæ…šÍctCe£6ˆlíÔÒ €cTJ3¥˜ê“ˆ>;"¬—/zJì,µÆ¨›æ@šv¾ŸF$¤Èh«„Q ™­±†ß—LŸ×x„”ŠÓªÌòµT-3êK…Þîüx½º¤­êŒïv[°Öÿ&|Þn„iF½'ÒtƉš€R]¥äœ=! Hl1y«j¯ª½ªöjSÔ¾4xhsµiœÏ*¡-cÐÆXTêPýˆ4Ã^³Î`º×î*2¥M¢ÈD7VªÆ+mh]fžÒòÜ–5fla<½5 h~h²8ÒÝ@“ÅÁõølÓš`£ ŸC wlЕÄnØpÄb¿€JDÀ Å·wcÔ˜Üà-LdF]‚0pðN,aV´G™™$.Ø++e<Êx”ñŒßƼáf±ðY0t–d¤óupFSÜÔˆ™ÕSVsbÇÊE>XÓ||©8ªÄ<˜ ä/üÇáScªÄÏÁžx•«…ÊU•«rH©$H%ƒ!ðîð·í†©>o,` _2ÊwWOK0]Ñ]Ñ•;V(Þ‰u)¡Î&*ß'Àš&ô`e¨Ãv’Xí ™Ó”wÜ£Ú”ª-OhËjS>Åð8¾Z¥ú¾)ÆoãÕæÏkównò½uEWtEWtåNY > iFFIéŒ] ö銮芮laE%%))±oñ•àÏ`Ë¿¾æ9ØÎ£˜(rõ5é-W¹5‚'òK¸=QÁÄä,ú2#ºñû0ù”eü%SWÉ .ˆ(À‚õ‰T¥_İV YØTÃÁÃöÞ‘Ö©˜Lo WLU÷ |]´NwtmÀ?¢Ö2PÌ‹GŸe´IK;­ýXìQÇñìÓ'üÙëyXŸ$¢ TôkŸ2Þ£ëîѽ5Àå@„ kØxv”`òJdóW{êq"¥9}…eu›Ä®ôœžñ Æ$¦ÃaÉ ç£)Õ¦ Ú¦™¦M¥ZŽj‰lÈ@n%“A‰5Ê*^w®ˆÎRLg@¥ô$”ÞÝU颔²ñ›™°LŸ6i3`!âScJÇXŽ!Êt!Å·yšò|£2•òñ€†€ÏFXð˜?òUñ ˜¦Òs zv×ê#¥g¥ç°´g¼åT<^=[æ(Õ]ùôÊQ8Ž‚utÅòXÞÜ• «XÀ O°^±Ô”-Q&’KÈ@*ÆKЦò€$< 3ÊRIºÅ=XŽ©©ÄµøÔ:Ø÷®ôœ‚žk3ƒj•ž…é[¼”De4„©©TJ¹(ÐjX2 ÄZ5öà2~ZB:òÐLyÍ´rDާÒLfö‰—Q·«ëHΞku[OÂW³Æ‹ÕgŸlpÕñ¾½õUz ^žQco¬Æ•çay6¿¾Rz J/5®«”>Ë—÷Þkþi¢æBõ5î®ÞŽ.«·#„±{ã·{òÞLt£io#ب>¢CÞË "G5’É6þy~C¦ 3‘þ@¦•-¦­<ÜRAbÓÚP Ħw*FS²öÖyô'Göø™ÿÌA_#†!bdУ(Ð6‰hhÛÑ ÷kÂG’í^DtIÒ¾ZïVDûj-,±›ÒzÔ«2Ie’ì îN™I é[ŠŽ™iI«kü¿£cy 2'š×â‹3r3‹Qr²©Ç5)ý~ý qS¢¸v-îê—Iõç„§@–黸.Ú#ûˆÆ)ç?Ÿò¹fò¶­–¦·O|Ã%E´2Ø€Ê.Œ‰”B2>6 Å,CTö}˜ÛžÄÈ=X$êÀˆK`1Ðѳ"FF,/qvÊä{C,ƒ¼¼yoÐŽk¬ÿDÃ>õ- n=èR?Ld›4¸Á<ã”ÆlEVýžR‹ã˜;¤ÆÉ——s§eÎú|€ñS2I h$Ñ´Hîp]7NÓIóžI)HxS>¤b<¨"Àa “Ù€"vøîÚÊ6³å|€òqäS>‘Ê™„'¨F#À‰ã뼪ьq"lZã¼'¸½}™Ïèr0“,ÕhHR,|£I Ï Q0ó󰧆qgF¨ìØ&Á&^±<úò…ò߇MbжT£df¸¡6³åòÃÙ)oíÀÅ#a–ÄX=Lf¿I€ Àíñ]a%‡qÅSÎ_xgf …ÉYŒ|˦Œù' ¡$áü 0¬LýÆH;¹´ª!Ì Ã/WÌñ}\êôuøqbAòuêf0™vÔ•iܱ0gÖáÖŸ¡×|Æ w¡öf#.4`ö5z¨ÕÕ¾.Ó{Ú;®b xFÏqSH3v¶—þM‡yÚõ¢•¾ ;¬é_}ð‚=Ò`zÁú×Èk¼üLOÜ&êÕ›7´eîüóéÄד°Ã+,†Fg„žïÖgOå¡üâ¡Í0Nlü§¸_¬,ÞuóMáŽ=×ø€X÷Ây§ÔO²Æ¯‡¯Oÿ7 ±1 endstream endobj 3885 0 obj 6906 endobj 3889 0 obj [191 /XYZ 38.2500000 785 0] endobj 3890 0 obj [191 /XYZ 38.2500000 785 0] endobj 3888 0 obj << /Type /Page /Parent 2 0 R /Contents 3891 0 R /Resources 3893 0 R /Annots 3894 0 R /MediaBox [0 0 595 842] >> endobj 3893 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F8 8 0 R /F9 9 0 R /F1409 1409 0 R >> /XObject << >> >> endobj 3894 0 obj [ ] endobj 3891 0 obj << /Length 3892 0 R /Filter /FlateDecode >> stream xœí]KoܺÞϯ˜uLøÒ ( $±] ‹FtQtQäö¶¸h.êÞEÿ~eK²=Ò|GÒ'’’f#Ç´(ò¼_<üøÇ¯?þó·ãÇ/_ÿsüÞ~~ùzP§"SÍŸãóׇ÷?0å©ýþX”ÙñûÃÓñéðxx¬ÿ}:4|ýòçú»ÿÍñOõß_Žý[ýßÚ_zþ…‡Bõç¿_>«B×ß©×ÏçŸÿëð—ß}ž±{]»˜óÿÐeærý¼Œ‘W?ºmꗯ߾ÿzøØ`Þ[l¡*cŽÚYwÔ•3Çÿþãðsý‚nzuªœÖEî µäE…yySUµ©Ô1+ïyùò3»ö?¹V™ 6y³rß@Ѷþ”&÷ˆY­MÑ€ÇU.ô_§Úܨp“¿¬Ü;TZÜ ³ûDn^4²6ü_§0y©Âñm³rïPé‹g÷‰Ü2Ë[éœû6}€É«¼ H9Ï+÷•¹xvÈ5Êè@V@îÛôào¬ ǹÍʽC¥E®0»OäÚ¢c­úoøá8×dyrŠÞò •¹xvŸÈ-òÎâÉBpîÛô&¯TÍʽC¥Cî`öÇ9³à¥4?îÜ“ðàço‡µ_¿ý\¯¬yáËÇ·“?<[ø®þßOÇß+¥ïþpüöËA×+ÌMÖ¬olD/#ÙÉäÍÐëˆqóŸÑŸà3|¦lž±§Z/ïGl96õ€ž±ÎöŽÀÙL;›>e•=[µÖ/#ùÉê—GÞX¸êÏp6…FZÜ«©4©¢Ga t5†û}3’ŸÊJ=Mn>óµÜÁ÷Tp?‹Wf ‹fsÍ~ª dj5œÏ¸$ÌÕ Ìçù<%lÒ¦»ö=8§v@òKœS3Ì ãe·˜ìå•e·Êw0p¤Áƒ;9[œƒÐ5L`Oõwç"S5"³ì£ùÂ$ƒ_Õp%-}M™Õ|yÅa³¶)ųUè¼Xý¹¿XâÅöxIÔK¸‚n°l±Ÿõ±GðlÂ28[×ß3ƒñ‹[©RÛ Ö”úŒÛí|pQ„q‡Àeº«N¶}hÂ~Þ)#0¢ÅdæÐˆ»÷%?µSH„Ù³Õµì9·«S#͇ÖÓ¥‘ èŽ88›%V€W ×ÖbxÖ3:-KÎ[ÜÆÏ< ó ®Cc¯Â ãÏf0Nïà~ ¬,|³ÁU[o¶¿lÁhUæ£ WÐP„D3 àlÌ~°€e, ,z…ÙlOWRæÈ`’‡éV#¡cP{¨_ÓŒ2°¢h„Õ³¦Êúœ¾‘P¼ÙÌövMÂtoKðW }ʯ¡«ÖRw˜¢OR/!8Ý-X»>ÜÄXJoCp ñlXÁalÄ’Ôo‘unÏ”µ &ƒ9Æ÷»™-¬ ÏmÙc8Jln*h¦3rKwÊ€ÇÎ^1›ÆŽÏ=|v a-À ºD: »QXûb§ŒpLG]ɀЍ¬ú|Ñ&‚[h5•ê«EÛ!ŠAòÍ«)ëîZ¡š÷Sl‘ü a„öØ8‚yÍ.JÄÏà÷¶±Í€±2#¬ŠÕ>60”¯Ÿˆƒ ¦Âêþs¬ÐùV|ÔK4‹ßƒ! Q*0¥×H¹ð &·A&í.¸‹Õ„ç´êT‰i󠪱SÕoº(¸-ËÞ¦‡Î.Îf`ÚfB‘X”2ɹ©1Lž[ÉrW)Ó§|lz2†96q5áRaç$Í-¦¨z¢¼a,)ñ–”o,äOJ+ù÷.(ª tœCi†µ"¨R<ýŒ}­¹ïï˜IrÇsˆu3Ý×t3¶Ä¤¯þ',L/añèebë”6æSy㮯[N¾¤ú Ó8^#B'¯q„ ®MP±8ú†•/^5†ŽŠAè8b6l€àª$cá:£‰—ðse±p\4ÓŒÔLZµ¹½w¢fŪV6ïû„‘bª8b…­(Ï꫽OÓ5äê•›.í[21KuþÊ×0_…eŽ )¡†dΘaÙ†‹îà3X÷†Ö=cû‰ƒáªÇ0Ô¸¬R°|°žÆPÄÇšŽál™bzÁ±Ð*³8,DX>;2]Ú¦ªlĺ˜·TÆ+­s}{d Š2ºÇÖ&xwXàjH}Â{È›1zÞ bbËæãÜ€GR\ ÅDÿ6ÅDÚÙe\ q½Do×F©Vò–¤˜‘0Y¶ÄöH#i$ÜØˆÃQªH‡Œoç@÷>ã#¢æ µx,ý.àúp˜K˜h%žmËt À ÂAø ÖOáÈA!>HÄlá÷|†#u%á,Ž„ÆÄpe»·z«à«Õ¦ƒŒ~â‘ Äú \Ͱׂ%¤‡í,ى̄_}$1§„äDgíg3r#%¹%•Š1³¿.ïª „Ó@ד)3ºÊ7ð:“MØÆi«ìõ2µõeûµÕ¿¥ MĬõê^[?[—e]Ì3ªÄ­Æ}/ëé(™gæœ`uvRýÛ ™F¸[ÔêýÂ6Ý"V'Y¾·ýjØ‚5ñ›ÞXeNÛ=¯} ·q;[¡²óíÎR;X¹0Æ¢.f¼ìÊaEΔB5Š!*˜ÌáÃM(åÂ,*»fšp` †,C—ë»'†0t—I"l„.]@—ÔÈöÛ&]zSRr?£¹Ÿk¢áOÌCEnðLLG®(µ÷·Ž¸k¥Ý÷pŽq<ð˜›U°qŒm}¦9r`Ÿ‚ñeýÞ…·Óc(Ë.Äb°„Å2‘h B¿0e„•uCe1^›U L0•)EÀE§©Lj'sS|š9HϤF"æöÜÈ!ŠÅT©®X—þR шÈS¨ê÷¨ª QüW¶Â›qèÒLhKHÜÎ7m´0~†ÁÇ gbpãµEúnF?¯écŽ­ú-AñwÙÈYãò{Ø©¬! ×Y³~žËXY(†›Â_¶ÓÄxM½¼sr½Üã/l½tƒ sÁ pº¼M-¹›¨,bî…^)»§›…ʦ2Ëë=Í~«\¶X{„7HdaTz¾¬ÑëÝŒÑnÅb®éÆ;Å¥YX¸0´3ý qê®Nf±!ê C^jtO) ª×u®.©ñ{HÈ2׺19XpÁý¼»‹#%¨“$A2”íEà‡²pEsçרö¡ #[´7¦×%DÌð•¹s*¼äo­~èWh£#_Ðçt»<Ú ?ð=nø€5>®3ïÓØðe6ø žƒWmë°ŸõKU¸ Å륫´*–TiÇÂc,l 8‰WÑk´ÖKp²:¬„6'[ÉÊlSVĤ17Þ¾pýF²ëÓòM]žjt^.  j$]½˜.\¹övjK¯­2:]¸*b.]¸š*ä¯PŠE¼pÕ貫±\¿vºâQ¤¤t2 ­ÆtÅãæ¯x4FÅn@ºÏk!£âÄ줕§1ù¢Xó•iªMçgVÏŽÄä «b÷¥06[Ô—ÂGÇ¡¬©éaªVfT{)/•F®íüó6rÜÎ,Éqï“–S—W)ò˜bÒ~®­&tËñß­×9=ß¶KMwm—·&9OîS>Ō׺Ûà¥PL Ç ?ª”ʇš‹Ö<•(~ú]b3…;¸qÞÏçÉÌ©™)8K*¶€ YÆVë·s=7g¡å'.#ÄK"8iFwVÁdÅ;pnþꥤœév9ý.ÇñZ?Æ=ñãP`² ÚGSßÓ¯Üd»`D…¤Lew›øõÕׯm  Bt– ˜÷qäEvöU Y¯·i Pêšuz±™âoˆ>4’ß>Å{C*Á4G­ívŽtxµ’@̶Ń(»2éËЭ‹\eúü•ËtuÁCØãL‚üÄÌàõv ÊX ÌJ¿ârΉ›± ¤c£lG¯, ›3õÏdˆ&µ,¤|qb7Ž ² 91JBelI­±6ÆÅek#ô|ëŒ×÷Dám×ç|'ln€ƒ3m&s0¥ƒ¼Òf` Y>Æ#™Ú§hÕE¹§ˆ/1\¿á×H÷ê-0•ÂJ˜¼Ì’õpVe4]öø ‰Íˆ³b—Ù¯¢ô6`2ðA¹5Cæk…˜mxöo¢ë† Gu-µnÐTÓªèëd«qù¨ •\‰^}¢ÇÖƒP:ì€eà<gãú[à:%&¢€S#‚Ë?~Eõ®Lœhñîâ•âÚA‹ñû»K«ÔV¥–âq£[k)R¼uæî›؊ͳLͨ9’Xnc-Àdgd6°é‹u.Þ SÓ¶«ì=ïÐ亼3/߬ŠX± ¿Ö sTŒ8$ БöòR'©³eŒ¹`–ªLb1 ¸©œíaÑsêªîcU¨2õÎòˆÁ !ÇÊô•àžª³üfWR#Ê¿©Sì[ ðû²Z˜ƒ*ÌAŽH-®§?ÛŠ À%-mä¨z5 R3˜Ûk²þÏÚ…E.0 \î™—+1Е’â…‘Œ¹!§ˆÎ”áÍ(—éuÙ$”§°‡Œsdǯ]â÷–paÈúQáÑŽŒµ9kåË›g9k^|STy_œÍ®Wùu•äÍ Gâ >оº_w;ò“òü‰USI Æä¥ÒÑ}?6 s‚hW§þ„I0¹á&JÄgÂb‰ø=ƒ=*®ƒ–½U§”‘êð3t9Š ëwD+6+´§­Ûmq¥…íf[Ô 9q~#-Ïf±½à(á"–éG,Ïz»§üƒ™›l älÕò‘î…ŽsÒ¹=‡øN…¥¼Ðíå…fU;ïsAOªö9füõÏmÝÛ…ÐÀê–Ü•W.‡,^k\ïøƒpÒ…ª lÞá÷Dª ¦' ‡>kó¤Þ“zŸ¥Þoî :k]Ÿc]VQ¼ÞoÜÒû%¥¹ádÓŒ`Jì–£+ÌÆpU^>Ü›ÊÀwDjé9ƒ‰³™žíTŽq=ˆ0¬'º3Gí¨kFV,qmc³w:*R¥“×_¿ .“ ™‘ÂÒ1’{”ŠQ$ˆº{_ü8~Ïc©Æ}|Чêt±Ï…=¦“^>ïˆý'ì‰\Ù-ÈÂý£Ÿ#Ò¥®Æá‹¡¸KZ¨ûÛ˜^ˆÈ³jì£ ÍPð{pœ‚ÀvjÇ"Q/ÓŽ…Š¿áx"æíí·}Ù®ì´åÙIìRÓí ëÀ¬Hn’ƒñäà>åSÌ»îˬóõ—Þu_Ÿê%‰+~û… Á‹òÒv¬¶'¥Ÿë¸ŽÆu°×ÈGl9 ¸àº7TfN¦‰.¨9Ž´P0§¶Žì•iäqê;ô;I½´¶‡v§ƒR¶6L‚OF¹·%)¸XÝn}°ÁVÈà 2h^؆ƳÁgÚ(ŒžµõâlY‚{þ¾^q·ò{;<IÀ`8`¸C$`á ðl­b»^ùÔ#›ašÐ8¿¸£Í"ÌÊžZ©qF8†ò.†4*‡ÿPo@ endstream endobj 3892 0 obj 4656 endobj 3896 0 obj [192 /XYZ 38.2500000 238.250000 0] endobj 3897 0 obj [192 /XYZ 38.2500000 605 0] endobj 3898 0 obj [192 /XYZ 38.2500000 605 0] endobj 3899 0 obj [192 /XYZ 38.2500000 238.250000 0] endobj 3900 0 obj << /Type /Annot /Subtype /Link /Rect [43.5000000 575 520.500000 589.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_exception >> endobj 3895 0 obj << /Type /Page /Parent 2 0 R /Contents 3901 0 R /Resources 3903 0 R /Annots 3904 0 R /MediaBox [0 0 595 842] >> endobj 3903 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 3904 0 obj [ 3900 0 R ] endobj 3901 0 obj << /Length 3902 0 R /Filter /FlateDecode >> stream xœí]KÜÆ¾Ï¯˜sؾ€ €µ+È!€ 99rœÀ°(>äï‡3CÎî’üŠä7Õ=N[°%o‹ý¨ª®®®þªêÝŸ?ÿcÿ¯ß÷ïž>ÿgÿµýýéó.;”yvþgüõÝëØêÐþy_Vùþ믻oûo»O»OÍ¿íÎ|~úkó§ÿííþ/Í¿?ïø{óÃÛ¿tü ¿îJS6¿ÿrú½.Mó§ìòûñçÿÞýíûߎ=võ“yûÿß™ªðΧ11ô·]·Lsúõû×ßvïÎX6Š+mó{ã]óŸÚÛýÿ¹û© ë>;ÔÞ˜²ðevÍ@¥=ŽTåÞØºé)÷ƒN¿”ºÐym³pŸf®Nã #÷®Éܺt-Ê ô¿t¯ß¹kÄ? äg®N•޹¸wEæ:kò3Ê"ù/½‡àí©ß`g®M”–µ¸sMÎzoÎäq#Êÿz]ºAý²²á:?Í\*oqïšÌ­\»±lcÜè“èÒ}ú7D¨Ã1÷4suªtÌŽ+2×›²“~çBп ·¹¼Ë|@É9Î\*-s…Þ5™ë]+ý¶pâ¾t‚þeHæžf®N•޹¸wMæ–yÑž¹&s/Ý ž•áôóÌÕ©Ò1wÐû§%½à©œîêß„ßÙ½ûh|ÖÈ\±ÿòS3¹ó˜§ß¾4DÉ÷ß/èu¹ÿòãþYæžÿ´ÿòóî×fê׊†ôÙiÈ:·íöýiHc¹/ª†ÿÇ¿wjÉì©¥:TuVØ<{ÕòáÔ’œ­ÌÛüÍөż;»g.-ö‰˜ì-«ÎßÌé„éÞÃeÔšãGôV¢ãá7ù©Åu´ŸÕ[AÐ ÎÚ|ßg˜›ÍAJOŠñº -„÷—A È “}âÄbà€+°AÚ˜‡8Øê¸®SfsÆÂ…[°Cr™gØ^é÷°…b[A5_f1Q¼›X`À“0w¦wÆÒí7ÛJ˜g.ƒ½á¹½ŸÒ2‡?NÖThË „„sˆÂ+]âDgŒ3a˪ª-F—cEÙSÐ8‚Å_ÙºoŸ§ZN³É†ŒiiÅ|ì [ ly‚-ïaKZ=7ìé«gB¯Q'5¾Ý@ñŪ++fÓ…?ïM= …*Z ûÓ ë8¬11é;’±î#Ù þ¹Æ¢4½Yǹ_ ˆãL¯{æž‹Mv,xœItŽ“AØå ØÄ(¸þLü‡ÇØÙqåšÚñõãòÉ~¿qðä+à7ÏËÏQ<Žƒ-Ây OXÍ-HEauX–áºmNŒCPÞâHHyTny?½p ÜÝk¼±¾„¨|V—9çzú#9³ôÔð¢Áƾy'ÝÔscÀƒ½ð¦·3¸ºN‹¡^Š"©—¤^’züÙØ Ö-Õ¥É|5[_ QD€Ðc ]æ¾³ ˆ‘A8ÇŠ»?€¾1•ï‰]BèRÙb¾EópýÜ› %(LU¡å§ótÕS’‰"´« ‹q…Þ°”∃HªY{]Ô1€Ác·ÃÛç#–p"¾WØ ³‰óQO{Oû½mchMYØRîK‘-uüÎí~â“á—,üÖ1Ѹ7á…Jõ*غw9|cƒÜöp¥ËAQ‹oºx¥DÔˆÐæƒƒr-Ѐ¹Ïâq„5ÆZÆ´f$^û@Q¯‡x­f)JÄ–04HÃ,y e¸Mak®è’‰1^BÊ;Áœ,ŒF!äRˆÃÒÇX?7?w…½‰g€å€8…ÎÄ;` !41¥Óˆ»ƒq]µ&ÆÜ&îŠw £•öF s#l)F_+[õë÷+?¬q ž5FœãÅèÑ)¿Ix¯³`·‘Ž!ïæ#Õ„ô_Øý8åç{0¸ë™Ü2„:ˆ#ln*9¤B‰•oU#cäÖþP–-{\ëY°Ó„„”Xî0ñàc#¥e’ òÀ$½º½¬Æ‚sÄ@øÚôNÁäË’L¾v%ØBS³¬ú¶¦Q Õ©ö¦Óç!_¢ñŸ;ó6?“à…°¥ÕœùÁù[íÔ²zÑ7Â85üæÌãý í-÷¸Æøu[ÌÈlÚ7Û±y>ÁØ›µ—Ó§ÔªçâàŒíQ· é-C-˜W ¦ÎYq›¢;çРX>7a=Ïpœ®ÒSÔ´nã`G¨³QI ï ð—ÀN“·Dhâù¢5 ³kjÌOË.˜È IL îl+&ƒ«2”ÁÙ1×îÀÕpb]fLZåùebg^Ì,xÉî3bš¹c¹ƒL®êó5/¥¡žÑÀ®»†¸~@6n‰Pndp>^I$ÁIˆž “nïYRM6¯ Xg „Š“Ià>#¿]Ç/UÒ g¥Ð°}à$ Q³µ-{ç}Ù(Ú!hü¦uý/ø!Û Úç©J*ZožXq¤ÚM“jâÄñ×,}[_÷ü“Y²`È‚ñ¾/ ~°Y‹‹¹neD…ëSˆ7Ë 9‹ŠÍ‰û'æÛcÁßý1\µzó“_vŸCIž­ú’ÄîœA…Þšµ’C…î¾c;øö5Ál¿’ÐnBÓÜh(r"È‹Dº×?8²"Tj,ª®Ç%½g³i¬º/»gy)!«…õà|¿ ÂQ5?®»7R.bœÙ$V¥$!LD‚ad(æUag•’|í¦%BO˜ Õ1W—›kòÛâL±L®æµÞ:gPÑõrÈÇ» Y‚™šqX±îb4†4aŒ²PQ\ª/c?'Aá¼f|oª>p}mÝ{ÿš=îÖD”±ªó2 ¾Z¬§1Eˆl5é ½ÐZèn=HevU¥7ÌG"Ó`sßœ‚í ï–X¡À ©xy«ŽT;uÕùj’ÏÿN}þX£ÜgÝPJF‰¬‚ÌݘÊHPçq,¸µW‰-ýeÔˆ÷þ2ïü[+¨!Z™ ¼ªÿrd€/Ä2†“f²üøe&„…©åÁङp!b‘éªVa °â bN™(èõ¥ c ¥TTJ\žl¿J?hMW1‰½.~y½Hf­ØD"Ž Bn‘÷G•¼K ãXWê̺¹(©¨Ÿ©²6Áƒ_…íþ!¼èIf¢1=éK…Ä(Ôouæ{3¢£*.µ¤b!“ r\§Ï {à^ðŒýö/J±øÇÁtóm†õ¨ÇrÀdv_1Þ {;·æ}J¬ÉZR…ëPúwk?¬ªrr>Ôû¡*cqKàID¿lmókxrsZ1鈴t…ày¿½®ˆ)c/yu_{ï6¦°®®ARP-ÉâˆgqÜü¼¸»}f¯‘Ë *Í-!CÄ=“¢Aù]뮉üH¤’ô¥RrnÓ»¼è”H»DâOzyÀ×™1M¤k±þójšòºèﻌ:Ê“ò?kD|fÓ^¨*£0½É/‰ˆb¡0š0ÁYÕà¬ø†:W”ã¡6É “³'«bj, $“©ŸÂðEªš°–Óû*hA“ºw¾¥,éboŒúgÒjÇ*vW(ï)ØçØÒU ½ó ©)WÒÂ%›ð¹[Yß·‹-ùsHø§íß:”‹Üx×. Sõ©Ç¸ßèF@ò •Vòr¶ Q·Ü‚•-Ô­ÊåU*jªÖûà l¡?³ÊÜ·g¡.6…07°Á‰â?DÐ ­ÿÈfW¡×à1ƒ½‚8 ]÷5A7ÄîÛ3ë ìj{˜ë›çúY;ÎÃZ?½3t[ˆK‚À-ˆcÞu…üøÝ¿áo0ª ÎÍão°Ñ‹õ`ÒvÑ´ÝšµPÌwGë¯Áy¯9§\Òi«Ði‘°Q =·"çÜ" ¹OÎEÌÖèm=òdcÓY΂µk”tdB†'(h‚nÌ ˆÂˆÆ´þ«kòëáÿª½©Ç¦i‹Ó4ï•Ö5Ùá ÿ¨·‘–VÜòƒ`ýòoZe9öã9Î5±_“£­íe¯t+­xš#KËàÒœ…½=ÁØ[ÿ}ÄÔn,_qpæ,l}m?6ë÷°· µèÒÀ`êœõ™)ºgš94(–ÏMXÏ3§†ë´Æµ‘h½5yÃ\À³äRGàiIЃwI$Z55ä…M‚¤@à‡T‡.9¤þ2ÖÌlÕù¶<â%ûpc¡»+ŒŽÖ5[£—/¹¹Ý¶Õ³7H­±ºZ¾£nWd›õ?BF, øÌT¹ëÜaŸemØùBà”=KÄfl3RS›²/a„ßR%¸U÷žGiYÕ¼*ñƒÑ<^÷|ɸ?Šl Ÿ[Ó¢èc,Vàãêï6a²„È ä–yûbŽ{aœÁsᦊ•EŒIDù]ÑY_Š!A° AIÑ}` œè²£5Þ3©l[ƒ=ˆ•,B™ ª~fwï™ ï󦚦ÂF£ §¥MP .^†°tæ&¯hjvñU®¿WS‘™{(2R}û²'˜p¾Y®bæö:|rÅ¥|ALMQMׯ՛Ï0»t{ÃáÀ ¯ÕMvò0Y݇¢èÆýQX7'äÍ¢ž¶Î6Úçöx§Q±wF†§K^õŽ—÷“â~f” ›¿}"ÃÍ¥¤ !΀_’«d5ùæ¨4ÓX–Sú8›&TÂæØÙÌ!V»þ)™›707o–sýܪUuiŸJ©•N£=AeuÉ 5 ý•9öâá¹a|ô4{æ5ïö¨ˆXüã`ºyHŒ„Æ8da)pnÅXlü‚’00âþQÅÀ8]nc¬¼jdÝk|Aókÿ­9ÄÓâÓÔ_˜a¥VcG‰k °Ì“Åí/8„v™œg®–#gå™rö`Ϲš²X [ÚW {(%â ² Ì3ÇM9ìÇæö±]é _^k%bãÆ÷Uð.† lE}¬ûrÂY†Á½ÁoZóÔ,Zú«|?¬ÀÿÜÌøíA?F;ÜEÀb:`xF"àà po¦F[§uSz,GX& Nš‚¿ØyçËÌZ­ñF°ó¤ýhõç”îÜÚý¥X\w endstream endobj 3902 0 obj 4880 endobj 3906 0 obj [193 /XYZ 38.2500000 665.750000 0] endobj 3907 0 obj [193 /XYZ 38.2500000 665.750000 0] endobj 3905 0 obj << /Type /Page /Parent 2 0 R /Contents 3908 0 R /Resources 3910 0 R /Annots 3911 0 R /MediaBox [0 0 595 842] >> endobj 3910 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 3911 0 obj [ ] endobj 3908 0 obj << /Length 3909 0 R /Filter /FlateDecode >> stream xœí][ܶ~ß_1Ï2I]¢€½v ô¡€}(úP$M‹  êæ¡¿³;œ]/¥ïÌèÓ!E#±³´¤ÃÃs¿ñÛ?~ÿ÷Ã?;|ûøý?øß¿¨Ž]Sÿ9<ýúæëØþèÿ|èúæðÃ/__>=|:ý÷ËÃùïÿ|úÓÿöð§Ó¿?þú·Óôéé/üòЙîôû¿Ÿ:súSõòûÓÏÿõð—ß~}zãås˜·ÿÿ黺rO`\ùô—‡Ë6Íó¯ß~øõáÛ3æ}Åuu_µS»ú`†Úþû‡ŸN¸¼¾:µ1][wÕ’uöéK]sú’N_5íèCÏ¿t^oô_ÞT§ãŒõò3äêX1®5òÛ·±CwFP7ôðÿòúøo«¡ŽG9Ï«cÅ®ðvÅÃm]wÁ~3Ëñÿúú/olïåÏ«cÅ®ðvÍÃmúêŒ Ûºø¿¼>þû“ÊŠG9O«cår¸£·šó Šh:||ÿùáÛïL] ‡“ªøüÓ ¸ó7Ÿû|BJsøæÉ^°§ÿûñðûª2õŸ~Ž­m. ^[©øLŸ±Äw>•G¸ò­Øf>î¼ÓŸOýLš~É™¬Ž+Kœ°sihÌaÌÚMJc'e´€Æ ~1F,Ĉ@ïbdh`„Ziá¾!eãgnÀ+}7ÿ„îNÅ[YHöÁ4 èÅ}H©«@j¡ÌÎÊámPf ÇX&|ËH¼¹ÎÂ6Ì'˜»ñ ~^g*H¬ °„ƒm>Ìß }ÞL¨©†Æ%ÖTIwwr×ëaf¥‚+P&ÌÃPZaúu˜ƒ lX^RzC±¹K¸šx–<‚,g< | ðm–ЛÞ°¦ÃV:Ö¨„EX3:ÛpXb)ÏXÅØGdèºpýÝÑÁ~8Øa ŽˆØ¤²Æ,Ž5`ŠÇ§Àp !CO”8 ¹ÞbyM¬dâ?& ûw• Þ/–ƒø;ØúÉᛓ²JíÁ¤‹4'%°Hë^ý«è“uõüIS½8¯gCܸ£³½9¡!4eúc?TÏø Û›ºí»¯W|¸¥>Öî\ôºÒ g¼6ï;=ãÙq ÿÐ&œz ÞFøojÌ‚?#€ÔÁgjUüÕ_s!‡¯Vú`ëxƒÂ6ðë‰#õ’|ê‘ R(‚Ïà£È:<"!º^§€…H NDLâ€"Mƒä*>Ýý0¸fäÞ)ı•cãê@; ¬ú.”†¡fž…ÑŸ–o'°ø¨F¸€Ð{iÞŽU4¹.Bg(G,7oG¨ –UÅ¥`\¨ÙªýÁ SìhÛ37Öîí'MulÎ{ÌÄŠ?²æhÛæí|øhÖ3ž4¦žÐ3þ¨Nš 3¡y¨Í±ÜÛCàNÏz¥=:c‚~ÞæÞ´—S\µ/‹À8ˆHf¨šðá§ 8}Ô>ðŠ7(§ðá M<³²óOQø<_o½M¬ø`–±ÇöŒž×Þ/:™X0šh§˜’1Ôøä0/1TåaKàð÷—˜»dÞº‘@Ä&8Ö•·ë½¶ÖaجNFÀ¸À.úûKØÊ}ô ½Š«ŽŸÁžÒèÃŒ5¢j:Q&ážPîðºÞ›úv¿¹¤¤68ƒ1-¥: L)X2Æw¶ 4¦÷ø¢ZÏ€¾îàÅP8žöÇY‡¢}Šq@(:ÁrÀ'‡µVí·»÷LVAÇHÃIà|Ì$LB5Ä®k ã23L#ÕBTYM` ËÁ¸@f ÕF¸ž¯À®\i£[å®[Ñs§µK­cª6 1Šc ¥œµ"„…f%õ±|Qun“ÞÜlj r“ñUu=e»ä—¢Hì”ÅiÙêÅsÀè ¬±«^‘.ãDDÔ`DQ’¬ÿ”qÙÆŽÏÀò˜Q8º!ø;žtæÄ LŸscÛ¹.äÞÒ4¹…¦É˜A³Ê„4±×`VL,w}ˆeF½ëŠùµT³¾#$RR‰÷Ù¥í„l¦ü— %Ÿ;¡²¦ 5¦›!Iq¬„HŸR°X.gØþ¬[ž6Êá–}"²À^à–\ï %Û4/d SH^ú˜æX…])ï ·â{\ìeéQDžÞ¾vÌ„•#Lµ >DüÌ%°åB¯dh%ë"ÑuÁâ¢+ëîPq‚àV×"¸u'Á)ÏÖ+cs¨HÍ´ÞѼõóÄ^‰^ˆ€'O¹³ªÁfÔ‰nÌœÈgªÊ²LÉTêüèm@©ŽhŒf®¢²²8óIä… ™Ëð˜¼0‘{Ÿ-m\(£¨ò^ÌZLþQ#04'q´¾¥žª)÷"Òà ’kÆa²@y±J‹Uš)ïêî”9m"4Äè ¦šeN¡ºÊhãëAÝb³FµY1u¨6ãK˜æƒM`\êI˜ÀØ4…%˜ñ[‚µ£`ŽjŘàñakjÞ¨F{SA$ˆ"ì63Wá6ê XÖ_?äÜ‹Ô.^f>^æÔ3øº*xr / n\½äÊ­ ^WŒÀzìb|Þ~0½`ðÛˆNªgR’2ð~ˆ© Â…’º=Ädab A½†€ ¿MèM`ä ÑéPHŠ|º›žAcWo2”H騙ð3 ü^®žá®L½­KhG´ýuªHdGÔ„Ff4%~¦Á2S9|Æa¹Ž¥c0³Ê0vŠ% ÆšŸÑX„ýÅ@MéP¬«±7ƒO~Ãæ`.u{ÎýË»±#]½IJ¦âˆA½Â)0טgìqì‡jüLþZ3¥ÙwWi9•¥©ÇYß&(-g1 )î§X ’µ@èw&ƒ#œ!ÅÚIeÉä̧E¿_ÓïuÕ^=aFSZŒìƒaZfòNLVÓ%¡wÛçj“̓ßÁ‘>ÌgXà¼Fíu,!\—xD±0ô- &AÈ*¯¡jÉPÑNUþ €ò@ÀõPïÚfÞ-’K‚ H®t’k›~A¡ÑÍÒ(>†Fáw,aƒâ•¤š¥u 4 ¦eÌL~WÐéD ¢†T.øDX2 rFƒ©Æ#7kµNÎ(¶·Kl¡Õ}öâ™K+%š·…€eï$b˺úãÞ,a6yñ3àŸ{£·ýx÷vrT_TÂî§æõ:rÆ3Q­ý^ŸúŠ„Ü*Ÿ)Ç 2¦Ñ{;¹”q˜Æ.‘\NíÖÕ mòé&Á9~Sõ0¶3ÓË‘*ž ÛMBœ‚'ħ@D¨š+¦Ç•èf§èé\[½7…99!cacn cê„U«ÿ˜ÉÉz·‰îñ«tF·uùÔ¯—$«rƒ¤Ì»ñ ©nv¢Ï’iL%>íD2Úâ*hÈÁþ:¯4’xXTi¬«k *ø¬ä&‹Î):'{“s¾¹ÔùVÊu¾×pQ湕Ö,©'.¹•û“iÐcŒ&âç”9‚ÖÕ 80eŽ m.U¥Â$Í”ð æ*<wb[s æ4L™ðm”¾ÇtžÈ^f´`r-f@pOXk;ÇFHuŽ¥ú4oû¥a_yõ1Pl1bi Póû›•/6H¯ªå5©>c!#HXjÉP¦°Al>R›òG¢+I󔢴äú2¯¸Éø[×4Q±°2 À¢t¥KÑ,²ÆPÔ ¿*º£t‰úÕíÕ“¢b{ø™~F?Àz+0ât¯û1Õ¡3 ø·=¡ê‰Ð#uÎðDf¸E‚±_ÃÊ °‚8$¼c*†; ¡1ñlÝpâ ‡qñîvïd¤¤0]&FãÝQéTk¼dŽZf¶£á¬®¥ñmó¼JLx…ä â(­Qk¶uhM*åŸ!N„ ÜΩ”Û„_ÏP›ÒL9§5¨™!´ð˜Œ»prO`ØæËGæöLø!”ò?ƒ6+L;Û‘sgc Èœ¾¨¡ W¯ÆÕ*êŒ9Zh•º ¤__œ0zÔz[Ûμ•±8œŠíæ‘ßspaÒCŸ L×¾ôíå\4Ò$§v.ŽÍ²b@eC~$«¢ë>[hñö´¨u$ôU`Ò¯*!–âx%º‰"T`œ¨*yÝ4Ñ݇oR1wœ#ì5¼õø¡Ê‹£ø¢-wkÏ#–-Ù·Y *)¥µeQ2Š(¿Šãd¹Çñ4¡ïâµ0ðÕ¯(]Á©»'cÆLMÓ‡ª0ÁGÇú77_}êÃwâQå 3BB²Q I FÄûJ/õ¦³WWëMc×H/x–ƒCA(ν›´¥†@D¨t´r8mQGäÎà&Ä^é ®6×\u¨&#·tFv)w^#(0l3:ê2+¨ÊÀÛ-E%Q›x¢hDQÛöfQ›u¼7çðîº"öit±ù‰Ø}‡îfù²…¨ŸNáጹd¸N{t#UÇžQc4Îß1ö8 ?ÍžG?â»v¿ò ¾äz±‡yF–iÜ´®Ÿå‹2Ö¼àóbïû ÑÛüua° ˜0·ö™„žêW:#÷úèþ›?»×QpL¢i´×ׇ]º6“€$LNæF.Ýn=ÁdZëþ×fVÌa=6dJcÅð³þ$¹ýØx:]M«]²ÌH¸ðõ*‰YÆ=՞ʹHe€‹<³Ç5Ô+.ˆûê‡ø±FÓ††Ù~LgBQlÆ„øq'Ñœ/$i¦ ©8¾3ÒRÐÄÔˆjbäɸÞîïºÊ\pº½‰æ öªÚ¡dú3ÊôÇôÛ& 0fæ Ó³FUcÉ3##’ú.H×kt¬s?‰Ie ¦Üs¿Ÿ²Ù¦x‚1›ªP¯Q® 1ªHpFu{I“LËÐ âiÙ«Ë6…âÍÌ)7&J°åwcb ‰ãuïÝKr}É*™¡w¡Ö,]l·<»›.6*: Ú JÙ= áhôSEpºs^UÇÇÝmbÎN9k®3Î=ˆ±¨³¬]€KŠ´·þÍ"Tùþh~*ºf è#G•™°ºÎ›ÑN%K’e&šv‰íA¨2¦Ä—éqÐ V`áMy€º37Ö­\Ç=ºš[µ‡jN‘$aÚèÏœ¬®\Sõg™Ky±ëûªqÁ«£8c*†Æš!• 7cÐ¥mc¤"W‘µtÆ£â„Îoœ«Æ+x>4ΰ5vÉn‹+u3%Q7„Ô_LÀtݹ¡6™Â\1ðLsæ`jƒWàÛ /, K;\—vXvb9ˆi Ë´MRyÑS;ÔS³¨·Â’ ?ƒïÀÀ¡fnº¾ÃìV_Z¼SÝ›j!W°–³ðváí+šé}B]]÷×m!Ì›‹X‡ rC•–‹æ/Òa»ÒÏt£(S•ng–Ä,<ÆÞhC !p×dbÝv d4%׉g({s:>Ì÷Ick[}»€’œZšø:¤ÍË5Xz_½’œnÚè&Ö/È^HÛê%á:ó<óË—§ R·Æ]˜£Ðpy<Ì™q×±HÇÃu#1ÆèƒYÊËáQ„ ½ÁSûÁôÓ%Œš¦‚M¸ ˜0×0vWÃFœ‚Á+Ìn†Þ£,Ó«uv‰y_Fþ—‘ÿ2ýï'œ’qÈÛZLXOáă`-0<qpõ:‚y+CByÛ¼´½1ÚJ!F¢t‰¿C$0á· °a®$=áîå« ]uI²>#ÙUßFYCøTÚI½HƦYŒ+(K)€µ~–ÙÄ~zÁ~¶àå2‹íKŒQæ;DbRÐhŒ6XÝ˸V5¹TcÎísÌz|ÞíxÅ[öè»Ê¾¢¸3Sñßè;îZgÎlßùŽÛãƒüfÖÖ»W²e îéÏÕ딋wx’€ÅxÀ$𑀃à·yÇ~ª-å]@6#:Â4aðð±ç‹{Z|W¹£—oH÷ÍA„xùàåç5Ùyøôð`ìC¥ endstream endobj 3909 0 obj 6164 endobj 3913 0 obj [194 /XYZ 38.2500000 611 0] endobj 3914 0 obj [194 /XYZ 38.2500000 611 0] endobj 3915 0 obj [194 /XYZ 32.2500000 671.750000 0] endobj 3916 0 obj [194 /XYZ 31.5000000 673.250000 0] endobj 3917 0 obj << /Type /Annot /Subtype /Link /Rect [468 625.250000 504.750000 632 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_directors >> endobj 3912 0 obj << /Type /Page /Parent 2 0 R /Contents 3918 0 R /Resources 3920 0 R /Annots 3921 0 R /MediaBox [0 0 595 842] >> endobj 3920 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 3921 0 obj [ 3917 0 R ] endobj 3918 0 obj << /Length 3919 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯Ð9À¶Å‡D ¬Çã90l ‡E7›`±»ˆ³‡üý¨[Ô<¤þJ­O$¥î‘¡E«ŠÅzóÝŸ?ÿ£ø×ïÅ»‡Ïÿ)¾†?>Ê£«ÊîWqúýÝËh /œ¯Š¯¿¾ßŸŸÚÿývè>øüð×öoÿ+tñ—ö¿Ÿ‹þÞþðÇðNÿà׃S®ýó—óŸSíßʧ?O?ÿ÷áo(~;ÍØ/€yýÿ¿SÞgO`L,ýíÐoSÿþõ·Ã»óV1®vÖÊ[¨Æêâ¿ÿ<üÔ.ÐO_«”«­+—,äôi¥Ê·“è¦E{mF Ç™^%˜Ü·¸I6ùòèXQ¦Vòì1‰ë›* Ȥ îóôñ'w¥v 9çyt¬ôÄų}~Á¿“kû3Î|»¬U¾H*3œ)›Ž4¶± (ÿ4} ¶òe:™ÑA+­„Ùc×WáPëv¹ø¯ÒÉ _¶ò4çœ Ž•ž¸xöˆÄõJÕAíññÿ<}‚ÉM™sÎGÇJ ®0ûÑ[£ŒÓ•=úDäÊ{ÝþÝ™ðk!Ò*ß!­²IhÒOŸbrß$œü yt¬ôÍþiÎ,”î'Àù&|øþËáÝGeO7H]|ù©®[óüÇ—)UñÝÉî¨uñåÇâe©ìŸŠ/?šc­«Ä©‘²ß¼Ÿ?›1Ä:~gÓ¶RCØ>Âø Þi…a#fÓ„­ûæñKËŽÉ9©UEyN¢¸âªTpäŽ`®¨ Ø0_b ;ø ^Àý0ü¯¼ 2φG ð=üÒK!‹gƒ¸þ!ÀüG0Þé¹W8§˜ ¿|ÏÁ45øžjòIU_>­ú!㪪™¾÷¢Áƒ€±eL«#…%{2ºº:Ãó|Ì:’ø£oÊ×#Å.tGÆ­é|ÑÏLÑm­:ÖNy÷ꋾ x ³íÕë‘}£;Ø”:V¶>0<šþ`áñ6ŒL¯Ì|̪neú-?àoð:x~Ã`¯3ÄyÙi\¦Ÿãª­Ã Éya¶5ÍpÕp=<2F†â^•Äa¨·>Iý´âÕ´–þk‘Pré΂:¬Â·&Ô]°Æe°Vaôk¨¥ š†ckB;–˜ k5‚¶ÎX«˜ p6-B ƶ¾±…5H¬¥A`N´hÂÎôQ¬“Cìij±¡Rfý@j`¡¨=„/¤ÃK+øJÄ÷°ðŒ»OOè?XÃ÷©€”¨Lª² yÐ7ÛKPÿ¾’hÄFŒ¸>ë]¯b1Ó|@ fŽ>VXÆ\ édÍüs" x†F:ü§‚,¢ oÔ>fЃAÞh?}­AKcå;9ÞgÜu“ð#P¥Á ’ ¦B@P “DP·°úÕÁ%(H„ІwŠyLPp¸e禮ûU!Wa¬cîƒfÆ"jÛ²n ’9µØ¬‰KÓ¸æÓÛ1™»K”ܾZp ·ÉÔHŽÝ¹öì¾–¤Võ…¶—–Tª[Ò=e6tKž|²jøŒP8SC¤áÅ‘©á7 ú&°²r#¯°ñóg ¾¢ ³ëé½è;X?B Þº+Ç?ü¦;2ʇ! Šv¥Ë‘$§T¯gæŠ$…»Y•}tfH^UËf€Âïál¹ºº‚ 3.AÍfìÇ8˜á*ÂV9^øzk»À·áÜ¡¢ †;¤­@õfó &6Ä…€óë½B° £€Y˜áæ¼Þ¿K¬ƒac\Wø†È£à ¸wü8äg Œbÿ$æ#ðMx7VÖ .DZëŒg¸çF?ˆâÚ[ß“Oœ$ v ±ù¨òŒ’@3h;Ãc}‹lÇ\q=ÿ‚^r=.(I‹ÊÑFÀN³ƒù€f¥Øy"+FÐü˜‹=ùUÒ4Íà*®KŒëÓ¡p¶cc``™ˆy~t©aæ_;Áh¾dY.ø á׸)h#ê3ñD^÷v÷_›1©!LŽ'ƒFÒE6zµz]âù‡§W¦DÝ‹œ8[•Pµ¶å|¼|´2‚ªím+*ïN¬u¶%ã*Å{?Ü ã&¢ÌéføN@>cï2ä_•t›™Œ”7ªO.—ã`­Ä@JØàó‹Õõ‘xXÑ–¬«¡ê#HIÆõŠ…HTV*N§¹PDÄÔiåÕ“/Œ¬~¨U¦*F§\_Ÿ+öÌh”²ÍÔÚÊ« θc£°ã&œÏ0ÔãFŸ®W#Û’õãêÈ”é²~BÜÙ2¡#`ï$Ÿ%¹e\<¹ª–™Âð¸.é-bÊ7’Ö›ÅQÀTˆgt£2¾}¬Öà«h}a»_­ÜeH\§ßá€JÔKŠ’ q}À1’ î§L¶qÍðÒݵŸ+²y™x¨Gºd]2)>d3ÜbpÇT¬:ó¿än5ê7©®;jFôJ93ô‚ ch‚ÓkHÆw_'çI„u´RcZQ~Ƹ>u-Z"è®­qÿ“_Ÿ“5…Œp‚a ÓÇNµ«‡‹Þ‚_èz¯Ã"²MTò^'½·´¹B,ÌhVµzR&¥Ým9;“± âÆ±ri¸ømÙŽZ‚DígFÓ¼¨mF"oƒg¦„bÒÔÕPNÞ•~“"@ç‹SWÓ1.u§h3XR•ÇQ- Tõ(¨WÏÿ&Ô]ú¦AßôUÁæ8ì|¸—ÖéÕ͈B!;œªæLÓ—ß<›jƒbW Ás‚ó @¨C«‘KPÑÀ¥ªîø™¦î§ž€-½î¤kÿš%"¥î ñWF®ÆÍ¥ˆZW÷òÜ@H¦h{äT°¨ù$Tâï •µM:˜w¶­ªðQðU ¡UnùR'W©;Øã³[?I ‹ªŠéú~xBÚ~Èdqoa¶n”y²{; ñÆu ë~0ñIÆÛMä¿f3)£¦Ê0¡Ü–&JgÌÈÂêéÝ××x&öÙ *SÃÙÈi iû¾RѾ¨åfó·‘!8ýBGc²®°Ô¯d<¿oB×V¥7B⮂²û_2ýlÓ‡ñ”U14ô•õãªaÓ¶Ó¡|/{%bÔJÄ´§w,ú'³ Ûé°¬ÐT·Æ ¯‰÷_„Wk¦Zn§k¦`wËÞÁý˜«âÞ¬b½"¼¸ññb{ÓˆíÛ—Ø1 G„žÌ¸9îyÍèWû˽ÏÃ/uŸ+&ô|Ç4áâ¦]Mádßjtgü4ÇáW 𳺑_È÷è¶3M3Í#˜v˜ñîæ+^ÂË„u*<«Žåw¦s2ùLs¶.d¼9[­`ç±+Ö Äcã‚üƆñ<8cÊ }kÆä,¹±ó[t~òjÛoÄ8[Õ“ðÄa^vÞ"Ãë0¯hÁ“!Ü¿xá<›Åçlu]^ûÙ¥·$½jgâ7,íÖçx,o×ÇÛú’/ò£äP×Íø¢¢³nÉ+gÔ †iOÈ áfÁë~AGÉI­Æ.À|NµRf ¤wf£ û!¼ÕŒ.ŸM—Áëàâ,#oRû`tgʪ$´êõµÝ Æ3°§Ø@؄ӈ9$*R1*&‚Aès[÷qVF¿^uå›·rWœáÕ£O›É:c8.}ŸÙ#VFêÒOË«›ä8&öÃDõq^aØð~2Å¿ôFÆj½$2†£•÷Æå Œ2º8ÆÁ†#ÃÛd›°ºk»$±¾•ÊÐQðPC ¯oëhl=bŽÝÏóÎó–o{ߘ8ÆõÖå`½Ä«½9ÈøÈ3ÉÎ\Rèíœ3Aßú9óKâ{&MôLš=öŸÍVÛ3Ä2òuŠ ±ô7òêQë-ß¡8·ICy°Ë7Qî§dë†ÓOUb¸¦ Gþáîs9汩*±<¸²j’v[ŽÿbŸÈ–åXÎ(¤«¯ ã†íÚ·ãYÚ´GŽ¸Ã˜ó|§önö³{$‚„tÍëU“Jì‰þÞôî‘\OÌÞKÓq¦áñlÓ°&[#ÿM‚¨m-¢©žÄ{~ÌK¸«žQW£˜é¦–ÝK™6™Ù½„°íok‹¸^ñ- ë†×ל§C2½\›íQ¢"sðÇ7jÜS€ ù‰»ªÎè5wá»W¹fÌ·Ôœ„W t 2"¨ 'âxþÎîÇÈ÷V®Øy¾ì_Úr’ÿw™¿Ë|6žë˦W*rÅsß\X#Uˆ4òK¨ðñ·­xËî祿L\–ù%Ä¿šf °nÍ›Ù?Ø}̧I({ ]BßÛMö¨ ¹³î~jìiÂÖcEÍ>\Ÿ³Ë Ï©}~}/Ÿ§É+¿¤çÈmÊl¿2œ-œ âlŵ¯?Æ^Ó¹…š§õé3Uu•E érQç—ŒòRë܇…Šà¸•ºQ#Ø¢ðÙ"ä%Sóa‰je¦&™ñûîúe>ýrŸ Œ|Ÿáê0¡&Wº~c¦£î‚Êã>{•q>\§ÍЉËÅ9“L£^oêÆ‚z[NÀnªÙ&nä“1\mÕí3†_¬n&±÷N&}<.g¯ßø Û&vˆPÊ‚Vey¸Ï.zl(ç9©—¤uÜÛSJLS4M„è¶¼S¦‘ô,‰4•-ctÁÃYNzUf§ØÁ¡„(Nût(£ï22†ÿ+ø ÙŒŽœ‡ÿuîà¨ÀQK„ù˜“6ühs×®õ–ïÍ-·Ι>XÙ%!÷­ëòU­3ïŽÒ p‰%äESÚ^̤+âs‚OýYL2Õ–¥üF4v¿è¡ƒ'Õj‰‡n·G$Ým¶~`(Gàú2õ4Á–SšïЫͯënáqÞ-¼-Xx{9HlÙ¹u[¶®²Gn2Ú²µ[Rè·Û²ånËî¶ì [¶ý]|k®x®?Mýƒ+’oýÅljeŽ-BZ‹'/}¸.%Yvp» )`¶õQ«óÀ‹‘NvÕã‘`óêc(/yA»‚K¹Ð:'Æ?@Ø>†Ž*\‚&€Êì𚿬 [m0˜o—¦wpÄ¢m(<ü&vjÖÖ_¤Ÿ³ wú{ qù#Ä,zòÎcˆ „€b(ŒïGt .2¡@hLN¼°_NhWšc¯(ŽÓçánƒúÄ唨,>þÇr½ endstream endobj 3919 0 obj 4237 endobj 3923 0 obj [195 /XYZ 38.2500000 652.250000 0] endobj 3924 0 obj [195 /XYZ 38.2500000 652.250000 0] endobj 3922 0 obj << /Type /Page /Parent 2 0 R /Contents 3925 0 R /Resources 3927 0 R /Annots 3928 0 R /MediaBox [0 0 595 842] >> endobj 3927 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 3928 0 obj [ ] endobj 3925 0 obj << /Length 3926 0 R /Filter /FlateDecode >> stream xœí]KoÜȾϯà9€iöƒ/``-Ér`X@‹o6Á"»ˆ²‡üýPCÊ^QóÕh>6‹ÍQYXϬ[dW×»ª««ßÿéóß‹þV¼¿ùüŸâËôyóùP•m]ŠÇŸw¿ÿß•Ó÷¢íêâË/‡‡âáðéðiøûá0>ðùæ/÷ÿ¾øóðßÏÅþñÇé—á—CëÚáóßÇϾu÷êëçã¿ÿëð×?¿>¾ñiº ˜çÿÿÎu}ˆG0ÎLýpxZ¦;þüöå×Ãû—ÍÚ®é«ÂÅ ×G_ü÷‡Ÿ† ž^_•] .´¾ŽÃ÷¾‰mUw¾·aúÃNÞúÇÙCÝÎ Ôѽ˜üø“æõk¼¼ëW|ùòäXq¡qòÛË®ñm¬«amèû¢uõu5"­mVÀÚ×·¯@’¾òõzô>Bž)Oä†//ûè\û(ÖKôȈ×·zbŒ+ ÿÛû“¿¼«š¸"ã!O–‰º'^ÿé’×`XD+ô <øáþðþ£‹U_¸¦¸ÿi€nœóøq? ¥.Þ lÙV±¸ÿ±ø®ª\ücqÿó¡/_?¸ÆH¸=ŽÜÝ(Z}u>ìÒxH«Žx8rG<Ó£Güb¨?\k ¼Ý^ŽPÁyøÌ÷>#£!l ÆNu“’r®'ç• jb=C0Ôi© uˆŠÚ»[d?(BÚ÷ÊöþÚ$µ‚v†áRlk±ÆÞÔéõ¸¼sqùJ\î1W@^v„°?GHSå.÷5±G©E9¬<”çqàs—ÚКԮe›°çQ²g™p_Ý,ñásÝð™zV4e¬ŽSöá+Göe ã&ÎÜ0œ™˜ïÔH„oIß•]_±=g±S#pŸ™ÂùSokЈMF·¤jÔ࡬cÓµõK¹ë^ó’QåÔeð{#^W‹FbÈ—‚5ðJ!l.¤|ÛÚDN‹bLþ;=Öw_3³›g1<‘2/XÝ;ÕàË~€ã¬Ÿç`XÀ/æeìÍAüFL-Æk„9uœ¡äŒÈÛ¾ ì ן?ߌâ×<‰Ÿ][W•õÎ7tÀ‘É´Õ¥oêç¦mZÚEÏóôè™É;v¡lÝs{?y§æ™¿-à SýBp±32XSçgnÄÈ`ΕuÚ×Aàú38X‘%\æ<q8©W×£X°9¹ƒPß^®»dbF~r ÂSoSJ›à·©U]$Ñ/ûÉ]­Èá¾j_Ïâ)Ê4`+ˆ­¦YR5(ÌÃHÛù2, X¤Ò”0ê‹` Æ¡ÁÎzÉ)lï™,U…†É‚'fâcìž®°»‘4k)07ÿqN–¹Ð3®®’¤„~RbܬmuSÛônfj±¢¦.ĹåÓ*´Æóà¶xŽ{ lê›9›2»4»Þ,QÈ5F w ¦Éœ1ú8Q–ÁŽxþnöºvÑ·ý\ä×0‹+ê¬àºÙ .©ãÀÕÔ€ ‰‚¢nŸÎèú©»*›±Òþ5¢„Å/mæ2ÃCDžÿ åCˆ WmüŒï÷¦­|ëf+xÙøÝ©ãóç%}˜-îÔ¹2@¨áŽI{âgId0çþnLOÜc”á¦Û ³RxÚ÷ˆaúq I Ü¥§@à<øì0–,a=¸Kž¿ wÝ$4Ãñнøz—ôâ0Ÿô¤7Ó'–Ò5¦7rÐ;ØŠ3{ ‚®P +%ô 5Õ]ëA(Á˜w¨Þ²x¥Œ/Eô Ãô©q/ Üû8¸ÿc%0ø,%L÷nŒk,?D纈©€%ó›^×¶Þ7K:}R6Ë3¡7„øƒ±®DïÁR&ݮ˙ÿ©­Dl§°)‡;·+JS¨–ô@zó+ÙZaÂëÛ>2z@›·œƒ·œÔ»Lk…™œWb?€¸Ó`{k„±“ÖJPCŒ ýÝÓÚœ¼o1胯Ï“¸S´ù(RÜ…¥ kH“À\¼¾¨}ØöÒ¤fk þä cÇ2®{õ!-ãjWÑêYƕ˸ Ñ3SNìŽ2Zt–í}hvrCg«E7t¾™ÜØ>ï"5_ˆ£œùBâzÌ2_( _ˆÑ|Ô-_Z{̘{·¯š$ìB€~gî¹ØèÏÓ8{ÄÜe‡o½ ²€L&TˆF’ò “‹J›¥0ÊÜIpHMH­eÝ*ó4ÍÓ4OÓ<ÍEž¦à™iY "ëfZYäk«§‘d;íΘ«_™y&©?*ÜI}e»Àšyó–œRÍ›·Knu¯a4¿} fö‘y¿¤š—ÉùlaZ kÊzí–T»iÊz]/ÙÍÛç r&ê¬?“§Jº'¬‡næDÊÛÑ"y؉ºõgáIœÁ%b*¡*zqT€äNû~IUƒ¿`ýÂTÿ\YܱӬöù±@ìSXfGäxËìdÙdâä\wŸó)–Ümuãò±È×v$g¾L|º$iIEJй“Æ/É“f=‚{J`9ÃÆ6ûÑ„uÄ–{?CH`ÄÏ`‚µ£7¯‚é‚ë—6Ïo¯ñ¯ñ4E—tÃÑÑÌH7͒ݧ·ãÿØyX o–)øÀ*óÄõXežUæ‘^ŸUæU¦•óÐÊ–¿¥*óT½ÿN»Þ‡òuMžsg\­€¡ÆoÃ8 |¦++åàœaÎñ3œˆý"Â'ȹBSC¶•vß8Í\Gë—ôñR…´YRqdu‚’ÜjÕ ó¤íu‚!xk÷!_¤Ù3 –…ÌwÚÛN»*n{j¥=UŸ8l{9ìujuÖÀÝWMã¿¥=U¦{as4#®ZÇ~\[·”´P«RØíådfW/Ù·(Œ”“+;­¥æày’Þ ±OÛ¿}×3¡7À.ïêd™›±7•y,ܵê»JíY´g–%ËbQ¥' ½r®¬K«à-`«ÇPns+®{öê÷b'³¿û·æäà`Øp?Zœ™…¸ðÆœŸÃZ•Ù[Ášg*p¾’©reª90µ™ªjˆÑ}RnÒÞ*:ºwÚ·­Qzñ;™ t¦S³Ù³™k³uzªÿ&ð†óæûí؇½Ü¥Õ·‹îÒÚåÎÓög®ÕúkÕ[´˜·‡öÜîæybJÿ3'Þ(œ%2myì<õ½z<„³ŸIsÝT‡S¢"Û)Lj áÌáQ2zƒYiÞþ\÷È »ðçHã:•DŒÏ/TÄ·ŒR•Û×ä˜3=–½…ôF£][¢¶_µ¹R'Ü ­*hH\mÀœ'|y<Âtý"Ñ]VvDH;g!a‡Šé´ªhrÆ(Î|c}@äx0®=ãñ«í ö°Ó®ßȹ[eÛ˜Ž/˜û’F ˜ûöÙ//k'c>ؾ²VЃ{´;)3¶Èæçå’ës•vUEÂ’ÔZ$ÌÍ“µ¤‘°AÑ£EÜÉ1º}Ä ù:ˆÛù%5SqWYGZ˜û,â~K|AÄõ`Æž³EÜUb‹lþ¤®3‰ì£öíÊVýZåPýº¹Íaκä¬×ëšôDËöu;ÖsA׿ë {;F… "ÏL¼’fÉ ,ÍÚb×/©‚¾ºÚâíû¢m•Ú~Ž4bû9"ÞÒž/fN†c]ÅÜ;¨U)Àp±»!NÒ°9ß(eTÈ Z;~C@œÏYóm¿‡šû)ïÔoߥl¦½Í•‰~©LR·˜œ=M¦R Q_—³†Ü;Ìž½V—æN†¦ZvŠ9mª…ƒœuˆ­f,ÛYÇ}ã-g¯Q3ÏìÃ’ÎTnzó ©ÀIDn§yÐŒ5qb?"c-¤å™ ù‚{…(…É¡+åuÕ4>Am¡®„¸¹kØÄ”#v?puækævôÄ4ÅRB@­Öï\ÿÖ¾G­Þ]fŸw-š¿’µ¿¢*3í’šu!Á-9¹smu!Ûß¾}]È>«ZsÖ<Ö@ò³¶—9æ¶ë<ö CÐ>±OßÌ$P”ÀÌ#Pï¥Ê6tVeû*¬ƒ¯yS¤³³Ÿz¸rzV§˜C-TRï%íi5»ã^äÑ«»ã¾øG½‚ÑlA¶@­oËö7%Õ\‚Þ`¬^Ú½'»%üœ¶óKjr4£ÒØ,ÙØé=Œ&Íø$´íY\ßéöí{›0¬·ç·Üó•±[Ò…Øôm²iYMÓ·éõ-Ñ¿Ð2m,Óf™¶3<ºÛ³öKv÷¯m7Ѭ‰Ñí­qc“uLã¨-Dtšš+.©Ø0Íe¼œ‰æ":ß›æâ¨-ÄFšš«µ ®Wñ2ŽSØÒæ¢,bæ(g=´D¼¥íñNÿö]®íŽWÓH¢d™F:_Áu¿íòĵÖÎ"UGùMÕ;í—TØ™wÊÁfÞ©4b¶À¼Ó7æ^Ù}ˆ¦‘DÉ2dÞéwzÙè´5ÙûĵV¥Á~#ƵÏá9Î:üÃëÅÙ?û…³àõEw ´àB9ˆÉ€—Â?U@N¶¿.ƒïÜ#Âæ~I[Ö±éÚg##gúÒ»ãÀ 7/G&,ø²©Gº|ãó‚XÆp|äw4¾EóL|qâ™)R:ÛÇi¥íÂÜ&ŸzÛ(qnºN릥¿Xà$â§^ß‘ˆ–áðÛà3Õ¨ÝEKo¿±-Ëp߈Ÿ ¿ƒ¸Ã#&'ï2¸E, Ca|ß!1¸d΄¡19ñÄÝrB·U('%ñŒâ7œW;ÑuR—çTeñéð6½Ó endstream endobj 3926 0 obj 3897 endobj 3930 0 obj [196 /XYZ 38.2500000 174.500000 0] endobj 3931 0 obj [196 /XYZ 38.2500000 174.500000 0] endobj 3932 0 obj << /Type /Annot /Subtype /Link /Rect [250.500000 224 298.500000 230.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_features >> endobj 3929 0 obj << /Type /Page /Parent 2 0 R /Contents 3933 0 R /Resources 3935 0 R /Annots 3936 0 R /MediaBox [0 0 595 842] >> endobj 3935 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1409 1409 0 R /F8 8 0 R >> /XObject << >> >> endobj 3936 0 obj [ 3932 0 R ] endobj 3933 0 obj << /Length 3934 0 R /Filter /FlateDecode >> stream xœí]Y丑~¯_‘Ï LŽxèú4° 4º}0ü`ŒÅ`ÆØ^?ìßwVIªƒÊ)~ R”’nØÝ.–(ŠŒó‹`ÄÏüö—Ó?þuúùã·ÿ=ý2þýñÛCunëjøÏéñÏO¯ »óøïSÛÕ§_~øqúñðõáëå< |ûø_—ýÿIŸþóòß_Oúóå‡éñ~hU{ùû·§¿ûV]þU=ÿýøóÿyøïÿ8ýóqÆéuãbÞþÿŸT_Õ<.ãÆ«üþÞ0òái¤{þA¥‡œ»¾jt]½üjõùi¤>Ý©7#F¹“اس5ƒOý<¢{8}ý4bεm—øj¤EϨÎö® C#ø+ø5|º2ÓC V@í>–á=Ÿ¿_hr9)[!ŠRqIªzzm~ZM5߬k#=yFìb¶hDÁµi<›†#xmp~)žMuĈè—G¬ù!Ú3ç-íaÖò°#f †±@°á"IáµaÑG¼ÇTáâe¤°kbîV ÔôPa…¨¥Ö3jÁŠ¥sõ–ÙÆýU†n q!eá¡'8›g"û‡55&qHzsƒó~1ÁuŒuDæG‚ï1?RÞ| xÕ˜º°9†×6cS¼Å˜0ð‹—¼çÔ™ïÂŒÅèø Ö=@Ъú.‡L;Ú mS;ú†7›ÃhÏ6# HÖt‹±"ªMUi×ÂQyÐìR†`ƒ…p" «b¶û„Dªùœ†ä(†Ä'(ª¤dMÐTÈóÏ3xß°l`N[‚[(«)Œj%4œ‡h]Ù5ªˆˆtÝúg„d­1¦¤"…U5CEs©#–mZ‡H”¬gá3FDz»)X2Õ˜Äù :^TJ È.0?zDÛì°Ý0Ƶª‰…Ûf›ñ»ª5cïÝ/Æ¿Š¥£í8£ý¶uÅÔH×0ãÏp„À¦=ïÁX;ù‚Fž}É€µyâ*|mª­l¥ÝSü”Èju7mÀ{ÈŒØß/uÖÙ‘(¬ÓfWg*’ïšõc(˜af1¶=cõ‹€þXˆñDE•¯çlSˆ…ˆ¸r¡ÔK@ý]Š€zmfZZ6t„e€eÖÉDJÉ`\E‡ ñwRy¡G‡9),;p±UA´6¢ê´+¤’™>‰ø°àÃñña hÌãÂÙ4Ç$ŸàælÛ0-Áø®'òËf«3¦Lk8cóñ1<ð´ðñ 1BèÏãI@ ‘ÁlðHχxO6 gfþ©\¾¹1Hºäèd!;2ù˜‰õ“m‡me&é&Çð馰NÝî]}Ÿ@L¾Æ‘·Â÷dê&’O{ºn‘¿]¦‰ê½v»/@‚bi§÷ üéØWov,ø ¦Qö@*$C$9‘¹šÂ§EÔc}¯=F!8y›P¢—)(ÙŠ­GÑ«3²2œ± ¶›ÙÉd¹èf„S@r• XìŒaµþåÉgÏ7Ù#š”IÉĆ˜«ÌM¾.¶°Ÿ0¶¦»M¤øÝ—˜ƒoJ™¨·“:w—S™6ws3Gæšo*â?z [Ø*AÒdYNöìfÄË̆?p—´<þFˆÔ@ S"Œê¾Q’¼Ž˜ÙâU½XÅRì°U&«çJ{ÀõÁ/qÝÑ­>o‰ÞµŽÌ©Œ?¦? ¤jìàµI{£Ð†œcù" ›2 ©=0u<…Aå¸å^UGoæ^Êuƒ³$ì  £äeA7R£ ®]¡rrmŸU+ãÿËrÝ–Z©Õ.ÉÀL&rNù¾û»¶¬»Ö¡ ís‡wz?1ã,ÜRÖ!Ò^ÇÌ’ìkW¶ï*G™÷3b¢ŸÍLa«9ÃÕ0Œ; ,”jºG…6K ˆ‹ÎÌ‘âjW3¤·ŒÖ.@VTôþTôˆr^Žñ63lUó_æ£D2•0œ+«È˜[Ì ¶DHG/ú…\Sgígíømž»Få°,ïÛÁôΡ¶¸4µ“ö'J²atQµg[õòá’DåÛêÖU¾¢Ù'9ÂÞË¡Ô:©RÈdsZeë00¼E@!íowYz¯ÚŠ•äñÁUåšäãZ¯¹³%]‚Ñ/²²€>>ÊŒÕá_˜ÖÖÐáÈ9;¯ÓGÍÎÛþ‚XÖ†þÑAƒ›ÁÁˆ¼¥­q™kû~ QÚA‹˜ó9§Š¯¸„¹“˜ðBc{ë°bõŒK/Ê¥…  a‰¼m•¢:”Ü6dt»hƒ°¥°g|9fFáØCí•Xº7ä:rb_Ó¸ 'ÜÕ;\C ØI‹NVvµÝf8q²nr]c\—:vÒšˆReî1É´²í±‰µQš+IÒQ«Ú*bUúo½KR¾5í%.‡·²ŒÉV–9U[t©«Su½{Þå~7ÜŠôJvKÂô†ü ô_V|­ê -KþÀ.óâÚí}ïÚNÉÂÆØ‡Þ}ZôøK=+(¶>¸Ü¢ìbc?Ǽ57@óft¢ÌõŽüŠ[Þ´r s]j¯‡"™croÝÒ+266EíŸOc<Ô ',a½ 5Oe¸G/Ë XÙZÖh‡Ë’]ã©Qš¿'rm#÷Ð!“Às<ñ»3I@127Í-‚ü±×+=œJ\NVa5ñ¼g{¼N,¹À—B2\8éÍí‡ Z³ž¬l³B[¥†–ÎGQð ‚‚v®ÅWkàî¶î±%á—z.‚×~„ϾïŽëcïÉB{Úb:À¶1>¹â¿ÿí¾ü·Íe•Æ´ƒ%Ü#ËP8›Jq tÒÈus[”‘2RFîm¤di kþTVVÏ$³÷™ìV¼;Ðó\Çû߃iÇÀ}ÓÄ`JôX?˜®¶o£Å”Æ.ºü$.#e¤Œä2Rì¢b»ˆ×ïð´‹]Äí›a" ÚR½]#oSaӛ㋞ôÛœwÓrÖXnŸŒ›ÔE‰ëå­†›U•xw4Žââh>íOá§€w”Š,”è‰âó)Ò厤‹†ÚÛ²Z[ I5²Ñ+4²'Žó«ï`º s¯GUµZc§1#;aG°]õ™¨:Z~Ïýdfa y8ÄèV$-Ì8ÚîxZR«¢]£ Lº¬nUuýoUÏuù<”‰éñˆˆ|àâU‡óˆ<Ñ"ü Ö:„Gä¡kQØ{gôÑNw4‘<`b‡“!YøÊ6; Ø*]ιRͪܪ¢QwªQoÖØØâVÝš8µç A/øì±¬`ü0¿G Û™ÁX«¸?äA`‰èˆgGñ÷ˆÖSϦV (ô&NoXVe!ouµ&“áhò¶ÆyqÅâ)OÔk"—GãÀío2—Æœ^ÈÙa”!29>=³™<¾çA>DiÔÃÄl ÁÙ£yè‚fÁŽ`›KoŒQbdìmü ‘GS¼ioÄ#oK­!ψ'»·ÜZÊ —‚¹µä‘ø–H™h×¶¿ùÝ÷£]·÷´Š6*ÚhÇÚHô-£¶ç`ÏB&»±h×=k×¾[¡]·§å’µ^²Öý+ÈÀ^¹íZ*wqûVòRÖ(SFµ7i¬Œ”‘CŽ­—µOy?Z¯Äì}t ¬]³ð6M=å¯cŒÕ“ç‚iŒ©-‚9ðV¼4{Õ®ªýU¤üN}›¬}ž\ñ®ÒJù>Nµ"¹ò¶O‹ä’>¹b!û(q¿ÒªHÙãwu¡bq¢q’£É|¦¹ßŰfªfp†uÊõ4}6œZn@y÷:ãPLŠíår‰†çM×%~<Äèh–HÁkd⥱dº5Ùae¤Œ”‘2’|¤X2;EfÉüÖG©2pùb=§!»³î‹G ôÊwy¶ºsW?û^À }TunZõ–†óRõ¹êÍÛ~g$–ÒÓ³ÌR|°¡˜Bñ$-AïUøl#*ªÌ´_«Ö†ŸQ˜ðñ3˜ï„ç#ªÄÚG'n.MR)$†æõ÷309aöÀŸ!j'PöÈìô1_bº€#ʦ#`v.q©OávÌá¶©¤²ƒÞ/ß{L»&ü¼nJ\O «;GEqö"JÑ®o])ŠÅc×é÷\z£Üs)©¤{H%HéªêëŤNÙŽ·¬½¸4¯”qA‚BôwOôº·‹‰Þcx„˜ 0Oac.i¬?Ú-˜^.éð<§xø[¡±†m¦$’¥mœ¯Û¨ÚýÂÌÆX‘Ç‘ÁgŠý ì0xãJ »s\3{W:f‰Ýrìº1~f¾.è3%¡LÓí\DÙªu¾ÀBDÅÀZb~õ„὜‹r¤R.G¦‚а<ž¬[ãFðHެë™ÑPœ‘;wFZíšÉ‘}‘ ckŒªöÈ*bm”&`ÐbÙü€[áÄÈ@o»w£W®Áø@†¶50|Xp=ûð¢‰î\)¥ÕrU´µÿ*,Ë‰Ä —š(œçq0™/Åš["÷…‰/Ç©SÆÌà¶–Áä²À}ð`i·Î((lWÑ0sø¦ÁÖ§K÷üÀ˜×æ;¥rëãf¬„ˆ2Ì@PŠ3Ë“"šì”s‚ßœveP}HÖ,ø0ZÉN1 b c&3ÄBYb˜\e³#cCØ8Ä‚>3Þ¹¢‘Æ~uKÂ8Tà%'þ®½Šò1è98ÛM±9­`JMy1 0³`æÚ3D½Çr/ÒKü½È¨À™Ò®…%«—U㋎‘4 +ÛåÂwa"rö"ál®ðÒ¢¢pµëðà3€aÍ‚ãÂÎû FÄbãP×"gŽ›Ùá”r$¥ÄÝ;¦Ÿñ‘NÉd´É€Õ¢n¤Æï!d.AàÄ&ìËÛª©ç]éœà­xÒœއr¹¶6\Q7Õ)0•³ˆþ#¨êUãî6ðKoÖ‘3èDiÔ#{‰Ù<eoî5c[³¦“âö:TÏ(k0] WÏÃò)‹~Wm½¦{œ–•cŒËÊHl¦KÓ#Ž L±©ä%RRl«–®4Ízú5;ç¡+Ì[ø ´©qô.pi¿öæVWWõ7×#:º‹ƒÏaûç=¸›oÊ·kzžàn¾žÙðþbÊE’jªfMÇêL6÷γFEm ïþIBÿªëêlèr{œ¡òd:¡6è+›˜*ŠŸì{Oñ“wë Z˜Šm.Uóð z½*#ÖÛdÁJ­넾o]fŠ|+æp÷´DêãǨ9·an5ÞbO1Bü¥ËK«z{ØU+æVx’ê„¶wdM•#†K [Dñ˜šŒfg}½õ 6²»Úæ²a•z¼¼~Òö-·\£…a[Ú+’wÈ¥ÖSsŒ‡5ó‘4ÕçÆ½ä¯4–>¡÷˜[È˵µ}¿5JÀf†}YR;Õ*˜}àH“צoo¨£+Ÿ¡ðl𙑭UЧ¿‰,Á=þû²âiåŸáÞáHcŒ!Œ>!0pAáýþŒØÀC%.z'~q·þ ÛÊœG!ñæÄ± ¿V¿*Î~S~=}}ø78–ë endstream endobj 3934 0 obj 6124 endobj 3938 0 obj [197 /XYZ 38.2500000 487.250000 0] endobj 3939 0 obj [197 /XYZ 32.2500000 521 0] endobj 3940 0 obj [197 /XYZ 31.5000000 656.750000 0] endobj 3941 0 obj [197 /XYZ 31.5000000 522.500000 0] endobj 3942 0 obj [197 /XYZ 32.2500000 655.250000 0] endobj 3943 0 obj [197 /XYZ 38.2500000 487.250000 0] endobj 3944 0 obj << /Type /Annot /Subtype /Link /Rect [76.5000000 629 120.750000 635.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Modules >> endobj 3945 0 obj << /Type /Annot /Subtype /Link /Rect [90 458 131.250000 464.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_memory_management_objects >> endobj 3937 0 obj << /Type /Page /Parent 2 0 R /Contents 3946 0 R /Resources 3948 0 R /Annots 3949 0 R /MediaBox [0 0 595 842] >> endobj 3948 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 3949 0 obj [ 3944 0 R 3945 0 R ] endobj 3946 0 obj << /Length 3947 0 R /Filter /FlateDecode >> stream xœí]KäÈq¾÷¯¨³­e>ø ;/:Ì>>+ˆ°+x¤ƒþ¾YEVuW²¾ ó«È$YÍhgÔ2##"ã?ÿû·ÿ:üÏ??üö‡_‡??~{)ŽuYô¿§ß?½ýmŽÃßuS~ýýåÇáÇË×—¯Ý¼ô/|ûøÇîoÿ<ØÃºÿýõð§ÿì~øçáþÁï/µ©»?;ÿÙÖ¦û[qýóôóÿ}ù9üíôÅËr0·ÿÿ'ÓÛÔ'0&–þñrÙ¦9ÿþǯ{ù¹G@Ü*®±eíÆ»î?­·‡¿ÿ÷Ë_º.Ÿ/Ž­7¦®|]<²PmÏ+•íÁضC»õ£…οu>o|¼nlºŸ!WÇŠq•‘¿~lªáü;¹vsZ¸-;–ñ¦9$e+W4UOšºÒ§Íë×Þ™ŽBÉ>~†\)Sá§å)çŠ6Où¶D•¯æúùt¯½O÷ñ3äêX¹pþº&qëör¤Ë1)à¿M(1Ú7é8ç¹:V.ÄÅ_ïdƒ­}YtÔG im›PC\¿ž€$¾¨æ3ä©4ü¸âQö¦Žƒ·eì_?Ÿ‚´e›Nù÷«ce íøë_c¾‚AéÜž‹¾¿üüÅø“qP¾ÿ¥®_óüÇ÷)åá§“)Ü4‡ï>ük’û·Ã÷¿¾´ÇÊ–û'özâ*ô¤øŸ´pøÄøøw>Ã'Mü ›û¾SÀu õGøÒÔCšHSßÁ°aÞèc5©PÀ'øMcçó÷Nø¤–UQ_¸üCÆUm5I;6)á > j,+ð uMœ,/±ôÅç„íÉν#¨ H¬0v ž9ç3Ê _> 7²J¸Ê?)ódçù|«6([õUÑ’RNK6æâ½ çÞõµK¯Lêá“è‰éqG×­Ñ!õõIÏòͱi‹3¶_QÝ¿ÓÌø|Q£|BlÃðkpÔ.Øà ܱôUSÏû<Æß žË ÊgÑ @—mà;%Ü)†º ù‚ä&m ¦:”Ñ6£)Šy1H˜‡¡Å¢?àw0ºFTe^©°|ÀİÁ¯1( À²+B¦`É9ˡԟ/Ce´çùòåù hëns§Ûôôlwhdº64ùEŽå4V^ÐäZos‘I¯˜ºàÝ /ÍxÂØŒ*Ì#ãTáH3;÷…•˜`©¨â"Â[`œA³3|Áëü´ª·m›]õîª÷]«^ÝÀ]zEn\÷óÛCk>Åë·+±êª¼•<‚ƒª¡f&?’!ìå®âމðDhyߘÐ+ ™uO¿ƒµ!|‡1ô4(<е øiãàò–Ãi™¼ÊrÎ;¢Î;öåà;‚gˆ-YbÌ2/q€ëâz_ÅÄnß»}¸¥2#¥’\‘U“òº¦´!rFT΃C9à/˜ªz8uÊPל`´:£½ƒYÁûú%D¨Sp˜¬R.ö¦åâUjÆà%Õ|ݪÅê|¤dfÄ”.\ÑŽTáÑ`»˜ Œ‹¹1¤“ôX€ÉÒØ(‘uíÂÙ6L‘BD¬‹©°Q•ÐùjïÊ«ÀùˆÀtKñ“lÁàõÙ³BM×|cÎ~ ~à`i$#D(kksæ$eˆ† Þ·® ™Ÿˆ9 {Q“IfèJ?F£¥æ®ÀÖLìB„æ|©Åjƺ®%,…Ù!>ùXµ§  HÉg&ò±þ“–6Â]ù:ë{„»Ø#Ü€[;²€ ›u ü=_Kìßb !מ¾qÕ%£Ÿ5õéÂ%{¦#Opzöš½½fï}i¼UvEhÒ¬9í8éðdˆgÕ°jþÒb…ZK…b’¢*©Ïô¹›Öœ·GlÉò1Ýâ:¢à‹*$®†*—©©f]0W "häƒ`RêÊÚ\Y—´e3H˜óG¢5B «^3¦îâ/ŸÉ]M Ǫ}Ó×SV ¶mhí-~ AH!Áê.* ÇXÄ©¦_„B ´þ¦ÚY`òGÔ*jÔŠm*NÙ| /­7ÆfCÏb±í16v§ÛŒ±m-«dœ7a8 âú%_ ’!´Öf7¶rÝœ{²2Ì‘£NifÂVN0›'ee˜µ!¯k˜š‚LX,B÷BL3Š£V•Ú¬¿+>{áyÐz³äÉÛéñsçÉ€Óê8”‘Ží½wZôΠ›L{l›óK#ñäa½ê “ï|mðÞêËÇFnÂ=¨mü:ƒ…µÓÁ±fìY~€|FOì`¨M›I˵M}‹(S‹öJË1=‹å0áß¼Eçí»þ'³è`",(Û„"+º ÇvT#8T ‘ë¡°3¥¯'°§¼SþDÀ3ýÎ3ÇRõÍÛüöò-Ùd<¨×}žn&AÅÜ Q)¢Æ÷Cñž!AЄ+ ªü¾lì1‹«lÈ,µD˜©Ï ÐÍ4tŽ¸Ë€R«ÚÜÚ¿PÉ ½ÀkÄ#\<ÌOŒÊfŠÊU/É(_Ü& t"s›}ùÖËÌEjÝ;Ÿp?8Ø dU[îèæ…J|™1FŸz{îåá un[„î¦YL×Õ'‹ìe»˜¾«Ë(£OµýÜ“Ì-y£™ÐÊûÁŠb ! ‘ÄPÐé¥6LPŽHºîÜLŸO†EžË<Ó £îºr?ÒZgEUÏ*÷V}®³¿æn31UóZÊ."BÞH'TˆeifkDªÅÆöºú–m¢×u^¸âÐãŠC\5ë —¼eY56Äáâ·¤¨ŒO®QtL¬6Íe =6–°äŒ¸V¨zk· Wq=f{Ò¿mC…ˆ‡¡ãJga;QËkI-¯MáÛÙ;€aòVÔ° ¼N„ÜæÄF€4?UL©QUÅ't3\³3ñdùŒ'wŽ2mE`.‹gR…ª^åœèdëà«P_’«3çBL7Ô•ç…ëÖÀ­PW­¥q@ÚCh+òt´ñu3Á@ÄÑài·ÉK¹ ÇÅ›tÄt³ý É=áå=®Éò©”ú³ OÆ^˜õž¢ÿaõ˜$¡F1Ä6}#¼A_ ëös®°$Þ)q1RØi&sC åâr:Æ×Ã4 B—n°\ו7jJ_ÒéBPç–æ •òØÄVæ{éÊq(\U¬:A,ÆÎ%Ì̘KSºv±NÄ=|ªE+q‰•‰×…:P¢vŒšãbSsÉ%ÞW]e©Š;ºQ¹ÖBø­Ô}·Lm¹&3Y)åFí–ÈV«½çÈæp§j•ݪƒ„ØnGßÅ47ÈäT'V©O×›nC ²±Ðü19ÒÇð:°-AÉÂQ9Ãy7Rq9¢Á»F»Ý)z*Í[tS0£Üw2K{IýºPÝ/Ósšw%°Ÿµt–ª{­eL{ËY÷â8ø lêa`)”Áwô`Á“Á@ˆg¦„Oàý$<ÄËÃw0Ô¸Š…b¶Fí0l­µÜøº·ÆäÑgÛO®3ç!˜«¾Æ8PkØ3CÚ¹f—vù¥]&N¨Ï™'d4„`—Äû~Ö±Ÿ]³ Í2‘?2­»,9$BÆ)ªJ¦Ë‹ë 1!©´g„7KÔ­S^ºn®Ãft¦Em³¨R¥¡³JP}…aæ,¦ 5a)ÄLR`¢Dk­˜F‡•… ”Ø«œJÛ›ðøŽ¾‹‡oÏÁ'Bc©OšF …®_ :lœ­¿…V ®±ñ,P›”å0Þ°!Œ‹ê°»è!‡XÜ{SbTØ„Àa“?y{§f¸ùFÀ1ºˆD"„*‰fZ¶íÔ—©Ò6¡>Ú@!ò=^€¥xßt€>0.¥Óm;&p0‘(¦Zaà"£¼:qk!×DñqN€cé„78Â1E .fç{Né['kÜ$˯§uy±ß¡Í6ÝÒ©„¼imȜكQ‹WvQ͘ Þ|¶ÑPOÒ€1 ˜Né ÓêVUîåˆÉ‚ÇÏ÷ÍÕhœiÀ9¦SÞ‚Ü„ª¶Ú–½ªZÆ~ÕG¼|ÿ å;Uçêa+è FD´ˆä ÁC:ÃÜŸª·VÚüÉÅŸtö¢`úW‰) ÝtöC¨qåµ ëàš-|žH!1i‡_ÄM} 8Mƒ¿†ëã0Ô8q Чª`¤Ð¢¯ƒñF¤ÄtÓN8…´Ÿíb?ÛûÙÞðÙÆ'XÀ(N3'w}Á5œXV1…¸~~* }oäU¤ÅX_{Z‚©‡LœÉ\h¢N˜AÄL¨žtºc‚4.eÇôÛÉuK;mKk•ëõ•ÎBlZ7¨z¯ŸÊ-_r¡’^‘Í ‰çò¢ª"RœT´J5•÷~¦Néf­bÊYtCi!‡Sã¡toVd*½Úh‹#0–HA$5ëïw¸<‹$WKž´•¿íF‡Ÿ ÌY‡Ê´Uï½Ó¢w†siê±¾lˆ¯õgüqÔîúšµèÁ«¼AOUkP^6n¸ ƒë`0Ô¶AàDÁfÒ*÷|ìË 6˜Îƒ*µ#Œ–Sʆ£Ê#ú¯aK”É£ªô]cR¡L½«ÊuC¦O.1ÁB§¦0“é°Æ>Ã=®øÖíâDÌpÐmYºí0Yó“ò¢iCÅ—8X‡™Çb° Àº˜ •ajbFưͿl@…œ—w’°&Âj**ë98®ÐÅA q€ßaÖÁûùù KAŒLm(ðט3'È’8%˜ XªCM H1Ìñ˜¯ñ×àNëö®§ø }.ߟÒj= K8l*x6?oÂLÂïSMuÎu1Tu–zÌ,7Ýr7Ým0sÁRÌá‹#%s)û:8ç†ñÆ Õhl¨[æ´Æ+ŸK™FZ¾ª3 'æ'oÓ’(B„/Þý'[“),“˜@)!_b*ms]ý„Èï.S\ÈÂO–Ÿ<‡`ôŽ®~ÓµÊTgP¥Ë˪ŠúÁL½ Å€ó+‰2÷[IÚÕÐ•Š¥¸žèÁÇ\@PîfÑû’¸o•«÷%Õ˜*Óäg‰hDD¨ƒ…m" #ü€½›!Tå§[ÊYˆÁ6˜?悺Œ‘)ðk©f4ðÌ4o¹ÂÜpEÿ“Yìd"4Yå~ra¥”NdBÖ=ÿ^eBOD3&â‰gRøãéýß_l]¾ýÁo/ß©‘FÜØa^Ü+è%×§D\}Q‡=À'ª±‚"AÝ Zöp529çhÜÒ™Û³×TÖIâápB 'nħàêN<Î 7aÚ”@ØÖÊCÇr®ð$Ü„i|„×!¦‘X<ä7TQK+ÏÀ|õÐpéÅùW͹8W´‡_³â7Óöü“ëdEÃx;OýÉr©`8µMs»êÂR¤²—BEA?â†eºÓ¾0Uq‹1 )1UF±á'ص$æóY0¿à–NLA„͉ÖÁÓŽ°ä‚a#!ÈǤ— )à(÷ÀöÓÞOHöá¯`Åbš2”#´+S 'p┑ç<¿vóbÎ3æ1Œy&¡L¤À°>4Ý&' l‰c¨uç).~ÎÖî´Å#%3û9{¾s&xd˜ ÌÉÀ6‘ÖôLÑöâˆÙ ‚— © à€Y‡9%º¾öÙ!Ô«—¯×Êw ¹Q ¹Gͤ“¾GÍö¨™ŒÑ=j¦MŸºm¢L¨­Û[D)ÝéÕLuR™ß “éÌDuRŒhA :\”)?Pžº¢:2;[½Ó‚d>w µgL'EÝ’f®î}†Ü03Û‰Þž}(tƳÍnM _`ˆ=uRª›²õÍ ÏÖäø8,:c ®"â>Z“OrøÒ¾p×݋ۀ۴Ñ'«‚òб4;SÑûܸVŒ¨"óxü~bòx-ÞÕ-ï”›æ²l©u4Úåg›¨ŽËÃUÊt×”ª20"Wkê½}þ6öª]„KŽM tñ0G§H°¥JÓ-IÑyÊá½g÷V'ë{œïH3î²JSlóŠ‘ÃDBðùaÄöh™"¿Ê^!Ôã¨ué¤cs&%zUÅ5s\ÇC/˜fîŒßdßr*KÍ„°×9¢FÊyÄíÈÜ´Rüù¤s‰ûÃeh€dŽæ¤œ qÚÔíæ&Ñý˜!Í4ML…³Uùï“O”ZØëŽa4Z„*M’?Î&|mÏ;vÄ›î á®]7eŠ1.{&ýI'Ç%ÖÑm²ÅÆbÖ5ÁÞ_Œ@S½£hã] FTgŠ …L÷Õ9KNcóÍH`=Çøä=·CšÎ[Nº¹å»¡mç[î/–Öèkú–6úšÚß7ú’®924ŸÔœÜƒ7 o6(OLQÛ ÓýšíF ÃVç÷N]þ®Š`¡a—)Sþn?S¶ªC†|žä‰3¡ò¬A›\4½ñ×X|î4Õ@“hTHaÃÆì”‰ÃŒÞ!d¯pJˆy¤‚Dú%£vu pÁÓº‘šÎ«:`ù“.4EÕ…€h ‚Ï ÓD—ieÌÈšŒíu½-Ü¡;Wœ¡‰j;fj²9–±;ØWclü5üäýœ&x7²óùÚy¤P]M£ûd×Zù,dfÐd¶“‘S×¶ ûÈ8OÝ;siº/DÔrÂS^ªFÇ<>5ŒNet7ïmÅAÀȇ'“CBïTÕ“äE lìLû¡²+8ó“+î¼Ç[AüôáxZR™M¤+{© ‘SÕ¨$p"†zJòå±0êkK]U CàXBçù‚—©áH™ø[?xä 5 k=&®“)ê%Œ&Â8À¨BMÉNü5f§˜rŒyçPˆÌÙ&j>©ºæ¬;£)u­FoÛ”!ÌN§0šGW·Ó™ÒÕïÆGV–Œ÷ÌŒ.gä-|{gå˜ÌáS ¾üšà‡òc³œôÓ?ö°×‹Rƒ/ˆGgSˆ¨F'RÈ?àŒ®òÃ_Ã\wZâÁ¼Øk‚gÁc¼á¬É&k€K¢~éÙ®1­#wëí#õXûPgI ­y¨³n<ìNÂÃ:'L4Ã4ô.Ãñ8CŒÇ|1™„¼vDÙ驾cž`Ì+ßSÂü‚yŒ¨ §êÿ?2WÌJWnQÕü_Î*_å®buDäƒñüré¦ÃÆDsw;m·ÓDNÄP—LdЏ³öÊXß¡uì¥3ðâ=ؾ ;ô$.î/å_A* °fØúhƒ âi¸YÐmü5øÎPæ`¢¶þ&Ë2ÜéïÄ·âèîðÈÏ,0ˆÊ;4èÚ@Üø6p¼°¦8Þ)æFHq… uó8gÕ…;Ré†ÅpQŽ}sCiRô~=|}ù¬ tˆ endstream endobj 3947 0 obj 6745 endobj 3951 0 obj [198 /XYZ 38.2500000 553.250000 0] endobj 3952 0 obj [198 /XYZ 38.2500000 553.250000 0] endobj 3953 0 obj << /Type /Annot /Subtype /Link /Rect [153.750000 530.750000 195 537.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_memory_management_objects >> endobj 3950 0 obj << /Type /Page /Parent 2 0 R /Contents 3954 0 R /Resources 3956 0 R /Annots 3957 0 R /MediaBox [0 0 595 842] >> endobj 3956 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 3957 0 obj [ 3953 0 R ] endobj 3954 0 obj << /Length 3955 0 R /Filter /FlateDecode >> stream xœí]ËŽÜÆÝ÷Wp@-Öƒ/  ‘F² H@F'0l#/òûén’=ÓdŸËæá­"ÙM ¶ä)±÷]·êžzÿç¯ÿHþõ{òþã×ÿ$ß›ß?~Ý¥û"Kë’ã¯wo`Ë}óç¤(³äû¯»—äe÷e÷åðß—]ýÁ×=üé‰Mþrø÷ç䇿~øcó—Žá×]aŠÃᅵ~¯ søSzþýøóïþö‡ä·cípÍd.ÿÿ©¬ÍÊã4†~ÙµË4§_¿ÿm÷¾&À¸Q\é3“'Æ;Ÿ˜ÊÛä¿ÿÜýt í>ÝWÞ˜"÷E:e ÂG2y‘[¥‰·Yo Ó/îM€Î³Ê„ëü4suª—¹wMææÞ7ÌuE»@ÿ,-ÓpÌ=Í\*-sqïŠÌͬ¯jY€¹¯Ý‡`®¯²pŸf®N•†¹BïšÌÍ|k7@¢×îtžçá4·ž¹:UZæâÞ5™[[¨ àr_{Aþ2ÍÃu~š¹6QZÖÂÎ59{øÕçðoꟻ×ï}Û½ÿl|z¹<ùöÓarõ˜§ß¾ˆ’%ïŽ[Owø¿“?¦©ñJ¾ý¼«ö¹ÍÚ)†hqŸN-Ïß$ ¾ºCŒwuéGøM¿±¨Å>ã”sÏÚU9œ—‹E4MŸž¦™[×Y4“)òì4ŸWf×d+÷e•^¶4¤¾ÖR3Îï›ôì’=®þæõ9ꤡÖÀÙ©Åí3Ÿ—ÅÅ7Ñ›G-ºä²%±žçSK¶w¶4—ã”]âÃe0Kw¦Ó½qãiaêNŒk§ÿÚ‚¿ÁãÀe(wŸ0¹z”Åãe@gTAø†à-VÓÈJÖ|»¢êÆF¯yØ‚½“à·>·ù¶è¬MR¬Qغ`Kþ¡£=K¡Ç\¸úÆ3¿Y}×5!Ê“Šu¶¯øÝ˜Oãmìæç747YyÜÉí”Å+Ö5á«rÏ*ôï`„ߘ”FX’ÙåÝÁâ¥c#j?ß¾@Èl! ž\q¬i@Y•¶ë#Wi§©Ø¯c!!` Là“öäâáÂÌLäûZÆÅÁZ댩ʛslÿo„E»g±IxfÿAnÛˆ¿(.—;*£éiJ+8lÁÙ@ü0ƒgØó°¸EÈaή¹Bö˜É“C»&К‘Ì<³ÒJ^)–lÁñJ?Á–öÇñøäk ^´˜§Bo§Œ ´Ÿl°ÄBÞ¶DY]a²)«ËÆ·ã`ŸAØrêìŽEl+°g¬"¶<ª3`Vjp숣dÜ–È9ÁúbŸ[2<‚ Bô‚%û@Â^ 3`¤ Ê(¦(öµ‚`×ã ·§4XÕîÚÈPÏY)Öf7‹yJØ^AK`d%DX?Dô®ÎOñ®8jÃTÄ:CÄsL¼dMâSÝ`MÇß0^‰dTmMÌ»FEæ¦hcå™} q3ŒÙ% RŽÇ!v•8N£bÜnym‚ÿql§cîFÌ…`…¨[’›×Š!["Ú¦1}me¦HlÄ;楙eTßÞ{ÞÎZRí³–Ù}Ýv¢²¨ ¬g;Qámg^ Îg½'*e9é¼h•Þdѧãvƒg±z_¥SÎ)mÚ|ò¢}2“yóÂÉ Þqr´0'/øtÈÖ ÜÆñ—`ŠbÙ±ø|^çæñ78:ÄkƒÏÆë öÈË`ºáE]{€½xÌüOe§œ\R-³ËX¬ú|e‹ÏÜ€"îD•>?å¤Oùtg¸±¦â]ÜìQE†çÆÜÚ"ì-Â%Ï:#"EæþÐâ÷ÅyìÅù‘ubù@anÌ ¦Ùc”ù=‹Ã§ÄÌ}@Æ®Ü^HT]N9U]§¦ Yùí–ò-!ª8ýZ„6Gެod©Ù°óâÏ:ªüºe`çÝ0Ó¬PUFìËŒiƒbW3ؘ¶"û•¸ ›Á%¹'|/“f2nÞöoP®­5]ŽÜ°"`a,/Ü¢¦ÄerôRW›×k}½±_iÒ}ó՛̕–&rÌö€ƒúF§Bß4‘–Éö5ìÉ›o>ÃÞjÍ0y˫ז§³!«Ü%CjI(ö®ô4~Öx]ãB 翱ðŠ:ðanuT›ï]ÍžuBŠx™ue¼€³!8/ð÷–¡ŸÃÞ0¯>BŽ@º¬™p=MÆg”ìáq„` {†’ g-ÈäÓ[ƒf7NËð8µS0n_˜jYÑŽ“vÆÁ-Â8PÞ{‚mæ\x<Í&=_ˆ†Y‰}~fT0Œ!+ă2¦–°ð c ¥G `âÍÁl —!aÁ61ø´È’—cˆ‚¿‰…ÒmeÍ0qW¥ÁBoX£°*÷žjPÉI¹ŽUm9˜ÇQ”w‚ Q"¥­„§;¶è&EcEsD€&zœÿu8ŠM±¶]Œ²0žy &ø¶++MÇIR9€é & á·‰w®Æœ^,ïá&,W8må-¨œñèg0ûIÆo뾌¤Û[O"G¼LÅ( aä…h€¹¤HÄ ó¿á»ª'{„Br‰]‚»5“ú²»ùcε!½vâqˆ¬†ðN0‘Ä1•Γ‹øÌ‡8w¦ç‚µ%®©R¸Xç"˜ÖÌuõÉ%Û–¨,ï âÃk™-íå4”J-q îSÄ S¢¡tˆ+ûÌz"og.RÒ© JÏ@¸X.^œ9{ƒÌß™6E¡«”1´í]€f`@ÇÙ)ê0¨FÄòCçªËQç¶/Y[¸¹dm X&<°¦ú¬cy¨RÀeDÅXãuzK<CA³Í¾Ò¨öåüäè’á »7¢CRÄOz¦ôq,¡.84O­T»±ž…€Ûž9žò“ž%\ÀóbºÏX®Òó O…­r=º‘„®nÞ›µ‹9$¢ÚÁIJ>Žž)ƒ‰¯’nAžÝÇ…UÂs­ÓB.Þr¡Œ‘8Ìì9ñé2þˆ’ÝËÅÔ¡8S°…ïe.ô¨xXf³òk±íá¹GïŒ1³mY5 hs•ÑÌÝùkለèbÊen¦Àƒ>Ž­¦·<‘ 1ƒE¯tZ릜2Z+ìä˜[Ø'‹g2 –1lkæ¿GœÖü‰$!›ŸJ·üšÁaÙÁ7gásóëi,ÍbøƒOãb< 7gÊ«ó;I±òLªöºŽTÅ8Å0¡ØûQPÇ!=lÉK—+Jð^øíšÑ-¡ÌΩ¢GzÁîqd” (c& Š|Ò Ë« òï-í¼N°NÙ¹ÇQN¹€ô8¾vKñsš±N«C7R åùi¾h¯}DBüƒÃàVðÚ¾žA 0zpoxÖ¸·>¢<…®û1Ì$H ·ƒéÝøq0D˜îzbᲨdÁ„¥Ç‚ÃÖg]dÈX*@µ!üÖŠ6ë¸KEÌc­³¿J¡ù4Px8¼X¨‹ü# Û!Á"Â4 ?ílad•8ØšHÂÿ%À•WÚ3HÚ/ÒÉ*´ÛspƒA_@×WU¶ëúnWÙUÁ Ro/bkEÌMÔ#Ž1ÇÌžUx8 ªÐ[o²=X@9Tu§ H&ô‰ƒ-Q’Åe5iîqþ¶„ùZ¦GF—~8]™¤âηÃé%Ø€uÊÎ=NWvJ]äãøÚípšÓŒuZՅ覟Rªg1x` ‡1r ¬ö´–AP‡só˜ªVkÓVi—Þ]¥]¶ùÝ­žN?"ÅS Ö¹…øÝ|Juw“¯Õ"Œ“¾ JŸPEÎ ™>T ‡Á¬fó5XŸqo„ÒµëçËż9#Hâ7Š£Ïe>¬gŒŒaÊ3¸Ý„Å1н@‹bñJ™Ìá…è{:…¿=Ònû¬Ã_Ê \æk*†t-$ê ·bÎ0åÁ[yMüòšHöžª8î.cÐŒªS(KT#1µí[à¬G„KL€ÃÔPŽ©Qå6 (}Þ±”wºYpêÜu§tÌ¢ëán/¢gêöt Æ:1®HÖAPDƱaÿ¢Z©\ŒÁ˜s‚nѨÃìÿ#Ü`%d“”]±SÇf`ŒSŸ•(’hFÃ+"TºaX„üâù7eëÜÿæywLÚîPw_ 0¥Î·Ã¨0›]<2Ò~ü(Lƒ]IÁ¦zy›ú%ʹª€0ÈŒ Ô”­gmlÛt‹v2Ôéi4ã O «E¤Ž‡Ã ‰=˜ÙŽsdL+etW Ú'PÚX*PÆ*¤vë& þ»Á¶ªî†yëùÀ<Ý™äëÂU Ž`4+! ǧÊMf/…oÔ áÎ)s«'w™^Lq¯sCFï8o÷¢Wz/ÚÀq<¾ÉŒµ¯ÚáÆ4q±UÔ{ O­w5<AÏðÑ¡–(«³v ^ŠrÝ6Ss[„ºmlc™lì3˜J.Œ™³R¦ÎMè Ë?sCûZØ’á0Øq«¬C§°°Î1r°Ê›‰Ýt±Í0Ýû&H"¦{7Ùê8Ì/y„ÙõÌo×…ê¢B—ª¬Á•8zW­f¤WK)×Q;ËfvJL9åßuÑqðJ™hŽðïÝb¡ãà,UL»žOB Á;^¢B—ªFSEzº·(i5†ÀdÀq•$Ö#ä|qõcD„—NBxXeN]°(DæOˆÆbíSViŸ æU®‡±·¸ÎyùWg§<Nµà ³óÃç8F!dL@`µ’ø,±pnƒµ)fÌ’OöÔ¦ÍFKÔÁ;%áô £„Á¬s‚¼a,Ub¿ºNžÆBR‰Æ9â-_d¸kÎÛaé‹äw—,˳'T~7i{Ï|ÒÛo‘¹RÔú ïZpÚXøCÂýP]à|ûŸÁ›Ñ-Mƒ·?{·%™"e@gÄÙÞ›§ÌõÝHß µ ½ë.ñ5£ðP¨»ÓÌåÜX·Ñ™;Ó*E a¤÷ϯÆþð+y9XuÑèú 7x…ò*xÕÁd¤æhþ“3$os(vín~Mõâ më Üî­);5LuX”÷[—g÷ûyÃ]eÿÇ ò^›Ûçf¥=Øð‹†ïZ §’÷؈Ƶî‹e¸² ƒ{ƒß4jbF-ýÍFVàŽ>Ìø2ÎÆÅw£D 9É%M–ý ¾–v½ „&ÆÁÇ+ÅÒ9n RQÔÁ³.§KV‘º}c•.D p:MKcŸ‡lsòe÷7D endstream endobj 3955 0 obj 4486 endobj 3959 0 obj [199 /XYZ 38.2500000 608.750000 0] endobj 3960 0 obj [199 /XYZ 38.2500000 608.750000 0] endobj 3961 0 obj << /Type /Annot /Subtype /Link /Rect [55.5000000 587 119.250000 593.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_nan_exception_typemap >> endobj 3962 0 obj << /Type /Annot /Subtype /Link /Rect [89.2500000 572 172.500000 578.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_date_marshalling >> endobj 3958 0 obj << /Type /Page /Parent 2 0 R /Contents 3963 0 R /Resources 3965 0 R /Annots 3966 0 R /MediaBox [0 0 595 842] >> endobj 3965 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 3966 0 obj [ 3961 0 R 3962 0 R ] endobj 3963 0 obj << /Length 3964 0 R /Filter /FlateDecode >> stream xœí]K¹ ¾÷¯ès€m—¤zA€µÇCÃrrv³ »‹89äï§»«ªgFÕ«ëkJ¥êQŒdœ‘K¢HФ(>ÞýñËß÷ÿüïþ݇/ÿÞÿ0üüðeWšªèÿ³?ýùîå/l{þ¾oÚjÿï»oûo»Ï»ÏÇÿý¶ë?øòáÏÇ¿ýoo÷:þ÷çý_ÿvüåÃ?:ýƒ_wiŽ?9ÿìsü[qùyúý¿vùÝþ·ÓŒãr0¯ÿÿw¦sÖv'0f–þ¶·iÎþûÃo»w=–­âÚº¬Ú½)]¹7]i÷ÿùÇî§ããôÅ¡+iê²)îY¨±ýJÕÞØî8Sç& ÿ(M`ò#ÂM~†\+ÆÕFž]“¸ë5!Pô<}€É»"àägÈÕ±2Ï®Hܦ(‡£eRREÏÓÀãl8âö«ce ®0»&qKÓö:­ª¢Ëô!&oš€“Ÿ!WÇÊH\<»&q[gz5u ]fþ®¨ÃM~†\)#iáäš”í.¬Bᾘ^òÖ”íòP W˜]‘¸­µÃÁr.þ/Ó‡˜¼ªN~†\+q§³^2 ¥ÿ ¸Î}>|ÿu÷î“)Oöi½ÿúÓ¸~Íó¯G¤TûïN&þ9_Üÿ¾(ܧ?ì¿þ¼ëµ­Fû‘¢û=üÆ¡SÃožàÈÇåë88b;8[K|óî´YŽWÂoàˆÃTÀ°Ábj T€ØÁë|ðÀä^×ãàã×ã‘ ~š:3 ))ªå#Â:Mþ‡œ$P RXÀæ>Cð%œMf§K.xž…Ù ¬d>øÔ‘ C@P‘·Ö`pã@€€á*È££X»2§žÁÖÈÇšEÀ£?ˆu !ßNÄx#´¸ù>ž«Ì ¸Š¤Á¹Ž¹bu¹Ž5¥` –¢À—ð¤ ö:c-ò sy¿Á#”þÀZ‚à7ŠÛ[Õþ¢ ÆŒÙ)cÍú]Às¶«ßCcÊuÛÝ#×á)qå0W0–§p§BPF´Øk[¦sž#0¯_fË[„gôÇ&ñVàW¼SÂSŒýTeA@ %¾`C>šTãQ©ŠDjYô"µ nd£¦®ÎðøÈmmW¼¶vm¤'oy(]Ÿ!𼵞õÜáø·¶©¦Èm}ڵ¿¨Ãù_´ÜNQ¢g<`‡çÍE ™~ãζæ8ô<‚¿ÁëàmLP] ¸¨|\ Á…‡ue¶ –0ŒÂŽ!±6˜ì#âb½ËP 9F÷ M6ÈðßôÄA\Ø–ÀARaÇaŃ2ƒ@6ÀP'ÀT½Qc̸Õçƒüqf¶€Ê¬²¾6x½‡³¥×-xž›ŸkÔš0%–…XÀM…Õäp?A h›PùÄÑzÃzœYGD>y(¾X hcI1‚©㦠0‹)ˆ×Á;…2Mà.È)Fñ~ØV;ŒŒ‰)0Æœ¥Pñ™ÂtžæÕåˆDÁÄ–*—Ü!-Â:21Χ—n8_ú.¬ÇÁ“ã@¨JF ,Ç\BâJ¨U1¶ÕÉŽÅÈÄÖ€ÛŽàbëºY`Òµ1ƒ*¯ÚCe£â¬S ýç -GYyª&ˆpq„#ø¨Ø‚+7ù»²KŽ1ËgÉZ~"Œ.ÁfZÝæÖø¶G¾)uc^óÝ÷6Lþ÷7“rx=jï‚~êÍQ=®ÛôâÄÑÔËÜ9 º‚X éí*_Ãb‚†%#(¯ûL°º·^Às«fÔ¦ªØZà ,ˆ™:('B>+㬌IÛyÁkyÊOv˜ÿn÷ÙãÛ€?|XBúaoª—ß‚Á¼Oßõð¥o#ÒuzÉ5—q2¶F æ~Â:£¬&<cb©A‹àuJ§%¯þàè;jÐ׬•}ú²×Õ>v/_Ë$ÆDæÃ“,è˰–w1ÿ©¹TÊÒÍ$±´ŽÈ¢Áq¾BžŽÇÇGGãupd{¬úé —E1âÛÜ“7FÕE‹Xù«¹«ò%Qˆl¦¢PL,¶wUŸY?»Ñ2µlpN2Î>%N7Î[18/ƒe„­Äß`9uƪzˆkldí(hG! Cqù-Z®Qg›4};Y~ŒÅ#ŒD¬3ÒÞUQˆÊ&ªê uý˜ŒHÕÚTÉ[c—J2 Ø\¹ÖD®5!ˢ²¯nÖ‘}qvw©Ø´.¤íÞt×À´½´+/`yzÅ¡ z&LŒê`A Ñ¢o†Kϵo:ôÍ`Êwè_£_Ìfá~zh}p¦Ç»/ì–AÐ !SîÙ[ èJsp.ÄÛà·=E_vîÖÖ×xÄÁ‘A`ሀ·'¸ˆƒX°aÁT˜å€‡Ù9ëæAe]á*vÎú+ Êlv‰ó'¬ƒ÷ƒOÄÎ` h­ƒ)‡¥í{æÌª2U;aËaŒƒ B%ƒ5©1óݵc¬ qÁç ¼„ÐLzó˜Û¶fnßZcý­ÁÜüºŠ¿ž‚/'Ñ›T˜¾ 397±"C˜(ÇL:)S!Æ1èùËLùkè?ÚV§žRû£Q\¾úÅ/»/ÁºJ!Î=ðšuëٲö× ‘^U!*°.YÖ_¶ s‹ÃšWRªQо±e0ü@dy™ú"ØÇ¯/+ý˜ ½]˜Q¹LD5“ºôv’`g³ÝjÉÆ¨ØËšõAæ.V3fíí9…±òÓ°SABHâÖ5äpÙ·ñÆ Ý0Âð2YÖ.×6Ä¥/³Å&I9ø² òBW·)œ/Tq8~†æ[Þ„ŒC7•ñ6GñöœµÙû{ÐÝvýˆu?£-T VÊdfÌRF+¥Rè3¸ó±9B·\ë^)¨d$¦´]ç$t'bÛ3ëÊy1V«YÛzÌm`$œÐ›‰‰ˆaº6Á8Á ÷Ú:8âG^ÎÅ”]®^x)¼‚«W×ÔÞšX».©ŽU´F]]ªÖRÊuäT=:Œ5¸©š:±| RÖœ()ÆŠŒTT5û ÅÓ¿À§ö`¯ ¥Ï=dT­›Üã‰d°® ô›4,:ºu?<ÚQŽkæ‚NH„”KåWÖ”DHY!A‘rÈy­ Ó„ÖŸ£ËíÒ3ËémÊéUB*Mm=öq~E>Áqù )AÜ—óáƒ'”œ1r‰tíË_œâÃã´ÐkbPm|ðÍÍ—h˜[•+(Ær2%«“æÙÎã²_w®­|¶‹¶zÁcÈ”-¬ª˜”µŒ F¹P¢ò‘êTÎ×cùqæ‘gêñ¡ÄÆ{œ©Û‰i­rYXð8£´€ƒÄ¨cM<šL C3Ó¯î>‰ç`œU¯;,Gj¦„Õ]é›ÙÖu¾œd,¶!rÙqaÞUxf¾'.~—Rmx˜ªÝ„ƒûÜDíUΜŠ*Œt­¢«™†«ëG/öy.ˆu'Z„®Öþ,bIå¦hÆS¸°PX ë&|ÃÁqA›¸z3Õr`MÑER.f=¨§(1æ®BI«ó.K˜D‰ÁƸêAñK$Ê¥ %ñyÄ8P-M ‚‡J·P°Ù"vpQ~̘«‘U9¿ïÕ1¯[ʶdŠ]2'=uѸ7G{‡Ïp, —:Wtw5oÙ$W0VŽ Ù§°5÷4à ŽÏÄÙ»àZ3Q±]^Z2r7(<+Üøˆ“Vbˆu„×DBþ¦qÛ·õ=Å¿)® î^ºí®°¹1¿à†XÎÅÌíOáÐ4ÂÙdìUš®ïmÀ°U˜ˆÛþR¹5g*ˆ°áV;øÖ‘†Ý×ÞSŠ?e; ËÁÇ;Y¦©Ãö€2Íã»RŒÛÞLΫNjµPTÇèÖ`‰5¸€Øqä5‚“±ÆB†ãÔ·ëБæ·ûè[\½¤„r„ËD¼0ë8`wW¯ž¶ õyd6 + Ë¡êÔ ¢7BªÞ®Š+$©< ,- ÖwOðÀ&#À…p=¢ô‹"É’Y­L€Z¿·9CôVâ‚ø0Üž0Jév&ù;p09(*„úÓÊ5šÖÏwY+(º†waƒ[0jq–Xd×ÏÕ{œ4—ª°ž–Ô-ŒE–ÄÔ¯T°à|D*ÄåâSãQíq²ôêªó92°Z+ç˜IÑZßàIèD3øcËp_Œþ\Ð1fRUY™×.òmÄJÓRNKù¹Xkb¸pùL†«0åð:ÌN7Y(?ÔÆæ*¼œ¨„×Á³Aš2Ò%õ´È²™‡g»ÇeÛݳ»Mj ”¥¼†Ÿp˜H2Ûo $g/g‹oLĄ'è=ÖeÏ©†ucÝåæ$‹¡Æ‹­)lË6F íF,k,þ‡ËAØJü ¦¶(ñýë], ¦Ì:TÚ€k,½uSFñNq¢ ‘Ð%ȃ”m¬ù7i-d®RçªXaǪœ¨›’)„¹3åZ"ÞÙ+{OÒˆr 9Æ/ÆU¶²Ò¶²0lÐÚôĵ€7,¹°ˆe§j‚'Æ(æQÁƒõæÑH–¦P{“”Kä–^ÞSv-šÄgnÜP ~xÆG”µD։˚¬%Žß`Ÿ)à€¥ 7Gx’R/"TÕwœT‹„Ÿ‡´.î*s¶Éw¹\žE<Ý«—gYßÏ•À«X~|8\>«ÚÞSÂ0鲇Ð.aä YÈè‚|SJঔòk"~ÍvDAÙBd!Þ¦)† ÖkÕœ~£?Ê{ ¤æ‘<’GòÈFÖ¿åx mŒFŽâ‰£‘ëtÎLÉ#y$dœ5òm8H 2âË`ÝÜ“—#‹ìá¥PŽ)r,ˆÈ!Û¤\ƒu·‰¼¾1˜µDÖYKÜ¡%rÄ`Ü{Ac¢g©FKw5¼SƒHê¨vw5yÚT•úª35™[sÙ(¬É¼n½L mÖßÃên*ÌHUp’š MªÇ€NÉóör­TYÑæfVÔ-s»^ð\ƒ{‘5\í«¡« S0µ¿±7~t “@ê–†eú÷U˜‰F¸48S,V8 ®™>hVî}½v#ðØ[Çëø²5f¥Þ¶.GÌà *|sÃuK‰·Á#‡­ |7gZ—ö“.˜ h9A‰}6"ûNhõ‰aƒô±øõ˜àjFÕp™¸ý£qäS;æ˜fù$ráÅβ&ËšÔeÍÛ‰™ÒåêU‹ÈÈg¢©ôôÇŒg¸sã“{Ê]žp£½ 7“™¸ˆ&šHŠð}—¸> ÝKp7ÂÀ­›ñõ“q@ÝÞ”¢WÿVøf9ºž‘GmPµåØ¢^»ÊG}®‹_à>Эñ”Çã´C«lçímýNñÔã¡Um†œ5VÖXkh¬XbšiQ.¼é¬Ž7áô«¾AR¸&N †-†‚E¨«œ¯0¦æNYXC \Ï &“h2§p>…†˜ãE§¶„¡XÑÞ©‰˜ ¦t4¹«A)3† Ÿa¦-mXûˆ"˜jw]ʰ˜\ ±Deâ#¶©†Fð$VaˆE¥Q(˜Jíª&óàlŠCݘ×>S‡F§ü"J…Ù0g3òDx0šˆ°Þ`#E ç³æ'])4n´7µÉF»±‚jñÓª D<Ý È©ØÑ‹ ¦Jw궺#žå3ÇÇãx!Q ‡¨àG×jùSƹ„ÌlÔDÐ[Ä$«¶pù4¥tšÐªåe²fÉg!€fICvÖw.”ÿxD8L)jÕD3&JØæ Ì—8¤°áæ*ÂÙÄ¥?{c›w * ?f¾&’U…³€KÍ`aŠu`jãâD©¦,IÂú‰£Ú± †®6t:# Žim‚Ô‰"~—¯n«ââ.ŒvešN3ÚÛѺeº(¨!lNœ ÒJ‚ØEQd)ÆÒ,I7ˆ!ÎsÊP§|cN™(Ù©9ÆŽ®ïf›ÖX^c« pß6¥PöÛ%î·S}³Q/Bª³a¨…—§òIùiM{YÇ2ò1K·d5Pá!8è½7=…¨˲ ¬”jÍ!­K5ð† (â¡TÓ„ÙtS/B„üi•br|W~¸rMQ Þ…TUçéŒVÁ‹Ç}{ê £X8mpë‚%9º·’êJŠØŒ‰¢ZŒM9ABµ'“Ì8å”ÙYË¥ˆqc|ñ—oŸ±oŸ!“öLåÑ7B¢ ñUªNòÏí¦†`ï/¸Ia3òÍd>¯,LÑ眾¼Ñ?LEcЉì%Ò5ƒTÎ_3‰›ÅD“¿Å$/°4W3Otó¸”'z€¸éÜRÈs~$„¯ñ]{nOÝZ?ë²µÅeIì¯Ã iuY-8–ß —ÁaJ1Ò{Á-=DeXKÅýšïÇP±uéímõRgIJ›®`Dð…Ô7®ñN~¥cÈËX½Ô}„}1ý=Ÿ¶ÃÊ‘y²" 6ñú¼µ¶Ê}#&ì¸"˜Zî¹÷­[>»ÊSÔŠØÓ¢µMîiq/3=-æÔâP¸³³áÑF„ŽÔD²#­$i¤¦¬›”åÿ›éV±Í ïõ9ñíô3l!¸SÚ˜ ¸w |ýf¨àp s›!,3}ÄSBH$lëÎ&¬lã»çb„«[fÊÖOö4l°Ëù ëÒá±X#¹_Ÿ¸Nî×'Ø·ù¦¥zU?_ –eœÈ/ ¿_l@s+i£hÅ ò[Ä{‹p—RYYмì-âøgÿíHJ‘ÒŸçþÁ ¡/í56pÆ s eÚÛñEðp\ Õè±Ð\‰Wè9Áì¹!ÄTvÕÓ÷4|3„R½ PÁµ“'´Ž›KM»Û§a§(³§•¾ÐÄ9ëõtƒÃ‘ÂùÚ8¨çÊ6 ž ~3„û˜E[ožÙ–e¸Óß„¸Ã#ì\÷‘k¸kº¶w¾ LøÖÁÇ;ÅÜ)npŒ9ƒ u{?g5…; Ré6Ãý’Ïs²yÿy÷Mì¤È endstream endobj 3964 0 obj 5432 endobj 3967 0 obj << /Type /Page /Parent 2 0 R /Contents 3968 0 R /Resources 3970 0 R /Annots 3971 0 R /MediaBox [0 0 595 842] >> endobj 3970 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R >> /XObject << >> >> endobj 3971 0 obj [ ] endobj 3968 0 obj << /Length 3969 0 R /Filter /FlateDecode >> stream xœí]ËŽãÈ•ÝçWhm ÕŒÉ 00PÕU5À,(t³0¼tûÃm¸ìÅüþP)R™ òÅ£Á N¸3Kãyã>Î}ÄÿùóÿþòïÃ?ýüÏÃ/ÃïŸ~~©Žm]ÿw8ýüðþíŽÃ߇ÖÕ‡_~{ù~øþòõåkÿßï/ç~þé¿û¿þï ÿÕÿÿo‡?ü±ÿð×áK§/üöÒª¶ÿý÷×ß]«ú¿ªËïÓç}ùŸßþqjqìnÌõ¿PÕý_ý0ºþþ2NS½þüû—¼üx^€u½çlÿ·²ÆNŸþõ§—?÷ŒÍWÇÎ*Õ6¶­îé¨Õ§ž´î›Ð]ß«Q“Ž^dšÑx]Glüuäâ«¢L£Â­KnnSÙ󵕉°D—æ#¬gª&Þæ¾Ž\|UÆÍÅ­ nn×4Ãêwu„å¿´coÛÚÅküuäÒ‹2l-n\rgøZÛDXŸKë1¿'þˆŸF.½(ãÎÂÆ%w¶3ÝyytÕEX Kóò«ßUʶñ¶öuäâ«2î-n]nsûêÆÍpnß5csmÝ#_•óæÎ´þuM+x(çO€ºÿ=ðâÇo/?~Q¶§6Õ¾ý¹ܹÏ×_ßúE©?œt|eß~=üGÕŸ¬ß¾ýí¥;6º‡ø˜O*Ÿü[kЭÑûaë™8û®ÁgøÎ¯N`ˆÖªOë÷TO:ØšƒOà; ¿ƒÇ†w¯\QL‰Ú£ì±ÛÛS¢»`ð¨ánã³mਇÕùü­Ñùº1ÙðÛ ø:¦1|j!åÌñ™'…CæÀ!UG ©Š¡^Jº¶[so‹O=¦Q8FJ}…;˜v*Ì-ñŠbÞ ×-ЦQh Pzìgit‚Zg#sžç £^“7¯1¸8êÀàù¨4\¨Pâ^)‘Ñ¿°>™Šª4î'çÖbài$«²‘‡É¬Z†o@~Ëp'ÀòCØ~0~›Tîò¡raÁƒùêO騢î¿Ë>noÛÈò—À;°Ÿaž„±>üî‡ÀŸ’Y0øÔB2 íhI±,8I‡y´œ D¬ÎVgVçFçÒÅn›úu<þ⺣ëªë'ÃÔæžœÉÈ­9Gbû‡¬>íÔ­­7ĽíP…¾:ì9Ö¶qíU#©†ï´°ŸfýÔïà©ÃÞK¬ð;xuà;ƒ4Y·fý¨+¸nêƒGFyÑø_ÅÝà‰2'€ ·@kpãî8·qÕ,c:ùX(uœË0üΦ‘ãš®õf½‚61[ iŸkN?Ûm(f¬ö&­œ4>xö˜ÝÃÖôyÖJ/á² ‘Æ´whkZX¯†çŸ: ¥I¥Ùc}*þ²jÔ9ƒñ(¼ UáÃý03Ýe,…bP~Ɔ‘“‚{Êpå1òÛºYOàœaë~éIšÙõ¿ï˜Ý.%eÑ3qdŒÏc1ø¤2¨á¦Öð<î“—?Z\Eײ(?~î6ñÈWèºÐõëŒO‹¢Ã™èO]ê|³œý“©| 9óè}FëoOU)ãÝH–TñÛ„N°ÏÍ JõiÖZ8s)Ò0‰¬nUêÂí¹êÉjQ½³HqnîÈJNÃLêœ!&ÊsÒ<¬ž¶ÞCüu*$”©²‘Œóà:x>D`ÀCèÁ8fk9¿ƒq86‹ßÁx Ö¦rö¼bê-?…ðPM<¼§x©b^³¨Ò¶ùH–ò¤<)OÊ“|žloù•LÝ"'Œ'SbÚ‚{¾ìµò¤<)OÊ“¢-m!ÞÎ¥ŠïÉÃ_à*—Í©¥nŒÔáõÅ4VÐä ÐdŒ±*ˆ}t|¸ÖuÃÜã̘?‰â²xE1âì1&8¾,rð7ìrçc=Óp|Ý^÷š%ÇöDcŸ Ôxþ&:¹H–"Y2çOE²ôï`tñÕbîB¬›!¢¬rWröžüÌd’E4&`Gâ~˜ÌrÑQ'¥Šæž¼V 1Âr·FdySuÉpf-Æ*2°ë~6§;ðd—˜žOα½%¿2¨‰ØØ>ïÓØç™+·fäâïªç»I«<)Oöû¤H–P?厔½Þ‘Rè-ÔO¹ %akY`}N›hÞ'ÐÙ{r“Ž´½'v”±¹~'\5ޏC#ñɲÛKРЪ&–ˆ¢{ Ò–*Ò(¾ƒóRqÕ8"c5çü×R©‘ÛU´+• ]?"]?U¥Æ®Kɽ}–Åa<¥Rc5žrÞíR©1ÝŠf€•?ÍZ?`¥Æ®ßŠ"«WV—h® è-óÈç®2©#Ÿ°RcWÕ©#…Ÿ'~¼ä,U9ä,ÉrlH!ûİ·—3¥ÒÃnõ´´u¡ õêÍÖÊȼNIWµÉï!*ai5ùnqû»<ÝûÄŠ7?n‘¨™ÇQ—Œ°É¢Tê¸ãò¤<)Oø'E²„ú)a%#ìé­d„=YFX§Lê{ÖæYuªÞÍHÝ=±£˜ßanÈ8ÂØ–hFØ>ý]ÉÉ,9…®‘®Óæl$‘®ºÚCÅå@n.QFÜR‰Ï3–‡9Kq¦qÉÀ}ª Ü¢-pÚƒI#YÌŠ9sÿc»&ŒÐ:yu¹æ™âoËå΀ …ìsç2±ì.ò7ÊÍ2EJ)Q¤ÄR¢Ü,“Ö·¨›{"ÆSzß´3â½¢.mõÚ¥1îzKTulZåÚzBböhM[_M‡ž 뎮«^×ôískJkÛÜØÏIΠCýTõë3v39š3ï D>×Úy¦î®ÁV¸yÜl 5<¸-öóÅa’z£E5¥ÅÆNÕ´ÇSÿ]þÝ÷æªCÓœ~µJ?mûOêãù°Uã'¿¼4ö¨Tœº|Ë\µbÞ÷Ñøwszíà½ÝÔ~ý'ý;×#9}Ë]µâ®ûøëËÇßE:…n8…íåàb£mjïÜ`J‡›ŠÉjPzêñ°OD§ >$/£¼¯ú˪A†Fœ9‘! ª›2G£Òïx–Âïà~0?…{ŒûYÙü­¥úc¸'^%K°DFgï``u>Ä;ÊM”©+0j‚Åã±mv°¢HѸºší´Ç³KÈBò…ˆŠqcoDJè˜+Äi€mÊ2Tx¢ þöìÏp>­à·ï)ž!>d&*¢(]¢Ä¸|Ú5­¯[§-²‘GuªžçQQûì|¹‡>Ö4 ‘«_œ*ï@‘ûLT癨nÖDí&&j7c¢v£tlżïãb¢ºYÕMLT7c¢º‹‰ê®LT—ÐDíR›¨òß1Ÿ IN ^¢ù5R=÷ë-gÛ6/1ƒAÖ::Ü©ëÚ[m¬NÞnä3XE€_û3Ö“”¨†+ŸÁ[ŠW–PR)ÛžQ',qiê1=]çÝÌyÞVÜÚ™Ï8e†ˆÄô§m{3RÖZË2à«°ŸÖ@k˜š:>{¾98ôXˆàC2ápø«p•pÇE!°“#ÁíH²ÿ Ï/ž &U«×«ÓEI áCc|b•EvQÇžac·sIFåI…pYCœÔÉnᔎJ€ˆTG¶'5–-¶+š}7‡Jh«k”ÐVs(¡U>JxúÄG _¿e®Z1ïûQB[Í¡„¶òQÂÓ'>Jøú-wÕŠ»î#>JhUr”ðvôŽq%3ÀiK¶F]M ÍÇA<°JvaÞŸàQÃÃr;emA&žˆŠh’ÀeÕÅì…!öÚüR¬CWb­û„óaÈ ÙÎÍ©ZkO|­Àd(t3è9WuÝxó-ÉCY$=Û/ÏtÛµþ™ÆâêÂ9T¥êÊqÌð8fsLVî@.îסÁÁD])Ù:A‹ˆÙ‹RÚç/¶†ê–&¡=LBÏbf‚I˜LÂ\Pˆ±ó¾ &¡g1 =Á$ô &¡/˜„¾Â$tBLÂLâñ0‰™zp¤à6ìA@ Ü|ŠØ<ï¦@ E ¡ÝoR+2!§›ØæZ7±íœnb;_oè?™è&§o™«VÌû>.º‰­çtk'}Ø©nrú–»jÅ]÷‘@7©Çi˜ô{F®¬ˆL(cÕªV“©/zV,J@úb´++“ŒÜ/7D&ZøÙ’Žæ(Ç2Aaù\¤ý.¥ý}!›²î;,¼˜JKÕzâ,EÇùp{ª Á weŒ e +*s(m7ÔÈl‚0†AH`X¢ô D4X|±ÒAÌhîV{⇽0¾Õ)¨sô´¢yÙk²!ÍŒé€'ÉÇ<"V»N(•P¬)¶,+Ř8±Í¥2Æs’ð&X¸™ÔÑd²a0õ(°¥ƒd"Š—klÇ; Äk7ƒRYƒÅœ“ÕI%á%ÒÒdr„U%J\BÚw®ÄÄÄ?›Æ±·³ aS³‚‘ú‘3'•3/·›Æ©Œ¤ AX¡œÔÙØžýºè×·õ#Za(@ÅŒ†]lªªžÈÍüõˆ;-fÇo—›Ûc \[–­+êtPô'Q|gÈ"\e.etÁ³ ØÄ^\rغåÁdxE‚´•º2W¡¡uegBCëªñÂ6OŸø¡¡¯ß2W­˜÷}Œ¡¡u¥gBCëJMúP“ÐÐ×o¹«VÜuñCCëªi&UÚJqšÝÕ_N³ö.#Xî’*ÄŒÿ."‘ò·²ed£G…Ó\,óÆø…¯‚¹Þßns–qîíR¾nL ¶í¼5d*ñá€pŠ›‰žÌ‘j¬çÃE°a¦ˆQ=6Àðn·ÑJBBP¦”JÞ\„-ƒï.…±ÆŒp€¾w|¹ð±5±–¢üEö†Zê‰íQ¼TîA,ËÍÙWäÂÉÛ{'‹Â‹ÄG=kÝÅYB†`ŠÝ/Q\䋚lë-ã“_Ô¤¬OV[!-"CƲwll¦flvéR±*B*íÏìBƱ Ôý Dà™,^Dá+blå)Á5ÝðçZùBD45(Šª¶îpIdºRÉ£o鬶yœn²(Él»Í­K†Ã1W†§ÊI(µ€$[¬Øbg[ì$°ÅζØK`‹½ l±^`‹ l±“À;Øb/-ö*°Å& l±©[D, (EJ(¹9†RˆD4ˆjä;S_˜ŽåÅ Wãó Læ”¶bF U`‰WÜJÔ{¡ˆ*~¦_í8½°5ÝÞÌ6›øë\¢+4X\K@ÌgàôµÏÀ™9ŸóïW;}2ñœ¾e®Z1ïû¸ø œšó8ÿž¸Ó'ŸÁé[îªwÝGŸs÷X0 <Ž Ã-Âã”-…órK™´à›k¤±ÉާŽËd;1IG{.«}5c8Ñ… ôµ ¯„óÀXŽ8,Œóû,¶Aqß÷vc÷Ýã¦ø$K:Ã0µlùºh/äa ¯ ¦Çd²'Ò.×ç‚DN»ª´¯ÓaÍk:ì*˜C¥ZØšl®ê±4Ÿ˜ ™Òí¼$…Ý®ÐL0‰Ëæ[‹¦¹(òñÓÆø&Õs SùH—ŠžkiÏ]6ÚŽóäìÌ%Ä„¾ÐJeµ_ìógâý ]Pæn²8vv0:G"u!™¢Œ¡:YÅr³$YÆØbŠïbK€{E3üE.LV õ–Ý&91S|¶©ÃOº„†©Ç^Së´·¥ë°> ŸE †)¾#l.rôšê¼½Ø^…ÚÒ7¦\ëÓ¦H5\;€©¿×ÁŸ5¾eI´,~ÂLý„ÖøÜŽB™¼cÆÓ†aN¢æ†R1Àhð¢<6Uy,ª.ÅŸ¯d\Ä(kÉÀ{^“(ØîÍù3®±aÁä;S7ëb§@"íÏp4ž¥eâ~°QŠæÞa àûûQplØ¥• ÊÅJ€®‰±•Ó˜Ãi 'pÔßNÀà'…vÒél—Ö=dµmYw^k&̯5!Åú qNN5B_Á­-j%ñ]Hr×Ã\ ÈÖ.þ³0·¡É9½cýy.|P°,jsÀ Ð­óŽüs{*ÍpÿÉÛz<ÊåcbÅ —ÍÓ®ÕãB@ F ‚™‚0Ñbe«¢Ê­ìPQL¢Å®0TiqÜQ3€ñþPÑÝù —UïàÕIï”S’Ñ)I ]»Ó–éz -„I–éÖ&µ|ºìIÀ@ðKJ«H4Óœ%0—ǧWRLtžc-Ùš³+~{J ðõ£€Æ“*G‹q[=Í.d…TöGØ.ä ®Õ€½›R7´n‘*íI@7ÄTÁ`kkTúƒq‡}jY‡É‡ „[›GXV?O ¬³%Åýš±2Òö2çyž0:Aá5yóš ¬ÀTµ( %fM‰ÔÉ`ðÙtT­í p÷Ô)ÛçŠoà t‚£08A²¤Žã·)õhUÕÙP¹°ÏñÁü”ráž7P…¶Ùìãö¶, ¼ƒ#Xˆ$ž@ú~‡H†¤e-|jñÅóXÛ%Ð’bYp’óh9LïéY]; æ®Òc»¿«#É.8`÷#r! q!•eÃÜY‹$1Ùvý|ð†‰\\&|£èý ¸n“lb–ÌÜËh›_KÈäe1×áæóð¤CpQfH‹ÛóFÆÊù2 óÃí „s©0&–Ž)!—Šî1]í&ÄÈøIq>æPþ°~sÒyº¤Û;ëÒbŠ9GBØŠ&ÎåK#C]êš Œ×>  e¡‰˜jÙ»Drpü‡Â‘ølÁÀ±Yü¶”JAð 4ž½ôxÚ¿päÆVvJ=ÀèÔ¹xsU܃Å2‘’+ÇÑ{wê(ýÏá{¿•Áþºô…âÜl™XeŽ•ªû.qÃf?ç‡>¯v;ã¢<¯‚>jå®ð«£™>(A›ú¼BokzÁ\Ì'ÔYrbÏíË0ÓvÂÛ“¶6DF¼ ©‚ƒUÃÔ'à\ó-|bÑ4n ¾3x›Õª©¿ cg îôw?âqäŸáÚá'4¾×’À bÍìQ`_\;b½ µ ôƒwÏS#Üqµ:xÔî~Êj+s¸Òm$†9†z¶Èz¿¾¾ü?μ¨ú endstream endobj 3969 0 obj 6056 endobj 3973 0 obj [201 /XYZ 38.2500000 476 0] endobj 3974 0 obj [201 /XYZ 38.2500000 476 0] endobj 3975 0 obj << /Type /Annot /Subtype /Link /Rect [366 350 430.500000 356.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_structure_data_members >> endobj 3972 0 obj << /Type /Page /Parent 2 0 R /Contents 3976 0 R /Resources 3978 0 R /Annots 3979 0 R /MediaBox [0 0 595 842] >> endobj 3978 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 3979 0 obj [ 3975 0 R ] endobj 3976 0 obj << /Length 3977 0 R /Filter /FlateDecode >> stream xœí]KÛȾëWèÀ2»›O `{ì9Ø@‹o6Ábw‘Éò÷C‰”4Cê+‰Ÿº‹Mªc$ãL›ý¨wUWU¿ÿó×lÿõûöý§¯ÿÙ~ï~úºÉvU‘uÿÙîÿ¼{ý [ïú¿o«ºØ~ÿuó²}Ù8"C^ýÍl碩ßÒÕ´\5œùã×”å8Ÿ]+/Uל–ÛˆiÎ6¡V†…òI‹Ÿ…½a,õ•1×dÎO‰‚\_…5¦Zu‚LvýÃ`!‚Z¼„Ï•ØB½–‰Lܶ‘4íÉÒTaìIÆþÂþGÄ–&e®Œ7—i㤾ÒÞ§ïÄÚ¸1u±,¦ÜÛ­í ÚÕ-¡oa´kâÚ¸¹6ofeE%’ú#–>%Ó,Úuv<˜$ýU=Ôâžþ.” Àw›X:0\KØë‚_ w³÷ì°Ç€qZLy Iw;QÄ=b¾Ä8Źð<sÆW"Ñ,Õ=ýw(Š…61ƒ{F®3÷üûáT4×;'Qw³ßé ô¢Ø©2÷ô{Â¼å—æ…o°”ÆØÂ|‚£íŒ]BD€Õ"˜þ¡¦bÒóSD[Ü!}±´Ó”ËûV-ý~ð¹ñé0q6/¶ØSÊ=ÙÉ“¸vzsªep11[FÖ0þ£YüÒŸM¢#íÊæê~–I—~³æ—‚½1;¬-ŽJb_øan©JÄ~zÌ2‘ø‰FéN6a;†{Ï(úŸWõ±–I­3u»!Ë…n Gôðwfz;0eÇ^»}RÍ݈ r­Ž³TYý¨µSµï£3µçVµö>[[ÿžXZMjñ²ÀBÇ/gå°žBEV ΦÐ%k†ÊV¹7Q®x‹\7ÕÛ}ùŠÉâ[Hi8òJÝckÝ3aÿ[ñØÃ :&"zGü®1÷äž/“–™ê* Ïë®Óm’„…µÝ&ieà¤ê¶ªÛbŽ„¥û9‘ƒ#¿Ÿkœö»§Qç´.òöþqÞ>^f…øü´óÝî2ûÖÄ ·îWÑô†Ñ± í·†/P°úâ€buÏ›Æj#‹Œšálƒûáo°¯÷–ão°Oˆ%vŠ©%-vKšlו߾(éSì,¨ÙôMü¼ôM×é "Ý®2ƒr%øéÄØ¾ˆ²qoß¶£_îœé(dÈö“v¿qxp¤˦(„à%ao#·¬0Öj·¬èÁ1©\^èš0zg¨kÇ 0¦4"ýS œQÛ†ÙËô©Ji\Ú?,™öÛö‚êwࣉ†Ð‚aD‡DWˆšª01žNrtÐÆãô<¥ë?ºaDؤ¿X&P æaK#9á£Ù‰@³*M.j;P')‘C=‘# µPöö¿˜H…¾.˜H±L$ ùˆfNB¯¿rÃ`Ô±ëiºš£ì;¬vÅ0,—·o–èH&F»cyA:œ„iDF™%£Í*¨H$?›ªÊO3ží^†6|XM”`N&XË@éÏh™ }ó…„­NìÅ)9~„\·ú¸ðDů'‹[ R³_GJ#zaëj@Ê%ŸIß¹bHúñÆ·„ÐfÖÇô6;Û¤[}ª?³‡ åeC]ˆí|æVH0#fõv’b3acOÍ„çoi ¤¼á%&5”xÒœiçÊ\Íëµ=Iea¢vŽïbˆªîÍáÒ?fÜ ï@¡⊧íŠcçµL"0DÙ”^bbüÕ北O°õæõÍLŸÙw&t³¼¦›eg†ìµ{ˆƒ€Ÿ§sáüÑ_A޼³Ñ/î „¸Ž©£š|H¥sݬΟ5%ö3Û RÌU?s4{$‰I·¡n,h¥-ÞnÎAæA9-ÙÎ\ÏNš‚†%Þ©£ž)d C¼³vÇÕ†‡!dêJmª¯w‹Ý.»Ü£d)–Âí2yƒÇÐŒÉåç"ÐE6ÖÅOŠã‰ø™=Ž—ZúIÔ»h}RÌGqÓfÄoÌTˆeëX<Eã˜üTfŸø,>c·Júég}˜ì¯Do²Õ”ëùñI|ßJµÿdžõK—°Í¨@IÄ“‚.ðÚx‰±¹rܬéa¸Vĸ‘ß&¬DÛ%sð›‚i½7´rò¦y‹^Sì²a[¥«¿¾Û³Éve×›eHzöÖ÷˜»4[ßfŇnØVéÉ”Ë5&ʽŽDD¿×žK½\œÆÛñÁa¾}‹Á‡™_Ýžƒ÷(Lå’׌îÜy¥) ©mŽ>ÄIÝDPåç·Єüµˆ[çàÂ;`²ü¶£PJRT+aÃ2Ï Å?AßówJQ$Sº4Amz©ÌÄÌH°Ü”¶_ºIõòZ˜7ú£ûÍMŠÇLÈÈF~ö2æ2d„I¼fÙøMÔ£Ô ‘•‚¿z/ð0NVPGŒfLŒ{šjIªýv·ÿþ×––*ûú7¿l¾ †R ë°‡·”®Ö“)> ÇôHÖ‰OQ3‚Á‰l‚¼gT+aX®U“«×8›8|yM¤Ž¦.ÌÉEôö6Z².ɈL!Ð8›•6|,u-ð[Œ°’®BØ««†5ÍH13öò”J#,˜óº5´ô.²tþªl!'¸jÉ+7€‡F”µ®¹(3{È:L]ˆ+y÷TY’J³/‹e—-©ôâZ¼9!$Hœø1H” :¡”gd猈+ì½·pÛ‡7­ÛÙ)dÕ•ËÊe~T168¤c‰Ë3FñiÁ¢:u2Ä9⺜q 3̨ªlâ*\y‚3戬4¿0`jR„‡6±EσóïpFcª(‰ ¢ãg4ÆÜ½ëªŸè)g¶ {Ãõ©¾q \¢¢]Kc’v½…–‰j §X{_º¸{e#B!/)«Bé¤1k:ÏRs-”OZü,ì°b—Ùa~JäúÊ(D°x˜*FŒ(-©>ƒ‡kû˜jV¼Xešð#r !‘°E{µæn’å jæÍUªXÛU?ÊÄÖ"¶™‘µI‡eZY)C[šÉçñ­«3,-1D±ìÕ²qô [ pÕ¸_YG£sg„± ’¬‰[ÖDàz•B‰—J‰žý]%ªòÜeSk¶åFêêê¹×6BÉ ÜÛ(Lœ@ëÖmòVÓŽ®Î=Ïg§rÏwŽ+»§ôW¹qUœ;ÏŽÇù}¿òEøg°`#º‹ rŒè¡ËôõìÁ`®…qHÁÚ%¢%ɳà4–Ѫ:°LڷЋcäÑGøjFÚ4‰Oô ƒíSœ1Käláܳ÷+6˜áI Œ,½!ÿ`û ï€yïaѶݴó@X»Š²³¶×9ÐïÍ8~‡„€â2å ãŒYOQøñ*‰Þì)Q…ÏêÌhó“+@ä$hJ«Új{•)[Z”ãé,3g~JLÙÒ)[:,DpOžðO¶´Ž½â–ùŒiŒÉgèË4¼ì%Ãuðy¢‰%éP_¡cçð-QìòQ7åÕý,Ó7:†ìµ/GŠ.§è²¬ûcö”Ö]nŒvÂê¢Ë^%dŠ;K]cÜyßüN™½æ†Äwn § E¿ü+È Ž‰Máuð®WV…(ØYÌ‹®^3 y©¶&ö¾äÈ…Žäª´ï÷Ó™(7ð;泟”á@&º0¿DaNš´k–´«ì«Á]Ì á2‘‚é³ã±#4¥ÀŒþI·îjRÙï]§Ð3ã‡Á6>Qo™î¡z´ÑÎ}£¼g¢ÚQˆšaŠÅëù¢©#P–:­ÐKIzâ6:ˆ ;,QHÔMw ›Í¶ ?Ë,¤‘5ެ´óŽ|²Ú™µ±æ6ʯ’Û¬>&äGEY•Åa?g†ßÒÄOØ1ïâoðšø©¼ŽÀGô„ÇO™·:‡¯2ÏG3[ÂG6‹gûpû1ð»~ÄûžÂöĺZ}.ûéDá\Ä;æã—Öƒ6K)ïäº\Ê–{Bë¸k©4—öö¥?)Ê Ä™oùyKܬé>:`Ïl—¦¯àHŽŽaðlð›žͤ£¿zÇ%¸ýß³ó‹Ÿ!ìð$^PM"žå/àHÀk aGÀÛÀ„?aŒq|RLã2¼ëú~ʪ2·ë¥Òm$†%†y•ïtUô>oŸ7ÿá§ê endstream endobj 3977 0 obj 4976 endobj 3981 0 obj [202 /XYZ 38.2500000 607.250000 0] endobj 3982 0 obj [202 /XYZ 38.2500000 248.750000 0] endobj 3983 0 obj [202 /XYZ 38.2500000 248.750000 0] endobj 3984 0 obj [202 /XYZ 38.2500000 607.250000 0] endobj 3985 0 obj << /Type /Annot /Subtype /Link /Rect [442.500000 584.750000 511.500000 591.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_date_marshalling >> endobj 3980 0 obj << /Type /Page /Parent 2 0 R /Contents 3986 0 R /Resources 3988 0 R /Annots 3989 0 R /MediaBox [0 0 595 842] >> endobj 3988 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 3989 0 obj [ 3985 0 R ] endobj 3986 0 obj << /Length 3987 0 R /Filter /FlateDecode >> stream xœí]É®ãÆÝë+´`™5p‚=È"@£È"È"hÇ1 ÛHÇ‹ü~(‰Ô“Š;ÕV©²°e6e¢RŸgRY3‰®›Y›Ñ܉.?a†W·¥‰7øeåÁ¡¢L¡äÑCneò+€PEÑmøð7Y¥âîeåÁ¡Ò.=àáe:Ò*cÀÿeøƒ›ˆláºòàPiW=äáš¼lÙr©ðï†ÿ¢È"bÎyåÁ¡Ò.=äáVªŠq¸/ÃG¼ÖñdîuåÁ¡Ò.=äáÖe'ó¾æþe<™k•."bÎyåÁ¡Ò.=àáZUVWåô©—Ñcœ­Ž(ϯ+ ”öh{ƒò¯äú 0ç¾ /¾ýrøþ£²Y}TÅñËÍÚ®s^~}i@’¿;ÛpuuüòÃñY¦ìŸŽ_~>Ô§BçÝc<ÉÞÀw øŽöŸÇ¼½<ùð¥9ŠØP4ùžŠa!Ÿ}„OÞBøâÓú@̃Wwš¡'ï´"p ïô=|RÂÑð<ÄÚ,„~'{ç;ºž}À'§1¾aìŧmü1¯ CãŽÆïÀU+¸6‹ßxÀ`<QÈ‘0V ˜O›¢F¼6ŒUßQx§A¥«§`°Ü­Ê]S,Fº š<“dø‚¹]X©ñeþ2òãÿ’å!³Ó]7ÌvÝP–¡pÕ9¡ãó`¬"xoNp k¹Æ^ ¯‰U §@@g~i6?W6XkÄçÃ@cqÚ ÑÙò|1š™@X"z´À7ð<ø„gçë”®©ø“ÅX…­glq|pkZ=>Ó°ö®e4¼S,?»š9;~<Ü)£¡gjÇub³,'œv­´‹ÑÌö'û“->ј|=Ùh˰)k“ø´ Ö×mº}[¥§ï!ÍJš°RAª?{’fwyx˜¢)mv™2Ï:7J«DªìT”ª*ó;\›êTÕÙ>/ nß1'£+¥ïßÑèÖœ±'k®y0/£ø\A–_ž˜Sn‹ó¢{7ôŽE+h ՈŠƒàÅâÑðbñhxøöNÛ-¦úWTç°ÿÜØsÚñ×Û¿óSUeÇ¢8ÿ*•j?-E~Kqj?ùz(ìI©ZW•º}Ë<Œbîçh¾ßþÛœ_;ºoëÞúü޳’æ[ÕÃ(Õã?Þþ!­U-­ÙžaXùãµ®ç¡ãKQWDÈ;ÂEíx4¼6<D_£ÆSa`ñJ0¹àá;|XV8žÝè ®‘9I¼X‚á…ÅY[´=ëqôÞi¸ðk/Gî>`“)¢ €ö€¡<|Æ(Â<˜Ç`Cpµ*šŸˆL„Ûâ™5ȼ‘ÊbMa]egË;[žÈ–1Ø2äÚ<ÃVwä4M?7š~n‡4ý¼pµð擞¦þ–yÅÜÏqÓôs=¤éçª7‡êkúçoU£Ts$Ðôó:±¦7q‰‰o¼nÎèëÅbs—Ùì¶ôŽ]j/©¦HíÈ,åµH`/Í–Ø^$Ó(h]Ù/PPPN$€ÁEu,³Úè‹A¨ÅbDÆøôf´®, +†9Ü Ã^0R à ácOÆ%g7:@bRÀO¯—ÁÔBÀ€Rn#{y™;¤Ù‘vU²p~÷a†„1åÞE”¹ªÙ#týu‚1dG==.MPËñv›Òš <",Ç<³YÞaù%e÷Âý8Ä(psê#|PæNE¬P$Eä—“®¬¢ ô¡=£€ÕKAù†\«¿õgVxDDÓÆ8˜–ƾ%q„£/ÿì !Ð6O—[³cvã[:¹ßã ˜B3üfî}2¥Û…¥£”°')VÆŸ\D)V4ÒëQŠ 7„ÈNe ¨0Å&Æd袄À7ãº-ÖÔÄÂóP&wXDì3_kOAßé±1"Ì¡+Á³ÆX—÷º<ƒ[%-ÆÍQY¡\K×4aª,áº!°®’$£I)íJ+¦b“M<&^YÿBÕ2œU¾×àXN ޏÐy·^*2ïu3“U4Λ•}W]t÷ N_Ÿ(Õ)!cðø@FŠã%1þÁÌcnVà S(ºh*堂ʇu2{ŒÑæTÆ kXó'By‚E…J?D…ͦúQá…ʈíó'nTøå[æas?G^44Û /TÖ›#ëE…_¾U=ŒR=Î?*¼P“®¸€dÅÚÙ„&ª\ázéXGj%á ¨Á4-²v౜@ Áå€y6{ã&UâÑßwÐ(FŸ`L&˜•‰cÚF!JÉ êœZb*n?p;s…E橵Äì©#0l& A£‚° žD1Ý8w.ÛˆCLaG O^o´Î™n‡íRLDH”0F"žB³$77…VÝfÝ)á« Šó¸Âµþš5%L É (ÞC#Æ’Šî/Åa,ø±ÈM¤?coiÍZ`+ŒŽ9=Õ…:O ñ£¦ S=?;"v„ ȃà@¯N#ˆy{¤•ƒ-óE‰¬Z#Àáë69Äi®ü\=ºòs=äÊÏ­ëfo>é¹òÏß2£˜û9n®ü<råÛÚ£ù¤çÊ·7ç}7Jõ8GW~Þuê]³+ÿ¶ ìÊgÂW>Ó¢èclfusåßà±n²»¼ãª[Ü0ˆS zq8!l‰gÂÊcÊ1q¹Œ:GáGS8ü’ª×Ä£3†Èl¡Lô5'jÅÕ@Š¢‡A{‹õ8-Ö£zÔx½É#?ÊñÌ¥FQéEå QTöŒ¢rÀ(*oFQù`•ŽQTEEÏ(*Œ¢âf•FQ™Ð(*·`•Ï"ÁÀÁQË8¿CdsÄwªªv µœ«Û=òiÆ{ædŒ?/j¹÷d³BDd®ŒúVÌ ¥+•+Æ^­—$®¨Íkãê XC,ã‡VŽ©*X¯³²4•â?þúD ›7ðI*¡¤âGÝï|›È)Œ&®..¼ƒ¯!0#ÂÌ >t~©1cGÃ.!+f’Îß«~ÕVáDƒeåcË:÷0·­r%Iý.êò9Yn¬‘úëa@‰uåYX†QÊÁä`ŽÝR=:vK5äØ-•ëØ=â:v/ß2£˜û9:Çn©†»eæ:vÏŸ¸ŽÝË·ª‡QªÇ9â;vKÕ±»»xætñDîá€!¶ðsØÚcÔª±Ñ>¾µNà*•AKèO!ʰ™ {-O‘­ºÀg( R%ð޾ȪÀ×!j’¤J©?EXgÒ} èÌŸw¹wôR’¸LÐG±k&ž¹þÄ`ÛÆõ'EüÞEÉcJ³Êg̵g{4±-ÞìÕ_3[^e«Œ>¯%è>lg d+xurt@Øñì—B –°Õ=Vu]š &µ­Nö"j©FOLø #%1·b"À‰ú„áG‹ö¹?kÕËèUãDù”$Ȭ‹%ѹ¦ªs¼w¦Á0Êî¾éåD‹6¿[i]ÝòËás,t:Ïä Ób¹òP:€;o°êrL~ÐðÊó *ϼWa?„’ŸBˆdÛT­*ªÇ¥ÏY/ ž¿Ä‰°¶· O«*Ÿ®?Ê´<{’dw ÉLØP2ãޝÅ]Ç1|1fÅn,Qª\Ày¦Ø }ü¬ÕГ`M#pLç;޽ìÓ=.Dœ}¦vì»`Ÿµ;öM’Ýj¯ “ ÓÍ ³T’®§ÒÏ5?¢ÎYôU¬ßÁ³³xÄZϤZa¬ ÄÎ#âµ-¹ZòšBÇÃrh]óaÖ„óSzÁq{ì]DOœ*nwð} v‘à{èÔ jb!€ý¸¸!Qqk&Á¤ÄËjJÞ:Ÿ`\¦0 Ǽ`·"¼±(ˆµ x¤ÀTÊ£Å'‡©–¸í0dö ²ÌNçï=Š!Š©D `&8í—@nŠý.:JWM‰@^çAºbŒ%¨‰‘»KvŒ$k7‹!ºK£H£ùqT°è6†!ÂMÀƒ ñ^L”=#sŒp-M#)õ”l‰ý ÷KÊ]…æ5BDàÖr áNªhhÁKë-r|{ ¾ž';ÇßÇ_tfï«‘ 8…-J‰¢Ë5Ÿw¾ž'»”Øž”H–ÿj8~`ˆò·i8q5%'|Oð™,Ù»äÌbJæàºAoö[¢á¸Ð“ R“¾™5ެ$rX©¸Ý ñÁT-Ó&g ¹Õ2}êÕ¦I¿òXUÔ7l>nÇÊd~¤Ê”dŠ­>ÓUVÀ˜UÖŒg2Y(”Á!æÒ†()£Ý‡q°7&=§¡ùL"t²„ëšçÏ\Žô¤ qNæ=„,¦]WŒ¢™3)¡4”ÈÆ®©Jßko¯½½ÔDUºü:e®©¦ãçõKXèü…²ó³—‰< l­ õºRU÷ž½ÎŽDÇ‘„‚Ï€ñD­2Ë ß½1žr|Ã&Üä^ü]~pòãµ°kf?Â<˜[n,ÿD7Ç‚s>¢’°Àag¯ ¹Œ ¿VWÏaöÉ*±|kYVóß~ÌÓ´äìJ–@%K¯Zkí”Þ@”­ÇÔóÇùïËÅjìöCpûacñóë´Iy_•:§×Φ²™x ¸t¾œgkÈÌ`=~üD 늌†Ô‹—,žÈÆejYQt†iï”éô‚OûÔ‰ª]TÝ0ÂßÂd»1òY°Ï˜S |Ã Æ žsÆÒa²IiÄÈâªü?Ó´€™Bó^A³"8Ÿ˜(h±Œ§€Ñq˜–Œ4c:ÒžˆÓž€;iô/½†ÌÜ%ÇÙÏŸ%µ{Y—;Ø;‘Ìšßfí›4Ò®!+õõp¡½¶ÊZ}Š+¨­’†£kÈ®Ü9J¶×îØ ¯YÀ),ƒ UËá5;’0v¯ !Üü瓸6DîPOɘpóšdw…š™t¥¦|Îä—<ÉÖ/êÎHÖWBUÙ©(ÕC²dÆH½”;*i²—]Œ«‰”E¦£¢àO¤þ39Ña{-¦ê¬™*Úiê&¼CäÙútcZS2m3‰ŠTw<1ÊŒïÖç68x| ¦å¯OrªŽžaIÏ#—:z €¼‘ºb-0çÆÙôðð n“Šqƒ‘=œ¦îTGU[_{o—F?NÙ(׊?™»˜'-rç' Êù½SÀwjôN«1žëDÔæ‘ðÞ£'êŠËåÉ€SzÇÀÀw4|‚÷ÓÞêy­ºõ¡ ¼ÓZØmc¼`Ýò€! ) tà Äü¤½ëò{ãq¦­(-NFi‡ºá)dÁlHDÌÆ(‡š<Â'‚éîZ€!žb˪q/¾ÅW–ÌÍ)Ó^;ûiãU.ª’SáKQrb‰ AWÆ[Ÿß(Ä…¥p±¢D¾è„u¤ª…çñ.Q½ŽÂs|*Ø›† ÍÞÜ% ™L}1¥ðð;iyLLãP®_èŒaŽ¡)1ÞƒJÕ^ ë‘aYB}3¢ï—€}6!D&õþ£jŒÙãB a¦ \†õ˜º‘OqÞÖL}'¼S¦ŽÁLjbÜYD,~9³FÍÑxbkÖyW/Y¼ ·‹‚vÈ8 ï|PÍÞ9Ïå>~h·±FŠW? U]Û̾u‡*µ+èÉt¡½~goä±€âí¸‘Õ&ˆh:,”‹#Ju2iá&©Íô”‚ï oCf3;¥û:¥Ön/¾IŽÍŠÔ¥ÆO©Õ”ÒÜ s«2|VÙü¶*ïéÝüÎ8ó»—„ß³0Ó²Lì§pÐð£"­™ûËI) ¼’öi(_"ϯFõPgBb0 ÛëïhU•Ÿ27£‡Ì¶YˆúäqýÌo’D hÕݬ"bõ€L%~¢ëPç +Ð{ÈÒrB–)ÐØI¡polx@ÜÁ½ÚpeOl¬`Gš`ú4·d“q~Êj!zá·ÍÏñ[ÃXE¾ûéÙFèÜÕ`Fy£@dê¬\ug’´’jHý¹B® ×链ȶ>¯(úOZƒBŸŠ^Õuë÷hóLOZÛÇv§=û¢UO±nm]F€3ŸŠþ[‡sŒ±B9° …Gƒï´Ê€òÚú…Ì"ÜùïÍŠ»•€°ÃO h¬.AhÖÀ çZAØðV°d‘0>q¼SŒðÄÕ³ÔŸP«®¦cV™™S˕ơæmE—–??ãÍÇO‡ÿüæé endstream endobj 3987 0 obj 5926 endobj 3991 0 obj [203 /XYZ 38.2500000 513.500000 0] endobj 3992 0 obj [203 /XYZ 38.2500000 513.500000 0] endobj 3993 0 obj [203 /XYZ 38.2500000 112.250000 0] endobj 3994 0 obj [203 /XYZ 38.2500000 112.250000 0] endobj 3995 0 obj << /Type /Annot /Subtype /Link /Rect [43.5000000 83 90.7500000 89.7500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_class_extension >> endobj 3990 0 obj << /Type /Page /Parent 2 0 R /Contents 3996 0 R /Resources 3998 0 R /Annots 3999 0 R /MediaBox [0 0 595 842] >> endobj 3998 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1409 1409 0 R /F8 8 0 R >> /XObject << >> >> endobj 3999 0 obj [ 3995 0 R ] endobj 3996 0 obj << /Length 3997 0 R /Filter /FlateDecode >> stream xœí]ˎܸÝ×WÔ:À”ERÔ0Øîv€,6EE0“I0âÌ"¿U•Tî¦êÜ’N]RR7c$î4->î›÷Å7úüý¿~ß¿ùðù?ûû¿?|Þ‡Úçÿì~xú ÛúŸ÷uã÷?~Ý}ÛÛ}Ú}êþ÷ÛîüÁçé~úßÞîÿÜý÷—ýßþÞýò§þÿÁ×]mêîï_O·µé~*.ÿïÝ_ÿ°ÿí8ã°\¿™çÿÿÓ}dÜq7–þ¶ŽiN~ÿñ·Ý›3æ­âÚÒÚjoJWîM÷óþ¿ÿÜýÜ-0L_ÚÒ˜º*ëâž…j{\ÉÔÍÞØ¶Øûz´ÎéÎì&ÂäöŸX“Ÿv® ã*#N®‰YÛÔ1{™=ð]é"’Íqç±0 '×Ĭk}? пLar_V鿏su¨ ¸Å³k"×·ƒÈt.üÛˆ¹vEDÊ9î\*rñìšÈ­{PGJÀ?ÌüM‘qO;×Ê€Z8¹"f}a}hJ}=™>Â䦌Ƕç«C¥Ç­0»&rMk#*Ü'ÓG˜<¦-uÞy,…+Ì®‰\×ö‚­pÀ߯›¾ìî³ñç¸sm  ¨…“kbÖ[“m¿OaòªŽw¹=ï<ÛâÙ5‘[1 ÛÖ1õmSD”÷§Çb[8ù¡©l]ú¢³¢ÑÏw‚ÌÅsf|Ÿ= ¶}“”\4gž<6¶[c"bû2{ „´UDÁqÚy,l‡“š3 ÞÉù7ÀkþMøðý—Ý›ëTû/?w;/xúëË×]wcùáèn«ºÑŸöo‹Â}øãþË/;c¾¬šÚŸþÝi¤¨N#Í¡i‹ÊúâÉHy)¥;‡¾XøÍø œÍ¶h6ƒ×Á{SÝîI9Ïöý€NsaSÀoš`a<½)‰ûÓˆˆKZxyô„[¢àÂsA`"6 Þ}¸0Å#á$„1µç¢Nœ„¿tý>alÊËã2È=¯¶‡ÓnžÁÕÀ G)K8òŽà½µZÀ‚jL)%ðJ™†˜ ¾zº,&ô¬À|„ü¶Ø:XJ -¯'z€&%ùàlZº3ØÐ[Jöö¢Î¸ƒ³±~}ãuˆcÖ/ž £ÿýtú~<øáä“F°™>‡i˜€ Ë à‚ë”r†ìZË$®éÒÝ|CÓ¥Eæ…ÆFM— Ž4p¤F#ŽôëD4]LáªÉ¶Ë؎ǪÀˆ&Ã_” H¤ö§c;{Á4-1ØwðhÜbÚ)àÈãüu± H½Â7nx×paCçý|ž+ày œMøãôÃü“:(‘ Ù²|›uÒ’à9 qê0æ0]cXc ÁX€»øSÄ)Þµ°„>Ïò’¢§˜þ³«ºÓ!‰×•îCº~Àt»róg®%Ø@ʼnw]··,ð¶¡gøS1là¥Q˜~úî˜ÈfÃd/‹9™7oœ–¶Éª-«¶l>ß5aØhĘc8‹ 7|á¤0Ú!\I1½t \Ç0¶á:%qé΃å^ÏqÊHX†âÝû„:§¬oËL±øÂ}k$Íé¾;™ÓmS ão‰€/æP&éj{ë!¬±3ŒÀvR®kütù9Õå§s wjúª7¾nž3)Um&æÈ ñ"•œE*ÆÄìG´™‹®Œ |ÛÖÈI â¯*—l|.æ ù£!qÞd~™T¬(õ%û³îq‰ÆÔYm¨´„ä ¨é"§ )ó0ü¦tóù$U‰üÐ/4N‚Âlˆq‹™ÐÛZ9³í{^ö¶foëÛìm½±Nö¶fo«H½)ý>•Ÿ k²?rÕþH‡G6묪öº¤hB^ŠØGŒ%^‡°Ü«UMÀVÓÜù”¾Òº¨ÕW½á+­+{ûšŒ P˜ÊR¼ !7 ; ˆÖòŽ›\³4d·mÊktc.¡¬WsIb wáâK; ðÞ˜“¾0œ2&ZJÕÞ¸! êðU×?0uØt"®YÂõ–Œ F8¾ž4VbW†Æ˜Z†TÉŒãÇAÚ±˜Ï „ÄÐqº2Sï6“]V"Óü%a"Ë´,ÓÔy_ʳL“¨w›³2톋¡-ÿ‹RC !ð«Ò©F©þL‹·÷xq=Ù–.Š›á•BKØ´J‹"œ*ÄTã1Hgœ8w G¹»Y"†J/uÓô˜æOø¤D a6Œ9 ¾VD•èË&Љ‘}›a= ý–¤ oë¸4F¤Œª*CÊPMêeB5›æâôq„ÕòZcB©³ËLD^kÞLˆ¾“QºZDÍx¬{®¸F!„Ü‚Gú˜÷¼oÔbi•ZòA-½ùQœ±Ìøø‚!Æį0Ûãü]o€Â¢›`Ý¢—g¤Rõædnv3®Ø¦½Å¦ß¥î“"‹ÇW){[d£+2 Ó dF\pFwÑõ„‰ï3Qá¥:ÍP^Wøz™®«¸´ÛÓ©l›¬~ÿÕ'fœÕÙ@Ï-ž.Ât!žÃ&Œ·5nt-êµu^Nl ®“D¦ûŠÓI·[úÔéú&Œ,Ni"©#ûÙâH*N«Æ½pý-.E ºz©ËLw ¾¯HLojåC°–´É¨O&¼âô¯jóCAƵ¬záP̈ Ï Rv³j:,cŠ*ÛçºÚI#>J½u‰Ó󧿦ºáϘ$¬aöE5A¼ã*¨âp[ ¡ÙQ œU6·¦X¶,¾¨ïiË’©B›*V^=î‹öžÆ0â1SÒk£$c‚Æ= ÖÛyS-}RÅv;m‚' Z¿TFa~G.¹tÍ¥e9;ŠºH wÕ2´!j>k#ç1æEŒd•ç6Iù3 ›òjíÐDk›=>×Ü»9¯é`»G¹{´|žÜ=š×å=od­ü0o+wÏé6©7Ѿ‰ªǼ¥ú†ƒpBŠàÖBðK+ݶ”+‘I½¹ŸWõ’¡w…¹ãt »s{gõW½áÊëîcÃ’+-6—Àfƒ3×(–¿* æ!îˆY ‹oFäc•ŒÕ^ôÄ{®ûz‚y&=bä×|7La>QnÓ²G2y•iÙ” —‰ÀHÅ×{ŒTî˜ ¨)C^qð ¾w(“/·1‡.ƒ®Öʨ¼†™!™1ïqëBg…o^§ ªÔUÀ!s³¬9< T><)v™è†‚˜@6ÓÑ[J§M}é<ž¢ÿïíý4®ºÉAXŽÝŒKÈ[LÎ'vì•æ¤8‹3x`6(v 2’}xK,+0AîB?X£âo0t˜Žíð<ÛÔM»gÝ„¹ò–‚ !4À?Xs/9¼k‚O¸a©üÂÒoRU³12$ÛvÜðˆW 2Ý¢4í·)a®,ãbÞäÄ#ãªfÂÅ@µ½ÁÝ "¿,Ç$Ü2‰½L…yYûjˆç˺c"Xp×BËÛ ~4Ú„<Áðî5 Ûõ€ ®Îé©A¤ mRÅ_VXÄqh \d Iœ9åTš'Eéq—Ò¥Ý^º g•Û0’ȵE¹©§—ÅÎKÝLx抉éȾÁN¯TŽ2ìÈÄ×_œ ¯ê(Ë2„Û#C„o0ÿ`¹ƒKRñã\ÃÎ( Q숹åP¢xÁ‘‰OJ¸„ügÆñGÔÌPO)ë:ñ˜ ÖLxo„X×ѬŽÇ»ÖÅ¡5_š£9q"E|gÛ^ÞÆÆyâº/9ê&tÍHýÃéGŒ&J/óT6_š—R7.÷fÍ].ÖÕå{¾îyæYØ=”ˆãõb°xDÅç]j¾å_QÀ ýD³yû1Š6Ö•|ÍïÊ ñ‘ˆ¶…ƒð›Ó!ûսݴ‚–FLèë& =Ž-Íì‡ÉV¼`Ÿri¾öŒÙÒ¼[5T@+´7S©Œé˜ª‡ð°<ª¿ýÏjñdÏ;0v8á”󍯱™êdaLzAªÇa^zº„QkÐìM{µhùdW…kŸ/iŠÃ9½m´™+#=õøƒý#µ¾iÑ7},³ãºÐeÕGÄ®çÌÃÕÁ ê#ü¦¸ðpëžKžG8âЮñlŽ`X wpæ úàFôû}ƒáÖ—…`üÄ$W×ôÚK‡k¸ª Ü1M@ÚÃ#µ”l{ÍR ¦SèRr¯ÍgÑ‘Lã õÃ]ão0½ œ‰Ï)D€N3hþ³ yëf>¶1õ '…°î)1z¬ *êz8t¢ÖÁºŽùq“lä2¬3Üü[*´žc¼o&Q¾/Âû¦¼·T „â¦8 ”ÂÄðÑñÝé¾t¢æœà_*Ba. ¾Y¶M T-f|ƒqG#Ô€nqaW êRZŠXPmÕ“ú©ÌÅe®à=Æ[{G°Dܧ(ñ0šža[L0x¶ÛšÂD(ÖÐ5ByáóèóóóOÔÛ ›ŸòIª†ªu+©LekéÊëÕ¼cí°Kd襁"¤ÒµŠÁ†¿’ª]ÈÁ#+ !«ä ͹{®?Ãä$ìŸJsóLšŸ3I ˜ùž³vè»TöîÂò`ÍTÝ·Fý@DŸ©\Z[jŽ|Qÿg¼›1Þ;ô°WŽó}Ý™ªzú‹_wŸû ŽaqÜÂs’b c¡)¸.ïÔ k¯(g}cù=†)-÷™³Õxœ&ÙaLÏñÅ{ëR{cXŽ11fГœ¶Ê+š·¡$Í©ôœmAIì׿¿Zõj¥íQ¤6µ ¸—é­ |C<ÇÞóuD™Õ8ʬ—‘†­ëÝeú31qè~IJ Í}ÆQ "â˜ûÛâµ"Lï|ê­ &‰`q¯É %n±òÓ ¡÷йrÕî/áþP„)]ØsÙ'ˆÍ“%y$N†˜æØ‹fgô endstream endobj 3997 0 obj 4605 endobj 4001 0 obj [204 /XYZ 32.2500000 277.250000 0] endobj 4002 0 obj [204 /XYZ 32.2500000 152 0] endobj 4003 0 obj [204 /XYZ 38.2500000 623.750000 0] endobj 4004 0 obj [204 /XYZ 31.5000000 471.500000 0] endobj 4005 0 obj [204 /XYZ 31.5000000 278 0] endobj 4006 0 obj [204 /XYZ 38.2500000 623.750000 0] endobj 4007 0 obj [204 /XYZ 31.5000000 471.500000 0] endobj 4008 0 obj [204 /XYZ 31.5000000 153.500000 0] endobj 4009 0 obj << /Type /Annot /Subtype /Link /Rect [60 435.500000 91.5000000 442.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23D_introduction >> endobj 4010 0 obj << /Type /Annot /Subtype /Link /Rect [60 428.750000 126.750000 435.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23D_command_line_invocation >> endobj 4011 0 obj << /Type /Annot /Subtype /Link /Rect [60 421.250000 87.7500000 428 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23D_typemaps >> endobj 4012 0 obj << /Type /Annot /Subtype /Link /Rect [87 414.500000 159.750000 421.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23D_typemap_name_comparison >> endobj 4013 0 obj << /Type /Annot /Subtype /Link /Rect [87 407 140.250000 413.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23D_ctype_imtype_dtype >> endobj 4014 0 obj << /Type /Annot /Subtype /Link /Rect [87 400.250000 162.750000 407 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23D_in_out_directorin_direcetorout >> endobj 4015 0 obj << /Type /Annot /Subtype /Link /Rect [87 392.750000 176.250000 399.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23D_din_dout_ddirectorin_ddirectorout >> endobj 4016 0 obj << /Type /Annot /Subtype /Link /Rect [87 386 141 392.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23D_typecheck_typemaps >> endobj 4017 0 obj << /Type /Annot /Subtype /Link /Rect [87 378.500000 152.250000 385.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23D_code_injection_typemaps >> endobj 4018 0 obj << /Type /Annot /Subtype /Link /Rect [87 371.750000 150 378.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23D_special_variables >> endobj 4019 0 obj << /Type /Annot /Subtype /Link /Rect [60 364.250000 101.250000 371 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23D_features >> endobj 4020 0 obj << /Type /Annot /Subtype /Link /Rect [60 357.500000 84 364.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23D_pragmas >> endobj 4021 0 obj << /Type /Annot /Subtype /Link /Rect [60 350 95.2500000 356.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23D_exceptions >> endobj 4022 0 obj << /Type /Annot /Subtype /Link /Rect [60 343.250000 90 350 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23D_directors >> endobj 4023 0 obj << /Type /Annot /Subtype /Link /Rect [60 335.750000 98.2500000 342.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23D_other_features >> endobj 4024 0 obj << /Type /Annot /Subtype /Link /Rect [87 329 191.250000 335.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23D_nspace >> endobj 4025 0 obj << /Type /Annot /Subtype /Link /Rect [87 321.500000 144.750000 328.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23D_native_pointer_support >> endobj 4026 0 obj << /Type /Annot /Subtype /Link /Rect [87 314.750000 143.250000 321.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23D_operator_overloading >> endobj 4027 0 obj << /Type /Annot /Subtype /Link /Rect [87 307.250000 144.750000 314 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23D_test_suite >> endobj 4028 0 obj << /Type /Annot /Subtype /Link /Rect [60 300.500000 117.750000 307.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23D_typemap_examples >> endobj 4029 0 obj << /Type /Annot /Subtype /Link /Rect [60 293 162 299.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23D_planned_features >> endobj 4030 0 obj << /Type /Annot /Subtype /Link /Rect [248.250000 161 255.750000 167.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp >> endobj 4031 0 obj << /Type /Annot /Subtype /Link /Rect [291.750000 161 304.500000 167.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java >> endobj 4032 0 obj << /Type /Annot /Subtype /Link /Rect [68.2500000 251 138 257.750000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.digitalmars.com/d/) >> >> endobj 4033 0 obj << /Type /Annot /Subtype /Link /Rect [43.5000000 236 540.750000 250.250000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.digitalmars.com/d/1.0/interfaceToC.html) >> >> endobj 4000 0 obj << /Type /Page /Parent 2 0 R /Contents 4034 0 R /Resources 4036 0 R /Annots 4037 0 R /MediaBox [0 0 595 842] >> endobj 4036 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R /F1700 1700 0 R >> /XObject << >> >> endobj 4037 0 obj [ 4009 0 R 4010 0 R 4011 0 R 4012 0 R 4013 0 R 4014 0 R 4015 0 R 4016 0 R 4017 0 R 4018 0 R 4019 0 R 4020 0 R 4021 0 R 4022 0 R 4023 0 R 4024 0 R 4025 0 R 4026 0 R 4027 0 R 4028 0 R 4029 0 R 4030 0 R 4031 0 R 4032 0 R 4033 0 R ] endobj 4034 0 obj << /Length 4035 0 R /Filter /FlateDecode >> stream xœí]K¯äºqÞŸ_Ñk·¯ø(yÈ"À`ÈÂÈ"Ǿ0|L¼ÈߤZ"õ±Åê"¥>sîÀži=HЬ«¾*þú¯_ÿëò×^~ýðõ.ßíß¾¾TWSWÓ—áÏ/Ë ²½Ú_L[_¾ÿþòãòãåËË—þÿ¼L/|ýðïý¿þï"/ÿÖÿïo—?ýgñÏö¡áß_Œ0ýßÿîŒèÿUÍ×{ù?\þ1´èº³ƒYÿþEtmÕêawºþñâ>SŒþùý/¿NÖ‹êÑ´¡•¾ˆNËËÿþ÷Ë_ú\óÕµÓB˜F›ê‘ŽŒœ{’]ßRv4þaj>CãJtùGÎ>+B5"Þ:ç⪞ÞÇ ’U—cþ]ó9æ¿6w9û¬¸ÅÅ­s.nÓi;ABg˜¢[óo+“¯ñqäì³â·Î¹¸mÝå\Ü[óïú¿òQÎ0òl‹‹[ïß]S™þyôobßí8gmß­íeC!ê9\­ì=ËÃztÁn…–õFÏ_RÚ sjv°[åÒn•} mׇØh˜\S5ò"7&÷!þÔRo´}ÀôU·é“vúD5 M]–Uýã볬™îºlkæµ}¦5ë{]¬Ùðë‰Ö,ŸmÃ9¬›>Y÷ëÕ¹A>ÇbÙõðؤó쪹_eîÚ6ö?øïGX¥®54ÛòöܶÆë™¶èõÝæwÃËc‰÷ß^~ý,t¿ëÍåÛ_z3gêsüë[o¿×—_z HVâòíÏ—©*õù—o{鮬ݧ;•Dwä;øŽBwDßùï|JïGÁ;²ƒ­µ„wÞÃ/5és 4|ßc“ð¼¦xlÎþRE˜ü¥˜FÕ´ Ÿ¾õŒ—gäŽ5Á3éR’Â<ƒ¹S¼5~RE„Æ`?º"ȀɅ9KÂj¥KÕ=@—$Z†3‘òxM ýGúÁ2 Ž:²ö]ÁÕªÛf^},8RcîË_¶ñ ÁèjŒªgƒÅ©ÓÔãx|×^Û®Z߱ķug"1}Õj ~ú¤œÖš!¼3 ¸úªd+Vw~G£Qã~,Q%Í5Í„¸Öºiû›·…ÿD˜Q•>\1¡ímH»ù.å=jå‰rß¹kZ¿¿à€ü€&¶ªáHðáÈÀ~"D| …Y)TUé§?•¢ºÒOmF6@xØdÃF#A¡ÿ< Šb¤áM:^9 %âÕÆýP¾n"îÊ&…â¨À« ûÑØì%8*°tÁki ®)E"‘¶ü7PZªG6CpíïÞ)óuZ>òuO©µÞÜçw[èF<@—on‹²n Ý>2ó%ÝChëMÞ=¹¼«_Ÿ¼«Å#Ž¿×h™ÔÊ<‰L©ë†½×ö"º­.e3vÙ×¥°N¸ê:ù;“ïØe¬¯8IÓÞyßéÐ;jba¡®FxÞªIˆ ¾¯N­ï|Bw¬ ÝšƒI¼˜« ÜI üž÷°5…ÞÁ£–ðž1ù*›«]ï›”é³A#°Æ­õs]±™"˜-”ÇšÀ+òÞ±´×8á­5¶o»ãhj“ÁïN‰WèWµ¤Û3¶uÖßZÛïÿÆÍ‡b7$ç6öeãÏHàÁÂŽ™ZxÎ1`—<% ãa솰‚‘ˆaòƒ!EÂW„Õ-þ �„xýðX„—:)@‰[ÁX3,IrXï|aà(XÀ>8lŠ¥À‡Üz®îUûZÑQâ h%Q'¦ŠÙÏ0®£6Šr|Ó7?¡¾a&øÀ¼ÁKn¾%B¢¥Vk ÃØoÔjEP&¼MäÃìù"+¯ç¨ë_׺¤°;24¹5¼¨úÏõö²GɈÁ†ßýPŒ< ¡ŠÅl|$ùt<]xR°Ä£l‰ 1XJŒñØÑ”ÄvRö¥w ÕÈÞ3Å 8ÄŒ¾?Û ú%Á?E±wßïç5 å$à#C¢ÀZ±9MÙ†Üc†œÊ¨õɈbGP6l¥<“ÅŒÅý›qÒ§'4BAØBïL7…qéOåQfS$è&‚­BÖ? ×Î úÇ܃e;!.ò\KyBx=£²ìwlž²$™ãXÆsÄ(·˜³ŒàK:}VÈa‰jP¢4¥"¿”5=±½HqbÈÄ×Z¥¸‘Ãpd^–gò¸”Ìw3ò~Òð[a‘LŽ]&T¬€èÛHf\9‰ó¶0‚®ž·`2¯ñ—2º(øl;‚2ü¬gä+Ëù:ÖÖž·¨ŒéÍî»üˆïrV)\÷&+h²Bá"Qø<6ÊŒb]‹õÎE‚siíÄwÔµ¥Öß¡ÐèÝl‰ƒ³È†2‚w¥o©’2í\7é­¤LU®¤Ìá°Ð¸aßð:Ù /¥ïÔ-6³o¨Çâ¨GÚöžTË©šºÎÓM¯$”’ðç!Å­tŒ½£û§¤K­íäú[ž,9ým“õñ›TJq©R®®s¤îwâ‘R%¼ÆÈšfñÍ 0;ÊP’Ú!­Îïz(3WzÞŸ3]Pr«ËvèÑTj.f‘MæjºõQ|Fw*¼µ™Ì)T×—|ªºÊJ­÷¯Ød›èCjwkǬ¼õ=6W¾ vîCx'ò¥‹ÐÄžÓ D¸†ã c¦êÄpjÂå÷ù·¼¶mu1Õð—b:}¥Ó—¦sÇ+¸+ß_šö*D'ÛVÌO™e+î×ÔGÿ¼ý] ¯]¼·ÛÎòýÅIÍtjeýß_~{yÿ‡Õœˆ`NÄ>ºû÷­ž»3ëJÆa×¥n/Ü^E¶ÎûøÈ–ï8¼¢7Ñf;!Óµ–6‡DV'ªP¨^ˆjEõBˆ ªBy9\ñ©~|Ê,[q¿ªÕ‹ªÛ zQµ~ýŸê‡kv¤¶•õwKõâV*UI»iBbÑ* /T¨ÂFèyÃè¦8®ó‹ÑkÔ‰a‡ú4‹ ‹Ù­Eª¶DAoÎxlÚ_ DÁð”Y¶bÙ>fQ Û-Q ßG%ý57òv) æ>Ê…Ùq¬ç„I‡v;¿›UãSÝ-/ Ô¥9¡§ô¬ÙÜ…n¤¡¥]ìñj=žVjIÂ]ùÞ¿TY™ŸRݪ÷³µ41_0#Éx èÆï¦¿2t³Ìø”^7£×Ýüæqc Êu3‘^¦ªNµÛ‘U¦;ôNDÒ†º“g@ACfö7“`˜èkŒõqý4ßH}µåèá•Å…Ý"¡1žHèµÃ†HÎÛ^óª©B‘`n2À5ã~O$4Í–Hhj¿›þJ Ƨôº½îæP‘`$Ó¼‘2R a–=ßgDìlÆÁîgL£åØµË »³m<ÆlÍc¶Ï1£ûÂã«á)Ëx®÷³ñ³­·³ÕA7:dÌñ)½nF¯»9”1o¡6Âþ†Ä\”¬ùÀ¾Às7KŠ çX°ýÜÜ)ÇÍ­Z^pÜÌO³CGkš}-+Ig‰ûëå-Ï`u[ëuOúʪ^K_Y5ÒWV­'åèF[ Ïñ©IºÎ͸ŸõZúÊJoH_Y© Hßé)½nF¯»9RúJ?ÌšFɬr92‚²{·’B:$W2Š ¹á^‹p:œþ^ËDf•òÒc Õé-–¸+å¥ö¤¼¬·¤¼4¾ø=¤žž²RÜ5ã~jOÊKµ%å¥ º‘¡”ŸÒëfôº›C¥¼ºOP<¨Ð„Š |öÙâuÔ·ÛíjvêF¹½ªÄòÂnÞÒÊã-­·x+pKë^±Æð”å׌û©<Þê›ßà-í»´‡+oOéu3zÝÍ¡¼5CfHO 5B¨%|‡EOÑ‚g‚»ÌøµÃ((U-/ìfüFzŒß¨-Æ\½ÒºzW|;¥×Íèu7‡2~ã—²X3Q]›éà^qSê"s”^¢ë¸5| 4sm) ˆ$X ‚yÌï"(©—†8ôc^Ad»…ñ“­ñ“mˆñŸ2ËVܯ5ÆO¶[?i|ŒßpŇ8 ×ÜH—¿[GBd;cüÛRÈ%=QŸÐWé ©E9ÂgùP ÷î îL8Œž¬œ†ëêå…‡YFUk€`o{o°Œª|€ ªB€àø”Y¶â~­‚²ÛQ+eº 8\³LÒ-‚·>ŽdU9€ ÍØÐš”\jœ"I’úi UÝöíòÂãÄ'Ö4%· iJú4%CHÚø”Y¶b‰5$M‰-Hš>$m¸âßpÍ| I»õq(ñÉúyÝ!‚ %”¿˜ˆ¥6U‰Ä.ç ¸i—'vÕ®‰]u[Ä®…Oˆ£ÛÀ#×á)³lÅýj×Į̱«ÆïC5!±÷×ÜHÍ’ØU{b×úb¼óT.ïDÚÖsˆ±Y]xœ¶k³¦íºÝ¢í~ÏëÑݸ3ö¨³™©Ù¶â~™5m×Ím×µßG]‡´Ý_s#m–´]›3ÐvãÐ\ö¨v!½ì $’SšR|úüæ5ƒ:hæxMÛ,/ìõM)㪔ÙU)リ” AUãS“ïinÆýô@Uý,nø¦”ñAUÃß75=¥×Íèu7Gú¦T;TŒB9"Þ+¤âF¥pÏÁ©¤r±û‚‹ÔjÂcÄf'EÍÊFk [»gª[]§9îTëlZéå…ݰó0NªÛÂ8©ÎÇ8©.Ä8OYa×­0N®››0ì¶0Nªó1NÕ@v3ÆéÖŒ^ws¤0Ô•ƒÊ(X†Œ7×-¥ÞÞnR8”·;«5t^±µ›½u5ƒ[&Òwö²·¸E‹-p‹>¸E‹Ü2>5±ïÜŒûé[´Ø·háƒ[†+>{OOéu3zÝÍ¡ì-g{îHq8ÞŠŽ¼§bog‚è!”³‹tL±êèµðöó¬¼fVvó¬ò@3½jßâYåƒf´ A3ãS–'Õ 4㺹ñ¬ÚÍhåƒf†+Ϫ4skF¯»9”gou`TÉ„ªŽ‘;‡—]d>Œ¢µƒœG šù¬ jœtÌLbN—Ö•§’õ óÇN×NÙ»ßjÃc§oš½ikŸÛø”Y¶â~9$‹û-6ÇÇ>´åo=O•R-/äLVØ¢ëi Ž09Ï= ¹{ËïÍìPÆEûSK÷ÁEè´Ï‹”Sp¹ ‘–1[AQ¾âݦov{^Œ“7¯ZbœWüޏgÛîh¤Âæ)î8hmý}3G×1‹F\{¾ïýïGÄ?˜¡‹´v¯rñÖâ;pÑ+(9#{a§Ë,ÐygòSÄ Ä¶±=T/ ðÈò,lœ`}£MÕÝŸMŠäÄtCX5­¬Ê×¶eJ1Ïá§c–AòA. ‡Æ¼Šç<ÒáŠZÁÂ,á`)ºˆ°¯º»•ÎìV«kOø( ?O áŽÂñú¹cùÂCâY Šñµ ¬Ì>ˆ§&þ.Š]¸y¼¤øN‚Ô»gv,!l=)²ØŽ‰Ãg1T±©‡ŽEuck$¶›ðö[ȹIë¼úËtÆÓ_OH0$gæŠÝÏ!cÝê匈®þ¶ÃyaRr>.ˆ¾¿,-ïi-”¼Ø”3‹YÑÛ€0X–t£ÃͳèwBAŒ&¬Ê‰SMH©k¼ç”q÷ñµ$I™~l'yCdØ ÿ<ýx¾Úõx%$8f§*³||~5F7§<Øn¦`˜ùd¡šfy%¼Í¹I¥KŠÀ§ 8úÄLƒR¬çG@_”¤dŠR{¨®Ç™f>SWèzyá°Þ0„5MÙP^šÖƒy3˜¦Lœ™S™8‡ƒ’+BÑ”Ø ‹ÞÁÖlLt£Þ¡î3ÅíF™kŠ…Écá­%@ÉÇÄŠB!”cÒ)9Cô<£œ©FyB‰9Sršk†^©œøÇPLÝýÙòÅ’ëöW®RmvºµöÙ\Š1"Î çà; I`íߨ“ŽqIðæ”**Kd[x€ʼn#^œ§!1¶ö¡c¦‹3;|J"a£E©hQ©±˜ªèÕvm@ÄÄRñšQkÖªõÔ&é|ìH¦¤æ”pŠÏ>°ZEêY W©&-+!“Î*8ó–7A•ÚSôKœŽ•R(®£„Š.¤Øh©*ì¼Ç%&¬ åÄB‡—EÎv¤³OÎðU%kSIñD”V8”ªƒ”Ö8ª‡Ÿ Šr”°¥sc®.Åqr²ÆI¼‘úýlÄ»ÏMðœÑܽGª|róñ¼‡ìRÂ?žÆh˜,G·ddhoE(ЕW4%@|¾ãœ)ûŠM9—ÙûF‰£@¯Å2/V_Õ¿‘"ˆ±ÁÛÊÃ]ŸO]¾0W0ƒ×‹M¡È°¼)eÃyÏ Ëéx4Ò· ³±”*/·%¬8ŽwŠØI¬¥ SDk)xù~eYB åx€1Þ§—€4“«ŸÀóñ† ÅÛ]Û5«ÃQùû3Š0—„È ’TˆSBM@An`6ÀBÂq#ÅH)^Ö°Ë[w×weŽà&Tï 3ë•òšÛÙ‡8Ö~„R¶ÌÖÉsX$4Ì‘ƒ­+¨4íI"7Úª§™è®ãhVt¢rº¬”Oéøì*Öµd.ENqqð¢Vö‡ HÆ"ïΚ`Ȇï|§±°ê~¾…#9ÀYÜ€'Nö&Å^)6&þ Ì„u3Ò€ù3êªÆøVYÄÛÿÌÇ¢$ 6{R΃NRè`•Ü‘GŠšØí“°s¤âšÿ8±›öÔNÅÓ(îã-.¯S¤M~o¦¨O¿ð GöV:,Þ|fD¸ârû˜›äœ›IÝ?T”+T³‡d꫚‚žPúЧáó6/˜‰·„@æÌ^G IûR"0¼RŒ ¦IIî¤ ô/% Bbù¬—Ðf–hŬL2ßž—tú¼HLœÏ. Výx$Q©¤ ‚ÀŽˆXÊ Ÿ”Œ ^ç%üpÛñþÔãÉ‹¼7 3'Sà*™¡š„ÝÍ‘À¡NÕþÆçµ'º’Ì4KŠÏ¶^¥ ž¬¤CÑú¤zØÇƒ@ŸÒŠ9.I³Ð–Ú[œ:¡ÓÔMY["äé}s~Óþd Þˆ) Ÿ9ù/¶Î„wžÓèeŒ“ ¿”*:WIÂJ§IIŸ§h6 Úƒ÷„Œ§ªÂ~8tˆ‡*$ÄØòæÌ¢¬´§Ïx`í gˆðæÙ ¼Ã›ŒËšÔpê00GåÞjÎwáó"É›®ó¹©±’bü¶å€¤Fw*ˆ>Ç­ÙÏÛz§Ewì –[wÞ¡;55¾cO½Ì(ÅZ{°Éb[Á»ÿÚïU"…yI±Ý,5æO—Ÿºñɇî!¤nüÑOØžº ¯µÅe?®îYp3à œ°ùy·sf¯±{&ÓÔ»-*ÂΆhĹÔÖƒ¥ÎÖ3fûÚÁÙ§Þ"~¬_ÄMÈ(<õ‰ ?¯w†÷N`N³°VžæcŽá¼÷ö:QÄX8å=;)Å“BÀR Û0 iûšyW@‰è²:$"¢¶Ó(ÉY? y?Jú94‰é›šDO¦Y&Å ‡£o‘ó6Þyç“nvù­_€?'Iy¾b-ñ—@P*dU?>^jEJàHŸ93+QRï"­ñFÞyóAŸ!ÄÁËüû“´‹ü}¬ã«sÎYx+¼Õû˜¾9ÃÎ2 ßÁ›Mk¬çÌ» vtr½ZíõI:÷ž‚5È’HÀ‹ã"•ÂãsÆ„­OØ?; aãô ”ù3ƒ2q†%ÅE:|?žÃ622Hÿçò£ç„(£|¹÷ÀNj7óRz‚®Äã³G§á (™§q›Oœ¶ôò*Gw_(tšðŽúhß ²ÿ$ôLˆ¨u/Ô²5¶ÏöKQb–&ú6¤êÎvh+½QÂæÍí´ñ·ß±Ô*’>}‘&E%¸áßýˆÝÈ¡‡MâY…$ °äÂ$€ —°.ycÅᬊ{öáùÚTêj…ľÇ ,þÑ»’ðËåËËÿ7ÿn\ endstream endobj 4035 0 obj 7495 endobj 4040 0 obj [205 /XYZ 38.2500000 648.500000 0] endobj 4041 0 obj [205 /XYZ 38.2500000 137.750000 0] endobj 4042 0 obj [205 /XYZ 38.2500000 477.500000 0] endobj 4043 0 obj [205 /XYZ 38.2500000 477.500000 0] endobj 4044 0 obj [205 /XYZ 38.2500000 648.500000 0] endobj 4045 0 obj [205 /XYZ 38.2500000 101.750000 0] endobj 4046 0 obj [205 /XYZ 38.2500000 427.250000 0] endobj 4047 0 obj [205 /XYZ 38.2500000 363.500000 0] endobj 4048 0 obj [205 /XYZ 32.2500000 668 0] endobj 4049 0 obj [205 /XYZ 38.2500000 137.750000 0] endobj 4050 0 obj [205 /XYZ 38.2500000 101.750000 0] endobj 4051 0 obj [205 /XYZ 38.2500000 427.250000 0] endobj 4052 0 obj [205 /XYZ 31.5000000 668.750000 0] endobj 4053 0 obj [205 /XYZ 38.2500000 363.500000 0] endobj 4054 0 obj << /Type /Annot /Subtype /Link /Rect [481.500000 328.250000 501 335 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23D_dinput >> endobj 4055 0 obj << /Type /Annot /Subtype /Link /Rect [43.5000000 313.250000 541.500000 327.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_date_marshalling >> endobj 4056 0 obj << /Type /Annot /Subtype /Link /Rect [487.500000 293 547.500000 299.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23D_imcall >> endobj 4057 0 obj << /Type /Annot /Subtype /Link /Rect [43.5000000 257 545.250000 271.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23D_dpcall >> endobj 4038 0 obj << /Type /Page /Parent 2 0 R /Contents 4058 0 R /Resources 4060 0 R /Annots 4061 0 R /MediaBox [0 0 595 842] >> endobj 4060 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1700 1700 0 R /F1409 1409 0 R /F8 8 0 R /F4039 4039 0 R >> /XObject << >> >> endobj 4061 0 obj [ 4054 0 R 4055 0 R 4056 0 R 4057 0 R ] endobj 4058 0 obj << /Length 4059 0 R /Filter /FlateDecode >> stream xœí]KäºyÝ÷¯¨u×)ꦧ{d`pÈÂÈ"¸Ž¶‘‰ùû©*IÕÕdJ<Å—T¼{fš#‰ßã|¯_þå×ÿ<üù‡_¾þú?‡ß¦ß¿þúR»¦ÿ;œýîö²?N>t}søío/??_¾¿|?ýÿÏ—ñ_¿þÛéOÿw‡=ýï/‡?üÇ釜þÑùüí¥Ýé÷¿^~:qúSuýýüóÿ~ù÷:üýüÆùsÓd>ÿýwbªæ2…Oÿ|™—).¿þñÛß_~7Àí+õÐ Q„ªÕA Jþ÷¿^þtúÀüúêØ·ÓðÏäÇûóÇUsú®ýÁø²8=9HÑ´}+»ó÷ªzü+û½Nž?Ø4§ý’Ãiå­0{ùåçõ!^>ˆ€/¿ÌÜû®ˆó mosÌCÓM[%Uç³>^à$N7² ÷òË̽ïÊtÌæÛ¿»¼OÅÊZ|ýñòË·á ÚÃ?iíòÁËo?Nèô—3”ÍáÇÿ|šOýûÿœ8S5ÿ p쇪•ÍeÂÓHGÔeDU= šëˆð™æ2RÕöÝÊïôúd¿ºXôèÃx/]pxSðzjøÌûe¤9Öò|®·#ð(Åm#k±zg бl(^¨q’ÆÖ?«j8W¸ Ùîˆ `Ü"Hºgnž½°l5ü0Þ%1’’¨g‚Œ6Y¼çɾ¡ÊLÉBæxÿ”;x€×¼ÿ8É¥ÇDŠèN¯½/UÑèbEDùì }v¢½{—«;4,œø½Ó«ÏîÅ=ê‡o«ÞîÒ½õ@úÁs«¾ø:¤^´U§¾5˜O`¹…Wù–ê„V î.¾ëXÁ{€Ÿ!8‡e 8’ßÖKä¢m‚¬áVã`E KbL)ºr€_u7<‚éÜ8ì®^@Ö:tµÆZåøM!æ5­Ñ1™ûèmmBUhyât=ta>~w8^¦óé08òúDUëÊŽj‹¡,x¬–#®«¾‹ç¼F. Az ð}”•Òïc‹nTð>J4‚ßVÁ{?íý‘º†#_àˆ Î+ä VëÃ[D$îÝŒTª+ùaዯЬ j–gRá? x~Ù Vìýš Xs|Õ©‹¡¯ÖCÅ–¹­§.†xñet±·0s\)StÎè& àƒcB±q8 l-ºxö šg'²&53†#DpcmV"úëd¾¸«_é ÕÄF° >®Ù+àFÞYʨgð jÇ\TB+º÷BH`8ÈÄËî±À ² Êtz[ÃNpà‹€a45±RˬáÜd,q*»ë'Ç-Õ±íÄ'ûÂE"ð|‹´ÁtÎ(IðªSé/ûö2èÖTã °X~Ìä!ž.ph1·g¾qРRpŽ#bÎüB¬~U× VüBj1‘Œž}ÙFô¾ž”eÑUðì—ôx7è¯ô]ïkô©H°•üeˆ$¼@ Ñx1FNµ>lÊ!„Ü’1 - S†Ù‚\B®ƒú‚ZÝt¤P"¬ür¯r`_ž¬(°T]iy™÷€"çÉ1a Ž0YW“±á”‡Yû])|Fb˜Óð¬áDƒÌj%æDr¶º ù ¨LUœ(N4Çj¨?³Ù]i:BÎCk˜4Ã4‰ 5Ϲe>@'¿ö& S'ò[@c}Jt²l T‚oZ¤x)Ϭd”ÄwŒÄß[üÌëÄkýFã&áž¹õޱ>˜$G"¢Ó$Ú,€f¨5YÈ\!KèœQóÆKüž s¼ ŠJÄ`ãJhy½Ãrî´…_,&ÆIÏÓÈ^bü ޼¢Ñ¡ ŸÁ±ÅÁ×2 ©“÷B;‘ЙP›ôp3x²EÅQÖ(|6nzÐɳ Ó9!Óx²zM JcŠYøµàcÙ‘Š.Ryg”S…òüÆ'-f»„µµWEkgÆa2L/Öá%¼jɯ2ÆZI-”ÆÄÅRÝ/Ë´ÔÐÍ4iÛb›Õµq\¼¿$ Yç§ÍÓoð'a†¸e}ž É| á&ǺŒ½À[í7P0V¡ƒX ›Å`sö…¬¯IÅJ„¦³1<É/™Øã¤RuÄ!²;ª3œm,ꊔéµXP4Cyœõ½à¤€ëG«xWÝL¿L°ˆXXÆ5éÊ2Y¦8Ôz¡8f4ÃJ”øôQ…•Éÿ¦Ê±¼Éh @yN…Ž•ðÁˆwðào2þÌ%÷ڇǀaCÂ=¥I³hàUØÊ×~ÞkðhµËsNCôÑ 0ZÃ$/å!±v“¿Èí; \°Šc¢#¢Y^Éâ¸ýæ{3áÇ>X¿çôÀõ ›^%tY[À×@Žþ`€þ ÕÝãS}ôx»ŠõYqßÐÈDÝíqBV=3ÀgÆSêh¯èmR¢g*<ƒñ¤@¸£ÓwÄàï¨Äp×ß;–ÔRC­UuDÛnŽLGÕ¥±æ™/ð™>ÓÏ›;šL7äß»¿­¹&•ƒ ÀöX_.Ù͈z…ÏÀïLVÛY[VZÍßi´ïÌvg¥S•£væ!»ìÎÄï=óŠæ†g0¿Ëz¦HÞîX«äÞ¾ ö: à›Ò7›Z|& 7¯g*tˆ²Û‘Lk0ÒDmˆ\wK¨Vzë#=¢„³©Þ ºËØŠÏ0œ8g_*²ÍÈ&j…Ê#bXT, $4[ºÜLŠówc  ‘ü㱚FmÊY¨Þ}][ßÜÔôs[\££Å•q- ¦ž[Ùê®|‚kÖLõM<Í 2]G¹ÏmU/®G~[òuËM/#™ßçlè:ÎM—ò×—›^F¶zÓqˆ ßç22~ï3|FÀgÒÓX)÷yõƹ›íCÖ¾›°¢¥Ö äpé)©Œ<ÕÝä©7έí†ÅÕ1·–áV¸rÖ|Ÿ‰¥vUÑžèÖ>õÆá5C_xÍšÓ*Oá5ÏH½Q¸P'ºÅÓŠ…!Xn-Q_Sàý%šhZfP4žÝq¡§£Þ8¼¦n ¯ Åkðܰ¬eªã`xnØ£ƒçVxM¡ÞmPoÞÙ4‹4ÆðNK§#\ŸœÙ«äúFÙï B½qîs÷P%\ƒå\דØ+ˈ×鈥#›°ÌØ™}—ó}.Ôˆzãð´a9’Ô3O#Τè(ûÙ(Oã©7Ê}îE xQ&êw‹ePyŒñïLÚos$çû¼êÃê0ѧ›ŽéGtX.#yäÌ‚PoœûÜ,¯›ŠGa,¬;`kè["áÛŠ•Pîó*MÜMóÅ’¯G„ˆa‰ÃkÚŒâlñi1Z›_/uÑ^ ¯É‚z£â}F‘±Ûä[ö§î°9êez¦o€×MÔ•Õ¥/› gÀ”òœJTÝ)t:×Ë5ŸÁ¥É0‹%ªy¢—ôQjß/Û¤Ú8<ƒj[‹•T¢ƒ‹EÎåÜ(5HÔ3 ù¸ ž{WUWë|3g+gÖã^µòIsë°BŸÊš}YüQŒvŽP\‘X‡í{aí¨ÅZu¯ÚgSoý¶Œ/I¥´#J§[óªFJ½r½ÛįêŽ7E)ø Ô^Tã®Pæ‹.í-{†±›Ra}±b>â ÃO¤(n€‡EÀ¯]F¨EÇ‚1…ýLaƒ(°&BL½t£/œÍ õÙìÞéUÒ2Ö‘¡ðˆ5w‹çˆ¹ âA¢dV„ƒ.Óë/E ßš‹÷íÁËPFmÒ Ÿ3; N!•Y0ÙÆaÕèAvš¨ÙO®ô0V^¥”×oˆ6Õ¼¦y΀fØNÇocU|püGzX#,ǰF6å‡Í¢1¬fÜ—ï 1.D_ j‹žÁ(+„ÞÉ”ô“]X¥hIyMvWšÜŽÝTÎjÛb¬ˆ‘FJ.IÉE!O ûµ›s>–›¸ñ"\²)DïŸ(_ï– ©€"·­Z]Ù‡‰¶h‡‡5Ú^ß×ýÀ!]­´µeàæ—bûu?Ö@uÖùº@±úõ1½¤BBm¯ínAŠK=GÓÚ)­ÐoʥLª2†¹Â¯Ø©oð³âÑ\q‡Ó(T^1Q+„20ìä°IYÆGpž“…êS’ßVó¦ ” ÏÀKˆÕ&a“t¶Gí0h@¡Û>^+)˜7èê~…fM¨ÚC`§nežÅÞìÐLÔª[m¢ZÐO‡ÂyÛ`2†-Ð&®@ý1`¦…²²É§¬Ç´…ne=˜Ò ‘Š;ì¨È0vC-xßwVì"=ímG³.r®Ò7Ɉ»çˆfXg!U8ÂîÊøõÖû…š¶]Z.V¹T€æÞbi"UÕs°©£9„k4ï;ŠCøc Œ!ÁµZ mžÅµšµk5C]f_•Ö^¶ÓҴ˶_Cñ~§Ô…J¤{Fúgq¨{â¥èöªsâ…~ÈÞm•.èb™1[Ž8*ll³l¬t1²Í퉻Q^à`ጷì\|bçãOVÉá€.HC4x{™89lçaÃc)/ú*Ç æ†\ÖuYV{<¿à¼Ò¶ºýÉ__~µÏ0R÷2‡µ`ƒ¶˜ö%ÎÃ3 GÕ,/A‹mg}ܾ:‹Nñ‡õ|Þ8ªQ<ØñJ`Z‹'@‰Ì䧸5hs0h*g8åæUkÈ;¹y-+M‡.âì7-awPC1aý˜°Œ®g¾ž˜ã“T.ë†ö¾¨a"ÙC‚ ²Ñç‰Á€¥£ »¥}Ý­ßRfßÑàø}gEܨÀµ9…З³*pކ%«â Ž,§Ü{æ}˜\ A0•Aÿ õ`iˆGˆª6–„H¦äŸDzƒ®ÅÀøT«»ü|òe#ËÜŽ4a¼µÔÍbÑD²[²QëÓ€üµú1â TïÄ}žBZòŸ×uYÖä¯Ûþö'g?ÌžÎpt{eàúõ•:0Íy6šƒÂZð(Õè›io¼5·?wŽbJ:ü8H ×ÖƒWPõA²ÆíÕjûØûÝéÕ;œKMKlîi]—e‰kóIÞü$d”³)yeßYöçónœ£ùÇpfûc#»Zê‘…ì0´hœ·˜¸&âóV×Ó+}ób‡~Ï®zHkðRÓÈ!ÂA™#ùP3DÖrˆdî‚–¡Ï OHo,lê]­Ñ‰‚Ü[7¾„­ d7hûb½qÖÛ+&P õ¼›¥?QÕº¨Ù‹ß ²?±äo¬â?^ò7JÖeÜÎk_ÝÙC¢ëJ}¥ï{ŽA…¨_—[”á(ŽEul;±¶‹6ðI2®@&~?C=NN8Ãýö,Qð9é2Hø '+ ó(›À÷ämT²‰Ýˆ€û MöÓ­5¬,Ú@ÕŸP~]¶i]É*&ïw ¯õÿx"x-!¬f¹}Ý÷l "gLWt NKÎ9I5ÃIŠ5½fébp‡ Ês†vz´⢪³¤®§‡VŒd¨º”Æô’¨ê.4xS¨csè‰-¢šËç=£œ¥Yˆ^·Iöâ`Ž€6úÞ=M¨ô #a–º ð"' ˆ.UŸÕðQ¾[õ·? }þÒÚûö@ÑšÈÝÏk>Ï­üî‚…„&(µË„C›©$°Íz>¼PN¼×-­ºÛ$)ƒ=u0ùØéœq*2ûñÍ€ýØÛJö]îшY‰€Í„‚xî!h²<;rqN±×dóÐæz>HQà:‡$a˜‰IÝ+—d ô]…îÅwËÆ°szCÊ–NiÂ…òæ|3Ic£¼ÂÁ!ƒiÒa² à°9ž±²õ4©Þ}Ѥ­óÄX°­ÔgZ¸gü$ÁЙüân˜að.ýJŸg¤†'§*÷ü6 ƒQ!lîãL½x&÷[r©1Œ,àQĬÆy“ßF|rµ· ½¼SÖÙܦF.{µ¸ªªq‘J©íÇD‰ëÞl†Ûæ¨.‚tO^Fry˜ìë¾=v#ø¨Q¿77Û ¤déŒ]ŸÅ‘j“€PgCø)u¾ç¡*•$o¤fp¾ÑŠl¨" Ý庡t—}lxÉaÄ»îòAý1u—>»õ$1 *•÷HÖ¸ ¦>ŠéÞwðJáwð]¨12‡d2¾Y‹S–tó¦ë>ÓÄDó†a™*ÊH)#e¤Œ”s$ŠœêDŸL·HJ¢ yz­¯Œ«)w«i›7«ØS¾GÔkD™SwÙ¬;oÁÇ~òìdÃËH#¾½7ÔÑ[Ð5í[Áxžwç“.‘ñÐÎBoÙÇ@tu7“ÓKZÍGÁí@ZÍ>6¼Œä0â]«ù þ˜ZͰ…ü‹dJŽ,”‘‡ðƒ{ºKú\Lo9c˜®3¾?1riúƒîv¹[UöÍ• N¥çªãXváfßÐÈD,ÍQ굘g¤‚Ï ð;#µÇZŒ{øñ¶Wô69ü9~¨?çƒâYE#S)_oËyFríœbû1éþ1ø"ñ…Ò"ý0çiÈ÷yšFÇ“õÉð–ü|͘zÆT÷õTÜ~Û¾»Ô@6Á¡*.øˆ —(8“H5å©‚BÄ ,sðeÁëq(@½þ°-sÄ™ðÙ25@0=x­á¥C¤žÝc•SÛ¨æXé’ã |Û$‡ä<ô»›%”YɆª#ã‘ ³Fuš4³”àÁKÂ4ˆ·oߺ'až’ù̉b¨9`ˆ&¿’ îˆy QèÞ¡°™¥^Q•Ê"ð˜úbL9'¼)Œw¨Wµ¾àC}¼V³T÷Q|©—d¹Çø¢Ej3»©•‹’=dÕÒª­ui —«ç ÓþƒÒ@×›é AR›ïe^ZQ3]m˜š±¸¾ŸƒJïU4¹ìßz[Œºqá[·@Ò æT]\K“ª<Œ™w$  Zgó"ï#õ| x¤’úu؇Æâ/²¤|Ôµ¬8„€!)¿ºÉ3s¿uÀ ˆ wLqi)ÈèZŒŒŠT{6–½LtéÛÁõY >d+¼ºÕd¡çÖG>D’gäÉÁÁæU}µðef²‡ L®1Úp,„ƒ ×J鄃´ð ÑÏ·oôZÝ<óz=o=áXB!ð j8R¡ï¨=Äàp<7ËîÀY—€Wi1ãý\îÄs¯/¸XX—L<Æj å%ȯÛÀ/†Cn0Ú)6ÐC:’­Q°NL.­GEŠÑ.“7 ²p¢Ñ¡Ø|7à&6kÙq›WÈŠÔä]4œy'ö«á8‰ÒŽOç4‡…ã˜Yê‹ØQq›LØ /*·ã®;íØ,©Dœ.2-<¤/¿o´µÅˆ,°möP¯Þlª­-ÌK±äÙà\dœ=LTͱ̠Mr´}§€Ò%q–xj) ñ¸ð&™ŸX)Þëz‰÷á¹…Ô­*åÊSZ+„H¥f@(x(ßCfi <o›X…ßàù46p@Þ×KCˆd]§ßòCtC‡¨D *a ÒB)˜a a‚ ’I—않®¥*R¬ª¸~'QÀ¢¸c…šQ›±:ܲÒ1†m1=Í-ºŒËuàå¦D#_#ä8ÈA7%c…€X¸NÜì¾@¨Â:†ƒ§8‹@Ú™³(Bý»ÌÅÆ0µËO® ¯wOü×ÂÕ åzQeº0•Ó¯ÃÏ÷°2—ïKÿ`÷é§\‰sHÈჹ HÆ#©twîÜh­É££¡ µ¦5Gê·é™Öðò½¡ïÔKÑâ÷æömZ©37&p¥ß`Ì$[sMâx|ƒï,Cà·Ág&ö)œ–~6²wþóiÆóÌßá5Æ» I?ƒI ž÷{ü¹Énãžð0 àC³|§üºª>N—wÝIà‹%›[6¶ÄÂß_þlýdÍ endstream endobj 4059 0 obj 7113 endobj 4063 0 obj [206 /XYZ 38.2500000 736.250000 0] endobj 4064 0 obj [206 /XYZ 38.2500000 736.250000 0] endobj 4065 0 obj << /Type /Annot /Subtype /Link /Rect [296.250000 714.500000 365.250000 721.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps >> endobj 4066 0 obj << /Type /Annot /Subtype /Link /Rect [156 674 180.750000 680.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_special_variables >> endobj 4067 0 obj << /Type /Annot /Subtype /Link /Rect [314.250000 618.500000 356.250000 625.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nspace >> endobj 4068 0 obj << /Type /Annot /Subtype /Link /Rect [120 536 130.500000 542.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23D_din >> endobj 4069 0 obj << /Type /Annot /Subtype /Link /Rect [132.750000 384.500000 147 391.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23D_dout >> endobj 4070 0 obj << /Type /Annot /Subtype /Link /Rect [213 161 252.750000 167.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23D_ddirectorinout >> endobj 4071 0 obj << /Type /Annot /Subtype /Link /Rect [266.250000 161 309.750000 167.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23D_ddirectorinout >> endobj 4072 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 119 107.250000 125.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_exceptions >> endobj 4073 0 obj << /Type /Annot /Subtype /Link /Rect [148.500000 65 192 71.7500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23D_class_code_typemaps >> endobj 4062 0 obj << /Type /Page /Parent 2 0 R /Contents 4074 0 R /Resources 4076 0 R /Annots 4077 0 R /MediaBox [0 0 595 842] >> endobj 4076 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1409 1409 0 R /F8 8 0 R >> /XObject << >> >> endobj 4077 0 obj [ 4065 0 R 4066 0 R 4067 0 R 4068 0 R 4069 0 R 4070 0 R 4071 0 R 4072 0 R 4073 0 R ] endobj 4074 0 obj << /Length 4075 0 R /Filter /FlateDecode >> stream xœí]É®ÛÈÝ¿¯Ð:@Ô¬‰p»Û²`Ø@AAgBâd‘ßRÒ+êYG·ª(Š6ºß³(’5ܺó=÷»ß|ùÓîoÿÝ}÷ñË¿w?õ??~y«ö«ÎvÇ¿¿¼ý@·ûþ÷]ÓºÝO?¿}Û}{ûüöùðÿooç¾|üÝá·ÿíôî·‡ÿþ±ûÃþ¹ÿÒñ ?¿5ª9üüçégרÃoÕåçñó¿¿ýþ»Ÿ8¼®ÌûÿR~êú8Œ‰W{¦©NÿûÓ¿Þ¾;/@Ü[ìáw§wÊ»SÕ»ÿüåí¯‡ ¯öUª©mS=ò"eíñUMÝî”jërã7þJ=?ÅÓ;Õ%|úiìò ct~ú¾µF™F;{ÜìãF»¶Õ‡ßÓÿytÙá´lK²+ÃãS슪j—’¢Žc_—~ËáÃ%´R9/¶MŠ ¸}†»€wÎÝ9uPæn]…·îxÅÄow?ñ{W4¼Ò¦&m}"·&£üÓO®ª&(ãÞ‹÷x†$÷y•2ð!øÅþ1ÃÓíüu;-ˆLÝùGΟêÀyÇ|ß Á÷`‰€yžO ߃‰åyóé7p<ðBbÒƒ/ÖÑ`{·aþ4!†„_Œ÷‰ÙAƒ9±Äøu>ÌÊìn•ž5ÓÀ™ÀWˆó˜¡§Æ6¥ÁEÍ4@oÌΤ &3üø‘ž;ú€!D‚?ÍHC®~<½Ó $?k‡Òˆ_Bº¨ïý‡¢íCIJÇ3†<*° øLãÝÇ»1ÿ¼Œ¿š–e#0zø4¬.€tu' ø¾† †€ðgfú*b'@ðóPã0ȤöLžÎ”Ž]d"¡©¤ð’ôî¾Û1pzè†T¬ÄéÝ]ãí¬†>=íR«ªRµ7œÒ…¸•ö:^ œD(ɆŽR\UÛÓLÒh}°øFt¾%°8k„(‰lAú-RÎ?º ã H¹‘°ÎÖ}¢îøq(ʼnÑ>g!_®¬f"^È ˜0º,åŠÃJ…¯Sµp²þø´À3.« }’2³b z<Á͹9ãi²ÎM+V3 dª!Ü‹Õ «&?Æ«@ŠK|~ÄwÎÀmkoݦ¬…ÇWaü8AUÅèÖÎ&¸Ya-y#ÅHR4•Ïlr »í_iÝ@¯L0:I¹Í:Í/é(-pÉõ¬†ÃݘŸ:Ç ?S9‚ SE2Bµ\}½Ó•[tÌ–qÂÄ€Ãi}Ø_æ3lèa?Në4«º÷°Ûª½ý „‡ý8„÷K½äØå’`æÃ<±upxÇSñ{"ÐÊg|34›Ë„Ï̸XR×Òà:Œ9"{Z""bØÓ&[ë IJ<}ç º­|#ÈáÖY¾±6^˜ìŠñO¦Ž-ShdÉaŽ€GŸ€Â)ÕÑJ%NEg)&…Ú·/.±Ê‹çD¨+ŒIS©ÏÃydðÙÕnz0ÓÒo~r…š–©$÷å´ ñUMY÷Û+ ©%k/“Þ×”J}ƒÛ+3~«eKì•J/(›IY»‘>q6£îùÔ¼}÷ zè-,ã·0®`ñØp¶-Ž8àèè=xE¨ÖS¡è{àdDœ_ <-E?¥ÊÜ)ŸM ‚G&x§ü?iª¨¶OµSM^€>ô|€1ªêºÙ¢fcŒ¡+ #ààäÀäž ¥ûÞD7œ¼H w‡ØJ »#‹§‘)WVö=ƒ”Iä!Â&1ƒP*'‹B“Èë^K¾uYƒÈôR®§99,‹¶$m9/KãóøUm»ÊÍ&8,Þ7‚°ÖÊÛ‘%÷Ñ‘õªQ ¢ÍϨ3‘º(|!ÆD:eË aÌI¦ÜQs%Úk15ƒ”‹›ñM0=¬d­‚quÒ°á®î|6ÌS0µäjZÄtÁlX¤ AD@‰ékŠçER ©p؈ɤO‹ª9æ}²¹Í“ú”žT£|ÎhT¤±'#_/Ó¿hšÆ›vOôi—{p1êÍ>»¹R²j»«½‘­\ àÐa„d 7Þ`Ô "•!âB4+&A¯|çÍu¦$–OIÊ„ÛÇãoÏü–¾Tã¯ùBµz•5î3µÈÍÑê5”1eœG™•¯”žÏä:7¹î4úuͤ†•KÒÄ•§Ó£zô›ëº¿úÍ‚+~ó ¤8 ß\w$úí†6¥ú͆~óJµ.¹â”= ¯D˜>‡ñ˜³!Û÷UÔjˆçA5ýM3®,ÙÌ\g_Δæ¬ó% žüÁ{Ž“Î^ÜÑ [}IáÚH´;Z—®,ZSÿ.ø@:ÖþqÉÓ\ð³ãàOc·C{­n?8‚Ÿ=¶rPùr¬.Ëæó;8hoŒÇg¹\ƒvÞ t‹*,BÝ[°°§ðá ï9•—ÈTÜ­£‹£Lw¿L¦qLRP¦„È`Bmç«™ÎyæÌ´ô~M§Ìô¤7<Ÿmç­žÆEª¼+½¼qpïÇ„1I|åuÖÍ@ô fÝ,\ƒgÃ]°ºõ9‘ î“8êyE,¥çOgòzO—Ô9z¯ÃŒ0Ç5¯³:˜UãÕÉÌñØRêŒ#† ºÁÙ¡áÍßâïqî”À¨q}$¦%S6‡[Ä"ˆ/ﻉãÃï…ZçgÇV‰)/í³_V~47gjOà•ïÝórh°QÕýÑ7Š”ˆ)mK80Âé"xÃæ³ðˆŠÚÕ‘èæÛÅ“Ž,Á8¹?¤8ìÙÚÂnTÂᨷbÁ3UõS7"Róm¼œå*®µï=*_ãÒ ìUø”zÇz›¼Ö—WÂv.”Š2¿\Žq©¦ÆvUØ…Ó|×™ý¥Í¼r ©Ÿ×L‰àOª{½œÁKe1§•Þlð¾YÕUÀ­Þ{*ã!ßÀ%æ¬ãƒË‹”œV3nœóŽ—CèÁ øþ;)03Æ1-ÚçŽâ ¢jÙFÞ²^z* —ÉÊ`´Š¥Àh$côç¤é¡èŠÃÏ/¹êv‰Ú)ž Ñä3q:7åµ”-í!2BÑ 0hYȲ‹cÙÞÇT‹Íˆ  A“™ ÜŒv]¥-h-›Ã€ºô(`-F‡,âx`ód;Ë2¾: ‰òAWáLG±¢|ž«g5¢<2"P;ÉOܳ¦m=vQÁlÖ@v.Ì Äªð{˜îeyãh÷òƒ»Ô¬Ý)ëíŽòçŒfÖM=½ |¯Â¹ØDÎw`O“«&ªj¼õxP<ëfŠ·ÑZ{+• ¬®Qz £RÉò[ÀdÖ*3hxM±„Žî9Ï•¸4Óp'Ç×Þfz¸ÝØÛJÀ‡ð~ “udÒ0Þl&‹.ðžü1^ã´ON¹``¶PëŒ .C,UI±Àûøƒ\øåeË4Ñô7áB0¦<}šb–â:]dJ[¶Š×ƶƒÝ«µÙª`Š%¦ ©Ûåšò¤§vœ}íµ¯ö¡aoáx4ç^I\}kìá{ ¨oË@'ö~*ŒÂ€ ƒÁû“ Ï€è/‡ï±p>¯³¢¦^¼:D$ÏÔ2k͸1‚žŒR`~ð^ð(¾ÓŸ’LÄ\0=ð`Kôi˜`0³ÁóéËL ìÚÉ¡¸lù–“› œ©3•‹\Î!¿¦y€ü ^,FT*ƒ"ú²á+¥r#æ€JØXÁ¢/ïÑ膠`@Täò4tîÒÇ©YgÜE¥üoå® r ,Ι–¹ Œ>Á<#t}®"tÊEœ«öçeªª­÷´4P‡×mJÏ *=¹T›I"™k3M~ø ³e;Œ1È,vö`ÞHl^ã±á½ÛÍYÅ¥Ù,¹EØxª²—,Ì|Úªjcû¦Öðâm-ˆQÕgh߬Gæ`©‰LÏßnÌ-°Ü"üáé“ötåù‹¤ÝkÓn§û]'xç­G®äz¥ÔàÕ¦’ëÓÖЭ%í^¤4_6tKÕŸÏ­šÖ;*h8Nó‹wpÿa §q´}¿9ŒèæƒIüÇ!¼_œ Éîç>º·ï|êò€ÉâèÄ•´]ç-çkKc[×÷Iú1¿:ƒI*Üà@"N%\j¸ÏÅÊqˆ·LÄ‚i3J ‚1ŠPD<,0 "0Fõ˜)ˆQÞ´ÆçøË«wžú¦D€ô˜èòX뱯–\}”Ö"¢°ŸÐ‘W5¾=ð ž<¥Œ›¯3Î/j d(0-±0’(þ¡pR0äÍÚ/:S«°²¥ªµcÚMŠ´6ƒ}À·—ÁkšéÓ$Z&)Ü@Ó>u® ¾\F&=«‰ó\+Ûo “&“φ¥akR4‚0dqÃ#Ø2U)üÒ2ÛVÚã­ÅD6Õ9Ì1Á‰¥$<Š2ê>ÔØU†-ÊÎ-‹‰ ú´Ä0å”}/ MéFp!#ÚR|"ÂÕ‡:¦t¾²‹Ë†({_Á9¢8wSÅ òJoI´µ/î°N”†uÊâi†4jœÈ”Ø"¤¾OÙã…ʵž ý'gyŽÖÓÅš/tÃ'ì­¼N ‚,NÖbŸ#~êäFâ§D¦—U½¶À!ï,&ãêÞ|àÓ˜~™ÃË-µÑõ¥€6G©ÍðZS]*|6£$ ¬ÕäP7£…³ðœŒÀØK¿m §Xf*1^ˆL1Í#ài/矋[<¢Fxù¤Ô=„¶q¥Wz1R²j9Àa‡1] eK!—‡Êô:ÈG²^òI¯âºiçSjf-&e1|×zs[Ub´éóFo˜L^VŸ²³U󷎈&âL£zDr “ù6?„Ÿ!¯ÉÕþ²§í‘5LåôÅã¾iŒ °VˆqÖN/ÖˆÙ1Á+Hñ†Ë·\¾€yJ„œ£fÂaÄi\ˆ¹íê!×*k`©¾´Vz³doáBDy­gÝM”o¢|å Dyy6Ĉr|‚ñØðÙ^¼À®¯=¥2‚®Ö—X!ÓìÙàžz¿ãuÒ«ò;ªÞï8gOqÙ¼MÞ2`®ÎÙîUb®Î!„À†ÛýlÇ~À\½®ÇdemâŠ8©Œ*°š3l:ÿ gƒËmÔ%5sƒË½2½ .wÆã3Ãå–„#ÿ¨ K[GÝëÜ÷†f1z¦a>CÏŸ[ÚvÆ FUDeÆÑÅä7C„K¢güÓ ÖÇå;­žëA­]×Ý~PÔÚõˆÈ×--a åÚØ×¥å”ÐíÇ…}GåG›±0•7Î×i'ÈïIQ=8Â7—îG@ËŽ@ðMD%_Þ-³æc̆¨$l·@ŽÛŠ º‚ȱVyìè Šb“bÊVí´t®¬¯83á†õ¸µ”V¾@†¦Y„:Ê -å6UºqdôlÜaðG 7wëDR"+û@‡þÎ0G#Åïæ|0K„•"£gVsî½ç|œïÁYåj_áƒVÉô:Y2€¨(¥,°¿É’í¢€À‘üzsÝKD°ó—Ò%¡¬­õD`.h¨-Äœ¯Q Äru Ã)ƒIcú›f\)œ ÑtÎ# ×NZjkíë”[GÂDâ’bUD™»¬V& T»@áPúu/~†^Q}¢×ÍieÞrÐÍÓ©ÂMãI>¡<ü€;gsãPeœCŸ—£­.x&LXL¤gÂJ’Àw–x„®ÄùÁÖy$œ¶Ëy‚ÔîÖz3XU¼Ä¨nöQì“(¾’-ÇI’é‘€ÃøG&Ç;}*XEò^®#šJž0 šå[KQm;¬¸U—Ø*¦PÓðÓ"¬âåÇS»ŠêÚ—Š¯`nèùªÎsɇä´íü¥£â¥D?8ª%-¶Sf”©C$#ºEZùŒÙg•Rz‰Djêl0êÞ3;YsÙp %Ÿ³¾è£22EøØÈ°À¾”$5³ä±âŽº1[†Mä…EnâŽîOPÊ‘‹0çß›ÓéÌРT¶Ptɨ²™ üðäLÓ[C]=½•K«+Vo›¸%­Êž8ǘ’ëJébõp‡Œöú–Û6C^L» {Z×®÷ÿZSß~PÂÿ{ÂûÍ^WòBÉ\¶Í?ñS]`áË8gx)µÉ†dCŠì³fcàÓÜrÄ–ÀÒ#’Ö6ÃIOL*®‡eΫ„R“Û‹ 2æ}é Ku5’”ëâŽÑM;SM#Þ[/êáïîÛ ‚Dòyê 3¨¨](öÇFÚíô¥XúÃ-›ba»Ïoÿ”r¡ endstream endobj 4075 0 obj 6151 endobj 4079 0 obj [207 /XYZ 32.2500000 253.250000 0] endobj 4080 0 obj [207 /XYZ 31.5000000 455 0] endobj 4081 0 obj [207 /XYZ 31.5000000 254.750000 0] endobj 4082 0 obj [207 /XYZ 32.2500000 454.250000 0] endobj 4083 0 obj << /Type /Annot /Subtype /Link /Rect [209.250000 428 248.250000 434.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_features >> endobj 4084 0 obj << /Type /Annot /Subtype /Link /Rect [286.500000 167 318 173.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23D_importtype >> endobj 4085 0 obj << /Type /Annot /Subtype /Link /Rect [301.500000 132.500000 344.250000 139.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23D_splitproxy >> endobj 4078 0 obj << /Type /Page /Parent 2 0 R /Contents 4086 0 R /Resources 4088 0 R /Annots 4089 0 R /MediaBox [0 0 595 842] >> endobj 4088 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1409 1409 0 R /F8 8 0 R /F1700 1700 0 R >> /XObject << >> >> endobj 4089 0 obj [ 4083 0 R 4084 0 R 4085 0 R ] endobj 4086 0 obj << /Length 4087 0 R /Filter /FlateDecode >> stream xœí]IÛȾëWè`dÖ Œ·90l ‡AÁL&Á`<ˆ3‡üýP"©–ŠüЬ¯_I‰n¸»-šµ¼zõöåÍŸ?ÿãø¯ßoÞ}þÏñÇîç»Ï‡ìTæYûçxþúîö]ºße•üzøvüvøtøÔ|ÿvh_øüî¯Íoÿ;êã_š¿¿ø{óáOÝ:ÿ‡¯‡R•ÍÏ_/?ëR5¿eןçÏÿ}øÛŽ¿Gì§ësÿïït–Õuy^ÆÄÔßý6Õåë÷;¼i6‹ÍT]Û£²¦ùV[}üï??7ôÃg§Ú*U¶Ì^3‘²¶™Jg¦EUEóÍfº|IcôHG¿¬]0F×þÑEXçªQ^Æ€Ñuø('`²2âè—µ‹Ã¥;^8ø©²F™Rçö|ÒçSΫJ7¿—¦ûóZ Ý•«ó(gRļѶKD|:¯].݉ÃÁEïs^˜¨ûeü£eqôËÚ£l<ú©*º?ðwrîêy×WàY5žŽ&w(èDL£yÝŸsŒrn»2áw@µƒ(s2ºR:Ÿuð<ø~âÛé‡}t Ý|ÊçY $¬ÃùeÛ“Ì{H{NïÓŸøh›7Ú¿CHðjÜñNŒhð¨ð“!,žq_Ô’mŠ3ŒñMÈ…1 =k#Vày‡ÛS2–÷Ôñ]†\?uˆû?XcÀía@ŽI»gø1 AXØQ<û!à£lÇf ÓŸðÇpAAß1P$*à;ïá“áó¼‚]Ä›ñÆ O¡ãA§­á;Ô)À3õ¬B§£>cO|‚GØwšCÜ1ðÎ)xƒ-†\IJ†*=Jö¢l†/¼œ4ODd‰§ç‰èN1°ð¢åøªãUâa ˜‰bÀý`ò°MLÄ$r͘ˆ1ÄÀy0öâÑ<8šˆ!Z¸‹™^„Þ©y›í©L½†<àKÅs¡±ÄKcÏ¥|Ï¥Áò?^|Âȱ²;&ÌUǧ°jé¯zŒR³£DäN_‘ù}‚imë–Ty=‰r ¹Â¦I<(—Èüâ1˜@ëÙ)„^–C±\ +…—¾rUçý”KùÊ÷ÖЖÜòÒ3&eïÙW€é»W°ÿƒY=6§ˆìMo(í=rS¬|yŠ[ŦƤÞËÍxdLL åpƒ·Y‡v¸Ä9ébú½µu™q“1ç,êS¦h*æ}ø´"¨Pœ˜ð’9žãÇ^_Q¦n 4àïì1*;¥º?õïT~Êjs/3|Gk™Òý£d’YŠè.uNº°%B‰Ù&t0mzëk'rŽQe†› Ž^>J `ØN¢Pc(‡šˆd£± õÌÃçÏÖ™ãŸ-æAQŒ‘ø^2²Ä»¤QNº²=½Û£œ<ª·'– ;óðN±M«ë؆íYöi‰:AeÍ ÷5Æ^Œ;D|†v+[|Úx"b›˜Èøˆz0‘ðS}š3õ„XÔ‰DXc–O¹è?D‚X€e>di˫ݢéÂúw—@aDÝùÄu1 ¥K dm¬ £•Ír´Ú™åö;ï|ŒÄŽ9gaÜ9eÓ¼Yg°ÔC8s€Œ€m>+‰›Øb­%’Æ&½žq)h©Ý{ô êmL!\.JiÕ2µ¹'«´<(ZÁ #¬M»œ¼ÛSžëLW’”aÕkr3lvŸz’h{W¯§\ö„•ÊVE¡•Ê#7§òwŠXÃD3“× R‹5‹Š ª.\ôØy^ ÛP¦¸?”mȘR­vÆ¿=͵Gì¨sæÎœ˜Ãxì÷o]ÃXYDy6Qk“Í0䀘&Àíý£{IL¼û \Y"âQ¢B`‘ÑÍ$ʼn z°˜ÈÈRß; ‰™Åñ¨¢qo“ÂêªÔ€àA"²¨º«MøÂ¢˜²‚¼Â£ë°úD~“€‡w ƒÐf×¢ô“b^¢¤/àn%£ð°y—7–r²M'°'ô§q`iƒ1Û¥J²Ï³+Ã[Êÿ;¼ ü¢WwµIâ*/ÜÃÙ“ÄÇcç:¹íR•á&ùtjîP¦#‘àwˆ$±È•½——|6À¢:> Á°´î­žÏh„ó¡±êž¨\úªK2¨û¢5’õ…Áz~ SÑCؘroo¹Æ¸äQÊ1­eúh06 å5+†Êš,RÝhQ[,ÕÏ)8o'"«UÍæ\^ËT\H'“Û>òˆÊæZX¯SÚÙÄ^n1…Ó[«Êû¦Jþ1øìѰl8Ÿ%K¶œZ’¹DÚ#ˆj"=ª†GÊÔ‰kA—ô3ÆÌpÊ”CDdÌ¿ƒ¥Œ%Í¿Èë^ªØ«Š¬œ§ËÖÁ¹Ìù†ž¼|>Vy"òquý”±ú…êËNî¦-pÇ=ä:I=ð9ÈlìŽÌÉ‘yô~Ôë”O·¶L–UfUÑ=.x×}¥:õ°ñº²Vw¬@ºð£\a‘}ЉJGM^°È•|Ô€@®EĉPTî®hwÎç <` ¯¹ðòz:Å{hx"±HÄ›leÙOÕà"U]lÙœQèȹx§ûÑ•v†šO˜ =mí1œj™@3ª®Sâϧ“×’ñ &@•áÞ1*¤­2ÒÆƒ€¢Jîz4J¦§Ñš#•R2ƒ*’Ãã§{ÖR呼0jsù%¸Oª/Ì Ñ Y`¢fÖ¬ íl<]YÂàáépGœ“×ä¡Lpm» À£ª£¶ãñ²-ªëû)Ïà°÷õ=é°´8uaÂ޽SÃwZ!P•Ãïtx5¶êö@”=¹1Ì]ÍÈêà:¤”YyCˆIåÆ&dû¥ ]˜Ê-×Pw\£ýd»Qì¦Ò¿Y>Ås©‰ÊTå^4/Ò­Ñž•žÕäˆç§óû_yUÞ~ðëá³Gxˆ#uœ—à A@šãKÆ„€Hú âl ’Ë Þ˜ÊñMIb†•e:å`ksõDëž$ÉÐé•¢òÚ£C9NÁ»8\›Ý‰Æ¶ž lìFÀ+ Ú ÄžR•uÎW6ðm鞉ª@ßÄÇ=\ßÁ9ip§ØÓÄd ¬`m‰ªà™ìÅÅX áZ¸zè&}ëÄ|·96¶¸EUæa¬U²‚Id«Ø@Ò|°€ù¹ê”´Íøò˜{ÅØVìL©¢rq8@’˜÷J9”YÁ9Ìà=i»8(K¡8ÛsJ Úíµr • B¡ÝÓ‰!C¡¥éOÔ¸D?‰\sL&y€ñ²¬L9ÑíX*Û¾F7x¹kµ¤ÕV®ð„>)"™‰}’­G³Li»vtŒØí‰°ÇFÙT™$²a”çÛf©”¾­*;BÁ‚q l±š< %0g™žàÙÕ$ªÜ™õqÕö¸Ù[² ðþw¡tcŽ£…›Õ¶>‡`yôox¨žt‰è•H´^áq€ÇC™%QÍ“•}úÈÞ¶:è¼—n[½dB6á`‹ýúÌ>TèÂòfÝ¥únKRÃ"¶«¨S1O²ýß°Ôçiܵ> Kx4YT+yá0ÉòÂôùÁö%Ùhÿ¥ÜÈä9×$Š¥c#§)æò=¹·Ó]8(µC¸÷ó5éÜ? `£L] Q;›l öª8 Êlå²@|Ð>,Eà'˜9ŠJòÉ.³DéÆWdeøwDá)%š@åfâ«D»Ú­º>ã©HR™'ý«žæ «ÎÛ Ð·é¹Lž6ìÑè3"¾#^O£µs"›2cˆŠ0r9U4ð5òÀúIG˜^ˆ«`YeSÆF‘€r˘Ño*f?•#Né¾ÑVG\dÇqV9›Øšã¸k¨q³ƒÁu È1Fm¦ !ï±N#?½@o—ŸÖ!?ÝàóRÆ6ª"ŽˆÂ“¨û¤n³4–qoÞnŸ“´õ oÂEŸdm_²–s,ù1.#ÙþÄ ÖœL‰ ¬‰ÂT©ÚR‚Îͯà"ì'Æ´D´hî+< 1µ¡ÒU‡$ä"Y´iºÂîF}'mÙ,=OöÝq»J¦ä»ly&ƒÐóÑü2Y悪ûÆ[Tö©DÐÇ£šƒwPÖ9»«YBø°x‘S¦ç|ÖW „©S¸Pë˜Ñ¼ºpXÓèÃC@%ø_ÃD‰&Ëöi #›50¿ÄÑ"#—×1™hÊA“°/3…×£R¥CPp‹^ì 0Xœ'ºeu¼9ª†ž»»^¼ØÕ`&m ÿˆ'R—.>cKä»6ó¯±GÆW’r*B;G|סR™Ã™µE˜¢*‰.[³}bÕѲ%‰À6ÓOdè¡ÒF#ï ÉZ/Éžm"ZÎtI)ÄÊÈ`’Å$ÐóT fm]¸lŒ€;•}˜*Q„I³—ÍšŸ)l§Â¾B õ ƃÆH {Ÿ!CH\–!„ûG)¶›õäéÀÂÜ(Æoî™4cNbã.²ÝÆ= eOmãfvêÁ¼6Œ;8z5U‰Â^‘¥óÜ }z»–-èjÕ2dUñd: ãÀX^£[ÜöKÕqb¤O‰fÑ!b≔A²šŠu1Ckåp“åXÏâØXX#å-Žvnñ]Ýá{ûɬ‹¢æ_”¢ªœ‹’c޼fº.¨w^éR n5÷j 5— yÿë¡,õí¿>{(W’w^‚Cò¢“Ù²,œ9©Àö÷$ŒâLZÌy*f²5z˜ÿ6C:¢lT·¬¡Ž 7ñ¼ÜW0(P?UÿfY]g±hö座2J‚D/p«¡Xðœ5i`šª.k‡]z²ä³“ó Q6r®Î˜_] OcÞZ°³Îr÷¬6™a™ÔýSç=—ÞÝ?>÷\PΣ!tv’0a¢4êþZܨm"!¦)7»†r ¸_Ÿç¸>ºÎ“§"=SÅæ0æs¦.ÓfRV«}º„œ ø,c¦L(ëÜÃ…ê­ïž›À8UÊ-ºxÚùÒF¥EœV¥®\1g~ÁFΣäÉÕÜ{áFsdçSº’îœd•5·,á$;/ÁÁœè,¡êªÓݰѼ ƒ Êú·ãêCµv›j+Œu(hÁúC|] ®Z hi7&㼋–·“i4× »‚üJ©a¶\ƒ*Í\,Ún»Ç W¬[ µiÝ)Ù6WÓwË6 ¹)7e5]hxwÞxWáÆ4TÂp“=QËøžïÓ\¥J_”$ªµiRþÊÈGF gäs†.Ææ‘û˜úŒÂpŒvìs’R<¸„M`©‚²¶±Tê!r±§ø'ƒªL*³l©‘â¶L÷Ý€·Ê¿¼‹ˆak2% /š³QÞ8Ÿ<>#¢ä˜Ç[M„¹{¬tŒ,Z…PX8‹Û"؃wLHS¯’p?yRL˜jÐó³™òWVG†ª ûUP0…ŠiÌ —b½J ‘-ýµ1ï»w:áóæ  T½Gó˜)£ÍØÚ>v;Eò/¶$X—x`KL1Ü`w p6ŒlCáÑà;Ê¢‚¶^¾ -‹pçß›÷+ÿ€æÒª0ÚP(ßñÀžž"ÐÓVÝuSnwg‚Û\ƒ%·;ÑiäòÞf|°XRfæÔQ˜yè‚o¿¾Q«'Éè§ã§Ãÿü—] endstream endobj 4087 0 obj 5423 endobj 4091 0 obj [208 /XYZ 32.2500000 542.750000 0] endobj 4092 0 obj [208 /XYZ 32.2500000 158.750000 0] endobj 4093 0 obj [208 /XYZ 31.5000000 674.750000 0] endobj 4094 0 obj [208 /XYZ 31.5000000 599 0] endobj 4095 0 obj [208 /XYZ 31.5000000 544.250000 0] endobj 4096 0 obj [208 /XYZ 38.2500000 523.250000 0] endobj 4097 0 obj [208 /XYZ 38.2500000 523.250000 0] endobj 4098 0 obj [208 /XYZ 32.2500000 200.750000 0] endobj 4099 0 obj [208 /XYZ 38.2500000 479.750000 0] endobj 4100 0 obj [208 /XYZ 38.2500000 373.250000 0] endobj 4101 0 obj [208 /XYZ 38.2500000 260.750000 0] endobj 4102 0 obj [208 /XYZ 31.5000000 202.250000 0] endobj 4103 0 obj [208 /XYZ 38.2500000 260.750000 0] endobj 4104 0 obj [208 /XYZ 31.5000000 160.250000 0] endobj 4105 0 obj [208 /XYZ 32.2500000 598.250000 0] endobj 4106 0 obj [208 /XYZ 38.2500000 373.250000 0] endobj 4107 0 obj [208 /XYZ 38.2500000 479.750000 0] endobj 4108 0 obj [208 /XYZ 32.2500000 674 0] endobj 4109 0 obj << /Type /Annot /Subtype /Link /Rect [261.750000 606.500000 309.750000 613.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_exceptions >> endobj 4110 0 obj << /Type /Annot /Subtype /Link /Rect [348.750000 551.750000 361.500000 558.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_directors >> endobj 4111 0 obj << /Type /Annot /Subtype /Link /Rect [375 551.750000 382.500000 558.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_directors >> endobj 4112 0 obj << /Type /Annot /Subtype /Link /Rect [353.250000 501.500000 375 508.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nspace >> endobj 4113 0 obj << /Type /Annot /Subtype /Link /Rect [237.750000 174.500000 300 181.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23D_typemap_name_comparison >> endobj 4114 0 obj << /Type /Annot /Subtype /Link /Rect [43.5000000 167 534.750000 181.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_typemap_examples >> endobj 4115 0 obj << /Type /Annot /Subtype /Link /Rect [194.250000 303.500000 201.750000 310.250000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.digitalmars.com/d/1.0/operatoroverloading.html) >> >> endobj 4116 0 obj << /Type /Annot /Subtype /Link /Rect [282.750000 303.500000 290.250000 310.250000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.digitalmars.com/d/2.0/operatoroverloading.html) >> >> endobj 4090 0 obj << /Type /Page /Parent 2 0 R /Contents 4117 0 R /Resources 4119 0 R /Annots 4120 0 R /MediaBox [0 0 595 842] >> endobj 4119 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R /F1700 1700 0 R >> /XObject << >> >> endobj 4120 0 obj [ 4109 0 R 4110 0 R 4111 0 R 4112 0 R 4113 0 R 4114 0 R 4115 0 R 4116 0 R ] endobj 4117 0 obj << /Length 4118 0 R /Filter /FlateDecode >> stream xœí]ËŽä8vÝçWÄz€‰I=Ã@Uf–/ 4ª/^=Ý—gáßwDˆŠŒ t(ñÄ%)EjvU¥RÅÇ}ž{îOÿòý?ÿýÃO¯ßÿçð«ýóõûKqlª¢ÿßáüßo Û£ýû¡i«Ã¯¿¿ü8üxùùåçÓÿÿñÒßðýõßNû¿ƒ>üëéÿþvøÓœ~øgûKç_øý¥QÍéÏß.v:ý­¸þyþù__þý‡¿ŸŸ8¼ÎæþßÔ…êêö<Œ™Wÿx>S]þûǯù©Ÿ€°·”…éL}P¥)ª+õáÿëå/§ /Ž]©TS—MñÈ‹TYž_ÕvÍA©¶>4ÍèE—ÿ„¯b<½kLħ_Æ.>/FwÞ‡ÛÚþþ|u{zo©ëÓ®*U{˜ØWqß\Öu¦7×ÊäysUé*Ó›kÓ8oþ9äx¯{ÅàÏ_yùé›*‹î êÃ/9íþË;û?~9ŸºæðÇó¡®Nÿüó៊Â|ûçÃ/{鎵®†1öW ¯¼Â+ïðÊxå-üiŽM5ðžÞ¯xFçí+AMÌ›ìúÀ±i8ÏAG¬)5›ç{4¼Ò†¯¶†OÃ÷”xvà<£ÆûßWAÃ+ž¿â5õŒš˜Q…ׯ)þ(w˜}€¥^SÙxÖï*bF5–ñð=øÌÙ{Þ9iâhJ´,zÚv»]r6±ÖcæÏ(þf„~÷È8£ÌØ<2Žmvg˜ör`Êâd¨Ûm4 ¦©«ËxÜOkmWÜ_±¢jêJ?Qå±4}ˆÃ]D¥ŽUY·§‹Kîé·Qëî߉Û=/4XÝÂ!ÁØWnÕÂ÷X)m†9Yò¿Ç3|OŸ†¿/X gTt3éW¸™à*xæÍ„_ñŒZvÀ•3Eøðà{Œr!üŒ²„ŸŽ7 Ü2žm†ŸÖ.lˆpÁÛ„9¦ÄÁò¤´Ç4¢Òª”q´#Ðb¬l¨Ì=¹ í Ï<³ØÃÅ[g¹‘*Tàq÷ç~Ë¡‚á±²š]^l·z\Ñ!À篞müb‘ ·-q–ŸÇ=ÕJ»»fO­1>µ(ÊÔ{ܳ;úb|È<‹€,^ì€è É?Õ{Xi+MÞó–Êòh¯¯ìw¶*Žu£î¦0ÀoòFJâíDl[áã.‘ðèSFo3N’xÂ-CÙ#ûÍcfŠæTJß“]Ý0ÛÍ3nÜŒq!<^MÀ1ZÁóD‡ðH¶s+[í{Ï‚ŒV•ÐÜŒ?B¥l[‡Ä”î,‚¬Tê ˆÙd;‚Ì;êÏ“2òìDbÎŽ:¾y­*5Lû“àÞòÇÊ…[B,“Cþö8>¹>ORÝ ‹æoý‰…©÷¼¡½j¾÷ êÙØ›\‰ïÃÔ…r4êž$Ø“aaOpZeO¬9IðìSu€#ú1ÄTá*g T„~¢Ç‡%jr=PÉ6¶úTEÛ9“˜ë×Wi?=Ør¹/͈oÏt1j"@w¦ÒvØ[Ä‚P6(‹CL5oßbŸæ!¤Õ¨Ù騖KùdöbªÈÅ6¦ÕägãMF)÷´âœ¶ˆœ‘'¿€ãþÑ…—iZg>ö‚é½jcEB7›ÈQ¯'޵e3$¢änj×îÜTà7’SÍðÊɹ#9;’3¹ÚÚ‘œŸÉù!ìw$'ÎŒ,D{Ðådh»w¯uUÝ¿ò,˜ûOøÌ7tÅ~@}´¹˜›i¯á=ºÇ¶‘åW¸Ñˉ*Ææ 0Ðñãã¦ã…]¹g x>›Ë½–2ÑŒ åü –!Š:•MÄ„ZG²r…µ$qkq„|éÑu[º6—l12ô%SYîT$€Xi×ÈHff®¸@$•¬ÍÖ¶òì™E&Œ}Ï"g߀»Á¸ƒq“9šøˆë!TQ•ƒå–ŠÜ+Qú„ñúSáòfJ‰ˆVt˰¡ä‡‰ÄÈÞ|=E¾&sòHT$¶5cÇ{²ðÈTZÒŠÄq¹ÅݪêXtb\,Æu }@OGí•é*Ã5W3Ǜڕ²<ŒÊ‹›ŽI*ÉøÓ´àM¥;6¥j…c3šœèN. ~ùŒöž^åÀ*ѯ]¥]å%jÛ‡Ô;&²p(-“Mñ¬q¡€Ð%qR©ð7ž.*›#!HU"[7²ðÑD‡‰]\–áÆÆåy¬É"{ydyLï¸$ó[ãúP¶m÷Çü§Â¬ÂÊ 5e ò¼fºnÝÝ íÊ^Fs·² ^y…W0ä0Ã}o Ø …¹b{åÄdD«Kwvwà Ÿ’5’šˆ E'´¬%LwŸå‰=C)6VIÂg÷ìtŽƒp3V>ÒÁO“.¼’Å,W!ìx‹Æ CGfLEÀ»6d}aÍT=´_#£Ç-ŸKt=Øý‚«ñ‚Ÿ×í¼l'Ëô|ÿï/M¥nðÛËwÏÑ#3ÎCpöRv¹›³À»éܳÅà„!HkžÉÚ«¦,§8Á£Ê¹NÆjXVÍý+¥X [x(«!¾s ª!L8>©øK_áì@vC‡!A2êÐ÷“;]£Œ¤ƒÜ©–¶ŒXÈø3úd,Å‚K4& é)"¢˜2³#Z=à-FÈ0?Ùõ qäZðH˜ïZaŸÓ‰^)kG[2œ¶”~Ë®-“åãû®¹”.„=OöØÉV‹:[ùúx0«y’óµ¬÷Êà ±&bÔ³(â0 %$·ÁƒÉ{Ò˜sDvQù–ÆQy¸ÉÐfç…&k#âß0=Ü™uŠ ­…¯Sx %S™f9‰eÜ ?~”žaÔÌÜ?ö© bYúÚ/N–“×õÂBrè¹g_"Êïŵˆ©»ÚÙhùüdRp‘ØØrø§€ ú¾s·©Õ5WH3[‰Ù]âðÑbªùÂ6‘þËO@©áN‰Ëo¹Fv†W@(@4"›SÏŠ¦(×(c¤#7— l™vÛ¶èDm°d˜ÿªª‡Á<u¿ç!Lë–¸aé-”Æì ÇŒÅT!ÄÆp°;ÕT|ˆªÏøô”˜Ùi­¸M‰M=ÐÑœ±6BΰDË5Lqi%JA w5ÚReÞ0HªJ–ªš¶ª\§bÔBË€ó›/ 9¿öòÖÆ…´mwûƒE!ç!8º$-b'Ëèté~õ\YÕüòžz·¼]Yæ^Þóî?4Y‰A]”÷¯”*1èà=°\À0T;†äC¿ÕÈ0~\.à)1€cS ç=^Áe oè{˜Â¹‚…öpîM2Å Óo£J;Û¨8ަðºb·QuÔ XtM OÝÓ¡{¬øPz„¢1~²›Å\–cbA&î)®ÌÁm«wtÅó4|üRÏà—ZÃQÕƒ~X26¸rZ#x…Wð®Âs€wÕ5¾2 î'¾ôÕ \´©]…woîñ¬vöõ1N™n´¨tÝ]?í}Ìè˜/÷옌 Ž´0œt×_4l—¿þÄ3oŒŒ?YâL Õœ:{½%§¢RË“!¨™¸9u*”£!ûcñ* ÝžˆÅš‰~Q(ú¹8RÌÈrÑ:zíóÔ(<«|YsVMi”Š«D F(%ke äbp_¥Ê=F z˜kÛºž–”S°ø æš}GWìdM\±òpA ú4øËØÕ©ìC—òD*mHöcB÷ìr˜q¸¼x„jèÊÈÒDiÜd,K5[º7uú³TË &&nÈÚ@›+VÑeåJÐ'5iÓôŽŒ>lÔü¬§jË-K­ ©*²ÑF­è„]Î#ü«n¬8:ä„Î3r#ÚzˆøÂ¢åÎ!ƒKå€ 7ÃûƒÃEFW²eåJîd¶g*Y:#QÈàÓ#AcN‰¦;Íé=€SZuζٸ©Ýð>£yñúe9Ÿµå8¾ù¶å¸]ÊV$¨I„ ŽâÖTËú㞈 Î`I8‹v}-ê©Ú°Œ ¥¶iÝóøyÃT"ERUM~Ë‹Ù(JÙ2·Ò3I”^¥©pÂïa\¬€!~¡Ú“¡}RE^RqQ.Ùê÷LDQQªÚ.7*ö[ì—ñKýHçŒT+ÉŠ/T½©»ûW愪Ã`°oy­*è1™£ãU¿:ˆcP1†Ñk $ Çæ53 |ÆÞ4„<¾di‹füÑË#Æ ’áS)ç•h2*6.¡•ÍÎÕÊ1„ ‡~dÛÌOCÝ2A€Î#ž¨hƒrëç’ÇQ›q¶ŽÒb "„Õϲù5†é@âý–Ä1×¼h¹5¡²U LXJ Ëã& +Y±;+œß •­K  UÄóÇPLŠduDbíd­xÛá­?öT®æ£àƒ#@GÁ;M¢7G2#"PÍ@…úôjŒªÌÎÕBRÄ*”¡znn`Ç$ˆé¯ „üt·²ØdÐAu3ë£ÆT»uçl’üÈÎ%K¹÷¢lòÉ¢‹n%ð¼b¤¯LÑŠ•Ä ê%Dª™FL=ÀÐX3al®¼„pÁV *OÆ—ˆ Ö•£%“ÔöpY“#JÔžj{úÓ°*¦‡ªH~|Y¡!1ö <ôätðä‹JC¹Nžr…¶Ö®µ‹Ë¾Î謩¤ÐX‰\:¼ÇfÂpLyQ!3® ÀŸ_\ŒšÊÃYŠ/•»Úup)BXaš¬½M[_; b•)k1áD†.?RUÄN^[XcîSî'›ð¨X&ð$ Ê™‡!1Ö™¬g¬Ä q¦x¤g)ƒé~¶²ÄÑ~ ʘÛ4t\M7¥sjŸÇÏ¹ÊØë·¥@ z&ÛWDz&{δŒ9qƒƒ¸š‰«›å­uíø,Ãuè”Né@XÛÅ\Á° ŠBÖRòXÔˆV ›2n#ÃB‰¿ÇXÎ/Kadˆ2Ûü¼f ·£ÇFIE–(]Ë$¦eÙÚÃI+cÆY«)äåq®?ÜIeû©…NoÆ÷Ë;5Ô…–°Ú›* [±Y³,¥ÈzpD13’ ײ[-K$³ØǃbP`+$¨Iun—cÿ($Ñ û¦NZdÓž1Æ@¯*W[zÎð {ºÈ¹@#[7š­¨QÚ9ßÃH¸îm›õ·åˆÔ‰#6…vØvÛÃr´räâŽåð}ON,G×Õ®KA?ä*Î%2%ˆIÙš†ج¯ð=¿¹ÄÔŸP_qµ`2b :Ì€¦V€[DMƒ>žéÓHÑ®2v²(ÅÕ %Š©¡ËÖ]Í ÙÊqöðë¦s7¬b÷Öã’,\?ÇÚ7uå ^Áïi‰÷ø¥£z}~ºbv,>æfY³;ü"çŸ$d›5¶(ƒc†yí˜ óvLÖ{YdyÆ8œYÍäÿˆ†%! Îs  )»‚›ääîV´Ÿ‰‰[U::ÐC|ǘ)LG¬“°šÄ#­Ú•¥c‘%åËÖ1-ç_²2#YÀc.†úÈÝØee-F9fĹ8iUÏn4Oü' "1Õ2?§)S©V¥»„<£mE+ÕeZìÖa,ë0r?¨\³ÒdfW3Éw,°™üR*Ó®»Ö`´?ã%~ät*Uµ˜-\½¥0Sù$Âå^`D:~v;šJ¥¸¨Î²¬m±“N &™JíÌîN©å=@²¤“‚¦jdê×ʵٞ‡ƒ¥îÚý ÈìÚ€ôf>a0xdOÍ1ì‹Ê‘jÜ}‹gÊ 1 ¢¨^ŒŸÝ~éÊîi%gg)«—HÎ-¢{RaHâî@U´£-ˆKŒ¾Á+øž¹bª¨¤°fù”¬™‹¼fj(fû¼nÏ”„ï)¡€ÔÕÌ=Q9T ×{¥ÔÞh¦ê…”(/Yä÷ýfNÏeé‘ì J„hÈ´AëFõñƒ›õÛkn}ß“³æV÷üÛ³ÿ½»Ý»-D ó˜4m9\[8žÅÀ'd¢#½ hD Sì9—”úbSW˜94µ¿;³T«šÑ,åjg*áC Bde¹©œ Áxs©å¨Å¥­»ŠV ǺQ÷¦ŒEpVÇÂÅOÂ.|BP—¨ƒ.&ÏÆŠ• S3Fäå„OÎòuòˆj‘™ÅKÊlT2‰‰Ëá¨16*(šJ’®°†[–¯{·–³×0E-ÿê¶dIx­UMx¢$³cÁÔãÒ—2Q˜Ìšl¥³Ú'Bd“•D¥þ +†b©®ØÓšéc=²¼ø’3ÑÊß5Dˆ¯º6²" œÑ)«(`‘ κˆä¬m bV›YsžšvQti€cžªÛC¥ºvõšx¥ÂGS¶ÜFÔ­ ±·³Q4âÿ™¡{;¼øùáÅ"A)™í†÷y.ã9üã,¢H”≘Ւ}ßÑ¥õôþðjÓƒ”ÉÎk.¥aU›züY|”hêfÍå O/™RÁ Gº=p7'Ó]ךåšnKŒøM‹lˆC6|'jÂ3JJ˜7— ÐQ€ „W3&²7eY¥a47#Û¿‚ªèÑ3eÌH@§u¿cOwݺÓý §;~ñV¬Ôª}à𦔔ïÜJ"vsšÎ™ñÊD?SÊ}§0EŒh¬‹jd*š¨©a:Š©1-bS²A¸,…dÛÒ§ï.¨¬y‘p·"L݉°þ'‹dŸ Pp¥qdß,ÜU÷£QãÑœzyfw<çé-õÝ~{ùî‘Õ‘4y=úPÑr¾qÛºDhU8"ÈÔ2 ¶ål&‘UTªâaaXáóФÚò-I{Iç‡Þ‰¤s—ßÌ"É6¾ùÐdè ]]ÑUŸ†Ø2·ã´è˲e‹ÔeÀY"‡êm‡dU°ŸØLŽ[([ Ï´›£¾gdB2UÑD¢3?hu`äªì\m™*ç‘Híð¿ ÀûTê…`–MФŠD­€Z´zˆúR†)2k6±i=š £p˜ Ȫa´6&ÉO:‹|Š™§)ÊÆÑDzFo² «;ÛàÝˆÍÆåˆÊ&É“•¬aX˜ã§š˜?a·e“¤t̼=€ŽIjk®%bÏN³sHk¼”9ýb­gk¯yKYD>a"T"¥d‹Å>)«•ÆuëŒÃ—ªW™D·|°„cFd îèwô­Ð¡\A]StE×ÕbÎ³à„‰À˜Ð9ãLf]7¦;ÓXëóäËR˜p¨mkK}>6÷µ~óò·*»ØG­+´;FÀÈFê%šY3MK²âP÷ªÛdÌ“E3ñe¼N©LÖôþJ•®VÄíWÆYEf“RÂDA-‰öÝLf0‘o_À꞊°‘Ì5ÿ›Ú]½Œ &“" ÔV´Jɧéwdw"'&feW£]MJpbyÚ½ !Æ’wZ2õÈä­‰cu!ëÿ1ÔT¦º0ò„1ü³nì •‰ 0öWŒ J¦’Î&aã:"6´YªA+•ÐWØ­À´ÛDÙMŸ†8'£Šjœ9 €™QL 4M6{Ei¶óÄUçìÁ¸ÇFÛìÚÍšÃ3€ñtïtè‹c¤Æ>2DÚyJàÓð¨÷HEñH¤"¬¨ø9åôÔø4£cËöª.—ËöTmKʲ&[¢ ý–÷‡&R4ö؉”›p9€l·8ÙrÀȆ;ÎÁád¤ 2È yî‡R¸Ê€Î¢™"j¯®9IOoQŒ×¢™È°HAQ}ÉDR †`ý5)qÅ”±…V«Ûåçò*Cán÷©ºR èrÚ/¾Ìvu^ŒÛWž?­¼¯*ˆÆWì§ÕÇÚ-V×_à=ºÇžMÕŒ'Þc÷¿*#ª…¯h3qO¿´?Z¡È@Ø{ðÀø<„`úx05q_¡‰s e(’µà[í³8'ÿ%ö÷¤Ú‚ÓLy«Õì²H{ª€€@Õ9êS` Á¨AÑiŠvX©‘ÅX2î˵)W;­ßij¼ÓÎæ²_ôñ|ÿï/®nðÛËw%Ç<á~çΣÇ$I°ú›û‰ih%C$ÊpÉry€ DM>Óz‡ÁûRñŸç ¢òxÔ¢DT‘‘³|µMÞˆÑBû©mS¥Gz=À4Î"„3˜ªõü¨TÜ]ô}¡ixY¯;ÛP™J¹Æaœ½2D[l—K0-?ÀU0?§o¸|‚²³×©Ûç0¬mCÈYM–}¨u{ÿJ¡ìƒÂÙ‡^Á1ù~Oi}¬Ë˪\±q¡‰(ú›£ËðX14u¥@#ÀOóÄþá¨ñ—j8ÏÓæ2 AW<ó†s&xÔï¢3 ³)ÔØðjãûžˆÇ¼4…{Îû3Û»Ö]Eüx¦|Ú[„]?¿U_ûïù-ÎG +2pdà ¢¼Lÿ Æ+¡0]ùŸÜõ¾[KõŠ‚¢SåSAld»4Ф&e!½TK³øØÔÁô¿j:OîñÙâØéÝÈ™ÛCžÊßEƒÕÌ’®¹Ò1UÚ„*8•—Â]mS[ÑqÊB lVRå aƒÝ ÂòÁd<±Á€B|&åùìmK™<C\ÿ€á–ÎWWLÇjªcæHJíÌT¾úDQCr§Óæ¾g¼ü£ÒH„8Ζ´Ø Rc·©&ÔħSKºíê4¦‡ñ£™ÄŽ›SZ¨OáÆSqý#9"ùÞä¶X e}ŸíQÁæ\~÷šÙ‘Òx.{ø@¸‚P”ø€rÛ˜!›UÍ5l4m„,‰ÒáÙŒBT2äÊQ_©ˆ B,Q&¬Áh-‘º…MòÊ2@w ÜÍt+Îß©E R´µ­îîá­)&á­Ñjûü~ù-s÷sûŽÞêvÞêÆ}Çé'.2üò[íÝSÚûw$A†·f7úµÛëÁ©{ZxF†/Ç{^Ìà¿™^̤À{> endobj 4131 0 obj << /Type /Annot /Subtype /Link /Rect [60 720.500000 86.2500000 727.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_examples >> endobj 4132 0 obj << /Type /Annot /Subtype /Link /Rect [60 713 121.500000 719.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_running_swig >> endobj 4133 0 obj << /Type /Annot /Subtype /Link /Rect [87 706.250000 177.750000 713 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_commandline >> endobj 4134 0 obj << /Type /Annot /Subtype /Link /Rect [87 698.750000 153.750000 705.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_outputs >> endobj 4135 0 obj << /Type /Annot /Subtype /Link /Rect [60 692 142.500000 698.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_basic_tour >> endobj 4136 0 obj << /Type /Annot /Subtype /Link /Rect [87 684.500000 137.250000 691.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_package >> endobj 4137 0 obj << /Type /Annot /Subtype /Link /Rect [87 677.750000 115.500000 684.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_names >> endobj 4138 0 obj << /Type /Annot /Subtype /Link /Rect [87 670.250000 123 677 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_constants >> endobj 4139 0 obj << /Type /Annot /Subtype /Link /Rect [87 663.500000 133.500000 670.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_enumerations >> endobj 4140 0 obj << /Type /Annot /Subtype /Link /Rect [87 656 117.750000 662.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_classes >> endobj 4141 0 obj << /Type /Annot /Subtype /Link /Rect [114 649.250000 198 656 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_class_memory >> endobj 4142 0 obj << /Type /Annot /Subtype /Link /Rect [114 641.750000 169.500000 648.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_class_inheritance >> endobj 4143 0 obj << /Type /Annot /Subtype /Link /Rect [87 635 124.500000 641.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_templates >> endobj 4144 0 obj << /Type /Annot /Subtype /Link /Rect [87 627.500000 140.250000 634.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_director_classes >> endobj 4145 0 obj << /Type /Annot /Subtype /Link /Rect [114 620.750000 164.250000 627.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_director_example_cpp_code >> endobj 4146 0 obj << /Type /Annot /Subtype /Link /Rect [114 613.250000 174 620 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_director_enable >> endobj 4147 0 obj << /Type /Annot /Subtype /Link /Rect [114 606.500000 184.500000 613.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_director_ctor_dtor >> endobj 4148 0 obj << /Type /Annot /Subtype /Link /Rect [114 599 178.500000 605.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_director_overriding >> endobj 4149 0 obj << /Type /Annot /Subtype /Link /Rect [114 592.250000 163.500000 599 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_director_base_methods >> endobj 4150 0 obj << /Type /Annot /Subtype /Link /Rect [114 584.750000 178.500000 591.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_director_subclass >> endobj 4151 0 obj << /Type /Annot /Subtype /Link /Rect [114 578 239.250000 584.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_director_finalizer >> endobj 4152 0 obj << /Type /Annot /Subtype /Link /Rect [114 570.500000 208.500000 577.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_director_foobargo_class >> endobj 4153 0 obj << /Type /Annot /Subtype /Link /Rect [87 563.750000 180 570.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_primitive_type_mappings >> endobj 4154 0 obj << /Type /Annot /Subtype /Link /Rect [87 556.250000 135 563 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_output_arguments >> endobj 4155 0 obj << /Type /Annot /Subtype /Link /Rect [87 549.500000 155.250000 556.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_adding_additional_code >> endobj 4156 0 obj << /Type /Annot /Subtype /Link /Rect [87 542 122.250000 548.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_typemaps >> endobj 4157 0 obj << /Type /Annot /Subtype /Link /Rect [464.250000 438.500000 501.750000 445.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Modules_nn2 >> endobj 4158 0 obj << /Type /Annot /Subtype /Link /Rect [43.5000000 431 548.250000 445.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_runtime_type_checker >> endobj 4159 0 obj << /Type /Annot /Subtype /Link /Rect [327 521.750000 355.500000 528.500000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://golang.org/) >> >> endobj 4160 0 obj << /Type /Annot /Subtype /Link /Rect [225 486.500000 258.750000 493.250000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://golang.org/cmd/cgo/) >> >> endobj 4161 0 obj << /Type /Annot /Subtype /Link /Rect [257.250000 466.250000 295.500000 473 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://golang.org/doc/install) >> >> endobj 4162 0 obj << /Type /Annot /Subtype /Link /Rect [363.750000 466.250000 381.750000 473 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://golang.org/cmd/go/) >> >> endobj 4163 0 obj << /Type /Annot /Subtype /Link /Rect [466.500000 466.250000 507 473 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://golang.org/doc/install/gccgo) >> >> endobj 4164 0 obj << /Type /Annot /Subtype /Link /Rect [147 396.500000 194.250000 403.250000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://github.com/swig/swig/tree/master/Examples/go) >> >> endobj 4165 0 obj << /Type /Annot /Subtype /Link /Rect [143.250000 348.500000 161.250000 355.250000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://golang.org/cmd/go/) >> >> endobj 4121 0 obj << /Type /Page /Parent 2 0 R /Contents 4166 0 R /Resources 4168 0 R /Annots 4169 0 R /MediaBox [0 0 595 842] >> endobj 4168 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1700 1700 0 R /F9 9 0 R /F8 8 0 R /F1409 1409 0 R >> /XObject << >> >> endobj 4169 0 obj [ 4130 0 R 4131 0 R 4132 0 R 4133 0 R 4134 0 R 4135 0 R 4136 0 R 4137 0 R 4138 0 R 4139 0 R 4140 0 R 4141 0 R 4142 0 R 4143 0 R 4144 0 R 4145 0 R 4146 0 R 4147 0 R 4148 0 R 4149 0 R 4150 0 R 4151 0 R 4152 0 R 4153 0 R 4154 0 R 4155 0 R 4156 0 R 4157 0 R 4158 0 R 4159 0 R 4160 0 R 4161 0 R 4162 0 R 4163 0 R 4164 0 R 4165 0 R ] endobj 4166 0 obj << /Length 4167 0 R /Filter /FlateDecode >> stream xœí=ÉŽä8v÷üŠ80ÑÜDŠ€a V>(t>>53n Ü×ÌÁ¿oIA*$J!¾x$¥HU¢;3(×·oüå_~ý¯Ëÿãò˧_ÿ÷òÃýþô뻚†Ýþ]úŸ?ND{u_LÛ\~üþöóòóíÛÛ·îÿ?ßn_øõÓ¿uýßE\þµûﯗÿøÏ®ñOî¥þ…ßß 7Ýïÿ~[û¿Øø»oÿííßÿpù[ߣÎMfþù‚ +m?Cÿ|óËäÃÏ?~üíí—Û¤¢XÓšö•Tn•¸üýÏoéðÝ÷_åV3Ó*ðoäàm?¸å²œ·—z#óò#«j#wk.ºÕ\‰feäo)}`§yÇ!1Å!qQ—%Ý^~js­êXnî3wÛ§Vú®°}ì¾}Âmg·©5—éD›ŽÞýz3ÓjrYØ÷ŽÎ¬›š¾L'ªtfYðl öq`ö¶äþ¼¬Ÿä1  ]ïÇ<ϳËšòwmµûþý ªhÙ€b[Þ‘[SidÃ,ªZŹÑʰg¤q#úa„ì:¶SH4)ʽ/eÏç;—¬É×ù0sêMáRóhç”'«¸pÛÓýG¿A÷î3t®Ï×ù0sò]ñg ÷Ny¸Ú¸Ýgʰÿ&ãá¶6#Þ3'߸‹Þq"Àb*wn»b‰ H¿¿ýò•wÌâÂõåû_ºÉ cÞ~}ïXI÷¡7ºXyùþ§Ë?1Æõ?_¾ÿµc1Ì5°öÖpm-Ó¢æì^UÐ&‡'òÚÉò­™=ù<<ùò½Û™çeñŽ%ΗÄ> cª«’7SÛ8ÉÀðɧì+èD³` ¸Ÿ-p\÷S¬qÑ+¸…î¨'¯j°Wó^Ú-Sû2<ü*o‹ ·G²«`²?îÅ&€'”´a\@³v”Š[§÷'_ '‘•Âsûx?Ã-,—/Ow%4²gå—ßÇÏÝ`G5¬ÿezN4´ê‹¶£cǵüxÓí•s+Ú–o™i/þÓmŒî}÷Yô_»„ßæ‹1x÷p&R!¦½Ì×ñãí··˜í _ì ßñ|;¿kUòÝ,¬; á[x„¼ÂGF±ìæ`÷"8*í`êD *¼áÓ†™ „JÌPÉ5 ìdŠ@º–öo™i/þ“˜¡âk@¨Øb ¶®ÍÏ”Op£*ªÖCɲpvՆϩч)€PÂoä–K…÷' Qåm:4:6¸•¡qÖð<4j>‡F-Ö Q«Rº–4öo™i/þŸC£fkÐØØpŒ®eÍ®—ù:*Cc·@'êÝÀ…ó%o„å{XÀª/*s»GçÍ•Ù@Bùööbð _ÙÑÈ€‚¢€åxàYë4tÖ­C:¡ÚiCÎQ¤åêÖA;r'ßÀ„ãJ8l¹µ&g‡S¾åG÷%æ0o|KÚY7þ#sHåŒp.è`ˆ™ ÓµôÃÌ&3¼¥æÝ¨ù0¿ä¬êòFßp·Õ[Ïyj"ªÝBÁ‡Åó5 „yÑ‚ð ãÉ¢{ >ƒhnN„«ÂOཀ hàŠðh}hlZ#8°ŒüH]K;J¼ ã1ùêqe@ãÈ´í´a3ý²vN¿8c+ô‹3–¾%¤_Ã[7ú4vãÈ•æN¿l»F¿¬ éWײ _Ã[jÞšS“~qÖ<¦_¤BilÓ ,”Ãvk˜LÁR bÖáCÌa;¸u;{5ºÙ*fUL)àL{R ›iÃÓšI'ðÏ4“áV4¾0¤ðÁ2×-†·Ì´ÿ©i&œ›Í„óÐ Ô·„šIßægj&šÉ}Œšš ÊK* žÁ&ka¦ë9ø‡Ç‰È;?R„r-,×yÅ) kOðw>:*!CÊ?Ai\¥h(^»Ýª‹uÓ÷ŒÍ¶Ê2\š@–‘íš,£X(Ë Æ¶@–Q£ð2vã?š¹,Ã¥^‘eø-²j:Œl²Ìí-5ïF͇©*˨ѓŠÐÅ"-AávÕK|ÝnN„çˆP!$ˆƒ¦›ÁvN¯”7ZX6mØŒ(¥1kˆÒØ‚;`çý[|7þ£¥iÖ¥Q‹aÔQ†·Ô¼5¦*¢h‘Q²€…¸©½OH1mØ „¦ €Ðè5 \˜´¸3iÍ`¨Ë™ïÆl 4j Mh ë[@8¼¥æÝ¨ù0U°“s!ÆÔD§±=EDäTo½ƒP4rÚ°Æ­ `Ü6k0¾0{pgö˜hÿ–ƒaßÿ¨·r ÆíˆcÅƇ·Ô¼5¦&Œ ¶Ù ã°×2"áÂÚ †ÓZqª&óÞLѲiÃVÔ\ÎQGpµ‚:¢–9L‹Á"0‡üá­jŒÝørŽ:‚‹ÔÝhá0|:··Ô¼5¦*êp[˜=À†¯õ~Ñ@&ÅÁF)¦6àZ°M±" "Ïn÷|;þ5ÞW¡¸™6à_ÇëãŸñnåÌù¥Û aNÈp…'‹àIfìð20Æ\LŠFTܪ¸xì2Þ ¯Ÿ6`W+v€]vƒr‰€ ÜЄãbðî•ÖòQ·aÓ†ç¶Ç€ê«ØèFsQaB©´(RÚ—¸øG&€(£C?¦ÎR$ù£Õ=ßíðBq6r6m À ±g»c„C9¥i3?÷ï”NJP)œì¾™Äè0|ÚàÝ*ôpÞ4‡s”††9˜#ÄÕ…J«­€B0™‚(ÄB¤T “ª®=†Ìkn¦Ý)d>IæåB9”C9h3ðiý ×.&é¦êp¢àPlÄ h=˜0šíÖy´i(x¢nÞhß‘i(bMN1•𝼛á-@9ÜŠGa J18J¯Åà(Æàô-aXÂðÖ-ì`ìÆ bpT³ƒ£š0§o Ãno©y7j>LͰ¥Ç8.,ºt"˜Šñ§!ÄHâ\8OcA…e(„ˆ'ÁDŒH€_¨<¨Š[)ª‹ªPz,Àr«ºàòQÔ~ 9²`4¸ÂIàϘՂíÍjm«Rl’u”b·a Yß² ØíH6vã>š L™µ@2eÂ@²¾eA±ÍHvïF͇©J±[Hq Áº ì(ÁÑÊU 불JÅ ‰Qaª£ÂZ5mØŒT¶ ÊÚ¤jX˜@Õ·„H5¼åÆwã?¶RY³†T6Lë[H5¼¥æÝ¨ù05‘ªaKÄ6ò¦‰'¥LÓ…’‰}³y/Ñ{Žj4lŒÞ»a£oØJ5”jix»F5DXª¥oYP 1’‰±ÿ1(ÕÒðµR- Kµô-!Õ¸½¥æÝ¨ù0U©†ÈSª%³ÄM+¼¦ò¿FŒµT6mØj¬¤¼¾D±ÛAo_‡sG"Ž„„O¶Sx<Ô)aŒ“˜@8’µ…EèØ¨ûrΫPQh¥ÝÙ3Àµý¢”–Љ¥Ä˜tH áahvÄ‘EkÉÇ ©;e)BH»‘“CÌåY/UÐ×{ËxµWãüwæˆò²cਾ馨Ĉb1­N‰q!f€ŠÐ%-.˜O¹ÉŽ]Z!1V¨ŠQy‹8ÌD1ȵ5&®ß¤a¼Mº½)ö 5ô~ …ñ‘ð:·¾"òÚu”Ãd´Ðó!{"¤ä\{rƒ}uÒÎdÀïXè;.½’·×Px’po_¡'ü“Å–Ñ{`oŽ}¬Ì GðÜÌÙ)®Úä)?Qã0”7ASx`Œ*ñÑ“F·›8ˆs,J]Eª…FB(0 産ZáÇ”VGy$0&/Œö†¹EgÇEñÚ8r²5+¾†2ÈîRHo„ yö‚ ’:ª ø>–Úû]6ͧ$j>k¨!µ÷SN’4×#!•ä‰[áÓXÎvùa^{Fúa–'ƒÉFÇx’y½Ô®/@Á8¦4 RÀÈ-Ûb ʼn`H*X@Æp$ØDJjZV2]¬¤u“FÓ›äK¹ƒ2( ?¢4&DUc./Αg™‘çr!š€éẪDèyyÒ½ßrs°9¿€±ó^¶£þ܈›†QÐC!Ðd]Šxz0a)p2ÂÒÛH™(*?“oªH5„WUp{m3Õ€Û…A)X=¢u· î:ÇZDiÙâÚž‡H&¾xx»>‹ @ËbB%â‰)ª<¨HTBaOãp©nÎè/Æ.ù*(U*¼4ÔTq\h LOÐêÇÿ~¸a4Ÿ'§¥ž6äËóíš/å_§¨·Š‰kGY–ð^à '9?¸ÞεÝNûÀ‘7tçˆÀ¸!¸ßò]æÂ˜Ú„y˜Ãó"!lD™ß·§gÆxT*ÈgW¾m˜ÊLYè>bOfýü<8%sœÊ^¨`KÞž…€Š€Æä-+zf$+R˜€® "µI '` &B—ßÖ$4ÕƒÔwÜ–§ È1ë“Ø N¯(uy„ˆ…<êŠ Æg­B–ô""…Ÿº~T×±²B·s•H–"«¥Šž¶º XƒrE%dæ`fŸQJêÃa–$R¸®ÎÂû½ skB{ˆ/[0Lg¶¾Ð·¾¤'po}³F‘kòÆ¡ëz¡#’Ú ž0PÒ4ù°Zi> V·Sä¶:m±ekçHÅ? ÃDâ?IeSùy»€Š¸Ô¥ðIT¡¥4¯V&¬í.¥‹4Åw–¿WË ¯™ÁßH°>E ¾m!oøÅ«òÏ”Ü ¥# °DY½`(ÔÚžÌJr‹x©˜yÊ«¦žDΟ-IE¼BÒ*®“늈0W?‘«ÓâÀ|^ÍÈßP>aŒØ_]°ElB­; âï¶Œ­ HZyã4­e,â?ÁˆäîßI9dÒ´l¼Uh5m©Iéý›wè)Ktê °¡ÎòjHC)˜m€î~CçÐ-[BwžÃt–×–¹"q·{Ñ– Pøêµn`2*[>ÞÆÉä´¡ ­`2Üèê50JŸÎ\f±X¡øVg*÷Šw7Üë{‹€záàO‚/¨¦pßQ‹Bô “ Äs›[ÑptÌr>ߺ5y–BI¿ÒpFˆ!'Â\»B:ùDà'F>*U'•ˆ|PÞÚrÜ/“ï&¹)B}›ø?0àË™#ç1ÂÇV¸?®á´|Ýk¥ä´¡Êm™J† Ë8¥b$¬òBˆ<ç.:V_Ö,TÅ€¶\± óW•öÏêöéŠ}¯l'ÍPJ¡¥FºGÄH&”¡-ÐšŽ®YC$LÈùþ1âøþR5ò`;¼Ò=“¢÷›’Z C)äâˤD£ÐMÃ¥Ò #ÁOØÈ1eå#žظ°Ÿ|]Œ¼qcb0ÁZ ˆ½¬Þð±'vI{[ç'~J¹¬Uó!©\  =â pÇk–®O7·#>C<o†…¿#À'ðz¼”rwm8ž#ÄU«áÄCz´ÖË €WnÒ…Gv÷Ø®|'²öÛwÌÕ¶Á‰9äO[;<ëì)i7“aÒ{õ¹(xkIÊXÓ’‹ýß ¸¶Å$™I¤þâR!“¹}Ì¥\w¯ãKa&$ ¯P6µ_V¿*åÃndÓLjøú)[M[Z£€“øÊŠ€IßÙgÿø”diB¹TÔÐC.©nž(e÷£-³‡¢ yø}ùa‘“œ˜ŒÜθaI-áHøœ¦Z'Tuà?Þû4zïÏéþ"Æõµ§„JhCøV¿b¬v÷S£nÄoJÞ«wÛíÚQf \°.bkxH¸}X®¶€I²³SJ¡ F´èU¿6²mlž46 Uë ” …Ÿ€"-ø®KþÄaXž]H q^ðþaî‘ÃØªª5"ÈeJñæ=ELɶ èf‚^Œ*<…1•âl´¥äöKIQƒ¸‹¢­»K[Gë¬îÿ2±ÖÛË6WYxw ¯pPQFnÙ¶6Ô2^Õ–“àa!-taM Be©ZÂÛ'ûX祛‡bU¼9kB$zT]{å‰;®•'RCO؃+g`¨v ÞªV„[U¡jL>PÜdøX²öø‰Ÿ|I÷$'øH.×Á'ï ‹3=Táø6÷yK¥ñûS¸†_í@év˜ã% çO(‘û¶xÚrW;v]K !‰¨.:ªú}}uý,$NÈ€Z½õîSGK¯•*½WïëóµcI¯0ÍqíQÚQîøÞ¢Vµ8ošxÛòRÞ¡hÀ.³õ™M-l¡vÚê–47ø–@¡²ƒW&ØøúâCJ(ïnæ=RÕÓÒ°t°†Ù;Þ›¦W3H®;U68ð#rScÂEœÌÔSä=``o.…!5«GÜÙð',îPªæÄI“œ?T¶„"¿ð± 궣ܹ¤ÔÜüGæ8Lm †|’a%'ZF Ä0*oæÀþe‘'˜Ô"ŽÈŠC½…Ô¨£*sl¯dqZ4¶[4¤0Áá`,ôûÃOjÚGdÛ„Ô÷ö‘r!;èiZ8M /'è=š£~M½CÝN" 2`öš@âø†'cLJD¬Q®HÎo:82§«Hë`§ŠÕ€I0Ø rÛ#’ˆ„˜‹Pè™°Àú‘|AhB´–XP¡eù°h±ãb…çU/UAFúoõBÃ;«#ïQNË]xÏñàï®V5*\«T­;y0‘=´d!²‘…*·fQôóÛßqY¥´º“ª àd›œCÚpÏD—FÝuñ„gÏšåL…[ƒm©pñCÖÞáÕDÄ ÜK\{óªu–i >Ë´%DHÕŽŠ'¾f‘©œE±`™ïDM¯é+zwT %$äGÃDî~Ïr ‰µ=ÁÉ—àH#‹bˆx„¼¯¥ç°Ó®å ×å†ëN "`P•/H\vpÁ»W ÿ >‘àø|à½k‰Ðim`¬ÏÀØY}žÚú ¥qCÒJÙs8N„¯Àið¬á•"ÌN$Ö@ÚKQÎT8Õù‰z·‘mÃÈv2”;Ø:oDR‘ •ˆ!¾ú‘G…²,Õ¿[o—¹nÙØ!(O‚®•¹ UÞ;C‹aKãåÊD^œáž™Ä@Ä0N’ ßByYK‰æ¾ï%q'$ °i ¢ê*e¤^õNSzÚH2¥•µH›œ] QFg$1‚1†$$‰#Š_ÑHC´+>dè4̆·ŽñÓRø3#" Ó–·õlß‚”p¢5%Xµ`Àß͕ʜ¸”FÔG$8ˆGž©*LÒj 4pe]Œ”Š ¥NP¤0%¼1Jï‡ÏìâèŒÌM»0/|Ǩ]©`LCžá˜8º¬Hq¡¬ÁÆ:غW«7€±/¦§]×<<¼1™ôË¥uÖØ1´¥¤—Yîº|"l Â¸Iï5‰¸Í1–0Ës¦û jÏÏjµXH)¯qýp‚³eçÄ0-’óSyxú|Ö0NSÂyÈg c ÙÉz?²ËøI²fMÓ@V¥Bªú$(8Õ^Ô*{œ TãqîL@A³›h–3¡¦Îhõ Ζ-Æ@,ª7.a胯RFœ0fÖÄOôIÁpÀÓw'R1·H*¸×p¥ISb˜nÀ0ŠX<·¼aÒ0{M»o0UŸD  ¦ªdõ>7PÕö©TØCRÕcraCl)(Ä%Š@lÃv”X §Â€á'ˆõ¨†’^3"òiXô +ø ± ö¤å±ÓŽèû ËŠP¾^@èƒOX2Ò=¥©Ïçö~ö¦Ñ¯¶¥(1fGë[ÞsÏÚUQYµ±'߀µ(k Ë0¼`,e{ׇL{ÂØÃìNusëÉ@¯¥7]–*è•9D¹Þ¨p%ÚÊ…"u"q˜Txwà+Òîj·B×°FòØ~Á2mš=q"P •§²ýæ˜=ßHR86g©/Þ î ­}O©½gz>Q†rµ Ù$”B°ZEHR*òaD0Úbš´ÝŽkOeɳʚÌDÀ.”•-ýãL´Ê•hEË?÷ǽˆ5aLJiBýZDŧÂi,ax8™3+…&%³B ;³Bžç˜Y!‘Àžp¥ÿ+|>ð¾ñò´qì¯æOÞGÎŒï0g¦06ÁgOºÒWƒå’ñ…F½¿L…–©ayÏq>E±IçÉ¢(…M(‰‘‡Éßz5œ9ã÷M7huŽ÷s¦‘}¤G–¡Ñí™7trfºE!v‘-c'Än€ØSÞŽö³™nÝÏågÎQhÿöè… Fùvõ".¯Œ÷‰\Fë‹“Iל ·y›SômÄU Õ%”êåùÙ}Ç]d2ÙŸÛ Ö,÷Ÿ¡qä£ϵ¹}u+]Ü¥âä$Øá©îSbàd¹[úbÝ׺7à-ƒÃ½ßq^ž´ôI©,Àõw3ö3ÿ…û]@Og´P[í ÉËNà}»ŸžßwÃäÕáì¶€7SN<… Ó·Ë··ÿàs´' endstream endobj 4167 0 obj 7233 endobj 4171 0 obj [210 /XYZ 32.2500000 376.250000 0] endobj 4172 0 obj [210 /XYZ 38.2500000 147.500000 0] endobj 4173 0 obj [210 /XYZ 38.2500000 213.500000 0] endobj 4174 0 obj [210 /XYZ 38.2500000 184.250000 0] endobj 4175 0 obj [210 /XYZ 38.2500000 335.750000 0] endobj 4176 0 obj [210 /XYZ 38.2500000 749.750000 0] endobj 4177 0 obj [210 /XYZ 38.2500000 299 0] endobj 4178 0 obj [210 /XYZ 31.5000000 377.750000 0] endobj 4179 0 obj [210 /XYZ 38.2500000 749.750000 0] endobj 4180 0 obj [210 /XYZ 38.2500000 147.500000 0] endobj 4181 0 obj [210 /XYZ 38.2500000 335.750000 0] endobj 4182 0 obj [210 /XYZ 38.2500000 503.750000 0] endobj 4183 0 obj [210 /XYZ 38.2500000 503.750000 0] endobj 4184 0 obj [210 /XYZ 38.2500000 299 0] endobj 4185 0 obj [210 /XYZ 38.2500000 213.500000 0] endobj 4186 0 obj [210 /XYZ 38.2500000 184.250000 0] endobj 4187 0 obj << /Type /Annot /Subtype /Link /Rect [412.500000 249.500000 472.500000 256.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_readonly_variables >> endobj 4170 0 obj << /Type /Page /Parent 2 0 R /Contents 4188 0 R /Resources 4190 0 R /Annots 4191 0 R /MediaBox [0 0 595 842] >> endobj 4190 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F8 8 0 R /F9 9 0 R >> /XObject << >> >> endobj 4191 0 obj [ 4187 0 R ] endobj 4188 0 obj << /Length 4189 0 R /Filter /FlateDecode >> stream xœí]ÉŽìÈuÝ×WäZ@g3N€aàMeÀ ~€‚F˲ ¨?káßwf%™Uä‰dœ¼1ÉnHïu±HoܸùÓÏÿòëþû‡Ÿ¿üú?‡ß†?¿üúRÛººüs8ÿûÓÇèî8üýÐvõá·ß_~~¼üòòËéÿ¼\nøõË¿þö}ø×Óÿþzøãœ~ø§á—οðûK«ÚÓŸ{û³oÕéoÕõÏóÏÿòòï8üýüÄñuÃbnÿû']™^UçeÜyõ—ñ3ÕÛ¿ÿøíï/?_ö[µ®Ê{P½Õ‡ÿý¯—?Ÿ^0>¾:öV©¶±mõÈ‹Z}~SsúCéþDvm'/zûWæñ*Âû¾Ž÷ð·•‹SE™FùŸ.¹¹ý™6gÕm ]Ÿü]e›x{û¶ri¢Œ[ ~ìšáøwòÕÝ™b'¾9É Õ®ã—g`xåÞÏŸ¿¿üüªlÕTsøþçUÞÞyùãûi3êÃOçc|’sßÿtø§ª2¯ÿ|øþ×—þØèz\â劲èJõ ^ùL >êæréý£_‰{>Á{ztOuÙDeíå’Ë`JëÞ´7÷\ˆÛºÐý}=ZÖðiøK¿ +ƒ ˜£A ×ïÁïÁt˜R™c«ºÛïÁt»0¿jŽ]_ÝÒ^„å *ôõ ^ià÷`ŠÂ÷xvÒÍ|Fü†9dP%a{ wÁC·^Jh Ýc«‹Ðh¯ä%Xë~À`¯u#GL´ÅÜ• SvK~õÂóöhMëÐßóm ¶ÑZº$øžAòÌ\¡>¿Ç¸DiÐCF;êá —\ÁKjá{,±-—½5ÇÚ6Ýœ8ž»W@ÓÍÀ§ÁMö¬¾Çó=·Ÿ¡»ðôp>&—¥csQ®tTõ±r%ê'ø´AžéñÒ»©Ó „¬&„\NüxQ0¯ÂÓâá!x&=wŸ È߃™6Gø=²RÚ¨åÛâÊ.FÚ ¨Öj«½†×éÙ³ »¬g ³P"/@¡ò;ô܃Îô»¢àöØoRw×ï*mn?jÎOÄH FÅ”À̼ÀóŒº`@¿Ãc:°‰M{ÙĦ¾5æÑH¨‰®$ýy§.ËìÆH®‚r_k¸Ì×;r[Vs‡{„&& ¾GN@B½)‚NUæî®aB æCاÁ÷\!Ê镸þž¹C7£ôþ ɉªÇÚ¯‰½n¥Ý…{ DFñ>¦ÇôÁN¡ó=þT’Œ!bãÌn"…Ø(dbÊ2vôv=´À;˜ßQMĈú˜áò2‹kd[íJRæ0c·JždŽ.>B"çPBLÊ2²GZÁ§áÃìq•àÒ`à‡ÖŽíï[;Ø4€¬¾6ÛéJ†Ýv*ÒvÂB"WoÃæ¾ë& 5 a‰ 9sÂÙ{>÷ÜÑãJ©¸{ÖbLeQ×®˜”=©ÄQRŸ]ÞÀR«äˆg±†¶”o»ys¸äP+#Âñ{Dt YK¹ÝX>㌬D-(ÝhfÄ>ãŸ0=D!Z"MÑTÃIY„/™ý]ßï*çé̹·´åð¨ù{)YÚnx¥§LÁg Ô+]I¯nƯÞ\Io¢½Ú•€W ”&H„0朽6¼ŸÝb$ÖÌ v/6»òÓ–_b¯ ŒÏ-y:U~6KfÐu•›Ø —èFëéï³¼l”¿7øm ìaS©»:ˆIÁ¼ß/ò€ ®0ÇK4=_wƒìÉ " @ RÁÖ)ÂÀu|igTx¾s$ÏR „‡÷L0­ªÊù"Ù´{B8ÚÓ7—½qúÄq5[ËÞÀòŸ[¦R"‘eQ@lsò3Z#¦íœã½cd%#D³O6ž’KV4,‡<«'Ø ÆÔË–EþÖÔ²˜ªó›á%áÏg ÊU*û=±-Rb[Ld»Q®á¼¦”¯=¿ï±äŸþiG}pÓ‰“åÞ;~<#Ë=ìÆŒà`ÀðÈËž‘à§¹HFB®÷Â@}[ï\›æÚbg5¸1:З”¨·g‘HmKþ@ãžE²×íÆÏõ¨›pƈ¢¾¢E¿V6u¤Ñv¹®Ò¸…IÿI&+°ÿ/:ag2íœé`™lêÙ*=Ó’£ëž¾¿˜pâuN¯‰qÆã¶\ìÛÞ¦§Î5VÄ-?£+ž6ßà•¯ðiñ¼U¶u’ ;©ª•ûÒ‚{ ã—w;ÎÊB Â5o©áò"vWC5˜Ä,•ÚÁMÄL‹uúî:D:å©ÎýÆ+¾³8zL¿éÖ m“%šÚª¾Ït„·l’}€¶wwm%¶žAÖuô¤Ñ‘ ×Ð7Δ-—>shK²t[«¯Y°C2o=sü¨8H3f:l39~-+JN]“˜Må1Ëä¬*d¹°òˆ fhÚdv3¹‚IëÉUð»B¶­”#ý0« Î:ô… Âf=H¯AW¿-lði XÃ+Ñk#;Õºú(~âªv¹ dŸ4™®È3‘#“Ö<4#瞯Ôñ›Ñ,3ã{ŸR· ÆNLŽ#hÓù¹íH ÝÏÝýÜÝϽ· ‚ÞhL7ºëÝÓÝÏÍ&Lwov÷fwo6½7Ût®‰Q²7[áµ5Īá°Ú!õ2¢ðoûÊþå'd‰þž\ìÅjrE>k˜E»ˆgžÝëz±øØ!/É D£–Ë 3"riaŠx–‡UÕÛây;ÚN©~9»®:õ>*d]õ„ÑåŒcPr+¾ºryòæDó)Bs&Y&V­ÛÒ mGL‡s°s­®Avžéf¸ƒL!%U¡XJ×!ÄÃc/âíO4ãÍ1ñ`[9ÇÎ^˜^Ù£v»Ç¬µ¶"˜ÎpÙSØ ˜QÆÐ 3 d§M±Ù \ª–ý²Ä—• Ì±Y¥œ è¾A³ekàe+÷y©™ [ë]µ®³L*Ã`ÔÏç”íÔ„Wí*w¦YU»ˆ[Ï‹ŠÒ16°j\gÒ…Bˆ·ðÀ§ Å+€˜þ ܹ§Á+˜¢ÃÛxpC‰¾éëºE?êÚuÈCœÓ‘Tºm]u·»¢nA ôÍ4wÅ­ˆ¬lç|ž§½d} ,Y‰ø³†ÔñDÀq4®-¾Ì5J;<±¹è D£NáÁ1|–˜QëÊÅ(ˆ«Fê¦u¹a•ÊÂÆö ô¹{ê'S˜x·£"]®y%—mÑT?ÛŸ§¹¼²ëo_yò6.HÐDÈÎ]i!«]øH½÷àôèžA¢);"X.»ÏêxN2ñ=Â#”ˆøU24Ïeçœ-£ìÿý®¾BÊ9ÆÈ&íuŒ¡¥¡®‰°~Û D©––•D.eÒãßyÌSÊH´FÇOÃŽåÝR‘˜%†ªúáÌ­²Ä°˜¹žqÙ·«\ ÿ¹Ù·kºyöùÎvrd >ÌqŽ<€r»pÄvÒö~¹‰ž´èdâeG´ÙOÄBÔä5Ñ48&'Ü ‡E¾„k8-š¢ç±òdS=Õø“ß^{Tª×]§®¿enžb>¾ãôûëóm÷îjòŽ·{œ•œ~«»yJwûŽ¿¼|þC,\ÿâûœìqë.g`&Z7ÐÐxEœŽ§¤ª2l©ãq‰v“%›G‘s|øÀ–y”mÕÌå˜ïTññ¼B" ^ 0ÚÛ(“¾Åràõy"ϲ:Ú0ÜÕ„‰<§A'êÜ&‹²HõšíêÛ´æ®™Kkî7­ùü7­ùí·ÌÍSÌÇwŒiÍ]=—ÖÜÕnZóù'nZóÛou7Oénß?­¹kÖÖì}ÐX¢¦=¿–Ù|ôªzR‘î€1à{ÅÝÊÃÓH ÄÌwîµ£WÅXTÆxx(Ì4søxá|Ñs’ŽA¤½3¹dTtykéÔ-ˆ¶q¢ Ƚ]“¹!Ì¢L oðDÍY¶M •çùÚìÍ~ŸÈ–Z“¬£ÔqÁEªi8«Ÿ`<âNB*Y‘œ'lïM·–\zIwÐv>1âmcz£o_y>nÖ Ü4ðÊ…³šãÐiÑ==ºg”Ýí4ÕÞ3ˆ¶öØwî{† ’=ºí™F/tzEaã©!W€ß3°¹µáï©áÓ4¢è(¦f®¸ê/áû3™ý1_ÃïÑíø¥§n–]ñðΠ⺀=ÅÕí¾‚i=ñ¹§U±åïEÖ·c[eý é´€ zÙzfO‹Él‡*an*ÖÊ &Œ‘ˆß#1±(€‰‰åÈLD’IªöÂ9Ô²3߇“IQ€ÔaÄZH‰jªc“¤ˆ$&¼_¹š®äžË¶3՟ѧS³ÁñÚ&\ˆSG©òTH6Óº˜~MU½0©c"½q˜nIê—ƒØ:ÕHV&r‡5Ó‹Ú0BçR'Y"‹22¥€÷«ÖQy²ݨÎ}ËÓ`¨“mdqðC4]ªrì€(ëd¿ßaM}ÕCš.d›rÁÄ ‰< ǹ×Z(ÎÕ7p‡z 2Z1îÄwJtÄéÆ8Ö1:¬D­’lv È ’éI#‚¬åÏéÿ„½ÌT³LøØ*öÎE‚{ªŸ¦øÆ¾}ešÛWªêˆu3WÚ¸z@#ÍÝÓÃ÷\8NÙÑx¿òV¸à;|šº"“h¾†kû‚®‹®à§ áž¹U¿†SÇ^ÃW—ÏYô=Cô§¹Ò]AtÝWí˜ `pz…l …,äà72&™6œ«r³=Ø0¿Dz‰–&Ï Åö’ùg‰"_ 5ÛµŸÖÀˆÅ”àÅ QW®3"X•ÊOÞ §ìEÑfŠGy‚)ÊÌ¥À4ÈžSd›nUÂêž6=]ÓºÀë`J\Ü”+ü ¯À^\ªEW4¼§‚+ˆŸÝëÐ#¾êM·\e›­ á+0¦­­àÉ”3·Áql¨›ˆ'·ãÍeJ‹L”NSÔFÐ'UIJw®<ô´Ž3ðÊ7¨y`븕‚ž†ÛÍÅ×V#|÷Þ1V¤„²ýÈŠê¦Åˆëì-ô’Å*”±·¯Ì«À+H«ˆ‚íÏÅ*úDbCµc™Gm0}…l_¸û*áiz,€åSò§œÈdÝ0RIbˆUÀHÉ»ÌS" cPI@RAÉ–¼DDŒŠÍ%ʉÝ*”/; ºÔFÕ¸BE9ªJ£ È@cŒR¢uˆÔ$šUâçÄâöʧR­ƈ2Xm]¹Ë"‰vDp†jƒÌ›ž¦"¦˜ÐUÌ0ÄebÃG·0{µ&U4 »)B˜¸½ÌD×üjs¹Ø¢ Ų3UÚ¿¼òÍ¢ËÔµ£{ 5a´®WãG¯sÖDª°Y*OÏ`ŽY%Ój‡[6ߎc^Q¤;¹£ RhBä¡õÌDÐå,*ÛAW¶“ìØuà É`ÒT£«3N‹::`b1e«„ ÍŒ¬š„ÀVdá/FsâTÜn :ÎUl¼•عŠAmÈŒó-òn$ž"ˆÂÁú`ZDíT»JKf”Ør¿€šÞ¸\ S€ “Tˆ™L‘c‘(rjß2ìi)2i¡!–uxèÒúÚ/¦`¨x«ò1?]@k‘Dxs²ñ'Ç>;Ò“,ÇœAѳSg«6xª¦ j×W shí(E Q€lòަ¯ MÏŸdÀ Î1¹ò#H¥4öˆ¨x–ˆOÌ´0Õ;h«ÑŸ¢ñ€´ó4#WøVÍ„§`ï`§ÏUÞêØ¼¯ª¾s1 ¦h*Á ¹•v‘ ³’[Y—/žGUy$$¤dä-#± HuÁ^OÖcYÙ¨ÆeeLªO‹Õ3Œ1R) ÿ^ŽDìØ^©*ê»cÔ&‘Ì—€ÜFð>B\³@OÎŒé îÇíO¢‹R=‹×u0iг­ÜNÛNÓµOȶíLÖf&;rº‰°A\A9öˆýÀl¼·:wQìÖC®&UZ$î¦6Ú¸›ÊûÄ«ÙÔ¦SîWÎÖJLø€êã¾)Ë6↷­«(e2‚™†3")M ";:OŸÞÎÕA¸‹¡§/6ðñ•è°_¯]MCø<¿Þ£ìVž÷MÝìÛå'‹6\†´u½OÜx³:Ö²ðЧñ4ÔæXgl,nc}¡°šRøJoDjçݰü?ùÛ˯nÒý¨Áp «ì‡Cý3•:ëîƒqäçÛ–îTäöB!½|˜\JÙx~v¿|#vl1€\‚CÓÜç8Á&™1}ë~Q*®_gêíÖÎ#¦wƒÇñº©®5Z©ºWó³†0ƒ) ¡íÛ$k8QMwe!Œ™Ý÷p·†|Nµ¦ûŒž&Üâ9·Øºƒ¨‚ðLXÙ‰ÂqT/¬è¶í{W‹e5îEOP¤‘ʈً(ö" á"Š ãhÝ¥Éè‡ï™=¿úe觘^æ—c² ˆ ócZOj1§nÍEÇsD‚‰3aÆåú:rO¬´¢>¢a€­iòT2%sn—2uëHmÍ$w¥šßhôu™„©E1xÈÚi"S[ûëOÔÕ¦Ê&íši×Låh&;‘ø'ëñ™Ea™ÊñÕÜPEýþÕ Ò×+½ëÖ]·."qªyʦѷ¯Ì9OÎN5Oy8A3ó”ñÓMÞXgÛm*Ï„›¨Š‡å£—ïBy± —ç 挛^¦’ â0WVÄ7¯Œ2®\HU%Qè¸_ó˜F9ÄÂu‰Kl‚ê<ï‰^°c‡I‘†‹ùÎZ»‡~ 5Bv}Èê™á£ŒGÏÏGÛ¾5AÁy[¯¹Ìß(;³aÓö®ŒÛN‘g7u^¢ëŒÎÚå:#מ¥É¥¤Â?¬U·¯ÌˆxîI„˜o£‚t£õ}øà¼»W†§5ãþ¾_HºœÀöh€;†¦H7ÏI€¦´ý”¸å¡)L,’³J –/ƒhM3 ¹ÏÞ M8ͱàR:Ùüá”9ÛdŠGE±-ÉÜè£CŒ£àò;X{òláÕ»™A ?kѪ󟹽 K*çj¯ƒ™YÛê`¢Žæ§¼«áðÞrA;2܉7¨•¶5ЩfšÇm´ãqº˜øK®iÝ»ÉP¶ÉH—õÝxt×ÜH£­UÍͬ›;R+æÐÕ:ìÂzL”“ÎÝ3üÅK"ØH¶ïí4ƒ©íe–„³ƒDc×iÖ4q¶<¸•¬Çï‘€n·*H“AkÓݾ2cT[xOö$ðá¼Ì݃ƒ“8 ^ñ„GS… ë¶qH(“4EjD¶0D±OW³t9-¨´-ÆŽ•ûe€7¤*&%˜J¸éËR¡´åŒÈðG_bÇ©Ò"ÈEER™¸ŸDÛ(ªùœ¨L.ª#ÎXXùAi­¨o©°Wœ c›X«©¢˜›v-›¬°û¢ÙZÉðn‘)—›PÚx·h½ *÷à‡R0h@Úaðy åRR²¢FܪÆÕP²´™""A*R®ºw3Ÿ®uóü!›[=´l @£®ZbL gjžàL'i7ôˆ{ßa«ÈqÃÏ0O¢ w©ó¼:‹_y®‡«§„™”=<nþ:3È=þ/¦¨h,uǪ/¦²jŒs¥j¿…Ÿ]Ùf9å ⌡€]ÙƒÀ"ÌÏHl|º)õ*¨,çì"Üjø´€j*QH™jl';-߃y•H,IqL•p YNå9db1GÔ®òM+]g_¾p~.î,91~ßõh^EÁ¶Êª›7GnÑ<f‡…èŒnzt!wÀh­€ã(P£K²®ÒVEîniŒsò|2se—…¡²ÐÚ~±,Üa• + ý*`2Þê¯3¯w –}¤·«ø3˜²,&/næG²n&ÿŸrf>9{XUUùÖŠÈw". 9—¢2z÷šõš•rMÅÝ9&cB OéÞ0zv±6eŒ±.n ÜîóKHòÎ:û{ÿLÉÚµ»†X _¶’ñט{ü6êWêGm2Z;Ùuå Ñ‘!Ö§sc ŒÚì˜u#L”mYØoÂöôïáÇIªz…î/÷~aTîfÅœj¥ÎYtmoUÎÜÆ\TN;C…‹ÊÑG}ß8Q9ÍôŠù:ÜÓ¸µ‚Ûü½ÇÜÃ’æÖö:|)êåáër–ŸÍô‡Sz|Æf>Cá§Á{†VAŸÞ¾³-Ëp翟V<®¶šfX߃YÀôÙ1Û`ªBÚa.äàÌ1ð¬¾gs÷``ÆœÕ9ÇÀÃPî‰ñ|×Wt 0øžÏÃêw¨,¾‚×6«sÂî ¦Ÿ‚…øŠ‡ÄPj|ôsØ3ÛV'B]È´ìðª/ƒ¶DWÍwOë~yùD>. endstream endobj 4189 0 obj 8872 endobj 4193 0 obj [211 /XYZ 37.5000000 561.500000 0] endobj 4194 0 obj [211 /XYZ 37.5000000 561.500000 0] endobj 4195 0 obj << /Type /Annot /Subtype /Link /Rect [338.250000 517.250000 356.250000 524 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://golang.org/doc/effective_go.html#defer) >> >> endobj 4196 0 obj << /Type /Annot /Subtype /Link /Rect [43.5000000 285.500000 96.7500000 292.250000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://golang.org/pkg/runtime/#SetFinalizer) >> >> endobj 4192 0 obj << /Type /Page /Parent 2 0 R /Contents 4197 0 R /Resources 4199 0 R /Annots 4200 0 R /MediaBox [0 0 595 842] >> endobj 4199 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1409 1409 0 R /F8 8 0 R >> /XObject << >> >> endobj 4200 0 obj [ 4195 0 R 4196 0 R ] endobj 4197 0 obj << /Length 4198 0 R /Filter /FlateDecode >> stream xœí]K¯Û¸ÞûWx] ‘Ô( äf&º($@EE¦3ƒ¦³è߯lKŽMé£ÄO‡¤d«{cY"uxÞÏïþðéoÇþzüîý§ÿ¿t¿ß:d§ªÈ®ÿ;ž~{ÿ®OÝßǪ.Ž_~>|=~=|<|lÿûõp½áÓû?µýï¨lÿÿïã_þÚ~øc÷¥ó~>TªjÿtùÝTªý+»ý>þ¯ÃŸsüåüÄ~¹n3ÿþ­ÎòºVçmL,ýõп¦ºüüúå—ÃwWø­’gMUê£ÊM~TM®ÿýûáíýã³S“+U•y•-Y¨Ò畚¬9*Ý´O2f°ÐåGèñâWY–«Pïv.eJå~ºÜá¶jÌ@º].üûLJ8\“;ÜnçâP¹®ëé’‡[¨úÅE,Ñ·ÇxxYæá~Ù¹8TúÃÅO—<ÜÊ”å¶"PD·Ç€¿Êtîp/;‡J¸øé‚‡Û¦ƒ~ÑÔà{|ˆÃ­òüëÎÅ¡Òîðé}ž‚·rýè…_7¾}>|÷¡ÕÊãç´;»,xýõùçCÞþ㬠VÕñóÇße™~ÿûãç”:yY·úòù{—+Yq¹bú wWòË•ü”›«‚}»¢›Ë•úT7Y©îyîÉ*tÒðŠºîÚœŒ®•¾ß5¼'«¯WflIÕðÕ!Pôûñx'×…øÜâʲcVy†NZ¹uÔÊ\–mN—Ý<¼o‰®t/1rżƒ÷|€W~€Wjÿ+:#ÖùÞê=¼ŸæØ|Z÷@2„a&¯l û>ôšÿª[u©ÀÛ•螊gªz›Oª99¸ÇáÝcoÉÁû sR\˜ØRV¢{t ïÁOcd³k,µðQ½9vp%É¢@s ã@ ã+<¼@l”]Ææ¹!NS'Ä.ÇÓP‚Q¹(RÙ ;N’`—›Å8‹Ÿ†is^—øCJ™JYbÆA0‘“³"æD(ÂŒÅÜ¿GÆŠyëô c3|%'Å (Á ‹p+‡.A˜@Kn-HÖæ:;z,¾uzls5ð ´¹4¾Z}ض Ïaϲy¬3Æ>ƒ<„6ÑY<^J‘©:¸Wea)Öxo˜è€[#àá5*·ñ"Q¼'’å°¤ð:»©ÚT””¾½oYS<“(x`@¾Ùò‹ÆB ƨÆÌ–’¶¶Hùð½ÅÓÈCrMp«Áã±a3Å…#¸-ÍMÛ‰ôÀX„93VÖ§,ÍÐLµ¶À¨ß C.¨0§Á\p•J´ª ”:z…”ÊNe¥u·X~½T涇CÑA°2L?>†9*±Çd®MìÐ`ÎËG`6Š]ñÜeëA»)i{Ye EÆh—Ð<ÖhR‰begb:ÁIP©p¨ Þ2LŠÐ ŸÄáÌX˜s;1>0ŒèL”DÔÑì (©ߊ$Q*(²ë2¤[¶TYÚŠ¤å­Ç Mƒ‡ÌO dTSF_§T`~ã‘9_£§d>&nÑh©OÜ.¬qü SÞüô7æ£i`SzpX—Sï¸+¬0¥_­¨/ʱÜ›ÃżÞNnÅQ &&Üc«šÜ:ùõ†zǶd• {csBF´0J§Ç}ïTWþ7 £èûDl”º70qD%¿ŒgÕC×±¿:iÛ‡táuwâqpd˜($>0• ¨Êz­’{ fprù ÂX8G' V­iôZÃP‹‚9M’È…À+ÖãžG÷«ûÜ[÷‹!P7=ùt~ÑHÌo£Ùýæ@ªø%ÎYa`î²¾.¸l1àì%ÝŸ“G43–jB<ÍqêÌÞûes†Ó­l|8~zya Kn›e YY€^¬Ÿ{ØøÞ¦høðoXCQ˜èžCë`ü¢Y‡Ä#9‡ðÕ©TéHž1¥½³ÁEP6Æ&@C‘)‘òãð»|€ŒÊÇø2àÙ:Ž“iø ßö€mY©Ö–!*/×™²%¨ŽV„%â£]ˆ&¿ä?Há©ËuUÚÎEÐ1a}P§¥Õ.¶ôõNŽ÷y‹xÂ¥šÜ¾" —=ax ïtœ±+°j{~ Œà ƒ&"VÔÓgâÀ ¦&Ó¾‡ñk¿ Ñû˜7-üßÇ!3ð™â0‘ vkÍ0ç¢ÞßCì`õ|£¹<`4Jn?Îè‹jU¨[]næo  ›*‘'8ôbÑXެï$]+°äA1Æ”rYƒìäµµI_/Ï^jí{]NJ,­p^§£éËè3éónÖMˆ:Óh–a‹Ëy±Àxºþ(„æåÐÍ_¢ÓÁ +ó à˜Â°Âšú&¹ï$–ÇÁŠÚ,ÀŠÝWHŠF9{õg#–¥7cÕ|ZÆËz žMoÛ}J¯äSz6ì]‡Æ}n(Ç˽ S¼Bùðeu+¼fÆ$ÑX–ð”]£öµÇ±ª—¯~Xsë`°gÁs;Íøð\ÁdšK >I®Õ‰qá{ä¯FJÑ|¡Î{iV”†#éÂ'éåeiI-~騮LÖ¡dÍ*R +|™œüO©¢’ÂßùËöôZÓªiB¶ÓÔ&åÌ“´¾u$63UøðJÊv®mó/l¡@è¹n‘úÉ¥/IÕ¿rŸ—•@àÁÚ-*™ ¿éàX°ü!†!æ9¼RøSÀfT 0î0n_ùveõËðS*‚YÁ{pËD|O_«7rO3Auc“úÈÊ ÷~ZÇEF(HAsÙÁ­°ƒ#Ü[õCñÂDå'­,Þ¡Óõ‘)û[îÎôMr׸epo¸E'¼‡‚¼Ç±7Z?ë¼óù·™}°?ËDhØàIc,XáaU޼’>ºµá[:klìM®73ލh# ê&Ü%]c£Ñ65îôãÍüÕ€û‡÷¬«Üæ¢éëed%›‡ùÕO7aÊ8î õõi ùlvx¬æx›Â‡MQ'‹Mu!ßê<Ñ ­lQ½ÉA0“ºµ9/1T=Ôn²@¾ÃÀa™¢aFŸ>1 4/;ÈfKXÆ2¦Y>“Âdƒ‰Z3Ì0UfaàNÑ”ÀÄ1#x¿M3c:…¹½ýi²ŸœŸLYa'óH:™§Få'uƒ²‹SÖ˜‡C hšI) ›«q4•É̲¨®O±ôô"–»x…-š£ÐQÐFØ•%–Ї#Œ€X,ƒ!Hî÷ ý†aãei,ÄÉq™'Ž>ÂH5peÊ ¨ÉŒaJŸ‰ ¨W·:|Æß(©Àô'Á ïÃÙŠQt–ÌÍÅèaxK>^ ѱ7ü°ˆˆåÀ‰¤hnË×+1zÀmê\µÚ¿µ,<ʲ¶¤˜ŒÏ%ìà-ápgÝTÙêž—%Õ&+]Ú¨¿Í©ë CÍ-znêáÜ®ŸÌ:påE…µ®¬3ÇíÄm'«Òb2××SÃ×;oñ²Ã=ÚûÛ=WÅý?>90> ©Ô]O”9¤â@áµ”³NÖÚÖî…x&¹¡²r¾à¬ºPiQ”$OàT*_ ‹€zªŒ8좽(Þ ÐcjþS%)l³µÕjœܰžÜæj=`9s³¾ˆ5'ýÉ$]Í÷¶ ·f[mÊX@~cŒ²ÎÓ·àóH†dÚÛ8Јi£³åz—°ºqÞkÍó©ÆEnl=Àƒa2¸ITŸQÁ¦aÔ6ÛvIŒØÎažÚ¬,‘㛩U3›Í8\öÄ¡.šX&ŠD²¶p²˜4Ómˆá]ûð1ª':td±, |[æ¡H‡S¬ûPrà,“®)RËà‘—D¸ }²D=þÕi!]¡ºïÌpcÿ}£¥‘·íê&Ff©ÂޝŽ+kΣ#ô4¡Ó·#›AÕŽ-Áj#¦(/ædÌv[“P¬ Kš™ój¡F¯IAÔ„™+Ô\3ѬcPQ.™À阅ïÁ4ƒƒðøž=l t—ëE“>ãZÚ^{ÛÓ`VN3ð|bâ™-™i*;ÛMVÿq욘JMÅ~,g¤½Á4CœÂä¼Ê8Ô¤õjÂ\žà¾ŽYÞxbåÙçLrÕãU¬É‚eÓ•¸›C´LPwàÃ’õ['kšèÑf(’¯cà~aðbà.œœ¯âGF qs4v¤%›<¶üØsÚ’”ŸÅÚ©®–L°šé—ã1ˆÙ¬Í(~+ÕÓ# ”‰þKäd2ÜDf¶^úä>³8°bÙ•}ãÏ“qQUö…»$f„ù0ÙºýøÛ¦+ò#%¹æ±ŠmŒ–ÙðlÐñÈ­xamU$%RÍ„lo ÙÖÝk®5¡ü.»²l¿qxg]¥Êï*ËsS6X«K é:`÷Æ,‚ÍSþ¬ˆIT¥¯`´ˆCw}MR<:;v13’ {ÕÃÜV¨jºÃ“”8ÄL5ó) _ÂV5¶üOß©@´ý°Lo9)E‚1Ô³‹2˜’VÆ}*«JDëçÉvxzŽºþ80ÏŒx©Úu¯ P÷dÐ^…-kŸ…YxÒÀmU×grQ‚'lšM!×^è%˜X•Í£ú˜°ÐKÁ×l*Õ+iùuqš½#1˜8m ðùÀt[Œo“éÌ^ïÔ8Î>-Ãøáfà:ú!JÈbQ=ÆÄ¢FâLeKÈ0uÐ6QÈä ,L:Y‚a ,àÉ1…¬ W^Eq Œ!ã1‡ÝñzÇkq¼^GQwU×Ó°Ú‹ºŸOVïšóV5çˆeÂçY€9dk ¡\ke±ˆ)Øcì NÁ‹4ztùDsp ‡)&åãü4Ì)YƒôWà®2TUdÅáÑ+<Vd¼s¤pÐk†2›j,”Ù4v˜±ýdÊ<Ë<<Åܯq e6ÅX(³ÉkäÃPæù[õÃSêÇ5‡2õmÚ“²Ö‹G‚²ÃéŒ1]T Pf`¤¾/èÆ—H §´7BD2ŠJ²páj2‚ëAyÙí:[€CÝ‘±-]_p¬( Wªâ+)P(™^ÆLK|¶(´%ètœ^È“ [v %±¥mu4… ˲ֽûÂ+è+N`.?^qϺÀU}L¡3R‚’ƒ¥J1 y7lÐ~#ZYb˜jR UAjŒH7DÙN× ›b¸m¤5U-.;L&yƒŽhù©L/¹µ4ñ[gÊ>î¨o^×è$ßßæ[˜BÕAb2ñXùs"2•Ã!ZáË(›²cbmò‡À‰6ÅHàD›Ê jœ?±'—o™‡§˜û5úÀ‰6f$p¢¬¡“˷ꇧÔkDœä7º‰8Ùã R¾€§jîÅ6Ádª¢}5ÅFÂ>‘H”¬Ë†iFL:£f 1ê™h6£.!GĽñd횸mCÆItnɵ6ÎöIÁÔñm4{úëš=°˜òkE*$‘õ ÈŒ¦ \ø‰§Sq=š{2*y*‡Žl¦×½a¼LZ:‡ä\åeU<oo.´7’ñÝ3Žac|¦©wóùV ˜BÊY½‹‚‘gW@jt³€l:¦:v’4f˜8:!1F6&"¬òzr?øJþÎ"kfŒÝûÄ|Y…üûòc­ðð®3,àt°°Rð ¦Gø¦Ž÷Á0€§€±|Rðø~S¼7¬`DÂ7|…~9 æ\nbaë¥.{ "V¤;½j®óIŒÓ˜[§êà„ì6xoX­Äø‹e¼¢!s¬CH7 3’—ðÚbô$±q×3°<7ÓØGðH ‡œHÏ‹!¿{RjŠƒcå­./†3£[õl¥uïŠé–ÐÙ˜e/ã~Àün—¸Cp85 ý(™Sº;I.n˜;à{0&š@!¿cŸ‹`–¨Æ‚O{ͺŒ¬4z!¬"$KTÇ,ñynÓ³¹‡|…|¼°Ü!Yð0&Nù–¼ Ãœ©C{Ù¥«‹FôÂÅ’h‚ÃOJà æƒŽuoGL ¹ºùV#JªRõ¾Õô¶ù·6ˇèì–¾ø)|9¦ 4‹<ܲ‘]yJÇfd‹h,Ë¡“b-ŸÑ}á¼k dc¢º¯coCð&‚LDø™(—Â2[n^g0g‚ÒñiÃ3-"æ=•…ž†üŠ}S9ƒË‘´±’éL® æi¢>טÖgY©%Ô”Vm—áØc±´ÿñ´šŽÜÙ²íÏñkûxçê§¾0#󹪪Ì)SçZêã·|¢«D+ʸ±É@¾ò}Ò—”è!–•Ã+ô©«å¾;ýëÆ’¯¿G똩™±½}èÞtPNÞá9®(Êmu7A(‡/ر÷±ÇWðJŽ^Cá§Á{:ó@y½zõ mY„;ÿÝîøÑà«"P߃Q k"Š‹ÚÇ`‡¡ a‡±¤#dàØ\§«.»Ãc0ƬÚ"BÙãx¯¾Nkðƒ ¾ç­Û}W¨1ç Þ[W49Æ,à bøuN¯+C®qŸHÅÒl•™SÇïç¯ÂÅ3wõ(“BíãñãáÿÚã‘ endstream endobj 4198 0 obj 6107 endobj 4202 0 obj [212 /XYZ 37.5000000 106.250000 0] endobj 4203 0 obj [212 /XYZ 37.5000000 706.250000 0] endobj 4204 0 obj [212 /XYZ 38.2500000 670.250000 0] endobj 4205 0 obj [212 /XYZ 37.5000000 582.500000 0] endobj 4206 0 obj [212 /XYZ 38.2500000 640.250000 0] endobj 4207 0 obj [212 /XYZ 38.2500000 640.250000 0] endobj 4208 0 obj [212 /XYZ 37.5000000 582.500000 0] endobj 4209 0 obj [212 /XYZ 38.2500000 670.250000 0] endobj 4210 0 obj [212 /XYZ 37.5000000 224 0] endobj 4211 0 obj [212 /XYZ 37.5000000 106.250000 0] endobj 4212 0 obj [212 /XYZ 37.5000000 224 0] endobj 4213 0 obj [212 /XYZ 37.5000000 706.250000 0] endobj 4214 0 obj << /Type /Annot /Subtype /Link /Rect [279 233 331.500000 239.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_director_foobargo_class >> endobj 4215 0 obj << /Type /Annot /Subtype /Link /Rect [152.250000 69.5000000 220.500000 76.2500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_director_overriding >> endobj 4201 0 obj << /Type /Page /Parent 2 0 R /Contents 4216 0 R /Resources 4218 0 R /Annots 4219 0 R /MediaBox [0 0 595 842] >> endobj 4218 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F8 8 0 R /F9 9 0 R >> /XObject << >> >> endobj 4219 0 obj [ 4214 0 R 4215 0 R ] endobj 4216 0 obj << /Length 4217 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯ès€m‹¤ž@À{äÀ°‚‚Ýl‚Åz'‡üýt·¤žiJ_uóS‘Rk#¶wd‘¥b½_|÷Ç/ßÿó¿ûwO_þ½ÿ±ûóéË.;TEÖþoúõÃëØúÐý}_ÕÅþÇo»ïûï»Ï»ÏÇß¿ïÚ¾<ýùø·ÿííþOÇÿÿ²ÿëߎ?ü©ûG§ðmW™êøç¯ç?›Êÿ–]þ<ýü_»¿ünÿÛiÅ~»˜ëÿþÁfE]Ø7¶þ¾ë?Óœý÷ÇßvïZ„í’SeùÞäîø[“Ûýþ±ûù¸A¿|vhNÿ¤Ì«lÊF•=íd›rü-ÛM=ØèüKgyañºqñ?C®ŽãJ#¯®x¸ÖUy‹ Ó®ê(zY>Æâ•‹¸øru¬t‡+¬®y¸U]µ²yÿýòðï2s[ÈÕ±Ò.^]ñp]V÷b9ÂÙ¾¬ãlÍQcÅ#œú,7£-^\ódmUD<ÙËê1·øòX' ×<Ù<³Oö²z äçEqñä±NÖ_üsÈ"’ö'ÀÖÿ.¼øáëîݳɳfoÊýן°÷lÿøzDI±ÿáDr®Úýiÿû,3þ°ÿúË®9”¶èAlŸXøÄÔ𾓣'Ρ'†®f+ø±{ßy†O>Á'oø‰Íˆ}>B”ðK!F…“c°qq @ Ï”úž¶O_l‹ò&<øIV„?ö±ð Á\-3á'ÌP_ßÁO„ïÁÒÓ%ñ¥XvbŒ PCù$ìW[²Ü¾‡ Å º j°¬J(ŸŽNOø´ðל-¼ÏüÔwSk%9áÚ¸MM’›EIÊØÇÔ¨x5Bo ’‹¡xBr @tà“&F1l”%B¬†½_ç ˜®ñÉQœ…aÃ2s=æü= m”ÚÙ) R,ùð‹åckâø”ëŒåê°~g¬1LcXrÁ},ætB>1ñ'Gx=v0…@ì0ñ e›9Hñ®Uý;lO®®“JâÂLÄØã¾›Ð›Œ>ÛlütñW]ù$h0l«b:`¬±-šÌoK*íªË×}ÔÚµ[Úü¼eã.hk·¬u“±ð‚‚>i‘“r×:NzÇæáïP7¶vcûGCB¬ÊâÞÕ:%nÌ¡ÈËúøÐ'ıw,‚Ú4áO„/u‚ }é…±†8x†°µ‚¯ oíÓ¢ë÷½§²¯…` ´_DZ#ûYLÇÆOˆVòpîÃPP-Ë ë~œßäŽ1 .°œîøÓ¸é÷àïƒ?}@Äø1yÃ'8»‹š1•aA³¼È*>üXõª2¿°Ú¨”±)™~À$ GŒEaï$GD}W˜ÜSxR(ãâÒÖð]º%x µ ZóÎHÂ’ëc'S‹Ràoø4à§ Ä‹…Ö*„Å`Z §OPÐ׌¾™ÛÚµOȬ§PŸL©ª¼(ºÈ’`1†~€"Áâ!ºnlê3¨«¼à·mbYI,'³6‚mº1\@&°Äx&Ì©Ï-ÊSÙ=!毪4î’Ž}g]h)â.AÀ¯n6k)ºF5¦ö± ‰bì¡lÇŒxẀؘ²åÉh­Û´¨ÞR í0Ò]°€ðiD°™`í­´^ØB‡Š‘Ÿ!BŸ:¦¡÷²%àÒ0‰œ‚ÍØœblFÔ‘¥-}ùŒXK`aB½&Ìʇeò9¾E;V±àhƒ?\Ã!è,LwŒð`t0c¾ih áXî×sTˆàÎÈÖuÓO ¡DöOK`Ê2J,bz”YãGõwð;C7›$èŸ.§4ÄhV]6£U—g;Í âzK“Úhã@ÔŒ=©:‘fUpÄ;¿ÓÀ}º ʼ’¾<ùp‘»>L¸ZGycï 7…¦kÙFøM¿³W k JÞðÄ–û5ö›)S퉡´â›ÇŒHv¹ýWêlõF\¢NßÈÆÖ|×Âã*ÍÚ»< ¢Ì8ƼÂü…uaMQ:‹pÁ‡M‰‘óLŒoŠ1F„a±Ñð†—k³ ³¥‹¢Ès&²/¨hU;XÄ쉑ë&:„˜Cˆœ› z|èÌH ªÏ+ÌûØ€Á $U­ ckãSЭ„R c<ž ÓA³µ§Ì6{x JòF%(A%ßT[ôK‚‰0‚NÕ+QžaÅp !Ôi™-E©S®ÅxßL]ËRæ€F­*éê(_”"ÓALõÞ'² #û¥K6Ë竎Ô-yTW‰Ê܇~6ã¬kLêV–­ª#{k‰1.‰Œ!%²êØò¸·™~°×¬ð•´d%™SU…GŒ¯£Ú}+Ülmáͦ )ß\‡¿ÓO_yÞ“ëºirÃÂHÇ4÷u«åýu¸/ßÓ÷°‚ðø®`|ë.s'±íÓƒˆ~"Ü/üaƒ7)›OèIª›z­m.s?SÝr·…Î×:WqB„B%ÚÊUµ“†ÉCã}¦q'ϴ葉‚Ô÷¿;çõ yí<½3S—p\šT5AƒVrA±ÌØm|qoG§¼]¸Úƒ£zebfþ†ÉD=¶K–K˜¨¨q› !ª˜wŵ§v³FgÊ)S¹ƒžª‰Æ‡ϰhŸ)ÀJ׈ª2ÂteeT©'r„t3ÂæÅ99Ó5\´×­ÂY‹¦6Eãâ‚™¨‹“R ±^ðÅ~‹æ uYÁzi'aDq/" ×OEwÀgp³¡€ zbðjxÚðz’Ã'ÏH®á8ÕC€¡îØ ïSFV…wŠ[\åÕw=b\%ÿ”€ù;²É³ê63cÃ1ëÁ'Ó3Æâ›`Z¬`ºƒÆlyÍtivÍ‹k¶Ã¤áì07@l ç'ÄH™ßä´“óàÔbsr˜Êá%NmðútY»)t‰ÏcŸ#<,+Š…²O9cãÀãp`aÍdÎÑTð¼*%Az1xŸ÷ëÒ¨Qè? -ç·áÑ}‚±(\ßÄè¼áS œa !°j ÷Ñå ]Z.ˆwr(äMf5]¨—L!óK»¤úù¥9€‘¾Ë°1šËnø‚:¬“1ßcJ_Æ"īݴe’à·4åY™µÙ¤ÙlÒǵ"KWLষcE –*% û$Ôae1)‚º=\6vÓ›ž˜¨'æ·¿1lŸ~C7+ÓÇáf–]iHU^2wKŽUAú< §…EX˜a+‡[C–©íNÝVÀ‡}ÂT-c/8uÿ˜§ýЉº4Å]Æ$t8뢾Íu[xŒÇoUÝäÛÍíOxs{¶ðXÏMÍ”`ó“¬.œªÓM=ê& 7›G‚@·8‰‘·óK®””ÆL ß»Ý7=¤ÅVü¸Ù%Wï¬,›Ò.iª)ÉÍ.Ig—(køE¤›fJmB­ã2ãísr–Áe— ;Á36œ˜- ÞÀ}ÄÄe Ôä"•[Ý'©3Í2F—z\f±™õ tÁ^Žn~cv"Ê,W–M07U2⌙vC‰¦ûÇ!%Lô9s™ãÊDQv™‰Jï0Æâ›¦ê‹®’^Ç= +Û›;øºWGàùÑXà&2ÖÐÎrYásúR,‰±Õ°Ít ¶˜vIc=Î^”@C¸Êÿè73\O8¬+° "ÆÏS‚y@zª“£…9FÌ5½ÌÕnÝÑÇ/ÝyÍqæŠãÚŸÜŪæ~V-ËÚgÕŠ*Ì@Ò=<êÓÑìCýÏ­½(ƒ–ÂÌÂN„r¦“âpzÿÛ®>Ú ¯~ðëî‹ .âè™×Ä›ê^(g_2™y/†š¸ª£É±û°B.à;º·?Á– T”¦å˲¿²ê.àíOéÌŽÁ†!À_ZÁ} Ô7ýH<Ô3 êD·Y9[\‚‰Âk¹Y±·˜ûàtCsÝUEú`ž,1ù“r~»I%»Ä ̧®AeÐ… Qõ†êbÞ€Á¯oXd\-7 YÆÀŽ9iŒ§Å„øˆÊp`"K†ÙÐ>+g²Kò|âÄfuq) x·²YõTx„ɱ@™Áh—¡ÓZºžP^ÂŒ>¸_ü0±JÁ €jmÑ·˜}ìÙyÕëWÓø‹\3V[Oà –¾‰"Q,mò?ï®â^.ägˆ2ÊX‰!µÉ‡»Õ%—1f!H± FËåRVS¹¬o7v¸)– ©vØŒ!”¶ãFXB[„v¢%F·IZ(À-$xn&Ü—Ã[X !”Ð3m ¦¡õ—ƒÀïéö‰pvå冟N… ó#!‚°°bä¸f¨$,®9 7¦6¿ õ˜qú-Å)•2“C÷HТ¥š*÷Ñ- ÙR“Sùåjœz48I„§jáäî¼-"))Lá\YºR7¸ä>ðµMM6ï+o&K„‹"Ìð6]Ï‘qŸð;ºe¡L¿ƒq=°þ°§õfZòW×¼O+xB50ƒÉJ ]12¿1³žÎxštÉA+F(QZþ‘:%u}YÝ& ò‡ˆÄ5íb{ÕD—ËpùÙƒ[)ûT2wXJÃè`BE Y¢øeÑS9'j0™´tm0¯TU¢â£¼ìh#›Ð}ïüà@‹>{P^çæ Íç 1«­ÅC¥AñÎÛ2ŒöçpÄŒ ª¡'‚õàÑG8 GëtàÐ º5—cl8–‰å$ 8zäSˆô-ªÔú?d¾3!)7—¹Ÿ¬Éñ]Uõ¾®¯bdιrPV£ÅK§RGç ´&s’™¤ÍpS…TÎÓ!Âpbþ®J£‘³éz-ãd¶TÏ–êÑ+ü ˆ¼0£¼UM£%çT¨œY¢T÷êüØõ¾‹ó |üdö¸þÍÆª¸•vMYù ³÷Ï_ruZ¸X >ÉqñÕC­ W§áé(¸d yáYð|–9“˜rà×3>&ÓÖÌ$ø5 ­Vr,6‰šìù/Znê/Aäê’¹ZKæ0Ñ|8å^¢…ðfÅOL Y×ù`¼cÛ0·á¶ax7j˜£«;¢‚˜îl”8PäëÑœ/ˆ°ý%XsĤ,leáw6Û0{ã¶aQ_ò­£1œé’Ô½‘Le´X q¯«Oªè¦ZùÂ)­^“µÇ>7Óg¦ÏÓÞTõDöùæ<¯¸¶9²†'·PÁfŽ…ª\cšÆds¿ºFåû!S•nq¾7ç+ÍeËuÄù¨ë‹gÈÇ”ƒEãŸ3“ûS½$HÙk|3¡3ÊõÂZÎ4 ä– ¹û¨â ;lñöíÔ'¬‘fºÛ©ó¬xýƒÓíÔqÎë´‘'¾«¬×Öw›.<2ø¶+Œóé"õ­å'<ŠyÕÔsüµÿ~\\Üûó­ppõ¨ô9wfNÍ{Ûß©žáþ…öP«²jÝA;ÒAÑrÇHo…ûؽÓ5C¼"‰ô#ÚÇÝŠ0ÁöÜ})š{ƒ£7¹ÏŸ˜£Êáv…ñØvù ƒWƒït2Ê}zõB¶,Áþ~„¸‡ü” àw0 tÓ–°Q0†;ŒUˆ;L%Na¸OçlŒ½ƒq€)SVí±@P>ÇßÕ_1XÄaƒßùÐA?¸n?Á°uNÔ˜°€'ˆñgàÔCüD@1n‹|×by¶ÊÜ¡“÷÷1¯Á¾pöZóÝÒzûÏ»ÿéÏ> endstream endobj 4217 0 obj 5143 endobj 4221 0 obj [213 /XYZ 37.5000000 651.500000 0] endobj 4222 0 obj [213 /XYZ 37.5000000 372.500000 0] endobj 4223 0 obj [213 /XYZ 37.5000000 651.500000 0] endobj 4224 0 obj [213 /XYZ 37.5000000 372.500000 0] endobj 4225 0 obj [213 /XYZ 37.5000000 224.750000 0] endobj 4226 0 obj [213 /XYZ 37.5000000 224.750000 0] endobj 4227 0 obj << /Type /Annot /Subtype /Link /Rect [328.500000 659.750000 391.500000 666.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_director_subclass >> endobj 4228 0 obj << /Type /Annot /Subtype /Link /Rect [279 432.500000 331.500000 439.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_director_foobargo_class >> endobj 4229 0 obj << /Type /Annot /Subtype /Link /Rect [279 233.750000 331.500000 240.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_director_foobargo_class >> endobj 4230 0 obj << /Type /Annot /Subtype /Link /Rect [43.5000000 203 142.500000 209.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_director_ctor_dtor >> endobj 4220 0 obj << /Type /Page /Parent 2 0 R /Contents 4231 0 R /Resources 4233 0 R /Annots 4234 0 R /MediaBox [0 0 595 842] >> endobj 4233 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1409 1409 0 R /F8 8 0 R >> /XObject << >> >> endobj 4234 0 obj [ 4227 0 R 4228 0 R 4229 0 R 4230 0 R ] endobj 4231 0 obj << /Length 4232 0 R /Filter /FlateDecode >> stream xœí]IÏ㸽ûWø ‘Ô ¦·9ht993YLéä¿Û’ýÙ”%>)Jæ4fºçSKÜjcÕ«ª~÷å/û¿ÿwÿÃû/ÿÞÿ4üþþË®84UÑÿ³?ýúõít{þ¼oÚjÿÓ·Ý÷ý÷ÝçÝçã¿ïú¾¼ÿÃñOÿÛëýïÿþsÿ§?øóð—NáÛ®QÍñ÷_οw:þ©¸þ~úù?vüÕþ_§/^†&sÿÿ¿ÖEÝjsšÆÄÐßw—eªó¯ÿþô¯ÝýøR*S—õ^•¦Ü«®Ôûÿüu÷·ã—χ®Tª©Ë¦xf FŸFjšj¯twü’1£Î¿„>àã]Ñ„ûøyæâ»ry~RJÓÝ×'ªôÿšná×à;ª€Oú¯™CUÖms7ƒƒ×S˜~œ·Ôp |ÒÚÁ3ùx~RŒnÕÌçˆ?gv6&¸%ª­î¹ƒYðd1ez,£‚|%ÂýŠ?~= Öçd¢* $Mk,¹¨‹A.ž§w·5zRÀ'æGøÎ'øä#|Òú?ÁëqŒóab*ª®³NDŽИUaSAA–”+SZ‹(ߤ ÉÒñŽö'3†/‘ÖMû˜1æ) =;>ï¡J¡’Àf™Ã`ƒS2X×1F+þÚhéØ"e óEt/°AY+ÄžˆÆ„ˆo5Ž=Ÿºd÷NW6»cJûÑÞ:lšI°®C2g6ÿFEÙýÌ-/ÃAá.•õ°³…ÄÔÁîƒbnПfK RCÙî!Ye÷Ü|e)¢d¥—0ácžg„}zwb†ðñ¬ô ª)åÕ¿ª >ÅV=Ã}¼epi­½4fšølðF9l_QCSØÞc Z,û[–R—MxÛ·ËÖ /ÍxâsKÂWµoÿ@} ôX$ïNRÙÈ[Üø†ß±`m`£æS £3˜S‡ãD¾è„÷Ü5E6ZÒ©/k´¤tmlRߊ9ŒÉÈš€¹{{hùÀ^¸° Œ|å D(6›p WÆóÂPŒ„þ¡ðP£ua*#\þº§UêFÝE=TÆXÙsµ¤Bª›r£ É>øÒD5—s\ †ÛgùóÙH”@ô6K±³]²H˜H4ªƒÇ±˜˜1|0ÑžEFÎyØF\®ªêlÿÜ¡‘¯O²öñ¹GAz•qkŠ\ ˆŽ0 )¿-“‰ŠH¨9‚ëPu“ÔÊ„5d&†0&u|ÞØUÜþ„Í10|‡¶Dfn„/ë‘Ün}ÒT (;ŒÖ–ðHà>±ÊûžðedùSÈ·:¡[]ñ?åò”5Ç„!¸¢ɈDf¥”‰-êèZcH$hnKgká-["Üyªò2™'ä¯ÀdZXçÁžL7^!6Ü8†ò ŽäzGõ4[ô9puk?¼ }6ª¨íýˆk焭ꡌ½<\Õc „GOÞ£'¸B‡Æ_ƒõ> <7<\=Wõ *Ž8f€g +àÝ _ Ä#yÄ@” í`&g_¤$qãb¦´Æ#!Ub=»‹[§²aÜ/ŒDM¹{Ëys`"Æc,RGh<ÇXY²)1ós'³ÕÃ{­V–P•­F¸5Ó1‘óUÛêÈAö}âcÊnúbVmÑN¶Ææ÷#žæU˜a£÷¨GloàH!˜v*ø5wƒ÷Ó®¹ Ç1bŽ•\«›éuÃ')W!Ýš بBô’xßé‡gÊú2*^æ&‚3ð™à¯%"_êj£ò%óc2üØ–÷ü>\Ô™k|mùpÑÍd`¸èjïxx&oÌ0ýÈç6…xx4Χà—&ÕÚ{ Ò*‚÷äQiÿØi/R@„çˆaÒLLE´PÜòèÇÜàî0!á8/M øi· ˜CzaCÔºd«¶övžÒ—GÏÉ—tPäak`-_Ñ'‹ËßLS¨9²hB´• ÙÍÃhKk 㘙È,Ηc8Õ£‚h"ëbmv¢ÉͰ-[d$¬ò›­›²2çC9á q Û‹äGnÁíWµqI>/aòyš·N5Àn6—©Š¸Ó6"êFÄ)Ò™‰p§å‚T¹*åJö|#9à"É›2ÅB$23…‹dóõC–ÒœžT€ÙÕ“µLÖ2‰ïùV´ÌbY÷"·Ïôë&ʼn›ÊÖ7NAáú(±:Ë^ù"ygRq«{±£x9S—±c!(bÙo"=‹eM‡°:Z¼®i¦ @ö˜²L½K\ÕžêB[J½ƒ©,ª«ü˜J!•ºá2Rö²b;o¤™eà'±ŒÅùf…c²D_'&f·Ò:•pY×Qö"ÈF±„ûeІ×È5`¥[[&CwŸ¨ªÊZD.èçšÁFë¥d“¦±Iº½2èÊÃVi⿊ `Ë[0‘(¬¨ïZûʶ5á¼Ñ“a³–ÊÙÒ™ê–Ȕŭ^ã¸9Æê‰Ê\šWhkËFùdiaEëÅÖdÉš%kOº(-š¬Â­ÉcgQøk8ÅþÍÄ ŠcJk§÷ü—#PHÓûþuQßSì#ŒΨ‡‡ñƒ5âEn"Pœ ®…àx‡Aá茵¹æ5úìž›ò?g€k!(XsÁ±Ò„EU‰ëNàS ðSJ$°PJÄÜ(:k ÏGvÖr-:gÈN]MÎÇñK;Bvfž Ä3q(©,/;"vÏš1j«'ió-–ßL&¦ß)ЯfGc–­l}dIÕú0„Þ”=,w˜¹ ï5–£xxWKÃf2…zÂf*° ˜zguúº§õ¸¹ö×ËzÜÉëYg=žõx"z\vG³¬Çß’˜·¨Ç»‹W<¦/ÍÅ °¼—­1œ²,ž >—6[Û4$Ô ñó„„µV Ìg„»‚3ȶo¶}S—(›³}1ÏÅ´š«/ñX”¬´ËÝ\3Èœ‘ÓE}[F,)f†tèžòº«Ã÷8YYÃH”ÉD9“J͘éjoЕîĵàr¸j¯AôH%à=ŠúDý29*ÛÀ;—°G¥0°>pݶXåmÖ‡j6EeszÂæã:‰€wî´µ‡‹ã#d™Æ^4NZŠ$®¢õPat…h?)J0HO4‘G6—Ì‘TB4ב-×ÿDêØ™!o9NÚž«y¬ªæ³j]·6«Æ*¢©Â ’“‰†’ùþÅWeÐS˜S؉PÎtRNïÛµG»áæ¿ì¾8ÔE=sšÂ=ñÊVÔVQË£sNŒ&‡¼t-¿]¹ÐÁREk»CÖX ìER©²^ÑMrkŽt ÂOž8ŸÜf´­ñek¨Q‚ÁZ™ÖÁ OìhÈîÚXtcÌÆs±V?”OA¶èËÔíôéæQw¯˜)JEð„LÓ ÑrûÌÁ9XaK¤º²5T¶t\3X6o×­oÛñlW´Çjx— !!ËUD‰%«TQ¯éækˆ:\Ó.UÚW°^NU){Шm‰ÃÃÙêòzî!àlQ€ÚZÃÖp×¹[¢/YkS[4­ÞmÜ !F<.ñ/ƒ¯’-Ûþª¦X5@;o¤CÎe̹Œ‰[äÙCpPƶÿbùÀÇ* nìÔÅ‘v„xÉxG¬vd[dø.ÇÁ1†ãÁ~˜H^øÉ¦·¡]¥Ê 5+Ô¬P7¡P/>¡zUzŽöó×Ee„ŒÖŤ{¸¤[!êÚ'Ž"ê²™ÔÅ!]XCW•6\ßM[·¥µˆ\aÃ5ƒ¬.]3HS]Vº²U"‰_Dm…VÇLgZ"³‘É_ôY†h*u%N4êCnjd#fÊv°=8!p@Žq˜†¶¶ÙEµµ_(ÒãþZŸ]Øu¶ÎÌ–kiZ>J™‘ˆ€Æ1öbyG¯ÃtÁ_›ïÃÍHÌj§Ù+ûp³7‹æ”E³©››E*ËMÉ#’ o W„§ éÅomy.ìÈ%Ì]X‘l¤>lœqž;.F±ÂL´_»= Æ#L™Œ“¯ä!RBÏqôQ¢BžÙ‚ÅP3ó‰™ò¬xgƒÔ6]QÚö†ˆC ÈŠD‚j%rAyð 3%‰ºH ¸ ×Y«¿é?÷_[?Û ÂO|J^†¬¶*e°¬ÉgãcQDª¨,+ºž`‰ð०˜ÞÜœž»ÝäïÀ%}Elå´ —”°1²rN@9Ë–‹MæàGIe)˜”Ýã“mBâ¢ÊÖVÅKS<³]ÞÎHiCUwK\'ñ^P KbÁ»DkídØ”p¦tüö1=³º/„Q݉¼Q²k“0¸Sÿ”À ëbX³qÌàb|Œr3À÷É ªÊƒVÖe~mà Œ™}°ž«6^éGø¤ -‡;F[\ˆ_×HÔ8b%±Â¼ Ÿ\Þ\\f¿L Ë2ï©ËÂüâ±² ¤\T±,CƇyO´,]ší˶¶T##dzh11>&“•À•uª¼d|ÓBîä#¿ÒE QåMÂVAü/€Ö|4‘h+•²Âz}ð²®U¶JM8BñD“˜GO¶Ó©W)Û2Úœr^¥!´•®ûøláÀåÇ’®é+µUuaeº$j9âp§&zÙ8´Œ…Ó›‡½ á( Æý|ð8PAà}“Uxªƒ;^㹉©ŽœÑ”“óqPÆ„Ïàq0Pκ„ô‚M ~ ?af€ßaÆIÙ¬[5ðdyÃRH ±ˆÕ Yә˨±Zve{z¨|ØÔ¼ÅÜ;I_6]¬Ržß(vseÇñ=¾Å‚U|‚ËÂ;Æùà¿£)#[ƒìAÐðÍTøš¨(å¸g3Õ»¦\‹!Ñt•¶öp#UÐlÔî '¦Ö“Ø?ÄnW@ãv3(&íÙYÑLì@:Zã MóªCÑ™{2€)ù¬ëⱇÇIdÜùTd$”(Ô…©»è8ºã¡/’„§«ãˆ–F͸ÅŰæáQË^ •VÊöf$ìØ›,òè ¼¯¤{½¸—êv’Û·Ö3Dؼd¬þ5ƒ¹Bj¥®¶©r‘hÇ×0ù`èÀ'[S{Ü" p<^¬bmóqiƒñU¡¯‰[P‚ãP øa?¦#@Æè*ì ƒãhrÏ5r€Ä-º­…j)PÆâ¡ZYPœx0—ª(§çó:0憶<˜esñÐ,ñãIüHÒ›±±ïÛÇøýGªVÝeÔH€žJ© ^1ˆ#ïIt¬›2ãsß\½4p²^!<7ìšg*ÌâXO*É]ae‹)*›ÓV””³;¸{ÚtÚÚÃÅ3:#$Š›Æ^tvÊGsÊS‚yM5ÕÌ¦ŠœÄ~fÈ[ŽSw×ÿd«ªù¬Z׭ͪ‹çæ ŸÈ*3™ºæ!;•xU=…©1…åL'Õáôþ·]{´n~ðËî‹C]„Ñ3§)Üo¬šw•ºæ1®´æ×{ÃhµË•z\‡ V©h›×~N\Uó%\éÇ€c?ÅwW݃µõ;Š«îá:yø ^iÞ í‹h²‹[¢»&w\=ÂÌ D/l#Œ'´o¬v²Ð”­ÕÍ÷.m3­Ó,sæ˜zP麮npRéaxõ4Ð=³&gïX{qò†”öæÄ¶wLQZÛ–€¡Jœ`Z±2íW„Û!Ëb¿¤Hg°HÝœr«+Ê…±Õ¬/Šv ¾cœž6…²5ÄÈ&”u‘ÊšLL8-ÁŽß"´ð9‰&[PED—d“xEî a*+[ª×ë¦ìì1³;iûî¤ù÷1ªžA¤Þ“ 3¼RÆÅ-È&Ú()Y:ÊcŽël`Ëôÿ ®ùÚ`ôœ / [ð)hÊpjXuQ÷`C‰œ†~屘úv‹¥Ýˆ¦©šaé¹ø£!QåUÖà Šg:5-¶öÇîÞg²°VÕP‹7nBz}6¶’\ÆnŠàË3p‰¯s¢ÌŒ³Q˜²ÕD—Ç-ÖH.ûdâ6s;ßêžoŶ@ÊfkÖ¬n‡ÿvž¨ÌI ød\înc`ˆU•Îx¸.{+õTƲçd]Ù[)gÐÕ­—'‰5=ÞÍXFfsVU¾A¤cuSZŒ_ăÁV™i… ‹trõ ¦6ªn·(l<¬I#E*úEñ,Ñ“dÕÕOws4µÍk.bs§ŒµS [<ÑúV‰R«*ðÁéXwÅåþ[ê/aJ}¿ÐÐ e¡£Á*°ËV§ªÆ½"ëÁ;JÔ’¦N;bE{S«Éù¬“.W]{<ÎÙ·Ó'ìxÂôTÁMˆŽÎÙ™.ÃÐ¥Wû˜5äM×=CËxWÙi‡ÑÉiœc©®7]1oÓŒQ«:[Ïa¬’®bõÂýp©–†uV6Õ4½dël“ÖYÙ]D”„•¹ÜzSîªÈt´Á½ÅøˆNŒ[“ßL'¹|7àÎgÕR‘±)“Õ¼UõŒ_×Xžþ7W#ósüK#ã.w™"ÒAD@Õ\G½±ƒ¿öߟwŽþyê/Ìþµ Ú|8’Èq_öú «ì#›´ý7\=èKŸ„eÖã'Ã.èÀˆ¹9É~âÐ8f –ñhnŸ†•¢rœ8æ^¾M©€“UÃÒG òÑçqO’-Cá¯Áw†X¥òZzóF¶,Áþ|œñeæÑX àw0 í)0áÑÞá]Å=S • í8fÇÞÁ{€)SVk±ƒ lŽq¬ëbHƒ ~çÝ0û¡óÈœ'xnCrÎ#aO¯ n‡·JÛÂd,Ï6…9 ò~ó* R·šoJëí?ïþ F~ endstream endobj 4232 0 obj 6503 endobj 4236 0 obj [214 /XYZ 37.5000000 314.750000 0] endobj 4237 0 obj [214 /XYZ 37.5000000 314.750000 0] endobj 4238 0 obj [214 /XYZ 37.5000000 627.500000 0] endobj 4239 0 obj [214 /XYZ 37.5000000 627.500000 0] endobj 4240 0 obj << /Type /Annot /Subtype /Link /Rect [279 665.750000 331.500000 672.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_director_foobargo_class >> endobj 4241 0 obj << /Type /Annot /Subtype /Link /Rect [116.250000 605.750000 203.250000 612.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_class_memory >> endobj 4242 0 obj << /Type /Annot /Subtype /Link /Rect [111 323 196.500000 329.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_class_memory >> endobj 4235 0 obj << /Type /Page /Parent 2 0 R /Contents 4243 0 R /Resources 4245 0 R /Annots 4246 0 R /MediaBox [0 0 595 842] >> endobj 4245 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 4246 0 obj [ 4240 0 R 4241 0 R 4242 0 R ] endobj 4243 0 obj << /Length 4244 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯ès€m‹¤žÀ"€íñÈ!€a99»Ù‹ÝEœ=äï§{$õÌPý•¤¯‹Ôc#gd‰d±ê««ŠïþôåÇý~|÷ñËŽ?t??~9d§ªÈÚÿ/¾{ù [Ÿº¿«º8þðëáÛñÛáóáóù¿Ú¾|üËùoÿ;ÚãŸÏÿýùø·¿Ÿùc÷.ÿà×CeªóÏ_ž~6•9ÿ-»þ¼üþ߇¿þáøÛå‹ýpÝd^ÿÿïlVUM~™ÆÈÐßý2ÍÓŸßøíð®%À¼QrSu}4¹Ë¦Éíñ¿ÿ<üt ÿ|vjrcª2¯²{ªìe$—5Gc›ìX”ù` §?:Ÿ7>^ŸûøÓÌÕ©b\iä¯+nni²¢%µµ>‰ž?€þ¥sá6·¹:UºÍ¾®¹¹yOý˨ú$ÊCnnUüøÓÌÕ©Òo.þºææ6¦ÇMW… Ñó÷õ?^Û:ÜÇۙ듥ßÞáç?Ïù ž‹h=|^üðõðîÑä…Q¿þtžÝÓ˜í¯g²ÇïÎ¥´æøõÇã÷Yf>üñøõçCs*mÑO±}báSÃwøNŽž8ß3p%z’½‡Oà¬ñÜl5nñÄðOðÉGø5HQ<i€©cì|Z;¼ÒmÒ ¾ÃPÔáqžž|úz†˜àèP4«A›Áw0À'‰ûDîÛuFå,Ž4Uõ8’Â'刯a9ƒXŽ¿VÀ‹µ0–gÈXÒ…w eXŸaêÀ`tتÀëÁs3„dÀVÒ#±Ò#JŸÖ%\©°?˜ᬱ¦Äã¬Ävhª;ÐŽ±øc¡®%’cþÇ{µ#‡á$A6±Ì$I'é„-„­…ÎRŒ‚ÕåiT[(#bÚØ¨q'gks~ä#æ­wZ.s§"/ëjâds8YfðóÞ[ºÁÿ4ÒÒs—XÀq*H.×ñdM˜ÃÏS2ï„¥CN¹CHÂb‹Ë _ÒW¬XS(S3k ëÑp¾ œŽ9£öArð 5ÞÂUþ¢¡”Å‚+<Ž e” 4 ;ƒuÆ Œ4pn0X! ü¼ƒĄ̀I[Ãe`ƒÏ깡Û<ê0i›®E¸ÄÂØ}­+|±Û—©ê:`£À %žÑ7 tƼüÅ¥Q`˜=¸ ôz¨raÕ •Úf*Ð6¦áæaGˆäq^òXç¬ÜÊÊç¥ØM'ó¶¸ÿ¥¤G #aÁžÃe*¸Ã ‹R01áýEDRÓßeÊÿm‰¼?ÊNÑ=·cÊ,Š©êŸ€-TqAÊ1«ã˜~0LeO¶² #‰®VË÷‘§àŸXéh3À°‰(Ménëó[µ0ÄsB5®¬Á×Tâ´|!“¯g-¤Âà«ô0up LíÁãXøµÑKæÃv½-'›Œ*½Àa£‡¯7Iok}GJ`|+BoØJA»R¶-Ê‹R‰¥•pÌôï㇡ÛfÒÏ1ÎWœ°6ÃQº¶Ó]™5ׯ%—sÍ5]ÎÐMª¦'Ùé: èOжɵUŒa1ǯÜ"ʬ¹Åáâ@{G¯ euJ•õd(U€*ƒ¼ñ £ÅÕNXN9Á¾“ŠÀèmK¹Ò¸úõ|n9ðø&n|"Œ‰XgA© ÁzT›M¦åÖ2EÿóA7àL´ÀcqÌws®Q‰'2|±x¸-ê•äý¥Îu™ï4á4œåm¼%¦¦ò¦˜…ïùŠ ß7Í!óÒŸRQñ_ÞUTœüIik/Î).®eÀË#a*(L… ÇâXÒÖºØyWÑwj² ™‰ÃIׂڨº¿çÅÔd >Uj"Î`Ú ¼Ϥ ÉbOûZeÓÖÆ´[O"Ú¥í#¨ËÛ¾©Hj²KIÑ$:ä÷ıSà ‘:©aEjXñ}jX!K}jXÑ!q]D¶Ó2|ZDìI,Ovo§ð‚—,¸hæ^]™‹éùUY>¾,Ï©§ÅÛëi1Ë·‰¥s^Ï›‰œ |ÍÄ. ë’‰¸®yö¦ÁbF *{Wu"j&ä<±1ŒÄ‘-ì8»•ëŸYÔ¢VMVÊá|BiJ¤Î@Bƒ9ÜY„©ËR½âoô:Ù°LeòÂÛâd)Џ¼OK1d妫osX°+ßu[Ì(62œ×z/#lîª <¯r_—a8[ÞÔÆ¦",ŒŸàãXaœ1ày3ª™3TÃÙéU΂!‚Ád©¦7Øþ&;£X›© Õí@—º Î"a÷2öõŒÖ¢T‹2ÝÎPÛÓwMáë»Mµ„ì#”93ÝB]Øâ eîðóT—Hê†*Û'ì¦ÇhSÌðÍßa7*J»ÌhB9Ÿ#±ZÃ9ø>þá#|µ©Æ«EŠ®¤Žu ªY º¶• “ÊÊ\w ç´ª‹e êZqÁì®—;j^íhû›I¬`¦³‚µÆc…ÎY6¦ßñg¤è.×-{“·>dúzëFìçtˆbzb1f^C^#^á¯åy3äù ë>qn}º¼Öç‘_üâ—à ©­Â×[ºåuÕ‹1}!`´ÿ@>™Ú‚ÅE´"c\d& !œ}E:—›ÝÑÇ,l  t@JÒá^:ÜSÁÄÚºÛÜÇ´¾|bM?o?"Œ eÍ+™fŒ”V´¾KCcfX˜7ð<°†²ª}µDœ¹éQÔ¯‡œG–Š@øNÇ…óÞÁ^[ †2Ú«¬A2R½&?Yã¥ÛXôNÇh·¨ó8b‘ß2Fà;x¥ö®¯>±¢›€`­–=Ù"eìiàyâ¹5áÅ¢ôäÓÝ1a”H|„y¢Fl[ÎÓPíÔöj,ÒØô[å`.¡nÃÞá™ Ó[÷‚Æ)[üÚ'ªg:a•QG!:n¾˜¢ë¾ÿB"Vœ`¿ä ­ëÎ+¥ÖîÄx@˜²C7Ge&8y0^¬[b¦§~ÆìXÝ\;ÄéÖÿoZÔçÕ‡àPS—LT IŽ˜ÖD‡]¡6ˆéZ Z“¶É£{«÷¢8s˜âq`Ÿ3¦›Ð‹rg]VuÑ’é–ÂÔ¿ p˜î<ªýZ(îU퉒Ŵ0*ÄÂzbLcô!¡ùŽ¥êL±le ¦1Ç]Ì›ò='˜Ö›Äè·c-àõÍX%D¿Tª×!õÊ=p ¶³nhŒ×%¬”é3ˆ‘ãËߨ³f]+zDYIÇ ö“ª¥¸ŠnúUvWé5óå¦mÀ8{W÷àÔ¹ê òå­YÝ™‡—Ëò^ÆTÜä] A³×>º{mVæÚMÙbÆþ ÷e,sܧž‰} )‹ÚÕé~ß³Á^Ck"~£|œ^)u2€cÀØ.Áã0… Ëß:”Î’wgÅŒŠ˜k7Êå£"oñÓ±£|Yšq~IhµË8†©¯‰è3Xsœ-~«ëò]Þ…s!âÆ¨å¥Žò S-¡"©E•oލy­»'Š¼æ¦¬éNÉ$ÏúòK# w¶%>Øã½•-ú3¨vpÓßS¥;Ïu3×ÓÙyXq”“9âàLÕ“£ÌÄfŠbÞab9o‡ãSýZª_KvÍØ8Ïœ s:ÏXÊè k„“OÌc vú=ÓÍÍVµ ™¾u¯e¡hÍÔ-¸!œ0aºÁYãSCøÆ:]¾JMמԭ8S­ßê–>ˆ„BûI<¦(ScIp¼P}©‹<ïı#\˜ÞXƒQTÄè jãëVrQçXŒg¯kýÔѭ˧2ö¿€˜õÛéé \¿ÇH#c³éö3ˆ¥w;Ý›—¤ËL]]ê’±3ކ\+>=ñÕu¦),åƒ}Oæƒí Ÿ‚T¢Í“ѼôéPJ»âxs¾<>aÄßdäqoX“ºCÜe1:¾º[‚Ë1åÌHc.$g¾1^FÊîßÖ¨ž7D‹lÓ^¼Ö&eàs½ýÓÝ=r¿ãØu>:ÓX6A4Šå·ÞÓ[”ÊyßY\)f ¢ÈÜ2Ãä%{Pä±`=ÛÎŽßÎ,#rÔç±0áàúæÀÆÎ[ržáÑæ¯å©è¯ê`Juã*ÙVŸØ÷Û·œpãæû.+Èžº[Ê_P®Á­›wÐ8]ƾéýÖÜ»•.JÏð]óm|/žR'kº¥Ø1À­ÏWðIŽ–að×à;ò4³–þY†»üý<ã~æŸÐX àw0 ¸2;fLUH;Ì%€Üap[Ãw0 0cΪ=1Ê—a]H ü·nöee^Ã~‚çf?B°€;ˆé×¥Îz"¢ÆËë°X™­2wêð~šðx¹}¥ùÆ´ÞñóáÿköëŠ endstream endobj 4244 0 obj 5268 endobj 4248 0 obj [215 /XYZ 38.2500000 286.250000 0] endobj 4249 0 obj [215 /XYZ 38.2500000 286.250000 0] endobj 4250 0 obj << /Type /Annot /Subtype /Link /Rect [196.500000 293.750000 272.250000 300.500000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://github.com/swig/swig/tree/master/Examples/go/director) >> >> endobj 4247 0 obj << /Type /Page /Parent 2 0 R /Contents 4251 0 R /Resources 4253 0 R /Annots 4254 0 R /MediaBox [0 0 595 842] >> endobj 4253 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 4254 0 obj [ 4250 0 R ] endobj 4251 0 obj << /Length 4252 0 R /Filter /FlateDecode >> stream xœí]Mܸ½Ï¯ès€©/XXÛë90l ‡ ‡`“MŒqö¿Ÿn‰R“%>ªU*±Õ3Š‘µZ²Ä⫟ŠÔ÷øü·Ó?;}ÿþóN?»¿ß~*žÛºèÿwºüùÎ?¡Í³;>µ¦>ýüõéÛéÛÓ§§Oçÿ~{êoøüþOç£ÿôéçÿÿûô—¿žOþÝý£Ë?øúÔªöü÷K÷·mÕù¨ÿ¾œÿ×ÓŸwúõòÄ¡9'Løû;]˜¶éĘiúÛÓÐMÕýùíç_Ÿ¾ïXÖJ¥Úº,Nª*«“²•>ý÷O¿œ_<ÛJ©¶©ÚbMC­>·ÔXeOJÛó“Ê38´¥îÐóån´Ùîá½äò°¨²Q3Ô¯)ÏöÓAT·(`|úÚ-­ÙðáÉ¥AqºÅ—ÔlU«]m¡Úññ[ ßØv»‡w’‹£2è?]R¹çápC·Ÿ¾ü¦h¶{x'ùVn ~¾QÙ¦hMý¦õ9s)ÊsÒ¸fÏ9‡Òãr¾êîxn½¤'¿xí«Vו=7ÃöÇ Ê^[ìıç–úöü#O”ø½T>}³¨ï¼ qØ¿úçc¸ô #­RòºYy òÏ×çFŒ%'lpÇ xÒJuéS«ê¸TªqB\jOþÞ£NÚèå÷Ö½| NL1ò›¨t HV…àt¿ëÎjõõèj¿žá­ëà°¾NêPœ_ˆé‰Ú—*ö$yzÕ€Æ,°IÈ}íæQò¾jWÊÃΓdâZmÜdýó¶¿ñ…>i}øÑ†ˆ3’®ÙéoçùÝÁf¨øÍŽ­uú‡!ziæPé„@Ú[ëR8ý±LrâjÓ­s¢ÕàØ@'N¿÷~³ø<ñõÕ¶À(ƒ¶b©©ˆÀBÐw±e).EJù”¶Wñüó%4åhÕö*EüIëNUÄ¥ª”âzPxÒèð÷ÖuBÐF;o ÑK…¦ùÍNTºÖÁ|p.¿Ë1î” ÷äo• ?¾å\Úè@ð…˜ž(|©bO’©W hÌ‹‘„lP‹Ió(ù _µ+åa•¦®¥ã&럷ý/ôIëÃO]qê2lvúÛy~½š,H¡â7;¶ÖéO†8èa¤™C¥io­KuàôÄ2ɉ«MkçD«Á±NœuoŸ'¾¾ÚvXeÐV,5Xú.¶,Å¥c¢H)ŸªwQS~§øµ ¿Ó~§(‹ë¡Vš ø„QÓDíT¼1DD/ašbT~§–àwjB]Ô#¿SS~§&d…¾÷6„ßi(Q1=¨)KŠÔP~ ±dƒ‚\LšG©¦üÎjã <‰2 àwÂï4”Øh$ø–ò;-a.¦¿ç·’üΕ–ð;c³ò0ÄA#Í* åwA~§ˆŒ†ò; àwšÈX Ž tâäh_Ï__m;,-àw&ÍÊÁBÐw±e).MS¤”Oµ€»04ҘѪyÑ ò;ð;v ,®„Zño‘U‘F;o ÑK…¦µ€ß1q§%Ô…㎙X8!+¤àð½×·œK–Ó€Z‘²¤H–ò;Hˆ­ äbÒôõõ¶ãÃ*ƒ¶b©©ˆÀBÐïcËR\z1&Šò)jS ­ß1CýŽÅ)F°~Ç€ú3”¤x!µb6¨ß õ;!¶†ˆè%ŒBSŒ@ýŽ‘¨ß1¤4ÅŒõ;†ÖïRŒ"‡ïΤ~ÇÐB”ȉ8µ"fI1hýb+ȹ˜4­ßYo<'µÔµâüŽ!õ;†®‰úCëw ©L‰üvž/Y¿3E…Ôï\›•‡!ziæP¡õ;F°~Ç …*†ÖïÐW›vDÆzpl '¨GIœ'¾.Q¿s…ÔïL›•ƒ… ïbËR\Æú1s \(Î]Z¿cÊѪãä…¬ß1 ~Ç %)ÞAH­˜ êw FCýÎDˆ­!"z £Ð#P¿c$êw )M1cýŽ¡õ;†£ˆÁá{/©ß1´%r"N­ˆYR $Z¿…Ø ²AA.&Í£DëwÖOàI”Éõ;†ÔïZ¸b$êw ­ß1¤2%òÛy¾dýÎR¿smV†8èa¤™C…ÖïÁú3ªZ¿CO\mÚëÁ±Nœ %qžøºDýÎP¿3mV‚¾‹-KqëwÄÌ%p!À]Ðú3ÔïPœbëwL[qZþýí<¿•œv"pZÂ猭o QH~æ0e6ÚévclˆBÂð3‡‘/ÄD³+ý,€ªû=0ãÑÕÐ=9Â[å¢vÔK‚/>OâÃjƒŠ¡¨†6fáHb5hÆÅ¤¥(ùb\•|èÓ’Ý¡Fé'[L%7„ü–¸ñÝ—§ï?ªª°'Õœ¾ürRÝ¿ø®ÿëË×§ó,÷»Ë.Uuúò÷ÓE¡ªßŸ¾üûÉ>7ºDœ»RÔ˯$ÚÑðÊ;†l?Á{ÚåW ¯@©÷àþ˜åý)>.GGËʆ¯`tÞCÙ  ©q;ðiXŽUá§?.ïiñÊÖ0ôƒÑ÷$0PËÑ)q;¸?P‚ßùÂÁê{= ŽlXÛPsX {*ë%;À=ÅRårÍ%â#*ã+NꟾœÓ‡ÍGþ¦ÜÍÈÏ?8qÛÎ q·#lÿ7NÆÄˆ ûÇÙ\¦È•h¢Ã‰Ñ‰‘_…“ ŒÜƒe;ØFqÎè'zspKds¢Ù¬—`mmÆÑÈèÁ?äkµÑ#>xÎÁ˜a‹Kä´8/á̰•bßÊ9÷pf~xbÄË’}w17€{Šs;l‰Xjü4Æ,¡‚WðœP–ÀRs؉’‘{ËêÇŽlÂXã8ŠÛaÌWËwÇœÒîfÞUa{Á¶Ì˜ÁäâíŽÈ•ô&ÙÈ%‹µhöÎá^XLh¦ùjÂB0²sŽÏ s”G"»Q7D¨ûWÔËÖr3êhXuóœj3ß¾cÏxm¹oÂp8ó@üF†‘Ç&F#<×e…kYwü~‡õfî¨ðLñ€¶\´ú¡-1O¡÷S'²ƒÊpÎXÀ¨^stÿøô,ëýW±"1ã}bÙñ}nþž'¦U«ÞšËÆ´Ã÷?s½KÌ5×ã¬Ä]³—kír¢§¢«õõ˜[cäl‰õ΢sdÖÛ&Œ~ÁÙAöÝŠìš°L+AÔyòˆ¦íC¶<‚ó.ÛôMáú2Ù] ð¬‰ã›x4âø™è¾)%Œ¸‘S›ø,HìŠh6'v ¯ÅíàÑ5WÄ?ö7:ö7ºÅÞòŒÈ¦Ùψ|ìÑôúøÒ×¹ÓÔ³œÝé8ûŸãè";ºb‹çÔSîx¬…Œß-4E½Ÿµ?²»¢±Fþ\5È™ö`Ì5‚±xLÎW%ðÓÚÂX‹¾kJ0<²ûÐ0Þ%d»û÷3뎜úÃÇ\£Ê‰½œ]=S¦<5Ùw¼)Ú­bTÙ ïkÈáͱUp*³8_:àŒS3Ø›þ̪ݖ]¯eÔÇqößMÌÛ\V¢§œ}ö`+¥rÃL»O%$Øq†Îád³Æc•yæñÝîg®-–ÝÅ•Ãü!&{:cÅFÂk±æD9¯\» æ²Dáµ½ aìŒ%»çâƒf§²Ì½èzmÙÊ`V})Ñ=³{‰þYò¥V­•å v¼‚7ÇÏ£+Ö{ñfœzÆè*¼« Ž(ŒÙ3kŸ:†ËÎÒ±×çÚ-óþ9¨°ÏåÛ»À¨rÍjÞƒµ.ÖZ|^€W¿æZ•T2F–ׯ{$ìúîñö1Ù§×¶† ãºr£êUëÊò뢛D»<Új‡ïoæ\Ÿ¦‹a}šðJyÆè¶çš8Ö—`d+68_¼”Ý}“2통ÞúÈÄLœio¯¡Ï9×z\Æà[d¿[}¼cNúf¦¯`Ëæ€ogöÊúzxÆ·@ºZ³æCxfpÌô™~:㘓ÐÍPa-7«DMVE×d©URÏuÕ˜¶žÀfž-:|®WzpªçªlëÐÜ xO¯¸ú¹ÔF…WZx”À…Ø=ï‘lÎÍ ÝHÛûS9 uK7œ¯/¶„@ºÌ-=†tβó,)Ñ…¦ºãx(Ë?獵ÆŸ²jˆ~±ùªÞÒU9¸áªÐ”0y蟬0ƒ# @ÕOù™³˜+Œ6W‚ÍyA%ÛŸ}º¶«r4!Š´M}«5'F5lÍ%m°³@wuŠÝƒ™3OFxŒN:^ÓpzN.‰áìf‰y?çQb[”¤±Ãî⸫ˆ±&LbÆ“xÌ„í%|^Ñ7‘:ð´½9÷‘rÓ}Ú•©BÑ—±éŒõy¬•{¯3¤,cú9oïa;²µ‡²ëN÷¬í‡æ§²D”ºê"s²ÂµÖó^‡1e¬g¾ÿîLEF±®Ô¬ß&<ú•}ù›ãѳz\vE6¦dZ/.<•ŸãÖ—É–3Z5óòÈ^yÌ:¾ Úκjø4|…#Aâ‹ ¢{9OJjÙ/ à+÷\¥ÍŸÚ5ß+ÈY¹Ú¨5ÕG^rä%òñòqó’¦\³Û‘—äËK„GxÜŸŒ£NS¯Ù'(ë¨ÓVa«›"7óÊ®ÕÃ`}¼²{%¯ì– UTGÕTØmaY|ö<ƒ•}Gsÿùã>KHjWYwµ‰m6¤Í£¦K0ÑiM9ëB²‰íý«½ …ß>©4ã7µJ˜T '8'•¸X„X¼=e¥gü82âBï¹WL¢aœþH‚'Ù¬lA­~cê‚sWް áØ9ÎÒ£«p;œù©¸ýȬ‚ÈÜŸ¹)¤«!½2$¦»+UñÜ´*\’Ó;¦ªŸ [†ü#Ôo?ü*=\¢CiL#I°G¥‘'Ñ/F dâiØq˜ä“±| &©$ŸëM\MMüb©¡ÚçËý_Ÿš³N½/OŸyÍ6 ÑE„Ð{”ÓhN—ƒÇ ‚û&[ÒäÙ]úl¢Ø•ÖéC6pÑ=ÚÂ{,lçÇÁ?{÷®|DOs¯£šçRiâ JàÐQÏ5 ZÎ#²¹Øi'ÑŸÞ+T5ä“8•?Mk(u?X´Ïå$z•P¶ÞûT38æ ÷` ð=ΗcZ€:-Ĩpè0mA=öͽ$ŠÈ‰52Û·e–Œ%HX ÖoŸ¯¨\¯-¬×$gša²2T¼º‚±B¿a§K¡3ñÕ‰WQ€sÆfÆ ÐpDd¼ÎRbÛåã=gªïA¯{–aù˜9[½=òžàK `çæC/ÇMá&8X9¹–lIôƒYÇe_– _·ß¼Ô™I}C²ˆ;p˜Öv¦U?hà10ðpJŒ3_±MAfUa¶ñr÷ö;–4Õ™´¥Š·ãÿ¯ÅoÒÙ«3T‰‘6‡rv.çç÷w©‡Ñ^nQÄ.{0XÒ88²öËœ{™œC ï.6Æ¢¦Ê¤ýv†÷Gµ¾›Tôêì²Ü4h¼ ÃÙŠ{Øy¼ìäѬoÐÐõÖÑ}šzÞÆ^›c•ÅØ$~ÓÏPh‚0Ë–Iß­o1UãÒ¯Í ÄAÕºžKŒ"©Um9Œ`ìõŒ`þ^b ²ß‹ÊªayŠîWFMîÉ€BcïBý^Ù…Ñ7ê†;o<´ùš[ßy/qu,ÎOd·C`¬±àÄ›„™VA³j”¡q4ìpé . ËóÀþ+qžG$vVðÊ7jѦ&=Øaó’O‰Pn<¤%îYPÝËiøŽ Oª²¢>SÂÊ(`åÌY{qˆ˜žì%œn0¬sZ±`dx%{í0r¶ì¸{RÁª¤–õZßᦢT¤ÙسÙ-ÖÎo›z™FÑÄ…³ ?ÞæoèÍøÈ’Êñ‘%«Íƒg£¶i÷Ÿ>Ô~j"Ë”d+C8ãüÝ– ²t+ºçìŠSN’°‚/Ùø«ÁZÛxJ74hß{¼eoËbàïüB9]zÝÈçwøÅÜuƒ5Pp¾ÓÀá/dù?ŽÔ²Ä0c ?'¯aΤoî‰_2.øLVVö›y«‘˜ÊËînrû~ÝKŠ’2ä%˜ß¬iØgä\‰$Y–Z°Á„ƒ"šç&&v ú%±Á¦l»n,ÙbánÓ_‘„R”‘ÜÁ¤f‡Œ¤è4[6m[ðí¢\6Äú\ØDÛ2'Ë?µáhflEF³Iôb¥ Œ¹‹Üþ)s¶fü.Ÿ,/¾`c ýÑžº9æþÆ1ÙíZY/Âï¯îX0T}pªlèfòœo.lìŒXØûmb%´@å6_R-Ây'ÀééèºTdÐ’á8±ö!™Ž‡r˜ªdt0ÓΗxì`½?dŒ^‰šÜŸ{¥³Ó/2rt+ûÚP„ŒãLÓ_NH¼Íeì=Â17¼—å½Óê-ßQuIFÔlSŸ½ìÍ!OjmPH×™ÚùÏéÛÙ¦’&÷iîÜ`“&ú™ì³åêÂ@œô˜åÁíB]µ[Ñ{–td¹X¯©ÈB2·Q¬~n&_RÐå? vʹ-&ÛG×Óé&§ÍÌHVÑçùÍ´ƒÎVpr‚4Ò …Ÿïq.¬u½½š-×à.Çg‰É‚#-Ãð=ØJ › Fb‡­ÄU7HHÛqtN쌶`lY†¸A ¨Ç$ú5Г‡”8Àà{†Õ›’_Á²¹<., 1~ ¦äøJb5ü¥›\Ÿm‹òÙÅûÛœWáÚÛxnvPûtúôô-ÿo” endstream endobj 4252 0 obj 6232 endobj 4256 0 obj [216 /XYZ 38.2500000 489.500000 0] endobj 4257 0 obj [216 /XYZ 38.2500000 785 0] endobj 4258 0 obj [216 /XYZ 38.2500000 785 0] endobj 4259 0 obj [216 /XYZ 38.2500000 489.500000 0] endobj 4260 0 obj << /Type /Annot /Subtype /Link /Rect [243.750000 551.750000 329.250000 558.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_adding_additional_code >> endobj 4255 0 obj << /Type /Page /Parent 2 0 R /Contents 4261 0 R /Resources 4263 0 R /Annots 4264 0 R /MediaBox [0 0 595 842] >> endobj 4263 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F8 8 0 R /F9 9 0 R /F1409 1409 0 R >> /XObject << >> >> endobj 4264 0 obj [ 4260 0 R ] endobj 4261 0 obj << /Length 4262 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯ès·ERO``Æ;CÃrr¼Ù‹õ"Îò÷£nQ==’¾’ôu‘Rw+Fbg8â£X/V?¾ÿÓçìÿõûþý‡ÏÿÙõø¼KE–4ÿÙÿ¼»ü-þßû¢Ìö_¿í¾ï¿ï>í>Õÿû}×|ðùÃ_êýoo÷®ÿûËþo¯ø“ÿ¥ã/|Û¦¨ÿþõôwU˜ú_ÉùïãÏÿ½ûëö¿{l‡ó“yûÿßÙ¤*\~œÆÈÐßwí2ÍéÏï_Û½o0o”ÔTia÷&ué¾þ§Ýÿ÷Ÿ»ŸëÚî“C•Säi‘\3P=D=RžÔ#Ù*ÙgEoœÓÞMˆÎ³2`çÇ™kŸ܈kîla’†çÞCÿ(÷á:?Î\›(íÎÂÎ5w¶tžñ«,}ν‡ ~å*„Ó̵‰Òî,ì\sg«2 (³çÞõ‰o“$«²Íqæ¡dv®·³61iLf/z±³65á:?Í<ŒÌ kî¬Ëò†<©Ów¡.ºAý¢ ¦ŽýÌÕ©Òî-î]ssËÔ«Ì̸$:w€þ&(çœf®N•vs{½šÓ žJóp„û.|øüe÷þcíTû/?×3; ØüõåÛÎæûwÇC[Mê/?íHóã÷_~Ù™z†¹Íšù5-I[ŠSKv°yÓtÕ7ö ~S¡oÜsóMz(š¦×oüzÌ!«\qù1§–üàÌi˜‹Xô Óžµ±h¥æÃ©¥8¸*éP'™?·ä¥iÉeÓÝkËG88^©iVúò¥æùëØµöÇò!vM“»f¶lÉñÒ. /LY\.­!nÙ®ù¢Å5-Ý}øUO…¡NÊN'ÂxÍf¦‡ÔÖÈÑ7¶„ßÀÞLó;di^¾e€ µøÍ4îàliÞ°ü&Iá 0 à7Â8:^yLÚL|<0î÷h+ØÁ2öÃY.›iO ¾3Ó‰i.ˆæ§Ù›Àù˜/^ùzö¾ø†X© -x˜™ðJ§s1³t†ïðV ã`îª`aJ=ZL×¼&%™W  ßÑâ½µ|=2`Í ¨¸C©SC¬Ï ¡TÞˆ_Ų;„Âf,¬`L6~/:’dèü n!f¼@,Ä&cv|ògÏïºÀ)˜„–äÜ17K?–q<΂vÓÔ«ìÎÿ¬†… Óaº'ãc-³$&y"d¶§z0¿bZ^ãDô+ŒùRü9ô#hÁÒû¾ªÎ˜àäcµÏøËÿ úE×—ÇsÃ4X<,püë¸ >4Zœÿ¨Û!\—âíÇâAOóŽ`H;œº+0§Æe¦äL5t¢Ì3Œî>Ò••Ümd—ò7£¹—xé˜UO}ƾãŽÏˆ˜©ˆóÞŒÀ=ãîõ×Edæ„ro9Ð8æíõlf8@e‹Ts•›É …ù&cŸÞE8i”¶5#…?ö &E눉ÍïÓt»ƒªQBƶ6~ÂnhTXö „Hýò‡ 8NŸ(„ù|»H'!øXKbÄ,º¸ô4fg•Åö:MÝÒl¾j¼ÿ`ÏJKŠŽ-\>IÅã‰ô“g=ŽHƒ1NÝŒ ›~ª£ z®ãÍ0qÂi’®—¶êlB¤\‹`ÛËJ ‚=¢ÚK8»2‚¼”R&>“ªÄ^íl1 hæ:EèóÄâÁUWh̨§Žåe,¯U“ÔѤ-Vô•ñ±—Hv3T7™‰$1º„bô.QðÑ1}ÑR÷&MÆ/²“ÂÏ]Ö’¨ žVôf¹Ï¨Å—ÃÞ>¢¿ñæc¨·çϯÔàõ¸ù½­™n¶¸—ù½Ý( ð¬+ØùÀaŠÆºÿ—Ÿ¯«¦þšâÀý?ÝpϳgÒ-8wÇ]–F*á‰vQÂ@fjz3Ù!éÞ­ÅþN²m›¦¸ 3JA™3-fZ¦j ;`x+{ÞAD H]«© ~ÅÑbH¿b- ÇÁVA°Ú„îwàÜ,œÛÓ|«€ç&x.Ðãq¸ a嬉È}¹Ýá5{›ºy ú¨ÁJz Çñî Ro+ðtKs®—V-[ ]19bƒª+ ˱ÒúAÁƘ"íð‹àâ0f·`~ -$ÖÙ®”`žÁG,|¼`"ó9 w\c:Ðea6º»'›‹ûÎQŸÕè¶Íu[©ë&È3Ö³sLØW (ÔOznò¸v¨ê_¸åÝÚŽ×Ûñz’¾‚co•§í4U/$ 1y¢o¹Ë‹'ŸBŸÀU3KLq©ý¨± &€—¾\îÄ5㸻 D ]ç;Õ•MÂõÕÕëÞ‰ í*Öª¡jc’BùSàªri>¬@9P3ŠV±3I’ô¼å"}0·ÑTîhQù1¦Ô{»Ë rX´eïKÍ‚u  T‹Í©[ÄaÓ‡»·€C*Ç ÖRò°3]ãØSûXq2w.–t9gÓ{ÃÆL[¬™±Øöp^,ƒUJå‡oòzß½ÜËWÔÆ~f×™›4“¡É1}É9 À‰ÿíñY©ãÂyyùƒ_wŸ‰Þq ŽžQ½K6 7Nœ-¾íÊÄu‰êÕ-D¶ã:dSõp(“M€´ ®Ö¦k)ÈŠࡊ“˜+Àøâý[þholõ;Çgzh^ËûÆz‡z“!Jí¡Ë:Û%„UaØZõɃ¨Z Y™™ÎŽ0ºµ§¿„:mÇ4žPðÁëYyUèmÎC%÷]ÂÒTä¶Ãê _ç½Á‚ò6‚p¡Bp–«{\&‰3b8O„•:6k1E!ñƒ³üAÔ½2†ÉbïâD,Ü0åyƒ·šý­fÿ‡˜5û5÷UÕ8÷­¸f3zɽž¿æi\TµbZ35ËB±”9¦·5ܰµ.lŸtXÒñê°Ý$¤–)Ú¸ä¾5îåÞTƒÑ™Æ[·ÅùEJ›œšàæÅrØÒ=;Xð¾Á¬o< îÐ7%l©Pom°Äš¤üÅ8 ëÃ(¡ÅÁY'è [ð¬½#?°RåY7‚™œ±oø›äŽW*¬'‡ãà=Å…sK‹RYudÉ«°!~Å4„»èÉð©gαs/¾ý+*®Sˆ¼ó‚y8傟[µ•€m?'â¶^îF³q¯2L5gãˆ"$]0jÝb§Èõ(CÁ¾±2ç Ù‘²c^æZò´×Àa^ÎfC>¹>EèÊ % [ÍV@„ûÒ¤|+C3…-ÂãÝ"Ç‚%ÄÅ0_ÆB  ‚°À’‚]eÒ÷ . ¦(žSú„gÀpˆ®ÅPÃ`ýಮóÎâÞš`§ðÜ"Acb[ З¦áÝÆûƒ%‹à*¼RÁ`ü•å±²]…½9µ¬ÿûnϸzªö±¸޲”˜+àÜ(ŸË3ƒßÇ ûÜGyL‹—)3–R(ÏÃå† ¿´f¼Ôâ ôFzÎèªê ª%’Ù<‰û”ÁÀoû”À=| dXUÙ^ÍJãèÛ|B¦€±g‘"B¦`űýUëNBšV ×oóƒí‘‡|äa\«fÉ„yW|=ôÞ8éÞ.g>ÎÎÝß“Nµv°Û‹É›µ3ƒÍÚß²µÏÏ£nÕV÷Zm5ÏÎ@>ð6=_Vaj,˜  nä[°@˜+0a­ Ø„’3ÕŒU€ãBD¤LˆëféŠ9¿-ç-Í€zɇ©*ÂÕnĈn^Z¹¢S‡áx"櫜+%¨#€Ýà]`ªR‰*)±¶77ª/tsÑ‘*)˜óªnùʆÿWà¯0§ELÌ+ò o>ƪ/Xþ}@¹éÜ­Ö9’©cP}/Ǻ¸5¦’ûFw›ñoUÏmÛÎE”ÓˆQ<ËÆ)ÏÄTˆ|Êö–õö–õ™/‹ô ¾|{ÆHÆVÏïԵܣ¹«8²Y¹+dóÞüêyb‡±=Ã;˜·,Œ½†+Ö!ŒC+×>iÓ¦ùø}½ùŒ€Š”6í2vïÙ:¯†x ª¦…ô¦ãÿÍÁÃê4o»÷Çc@¼zØDë{íûqðgç@ï.ÿÆ,Rxeyz&üUFÀnèŸXp]°W_ÍÁ†ó'î/“ÉÀ 1`uÓõ˜ |6›'€×2Ê0– ¥#„me0ÞÇ5Êÿ7€¹ÜÎ\¤äcŒjÈ8üRë—#ÚçÆß¯‹…;d\Ù:9¶arcÛ눯LA¦ãzP°!øêät˜! U^~ehB…¹(ï£(¡îî ·aqox³1|¾Ž{c PêÐ$˜:=¶f `÷” ‡€¸u$]"\¨ŸÁXÖuqxî iͪ²cÎR‹È-èX ñÀ ° Ǥ#tźbN@u¶’‚~!°C¢è²Ìt¼Á[×òT„ìéðò¹ o%k8C«a@¼ôž§Ïø, ” THx¦Êv,l,Ïp1(æt!8[t¶(C:a@îÄn”°•Ó5ÂæH+Ó¢Á„ê9ÞÒ¡ïŠ@Hø8^š×ÐgAÜ¿¼è.`ƒý[öo}6Â\ÄÂë?ûï5¯‰¬øiì&ðj9Ī®VT‰9"ÿí_«Ù ôüq+ÈÒäSíÁšòm¨ÝçEò~‹g[{ðȃbmF(70Žó‡æöѯâ4@ú:¥dÄäýz.ê¾QÉË0¸7ø×3fÖÒ/®Ú± wüw=ãvæ/P³,€¿Á,à/2ácîí0U!í0—xÝ9  à8ÞÓúÓs0欲#Cu%FXWkÉz8¬`ð7Ï~öyaÞª+Ü‚çæmö²€;ˆégà1·$†ZÃ\¸k¬Ì‰;x}?Mx é=]Z¾1«·ÿ´û?ïL endstream endobj 4262 0 obj 4441 endobj 4266 0 obj [217 /XYZ 31.5000000 160.250000 0] endobj 4267 0 obj [217 /XYZ 31.5000000 367.250000 0] endobj 4268 0 obj [217 /XYZ 31.5000000 105.500000 0] endobj 4269 0 obj [217 /XYZ 31.5000000 70.2500000 0] endobj 4270 0 obj [217 /XYZ 32.2500000 159.500000 0] endobj 4271 0 obj [217 /XYZ 32.2500000 104 0] endobj 4272 0 obj [217 /XYZ 38.2500000 615.500000 0] endobj 4273 0 obj [217 /XYZ 32.2500000 69.5000000 0] endobj 4274 0 obj [217 /XYZ 38.2500000 615.500000 0] endobj 4275 0 obj [217 /XYZ 31.5000000 367.250000 0] endobj 4276 0 obj << /Type /Annot /Subtype /Link /Rect [477 593 504.750000 599.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps >> endobj 4277 0 obj << /Type /Annot /Subtype /Link /Rect [459.750000 541.250000 503.250000 548 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_primitive_type_mappings >> endobj 4278 0 obj << /Type /Annot /Subtype /Link /Rect [60 331.250000 127.500000 338 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn1 >> endobj 4279 0 obj << /Type /Annot /Subtype /Link /Rect [60 323.750000 114.750000 330.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn2 >> endobj 4280 0 obj << /Type /Annot /Subtype /Link /Rect [60 317 106.500000 323.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn3 >> endobj 4281 0 obj << /Type /Annot /Subtype /Link /Rect [60 309.500000 81 316.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn4 >> endobj 4282 0 obj << /Type /Annot /Subtype /Link /Rect [87 302.750000 127.500000 309.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn5 >> endobj 4283 0 obj << /Type /Annot /Subtype /Link /Rect [87 295.250000 130.500000 302 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn6 >> endobj 4284 0 obj << /Type /Annot /Subtype /Link /Rect [87 288.500000 162.750000 295.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn7 >> endobj 4285 0 obj << /Type /Annot /Subtype /Link /Rect [87 281 192 287.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn8 >> endobj 4286 0 obj << /Type /Annot /Subtype /Link /Rect [87 274.250000 134.250000 281 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn9 >> endobj 4287 0 obj << /Type /Annot /Subtype /Link /Rect [60 266.750000 111.750000 273.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn10 >> endobj 4288 0 obj << /Type /Annot /Subtype /Link /Rect [60 260 87.7500000 266.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn11 >> endobj 4289 0 obj << /Type /Annot /Subtype /Link /Rect [60 252.500000 156.750000 259.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn12 >> endobj 4290 0 obj << /Type /Annot /Subtype /Link /Rect [87 245.750000 105.750000 252.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn14 >> endobj 4291 0 obj << /Type /Annot /Subtype /Link /Rect [87 238.250000 138 245 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn15 >> endobj 4292 0 obj << /Type /Annot /Subtype /Link /Rect [60 231.500000 114.750000 238.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn16 >> endobj 4293 0 obj << /Type /Annot /Subtype /Link /Rect [60 224 111 230.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn17 >> endobj 4294 0 obj << /Type /Annot /Subtype /Link /Rect [60 217.250000 128.250000 224 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn18 >> endobj 4295 0 obj << /Type /Annot /Subtype /Link /Rect [60 209.750000 122.250000 216.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn19 >> endobj 4296 0 obj << /Type /Annot /Subtype /Link /Rect [60 203 121.500000 209.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn20 >> endobj 4297 0 obj << /Type /Annot /Subtype /Link /Rect [87 195.500000 126 202.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn21 >> endobj 4298 0 obj << /Type /Annot /Subtype /Link /Rect [87 188.750000 105.750000 195.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn22 >> endobj 4265 0 obj << /Type /Page /Parent 2 0 R /Contents 4299 0 R /Resources 4301 0 R /Annots 4302 0 R /MediaBox [0 0 595 842] >> endobj 4301 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1409 1409 0 R /F8 8 0 R >> /XObject << >> >> endobj 4302 0 obj [ 4276 0 R 4277 0 R 4278 0 R 4279 0 R 4280 0 R 4281 0 R 4282 0 R 4283 0 R 4284 0 R 4285 0 R 4286 0 R 4287 0 R 4288 0 R 4289 0 R 4290 0 R 4291 0 R 4292 0 R 4293 0 R 4294 0 R 4295 0 R 4296 0 R 4297 0 R 4298 0 R ] endobj 4299 0 obj << /Length 4300 0 R /Filter /FlateDecode >> stream xœí=É®ä8r÷÷y ³ÅE" º6>(t> |0jÜ ªnÏÁ¿o-d&·Ð jɧ)L¿%‘T쌅üù_~ýÏÛÿãöóÇ_ÿçöÍþýøë[uWu5üïÖýûÉoàúnß”®oß~¼ýqûãíëÛ×ö¿¼ /üúñßÚ_ÿwã·mÿÿ·ÛŸÿ£mü‹}¨{àÇ›bªýû½ÿkkU¿]û_ßþýO·¿w=ºáìdÂëŸ8«T¥ºiL ýÇ›ûLÖÿûÇ·¿¿ý<`Ù(’3ÉäIÑþÇH~ûßÿzû½Àu_ÝdL5RUkR¼©n;ᦺ c’ú4ݳk©ËuÞÏœ*L4l¼÷öMfšJi þöÇæ-æ*f‡kɾ¿æ-}7¦q­®Aù~^í8âwoLñZšvLðw8ÓÖ2œN-Ýèþ¯`¹wãù¬Ë0:4˜×^ HJ~ø 9('ø\….æ}­èà4ø£æÛÕðâ÷¸§•Xã7ÑJ¾p:L†Ã¦×Ý4¸ýQ *þ°Ñºô`ÈýGÐ>•~öÖ©U¡p†>©ÔIÓbE¯Š €£œØyø_ï ·÷Ó z"K€Œx“ X"èÿ–ÂÅRMMG. ÕÏéíMD«}ƒ Þøô´^àð&?+®ì$ž?o6<¼. £~ñ ½* ¢/¡Jaä› t-ƒùÀé¯G®îד½y„¯Ò‰Ÿrº1z ø“HV¹žè4 LC 2‡ +“¦¡ÒPM@<'阵tždýv5¼ø=îi½ø‘ú‰.¿siì°ÏÞ|Â7 §=­—CäÐÈÃ>8)Túa!´­å¥È$£†'1kË=«Á᳦O$]çý×ûæ >ñf{"„΀ `Ó t"$XÙ2 K.5ø™äÛÕðâ÷¸§õ²EUOøø÷n0üðæ¾Y8ýèñhÝ5=4ò°eK •z mk¹§vÌÒH4ŠÇìÃó²ÅoWËßãžÖËßðñ;7ÂûüáÍ'|³ púÑãÑzYC<ìCÙ’BEñ´­åžÃH¶D Obæ–{VƒÃçIŸHºÎˆ†M|âÍöDÀ(*¦èDH°²e.–\j:: ¸%vºšÀA”oWËßãžVËùtO³’¬†õ~„^Ùàºp†ÑãÑzYC<ìÙ’BeBÛZî1ÎéÒH4<‰YZîY åcÁGÛùðõÞ°™†¼[–Œh|èXd£¨˜FH !a-ÓpqäRÓÑIÀ-MÌ>O&ùv5¼ø=îi½lá*šWá°éµåöþG1¨øÃ>Fë… 9ò@…ÊTbŸ}€½•L4gøŠ˜¸áIÓÍÀD룜Øyø_ï ·GÌ¿šv°ȈGQ1©€%‚¾•-KáòpØ“‘KÀByWªä&¢UnUûNÍlOëŽ4Ñt¤¹¬”^[Î?úcÐ^†M„PüLÁðÙ˜]Ëg<ô¶:ú©Ÿ¿ž„8:連 Ùyø@ð'·Gâ`5Aå  &L„C +‡+“–B)ví¯§!Ÿ[|7RÐÎ"Ê­­ÓQú¾£|OëeR þp:<ÙI¤×V*ô?JÇý1h÷£4l"„„2i F€¯ÀìZ®óAÕ_3G®uä† æ¾J'“zê:÷àOn¤Âj‚ÊA'@M<˜‡V3V&-…RXOC{å]·RE9cCƒ Þøô´^&™(ã®mù+½¶RÁ¤ÉSôÀñG Ú §Â°‰ʤ)1‚³k¹N…Þ]G?õóדÐÇ*pT€!;“OBi¤Âj‚ÊA'@M<˜‡V3V&-…RJXOC{._SG”kœ·Ó÷Uå{Z-“ê*ŸWW6AÑûá§áñðº0Œ†Iăö2ª0ˆ"¼¢)…‘‚ Jײ›‰ÜÁ–pêç¯'…žX:p('aÞo™† ý.×9,j€Á@1” sdÒ4”dtXO<'©˜µT–dƒv5¼ø=îi½øaQ6^Û›^[IÀÒü*B¨°0ð9,=ò@%ÍT*5‚½•,5gøRfÜð¤éÁKKàÄ΃å3GÚ#°šv°°|*`:,X"è[Ù².–jj:r XÈ<§ç·óXÒðUûŽÚlO뎌§#ýõqöÚr¾Ü8þèA{T6BBñ3#8#Ì®å3TÝ5ˆžzਥŽ 0dçáÁŸÜ‰ƒÕ•ƒN€šx0%¬f¬LZ ¥”ê, -›Ð‚Úe}“œw“­ðΔ¥o4rZí]|dµÛÈí7o j&yùë’>°Ó|n°Àý Ú…ì-ÝdaUþ\­ÚRபï—\fúÞ|Õ|Ü‚UÃÔ:Kñ9ÑÎûõ$8U;ëB8‹û>ÎÚ©Õ7¢õ‰pV„ÏrÄp „™á“»p´q“<²ÙõxÌé¼köjcÄÝucÿþ^Ã*¬ßP(o¶•™7l§‘E3ŽÜºb6³Ô3~øííç/æÆšÛo¿·ÖU?àðç·oíä§ng nn¿ýåöOí|~ùçÛo{“w)†Ý±ºçú;\CwªÐÁú;úùh34ܵ©šÖÞ{>Ê*èÜ}¥Àwøò;L"f Á;à—ŽôV÷wĽ–VÁÜ@2q\³¶»çŽÏàs§vÍúxÖð8`oÜ 0Ïœƒç†À kÏZD,À¿D ð»#³‡ÇÓQ÷Roc˜Œ€fqM0#c˜CÄ #'èæÃÆ\/sºÇLvçóo­ªZ§e˜¬@E£bM#>0÷~6Äï|€î°à;¼ó ¼#–Ï ‚gÀ© A·n­–ºìÓr®—Ê~jjUs,ð~™/‘ioÀq¬ø,˪ЧÅ{eŽÌŽ#A0xð÷€3€ÇŸÁÈåX€ßgÀalëåïTà;ÖÉÝQà¬+pn¤Dè æø{h±=Bñ ]cègs ¶G ò†B¬³Lºœ“vävú£ælZ€°¡ „t •øÄZ3k˜^àYÃœŽ˜€5 x¦ñaCº¬f)ˆ-”>ƒi†¬w`ŠEakKœ(= + vV…±$6툄ƒçrÜÊr…¿ë [,èÐb–òËh+« ¦^†‘ÿ ¬G(dwü`äখ‘QnÔOÛÚˆzÚÞïŒH_ß»¯Úiéj„Sá°¤"íZ žÁ)WD(ÌÁRüž37د˜C­›`Þ†g ÃÖ3ˆõ¼ÕµÛHÕZ–‘ª ÷ÓåHo°%¡e7ÁÖîˆ kxxÖ˜ïÁH!ZÏ,!I¹‰§M ϱN‡i‡Xó¬qaXôƒX]aôÆ‹7Qx …ñÊ`¸¦7„TÞÌj¿ðf¤¶ ®»úP”ôQEH`âûˆ¸AÀ®÷K«ƒàOg l¸žÕ÷*V` ¢ScÜÝzZWýŒjEÁÍ”@¬ÃP)]%íHÂTa^I§ëˆ»GJ“@N\°7²Ô}#åtp%¬ašÚ A i1ÎHY/mÑȮ#¸] Óâk²I÷ðç|‚8@Àâ ~Ç-OE,Øà;}“HnLbjͶ2š_¬D#0Ì)¼1£`½¿ƒ//¨ M£çëÂeº[-­Yž#¸‚©ƒ_µŒÐb#ÌÊz3ü`¶ ÀÈGŒ‡À‚ô\‚>»²dc6ÏÙ|>gÌ4ñâ,&Q«îG‡’p€K!Ôhÿý&×Ý^D¼?(éÑìG”HË2b¶ŸCäfûd©Î [J}Öb$vp$ûz`¬~¤rc¡ÁäŽùÒŠ,È1å—•§ÄÍn ˆFP†Q‚ ¶7u¨ÇFl­­¼o¤>"ˆ1–©×ò€ên+G²±Ï’x …{„Χ¬Ù’òZÈH`cx+…e1ÄjµÊ^C°Ï^mcxúÅœpgQK¡XŒ¯j3g0ÈᲑ) òQ?‰ÂØ_ly^ÚÍ"¦ñ"äÀÕ4(±µÑv7(Q·•©PÖÜǘá§ÞØg é±S uÍþ8%>‘0’ ÏöqYësê¼ë®ª»Å…xÔy7ÚoÙ§Î{ØOÃ'‘òuÖfšiÑGmNæ {nüj@…Yat.mm;&‡Øo«àâ‹øw«aÛ;qgÑdáM-Pþy3Â3Ø3?DÖ:[ÄÂl2ÒÄ §‰#n·ŠñËoKÚËŒnLòý…þEè߈__µÖü=»ÚN…¸òN8i"Íz\_dqWÎþÓF¯wÏÁ+ÌÕáñÁM2wŽ´þ$–¾´{ läpŸôdnà^b•ó¥^÷7¥äñœGP&ÑÙ$¨ÂÄ¢1TN\4L»Ïå.Ðlƒ†°ò´ÃÏV /¤)—G¶Ü–Hù8c}Wùø“«$ßî¶°J;#†7“g²˜•3ÆG_Ä  %#æDK´"¦cÑ“¸Á6¿µêÜH¿š{ê=gè^9Ô®ÀSæåŒPÕ^»±Ûà9•Î%.!ܱËè*Ö¹V<ûå{m”1R}³À'ER©A¾Äzr•Öò|^áì±¹¡¢£[í|VлT2÷à¯ÆÄAXA&UÉ31PHÓáõ+Šî1’ä ìnG„>z%C7sÖk9—ä·ª>ƒ­|¹ñ‰efU»•î¼"‹"ïg«‰£H¨’‡vËåãåObvú-\K¶•å²›eÑÒJRÒ¢Æ÷³ é=»+Î…^æ4!Ý%îT¹V q ¸¼Ÿ]ñXGÁ_0ÿäk𒵫žŠ¸“Ë¿Jœ&J\c/QÒd«Ã·ŠêÏwyaü±$+:Ú4—ì°¸k·ð69ɇ13KÂCë4Û-‘ŠÓJ=ÊímË;i9דä8YϾCuÁ˜¬€.÷-¬¯_Î}{dB¼–â{¨;ÙÔ‘´ºùÅL_Ì–0 ¸F°ˆžÐ¬]_Íuy…»®p×¥HO”*ºŽ­ý+ÜuD#kϱWéÈÆÄ‘«úEÌW â T‹ò÷<ùúáàÎw:®@Gwg} ƒH(yQy…fMi³pB#ÜÛn½…„~|ÛµuËË PgøOQ¿ŸuÌöÚ9s̨dfwËË—‚ìOŒôlm¶Ãñö¼º\—‹£œRÕ©”>¾y„Îñ§¶•·Xf oÍIH¨ã(Â|Æü1é~WÆ1 n4‹õé•à³—HᆢAZ/öî…%´E/!’M£Öï(ª.wc^åW¼\qð÷¯E,h®8øϪˆ+~ÅÁ¯88VF^qð“É¡ âàBEÊ÷ŠƒS­™Ïd4žÓ-r\©Öð"W0l•~+ ÛÂÍT³i>9~0­$¤ŒŠ u…éV~Ʀ;´*¸‚iWµ4™ÈÚ¹Zz–ø9~MsÉhºà±~»¢Â‡^~½^TX×ÓŸFº©Þ×Fxà„r¡7æ=†/Ž>Ж×7GLÐ/ìÙxëî¢åÙ*_{ ƒJI~ Æ€‘/=°UÍØw0>€K»ªã¥|¯cqná9äÉ á:‡Fb_Ç⌊aøÀ„(³\×s¦D–Ò·îpžLiA/üëZ‡#2uW&:PBw*˜2 pæVäñ7‹êÎ[PFéT¸šKwkÆ ,óefm%-3‰ldŸ¡;#_ Ïí8,Ö`Îýò¤åOZa)­(~kQÞ°æÞuüãq­îZW7Uuczh5·ÆÜ{Òn¶-ßÞ}gÌp­Ùã)å÷⮆1Úçíuݽv‹ß–ɲ}'ž‰¼¹™½„ßñíí¯oþÀ„%0aóø‡-(Í쿆óäYuoË\Ý0!`Î1Á„Åh¥"˜Ç>bÞ ”âùáçˆÙцA<Ý’aO…Âò4oj¿áûÛ¯+¥…¨Ci!šœ´:æä¶%‘ÝSÊïÅ]Õ¡´2'-„HÆ©´hÛÜL¥/-cì*-ž‡+ÈæÅœÀ¸ÿ‰³´‡úÈO–ï,«zsƒá†ðB¡ÎÕ‚¾Ÿ–1­äŽiEå7¬gÚZ†L[×9¦­UÌPmK´ÝSÊïÅ]Éik‘cÚš'cð”iÛ67Sá3ícŒ]™¶yrª7Z¯"¨Fùp]J¥, ¤”¹Õõ/ËØ¬aŽÍ*í7¬g3%B6S2Çfª‰Y mIج{Jù½¸+²™â96S,ƒ¥lÖ¶¹™rŸÍcìÊfÏÉšR›ñ/ó½sS!ûÙ4§+KLV~CGs£”Õù•»ç t`DO¬ÕJ‡Öºmañ®å[7ª%ÇSÂݸKn1ÿh`=aÄTÉ0ýKÑdº§dØ ‡ùkÄs[Ы›ÀŒóuÀKµ­œ”¨̉٢ÃA­SlÃ\¾PŒ…|¡Ïð…b2"XÕ{B²îŸèþÑ»d!_(VeøBU&¦2 _ Oɰ³'_(¦&uažZòûÊlÑ۱Š‘]Ãl¶UÄ‚娢]GôÚ/¡#ªîž²dïºq—UÄÜ䨂ëx®S¶èŸ’a72fW¶î\ÓPy!eÙáÈÖþ‘ï¯-`„²òAÔÚo˜-`¤‰L]åL»8¿_îGò¡{Ê ×½´Ã<ŒÔ9#U<ŒT©€éŸ’a72fWS?¶Gßȯ¯¶'K¶¹ü„sߥ)É0/Á¢ØÊíyIÛKÚ&Ò¶vÖöëü†ÙÒ¶Ñ‘´mLNÚ*‹ÁÞë Ëî)+M]7îRGÒ¶Q9iÛ4ñ0M“JÛþ)v#Ãav•¶JNûPa‰RÿHL¯p® {û²Üóû ¼¤\ü‘ká7¬öÞ*íl"w­3Þ[eªÈ³ªz×WèíŸR~/îJÞ[¥›Œ÷Vé:C׉÷¶ks3m<ïísŒ=½·ÊÇ5H¨°êÅ$…-ˆÍ/¨OÆ$tÃqÌá‹Í]5õlscòá͹.me\L‘sá7¬fD]… I-ÉgQWqB’®Ò„¤þ)å÷â®Â„$]å’t'$u-1#vmn¦~BÒsŒ=±¥ZLj ñѤ(Âqøxœe /š¹Ð«ß°žy˜ð¢y.áEó8áEó4á¥Jù½¸«0áEó\‹æqÂK×’P#w /®—ð;v¦Fá^„Õ†\0bz~¥$¦ØŽÖH¼%iv*7qÿñ›- ¡ù#åxˆuÇR)\@YHî7Ì]“j)Ã5©–ufMªל¶®9IÙ?5¬9ݸK®Iµ™5©–±£±k‰×¤ÃS2ìF†Ãì¹&Õõ›pòð>Tc—_º~&Ï ³É¦Ù42G6‰A[C€õî)K®w)"²ixŽlšØcÒµ$dÓ?%Ãnd8Ì®dÓ‚Š<€šZþNDÇdéb àq>/ÿ æ:êhïsîB‹9Döˆ¹3°kñ3!j^G Å÷ g„„ïQÇôÌ—t¨C0qqÌ 0Àp7&â‰V(F“„70gËžG¬/Úßv>ÀÑ_ ˆj£ƒZÞí‚¢äÙJçñÊñZ«’R4Qh»ËË­V>bƒsp¦\<ÚyGá`6ê·sžP9_Ma ÍPA2ÒØÿþ¾«ýã[[ñ=êÜ­N#;0R&ÄLfÂùi®K”Ö‚Cðº¾ð‰}#FlÿMK(“®Ë’~!&#-¹•_ŽvCv”ÿd¾qŒò.cRàå)Z0[üŒpõ‚¼ú­|I›CŒ“›‘Ž)-ÀîP¾Zä¼dªJ‚nRi°¿]š¿Ž9J“Ž;ßÜ)¯ðŒÖñ²0¡lZk VˆDi”}±Ñ¥²@¬,8Œ{d'”dƒÀ-WIö&Ç;$Ò†<¸.®1@TØYo`sšUU³³´Ýh”Ç3Ú½‰õm¨ÅçF^PõAã.Çì·À7Mš(]Y¥5Ÿ½Ï@lu¼ÕUð¬i Sgfã[Š&l1†PÅ­[xÏø©4M¤ÆøÁF¸÷7ü)"A›Å’7J¨C%¼ìžŠâ÷­J°{mŒ8Ì1ÞŒÞ=h0Ó™¯gFÈ ãˆ‚-T ³#ÜÊEœÇ¥¬@X6ÒøÓSšEã²"R¤#.; Î`†Iª3aµŒÙÈxþn …ó2h]ÂXwKí7Ê¥YÑa ¬`'(³‘‚5â¸ßÁÌmd¡¸»ëxä„ëS.b7óH YhÌn'ÖæNwb}¡´;¾Ø˜J‰å”ûÇ8eœ~µ7ýeÄ“äÚ·?ZÚ%½¯S̰*tŽ4Eûí£ý–žv‡Ù1P× _¯2Œ7Èj~çwyw>Xˆ%w¬ áX2P‚ÆSÎÊÜܾØ/…V°:”±œ‚Ó½rÆÁîÕ„¾Ï|ƒ{ß±:-úto3y,Áu¿Û‡"%gÀß“ƒu=L ±àÔèð¨~†Ø`{0t0l²( ˜~¬vÎQL§àÜØ?#½ÁÕó®`8°°ŠAT%îV¸Îã˜ê¹gÙLj¯·¯oÿ7.B endstream endobj 4300 0 obj 9107 endobj 4304 0 obj [218 /XYZ 38.2500000 329 0] endobj 4305 0 obj [218 /XYZ 38.2500000 287 0] endobj 4306 0 obj [218 /XYZ 38.2500000 131 0] endobj 4307 0 obj [218 /XYZ 32.2500000 749.750000 0] endobj 4308 0 obj [218 /XYZ 38.2500000 709.250000 0] endobj 4309 0 obj [218 /XYZ 38.2500000 329 0] endobj 4310 0 obj [218 /XYZ 38.2500000 287 0] endobj 4311 0 obj [218 /XYZ 38.2500000 131 0] endobj 4312 0 obj [218 /XYZ 31.5000000 750.500000 0] endobj 4313 0 obj [218 /XYZ 38.2500000 709.250000 0] endobj 4314 0 obj << /Type /Annot /Subtype /Link /Rect [463.500000 778.250000 498.750000 785 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.gnu.org/software/guile/docs/docs-1.6/guile-ref/GH.html#GH) >> >> endobj 4303 0 obj << /Type /Page /Parent 2 0 R /Contents 4315 0 R /Resources 4317 0 R /Annots 4318 0 R /MediaBox [0 0 595 842] >> endobj 4317 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F1409 1409 0 R /F1699 1699 0 R >> /XObject << >> >> endobj 4318 0 obj [ 4314 0 R ] endobj 4315 0 obj << /Length 4316 0 R /Filter /FlateDecode >> stream xœí]ËŽÜJrÝ÷WÔúS—ùà 0P«[¼0 H€/ g.s–gáßw=Èêª$O’y:"IV×\Ø’šÍÌdfd¼ãįÿúí¿výçî×Ïßþg÷£ûóó·§b_—Åù»ã¸þmöÝßwuSî~üþôs÷óéëÓ×Ãÿÿùt~áÛç?üíÿvv÷o‡ÿûÛîOÿyøáŸ»_:þÂïOµ©þýôg[›Ãߊ˟ǟÿöô¿ìþq±Ÿ®[Ìí¿ÿ`©ê渌‰©>õŸiNÿýóÇ?ž~=o@Ú,Þ:WV;ãß™ÖÛÝÿþ÷Ó_ôÃû¦êþÿNNÞ'÷=LnšÝØÌÞWÛÒþÞV¾.ÊæðÛ‡ãsÝÿØ™÷ǹk_ïŒi_oü`öÓRãkŒÞT…âè§µËoŒ³m|tõCo;o[YkìÛex•Si«VsôãÚÅ÷¥;r8¸ö‰ûÂÅ^ãL|Q+òóÚ•N®~âÆ¶š'~^åLÌAQý¸v­‡ƒ«ŸøAž7­-5ví2¼Ê™8gG?­]|_º‡ƒï[oL}<é÷è§Ý'x[jÞçËð*ûïMùpZ»Ö}†ƒ«ßçÖÍû|^ãL5éé´v­û ×>ñ²P½ãoÃ뜸æ?¯]éŽÿš2^Éù'Àñ3òâó÷§_¿Ôˆj÷ý/‡…&<ÿñý÷'øÇÑcQ›Ý÷?ïþå°žç?î¾ÿíÉØ½w'¯Îñ÷NOLqzÒì›¶¨Žwòò¤(OOܾôUS_?1 zRX8ÚçÓß/àj´Ïèó‚Þ±/Ä.Éa$ˆ ->äÂÃшͷ A€ƒc¿ÊlqäŽ7áÄÄþHC‘s‚{nÏïÓ/a­F>oüR|‚ø uM †¡U‚ñ—¾;¾êž ‰É»‰Å¾~?ÈQ%ØúPb’kEY9p±¯jsKÀ/ˆ´ÍùÀë©ä]r†’ ¹vj"ö^|,ŒC B£‹y(§)A2”Ÿ†ØJ¯ÅjþBaÀ×3²êùVåfŽ…±s0cÒ½GKš¥3ì‹È f§°QÁxØ:P¹/Zw{ ×'¢.®Ø Â$\HÆ›üÂðÿ„¸ƒ(ãEÈzqB”U¨(93_`3†Ldøš%¸ˆjwošÂCÎ .Ma}(/ºzl?ÁŸý  ¥½#\ÄŸ ¡Uàhs©R4†k$¤ˆpr‰¼«@DâCD߸°§dF?-§·Ÿ ÇjDŠ‹ŸÑD…ôÂJÒÖ·á?œkˉn9G|³;¨Q£Ñžóy×îvÊ£ûÀßÚYÖ£'Ý=«ö…>`´cï´è^4û}hðw§:òNÇ GÞqpÕ]})­ø’‰ã–¦™¼€+0B‘»Í`ˆœÂ pÌï>8¼ú¥=¿t‚\|†¬{/Ü?ûe>9ˆúÅd,e‡©?Áß…u7Lïˆqi2rß„œ|þ^RÚá|û'ÅÞbtèÁJ’™…òxcdLÉ'”)›Hr¢YS cˆBÆ‘Í\ M‰r­0Æ7ÒîÆè‘€3ãu‡ï¤¨ ó…fÄÆdbêÂ¥érI)áI‘ ¹r+‡ÈD—a½CJM6þ'«9Ö•ˆ­ùU‰—K—µ®0gÀ‰¹nh!eU-Ìbßg±Ü #äY®F#®ðµRûÓ r2ÜŸ.¦šàîøfޤME‚¯p -Mß#jJ씤[Ü´csÚê0r¦p´l€Êô¸l D€Š):6í /£Q \¿Ùô‘àD®bôd&5=ÁVB9Kå`2`N#ŽÈ@ogBéóAF \®B›ÑÎEóÖ"ÉÎSö¦ÌªÛ@h “ø;°ʹy¹8kDÒ21´ÁÍk« Тñ"ÇÊù€/ÖÐYÑŠ¡±'>qðÉgô¤SwÇÞiÒß)àÚ\[§+²z »j«5˜·~š/Æd³L2ábD*e–W¹ôãMÞð;Ñöu‹d±E²R¨´ZY쎄ÅJ$ªËª¼8-"î2¢4^ß®ðDЏ‹êÔg¥òevÑÿ»Ú7M±«NÔÆt?mvUyi‰ÓýäÇSå÷Æ´¶iÌå·ÜÍ(îzŽÃïwÿ>½¶ ßvƒ9Üñ`%‡ßjnFinçøíéù%ŸpÓÉϲGâp¯ËwOüÞš€Ë—€|µc„÷ŠÞÁO˜Ñ°»“¨cµš/pmØû-y¸j_Ãw°gûÅŸ‰=€gŠG‹ì5Þ7bw ¶fjmiïŠ&¸˜úÞ¦öR”íÊ¢Êâî1qnF›xG0.í{Ö’6¯ %aBy±< ¥0T¡èÚ²Áw÷/½ìOèÓ©Ãk#Œéˆ> YãªÎ7`Œ,ƉOnS!9‘ö,[¹.RF²°‰¬`YâMXR$Q—y΄‡Ê?!"c0Ìœ‰`2\ƒ)š¥²DCqÂy í(gÔåˆÕÛåZ½]°G°&G°Æ»ÿ͵ªWÃót‰±÷¿½!„yRA¤!ÒøäU’°%Ò¶ OäÞ#äÂÁ@ísqeÅ÷¥iÝçĬ”Å£‘Å2-ÑÖixmTé*¾X»Äç†è™LÉ Ü Ú©ˆú.Â2i 3T馧+ÊË®¾âêáìëRøÓ$)–¾P^vÑ•4Í+œ%|ò ~é3|«¯S«ÖÌ(rò½ªýxW`º.ÌM`º.ìH`º.|4>þ$ LŸ~ËÝŒâ®çèÓuQŒ¦Û6 L~2L·}(ú2Js;‡~`º.ê[cxž0ÙÇ’S\d,Ì=!16Ú&C¯Ìªñî`ÍŽ¡à NZ\=,l+Rå#,,˜A¢ÂèÊ[ŽoÌc*“¨QÔ¢¬WvݱޘŽéýÀ Z!ô0Ưdï\þÒˆ^¹ öX5UpV î” ft¦Å8]3•‰1í)ïãóJ€ö’E÷XÄ{.GÓ}å<¨”‹2 tнŒIý‘É®ú0ZD!Äû¶~àôUæ­ZÉWG êK¶ž¾0 uëC[”ũȅ¶( â¦é 2e@FË'ô.ïXƒIŠåïøú¼õÍ…6qÂÍÃR~¥<öF®ð)àï±0n„çYóî8¼;b™+s®FÛnúj0‡I)rÑp¨“q"ä‡/^"Æ¡hüï¼Tºξ„{íá¾p¯#ákâ{¦^Ìò×öÇûFÜ|>+a‘ÍÇúã\[üNdmøj`"#®íÇIÁŽìÁŠÅ¾¶ˆw”Ñî F¡bd£D¼o˜I3jfì ÅcÁ+溙þ/м˜ÈòÇaž˜,ðAB2§Hvq]ža„‘w°öW€/Ü7F F.fjøÒvEo¸ÜC=(Þy\›ÖökbÜ_âª.q'ZÄo»…¦Å Eݲ8ƒÍÁ§’+à­[óÌ€Ra Ѹ}¤¥ ó¥92°|@ã`÷fª8t4‹L¬ N$Ca‹PÆ•QN&,«;'e'‡fÊ`mƒ¹FBT#„Þj}ÕßZˆÕ׈ nJIMs©b›E„y!kÆ<\ÞQV±I—÷û“¡uÓÔ>©Ÿ’èÎÈäSQÐtŒ%%j=Dð}s•zàÜ\8-kgÎïAÂ$™GüDi„G6åZÚJ ÅßÃòØ’ ¤TCÝÆÎª6d(pà$¨ÒÅG¨0§ã‹Ò?Œ˜9êÙȹ;#æavD©wÍf‡)ú4Í\`LÓ8áF*¹0äç·cÒn>Í)8qJÜ ;RÉêÈ Å”¢•ˆ[¬#}`gß,I;[6ªJ\É¢RM+§ªùvo媲Ù¸ïò%j²P ¢™?(‹ï–ö¾K<ü6Õ%s +ôŒñ„ !l’cÛ!8qÏC<¡2z± ¿4›bM€¾—fRȪ¹Û·.ÞJAerBËÆT†ÖÓÓ–iR´DMy„㺢.Þ;8”f·}PºCÆ 7´§g~‡ù@¹«aÕr‘÷M5O™ï¤Áž¥ˆ«Nì="ˆO©o›r )ªXð¶åÌ6 Ô­™ÌéÛPé'–.¤ìÀ-Õœ”Ú=„¾óZ¥4ÁW{Ø4…i3ÒW¥B§DmÁ"€ @*‘ÓóüÚÙàhJÎ?\cD.N$ÿ%d™%hTD<õ~¢¦­µ¡XJèx‡oqǘø|„›0ÕhŒ-Â$ìaû…Éôbtv¾(DÙóU´¡žÄpGÐ˰®É¸c0зºFiL]…Z“‘Ö+ÒƒFàÂxKuÒd’0²e+}ÜìÉ ;ûüã+á6Åû38"›Ëmeˆ+l™Ð“•ÕÚeIÉT-¤¦Êçq'`÷v©àÔxl¡ŠU(DD²íUÄ·'ÿ&%²f—ÁÊ„_ [ܹ|“ÁÊ”ó „8ãZ”ÔaÙ!m„¶cDŠ&lcƒMR #Ùæ-CkSU*› ¢ ãúé˜Û'€‹P9R™ÒJ²âœø²éåÖ완¦q<ÆÄÀZ:®š„ßãTÝG³ŸG³Ÿè÷Ü[³ŸGÇÒb ­ƒ¤x¢z‚Yç¡,ë? ú_UÒ­•å©©ƒÏÛ€<Õt6>؇µ3GS͆­˜`¨djg’Øb0}E¡Z#‰A ì*^ÛÖÛz[…Œ`Sð KU䬠N®¼ì;CDa" ™KVt«@ªfpå×R26¶2ðµ/Ú µnl°»e5!Ù4WÓšð¬ekÅ%\­L°LÄ™˜­fÕX$‚§«ñLësm^±fÐZ1ƒLÑ„–7%fE#Å™;ÝÇ­3CŸÁG@$2Ö‡ÜfyƉõ]êj×§óvø×§º¯šçã´Ÿ].'Df+m >¤dÀ1VP ²æïAÇÚõ%1®¹qÝÝ%XŠÖ¸2ÍYÖ¤Ê*¡w0ÕŠìd®ÔÌ;ídAÒ—s;kÁ;´P´–ŸQ:¨bWQ=áªÀ͈€ü¤äÃd¯3Ì‹#þ4¢Ã]´É¡öŠñ$¨Óóoå”.Øfw¬—C$³7¡uÁ|³„Qj…Ë’uM&æ•€p×—ë©~ ³à)„fÙuBhf>MEN”Á¨Ä-7ES#–X×ìL;ŽÜv–m0¥)ögþzE+=éè«Ü[À”“ÞÁ+èTú±w.^‰A×o‹F3-ñÄ¡¸OpÕ_ҿǺ  <3x™6òŽƒ'‡wÇÂÑô£Ô·²M°#MÝœz œÚ[¸ÕXÃNè@¼ÂÒ°jÑ"÷àîI•rÐb±Ì´¾`. C¼w–Ü&¢ÚM¦‘h ¦þM2Q^†H§ ÅûêùŠóâuë‘jN|«ÐØ–ÿ@hN3ÆyJ&<ïQ‰u¨™ŽL€û‘$4IáÔ_n{K&z¯9†œ7cKÓÜ¥½ 8ÊI6(ÅXÌxYœ[áBÅvLL̤Ë–‰a (9¿Ö” ¡ºŒvþŒ‘,YÀ©„PÉâÉ)Æ·hùá¶Qç|¢6%Ë3…Ýd{{?ü6ùi•2sDO]2O³O…m±ÆòR”– )4P×’,J»g\/¹®ùšmÕ¡³¬ w;å’1K"Æ×ÅD§zVHm,^w¦„jïNWzH‹ê‘Éîžßgà¼=y¹pñù1Ë ÎC¬­ÃÙ2åþÌñ®Þy†k{EO"ß#ºêG¬÷x™½é§\¼\!%‹¼gÌï„ÌÕNb &˜¢HYØ,Z HDÖ“íø%Ò\&ÌÒâtÌ #º}¦–·«Vpõ­:W2ºÄ"‰Þ²¬[6LšD-…¥âõ‹ˆ1ÑÏXa%´’ë8SâÎë&„¡Aå3ír°:WØñ×ô™šÁœ„Óĺ“l>âòitÙÊ´%Ð%©c„ÑÕ!ëYA¶ ‘mšËçaÌ ÊãAc0«ÞQÓB%ÓˆÈú­#q™\ÈûŒO5%Ι@2„‹ƒN‘p”,šœ¨–¸êÔ`ÝÜþ\”CÑ-áRÝ&\Ê{ (‡P:SSßR}RÞŽ­dîþ‹W œãUÕá6.œëÖ%`¿-(’]žc‡l.((Ã9Q˜h`Z}$Ûþl†3²µ Ï(ËI4á´ëÍNë2Å;ôAã»®nãË [iªG,‹Û–rtžÆq ‘Rä‹S¿\˜°®_TvésÈw‹šÚ˜š|%ìßDm sDm ;Dm 8? ƒ¨§ßr7£¸ë9ú j[cAÔƒd ‚¨‡Ÿ ‚¨m6½ŒÒÜΡDm‹ uhÉ#XôÏÆäX€jÊ  ÉNõ7L G®9Tú¢z2¤ÊG˜PºÚhuñqÁÀãÅߔ뎊ނA45¤Ò…D»|Jõ\Aüë>bŽÙzácB &–,hµnÌ#!ú²ê ª>¬l[…¢.Š(´*2J²ŠæQJêâ¢âNÔJ¹òš(nÁ9¸ÔzßS,tâavBûº‡©(T7FeŠààø!ŽÀµ1{Á’ÂkÃn^ì†çƒcµ‘}#Ьx¼×î[÷º(%¿'‚Î%ŠÁ…¿ÔaJsÐÏa6—f”o& ‚Cø8j‚#-øÒà„€‰m¹gAÚªá)Dö *<dÅ‘/Åt€/>SF bÖŤÀ`‰W€wîƲ¡âžSÙ™˜Zc?œT0\¼6,91ã`¤ú}æš i¸ÈuIcC˜=ˆêVÛÜ7|KÖl7amUGìå/ Û÷!Š@‚#á®5»\$ R:Æëö \ ¹–*ß‹lyFÅù>%ê¥}C×,á2¥jEë¨C^ eæ"D[y/‹ò‰Aw±âŠ…5¶^±è',KXak kF¥ÅêaU~7^ä{eŠQÆUlÕãêa\Åo‰œS½Ù™v<ïó$¾ŽyÑÝ2ÏeŠý9£u "FžtŒ¦ÜÛA‚l%úN‹ÞqãûLÜpÛGÞéÒzÆU˜Šçé 2·¯Ãôá4Z3®öÎØq³kd%zÇ:ø­Ó™GvïA§ÿŽí[Þ±ð ÞÑ>Y|xr‘Åkƒ§Ý]Ì4ªêöºÜŸuÚY{© èª1…0gêà­ÇT¡ƒ/R -ŽøYûÜÕ*}0ž²‰àTrç ó$Wg@Q4õl ಩ˆ¹ª dsG™Úºühæíí²ó²yUàh8ËØ[‚«Í¯ZÄý[SÚÐ)õCý¹nêJÞl1E0‰MRïUš±oSÌP¾íù»DaiÉJ>&9nñÄ[¸*ˆ`+Â8 Pñ¹R°Eá6Áë‡Иyv€ÌIïàyd5ÖIzÐ,£8£»\[g"]ðã'™ÔÙlm¹çodDûgÄ&SJÂèµ ’ »XQ•žêp&‹L, .˜©<¥Ëa0RX‚›ÒaÅ`´¦¼uu9©½Êzë2û9T±[Ã=ÌåyÂfý½ù¤6eÓ3j=Ó.R¹ý|öÞè„ûï® é\]Œ'y"y‚©Æ{Ggñ´\eœÆƒS>pzFŸ?M`—3ú÷ÕÉg“qe8g‚/{˜ßa+S²ñª0Y»xß°â¸ä ªJiÍ%ñ¾EvÈC"Ct¸,°?´¼Ä}LXÒÒéÍB&y63T¢=)Sʰjž¹i„º¡;L2y›µ+£.Ÿ›á] œ­Ïäíæ¨. |„p:®šMÖÍé|F$¿Þ)ÆüK°!‰ðŸeê}D»¯ ·-ÊhÆXÆ0¹_¹T4ÑSº`ˆxåÛ_qR%#3WÝ0H¹e8ø MõIÍB3¨\†\>l'e‰IdˆPAåMÏʺiß‘c¶ôÅ‘òŒ‹¹rY©šuvNØ| Û&m#yi©lCuþ5wÑ© C)RP»âB½HÙ,üžåKz' j5ÛJRK®œ]¸‹œ}ìT¡Û;Îù6$¶eûºª TæØ‡z0-ÄËûð}}YŽŸ‘,؃î‰ûÖ‡±Ö®‰‡5†Kåa*T›ØÙ’Ë{Èòy™¦K1e3Pã–å•e;`Þ9xeU ¦}ðJ¸Yç¾½Ûæ•µ0üµòʺ°u&çH  ®³ y:Ól'%4œ+ÏÌ]ãÒ•èI6ýŸñ(25éúî`Þïˆu5°/ñgÄDzb3¼ÏoZôEƒÛ%FäÂ.*l#Jj[Žÿ½A;êZ%¦±á6.kÛ ʲÇ þÜ}ø V·íݹ™O¢ §]­ìL=¾CkŽ/*Š$×ø`?¼›P#4WÓº2™â•yÖ^,žà8IK& f¢Õìa¸¤dŒåÂÑ‘µq–·²Ö¦æ«%µëö –õ’d.˜Ñl Tô/&ž¹XÐÞ•\îÑå2R‰/f)Úb…ÂùeöÉ׏뉔yÖ!ɬ8®´æÆ|UÝMÝ/bHe«±`ª­Pˆðì”Ë¢WPYº=ˆ[¸€ )EÌuz7)®¬C$y™HÞ\\ö]…‡·bˆÆ²<ÖbG„‘ºŒq"‹…™àZ“U+°˜ÿ,)¤l"ÊÙlû,Ÿ^ô£÷ã¶j«PQÊÖV‡*"zùR£·š’Z‹ãø\»ÿí~H)Ji_§~a)6ãQa·/̱EÉÎú[=iì„Îw¦¹gg±k÷öÜòo 'UÃ'Vm÷Õ 7š”ý‚æqSቱµ}é¾tÐ¥¥À¹ÙærW,Ä«áv¤I»F>ÃàÑà;Ýe3IŸ~eA²wüûaÅýÊ!>›…ß„I“ &SNˆµ±‚gÔù£üŒ£1x›íû·¹.ܾ»¢óöÛ`üœ«åLò¡¯»¯Oÿ/Ù endstream endobj 4316 0 obj 8373 endobj 4320 0 obj [219 /XYZ 32.2500000 102.500000 0] endobj 4321 0 obj [219 /XYZ 38.2500000 785 0] endobj 4322 0 obj [219 /XYZ 31.5000000 692.750000 0] endobj 4323 0 obj [219 /XYZ 32.2500000 692 0] endobj 4324 0 obj [219 /XYZ 32.2500000 643.250000 0] endobj 4325 0 obj [219 /XYZ 31.5000000 644.750000 0] endobj 4326 0 obj [219 /XYZ 38.2500000 785 0] endobj 4327 0 obj [219 /XYZ 32.2500000 302 0] endobj 4328 0 obj [219 /XYZ 38.2500000 161.750000 0] endobj 4329 0 obj [219 /XYZ 31.5000000 302.750000 0] endobj 4330 0 obj [219 /XYZ 38.2500000 225.500000 0] endobj 4331 0 obj [219 /XYZ 38.2500000 161.750000 0] endobj 4332 0 obj [219 /XYZ 31.5000000 103.250000 0] endobj 4333 0 obj [219 /XYZ 38.2500000 225.500000 0] endobj 4334 0 obj << /Type /Annot /Subtype /Link /Rect [256.500000 310.250000 351 317 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_features >> endobj 4335 0 obj << /Type /Annot /Subtype /Link /Rect [174 239.750000 243.750000 246.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_runtime_type_checker >> endobj 4336 0 obj << /Type /Annot /Subtype /Link /Rect [258.750000 118.250000 350.250000 125 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_ownership >> endobj 4337 0 obj << /Type /Annot /Subtype /Link /Rect [138 76.2500000 206.250000 83 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://www.gnu.org/software/guile/manual/html_node/Foreign-Pointers.html) >> >> endobj 4338 0 obj << /Type /Annot /Subtype /Link /Rect [440.250000 76.2500000 510.750000 83 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://www.gnu.org/software/guile/manual/html_node/Void-Pointers-and-Byte-Access.html#) >> >> endobj 4319 0 obj << /Type /Page /Parent 2 0 R /Contents 4339 0 R /Resources 4341 0 R /Annots 4342 0 R /MediaBox [0 0 595 842] >> endobj 4341 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F8 8 0 R /F9 9 0 R /F1409 1409 0 R /F1700 1700 0 R /F1699 1699 0 R >> /XObject << >> >> endobj 4342 0 obj [ 4334 0 R 4335 0 R 4336 0 R 4337 0 R 4338 0 R ] endobj 4339 0 obj << /Length 4340 0 R /Filter /FlateDecode >> stream xœí]ËŽãHvÝçWh=@«¾Ã@Ue¥/ ª/^=Ó—gáß7%•R'Ä8ºA1Õ™ªN&É`<îãÜ{Ïýõ_¾ÿçî¿ÿ±ûõË÷ÿÙýæþüòý¥Ú·uuúgwø÷—Ëènïþ¾k»z÷Ûï/?w?_¾½|þÿçËé†ï_þmøÛÿíôî_‡ÿýu÷Çÿ~ø'÷K‡_øý¥Uíðçߎö­þVÿ<üü//ÿþ‡ÝßO_çsýß¿h¥Û†qãÕ?_ÆÏTÇÿñÛß_~=M@Ü[¬®ußí”5v§z«wÿû_/^0>¾Úwnm] ¿„þN¾¼Õ‡·›~x±î‡ùo&ï>þ+ót•àá¶éÓ=ü8réIQ¦QÁ‡«êþ'_ÝÞ[·‡­¦ºÝì>Kùæ¶já›{«TÛØ¶ºç()kïé›z§T×ìêVvå¼ÇËn¹ÓÓ›J«tO?]|^Œîƒ—\ݦjMÂÕ}|’ÕDUʽs{¢ÕÅ]]­š”«{~|’ù׃ÚHøôÃØS­.|ø¾³F™v䇕>¬rÝuzø{kÜ?w~–±NœöuŠY;?>ÉšX“ò<Ç.>/nÅáÃÓZM£ Ù­ª+ïÍßbžgÿôà(ü ÜøùÇ˯oÃtô»ãøÂÓ?~ÑÍî—ƒ8œÌÚýSU©×Þýøë‹FØèú4¾ÓmÑ•ª=^©÷º9]z¿ÒÄßxOïq£6ûVuíÕ>Ÿ®¨}Ý›«+ª&®4¥ŽWš½QÇA/šƒOpÔøK 1¶ Ýcà\+ ÷|Zõv¼òõǰçïÛ®ƒÀkæ¶«­NÛuPîNۨ߷“‰:Ma·ïúÊÛ”^ùr¼b÷Ö´³‹8wO‹®¨îxÅìòzyÍi³t÷½Ø¢{¨OÿêvÑZ8)ø«^ӥ߼IQp° O ³¶ÿâ ¾ØÄ_ ¬ žs¸¶ø•ÿt<Åà‰dv$Þ)þ²0/Æw{¾nöïÛCÆ,^[¼‚Ìjà{"æÏÿU¼^12_LìY|ž <·VÃ]†¿g²¤·ŽDBÅW«ÆÓ|ŒðÅ„Zp|¨“lW,°#«‰¿Ï_`5i¢;Â`8ž·ÉjŸ§+ ¨BN±Slãî©–*/¡l…¤DÛNìcãìã“9B¯|FWLŹ2sW4ºbáØT ¯Xøž·ø±¹ó<÷¥¼bSk^ÕÞú¦×<½ê}ÍÏ#‡e%gÀªÃ£†FHÀ Fí •(“šòoELj‘‡ø&TÀ¥ƒJM5cWÊúÓð=öÕ)êÆG}V­êà¨7‚X:¶1F…˜­I¸Všje!F!(¹0}|“ZŽðckoOådtÄ–ìã‹1óŠöJ>[–„ ›BØØ€JàJ&1#+¯eaö¾J€ œOÁÌŽp½s´Œ%Μu'6S_)?o+ö`2àœ¶ñTl@Äa¹/Ší il}É"xŒ(͵_±ãa2ÇÛÈTÄÛ °¤øá%{ {Yˆ7à#ZnGaÓKyB¾0>³”ÔÙxZBÖŸníW)­‚ÆOÈ©Õíõ0æPaËþ„®`\Z‰š†Ø|`lÿVðK©QãXÃWø48jŒ³ã§VøÒꎾǡ(ŽªàQ+¼C˜+0ÞâFçÔÚ1=ñyjŸ§v‹§6°>ð{ð©ÅQÒÀNÝo²RhKÒî¶\WêzKòlOf×û’p÷©€Ä ÓÝ>8¢Тª×ÞÞ ¤…âS6õ¢¼Ñ“>‘ÃT½·"¤À¢£°Dä8ãã’+„Åø›Å°äÇ„U£!²”º©©ýíº<³C$•ÂS±tÇ€^*¬_°]Õ¤`Ô´Aùgă›&èÇĨ#Ñs„ßck¨´reÁ1kÊ(žå‚zÍÙoŒö¢”DRБ²”™²Ú7ê(?Ve>Ái-ôÈõžl dE=ÄœKt [p­âï©G·kô+žcX0Ù:fÔïå¡R©'¿:Ii#´˜pýbšeê2UˆOÏçåÎÜæNXgÿ´º½î“°=ÎŒ-Ý£66›D­¤º‰—Ùe!~³æ|­$•KâJìmˆdmTV„x!Ž‚pkaÓ{îñ`‰ä€qƒc)²>SjËDÌúDhgÆDLj̫”úìvÚÎ8ÔI}6ýõ+ºêôqï;Á¢+nš}ƒ˜fîéÑ=ÆqµÓ|.ç8Øý„§ç+ºââ(3#Pcàx ´ôpÔ_à•Ïplð=xlxvœŸûR<‚= Ï›³æî«àøÒ[{²Þf™OÅ„C„z,U&¬‹rÅÙd!ì€X¾ (Ó[¤ª™‰,b_‰9œ¢"” 43 }=^Zb6ebx,v°ô:Uí)/&s=‚ÿ%@€'W~aG@}–8J‹a¤•…DVH|ÇDY¨LÀgæµ õ…ñO‚¤-WIó=Âè(EkÑpqÓzš”b]¼ƒ‡ªS# þ£­,£| åñcJ&µ^v €°#^†ƒÙL®¹!#ðóæÒ'Žšon5¦Wï+Ÿ{æu`çŠJi”¥ŠàXÅþ^æR„–Q·­wÞ .¶Án¸€ æì«ä”HF×Þ·eNeI»t¦ñE%^º Öp*¨l¹õÓ³ËòFùïLK¸CeTL$ÍÅôÈ¥‹Ö ͧ†yLŠ¡FЀS¨g¦Üe&ê.b“”ËÏåñM+Y6ølLëËggkŸ%aã[,Î^˜9îú3ºbzä‚,<°ª€OîÎÍ ’ôù$Mß]¿R*Ÿ¤÷ÀŒ wzçò>ñitO gãtŒµBÑœ¨÷¨\eó­5ãþÌU+´bÃè1+ê(ø“PwÅÊ–d3 ±Y2%Âcšˆ/ž0„Æ/ö¡Lü:ðžÇ.Ua³¢T—^ùðxôä§LÑpxÉ»N”egÉV]F„§²€‚Me½ ¶Æ#xNtTÅ)Æcƒí|Ä[‡&0Lˆ…!SÌwƒW® TÛ·Þ£Òêp‰9Z¹ê;à=¸±€H>eK2ñ]ÑTÝ5Ú@ÉUœª”@"ò4ia¬TjÏCaŒ²y÷•`KXE—üÆKú»«éAi½åë¶5‡¾ñ»ßÏÿm÷]WíšæðG«”ûi³kê±Áüø“ß^»Wª×]§Î¿e®žb.ß1ü¾ûo}¸mçß­&ïP‡{¼‘ ¿Õ]=¥»~Ç_^>ÿ!Ö9l¨‘P ÜW"ÐtÀü¨8F0Ó°ñM®í]záÜ5Þ¼ËÐÓ3 E$È&²Ь&=»]dÆ‘˜´yÑ i× 3·:)¤ tÚ—@)BëiQ†Úq„¾„‚äÚ 7Ì…*Baß*)G€Õ$¼b1Y8fR©ðàQãd.hDÚ#ÃõÁL¼éYhÛjrL¶”»×švuÈ`( ³Ÿã^Ôð ³±ý¸ñAÅhr)ðEf·oÒwÖ¾O±Ñä£Ë,‹û¼ÖÞóZûY¯µŸx­ýŒ×ÚŸ½ÖþÊkí=¯µŸõZû‰×ÚÏx­ýÙkí¯¼Ö^Ðk½å²öçÊŒL}Â(…©Þa¨ý™¾g™£ã7ëì—T·q0Ö¡1ÖñDA #¬·"Od‘ z‚Ë_Jºï}‰’ æÈÆ;¿Â"7¦&;mç…bc ?%Ç"S<µóIªÐ?‚½–›€XT¸ËVºàÔwfGbX—§²¾ŠÔãöf¹±ÈÒÂÙF,ó4½%³CFüÿi{?mïT¶wÁ@`. yFgJ4ø„ÖuêŒÖ­ßfM)wUãÍG®Z˜µ† okt6r¥®>³;ãê×Í—´ãÆl[YÎ<<êl‡‰[ü:‹÷b×át&¹¢M}l´VÞ0ÐSù*+A‚L;ŒÀIå;1¯Äq#¶%ðRªWùð~N(€[´ýžV² ŸäË(¿EpÉ}Ûûë²­jžGÓáEÅFûÆN9é`c83c8é ^Á _ ׳ÂïÁ)tV“ÒîàìçÔ‡¼m¬·¾Të±5U‹·½¿e)—ÿ3µ9‘!O^³¬ËÅÎ.Ê×Á-‹˜¾é"-K0ßnã0ä ªÀ?Ð8R…£AD¢rIóKU®êl{öWtªa®´„”Ë©«‰Zzr‡/ù †?'"ú&Æ0rùÜÒ·öúpD™½Ø€Äd-شĆ·ÅWDÍklÆ[\9‚‹˜ JÌ^<×6yy“ÖÆÛG²ÄW”´eXA2%ÆËf Ȇz„im j¶a,¾t+fgÚ$ÙtÓe<"à™‰|[Pø£ùÒ㯦a÷êüÊš• ;,Óå…hüį?þ–¹zй|ÇX+Þ›n¦V¼7­ÿŽá'~­øñ·º«§t×ï`8k‡'P{[k…õ4‹žÙ LïùL¼ç ¼G-ÖÓñ7uE@k-#RÌCðèá"LWÒÿUœÝV[ímÛ€ÀúŠ´_Lq[azzÊÚÂÎOt“í#!œLèÒ\ýÚ… : £@IéØzÿ¼‹T{ŠšÙ²NϪ!&¡>SèF ¼lˆç#€"g="Dù˜©H¢Ž­‰Ÿº‘<ƒ7ÕCÒö|­¯ ýS ËÃÉ‚N^üVHµSÒXBj16c×F4àb wJùG§Ó$N‹³îÜ{:âFÞÒ)œI‡éÖpzÁì€S:(> ü4ÜæóD ¼æm¸:l*Û^B‡ÃwSè°©izëâA‡§ß2WO1—ïpÐáðßÍ:~Zûï~âA‡§ßꮞÒ]¿#t8|ª×8ó .{ñ#@‡ÓÅCkü_… 8 p, ´÷Õ\J”±i¼žeŒ1–÷¼¹#¹?‹FmTÕ<5ê‚§1dÝ'žyé†NsºQ‚²I„@‘Á¥ÓöG§è‚‚DÁ®Ô˜Ýòåa0$Ò¸+/¦Ë&`–òPS6˜ÅTçâB\þ,ÜÉž “‹ÆõjnVã—åWxÈód^ûl+(KžÁLr.SÿŠ5=““©W8i3?7Yí,Èwu¶‘<@ #s71o¡s{ß':y"̨€…£oØÀb¢b°Á/ÁjLÉ”ô­ò˜(­Iy-¢4b¢• Oó´Éw­–.*i¦m¨ÑS6·P>pp1Mê­4€¤$yÚW¨ ÷ᙟvkåâs¡4ø#u²‹Èõ ÌôÆžã߈R0É S{ Ф€¯’r,K¹®tk=1a0Æ™„'lB'<á¦z ê™ÃL ¬ÊíéÛkHÄÆúé bKï ÷‹£6é9 Uí­"¥€qG¡;¤N Ú;Á´lµ7ÓfYD]dhÛ¦1þƒr±Sov *bÛZ­¼¯þ( {I+÷oR! ‹-ŰêÒYFrâœØ‡&íÏÖ˜ §ÏâÏÀ3ˈÙƒU¼8Y æg°-ÆÒenföuj'7-Ýd@B-F˜ç’¿.™Y6¦ë˜ö\Œ¸õÔQî þÒ»vؼÕg$ÎhÅßCÔ3\bbM Ž@á/ÅkzËp«&s£—§¾½9õ²Wðf^Ÿõ=Þcñ—â§Á–n“äÜ0VMR»ÑçI ¨éá€\òÅ€0’Iô,©Äh³ª«Úûˆ âJzHÎ᪶+S ·ö¦1®u¿ÀoZï (ŽËL‰p¶>#ªŒ–:œˆ@€™DÅUƉe–K ¸8HkQÜ)ϨÞtÉñCsjÁtñέ•hžÆøà²,€™a‘à@à™ÒJ²Z7Þùzh:e1ZåK"a9ÓÉÎŒhm)’Fyk.RfºNÎÊcYSEéL2¨í|£~£HWJÔ%\]X¤™z|5u5âgFC¢=h˜áTP­Ø‚±cM•›Ç‹,_=V*€‹'%°`xlŸ–žsÑJº|'Öêk¡Û— *+–ë‘«€6fçáqL½Ly&z‘Õø ¹W«Lb\u “D^×Fšh¬¦ö&¥Îê[Oi¹–ð3Ä@XX´–—ÚÑØ°±èž€É#RÈ.¢¯'þ¬ü†¿ÜÖp†Kå svâ­ŠÍMÆ%ò˃ÈÌÊÅ0@­ç\v°lÿ€ßCx¡Ì¬PÇå½§«6‹ 6–l±?œ•JŒIEå{lÔ{ðŠ«Ðʱm²@ дsG‚'2!‹L$M$ÓÞâQ6DJ–pߨ宕Chœ5§èmU„–Ï’’uc)ü†03‹¡ÚÓÇG´Ý$BW8±Š2ñS„¶'}SÔ¤oŠZ¦ùTLSïi> á5£¦2çñ!“®¶€V¯“A‘›&‘á'%*Øi8“Ç#©]¤®Ñ—?øÛË÷Eý•D3ŠßB¦ dA Â§ÆÆ€ZLá2 ‹Á–]q^6@Û§¼IyÅÎ…Þ˜P—Ëfêvò˜™I<á„çÕ+ÖîéãާТ+îØ6{gûL¦}îžÝcÜál§öö›~ÒãeLƒN;|š«Î›5¾§‚#8Ávßwþ=> ßcм¹‚¹À±áU<­EcÃOÃëxüRf®+wH`À/ ¬)ó4|ÏIœh5=%xFkx%yOô6õÈað˜Dí*0Ât˜ÍÅl ß3Ñõ $Bñðô݆®÷UïmhtzÚr+°êM[cÒäà™žVÂ\¾“ì"ŒhÁ#@Ø'—ņ2í˜Ü³DI,†ŠI6¬H¤Bé·å'.¹×P+ë)"ÊïYÎ8mqÛ,Å©¶ó¾×¥ÌÓcÞg\4Ê4# ¸Œqy,æ%†Å¶–+Ý”ÆWàhXj¸B̨ÆExøÌ@Np8£6$ØB—(Zˆv0®hÊBÄÆ?³T*º(ç¨pb“(ÖÐÔyk˜7Ré} oRŠ€è§Tgh—2Ñ`¹ÚVd‹y1Eü"¯ètÉêˆÏ`§bzIVN}“LÙ ©Á†G/ˆÕZ´‹2W­¥ÿÖöÀ–eOdNÃZ=0ýmÙD&Œ†¬/£‰AC iÀ%±½FôÏ6<ñcŠáÞkÎse(ÒsepR‘„å"˜b×OåU­§£Rgn¯¯n~[õ‰,åí7GsøÄ™Æ1S7F"ñ0²ŠÑ1ø´½ AàÀB ªzáŸfàú`fø 4ÖÚz;Œ"8Ī!"V9ùA¦Ê=ÆÀyLc%C1tÝû.@D•Åúœ.*ÙŽ »FœGÙª¥•á>´Èœ­†´hM˜a®¶a“Úû;’Æ3xú¬:"7“‚—iÉ2hÝÖŸ¹\R×èG ¨ ô¤©øÒŠCÐ v‡H;&®>eyJ’°Ý$J R Mœö†µ¬yA9&øY–Χ}[ÔÁ­ÛÎ×µ›wÝDå%ޱE$PˆÀ²ùÒÏ@ÐÖAK^ü ×<Ã5™•ö”Cùx™Ö8‚ã(LƒgGÁQ™@\ˆÈž/aQcÃÖ÷Mñ ±lÞe µ­B2@†öããGI)f›ÉVá¢Éîu >Ž\,yÚVO³"Œs¦ë¼ó˜-œÇ¨.ÜFàîh†-lÅ"IÝÓ‡D”]½Ö'dí° »°®ÉZÝÚË” Y«]ÛÆ÷£!Ë?¿êàÒ³Pà>S"·ƒ(+ƒ8¤oÀ–Á:2E…LÒRkíÛ¹›g"yfÍ­Ÿ‰á™fªLØNW’¦B›q΄›ÚgÁÚµšB&0pÌ£ ¤3¡TíÇ\x˜,ßó)µ:¼†@m¦ˆúåû«¤Íƒ œÓˆf $¬êç6>Vº ìàÛöòû¹°èŠ[²z¯'°DÛ¤s÷ôèžÑ€ÓSî´ªªgwb¦ –´gÚœ™3Wrqfv¶½mg2'…a>ÆC´I&ÅôAéÓa,È•îšÉ­¡òv>Ly{Äò’ŒRPW}HwP6$‚¹¬ÐK™j&ŠN"´.ìíG,¢· ÓÿŒp+ÆD¨->‰F3§<\fz?3JQ9-[—í n¬6èA˜åx.:´òŽ%ƒªÒÆS ŒìaN¤l—Ó5Ææñ¤ˆZYTÉ, ÜHçár¦XâÚIFÌKt½O¢±3@aMs{sF8ë˯“鿲<©-µ¾.ØTi¯¼fÇ r260ˉ;†Fw‚µpy—^xá*Ah²5šÐ$Qß¹{ð:-¯%ø1ÕzÌáf´×•«Œ™‰tªõ)ü ôø”t~#rû®6E#6yֵ̩Ä\!gSênV àˆ‹’‹Ë—g—„ ~¹\ßÕ¡¬É,­Sºªò}ÈØ{©c“™@Š€ôs;e[L¶\¼Ñ²y4Iè«®ãr žqMô{%óâLl\œŒ bkÑ·æê&Û-œŠécNÖÉ*ÍEï•§mp®õí-Î4g&dj®.(OO`Už€,Õœˆ-ç–˜°ªXÑCpoæÚd‹Š.EµºÕ§Ÿ,’ñ* TÖ“ñ˜ÏipSC/šÎ£ÓZĤz$;^$;ß5‘LUež}w6¤N‡LMÙá¬J½?<ðĸxñƒ¿½|˜Zil4Gúxi£¥M%C,E&’ü´¼ŠœñC„ö$Bi̶cB¥¹Ê™B*B5IÎ,£ÔÉíd¨ªï<Ù÷ o)¥ÓI’±º"œ˜R„€Ihso;ǽ{å](=ìâÂîÅq Ký‹gߥ‡Guµµb·PÇÎáßÝÏa΂SúíÖ/,˜ónnÊÍà+Uê`“ã5—¦óœ9kíÌ´œLg=f\NLçfzżº{¦ñ×ý½ÇÜÊÅÛ›ûÒ‰Yê–[”Öߊ8 o.¨¢áãÛ’fæ3~¼Çípõéíû¶e7ÜáïÈǑø¦†ß„·¾oSÃ-WBݲp¦ËÌfwÒÁâXüTb.ìøÅ§Ÿ/ÚcÚéüf ï=<çÍý{¯­ÌÞÉ­e›_1Êð¦pþ¶ûöòÿúêA” endstream endobj 4340 0 obj 8852 endobj 4344 0 obj [220 /XYZ 32.2500000 784.250000 0] endobj 4345 0 obj [220 /XYZ 31.5000000 785 0] endobj 4346 0 obj [220 /XYZ 32.2500000 644 0] endobj 4347 0 obj [220 /XYZ 32.2500000 491.750000 0] endobj 4348 0 obj [220 /XYZ 31.5000000 645.500000 0] endobj 4349 0 obj [220 /XYZ 31.5000000 492.500000 0] endobj 4350 0 obj [220 /XYZ 31.5000000 400.250000 0] endobj 4351 0 obj [220 /XYZ 32.2500000 399.500000 0] endobj 4343 0 obj << /Type /Page /Parent 2 0 R /Contents 4352 0 R /Resources 4354 0 R /Annots 4355 0 R /MediaBox [0 0 595 842] >> endobj 4354 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F8 8 0 R /F9 9 0 R /F1409 1409 0 R /F1699 1699 0 R /F1700 1700 0 R >> /XObject << >> >> endobj 4355 0 obj [ ] endobj 4352 0 obj << /Length 4353 0 R /Filter /FlateDecode >> stream xœí]I¯ã¸¾¿_ás€ñˆ‹$ ô ‡i ‡ ‡`& ™A:9äïG~¦ýlR_I,)Ùæ ’îy|âR,Ö¾|ÿûþºûÇwßøáß»ýŸ~xiö}ÛÿÙþýîòÚíýßw½kw?þòòm÷íåËË—ñÿ¿½?øáÃÇ¿ýo§wÿ÷óîÏø“ÿ¥Ã/üòÒ«~üó_¯½ÿÖœÿ<üüŸ/úÍî×ÃŒ§åüf®ÿû;­L§›Ã6f–þör:¦zý÷¿?þúòýi«XÝkÛì”5v§«wÿùÛËßÇNÓ7{×ùàß™‹»×Åûq]«ÜnbåÁ*Õw¶on9b¯Ë3N¡‡ñµ‹zýWfz•aò¶uù&ݹ8TÆ¿(zöÌh5b D+g2½níÅèÕ:§Ç¿»=þsDÝ_×5´îë<{d¡‘oò×Kå„hpò¼xæš“¯¼+›¦)@8]kzãÿÄ‘âbú “÷ºË7ùëÎÅ¡âñ™˜=3ùr}?f&„;9MŸáN¥óÇãÎÅ¡rºp<{æ Toü…·Yîä4}ŽÉ[qò׋CÅ_x<û—”YðVŽ?ŠÃ7âÃ÷__¾ÿ<²»ûú÷qg¯ ÿø:îZí¾;Hë]»ûúÓî·M£>þn÷õçñ4{cÍAŸ:üÞ눶h¤é_Gº}×vºm.¿y¿Ð7æÓñ›îí'ÎòŽ|†çð³ÙÓÒç¥^Gúýà‚o”A»mÞÃÙ4‚Ï®=ôû½ÑNco³AàuÔ'8Ò¡à“âuôqäÓ××oCÓ‘VvSh:j²45ê ÂãU©fßõÊõm\Õî›!@‰#2Úý€—¨OC!‚M}s”{ûÁ¦nï†&€¶E#†#ËVpå^G̾µë—4.<שÛU¶A¬:ÞðqÃþˆ†—è6 ‘æ#QàHgƒß#ïg¾ÉøHä"€!F"ˆ¬ž˜§¡$ÆÀw!6EÏkàN,ÜI ñšqbkà:žLN­½,¼Y¸%…¯‚Ë?%eÊIíuH ´KGdñƒ³i/i¨ÓGÅoÑK' `Z6HzBÄã=ýT€{ôí_:{Íq§Èýê#¦G#²ÛÀÙ ÜüÆcÒÔˆ†#x¸k|R‚éB>ËZ§D…wpXˆÈÁö§ óimLÄ# ‹e ¾S k¸ŽÆ°ÆBÞêX…w]XÌLºSƒiÕPz;³ü¯Ô›œís¥ª[Ù4õƳÁÛ®T•OUm£7ƒ—•ªžm²SX±OáW ÷F¼3†üTéúÆ©*–U7ŒU•®ß@×µÚ õ®tœ ¾3Űh| •F?]‡³•ªJ£o Ñv;X^iô¸kŒå˜àuª´\i4)-ËbU¥Ä7PâvØ .WJ<îã|›¿tüž9ß04fÕ¦Ó€[Ñ9ïîZ–l™cÉ÷>± ŸÔ`.Á€›Æ"Љ›ç½Û /¨\‚ò3âWËÁX…¹Ü!%U½`Ó\‚à”w‰UU/¸âýfèz¥øÔˆH>Ž {a«}ýñ(>–°WǪJ½ùÔ»=Œnÿ+õnN¹£I/ËBDäB•°ŸˆzšBXUiô 4Ú´›ÁòJ£y6AðÞ¹•zß+æHØ¥°ªRoD½gª-´CDû¨ô?x*ÅզφSƒ‰´X˜£M¤[´>NfÁ“™¿Á)ÈŒ“F¹íD~1>`T¦" á8}ãÆ;|·œ<²—ö”Á}Ûk!N jx$Õ D¤øãÄö£‡Ÿ/úBLÏÉ×ÇYìæ#ãâðeã sø Š×ÇÓ2.¬ƒOºf­×ÌÊÇb$U60o .ô EO¬Áë`2ɨÜA¼QÑC‹õX^RɃXàYÌÔu댻^R¨®›ÂuÝUϼ§ô¢âÛY1Ö[ãÔ‚ÃÒ¼>1U; ï ®Cœï€sR¸kÿ¦´ŠªÇÐÁ•åp¥<\§.Gu½üZPw.K€ëÇDŽ#½aÒü>ä#¸^Ñçå,‡#ýrÊ!ArKÈÒe‹ZÝXçWhbÔn"Ð^–S îÄ@D 1ÜV—yŠÔ84¾¬ÙE! jдË1@኉DÈìÜlÀêL}#ò -ä[fíkþàyqÁÚ!8žÔ9Z®É©o¸ÅÊ« ³ Aw1ÍÁß,7¸Ü®¨ä+6`BNÃ2,r4¤²4{‰1’ØFÙ²ŽË¤”Æ\J€"€ÂÁH†½Mö­ ‹ËŒ]³ªzrì”Ù­wƒV¡H„Ý9ضŒ±%b¥ˆSøÞY¥„96­ˆÐ$pK†}ô®kOÁ¿ ŽÕ>Áð /›@|YÒòúÔÄ â[çØa ]V '@ÌÙµ,tòTdvbuÀ›…³y¢™ßÈ×7&'&d<@¯‚pD ŽÍND’¥ê„îÃ÷KØúqZÐ÷"º?¯_câKÃOÝŸ#ÙQS mø¸Äü^sïùì÷Ú ¹‚CbžG½ª–“j9árŽ'C–7qä;ÆSµ±¼S1$T_Vä$¾þ pŽ,øºHFVØŽ<0à…ËcðwaBøf!ëZìÇŠ+G/®žæêi¾+O³kºàéßµ§yj6œlÁHà ÚÃàC-v‘Ø >X5­Ï$yÁ‰ºe0Œ¨QkÁm54€I~×¹jT¸èec³%]{U¼îÐð½ï;wè¼ûåüßÃÞ¹f×u‡?z¥Ž?íÕ®kOmƒO?ùñ¥³{¥íœ:ÿ–¹šÅ\®1þ¾ÿïþðÙ.øºëÂ5ÆŸŒß\ïäð[îjw½Æ?_Þÿ&'q;ÞDjöF$¬1Ê bÄç$küXpʩʎÎ]Âç\XÈèï2[˶è<Ú×Q„îÓú’ÈòhzkBrÇÊ0a·+K?+r’ÓÊÛÙ~Áwȹ+Yèú„©[„©6ZÍ|# w¸@îp“rÇÉÄÜ1œåw%w¸@îp“r‡‹ä7!w¸³Üá®äWVîÎ8‡5',PÇ-JçVáÁ-V €m°³¦WÏõ&öÕ¢ *6¢1Z*Ã(ˆ3Ô›ìOkˆBþÈ_XâmÍÚ¼lJb)Ô¼Ì5¶½^2{ó2¢­Ù7/óm¹“ â£×”‹w›}áa^ä›:)¾¼k|RÜ¢ ޳AX«B-œ]sîŠia gaR†…WLbpßU,ðrJ×IT¸æXkŠEáJ”^Ü`ÅÜûjð“·ô>Ç&S, jûÍL¦.ìIZ>dîhæú€å±êýTŸ¸!\WÈS86 *uD…<¬ÔáÙ°’º®K³u6#v\În5Mÿ,ä$tclÀN;Ñu°í[ò» ûcÂK!ò1²cS¢öE,¢žRF ÂI‡×{Î6äø„ù°œ†ª.|˜Åú-GíÍ\Äš92k5Nâø!JYD"# $T¡gÔOà¸Yá²UÉ_ðžnPòó›å”Z@‰°–Í xw­³ç¬@dtp#o 2næ˜YÕ€.bÐ:\Va}‡B#B‹µä"ðö ýÛÁµÜ²¼‡pY¢*'…‹Ñ÷Áß^^x›6$$D&Žgäሆ.Œ` NL8qñÐÇ2M—Hš¿4”‹ÍF oPVBeÖ â­—Ý O3h>)ìlø¼R(š’øh¤ð¹íÏ.–Í ÕÙqÊžÃΠÒKØaEëÎÅÝípE¿å…X–çõ+aÔV|)Ùµyž"“9É.gŠBd)rB~±“‡#bDz̰€uî$¸Øn±­\n;îoÛ>Üìïß¶¢¾“ÆØ…+ OÙÊq9ÂŽ|œy®ø›œùI]øŠ‰6bwiŽçðvÂgʼnÁäXF±ÃHdÙ Ë×G¢¬·ûò¬°ùþú˜P)s]?MÁ²[æ9µ{Ë„z˜¶R×ÅJ‡ø#ç•ÀwÔépYo¾Î¼¬ —å ¾2â¹LŠÛùb7D"~©6<"z2GmÂes6lý«93‹„ƒÌ939„«œFøcg“K‚YMƒÕ4XÜ4ظH¦ÛJøn^–®”5ÁÉ‹$a(Õ†ë>Rè1¶A+ ßç]4Än‘òÕÖºd’ÍÙZ ˜ã]7¢™jûpëEl .Ø“°ゃ—á:6\ö‘˜ÙÓ¦ ^ÂrΨ}[¦~ +Ø Æ‰Ñ]7óH;šì6=„kV§Â†S ™Þ€5Ã4³}b§BÓ?§$О"MÞ7TDFh]¸¡'‘:q X¦òéÙx¯#}¡„_«7á²²¥D7ëzê](¹(.9DÚºžrf?ÛH¼ç;µò›%ô¹ÿpÍ˜Ž˜j͘¾d͘®ÓóÓo…ÈWæ‚Æe0ps©š1MfL¿ÝÕ¬+ çn|ºô/z̼ڼYç­¯™‘¦’R¼ ¤Ib-È¡ÚáÙîÉ÷ÄY_ÛÍ£]¡Nöj!P˜fáè9F•jV£uñ³*x‘æT£ü6€â5M7/ÁÎìünúðYñ1¨Æ…ë>‰“Aâ "…-w”[¤|<”3€ø)âà׿ü:I>ƒZ{³„ \«+#7À2û›=Ù³EÉm®ºb›fïy‚Õ·ÁuÕŠÀ<ªTäI›&zÓOPnØ´.85‹ÏIÊymwÆ…/°Ýa ¶êåï\íƒø]'Žã­aôÈ‘°—ó㺶Óâô샺^r¢±¹¶hÄwªû;ô ^7w÷Àh/oÞ§x¾9âcsýh.‚ÍG_ãÆï'BÜÈÞhí÷éðñìHõ±#µƒßÀøvõI#žúãoò‡$Äñl©Û™pÕNÕ>‰œG£À)7ˆ½t 6±GH zÑv ëß~B§`Žç€°ˆâc$˜Ùe£3°Xçh(IÆ©È Þ\,f[SLÝ ¤)ó‰ŒCJ¸m§üÎú繡rë‚\þÊ#ÓyÒr•»· 6›2ŽL• ƒ"Ü 홹cBPÓvH+8{õ¸Ž ÁäH&œÛÇ9œ´>ˆ ŽÚö´äG¨`ˆ¦7ÜŒ?Å5°a9…%pñž„ý|Ò·¼¾Àšû!Îc¼"'¾(Xà¡ç‹árÄÔc+ÕËä>¥éˆ2Ã2G2à—Õ"ÐØF×!ÔkŽÕcõ¾¨)B 瀲ÅB¶*&e/‡H`ÀÃ8؇ºâ°ÕuÛa m¨Õ5=Ü<¸Æ Õ³«¥ƒËz² ¬/ޥѕÕ2š“þ–`£bH)ý L{ ÇÐb1,Q· ¶˜$€¨äÏ)2K4É"$ÀϚm£Œ'[©ˆ-Fþ@Nþ+‡4Ì /ù-ŸV=:=|¸x‚{²€Ç` Žæd¬Ë"o‚΂'‘I”UL󘟱$•è-•ÆÃ;Ë©¥pƒž“/ô:d ¢¥ð¢B‹„™†U^ÌehíÉË˲£r–ÕƒìדZ_ÙÝ€ñzy…MŽuŒ¸dQ=¿š@ÓÄ Ù°«- ¸[M°ÊÊuUÀU8!øÚq%äR!õ¥ü\0®Éœÿ& [ƒ#ëã1fU7®¬X€Åïíp'M ÑñÜyÉÒ±R\¥^á–9Ø>œ8e6V¬O»ðÁáˆ.ÂíøŽ`_¬ÊSK}#ÚØ†Ä±=nÕ9‰ß["s§%ìô>™UŒ³X5 »ßñQ|R<‚OºâóÓ¾ÌÅ[X+õ0wI‘<¦hQ{TÊND«tŒ<ˆ¹9! ay õü¦”o’ñX‚Áðtn±ìCva½‘ÕÅñf1 1ñ,oø:rØ»Œ&ݬÓBHÞæž²¯+Æó Œ³Mïzy—sNi‡biÄI*•ŠV(RPCA¾+QÌ}ƒÁ¶¨ERv"ߣpÑq†Á‡èN{9sJíãuŠtyö·å†n‹3‚s±q!xƒMz+¦C¹€ëyÈw+ yΈ,Μ‡/ÛKc\Çpp™ó ¤Vèpvmðýˆùpà¿î7ƒå|ÆKŒbÒ܉í6ù ܉hG,³O1ß#¸>¤Ø¸¡õ£ÑeLá8 ›8·MÜ)^‡!“bºAÈØY÷ƒ1ßOI>Óµ³ûY¤”n!LÓd¥ÃJ!+…§Å4˜õ)1†ÁÖi´³·ÐN(5{î"§ëS9ÃM»¶°5'§­ ¶ýU*ßT*/Nå[Qw«T~&j·oOæÎõƒYˆàN»N=‚„àNÑfN5žÑÊöÓØFnjdtŒFr#z“92šˆGáßô ÞŒQ³PäÀ—£Ò(+¢ê+Ærü2rññpb&ž +׌·É‚h)üÇt﯃ß3ÇŒÀÀª’Æ?×.¸ûR#²8VJbhˆXà¦;WZHG%ÌAœ4ôBf4–^‹¿5P¥]é ˇ£¢ÅZ¬sTêp¯ÔACŠÊõî¦@`Î{†ØÇ*]°QnY^_ª~žûñšu‘w6473ÞDz„qŒð”`ËÐQ ¬X]K®\¸VÝÀí˼g} V/É­‡·ŠÏf¹æ:ÐfJPF8a×|šð}t I9Š#gaºÌHܲ?„•t6T†v7…lb¼¬¾œž])¤4í|4›xåMËh)»·,\bmþáÌì;«rtóxrôÓ¤ŒU©¼Jå…©ê0ž*ăï.€I;õÞ0Vû`8 E¥¢ÛK½ôª>žXù{Õ)iNYeœçÓ)×–‹ìü ¬ÚfSµMr¤Tú浌ö–xƪeT-£j[Ñ2*½}P‰gègñŸ78Xœ|pF‰”-ÓèêQ‡Aµ'l¢ëÓh9ªJ—°T{6®—êQKå¢uÌ\­ª©½}ö':9yÙw>²¡H€ûvñ=Òà2]¸9ÜÄ1ž ~ã ¥J:zÿ†¶\„;ü}Üñi矠H ÏD †D5@ò.¸èèæñ-*Ü8Ç$Øk5HOà\GÁgçÅø©óà“âuºÛq¯oÌÞÓ­eHHŒ\ðÔYâüe÷ååÿp²4Ê endstream endobj 4353 0 obj 6451 endobj 4357 0 obj [221 /XYZ 38.2500000 244.250000 0] endobj 4358 0 obj [221 /XYZ 38.2500000 244.250000 0] endobj 4359 0 obj [221 /XYZ 38.2500000 86.7500000 0] endobj 4360 0 obj [221 /XYZ 38.2500000 86.7500000 0] endobj 4356 0 obj << /Type /Page /Parent 2 0 R /Contents 4361 0 R /Resources 4363 0 R /Annots 4364 0 R /MediaBox [0 0 595 842] >> endobj 4363 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F1499 1499 0 R /F9 9 0 R /F8 8 0 R /F1700 1700 0 R >> /XObject << >> >> endobj 4364 0 obj [ ] endobj 4361 0 obj << /Length 4362 0 R /Filter /FlateDecode >> stream xœí][ܶ~ß_1Ï2/ºEÄöèCÃúPô¡pšAÔÍCÿ~gw¤Ù]j>Jüæ¢4Œ‘¬cYyxî×wüü÷Ã?;¼{ÿù?‡¯ÃÏ÷Ÿªc[WçO¿¾{ýº;¿?´]}øúË÷÷‡OŸNÿýöp~áóû?Ÿ~÷¿ƒ>üéôïχ¿þíô‡?éé/üòЪöôóßÏ?ûV~W]~>ýù¿þò»Ã¯O+ŽŸ6óöÿ¿ÓÊÖ½zÚÆÌ§¿=ŒÇTÏ¿~ûúëû3¾bu¯:}PÖØƒê­>ü÷?>0._;k”iumO¿ïÛVuwzáD3üÃ~¼ÕÏ_oÍAé¾:˜ZM>þüKfù‹×:ââÏ;‡Š2ò¯ûÂë¶.ü½w2.ãNº¾ˆMO;‡Êxáxõco•jŸ.úVr>Cß Ð×¶¢Ëòòð7•6*Þå>ï\*ãåâÕãR³©Le‡ ošwrY>Æ…×Moñç‹Cå|á¾Õc_x_TÒÆ¸ïËê®DUº‰wßÏ;—ÊxÝîâŸBÁ;9ÿ P2¿y^üáËûGe«ý4‡/?ööüÍó/'ԇŒþôôÇÃï«Ê˜?¾üüÐ][{ÃO”EO ܵ©áw0Dá­ˆ½A<À»ö@Þƃêûðó˜óy>~9^lšÑªž…"_Œ}žï@XUð–cÊÀO0öáÆ;оÀx8Š,DSá?æxø;˜žá-hÌ…¬R)©ÖبVø‰,Ž´é¹aŒð £`èT˜Câ½a,ÿ@¼Cp!L:ø¶…õ 7Hµžw özN !š”Ô¦ð€Ûxƒåð;5¶9 wØ*wŤܡÕëp‘ÓõètJçx"½ÆäÀø f~ÐÄÃO<ê&ULBï œ6½s)I-Ø^¥–\±®àáK›ôú¬o?ÞÏý >¤$tfTj ‘ñ¡bÃø‚í:ì!À{ó`Åêþ ¢o¦ÃªôÚ4ô¬û¤µ±ÝøÕÅh„¥V1GÀpc<ø¢ž÷æñÂb)Šm,HuŸ‡N"-G1zæËÖSVÆ‘?Ch"9“’6í Ú”/‹„OçQ*Ršwî-úS¤DUC¼Nµ·(RbmùÑí5שèѾóÈʶmÊœ¢•­<WµU¤l8|÷Ðl*‚{gŒÂ1B16 NFéÅ ÜŸXä{±)ý’²è8÷gS®­Y3KÅÚ¬Šµé}b¡F‹y´GN1ñï<¬Œæ–ܼbe+£X¹X…ßîSã9}z^ãÁú“…!OÔ¶m€GÇÍתr.2M.´v?롎?ΚˆîO"ÉÉÄìÀê1”0(wJkÛtmýêhgñØ»¾zÞéËÑÎ`7ã+Ò-Yäüa{´æÜ‚/2Ô–\[¤%–·è‰g³¢;Ìš°ïÀÕ^­s‰—pRèF¹–½ Œ“/DzÁANékªKr2V\±IH¤œ3.hü†UR&îêbɼSæI4ñ8( WŸl j¸¥¡M=&ÌnÓíá„"åq'ÇaŽC\æG’þ„Cd,„ŽÅ´2wä4v>Qò~‚Ç©x'@‹9JJ¬hê-`Åê JrÆ<¶OƒcDZâL†cXº¥ÄжÚv*Eª{4Lhc“i…j½T‹o! ý²ÕzûÖ×$Š~™+¬*X±q¾¼~°*Íh_´Ù^Ÿˆzù‹÷½xßW€[šé·Ý¶g}[¼ïÅûîǃ=zß;5µ£FEÈúRBÄÜHå÷ÝÀm…i¸s”æîëQ‡âÎÇîIƒí‚8AuÛ´º Ææë Iyí_:ŠÂ”WœˆÓ’a™ìN&?Ò“/‹!‘(éI†$f✹I}4ºSoÏ…3]'{ÄËãÝÃ{’o1¨ñ1p¢)< : eÆå– ¾ å ´ÌÑ©üfCàùäqS¡CvÂ,‚ßé ÷ H’&¸Þ¬îÂy™/¢ÎðOQ™e»Æ‘RÙ¸"ŠæÚZçÔøRõãb ž”à"F`¡>„Ò 8í ³D L–©¹ ~RûYÔúu=øÂ@â½yÞ•¢ëCǃΚáÕ<ÄNàVÖ<0 v@Á F…YDvß«Þr?8Ì«Œ¦3«ÊÅê}í õgÉ!ÎÂxbe÷Æ´:Iáœó¡¼$¦Ÿ…†ªŽM«Þ°8Nì‚·z4Æy³ML"Y.«oÀÆ»¦Ÿ1ç™°cáÎødªˆ7Á¡‰Ïn6F7Þ™µá1)ñyíœÐL©ó@G¦Ç£´Üô¿Á»ÓÏQõŽüô°xøò<×*ë¤Å„²<ÖÁ8Iìwk›z±ÔgxÞõ÷Ë-ŒâØ•MÙ ¬&›§ Žšg=ÿpZPeÌ*í§¿&krº“º™½ÔI`ƒ†H{dæÐz&›2iœØ¤ÂÁtÑy…“ÎqZ3{ãÁ‡„xÙÛÙýP©å¢«Q.’9:K_¥Ì< Ëv%Ê=<Ó Ñï;§dç#c׬{Ì“¶Ë¸ IŠËæ–nÓþc^<÷$ DjuÃéRòyÕæ%wtµ@G-Lj &¶[útñÍ¥k´cw”X„JZ9‚v ƒý; Ô§êcÕ›·;ø®6äGèñÑ‚¬ïæòàáð_? ,›A3uèÅͬ›æ¤)˜Éz˜B'[Øv‡DZɬ0¦d²ÚMžœ-¼O ]œÌÜ<þŽ+^(fèRª'ã {H1ü €°¼ªAôÓm˜”° ‚N¢Ll UŒS4¥ëC·°'êDX[ÊX¿Y_"È6Q÷¬†yNA XâÌC"NæA&&ú\À3yдŽDÝ`šßX÷[v“F¼nUYå‚J4I‡á¡RÕº¨œœÈ¾ ¦ ³Î-L¦XÝÁˆ8aCI4ÑFV¸ý'pIvfKámÜ‹à…y`gTÑ0 2öe±û¼¨Yì¾;²ûdÚàz< ”üó‡cʵ^ ¶;Rº±sà … Z·s‘›6AÃ2u¢J5­u¡»3õ>ç›Â^°—+Oê1¿Ï¸ú •xŸØ}gÖÙ‘f»¾qh–J#)úvÑ·SêÛL)¬‰3Mˆæ !1ѦG($“$3јK£Y¢©{î«§ë™Õ¼rn¿íAAh¹žë0S’©¢ZkîLÓ†¾SL›8ÿ–)ÀTÐ1­$Öoõ‘CðçºT*Q¹öÇðŒÇ0Vàw0ˆiì}7õ?¼fgC” WõŽJ´·¼.˜Ê^ª½ö¨Û—z¨éÁL”§)¦b˜Éúº #ð®SqÒYÝ, Ítý,=ðÝ!©_ªÞCý2ˆ~s0IÅi*õ–èJãÿjÑÖ ÄÎiĸµò³Žü‰Ö”ÉÜàúAB1˜ÌþT!)*äáöÆŠ|ëÔpÜ[LÃsð‡9 ˆ)ç:í:O²vþõh‘Ó_LíjD³ÙŽAØèÀÆÑxç¾[B4mïÜïîÄðöˆ®­;¢KÜ,fƉv™P‚,톧j™‰ì»FÏ$â®ÄzuÕ_;£>'ò4V¿ý¤ªŽg¥é­XôdàkõQ»šÖ ç\y‡Ym@Ú+ï ºŠ2ÇsË«Õ4\íÌ}T3ÞÙË;î­ºXÊN…“†Oð®+üB>dïµ<ά–ÀÙÐ]„ ìŸQã’I“v¶¼ïƒG ÉÚ£¹$ä‡eÏå×b˜©òóhUy—·É ~*Q¹dª1ŠÂƒ3˜©“صÀt3#†‡0¤eœTÔ.ôµ#£Dj©<óИᔓ\'m…2ö«Éz*=èÊ(õŒë'@Œ%êÜ”l¤ëìà‚̦h¥oÚ>œÝÐ`ä•Ê.š0àI››YµØ¥w…@üÖ=•q¾е”êŽG(§ÉúÄ9dÕž=Æ%DU?âÓ:.Rf¬>¤B…T‡ÉÆÑ┢&ŽêN):öÛŒÏÖà y»+&Ñê1ÔÙÍ#ŸÇ!ÐñnýJß9Iy0ýÙ¯ÙV—¯âð"Q%«rY8—éÔ/_ˆÏ¦q K5}„MDzáÌ‘ˆÎ8`ô¤2Ï]wXÊôê‰ÑL©‘lª¹ŽÞTã$]&]Ô£ÝobÑ‹…þâ#ZóÇyO‡lѤ°Éf©ÆW8åuý ÆÝ˜©úQnÊa(2”# ãoeðª;øŠó"Ú^¹*ÌN ›å˜¶~oAÙžòÔÄÂ÷@5—'ÂQ U3wJ ºõŦHÏÞyn¿ºÜžKÀ(g©ZÐmI¢çÂVãºÿ¬#%e9v@>¡l#0¦v­]áâé§]•Ú¡–¨)5î'W×£“1Çüõõ hѪ·¡Uß+6c¬àÂk¢°è°nÆ¡ôùWb:F3}‡™ðSGPÂ`ûƒapÌ*†è2 Ÿ˜™ù%Z7C59‘µ´vfwÈzóeÚ¬$jJ„h"²SJµ®®ušÁèŪ/ ÙpŠ1ÓÏŒI-Å„$:Á|€JV ð®qÿ%Ù"‘Xºl‹‰_Š 8®>dSc\s® ´€äB!Ïš¢+çáƒÕòœFøÔ®ô­”¤Ô3,½˜¢o¦¼=Àdɹ âú“Òp}“Ù…¥`ŠL@º»€_²„ÍÔðºeœRQ`µúU»f¦Œ‡T¢qÜú†‡[d³E=nÛì‡e¡8N%аå6AÍIo“å­×&i-[â4ÝØÙlªw˜[Òü³vüªÅnD¢-©ÁÅ­¸¢HÝðf‰aExà “î¿5«b¼Ü¢‡žj‚I˶ÝÙ$ËŸ*>‹íïåÎ'¬à{"C›dß7¤åDNZ«CM8]fw܇—d+ÀE:âóxˆqŠY‚O “ý°,1Ñ%FÝ[WîC¹°æ˜û¦êœ}–æE óEÌë¢Í²OÛZz“l6Öîîvu¶ƒ56O`‘`£ýËöÙXDQ©ªq ¿åÁ^O?vü$•ŸžéÂLÌ;+Eà›`¡ R×úfÅ÷–_¾zÉö6 f0ú•=jw M.#•‹ÁdZ4 ˆ›}2ëêŒÚŠM9|E& +nÜ‘Ñ>SÅ7„ä*I 7 ú¸Æ Gí¡q§{yôнç½a 0·Ôäj&00ƒ0Fe§<%®ŽCü¢­Möʲ²öÊm¹h.¦×µqj韇ܦz1n™BsÊG)=,}à*$Ó«ihóÕܹN”õ;H–öz¸%™ar:ûÈPóožuNVëÀc[vRÜ֌孛±Œþ>>´òXéÇz˜ðŠNvß­„¿KˆØCmY¦¨ —Œ•øi>%ØAÞÊ€q¨³58±Äd•=½R#}„¬o¹æ¹îI}?~ YºIT-’3è©Kb ís@bÔñ4ô˨¨qk¦m3@« Ð R‰¹Œ“™©ª—¸ÜÍ£±`@æâ«‰êÀóõ’«´+âÖ¯˜ÛM÷ªºïèfZ¬Ñ‘e‘$gF°î¾žñÌ2Æ¡h* ÓÎÀóæV‹ê¾¯\[/r¾HŽ5£<Šú!¨D.¼šhFÜú¬@˜×øÝqPƒ ·&*„œÜ4±^cL„ôeü”Lk›qŽ.2£æ1"ã@bã1n—)çFж+¤í–1R²QÔÈã:è숅ÐáI)!Ú z<(¹$„w ‚ÅOÖo ²S?ÖµwˆÎO l¨ðX7Ï|§¸ „µwðÞ¼ötóÂpƒ»ö´²!h[ã=7'ÚƒL˜NáÞp£iŒ5nh}7<S=æ.³ORH~uúZ‘üw(ù‹Ôóî­H½"õX©‡oC?!ð-WiÔT½#íY5£(|ª:žÝd¹òdpœÕGíú¶uåüÏjø½3fÕ±îÍ[G‘ß©Ð;€YM'¨T5úÚR•}Ÿ^üvÆéWÉzIâëg$E¥ë7-ÜY0T6¡_¶ÐS?.FŒT€¤¨_6r‹ùÂ\"fJ›ª‘—s¢×4„ƒ¥ Žp¤Š~‹&2h¦+¼lùi@/¦n"jcj=ojá*Ò”!QÜŸ¨½‚¥gé ú<"õÕ“3Wl¦OŽ ÍÄsŠ[7@ß1sjøµ½='E¹\¸JѺ ëRÍô€`òÀˆvå ¯ß˜” :zû‚¶,Â=ý¾ºˆLõ<“0 ¨!û ðX|óø®ˆq#A'bÍWÞƒGð; ÷èàyðIñwšÛq¯­Ìqà[ËpöÉÀÁç¸÷áÓÃÿ=™âý endstream endobj 4362 0 obj 5553 endobj 4366 0 obj [222 /XYZ 31.5000000 182 0] endobj 4367 0 obj [222 /XYZ 31.5000000 182 0] endobj 4368 0 obj << /Type /Annot /Subtype /Link /Rect [60 146 84.7500000 152.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_overview >> endobj 4369 0 obj << /Type /Annot /Subtype /Link /Rect [60 139.250000 94.5000000 146 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_preliminaries >> endobj 4370 0 obj << /Type /Annot /Subtype /Link /Rect [87 131.750000 126.750000 138.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_running_swig >> endobj 4371 0 obj << /Type /Annot /Subtype /Link /Rect [87 125 174 131.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_commandline >> endobj 4372 0 obj << /Type /Annot /Subtype /Link /Rect [87 117.500000 161.250000 124.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_getting_right_headers >> endobj 4373 0 obj << /Type /Annot /Subtype /Link /Rect [87 110.750000 163.500000 117.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_compiling_dynamic >> endobj 4374 0 obj << /Type /Annot /Subtype /Link /Rect [87 103.250000 136.500000 110 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_using_module >> endobj 4375 0 obj << /Type /Annot /Subtype /Link /Rect [87 96.5000000 154.500000 103.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_dynamic_linking_problems >> endobj 4376 0 obj << /Type /Annot /Subtype /Link /Rect [87 89 208.500000 95.7500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_compilation_problems_cpp >> endobj 4377 0 obj << /Type /Annot /Subtype /Link /Rect [87 82.2500000 142.500000 89 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_building_windows >> endobj 4378 0 obj << /Type /Annot /Subtype /Link /Rect [114 74.7500000 204 81.5000000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_visual_studio >> endobj 4379 0 obj << /Type /Annot /Subtype /Link /Rect [114 68 152.250000 74.7500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_nmake >> endobj 4380 0 obj << /Type /Annot /Subtype /Link /Rect [60 60.5000000 142.500000 67.2500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_basic_tour >> endobj 4365 0 obj << /Type /Page /Parent 2 0 R /Contents 4381 0 R /Resources 4383 0 R /Annots 4384 0 R /MediaBox [0 0 595 842] >> endobj 4383 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1700 1700 0 R /F1409 1409 0 R /F1699 1699 0 R /F8 8 0 R >> /XObject << >> >> endobj 4384 0 obj [ 4368 0 R 4369 0 R 4370 0 R 4371 0 R 4372 0 R 4373 0 R 4374 0 R 4375 0 R 4376 0 R 4377 0 R 4378 0 R 4379 0 R 4380 0 R ] endobj 4381 0 obj << /Length 4382 0 R /Filter /FlateDecode >> stream xœí]Iï㸕¿ûSøÜ@Üâ"ŠÔ:À(TsÌaPY A*H'‡ùú#É”m‘úQÒ3IIþ3…t•E‰ëÛù–_ÿýëÿžÿò¯ó¯¾þãüÝþýá멺4uuýß¹ûó‡Ç\_ì¿Ï®Ïßž~?ÿ~úrúÒþ÷÷Óõƒ¯þ³ý×ÿùù?ÚÿÿõüßÿÓ>ü£}©{áç©aMû÷ßú¿MÃÚU·¿»ç?NÿõËùï]Ãpv2ãßମï¦13ôï§a™¬ÿó¯ï?ýzÝ€u£HÁ—g&Eû#ùùŸ:ý¹`辺ÉX£dS=3“²J0~fL«sÝxõ"uÏ’ô®tÊÞ»¹GßÁM°ó‹îZ^ËS®µæí¿aÿ÷ä²$gvÓj¶"lÛ½ÿ½×MJ€êçcì™ãÞ“ºjIéuÛš$wï?EïºNÙ{?÷øc÷žüÐMÕ\·sbãný§8Î:þ—ìÐû¹Çß{è¸÷˜Ì›óá’0ï{÷IΗ+‘²÷þÒ0oÜyj”æ-´(]™Ûvë?É¡Ô<å‘÷s¿1öÌqïí—̨ªÑþ›8¶înÚ!™dún·Uש±óãD;+Ä׃œ™4•Nufnß;:³vjæü8Qs 3K‚gSÀ°3×%óö¼Ì0Éc ]oǞןšý•þàðÆÞ?0î†Nûý·Ó¯Ÿ[Æ­Îßþܲï~¯}ûy’íΜ+ÌùÛÏ¿µû«ÿíüí¯-.UöÿÐ?`ìRK¥›ººµTuß"††{ S×N.ÚTŠ?¶ˆ}K}\³Q c×qÄÐtöÆ$l©`‹F³®8ú¦ºî¼Hq½¸÷†¿iÖÏã‹àí"l e²Ž3»ÅŸ¾µøŸÔy ãcX€ÜÃJ8€ O~C‚ ˆ‡I ¿ázýÜââáŠc À:aJöÀ"À-kÚn§AW´LÈ!Ó "_騆ûú‘nVrT–R»¨üq1åôArž@¯˜ø]÷ß\Uw,@²1{³ó,"ôv’ëÌ´dÝÒ1§š#þ Tµr¯C°àîÀ4ª@†A;À¨1¢d‡ÀÜ'ÏÄúqH§@aû*?! °R¹Š+xH±žøo î„p`$‰4I`²BTÁWÛÂ2Ë~ž£å½G-v_'Z,œLõööö¶À°†0ëÏëgX©D-vGc¤2è Y¥êiljõúUàƽUø|*,Çn1éŠïì\9>sC€ ¸ÃvOÒ"<㕇ñr£iRx:Ì5˜ÅîE1ÛÛ\Ĉªï]憙äø‚-ÁIº¶À©äª…ûÚÌN&°s”Ã$|“KÍ Hk®¬D¸2©$u ëÕ. xçÝ”æZ)]ºÒƇ%ÜW -×aÕE5lLßlÙ±Šòj7+Ûó_ÏPH²µ¬Jq ú+–Aa+qéd‘†6“†ÖíÅŽÅŠÕÙßü—a¤b.#¥ÐÂe&†u,À¨¢GÇ4IJ4¥lÒãòkšÀ^`+j\3&º†W;pÖ”•z(»ká‰[È57U˜ÀáSÁ§¿cÁ‘tØøwNPY–5ï\÷ÈØLÈÜÇ´vX€fïêlÁæZÜ/,ö$5+JårXŒS˜ c®L ö>·Ä Žõ©rmâËy +Ä+Nƒý¯¹Yü)Ž`:,:-÷Ý£WÎÍt}KòzÀs#8¨Rmn{1&$+bða½Ó•bxÌ&?gïäž|+®ˆ"SW3Væâ<Ó¾ ‹‹aÞ7ç"u0+I@½¹¨fõ×ôò2grØŸ­Ü¨)uØÂ?»SZ>Çm§Ü3SL¦(Åi#KÖh­è’˜?æãšêâ]—¢‹<ÿ¼ý–­«³RÝ_ cö©:«z¢ž|?)yaÌp­Ùí-1êE<ŽÑ¾oóî³³û5óÆ`Ý7ÎLÚ·ô¨=ãÇéý/OR ¨Œ¶TFÞ¤ç÷H–pcl¯Ç-PÚï ˆ|†-¢Ë`ó¨&ž%&ß,‹c²{#­‡!ý,°†ƒµYLÍí=lùwŽƒ×Sañœÿ=&L^8sy ‰xÖx¥ur½Vº˜)?­—ÃvÁL‰r¯¹wýX¬4†ÜD‚±|áIGzL±}%·ÔÔ•p zÅ5žg\ìZEň¹TO,ëÆEwŠŒMl„`ÂíC°ê7^6ÿåòRŠáÁðU¡¼÷rQœ¢=¼¥h{1\ov@Vg¹jMȼŒd.óÂXþÎåU²L¹Äj/ `96­@H<Ú½áå…Èq­–¸7l¸‹œj$.+Œ!qÅu$yýR$.Šï?Á8”'\Dì&COBú?ØÉ”ž¾Ê-󶬚5Ê=«\„ž a8 È€+ȱÿ¨AQqs~ìût`Ìý0iÀ“Ý\µÙ‹S‰€Ì hbUV\4FÍ¡¸Ç¹\³}ƒ>eUå²XŒ9k ¨û³¨0óOBK@îö\O(Ö|;IITé8âêaºIb¨Q]ž"û,O•p^Œ¬°ÙõÎqšå¨,*n‚Lø³N;\4n0LJ—¡Àüdœf8·†ÂT8C'Œƒ{ƒY¬™Øð7xnð1—?.i¨˜nœ£§ä ‹Íí̳Ô0ƒÝJëÙzJPÛ±çy@u»b«/•ãƒ+œ/E‘»2xcÀÁ‰)÷LqBÅ@rDBKúT}ÂfºŸH†à*éBÁSçäò# X_,äè寶êßÿV²lì xF”ò¯ŽF;ðÓÝðžQsåŠH[p`§(I5)W5ûOª¹êr¥Ä÷—˯yùõf#z¾‰ÄHu~-®ÔUãÞ`Î¥3H¤·ñ‰Š ¤—4½Éío'óEIä™*•X¼t!ž,¯71BÖ{cÉë þÀY \Àh®|ЪF•â27¸„RÜ«Pl+‡½á<ø|W”ø§-1$RJ&á3Å×§xß(¸€[ðzð)ÀÞð¾‘ö΀®·á²<£„ËòÀ à¬9ÞQBo».¶†)RTˆ?æ¾a,Á¥¾HÜ,y*«YÈê¶QØFDq,'ØTÖÞîÏ”œN*á‚mº”x‰­BÐãªu¸®ˆu ðšµµÊ5À¾¯R&±i~ﬨ\0ä‹®ÙAÝN/‡攦ò¤',Îb#4`ÅJTë{ÀYJR@)ß±°O1P³öv 65]éKyíUy˜á®­¥Tî +ä]V‚[r·GÍfY~?f,™—Í*ZVÉV~YßKcÏnHZd£<Áv°p¿ Ü3P,ŽÖ¼ýîP˜i\‹#¶ÐÅóð_‚œ†Ãb)£Á˜¸ç = ~Ó>åÒ,oTÝ:´%œO\D«aœ¹SȃN5cóT¶Üæ–ÛÜßÊmnxå6÷¨·’å6—¶oOÜæfbn·”´˜¹¶äͨ^$W2J˜2A*Ž+÷Å•ËIN x¥Ø6O“|Û °0¼o®)OØëGõó©òHµÑ£òHµ1å‘Tå–.Ꞹå‘ú·Ä¨ñ8ÆP©6ÍDy¤Ú¸%˜º'ny¤þ-=êEÇH_IUƒ­¬”GªJy¤à JA#K‚Õ.Q Y‘`ê&:jD©°D. \ g_ÌWhÿ¹R:ÐXmáŽ~;ȲðFª:§Õ•TÎÉ lZÚ\ #ùÀ9w^$Ó߬á-¥¸Ð„íÆ‰,juŽZ`á‹Zö{abYû NQ¨ q"ü –Iãx±ÕJ)¹JUŽ1¥;&%ÌçNĬfEl|ÜòM›ûlâDNÙ†÷mEæJ À(iޱ{”Œ„ÀûíAç€î¾Œ —®í@ÖÁò– -xn2= P¤ÈDŸ@{)ÒájK”««íÓxoY µš–Ë6¯7²=E P HQó]“dÆåŒ&°@ÂF®Ð%^-áÅö´5s`kb+¤ÜÔóz§]ß`ì“7jûšÇ1vQ%ªq·ë_xƒaÜ )”Gñ̹3¤Ý,>Ü.Ù,†aÁ`ÈÂþ₱wž5öÖÆ~é”S|ëA ɘÉJ;`‘#vΆ{]ª½ÌX5sN¾dÆJ¤GNµà“§à<­4EÀÝIi1ÍéðcÀÞ0±ðëØj^Xûœúæ3¿×rÒšò¿ÆÝsW…Uîƒ*5­º9>Ç¥Väu[È7—FšËz²ù­7©1ÝÓ(mâ/ãÀ6%Ù/Å m{~¿›h™ÔE«*WÖÚMB” Íj´ßÞeç (JF¾”öŦtœMîy 6s¦Au£¿P“‹L{ ø’i=é†NvSÅœí>"A×ÚYÄ[ ç|S…œÜYïE*ý½~¤ÈfnÒ«µè¤1Èá¡Ü£R4Ðûm¯…?Á¹$—?ƒd1HF5HŠÅ¢Ðò%l~q·½©)k%Ô†-(N¾o÷un&¥Fjɪ{'ëüqJVÝ’U7<ƒ’U·dÕ îÛñj¤.D3O< N“f€…T4„@RD Ϙ¤j Ø’ šE.N‚Ù+E˜"dÕ @v¶/"7ãW\Ñ,°ž¸‚x)"´ƒ"B¤¬ÔŸr‚°Ñ¢·€UÖ* « è6‘I{ Ì ƒgK†R‚(IÑq™QÁ¥ …‰ZB˜ šzVxÝ>÷R¦ 6rv$FúfÒ”җ墋+ æ'„"ËE!0 •Å\0ªÐ²ƒdu›C|’ļ« w'5…4…xâùÊÄ3S"<ƒ=×!Ú !ÌDîÄ­ÜnKòŒ³Öƒ9pŠ}Т†Q®ÈQ½&*+S%‡”—C¡8€ãò.”Ò­<Iþ™›ƒ )ŒÇG¼XWK>Dr–| 9„qXÑöŽ_È)GXéêgÌéYÛß¹½ZõØrçvÔ;·¬š„in£Øœ€Ñ‰`nßó%A ÛV)žœ››{âpŽ‹h$ocÂ)HdT÷ÊU9&Åy ‡iæ7«XO‹õ4ˆÐåêé¨ÿ¶,®¼bƒÿO!w…ÜížÜ•Ë¢rYt#]õF™µcäŽmfU™«®ÅU§I0x¥™HɳysÒµ«¯1{…¤WJ@b¸¥íhQþBßPä É” Øî°t‡%vBF‚ÀÜ(BÁª‡gcG(Ázqá:îµÎ|1Ö›œìÕðY +-¥¥´”–Ò’¿¥Æ¤7#bqnVGÅ-={ÅüóÎx™Ïx•>·¬“©êÒö}þyûÍ.ZWg¥º¿ÆìSqVõå:‰jxòý¤ä…1õf··Ä¨ñ8FûþõwmºÏÎÎ×µvÇhŸ´ßŒgÒ½¥G½èñ?NïyRäÐAîv,çncÊ3mŒU÷§w‘O¨å¾þ7W°šòV¼Ê§SÞy01p˜púffò¾ØÓúúqØ›]OÊìÈ•{ŠòÜ]œµ½A+ Õ¹^á[£“(ÙpW5õ§†]G±³'¥¶mÜ,¿çñȵQ¼\±³1²gÇ-¦Ê?;S ä½¥¸¦G­ üD]šuáéÝ¿9wH`©?>Ÿ’4VݸR$<Ô›LÊZª“—êäOrˆRq•€AÖ\K)ûÒº{®rß¹yñª1ÎI¾ù:áŒ]Ë[<ŠM¥Px)ÎóìBÜNðt¸‹º{®8°mm’pªδCÒöQÁ»,Úp€ØÝHzí›8ŸÀ)dª²uÀ}‚Õ¢í&2!upÉK)Ðçîÿ ô% i<(¥ÿJé?¢ì¶â:©è£µ2å8Š›eiÏÒØ (Æ…ÑÍU«íõ‚œÅÜ8¿çÍÙ‹ ¹Î°WJ¶•’mwò°Î4ZJ¶•’má”’m¥d[pߎW²mÆzËÍP‚£$Ú}N/‰v§N°$Ú-‰v©gúb~4%Ñn0Ñî+Ú^)?Àe]ƒ·\ž%ÑnI´»‹ÝÙ>_ÃNR¦ˆûpI´[íϧ$Ú ‘‡WL´ËeUÏoV1øoÅžA1Õ”[Là´}Û{ÝN.eI$˜Jº+¹IKnÒ¸~ÅܤRñÙƒ,$%¸Rj[mGKnÒÐ7%7)ÑC JnÒ’›t{Õlž¨•–ÒRZJKi9DKÉgZ%ÌgúKF¹;åÕ'´®o·C×¥My~B‡!n[|÷#œ93ëfè´À2å óŠZY™É g“áÀS-8K)Î÷ÙÄ:*(:ÕÆ9«l:‹+ß±]ùvw‡»XéõÒæõ£d øãà ŒPÀk?iOåÐIŠã9%‹f€~Ò§¾¡¤X:%,#óæþæR„JÑÄÍ ”ìáv>³‡,L[e_ßóFÆÌ’kíJ÷$>ã¥ÄÅáfx—3¥‚Ø>Ûøöé¨J Ó£¨"»Í5EÇ0gˆ‹æ+¤%wq“NÇÅ0¼‘kªTlŽ$IrƤÌZfjœLd£K® ï¹R%g»Lpç¬HõG¢r%JX9%EÛö¢9E3Ã4mM}˜¸v>Š>¾¹ò%“"©Øî(¹;W^òö‡×…mj„Œ¹$×ÏDI)vEÑ€L¹ñØ“IUqérIÊQ$š4ÕÀä¿H… €LÊÏA1/o–A³8Y ñѽpò´þyºvåáÝD†§4¾1Oc+™ÇPÚ˜›)•¼v îùæJð#kéRø5ò¤o—F<êid6˜¼/j)¥‹¶{\£D³ÏÆ’'5}I½˜ë%)*šÁkäì4“äO¸´Æ]Úöv¼È%ƒ»KEÕLrÑŒœî?Eýô/“(Õ€™å¯¨öž+ïj\iñPw¤››ÎßœssÒOµÃÏ~!„ýX±½žBqVhzQعï,å¶9ªÑ?›o…ÓQö10ŽäFC±1'–|H¾Æq9j.;Ùž­œ*³XF™«(ïÏý —{@õÜ'!fR„ù$Ö•ô6~ÊSvg{?á\8q$¯ŠÝLp²âf`·¢û`ÊõCvܵ ¶Ì×cÒL u¬'B-”ÝÁ³fÑÅ@¶¤ŒsòqC=±¤ R®ˆ j*Ť@’6– @:£~Éÿ“hÌ>",ICßsxÔ ³Åžâ¥Ú)8$›D`£(6¡¸qщrË"! ŒëKXÏ;÷Xð«SæIÞdô“´·äªö!nrË:5*+Ó¸+xý}EmIQÇ‚ž±ó¤+¶®¸°&¹/·®`>‰#µ÷*…è&‰HKŽQIɱHî:Ã*Q¿yz\7Ó"V-÷b&E@åÍw“u¹/Jžf‰IZÒ=˜åQéÆ8 ØAØLñ¡9h‚Àí裸ÄÁ§%!ܸ(x4éOí® 9Û’;cnïø@’m¢ðÚL>­Û%À L&·\Ú§˜ŽI2ïlyç(@Fq8€º"RàÐ B ƒ Å¡’_3J„÷öQ ÞdcX#¶ŽÀ¶¹Ž+Bh%¦Eˆ)ÌÂW½iTL÷UßâSàZš’)k· yGu¶¨~p=›µŠõ^5íÔ‡×4§NŒ1•]ÃaŒ{Æ¥¢û“\fÖpŒ¸Éovx¡A JL'«xÏ\F5©X%ba›¥b}‚ÞoT ‚¯–Îù’r|]¿™Š ä9¤G(™]–+̳BOÂ#âªqQpó¹ §\vl•lmù…1÷§0K÷wÔ‰5I¶WøOærQ«¸D©3eLŠØ÷¼ÆQ™r0n&ÿî ÷þ‘jX<‘í,¥#€tå—Úš†9‹x ©(57îÑ•T” 8ÜÆ^ø†yw0»˜©EÇ®`•俉I;àA‡3Úb‹ír;WŒ*)>[ÎþÍÕ»Ú)Jb¤¤Ó‰á1QB\Ÿt¦¯8}ÖL¥Íüaµô¾ôLj))Ò¡$µ øåŵŠQ|€âræ Ž¤Ð¶YKIna„$,…C%Ŷùê±ò$(¯‹\u3 zH;¡Ñ72šŠ> >i'è)D£Ø˜7°æÒ§Œ“B->Ôëš9»)¦öITÞ*n#üœ+Ååд`M&fmqšÿZíjÁã i¨'Æ3ïf¾éÏì"˜ ?ËÐÚE´Óü9üæÕEëêÜô5ŒéëS~Vý‹=6Ù'ßOJ_3\kv{«yìÅþ²c´ïÛßýggçkÖ¸c´O¾Ÿœ™´Ï†™_{¯ãûéÇéý/£=aÞž°eXÂVXÓ®ŒTóÚA_ï‹R…Ìï„ F¸ J»º~qÊ‚ «Ùヿ¾> „BP˜) ”Ìö‰„Ý[Íc/Ã/=BÑL¡PîíÛgÃL›G ¼±)Ê[‚cì¬E0™P´€”EÉ_5ÚwVþZŒ²£Q:Ä‚?“×êfè`x {Ðe’[¸ëŸªî ³Ð9<ùÞ~TY¾½%̨›ágcÁóö@õÐëtP×î0í“n˜Ñdú·ä¸9æ‡Cr «¯^—s¸å¢é’“"Öš)‰MâfäOa œ‡õncû}•Vy»Ã{£`oš)`oŒ …íØ»·,0Ý ?•ìM=ìô†‘>°÷oÉq7r<̦À®¹#fNT;Áºåz/S®R¾X‚§\ܤÀÙtï¨f¿€•K³”ZÄ)²9-'`ZXú#, °0S;̨)f´KYÚ'ëÞ²jèføY;ÌÈ)f„7Œð Xÿ–w#ÇÃlIÀLÅÆühêÂŒr;EÂLõs"ǬRòÝ`û;žᄲRRU¸¥=r§¬$`¦âkeð‡K ˜arLÀL+1ṵ́ơ,¦7ÈŒéOÿÖ•@ݺ~Ê13-§ô ˜a܆{ìú–w#ÇÃlJÀx"óW f"z”RA­}÷fЏH±Dx—õû¿NZNF8Ȉª,&#B8dDÈ)2"”‹ß½IÍ¡Ý[–L Ý ?…CFŸ"#‚yÃ0ŸŒôoÉq7r<̦dDÜ|PkHFbd# `uœ"DN|@äjaÓZI,xÚ‹‘«ærÕb ¹<[±¶ºntoYäº~r¹j6…\µkyìžxÈÕ¿%ÇÝÈñ0›"W­‡ãüŒë¼&*çŸ7"'Ǽ‹_-­×ëÍãƒÅ” a%hø%ð ™Æ2GˆÜ½e1}èføÉJÐTS”@¹fÙî‰G ÔõoÝÈñ0›R‚¦9€´91n1Ð##obÇY¼‘Ë©F3܈ 9z0Pø¸Ñ äàFÚâ­{V`wP &1„õ×B*–Þå9@õó$5›‚²YÞd*‡76Å›<µ±6êkéÞ²¼gèføY9¼I›)Þ¤]‹{÷ÄãMý[rܳ)o2jëf6q—‡Õ+ Ÿ¡ÜÿÅ5’GåMkpÊznåò±V|4ƒkˆ¨äãƒ'œ®x¢]ó¹nÿüóO§÷Ù¡óÞ±TTlð˜+nUä8²Ìéü¦„¨Ïp–{s“b(ÎøÀA‰$¢ª‡{zä\iº*u"®v@ÄàɸGk(¤ñ86{çÔøÜ*¨³@!ê›Á¡z|ð¬›nË€^4üÖ¾›®¨Ú¹\hû'Ž›îõ­æ±—á×à<8üV¾›nû´vǵë¦Û?fªînºclè¦Û…ЏÕêãåŸH‘°*Ìš|ä1¬«Å sgº²6ÑBRK ÕGHÕIéÔu¡;u‹r$òÞtìËéËù÷÷îäj5¿Ì½° bROÚHZšÞJ¬íòÎ|`M¬îmå¼fb¯®Ä/¼Çw_ÎS~‹øh¿±¹ï ‚Añä#G̹ñLÍí³])ªñŠsH—á[>å/КúpB:L '–Ápoð ölÕÒjIQ®ûwuóc°89‡k €ÞV™"3öNŸ"ÃùSœÈªÛ©@€#8›K‡9µ¼R<ŽzöšJ\,ÝZ„ð¬îÓ™%Î_Î_Nÿ'¢ëP endstream endobj 4382 0 obj 7843 endobj 4386 0 obj [223 /XYZ 32.2500000 72.5000000 0] endobj 4387 0 obj [223 /XYZ 31.5000000 73.2500000 0] endobj 4388 0 obj << /Type /Annot /Subtype /Link /Rect [87 778.250000 214.500000 785 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_module_packages_classes >> endobj 4389 0 obj << /Type /Annot /Subtype /Link /Rect [87 771.500000 112.500000 778.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_functions >> endobj 4390 0 obj << /Type /Annot /Subtype /Link /Rect [87 764 129.750000 770.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_global_variables >> endobj 4391 0 obj << /Type /Annot /Subtype /Link /Rect [87 757.250000 114 764 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_constants >> endobj 4392 0 obj << /Type /Annot /Subtype /Link /Rect [87 749.750000 123.750000 756.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_enumerations >> endobj 4393 0 obj << /Type /Annot /Subtype /Link /Rect [114 743 165 749.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_anonymous_enums >> endobj 4394 0 obj << /Type /Annot /Subtype /Link /Rect [114 735.500000 158.250000 742.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_typesafe_enums >> endobj 4395 0 obj << /Type /Annot /Subtype /Link /Rect [114 728.750000 165.750000 735.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_proper_enums >> endobj 4396 0 obj << /Type /Annot /Subtype /Link /Rect [114 721.250000 166.500000 728 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_typeunsafe_enums >> endobj 4397 0 obj << /Type /Annot /Subtype /Link /Rect [114 714.500000 151.500000 721.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_simple_enums >> endobj 4398 0 obj << /Type /Annot /Subtype /Link /Rect [87 707 108.750000 713.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_pointers >> endobj 4399 0 obj << /Type /Annot /Subtype /Link /Rect [87 700.250000 114 707 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_structures >> endobj 4400 0 obj << /Type /Annot /Subtype /Link /Rect [87 692.750000 119.250000 699.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_classes >> endobj 4401 0 obj << /Type /Annot /Subtype /Link /Rect [87 686 129 692.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_inheritance >> endobj 4402 0 obj << /Type /Annot /Subtype /Link /Rect [87 678.500000 210.750000 685.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_pointers_refs_arrays >> endobj 4403 0 obj << /Type /Annot /Subtype /Link /Rect [114 671.750000 147 678.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_null_pointers >> endobj 4404 0 obj << /Type /Annot /Subtype /Link /Rect [87 664.250000 154.500000 671 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_overloaded_functions >> endobj 4405 0 obj << /Type /Annot /Subtype /Link /Rect [87 657.500000 147.750000 664.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_default_arguments >> endobj 4406 0 obj << /Type /Annot /Subtype /Link /Rect [87 650 133.500000 656.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_namespaces >> endobj 4407 0 obj << /Type /Annot /Subtype /Link /Rect [87 643.250000 125.250000 650 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_templates >> endobj 4408 0 obj << /Type /Annot /Subtype /Link /Rect [87 635.750000 139.500000 642.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_smart_pointers >> endobj 4409 0 obj << /Type /Annot /Subtype /Link /Rect [114 629 192.750000 635.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_smart_pointers_shared_ptr >> endobj 4410 0 obj << /Type /Annot /Subtype /Link /Rect [114 621.500000 176.250000 628.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_smart_pointers_generic >> endobj 4411 0 obj << /Type /Annot /Subtype /Link /Rect [60 614.750000 181.500000 621.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_further_details >> endobj 4412 0 obj << /Type /Annot /Subtype /Link /Rect [87 607.250000 157.500000 614 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_imclass >> endobj 4413 0 obj << /Type /Annot /Subtype /Link /Rect [114 600.500000 209.250000 607.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_imclass_pragmas >> endobj 4414 0 obj << /Type /Annot /Subtype /Link /Rect [87 593 147.750000 599.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_module_class >> endobj 4415 0 obj << /Type /Annot /Subtype /Link /Rect [114 586.250000 199.500000 593 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_module_class_pragmas >> endobj 4416 0 obj << /Type /Annot /Subtype /Link /Rect [87 578.750000 137.250000 585.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_proxy_classes >> endobj 4417 0 obj << /Type /Annot /Subtype /Link /Rect [114 572 171.750000 578.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_memory_management >> endobj 4418 0 obj << /Type /Annot /Subtype /Link /Rect [114 564.500000 143.250000 571.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_inheritance_mirroring >> endobj 4419 0 obj << /Type /Annot /Subtype /Link /Rect [114 557.750000 213 564.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_proxy_classes_gc >> endobj 4420 0 obj << /Type /Annot /Subtype /Link /Rect [114 550.250000 335.250000 557 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_pgcpp >> endobj 4421 0 obj << /Type /Annot /Subtype /Link /Rect [114 543.500000 237 550.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_multithread_libraries >> endobj 4422 0 obj << /Type /Annot /Subtype /Link /Rect [87 536 144.750000 542.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_type_wrapper_classes >> endobj 4423 0 obj << /Type /Annot /Subtype /Link /Rect [87 529.250000 123.750000 536 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_enum_classes >> endobj 4424 0 obj << /Type /Annot /Subtype /Link /Rect [114 521.750000 176.250000 528.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_typesafe_enums_classes >> endobj 4425 0 obj << /Type /Annot /Subtype /Link /Rect [114 515 183.750000 521.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_proper_enums_classes >> endobj 4426 0 obj << /Type /Annot /Subtype /Link /Rect [114 507.500000 184.500000 514.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_typeunsafe_enums_classes >> endobj 4427 0 obj << /Type /Annot /Subtype /Link /Rect [87 500.750000 113.250000 507.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_interfaces >> endobj 4428 0 obj << /Type /Annot /Subtype /Link /Rect [60 493.250000 181.500000 500 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_directors >> endobj 4429 0 obj << /Type /Annot /Subtype /Link /Rect [87 486.500000 134.250000 493.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_enabling_directors >> endobj 4430 0 obj << /Type /Annot /Subtype /Link /Rect [87 479 129 485.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_directors_classes >> endobj 4431 0 obj << /Type /Annot /Subtype /Link /Rect [87 472.250000 153.750000 479 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_directors_overhead >> endobj 4432 0 obj << /Type /Annot /Subtype /Link /Rect [87 464.750000 153.750000 471.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_directors_example >> endobj 4433 0 obj << /Type /Annot /Subtype /Link /Rect [87 458 153 464.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_directors_threading >> endobj 4434 0 obj << /Type /Annot /Subtype /Link /Rect [87 450.500000 161.250000 457.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_directors_performance >> endobj 4435 0 obj << /Type /Annot /Subtype /Link /Rect [87 443.750000 168 450.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_exceptions_from_directors >> endobj 4436 0 obj << /Type /Annot /Subtype /Link /Rect [114 436.250000 198.750000 443 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_customizing_director_exceptions >> endobj 4437 0 obj << /Type /Annot /Subtype /Link /Rect [60 429.500000 140.250000 436.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_allprotected >> endobj 4438 0 obj << /Type /Annot /Subtype /Link /Rect [60 422 145.500000 428.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_common_customization >> endobj 4439 0 obj << /Type /Annot /Subtype /Link /Rect [87 415.250000 147.750000 422 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_helper_functions >> endobj 4440 0 obj << /Type /Annot /Subtype /Link /Rect [87 407.750000 165.750000 414.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_class_extension >> endobj 4441 0 obj << /Type /Annot /Subtype /Link /Rect [87 401 175.500000 407.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_proxycode >> endobj 4442 0 obj << /Type /Annot /Subtype /Link /Rect [87 393.500000 237.750000 400.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_exception_handling >> endobj 4443 0 obj << /Type /Annot /Subtype /Link /Rect [87 386.750000 201.750000 393.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_method_access >> endobj 4444 0 obj << /Type /Annot /Subtype /Link /Rect [60 379.250000 113.250000 386 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_tips_techniques >> endobj 4445 0 obj << /Type /Annot /Subtype /Link /Rect [87 372.500000 267 379.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_input_output_parameters >> endobj 4446 0 obj << /Type /Annot /Subtype /Link /Rect [87 365 128.250000 371.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_simple_pointers >> endobj 4447 0 obj << /Type /Annot /Subtype /Link /Rect [87 358.250000 180.750000 365 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_c_arrays >> endobj 4448 0 obj << /Type /Annot /Subtype /Link /Rect [87 350.750000 142.500000 357.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_unbounded_c_arrays >> endobj 4449 0 obj << /Type /Annot /Subtype /Link /Rect [87 344 144.750000 350.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_binary_char >> endobj 4450 0 obj << /Type /Annot /Subtype /Link /Rect [87 336.500000 228.750000 343.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_heap_allocations >> endobj 4451 0 obj << /Type /Annot /Subtype /Link /Rect [60 329.750000 99.7500000 336.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_typemaps >> endobj 4452 0 obj << /Type /Annot /Subtype /Link /Rect [87 322.250000 170.250000 329 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_default_primitive_type_mappings >> endobj 4453 0 obj << /Type /Annot /Subtype /Link /Rect [87 315.500000 194.250000 322.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_default_non_primitive_typemaps >> endobj 4454 0 obj << /Type /Annot /Subtype /Link /Rect [87 308 136.500000 314.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_jvm64 >> endobj 4455 0 obj << /Type /Annot /Subtype /Link /Rect [87 301.250000 139.500000 308 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_what_is_typemap >> endobj 4456 0 obj << /Type /Annot /Subtype /Link /Rect [87 293.750000 220.500000 300.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_typemaps_c_to_java_types >> endobj 4457 0 obj << /Type /Annot /Subtype /Link /Rect [87 287 150 293.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_typemap_attributes >> endobj 4458 0 obj << /Type /Annot /Subtype /Link /Rect [87 279.500000 145.500000 286.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_special_variables >> endobj 4459 0 obj << /Type /Annot /Subtype /Link /Rect [87 272.750000 199.500000 279.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_typemaps_for_c_and_cpp >> endobj 4460 0 obj << /Type /Annot /Subtype /Link /Rect [87 265.250000 141.750000 272 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_code_typemaps >> endobj 4461 0 obj << /Type /Annot /Subtype /Link /Rect [87 258.500000 156.750000 265.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_directors_typemaps >> endobj 4462 0 obj << /Type /Annot /Subtype /Link /Rect [60 251 112.500000 257.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_typemap_examples >> endobj 4463 0 obj << /Type /Annot /Subtype /Link /Rect [87 244.250000 218.250000 251 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_simpler_enum_classes >> endobj 4464 0 obj << /Type /Annot /Subtype /Link /Rect [87 236.750000 240.750000 243.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_exception_typemap >> endobj 4465 0 obj << /Type /Annot /Subtype /Link /Rect [87 230 235.500000 236.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_nan_exception_typemap >> endobj 4466 0 obj << /Type /Annot /Subtype /Link /Rect [87 222.500000 192 229.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_converting_java_string_arrays >> endobj 4467 0 obj << /Type /Annot /Subtype /Link /Rect [87 215.750000 210.750000 222.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_expanding_java_object >> endobj 4468 0 obj << /Type /Annot /Subtype /Link /Rect [87 208.250000 183.750000 215 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_using_typemaps_return_arguments >> endobj 4469 0 obj << /Type /Annot /Subtype /Link /Rect [87 201.500000 223.500000 208.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_adding_downcasts >> endobj 4470 0 obj << /Type /Annot /Subtype /Link /Rect [87 194 207.750000 200.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_adding_equals_method >> endobj 4471 0 obj << /Type /Annot /Subtype /Link /Rect [87 187.250000 207 194 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_void_pointers >> endobj 4472 0 obj << /Type /Annot /Subtype /Link /Rect [87 179.750000 148.500000 186.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_struct_pointer_pointer >> endobj 4473 0 obj << /Type /Annot /Subtype /Link /Rect [87 173 272.250000 179.750000 ] /Border [0 0 0] /Dest /F#ed#3atl#f3#1f#12#af#26#ac#be#01#c4#1au#99#99#d4#81 >> endobj 4474 0 obj << /Type /Annot /Subtype /Link /Rect [87 165.500000 240 172.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_memory_management_objects >> endobj 4475 0 obj << /Type /Annot /Subtype /Link /Rect [87 158.750000 268.500000 165.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_date_marshalling >> endobj 4476 0 obj << /Type /Annot /Subtype /Link /Rect [60 151.250000 127.500000 158 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_directors_faq >> endobj 4477 0 obj << /Type /Annot /Subtype /Link /Rect [60 144.500000 100.500000 151.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_odds_ends >> endobj 4478 0 obj << /Type /Annot /Subtype /Link /Rect [87 137 139.500000 143.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_javadoc_comments >> endobj 4479 0 obj << /Type /Annot /Subtype /Link /Rect [87 130.250000 198 137 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_functional_interface >> endobj 4480 0 obj << /Type /Annot /Subtype /Link /Rect [87 122.750000 163.500000 129.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_using_own_jni_functions >> endobj 4481 0 obj << /Type /Annot /Subtype /Link /Rect [87 116 173.250000 122.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_performance >> endobj 4482 0 obj << /Type /Annot /Subtype /Link /Rect [87 108.500000 115.500000 115.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_debugging >> endobj 4483 0 obj << /Type /Annot /Subtype /Link /Rect [60 101.750000 100.500000 108.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_examples >> endobj 4385 0 obj << /Type /Page /Parent 2 0 R /Contents 4484 0 R /Resources 4486 0 R /Annots 4487 0 R /MediaBox [0 0 595 842] >> endobj 4486 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 4487 0 obj [ 4388 0 R 4389 0 R 4390 0 R 4391 0 R 4392 0 R 4393 0 R 4394 0 R 4395 0 R 4396 0 R 4397 0 R 4398 0 R 4399 0 R 4400 0 R 4401 0 R 4402 0 R 4403 0 R 4404 0 R 4405 0 R 4406 0 R 4407 0 R 4408 0 R 4409 0 R 4410 0 R 4411 0 R 4412 0 R 4413 0 R 4414 0 R 4415 0 R 4416 0 R 4417 0 R 4418 0 R 4419 0 R 4420 0 R 4421 0 R 4422 0 R 4423 0 R 4424 0 R 4425 0 R 4426 0 R 4427 0 R 4428 0 R 4429 0 R 4430 0 R 4431 0 R 4432 0 R 4433 0 R 4434 0 R 4435 0 R 4436 0 R 4437 0 R 4438 0 R 4439 0 R 4440 0 R 4441 0 R 4442 0 R 4443 0 R 4444 0 R 4445 0 R 4446 0 R 4447 0 R 4448 0 R 4449 0 R 4450 0 R 4451 0 R 4452 0 R 4453 0 R 4454 0 R 4455 0 R 4456 0 R 4457 0 R 4458 0 R 4459 0 R 4460 0 R 4461 0 R 4462 0 R 4463 0 R 4464 0 R 4465 0 R 4466 0 R 4467 0 R 4468 0 R 4469 0 R 4470 0 R 4471 0 R 4472 0 R 4473 0 R 4474 0 R 4475 0 R 4476 0 R 4477 0 R 4478 0 R 4479 0 R 4480 0 R 4481 0 R 4482 0 R 4483 0 R ] endobj 4484 0 obj << /Length 4485 0 R /Filter /FlateDecode >> stream xœí]K¯ì¸qÞŸ_Ñë>#’Řg€,3@AÁØŽaø{‘¿Q")±Hª©jJê>÷Ì…}¯ªÙ¤ZªY_U}ó¯?ÿ÷íþqûæûŸÿ÷ö«ÿûûŸß†w-‡ù¿›ûó»5›wÿï›6òöë—·ßn¿½ýþí÷ãÿÿö6áçïÿ}ü×ÿÝøí߯ÿýåöŸÿ5ÿà¹_Þ4Óãßþ¶šÿâߎþç·ÿø§ÛßÜŒa93éõï8SRww–þí-üL6ýùǯ{ûf~ûV!¥n ܘ~ûûßþä~ífùúfù nù σ‰7lÆæÚŽ/îoµËÄ 8æ~à1 Ëcàþ1°a^‚ÝÖ :6ùùägv0G=C<÷Ïp\ÂÞÖ Ú žá!|Xz9} oÏφÅÎ}xY{!.—§è¯ˆòÝ(ÿ_õß±’5£rgæáGÁr3Ä&û¡¥ûúô$A©n¿swaØí—?Üþy˜þ—Û/ó»à†q9 œ>Ôô‰y7vP\Ë' ªŸ ÕOÌô‰x— Œ^2ðÚw†ù;&@Lx1ûXËÐïkŸ0Q½¥úÂ-ÌB„úwYõ±íø¡?§>‰Þÿ¾ü:?þ2ŠíÂq%YgâîeQp»&ÅÔŸeÝBˆe)O¸úp6¾óãô‰ ’Ñô Ê¡u޹÷z ³‰ ù]óÐúz™DÔåycúŒÍ3½ïÞçTĘ_ÞÀê§Þ5;Ù±²dvÆÙ‘=)™Ùq£¼Y Ó„K@fÇŠ’Ù]¼ ÏÍÎ4 Òi ]æJ³Ã†¨Égy´ïZÉV²!Ø;7ÄPVíP]­ÔnåJ¯?ÙÀÛÆ¤{{í²Ä‡ KzXšeIp$KB”dIHÌä#%“%7ÊËJ˜&\r$K‚•dI Ù2C.KÓ(H§t™KeI˜ð:˜e‰è¡h[4<ÅCÞ°{¹RبáÍšÐÌ•’!®”¼Ä•0»Œ”Œ+Ý(ÏuašpÉWʡĕ`ñ2#%ãJXØ0Né2—r¥Ô9ì̕ûÒ,åÊúö©®æXuó|Ö®âZwFšÀìR® E/{È^vU ¸g)enrüó÷?¾}w:ß8ÑøF«`ê|Cy‚a[^g±úùLÝ…n?h ì¥I’ÒÊsAŸjŽ ¬ xÎè'à9+/T÷H9—T¹v:Õõ7.y=β*p¨5áqÎ⃺ž³8ƒð>EU›Õ7uuCa¾ú:Ïsæõ¤|Ê™ŒP­ ø”Ë'àS!NÒ€õ-5åêSŸ">ù4!tàÓqwq=ŸJž «êÓú±Jõ9oD¬(Ç*¯Ç72œqú³ü@hÝBs…"Æ\•"Æ\ሱ£à-ô4jÞ"ÇiÂ%ŠsUŠs…#ÆŽ‚·Ðó(H§t™+·Ð\‡ðÛ†óPßðÔ·©”3Š[±skËu8­ëšÐÌ„Ÿ)ŸÁñ#GɘÐÄøQœ&\¢ø7¥ø78~ä(š?Z¦t™K™Ð÷5nmê'/usßYÚ˜¤Î•ÝNù]"KvMhåW1 È’J‘%1àÈ’£`~FÍü§ —(²$†RdI 8²ä(˜_çQNé2Wò«bd©z.¾ó>®À1§ú'!NïùV°Å±&4ó-GQœÑÍ,ñ-ÇQGÉø–Ç(Nœ&\¢(θë*ñ-ÇQGÉø–Ç(Î2 ¤Ë\Ê·ü~§3ßn»ž;Ôï o¨)³(|§ÄðaRfMh–@&¥“ar”Lb F˜â4áE˜”"LBà“£d#$´,s©Ä@ˆ0½´{üÔ’âçŽB(þÔn< Jù]„ avDV þ´ká>!õšp ús\(•¯C°½pÃ÷§úévuû¿ÈP  ǰ¾‘i5Uˆ?¾¼Q˜a;ò âÃîüÝ¿£ïk~OBÕÀŸßî4Ÿ £¿L¯ ÍζÈù1CÉùÉÎK„?/I|7Ê;7aé—YœmJÎÆ§?Ž’9?Ó(H§t™KBÖ§mêÁH¬IHÚsCÓÖ­Oל€º+õ¡1ÕÂݽÐkB³J°©k *²#)ðGRk‰žFy‘Ó„KƒT‚Õ%•`³6«r•0‚tH—¹R%À'«Š”mHL]2) çºètÝ&Ô3£:cOÒÂQ̬ ­b L§b Ì”Ä:;±b—ˆ5r§ —:k`ª ÖÀðù££`±žGA: ¤Ë\*Ö\œ,Ö›ººˆRX:CoôÈíwN<„ÇŸ´&4‹ƒPH„.‰Cvþ8.áf7ʳ{˜&\*$B–ÄAàÃEGÉÄaé4.s©8?[(ù¥]‘&}s_w‹„(%—vMh‰°! KØâ(™Ȉ ‰Ó„K„ Y†€ÄØGÉÄ@FlÈ2 ¤Ë\*Š-Õðÿ³SŽ'ŽÛKÚQE|ŒMíæ×í‰üY¡’užÆH}z+Îà§êwê§üÍ zó %˜]&!$1˜g_@5 z àMéê>¨i,{Mcï§ŸŸUØdƒ²­ÍóËì×gœ½¿t…5ᑲ›ˆ³®g””¼¿:¯ÏäMYïÕòë›2Þ÷eq”^Ï®*\Ï)üí![Ã}ßÉxo|=Kú;œãüÝ?.û&Ñ—,à¬HõP’Ñ3Õõ4–„³ªçWÔOcw$ÁRâ„Í{_Oò«+u_1šY ²üL­ úfL!Qÿ,ÝUuøÒ—2:|ƒ)½¥{gã™GA: ¤Ë\yÆ#E`¶¾Üí¢Ä6t¡ÂRýÞv€Â2…S+ ßîw©Õ/ÍçQRDlb›^P3 O5“R}Êß§ü]hß)ÈC‚ƒ¸a œìÝ9ËÃׄfßC!|¡Ô%|¡Ô_è(™ï¡#¾0Nã/ÂJUÂJ…ñ…Ž’ù*â —i ]æRßCß/‰ÓW÷í£“ª–¶¸’¿wdÐSG<”vKg2RJ¶&géÜB©Þ#¥RŽô(ûº¾ÀUB±ÊFüó$©åQôE_÷HW!©f.ÁÛžûji…/o†¬&óÁô8Ëå>˜bGBéò»ÏùøØ IK±…—uÙ¸ƒº¡oÏüxš>U„JvÞ ÐC„˜ ±&¸áJEï¬3Œ§–ötÈÎí4ªÅ›ô†ýzÊ:ÎÓÓ%^ººÔÁ•5/Á•5ÇpeGÁ¡ËiÔšŒÓ„KWÖ¼WÖ Ã•‡.õ«\¦t™+C—šß‡+ÜC†×Q~_ž íûzìÏr<Ü ÕÓ_]E|§•kB¦×O€ïÔæ³-ã§+B&¢+çfVÐA„ìtŒ4ÃgÇÈO:T„ÌQ„ôšÐº™0 Õ_4¬TÑdÛoÃòú‹Ó¨y³§ —¨þ¢a¥ú‹†áÃGÁ›‰y¤Ó@ºÌ•› ÃcýE´®o¨‹RKøÀz¡†ÇB‰4-Ïb¦ÝjZÄe¥×³„«P×0\C¡Œ"[Cd%`-Ü)¬JÀ,k\YÆÀýÚ‰ïï¡@!ESbB—£H(M3êO'w1º¢Íë7»qŽ_»dÎÁŒox=»u 'î,üb ‰A¯ ~œ’šNí@(Q°Íå\ÒG˹àg×s’¨“®‘¥NºFâ\gGÉ<';éÆiÂ%ê¤kd©“®‘8sÛQ2ÏIÆNºË4.s©ç¤¢ŒQŽa«¼· <бOÙeòl™¼%ñ< Òi ]æR±6Ãgî,TÉíÒû‹’zÐùr.h„žRΓÐê²oãµæLÔ ø6–‡rMh|Ë’Dz’Çf‡o–åHžiÔ,Øqšp‰<–•ó3CvOÚ®ï8ºÌÏ2ïµ°î°M°"¶"|MhÖ€JZY*h³'+óRÓ(¯dR*0,³è(• ´€Ï%ÓK.Ó@ºÌ¥:BʯEGôÅ÷ôÍÇë[ífO˜” RIÐ#“Ђ‚‘ø&aMhV0 56¶ªÔØØf'jVç§Q^¨¤±qXfQ0ªÔØØ*|>è(™‚Q±±ñ2 ¤Ë\ª`t¬Æø4¸·Ì­Þ!0¤F^§$síK¦$ï<Û%U/½Šùšpd_ Žøñcm4[ºEpôìµÀÏþ1l£5O€m´ö~Ëå=axÂËÚ”*gqþŒòü¾f|¢µÅ !¨‚tÆ¡ÛD5è$^xÏÍ>\ƒs­ÁxûkðÝx­sðÝHµ)0n¢ ðÝ( ›:Œì¤Ìהʑòe…%÷¾F–Šî½1–»¥0(ä\¥#UaT tååXA"çJ 9W@éHeÙ2 Ô‚tH—¹TΕ½+³gÜs@ÙQì8R>ËÎ×kþ*ïohÅêÀüÓ¼sÖ ^:øm°}0<tì^¯B³~1éSÀߎT‰ßdøÛy”×F$úÅp¤_L;R‡l™ ëGA: ¤Ë\ª_ŒùÔ/ŸúeC¿œ^i·#|¹]7™¶|MhÕMlH!Â#¡©"Ä ë>´*ß+³ç:·3;«ðH³O1¸u!<·ñ´'ÌOÐ*æê·Ò¬ûø±0$„VÝÇ™Lugª ûx|â>ø´V]Ó¨Y·ÅiÂ¥LugPÐ}œáPš£`Ý7‚tH—¹T÷ñÅ#dUrªšg#QŒrâ@qÛ»¦ÑQ´âFVå“É©+ƒ\šåO Ô.J©+\àÔ.òÔ•i”—/‘¤®„eù¥Ô.pꊣdò'bêÊ2 ¤Ë\*mÍûÝvJõò:ïåF(@@Ê袘½ìŒd¦¶¾CªïçE$—m¯TÃ’¨2¬ ÍR-Q¢ —¥Dž…¸ÌU¦Q^je’¨–Y¤Z–U¸ÄAGɤZÆD•eH—¹TªeHT9¸3éóúª‡õÝyýD­îØ_~BHrO(§'”³ J÷ñ–4A;©%ÍE® GÆ%$’Á X=™ƒP¤;Ï(?éMž\2ì 6½ Ø‹F®FLüåMŠŒ«åp|ôp-  ®%ÌðéÄ:…ÕL£ôz–pr­Â5+€r¸²5† ”ãháNÙ ”³¬q%(‡ksÖå»K‹VJéÑ»£V¼ ×±¤¯ekB³ÇiQz·¥ô ž.s›§M£¼Gi“ô °ÌâqÚRz7ø¨ÜQ2Ó,.¦MÒƒ–e.õ8mì P¯ LWnð¥ÁEWÈÇ á·ûT6ÀÅœ†_Žó©ÜBˆËŽUp”JWOˆiîÄœ¾RW€Ð–Þñ=+ʬ”"²ClÁò|iÔ¬Cã4á僈¡”"|$ï(XÇΣ Òe®Ô±‚5ôfxIûŠîʃµ”,Wêµ`KV‰YŽÌ*1˜Uëg-„„DñCíá|-fú|éÙ‘2bR¶à%¶»k;¸E¶Czv€È0Bd=;æQÞ6ˆ!±Ü"ÛÁ =;F*'9Jf;¸ŽÆ‚›Ävð'èÙ®ÙšxV{©AŠv$ß#4É#‰ùŽã©Ÿj/a#ÕsgdFˆ˜Da_^ˆ”" ”"²‰y^È4ÊË$y!a™E¡”"€%“Cˆy!Ë4.s©ʘRÅz‘ÊMP¼®ÍŸ(1Žáb'JˆÛ„Ð,v ¡“…*¡“…Æèd¡stò4Ê‹U˜&\"t²P%t²;rF˨<‚tH—¹Tìt@'×Ó#Ÿ÷®Þj|œóäê䊭í F/](äšpd ‰Äèœ=G˜†F~‚@âÓìÝRVúò&/ñÖ]ãeP~€0¥ü‘=„Éó¦QÞ8™$? ,³/Sʇp%3^&æ,Ó@ºÌ¥ÆËòÉ%ÅG­+®H¼nì””å^ýUGÖ à;ÁåšÐ*ï0 L< %Ls}0ÊÅÙ^;åh¡~BYGº>ßYÐÕ?½Ù®Ë!B¯ [<1 Úiµ¨ºV÷%áÕ5»IpmJ¼¢½»ö±ýSFüò&Uâ̻Ƒ!t¶ä%t¶ÌŽñ%ÏÑÙÓ(o y‚ÎËDã(Y -J8 6Žó(H§t™K#èlþ]Mf?Z«±³Ú^ˆFNõ'Ûn’x@æÁÖ„M’`ˆ½_òlâäÓüÇÂr{ºÀ¾€Kûâ2ÚlœS‘ó|¢‚eô®q(eCŠRʆÌ'ò”i”7¾"IÙË,ÆY”R6¤Àa GÉŒ³ˆ)Ë4.s©q†²!ªõ6„R7ê«ë°ZÏëü •Æ^ñ÷†Ö„ û¸P*_Q‹Ü³-º±'Aá( Ÿ9OléfO 5XòT]CU^Ê»–\¢,0)MÉ’gÑY©ò,°i”·Ôašp‰²À¤,eI‰cÍŽ’Yr³À–i ]æRK®búJÒEÐØ}JiR¤­«f;Ýëæ2¸{°ŠIYœ¯ G6(爫¯.Å~ºÖ޾Ž} Ì@…^¹Ù'-­·yÊ9ã"%ιk)4J¹’º”r%5N¹’:O¹šFyK “”«°Ìb)t)åJjœrå(™¥Ð1åj™Òe.µ&¤\í ”S¼/ ø¬æu~º ©þ®:n¼ÞκšëÒŠÇÒÄŒ.ïxqønc¡©‡ëûV#t4îÜ6Œ`Uê²HŠUSšóÕŸhó‰eÊ]£õ2ºÄnw­—E „Ò–e‚‘6O œFyëd“°Ìb½l)PÚ ÒcóÂy¤Ó@ºÌ•ÖK Mu®j‰úŠx΃Ûf宆€ ç# ®–^JyІ®÷^¡ô"œ0µŠqʨ¨™,±Î=E­ÊU¬”%ª2@†by–è4jVÄqšp‰²D+e‰*†á%Ž‚õ< Òi ]æREÍ£î«o3êgá—ïNï5XÿÅÕ»ß@Áµ7/ÞU¿'²OcLxLÞ„„pàN0ßSÚîÖ=øÜƒ¨kcB°¦~³àÈ.90/irŸ¦¶ ~—œ•øý®(ùU‰Rò«ÊPJäɯÓ(oáD’ü–Y, (%¿*1Ž’Y@“_—i ]æR (bòëKZ@ÊÉÒÀëÏ îŠRÐÊ;fO·/¼œR0¡oüò{ºuâP3MB82Ë “Û«“ÖI8‚ŒÍ3B»cÐ[mJoé®Ý‘(\ÉR>¸ÊbôJæùàÓ(oWd’–YìŽ,åƒ+‰Ž’ÙóÁ—i ]æR»#C>x½÷†B 4·¤t"Üé0žxò &¹õk`Ô)Û Lòd]»QØl‡jígïdH=r5]V„ãì[(Õ‡ÚŸûýrgTtéQÜ5*5ÁSºÔOeá|¥ó&xÓ(o4Â4á5ÁSºÔO) Np”̨¨ÅŠÄi ]æR£¢c{²®Ð¦ {°ô‹ÚŸ“\üx:í TǶnþD頻 ,ªŒ l©2‚ÊÂ¨Êæ•¦Q^+ؤ2BXfѦTAv”Lk˜Xa™Òe.Õ6$loô~!Ä;)'œ;º÷P­î^ýÖå¡ô Âíu`l, ÀÂv†¹¬!YP޹žù8û,ál¤žP (å¶'R]† ¦ý;åg»:-_[ñj¤¿¼)ÉJñžG¢TŽB³R9 á4ËËQL£f#Nã/TŽB¥rzÀèGÁÉ< Òi ]æJD³¯ÿ鑼¦GrVÞb³ç£ÙR}® GVŸ°ˆ›Ÿ,¾ã•’^ð@œãƒF×.,EC9)Ìõßã§H]µ (Éä]ÛËQµ ÍKÕ&t†TÐ"¯61ò7Æ“ja™ÅöòRµ Í1îÂQ2ÛËcµ‰eH—¹ÔöŠØ ´Z¨˜T†·£Ôö€%WoC„.¯ °±}>°}_ Z·’}"T”óÔ½Šˆe4lB8ÐC±™Ì¿TrÄ3|ï;>uqêÑÀŠ¢‰;?‚¯µ·’ß/o ,ÐÕV×-µ)ÔVw;­{®' LZ}¥×³„«P1#\«Bmu ¯2«­îháNÕª¶ú²Æ•µÕµŒõ ä~×Þ8«ÐYÕuŸ òQ:gì«&¯eÈ{â*!<®F”JÕˆÒ%5¢pû=A#"p£ôz–p¥R5¢dI(ÜÂQ252ÒÂʵQêÔˆÙç|f ÆßñÖœ„$>œ© ú½Ø,:fAX¾&4Ÿ”ñ­M)ã[gÁ}mòŒïi”?0IÆwXf950¥Œom0TÁQ²S3¾—i ]æÒS{pËØºêßáF_¼&ó6l,í’´ZÆ (óÖ ¥Ì[“ÅžÌgÞN£fˆÓ„K”yk†Ræ­p$ÍQ°ÀÌ£ Òe®ÃâÑEµ¡ÏÆöeG€ü¤ª¡}[)_難«6´ÔtÂõ~ý]3š•’a1ùWÊ5áÈ2A‰ÞÆÑRÝ{¯?6\kGèø…’ŠÒ×å:¹òÒû»kT8Jf5¼”Ìj² Šáy2ë4Ê ž$³†e£ÂKɬ†ã‘£dF…ÇdÖeH—¹Ô¨ð˜÷|uwri ( »oi†öãÒëßÞÑ£»ð/å'ìõ^ˆ9¦Š­ ÍŠPö¢Rö¢œ½h Ï^œFyEIöbXfQ4PÊ^4€³%S4³—i ]æRE!‰Ï|TJ4éêt‘ÊetÅcuqîvl4ûÜ ü|N¤ò&'l­ Äö¹&!4+'…²àŒ*eÁ…³àŒÊ³à¦Q^ù¨$ .,³('UÊ‚3gÁ9J¦œä¢T’·,s©rR1 ®~jD#×?©{2]S´ülíì©b#Z!Ö„‡C#7$¡cX!t`Œ@Çúf:ÛLÿ§Qz=K¸ ÙQþZÛBèÀhƒ×Ð& 8š¿S?Kú;® rcN/höÛ0;XX¾&´rÿÝ7=´¿i˜ÖXˆçäÕc?’±Û‘ìÒ£d=©KQß|•º±ã€$ó¤ºâOú$'ÕS¹½ðÊ÷ÁŠ”êûKßß3M‚ò?px„¹²þŠu£Y× ”ŒgJ_Ê‘A}‡r2N‚ý@ø]u¾ <¥Q³.jºÔ«³ÐŽJš—K+>oïo±¤ÈdQÒ?)ð@Òñ_»ªAá¾Ã"Õµ“Ó!ç]‰&”ÃØzsFйCQ"—$¿¤ë ëS\±oB÷óؾéfgIÍ#1¿®¬Jqü)ØRÊlÔB=ÐŽ²IdHû² ÉøÖÍ)iL}Ë'½Ô5ÛðüЋ¡ÌC‘¡æŠpÖØtIçìBêY$jþ‰g4õîOVOîÛêwlí;>•™w|˜!ê³ýTû„ͬa ÉøÕÙüû.Ü[}¾ê”7þ¹ý6¾“ÍWöû{”„)É·ÝÌÝùôÎ×;‰ÏÍïAq~><ï èw…~Þ»âù“óϧd9~¨­#î9½¥{ûÉÿÒì(Ì;u%Ë- wö‚%ÖàÕéõÃTø¬>[õ;^§²]?]/lKe8÷ï!vÔa?V­ÜϬ®Ù«,àU=½×-/íÇ'ç“ÔŸ{uzþýãÏ]âÝËlÛ Øx5‰öº§¹n¿ûb[ endstream endobj 4485 0 obj 9512 endobj 4489 0 obj [224 /XYZ 31.5000000 652.250000 0] endobj 4490 0 obj [224 /XYZ 38.2500000 562.250000 0] endobj 4491 0 obj [224 /XYZ 38.2500000 200.750000 0] endobj 4492 0 obj [224 /XYZ 32.2500000 650.750000 0] endobj 4493 0 obj [224 /XYZ 38.2500000 312.500000 0] endobj 4494 0 obj [224 /XYZ 38.2500000 123.500000 0] endobj 4495 0 obj [224 /XYZ 38.2500000 200.750000 0] endobj 4496 0 obj [224 /XYZ 38.2500000 123.500000 0] endobj 4497 0 obj [224 /XYZ 38.2500000 562.250000 0] endobj 4498 0 obj [224 /XYZ 38.2500000 312.500000 0] endobj 4499 0 obj << /Type /Annot /Subtype /Link /Rect [407.250000 708.500000 442.500000 715.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG >> endobj 4500 0 obj << /Type /Annot /Subtype /Link /Rect [78.7500000 680.750000 156 687.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_basic_tour >> endobj 4501 0 obj << /Type /Annot /Subtype /Link /Rect [222 569.750000 264 576.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Android >> endobj 4502 0 obj << /Type /Annot /Subtype /Link /Rect [177 354.500000 218.250000 361.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_output >> endobj 4503 0 obj << /Type /Annot /Subtype /Link /Rect [333 341 344.250000 347.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_module_packages_classes >> endobj 4488 0 obj << /Type /Page /Parent 2 0 R /Contents 4504 0 R /Resources 4506 0 R /Annots 4507 0 R /MediaBox [0 0 595 842] >> endobj 4506 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F1409 1409 0 R >> /XObject << >> >> endobj 4507 0 obj [ 4499 0 R 4500 0 R 4501 0 R 4502 0 R 4503 0 R ] endobj 4504 0 obj << /Length 4505 0 R /Filter /FlateDecode >> stream xœí]I¯ä¸‘¾¿_‘çœ-R;00е 0‡ UÀ ŒöØ£Û˜²þû“‹ô2?Jü2¤ò© ÝUýT¢¸c/~úo:üõŸ‡Ÿ>~û¿Ã/Óï¿=UǾ­®ÿο~÷úv8N>ôC{øå·§‡O_Ÿ¾žþûãéú·ÿuúÓ¿öðŸ§ÿvøÃO?üóô—Îá·§Þô§ß½ü>öæô§êù÷óÏÿ÷é¿ÿíð÷óˆóç¦É¼ýÿßYsšZsžÆÂ§<ÍË4—_ÿüåïO?]7 î+M}z4LS736öðÿyúËéóðÕqè¦àŸÉç×cú¸7¾<6Æô]ÓW÷,±·çÏtýiv<Ôúºü>ÁàƒÓ ~™¹ø®˜º3áÑ%wìuƒÚ>ÅöÏ£§Øþ±NI8ç™KoÊ|´ppÉ“G“ðdŸGO°ù]Õô Éæ<óT' <Ù®nšt'û2zŠ“mN?N6øeæ‰N.y²Ý¼÷}—`º”'Û›t’ö:séM™O.y²C7oÏiŸä7èeøƒC:v|¹ø®Ìgëþ5f<•ëO€‰ñ#ðâ‡ïO?}9Í©;|ÿËif—^ûþÛSsúŸ³QaëÃ÷?þ½ªêþ÷‡ï{}×v¶½ÌïúÄŽ—'Ãq«·O* Ÿ|¼L°aÌ–C㌿^nb(° üaƺ”åòøÀ°ííz(w !úb| Äž¦„w–¹OKºWBž7s¼“u1‰le—NÀ¸Ç*qMsu‰ »›"¼ KbJÉ9‡Œ(Q'ÊÉb4L- )›ÄÆË¶1 8Ù¦·á¶õÏp²øëdÇc=½´âIÓZ_Z½Ø|Šg†Z1’râ¾i%뼈`)ŒBª¥ýM\Ç(UWº0í±ë·ëÁWïz¤ÆÝkàÚØ5&¢Í>¡lì«q½ld ¯{mV[<ŒsÙÛö˜ïÉjÐ-p?cR+VkÕÜêfÊ®äv¥·:+Ê[úzÓŧ² ^9çÁj·²’Ãz#°‚Mh«Ú|ÙÕ‹@ÄS #®£OB+D†€0¸ öNÈ6®`RU(ë8"×ïÒÙ T¾áÃf°fe!>ú‹°“˜D…€. 'ˆv¬7VY¥–9—MÿIÙ{03¤Ð{ÏeBy:ŒÖ‘§Œø|?j¬a©×îɼl­º‰ç¯ò¥H߬aúTˆ"ôS¸ Ô1“Áˆò{òåqPMÔAµxH„v½hEq„…ûñ𖇂·l¨ïOž1c'ø„³ OwѼ+AË*§RB ÝWšp0^WÁÝ7o½"ô^_ãìC3EÞëÆ¼þAŽÀûy ÎÕÛ¶ô•-D[㨠¦ÝŸ]…‰™I¯g¤fDxƒ¨$¥°h7بBU§áéžS ÂôLed~D¤`‘˜¯›ŽH‘ID9(;Š2]ÅÞ_kå�M·o*Ïog%AhØ”¾•$¢´Ãñ»|k G­« ܉ Ñõô»TVÊH#Ò{ëʢ󠌢å6œ")7ÙqD Hky°ŒÜÊ/ˆy4`QHÂE«9e¥tÕ»—ZKФÍPbšxîŸM¥RZ”Üù…aþö˜ÁËæíh}gf˜¼øüô°\}ŒJô³—bJ¤,³6‹Jq®ÃmâG§,U'C„E äâݹó[Œ"U*CßAQˆLTj•ÆŒ]HD§ÚÅÔõ˜ËhgUðÔY³|iJöE?FiìƒÄ3ò§—_Ç ˜qÁø—sèåZ1éõš4…MË›K)…I×»ÒD‹91E]„5Âèææ ÒÍ·•„µ-<&«ˆ1ÈÖ›ùñÄ)užéu'be)µjŠih…%9QÞh‰&õ2ýcß=RfB¹3ZãȪø‡±Ø$ÒºbŠEn¹l§¬eReSKlS0O¢¦”ðÊâT`êãÊMj"ÎoÓ2×(¢Š oi& î¯f×YR'”¨¥íýHFb|"²à'å%fQ÷7q QR#¶Ù¦OÿA…)ÁÝLëˆ3ÙV2¢{9W[¹u8ØævÁÈu7†áí'ÏL¨yk×Ú=™Nº;NV€gTÜzg„ïLVr÷ò““™áŸÃ4þDc·Æ¯Ñ“é¼­A øÖhW‘mš£kM÷ìÖÜàzsÃ+•4À¦~.¯ÏžJ1ma”‹ß¡,¡&øØF[‚ÛõRyp²‹ dÓ5¬Ôг±,ĀȦ0K·&~²Mƒ(E»u¥ùL&ªì{Þ´ñÆÐÖr£Úθ’oK ç)|o?3È¢‰¥fÁB’!ñˆ…žpÙÌ,¯o„£KÂßMec…U$€%(Ï–D8ž 88GV5uSËb…CRœ^OHÊzTØÁÀ;bEšoå¿ÌjÂ$"×iÛÒE˽Œu|å»é¦=¨îÈg–± µ:U5í\ë •Âße¦nð2 õD— Öh%¤V[»äêÛB˜1u²9š[2KŒ½o€Í2·{xÿ 1IQ&æ¹ ðŸl&º»çŒ=cZÂÄÂ$ŠY¬åRpâ´°Ž¼TØ”h¹cç "\»EÜ _¹—EÈÏ–Ð…y`„„ICXïÆ ¬‹©›ÃÚ,Ã’0g`´›Äp2Ò’ƒÆxZˆ·ç¦¬Y¢ð•{ʦ­IàYä¶hRºF­±)Ü߈p±gkVrçeÊûÌ`ø`ŸÈšg×Wo–QTUßh›6¦J /3QU”IFì”í^ ×ƒŽŒ7ŸBTXC”“RÁÃèˆXJÝ©éç —b Mªþ‘€s–A%ÕÉògÀhQgÄ×xSpˆe}˜ŸiÉ@²5Æ)Øtz4õ{¾g#LaøPq°”ºµqj®›pkÏ1ï)°+R¹v£ÄØ¢’Ÿ¶®ãõ‘T‘p§­‘n¦Ma±ŽAÔŠ”¬P¸mf2õJy²0˜”îÄ€-io þ¯qù¼)‚Öj|‘8»9ÆAàÚ3©dP;Ù\P¼×‡°©¤¥Ì¸ìE'ƾ#JH³5»“-UeÜJ²N|f‹HÔ"ö-½_-¬ƒo·×®žA-’EêyÀÒõR‚êÇz¯+¶RªÓ†Jh^"ô—?î UaAÙÎÐ ÂdrË ÓT0v*%® —Ù¼YøgôdÒêo<™ô¼[Oôd"²¸ïˆ$6ËTMãZ—#Ü-¿'x´iåI+ÉŒåƒa-+e#ê@³Å²_v¥ß¦²ÌD0qd»qP™ê„ºˆ[1±&»XÿaJ×µ'9(‹ â†T¸Û3[ÒÜ•!~Q½Y-D$“6“hê@(O2(:‹âíŒÿ›9l&W+iH‹ÉdKÍÏ–MÔœÔaÛö®y¸ëëæ4PüY¶3l“Éã&tn?{ƒð-Ƥn>ˆ-ƈ³ˆF²j^¯áù 'ì ï,cµ0ñÌ*%EXô8¯´Þ¼Äâ?EûÆÕ÷|™|\7B-G\u%gµ¬UĨ¾È¡×‚Ƽ4ן¬’P&¦½X÷à"*žjá(+¿«ñõ|:—Ã9q­Óû¿=uv|ýƒ_Ÿ¾T“4:Íy o)F•LÂX ŠZH\Lf[¶>È% º´j»pæh):S“¸ÉƒZÏx"‘&qb tëzÚc÷RY²¨of×\7ª³Î'Oåv¤œûúO¦-lÖë‰ G ¼ó3|gDïÌfe}¼žî«w^Ð-Û`îäõ¤†³†ïXø¯g¶u¬O®S—Ñþ8Zç œ[¥Õ3¾kg1PæÂ®´\Yd+>RK7"*Ò|!xrOM~ÇÂÃ%½EThE´cζ¼x~à’0½ˆ@®0$3üN#–¹(¸é¯]Ü{cÞ®áVéLžàB£ŽVᲞ/ð;°¬§‚3Às  ÁwpV ¨«])<¼£B0¨]Ñ‹ŸPÍU™&"E%¿%c°Ö¸d޹6ÍZÈCÚäJÛŒîEݤ¤U”§Ý‰éÏgй2– KÚ;ht—õï\ÖwUÿìqÎVÙÑ2˜É2Áüd Sî V&Ü©•ÉÄVÓã€ÈÕA®m;I ŒÒ±3GT×)¦Šp=. ›§ K zjSY‡EoSʨ7t'ü^ž5I'—³mÝ;§H¥¬/¯§%ŶwRÔ!ŨµÉMÍÞÔ«ÉW ņ=L € ƒù&É•KÙ®¯s%V6­äa{çÐj×t·¥é¦*À¤êÄDž³çT'F“x¶@U³ˆö‡ÓÇJ‰kU·«J¥(ÈQðŽãò…ÃÓdäˆJ¯ª¨e>XD|áD9¿p š,„(²~ 1ÙÖà+a±Èô_mJ™n°¥8¥ éGˆÈjkpùrþ¬Zpt©ç¸¸–ù+Œ_ÍÌ@¶‡­Væƒiô˜°ákÊÚ €ò=OŸ°–ò~ZŸíüGú¶àÅ\kNK `Êhݵ?Ó+©¨Å¥‡uÃÔ61z)žuym‡©2Q ¯ww!D¸§ÎCÖ²ÍzΤši=¤nû®h,󵔀vMíœânBq‚yç²~÷Þ%®m²Ù ¤*¥ –ÙÊ“–¢TSC ðhªÐL ì/â23r71ú_Œ·OMÀ³wµm–W” Û1s~óØ;[„ Œ*1Ì#ÈpŒ;›m–Ô1\2^ÂÄâDœª¹z”È€³®GÄÔDËêi²í}^ÙŸ£öX&%AqÎ’sˆ*Ðgr "2ÓIŸYîÜq>·Ë±µS玶zóƒ;Ú*BàeŽÎ–”™+[~|þ{|Ý1…³Œ¾“Ö+­‰1LÕK6F†g7‘@ V(Ð<³T-Ïh|æ±Ze6c æP¯ÊŠñs{J|żh˹»‰úÁ½Šå#'äLõMï¹Tþß'𖃯¿h “ÜETI³’‡6¼½E¦æ ‘˜¸"z7nÎbÄNÒš[¤» å&ò†÷v-‚×ïÍâfq>Û?ã]4“²«íyŠ—Î]m‡¦yýƒ¾±óœmc‚Ï þ³Õ»ßn·õØ}Ãl‹‘¸ "ÎÌåÕεZÊbÇ©·rÀÁ¢õ¶¿Wz˜´hP0I¥rRôc\ãr)?ÑFé~Na©ð¾Ovzz¯å+ZY’í–Ž:+Û”eÅHììb˜Ñ7# wIšZ’ƒ§–supù~ `ˆ3§‰Vo“4ËÝÆ8òÉçmÛ»r“ “ÂŽýE÷ã\ePˆ(¹Ë|G¶™³`vwœ ,&´£¼ïÂ-±™˜ßCsGºOʾÑ:Ü_¤¾A-Å6scX­l”€S KGl†Èr]­¶XQDꮬ>°ÞËfÔ0 ™¬gƒ(c ÈZÆK!B:ëÕÀ]| D ™¸¯,¤hÒ ƒ5S‡¤[ãŠ5YS(ÀD•üÄ¢L¢–sMaUøÀ˜´nHÑO´–(Â’+WIRcï¤Y÷?)«ªHÎ~f¼™Ã|ÅP·C÷ö“¦:^Í·W»Ð¡'Óy·GëÚ|x4ê½3 ÇúØç>?‹Í±^û¤†s»2ÐîX{Sç¾ñΔà}ë;|bÑL÷ñÖwàîL´xcwðܦûhº™LW< ̯Ÿ\ià|àw¦Äø(ªšpM3;3^èÍÂYkQˆVGÓÚjï®θÒÂ> ô¾XúòzËw'J„QMd/"~"ªäË-²u(Doõ}-M×:rF&‚FhæùY+#ú(âÅ(9o=ÊOD(Ê—&y–Ȭñ8R–SÔ(Z)&WkoK˜–²§ž¸\¬Àú^ʆ[ŸäÊeÃ1jf…¶,F»µŽLÜÆsãµú„‚M6q­êØ] R^ž\Á´ÇÊ­ßÀM§ê {ôT¹ì…ƒiT|µ²°vhß~2gYQÀ3]œ<¸(PÀC”öà‹K•p!œÁ$º… Ÿ¦fÙý±á§[%xp=xnx=¢,b¥Â4X~ îN%fÓ¡‹YW{3{‚*q!^µ–½ÚÙz™çËÊ0dp1DóñEÚÉ€Pp´têÍt+ò‰ ¿3çzž%ü„ò[0YL¢CèííÕŽS·…a.L®cn¿ŸUÊvlñ„“ö NÍǸÃeò g;_‰ÞÍ!ýŽ®õ¥::ƒk'`Û¿@CÓŒ„е.‘S V²N'QfX`‡h,ã)Ÿ”±[ê’wÉe3µEÓK©àõc„Žg»Í§¡:Û RSÞÖž4ÍUêªFëë#œR"/?‰‰‚1‘o’‰*‹¸Ò™{¢mr ú'Uáåg¨YÞë£$šõ¿ÝKýo‹ôª@;e¬ b~G«ÊÏ  ÃÂïà¸Êï(Ö{åzl¬ Š±Û©bKT·£øð™âºt<ü| Vò(xnøLáhЇë ì´Šmr w 2ô­I¢w&†(ÑgD«ƒbð`²g+0UË1ƒDë÷Õ[tsd’¼˜ O¦–<™! ߯,…â²€ßÙQ)Ðs‘öƒº2´4¨GGðiù=ð¦z¬ˆ‰¢‰tQ˨êGóö“3ª*ü%(éŒ2‘»¢–…³‰ïÀ<£É(ŠÍÆ3ÀàÜ~úcüzðàÌçZ}‚ï,e*¥7û ¦d*xÞýgà ‘„&*'a©#I˺·Õnµ¯±Ë–¨­­Û^•M ŒHñg ^¨R¦¥ [¨ý ´Š„mÜ4p»`DÔ´p#á“$ÖyRx«Þ^Ò ¦ª“ÓUÁ‹µñ×O­SÖ,!£ãW6áF¶ v5˜~½Îs>¼—=Ñ#‰G}è;ËÈ!iÉ}Ñ>&ZRšM‡N¼¡j¹Â)J!ÊSSõ®5(ÛIÄÏÛÐ*Énù¨¥dFÀˆ¦YÝqAÒfC멉8jk!v| Ú #½8ÞŽóe˜?`“—­™¹&ïe©rÑ{¸éb7Ÿ^óìÓc‚v d ci0¬¬X'DÊ+شα>ˆ{CK4Ráî]Me1ä/3ÜRúHÑæìÚµlcEYÜí¸K´ r]Ê*?3:âRË¿¶·ö †,"ðØG­!%†„bƒ¹Äõ+0:¡YÙ2Vsç‹-fl³ïÝðs{4/ˆ0Ñ º´æº„”„+Nð†ú ¬i*ø¬‚¨Eo³ÒmÒr ~E¶Ïzɧ(Eo¸"h¯MÛhmÚN;,¬ï>SÜUï(>m¼;b GVh ÍóÎïÚ®-ˆk¾¯ã§_‡'¢ Òô×¥¿°Âí2Ü„î4õ±2çÄñƒ}î-O·³¿aŽ^iÄíµÃãÿdêçcWlrÁ-Çá'ôz©híÖܾL+õÛYwp´)*ñ2¥ NvF’õ8¹©p„»ín,ÃàÑà;“0QKï_È–%¸óŸO3žgþ}˶ñ$€GÃ$`kHìŸyâÓ›+‘nì*Üï•à3‚T ¼ü<Úp?-ôU}œøÈ:¢‹}ÍQ—¸éáëÓÿ¸Öº endstream endobj 4505 0 obj 8366 endobj 4509 0 obj [225 /XYZ 38.2500000 680.750000 0] endobj 4510 0 obj [225 /XYZ 38.2500000 477.500000 0] endobj 4511 0 obj [225 /XYZ 38.2500000 680.750000 0] endobj 4512 0 obj [225 /XYZ 38.2500000 477.500000 0] endobj 4513 0 obj << /Type /Annot /Subtype /Link /Rect [297 716 363 722.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_typemaps_c_to_java_types >> endobj 4514 0 obj << /Type /Annot /Subtype /Link /Rect [161.250000 695.750000 229.500000 702.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_dynamic_linking_problems >> endobj 4515 0 obj << /Type /Annot /Subtype /Link /Rect [43.5000000 743.750000 72 750.500000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://github.com/swig/swig/wiki) >> >> endobj 4516 0 obj << /Type /Annot /Subtype /Link /Rect [80.2500000 65.7500000 108.750000 72.5000000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://github.com/swig/swig/wiki) >> >> endobj 4508 0 obj << /Type /Page /Parent 2 0 R /Contents 4517 0 R /Resources 4519 0 R /Annots 4520 0 R /MediaBox [0 0 595 842] >> endobj 4519 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R /F1700 1700 0 R >> /XObject << >> >> endobj 4520 0 obj [ 4513 0 R 4514 0 R 4515 0 R 4516 0 R ] endobj 4517 0 obj << /Length 4518 0 R /Filter /FlateDecode >> stream xœí]]ܺ‘}Ÿ_ÑÏ Ü¾"©O XÀöØöaÃö!ÈÃâf³Apo'ùûéž–zz(R<]üPb$vF#Š,ë‹U§~þý·ÿ=üÿ??úö÷Ã/ãߟ¾=UÇ®©.ÿ9œÿütûÝǺ¾9üòÛÓç¯O_Oÿûãéò·Oÿ}ú׿úð_§ÿþõð‡?ž~ø§ñ—οðÛS§ºÓß¿¾ü=têô¯êú÷ùçyúŸÿ8üí<âô¹q2oÿÿOZõu÷2 ϧÂàCßÅüeæâTQ¦UîÑ7·3Us!®;y½þ]Ó¨xƒ¿Ì\œ*ãæ:F—Üܶ2ÓÉ­#èuøƒwª7øËÌÅ©2m.]rs‡jâþf.ÿï'Ñëðòƒ÷ÕiÊÑ6÷eæâT™6.¸¹½FêkÝG ÿuø›Û¨>Þà/3§Ê¸¹ŽÑ%7·é'‹Ç˜ôïãT}§crNÿbòSeÚÜÙè_CFÁS¹üý?/~üþôóUW§iµ‡ï>Mîå›—¿¾ŸˆÒ~:Û°m}øþ§ÃïªJùÏÃ÷¿> ÇV7Ó/OTžTø.|4ý ¾cÂGS-ü^Ïgøä>ssPÎMAT𠿃׃g w®úø^vA–˜¯™Ñðzª=1˜ßmz­??‰æû¤*©uu©]uòªG²OÓìÚæe>¯Ä½lUì‡êí“JÃ'6ªgïôíÒà;êÃåÉëððÆúÕª†ßÃ3™ Ò©©—'ÊîÕéÑš'xöüN ßéíÉÂué®.p<&Í´Š5ôsL§yybŽMÝöÝJ¢àÑðÞB~pp3žÛzâ«ë™ÒÜ(‰ÍÆ[Jð¹cÅŽÖ#‚:ˆ‚7N”­™•:„ Á¢F7õìÁµY£”¥Îôå*5qŪGÛg鬴ìóîЉ¨µ!´×¸Õ±íÔÛÉ^$œjŽÕ`Þʱp´‘\zztßqÀ¢ËXL·õÒWø„b9Y&Ñlë6ΈÃTrÌ1×ðn@IêøfDÌ)ÐD ±Î ¡¶O /Ù «‰1 çÃÃÙcµéPµð‰C@‹8§rú6®¯‡…|GØGßa4ëÜúfôÖ*„Çâ@ùÂ8¤”DUÂ"ÇÜÁ:Äv"!ZGŽÐ…Ž­dì¬ÛñŽaÅ$ˆ„™Þ/ß×G¨§œðûdŒcFɦ5I¶Ùq¤šÖÚj£ÐEG”qܸAOF ´ƒ¿ó9ö©<ûX2HÌò„1u&¬˜™’÷KO ‹ŸJb31*á s€´„’¯nGÖ©$¼$‡É@pÊxýýºŒÍ\ÆH¢¼1̼Œ)DøvQ,ሢµUÆ­„0t˜>¢”’ pÉ^×™gD7‡‘‡é&"в_ ÊÈâÃ2÷¹8–Hˆ-*h‚™WöF¯‡p!fÊJ–(©BþŽY‹ÆHÞQ@&»dIÌÇ."*_¥ªÞÖ¾[ºØ`|’ú"æ—®*EVó3;s1? LüÔÖŠ”€™ 2êÑ¢~·MÍòÕºªÂãÍõ|æ¿iÇߌ=ß¡æ­l»PNÍ)WŸË*OëÎà‡³ÈênðëÓ·h9àXjvö¦d·sˆŠT%õ”„ 6'ËTbì YZ?KÙ½GŠ æ­Ç6¢ªZY2äB¨…{âk2øìÉXÐNƒÍ6di«0ëUð;*¾©VÛ4ŒnŽÛ¦”ö*&žûj[4G€òÒ Î<¦üQ¼ ÞSöœ*Æ2Ÿ»ÙŶHÆô"BÙT–!JÁyŽ< Î~€ýÙíSÛ3¦ºi­o6•ü€ŒÌëù_ê3úNݠѨÌm&k& )Â2—Å:,RôeAÁ"ÖqÒ°0Ä|w' C*LXŸõá¸døóPÀ} ¨ÙËD£–ÆL—®['âÝ3<~øÉn§/º ²•B*»0ó3…BªI69B6)Ÿ20 dçæ¯ÒÂçJ‚c (è½Ãi2bM_„̨‰`*\[™D¾1UŒ#ÚèQ’HbFa'õuÃógJì.9¦$[ Ç¤ý('Ì5L¨2{*2–ÌŽï0~ D1i²J¤bœ/á CyÎ×î8DvbTŒå,¯Zìý\Pe,8ç†ÈÝÏQÅ–:m©Sdn8 † ÎNÂïL7þÆ‚à'q+#`SwIXRFLglü›œ3˜"mBßX›`ì4¬€€ƒCR„——aÝÀÜìàwðwúµ;úv{êcïhꜴó¬'’ê`ñÈjÅüuùãOŒËÂàH¸rId¾XKÛN2$H$“¥( -ùà>oŒò™jÀDeFŽx:›ÅE`¤.ıÌÀ Äh”LOtu8ŠºµgÔ #þ ¼m‚l@øG…¥Ô–•U+ùJm³—Ä0¶¢£.ƒ‰Åç’yµ˜ÝçÀÊie±îÐ×#å®é-zÔS²Ïxn6ˆI |LáºMË:"õ½ÍG7jQ-r#ÉFÌ¥qªk‘ÝJî àW¬ßuÆ\rd»Nå‡åµ ”[„ím^ m󢌮WÛ- ’yŒ™MÓxõ`‚Ègßz£&¼Š€B*y!Ò/.gnŠ62D¯Z²yôTµ|´“„&ŠêrWä¿ij[&]ÔÔÒeýŒdݾ€|­l(c‰Î¿CžùÚØ¤úà\{ó~æº¦ëÆ›÷Æ´·?Èqó~ž‚uö»ëqŹR\Â[LMÛ­+/Z§KÒ¼ã{‡xa@zF0#BIÂ1¹ô•ìð2å¶]8MÍ:EŒp¸÷†¡ ßÉy—¤ªa½Sbsƒ¸y¡Rœ‘Ï^[ûæh—ýù¬ÿ9îGgŽð¦:9'òˆ“uNÒ•?»%?’±(äâ°Ø²æ"Ôuݾý¤ªŽ'áæ8·èɸ€æ¨g€‡p4üΛ^zg@ï˜f:öýÀØ-ia´q{—f=b?«ccåiøÏmêê»°žp´gôd„ªìŽfÆFpXf;qØŠŒÀRaská ¾¤:×}íuw)LC,æ°üµëóåÍm)# >d3$}âá ÌX”’9™;#Ñts¼ !!6Òfàæjñj³ž]£;Kå]§ç®ØèŠáDž8J°‰SMp\;0u»£5^)‘ðSa'§õÀwÆý‰™ \Ù%Ð %J¥²1ª_T 3uÌÉë¦í‚#Ïïð°Z,sÉ!ͺKºyí0ÛÂâ' çÚᣇ#[X`@1ÇäÚ•ÚævÅnuV4+ˆ¾áJäfjøs~Ç1,ÞñžÀ'%s,ž›Ë]ÁcCナ„yãØaüŽ(_¦¤o­ê;èK=ÙÍÔm›©K3€ò¿†ïl3g¯Çàó<$<ÏÆÜq6å°PWÌ´SwÌt›ÇFõ‘¯$hXö9è†O7¦ž\–cXk9vK_bn–¤Œ¼ÄsÃέÆú k-F>¥´Œ†HöÏ£YFP82@ð™ÁßÁz\öœá¹a{‘(›´ðþ(Âvxàp¶&Œ¤8l³"¬¶æô Û°ÚÝ‹Õs©ßôæ-“/aGo²S(I¿'BêHOV¹Ÿ¹WA2¹ãv—š$Œ·æš‰Šõ–u1¢åB~’ƶËFÿÛ¦ÙÀ>aO³'Ý5ÿ ÚOµXêó¹ö¡Ö©R»úz…( %Èt»gJ$pzb€~Â’§±0œ¸™Q1/ˆ.¯;c¦0Ù£Ž"ÆõT’m&“ÊŠd*|){“˜éQl[èë~ÜFfGôRžºé,5CU»Í¶w–Ë#À+ŽÌ–A"îóÍéßr™íÖ 6•cŸ¬Þ«ëû·ŸÌYï…¿ƒ+š>Lçß®÷ÂÕV¸ªkÜ»¥ÀÊ)\=6òbÐzpåS¥f`]”š·˜ìj‹_µ†»ˆ+ãp•[ŸøjÙ¸EŒRç·×W¸‚káã îüø &™ÛaL3Í`9ê¢ã'˜:ø¦r@ˆpŒ¶ÉÊèTz¡hYUðå…,ÀH±„õUC§ý§i“OÊoôÌ$Òï¿“íСCE/¯¶.–5û•»ð•ûÎo¿%“UØ/‡»[fð\‰,—ø°BS÷ Í•üd×”ÒšRaT&RÇø»¢Ó»si05Æîz0ɯsj^ÅÒ¸Ò„š¥¯T9º`×,../@³ìIǧ?ÌØ’w;¿.ÐpÖØ—phñ”º@߃ãXòY]¿»…ƒÿñܘ~! -Šª1ö)›[À.d—Bu‰âÎ¥ë«íL… •‰fŽóÄ+\*n?láT³õIÒ‘{2XY²Yi±k$N­d Ö³7U]!Rv/ZCÍäX "ñéã9ÁŠ­WYè}²›ß*¼MUHoT>'âNªŸ(¥rO“Ká6äùs¸f—;Üië<ï1¤*A›ß¾ëmº3eÏ‚|6xŸd•ìÕãÐÙê1ÄçÂê$‘!¶‹ìRÌ!²•Òf—Ùd¶Ò3ã÷á…6UÌIõq LTUí߇õÛì¨eÄåà‰éÊÔÀ§CjmD²ÞC"%¾ø@0¡±õ•¶Âq×ìÞç6áG ´ÇÛ•è!8á¾h´„Ö†]–Bfèmu <$YZijGQà 15ÝLÂ2‘]ÁXxê¹V&¶aâÌ,iÜ6ÖĽÞsÌÙtµ5›T·œÊÃ-b/ÌOÜSÖVíêSVa(4DÔ’aõÛf&Aò#eu€ŒÐUÝzF€lù¥SDGo?>†#e_2É«›ªý(ì;{gw|×ñ••)¹¶Ù[¢r‰2’òT§E-é-(kËTª%:'²)(sAÀôf``&dnË·™6³¦R"·õ#¦MRŒëöcyÍ<ÄîàÇp®‚ÎØØ >f­ÃtÛûº¶øõJÙßdÂ~m¹™>iøÃLŠ#dŒíf/ꉂÍqÜÇç+ËæÚÔo”eM†äçfwÜRiûMøìoB‡7¿]å²#A²ëv‹0[º¤¿ùFºW¿`#uDnZZÄ€‰ǣܷ´’,ÄÔtžÆŠÆ wFTô…wëQð;pfµš¥R›±…1µ½ó»aµVù «˜¡É)—ä•×w“­ “ ß•:šGg¿;Hvª%š\lW€¶­ÏÝšxÖDßÞšFþ›ùÄ¥#ålÐß·ô˜¡Ö¾³w³àÌG¿k"‚ëЄâ”É%M7Év™˜?}3 Ö”°d+zµ‚ˆu^¢û‰Æ‹/l6´HIQ‡0 Û=ƒÜ’¨Ò&Ás+ÖõŠYÎЋÁý YM·>9‰RåŒ5Î\ÓÃ({¦:•‰DVA!9ÀÄ/U’#·Í¤2㳘Z*Ÿ!W¬ßzðŒ1Ϙ,Ko9&¬Æˆ“zck‰`¤1;“?¶'šAš œ@ö˜ cSdKÇÇ€í§ûÚëáCÆ*î6Dt’+†ñ(3ĹaJˆèر¦9V)†ŒÐÊÌú8±u!Çàx9L¹¡ðj$r:ˆJÛ';YúšèÉZb]£ÄÄIˆ`þüb;A‰²KÖÔuŠžÊLP¯ç "¦«T(Zµ^F½c Z‡À‡ïÔ 4'™ðÏX¤¾PDýèÈ=é¼NQÄC ëÚ:‘‹Ë“á伄X™M·‹q…­;ÛÜl¬OÖ†up%:ž*Ü'~švÓØ”òéÉ%‘êC ³ï±d³Ã0XÊßG‹Ëµ±•²ƒ±O9=úíeÓÜTÁœ#‡4fÀ5´f[žQÈ'ÁF…¶E˜@™²ßaªýe»Œ1wÛŠ×E € ¦ †YT©2ô‰ô G›'˃J¿Ød®•Df ÕØGôzt‘•%©“¤ExÔ8©™ùD]ûpñÂèÀ„ñD*D ûK1ûÁ=í#™‰ºô‘3j˜k}/4f‚ø¥i½ÔfîY h *Š(»a“çÁ"Ï.b28PÝ©IŽ¤êš´çfm"7뎾*RYÝ5‡;™(¯$YÕ”ìÕPªï@® éÂôZ1ä™hézqêeÞ˜j­×–^ó°áå eÀùKn»¥´uJÄ>#=:–P‡½3]ü™YZ|"C|"–H¡&$2)™¬bʼaª¤Så1¤¨¯€8cöbQQ¿)øFïÈ¢òâÑÀ r¹QŽƒ“Ê4 ¸¸•ƒ5ÃWúck£§ÞQßÎ×èÉhÉeɘ‡‚ßÁ3ÀٚȄUeÔ …{R_XÁ, )‚33Æ5„U;àšÙ$¼Ãx=Ìh¾ sPó2Ìê³®?„s¬£N… (žA~éPAŠâŒ#Çþàà]À™z˜Gñw0çT4#ŸÌñ5^)Á££³¼ô“­†Ÿ`êàwà)qÈ*̽p=ï|‚u‰ƒß°ÜÁºÄ—ÿv¶1ïàý!v±#2ïsæð |§1%ÓjïniB·a.wì=>MW8v žGά\· ÿžôÊ¿ºM>a´ãn½¸f`ð;ÄÜÛŒ”glo,Q°‡ i ¡%"kÁa~Ãëal.‡¼Å^)¦(Á£Nåíš’wÛ!ߘ³ÀxÏØ~´NQ÷:êú*Gƒíú<é»>,@æ—ÑÛÔmj¬svNä81•3Ä]†cO1E™8 öC‰ ÏfVÊpHR;B ÅhþÝŽpɀݎتôÞí—±[ »µ°[ ±Lï]÷6ŸìÖ‚´µ ð“ãÄd øò¢v-.¦Å™hÀ£qÈ®w´Þõ.¯w›Î»îm>Ùõ®¸Þ…÷zŽ{JBª:$$–»vö‘·¹Û»¦tñÛ®)ïД]ë]÷6ŸÈjÊÄ(aÒÏ83LªãlBZk(Ó°ô.zRÙR¸~û”)%ÊÐL{òEê«t™¦¹.”).ð”jÉÀ™1-Ö#¨;` dü$¾b[®"0wDá)5Ùl`o²í¹aÿ ã«1Ð3ÅGd•A¤a4Õê…¨õÆh*µ†4Àuô±NL|󪱅ÿÊtß _²Ê«`h4Ç!ä&Ñybw·Jt’KbG=Üêa"Ì@#á§ lÓ†r"€x0½˜H;Moû–åôÏŽjæp,;á†Á©d-nsùŽjŽÕ`ÞRã·Áæ“Þ*! øÄ˜«D{M&3f³£©—•(ê† ËaÂvðo³(²k´ÐÖÞ¸Migíåm²÷În¼ïÆû›'ÐXÈÖÁ½€˜®h [XP<† ŸÊŠ)Úr`-f¹Ÿ©ØÝ“y8O&¿Ù$£pâïvÔãÚQcŽKQ–Oþ®7‰¬%ݵîé‡'Ü1+¾[[u3¥;[$æLC†ÃD5Ý6]í÷ÓÊ!%Ì|«' Ðf¾*f¾­¯@ ;Ìü3ÿ»fÞ³ž‚KÕv˜yéRµ÷3¿M`øžz Ǫ0÷â³ õ1ï ²xnø‰Á{šP¼mWðØ&ŸÈŠí笄s¶ƒ5W.´p°æ¶ÛAWÖä—F·ü¥§ºßñÙ5i$ʰ±­­àëTщ½ü\ZhÜâILxr?»f궉ïÔCÖâ‡àë{kÝw(טcª³ç)؉9gqgç¿÷LUýfìd*ƒ¯«p"qý渀__]@Óðì%üùsº¨›xLkBË"8xScj±¶µÅdöü®dwõ{n`²”s3 ©á˜ÁzF]>D¡jú¬4Ÿß‘wÅä†Éæºm´.Ÿ` õƒ°V fSã º±4^É™²±‘@6©¸c×w0!£L¹¼Î¿R§GoOOþì: £gÌ-ŽÅQmÙ¹J^͘¡ÝÕëc-"¥l„QÇ”˜É ¹6í¾˜dgüÄÅNIþ ‡D<ޱe<F£1Ðfx¢ì&ãï„ÀpŠš É*VpVt+eëð„k©)œ_¸ˆŽF…•>€ÃÄnñúºÂ¬1Éa°Õ˜½ú™|Á¼ÈàFhÆð×—/½™05á'…„jéÈÀÆ ¥ŠÂº2á‡qÉÙé[-¬ rgG«óCXÓn32×Ñ’U£Ž{[|Ò0õ‡õ^‚H4;A™oÕ­ví®dnCšhAÆ·ì5|*3vÇÛæE-0[¤ø¤ŠÞ£I‚½$ˆ¼ S¡:¥X©òœhi½žZ_:²yv h#^Tp*)WÎ@þ´²ØY ‰|…€–HÉ”çpP­«;©,=¹ÈÑ7Ó`q‡ß™.áÁOþ‘éÅ2&Òa][:±À”„Èüä°›ÁVðA2ìö’/kׇ e/™d,g `õæ.2ET†âwÅ 6ær@Öô^JE Uj½Úa,o|÷â{ ø€Ø‘{ÇY",ÝØ ³{ÑsÝDt'vX¢XµÂݙե± ·ºs.ßýI Y4T¸i2Ç "7âË7ï y€eòE®DcCô—D1›p6%ö“]´…@¤HûTžv¾† Þ¼¿“Έõ*ëAº² ânìì%þÔòzV­)-:vÉ\CÛblf/Dé’¦ûEŠ·%ªId³eÒo†”•›LÀZv=©JD˜#^rÔFÄ\Ü€–À Uµ²4+ Éáqhf¸? †uÑ¥;½¢Ð°7ó|ññf(ú f 3á'#f¾ªZ‰!p$ˆ¹µM©ÊX0m›dA{¢y2·»¤ÞìÒå'«¶W…tîíýÍïãàïÀŸ·ÍÛ“q!š“îL´Çó€¿=iÕÜþà×§o޳çЧ`íJyåÜÔÕM€Â (ìd:ÞE饲~ L?)¯¾J$¨Uçˇ÷,Ç•[š1˱9^Å3“¡– _3•»;&½çu†ÅF%*ö£XÂBÊk›íCe “òš³Ù©!17È×qEîj2ÈqÀ­­GSŽÌd£¦gŒ…ÝS"[d>¼hNqH‘Eªòu¼ ت„ßq„”lg|„D.Ë|†n‚__’ëX&nŸÄÀy!åéÏáljfN’~õý š÷K$7'>ªÔÙb:è+Õäñ‹)Õ-åxÓS0ùæÉE*¶ó'æy|g´Øn¾‚ŒûŒ¾c|õ¥¹}W:3ÇmÆZ¼¶ù _Ž·óŽÇ_ÏàHÎÂ2 ¾3r¸ ZúMO–áÎÿ>Íxšùghg7á,€GÃ,  döψ=ñîRh‰ªÞ.Á{¹ÄÁ x=ø;x´þ~^è*såÈ:¦ð²Ë(Q}ÒôðõéßqæÒr endstream endobj 4518 0 obj 7791 endobj 4522 0 obj [226 /XYZ 38.2500000 785 0] endobj 4523 0 obj [226 /XYZ 37.5000000 291.500000 0] endobj 4524 0 obj [226 /XYZ 38.2500000 541.250000 0] endobj 4525 0 obj [226 /XYZ 37.5000000 496.250000 0] endobj 4526 0 obj [226 /XYZ 37.5000000 291.500000 0] endobj 4527 0 obj [226 /XYZ 38.2500000 541.250000 0] endobj 4528 0 obj [226 /XYZ 37.5000000 496.250000 0] endobj 4529 0 obj [226 /XYZ 38.2500000 785 0] endobj 4530 0 obj << /Type /Annot /Subtype /Link /Rect [456.750000 474.500000 508.500000 481.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_examples >> endobj 4531 0 obj << /Type /Annot /Subtype /Link /Rect [283.500000 299.750000 351.750000 306.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_dynamic_linking_problems >> endobj 4521 0 obj << /Type /Page /Parent 2 0 R /Contents 4532 0 R /Resources 4534 0 R /Annots 4535 0 R /MediaBox [0 0 595 842] >> endobj 4534 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F8 8 0 R /F9 9 0 R /F1409 1409 0 R >> /XObject << >> >> endobj 4535 0 obj [ 4530 0 R 4531 0 R ] endobj 4532 0 obj << /Length 4533 0 R /Filter /FlateDecode >> stream xœí]ËŽä8vÝçWÄz€ŽI=(À0P,^hT^ ¼0z< ¦.Ͽt(ñä%EEÊOu…$>/ïóÜËŸÿåûžþû§Ÿ¿|ÿŸÓoýß_¾¿ç¦*ºÿ;]ÿüôøƒ¶çþ¿O­N¿ýþòãôãå——_.ÿûã¥ûàû—»ü×ÿôé_/ÿÿ×ÓÿãòãŸú—®/üþÒ¨æò÷ßn·ºüWqÿûúû_^þý§¿_[ºë3þ÷OZµeY_‡±Ðõ—ašêöç¿ýýåçnÂz)µ­>©Ò”§ËÏúô¿ÿõòçKCóŹ-•jê²)ÞÓQ£¯=µµ=)Ý^ZR夣Û¡æåo «¢5Þ\|U”©•¿uÁÍmUe"nîCó×u¯ñÛÈcm®§uÉÍ5f8ZÕ”E¼‰ÞšÐxiÛxßF.¾*ÃæâÖå6·,LÑ-k*ñ%zh^~ý/k`šhw#_•nsgZÿ%¤<¯êðÃóáç__~þv!¸öôëŸ/#»uØýõëï/º>ýt•%êò¯?þ©(Ô×>ýú×ua­«n|Ý]£'Es{RuÝ=:-·†¿Ñ~ÓÂ~úo̹Q¶y|R|sÕšñ“×îI}¶mqmîm}£ A Ÿh4¥nOê³Q·kúÁóQœ)\7ÏL¿Üž4gÓ-ΪTð \âÜm¸?ª] ×_/§.Ò¹0%çÄàý…;¢^Ã÷ªøg½=ãoàh†^»£ÊsÓ=Z3xÊŒ æ4ºZ+Ü™6RTyQyê9ª,{¢,­Ã¬õ¹¼eÂxí@+‡O&Kx™´ÑV=.{QÃÖº…²o?”¨y¦ãþÔÍulœŽu _í–9Weíˆ ¼J¸cwÆ¥ Ÿñ¤®ú›»æ²'O}²ÙÄèf¯˜t ŸõÐÐÒ>E”]UQ;«øz—ËÝR½QZ§é´gãŠ5üijR®¤ð%,ˆL¸t¡˜æŽ_ÃÅLÙôËÕLÔLLrXªà%Ƨ퓳ø˜É3‹Ï,qù*Eëª,¹7Õ•ÚÛËÊýÖoE§ÕOÒÌ“ž¹Ì=©á“>ù>ý>ýT°5ü„A/úçfú ¿Á+ ¿ÁcSp4ÞSØOÏçžøS¦fvÒœ ]¼çd@ZNE}˜þ™ÖÔgbïᘱ=-ã5Àó韤¡ÓôÐÿ;é_Áõhø<<ê'PŠª4u[Ôˆu¼¢°ŸTÚ 3ƒ× Ž@A:èýsk dž©ªÄë†)÷ƒŸ`×S<>Û˜ÞðŠzøÁqJŽSrœ’%­ÏŽ€š)uRM³Ú  OqcšžP?†à©3ý'ãžùà ãSahbʪÚ:Â*GtŽè1g¸b¬…â/V¯×&gP ¤`2Áå …r`P‰R<§s3-Cy`¿æúéiµ8× zÍ¢0 w $XDéÕjíšZÏ1ól‘¬… ˳nXÃefºk ·æaÔXØãõcööÉÌ3a»†‘gÌ.¬×U<Ë؇ ´:@£Œ©]3;k¡£ÒÀ vK{j6¶ø•Ƽƒ2dL£È¾¹„Hceë¤ñ4öö“Aœ$!ÒXÕ;Nf®øI*<å³QEî˜]­Ëƒ’2¢¤œ#õúÕ×Ïö¸¾}"×:8è`a>K”0L£óØb¦å Y]ÖeβZAÉòl²ú@æ­¯È" KÌ…0çbrÀÙ¦0Òs|øÂ ¯žÕ”E³{°šÂ4nIÈwjçžÍݬÛ{ላ}~˜ %•ݨ͹@ Q!EØÇ”À‚цªëë÷ì­,ChñŠdv=.%ví¨D0·‘Å­‰Âk2„Cx bà †P`Z]:1¥XS;bÌs 0ùàYON#’˜â›áÖr)Ñ$ ùKT,̓AÜf‚QÐY5œªv*Cߊˆ©ax¦¹âäE[ãª7q¡­V®ñƒ­Q쇎^Ù¸­&FZ|oUº}Š xE9ƒ$ô¤h8âTÙN2•¤wˆ1œ›‘™ç‘ܲtÇèk“ƒ…É`=g¤¾¹B"ˆ¿')õìÑÛ0ùì®aÙ‡Šñ‡FY¸Ý„| pªé¾á9‘×ö²$ÎâæìØÂ•ªÛOŒà£xP‚”k©(ÁŒŽ4¡£ ›`û(Dv.Gžã>.#‰¤á/j¨%lÝç½IØ#O~.î™0GÇ4ÃmšÉÑá=7aýÄÈJ³¾íòìöùDãÙaˆ§Â”$›ŸÅ R˜5À£.‰z«¸vª'Oƒè‡B÷âš³x·ñþÀo4DÂyèzsºðÉJÕÏq‚Lž`‘Š?­áJÓžÖð¸¢%¦¦øÄ$Ì'¼¾‹†‘µ¾‚Q·‰Îæ(ÛKÊJ°]îiμ³Ä<íy§¶‹»µÏ'©´¤œÏÙÁ;ŸoO³æÞð“óÎ²É†Û óÎŒOºÇþµ˜ßq͆%g_ÔA;ÏG;9K£íŸ$•FõP¹®ŠÅ‡tUzÄyb¢Lf‘t(’ޏ]qù­ò “å ‰ð*…ËZf c„Ê„bºfÀ@®ðL½<ˆ\"Z;Ë+¨ v HÚ‰{íÆ¶i6P¦X㕃gxxFh“©2ÍPϾ º‰î½ð@ã˜ËˆdDÙ ZϺð& ¯ìÝñ2PIFšÉÞâ%²ƒ»‘*Û†Ð(½'Ò=f‚fo ¾ Ö ¯Y‘=~²’\6™³Š€qÆIÀaÅ-3rZbæìb’™œ HwLŠeª`݈ÈN“Éÿ!ŽãÊèÿ\ÑžT;Çuë¯j5îòbjw¬‡•«Ñ“ž «³vÝ^¸5üM¿Csß´ð›j8ÿàá›·R'­ifÛܨkøä•h­@ßhøÏ´÷hÏ€i­£yÕœ[íÜÉF̯u[Qåà3}kMìV‡%ÿm;çôë@zWÔ1bžá̲€düþÈVçÂÝxf>xu°3W©±Ça*aI¤ÅÆ)Iè¡s&ÝWöþ½TY·©Â¢ªöT§ 0}üÄW›ŠÚ›L…j'ã;[ãH¤È¹¨ ’ $$e]“ÛÂ# Ê ŠÖ@¥.Ÿ”-Ǫg·Xã{Å c‹ª‚Ó€OrL«<ÈÖK`*Â0ÎJLw¢AZFàà5Q°éQCf1ýµV9²P}ƒ‚‡)é[X'9âoÞœaÍË}—GóœõÏd!ó€¸DlÀæLk—,Ô!ÄœâFñ½kõ[Á;ŒâÂþ#x»ÆàRœ©¸ü,E¥ÝÕÅÒ$$ÚÜ®õu =ç€)ÏÊè릲Â>UÉuM-ÔL™c‘Èúåe”Ë^)CÀEC*Ô‹ÚŸOâåN,×ÂÜQ²Gniu¢ÖÀ«\&?‘ˆÀ{MM6ìAKlÑOUùPÂì›2]椦ŠW‹:Â=ü’ØÁIêS†—ZmL¡.ZÉ—*äÏ)$Í„?$s­bZµj*b/æúË?ds,…éUÔ«¸YAè}]í$›¬‘‹~“ÀÍgšÅÃFAnàs"±9Pg°Ìƺö‘+“+ ½ž=8º»0¬nšq—s®®%I0Çvakøà~>ÁoZH꘲‡B~“a/”ž@E£á<Od£XÏD6°‘Э¹ÈjÐÙRÝZ×çàýØÚg8Ó]­ÙS óì¦7L˜'ÕpEÅ äð0·îiÆ4Ñ+Ds|Ïú5œÆûý/ûuŸ4LT¶÷sä>S°¤õ–"…¡"|޲íÌâÎCê’õQל³>“…DÍ«#¾jÆI‚áQ¯±×® pý0wœ§Žºzs¨Ì®`ĔКHX|R××6£*6ˆTi¹4sFxyþòòù‘¸¾í ‡f¨\9Ô§œF9<‡O4¨á¡@<YÖD@^Eé(tñ ±0ØžqAÅ-ž–†;ÁpãÔK:„ÈÚ>»$¤d£‰EVÒÖáŠh[TU则]ir(æ÷©&¶«&¶šSMl㪠—_&ªÉõ-3jÅ<öqWM¬™SM¬žô¡§ªÉõ-;jÅŽûH š´+Ø"Î×-L&œŸ½¹ É øàÿ V› Y)Jæ/ \¿É\?Ø­Š cóÅžk¥Æ(Çï)AÍØWqÍ8’ôŽl"ü’ó)¦2¤G°mæ9LE®9' R7Çb3ÑŠw©ÖÍã¼À¡hÖÀNs$EwN¶êñöõ-„Íùò¶«”œV×YÓ¸Ï| E–¸¹p1Ö÷ vUhå̯Wq残/Ñ“â>ù ŸÀËç{ÓÌ<¶>gv®5øM¿ÁóÁ£nàºE¿I©ªvÉÚ T©0èdðseÝ”b}ZªÈ† Ùãì>´¬}kYOqï„´j…üÆ”€åˆq@cr¹¾ÔÔÛy䪋à©R/ré7¡Éa”~r€oç–X|»½¥Îè9© „ÝäËPø¥€[ÚE­j*¢L¤ë‹…­6£ð¡ÕåLøÐêÚ í]qÇ··Ì¨óØÇ>´ZÏ„íÅDqûP“ðáí-;jÅŽûˆ>´z¸øf±¼PN¨€#èe GPÆå˜ ˜…YíæeŒ“µž`ªÐY@Ê& ÁCª%“‚C\ü¥(cÌxbÙ¸’n×”FUzÙÐ/Ÿ)»´—èßÀ¨w†%K¶¿EÞ³{.f"`‡”zl‡”fÎ)+×F¸ü2±C®o™Q+æ±»Rª9;¤,&}S;äú–µbÇ}$°CÊûcƘJá¥xG"C:t²EÅSaß=cÂ"ܘ9nΚdm$Fø{ Äbl³Vc¶Yë9¶Y—.K»ü2a›×·Ì¨óØÇmÖÅÛ¬Z·Ë/¶YÝåЊ÷‘€mÖ÷Jù³Íȸm%é¹AX€½…O>¡' ‚ 4 ×÷Á— @¾Áóß0c»—ìi  „”16¼¢%üƳÛxçàTZrulMa:€­i¼xÔxð ÂàÝD&ú)Ùž<ç¯(l­€ç´§ƒ˜—+ZåÊF×2MÏt{'Cx•¹“¹6Špz˜ÿ^¢ºO²V@)fXÇ °³V€XvÆ °w+ÀެëXvÖ h&V@3c4w½ßެ›Ð °‡àZ÷%94ÓC3ýšiÌbh}ŽÞÛ);´%om ¬-aX#­%ˆ³êÖå¼›åm~mk†ż±m1ÖÃÚbNk W»þâêa··Ì¨óØÇ ‡µÅ¬ÖNô°vFkÍëÞŠ÷_k‹ô=wà¿ái>0ïãáûF€l_Ð2Ù>1¨hf[d¯âÛSñ¦üèm B‚ ÞãoSǸ "~ÂÌïœ'<¯u¤d²Z‡è{k­윇ˆIþϸ¶º¬Ä¹N¯#Ã×§ýRØàDåä’錷a²ëØXcrþdaQ{º*‹±”Ó\Ÿõæ3c˜¬f®›Žé±P±fƒ¥ 1XOžnŒƒ-Œ²E°‚–6##Èó),+ˆ$Ra(¸l y¶’'~eˆV×ïÙï'\ø$Qž=F­Œ/ìZåP“yÓ_{13kê†THƒ“r}€žçä <‰x°ù2‡9_CÇÞîboñ4˜b"x‚x!Õ+¤»ñ.ÓŽã]e1ï*ݺð×_&ñ®ë[fÔŠyìãï2v&ÞÕ·¾ýõ7Þu{ËŽZ±ã>Ä»ÊjÙš8â]ø>Žx×Õnû}:â]G¼kËx—çFÔOj€=O0ËhGÁ¬ ø%.¨ÄpRÂ[&ì)úpQ&¦êXÖy\— <êl°³[vè*Œ+™L+<9—Qf}Ø“ñ„iá`æðfØ$ˆéY¿Ïë%)Sº ϼ°ã+Õµe1n{Ó@\Ÿs<ÜXHKì10Õ+Ø—xV»&_Kpùq¸<œ-Ñ­âÔqøÀ""眊§ÇèÆ”1oÍòÊme#n¯œç”».а%¸Ê–¡V¥CFŒ5pqìÁÕŸ‡«3ÀDâZbŠñK0)Ïâ'Š×{ô³TUEµ=¹ØU[cWm3»šÔ‚j»ZPãèÓõ-3jÅ<öq]µÕ\ìªÔ´jËiìêú–µbÇ}ÄŽ]•W lá`SWÛÍ+ƒO&²„‰„1,0çjž<¦¸˜† ,Jt¿Šgl"‘F­ Èœ ÆH(L¼8—\³Gd̺¯méÛ_‚L=×ËçL¦ç)­ôdîø=ºÉß ÌЗªðÓ§p€»qOŸSî9®P‹"¢ ¨LDáÕÞ®YM‚[ŸuGVkö,òºÝ£q™¥ªìéë¿ë‰=}ýÕŽlÝî—±=Ý¿eF­˜Ç>:{úúïrbO_5“>ŒcO÷oÙQ+vÜG{Z«ádf|ñÍfðû]ÉéGÇT$e¸'šj¨oãc9Lh†XÆyD51 !÷a' .ËbØ(m( '‰@¨—¢žˆdèÀ ÊR¦Y*f:ñ?[0›‰çÊb¦±èS¥ ™3ü! íÄ”oÖ:nW‰r ä¹n¬ªŒ³Fø2) /“b.­ò\ ¯ôÂcÛÁuVA+ª£_%Ú»óL‘í òß`q—Ò›r2߃fiÆšÒ娲.V¿³(Üå™çqé¹UjôÓ;ÖL¤ýžƒ`œ("6w xK¯=®hææù]©@'8Ê9!Y“›BÊ1•µD唆°™T ãÝQ \‰Í÷ºç“^¯BíE‘RƒGqŽâIËBÈ–/òÀK0 /™Æv‰<Æ®†@`^5¡bÂ!Kʰꅰò*ë+ÙP᭠创€‚ë‘öæB^¤ô(Û”ƒ‘Á»å $Ê!1æº.„ŸÉ:©÷ ý„Ewñ…§ž«Pq¡|õÒžRg¶¿‰ oþ¶—R‚µu$_€;[öJç ¬ Ìhd[ 0¹Dy_†xf3¸x‘<‰”—sU¢¬SšHˆ]› >TpÙJ2WÄæ&‚ló©‘GÄ~BNìzo£L<ÑPj-h“ŒÊˆKX<ç–†ø›€@?…‹bbñƹå>®‰î Ðä¶´f븰FžŠnD‚„'¬ºBëqÕÔ¤xŸZ·Ü*`¹­«¾`§×ô¤ËÞP¿^‘•å”x’y +N“µo•Š36mýøÃß^¾G¢kGÎq5Ù¨‹Çâ²+—ÚYÙß_l­Ý¥^SaS´ÈeÎ&ˆ¡7,u5G´vºœ;%KºNH úÆ£S1ý´è\]Gaé MÐ^ŸC½À'xl}žÐw6ˆö±W¡*ak¯±}o7ëû¥Ž¦‡ÌOe0× *+¿XÞf÷£x¾i¡‰L2ÈaHT­QƵF@aL6\“>ÈÄ~)øMîNÔÙ/ %bpªT0‹áˆ¢.–Èü!Àg%ìÃdG&&C:0´à¬dîôÃ37hŠV ‰}§[øžf‰xD2™™Æ «oPv$ªAMm¿lm“нkM˜"E³Ðs¾ÉoŸ„N¹Ë±ë;؃5“¼q¥oªc} „Â" ˆ«ß‰êÈyn °eËŸÉZ©²9%aMØ‚IȱK3 ôhÒb1]–ðÌüÿ ÿÛ7vžéª'°n‡!,"¼'Ø"òXQx!Uxü Ø&Ô„ù%n ?Á­áù`>Èxo°f„× ®ŽÇGƒwëY„m^aÏÁ=»Àx!àLñŠzÖò éÀ|Ý`n‡)„èÇC!˜‡0”)Þs~ '6bqeN\Ͳ^O|â‘›‡÷†Ó…ðÉÀü óÌ£ß.æ6!-ëz‘–±öŽ5~ïî‰ç4=Ù“'õÄéÎødxäó·„'£¼Wv…Z›8žä`ñn/¹±Å‹%£b ÷ã‘›øl’s®”¾Ýê‰óì#ãõÅîæçlû'ÇIÏá¤{Î3ÑFÎì˜;ØåX%æXCÀ”¤á“{°ànÉz!²æØNÁ;÷a8 sž={|ò@ØÔÅÉÅØ@&ŽZa Á7ö¯¶xá7¦X¨sõuuÓÐXyŸƒY•ïà˜›lü ~£+sEì&üÆÔ7¢q Æãïñª3hcf¦bk/˜zË„¾Ðº±ïiS0ºþqhîW]¹[¯¼¨ž¶½þ´½6ÆäKzN AåžsFx?·×7<ÖF@1zæ¢þäíW”ÉZe¨wŸ«ãɵ]Ê>xš5`rF=v3¸ û\Q%Àäƒã'˜‹É¢ƒc¬h]ª¹Ç0ŸÌ·œÊ“åž'²¹¢þh&w€É*õ¾ºµÑ£ž³V/އ²2üwH¢Œ£žü9Ñ5ÈÙ_\ƒ¸ü9ý¸v//øeé…å±ì£0Êœ/S¸Œðt¿{ ÷âÍUëê¤N3S¬©£}Ö·R‰SÎ^OŸ˜¯ý7}Aþ‡êF€o˜é§_m\¬mnlßú™¢Ë¶qìÒe†ø²Ûz:Á^â®qu­™i(Üü¦¯»¥‚¦þànc îúß—#E}é*œpk˜´ÄþŠÈï^¯Í­*\o•à=ÂWp`ZÀóÁýàÖìûi¡)̹ç#ëˆÂC.Ÿ9ê7=ýòòÿû« endstream endobj 4533 0 obj 7945 endobj 4537 0 obj [227 /XYZ 38.2500000 602 0] endobj 4538 0 obj [227 /XYZ 31.5000000 643.250000 0] endobj 4539 0 obj [227 /XYZ 38.2500000 602 0] endobj 4540 0 obj [227 /XYZ 38.2500000 273.500000 0] endobj 4541 0 obj [227 /XYZ 38.2500000 454.250000 0] endobj 4542 0 obj [227 /XYZ 32.2500000 642.500000 0] endobj 4543 0 obj [227 /XYZ 38.2500000 454.250000 0] endobj 4544 0 obj [227 /XYZ 38.2500000 273.500000 0] endobj 4536 0 obj << /Type /Page /Parent 2 0 R /Contents 4545 0 R /Resources 4547 0 R /Annots 4548 0 R /MediaBox [0 0 595 842] >> endobj 4547 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R /F1700 1700 0 R >> /XObject << >> >> endobj 4548 0 obj [ ] endobj 4545 0 obj << /Length 4546 0 R /Filter /FlateDecode >> stream xœí]ˎ丕ÝçWÄÚ@G‹¤žÀ`€®L—/ º/ /ÝãccÊ^ø÷‘AåƒÒ¹O^’R”ºÐ]Õ©E^Þ÷óÇßýü_§ÿùçéÇÇŸÿÿô‹ÿýñç‡êÜ5ÕíŸÓõ×o`û³ÿó©ë›Ó/{øvúöðåáËå¿ßn/üüø‡ËŸþu²§ß_þýëéO¾üðWÿ—®áoé.¿ÿßóïCg.ª^~¿þüþø›Ó߯+ŽŸó›yÿÿ?X[Õ—%.ÛXøô·‡ñ˜æù×?ùûÃ7Ä}¥®«ÞÕ'S_ÿ3Ôöôÿ~øËåãòÕy¨éÚº«>ò¡Î^¿ä*w2v¨N½k&zþ¥³¼Ñ_Ü×%[ü¶su¨×yõsßúàŸÉo÷W˜Ùº½`–éOIÑÊ´•¿š¦Kpñ/«§Àª¶Mˆ²Ï;׊G*¼¸æÍvƒÏ€_¼®žø}Ÿmžw® ”ñfáâš7;¸ÁƒÇ¹z]^q[]${²«}Þ¹:Tƻū+^®½0þt ùuõwkú*áâ×'bÈxqÍ›µÃûË¿úz]>ÁâuŸŽÝßv®•ñnñêš—Û\4Ä€LD¯Ë'X¼­ût‹?ï\*ãåâÕ5/·s}:UêuõàïM·øóΩR“Å¿Ä,‚wrû p|^üôõáÇϦ®.J@{úú—ËÞž¿yûíë$Í釫GàBL_=ýGU™Ÿþóôõ¯ùµÍ¸Eÿ¤FOê=©¸|ÇUð~ç1~×Õ'øÄÁ'6þ¤ø;ÕíÉo¿^(ùÝ·Ýâ=šÏðîámÕòøNÊ?±ð†…w0öuñ¸ìà‹1Rm…aW¾ñ?Ù)Ü XüäçÂÐÅa:ÅÜ®ßÁüS=æix×p5Ä OŠyæ;ÃTwÍÀÚü6n®ñ;˜²ðmcY «ùc0Í©±ånßnFêÝÛŒ—JL3rüc9– Rb¹ƒ”±O8F›Ã|JdA+ÇÚ?–`ŒfWÃr—ÑÌ0TPNQ¶)áwëâŽp?ø<Ö‚HXŽ Ö¶1¯Êd‹,âNy8ØzÜ)áƒpŒÐ°ßÀSüÝ ¾¬£¨ú:°­'Ü=¦ÌÓ2ú-†Ö.Þ½`s`ûÃëšXž×…ÊûG°6Ö`[@õ;‚-€= ŒÕ£jC šCÏŒäSFzî͈† MÈ—…wðBsÅ\óÁ¿AxX¶Ì½®&h»KüÜý@¬Â<Ç"°ÖVÁÕ,”éx׌¾-è5;`–ñÅxpàÁÂy°~ËœGòyôÌ…5/âÖª±W_ÐıVQg<·ëé~ŸO*|'þb=‹á—¹pŒÙ›óVõdÌ˱g {×°n‡ut,µˆ¸ åãdàFè·‚GslŒ‰D4Pðñ,A4lºÅÛÚç*Ê€½2øIù½÷å‚Áae“y ¹x4ö)b®Š9dq|»SYG²t÷š+€5l!BøŸts°Œ¡ A³Â~k&‹†à‚=͘fÚŒ434›ÁòòÚƒÿ‚-õ€\Ò$W®²nÖ ¶‹…œLxo8sbìebbÞLd{ùÜ…MR–Uªª§Ý`úÁÙß‚¿ÿÎà†--Á[‰ßÁçÁ»NqsY´…k5ÞVä»î“\~b&÷Áb|Á±¸çQÀ1„`uuC°ö%84­k›çý„dÚŸû¡ žÜÈ´>×îÖËèõhzÇÀ'>åÄ›ºí»wïôðI¿7¯ Ì<ñÈ2·š%¾sc–ÆŒÛítàüƒ÷ÖÁï0p»1Ø~bx¯Šqgg{cßÝi^?u-™®ßçŠÍ®æ3"û5w«rO à‡k?Œ·tãg͈«ØD^í¾}ïmëW\ CÇŒ2»¨r%äkCò5ʶÃ÷Œ¹$f"X?ÂJÜ">`‘Â'1¤‹‘2‚#£“øŽp·„áÆ(cxoÃÆB2­rÁQ‡…>1¡Â3J†×錭á¾*¶1¾UŒP2â1&ƒŸ°¹bkÒb žaZÁ~€Í$¼ãŒÂEDè64„™9åšdózÙ'p üaLðº"<“ìÃDÆÀ`ŠTåÿ„èÆˆŸ Å ~„9"XžàÆ’»É0Þ1$Çà7á¸Íå”wO™B®¦‹):Á‚åëÆ€(£Ÿq'¨mÝ•²*ÿ¦6‚r²±ÔPÄ B;?C-Wx“ðà1Þ1á<‘‰— vÙz_ƒÛ×8†oæ#ýàI‹õ§k¡•þ¦Ñ[×½ÿ䕽ßNð =ñˆÐž½ þ 4>ÃwôÎx‡ÝDÀàw¼PêÎC~ç&'M}ž¤”<¡'/ÙbS*„;Àßñþß¹½áó4p5‹ :ƃgž8¸ëÇøûñ\eæ~¼bõŽÏsºœôrèvÝw¼rÒGÜ)†¨¯e˜¹üÃÚûIæVËåA±ýØÊÞÍLò@ŒÑ@dnŽn,á¸drG`†ÇEÓœ«!  ŸàjžWL݉”BDðm‚ÉšR‰¨z¶œûGåSa]‹@ Æ­,'&B|?¡¿&u>cä#x¨Æ7Õ|Us )ÂR %-Ù~)¬Œ d¡à¨Ã,<“s/q% «aÆ •A69`.o†J–“qÃX¯ [Æ~"AAYÐiÄJön”:q!0ž ì#ÆÑlhRF|«Ú„Òrs8ÈPRŒR‰Ñ 8 ±ez,Gå]Êil%ìà·IïÂr•YòÄFap%[Öžª•©ÃtcZ¬½0”¢¯56Àßrðg²ut#¼ÜWqHγHç)£ Q±•ößI(7óÞlåßi4pÆeJèÊŒc9Âæ ´‚j@\£Àä—3ÈÍõR¦E u +7`T¨¦Áh&v\[«Ïè·Ì2W›÷Ÿ¼èû“ y‹žø£5g;qõ~&Þù ¾3 w|s)Óœo·ûæO/(^}ÓÌ™'o¼öá;-ÚAOúZ€>©! ðIÇ”‚™½Y·GôÄ·ÄšÛ5\ͧ!ÌÁ€>)Þ;îtHMJ®²-QbÞ¹ÝowvÀŸ{ç¦ µgw#˜UßY‚îe›Ç{s8w€±S³7|ŒãKt‘ÁÒ-7ORÖ)óæÂ¤í-a.$€·MÄÍêˆÑ0Ì(y£Ö$£oxPé_L‰´rŒ…·Þ¬×1!঩Á‚lö)‘Ö„3Ô¨”7½˜¢”éS)…–ï)ùÊ^„Û$2]¨LQÕì,) `¼w™‹ý‹ñÀW`“cúnÛÙýé÷Öü7!óêM¨Õ­ÇÚ*ÄZ*»‡ˆÝ]–¯C%ÙÛ8)kŽŸ÷ðOñœÞ£ö Ͻw]á–§K²fî¤é"Mo$ý7Ên"ãT7+hº¥À‡êœ\u^¦Þô12]?•„Â`>_ÑmؤÛÂ2q–Ýf:Rdð<÷jÃ%ñ¤&íËäÂ9¸CêÒ•Ç”§¨44-•“`rØ)ÎuÜ›2Òõšå1ƒµÁ"z—EÆ„Cm@ªçˆ/Õ­™gÍ[ö¡ÜõЙ¦›0 \êÈT–dÈ‘x`[Eð@©ûC†à¬*f†poUØÒü˜ÔDÍä«ùF…8®~G\¿kדÚ=µ1äA_MŒ§]Ê<"FÅCïGº u½å7Ué9t!b 9·DÆvâ\nÊOŠ Œƒg¶0ñW CMÙI4lTÈSH«.ÓMG‰>Z´&'Ýþ"޽jØlO%˜f4>C<-¢½Õp’„9Rˆƒz“fÜɵXuH.S{žL¥¶0SàO·y…@̺¥½Å#s1îXfß*Ð(ÓegƒšÒŽ¡-Þ¥X>àwÔW$E `-ÖR2>p§I}­u Oî¡j‰5ú#äšä•Å(j»>T\",>ÃÇCKDð2/Dù¬§Þ°³Üó¹( L¯'ƒÖÛ„ØSÞÄ#v˜0÷!k7)kuF$’öá3IÊèå6™Ä¤\\*™©” ¤N·à›iÆ|G%;ƒkËÃÉ'0dH0kFRžruF´2lК…fìûŒì¨ª :*Y›ÓQRúša‘N’h?‡O>¹wIÃ1ˆ‹Ye¤•ð“‹g0Ê 1˜*uçԴÚ(EëOy[µ$sˆExí‰QÑ» ŠgÉ›ë\JPµê ñ³ÁóÎ&5F°¦‰éOa_‡2ê¥Ö†Õ>¼7b×Âî®Îª÷­Hß Ó²*‚¾¾·¥n€øÈ§á–+'ì»ÁkÍZšÄ•¹¶r%¤éå»Ý<ïÄdÅdÌ¡áÝÉ!cû>&Õ£¢î ^Uƒ3C[-ïÙìºX˜Ø+Åtv/Ó%`gb%s¤l 0/I¥fÎòµ[ ©Þ6/daé ¾H"Ó­˜r²ªº¬"B/Ãê?sºÞW ÆlòãÕb:Q•L*EáNªqdJ4_Ú CóÞŒ±»ê<²à˜æú"ð„06AËTo2¢üŽ Z »Víϲ†L&·ÀË2@{UÄß—ÆPD&è¢7ºzÁªmŒ.ÓdÓ‰Mä0›ÁÁCܽ£†ˆ]<É«nàÞ4JC•ì %F§›®‘)¢|Ó¬~PB¥ `©Î7:âªV[|Æ@Ê­ª ÄY¶R’£R¹òÈ:ÄW™¶G@gC*Úg“óWó7ð;ø¡'cû±™wÑ<¿iÏÎØ€9´·êSüL.u¦ëÜHoºéo¹˜^âq-*@£¬Q¹?W¯Ë´3Aðf—|Kª¦t.Ojtv©~ ©UÉ]âÒb½JJâ3Ê_eȽ`š ×R•€÷6®Fg€¢Ê4u©&˜ÉÔž[b¦ ×£’£U~FĽþç)V`rkh$”­8† eÎ"jW¼_-K̸·í{ý4ÎÏc*8â$į˜Šì=Ç:òÜpýº€±$ƒ#S8¦ˆ!o˜ˆ¢ã8 ù\'…«9øŽËå䮾? ¸”Ê$ºñ^Ì&U}ï-ǵB¥6¦!¤MZC‰¸c¬wÄ$Õ6*q¶Ô-V3yU§°HàK)Iˆfê"ö± à†§®Õ²‘—u§¡³ïI/JŸ¥²”p*¬Ó0ùXxXƺ|²ký<ê<¾O¼Ì2|1w‰ËöAÍ]ÀüŽî®›k6×&¨Ö^t•P-Eé8>VÃ<gîÃx!ß“&.c€9– x˜1þ34Cäý6°æÂâû!hSàªØSȬÏCIn&“šÈÏÇwÊpb!3|iy¸–¡ˆï$_Ý”­ê^ý«²oΚ*QÖfÒOò¼K\YߘàÖv`¼$Dbkú©“øøÈqÚi¹¶ éYb‹ßöðOHq|ÏÆ}„ïÜÝè]×´!Í–ïUœÜaç†.8õýGvÕ81¢Üö2¯”¸ –B@GåÌ”hbþqe,£gÜš&èm8§ 1Õ³ØêÄþ¢b]·¾ZøVàpí·ª'MP±' îzŠoÔý”÷›ÖЗ!ädÈ.‘kǬ5/  |í~ÖŽyÅÅÔ£j¢Q\MWŸX´7á;p×ÞU5·þÎÑtgÒ¾ç ŠWÃ'Åç÷“«âÍÚæ% ®ø°É{«F‰ña §ÀÕ„¦Y’­þƒ0Þ…;"'(¢’ª7aÊs/ˆn2>·¥LýC(oGîžóø˜þ‰‹‚ æa5f¤ÃÁ• îâu>‚Mb'U²ÎÈ*¦Õ‹n_¦#vñ«¤8Óù„éÞž«{¨î@9•êh].shÙ5Șdòõcx>2©d§ys¡‚Ðd8ã&ƘƤG&$5î)íÁÐQ¡¢£R ›Ü”(U~@f†àcÀ›U­§Bjë£|*1¶l*Ñ;&eðÖu5$†£áR*Å#½ømlp½Ù=‡ƒµœzÌô -¦¿æsD#bù¨7SCêSÝÉz{¶ÄRslš%¥hƒÝ 6m‡fg Pî%…ôè{ƒ¼÷Ù÷,Kr¤³Ý{DR*ÀÄ©–Äá„Jœä—«œ'ìáá3ª {Tc1¼¢Ý³j\ SL‰w€S{‰! Jµ%!U„óMñÞðwˆ4ârý;r%óí2Vp½ãŒzÝRr‚ ð®…lÿ ʬO/ÍÕSTèi©¼EH/e°˜aoë#/ÂòLÖ/‘¶Ôˆ#e'™Ê¢/CÛ èS)—]_vJUr€ªHÐMy‡%jT1;3ÆQ—‹eyèQTù=òD@ +LaQKQ´[²qÌ0¸@lnºzq.’&ÆÞr®w"^^U©S&ÕžcøncFþb"‹(¾"FÁêÞ%{u¹03™æ(ëûŸã³ä ÆeoÇPˆÇø©šË¼î ”cLxE;msy'½)ˆÞQ‚€Ë–7cÓ »Ç2œéNµBÁަNO¹.hcQJWDß (ª€d¼æËJlÆmw©&ª. Fà ًúv»!’SÅŸèŠ#à-¡{ÆxÝËËk,šÖ‹ÆSÀXyT3øªª—ÀûˆîÚÔȉ\Ù1Ò2þí»W2Óš•ºÖ1Ó÷S‹@GªÑz¦‹’Î>Ø”´;xkB33×(‹;58”ÛÏéŽÝ² ñ3 ÜÖšRk£»§÷pvf,Ý­o{0õÙšÕ÷Θû¹¼>ºMy·—Ò¡+Ä3«ý 1Ûº6@í×»7_®Æ¼‹È”Ç*á£ÿ´^…ƒPìW¦ázƶ]·ÜéDè™Ã”We)T™S…÷†ÏCôa4¸0¬9 gšXìa%sæ¯ßñ¢ßDýM&ᮾìø=™Ó–šx°ð&0 ¸";F U;Œ%žµÌ°ø¯ Ͻƒa€1cV€P!ÅçzBé0ƒÁï|ò»÷ùzkžà½y7ù³€7ˆág QŸ †\ãm/K³]åΞ߯#^¬ßt›[j_N_þ \F° endstream endobj 4546 0 obj 6752 endobj 4550 0 obj [228 /XYZ 38.2500000 577.250000 0] endobj 4551 0 obj [228 /XYZ 38.2500000 577.250000 0] endobj 4552 0 obj << /Type /Annot /Subtype /Link /Rect [324.750000 661.250000 399.750000 668 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_readonly_variables >> endobj 4553 0 obj << /Type /Annot /Subtype /Link /Rect [493.500000 410 544.500000 416.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_features >> endobj 4549 0 obj << /Type /Page /Parent 2 0 R /Contents 4554 0 R /Resources 4556 0 R /Annots 4557 0 R /MediaBox [0 0 595 842] >> endobj 4556 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 4557 0 obj [ 4552 0 R 4553 0 R ] endobj 4554 0 obj << /Length 4555 0 R /Filter /FlateDecode >> stream xœí]K¯Ü¶Þß_1뙈½€¢@lǺ(`Ø@EEÒ´’ nýûIsïPóQâ7‡ÔcX£½î¥EQ‡çýüöŸÿ~øçß¾ÿüïÃýÏ÷Ÿ_Šc]Ýç?ß¼ý…nŽýßuS~øõåëáë˧—O§ÿýúÒ=ðùýŸOûßAþtúïχ¿þíôËûtþ¿¾Ôª>ýüåò³­ÕéoÅõçù÷ÿzùËï¿w^׿öÿ£µ2Ms>ÆÄ«¿¾ Ÿ©.þûÃo/ßv{‹µº®«ƒ²ÆTkõá?ÿxùéô‚aûâØZ¥êÊÖÅ#/ªõåM¦9(Ýž`SŽÞsù#³»Š°yct¼Í/'—Š2•òn.y³­V=xÊ1 = ×íå77Eñj/'‡Êp·xwÁË5ª*"^î›í#lnTD̹œ<Öåzv—¼\[Ô=€”¢×í#l^ꈘs9¹8T†ËÅ»K^nyemQ(·ŒÈ9M­MDÌ9Ÿ<åâÝ%/·9«lÕ1@ôº½üæ¶(âmÞ\*ÃåâÝ/×eÕȘð¿nasÕÄSÄ»“‹C¥¿\Ïî’—{’í)÷Íö6¯Šˆ›_N‹r=»K^nU¬Í1à_FdËuOæv'‡Êp¹£Ý?…ì‚Òý8b¾z|÷ååÛ§ó´U¾üt:ÜåÝ/' ”‡oÎæù Ú_~<ü¾(Ô»?¾üüÒ+]GìVŠp?ó=\ÑhEY´b¾#ΆOÐÀOÐ^V¾ÿrºØØwÒœþAž _ ß³=ø"àžHóÜʇéÊOÊ~y Ž­ïÑŠêÀÞ›¶¸|Ýœg:òiælÒA»<ݨەò²bŽ¥­šºœu$S •¯îìVˆÏÖãH3J¾ɸ…ßEÁ>ã9,ƒ:JqÙ6.©xø”5Å»"r]7ηYNì¼¶¢»Í§Ý­(5ì21â)¾²4Q0L9¦¼9ýÚ8 ?!€j>À÷Tu¸D0jþEìCÒ©áÔmêžÛÕUy»[ÏUƒn}1þ²ê0Š>,Y¼Â`qdm óg|$.Ìd$¬‘îņžÒâÛm1M¨ÜÇ÷Ða¸2¸g ´þ8r¡bE hŒ“˜ì ªx>YÂ{÷®80:øc0ü Ã|dA⛄ ð 1>Ò/&EV:&ß×ê´fıï Û£ÂW4öbB_ö~™ >¿§×W"J»RWtã[@åèF)9C0¿± ‚U8,\9#kXFÝ`´J|êïf³86ƒ=„P´ß'à4½›½-Ã3ó.áyjsËî±*èÂ÷¸ý1CzŸ.:*ˆÝþž >>A w3Ä 0ó_E˜¨mõ4þŠ™Q“ç1'&ñ¬‚{YL0'Ë$sŽÌ9æã‹m§)õÉ©Îï62ª¸*„waS«Öî7<ÃŽˆ ªjèR¡íMÛCkdäÝ€'ñ8âF®Ÿ_áÐdŒ+œCâÉ.¹@Æç„?Alø­6¢Ub(—!˜äŒy¿~„FØe¢z çsï.YØ—È_vâÌÏgbBÉ2¼ÞLài*NW­ª¬+ù7­^Gd‰µ.H1ÔÞ˜RűªÕmÊÆôUSÞ‚Oò¾Õ<¸«¸·#QÔÁ=(mŒâ0„ñ¡?cõY"æW¾ÔчÓÇÍ/X^ž .¿¾´·¿øåås´’ Dzí˜ôŒ¤¸–ƒ˜žLTl߈êDø=5¿G–ÉßCå¹Ö3e¸TïDùYæ\RÕŸA´^#rúˆÕÈ:0aúâ'˜°¿Òv“ˆÒÞ5sÙ<&.á¨(Æzž‘…(ŽªáH(†¬ {‰xf›<ºÄ™UDq> u?8N‰s©0¾áüQƒùzœˆÊšiìË|=óu?D!zN€)¹¢L~oY†Y²HK–bH–ml«ô4þgÙ–e›ÿÔ9³7K ¯”¾¹Ì½;îݨi¼ÌÜ;sïZ&ÛÌ1ÏR¢ð5sLu§Y~\äG]\ßšjdF]áPO¢Žj‹6,a¢ÌTv3%¬oªV § š' ²oÞ¦‡¥' ¾4nv5ƒ'%˜,±E#Î6Jr¦†‚,Ÿ!#ÑTG¸“1s@¸gÆ|U0µ|–=1U’âËLf4Ñ ‹˜–ªªÃCs:# 4œpªYS‹ÕV¨’©F7>±"ÇTº„—bG¨ê|²[‰º»*ïÅMƽ•ȸ£{j-U­\E¯…àí_u×›}Ä1î•]]¸ãˆ›—ö$m‡#¼®|„@„ßÓ#Ò½gÞ߃µQü¥SD·èí.”QÖåb‹× ÊÌ=œrÆ$p@Ö×ט'M9 #òŠJ»ÇÃ7øÊÊ}%A²˜i\ã$c"ƒ,¨—1÷ð² ãÌÌIŒŒ´2÷±e•N…€ú̘6ßɬ•MuŠ%‰M`ÊÐ]ÊQL•ÉÆÿÍ8Ü<4èRšGɈïXU#‘¹aA[”µ„OJCœ_f™-§â˜Ê¯š¦Óуü3Qס Gh†¸Ï•=yÆðÝ< ‘ï¶|¯SÏHFœó‡³qÆîd)fÝÁ†$-О£¾³vÞ™G:Œ°!¬…Ä$Ôþq/€†IKõîX¾Ãšpœ†ÈF£N0eý]XÄ[ nx@÷›YÌCø"µU÷°ýôÐ;ž"s‹Ñ¶=Zˆl3°òI7âÑ¡£Íåö/—_Ïœ}Óuýö7¿¼|öÈ¥8írG¢%Ë_m¯*[¢» `q•q5¾Ù¬Œ{”q#™Â¸ÚiÊ’lƒÝ'îš½¼&¿·ñÚOÓûÓ£ï3¹çØSN$d¦²’AŸ\Œæ¸‘Nùu]Í–sf`‘­¥‡~dÏ´µYQ†a_9e¥í´UëÜ•'©p8ç8oçÓÔOâÜœƒó16OP…Ö.@ÖœF‹ã# §]il ¢€*]ûggÊ•¢o®{”$|$fj•lÄW´K8á,UT‚0=ö_§ßåÚ¨«.2R4ñ·2êrdãe™Ô ˆ˜*ã̦L}†Ûxz S5ª¶r3ò¼J轃X×'H‰)‘¹GDbܶ²…Néhªé¹×ÙÞaï.ÜѨiª|sî‘èLåéj†»;âiø ñ¥½NçÉø’_,<›ÅS€pÏhœ7 !šÇ^çàîr¸¿6žÆ!Ú “š‹ßSâÆñ ãïÁ»-Þkž¡&ÜK^Ïnp¥Ä´™ ½cͼö%ß͈ÊJOwRQ|Á+^.æ š/¯w†/ËËJ‡ƒ+‹cz Ç¢bŸß=i SÝ^o˜‡wýQ™›i‹¦ޱÉ>åyn¦ï™5w»Îs3“ÎÍ´ªh¦1)O1ÈS RòÛló&›¯¶S;ùÞJ:¯“UºžÆåÌU3WõŸß£ 1(SùKò4éɲ7—g¶t|ÝVÓx™ùzæë~+QLÓ3ë s;ÑYO °öðÌÓdý= ·Ã>¢Mú³¬––Õ+¸í,ß;ù^]3Rõ´°Z_?4Ïd+–¯ Ê3Ù¤ ±×2Ê#.çÐMãÐñòf{”ÄlœÑ¿…áúÆé%®·‹µ¶t¥Ïƒ˜B²ngcFžw(Õ`$Ï;\Sω¥žM’rhêâ3~7Œ7_`Kˆ½ m‹Ô+mv|§¯_F¹uÜiÚÅG¤÷{*¥|TEˆëÖd]ÐcŸÎïÅÐŒê(ÿ,bhy§ÄòÃq™Ž›ê'½‹F‰1{«èÖ•uylìMxkíõ0˺ÊÊ=Oö:…ÒT×ní ©~¶Øc…vþ0…©U€»Ì£‰BÝ‘½µ¦uî–U7¼Ü’‘AIr¦ =nÓ¶ãÎËïž\N† lÙaµP¨ú`jš¬Á%“NÈ-ð:t²‚4óš\Wúx‚f®+•–(Ï¢ jÑS4Î Iî Ü/é"jIkûÞíoDȶÅÁŠU;I±‘ÌËŽ®S®6·XBØ«±p'r¶am†’c2ÜŒÙø1™¦u™²vi¦ÖÃgÊG1Ö¸nòd3 ˜D*˜õ0â2rŸ©§ë¬…­\=ͯəLfߺưØl“T‚…M!ëŒñfòœ>jšƒqäÛ^í©-4ß^Þæcº*,fÈeoä^¼‘ɺˆä‘¬v¬Kä £\[(›Êܘo7FНl@‰°õ×;[$f‹øºu¥fžZòÂ@Ù&óÙ—ý^ %|ÅOe‡•½Õ‚ž;¡‹ïGwoEl„ÀŒ{lL¾Ç‡N*1Ï~üž®(Œ—‰ð ¨áÊb7xÛþx<Í¥ÀØ‹ožÍƒ×ø|Ûøø™÷á8Z³aìM5j•:¤æLY‰‡Ó,,sÊ"'ƒoC椚¨ÎÐÌsµ–ÆëØ•÷NŠ%–Üðî±lbtÏÀ÷”˜Ã‡Ã߃wÃ+_0áݰþÄÐ ÜM–6K,›to˜A3e»Wšåcø=©xyŠÁõ3ð¥nvŠ/Ë늗H—×S8û&Ε¹ºT˜ÊhÑYëɲ!¶”|Mfd/, £&FÅJ\¬µuayë¿?ADê×ý¤–ׯ¦ݲÍ00 GË·ŠŒ:@½tpƒ!k*‰ •ªf…M˜veOÓ=e€ñ„·œ)ÈÙe°[šôXÇNB¬ 3æåÚÇJ?6Uw(eÚÂg°[ÃãôÄÁˆ!ø¶=îP¨¬¤r c0¸ƒOà1äÞ¥£ôº¨¦1 ãË&¹ƒ¬ x *бžgÖÌo³‹›rqk¢;u‹ß[yd:ý9|=±O/wý4õfX$Íݱ¢Ê u¶zHäêÓ!ݹë;Šz'+õQ«ËÂHVVã󡦷ÝÞ܃‚:öô3•|ïlû/™½¹„Ó£­Kl÷«úO}`Ïppe6pî|†Â»Ágz›K}zýж,Âÿ~:ñ-Û»g´•á( áM`èI»ÈîÁCÂcI/2ïçð=½?áÞ3ƒ1f5xÊ¥Ïw}@i0ƒÁϼëO_ÕÊ™ WðÙz?É=foÃOÁJP¼â1äoûˆ±4[æØóûyÄ‹WÌ›j¿I¡öéðéåÿòÔàÚ endstream endobj 4555 0 obj 5712 endobj 4559 0 obj [229 /XYZ 37.5000000 560 0] endobj 4560 0 obj [229 /XYZ 37.5000000 245.750000 0] endobj 4561 0 obj [229 /XYZ 38.2500000 611.750000 0] endobj 4562 0 obj [229 /XYZ 38.2500000 611.750000 0] endobj 4563 0 obj [229 /XYZ 37.5000000 560 0] endobj 4564 0 obj [229 /XYZ 37.5000000 245.750000 0] endobj 4565 0 obj << /Type /Annot /Subtype /Link /Rect [55.5000000 71.7500000 117.750000 78.5000000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_typesafe_enums_classes >> endobj 4558 0 obj << /Type /Page /Parent 2 0 R /Contents 4566 0 R /Resources 4568 0 R /Annots 4569 0 R /MediaBox [0 0 595 842] >> endobj 4568 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 4569 0 obj [ 4565 0 R ] endobj 4566 0 obj << /Length 4567 0 R /Filter /FlateDecode >> stream xœí]K¯Ý¶Þß_qÖr"’zEûÚ.ÐEú(º(’¦Eu»èßïyHçÞKé£Äï )J‡1;WI ‡óâÌ7ßÿñËßÿüïáûç/ÿ>üÐÿþüå©86UqýçpþõÝëèöØÿùдÕá‡_Ÿ¾¾=}~ú|úï·§ë _žÿ|úÓÿúð§Ó¿?þú·ÓìÿÒù/üúÔ¨æôû/—ß»FþTÜ~?ÿü_OùÝá·óˆÃtýbÞþÿwZkSuçeÌLýíiøLuùõß~{úþJ¿YʲlT{P¥)ª+õá?ÿxúé4Á0|qìJ¥šºlŠ{&jôy¦º:M¢»ÓHe1šèòKhøƒ7 7øeåâTQ¦VîÑ%7·­«+º*…n£‡ wúŸ`ƒ_V.M”akáà‚;[¦¸’§©åéó2zâWªÇ6וK¥ßY<¸äΚA¨UMú˜€"³:Úpƒ_V.M”agáà’;[ª'O‚@/ün~Y¹8U†½Å£KnnÓšpªöeôäo›&Üà—•RµxpÉítòؾ /?x]t%òeåÁŽ-]pskÝ´£^F±·¦ gG]WȎƒKî¬é©Öpl_ `ðª­òÍyåâTö.¹¹' …Ó¶/£‡ Sépƒ_VHÛŽÿì3^Éõ' ¬öÍñâû¯OßReqÒõáëO§µ]æ¼þöõD’êðÝ9Jdôáë‡ß…*ÿpøúóSw¬u5,qîIaÐý=15í|ÒÁyàÇ÷ÀµáyT ßùèÿ=Šây4±üŽ(E;ií è;bO+øÒ@AîÅóh<~®MãóC<1×ûøõ$|‚ËJe¹‘åÆ5Êm†¡hŸ|¥þ¸,¹0­Ë'‚C>sxøg)áªK<Ü9‡Ä'¸—ÑxtƒOòÉÊ'Ë}² äøÎcàªeíÇ 0_Ç´qšÛ¬¤fES–ÅeÊVWÔ×-UêX•uÛT#qÐÛ®¸ÐçåÉ•lå±4׌›'Þ)?ÂwžÑ“^ìL­ÎÓ›|­}jÌð}£“65Èu±ÕÑèVé…ï`¢Th7ðIk}à¦è‡'v, ^ RØ­kûxak•òXç4@@ÉaŠÖú6j_ÎÀóh,¼ˆÜ[m^OvÀÏPUèÆÞpæXêÕàÔ<„ÀĬ7^‰Ò÷¶XdX*<š)ü¿Ëq”<”“šàyÇÆäÂ: ®“˜‘IºÙªuüý@VašŒ&Ææ f|ŽÂâwð<Œ!Gؽi ¨¤Œ¿Ñð#%„s¾že1¼팶Õ(d£ÞZ”’DØja¹­·ÆG¬à}^.úÆüÉKSàA-ûQ (ÿÀ~s(;ßÿ+±¤‡ùT‹¶kßÂ/9¦¿àtRÇ0‘Öep”l²NÃk{o;ÕÌ®goI¬‘S ü(Ê$&3üϤßÃÁXɘe©ô©‡Y!EäÖÓº£]]§Þ2È”‘1°õ(\×FUµzkCß¶gôŽÃ0QИÊñ–ó9ž¿SÃ'ø¸¶^åLiÿZàÚŸÖx}ýÀ”²/C;Z§m·øÈa®`߈p/{¥©Šcݨ·4¼Ò]UÇ¢3oÝX¼‚+Ý•½E˜£ž!'à¸ÆaBøžÇÈEóI˜T$‡;ƒCU8h!š @ÝÕ¡_çhù_¥Ü‹÷ã!/pZmË¢}ùˆT„ RŒ‚Êð!â§Â)áë'¾¬1Æìv¯|Ͱ V)ëî,R 8݉ ö)_C&¡Uµ­¢"Ýb¹‰o¾|Rh!‚9gãw ¹Êº­X~IFÙµ£¬”ÌóD‚þˆ|#-ÕŸì@#ƒ²èñN¹À*Ëq!"šÙàÈ¿%2왫_»-‘tÍ1eE¢ðQ_HЛüèη§›ŠÆEÚ*'K¤—±íkL™åX¥Ë3”¸ÞŽT‹$#!‰ŸZ’É•X=lò0)3ët“©ªÎRlÙ².Ò±¬CZ4ÊX;Ï„ˆ›Acù#›,,›ÙèQ°Åh‰ ªÅ·TEÖgøyÌ®[1‰ÙeŒH¶+%ç²¶ÕM÷L»NyCæë§TÅñŠDôŠ5zÒ ˜ê¨GðEŸüßé•éÔ;zÇô¥¯z\úZܬ>è|ÒVçÌVÀkëázš£üÔ;WQÒ“îÛÄ—EãUã/Ub¸b3‘}9‹…Ó$›¶Ãø@9²¨‰®T&Ѝk²;ëÐÑØ¸J˜n¸<2#‰«ïqe“=±Üt™ñT" Þ[ÈaÜå-µÂ]¿ëÒàV!3’ÚÖÖŽ"!Þœêy•(Dt&…Ï|E$;3R}Wøô±ÒiÖ䯼kM)ð;CHÐØ†6~’€þ\M‰T/‹("TöBsV„í<¦•¥be6ùZ¢G«G0—éÞ$Û9Üç¾Ó#ó5pßHñÇÕrà”["µŸéˆ®bTéªB”sèÆŠ`Ž2ÓuõœáÀZ—1ešmpyŽïbNRúQ­€'VîíÈEÒ£T’ê4/ *Jx²=”eÍ ‡ÏÃxP„m‚Ÿx€S®Wˆ›Ð&ãöõwcw‚æ×*{ LÉ^ÀÅç>¹û–òb2.}´˜(jÕ!=ìzFÏÞ¸èGYËaca²™±²ÚY¸Œw}]«¶^$INô™;“t‹WBFguS[*–j,½<|J¥¹„E"="jM9oSc¦Éu]ßèeF#⤂ 2v± ”2²é ?m.Û žÐæ²eU ÜtÒ(ø•B~$åST²‘ÌEÇFàô¨/Y͵‰en†$ÓC\mÓîlcê‡=<'*2 ›\×K¢š[$Ÿƒ*ÉeJµCÞՅ쪨”¥ðB÷Xotè†'c]¨p”$ —´»á!g<@ŒëÅåwÖÝ90~ t VÆN»Xû¦7B̬ZY !ï5µõ”O$šBYw¸Ê€‰¿ïÄq‚¸‹Üê€5ëƒÜRÕ#.±þ} “P.YZÝFÎÅgB´58Ï¡XfÍÌÚXºÐ!=ð·á°¯mvÅ*L£ÌãÕC,>¦'SL#Q.žMˆ”´J.5u~O.5]Ïz£jÛKÝ+|G‚;¿~ZÀÆI3Ùº’€hÓµLååDcÞN9eöÍQ{Š5>ù¿£1Ùñ<ïà;¿–½Aéb_7 ÑÑüNßú3‹*ZYZÎsÃQ¯?Ü à ð÷Dƒd3M ¦¬$IŽ`4Üê–ØúÖu¶Ò¶dë5DòD#% Ñ.¤nr‰ ùqTkÍž©-u¶³|LT·„ý‘»Ð}”âÅùÆÛ¥à†˜Vñâï;ZÒÏ5÷z§|†OpËsÅm0|7^† ‡kS°?‚&®Mkø¤‚Oà ` ò¿ƒÊ1E1ï0;GÀ«;¸ ަñ<Än¯ÿ¥Þ9<Ú&iíUP¾™X~qÙªY Há(Ú …l¬_6!bu#z57rÞD#gŠ(Œ{6OÊñÓ–Œ "aóžaxÑ,bIlÉš©Õ¶jzÙ„ûøä"2¹(LfÆò¤êÕ²Tî*/ˆT Ž[2Äôá+S¾%„—§npwhçÐ–ÖØÊÆñ;Dw=G[zìã8öºñªq${ù3c:™¨Uœ“^™yNÂü²Iéà8›ŒÜÀgó?¦¨(Ç:ÞIYÞFŠÍâypÔioò¶RpÕD|­h"í­€úáÅá÷ÓÆÒ[,Z·@z7:Kï,½·"½W¿×Ê?¢Ä_·³–¸j‰NÍórÖYK$¡%Ö¿ùÏZ"ž–H`·³–¸h‰Z-àå¬%²–HBKì-û'kqÿc›’µÑUé.k£¬Rálج?¶ª?{š%þUâ—í0k, æHÈÐE6md1 >ΆP,XDÇJÞÀLîP®X½caf˜Bv–ÕµµóÛëšëàk]«ÌØ"«ÆŒ­`GfÖë¯-ø¡+3}è‚ÎÙXsR!™"p‰ôW™6ò ².TÇIÉË 4¢"­^T”ÓÊ×K+Ö‘äQŠ3<º™ÈM9Êÿ%PLpÏœ5‘.º¾õ+M(ÔÍÈ^GQ+uœ4ª³‡­äeª4Ókæ#$0壡˜ïK´S…±¹Ó\˜6a# C´Oç€Â«Uã+²¹@qHôÞAÑë»b[ñe›-2ÍîÖ:d o­wu=m­‡œ³±½¹Ç»Ûf‹+F¸:ìeâFÃ*æîHÙ2·IL¼mïÐtTHsK^RŠv.c¢Š¢¢×Œ"®K¿úi†¥™]Lÿ”ýixƒG"ážÙkñ°×G èéÀ8¾‘bo½"Ãfô¬ÆJ™y©–å%±îy¨Ѭ;‰ìbæ ¬0Æl˜€ñšqÛªj, h*ÈâZŒïœ6.SÚþÞ—I4.Óh›7SVîL@xœ›ÄøÞUxº‚ ]‰6òÛY:QäölA(µ%=ª‡¡*AÊ%®_È #˜'튴¤Ä=sU«Ÿ|¬€w¬DÝMgöÈÞ¹Îæ¯G÷Õ«'©ËÞGÏö±‰#›s?²H+{Cº‹Ê—ÕЭ(w·Y¬D»~ÞÜqØÅ‰Û¤uÒ‡»âó¸³ã¸à4¢ÅÝÕC_˜m"aæþ}®wRFgÌýûâöïëÚÜÛãN¹‘qrsÿ>·7Ï—­ÏóæóœÏóFÎóêqaÀÄbJ•Qñ³tØŠtX?¢&+R–vC|ßS¦™vž“²LË2- ™¶·pîâ¤õê}Crß©ÈÚ¨j²6ÊÚè!µQ¬¾SÛ”Q¥Ps˘‹Ô ©VF½ýÐ`Í ·(ˆÝ, U³³’*¦G­'=Ôÿy ŸZŒµ@Ó™j (.¼Á‡T½_¶€hý~²:_—–Vsðž(PˆpîHàà2­0@¶‡ÀZz|ÛšðAâ# ZG ¬èÒ«Aš%dXǦ+Œ-7EtÄýøÜ–°ÕüEøÊÞí;N^XÆT…Ñ»àÌÇɼÜÜÔº²YL,¬Ó¢6º½Üè·SN¹1sÆÑ”rÿäÿŽÆ•ìx¸ê>Æ:õÎpJÇͼßChôN¿TØyªÒS~©cmüžðÉõüªò¨•å[Dª©µØ•êÈ.‘»¥fs{ëæX¶†eÁA—{-TøGíÄŒA”9Q$Ž…ÙƒG´ ÐVbáüHgPrUan£wp×ò˜fG8`Í¥©,—\Lm¤hœ‰º6”På‚ÓМ‰ì†í@"‚üOµ&Õ6~ÓôÑñè“î0< ÏEAë…í"¾4æ YOæê™AêÞÍ­:×·¼UŠ”TêË7Z8#c-Ë0Z³8‰F, 5ùm7‘r„R‹ÞüR(Ÿ£ý )†>í{*› òîô¸4ߥ`êÉ»BFŽ$b‰ä‘s€myRc"S5¨«-ÊÆé(.Õ+Ò»9v K´t€½ÁJÇÂP’Õö óŠZÝT8 Sïƒ}ö¬;¼s¦­ó²‘]Ñ5‹M.%ˆx+6dÀ³m-¥(«à«A¤!¼°ÌE]d]¹ÀI÷¤¥ÇrÊW+& bø£§¾þÜ6Ë6Nzq¨°H”±¼tÙâ˜È×cAÝÃÆö…MâîO¶Ç•£“ra`ö¹\_7!B쫺Ço‘MÜÕ–e}6 “—¾ä ÈÙç+µ·¬]~è%Jo® í6#äzËXá\8Çö0¡NÑÆ¢”ÏQ;ÄÑÜ#ÄE´/tø¢"é¢I³²vvŠUmñ@õkSÌw¾f€_­Œ0".éÅ1 }I€?ɶÚÁB C$m%0­µ¡gi;(WnRcn:1Å…'ºãùõs[Ïâõ~yúâ8IaŽ ŸÁðèEeiÏ) Uè³u¢ÍЄaêpËY”åXøË#…ÅÓ¼Ágz7†eðöcâ‹4dú21P¦¢'L…iwP” ÞÞÀJC`nT“©IôÙ_\Ìà²ÃÑt³\QÐù}ªÍT2„¯3L»wx•&z ¾Ó‡'X»¬ü¿g=àÌ}ðc´¬/œGyôMs¸xL_Âwôÿ`PyE›@QnFÍÿˆ|GšíºhìhŒ ïé0zq÷6„h4ƪïLzªÛ¯DÉÒø Ol'®¸A5Í<ˆ>ÉøqÐ |¦u®‡AKo‰tÛ’m ¹ñ4Å\ØB´'¦N½ ‰êÿdš…½2µ±$ ÆK6øú£¤ç° æ‚~.¡0¤ø®:‹ºNÇ«&ì5/o EùxV@`w¹xcº¿;:V{Þímý뱵ăl ¦—.¥*eo˜–·O£l¥OVëx½€R²U¥­ƒ'ŸÙ"§˜²r±ô ×ðôëðíD='q?Ïý…Ôo' €ÓA/Ô9eá ‡ÌÂ>McJö\‰ÜLÐçêF룾6@)ízü¤Ï@ÑÇ>eâÕf*¨&? yÌÜ=ÐÔÚ>õ_:ÊÚè÷ ‡Òf|—X?°çã©á›™ƒ>ñ ßéY]y}zó¶,Ãÿ|Zñ°òPxUþ, áN`èop¤~Šv˜ªv˜Kz11q +€óôŽËÔ;˜˜ƒ1gµÖ1p0”}bß54R§Qaƒßy߯~Ô– ?ÁkëƒGSÂî ¦Ÿ‚Þ0~â 1”½±q×™m sìåýÂà ª—Ò½æ›Óz‡ÏOÿq€0% endstream endobj 4567 0 obj 6513 endobj 4571 0 obj [230 /XYZ 37.5000000 569 0] endobj 4572 0 obj [230 /XYZ 37.5000000 569 0] endobj 4573 0 obj [230 /XYZ 37.5000000 337.250000 0] endobj 4574 0 obj [230 /XYZ 37.5000000 119.750000 0] endobj 4575 0 obj [230 /XYZ 37.5000000 119.750000 0] endobj 4576 0 obj [230 /XYZ 37.5000000 337.250000 0] endobj 4577 0 obj << /Type /Annot /Subtype /Link /Rect [55.5000000 373.250000 125.250000 380 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_proper_enums_classes >> endobj 4578 0 obj << /Type /Annot /Subtype /Link /Rect [351.750000 359 378.750000 365.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_constants >> endobj 4579 0 obj << /Type /Annot /Subtype /Link /Rect [384 345.500000 515.250000 352.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_simpler_enum_classes >> endobj 4580 0 obj << /Type /Annot /Subtype /Link /Rect [186.750000 155.750000 213.750000 162.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_constants >> endobj 4581 0 obj << /Type /Annot /Subtype /Link /Rect [473.250000 83.7500000 523.500000 90.5000000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_anonymous_enums >> endobj 4582 0 obj << /Type /Annot /Subtype /Link /Rect [315.750000 604.250000 393 611 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://java.sun.com/developer/Books/shiftintojava/page1.html#replaceenums) >> >> endobj 4583 0 obj << /Type /Annot /Subtype /Link /Rect [43.5000000 596.750000 549.750000 611 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://www.javaworld.com/article/2076970/create-enumerated-constants-in-java.html) >> >> endobj 4584 0 obj << /Type /Annot /Subtype /Link /Rect [174 597.500000 277.500000 604.250000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://www.javaworld.com/article/2077499/java-tip-133--more-on-typesafe-enums.html) >> >> endobj 4585 0 obj << /Type /Annot /Subtype /Link /Rect [290.250000 597.500000 431.250000 604.250000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://www.javaworld.com/article/2077487/java-tip-122--beware-of-java-typesafe-enumerations.html) >> >> endobj 4570 0 obj << /Type /Page /Parent 2 0 R /Contents 4586 0 R /Resources 4588 0 R /Annots 4589 0 R /MediaBox [0 0 595 842] >> endobj 4588 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F1700 1700 0 R /F8 8 0 R >> /XObject << >> >> endobj 4589 0 obj [ 4577 0 R 4578 0 R 4579 0 R 4580 0 R 4581 0 R 4582 0 R 4583 0 R 4584 0 R 4585 0 R ] endobj 4586 0 obj << /Length 4587 0 R /Filter /FlateDecode >> stream xœí]Mä8r½×¯È³©I}†î®j>ht>,|0f½63 ·÷à¿ïüPfUQù(ñe0(er»=›jIT0¾ñâ×þþ»ÿúûî×/ßÿg÷Ûøç—ïOÕs×T§ÿìÿüòþÛ?ÿ¾ëúf÷ÛO?w?Ÿ¾=}ÛÿïÏ§Ó ß¿üëþßþogwÿ²ÿï_wú÷ýÿÒá/üñÔ™nÿçïÇ?‡Îìÿ­ºüyøý¿Ÿþív;<ñüºq1ÿÿ/Ö:çªÃ2f^ýóéü™æøÏßûÛÓ¯'Ľ¥®Û¶­v¦võÎ µÝýï>ýeÿ‚óã«ç¡6¦k뮺åE=¾©éwÆ{Ú4“÷ÿ‘yºIðð®±é~\¹4QŒkMðá’;ÛWõHžýå ôöø—îáÇ•‹Så¼·øé‚›Û¹>¡Ø¾==ù»ºO'¶§•'[üpÉm\J±}÷øïl:±=­<•Øž.¹¹C›Rl/OO@þ¾jŠíqå©Ä>\pg{cÎrÕ¥ þÛã<Üö ~\¹8Uƽ>ý[ÌSðRN¿_ÿgàÆÏ?ž~ýjêjØ™v÷ã/ûÅßyúãÇž(Íî—ƒ8˜Ý?ïþ±ªÜ×ÚýøëÓðÜÚæ¼ÄÓ•j@WL®XxOßc?Ã÷tðJ ¯ÔèJý‰xþR¸êê^±ðipm•‹_uW]½Â§á]ÀïûX~¤A`çànWMü•ÀÓðnÃýÁ»% ¿s"ÞS,s/ÅOƒ+<íÎ8©šavïéI8ÞˆÒš± ˜Ö:ýÁVóDƒ×{W µïÌù­ØŠ;HyüÝŽ¦€ågt¾yÌA½a¡ÆwÇÜ ¸vPÖ"ÙÂÖ® óK@cCÍÐVŒ‡wó%ö!áªkL(Û&¼ø¼6ƒ-*öñ±¤c›yÇÂ040¤¾Ç˜¢˜w˜ƒ«6¢®‚O³ø=ÄnçÿÒï~Ú&iÐUP“ËÙ)d¤êêd¤úúüÑ'EcÌsS·}×¼SÐ'àÎ&æ+êÊh"êçÚŽg}uß?÷Cu¤ˆï\»Ò÷œ¶ªyv¶7®|OVßS¿ê9½ëf-ìR8lЉDvÊ»;DÂJ6xfÒ_LÀÍçØéHSÓÎSÌE¥ÓWDàX‘£(ú0²)@41ܹÀ.0eÒWw¶Û8ñ‚÷²|€ß³ŽÏÞ¯-V¢X‰b%~iþ$W±,kàʲdç€5bøIª®Ãê õ<Ç«W¬ÞCé´5k«·a¬^~ÞY{ 6W¬Q±FÅ-üÒ{;B-L«¨¸m“ü¶z«çl±zÅê«·ðKµJ—ŠZä·S˜Cd³ˆÛ´®+±¡™— LyÜ$%z…iÿ4Ràà§m6<1…õ¸é _ÁOÃÚŽ°¢¬o‰ÆÀÎmTën’bxÓ[JBÞ)Á!*8º2Vœ¡5nþ 𨶬5íGw¡â‹Ô[ÃÅÚ]eÏ'îL‚®mŽTxÛ„ â ¢¦${dÄ(ŒÊ¿û%ðx‚ø¸î~Ô¸ý’‡`Zà%MWBli`±xK1#â§áDaX'@b($Ô{Nöܸó§.¡A†ÍÆS§+÷à+~›#ÚXCad6y¹˜ÂH V§­¡Ú·¦ª=¡t»9¡?¤#© ³ˆèôÀ&N"k ñê%6AK-c^ ¨$QÑ;û߈âp÷Ý'‚Ë|é Ðhá3/ñKS;¦zn;óñ#œòŸ¬ï± b‹ßà]Æ ð‡×¨šý×n†™Ú½¡ë|»§ÄœL¤‚, ^ © t«ØÕ´ISuÖÙ šKÍe®ì9¡3Lä0­»Ð\X™ŠÆ&²­ûcÒöšû‚×öYÂIaâ™åû”A!QXqN"Œ×HIP!g i*Ÿ@"âY‘Ö-®ûÁÓ¿Å+¾ ã0¡­lMí;Éískzß>c‘Á‚!¢±¶ÀNO„qbD”14ZÙ.B¹üJ¥Üí¨cYCi0I4F«‰s¼6&›3ÙˆTEÀöJX¤|^)˜W!½Ø6ó,Hˆ}ÝŽ,X‰˜Ô ¦>ãŠ=D3*Œ›&ï9›~LÈáÖ‹')µM›e±­ñ?¢dY¨USó­ˆÆ´¬-½ñèœÇ•TyÂf}bœoѼoÀZM\Q"Mîø‚Ó5U>&)®J™H|W sö$T8=Ë#BÌqZŠVžü#\•„O¶&ÈTA2þ2“ö[q¼Œ{ŠªÞƒõ ¥òÖÇfTS´·£4Ý&_/z޼⺔@º)"·˜®‚&RmÕ-Ou'Tjðûðª…Õ}Ú‚&qŒe#ädN*¤ßúKX/r|™ßÀDxõ„tÂ…Ã¥®—уn¼iÁ•m9¢M”¢“ ê6©Ò)Ü‚ij:×[OÕéºÅÛ.ÞvüªEzÚˆä4‹)Z|°7²!6³ë¢œÿ¨‘ÔÝØÆ$ÕŽ íÜal§çÒ+3šp Ç'oI1eX:,o´ÐšŒ½!—Ô»pˆÂd5dÎïd5sÊ)Ûª¡\Ÿì†Ë"©'JUS'ªr%9¨Ü£ze-¹R<ÅnxûEêÇçÈ•‰É žñÊ`(«ZoòHDk2î¤4bÙ­;-m”¥2Œ(›$*=âÉ@Ù¼âÆzY†Îî;KÈ)áÚ<Ti á´Dg #‡5ŒG…‘°„úy‚@<@Ôæ3øùå]Ý3Q!*~Î’ÃÙ„ë´ÄA }.í史ЕP˜À"§‡<tʨ¦žÝMÆ¡À†š9J‚O³Ýrý¨e¹Óö~ˆ¦1Kšx$„º§¢‰“Š»‚(˘ÿÄà¬Lis (ò‰î M„i· Z›™¸S);Ë„eTþ ÿ°N‰hÈŽ8ÖÙZûí=ó€[a€e´ ¢Þ°ì.RÙ1%c_¿ÎèÖ#ï½g.ó¹N¿,âJ³œ+»¶ó¸rìHˮɞI8 .Ÿí Z«~†¨ùLTK4wïEßž8ÛL9ûÀ þ¬«çÃý‡$`ýþ‡ßŸ¾4rU~X‚ ñJQ¢ï¿Û?,u˜„à-uZvMd°îšÓjÏçí¯PŠ dËIB¾/ðÅ_ü‡,/~À5ð>ãím ž6¨sÍvâ+p{F¶Ç«N‹Ýî–Ë'·'m6³¹ÕBmÄrò0 ‘mÜûrøÇ‡%xâ¥ÝE1FÍs5¸¥¡;@ÉN%’;-@IŽÀ³>×÷ƒi÷HàúýÀymm`Tc¡õÁWfsP×VÐA[¦5HVöhíN+•;/æ ÓAH?X¦¶­s[¦Ã–Z¦tçóÚ겆‡W—æ5þ £.í+ ŸGt0Öê0¡ Ý[Túm*]+(MQ÷:oˆêïƒ!2U׿¶DÇ5” )^¤)ƒ‘¯ãwpç=,8z9l¿§uÔ² ª~íºp 3Ay5ø¸7VkÕi‡ä6‡D$c›vbŒˆ^bz\rv`]z/fMfpVvˤ¦¬d±U屨£\z†ðf¦ˆh-‘&‰Þ)¦’•.Å8BD牖7 k]„µ¬ËFzjèó ª©FTéwUÔDÔncD.cQ™Ý“plÇˆŽ¥@­3Þ8Ƈ`8™érÂÒ¼œA"ú”e0•Ö3lr™s Ó&)£%Vë<“o³ÆÞ"ÁLÞ“Išd÷<¨¹M“ÃÓWRš ,"U0©mï³>„’ae ˜P‘iÉÎà_”w§¬0‘1•ê˜Ðà‘QB–Ë2åÛø3™WklcF™0n´§Ä#B¦l>n|›(ƒŠ»I?áÄ…@Ì*Új'’®–Œ-hœTF(C‰¡º²uÀÔ@t¦c… ‘¿/þ¶¢5¦é@¤µ‡5;ÛHó0m÷ùÛ¹°«ƒ+;?‚ás¦~a9R~[É#‚¸öÙDþDž´Ê>Òâ~Rg× Ÿ/ga¬RV3ºÆ3k2uYÙ\D>†PõòqrŸ©bXArË#¶ÛZÔÌÓ"PøóY D¶] R|i¥É‚I«G©7 H¹2šA61»\ÜÙ2¥ó§Y‰§Jø²Ã‰¨s”üÕÙeT‘¨ÙLŸírÆÌ+E¢w—Bî½ÓŽÂ$ +è—ÜTÛªõ˜’‚ã,£ú¬7ë$Zà´æ’;µ¾Úˆ¬VØË‘ôDz©B¦ÎMvŒAþšàåUhTÕ#âÌV2aSF¾átJB{ÚÙγ§[HÔPQ3T*ÍÔÉ ¤ïŒ‘µš›jF$)Õö‰àÕr6—èlŽšŒKô)ÄF1ˆ,ü å9@¼~‡ßs.ºrãM ®(d™m3±µÙ‹&E¤9p¶Èô‹2`ŽÒdnÞ Æô‡ó^Ϣʹ\@,$áDä@ÈÁÛÃTH@dž Ü7TlËNn~ëÚzzz…ÉØüU:T!$3d*×¼s‘¼O±H{«á¸‹VóRãtá{b ¢LX•9Ç‹èSŒ8ËŽ¨N!Nü) ¦Ý—Ï™%4oƒéý0D[ß,´”t˜n²Ñ4ÚšÅo©µ¦fÖie”'‹@¸ ¤žª[J Â’ßÁdÐX(1­–Û9wU!õTóGèªBoU´´ƒÝ'ø‚“Óc¯°=_ºI‰Ê“&fæ‘’ÑBvê„,ÐŒèñw¶6¦lqI(ÀéìÕLr1ˆ&ZõʲbZ§8Zˆ=k9m\aÖ&%úšs¾ÍÍ8嫼)yÖDyVá Y©¦QØ(*éÿü½NÔ¡Ö|b*{w±kØ®Åù®*Ó’†·¶÷S!oÍlJ•*õ•Ô/ãÆ™‘+àLúŒ ]ÃZk Fuíyìm bgM¦vŸsŠäÉ•²ü‰Î—Ô4Äâ¦vÜõ*ɬG™d£ha# HäM>#}Ûj?xâ®6»‹‰y°Xø~™Òñ@jˆÜ$¦ªM]Á6©BVm/­ð_Gø¸˜ÄЕñë®\±ðž ¾Ç~†ïéà•^©Ñ•úñ4ü¥pÕÄÏéø´ ~ià¸ê ~éH««Yè¯}Ã+¼SÞàKÌ}ø=øŠ…«vpm ¼ò²Cˆ]°Í ,'X† ¤^æ|ÏhR¢x K£­æK¬áàªkL(~i`ð=xmJ^›Á’%Ë™…+`hpÁ‚žÒ߃­#¦(æfçઠ¤h€«àÓ,~±Ûù¿´Á;‡Ÿ¶IZtÔärvj&ýИúüÑDa˜pV~›óà=õ«ž³Ñ´Ýy=Øa‚¦ÑaƒN„9Øi (ÿâ"i»H:|Ù·ó”×uÌT¾»­š[¾;»;È„]wpÎåÒÙ[ß°'«qOuhU»[øw“Žš*}[»úbWkîð*CmonÙ{œò½‚W€ý”@⯧!'îaÒ’Øï‚’ ã¯B9 \ÁOÃ&¤hà{°/}\¼s8qMg`Z¾‡9€`xÓûì„4ü=‡¢"¢a"'†ÖÇG˜Dµe­h?ºêBE­*•®i> ðµ.)œ¤BhìÕ‰$poe¢5¡I˘D€ôGÔR¬/Í•/Ãàíª@&M}ºÁ³£’ØK ©Â¡Ö–D&¤šO…BÔq&ö4‰0lÖYI|q®÷¼ìyW¹ ^%eÁàÐûò©tÀ£yñã±GÍ”Ñ)©¦Çó“¾¥Õbu7-&²j X ÷³àÞçükK®¯ÛÁ,Ö×T™ˆ×Ä$GEþ#ü7‰x]¸Š;û¤¼u¶õ­õy"©3ÕŒÀº²ƒ–w·(p$@3¶· ®~ÿCŽö–Ã{Ž© eBqHN‡™yË MJxà›Â‚¦æo1E®Ì(‹Ò´¸dõ*0õéSYýÛØ_­vžÒ>pÿ•ò÷ÒÁ´‘ɺÑJGJÂæ³´ì…Š]˜  0%ڌ՜f<³jœñìeþJ›5–u–±ˆQ~Àª9™Ó¼{-ðØtJŽÂ;‘-Ù/éÂéáÄT=øv#)aݤ4S§ÄôœÕTJú¬ñÓµ*³L„R˜/ê‡Ì ´ÝQÙ™ñhÀØáÃ/9ÎŽkðtð¦ä’‹=*Ä9¦ô÷ÊkÁãÜ\sd¾Æßc±Ãï w€k;#GNÓ¨Ÿ! ,º§Â_ WpÁ#<í‚—<½ÂÄm”wfÕð¼jü¥£.2õ³õ&Ï­)ƒ¹,Fv°|®Š™Ù.|Ì´\—R=Zøs½øîRIJ 0G<Ä9•6Ñâ­T»Vµƒ„â Ä(Q(e)›Z€^Ó´ž¹¤dW¤ê‰a׉ÏDù„î>vf´/c˜ƒÁìéDŠ#•Ц7iÎ(­L´VK,ût8^À÷œ ¼ÝxÓ‚++p7òs¯VÿG´#’²³!‚ÞŨi#D™#5¦K‘ÉAMƒ8“«‚t›]Z¦\ý´)ñÄæÈÀ(ºá€X!Óf‡bS108¸Pí¸LöiúFÖVÎçÎìð [€Ã,¸8ƒ’€ÕŦ’mˆ°ÔD:#°$&ATØÊ“eç®m+¦˜öäFk/ÀžÑz p""·–??²¾ÚïÄ¥wÒà)\èê/V¶žNæt;ñÙŒh>ð†Î÷Û¦© ‰u£ 8—¬·A!/I²BÊÕ ­–Bž+O[®q”ã(…)²|íŠXçË‚}tÃ,ÿÊj¬­ ¤Uû®- _ây K£—æK¬Ëáªñ¬U<7Õa ‡W ;Óõ¿akyÇbä^‚—·) ð=ØÀżÃì\µ p|šÅï!v;ÿ—6xçðÓ6I뀮‚š\ÎN…óm}u{eNM´ùÇAL«ÅhÏ;¦îf]|ìR8lЉ€;åÝ"pdàáñÚ˜04°Â=.ŽÝűӑ¦¶§<¼R$PZ™À1°|(E)ºÁµi…/=H¬-"(†â¦oæù¿Ès‘çuÈsöd€°`ŠÚÁVõ¼4íP´Ã*´Cþ4™¬vX³¶kàc Mf]ÑiE§mD§Ý[b—уkÖëÖƒµ-z°èÁ‡ÔƒøˆM؃ۤöVÕBí¥@Ni¨YïLûñC¯åkŽÐê±è‹n‰‚›¡ÆZL  Èˆj﨟U·í­[¸¹ PÀK@ÇlÈ# Êœ(–Rž*OĹÍ:¹ ¨o¯6‚„ZwÆ_¸` ƒ%J¡Œ®ž)C$@¦k)í°áAëÃ.ƒV[›Än¨CÉEОð î’ôRÒc§ óM!L¤†eZ±ÁdPFd1˜žØìØ(]¥˜Á7” !&h˜ëiJ ÏaOˆÈË¢ÌÚ˜Eô1  ÂtRmì²Jp¥À1?§]òÛVMµ5ã:oœÈ¿¶äêÌ6ÖãÊÇÓf÷:ŹLJF@Îçy˜:¢†L‰ÀØñðróÓS8 §§ÖCóþ‡ÃSKXª‰¶0;5ü%5ïiBP"øÛÓ fl'Æ8f(› RmºМg,™cQàll¥o@“J™Ù3­g‰Tˆ+0¸‚Q ëc`*gÜõ‡iUWs•r²+>±Òž(‹†MÁò®^µ°¶ÈÀhí† Ão¬Ø¨·¾ON…ÄÑÏ´ôŸè³“éß”°­eÞ\Ü{$@u˜&DªlXÖd¤gœØï‘)OÑ¿žeú–1}[ô¥®¾œŸvܕ㦠ãH0ã¬yÿKŽ™`Ç5x¼¢“"7t.•WwóÑy„ºh5©,dÔ ¦³‰Äº›LÖ/£Á RÖàßå— ¬püÅâ˜{=š‹vZÝðé á'Î:°·—y-,<ŠD€@ætàµ| ÌIš¾ßa!÷Àµm_×BIÔ6žÖx˜¢N?”½ï<> (S Ú3ä5ÏÕà>ŠNÊívö|éÍéx|Ä@ae ï1¯ð¸‚ÄÓD=~ GJ€LË‚Ê †Ž˜g$RC¼æDõ*ë1ë¡÷Mqbp/&s æ*‡ƒ©•ãn¡½-à8wLj©³µÌËî aGMDܧѠ?bÔ¿óØóWÆŠd~÷KTšWp¼µ¸9ÙTPÑ­ú²‘¯R?¢Fk_%䀙Ø=jùý?»Ÿ{uÔößæþÂsÐ_­.ÜKne.âÎÖçÕáDÓ‰}»+›yJÓØsðÝ•SÞN¯Œiû<º¨ïhj ´¿ ÷¸9Ękkû:~é4±‰‘cǡς8gØN?pdA\jŠÍÁ•Ï0øiðžQ.MÔ§¿«±gîðïd\ù+«&ž,Ü Ìc+0Î+]£¦*Î,ãµ½"1¬¾gTG×îÁ4ÀŒ9«÷Ä ÀP¾Ä¾ëœ¹<Äaƒïù<®~rÀƒ¯àµé·kÊî ¦_à¤×_ccðöv™í*÷<êû…‹ê]|3kÔ¾í¾=ý?À²¨ö endstream endobj 4587 0 obj 8153 endobj 4591 0 obj [231 /XYZ 38.2500000 771.500000 0] endobj 4592 0 obj [231 /XYZ 38.2500000 771.500000 0] endobj 4593 0 obj [231 /XYZ 38.2500000 394.250000 0] endobj 4594 0 obj [231 /XYZ 38.2500000 394.250000 0] endobj 4590 0 obj << /Type /Page /Parent 2 0 R /Contents 4595 0 R /Resources 4597 0 R /Annots 4598 0 R /MediaBox [0 0 595 842] >> endobj 4597 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F1409 1409 0 R /F1700 1700 0 R >> /XObject << >> >> endobj 4598 0 obj [ ] endobj 4595 0 obj << /Length 4596 0 R /Filter /FlateDecode >> stream xœí]Ɏ丽×WäÙÀd‹‹6À0Ы 4¦ Œ/0<†Û>ø÷­Ê”*«(=*ù*¢²ÒqÏ”J$ÅFcyñî·?þùð·ÿÞ}üñ߇ŸÆ¿?þøPÛº:ÿïðøç‡ç?°Ýqü÷CÛÕ‡Ÿ~yø~øþðõáëðÿßÎ/üøñ÷ÿýï`¿þùÇá~øóøK¿ðËCkÚáïžþî[3ü[õô÷ãÏÿþð‡_þõ8â4ݸ˜—ÿýƒµÞUæq+S˜>Óœþü÷§=¼;o@Ú,ÞwMeÆ;0½·‡ÿüåá¯ÃÓðÕ±÷Æ´o«×LÔÚÇ™ZSŒí‡‘œ›Mtú#4|†Á;ßæü´rñ]1®1ñÑ%‰Ûõýyƒú:ÇöO£çØþ¾wçqåÒ›2‘.HÙÞÖÕy{œÍpl/ÃgØý¾þÊ6øiåâ»2Ò62º$q[kÆ 2>Ã]†Ï0x÷¨´r ~Z¹ø®LÄÅ£K·ëšŒ ÷ÙðâƒL—‘sWžKáFF—#n]™vR‰Ã?òû>Ãà®ÉFÜqåâ»r&nltIâúv²e«6Ã]†Ï0xÝe“ùãÊÅwe"îlô¯)£à¥œ®sß#/~øöðîËÀpÍáÛ_‡•&<ÿõí—?üÇãn¸u~ûùðëªrÕoßþñл¾jûáô{§'Æ¢'•;?yúýþàãéÆkßtÃåùšQ?ŸžÔGg;ór%¾ÓWç‰?ÈgÍ †_nál;ªî©9ï‹›>òòÄt8ï‹?zwöO\žÔ§'nÚþËLoüŽéÐü^›3Ë4[øUÌFÌ͇ŸW@† 6cWü«xIðêl1´%æÁßc>\¿)xøÙÎâÕÃÓYµ©rf‰­>íÓ³jГ‘BõÑ6uÀû_Ò߉ÌÓÃyž¶pFOÂ* È(Û—F«à;gÂ7Gwbôçkƒ_jÎlÔÝL2ô¹ÕâdXôõ´ÌOHv;ÌŸøóæöGr.~9PÙF„(Xl`-"ãð2ú‹4ƒíJ¨qð“›a¶K‘•`›‹a¼³Dl^øéضKÙ?]“¤ };žõR!²P¶6± ÑO1\wåÚ÷:"ÄÌ1,œñæg¿DÖƒôR]F$fø‘[=¶÷±, Ì\ݦŸ9mlÖ^æ ”±;2{$¢L!âZ>Ót‘ƒÅLLP#rï#ŽB„`¢Ž"æšÌèt{¹6…'LɈìˆÅ'ÆD&H)k´(8R‡³Þ¯÷â¨É-YÁ,z!ŒÜ¾®÷ÝGìÉÏR,`|…¸ ­O<Ðúnà_Fÿìܘ{–ž|@OL‹žXøNW0ZKO|ú;¾3’r6±ÄïÀ`޽Ë[é3Ãȧ’m‚BΦõÅœÍ÷aëŸZLG,/á©}뜴 íÚþ%-8ø)O¾ó2ÎUÂ3BEóˆøf™Çß°CG²D½ÔL– =2®LdÙÀã`^ %Ãe2Âd}‚¢Ñþ” …’—:%zÈøød}ÄØÙNøˆ™0yDâ‚‚É FÙ 9´.T—‘( eBª. ‚F(æTF~U4ƒÊh`R]ß_ÿJ‘Mwyïì˽d Â‹ 6„ 4«=4]=4ù=^6«áU4âf…ïlÀ—¨È‚¹¬•fXzg—Žxÿ¾ÏvZEVÏOd„óVÁ}‹¬ wI_›·w26w™b®¨±.À{€I„›)";±ËïÖS˜Ú¦5–ø ²2sU!ç¹}{š®d7ë¶üwrö•]¯ByÃÕ!²^ -ïSžëo„ ˆ´}ì5fêad]§ÂI“3vc<¦Ä’˜Â˜íÝxY™7¯ö• …*c}áÐäûìZa®âbOìKæü¶¶ ¿mæW'ü“óã ^¶R‡ÁpÉÒb‚w÷0²<] F$jHÈeµêší ‰[£á­!ŽQòL ÛDÐö¢Í8¶E?Æ[|Z܃”Ê\,­u‹B¶¯#ͨPûÞ 5"ócPcóÄ­]yj±ò¦[0Tgbœ2õX-+•Ð â(—;ué^ã“+ß»ôNŒñÈŸÚ8!'÷ÒÅaÇtg^/¡½DP]¥JÆ,aÔ¬ð>PLfñóËúåe´˜ÆÄ %.æT<[ÄyËèQ]%›>Áœ‡Z$\ÂÂe»2Y6/>zy ïÕTÖÂØP' ×21…ÏØé%­”A%Næ…”¹KøfÜ‹JH@8'[¤ë£l²!|§{QÄs/ÞÈ¢à¾3wèòFƒ®ÌUƒ#§›wF³”ôtÔ?Á¡•0'lˆ%ˆw-ý…Óa0òvµ²eó[Ȩ ÌøÌê6à£v•Ó¥媟’šÆúî…Êï‹p«C.Ro™ùRÁã»Qd—é,Ý DÆõI¬ZñJ-ÿ,ðã‘Ïœ½½ƒIz@‚•Žnd›Æ1HW"~cœpì„ÊÓ2M ðnõ^HeY0Î%Ñ‹ChR{:î2&±0¡•S®;ë•+Œô'JØs;×% §(ÐÙ°^y`Ú[K|Æt‘ÈÔUpÈ 4 ´%ÃŒ]+‚íÙUœäU c&½A~ó¨0u„dS¦0¹¼y¥þfÙwCKÁ«ÖºiˆÚ&ÙÞä)Æ"²—8ÓT#Urûœz¸ ù‰Šl®dÛxgÎGKÁ8 üMî´&¶Ç{Ú\-má!†¿e1PÇÔXÝ–v+Æv‘ÂÀ8±˜–.˜{#çTI'É&ÆÎec2¾GN@XkMG…°<&¼Ô” /˜7| e„h# ”¾jL¨ræ5?ÿ`!rYcBL[ + £Õ~–´bdû[É–/R‡>!W·Àz™Ù¯Ê¢MK´ÞÊÜjP¦ŸcÐ1Ù*É",+J„éCµÉ8”%xP8ƒdOøÄÂõª H@«Œ’ýŒT@Òç>͓󰷯±/@ð1«gN9¾µD¡­šÏ߬bÎarg<¹vP¿/îfj¸d• sé`кܥ˜LŸÙìÖí3þ™û3Q?@¥W3•º›7lí‘- I‰†òykŽâŒJ±õ3¥ˆoj×g6ãïKp§–²Ú§\frë"iwé»sé{ìd’åiÎH\ªÂý|:‚Ak›P2'¡ù…l~h¨HÆC´ÕÅúÅù}†Ö˜iÚz²2$ÖR²½,´*.)[ŽiGN$y¦”—$E%‚ò÷ªPqUŠkP¦öÞûO»®ä¦Lg«„°±PÚæ½¨DÈe\$LS^hŒòaK4 eB‹Ìbe@¬WÛ{$©||j08#Ð7ó+—".q»Íla-G9»6t«v TW&‘«U aµÝYõG7¾tÅ“]•âeî°ÈÔRäÆUeÜB#÷ܯY\³˜øøõ¤ eíY³4ÁÄÜ çd¬öQð“9,¦Eò¼±å£iÂ×y¦ìo{óàzß­,~ cFN…RǦ7Øp„QU º›! <“¢…5!þžòR½Žx´óóYitSq…ƒ½+ÜÁöO¬DG…kRiü=ã Ke]e_žeÜð:íëÞÃÑ>ÂÇÔ²p48¦0C- ¹b<îBß³Úv|i´Z‘_ìS°òKdG í™ïÆU«éOpWYüŽì8ØUVöK™½6p4G‹HM ç×׃ŸD8J‘ˆ´ÂÔÂó`­ƒ÷÷'ÞþÔTˆpŸXä+8©žZd81ˆø+fí[e ]Ãwð“»V}OéZÝ?>-EÓˆJ(F«ËîAѲž™Òµºwõ›ÓêÒËËÈ óاô»1–¤î–ôuØâ=éøœ%i6?q65­!é^£h ù§dî4Ö÷K#<¯Ä¥;½eB‰‘òŒ_°áð<¥kÑú’ºþv´(œßn"V”¸õSUSâÖþéÖ‹=ÖZ-Óšj½ešH- Õz’hþD“‰Ð“ S‘µbÈ 7U«”äF£fNì Ù:²KÄÄ‘Àº(èžóm¾çODPÚ…kU²”Ek¿¶‡£Êgr¤¼æìf} ù(æA²u:õ&÷Ä ©Ä Q£¦hÜ ¬°¸ÄºQ¢µAf@7­^éÔ§c™‹1n]ʉÖGo€¯Ð÷ᕌBmÃ"ø Š¶XgÒú)!’¹ÎlOx¥Âa 4_fì©òÚ,ʾwÁ-ãêX-½Tð©Y÷Šƒ´SI5A–| 5&ð‰Ì‘¯*Þ\Í™¨[UMÜJÔ8¥\<²eËEDä¯h?sÊp“­î$è¤ÖzŒ¯cÝÁô‹0Þg°¶¦q/§4ÕñìÀy¶Q z2²Q}´¡×çÒ§èúwF‚,½Ó£wªqÛí<,u~Ò±¬=ºy/6[ïÚ¦\XžYÜ7#ù\±OÚê laOåöL1(ÓÐIÅ ÞdðÕñ§ã-Nè¯Ì˜œZîÒ­À‹´‘цLQ-Œ¹4lçÅ ;­ãK–»Ï©Jè ‚@BÎÜÓF þx%Ú~³¾…‘S“àQíÁ ›â§ÊzÇýJ©Â ÓÔ• 4Ò®zRýµ´ä™hJzDàˆV±`ò¿¦‘¥L‰$󡌒$@÷µ:E¨e¡ŸÉbìôèF$š5Q óVnBšF‚Ù»U_ˆÕ4€œÅ¦mè·)ÑzAwcÂã´¦@K6y¤¼Ô¡¼3©ŽŒ3-#Úó‡Ñ2j©eL ™­ú¨e%jå£aû'#3ºäúþ¯‘Åâ*¦ŠÓæ–í“3­yŠ—œý— ?q~­Z%g½¨íƒíVkª”ΞœØ˜Ÿ·Í¶qK(â[°f6=$ÖAÄ ®<2Í´yTÚVK´p£›`ßæ¾÷r!éZª¯+ƒÀÁÌsýR¦D‘þbßû@1ÝZ• u;g €e{²(ûÄûØeÉÒ½púÙhDÁÐv†ñ@ñÃd̾8bKNrÓïfï áEoóÅ2BX ãÕEìD±ðe:¥¬…¹L'xH°–Iˆï*( ÛLŒu–šÎ µ4âÝ~\·ü}HÅRÌÏŒݹð£ßœ¯‘!¦l_}â´kûÈ´å~ÉÞ:Q†‰@(\?¥ºûh ØYðˆˆE2Ë4¿Él‚íÓ„˜3O·u¥VüöJ·-LœAgÝ%Še%—O»TÃ;åÑ”Õ%L–“Ìø‰|G‘+9Õ9¿Ã@@¿ “3g QÕtá¯8i²}ÕÙΫ'Vg‰2Ù’SŠUE Q¹<´HQü䚪'€’d nêKÅ×Pær: ºàÓvŠ,©’[*tÖo5v]€ÞÐ*Ä/¦:èúÐ%cèO}R¼ ”a|S’#g¤£õ¡Ð•h÷²«"~Ê [/t}¦ˆl}ÍöyóbRS4‹BÙ Ÿ%ªë æ Q…me–ˆŸ`h©X"F—åᨲÚäõ²Qžu΢¡‡cÍIe'xîìivœGç¶®¬™ ™÷ É>¶ÆLCrÅ®„@Ôš8³ºü$‚·öDçëB8 4:¼5u¸)^å@­K4Ë&§!"üxLƒ‚‚ŸTPZxî#óàf˜—ñ;pjÊá Oƒ[Š¥CdpƒŒ¶ŠGûÃà»cù_+J”®{—G¬“Η ²~ä4a¾Ä+ xLSþ»ª}µ"Úú®y×vÞ6¯ØùÒ­@ç'ìÍ[ÂÔ•¯ƒÅÔÇ*hGL¹Œª©#[Ý5Á×#ü¦ ®Š endstream endobj 4596 0 obj 6173 endobj 4600 0 obj [232 /XYZ 38.2500000 378.500000 0] endobj 4601 0 obj [232 /XYZ 38.2500000 378.500000 0] endobj 4602 0 obj << /Type /Annot /Subtype /Link /Rect [444.750000 633.500000 539.250000 640.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_c_arrays >> endobj 4603 0 obj << /Type /Annot /Subtype /Link /Rect [43.5000000 626.750000 99 633.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_unbounded_c_arrays >> endobj 4599 0 obj << /Type /Page /Parent 2 0 R /Contents 4604 0 R /Resources 4606 0 R /Annots 4607 0 R /MediaBox [0 0 595 842] >> endobj 4606 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 4607 0 obj [ 4602 0 R 4603 0 R ] endobj 4604 0 obj << /Length 4605 0 R /Filter /FlateDecode >> stream xœí]Ko举÷¯Ð9Àôˆ/Q‚3žq€ f€9³Ù‹ÝEœ=äïG-Qm[ÒG‰¥"ÅnkŒµ½M‹¤ªŠõ®âû?ýGñ¯ß‹÷_ÿS|w?¾žÊ³5eÿ¯¸|½{ù¬Ïî÷ÂÖ¦øþëé©x:}9}i¿?ú¾>üµýí…,þÒþ÷sñÃßÛttùƒ_OVØöç/ÝÏÆŠö·òúóòù¿OûCñÛeÆa9·™×ÿÿNJ#­¼lcaé§Óðš¢ûúýûo§÷=ÂVѦ4ZB«ö[£eñßž~j¦/ÏÂVÚ–[j¿·+ik !›v¦ÒN꾘¦0¹©E¼É»³CE¨JøgçDn¥T [E€Ðuöà·eoònçÜ@P 'çĬ­Ò:ô«ˆ'«¶:"ÝT÷e†Ê€[<;#rE) D/¦0¹¨#NÞíœ*¹žÙ9‘+['?ÏüªU¥¢MÞí<OÆ“sbV]&‰†Ùëì1€¯u<5­ßy,ÌÂÉ91«QÚ¾˜>Â䕈I7—Ç’¶žÙ9‘kKGûRÖ@t>ü‘Ýw;g‡Ê€\<;'r›zÐ5ÍÔŽf€O••BŤœËÎÙ¡2 ÏΈ\ÙþsjM.~ø?Oare"RN·sv¨8äzfçD®.«xÚÔóì1À¯#ú¥úGÒ¦&“ ™ï¤ÿxNŸ<~üvzÿ(tÙfUñí§voÝšýo-HLñîâ4uñíÇâe©>ý©øöó©9WÒ [t#M7òù[ûRÛöƒ6£Ën3•PnÉòC·¤>kÕ»·¯›‘5)ЈÝH}®›²{»çgT?âù?[ÿtò|Vh8+|‹Òt#êltUÛWÏØðÙÔãh³Hâãê?Õ*;JŒÁVÁ”á/*û!¸­¨¨ÃG<ˆ[Ož ? 8›l ˆ×“‡ !ËÏ݈9+Y‹•/è9Ü“7²¥†Dáçʘ ôg.¾ºÌ竪 iŸw¸™y@#Ž‘ÍI*ü)ßqÔ17wPöÆ 7¥à†(›^A/µyÍsç "àÆ#|o ß[?¼·Ž@œ”požgð:.K•KL—¬§ ŸZ§dÌ| œ@¸7á¶ï™YÐ]­¾.9ÊVf­Ô 9©àôXS”J(=B– ÷'º¸G§hÀ½‰|Ï®[ž`ôP”qˆ ’ÝƒÉ “56 ýHyŸ©¹ˆ7KÑ–ñÂëÙE‹õP ~A¼LÅÆGó°#ž²G:•Å.ÖŽ¤‹ç¤ÿ)¶‰'æ…KÒ9x\µ×3t*ÍÎÆ&¢ªÔãwƒrZø yi )3Î —"œÌýÌÿÞ#:ã9ÒAI| Agňò\YñÚCÅê ‹¬Oyx„U¡hIvMáän×ñÓZtPœÙã9zã¶Dôq€¦øINBÀˆÇ-Ï›k5guzh Ï–¸pÜ‹’ø]:â‰{õ,P˜s٨׮0XàX­ÃКLã8à†­ØÀ'v?13 JCô˜’r$ßhƒÙmN™-€žè1½=ƒ£ùiÉ ¤ÝSÎk¬ŒR9C¢‡ý© ¦%Rá<ÏÜdoÿ¤M°Fç5®÷­ckhƒ©3SB5c©†)“õhc„¼‹ÈåV÷ò%hÚ.ø4'ó O©øÅ4â°ý<‚çIÖ"0VÞª…Ý Ä%ð!©x·Ñ\ â>Ay­-Å<—"à!²û&º•yiÈ4‚ØW¢‡ådQ†•+3 sAJÊ4ÁoǼJÅTÀi³y’ù4™drrY S×dF”SF<‚€àöˆÜ³"R1!Å»B8™R´˜±eŒµÍ ¡P„sDóV+);–‘¼!ÖSR±‹±™(ŠGªêäþ”º\ Q‚ÍEªJÐŽÛj}åé3ww²£Ø”¤6¬¾gOû¦Œ‹ÇyBˆÇx4!Š?‚‰j–U¾†4!Ôã!JÇL6»&b—žò žDzÔn•â$DÆ>Þƒ—L›EhSâû§€ñó y;êpTÝï ¿ˆ'VÖã#›ŸÎî9Z”^N˜‰$î KÒDÔ™õ¤Oa¬XùMÕk‰Ò-Åó¦í/QÐo·>{7Õ—.ÀõO?’$²ðlì•Ðð9$!¢¹P °¾µ”cQhÖe3šáY[sü,¿"ûk¨$¯E-RÒ;YcµÉ·hr±x£¬-dxïˆr8:¶õ’/‰É%bC!n91±ÜqÎ-û6ƒ›r´YRûå´§6›öÆÊUåèO¨˜žÐî u笺\St—ꨗŸürúíŽxü/{ÿž›]xÛà“¬†–NÊÀs_ ƒ(^ƒÀó\3й”ÍLN—îÏVe†³U7/?ØåhÕ͈üx",Ù4ãvîŒA…¦YTMHzoÛÌ;ëkÉðàI;Â¤Ž¹ ×ú“䙄^èÍûKqgdxA+ï ‹mtAª¦`Í\`¡?fß+v§SâÈ·Fp†IÌþÁy•‰÷Vˆ{4ÔͲº2¤0‡âòÁØÐ÷Ê:ç¹i’" ±×†PÞùöDnHþðqAçÖNž¢4òõ6ÂúÌ=  ;ÐyúÌú»*ÜswI¤ôôc«j]+÷ãé ˜¨¯3îk›°­(›ëª ._ÞõMŸ§d=öž'¡í†ó”ŠÃàN£Ié÷zasŠóäw3 )F¨ºÖ·Þž¶½ÿeŒ±«L³Ë”—‘Ⱥ;½™‡lÆknûDèVµ£›.ýcJ!æI$êšf ›ÃÚܬ]Hk¶SS/öãž‘ìï²%ŠD×ÂßÎmE¢ûRÅ‚M tósó¦º@”u¬7Mœ¸çW¨1¶âwS ‰V};q¾œ Ë Êa’b@·gb*mG‡tƒdÈL”­æ™IÌ5ë ÛýtÅÎ è׈«è‰ºIˆ][5&ö*ºšT×¼­"W–IRÝ]2ñ ó¶ËXß9˳0.c-ø ÏÉš›„Ò*†PKGI…Ou…Kùjk&jY¯ËBB™DHŸq‚Ié:ÓåõZëÝ]g)]@Z *É\@¬—4RœC‡^!N$NÀ—/…œ™.FÝ_Àбg×·{(‘5-‡tÉ)exφ!Jpx“øØ…j¢ëß½ §ís"{¦fM鯹[âI}Üß‹ÃêËà}îÁ>Ïɸ»“ë [ÄGîlå±½)æáF‡Ø–[7¾Á´ ¼{½Á4Y›L–Ȧ´Èë+Hu(¡XlšŽ³û»uÞ-ï(v…µ©n» ©ÄŠGLj£Â2ÙyøêŒºîtw_Ý‘æ¶wBÓ zÇï&-̳k %Á]kî%öo/QÅŽþJ<âá Ø?ŽŸÁ0ÀEj˜FYS$ñ<”˜R2Tõâ9;Zsà\÷9FVŒ¤áµ]<›‡Ü|K#‡´'žh xÖ!XWž8,Œ­c¸ñÆnI³Þ‡»õD±sH;Àëàv{i]ˆf¶ê¶wÚWÏ\vUyî]Fv?3â^ÀœåØÏ$ß‘ |¦ëôHê܇Ö_ÌÖ¯#Ä´/)Áë8×ÂÌÞQÎíMÂgà›â‘BT¤ª¼ªjóúŒÎ¸nÕ@íÊy WŒ„Ä)÷,×𳤮RÒ^ù î9Í/Ý5ù`÷A˜,÷P2ÏñÈî` w°v®¥ôæ ÆÌ_Ðb$Ýrl™º9 ;s4™ÄÉbUývsjö#§Ù@1(4!½–ÒW.>lÖŒR„æÌsœ’Ž/ŒGEU$tZ[-bhêÉ=|j³ŠºØøöð­…ÞßTýH)n(Ëœfàá)Эæq³fãM*ñ”QPzŽbXãr§<è_© Ô§0•SŠ…åJ¼…?èeÁ¶5ņï“=½4jËÙÂx¤P!a<•ŠWƒ"ÍD^…ŸÉ‚b…[hŒW¯ÞÝßqot‰9öþ°ÎùF )ªkZ ÌËŽ”ŸŠ 0˜Ò`—äâÈù®°üÒÊw»?5™œ×+wÿmÄq22ųËÚˆ;rB;©›ôvœÒß§D¢K–WΑâL—TŠXÀˆÁbþ½ó¥áÆ%Üð ®ïoJ9sž"*ü‚ý¬]ø0TbÝ[y°Y/8vãiwÂRö½l™±¼K¤[ÞiedÊ@¯4£Ê°0÷I¢R"§eQº0äPJ$ås°ã(%ê!ÒlIR§Ï=ÔƒŸ!@1çÔbOwÂHîéJlI¿MKjðð$JÇÓ”T¡†ôèý“!¥ª‡ŒÒ†qï‰8”ûmÊ}ìnðùåKRü°!—M`°ñÚ'7orËå8Ç›0™Ò$Óêz¹m"³‡ÔàíU@m†¾·©1çCïN}¼9yµÝo¿Š§–h½4ýeéVh”õìmì-ÇlÒî°Wgƒ€r¬ß·aï=†äYö- '\ šŽ8EZž«I7FeÃ'´ŽZªo™ÛÛ£{SÔT ûþôøx`AVM_ÐçÜôŽhôÏŸq’Z½º}&[*Á]~ow<ìü3TÀL8 Hˆ LªÄŽÉCÂS‰c:3ÇÀ³¸Ž Ì=ƒa€)SV=:‚ŸÏ{}BRaƒŸùèv_§â¼7g—Í1 ˆA ?[×áˆ!×prÓ™µ¥:;~¿òðB‚r#Nò-I½âËéÿ‡z3 endstream endobj 4605 0 obj 4023 endobj 4609 0 obj [233 /XYZ 38.2500000 516.500000 0] endobj 4610 0 obj [233 /XYZ 38.2500000 785 0] endobj 4611 0 obj [233 /XYZ 38.2500000 179.750000 0] endobj 4612 0 obj [233 /XYZ 37.5000000 285.500000 0] endobj 4613 0 obj [233 /XYZ 38.2500000 516.500000 0] endobj 4614 0 obj [233 /XYZ 37.5000000 285.500000 0] endobj 4615 0 obj [233 /XYZ 38.2500000 785 0] endobj 4616 0 obj [233 /XYZ 38.2500000 179.750000 0] endobj 4608 0 obj << /Type /Page /Parent 2 0 R /Contents 4617 0 R /Resources 4619 0 R /Annots 4620 0 R /MediaBox [0 0 595 842] >> endobj 4619 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F8 8 0 R /F9 9 0 R /F1409 1409 0 R >> /XObject << >> >> endobj 4620 0 obj [ ] endobj 4617 0 obj << /Length 4618 0 R /Filter /FlateDecode >> stream xœí]ˎܺÝ÷Wô:€ÛâC/ ày8@ È"È"ðÍMp_drùý¨[TO¤C5O)©G1;ÃUÅ"ëuøñ_ÿ¾ÿçoû_ÿ³ÿîþ~üºËežµÿÙÿ|¸ü®îßû²Ê÷ßì^ö/»/»/Íÿ¾ìÚ¾>þ¹ù×ÿözÿ§æ¿¿ìÿú·æ‡?¹_:þÂ]©ÊæïŸþ®KÕü+;ÿ}üù¿vùÝþ×cÝpn2oÿÿ­ mÍqC¿ìºeªÓŸß¾ÿºûØ l›k[{eÝ«Úêýÿ±û¹ ë>;ÔV©²°evË@¥>Ž”z¯tÝôÔЦ?ÐéP÷:/MÄÎO3§Š2…ò÷.Éܲ²-ê<ù»Þc¿*«ˆ‚sœ¹4Q:ÖÂÎ%9[›¬%O^F Ï¹÷įº-ZçÇ™K¥ã,ì\³&3U<ξöø&«ã)„væ‘8‹;—ä¬.kGe#èµû›:ÞQÛÎ\œ*oqï’̵…q2&‰^»ÐyÞVÑ:?Í\œ*sqï’Ìmz‰wzí=ùK«âu~šy¤{î\’³µ21uòk÷òÛLÇ»Hµ3¦“qï‚̵M?™{Ñ}„Îuï4og‹¹žÞ%™k:ÅÖŒ&O!QmZ«" ÎiæÒDéXÛïüKH'x&íO€gíÅóá÷ÝÇÏÍÕ½Þû¹™ØiÀö¯o?vzüptµdvÿí§ýï³L=ýaÿí—jfXè¼_Û¢ Ô’•§–ü ‹¶éÜ¢>‡£?Áoj8NÕ~c¥ªÊ7½µã(uÈjse‹g[²®·¼×›Q¨%ƒÔQ§–ò`êìê´ã£N]´h8œuö¹ÐÎúù[#Ù· e£½‹1¡´Y+”VwCªn2EËß>«T>db+Fö`Mù–ÙCûîšú‹û&?µ˜Cn‹·–µ¢W]щ®P‹ãCu¨ü®ÐÀ¸ÅIÜ5Sr¢12°~<‹FÛÿßdÏN8®ÔÛü ¦yç )ÃÁþ0{<ëº^.²yäOÉÂàq,Á8<d©§·'$ˆ¦ÝÈõÁô72n¡¤„‚X‚¹g)êá6œufú¢‰Ùÿ¾ÓLéˆ_ŽvYraÝ…õ@bk&¨ñ̵P|}9N†g€¿1¨EÃ]c ‚Ö?˜sïL ÔWïõ™µ@ÙüB:-0áë( ûVüÃŽ^|« ¸—ÜÇ•)‘s»Gð8ž›­ o¶Ù ëWÖÎ÷pް"<ë!$„’ªþ®Á“ pØÉ:ÅLßX0¾~­I“0Š˜ò½EwØÚôQ§ŠÇLÅôø ¦$e¦2b;pãmâB¦#ímo>É›øä*¬ë±7ëz™õtÂøŸÓ]‹+U&6ø°!†¿Ñ:ü…^l s“¥›¦­ÁM輨LÑú ®nvçcž32æq*`£ÒÍ#—pnósañ›w.b§¥Çx©ˆ)‚åóº<ò]@ØÙ…çæòk+ì ÃÚ×37(±¸7,}çj¢½é‘7Ì9¸Ï æw03Ú!4ä‡pãP2îœpRÖêL(ìý‚ö“É”,9hp³g‚Ýøf/á…õxõ®Omò8 OÌÀo•ÒP©‹s£Dß4¦!lG˜CÉ”¬ï›ÃØ¡‘6—&È=²e¼\C Ï25ØÇ‚õ<ð–7O›šìœƒ`ð¥kS|í‡W7O4Ï›$ÄÍs K™×˜:8oaö‹ Qº¸Eà÷ðì1€Ô¡²{ÑÚbÑ-Ó™êËåü*ÄÆÞŒ:¯û«f‚ëÉÈÇÉ X¼"°LNÂõ! Øaª€…òÆlÜeUc-ÔÖLñ£êÖöÇd ¢Múe]9̺DòoR䞥cuŒ{Ã6î§QB¨´¢<_M4_"À–gø<{…a>öú¤8w*U­âÜ©lÙ›§+˜K`ƒ]Ý—ÁÎxBY¥r{Ü*·ë̳C1ÍEK|83ÌHyÃ%êLò2sU"–õSrÏÍLÄeK”º…¤ ʦ¬KÜ5ïTx£EÛÞá¸m‹øe ³ûf“AD¤ 0VE\ø™TW…{Ã-„ÜyÆIMâIƒ!î7ƒ$¾á‘F ’ˆePuOXÌR1Yb·x–0ñSDLÐ)©š%ôŽI,©âxwzÙÙnê¯$‘|Œ$ Î*êþcØCÕ 1`¤ºTwI b@ægô°pç¬Î =Xx¤\í+¨:bžº¦è1Æ“Èq=ùñ&–sEûÑcÖêí3¢Ç*Œ[ÁŒ÷z† ܦΦð(ƒ‹±[)ŒØ}c!Ý<4€ãxæVJ®Çó _;ÖO·˜›¬ªú» ãùb™À-°7W”D)(ÄêòŽãÊ6ÇzÃ3€ë¡Vš£`ŠâÞ ÔhžõP^Ÿ Eá:›cÞšc43ÞFQ/ U*„‰X¦Ûñ‘£%D}¾ì{ÌYB2èJ¢ž¼!‰EжÞIbsÐðøžpÖLXŸÑ/Žˆk4­“#f8R½OV;R¾Læ©Yá\Â> «á®ñÒ ò`ˆ  ®üNÆ^‚~2'ƒ`%ë OX+l3´¤wSݦaÆä’ëÞ4€Ò4{K†i [po–®Å4‡pL‡At¦ö©,hOŠèNs™wX—‹Á­f×\9Ö·›æÚ4׫vÒ(¸Ú›yòŒ©ãÈ+j»üÌ“w£í4•êžöntÚ¦í8mçÙ§x=jÃà%ÕBE=½º;ÓBV­Q YHQ ¹°NÍ%¬…0€'Óåº?a !d÷†õ {߬<ÀšÞT ßi"âjõø_4â§êòÞ"¯óo$J‡õ„4Pá¼X ÔL*¦¸ªå]æ]@V<¡Œ[0SC"L T%^è ³o‰Äç|èÖEÿ[°²ŸÿqôØyø,‘Âôìˆ8ë|Ú{;Oö&Æ@dȾÕÇÐ-òÅu*÷!âqS»ÚÈ‹ãFöúTéƒ7(EF5h—ª=Rx|ý-És‘¨•I¦ìãÞj)YAö¸ ÷üõ3±³à\s=x•Ý){k‹½i/Z"#WÂ) n£”&ñÒ§߃ùŠa·$ðZ3½µŒ³ä§š©,ϸ(4‹Np]µñy÷Oœ„ Œc&åê"N.á§[p…DÑS „¹Ž%%¸´#þ[ׇֽԉXðKldÑS“²»t“„6¡B_x÷J1>…’;—U½hítö„8¶@òË¥a2p5'ѳâ²t»á‘æEf4yž½&ò¤=tD½ˆ‡pœ(rd§ç*Ÿ¤Îècr=™øiæ¡öWîÝð^ÜÊrä©Á¹ÕDæ­'Sû]U 5g÷¶ŸoZS϶ígéý¬ðY»ÕeMé€ÜL®aÓ¾õ0U^›×XÞbT+áY§Ùµ¥žœÏ¶k}ëaª¢¶]+~_pµ–lÅy(Š÷³ \37l§ÄêØe"ºì&ƒÓ™pÉ ƒËÆdémOÜ ç2QÉA¬Ž R1‘{ÜÛäÔž8D†ªÇ½/K&¿““SO³àÎõñÏf!Ä{C^»h‘E^»÷<”(ù1q"³¢w¾ÝkÒÂû+At›-‰ÁWTç 6;_2 2ùgnÕubnað²dÜb@)Á­ÆÌHÌ­€Â0@| ¸5a&–å9a]6¡’¹>§*aVÊ$ïñ=À¤Ä%Œ«‘‡u›L2ó:+h¥`¼sîñ%HèöœÀÖ™G¯z}Þ(8O“÷ÏŸøùî¦î¹<}ÆsÃxxc¿Dš¨çBØJØJÚžvReÌÛ!ÇPS×1üL|]¢ªê­†‡…†Wà.kbYêDoÃ1a38CR 3Xà  #ReðÈ9ÕnÐâ OšË–T¹ÕkÜ ã˜;q˜ZȜ댿‰0º¨c„pISo‡fßJ(Ί„9;ÄZe`áÝÖ‰Õ&†4J’`\ÌýU÷xê·q>¬èr-•§)«¾ö x¹@Ôæf*Ÿæ:Ä<ÖJÛãL2·H@ј¨AI¹Ø™\%æ”d uEª„DÂç[ä<ž=ƒ˜×'Nˆ…èݦðQ49P4ýãpŸz/ã’#ÿcöÄUÞs¾ÿ¥2÷"ËÅeey0¶Ô37LÜ›1¦Õ$Ç×ǸÏRÏ™y7)ùÙMfá¬ñ'¤h ~ÓÙ@Æ}tEËýg J¼OÂ:g©Rªzº OS¤¶—ÒÌMGÔ‘t>Å<˜‹>ŸEbbóN$ºÃËDïýQ:ªfN ©ðì‰lšØ³ç†É¾Àuƒÿ#*0ˆé«Xœû/zÓÔíNsé/8£` bàC QEØæJtY”‹þOÔ¶x»Ã6ÔÈP¬W¿=Fé`P®¥= P‡øÆóÊG–PoÛ»·­‡Â‰ßô‡]{ŸhðÑu†úVVÞVª×á °æcxêÑ;p=˜:pª*áùQmïŒÜxïdÞØÎîü˜ý%M¯oz}zÝ6‹ÚôúMë¡^¡Øô:çO`^”À-¢oM,Õ7àÛ,ïS£ ±ÇUbEÕ[Cb'bÌø­*úkK ·—s*W3±Îé똬«kÖyRïq¬0 pö²×5ט¨¼ÇáÕÕ˜äv\F£ŽÙW×ÂQb‰¤-&Á( ŒJqN„‚&!f2C5cî‡v,ŸCºÁ–»+ˆdà3DS­"å'*ÎéMn³å'J™¥£Êuïˆ5Ъ¬ëA?<¤©e”£@®Gs§²YÓ<ÅGáäÆÈU&Ä,p»dHíEæîÇd9oWÿ_ý#û–Œé·k3Ï;çly>Æ£‹.Pä…Ÿd`•ïDÒc-2h¸VKÔk°ÙA+J‹¯öªÅkC$êüøŸRe‡ÖÖ¹ iZÜòƒ€®}&¾ù„¾Á-.G`¬·ªÛ mÁÄÅzÊNûxj¸“½Âô¾1xÖ:x®<àg šÛÝcã<£o®<€ÙôŒ›œ©ŽYABÛ²ã0΋ejr ‡=<™zµ;,³S^´’h²ö! ‹âÝñ×Ve°VƳ‡™z9¬ÇàÜRÈË„¿ÌhÕ&¼‰ËÂ\Å…|O•4Ç„ž¨¸ù<ñÑgOÍ@Ä„ÆhgÆ‹7ÑŒYÏ âŒÏZô=lJ?‘hÚuÂ{¶)ïõ Ù]£Ì^›zo- k¾õ§Ñõ½ÖΧ⽅uÖ9D¢ð¬‡¨Ç³Æs[§æZ§vXµ-yÒBÍŸýK£n¼ÚèËÔ/\aZV㕪æ©cÄd¯í[Ê…EÚ•#A»ôð1IÇÕ‘g&Í“û¦dc)xó|B㘩ª€±¹}v+EA#lÛ×)e×äb¸@w@u_@uæÅÈ2î ~ã6µ Zzù*¶¬ÀÿÝ̸›ù34™òpÐXL …‹ ¦*~=ÏímÏ à8ÎÔûÓK0–¬ª· <Õß1žu=¡ i°‚Áß<¸ÙýôHÜ‚çæÌî1e9ˆéçyåm1‰ñ»ÉA vÏ–™98}åæ…¥/Ð5&µ/û/»ÿ 4k÷ endstream endobj 4618 0 obj 4885 endobj 4622 0 obj [234 /XYZ 38.2500000 386.750000 0] endobj 4623 0 obj [234 /XYZ 38.2500000 213.500000 0] endobj 4624 0 obj [234 /XYZ 38.2500000 386.750000 0] endobj 4625 0 obj [234 /XYZ 38.2500000 213.500000 0] endobj 4626 0 obj << /Type /Annot /Subtype /Link /Rect [138.750000 504.500000 184.500000 511.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_rename_ignore >> endobj 4627 0 obj << /Type /Annot /Subtype /Link /Rect [270 221 318.750000 227.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_default_args >> endobj 4621 0 obj << /Type /Page /Parent 2 0 R /Contents 4628 0 R /Resources 4630 0 R /Annots 4631 0 R /MediaBox [0 0 595 842] >> endobj 4630 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1409 1409 0 R /F8 8 0 R >> /XObject << >> >> endobj 4631 0 obj [ 4626 0 R 4627 0 R ] endobj 4628 0 obj << /Length 4629 0 R /Filter /FlateDecode >> stream xœí]KoäÆ¾Ï¯à9€gÙÝl>€ ÀJ« Caä`ä¬ã†×ˆâCþ~8ÃÇHä|Åá§ê&©¥…µ¤¡Øªêêzׇ?ùGò¯ß“÷_þ“|m¿ß9¤Ç§ÍÉé뇗ØòØþœ¥O¾~;<'χÇÃcýÿçCó—û¿Ö?ý/±É_ê¿$?þ½þð§öNðíP˜¢þþëù{U˜ú§´ÿ~úü߇¿ý!ùí4b7]»˜×¿ÿ`maMvZÆÄÔχn›æüõû×ßÌ›%óYfËÄd.KL•Ùä¿ÿ<ü\OÐ Ÿ«Ì˜"ÏŠô-ö¯<fáàŠ˜õiHn|=fM@nܬ<fñàš˜5U'åÔŸ€~Nˆò. I7ÕYÌQ†J‡[<º&r/C"÷2|€Á³"à¹=¯<rñèšÈõ׬|ù<9ÏÓpƒŸW® ”µppM̽ ë\Ed_fá©fåêPép‹GWDnžfQÿSÑ‹á n]8¦Ð¬\*-r…Ñ5‘kËîF´!{>ÀàY’rÊó•¨ •¹£Ñ猂—Ò|̦Ï‹wO‡Ÿk½,Ož~®Wvž°ùöôíÕ¿œìh™Kž~JþX¯Çü)yúå`Òc^˜²ðç¿kžøówôY~zpybÚwÜÑÙZ¹¿í>±ç'屬Òܾ|’>œŸønš[FsÍÚÊþƒÌ?ÈŽ™kŒå—áïḠ[Îm´¤4G;6)„ÞVp4Ys7\FœX@†¬LLÑE9\ýè¼h8Ÿ€ôÏ ÐJ³ùÄKí¸%󇧚ÿ¼u˜,EÜ£ð ÷¨ò×K¯Žçu¿Úîgøä>)ç?1zâ<ínþaž»x÷Æ¿>HWÖcá\N` bXÀ}".›ÄP,q'¯ Š+ï6+®ðé$8GËÄWÉSü§•SR-Yó””ô“8»«LSŒ5hOˆêyÖ]¶åȱh†¥œ‚S›'ÆtÂÌP ¸"æ ò”¦ÙÌ ¼’³Š,`2ƒÃ3"û{•~âq‡¼ª"߆xÇ·¾E –á“å%‰É»rt6ù$ۆOÌ}„£Ý´ƒ5AL½½áy‚Ðh.T˜22J!îw.$q!̽¿þ aÌa}“ k£vÒ'¤ÿ¢èTvÛ¸±…ERA@#,ê‚lŠ¥d,µb¡*®@8‡""V‰Œ›ÿEÐf°ÎBx"fؼu oƒX¬…XôÑH*ÞoÞ ôþÇ’É!,&^bâÀPbޏ0Zc‚¹b7p³wCŽˆŸ˜OÄÄ.Ṟ‹ƒ<ãŠÊ€·™O‹ÁuFˆ{MùèΣJ$ÜëÒŒóN,I1sKâÚ¬ÀøcZ¹×¼è#íIZ¡§‘îiJ:ÉSø^ƒd¯1ÃFnŠº».WÌ ûzÐe§Œ´>µ‚€×¥I­Æ}©‹,ˆx4†æT>æÜm‚¨J§OetÔXª6C˜+ |p#­ .]½LÁAÁVUÙ8G‹Qâ².² È½‚)“Õíê>#A |€ ¸˜nÓ2ëB×ÉÁæ[l‡!#‚9¯š‰gÁ£áýKë *ólÇðE,Ó VÃAqØ}A8Ò”am:€Žäeéâò«Lõñ×"im‚ZEØ-T×ÌX2 G°~ày0Dñ~n0©›P­˜ ŽËXu]_ºjÒ{S_¢‡,ªžhF‚_ž¯ÎwƆ¼wÊáÅC™{t/»*5WЮúèûåmݤE…#ˆ°ØŽcqÄ„ΞZ‡úU]²vªP¦ !gQª•Ÿö¹#ØÛÉd4SI *™¿8~M5¬‚’ g¸ünNQÇÖè§M¬ê¥ü%x4‚ ™º¡+à,¦n–’0Âð¹R a4 *ó‰Hn9аa nÃGž9;¸ ÷¸7Ëš>ísà°)Ùù8ØÐ.˜íaí!_çOU5¸¶S(…:h²Æ£ R56§3Ò.álÞ!²(2ì<ÅïP…´ƒu(ª°ë××ÀúÎZÙ®cžF˜â gÐîú“Nãîú“´laÕªeöÃ`!b o.Ù¥¯Ùy€DcºLÖ3Sùf—ó$©?,͘o¨ro=¾1am4}°²c‚투;Ál1Ê­[¸0ßšì@‚òJdcFs2QæºAª^ÿ `áÌ3^23*Qknã&ævnb«lÀN(/>¶¥¾bÊÜ£W¬<Ä'Äô÷Hƒy3Æü güe§ªÇI}?Ôˆ~ñÁ¯‡/ñë׈jùD8ã“Sf ï#iuÏØ^x‹·¶¯xˆÍfŒj/BQÁóJa$µÔ@è0JǪM9‹+ú»±o 1ÐÊÛ>“iå…l½Ý3rnÛOˆœ«yæ5þIJ*ÝNI;Ï_#Ï~Ît‹Ú”€SôtÅ2E‰Ø©Ä3Ý%ñ‘A'˜cÀ¹ò5!c :Êeæ.‘òDß“øˆ'ëýjŒ~LW«eæf¥gau(³}åþ]ˆÝÕ¡·PRVî”´óü5òü©C‹õËËYjwS™œ²´¯øº¯¤O;vÒ:¬Lzl|O/YŽž´W¨?ڡê ož÷ÎGô^[{d¯Ö Ê¸cS˜õÅ~š3ªÌŠŸó&5Y@%v¼3ùu3q.4S2™ ëP­å¤Òê‚é2-‹˜9Ä¥¼f°**3“ uŠ•¯›'ËWIÚ1¡ÜgL·ªÒ{¤›GØ‘Yþþ¯c+,íöÚÊ·ý{»é–o˜¡q×nTÔbØèFªF:• ðF­*?¸Q…zD¶ z2ÕHN0§àâqäÌ}F£ÁQöŒ‚«Û9AµÕEÌmi‚]è8É“Höâ%ˆÄÐM'ºFÁpîŠË»¸¨‚Da †Æ„¸$7¡ !v”õáUãâ„ÊgŸZ!™Ÿ <nO4ÿÖu3ópãÛ݇·¾ç} œ¾‹é*½­¯d´¶›Û4‡ê¦²ëöè¤3Ä.zÏt¬‘š8ëTÚ¬SÝ(.)WD# W3gƒßV€• "ªjÓ Ï¬ý´ rºìì¨HªMÒ²@}X"jQé®zWbE Ù•XaÕÛT!™tzǤRñQÿóÖö)"_ïÓ]w¾.r‡¯ï|}»|}ç4‡,S; ùCîò»â;GyG±F}Ö wEYL÷ÇZ.¼J¥i“jˆK›äv-¥¢M¶ð㜠ٶ¡§=#”Ãbû¸öÄx)nov¥[—V0¿3.Æ=cëª0×õ±0U<ç„cámIê(èŸ-y$™èÎ îíé¶Þx3:{©ÖEVN·Á|Œ8*ì*·¿Ð;WÏèR¶æ „”XP £¬÷Áà˜cX¨´DÅXÁ7àí½Q©ý3¤6Õ²X÷*~'¾µg@˜KÌ¤Ö n±MC£¦×–²^[™N•îê/\ NëÌãü”¶&@v´Ãš ½3)<\;Ø-õm½Çóàwrø¿×Öš’®aµ‚£¥¢Öx­ÉêZZ¡#xÐJ? #%õu"F6My±ݺÝ·œP"4|FâÓm¬ Ö­™òg»‡ÜêšGÂwÚª7×htª-THãjaÜã½UePŽw½ÝDöÞªµÌa÷Dȼn\íš©˜áº«–WµÆ¤É\E‘ã7šŠ÷s{ô¾ÜΨ·@@ ™—^äCaûvÛ ƒê40­äÄS&‰-Q©*>3rYˆB%Â’˜L©H•ðãÀwaäl$ÝZ#ÄPÒ½´É„¸Î('nª‰¯³2¸þÔñÜ ,–á@[–B½ŒÀýÝU¤ZŸCƒÑ=,–…‰ ž™á ã»ó†×N†¶½“€¤²ã«mFX“ ¾ÉÌr&Óû ¨ éSÃklÅõ&K}.Ò‚>φ¢@W }Nq·ÕMJ j¢ÍtsújϘ5msú¢È_~°Dsú¢³¹iÄÍq,UÄV5ÎAê›Qƒ)×Ù7¶|ß ÜËÁÂU3=#*ˆK¬à>™ZAp½=Oûf.Ë;ýKëX‹%+Gi0ÅÊ™<ƯZ+tyŒ£ã˜ôѧ‘4ÍŨªÜÌh1®¥ªê:q„ÚÔ› a NA ŸUFËÁ¨rÊG>:e–F½²eóv|3 :•!°Ç6Pª÷ ˆ"Õ%°ÀT$İf:Ub„#ïF&[²?„Is?Tà#èa-53.|üæ‘x%Œ¿š1³ÇjÓ zÌy–ýl Œœ©Ònn“vd(‚ÊÓ§aÛ×Çú.LêT0,)D ½0=îçß î…ý|ŒYÀE VÂE ÿª žl²[ –˜.`ö£êhð¨ü¥zKÏCOjÌ=Xã"®gÂQkó>Þ„(ÕEšŒ±j¥Ñ…‚ /ŽÝX÷ê>å ¶öÍ]ßöeyQU`½Ì<ëWQçµ Z\Ä·pÕë½]¶q”hM <¦Kưb,0MÄ¢Ò²¯&©Bh6Æ`Â×­Ø0¯À«ÎÌÛpR%Ï5ðEÜÚ`K¶8»®lÃàÑà;­xmfm½¸-Kp§Ÿëw+€²¯ŸOb“€« ±c²ÁPÅ ðÚÐ1Vçiu†kï`` Æ”UŽ@PÃ#ì«+>Äaƒß¹kWŸ "à'xm­.tY@ bø &°»ƒr—~%öÌ©;¶üþÆÃ ʾˆdŸ¼Ô“ÇÃÿ99w endstream endobj 4629 0 obj 4188 endobj 4633 0 obj [235 /XYZ 37.5000000 227.750000 0] endobj 4634 0 obj [235 /XYZ 38.2500000 281.750000 0] endobj 4635 0 obj [235 /XYZ 37.5000000 265.250000 0] endobj 4636 0 obj [235 /XYZ 38.2500000 527.750000 0] endobj 4637 0 obj [235 /XYZ 38.2500000 281.750000 0] endobj 4638 0 obj [235 /XYZ 37.5000000 265.250000 0] endobj 4639 0 obj [235 /XYZ 38.2500000 527.750000 0] endobj 4640 0 obj [235 /XYZ 37.5000000 227.750000 0] endobj 4641 0 obj << /Type /Annot /Subtype /Link /Rect [213.750000 640.250000 253.500000 647 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nspace >> endobj 4642 0 obj << /Type /Annot /Subtype /Link /Rect [419.250000 535.250000 474 542 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_code_typemaps >> endobj 4643 0 obj << /Type /Annot /Subtype /Link /Rect [329.250000 289.250000 369.750000 296 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus >> endobj 4644 0 obj << /Type /Annot /Subtype /Link /Rect [106.500000 236 171.750000 242.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_std_shared_ptr >> endobj 4632 0 obj << /Type /Page /Parent 2 0 R /Contents 4645 0 R /Resources 4647 0 R /Annots 4648 0 R /MediaBox [0 0 595 842] >> endobj 4647 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 4648 0 obj [ 4641 0 R 4642 0 R 4643 0 R 4644 0 R ] endobj 4645 0 obj << /Length 4646 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯ès€m‹¤ž@Àã±äÀ°‚‚Ýl‚Åz'‡üýt·¤žiª¿’ø©HI=#±3QÅb½XÏwüò÷ý?ÿ»÷áË¿÷?vø²ËU‘µÿÙŸþüðú¶>tÿÞWu±ÿñÛîûþûîóîóñ¿ïÚ¾|øóñ_ÿÛÛýŸŽÿýeÿ׿øS÷K§_ø¶«Luüû×óßMeŽÿÊ.Ÿ~þ¯Ý_~·ÿí´bÿ¹˜ëÿÿƒµµiÁùô÷]¿MsþóßÛ½kö•¼(]•íMîò½ir»ÿÏ?v??Ð/ŸšÜ˜ªÌO¿Ä¨²§/ÙºÞÛW²ÙàCç?JËGX<Ϫx‹Ÿ!WÇŠq¥‘W×<ܼÌZÙ¬‰ÿ~ùø/˘”s‚\+ýáâÕui«¼Èšþ{Ö¾ê¶H«ÊX»¬ãH‘™Ïk#¥?n¸¸"+W¦Çýé£êzY>Æâ…‰¸øru¬tg+¬®y¸G‘Ñ"¨)b ¿_=úË"ž˜n!×FJ´pqÍ“m.|å\5Ù¶Îêˆts†\+ýÙâÕ·>~-âá¾Z>Ââ6¢yÕBëp‡«YƒÒþÜï¾ />}ݽûdò£½gÊýןÀ¿Ùþõõˆ”bÿÃéRw䧯?íŸe¦úÃþë/»æPÚ¢±}’=¡'>q%\ízbà;&‡¼'Þ±áï¸îã Æ±aË!ÞœƒOð~šó“_„:ÆåÙ™Àr×\£#?ä®u¬¼HždÐgÎOê—_mqZê&;o÷Ûz’}F‰Øz†A‚d¹êÖ+¼S¼³S¸E2Óó„€HçÓüÕ܅ˇd¸À 6H¦}âE^ÖÕÕj|2 òF‹ç9dW #ò¦¨‰¼ùUb‘[_'ú¢+xÖ| A3by@FXB‚6O“EEgÁíK°ÐcÖÂò³½ÅI†~惖dP˜mŽ-ãðÉóÈw"2aU6>bÉÖÛöUYxGÇ/˜³0=¿Ÿ, °öÔ3V"XLAµíõ4oÜvˆ6èjf ¼Sø$Ã;…°18ÀWM|©ÖÅA¿#ïÖ ´ã,°»>û÷ilB«¥-%‰y94E£¡ßTn`ºqñ²]ˆÝ㘀j•£H×KÌÈ1&÷&`ƒÓ³=ùŒàü'ÂL؇š¡Ûcë[|ÓЭx«å»1‚k|Vb2A±ó¡hÆ6´Áà O1=ªˆÀVHÈÀ'qA÷Á>z¦G¢nw–¸I½©:!Æ®×íù¶|:“Ô¤Ús ö4U`‚[Z1×|~UÌbA“ûºpñF^*ù5Ty*c†-<´éNîYåÓá¦/‚as`!lÂhØ€^˜ ßÁÓkGa‹[ËUO¿ó®øG•®3ýMpSªf²+ðó]Æ%Ê=ݸ¢³.¼m;(„!Õ†AX@ãÑÚX8S³ðNÑmÃE·°S,1x‚ƒx¦ÂÉaÆN;f.™)=JVi®<—B×¶Z¼¥ÛbÁUÝwpô3®L.²Ü#åMÛxAlTýûÙ¨’Á;½URw³†_øòÿliZ•nˆo,eg)g*m覷(H4aj!éµwZΗ⺂Ý<ο¤-6&Jˆ0¥Wº±8ÕqTº•LCE £¸CS¬êa¥†á8 Ó‹ØOÊéu]\ÃsËÄ×]bð¦àÆö ¶Æ°Õ‡­1ìá…c_s<–dŽíhf¼,™Ê mÅÖ?Ƴ -l]Œæ˜F!®©ÁÀokgŒ”cÎ"nM–¸2ûxž‚@½j¼†J$a?ø|ˆý÷v縜·àr¢D0®1FáÉaé÷#ÈL!XºÜY|[\Ëkg*ÞOÈxëU¥ £K/±ð±SHrKi²Ëø|¯ÀSBÞ ’ÛlŒ7A÷fCx éBñá½RÆÎ&-@æ|0ÔŒ§Cðµ,î {È‘ÞîMî¨ú›„ÕR,Î=6~¢kS4×`*%*( ‹<®‚i4-†¡'2ªqêžòLyÕz+n9 µäÀJôëQÒ}+.õLP±_Z°º(hÐUDyðo*«‡Ñºmj‰~Æ”Sn?Bú5ÃvL³`Â8é’ Ã&Ãó?Âút«¦­ÏP·¤€XM/UºüY=Tì`S;C²ê5ÒÒMQbÚuÎÛëòýrR ¼ Lc…€éàknõ»i×£¯Ñ|kamzÀ¶|S‰éûÌ­§opinn ‘7}XUœî9[’B5´jKjÊí³X´vK}HUë+bAÝzd¦§ògSF-åÏjÿ&ô{¹©±—]O”èŽêˆãQŠ]µWéíºUtùÝyÄ)²É ¢r?£Ü„}–~öp^[_»¬PND V챤&/øqŽõY@©ƒÊ$¸WIÁ´°c"ØzŸ>DÙ­z!]¡‡þ!t¦ ˜)Bµñ4£` 2HÆ×lUû™WMÙo ÷m@Ô2 ìwߑҸkvS3٪ə¹ïQ.ñ >ˆÚ-¦¿3U•ĸ9¿¤rÖ3^ŒÁ@×õÆÏ,*­Gã8ÍE÷ŽNi©iÎäõ>ºf<ƒ|LrT§é©` º’UonÎŽ”ê-Ë) &n¨kp›3Ü 7_…ßÉqØ2Fx6ò6°AP[àä¸!„'7îß)`«¶˜ÁÂöºÅèCñÌXc3z¢¦3ÿ†/vŽ¢×[x £¹‚±ýɤ͙ÍåÎÛÜ Ë, — •XPâ¬:†=rEÃ,Âwêk:oIÁ Iá|¢çͧŽglêæõO~Ý}x!`ðÔ•ZŽY½7Í­Ú²ýd•_òÈ·E+i_Ô|‰žt7óâ`ËÂ;¬OÄ;ïá;‚®V÷$ÖŠ¡Wû©z“Ê/0ÃO„ï´¤\œ±a´bÞ”=-¿@`/æžAç@¸Eßa`3Ml¥Ñ9…±=0ÏÈÆu½aâüº>ü„ºz0’J·®¹Ý¬xÎuM@ µa¶Á¤â&qø*ª›=¢ê£ÐmÕÇøÇ’EWÕ/38»Ž¦·|Ìt8fwÅT»8>Í,¦kÐæ¾b#HN9+U8=à&«šHM%ycZgŠ ±Àd`¼ùŠmy*K5=U¦fÆPÔM·Y¼=ÆC>l]>$6’¢º;wÅ‹jMV±‹·ÍT™ re ƒ™öí\Šu­ÆéÙ6Tª.ACºT»52w’ËÈÊw_1ê„rgèF8§ç-¦±Ó8ì.Óçc—·n/âÜTŠžÆ‚ÃÊ8GLu~÷Œ©ˆ1•|—=ö‚CŠÿ‰Ñ:ù3…SX±’5g$+c(`¨­YB ÇÇLߎÃ<ÞÏŠq¦Ç LŒFªŽÆP1#'U…˜ž@?a{xŠO¸ H¥ÇºkÖS¹Å Ægñcloáæ1¢™¬ÌÀkC1}O…c@Òø·'A€ÌzÚkSióLýAg_,(º©– LÓL>`xÒ 8TUxMò±O” ö”î´òåeÒ*Ö™ó…Óâmâ¶}‡O¨8cÂtëÚ¼þÁ©`¤Cè¦ ½:¾ýÙ„^ïëÛ®1ƒ¦nxxÁCÁt¡HµÁ¶£î åTm+ç}r•m»"±U¶mì%ŸJ>ØœQh´ØÒoupÀr»Õ‚ãà ÂöÒÙËoéàj|‡i‰wªæªÜèúkU•¹&þ[—œ±¶·TÑ'â÷¬¤ˆÕ:bÁÆïò_gГ ïÊ]üA"èH϶\>¶K÷ðÁw hX^œÆCØ ”â¶ø$n Æ­Tyè,¼c|4ña{‚x‡îÏ‹«<à¬j‰~×ïÕµ¹¤MÁJ|åAêªýr;DaÎsQé6ÌÁ¦?Ó‰¹\*^§ ¼ñ<`B`Ó¥ÇT$Gèp¼ˆyf0 BÈÁå‡LŽwãøå‚s¾òÌ—|Lx€òèN¿ 2 …Ì'ŽåÚyX^nÒ71ê1DíøÊGháû ~0ù‘ð&‹10“ÿˆzË÷ÉôÇž‚å«a‡Xpâ~Âô!x¨îEUwã|ÕM5˜gä?”.&>ª©ŠçXo¥Ò4Ý©ö±ªß ÅŒ·‡«éާX~Eòqd묮²—:3=T×yUø€Éõ36 ÜpLwZ_T§ì¬*GÉd¹‡1*eÞ̬\,?Tïž`‹¤†Ø¬öibz®¡®E!Œ›ÆÎ~&ÀÏôÀfê+3R`jbËé Ïçh»|çÜëÄKl9}ÈÄøT°te”OâG¨‡¿ã>kë#4uÍ [ïÝö¹úh4íž1!~D}¿p?8 Ýï-‹+ k(ߊ9úÂö³–ˆLBΟ’ןKp ‡©Êáš•jg…¡°Tµ[ϵD#„•£ÿÌ|H&°¢1’F80Õ8ÔœŠ &LH•ª^© H‘Gð jQ˜BÃ$ Pn]AÌ‹½¤jzøª¢˜…sÎxzn…¥ª®'|V³®Ax÷3THÓ Í¨©¦ªhËûm”~AÀÒΘ0ó`-)“CqLX8 L³8bˆ"&ÏS•¾—ëè b31Õò]…í,ŒÐ…WùSÑlE{+jlÇåþ}Q5¡ ¿™f©ÌæÛÂo'Áp™äzcëÆçpœ¢G ]º¯­nØðH"ü$ÅÀ¥Þãö2Ëu¬OVÌ{Qã£é±~Q²y½ó“¶im.³<﮳4fªMNeÃÝŽ·97 ¨ŠÈrÆ´“cˆ¹r«˜ÃVgÙ¬9&¸mìIšÝÙ9óE0o „÷ýÖŒÕ5Ôœ@/ùœ «ç†Ò›_=*[›K‡jåÚo¾¦(èJÆx†Þj&{t}±ʳ±ô}ÿnm~—Nn˜²¹}•ö¡ÐH¨Ý[‡ufêúš‘ni[¸¡š‘˜á.œ½Ú%#6›5k5Qy» kÆÚ9;SáJ Râö¶v Óæ½ÿ$Å ±ëÌeÞ'o%®6×ÿ~ÂËLïp¦l/ÕtŇ+(xJ•f©¦Z3ù.L«uÉÉ}ü³ÿ~”~¢pü<ö ¤g}³¸ä(à2sºÄîíešÛXªxu-mž²½ÑF¯¥ˆéÔÒ°‡rÐKÔ@ZyFßqc"ölŸº Ê‘[`îsû-`û–›ƒ vlÓºñ%ìÆ6 ^ ¾Ó‰ ´õWþ–àNÿ>BÜCþòsNž&×@bÇdƒ± q‡©¤Ó¥7Ø@€~§“ƒ·ÞÁ8ÀŒ)«öØ@ (Ÿc„}õgÃþ¦XÀàwž:èùkø †­“ï·„> endobj 4655 0 obj << /Type /Annot /Subtype /Link /Rect [111.750000 499.250000 156.750000 506 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus >> endobj 4649 0 obj << /Type /Page /Parent 2 0 R /Contents 4656 0 R /Resources 4658 0 R /Annots 4659 0 R /MediaBox [0 0 595 842] >> endobj 4658 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 4659 0 obj [ 4654 0 R 4655 0 R ] endobj 4656 0 obj << /Length 4657 0 R /Filter /FlateDecode >> stream xœí]KÜÆ¾Ï¯˜sؾ!€¤•ä@€‚9N`ØFò÷Ã6gwI~MvMu³‡SlÉÛb?ªª«ªëùæO_þqü×ïÇ7¾üçøÍýþáË¡8ÕeÑÿs<ÿúáåtsr>ÖMyüöëáûñûáóás÷ßï‡þƒ/þÒýéG}üs÷ïÏÇ¿ý½ûáî/ÿ¯‡ZÕÝï¿\~okÕý©¸þ~þù¿ýÃñ·óŒÃrn3¯ÿÿ­[UVçm,,ýý0S]~ýþí·Ã›a«Ø²1J•5ö¨Z«ÿýçá§naúâÔZ¥êÊÖÅ- Õúº’n»™”,tùÅ4}„É­.ãM~Ù9;T”©”vNäÚº‰‰Üçé#L^¶*"åœw ¹xvNäVÖôj˺Îüµ©ãM~Ù97PÔÂÉ91[Ÿ!sOYÇþ0{ à7¶ŠH6—y™2`N~j*÷ü3qéæ¼nÛýTYÕ£ÊùV©ëåt¡›Qóbú“ë*ž(èwÎGUžÙ9‘k”cÖF› ºNþ•‰§Äõ;g‡Ê€\<;'rë±TÝq~]§ÿóƒ+Úä—³Ce@.ž¹UQhwµtѲƒèÅôü𯺹£!×íœ*=rgfÿ2 ÞJÿ`"øîùðý×ÛOÊvRÕñëOÝæ.kö¿}í€R8?myüúãñmQ¨âǯ?ÚS¥Ëa‹ýHñG>‘pD£‹w¿Áë)ƾ۔“n½¢¼0€ë¸;÷ñk'£K°Ê;…Ô·8’f§YäÿÞa,g4'Q¤‰Æ¼<'•I*kYu”ïß¹„œÔzؾÏX¶P8 Ôex9/¿5m ¿F2Ö\eDø“䆻ÀÀÓC³EÏÐÊzØæ ÖUyÙÏófú4§¦-F#ý6íÉš>–dÌ4”:•¶jºÁñ¡Ë“Ñz5›ÒheÂwà2··ÎÖ‹6=y04kÆ“ÔáÇ0ŸF { ô~õ_µîŸkxPÕ e$¯À¤›3³µöé\xvàŽ^œªZ½&üžìTy*Zóz¶wp¶¥JC+v€±n HðŠ+ü †5籠çáã’ÍÏ4vÄ)ïÚ S¤Tj©k–ã5͘ âû)kÂëÖóϬÿ;ý%¾€[ºKsçÁ\r ,þÍÿxõ"Âæ“°‘ÊL.ºfñBUe;‰ç(âK«Ã±<¹Ò˜ôÕS¸Pr&ù9mnIÕ2ÊÍš0°…Z3eá©FE‘ÿ¼ð„Áb¬GYÁZ,^‡ f&á2M;¾½¢¬ÌCª­«Õ|ÎsÖ¿‰<Âé}—fT¡õX4} G™Ç­ˆ ö ¼º;6"9)UÈMH$º!¼©0Ó ¨7¨Â> ¥ÖDQ·¥˜¬° ÅÆJå»Õ°àµ‰à-Ù x†s‡”J-s |û¡š‹ƒ$4Vá<ÁØ< ¿Á®dgbå€|Ül†ÍˆÍd:PÚvßÒ+È1v×j_t7vz8ÂÞ ºyð§sѦáU“[pÇUÚ¼FÏœ`u#ù{öêÇâ°&h¶ÌŽHú3rʳ%‚‰Ècz'¼±é0äNðZÙÁfí\zknå21*â…SjùU]íU²Jºí“îàÕ$wsä¿ÏäŒJ´ P<)a çÃa˜žÛˆ)‘7|ãÓÁ=§»¤‘»m¹ŒaüfPô@b¸Ä‰,8póN Û•‘‡Ù[Psʤ‹Z]Ó×&é£Kj…ŒÜíÈÞø`ÖÉu5¸Äp„9%â vøX\-s$Þ,kL/% ǘ1‰ÿà É f“%›@e!é,‰Œýž,*<Å D‰Ž¤\WJL,Ž*¥ÄÞ…-àpj”W1·ƒfþ,`°TŶo‚Õˆb#ôì §6S’ž—téˆÿ\¹w„ŠcßÜ '$Z`]c¯ùˆ!ŽIJÁý¥ÓÕvL¨ ›ˆñ®¢D1Ec'vöv½%ƒhl½šAàëB¬¤($ã„cæ (;‚¡D oÜ<L%òå{XÂæ¶Aa¥b·¼ß^Û Â^~‚ÿÓ“w€©û$°oó|ðl¬wÇö` ÉcCð¾¤âþš-¸9j;ŸIÖ ¶vH­qÏYlÛ×uCœƒ}fĉˆêäÔ’‰^2÷M‹¾qq‰Êž&Zι²î©e¬WCêSÛŒvàVsë|B»Æëàó8Ö¶ܵS¸æ¾1piÃñ3T‰™ÁBOŠ¡ÃŠUá½a,P¾Á”ˆ1aàYS[¢bÖ4#®a áS»p¾ oB ö?áÙò-ý3ÈRÅUbpz¡¨ÉU%íjûº¾”È›ŠORV,~(H;D¼,=„‘²zŒo0ÏݧDÌ”mݾTH ˉ¸Á’`Ð¥"f”&b}›€}ÈS/—€'Ri®eO‚1ˆÕÒ€òu¼à6.ZÓWÕã÷U¢ºŸ‘¡ÍZç/N´qT*1IßÂ2ìï½Eµ¸Ï+’¨Šî´DÙ•'0'•CJ`ÎW›á°Ú¤³ï˜Å ›fD=,qi¤ëÆZT&¤ü&Aç"i™¬&@–WÉ"̪‡xÈÇÎ!P)†¾­™ÇÜ:²”ç<%‚µ~2³½îE60ïz+5)½……¬lì,õ¶¢ËÓªËSNš(Å£ÛAEŠuϨ/ß&ë=Åù±µR,?ñ{qû”+ ¿ŒBÖ|ŠžÊG>AÍ4;Á>üÍ•æbÖŒðx(bó÷»ç®³¤9%zÉxžó„cxè;þcSUíX:&ºˆwnÙ#dŒ’=pvÝm”ÀôUÛE°SÞVbvDˆ‹ñ „ð~qÑàLå#W\HÈä¡RlãhñtKäµ|²z½¥[ÛÜÑ) ~„áoðíÇ»NùcÚrÄ8) €ÙH`$=îq L÷Ù*æ±U$D ¡D©R‚«`NQÊö}KI}'í:çl€ÛCb–E\£W!yOŽèÈí¶·î06ÅÅ`@c©N—_1µÍLþ㛵0w]¤ØO@–ÒL6±hFH`kM¶Ô´}ÐCrnè5Iºs2rx^1³\š ›%8ŸÐœb­ÚÞÍK)óE²‰3Fu¬ñúxZçaìæB›1É&¦jª%1ÄçÈk¨‰ÁÀYÊ9¨vÊúä¶0æõ’ª8MªhThÄA»@`ª¨eÍláÞðytøÞWaDŸÓaÇߨk…ŽqKÂî¯3Ô™9OE€ÜuªzmQXî ÞÇ/Ï«^·ÿÉ*@©B¤#@á&—®A×\R¶Ãty*ÆüƒÝÝ= ­Ñ-(¹I Ù9þÖŽdM5ÅGÖ Tõé¼À9ç£~ùƒ__<”çJœ·0º䟦¦o­õx2C.k¼ãê[qFÆ«ka¬ÞúZœ·°öZL%%ÞcÞäíÔ0a^”¸Ÿ; â žuv4’™d¯µ¶gÉI QÓqƺwŽ£T=}Re²„Ǭ7ØbøQÂ2S…v‘²T&>9B¬ªg„B ø®üñ]K0dY©<œžåÁq~IØðïÑÃö¢&Ò4c¹æÉ. hˆãE…ó¤Úôå´ºK-ì‚Ù ¨’˜ÀÛÞ$q–Ün)úÛ´Êš×; êËàé–ÇÚ›"U÷gJùJ¿¾vA=9<}1¶ †=¸gk¶"Zħ»KªÞíKý’ÀJË;ÝV.€»Oažò!gKtR<›§³>î-”ˆGjÜهйŒ²ƒÅ>[iî™ZñŒ­”û1Ͱ*¦_ m|(øÆ2÷k‚#žŽk›S¶G>Ân½ÖÞqšâ6,¨»ú9$kû¬‰Í›$7ãדÇ|B)ð€c43LÙú}ÊSËkgÉØÝ¼ªþ»"y³ fy܉*ÅÅ·v–…I± œxÆùdÅ8êæ©¿÷HüûIP ¨qÇ(˜5-‡%ƒ+ÉôÆíÕD\±r×1a¬¯ñFÑ6nè}ÓkXèÉspm•vR2Ó~ä"ek”±CwœÄý±Ãº”c;¹6õlòX½vý”þ+S•‹ûñx |=Ø‚vy¯CðC2ÓX"[>…ÆRÚ´M3ÔÆ1l™Ë«Úb_XÒñ7?/åáo2à„ÛË‚—*.mµ^¦¾û¤K‚2%W³vˆfHÊÕªŠÕóÍ|;!·Áqøìm¤Ð¢p¨([·Ë7zoz$öNcú‡žæ<"’l{LHÈïJUg£ÅeÍ )/—½qBBTU2)ŠgÃñpPÓÂ| c;w9Q^;1“4ÙD×C±÷I %Hymè’T‚nynOÚ?¾‹”¸sÞp2JóåÍH"í„Ó‘Ø?¡Q[H¸e¢ÀYRÅœÈ9*‘Ëcoê)}E‰¿¤çäÜPÊäoUÇ~'Œ)ÇüŠ$((ÅZ[îSŠ…´RÛªÄoþ!%‹€¢óö/äm¾NàŠœ¤»bÍš’Ké0Æû MTÄ’¥…HÈedÍ?b6$LX tµ-õ®Å{‘2 ’zÆ ËÑÞ”ªí]ÛŽR¦ÿÔ¦}}Ü9—tØ(ìÅ.è€-¡óÅâ½áPeè|±G"vZábmØ Ž]8Üî­ÄA.n80 îÀB—žÅ˜#8ñy°³fƒÃ.°Ë‡ Q‘·&!Ÿ—<ÐI”¦§aCª´fˆBO0]SBi0ó$iöF WÁ°Î¹¬)ï®7-¶B[(‡qшAŸ‰ÙE' ©Nsš¡h¢aˆ†±¤a¤´:Ôõâ¹eDFdDFdä6)±½}Ò³7,C <Ú\¯çöšþ(¯gy=¿•×ó¢òzNWv®C)H€gKUª@^ÏòzNºë,^Ϻ¥l£ŒÈˆŒÈˆŒ¬‘òzæÖ<^\† yä;¥àËæXð¼xñ“ª„N"ˆü®ÈÂ*Ô˜¡x‘X…ò¦X± ‰UˆŸÈ*”¨”¯X…Ä*”t×yX…Ê[ÊɈŒÈˆŒÈȪ‡X…Ä*”<¯‡<¬õµyX7ĺñV¬ˆŠu#ëÆöå†ÅR!–Ф»ÎÃRѪÅsˈŒÈˆŒ<ÞˆXÄê;$…QO,JBý«Uùp;‘‘‘|FDÿêD(Ö~DÿÊ ¹{}Z-UEWQ’d:‹×ÇÏ7væõñDzBÚñ¼§Ä³"žïÈcyVZÛ,ž[FdDFd$Έ¼žÅ{‘;¶}={[ßTÝšC‡…è<h( ¡Xš—Á…ÚwFnoèÞRAmÇöÕ(~ûNÖ6>”†{!mV1ð µpÏdæF}ÁàI­L×w¹ãí>GÙKßÅ ? èó¸ˆÀ˜¢¤jF²d'l,ƒF®“;Æz¹3hSÍÛ•zó¶Ñ¤]cr¦´&ôÔsêsP“{ ¶3RÎ&R)ýP'·süƒt½õ:ö[V¯I:K;¨ø+¼¯Õ÷ 饾¥®#†¯&Ø Pfc†Ñ‹° C4Œ=jÉxMÎzD¢ÚÓ¢GˆAÖ#ò”å-Õ™DRz)I$¥HÊ„’rû ‡"E’塼«³¨Ôéõ Ž/#2"#2²Ì£G'à­£³7àNëÛtò°io¡y#Ë™ ÍßÈÛû«SÕy 9%o×]Úru1Ôƒ1OÏ«v¿Žß»é½«^ú +²›¹­eN…:§âõ\ô˜œKGë¡UϤoõøÒ'­.Zª¦# úäR_à¸ßÁ\²ÞZÇà4±poŸÜIQR?N²Ï[*àf•;úä€Npà”\œ£7s …gƒß¸Ì5tôú™l©wþs·ãaçÑZîš‘&Lv€wÿó—ë@¼:†6C¸ÞN%ÁYŒaëÀó¨¥lI.Ê‚ôã„îe5£«ã¹™KDvÏyÑ‚wM¹ð ±ø‡˜ \fª]±%÷ˆYóW=¸ðcHžé'”9ùÁÒ·7qź0''QW²GÈœô»—ºÅ’^qü|ø?Aí endstream endobj 4657 0 obj 5032 endobj 4661 0 obj [237 /XYZ 37.5000000 653.750000 0] endobj 4662 0 obj [237 /XYZ 37.5000000 147.500000 0] endobj 4663 0 obj [237 /XYZ 38.2500000 302 0] endobj 4664 0 obj [237 /XYZ 38.2500000 302 0] endobj 4665 0 obj [237 /XYZ 37.5000000 147.500000 0] endobj 4666 0 obj [237 /XYZ 37.5000000 653.750000 0] endobj 4667 0 obj << /Type /Annot /Subtype /Link /Rect [503.250000 778.250000 539.250000 785 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_proxy_classes >> endobj 4668 0 obj << /Type /Annot /Subtype /Link /Rect [43.5000000 771.500000 99.7500000 778.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_type_wrapper_classes >> endobj 4669 0 obj << /Type /Annot /Subtype /Link /Rect [112.500000 771.500000 147 778.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_module_class >> endobj 4670 0 obj << /Type /Annot /Subtype /Link /Rect [330 737 493.500000 743.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_pgcpp >> endobj 4660 0 obj << /Type /Page /Parent 2 0 R /Contents 4671 0 R /Resources 4673 0 R /Annots 4674 0 R /MediaBox [0 0 595 842] >> endobj 4673 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1409 1409 0 R /F8 8 0 R >> /XObject << >> >> endobj 4674 0 obj [ 4667 0 R 4668 0 R 4669 0 R 4670 0 R ] endobj 4671 0 obj << /Length 4672 0 R /Filter /FlateDecode >> stream xœí]IÏä8r½¿"Ïúk‘Ô t-mÀ.ÀãgÚƒA×Àå9øï;S[J•| RÊ,¹á©,ªD†‚±16þø/¿þ×å¿ÿqùñã¯ÿsù­ÿóã¯oÙ{UdÝÿ]nÿý0Ðõ{ÿûRÕÅå·¯oß.ßÞ~yûåú¿ßÞº~ýøo×_ÿwÑ—½þÿß.ÿñŸ×Á?÷ÿèö¾¾UªºþùGûgS©ë¯lüó6þ×·ÿ§Ëßo3ËõÀÌÿþƒ6™ÒÕ Œ•¥¿½ Ÿ©ÚÿþñÛßß~ì¶J^fºÈ/*7×ÿir}ùß¿¼ý~]`˜>{or¥ª2¯²- Uú¶RÞ\§ÐMv)ªÅ:í2³«“yoòri¤(S*ïä×USfUÃßÓ¥õ•[”¹{÷£_öJÜyÑ,†¿ÜÞøcxõÆ¿OÖWÕ•ôšëbð÷|ý‘URÃ-8Féù²Žu‡Ï=“ nu´Êd\;Ö&|mÖñÒ-¼ØÁMû¤&ß—Oöi:^\QÓ_w€ò ªœSmÜ(}Ѻpƒ¥K ˜å@1NÏÿi-0ö¢·¿ÇFÙ°Q_»_ëXš.|ßå-øQ™rÌþu>^´¤\Ùµ kª­²¨jºH‹žŒÉ¯b !=‚¨~¿´ŒØˆ²¶çëlÀ…¨é‹½•⸫´X­²Ø¸ƒ\Y<×l•O¦¶à1µ{y<Þ‹†öG44M—Wk%”8Z¬]èEQ(^Z0*Åo-~ænâ×#\jèf‰ÔÒÑtÚ)^Ú…ƒ(ØL:^ÔÌwHO–G†÷s᳎š ´R¦8LJAS|L•í,YXî*‚ !­*‹¶‚*2ʆêÅÔ:–JÛÇTJú˜Jà:)mS9ú˜Jà:‘ÃEUÓEªÑa2ùe;w¤éDU¥kÕNnEF”µ=s¡åBT |L›)jÆY¶ó¤²}Lð1U¶3¥’ð15“sðtò¦¶–_LàœÏ[MíX­TâØ±6£—Hëx©*×NJ1Ze{P*à\ªlçReûS0dÐtö/í“_3Ò¤/†šÚµ\'”ÄqâÞ‚¹ðq¡¦²½JRÄ3ãžÆf'Ûß` ÜAn,öj6 £,©sp.ïïØ¿û M³åÇÕZ)$Žk:©Š—ŒÅ†JqX‹Ÿù€[ÍÇë.5t« êèh2í /·…]½ ØN:>ÔX;¤' G@†÷3᳎š ´sð“‚Ýô™5Å2ûh{nÍ}zùÉUVgñ²‚ZÈű2¤áÙ7W)c:i]GÀÿ8}ŒÍ5e¼Íí ÇJ¿¹žÙ%77W&^:ß}öèÏˈR¡…Ô4¶_à¾pd¸qÿu:¾Žš ´B<ÖÌJ:¦ãCÂøëù´ªÂ9Õv‰¤µ,m,`–“X÷|¦øHÓÆ±h+¨"£lب^L­ciºð}—…¸o†ŸÙ¸žSô0PÚ¹¦OZ»ájÑÓ‚1ù5K¤$¤G¥kÕNnEF”µ=s¡åBÔtáÅÞJqœÎmV³òì;ȹÅsíÀVùd S¸—Çã½h0‚Ñî%šÌ<Ÿä¾¬.ÔägÿþÚIâ,8XÓ€N:ß¶ù{nºîE÷'Æú§ªF³* !Y¬·€¬„ËTðIަ÷Ñ‡× ø.’gG1°øSª}¢Ì»Ñµº>º?1ðH`á§3h~¶)N¢><üO=ë}jŸ’ڄCÓ}¶Ÿˆw>ôÂÀô/=ðÄCçÌ~FxÓ5Á ²fxcÁ®X¶ÀI<ä†E%æšnÏ_® *’n©µ¥\<øÏY»ØL,˜ô! Äd÷ìq©¯ðw1¤gË3ŒPFÒQ*ꉌõ €¥÷å*{/+5“ʱuÿ!––!bCd=‘ID[ËaÂÊÒ‘eá™ ?YÈuYSØ%¬Ë<Z&‰µþ#Ö­Á›‡MÉ'ÐŒv'4ã¡ î€YNð#\ØÃ˜ˆÓâþ‡Þ¨gÂVžM–Zx„Ôc’N=.é”.+KÔáC9µ?Ù‚FάX{wÔ4þÕÿ-oX¬Z_ߥM¡Î§#¼ýšÜÝ×Â0ßÜÜìGkƒ÷±®WÙvA$¢d$VvÄ=¬Ž½X ÔkVÃ:5æ]‡ôºi±šÜH1’41•½ÅÏÃÂs$]?¦Él¬%gàfÁ2ÌiZÒ;`G¤ua}µÇ& lì}¢¼Îû¨¯u‚¾¡qFÐF-Ä@j‚¾0ßÚ^!….°Ï[ûÌlà˜ñäiŠÜB¶mNÏÁ2ƒGá~OïG²@ÕîqôÂ6–ÌŒ/Â`'wÄtÎÆ „t:Ûh3ˆ¸N߸|»X{aÏfKg… 9r‡ŠÑˆ„àéâ!+F­(¸ë½¯¿xÏ3ÿtÌ7;Aé÷ÇB ¶Ÿcù³SGÙ=ôx㉳'¥÷ðiñqDn8ŒJ…5ðA£xwÅîa~>(Q3ÊXªi÷À'j¥W®‰SZ@Ñ€D€ËcâíÞ â¢öˆ‡=l¤0Šœ 61;(©&Üí›xñ©£(žü¹í<Çœ OŸÈ©q5å%¢VS™*,µ¶[Z³p€‰·=._<¸`ìgüéϤ=ÎÆÞÄÎB9>C¢G²¤æõ¸Ï¡Ÿ$›(×(bé–8ȧJv’M?‹r¶‹©·Êˆ†‹ew‘2æ’¹™ó…­¿ª|d´ÕÒ1„Å©ïRä\YÆ×ǸpØ ³`@ñ K/f÷E­%J*`k [ÏD0Ÿrô‹Ö”0%‰ 5_™×–æcJµB¤64÷7QIù 0!fYŠ•©C<û©\¼N܈˫Ú0q ¼—%¿(•\²eÝ Ãÿóô¦JL8 )¿YæyˆËQDðY¯±ÌõÇu„®Æoø¹JN+g!,?BRœžéìåa1Q?Òþ§¥H¢ Sš#‰93ÕY)^2P;ÃÔ埑ÄH‘D*3²Ã•lfýâ3à Uç «‚Õs~¦rƒï¯zV4”NQá³§\vkëDT–µÑ”¥hÖ[H*¥¨•Ä„‹…CÙ©d.³>\ˆð!¾LF40gåE`d“åEZ*zR |ÿâ©ý•Õq+¯b:X‡Zá»Êó$ÿ2i´‚,JYo\I=ɪθiÙÒgØ#jy“%"ˆ&›z”¨ãQÖ| È9 ›{ˆí>@3Å£L`EÅQ9DU'>JðœQ°éa;VûhÄT*¥±µ fݵH‡œ*Ïp—âµ÷¨4ï-4Ù’ˆ\O>Â'?¡'º@OTüÂÏÜÞ d¾ð€ƒ‘løWVȪý¨ÜpY¹ŸªÒ‡ñÔŠÕ3Ù ‘ºWÙ2SuL1N`r=‘ÀÎpE%Ž¥0ª4r ÏnþäDý…{t0çÌ©OU‡ðÝEÝÖÞ]ïxë­TWCÃKëéÈ./o08MÕøN±üö4†¥KZ>× )1Ycõì!xöÜAøÀX²ážTÝ~ ¼€8ÓM¸gy@ÞhK§PáÊ€»jR¥É»2€ØX$7'2áÛ¢âòZ"׌¬^§n =2.ÆÔõ'2ÈgNY‰ÒG“e~¿I}Ì+³jûµ»1–ìÎ.ÂQÆô½¤bõ­8SåˆP‘r‰0R2±Q3sZ-/ýîÜ{é|^Å\—ÊçEå"1ù>©Ž0§êôA¥—±}P‰¼F¥„T©?s g*ö¿SГÕ/V[z‡qOQí¢˜DumÕþw’ÁÙÊØ²éJ‡…µ%±ƒc·ÓÉÆ·¨,r‘.9¡Á ç |†•ZE¥Hw¤üsaTut_è|n£1hö²n…žhøR½ p=ÉÑcà“Sè® ]×—jô$‡å_©`ÃH!˜vMñO¦b{éYTÍê w5W$Æ‚ôÙPÝ'ßMP×–IZÄ yŽÂûÛÄ¥P-vø”Tbì£{'ýCü#Kú.xgMLí¥·{ sw‡ºpÁ 1Þ3lú@Ø4®N*óüÔIÑäOµ4Ÿcxx"ûJõ½“ˆë` ¿'1bžHú;Š'g*±¿™q<*u6_Ò4\«ú ã%øÎz)ôNß<‹ÐàèóZ<éÉ#l˜%ÑÛwŽuz5åRm‚¾EPù®ÛrŸ%+ª|xôÈlŸ!lø{°â‡°õ¬„Q ™¼ƒÀ•*€sUà:½¼ÇÆO°ù…Ï bW CÐKŒžËåÎÃ]ô¤@ÇT¹ŠÃø¸²\hžØ9Ïgîî™»ûz¹»8›‡(o¤nëeºM%‘é\f1þ(…1µLUZj†)_bŠÌ©¦Q‰¿ÂÙI‘ƒ5‰ÚkÈ´ó'œÎ¿žÄ%yÌ-ITíúQRB… wãèý+¤#ç Ø “mP+—…ŽŒy禪²ñú{â—­FŸcž“3û«ûÃëX½*k†Xï{b´Þ;ýK§‰!ü‚º ‘gÔ‡ë—BÚ[¦ !í÷ÂKÕ7–êïý8ùʺädï6 X+ø^¸Tº0j›²8èÔ²§–M¡e«§>¥Ræ¢Ù¸kÌå\n;KaŒôÕ'k9Øî@W…?ónƺŸ’Šaî}èÆªp¡:¨ž ,›N?ÂiáœN°…SgÃ’¯aáP:*™ àŽíUzNïvwæYIDIɱ ±Cª«.ÓÙéÐæFô:ª'lCF5í~)AŠ<$mñÿ©ÞOõžB½›¡•ÊsªwBnQ7„ãƒÀZ‰h «a ¿˜ÕÀä7ä±zRx1Ú0K$ìɦåQë0·j0™¢7üZÄ7ú ]î‚`))™ž Šö‹F"z·Ðsl` B„^G %žî°Ó^Nl/¶Vž¯ïà ý2÷ð· '8”CÅý‹FRÉ æ²…ð['S°YiuÝp‰ÑêøÐý–Ih#êS(› Q¾<­ï=lÕPÔ“Lmóÿi@žä }C‹&û¬ ÚæTñÈT÷ÒPÕ†QÑ$ìdM˜DtÆ1zZV§":²"JyÏ_¡rK5Q5¢ÕÓž]]Ñ¢…ºwiƒI‚‘ ˜ûìk’©¬ÌÇïpJyÛGSêaUØHÒs£Æ‹Ý›aó´'…·Šà¦=ºžèp¨=·V`Ø0£ðF vàlê\¬ÿÝô_«“þl`Œk…y¿÷z¸é{ãÚïšR5ŠÆõÜÕ„é ê¦%¶‡ ^8¥òõ{°Ü!Öa¨ê©%R ;BÝÖ]åÍóÉùä|r>Y—·²çPâÊ Ê*ÁºMôT{Ú>ؘ]`N6žüRŒ7ç ÊG×Ú8ª99ðOÅi•G¡XSâS)ñÄ£Ó3øÓ?–Ëp‡=To^fNóŒÏ Óãi`vñÃ`rº‘=e6—jHo”'•ÑÂ<Ï¥‘E5ì£Ødþ%¥Ôn‹’ mÚþ†S¥¯«ôˆD¥º|ÎÉŽ¼\¢šDÿ ³<9 Lõ““%q1Œ'Y›¹\y÷nѺÃ[I¤HQ÷þ&J \å–¨C-W"W¼>^\DݽƒiïójÇßð ñ] o%ã TÕ65S—†'ºrͳÉp[<ÕÌLn®H¾(‘ŠÑµ\"SM/!˜ÃŸ ~^„b¢ôy³µ±ÏxLí„ì=gz;UÖ~ˆáŽ¥>¾ð§?çÙ(]Dvµ§Ô8 Ó’•*ËA`à³ÿÝ߆}&žÙw¦!ÂΧ?‡ Ñhè„ÅÔ›2p§êbuï=n\&¬/êf÷„ÕY¾¿Ôž`,BÙ§q`èXÔ&1©'0À‡ñËp“šã «`‰K¤q`™z“ÞÊèq‚þ±¶Î‰`ª'ÑšH—MëÂ߃í“0`¯s½…7›]á;»‚Ð{žÙ°=†¿Ò‹fÊÒ=áeÑBYÉ…ñfpÆ–vø QbÈP§‰”¶C©Ö¿nÿ'Oi;P)@ø ¶Q˜ó¼h¬G£bN'l éàÈéIHxÄVì­K< lo%ìA&¹ÎC‰˜˜==™0Éœ–°³<'¼£K]Ô’¯¤w¿ì9{b¹½—ø,Qœúš&1%É¥®Qõ³@jÆ[ì O•|kšÁ¹€¯•€n F\±Ádìà\f20)<ø"sS¸ñVŠdlÝõ›5¶<ú'1;KcAåv”È(- ë#VÃwa‚wGh2›\¨Ä›ôý󌱅7•UC¤DQéaLBÌãIÕ'8=ÜÍš_ÍÐ?È~bn“¾ûŠXÇÓä¯ìgË$oæ¤Y™Þ󲚳ÅëSµxÝx“Að5»6­¯Ç.KÛc'õñ2!õL¤Ýecc0WfPõYÞ¨ RV+`˜#1Æ_o»ä)‘Ÿë‘šwsÊÖúí$oTB‡OžŸ‰»“wÎÄݳ­×û÷¡ÅÉËžöîûߥÕ;‹lÈ,éã§q*Ÿª°Ã\&ËÀÆÜ-óêw±œ‡Tlç!õNvŽñP,Á0%~Ÿ3ˆSs t‚n •²4Ñ’( Ç7CÈT‹F:2·Îà _pæâÜÏ|†§CÄîªé|’Á«Ó“ƒšY2#uŸwÜ‹ÿ˜øÊÂßD]ÌŨ&^ Çl“7kêlÿ(ÃrŤG¤Q’’¥ÒEÚ£ì} ’úLŒäåBûz¯Ã y¦¹¦D«A‘Ižª'àªúNà¢Óã¾ ^_îʆò…'X¥d°1 D‘"ˆ2NÇ=ñ?iƒ¿€Mí¡Hõ˜"$„/ÛÎÕCø˜Á¿àÖCn=ÎäâÝõåvå…#S¸ìxi-©²÷ÎÞ˜ ¹DOú/*Þ5HÌ zCÐ]ïä#7f¶½"u<é|AëÜ#gö;½s<éûE½ƒ!è…°*ò¹?ù€¾T}†8øß)!ÞzÖuᮃ±£ð.ˆUf­YjM½ ‰¸ÁTOm!ø=‡åS2oò¸FiöéZ' ù‹É-Û=tByÓ1=Ä­gð4°íö‚žj`]tøÌ„gã«Óž3“"j˜ÕX:J6ÎA¹]˜ cšŒ…C—"1^Ÿ³ä):¾ŸÈ®Öý sŠÀÒ‹X’){O—…˜t%À´]O¿!¢{Óùvÿä\¦kÍ‘»f£Ç]Y=€_ŒÅ§¤å'í=¡fÒý™ 0ñÎár¢?®}€<_J´N`z¤z:aé€ûü¼fY§îxôœ²¼€ô‚»2â z©®™æ@OwN¢¶§³îUƒ{c=ï=Ì,Q q­ö¡¿'aç·*{–Þh•N~ýpUG½~8z®ð‹ùÐ";7(O‚hê^ÜÒ¯#¦úÏÅEO=~u¦ÇôxZ·ðö$Êf¡?æVì'jGÔe…6–2“ \-*JJ;¨;ÎÄ"J‹‡.ÅëÜSlO±;2[ˆHQíÂT‹P¡ÙR÷Ti§"º÷¸±XÙ€ŒÕÆ“wÔzµÜR7TŠ c‹'º‘—Ê£±½¤R_,Q¦ö"Ô¦âÉØ=8{"nC¯ˆ×=ƒP?aÆw¤Õ÷®P¸²6@'ÐjŒÃmD„©¾ñøch®pd×#ÞE"…,YkªýŒ§-‘Ì–Ø«L1eX]Œwz?eœ{ÿÈ4n=ê€ÉÁ€{"킑σ¤É†ôd‘=Ù¦ÌÌMIA$ª =ÀΕ¯ž3¢ ô2mŽž³¨üÕìɽCÙžbyæ®5¦~êÅ1v3ˆ$½wc²tâÙÕ׫Îή¾Ï™ß#$cl3Ñ 5Ê!Ûé œxú1%ÅLCÉÎÕF±²Úš z$Êž}3›JB«Å kÇíÑÄ¢°’‰U‹í·Ç¥”ÒöéžwvÄtò«|ar‰P“¾%˜cša'» Yfg>ÑMi‘ß'gL>1ºpóIÜEkÑ Dô- xWõˆ9xI•.;ëbéÍȼm k <µÇ¸²WäÆgú*·¿àÔ§nLÄ?£ð×ÇV¦¨Ý\sÍRÛâý5ãË%wœ~ÕÓ¯©Á¯S2è^eWÖ’põ2 —‚xÞù ¾ÓÀw†d†EþÀxËì²}ÛÏáë"Ælà÷xÈ B04Îßµ²¤Êô¥ê3ÄÁ'øN ! ðÖsö‚†U‡á]À\,©²_YXü7ÞR»Än‡rØÄG¾zlõ±ÜEH«8Œ~ ÕW#d`„³|5ô"Ç8*ÆEÜ=J¥(%: z¸†¹» Ó9¾S"Uq<#DîA!Â;Ì5™L^"s9%•±h£‹jÊzü#\ÔêÿÊÒ…mGd %( À[$Z!ú\]S΃ÿyðÄâÚ¿ÐýEôÎþÝ'B.åÆ,H˜¡Ì†'“D­¨4ÚV‰Š…‹‚eovIÕ6E¦N/Ç·û*çNd1wj.3(Ó*œ.¤{xmœbTŽh0e¹aFe®»”h ÁTiQ…Ì•‹¨XM-rææEGyå€î¯ÜsÜý–Ö—ÓƒÙ_ݛծ=QG0¡³Áã]WÐ&® =É¢‹¹íM>ÿ€Cz°™sÈȈˆÓ‘–G¤êσ#g‚ïíÙOU{µîFñ¥“RÍ3 ?‘OGØ´óp.6™3et*äñŒp·ÔÔòñEwóP}óöÖ»U FQ¾1Å}^ÛŒzªõVëù3:Bü>X:%;tÜ‘š¼/» ¢¤½R<Ð3Sdc‹ÞAL4”9M ùæNÇ>JéÊsjž¨Ù)%µž]§UOqºhïʘÄÌšî<8úš_LU2YraZ-Š6Ö éJ˜èzpY§%#"RݘuAÿ¼Yg– ˆÝÐhÿ^NµL;¤c¿¨­Ì$ÿ ;ND‹ ¾;óó…£åQ×ëÍP'slÂïĨ¾n±{ýïòíŠF/–YûlCí,c¿R{¦n¡ö‹0nßWïUŽoí2ô2s è;r ú«kõ{êŸìª‚<ú ­cÖ”§ ¶Ÿû/]æàºË^IØŒŽJ¹üÀž ]ÓãÂß}†Â³Áwz²UAŸ>![–àn¿³ñ>¾$Ö%Ú‹pÀdƒI ðÝ/8.þu.Æ·ÆE¹x÷ð:ð{ÔšÁ%EY~zý㢬Úbg®aŸËn F>†šax‚0(QßñÄAï?È©÷<òO={»Çþ<Ó/(s1°öî&©Xeæ½×¨ŠG(œô¤ÁŪÙðËå—·ÿ úªç endstream endobj 4672 0 obj 8103 endobj 4676 0 obj [238 /XYZ 37.5000000 228.500000 0] endobj 4677 0 obj [238 /XYZ 37.5000000 228.500000 0] endobj 4678 0 obj [238 /XYZ 38.2500000 662.750000 0] endobj 4679 0 obj [238 /XYZ 38.2500000 662.750000 0] endobj 4680 0 obj << /Type /Annot /Subtype /Link /Rect [55.5000000 670.250000 151.500000 677 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_imclass_pragmas >> endobj 4681 0 obj << /Type /Annot /Subtype /Link /Rect [373.500000 641 407.250000 647.750000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://java.sun.com/docs/books/jni/html/stubs.html) >> >> endobj 4675 0 obj << /Type /Page /Parent 2 0 R /Contents 4682 0 R /Resources 4684 0 R /Annots 4685 0 R /MediaBox [0 0 595 842] >> endobj 4684 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1409 1409 0 R /F8 8 0 R >> /XObject << >> >> endobj 4685 0 obj [ 4680 0 R 4681 0 R ] endobj 4682 0 obj << /Length 4683 0 R /Filter /FlateDecode >> stream xœí]K㸾÷¯ð9Àzć^@`žr0˜rXäìf,¦™ì!?²%¹mJ%}*R´[id»Ç²ÈbU±ê«b‘|óç/ÿ8üë÷Û÷_þsø©ûýþËSv,ó¬ýßáôóÃõº:vÊ*?üôüôýðýéóÓçæ¿ßŸÚ¾¼ÿkó×ÿúð—æÿ¿~ü{óáÏÝ—N_x~*UÙüþvþ]—ªù+»ü>}þï§¿ýáð۩ž»Ž˜Ûÿ ÊêêDÆD×ߟúaªóÏï?ýöô¦eÀ²^l¡U]”5ö j«ÿýçÓ/M}ó§W›/deeáß×ë¦ýÒ\˜úÜ}ÐðÀêòå¯î 7ßýæ¾|âÛ/W”¨Rç¶nº…ßRriÈØ[‚L~KÅàßö†¨±v\ÚÖséLêìêó€,ëEô|þkŠK·ý¾ˆw•ÐÔ¥I­O|¹þ÷Uoj䃞®æÅoNC+¥¥ÆÜcÌxßøóMºýˆA7}÷}5¿Åùá0ÿùüÁRŽœ©ˆq kT¦®¾ý÷¦æàó¢§JÝP¹ŽWò\5jŒÓëÈg2ôÅÃG2ú¥Wq.Œ³üùúói¦œ©@»¥®¶J•…-³5αÔ'ïh—®tÝ´”ãùG¨ùÛ¢ ×ø™rq®(S(ë’Â-zîW¦À¢" pmxL¸gÊÅ¹Ò ·.(\“¶eP`ÿ¥õ²-òp·¥\š)hqã’’­tݱ§ Á —æ4^×?S.Ε^¶¸uAáÚ,Wƒt€y{Õ|€ÆU™‡küL¹8W:á[ÿ¼¤LJû Hd|÷¼øîëÓ›O‡¯¿4”;l}m€c~ø¡q$:/_>ü1Ë”úÓáë¯ÍhŽFWÍ(Îß;?ÉŠó“êXÕYÑ!äìy‡Ð'¤µkÖé²’-غšIzÒI(?j¡eÄ;ê|§FÓq{ä‰y»üLÖŒS›ÛyÙêby4y¿CïHAï-¢­› c#-   ó>É L•X6h*V*«² b¥ù˜ÖcÞÍþª¬™òT‚¾uù|4¿y 炲Ƚ†8hG•·»ZæÁm 7æ,–Æ,óÑ:…a!s¬Ã` VëH1†°ºÁ‘¦ÏLšî¥OÂïí:êÖ!mob‰ð‰²ga¼Æy&ÛËîìÁ›1>,g—6Â<(<ÙJ(óÍ o[´Ñ®Á^€Y`lý@?^0»’&Ò&«µv?cLdSW©LáéÔð‰{gæÕ]jX58çú“-rÃg™&=ÚÎ_"QÉœ1@í1$Ã)Ï“0âÆìcâYÑ.ðäD¸³$£ÍÈ®úyæN0cà:åG#¤á.GxˆÁÚ Ÿ wíN-èʱÒó‡¸o?žYVS\¶ãb+\åÙjK>q©“§–-yŠ­0Ä6(¦¤Êä°5\*‹Ë½’(8..[|© LI-”°a¶B2%’ĶF¦’)èc¶SÛ0ði¬;²v°H1cµò²e&Ú†÷Ýor³‰À\û ŒŒD ûêf“¬ßŒ¥ÿ÷—•Y¡/r#§)­´ÚqùË&oÀ³Bä5eóíÛ£|f>æN´œÔøX«ž˜%UHûVvšaoý¡—žÃTp?Ìqà.£/ŒïgPçX"šÆOýω&ÍQÂh¯¨´=GF<¦‰«|ÍÚkTtøR£±£C.k‹ç sD4sÔÓ³"ÏTŠà\&¶V%Žejµf „zÂd˜œ41›9Æ´ÒµY“ui¥ërM¶á>ëÅ0þðä,™£¾06"|˜Ç®ŠÚÈ;õTf­ñ:µŽìu˜k1<ñëƒEž¸[b&¯NDœ9\=ÂOR^÷Hy1q»a2µfeàõ¬­¥¬c²+u̱äÄC²×äUk|04öµx&Œ(ÎEƪôÛÜv çpSȘ̮Éî&žk0Yû£GÓRáê—ÆÔùjÍ:ALýUzMVï>seÛgv¬‡çVŽc*ìëd/õaxM`dϵ#'W*»þrÇÈ™# ×-áZb,æz[¦Fìõ abg‹§¼‚y€m4³ë&a«g©âNêŠÎÂÔ§Œ³ba ÙÊYM¥Ž1´„$¬jtGFÙ½"#Ùêù¥€Œ’ÀÚÜIuªÑe˜êÔcxç=¶„gØ>cCí4Àãa¢›H;‡<ë·ÌºRê°Ž]m»c@ßÌØ1 —éŠfow¤—tìÑü”goÙƒí Žåw)­ŠE[Äƨ;Ù¹aLþúvnĪnJŸš2z]~,ï†-áŽ5}ÕŠÌjgÂõ…²žŠñÉ÷»Ògê5ëg1}˜Õµx¯þÛŒ­úê:‰KÔ6¿Å_lA]{D\7µàÎ0ð"˜¡v>C‰Ëƨ›Vð]ÄÝÌU§Ô 5¸â5áÛåEïìô¨ sIí‚9éÂö ×{.R |‰žÕóoºe.½²6‚´Ué8¥­eyÙkiÚN>âÖ¸ŽSËL`z÷T'sá0±Ç%2NLÂS—]nï¡lÆÐ†Á“D¢¤¾9ó£y­#x£¶<* èê ô¢ß_ ·1·ŠÜ®è!–¹²\6b ã˜`O÷ô¦Ç¥XWžz´ê,Ž˜{!‡IÔKãw¨;ÄÅ.ˆœH˜åÙÅŽº×»z&VÈ~Ü%æù~3»¤XˆàTÚ¼çrj"Ÿ²$<'î‰*†íÁ ‡cœžÔƒ+¡÷˜èÎb¢Í“Д³Å#¦mÁB†q¯6íWG¢MOÎië˜2gÜCèC(Ú¸$šq£Â3"kï‰ ˆÕ<Ïx>$ÖÂcbEVˆ1/ÜìƒÇÔbƒÊø`š £ì¤«c¹QØÏ€Kž|ÓñÀ‚ÃF<šÀY \## §n®Ñs‘áÃE¥ã-7Oo¿Â€•ðÒÔtÇN%åµU ÒD»ÁW™uRF©LèÙÝ#am&É íÇÜYHæA#nP [jüQØrsˆçÁ£L.Î&k N m+gV0¦k€0L@ì±ugpË|¾0ëy "ļ`0“;eò^„¶0=#»Â· ªõ˜Èf9“dÍrFÑ7FîX‡$%¨„ò‚I)G‹ñàLc2Y’Âè«ÊÌ8¾Šb*‘ÐgfªlèÎÔI.)‰4 b¤Â=EÊ•ÉÝ`óŒXu6uíΛÇO7D*ô_Œ…dWÙ îˆlfZP…M™O‚Œ£‚W¬Í^šÁ<ß<Ì,D3ˆ™ªC \“É0e:SÌd)˜8“Ø$)[Ÿ(“+wÒð'®EÈ^ÚØW´äwr…50d³Î¸WlÛk|]ùȦ/˜%5l-7•6äaYº<‰` ëlÑ!‰lŪ{»¡#¼,)^!RÅLšJÍ{p*Ï`ÕE"ÿ­”cóåm@ Û¡0C'QË̯h¡éö o~eé‚Zº-}W¡+ÇwEšZVlóÌô7yÝŸ4½ýY½ÂwºÊž9•ð©o1Oo*T1)GÏù—›ß–¦?«™‘ëcÖes ŸI*;Eõ%V*ßâù(zÒíÃÙ¤³©‚0íTª/‡¥~€P*ÕΤçÇpÓ'â·ðb-ƒÂ SÐ*²²G­ŒÚ«Ä wÑÁXô¯\qôÝrª1¨˜AÚp`ß¡¸ßñЦB£Ö.©X^üˆjÙ®²cQª› ÁƒQE ö¶)&O2$fjHÂAe˜pü‰û‘X‘aŠN=êÇ,•3YxQ;¦`ûCÚ „za›Â{cÐT·ÀF¹&øìJµ¥vG=?™C´ùnÑÍ6`F6Scý0§ŽÆÚvϬÄH¸aªî„Ùø+²³”É jõ™…²Êà@…ÏÜÙþx)b>Q#eŠõ¶ßµ¾¡_«õÀ¯í§4ˆõõžÒ,»µ”""Gø%ºÍÍW饬qCœ©³ž™»4‚U®}¡Š&6¯ }МÎòz¢Êb”«ïsÁX~là‚‰r¾Y"0SBý™ÙܹÃme8Bœ°ãq¢aOEIúÔëôE2[vÏãŽû1¸§Äqxˆà‚fm+Çqûu·Î& {ÆÖöÐWöæJüƒ¸#ð6!ÑC"^O¸!»Òp'°Œ$«]SÉ›ði¼*«×€:Ʋ2(E4=ß’¶"”È守dWƒaÁeO¬«âGvJŠš‹UËs²çŒ2ûBDOõK`ç ,€bÀ]Ê®mÏt„Z^Ùk„æ€Ö)ûôÚÂqµûU-cF*âinU¡oçúØ>¼iŸœ„À'E:ÈÓØÁ38_©[L²hŸ‘Á‡`iA {d/v1Å4GêlZBIŸ`ñÔ·ZÕÉðÊÓÖRl9ð®;HuòÒ2ÕH+ǧ݉ÊÑÀ—ÉË1/ï@Ž™³Ë±“cÙŸIj°Î‹ÑãÏ ÚÌ\€¾>˜ÈæJǧ6«l䩳5ì{²bZ/ãñ$Ã#…O( d¥}m§¨ŸY©ç0míT&p».c¨½ýÏwTÜ›µ#ô`·v¾ñìÖnÒÚé>ñ¸½µÃÌ£Y» !ÛÃX;ÌÝÚùÆËÚyæž x> endobj 4690 0 obj << /Type /Annot /Subtype /Link /Rect [304.500000 267.500000 457.500000 274.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_memory_management_objects >> endobj 4691 0 obj << /Type /Annot /Subtype /Link /Rect [43.5000000 260 544.500000 274.250000 ] /Border [0 0 0] /Dest /F#ed#3atl#f3#1f#12#af#26#ac#be#01#c4#1au#99#99#d4#81 >> endobj 4686 0 obj << /Type /Page /Parent 2 0 R /Contents 4692 0 R /Resources 4694 0 R /Annots 4695 0 R /MediaBox [0 0 595 842] >> endobj 4694 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 4695 0 obj [ 4689 0 R 4690 0 R 4691 0 R ] endobj 4692 0 obj << /Length 4693 0 R /Filter /FlateDecode >> stream xœí]K¯ã¶ÞûWx] ‘Ô( $73º(0˜ºº(&M‹ :Í¢¿²%ù^Sþ(ñóá‘l+“öN¬kŠôßWu±ÿòëîëþëîãîcûÿ_wÝ>½üµýÛÿövÿ—ö?ïø{ûáý/á×]eªöç/§ŸMeÚ¿eçŸÇÏÿ½ûÛö¿W^×oæò¿¿±ÎfesÜÆÄ«¿î†cšÓŸß¿ü¶{× î-y™WïMîò½ir»ÿï?w?µ/–ÏMnLUæUvË‹*{|SV´Kئ]É£þ-Ÿ`qSé?í\*Æ•&¼º$r]–õ*ÆTt;ˆ^—O°xž’rN;‡Ê€\¼º$r‹Ìõr.ˆ^—O°xérîiçâP‹W—Dníª”È}]>ÁâMûÉ?í<rñê‚È-2Û‹¶&Ê}]=ø cÒ1n·si ô¨Å‹KbÖ”_UI _¦cÛÂ%” ÝÎÅ¡2à¯.‰\×ôæNU¦“Θ*ÚÎi]a  ¨…‹Kb¶te›5 t^>ôëÁ«A¸eßBXã'poïà{øñç1jüƒyŸïº;éûÏ­0½M"!˜g'!h³ÊGbÕêëã~^ÕK}¨›ìòIOüîÐÚuUŒVû!?䮋¼RO—·è Þ’ßéqWÏÙ} ·Ô¡¹88[›Ë'ð€¶FOdßc\ ¿à‚ßÉáy ðç™O)·x³=/_û|O`³˜"1’ 'ÍœH¼È|˜‹°xÄNDŒn: jøøÄ8šnã2¸¡1MA¶eø* ^’뮦ö”—–ˆQZ€j"¸oôçB 1Úsßqt5âXÙå# 4Ú &‚{d4¯„~5ßǃ:‡Æ¡0añü­ ü«„@Å|Œ·”»x@b¬DÃø;:ê"D & -“,À•øÊ߃¹RÄ‚M®5›Úךwza 4^à<¢·ÀÞàðý7·ñBID³.o:È\;C·Sò’ÙÁ²øÎ‚·Ä¨$†Ó0*e5%‡Ì¿ønhƈW³t&]˜u©‹a?aì'¾H3q‘€É½¸Û›Rê#Á”‰!‹ž„ƒo©Èµ”{iɧåI‘µ‚w>OÑÑ®¿ÎqÆôaDHxžÍŽÝeŒàÁÄÇ`€¢¤Ùc.¢óu£ŒƒŸð‰QÈf,Xl¬1Zj&Jgaâ%\ãö;h~0&KDú!æ&…YBUت;O&¹©Ç¹ˆ£Kô=NÆŸMy嘼 ï8f‹åéAÒ›g1`©ˆå s½I¶Zþ–+kç,—:ÅÄ÷çQÎz|bÂ~S¾Ÿ¤tfÎùêëy]£Ë†±#Ò¶ê” ‘H‘lnÙüLF*C$,˜8X¦vª °‡ÿpî Ζñîj:h¾? Ãát1“kµÓÅÖã pñ..!J.pi.2ê  ¨÷8X¦á`ÙI_J¤ƒ­séÙš±e3¸.~#J&ñ¨ƒ“ÊLÓïâ”mq™Æ=Qšd1†ñy49¨ñÔVÔ%˜ë §xX,¾4 ‘ã/ðô \ò†‹/±À%–SÅp×¾ƒKø`ê øR욥.Âeô0E‰Jø‘- @”(^îí‰bkE«i➒׃ë°s…pÈ<ør•9Lµã;¥t„;$à]OÆXÚÛ½æ]·pC¦æò7µÆŒuÄh8%ˆ®¹Ù‡VÜP·O `˜Þ Áïa¨÷ªÒ‘5EqiËê¼µÊo¡_¥[ÓiͲOn›„{@ Gh{Ì%7Âï¼PVQr5îºÄz‚hõ<~£­XÖ¬YrhSTµo—Š (͹±"nò¶8½lO `ì[Ü>1°–(¢ö–Œä œ‡IâZ4¦¾v²Ö<åø×øg#®ÆZIˆ›šZRMId«¥‚bàGd§2î:| Ññm”_šp%Æ€‹ÁöÖ2w9Y™¢`}!¹Üÿj¨6zqK¼Æ¿ÊˆÍÅJ«E•NQ]ÄÀÏùÍOµ¤ Õ”¡­¼Åù,!<©9¢("“…Ù=RI˜²sòx½§à÷,7å–X¹©Ýæ´›/œ ;?ã”›D•µlsL€/B8¯9UŠ¥q]>‘FÏÌŽ¤ê›D ²ïAÇg§ô±õ…:›º[ð.§fˆÈ jÚï †{¹Ù±Ô–˜L "‘H8)›áE­TF¾ŠfÉxz„þ‰(ŒXüj8/7û­ž4z²ûd–‚51 žyîiXuQwW–¢wÁï0bÆ9ö×–æÚZP›Â¼ýä—ݧ€Y”Æž:íáÝz©ZÍ9y÷œ’u‰1Í>˜÷¤ ââ—Dz× …æ ÊpF@aúÝe4”ÉgŒqg¤¨Z‹*¬¤LNæZAP¾pLÿÙ*nˆ¦ôVãk:"ƒ&ÐbP¤€@´ÉfD?:YñHɸYì¹ÍmüE2BÅRÕT[ËNëB¦e§h;šÔ-;•"ËenHäÈÄqØò…; Åt-d|-¹ùôµ}úêd W˜E¸}¨Îä²­ž´œ¬k¾-=‰Í—ÞãV›ó\æGocŸ¸–]2½&¥n­¬‡xêjµæ7›r¿ä”GeӤ⌠äß.Õ‡%â*ÇDÿÆj™ÈÈ.mf™ùÖ‚ƒõ–²“¿i3„n߆üJf.eØ7ÂXò!À˜\ZÆÉ û}R±Çù©³Tî¶eß+pp?æ·®f<.¥Æå×x$21ÕÀPL9ãBs<ºœx‚G*÷½öup_7w€{‡ÇÃL ï¸A´/ð=pPð$©`¸ÉêKñ5PóV€* ä8É!b«I 1Žt…ù‡€âòÒÓByÀ=ä­€qH@¯& ùÌô†õQ€FˆB¸Æã÷0^ô’ Å ¶ÁÁNÌû;CBæåå[“Z)aotûZ3 [´,ã§ñôÞ§Ÿ”‰1'ž@á_y\Ø44”ÍÓmèQp <•<½{œ™6$1[6‘…ê"š$½VGìDîè-¹ÂÈ‚¢7«ÈŠ\ùÎ#ìŽÆw+|³y0Ï öšm·Hé{åÁTŸhñOÀ‹=7˜B0½Aêuø Ü[€Fá Ó[àVLÜ˹síZgh–ÊMÓØÔ6V™· CÙ8\Lx©ðwn¤é½&?½Â·$&׎)ä»ò0ÎÝy'jL~°fö®‰š¬æ—>_‚æ½Äfg?[šÌ3ÜX°u‹íªí.£¢g𦫧q²xÄ–“÷Eu¸¿O©¸Š ˜ÂVçÊ-¦ƒHSLK›-fË€QÔ÷[Ì–3Az0…3ùå[—ô¹²¹|åµ÷”™²øHlãÁõ®Ý—I CkRk~BtY¥æ03…†Lc+f|ÚÈsvËâ82­Ý$jU…ë4qm"%&M‡¯oM©šŠ‘dˆh=Í虥² ×Ü’I"·ŠZKšTT9ßùVàüþcø‰pçñˆQ ºé§K‘õb#5-&b³C3–-­®­õ…ë–»2Tʘ»)ßéF¸^Êf² „eÞT-¸Êå?·n’L·ÒlÕ¡‡-…tK!eá¶¥†Î£•BXàP¦Å`sþ:[zÑÒ ‡s®?rã1e­¹ç…¦Ë¿ˆ‡xä“dî†"óUDçÁYœb‹HLË®oÄ0À{dõýN"íѨÎî¸ZûíüÆŽË.a„HƒúÀ1¢ G“µž6“G,Ü’z>'1£„‘ÆåN€ë”&ƬpDr(¢>]j`Vô”û¢ƒØ˜Fƒ¶;ϵù'Lü6¢éüˆ33WÝHK›P@µw&lhfJQ’!ÄIGp¸ÆÓ¨wŸûZc{ñ™´L»¥:ßßÇx†¢Z|J$sß`é”õ4ß>b8½ó¬8wl^õ Ëùº›™Eq;S™:ߤ¿· +S=-Ï€Zé81j˜i3EØûçÀKUž6ÜæØ§Zí®F¼ãcàÕ|¯bàÅx³pK”!‘cÁ¥ž¨tD¢ÃB—ñ”Ó$ŠÆÓ%c4Gd+*„€1äï~²1æ ¸o¡g. ×}2 ìf>Ø+Wú&a•îÍ\q4óÌ›‘˜1‘q}Buu8®üë®n.>øe÷)•ÕOeZ^å5ÞÂ%\ƒ7W½sË>.kŸ7–S:kš÷=Voïn&Ï}æÇª;Ñýñ¸OéëÆ¬ѹÆT¾­³)ÝûTºQæü Í̧üDT—îªJG½nEWL’Ù †0+Åͬ"Ù쯈¹iKaeûÒ3rʸaò€»_è&ª–Wã•8AÔ …“L({qäœ}ûAJ{£rÊöÖFuî-ô=äÄ)/!ãY¼FˆïÀ]÷‰ü؆¥ë¯ñ¹ü`ô$ƒ»6ý—CoÒÑ]óóµ2¬©JÉk{{ÐùpIºÉâk¥L 'ŸnT¸„zZs•<Õ¾–À5å\ÑŠµ&el3`Ùs„ù5Ÿõ˜yDToìQìˆbæ0Š)L¼÷òšÕhQVƧ(¢‚[cä ›ßÒ[¾Ø†*ŠˆEˆN”ˆêÒ磜¨.Ƶʸ.Üm@MòÚà¡9ʮԬP–÷0Â>‰ fÚèêà¤Þ†Î_B¤Ên:%B »–<°³B Ñ11¶+pRÜãî@–^ 5#ž¬}(Fe5‡€ÏØO™Osôârþl„¸.,LoŸËüMC÷ÜT»;À–¦†®3;M#›†Þ4ôj4tm‡™ß+RPŸ§ìhUÊ<‰·0YefvÑ5K”5wrW”Oe{ãÝäÓMòIË>ÅþÐå-ŒaÍ¥ÐÓÈN kY™&<Œ^VBòƒ¬u¤ªÍ'÷#<ÑeÓ¨j³Q6T¶Qr÷tÜ$«7µèÿnïéeVÞ”ðf>^ûgÿµÝRpǧ~a†[½¾vgÜ¡5IÛîÏ:(ƒE¨=ÍVWaeÚq±k/•®”ÁöP°‡>òü†bºà‚ß+ïqS *®ííCRT`(~ÝR7kú£Ø“7žSëz®ÃàÕàwúÈ¥‰:ú›´u–àŽow<ìü=z—-âI“ &|€w÷ùÛ÷@¼öúÂÅð¶¸c¿žÇLã¥( ÒOo\£¬ÚcgNaŸË¢ïšax‚0(Q¿ &ƒ¾Î?Ÿ±¥>lίp;’ÇþË(sôÁÔwo’ŠUæ½F)¡¨so²0'͆û»ÿéYB' endstream endobj 4693 0 obj 5155 endobj 4697 0 obj [240 /XYZ 37.5000000 253.250000 0] endobj 4698 0 obj [240 /XYZ 37.5000000 253.250000 0] endobj 4699 0 obj << /Type /Annot /Subtype /Link /Rect [95.2500000 261.500000 117.750000 268.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_directors >> endobj 4700 0 obj << /Type /Annot /Subtype /Link /Rect [43.5000000 209 520.500000 223.250000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://www.hpl.hp.com/techreports/2002/HPL-2002-335.html) >> >> endobj 4701 0 obj << /Type /Annot /Subtype /Link /Rect [318.750000 98 354.750000 104.750000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://www.oracle.com/technetwork/java/index.html) >> >> endobj 4696 0 obj << /Type /Page /Parent 2 0 R /Contents 4702 0 R /Resources 4704 0 R /Annots 4705 0 R /MediaBox [0 0 595 842] >> endobj 4704 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R /F1699 1699 0 R >> /XObject << >> >> endobj 4705 0 obj [ 4699 0 R 4700 0 R 4701 0 R ] endobj 4702 0 obj << /Length 4703 0 R /Filter /FlateDecode >> stream xœí]K㸾ûWø`=âC/ 0Ï9Ì9,rv³ »‹Lö¿»-w»)”ø©ø­ ’™´ZY,VëñÕ›?ùÇþ_¿ïß¼ÿòŸýÃßï¿ìªC[WçÿìO¾»þîÿ÷mWïøu÷mÿm÷y÷ùø¿ßvç¾¼ÿëñ_ÿÛëý_Žÿýyÿýß?üqø¥Ó/üºkU{üû—§¿ûVÿU=ÿ}úù¿wûÃþ·Óˆ—Ï “yýÿ¿ÓÆT¶:McâÓßv—eª§?¿ÿðÛîÍ™a_±MSuÕ^Yc÷ª·zÿßî~:~à2|uè­RmcÛjɇZ}üRÝõÍ^é¾Ú7};úÐÓ™á•üàMÝëhƒŸg.Neå]ps›ÆÖÃæv6ýŸ‡@ÿÖè.ç<Í\œ*ÃæzF—Ù\eí‰B9~FuÍÞ /Ã^v.£·]ÌÑOs§‹Ñý­Á?‡ ‚gâU/ßïÀ•bxfý)|^é[bø¸?˜:Žf+‚Ö{ äxU» )êáQLQ¸sŽf|BÈsžÁǯGñ]r½@rQÒrñËAüÌ/xO°Œå<i€e4ÞHE±´ƒOþ¯‰S«±DÁœÈp¯ènWPSzô!>%X‹C¹žLâ÷ eZ­È'ó!áL»~³ÙŸ¼Rlé3PÌw𬱕ƒ¥/¶iáhx°¦+Ý–ÑU—Ø–ñð –ÒpûGvSJi­Û•HiÝÔQ¤4¶´°-AIæf‹íC|ãÄï`=m#B‡y䪨Œ\©¦º3iUˆÖélb­ãá ,Q°­xg7 ϽKbâÍÜ8ëáO(Ÿi¢3ŒDÁ+ź KbHƒÒ冩–Ä ’ÉšÇ(!å“Ãvs+$¼â)í£S{ž©'Ø÷Ï Þ-È—_aÕЪÖP×*¬kñ ,Ø¢TØBHcz›« ‚±Kü¾¥{!Lóxº?ÕÍ@ÖþOÊóí’BJþµj‰¿o^4¬±ÏGv=L„Ç%ž¬×³cM“Zâ®27b³‘+Ÿœ*£ ïi¢ó|oö‚Á‘Ì×ø;8Òi@x·RZ¶^Kj}ôq2t‹¶>²ßsK×ðµJžý˜J>àèĦ­}Úšàç¸`”GƒÈê=H,;=ë)BïÕf-†uÓ‹}ÒVOŸlô% þºió8QÁUgÝ¡ë«×OFºõä} ²ig –`ROê å8=d2 %â–*Ó;ôÖfÖœëŠ]ß¹²ÔjÛtm=–Ì·6¹sÿOŽªÞºƒØðA¥qkx;9)˜X[ãìZu‘ïtçžC¼íêl(s0ºSǹ¾¬ F 8¬º¾¼2ëIw¿ƒg€¹ ³>äç’öÖwÎJD©Ë‚^ä×ENšá¥OäTIªvù(»”"X‚ÚD†)!yhg="5Ãqž¥ãeDñ,Ò] žìPtÅv À¦í^ÏxeŽ Oú0ž¡×<Îmöa|g>“ž×CÅåw‚•áÐ:¡žðSª ŒàX¦pŸ*å&œxnžâ¢ì€9ê” Qpoa¡„ަÖÄ)=zœÑuêgO5ûyÆ{š?üê±U™ 8“ªJè†Ö²iñ`÷=æ‡*ähëä` x¤|¶ð¢/¼ˆGÃ0XSB¬Sëi¬§°ß[ŒCc3H–dOhÊM³”LnÛÔ…€÷v#NìOužSòX¿$Ñ)eÂBgqövãÝ 4½2éq 4×inÀœƒ´K »§ødæ¬6`NñÝÞ€9£È´f @_J+´¯–”þmVhpg0g!¶L¯—D17`δRº·KâI¥t·Ä«±Î\¸ ˜ó5ÕI«"´N{œGb­³sú¤ÃÌ™nçJM,^nèH6éÅðJæ± ˜sÿ›Ôžç ˜sæ|²7V±z ®ÿD[Õ©Û¼$ôi´U»¤‚g–DÑÙ@%À|¶UŸŠ0{Žñ:µ[áÞÝV©•@¶µª~@ȶ 0vÅGÕnÍtg­g»»y´Û:oAül õ?Ûª~%0|­Öqý–lˬSŽ­×úÐ6µ_d³õ¦ü–D*0ÛÇ9é4î¤jVÒÖ¹5U-þU?4nûÒÃÉœ·þ¢fòL¶0ÐÒì‘xNŒ×Šß!@8GØ{¢Àá5Þ0 €È` ºH’ â ÆN1Ürùˆ÷ “ ó9ÎêÁ÷„O<œiÃ)k*ôNg&:®x²!p¨Œ–oÝ¥3&öO…&ãºntkœCÅuQê¥]±ƒÏ>„WyÑ€íØ !ÙóX̧ùp¾²Œ58²”ËW‰òƒuz˜Î‚JyRFö"[W­ Ó£«FöTd—+¶˜ Ø((ŠÝn®|‰~ZbŸ¬ Q2:1®Õî‘ýgzD/Q“_9öªseÓ|Úc$ò÷2>|O> ±á²©ýL°ÌCQÆÎdªbZ†Ùë9âKJ5®u 0ÀQ>ì±|°µD@§Å·£”6#KžÈú•õ°¤Œ ë“ùL‘yݘµ;)”i]/E:ìs ù¹ÌÑ•A¾¤‘€¤Ö€C‹gÂDb8…î6²+Í\!7Àû¸™ÉF$|‡er1x¥® Ê|ØC®ø^Jk!™ßS¡Åܯ rgsvo—5_vš‘%³ÝuújJy8d´—LÜ”ñ†Šòç'ÔzüÚÌÁÍ ÈvߤÌ6ÑjÌøÊ±ë;÷4ˆ°£$JjjÏ™$‡óÞqm˜(…pQ´„Žgœ;Kj(›‚HŸð„a0_à'Ê¢ÂÔ«(QL:¢'ø;†gwû90ž¦h%Vþyß:çsæqïÁ'žUcWÆó­ïàYW‰ŒÌúÙ“¡?"ÑRPNxŸ°š›Öº "Ê]2(›ÂÈUsTjé¶ô§vÎêvËNÌZ»R- UÌ´ÖYÁd®TQ×pÙ²Xæ"(›¨Ú‚ ¾„$Ð2RA:˜/˜™“ehœùsÝÂÌKŒç˜ª$’h?fu¸p °Ód1¸dMFâ8$…YLWaݺJœi ëGHTບ–Msµa›¹Šº>êÞ!…¿…ÓuDË)nY-ÈÔ3Æj\ë‹jyã"“ÑlñTÛÏtª_PqÕe:@üz§SK\•|)†¾RÉüTÃî¢v>¶žõàwàáÜ7ñ#ª½r¸*¬¾»ù‰NT“Å…Â%˜qаdà> ®œ–EP¡ ‰&±µ&UÃá\0Ñþw&…™ÿÅ‘J¦N.eË…ÝÙ•ÐÖ®J”Åá••› ÌÓ|ôÛl $LÎÚæVê€ò!›Ä 6 3“uꮕU´ªyçQÏø‚/çq„d°½ÌV10óžSPwÍHs' ó¼!j¼!'º>‘õ¸¬ãûÇ«ÀñRvõƒ_v_’W/Ÿ¦àÈÞì[²“Û.‘|õ5n `ß­¾åÁÛ*¼Ö]á¾qõÃ5úI&ü…Þ>£ý‰%ÎMà/\}2?þÂËd,FøfŠ7ˆr Q„ÕÁÈžܰA–ªfl"Û'2Ö‘qÓå™þŸÓìÞ3Ð'Ýqõ·±®ØñÄh±ƒ?!ÜÿØNðÔÖãÈwÇzµfâûð‰£MVÝÇt¨‘ô'|e”8K_hT×Ú=²=žõˆý)jdë}àn–Ø&@Ã=L[‚ü=¶…Áú×TN†e"2 pè­ì;rÙwT Û¹¦À™9ÂB™T@ÈB´¿|ÈAô%çßpý7\ÿ ê_Ra'p}5MâóòxðBÔµ²Ð b']i—Ÿæëì¹G%3$Ê€’É…™ßtVY`¤ ˜T%&eaºÿe*-’ªŸòH[aàÏZˆõÌ%q½åu×»ÂW[áX3¹Îén† ¼«UGW›M­œoÞK¼ç*|ü³ÿv¤‘—„Ÿ§~a»›¡Ÿ£ñP©S4w¯íeÞ ZJg¦moPálµèƒ~ò\?9>šñóaxgˆ&_}·ùúŽ™n·æöiXé8 ÝLèër®˜hÆ DŽœbQyc ßZ-ýªÁ:Ëp§g|™ùG(þëpÀlƒYÀ^è}þùX¢àpÎ ÆÅôÔöB…}®GMÅ ¤8 òÏ ¿nqVçÏÉœb°s.»-˜øxÖÌ'ƒð3A ½vÆ”†ŒÞ9¿êÙÛ‘<†üç~Ä™£L½»H*¶•9 u¦xÄòÊ,›4>ï?ïþ…u•1 endstream endobj 4703 0 obj 6098 endobj 4707 0 obj [241 /XYZ 37.5000000 562.250000 0] endobj 4708 0 obj [241 /XYZ 37.5000000 562.250000 0] endobj 4709 0 obj << /Type /Annot /Subtype /Link /Rect [179.250000 583.250000 219 590 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_typemaps >> endobj 4710 0 obj << /Type /Annot /Subtype /Link /Rect [66 570.500000 225.750000 577.250000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.devx.com/Java/Article/30192) >> >> endobj 4706 0 obj << /Type /Page /Parent 2 0 R /Contents 4711 0 R /Resources 4713 0 R /Annots 4714 0 R /MediaBox [0 0 595 842] >> endobj 4713 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 4714 0 obj [ 4709 0 R 4710 0 R ] endobj 4711 0 obj << /Length 4712 0 R /Filter /FlateDecode >> stream xœí]ËŽã¸Ý×Wx`Ü"©'èg€,4º,Y3™ƒ™A:³ÈïǶdWåC‰Ç÷R”­4’î”Jyy_¼Ã7þòÝ¿~ß½yÿå?»†¿ßy*öMUôÿÙÿ|÷ò¶ÝÿÞ5mµûá×§o»oOŸŸ>þ÷ÛSÿ—÷=üë;»ûËá¿?ï¾ÿûá‡?¿tü…_ŸÓþþåôwטÿŠËßÇŸÿûéoØývñü¹a2¯ÿÿwÖ•…1ÇiL|úÛÓy™æôç÷~{zÓ î+eÝÖîLéÊéJ»ûï?Ÿ~:|à<|±ïJcšºlŠ[>dÊòò)ÓÖ;s Žÿ¥Ó©ñ5F7æè§¹ËÆÙ.<ºè;Ó $ªÆ¬$@¤çñ5F?Ñ@môÓÜå 3l0]fƒ{üJsø?ÆvíV‰®Â]–þýàmQé ~š¹4QŒ«MppÉm«v 0ƒúÃËÞE§È7Ç™+ˆm¿·xtÁÍíŠÚ2¥ý/Ã+ n=¹íg.N•as£Kn®-ÍÍ}^apWzƒŸf®¶¹xtÉÍ-ÓÜÜçá¯l­7øiæj›‹G—ÜܪѴ¹/†W¼±z6·Ÿ¹–Í Œ.¹¹my6Š'O¢çáÅo?ÕsÄû™‹Så¼¹£Ñ?ÇŒ‚§Òÿd¾^|÷õéÍ'S]Ôz÷õ§ÃäNßìÿúz<6»ïŽ'ôªÚ}ýq÷ÇíË?í¾þüÔík[ç8õ¤há Ÿ|$ÞéÐ ŸàY»w§'¿vIŸÀMy©'Àö|‡ÙHHúâüN ßià“·ÄhpÖ뤎sð NLQHß <)àwL<­;‡×ƒGƒÅ{ZáõàïÀ'ކ÷tíD ªs©ónW@ à͇ß)±8Af.Þs#DQ™XAcl>¬$ú¤€›‚uœÃlñ)‘ „-Öqø;Ø6`ºA¡aì°ŠhÄqÔóú/ŒûP)Я`|+ÌU ­Á£+¥¨,_W„4bࣣwðh¢G<¬‘dõãîCJ#êL6f/’TÉ—7Å?‰^wYìšg[œ¦imùš:¦Ø×i›j$Ån_³ÎÕKÉïPîK×OùÖ©Ý·Çt׫wjôd°'מÀwßyæFͺ‚4è©ÓÎø0^àh-,|÷ ?qföìmÿĘó(3¶t04ÕÞÙÖ¼Þ¸Oþ‡}”n ìÖB‚v²Œgïá 2kû]1îL·9“màHÌKø€$à¥ã¹É’¯g$¥pJe=,°˜¯îË`Ô^”§À;cIH #•k¾O`à«Öx–s;Q¿“ˉBÑ™jÊê:OÄ™Q¨YËPIX´|0ù9(c+:“å½ÛFj†:ø;¶ñ÷‰0bc7øC¼ÅÅ™W]eK59l§¯‚üÕŒ->˜`@øgÝGxˆÌ30·Ñ3‡Èaðaç`!©}‚\¦‚ŠJ`#B¬˜RÇ#vÃŒ? ›xJcaaÑV[+žƒ\å%ÈåÏÛaô6Þôdè01^ž^ £wˆÐ™qËY]k:Á˜UǸ¸ØuŠ}0ªx¤J#f’KÈ î”Äl¶t˜æx4ÆÝg¦ãoøœaE(R6Fâí†TöCä°!Âïœ(nxiÆo ïÞÛÉ.­JkÍë³u¶9gël¡m4êÚûää!7‡t™ æ©å}™eÞ¡¤¯ký=ÅWDmUGÍ×*«zL•ÏpD¸+à§`ßr~l3YŠ‹8y |~Yï¡2í#ÿHþ/~|ó‘˜b<Æ…&¸ ñ¢æ©ÌÈÔ1^ô»Ù®HŒ$÷SÔ•düÃñ±‘9–`“aˆB—ÅRYÆlQ‡„Ï"õ‹[çÀw˜paë#,-EeÀ®O˜ó~À¬1§RQmM…aG2±hM N=Zã[ÖTV RËCi¡XKÔE$cæ ëÇJ$Ÿ–óF¤É—On‚ÅØ¾ñ³î¦Cq†D˜|“çgêŒ%‚ Õó7äTc_¥Ç,ǪF4+$ëŽÒëúüKù[‹Á@ö[CfŸIÅr)Š7ì­/dó¿*å|ÌS.ÄÛ#Z@—u Sô$+ „Uf˜6Æ^‹¶`©¸¦šéѶõ]ª‘¢aŠ"ÜüÅÅblGû\kÎìù÷Zf@·0"ÆKT®²N‡ÞïÍí`Báå9‘ÞÔÕì•ê:>£…ƒ¼pØÚJ* +bš$,§k !5Rí‹Î½&®“êhìùQBsfŽ—+x§>&?‚ /ÛÀ¤y™@Öüã›á±ã[ùQŠ'fÀD¸êŒ»Ub2ŒÑño0ó‹«Œ–„ƒë¹c&Ñæ7g¼˜7ýÂ'íÂaĦ,Ï~0§©'‰6²Ó! ^Þªë —–»ãohÈ]3Êf‹ ä·á|É´Ä °9˜þ¤[`O±Ø°Ž6Ó î€'ð.`ºa¨bOñw*<äQ7EëDªË¶*âðð°ê"X?Iko`³›˜Ç½Éø Ë¡Íñhxeb©T$rMÁEË‚ôŒG³_æ†é–¶Šò†Ý‹!Í)9%<µ€É_¡_ÚU烩áâ»´Áï¸,ÂãF¨e›ž™LT€Äóû6d $r.èMU»Âôäáwˆlf ŒH•æ?<{¦W†i×`Ò¨ªD³…±ª<“àu¢Ï5¢¢**­OMV ?¿„U¶hzù¥?Þ¤°KÄì­2„˜¬”¨â<ÐA4¹gPs,Û ¶¸Ã³<\E˜—Â9ϯ:«Zödüãób:/|©ÊÓ6Öh“~À—zþdøRÏ“ „0°™fT9Sv-:ËŸ&BL^U[§°¹!Zí„[«D%V;ªB»gkáÊ»Çlf„šiJ†ßw7µÛUå›ÒTeË‘ØÀéè< D.uˆd›‡d»-°ÕŒÙ}†JK—Ïgˆì—¡}HŽŸ¼ªýÊÐ"›oÆUa›FÖZÓò(6˜M /}‹yÏRRo8Ì‘9¿+=„ó["õL¦=’ÕöT µgYZ7ˆ3Î?ƒ{ÊSGƒ©¨gïRå°(ôÚTur'©üÀßom”É0£L†™'9f¾ä”…ó$'9ÚܳQà> þðØÊ³aý†˜ñ†éz"k»?¾ß•¿øÁ/O_Òg­ÌÈ>êÛt¼çoRÑUŒAH bnÞ#NŠTÚ'UQÁ¨¢”©±ÚÅgxîŠÁ$bÂâ™E¶†6ÔÄ{Z¾Ì÷ëèªrPÝ¥¶ç<ðBDMà­w#¥v'LáÓp蕊·K¬'§­ùqY§U¹Áš›ª|ùƒ£5W"hUÎ&(•@Ç5x²9•ÄÚ00–_ÀoùaY£7¸DÐÂ¥Z'Üø«êÑΪF<Õaçç§Í1s5ÉÜÓ“§^Ç[ûú6ùéÉÖ¾{Àx¬ jûüŒ¬ÒdMx”FÍÉÂx[´!Káó”lL:"OÎøÆ-ÌÁ;ƒ²ÇTp½kj ”ÁLŽ( `€\™fÑ-}Øì¹j¡FSé+Ù›üdCS`Ò„oQ®°?P×ξþäµ8Ä”·Í$€®)O¢ßéàwÎÈ£C±3èIç¿sfz¹ª÷öO›÷žYLy~iŽ&1PÔ?ˆÎ Ó €ßÁ³†30UühxÌzxíwpn5äDø$078¼ÛW'áYcº‰Ù!åä$»gí$+Kî-¤.|Ó#1Ýã4 #eSëŠ Ð ë üÞS¬ÕøLkâ;'Â8¬·ÞIj§€Â‚+f±³ƒçÆØ/Ì£p؆O£44–m,Áƒ-ÒOÞÕÍ×Kâ¶í˜î‘«e+²ñhŒkNœÎdPQŒ¿oõq8–Žß9kGçwÁá'1…sLŸ ëÏ/¶ Ðbé§u^±¤Á9Là?ct½Ò 3W )Žg;'÷¯ÅŠA£[\¸%âþk¸!7`Š™jpÙKùˆZáGÙV!•Ñx©´¤„±ÔiƒOfV Ô•o&Y5MRø;&ÁHíƒ œJ‘‰–*SHLÊ.éüM™¶Å‡Q#Ôx0£au%[®·XŸRª–¼)éL£ëL>¼(Ro¤oñI'K†‘ÍgÊQDŽ_aÔˆC+®mQ¶8TEØü  õƒ:HTƒhoÂ!K ¤æåñ†ðÒEú«ôñù|(ù€~"Î$Ý­x.údt´h's qV£ R3ðÙµ¾dŒ:6 p5SH'¢yD1âƒQ`|^œM£zcæã £‚.~dš;(¾cÚ<9ÉR³º·N•¥´o&(WnÊò5;ÆÝ‚ÈÜ9Lܲgð}upÖø.=ü„ýÜæ÷.á>ÖîüU|;rŠË{Ïói/…;˜˜[/‰»T™{^Sq¾þa<_Aîûà°‰qìD «u¼¤D¸XLT »?Õj隀ÓËDúü¡wtq71uiCÀ)d@ ™0²¨;¯ÒC½dúˆa'0¡³½.ª¬ZÏdã.¨â¸ÕþªõC>Ö·µ9§þSÂÚK _uŽ/©g8 » Ú‰KÝ38:—Ôæ†Ý[|Iýj•™A_LExT›|’fu¶»eu«”Ô€lYBð;¢³ÞBB`™è˲œð“UZ· òå¥É}<Ö5ØšlR+<ë­ß£Á=up´rHÀ½ß*\ %KVÛ¥ äwu3¹†€öÙ1Ó¶ÿj8lÜåùà–M=¸.©ÛÖ[÷ fgUyôЮ£Ï¸9…ŠæðeÙPžsV‡*I‡¨ Â÷heÛ ·É‹‡-€¾+ÛæºQˆZ’°ì2EóXÚ°.b®ÔL¥ÃÇ9 °C xLª@tEðÞ Ëô#܉Ÿ³Ù¸Y3…¶"§`¢Ûm|C*"K"óUCÂühWtÕë ®,ë²åGC;·|9‹ìAgL9½[kͶvƹ[V·J¹7LvK7–:,Aw– ¦¨CÌ gœ©š-MeÂr gàœ¡Â;‡sq˜ß`¶ ÏÀVpDN)ç bδ68O˜C.®3Õ¥©&U†Ë©#nº0œéZeδ ’Sï.zâWAïÕe|kFl˜‹–P”=[·Þª)å5%[!®#MSTûJàñ°’IND :ã«PÇ@/é+ƒMK„ä“ï®rKmɦ¶ \çœgà6ý´Ï‡ÀŒKR.b…e-ÃvUÊmNQÏHµ‡/]’"côï3SÔۘܯA?ÛLOfˆ M+lýÅ'º–ƒÂÍÃJ—¹ƒPNËèQžXË3‡" 5E¡Ñ,~+˨~’ QŠ ù<.è£ðã ÖtÊ̦I+Ëh¢¹ 9Égs¹Õ›‡æ¶¦zóDcÔŽ$wU­ÈF\Dí­,Àÿò¦– P3W4É‚uó€loIY÷n[OŬ¬þu«{íÜV÷>pywWæuïÎÜ‚ ´N¹ßêÞÅ)ºÕ½ouïÁYß]Ý{×î>Uŵë.7ã¦*àIt„Ú®¨)¢‚Õ8;ŠO[Êhÿ²ySœr=zmqºÄ¾J+’˜[λ€½¿<<Ÿ²½¥}Ñ•{C’Í[´« ïÒ2}ﺪÎá˜TýŒLŠ$àÿŒÀ\pû3¼È‡„ãpƒ—–©Ù€£ásKàD£ÛBQé“’ŽhÊUÁ,b¸M8Yè„È”½[¿ä2‹ËE»Úœ¬Rz៬ÒgÜ<÷v!wϽ.oʧ-{ð Ž0c˜¸@Xf2æåí>‡l¤¶¾)O ó(ø‰¬5Á¼LUg™Ã t– B×ÞÁß1”@-‘ë[6N=CšÚ[n-Ygôj»U‰Óÿ©¼Š<ìLS$¿%§©/Ç@˜›2Ù¬·†lÜ9M(jçïÓ;ˆˆÊ~OÕ w”1±p;‹l¼G´ËT8ZÊ´+Ìß[¦u;x%Zg'ÂÌÈ® 3 l˜>ìXYùJp>ÂUƒÄ]‰DÛ™‘åA ½ŒÕn“êj²ˆÄÑœFµegÚ‹pÓê‡ôÓšÍO“öÓ48­-ýÝ$¼,*'Í´²cêŽ8 @ *jûîÎ7é©^ÜY¤®¾dbº¨XÔÑ*7E”u(üÆ ,e^(½ùõT|CíÓ‚À#ÆvÆ3“Lc …›˜?@w‚hnk3ß= 7…Ô6¨óñʲà'€¶ ÍL3bœ\2Hšw8ØÖ_5¸Of„&Ê d_à‰F§fïUíKOÎèLÂ÷”,åÚYì-ÉÆeEU¢>X¦\|ùóÂò=ÍŒ¢a@™ð®7³wñ†SyÝkŒFwÍu¥}ßÑ誺îò¨~³ó¿ÉDŽt1y#¢²À}²]ù²nª6¸ƒ×·¦0aª¤-uû1ƒåù{9¸ ÆuŒT.ŽyãT¦bѸ›D3ìiºÒ÷)˜=ÊçªQ'‘‚öƬ6¿톓¨~¬¶-Ì$µaèQ“1L ðʨ•]âèIaîŽf¢+?"ÔJ% ÂR© 3’%9‚:S^WwuwCØ‹UëGh›Úÿ¦ˆ¿æ€xœ:OØ\ª"&ÃZ<æìkz*]ImÊ\#L¸V“¸Ê?Û< Ö­ÛêºÖ]Ueç:S©š±ÕvtЏ7›”±—x'©Tªøsúî"8µT]`[ö ü¥ñÇ#¤¿LÑufpÕY*ÙÛ:oÈ8©V ¾—w'e²©1ûbâyÌÍR7Ø N˜b•¼}ÛGÒÐ]ë-úõ³lvZ‘ˆûN¶7ÓjV7@®·#N®E‰B²Å;wïïh#.$R‚Î/ü5ŸO6\¯uMQ0 QDss!¨ðÕÒ"{›H¢eÍòHtŠŠSã›X‚;cŠéóK)ŸQn˜è5S⊮,&.‹G–¬æuT^$šk}˜ë)²2šS;,‹â”lSÉxÕ°jé<ËJZ$.ª™t“`µäáLˆ„÷g´ÝM7åGTG<ßîÏàv!÷û3:ãnàÿíþ q™É˜—·û3²‘Zg§9iCüßÿêA9„ÑÞ™ÈYen³ížš,|‡ížš™u‡?»o± JÕç©_˜q$n¯÷ð¸}aŽmå;[¾¦ÂµTO¹æJ´ç»·§Èј¯êñ“áv»ÚÚ_ìP?ÜCpå;n*¿qmnŸ†•Ž:ë¹Ça˜òyJœ¬–>Zà êq ‡a®,ÃàÑà;ƒ24QKožÙ–e¸ã¿‹ç¢Íè[¶ŠgÌ6˜Ê3½ûŸ¿üÜ×A\a\LïAéà@iÜwàzÌTNRг ÿ æâgµžè$sŠ ãä\v[0ññ¬'ƒRð3A õåŒ) 1ü9¿ØÛ‘>†ü~Ä™£L½{“Vl ·,êLõˆ-ä‹Û—'݆ϻÏOÿAø» endstream endobj 4712 0 obj 5772 endobj 4716 0 obj [242 /XYZ 38.2500000 140 0] endobj 4717 0 obj [242 /XYZ 37.5000000 653.750000 0] endobj 4718 0 obj [242 /XYZ 37.5000000 653.750000 0] endobj 4719 0 obj [242 /XYZ 38.2500000 140 0] endobj 4720 0 obj << /Type /Annot /Subtype /Link /Rect [214.500000 710 252 716.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_typemaps >> endobj 4715 0 obj << /Type /Page /Parent 2 0 R /Contents 4721 0 R /Resources 4723 0 R /Annots 4724 0 R /MediaBox [0 0 595 842] >> endobj 4723 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 4724 0 obj [ 4720 0 R ] endobj 4721 0 obj << /Length 4722 0 R /Filter /FlateDecode >> stream xœí]I¯ä¶¾¿_ÑçîI­@`Ö9Ì99vœÀ°L|Èߺ[ýª¿’ø©HQýä=ãÇU*k_ÞüùË?ÿúýðæý—ÿ~~ÿå¡86UqùçpúõÝóØö8üùдÕá‡_¾¾=|~øÜÿ÷ÛÃå/ïÿÚÿé{øKÿïχïÿÞÿðÇá/þ¯iúß9ÿÞ5¦ÿSñøûéçÿ~øÛ¿v¼¾næåÿg]ÙµöÆÄ«¿=\?ÓœýþÃoo.{KYw]]Léúÿt¥=ü÷Ÿ?õ/¸n_»Ò˜¦.›bÉ‹{zSÛïol×ïT£)m¯¾yÓÿÔÄÚ|€\+ÆÕFÞ]ïp›Â^T5Ðoã¡¿ß¼9Þæ'ȵ‘r9ZasÍ“um7 Ç¹zÚ>Âæ•H7gÈÕ±r=[¼»æáV» ¨.ëø¿nÿÆš6"åœ WÇÊõpñkÊ®ÔÄÀÿÓö6¯ëˆ›Ÿ!WÇÊp¸ÂÛÔks®Š€¢Çí#àß1)ç ¹:V®‡;ÚýsÈ.”ËO€ÆÿMxðÝׇ7ŸLYôÒ¢>|ý©îüÎËo_{¤T‡ïNj~Ó¾þxøcQ¸:|ýùáã×ôeoE¯,ûÿ9éÌ½ìº¼ÒØó+ÛcÛµ­ÎX¹¬ Z1%|æýy¥<–îbÊ=­”hÅvp7 ÛÇóJut¶53Ÿ±-„­Ö|OÎ8`«Î+îX•uÛ¼xæ‚·vÎ&dÃÝŒ#v;úüPWÀ]á3¦…hÃ…dàÌ|TCtΠš 2sù ã®=­`Ê„H1øXTo€ †`b»a&¿'¦È¨Œ'3 ç“)F¼ÂÍÁ;z1¤áúa,c‰÷!üNo 6©zCºUAähø¾Òøc¤¥†Û™áÆ™á-bzu, ãÂ^VŒ¹¾hÎÙ( …˜E*QD×™Æx˜JßÍæÂ%p)(«££"@ ø.ÊĤNt1°ØâX7æ%Ac,Á÷”õ[±ÄJ| q¹OÞöæÄcƒ„˜Àf°‚Å\ŠQ Ai!'‡4k}¤ >™[Çó>\]´˜ U*Åã1!â+ V¥ò4Mñ–îµÊfš"~k[úßê«:”s„ A¥Ú™_N̯ºsæg’ùïÛæzB,tǦ®<,0>åÝ(ÞâWi+Ów€æÎˆµÕ‘B1R‚xÃØQµ’”ƺˆïë[_’§÷£TEã « 1Ä`kXð*®d†_㋪zé˜ ÄØcX΄;…a¡Œåa~`•RÛ’‰ì\Z‰ÍÑr2f:ŒXÕÕæã  ßˆ(ËL¯£xÂlt®‚)›.ºÁTÝ„)]2ÅÜk~„™ò 0ê dÜLÂÀì¡›JÅÄhT•r&ë"•?DH þ Ìu #š2šˆ“£4HÞ@ï<3E=ÍáT™Æj©,õø•p˜Œq_";ëæî­Ø¬Á™ÈŸEiAPut7ü=Œ~pßu3ÌqpébeÏV`Ø) íYPW°V AbÐ¥åÞC|“vPV'ø¤ 9#ÔéTu㉚âÓ ež¡y½wheÐñn=ó6¶°¬{Ƚ/ˆ. kã«[­5Òå‚#f¾³Å-Fb‹+Þ áFë*Ö©*¤RåLlÙž,ÿŔפ³dù/„o[]„¯P¹¢‰pVï‰"ði3F¹F¤šqE†ÔÖªÞ£€dz&±{FFADv“›®‡’J»[+:£ f„ÃêdÓ¸Ö}÷fNíBd÷߆ª± RˆŒг¤Î-”¯š–š:…CH˜Æœ(y¤2/‚KN³ÌˆÂœãºSsižDÙ€Ç0¯)ô´l{Zo¬ Ø ÛÍÅú¦h}©¯“ÎAUQ°™Ú0FÐ1š'fº÷ÊÔRõ· &kU «"Ϫ¶O›Ð Réx‘[¸$nFztcÒŸ&ïT“¹µÃEÔDû:á‚bJ™1Ä->ƒq¾aVJä…Q_ŒíªõHΡæ•#ËgþõœA™Q[U3³™aÛ5gWúϯ‰¡¼ÕÙFÏÊífŒööÎÈs§6¹‡_ª—?øåáK´F¹Ðñ9:ÑœóÂw«¥Â/*þˆx· À×or3B$“Òâo"\¬ª¯n9XdS• ê¦aI‹»°èæ}MB³_c}û™¹dð™(¶Ûš™W»wªÔ­øa|î$îÅ´±bЕ¨2a܇àq‘QOïlk¦id¾^›JÜLšBQƒS>êJhd)_¢ùeLˆnnùQë ¦FÉ4…uå•Ìp…ŠE+FGq t0’n=ó®| Ã+fí/uð{^²Í¸ö­Ý FK AþŒÃxÃ+˜ >SL×ðfa ÁPWð–àg0Þ¢Ô¥axZ+‹eÛv/Á¼ º~ÚXê\.¦)ÖÓE yô̤À¸•3í SÁ÷àgj¸‚Ÿ°ÙwPòvp·bâC0å-ÑXF×QÚÊ££ \Ä{Žg²²­õ†ÈìõB LÒ_LìIäQžfÜãÔ˜ŸI1ö”1½¡%è´`Œœ¨yn¬j&*p§: :•©ŽEç^~w!c¯KOI¢Ù#Ì3بWŒŒ{=ál÷ò•·”†)š# øŒJ.~·ª¹0PP·p!X hš?e7çM€M0¦Rõ‚Ã¥XggŒb|pº ö½šØ 'IÖ“7ÏŒßMÂ6¾ä›ŸÂ@5†ÈŠÏ8½;KºÝÌ2D½Š²î¸ÍÐÃ$;†¤€°CÆ$ƒ5I¢?±®ö©<ËF·$9Uïȳ°v1X7l ÌͨVLxƒÉ Vñ^«¨’+–Öš¢òE«uè ë¼£¨Ž˜úªî‚D æ÷šuD])ru…¹Ql®¬Þ4eÆciíË# ˊ™ˆ8+ ®[8k ç™a`†À©ùÒfœIi&áÁ+Ìw°ÎýcòÞRAíÔâ 3N«öØÃ­N˜=ÈäIâ3î°ZªØ Œ4ÝúMu×…ŒhæÖ­~Sñ÷ù®ÌíÆ4†¡ÆÏ` é_7ïÙứˆŸqgºöå[£rµ‰xNU¹i5f“=R“Ç?^[ û»KÛÕ ¿iÌrN•=•Ò ©Ÿëd¬Da!²O¹OýË—O¸¨‹0‘Æ">{Œ_¢<Š2ùp9A—‚Љ¿G•úRuQŠ>¾˜£`õœš’Ò¼®Ër¿Ê÷wS ÌMoì<@Òði㢄•ÁhÎÅaJ$JÚ æÑ…$åO­<­?å ŸbÙú>eÉM´Z¸7Þ‰q­ËÓÀóÁ5”9$ï(MÂU›bIL9l¶KTé6ÚØ~Óê(sgr¾Mºr3ýo×NoÜ’ oÊP[Ó4»Æþ´Âx˜À5áñÔõѯ¯å Ï`®ˆí™TÞ>œX°zdŸœÐš 6:Ë^+îêIx”å8–ˆÅâžðB',}Uza´F_À80й\aè¿"¢R7‰ÔM°R=íJÊ{ÓvSê­Y¯M©7¶OYQ»ÞHéB<)Öô ó&ŠÏä`/'æVªI¬)u™¶Y7¡Vßã­&nsŽI¹t·Ä›’Kwv‰¢€Í–ñŠðÝ8ñšá˜ *¬Ñ¥º[ªéïXfäÞ¤ç8 -—íZÞd&%¦ Á3ŸÁgõ|BcÊ%y¿Q­ëÎ$oTW/ñcSSæ(Øî¹3«Yð‘!t½'xL3@aý“Ë9Vž=ßhS{‘·AΙÆtãÑ‚W„±S0ÔX §³eMÏó²¡raûñðÁ§…sdˆ¬H [µj e­Á²ßÀŒ5J5„ 2]WçªÊ‘мc¦¿’‰¹CBš)Ê%qmÊþ¬³Ç°Åš’æë%þû”ô{š³¹€w0å†*=‰1êúéÖaÖ€¹<Ñl#¤c Óû’©,À~ æÓ‰k®ÛW2vÔ4—f+êëGM7*öØèÅFcæ§Ö¥/& "a¤ˆn­.Ãdd…Ž[ŒðP‰Ü›á!M·UÙøŽt2ð7UóŸ652¾“Knc|ï_YØ+/ôuÓv¶fó¦õ>DH±À犩‘™‹Æäø0)øÐûFél +e:w¨ ùÈÏO+`‰1¾™} hp¹ZT×%/‹rO|)ñÜlè3cµ`¯Ðw™ð¢ÝW+Á˜9¬­ñÅæên˜&¯ë:uÁ­›L‰K­´~ˆýs/ñ¨²è¼¢2$K׈ šÄY™A‰up˜î…®ßß„áaö±ÀcñÊ{´2Ü ñ„Ô¸E0nîfñPE 5ƒJ¶ƒ`Kµ¢‹ƒ >ƒW\(ñ]Â{V6“ð+<“·¿ÌCE¹uk¥+oXÌQ lÂ{0G·I—×àÑ®x7ÌKx¦CÀœ)Æb‹!€Åt€±ƒï‚€‚oP<s”.!G©ëÉoV^´w˜w&’ö]i¯ Û]Já¶Zrgˆ•?ƒù²®¶ËHUð=0Š%†®¬>“CÙW–&uQ. r—Ðb­­[rS·©ICØ,ÖRr§¸ÒªSO{0Ý­WÚKܸyªÜpÅñ’gñ ¡5Zާ:ÚQr†î3zf ë“óÐkô=T·¾Ç¢gŠOáØÁX^3Tž`»¨2ÍÑjl Ôü=ƒJ{k·žüÓ…¯ߣv'\«Mùxÿ¥ R9Xª#Uušêöï%TR&WG‚™&Lî½j!|¢¯l†Ý̪•€­³ Ÿ/®áêÊc\©œ ¶‰Î“Mé}5‡é‹SYGQz/uî¼æL0 ß@9òÃàÝà3ƒÏÌ}ú3-Kp§?÷_!‡ð†­ ÀdƒI ¼âûòó±zkFn.Æ÷Àqä+ì=ð{ÌT„M‹² ý jÕ-Êj½«#ÜÌ)" »çºÇ‚‘¡f.> endobj 4731 0 obj << /Type /Annot /Subtype /Link /Rect [187.500000 431 224.250000 437.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_enumerations >> endobj 4725 0 obj << /Type /Page /Parent 2 0 R /Contents 4732 0 R /Resources 4734 0 R /Annots 4735 0 R /MediaBox [0 0 595 842] >> endobj 4734 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 4735 0 obj [ 4730 0 R 4731 0 R ] endobj 4732 0 obj << /Length 4733 0 R /Filter /FlateDecode >> stream xœí]I¯Ü¸¾÷¯Ð9€Û⢠x CÃräx2 ö Îò÷£n©û½'é£ÄR±D©#yΣťXûÆ×þüì_¿g¯ß}þOöµÿùîó)?WEÞý'»üyõüº>÷ϪºÈ¾~?ýÈ~œ>>µÿûãÔ}ðùÝ_Û¿ý/ÓÙ_Úÿþšýô÷ö—?÷ÿèò¾Ÿ*Uµ?¿]6•jÿ–ß^~ÿïÓßþýv™ñ¶\¿™—ÿÿ•6ES˜Ë6f–þqºS]ÿüþõ·Óë~«ØJ5y™)kl¦«³ÿþóôK»ÀmúüÜX¥ªÒVùš…*}Y©*Û)t“gÆ£…®x¦Wü“ë¼)‚MÞíœ*Ê´Ó:gg¼\m”íTTÀŸ=ÄÝšËùƒM~Ù97Pú«Å“sÞ¬Õ¦O€jŸfü¢eÈÁ&¿îœ(·›…“sÞlQ7xª2ðo³‡~Yd×såv³prΛ­TßgüªýnòËÎCqc89çÍ6eßg|“—åìu硸1œœñfR=â7-oã‡þ}úзyN=îvΕþndzò™o¥û 0á~8>|ûåôú£²y+&ÊìË/íæ®kv?¾´@)²W»Í4Ù—Ÿ³?æ¹²ʾüzjÎ¥.n[œÉ yGÞ wP¢ÝpΦ*¨Ž(8‚÷!jáìG8‚÷á¦ðÍÁ½9¾ÁëÔþ7gà {M‡‰¾´ÄœÎŠz‘hÃâ?¾­ü „"Á؇oó |R© ƒ1©ÄŠªZqÃæ½ØNu®Š$'VÉ =bjø@øžÃÀ±k([ðý88;äŽào0ÃDˆ[aI•ô9}ÁU{ Ä*ï'ríC·”Ö>°'P­Æ²¯ñE +r(%ަ› êL:oMæèL•f_-ióë’JßJsC¾ª,®Pªõ¹nò—#ýÕOtWoÏÖtqï¡ÐRælt­Ú–ÌfÑl޽•h¤¿ì©o:2«—OƳõ”ï7 ^ƒKAà«·C PnÝÀés4bàHϪ͹°e]½ØAGÌò»ÅM2úþv„\Ã_Xã£ãY è‡!Ý «•a¢kÿ;Àã@ ­8P‰w6ÀtB2ÿ¸?Þæ×˜¦88Kx'$~@àUŽë%Я p°&(BÆ4L§áŠp@Ý(u[h=:΃¯î# Õ‰ŒwËõ¼{Ìk)¤@Âc ƒIÜAó̆GLð;]q㮡n…Â8HêÜúÛ(øÝ ëm:Œ KǸÈ£|Š(õÞŸg$CÒÑ+3æèH[ógÕð®”P,‡í%:A(hGæ`-à)³å¼ŠŠ•ˆúãbˆ¤i‹¨ŽÁßBkÿ¼güù¹¬ÔKøw(¬ŠsÞ˜— {Oй·”¾ ­~x ±Ž-7ŠÜ§x1½aÝKC)S›¢HË !Í-f ›ä8¢ÈŒ]”›[Žé–rƒý ;Ïâ‹#03 üÑeÏm6 ,•ŠÀå^S$À„ó*'ØÏ¼Âëxè>ÃJÙýØ£ÉÑ¡ pD°xÉDÊf0CU؃™8d1E_ Øü¤¸Ôö,p96“\¾[‰ÿtÌî/ åiÀÀÁÈ5ç§ i*]eãÊ>߉ÕÖ¨eGP>G°õàÒŒpRýŽTݨñ\{…ku©£Ê®¾„âùo¾>+¥rø3F Öœ |™Ô Ø ÚŹî0rè¢QÀMX³XOŠ(TIä *^P¾_ÁÙ>%ôIp8È‹àˆ ¹ÓF‚ž‚ixKRY©:¿£0Å×NqûHÛYSÇ"ô)sºTüDØÑÜ”ÔÊl„p©ïxòÖy·Û[ÒÔ¤DÞ €â£lÐç̓˜½ŒB¬.RÌ‘æLúlm·W); TPle“B;½Ó‘¼BÙ5EºDÌV<½É¶p$?{8)U,z£Tc#2e¶¬Òl{š^ŽVQBÂô°…`}`¿9Ý^CâÍ#uðQÖ¬h’¨ÚœjêÖ¹íXi…A½ÌCоþ޵à͸÷qbjSYjÇ·WÇ)ǧš',s^ŽÃÑäŠÍ£¨¶,ó¡øÜÞOazLòù%Ÿ_œ>?‡ñŃä1H ó8gÄÒ"Š[W¾”‘‹•>‹à)}KAµÃ XŠ„”Ï&Ô/Ù QØ …irS®X^k8’lôP|¥è…·)FØ8˜Xè—µÿ!ÉYCÁU© !Ö.&»R?¶W•IŠ*G7ºÀÁoJ¨ÑÂú¼6mÈT‹Ÿ©èÕP ŠI±¸KS[| =isƒ1‰ÿ$þ“øŸ„AØû7Ze^Þ½ß6øqü<áQ ǃ/x¸7My\ªåàF$i9Ä‚ç´nÜ |û"&¦î¸AJý5Á£GR]E¤Œ”Ð…‰„&Êåf±xctK‘¢BR‚¬åG[w“RHêOåH2XK"<ÈFÑÆð_ŽÇƒw¨T5­×øY XŒRR-9²áyÚ5l R:9´ôIm¾ ½H–êæþ‰Í {.ÖŒlŽh,-¿§ˆ«à–ÒåýÇ¥lŒdD…Èf ZOãN(×vÔ6V*ÖâIÒÙ¾X‹äç ‰ãä¡fÆA’’²›;+Jyh»ï:- B뾇çFÇœáqk‰®7ÛÜ´Æ&:; öšF±÷`e[¤6È 2f}:ŠRZ÷pxH\—÷ì¼¥°Âës”¨ˆS(ŵB…„Aâ!«çl3ä+›;ˆ¶WÖSI&¦N¹ä¨‹4·VyªÃ<¬*Ô Ìçµøå}ëÉÚ©‰¹¦ÑJAý—c%õè}_-ÛË“§êZ}{{OØ`»,!SÊ„áG2šñ·¹ò÷hÄÀÙ¢±ú(a•©ø;ØAzŸ×® ˆx¶ÇžÍ`ÜiBsýÞQls=k@¤¸¸sB‰õãM„…)§¿­ÎñÃ:$ÅŸ+à0py`U3 ùhøiHlU l°oONz«=PDÁ G Zh¡(´0ËÏâ½a¥ù¿Œ¿y*³˜€yÔ®9J~ø1Ú2KõT aPrñ&¿f³Ú™f™×õÈ^ áÊÙ+¤~…wí5zÈ»’žóã»Ò´äJ§•sbïPŠHú¶mQ¾Ä¯bSBvL(!Â…B$84bBúëGH†©û›h S?O¹T,%aÈ^1D*ž”0d¯Bˆ¶9$í[A]ª*f÷“CY=;"s†æÞ…ZªñuaïOáàÖã4¾[¿ÂÜÈ*pÍë ’¬Ã¡1íñÊÎfÙwÛ‡ÔÅZH µÛQ2˜½ìÓhE¢;!#rV $oGÖn6°æ¬øª<Ü”G§ÿƒ•F™Ç/Ä£i^ìçØ>H‡á0üA 5Œ5ìëè43tmr”|1—;ÑM•°Ö»R}k²'HGãý ú„oï¶x†`uÏø´1ëAêϹs`R2}Kþg8EèzØÃ>$ò£#?‰.2YK•;åý¬²^Ž€G««ÁÑMɤ\ ÊÑ"P2å¡Ôúå~¼Ž@ L†˜íY:5‚; âàOq…Ý6,ñ^-À$«n«¦„ލ±"†¦ÂиsahÙ”/·9¥)íá!Œcøx7 ¼növ©¤Gêå€Ä‚¥?¥»§t÷uÈôÕàr Í"M¤¯†.î)}!%Ò§DzI»+%ÁŠùDRêûï”ÕÆÛuˆj¿“Ò“œýöÆ–¢\gª™l^Þiu~wÍwK¶¶t—¢ñ ì%éVœ5Èëðú¦g4Sß4è›]•÷kîˆùÆJÞÑ~¶ò¦.ØA¯)Nìº×–'¾éÚÔ7ÿH¯Háo»dê{#ÁíSt}1’ Äm¦SòHâóiùäÝÍ=í—Š@É/Ç í(Õ…—MG…+}Î(Õ FÙýf‡UVû$ F,–G¤x¯÷jð0{w#j|#À^áZŸ/ß?Ú>ÿÅ·Óg‡T #N/[ÈSL¨$¡+‘òŠèèÄ#^å± üܯ›#Þ„Ã+CzID¯¡<Î&ÔàDª%™TX„”Ô ÷æàø”7ཅÈôµºpc©FM”n{$d¤´ãê};F\BŠGÞC{dâÓ#Á1f¢Þžåy„w±K¸[…$»K8É!]]YÎb“X'ˆ°:掻ó÷aA¡8ƒÓ/¦vÖm»ðË%§øÉœ¸ô«Ößh,7á7·bÒ‰ošù<¥9¾…0Ðè›Þå?u‰”¤¸ ¡^ŸÔ±·žç=éC2ö¬Õ@èâ¼›ÑCýŒ< Q¬£ÌÝOx†ßØ‘%£EÐhÙS:¯5áп6kÒÁ)ãÐØw•Ú=6Á)Ý”s%ËÀ'^¤v&.F˜Ö¤Ùö G³6Í.nš{DB>0Î/Ã9·8ïg1“ê\q"®È³á“â|`˜s+UìÈ!Æy†øð:8ûïÏa`ÙÌR†i¯|–2 Ì™Åðud–ãBLMø¶ð:„¬Pœ%® ø@­â‚{4•0u;²¯!¬ðÞ0¾8èg8ã  WdÍîµp×ÃR%“¯ƒ÷†sàYë˜Ò±d€¸£áx+pN¿Â2C”µ®ÁQ;!êÀ*8›¦Ô(`Y°ùI |sx¶]Âz6Û?¨œr{ MÞÜZÇ$oa.ç-ähÜ&ækZÞ{’”Œsëúäs8ÏÁ([¼Äi/½{ûŠfl!“*ñ°FÏã¨Ñ#ø]; ØÉú}ƨÒÎCWT& d¦À}ö;xÚäõ2881¥ÿ!¢í¶±wûúyñ¯‡TÕ&I‰$%’”XxÒí=ÁI²Ä€!$ɲ9î8¤ß(‘‡(¤žÎõ<Æ&©—¤ÞCñ´˜cIêÅ€!©·=îÄnƒi­æ1)I£$Š×-§#I°°Šd·íߢ—zvö%©—¤ÞCñ§íóû’œŠ¶—SCx½ˆû”®‘ÈЪž§Œ$Cåd¨PÇuRõÎÃü Wªàæ¨ã#ðÁ½åeh³©VÐ&‰žq c®+Át†×!dÿ=. J£Ê˜Ä÷ÎÁ‚˜§u‡ÝÄû: áõIÇÞ05D|ÒýÊS­ÉÚJ²%g–-ض ¼¼‰iÖäHHJkVaö.%HòÖÅà¥Ùžó਷C&Sú¶ú`ùšìäœÛ¶ˆ\c±÷×JÅ4Œc„\~s@km‰6]'Åý‘°÷‘ЭCÇ!ùñ»ŸðN k<’0Äsƒ·@‰Æá¼ìw*#?Ê5‘Ž˜GËñI-oŸ¸]BÇâ]'è²(òq Ú[ 2Ü»–Ž…%çñ06Éšüôùš¸#iÓ…))o–P· Gõ&ÅSMø&ùÉŸÀ‹U¶d1¾ êB….fO·ýHòžÊQ­C{Á}e’µ˜¬EAˆŠrH»&#,æ‘daÆåR&V=Já‚5Be!ãMòTã¦äe Çx3‘ŽQ­ ï?ó0Ô´½æy4:Ã'Å‘Œo¤0IÚlöÒ§2aºó$=iìIcŸ½B?ÍÔ[!°Þ U±‹ Ÿ]jzÉnŠ:’ºYUIGŒ‡š¶çåû¤³íá&JÍšxFÌ+)û7a9 ˱w¿u)IµZƒåÏýíŸìG»%çŽ?ÍýƒÙ#5Y=u£Ì¹5¦Ûfúæ_èe]q6ºV—­q©:¶¬«bŒKú¬ÕuàÙHwûåx¤‡‚>—E¡§;îv`ÏÖ\?aæÄ:½m0ñMo OíícҪߞ¦fë,uû´¥nVõG°gSÓWpÄ¢c(<ü&ïÈHy½zB[*Â]þž?…É? µz2÷BŒ6ì ÞÝïµg‚ˆ‹áÝ'ðN͆o¯Ï£0°ÄYzçÆfÕÒqPæúÑ9ïµ`àã]Sž€$V¿q „ù8äxú·‹ÿ©ãnGüâŸcúfŽ~1÷í*®XåæÜKԅ첺~¤×-æôŠìÓéÿPoR“ endstream endobj 4733 0 obj 4888 endobj 4737 0 obj [244 /XYZ 37.5000000 649.250000 0] endobj 4738 0 obj [244 /XYZ 37.5000000 649.250000 0] endobj 4739 0 obj [244 /XYZ 37.5000000 195.500000 0] endobj 4740 0 obj [244 /XYZ 37.5000000 195.500000 0] endobj 4741 0 obj << /Type /Annot /Subtype /Link /Rect [273.750000 210.500000 405 217.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_simpler_enum_classes >> endobj 4736 0 obj << /Type /Page /Parent 2 0 R /Contents 4742 0 R /Resources 4744 0 R /Annots 4745 0 R /MediaBox [0 0 595 842] >> endobj 4744 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 4745 0 obj [ 4741 0 R ] endobj 4742 0 obj << /Length 4743 0 R /Filter /FlateDecode >> stream xœí]ɮܸÝ×WÔ:@—ÅIðÐEòhd¸Ó Ý8½Èï§é RJ<"¯†bŒÄÎÓEÞáÜ‘ä›?þÇñ_¿ß¼ÿüŸã×öï÷ŸÅ©rÅí?ÇËŸï^þ@×§ößǪvǯ¿¾¿>>ÿ÷ÛáöÂç÷=ÿëG}üËù¿?øûù‡?¶¿tù…_•ªÎÿrý»©Ôù_ÅÓß—Ÿÿûð·?»ŒØ}®Ìëÿÿ6e£íe#Ÿþvè–©®~ÿúÛáÍa_±•©m}TÖØ£j¬>þ÷Ÿ‡ŸÎè†/NUª*mUÌùP¥/_RJ•nδ)íàC×?q†Wñ·Eå’ ~›ytª(S*ÿè™kuݨq Èÿ4z ÞšªI7øu汉Ҳ“³Ö¨yj—‚µOÃ' ¾K*7×™G§JÇ[*[œm\yüòÓyr×oÞþúr&Š;~wqK}üòãñE¡ìŸŽ_~>4§R»nŠcO Ÿ¼‡OôÄÔðïá g]†¯G¹ðÑð¬ñ;êà•¾%æù£ŠpŠ2µåsªê™>¼£ú¥/i ðW=vPÐ 7²°ô/*òÄY~0û(˜—µ)éUšÚaš“> |±,šîšÚÄÜÀše>C_Lè[eÖ>l0bvðñhÌÒÛb]¬¤éí¥ºÉÍ‚È$Ià„¶´u϶EÛ;ô0oáÚð;]Áß´/Mx²O: ëÅ› Æ1ˆ#”ÅbVêŒlFàhºšî1ɆøT*†±¹Q »+(bát,¯É8Å‹ý¦¬ÊãBÒÌgÕô-N†œ;¾.E0®ŒP¼‰õŠ…—Oê 9”âò$ ­ŸæãÎ@FûéÒöh*ÕôØ&¼Á/i^³ê‹dzÃ[©Þ7“ø®i…Bº/)öç%dƒ¶}6P}«LŽŸ#c‚Í€†cO cÜâÐÞüÂb{ƒ@ª‰É{bž2>a¶÷Kä1}+—K QÊEÎÄ2)?bX‰Û̵€éázŒ ’˜ZsLBæ¦Û 2̯`o”DxÐTƒ¸Jh{$>^¥À”Sܘ6u;0è›î›\õÆ#bÖ!æp£#ïMIÆí„ŽÛGÅDDX}0[¢îohù#¨-Ý B­ DMÛ¤6*q)M€°(û¼·‚;Û=°æÍ„æco²žŠ-ñ1B3M{ý€*rü¾fS°ñäa¶ŠtzÄ-ª§èxÌuìr%e·¥®ûæSJ°VÜÕIqŽsï'±ÄKÔpSÔÛµv¯?y¯ÛcÌaú²ï)F-øžukÇq½õÎ5ê&qåI_~Ïû:W=iÓ÷Ø‹¿gm0l a gàYOið>¹Y§ÇµXl—ZÜÓúúv[ÛŠâ>J•Ecl·ÑM¿·Ë¨úµüDÊœà;U©â ¼åœ¹9Ï÷¬ÏØFvÓ\)U0Û¬¢e¶&Ș©Fe¬í *Ó1w0zäKþqk¨Ç¨hßÁ7Z Þñg\)¬'ž&!­<÷!â[Ó±á|2.3ø‚9Œå#œµçæx|×)s×»ìC÷ä j Ö3Ï}Ò pýoqUØ:bŠbÙa8õ LÏã·—_©ÃœÃ£m’Ö¬‚HÏNä:¬R ·!Å[aÛûbÝ©hÌëwð·ÉEÝ=ꛈ°n|&GMõD5ž3› ¥âîÅÃìœÙÚoªA2ð¶åSÁÐõ3Øa%Âxyœ›H‡2rY›qÊË"ëv…ž³îÅÃ&­à wÆB žh5ƒ'« ¿dhe'PdŸAŸ }]³úâP£ÀF9¼ŠÄ§kª¼ß¨‡}5¦‘–Økã¡(3(åžïìsRn` \‡¿Zªr†nRúŒ=:,8õ ãr–eQËP7C’L´nÐ 3­æÄuÛ´aLyÖ#¥ø¸–÷aòw¢låÍ^NÛ2¬Ý—iæä ¨';à ۧl\û±3ÍÀ+ÅÔÁeíÇ‘7Ü®Ç4@zæÆ´ áVBf¥˜ÛR–ÎZªuó‡±ÈxL4.õTjV^ž‰?°ŒíqŸëaßCœwÈ–’Ã[œã$ªè˜:¬íÕ˜§Ò?Éâõ˜ _ WogðTÆ~˜DÑÌâOGÊñJq ö8ÔÁÑfä >›¤S2ù8mãô¶s:!r•.Kl¶¼ýóË:‰nR]'Œ€½e(W€5BùAÏJ³'O!±¨WQÏé±ËyÈuëfŽzrÔ³í¨§.¤û s¤´ )—ªn úõµžÓµHÉQ™ðxȘ¾úz¤KóLÜ@TŽ<õ!—ñþ5à (¿ž©‘Ý ÛgŒ˜ Ø·#úH™Ï^ Ì|ä:áß.¿GØsÔ®‘å>ºU÷5rNƆZ;.ùI~’Ÿìò cY¨È$jOsd¢TDÊV?\~äÞÉh³œ³óLr\SÌékõxüÄ¥D”¦â¨‡‰WwæÓnws£¥­•¯Á)uÜñ&Q:òÁG¥›çœøœañÈ>ú›ÀfØÇÀO$íkcæôc‰Ú×*Í9*Ù¾®Û¾æÌŃídnñSY²Ç²Qåqè&踳yÖÀìyÆžAÖ3Nϰ_î¹bER7͜ڑ ÇîŠjΉ$ÙcߪǾ·•®¥úÈÖ¸¢?;"G92X…nf ‘õ³”Jéäh«1P¶9 ëÐAo¤nâT™ë&/žä“éE$Asr¦{Ó³mžž½æþô½y‡ëÈ(h-݉Ÿ5} š.ek·éxîv“´¨v#½¿N—:úWýW;£:·ÞtábUº+úŠéòZ©‹T=3ÀWÔÚðY{fpSÚz”<—ךð'žÉ·'S÷cãï ȹц÷>ŒIìàÒáduÿ’á5ß ¿cToŒè ؃eÉ#› 27‹ ãÑHk•$‰¬&´b®0=3ÖúÅ/T_.Ž/™ŸEž[ç¡ 爇dzRÂîx†'tØ8ø;–C.tg,:a]ļ§,Þ+of´6< 2^”[…å΀1VbꆇsØècŠÖn ·oø T7Ü3 ¼%ÞéÒ¦}i“ô†U©Ù·¬R~ØtýÖïU™σÔL,‰á—‰?±1Äú¥G<Õôˆg:B¯Æ¢¦Mã(­úY•$‰»”z¯mÓ×{l^ü0ÆÍƒ£ +q‘kêt¢ "E„–Vø»„¢yý-WšRªØY³^S*²ìà'Q³7ëžz X86!âAʪ0d#fÀx䥸Qñ*ÒìLZ × -<бUÙ7JqQXŠâúø}G‹ÊÁíÄ[ õÂ28ŠŸàŒæ1ŽwpÖ‡a6–L8kO>Ç‹L 0jFÊ3,Ř„]ËBĵÛë³§9—=ž)Ih-›jÂUˆ«”íè/–qx=>‘îòˆ:‘Φ †“”㛓 + {6¥ {«¨í6¼Ïý bý Vq_ЦhDMÚ6éš …„9O”Qs#ꘙŒÛˆ:ªä g]žòéæªCŒ1xoZÙò½<©Ò9“]Úsy;SŽ` þ›KóÁŸ±}YÜu¥d\¨îé±~„ŒGÞñÎD¥øâH¡^#ªð¥УÁîõìm=í“Î ¼D|õ ño?™d*ÔtSQ:×7-¸S²L© ™x(ï6KÝaŸ‡IÃnjéR-NÐbLJIe -Ä“G}ƒI5„É Ú]Á®>]޿今W?ùåðÙãt§ñÖ¯sèapÀîL¯€j –¦ÊÄ8¦îç`]D·?Ž,С£LÕ“ ƒ<(¸ÔqL—ˆ¬Ä7UHårвçdäûžï?œŽqÔ1cä­ %5J'ݲIÖ”¯?yhÆÌE˜ ßÁÅFüŽúßiF Ö½Üù;HÞ)ˆ<Ý„2íiúð “© ef ßÁ³Æ+m ¼²'­zÚíV(üFõ¤¿Õtœ{ JLxx…ÑS7=FÀù²3µ5xB'‡1A,ÕDÆxQB‰j¥z;Ù«KÖD ˜ ¡©ᢖ¹B\ØÄ'¥2îètRïîÜÕþí÷±@xüÈm÷tÁW30MôÄž®j|qÔ¾e.¯Œ{ †£Á¹á <Çü`Š—jàNy|çÚѸ×sám#oµÉÖ£Údð%g¾Ìõ Œ+P–ñÕ¶žËÇðE‚W&¸ç˾„áq.<½°& Ëá¬-¦¾#žüž›ÂXŽm-ÖtlM ìx®&!h€ºÃ›öö0E±ì0œÃçAŠz¤ Žæ9 àöò+u˜sx´MÒzôZœ¤vj$…Rêî¶OËE»?ÎŠÆ¼Ž»qû †•îõMD¤2ùŒzеºüö¨œ0+î$U–ïaZú|FÉôDY¹×‹ r· vv‰ds?ÞšïÉ]õ-ôÈhS3ç–ά±50ßù)ÚïñfÏJ͹Ù3ësÖgQ}^ý„:u}÷°_eN…ºôôu—wn+Õ÷v‰Üæ]Ý)…ÝòíºÛ¼ñâÉ Êá“¶<¯O힂ԾÍà^ùúŽÛh}onÛ•w£À]-.Û¾ÐàƒCËá[ŧ«à’òe(<|§­‘ª ¥WÏbË Üåßç¿V‘{…m.Xl°ØŽÞ·ŸÁï¸#¸˜Þo£ÂÜÃßëQcm ±$ ÊOk–îIVÝSfŽ a˜žÇe &>ž5£ð„`PPßñ¤AÛTm'L©u§üª‡·<†òç~ ™ƒŒ½; «ÂœZ‹:!ÔéG5Žº ŸŽŸÿ§„ Ì endstream endobj 4743 0 obj 5012 endobj 4747 0 obj [245 /XYZ 38.2500000 764 0] endobj 4748 0 obj [245 /XYZ 38.2500000 764 0] endobj 4749 0 obj << /Type /Annot /Subtype /Link /Rect [247.500000 656 315.750000 662.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_advanced_renaming >> endobj 4746 0 obj << /Type /Page /Parent 2 0 R /Contents 4750 0 R /Resources 4752 0 R /Annots 4753 0 R /MediaBox [0 0 595 842] >> endobj 4752 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F8 8 0 R /F9 9 0 R >> /XObject << >> >> endobj 4753 0 obj [ 4749 0 R ] endobj 4750 0 obj << /Length 4751 0 R /Filter /FlateDecode >> stream xœí]]¯Ü¸‘}¿¿¢ŸLH}Pl  ÈC°‹™,‚{ƒõæaÿ~º%ªER®v°±Ì¶ÈÒ©bY¬*þü§oÿuùû¿.?úö¿—_õŸŸ¾½dWUfÝÿ]îÿýd6ÈúªŸ/ª./¿¾½ü¸üxùúòõö¿?^º¾}úËíéÿ/òòçÛÿÿãò·ÿ¼5þ¦ÿÑý¼½(¡n¾¶6JÜž²ÇŸ÷öÿyùë.ÿ¼÷ا‰±ÿþ“ÌUÝ´dL ýã¥ÿLÑþ÷¯_ÿùòsÀ¼Q Uª&»ˆ"/.¢)äåÿþûå÷Û}÷Ùµ)„PU¡²%)y©ºõ/ä}¸º ÔþÇÔ}„Îk©âuÞRÎŽŠÈ+îýö¦hªLÕ|6Ç–·¯RwûöïùM¾«¦ê[ûeþÓWçÕûŒøÝ C(YÍmLøl“ñ˜´B•69ªêG7žJ“ß».=ËaiGGƒ™í±@rXòf5øP2ñs»„ñµÅ«aÕÀÈi¯Ú7_Ý®²í®-J‡Y:ãzî„Hý sÜÇh÷~ ü¸¿YíÓ¸´d .I(¥ñÑO¦œ–£cü– Å‚2è)1!0ÆíAv#46O˜‡o]Ã\hZ2FÜäš\²ȳڕ#²º¡2_y]-W>yíГ×W{Ny´hbãcÿ´UF‘Ñqxb«¢i”L2Fì]<ßL´ºÕ oÿ4ŒhQ¢8R =%&&¸ÝQ ‹ÅÊÍ!…džWÏ­Ÿæe’1pškþåþ®ƒÌ7Aþ®–ë§R8ô”âjO4OƒÖíCl|ÌჶŠ*2:Olý4’Iƈ½‹gŸ‰VÛP<¤¶É»E‰âDH€ô”˜H˜dàvG?,+?B6‡?^={´~š ”IÆÀi®ùWš›[³=wX7Tæ+¯ «åúI¹{&ån= ZC¨ñº—søÇ ­¢ŠŒŽÃ[?M£d’1bïâÙg¢Õ5ä½ÔöOÈ%Š!eÒS¢ÀV·;úa±Xù²9¤ðøÑðêÙ£õÓ\ J˹TzEi¶ÓMf²ó¶Ý†îo£†þ/÷7^ûWÙœ²)4Má·_^Ýža1‡b6ðÁâ ÿÖ5ÌÅ¥%cÄH&u-³Ü«®ev‡%Ï«Œ®A™¯¼‚®›3i:QÌ1DÙSa<Ù–EFðš@˜Déôþ÷Ø 9¬y³|(™øº¦ü¶qµðéîÝY3< #Z”Ôœ˜Ô…CP‹„IƸ¡°èò¶ó¥9äÎl[Ï¥·îi(sàÅK )DæéýÍno娩݆Æ!ÈÛÕB„„°%ʤƒ§i¬§Â$HðÉÐ3@ud¸£¶ ѲÙóf5ø€²ryË¥¼EåjmÃeéM«]µo¾º]-7nR Œ3;—u?®ñ¤’ìw#â#kÏh­•cÇÿmÎ|¸´#Þ-ÖÒ-"úÉÑuNƒ1~¯—0&‚)+mï-æÀãeJ±¯+V„4OüãX†!‡ÚrMCÓh:Jÿ¸”°l\%l¸1-mhµ«öÍW·«åFªÈ€ÌÎ Ñk\Úï«àýä)§Á¿WÁ ˜ óÁ”•¶÷sàqCfJ±¯+V„4OüãXÆ‹!‡ÚHMCÓh:Jÿ¸”p!]%l¸$-mhµ«öÍW·«åFªn¹òá¬4žLœ´ÿ Ÿ²ðŒÖ-v<üðÛFʇK;0âÝbÜ"¢Ÿ#å4ã÷*˜“a>”®ç­t“ãÛåæmgDHóÄ?Že¼ør8¡Ô44íÀ#6r©à»Áo¤ìö¦§ËîŠÁH•À×V>|Æ“åd|âD¨ß®³Zü˜xY`)4%€\J¸,]%lÚZÚÐjW훯nWËTå(••êÇ5žÌ`Riÿ=>íðîh­ÑbÇÿm¤|¸”e€w‹Up‹ˆ~rŒ”Ó`Œß«`L†ùPY.ÐZC`„Nh#5 MYúØÈ¥‚[Lì¿‘²Û›ž.»+#e Ù{‡KÓXO¦ Ò~9"BÝøîpÕâÇÄËÛHù é(üãRÂUí*a#ÚÚÒ†V»jß|u»Zn¤”?¬XÖq‡'eì,íw#âSûFk;~øm#åÃ¥ª¼[¬‚[Dô“c¤œcü^3`2Ìe¹@k 9ð¨Ádš¿+V„êÐ8–ñâCÈá„6RÓÐTµ\*¸ÅÄnð)»½éé²»b0R¦ð˜½×‡'“kÎ˪½ÃuV‹/ l#僦£ðK ×ÂUÂFȽ¥ ­vÕ¾ùêvµÜH5þØrÙäý¸Æ“V.í¿GçÞíþw~<üðÛFʇK-¼[¬‚[Dô“c¤œcü^3`2̇ÆrÖsàqƒå´öuŊ扳!‡ÚHMCS ¹Tp‹‰Ýà7Rv{ÓÓewÅ`¤Lá1{ïpiëÉtAÚ/GD¨ß®mˆ€‰—¶‘òAÓQøgÄWY§*¥.}# Å_Ÿfè>Bñ›JÝìz´Î[ÊÙQÑ•u½_ëJª¢Ìš>/ú®ZŠ4¡’ÒÐ{ –ÔM±ó;åÜ ôì†sNå¦ÐÓáÖÈÏ£÷à«,b®ŽrnPzÎÂÎ9«îUN:xnüèÝGè\F,ÖQÎŽŠæm wNæÊ›ñg‡îcà_eDɹSËzçdn%´ô·ßù!ztÿ:ñÌmG9;*=sG½Ó &¥kÅ5^üøýåç/â¾'¼úý÷qí˜Ýßo ”—Ÿîµ"³âòý·ËdYþË/ßÿñòùûôe£ÞìSãRVÝU?¤è†¼ï…*Yv¨t¿È ý’©ö—ò*«î§áÂ;q8NŽ~Y×ÛmÕäÊúE´¿T×\´Ã½}AˆOí/êš7™3ŽB½ ¿çüSÐp‰’Â"kE¢ÉdÏÏ=1•õ Ã1yaí~Qq-rå PtÿôZ»Èeý"kØ|GóÛ÷K×[~-‹ª¶$!+Ð8ø{2@ÑR*ÊkæH\ööö±{Gö?=Aüôìw>ëÙËZØ`ÜrÈŸúy&ãî!ø¶`ðAŸžw@6×Üÿ'w>=ððÓÇøf¼KÀ~F'ù÷ƒ1G?>ýO÷°¶³tAÞ@]°aè+øŽš?‹‘%ˆh§Ê¼q Õ˜™Ø@uP„1¨p¦eÆÔ&ØÎI%œb3ä ìž"qóO‡èÅ Èû—–i\<ëF\Çpáiˆ?S±9ž>3”ñvÍB‘ïrÝ×pp žÙxþâÞ°²¡hŠ&È_”ulDS(2™;¶0öÜ!PÌn'î¼¼‹Í4e7ßÁ³"X£…íퟎ·‘¤O'Xr’=Ø @1Ô$ÆÖ‹“‹Û^*)¶³Äï$²[5[Â\&­ñ§¾4¦å¬ GŽŽ¾è¥88äG¤m1¿îÉç}EZÕóÚÞIõ/‹w°X ¬±Ä;Ù^¥YŠ'`6¼ËÃ@X9Z>,ËV‘dn(ëv÷‹yí\`šÈ:¯i«&wlãÑñR¡6«¬î?’þÇã`n§òœPVqâûÙx²úñªšäFYÞâÞXgMdiŽzèsÛ&*éØ&Š& È8aqO±t3<ž¼>¢9¾C,¬³€w ¿¹é°ú–?7®x ©´ÉS£ð>ÊZ—ÿ²‡UÀàPœ˜#w ÞƒSB x½ ЦãÞæøèË™ˆóæ^CÅž8ûŠa™ç@qµ³X¤úb^ë…•ïÞk,]¬A&û<à"šp¬õ"ÇxÄÝM !Á˜cÇÓ‡àç\ …ëìÌE©ò‘ýÄî,¬8!¯Hn <R^~+¼§3Šs#J"€7,a—‹ŒõƒŸÓyTÙ“ XÏx´-LTŽåÙé¿ß«8úÊ‚<´Æ1;ÝÀí9ޏ¤,jþYåš.–­ëŒƒBH)Ý–ºIQ°„wHùš¼‡l’( Q©Â¶ZDKM6ž·¾_øË‡ùïL„ï`Ú>Áw>Âw>£_$¦S &0ˆ¨LjQ»üeuG„~g†! äÂðºž÷uÚ–ÞÂ5ÕhsFñRÜÃ=ß È<嘊 ¼æv«ˆZ7ø œiM¯¯OÿÍ `”¦¶1ƒ‹Úe/ïFf{ç¸gJeðKé)•›Z?ñª Ø(ñ–ÞIdÌ÷µ±á]þ=Ÿ@ËG Oª]3ö=1¶1ÜÊÒ1¨©ê€œë2æuÙú™oïøDãHÉ~«ÅP£ U« ª,/m‘ôñ#Ckqý­>~|øthWWÙ¦Ÿ›¿(ÔÛ¤ù~hŸ·OÒsÂBR€¿4ûˆÅ´³²ô|EO‚‹NDËËÊ•°è Ò‚we\Êù2Ž{ÃüÕs)î‘Z?·+Gƒ¿ë30=·}¿À¢€¿@D‹ Ò©Î‹Ø ÂÇl|ÈD=,ÌKõCz­cOàÚÁie4fpI6’ĩȤ˜ÔWWnhõ¹ú9LªåodW+>z>£iýò;”­[à´ŠµMq²ÀçÍ8€XÏ™qϧ¨â]?)úcT/–R‡‡’±¦‘Êн_7Mb-µs^8Ö’³dwÜ5•È*—x—A¼†o˜ö¼ÉŠZ§nfmY#n0b;¦ŒÏ—ù„Ë£®z«º=Ïõð¦×çûdçE3žA‡ÒÔó²[YSVÖW+Û™Ý)w»B<îD;w»Ý.îMbÚèd¸7¸¨À;äï>ðN"* „”ðK{H[þ9¡üçr’¼Ð“E¼»ÃÞŒ|^Âq Äâ'¦`’'¾Þà—¾'ÿÌ GOÿ̆ý3]ζiõ䟩]I<½0ûöÂð„®yæ\5GÈ5ÃéÔ,5Ëy³Q攢8\5ù' +U#\}’vͳ LÞ0èÊ÷âQ9uã©OÝhÇ–d…£@ºIŒ 3²0«Ùhs°¿RxBæò°f[ÈÚeQ”ÔÖ¸,z¸ òSwkù¹ƒáÖ*›)è˜g¹‹=Ú=¦4Kº–§ÄHÌð™Ô®x»+šè¥2H%n0:„¼©ÐaÉæ!} ¥ZQm+Ónˆñ,¸ s+Ë·oïßvðUm6¼¾| ¨Û8zúN³zšEk‘N~é…”â®j©ô‡´øðwâJ¸RÀÇñCúë¦pWN‰®à¨„Êcn f)ÐÀ•”ëï(zõ0™/2_+ †t{'¶Ó°7ʧÀŘ–¾Ì—.¨úOÉ"%å±².H’yå(5gܬÊz“&sMäÍ_F©¬õÂéºóxcK.ƒdÅÑϪâ,~Ò%3ômMäH[òP: [¸ÝH°u(”û©êãIQô2¯k©e×J {ž`Î*³*‘UP´)µîJ4ïqÍ5ü=ÖŒ_i®RµÃ+}Ìëá¥&毞…»Ö >Ü!š ó /KSc°–¹Ãù³Šå)aq‚ÍeÞôúàL¶¤-DY\D &¨Öó·ºv z¢óáûeõlÞ]Ï»4z­r®Ôy×zmË%SŽ©Yâ÷~”Òº%ž±q™’F¯5âÔkOèµ£%ǦR#82sc aD ÄIn¬ Ÿ”ÚdX³~é1íèCÝt$²|Œi¥>‰MÌ…:mâ;´‰n㌀Ӿöm;ömP]§}[`ß hߊG çißNûvÚ72:õ¨Ÿ¶—d{‹¨‘CëOÎD¶÷è0¾=’f5Sçjæ9ª×Ÿéë¯f0Ö (r@9#Æ´a Ô†¹=U¶ñ\mrÏ’Èk½~‘R¥J»”MþyÇ\Ê&‡ñ *"~òs!-Qò³®TÛ=‡ãœ&n!ÝWªîj™¹3R³R%×n/5p…3΢…Ï{–øy 3ùYÖŽ¡;Vñ ÑÝ"³lU²Š'©Á†ŽõÖð(éב÷+Méõq*A*]ÿoø6^»BR‡Iªr+WS1;Ù¶€pÿ'Ô󬛱JÆŠ€·Ç’tò—˜éÒÅþ¥´S­Þ¶Sá%ÕN€Tš>­Î[VŸò–R˜³qÇ|:—Iïe™$dîz¹ÎzÌsŠÈçXõ#-ÈD^ºKѽ­Èz/oþî—]±î9Gçâ(Öâ(òeYã(‡óÐs®~Í›ÊU°x§*h\TýÖÉÎôγ¶Eø­tÖW¿HQ9⸙@«ˆsPªÂÿÕ© Énó0e©5ãj–ËPâž&Vt+/?ÓÜÔ;Ìã¬ú›zŸ™ý3êrcßKÀ+ƒÏ5ÐP¼bL¹X‰>Á³§¥œý&9d¬ÝyzFÙÍÕªR.†©veö¸—Öðf‰;(>3Á‹½ÕiÓ‚šF*T1![†²aÆ™p߀a_=ÿYÂq6Âû&_À{Ê/9–Ìa¼ù§¨„®vJúLÖ0—.@~ëe<7ÅüïÁTcùÇY83/g;cžžÕpa8EÊq¦mÊoÈÅ‚o85{0@[JÍ~ÛvšýÔìÑ4;–ÿÍkö!)t¿š½®ßf/°”xx¦âyØÉf7®¨°¾u ¬Û¶\mjã6Yej«k%«%ß°ºM•˜ʼO$ÙølmÚkR:[^¥Sü/%žg‰ôåÉ9š.§p.°ŽÝÄjU{RØÕÙCñe¢3n©&œŠPnef¾Mœr@O9b[ý&b–ò”cTÊÁ'>vÄ 0¿pT%‰b­n‘*¬%Xt¥wÏñ 3 §¨…D)sD¿/OÃ5YJ&C?BZßÊ©¥NLLܼ 1Õpðè^Jâ ‡ á5«yf‰âp‡õ%Š’üÊ[ªéùˆqP ÁH“ò4ÖÐÂvóéùpJV¹>ð,óµ>å5kr›Ø°7}«½¼>dxJp-aµCJ¾‹¼tŽ_§£íøà›´„Ä,Úem³õõ eXt—ޤ…ïq$ë²°eÍçœÃ:„ÐIÊÕË…)tˆŽà±ºú$¡LxÀ¥ˆ¦1¢82Ÿ†x¼À¸AnÅ<= e[à_ð÷숙rÄ€âÌõ°wy@ºGr´‰e” Xû')ÍßÛPõ¸Ü‡…bDpõšB¹Î‚`])ò ¨£yuM7¬7 Õ¼iªñLÇ…2)Ú£ƒÇÁ’ˆ!è J–#)x‰ ñƒ[Âz%J‚íGt‡ª>BmdŸ‡ý$­)åü‹²™¤¤EŽv{¼Y—‰Jn¥:H\ßcc@@4¶_ýèçäçʼn g%Ó÷îÝ@2o~LJmJñ>ìR!¸úÞÏmÆ”%)’É¿ºCþ÷É-|÷t@ÊY&q6ÊúÕVðAZàˆmõ<•Md!¨Lœw¼ŸólÿólÝlŸ°ÓXeBLëW¡Lå5<¾/‹5D”´Ú^ÏÑÂ=ñ6q‹÷N}‚¿ÀØáBB‰dÉøYÝ¿sx×ø1_ÉÕÓ¬+Éì“Ç_5ïEº‰Î>7tƒO¢£»íÙà]Ù|0@9j x˜Àë4Þ Îbç¢ÞðZ9Úx5 zJ'“tnúBÒçÏl˜7Ž”Þ8.] „‡»éø–|{æyƒælA0Cä;´«m¨{ÖÃóÒûÚù´ØŽF¾+ŽR5ƒwÃa”ðð_‰¢/'ˆ]ûøP>D8â ðfMìóÀhõƒ_D Dµ¤¬d@b)ó(ŠëóK9>,$”‘>èÝ[>ù‡r¸'g[ÁïÙxÁìÛb¶\07×/ùºå2껽 Cɬ÷ü¤*L©dÙ¸,}Ÿôé*bÏ@X©Ÿ¾ì½{ ׯ¹³ž ÅÝXÇN#”M£ýPêñ’Žî u ç§CÄ<ÙÎGæàÇ`Žÿ‚â3é—Ž\Á³–.Xï-"5¢(VªvÐ¥èF©tI)ççÚ [ÁvÒ|F ()f¤s¸uoG$GI_¥¨DÖ•h6U=ú)®-™tÑü€Ø7Åš‡ý€ Rb Öý¸äYÛ–*ì”w•ا&Jº%iÞÈ«çk“®™ ¸—(½a‘¡GÈ'ðªé­‹ åynž÷Wïó<—’4N±Š¤Úp§]æ®BL©ê—ª2'pFO¹uŸ’¸‰ÿ¼ìKWŠ Lý’†RõWñlØ¥.?#*ΈŠ0ÖG‹¨ØˆV¬—\NNÒO„Ô˜' ¸„úòïÙåý ¸Î­„òXÏḖõuçÑV»Xz×Çú´S‡³S©J™%ûÒMĬY_¥”ÉÈçö¥Å¢xè]î9ÎHÑt‘¢ÛXíÕ’ÈbÒ/çºñ\7nbÝx4]s¸ áV-wàld5U“ˆlc5UfœØûšK)Ùñ™8K-•²'ݼ`B¨Áž21H÷êP"FAÒë_ÚK ‹À1))‚ÄdY9Ó,Ê*+¢žMé* J¢¡ G ‰5n8@õlu ÛjîûMG’ßoÅÒ§¬¥Z*=ð8z¥Ó¶òÚÖè1¯E1ŸjJ²!)”’ÂB&^ I0»Þ…¬™ÌÉaFÛF”bVŠÔa÷†ÍåÕØxµEH@¥ÔúMuoÕyÃæ õK¤%)E,õ¡Ø¼[u±ª`Yœmteʆ’YíÌôûžYï8Ç'‡“·^ÇÌ8’êùóYidð>„~ÔFMë†ÓÁì‚ \†IR®«™å‘íK˜’T•ŽVØYHÉ–S’v`ç~ži?›Ng h¯/Û6•ªê‘3¾ñäª^â¸O-&+Aàa¬÷¾õðM•©é™q&+A§Aë¸Óuð™tÚ‚„¶àpáµ›aUrIš¢yûïòãFRâ¯Sÿà díûœ\ä×›â¹Qx‘K¤;ýíów+§¯ã¾¼Ê¶ îx%]Ñ(È«.ÅmÌ´ŽŸ·û4N>åôÑöE騸žØË] $eX¡?}ôZðq>Ùñ|†À½Áw´ XÌútc;J¸ûóâžòÏh,m¤f‰,Ew×nŽùªM„Gp1ÞÚxàx§yãÀïSqU\’åG›pŸdÕÎÔ ÌÌ)!œ7ÏyÙ‚ÁÇTS&> endobj 4754 0 obj << /Type /Page /Parent 2 0 R /Contents 4762 0 R /Resources 4764 0 R /Annots 4765 0 R /MediaBox [0 0 595 842] >> endobj 4764 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 4765 0 obj [ 4761 0 R ] endobj 4762 0 obj << /Length 4763 0 R /Filter /FlateDecode >> stream xœí]I云¾×¯È³—O\´0 ô«®60‡Ý€ÆÏËÀ°éñaþ¾3KRV•Sü2HQJ¹aw»T¢‚ÁØëÏ¿ÿö߇¿þëðóó·ÿ=ü:üýüí©:¶uÕÿçpþóÓûèî8üûÐvõá×<ý8üxúúôõô¿?žú¾=ÿçé_ÿЇÿ8ý÷o‡?þ×é‡~éü ÿxjU{úûﯻVþU]þ>ÿüžþð›Ã?Ï+ŽŸ€ùøÿÒ¦ëšæ ÆOÿx·©^ÿüë×>ýÜ# î+¶m[£Ê{PÎêÃÿýùé/§ŒËWGg•jÛV÷|¨Õç/5'ô(íN_==÷?ôúGfy%¿xW©&Ùâ=äâXQ¦QáÕ·«×#ÈÕ)Ð?®žâlUcÎri¤ G‹—ök—Žm{Èű2žídõ¯1«`PúŸ€+äÀ‹¿|úù‹²ÕIš4‡ï9÷úÍþ¯ï'¤Ô‡ŸÎ÷Ʀ>|ÿÓá·U¥ìïßÿö䎮Go=© z¢AOLWûŸ8øø$5þ„ZuðOñ¨®öŸ@ĨÑðgøž)þN…¿ƒŸ`Œâw0x?ðL1®T…q éÀVñ;Åû1ð| ÁÁ¦ÇÎË÷“ÀJ.k:{‡¬¡ä¦ ‚–±L |s-Þ„Mãb¹ñ9^zc ‰a«„Ò?–U ¹ ËhB:`Íby« Ôy»ë‚]ˆëL!ÆÜ)¶q²ík0—Oƒu•¹C™Ï!µêáìz,±±]!Èr ~‡—Ô¨{ „@C=³^‹²kÒØ»m¶Ûf[äçÍY³º9ŒˆÑB,–Ö­ÄbqªÝ-–Ýb™uc]¯ÅâL³[,»Åò ÃÏ»ÅBžÏj-Wß‘Ìj±´c<Ë—›Oò@êŒ8~Ð'muþdWÙî#)ªúX9sÎÚöM¦îعê?>É_{Ò3P}4ºS3ßܾÝ}Ë÷¢,-Ucš¢¤ës¥d;å©­<ÆnÎQÞI¨Këºó•)!ÐÇÍO#)Ù)1š—¢ÄµúäËü«Xø´0H”(Ì…ÈÖ¢pƒ ÉlU?¨öD ÁµÆWpFù¢Š•l¬»¸À1þE%Àlþ­‘¹ç1׺ÉÁ1r;d°äz÷B§*ý‘‘ tpLbw6?ñ; 8­ÚÔr]ç‚ 'è€Xq]ÜJà ¨(;¼xÒ÷¤ýíáEéðâãH;F¢`¼ ;÷¤øÍ%Åœ„nË¥C=µj}|<Žø(ÅíwíÆbãÍÏŸ¦þ-^A6ÿ]Fç\ui¤în^&“^&MÙÿU†I5õÜBuJÿŸ5ž  $Æâ 8f1 ŸÀ dUZí|ž&ññ”VÐ8!!Õ6•ž­ž3 ê’Ë|v­II}â*$[:FY–L(A–B£/¦ %E×ù†|ÀïÏ •¸ÇR^wÙHí⑨Å2°s—Ãǃ–™ÂYTËš‚I뼚[›Á¤>fEe\èhkía­àNÓ[F;ŸËjhpc· ôPF˜Dêdj¸T[¡À6°e/{»bVÃZTÔÔ\>í*‚î¦4tëþ“²“ŒkRéîIm›Ïm.6,fFçîEüš¥¬ù*œRƒ´ÖÇaú sÛyß Ø¼Lu ¶A0߉ÊEÆÖ‘-¹i?ƨºÀw$2V,4pd UÖÕc2c·1£/Å˸ó 1! 8 ¡ø®ÿ&z—­Z­ÄõÀ¾WˆQ 1Šýµ NàÛüãŽyxÆÚÛ<ÃÄ_ˆŽvÔe‚^,¤—Çá&Œª›ÆÑÑ+Ñ‚¸ìËN,£qÌFt¸ÌãÄÇçÃôCY\âçìcs“^pw:Œ¼;ÏÞÀ˜²ÅÝ0ýcàjÙNðáïÀ'%Û5Y-‘nì°D°íŒe9¶øù»@zÇùéÚçbbÇùy:&>ïùÞ÷€{h#R{™Š~Yäàmà'D8§;D65 qªï—OìœÖµ'b’Øï)³—ëí€)r(1{I¤tºÐx ÔxòN³€(«L‚Ùûrê?W7ƒÙæ?²ÅŒ]ˆ‹O˜ªæ;¹:€,‚îTçkùÝ{°nïAÊùQn¢ƒ L3Ú³}·7ê/ U""uœi뇯ӌÝ3©~#”s ãÄ¢—fÜ}©q¾x¼eúfpÖíM,Ö¡0•é‡ÞÉÛ¶)¿M+ ¥#R·>7–ÏGõŠDulZ5Ó<Ïô~LêÃ1õ?™u¾*Âm¦•w¾ÙS:²\Ü.,Ò£PMQxÆÄ+"ºãùýj\÷þú–ê \çóØª¬Ñn.†?"ôœU×úÆb*|3ˆ|“uô0d.ê£hG&ר¥;h{}¦Îë ÕºùøÉ3ùö»};¡= àæ8¤Ó¼{ÇÂwzgÀj§ 4jþéy÷ÂRÙ£ŸÑ3$u\? ÀÖÀ'~§B°iødìsve?ð;Õ¾Äït(λ¶Æ5ÄÎP z ‚ž‡µšfZàï@:ÀP²ýÚjž)¦ 5ÄhàL1bت "qbõåÉ wÌ瘒Ÿ!û“o®óß!(L%¶«ú­i‰ñÞV?×0‚ù‰2ÂÆêíÍÜ™0-5Ù‚Þm5´¿"ñ%Ï]e Y&Yzñ¶cØm˜ú!†Dgå|| }3ý"Áš¨ÉÜ GHuÃìT"ÎWÐd%&÷l~‹ìÅš÷R½zËk?C†b9Ác¦~ïK&ƒ;×úº,WùUs’ðLÑÄÜuŽã)gÖEÀÏh|å”>—2}»@« ƒ«ËÝc0 ç•&¹žÈöÜ-†&SæF4G»^¾s<Ñð‡vrg˜aw¦ÈF$1Â9Ì$üåZL†¶tÁ^Ž~ÊÕ±#]„ÿ†ŽmÞÚi3Ý/D2?ŠML•OÑ#ß_dš…SšDoZTdÂʲŠ}q#?Æ aŸˆ”óŒá¼Á´UmŒ€Š V0ãî—IŠzÁ”&­=åE ‘¹l˜ôæ‹gÆ1 $FQ¤mIðc¢;ùî%L5CÛ-âkIÉ*xŸƒy‰æšƒYŒG;¥_¬z?¼éÄlŽ1QqŸÆÅO}"ìMY5†‰qLLTn§Â¤éȦTÀm0­yeÝk©gŠg.ßMœâ@u¦»¥£28Æ.3³b,m¦í1sa“(‰êÔµ6ORMíüÐFöŠDÃ4`2 S0¦™£h{ åó¶q/¨ÃÖ¢Ê^ö˜DœšÅe.Ëv£ œ²XÂÑ»\—ÛùcÑ#oøv– õ^c|½W€Ü^Êö–íƒ@ ¥ŒWªú0u÷Ä\½4wwêÚ“.s1c®$?*^)Ò<2“– Ó¥ÐM².Á”7<5¨½©º4ãïj¦–ëÊ‚œ ÓDàB4Õek“?„Ûý2¹hå'Êdðþ]¦1ïA¾uùòeLºnw¤:·ÔÇÊ™ÀA¥¡ëˆ>Î7™• ½Ð¦XÛ)Q©5©HN¥¨7PÖfc.Ë×ça"½.osQ­2¿ãRië c11(? >dƬ´«ëôQ·¾.\‘¿<›<{´¨Ìé` ÅäaK¤Ö¯»òAv.•Â+Ò…hó2ðä²DìHŒj,%C‚ ÙCŽz6C~d]¯Xe¥ŽGˆæQ…&Œ(×dTGâÆLç”v!‚iÉ|ÇEn²µd%»%[u™€±ÍÄ’Æ¡B‰8´@dõf»¶¯ìv¦ZíQËîÄ^•[ÈT—å‚@\Âw¹5ñx6ÌŒ9ÙfFŒAƒI”Iæßó $ò ’¦;v¾r\¬Þ>/Gô#’m`+<ÏN´ù°ðX¼ØžË¤7‰S80lªäbRRr’»1å:’6ÿÑw#X“/;×m Åé»®X™®È–;û’Z$Œ~EÓÜÆé®PV©PvÿV^-«míñT ÔêÖ€×YqÑâ‘Änl-7Ö½#s™jü Zœ»wÝ(Ú2Í•C÷8åK7AH¨Ûfbf.ÅÝ…ü^"׋I¼„d)LÜKŸÿ&S :45¦KO)™ «°z¨›s%/9²®Âô·™Òáªkç)¾ìÄÏŠ(ª ÀÖ¥>ÅÑGV_«ÊΞh)‚Êo¦VG•= ,ÙëQn³ù«›K;qB=Lð„‘›ö%Þ`ZÛ°8k´/º#Ô!<¼€£‹ñ‰/ùÊ”‹¹×Câ_¥ææn$çtëÇ”ÉUºÏ ‰¥uÏL¯+µó¯9û`лœ™LJ@Œ33MHP¶’QÖ²ÍJ_>Ÿe"xé¶â3Ÿ!3Š–hOu¡%¦u®à‚œÁƒÕÚ;ȉ*”4 ×â­;(w5w§ïÚ)ûñ“ª:ö¹GïNºAO†­ÕG=IX²ñï לkï8ôŽéWéIcºáÏöž×˜nà·+ßQ5|§PøB á¼SõaÃô² =š !¸~†ØéåGs4¯Œôþ_ lå2É‚®Ö#±dªÝüm5`¸`]F蘀 ÎÕlBddÄ|T½psDâÖ½Ø( ÀUoA&ÄåKE´e`‘1¬mB³Œ=˜Þ±ï”§Å!ašíØ´;õ$ơˎɦns‹5(¸ž…Ê“„2ƒÑ."µ)+Šf%;›ÇbåÅèƒùâG6ì@5ï^œ'ìè¬î´ÛWÓxÇÂö4lÀÀÁå#Ø«”ÿ¶'eÚ§u¢;.Ó³OvP‰*‘‰MÉåÅ2ÙÓö±µbÅÊÊV°’¤¯­tÕ¤òiݱw˽ð3|ò z¢ZôDÃw*Á`Ú^ybL<ƒôÚ“çx4^MÇã C0É5àwì'øNÿޱ;ðIÉ´£ F‰µŸá;éήñùÚpÙâ ÙPÖRr•‰¡m‘1E«²,ÒæÀå*àX~ª´ð´gÆÑı0ÉQ¢©ÝŒk#0Ë,‚'AÈP'Œë•ø¯kÕyJq9ÿuÚÊò7æu†e­EïlÞ†7hëxýY"RgryQ3똤ËÅÇlR•’󫋬¨4"C9õ‰™}µ™©¶¢˜,Ñ;£¡]Ũ¢VçŒÁÎX@j‰ðQ1Íö¶f®ep–µ®`âLl¾¬©Kl-º#›1eL¥}BÆú„h„ÈûµJe¦+ÈäóËåbØÇ‰„œéò+2d‹®ñÝIi#Fúž:°HꀫŒþàµp)|Ã4ÊÅïBí8ü CíØpØüaR8Àß! P>Sœø‚“ àw¸ÆßÁ°á†â‰ó Pˆå ñC`C€Wcøã ÞBP/“” †ˆ¹.„34X­ÆÆXÄ{À¸"è?pö„ÄÇiq8½kkÚˆId3¶€[ó“<|Ö¾‹ÝRÜ-Åâ-EBÓíVEµ«"n?X«p/À”ˆ¥ò-žË¢?TÕívÚfulÁÁ´¼N{0y Õ©ÆŒG54º’@Äg‡æ\ˇþ…25™ˆ3öìÎÍfwRL’©ÅøÍ¡)µKÝzê¥DLÛ%(€ÙÚ§mŧËKu`ØrsSH$ò&9êÌH \ü…ͪù“s S&²\ݵòæuíW÷ýêŽÞIquÏCåæv¢rìœd\·;gsF…]Þ†F!växó†ëJ»ËÁ/^„¿µ²ùuù6rËäZœ:X˜ƒ#\"LÑÁFnK¹F¼äº<3Í?‰yí"—²ˆ†«TG ô}0ªÚSxLaOÀÙŒ}óÐÙ,7e䆖7ú2iëK¼–_·æI*cäñz‚y÷–EA!ÄT<åšâáá%ÚÔ%žPò¢£ž0ERM,ˆ6ç³ə£dx/BS3îgÜîä–ôL:¥ÁùŠ.ÓE€¹ØP×fÌÄÅ’@Õ#/mJëaj×4ZBŸ,¸…a¶&ìï(—ÎqGY\˜dgµà–“L»ø´ˆ¼©7RNO¨ý+Þæ}:̽ƒ¹ž—܃¼$‹¼ZÀ±"Û ›ië6£½D©7ð$cÓî• ïVÛƒ¸›Lo0®½ù5W1Å}'c哽¤OU1ß‚öø´à Î>c-±½¤Ú053[«¹ ìC€kš üTIb"*­±Ö¹Y³Ÿ‡új»S_IÔ‡õ=–}X^–N}íX)a`­uNxj5öO)Ù.PØ. R×pŠ\€J ÖÝeOÕf g’Óžª­»ÍA»F+A£áŽÄz½6XÝ\|.´`wPîj_ææ˜FÀ ÑfUû¤¶wÄÛ 'ƒ‹¯>êI“xÿ†` Ñ+ï ñneŽ“8~§'·öh&.¾/‚gôdðç7G£úSôYîìö†’ À;Å4p§¾ãâŸ`ì¨\ùðM3ú¨$LÙʸùqÎ’çºl-f9ƒ[ {G)ƒïIDXvüßò£¢¶–²ÃXL7 bë(kú„u¥<´ lnî,‘’Ó?E¤ŠIÅyLÒ82§¬ŽLy™Ë3 ‘| œÅÔDŒsÍ4«;Ûx=†–27‡¹£Æ/­ƒÁÕÎÓIõÅÅ°ç æ0%Ù–ðH“m‘t¸¥³¾i±´-`‚ HgÃFæ*ú;Qw(â®Ëtn |‡€`ùaZ7ôUxœþ~œ¤DPˆ|½õ 3¤LwMȘ“]Z©3_ô˜0Ü™¯a»gØöŠ^ëU‚[xNDh3}2¸½õ±™xšÄégôsëžr ¶/ÃN‘óó´õ-;\¶ßL78-M˜8¯lCáÕà;ƒY£¢¶Þ¾‘-KpçŸ !–tOã“ÀgH/ˆ<ê<â˜þB2è†+'8_H-  Wø¼Z€’ñN±ÂPCì å²ï³Þýy`° endstream endobj 4763 0 obj 6159 endobj 4767 0 obj [247 /XYZ 38.2500000 98.7500000 0] endobj 4768 0 obj [247 /XYZ 38.2500000 309.500000 0] endobj 4769 0 obj [247 /XYZ 38.2500000 701.750000 0] endobj 4770 0 obj [247 /XYZ 38.2500000 701.750000 0] endobj 4771 0 obj [247 /XYZ 38.2500000 631.250000 0] endobj 4772 0 obj [247 /XYZ 38.2500000 309.500000 0] endobj 4773 0 obj [247 /XYZ 38.2500000 203.750000 0] endobj 4774 0 obj [247 /XYZ 38.2500000 203.750000 0] endobj 4775 0 obj [247 /XYZ 38.2500000 631.250000 0] endobj 4776 0 obj [247 /XYZ 38.2500000 98.7500000 0] endobj 4766 0 obj << /Type /Page /Parent 2 0 R /Contents 4777 0 R /Resources 4779 0 R /Annots 4780 0 R /MediaBox [0 0 595 842] >> endobj 4779 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1409 1409 0 R /F8 8 0 R >> /XObject << >> >> endobj 4780 0 obj [ ] endobj 4777 0 obj << /Length 4778 0 R /Filter /FlateDecode >> stream xœí]ËŽäFvÝ×WäÚ€RŒ`ðú%^Ô€††Æcc` Üž…ßٕ̪®`žKÆÉ—AÕºUl’Áˆû~œûó?þöï§ÿüÛéçO¿ýÏé÷ñ÷O¿=U箩®ÿœ¾ÿúéÇøþ<þùÔõÍé÷?ž¾¾=ýúôëå¿ßž®7üöéŸ/ú¿“?ýÓåß¿œþõß.?üÓø—¾ÿ…?ž:×]~ÿïç߇Î]þT½üþýçÿõô/wúë÷'Þ^7.æíÿÿä롯»ï˘yõ·§Ûgºç_ûý¯O?_7 í-¡Ú.œ\¨/ÿ‚?ýï<ýùò‚Ûã«óœëÚÐU¼¨ó§ÐW®½<Âß·½™¼èù—Îã]†‡‡Ðä{øóÊÕwÅÕ—ÇŠO×<Üæò?× j¦Tôø½>>ÃÃÛ¾Ï÷ðç•«ïÊípñÓ5· Õuƒº6ý<=Çö÷.#ã>¯\{SnG ®y²};òUÓåØü6#×¾ÎH6ßW®½)·“…W=Ãæ;_µùþ¼ríMO?\ódë®Édz¯Oϱù¡Îg£]Wž‰g'ÿ5å!x%ןCÿ›pãǯO?ÿ2œ\{úúçËž_xýíëOÍñÓwÓ¾N_ÿtúûªráN_ÿòÔŸû¡j}ó¼¾ë•ªy¾RŸ›ÐöÝ›+_ž¯4çÚ_XòÍŸV_¯¼þàúâpõÕíz½Ò‡àz¾òåëeûóìÜÐG;7ù"×£ sx[úx[&?X~o¨á–~‚W&_ß×Á+ðñuïÁïOÃ;,Ð ¾²|«ñ‹k?o5¤x?¤¯ÞÁuðá=˜ñ÷à÷ôéOKáÝ-&±úü|ŹA¼ÒÃÇç+ùoZpEx\›‡r–èîãb) ð #9V§;+’©Y¾ÅËO#¿Þkú&6jB?c9ö!ú؉Zœ vŸÓ)°îFÁеÍbyÍhÏ]™z› a­“¿ª»I }0÷`Y€W©ÑxÕ 1§`¥[.Å'‡Íx ‚!N!Ũ&H›Áù•¦«º6ÒšYõgZúsnã,ã+TòÊ:p²-Øè¿¡«oÏ_@;‚õYtbà¿ f½Q |qhǧU“§%h{|øô±242²¸F LçB…øÎ‡6b¼QÏ ççÕÜÑè÷® ðÊx%¤_ ‰|BWüŸæá¼¶ìê³î]tŠëkÆlf ©ì›š.Þ\Bj¡–÷c!*aÁØÅLhoýHhÁl^^|z'¡Û § RŽ”6$Ë„ýuË]un;÷–kQ!õCÛlDœ+$AàaÒÀ¢{ Dú•òì÷ÁÜ«3“v›ÄA¨À$cjh*a Õ? SQä÷O`NU ‡A˜p•Ê×8u*ª¾9×\ëjâ2B}aÑ TÏ$Ñ'‚ÚçÞï[|3´¼•Â'êÒ°nq˜‡•º`!@þIø¾R›Z™˜« kCÆPäói‹@ÅÚÄ«g¢éØKÂbBÕÞel}Ú¸‹Eq"ýU£t‚EÆØPZðùæ®êĬ¡1'™PÊ)f>ãiÐ&°á®Yö;Ã9YÓ9!–$XDѨåUU Šgý€ÿ$þˆÍ›eOia/øTÎï"µ)ІneQë5=gü\âŘ¾ ÊQÕŒÕiòH&x^XÝ¡r|Uù²@K&ÓŽ8gvSB£?ŠnkôÐa_Œ"D]²þ’[­ÝBmåRdï&«.¨ ’UÀªºC7¨ºæ…ÛËÕÍQ^@µŠûH4¾èÚ ™ßJ!Ó>SwþNI߯šPUéDÌJ!­ú0Ñ3†/ÃÌù¥26PpT:eS%w%ŸÎBêcg¨û‬—Uiߢ*…]±2ª‚ñ0Ïê:Àºœ©QbS4!yÛ@A­÷ó»­c]ß^5ycc|amË«­6m|g¤lï|DÚGeîc‚ت´Ö¦³èžOðy<¸ñK>ðŠEJE|”L>ÍÊúÒÁ4s·ig®_†éßÄ µb×W7‘^­"ŽÂ„ÕeÈÌ® S‘OX%®¬2Çï·o& îHš÷¢Òød^WŰK€ÔU– Å%Ï b¼Þõ±cLE]¬q"EI™Í'„æ²ýù#]}åæŒ*¨PÐ… ˜Uý³ ouk¶HûÊqº’ qýâ‚,˜) ÎÓ(xb*`ÁœRÙµ±X>RÜDŠ{K¦ZþêЄRVÂ,§Ê5ñ¡3²7¡} G`u-U¦rM¥ø3þb{vÂé3Á{+ ƒòæû“|]§¢ÃÓ³boÀºÁÕ‘®œ1jì—~HZLÏ¢Po£í¢rFå<ºNŽ®f$ÐZíôÊ›O¤Lúf "¦Ã—i™Àߣap1F(µ¤]…´Ã ~T·ó•qf ›‹jÔÕ‚ k+vE﹈C'(ÄÄ©E§Û@¬:÷„Q^_gåu$Ë©ybó¡H‹Œq§+Ó)›Iãê‚J7ÙÛ']LU:^¿Ëùód/2׃®…8Gyv ßà}ÊË_i,&ñoôTö™xåd‹™Ddò æœgÐÆZ™MÀ$?r#X-?ÄÉû ‹»¢+ß–‡Ê~Éœà:ÚõßAF½`( ´XÉ…ü˜m@èdÝk½kšCà”$p¶‰Ž°Í†—òÛA× Í¡Y›Ì]Q1^ŠmÑÉŠ æbí˜PYÞÐîôðÿð0×6ìæ Ìà'Ó¹V_WZÁ×è SmVT0uèëH%¦`Çë¶ÜéÂe6pVg:gÛt„‰º°)©£ÂmkùÌàU è—ÉvœAÔ®»M®ÁCñÎ Ä”I1ƒöˆv­IxÈnм\"RHÐÇf£Nމ-+jP•"ÝŽ‡’¶b|-ª‰Ùs|¶D u¶ymï”bÝI›j.QÉ#¬mÅ®êÖ÷‘¶<âgvâxv´¬ÂÉ÷'7ÜE=½¶Ó.¼}¥«ÎW°ŽH·EWÆOkÎ~‚ðÒïy;¹g@÷Œ<n #¯W>À§Á÷¸+Ãuçzâ!¹Ë|¨ß<~š‡W¾À§Á/žV¡§1ï…ν}ûH¼‡8S×À÷´pÕxmx߬ „†æ4†H™Él¶“QS nì5c¹]"˜JªTègm0@¡ú‹èc¡œU¦)•iâ2ÂêR&âK…3ݽXØrL$gHÕFÏJ*êŒ9„/Np™àÞQ»X¦zíøÔ*!{”;>t’%Ï Fè©ô"2’*G«}ήŽTaBT—¿z¸Ê-+Tý¡n}ÆZ°VTh¯MðÊÌÑf”0f†=ñ0Z—¥ñŽ&Ôh€K˜A: Ý OÏuÅÇYkãíPåÁÃ1J eÎF*ƒœáÞ4AÝ :Ï*%÷²ètO`c^¸53\ÉZóQ­æÊfƒè†EW1e4 À~VB€B£ø|ÖUÊY>1í¾jB•â2fv›2* ãl.i‡5 R`°'Ñj€±*å<ÂZàeº¸® «Êå¢&èXZe½*¦¦ªS„qÖô]Õw±\Ý%Ú‹¸W¶¸Ú49f:V†ªL6Ì HgVÔ¥ÛGšØ :7¼ˆ«šƒå3tTH©büÉã×ÎBgK°µÁfÞÅäk%Ë™"Ñé̤̲U5tDMöfJŽ&ñB&ÿik#¾£¦0Ý8ázxãgåäúË–Þp70ü5£B ØtcúÂ÷æõ‹‰ÆËUeè ü¦”ÉçëBµP‰HÁ¾^BfNuóUÜÏÐ,WÆy,ùÎt•P"?»†!Vgï æ1J`ð^t&‹lJãnúôq»4…Âg5ºk2vXײÄ1Â¥ÐuÛ n³@ö&qÔ6MéG"p ÌÅçÄ•%5ÀFnvý\WÉ™ÿÕÐ%×*N;¬6¥–y£;+?kýþ÷YÕn« aö¨E£g8IÙY²™3ÊsÖhÔ!ÚeµÅ„›wªŽÀÍcu~B÷,0Þ¹ÆWfä>ÊóÍÜ`¡êÁ•„~”EP‘²y_ õßh@¬³TûU²ÃûLNb}ÏÕXo2ãé‚«bÄm¬e/,·Íˆ’ ÈcIªÔb”ã·}¬é&f93 ^Wá“×è|eø¢–-a«‚nŸx§„ÈZ[ϳ.Ngª\ˆbß-fnÝäeJÁñÑà¢S£¬Ûà’Ã"ÍYÔßu_Vã6¬F¡(Á“·r Œ\žpý@ÎÞ-nIbº–Uk]÷âÜiè\;µ>ÎZ–~Ãl“dðbUây”¢õh× ±}»~„ûhÏ{̸8Úó”Ò\hÏ3dÔ_ „úí+WdTá÷à±;£à÷Ó¼w ïÇî´·}]õõ@ÒFè0£zàà¼jÀ§}¼ÉØ„:+FÉ2æÎf¨Ô¶ë Q³*ø¦_´„” ô$š«œni±ÑÞÎWüãJ?Ã+Ñס+ÞSÁŒ¬rçJ]§¯`d•{W>¥¯Àã§ùô}Ã+%ÿ½À÷„ðž&ýž:ÀÝÁWð¾Á{FÖO£DHU vèk?Ëóüa!½¼IpæMLc{ãZ]n x›Ü¥@½PÂÏÝ‚]ĺ–ønaGJR¦$¼£cÓ‚ õìÞò¼Æ:Ó%õ}oA˜[F€LM‚ ¤)S.£Ò¬´â«0(€“U™OfÀˆÌÎÆÕ¼)õ˦¬œW%^µs•˜ÅÑÎÙ½Üb%f5­$së=¥!M´ ‹õ¡•Äá­Z{«Y…c÷xÀ¥©”Ú^}–’ÃäªU¹Sù†]å„Ñ1«"çºXÙ’hO’ÈÕ.öG„öl[°4ƒðÜн=Ñì cäQk=3A‚˜ÙÄ4PFãîõ‰.2éjPy‘B7–˜0ö‚‰aLb&5¯cyda»‡@R^‹* M¤zö=yß …ößæí©)b"F[>® Oh‘ „¢ªä1”¹QÑ­âê-­‡E[íÌ¢Í (ëbŸÌ,Tmè|ðƒ}}õ¶zi‹qù¸¨b3˜IˆePÖòi™³6Dþ8UãÌeâr}’ gNÊ: KgŒšAÑcäŽ="ž¯úˆô(Ô4¬Zq?m“É++–µV­øÍÒŒqÄ(]³ß¤°¹9Zã§FûçJm a eàŽ kÃ߃ÛRz+ ý˲Á©yb`œÌ›P2|&ð3ÁéתÕÎï|ûäCÉÀG“º¸£ï­¬¦XÙ×> A]© A -Á:$¬‚[*nÂԇ߃Að)Oì›À›ði LÜÞl¦mÚè˜-Q­%®glÊk]zc`-[ºÛÐ jÉ0FÓ¶ú[g²ˆü^!êâྲ³yTï®™¾€°²f%ƒ gwÝ Šå°ž¤§áÜìMÀÞ&þED.)KJëé?ÂCÝ >Ü&Áôö&;-¨|Æ>ïÃKO%aåév±P CËË×…%å=ºég‚ÛQÊ™`jˆ¬œJ¢LèV€Ø3ÌÓ,G Õa©•d©Ñ`‘ŽhpžhpþQªCû²˜ÕG© ÷àœ×หÏ]4­~›CI…ñ«ð=cAÚ{à—âq¥ÔØ Ýãáað{à0WaÌëg¸¼;VŽÉ0ôÑbRª´Ô=ÝJèÕíBjüõ¤å†1;™q²ø=Ìéö˜Yeì±NOcÒiÁ4ÆœV]:=9˧%ëràÛbﺘԖÕ q &6Y–eoejBˆÔÕ1È8þêZ?uΠ1}6ñ¦0ø šD™Ô†*„j1×á='â¢Ì ím¶ÒO%÷‹Õ£]ŒŽn’2fš)6MÀÑÒÕ£˜;c”ktpð“‹Ñ¡+Ç×GÝÄÞ_B)Nýà@8Na0uCª¦á”3™ éW¶¤5€út‘àtÐ(ts5ë‹+,˜ð=+è‚°ÏYÙƒX®z.Ø /«&ï=î\Ç_ª‹7º\6~Æ[[€Þý÷J†q°Ü*ªÚ»‘¸YôˆýQ…SZ?º’âÔç^7±l 8M‹S®ø L! ig˜À­aó‰ø&²¨¼§ƒqªšXÞkœÚN~©P‚WÀ´yât}v˜­ÖMlÝâ3•¬‚.0%ï.e/Õw‡Œz/2*#O÷Ýrž6ƒ²Zž_2³õ•1; î/ÌÆV™ß¹Mçr˜-°'yósw}åbi¸œ½©:¦Ò›ÈW¾¼¯ ISXèy”,ÔM>´6Ö/¤žCœçtGºøŒ°üÃ/,'Ñ´- ë0|ðbxÊÂø4Œë?¢+xÕ¶l¯@¾ï4iñî§€ ÜjÕø|`%*C;˜¡„3…+x_öÜ­äýÎð8¢F‹‚MŸä}‰qÙx[*xÿpfŽhÚ,ºþ‹±Ør k眡]ûHé ‘̼!\¡Z~½ÚˆƯ P­rE·öG.˜19ÄÚtb s4Ö÷ žfU¢ŒÕ%´+F°Ê{z¯ö´ÞÜ ú6•9ÓíÇ˜É Í(Âã±)ZJywæ ö}‘!…p¤ßy:±î\,ÎÊËœ m¦|QWh$£Œ’rjǾééýB0QÍ”Ì\E|áo¦¤j˜¼vÇbWd'ÕJ%‡° LµéëRLEÞÀz—À Õ ôMEà&Ñ4+=ÊDO: jžìÅŠÉÓ¡Ÿø&³±³+I+bš-4àj•£ ^£)u "h±ÉÐahÎ2©&¹$”é0/¶l¦ì+£9 ®z…2†üÜÉØº¥º°’“ºUù%k t:S¨@4vé¦à) à£þa½ú‡õð×6VÑÔC¤½2ÛÑTÆEÕÇg´ÊÝ­D53ÓžÐn‚?=%þÅDƒT籯|±úª´ˆû&« ¬¼ *Ø`¥O\I]Ì?#Ë^wŠ!J¾sáež1£ZȲêN!‡9[f:,~ÎNSÓnqæœÀŽgfX 3#ñüx» Ñεá¶Røu³Óäï]a¦3ÓˆIÔÖ8<í Ï3‚´ÜÀ÷àFtéR¸sÞbÞ‚PïÏWtàïÁµ+ þâiÓ®ÁWààSÀ»#œ¼GØbÕø|‚¥|êo31y©•çL8ê·lºæœ üžcÎÄmleÚTøžQj­zœ@ÑÞ,ÒXýÜ[ž3÷Z8µùazs >y8Áõ³:ò§i.>äÛ¾ÓR` ¥ð:ˆ 5ƒúž¹¤ˆJ7% è""i•´í#.”xn¿×ò²H!j1I„2à‡Ÿ`Ü7Ä÷©»$$–‰2?ªh ߪÙä 2›ÚÈ™ÇqM¬Þv¢N˜¥¡\ߥ 9nt,»×2º©fl¯Áè -¼ ­â%a ÈÀ­aÞ# ö´Å$“‡,¯¬·JXí‹]³þúHÑQÇHa¦ª‹TµÎŸHLLR€ï±ÒÓ”™LˆjP 3¿`â}gÔbUûÁ `ö9O.Ü«®|š <-¾Bì”`cj%7à_f)Ë G:„˜ôtE41³,s­ % Â! xS™!Ê „¶û„À ªaÔmSM4ŒÖ%ÜJå©Òªmzh E»6†¾" ¥•Å)3lue¤‹œXƒ‹T-Óh“"ö37o3ª‹I¦2›*Ýr‹mu©5Í‘_¬;ÙX§Õ@ãC¬~2\— "&dÙ5@¨¾]\#Ý)4‹1[ÍÂTQ Tºo¨í"®Ìz29M×´¶³A9Ä]jŠÞ"* éXuä×õ­yÃmRm3 ]éJbݪ&]Ê.Ð¥RÎQ—­VÉDoʤJ ƒ‚{O&Ó þóZVÊÈ 95F3D*ãÈ’$^ X'G6T&špÑ…®6Ã$9‚A+ƒ6úD0u ?&Åu‘Cò×W5±ó¤3Å0ÁgÒ…¹ßæÄ%•¼¡Qñd‚#19kBLgœ3.p}[ž°£Fà+ÂDe¡‚O«u-ðŒP0‡„3úXûXlRî4VDÁ¥&¬¾Y7·mÏ‚ž3sÛG! 6t C,±xBÕ¿õ “M˜y#»†™Ó‚WÀ ô`i'àêkæÛ`dbwüŒ'Ò:4½·;˜Kø¥ &|š@ox¯Õ`fTSh_@Rð8¸õ[ÿ&A2Ë1!\§ZHeý3÷]¯Þ?’¹F8%˜´~äKõáÈ[n"o)œ-®/lŠmmzNª‹”Öú0æÖù"ô53!W¸¡…G¥QN—2k«ÜòÈ›JÌ–Ü7S´Ç2—eå˜ ™¦;pe=¶™qÀM×–`Åœ´Îš‡ò‘&RF—WM*3Ö*•ˆÖÈí*ñak´tëTË«ÌÍ ‚ýÁIµ/>€œ¢öR’ ™Š ¦˜Ü¨_g›ÙÏÜYú¶r’.L\Ü*À X÷ §MbS˜T0ݶ, rªªa¢«T«9¨´‚q4±ã(?F dÓv®Ü»ª;á&!‚¾Üñ/ ©§y©’ñP¶2½b”±i ×Ètè«ð^`þeJr4–dá"-É$x*LP…Á蛄†zÝÝpr9ÕX‡òâì+Â*yWàñ^æºDíºaÞw)%â’UçEÛ±©žc σ«_+°–‚Geœn5f“zì0xV¬;2j1 ÎiÔžwÊÏq6ì|Ú˜èó·K†š°écU¨ëýéΛ´°ì›64ñf]]Ë{`$ƒ¸@Ø• ƒ«À+ql”ÆÁ÷x¸xmˆ ¾ïAÊަѷmlçÚ6Ç/JšæÁî=tìc2xs¸Ž¸¯¦õ1Ñ:CÚÓ^™vÍ’ýõÁ­×÷8lûý ?+)¿S!ûcQïå×éÛE.‰bë×¹¿°@®õ÷ÄZíêså¾g˜N>¼uKî‘º;»p=öÏŽÌÔri§WêÏã=í¤ÂÕAÁó½§žKéÜ[Û/ã—"`Qly„×%Up±·¢ÌÉŽÄyïñÝ ·ßù ‡Ÿï Ú%}z÷J¶,Á}ÿóeÅ·•¬I'÷“ÀgH_y ;ÔGÄ1ý\ɨæïœˆp¾Z\£@¯ð=øi%ã/ÅBxÕpwFSç†Äl‡?6^ì¨d±¶¸Ç\1=‹ÅûOpJnx%éKšÓœ÷V€ U,} Gö˜¬„ëªúý?Aw endstream endobj 4778 0 obj 7704 endobj 4782 0 obj [248 /XYZ 37.5000000 484.250000 0] endobj 4783 0 obj [248 /XYZ 37.5000000 484.250000 0] endobj 4784 0 obj << /Type /Annot /Subtype /Link /Rect [244.500000 591.500000 286.500000 598.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_throws_typemap >> endobj 4785 0 obj << /Type /Annot /Subtype /Link /Rect [43.5000000 584 537 598.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_catches >> endobj 4786 0 obj << /Type /Annot /Subtype /Link /Rect [381 442.250000 399.750000 449 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_features >> endobj 4781 0 obj << /Type /Page /Parent 2 0 R /Contents 4787 0 R /Resources 4789 0 R /Annots 4790 0 R /MediaBox [0 0 595 842] >> endobj 4789 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F1409 1409 0 R >> /XObject << >> >> endobj 4790 0 obj [ 4784 0 R 4785 0 R 4786 0 R ] endobj 4787 0 obj << /Length 4788 0 R /Filter /FlateDecode >> stream xœí]K¯ÛÈ•ÞëWh j‹O`0@Û¾ņ Ì"È"èžL´ƒ8YÌß=H]©ÈïõéT‘”*FúÚâUñÔ©ó®óøé_ÿ²ÿßïúøõŸû_ºŸ¿î²C]f—ÿíO~ûAÞº¿ïë¦Üÿò}÷cÿc÷e÷åøß»Ë¾~ü¯ãßþoŸïÿxüÿß÷úóñÃ_»_:ýÂ÷]mêãÏßÎ?ÛÚÿ–]ž>ÿÛî¿·ÿÇiÅþu0÷ÿþ}^dMÖœÀ˜xõ]¿Msþóï_þ±ûé‚¿·©Lµ7…-ö¦-òý¿þg÷×ã úå³C[SWE=ò¢:?¿©=.‘·Ç•ޏq_tþ£´|€Å›*àâgÈÕ±bìfquÍÃmOtBPYÀÐuõèoOë[ü¹6Rú£…‹+žlžÅB°“}_=òó¬m.~‚<ÐÉâÅM•×EyÚúûC»2Wf!¤o–°¸­.~†<”V×då*ïøáôV}]—±xÛ\ü ¹:VúÃÅ«+®5½ýsd}½/ÿEfl°Å/«c¥;Üáê_|VÁ \>.Àዾí~úÜîfý·¿!;¿ðòãÛ÷]qüÇÉ&´fÿí×ýdY^ýçþÛßw&?öì~ïò¤9?)úïO²ð‰=?iÞ?¸,ßš6«òòæWM†ždoç'åÁæ¹Ò¸Ëçh‘ÂлËç-„‘Ø—¹,oeQ5õÝ“¾[ 'Ô%‚`ˆYübˆsó³»È€ðw-nTØ<ž¬öGµÅ¤ ÷£|p˜%àNó Æô虆k¬ Ëó‘ŸÐí‡ó“ö`]¡†Ÿè5ÌÈ¥˜ fí±2‘FÆì3ÇC—wÈûÉÛ·£ò £÷Ê£?u¯øáA`L@d6FêcêB€u%òTq͈cÁ˜ÁªË$Ìj;”$ŪŸ¦Œ7âäꈑÏóML] ôî‹1ÐæÃü_ýDp@Ýi±º*:Ç2–Q@„:Ü&à€°™))OžÂw RŠãmJƒÔ¨&ËkW¥*J 7òj` ´dÞ«eà“ÏpÛ˜=1™?åòø ‘±Ž0Õ3ü€ fƽŒ¤W6jÓ1n,óÞË Hþ}­œA”›ŽŠP¬Î±ÙªÊ† êšûÞ¡¶€ÔšgÆ!WA²Ìâ=2‚XW<áèÞú0’IèÂvöÀ Š%Ä5‚È‚/€£ä˜@2`ü~×Ë@*‹‡‹Ø€íà!~Rå9ÞPVmó€Á†ÑÍ8ú `Ns›üÈÄZ±‘WcðFh¤Ø±Â$”¬Ï=Z^Tx¦È„]ëH½Ž.ÛÜNy’½Á'9±šAO:l}§ ­ŒÉ*WA`£R÷2) )k]0ƒèÆõgø¤ðR| øèOX™BÒÎ0løžâÃ&0Š%öƒqwjÂ3¤- —`?…~iÕ«§J™yP˜D&‡&–å7ß>,¥Å£J*‚Lb…Yæ~£ Û?ª)`‡È"™Ì9òómƒû©¶¨„‰žº]…8ŒŒw•øT$‡A7dDp†µ‹ÆUo96e !Aù ÐëÀO 4¦:¥ìgaóú#‚ùS‡–UVº¦Èjb ‚D"؟ʱWÍ—ÆþºIܼþŠMCù¤1Ë'O +Þ"¨ˆú"u꼘–öX¦c=Ðø?1/$ÀûôÖ’j‹q ßcjÿó0ŠCB£lx?êDoGJMÎbT/Ok†L+ì4ÅÂ'%æM(>ø™àtk«ˆ˜¯ò0/x"ðL,Æ/ÖZ8D‹ñ‹)k:BŠ0Ò7ùvÙ#¾ÝØ™B¼Y‚®£Ê¾Æ<ÀÔx¹”ã‹"Ì3„U€))ÃV¤ ›0õá÷àkFÊxx®†é¿€gúl6Ó6mtL‰IKd«Ö ×3¶‡…òZ—Þ°¤Àرmõú˜ÜV®pÂÛÆôÃøv+n Ƙ}:Qxñ¸¸âbsµÆÞó¼¯Rs7Φ·Y4@µ`Åbï‡à'ª~q E4Ô U&á¾8pó­Ð£T ¡?B–$–¥Ã僩 Ô¥C·×D2ŽB$µíƒÙHmë‡ç´b׈jéÑúW±3:’!5Wé†õ¨îŒŒÚŽ5чiI´¯¡¢ÆŒO¹Ò.K°þ°›+rc¯¶KjXèä ßc"õš^SíúŠT¾æýEh»¬zºKÇÊä‡.ænÊCÖÚûsú®vAäÈP>R°È`lbÃzáK»ÀÓrãJøWˆì˜ ©°/-\\ãÜ+,'°Ù©ÒzuåÅûmU?ƒöKQIÜé‚[Æ(“öN$¯F9M«–oAò,ï+¾ñxaÝn…T¯;f˜êlÈh³ˆ6å‚=‰/ÝuóÄV|eä3êb©ÓŽ<;þLFG2:’Ñ1o§ŒÑM}{}%3h4p_W›z€´xˆGùZãɆ¡ê6D\l¸|œQëË7cœ…¥g{ 5z3¡åo§ž¬”nK,a§ Þ^­>iã«UßA0îf„ò¦Æ5d(„xÄK÷Äc ã#µ.ÏÍu",®b8IŽc¨›±8<îĈû™À!'JîΧ}aùA(ÂÕ”‰ÅdDÎ× *G˜<j?™X›0±BJrc]QžŒ·åúïÌ/«‚.Xí0.6)˜Ž9:õ×qbÉô—“8$²\[ÿ¸]Cv“ꃱW…+^Ï-›®Íó¾»Ç³Ýí¤é°ñ ¤é°…l`:lYSô(žôÞ58½Äš\+`OÑ„4†¡Æó(…ù`XrÅs&1F!l§ãý`®Å2Ÿ†Ÿ>Ó4%xÕrçð܈¥Kšü¬S‚ãhþÊLbQy’;ÑÅFàŒä%ß(ùFt@i~êX––½I§3ämFªÆ’·Ûœ5\³ϱώùÛÞ‘2ÄŸMëaIüt;-U­e¬« ]4²t¦ŒFNÒ2[µM`qßÌ©tk¡m“µð´ô¿ê&ØX`‡ es:¶Ù–×%Š5M’(Ñ%ʳɀg;…å-‘úØF‰*7l=Í›+–kŽÅºQM‘CŽ7/s­oNðØöšºqAáXuq¬ñn‹çÇ.=Í%õŒH=#dŒ.Ø3–ơ×÷ŒðIî'Ä 3QSyz01«š Ì¯„ïn\Ù­<¨H.0õ½7—šÉÈÔ8Pýí4ÚYQ}àT 5Uf¨0C¸„RHíM†òÙc´‰ÐMO^Ïç¸Å˦^§©«@ÖX×Hm5°æ™êËÀsÆùù¯T©7hì VÉÕêÉ/Ej…µ÷¯#ò© LŠø;ÿwúsùN ¿Ó@]Ô‡†MF vÒñ´ZGû#’ 쑞¿¹4õêÕ{¥À'™Ú\:DqǺ$÷Ñ÷vU¹›|žìJ‡'@IÃf§4ïØ¸ZžC¨áN1®@:2±æuOFËu²Þ´ƒ¤ÓG:Ää ¿Øpôh2¿-†îxäMz%«n[ÁÛê~{²¨·hQ/â©•Y¥¡²˜X€ -2­(˜É—Lp`Å¢(šnĸÆïñP&øÅºŠ™ ëa‰WÍLfVAÎâQ¾ÅV,|WÞvCvnd6Î^c²äpÖ^©¦?Ù°qµ[„Øgë:k´Ô0§¸ž ÕŽ¹Mpó`;DKænšq–°² ÀÆ‹Ê!¨ôKã;]Ï‘ØÌ}ÓY˜9RÝ´ÉØ8̶ù×ÃÔQ¢[oë3Bð®½Êí3^ƒ¶¦·r©fæŒÈw5AHeÞŒDs©5ÚoûèÛdŒ-µƒòRN±ÓÍÆ 1q/ö¶SCª‡nêö»~ØäM‹òeŸYëÂÉ~L ðì)ëžQÁ±Œy¢a÷püǬÞØrcÿÀʼn­u„Уl“5-B·H¢7HµKÈ(¤­]%sCV·‹šÁXx3ãMahYÇ\¨Qó.Ó¹àà ñqÚÖyWíáôýSì÷îƒßv_…ó tð­‹êÉëå±'?Ã'k©GÔ yø°L(‡0Ôž™Éà1| žFñø¡j!ãM¦rõ›Oîs}Ax!*ƒz|&Æž•‡ùCe4!+(WD7šÀ¨3°õ1Ë¢™ÆÜs¤—Qi@Œ"cÄL$â\AÔŠóK„¤]­þÒµbÖVŽèIQ÷uOQ÷G›qûVxQ™lqICaИè/e¦¼Us½È"unQ‚+Àfh{C Šš@7U•+¹wþÕ ö55\Ú+b(y&$¥:_sI'ÇtŽéòd,BWIÛÅ•0D˜Ô´pÈÀ­ÍjW>'?DæU}çÙ0µòÅ1suÂT Œ=Lz ¬¦ÓݳønÂEi !UÎxÇ)ð¦I÷!%¼mO…òçó•J©šÌI©tÂÇ2 ¨uïQ¢¿LIù6ï’tëÛt³XU=êUǃç+A%Å­ñV’Œ»Gu,]OmŠ¡¿p ~=p±b [Àiºx¸ Ž!À óñ@(˜À‹ßƒÓŽ™4]ÃŒñÁPãQ9¸õ<S ¿ÃŒ ÒµñwR›O;û=ueô5‡@)'Œ·2ÂÊØ>ŠÕÔ“„-°0fbîÃÂl¸v“<~‚WÃOTC'²cž.M¼jpaI_óÅLɋЈ}UG1ÙáѠѼÀ¢¿Î>ÇSHs(ð4Z]“<™U¾r¼2Õ|9þjVΆËtU[+0Å~#&_<.5±–'k5Ö¯g"é^L/:H%wy2V–Kº n®cÓ›Ië†$Áºd*\™$ üaf–ˆëН˜ÌZÕÖUÊû™ïÕ)öË‘QÍJ¼Ó@¢̪lE3z¢Æc3¶1R‡Ò ’ ¿Mµ5 J3Ö¥–ÅS»_Ïœ·|fŒ^·M©™Qy!åÊܯ~ñsÌÚL§tf 7„ÀB÷´ÀÑøÔÏiA|>ï>QÈ ‚IŸ†ƒ.õ2F€@½8®Œ¥ Üæm¼SÆDÂT…¹„¢ÑwýÄo¦á ÅçÈœ=cæ:Çâï`­‡M]LÄjAŒ`?¨ úÇt à r ¾Aʱ3„!xÎøØb†ð„±0뇑ëXªZµ>O3dgÛ> ;Ý„ÏïâjÍRhíÚ±6Í'¼fª¸ÎøõѨXZa ™±\_Fbcod5³Åüär$;ÀâL’MZcÌ~¿8V"=NÔŽ•H!H‰ô)‘~2ž‰_uOâØ8¶¿¾ˆeãPvÑâñ¶å/ SVýtVýÓØÇ)+WĵªÎØÇÂlK©Ro²Ã%:`âBÑ(s3²fÚ!î2bFÝ겊m{¤˜LÒ2¦˜ÌóéÕ˜ Þ©@ñLUËUýÁ@Mùp0†‘êÙÄSHÑ‹µpü×Zx¶èF*a‹ÇMÛ´ “TU§ƒH6¨¨CSƒ–™–x"#ÙÀ®A]‘c~´:@äà†£10"‹ÑÓÛÉ~øXãjÖ"‡jŒÙ›ê Ѝå×_Bœ:5ŒàÐ!ŠÝ¨àvµZ@ªvRõh@ª¤ê‘€T} HÕw©Ú HU£©jªFRÕ5 Uݤꈩ:¤R@êúšª§R©…JÖ'4fla ,c4Žša×ËCR¨:>˜-»‚ù`³ËÑK¸»‚=Âþ yMwÔ­÷$NEaÁìÊY“€™¸ V8X;žÃ@} ª(VRD¬ÐAçHdDu¹Rå!kí½¤ƒó°»+“÷æ%CØ!!Ør;"¹Q›’¤]®ßŠ7-mɱ¸®ç'¶ŽŸØŽú‰íÀOlGüÄöê'¶w~bëø‰Í¨ŸØ üÄfÄOl®~bsç'¶ýÄ6ù‰ÉO|€¾æø‰íŒÄ…gËã[¼…†”O4…£FŒè¦©4¡]Œ¢hz íEcs ëQ&ެqsÊ ÈŽà•sfŒõq¬àò…õ?Aª3ž{ ú¼/²TÐG°70., G:¸ Züö°èýªÎGŸuNxƒLyÊ€t˜Ô6üâůˆŒŒqÎøÙ`ÌvœôÀp°Áa3! &Bʬ$p@­i²Ò8jSHz›Lm©{×,ˆcFÍ„ˆkeäêÆÈTì‚ù9h>RX5È„ÕÂOÆÜ‡ŸŒ ?㆟NŸ¸á§óoÙ»Uìí;úð“ÉÆÂO&sÃO§OÜðÓù·š»Ušûw„?“ÂO)üô}Í?½Ó˜~‚á ¡¿NzøZç—.7{K¡ŠYF2¡WS@A…¨BîªÆå†ªxˆ²}ô'¦+¢ùÁò¡ &?ç:êŸÙé*¾ð€©1$8KSЇ[ [ qÉM¨Pñ{–ϨaÂkº]ˆÒN!Á€(UpͤgábŸð….Eî*ÇXÅVOÚÅdj¸äcÂ"džéÓ#ª.ƒnW$F$Uåk©—KL¸&¤JÈTZ»Í- ç4•]PŸõ‘Cûˆ¯Ë\™vƒ¨®w¤©MoÒ^€ ‹Qxêfzþõ"cšQ½B–º‘p³ÅIéƒ }& 1]à®!ytï´žD{uÌ>+Þ‰kÀu;ø|új–h˜>MS†¢ëïù®³^°í€F¼N'c~]¨˜ÀL´LЫØÚQÉÕzÓb­ÉÎæ6Ï‹ûMù•9ëÎ0V-g¦èÄšÞ¾Šùj6¯òiŒÓÄða¢ļ@ID£åé[+ž)BMtÅï!¦´08 ŠAà)PS`™é[ø=F™™n%QÆ#LEa¦Ê-_ä„wJÈŠ0%­B„ò4fº 3Œ¡¦] S:GÌê¤ò·¨×̧kž–+ð1]°ã…8¶Tc&w˖ʱËL×dä 1o‹±#˜i‡‚FÆOTKˆ©‰„Ápº ?éÍL¯#¼&¦TKF· ôÆKGÂÛjÆÈxမ‹ªW0>­ l6ó8€±ˆ¥7a×°½Ìì]<-qÍö:ž–ˆ­Kl¬§)„mUfú¯%ðÆÀf ;Ö<áWÂC;‚¤àu›’ ÊH1]˃ø®‘nIV1÷ÖZÛ<`ɤ‚UPl¬{— Àº€¸ ¤|qBƒéF*žÍÚV¾Gcô¡jcpáL™&qø;;éi Vc]]Öèê5ë©ht™â•·1³fì{ÏyÆ&†gï&ÉÃÜŽfjå3°Ø–`‘y’¤H’"g¨Sô4EOãÛ€É_mq®ÂÚÈÚH76f09˜B–Ž€EÊ.³Ì­=_ANƒj.HŠfI'—¢Yâ~˜,êÅ)1YœªÕÁ°1• ›¤Äåo{1õb]d8Jk®|¤®iÖö)™{9L/Œñ2ºM·^‚‰$ °1ùå³^‚ôÕ{ÏÔØ ­yº4J ÊZ¯ÈàšÉ‹"l¶Î’‰£ÛêGêL”oS®š}ݦ¦ÄÑñD$­'R"ÆèÄ‘·m©šž¤'ò“ò ŽcIÌÈ&BÃx›Tv&¡Û˜÷¤xv¶QK&V1å•hSâ6óJy½I¯+æý{yü^SZ(Ÿ¢î¡x$ÿV7‚Œ-„Ë1Æzy™´ÍÌi¡‰Ûaê]|ˆ|,¯tù‰×±H•kÚ"Ýí32S<__A×b§í7An¯Ã{M‹÷†\^¾ ÏĦ±¦5±óøgÿãhŠÖã—©_˜Ñ»3-­±‡ÌœFàî¯}z;JkÑ|ÁB=Ò–øÂÝù!¿ PO5|ÒYÕù¡Á{ƒí c½š?¡÷t>žŠ3Ûçn§ƒ)ÀôÅ ³‹w2¬é¶>Ø`džxŒî®>² ƒWƒßéŒ~ãµõ›kH–àN?BÜCþ†Þ•—þ$c<`øIà ‘§€¡Æ!Žá’NuŽœˆp¾Z „Q Wø¼š@Éx§xÒ,†b§KüaHÌvxð°1°NÀÍûǘ˥XŒ?x‚Crä#€„¥/†3&*Wú Ž8ìÛ&n¬„«3{è´ãLQµÍoí„)aÿe÷ÿ1žqb endstream endobj 4788 0 obj 7402 endobj 4792 0 obj << /Type /Annot /Subtype /Link /Rect [366.750000 578.750000 406.500000 585.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_namespaces >> endobj 4793 0 obj << /Type /Annot /Subtype /Link /Rect [255 543.500000 301.500000 550.250000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (file:///home/william/swig/github/swig/Tools/swig-4.0.1/Doc/Manual/Typemaps.html#throws_typemap) >> >> endobj 4794 0 obj << /Type /Annot /Subtype /Link /Rect [315.750000 332.750000 362.250000 339.500000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (file:///home/william/swig/github/swig/Tools/swig-4.0.1/Doc/Manual/Typemaps.html#throws_typemap) >> >> endobj 4791 0 obj << /Type /Page /Parent 2 0 R /Contents 4795 0 R /Resources 4797 0 R /Annots 4798 0 R /MediaBox [0 0 595 842] >> endobj 4797 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R /F1700 1700 0 R >> /XObject << >> >> endobj 4798 0 obj [ 4792 0 R 4793 0 R 4794 0 R ] endobj 4795 0 obj << /Length 4796 0 R /Filter /FlateDecode >> stream xœí]ÉŽäÈ‘½çWÄy€Î¦s' è®EÀ(TstZË@è¦F‡ù}Ed™‘îñŒôæ #\©ZÉNÒÝÜvföã¾þùð÷~üðõ¿ÌøúT=]uþÏáôç‡ËÔãóüχaì¿üöôýðýéËÓ—ãÿ~:ÿÂ×ÿuü§ÿ?Ô‡ÿ<þ÷‡?þéøÃ¿ÌÿÒé_øíi0Ãñï__þžsü§êõïÓÏÿçé¿ÿãðÏÓ—ÏÍ‹yÿÿ¨[3 Ói+Ÿþþ´lÓ¼üù×/ÿ|úñL¿¯´cÓuãÁ´M{0S[þï¯O;~`y}õ<µÆ };T·|h¨O_2ÓñõTƺq>ôòGçõFÿåmeš`/?¯\*¦éüvÅÃmÓÍjîÅë¼¼m‡p/Y¹:UæÃÞ®y¸™f !Hôöú/ïÇ€/Y¹:U–ÃÅo×<ÜÑÌÜ_÷}½¾>ý»j¬ÃîËÊÕ©².~»âáv¦éJîÅë¼¼©¾üeå¡$×}ûŸ·à¥œüÂïÂ/þüíéÇϦ­Ž ¥?|ûÛqq/ß<ÿõíH”îðÃÉ<çÛ_¿«*ÓþþðíOÓs_wËמÔzR}†O>Á'£ÿ¼¶ögø6¼êð;=Aƒ>ÁkÃ+€ß©‰óÁû©b?˜p§†8ÓŠàQ¼Ÿ®­ÁÔÁ|ÏŸ^5–x fð§›@QÌñÃoÍùmŸ¾ÕypM|ŒÚxMœ3—Ï<…Š}=Ý@EŠòÿã~ÒälF‹` „9‰±­‹æ© á!^ÅG‚¯¡Ÿ†§3þok0+N¯¡(æ*¼SBßÎÜGw¶cdÝY|ô½j®®ë€º‚ßÁVS¯Ð·5ô¸|>ÌÚBÛáµÝ©,¶àúÛ0‡LíÇØïÛ÷Æñ3c Ž…Þ?£kû¹gç0_2ùÁ;‹f(a¼Õïz[#ÌoX~ˆ|‚ÀXJˆh†É-3‘‰`«Uc£Š9â´ñ)àø, _GÂXÃÞ§WÅ'ª.²OPbÊ]pß5m‡sØÉýÊÇ!4>cÅq습@¨×óˆ2†¶Ùu”m  ›/±Ý8‰ÉG—œ<å;0˜A;0ñ¡ê™2‘Þuo„wŠýΜïYˆ,sÚånFÜiæw3C NKÛU|.ÉçœĬ R{ËØOÛçi§× ­cúÄcFäì§çØôHÝ,­ðæ¾ï”¹±Àü–\;ßTÊvаü”'2RÚ%’””Ìð.d.ŽÇdöÆX*“˜œJÆÚŽñ~jâî˜ÂQ0sƒOÜŸ§×ÄÊÁ’µ.ÒVcGð‹ðNñi3'§+Û»ÄóÄHFz'ŽgÖÄ®B8–ˆbE@Ê9ŒûäØk§]*´+vyß5??챞ŒÏÅDL„+;ž^{'èJnmö0޶›bc~©Û;B éöøÈÀïL~¯W¼1uo¬Ô‘–:R’Œ'³GÎdÚÈ–…²FÉù¥øi;÷Ó¼,eΖ%½,¤×13 S»:¦ùqwÝ-(èfò£žÐ¤O9ôɶ:}²­Ú% {mq0ôÝ l¥8>SõþÉ,Âמœµ}n›s‹ý·C¨àï´èwæÄTóܵý8t®²ºòÿþά.Ç Û¨Gbƒ|ÒØ&h1+:¿ˆÀÞfh,f3£‚5/¶™8‰­OÁ+J]Mˆ Sy±zûP6cgq¥ ´°¢ƒ¢5[/åèè¬ß„%¶2q~CêÛÞ619K}4®ëù‰1Ëû·°áM ¿ƒ&sNŽóŒy–`D=c‰tÅäøÇøœFƇ§Ê X[ ¼Ž5£û€?ã¥pT+¨cÌëL¼ëlƒÐéÌc𺚮µ=C‰ì2÷¼ƒÙ õ™©§q³ó#¨:¬h äp²ÌGMpC†-B"°_·=%³åpzeS/ç·ÄžÕcd¶Lmq¥àžàÈ…qƒli§œ°î®—åÄ]”«‹? 5Ÿ`7ïÉYlÇÆâå‡C$ÔÝ0mÖóy%!&]3ö^¹5œj4‘ÒpÕEªù#JX:®Ìl’¯­f€Çº\¤;>îLîkoƒOæB¾kD…kk>£k[cœLõ¢þY \[Á§ÐJ`¬†ÍJ`¦î37XZ" ÔvYq /Χ&ÌíƒCܨw|׈Œ³¯X ›ˆ‰ÛbnßÎBÌéák2W/I.MMU÷¿´¸ër¬¹¸b,ÖÜ\™†qýد"rŠº];æ3 šƒ«l׎ÉYa%žMü‘¥«ŠõJZžÌ4“MHnÁ°<¹²äKÇ.6S;¦QÕZ'K~Pn‚ê-(u+L\•»ˆ ˜ ˆTfäj]¨ÐœH/¤–°ÞhÓO–²+×U¹Þ©Üw£±M0p!j  k§{‹­ª×`^›ê=úœÇóòº•”øÒÌíC¤qð ëØaBÖv0–=]Ep†Lâu½m÷¥Mï¹y@4ú12ì?Q­õbŒˆ†²°$¬…U¡ÈBt®‹öÞS›º9t˜—½%&¹ ¿í'ûX¶Ÿ“°úX¸¸p÷8…Ø)&ÍÂçöÌÛdZL`Æí!ÜS …¥*Ê®Ž-<F/yÞ9}4ÉT-ø¤ÀT+`)Tvl0ïê'J•r­‰NÁ¹ ·5 •òâ©­KïÔéu´£ÒUÙ•ñh©N ËÔǪ4äëßm?S§rÎÐíØ ÂûÒ-µ€¢Xí07°˜‡xĨ–„%«oÜ þÒÈ™wFîü“MÖÑxÔ Wµe=B>éVNFäRì÷êÑœÏ̸gv"ý åûçÓï¿T—?ùõé«àô„ñ–^Ö`¯qkµ´Æžº€ÝS¿cj‡ƒ2¾í/ {DZ—†=ž tÉýÕ¯öt d¸EAROäx„´Ö;ºà¶]5Šú8M^Ô-YÝFH±ð}LдJ¥ y¯‡Æa¦‡×3é§tÍ#c¾ªÆCÂÝæBŽ Ët§W“Ù,aíÞŒöƒ$#{^×üEÜv¾ -CÕÙ4Ô5+ŒŠcÚÎí7ša‡Ž;Õ‰ºÖÆ¥}ûaþ%½Lܼ ØÖoéÇbR#;‰,ÐØom¸VH“ikëH˜kTìÓ úpûÝ2S¯’è ü= $¬‡¯Î¤‰©+1§@µÞÕ½ÜÎ’÷Ö*T¶¡ŠÅP®»ÍÿêsgÙK*À<ïÇTÏý`6&!n¹A Ò¼úÆ{ûœ5J–~×/8f ÂÉòÏ26™$.cTjà áÜ3ÈDïïu359ÔðF‚˜âUgî =*J±P·Ÿ GÃ'>¥¬éÝZÝV!‘ô³ÐYH#hò©ÇTilÉ{”nêV~ÁúòfÉ´4ó/mxòx)Kkx¥_Éß¡#Û—3«{íŒwê1ZEzL•u2·ç uÕ®‘Bƒ¬‹ê<ãŽD¥š`Ð…¼S.¦ÆÌ¢XÎ;ãËPøV¢²B7fê4¨V+k§2\Pã:·0ùìoÑ÷TÂË\ì3•”ùgÄŽŸÄ2î+“ÄW)—fJUUGEfXvºë«Ž°þK›ø7í]FâE¯°‰¨”͸ο;¨’ –¿W½ãÊ 8ej·QÓQ2ö:uáÊ)ûš¦nmóƒ ¯ëm19œµ|BøÔc]ÝÄmÛ/­©V*—IÊ€I3¸ª{Ï+ê€2,ÄÓmHæ±$ÕLªJKwfà¦ð•¡ª¼¨>ªÛa6”VÍxßÎ}Ìßl •Àfà®XÜ1¥ˆ.8÷U±š¤ÏK_µ“´KÓ¦xã®uë2÷/Ö’/ØnåD˜¹ÝJß—?8u[ Dû~Øì쥶 èøžl¿= õhÓ1vךan9r¡s©½†ˆº+ÉÛ½ëspèf"H†A @2]d,!|&êª/VñkÄZØZ:Û«¹W0œx3·|x-]dòh2ç԰К4Ö€ÊÚL7X% UHàœËdJU´-ôc0ïy{ÊL1ÃC’÷N¢2…¼ÙÕ@ Çׂ¹Õ`逹?ðg±?ûa³¨.™'›î×NägødZ±‚ …sí‰Yã£-‹Åıi!¬VéàßqIµp‚†4~C}Ó£iÈ:Gäç~g~Ÿ‡Únf‘}"qÚΟ}#—@<ß~¯KB˜Îì î3Y{/ ©’sÞ"5%çè^V9…É”ez õ= ³öz5¦oìì* lš¾Y¶*XÌ8 øaZ®Ç'Æy¯žz„De3ùS!ÖìÀíjBë6ݹQÛeªJ#Øiêô$t¯@sˆh$e¼×žèMÓØºã^c®\"öô9óÒ\åw\È]Ÿ¿cêg‡~{³ž ˜ª_àĬTÃTlK¾`ê…û>1@ç0 çzÒ7 ˜sÏ·ÝC3ô§¦çäã¶{ô¬ ‹3ЭË/yøø˜ÜI,_´Ã’Z Zvl&ˈéæ4uzeªfÀg-­ÖAä™Ê‰htJg®í°•¢F0—€ºCÝ3ƼîêvX+h-"AÉ0FM#¥,3 £“æ7ôZŠ¥¾qƒ©È¶sV;µÖ&ržZÞâÎY»ìêu§ÓÑCN®4-ti¦ýê-s¤wu‰Ž­I¤•e´ÉÙÌfp›4Õ¶xèä•™®n©æêDk _mg\¿ûNÆ0Í¡™v,‚BÙCë‘°Eï¹Ãw¶ž&[4‰ª 37œ…•$ømÂèYìPÃèäáïàºLÃYƒ«i°ÛŒW ßf°kÚù»³xm ÝðÐàøZà¾é-9À«=wÛ;,dµEAÌLÔØt¶4„¥%ÓV•a# '¸?hZgrš™E‘•c ¨°6˜- ~‚߆Ÿ¨ºe³9Úßñz   ”Õçz†•òá,äMûšÅÁ1®,Ç‘ôßñ#Áï4x÷6¸¿ G¦„ .g Òjp¼†•}17{07^gе‹b¿um׫+øÇÃø´0E°~ÊøzôNó×Îk”\z°xqÎR òŒ¿ƒŸ`]ƒ9gÛ0 =HXWf?-”¹h¹bœ‹Œ•+†+(¹â’+ÎCÇ rŠí6á9DõqÆþ‡ò‹’Ç%–ù—±Ä>ýã.’}ýpÆ?ž`_J•{‹.ñà‡ciÄúfwÊ;„WÒLñ|¶ênð#5T݆•Ö¯èœ™Š…òk‡×F˜¥÷b齸i_‹+ƒD˜!eDégy¨àOÛ-I ^¬‡6ˆ„p¢J‹Š Ýä¼·,ÚÝ]¶bdžHD ÉB‚";Ûc¹·Ö챚1íP¸‡Ön!^¼7±Ožã¢O"çDÝèf‚#¸§¹zÚQV!¿9û›Nñᨻþ1QèS}C41Óm«ÜÖܱ{'A,~ª6ÒSá¨ÂiMáTµ V0zV§9•j—粩¸éÕ·ÁNæVf8-“[Rmå²Zjtž‚±éžaûƤ:‚Ç´Ò!ÊV¨ÑLšL#sÇ…)íNoóöÙÏ*f)B×ÕË 3€*‚0pM¦Óq¡‡Hw@çŸ7ó: –¾;†¨k+ö€“ éS$bƒ‡Hjì@!¬ÃÍ>Ð…±Ôp?5^ÁÀ£ 3¦~ÂèuÂæ`ÛFA_"\ºi]2Ò嬅r‡O÷Õtà 3OÊ%JU.QXÙT»DÙ õY2rz—>±{õ™¨"¢BX5ÖPž'Ó£ìÛ[JÒcB¦û~),Ë2=ÔKƒº/Ð |3ŽÖ¾‹q,Æñ!cÈ©µÃ`IÙ¾0íÄE"Ó™ºH$YÓ ~5Þ5ÆfÆôM7uKdT{Ji;Ö¨÷Ž7S¬z±ê7Zõ]`{[%QmZ=j0H S*X€í}ös§r´iÝÚº=ÏD¸.Tó`U°€R$L55•y…,Æô/ÝÛUKþp› sk+;]ò8ujT¯óà®Ãâé¶ëÁL¶zc®'zÛC¹º­ÊÕ­¬Ö¿ÕKθÝÍ*UjYW©‚µ&ÐÍ£ƒ>ãÇÞg·…{ŒÄº¹ÄõB­ì³ ‘‘)Bª}”“ê,úÒä)|ûñš<9;&2€Lm%UjÊpa+…M¦þ{»Öaò[îd_f%»Æ#³9Ú±±n± ežce)uå=V1gÆÓYßBìÐåŠëÍúŽö­D=1ö¾¨£‹T<~ozZ nÎÄBæËf ë›<¦ÏJd„y<—/ƒ,)¥+<hz‚òî_àF¦ŽmÆ wá&—Ia![‚šÁöbm¤uß6Ö©|«³pG¼‰ÆMy¸Àì…7.ß¼;üóO6qÙÎ5Co³»òÛa~òUàΤ3.éNx!@ý|úýÓløêò¿>} DûÓ‡,U“mêtŽÙŽÛ›ŒMG¬ÚÂèÄÓ,­¢kz-„ë•€[Xõ³’­‚Ôi¨$Oc¥‹…+alpˆ›'ævŸ¹÷§lغ!eÇÀUã×^ ŸË‰éZ™ªvÛLŸ½~œÎ¦áƒˆvCLÃ:ïíên}——1ûUŽ¥™ü`“¸¯J€=qï€C ³èÄ4ö·tb†j\ªS(Nþ` )³¢,O§i±¸$ —3âU3Cx2¦1È÷g¡¾CÈ3óݱêLo·ôÀr¦Ã^+]íu¬t]Æñ–^jÂÀÛµ'Qv7U‹3Ü@]“ÚSû:–[Þˆžã46 ö|©T4æƒkL&¶`N®xžÒÉEÔ¤Ç//3JÌ„¾õM½ùKÌ[bÞófóFÕËí^Þk<ÑUÝ’ ŒOÈ÷Ô1í{æ3Ýs55ïq{‘ÒûԒ¬½€5JHNÀ-óÁ$DÁbÖCmIÞÝu×xèn=­émÍzŸÍz‚ÞCw¶ŒÄ*A¤ K5{†hÑÝW³ç×E’ꨙqË ·fF׉ÎJ5³¼t¹ä9¼ÍÎ`éK¿%}°°+‹·KŒc3·•!ªg{Y …õŒ¤†ãAyåÁ䟷“Ø£AjrDÏ”©E„hv¦_`el±˜ÆIyÕ©é‡~•!ÈÑ3G~¼S† ç>¹3ã°zŽºG?e>¹««~u=é`çgy úÙÃß1èI}æ_S- Ú ß™#Ñkû°¤ÿ‚AA×hW-Ðí“? „i%3Näíç—`ˆ‘ŠKØ $ŠÓ¼~Á)m!èÏþì&ì¦>›ÔÂb1qlZ«‡Œ‚Ç%5†áE"¨K6ÌSÛÙ\x ÜWÑV„„7ÒK³Å½V×ø¾íüÄÔË#{-Â`›„98Ä׸P¡.Çb»¹Oø0ç37\ƒÈbn`x Ë &ñvvǦNã†x‚ ‰u)c8×€£~ÚófBe kƒ‡¬|¦ k&W¢.£cÀÈ룺/a­Å8uvQ|£d¾‘À „îahž^o%¡·¢{üuàÚƒXÂÕÀhÉ:ãkºË¨5aØVëúu*2iµ]g&t=d*Ë•ÞJ=œNØgîÜ/„ûª6ÜäÅ0"Bu‡¢EíŒZÅ‚†“#ÎK]#0J”`olóE¤;°÷†=XJ™ë&iðq9'‹Ýzæj *JÆAêô‰<>Êš}œHŒ9ÊX9-<>zƸã£áÛŠ‰¯›<`‰qÂ!VlÍ|G5}ÁD÷ÂùW›12ÞVH&â\`‡5“‡éÔÕ5íÜç¥}®í¦n*^­ýfõ>–xLf_‘P /û¨u†(ªi¼UŸUKÙ1Ý{ÉHMåÊ#Žƒ™µLMœ,ÚЭ®gßY½ˆXE!‡È`†åŸSw÷ äºX’°"L÷1W&*É,ªP¥ÁÃGI@Y„CVÍ7Ô±ší·æõ“F»½}!ÓÝ;Í4NMß2ÿ.ò[º–®«"!qFfà:Ñž“jÂìHÑaoÃcN½ àë±ëv`Kµ×nÐ.–!-ÆÔ[&C ‹“wô ÃDZär»¼ÜÐà4láP7CðÞN«T]–ªËŠ®U]Ô.£±µ Ó§?´ùº«¶à!;·›ÆÖ>97×Ð÷”›BxìÌw<¦c[¿WkwìLÖ æ©¸´€«šØãoÁ3tŸ˜8ÇC_瓟8‡˜0$ÏD¸kÔ²®kɦf+2‘<¶-ÌÔ„ôÄø7am˜°A?žqáq´ÛI.Œ° 6Úöóê+Ü#3Ü"È£„ùä;‰6¥m£RܵÐî3žÈy=ž úÑ_‰,À±+×VØ}ZdÜæJêv7vÃgŒ§Åš;ª;.3ÄÌ«ÀýšúÁÒJ%íZÒ®+M˜vFÇŠ†ONµõMì Þì+_jWyBjÁ8D˘*_ GâÁ#Õª;Ú’HîêÒ`U½EH½uÎs6sï¥;–4ðApëLÕÛdÄ]³wé: ó´ˆy3Aœª€RrR-ïÏ—R²X´u%D©Ì•2“"Ä­«d×J²Âäl“°ïH\w0;¥R8‹*ún+ ¨ ÝÛs­ Qp¶‘A2è—‹ùX@eÛד­lÃ&×Ú:¥·¾ º'ä˜D-# ɱôX`.•ÿ¾YJä¸/kÿ–¯qds\]eNÊçP/#8æ"k4=Sa€m>ê¥ØÖqÉz÷ÉÜн~ž•ßµ×:\ùN³Æ¥×ÖöyÞ)Ò¿8ÙÒÚ’„ fïnpfl®0s^Ù†Áoƒ¿3 ¨ñÚúðƶ,Ãþù¸âeå°ª¨îüY ÆtÀ,ð²À'Äž…F‹9ÜÀ•,“Ü•ç ¹ÅÀ5 ü ¿ƒß&p2Þ)¶ðxÕ:³í¿H,vxð°ñb…nX¸l~‹éOÐe7¼‚u„%­]Ù^[0ÌT¶ö4qØÕŵ«á†ªyž­ãFUw;Û´ÙOXó_žþ ©žÀL endstream endobj 4796 0 obj 7179 endobj 4800 0 obj << /Type /Annot /Subtype /Link /Rect [267 632.750000 417.750000 639.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_exception_handling >> endobj 4799 0 obj << /Type /Page /Parent 2 0 R /Contents 4801 0 R /Resources 4803 0 R /Annots 4804 0 R /MediaBox [0 0 595 842] >> endobj 4803 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R >> /XObject << >> >> endobj 4804 0 obj [ 4800 0 R ] endobj 4801 0 obj << /Length 4802 0 R /Filter /FlateDecode >> stream xœí]KÜÆ¾Ï¯˜sؾ€ €½+È!€ 99rœÀ°(>äCJ»œýŠÃÅî&§½V^î4««ëýê·þøã¿~?¾}øøŸãçþûÃÇCqªËâòßñüõæùlsêÿ}¬›òøù××ã—ÇÇîï/‡Ë>>üµû×ÿŽöø—îÏÏÇþÞýðÇþ—οðë¡6u÷ý—§ïmmº_¿ŸþïÃßþpüí¼â𺘗ÿÿÆzÛÁvcâÕ_Ã6ÍÓ×ïŸ;¼½ `Þ[|SvÏŽÆ;4­·ÇÿþóðS÷‚aùâÔzcêÊ×Å’Õöë›lÛýÕý¿èéKiù¯šv½ÅŸ WÇŠq•‘W×<ܺ{Ù‚Êz }]} ô7Û®¶øäÚHŽ.®y²mãzôÔ¶\CßÖ×_¼®‹Ïö r}´ §{½ü‡9Ë`XDíòEøà÷Ÿoß_t²°:~ú©ƒîé—oŸ:´”Ç7g‰ãÜñÓÇ?…{ÿ§ã§Ÿí©²åâå‰ù>©Ð“â|bÑ ßS<̇À9ôÄW«!­&l¯±SØ)<ü †Z x x§ø|Þ|‚éÚ]0úîSǬ«óYi'!ö`zÁŸÁô‚iŒàt‡?ƒe ü ÆŽ%VpÀ`Ë 5<9†¼5p5øÄÂýX ”ñ%Š ½±nƒØ1Þð~„'Œ\'tÖmXSbyëÚ€²³óÏyÙ‰Ï^°kð¾!®R–B”Þ ©ÛixtŸ§µ70¾…%©´*¹ŒON—7›pœQu¿–3²Q$`c8èQ´Œ½q¬3· *Ûæ FÊ+G;°ìc4æM \ ?q˜1®ËùO„3M8Ú¡ì›v0ÖÏÔj8º†íÕÈ_o„‘B¾^¢kBZUÃ[1§ªÁƒ€ñÅ0µ5/…ƒ)NUmšs<|D.îTúêüàQ\êOÞ]Äc6kNM[<ín¬Ë“³yù¤FŸ1x5 A‰ îÝÍæ`ñÖ{ëìÙ"z¸c¼šìwcÜíušî]­_m.o.§bÜ@]7lP—¸\1Ÿ–fHé­vc†ån9¸Ÿ^ÇÎ;f5b§so½ÿ*CÖX@a‚ÇbÁÃÏ`°ðƽb¼u¼ üâ‡ÕUUãGº ³¹€†\± Á‡—%7æ:Øô ¡· ±ãñòºú€Bè•°º]7êX›Q’œaA,x f݈%ø#„cšÌ×'xÅ ØNÀÂ-fbΉâÂdÆV”`_­®¢ÚÒlIEÝ._”‚aÙÛµ ÆÆ…‡>ƒŸ`™„¹Z¾Œ KP—OÈr,} ¹+¼›/uxtëFΆ`•í!g¤'+ê;SV¯ŸÈšï¬ÆT (ÂRb$V‚¤ÁûöÀ¤N´ŒˆU1ޝ²Ôo2JƒÛBL4€Pl½I$MQ·~R  i©èÅ.l8ý…KAqI ~‘ÀÆâ^HÚ1)ÍÇù Ô0J7TaLøöBn^¡‘Teè $Ê®p!Pªu?å:O¨1F \ iw¢E&T˜Ã´³Ér\U`INÈĤi—;(›ðåß¾Üôk†±"#L\beœIWiäëüÒŒ ‘N‹ô’+L¤DØÆ Ì9=áÅ8(Éà|jƒëú ÎT#)±»n€ôk$×TÕ•X¿Œ ò£w ébÌš3 YUÍ#¨§º½Ž E™„ KQR“ÌíåLµU|äo²4„2;·”îÅ,1§ÞŸ$‘üºŠã¬(SQ§[ÓÀl‚5~¬ß’&JBÍÅÌNCIº5êd×5¿MÑšlïØþ6Ö•¯௑é&Ídª…¦iÊAGç»ÖŽáM±ø3ï…Á>™„ËOV‘S#ó-‚âšW"ÒX*׎Pܬ۪D¨wªõ7þ¬fâ#¦;ì2©IÆ«`äýŒËßB¹@ëÎeà=åXÅ óNTÇ70&Œ/  ÃŒ»‰Õb9‡l «Î㪫:;(©¢†‘0DêN=ZÝu"„•[„ÜŒØê$)aÀí6%é^—ÊtžõÎny*Z÷oøò‘‹Ulìð( "¶C´šv5)L1CãÓѺ%Ž¡îŒ )'.2¤vèâ‘Mr½³“÷1VÅùéžÁá\þœ X΋¾7 7ôím´4¾Ì¾ÇãJºrþgðý^Â]žÄØk!}€)WÅMQU>+ý$ŸõÅÁaà©ÝôÙá'8)„+1ýb‚¸n4%îjÄ;u?2±ïdÆÃ¿ö.[›ér]†–]ÉHöÔw.t™”Ò­3óí¨¯ñO°ÕDÜÿJÝËŠ«å1§2Y@LqXÞáÕð½¹Øš!ncp­ZÕ{sÚÁR„°j¼á“Þ Æ~C½6¬_žÃ:ï'•b¬gÂÈΪ™”å)[]º7˜ –Dþˆiêvc¥\W1b‹jF˜'øæu,ï¨èGÔn´0oËXtXþnÒ~Á6¦ö K(ÊŸÆ!zeZÖ-kBØ"L”1¨\ö~Ý'ñiy•*Ëy' õ8~‚WÃ1î½yÆñi'ËÁ´õû6ã’!)s–îùôMa´kµ(/ÅØþ™ø¿në%Q/Žx"ÀÆèw,¹*w8§ƒã‡cïDV s`üV;ìë U„þÀç#ìŸÁŧ€3-˜O˜±WOk§‹æQ/–H!µ^³(ë­ªõâË[ÏØªØŸÂ~(öLðœ1LåDZ|-îý.à[—ø3„þÀrãZàô)€±D:¸ÂLŸ‰nĉ©íÀþ*“flbìabùDT£¦á)9»Hþ¬bqn¨bI£ªÆÕC®Q¹ª†°§Ûˆ¨Ö¢*É mTâ¸~ JàmZ›TM‹êjBF&·¦Ë%{£‡yˆk2ñ`eϘˆƒàÕ¨:ÆŸI˜K0…P2„ÀAÊÑOÝÌ„ð,CS Ì?D“2ÏÔ+¼‡ððØ2a5¦ÎS/±ŸIO4Œ­ÛÞÐ߇=7,ñ‰<¹Ð½EÔÓ ø $½CÉhª"&O×ßÕ˜@†È+[šXäLÒt-PoÀ¨™7Cm¯ ‰è§@IDÏcUd›+kÊû’( FCå¡„i 8®‹-Ú²Ýø8ë…ÓR]Št'Ñéäk;+U!H_ÌÃDÇu&¤o½¾]’ÉM9"—5™ H}¥™†go+º“-‚Å\q¤ŒxOHë¡´ízÁ•R8ªŽùž°80j[ú&0§fù-Ö7n²V7/ÌÌð°X–ëJ8FÖ0ŸÑ…Óutì8,oVj•Õ’©Ê6vægŸ©ù:)G\ˆ:âmRæô½ÕëJUœ‰lÕi’;T<Ñ]T4Kæáà©,!½£ª(#`®²7Ìž Oe'áÙ[MÊî¦Q3ãT{´„.Öœ¼#ß<õ|OÕ,‰ù GÂnä¦X|öø±Œfüñ»¡eÌéÁæÄ0ò–¨ÄÔí2fºX…nAfj£Û°ýNìG¸ë[Yªù_‡eˆj•5e¯ÀÀ¬‘ÉJ?¢;Üi]Ló·ÜéýLýÃß“#Ärù®¹×–ŒöE·¥˜^´[p*¶Àô¦&±"¤ež°(J¤Ä',ÖfI…Žòtþ@üÌx)kþmÆq‚uÕß§µÑ./ÒŽan$*°6J;Dl!¨ÞuKj:Cægër¨ºJ#_\·7ôlnÓúf4Ht(çWïÉÆH=¿Ú˜%÷±Ä÷1s”5m_K÷Váä0ÔXâ3§½I“ãn9î6¡§»5nÉÍ&Û¼¥$~*ßRRä[J²?qÚ©ßÑ”KîÇVC]Ú¥^EÓÔÁo2ˆnËdÿn‡þ]|Ë SAUºS“³‡ÉQbö0%\gsR»¶ëèÐmúC÷s‹Xv§j>[ ñï‹?e ¬-–T‘…Ì·vIÞ}›“îë&´Ö§U¯Ð6C½‚îýbŒFcjy_‰š3ü'Ð @ñuj°)ʪ‘®¶M€vÖ[ÁôË0šN L£L¬ˆëÇÏ`P«*%nó´©vÂz P­aUu¢ÜצŠÝx U‹(þ*@P³NëNĬbâh‡€¬ùÙ†ñ­Ar1–™îj;Xªb­ÇLdîÎ$îYdºQ™ÀÛÞ,3êílm§}¦¡î] äÝå»ÏEÎ M æôSDÕy Œ®{Wx¿Ÿ0V£ªWu­ÆøÔl|ª¶.5£[·Ã˜ð]©É›¼A^ÐâŒçÈÐ5AüÛí³>,Âúü~zârq%ÝÙ“¹ãt£<ÃT“¤<÷Äcé½M¯ö~(1P§{ÎHIGDV³ÔE3íOåê‘\=’†„Üfõeë2ydL½w#;ãG_ c”踠z>˜ÜA®‚HÁ[ÍU[®‚h‡úõ\ÁñÌýTAÖjŸn®u(’¶d˜¸åWà ÂGØ&]çJ(>¤F6fèÓÊ9Šœ£˜Àuô¸GÎQiËÛû¡D""’ã_âùl6w`ÊáŽl¬C…™WWŒve¸–˜~ L3Ù™ ÉLiÛ[ž2(7µÓ÷¦gnÚ*71³âÛYH'—kÄékL-“]%f×$1Ÿ²¶fÍñ«Ü…¼þ ‘_ÚæýI÷3%ú~übCD…'Œ…ÁÔ.r=‰‰`µu[˜Ñœ²J^;–yzó-'¼ÑéÍט›BÅ™ ÆÚeúMUïÿ¦r̪ý¦){¿ÁîŽgb7¡*aãw¿2÷‰DïFÌS¯9ÿ#ñ©×µ­×±=(Ovo1Òèò‰Ñ»¨² ÃÍ’ÍÙ^¡Îöz¶×I{©»Ìö:YÏæ C½*ÒÐïæ¾äú¶­r}öÛöé·¹bɽÔ“\›å“º|bN›ê;fzÚˆ °PÙkÝ;£RÎÞ•ª¶žÄb÷2ÕÎW1ÞÚL×tR6©êjÔ,[¬Õæˆ}1TP¥|{ê6ëÓ¨ðv¨óâLP~2Õf˜ƒóß0Ò}¿t[1óaê&Q×›×ÐæŒ;¦ì <Ú¯7/\tlyr¶1gÐÇ{­O¥¯šúÅ“ ýÙ“5O®´Uuý¤—¬öT• }ÃÜòîé#Ϩì½§×p¯|¦×НÁö¾ßi݃ðíIW»Ð•ÿR5ýÖ¯6Ø›¯-_Ã'mÃàÕàgúñfÖÖŸ5ܲwþwñù;ô®þšÍY$`10 > endobj 4808 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R >> /XObject << >> >> endobj 4809 0 obj [ ] endobj 4806 0 obj << /Length 4807 0 R /Filter /FlateDecode >> stream xœí]Ko举÷¯ès€éEêfì™9Ì99³Ù‹ì"Îò÷#[ê^[Ý_uëU$Õ\c×^ËMëÍb=Þÿñëß÷ÿüuÿþáëößÇï_wÅ¡©ŠáŸýó׻׿(ÛÃøó¾i«ý÷ŸwOû§Ý—Ý—þ¿O»á_þÜÿô¿}¹ÿSÿïOû¿þ­ÿåã=ÿÁÏ»Æ4ý÷¿|ïÓÿTœ¾?ÿþ_»¿ünÿËóŠÇ×À¼ýÿw¥³MižÁ¸òê§Ýq›æåë×ï¿ìÞ˜÷×6Ε{ã¬Û›®ÿé¿ÿØýØ¿à¸|qèœ1MíšbÉ‹š²SÕµvoÊ®_©)«³7½|yZßÿâMS4«->@î-ÆÖæÊòéÛ4M7 Èun —_mÙ[wž!÷Ž•‘ºÂê‰ÛÚžy^d‹ˆûÛòk·.ÛõÜ;VFâ «û$nÝ#qK»þ˯€ÿ®(Ö“ÜrïX9¯î‘¸1#ö«fôŸV_ƒ¶¦®W\ürßHI‹?ôÚ¨qUѵðç…(;ú)vQ~µü ‹—Ýz~€Ü;VNôž®þeÎ*”á7à ð$|ðã·ÝûÏÆ=Fëý·{à^Þ9|ûÖ#¥Ú¿{öþ«þéûß…qØûi×ê²:‚xíIQ¡'e3ÿ ~Ãøä>ùŸÔðI;jƒWëà“rþN…÷@4ýD|bïÇ@>(ð{ðHÓSÃFðŽÁOðjø ¦Æõ‡ù"Ðãà*‹õ†JI ßSÂÏRb iÄŒù€Ð!~Wc4¥G Áva´2Ÿ¾õFuu{Øçí¡Å²‰ùãrŸ Ó Þ(>{݆K aù+Á`ô‘ Â" R ÷c±Âeì.–@ÌŒ,|T”ÚÎ-ZÊóÅ4Á´Ç¸‚´Ç4Vƒü_2\a¹B…•±Ê¦¸‚Ñ^Ï)ÙG—Þ“¦Žµƒƒ«1þ¶…O°ï øø ÁU÷ã!PÖŸð{àNk$PÁëyˆÒ!̹‹°ïáuˆ )°Ñ)Úw[j[q,ÏXÛaŽe,rÄ>$ö)ƉU}ÈÊDã)¦éC2^EYÀ÷À'Œ#Œ’ÍÈ>¤ô$û"F±!v*@€¥„Ðo–°ï}àN+F²âð¹š%vÊ>*BÚvK ÝXT¾ÂÞT’Û¦qçÀ[íˆÕ 4!| Áˉø¶CÍH  ›ø~ón< Aj“ÔBÆ5Áo–É¢É÷|×´jÙ,Ъ”&Æ’NH à!à÷QRAb­š5%š{í–dkªú?uõö­¡1×3,´'þðƒ€qÅ 0=gN¦²©«x¦"ÜÚ®xûd“KOqtg‡Ç©ÐÍ[­!>3˜½ê`ËÖ¼ybðg‚¿gdòY8à ío¿€H–'_¶$LˆHaƒ‘ ˜i]é,m3‘ˆì¯dWTk¶)'T„axbÌ¡ruÛ?\¤;Œÿ„Ñ^^´Š P¡ä jsˆÙ#ozO;Ö›#Þ¨ ;å5ÔÔ%Ô}œlVÀ%&<Æ2¶Å\üϳ}¦‹œ± !/‚&P ° Ö úáà{° T—öÃ0È”¤æ"n]Ë ¤x–pÏ(Eš> †ÇÄx»]ï Î2 ³õà/{üÐ-ÛHÏ6ýF§'Kâ’3餇}cŠé1Ep;ðÙËfmÌXgJPhg>åhyÕVÊ‚9ïTî‚Û ù SmS/+„ôª£fp#:êÆL¤œÙ\áˆ=å+ØÕO†æx2¬®Ÿ ­™zÙÄñ3`@Ž¿J8»ÿ­ã~É.â†øÒÚlœ*YÁ *‡aÃÞ Œòá&1§$T Bb,¤¾&w0é0}ˆ«E¼Ÿ¨€¯É‰‹Wì¿ ±cŸüW·öË;i&_àýàÒð7¶Þ!̺L÷ÌñDr Ö;L K4àa`cR‡0l‚”hɶÔJ 3„b>6L9¬]péN4ö‹Q"‰Ÿ‘F«ˆ4ºðT¼¿ôQJLÔ¨Åþuä ­]Rˆ“ÿ®>ÑÙ]u}Tá$öàí«IïzIáKÆâˆÅvI1†Ö“4OnL¹eø“[>Ÿ‰ ÷‚{‘áí½frrWh—5à¤lÏÅU¸¯ùßoÉQnLPDИ@ˆ4c%bñ{ö]¹¤´CÍ; ÞDNÐJ­¡p{EüDhmîµýFÖiEÔ:±¡÷bïû Ç3¸1¿à•`Œâ›q¢iˆà1ͰÑÒbáís#@€‹5ÏnI3rµ³D’wOá³`™æ{ üÞN–8 ˆÏm0à·qiøh˜V›µûñ¥bo¢ÕÕÚ­çcnW^«FÎoShdŸc"Ô96c¤=£bá½e,%„dQMést"G'H=Þ2m0:ÑöÈ‹Æ÷Њh„?K‡…*øX×Ãm"8K0Y”8^é>“á*Á‚19™ØîbYÀœˆéCX£(¢mOŠh´] ÛÂųﭵUåìJ;cõê}7Ú9¦[Ëá¢Ì u|V"üwGT 3º‚©P¡Æ0çxË}å—µE§cJé´4½çàq¦û‘gÁçתÏÂÏ2&‰|Ñ”ýåÀ¥±ÚÙ?šç=S-¹7OÓ÷eìs§)Tåz­×9®¾5»Gù±Éz«¦ÑÎ’ÏË÷“½ tcîɰÔbÛëà³ð¼“õ`Üö¹Eñ{3ÌHI¾¹ßæÍ½é´oîÓ¬ð [I<É5E®)ç·ëf©@`‡éz†!Àa™LCÊ_aÆßMd6òJ¶4Ú91ëÛûÉ# oÅ™<2Ø»TÊâZ%ï cGG;ØutÀFïFthâ–äismmqš-«5ÎÕÁÏ›1ãu”©0„˜#+ Ÿ{û,Ha®œÉ%Lë"&> ƒ1òá,8a1¶E`<)ïóí(ž1ÿqÛã=CÎRÚöT¿5KÓM¬Kó•4PŒ£ºãŸr5k§xòÓVœ ‘§mÍâ‡fb) \÷TÒÖÍD#ûm#>-< æUÒ ST_˜²Xpˆ³‹0˜™Ð¹Š3êZ[+bÂOaÓª-Ù\ÈÆæŒQ¹W¼ÚlLbÏX´M õ5 &ÀÌzÃÚAköæ1¢ÒœéÖ"H ÎåÕš®É`¿‡ÑLn¶~y{ ˜ÚL7& wíñêKaûÞN9Å;(Û¥Pg%ä¯M4þ ‘ÇJe‘zõþ©Lt×D&íÖòï'¯ ÏJÇûž0a!â„Êœ2âÈs&…®ëZ}ïGwÆ~Ât6…NÓ¹öN„:xí]‰qÍdP*Ù…þ³ÌÙï†ñ…° $NæT¥Xü:ëûO£Ä™ÅoG_µþ0 ÔLÝMðÈV®YäNg±×,ºjstpÕlµ3³Ú“ˆ{ÞOäÇ Õ*ú‰Îþt(c¼Ëû9çØÉÓ»8 ¦jBcÃt)ôîα‰cÓŒÝä©O©êÁ‡u3‰HÉÏó;‘js ãÁ#[yÂVŽy±'¨Øc^•‰ÇÏ ÿ$¼®¤){f‰z%iÆÕò„|W¦[~"f–cÞÂç õL…PÌœHDúT½¬2º‰ežžhÎs¨œöü³tïg«:…Z± ¡ Ι|ÒgbÎäöCd1ä2'õŒ·Ky” ÷2P3žxð˜ŠVíèæ:3ÜÍÉåp>À­=Îç‹ > çkô/pÂæËé°k‡;~è†'1׫bz)lcžr–К„W1cHØ,^-»úçÜF(VAå*UE3ÎòªÎùš£.§cëº7æRæµ)ܺÀ®ÄÙŽò-DšâP7æ­oáM „ØV]5Aß4ÍsÃW"±SHfÊK‰àW[­¨ÛÒLyË'†üK°µX[2Ç(&°2[#­HªÎ¸)©•Í Ó"•qïð{„ý`MyPXde›ä7®Ž[·w´aì³ü!˜JðQ4Œ¡é_5Üh›è•¢)ëi<ˆÑ<ÂùÇÿbâñØpÍcΈŸ`¥Ì|H]!Tx*÷ÆñQ«Ùp »2 ¯øVŸq^öo`¿jF#ù½®ÿ²r]_Ášn¢HÔftàÛ¬sZõnÔM¨¨qÛN9Ÿ¥ h ç¤`I(*ÚuäЦ®nö b‹KG•4rvâÄêŸýr “ߤäkSû³üìòbëËx ~óµ’L|›kqŸÌþ Úw¬¡K³£$ÎýÍ^L±Ž3«F%æ.á¹—šYJL“¸Ús%leMWu<¯ªÄowÕàõº9ìZèMç#j£…ÕðDL9b’ºß™[W¥DG˜SËÝôš¡ú1«yí#%`Ôk·\ªUÍOMþ#äYè€÷ÃÔS{Mà*Má{¨%Œ42]MîFïP=®’ô°)énÎmžíO’Ý]µ¦²SIzD¨X“ônð­zßW­>Ä)Ãó,›àÝ=*¨¹Jص÷˜Æ¾Gšv GsS’­8&æÑðý¼Ÿ-\ëu{îÊ*…nÏá-Kšº3ßE!ÏøŽac\¥áÁ‘1ÜR[Uß6Kº#Çüį¾ ßÉWˆ"ï˜3vÂë€NNr6:àJVºµ§V‰ÃÖr‹¸Š¨ï¦…/‰óÈ0$^³ÅqņçÜ3&+ÝGm “,H•÷o*!¿m&:”q … e—%y˜L¡P XUf«ܕUGøòïÒ¿×5^éuÖrÿµê¹]†/×þàii/W4ÙCažË2öå©í¬¬1ìµ¹À­ƒ+åK?“sUPŸ?]Êò0–…¼Â©LóˆÞc¯ûK°}wzV™2 f'7eÜ‚¦>ßà¨Sqg+,å¶aðjð3£â1³¶þª4‹e¸çŸ{ˆßžx.i®j> ”˜! |Bì)`¨0Çù/ $£é¹@¾[ „QàWø¼šÀÉx§¸0C ±3†^ $;¼ Hl ì¨ù±U¿$\S~€ÅøƒÂþËîÿj°$z endstream endobj 4807 0 obj 4626 endobj 4811 0 obj [252 /XYZ 31.5000000 446 0] endobj 4812 0 obj [252 /XYZ 32.2500000 444.500000 0] endobj 4810 0 obj << /Type /Page /Parent 2 0 R /Contents 4813 0 R /Resources 4815 0 R /Annots 4816 0 R /MediaBox [0 0 595 842] >> endobj 4815 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 4816 0 obj [ ] endobj 4813 0 obj << /Length 4814 0 R /Filter /FlateDecode >> stream xœí]M·½ï¯˜sšdFK–ä@€Œ;N`ÄFò÷3;Ó=»bÏ«î~Sd³{hÁÚÕö›,V½ú`±êÍŸ>ýýðÏßoÞ}úÏáÇþë»OOű©ŠË‡ç?ß¼þmý÷‡¦­?þúôåðåéãÓÇÓß_ž.øôî/§ïþw°‡?ŸþÿåðÃßN?ü©ÿ¥ç_øõ©1Íéë¿Ï_»Æœ¾+®_Ÿþ¯§¿þáðÛóˆÃëúÉ|ýïolYÖ}žÆÄ«¿< Ë4ç?¿ÿøÛÓ› –½¥l;×–SºÓ_]iÿýÇÓϧ ÃÇ®4¦©Ë¦¸çE½¾ÉvÅ¡jFï9ÿÑݼ,‹pƒŸg®Mãj#~lkÛ”Uѵðû;Ifz’Uc¶ÒØnGªÓ?òÒYh•©2ì7]S”ëº (Ê×ÑC¿±ç<óP¢ -ÊÄáôˆ (m ¸Ý癫SeØo<ºž(wEa]0Q~5º>ùOƒ7]ÀÁŸgF”…ÁÊòéÅmN”_`p[‡Üî¶&ÊÒè§íÿƒß“ïnŸ_ìž­4í!¤=ÐeD®£‡Øø“L…ü<óP ×ÜÙºê%ºªBè:|€Á-¢ÑyæêTö®¸¹Æ¶í…@Ïo @ÿaøƒ×eÀÁÏ3W§J¿¹ãÑ?.Oåò5ú"|ðíç§7LùŒ„õáóϧÉßyùòùD”êðͳoišÃçŸß…kþxøüËSw¬m5LñòÄ~‡ž8ø¤øŸ¼‡OZâ žuGÌÏ>1ïà8·Ï ŽV|ßSÃÏXøÄÀ'o—¯Ç9ø¸s¬áSÂl’{1Ý^)œ¦Ž­ˆ÷\xôýç”G¡¦¼cm)ŸpÝø 37%ÝâÝ‚Ÿdr’€…0`y&Öƒ¥ÉÂXj1¦AˆÂPÏã:^)Þmbð¬1÷b®8ê);§p0 u.£Ð#¢P$mçf0À'!ê@ÞÉ8˜qpÀÁÊØŒ3ÞC¦*3E±—@`@‰%ƒár‚¢xº>áãp<¶0öæe3VÖãÄn¬ÂźšX©0,%„á0­qtÐï•‹¨«™¶.7ùDÀ›Çûˆq]˜Öz˜c « ¤ Þ&Æ ¿Ý$®ãÈ{ŽýKR+öy”‘mL7Gœ106N´ŽéVéè‚”5Ë6±3Ÿ›&!Ï8Þ³3®r˜np×…Yã¤u w;*ÞÖ]2™2ÞbIg"â:`|Š bò Sg} Àyô0@Yœ ¶CDo8·Ç¶+Îóy!ûeCÊcé.Wý¿ñäªJšºúz´^ÕßxO/˜·ž¼‹‰O‘3/fDl躘áã*ä€,j‹ÚÛÌo=tßâ‹ø¹cUÖmSW]mÍ\N¼ˆlëËý-á¨á øÅp£÷zc]Ͼõg?úž¦ãüA ™ñ pÂ^ãنǻƒ{}¨-¢’q³sÀ9ð C”I‡ToîÃ|½ý«]ðêG2Ú;,&:|ï­‹ejsžfL˜Ñ¹Ä„„g/30f˜6/åÝÀަ±¾ æòh`kZßœ%ðs¼ YX¶}œÁòƒqs: ¸w¦+߬)¼Æf¶à äÀ؇ ¥kŽa ¼ÃÐP‚á>2qCÜ é®ÿÐŒ'Qà×µïÖæ<ãG× Æž˜á~å ìaÁ_àc”–-¶÷ð2+U@ êÑâ€åã*#Á陲¾‰¾7å·aĺÊcò¬gbèWîåû.g¿Û]{Çn§|®³%DYØÙ-ó| ÅÉO´{îÌ{"Þsoªj˜)¦"ΧŒ…5Ì=E"‹AÀ'üˆ(”d<&ܬbn~yé°d–Q”¸Å¦{ó3Ö}ÕõïâwäàÄÁÎ\#dÇq°à²ñmvag€I!þºÉBÊž5}`S𡱒m„pû>KC}ª[Ǭ’û!#ý‚?‹ jŸ)=‘n1«5¥:ão¼Š©öpµ@¶Y›c‹…©LíG!„Ô`ŒÝ‡qpšH4Æ—ð·yy(ëÖ¥k\ëcl©Ösm*RW»¯9tMƒÐ¼w”¾ZEš¾>Ú+ºï£ÒX¬ÀW´°qH)Õ¤Æi€GcX†¨W¾R "{Sj¢·€lxÅwÔï‹å`ô5x-CRb ®$k£bœ¬t·ˆì…d/$]/¤­Z_èâZÝË€K÷¬&’C¯ø=Xë*G׆8$Ùån_q’*O¶™`µ1*~A b¢Â¸n1~c§j¸aÊNÐhJðÅê?¶dš›`Én&¶d)ŠåaÅÜbƒmPóû¡£{õê'óÒ‚vuñ­Jo>ÕŽb”É” ª›Ï¿:¡ì‹`é›ß'oÓš |ß-æX=•`uØ(OÙVæäܯœûõ cvjlíëÕຼq#]¾S‹‰êõL…”e«òªÜe!t¬pæN4ž®‡@«¿wçUÏw_7z6?ù:Òg’ R'‡rud_ÑÔ  Hµ¹m±.‚†Š{ä:bÖ=o54AÌož¯"çláNQÚA=Ý„jz”ò´w#’ÃíX^W©+ ÚX5¤žè¬¯(Ö¿âéG|ºŒÆk±hÉGæsjÆ(ˆX>C>9ž„“¡úè]„Zc'MZÕƒ~ÙY¹\½ðÊå·žä^̹³¸sʽ˜q5º©zk·žDëÒÜÆ\‹±å.͹K³8ëM/£hîÒœ»4Oc§zÕeìe3aìÖƒ%c'×ãxc‘ Ép/3kF‹¯® (©'z‚å뤛ú8:´Ê}CYV¹Ï!GQªÏa¬šï8êFÄT\Ç3ÈÉíENnOa™. p/¡¨N׌Mñ n³8VI3ƒŠ›|¢Û£&ŸKHÈœëåS5i=¹·Ôß+^¯B¶¹kâ¬÷ä~¼ÚE*z¶»ˆ|²Í<—œe"f™d IZ#;8k ©SWÛ"wÜ̺ún9Û™fÉ”’”ÄÒm˜G#Ç•!–…hS³Ø&]²fÙ&væìó$äÇ{vÆUë[ò8¶VÂÝŽŠ·åpŸe}„LoSŽ ÇÊbÈñuðÐly»oÝœ)âö…ÜPõàe5zÒ“½>ö5°f}¦ƒŸé¯y7¨PÇ­Ñð“èIŸ¶°ì‰C³îCΦ<Ž Á' ,úÌÕt_G} ?saþæØµ³©ƒ)ÊŒfÞ/§A/dÖŒùÏ~¦O ¹5KÊ''ŒTk6}1…¹g*]_Ö¯v…Ý3zÜLuùïß40z½Áù%èÓx±n©õ%ý{tŒ éjMŽ4 ÉÉâSͶ~µæh†ÜÚPéz³q׌aª™%ýGx1 *2%!tn`œŠÕ¥/Zøq'!ßš5ˆHèÕËœPåµ\ŸŒ²ÈÀ¬(ô‰`$wA_¦›æM¶ÇÑB¡ˆVçÛ„׿¾GÛ²“³ŒÕüÍØÿ¢fºGÝ)^*¦Ê:O3)7(ÝÇáz,‹®¬ûõóíÁ&ÂOö®¼0!©¯j$)³;U`6[Ÿ™Ì"Ì]‹œ1(ëúšÀùz„QøJp/žµÊ¶®M¯Òñ•°µ* ˜¨¥«6—ÁVñ’S¢±wÌ™øIúæYàöô}ÜçZÆZ÷ò–pÍ™)[‹¯¨–ã˜,(ë«ÚßB^×oñ^+>—4ð(é°GÈzcÔrÜY†©¸¢aQÐ9uï–®_-(Â!³iö\JÆB›ËΛòhçüªz€BG_wr¦¨q’¼fŽ\]YÿðžÁÅŽÛå2AÝ$Ñeˆ½aÊöÚyÈø&0Q'@¨pMTª‘íS;Þš|®/ÜÆ5T{~eWM”’X{ÊÔ@H„ûÿD4½ZÞ±ªÚ‹Ø ‹›âX7fæí”ýGû×O癇“ÊÁÖÎc×5fÓ‹r§|[d¹ÊíºÀ¢„D3y^ãeàC&¨=?Km}v‹•(•ÍËjîBæÌ¸Ò×|Dº=sž-Ü¡z•oº&qÓõs1Ò»AµÉXçãÞþÝÜE„vÂik†ØY_qí0 Þí(嬷noQÿZ|©V¿ ©åÖxK£1Þ=]œVuäò…£PiQ=Jcü”ù.g¥K„ÈJ }¬[îGÚG™€‘¢lþÌÈ^aœ—À÷…Ë·ŒÉ›}°½ Ϙï”ë`œôX—,Tò™ÙXà’` d°=l¸}‰WÆ„W1-°nÔ°'í«€Ê²k}·/°–QVkX¨8÷„›£|"áÈQV|³"Š9qÊž$M×ÕÙ­O‹¸aé¹!¨Õ8=‰0ÑUªÀ“Ny“ÚÝeI1ÇD˜ ±5ɼa1`œ ÝËOó/ÅcGðˆUÓ‹lõÃóBÐgýehXý*Ec [߉V¶í‹cË‚Òo,…LÑ(JO#%¡§Òó"ÁBú×ï_ÊÖžŸC%¤º`þ[«V_´ÔJ•Õ–hóRMÝ%0ò¥š+æK5ùRânïíR@†0ºàÝžBŠ(ØÙØ!c§Á‰[y[T%0 £*椽᭮̔ţ —(Ä4½xT­å Iéu‚WŸHŠ9˾6¨ŠxÖÖû(Ø;ñbÖE±Í…i€µ~ÂØƒºR‹wëÜø[åXëaÞsrcÉÂí°#ñµ° x4<7¢‘¹2‡03 ø ï….ãK4 8„²¿ðgTÖk ?Có_Ûµñ¼º„µx¶H e‹´Àr¶ºvUÖ9X6#Zå­™QˆÐMBüIW×b»Î@/ke}«rZR1­ÙblÀŒc­)¾ŒÉ}Íp2ñ8–ZѲi;;¹ßYê"Ƴ —3ñFiíÔ²§y¬3æsXOe*vNœ^áõTø|&KS–¦iirÓ3}iÖÃÄʈèÉ6)êOP7šŠi­+µ¦©ž™:¢”ÝäLS–@&Š&xêX cþ'Îê1 0ÇnSjO¾£Ã+eʯç3…‚ PÝNï q†±¾Ô¦Œ)Óm›hGÅš ©ÅïÙ°oÓ6÷`Àê”×El,gø= a/™‘3˜¯‰õ³0>ÓÄy¡…°w…µ0M×Þˆx2fŠ¢¾GšÖ `@ÂÔÉò¼Sy.ËI¾8V5g5çQÎ8Á[¶? gXî.WS‡ÉkÉ9ïº†çÆØ·º™&ŒU®›q­œ;ÕLHinŒ—-ìÔYBLe“Å£x4¼?„Ì1ÈíÞˆªüñ¢ ¦¨ÝäêÖ·#tm‚õ=:| ‹zæ$œ NøS%–3ÕÝŽêç´÷ä¤å}ÔÆË”qCÈAÇsËÂqá1èžEs#nÅ(ߣgì4†¢Ì9cDëÅæë·®¬MŒmIä<Î"…;U9BŸ#ô¢œâê:Âg Ç[œµíªé›ªzÚ@® l¬ y¡õ–n KÕjT7Ó¸õ Ã2•qµ·‘Ùv¾Î  üØÒztJó2ì›ËÒÎØÈÍkÖ¯²™*DA=S9Ÿ¶Tð—©·Mõ$òù–êbµ Èu$ý¬Ó… ¾X§óÑ•o © CD·g·Ðw€©“ÌT'VE}­© ¤wµ,&Tµ=«3â6›ÇÇjÓbìõ~E¬6-é4ò¦A0"Ì´SUi´[~\›Ÿê´0Ú§”{ªwX i„1ó.Qo‘è·{ ˆà›u§wvâ›é˜X‘Œ"an#ýàžVRº‘ G/Z+Õ^›l¶~°êƒÑû¸oï¦Á!c9cÜÝM$°«Z_Û`ÀʘÑkµ^Š$å*¶ò‚.JTl2½˜Mî^µ…•q×6,)—)ʼnø 2§qûC}aš14 ® 岸ÑyçŒ\§?‡/'ˆìãÔ/̰lÚ[ðæNfÛiq§ìpý·¿ÀrËZ¸P»¹ß|±GkÎFû]Ÿô‰BöØÇ‰_íªªø{ô7eÆßšÛ‡~¥£Pu¯Ý°]TúÆŽ ×ãö̉câÆ2  ~¦WÅfÑÒ›¶eîùûâšÃkÞC3¦ZÎø3˜úì¹[Ìîoôø˜î­ÿ«£`úC0xgàú ¶¯ß#ñ8ó¦ÅˆlÄ †nFüðgsaé˜Äíý¢ÔîØÃðL™‚µÅk…4¥ŒŸþ£h¿ endstream endobj 4814 0 obj 5218 endobj 4818 0 obj [253 /XYZ 31.5000000 656.750000 0] endobj 4819 0 obj [253 /XYZ 38.2500000 286.250000 0] endobj 4820 0 obj [253 /XYZ 38.2500000 608 0] endobj 4821 0 obj [253 /XYZ 38.2500000 286.250000 0] endobj 4822 0 obj [253 /XYZ 38.2500000 608 0] endobj 4823 0 obj [253 /XYZ 32.2500000 656 0] endobj 4817 0 obj << /Type /Page /Parent 2 0 R /Contents 4824 0 R /Resources 4826 0 R /Annots 4827 0 R /MediaBox [0 0 595 842] >> endobj 4826 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F8 8 0 R /F9 9 0 R >> /XObject << >> >> endobj 4827 0 obj [ ] endobj 4824 0 obj << /Length 4825 0 R /Filter /FlateDecode >> stream xœí]KÜÆ¾ï¯à9€)öƒ/  ÕJr H@A'0b#Šùû™6gwÉùšìoª›ÍÙ±`K—ÝÅzwu=ÞýñËß‹þV¼ûðå?Å7÷û‡/UÙÖÕðOqüõÃË¿Ð]éþ\´]]|ûåá{ñýáóÃçÿ? /|ùðçßþWèâO‡.þú·Ã_þè~èø¿<´ª=üþïÓï}«ªÎ¿ÿþ_ù]ñëqÅq;ÌëÿÿAÛºiÌŒ…­¿?ŒŸ©N¿~ûöëûa»Ø^ÝÊ[¨Þêâ¿ÿxøé°Á¸|UöV©¶±muÍF­>®Pº¯ Ó¨ÙF§_2ËÇX¼±?A.Žu\лzÙ5îøgrïî¸q[ég©®ˆËV]kÒ´MÚœWAøÞöñ?A.”‘©àâ‚”Õ•VNah# çå#`_kâ-~‚\+޶žÕ%‰kúÚ!èðoüŸ—°xÝÅS äâX‰‹W—$nk÷Û¶Ž€¢óòðotÕÆ#î rq¬ŒÄÅ« ×èÚY­&‚Á}^=mŽ'¸äÒHq¤-þ9d Éð7à ñÝóâãׇwŸ”­P5Åן°ö~ûz@I]üp<]ØÃÿýXü¾ªÌãН??|üz=ú®d »*{Úµ/]ˆYzRôD?¢'¦«}‚Oz¸|‚¡6-\í=zb+Ûøâ Òjˆü¥Ìj â@ÕpŸðI¼cNL*3mw…̘§tÚãÓ·&Ý=òˆ÷Ár‚ñåçK1Fñ—Â'oGíW¿XS_!µ”Nœ„©…ùÒë mzÛqÌ@Ø*Îÿ²Ügú„†Â ?!Œ¿LñÿSøIdzô™ÜÇ£°†½6¸srcN÷6sϨ6‘ü,µ˜— i¢öïhfE»k¡»ÊC e¢kšk"‰x·v »Ë™°œáS¥Î]6»6? gû|×w°[ÛT×Ü…¥¼µ;l.¾kWh{iK¥†-{óš-•)5Çüïg1kÐ lʦ÷üNßéÑ;ÎÝVmit§ÏžßKÊŽ/M™\«ù;ø \Í©´Kû@¨h^úÒ'¸OÞQCp­-ûnºe }†w”~þY^ÿ GdúcÆé„ë[ˆïO¦<¼0ªvG¼Uˆa i$[Õšñœâ4¶ªÊ¦U]ûRœve×W‚ŸfËü¹µ¿ðŽ‚O›×sD9ÅaÊÚ6Ýk´×ð ±ç{º5Ë›éZ¸*†¾ËÔpb† ü¸ÀÀb¤`Ö±#Â}œsyi5ü=ÅðS­G$¤:–…—'PŒ?†G¢gˆ~&5³w1!Úœ—r鼚Óäjòï‰wÆ+3§â×<Á°éhòÄòÕ‚Ga` BYW˜­ŸèÑÖº˜À Ò—á#£ÖK7–a¬p°2Ķ3=VÔx5FµŠ²¥­}‰3ÖŠ²NA¿ÍytuYõg+2çÖër½RòèŒ7ÂøzÆ›¨è¡6äkï as7©9©å!>݃ÌfX `""íaç%×;¢µê5µV„*¥\B((X<8œùy„ö`,$†IœÖ5óàâ«ÜâDGÏ®ÆÐI=®?M`]A¨}ʼÌè4£$†~ƒj ý¢÷}‰u¡À§0l;ˆM((gG„ÑêÒ›a¬]Åèö•U3XrÁÆi¨j5%bxÐÖº$VSV³EƒCÅØ{Yj¼ÁR©0&ÆÖ‹XËJx/ÌyÉCäß+QÌ2Ç$Æ~áHuT„üí!2ã·6;zÄGĈFa=g ,[ÝÉx¼YæNk=±ã›ÍÆÔ³IŠ{CØOÆs–=þÍE)àvD48*{:Ju̼Ç;„ܨ2¶|7b!,ìêטG»ª)“‚a ýiB#ü£Tz‹h„æœÛN3‘$Ïã·—#³ë ßUdâ#T "kmqKÀÍg©cÙæ·²ÌÍ4sGâ1¶"¹e9_1~sÚÈ ãs "ʲQf*̲-û&\WÜOR7s’ÂÒö~ l€‡ÅøB²‚ŒS CÜÂ¥S‚…9ª¿¤ usÒ…Ýs¿§ÑW˜q4艣w]ꙓ߅¿ã¸õÒ;=|ç\488/¨úþŽnGî™zEø †ÍEC¼8}çúR''—0ª‰ÕþmK3c=ŒÑ±ØÊœ”åeÙš@0Û\€í„M¡}œM¼[õA²"–îÜòÌãvßú5¼'zÁ8Ä™'rbÈÙZô„“êŽ7ç«V&#•¹Ç¢V‹AÍèÞæ6÷žøÃ1In¨cÖ¡TíÄŠÝÈÍÆfwßLÔܨ¹ðméú#£DTc{­Ÿa•†LéP%2·¡•2~ÔÒa/z MÁY´,÷³¢˜Óýíë³ÀCT6þz¬išÅ$êFHe(á¦)GÍ3ãŒÓ9gÜåá&Å=FÄ8î%®éꉀïóæ*›û©¨;5UÆXnÖÇé©÷¢­¡pxnÓ8i×LÐMu!žÕ£mÕÏ/ÃÞÆgªQ È¢îo%Œ”pŒHé$ã•1 áÖp¢¡i¦Kм•ÔÒ™‡ÅhýÙ­s@µ=ãÐKó'®!ëü©ªžzzeÔHmÑÕTô ƒRª[ïb‘O*¨#!åmîEB8û1 ·îüv®aÚ‡eSC\žuü¶æµŒez2Uñ¨_œÇ‹3–ñi›«œq$ ›ó~X~-Î>Æ2ƒé±SãÁÎD&¾'¯çs3Ñ¢ŃkœŸÎTÉ9à¸ê‡ª‡`°Ã ÑÞ£„,P¾‰Z \ãµO=ê±»{±Ã™ø©4¬§ò£Nè-ôúÍÑžñú* Q«äÑPsy¸>ÁØñT¢l.)½åÃ9zY+b]ŽmQÅçñxð>„òTʽŠËñ>LmãÅzžÐ\ÃÓ¦%ΡžZo|bÀ~æDìb¾Þ¥ü0?au¶V漫XÅ»Ú~ù온&ÜS)MØÏ“]z,9Ë–¬mÒ›ûfŒÕJêµ5ݲ4m.gÚ箋»±‡LJ]¬«Œúsl® =ZZ´wÈ­i\,[9Gâ™ÎÂXbŸœ¡6ØÇx3]R°ÍÝÂk]_aá€ù’јû¨X1Ãÿ˜ö = mÏ·ý)=‰ÆìZn³ö>ˆþWwïãî}ܽXÞN/Âsk7"ûôRÚqS÷d)í¸ÑçoŹubð,ôš¶ž’qžCúöú ¥žè±y7Aáôù[«Š;{ë­´ Q —07Ûês\=ãž¹Lg\Ù³µpQƽé ¢„~‰µç¡Ý0?]áS.¦=ün‹}Eè£X >à8>33=½á;LtÀód—çy&›šÒ(6|6ñH:Ö8Ó›ÀîøϱÌFC6ÍòØö´ßþŽ)Ó˜—·_ fbñ@‡lvõ]6ï²y%ÿç¼Ú~e³®ì]6ï²¹Šÿ †`óÕnR6µYæò¥'i µz‘wªEîÌ’M0K5 Ì£óûFݨ4Ýk?Hk€/î…Õ¼ÞRUeӪחáU5nߨ‰Ž7ÀWj³[_j tÜ‹³­[Œ dI5†ÁÈø{$ºÝ1]=ïàëfæžéÞ‡¡Æˆ„OæWÔ˜yq·of\†ìœ&1f}£9Ït$¢Gœ»v š;âÉÉXŸšÃ´ð\Ô¼1k51ÛŘš‹RÀL£D=öSá/d|ü@Û8`+ `©¹„b£&©á.¢dÔ0bz‘lûHá)I;Œ.wI/aTˆ< [ÉO+¿ñÀ9³5å˜çÚÚ©­eúaçw évÈ÷“^½YÒ¬ìá\d¦'3Kȳĉd.¸b,[‚˜©Ë4ÊgJ'pÎw»^`1H²C ˜1¢ÌP9ìYa:1}àEÎU`‘ˆü¬u³ÄÐ2ÞSáÃ$Á‹ÉF¬‰LÅŒ;¤@d Un…}y,ÂÌA'òÐçÔ>ë5Ñ}LON²!<—8Ñ›¾õ…s>°"X@É1ä.{€Ÿ14@^Î{ þáD3BÈ=þ“N ?Ð5ãÝÊÑó¥Ì ¶„I¤®Ö_ó„Ä0·R-r$¥{gEme2R6Ìóé»fÑdmžðw{\ºÖžÛ°xÆ^ã,<¦ ñâ’2ÑI;(ÅKCás3<wÏ `ã7¦2‡é€yÑ3œ…àE‹¿”)ƒÛ âOÜô¿ƒKu ìxJq17.×|ŸcÏeý)Úý®€ç\nìá¢<KƒG¶˜¦rÿ20eðy4;ïºX¼±¡0žácL{¨q©Õp¡wÂ6] ‰Û+$„§7çql'x¼0¬S0_á6ÌÈË»†Z¢}Ý,cËÆ´øßœÀ•gÄ/A-Üä—jà ÁúŽhš” µ× Û¢Æ„0þцÄ3,šõ¹4y¾”87ãq$¸i˜§5Ó &‹á&}oóáåÕcØöƒÏeù’ññÉ?gÃc3p”PÔãÎz‚ÚÔ©ÃÆ4¹Ã>:>âXÔÂç¸}âàξ3sMûLu¾ÉJf]w9„N؆¦¤°¹fd`ˆ®©ju ÇíÒ“¸G)w‹Që¶SÖ-‹¨Š©Ú8ÖmŸú‰‰âæÂ£Ò±î¼5Œ2ÞÓ{Òø q+ê‰HàÈŽ b­ŠµŽUq”œùÍsšÈãœÑõ‹¼,ûë'Ù󼬶óxV ©¥ªnßÔÂñFYja0%µt»oj%ã˜Eþ‚Qöš;ã·qÁ<–”ZÍ5·¯)£'ª³¯wŠ99³Ñ朤Ct‰Æ¥3T³DÑF[Ý'Oè?ü*¾ðì%Ãç¥XA§î™Œ2e¥Žuð…ÙÆ]“_ªõئ½€ÁÁêRÍfNl3âØS—ͬ…BXWOh³TÍy ¶OîKÛYo…®æ8ï¤ ;¶ ˜} Óª¸Â —Ò^ø …Wƒï8aPAŸþb$ËpÇ? !ÿˆör¹ A, qý3f§pÀtõP| «aP¯gBwĶkx‚øbÌG.¾a·bÓ „ºýK@¨™ïñÐé#Ò†eÑ]/meJ§ÌWJ&Ç©mgÖ–LZñùáÿ Å7 endstream endobj 4825 0 obj 4677 endobj 4829 0 obj [254 /XYZ 38.2500000 703.250000 0] endobj 4830 0 obj [254 /XYZ 38.2500000 703.250000 0] endobj 4831 0 obj << /Type /Annot /Subtype /Link /Rect [273.750000 674 327.750000 680.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn42 >> endobj 4832 0 obj << /Type /Annot /Subtype /Link /Rect [439.500000 212.750000 465.750000 219.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_special_macro_typemap >> endobj 4828 0 obj << /Type /Page /Parent 2 0 R /Contents 4833 0 R /Resources 4835 0 R /Annots 4836 0 R /MediaBox [0 0 595 842] >> endobj 4835 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 4836 0 obj [ 4831 0 R 4832 0 R ] endobj 4833 0 obj << /Length 4834 0 R /Filter /FlateDecode >> stream xœí]Kä¶¾÷¯Ð9ÀöŠOI@``wv&@3@FÁ:v`¬L|Èߺ%õƒê¯$U“5Cì·Zd±XoV?þåùŸÅ/žÿS|ë?<ïÊ}eÊîŸâðóáòYïû¿‹ª6Å·ßv¯Åëîëîkûß×]÷ÂóÃßÚ¿þWÈâ¯í¿¿?þ£ýð§þK‡/ü¶«DÕþþ~üÝT¢ý«<ý>|þïÝßÿTü~q˜®æúÿ?Hm­Ò0&¦~Ý ËÇŸ?¾ý¾ûØ!`Ù,ºQÒÖ…Ðí¢Ñ²øï¿v?· ×ûF QY]•÷LTÉãL¦)„lÊÂÚÑ<Ç?£‹ƒ+©Ã ~„Ü7R„²‚ÜçΪÊvè1U䣇@¾V2 Ù ÷”agáà>wÖ¸WR@ ¹µMS‡ü¹w¬ {‹G÷¸¹º4e ¡ý£èbøƒ «Â ~„Ü;VúÍ%F÷¹¹R ¬U…@Ñyøƒ«:ààGȽceØ\<ºÏÍm1P,Ÿ‡ÿÊ GÈC‰ebtŸ›[&‰ªË(ªZÁ3øt‰ˆR—Q;lb‡\!öFÛº2è0Ç'jx0BÇ¢'ý&ê½V]ˆÕeíz_7å#3 èÙ¢>¢Ð °½£D<ùpøBÖ +醰;Ü3›¶z˜K¼Ãpu @Ø9UhÙ#ÊÊÁ „X²P\tbö­Õ+®žÈ'G\Œä ,ž4­ÐCT ßÁ¸ð Ao7ÜÂëPºö6À-YU65È9Õ¿4ã 1rI"ŸXDJ/üoMŒAúŸÀígéaLfx“çs¦} ì´Pƒ€¸o+!÷Ër²¸”_-]¡Ë xŸ1º±Øâ ûØôo–åXL˜Öá;XÊk aÃHI+ÃpâW! †Y¤§'íüóðê ¢%ΓXœFh•OóÉ€±=c!)3Ë‚á|Eðïñ€'va$¶ÂHؘ ñŠ}áX¬„ð*ɦҷ=µ‹æ±Ï³¿êÿ^Æ>´ZˆõŒ´Ì”}ëaëB4·6QÚãšÒ\O)ʽé¼ÝóZ-zÒcÛì¥5ö~½#žà; |§¬ÔJ8ñ* ß‘hÑ,‚a+áz† “¥v¯„t¨ŽÖ˶ƒÃbÈ+™x‚s,7æ´-…ñ'ƒèÕœQ£ç8Ç(9+¦Ë1ælgM›¢¦]"x²‚Í 6+Xß 6hž‚1®W;VÏyŽCŽˆ„!„r¸‹VædY7ø>[DŒJ”|¬¨k¶ö•Š3eq¾Ìü%2ûà<f×ö±ãRSY»žS>a1/vï8¶æW®p«¤taIèÏ« Ž–%æÃã‰KðÇÉ\â˜a¶Ó’ó<Ìt §‚нühD`•!Å|Á©FàÔa „s±¡>Ó¸öämêÀE8ð—'Ž(Ì í ã¸6ׄu¹,1ª]óð!àøø §›òŠIëÇéptŒ¨õÁ¸ F:'¼=‰1=ÈâHêPd{è«Ô4—|ß=+³…¾fO}CÀMÈ°Ž¨¿òþ)´¨¡se¬3Â8å¸ý>Üc?6Ž_éáïŒr^*¬u))§ûË-µÒÁnèlÒz=ÕJØßLúŒ¡·½ÊáÐäü¤oåaö¥ÛöWUôM$äð(€è€ H‡²‰ª/Ž…¿@Núˆ8D;¦_JH¯`ãžÑù9ÿ‡ÕZ¶T®\e4xÆ-è‰Ñ°¦ãdáT[Üb:|nŸÉ7GkÞ$CrrʃýÔ‡r¢S±)8A"Nu‘~ÍfŽU¢´0dw=Y»Ìµ¶]´Ä[‰Ô–ÐcX¯áÂ7VäÌŠŸÚˬÕÕ{Ÿp¢¬ªjŽíê5zâ×p ¬ùs/pÔCcu꺣3BÐÏ8¡š·"£bœ©T 7u‰vX°V»†è–—žFŒÐëÒ(N‡¤QläÑM_æT.sêä– Ÿ×â+›pì^˜„}pâz6x•†šxWákž…½8vÁÂ5ŽÅO]ì‡úZGëJ8ú¢Nm¾äs†WZ& øqOt5MqRLÙ˜J²b}ÉóJÎÊ:ˆE—[{¨»$85ÆuFjs•Fâh"Bü~ø„±?%ãhë{š2F–Þa¦¹¶.õô>&¬[°Ü ,:xNEHR| èú’Ë+õ2[Â\s.ygØŠ‘­e»“ÓåЉT`ß ¯A/o‹ã9Tç°Úž| ì¥BúΪgP…~·,—q*ÄNLO°¶bšë°üNØS!Ö“p¾ ë÷–Yñ>âðL=ƒÆ¼>‰fs"  [P‰µhö X¼3VV7Mdܨ§‚é%a¹Aœ÷¼¸~œ)&?7¢¾ƒ7cú¼NNû=&<§ ìƒÞ –)˜§<ú8ë®Ì5¶ƒR0 ¤Kå8眄%_}K6yQÐj©¯ó0tY«iÙ‡´(å¤ìàè;Î9?¶ˆüF]pSõ”³Yz¨ãP…ÓTOÃéö“ðd*}[T:¡oEsRþ[háËéѶÖm2ï¶þ¾kQvIZïíô"dý}];ØÝtK¾°¤¨T5›±rÁd…Ãw8ŠA…¾žM<ËÉC®\uE8M :£Boܶ)_pJ 7ÀçéÜ›eÃU‰¼š/â\t_ÃÃ%–¤D\C”È$ÓøÙKKÉm —­õõ­õˆûÞh_ßhéöÎyVKËøf½“ËøBPŸÍe|³ ˆx€#ë\Æ7g·"¦2´>.ãs0"sßFø$—ñ%€Ñ$Êø´Ò¹Œo–$Ýd²n.ã‹n},Û…˜œnÕõ¬A-¨‰£}}ÎÍ©t9•Ѭ®f$)EôÄtsÂON¥K:¢3•Μo¥‘JgN­˜r*]¦ÒUœmà,9ÉØAÑ@sn—”Û1äv =UØS;žw—иŒS“°#í¹¥JnÇ@fnÇ|;mO gr;†´#a¹o‰·cÐö®&B¹CÚr#·cHá¼0*?ßÕà(fDË6iEتóñÅ{jÇ «s[ŒHw.ëª9õô[ê÷¶{/©þ£¯2î›g]y¦* χSpqiãª#¢„Áïµ|îÆáÃ9ÖÁ!'ñ/}õ\ú¥°ÎLqê7ãÔvÉý3›¬9Y¹ M«Æ•æï-LPUeì¦Së&D/=°œ#$:F§ý–èX¬^£èµ›~‡¸èB@¾ô‹úR¸(5¬_¿-†f„••«‰{U·,ÊÆ×~b¼ã÷Jõ¨3ÁKœÃ•_R·¸¢îî“Yl!æ³…(ëð…aˆþµýŒ“àè0$Æ:.ô¸Î–:ÚW¦Ú«O¾ïž áF*a˜kOŽ}_ŸÊDZ°ctà\ L¨…°XëàÇ,ŽÔ-éVùÂ4|¬²ÝýdôK¢1Šæ >aÀFp*ŽË1VÊiÖ7Vì /Î3ºâw»’Zº´î7¸µâʺ¶3ÚrÎ"½Ž¶Ý¼·ºÖ×4½ìTÖ-!Cι-6…C“8çïâjÆ©"±RˆQV>µr:àõ02pîìed+ L£x8Õ‘Ó›òž WLIÄê8ôïó1s7yW6äêTŠspX‡/Œî2îÆti°$D±±º:$Àg8OruŒ¦ÑÕ¡ÑâzÖµ¥•a‡ÆÄO3]!¹ÍZ¸õ%{ö‡i‘7íɽÍDƒíù…¦Tvš²s=T®‡ò¾ÒÍÖC™ÒÜÓoÅg^û‘JL8 Ÿ£_½jë”cPœ•zŽAaªâXS£œúüÄ«ÇI잇3îÓùc?aTM±¨WòãÝæD8ñ(¿»½>ÿ°ìN†ò0p\B@ø6~e¶²¼ö»àP"±R¸ £~!`Q…ÕePÏ'Â^ë94ÁX1¦#Y¹0Æ%ÓEí-š[@¨9ë!öéICBXÔ÷3dUª}/Ìgr&§Ò«µ)•V|ÝýAÇg4 endstream endobj 4834 0 obj 4112 endobj 4838 0 obj [255 /XYZ 38.2500000 687.500000 0] endobj 4839 0 obj [255 /XYZ 38.2500000 687.500000 0] endobj 4840 0 obj << /Type /Annot /Subtype /Link /Rect [292.500000 657.500000 387.750000 664.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_exception >> endobj 4841 0 obj << /Type /Annot /Subtype /Link /Rect [129.750000 332 188.250000 338.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_special_variables >> endobj 4842 0 obj << /Type /Annot /Subtype /Link /Rect [106.500000 156.500000 152.250000 163.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_clearing_features >> endobj 4837 0 obj << /Type /Page /Parent 2 0 R /Contents 4843 0 R /Resources 4845 0 R /Annots 4846 0 R /MediaBox [0 0 595 842] >> endobj 4845 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1409 1409 0 R /F8 8 0 R >> /XObject << >> >> endobj 4846 0 obj [ 4840 0 R 4841 0 R 4842 0 R ] endobj 4843 0 obj << /Length 4844 0 R /Filter /FlateDecode >> stream xœí]K㸾ûWø`=âC/``ç ‡ƒ ‡ ‡`7›`±³Èdùû±-©»-õW?)ÚVÉLš-‰,Ö‹UůÞüéó?öÿú}ÿæÝçÿììÿ~÷yWê²èþ³?ýùîålsèÿ½¯›rÿã×Ý·ý·Ý§Ý§ãÿ~Ûu|~÷—ã¿þ··û?ÿûËþo?þð§þ—N¿ðuW›úø÷¯ç¿ÛÚÿU<ý}úù¿wýÃþ·Ó‡Ïõ“¹üÿßY_WÅyW>ým7,Óœÿüþão»7¾âÛÒšbo¼ó{Óz»ÿï?w??0¼¾8´Þ˜ºòu±äCµ=~É7Îîm‹½kŠÉ‡Ît^oô_~¤’‰öònæêT1®2òÛ7·´•ë ÔFØÜ¯ðr_ÆäœÓÌÕ©Òo®ðvÍÍ­Šž@¶h#èéõ1èßœô[¬—Ÿg®N•asñÛ57·©zê—u òW÷¶5MDÆ9Í\›(ÃÖ—kîl[¬o| ê×ñ$«*šˆ ¿í¨«L•aoñÛ7·2®Œ¨“Ÿ_cs·¹ÝÌcédáíš›ëÑrÖE ‘)¹uOã÷Ôզʰ¹øíš›Û~ØÜjùùõè_[[ÇÛÜóÌÕ©2lîäíŸBÞ‚§ÒýœÕ¿ ¾ý²{ó±Ý›jÿåçãÌÎìþúòuçÿçäß5å—Ÿöß…«ÿ¸ÿòË®=ÔUYÙò<¿nÄ¶ç‘æÐ´ÅåHaáÈ»óˆ?x×…CžFLE¼­&žùp)Î6æbÄàg<š5þŽñá4p»gfLɼý«ø{…½¤À›€I ‰#L©<¸C髦žùf‘~ŽôT zF˜Á8҄๙÷Ä à¬ñ.¸ ÏšX)Þ¹â‡ðïàY›ŽXb=ø¸sîm: t¦¼ÎIp¤€´º:’fuÎ/YÝMê¤Þ9âÅÞØÍMày,˜ÖxnXód¼RyÇœ˜T#”nÌPr†%ï½*÷9ü6ÂV þa „õ`]ƒ¿³ºWÀH†kòmSó?ÔIÌã=¾Cø—óåê<¶yž¢H¤™+ù8>S2V8‘•`æFÑÀ„¯‡¡ãõY¸ì•ërÕú^ Þ =_ASÜä.8Ì£‰öKVR¯¤5 < ÷>ÝL½mÕ¿ÚìMûÚ'mÕ}²>Ù»¦8téä¬\¡‘> Qì$Ý„?Sàï´èשNcUmN¡ñç ßöŽ|„4èßfeë.³M˜Ug:Þyqp¥oáÛ 4"ÐÀÀ·Aàï˜p¤B3À+Åß±ÄJm¿R?=Ì™ÜL·BM=!ñsE3’¿^YšjÈ+ÌàÊÇáq]NÆßÁ»à1÷ù¹à¬ñÎÝçnGL÷¥Q¥­/=’×ÊL4B%óq¢ñý9ºŒíœgpb§I‰¸ÁÇsýC3Fðw0Eqª]HZO´Lî)–Ò­Y"òÚöd™ùVLá SF%,©&Ïx.¯ÓzœäÇ,ªZsP¢€Ù€Ú[,>Ã_­ŠUÊ8)C¡8S•Xø©rÕøõTÖŽ­äêÒ­\ð¤Ê·ŒÕO^&<¿Ìu*†øY\®•È÷¡ˆ0­Ëá©ÝÇÕ_Œd\Lѱ;¡‘œ°›®c"Liâ+1r£L=n±5ÕH½;œ>ÁÉ?¢\OZÃ@·Pd‚†×BÓ§9òïØzF·ØÇŽ÷TPKX]0eÓǰ§MWág+¤ÆlRS`,’Ò0 Ó¢pgHø>ãâëRðþDÀé—º†ƒ :?pî%húzã ñ$âNsÓ2¾‰líˆPÔm>݈ð±çT&·K¾œÀ|̉ÌUM&†÷²S²" š?¡].ªåÞ"ó|G©ªÉK&±5âÌ€ƒ”ªŸ¢Iß-Û±-døW3€ñæ¨Ûðª×c™Œ¦ _ˆûñºë‰Ízɪf‚bæñ¸™ÏãuQŽy¼[)&å_·닎–fJËIÎ9#מ°g›âå~Ý}޵Íø”B¥Ä<A¤ÝÇ\Eâ%ˆ!œïë+ýÁšÙªõvDbã_òùñ,XM?5FÓi £ƒ{@4&niA.A¤£.Ž cú`“3cR´÷_ÅÄ;˜`37Æ0qá€l'³ôÇ­ÿ¶P|Bð`˜€>>"a‰ÆßÁÛ’È—¡ O&ÉœB`Í% Å<Ñ÷Wž£÷ˆ¨M$â·˜Á(•9á…åäaæ +å°­ªš¤ÊØà鯕hÄ”¢p„B ÃÔÑ-TÝSÝ?sÎf0)'+¡–!B®ö-bŠÄŒÓF³’‰î±!Sñ¯¦]FÔâ+W¦ª™]!èÃ\Éï6„Àìx˜(D~&ƒxd¢âSÆùJ VY¹*ïáêÝÂà$Tá˜6/%ÄZU.%´´¨Tši}ä *ÖK€ê¸?¼:Ì=PK,© ì”Gö ó ÜûÜA «65H¢ÉXwn–ÑCÄrf!xÞ9Š Ò`a™±PÒ-œ[¥Ó\˜C0u0ÄS"î!SíÁ½,T"Xµs±s 4ž!@ÀBìoc f ¦ˆ­+ö\ PM žf°VÆðÄx„˜›À½Y€°Öf ÜeßƲxìcÍÅp> cøB,›  pÆöc}ÏL×êá=8„ð™"xnØêa®"b"ë[£ìm‹£ñï Ç…ðÛ¨¨Iʾ]°Ã)QëªYã«ÍÓílB/ gLìWcÎÄÍ`2Žc¿‚Š"$Ø¢a¯‹±œØÁž¶‚xDô2…¥¹R¾Ûø8å»qð”úÒß$ª¤iŸzDaÇ;E˜Q €á#Ї"îñܰ2ÆñÍá3ë+ZƒŸ Ã2iNA¡c#€U0‘‚z’ݤrØåÄÁŒ;ÉÀp´åÓ4‰Uº—.•»”âj\e3ÿ:V²K*D©u˜hæLbâàÂR\®4öORÕìo@“:ךÖ@UGÊ\uª¨Ò‰ÉÄmx˜¸¼@Qì$.'ŽRNAQ¦õU²-v9Såhñžn9Ú¬s´L»¬- sY˜4¶Ú¦®‘K–ŸÁúöa‚ºÍï-4"èA‚w°W‚}ACb¯„±‡Œ×ˆ½`\ëâj.ŸºúgÓ\¢¤oaXA×ÜÛ.$;a/Ö•z8’T?Uùh”œõ“à3-zï]W×Ñ ¡Š cêä¬ðNˆéi9T3äÊ×ïßÈd*€õ>§¯›Óš€²à¬ ƒ¨€í3ùU;³©ô/yfÌUH˜—i_ML–ééMùª„›)Ü$#î­_õ¢¦­ìXváÚ&^)u¸ ùM”Á"ÛCÇþÐ-ݫԵ:JŠyfòa&“vŸºiÍ(Ã&XA©}"¯B•¨^³¦(9¥òŽ“•ȳÆÍ{&pB¥ÍpÅ‹î]ù¸¾‹p‹žÁå…®®VÖo)B…¢âŠrh¼,Ñ‚pGü’Kÿ u—óV­e´Tj#„œ5þp"ÿ™úN€³Ÿa:ˆÛY_Ê›¹·î'³ÕÌT[%5jÏ¥'•Ó­ÄLWršÐy>Õáôü×+š—?øu÷9)N)­­d"ƒ’‰f&çŒåh„l5ælÎ"ÙA[yjõ“•’ÇßÑ5 ‘QØtkPyøŒM1j7Ñ®¹xO­-S•”Ük“>ÚFÆÏμRاùÞ´J"ˆ™}Ιtꈋ_?.àjÈëñ®_"³õOL1oLËÑÚ±é¸W•¾~"N5î"ð-2.®], 0&ºië­±qt#®ÑM»¤Š“ÍO;¦„q.ŸZ9?Ü Û08 Ç4å#î|1 Cy½–‹Z Td`ûò HòÖ†q3qå5ms„¤ T$Ú¬ o# Í(x¬¡0D–n<¾á¹à‡ô9ñ© ÛÊ4–- »ÜAÄ˺M¬I7q +ˆx"XÐ ö[ÁöcƒÖ–f€Á£ïíD•;0iÙmŒÖ·ëk®Ç•^ßêB7¬W÷;u›þÜ#T~e–´ÀÚà‘¥·åzŸ{W¸%-½RWe¹ÆWÛ!vóÉK8 `ÎÄ-QV÷ùó8÷×fQLû˜òX/bÊÍæúˆX*ºÔqèÇ‘0ý&sIB¬˜ˆj0àçºÑ&«yÕ[Œ.?Ê^ –F»À4Ày”hÑBñ–ŸD'[an[®åîr-wZ3‘Æ+)gÐWWbiº6’†"ÕåÂèdM6ë/E& ¹býZÚ€Ë$ û®Z¸/ÜÕÇw³ç_1¿ ¹7D™õ̆É2JX¤Ê(aoö>3J1»`4åXeˆVpIaþõÔ€"Ø«é1íMãÆ;ôp5Î:}Ÿ&LªÂµº·Tî”aû†/,ãË XÖˆ‹º÷Ï”ñxð†Í×*ºɲÆýIå©®K'%KƒT€¡ýpµ+`\§¶­&¦.ÿ qLP룂„ºÕ ¯MF2£—Í"_žÕµ©ñS9MÔ:-†‡ $ñmq¼žDXeº^ÎÃÚÑ;ï‘Ô­m°cÂÀšÑâCæiGÁ0ÎÖ‹ow¦ŠžÝiF$(SžAߨ;f,®,ÇÊI÷(7‘il¦XêDšëQÄ;;[wÜ©LGäôÒ6#ê¦H§ÀÙ¸z4ì¡(c½%p&/›±Â¹Õ‘ªr,ô9&C´8v©|šœi™¼†GÆôcìc*¢04PóQ'qŒœÎ|G# ($:paÑ?!ÁɬUBZàZ Â&Q(rªNar̨DÙŸðè7Ø:Þ˜j¾—͸&‚3XO¹ÅŠLÏCT¯zòcñé‘\ÕíÏÀ¨(•fæ1âÈ1Ó_ù¬º^ùbq6oÑüV3>0“°J[R¹Fqˆ¡T· Ý7­*Ÿ®®Æò¹~Õ|_޲X«œúqr˜)šÔ,Ey‰ •~´÷Uj3$U˜Ù6ð^«?sF™Pr¨«'VAÈœàÓ¾í¼Â2õZ7>†QõCÛífhGaÜNh7|B3ÆÆUÖ› –)ëǧæõOUTEåÄÿ!®j.è£Yá&ˆf6›Ë[.ÿU?¦Þè/É¿àšýr×éÝÚ7,}±6âJƒr¼'Q±À:Ês{™Ú®—iÓ”C\W¼üÁ½L›(àèâë†ZåfF Kµ®#ÕíƇÀ4`Ä‚bdl¼æ[Ú(]´oÄMK¤&ï?¿°Ù¢‚& .QëÜâí~IçÀt¿$ƒ® FNÂào½ï¢hÈr †÷=ö¾kërE¶Þw (ßúTÜz߉jÃcÍõ{ßÕ…qWç³õ¾ÓžÛÖû®Øzßå~ ÛzßÝè),a¡ºpKz¨l½ïŠ­÷i·Þw"ïö+\¤é}Gœë÷ÏS*àdM¿ôÉ{“‰»Ãà’œW–aðÛà3ý!Ô-ýE[–áNÿ>ÎøÒ=}­â  g‹{î`xÎx_…¿FÕ°YÏgÂ^cû9 m((‹2V ëÂze>S2átz™íÍÚ5“¶ÿ´û?×!•E endstream endobj 4844 0 obj 5099 endobj 4848 0 obj [256 /XYZ 38.2500000 471.500000 0] endobj 4849 0 obj [256 /XYZ 32.2500000 512 0] endobj 4850 0 obj [256 /XYZ 38.2500000 639.500000 0] endobj 4851 0 obj [256 /XYZ 38.2500000 639.500000 0] endobj 4852 0 obj [256 /XYZ 31.5000000 513.500000 0] endobj 4853 0 obj [256 /XYZ 38.2500000 471.500000 0] endobj 4854 0 obj << /Type /Annot /Subtype /Link /Rect [210.750000 667.250000 323.250000 674 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_typemaps_for_c_and_cpp >> endobj 4855 0 obj << /Type /Annot /Subtype /Link /Rect [308.250000 654.500000 344.250000 661.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Library >> endobj 4856 0 obj << /Type /Annot /Subtype /Link /Rect [43.5000000 647 540 661.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_exception_typemap >> endobj 4847 0 obj << /Type /Page /Parent 2 0 R /Contents 4857 0 R /Resources 4859 0 R /Annots 4860 0 R /MediaBox [0 0 595 842] >> endobj 4859 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 4860 0 obj [ 4854 0 R 4855 0 R 4856 0 R ] endobj 4857 0 obj << /Length 4858 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯ès€m‹½€ Àzf ‡† ääìf,vqrÈߺõ˜nª?Jü¦HI=òÀžqkD‹UŪÅâ‡?~ùûñŸÿ=~xúòïãÝ÷§/‡ìTæYûçxþúîú]ºŸe•øõðíøíðùð¹ù÷Û¡}áËÓŸ›ŸþwÔÇ?5>þõo͇?v¿tþ…_¥*›ï¿\¾×¥j~ʆïçÏÿuøË[ì»ëˆ¹ýÿwÚVyYœÉ˜èúÛ¡¦º|ý÷‡ßZ„õb2s}TÖØ£ª­>þ營šúæ³Sm•* [foé¨ÔMOE5è:;mG]¾dšWò—Z—Ño)çŠ2…ò·.8¹¥®²ŽAÆÄàÿÐ|„Æ­Ò%§ºpW˜+ÝäzZ—œÜÂ-ƒšå94´ƒý¥Rñ¿P.Í”~jaã’3ÛôÒ²§Îc0¿o=ó›ÿE›3åÒLég6~ªŠîü™ìº:÷[ŸuÁªêu¯²ÂÆ“©×Ö#L{¥ò*^ãÊ#Én\rfµÊ"ÎìÐz 曈ÞaKy¬™…KάŒi ÷íªùÛªŽ(7gÊc¹ožÖ%'7·*æä¾6¡ñ¢ŒçB´”G›\ܺää–:盿¶ƒýUÑà_(ä›ãÆ%g¶ìZó7÷#šÍ:+#:RÊŹÒÏí¨õÏ!­`RÚO¦÷Íóâǯ‡Ÿ”ͲŠãןâ.}¶ß¾6LÉß¼&:øúãñ÷Y¦ìŽ_>Ô§Bç=‰SOLŽždߘïá;Ÿà“ø¤ ‚GªKؤZð ŸÔáïxúy†¼6á(ÌQLä(Ó‚³€y ±ôâ'˜6BKR=ɰ6Â'ÝÆek°•¬?¸Ÿ'ÂVA©òÐÆh æ5î?ãÑx¤˜6‚o ?Á­á'ÐÆ{,a•=:GXm¶×Ø*3+ž…–o/_7%º‡Qåo±iX3¦ž$Îlo/ñZ[Kуˆ±YKL^»Æ»,ò =®XV§ªÎnŸt"vïI«šödM» îŠrXk%ñNkò“Ñ•ºy¢ð;Qûé1Œ&œê òMµ†«z•å|ࡤýUeúçprÉ#)˜z‚y€ýè¶5¥N¹-ª2²Ú9³ƒPmJ0÷Låüv çë¯v+œéà •Íg5ÃP—FÌØÁYñÌqŽxáé‡xÇ£`O Vä<×î*ˆƒèRìRb¨»"pÁ8µ˜ÝÃ÷îºBÏÎäŽÙ—t¥Qf’£8Œ3x~°$b !`üÎò Þû+ÍÇ„kôx&WoÝ&uøýèÉÞ{iÛ$x¿fؘ²å»û¨^,³¦§Z]Ãh{N¸"—ÓôlØß¨jqžNÀÆÖv"ØØÀºð§®h'Fd1,g3[Â`êG·c‚Õº‚“€! ãxKÌ¥È8\2ý´ú„A›OÎ F?¿çìÅÚƒR¬#1@Á{ÃpÅ`¼" ŽŒN2áÂÃX±xŽˆé^šñD†ð¯Öîj¶+Û”M=‡ó>™£C vYZÀp{¶!s(V‹îs3îUÀ>#ãB3ì¢RK$rÆGótŒ•e*ï!â§)qV>ÆzŒ¹J€qÈ‚-ÏHL! ‘æ5ök•Ç·`´3t¾Z0©=ŠÙ%2=Læ–Ý—F@ã ^Öôyä‚ÐIÏÄažc)c2•5Žž‹Ð#t…™œLNÏ·ÁžFÖâYÅ\I•vØý(¾FÜ—FÔˆ3È(…¬ßI\0M6 ÷%D+E<Ñ|q*3-x±±×FT¥ªyÖW¬uUáX_ŒòŒpe6ð;¸Ÿ÷ïÉ`“·›ÖšÖúÔAl¶¦òØ—­5jl4κQ}{>"®ŽyûÁ/‡/ÑÉà ù‘= >=&v$1Xޱ‹ÑJ]MpáchŒ¤È7ö£=+qì¨Ký ÌE=yf=Ž%ˆ‚$çL´)1ÐãÁa9Rѹ«¾3A÷¨}ð€LòŽ09Ac¢—41—¼Ê¸k#Yäf¾ËAyÇ¢4¥APAÜÄ€­*Ϻ™ÈÍïf1{V] ’ŠRÍÜìYM®Þ"èE&¸«æa;6•Ÿ²ÚÜN8ÞähWk¥Oó#O•‡ëVâUp:4<3öÂ׺ +«¯?X"4¬+q¥©Æ6÷†´˜>,#kÎò‚#]#Îø Yõ Új••ÊÑ¥î8æ0PŽLœ£7m^/¼¸±¯J™Ú5°‘æáÜ“cÓR²êý͇()ˆgÄ H=uð$ Ú\Ê~CÆâ mttïR`Ö¦ÑÆ½ÍÕɺÉ9žUÃÝf¥*=ªNÎ}{¹[+WÃÜçùõKxºgn¥"Y!´ù©¤¼,±]ëAgðˆeCÞ©mሉ.G²ñ¨LdÒnÚo|c.%Ž˜² ÔÍä¯âwæ[¹MÖê¨ê»Z×Ây^Ýv©²S$_ gžt¢‘Ÿô(²®ˆw,|§Fït5LT~jíÖÕ;ŸPk]lZœLûÊUkj\Dí#z¢^à;êN~ïô‰x‚GZ‡?ÁTëŽ;¶R\M½7R†×b{€XøkGúm»°¨¢WÎ[„ÏbW«èßñÌ¿ V ɘ6¢5´”h<øwZ)Of´~¤*¥œ×ý½fP¸Œ?ÿXCäÈÉk㎉Кòwãî:S' øÒ¸©%ª¶®ôÁÒKÉÊBÁ2dT‰4L5NGÁI'6ª5œ’ƒK}1i<¸¤XôE¦* [,÷cO”ˆY #Sîçü$ëst‹Ñ9¾S£w:ÕVö4Ê6° ßa(ÐèÎÑ¿×Ï zâé§UúòTW.mŸ ÕOè‰Q6L5äh¹ßÏ3|©N–]]ÛòVcïdW3Ù'T4£B|S uñr0"µ—©XW!²1ûºL>“ËÁÔþ Ž¨¹¡¤5°‘T°Žè‘FºDÀj€Ä]V©:‘’6!PØŠâ\Îuû´³1פÈ&©¥:É+ ÎÉ^ŠãA|%’wæ–&Â&if焹ÃWÔúzàv"ãLÆ—Â>ÿúR©B̳‚ìaCËÔ?‰ŸÓ]ÕÎK"g45ÑBºü>Öz”YÔ40C2γÚKœl¢Â²‘ Â427ú1:±Âœqfz¡ƒ YÐT©Ó)<'Wˆ/MUŒ6Åâçð‡ò†GZ6ò<ÏW4n¨%Ë0‘N$ ¾ä«xø‡IÂGy™à2nñ<Ù»În…ð¸Ø×WËW“U#‰û%JU­jÛ¥TA6\ð ¾£`+\$,ÃŲ!Ìqö§ú Ý;…§žÑ\úŠ)»†icÊ»á¢XÌx¢p'¦ ·Õ¸¯$À3#¸xW¢jo(,¦1xqù>FËàOÉ?Á'lQ@TQ¹Ü%Ž$ctÍSI€¥ñ;G’™Û6dLæ<ƒl-BFÙ=`ÿp›…ò$òú uæ"¸ÞØ> »Æ\èšààÖŽí€î€®âa\°\¶X7¿xJÔm¹¨V’>ÿÂä ± §(ìϽ²'æÞSü½¹¥˜;i¤ÏîFs´Éú/Ží,OƒJ(l… [XÒimEû*ûz^1Ñlí(îà_Þ{ʘ°ômSŸ—çÛâW%T¹îaIO5<æúá(w´'+»&RËÁTpt‡ }a\i>±c$©}‘è¢ÆH©Ÿ Î ò$ç«S gOÈK?Ù)ñ›¼²ƒSí·¿›dœ Haˆ@"ÛŠF’–™_G•×}Æ‹ÂÞ&Æ–ÝdP',pî=º™ªŒ¿¨MóhlÍ#åpN±ü{춪„fÈÚAŽU׉ìVeúpÎ`#Á\<ߢQ™ÑÄÅb+˜¶œn\ÝP¹;³‰·­cžBhË8_m/sg¡\õ³l¦?ÁHæŽ;ê<îj¶USí²{ñ,xï‰-k7PŠÒ†€‹)˜ ^˜að·Í½ÇŠN©.çØý'OlQ¸æb-i¼d¥ìîY,î‰!•˜7£híÎ^E‹ñ“ÎЧ½=]·Ü«ŸQ?fjcømŸº‘"¸_™n_IÊ ±ªúh€âmY¼ùrg ·ßé v4ôòUlY;ÿÜPÜSþ‚úÒy¸è)ÄÿžØôün?ŸÅ!…wæ*G8pÇžIƒ" Ç"€)pe¼WÃäòOO%_âÌó7Ie™™SgÑfŠ'$çzsoÒl>~>üˆ‚î endstream endobj 4858 0 obj 4543 endobj 4862 0 obj [257 /XYZ 38.2500000 423.500000 0] endobj 4863 0 obj [257 /XYZ 38.2500000 102.500000 0] endobj 4864 0 obj [257 /XYZ 38.2500000 102.500000 0] endobj 4865 0 obj [257 /XYZ 38.2500000 423.500000 0] endobj 4866 0 obj << /Type /Annot /Subtype /Link /Rect [66 110 102 116.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Library >> endobj 4861 0 obj << /Type /Page /Parent 2 0 R /Contents 4867 0 R /Resources 4869 0 R /Annots 4870 0 R /MediaBox [0 0 595 842] >> endobj 4869 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1409 1409 0 R /F8 8 0 R >> /XObject << >> >> endobj 4870 0 obj [ 4866 0 R ] endobj 4867 0 obj << /Length 4868 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯ès€m‹½€ €=¶ä``9,r¼Ù‹õ"“=äïGÝ¢z¦©þ(ñ›"¥î‘öŒ[#²XU¬7‹ïþüåûý¾÷ðå?ûoîû×]q¨Ë¢ÿ³?~ýðòÝÜÏûº)÷ß¾ïžöO»ÇÝc÷ïÓ®áËÃ_»Ÿþ·×û¿tÙÿø÷îßÜ/áû®Vu÷ý×Ó÷¶VÝOÅùûñóïþö‡ýoLJé0—ÿÿAÛ¶´õŒ‰©ŸvÃ2Õéë÷o¿íÞõˆ›Å¶mÑÚ½²¦û§µzÿßî~î&†/­Uª®l]¼f¢ZgRºÝw;Ü”£yN_2£«ƒkmÒ ~‚\)ÊT*8¸$eu]%¤ìyôÈ7Çõ'c›#ä©( —¤¬Õ:!eÏ£§@~©²Í òT”…ƒKR¶¬š=eùÃè)_i›mŽK#e ,\’²U[%¤ìyôȯ˄áy*ÊÂÁ%)Û6!eÏ£§@~S%Ô³'ÈSQ.IÙÖ¦”ÆçÑÅ‘z’mN§¢,\Œ²Ý“n2‡žî¯<öŸ‡O0¸ÑeºÁO‹cåDÛàè’Ä5mídL üŸ‡O0x™Ìa ÇÊ@\<º$qËF9)›ÿçá ^µ©„ò¹8VââÑ%‰[Û:%qŸ‡O0x:[j€<qñè’ÄmÛakÕM=/?¸RÉ<çrq¬ Äþ3 ¥ÿDß/~øº{÷¹ÓrÕþëÏd§ ûo_¿ïl÷Ÿc€´h÷_Úÿ±ƒçýŸö_ÙÙƒ5}Šàø{§'ºAOŠôDéÓ“æÐ´E¥ËYïàyTG«áÓ?yþÀÂe”§'æPÚª©/©ˆ‰1RÔé‰2£Õ½4gêŠñJñ;.¸ )?àyŽ £k>R”AÀèôéô¤ØaÎ;˜‡(føÂƒ”âRCö‡gX®X·p4Ì þŠmOìO_;ÿ:ñ¬l$t]öºÒnVÓƒÑNp_,÷|Ò¢'ª†O,|!P„à=|ò >ÑñóCàcC±£!F5|Ç`\ãw>dä¾Î™ä QŒFchòÏ/²t4m>jéâ<ëG©Y' H]–ÔÊÜPÌ,Ò}{. WÛ ƒ4ÒwS )-­•QæÜº€[æ3| EkS3•ª[omoиø”O`˜³ûg ?0êSÃw ÌwЈ ˜*ÐÀ*Ábƒï#üT#“è#aaó1o˜¦;y¸O7ÓN=É©­7#|ÆÌþUçgÇÅyíÌXX£Cü‚DDp F‘ô‰ufb¦@@/#"BGð^FÀð–å,‡˜õûU6¿¡)sËTH©Îíé3F²12oæ`˜«+ªŠ"DÆæ'¬g w2ÊØá‰ ,¨b#HšÍº`bg8U˜ÉîÎØ-®|o*ï¬>Æ£ØÞR]•Þ<ÆÃ;ùý|Ç§Ï 9„AÊ€³ÏNQÙB7Øây2…d3<†]4SÀ\Îl­í$qÆ)¸ÁáEžŽ…q¨å&CT²P¯##h[s©Ëâ‚ÛLhŽ {ã /ÞÝ8Ü a ̃wÌ ËJìÀ„£a^ÆIŽ@°3ÓÞÄxÃÁu&уyGá'X70ú S¿SÕ²ÒÛó(æƒåå¥m.§TÅ¡ªÕцôʼn”] l‹!à€ýŽóæµïÔH’œBQïC1ÎtÄG0©‚Æ[0"¯³VC1ܦD×­DqÙŸƒ ½©Êj  ²PÛ4º-JrŒb¡EÂDjˆXrL;q‘ “AOHz»f¨Ï ±a=(ÙDX­Ú»©J `?Saxƽ4ã‰lÂ%`11é/fsÌOÒŒ8Ÿ‰P ObOö¶‹ü—5ÃH!•Z{é¦Âñ1ÅÚºŒ ÈaBŠ oÝq!óò^Âh»ËÖ!éï峎©e<|‘¢yðòeÍ( 5£ù˜ÂQŒÆœÉxsÆEz=ª [ûŠ”á½ˆê<̦²´hÝFÀ“ÃœÌ 2í±æ­žBªžbÅUÜiêÖ#ÃtJKfˆaÕåô^c’‚‡-s1OâCªô0¾šФÇ=Ïgéµx]{sÞIýßmºÅ²‘ÍÍ×M߇a3YÿáÍ8–”£¶“ni2%Êš"'$ çÌq×úÜ`;é¼t~·vÒ¹nì䤤Ûú‚}”#zïœB³1[{ˆÛš%¬A߄摑Ûs³A&]IdÝ6³æœKu¥"—1Ù#’Dk׺$Žéç`ÊÖÐÆØÿxžèzŒüEs"žˆ¬?Í.W“cìsQE&‹âÏESª7ÌtÉ;÷HYùäZ%¾PkM"i XJ>©LÚú)ÔIÑ6H1Jy¾W—K$ 'ã]… ÓDÏôìÑF?î@ø5–jq"kk¤0“QÀ(Ž(À_ƒ+l{\ˆÔâ86Ä<Ž“®™_–O&Rúëàåê\b¶x9Gà QbÆ”$29™ÿošÿ›ÝÑ·xš9ÀË8EdêA¬g/æÿÅË ¨Ò>ÌLéðT¶raéPUfÌߦtX¿Ü¦ X¾¬§¬†Þ®²Á¹47P21²Ä=b˜V-L‡/êBÁì[ôñbÄÑÇ»jR½Lð®Rö’K®‰sŸ`UM û2Tv¸/³ÂŠ ›éŒiŸIAÊ΃ñ0m˜þÜŒ·þó‹×ÞÙÌ+q;*crØÒ¢%ºj‰åxY9¸þ/u\h²â3_›n*¨³Ò[ðC;w)kê!þ½„À!Ùã=x7‰ö4 P σy,—=‡å‘ô™ : ”DØ[²¯Tv=kÖ¡+´Öçv7Õ›*Ì'z*ÅûZö,©t;Lú¦“¾µSçI[P·¾p$R¡Žz‰;O[ûfåÓAL¶„dÛŸ9ögÕ”¯ù”Âò‡b™JAû&U'åÀÅÕLKOf£“5ŒÁ8y2Ð5'ºvª)mâUî¨éÈFÝä–G·óŽ¯ÊæÊ–×1+Ï•Õm;‰ßlo¹²UË L¹€uÌØÀØ6eöæ*vm£š$¾Í褬ºÍ=³æ,ÚJöŒ9úÝ2U[¦*¨¹·LÕ­ê‚dªšö\~ãã»°ÎýZ ÉOˆz‰ u‰þ“Y(T1t"pènT.…g0>Šánßuë”Sk¹ çÌÔ=EÔ˜"GÄžðÚÛýØaº­^~ðëîK€íÓìåî¯zAìù‘-¦½] SP¦‹•’Ü/uäÏ“÷Ê”=VöXŽjÐñØÃÌS~àU.þÙìU{ Aºß’­Ñ—S^¹Ý™OQ7Ú;~‰zG÷É;Ú©úÐêK­¸Í]Õº'ãûäñævz Ÿà•:îQæÐ«ÇYïÀ•°Ãàíœó„Z;KÀÓçວ:¥/wªÓœQ¸6jŒó>þ \z3º­ÏèXÜLÜã6p–°VŽl»6¶q©IDÛ@&=-Ûirù/î{ÊX+¢^JÀŽÉ|Ì]¸o>æ.ÑöõÙš|çêÊЇ°Æ™¢¦ƒÀdsô” ú­ò”b|9ß /ªÏËze †Ê9•/,œsÁ1t¢y“¯œÄ‚qj •wZðVﺬ}Zm·`/w v ¶JØ3¶rP’Ý©ez•`TËvˆm¦Ÿ^±µ•õ÷#f°7}a¹*ôôµ‘oç:ëMžJÅFáúeê´ûÚ?uìäöÇ©_˜!/š«ñûnGwJ£ƒpÞ .> endobj 4876 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 4877 0 obj [ ] endobj 4874 0 obj << /Length 4875 0 R /Filter /FlateDecode >> stream xœí]KÛȾëWè`ev7Ÿ@Àã±äÀ°‚o6Á"»ˆ³‡üýH"©™!õÉOÕJ\ob¯{ØzWuUõ»?~ùûþŸ¿íß}øòŸý·î÷_vÙ¡*²öŸýéׯÿÂÖ‡îÏûª.öß~Ù}ßß}Þ}>þÿ÷]ûÁ—>þé{»ÿÓñ?ïÿú·ã_þØýÐé~ÙU¦:þþïóïMeŽÊ.¿Ÿþþ_»¿ünÿëiÆ~¹n3oÿû[d…©OÛ˜Xúû®?¦9ÿúíÛ¯»w-–­Rd&såÞä.ß›&·ûÿþc÷Óq~úìÐäÆTe^e·,TÙãJYÓ§°Íq¦ª-tþ¥4½þ䯔µ·ÉÛ«CŸÒȳ+"×X›µrYîþ—é} ·°Îßäç«C¥C®0»&r‹ªhT•>ÀßÏîüeá“pN;×JZ8¹&fëª'ýÊ€^¦×ŸÜf¹G¶=ï\*=nñìŠÈµYSúcÛ—Ù}àö„sÚ¹'¶Å“kbÖ^H¿Ûl·Èzä,ëšÜßäç«C¥Ç-ž]¹yÞ1VQy€Ðevà?þëoòóεңN®‰Ù¢qòevÀ/=:@íÎ} d8¹&f«¼73÷çÕô&¯ tsÞ¹:TzÜâÙ5‘Ûd½ƒRz\¼š^r—U%òyçêPé‘;šýó’YðVÚ¿Áµï‡O_wï>™¸7Š30U¨ÊKLË9ÆOt*ψ`>O"#n)Ç=á´›wçÛ·´siCDtÈR>a<0ÐŒ.,0˜hsüFÞ#Ze’ªÂV¤xTŽ¥*G&ÕrAâµg/…Š2Œ©š§’c,D¹T.P=¿‹!Ê„µ™€c¨köQ¨e~QÒŒëù7o Ò)eˆì6·ð<  U«FEÀ‡Q½>ýŬÊ:Qð“ S2QS©dÑ Æí ÂMqÈ÷– ™{[3'WTË~'I4@|ÎÎ0ÖTȳ„¾‚|¿9ÐÆU<®úñoM>€Ô¤uâs7}ðÕN3ˆò Óüô[)X7”H—^Xq Í/ÖYG~/êÒs“”¡Zã(Äx!Á¶/+K *›‘æÛ4Òby”K2êÑáªèŸèJ¯Lv(+óÖ»g2N¨V†toéq: î„rÌHy enÂuÆìA$û1Mƒ„uV•é¤bÆ‘M )‰¿Yâ „âÛ@yL_;AÅcJYçøGus Ô4¹.Ty [¹—Q|ù|ï)©ÁDƒJV;Á~Œ&È &Û :}?Œs,wæAbŽ>+ˆŠ‘›=åkS¿‰½ñÙ=6Õx 7>\¸›j¼JU8RQB‹š÷„/á·ÒÉqýƒUY ÜFèÚqSì |W70A€@·½M*m’Á4– ª¹‚KÔ$ãCb1}FLÍÏe’þ—ä¥Ü'“Üqjœ Õ»²®+UÁk2î?ʨj’Äëéº1¬ŠÓÁ±>ÃE>P’ ÜèF¼1ÜßÑÊ„ÀÜ(Fî­®@FõÞ4W³éÊ3Õ¦x»äQ¿´–ó+¼—h¤;@q°ÀÜ^ôM†×iÐ7®èÝ¢V)ŽL…“¯3Њ¦@#Ùy†³áu>ÂÙ>¡“ ß@tJð ð7}\è ÜÚ‘êàFD‰G,¤'xÒPïžÕ…›6¡t ÞûŸYGñÉ!¥àêýçøÍWNT¡'VÁþª aE•Ó…Vaõ|ƒÍG@cïêfÈN…&}Úÿ¶¨µ=u«—ˆ>&¯ ó ‘0ÐUªyNá¸ö[ƒËÿ#êp6¡ú?î w­üˆ4Üuügé-|ŠØ`ˆb¸}XááiXÆ<¢® 7a¶øTE<ÒážÊ [LÃ7:†ñ:]ªJ.Ÿ€Ÿ-QsVgPEžß@‚´Â#PZ |ÂHì°ØÒâ& nIËKU¸ð<’¼Ä.Ý-¼ÉHù@òã„áÍø6Sí9¼ƒkºòÿÒþ›¡§vs0¹S›½tzc(KO,Õ ¾nÀë@º ÅéÊfVŸFäлÍ.w”LòÇ)Teêoi¤.ZZQ_!"x¯y Ò[™°U½°•dÜGU¬×â=;ÐL TL/Èkbn‰S.5ŽÛ ¬´C;%—…±Q ×éx{Ñvª0 ¦œ*œ[åÅW÷žÊ^SweÃy!Æ6oµµRdÛâ¸\{lßAßûŒ9föMÜÜ"n0¬ÃÐr^OÓ2>Ž ãLËánpÄ ÇÕ&£ºï½ð° Ï™ˆ¬Ø¬D+—¼…0»*;8CEÍ Q}ò j“™Á>ÓišÀc‹LNáJBRhô¶X÷ß”Êsey @T¨Ö&ÁªÐãt“÷©³òf(HUÃôÁZ'ùò#¡H¾ç]Ê¢ÒâQª%±ªP¯V0ÚQïnIG#1ë{A-z¨2r,Û™§£4òùuz-¤›JU ñhçxÓ>Pëµ»ÓPêV\Pâ’)Èb“Òª]¤R¼ÉóblPMu°zSU‰žßÓ“nUœÆ“H¡Š«BùÝw~# ÎggÈzÕ!žÊ™XCÄ&¿ÆÚü×ùæ SÃí¹¯[ÈÛF[ù©ÌÓ½ëˆ ¨[™!äÕâÌ^â^5NmGð+p Læ¹{¯jXçHéY oâz\+†+;Âð>)SÇŒïç‰,:LEî}6–°˜ð7S59a´xSLR_Õªn±FU‰ëã[2BÎät!§ ãïâ'ƒyS«®¼LRW‡Òâ&¨0UlLÝ™ ùp(amS|Lî%†[@ãÌ-Uøñå ný«®(h–€õÎ]RèÖ̺ÂNB!å^AÊ‘Èë–á-쵂¼õ8}™¢K8¦ûLüH¶³‚ʾêR¹í¦f@™.1ŸAnø ÛåxLÿ˜–Uåº Ÿ®Å•(D×® O'Xo‡œ>q{˜ÛOTÆa€¹×šŸIμœ$¤/DÏwTîN‹w0? œIÛ^’$Cäq‡¼eÌ«æ- ¤)Eaô)‡º™ñaIù—•…ë~ª¢*½Š‰Ÿoòüb!sb,MEHúÛ¥Šg´ŒðÄ4¼P}SÉe£Þ•óܾ)TáQ´<ÅÀuM1›´çµ(û„h„J¢ŸFÉô·ïTø2¦æóøn³ïqÆ¿PKÆPé|ÿéWªÊîM8ñÂU˳àÝg(tm ¢bG@ÿŠ„¢Dùp½¨æJ·ºDØÁªõh€Â¦Æ ´e¼÷h0ƒbô2úM·O邌m(éÂÔÇÝMÏVA`ë yF cŠ\P˜Q9"·ù}*öU¨Æ…Tç·ùÝO”íS<Â3r€¸[1]a£÷ˆ\ìéµeQ=j|Wä^»ÿ2wDéöĸ³bµK¦©ë>š1’2æ¨2ì˓ʣ/ªx æ ¦*F¤ªF…¶g "b|5-ȼ².¥±{çEîTU·nÄP·¾y ðKña‰hG›zó­ÞºÊ¤k¶Egu‡¬qoÁõÎÖÝu]yì‡ ¼m-Û}ê9!½Éd•º“8%=zB¸–ñÝcŠ¡ONYÿ[R’/Ë×o_(åtM&ggª¥S€ _å&MÝãÏo2Ç´ ¦"ìÑmâíZó6Û{ùå£G²Î 9èAÂäÞòG´][2ÝM·9fKÝ5×yÍÉ`_w6Æ+Ç.7ª8´2•Ã6x×ïg[cBóŒ@ ëÊKÅÖö<ÖÝz›ah,/¦i,:|ñóc¸ ”@± gà¢\ÕÖ`Tù½j‘1SJ¯Ü|1z3¼Êu«ì²äjõzu†M¸¬U¸àsXÂÙ°IÀˆá¤D_ao¹o¦wùc˜°ßo–ˆ½ [bâBŒkÊ\å07y~/·©ŒXïÑ¥"sdô‹pT-Cb0"À}AIóÊ  Ñ¸Ûöl}Ò÷&É db.éøºrS5£ƒz±‚x„`I;S8?¦½ò“> ʪzhZQ Ø$ºáÿ{ òk<œ)d1©–yÎÒX¢Œç+<ª@ ëÉÇ3ù(M¡«·Õ0OEÂì4š‘μúËtáâ.äMQõ’¨‘°Å·>ºþàP߽Ŝ£?3AaŽi™Ì´¢gÚ¥âpgw«¦oÿ-´ÓÇ­1U`Þĸ'nq)ÜcºÜd@2ËuÜ„= nª «{£>Ϙ碘K-B:M—×ÉMÑïßu×a4Kò²Æ]V®¹H 1öé&…6)¤/…†Nü§¹Èžªë>­Q7¦ë§¼Ÿ ­Ž¯p˜tÕ¶(¡=ð\|¾­½­‰ºn;ä¸`(2ÔÛ¸ú-•\Íðuƒ ~''ëCµ‘ã½a5ˆ ?œO(4”òëŽÛ+|™Pf±]GpT…Ý–øïæ~…oÿzk8>…'ÅNñJ4Eoø¤Ì ›¸z(Ìc2÷ƒ¹•X&2!à©PN‹©¨&©OÖáê,7¢‡|ð:Ø&$¤ê‹ôB4¾fÑ=)~w`m$Ð!U·‘m$õ]‹Ið—™t¼kæJˆI‰I8üZ¿í¿¹¨ç?OýÀŒˆp}µ²Î¸CfN…³{Û¿(Òu8¼–"ÙÊòêJЧµìÁž{"ޱZŽGÜs÷MW¸û ¦í®ÅÈžÑ:nª.çÚÞ>u'E=d\ŠXŽØ1»ã(Ý•c<ü¦fÑÑ«²e îôçãŽûDkuÆÎ"°SIí×Ȧ‡wû÷³ dð…D= ¼°€4H†¡qLxCïâÀËèÂÏN=P‰ë.0Ìo¢Ê*s‡N¢Í$O¸÷ªQà¤Øþ¼ÿ¼û?Mó ç endstream endobj 4875 0 obj 4934 endobj 4879 0 obj [259 /XYZ 38.2500000 569 0] endobj 4880 0 obj [259 /XYZ 38.2500000 345.500000 0] endobj 4881 0 obj [259 /XYZ 38.2500000 569 0] endobj 4882 0 obj [259 /XYZ 38.2500000 345.500000 0] endobj 4883 0 obj << /Type /Annot /Subtype /Link /Rect [354.750000 547.250000 407.250000 554 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_nn10 >> endobj 4878 0 obj << /Type /Page /Parent 2 0 R /Contents 4884 0 R /Resources 4886 0 R /Annots 4887 0 R /MediaBox [0 0 595 842] >> endobj 4886 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 4887 0 obj [ 4883 0 R ] endobj 4884 0 obj << /Length 4885 0 R /Filter /FlateDecode >> stream xœí]I¯Üƾϯ˜sØ 7  5@ ÈÁÈ!ã†mDñ!?3ÃEï‘üŠìoª›œy´`K~-öR]{×òúÏŸÿqü×ïÇ×ï>ÿçøµýýÝçCv*ó¬ùçxùõêélujÿ|,«üøõ×÷ã·Ã§Ã§ó¿š>¿ûëùOÿ;Úã_Îÿþ|üáïçþØþ¥Ë_øõPšòüû/×ßëÒœÿ”õ¿_~þïÃßþpüí2c·\»™çÿÿÊæÆWõe3K;tÇ4×_¿ýíðº@Ø*yfë²:ïüÑÔÞÿûÏÃOçºé³Sí) _f·,TÚëJY~4çÿMQºþRš^r—‹5y³su¨WyvÅËuÆû@eüýì1îÖš:Þä×k¥½Z<¹æÍÚÚ´àÉÇüAúýô&÷>Ù6;W‡Jw·xvÍË-ò¬Íê ê§ÿ*¯âM~ݹ:TºËųk^nmëˆ<¹Ÿ=ø}–Edø×ÇâÉprÅ›õY^Ä»Ùï³Ç¸Yãâñûfç‘nO®y³¶î¨Êçe}Ÿ_ò¼Ìã©àÍÎõÁÒÝîxúO!Óà½4?¶Ü7á÷_¯?¦8~ùé¼»ëšÍo_Î`ɯ.ú}m_~<þ1ËŒÿÓñËχúTؼÛâìHF,ü&ûGÞÃG>†ï-+áH g«à7øwðfÂ;»Æ³Áópƒ'ÅpÃßë@|93¬È¼ÆeÆt«¾O¸ª‹CÝÂ=ÀÙìÛpœÇëXboDZUaŠá]?‡³9'ÕÙïóu«,ò_”ñÓ¤&ΰ¾€×ÁøqY•¯ ü‰ Zu3Œ«K a×𛜰t¹w JGdî³+™›ÌwÛl@èOÞ5O†ßV¡‘Å'Fœ¹ŽTßÿjCÝÕ©ª³ëq‡x51‚§o¥A~r¶2Ï¿±pGšºS|6gké¾Z°p{Œ¸lÛŒ.ÔA¾°¾dÆvž!ø6æs–Њإ9©Ê]ËŒ’PsºNT>7bt˜iAN4fg)hÚÛü!hZ Bæ<;­m”Ö _ ðÕ»pÕ!óP©¡ˆ¾SëäHê·ÚþÔlpo ®‚+M½#ìèÕ4£›ÚcÃë¶@×cô6áCXPŠÜèÄôο‰Mãõ0„íG… Žq·å@Zë¨ @ÄMjS%÷÷ £‚1¨+Z<v)P„Ãú„]c¦ˆ ḚG(ƒ98fŠøÂðÂŒ”Ÿ*Óh®jÉ– ”æ‹5n]b\ 1H¤¹Ã`&æöø\„ý#ÀkkÍ:ÆtÛ^2!×¢h’ E¹>îàÑž-„šõ½ìºIÑL1B‡x4 Áï ë§ý&N"Ã7Œ!nxDKXC„“âÐ <¢›fŽOÊÀoxD “—Šï<ãþf®DM)îÝ,öá;ÁgÀw’*ƒÁ ,CIðA¡` ~E_]²èž§Íã,|#¸ê>²)Ž E0¥º˜b ç#â,e"=˜àO ·”2§¸¥ôÞú6S”éN‹Ë½¨2m®Z£LÛ¥°@býg/Ó¶—i“×¹Ë2mø¨d&è›ñ£ìÅåxÞiöâr‹ÖÙ‹Ëm@¶íÅå¥Ï¼ú²¯[#‰ã>ÂG}W=¤(ÍÒ²«– ›½§({&`qkÅ¿Î[ÑžE¤œE” ƒ¦Ê·¨p¡f+Bà…çBÃcŠ—|Tà+&yfœ¹NÄú(§=Z´qäXŸ€xq" &rp;•¼5ØøÄD¡¨»ÒÎ6¨ƒ11´¸x3ä¦S—+™ë…Ô-C¦³jžµCÙÈHw&ä6UÎQ€<"%…,£IFY%‰ês)ÇÃd ©K¨.*ì™)JÏ„èlV/ÓÕ{tûXT 4P˜ƒz­Ê¨ºáÞ­{m"ÅÁçP/!ä·mè×dã…áK‚²pÙ©'|Ý (žÈcæçWÃmÆÍ`Ø€V´AÅýYÿRÜ[J¶aؾ Q(„¿Ñ)©k9`Ôy³\3xŽ‹Sd1‚`)ó ©Êì˶X$ð~Öv(™tõL¢:/žÊΠ6¤ÛEJ£T‰/Zàg#à3ÕSðUª:US¹œ… [Nm”u«ª üR÷U%rÍq&ã5r'7 vL991ËbJ i¨Êê«TøM³°±ÝÐ’…ÓêJQ-É|hJ2‰*1Ï~òËá³ 5ÄQ7®{xމTèl¢êÕÌëõ J„„$‹ (ljE8óT·~‡ ¬~ Æ D¥7jôYOVÓ @G (¯ƒŒbƺ²rÐT 7/€Ç‚Q·bòj…¯t•Áò"ž‡×OO¢^\7£_&K®z4wÿ=ù/#û3ÖâÛr(q81‹Ofn SñÁ ä(¢‘©JPYEס¤¬1ß­¨úb L‡ܳŒèÝ(tœÁý­p_¼­¼<u@ó¸—îAhápwfÜ'‡é‹;õà>îxÜÞÓcÕãNÀx×Dñæp¶T]Ô)úÁ뛘›[Ÿ¶ îãˆ×'Åßx¸Ž×íû|—ÌôzY24—PV—Y\‹e5ÓTu6òŠp-OK_Û÷ǰÂÝ91¬°€!‚{Ø27Lð>¬9Ü­W•ûâʻԒà¶K-‰Jv©•˜«úx‰aµzWlùÓûZ÷î3æîñ9•Š£0'Å·@ñšDT«×±{mæõ ´‰)CÐ’©…éìNù?Þöä` ævÄ>©.þ»Î‰á¤>!•Õ-t¶ËMAjÙÕ%ÃúZ5¾9AßÞ†ªËË¿ó1¼Ü›€Ë›¸áê2Ú¬šÐWV¹|–sèíg&¸©ª{D‚=&• & tâw˜ÚZDçP:! ÇI^Tû¦£‹F€ãjmdSE=ì†K`®Ü/œWœ8¿­dë¨$QEm=X …WªÐÅ='sÏÉÔÊɤxR"íi•ñt¹!SˆŒÑ¢t0IÖãÁ(üf:On²q{]¸z8½V¡Èdä@ÔQc®’ª£FÀS!ø Æ(¿x¥j‚=SOo}—E2ÊbÊøâ \Ý"sî®ø^¹:«ç/gH@pøZ˜wsÖEáp —àÖ†³1¡=ë?AYLà8¡ƒþ£/\ÇáÔ¼k| 8%(bˆÂ€>]ÅaøQf%uefO‡<šyGˆDò“ö€V. 5‡œÅÿè! ³#ÑUÆÒy i¹¯!•»R9yù>ÍH¦g6=±—mn¶rÂgU§»ZÌ¥1E\MH‰`‚)1dÂô¡tkñ?É\štó’S7È×cy²º.NkŽøî‰Ù<‘¼„µtf 5áÙœþËuÿ½)úÇõëþãupýú¶þ·ïê¾ •éÙ>¢¡=S¥W÷W­l/ôÀß@Xƒ *¬ƒ»àzü:L¿áN 4›ð ìV€¿vg{;ƒˆ ÀåÙà[„0 ‹Ïö®Ct½ n¤D³a:ÎÓbeÑé–KøäB¯¦ó‡!h ®cœó6ëÃRóþC/¶«ˆ·öQ“'ÊÌ=2OLPΣ=x¼«ØõL $晆©éGDt„ÄJ®Þ©…y L>Lµ@ˆÜ„)¿ªéÉt[Æõ³Ó>™Ç¬ ×4˜}"«Æ‘OºÅ¢ña×*†¦Â–… ©á$c¾¦ROG;5Ê;w¢Y•®·•éöûrõ¦ ú ­µb[ðÑa²~W¶+j‰™&æj8‡G‡Ã§ÏF0ç3 d!ÕÉš‰ÍLõ¶Åd|éæ©é¶Wf`Ù $1ua™d ÝÝ]×U[¹üV˜J¦MËív[“ÍgÏø˜BlïÑ-kà“´¡ÙÅ4>/^ž6˜@öÕ~1:mN'ÓRW³NŒˆå0gð¥R mT-m*˜žÑÁð®x“=ª’1õ¢‹¼?"Êá­F—ŒTÉuµ§ †À˜P®Øú=€k3Ý[6%‹²JÀÕý ÷-ƒ©Zª5/t›à|ª·3eowª8ZX¡ˆyÔ¢:ŒAÇÚ=<ðépTLƒÝ”U!eíš!°TƒF(Ô¶Œ:—P-ˆo&šºHIJKaš}ª43VÔE¦pB·×ÈT!Éœû&ÿÉûùë6¯ qÁ2òr{9â´µ’güõcZX®2\'0æž8!#Z)u:îÛö Í#òFWUæÈ<Ý•oQ™­à‡oæñg(B|qw`‚3NŸ¾ÆB9 †g¢à‘{ð£êˆºDUôF>l 8Ly8Fb0¯ì8z›¨ª2œ²™èPbM·`} ¦*NÃ'3…Çš”dµî[)åËѽÅKJ•¯´­Ø'8›r~Œ†â)l‰¹[]+oy7£%SürËý6œ0CÁ€‘3Z0K ˆ§ÞUíBâ\KÎÌ—¡rÎ>?ÃTÉ"¦#9.Y„ûZ3%$™ž¶© šÁ²e¸P¤pR\" å$z ¥«ðl)16â^mBS\0ž™£J·á2wªÅk3µ¼•wRf³w’°‹¸w}ÁCƒ‹µ…d-Á»„…˜¯Ø#ôâe:U{Ã¥†1ÜÌÆ\ îÚªÅÊÌã˜ï 8¾º‡b‰FtÝä\§Ý[š»÷}‰ BkjGÒì´Ègo•Ñï|H|‡ô!<ÆR¦L:>)¡Å °Æ³A=PèãÃE¬bø%7x ÷ÕŬ»âÈå…]3ÅxñlD¹eFßÖÁ³a«ŽÑß›wýBÙÄ„›ÃR˜±ÔÕ:õ,z•Ÿ…Õ6¬ÙRÚ¢¹µ³ûaxJ²NØ®dF°äÅ̓T¡#ðât­{|îM¬Àt‚!"ØnÇT¹£I|Ò”÷Xô«b]<å~ê¾­„®MEh‹ gfä ¥CáÛ"4?ÁÖ'4sÊaì0Hu_eÚª¨¶ÓÚÜ%¤³¢ïý„1ÖÂæzŸ7þƒ÷x¬§Cìóºòˆiצª‡2·€[¼amÈãû!lce¬ÂòcqÁÒÆœ7„”þhRB—ß:Âs ¬ƒïÓ¶*t(?+¦9ü –‡Äl^36¡ÅZäóoÂ=î²Æ£ÌRjIå¼N×*Þ†1ÃëlYrcìÃ|Kfoø=φ=–ð%U Z¬Á¥Äòºóá:µ4ªùUK×yÍÒ×µ›0 R]õ­œ9©Å{÷–dÚ¯«B”i¥¾ mèdÍ˰‡Ãr¢%­€ ¹tYÔ7Üãúá­‰åeÌ£ç‚kÁšðËìÖÄ&¬ ,RJ°ªšÅ*¶Žˆ¶ÂÜ!•œb$X2j‚'õÖø"Ö¿`两Į[ÊH‚ÿUVÞ€ÿÍ`[ëƒ8öKG&[H5«çÑ #Dô£ ñ¨Œäf¼ŠL¤áoÄ\g^`®Êx<©H];G•æ¨H|&‚щè0~; ˜Ên2Š6¡sU¶˜¿û]çÚ´ÎuŸ¶MRÍÊßòâ»kV»fõˆš•nN+{CÁÉ·UÍëJ¦ áj¼–¡x„Ñ£‰L‹;Ö’Š—çq¿/aU5¯pþuüvž^\ýÓÜ_XPú®š¬³oÜ)3—úåGÛ·!iøïTÁ´ZåDU¥†RìÉ^Ëc©¸´P°§¶~ú\jv0Ujê=ZÇÍU{ÚÛÇö¤¨„;®Šç‡Š)ngQŒØ’®©‰‹*NÃàÙà7m²¥ :ú“ ,Â]þ|ÞñsuªèWŽv®ŠÿÚtðn~¾B÷G©È. ¢€ap£ÞÁÇ[s6 _!ü,<¦%a³ÕíXYfîÔr´[Ñó©ý8˶??þáà endstream endobj 4885 0 obj 5800 endobj 4889 0 obj [260 /XYZ 32.2500000 416 0] endobj 4890 0 obj [260 /XYZ 31.5000000 416.750000 0] endobj 4891 0 obj [260 /XYZ 38.2500000 320 0] endobj 4892 0 obj [260 /XYZ 38.2500000 320 0] endobj 4893 0 obj << /Type /Annot /Subtype /Link /Rect [45.7500000 382.250000 75 389 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps >> endobj 4894 0 obj << /Type /Annot /Subtype /Link /Rect [43.5000000 374.750000 90 381.500000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://www.oracle.com/technetwork/java/index.html) >> >> endobj 4895 0 obj << /Type /Annot /Subtype /Link /Rect [484.500000 354.500000 500.250000 361.250000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://java.sun.com/docs/books/jni) >> >> endobj 4888 0 obj << /Type /Page /Parent 2 0 R /Contents 4896 0 R /Resources 4898 0 R /Annots 4899 0 R /MediaBox [0 0 595 842] >> endobj 4898 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 4899 0 obj [ 4893 0 R 4894 0 R 4895 0 R ] endobj 4896 0 obj << /Length 4897 0 R /Filter /FlateDecode >> stream xœí]MÏä8n¾¿¿¢Î L-˲fú#@Ý@‹‚ÙL‹éE:{ÈßOÙ–]­G.Ó´ìª×;HÚ%¿6é‡IQ”ôó¿|ýÏËÿãòó‡¯ÿsùÍýûáë[v­Ê¬ûߥùï§qƒª¯îúRÕåå·ïo?.?Þ¾¼}¹ýÿoÝ_?üÛíêÿ.êò¯·ÿûÛåÏÿqkü‹û£æ¾¿Uyuû÷ö_[å·«lø·iÿëÛ¿ÿéò÷æ=9ÇŒÿû'U*m²†Ò?ÞúÏÌÛÿþñÛßß~îXF¥Ì´UÙ%×…¾äV«Ëÿþ×Ûï7ý볫Õy^]ekUª¡¤¬½äÊ6äÊjB©ýOèýò//«²Üìåçò°ä…Ég^­û¼f¯ÔlantóúЬ2˭ɪZÃë1å›–š²¾u¶îÂQ½u.ULúÍô6ýð÷ý¼R¥¶7bðÚ§?˜Š<ËËŽ‘æªköéÆÚ[†üwQÎøÈø„'dF-’ÐøøÞ6,…ÆñC…¹Š¯|ôµvÄÞ¨Ý4Dò›‚Ww†ìH§‚¯Z)7u1Uf«ucf¦ Ùˆ;åÿÞ´–J´ù½5d½ ¾wWó( ߥ¼Ÿ<··÷Ú;U²š6””¡Ð«V"¤2_«ÆD:x6FW#’‡·ªcƒRm6ÊÏw¯!”Ç•í* ¬!5 ¦ëSµOG)K91’˜˜€}q ¹No½«Ìã$hœä¡q2 “·o‘Ëw¯!”g©P¥Ìõ-–$vZëGî,+b°Û†µÎͪ»àÆ/·!?mPc¸üß›¡ÕrA©µ^N" çÎæqi O$)e¥[Dü†°ÉóÛË/ë3ºÚY!Kpi®Æ<©LNg¢uô)¹Î£Écï¹BÐtœù­6Ï&ÝUØÈùív`Ȉ`r7÷žº4ow=ÚzWžî†ÅÄI!LÇóar˜„±÷TšÎÎÁI™]«©ÙÕ#@Z3è7ÜYÖÄ · +T•ë@÷—WíxyD>Ð0âÓÓvhu\Pj­ÓG‡£sRó¸t„'’”2Á-"~CØIùíåÀ—õ]ë¤<½Ýár#<¾ó¤29‰!äèSr×’Ç$(ÏI… qœù­6È&ÝUØIùív`Ȉ`bîßîab†m½+OwCKbÒK!LÇs^r˜„±÷œTgç€à„Ìn•jvÍÖ ú w–o†»†µNª0#€F//*B~Ú0âÓÓ†hµ\Pj­ÓG‡Ã9©y\ZÂI ™à¿!è¤H{9ðe}FW;©ÂCÈ\£«1O*“Ó™(B}J®óZò˜Eà;©4'@~k ²Ã¤» :)Òn†Œ&wûï©Kóv×£­wåénèaQLœÂt<ç%‡I{ßI… é윔Ù-jjvGófôî,×Ä Ó)ÀåNÊ›½¼´„ü´a<{«üß›¡ÕrA©µNK" ç¤æqi O$)e‚[Dü†°“òÛË/ë3ºÚI•B–àÒ]yR™œÎDêèSr×’Ç$(ßI… é8ò[m;Lº«°“òÛíÀÁänç=uiÞîz´õ®<Ý =,Љ“B˜Žç¼ä0 cï;©4‚“2»†z3ž«kLi¸1¤ˆ  Ì•-wRu¸à¢ªIå@ Á¯uð~o†V¨5¿åÑ!ÂpNj”¤” 6Ôxê22r~{9ðe}FW;©ÚCÈ\£+RÔ ¦3Q„ê&ªŒÐñœ—&aì}'‚&ÓÁI™]e¨Ù%…´áÎ2) èÖ:).œ¨5©4ø¥ ÞïÍÐÒU€Zë´ÄÑ!ÂpNjeB’”2ÁÊP.œ íåÀ—õ]í¤´‡%¸4„GW¤pALg¢é*D®óZò˜Eà;©4ÊDä·Ú +3äpái·CF“»÷Ô¥y»îkÆWáÂ9uñ1ÑU„Žç¼ä0 cï;©4ÊD'evuMÍ.)œ  w–Ii@×°ÖI™páDmH=@ Á/]ð~o†–±j­ÓG‡Ã9©y\t’¤” Ö55Áá Ò^|YŸÑÕNÊxY‚KCxtE Ät&б!r×’Ç$(ßI… ÑuD~« ²®ƒ.œ ív`Ȉ`r·óžº4o7}MÀø*\¸ §.>&ÆFèxÎK“0ö¾“ A£ëˆà¤ÌnE½·È¹1m¤aà¦"¥]ÃZ'eÃ…µ%õ¿tÁû½Z6Pk~Ë£C„áœÔ<.UP’R&¸¢ÎÀ_$¯A{9ðe}FW;)ë!d . áÑ)\Ó™(B6‘k6À$(ßI… ©bò[m«Á'ø[»ÔAr­5¬ú" LîvÞS—æí¶¯ _… äÔÅÇÄæ:ãvALÂØûN*Mœ”Ùµ´À’ Úpg™”t +”ÍÃ…6'õ¿tÁû½Z”Zë´ÄÑ!ÂèœÔ<.á‰$¥L°¥e6\8AÚË/ë3ºÖIy 4z»ÃåFx|E Ät&†£OÉu^K“ <'‚Æqä·Ú Û¡HÀ† 'H»2"˜˜û·“‰¾G[ï*\¸ §.&½Ât<ç%‡I{ÏI… qvNÈìÚ\S³K 'hÃeRÐ5¬uRšò£yÜî܆ž²#“ö&vGdåa!RpÞi).¹ TÈwøø A_EÚË/ë3ºÚWiʦ„ ½óX­:Qh<¹ÎkɃÄÞwRóÐä:"ƵæÙ!Ô]]i·CF!3B¢çDSŠâJÖk†/BÇóar`„A÷}Õ<4¹ŽÈOÊ$ërÄÞ¸½Ÿƒ®îœ—#Fƒ¯ZïÀ )[¸5„ 2nwžÄLçåÑ2ÞÜïˆúÖXõrîl)Jc6î–²Ùc´¼v2Sß7””¡Ð«¼š!õ >< †Þ¹¬Ö§GòèT;7·5B¾\|7”Çñj³îáÕ6Éü¾ÁRNŒ$BfHωol°xœõªÄÄ— !ç¹À­"ñß8yV4ÆÉñ$ªÄãhïþ5zxôéÛ ¯ÇñȬµ*[ň‰#þ‘ceÚXGrkN¾ŸÑJN]¸è —ó´iâ“zµÀû‰|…}èYwË‘âÙƒý£,ÎÊõì~šX¥®ðdõÚSÿϪ†SÞ§|™’“í8s[¯'Ó¤¶]ãwSÖ½4°UÝWÛìo#ßÑIn^ÉØì®!‘ý†ñª%N¿OwbV©Íš¹úTùrÎ Sç™hNÂuêY”C÷Ô×_ŸõçhM~´vjˆ´†¼Z^G6zÁs5çÈ8;GÆ.*)³Ô³øG–ÖY#zÆ8)=Ø“jˆ¬×;ðHà 6Z%¯NI”OxNÛ¹ÌÑs¥N]Ñ"‰œgÆKGç™ñǯ‚,Í3TÁì¿g™æÄ‰æmÎ=³3ª*’Z¡ú@¶æÀVˆÓ›XVˆ³Ò£sžùr§F¾{»ÿù˜g¦-Æud6‘³X¢3Î|s/š£§lê];SÖ š<õI÷‡ÙÕ+ ¾Eêó„Yw8‘yN=âsÚ»„vÈ”©÷Jj‡ª5uuI9µzªUÞÏÐJ&å§èç2<§>wG€SĦÎ:6ë¡$¾g¦ºu¤†Ÿ»é:q}­mæßqÛ|×R›ºòît©¦ÖC_uQ•þ·ôO ¢ç<ĉ‚w'œã—Ð?`‚_²î°C:®¯<s¡…¿ ?S=L8¢u]x]^ Uçþë¡NEwÃ’¼è_·ê3°H1\Xßó ÒÁ`Ü07,dÈ37øLD‹kH¾Í \Ò|³ÕÔC™8}Ü›{([årYyÞƒ¸Î*beĪŸt0׬.´Â±rºE¤Ãà·A­ÖÛÃø5WœgWS垌]Fn$/l" a7Œ ¼>bíáüSf·ÕPa…ĆtA¤ÇϬ•\áE>Y0Âf?q Gä‰Â^·p"ÔŸ\O+¯™-|íú¾­ƒ+Wý­„N2oÈù^˵€A£VË­üt܆Uúq“ñ–Œ1¢6X9(³¸s-0²Ô”HïÞ¹’û^÷–°°?.]vKªà×G N’ŸØ>§Ug}"xIj ö±ÕdõOÙ(:j(!xGÆÖcf!ø–¶÷ .a;Ò2áÈùãòh{Úß& øYÌ#'!›ÿyQG#“ˆ„àà”+…?Z:™ü·¨QÔÆ½-[3Ìd$ý"É_Nª’a91'eyóõ{A á¹Fÿgþv¡c5UEk$¶Æ1–Ä 2¢ix†C':WÁš™’uœäÑŠ¨†5wÅ>‹šÖTQ ޏ"›cNPq“˜eŒÁDg!–ŒYD{ç‚ÔÒÔ[Nz'=z¢|tdòw~Ùx‡»Ìª÷–Ãм2Ä]FFÅŒOPœZÑ:܉'Ýà©rmû0‰ÌÁ1†ƒ³Ÿ‘ ɧJô­¬áÎMaå‘ÐôÃØ¶•еý 9p&7’~<6‰ô5üúéÂÍý—ª-é—©†÷xÆ3b^2q'bdˆ—‘^b)gZ_!äòfçÎr.æ@*•QŒH0•ÃÛkæ¢ÀJËNôgdW¨ §”JøŒ„k.sq'ÙÐUUAÃLü±¿<î2&}˜“øäd3Ÿz@År䢵‘(gOE¹~Òµ1³2“8nºa÷¹f2ÿ\0ñ\nÂñÈö)D•—|§QÙ±=¦#¶Âä€ÂXÖ)›¼`åö>œÒ‘ÇK}„‹Ï&sÏŒ<›ÛÀiQˆ(ÈãÑ gyÁ¬›ØÐ9Z;¿M¦Ó±À‚çD¢ó©||²åÈŒqj¹EdÕíVA¸íJ<Ö8çEÊø9#ý-Æ©¬@‚lZ5ìÿùL«OXh3êŸÏ6o™_6%ø«.õŽØ‚IÅ#/·Ü¶rT¶–•¤Jd³7N2 › –Þaˆ%º '5¾õ>#ü…ùO•Þr±£Ñ4zæ¨Qh‚ˆÓ?d†ôœ<'ÙÂY¶ír¹Yôú¢tx©R«êVU>ɦÇw_{GΠ;9suµe£g~ÏXôL¿AÞô× w H?ƒ9pV¯ºÚšbð+DÇÑÑWZ`çvúqÐi¶Ê‘u]D'ÛŸ}fh«~;ìýª D?Ç[:Ê*£Ÿ|ñ仂¬² ‰«Xzc?³W «ðØ‹±ªbÉ^¡‰¶[”Ù,†ÑÑ"c"FyR$ä•_M5•¸E"dË USŸÅYÍ©2_°Ã”èuª¹ð%Y@Ní:Ç„/ˆ àL~­~¦?ƒ§ v ßa-`L“pž™.â笌X`¨_$› £9®¦65vø”1…îDÎäœTOœ£Xlí¬Ö©šº"Ö¶TœDÄhAÅ §pFg0®|Ê2Ö6e B†ÇÀûïh/»p 3v€dm=ÂÑ.ÑÂQáýÓSm”ÆÙÇ”SÂDe7è;Ì>ð ò„¶wtz”Ç¿3÷ÞÙµ<ÄL¾€C˜á,’‰‡Y“i˜N틱C.Ÿ"w ýþ›ÊÝo––ã†?Þ¾F伂4,5¤ì½ÿCÊÿøFÆ,€Eí '&Â5NzµïâîK "-3¦ZQ"±ü2‚ùš뢫ëRyËi!1Cí"›J‰î ÃÙkõ¸+µ6MÊVÔ'?÷|ÞŠ~™:ଔÝfÙ‡“÷3~cŒÅ–Ô6¿›A`ê d¼Q—ìâñ%kµ°ð¬Ç3ôœÓoEJµF,Éì½V²cöMTš8I‘¯eM–/XÇ#ëΞsㇽ Idó¬ j”f —JÈf½1J²®V4KÌ:t„³]3cƒUV̬ï¶5y²°Í\š›±zñ؇³æ£?…Ã4äTîÚÔ­wÖ™s×ýïüZ×ÙŘæŸ*Ï]kq1åµL–õ-¿½}Ís«ê:þªðÞRŒiÜþ¾û]Øæ± yº¨)[Ëퟓæ¯jï-µOã¯o¿þi£NP»U÷KaÛ͉´8"N–U{Áê~·Š)Tö¢s\2I,†Î|ë{ηâ@1²ôËv[Î<:gÝXd›3Nß(–c¬ñ1\ÅùRV Ç ;¦¿Ë¢&ŽNË5,rb*'Fýl†£¦VÌ*ê%Eæ~ð~вP°Ê³°‹€‹$Õ't{G–ý‚– øˆ#ÿ‡¸‡Á·)x‘[`z^÷‘ñ ÎdB®1n9¨a]>Þ)­?Þ1Yh¼c‹ÜZ&ãæ¯ ï-ŘÆ0Þ)ëÐx§¬([Ëd¼ÓüUí½¥öi$ï˜þŒWï¤Ê½Áþ{ö“Å8ÉÅ g9¥ôœ”ŽÉ$v!À1~dl„^ô Îg;SA[C޵Xk–'}ŠsHéÆG‹V«œy€hßÅ‘<Ç=‹N%EŽùä¸2xcíŽãu< ᬼèë=E¶z¼d“O×ç=óx~Óc,Pq2Ÿà3X]av!’CÀýr€Gý8ïÉH00`•``€»Ã‚ÎÌÙ§`Á0sŽ£ÎlÅÆ]Ê s•OÂÕ£TkÎWӵ̛ܷûÒa;nÙií05a+ªL·_xÇIGà!ÍܶܺŽ>WëžägäáDÎ-âÔw±†|ŒÚÊÈ=Cã6>6-ÕY¼¦É Ï…EœYu±œdÖFÆkÉügƒhÁ"k2§”ûñJqÎàŸ³º„U#,»ÒFâD½m6Ý<*Õ1Vol¸ÉF.+OÀ•-xÝ}s&YAœC…Ç»ŒÜ>‡ÖI7xç_ކqz¨ì1%Ü>4Ñ>Ù‘RÆdû½s?ÃÆÜB‘ÏSmŸ-s>§ÆŽÕb3:·ÑǦ{d%õ­²çnqš\d‹,à_°:AâäégܼðP1¯hbvÁ?"DzÆiœÒ¬ÛžÁÙÄM¶ž™1¨t_š ÁVÔȱ†ÖœÈ@$¿‘h«±ÖY¦XhN­¶tºVQc%pT³5 #0O¶Íó+ØDxSeTÝ´g^Õ>ÉÛpxrD AwœTË«š”Fÿ²ü™?cÑ3Ùp¬àdWâÏèmybÑjÕT¯BÜ–!)×Bß“#:™ØA€H¼y©‰|ûc _Ðiyu-@xÂÝM™^wxãŸ)°N@ùbmÁô«˜ÚqãpÁ êæ "S,… ¾ ÞIup¥iêæKçŽ'̸8$.Z¶þgAG 2FgæõˆS}²G–9±»ÿva©—¨­8ähK_U+â¬ö?ªPtÀþê.a¬Êþ£•}LŽâgT…> ßqaîú¡Ú«_¡ U(âpÞ†à*t F¶¨€EÒ‘Î÷2V?Œ¡VH3\fõtHAæºrÝoÓ&»ÝìKÛZ‘y ï‘̉ƒƒZ.¸9üƒ³É¿G"sIÉ ñlÒ€‡³<¡ ©wTßqU‰:.kþd®¼ Ái}8S”Û]-PQ@ØW|lSqg›Š'ù¤¾ •/Kãôm§xžÕÕpJz?t*±¬å0M„£iùÈÃÇlh-Æ9Õ¡>ÉuW½2Í-%|¨w¾ûŽ•@d…B_´›…=•çù­²VðôMÙ}wÆúlk¯ïŸ‰nŸýc{³PVI¿h—¢¶þ[+ƒúåq‚ÌĨïk;Œy•î4ØŽá“^ßv”Ùp„ÊË;ò—7Ž¥‚A˾ªZíjýË|^D³k/˜ô;Ÿ“~È/è»¶.׳¹«m2œžØÊ}ûc©­ÍC,˜|8äôê\÷s ¯ïàžÓà˜ìxÓ§®<ŸEµ}"‰Ss?[˜›ÂÖÚùTس}[ßÇ‹bËÀªŸàÓÊæúÓ‚¼k¿7Z­·i z÷Ï'¤LÕg¯_Þ;¾ž‘²ÇËÆŸZôJV¸6[~u û\ÏO&<Û·¹Þ_©ü0*ùr¦µÒÉã˜Ö÷&æ]m_U<«}èmßý ^Ïö GœñÆ«õúÚSo2äÔãçÔãíµµÎú,[BçWÏO‰l €7ØälëÀÚðr9;ƒÓÏmËÚ¶-Ù²§G ÷F\âyÛâ]ti5l×…wt᜺Ã?¼!ÁGë ¿—×= ü»uê¢ÚçþmØDìñÕ·ÿ.?nŸýú/sð> endobj 4909 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1409 1409 0 R /F8 8 0 R >> /XObject << >> >> endobj 4910 0 obj [ ] endobj 4907 0 obj << /Length 4908 0 R /Filter /FlateDecode >> stream xœí]IãÈ•¾ç¯Ðy€V3nÀÀ@­æ0@¡ ˜ƒáƒÑ=íA£«1eü÷-‰¤’ ò 2>½†”rÙN¥˜Œå½o‹·üøçŸþvøû??~øéÿ?÷??üôRë²èþs8ÿûaü…nŽýçCÝ”‡Ÿ¿½|?|ùòòåôÿß_º~úðß§Oÿ:èÃþ÷Ûá/=}ùKÿGç?øöR«úôó÷Ë϶V§OÅõçùûÿ{ùŸÿ8üqq˜®_Ìô÷ti¬Qçe¬LýýeئºüûçϼüØ l–²¨šJ”5ö Z«ÿøß—_O ß_UmUÔ…ŸÇ“ëÓøF™LºOºŸúm¾~¹¼ôûõõ3È~-BÕº´íiFøyºˆ+V­í–bíõ«É¼øûËjÆã¸kº0ÓYYF¿ËBÅÿ·Ë7¡€–4CæMKS×É.ëý:"Ýß_”jæß K¸,t<ÐÓ‡&&‹Òj:óì÷b ;=ý=œ.Kp§:ý. ß.߬Ácu·B©öuðo“_§äÑZô ì—ÕŽWylt1¥˜ÑØDNs¾~#Êy5lºÉݹÎ_Hƒbì߯æ ñ"ì&ˆ´UŠóÏɨZ7ËÓiÝöë© Q-p†n9ý¹mG&¸Y|U=ì—'}/ ïoãsx1%ÄOO¼rÊPõg&ç|q]®ž²ØËï7 «Gd2ÛšéܳßÇkœŽ P—5¸s%‘4\$t¢g "—Ygèb¯PL~Ÿœ ¾/‡Uµ“UÞ*{ì6í$§Y_?LÖ£ 9:ñ§›Ýì"Ä¡±ú‰ô™¥[@Ú­ü¶ÆåÃä”4‹³]˜ŸîY®4®l|J"§ÁûÃÛŽ>LiuéUApôÐ_že,—Ä ± 󉚥ãe[ÓÕ´V©º²uq‹]^ë“a^e}Pº=éõÌ,¿ü“]E\ŒÄhƒ_V. e*å\³ª*#bö:z àë“VlÎ+…Y8¸$fuÝ~]Å~ñXÛD$›óÊ¥2`.‰Y{ú:f¯£Ç¾­#2„ËÊca.‰ÙÖè<ºh#è:|è7ÊF¤›ËÊÅ¡2à.ˆÜFWMQÍå‰9–ö4ûd WðáòäÓ×Lã‚£m†)M·˜ P(jø¤qé€lÖtQîžÜbVm££L[Õá¬irƒTÄ]›Ö:»¶­æ-À£?¸­6èàê®Óõ§Ë“òht£¶R¼º<©ŽZ]€°û:G í …ò=|’Œ#œM£~NTq¬ê V¶pb¼ëÒ9ªJÅ^w9Bˆ@º30œ,ù 𠦣7¥†unå„ Ä£Q§‘Ð<ôß­@•Ç¢5S$¾ƒ£ug[éáцhŒH`ÊlWµDÑB¡ÿ#ܺ+T¶ÀܰrND¿½öxÙÁ,=ùŸÄççMéì€AªQexˆˆÀ²çÀn'IÏ xÇqE¼ç™iÄpM<ñÇ>Sˆëž9(–"„€”…¡ éaiŽ f¼ ‚:gÇ=D2@”ꆾŒœÁ¤#!àöã…ÇÄ<©” :Âg#ë;ëö[V¿ÊÛ—h¶î5º*CÉ«kqU¯¦R®âÒ@5 +eïÐGëq±ô¤†Ol´º¹sm´­êüµÑ™nƈwÏY„>@J\àÑf¼L”ßb.ÇÈù¹ÆAxWaGá–ñ"àw0ëgF#”„ü%qž:G¾Þ7ÇSç@„­,/s·¦˜1øÙÊ!ãð(Aø,®1µèîÒú´†uý_üôîE3œØÛqÝ@ù/dý̪eÄ :œF3FIï>Ÿ»…<—¡3nÂHOŒì7s«á1å!ð=hÙNðib@¢ú7K—í:—GI–ua Î0#âAÕs=†á~Á¢Öã²ÁûÁó¼ßÙÝÌ_…RÔ#™Q“¡GRÔÌ–UÛæFûî4äñC`#®çëõ ¥YÓE¾Œ¤ÙŒ{Qªa»ô:dƒÍÔÃbp4†w'¬ŠT‘ö]oŒjˆïñ ”ì ]7Í(a„¾Á¨Ôö“Ôaóøïê^Sn¯ _ἇO Çoõ:fé œGÃ'øª{#‘œç®¾ÂV}µ˜>À'šXô øÅ+¶ˆq*¼SYºfpúYtmøüÀ” NÁ`áíðÝqºÿ 0Ü |§w®ÆW¦•-‡)c™,éY؃5Wh§ynfD“¹æQX™¾ÅTeÀ&{ÍC S#"<05ä1DSêÝÊÍÄ ’$XoðpD(I°ü£ôG¨x´*üŽèªŸ6Žw?²Ÿ¨ßó0ÚÁV B;ÕïSaNV6„•å9§˜‡ÀÓX@ÍŸâHx?˜”¢ú=Æ)CX–ààwû˜Ñ¡=ô†99¦â‰Iå×åûJ‹ß?Á‡Qˆ=j"¾0 Öpµf>;êIÚÅi©ùÚ-9["Ñ×ûßÍsLð`¬Èl‚RZ_¦¨¦Gèά/lEP:"Ö‚à~Í2¤ C¬ k¶ßìÓžÍÀžeì uk m…7d7'‚µ0ÈÙ>OF‰kÞ‹4²Z—ëTþ|ò|ò|’ý“§/ðé ÌC¶Y8O÷ö¦qÐ>HeŒ'òfDvˆ=Hè:܈8cO²K)ÔÄ8Cc6|*àö H)=bÖ˜)¹,qmÈ3=RÚí J»J.‹×†=UPnXFƒÙÝãRB,h lçb ¥ªÅøÁÞ-b?²:¡ÂÚÔ`4ÝàÑ0± S/\›,x ³»‡Ox§„—Æãµe¢¾1Å>`bm²Ñžèr|ëO  lÕkM#‘K½ºï瓞xlÖGó‹ÞMxVÍÜ!>o-¤±ðhÔ+éY59ÀèÙ–1ÏÛŠö;ýw˜r÷œášÂqkïʦÓSeÏömˆ ºv# ºÇl{ ¬»ÎÝ«·ïÝË¢š¡.FfcÌ.=…Re ÎȲ/¼6ìz—­‘%Z6)A56­šHʼn5¾òøNGž\B¦6Y"zenEBÊk§º “ˆF§®c¶—Í€ÕåWj<ëKwÉf—çý¥×R•Öéô9ö¬-U(Òb†)C¿ECÑ:•ʼ€à¦ ŸI<š *ÛGó>ôG“í‹1ã<-ÛKÞÙ«thr€bà`òØ(®eWõ'®€sá…9Ã#DVÑ—-ðÍ«S º^EbˆY¶uE|6ƒ«""„ê‡8”QDû” xHFœ†–…¬Â‚ã%²ˆîT“¨”ž¬rîîHf£…%Ó…! †ßñÝQ#JËÒT®¸Ü«xŽWnL Ç#ÒwëšèÁs©ËL$¶wäªÒ7Õ._Ìu‡¯ª§SªâØ9¾F@®Ð“ž•G=ó–½ ¯ ¿î]x§¿ÿ;¡¬óŽž|F£õ.Äêh.„1?ZK+x=­YR—ö£Ð<…X¾B¯*­‹_¸šAÕ\À¼F»ÆÐ힪ªÞ]¿šÉ䄨æ¢zƈ­ˆLc”#u¨‹áÝK%‡0-Y'\ÙÒÁƒµèhfc;¿ ݬݗ.™R‘剬լû³ÎY"J‘MT–õú$sŠˆ Lÿ|{:ãÖ HqõèöÌQÈ™§Ä÷ŠÖ®ÆÑßlªòX,·†S‰¾˜Sà®3÷7qdÝ.r'šJ‘†÷ê%_TN{”ا¢¸Ÿ~“A ¾(*)K%­*nµW¤>ˆ¶Í\y®õÿ5–†Ù–®K",剫H&4„ÊófM©øãDã»5TÞgÓzš]ãwdƒîD"tQÙòý|»Û¥'¸Î6Øp"Wt«‡G·1RlØ0®Ž‹¦hÛ:'‡ Û¢Öîc©sŸ˜l Jѭƹ Ó·‡—AA£ÍTá ³²²Z´ŒrG™'Û=šÌbEB„=KbêÁd„Év®bØÏîuoðíÅì<Ñ'#¿Š@O¸@"E0yZn@eAÑ qaŽÊÆ”h›¨ëPªN8Y;ã&ÔP–#̨«­¬kB$_”R\t:T¦bÂC›³j1÷b%4cËf>í–™*Sò8 W@.Y{1±méȵŒŒÆæÜž^âaå [–høú¨ÎÜd¹ë WÁDLx(‰ÎäFÊÞ'%¾d¥È™g úÊv3à LMYYïx@ò»¬°ÄEè¢6Òh]ão•ÑDv㨢vÍÑÏÑÁpŽWrt…ýƒmâªsÙ'±Ý‚Ã}¼KO8Ä9®³Eo§´áþ‘ÍžTžJýZ‡…°{EN² ’¢ÝþeÀHÒʺDÂÔ³ß+ò–ÕÉT¶Ã\‹åÒež·bÆ÷ü¼ Å4îÆ³IR)R­rÉòp­˜Ï¢r*áñ¤îX™ 'In´ÃŒõÄÕR]ç=^¹;jÀš/Ùɸ†A¯ÈfÇÅlDSµ›Ù°lƒÆ|<ø"áØr×׌PÛL)j¡'aª>6ûáðžÊ'Æî ¸‘"vLõk“½]–-Ÿ˜¨ŽlrÍA´=´lÅgJÛm±Âô F(ì´WGˆ$ŒoÌã<ÆHµa'ÖDw¬ÓטBMI'¬V›l­\Å ÖÃÁu˜:Zžyv¯[å©ú‡kϵô²©b„Ÿýk˜X¦ÆQ‚Š+F)«äšlÈŸp˜*Sa;D¥‡ÝgøuJ‘uþƒ~wÏâ{9–ºËâ{V,^cÅêAµX°àR¹&‘(°™"îî#nïÉד³_ýAR›$c†‚–”u²K"—¬’RnkæÀašø2ñ™˜WnÛ aw‰"X²‡°}ÚÎHeyuVöi³£uî~­›cG­îœ.5MmÙÃ+\š'Qÿ—Ý”¶ð$‡œRTçkLÕQV–fñÇ?U=8>®5f"¥žî!Ñ:|²Ë„ò,ûy6l”²B:òJ³^éùÙ#Ê ƒÌ{D•õ†.`Øñõì•Cw€gÍ|®FÂNek×ñøì­•}o­J™ð¸ŒÂ³·ÖózoåD×{ÏÞZ¹ôs©Ì5Ã!ao­ª^§„go­àÛ´«{xöÖÊ!.íi'ø`ý¶zkÕň’Ao­ºz´p“7×­ãQâBîºv'u‡pÅ\9áëæj:  ô]†Æ¼áÆ•u%«“0^×;ÝÔdŽ.ÁY=`.ÓWÛ©ŠÆEÒS N­Ç,=P¿ÉrèëöÚ³;U#—ýãMôÚD1 ©‚ ©ÒÉ¢Ë6kz°æª•)ÓY4;ðá´ä*©vDSª¨« € ƒœµK`rõz.œ¢d†l‰ga“Š‘´Û»PfP/‡éŸîÚonüáv?KK4ðo?¹/EHDŠqO¢ÆN¸ß f´tSº2K¶T¦‚?S'õÁ Y%»RèOõBÒ,Zç¹?ꤿÒã-+í»›èáË.«›3€3dèóg¦ Ôî% çPZ3;. ôôïðýÄ)½ŒôËÚlà´Ír os,ÔÙAuÐvzÄ–(£e½Àfº#¦úr(çG¬š?é)P{Ùe J¶h³fb-­ís¿S”âU,ë"[Õ|ƒ=åám̶¡ðhð^b¨ ­×¯dËÜùsñZTì”%Aú@»˜½©¸åO=$1ÒóÑðøf¯’œg_xžæv„×…9öÌâfÌ’V9â—×—nñÐ endstream endobj 4908 0 obj 6346 endobj 4912 0 obj [262 /XYZ 38.2500000 563.750000 0] endobj 4913 0 obj [262 /XYZ 38.2500000 563.750000 0] endobj 4914 0 obj << /Type /Annot /Subtype /Link /Rect [335.250000 374.750000 384 381.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_directors_typemaps >> endobj 4915 0 obj << /Type /Annot /Subtype /Link /Rect [328.500000 351.500000 377.250000 358.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_directors_typemaps >> endobj 4916 0 obj << /Type /Annot /Subtype /Link /Rect [380.250000 335 429 341.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_directors_typemaps >> endobj 4917 0 obj << /Type /Annot /Subtype /Link /Rect [356.250000 318.500000 405 325.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_directors_typemaps >> endobj 4918 0 obj << /Type /Annot /Subtype /Link /Rect [121.500000 241.250000 171.750000 248 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_default_non_primitive_typemaps >> endobj 4919 0 obj << /Type /Annot /Subtype /Link /Rect [90.7500000 150.500000 181.500000 157.250000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://mail-index.netbsd.org/tech-kern/2003/08/11/0001.html) >> >> endobj 4911 0 obj << /Type /Page /Parent 2 0 R /Contents 4920 0 R /Resources 4922 0 R /Annots 4923 0 R /MediaBox [0 0 595 842] >> endobj 4922 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1409 1409 0 R /F8 8 0 R >> /XObject << >> >> endobj 4923 0 obj [ 4914 0 R 4915 0 R 4916 0 R 4917 0 R 4918 0 R 4919 0 R ] endobj 4920 0 obj << /Length 4921 0 R /Filter /FlateDecode >> stream xœí][¯ä6r~?¿â<Øc‘ÔÌxÆòÀ°<,òxã‹™Eœ}ÈßO·.Ý"¥KŋԌ‘uÉ©b±®_øç_þãý¿þþþÿüÏûoã¿üå­øhªbø¿÷û?š_íÇøû½i«÷ß¾¿ýñþÇÛÏo?ßþ÷·á_~ü×Û¯ÿ{—ïÿrûÿ¿¾ÿùßoÿ2þG÷ÿàû[#šÛ¿¿õÿîqûU<þ}¿þßoÿöqnœŒþ÷ŸdU–…¼Occè?Þ¦Ïý?ÿíoo? p¥*Ú¶(ßE©nÿÓ•òýÿóí÷ÛÓë‹®¢©Ë¦82P#û‘ÊÛKdwûŸÛÿ›õÿ0½žÿå]!;o/fÎN¡ja;ãâv·RÊýŸ¯÷ðrYú[ÜaæìT×òvÎÅUrÜZUãB·û ¿jj/¿Ïœ›(ÓÒ—ß]]4m χ¾½FÕò¦¦†ã°7µTwõô‡q½éŸø6=z×`¿ÏÆÍm¶Ým0ø[ÿ¡dkY ó¸ýÐÇ[»ÐO@{ÖœÚx‹Qf ±NïïóëÛt¦–îÐ:‰ÙG«çô´ëåÝÌ©Ì õü‰oàMO¾«¦\ŸUS“xþ(g³‘úß¾iÔOÂôþ·oëò]»°¤Ñ|ØÅ’!RÓèÄéÿ.{®­ž¿žü;ŸGÃHŽföõ¥>žóI,/”óY­½‰ŸHÃÒ€Áæ×}‘lZ ïïm*Í~®.×»q©±µêu–Õ®×ýƒßÌ7?mcL§môa—;¿ÿá*óa£õˆ ëD×%ÍUúI Õ;º¥zâ ? Î4.§§]ï ^.Ôó'¾78eÑéÓ¹]жÒÊßÃÎ~x&Ž6úcÐ^y¦± šøÙ¢‘6‰ÅÊÝgsRõw×N¿žŒ>ŸGÃHœfN‹af“°\×ÅÁq†Z¡Ž¾4æ`štòD«ie™äJ%mÏEfÚv¥(žÔÒ® sÇ õü‰oàMÇeÒã½Æ¬¤'ñü!f³‘úß¾iÔOÂôþ·o뢋¦%æÃ.–ôàvÓˆÓÿ-F>}üzp¸6†‘³]=çœûR“X^óY­½‰ŸHÃÒ€Áæ×}‘lZ Q&mSi>ðsu¹v˜TæÖZè×ëþÁo曎‹ŸÊœNe »ü{ÜùÕrxFªÌ‡}ŒÖ v2¬]—4[Té'Vïè–ê‰3ü08Ó¸ðäi5n¢ãÄiæDçQañuc¯æ,Úb˜£h¢‡,õGÙâJ—~‹…äÚSÕzt·¬*ƒW«jâêy€uõMÇN fÕN“xþÐýÚß¾iÔV+ƒörÈ3‰ŒuѥВFóaKztƒUzwxéÀè•ÉáZ`•‘³ÝÛÓiÍI,/¬‡{Ù8iHmeL“NžH6-Ð(“¶©4ø¹º\;¬­Í­µsÖ¯×ýƒßÌ7?•˜ÅÍf/¯D3 ;û1›þ¤?â £›£õrˆë´×Î’*ðhَž6‘l6/<™yŒª2£™}öœÍøõ³aW.Ì™wõM|ÔŒ¢‰6ê‹0È–mº /ViûT¢5·Ïz,R¿^÷~3ßt\¶”ætJcØåßãn/—Ã3Re>ìc´^Ȱ“aèºPÙ¢J? ´z7Ñ@œá‡.bÌ Ožn‡MÄ@œfN„q%_76ÿaÞÑÈ¢-†9Š&sØÈbP”-®té§±XH®=UvÏéͯW¦¤©\=O款é¸ÀiÀ¬ÚižZÒþöM£vmÐ^y&‘±.ºZÒh>ìbIn°9qîW¹S-8\Ëâ0’c¶{c:­9‰Å…f=·ÄÆIkDjmƒiÒÉɦeÒ6•J=³ÅÀ<ÚNæÖë,«]¯û¿™o:,~êb=uUc6föCÏiû"Î0º9Ú]îðScöšÀYRe-Ûѽԓcøa°¤qáÉÌbÜ=ÇÉÑÌ>[ÏR _?våÂz‚ˆiæÔŒ21|Ô1a-Ût^¬ Óö© enŸõ¼”~½îüf¾é¸l‘ë`àZŽøèÙ=ST{¥/‰ÓnŽÖËvj¬Ó^—-KªʲlwÏ@Žá‡.[Ì Of3/ ä˜íU©ã}‡¯Ÿ»¼°ž*bc:Ãb€Q4™ÃFcFÙ²M—B­­ >¶ú'Q(!Æ"¢jY"y´Œhþz//kéïåýÌÙ©2T@ÙÞι¸•(É¢ó@¢Çë}п‘·Ÿ9;U¦Å]¼ýg—·à© W@éô–?ÿúöÃOÝ»¨ßýý6³~Àá_¿~+oÜkioòó׿¼ÿcQˆòŸÞýë[ûÑvE-«~~ÃB¢;²íjПÏTý›,+ë¶ÑÞÖ¸SüˆÆ„gŠÝQbxÛóõÊ}²bx‰PJ¶âvkÇd-ãÀϰ¿†oûÚß©¦©-Æùúëmqœ¸Ã]×™î^³­s]ÑõÃvý<µ•mÑ‘ô SEó”·ùéó,$6Ïdó3|Ûå9ò6ËŠ&,´ð²´!)«aÙ°!¶¥ºÙgØ–åÍl6æIQ PYT –ÂðQ¸or o’”0žÁ <®oµX_ñÙSxY±jƒd I[LT¼‹±Íã >Ìÿ3X¡Œÿ+Ò“ö+¥êª6¸CB)U|&ȯ-ɶö¶>“¤mJeî°/³â¼ƒ¢Ý±lÅR oÏ@[:”©Hq—.b.ÐböK…WŸð9þua×JSÚü=lOX, ø69|µÓC‘5‚(ÔÂp…¢Z~‚bWAQ]Ã; á™Ï¾™FˆÂä‹Ü%|†……Á–Z‚öE?–s47›EîœÒVdÆMr}Úm7[d6Å…†ã”_H„f”šÃOîF¯¤(¾À;_ÝÇQðÅàTÐ|õbØ:cyÁ¸·ÜÁ+‡ù¯üRL7E˜¦›bÓ2;öY'·×Þ‘poÊŠð6á¸îM 9ó‹ê­c'ÄuÄß=ª.ÿRÒËËînw7Þ8a‘/¼[¤xåð—â„Ò ¹lyr¢å{{Ûx}*LH7̽ ¯i ­Š 2M=FýpÔ²ÛäÒ>a}É®€3iqtuØ~?àé§iW¤M|)Tr´Í¶¾ÇëH¡ÖNñõ0æ$lÕBdIÙ`KïÚSòröyiî¦]Ádó| h á;øm%–ƒxå°Äjœ3nF‘–8!Lñ¨,^2¾C±ú¶,™:´+ŠzÛnd³Ëí ×®¨§ðƈYË`Q²^8¨nâV,)øO9‘LÉôZr8x°XlÁëœrª–r`&JO+Vca‰Áøm;š±øï”ÂP}¤ž‹„Vq”( 3*„…õö7ßá…dRègIlüdª¦ý˜]’©‚£o¬ýPHbŒÐÉ27Œ §I€_>Ý!)¢Êʼn%‚Ua,Ó¡gÆ…¿Û^fç3ü‰ž—wmÆõ¤eLëÂiѾt [ý¡„4Tãg8ÎÀÈ͇ZX$pÞ/µÐ@Á/-àÛàÂÿ†éZsÇ´“éÓ$[~|fÌ7ß¾m‘„w,Ü"·ðî 'ùaNÆoSp˜_”Nø™dhíßî/«)ŽA S^¾H“%ÚêcÇàjBÏq¼ãÍ7ð†CÅK‚gI°ûŒ]nÊAK¼kKIÓ;4ÌÇŸAéÔ©J:,’ŠÀ)›©ŸyçÂT&—ò”r_–SY(•Á¼MNRn²èKÏͼG*ÅRîÓÂl¹‚‡ÐË‚$#eŠ)É’¨=ÊàÉUÃi¢3xµÞHeÚ/'cq‚˜””÷|¤%«"õ:sHä/aQYKøP‡vvÁ â@2tb€ÐRó˜Ì¸‹z…>§ K3,ÇmŽ‘69Ý:´-)‚•² ýD0—üc®&Õúà'’ìà…<*Ji:IlÀY“š²Ph¨M‰<œ@‹LBÆ'\ößÙ§´i;Aåµ;_ÖRX;âg&„2õ&¾¯¿rœxö™ðÙq²(M«+ð ñí`3Çþ +Y²SµE¦ì`zTåÔá>ZOŸáÖ—è™1Œ-Q~H±7Ý'Ùúì!rˆª6è1šék†5ü6±e>¯=3Ü©'r,„þšª‚tÕ΀W‹~†o+¼{T#>Nø-¥»>u OK}bó$âÙ™õØÃ*  ÓQ\ ¸hV±…”6}‹VqØè>e˜·VÞbƒðö‚ȆzÔ,B%LšŽ™m¡ E`÷bî‹«6SŒd‡‚&E× ž×ÖRœ}ûà"-@Açh>Øîuñh¹ŠmwFaÂÌïZÄÓž¡”¤ÏÛ‚¢¥d÷=ç4³3”¡ì Å3÷;Cf7+%i•¡$!ÏÆEöŽbÖOð‡ÑΪ¸J/© ç¦zíÊ$C‘ã×ì‰ðx"¾3E%iG ¨ñý›hÖ%wà  I ÞæuDJ€`L-šÍo“„jRJªh ¡:Ëñˆ¯TaòU(»ø"ø± ûKI¯_°¸&¥-|.Ž-Ê©ÛLmö”9€Zys‘’®pyŸRn¯Ð~c'ÉDÐó¯¦f´ïsþ"¸Ô=uþ"ƒ¹¢ew C:æüÅó8ç/rþâ´zn*¶k5ÂDc)G1›FæáÖ("î³5IÓ˜z( ùY4ï9U †^,­ (ÇPÌ4Þþ<É1W8_¿Î)ƾ¾ç6¡|ÇDo:ýõ#á€#”>C™yÌžRXO_ŠoXG 31 [ŠPƒˆ§juÖÒú²ëL‰ç·(á"1ös·M³È(‚]怾âõßI±™Pà©hˆ” çæ ÆÁƒÌA ¿@ËÒP…‘â%§p•!Éœ†¹ <¼²U»=»Š@›¢‚ºúå 'õQÏÔƒtP…”ôºƒA(\¦zf cS|F‚þ , s =NÅ–ð_Sv›¦:Oof*ƒ© õ3ߢ-eXàåQ€s˜N´7,p&ñ2,pÏ8¸G—dX`NÓÑŒœ¦óåÖœ1Mç8:÷T9x,€ót§}9OÞn<5N)Dä债Z¦È›Çµ“uk¬Ý9åa®IÈz9QÛ‹“#ísG.ãðÆ\gÖ¦ù‘˜s(íKÔu\׫ÉèC¢fÊèÄø;£éèÃF™š5‡]="SOÅG|dÄbF,îŒeà)HH.K¸Ãj@sâ{üC o¤Ø4È-gíϜ켦SÓôÇy¨Íë{f0Û¹0Û1K-CÎBZï71eÈ*Þ\ä¹¼§èFjVÞ#u„¬Ó2RŒÉÆÞtœ‡h³&ʉ¶( ñ1νûè'®}U‹îø™>ó‰ðŒwqÚÖ)N)ż&{Ÿ_ÞìÊÒ\‹ŽÌ›^>P梳÷‰bJAlZN‚g³fˉyÔN¨c›ð8AwJdFB\p ¿'q1GXÌM;—´¡G²Ã±qÓx³ÄŠ¥†.åM²¦Vl;m—eD“¬§rm)žØÕNÒNÑö›¶'e¶I)ÞŒû¹Ï5|MëQ¿ÕRîÖo'?@™Å·8UŒÛ¯ŸåPjaÓ³¦­]œµh¶L¬’b p![¨wǰŒ±à½/*ÂNàÀ5Yð XR¡ð’)#ù#ÀîD©œ@f 1Ï—2—D“‚Á ],”(¡? ëlõP ƒQrsÄvyjüCEB_.Mò° 4‚à¶,Â+Ö;—ª077Å2rXL^Ά[Êì‹.",ü‰M¬(XÛô*‘¡”$*©5Å|ÁÌK¢±ÔÿRì&ÖÌ9 ‘–­XÌþ5_'ª°fm¸*…fjŽï¹ñ1¥“É=^p%oB!œ«êq”yîÒ¼ÇTË]šy’†étœž÷)‡ elê«HÊs–qFËy^w”K¨’L/ç®Ý{l‹Üµ;ùÊè¡©ÆT£¹xÒ‚;÷ÏÇö†î¤·ö}¹ß],ù"Tò o°é·ÏÞÅ…I S´§n'ž¶^¾v;ð”åaÒ|‘›v[¬—Ü´ÛK_eŸEgè¿ÜJž "(ÎâµËØ"ׂ™øDè4¥!ØN`Iî»5z(D7ŽfÌ–ø@Æ`•ã'hiB:ÈVÄ[¶Ï.ðÄ\„ M„ WvÉ>áйs “=ºŸoœQmœÝ—¥ýCû  –p_È~ëûó÷> Ú…oo¿Xô£ÅzŸ‚¡XC•=tj:•'—=Ô/[-P¸œÜÖ\Ù÷ oG¤ÔL B"D¸D<7õUdh.ˆÈ¹ "%»9DØm‹\qú‚ˆ™Í»”wØe€]H¥ ƒ‹ƒ 2yÀ’eNŸÕ¢4À —•~è§”‹{Rö2r±MÒ¾€Ï##ÚÂÔö¹ì:—]犅lù4ˆ²ýãÉþyÍ¡:S‹i9s‚7óù’!¢?U»­OY @JÞâ3°›„ÇaÕæ¾Ñ/§4J®ñ¸ßUÛûýTP“¤KR4êâ# ã’ûzÌu0~K€^¼|£†üÏåI¹†»Ë7n Ù¯c7•o(íB”ò e2W¸òn:‡ã*¦`ÇJtíãÈÌ\E‘’Ýö¸J Å`N\§+èä}Ê—«í\Ðñ‚ǹžÂ&'¢™9„Sjsï+Ý{ÿø,×h SIfˆVŠb9Û.1m—‹á?™ë ()ïé˼š|ç=~"î_rD‚¾<ÈÒg½GÙšKäüÞ˜>Õ¬ÝXA=w|››%@™ltôFhDs¨Æ¼*.T¶Šd¶\£b®êØ:»¢0´ [¼H,"\×ÉÂÄbÊSIá׆[tjaff¸Å1;:Üâ¾ý:ªn!ŠZ»oÑÏAg¯@€‹ÛªÞ– §âè„ZÞÈ-§SŒ3#%#àòØfä©Ò«A1æòå*âüœéŒ Å8&­®!_2Ã&'2#| åÚ&ÿPŒª3ðܦgÿÊd H6š¼M’1 Ç6{ˆNYoÓð”©,¤IŒ¼HÀ¸ÍÈ‹c+™‘‡T›%pÆ‹äÎX‰×ÆJÔ¥©3V"c%’›¯•hûS•5Ã0c%ŽY¾‘ZSܲ_Çæ•(´+q°…É^°#,¯­7…ŽEFci·ÀÍS0 Ñ“6”ó7,€¢nY-0že¡ˆ8Ž…Äé5'Œ–ýâ bˆ÷DÞã›H]¾Xë€Ixá»N»"M6Ö&Ù<ÿʧZëZC¯yÖDñ…£Î¯&“¬çòÆN/ H+—Àc(¡Ê–$Z]SŒ° •£Šeò汦GJ6Ï]”Ž4¦û>®u÷ÑO´XRkåŽjÝŸ)x¿­†wü7<ecŠr&K°“Fûƒ`iXÂàØ&Å ËuêPa;”Kˆ)J¸CYd‹SJñæPØâÿAJQlçÃH4 4.PFôܺ›¹5<¶Ñ¢Õ@6p9j›ó°x‘ï„4q` d(TêC”"°OC:ŸŽP«g‡p4ýENÕ eÁåS™Ï¥ªB¹™å–˜D¬,o8†ärÓkF¼¶è eB1},¦#o C 4Òëä$/iô_ž‚Ë0Ôíõ²”( s• «/KÊ [a H°®/„/½¾) %Ñš:дhHUuœÁ`‘\Ä騘%(JÿÖ’]Ls›4 Σj³lòy#…â E1Ò´ÅHÑ:‡Ú2‘ËñµzÓ;›¹YÞ•`Ó}‘ø‚’:,Ož]†“*ƒXk H†Nv/|K–êé` I œ¯:!ͳð´êOÇݧ²I›„z?Ò9]PtŸ3cÄKƒ¬Ø¸œÂ8,Ö’Å[áÀ‘м­¼áF’®dUE$ñæ€ðØÏw¤>]ÞUŸ(¤é®úÎ8X?±*_H¸Ê3#ö\6h&%ÙÇÚ»àÔU€À\Ó]ËK°5°g1°¥æ³çž¬M¦Ä»Š¥›¥Md  xÊyY^F^ú6Ú å¸¤qÜ#R€b<õàUÊѹø‚æ9®aY<ÙýÝ)¾vLmٌŌOmÉ’Ÿ …b̹冀øæÀ |¬ë²LVú4•‹gï Œ÷c , ³v  ½ÙÏ ¬T•¡×.ßù–·3™…Õx73Åãn}óÏØêÚ‰{Œ…ª3£ðÕB€ø=±‡Çh%ͪà]ID©ÎñÛÑŸF¬Ž[*5}ÎÐbÑÍ{Î Á‘"y§Ù•»Š]NÇá¬R Ùf}÷Õv\/¥ÕkaÔ9ÏÕ‹ßd#@Õyתï"Âðœ§â‘² é› ¬™<.Vü®—ƒÕc²3áðEËÊa8œëÆÛí8Á#QY£N”ú/Üå³ê¼n ˜L™avV²³’-…Y ç4;OäùˆVò‘_ÎqöÚq»5V$—ü슙)! ä€wåFYšŒE:úwîý‚¾šùÐyB{v¼Âï8œÅPÛ'7Þ¿_{5žÜ¨Z9¿ãàÆû †ŒnÄÏËÄ/›Îîž›»—^³\ÒÛmt)1)¬QöG«,ýêY›z <úD/KaÊK¨öþÙÁNS¥`õ°ÀÞ¡X&Oãd1’Рø{¼»èÚ8ïÈ =#릘âlÔ~ö—2¤¨å쯟àÏèŽÀçx8­k©"¢Y[ζW:Ô•¹È¼…¡ŽÐsˆÁSœy^9N8øÙRÎÊ „vO©9olü¸Á –ÜÈíÙ½ŒÁ<7Ê^¾¦àŸÖX·QIï¤ùí)¦ß‘pJƒšù° Ì$8(·@C)¼¡èn‡ߤР–ú—1¸rªÆxÞFõQtJ—"Ø¿ü!§[¡Ì>R;‚ý± žÓ¯.fLRða–‚ê$UË žYnqW%•–׆öõnÍG9EÁÅðu/.¯åõå™ Öê¤Ð¯Ã„8ùÄŠ\ÈçP­GsDã2—N uµJÊìû[ÇáõãÓöÚb=T_Їî?O–‰ ÄÊÒŸ‘žn ì¦#î(ÝŽ/ß±àTGÁeYJV»M)þ¹Æ”EŽv–#ã%3åSø SúÆNý® ¨ñôÅÛ_“t¨!¯£î°Û(zÚÁQ"”)âê¼® Ž×ÉÂß¼n¥?w "JS:f’Ňç=\5 ý†r|–W aè\^´+¯U\~墇y× ,U–ú²¬!å0"âîÆ5]»#ÑqW®=óÝQ]@ZÕ*ZɆ@EåN_ü6IXG gtÛG$¬ƒß€W˜Â¿xœ@ô•ø™ ® æ¾Ý)!ÿ‡\áR†æl…÷VtY¡|©Ë{§€|I’}¢£%à$å'WÁY_fg¨.ðÎÀßòž±Ì~iõ%Ì>ãÝ ÊrL7ŸÁ–Þgpµ)¡¥JÒÚò6̉Û 7ð*HÌñ–•#¬B™¶‘Ä*»RßJkB †„µ^Ù ´=âéO¨âtè¥ý†®íaŸSÅw(¸¢Ë%ýb³tàIî?6ly'ep¸¦’Æg¶[ŸÜ7^¿ïª±õÉ=6»£õÉ”’{ ’^Ày)š‚Åf†³9íM9߆)–4g=çl=ϪN™Ûa? s´¥=GÓÙ`ÇjX€çŽM¹cS„ŽM¡š“ŸÔ ŽÜúÊ'йPÒÔI,<¾ÿ˜4ÞÇ9‰ùVe3Šcc8 cV8Ÿh‰2á)ŽÁá¬!Ž ¢s8²k‰Îò„”ˆžÄ±KJ¶ F-QtÜc‡´Ì òèX@fÏÔõæL-ß ¿g[“κd^¶P”7W„y‡”qÀˆLœIŽž­²ð%‡Cá·°ýÉÜhÍŠg¡ìE™5–H¹“z¾j«mMÇvÜèö|ê¢ÜœÏå¬C¬›(RñeìFu-^ÖšºÝXKµMÅlµ%ÀIÁ¬6 Š®)óAY’ÏAðz²E™¶Í”€E™°½†EY—¶ºiX”µ8°O^G7),Ë1_î(¨µBbòëöÜK¨8Ó‹qEך+âÛ±Á8–õK¯æÏÄB \á‚g=Ûé·Þÿ¸miëŽÿyë?Ø‘ámWOêãÆb·¾ËG†w°üÖRÑü›•´í`ÅÉ9€%Ô®—wFI(?Æ^3j3Àh£•qÔV›€µ¹ý4~):Öƒ\Ëç” 8Y1~úâGVÇ( .Yù ߟ eáôéÍ“m© wÿ}›ñ4ó¯h¬ÑuucLÈ£é^î æ¸Ó÷ü§–ƒ+2:\³×c¼ž#d9ËwáqÚã ÞêcGW~vÞ”ˆ?¿ÿüöÿrБu endstream endobj 4921 0 obj 8846 endobj 4925 0 obj [263 /XYZ 38.2500000 421.250000 0] endobj 4926 0 obj [263 /XYZ 38.2500000 215 0] endobj 4927 0 obj [263 /XYZ 38.2500000 421.250000 0] endobj 4928 0 obj [263 /XYZ 38.2500000 215 0] endobj 4929 0 obj << /Type /Annot /Subtype /Link /Rect [451.500000 645.500000 528 652.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_compiling_dynamic >> endobj 4930 0 obj << /Type /Annot /Subtype /Link /Rect [406.500000 625.250000 489.750000 632 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_default_primitive_type_mappings >> endobj 4931 0 obj << /Type /Annot /Subtype /Link /Rect [43.5000000 617.750000 549.750000 632 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_default_non_primitive_typemaps >> endobj 4932 0 obj << /Type /Annot /Subtype /Link /Rect [225 379.250000 267 386 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_exception_handling >> endobj 4933 0 obj << /Type /Annot /Subtype /Link /Rect [516 338.750000 545.250000 345.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps >> endobj 4934 0 obj << /Type /Annot /Subtype /Link /Rect [172.500000 331.250000 225.750000 338 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_typemaps_c_to_java_types >> endobj 4935 0 obj << /Type /Annot /Subtype /Link /Rect [447.750000 311 511.500000 317.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_nan_exception_typemap >> endobj 4936 0 obj << /Type /Annot /Subtype /Link /Rect [333 290.750000 468.750000 297.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_pgcpp >> endobj 4937 0 obj << /Type /Annot /Subtype /Link /Rect [43.5000000 263 532.500000 277.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_pgcpp >> endobj 4938 0 obj << /Type /Annot /Subtype /Link /Rect [390 229.250000 435 236 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_date_marshalling >> endobj 4939 0 obj << /Type /Annot /Subtype /Link /Rect [296.250000 192.500000 365.250000 199.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps >> endobj 4940 0 obj << /Type /Annot /Subtype /Link /Rect [152.250000 158.750000 196.500000 165.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_special_variables >> endobj 4941 0 obj << /Type /Annot /Subtype /Link /Rect [222.750000 128.750000 262.500000 135.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nspace >> endobj 4942 0 obj << /Type /Annot /Subtype /Link /Rect [391.500000 107.750000 431.250000 114.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nspace >> endobj 4924 0 obj << /Type /Page /Parent 2 0 R /Contents 4943 0 R /Resources 4945 0 R /Annots 4946 0 R /MediaBox [0 0 595 842] >> endobj 4945 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1409 1409 0 R /F8 8 0 R /F1700 1700 0 R /F1499 1499 0 R >> /XObject << >> >> endobj 4946 0 obj [ 4929 0 R 4930 0 R 4931 0 R 4932 0 R 4933 0 R 4934 0 R 4935 0 R 4936 0 R 4937 0 R 4938 0 R 4939 0 R 4940 0 R 4941 0 R 4942 0 R ] endobj 4943 0 obj << /Length 4944 0 R /Filter /FlateDecode >> stream xœí}]Ïä8nîýû+ê:À¾[úð‡€àÓÝÓÈE€Á ‹E.‚Ýì ÛA&¹Èß?U–lK´(Û4%ÛUÞF2Õª.‹~HI|(ŠúãÿýõßnÿïnüúëÝþìþûõ×ûgSÝíÿnÏ?ðdûé>ßš¶ºýùÇÇï·ß?~ùøåñÿÿ°?øõë??>ýïMÞþéñ»ýé_qÿèù~|4¢yü÷ïÝM#Ÿîßíÿññ/ÿpûÏçûîœ0áßÿ «J5ê)ÆL׿ô¯)º?ÿóçÿüø£`]/•¸7º¾ ­ôM-oÿýï}tÐ?þþi´M­›û–ŽÙõÔ>!Íý¦îzÒQ÷‡çñ‚ÿáâÞêl·’³£"T-ÒOüR˜úñ4úÙï[>L%ön?¸~ö]›ºÿ hoº_ü½ÿés(üÕë_4²ÒæÑú9ì­º©ún:qtS»þüOÕ(Jü·P:¶[¬¯8ì?üö.¶cLg›$¼×”ž‚üvõèDH1~ÅbÑGmÔ—¼ÉZÅŪ5fÚ <édø÷Ü uÂÀNŸÏ Y¯¨öÓØœ–~ØOó@’ *ÞM«"Oÿ¶?;Q÷fü„{ÔV„4°¨ 6_šiƒ¯ÑV3ZÔØœötDŒÜ°õÊúa?ÍåwÝBÐBÃñKŽ=Š!§“x?«cD(Ô„£móÐX ¹ø‡Å¤Û¤õÿÃ(—úäW­ÆÓ‚å÷?m¬\3O /§/éŸ! ÇÐæ¡é:žh“‹jt˜„ ¾¿§' P®–!Úÿt‹‹×ÿ´!0vÃgCI¼œ¾L¤ÿ … qdl+ Ô&«°˜ c'Ö« \'B5°!ïém úŸ6Æ^3ÚP /§¯:Ò??B@!ŽwÍCÓu<Ñ&“hÈ$š±ëÙ‡ £  `]ÃFÞåMÀXÑviðä Ÿ”-+ì­ãaìèeXÞ5‹íx¢I.VÑ!6ø^¡BÚõ — ÝÊ»òžî4õèØÿ˜¶â³™B½†Ô´ÿ ˜ÄUð®4Î~ýmfvÙO¾(' `ºq?fã]á|óxºƒ …†ã7–{'B½Nâý|Œ¡P–wÍCãD€jäâ“6n“Ö« \ê“o\µO ”÷m¤!°rÍh< ¼z}éiÿ ±¼kÛñD›\<¢Ã$lð=?=i€rµœ™Ð†¼§;\Æþ# ±>JáÕëËLûÏP¨Ë»æ¡q’@mrñ‹IÐ0vb½ú°ÊUq"T2UˆKlŒ½f´¡^½¾êiÿ ±¼kÛñD›LLâ9^“0¾/(& £ &d¶a+ï’fȸ‚ÝO¤'gø¤Œh©XocG(Ãñ®y\ºŽ'šdb‘°Á÷ Ò®¹d(èfÞ%„dˆK×ñøI¦­øl&‰Švg‰;&q„¼+µ_D[Y…Gö“ïÊI˜nÜùxW0ß<Ÿ®`Ç“†`¨GÅŠJõð1F„BM8Þ5ª‘‰G8LÚ¸MZ¯>l€r©O¾qÕj`<-P~ÿ“†@‡­f4ž^*Ú%bì…8Þ5M×ñD›L<Âb6øžŸž4@¹ZN„LhCþÓìÒ c7|6”ÄKE»³DŒ¡P!ŽwÍCc%Údâ“ aìÄzõa”«âD¨6ä=]Áþ' ÃGeÄKE»³DŒ! Ç»æ¡é:žh“‹I(™„w„ÍzöaÃ(¨ÌBMá­ç]þñ;ÿá•ÝO<9Ã'eD«“ööü;?:@ŽwÍãÒu<Ñ$«è |¯P!ízK†‚næ]U€ qé:ö>¦­øl&‰ÓŠôÏI\!ïŠAcíÑßfVaÇ‘ýä;€rÒ¦÷c>ÞÌ7ϧ[Zh8~C`ɱG±"ätïÇoçD(Ô„ã]óÐX ¹x„ŤۤõêÃ(—úäW­ÆÓ‚å÷?m¬\3O /§/éŸ! Ç»æ¡é:žh“‹Gt˜„ ¾ç§' P®–!Úÿt‹‹×ÿ´!0vÃgCI¼œ¾L¤ÿ … q¼k+ Ô&°˜ c'Ö« \'B5°!ïé.u²!0öšÑ†Rx9}Õ‘þù q¼k%bÚäböÐuÐàû‚bÒ0 ª³ˆœ;[Ï»šx9Õ€º‘†°’Fð÷lh5:Ò[ÇÃØÑÊp¼k—¡>K I.VáJ‰ø ¾W¨v=È%CA7ó®&@H†¸t{Ÿ@É 6›I"ÔèXw–ˆ±cWAÈ»bÐÀ,lÆc¹„XEP@NÀtã~ÌÇ»‚ùæùô”šˆ4Ä«cðM8!BNôð1F„BM8Þ5ÍPr…Ï\|Ú  Ný7“(—úäW­ÆÓ‚å÷?m…0øŒ'…W£cÝY"ÆŽPˆã]óÐ EVØl(  òˆà€¿ž4@¹ZN„LhCþÓP@"Òj^°ÙP¯FǺ³DŒ¡P!ŽwÍC3ÔSá³!SL‚†±ëÕ‡ P®Š¡Ø÷ôÔŠˆ4€ò|6”«ѱî,cG(Äñ®yh†Ò)|k™O*È$@] Ø0 *G؆­¼k|ñP,ÊEDÂÊÁß³¡eêHocG(Ãñ®y\š*¦I.VÑTUÄëj€v=È%CA7ó. $C\ºŽ½O ®›Í$2u¬;KÄØ1‰« ä]1hš*¡¿Í¬¢©VêjÀ0ݸóñ®`¾y>Ý€Z‘†x] ¾ 'DÈÔ‰~>ƈP¨ Ç»æ¡iª˜¹xDSAêjÀ(—úäW­ÆÓ‚å÷?mu-øŒ'…—©cÝY"ÆŽPˆã]óÐ4UL›\<¢© u5`”«åDÈ„6ä?Ý€Z‘Pׂ͆’x™:Ö%bü… q¼kš¦Ši“‹G4ä ®l€rUœÕÀ†¼§P+"ÒêZðÙP /SǺ³DŒ! Ç»æ¡iª˜6¹˜„•" ¨«FAAåÛ°‘wi¯«¡(i+[Ï…–•öÖñ0vt€2,ïšÇÅv<Ñ$«0°j„ßIà܃º½\2t+ï È{ºÓÔ£cÿ¨kÁf3)„z ©iÿ0‰« à]1hœý"úÛÌ*ÌP5"0‹Î¹×ÕèªX0©Æwu5-4¿!^ׂo êuï'àcŒ…š°¼k'T#0°N„߉õêãu5z¹Ô'߸j50ž (¯ÿH¨kÁg< ¼z}éiÿ ±¼kÛñD›\<ÂÀ:Ét^}¼®F/Wˉ mÈ{ºÃeì?ÒêZ°ÙP ¯^_fÚ„B…XÞ5“j“‹GX'ÂïÄzõñº½\'B5°!S…¸ÔÉPׂφxõúª§ýg@(Äò®yhlÇm21 - d ®l•#lÃVÞ¥ áR÷x÷x»cB*+L~÷Coc‡hÁ®µ¸S(¹°ø„ ¾s¨v=È%CA7Ó/yW °gÇ‘†žm6$4¡†”ß1?qìCÞ50 5nånpÙO¾;(' `òq?æcaj _-bFA;`GÛ§ŸšP'Þ1'4¡ ýZ 01m2‘ ‡P7MëêÇ‹môr©O¾ÁÖêÞ†ÚøðòûÇÛ{v´Ý†R@…úÒ~ÇüÐM8¶abJeâ¡°Á÷ õ¤ÊÕrâeœ)ù pñúÇÛ{’´Ù”’@…ú2~Ç  5áÈØZh„‰)•‰j8„‚†±ëøÇKoôrUœxÕ½)™*ŠK½¨½çJÛM)T¨¯Ú ÇÉÖB#LL©\Ô#8fí·ËÞ¡W ¤ƒÎÈGµ¨UÈ.$„ÁÛcê>äF+¸ÐRz½çƪףmkQ‚åV¬²¹¸IX.Äk—ÀßW}á PìQ ì­’@ ð†[mèIÔf{Z‚P¨/å÷Ÿ! —ËÍ…`ÙnX–¦€zÎr:ÞªAI*N„*^p7q² 0«íU!p{3Þ>¼œzÁ[ ¬ÑÂ`J>M‰ѰXJDbbàyÖ°ÚøÐó¥ÁÛ{ºµÝ°àjOûýçÆ«×’c}k‚e\¶ÛWÀ]â6œUuÔ”ÅÅ@þ* 7/hï9ØfûZ‚W¨=ã÷Ÿ/§%G×K¼0Ø—‰ÍÚ€èÈž5(PZoßÌ­}™* O½¨½'fÛík^¡öj¿ÿÜxõZrüp-P°ü Ãúè3›xe]éž2T ô„ÎòGµ6ÈÓèñá¾0x»ch݇ÜhùR vD13V½†?\‹, c•ÍÅ~²&^»ä¡ê Tbbà‡ê{ŠièùÙf{Z‚P¨/å÷Ÿ! —Î…ŠÙnX–쀺Îr:ÚªVI*N„*^’‰±­ ð³íU¡PCÞ>¼œz?\ ¬%Ã`J>¯‰û°X¾JYbbà‡Ö°ÚøÐó¥ÁÛ{~¶Ý°àjOûýçÆ«×’ã‡k‚åf¶ÛWÀkâ…@œUu|”¹ÅÅÀ  àñ¤ÁÛ{~¶Ù¾–àjÏøýgÇËiÉñõ@ÁR4 öeb³6à;º§ (Š·oæ‡Ö¾L…§^ÔÞó³íöµ¯P{µßn¼z-9~¸(X¦&f_F ÑÔº¹ßÄãßùïý¶äó ÝŸàïU¥uûóFÞ*!Z]ß„4÷[ÕÜþûß½ü2öÓýáyºÈðps—ùÞIÎ ŠPµˆ=ü—5Á%±-¿~ýçǧÿ½ÉÛ?=þïo·?ýë£ñ/ð~ùíãßÍMÔ·ßþú¬ëÐþç·úñ—JÜ›‡è¿ýåöy~þ?·ßþöQ}*Ù Yuò¹od÷MûÙš{~ÓÚo†qÇþ©°ÿô1 tÝ6ÁCt÷þÔª©0î› ýMƒöS£Â~åì'ñ4ô}¤AŸ†CŒö#[T\ ý O“V6!ú•ל˜xuÍ >úê %ã À×H<I¡c2´úü1‡³Àþc—>aç¨zð§M_½”á£*%MÁË_PÛŽþí±¼m[™„¾c‹SSu‹S+tøR泓.д@¿‘è7 ýÆ`ßT-öÆeûŽ~ó3ú4þýF¡ÜQ î_Ð~Ð7½ÿ´^¶ •M⸡šS¨ú+ú ®9ôÊûÜQ*Qô7}7]ÄE¥Æû¹C¿AG nU¸l¼v€££ªõŸ øÓpDqÙPD™ÑAg1|lã6ŠÙ¬Ÿ‘p ¡È¦ðñC˜-%Š[bÅíõ¬™¥žC´Ìú®Ôì{_ß\ß\ß\ßœû›#{è Ù>.D})ÞUÇM¡¾Å_I¬»¸gv`-$|jŠÅ)èGTòýÆ&â^ŸÄ¹ŽÁÊ%å7x´ÇÍ´¾Fl°¾K@±Âuë‘y¶âeÙ†YlVdµe<pÙ1Ò@s‡ŸQÌ_óœ–Äi#Í(׊zû7°ÐþËÈ#Û-þ%Švb_·<¶K˜#‹ÅiKZnÞN[Ì1à’Úªë·ÓÖ}I ·Õoæ”~~Â_½3 pƒ ÝõÞÔ*|*çóˆû]Ïê$1j߯—~µñ¼?K¬¨§Ìí(6o»‰¹Ü0o¼Ïº¹ÿ8+¶n¾ÍZpä7=ˆW¡·ìÔ‘ðEIà‹÷Ú¹u{)cÃ!$õ«×ô¹§Çÿú°ƒ[j×°ÁaXe/:‚Ÿ× œk ßÂûÁeÛëÄCâ7“C@“  ËOµð(W ~ Ä—Ø,–#Sö½„êe¿Qèkà§h(ÇOPP´:ÞàDáJ€‚®ÃDá&)£ŸÒÏÜd“sjWÌíú›3ŸºwÊi@›XCx§rü êd¼—:¢†šÏd&¦ôÕ7 %üi‰Q㇃2Ä­ 988ø”ƒËø¨¦X$á„,e‰H,<‹‰‰Sk—qù9âÄćÏuv6×ÙYt9Ê¿8š{G|€’X>á”"øROà‘νã¸MÊn|[/’K÷Þ7ÙúšaNà£k²ÈõG‘˜”[ˆŸX>ü„Ð9M·ýÙîc6ñÔ¹šò;\XÜ’ ,nMÀ<¡tɆkXk¬±‹©±w6Û™lW‡ïYýT)í·üýã×â…‹:ÀH"Ì» §šRUä 4‚ÏΈŸ ~ª>#‡â ‘¨þÒøx Ì ø,ˆ{.¨ªp¿´Dâoº<ÔH*¹Dq>J•ðYídRk8>Ã×®ZGåùš(¶Õ SN¿)ßÔÕâx0«E‰e&L· àñ Á‘ë„bbPø¬¡K|œz䏯G]Z¶¨>ïF…–‚îݺ´/!û¯–¬­„‚Ф];ÞW ŒK®ð_IÄì(ÔfÝ걺ÆÁ¡ØÁyM›Ý‘ª´ëZ)›Ï¼é”ˆ¿à¿ÁûYQ8ó”%j5›•H"ª 46J?¥Fß?KŠ? Ïìú)÷°lê 5»#›æ ¬‚²GÙ…Xáo$f[Þ–3Õ¦ÄiÛí¼QŠ?{ÀÈÜ›s ®•%VÅ}ö7^:|¹ï˜yŸ“b’b‹”¸'!—èg™^`Ã7žÊît-ú![¿å¹1ÉО=-E,>…ðP¼AÊ)ÐÖ.U3Pêóö;%¡š‹ïÿKÆU¬­ ——0WJŽáÞC¾ÛÑзîÞù™©Æs‹‘H{H_ÖmY,î`P Õèàü‚Â,±ß¸ÈGÆ—–ºoã ð™AèO ϬâQ™Ý ðß±wèÑlçµÄ¦˜ì­jÞ Ò˜'ÞàŽ¾5ÛÐÇÞ ð º°%CýD Œ/3®£Ûñp5ÞTר¸éwñ žÅ†K35ÕMûF…b¾c¬í¤g³—S¨ û$ùMP 9ÿ®§ªÀ°8êšãŒƒulÔ}M¢Ux‚ zxÔÕhŒüÆñ³œöâœïÝNòH°à*7–½»äaI SQJqdŸWzGj|·ÒÁ˜ÄÉ2–ó7ËÏ£ÞFÊÔè<:O™›œHõEa€5+ïrsJHO|ì×½x~¦œÏ¥Äxjà±nêÛ¤'TKäP ¯8ÿˆOv„Œ‚5» ¨Hk*•ª§ðêD¥ÔØHœK"·£¸…Ý­˜Ôù¿:‚§šyû½b 'ºÇŽ1Tõü»^1†•1=Ô³&9Ž;/ˆ…–}ÞúŠ>lŽ>ŒX²Vj;x\bxë+.Q>ë‹2c²a¦GË…J븡’œaWæÇs;„aÊ>KK‰K”ª=ÅšÏGq;8;ªqwÅЮÚÂŽ¯Ú¶)«ϸŽ>PèOœ:•@a(¥°ÆŸ/‹OV= ÕÖ•œ÷ >‚?Uå·$1\a0¸à¯q¼ñz„p¢7¡e+ñÖc-˜£¬j‰ÞXÃ/z™Yzð↷ƷBX*W£š,åÏØoðo8…^•“ÖµO%½œù3w—ˆzÀ¹ _á xäM;¯"Û‹Â@øþ>‡¾ý%¯X‰` Rƒý^TjõÐS©Î8ÓKÑ!¸Õã¿oÈ­ÚÞ ßŠ[ º>Îà»àì 0ƒ]Â8Ç!yv‡a`õÃbwFVŸõ¤žÞÀ«1aÂVû)&åó0üC#\ŒtWBîå7¬ùSC3˜¬’È}[‘Ž·b‡ÿT¡Y÷,aÏ„º"og¹Ð$²œ#-¨@ð`‡“I/‘×úûÿ Îfñß(…­V‰op îØ7x?¢Ñr1ø+ªõ$B´è7bîi% k˜¯(>Ôt`ãkAöݰ>HTI9/ø$*$'¯w yžÀ‰Ž8ø$Âmã'¸Ð¯È“?ˆïY J2Ü£$ï°«?ËÈy°G‰3ÎJW”„árQ’º>ÜË—Zô(Õ WÇã;#å¸ö ÍW£¼8áÄË.૪hP]e§¯×;àÈ{o®W5aŸïÁõšÃp*Áõ†ÁÇ{&ÏÊŸi4ЊÁŽ/ZqNZqh×ô%œÿ¬IЪãð ÊÓ•$sU(Ê^Ø„/ñ4Ûÿ8ïòj=‰ÙŸñâ0”<çR<ŠRÈ™0Œ ¯%\‚fžkÞš^¾%G)ÓÃMHè 9“ÉPW¨é•ŠîÔw±[Òj…¯+ÅöƒÇ—•îÆù5á ürz(ß`GC9-E¡zG¬·èøË]æ:¾^íiêñÊÕ´z/{˜bŠ,à‘ÒQ®è[±¬N2k(ëìŠü-‚¾HÞ:+ñÝm©.lÜUí©sêOÙ¹û8F# èž îþà»B”RØw;®c{?GIß,áè ¹½…ŽžÜ°?ëæL­«-Š<éæÌ’ùjÿê‡ð𤮭žCnõ’Ð~ü’oJXiHÇ U²xîy+ßÜáÊ~‚Mæ|*¾æ«V½äŽgLƯ®‡a©%o~èik3T«àØMlRòFNÞ`[bÐf‚£LÏ•Ä79p×ϯ$e^ªb|y_^Æ›MóòYùrk¶(ò¬|yûeé²[ÇûÁ'=\¸+»á²Ãä~¹?$¹O8<¸”»2—× X‘žRà[s†Lº Œp‘ÙôiÙHêmæÂ3×¶[i2ou&ê¼Lþéç±*èãß$°¼—cQ.“J>%’÷ò·3MФU¬ÈmÐë¥L„H>òÄp‚$J)'Œÿ†`i;,ÌíD3¸àøº…“ žQËnko¢‹ÐØsÍP¬Þ-vac ÞLXc߸V}J8‘?~ƒ÷c°ßŒ ð7nfŠ|£PÙðßàˆ>ÉEu¦í¿ÏQ9¬TF…Öó•À±¿º7¬R'úÁß}þ¦‰oìxn>BabT¨Ôß°op pD ä6[Ð4C­4ÒHJ÷§¸¼{ ¼ýPX:îvâî A¶ÄM‘§¯Ð¨ιÛ¼!’âjaݤðaR.·%íJn %Q±} £syÙxŸm(”yÇÁ•hÁ8Ý2Â_‰¥Þåum _³NC{*ð: ”E–½X‘ÜR*G‡w†áØ~à9tRhæÔµöÎF#œŸ]q©oBØË3 ƒKÍC4¦ËdJø º©ÁÒÇ3=ânîEœ’ íV¡ƒt#Ï$Š"KòLxCå”+¬Ùçû/ÿ/BÿK]¼x€aÊq9‘o¿¥®\ÞÚ%$ƒ?ä5ZÆåû«$ïž ©å––æ”›,V® äYQŽ ížns”2òKÆr±ü»R‘ý_­¾¿£P˜ÀˆÒG³9K¾Õ‘>àö†Û(®ŸŠÓ/͕Ӝ"Œ,…kŽ0»ðÎ׸ ×.uÃùMB¶R ˆf8T*ñç}\¾Ü ”mÐåœt~kˆ²o¶¢Tw©8ö¹R•K•u,]©åf”ÉCà[0oÁ¾B0hEÈ2ë Ö£Ýòg(Sªbð.ž¤ nÞÑÀ½NÄqW„Ú)›Zx½D¼cÖZ\e¶\ßq»«˜K(qª£4´‡-ÓV`Ñ"åD®È)Á=SÂ$OZf(U¬öÏUBë6'Ê1á¿!ÔeJ,t赤œR^¿£ïÅÇ=yÚßxµ *½ó.ÔƉ(«ëqÍf~+¼ƒ C r{áB5ÆoÙc3¼“!TŒ.3¬¶tQ³H|—õlM1ªù¢ÅNqRlòø·[þr³Þh}­Þe¥T­†“c¡ÑNº¼zù„¹”<ËÙž5E÷r¦Í= ³í\…JÖ~ÞB劎†© ¥¸/e)ÞýŽ•ÂÎ{ÕWs÷¾Aœ”Ró‰~Ú&IwÕÄEÚ߯#Áµ|a-ƒ_Ö:¹âðª.Ö^UÚp,ÖÄÿWð%T(#¹”kšXnÖ~‘÷,Êf .à” oº;ëúó~ÙÅŠí™¶íçÄ«ÈÕ’Dˆãmæ9aˆ)eÀž²zD±äº#AðN¨+œ¨CŸ.Ïë¸&¦¡BÊô¿Käθ¾q쿚‰Ÿs÷7³*I °nË‘î§!ÔìÉœ­^¨o‘JRsuôO<¾ì ¿tÿ o¼WmÔåYÅCã`Q,VPðT±Í݃礂 +N‹ìž+K™®2×O:¢!® ”$#$&œ=ê$ïcëUlUpIÇ¥’#-7ÅOÉ Ù¾K“¨/@H1zCtùS®ú!ME –„Ÿ%|Jg'm–P¶AË.g Ÿ2Gj÷ļ’;‘c™/;ï,Xîç%¬žøT*;OÞkÑσ…²ó^ä”ùÂü¬Qý½“zVÍ‚û/ª¼÷P&ª•EbÝÅßtâoêó]WÓ $ÔrÎFÚÑe,å–5_O÷HGLèáÈÌu9)1”yn¾ûtÒìök›i×FkëozssYʵŸ…®]¡Œ%R6)á =i4³œù£äåï\ an3—Í L¶…÷’\Þ„àå‘42÷œÿºéOö9ÑÔ~Ë.¹§ `V.Ž1}èéÈážÂV„½Æ+PsjòMÐ¥5¼k Þ© Eê Õ¨*™B¼•f dŽŸ‘¬˜°üϪ%kĦ‹âE9r ˜}ŽÔ¦RÙ5»EãŠÝÿj'Þ³½ÊìPbÊÌ&Ã;*YR¼Ÿ…ÊŸñhyÖ£œR‚ÕwÅFó…Ç?$ÄêÊR¥T†$õ‘–>‰mR~,%亷à'…ç× Q½3ápºP¢±üÅE¢®Õ°$)ÎH¹3ëª)ÇãSŸ“qœÑÛÞ–ûT¬äÚ)/Oy•¸ók.ö9“JE_ëF)&u­’Wäéüká«ÛwÙ ¼Öϼ¤ò¹p‚”…Z½H:;Ç]‰¤½©£¢}ÎfËFÀÙkf6/8~üÄ¢ƒ¢®2ÕÚoyf9æÑC§®+=unõ<ÖúÞá:^{W~C> Ÿ…H_Yߋܔ+ë›g(ž(ë ʪ»¯1¥¥“¾•¬áø%TîaV¯él¨ps?î582©¾>·ì5ÓÏrñœY¡µ#•Äò98ÏC&ÿ÷xgrüÒJ?+Þ˜[¤ÌM¼‰”“÷ô“ðgÛ‹a=¹ðò§y¦37ÅæußXî[¥¸mP6)Û«/©Éš’ÙTί8oG“&ªæÊš;b½–UŸw./E?/± Ÿõ¢@¦âp økQÈ÷ûájÄ_€7Ãr÷´½õ‚s®Úvthÿš5SÿÊê:æ®4‹«Ï›úv7½Zç&¯qy. éªÑBIf™ƒœ”$kFg¼ýrIX’Â,ɬ˾DW žàPÊ\Psv'Ìõ‰´ÊìUªýñ¸êu Šié-–|¤õTw\PyBX~›É‚£ÊŒa÷éîÞó$fÈScoçâù£s¿ç÷Zþ=cÅC—”Œ2ÊyVÇ€²O+áÛo/t·B*¬û)³¯žqø+1ÿ™ ×SÆ#å\ü5ñJ)TiLH.SÍã±HΛË.÷¬] ˆtÀ„@g¶×Cóù”„ïv¦#†‰,P,ínpoóZ|­«—µøºÑq‹ÏÚg;ç/+]ûn+¦wÂÒÊ{ßO)fHÚ©Â×V W<„92DIL¦z±R„—SI›:¦;}G©[5DyŸ8q—ÉífrÌ d+VåÝBÇ‹èfÇ­@v¸0ùå7ì^-kç0VúÆû¨¬0ByŠœQ|wÞì¹Ãl÷TÁ¶¸3ïMI"qºå»” ]æ[*®;–@fÉ¡ÈìֲΙ'¨œq)l&Îê5s/²ÁÌÉk”×”#ÿû‡axL°€Èâq¦Öp¤~Ç óø¥uÆž"v6C¡±»ô[rVëcm<¤bxË·(g I3 ÝíZRt*TÐÈVC•¿kø)°u‚?<É¿£¢JdÅð^„³Ü¾p#‘ÐVÈyßß©¾îwÅ}ƒAO]mÀô]ª?çÜtR(â:Á»ç¸óW‚hoÂÄ£¨ÖÐÚ*ìRÜ?-/ðÖ¥ûƽ@õ)'dâ'ÂoZô7û2ØoœV#ß(T6ü7¸•@Êa=7*4‰ïh?_QÙ**µ›‘#¿I J@GX©›O…Lç뤮0Üïƒ"êô“ñT²/GSꊞœ%©˜/eÇPôZ­zÄnÔUŸw8¶ðp“Í.²ÿŠqæö™XÙ^¤”Úñj{ðä0ãÈîQ-V¾®ÔmðHÇÇpWŽ]§ûª9O(¸€Û¸h« )ËŒ°â!”mºÉãWH%°±#—y[`¡{{'8¸Õ¬ôÌVÉž÷N  ÐÉü|ÔþiAi´oMë7쳊–<ÜJÑ–òθÀqèLßÑGÓͺ”1ói‰²¯¥*·Û!ˆ3kNyñw 't Ç:#ß8ýÇ~£P¸¿ ¿É~^OÜ[èî®ã( E|EQ£¿AU”P.A~‰ ]R^!¾ÊMëRõ‡Uef§“×¢Á½B.`‹b¥ö<”;o¡‘„+güá\ŸáÁõ„»Ì„˜ó–kdñŠ‹1.ªÙNG mææp3\Ø.’õ—ð\Šõ¿Á—vÜcK< —ýF4„~¾¡ßd¿BA¸kWF-æ9:ÃÑbÿKήÙë³%4OˆLH­pP‰kŽdí~Œ†rËs¢øŽÁ\¥˜’®™á3C.Eh(õ©¿N}ý­»Z¿aPêS`SeO^ç Óh—Ü=¾¥Q¸#õ3úÜ•C#q'ß OK8“è7‰ðÞêþÁJg‰åFšéFXÊM­¬ù¤ýz±Ñ¼Ã²¹×‹‡¥ óÇ ç*}ÚOèoÐÈw~oð`.„H©³µbsŠr‘!eÉਠpä{ §1nÊL1Ù.@¡S ûï½fÎ×âMH)¾€C/j°cæËRw-®VA7’tV‹b”£)xV3eUÙ=«¹Téü5‘J‘#ÞÊE“hºÊ= úˆ¨BÃûdÙÅã­Vh-gÙÙ<`U÷SN°G´ÃCft+WsÞ›Lx³Õ³TÊí^4mÉ(ߦ½æUQ´±ò¢•â)ktƒøÓ†wÎÓlŒë̵p¾ ãÎÿ{ÞBæ ÂñKʸYSÌ¡P%Â̵ÌI‰žo·þ• ÃfN•-œƒº§sǓۿäže„“!(E²ý©ØÃV¸FЏ%vÙËãvjTÛ06bk³F½&·aõ¯Véy°š@Òð¸ûX¡ÒåXÕ±”¢ú½"-K¦Í|'äóèYIç¢Ë§ÌêSîï2í¸“¸¿_S,c冨Â÷€ñßô~Œ‚»Ãø7 XJ]ñ?ê¦×1¹ÓÑ·`!=£¨—û=\uùÉ~vôÛöòã^À¤\ÞÚ¹½µÌ%©`Ø¥pD d b¶-dx¬)ô‰¼äÝgGNG·@<°Ñ¡)­ËñâÈwKÌF„¦‰ŒroËŠFÞÅD”âúSÎîî“_ª¤16B%ú`û0X^nÊc»1ék$œtÊN¨Ë7JA¦WøÎéÁ³±â»ð€Ì+)N(uŒñoV„x$¥´2¥4^çQ8æ…wæ vŒBLpðOÊ8&ìâ:eÈ:Ã6`ŠÝßÁ<àÁü×¹©êËÊkêòr,£–¹@>à\-azs‡ãæKa>¡ïïKa>zðö(…ù!4¾&æ ”W²¿dâÕ ”k4ýÿæ¬ÊG-+P^éM·“\Ê_¥ 1Å•~ÉåyÃ.²Ö`Ü]Ηð«ŒZ¤l7&F0î=í˜ ¡UÞúUS!x)ú#:dŒ¨ØA¢ÝC­¼…íŽÂú¯`Ø?–K! d–ÀÔÎ…krnûk ×Ó—‰Ž™zHWtl‘ýoŽ=¡"_Ý]tLÜ›ÊoÙ#<ÖɰÝe.Vöt÷ëEÃK$råÞ–L=û/¬‰4NŠ­ã¶A ‘v^{C`jmC„^]Љk&Væ5ÔyëÓïî$_%\™&‘óÇe+ÁØ”hŽö†`ãº@(š×M Òâà—_ÝÑD;ü›÷ÁM¡ ŠÜ4¾³˜#¼žq™«jÆRîBºŒ/óÆ Ë†æ2Wr™Ù×TüO®xtð G§ð´‰Ë–3XÁS,åüÊÜxùÌ ž£bËy6ïÖ!Ë>g™†¼Ñ¬ )a!D¦¦é6¥òŠ—_ÃD1¹Ý ,ˆb±«vÞ¾^%„Äz»j±»_OG £ás'¥^*ÛŠ5arÿ–Â3ñ*´{o¤0ïží•5µÃ¶»ªk0ã‘?Ênß«íõœó”‹[LÙ¸ÅÝ&B2Ü4Vð¼I-‡S.(OpÇãÒx*²É=/¸ã«;„QkPl36¢ò&F1ûD¯àÒ³¡Ë—£Ìñ,—Š3glR>Þ|'ŠÝQ²´p—%ÓŸÚ)>¸ ¾—¿û*t1¯Lªw„c^¤2lÎDÑ‚•/! ¯/ÉZNq *ázyÒzÍêcÍV§ ?õ …wƒøœK`f÷†°?åJŠûg݈`½9bºÒÏãÜ÷øsûý1É%çÀ_æþÁ‚I²Æ)ïú Jñn#%¨­X›È»Zå§ìÀ÷¿±C«ž~ㆣüt;ŠÞÌ*P5ÃúQsK\L¶ïîM±\:<ô¦á ÃC1õôià3>è"¯!ð§¡¿qÓ˜Xõê^}4ªÁ=??$î%ÿ]\+‚ à8 &àW½L·H,ù§ “C5â¦Nïñxô—5¹Ä{áý´ÛÞÜÕ§›,¶jÞM nÚœ›2o¿|üYƒ endstream endobj 4944 0 obj 12608 endobj 4948 0 obj << /Type /Annot /Subtype /Link /Rect [215.250000 215.750000 285 222.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_directors_typemaps >> endobj 4949 0 obj << /Type /Annot /Subtype /Link /Rect [455.250000 174.500000 504 181.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_module_directive >> endobj 4950 0 obj << /Type /Annot /Subtype /Link /Rect [507.750000 91.2500000 547.500000 98 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nspace >> endobj 4951 0 obj << /Type /Annot /Subtype /Link /Rect [185.250000 62.7500000 225 69.5000000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nspace >> endobj 4947 0 obj << /Type /Page /Parent 2 0 R /Contents 4952 0 R /Resources 4954 0 R /Annots 4955 0 R /MediaBox [0 0 595 842] >> endobj 4954 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F1700 1700 0 R /F1499 1499 0 R >> /XObject << >> >> endobj 4955 0 obj [ 4948 0 R 4949 0 R 4950 0 R 4951 0 R ] endobj 4952 0 obj << /Length 4953 0 R /Filter /FlateDecode >> stream xœí]ËŽä¶Ý×WÔ:€{ć^@À3=E€Á …‘E`Ç ÛÈÄ‹ü~ê!UWSu(ñÔ%Eu1ƒd&­E^^Þ÷=|÷çÏÿØÿë÷ý»Ÿÿ³ÿaøûÃç]õÔÖÕù?ûãŸo® »§áßû¶«÷?üºûºÿºû´ûtøß¯»ó Ÿ?üõð¯ÿíõþ/‡ÿþ¼ÿþï‡þ8üÒñ~ݵª=üýËéï¾U‡U—¿?ÿ÷îoØÿvqüÜ0™×ÿÿ]7ÆÚã4f>ýu7.SþüþÃo»wg„}¥Vºéº½²ÆîUoõþ¿ÿÜýtøÀ8|õÔ[¥ÚƶÕ=jõåKº?ŒTO?tú#4|„Á;ÓÇü4sqª(Ó(ÿè’›Ûõj P…þ—áå7UoðóÌÅ©2n.]psR&âæ^ aðÃÑ7øiæ±6×3ºäæZ=ˆ6­»$º ƒþMÝÄü4sqªŒ›‹G—Üܶ”b_G Ðeôäï*oðÓÌ¥‰2n-\rg»ÖžÉS·1ˆ?Žƒø½©"²ÍqæÒDw.¹³ý¨±¢œÙ>¢>´UÛFd›ãÌcY8¸àÎZ«ªx;û2zŒ­«xá<óH;;üSÈ x&çŸý«çÅ÷_vï¾;•ƒúoö_~:ÌíôÍó__$©÷ß,ûV«ý—÷¬*óÝŸö_~ÞõO®Ç)žŸT=ÑßÂw z¢øÎ3|ò1ü;>Ñ=M…Ïf*øÄÂïÀ'üŽêÂwG·áï`Þ1ïgFûøåpT¢s¹_Eù¹Õñ¥çd| žÀ¹áw¾v8Í>ÖýûH=gXaYOÞ{¸'5ü–ŠKøŽÅügÀpärÏ™ÆÒ ŸM|šà.`y‰e^)–ËXBy¾ƒŸ@>(gÁ;k8šÂzÛ˜ÖP£j|²ð¬áh V‡s<žC· ¿ó8’‚8§Zå–±#ð87ìx¤ Þ̽„/ÁÈQÆŽ^ßšÃ|€í<Ó'´æÚ.±5‡iåÙ-ìý{⑃Xraþ‡£yæ†ý|ìť䊾½c‡Ísº™vǧç¯bʉÍMæàÚž&ÓŽœê|ìí“5甦èГao=±p´3StO]_Öí™[Oˆï &qçZŽA,TežÌaß\[ïÖ;ø;pƒ # \ú`uK> ';˜íaÆût6 ÍSm›®}5ZK|“ ¯”à.Ìùêàõw[ð1¹ðÒñ‡ñÏO”?´dÌÑÆÛòÞ% ^ œÒ Ø¥øaùñlÙz÷[SáïÀ]·&ü˜Ö[ãYvÆ­ ƒO†¹ÅÔ|]ç¨>æܱ¶[;‚µÉ·‹Õ˜‡£ñæ'GV.{ÄA„ÂjÙ~Lg0öÚ¾>jñCi0QC×Áâ¹aG„+{Œxìˆc·‡wˆ„4jL¸?†ÈX¼?„ ™,pŠSK˜¯ñw˜Ät¯p’x’{­·fv>%º}lôûX’¡¾wJ2´*ÉÐræf]’¡%šRR”dhI†’Ö\îÉоSóT,ÉД{bŽßåé›0iJàNàýß4«38MýéTSõ£“,¼Ä¡]˜ r;“Ô‘5Ë&‰°‘@{@ºi.ò.q®Úð·™\ëÞår…&4lÎ îÅ7ž nÆ  O’ˆ e›×LßYÛf¸;’P©h"0N»§#‡06Kð¾ïÙ'™}jê{ ½¼Ïe;{Ç>–à½ï¼¯J𾜅¹Y—à} Þ§”%x_‚÷¤5—yðÞèêž’šÇ Þcÿ[3~’tïõ=e8)“ÚÞ“bÊ=I ›4ígòF]üq(Û-Ö£ðtiÆSÁv(Þ!¬•±Õ„£'ð|Wp4†nžõ`;ëDLQ¼sø ¦–¥ØâƳ&(Êè­±m¤¥N :~frþô› Ÿ4ã'ÍHš¶©O4x9¾¢½‘8gÏ£ÝÊ©áü˜Û¨åÉ‚1­©ÝlÓ:íäÃ}B˜ Dú2dpË1YCäg©~Þ€Ô4¦æ˜åùmª3Šér…£Ùça›V½-Ãó‹'ûVš·ø/F#^L ÕwŽŠbT‡‡Å1?¹‚”—” MÔ+é©…BžÂLbF0Ôaž‹ Ž%¨!1FÓã‰põn@¾yÑn‚ETM½qU%¹#Ÿ-\ÚÉœGÁò?!Õä!q~&¢|([´OÚ•Ë+G§Tb„U"Ê22cE cÅEbñİD 8¢& öÀ'š6X®Õ”W‚ é¹@_mcR;âšÖ]¡Q¹5bœ h+2XLžÂJ~uO$Ùù–…s#ÜMf·=ûC„DñÜòùò«;ÿXéÈaF±M´p\?*çÈH±UâØ*µZm•«Ö˜Èw¢®=9zxjꮾM’°b\ÎÝÖj´uW@œYÙÖã!2È#Ñ ħËqé1Ž(<"0›xÅžuq¢Õ"Õ Vç£tÇ…½rE!®÷Ü'†ÑÑq½ct!Ù7f±L û&" %È-„.›È!öx39ój)†Z¿jøAÓÖÎoÕ㈔SUãnS) ^‡‰êj Ùh£Ì™Àg*ü££=0Ë{è$*.ZÍ“Abjb1ˆ§”âÞØ (ñãÜ'íÁÏíåfn€¦p0ð.à=ųÆ+%:= «ÏÚÓ‡;eˆŽ"î¿"žÔñ}gŸ|¶$|²M#o/°¡EÞæÀcŒ¼e°&ó ¹eÌ˲6:ƒæéÁne²¬xÖ~¦…êÇpP™½¦6÷ÜÁž½¦nçoÛ¦ì$ÑÑ<ö2¦"æù”º¥¿YÖ#V×êëKéYëáÖh²¸ÆÐŽM)muêmÎûHYŽXkàYѺ¬éÆÈ QŒÉ}©2ˆ¾x<bÖw ïè!¼£Yë›±ƒ×Ö®fD!õX”© šîrgS"”4O¡#“û­]aêP˜~OÙ.ÉÀe n-CHõѤöŠé¶\«ZD¸v ƒm%,Íh/ð¯LjÀc¬´œ1_pr«öœ™õúJ°8 y; TÐjË&vi×ÌϧöÕ›3ì™+JŒÄ bñð0Ùð&`ó)ÀY^­oD4ð‡çF™¢—š‰Ü1,séG "®¥i‡›/^¤ìÖ.²µuW߇©;÷›ÌÖ3ñšåiPêîØM†ƒ2î\ŒsÕ^ÑÐ W¦]`iýŸ˜7‡uým¡‘Óm!sˆIp¡²w]ÈÆu™ä.e²JØ”žtÎDÈdjL #Õõ­{¤R´çDãXü—à /-x"[8åy‡àh™’h"DÆ õ]SIæžÐ(w@G®[PSC€¸ÆLú«Ö %ŒÖÛJ5¯ÏD£T0 F‚ßÉ.y‰‚‘0Ãoé0leîü, yË´‚‘w]úúR0¼´. `$DIe¬”%_ ‘/U’Ðê½?=oÕå²G…9WE`)‚«"ð;XgD(«sËï=¤¡†-Ð ¦BB$¼ª.wH¿ˆ‡Dqõ KæF^&Å)QA]Ï@šÈF²å‚RíaX„X¡á0HaO¬øe†ýÌ^ÜZ|gˆß:Ñ«Lm\2•Ô²×:{¾ÃðÙÆòDÖ¸;Âdã(ý"[‰‘¨'€)–ÂÝ)”¼Š!ýÂÎRªLbÒò\W.Ûc#ÊC[Ä¢þ/cþÈXEÍöûÞz›r£ôŸÆ¨ ‚P •ë­Ö‘zGjyEalŸŽnZ§Å:6´ašSΔ†0†Š§ó#¦Ýâ \­ÌÛÓ%ȘšËã!”§J4Ù®`lÉ2¥Bžh‡h8'•––À )Ÿjc«¬1žh»Ù›è1‹wµ3MO3>Ñb剀1‡¹‰Ga(±müxEø»” „‹òÈ*žeíÕD½ù1ŠÁþÃ(XábÛ3¦î â‚<•O}ƹzÃÚ‡‚¶a|ÂÕ=Ìäá# †Að)XKÙ×Ìa†7‹¯š¥ÿP¢¸\Á ·yN2í› ÿ“ÿªJYÔ—Çzj€pU ®µÆOpU-®$Äõ‚5 ®Çâªr¦> ×ÛâÑpE\§r5u<•w¸J ׂáCüž~‚)Š+Ì1²ž5Ak¦²ÓÍ2£á L\§Ì|S4>ÑPeù"ë’Õ÷éêr7·,R€z)•YWþ‰œD/&+ÉÎ0r1H̆@W1µU9fú€yæî SªÆ„è’ýZêºÖ/ê•~9ÿd‘bRŠ©ïÍ4´›„2äßlô•µpë7xú.–Ö™¡Õ”¡|ybKût|ÿˆóÓ\ÿà—Ýg-Lj;NÁ9+«#WPø7Ll [FØÊY3’¡ÍÕ÷ø[°gÕ•ÀÃØ³œCÀMÐÍôBtÞN}©>(ÝLìÓ”n¦»FöOD‹=‰iYN!îedP¾˜äH‘Ï&¬RQ÷>·[½ê3€îµÚ",Œ£ÈžÎû9„Œ˜õv葬›!†(Œ ±j\›Gãà÷0OÓwË™'¡{£„ŸÊصƄ+Uˆ©ƒUSZ@42&õðúËqXNã<->„ÌM&ø°ã\(¾m‡ÁÒÀë‰ïcÖ³#É|L£.P)ÅÇ,>fñ1³ð1)UH”¤{Êr„g"sÇœ– «ÑV÷»×¼bØvÊÕ%çý¾•›{ÑV8ü$„id±Gc$“Q“eèÈá"Û ¤®\R×L«Èê‘¿I¿Á½ °³… ëáº,EJ~ò;,ž‹È™KxiµDº+…í Eu0ל07ÉàƒÃØx‘ÕÍÃÅÝ7PV·J)”R¦sN™=o–²OÚÁ½ÈY—ºòÙœV|Zp=TÙ(]õ×?9–ÙD¢öñKŽL˰rrygÞð½Twh|¤E3¡zêâ¦ÓœýHÌ5v|8Y+ ÓÂÀ¨ã¦(ÜÂÃ4Ðàl,Ь•q¸%] ¹)ÐÌK´ÒšEö˜Iº‰2 “'C  Õ¬Lå{µ3,k0q¤ŸðLø܉ `'¢ç>²ø×Z·®I ´Zë|ÓãwâcÆ”3·È¯%meÁ[¨ÒY×^4[˜1®îúµl¢N»áï&Æ•Oø,ºÛÄ€û0ü>]èº ®«:WPBÿÓ`_*ƒ•"¡¬’]IÌz¶™&j||b¦àT‘ ŽuˆfE°ýdÕ”€+dSžIª»$6Yýóx`N7§_mžáYŒ~!ÜìúyÊår,#’£³9D@ =Š4UâævÈcתÖeÚ­Ùt—ü`7oÓ•jˆÂò;£Z—aJ¬2Xչ‚¸È8¢¸j¡qãr¨…¹DáŽÊ»‚ab¢ØÌ•»Usöªek/ˆ|¸[’¸HÚ£S¡€ñtrbƒ¯²†U C9¾MDæzò(¶Õ­•BZ{Öƒ;‡™Ê”Çá¼Ûø’x‚ÖŸÆDÑÞ”WÛÛFÏÊ[„Ä´Â5[˜ûp%¦/ü–·ž¼qšdið8\î‘Þð –8KTC®J•?z-žJïZ±ÊƲSEB ™•„Ô®]Tv é›õcHÈ™,Lm𑏇+¥®'e*ÚÈñ”RÕ¼¥ø°ª­ÃAÙ¨¨-ÚYõ[’ÞT’:ÿ‚‘ÈÉ™¶q_‰K¥HètË*ÌrÏu ø;üµ”‘QCíD«äoüÇ~Tj1ÃE¹292Χ•cðõ"²HkŒCC¦œ_ø­èÉß¶uÅú(iXâ{Žæ¤4c8ïÈýCú^H'sÿ0Õè›1ÂÉãÜ{Mù/“ÞŸ€Ë³±¶I)°~SpÈíz«;‘›ƒôÑmç*Ýå4"‡‹âÊü+ë–ÀÜ´'p¡Ú´#ÌéìõOV¹1k†¥„¹©Û±üÁ,/ð3Õº8çCŠöe“ÁÏÔý¥n¦ÀÏø™?“ f_àgÖNÙð3/ÒïfîÀÏ\Ñ0üÌË77`Ò¦—¶~†£Îê ßëÃÏä¨/׺Õƒ“‡W˜Mx˜ëT%Q£ÆôŽNŒ’þŒæ¼rü° Šj0»2ve90s{e=JUʵôJuï¶«{cÐôÄ1ȹ`•‚•H…Ä#"Ô1!ç*±â‡<5ï<–4{I³—4{^6t–ÁÏ’f˜f·ªs$vɲ/b½û³ìGÒŸ(o†${­íõÖȱ§ðš®Sì‡?û¯‡Á½ßþ4÷ &×݉2O•:&N÷úrYµ‚Ûp>ˆí Qp޲éñb¨«'gÛ¿™>1ÏÃ;CâöŠdžgô3g4ÞšÛwÃJÜ©Z—ŸoMV KŸ,pàg¬œ°|¼± …Gƒï R]-ýªše¸ã¿3gþJ£š`LÈCS¹]@ÌÁ‹]ò«–ƒ;2XÛWÃcxS> endobj 4962 0 obj << /Type /Annot /Subtype /Link /Rect [194.250000 58.2500000 234 65 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_interfaces >> endobj 4956 0 obj << /Type /Page /Parent 2 0 R /Contents 4963 0 R /Resources 4965 0 R /Annots 4966 0 R /MediaBox [0 0 595 842] >> endobj 4965 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F8 8 0 R /F9 9 0 R /F1409 1409 0 R >> /XObject << >> >> endobj 4966 0 obj [ 4961 0 R 4962 0 R ] endobj 4963 0 obj << /Length 4964 0 R /Filter /FlateDecode >> stream xœí]I$¹u¾×¯È³É `˜Þ è  Ñ ø ø`Œ,ÂŒà–úûάd.ÅÈüêq‰Hªew«¢"¸=¾ý}ïçÿö_»ÿùÇîçßþo÷«ýûã·—f?tÍé?»ãŸŸnÐŽ{ûïÝ0v»_ù±ûñòõåëáÿÿx9½ðíãÿúç®ÝýáðÝýé??ü³ý¥ã/üþ2¨áð÷o¯Oƒ:ü«¹ü}üùÿ¾üÇ¿ìþvüây8;™·ÿû§¶´zƃ¡¼œ—©^ÿüã׿½ü|Ú€°Q:ezÝì”Ñf§&Óîþþß/9 pþ|³ŸŒRCo†æ= íq¤¡ívª£³q^ÿÈ|]Åøø¨"~ü8séMQºWÞKžì¨uÄ“½|=ÆæãñãÇ™Ç:YøqÉ“ú&âÉ^¾aó»FõñNöuæ±N~\ædÃFéu;ì”êÛ:’ð2Þ~?Æ×M7EüúëÜå7¦†»_ÿò<¯ÖðÃóâ‡ï/?Àîû_3{ðô×÷ß_Ú~÷ÓQO0ãîûŸwÿÚ4êÓ¿í¾ÿõEfØ·Ýi~§'mž4Ãë“nßö§G×w~!Þ™à;zG™Ó;jßMzxóµp=-z§ùgðùô¤ßSs|vA>ŽbVzÚ·~¯Õë+7ï|€ã||}2ìõiÒ‹Æéàîàqš›Vðkxãé½Ô¸ôx ª³þü`nŸ¿îpœë§ÕèÞ?¸êv8ϳqi>Á;Õ|„´ÏS¿‡Æ5<«ž8EHax½6Rç{Wý½ó5ÍéxÇþ|N¬e¼ÞŒ—Ù~m¸ÙÓæÄ;ÍÞèÁ¹éáí|Þnåx>±ÙõÒçq—Š)ÎÀ*A¼··„¡xS ËñLÎÓgèQ„s ̨žqr0N˜w¹Žôb+#ÖòG”=d½œ}‡n¢&0÷+PSÅ$±ý‰­Ìü˜¢ê†G`ãÄX¬û&[ßb ‹Š•dD›È Ñ…0DÉ™& <`&ÎKEëF` ä°§Rvg¤ÇwlfD¤ýÖÖ]‰Ýdb"âu1O–°y*^E:ÑMy«VH’È_]zd·$I¥˜&ýv¦5•¢¦R€'NdÀAbŒ6pGñ“Ê=U#Ï“dAÐA­©ñžBM Ù\jH×\p=¦¶ß¥PTq ‚¨ÙÍùÆê€óðž%=ÕÍ‘±AfñÛó£%Ú!Ö(™j(æk˜ªfñÄ÷d.gƒÓÁÐ8²¨pÙP¢ú²æžh¢Sª;ÏXw²÷ŠúNla8o 觘!fp¤ä:³ŸVî÷+½Ï3p€˜áp¢ `%;æE ß*!®ƒ#—¢2ÞØTNrÙ‚:Žšæ¡GGJʦ©y.1S2ÀzÉjìÙuÑlYוW~¼~œÀõÖçË-›|ÈÄIË«†O–Zsâ…÷ì6÷Ú¿ƒ9Æ”¿ãèÐS~÷¢L¹ S‹@ÈcYCÉcÆgS°ˆ‰‰ª›™é´DUSÁ°-LL%•ã4‘‚+s”Œ§-ZÁU¹ j/“;N•ûÅP3"Já¡™)ÌäRJ¨ -™©›Ê•U# Ý:Ï[U"c€õ¸Ü«ÛJ•YãÉâ5V–Rlª¶m]ëµzÛÒKcÆœ-À…vm-—ÈìÚˆp¨P!PÖ±-ô©R«SmÿvÈœ]Ùñ;°Çô•Vf}œ[ôDÃqð;²]®=ýÀq_xÜ‘v¬^Agúø,[õæ<ä€îwJ ã:“-Näl7½U9š÷Þ6j2þªŠc—Ó:eœ…Œ’ŠÝ•Ùá×’q(¬Ûa>T .ÓšýQð**œÜàH¼d©“åòÀºˆd¿XŠåulؼ¨ (!¢Ú®ÃwPîfUª: ¨Ì|?"Ø)òŒMëÔÜÚÃ=JÆî2†Yˆ­& R'qr½‹,5U'€wó‡É®¥ñqHFPñRY`ÈѦHê§l;@Š•à¹¥Õ–bÄõƒ{q½’ Sc!‚¯nöÄóu[ÏÆÀ[JË_gY˜»Å¦ƒ2D,Pè+³Ò®Uä ¿ÁoZ ²Á£0’õ†Á a*¢é¹,Ô‘Æ+%@ªð¾éè‰ÃÉdj»‹߸Hö³T%Yûò;ŸßIՠϧšÏp¢……L‰M€]¹R¡?aÞr¦á¬{V2n21‰U)½Œcdf–.G£Šð¥ÇÕ'µ­\¹ÞDŒŒèQ¡ÒFá»bÆ>6cÒC?ÂŽŽ)J'Òâ=ú ‰rÍ/êÑŒ/£Ì8#…’+u‰˜#£½2êž§± S_ 3ëRuI¶4 ã„GËœ!lHêfó?¢¯áw˜öZx&MÂGHy)ñzDAR)ûi¹úâÉòid‚÷‚)ó­¾fÄJHÌ0~c§MDA:õ®µ·ªVv»EÂ"×#$nüÄíXŒç€–jD^[~¸–l>ŒTklp4¾”1»îÒ"g^%Ç$CÌ´Ü›ˆic,š%ë&fÂÜ Ü3“ ôÊæû&g[:Û*’…(‹1;n óø¹eÃ3Xë#¬ÌT„™ áS ÜŒíH—Å÷ðdS%I•Ôh¼7ÚtÓ›é1„YQŒ:‘±†#Ä^þ²°ÍéE6y'e&1n[QS»–€ ñÈ6Ñ„|+?‘ ¦á¨úɨ™s”]ÿƒ§#lÑëi· [™zR`šn ‰³Q=-F‡èÞ£«AÕœ‡÷ä<Ä÷ÄiµànŠ›Ö ‡šá 5Zu†CÌì³ft®÷ær'RA5ŠtŠÀ6w.-ÎÑ[t=Uƒñm0‰2ËCè€c‰ªi©Ò”mwV 1ÄTpÇ™†› v©F–íá°±–ôØf4ƒV£'m%›k,z¬ˆKVäÊy,,&š½ÒÒãÓ‰Bt"¥²}Ûda±²eXD!·¨î½©[ì3’5öÒà;%ð¶é¶X«+Uzp©ër)Å,P˜ð–3qšY0ãß|¶ZÉ7! Å®‚Ÿh¾•…÷\1rúcÖŽN#9¶%s+¦bÙéX©QažD‚ÄÍsl/ï¦Ñ0H†ÉÂIq!>~çhzWÉÎnê€Ry.:Ĥi?„JŠKµ“q¤ Iç§hH:ø5+ìî=y¶T¬{Ô ×c ]·]ø;Ÿ~ÒÀ'XRàówÁÀÈ ž›XK2ŸÀµœ«kï<æO˜Ê1ÂOà×ð=S’d¹ƒÝ˜¾Ê³t9‘” ªz¬ ª$¦xÌoqÈø>aÓ^úP¤ ÒÆ1’E ËæhTgQ0ýŒÍ@¸øÕ…Z©|Æ¢ Š3å;ðk³ˆApJÐ6Æ¡#æ’ó¸p[ÛÇà:,öp7؉ãàDd@3±,è÷Źx=ñï»V{Ü êg} -Z]!à0'$ðÉ4{t‰üybúAÆÝ|Üž; um$Ò5ƒ»¢j)E" °Xüêgò‡Ižy†?Í0É´†?WþT0f‰5ɹ‡ÿÆ[5œ{o5œ[ù~Š)ΟhŽä on¤Øc.)$KÅ ®“¶ž­? ¬«%D×rß^dV×µlWÆm Œï˜ë"G×Fu*¹`œ”# ËÑLªä$ySz<ºîròÕã!ìñð”-¡=>|ü„)²€žìñP¸äQ#ë0Ÿ \i:/ÉØ'fŒ»™q'ê<Òÿ/»`«Åê‰h÷a]®ZQLâž]TÏŠq¸˜9; áÖQ¹xƒféCÙ :¡jÖ·ªªféU3B1òT“§RKún(E”Ðö*À—0{ly§jÀ*Ñ”žª:bgLé,>|UÞ¢*o1³”rØå¯%¶Dv€•¬©j &N0U‹åùÅá‘óJr§S)á¢Ë`ÆÉÒŠ¬±l>¤E¥M¬±p4g¤i&³õ‚ŒTµÆ ËV¸D!Sµ•Ž–0~K†ê ž~²ˆ~UŽQ3L›Ó®*³o»š"5%À…œöPÍ÷ðu+^wbÜ?ðÚ`t¸ýÉo/ß<|"ƒyƒ£cÇGâWÃŒ­1xáŒZP×*‹fšê0u™³uQ]vâjÆÔ²áìñΖ|âÑÂd-<¢†—*­dü8Œ¿H¿c[ªi@%¸¬ú8Äà¿·^·a€¨hnðÉ1±dâL™õ0xÝíÀÌìõCdf†B"ó´Þ8L­dò{žŒQæ`ÆŽ™š§î 7¸˜EzØÞ|Õñ;˜IcJÄçC€½{v_u¢òú,%ˆv<Œ0`nª;÷°DÌ Ì0ãÝÑ­6ë¯Ìi€aU„ët¸úSø;+jmƒ«¢.X•ôiÑ9λëºSn¥²wÎN‡&¿ŠjÃëü)HØM•‡åb"¥õ®Pw%lz¦<19XL%’(ïéD‘;³t¿oùÄôÓI8¨ílƒ VjÑ¢L0.$-Ïäâúì:Òö¥O„Ñ,6jecEZؚǪ“à%"Ç!¹­ªÕ­¸©úÇéÉÂy' i&|Çâ•k{\'ªSÎFW0oàdjGw§Ò&IEö¡õº8Bx x k½„¬<*¡Äz Ò#GX~?6ç\2]ñxÞ˜¹Šf™2–V2‹:¯+^õ£sÕ‚³S«vÅeŦÂFMá€WÌ€\aí1êˆ8¥pG¤ü©ã%A"uMï^ó # že"|5æ@0…¸ë×' ûÖÕjJÎÍ‹’SeT®ªA±¬—1á]Æ÷“1¿ØYCß9bKÉfj̳à`ÆLt33« &˺Q ªÖx/DI4ÓÙ”Z¡T·&½b£9ÿ œaínYÕ—³k9,Èg3Äv uÎáã"ÅTE}•»l‰»ènt(,²M–{¯1œr8­W4ÊYo¿Ú$‰>]¶ Õþ™(¼§j_°ÂͧGdp}çêO²–ÙrÁ˜8áLl"ÝP~54CZ¨VWÿ»ÞÕªö·!íO‡[¬þm7öiÌç‹Ú•®[ë–”H1.&RÙ¡Ñv“ëÎ*%%(Ï\]pðËc£I@ RPw²)B /•@¤,YþCìl*”¹4@±1]hzrn·°…)[$A#È5¿%›L1`š7•ŒÜ˜BþwZ9wåé ŠbúºÚÁÝÝjÍmÅšK Š:Žíyuµ‚¢úY!‡Z)fŸpnø$¾ òÊ­§‚¼6i@^;£&]2ùmÔ)/t*Èky¥…γYNBw.'È«uOj|{¼O”ÜRW}ï¬0Ià ¸zCÔ«u%®^wjÕåQ W¯;UW)ɰ ÀÕy¸<f@È1aˆ³\ͧ׭\0½­…±¹nOé¦É ‡e2KtWÍ)NG¹ªâŽáÁhµ­®LV U)]·­†¹§ôEØŠ]‰Úµ³‚'…p½Ù€ìÈeC¸ÞìÔ!\K"„g‚p]BVÛ‡p†3m…påf»`ÃB¸^²:÷ý®×ZµsÿùV׬û‰À¸žÂõæšW×ë“§€p½9û‚3ïÖ áºH€>[ÚþÂàͨ1ÂU ÂõÆ*¨®Uk\v‚ÂÕ¹M×uèÍèOà ›p˪¾lÂõzøµr—®W «®ï³V€û—/«B¸.¸B¸ÊC¸ÞˆÐ á*„T!\³³ò4®7ÚAÕþ6¤ý] \©ôg]æsB×+ýTWJ1.&R“ÂõÆUJJPt^XëCf—?øU!\E"hR–l…p]2Ùü®7·»B¸f´d+„+èNázsWžˆ(>„ëíîVkn+Ö\B×¾éôyuÂU:~Š«¢ðJ1“ľ(̈°?®'ºYߌÓcÅ3ÌBïS¦³<òDñ.YKëWÁ¥©a?,“Z„M°'»Oˆ $2¡¯† Î”„‘D¨ªÖT¡š\¨z Dµ{OPÎÚŸK ¹'Ñ!ýØje$ á¿bEHl8$C¤ˆ*2LBu6Ý#ùU­¡j M ïì48L«ê#V™ºªDÒG¨Fïa@û XúdºE«ÕC.Rlt{šœ5lŽ 2BdÙ•C!«-­(ÕKŽ)}ÁªîKyÙð¯+iIH¤ëQÝ©‹À­Œ*%ÿª0yÓ7ÍúäM­¯ l‘9ÀððȽ (ô ÙlŒì1,×u6Ÿ½Ç («’Ð!¨ÌE&²»Ê\7+!FÎrÀƒsÄØóxç‹Îõ…_c`òߋșb[œV2sšjÎ}Ë»¼#"b o>žåtQ4[È_[~è4(WzUEð}Š`ÀGb ¬£JHà7—YXy‘‚\†äá¬øÈÆ>±"bÏâ[ÎÜÿ$œøåèÝlÿgì€Êd.ºÇ #€7…~³;nó±>Ǹ€~ «4é=l€qƤ*É-ÈÅÍs©’`˜X)Óòwjc•eH½ìíˆcáÂx"þC!“è8¢÷0¼UFÜäaÝM•OÉ$)•¸¾£…©|¸ŠÃ޳Ãód\—1ÈKíC8µS%¸p‚»7k\¸Ä¬×ùáSÀãØ¹EE0kg6cØ´¶_ì((Ñ+^fóï…bUØÚ]îf4;ÏÀ"pÙÑï†õfé¦|0nJ1cdÊFÕKîá3Wß/s)´ö§‹Bt¿ çÙ1àUì¸ÆámŤAGdèæÔìá–£oÌ3Byq—KcÊÁƒÞ»k¢(é²®àÄÝ2"·ë´Î«›»‚Í;|Û±©ëg…Mµ•ñ¨a˜\ΜøLYO})¯EѾqjQô¥éÞ;øIŸÀSPø:Â35pîŽÁsÃçÇñt*ûòBÓãCO<À{؆ɜ(£œ}ja‰¯ s¡‰lŽq<*k ;Ÿ¤×ißq¨+XÕ.aRÒ7÷œOþÄó5| ˜©%êbɰ.Oä÷$GÚa"2 œ\G¸áÝÁ³Æb‚aìŒàÅ'Çð*L;XWÄ7«xÖxnL¬“Ö˜_ã•̯=RJgµ4Š„¹öÂatž”>£Ï®ƒ£Û_LÈ·™I½5ˆ2ªÂ;·§’¥d/ÁY56D9¸g=ø–ȶ!$£ç´pƒï6îsI<Áã0§í99¬ïUÅHصi*l¡®½` Åhmø¾º)ª,³äžWÁ…ÍÛš٠ϔ0†Aªkùëè‰Kâ ·×4ÇA´t‰)HN Nþ|£ñ¡†ºÁ•j²­Âò'eêµ)Æ@H‚ùc‹BVzúj¸üGVE)ìÏ/ÃâºF3: e£ÞŠ˜:ºs÷IbÆ—¡|D€˜»;¹šÌ«†ÈzZ޳þ<œŸUõ-P‡Hàb2gδQDêZ®ªK[üŠMÛEê†|V©È'1j=QÂEçI,C¸¡D•< 3àtG<ÑØ}æW61a×ëd—?¹µŠ0aù ±0}6uµ}iÁ“ì7îajL•«é¡)ÂeÉ6¤‘uväTañS¡Î„(òiZ¬º¤¼€0ÛæM1 4†0*|­ ¾lëÏ´wj¹žÐž®>*u’Nº×5x2k ,”ÙNº7BX©vÑB!_Úc¶Î$%aËçhqÛ6I Q2dž-žõJ·‡®Þúé'‹¨Eà}Ÿ=W=ZJ¶<àråO‡¨æ‡x<‹×£öÇ÷igÍí~{ùæa q¸Éq wLÔl;ãŽà}@xåW Œœp’ﺊ ÀÔ»z¬† QÐNbªè \X)!ÉBÍÛòž—¨Šº§±oŽœÕ Þ¹#GË¿™±æ±eði2 dcóùºA‡?»‡ðnÔ×G¿°`'Ç»&Î`ut0îZsž®‚ðć;Ûr’Bí¾=u¹yrbdýü‰-Wo÷ÖÁy³• Rá'4Ž~äл7·/v¥3«=fÌdË0;ìç ´<áÞç‡ÒêÎ2þ|Çò´ô/KpÇf|žùg(;‚ð>@°6šY°™ÖF[ò«’ƒ'b]:7ŸÇ¬Ï’œg]xœñý>4zo™Å{OÞ>±lóËÜ}}ù*²±d endstream endobj 4964 0 obj 7230 endobj 4968 0 obj << /Type /Annot /Subtype /Link /Rect [196.500000 300.500000 239.250000 307.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_interfaces >> endobj 4967 0 obj << /Type /Page /Parent 2 0 R /Contents 4969 0 R /Resources 4971 0 R /Annots 4972 0 R /MediaBox [0 0 595 842] >> endobj 4971 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R /F1699 1699 0 R >> /XObject << >> >> endobj 4972 0 obj [ 4968 0 R ] endobj 4969 0 obj << /Length 4970 0 R /Filter /FlateDecode >> stream xœí]ËŽ·ÝÏWô:€[E²ž@@–åY$ ‹ ‹À޶%‹ü~º§«zfX}nO_²Í‰”á‹Åûä}¾ûãç¿þùßûŸÿ}ø¡ÿûÃç§âØTÅå?‡óŸo^ÿÀ¶Çþ߇¦­?üúôõðõéÓÓ§Óÿ~}º<ðùßOÿúßÁþtúïχ¿þíôÃû_:ÿ¯OiNÿòüwטӿŠëßçŸÿëé/¿;üvžqx]¿˜·ÿÿ[µ¶­Ï˘xõ×§á3ÍóŸÿþðÛӻ˄½¥2uÕØƒ)]y0]iÿùÇÓO§ ÓÇ®4¦©Ë¦¸çEÆÕ×W™úô?§ÍñßôüGkþ³7eÌٟ׮¿1¶käÙu|šþô–ö$C§7žäʶªŸáM¯»GÏ“7ÆØh“_V®¾+'Î1òìŠÄmì‰O/TÕÄýûÿ2}„É]ÛÄ›üyåê»ÒW˜]“¸¥ëú RV@þô&¯‹ˆ“?¯<†½2òìšÄ­»û‹±ÿ]DájmLÎ9¯\}WââÙ5‰Û5ƒÍ=Yý-ºNaÿ[[E$îóÊÕwe .ž]‘¸­<ç"8T/ÓÇ ncã9T—•«ïJOÜñìŸBfÁK¹üœê¾ ~ûåéÝ÷¦<ºúðå§ÓâžßyùëËyáÝᛓ'XÕáˇß…ûþ‡/??uÇÚVÃ/#…E#ö=|Æ¡SÃg¾ƒ#Ãßãðˆ k‰µupðlp¯…}ûŸù6|Õ¯®?SÀ˜&ü=î²ê_Nò_4l9,¨„KÝÛAøX¥`¡Ì,<…‹ À˜P8-|O !Ca߈UÄÚ,^ÁÃ(5á{0'B&¼)cDñ^ã‘QÎAŽ/ B‡Àï\ (Y~OEÐë´¦²të1a‰F³Ù‚a2F¥ïÁ¾/á©11›–lZ¶K¹T¦EPì„®V Ÿ)¡œâ/5xGñÚà{Ü·)MXmïñØ¡8YȘ³9¡"fÎçŒU«”l ¶J¹5Ÿ3…›T­¶&±_.°ÁÌX} ïl®«±PÉa±Å_šH©øl‚ýŠDñ]*Xb$²Ïf|»”[ÞŒ ïÖ.øì˜êK§ÂŸiœ¦¸Ç‘pߥ\ªé†×b»¥¶ ´š²¸,¦2Ÿn0¯M]=¯Ç´öØvÅÛ‘žan\¦<–îRQï @ëë²°é7IQ=ÿÀ«²n›×¿jà$½r»ñ ^}¯¨ÚÓ÷š«::Ûš·#Äb]A|Æy"3|Ûx<–‡HÎCDEá¬õ¨(È6dì‘Ô “`}?[ubÙÀgÊpE$<Ãì\[QÂÙjbp¶;t}Lcuâ=11­.‡Aã¼);f[‚Ÿ–çÛÍñ `Ðjç;M;5[EùÜ9ל,³d8}+Á‡Ã+PóÝ[ÙwoÇlÆ ¢ù²Ì=F^}ÿi¦‚ÁgÌGø \púÔõjœ8î TÂsT2þFÇjawFçŸù¿ZBÍ–Àó®*_G@3Ú'[î󈱓.üž€c§ïŠ3#Ši-ÅÖëÏ‘y „Íj|Ú$¯ñžcJâI pã]Z^Å.GAÕ-`1ƒ`Ga$¥ÄJ'~´F&˜‚_ŒÃ p6c’Žì!Föô’™%-{êJßKVC!€­K¢ìvg1Á•ÓGî£ÊyN»õ&nŒµ0³¶ù¾‹ ûT=”dG•aÄ5Ùk,ÚŒyùèŒr_ï ~ÂüŒ9.tDŒD ;££ðlóUí¤|Æ V9ëï?“Žð4‰S>Þ ˜ÔkKJAZõjb´­/¹´,ët~t+ J…=Ç ƒ¶ÍÜ`|;y¼{+mø(®NŃxS o7$&´æR‰ÅÓeLêËÎKUŸrðëjz "Žê…ðžb3E0,R#›ºü1['žÌ˜8f¶- ?C0dËScSîØ|j0/îk—ï Ib™×u3ñ3Là›^¿"7D¥Œâ'Dà{Lô. ê¹ ¢ÅªÜÈd1Ša~Ñv™i¨¹Tt¦ÞН¸£gñ°ƒq‰›Ãˆd¡i‹hNÞ&(þž2EÚÀ±®ÙÇ.ß0.О` ?,MDØMÀ,gƒœeŽO×ó´×B8™àQ¦»M`B~Ö¬a´'‚«jïT»¤±âU=-My$ä‘<’xDù´ ½FãSïªg×5ûSžOCäi(Vßàã4ÕdFð£k³”‰Ç=оá= îâ+PšðîÖˆàøê§4º¦ý׬k¨X!ã0xÏxÕ96’—›Â¸É•®ßw„µ<~ŸF°Ôb-ÏàëÊ £ŸðÚ2µ .?idT©{úñ[6Ç(ÿÂ空SE ·Ø]ð¥^}¸.÷ª-ã«1'zHb¬1 ƒÏƘ>8Þw'ÓG›>ùÔ=­iOË w´¬Yw¦º 5óX«Ìxìq"ÇYš8iJ*3Íu=¸žƒaîÛbÎ’¸Ú…‰cÉÀ>užÆ^›ê­ÇTî†çƒ4Û^[‘µ5¦¼‚êcÜ×Ât¯lf‡!LQyÛø aS;Ÿ¦ÂQáA­·¦¡†…8“AÔZ*4<—1Nw‡g–1NÅ/]¹wE3-My$ä‘<’xäá’“»ñ vZ±‘OCz§¡t§³õdf§ûäË4¾œi[|…×á¶—ýÀZ w¿†T`ì™&–“©÷D¤HWŽ8tgÀåªÞªšÀ³acº¡SùËÛ<>ãïÁ~îy`Ö6ßg ´Èh’€ˆÛ==ðªGU¡ï“#*ì ATÏ`K‘6Y¤¯3ž¯¦F7çþA_g´«;}'» …ñ ›…uü|©³—ªçÝÞj Fcq±û6¿ÃG·Û?hÎÊ:{"ØN¹0iÓ*e*%f³i|3§K3Õ´ µ‚©Ûf0#@W0æZ7…‘Èxéf?÷røäCXa"’`^[h§ø5êY"k-¤aâcó˜Âzö“I{ÔPPi¢Åð)ûIÔÉQ9zÕ«1•¡½RÕ„¨À÷EN~3µ!ÄHO§‘6WO’Yà oSÈ¡#ŒàÅbçnùè C–‘úÇÆÎ?Š& ½ô¼à°_F.,jªcѹ·+€ Ò·; %´Ù¶®<ñc¼Re®ÑE>MãÕ¨Ou\ÙháÎ"«+@¦ÝyIf2lHæDw˜×gúL(µÍìNt3Ö¸Ò7cˆu/—ÃdZ4ªD#;„!]$‰ŽÀ© ßu³‘Ï:Ý>©R¿XO§ò-"ÇæO™/VPDžVôbFc­m<›ÈŸB:ÚÍÕI«ª-û3zuz“ 3íé탒ÂA›sxdgW…:æbpØbàîŒG÷ºÄfßpãŠpõ/|„ïIZÙ¶™¦ †®Â0† |ƒÝ¢ _GÁñÁµ10a“êåóÂ`}Ë¢1 ãÙ°æÂ0nX?ÅhQ»õžt ˆmQÖ“û«,ϪВT #骰¤£AEð¹ˆ]³Fq˜ ¿Ó`MpHRýÔ–Y?Ý¥Ÿ,ö—¿žseÀTÑã³Úò^¦‚²÷‚5ñÃØ¼×ºz¹lŸ¿•­¡¯SždMáî°,”5Ê^'M„Gš%0­Ÿf¬}8iÒµ›©ø»± s½ô—á=0ú+mº{8;ŸZ$éÆ\ªzuýÚâ^þ@¹‚ÎMùôšîô*pqå!¦ÏêO];¹e_{„Ô —7á÷~¹íPåÆ3b|&¼ÂŽb€5Á!!µ–¹”Œá^Uj —íÌãOé;[sOÞ>¥ïl¯kBÅC"°Öv× –aýãÄQõ%ÕØ»œ‰Ö’€_ ÎC·épá«n½gT2§Û6žªÉލ«Ö¡“j_D™BË9ç|Í’êê6]Ãú>º 6¾î T }·¯HGôY¨4L!1qmÇ}‹1÷½é¼}OÔ«Ò0È(#ü¸'iú[3v³jæ=DÍ¿ BŒ¨j\ÝáÆ`Ð}×bÃ#;ÿuå)MWvÇã-­¯ž7ÙQÅYª-eÁÆäδ>WhV̾ëÂ’®Çwn@ÙYdn2]2Ù 7n8c›èÔår«#Êkê’ÆÐI€l+x$ú¬Öà %ã>™>üm+ ©o" 0cÑzUPáL¦zQöW(~\<Œ› KPàÝã6p„ÏRªØµTÀRŠx}"1é{ļ' ,=‰sƒÉ.?N{dÎ <+ðPÎdy™«ÐðÃuý¡D·&2¨Ðk> ¯j2.œ–@Õ(á’—ê˜ÓÛg(uâB¶Ø›¯W”OúP F–¯OKhUÒ,¥c1yö_åë*“K\ª£{ËgäÝä½E ¢`n òT«G01)=€X©Š-]=Àݕ̊ ªï# ’Lo©"`+ßK¶T„4Õ¥“©òò9/·ñ¼“Þ^žíÖyóuÙ:Ï4íÌV©x@Gyl)~–én©NwK¢cÚN¼©TùæMÁï mÌâÆ¦ôlãª3WLˆê£ÖN·=–&˜ÏyO0¿JÓòeîaíèpGÈÀÇÙ· JcÞ7éKKÈo%‡Ë;J~ P_—Œ¯0‚Fb@VqAÃÉñ™æX]è±|AêÁÙWJ–[xynªÉýÍP‚¢ß™!ä2ºH… €.ñ ‡9¤‚ô!ôu‡u#YøKWsXv÷\­‘!›E]³ÈæÓŸÃ×3‰¼öiêf„Û›XHÆ s®ð9Ø‹‹M¾Ì¿¬»¹‘o¾ÐÛí¥’p¤#ëñH!g}…Ñ+:\Vp+Šýz›ÊÞZÛ÷ý—¢"'œx*_–TÀÅšþÓGØ3 î>ÇiΟaðlð™>Un‚>½ya[–áÎÿ>­xXùGô.[,€÷²@2(glf_f8çW–ƒé]áWÓã*¼FÈrÂwá÷´÷¼)ܱW÷RÞ¾<›ÔˆŸŸžþg<ñ endstream endobj 4970 0 obj 5204 endobj 4974 0 obj [267 /XYZ 38.2500000 601.250000 0] endobj 4975 0 obj [267 /XYZ 38.2500000 601.250000 0] endobj 4976 0 obj << /Type /Annot /Subtype /Link /Rect [76.5000000 680.750000 120.750000 687.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Modules >> endobj 4977 0 obj << /Type /Annot /Subtype /Link /Rect [139.500000 680.750000 179.250000 687.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_namespaces >> endobj 4978 0 obj << /Type /Annot /Subtype /Link /Rect [316.500000 490.250000 414 497 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_typemaps >> endobj 4973 0 obj << /Type /Page /Parent 2 0 R /Contents 4979 0 R /Resources 4981 0 R /Annots 4982 0 R /MediaBox [0 0 595 842] >> endobj 4981 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 4982 0 obj [ 4976 0 R 4977 0 R 4978 0 R ] endobj 4979 0 obj << /Length 4980 0 R /Filter /FlateDecode >> stream xœí]ËŽ9vÝ×WäÚ@gŒÐ@RK¼0 H€†ƒž‡1èXž…ßùˆÌÊbäaOÞË`Dq„i*+ ò¾çþü¯ßþ¸ûë?w?úö?»ßÆ¿?}{©ö]Sÿ³;þùéö¶ßÿÞu}³ûíï/?v?^¾¾|=üï—ó¾}ú÷ÿþogwÿvøïßvÿù_‡þiü¥ã/üý¥3ÝáïßO9ü«ºþ}üù¿üÇ¿ìþq\ñò¸q3oÿÿO¶lÓ·ñàÑ?^.¯iNþùÛ?^~>@ÜSÓ7ÆíŒ«ÿ38»ûß?¿üåð€ËòÕ~pÆt­ëªgÔÙã“êÃ;T»ºî':ý‘YÞ(,ÞY«·øiçâ§bêÖ„W—¼ÜÁTçêZ…º®®qüƒ&áœv.}(—«…‹ËÜìá1‡§ ‡çìŒi¯ÓI¿Å›åe\ݺFqõÓÞÅÏÅ]pqÑÛ­Jë|@P8¢×õ5VoªVqõÓÞåf¼_¼ºèw½Ódßëò*7лJqõÓÞµØ..z»ýPÔé\Àu}ùÕmUµz«{—?˜ñ~ñê‚l+kÙ÷fy•ûµ½ûŽ{×aßéâ_cÁ;9ÿxv?_üøýåç/ÆU› Ý}ÿËao§gžÿú~07›ÝOGwÎö»ïÚýRUÆýa÷ýo/þµÍe‹>©=}òùûáuÕwÚ¶Oì´ªá'Ÿà'á'î EŸØAr5ÓÅŸýïÑÀ½}†ßéã¿8¸7¼Z…w?1Ä®«_ã阮ôV3|ö1!ŸÜ[žÏ(ÞÄwϷ”ôž"üÄUñ¼‰åF€1§ãï`JÒQE[¹•è‰ÖÙ¢'žÒ~ÄÜ€¥'þ|S|]c ï'   ¬ìË1x:©¤ÖTÅ^Hg/¨ Ro­x?¹[mkR[X\k±.ÀÏÁÔ‡ïë)QzalÆÊÁg8Q,°ä"(¤!¸[mJd¨Wô¶+h-lÍFOj;÷Ïȧ¤¶ó0\žŠ9Hl?h3®:m¦kÜÛË2Õ¾íŽ?Ÿˆè~ßÕi§¯ŸXôIÕœ>©÷k‹MÈÿÞw΄äö®>—ƒøL{ç“Ñx‰ÛÁ™Íú9Y„Ù=>YüKøzÌY:™z_ÛÞØæÉ/ ¸šö=‰Ò¬K!Rl7aãD^ƒ°û -ïj×y'5^Ps‘w7WWÇS`]”þyÜÁÈ„³>!ˆ ðÄBKSŸ9ëÝ/%㘷ÆêÑÅŸ{`×Ìs µØžƒ %Ã7 ìÓë£çèŠÛ¦w‘­ ¥Ètmc|¦Kf¸ždš}5Ôoiœ‘T„ª7PöO­ ñ}:íÛã4“ô¶™wfþ=;xE> 1$qï<°ÏÐÔÄsƒWVHS§ƒwÝ¿åÀóÍ›éÍ/ðtæX1±;“®¿ýÁï/ßÔj& ={Ø‚ÇÝØBáµDR{'5cÚ¡õÏË´‰Ëˆ9¿lí 9‚¥Ööb ;. «1ÕØ™,u<ú7,å*»4K·0›¥°vZÌ)Ÿ–°XÿòZ6NxŽh<Â|œ}\cæñ9¶­Æ“F ±Y6ÚÌ÷V;ïÞØËGsÇùc.Çô5„=¶ BÔec„çCqÇäƒrhÝú^Å•$8«GäÈkì˜áØÙ#§QÑ}ê†n¾:Е½¾Áò ©`+š‰ø2RŸ´·ÿGV›©h¤ <Ÿ4)Á±7R¢ ®1‹Ob+«O¼·‰‘AhÙ û˜ö˜cQD| Ì ›lÐC=˜g¬­}Õ(sˆp1¶AT:_=¡¥b”í# Ö¿öæýÁ­kÆDÃ8«"¶Öæ8f)™¤>…/c_X`³“€ÇäßMTÁ@Y“Œô—ˆ9N¢ÅÌPµ~ÛN$kDZ©(ÝÂÜRA+QKŠ„¹!Âøtõ¥ÎªkÏ'‘5Á'>]Dôþ*vØ(ƒˆèƘšØI&l§\ ¨QÔ¾m<´‚ò–¨¾±3AQõÏPTSPì–`)ÆhBkSÃù¾ZDê;°{lÁ`ù6Ù#“da1ëBòŸ(áïoJúÛOt¥*&ÇmT¶bX€nÕ‹É/A°š°?˜hרø9>#V~¢ „ê1aŠ-EK7³öÖœ!)¾L-–®²©‡Æ¡ÛÑÔB½õÏP?JÙ·Þ3O˜Ad« ™Õ2Tl¢Åƒé´¬™Ùšz6çcX‚€Åˆ AáhvÊtæ>¯.XwSÑQâý8ž±ßVj99yº‰ð»fX°v¾Þœ¼lDºO¢Àa~S á¾ŸSÍo cÄ 匈V~õTæsø˜à6%ã@ù‡O×ò€&¢È9Æ¥$, F¤ÒUf¾Ÿ¬»o®Ô„#S¸¾xV[³Î ŒPL¯/@u)L„:£Mæ“ $ÂØ³óÙ€bJl(… Z>ùPÊ+ý8ç³\ú¹Y´Æ;©T6#Cdš0ƒGc:w" 1d+ÄRU[䀢Ã[MÝû¼%jÈR™ö5AôQž(‘s£8‡ØÅ„k ëÁ+·,Ñ80ˆljÅ$"#úlàN¦Ï[3*Þêýv†×Áš=‘Ïv¶§˜  o1ê1ê24V%‘ÍÍáàãëkw2*ƒ)%*nd£YCÊ@ŽÅB‚°_G˜KÂ9¥üªÖXñ;¢í½^h)øá7Ûø¤¿Û-wÊC‰*±'@üâ݈¿õécIÕà–ú-ëJé’6šCC+AjÕÑmÓyºC8šõÁ#…,¤D1qe0؉.5* ©Ûà˜1,A2šœ SÚˆ—gdá|ôd™Ò0Îo¨ˆDqŸ¨.2c& ÿ!‹×»Âl²fìÔtÖwšR¥ÙÖ9úe)Iºñöù±×V»ŠÂãÙ†ƒ«ßfÜ|RˆbðìTÜš‡§ƒÂ†Â>ÇÁï8‰8ð~Û—ŒŒ9øü¦qÅÀ¨Þ[c€xo麹4„Ý{>bÞý:ß'Ÿ:¸LUºÆg † 4CB¶¶HÈuHÈDÔ¸9È›øÜð¨½á N‘Þå}²xŸ¢6êwf¸›Í·½)þ~NàMá‰^Æ^ÁY™öâŽûB#ê9FYâ‚8lõ*?å>§ ì"}c¢0 TT_¹Q¤Øi¼Y¼œ‚êq æíÓC~m$Ñõ½ºwn…‰Ú¦À™?šd¤)ýϸ"7â¿ÐÆ“´s:D¥ÚTµÚV_”13Hµ-®¶B‰¸r+e½Î búVøª*M,/k=+[ùAA¦à£IMˆlw23Ú”inš_¶”sÁðrÖÙ ú¶/–u›…+"3Z8ü^[ü_nݰ-LS…©YpèšÙ7CÕwâò[Æ‚aðWEºÅ÷V’GŽW û„w/Úœ¬³‡Á1 üÛˆyÔ¸w¢ö~ù6»–‰RKµli¶¥9çkË5u-Ö2";…u#ѹuvbèçê@G÷Á÷ÖŠ;cá$M\Ý˜Ø ë3° xÆ&ކţwp…¨è ŸÀ(!¸¼këáõ'ž»®3œ¹$!rÌNm$  ÓZJÑ'sz$ºñd€J˜à]*€9ì™AÊ*aâ5›£º÷œ±pxšªª/ú´öMüIã¶õ”ãVTÓâX‹7Ù ·/R̬†Y¢!”ˆØn³Ù8Jµ”i$‹x!lBˆâ s VµøæºDQ•´©’ÌXrV©.1Šç\H]`þU¹BTJ`rJŒºÔ("òÔ˜üJï•õ›ìùäf²0T;¼}dÜ=L <ÛBLýЍQ¾j¬ÄœÌ²evái]½GüY‚o”ý„ðÞä+ 䞨tbò=ê‚f °ØÂ»ö3çËJtÄM j•hä¡ÄsÉLé†Dëj*ÐáUDÏe+Q¢­eM#ÏTž¢c,ʽÇXæØ ÷( 4ž©‡ÓÙ+ÜFÉøWï)ãÏ`ÚÀs Ü)ÜAàtˆ7Åt {Ö®æ /`\üšÀacèŸ~Þµ%p—{#0¡˜÷ÁwŠ¿ƒ¥K`Zèý0‚ïÇBd»îÚ‰M¸ !ž#6¶ër£1Í`w]yo­\Ð’,$³xÝ8Õ¾ÅTf-lÔÀ›m„˜)G…ð¥©VpÂñŠwÑM$šcW™\¨ÙãØõžT¤ºžèX~œCê.µuV€e˜ùϦÿ_Ù\3­Ï£ÅkÔñ%mߘÙö'3—V¶t†oÊúP-Õàó‘ ËÎCí‚Qw~7Ÿø„S—~n«Ä#N›¿»$±,¹QéãN¬±ÐK3Àd[ç Ùäø¹4áꗛ١ˆ}—7×dÇ4jl§jßcz10%êʹ\'p:‰ú˜È›,¤h1'5ÑMåI÷wh¨f8’YÖcú-Û9Q.#0o±Ñ'´*[ÈŒf ÆSÈ:bÙDN²ïV¸™7Âíü“YRÑD˜¼íàIEeUø"&Fãâ]ù”•/ _*쪉:öÔûȦñðj >3CùÑs®¶Î™«Í”«ÌyâÍ~üþ±«²®nòûË·€9¤cGöàRL²ì:tlRZ²õFÎd[ÐyŒðÏ©@S›mÁ[ª1º _ˆÌ·ÆÍA“Y´¾~í(/5ð¥þÕ@(5ðbÕ ß®—Æsžq=/æXᘌ)ïË<=Nä Üœ(/à]?¬ÿ–â,¼7Ù ÐpµÀhx?˜õLå>æz‚’ïK>Ü%ñ1¥÷A„Z#¶Öºb±¹ 6xÎuõý׸xÀL7Õ1C¼ORNqU÷ÄÑî }§â¸ÆÆÇØlŸŸTp³~’³9cñ‰bæÄ'J:ØàÅgpbDÝ›…` \|?¢ ©9GXȪ–¤ºÛÙ6±I¥ïÂX^…QÝâD4'#âøtC¯Ø¾SøIZFsÍLS§rÝjëžá|l2`jÄbÇ`0?`¼"2PIXñ`ÚÆª› X.2²‡Q—DÄ€QЛބŒÃç0*ƒ:±¼Q¹NÍ™VÎ÷µ¸Ì~P”ÞÔ—øË ÛLMå¼—( ¤ÚªÑÄDí;ŽržYáÿ*ÕôB€>0õR²]e²bVs]²Ä7nj_±­«¼k¾ HVïEÔVâþ2,_bÀrd»»"*„EGÕP¢nËZgá«‹0¬4®Ê}‹¶'¯a¾ŸpW1UbH ênC—nIëb„´ºÑYË÷¼è6‰k€A•'"2‡3‘’x÷©ªvÇ3YUÓÑò) R)‹ëŸ O¡i®QF&jôäÄI©FÖQ({úm}ëÉò Q©±U¨›%!»Í;‘uÂ’¹1ÊzE¢]( }› â‰ÒRÙD*4cpCïÓ†HÜ4ãKVÃ$+P.…cýýœáiŒ _ÿ Ÿ0º)è³T &º ј&á¡ÆLD\<*#K:Ca†xÁÑ2ÃwÎYPðwxo¢è©fø>¤!]“ôXJùV}&Ùa׬bOzTLgyÀ§Ã3#°Jì:Ь‡Ûª`•6>ÑTÿ™@€´°á¾·"ÂàÛ–«]†6ÚÄHc„".¢”1Þ«ì%@N¯‡UÄË ñ¢:c¤õnD2-¬¹ñv²ñT-™€¿E$˜)ñD)cª±k+e€OŸ*i¾ü R‘$*Q‚ün[?´Óš«mΡђĸäÚ]cþ1ãZɸÖì=j;ï•KÓU¦=I‡}­õÁÛÒSI•1׎«Vó‹µR@²¥3ÙLÄV®«°Î踧=QQh¶•¹/4UŸÙøÏÌÖv‹Ë$2±§ÃDìM=ѹøÁx³Dzf+K“V & 9áNb`dŒÖ/˜WÓ„ó#{~ ¶ ›ƒëä© l«5Dù|>M푸èÚ†Œ¼¹é—²BXOÏ/½xwqÇá²Ú=qßí‡TÉHªÆDÑɘñUælæ5gÓºÞã‚÷Wq$WtÙƒS®míËš¾ÁH×êïép_¸Ú¹kú¸Ú(âïÝ~N¿ƒŸs¦îvoÏ5 7œ‡wýåbŠÛ5üÎ5²±æ9÷§3R²q—|މ¢ƒ‡Ê{C<'p§ðÜÜ0ʆnðí{Hoø;©¨?§†æÎˆ%së±ÓG¼¾¹%¶ð9ŸÜ©¢Lm[ß~ ì¿6@?Ås&>Ýë´ƒiKÐ^à}0µàrq,°ÔÀ{[\žŒíŒwJ ;`t!Ñ®“c&«$š:†ãáy¾å²æLST¤£rÊŠ ÝûXG"O‘‰h&Ç{HÖR NbT! “¿b†ÌŠöG0WèËaʉ†ÙÉ'%J˜1š >¦`žêÄþª„C›ú1!ã`Q~˜‰ÓXZ3$ž¨ ’‚[*Ò±ÆxäWº8®—²HGm;_ DT@HÑEôôc['%˜ÔC¢j¾(€ W›Ö]$†íͰ 6U®=qK¶0@ÖôÃŽtªÒ„µUÁtU5ÛN›T[SäÃ4j$‚\áp>ÂÐ)í%Áç,Ø^riqe-ÅŸHŽÂŽóˆå…«¼$ð¨à2fS¢bŸx˜Z͘¤éœÏJ„uŸc¥9¶»˜Ù6DD9¦Ìz…FD‚`XWçËÆË'ȰÉF%ȶî1î8ó/*œHX‰À¿aè®GÙ<]Óº¾´’uÅ´^¯ií\åÝ¢¶n_¡ê‹³÷Þ¯î*Á½wÜËsbfçœ/ÇÖ413póEkÁ5s×”<ƒDdÆ$–ç$’E¦Oæ@2R`U#›™ƒ$*eT‰Ô¥Hä7ƒ¥ðe1(¡ÆÔ<âçˆz2£oÔMÖ¦©=¸NWk4áîc}1Ej¿õB àY•¾^l4ô[ªx;ãnÉ"Ì2«áà`¢æ´T|›FPGÆû™%OtO2>jßj]Áøw¦VÃA7ZX7E$¬ONtv<…YÉØ^ÌŒz¦ù_X„gÊ,¿Tm«¶ƒ¸|™_׺Ç‘lbºŸá-’(ø,uÈÁ™Ãé {Ó½•Ú%Ú]¢ÝèMá'øÜµnpø9˜Fkø¦xµ@?3qÛ¸Þ/p ÏÞ‡9QÜ-z§˜ª·Àì¾Å x ¦ÈbŽ ´?üÙùjº4ãÄÉ×·ÞÈl¡ æ¶->I0`Te b¦•`¬wÂÁ¤º*o$¢1*BL4À¨¼#Üpý@ëz_*æœËÚÄ~ò±p%ž›c<÷aØRÙœXF+ðz4ãKC·KQ^vl’xRi”!Q­OÌj :Ë݉­×¯%«ƒy㈤KÈØãŲA²aÃSR@¤écÑ`þ`Û·Æg æ—`>zSÅoJ´èÎïÞi ìú1%£]+'ð†˜¼ƒmˆÕ˜Lf4±)!sޱuOc |M$ƒ°„É&€.Äßi9¥¯Ÿ¸bYîÊÆ¿]0«—³pÇÄŒ±aðÍaĨ1x ½Å;`Œ#|§û›ؘ`4-üŽÃ75ZÍMQJļR‘Ï€Ò÷øæÒYöø¾‰ÕD*ë¡!ˆ ›Tq£ö°—Hø4˜55ŽW£T2.×HÊÖ;Ìp}en«K'k*Èqá© ˜Ð0ƒð,1öäbÑ=‰ø0¥‹Šc){鮀~Õ—1ýwŒˆÓ&ÄU9H÷æý¤—Þ£*uï‘Tÿª(äºÃíà¸s7Ëã½áûY¼åz<}3²6—6h•°ÊÒ²rÞKl”B4㸃ñÎ0û€1„Þ Š³šËL0÷„CØkeÀ1“Œ[TnH·•€œ“µ¢¶#Ó ¸& ȤÝ ˜ë•qš‰ì3—/ŒUԹƷ“HÕÑÆ¤Dá• m[ßèG Z|ó‰æÍÈ¥c×Ô®¿°Z‰•øQp*ø¿ "½{K`Õæ—²ÁùT¦fsSPmJUÐ<“µ Úìø²óÏP7 às€$0J#7ã0Gi4çW$od4ªo–Ç,xäï…ŸÓ?á]UïGañìÍÛ7bó‘ÈÜ}}ù˜¯§Á endstream endobj 4980 0 obj 7273 endobj 4984 0 obj [268 /XYZ 31.5000000 129.500000 0] endobj 4985 0 obj [268 /XYZ 38.2500000 94.2500000 0] endobj 4986 0 obj [268 /XYZ 32.2500000 128 0] endobj 4987 0 obj [268 /XYZ 38.2500000 94.2500000 0] endobj 4988 0 obj << /Type /Annot /Subtype /Link /Rect [55.5000000 599 531.750000 613.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_exceptions_from_directors >> endobj 4989 0 obj << /Type /Annot /Subtype /Link /Rect [75 72.5000000 126.750000 79.2500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_proper_enums_classes >> endobj 4983 0 obj << /Type /Page /Parent 2 0 R /Contents 4990 0 R /Resources 4992 0 R /Annots 4993 0 R /MediaBox [0 0 595 842] >> endobj 4992 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1409 1409 0 R /F1700 1700 0 R /F8 8 0 R >> /XObject << >> >> endobj 4993 0 obj [ 4988 0 R 4989 0 R ] endobj 4990 0 obj << /Length 4991 0 R /Filter /FlateDecode >> stream xœí]M䶽ϯès÷Ф> À~È!ÀbÈÁÈ!°ã†mdãCþ~º[RÏ4¥G‰¯‹ÕC/ì]V$UU,V«^½ùó—þõûáÍû/ÿ9ü0üþþËSqlª¢ÿçpþõÝËèö8üùдÕá‡_Ÿ¾¾=}~ú|úï·§þ…/ïÿzúÓÿúð—Ó¿?¾ÿûé‡?éü~}jTsúý—Ëï]£N*®¿Ÿþï§¿ýáðÛyÄqºa1·ÿÿ® ­Ûó2¦þö4~¦ºüúý‡ßžÞôð›¥ÒEYÕUšò ºRþûϧŸNŒÃÇ®Tª©Ë¦¸g"eêËTÝi UëCÕL&ºü^…½*›€£_Ö.NÝ5ÎÁE¹ÛÔõ@ cBèyü£·]pôËÚå 3ð.É`UÔEO"S”ˆô<~œþkŽ~Y»ûŒ‰Ðÿ˜¨ß/¾ûúôæÓiQõáëO'š\&ìûz2¥õỳÅr²ž¿þxøcqúÓŸ_~êŽM]Õºº¬¯RÔ—'í±í ëÉÇË“êht«nŸ¼¿<)¥é½€ëeˆÑªËs¬Êºm^>QêòD™ñ¥ï%Z›cžwýªŸÿª†Ÿ?Ol”5¼ƒJxâÖ¤4p%Äu'Ƥ¶—´q° (üž†-T±šÇø¯:¾«…bŸL˜à ÁdŒ0{>HXÝÌÀÄ)ý™ŽI=Ý“½’ûøõt<ܧÙUY å®NgÑY»WºÙ÷iÐî—åSJÌ<Ñoá;=Q5|ç|òуŸ(ÿyLëÿŽjà;|òÞŸn9W¼ó_~GãÑà L ¿>ÁtS˜?pxžʵ†»$–T9¸w ÞÛðÉ@5´``VM7’˜ËbÉÊ ¬GOnÄíG<¨„”Õ)‹†éXŒ‰ä°lÁa0®Í`㿈ضxâFÒ”Å^«Âþ,~g½Eθ8[ÖSÛVŸ–e- OÖÔ{Óš•6YkîIkª=˜qo MV;;HL„IAuÕ1×}"!TïÜ<6-dc:¯ý¤BÊ·­mߣ­ÐCÐg•øxha¬Êq0žø.‡l`3 jF?ñX½öGÊÒ•2·CŸ’‘ôÿÑzxÛÓZ@YFˆ¦uã‰D]£b6¿µ¾C!Eª¶¾qjþ0öäd[¯ß红Ô8áÙÃÒoŽc¼0=®¨±ˆ0.Ö\Ù\Lé‡9‰©„rÑ‹Z¹> ™5ã=Ž^Zñ$ŸM)ˆf,ž:B";YÄÑ ¢é' p³¸cµy}wïw'ŽG÷}Ä {9cÝà {x›³n–Õ#*„/uDì•ÉžÇ žX#c‡9Ò‘’‰Ô8bª¶'àÅ> ‘rIñk³Ë¸H'tfœ° ç0"óßãZƒ‘?&ß:a;½¬kƒq!¯\eŸwºÙpÀ²—JÛÀÑxìØ»G¼£Eýs¼0-Öo=™l¼õD¯Ÿc]¬úDÞ˜\ƒDotny×”–zǹGO{wŒß>¨^˜‰cÒÚž4ç(mŸ£ä8÷±Ï*kŒŠ^‚:FÃ:ÍãFÔÉο¨Y!îÕ…±}ˉ‰)y” NÙ¼žïËQw¼xÇØ’–Z±PY0%ÇfñN&Q'–ø2F!‘¬€oå)§D6Õ;Ý¢–?¥÷sŒò® ìàMQ€XÒ¾òœ÷ùðZnðÅKq¯€ÇgÝ5Öñ¹ÃÊÏFwÖG¼†hAÓÚ¬ËUG;õèe¢°¢—Ü¡áoâDmçÐQ÷½}ö®<Çï,鹠úW@A'MÐá÷Ù¤ëý|¬||nWÊzˆtñâp‰ïa2·©Ø'¦ö p ßÇây$2©wp¸†'6j…!|aë á4hª² S[ÇÜ8È^ ¯E2urÒK»¡¬Bz‡w¦0¡¢ žªS#T5ƒ’BEY÷'ªÙæ2/¬ocŒ²·f$L«× àÚ ŒÌ‡W€«*à F˜ƒóà:GMF̃4`ùðh ަ*8ÈÐ ×A(Œù)ŠëG±p0L-~" ¡«ˆP°ãg®¢DM¬ác¥ì½n»¹"Wä’ß"—üºWÀ—üÎÑ ë¤¬÷ ½xŠµË®Gݵª]\*…öŽÙ…I‚TAlA¬l°’&¶Æƒú®süÁ*Gø¨ÄkèÁŒÂ%ºL864ž?ÁÊKH*™JB߃û5D‹OâøW¬ø$\AŽOæød:Þ±Oñ¹MXqÓÜaäP†ÑæHö&œ`—ÞÄ> ä*V3¯W£¤±!ÎÈŽ'ؘ•Þlˆ»äÀaˆã݈õ5Œ)îTv³Ät1ª¾Ã01Ð.¯Km®I#8:+¹¬3u8¹ŒJpÆ® <Òú[K‚ÊDö@Ù q»VòuQY–²%•-ç¹7ÔP–Ãè³T& Ç?0ºsg1)ïúì?ÅÓ.ÉØÀ!í«Ò–~J»0ø©f%“OUžzÀSäòÉ'LÊík•©6+¢h>í]C ‚ܲ][ÚÖƒ@î9L:±TžLÇ {ˆZLªé1û¶\öðËMªn6iÿ“U»[y¤ºÃœùj"ð2ÝŠ1û6uír ûÑ’¸£åQa÷¾ƒÃ^d/"uZR…V㔑®-ʃúŽîO´¿¿èaN8ªå׫íaéИ8R‡·zØöƃ&WÕpm±pg=ÎjŒa⯰Y;-Ùf³ (/ÅíqÑê6:*j븉tA#‚œݽÝÁI•ÛmpDN`î™ÖhD„ Ÿ1a:™hyÊQ@ ´"‡¼ÃŒ™íƒ}ªr›ƒ/°… "åë GÜ“Q²j‹Ðÿ>f²ÆòæhÐÂÈ8“-ŽiŽ¥˜‘ï%¯#B@©¼N9XEÓKš!=FUÇ¢3·Ûã-¤ioX+=> uv3ý !«É­!o&¿ÐML†Å–]ôx¶^E.®çƒøaCnŽP”4ŸxFz.AÒ‡R”V¡¤,AfSI_²¦é®.·ñ¦Ü.>}ä¼6R¶Q·~3S¤Û~·M®*˜MFt¥n6”ðžJšý®l#…Ÿ˜ëZïÂ$Ø*L4IurÇo¥}.Ãu7 ˜SÛâ(Y&€|U<ø³j. îáÀK!ðPO 4C9Auà²à'ƒ+á@ å‚cæKñž#Òõ¤KÇ -æ XDv…bWJê+\üy8'gWŠáRH}¢ŠÝQé6¬-‹¯‰×˜Å”Vb*Ø æ3h*˜ù†ÍÝ9tQ;íF=3&ŽRm»¸¨ãRt4 Ê9"–¡ÒÅ=X†)û P¼¬a–Øå÷Ü‘Q÷¾öDx8æïR¦¢êò±À$ÁVÓz«c‡`Æ´éukî #…î†÷aTQæ#ÞCx?`¨ÊÚåþ¦`c¦ÐYdïYÇ÷q *R‡E–1‡±_ƒ…9RÄV3¨nXvà—jø= l,»4u Üs©(µkj÷ˆ©›Di-(|¦¨éªÛ/Ë]¾hÄê²íë7O…•(F]Ã2—Q!ƒ%¦1µzLñË‘õ5•z½9 EªÚR²Ãqàiëšv¤ÃdoÁÊ”…=ˆÞœPe3¥bÄ<ƒí„öܼ6ødPŽJ¨éBi7-3Du'U_´¹:b)¹ox¹ze»ê•l$¹ƒÚ!qO‹Ò>ý^—ÕÑÕ6«cnsdÃî½5©©xbüC Î1ÚC]Oö ‘>ì¨*•E -­Þ\Ûf@¶e@¶ðѰR•‹|O°¸t±È'¤Þ('¤Û¼äœ.qĽ˜ÊŸ{ª6r05S¹`*…ÊŽÅ›)*Çïb ŽŸµj^¥e:Ðð ¬Ë‰ÔD˜³²çL·²0.ˆ¼›,ðG9éöð9H)¤¤ÎO´=)ŸH'Ñ=t:_E°eÝÜ®}.]%Áæ"ØgL*µ.Áæ"X'Ýrì=н[›ç"XçÚö[[¯¯“Žƒù¹ÇŽƒ?²%µ²IüÞ>->åUWp72jÕaËãUc}€Õ*Ö.Ä<Ž28¢È¯Úa=Oû4f†|¥Ç@WÆWà…Œ¯xù`ÔíT߃H“ñF2¶÷¥’Êø ‹Ì¯U÷¨ÌߥMD'Ô¦½C,2¾ÂHÆêèš\¬žñâMEö.‘Íø )’2¾BÆWxVjÝ=(b‰˜êÍ5M*¾BSÞÁöiÑ eªàg¦ƒR¬òÔ”JPʼn€‘ú#Rm]y1Ð-ЦnlEófË&qMÀ\¢â¨t'ù–‹"P/–jBôºe•%"*ÓWÂÁV¾ÕJÐ>ñ…Å"Ù ¦'Q¬‡áÑ6O¿¥ ‘p ¡Ê£•ØyÙŽaÙÆÆí½q–m…&¦ZyMp†æDånè~—8¹›h DÀOg¶œlõ¥øî)HÃóM3Ž)-Üg¢± ¦yS\JºŒ>K°ÁézÁS”ÝÞ/Åçµ!E;ë1&ÄÜk¦îM÷kœ ü@ÊúTMaíˆY:©U]F ån)ºví2­PdP° 9 v6?8Æ´›6éf QÂãC4Õ«dQ^Ë„¨&Ûц!L&~´ÊC…ŠaTœ(Q¶»oxøò\Fbѡ֩”Å(á—ý_UåQ«µeÀÛ{Íæ|'åZù%O;$øÃôdeN ¹Í:6ëX1ËÄÏ¢˜ÉBPY"ÀÄM˜ÆŒ)Ûb=ƒÔß¾¡yp„ /)ÉX¬Rd׋³0RðÍá¢21QæZÀŸôq…%PàbÙá3j8ñÂ&§ ¡¬ö¹G+̘-q’7,ׯIÞ ç]â =8O ß10뱄ix4…Að—âÑð÷5b( HXôøö,-‘¯þÃîÝÖçaAИAyå „ÒÏcK؃„ŽDo鮄˺}C”2ãÊ&vÈö Á4`¬^ÒEÝ9ˆ$ ˆÞÀ1þ“,½ËÄP)ø > 5í€JYzPµ·ÕDµÃ¦ ¡{aM±þºÍPd"< Ç計ËrVš¨‚ òð˜þ² 汈“Iû’ÍŠŒf¨lÙ´uˆ.m-²‰‘‰>©ÕÍ2Cc…癜 &߆iJ+z— xj–j(%š’Ç„½÷y8l»îàv`Fó(1SÉ [|vZȪ¾J¥wFEºBÞ‘}ÏàF:²CÛ^ 9!§üFÅñ3È…Ñå1·#Åö(4ž£A,Øí×C·*êaÐ݃șŸä'ùI~rÏlbìÓdî2€òðõ!6ªñ÷ª³¢™^v|²ã“ŸìødÇç®ý“€ãƒe‡é^µ¹³D91pÕi81º¨ÆÆ¬Ù‰IÒ^“#²ÿš xB3o¯ç1EqÇ4üN!¬™qï>B3Gu|TÑ.n§GÈjèÕfÞIY aC›¸%uT5t-l)`wPì :2<û³˜ê5ZI‘Ñ]¿z.9û9ÉÖ¶Ét%\­ã„.‹†Â©ÂzŸ)ª©(@!Õ-&pÇ'ÑÒMÙÄ) +®xÃà ‘ÿ™0ØÆÂ5„û†kݪ¢›)|dZð:€©øŠÚ Å°¥uौôQj¸aêí¯<Îaô²X5ö“ŽH ØÃr}ùúw©vDCåÅ6N«à ¨ò8‰:¼ƒ«Öè!š6·‚~[i…t€ß<ð{†ƒÓþºþŽgÆ«Åk”õÌš0U”ØÕ,D_.za|Î-eÂL"áËL¤ã&£-d»yX¸Øug¨bÔ±Šã¸ó‰Ä™ÄÀN C!yì„HþÚŒ7 ª0a01±\8Ž»ë°%Ò逽öòà Û–Ì!,ؕƊŸÅLÀ–èÑãPR“ÎÌÌé"Š:*Ü`*R{?Ÿ£Q€ïK°g¼nÇ©”r"IÒq;¼§I«Z‹RLØ%H» ­„§­+‹$û¬¼pÒàn\WÛ[“ »7›+ê`z±Ú‡utÙc²à;Só_0ô¥ºÙnb—Î)Ú¨úvʇì Èúš>$®:êIˆå-|§­C'7ØÒsïŒ!©‘yÏ4‚I'§Ø’ÒAÛÍö ­zH1kŽf"#ð{†Ú€¹Ñ4zb Ýð;Šâï)u?÷ÒZÁ/ÅkScÖ(=¯+f8·Ä…€ÛϨÒÚ)SW{©ýø{ið²f82h»¹UC^á/Åó8¤¯ÒšùRÇ;pÿa}‚GÓ£õÔ[;wê h¡nS•£HDʨÜu~×…!/)®n(Þÿd«”W‹WÚ@SŽIgˆÔÔ9v£t@žªoo7k/j*gF^øXµÄálê—?øåé‹c;‡Ñç%Ü Wøp£®kkNáv-Ì&ðÈIaÚŸŠ¦;ˆ"q¬æuq÷𪠩0÷»X2‰LÏDÙðó4GŽqʱóeiýÍ9s¶]F@zU ”,ÁZáf;XpÆÁRßÒµOMcŸ–X-{l‹õUJŽ"(Qμð0-­ep¿3–ý;B‰Ÿ$xQyÖ¢j*‘›`LvÒ$7ˆHáV}é&«(© ¬\F1]E™Ë‡¡äõ>#F$‹'Ht&hï\£ìS‹)LÃbÃô§Û¾õ$W›ý¢•˜S ÊМ(“ßÛxŒd6m8‡ºÍöŠ„H’–1†w&5EÃåùœø~@ó˜¥ý=·¶O×¢\{l™•öù…³¦çЦô‚jÃgøÌg(<|gyåõéͳزwþóiÅãÊ?³²ò…­B8ÌȉþçS}øBp̲ f§cøjL阚oíÏ` —4¨Û9 ÃòÚÞ/aMaŽƒvºWÔÌ ghQ>|~ú?·ùk# endstream endobj 4991 0 obj 5878 endobj 4995 0 obj [269 /XYZ 38.2500000 435.500000 0] endobj 4996 0 obj [269 /XYZ 38.2500000 435.500000 0] endobj 4997 0 obj << /Type /Annot /Subtype /Link /Rect [150.750000 62 197.250000 68.7500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_typemap_attributes >> endobj 4998 0 obj << /Type /Annot /Subtype /Link /Rect [396 230 442.500000 236.750000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (file:///home/william/swig/github/swig/Tools/swig-4.0.1/Doc/Manual/Typemaps.html#throws_typemap) >> >> endobj 4994 0 obj << /Type /Page /Parent 2 0 R /Contents 4999 0 R /Resources 5001 0 R /Annots 5002 0 R /MediaBox [0 0 595 842] >> endobj 5001 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1409 1409 0 R /F8 8 0 R >> /XObject << >> >> endobj 5002 0 obj [ 4997 0 R 4998 0 R ] endobj 4999 0 obj << /Length 5000 0 R /Filter /FlateDecode >> stream xœí]I¯äH¾×¯¨3ÒT;oBšÞ8 µº%ˆša@£™ þ>µØÕï¥ëKÛŸ#»L ^ó²KDdlË›?~þûñŸÿ=¾y÷ùßǺŸï>ŠS]·ÿ/¾{ù Ýœº¿ë¦<þðëáëñëáÓáÓù¿n|~÷çóßþwÔÇ?ÿûóñ¯;ÿòÇî]þÁ¯‡ZÕ矿\¶µ:ÿ­¸ÿ¼üþ_‡¿üîøÛeÆ~¹n3¯ÿÿwºRªm/ÛYúë¡?¦ºþùï¿ÞÜ0o•RkÓ6Ge=ªÖêãþqøé¼@?}qj­RueëbÉBµ¾¬dksTº½€½,tý#3½ 0y]Öá&¿î\*ÊTÊ?»$r›¢ídL}›>Àäg0„›üºsq¨ôÈųK"·mû«UîæUd ׋C¥G.ž]¹Æê޵YÕ€ÿ}úÈm¬ 7ùuçâPéë™]¹­ª²åÓËOn Û„Cîuç¡Ø²gvAäZe‹@åPs[ÿoÓ˜\·ádîmçâPé;œýÓœYðVn¿JÿWχo¿Þ|<ëÕñËOç]¼ýøòëá¼Ùï.Z 2Ç/?_¦þÃñËχöTWe¥Ëëþn#º½Ž4§¦-^޼»ŽØ“57»êÛl )*4›º}cN¥­šzÚžMßö¦TÿÑ·oJ8[ ÷×Á0(n»n¦€˜9†;½² ãÛùX÷Ìöá:RžŒnÔDŠTê¶kÓ4…îÞº€$]öb °® x.3ă'Œ Œux ž0Pc¬[øÍô‹ÅlIôÏF\Ÿn_Îb-ŒD*‹ÚIÖŠ÷ µç #˜a‚X4ð5™= ÃÍb9âá8XNË’6–Óð}`È#J¥!Œ–áf3p[‘ Q%¾ùèj˜D]­És]ñ¹˜+ŽÙ&‚ózÎ3û>¨ª0Ú‘¨…qQƒ-«‡Ä/p¶³QW׆½¡¹=]7üŠœ> ÓÌÿ¦¨áÈÇù³)¼ƒïçï@µó×Ñoá:ïƒS©.—Jã þÀdªíN¦΃¿!öVà½5¡ ¸÷¤™½Œ‡Ëc’—•q€¥%eSNwvyt ÆË›KU™®cbÝ…R•±ÃÏÆXèÄïÑ:>2ï›^Ü™î£ #éÑ0¸zá‡wé©SäÀ÷áñ[2–¦„ÁÌà8ˆèˆe5†ô ÚÊ‘QiƒžuÂrnáG0Æs‘Ĭíj.UãçÑlŽpjýI=1hÄÂX¨?[¼·6ô nz+ÏŒ[y˜6=Ü Ó¦ëóðL"Hú)¥s÷o\êÔu ëtÙ0¶\~ÖWΚ³}ß!¬ª•È Á5p@þÍsωm²{‰JÄlP¯R–}ŠîŽÁÉVšQh«ï]Êcb‚˜G:QSPø™àíŒ!kŒR±a3žàZ´Z(:Vœ#æ1?ij1îWÆÆ%N:'°…¼SÔm#8ÌÑ— #ÈŒÇéžÜB[·÷J‰= {œ;uyåeQõÁï‚Ì“7ü¿?bO‘ÂÏñØ#…=8ðm4–ËóžŠß”ñ7p×øå¸ƒA³vœÆ Nã—lè½Ãxôà¿~Ãu ‰ƒ@ÜMƒ½«xd÷ü.ñü ñ' w3½áû㡈9‡Ä³½›/Y¨“b¸aÌa2F!q¸wu«Ú¹·ôm‚ËÜŒ¯çÍ×»è—8·¶ÑãñðX|Ÿ1ß`x9¤X¼ëô•±”DjJÉ3|Ó1¶¡¬MVAX‹˜®ƒ„?¢D,w±•ÍÀ ëiL¤3ž [3Œþ„)‘àžó@l{(žÐ!ñˆ…뱘”qiTjd1ýa•¾¯ºk»Â’Îà“ž? ë]Î[Æþ˜vmU6ã7ñˆÎÆø·ñybZ U]/±3’ßÇÒ<ãÃV ¾²ÒdÔ.÷ æå˜þ Í“yù1XóÄÖ+†5ÛRs~à:ž÷7‚?yty,µêÅ6PL ·­Fwê9¦$ÌÓ0]â;ƒé_ñx'ÖiŸ‡{P;ÄzpÌ›Q«rÁÍx"<Šú™ÒßÀL¨ÏŒÇÈùFÂkë¦}}iUÑÇS»HPå©hÍëH/œŠ{J÷C.âæ%ÁÙLøàÖÊ¥{Ûkn·’5pÏ—è7ø§˜¼‰¢f ØÔ– Zóq x¦G{¢\q}S&}'R‚=SH"=O_g²©ýOÅklêÀšQŽ,âYowuæ`dÅt€7Õ¢GÏü¬q ØL¸AkvëÆbÛ†¡ÅU:“c: ZufŒåfhë{½–X…œ“çuy Ï‘žä0¬c›ÇÍОSÊ|E Ó{·˜BSµfSèþÁjZ³lH¢çÑ]ï}¾óì}Ò}YXB¦°Kž1¬4†¸Ž±…yÞ[ ±¥q0“ô¶±ûŒ©|OüËäQÕÕýQ5^h¶Qźý|ëÔXžH¾>MFZÒKü£ëL7ÜÚmÚSú¼){J_)}»ýï.ä,õ²H…4—6ÖÒº³ÿ=À¨¶t/É >®pqâ½ÃMÎÏ vÔ.Ršq?›dÀg"smdâ᳦­®·÷PH!PYÁãÏÈY3ëwŰѪɺ óT7ü—©<+SW´ÇÅÞÇw’4‘-¤.J™Â½²çÁègÒ_]|F³:¬#3 ã¶a (ÎZS¹â GÀ/éë«£¦¬`HÅZ òÁZ>¾'D«îa`qu)½\° CB”â®2VÏÇÆJÜ4¦Ϊ Ñ3—x”Â;¾´7?v‡TÐæó•ƒˆÝ3óˆyG’Ô›5N²uuí¾É™Öd†ÖŠLʲë=™c'ˆú;v ÛK ÍÌʶ®´”mR·s¸u)ä3øKðóˆn1¥àûÁp‰^›ž¼l—•èèÑZÈŠHˆ5sÅg’ä²\”i1¸Â¥F¦²€Üd m 2-s~&‰V±D´×ççk¬.–!¬¤Þ°{)<‘§Üf e>`ÚË«TrÊéq$tÆ:ñZÂø(=÷FVÉ•›?€ z{ŽzÉ&©>fz¹üñಗù¿_… [³ÅX{–B>Y !‹ôUÚÅü:ËsÈê¾ÉEjºÇiBzJñ=ɳuº¾CqÍpø‹Š¼ Qèá„a&Œeȇ&öÆ”ÊÐk4ç¥+9Ó_g¹ÕÈ¡–ÖÁŽ{µãaö˜§Ä žL%R5­#èdúG…rÁuæ8—<ágÈñ-gBº™ú‹øI¯ê(¦àÂr40•%Á¡®+þ# {¾ˆ—B<›®§_Æé!ŸÌÛ²',`„ŒÚ1ôü÷‰òc.@ŒŒª¡!Ÿ‹>¨µ†Äáj¤f4ÞsxQØ÷rÙH4̰lšó¸9á3š°;de}ÀŠÎ-Ü"†AÙPÐ`ùŒMÔ齈dó,fðHÙ~3˜x¨Î:á…am]êÉ/‰‚jJÆ0Ù]¥^¤RËHÔHn {[XÙ“V“AM¸µf0©U…»2Æiʈca‡ÞvÅÁóÌé ‘ßÌ5Ì&xÔÚ•–Œ3y<ƒFdL—ø\"!±"Jw“n‘øLöá ®H¥{´€A†vŒ@òfÂI<¢C4ŸJSažì‰Ä)á'šY¥+¬VÅ0`$w—üQ>™%KŒ£“†w¾™¢o˜¯Y)…æ¨ÚGPèT.ñ⯖TÅéf”¾¸:éÐXž´kÉvYZ¾iˆÙà޺ʠ¾Ñï{öá Í«fëhû"œ[óú›p¤‚»6p®£á>iGWNÚùŒÎ³î:p¯ÓÕM}7!Úñ‘G#p6­!¬o÷¤:™+;žë.þÑlc°xýŒÜ¿v><0 1Ü=TYÐÅëà[ ‹¢ž»„wMÌfà7x9'þf¿³wüDPš¾‹gººÓ³£ýšQabþz¬‚° µ±¢Hæ<ÑÌÈo!\›TNŒÄkD˜Y/Þ=u÷Ý·uêÅ3yŲam†AHãV Þ^C»¢3dB—ÛÊY²Å]˜òD3pÊE+¡F6*i ÿe Ü$/Ò’O‰ÎñO&8B•ƒÂ‰¸8©a³—.²E(dŸa¦Wœó#®}4ü¼TŽe(e§¡ ”‡ï£‡Rªv¬pWCÜ»0RŸHS{['hIpeð¦×t„sÊ·*SÓÜÿÐuw®Ôh‹*ä…šU·¥õ4pÇ%0»ÁEoðIÇŠø„dUéà*‚¸­ZgÍ-L¨¸h‚õœ¤2&D†¨´æ 0&¢údåS“ñ;X±N+ãm娰B½3™Fò¸pîëéáÔ¸¥4.vF”óìíä:žémŠa@ôPÅÅX(°Ä†#x6…‹Þ1}dñ®E)¤Àëˆî íxà÷¦1%BÈ£7awóźV ]¶çÄu±©0D6ƉÍ*9¤«ý]¾¿Ô‚)ìËßürøìQ¥Âè`×=L5Dwl¥îÓã]¢ƒ*¥è0ÅdA\ãa^Ù|žéeɘf0TíZ‘ƃc°ˆàJl«qR_µŽ£™qa¹»CV­Î UðÆhñ¨DJªÆáeËq(Ÿi‘¶k¼Søs¤¶XTÅc óÇh†Ðe:ÖËϳSkû žjL«¬¤âÉÍK‚c™(«àyŽº„p³¸¾¤‹÷£? ÄöóÀŸÇŠîpóTÃ8™n¾“Z7 y¢†;ðìšØ–Y1#»Úª§—䔄k–DN°'&~ƒi9–Ü}¢hH¬aªb"vñHÆ\5ý]PpÄS É`!ò¢öhâ;õƑ͒¼Ö}d‰9‚+ïœß†­bWÅu|±É»á5üfk\5ç\¼kÅcË$^–¹-î=ž§. 枺ÄxoØ÷‰-̘Ö}Ö¼ÇâË¡ñ?4Û¢¹´k0?ŒA˜“ ñ®É„ÏéE‘<Ø"ƒxêäÏŒÂ=‹×™‚O á6‡ÐEB $zÕযÔä`KƒwÀäÁó±"È=ít‰˜ï9Ä…_qÔKø~êqÄZ,DìëˆxÔK• Å‚ßx¢%Ù˜8åx—L ;G‹¥ÃÞ)3£ø¦˜NÐ>Àªtå[X»*têwr[lŒ9NBeúIcÁ šÝ°ÎÃnæ§Ç^ÆmtÏã÷°ÃH®ž29D‰aÙ6‡ûcpFÏe±n]ê¦Û‰äûm;¯(v¿òI \ý/Œ½°²yyØ{Í(!á½EÆ:WøùnÅJ¢X¯"Ò¾˜.Û”5KP¡’È$\2ZÆ=ó¢¶ÍV¯+£I`³>S花=& ÆÂ ÿ¼¥Ô‰Í2³QµdÿïèÅ ê°*+WÄâ#à›’³Q¾³á­²aªàÀŸˆ½ê1w>¥2òÑö¼Çß‚SpXÙîí˜Éȵ6Q—#y‘¡Â=¨/I;Щ­ãqp0 õ™Ò¿=3f õrÆèX|a[ATkÊðY5b«ê¾®ÿ^A¡ˆ­ï© @äæ| ÷æÉKض­*lBù)žœú½3M´¬§ˆU ¬juh%ëÞ½É3ë<L˜§XÍÝ׸²ÜÃ7Åy¼¥Ó£W„Ú®¥“-ÕË_¤èètÙ‚CeL]æ±—  ˜ž)"MÅÌåÇég¡„ÅITÙX‰!2“MN@¥¼®]öõ<øeÚ3üe,;£Ï:³¼ÓÇ®¢%Øš ’=€} )%OûÚ9b:!³D´©\åX¤L®°„IÁ\¶y…êùÏñë|^è~ûÀß<´ÏB£P-ä¨m¿oÅ×í:×Îz»*ú¤o5Å^ŒÜüžÕp¤ó&êS§½àJ âî=ZÇŒ9ÖíícwÒ"ÖQæqöÛ–Š¹\ Øñ œ&Š™øƒc(<ü¦#[5ëè/: ²wùûyÇýÎ?@ÁTÎ'…9A¦ÇÄí÷C.ù‚p:D &ŒNÏ:ð]¬Æ#ú{÷Ìfá–:Ûö…azm–SX]˜SÇ&’Lž}50Ê‚??þy· endstream endobj 5000 0 obj 5378 endobj 5004 0 obj [270 /XYZ 38.2500000 498.500000 0] endobj 5005 0 obj [270 /XYZ 38.2500000 498.500000 0] endobj 5003 0 obj << /Type /Page /Parent 2 0 R /Contents 5006 0 R /Resources 5008 0 R /Annots 5009 0 R /MediaBox [0 0 595 842] >> endobj 5008 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 5009 0 obj [ ] endobj 5006 0 obj << /Length 5007 0 R /Filter /FlateDecode >> stream xœí]KÜÆ¾Ï¯˜sØ6I  g€CC Ç ŒØˆâCþ~f‡äì.9_qø±º‡œi ¶dõ²õ®ê®ª7üò÷ý?Û¿yÿå?ûoÝïï¿ìŠCUí?û§_?¼ü [º?﫺Üûe÷}ÿ}÷y÷ùøßï»öƒ/ïÿ|üÓÿövÿ§ã¿?ïÿú·ã_þØýÐÓü²«Luüýß§ß›ÊÿTœúûíþò»ý¯O3öËu›yýÿ?Ø`MUÂ䕳ñ&?í\*=rñìšÈ­jßȆþýôà_>"çžv®•¹xvEä–Ö•-€Ê*øÏ³ÇÀ­mâI…vçÚ@éP‹'×Ĭó=Ûú¨=OúåÓ¼±&?í\*=nñìšÈ ÞµrÖEÑyúðoBD¡pÚ¹:TzäâÙ‘ŠÊÅ“ÉϳG8NoòÓÎ#Éd<¹&fMÝÙšÖE`Ûçéc@ß›x¿Ý¹:TzÜŽfÿËÓˆ;”>ÔOcC,Ö‡º)N‡xÁ³y4ÒaäÒl6Ñ:-õ—gkóz$ ol»czð<Ób±¾f³nð£\€¹°0<×h'pÿQ‹ô!V•'â{ú)ƲIfS((03 â€!°€ÅBŽà½uÄ0O } Ê?®$öF¬ƒ¡ãÞ%¤r[Oc Žjwj$ÍéŽîì‚Óm’ïó çqp6Ç`I؈}OÀS!I³}·6£3RIïy{ûP⇠¾ê„·[ZÓƒ „Ö/öFÖ/t °ÙÝIçI¼ƒÆ<áIÙzþl£-a'Ep àôµ]ú®ƒBº£#'bï ;]`g•Øð ††u‹JãzÏóŠó7’Á^2ׄ°³XuÝGWŒë`p½}ès ßbPc2ÀQ‚}”£3ªÄK‡‰èà !=£Ä¡"ªÂÒØ.œ£×©ˆå¿0 ‚6ÁÒêÓà€‚0|wõ> ð e»¤ŠÛ¦Ò!×1 .‰ù2¦ f¬¿ ¬QnÌòKÌ‚g#D‹®@d¸†²¯}Jí:­MQkšÂù¡ É¥¯Î¸k!ƒý¬-ohj§Qæ¡ßBÉMØÆ‚´'Å`$ÞÖk̇ˆ³C^Yàè'ù+$†®»~=o R5°þ‡%\Y¯Øš¸ -Œ°º%¾jmü: ¦† PR‰4LÚ*†nP–±ó®÷cl`È2׿Å!Tæ5[ê2å¡hÜëc@µØÝ Ûi¨‚UºTz’@z–Â@${äqŸW“1#‰ îÛûÉLìcd836Ð Cº¡Ùw„PÄHY¬tÕCÆ{9´Âô×k6Áx#ŠNúôq%tmFúö[ˆg’øéF§ìç=©ÈÚc¦Ðjšf@GL¼Â5Ș®°0a„–jÐH0ÌpŒ(îc“OL¯Ñt™/è F,ðñ]0v5óCI=ÍP¡Xû1º›±bv"{H­²ú½{õ; nÂyஆ5ñ*ZÁôFœgòyDä|=àÌøZЕv°¦  ÿNuX`Ë1ðz:¬Byµ‚V•÷##Šz[ û0sÆëÝ÷¥©ÉnSˆ«YæIøWÀÜI¸*I«)Bƒñ=óbÓª>‹ ")JH†Äª«1<’È Òæˆ”TA•‰aù®@<©j“‡\’’G¢š„ß¹,ñ#ñ™PžÓ á>f‰¿~` á–² B8º¼S;½·BBL8áï€Ð¬s@J¹ðAR>«Ì>£xR,C/˜Ÿ…u©(‰ ô³@ÿ%%µÀš%¸OYx :—‹4Zª’U8‡*˜HçÍ^2¹ÄsD!|y}-eè©6}£mšk®E–}ñ¤ªÆ>Þ5†Þ5S3 »­¾”ƒR+ ë”&tíÂ4Ÿm¶b_}.ùšq‘²³#žñ%|Vù|–ñâÁñºq pŸÒoÜ’Ó65HöaÄ“¶æÇjk|}H¬³@»¥²V×+ŸB3¹Ÿ{“Oå™ëþuX‘M½¤züãX‘TÜ SR¢N%¤r ù×ïÆr9[/âI™H–7—i‚½÷†¡ƒm8âUµ‘ÃqVÝ^ØŠ]ƒïx\yIŽ„¶YYØÔÕãË¢6¯|©PŒFQ@¦:—ð®_µ¬¥%À\Õ%*©ËbŠ3ò¬…œ ¢þÆœ”Ú¸©;“´—÷mÕ 8QxíK˜Ÿ‚SB˜x&z]?çÃP2¥Êÿf²¡˜ªL:c’BU¶‚þæöZüW_»ë nsÅt—¦<_ªÝ”Ÿ2>^cĨ‚õÞ4õO+nµ¯—4Å¡}²÷BÏ4ÒQy°Ãw~]MÔKßÔÄlŸà7 úÆÛ^ܶÕtF"úÂlø¼Nç‰;*Ûãà:Ÿ_'µÝlæP õN±„ƒ3v`(9´ë¾Öã…Ù 4‚aÐÉÇ ;(Ô<>HȾP2†áã`¤3ã/Ía€×1áH€< OŠ×±ÄI»·u—hC´Åvup# Œ×Á´¿(cî¢*Lל» ÏÓEÈgñ\ǧñc'æ¹\¬Ø–[¬©%ÁŠ›È¬ %;ƒÄU@•ŠðÎm%çRÌD«‚ÑîÆ>®®ä% Ù­ ´b Ø0ëL–½ŒY%»7µÃ´>#i ó?F瀻-”u=ƒ2ñ+éLœŒ)€N·UYu¬Pu05»˜Ï¥û´È}Kà1“iv¤º·ùæUÔVvmØi[2}Ké+pUTéõñ|æXÖÛ,É7äJŽªšùd{ûuº R(âú.:ƒÞªD|åj‹Àئä¢î'ª}<æ DÍuáF92q-7&¢;#b¸ÂÝÏ ÎhßÑã¨/-cfL7·MÕcS7,ˆ½ØÐ§=èÄf ޮ˿k\h†ª có 4"¨;ˆEŒ+¿͆ñ+à7¾œO{ØpV.u¯òª˜`.F› Ö²jU1Ý&ºp|-¢{ ÷íeÓ”Aep2 ~Ž¿™z„5çÝP Çm³œª]0(œj?2`M_ÕèÅ[Ÿëm€î±n#3FÒè^ûÃÔD?FÜ^â3Ò{ÍÒŽº"'jCZÌX:¤kGQz·¤©Yå²Åx$šÍÍP0U-Wln³ñÓº•)ÁÏx0·×ZBi}F cªÂ²†€›0Þ5c)êRæ`æ¹ÑòA;ø¤ªT%4&ö&P<”‰øi§@P‘_.i³˜¬ Q”œ¼`‰`ªÀúPµå3Ó^[7εÑÖD‰¤ÕbûF˜Þ˜¾„Õˆ-ÍÎnM#Ÿ*;MËÄó_[DœK·y!åK3•ñïˆÙÏo“±ËÑã"zkÆ©²=¸î6š¥o–´¬¦$1–ƒD›^!¢‡9# ‚ {#o&¢½Ž*ÓT^šõx0«¶ ©(XüÌ:˜–™¨ ãYLõ?»4ò0í]±Üîq±äÊу1D×Ñ\µ´KÚÉ?P n]K‰a¿¤ÉzÊö¹e˜~‡–¬±n8w¡R~ܘ(a‰Ê½«Ç¿. ™=ýþ›˜¹¹]Úà3ܲ>>žä2™^Le>æY²jé.£˜üAÝ’¨E$ ¨Vÿ®pɦfqڬ꘺¯i†¼›(3‘©û,`‘HµVÉð’%—$ôc°ÍèlqóüÊÕš ¡qC²´çz…JU„ QƒÊ':Õ ³å¦ ëI쎙[–CzÊRÆDSÉZN¦Ž1üUsVSu] L´[•ïP®¶Ë´rÓ­+<Ãô §Lˆ UxM³tºP_Zª>9,¦b£ê× ¤dÎ &¼èM9 _ E|•=5’ät•[òx5§_lõÒ%§_HçÉé"æô‹|/Ê”éU¹äysN¿(rú… ë›?ÊéņÓ/ªjÉCáœ~!í:§_ˆçÉé9ý‚µWž~Q5É-¸œ~‘Ó/žG’Py]¤~(œÓ/ÈurúŪ}¨œ~!QÈc¥_ÔvÉãüœ~±þô‹ÚW °•2ý¢®Ý.nò¦|›1d½'ñ:ªñÓÜÉråþ|îd™;YÊ)a¼¥)–”é| ›i“/­Jè§cÈñ£¬s¶J!¹8»„廄TúkFógºÎt½Y+k‘©Æ.y›2nÑx«¾êDqˆ¦9WªÈÅ!’%%ù½å!TfÐ-«mVÚ팮öL ÞìÝ·&Ui67'³Y5í‹I¥¤ú)Æmä8§û0>×(n”ðŽÑ„aÂdŠá\µëû‡¦J¹KÑ[VЋ¾ -u?]/KïgÛfô›‰7•Ú.Â$D 渆,T¯Lj¿m±nl?´HdÌI6fDîõDå lkTUa`!T7HT+iŽ'LBqR=“ÖŸ*Ý~¥uc`™ˆ®hÌ Mtæ»®sÈ´l„;S~ï+žëí\ªäá/èE Õbvº=è±E7ÃݹuͬØe/»ž÷[¶þ%çæ …¹ât1./"j”º1ÅÆ%5!Žxfr½ˆ‡7Î NO®¹¾ Œ huíÕЂéœ!Ö¦ôx\¶Î_ÏÃ+•Pðlµž-Ñ¥D(ÎÍÿRUXèíä®Ò 6+cÉauÌ„*†Ç :šäS »cž¶ |qUB]óƒ˜1€!*gÄðÑgؽ7‹a¬ 4öïm†,c Ý‚}wTÂ^ 8;Ѐ>t0,Fh%*Ì ÁR¸Žr|à]C: ÉÏó£iühaQÏmµ¢mvŵ©ï‹bÞ(„f Æî„·„Ö7ØQ¹W[ŸçC™Éø€„5³)3™*8Ï(ý››SÜ?a‘ï`оÈ7î6'$qá'ùDºb€c™¸lÁEPà:T™Y¢l.“èÁwžþClã2©R-¦Ñ·ªÉ)-—0)-˜ÖÌÛº%±'dfq0“î¼æÔr¡ˆP¦:ñoãLèk­bãI0¯™ÄX®‚=ws7H· $¶ªç¤N¬4R.ݾ›Þg*|Ì[þ¦ÀñÞ„`ûŒl—Û߉ëÞ=ÝÇ«ŸÁœ˜º©¬t›½ÍJ‰I °¦¯Ç¶ÍÚj¹ ™„¹Ív! OÏ÷&á‹¡¸î.dǵu!Û$§æ*ˆ?æ*ˆ¶sÄ"WA$åΚëó¬D WÉ{mÒfÊWî®ZÜ‹ YÇ_ûïGV9ñóÔ\ák×—ØÔw(ÌÓê½õ¯éêÒ›ŒvßÕ…¨GK¥ö`Û÷H# ã‘®–=t»^à»Ý.pa7õºòÒÞ>u'½-ëbBøIŽÞR7kº£ØÍ¥é+8âÑ1 ž ~Ӱ̬£¿ppX‚{úóqÇýÎ?¢µl9Ÿ ŽsÄázL´ÿrÄ Ig$BÔ`âÀèÖÇè:–\ i½ƒÙ,ÜRgÎ\¢0L¯õr « wè¤Ó•¤öáE¨sRÞÞýøœÅ endstream endobj 5007 0 obj 4842 endobj 5011 0 obj [271 /XYZ 38.2500000 428 0] endobj 5012 0 obj [271 /XYZ 38.2500000 428 0] endobj 5013 0 obj << /Type /Annot /Subtype /Link /Rect [66 722.750000 135 729.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_date_marshalling >> endobj 5014 0 obj << /Type /Annot /Subtype /Link /Rect [293.250000 701.750000 339.750000 708.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_typemap_attributes >> endobj 5010 0 obj << /Type /Page /Parent 2 0 R /Contents 5015 0 R /Resources 5017 0 R /Annots 5018 0 R /MediaBox [0 0 595 842] >> endobj 5017 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 5018 0 obj [ 5013 0 R 5014 0 R ] endobj 5015 0 obj << /Length 5016 0 R /Filter /FlateDecode >> stream xœí]I¯ÛȾëWè`dö Ø~v€6à ‡À“I0âÌ!?ÒùR_‰üXÝlJ#yÎk³—Ú«º«êÍŸ?ÿcÿ¯ß÷oÞþÏþk÷óýç]q¨ËâüŸýéÏ/a›C÷÷}Ý”û¯ßvß÷ßwŸvŸŽÿû}wþàóû¿ÿö¿½Ýÿåøß_ö?þýøËŸºtúßvµ©?}üÙÖæø·âéçé÷ÿÞýíûßN3öËu›yýÿ°•3Þœ¶qeéï»þ˜æñÏï_Û½9`Þ*¥­lc÷Æ;¿7­·ûÿþs÷óq~úâÐzcêÊ×Å’…j{ZÉœV²íìÎzü£3½ 0¹7>Üä;W‡Šq•‘g×Dn鋹¶ ¢§éCÀ¿®êp“?î\*=rñìšÈmzè;‚s›€È­MP,<î\*=rñìŠÈ­3€|3VËð<¿þäMcÂa÷¼s}°tè½0ý§9Ó཈ÖÃwáÃw_vo>_´{Sí¿ü|ÜÝãšç_Ž`)÷?œL†ö8úÓþEaüŸö_~Ùµ‡Ê–ýƒŒThÄÂoŠpäŽ88òqþÞŠ¸·ðCÀ …ëp¤„;xGÞÃÀu0ð7c¡Ñ„>©Áë`œBJtç|ørdðмéL™7Ý»ˆ§;ú)‘%1‚ùDÒ/ÁýÞ˜Œ-¡¼ÄòÅ@Xc‰-H x<›€m8›°xR Q,} Þ†¤Q,Ëñ®<©ÀYg\“ª¥‹­3"žîhÌod§­Q_-yt-OKzß›òáiŠCU›¦.GìØš¶x„Ï”‘3ÛûƒwçpëóˆG#Ó1ë<ê%$ÌÈ!2Ó@h¦ƒÐ#žE´1‡ÒW¯`hð <èš‹îàìÑ7ž¶ƒ³P-ûOF¢³™€"<}']“)#E Gj¸NE#ÞõÛÁÑ…b˜»ù@é¶ôÄúgº5cº=‘ß#õÕ§ÁþÛÎ6þå/~Ý}#@,qÚ€%Þ¿>Nˆ5›Áš¶øÆ4‚™3f)H¥[¤Åy¨€ß ¥I,.Çô lÓƒ®#èÎ?tßtšúň…²“Ì»ÉÔÅ o–±œn’µÀO„’ÖaäVúxS D‹ƒô-P>c YÛD3`›Þf.ÞÎçAf¼G¦%=!ÜdqIM¯j¡S¤NýPèŸd¸Y̱º¶÷HÄ2P¢L#O‚FY zðÂCÄQÊ4ÉÇá¦1j1Ïk˜˜cÂdT#Æ(Æ6ð®Õ!µMSÕ a i’е·3$ÁÍhMŠ“ ]#Ø(ŒÁêÚƒ”ú¼Q&ónm5:—²>]¤3 žk¬0ª†²dÓ Ï_Å.Šé¢G0¼°ðĤó0Ÿ\TWåÔu¦ÅÌÃh˶:g‚øÂn-ÆÈPΠ JØ3̆wϨéÕ}²9q½‚@…ë5c*3¤Gæšsí> ¯{<÷À4eì3w‰ÑºLDz‰°cØ!Ä|Â8¼ºÑç:¸ãtÖea®R–‹±$æª:³êVýˆ9ö=_Íd3l[ ær9j­CX]‚37Ä8V±EC\x$sµ)Eë^ó¼—è cû! ~ªÚXÙåÅ]õÎy5gXÅžvrÍ@¨Ê²*¤Ñ%vŒ±†õó6HCêëÊi_ux.¦ãy5 .lvÅ'wu1"Ê >¸þ¶ëtÎÇcÚîmWÝ%“v¿8½í áãBS öM¿b˜€„×0ÿ¶k\1DBìv§- €xö¤û n¬F›ñÚŸkŒõŽ4’ç¢anD#‹ìþÜšûÃÜCÌÙìïƒFvýHãË æºAEÄ®.˜»%¹0 ¯Ù‚¨v É&F½Ý'¿Y¹fåzñ´Âõ¬Á²î³7¾ºÄÙå¸ÎÆYì8ë_‘Âup&²ƒYßx‡óñÞ`0Îö¥r”qF:>)άÆÕsð<îÍCÚ‰†˜YÍdËcœ˜Kà Îñ‡t€óΞÃõ0U©æ· tÀdÇ}š1koø¤ï ËD k\‡‚€N®P¯B¦ƒ”u–!½á*×ø'Ž]Ôöu»ËN¬]1ä1ÏvÑúÖ#½S–vTU¬ßñ:˜3°tˆXE«2æ* C¹l11ñ°ÄÆxT­:…}£mÖþ*!©z&ø¤Â:«k-¡£…1UaYCÀM˜ ïš±u© s0a6¦>©*U ~(±7â¡Lt˜Þ0@¹ã"Ƽ*7V«ÑBv2šE  ¬™ w •GªQ¹Í˜J,i·~äQ·„Õˆ-ÍÎn#Ÿ|»Dn•1™8¦$gð®_šÑ¨ŒGÌ&x~›Œ]æˆÑK§Êö #«V׌ÖË÷S÷t?•Fíúªjbû[ŠV8åz$ )ða-GÓ,‘¤w7‡Ê›:2•Sœ±ºÖbtº c™u0-31EF–CZ¬ò»ÑZXn¯°äʱKƒ™,1;4œòÁ"KȄﱢÑXL Û%}›bv©¨}߃I¸ÍŽUþ·nû@[ª5²$€ÚÁn´ÉPÈ™²Àðæ*ë„×ôº•רÍÉÂNtëPë& Mo6@•j _î·6C±¢+TKJ¦œ&´©ì-š0*Ù¹º©zXÀáO¯)¶~:®!¬ÃðF³p$|’¾‚ŠÛ2 Ðoêzº-B“†%«Ö Ý”É*™®!—£| „©Eº¾’Ïæ¸N ªœ&n£ÚÇ+´¯¶9œr½Á°½?¨r$æÚÕf a5TÓkÌSL/?Ó¸Õ ¯ A­ÐQÌr ÍS9&=_k ”¨úŒS0¢˜Ø°jÚóü[Ø›j²“¼óùQÓ.iƒ.HÈk#QN×.JÉ)[½ Î)ÒyrJ£H£9¥1? åNÌ”ÆvQÊPNi,rJcJþÝŠÒ.ǽ7˜ÒØ.J_È)Ò®sJ£xžœÒ˜SY{p“É!9¥±È±rÒ–ŠSl£'{å”F‘’rJ£>•×Eô䛜ÒH®“S“ÖZ9¥Q¢»Ji¬‹E o9¥1ù”ƺxJL<¥±.šEwã›|ç±Íˆœ7Ì º%óU£ÿ7šñ9ÏgH97»áÜ»$aˆ&ó°–e”²ß•£…EŽ’ú'b´°6Å’¶wdñoò•k % öà ýÌÓV)$7›’° |Ë:Åš…±[3]gºÞ¬F\ÕØ |–DÔ͸V}U9µ°6m’ì†y5+"õ§§fÉֺ…‚ˆòZÂlx×Ó+ÊèöÏr°WÏÀï î=ÝaJô='g>p—l¢Ø.§ÍÈÀJ6áÊL‚‘q­#¦êN*y¬¢Cr(st®Ñ/˜¼þÑ$X´¯[Všf¨çfP8¦V]%†¡Ì ƒ³ÕÉÖ?t\^Õæõ®½Ï±£ªzº¥?ðfo¾"\4*V5ÅÎÆÔ ôƶ¯4êŒ^-a2ËÚˆmpé gó@l)¿(hÝ­ÂÔ$Sý£d}ÃV˜mu —‚õŒº±Œ¸ÂFã5kn^y(ÝÙ6iàd D‰“)›x¨qð$ ”³¦¯˜$Tiƒ'²C­ïDÞìZöDªUI¡"öÍ€FÒqznDH Í`ÆÎ`H}l3AÒé‘AQcà0¥±:žáqÄÒ¨U‡žBÅá [˜UØ,#½0žð> Ô%¸Œ8e ^sÌ$k³?9¼P±: ÖÒ½^Ò‡swœX­ÐH§4ʃ¶Ô1oá7ÍüÙ ¼ƒî é%ëÈ"|÷D¥­«/ ñˆÃçùˆFÌ™ëƒR¿:8c/z —Î÷fá†Nwá|i×`ào µ‹mHȽ‰ðDÉÝÓ c{g` Ü1®"aÃPسuÏÖ.­iBØ5„(æ2<['ú/ÑžÆ4ã"¡R¸€³ ~ Få +^£õO,W@sîûG°[¶?Ö=O`±ºµ¸LÙ]OºŠ‰Ì BQ÷I–Ì]Ó%’èΡÌY-8¬‹'Ц¿@­÷¡ƒ™›ó ÂW·Ÿœ®¹Ã7zÔ¢2¶˜cVé¾<€œÝ=é¿0bJˆ~8B=‘eD1«ŒÅÀ„ yæú¡êÚ‚˜ 'e‡D*ñ´$H‡n¥¦“Ô5(ewìv!¶ÐEÊC1 ÜàÇ.Øcû¡PÚCUä`:üöY @”«1Œð‘)g˜E;ý1׾ѯ™1;®/Û“5²‚ö«4¯›$4$ëëèºsœžAÃf:o¨RE‰²(Bñ¢¤¿ Þuö©é> &pœÀ þô$½»ó몮êß;\óg™ã¼cŒ~ÕZe›Î´‚a_ô•ÿ˜p¾C‹˜H]P„J˜ÊñSáW„Áuðyp} ¦jQG\˜©@¤ZomÊn¬‰^£ºU…:)LÅŒÕJGÊ5(‰ ±ºŠQu8±ÞeNºMºÆºšŒµÀTe»Z;ŽaÃÔ¶czˆ*×8‡œÁÔÔgúYŪ…¨[YŽ’Ä)tz«½ròðép•D\óŠÐŽ‚gq‚»º` GðS-öÖ¬1¡ƒáç0½8(; W}Ä×idêlE¬»êË%e£a‹¨oSlÄ*m¾ÔMS•²u!e–©®ç·M:,×Ñã'‹û›2pcn[×6â¾|Tw¦#;Ó )Ç!µãÌl™¥á×îêtGtû"1zj›·áÌ®³õ“mÚ&À½ÕV§ ¿ÁïÜqç9¦+õÓÁ&uõ­y]”½‚1—†~oíÕ3(ëwâ¦ÓãØ%İ©»£;C†™,0BÞšƒ¥C¾kMá®5õ{ÓÊDï]¯ÊM‰»I^V×F”Uq7Ò.*ϸ0œ‘}ÏãÍÀDOu3³›}\™ƒ³›µQmä—dÁdm$i#}]mDdãÜ&@eÞ3™7„¯–åzqo2­Z’Eæ"VRªšØÙ)Ç8ÓÈA¬‹jJ¨ýSkú«¸$h UÏ‹¹§*ŸèÖUb´qK@Õ ^;S/÷ñIUa°þMI‰9˜©2ÀÀM÷m;ƒŸH¼+´hS|êYu5è—; [Û¬Ð"ð3õLÄû„Ÿ°ÍWqT˜ˆ¹u³äýÅúµNbÚÿM±èN3áÜ1ì“ÝO˜ð²[U –¦¨3„è#¾kI%ã-×Ú ¼©;Ió&ýª ‰x_ãÝal‰@¾ì#­1ceMÛGèn-V+B!TŽT?¿È½¸¦;SmÛŠŒ¼ŒDU·æ#®_ýº$à†ïH©JË ¿Ž¢0+_8ñh]kú-÷­î T+Þ„ŒEkÝ’ )÷EkË%ÝÑ`¥š7´ ¾'õ’(ð6«´066¥'°ÖÙæK®˜tÙ.‰¸§\Éó ó*†ñb½Ø,Tb$×^à^ãÌ ªc†¶¾#Qï6ßûz,o#ùÙ8bÊ`Žªf+'ìé ˜K!ß…ö{›è4'ÄBU{²F»ÿRõ˜;³X~ u—“–ý¢÷û˜b™88sOij²ÅÃY<–¨|.¼7Î(©ú)Û\ʵato¥"ùSÔ®!g 9áÄH"öSµ$K÷Ó…^ÈŽÆrßS¬~NõR ä-îœ-I¼°€1GÄ;™¬”$nSÜjˆ¤_ñêêÚT^°ÎÃi¼ÉÆØØ=ò­I‘k§îÅ%GT®§´IL°ŽÐè꘾ñ±«ëßä²&w@Gr”¤eô6£èʽQ˜Ù²}œz}¨ÆT±«Ñß>Ì5ïÄóäšwYBnAB6K^dFÌmlqiÕãŸý÷ãôâ꟮ýƒ«Ûk÷Í¥­9ã…)pÙ?Åçº[‹òàNQ»rL?õ¡ôUS—c*±kFòªtP°‡ª<ãe(³ýÁ»ÇO^`ò­ÓQã…o:~¸´·ÝIën Ï#œíÌÅþyKܬéŽ>:`Ǽ—¦¯áˆGÇ0x6øMwÁaf½~&[–àN/žË–|@kuÏ¢f‘@'F/|Çë1qþýXe½ §‡¨ÁÄÑ)¬Ñy¢¸Ù¼ƒÙ,ÜR§R.Q¦×f9…Õ…;tÒi"©½…GøðRN_“ÑûO»ÿÅtˆ² endstream endobj 5016 0 obj 4989 endobj 5020 0 obj [272 /XYZ 38.2500000 235.250000 0] endobj 5021 0 obj [272 /XYZ 38.2500000 235.250000 0] endobj 5019 0 obj << /Type /Page /Parent 2 0 R /Contents 5022 0 R /Resources 5024 0 R /Annots 5025 0 R /MediaBox [0 0 595 842] >> endobj 5024 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 5025 0 obj [ ] endobj 5022 0 obj << /Length 5023 0 R /Filter /FlateDecode >> stream xœíKÜÆÇïó)æÀ#²›O  g€CC Ç ŒØˆâC¾~¸Kά–œ_Íð?ÝMr5lÉK±Y]]类zõÇOßÿó·ý«·Ÿþ³ÿ2üþöÓ.;ÔeÖÿ³øõ÷?pÍaøó¾nÊý—_v_÷_ww»ÿ~Ýõ/|zûçîOÿÛ»ýŸºÞÿõoÝþÒÃ_øeWçu÷û¿oë¼ûSvúýáçÿÚýåwû_V<~næùÿÿàª"ÏÝ>ýuwÜfþøë·/¿î^õ˜÷•Ò5Îû¼ðÝÚÂíÿûÝOÝŽËg‡¶ûËuUÔÙ-ª]÷¥Úûn ×v+ÍôK¿­~ñ¦éþ'Öâ=äáÑ’û*¿°|ÀómšÆ÷(*|ãŽËG8ÖçmDÚy€<8V†Ó5Vx¸­¯ær®‰ÿ:ï¶eÛD¤œȃce8\cõ‡[WU 2ã>­ýþŠ·ø#ä¡‘rwH)÷?<˜ù¾Ùþqÿû¤òûÏ?ïÚCåÊ#ˆýWÓ“¼ '>Ér\­Âwšùï0lNx's¸Úk|Ç ;}‡OÞÏÿŽ7a§Ôæ?aò Ÿ0í0Ô| ŒÞ)B`œÆ”øÇؾÃPçL;‚<àý0!0 ^žƒƒò\öFoøN`9Št0è’÷Ÿ;5]ƒuÕ@/,…6)½=?a9È<Óâj,‰ùìq5IB¾ I}’½‚tÀ¸fÞôH!ÆÉá;®‘® Ä(ãÚx‚'Çü3`4 ¨«» H¾Ó»Ü°ä[±†¶gD¼ŸywZàw’òs[Þùù «íÎéwNß6§{ïŸû ¡NkÅñ'¯øé›”v’/,H%VaD¦‚Æz“¤*G ;a1(„%—à{*P§À« q”Tgº¼%Ÿ*2µfç¥ÉÞÄûIc-”îâî”'©¢àFD%$K|IÖ¤’øB„~ñä‡ÒšWwß3pvFñmî¾§å{:¤Ñ5Ÿ)Ó¨‘»âXwJµ=áê.BSž½Bw¹ÑáàM:Îxø 1l3Ãjcü2Ï0o2ñwU‘ØJV× e¦X¡ŽÇ· iÌ57Ћ—Òꘑ ×äê–ž\Í$yDŒyŽ0?õÇ•®RÅ;e)Â<¬ä÷ÃFÔ”8í:¼µ¢¹"S¨X¨AW“®?áª1¡²Wê3À=y„N¤F×q¥¦2Bé 'ÔËòù(÷ÈŒY ÊÍ">S¾¶Òl wbÚ¬H}ˆkâ$›GÐ{Re¢p#×±%X]a5¼aݱ|RºV•\FGA®{f(SS”úEæ’ Ýù“ÚÕ-wéî¶CfØR×V~Â6Êâ7Í *ÜÍ2:jr‡­ RU¹M¸/¼@U†×#Ä4–·.•_J/T)Ú'ô‡ Û¯=•gbÈ7åîp·<¬ÞMj•7·Üÿ¾kW“ú?Rèægø˜YXõåY•˜’ÞisWnÒꦻܛÌnl4öÍP+Þ´b#(}Ã?›{š¯xbÚš{m¶7Z›7q&·(Ç6iLé.qºÐelÍÝ!Œ¨ºÒ‡îÒŠsß z¿Þè\ÁO.Mi޵k¡oy².õR¢ í¬¡+@ë²Ô9ômfðÖ?]s§¬mj½uxàÎEâÀïÆ² KåËÛB/NvÞ;¦•(>u‡‘k šC74Ðâ½õ™Ó/öÉ_œ3”9#&èeæsØS:# ¥Cy¯æ¸J)• A' ®Ù [Í¡L,QrÁÆä‚ÅóÔËÛ·›íŒßºú–zÊ<ŸkÃ÷·/Õ¶þÔ®o­^Fo€° Ÿ¤ó|‡S¹ý®tPn¸òT¡!a›§m‘ºö³æc “hójnë¥9“§Ù†‹gv•ž­3hz6,Íifç­à´°*+ÕiÝLsZ§©zËŸ–ç¼Ûò¼u)û™æ´š+x=oqÖ7Uü1<Õ31’ì»V*¼‡ °š™ñ# Õ©ùÑV6UãJ¥-ãõm•NFÿ?!j¢ôMTºeʸ2G36ŽÎ`´‰aS 6º…m–/ú¤)žÔ2’ISiÊ¢Y¶„ó-uö?©Œº*GLvfÇ»‘Uß>§ÂXí…oü^ÿ®+Å ¯PŽ×hÇ*ÄÕgŒµ0þ*'(f B š}ºAs.ƒm &A#)’›³FmîãH÷&Ë(¥çܦX(JïýD2E±n•ŽØ’5#ô‚ªMeìÀÀXÙQ•ß$væˆàã\3R±ÌÓ®ÒÌ\‚ b s‚2&,A*˜gôÞ<…ÑÅÉ}>ÙŠÄñ $Qëý¶zj¸%nO5È-U¨o1.;‰”ˆ¤î\1¢uŽ'„¥¸ˆÌ9A™ï%>rWqö6X‘é:(”$ØGªÞœ1ˆ.ÑÔå0$º%õ¼æi”[Ó^U]´×œq§×G/¥@]*?†Ç1=-nÔ}ÇãÍ6ššRæøqúÝ(Û¦Q–ʹ|!¼ž ²šíX*Þ"DÓ)è±óâ [^™’<æE@çe£›w¼ôÆY½pÈ\L1ÈÆw|l¶;†Os¤MÇÕhŠ’M•Z•Ðu=¿,†¿m)+, S“m\ŠE >÷#É  Èqak8¶\”øÒ⻩^fjù ªs’/XNË:V @®fDod‰7gxØ€q+XGƒfŸ·g8}¬ÎšçŸÌ³C)ø†+z2èöòàÆá…!jvîfþjƒX;÷NKï íOs7©Š.Û©;qᨫCŽï ç}î÷øÄ#Þp5‡O µ·wŠ«yø‰Å\†Ø10ŠPRƒ1Œö.x§uqš ¥…F/×-³gE»T†1°u51•¸8›Â6÷ä Ò¨H©›aÿ´¤Û÷› ›aÞ7…Jw#äùýܰ˜á[Mœq¦²1-]DuÌ«]¾©Â9ñøÅCéJº-lÉ®Äu*æ2½„ËêSO‘T=’¥nÐ<§lùžÏA{êpßeö‰ÒÅAÙw⮉º¥èNzÁ-iÊâùΉ·÷ž0Ü%Ð>¹(Xs‚•÷ž+ o§ª:b5Ä2¬f å~ªRT”H©¦üÈ’¬]OÚˆ/»2îZlÑnI5R…‹Ýr’ÈhaO)®—Ð}rt8w“òdRFdŠÚ»1S¤*•R“›è­¡k·ÀØV˜2‘¥à•úÕ…«Ä#J„¶ÍÇ’X¹ƒ* TX¡Æ>_sq¼”¡Àö);ÿÂF ¦ 9rsV%xÇaJ<.m“?•q›Ê°pÃeŒ2l‰Xž”ý£ö’ Z £K=Î|jxQìyqÚBÙ)%_>`ÞVþù'ÏÕñ°NVL}%kͺ_ȵ/ÖLÀ0T„Žnl-N­¥ËŒ:*+ý!‹âã*7ÂF€¥Ò"¥M—ø[ŠºsPï~%ãIö®ïÚã‹«ŠîÞm9Òosj •ø  ‘F…· ;$Ozš,¥OS¥c|)3Œ`ñÖýñV茤˦ÀËMŠÏiG)„†sYû+¥”ŽÂBŒxSœù‹ÄŒ}×åÈ'ÃúFi¯¢cùœ^ú W“40ïååuª{wjk×SϹš‘îúLYDÏ[îàúYC½š>ªÝ¡š @è!à‹g¾ã/•ŠžƒíðSºÁU×ÅH{ì¡>Ùà@‚Ü9KCÎl#çÕðÁýËgm½~"[•àþÜA|„ü=}kp7f‘@Î5ÙqøãIô?ŸŠ×oH€¯àÑ0qðqßÁmäÇÁÓ˯ÇÛP€E¡}ŽÂ˜^›Û)¬ÎüaNW’¶ñÆ0 rú’ŒÞÜýüåÜ0 endstream endobj 5023 0 obj 4503 endobj 5027 0 obj [273 /XYZ 38.2500000 560.750000 0] endobj 5028 0 obj [273 /XYZ 38.2500000 560.750000 0] endobj 5026 0 obj << /Type /Page /Parent 2 0 R /Contents 5029 0 R /Resources 5031 0 R /Annots 5032 0 R /MediaBox [0 0 595 842] >> endobj 5031 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 5032 0 obj [ ] endobj 5029 0 obj << /Length 5030 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾Ï¯ès·ERÔXðø ‡† ä°È!ðf,²‹8{ÈßO÷Hꙡú+I_©G+FÖöÈɪâWOßþéËßÿüýðöý—ÿ¾µ¿¿ÿòKŸ5ÿ;œ½yù[Û?ÊʾýúðýðýáóÃçÓ¿?4/|yÿ—ÓŸþw°‡?ŸþÿËáÇ¿~øSûÎÿàׇҔ§ßÿýô{]šÓŸ²ËïçŸÿëá¯8üvþb7\;™×c ŸUî<¡¿?tË4O¿~ÿöÛÃÛ†ÓFñ.3Eq0¹Ë¦Îíá¿ÿxøù4@÷ùìXçÆ”E^f· TÚóHYfÆÖ§Q«þ@O¿t>o"|ÜŸþíãO3W§Šq…‘¿®ÉÜâL›'æ–(tùz ò—yïãO3×&JÇZøqMΞ‘쉗¯G ¾ÉbröiæÚDé8 ?®ÈY“ÕuCžÊûÔï>ƒµµÈÍÌÕ©ÒòVøº"sí…úyVé“ÈÆd®õY¼}ÛÌ\*-sû_ÿ<å+x*ÍO€Eø]xññëÃÛO&ÏNÓ*_>MîiÌæ·¯'¢øÃ›³XþöÓá‡,3ù_y¨…õÝc<±5z’=¯UðüĪÎÍÀ'á“÷Ä JÍY8†nx=žç±R‚§ÎM§µƒÜ6Åô•:ü¯ÒÚâ¹Á•âY »$[®„XøNŽåÀÃ'pÝ]÷–Ñd’×#ì,<·UâC‹9‡éÖÌúãד‘]¿Ÿì’Äúý\7äp‘s8ǼWÕÙ „'ÐúÁú]À øDyÂõPø„uõÆlŒK/Ö`„=)P®Ôb„ĶêáFtuµ€Þ‹ÀukªÄ¸®»›>bÞã݄ߙ]QVÅÝ ]Ò=ãÊÄ{æŽ|OF3¶ƒ€åp¥Ývw÷qå¼û¸»6Š£|±k£HÚ(Ç>‡®6ÂñøNŽ%–ˆ01FW3¾ÚŽëÙ½aÚé÷ðéC™Öù 3ß«Ôq Qì„Ò㌛Aœ7ݨ86 iŠc8Ž!è&ÖLÄ€1š 9kŒÙŒ·†q‘À8Ææ¡ð—ɨÒ@ȨZöó×;‘k]©"lRAÞ"Wy‹7Lþ±Ä¦Ô-ÕMyPŒ— ’ª¢Ö÷ƒZ]‹ØCƒç²G·T׃3pøI‹Idù\exƒ,ëÊ¿ª½°è<Î"<¬ÜÞ”ÃX%Bù¼‹×¥ôNòªóSïÇ;b3DÍÂî5ì^ÃÒ½†ƒ)Š#²—‰ˆ¬Àm¬y1E™'sßZŠ&ÁhŸ]âV;F'[éŽë;®¯×—\y‚ý&ì%Å[kw¼}þO;kãÆŽÄÚÝ‘xH\\x²#±0–ean„$íH¼#ñz‘Xˆ /xÏ çUp´GNÔÐAwž=AwaüëEÌjwn’ u¬êìi¦á®=)á“FôòcîšVlÏã4OŒ9ú¼¨NCVù£³•yýµ&èºW^<ÉÑ8Â;p֭™´ƒ©ƒßiDܸn©¡rmn•& ÚöÓÆ+m“$W8'PrsA ¤(%½˜¢§øЪÄÇ“D¿Çɱ@<&± –.  ÊC{lF‰OÎ%m$ 3Œ„à#15RíC•„a®^`<8D„’-l|ºô8ˆt=éQVM¡p2ÅzëFó1û2”y¬TTÐK _¼Ý'yóÎp°p+"œí¿= Hb’–v4IÛÊ—˜$­C›ÓÕ¤ëüͲðöòj2âª+ò`U™ õ=EƒÍc¬h4€R@uL ÂϘ á;O,(k‹ð–SY«ŒÌ ÒŒñ /ó5ÂÎ|»¸æ’ wØѰÿ…MÂð {Ú³KñÛŽkð¦çÝ‚ˆÚÒ8 mRg”$¡OÈt~˜KLȉPó‚€2ƒç¦V÷6.ãš|¦â^.™&tS+…›¢¡Gu0õ5µb‹F­TµÒLÓdÇFÁ¿`|ž´ î6´ Zm}íjúׄÔè¶øÉ(M`Ð×èk­ypm= ¨Ÿ‹aq8|’Eg¢ñ.äb#îÅÑXÚ¿®à¤{³}MÑYE¡Y6iÌÌ_¼ÒÖ8À¹öµàË£ëY± >À•Âq°„ ³†´Æãò g¹-PŽƒéfÔvÌ@>¯²—f§Ñ+œuþþvEp`…3é!¦ÄA·•*˜Ð-"êÅe˜ê&Tñ¼ÙÂLU"V ÙÝb€ÄAL&ØD…W]ùÄIJ&Ä;…f³0çp\Ï C$êæ¬bò>Ttº¸‰ÓÜT¦§P™`"µ¹µ"ª)ÐJ,P9öÏÄ”uce¬²ðyѨ»@å›è”&stm#p=˜¹ŠYœYúŽ =$d“Læ}h¬²1Ðîk¨ÝuL!1m‰× ò&:¡CÙcÝGSÜï ëAÛK®Ä}ºÀqÿ¼ß™RØ.¨m»G7Í@w=”öªbMÖËÍ-"¡Ê­T©¤ïƒ`Š*à&.릪êT:oŒ/-c¬XÝø‰`ä¯K£jÑãÖÿ ÁMlÚ«D™-lÌèØÞd±“·ÝÇ>g•ŠÚUf_VUùÌ=à• qM>*Q{ejÏùý ý£RÇNE”˜h$!F:í‹T¨D¤¨htVªè‘–,B“Œ‰Ç3ò kàÝà\*…CSµ}Ph)0mŌţhÔ[áG»‡TFŽéê²àŽªL¥ÉFòK.ap؆¨1h-%ˆ¹#ø Ë»ñåw*N1åÝá)1ül ÝÃ]Ûˆ{Ív!Ñbý·ÑVǑшÔl¾à'Y¥ª¾´ÔÂ&vçð;LC˜DM¨q0^©êÆUé3½°åÄt¡crÓ³Gž¨+éŲ£Ú©A%+³€Nã»öè¶~£¢-¢²óû·‘C­éÓܾ«'»(EÁ>ÓµÃuÏž¬ÉÕYL¿o­2¦½fe¥‰¨ÕžU{¡Á3Äà& ¸¥>øÏ´ŽÐ5§ˆÙ³(«J-QI1 Yo†€äî’Ôõ-WÝL‰&L°<ç·utû.ùÇìNër+õMM– Þí%œ1Ö•ã1úî£yÓ’QÐôLv@m¨,~t²~¾hë„•†E±©”ꆴÙ0ºlYL]J¿ŒžéY?Øæ:‰ÆvmßÓgÁGÞðѺœhzEÉÇ\S„”š«â)[¤¬p¾J1®Ôæµ µß‚ÍÌ9c¾ í„%Æ&\~¥[¨ªê“õ8¸ŸPx 0)ÛÚÌu€I|Ÿµ»zóFE§Ñ¡E( ÂUäØ@Å“%f Ô±§*M©½y-}Ó|#]ðS‘¦²bëÛ7_ñœ°%½9öz b§5PÇ­¡1üã&&ØŸzÇÁÍEpy¢ù¾ðž\©ÐF…¡±R‡gç¦Úpœâ^)!½°ôâ•.˜ÖÔ^ ®3¾F˜Â^€(¶©R]©ƒOð 0’·èŸFç\®A¡.Æ Ö- 1nNE\·"\\²`ŠÙÌÕë¤ç~h àF"ôÞi­Mk¬?R\i"{ò&+«n0«ÍtPΙ.¹õžîùã ÉÇNøxW› |Ì[d³"j÷ø}çmåÂíù€(ÓHƒÙ§ó×#&Éž—eÀ¿Åèà˜:ËùëRuÌ:¤4ÓÕ¾Cõ.$"ÏS PðçqaðìÕF©*„#×!Í×,qU‡V4÷•âv2]PÓν ä$!^Ê5Ñ1Ï¡6T¿IgÆ…&¹,ìnFgaBæ/DbNp ÅÂÄ´×Xò)¦¸Ë(¦s\¿…+wK¶·Núc^µ‰Ob´u)ý£¾)“þÆÙNA·I¸é§qX/Tƒ§B‘äh€ÓF Ñ.ƒ}?)Ð,ÜÞͤó1ï™D²nÙ–$b¸8@¹H½à}f‰›Ò©²†x¥DQUÃÌšI^3im,oX®UËð¾ŸäÛÒ‹*LUëtFbU¿F%àá Üc:úڬܩºw­ {˜ÐµëÔ@‚T¤ä½-‡ñncH8i¢^±ÁçE7*´ùZ­9;7å‹K;QŒójH†çãì°oœ{\\þ­dµìúÒ8{¾º§½èïú?ìúkð%]q‹$íú{~ROe/Ðß ô7Hk¦@ñWÖü׫ëêœ[ÿ–±*ð®Mè黺ºA*æG8]ž`IÂ+Ås³ØJÂ_ƒï¤”ŠÜÜ[‹u¥ë0]©X±¼¸âyaòÖ©¢^ëÔTIyï/±â„á¼ìZ¤,#BíM¡¾!"œf¦®‹]çX¶Ít;Љ%ÊÚ 5cxGâqðzð 0Ýp.{HxÄJÛºw%OŒ‰ bnߟ*¬”X@k"ã/H/1Av˜¸"ÔêL,’±8„wðÜê0è‚y 1ž©¿Ô¥u}h²@!œ$‚ ÇJÔÀ…çP,r¼m±À$1öª2$“\ŠJciù›Ð êDÁ#`öšnüNµ^uk5<{Ýò^·ü4sÊc~o-­w“£‹zPþ™5`¹¤Î£0V#±˜ºÔaÐŽñïÇsR=­CEduõG"‰ßšfYrÕe¯y!Æ_gvb~üÆK™6¦12µ›8FØRUWK°ŒŠÉ"ë²ØÂé»Uf pÅ$ƒLåÒæôæšCÓ쀄5g…½¥.ÀAdpït¼ÏTϼèÎÍO”«_ýбK9>½ gà`®:mÑÁa]HÞ0âçpn[‹ž +MÐ{Úå~p7QûŒéÕÂPkGˆBïÆ›Àëaz@l í cwâêI;g—*Œƒóë]æ´Æ4AK0qxŒXÀœ,ÓƒB@oUºy¸¯?Š|pÝ r1Y ÝøÞ›º2¶ëN`ßSWBæ×9‚þÐÍVáq˜“Ì9>U+k!Y¹áuïÕ$RüÇï‡:̹!¨§„ø ñ$ån*3{ÃnÂ2†1öŽd ¯”ÀXOô¼½#Z«öôØ¥7ô¦ò ’¢ª®(óP‰Î@ïXCæ"f¯¯I*åùeÔ„§,ËçËúî&£/Äu­t¯¸§ú€»Ë'¦A®úþj‘ä"N®ì˜¶cÚŽiK´Ê\úsï˜FUiï(´£Ð€¦$8Çä-™Jõ¤Xã‡ûýÜÖçè™(Ä^3¾#‰\8^¹déÕÍÎ'ÅÁZ¡Ïصwp¼]÷$3~GõÜ ÐIˆ¸%’éO•êÄÚ:µ^²“̩Π¦êŒ”êä/>×IôÐÕÕÔ©œEœH¬M—¬ØcÚnÁ­Õ‚s{×ýÖ…ÕÒšéôï L™'¯ÝM~Ê~kÏ~kOBì·öìúc‹´fníÑÓHEäMÿÙºº4ÐoÌDcŽ>/ªÒ¿XZCÜêXÕÙÓLŸŸ4 ȹ+ý5r\{ç=|~­M\ùšÁã๩΀ZéDë‹©ìÚ—F<Áã´Ž^õüÌäw¹\ðyÌÖÌpݸcž´Îñµ'%Ëêøe~ ?‚å~DYL b²˜ÔN«Â¥c̈mÄÎÀàô–¥9Oƒn×ÇÓœ*ÓÄ';:[ëGqÓœàà ‰#êFï| ûä&puŠPjÚup)¬ØM—yAS¨îT¤K¥â£ì­M£6râ;‰äN—:bŸ¨òI×h¢0}`†qh Ìe9 j¡ˆJÒd¥ µd+Ù±(Íkï¢ÁãYí^K%ö;šMlì1ÜÄm®cšØDv…°´|„€†Ÿ`¾âwÆ#…ؽ„Må®mÞEa@|ŒDôFïz90eO³ëø]ð§±M„˜³Û µel/¦¤vÞqˆüîr5„îÍEå&ð»/xë¶¡0ÎxDlÆ‹ed_×À„_ëë¤Dahj¬ ºÁ䌛‹vÞˆ²ät‘UkYÖÚa±©UŸàda‹£çᦠ7Ç$jsCàK!c;`º;’J›ap  4‚ß”áŠf,5"’a±»—Ïí5_ èªFÜÊenÆã#f*³•1dæ%Ødxx¯WԆŔe6Ýþ( leU3,ïÎmÌj”„$|-º¬O;&Ø9«òh‹\ÇÐÈ¥ÆNânr7„ !crEæþ‚˃„½ˆIÌä—tí݉’i>‡ç4è– dè‡ÕÎ û$²}^kXrb1÷lÆL/V.”*"TÈØ.Tˆ@«^Å nV /©°™¿4%uŠÅÀ¤åRé·5[3qµA^ù|blŠYÂhóëðuÌ*s#ñk&|!‘%½êÁÁ¯Vk‡Ü(Ô`Ê#áÖF„W $“¯Õ àY‡:VWV)s&rò$•:NT¤7¥Ò– )«f×fΑ›¬§:…›Îˆ;¶pwˆdýáq§¹è%eÆ kè.a_Õ‹PÆÎL+Eìš_S‰%UDà#qf/A³v^aŽ¹Â¯ öK¢Zë8~G‚à ¹¸)ä:ˆ2|–º5DLQ'3£aTR’ºER‹ÉäæŸEüôëðý$Ë¢¨ú#öBuµþòÄîÌœö`»’úÖ¸&òÍâË+Kl R{´MaCÏ(úOÚÃ|öØý "(ØÐ8nH1^›Û§v¥=]ÓŠ<öOòP1âÌCÑ_`+¤8þƒeòÊ2 þ|§•V3ié/Ê_Y;ÿù4ãnæá>óÓEÀ`ME‡ë8ÑüüåŠ?@Ö`áÀìÆËh[ò]C×wá2˜ÉÂ)µ6Í5 ÃòZÝ.aeæŽ-:5¿hq¨Åé!Œ>|~ø?a@‹Z endstream endobj 5030 0 obj 5480 endobj 5034 0 obj [274 /XYZ 38.2500000 581 0] endobj 5035 0 obj [274 /XYZ 38.2500000 581 0] endobj 5033 0 obj << /Type /Page /Parent 2 0 R /Contents 5036 0 R /Resources 5038 0 R /Annots 5039 0 R /MediaBox [0 0 595 842] >> endobj 5038 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 5039 0 obj [ ] endobj 5036 0 obj << /Length 5037 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯Ð9€Û|éì‰ ‡†Èa‘CàÍ&Xd™ì!?êÕ=–ú+µ>‘”Ô­5víZd±X¬7«Þÿéëß³þ–½úúŸì›ÿýéëAË\µÿd§_ïÞþÀTGÿ第òìÛ/‡—ìåðåð¥ùïË¡ýàëÓ_š?ý/3ÙŸ›Î~ø[óÃý_:ý…_¥.›ßÿýú{]êæOêüûéçÿ:üõwÙ¯§»å<0ßÿÿ;S*w'0F–~9tÛÔ¯¿~ûöëá}‹€i«äÖhUeÚY—éÚ™ì¿ÿ8üÔ,ÐM¯ŽµÓº,\©æ,TšÓJª®3mj•¹fÉþB¯¿ÂL¯#Lž«"Þä¯Çж…–gy¸y^µ*‹èïfþÂÚˆ„s‚<4Rº£…“‡<ÙÒ•-zš?G@ÐyúØofH7¯ÇJw¶xö€‡Ûü£<‚šKÿ—é#Lî oòWȃcÅ®0{ÈÃ͵kTç0tž=ú ïⶇFJw´pò'[Z¯ŽXå" è<}ì;eãéi-äÁ±Òí`ö/SfÁ ´?êþ‹ðáÇçÃûÏÚ©£EöüSÜëšíoÏ RòìÝIÇ7&{þ1û}Rþ‡ìùçC},LÞ86¢±x¶Ž|†ëð†M=¡óÎVÁÙþH@]B¼iøÍ'ø †­ýæÓsCŽÑ)©8¯j§ã×b\AªÀ”dঠü<…Ïެ™b…›þ1!ÕÕ(<1F qÂø› t™¿F—3ðK Æ"¦ù+Çb£ ¤Å"5¢¦ã—¹A‚„|ËGCNˆï°†ë8¼Sx‡iYà/ý[(y¾3jƒo-†Ÿ)„Ñûð~,æuBç‰ï³ÅRÑy¹'̵Za?X‹Ä¡u…•ð‚v‡ùÖ °>”sa¼Y(%4Æævxc~#܈7ÌV¢;”n=ÂéÂl ÅbK:<q7þ„%*¾é„î` „åªØÃÁX¬‚œÂÖ4AU‚ÕCø4–×.~@èÞaý€Âù0¶'¦æLƒZ&ƒ° Ú?ü&gä!w“jåµ] }é*Ø‘˜@¨»ÆÖA}V›Ä”ämÂ4»³z+õ H·ÝبïCÍXÓŒŽ€9!¡Ù0Ú7–Œïœ²3íÑ<ñ:˜öƒ`Mzå>[͉rQÜbkß@8–CR–›àñ$2# ÖÇðÉö¯bb¹wF˜«®C#t*u¼õÞN8ÕM·Ä­Ýoú~ÓÏ7ݤΠëQfr“ŠMu›6Û" øä0Ä~‹Óˆ¹*öb: ðæ`ü™ •¹BLyš(:-à–uÚó-¶¯8`¨½8žtÿ0 ç aó†Û$ óBw„{AP%>9BðNƒQòˆTª³¤;`Š–[÷ÑqÅ4òVþ5Ü£ÃtC}b¹öMÕ3€°ºŽÍÁ 64°‚-˜ü† ÄN±©çïýäC“ÙV0¯¡Å:¤ ,c¾ô¦O…ao”ñ#@šÅ¨Lsâ0P&3vO0üßA|Ÿ˜Ù°#†9oû¤‰ `ÛÆ†}PO±Eanòž,Ä,œò {ø4ñA`žÄðˆÛYë‡%s¼aÞ‚ž&¯/úóÍr€qý o¾ºðÖ9»bvŒ}µp6á¦aDbþ‚‰‰c”G_Fâ´Ã Ê—>!(A?EḺLàjøñ u…e– «Š.Yµš Z[Gý¨º]¸ wv@„Œ€CeøfRQçÄ-Ãá¨ÂïGÍÑ7ðùp»&‚-EÆ #8%ŽCèkyãé`ch" \a¦{°Âð¨dL;(gXLð§ŒO—U·ª%^$ãH/SUUˆ(­Â‚3ͨŒ] Î}e2\½íòÖà:£I(¶ÒçW²xwF±–8{á¥|Pêr‰(>T›†’l9zŽ®½¨f#ð+œVÐ7FBÕæMgP¾œ2ôʋQŒ,_gç ô‚sÓˆZ aß§¬ÚÐ(š£÷dù 1ÞºHƒ‘zVV5ÁqÝ¿!aj×19œËײ [ˆÀuØ·*Ì‹`œå˜RÔºËâ´ì±‘4Ú®f®/s—¤²ËQ‡ïÆ"~«Žù±SÆò¡tµ‡©­¶kM3îs5«ߊý'5x ¹¯U—LÈßÔ„:®UfN§Ç‘ÂûýK'GÈF—f¤u`>†5ó;õÅ2ÝKb«ÜœŠT»u.ít·Î“j‘V©ë1=$˜ºL,0±ÐÇÑQÖ|7©NPŒ^”ª¨±W…èý—Ôª6R+Äj5§ÛŪ%"ÁcŠ£27ý‡¹'Û•Ö—žã»´æøjX‹hyƒâ‰îÙªù¡äLØ]_à¹ÛH_«‹3æÖ•´º¬¿ÇÏÂgü¦oúÅ‚ Ξb*Õ/¿SÌ•O“Ñ[0lÇïµkÆÎñ?†­Ì+èzx&¿.Qw‡ÇñÙPï´_*Ó+”É1Ç8XEÝUkòÎo›ªšéÉ+Ò¡æÞ6%*t9áŸ0ýàÙ%.Ì´vFªÇôû´ós­›žuö‹+ÏpàÍ›µÅÙ?zgZûFuó ™¾÷Öûg£gºÛ[I5*[™MÓ ÕûjÅù)Ïޙdzÿ‹é{vg8`ä¦`Q? U ÷y“\5)²õÃÝ@Jjí9 KÔO‘;?_Š;?R›».Ìõ8¢`ÓIi¨¢è9©ÚÔì6(½0Åq,þ&ѳTfL}Xy!±áŠ,øž _žÒÜ™*yãÚD#m.¥íÔ4^Ã4\$ž§1íi—ÇN2Y€y lÐåpë®`OGG”ËÂõØè•ž"SŠa'ê {pÁi=#Êc†³;R•G«O ]2-ˆÖ+¬K•òNÕ ?‘-*Bþ¦çS4ÏPm¿ùYa ôÄ\â*‡®,{Âa›îÆMý"ÊþÂèÞù2 z/‘ùƒ×Á\òözÚL?c† [¸Ag €¸=sŠêð”Hb »’á†Kc6²ñ[×=ú¿S?bDRUE‡D»›ZtĽÕf` a(5bñ†&˜1ÝŸ>"ìïË•ŒØTˆ¸vaà†^L@)0²7 Ú‡²šnoÍ÷ñLàz;?sŒ“;=ÚI(¦v`û[ì´å v\*\Èr=á–ú·ƒ†Eí”·Dë½åd"³æ›LOÂ'ðç x i@êS–JЭÚã„ %Rì§8@ñiàŽÌŒ @¼éšÐûßŦòæI¸x!ÁÈ™G‚뇫Aq?%»„©_™ˆª·xd²#†Î޵dòDµ:ÊžðŠs‡©ð~E‹óf‰èþrŽþ°ÁöŸxØ+¨K=LY §,ÎM(ˆä¦kdLªáp§o|&Õ"Úë Bay¦N®VAÝq]†­>ƒ÷VÌùÞZ°¬½1IYU£ð§Ep!*dåŽ*UÎÀ"Uys+Œ¢ *n F5¥Áˆ‘t˜_®üÖUfN; T#¸ªÃ#ÃÖ} [ ?¬¸D1<ª)¾XËXX[Š©ý…µÃÔ$Z/%« †O!U…H\clù“Û+D¶~×Þh«r[¨7™Jƒ[^®^+æ4¹_óÈšu‡o–›Ø»†íLÿŠ r¢9ã n –öØ“‰=r»ÓVl³ìºƒ—•?­ÅGR6J¯•¹çݽĪ—š—A£iT÷¦ÍÊÿZ‰îZçõŒ›8Í!æw£âd»vÆÑõcÝc¬‘xt9'ÆJñu&6o†À!ñ:Läfç\ç‚ì’RâvB\ {RîŒC¦´­ëzN–DBû̩ˋ|OÞ`®ù•½4 ‹p}û 7ä*W×€¶Ú•>=¨ÉŒûžæ®¥«¶p—Wt[.kŽæ5©øíH{ó‹áˆÇ9ú=ƒÛ…Sž¯¬cÇž \ƒí³ßéàM‘÷ÕâÄ\wIA`µßú`ƒž!ãg:8±ùÊ64ž ~ãîzÒÖßTže îôçâòOh-ß”j hœÆM‡íN¢ýùÛÝ'\¬ &|œÂ:p>¶|­Úå‡þ6`!H^H_£0L¯Õ| +•=zît#©}€#æ-ŸãÑÙ—Ãÿ¯·¦ endstream endobj 5037 0 obj 3889 endobj 5040 0 obj << /Type /Page /Parent 2 0 R /Contents 5041 0 R /Resources 5043 0 R /Annots 5044 0 R /MediaBox [0 0 595 842] >> endobj 5043 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1409 1409 0 R >> /XObject << >> >> endobj 5044 0 obj [ ] endobj 5041 0 obj << /Length 5042 0 R /Filter /FlateDecode >> stream xœí]K㸾ûWø`=")êz^r0˜rrf³ ÙE&{ÈßÚ’=Ý’¿²ô©HÑ6·1Û3Í6Y,Ö»ŠÅ7üü÷ý?Û¿y÷ù?û¯Ã÷wŸwÅ¡öEÿßþù뇗?°Íaøû¾nüþë/»oûo»O»OÝÿ¿íú|~÷çîoÿÛÛýŸº??ïÿú·î‡?¿ôü ¿ìjSwßÿ}üÞÖ¦û[qþþüóíþò»ý¯Ï3ž–€yýïlUöÆ•¥¿íNÛ4ǯ߾þº{Ó#`Ù*Þ•…/ö¦tåÞ´¥Ýÿ÷»ŸºNÓ‡¶4¦®ÊºX³Pm+u(6¶íp]MÖ9~éÌnLnª"ÜäGȵ‘b\eÄÉ5OÖ:7 §û£ ïÓ˜¼´6ÜäGÈÕ±r:[<»æázSöz^UEçéCLÞÔ'?B®Ž•ÓáâÙ5·µÕ€ n9}}Ÿ^r_¸6Üá!WÇÊépñ슇ë1ƒÂm›ø?OâpÛ¢ 7ùru¬ ‡;ýÓ’Y0(ýO€QøMøàÛ/»7;^©ö_~ê ;.ØûòË®ìþñl'T~ÿåÇýï;xžþ°ÿòó®<”®·”Ÿ¯)áÈ;4bûc¾¬šnðûgªãHshÚ¢²þÅgLGšãˆ;Möb¤DŸÁ°áýØÎfáH½w*¬gÃx+z¼53¦giˆâÇp¶1¯gÃÇoz’q§ÍAäÇÑ ÞàÛÙ¿* báшÃÈœ1E³¤.>|édÔ:ñbÊI˜Ú%Œ1ͰjÙï®=Á|µ»÷hÄUhľ…³}„#ÐÈp°—Öiág l3-‚àqp`íòÏ<í úäÒgàˆ}ZC‰ܰSxrø3lx?ªœƒ#p6á|Œ&v0½aä×F”ë®~8™†yS K¸¼S 5–˜ÏØ0]ÂÙ‰×80-_qLk_³¶)Um^9-‚‘× ËÚm9ÂÈ È€b:Ç~D!Ø@Çn ¤ƱÖu1l‚oG8)ÎŒ/Go#, ØjÌwªÞòó øfó`ÌÕ8@P4‘¸!#aY§,íx3Ð/aˆ]°c°å!Põ1 VmØf,PhIaØ+ïšô+ãç ‰k‘¬Á5]ICÄ1…Ð7”Næ=a œ\ºò#ÉÉX6X4=…0u¦g‹mmlQc{ ƒ„É Ûr„æQ!ë-ÕWS6#Ævp˜ÉðÞðg2=]X‡™—12¾Nììö¾U¥ý Äg;¡YŒÇªpÛ§7WŠÁ¯Å¼gr–ª™Ve9¡ësmüU+*d¬¨Ó‚cï§Gæ…p"&a$|ÔÓ™Îô0ÎÄ3²šÐœó¤ªdÔ•XÑŠtõ/ƒÆŸÙÞºãcµC¦m5)76X”A38h £Hl8Rƒ×ÁYô§àc¢2ÊÈjÈ3Ûªzí,Â(®ŒÀ‘4FqeŽ&âÜ'Žå9c¡þF q½;Mšƒq¬çÍqúmD*oüõ3ÉÕQÜ ãª ¼S¢Ê!V=“ne]®*ãNÁA27JÜh¡–ÀúÐÂZ¿\ëŬ’sE¹B®c,b\eê©cÎæ!Þ0]2õsX Q§°¹þ¸MíU:XwZõ}ÄU+óp•þ \G1زçö`ž›kfœ‰ê¥[0?1'¡> ôò8öc/c9(øtŒ Àã C1Šå^GÕ.¨Rb"¾IÛ®BzË•LeéË×Ìx)Ç 19LœAdò]‘ ^rAB^iílÆ_PÀŒZܰœ*zù4æS¦Ðø ÉT¾/4.’f$/E9ª¥ÃKjË“¼dÒVxºÃt°eå±¶èºhÆf#s“·¾Û¸²Ò˜n(»=÷ëötjÄÍ7ÂÞÚÁwY˜u°cyJXg¢‹u=Ü¿b™u¹§K, (*ò–ªÔuã#H?SRô´c’¤Ì?,˜†¢ªáu&æ#NUOñ\•¯Uâ¸ѸJ7@Í`çÆ/ï&›¼ ©‡‹CßEPìÅæ7±•/÷©Jð%æF¤>bT€l~ìt®2—ns´…h¥µLnã–Ú¨rÓM¶«Ú ‚”ÃýTt£­ó]/˜d‰FDT,•IÝoØz m›±%ÿÚ5Ì•äùvƒTª•ÏüÎSéz5wV9³ÅøWqL ‹ª“Aõ|`©ªRdD°S [oo_hQ"¬Ã<81±³¯r„X\7Ÿ´a\…²Ëpk£mG‚¶q¸‚f ú&Í!Ä ­ޱ3°À› Ç*n~À&V+—˜]2|yz‰6ëöÜjÆám]å—pNïßk#f£Þbîá; 0á‰k aîè?̵˜÷Íü¹NÊg_¨õ±›‘U½S²LâÞg¹Ê Aï ]§ŠjUçáî/AÔíKâµ ¦1âN.s_Àë T‡–Ï}bÝ1$»ê w¿øö$–¾øV0”¤Yþ§ÍµÔP áÓŽEoÌ+iB'|3:â}᪴×÷á¾ð HÏN”u,]‰ù„©êÆö±%åñ:Ø«Ãë¤báÆ¡åèýEG÷û"õ%Àé„ V¥ƒ¬­ƒÈDº{\‡´>¿OuCÂçpm$ÎîÎï$;|‹+"]Ôþ?¼·(¬ÐÛ1_šŠ}ij‘ Æx³”]qotÀt %î’êö¸Jî®ë5Ybñ›šxߨ;Éb™¾¸LÇ\{ÍCÿíšüHî[)BûVR±ÁdlUÂF¨—è'‰O‰]§Ñ5²1«rQLýÁ5Œ³o·&ú奶¼Ìy;.ªUVøs§ùXÝbÛâü\|=_¾.òåëYûÚþö5›Êm»ÍöpÙ?Ó4Aõ.ñæ7Ê…ûZÄe¹˜5å­?e²®-¢*€Â‘¥Ú;L„D°k2%J‘UÀ^óbŽäÑBœ§»»èçåmR}¯­›ë˜-äÃs½YõfQ9£=U%½µ38#·í*,nZ®Wè’xð*‰VëÞºiµîm}nFþ0>k^‰O²æÍš7¬i«ëœ‘ÛáR|ö8huà˰71ÞÖmÌCÊX0ÖaÄêd>•øÔBÝ&\ã‡;M¼Ý’¾Þ¸ÂέÝ(Ë­­²–H]KdÞÎúc†þpkž$‰õ$ÏãØÞ‰?áôüµ‚^(Ãr ŽP­ªÆB…ýàˆQÙ—½yQnÈ0Z‹¡·?„‹)k{Œk,7p|Ÿ6AB’ ×[òL¬\7rˆi”iâEHXæñiK+VÀÎ$„ˆùÆÑ¡uìgp>‘‰êSŒ*?3°YbD¹u+£ß1§cй û6„·È4@tØó‹DoÌSxcK%þžwçËÎÑüH>îöÒ.uß³4aN8–®Å²‚©RbÚê iñ=0‚Ê™(«ÛÃhaÃÔôàØ0ãõ$LoIËN†t-¶7˜h;á)a ÖÅWœ’ì¡*Nk»¾2õšÌÚÅîNuw~MÅ]THëUÕ ›×¹ÆŒÅÔmt»¨åaÞmð‹õááH«ÅTAЋÅúšÈ¼0vŽ@ËDþ+Ö«CÌÉÅ¢ÆJǸNãm¬¦¸•·±šrM:VnÀ}¿Sö€ë5Î W±ã¶£Ý„(0öƒt_ñRÕ:B†9m†1ÞŒ©—y³±c#½´+œ6®Çئl xؘD¢ðÇhIµŽøÁ§¹S8lÆáôPÚο©Ø%êŸCÌùêj}Æ?{«¡'“¨Zîîãhz‡Ä'B&¥g—´.EOzÅ`ü¡hÝë3Æ[ïÇØÓÐjÆŠnÌ`‚ë‘‚i Ž ÑÈQ,NÛaÎ%b.ŒGDÇç &úCEãm“WW¶Ø,‡¶0ÃO`ÄÓk8E”#Ék™X©ƒP¢8JÇ Ÿü@ƒûˆÿXQበh—±="à3=¸äð[qÛT¢ø¼ìC¢¥RÙ$»Ù0Zµn¬ö㩨dA"0Œ¹UäR—:Ë—¡Æt¥DUÍ4S™"ûIA­jšQ~ÊæÆámG¾ò½¶ùá‹RÅ‚ÝPáSÕc‡å%ŸÀˆ"•µgt!¤ ,l—dþ?5–»!˜Rx6Œ®‰ó‚O;¬›¥'ž+Ø‹¾«›«`6ÿŠÈ¶1“2¥¢vªÕ:nóVÙ­yc,Òàê×ÍHpNXi"ë05ÅÀiÜÔõ3˜ÇDÊãª0ÑH\ÞvÈÒ¼(#ï¾öß:9øÓµ_˜ÁâÍEï¡0Ï…ƒûóÓFCÎô7ö¢»¾pܽSgö˜e}9ÒŸG5Šéía(\|!à äú÷hwMN^‚íã°ÓIíäpÞ˜4ʱ Â… Õtƒi`5ê…m<üÌÀÓfÑÖëïdËÜóß;ˆO€jÜ/'ƒåAîtýϧÒü `; &|œÂ:pCóKfñÓx °¤A7\¢0L¯Íz « w¤ÓLRƒ©9}MFï?íþè´oð endstream endobj 5042 0 obj 4692 endobj 5046 0 obj [276 /XYZ 38.2500000 242 0] endobj 5047 0 obj [276 /XYZ 38.2500000 785 0] endobj 5048 0 obj [276 /XYZ 38.2500000 785 0] endobj 5049 0 obj [276 /XYZ 38.2500000 558.500000 0] endobj 5050 0 obj [276 /XYZ 38.2500000 242 0] endobj 5051 0 obj [276 /XYZ 38.2500000 558.500000 0] endobj 5045 0 obj << /Type /Page /Parent 2 0 R /Contents 5052 0 R /Resources 5054 0 R /Annots 5055 0 R /MediaBox [0 0 595 842] >> endobj 5054 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F8 8 0 R /F9 9 0 R /F1409 1409 0 R >> /XObject << >> >> endobj 5055 0 obj [ ] endobj 5052 0 obj << /Length 5053 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾Ï¯èóÛII”€ €=¶äÀ°‚o6‹E¼ˆ³‡üýt·Ô=3T%ñë"%õh½C‹b½«XõæOŸÿ±û×ï»7Ÿÿ³ûÚÿþøù¡ØûªèþÙýøü¶Ù÷Þù¦Ú}ýöð}÷ýáÓçÃÿè>øüø—ßþ·³»?þýu÷·¿~øSÿ—ŽáÛƒ7þðû¿O¿·ÞþT\~?þü—‡¿þ°ûí8ãy¹~3/ÿûG[û¶­ÛYúûÃù˜æôë÷¯¿=¼é·J媶µ;SºrgÚÒîþûχŸ œ§/ömiŒ¯K_ܲ·‡•jcýÎØ¶Ø¹¢,tú¥3½I0yéŠt“Ÿv®s˜Xž]órËÆuj«à?Ïžü•O‰8Çkå|µprÍ›=°Ë<¶hè2} è·U“nòÓÎÕ¡r¾[<»âåú yòÓô àïIǺ§âÉÂìš—{ø_BÊ}š>ü}Y¥›ü´óT”+Ì®y¹¾=_îa¶ðoÓ]nSÔuBÌiOàW†Êùr³Š™o¥û Ðø¿ ¾ûòðæãAʵ»/?vvZ°ûíË·[ï~<È’#»ùòÓîEaÞÿq÷å×sØam«n݈­ÑHáO#ÕÞÖÝÐeļ…ß4ñ³Ù~ÓÂo»oÜޛƿØÛ‡nÄì«ÖMqð¤úÆÂ¼kcÑIñ:x¶â#šÍ}„³½‡0À{«áyˆ›+ú[¨÷M[‡&œÇ˜ÓH½wæ4ð줞ô]<ô»þðå@ÝiÓ9R&<>€a ¤ Üñ:Þ<Æ#¹þFÀ£G_1Žãó`Çøª†GíÎÔ×ð¨,:4*›—€2Õ¾U7ÒœéíÙ,ñp¤{¹/‰`φ¿qð›ŽT§·¯Êú%ëv]¢0øÐ£‘³™xao`l¦L‚Æ›…ì%KÜ1 áLý¶!`£ç} ÿ(ÒöÒõé*Ýã…µv×þ4É[x@(ÂUâ s!ÞaRÀÈ‹‰.\ºø£ ;À»NKŒß-DQŒT˜ß œP•ä…`´cÊcj™XE†ºÞ' Ét."`ͻɕµ ¯}ò@3]¾…,É4Ñ„ƒ°5BÀb$ed>dM˜0D¾NÖD2^ô®(QòdÔ¿Ó¦®Rï8—ZÑ›ÚÁ½™€ë$s¦0Õt9ÇØ³ãÂf1ÛÂJ?üf~ÕT`ÝpÂJÍÁäFœÔa}3“× Ìñ–p.Œ]¡jÉ\6£Ó2üAà]ŒÍÇs¨ ÞºÚoƒÀ„ÜFF.Õ>âÛôò¸®ÂÛø\ÿ‰àÑçgô¡V¾eF0õW¯rÆaŠª^(¬3Ýýˆ=SÓ"t¢OÅ}軌'k>¥%4Ÿ4 ÌsÁÍ>—ß8Bà+.›‘(̉ÇfK(Xëƒ@})X³«3ªjyŒë})ƹÂõš²@7ì›P1î5‹vßEÔŸm¨jш}‡Fz)wmä#iЈsp¤LM MÒ‚€gŒˆPÕΘÀ”.­ Ø/EƒI†u.Ç­.m«F9t-Öj$sؔƶ!gÌåãÅQNHÕ‚dÃîÌéšòµ1†5¡z:ß ÒZ—'uÍ1‹y»1Ž»æ¨uÊV ‹&B}] )ã¢P1Ýp8áYøU³ƒ°ŒE NH|¶iCê›—qºÂ* Á!§Ã³õ©Ó×¾\Øx8¹ýœ¼ÖµMÝ{3qx7‹R“°ëLÖÏ$2b±Ð’ŽsÅÞs¹• Ã@WÉgv@Ñ6{YJ;!OõÖ„<5îQ õHaK*Žw†&¨&eR3¯5tj ƒ5¸§7†íÖ»–àʼÒxU“;U%ŸX´îáÀÔáОÁ Ãn°ÔÂQ%ª7ȨRÍîÖMÏ”º(ZxïHï 4Ÿ/“ÃHð7å­CK!Ú.¹ÍÔŸ¾æŠ°hÄb÷t8`'E_à Îé‚x„pî8ìÜßXèbWvî”ðÕ‘6µiïÍøo2ñ A«P«u3ŽÿÖøÌø%†¼@Mûêò1êÌT,©©À¼…¢*Èão¦¿€žÇ>ND±um@"™£ñIßÞúàlºÅl•ÚqsÞ¢³½Lö6äÖóÅx×OJ±V†D›þ¥AY¹pMˆb*=„²Dý¦¨‚ð®SñôRúT‘@Ø!K™MÍÿî÷N°‹x-Á<î^imܹK÷… Âü¶^aJY†¯¬&«E‹~ç·:TD7Òº2¼æYjD#lPf©5›–¬ÛvN"3“uzÏ.Ô¶LF{eΩ†¹\‚ºÎ( w­œ¸N¤šã4¡\¡„¥Æ*W­ûIöáçIØUM¤Xâôê) N­[°=æâƒ ¡ôê’àS „g׺‰ÿ1ÆbÈãÛª^S ÄeÝ Ò‰gš%NOÉ„ÿ!……]Ão*&* 0¾-Æ ž‘wb).ðÎ \µÙ™öj°£>±ÔÚ\XjÇÐL±ï"Ï®ªF#=JT{†Gû^¹×¾iâg³x¶}Ó{cTwê/ñ» œ¢½ÇîÚy> oðz%íÚ7Ì øMçt©÷ÎØÀÒþˆàf:Aà÷n`ë·ñ°î} ×ÖÁ»& Š×Áßô"ïÚ7ðzdê³+dʾS{á-`8H%£pKÈhÊ¢ 9M!…ñc%Äq'zQ‡ãø®Ô ;’±RWg¿Ï™YÛ³ß-d¯é+ºáZV8ûûY #Õ72Õfº§,±¯Ûªš€ÍV85o¹Ýk#æÌµúãžsï Ûa*çÌ%¾—Íœå^3£‚Æ»Æ$ð6ä Ž> —)©%TÉ0 Ä.zOd%P»f© ““¸ÎÔw^¸Úé}l”­1 Ó›’©ØLÔÜNT7 Ñ,¦˜Rk‡Xäj/;Ck½¢n©9¿J©Ï”BMYªYúØ™ºorÍ%F’Ö:/]*C0Ó›Ý2å”n ›Ü•W¬gpºyK`Ïì>{Wa2p–¦ —ß@·•äüW¥a¢-À<Ε2ÿž3$f¶\XDLïÙ£ÜT')>Ñm‡iŽ{QñÀà.¸ÓÄ7ü8ÄÀG(BôõÀ€iF¿ÁM:i9Ò7é¤%Ä·’§à,ò°)ìø=n#ÛÈ6²l#ëy5rW°yðSlhq”DñÃn¸k<"è­½ÍraÈÛŒšLyÕfÙ+[öCÀY‰Nt›e¿YZòI7Ë~³ìsÂmÅ–}Õ.G#ÝF¶‘mdÙFny5rw³ìEèÀ[èë™åÑ0|s.c{·€·%ôüÆX­MÁª%fì] ì©Àv5¶ß‰^öÂ7Ø»¡#”9Ä7‡¹>)q?«^ÃÐfN l}f „¡Èà‹ÅX×Á#x×k.zmµ–Õã8ÖGi|qï3îÔUãòQm?# øm0ù¨G BÖ.óØ%Såd! sË̾¥!•B­[n#ӳ܌¹ ¾(ÝË«ˆ’PB¶#Öê LÁº¨ Õ˜LLB§ôq&b„u7l=áÙ0¬‰œS!uv›|§?0ŒÍæ{al¾WCµ›u[¬ÔºÍh_xSÜd®Rr ;À˜„Gà®|Á1JFÂu* 7|,¹ñýÀ]cü7ØJÄ*X¦ëÊŒñ^ã]/ÜÃåÉÅÞhS›6½žÀ“‰oYj9¥£»%ÆBIT,ϰÖFÄñtùuÂôm‚jÝàBÌýä²^]¾Ì'oªÜQjäÎø²`g#™ñrF=«€>„ÍzÕŽÍb¼f0^8/Û¢†hû7–áùð·DV_Oô~~I™+Úê†Îo÷Ö”Swšg?ÎÝB5÷–[‰ýÿXëÂ\ssF60qUYgð =Õ󼙺 ¡­r׳X©L%ü^8WnãªÅ¢¹ªà…Û,΂`^MÎï¹^„Ýc½‡Õ24ÜVU9oÔ»ò’Äz&g_W'(< ¦.qDbâ +FßV ˜©/$…2)º·4óÌÔCA¥*5ÎlfšE2u…cDtê„x1ã`¦ï§J›•Ùê¥o}k¦ÜqújÕ3£xáÛ¦ímbžiôOwf†wV7»#à}¹?NüíòßÕ¾iŠ]]óÆô?õ»ºÚwŠUqþÉׇºÜÓÚ¦1—¿å^Ì➯qøûý»ãg»ðk;Xÿ vrø[Í‹Yš—küòðî‡DØÚôWCqæjuGñ5 èΦ¬¸ÎïÀgÒõR¤¬u!2HPå Ö B–`lL«W!¡'(C„Êcö¬ºm§uû}QÍ-"ÚªiŒÒåhãÄ”N€¶ 9B.Ô[0YWϹY@~&4Y%ô ŠE0”3Ý–t|@Ýw«ªöG®&GËëÑ¢g¡´…Ò^µPÚ…Ò^±PÚ‹…Ò¾°PÚÀBi¯Z(íÀBi¯X(íÅBi_X(m> ¥,ÒX(”siº÷q‰¦Ñ½û Wå¶c¼ÄBe |ë·ÑÿSOL{9¼“LŠ0¥2~ÉÌ*cx ã÷ÁÊt(Ä—×\Mé6.›PÎMTèö\gŸðÜM1¡†l o‹8d/O„Y_¦éC‰‹ÆÂ’0…;&v@‰D—(/ìl9&Ñ“$”?mcCùÃÔRh™7Ð¥@/bBιºBc>z Ó"hÍäbZ¯®?5¡Ké6ßÚQ3ÚHB~zv[]jwÌŠy•™„°5• €{÷ž+ÆŠ¢"Äð:1ç´MfôhnvG"½’÷Ñ%È”Ozº%M±ï´ðgXT£‘ÕÞ†ª{¯4\û¦É4[‹f;בµƒ:²½£«Þ»Óu<ßA‡`~ï—øþ"fÃÚ³hox¼ë¾:ÀµuÞ¡‘ù¯A´€ßà½}„çÁÐçÖç)Ô^ˆ@²¨š€.V÷ô/BÊK‘ëΛa^0?OM[¥øÑQˆ\e§8&%CãQ ¥Üh¨sTÞVF±H̦ìÕaì^Õœ´Ô¼K5Óè™fs½•BJ¹ã}(x°‰©t'E1Ž°Ù¼@wb™ƒd°ô‘†´@r‰OÆfÇmQ˜×}TÚ/ã½UõÑ ëDä%…nÆ‘-é Ç3ðk &Õ‡ hADi0ÊŇàS†}ÈÓ\y!L˜ÊdÆ„d âÅD±fÍt©šÝqN¥|.E(&~¤hZ¥©z ¥sô<‡#Ñ‚†*üž>zd+ò"•ÄIæ17VqVÇä«0/ft]cò=½{±2ãV^.æìþVùq"¶°:–Pí‹é…¿!jºëv‹ÂÌO·¯IÎ*UsKWåŠex\Eß Q?ã î›.T®ÃÏóU»ø1]œ–ÑÓ£.néé!PÆ|'¸ª$ÞQœ©’ÉT ¤h÷sΉö,‡¬M+àËR”×¹¡X•‡®íŽ8ÏT¶dªT¡Â{ü‚¡Ç㘠E™ïXÝT¨‚5DïLA2à8ªÛƒZsH|ÛLÅo¬u#ÍÃíšs~]n‡«)ëÞ#…± mêrˆITµ „JªzÖFé(=Ê6afËE%ºº³Ì«^¾ÂÔ¯à7ýH™ã 7znKð ŠGryo6­\ìï·à]3žÁ'‚{/¬:Ëè!à­=Ã’¹Ðüý”6)üšøÓÆk¯ þyiVà”ÜuÔ§¼·êQó'àäŒZ7nÓc791Ö›KÉ–eä(4å-9 K†üëÑ_˜NäöÝ p¿BÂ<”M貈%2n€; â[ÀÙbpdXµôÞîM}KŽÏ:¹Å#83iËqË–ã¦,à7%¼Ó¬Øø§PàåìåÒ¹–œ‡yoú“Åy»ðN—¡´E} ÒÍäÇ‹!scḭ̈ñN®«y gÚã‡Þâ¨jŠ 5R câÛ&´>£êÙÅx°Nl«qˆ¨z¦ÖÉuõ§uÂà9^~í¾PÄÏOcaB²¹†¼Î¸ýT‡îì%×·“G×Þ\vûöWâZuÚ½=ŽrÏz8Ò¿C±ûzP•²ÛÁµhÜ{´Ž«Nrmoû“ŠÆôq:r-C6‡‹ŸÔÃöˆvmzGJt ƒgƒßô!Jutÿ„¶,Âÿ|ØñyçÐZ¶ŠGƒß‚ÈáÎ7Ñýüùˆ Q·ô„Wƒ‘_§°<†9WéF{ƒÙ,ÜR¯ ^Ã0Œ¯Ííæ ·ï¹ÓDTƒÝfú‘žOñèݧ‡ÿÛËÙ8 endstream endobj 5053 0 obj 5881 endobj 5056 0 obj << /Type /Page /Parent 2 0 R /Contents 5057 0 R /Resources 5059 0 R /Annots 5060 0 R /MediaBox [0 0 595 842] >> endobj 5059 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R >> /XObject << >> >> endobj 5060 0 obj [ ] endobj 5057 0 obj << /Length 5058 0 R /Filter /FlateDecode >> stream xœí]IÜÆ¾Ï¯ès·X 7  Ñ ‡‚ääÈq#6¢ø¿Ÿž!›£)ö÷ØõÍ«b±‡lE‘Uõêíë›?~þû៿Þ¼ûüŸÃ×ñ÷wŸïªc[WÃ?‡‡_?|ÿ¶;Ž?Ú®>|ýåîÛáÛݧ»O§ÿ~»^øüîϧŸþw°‡?þýùð׿þðÇñ/=ü…_îZÓž~ÿ÷ãï}kN?UÓïþ¯»¿üîðëÃÏË›yþÿ?ئë›öa K»;Ó<þúíë¯woÄ­R»¶wþ`üÃzoÿýÇÝO§Ο¯Ž½7¦m|[½d¡Ö>¬ÔöíÁØþöÓ×Â…é|Þ輫š&ÙLJ«CŸÆÈ_W¼Üθ3ôKÿ§Ï'ø¸mútܹ:TÆË¾~ìÛúºê;øó‹Î嬀Ö6  6}=Å•¸>1;×ÊùºáÇ5IÙw#­5>ÅÕNŸOýÞ8›îjw®•óÝâ¯+^nïj7¨¯€úzŠ»õ>!â<î\(ãÕâkÞlmF)æl üôùÐï|:v?ì\*ç»}ýSÌWðV†?&À7áÅû/wo>_¶Õ¾ütÚÜãšÃo_N@©?<èý¾;|ùñðûª2þ‡/?ßõÇÆÖç-.=©ÞÁwøŽEOì=±N¿k[£'®|òáËéú’Cþtõãªï3®Ú5çU!ä*|=„vÞ^‡Á8×0biõ‘Ày¸k綸k¶ T›<©#¸¢»ÏFÏ]UÕ/à߆ḘÎàŒåÛÄ ‹Ÿøµ·y`-Àso, à®1ed”¢]eýŽÿqŬwﺅ–ôÕ°dß=¿žîØõÕ#ÂK¸ôd›?z7D¦'~¸w<ýÔµÏÞH³ oåÂGðç Ü’ý~ïžXxd”Æëá`Oï4ñëàcÿ¤úðø¤>:Û™çOàÞðFB~¤í Ѹl²Â=A()ßF=R@=£€~8©€«øÂðÞ".,DË|<ê˜÷pa¸%wVÖۦ؃¼»:¸7 YL3˜cRÀ·¡r¥< ¦U'?Uº<ð>„%ƒÈ ûgPÏTðkáÌicF0Œ˜Óaºïà: òã£ã“âkØ%\Ëõ/ì]S[OÔÖ_ÃwŠëq¾AaÓG WRÕ”B&®MÃ4‡)‹éqa€ïGØ5^G·nTõk ÆoÖyäT;YD5F)™?­O3Å$‘]ªÍبî›/¯ØõŽ—yñ²qçŽÊz=¾Œ±ø –ÉDFk£:Pzpëìqç¢w‚²vÈp¡]wÞõ¹eþTO£©ýwÔ`zF`ï ¶Æqo:¢k.ÈEéL/Ð’å³Ðs®ãî3ÒLk—ዹ/†<öÆ’Û3½f0Æ2“‡v^Na¹°BÒõdRýƒ2ù8KÖkðt,† azO1ö*Áï`ÅZ |ÂÜ`1c^¥J%¹b+%seèèú ™ÈÃÄ_cðÚ1¼ êá”îNÜe9b ®3ꆽYÆeUÿ3q€êœ¹I[Bw‚BN+£5W@^õ £§1¾‹o‹ð´1~xfˆü‚2¦3´¶V¸ŒyNí”Þ/Xú9÷Ó£JÊÞ{¦{3áQch½dŸ¥WP”æÈœ”èÓ+ðbU+J·ÿú6µFÛŸdáO]U/òËmR:5s†ðV¼ß¹²wO¤":™c†™0Äxp½Zñ+¨ÖžsvªÍwÒÒµ)½dèd¥g¿ÇЯÒ\wJß)}Û”Þ½»Ûô¼k¼dŒÍEÏÂêF¬˜ˆ<ã!êþ˜ÉsºwJÍo˜ÈdÐ2õU)duÝW“ðj´1ÆW·kIWÅ·pkи÷­Á€É£Ñ,‘ÙÚ›—D -ÎÈ"tbæNj¦þ“¸œ3~Ü»²¢²}½\ƒzsžÑ—u'Cˆîš©Iääìm³|'DÍãíf‹ã8‘}Sr`ѹê™òõ©ÜT 7Ì7˜L†LÞãã¼sÕÎ=ÂyˆÌRåšÏõ3Ò¿[ÁqîQVç‘9}½Œ—˜2 D„ssé…x•nͱ7K<ѵ¨„\]H . ~*ƒeqeÜ›Ã:ÓCkå™°—Ê­Ò½9{7ŒÂÞŒ¶}x-Äù05ú† Ÿq®£?1ç!t‡GK<[ŽLœâø«ãè6¹÷úz‘®Ìä.Æ ,%à_²‘SªpÞ—â%¥s‹çf$¥€ÿL— Uû[DzÅßrbEý’^0‚|ÞdTJ×sŽéÇù6ŠË:DL5+þ·/©wEš+Ä>FsõL'SBf¬¯!oTÛÕ­ªTÍùS®¤'¬_]ûA—¯¢köÓªùò*zS³^O^E®^{†f¾¼ lIb¾\2èò½zy^oš©ÌOSÄƆë›e¨::‹™ì»þð®‘u?M½€'¨­5T+b´¡ð|=[Ó û6¼ýpð·ÞuÇêÚ¸iugú€[lÚµš­º¾ !…±ŠýŒß¡&ubìM)ßøR³!„ÔTG<}–˜˜ÈLôÎ5»\`Jøkº‹sMiÏÄæ๬PrcÜ™ñûQNÌt¥”$~–nÔ­cÚó– ½¸à‹™­žVtŸ¤8Ñí°½Hø öƒ,ùŠ·Þt—”kÚÙ]3ܪaäÊõz>žv.|>d” ?o°Såœc׉ 7¨kúâùâxA;ºÞô5: w„â1[8“¾±MGDnÃVØ ¦ ‚Òb|˜ƒ0~/BÂ*¤°·¨“ÁÝØMÆžªñ+\Äãrê ‹_€‚*¸s9]ý‡B”Ý(ÂÀò…’¤Ã׌?ZsµŽ¢ê8¥d,ã› Ø“p¬ÛÚe„…&¸rBO%û˜‡r%—S‰2ºs)7F á“ëï’‘`÷D!ÓÛªµ©YHYaYP!¯[¸Í(b+Ùj‰àÂŒšI¹µ±¬bÝ\¾ÉëPžëÑ‹ oÄ´Á‹ƒk}ây¥ÀÃ"Ò¿ºè|J(Íé+ ǹÇ[@˜dU.!%¼¥TXű`=lØ'èĘ}ÍôüW †³[à—@¼¾ª·ÄA2xĦîu;Žˆ»Þ˜•gjÜïÍú™4²©4 ëA@ç5œp·o22¸;Ûl.ÏDÊ" Ò©((ñN¾XO;ÍÉO‰Pu5<”_VhucÕ*lSÕ¶¦œøèÎÆé¯‹Õ®–SÈl–Ie6ˤñêFtSŒ Ìgøù%¯žßD5JÑiC‰–9 l?"÷?±ûÇo¯ü˜8kêcÕ»kiX7IJÁ4œý˜?Ç$Œiª6DH†Y ™Ÿ«›9Ù)®˜üÁ¹g'Eñ³°@teÞž`ç§ŒWŒÍâ Ñ[‚°TQ.Ô˜ê캛NQãŠKÕæà%·GšT$÷•Ót!b©—RhÊøÞsiÐåÏm4oÛöS_E"QƒÊ¸Â2+¢®2—z7X—Ò¸·ä¾X4pR2·® 0mìådªcӚ畵حËD—ˆÀå'UÕc"Tc¡¾„Qù™rœ‚“ 2a2¹bìcU¿,Uè¤áúfü^ÜXF]¥X·Uà™Pl6 Äf.¬0šÑº˜"c­n¯çc„‹Bàc˜ð¾ŠÕœ$ JH0jj–DÇÜÝ‘¡Ø§¢iC¦Åô%Ðh ‘Mù/¥ÛL9pROÙØõæ; Ë(Zh0ZODHu7EvSd®ôÎIg&çä–,™\%=œò‚3=JTËJ„ìX‚p0g ¤.¦#Mr™jÇôßQÆ#FCbüŠL|¹ü¬ä3ŒÖ×RtÚéöSe†Õ™Z¯*[ i“í(Çc®`ñOä¯ 'ÍŠÜt—ã„⫵m ¾¶]e›¦»ðîFÄnD"Оµ¶Ñ…$רJ‹p}ßÇÛýÖk'àãÒ.âÁøÄçe®Œ“¼†KDÉ/c{–¬ f.XßjœÛDC.F͵­ ^Îi´5c~Œ `³Œ(t]³AÂŒD&|‚Ð »Æï¨Ž4Æã섽alràá¢B±ò˜Q_ÕÏ…{ÜXO<ìã 3ðŽôÀÃŽ©»ÇëÀ{ÄwO zdð…»Æ2 qR†s 'eà†q”¡šé‰p ðšX§d™#ІU·†×”d)CæØiLÃ.sv™óðëOª–ñy„ÏÌØ2¼~Þ‚@ »Ì)Zæ>|†‡`ª‡'Ý(e6#u1ž¡¬ Ï„!ÂÞ Du="S#ÄÌñ-äÐ~Ül¾Í=›©˜2¥“Iì€F—j}±³“ˆ+§’­SžzôÂõ‰<Ô@.Xͳ%&a”))ÓÈGg¢Ð1é_¢è˜ •Ü!©¼´™R.žS¶Äq>9JÎÒ­¨NV8B5³É”اÒ4ïæ“C³ew¯ÕîÊ=e÷L[Z|RF/V~«Ò?J¹r†™â¡ZëRj&Îø ´½•R;ª[)ÓàË{£ ­RÕóÂtÅeê|yUózm…1ƒ¯®Ÿ¦ 1s0'ÂB6E iÒ^´.€TŒÍ£ŠÂ«5¦ z¯/Þ¡¦ƒ¨¡˜ûa@;XŸÏï•L×'y82…½°dÝÂ_÷!›~õ ‘RN*±]H°Õå7ÈT{@Yf%—¡_ÎZÏ'¥Vsq®n2õâ‚ʨ2òõNb|ÊÕû*1baÁè"R„2Í<GW¹ãQSq>”®8… §žÉo+«P½Ä©M£™¶´×\­÷aT˜¹s„Pâ̬Îõ»ž »f¦¬.§É ëÀaZ&ªÆ5r–ªÖµ}~†K¼>M±9‹9äx5N¿dŠ>¡ql‰DS|!¡•(!ÜL;^–›P%*D"0NœvÂqÚ7~‚›±„Å; Ê­*ètIÆ_:)NÔÞa-q")¯#À Vu¥QkÎ*Sž„ù>ÁŸ®º;˜%sÉ»Ne‘%Ÿ´ŒÒÛºŸV½1°·Ë{M<€á;ßàùFc'’®%‹±kÕø ¶`ˆ²xÆpî@À1¦d ÛžŒeŽ-¬£cèV)å]ÒÄã`­lÆîbî”àªöbZ hޱ‹7} y8±o58ÊG4OQÆ—‚¥°`{Þg¼û¦Y†â&á«Û¼!ëtõKîäÆîñõØóº­2-ÆÿŒZ~[ù̸¼[íï«qäg“4S†-ÛZ—ËŒÚ1Ö€nûŸ’q,'&yû¬pï3î´1/Øi=;%cÂfuʶK¤9î4 _,Ž•0m ñ®! ‘œ}ÿËÈï:Ó]XõôëðíôyqõOKኄÌîba”qÇœàr˜àŽÙE—Ò…‡{m/d½ ¾R{´½Ì¾2àO32BÁÇ”ïp{ØÁ¥Ç÷h·”}ioÇ“¢œ-TÁÍšñ賎ìwsÁi—Žað×à;c`ÄD½}B[á~>íø¼óh-[Ç£€Á™ör¸óM þý¢.ÍWƒ‘_§°<†é5M¨ü5 ãÍÂ-êý% ÃøÚ½ÃÚÊGît%ª½…Ožñé%}øt÷"Æ] endstream endobj 5058 0 obj 5470 endobj 5062 0 obj [278 /XYZ 38.2500000 764 0] endobj 5063 0 obj [278 /XYZ 38.2500000 110.750000 0] endobj 5064 0 obj [278 /XYZ 38.2500000 110.750000 0] endobj 5065 0 obj [278 /XYZ 38.2500000 764 0] endobj 5066 0 obj << /Type /Annot /Subtype /Link /Rect [400.500000 778.250000 508.500000 785 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_adding_member_functions >> endobj 5061 0 obj << /Type /Page /Parent 2 0 R /Contents 5067 0 R /Resources 5069 0 R /Annots 5070 0 R /MediaBox [0 0 595 842] >> endobj 5069 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1409 1409 0 R /F8 8 0 R >> /XObject << >> >> endobj 5070 0 obj [ 5066 0 R ] endobj 5067 0 obj << /Length 5068 0 R /Filter /FlateDecode >> stream xœí]MÜÆ½Ï¯˜sØÝü‚Ú• ‡‚ä`äØqÃ6¢ø¿ÎÜ!çÙÕMr–lÉK±»YßU]ýúÝŸ¿üãø¯ßïž¿üçøCûûó—Cr*²¤ùçxþõÝõlyjÿ|,ÊìøÃ¯‡oÇo‡Ï‡Ïõ¿š¾<ÿµþÓÿŽöø—úߟßÿ½þáí_:ÿ…_…)êß¹ü^¦þSòòûùçÿ>üíÇßÎ#vÓµ‹¹ýÿïl^U®„Ž ÚÒieÌXàØ† %™R#SO†)°6 >“Z0åêé–šrÐLB<¾¶iÕS¥À •f0™0œgXº`Â:¢Î‚‰ÂØ_*Õ×µºå1-ðZÖÐÔ8Ý!¸0yz ¾*wkßq*Nnà<¬: ãÏÝηœÇßÖªÊ=º'ð«á;¾CѾ#¬­ñùÉ5ŒŸ"-¶õ2iW"ïÇA^߃׆W€åH˜éy(êàªá;‚èÒ €4Àï0óàïy†rG«à;˜:˜ÛÐ:áÑlHFh æ¶êØG`+†%Ë5 ~iÛ>pÖcraǬ¬:2›mÎB^ð~z kçaúV¹@6ô ÅŠîđڄ5"mó©1%èXŸÅ:RŽ©ÛD+¬®sÀ´ñª4ú1½ŸÛLÊMJÄ›P ^sÈlÙsg+Ü T)êS»9 Ÿc5Üí8T×9®¢y4Dêvdjéz5åwtý›F£&UUÄ–˜Å÷ÑÇ@Fµ)Á GŸ ê™ëѰ:dU?qYÏÅRR¿þ¾ø{«öØF ZwðhBìK„“z bU!=Ÿúõd:½ó˜¦ª1Âòq’`Üt“¦Dðèa‘òÁ®Zj( 7Y£‰Eq«;^@ -‰îÁ:<Á'•ÿ<‚D´¶ÿÞhð‰Ÿ$Ú®­­8|¬òqZa¨ È ¨ÁpK1¸‚¶¡Ð‹[N­<>Nyc²”_^~Û ïUJ…À{8š%V`! £MÌ;±4s›àC=ƒS ?'h­Kog]ÚŠvÜ?BN ‡¹ÂPI˜«™¿”¶)ŠŸ[…O5¯‡'7iÙkƒG‹åu"ê–5½ÀÝ+^uÄ× 6kw‘"¶š#Ù‘¬Àò‘‰Ã£a‹‹e>V,±¼vãxjqŠ®#þ°i¹iß’Á¨IË÷Ä °Ö.NAÊUåR (¬¿0Å>P˜‡ˆ"W`Ÿ°ÿÀü‰iòâvÖ ÔH±ÞÙ.5y¸³ª{ÍÜçðJ¬v*-x†ÀœXÑ "fÏ:Ö¾=ƒÛ„wèð“X›DÎ| £XxïÛ»±ãÏ!{“¼çÏÚpãVA›`šì”ôÏ%¼‡toOSØS'1æ†^=õjä5‡€ºBŒ×F”?—/½X¸f%)à“=YŒZ$uU·!b ¼XȦy@ "LzyÁ 8­Å x\”„I²n¹R°ip4,})æéŠmt¬íR¦üŠ)ŠßÉ6Yæf½¡Eе9.ØèUXïÔ¸Û4ê­à!Þ (­·`‰™­mæ~ ¬MD« –raÕÐKx4BÏ„Èó”ásÑ(H".©—uÓÙQmZud׆¹µöh7}E¶Ù&OˆÆ[!:$²J!r%6r?Îx†¶b‹R^ŒûñUKùžÓí9ÝžÓí9Ýæt#›î™ÍnY¥tB.mÞq§d°ËF€™Pç+§#äP˜— ¾ŠL‘.î9±U§|}2FƒëXro•¿ÒgŠt  ¾Šîö5±+ "0Ì êYàÑä(¡rcÓÅ÷È„t7YÑ÷7+Ô­ì ÍîAx×è“(ÙbVt-ÉËG¡ÛÌF÷Æãð±*v>†â#œ'ÅD/EŠçÁïà'&RÖ’gö–‰w¨bE¶ot£®!ÁÑÎZ˜!Õ$… ÝuoRP‘X·ƒ[Æ·TÅ l96AÐÅË1’"!–ÊLÙóhAZ/C¶;·™Ý•OÖ½oz"MÝáør=}ÅÄa*!X³=øŒH•_J¥ )Þc‰O:1¢Q¦WÕ\‡¾ö-ÒÍ\k¾ñœÚ¥ÀaBÿĀ)à¦J›ÏE+â“dý$r5'$V¬ib½~Ü(¹çÒ ü± `*’­Š½ã!k]3¢ @Ìx4Wdÿ8B™ðì ž÷݃^ëÜ[7Š1){¤ ýAï“죫ª/«XWö¾àíÕ4MЪö1Ù•pv^õ¦!¡qcqÔ÷%ïhHËÁzŒKÕö½2tÞ‚qÒÝÛY[h4ß2OØ ¯tÙÆƒ¾²Hï}AçšNîÅ›‹7´'&©UbÛÅÔÿLN#…k§#.VEˆÐpÊiÿnש3~jO góÄ™~ò¨E›h÷ÑåÕË>Tc%îA2oçŽYeHPø ß-ÊÜ9ÄÀ{bè-B©[n‰0_j°­!@¬° ìÖ@ “Ÿdx¶ qJÁÖbcä`ñ›_)À=Š¡(^ó¥ÌeÌ¥„í´„¸0 ýÄñÈe:N_ÌaUÀIêNMUðìå­ƒž­»‚ë™ ÏLô£jŸbÕ–‰‹­M€¬²OÇ|Äy–lð—b© V øM<~òvô W'ÞŒUq_nûdíèztŸìþ,^¼Í\øM3bzáÔ̑؈•â2™×çb®§zNT­µ¥XkŸªzùMÜÍoÕŒMy0Û%Ô1˜ûä‰HZ°]Dƒ¹œG;³Ž]ê˜Õ#„­Q1¢êÐ.§øòNìQ ?ÃìÌY¼#„¥¹ŒˆðZL2æ`UÍéÃa(픦<æÑWJ]‹NÄ€±òM]Ý"~ÕÚ}D1‰™Ó"äÌD‚#°åmy†×ÆHq­ó*¢SÃòBÉØ&-‚°6f×p÷MÑ|ÓòVÈ•,!B…Ù1 *11.¤Ÿ`¹²0ö)–åÂ;L{ï²vï2µï‚-$\õJ4#¯fHyÄNE“”åjô1Ú^–êªcÊ•IŠUÈ• ŸfLÞ¥@±îÏòQ&P•õ֌¿viÀqn …@„§.uѸ$j  $AÒŠªg#´ù¶è}Û[ºæ0í<óë×°È0€•Ç…2ˆi•·YîÞØož³=îl ®8Ô5á›rÏ:WDzÄ;ÄÄ> žGåjªHò.ÜsƒŸ@#ês#4†ÄñâäŠcMC^\ھܤ¦b{æÆo|]YÜ‹!£ò›d Öw´$t°1U990ÇöOðFhÜŒƒ$CÓÖ^ÝMí¬Úõ&ukÍûonou½zŸÎÙ÷ر#’hØB®OdÀº®]µx\iµØW§ä¢yk\¿y36Mˆ³ˆÓ ï¦-"÷m!Ló9{ Ô“ÅåÿÑ0 ¶‹b’–±o¸Ù‘OÞòI–Ä®§.Æy›h)Ë{†åõ™‰X„® Žàö:b™Ì®GŸwt‘­îÝìè"­6¹9è"kßÕɲ9ˆ$ËëýŽb2Êáb(&VZå곎`§äY»†ÁÆtgc^ÙˆÆ0'D iÁ$YŒ»·àmʵµ¦Ï‘éG]…ÓßU?QSâòhª»›7ßúÚÉØLi’Sƒ¸pÅ“=i#Çìdû0 -âŽwJÍÑðªÛ¨éÎhmtf²SshõêOp´F›LÞñ÷õÉÓ‹ñ«Ü-é)NnpˆûÉÕx­èÝ£N×ß±ðŠ:ðamM$œŸ\Þuª…KzQÀÕœø‹GËГ4‡£a^=CŽ@º·gμ䵭yÉžGX–°P’áªÙƒüaFk±Hü´ ÏÓÚTw*Ls¢èæIzóà'Â’Ë'ôQÕh íÏC3„[pˆ›4pà£s¡” á}-ÊÐç¹ëù\&;bšŠ¨’^¬­ÌE¦¹pñ-ŸõmHÄD/{» ¥“-¸cYÕc,3§Ü™›ˆLýéê¬\ýëø­f²(ŸÇþÂóWÞí¯ªCåÄœ÷ Ž¶Ã–hO>ܳú Š;Ö§IíÉ6 /WOšo͇OÚÎh{Ê=*:ýh7–°Ü[Û§öKÛp­-Ö$íÇ!¸ø?°š{Ã#&ùÎg<|§u$ÆëÓ¯@€X;ÿ9y=¾ùº™Ì_ Þ‰'„Ãuœh~~ýÄôEÀ$:^ÂÙ)Ì?ÃtÝcÃ;aÞ÷?ƒY,\R×wG°¼–ó%¬HÜ©µNEí=›«Âè¨ þ|ü|ø?a!Æä endstream endobj 5068 0 obj 5119 endobj 5072 0 obj [279 /XYZ 38.2500000 178.250000 0] endobj 5073 0 obj [279 /XYZ 38.2500000 178.250000 0] endobj 5074 0 obj << /Type /Annot /Subtype /Link /Rect [55.5000000 155.750000 119.250000 162.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_nan_exception_typemap >> endobj 5071 0 obj << /Type /Page /Parent 2 0 R /Contents 5075 0 R /Resources 5077 0 R /Annots 5078 0 R /MediaBox [0 0 595 842] >> endobj 5077 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 5078 0 obj [ 5074 0 R ] endobj 5075 0 obj << /Length 5076 0 R /Filter /FlateDecode >> stream xœí]Mܸ½÷¯ès·Å}A{lÈ!€a9,r¼Ù‹ÝEœ=äï§»%õÌHýJÒë"%u3F2ÎÐ"‹ÅbU±øªøöÏ_þ±ÿ×ïû·O_þ³ÿÖþ|ú²Ëež5ÿÙŸþ¼yù [Ú¿ïË*ßûu÷}ÿ}÷y÷ùø¿ßwÍ_žþzüÛÿövÿ—ãÞÿð÷ã/lÿÑéüº+MyüùËùg]šãß²ËÏÓïÿ½ûÛö¿zì†k‰yýÿߨ2«³úDÆÈÐßwÝ4ÍùÏïß~Û½m0o”Ü›ÊT{ãß›ÚÛýÿ¹ûé8@×}v¨½1eáËì–J{©,ê½±õ‘íy5èüG§{£ß¹Íl¬ó†ru®W¹wÅŵYYµ 2>ÿ/ÝèÜÔ& äœ(WçJ»¸Bïš‹k½kTç8té=û+Ãu~¦\›)ÝÒÂÎ5WÖUÒ̇Ê_ûU@œû, Üœ(WçJ·¶¸wÍÅ-Œm nbß^ºÁÿªgpÊÕ¹Ò-.î]sqkßZD{ü­>‹.Ýà¿3yÀÅ=S®Î•nqqëì…ûeþÛ‹ëMÀÎÏ”«s¥]\¡wÍÅÍsß©å6÷¹ûü¯\®ó3åê\éwÐûç9½`Ršß€³úwáÃ÷_wo?ìßû¯?‰;ÙüøzdJ¾s: ;»ÿúãþYfüŸö_ÞÕ‡Âæ‰c-Y ¿©à7vþ8÷ö¶|B-ö=¤ €43ýøõ¸°Á×$77¬‰k‚9‚ç}˜ÿ ³öÎÝ—Œ9f7߬`gÀ•[ž£ÎÇ}ˆ¸ŸËÞ¨Kë—ãù°]oBWk‡×¶k÷ö†¥”ÐÂ|Í#hÒ'Z~£HEUgulIÌS½â™ÆÔ/µ-;z mÀ–ÆüÅ;UÐp>"G|qÃÞzM(ø‘ü©în¼ÏT9ºª.ò[væ/œ ÿ„¼!,IøD³IË‹%v›óÑõ$t÷æ½i;<K|3ó™· 1õ`å“Ç>EßBÿ)éÛxºF8ÿ«€ÏÂ8Db›råšËG{=jÐ+"Æg 1ù%ðÑ0´:Tuv¦ç™Õ%jizí›FýÁ»úüM¿i»zþ§¤Vb®u‚§I²jiO…ùÁÙʼî R`Ì¹Å¸î£ ´{ØC|ñÍEÛ¸ö£~K™5¦»•yœó¸àia+xg<ˆ9³ÆmÛ˸;;н&왞VTónîlgðÔb1’”竞é:v`Qݰ…“ƒzÀvð u°ØQ\u[vÀô{$çMùŠ™¡q(FF÷1æßÖùÃí™d“¨O‘´Ã½ñM9¿ ½áÌÒ“ÁÙa-Ï\Ù+,ìtÕ°¥0NÃúI5‘LØ3°7,Ë÷8]sÂZ¬ÀiNŒ“¼…,…GIÿ6G±]X>åtQû>ÐtEwó*‹üLO_(znÀT]iÆiäEŒG‹p\–‰d=¡ ÑC‚…8¼G„1Õ¸7gú,ž—5rÇû ÿtイàÀ)†ý9 %Ò»ùã8Hµî|ð7º*D%Ö.L!iyqÆ< ®¢m¨Ÿ£vžB[ËÜæ=s),¾!„÷.e|™ŠÅtÆ5#ë‹+…+¡yóJ—•ѹöè0¤w°…‘fâ‚rY‰ëzaÁ0Õ̽3š`f:PYp‚±ØóÆÊl`GÝ€ÆÑ5Mß:N߳ެVh‘¶£Ô1NBè Ò&øò‘sô1s¬Å$ ÆÊ »Œ 2ª{@lÿ‚2Ä’©z˜$ÅÑ–(wRÞv%"_"ô ³öõY;Æ{óp{&a`$ª&a`&è¢çg]ãlÖ"j°vÀ+,àY˜Ò©>G(µÇaŠäTcÛ„÷ ÖõÓ„•#´ƒ@¶`¼¥Œ³7Ëzt7­Ÿiëµz?«®¶½&8­ð¶ þ@´Åhqo„e¸AWlPÊsSn[Ê26!cE%!cSÜõ^R !!ci+¾<26//W ±± ¶ ã§0"Á0W•§5o‚ÄE¡ý½f…(É ð< 2SØ,5Œ‚à´»¬¿±S„—´j|„7¤Þöyo}u0 pÑ c{-$jÛsþÁ`yÐ%>Ð%’¾§àÁýiŒ€YA³.ˆ¢SË©žá.1gœðÉëT¾èiÊ;=д6µs×nÐ1˾…›¾'tB* £S¤‘ƒ!lDưaû¢ ETãâ< îMð-w˜ó¤Œ4¼ ™ôFeÓCœÔ±˜cÔ—O!Œ$šÑ’ ‰-Ý.X„øbmÇÙ±ÊfQô'À„ ™Õz+Ì"¦¶óôŒ&æp ›<,Tù\<ÙSàλ¾¤`U½¾Cýå\U@˜2 LÖ§m¨6¶kš²;î v4c K+kJ%£œÏL Y( ·=ãȨVJén2Ã^àÔ±”£Œ·ªÛ­,Ö‡8¥ºUõ4$ÈÛÀΨù~g’»¶„`*fTZ!eí¹¤…Ï_‹ç,Ü‹UÀ q‰GR… 5“õÃÙÄSµ“ù8ú0qY®Ü(=B¾ ƤµD™]iÍ-³ÓÍÜbðɰ…z:šÉÂÂ;>WDeˆ©RÀÌÔ`$ %b0ÍXóÀ–S@¬Â63ѨìB¼ç9Ø$’Kà›n8æ¡ßIÄ|Ãø~B¿f?ız~#Y=Æo\Þ09{XãSùQ=dÆÃ`Ó„ßàœål™ÅÏ)L.ž ŸŸ¢šÉ©Ç3e<@Â'ø+§ŸóßEÔëy=:;aUs*© DºÙ L‘nDꎦf5V/H9Ï*Hˆ”ö ˆôA¤îh^nÑë DºjÏj£žâÃ\×E¼FsÇÃ[7*ޣĻ,sYÒ“"™¤V$¼¶Q€D©0æ–ËÞm¶V{„^ÅæÁ£´$ë¶jë¦ F±Øj­X«2ÉôRà#žŒ»¥HÈ6[˜;»{;MX"…{lÎ&ùö8ðÛ¤‰%} §‰eèŸ3UlèŸoÄÕ²>ÇÛ¶eFq¸9Uéxà¼î8£V,ó .µ©òZnÔ{/ 9˜ NµiÈ Œù§ È «”D=ºÖg“`}ã¬ê¯ØuLu«ÿöK»Ïy´t€¶&J¬ÕÙ`û¥Êïߣ vî» ʯÛÍxØO¥Às,ËˤŸ`ßI÷-<ŽjÊõv2“f€•õR›1¼õ4Gg«g>•_ÈÁ¼Ã½éÊ‚jâ™®”¬ö%Jcrד‹‡«ÀrÛY_÷Ù«ú¶*%rÌGõ©3ÝܹÑÍ>¢f³ny±«G=‹8ý‰­Gñ1CîV_öV“òQq ñ¬‹ðÎ+ãåé>”+9{ºÃ®ñ‹•¾T ³Kð™÷¹?‡ã° ¾›|š‘Ïì§mÆhÖh W z/ä «™í›À;«2@ùž‹Gë™x5u½ÂÖ µ5#ØM½tY<ˆ öÕ²–÷k-Už>]~¨··;̾ÂÒ|W®rÐHlez&vŽÀÜ1A‹OKøØ‰§é@:ç ÈÛc¯û²±®[ƒ{cÜ4¬54Ç;­-*ÄÅ»¸ž-_‹VŠŠk¨@Wô¹öÅî9ø@¸“{Ö5ŽX%ì´Ù^+¥|¤ô`„È·GS.³PãÛœÏ>á\6avºŽDþS)*oªˆ³|Ždzªã¡ª*¦§:(«•žêÇIOu¤\AÙëKOu4ÞÂMu–nxø`^oÌI‰Éß$*v­ÞÌoy¤qypÍú2ÕÌàjf¬£ò”+c?P³Ž•«oy„IÒj:É´M”Öç2›!Mvh`C/D¬@-­Ã’lkÔ&À]û¦ÒìÍ|‚½Õ¨·Ö™2îPš«9dׯi\ÚâàL³V}9‚Fq™¢ *O¡ QBåÁ âÐ5ú¦6Ÿ®ïk7u¦\Üâ`K†(°°EàÛ8ȃX´a Á«0*;€ksCž5€Çë ¥Åá‰%ŒX†ïíµÄ5f‰!ö¬0žæäNëiƒ÷lic×(x"ä@U+sR ´`ÝyCª±d¸£¦iF®Û}}y/Dù<—šW6¿™453}j¥íO æð=²²Ã—Þ—X4NLßWzqé=¸gòsba` “+ @È·vzzc´y§‹SmBHøÖuä> q\wÓãÚ&´02íä8uáZþ<_l~„» 70t%œÌõ•*AàënþÁ¡ˆ{“›Þä¨ET|å=èlë}Ô}@^Õa¥\fÆ-e¬ÒZjކ>æær˜nŠuTÚ! Ñ+§&ËņÙöÊþY”£ÕÕ‡¸D¦F¾€Åø/œwC¼5( }ä7ó¦!ó&´€J'u rIxiSÜ!ðU_0å&æžÇîÆô¨²râ|¬`èâÑ)ƳÝT©¢ qÌE…jÓÛ~ »¡wÆ×ŽT¦6EUE½2#ò˜îŠÒ]Ñ­GïWÏ®›™`u”ÊtJ‹Òw÷U–»¨z&3b¤Þácœ³“1:°™ǘ±Pe„ÞåuQ|³Díxât20ÌÛ¬öëêÌA¬¢u¨…)/¨"К¸³ÀñÀÀÿ¼3îçJËe¦77a7¯WÏÛHÌ1_EšÆßòÂ8Õ·V¢i¦¥Ê5S7‰‘b|¢‚yiùËÀØßøâ ¡ÅžGˆY0.¯ºäuœ´,\Ú`Ó‚/¡°ÛŽ“eãš½Õ–(².¡zÍ¥ú2µÃŽØ›’°—+¡Sxƒ( ”×Àò2vŒ¾6S¦Q$åÍtËÁëü5s‡ §`©ZGYžÂûôF4¹T- å™B/ÌN‡:m%k_¸‡[{‡÷p, ·v©¨ìÃIãåš}å+\f7ÇÆ;h¬%Îì셧Л‰ÊmוÉ΂Ly`(³Â‰„ØiS@Œ#\±úwÚiôøgÿý¸”âJû"¼ÕÕ¯q‡Ìœ®Ø÷¶óµZëpí®¤áOy%¤Òè{° †aÀ¹bØÒî{(õZ pùÊ8nìÒúmŸÚ™PmˆÇDý3I$¶+2˜`+‚׺/a‹GÓ0¸7øMõ3³¦þBQ²wú{ö¬â?¢±l>_ Ž'Âẕh~ÿ²ÅôEƒ!áÒ`áÀË)Œ§aºÚ:àô»þ4b!I­b¼&aX^«Û%¬ÌÜ¡ÕNE ^\¹1²Qüyÿy÷ÐÛ² endstream endobj 5076 0 obj 4613 endobj 5079 0 obj << /Type /Page /Parent 2 0 R /Contents 5080 0 R /Resources 5082 0 R /Annots 5083 0 R /MediaBox [0 0 595 842] >> endobj 5082 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R >> /XObject << >> >> endobj 5083 0 obj [ ] endobj 5080 0 obj << /Length 5081 0 R /Filter /FlateDecode >> stream xœí]Kä¸ ¾×¯ð9ÀÔX–ä,0Ó3 ‡ƒi ‡ ‡`v7Á"»HgùûqUÙý°ë£Ë,‰–mnc·{›]%Qü(ФÞÿéÛ?²þž½øöŸì{÷ýáÛ!?V>¿ü“¾Þ½þEQ»Ÿ³ªöÙ÷_OÙÓáëákûß§ÃåßþÒþô¿¬ÈþÜþûKö·¿·¿ü±û£Óüz¨LÕ~ÿ÷ù{S™ö§üùûé÷ÿ:üõÙo§ûî:fÞþÿ»¢2uŸØ˜èúéÐÓœ¿~ÿþÛáýeæõâ­Ê<3κÌ4®ÈþûÓá綃¾ùüØ8cªÒUù=UÅ©'ïÛNŠæ4íãŽÎ_aš7¯­×ø™óà³blièÖC.nSô‹[–¦è¹ùóïLÝÄ[Ü3çÁg¥_\ÜzÀÅuE«ÎTEXÛ—Öc¬­mur´ÆÏœ‡ž”niqã!WÖ>‹~ûo„Ù¸³œ¯êˆrsâ<ø¬ôk‹[¹¸¥7— ²…0EÏÍǘÿ¦²ñ?s|VúÅÅ­\\Ÿe§“«SôÒ|ŒÆ«&bãg΃ÏJ·¸ãÖ¿Îi³rù °øŸˆ~|<¼ÿb\Þ*”2{ü¹eîÜçåÛc;)>{w2ó+—=þ˜ý1Ïû!{üåÐËÂ÷,NQòR HùÌøLƒ(¤\ãÏ0ÆCÌ[[û?“ÏÿLþ ¶V2æÚ·ˆbíü5%æ stM-ÃëÃx¼r˜7åKbXÞðgà*XÈ®“·/pgáÙýX¼ —}úù±»è8ÕØ;pÊ=0t 8úIõàöv ê´à¼mP§Õ¦è{…óŽÄŒË/Ì”UßåEYsô®¬+ÿjB/ËSë&?súB¹L¨;¶šÚ_[„kŸy€Ÿ­u*ñJk÷ƒy{XlÓRÞNp2ÖXD©2íhߎšXn¦Ø^ÞF˜Uß"3vø§XX+Hõ7%;W(„$ÂŽ;Õ}—»ñ"zþh‹V/Ýö™¢†¼áÉgôCÌ£5¼>¬U`ˆY·ý®¼57 |1‹« ]Q/¥ ùæCLèm¼¬’$dwŒµ%Cô;KçÚ†MFãŽ;ïÜ,#ÃØ­qà`¤T0K„Öü$dˆ6yÒw½r¨J?`o A°jn½`?®ìZËïÙÓ˜%¼ ¥øB™_–5ÂN$Ð2ýCM4ÁBÅ0H8ö(kR‚Ú|*î9öCº°ÁMµYBs`•eçË] Raµ$}^ PÒ56! oþSBn±ñ€WëØ–fì ‘*ÇM t¤ú€.Œ{4j™®«¬?8¢Ì–•Œ-6FaÃzÔHXgæCàâ&QB;š3×3aÇ&%üS÷Y@—t× ¯Þ28Ëûaqèô¥„ Ó!®?1X2.F×y¡L\1~”¾ªœä‡ÑÂ~Á)ŠÌèÏèV¹5ØOƒý&æì—rØC2µ;1YÁMЬ@’$PصlÜS,lƒ–G?k‚ûaXF˜·Ë%ÔÑù1ŠcÞ<ÔÞD¬k°e•´µ‹å@y¥ˆLØø7Î\#År€WJ"žë¤- Œ` Û#é‘NG«í=!îJQŠRöFQ¬Þ VK¥:¤ŒâÛK÷p¹/¦çs,þîN›{tÒ:½Û)ŸqS>«-¯+ÔÊä`WžÐS–¬mÖǃoß‹E½š„}Jø1áÝñC‘…ž,‘r•g4¼s¦¨…ñC)JY/Eñc{ø¡ž©´ç€#U˜k–!èO3®š–Š$üi¦,ƒ÷JgѺ¢0}—0‹vÙ 'jÚŠá“ÉÚH1k©ŒÖtSU!L·K^†§…ÏRE›››EQ:1q¹ÌîÙ9k1W¨i+¤Ûd¥"NŠÛÅCilÿ¡[„Ž4l2§&‘7Ë(.Ó½9é}„ôræšSÛnc)ü˕ۆ:îg¨[s+]Qõù_ßOã¨vhCà›Â3ïe°Ýýþ˜‚o­VØ9àÜ>âXoGJD—B®Ž9€²ƒ=G†Û@”ożÁõ) ׄ„@I´XvàgÈ fpÍÉèVAF§5}®ê´ÐËÉÝP¦:m‹:m?÷2ËK+gŒ¿É¹á‡m¾pëúЯ”+‘ábÿ\Ža|mB¶ðáŸq–$Šïàr›‘k“ã³8Çgv{õ[Öz ¹ä×z ë&Új}-ÑŠy³ŠIÞêSe*#:oRo‘g;Õü¼+c[þ)„±“ãëZ*\áNán ¸“ÒñœþÄíØfJ×M5PЄ^ z›ËZEÆþüqÊSû|j—Å~9ª‹¶xµ’©Tшî”ûf8ìOó—•x=BèÊ?N KÄ¥T¿Tý^Nk˜7ÎC3K™P¬ Z|še{Œžx+p‚Q¢ƒª±ãcÏâ]7‰ÔòYc=ȉ¶ƒSHjxÚƒì](»ÉeeÞúŠ-¢t^Ç FÊQxsŽôÁ¬P¤¡R°hŽžHJ¡Üû)â³—\©Ë%hŒr.ŠˆÄf|Š“»qJ:§@)n`(%FŠ“~p˜æ ¯#-ŸH—çJð*À CâŠ|#e”*$fg*™AF 93É)A [’'q¨†T ¹Z½A„³áð<ÔáçSX%—tÏmN9%É0@,Up}\Ј½´üÞI·–DÚ·+U£(Šß¸r ëÎs‚–̸ã¤'ÕUª«Âž8Ò° š¾8[-8L!4 ç9˜ %8üRÈBP8SâÙá‡ÆëÖ’ßVõI²ô:'õ“æÂÙ?Œò3„„0lÎSO„Ta¬fæÈèŽvV +X]½y~H:(ºrŠ]­q,yƉ°–±vàì¦åÏ,œóCÊ9v¶p"zØRí,®!o':3îÑ¢Øy2ºÆö¥S.›NœqõÑIÖ£“›CûÏîaÞ6øð“÷}±¨”uÇFI™ë”½Á)ËêhÕÑ[ÓÑáí¥yî' ñãóo©¬Á …¾=ˆ•Ì6nûöä—°u"‰ê AƒÌ9yYDìÐÄ[¢µ°IÎ1Ò[B•=åÔñY<£ns%fEŠtÇ„Œ.9õ3VZ_[*òö" ˜%<ÅÄnƒCÇÌ)¥s{ÒTX-ÂZlމ´€tX­(ý´§°ÈX–„êL0²Ó£vC©q?k8éEÍÆÕ™èÓÃ>ƒdæßnÀ§ˆç3lœî¦rÑÂÍäu9ôl¦œ›1v¤¯ÕV¢¼2v ò[|„f$ã‹0Á¶<#ÞS`Sùi†y¼˜Å¶ÐBªÅHJ3Ķ‚1N~“£pÅÚÎoØóq{i†;Ðf^‰WŒw‹ë±ê?RÎ2\%“Sn”£½g¸b”8‰k¥lÒíØAÖC´tådì°¨ÏEjÝ-7¢W‹¼i ú˜Ãˆ%b\œ‡Žx‹Á‘sÏÆàÚ>¹]Öú˜ÕHœÎcVú 45£aÀÒüd½§˜X¹Tî)°\‹ K•[E–XÚóLâTD¦ŒTÀÆì¯¦ÇòÏw¤¹8÷8‚FJ ¸Ÿ”[Û๱ûËÔ×,)E‰4P"l–ÔòQ*id"5>]³¼Õ·ü>ÓL¤\3‘%Ø(!‘‰D?+ÓvÛgK=TŪ'?z"쫼1^¹Vdâ}4x2 ~ ùÃ@0æ;rКqª$î~1à»l¬Ù5ž‰‘r¤ßçC87ý)Ç hŒÅV5'W.áhÄå}DiÜ>»"ަ¥(eoµ )#œ†vU¥ÝYé,€å#Cvä³Å^<­j“tUÍŠSt ®Z‡fýò¹”¢”D(ЇЇÄC­õ2‰”•f)E)7S))7ˆ”ZO¥ÃÃF<ëdq?ÙŽ<©Zm<y[Þ/»Î(hÅjŠƒaµzyÏXíÍ*ò•¢”-R«««§Fªè)·úÒµR”²EQ\Q\Q|b¤êï°ÚK¿½Åjã¾’~Ñ”5óZm|sÕÆß1`Ý·ÎìäÅoF´ÚåZoµê9;ix}T)JI¢¸«¸ËåM«Lop®=¥×vZeZÔÛRÒ¹ñê‡ÏµÊtêë£U¦¹—*­2­ò&ªÅ´ÊôΪL—NºN„díæ²¼'·÷5§íWöÔ²Drüuê&‡ÔdõµáXc¹i yŸ}¬X§³ýѵ9±þ²W/òS½+ëʵEq,Ì™0“rLéf¡8–þ2C/²}áÀ=äÕœ~BýtRå3Ís·/ÝH«Ž…J [»ì;÷ÂR™5ÝÐGì嵿+Hqh·?“û3ÅÌzõ"¶\;ýœ¿>ÿŒú*ü|è.M¯|†#¶_‰Ëï_SÌP,l. ¼œD?p]DÌ•Ýl> ‡Áa²Ô™‹×$ Ëk}¿„U¹=vÚéFQû‡ððZOOéèìëáÿ-ae endstream endobj 5081 0 obj 4386 endobj 5085 0 obj [281 /XYZ 32.2500000 649.250000 0] endobj 5086 0 obj [281 /XYZ 31.5000000 650 0] endobj 5087 0 obj << /Type /Annot /Subtype /Link /Rect [258.750000 657.500000 395.250000 664.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_pgcpp >> endobj 5084 0 obj << /Type /Page /Parent 2 0 R /Contents 5088 0 R /Resources 5090 0 R /Annots 5091 0 R /MediaBox [0 0 595 842] >> endobj 5090 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R /F1700 1700 0 R >> /XObject << >> >> endobj 5091 0 obj [ 5087 0 R ] endobj 5088 0 obj << /Length 5089 0 R /Filter /FlateDecode >> stream xœí]M¯#;nÝß_áõϯTR}A€þ E€F7Å ‹àM&ƒÁ¼A:³Èß}-ûÚRVé˜R•}ë5fn÷-[RQ)’‡ä¯ÿòý?wÿýݯŸ¾ÿÏî7ÿóÓ÷—jß5Õé¿ÝñÏ/׿¨û½ÿû®ë›Ýo¿¿üÜý|ùöòíðÿ?_N_øþéßû¿]½û×Ãÿþºûã~ù'ÿ¡ã~éLwøù·×ŸCg«.?¿ÿËË¿ÿa÷÷ãˆçéübnÿýKÝÕ}cŽË˜˜úçËù5ÍëŸüö÷—_OH›¥qMWÕ;ã¬Û™ÁÕ»ÿý¯—?&8_ígL׺®ºg¢®>ÎTÕíÎÔÃÖÚ„½þÑ>ÇàÝqðו«SÅØÖÈ£ïûÖÿÿNÎÝ&n«#Íœéw¹ØÊ8wœÇš›¾Ýu­.ƒá•·ÇÞw9G?®].¶ÄÁUw×uΨ‰ùHDoãç½­›Œ£¿®]Ÿ0~ñèªÜ™3‰´`8~ŽÑû>çè¯k×'Œß`<ºæwÕA¼’¨é2Ðèmø;Й:£ô?­].§íŃ«î®¹ÈÏÃí(Çä”ÏmmNæ9IPmÂøýÅ£«n°;ËO[59ˆärÊçõwÈ8úëÚõ ã78ý[Ê(x)§ßëò§ðÅ?^~ýj\u i»ûñçÃâ^ç<ýøq0gšÝ/GcéøôO»ª*ãþy÷ã¯/Ãþp:/qêIeÑ“ú#zb[8ÚWød€óÀ'xÕîSúhU¾¶ ÒÀô:¢ÖÀy¾ÀïÀyðwª.}O)êà݆+0:ÜSƒùíCúÎáy„7…´ø¯ ï¤(¦^» ¬ï–.Ì<ßð›Z¼ pmÛ™Û8QŸ ¤³Û–ÐÛö4Ï—‡kJö†mî¸aP·|2ðyÆg†ÐÕk¾aÚµ‚ßÁ:¯ Ê A¢0`Šâý+`vnÍ|€¹wÍùÙd4C]¾ö¯z(¨?w‡.°Ÿ ®´³ê³¢)]õ:e_÷·[bª}Û™¾k"¦p{gOáô7¦èÑÏbý¾ªWš¾}ç4š1û£G}Þ<•ƒ+ÐÂS2*³×wÛáÞX~&Ëmx÷Xž°eã«¡õ…{ÇÔÝ+#éLUG´ƒBAðQ,IÄDÄþø>ÂfUðI9 ³ ~â/p°êE™bÿL.(cj(M–ô¼c;ç!®™-óë|ÈŒæC csäÊÿzŸ7¬ ¼aݨ7¬¼aýˆ7ìÍÿuÅ^Ïqñ†u£Þ°.ò†u#Þ°îâ ën¼a]AoX_Úù6Þ!D¶²b_\m¹Ö¯ºŠ\„Ì9ÅÎ<8 )€ŸàUóXÙÂ'”G† à•b<›Œ·h¾Ç’¹Qf£ªïI÷Ú¯¡õÄ8‰SÁ;¤p»ÄŸY¹ÁªFˆ C“³Æv|åú Ÿ`/a7ÐõPC”ŽÁ.ì»Ãf7öÐa#úáVƒ„Éé«lÀ•ÂñŸ:Ó™}]¦ ÐvL„c²öM:t‚ç σA€ØB…»-U¦üû؃ Î’kÐDÏ0Ãt3L‡*4L‡*6L_?eoF±×s\ ÓaÔ0"Ãt1L‡‹a:ܦC9Ãt¨6Ãôù ÓÌ|ÍRå6ìI,U<¼`.ÂØìÑ zu0í^L7¦WúëV¯~éÕã§ìÍ(öz޳^L3¢Wã¢9\¤W_?ÕߌÒßÎQ@¯Öõ™g2##‡¿p¶?§?¡Ó ^Yõ $EÐØåƒm- e uQIßï-n9Æ™X\c3ºeÓTwÒg»³kŠïœù2CêªÕÈ@ oMˆˆ‡2¯6Ó9MüoæP2wÀRÎ#f”­R‚A„@FŒò¨s« !Ò¨°o%²™Ÿj»@á¥,\7ù’Ñ|Ì…ƒÉáb4c¨Ø² yz„?F‰e]-Æg ,y9f )pmÂ&D¸ › ×ýC1 ÅIw‹³ÌY·µ×Ù³èLN)'<Ú˜à ¶ Úš¬<œXìV´¹37ðèÞ+d‰22Iöø‰Ì*•0‡r-™ì:°éºP‹«h ùÖj)»EØ*NBŽGêÔ-. èÆ¬JºÞlÌçÌýŸ'L.æ}T¯º1™” 0£ÅæsÊ“šØYóØm(¸åêrá °€O_†K/Ö¸[¼XÓŒáÅš.Är~áÅŽŸ²7£Øë9.x±ÆŽáÅš:š£ŽñbÇOõ7£ô·sÀ‹µÎ(…ÃÞbwÍ·‚˜ÁbWžRn»Å4A®§×*àqeßRf;d­UTÎ5÷Þ´SÏ›IH¬aBb±Â`S oo·í9‚q¡»³7 X*%>UO–b Ô]Ï"ŒU| ÄnWr,´0¹"ëyÃTsÜ-‡$Þgs˜ÕeQÕ¡Tߤà}É' °:Ué¤Û¨€¹?3aoÝÀK1ùø$VôâÂ/%:Ì´ÛÈõ*€sêgÐtÅFDŽ2e.õÙ÷ÁF®ô™Ô©ÉÞž¨nš€‹9†T<* S³õ]3Tº0@ÿÍ&o¨ °›ÙUê·2øÉ8¤¨”®«Šò*Ì?ã”fÇK*Ðpz Ï9»ýŒÕ‡kù»–JR#•'øô–NðåÝxù"¢³í·. Ç´](…uß²4AÏk›'À–uZ\aeƒ©­‘ ˜vsÂ…ãó*ÐIâuN¸‘+!´¼Â›‡¹&a[±ŒbØ á=|6Õ]…RÝ…KC‡µÐ(W^á'ÐÉíIŸÔ ‘)̾š2ïY{u†8\®¼Tðy³€DÝ0e%ÝL©ëº PB¯Š¯ëØÔ‹ÍY†©s¡¹Õ S¹Ž¯¯ÄšEÄzÁÔJ¯þ~j!{º˜ß¢u`ðílQ^Tàz ùèrd¢Ë‘™G “R-À…Â*”qÕ0鉺OU#QTÕ¬\1ݘX˜Š ¬ê6_aÐ_™¿Uª–%ÊEÞhk¤ÂQ(¸ÊÕ\ÿâo/ß3É£áT5f– ïà'©62Z}Úãö¡§Ïî‘ïX¼ø#™§†O„U{Ð'¬Ú ‘n?ôÁª½#içNØ#4¨Ñnð;xþš…ÒÆhpÆ?Æî+\Á'¸jHQã*¸3hLØ#öäæ6öÒ"v)¨\Jôn}–Ñr…ëÎܬÖìóe`¤xÕŒ;dÚLJo¦Lz]„‘ªÝ­Ò7ÁÕwVeUe‚&äÿèŠ.•ä¨UökL(±íH)éƒç'“פkêÖb|DœBTcã_£eF3îäõug.©À„ž© JæÄШÊF"hI·ÛI´gCþ²=m8e‚·¦; +¢—ÞÖcO[gš}5þ|?MðæØ3qØÇdÖ‡7á Þˆ;vŠ7G‹•mê20ö‚˜(uøêÄɔ¶X8Z<1^#Qp7꾞Ç@‡‰‚GkE–´qð½<Åe’°ÖÆÞ„ Áœ³©$q¼·Ù]Ov!õ ù¾ÂSÀàµÛêÁõ¡Šôl•yÚÁ„j2:¥S÷¡´'Xô3"σ5%>®_à,©ê|&t5!©„7Å«†ßñ¡¶9ŒÃHˆù€÷–¸˜#™}J8>Xaá'øÕ³WSîw&æ$ð..¥ÉDñˆ3sYB|T·!0‚ŒQ-jp °ó5?®ŸèV¹Î]~³,n-3¼¦éCÎh\Ðó½FéÁÉÂå!2*eaS ÐÂ#`èã)^HøÝÕÇR™ŠþËë•<Da>Ãiýð1Š,ª¼špWa ¦c ù*óËF<¦/¯Þ4•¯Lø¦8u[Pj˜@ –œ âˆiC¬­X…a×\<²¸‘KEF‰ÕQ—Ê—UM›fŠØÏOÒÝ ŸÉfÇÄg°3ª0 U¼eœjcÂèzÒQ2gÉ*jTsHUB«ÏÚÿÔê 0“R.Ä!OàÉÒ§‘iù‰‘f:"^¥Õ¯Jk,vˆë‚àŒÄן¨0oIœÖ1§ìfû’‡Ìqøq R7$ËàuW- ¾pàσk­ãÀï`¬Å(ì€i€ƒÜ8ÄüïŒ>8œi÷>pŽÉ;„ x‡°Xø>ÂÚ0u0'bê` –ªU@ØaŒ_W ×¿k†B¬Ûó´KN{ÁK3ÈI iÇtÎV€ÁL…x¯­Æ,ü>ÌɇOJí.]ù¬2NèûÂh4bO1Ъ¥^ν½C”Rc¨x»„»„-/ŠWrhÚK«›½å«j´—\t!Mú•{áÚ»8”H$ÌR»¼q*!S£,Õ¶.!m~}9ÃÅ}–y+ukPêh&´)Nü>Lò5·EQ9ÙL 4!›³ÔlÏÀ±M ùŠU+`´Ó²ÈùZŒ‘B€—8_þº¶ ¾C4E£zŸ< :à½EªU ÈlLŽ¥0ë.^ù:…1ñfcY1WI™µ`zmÒ€ËÝ…çï|¼¿‹—ë¡j¹ÅÖ'“.Ç6êoeÖY¼¦qè.:…Õ6Ñœ™)¾?©{ x®ºvò¥Ÿäj—Ð}G·:eÖ–‚Ãi@²îÓ9¼nC„þKË»ötM |!§Ú•@÷þb~ê?¹ªù gƒ$±=þ=ñï6F]œÏóŽVÁ'-ä#&wªƒ«Æk;ñ^»¯O%ûfÍóŽ#Â<_'Îæ=­7màhpmžâ9ó°¸ T-¸á}°÷KAü>Ù )·½ ¤Ædd+çj|ñì+¦aˆ«´¼ZAÿæ'½èÏqa¨…ÃÖ„u.°ªJ¦‘]ÆÄˆ…Ëc×Ý0!úĸ™Ü»¼R‡* M´DÞüì)¢rÉÒÆt¡údw ^q£ 'zv=ŠS¡u›(Âjø)áР}Èt­˜únFßX¾46H§¢^c&c>m&þfâËüVÖÄÏxþl¿wíŠIÀôBÒ…·«…M€+ˆI#å%K t®¿åé­BUo%ÄÛJ ¬:ûîAygñÜÑ­‚´‚É´êB ±í&I²=ÙžlO¶'U¨Éò¢X¸€F~݆NEkètý"5túj«¡3‹ƒUk謹ÍcžULë›DªÕ£Œ0£„÷aj)m\¥ÌU¸ÝàV9«W=]å¬u”êÝVSëêÉæÕÛjjÍ84mñšZƒ¹äUÃÔT*~M³‰Ã®8°7Õ>, 5ZªÂ=U×à!󗯬@å¡k@`(‘æ®R@€ª9U*S Pè|ñt ŽÁðEêR…Ì’‘×9‹k5M¨K•Y ÆwÀ)¯RÆ :„7gTH¡ÔŒ?ÇIt þOÛ0|“L(ÒDp±.ß1Å#ã&¹kÉNÍk¼ C¨F°¿AðÈ0ÁÚ‡Ö±àR‚ö¹ÃØ l¹c¯±6Æñ*8*á ð›êò„´·>¼àsòdr³T6ÝrEÝB!χU‡*ŠY¥™Þäý €çÊž‰Ðä`ž/]¬Ò\r%åœÒ¨é* šWoÆO$»Név• áÝÄ\ZÊ¿úlæ­îe¸JVDÂsôt5wŠÔ‚„J4r™o–öšoŒ9k5Ù6Pt+_‚AÕó…ß+!›l±þ‚¸Ô½I3xò6™ÑííA5ߨ„ï“ ß‡`˜b€‰î‚Ñ(UM<"6ÖºõtUã,î|:<&aÎh›Sf¤e¦£jì9¡d¥`©ÊTŸ¢P_f‡Ò Ü  {K`£”á,ŸÑnس‹ß†È$ü¤®À˜@SPÝí‚Y€~Pøù*¦ÆN)ËhyÄ4ÔP $g.1’ÒÕmñ3Ë jæ Æ„\sE†ÏUÏ”ŠJºº“8¡TŽŠ[•ãйP9F¦å!]þeŽ”J/†9U‹—ª2K¹ÙKrPä¸3*ÁpŸþfÇàʨ¨/S¡2A¸h„¨Ëy¬sæpÆc¥ÒZ]7*ÎÜ3r¸²sâ/†pó–O©Iñ*JeþUÂÁ2v PmkKÝݲ…™NkÝø×òFn¬Q×ëK5£nùF'ñ#!6ßÿü€ðûv0¢lˆšBYT Ì'*{”Z.ðl}æM©U3ÅBq‘ÕBÀ“9s:tú!¼¨2zN·7S=Ç3sÙˆªmÚ_[$ð“F$”žÆ)N¸ü–IDy¦Š–°j,}ñû”Ò@˜¸h8®B—?Å©î»a yAºª¾à;a¥ !ªCغAê¬â¡)lÓèÊ–»„LB`†°Rr„×’\›LÀ A°ù7ß%ÚÁ˜³ÓGŠç”zâNk1íîuõl—.U;šŠŸ2.L¦ÔH#'T©3¡rT¥»H3VBÆžj²ðÖ*{­²…,²­ùoÊæ3Õh„nÜŠIàv0TZª ®Œ)ÍÖý¦4LNÓ´jBU¸ž&ƒ¥ä犻^fá§M¯[c=÷äJ¹€;Ì{…<¦N_ÌGsG¡µœê«oÃmM`ºhß9›ºnA½0ÚƒO°ËŠS—y%gí}WqIèÅŒÝ ÂûqÁ«nÅ8F¶Vç«æôK^FØU&P™3˜Þ R÷™ ìüªL%›~wÕ0ÜrUZ[˜­Q8…¢…¯¸³$…ˆÃiïV¬ÛV¡=ÕíÇV¢9Ï„µl7}Íd̬Ü3C4 k*â«Z@9³9!3`Å·2ZªpÈ8P‹­ê„ZÌuZ#û—Éþ§Ð` \fÑû]]U쮦ŒÿÆ÷Üàk;ŒöÄeëá“Rïã˜f7÷ß ñs;,„g-Ö•|~ŸÝS³–ìý¬ÕNU@¯U!å0ã _­ðwük—±¼ëo75ÉC´<¶jÕðÆ- $¹ž°ƒûö°‡•ô¥Åw{%@"×vÓYÊY·‹x²z÷­ëßRvK,|B9¿…íŸn·7ôóŠ@ eÔQS= ú¹©K£ŸMƒ³`¬~-dt€v¤ p»(0a,lâK¢Î“‚”ÓŽú†SÝpªOxáÝpª"­×ëlÚҸ΢p³¶*}K¡Î*¾¥àÑ0Ÿ2šfñ\{aª2Î0Ý¥˜ŽaÖYºä¥q/áÇ4 4tIó¦5÷n[ó¥É„X|Òà+ƒ‘Ç%Ð6Ÿ,WbÍW b·‘w›¨‰ÁP”©£Ae*ÔabAkޏëfÓÜ!C ©0ÛO¾ÄòOÔCW*“ïÊ®;üÙý0óÔq•5v_™c ÈÝÅîEÔì´în|º³×ûú5›&>müÄ›õÞ× ¼¢öicتÏh;[ÛWÿ¦¨Ú:†ãº·%Up±Æ¿zô‚žÕdžïà‡^ÃàÑàwüMÒ$½z÷ƶ,Ãÿ~Xñyå_Ð\u“ÎÞýcG¾ƒñ”9 \¦×8n™áF¼p±¤;ÆÉx9¼ºOZoÍåfpeD%™³‹ßø ’8 ϻp¦ðÆá‰ûûÏTWÙ½—Ç3Æ®^•ÙœT:ßvß^þ:u4» endstream endobj 5089 0 obj 7959 endobj 5093 0 obj [282 /XYZ 38.2500000 443 0] endobj 5094 0 obj [282 /XYZ 38.2500000 152 0] endobj 5095 0 obj [282 /XYZ 38.2500000 152 0] endobj 5096 0 obj [282 /XYZ 38.2500000 443 0] endobj 5097 0 obj [282 /XYZ 32.2500000 462.500000 0] endobj 5098 0 obj [282 /XYZ 31.5000000 464 0] endobj 5092 0 obj << /Type /Page /Parent 2 0 R /Contents 5099 0 R /Resources 5101 0 R /Annots 5102 0 R /MediaBox [0 0 595 842] >> endobj 5101 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F1700 1700 0 R /F8 8 0 R >> /XObject << >> >> endobj 5102 0 obj [ ] endobj 5099 0 obj << /Length 5100 0 R /Filter /FlateDecode >> stream xœí]IÜÆ¾Ï¯ès·já 4#)@ È!È!ãFlDñ!?ÝMrz¦Èï±ëëWÕd-Ø’§ÄZ^½zûòî_þ¾ûço»wO_þ³ûÖÿþôåÁìëÒtÿ쎿~xù×ìû?ïê¦Ü}ûåáûîûÃç‡Ï‡ÿ~è>øòôçßþ·s»?þýy÷׿~øcÿ—Žá—‡ÚÖ‡ßÿ}ú½­íáOæù÷ãÏÿõð—ßí~=Î8,×oæõÿÿàjß8wÜÆÌÒ߆cÚӯ߾ýúð®@Ü*eQWE±³…?ü§-Üî¿ÿxøé°À0½Ù·…µ‡¿S›k²‡5K¶ÜYÛT;oÊÑJ§_JóÛ³×¶M8ûiïú€ñ®•gW½àŒzµ&É<ÏŸbö¶2)ѧ>½UmÀôŒg×¼àÆTUÿ‚«@:ÏŸdöÂ¥œý´w}Àt,̾oªþøgríæ¸p餣°Í.s¨Ýq™ªu;ëøëM¡ À`zÝÛé&oÛ2Ýä§«CÅ1Iœ]ñr[S4€ÜÕAtž>ü[o}ºÉO;W‡J¹Âìš—[TÃÓò>ˆÎÓ'˜¼l‹t“Ÿv®•árG³Ž™o¥û P=¾ >~}x÷Éæ %W»¯?6wZ³ûíë‘MÖ»Ž GÙì¾þ¸û½1¶øÃîëÏí¾rå°Ç#þÃiäã׌ү®W³Õ¶R_­Ù˜Ó’ui‡%ë„8á®=4û¦5¯GŒƒ#5y:ûÂwŠÿyÄwß\°°%¶q ¼ÙPàº(£Çb­…ËӈߗEÕÔ×Þ­í¾±~ï]c_˜ Øá¾µÃÊçI´%špúÑ>¡õ°}<”Ãi.›} †Ó 7‰!8‰k :`´Ã·Gðlî ÞFxŒâcFÚÜDòW/r‚Y¸GÈF*4ÒcßÔH ×#˜‘áo„|„#MüˆÀdk¸ë÷ð8’ë<¼m‹oû)þ¶=†(\ÇBˆ BœÍÁoz·7|¸ë·ƒUÂys’;篚{&8z1 F bD ‘x¶2'è w èWÉ03p×x õë¥Î8j©Ÿ±ñçv ¹¾S°$€)Æ8âá<$Âmc¸áWBÌ&¬ƒy7ñ²<Ä㛃˜è‹œ¤«²ó—²×\€?ºV/U¬¿;éSwï`•ÐqXÎÞðMÒ0¬ñ7:„NCq[, a:¿Ý¶ ql’À³$05Òæd¼m›™(k£ðò…§A\Î0êà·¹±ð…o,<Š…'AmÊï°&/ ¤¢‰x>*Òôæñ¤=ÒÄÁÇþ…äfÍyydk¢ðN&b_-™) ¼ô˜cXÈÎñlc5nÃÏJ—b·€£Øk<=©Å­ ðÄÂ!0S€,&8jޏO—S…t0!+Ë6`b><¬Çð>Ÿ&†’€i YÁ™ÄËÁ; yH+˜ì*Ö=“‘õ×böUm_£sÑ Ž€è>dÝ0t–?«nc;JWÁdR0~„]"26ðÓŽ8†ðn1ZcäňH€‹‘«"äÓ¢ˆ'§ÂÑ3Q!ƒ‡‘ï1HÎY­©«9Ö* M˜m%GB.ÏÛüàçö!Ä#ØëW”𢉽éJ‚DeV5ÿô^5…W“ÁTT¤˜‘ ÷rkã£ÇPÏF5—Ò±Û™†á#3«»eÕµuðØù_Ábf­pá>(nK„0Š Ž ¦ª¦yßž°1u"¸$!T`8ΆFM±ËŠB£clÎéÂF•QÐb/ÇÙÖ6ˆ sO7œø2BOðœ°Ý âCþrÖohÌsØù:3dq¶ˆ°7"ì\Èâ€;`²ÖY©Â1³1!ä0c•pRœCà5>O¶¼Þ{«T‘ n9l{U*“³Ãdóà"!Á5*á“âÔA&ˆÉ=Áëè5"£‰IX‘¢H¥D€*&A0ƒu–Àðð5 ç!Ä’R•°ã„áÛgœ17§L]ò–(ÉÄöü5åF™A&­Q#¼<ÂHP‚´Zç¼®²Ê|]9ó9[—×a›¦¼hMy«š%îz«šµUÍ"ßÜ2je4Φ©ÂÈŒàup±˜u–Ò¡žæñ¼¹©H ÒL‘ÍlšÆlš‰ ù·W‘”’1ÂßèVùÞÚüwV[nê|XµÉÿ ’ÿ3±×r-UsW_€?ºÅûû .i·06¹k R g*b&Âx3 ŸËF¾$è”XgôaÆwMÅ„ó©\,v¥Eto^Ú|+ÚÌÁm+,šဠ?ÍD³¢½¹QШo¨g‹<FY†éܼ田]Ã:¶uw*0QÃ@ØáBȈ§Dì*†Ŭsj:Þ¥ ‡ÉU!žñ‡Y&ì£bÕ˜ªòD„Ý&/‹]²4ÄÄS2á&D€QÝhF*†™û0,9 F·ÿÄ⽟>L–^& [§±î.•¥êš Ë¥7Þh|S¬e«…ñêËÎÔ1)ÊASö0éXHÚÆÒikž Ù⣅aj»P±¨_’:=SÃl¹û‰òL-—%—aÉU³*Wý‡5•DŠø–!aªuˆ"¨S¬å~Šñ•™æ5{Ó­©Ñ7M‰«¬L”ªj{ª°x­Ìc*Ñ0Uûjû…\#ÄøWuk%å*á¢\ÿò8ÉK[ŽCƬ WÇÔ‘àÅ1°€§[€¹r @FÂl†w0Zßy“–®­š€]ÞL7àf<Œ¬”©Œ²«cd½y$eÛ3Ñ%B¡+Ú*Õ»¿†·,(½EQ å,ÂüÁ(LºÎ¸ˆnI.Í §q6HË(jʺsmi}ˆk¸LÑaáöå«„zŽØôŠëF2Ÿ°)9¹±´*ëPB!ü~9Œc’Vu{çHzûl~ˆØ§Õ´öâ§ÅHIg©J퀴Úpblð힉7¿Ç½é=I­WU(3Q*®$ BNf®„ 4‰ÐáFŠŽÇá?8ì6*b3S ÍL«Ò­à¨Áü¢~„ъɈ©þqOE+œ¯BäVE™ú±‚Àù¦µI?„ÞÔVEðše¸æRõÔcAÜõ ò¦sŠß,Rç,ëzúÞ¯Îyoé+[Œˆà\a¬îî\óãâJžÊQ™KJ¤nÊ_êi}2tÞ Ô„ˆyÐEèØ0Òûn¸½Qï2£ ·ð8Eñ1ƒzPw„¹vCW-3F”çïS;ˆëô‚{"á;Å;€ÅÒqçSaëÖL/6⤠Üpw.Ê„„ÛoΕÂâ}FšV\Ó ÷VtØRg<]å¯83‚Ï-4Tbš·pªˆ9Ü›€ ŸÁ6-¦¿Ý‚¹£°kÆxMà7Az1ýÇï¿kl]Õ=© £ä¤i›=ÝíišcúU2ýD™7C¼tzÒ‡ƒëž¼kBÞfšã“b9€n{x ¢ª­ÄÍÜûÉB7cgᛋnôø’çÜîš3m ˆžÀŒl†q¾€¼2K³Ô¾çv™øtð¥ üB^áíënx$—•gùA J:ïíí%ËÐÇ›ºžå©³ºuÜé0í#ú®S¼ß#æêx„¸áDT,YÆ&NÊÌ&|£{ ¦)7gÇ;Ð¥Ä îÌÉf7¦ƒ­-ó6×ɵú¶EynËVä%ËË&£¶Õ–×XžY‘ñy1¶ÈÍ´OÇoF­GÛ¸\»×«&Õ8åTŠöÀ¹†%™³LîÎÍ#qU!èŠè/Ï$WŒ¢E˜4Ê1]ª¹yÊí|3¡ eC Í•œ¾=t§xÒ¥-8èí%m°T–£©S¬©“†Î¼o•q*“äJ4 8›Ð[sCF`š´,9D1ÖY¬z1…’¦NŠƒ fòò3õ3Üö/y`LZ6C 2´y²#=v«·œ:Kt„Ò&pRýº°‰ßý¨òm¾DÖ4Aý˜ÍI»9iÑ®7'íæ¤eqg t­5Ó_¤soÉtcs Ïâ˜mgßÉìHžúfþVך0ÕÚ²¾ât[”Ù¦ä]o S[ÂTnŠ]W+ i[ÂÔ–0ÅÂ`K˜JB7Úr¾w˜0Õ:{UI€Uêˆ[À¥Ù.3ë¼Îç.N±tÝڕפ¶g ‰mݹŒçÒaÚêçÙÍ5S-äOKúòù²º%­ÙwÑ/ˆt…Fzà”{†ô.ì‰oð:Âlø›}ãÎNÕÖ¿öa}@#}ÐÆÔ7Oð<¨Wí½ípç<âÑÞÌcüz7áÔ*¸„Þ›°xÒÁ=±·nõÞ¼5„<)¾¼£íŸRc‚·Ô‹ÿ¶bo.;„ný1…•Ç·ˆß’ƒ³ÁûÅ{óð~‡*³1ï\x™ð]o©°?W¦…oK·Ð±ƒ ×± :ìÎG Á­QIª)%L{$!¼ ‡2¥…퀭}ÒGøÆl¹7!5ÁHÕ¿X7 ]‡T¹ê몖Ï•Ž¤›Ý"œ‡ 茈¸Â—Ìä‚åŠÉÄÉMøyŽïÖS :e‚q!ÓÊ´ª¾˜»DDéÆt¯ËUõcʺ>7ýŽÇˆò؈S˜æ’ £¯(³ÝåtLWäUiGO%”i¤êQöÖ\¶V„ø”¦õìˆ ØþÝAî…‚¨$î2j¡…ˆ ù³µOÜH„vk@ÕΣ ÐÒT‹U¨X°ßÕÊ\Ø"ÎÂ8'{áåµ1‘q2ýoSkµ‰ËODDMä²0§×$mï5¼R•\¥ÉÁd¦2ÃQ#xƨzŽPGœÜZ ±j±¹s–©b±~Íwy ž§ËWr•ƒS-µºª¾ê‚(ÂX(ˆj?B ð‘/¹Äïí]@‰1’â]™|B ŽÝ¸¹3%g‰¬¢]Cÿ˯à¤;"y>gZYi·^D®J´£Š€Å«Æž|ÝüÚòª¼\°¨î~G”KÇÉ¥¹NŠgÒôñyˆ²nº4’)!”r'FpZpÖwöœ@zYO•ïÝ÷ÃÂâ¾>Ïý… ´Çf²ÉÁA 4öƒ¸sÏÜÅByªÛw=!ëuò”Û»®5È辪ñH·¯F™]JÐ:~N ŸÚÛ§þ¤£0Ì^rÄÒ_qÞ’›’çFì 6]b­wâÏ¿éÅvuôÙÍ,ÂÿlÎ ‹?B]«ŒG‹•¸FŽ>‘yq-›«T\\°°p9„…1öë®Ó\µñûž°\ˆ%0"À™—$v޼î>?ü. endstream endobj 5100 0 obj 5086 endobj 5104 0 obj [283 /XYZ 38.2500000 350 0] endobj 5105 0 obj [283 /XYZ 38.2500000 244.250000 0] endobj 5106 0 obj [283 /XYZ 38.2500000 244.250000 0] endobj 5107 0 obj [283 /XYZ 38.2500000 602 0] endobj 5108 0 obj [283 /XYZ 31.5000000 159.500000 0] endobj 5109 0 obj [283 /XYZ 38.2500000 350 0] endobj 5110 0 obj [283 /XYZ 31.5000000 95 0] endobj 5111 0 obj [283 /XYZ 38.2500000 602 0] endobj 5112 0 obj [283 /XYZ 31.5000000 95 0] endobj 5113 0 obj [283 /XYZ 32.2500000 158 0] endobj 5114 0 obj << /Type /Annot /Subtype /Link /Rect [385.500000 194.750000 471 201.500000 ] /Border [0 0 0] /Dest /#10#ab#8eZ#aa#12#d5m#ed#ae#c21#82#d4#29v#9eK#ec#18 >> endobj 5115 0 obj << /Type /Annot /Subtype /Link /Rect [374.250000 117.500000 426 124.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_examples >> endobj 5116 0 obj << /Type /Annot /Subtype /Link /Rect [60 59 84.7500000 65.7500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_overview >> endobj 5103 0 obj << /Type /Page /Parent 2 0 R /Contents 5117 0 R /Resources 5119 0 R /Annots 5120 0 R /MediaBox [0 0 595 842] >> endobj 5119 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1409 1409 0 R /F8 8 0 R >> /XObject << >> >> endobj 5120 0 obj [ 5114 0 R 5115 0 R 5116 0 R ] endobj 5117 0 obj << /Length 5118 0 R /Filter /FlateDecode >> stream xœí]ËŽä:rÝ×Wäz€É+>ô ý¸mÀ nÀ‹FǃÁ½·gáß·2%UeQ:Lñd””š »»K%’ #‚ñ8ñË¿|ûÏÓÿãô˧oÿsú1üùéÛKq®Ë¢ÿßéòßo ›óð÷SÝ”§¿¿ü<ý|ùúòµûÿ?_ú¾}ú·îoÿwÒ§íþïo§?ýG÷Ã?¿tù…ß_jUwþvý³­U÷·âõÏËÏÿúòï8ýý2â8ݰ˜÷ÿþ£®mÝšË2îLýóeüLuýï?þþòKO€°YJÛ–MuRÖØ“j­>ýï½ü¥›`¾8·V©º²uñÈDµ¾Ìd+}RºíF2f2Ñõ?¡á# ^¶6Þàו‹SE™JùG—ÜܪªÕ1Hô6|„ÁqðëÊÅ©2n.]rs›¦‰yr߆¼{¤‹ˆœsYy´“‹G—ÛܲЪˆ·¹·ÃGÜØh2Xy¤Íõ.¹¹V z«¬#Pèuôä¿~´Á/+—&ʸµppÉ-õÀúm>¯£Ç ~¥¢éÛaåÒDw.¹³M[G<³¯£Ç ~[šxƒ_WëÌÂÁÏM5üþœºéæUºi»ë—jN3w¯²PmUÔ…df[ØÜ3ÏX­±g.³Í|Ñ )I­¬.gfþ2»Ì~Ø‹ÿBßú/ôÉž¦>Œ‡ÎoOܦì&˜÷!Á`µ;ùŠ7òé|íx]Zuº]huúíåÛVö¬ÕU´=sÆ^Óžµº>Ý.´ÞÒžÅ8gsÌ°Ž kûO¾ìW;.r›dל±Qç5Ã)+“l&ìÛ«3Ž|ßnüþòË—Î4¬NßÿÒ©ï+û?¾ÿþb»\œÝw}ÿóéŸ:ú¶ÿ|úþ·Už‹Ö\â—ß»>Ñý“æÜ´E¥oŸ>©á“O×'ölMEy}¢ øNÓ?yûAyý9—¶jêe«êÎ’~ýÞ±àcÔî,%DðîNãP\÷Ó¶çëjÞQ¢AOŠð‰Oà)ÏF7ê=oÂyðÚ¨UÃxi\r5èðáϘžàÉÞÅ"„ùrb=²„‰Äª=_ Ï£l|Ù5Qm\UDH÷)“0dà 47dÝ„Ë3ÏqǬ W >8äšÅ- õ9œžf°wŠsU«÷bÚý¾éù,Bcá}dD¡g»àfՔ݈Õ*<3»‹‹É–bâci„·%@N1Ê ¹„œRÝãÄhQH%<šçaD 3Á³¥`ˆú¯-kWÿ1GŠQ˜þXuá0ŒŒ·è3´¢ñ<˜kà†ë/Ëe;^l€îÂr&‘!ñ|‚ßÈ(%z“ȯ>=Û‚¿4ÀÚ&,ZFyìÞ´Uf|é±czom1¯JƒÓÎVðË›º­IÙ*¥¦:€žû–~ÌE˜çÜ0·èm%Õ.$º»Ê:,1 (/àIºµPK’pQ‹ ð¤ò ‰‡|þñ»>®ˆZ³lGkêpSÎйËÜTæ6‚±Z{Ïã¹É}¶(—¶r°lŸ8DV"áܰb—O ¼.{1Ò¶ï÷w.Ì CÓ¦BOŠ/ðI çOÃw<+ø>ÁÁ~ø¯MAêà¾gmŸáœni€×†¿Ç|LÇ—µjîÓSq“¼ìá>Mð ~GtÕ†IÁóÔÄ Jbð‰‚):øÔâwŠá'ïœ|=XsO|çQp i`á)±xm˜0E1 à;ÂBœ`Ïnce<õžµaZrÇ£‘ñ9%$¹Áû%óÄ|N¨ÛL}è¶Mè¶TgæÐ`‡{2 vè‚^”ÕÝï>tAqèq]àÙìO ¼‡Ä÷Qô‰$þŠï,x4,G=O|éqÖp0÷2ó6Î`ãt6ÎlœC ­B 1Çs}¶ó98ÈÁÖrpr0LËóc•ž:O„8»D9ôÔôÔá+L«?eÄg½SÞÐTc†IPWå• ®€ Ë™—Hb¦òM™Ú<œÎææÄ1%y"TòäHãä8&G’@N Jˆ`Š]@u|H"ñÅLö©§®É¸&ŠÄEˆ’èeð8™ ´„§cæÐkëh·ç+Ä¥ pd‹E«Ö0€•¢ ßD‰’¯nž9ÃË-—”9í­Vï·ñ¸'î(ªâÉı+Ḫ̌µ ­Ì}ÙÂûòƒ·¤ëQÚ¾ö‘[¿+- ‘⣔°ÛþO/ŒEƒ©ƒ“pÚ_ƒ×FõQÌÞ õØ9_Ë¢îS½ pj ì±#ŒÔOp|:¬çNÞV¯¹+†~¥iÖÓŒeP%Ü!»a|,È %äEO$|‚ ÷à>L«–p¢»``B›…gËâýÁ’”ø|î™®L7,<–c†Ð@Lw ¼Û Þ;ƒVçAÇ= Çã¾ôŒvÌOÃñZ؉t ¦¨ç.ÁØLG Ll%áÃ|€¥%¦N¦)îÓêxr<9žOŽ'Ç“eO°võèPl·b mwY›À£Å±'ÛîŒ'é*<'FÝ%=ž1¨ä;ÑSÛqJ”g1ˆ¼¾#Ó{ÑÄLá:ŽFŠB‹ ÷«ßY!…g´å”’¸âÔ”Æa‡Î§ýÖì…:|t‡îfm1ódUëHÃbØÅ~»6p¼ˆÇ£UÚ9û‚Ý ›'{Ñüag(â>A‰DÐ0çê}%[!’þóžg§µ|´hµ•…KTã2UŠ®*fö¹ÑÎÅ.‘IÔŽ›04='³í°²bÛ×óVû¸lÒš™8nƒzJ`.ÇÄN™onmý^PÅO°Ÿû. ÑÇO°×Éó=Lî “s=˜¢LÜI4럢è6+òg—>›GlnåÏSQ`"{®5ì7ÌÄ®æìêü´68;AôüΦ,^g'Š‹…˜ÃX²}é³YbOìS—¡R" zòáÁ½ A‹f\žxoeÈD-ï/Åiq$…ÒA˜‹´'0à ژÍ6Ué¨@&Åj÷Ò×#8 Dg¿GÔ–ТRj5.s©¸É`8„ò¥ñÓ¦ô“•eyÿF¶3?Ù6}Q‡WÇû¥OãÕöÝÀïyßM2oS’£¡|K*JUwƒ³:™ÝÂYªøÔÒA¶ê¸€²æ·^y»b9˜_¢¤¬˜*[s—" —ª–ª²Í8e ôôȤÖÎ7¥ EŠÎÄuãÒ=m-PäFʸŸ÷l•™ÇíræÉ4û„IW om9/á—ÐÒC±È P$Tì“Û@ÃÙä%2EÄ2iˆXÓ…$(ŠïRgƒ9i‘ÓmeûP'òóO‹CúÌÔì VÄ\H³(4Ÿ¦R@zyœW¶v"$O„]=‹Å–*`ü˜epV¹Ê2C sÌÂ@´H2È*p¥ ù!àÔav ¨‹“MÞgbA¿'ÐTaÖíb?fÁÀ»7O`ßÈqB2jr8CâÈç…Ñ„žy¶tÿYAo*0†\*qgmå“vpÏ}1ã®x‚Æ_eU;zÔ£2à:=·(|†™BÆ/út2q¦TKGɉ7·—?<Œ«1î:÷ýlTã|Þjú EÜÔ¦žˆØTuñŠy‚5¾Äµß#̱|$$g8lɆt´ç䨲t6t]ý"ò·ÖÚep"fá¹DŽâÆÁ)¹¤à̘¸kª{YvðºÆ1U…ª£´7½5Fe#Cöd×½ü1‘Èð¥ëca_Q*™§˜‰§f™p3˜L9ýÁ]1 ÷泓?eíáµ-OüÖ›‡²„ï–ª0tûw?`ÒT$Ò¬ÚçË H&gÜëŒà &5=[^0…‹#ª®sÞç”1­{¡#Ò*Õ‡Ø }”ÚŠ2 “ËŒK2°aÄÁ‰T5á¶FDÜÁ= ~dxèT×çMw·Z¥Ïmo¾,™CŸÊ$ ´Ï8}™›VÎtŒR»J1·ë054¾0°Î[~Q›$Gxö€7ráàæté¥:.«z®ªìû);ÁÜßµo@…ž '¦ØŠ3ïàyðh^A Wðª&Šæ \[Ï4õÙL6¤_[u6JÏ« ÎÎpÔm`[U;ï²ÑÜÚ 4ÏÀêsÔ_Šéæ ©èÚ<»çQ-Á!­œ–¹/…ó —˜¹Ñ \^Bœ¨RaL7o›Ð2Ëæ°Õ œ Ý–|„2î)&[NØ›€Õ06Ê˜Ô‰Ò ZŸ¨KV¸°üÓ=;Èäo“ï²o@鄇SD3 ·ÅÃCË}EŒ;xÈ.›ë6$Št:mÂÀÕÈöÆ pM®Ö¾ŽêÌijWoÔŽ3ÍE¿žµÉ–¤‹*Òä ‰Üp€»ï679ik¹ìÅw^©Â¬^înÍèâý15LÕ¸€LŠc©L (š‘u_2)ZCoyà—± ‡Œ›°$Ñ€ÀåÎN  Qí,œµÀl‘-Céã‹dÙJÓT.ÖäîÒTF‘¨uy·˜%&€dÝ:š/€sàû¾ÆN„3B”•©¦ž@-eê­“!Èö(ƒ­°©4Mb6Á<Ä@qBº1%wÂ}Ra-ÉzŒl/Æù2o2ñ#[L }C.j—Ú½næG—ÍŽ)ºê¢Y@)‰Äƒ»­G¸ÇÞ@Ç7™RŸÌÒ•&¤²Ž™»Ô¤šœÁüf PUΦ{Vê èµ_úÄö$œˆ”uE”?37€,‚Ç#Õ¯fÍþ¿Ti qCÔgL„A²”@¼`úM‡tæH…Ù–Ï©ËÑGÖ¶{?#*D´rt‡ŒSZ´;”0’E’¬sú"·d¤Õ´¦óHà$6;2VŸ¶®I@h]¦1Ü6€5ˆòÃѰrr`ê˜ÚµÒ)›«!’Œ ~/ r¸ôÇžsL±D`;ËDÁ-)Ô;Rô?YDCP•[Nh(Òd¹-û@ªù+oõtQSº\>ïúuÍùòþ%‹´¨oòÛË·H”½Îôž´Ï×ö1U½µíçQö¬ÝÊÜ==ï3ºË×—øB£\NÇ‚6Ž„¾®a©Š ÉæÞÄ Î_‹ÜÕK8úª~‰ðFx”ðæÓ28~· @ž©†%f”ÖZgC({%rú¼h¡…43e¿àz4&ö+ Î([~LàÞ27Hª¯£(æ@*ióMÝÉe]J‰*̦¦.ƒãÅ(s,‰ Wªpîp¼šPIÌd`e\•Ç”ån÷³è!{žîÉr´ó„¢`@Åv¤;ß !._ ±`oy[š`¯<ÍÀö$ôäãÖ6žÆ2Ñ+0ÇÉ7º'¶Ýâr•$í~ÙŠéJdpè{ô½0Ð܈ä]D™¾ó"ÆŽš“Sî+Wð¯§Wõ Šqˆæ”É jŠÕi„ä0nBÑ6=É.½Ùo#+HP”MÊ?úƸ–À6R˜Ò’Ä„ÇV•«-%ŠÉ§±L9Ñ󟬵ÃÙŸÑyñ¤SõûËuâÐ3v.¦®ÃwгëÙî{Ý'ÖœÅüv\®èYn2ƒÍè»ôYïÝ"jÃ%‡>Éìs¦½%#[eÛ¦ä*-JUû»F›ˆ)2ÁñÁVÚÎ'võGªq¦¼°zOï7ÊUèÉÀNÕ¹š4Íø€ÞQ_àh-m¬œM£'¯¾ãYÁk[½ýŽâ¿E«‰8ÑÃ;ö<‘Ÿ–Y³ žZÂŽÀi-P\e%Ò0mò«|=¡…[‚‰†Ï6ÚY$.âN’ÊRÕ1²«szEVŠ K>c&j”ʺŸÿV<ö½™4F‡Hàe'ùO—ÀÅô'vØÔR‡Ë#—FÇdeß"L*Eå –¨3rãÇÏöWºqh¸—¾(;3ݯ<ÕLƒ?&“?Fm\DfÔq˜ÑÂX§lmE²ºUÆV&Z0QPmLVl¾ vWÈÆlñªñí7ÀQšø¹mŸ¨ªo/ÕƒCdeÆa€€†¯ÃÌwaNíKM9§‰¶nžrc+=º.¬+W&KÑÈÕÿ&vËO|`]77Ý™§m„Öî%d'–ÀS´Áè¶ëº[åkŒJÝþ$Ks€bèT¶ä&»‚´ËÃb š˜Á<éz@ÐÏšgvãfì²ÁI*Í? ±úûî%Ⱥl^³.7¨LåcÇe+ Ô‚’ÆxM2ªÆºÜ³ÓPÇÑCGê Q)lÂ\­díL›CÙBÀC×>D¿l€Jœвoa-%tÁßšéâyU{¶¬ÞϨêsݾ¿ÆwæI9±ÿ  fŽ5s–)κûìw§ÿHš¶ã£+ñ|¦«øLµÓï_Ñ<ψr43\ÁˆròŽ‚ó Glîá‰>ÛÒ,´aGL£ê¨7ž\â´˜qˆÔWHÇvƒ?düwynšâT—?j¥šþ§õ©jÏ×ÃÕýòð“/UsVªÕMßfñú[õí(ã¿ú9ºßþm.¯Ü·õdݽã®DŸÆ•ö£¼ÿŽ/}ùø‡äÎÀÁr-õëÖU¯ÛíD6CpÕp¼Õ±è¡ï¬ûºëÇ©ÑuVªÛ\®jz /¦´å?£y̽èÍÜÚ¾ _Šò pº’»±æðÓ4¾¾cKÍ|†Â£Áw¶WAŸ~“åÅ2ÜåïÝŠßëª9û° g…/*p0s  ãv™¡²äWñ|ƒnœ“Y–¯²œ‚iƒÃgŽðg4³B]˜ó Fò®¨¿Ñêweå×Ó×—ÿ|Ct– endstream endobj 5118 0 obj 7655 endobj 5122 0 obj [284 /XYZ 32.2500000 614 0] endobj 5123 0 obj [284 /XYZ 38.2500000 497.750000 0] endobj 5124 0 obj [284 /XYZ 38.2500000 78.5000000 0] endobj 5125 0 obj [284 /XYZ 38.2500000 497.750000 0] endobj 5126 0 obj [284 /XYZ 38.2500000 78.5000000 0] endobj 5127 0 obj [284 /XYZ 31.5000000 614.750000 0] endobj 5128 0 obj [284 /XYZ 32.2500000 517.250000 0] endobj 5129 0 obj [284 /XYZ 31.5000000 518 0] endobj 5130 0 obj << /Type /Annot /Subtype /Link /Rect [60 778.250000 94.5000000 785 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_preliminaries >> endobj 5131 0 obj << /Type /Annot /Subtype /Link /Rect [87 771.500000 126.750000 778.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_running_swig >> endobj 5132 0 obj << /Type /Annot /Subtype /Link /Rect [87 764 165 770.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_running_tests_examples >> endobj 5133 0 obj << /Type /Annot /Subtype /Link /Rect [87 757.250000 123.750000 764 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_known_issues >> endobj 5134 0 obj << /Type /Annot /Subtype /Link /Rect [60 749.750000 88.5000000 756.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_integration >> endobj 5135 0 obj << /Type /Annot /Subtype /Link /Rect [87 743 161.250000 749.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_node_extensions >> endobj 5136 0 obj << /Type /Annot /Subtype /Link /Rect [114 735.500000 156.750000 742.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_troubleshooting >> endobj 5137 0 obj << /Type /Annot /Subtype /Link /Rect [87 728.750000 135.750000 735.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_embedded_webkit >> endobj 5138 0 obj << /Type /Annot /Subtype /Link /Rect [114 721.250000 141 728 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_osx >> endobj 5139 0 obj << /Type /Annot /Subtype /Link /Rect [114 714.500000 126 721.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_gtk >> endobj 5140 0 obj << /Type /Annot /Subtype /Link /Rect [87 707 189.750000 713.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_applications_webkit >> endobj 5141 0 obj << /Type /Annot /Subtype /Link /Rect [60 700.250000 86.2500000 707 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_examples >> endobj 5142 0 obj << /Type /Annot /Subtype /Link /Rect [87 692.750000 105 699.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_simple_example >> endobj 5143 0 obj << /Type /Annot /Subtype /Link /Rect [87 686 102 692.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_class_example >> endobj 5144 0 obj << /Type /Annot /Subtype /Link /Rect [60 678.500000 100.500000 685.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_implementation >> endobj 5145 0 obj << /Type /Annot /Subtype /Link /Rect [87 671.750000 121.500000 678.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_source_code >> endobj 5146 0 obj << /Type /Annot /Subtype /Link /Rect [87 664.250000 130.500000 671 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_code_templates >> endobj 5147 0 obj << /Type /Annot /Subtype /Link /Rect [87 657.500000 105.750000 664.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_emitter >> endobj 5148 0 obj << /Type /Annot /Subtype /Link /Rect [87 650 123.750000 656.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_emitter_states >> endobj 5149 0 obj << /Type /Annot /Subtype /Link /Rect [87 643.250000 189.750000 650 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_jsc_exceptions >> endobj 5150 0 obj << /Type /Annot /Subtype /Link /Rect [216.750000 580.250000 236.250000 587 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://nodejs.org) >> >> endobj 5151 0 obj << /Type /Annot /Subtype /Link /Rect [327.750000 547.250000 334.500000 554 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://v8.dev/) >> >> endobj 5152 0 obj << /Type /Annot /Subtype /Link /Rect [43.5000000 533.750000 63 540.500000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://webkit.org/) >> >> endobj 5153 0 obj << /Type /Annot /Subtype /Link /Rect [363 533.750000 395.250000 540.500000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://github.com/rogerwang/node-webkit) >> >> endobj 5121 0 obj << /Type /Page /Parent 2 0 R /Contents 5154 0 R /Resources 5156 0 R /Annots 5157 0 R /MediaBox [0 0 595 842] >> endobj 5156 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F1700 1700 0 R /F1409 1409 0 R >> /XObject << >> >> endobj 5157 0 obj [ 5130 0 R 5131 0 R 5132 0 R 5133 0 R 5134 0 R 5135 0 R 5136 0 R 5137 0 R 5138 0 R 5139 0 R 5140 0 R 5141 0 R 5142 0 R 5143 0 R 5144 0 R 5145 0 R 5146 0 R 5147 0 R 5148 0 R 5149 0 R 5150 0 R 5151 0 R 5152 0 R 5153 0 R ] endobj 5154 0 obj << /Length 5155 0 R /Filter /FlateDecode >> stream xœí]Iïä¸u¿ÿ?E L¸ˆ è5@Ó@FAÛÎÀpiû¯m¬’Hý(ñIUU×4ìî¢$®o_~ý·ßþûô?ÿ<ýúá·ÿ=}›þþðÛ[sÖm3þwêÿü2oàæ<ýû¤M{úöýíÇéÇÛ—·/Ýÿÿx?øíÃtÿú¿?ý{÷¿¿žþø_]㟦—ú¾¿i¦»¿ÿ6üm5ëþÕ\þîÛûÏ?œþÞ÷膛&³üý ×­V²ŸÆÆÐ?ÞÜ2ÙðçŸßþþöë¸i£´-k¹91)ä‰YÉOÿøóÛ_úµÑ&Ëç“å'y '<¾Lœ°é',»“â§ËT³tÌ$—+}ß° Íuø´ ¬‡P§ù€ªßjï¡åªØz}—ØCËõi> >bKÀáÚáäÝ@;N½ß?ë«»yà®= JÞ^wÑý¢mäÙ¨é?øï@‰7LuÈ™•m.<2׎l%cÝ»º¹…xiÞ#:2˸ízjóB’ß}λM*×ù0óì»Â„bñÞ;ð鎾m¬ÿ¾mÓ¬7­Õ%ŽÄõ^âHTÛ¦~æ¹7Å7ì¼ôië†<íKï%D·¦`çýÌK6ì¼ôi# žö¥÷b…-×ù0óR§ ;/}ÚÖ²‚§}é½ÀˆFê‚ ÔϼÔiÃÎ32e‚•¤Ñ×ÞKœ,/H£Ç™:YÜyΓ%éñµ÷›/ Òãqæ¥NÖïiÏ˼ƒ½½ß ëýÆû*&XåJÌv»n=`×j صñ¡°k €½kf×ûÙzÀ®å°k #B`Þ’Ënär˜C½£^Ï ìbìÍžµjÕNB5¡osmúƒWáL"įXn¬xÿµ3Ü];ÛÎܵË\ý@KàbaöÎÛG¼[˜%`‚ÀzÜNĽ ýþ&Ôêo"6+=ÄfÛ5Äfµqº–±õoMˆËuã~J±Y±†Ø,†á!bÞ’Ënär˜#›jÜq¶˜êa$ÿ€Ðd¤7L‘1u ð‹ßAË·ƒö„¹Ï¿‚ ·é÷/ò¤>Ù!”ð‘ ´ÆŸó†ÝDM7QÓl¨j5©A4©k"Z®÷³ñˆZÇ‹­5å+uú–€¨ oÉe7r9Ì¡DM«m ¥\ ýTɉpli%Ö€«á8x¥üó~/ѵv¶$n еÑw€®mëŽQCE F–b7ýç#ªêĤéÑõ,Šc=^*â³Î$"&D15Ü~ŒºQÇ£fr©€_ÙgL'eÈîÝÔÌéܹbó†½dDs½$#š›2¢¡EOBËœ odâÒû©—dDsµBF4÷E°¾Å'#ã[rÙ\s$ÑÂÙiÙH`‚‰•¿µ0^+«3v <)c½å]ë sʉæ -ä…O•ó†ræ‰~ ïU¼ÅGt)#Çs'\’w<ßߤhüóºI#¬¥#Üî·^ÑëNò]jkû_#<¼¥ç½¸_ÎÃÀýnW4º[ª?† 4Â}››i;Ó_Ç8R#¬[çÅ𜶷Qu«[gE`í¢a7{¢<Ÿ­Ö| t ~jú oMì‡Zø¸a®ì‰Zó)Ðʦû–€=QŸ‚k7r9Ì¡ì‰vfß¿OpüºÒö“#}±–7í¼a7@Ï–«Íš-Wß–Û·e.¶ÜK7î§gËÕfÍ–«oËí[€2[îµ¹æP€²—ã„ü.›l¬û¡Å:ó(³‹†›‰¡i–æQÓ¬™GMã›GûŸoéy/î×Ò$Kß«ÚHBrÿÖ©®÷“y<~èC²ð}Äû–’Åt/ÝÈå0‡B²Ô%£¸j^*D¢ٜnjt&H®Å¼a÷Qž Ò¨5¤ ¤&£BäðÖtÔÂ醹^vÍiZ_ì[‚ Ò^L×när˜C/ˆºÅIÑ’@íS"¨©‹í®Ñó†Ý ¦­j¦Yµ@ž2“<µ€”þ­ ”\7ÓÏi˜+¨i³jÚ—û–Ô†·ä²¹æPP3íã€Ú‚ýq£`ãtª¼•ó†Ý÷Âï^X»r/l'þ-ÖB⬇·&¸wݸŸÆ»V¯Ý «ü{aUx/†·ä²¹æÈ{agÁåï¡:#kÌÉÜ•Õ|—â¸_4À<ÑZà([jM³Sg .æ ­iÝ@K¨¾õ)bVx¿ß¦ìt'„P^$‹MsüÜòD/¸ùïÑ9n~³ÿðe3ž}ëôkX托ŒñÅH¸]>4àñ"àH†¬œI-r3(Þ†)çU"yÅJªiÍ-Àµ?öŠâBB ñ2pT›IïíÙÑ<Ž’ ÅóÎ+‚ 0Äd¹œ˜Í^(\2d­G‡B¨ÁJ?83ËŠ•]ä¢bd•,ûýâ‚o¥ `³š7‚ñ~@µ–¶žâQ@˜A„ŒQP\ˆžƒ›Ä`J$„$™$+­I6¥À‚D­e­GÕ(7xƒ‚€›<"bY$LÁ…ErÙåº} Ñpi#ùýî˜ð…á…=ÚoÛRÈ€Fe‘­¦ÇÍÂbmMV*Jɤ’sEx £LªS’|–Whæ&Š™(bt"œ3)Yö‹—̬%…rî{^[t‚1%¢©¢z­°5ùy5(7°qT\—8Õ p ”X‚·EH)¶,sNr )¡º(#Ì@’÷X мâ߯ÿ”r/¥Ü]0RÕ” äÄ©ítÞ6ÜÃcevÛ¶_Ö°* Üñ —†#œaû),·šâøBŠ{9Ê„ááƒî)(“ϲÔ%‹’1/Ú1LÿT ¡¾$Æ4ÿÎ'£èùüH6$7Ö¸ VIx^¶'Ñ— !Hâ)R“T(w<³L~„·–•ôJ'z›”Ùo‚à­7ƒz·ÑzôŽÂSæµP´Dw¨ìŠ †€Ô ÁFfO E Ä¼nhnÙìžeGHð„ó’î[B-½ýqÅ7¨2Ц»n“Qi²¹‘džµ¾´6|ä¬<ù¸±ßkØ×“ø o ϵ%ФÔHîmˆlˆRì̇ÞŠ`àZÆŠC1ZP0¡ bD¢ D P24’ÂÕ8³»š‰ÏÛÒðWPÇñvûzÐÇÓd€s¿n(sá¹òÞ Â?™,:q™i8¢õÆz÷ZÞ0Y YŠN.K²ƒ²s 5cLM0£æ‰Þ/R¸»žiE]&s|⊟WàÎr(˜â›%bà¡R,e㬠ªög¬¡L+ú¼)*=Í$¼¥ùXûf|¢Î|@!áY­ûq+9ä&½áš´b ƒðöç6ÅßŶþù)™ñ¡­RÏOŒâR§z˜a8"á"“C¹Ù_Óõ+£„ô®Ì´5öý›æ|bá“΀Á' =ø Þ<·âŠWÝ&#ÛZ^ÉE}‚s¡­î1;0¡ûmܾӡOWÔÄ05o8Â#·ŸÂí•$­GƒR·Þ.ÁÄÊvý>¬a+ˆ/#xcùéø’oõVԄŹÏ)€0‹AkZí“u“~¬LÃ't6ðA®¸†Ÿ1ð93(«Íâ”TV-¯Éš*Š`,j õJwP–Í@­«Tcùü÷äÑr7ï0ZÖ¼‰$mw^oÜ»µ-Ä"\*ÒêÖÿMòA{è:œ™ŒM)Ê|”„ø–"–ÖR^”°# tE²Fí³;¬Lç=ÊOŒq¼-)®ÔOÑbfÍ<}”T`MY¢®ôó¿‚äijx,@G„„_‘øz‚d’^—¬°æ“+é¡–—9×JŸ«áÑëŒ;xÀjžßœ•QÄFø†I®©hïV³–)õTD>£D²PÜîÏ¢ÃÇò´3Hý¹ :Ü7÷ðd 8Øszƒ<^ïÏ’z¥Z+®Ú幪XÁÞp«ét§}iqX˸z•‚ýãUãá ÙiÖz >“AÍ­éö&UÖ¢ÔÏb60»Š`GS—`Â;ÖæìOÓIød’ö̃‚½E¾y¿±è—XKœG6+`°{ÖÅãôÜñ&=pÖðŸàõ¸hòèé³åÞ87_‰TŒÁ-ó°Ü]+R"GtïñiIÒfGYs ’ÊÑüºkeJ9>tìžËmf ‚ª“—äžj½P¤‘ˆR—K””/šÌ!?å¢.ÁXê$ÙH‡?C©+èsDug€¥ìéÒ&}Ãá7‘¨ ¼‚¼ž:'ÌÅæ OÅpëÌG^Ja3Tübí Ç&pÝ) ‹®ô 4I·…MÓÔ1Ŷa>›¾`Ç|Ì-Ýðtˆk Äá{‚a^`è©´|Ž®Ã»SkÖð^O6Ÿ´vó®GðÞŒ9 ï|„Æc<1;Æù8®1/g"`4fÄHŠg ^6t}}‹iH·íAL=Åç.âò‹ÅŠÓñ+Ohá˜ö{–ºIµX°G¥$î=ëK\s*¥t,¢W(KUÅähyÅ”’»ˆ243'X$ L”˜E,àß³1Ë}¯›½ñÏš rÇ1@™kQ¼5)| øŠàÓJ k ‡ çuöy€5¥e$Ÿï%aó-ü[2nÄøx±F–©Ø–Z½KñÆwñ4“¿îÆÁÙLe@öša¾‘6S Ä=\įà1؀ⓊCÙ9¯¹ìž³›“bö(^¶%Kg Ƈ²»'¬Ñ>–Ï Ttæ}Ja4üc(á¬X‰C(#%i+).˜’«KVyƒN+)0(ZÒT‡0ÈåG2uL0µþt䳂•@ËíTÒ,2$x>%$ß d›)Oï·~93'$ ÙNŽO¸)) kâ(Ê JoøŠæÜÇÌåRwj%dcx˜€“mC½âÚm+6EcC=– °Ékú±3v„xÙAh$%4ŽÏæF™æ VË]B¾¼0i Š{v—¸ã¢~³è$ÏG[8e‰ðÍâø ))×C‡UæÍŒNbÀ4ˆ¤ÛóY´Ì@uÇäšA Z¸Ûgãv0naoøÉ‹ßj^üÖ‹ßù-m/GUËÄ6…™‡n{|«hõžœ¤™\ßqHîø?>¦º7Kü¦ÿjä’^l•Rïy˜62k¦ò„fr®Á€âÕ¥flål0$§‚Òv35cIÔ–y”ãk]U¦+kßà'„ÞÅ´CHmQË KÚëOpw¶Jÿ&í5g„½®e®Ëšh•DjkS6—òëµXÒ)l%Çœ~¬)j¢<¤æð wy%éÄÊ@µÔ¾CO"{qÆ<ÜGÂÿÇÛ)Õ~I.…£¡DPüÌ®Ïýå˜>^”,\[$Oíò¼©4 Ì\¨ƒB2òr˜ó¯…g*ÙCòR¯‡')þÊÅWŽ:)ŠCBq5Ší¸–…8s™B8‡¤¤B ppköÃlël3ŨÆš)&m&T–ÍdI"V•gIô¥H_€láÂÈ)ÁaõEãëÓx’X“•ÉÏœx„âU»E§+hÏäÅ+½’PW-ž3 Û—¥“»Á‰‘åÐiJÉḂÒ,Ùt)>$elà¥ø¤ê,ŠC#ÉÅ–"þU"î}‚¥Q %ð§VŠõÄsýãî)©qr”Ǧø½“4~û)SD5B‰e¦,Ï’Vg¿‚ÿH±VM!Â3f/!”íÉ {y] 8Á¥Ï ¯ûFžZ"OJÖðV\~5Kˆ¡ÀÅcIS›éUI\6=ì»”e1Rx–ÂÕŠšN`‘JÜÒ’Š]ÞHŸ¶èPÐäQ>ØÙ%‚EpÉÙ¬ùïZNÜŠxJ¤ôCQê<¤‡°yÒ7å`Ï0§MÊßýdý“Ú9k¹—¬”;åÙ›!)Œ(J?ŸAínc02‘ÔÌAoyƒÄÖjZÌÃ\—ŽgtçkïÙ©)Á<U` ˆTL€`/åÛ_ ^ 6ΧV„­Ô™Æ‘8©1'28îá´ ¸Ö\ŸàSÀu)aoöÆ!àÄ‘o ¦p’ОÁ+EFv…ŒÕ—jòyS’åpD(¦)jaçÕXjeV{Å#fVöŦ佨•“CrØ[‚‚1«ñ)sy¾ C !éšlœ&¹ß£¢X$:úþ‹võ)‘è*!ÑiýÀ®ôœ~·­Ü^Q–ž•ˆ3ö!]V ˜8W²fݳ·ã=³H$ˆ;6òäõ„ˆÄ‹\ÀRt>”Ô>˜ÛÍêÕpC-¿’(œ[‡SôEÖ˜±·ÓßaÒˆF²lHta_9J*üZ~o™Ý5(Þ”4ý §žUÀ¯VXì§¡’à/XR•¨˜Gx„ïÒÁ¾:¥$J‚cæp(œ{VóIæâÄys¬çÛËù,öÈÃÜl“ªäI3PÉBS#9sLÝέOP@Ý^R]*œ™÷²!E¸‡ úEM(tÁ9"ò&¦ùÊ›áÄ‚PЉa–Š7ˆ©“ö!¥–¹3+ñô<1Žæ¦ìc^ÉíðLy›Ú™*YÔ8×n>ØÞ “ðFžr²=IO³ ãÔÁ8WÎa3•E¾Á»WŠ{ã8á1N ÷º…9æ"é“ '‡a4ñ„}0 žAp^:Ê-Á½Δáõàl/FïxwÞœ‰‘תðÍÂãà= `—jý€HgŠ1¦Y“cÜ aTÏo4IPÜðm¦0k´µò[>׋R×Ì<+DëÎc( e˜+À7àÅ3½x¦(¼áü² †Là ¥Â»ƒÏÃ5vDÖ컔ݹgjÍñ8yqÈÑW§¯Â^ˆÌ8Í5u‚[t`’š´íktïsiA+Ÿ á®äE‚Y¬«¡”â¨åzC¶®Â&Óz‡¿‰ BâTÖz6›wIÙìÃr[gMÊ#Æ¥¯•bè ®Þs7•[sݵýîr›K/YLÖrÖk¹W½RÈÞ·3@–zR§ÑŸ(Áb‚GVò’/§SÇÛõìþ‚“‚-‡ì¨ÓÈýΜAO&ÄÓžyÀ2ÃÞHßXôÍ$Iv7’ÔÕ±B¯ „´'Î~Ã἞ ~×¾ùŒv‡Yød¼ê,÷`~™‡ãà}û´±EA¼ñ`|²0p`¯ >™H(Sq\OžÃýPhw7ÏwØ©îÏéG·%Ñû²õ¾Ȭ²EÝ=kX?¿Ó¥rWƒ…ãqÞzü.?óñÒΞ¼Ÿ 6x2ÅüuGà'1ûG4ŽØ"«ksû<­ù¬bâ)ý«‚Ù.p"wØw3ç+Ë`¸7øÍD¤YÒÒgá­T€ëÿÝÍx‰LÖxp(@a`˜–C˜êÞ®€çdç{í‚ä°¼ï°{þáö}×8OwvçàRž3O˜MÄôåôåíÿ.¼š endstream endobj 5155 0 obj 7089 endobj 5159 0 obj [285 /XYZ 38.2500000 540.500000 0] endobj 5160 0 obj [285 /XYZ 32.2500000 410 0] endobj 5161 0 obj [285 /XYZ 38.2500000 540.500000 0] endobj 5162 0 obj [285 /XYZ 38.2500000 376.250000 0] endobj 5163 0 obj [285 /XYZ 31.5000000 411.500000 0] endobj 5164 0 obj [285 /XYZ 38.2500000 376.250000 0] endobj 5165 0 obj << /Type /Annot /Subtype /Link /Rect [203.250000 354.500000 225.750000 361.250000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://launchpad.net/~chris-lea/+archive/node.js) >> >> endobj 5166 0 obj << /Type /Annot /Subtype /Link /Rect [218.250000 347 230.250000 353.750000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://launchpad.net/~chris-lea/+archive/ubuntu/node.js/) >> >> endobj 5158 0 obj << /Type /Page /Parent 2 0 R /Contents 5167 0 R /Resources 5169 0 R /Annots 5170 0 R /MediaBox [0 0 595 842] >> endobj 5169 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1409 1409 0 R /F8 8 0 R >> /XObject << >> >> endobj 5170 0 obj [ 5165 0 R 5166 0 R ] endobj 5167 0 obj << /Length 5168 0 R /Filter /FlateDecode >> stream xœí]KÛȾëWè`eö‹Ý‚{&@ È!È!ðf³X¬qö¿R"9b“_K]SÕ¤fdcwƢدzW×ãÝŸ?ÿsÿïß÷ï>|þÏþkÿóÃç]uð®:ýÙw8ÿ@‡CÿûÞ·ÿúm÷}ÿ}÷i÷©ýÿ÷Ýé…ÏþÚþö¿½Þÿ¥ýï—ýßÿÑ~øcÿ¥î ßv^ùöç¯ÇŸWíoÕø³ûüçÝßþ°ÿ­q˜®_Ìôß?h_{s\Æ…©¿ï†mªãßß¿þ¶{w:€¼Yœ3ÖW{eÝ«Æêýÿµû©`¾:„Z{ëª&À߉“{ÝÍî¼ß+Ý´+ñ³¹yFWƒ×ÆÈ ~\9÷¡(S«äàÒЮC-íqt €ø–8äP©[¹´áàÒÐö„ö8º@‚«Q©[¹´áàÒÐnL„ö8º@IT:®\ ÚppahÛÊ ÊíçÑbU%'·O+‚6¼…jÿþNœ:tóºªU2­ ûâú¡­]/Ó'­qt Tð‚2ä´rîCð . íàA®2Ž.F9¹Á+—â*pðCc•òõÑ@¤™Ç´ÏÛþÇ~@gà ®9qZ9û©ô°MŒ.LÊN['GÊÏ£K€ÄtâNjðãÊ…H. mãM½çÑ%Òꃂ¨ääL½ÙàŸrÁ+9}|ß/>|Ù½{jeI½ÿòS»°ã„§_¾ílûÎÛÜþËû?V•ñÚùe×|«nhw\ßé‰nŽOÂ!4ÕôI¥á“Ç'ö`ÍɽûüÄœÞyþ †ƒxôD8¼;>1‡Vm þüçQ\Áãñ‰;Ôô¼u›¿6Êà#Nœžî4J¼S|:!?döU¸’4àù)K@^8z-/I©ãe†³~~bà;¢NÆQ_O”’H £®ßq|8xÇ ¨À'$Bc¡'ÆÜÓ>”ß çã—V¾ÊˆFgšH6*)ïm&ç0.¸? c›˜ÊñÖ15àý@8Q¿z8¦‡‰žŸœ4"åUcüug`-¤{<…d1|àYëÓª•&œǺ|=aŽ‘åI}”¦û^%vz\w!•828ÖñŠææX½ !‰Ø(º$Öα`¦()¬k#P¨AÙ „V>¢ˆOšÃq³“µ? 'ÊÃ'5 ¾Óó’¥w‚4ƒÐÁFçA­j9F^²ä°´ÔÃÕPÂH‡Œf(lâ¹ é’RK‡˜H1ˆðéⓨ@°V)n^w¶¾·èoàp–Í“dŽcæÁjÜ“¼MøP0±ƒc†˜žŠé¤®˜AªzbGxcD#À!Aö¼nçWê¹K˜nå!qæØº{ºþü2T„ÙÌX!Ö°±zíÌ]>¦8ù(¸KMCi“àc(ûYÅf±•8fõ-†ZÐ2IØðl5Áw*øŽ†«î8k§=Y-=Ñ„@+¯-a¾Ï_[o ,­®@;8´Cµ‘ýµ 1&Ò°AEâ^oÐõ·„ÌÖ 2TkÊì%ri§ø¾CYE‘¤¸0).2ã0Nx(Š1Æ7µg…b´‡}ž#¸ .F¼,`)‚ X(ªâ ΓØ½ ×,~W87¬NQ0䮜ݕ3)å,kÊ5…¿rèý?u=†é½2ÿOaÿ…¬ÐT¦ŽÀÕkfK˜(î;TÎE«¹»X®EµŠÏ•WŠaé"Ž3ºn¢½ÙÇrÚ¦WÍ]Û¼BVݵÍÔ“bÚæ%:}=ú‡÷vXL¬Vj¯¦úÇMߣÌ# )ך¥\jøv›¢²\’ÒõÅ"¢%hÿÑ :aXBc4^A¬ƒF/žF1Ñîfw’±c(P Œ‰xÕ㱺Ï㨂'ª1-ÀU+|Öx4¼씸QˆñMú*óĹ‚ÞÚù *Mˆ6}‹"[ØËàlŒa¹’ž‰ÆD;¸xO%lÒW*Zк\®ÓÄ7üïç¦05b[ž¶Ä°½•îÅTßÁÁ5p–0^Á«³‡ ¸ìþ‹\ _< ©VŒM‘¿µzOÞó™6»ð¤—ýî c—;-ñÎ|§Aï8;¨J'S}F~]¸t\+ì=ѽâe‡;„kFƒkëÙãÒN´Süä,¹:^<7ùKèÞy¢üx £Þx+Y0×Ã¥N°Ë¿ÃZçƒtoYèÜ^}EŒ1ؼ¥@ŸR¹R…â~Ȱ±yšl–[¬õ›V*ß,É·÷ls¯-%8ÃáJ©~½ ‚³# ñbÌ‘`2:%é}ËrâF¹%¡ÄAÆ5é6 ³é=ɶ Õ1`™˜à¥”QÌ`í BÆwÏVÈÕÅ’) ×ë]êÙo¡×‰’ŒÁ=@?£ >Ã[é*C½ Ô¥hI„ &ˆ™Pu7X¼7r˜RÌR–J¸á‰Ù¬õHÃ×tþQsê®­ u廎Bûoã¿ÛéCµ¯ëî‡Wêô©j?qcoõþ“¯»Ú”jtjü–™ŒbÎçh¿ßÿ»î^ÛGoW.ž£ý¤}gº’î[a2J˜ÎñóîáB|-œÜ:Z™.Où’gÓ…×±zAq°ÆPlÒÍ-æUÍ´”;,Ç=@hð°~kŽ„’GðÞèØC·~ÔÊú^^šàm‡@2-ïm$.;0T«§*„5K*„‰wëæ*D÷-3ÅœÏ1ªV-©v¦¦Øj®Btß “QÂtŽ*„-#ÜŠWènJµ?H¨Ä˜YáUF»+ wEáV…Ùíbx¶t¹Ìf&úÈLô‹fb˜ñß°`&>sõas>ÇÈãý¢™ègrÄ/˜‰~4ýÄLôÍÄ`¦`X@É>¢e3L©Jɲ.fÞ6·‰ÌGŠ+›:¿ûz$˜ÙkÅ!\äK\óµ]_ñZmXlI'ÀOñælÏ~£(CáÅ<_´im,µæWdo'¯b÷Œ¾/W¾ŒšØF-ØFÅŠQ÷I¬|¿e&£˜ó9å˨%ÛÌØÇo…É(a:ƒò•È4éõ/3ÖÀH”mÄåmp^.žI)I_d:Äg(Û²”ux[mÛ/¹Cx‹ SÞb›%ÞâTL÷í'3ÞÒ}ËLF1çsŒ¼Åú%ÞbëxŽö“oé¾&£„éò†qC1Ó·è+bˆ©òúÐɹï†%³“7`åÎ÷Öá{ÁLù^°K|/ÌxR¨ç|¯û–™ŒbÎçù^ÐK|/ÌxkPs¾×}+LF Ó9ÊèTa(°¾~io<ÎBMdüâÜÌqmË×ñéò:åY \¿vÿý¦Û–Ñ|þ2èÚg·Y=ö”)TctN ¤ÿœj>¤ÉˆWNøåá]Åî% ­sZ–SúÆP¢ÔV?.Lr9oñIÖ ^ÊÁw(îA¬Ç¥ið’¬…lá&ûMöÅ –ÖöŸÀlù]ŸY¾ðÄ:t¢³J$äÖG¢¯Wƒ•;Tqþ9 Ê]B_Ú^!£D´SFJ$æ}§SRzxt¾„Y]ÿ…ûæä"m˜/K§˦òú6ÀÆ‹ÝL>/%qÙ ´ä¿‚ól ëO\ЩÊÅFÞ^Ý —vØpøÇj¢ˆR6†Ù«¾v~©w«ÌMà^Álg! 2Œfð%Ù±? !Âx¥EåY²â ÒD)!ú9~ ñQžKÝ,‰KN­l„ÑBw™¬¶\Ž÷’â„…@L³1bÅu¶uÞrö„­ç!fI¢œ¤X4Š7;ˆ,Mh(¥‹(EXT“ãÞ^¿9G|©!¡¿ÁwôN‚K£õ•LíaV•ôtrþЄx¸GÊ,#ëva4¼÷3Ts]XAUH§wfè˜Lò ±D•Î(†bSçXoÿœ‹¢ ñÏrOp½«•dšÒ•}ùÊ N‘ ,µ!y[º@™¸°*¤‡æhÿk(ožL¾U )(œ%ÅÛ ¨ÆÅ!PÄ&nÙvP”üX–@•‹T(Ûî¦îÛz=ã¶H“í¥Ñà;; ÒºW::Û4ö(·Å¢+„éæ’‚ ˆ>ÁÍÐç•2Ìõ Œ07Ü$xk)Á, @‰·¥Ä”àX08ÞéÜãO(WÁéåIvÌqÏ¥~y;æàî7ø÷ðØ•F¨YÇœ¼ýÁÌ0w˜ÑðÉ çëƒQ:î‹»ìhø$±SB >ê3«Ë†­áÚpŸ¶ž=‘Mˆ0Ùô»Ö³[WC€o[ D‘ ¶$ xiyŸ`­†– Ø'H*.Fqè\{(R›SÖþPUˆNümÛªï?ú|ë] Ëv8g"Ç %ψUábVToЇ°^0$, ŠoûR†h'“9oè-%ìl×çÛR³¤uuÝy¨Œó¨}t”n)ØJ1á®3ÌäKöùˆ0 eõwû“è æÄ×RìpVÑ›`Øl0 ;f¸[ëwj\M׈_ÝòIÔZÅ÷Àð‰þ?O/γ¬˜Ä<ðIâö¯žhÂö¶$¶ÊðG{±—9¤¯†àª×Æ!™9¦g {8OÂ×…y ÜOâDñé൱ù7®À>íïØ·!ì»?gÖ~Jqù5ãèzo¡CV¿cTg—ôÀ–N¼2ñ1ÝŠ—J:ZŒ°Mžˆ d8&œ’¼5¼1yx4Ø“Ï ôiâ¸üd7~½[¥ë(RBÙD¥Æ%Gë­3²,ÑÈOóÚë³¼sŠ.`g¥%C¡’ÂmžIí—7#r“)É<….¶\AŒ#â)AÙøJ(5Y€âíOàPiõƒ£*̪á…}îó,U¾àÍBìkv+†»yóVÑ'Õ9"t¸Ê *U&’ÁŒ"q,…’ñê Ì÷b‘á°L]Õ'yø@|ìU*U 9£Ô+©á¶ *á˜Pcda™#ïR Õˆ[ÓcÅø”í8³®þ” H¯#X”b|”Û|ëßÃO’"ŸT©Æ£Á —ȶ¯h±p÷Àš±µZ+f'ÐMe¸rb®í#‘ehºÏA~¦™C×È⤭{ù~FÛާ còÛ xLßô…=)bõëÿ­ª :ë%wcKCÝêYaÔG'ÅR28a“f”}ÀÒUø’÷z—:Ä _(¡Uåv‰·’w±Ú¢…®ö(Ð)77+[˜¦®#7ØF· Å‚"¼1+Äól’±Z¯¯f¬8ŠŠä¾¾¾ ‰pt©]†T¸Mq©°±YS\Ë×?282¯PQ(ÊmÉ Þ^ôI+mZÌçsc§C¿{Ƨ׊ä¸Mò£œy,ÙÅE¢1òB¨yËgáó{@B„týC¹ÂuêþJF).’([YöîMú"_Í´ÞMjçJ[{ˆJ$n~©`îÆXIpÛ::÷‚Þ~W=·{(8««§l)Ë·l1´(^ôB©Ø÷ŸØåt|A8¶?ép¤<)Š¥-¼»·C ΓàùxÕøþ®™ê§£)ÉÍp§‰ÛMBa¼SP:)e6Cg$ $Üì%Êà’'XƒÂ´YV½ijÂ:)†Þ~r‘jß4°Ì©0äx 7­Ž h³õ½º‚¯}q=Ìzc¹ÒgN9õiRžÿ|Òî§õ`2$JfRËdT‘͸F!”š$9K%Q\ÿ„:‰k \Ø–—CI_Þ`"0nƒ[«¼‡£AŸyIÏ’ö2åͲ—Ã#ÈC-—Ⱦ‚:.¼“Ð#p,-Þ)¥X ¡`åÜJÅ9RÖ†OÔÁÑð“„Ü¿IÍ9áS/Ô-Õ3^K@½$÷(µ“n°»È©ôÙ1ÞtÔqžî׆}-˜[búaó¼ÃÌ«#(– ÉéˆG(¿^tÜ]ã¿­?%UX^R#õÎ`%lûwÿ½r>]úœ8,F®·´Q©NýØëá’°7â–8Çi¯~ÏOpÐ}4ûæ8RÏŸô®}èÕŸ³ÓV¢?¢yÌ%7ÉÒÚžú¢Ê,˜ÑÚ˜-`öSÏ7سœ1™æÂ6 ¾Ó{TÖÖÏЖŠpÝï튇•?BA½4„D0â áªð©>"2¸%¸úÊzžp%€a%%íιã%θÿ´û?ì’y• endstream endobj 5168 0 obj 5232 endobj 5172 0 obj [286 /XYZ 37.5000000 729.500000 0] endobj 5173 0 obj [286 /XYZ 37.5000000 287.750000 0] endobj 5174 0 obj [286 /XYZ 38.2500000 659.750000 0] endobj 5175 0 obj [286 /XYZ 38.2500000 659.750000 0] endobj 5176 0 obj [286 /XYZ 37.5000000 629 0] endobj 5177 0 obj [286 /XYZ 37.5000000 629 0] endobj 5178 0 obj [286 /XYZ 37.5000000 287.750000 0] endobj 5179 0 obj [286 /XYZ 37.5000000 729.500000 0] endobj 5180 0 obj << /Type /Annot /Subtype /Link /Rect [156 737.750000 182.250000 744.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_examples >> endobj 5181 0 obj << /Type /Annot /Subtype /Link /Rect [213.750000 607.250000 300 614 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://developer.apple.com/library/mac/documentation/cocoa/conceptual/DisplayWebContent/DisplayWebContent.html) >> >> endobj 5182 0 obj << /Type /Annot /Subtype /Link /Rect [192.750000 266 246 272.750000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://developer.gnome.org/gtk2/) >> >> endobj 5183 0 obj << /Type /Annot /Subtype /Link /Rect [274.500000 266 306 272.750000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://developer.gnome.org/gtk-tutorial/) >> >> endobj 5184 0 obj << /Type /Annot /Subtype /Link /Rect [375.750000 266 452.250000 272.750000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://webkitgtk.org/reference/webkitgtk/stable/index.html) >> >> endobj 5171 0 obj << /Type /Page /Parent 2 0 R /Contents 5185 0 R /Resources 5187 0 R /Annots 5188 0 R /MediaBox [0 0 595 842] >> endobj 5187 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1409 1409 0 R /F8 8 0 R /F1700 1700 0 R >> /XObject << >> >> endobj 5188 0 obj [ 5180 0 R 5181 0 R 5182 0 R 5183 0 R 5184 0 R ] endobj 5185 0 obj << /Length 5186 0 R /Filter /FlateDecode >> stream xœí]Ko举÷¯ÐyÕˆ¤$JÀ"ÀØcÈ!À`È!È!˜Íf±˜Yd²‡üýtKì¶õøJÒ×ÅvkÛM“,Ö›ÅbñÝŸ?ý3ù÷É»ÇOÿI¾¸ïŸYj‹¬ý/9}ýøú]¥îçÄVEòåÛá{òýðñðñøï÷CÛáÓã_?ý/ÑÉ_Žÿÿ–üýÇvtúƒo«ìñû׿{mÕñ§ìòýôù¯‡¿ýü~ñ<¦ûûÚZ›•'0&¦þ~8/S5_|ùýð®EÀ²YŠ¢È•NTnòDÕ¹Nþû¯Ã/Ç ÎÃgi+eËÜf×Ldu3S^%J×ÇYí`žæËÏèj…Á‹,_oðrßHQ¦TâàiUj›Y]ÁŸ¯ZUyü¶µ/£¯A«Wd¥òµ¨ ÷)ǵ©[ôX[¯€ Ëð+`¿<©èÕHÛ@î+gÚâÑ=·¬ò3qYÿ—áWÀ¿-*µç4{ÇŠ#îpôKFÁ ˆŽÄw¡ãÃçûç#Leòù—#dÍ„í·Ïßùñ—“mÑ6ùüsòS–û§äóo‡:µeQꢯmÑuÓR¥Uu[²¢i1i‘—•í´TmŸ—›ò47­óö2|Û¢Ôy”ëjy † 3}`ŸšŠÔèJuW¬.lÉr81îæiû<}>rÞuL£ò ñ:2{qJÇ8 4Ê> –¬†-ϨEY_ËCkÓÇUw×&pm‰ZBÁ\›C¢brc&]ÀéØÌ.çg7±¦Àó}^F \ ùÉ ftVŽ}"PØÎôeJ©Vß›3ãΑ(*[.m‚ÿÑ ÉŠ § \X½Ãõ M*áx£ø}ŒyÄJc€%¬E݇Ù@ÍV­ å!` Û‚u>ÏKG–l@ÂùÒ„~ƒ€@XÆ(†ãšm3vžrQV4<•)ûŽêsoIØìL¨`¡ gÁnÛpCx˜50ú%æ`Å„Åjb(êS€]’-ZÞ«TwÝcÛ¸}*à&‰ÚXƒZò÷p [ 8OØ-ä"ØÔÓr¼ à>p'½ËFÃëÁ¸Î Ø>ÀÈ; v0¿™|ý-L#ÌÅÑ ¸)[ÖSYZZÕXa¿žØõ0~ˆcðºÕ§vdŒ§:óí¬¬!¶%~wø~w.^¢¸BàÅK ÂﺘÑÖØ97ZëµZRƒÐ¿š§ÏÔ|}frÕSh *´¡À`Ù‚Ž2uUWá·RCÖÙ,Óž]’£"W¾>…?vQ}Ü/ñÚ1Nx ­âf¬o…‚òy‹0[v§‹T Ó[ÏDŸ÷^ûÔ{$²¨Z¦)S݈ëëÑPŸ‹«6­€-%d#ˆ7Õ¡‹)ŒÁ†¡†-NߌxGNßàèêØ!g6®‘RÑ7eÕäo¨Ì©›óï*­ª,)ËÓ7«”ûÔ$eqI]sŸ|9”yªT­«J]þÊtF1¯ç8þ}û{VŸº%½ÞYÕŸãøÉ±O’Ó_UQªî¿~¸v«l#8Më]—ê,ß¹q jIsÔó¡±äCm!x–gÐòXXB©)?[[ž—ÃvöÍf¨ ¬Æ!|Õý‰1.àŠÚâÑ0mñÒ±6PÓ(èÛb 2°AÚbrÔ'Ë€A˜;M½h]Ú AÖ1»aØ 5–Ö”Å9¸Y¦ •K€[˜¸ÿbNÀ;¼¯Àás/gŠD2µKœÚ§®ÅÖªî±nÃp„W—0W}8× vP‘…ÁðDlÊ{ó[[r¶iŒ~”eY4,`¼á&Žÿ Îj™rÃ6 $ úx~äB/8¥ÅÐ{ÍðqZoYN„—°l[¢Æ¼ft`ž¥ˆ˜j¬Q'·(‹ä‰Ð¨Tf™AÎÅ£ƒ8|¨ÌK¿ 0ÌqÙ‚Ìl{œcøÎkÖ1¬•Õ}ʽpbW!ØDÆ÷Á§ÞBÚÓ "6+ºfoìPËÃÄœ6!¤@à>Lb>þ×j˜¢‚÷B œGX‘$#¤@@Œ"¥C€zÓ]Y•·‰c»²Ö϶eѬS\¹çÌ µ8{S¤zþ&ú@\ˆj¤iY\éa²‡k)ÏÚåežâb¸kÓUHj—g4Ò·0£á•:Q6­uo¥x¸R——3ÖÇ@ú¨µ” ÆU™é¢CiÖG´Ø 6/ÁR|l¾«Œqñö¹ß ‰çmµ…®Ê‚„²,Ï Î5½ôQgžŸçæR9—åÆ1 U^cWKò½™K©„*¡Rc6ÛõÁË ¢_XC °Á>Ã;^¯{nyû¡Èо¡{@bŽÏ£ ¨‚åýT¹éN¹eÞ„ÀoÞÏ9î³Háãb<d AóÃÑòlm¦>;o•™ä\*Dâ5Ýzí¬ZæÐX:ãfù=8ó«z…¸OÄ)ÚŒá7‚îy?achÊDùpœöõ½‹uÏÜ*]÷1>G7ß;Æw•½Ý9LJ¯¶·¶¾•êËÐî R® ¼ò[JPóŒ‹6¿ÌØ’Ü ¦*&;ðC›˜Ô§Ú Ï3Ø[&«Ê«"Ø~7Gb^£òñ–¢Ûk‰ý$“ZPÚ`ó›ÚLM,!*BxœTÅMæ, “Ëú WÀë!ÚpøPåç¾CÖbª­îJʲšBL¼À‰nDÒšP‹‰IÏÃ5Ÿp‚ ßJHÌz0Þð<8RMà:Ç–G½6¹¡fƒœþˆ!¸ª— ¸…H½ÍZW k¨Ÿ0}9D胱WŠGÓDm5\“®€R{)û0l!('¤õ2ÕÝà#Núr鉑À=J%BMDr,Ø>ãS\& Bdcáü†7 2cŽ/RëÙ­eõ(\ßÍ ƒ)ÇðÁ[Ó½BŽ æ*¯ûCêÅz&RÁ¼>Ïä$á(<¶L°`5 YåëÆצº¿õÅa¨œ_lC‰òþû.=†]z$: °“ k÷€I©/Ïr‡œÕ¨üÌ1w“OÌÜ~ îd2w?ÝuÁ·9(*ÀSÏ÷lq|Ï÷TýÁ÷70ÔÄc­CeÙ ¶…ðØ™ýmÊœç `̽;}<Ó'd´Ý×äwfXã“`<³7ÁtôZ«EØ›º_&ø8^ï—1ëñ›},öHT@alµðtSe„¸7ÏX~aæü‚¨Ù#PßµdªÍ0÷á§(F{Ûkò.÷;O™´c<B§1Y9\n¡¨ ­xzë¬0M 1vr¼ž›´zÂI˜W9Åx G4õ «µëuA¯ §yê@wž½~?4¢nÛC*ÿ﫾fì!q»^8©„P㨫xå‹ÖÃD7 „@¨ÒƒGÛü¦#U ÷+2CðhÄi­_¨÷}µ$ÁTvY ýX~^®¯Ê!b^B|s9–ÍP÷ò0—û­áÅX׈ï&bò6kŸm¿çß^J"Ñ\ù5™.{Ågß~ÚöõÅÞZ±ÕÄ[°¨oܤGb ªb’öwtû.V½Í72Bòe‘åWðåmâwƒDä¾ýîgV6=fŽ#ó¿Ðfó”wÈÄ81™*S{¥ì¼ |Jq›š ¯‡:+ºIÍ%¼ÿ÷Ƽ’<¤&.ƒ×"ŒXoìµ@öZ ö=æ¨L¨W×bΔ UMkü›”í˜k¨Ü¦%oÍÊÜOÕa·ÊðõÝ`g¯®2éÕ××TÄñ•Nìö܉r'ì^03#ü¼GÇ™÷3™\Ï€µyKºÂ’ß||¬—1í… ¯7É/‚œÕå#XO ~y‡ÉáZ°—äwž@ÔŽ9!œDx½sÅØêqæÒ\“GæNYlQ¬¬Ïyø¬‡¹‘â|+k¨ÀtÞ,À—Ä’mUZÕYO_ñŒ´¸+yšðLôP}jÔlj½Òç¦!“Û²èŽVxsGåYK G‹€qý±EkØÒÚˆ"5ºRsû¦òå²ä^”9.åe‰X‘] ~Ë jÈ 'Š6-ÒSÿo‡¢Ê^ðõðIp Öñ%N ô¸Œ‘ ¬0/yµŽÂhØ”s´¡F( »‘F„Œ±¡„mÃ<1é™M æ ±Á´¹ÞZ0O t‰Â) $²~S[‘UEšÕÆÎYìêçþkÂ#ô¬y"Ü–E©&k]öÕäMqWnÎÁ&Ó Cà‚q#£imÇûå+u‰ˆJ7ƒ,‚¢ñ+9ØÓè{ºni3sbÌŽ™QÊlî60tÅEy ‹ND°*]O²åò1$Uì`xݤo^Á£ bÇ[‡±Ñ°Wâo.Wt ÄˀŌñ¾?<Á]&:ƒä¥›'Ì3T˜ ׄð+œGXöp¡±"ŒjÆûp€Ée}àß0CŽψãZÏwyó'_pú`°ªtWR<f —9ðSxøh’(à&ÝÅGãøNÀÉw~ç! ÒiŽÇêLí<ÖW}žRY®`Òc0ÇÆ uìüoêI\Qå’ˆËÔã8xœ~„[˜ç"nòòÎ^DÔ×{©:‘öRu`'Ž+:µµ“²Iájû‹+XžC­”yæ _ÅɧÌE4æ)Jb=¸p(¼á'Ø„y0®^©ëK¢o¸Çm¦®) èùqA,uwãåØ.Ç)ìPûúËûÁcæš"~cÛûØ‚ËØÊÍmK(¨±f·²™½ê™V“˜j ²:¥fh¨@vBØ™âTieB¶„}%Sfƒ) ÁÄŒ0Ë\yƸ&¢ÃŸ µJ_SDÁïs#Ø{`ìž_ض/ÉìÁ“íWÊ< ‡©¡ÆOOáB¸† k.¯P óë ÀÔá¨HÄç3‚îW²à<ÁrgÎ]ˆy0¾s^µÊ÷ç·¢²F?^ÂØ©]Æ­…¢›Dq\ažP’c¿¹d…òBy´‘X°r†íÕhûÙö›;ÛÞ-²o¨c¶ØêˆË¡c¨oS¶ƒE6ß[Eâ-Tç,€ýiŒpv7jâÕº2r£>STž-‰X‚ßÜó-QX ­¯É¨Ù­g%nóVÁ‘aân“P@6î§f­Î¯yþñ6i¿}¶[̹–oÎ6íOÍÆ­íâðÊkò÷§Û8ßûB8¿-ÔóhÛï0c樳M7ÚgYሞ†<Šq5‡à›wór$¶­Úž5{kO>îÞuÜ›YOÌ^Ö=BóŒá*È!ûÓ¹÷ôt.³W¤ž™Ä|­ ®`…-àþ¤í„?i²:únvÂÿ:Z°`Ä­áîCÌÞBüo®¹}qíæãWòý¸ q•§þ`FÙçj F™4S§ÒåÉå´ÕEHÆjs·T±#å:[yÒ©nJE­z9lqOýéÔ•NÅ-øÅ¸‘yÌT]÷1ØžÝJÕÛ]Þרhîɇ¾2V¹¥èÔ®¶Œë«Ž,CáÑ`w%]-Zú+¶eîôsöRúò Í¥añzÌRB`̸%0]Æêƒ[¢«ÍLêtÂL˜ ½ÓŽSš1ùxø?ðÄ· endstream endobj 5186 0 obj 4875 endobj 5190 0 obj [287 /XYZ 38.2500000 692.750000 0] endobj 5191 0 obj [287 /XYZ 38.2500000 692.750000 0] endobj 5192 0 obj [287 /XYZ 38.2500000 161.750000 0] endobj 5193 0 obj [287 /XYZ 31.5000000 196.250000 0] endobj 5194 0 obj [287 /XYZ 32.2500000 194.750000 0] endobj 5195 0 obj [287 /XYZ 38.2500000 161.750000 0] endobj 5196 0 obj << /Type /Annot /Subtype /Link /Rect [221.250000 671 249 677.750000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://github.com/rogerwang/node-webkit/wiki) >> >> endobj 5197 0 obj << /Type /Annot /Subtype /Link /Rect [152.250000 650 171.750000 656.750000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://github.com/rogerwang/nw-gyp) >> >> endobj 5198 0 obj << /Type /Annot /Subtype /Link /Rect [360 560 382.500000 566.750000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://github.com/rogerwang/node-webkit/wiki/Manifest-format) >> >> endobj 5189 0 obj << /Type /Page /Parent 2 0 R /Contents 5199 0 R /Resources 5201 0 R /Annots 5202 0 R /MediaBox [0 0 595 842] >> endobj 5201 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F8 8 0 R /F9 9 0 R >> /XObject << >> >> endobj 5202 0 obj [ 5196 0 R 5197 0 R 5198 0 R ] endobj 5199 0 obj << /Length 5200 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯Ð9€ÛâK$ €3r`x€9Þl‚Åî"“=äïGÝbkz$}”X*RjO{`ϸ5"‹õf±ªøþÏ_ÿQýë÷êý§¯ÿ©¾…ê£5u÷§:}½»þ@ºcø¹²ÎTß~=ÿ÷áo¨~;x™.óúÿï¤uµ'0f¦~>\–)Î_¿ûíð¾C@Ú,ÆXet%´jÿñZVÿýçá§v‚ËðõÑk!l£m½f"+Û™§}%¤oq­Ôh¢óÏð‚pkœÈ6x9;V„jD|tFâZÛ¸€ 3æ¢õø>Ãà^däœ3äìX ÄŒÎH\W×û²öü(z>þM¾Áϳc%72:'qUmq[È¢~øø7.Ÿäv³cåB\<:'qosJn?|üûœœs†<›äâÑ® àÏĹÝg¦-\•Õ øÚë@›8WÃg\6?CÎŽ•ÀVãÑ¿¤Œ‚Aé>ÛçÈ‹Ÿï…nù¼µ²O?µÀçì¾=µH1Õ»ÓÃÙêéÇêu-ôŸª§ŸþØHsqîImÒŸàÑ´ƒ£}„Oà<–°<~§ïÀ' ¿ƒçQéP×Òa‹@àá;˜r2¦ðh‚s¥˜>õ'âÑ Þ0ÔfÊQhŠåŽ&1lžZeš[êºY£Yu€ªÓéˆi"0Çòj.8œ4Gû4¨ñJ YÄó`¨!v¶¼4ý\†rŠ`w5´mØD4~‚qÍêE¬å äÑ=ë*ì¯àw"`P¤ÃiŠyTaßôzZ¯±z¿sOʬÎÉÝìmÔpØ2`Ÿi{¹Æ–ïF^h£P/kl3 Ô†À!}Iðë){¨}(~¢ÊI­©Å©eµ ²ÿcOoÄ(¿†Zx/‹=HGŠMÑ<Ó¤$æ»Ìú™kVW ?5¥lÎS6â2e؈úh:$¼ Ç¡'Áô›£lºG/¨~d}ÇÃwlêh…³f,èö¨|ýúÎ#$|Ò™Úæ¨DÇ!C£5[§„„8¯^Á&ᓚÝáE3¤¼ü„p(%\|Ä| SA˜³S$˜Ã)¨!E„OçJÙÁ&ôÑv–p \3Ü’Ä{<Àw°d5ÆADþ ‚ ˜Æ©wæ0Ê KHoëº%s‰4ªË.ÉŽX¯ wt#uÔ1¿>jeŒŒß‘ð‰F£áyB\Ø-Dà‰”tb)Hp´`ª“ÐuÑc-÷èæ¤È†\ª.–À‚Ø‚¼.°zÀ[‘ÝÞoâ¸&ôÆd¡èòŠ8SF‘–n(Ó¹¡0E€ð;6Ìò#iÇ ˆ0±ø8ž°â`òF0f$¼r~HxŒB‹–|å)‚`eÑ,Xë™…GK(ƒµ-\O ͬ¯‘‚ø‹àüŠk®ÙBŒ2Ä2~ËùÉ3à'Š}’C¤b¦Ä"© ™Å˜â{¸×BÚ!UŒ‘zÂÍ5ö”>SµÈòõõ¿¾fK ôòCÅ/Ø6ásþ£¿DµCD·us›n/¶Dx¡’ˆ¼ãàŠ}"XÈY8³{%†¨/å^Ⴥ9]nNÖð¡Õ­š@ÎlD 7îÿz1ÔIy}Ì[Ü|ætC›!ßGܼj¨]#Ö“H IDžäËB?›ÀFâéS\äb Êzè»À¼–À4únª¯ðѨå{þÝ¡%d+Ì"#ÝAØûE¤s:%œ’,a;?Šj„FV Ÿ9º)¨ömÀÖûÃr",ÏØ_Á,ˆy$axŠ^æ %ޤ‚0<‰…Xx"sìw›pêw<"®$«o„!HXW„ÿ–Kot·P Ãª»ût9ŽºA‚ÏAVZ¦‘fÅïbOŽL'h/’Ÿ“ÇüÁU+$ÂvH’X¤Ž %0+írŽ(¥ˆ)i†ø…‰š§p²¥¡B8ÂIÙgP|­å0¯w1`éNˆåÑÃýï(,žG*AØ 2§–låJBª+¸b~|t °:u@ É:Þë$ž`>ƒ¬Âá rêúƒ-O ¼Æc±ÃA«û¤à>qt8˜]'œ#FÎqH5ïžž²+)µŒH”û P;EŽj)9rÀ¯)´_¦lÑ"(ÆŒÓQ(A~|ÐA0œ)Þ+Î=Âöry”42!†ll‘Z ××,áó`ÞθkB䤘µOÈŠ {Z0m“¿€Ž²^CGŒ_Laü×ÐRêÛq½ÚcAüöÕb{Æo‰€Ó\·W¥Âv¤ I‘Ú>XéÑ]%éhótØ¢Ô%KŠla:bÙš£IÌûU=}èÝ ’æ‰ôrÁ4!T­Fªœ)}×uì*Púqàw Çn¯/y½¦Pè–?®àÍÅÁÅEk¼[³„42RŽl¶Ý‘k2)G€²û%ä‚óÆpƻ҄‚Œ J u")‡ë™%€µÄ¨LÜ?¯Û š¡²»«S÷K;ÀGþD3Î ®ærÖX„ò‘êQôx.ïnêÉ÷ov7úUÊ)õfiyÛ»Õ)åwâÕÌ;óþ®ö)ê·]îãB•êÞ)º—-b¶*ÀppÕfdsOmräïœRÔ" O©¼‰ä.a%– ¶û_˜&pZçy™2¤ xýêƒ-ÒN LºW‹mq†_BÁ…:xs:ʘ»Í½/=9wÊÏÄeJ*%MRUI‰ŒØš-Q&â>\bZýÕ÷بŸ”?ËÚ4Š<¼wµîc› ÎÚ 4)\KG<ÄA1Â!_OPˆë§ñ‘sÎîˆë9Y“Ñ(Ýæ#iw„´.|ÃgÂõ)Mš®ÄÍX¯Æ¢´wÀ¨¦ÜëDJiÖƒ}“È20/..æí’¹›ãìpyõ~Ó ò½1V/"9¯Çµ#]ŸÿJ^;¢5oÊè"¬S)¹Ç,)î/k´P,7µÃí÷kâ–wØlÕg‘”»Mèb©p ÜÑTèb¿b×+í8]7‚z¶)Éý£”p@–!Ý,Ë[_H)Ô lî#,“Ý¢ é‡f|Ï<âS —PÔ¡(të€kúÎ\¼ú<å&ðÍû÷‘”5ïÝqvésM_7°›ìóŒŒïÝ`Ñ%Ëx¬šß³mßb)R´EH=ÄAØIå‘ÄLB2'¾/'ÒPˆR¸€Öé¤|’ÚyÛ,«×$¥DRU±²£Üw“MyeæN@’$ã µÌÄòã Jz³&ɦ”¤c óJ“Äͨ ¿¥–[•²SŠZX†Y©¥pN»+H-W¯).F-ì÷ñzw7©¿#~9N?#$¤b‹ˆ±£(”Û¹=rrUFÂ.*RLN¹‹“pƒhd?×Cñá"\ŽKí±.Ç7¯âyHÚÇÊÛ°â¾€‚Pâ„GÃÑB”È~Bàù—»*¸M( yzûÐvzM¡ü]ÛݵÝN´|r×v»ÐvØë+©íšU­.îÚî®íö¡íà¾ë®ív¡í }Šj;wiI£ Ä]%õt Å30Þôhë€9ýwGï/hsèI`Ñæz»_=ià;½Â-òúO$EÀ'!4$Å(…!°ŒÐÇa+ú Sëx„°‘h&%À÷­Ç"Wɺ·N)lX~§&ËeÚ‘ÄPœgƒ39jHJ¼y6C"é5¥ ()Ù˜¼Haíg¼}2Õž/Cå˪r•ð“5›çk6}­Ìë)[ý9Tó7~oŽrh4.&.å ›¦ÞñpžÀFr\“¤à;Sz¡Õȶ"ë­£eoèÜ™:_Ûþ¦šׯ,©¡¥XR’ S2ŒoÊæ¹¥Ɖ´BÁ{Êg†9‹Ñ®šµn6bðGm< ¾gd4ßö)Å£<ôr9«^HûÀ©].!+SáF$XjXsÜ(WÄ}w™8®ƒcx4S/ußìgSš¨â&?8ÚÇÊ—7Àce(Ü_µ¡0!.ÉH§D9 Æë)˜Yíe­Öp¥á2Î ãm¶ÇÚØ™÷I©\­RØáÍ +õ¾sϼ”ò¦e“tB ŸDšõ±ZÞˆOŠm?†º$¿ô…œÛrþj¿ªçvâ(\_æ~aÁvÒMwÏRÇZœ¢,磢]`* ÙáÑNlŒ:)–GyŽR©ÒŒŸ,ÈñÁKhL8µüŒæQs]#¦`{ +šÂ.ô H5V„¥O–$ÞÎìd'–!ðhð°AIK¿êóJe¸ÓÏ-ÄÈàî¶!Á,€Ù³€ðˆÙCXM/@3&´€uêA—O“Ó­'€­Õ1ïBJÀVZò•›SaÕ—ÃÿÊøP endstream endobj 5200 0 obj 3982 endobj 5204 0 obj [288 /XYZ 38.2500000 506.750000 0] endobj 5205 0 obj [288 /XYZ 38.2500000 506.750000 0] endobj 5206 0 obj << /Type /Annot /Subtype /Link /Rect [495 521.750000 526.500000 528.500000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://wiki.commonjs.org/wiki/CommonJS) >> >> endobj 5207 0 obj << /Type /Annot /Subtype /Link /Rect [129.750000 514.250000 157.500000 521 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://browserify.org) >> >> endobj 5203 0 obj << /Type /Page /Parent 2 0 R /Contents 5208 0 R /Resources 5210 0 R /Annots 5211 0 R /MediaBox [0 0 595 842] >> endobj 5210 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1409 1409 0 R /F8 8 0 R >> /XObject << >> >> endobj 5211 0 obj [ 5206 0 R 5207 0 R ] endobj 5208 0 obj << /Length 5209 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯Ð9À¶Å‡H ø1C€ ä°È!ðf,Ö‹Lö¿uKꙑú£¤OEJêiì7GYoV«ÞýùË?²ýž½ûøå?Ù·öûÇ/‡ü苼ù“¾~xù.íÏ™/‹ìÛ÷ÃSötx<<Öÿ>š¾|ükýÓÿ2ý¥þûKöãßëjéô ß^ùúû¯çï•WõOùåûéóþö‡ì·ÓŒÝëÚżþÿÚWΖ§eŒ¼úéÐmS¿~ÿöÛá]€yo)ŠJW.SÖØLUVgÿýçáçúÝôù±²Jyg}¾äE^ŸÞdŒÎ”®ê™ê¿ý¿„¦0y¡U¼ÉÏ+‡Š2N…g?–N{[äU ^4o >JºÙc Ä™<"1V. ”ÝprIVveËkÚÆ@íeúЯt‘nN+‡J‡[<»r]®TÑÈY'¢ÓËÃßåÞEãÛvåâPiš]¹UnZ™\µýr]¦eËh¿]¹8T:äfœ3 ^Jó 0Ÿ~øzx÷¹Ê”˾þ\¯ìüÂæÛ×ï[ÿçd9(•}ý)ûcžÿ§ìë/‡êè]átq^_3’»óHy,«¼7òñmmµóxdFRR©Õ:ñîÞ7(øž€=€WýiþÚ„¹Ž€Ž†³1;mUܵ‘Ï’Ð1 µ“µj3|Fq ¦å*àæM­kÌ›iõÑ›æ&|^Á˜ÃûÁ#£\û¦±€uNŽ1‡ŸÁûÁ«^Ø®Êu—ZF›O wç«%Ú$%ªR>#>ó¢èŽ Øgp63ξžµ²¿»€ ‰ÂÉwÅ ²­Rª{Ñ~"2FsK64ºš}Ìp粜RZs^¯xMï¬ùZœqÖöJ t„W^JÒ.¢ÜŸx?xØÚÆ#²v+¶ ™NhÆ¢-°3•±[ÇV†Ó‡<Ö¦òõüøDÇH”íSß5Þ„ „öpJԉχót–58ØÃ„ö0Åc©ŠgÃûÙ%7’X³$ €x¯G!ÏØOïÆ „o`D4­v}Ë*ò‹aeM ¹™ÀB`ÕDúÑQkž©.Éã‰,,ádµ½…7p¶”ÒªT¬oYȲ‚¼†2Vc[Ž$ʼn®ã„‘ß NöiqPWC°…³aC‡I¸ ªt]Ì©*O‰@–í÷j_ól¤­äÿFÔxU®ûÖä€:•z°4Á¦ƒøž€q·¾9¶á›»SZŽÝ«ÎÏÙ^O¸–¶Ýyf‡ú„×dÛçØ á]óiM5¥ò£óêõ¦?!p´­+tcðl ŽÌ(¯…Å6fgÂ\Õø ‹Ù.;oŸ`»ƒ˜QÖXûÀ­Ï?LÍRˆ*¨Ì,¦³˜—¬ÇÁôoBÈUãê8-gÇ<~UOøÎpÕÊBÃ;P?pÄgj‘ª‘ÄÅEJÅ/‡Þ©³Ð†þ±1gHä˜bn{,™êÂy ˆÓ1Ëèæa[Ãõ…ˆZÝ-°%e$aE]5”Ö÷áþfÌ” Üwžá±b¢XìNFB{#UØ%Ü7 ©ºÒûÓ÷E•] p1î<Ùs4æ¢ù_ à×YšO&In5£¼”¶E_tC'eÌ9L ƒS\ëc¹è¶Bj¡óFÏûô§®(Ù©•Š®^~òëáKòÆ(ç5L¶X0Àá-c¬‡ÓT½s§½v‡3¦S̘)4¯HÜ@9ŒéE"æäHmOUÊèÛ=Ù+iÔÑ*jBû>_êþלÛä\ š*fªf9Áæ šN±˜“¦yþ` ½bÎZý•%œ\;NTöRVa\ßãЛ&lW]å>× ³p¯_Y3_£(»2Òîµ8j Hg=ƒWÐ^ ¹öLÙ™‚ÄX6מÑè=ÏQ<0’ÀJ©.5FdkóÎè˳ºI.’ð)'r%ñ×ê\õ'Pø_%#JhÄ÷½j[õö¶O§BlÛš 6‹DƉ,¯!,fXcƒ:ocH\Þ³ªÏ{í xÖuQ¦‹Aü[MhöåÞÖö¹ß+ ‰ï̵œ± ….æ¢!U`*.º g'óUtÝNë>º“•²t5ÊḚ̈À†˜wñ8­Œw!>Yo¼[Ïep! ¦DQê*@/6!D.—í©Î5«Ó.h‚ lƒõóôT½à˜¢!‰ðˆWPÀýà‘t¥j<ê%]aÓuxªWj—ô=¥Jç…’)ûƒ(ÄRàò>w©ÆÓ˜KÞ}v—R ·ŠÁ#I¥Z¹¤‡iJ©fòEÔƒ ¯½N”Vâ†deÜÒ¢QK:ôQî9¥›HÞjq`º$Š:c´SžÁ%†Dyææ ³éR޵t0ånº5«vŸÔ·À³8k¶€]HK0ö;Ujme†kÞ,ü7÷Λ̹‡)X*ZŽžYÛ]:$–~‰ï9pºÇˆ1?ãg˜ÂÍÌ~˜òÌLÚ]úK’ÒeÕyæ ”I)×c¥¸õcŒ›I-˜Çu §n8v¸åXÝ6<ԶУ{`ìªX9c¿$Œ[¿Ä ¼S{ã{ƒðN™<›MhA[íAÞ¥ä†"_ä‡Þ°~¼5_oàŒÇè{æ™-KBï-ˆ;Ï{&aä°ÐwÏñî9ýî9NjöîÑÝ=ÏÜ=ºokÝ¥¥Ö&Ðh¹…{j`ú!@Ó-ä@ßÖéÕdíû²ÀY'²K• #𓥴û“!ébpʾÍ8GL"1v wS¼´ï ÇÆB ÓØLÇÞ\ð¨ß{[VÈ–V*"*ü~ŒXï±Ý¶¦S<§˜þû‚šíµ>IÖ7³¼\’2—öXƒþ|Iœ©Eo=©Ó¯Ù~^)ÓÛµHs¬€ÈedÈ€Žc¸&c5 İ’ÁrÇ"Þjâ“èžÆ¼{ÞéêG$’—¬ge dÇN2ªúâ‰É;ÄAœ?½b–Q׊JX(¯ß±0QQ^ny½‡clÖ~3÷Lgı²bà“c,|܈šÑ¢yG"£T§·9GMÑNÛ«i—Àés½D§ì”ÝÈ*s¹çÍÜÝÄ®aœc¸ªz`1´Ú¬ý0ÕT—:•kJä3wç,ÎzÆ7 `7|o€Ú)Æ6±6…k1‰Þv`*fÃûÙ%7bzÛÆý„ÊÛQÈp‚!oãû9˜3Dï1³¸V–þ™ZXÖàBðƒl¸R€‹ß"f Tì;MNàÍÊŒÂJØâÙpÕÆzÙ§ÎÀ–ÈúøI¨›T~ ݦ¢ÿÍ܉»sÆLÎØ2æ’òŒQ‰yf3wï<#¦MÖÇ\Ržq]5Ù3P@ŠˆVÈ`ú»,i(I™¾+ý0õ˜ýˆöÒYpf:í1U±SÑS‰‘Þ–i¢”x†ÆlV,#ÆüiämÙU²Ie£08) !‘Ü´µ‹+BèÙ¶/©R¹OL±”fØ0ÅnÚÖ¼Eе]Ÿ7a¿>„<–"²–Ѭ¢sö>;:R÷kp+,7ܼ™À3®‹…­ïg œÚ·_2beÙ§ó˪»ì“–}[‘óìeQ«‰ËV˜”»h0›´¥e,­°gTÖŽ5¸"é¤~ÐõWöTƒ+ÍDZ_˜[^­S¥Ì1WE½ÂL_ò1™}-‡´Y·¿’Ô×p´>êó…œáÉß GÚ[NúèŠBÏkV€K–]yË.½¶¶ÏíN}»„çgkk1> >> endobj 5212 0 obj << /Type /Page /Parent 2 0 R /Contents 5218 0 R /Resources 5220 0 R /Annots 5221 0 R /MediaBox [0 0 595 842] >> endobj 5220 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 5221 0 obj [ 5217 0 R ] endobj 5218 0 obj << /Length 5219 0 R /Filter /FlateDecode >> stream xœí][oÝÆ~?¿‚Ï|̽ñlË*Ї‚ô!èCá4)‚8¨š‡þýòˆKY"ù-ɳK‰1+¦¹Üù溳ïÿòåŸÙ/dï?}ùOöÕÿþéË)?—.oÿÉ.¿Þ=ÿ]ýÏYY¹ìë·ÓCöpº;Ý5ÿ}8µ/|ùô·æ§ÿe:ûkóï¯Ùÿhþð'ÿ—.áÛ©Teóûo¿×¥j~ÊŸ~¿üù¿OÿSöûeÄîs~2/ÿÿ®òBÕ—iL|úáÔ-S=þúãëï§÷-–}ÅJ›*SÖØLÕVgÿý×éçæÝðù¹¶J•…-ó5*uó¥¼ÎM¦tÝ|µ~èñ—ÌðJ~pe+mðvæâTQ¦PáÑÏU¡Këòº‚?¯"š3EK´º¨#ìÉÓðöD»<Þ†·3§ŠßðÀèÍÆúàÏä·« Í ×`„UUGt¥ßšªù–üÖ_~p[4 ig.OÏX#Ãß-Ï%¨î/~¼?½¿U6¯3Ud÷?7³{üfûÛ}C—½»è8§³ûŸ²?ç¹®Èî=Õç‹„û)¶Oò=ÑÐeá;šx§€O zbÚõ|¾o¶":“ÆÓª"¨×-LÅOð‰Û9}ë| }q©Ý­Œ®:ŠÀ]ÅOÁøð>¹%žÀï(¼÷Ä8é#|r¿*0b´òe®–¯GA™ñÔIñ¶\¡ƒÜñ.@_8šÁÒ w8©Ü7&ê *ÂÕhé‹eX–癹í~+·B×ÒÐRÑ6Nê *Ò°—}´"kÍPV~‚µ2” ÀwðhŒ ÆŒ†-8ë­ñhø ö‰rÂÂÔ!$á*Ì;•2*ᷣĴu0hç­Ú4øT¨iÉÀT$xl{þßVg  ±ùã†8U¼œ¦Rgg‹ªtVçªÎgÚ7 –=iÕé>3çOܱÑZÁ²gkÚlÜ÷'=ñÿØh>iÙµšóWñ”L¸.Õ2§2g£+¥Ý¬'xJ˜²vþŠñºˆ-Å£1ËždÀ®·˜áº]™µž?àÃex£`%gbZ`ŬÃÌ ÏnŒ”z¥2F%ø$0%¸¥ pƒg`J˜ ¶Ja4ý[½9U÷ô›®àÚ0‹3üGó … ›L'â•bw^ÉÑìçtf¨+ênO``]ÖÑÀ¡cÆq©©Û< %«›®°žÙ~’"íÒ¯ò¬ bÑ¥_÷Œ<[]„Ý(»ØÜ^~m˜´çKŠV•9Ðj5˼+2Ø3Za=Ly¶¢…BZ…ÐjÏ;—­J­&Ww Õ$í÷ì­°NÆŠDe»¶8 ŽQ;v*ÝSFãÀ žŠå5d4˜â¸=cÅ®õýkÄŠúˆ¯§b¥ÖD‹·ìo¦¤;Õ¬á RJPeº¨§Ñ ¿êÖD ©ˉŽÚøÎ>ÔV¥™;Ó4ó©×D`Ž£ë<åk¥æÎ4Í|Ìïö8~eOl½~ ifZ¬ñwŽæ“ô­Ê—óIñUÝ8a‰µÃqŒÖS^?eñv€’o± å †«ç°· %ÍßÁ4¼9ÏÚâYã](r…Mm·²wƒ…™” ,u¹‡”g' u„tc+ KjÇé¦ðÅ%äŠjÿv4ºà)¯r5- ˜{ZqJ§öì­±.5‰m¤¼èÖø‰”ƒ«P`.çߨ3&S” ŸÖÀž*ó›pïË#[$@Å:µO®òH“VnJ¼Ò&y¦äCÂÕ¹'ŸbÙ­Ë5ÖìöU»i“f·ê§µ+ÛŠìí4¸Û‡¥dÔª5ˆžg*Þ1¦áˆ~'a}‰6ºŽBùÀvÈ¿"©Å˜ß¡bŒ]‚5ÝTëèeßÁUÏc OŒªh%:ª`Ë(™Ôâ³sXscêÀÄ#'qcÑwRZ¡ÆVÓœÄ` ~‡Ð¯Œ¤$®4púƒ9í‰Qˆ±>ˆ¨®ò`âzZo<(µ ÑçÔðJ ´Ã3HŠBE9) ‘Uäp4Ʋ¢èFd R5]f,ÅÀh¢ëa’±!ew›ÉxÊ¢*SÀ`'Žú&ÅΪËhØ)ŽD”S{ÌÂù´T–¶b±—-ze•§²àp–c'ã¯î"›as7É ‰£P"i:%´?ÂÖ SéID´qfRÜÐvrïÜÇ Â‡ œÂüÏT%2y±ŸÒáq6…‰œ3çs’"—5“\!œ¥åË@FQ™ DK°4~—!ò‘ȹ,¢ˆÖ½h—0–$‡ß‰Wèɽ?0-HÓŽý¡O¹Û{ŽÐc¯ôz#ô¶ê*}…Q5—[âœÓ_â°^V9] d³g)*ªà¥«Ú™.uæbìJ¸Îá( ÷8ÓïÛÛnÕØµ„·R €ÈRôÐrûØ]søºð s]h+!*?¥zIÂD\/‰#w¨<š‚O×xâ‹#ñ5žð2½Àm(š¹SöŠGæòLæ2Ë7b—œŠ\æøð`|·©,ƒ·a¶t>•Wj.¸|yÁm̃ Yo&¨óÒm£{øIaá`õ˜0;á'–â;ÖÀ ÁÇÔ­å2S8°@€D¯Ç6˜JLh>_bþ[‚Ì ‘µÀÆ×ŒcÚ/àjQðõ‰ot`ž› .·”"ê»Z÷ž€Ø˜¯Ó˜HÜ7- @G½g=Ë@•µÀáw¼«mÎù‚«ááw°¾Ã\QŽ ` €½(:Nš›cûÓ…i†¾?ftŒÏ‰ü:—qª)­gàÃA‹(ŠEš¢(ÆX(?j3s?Ư•cúd^E9G^¢+Ù¢ì-@ßÎÖ¤ ”S~± $s¼ehq0ÊÕ}¦"r L¿ æ¦æD‰õÏE4Ô¶èÓ0q®ÍͰ×ï‡ï˜<¤&àSûÖv¶úe¢ô”™ŸDf2(YµL¾ò¥´>#ApIZççsýCå©6Óf„oG‰«l&’‡x|ŒçF€‰B }@ÉÞ£¦Å@'ÆIb#¬£@B§|á“%Ž©hBl‡òO±-ma·'•[EéƒÈU$‰ôi€Äx§çÛ=æ’¨˜ƒã2LxÇ­D ”T %ÖEr*ŠZºÝðÊVµTR˜ÑaxÖçÛLMW"\àm/ñ»VðT²ØÄ‰Â§¾·h¨øÃغÇZtqåƒÀŒ÷>snN»ž¾ÁÜ%r2 ;V81¿9½–(ÁuEü¢þ_¥¼:&f(Z/JU±ˆV}ÈR^-7/àLÙì0“͈ Ü–Ç TnUO}úscñêkÒ*ŒìÊJ¨ðY-"Àxåjl~r€ ˜XDz©/fX%*•Rl=å5%ˆ»Õvš¸²E*S£=.úùªÔ‹Uµ2‹jÁùäºOâ|݆PæÃÔ¤ !¾agu~EÒ ¥ôm­,«¡,7"ù(‘î|yýÛɘüùüvúÀ¾8 y™ÂK˜`Î$;B}Õ~š÷3Dšj\z¶Žx­/QXýò“Ë£]mËFžøµg|öŽ…ïÔèOŸ±'-h5°Š|ËeσC?íÎ ~¿ã3fc3h¡ª<×Uÿ GÃï`ê|„3ÈYRˆuø#&=¦úÇ5Nd?ȼ$uº¿.%¸ K eEœäbJ<Æ.ã*0• èÅ^T±Cª£×Œ5#‘éÅÃ/8wE9ÔŒý›8+ð _`;*`aÉöb !ãçsÝÓHÅ€ñE¶` îˆ'¢(¬Ý<ï$\ÚOxÂÁ ŒL”È£´>QÞGň@g2+fÆþR­˜x­hý%„ƒB ¼ƒ J3±„ µV]–}­õÖl‚ÃÇ[ +L)5†Æ’-óž_–/.Sõè¹úöX}©Ë—ŸTùyúªÐ¿w»üŸY{§FïtíXõ°`À‘ÔÙÕ½ Ø zâ¯,*ÏÿØÜn—ÏZ= ÛIÏ™µ¿Ä`l=Ñûýú XYtuGP,zPlÏædäÚ‹7YÛMáFÜ>8Æ÷»ýŽ›R`ç{ÚÀÞ9Ôv¸g²¾RGÑz3Ø%ê¶ìëGÛ™Fh‚·cż7W}µx=íÜ£—Ä'ƒh‰ê8eâ_²] ™¢µ•›¹Î래»§q=%ì„%ÓlrA73la§j<'R뜾ÀÅ<¸ÅцZR©ÚôÃ0žbq»‘ÉöÛb–¾äH™l—p¦A΂|:žRÚRÿø!È*êqÅtôm»Á!ÄV<-vÈy/Ø)µ …8bé±Cߌ&Ñà†‘A¦Ô¸ã[Ê6yV¹êåÕ*ùÄZ6¯z ÌGnpM(œ53j4L> endobj 5227 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F8 8 0 R /F9 9 0 R /F1700 1700 0 R >> /XObject << >> >> endobj 5228 0 obj [ ] endobj 5225 0 obj << /Length 5226 0 R /Filter /FlateDecode >> stream xœí]KoÜ6¾ï¯Ð¹@Ö|JPH»@ è¡è¡HšAÔÍ¡¿ÚåÇJµš%¹Zij´vw–ÔpÞÎPW?Þÿ^üù­¸º¾ÿ§øà_ßoͲ¢ý§Øý¼yùr[ÿwQ9[|ø²y,7w›»æ¿›vÀýõÏÍ_ÿªø©ù÷sñëo͇ý—v_ø²©dÕüþ{ÿ»®dó—xú½ûü¯Í/ß_w3vóȼþÿ7ÊI[‹#~ÜtË”ûŸo¾n®ZL{Š-µt¢F›BÖFÿþ±ùÔ< ›^lk#eUšJœò J5ORNÙBªæé¤ë=iÿiþø“›²!NªÉ[Ìã“EêRŽL¿u¥ªŒµƒŸD¶ªÖ-Ùl•€)O³§à¸3uºÉ÷˜Ç&Šç7ž<¢6›ZHO­èyúø“[¡ÊÍóèTéxÛ›ýnÊ,• Çy |÷°¹º•F4ÊRŸäöÏl=4D±Å››©Mñð±ø¾AÉþP<|ÞÔÛRÙÅ1ˆ4RÃÙÞC£¦Cd Ç\ÖóÎvƒ вüˆµzKXO5nõÜN§^O` ¦Æ RT:8¦…Ü<4jœZ•Vþ©VBLÅZôLA¹˜[¼R¬3k ùƒ%Vc¬±”Ã1 ÄÚ„Çh·±"à‚ À³a¬):§±ì\¤6j(ê©®3ZH+ÙB²…d y,u¢ZH µDAÈeêÜìí «ÓìÕ°¦3„!k„dÑg-\n}†cpdµ"Ï ©ðZ8»ã4…s<0âýY¹4e¹d»›fk8Øåóè¦3i¨8– ¤é†°ÏŒ¡äh $” Ÿc°>c´Xk5ÞÏ`nC Á²ƒyj–8a‡ü X.,½˜Û›¦±¦cžâ¬ À jIΨQÝ™G!=ã!H¼L7nø9õ`©Â±Ãã SŽcJ¡ÇÄØP¡€5sŽT»õ ^b_@‰ø±E¸9då€b½)–Ÿa.àÌ÷EÇOylgUŸ¾º,˜ZY%‰ç4^ÝŒ#–¥Õzq3óÌZ;ºkÉEÎÄö¯!œÕsÈvð”:ަFí`­GuFaŠÄ­Î"äÄ Ô&¼ßÄcØÞr%ÜÛA¼R,U8ö€rÀö–noKÝUÝrµC’’GŸí¸Öž¿Úl=uü}‚·ç“¹ O˜*[6QÎÅÖCÎ;¤Ð³JuÕ°ø¼–bá(–4rÏë É¢P²ë¥IUàÆ­Ð_(·¦É?wÃe͹ʥ¡b¦n¸õèL n}a}rëÉ\ôo’±ƒ®–¹{ì×ckøÄK,ÒÛ×Ö°”áQãž…-n|J–D7ë.£«¶}`lëXe¿‰å€Pðµ˜nÂÎ"p‚‡i€!PÞ0Ý×[ŠëÑqu;^)EFqß8–¬ÛQO$Õí8"Jƒ€$8w™ýÜ$þPìõÙWJái ¿wƃ’ ¢œÛÇí~&UxF½1&P@‘,£ØS:À)Ùœå%ØQJ6S'›n/?gÏ¢àl2ï<‹ökÓwž¦ ,N_]LMšû»y¿Œ;ç›GésÕ ò²4©àÞáÐJÏß;¼´·h°æÌ{».M¢78Î¥"’! ™$>—Ùkíñ˜e¾û) •HtÆ2y2\g›³òÆ(]§¡bÔ:ÛõhWÓ®)Wq;!H¾jZ£ª4÷¯Ç¢pͬX¤çÖÒ®N–IoOX u8 —DϬåpÜ÷¤¬GbIµ¬.Ä}ç ¥2 Ç肃rËeÖ‹²}¢Û§š³Q©"d®0hę.KÄ»v®0¯”+ h’ˆ±^%æLëíÒt¤Ïæô–! ™$‹>[ñt»àÙë,Žú('L™:¼8ó÷m¯ØBŠ®h—A¹6î­¾”^Ý¥Ýll2Zo£YʳK9¿_`Þüá_[SªÓW—ÓR,Õ·P,ÏÒhÀo3xs‰Ö”³Aœßc[N·²>}u0uÅ‘>šªlѬ:4}ÚZŠ­mÑyD‡ M»Ue zc¦ÁxeãqÓÛJºÊö•DÊ­­õ+ˆ¼Ao`§a`³y Ê­«ÅöL7±.! =Ç_õSnµl%ìÜd´rQ¤!FìE¯’]­¨¯Pm)[.²Wo­)_³C¼M7[³'`Ÿ„®£zÏC A*˜Ï*­œbÕЃ°ÆÏñ¢74¤.Üó(éñ2ðƒ-d˜;DiöÔ²Ÿ X±¸áÙ Ö>„ˆÄA-íñ6Š@úy_54f†*A7Ù9Ì~Ö$ô$rBÞMb ìÿúGÍ”Ý×Y›.!)eÆf®Z_Ѹ‰ðŠ®€ÏÁ/%”ž“.Å¡\Œ±ÎÔ"‹› ÆmañJàòÊÀ9LkJÓ@àŠ›Ñ:TÚ¯¦í šAº¸/®ô,d¶f–M&9¤Ï y ó‘|IÆ(Ïa?Ã~†ýÌHÀв» &I¡ó¤‚ꥸô³å”z{Á } 1š©÷Þ$Q –*¸®þ‘pÔ3AR.ìJæEiVóS<6JÔñ»±/aÜ`ÉA£PBî´°PO;ÑVÕ†2 íâ«%¶VQmUÛôØ‹¦Ê>Ä7¿ªmÙëïÄ%dïÑs4VÜkˆÛ­_)ªuÀ*mµcٮٱ·@/“CÓW#29° ‰gƒc¼´ÊIK|Rn÷·xzÿ•o|Ò³·ÓE@a:`€‚‹¹'ag×ü =KÉQRR ½õæ8qј¼/ZFÍè]q·ùIÐŒõ endstream endobj 5226 0 obj 2636 endobj 5230 0 obj [291 /XYZ 38.2500000 631.250000 0] endobj 5231 0 obj [291 /XYZ 38.2500000 631.250000 0] endobj 5229 0 obj << /Type /Page /Parent 2 0 R /Contents 5232 0 R /Resources 5234 0 R /Annots 5235 0 R /MediaBox [0 0 595 842] >> endobj 5234 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F1700 1700 0 R /F8 8 0 R >> /XObject << >> >> endobj 5235 0 obj [ ] endobj 5232 0 obj << /Length 5233 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯Ð9€Û|ŠXí9x€‚o6Á"»Èdùûé‡zj}¥Ö'ŠÍVsÝñšY,«¾züøÇo¯þù[õñáÛªïÝχoµ ^ÿ©ö¿>¼ýÓl»ßW¡ñÕ÷_6ÏÕóæqó¸ûïóæøÁ·‡?ï~÷¿ÊTÚýûsõ׿íþðÇî/íÿÂ/› Ãîç¿?Û w¿S/?÷þ¯Í_~Wýºïñ4\GÌûÿÿ`ãk½'cdèçÍišúðë·ï¿n>0m_{mL¥u•n©þûÍO»NÝ«më´µ jÎ@Á¼ŒdÚ]O;Þô:üŠÔý›vÁΔG状»Ÿbï1×:ß1H»XôÚý;ß,×ùòè\9-.î=æâÖZu ªÝ«ûÚü΃ñv¹Õ=PŸ-§å=ïþqJ7˜ÑÀ< ~zÚ|üªjwTUO?í¨;Œyüñ´c‹¯>앎÷ÕÓÕï•rîÕÓÏ›v["ñØ¢kÔ¢>à [¾Â–/°ÅL§MÃù½=Ào`‹À`K [š˜<¨†Ü1xÌQ8S68ÎÚ$ÑB ä›ÕÓ%ĹsGgJPÀHæ-˜j¼Úm˜x}`o¯ÜYx儽õ=Rýåign·”ÁûñÚ¢Î4ªŽvSTm mŒöx@ìg"ìMH›€é[AÞ ôbÙ¡$‘hÁ’h\l%àL5cs`o˜LµÆ{J¦Ú}"ì‡Kh?Z;º3â¶[G ºë'Œ½,´2}»6{}퇶3ÚmwãÚ.nT'®ÿQ4¤HÁMjHŒÔ×Tˆ"â݈y‡VµºhÕ[ת]­Z´j|­Šýï¢UZÕ/£;)­Šw#}Ð÷Äò‚פ£:ÍšÔmê5Á¶‰à<eö0Œm †6,ILÎã&ójŠÉ†`ª±TáÕf(ÀYáÙ3´™:lfkÜû!µÚÖA7ÁŸMÍm=Ö}öÕôW¨Ù6­:Lª¿»Z:éjÁ;Ø{ÓGD¨íÖšF›7ì¼›¡oŽkg·ÞÕ{ž¼iÁT´ 3õˆ‚N®šK:9nšùEì‚K9…$† ±Xº S̱EëÓ<.™ œO§Ï"I±Ð›‰féƒR@9XåzÚAiDª}è­¹õH‘ØÏ¨¥CÂC{Sõh!_qË” »´Æµ!ô™ %£Co6IA=$…NùÞ¬0"¢¬4®´ ²7‘±_¢œãáãxå­g\Ã7Z´àž®}_úÑ=Ó0Ëg¨!0҂߸h:nÜK´¡9­Ž™¬LSàݘªÎ´T+J3Õ8g {‹[uDÉ5á]+•€«7Â|?öïÆ–éM܆QMl?¥£Çí[G¤GФP²K¥‘xvänê2àNÆyD†;æ©<äÎm9Ø"XGŒãÆj!¯ ”x\#Ƭ)ƒ¬0~2˜o„Tá:9oþ.Î}Ih§ìéü¥`7?' § Õ»öEânùÞ‚Þ¸Ö¡Ç©)© &ì7 py@4è73Y"9¼(é»7 ü&j¬œZLÁ„ä–%œZp8Ãg,‰²¬š³~Uznè\á€[ò¯å[P£{í.Öèâ¼H±ÆÐÁ]Jl ›Ådñ&wu÷º4¼ì>­UÝ[\E–ŒNÛÛ˜‚¯KK|Pær ƒ a2(·râ ¡$ÈmÂ…ht_ÌûIYa&À½Y¨Ù0—ã¨8­,Rîp×ÅA8¡—Dß·µ-¸lᎊG€¾±jÞ9fÜ Ü=ÖgÌv‚û˜²æwÉ…ÞŸïì-4ž6¶ØNAUI9·‰ê(K‰iÄ%ùªb¯/XD‘„©a¡$9î‚`§O@7D¡é`'@—(ül¼ëÝ4=é+@E¤z‰Ã3KÐZÓ×.‹[Skëþ˜1 òo³L+¡g"àqN$ò6…dFT8$X¸»ñ„W’œ‰» ©\`¢Øuš€túv—#@KíÕÒ¶$è3[²|Óôy‡‰Ä_3N&Æ5WX²Æâ ׈´ýµ¤ÊšâRn––¦Æ»þ¬=ôâÆœ¡À<ƒ*XÂ. ! Â^ x‚9£ „b®×À6áò"U¦Áä¢q-0ÛTºÚS¦S$^¿r· üq‹¿²°A-ÝÔüÖÔ¾·vnú7‘ú¦Eßt•yÚœïZêw_DZ‚ã­·V›Á­;Т Õzq3{Š{5§«1^® g ÕûèJ/‰ÔOI_žé  Õr&Bÿ)Çt8¡u±CN¥X1ÕÄ5TèóàZ5‹W»,BpO˜´‘ô§xŽíНïŒ.\*}²¦/Š˜9¡€ïË‚ÃÄý<3Nv,Zsg{ì‚{#¤*Ù5)q/aÂMá+#V&½3²ÏÓ0FJ}k›ÑyÇÕ·J3;fÌA¸@ k+æ ,¥ÄQ6a×EÍJG‡Á®Ä•d‚7€¯´&ŽA2R —mœQXèªWZ_°Ÿ[?:»Ûžv3fûâ둘cPQ¯_c0ÜèÑßi%.è£(`®/$xÍàX†qõX\{&PÍÄ1f¦7‰—Sy{ØÖ2O4¤Dß]æÚ<ÐwãçÄá ú&wÆ2x¦D|á~®0±>s4!’nÚ $éf‘t«ò‰"[|a2Ù$¢” ’tŽ}_—ǽNTˆû® ©­1²Ùš5G6[W"›é±Ue€yÀ\¡K<"¹FüÒ6³"yçøë“׋Îjåæø…‘ãœx`Oë¸×ñUëq£rÔ½Woá‹Î$Œq5a ˜Ì”ðMÔœ¸ðíÕWîúuwZÑAyk3¥Ô·µ]Ç›EµjæÌ¡ a‰j£qXc {?^ÎN0o ­ÍŸ ^fÀßNܘʼ (p4ê­±Bí Ó&ì"Z!Ü”Ÿè}ÆT«@ňh…#*3™ü"å7a-†×ó­h¾¬5_ÊHJp©ë÷SFRB='OP")ÕL$%îKÄ·¹»KüG'ãW=Rzíšõ"uæ¾pcRß/z?¾°à`­H¼óCy„~îNÂŽAì+³3Å«”ZŠW)õ׫,ú@\…z•›cÅûž‡¿ÙøY¹–âofío wBÞ¤+žÛ": ]s³Õe1ñnˆz&‰Ù©”…Žú~¹ð Ál›â¾†˜ÁáQO EFwqßÔfjtîF™x UmÀ܃£2XvRZ »hV)Í|ê{[„(ÞAØ%ì™°S‰#êÿ)-ÏÔçÆµMqcS×F]ÿLcÁv†kÆ×Âï%3¾½`¢æ)[Ëèª\失,!Ÿó}·yâËÃÞq'«ð Ä€8$x¥X;Àq°åVx¡$眃J!̇Ñ()±j›ú<\ñö ô¬—-ŧ©“5Ç©ÄDâq„„yi‰˜©¿zæ’9ù$XaânƸw(1qý¸qKĩФ“ƒTà,²EA¹kÞ#¸ûU=ï¦!Îòqì/Œ²¡­š!Xm·Jû…•9ÅÚ:?Áo­iôžô¾d†­wuü¹ü™­Ñ‡†3‰©Ï[ºsf[û#‡^ùs¤Àm=|ræA ŒÓÉÒÀ7ÝN¢ík7ÓБðÚRÃÞŽ–Êõ7ÿ±º›úÙ;µ0Ô}€-MCãÞà7ØêIS#¶¬Àí¿£ø½£60V›$ó‹\¼zÝå!ÚÈUH[‘’ͬì¶Ó0—‰‹ÅìýòV׎éÙêqóëh±4 endstream endobj 5233 0 obj 3488 endobj 5237 0 obj [292 /XYZ 38.2500000 187.250000 0] endobj 5238 0 obj [292 /XYZ 38.2500000 497.750000 0] endobj 5239 0 obj [292 /XYZ 38.2500000 497.750000 0] endobj 5240 0 obj [292 /XYZ 38.2500000 187.250000 0] endobj 5236 0 obj << /Type /Page /Parent 2 0 R /Contents 5241 0 R /Resources 5243 0 R /Annots 5244 0 R /MediaBox [0 0 595 842] >> endobj 5243 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 5244 0 obj [ ] endobj 5241 0 obj << /Length 5242 0 R /Filter /FlateDecode >> stream xœí]Mܸ½÷¯Ð9€Û")ŠØñxäÀð99Þl‚Ev‘Éò÷Ó=’z<’^©õD²ÕÝŒ±¶3´øQ|¬*V«>þñëß‹þV|üôõ?Å·îÏO_wåÞÙ²ý_qüõáûh¿ïþ^8o‹o¿ì^Š—Ý—Ý—Ãï/»öƒ¯Ÿþ|øÛÿ ]üéðßÏÅ_ÿvøáÝ?:þƒ_vN¹ÃŸÿ~ý³qêð·òôçñçÿÚýåwůÇûáºÉ¼ÿÿ´7Öèã4f†~ÙõËT¯¿~ûöëîcK€e£ØÚ•uU¨Ê~k*]ü÷»ŸôÝ—û¦RÊÕ•+× äôa$[«C'º9üVWÕh¤×_úß¹ÓÖDë¼yx²(S«™îî¯3eÝ’HkaNÝÇØ^kâmo;óàTévWè=äæZßSÿð_úûˆ›ëœˆœã̃S¥ß\Ü{ÈÍmJ×Ⱥ›{ê>ý}å""çuæÁ©Òo.î=àæz«›–@B…'ÿ©÷{[—U¼Î_gš(ÝÖâÎC=yt9VÝÖSè­ÿð7ǔۙ‡'K¿»ãî¿,éÏ¥ý Ðû_„žwŸTUPWÏ?f÷:fûÇó,¶øpTö/ž,~_–ªúCñüó®Ù×ÚöSä[´#zû [jÔRjØò ¶4ËÇ1~ù7x¥Â¬UÈq4\iù{Ã;t¥Âž>Â[ž` D37a¥oÂJXŽÑ"‘¢51k!ølC¼a$ sû€yþ†ØŠào0Ýðnc\Ãó#à ÝÓÏÏÁ]æ4.±Ì)mºÕ©c+½† sküž:FÚßÝ œ%Ó1a¤ ¦u™HOóƨbtÕDÜ×À¹™&!ç:\bVðefïñ‹OzP.ty`¾±Œ5zÆJ,áçZ’¬N›MCІ¬ÊvHoû!{¸Ú¾Ra(2üÞ7åû–bS--[®ö•iÝ£oÛÓ^Q•ÙíÕ᣷ojÔ[·¥S-%li™¯ÙÛêh`Y9ëN¤û·îa'x`aJ~Ð}7“¸°Su5%3±F¹þó3¬;ÁÞôœM(â ÓõðˆUÂ+ÅvëÚ&„¯â_«çÔÞˆ$5¥[JÒ)„Ï¿[Î’l©êÁÂ=Ÿ¼©söˆ˜›ÚŒ¸Ü:íáv·'ÝöRå,±‚EžAÛ¢TÏÄß¾±»W°7,Zqo¤‚øbf0'&ãBÞ–v ,N0°£ó$k·¯8LlfëMªúœNÑ5¦Y£p¦ #6CI'|¯p_±’‚ VplÊ*™þÌ-3Ká«o"WcÆÁ—b<ŽyHxÎì*÷,cúd.AO·@pwמEg“ÁJ£iV¹L#-c@nTxïó↹üÖ‘t [Ïürž_F±Ü’¬ÉH:I‰Í‹0¶$5j’¨°"ˆ átãq˜°xP˜'a,c.‚g ÑWÁ˜VFMå*²õ†\E7—\ÈccÜ`/˜x±°l6¨h—¹X“˜cÔ½)'Bïÿ9<KBϸˆkC@;+ÝáÚü¹ÄözãÞæNJö ݵo¨Ò¤R÷žÃL´XlÁ&ìHø†×3+¼#òŽÚeËuªu)½`µÊ^°ï¾Ù°,sòjý}Iý}µ]õ4æn¬Žwwi¾)Ûúá× ”g_–gáåÙæÏLcWœ™,®Ü"vSXvfo5{ÄnÓ#ælÿ4,™GÌ—½ºÝ î)ëÚœE.²¥Ì fzwªoD(k†8HkeÛÔ±Ù°N -ŒÛ¯gägÅC{åoÞus|B Añ”à@!(‹áFѯÏ-‘3„ZOt‹|eš!sÂ4\€uLTL†¡qÉ©þ€ñªuöú°âÓ;ålÇ $í®¢ðÔ¼¶ÆÞå5Ë ê¢ÂßøH’•£ñ8Ãe¦Z¶ª°ºF­±^õ•<"ë÷ÎOë¥1Çôz8f"WˆºÀÊ >Åû |9¬Æ;âØLx"CÈ úßå¯B”(Ç´ŽœO$±„ ¢ ²Q‰ˆcö>%ä™ fSòÅ1ìc*:³åŸ•?¤*÷mõè N´tĵ{=ŠÌ®–Ó†©oôi·Jé}íÔ7VuOÝ!gè­Ó©ê½QzRC›hé¤õĬ;ã¦Û›XàzT{ÃsÓË¿f̈:gÎô½_µ‚þ%AdãNªëJ6¶p7]"­×v;‘úbNœgÄIjÁ/s˜õPúóÃðH¹âqç—ßÁ[³Å‡µL‘—NÝsâ=Ђζ^‡; Rû&ñþõ6àÓ„p°àaÆÆ” G$N¦3¶ÞUƒ]ÜÀB¨ã`eHP“¾®ÂêËœç½VRXÁ/¸æ3 õ±ŒIh¾)ø5:æM9:æ¥(½@ˆ†=A7¦²ÉµÀ–˘—C˜êÞ„=ZŒ¦Î$qMd@e¦†e–p­Å§g¡D÷öͤÖgxw ÞZãûìM>óÌ9˜Uy>>²©<ÇÌ Å|?w!hÁ‹”oÖšS Aœ GYLy&o"FE•Œ"¾\U*Ÿ t'hã¹Ã|¹ª$µcc³[U’§Â¯½!ÿÆo©â~LØ#ˆ ¿[ß{eæ)Ÿ÷>ôÞo¹„Ÿ07œ}S¿à$ŠÈŒb bˆR±@üUf:VÊ`të\µ^“µÿò k_À¹ìq‹ 71fJLˆ¥Þy)îÍmeò\`0œ7qju¹*+I>µYãÉOÖxîRãÑÕ;Õå1†e ¶\cô …A1ƒ¬?I´ÎúSà¯ÛŽx?< kcYËÚØíjcFŸ!µ6Œ1CdøÄ'A•@y³6–µ±8<`UåØÌÒñ€¬em,kc7¬­ªnÌœg&~‰‰©f¨ Î+Hn‚oI§ ú.Ï(ŠãY6qšÖUx.1'kI³ºSÕa“ '³œNÄÛÒ¿?ÎÊîËÆ¼ø™(§bàgkA›„}ê6û‚qÏÖ¨÷^£'µø-ÕpöÔ3æ ‰ùB}‘K¶¥¿;£9/xÈBšf@] ñ1­ÆdûªòýóÙˆÀ8C<[¸ñ2’IqøAóUe_À0#¿Q'r9¤zÒÊäE²}l%aB4¤\*Å&j‡z[ë÷„ˆ~ÃDúUÆ õF±õx݆+‘nãFl½ÊHZ…$\ËWÈ5Øb WÊØ˜…JO„µŠ² â–°uö <¾ràÈü ~ÇŠ÷‡±±Áqðžâ• \(š±!Õæ” æ¼Ü´ê›ó¿.ÊáÔèG•Ý{5!R« Ä‘t•ʶƒ ™¤BL\=ÈèjÈk²"´mE(X2(~¼b"¾ý¬ÑÃ1ƒ&[Oœ4rfÛjxh¯@Ó™#V©iÀ.S0.땨˜8'ŽÏ!]=âVa ñ`ž´Ø½³ì•’AÐaÏÏäˆ5.&¿&nYP1¬þKxÀÜiAÔËfdoÌP±À1;”sSÅF|ãFL:¬ÿ;ˆkkA:ÕÙ9åšO¾vîý¬ù$|k$éÇÞúКfF;4UÕ¨<É„ALPg˜Ÿj©Ñ „ Rp [˜êV®´;S-°æSÈ:E\u Ò  Ÿê ï¬{%ÔÊ"v¡ fJ„‡¬i§ÌÀµa¼vÑ)‹¾h1k”aêRhñèÌ hÁõÓž¢ßŽ[ƒ°Sv´‰Ã£È”ð²7Ÿ¯ˆnÀÖz¾"´J!‰B<Ãfâ'°i5¨9Ö<»%yÒçƒ@™Lê8ð ‰GˆÌDEEF´  Æ©â)8us¤J}¥dMÌÚ^¥ ëª´ÂÔk †yS9‰°Ã½ý0Ëû˜‚;w° eWÔDÄ S:D1+ÌŸ)Œ13Ò“WŒ§—¬izëªKü*au=CŒ *ƒ«9Ú²òIe"Ò‡°}ãËO ]NvïJ5á°áø!æÊÌ茜긡2BXS"Ëï󃪄îšßFuà°-ÝëÒ›¿NÏ—.´àÃ’ðܨ2m„ܹ@ñgÕ/¼mQX]ž1AP".¬*¸àZ›/në8sªKù‚ ÛUø.@×$.„2K§+2é?ùØpˆN±†^ ž„'8r‹I£°„x3"mž&Òl qmĬÃ&˜Å4f€ÇÁ½11„„§<øñ ܦĞAIGDKbŒ ½á‡[8'^~´„SÎ œv/­™GrT±GüŽH%$ÐÆI„ªÌ¯C' £vókBÒb0çgËI0©ô½oxç„q¼1Ù…„fÖשmèM•Š1#ñž(̚а¤Æ!’03+h ¹¸×;ó7v*[gŽªOQ4DNJ#ʼnIqÒm<ÖúˆôÈYW•øK`ÛQ¾9R¦ýñ«J®å;¡hi¸ŸûPJÄÖ&5bñÓ¼ËkP¶š]©æ‰¥£±3é‹8NG%ÜZ% \¨žF ×S-IyÚª¢‡Y ‹&Û¦æÄ­²ï1'ý~4þÌkfxMSªÙugýi úSXíýòVÒM냙oÌñUå@…½Ç%£˜³IèΩ%JÀQúãs ŠJ -ØkH|“—¦YË-{e ,¬dÀrD‘X&Ú-K†«– «ŠÄÞÑÝä*½añ¶ \¼AÀÁ†=BÆÈÉXÈ\ìžü]Lü_*É¿‰r2ͺrÅ6¤-h—p‡›sž¼0öd¦X6.YkßðrøU¼€!âæËÜ?8ãU¥ŸÌͯ̾TÇtw…>=«l%ÕÔKÑvÜÄ›µVË×{Ý&»!¡·t%tõ¾eglg0õÒîcærFLÍí©[©et¬ao]¥É¡z…³ÃÔãv"W©ÃïF'–¡poð›‚jÑÒ¿«´Ìîø÷òÍPþÕ™A@c:`@àâÝS°ØhŸôq‚ªpn%²®4ûŽÃœ×i¯ã³Å—ÝÿIÃàŸ endstream endobj 5242 0 obj 3834 endobj 5246 0 obj [293 /XYZ 31.5000000 341 0] endobj 5247 0 obj [293 /XYZ 31.5000000 341 0] endobj 5248 0 obj << /Type /Annot /Subtype /Link /Rect [60 305 94.5000000 311.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn2 >> endobj 5249 0 obj << /Type /Annot /Subtype /Link /Rect [60 298.250000 99.7500000 305 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn3 >> endobj 5250 0 obj << /Type /Annot /Subtype /Link /Rect [87 290.750000 172.500000 297.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_commandline >> endobj 5251 0 obj << /Type /Annot /Subtype /Link /Rect [87 284 186.750000 290.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn4 >> endobj 5252 0 obj << /Type /Annot /Subtype /Link /Rect [87 276.500000 163.500000 283.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn5 >> endobj 5253 0 obj << /Type /Annot /Subtype /Link /Rect [87 269.750000 136.500000 276.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn6 >> endobj 5254 0 obj << /Type /Annot /Subtype /Link /Rect [60 262.250000 142.500000 269 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn7 >> endobj 5255 0 obj << /Type /Annot /Subtype /Link /Rect [87 255.500000 109.500000 262.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn8 >> endobj 5256 0 obj << /Type /Annot /Subtype /Link /Rect [87 248 112.500000 254.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn9 >> endobj 5257 0 obj << /Type /Annot /Subtype /Link /Rect [87 241.250000 129.750000 248 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn10 >> endobj 5258 0 obj << /Type /Annot /Subtype /Link /Rect [87 233.750000 144.750000 240.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn11 >> endobj 5259 0 obj << /Type /Annot /Subtype /Link /Rect [114 227 221.250000 233.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn13 >> endobj 5260 0 obj << /Type /Annot /Subtype /Link /Rect [87 219.500000 108.750000 226.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn12 >> endobj 5261 0 obj << /Type /Annot /Subtype /Link /Rect [87 212.750000 114 219.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_structures >> endobj 5262 0 obj << /Type /Annot /Subtype /Link /Rect [87 205.250000 119.250000 212 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn14 >> endobj 5263 0 obj << /Type /Annot /Subtype /Link /Rect [87 198.500000 129 205.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn15 >> endobj 5264 0 obj << /Type /Annot /Subtype /Link /Rect [87 191 192 197.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn16 >> endobj 5265 0 obj << /Type /Annot /Subtype /Link /Rect [87 184.250000 154.500000 191 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn17 >> endobj 5266 0 obj << /Type /Annot /Subtype /Link /Rect [87 176.750000 125.250000 183.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn18 >> endobj 5267 0 obj << /Type /Annot /Subtype /Link /Rect [87 170 165.750000 176.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn19 >> endobj 5268 0 obj << /Type /Annot /Subtype /Link /Rect [87 162.500000 186.750000 169.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn20 >> endobj 5269 0 obj << /Type /Annot /Subtype /Link /Rect [87 155.750000 125.250000 162.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn21 >> endobj 5270 0 obj << /Type /Annot /Subtype /Link /Rect [87 148.250000 139.500000 155 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn22 >> endobj 5271 0 obj << /Type /Annot /Subtype /Link /Rect [87 141.500000 129 148.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn23 >> endobj 5272 0 obj << /Type /Annot /Subtype /Link /Rect [87 134 121.500000 140.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_namespaces >> endobj 5273 0 obj << /Type /Annot /Subtype /Link /Rect [114 127.250000 162.750000 134 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn27 >> endobj 5274 0 obj << /Type /Annot /Subtype /Link /Rect [114 119.750000 132.750000 126.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn29 >> endobj 5275 0 obj << /Type /Annot /Subtype /Link /Rect [114 113 143.250000 119.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn30 >> endobj 5276 0 obj << /Type /Annot /Subtype /Link /Rect [60 105.500000 87.7500000 112.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn24 >> endobj 5277 0 obj << /Type /Annot /Subtype /Link /Rect [87 98.7500000 139.500000 105.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn25 >> endobj 5278 0 obj << /Type /Annot /Subtype /Link /Rect [87 91.2500000 129.750000 98 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn26 >> endobj 5279 0 obj << /Type /Annot /Subtype /Link /Rect [87 84.5000000 144.750000 91.2500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_typemap_arrays >> endobj 5280 0 obj << /Type /Annot /Subtype /Link /Rect [87 77 192.750000 83.7500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_typemaps_ptr_ptr_functions >> endobj 5281 0 obj << /Type /Annot /Subtype /Link /Rect [60 70.2500000 105.750000 77 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_writing_typemaps >> endobj 5282 0 obj << /Type /Annot /Subtype /Link /Rect [87 62.7500000 151.500000 69.5000000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_typemaps_write >> endobj 5245 0 obj << /Type /Page /Parent 2 0 R /Contents 5283 0 R /Resources 5285 0 R /Annots 5286 0 R /MediaBox [0 0 595 842] >> endobj 5285 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 5286 0 obj [ 5248 0 R 5249 0 R 5250 0 R 5251 0 R 5252 0 R 5253 0 R 5254 0 R 5255 0 R 5256 0 R 5257 0 R 5258 0 R 5259 0 R 5260 0 R 5261 0 R 5262 0 R 5263 0 R 5264 0 R 5265 0 R 5266 0 R 5267 0 R 5268 0 R 5269 0 R 5270 0 R 5271 0 R 5272 0 R 5273 0 R 5274 0 R 5275 0 R 5276 0 R 5277 0 R 5278 0 R 5279 0 R 5280 0 R 5281 0 R 5282 0 R ] endobj 5283 0 obj << /Length 5284 0 R /Filter /FlateDecode >> stream xœíÙ®å8ñý|ÅyFš3Þ !ÑÝ3H< µº%¨!ÑðÀï“ÅNâ¥|’Jn–>ž«é{ã8UŽ]›«Ê•ï÷é/÷¿ÿ÷þýûOÿ¾q¿ßº‘‡–¤ÿïÞþ|7m`æáþ¾k#ï_~¹}½½}¼}lþýzëøôþÍ_ÿ»³ûï›ÿÿqÿÓŸ›ÆŸ\§¶Ã/7MuóûŸÝo«ió~·í?ßþø«û¿ZˆLxý3BÞã ê¯7ÿš´ûùï—ݾï'`©,!êNwj»ÿ篷¿5ß¾ÿ‘ bïTÝ?ÿ­ÑàÝö¿>7¦©¼×nÿXsõÓýׄPñ›ûçÜìC1é§üÙbÀ; ¼óºÃ,ø Ÿù-t‡ƒÏÀ# jùû°w<à¼QÌØÀg w0£†¡mJ¤xÞL?,§kBzù3ÄÃû7ýás#þޜӹ]Áéœ"ÖþÄTQ e„Ü(p ÅϰB¼iaÞ@ž!–¿LU |ø R"%ËïO‰¼ƒÒSðÊÁs ¯Ìõ°®†g„ÆÀy°D’ 4Fá¹>5…€2Ö9Ù Ê*Œ%Ûl0UÁ«MAê0…œ]ïJ³FïbdôËW¸ Öe<‚ãµ8o|Ø.*Ð?BvRŒB°´»¤KHŒÝ S|aå`ºFXÁÚ÷â 4Ì3Œ.(XÛ°ÞÝt ò „v¼<À¬iÝÃÇvbùvüCoă‘|𨠫°h óëÌʽŒ„=‰®õ ;ü[ó:À;­%ö1ÊkdX mjçUÝV‚öBºíòɪòiÛ}Î5#d§æçã½°ý´“' ö嬊ëЂç!o«wc?ïÆëxU1³Ã@ž+ÄiwΡw)•kô.L˰tÀì~1# »pÌ|@=s¼><±fÙÖÛÏÁU€¥]AÃZ´0  üL —(ˆ‡!öü{ÙuDZ5…œD»r±B»üÛR8¿JíÁ‚~¿$%m««a‰RØÀ²ã­õ!Ì3…±!v …;pv8‚‚Œ®Ö)êÌ®©ÀÁ›jäÂ^ÞÎsmt=%ù =U÷¥QWK¾4×Õ¾ª]„ò­U‹ö¢+Wm)¤-uý®YÕïã35û£jÊ=åí9d€¥+dÀ¶ó Ï"ÊÓûþë)èz ºÚª/¶r•·É ñvaÔˆœ/8ò[Àƒ° 1oŠ:[ Ç@Ó9ìFŸszá†þ»EŒo¹êý¤ÃIhY¬9]mŸOΛV "ˆgª Yi´Ú/iCš5§Š…Edöl.-cêM4?"CŽa¤PÁçïÊý(‰³5™|õ|fqlõ|f­‡µ.ký¸šaT¦Lý¸tõÙ«·q±&/ðuΞ@F×êmµ0êùæ´Z½ ™S«·ÕÔ)äÛñ;¨Z½­ôL­ÞV¢Ä“ØáªæïNž©ù»U·UÝv&ùdÖä×üõ“óóñÞZ½­Vo+òÏëx7^Ç«Z«·=Ó»‚<Ÿ‘z¦“Ôêm{Z µz[È–)¤Vo«;޲uzíJ×|3´žÿ8%ÕêmÈsµzÛE­ÓZ½mkž;{õ6Áל.«ûÒ¨«%_šëja_Õ.ª1^iåª-…´¥Î¡ßeývß䙚ýQ5åžòö2@¯:ÉZ+Hœ€Êëéüj«V[õ©¬ª¼ýB¼]+o‚·òº•7„]ó]ÁZ½­êóвäkNAWÛ»„§êç“sà¦ÕÛ8¶Z½­Òhµ!« è]½ê‹›Vo;oÂoŠ87†:YÛ0obêZ¢â›"k²ÿê™N$ý×3õ|AÙ"­ßjVR™B0ß.©CÏ^?N±5™‰¯sÒñ¿Ö»¨½ROX— ÕúqÈŒœZ?®îÇN!ߎßÕúq¥gjý¸%žÄ5ƒxòLÍ ®º­ê¶3É'µ*»¦>Ì©Ò*aöü¨3ë/ãEq´¼Åš5ùmüÝ~#ÕdÍ—‹jÆŽJk6ÉU³I¶Íx‚uFaÏ[ÕðûÀëƒÈ@)p=Ìs;QUÍ«¼ý;‹š)váL1ÍV}§êÃŽ#k*ùcüO} û¼·ZU!|O{Ù¼U\ëŸ_Vk¯õÏkýó"ÿ¼Ntþ…üYµþù3]m×ähךéÅ;µfúEkÖšéß^Ns­™^Z…ºK9‹F6tMÆw­³~Uê«uÖ‘ñÈZgý¢m­³¾5Ͻκák²(kæåÖûœºc(Íuµä¯jKÕz—¯´rÕþBÚ_ç° äšÌåjz£j×}eô9ä†^Uµfe_”3jæfµ‰«MüTVUÞ~!Þ®YÙ¤àI½nV¶±{Ÿ<«uã«Î9ý[z•S –³Í±B(éQ.£x®e¸À¼óºãÄ%¥)T³Ëš<Ó3“yKºÙ€wzâãX²p™gà±qc™EÐàQ;Ö43Àc^ÃUáÍL Ñhà";YºÑt¹hQn0aÀËÞ¡H1£ăa ΨógÄ$~ØK0é¶Zßsioë¤{¹rFû¬½ôÉÝûÿj°ê5 l{¥JÔ­sñÎËlƒ  Âå‘Á %üá–ý ê†7횜– SÔ~!¥«n)r <Ï%ù¹,AÛ«ðkåÆê¶¯¶ÇSY…áÆM­’3¸ù4¡tUñBLIKÌ:Â2±.a¬ǔ7†¥&˜sÍÁs€(íÅ%dj1®SPÈ5õÇ9¤7÷‰XÛ…>̽§¤(M‡‘Ñ¡hA‘ꇶ¡;ÖÙŒ™;vŠ÷–.£Þ;~ãµæäÁ{˜M¡qZ¿:Lø[3FàœÈ™Q»Xµ©ãù茇qð™ 6®.¼|ãºÓtÝ5»·Ë§õ£Ì/Ãu3BCîš´¿4¥¦kmZ”}ô„M|Ë—›2J-3†½ôŠ¿êq4ýݵj»GO7$áhZ¾Ü¢‘4m~¤=”ð=¾Ü~¾½ûU0'4™:èü0 =3-*y(MÃEíID>83”e{Qä޵¸¯·QîÍx¦ŸcTðûÀx`h&["ßfÆ» Ž|©VÓ†Þ>­d «Bư:ÇÖÆDÛ´$ŒÑöÒS(þJ…ŒaeŽ1¬Hpˆ”1š6?R9eŒÇ‘ŒÁÉ’wŒ‘ ÚÁ`8 ßÙ)éôTŽÑÖ“b# ç¼[DþœpOþ–NZò/9=€ft€oPRÁuõ­¦i¡Ž}Ë—æ!â(uèÅmÆ_JG„Cƒèh4À4¼C¦í%B0"DósÄþ{:•ª§uæ‹C:Ë/Cp¢B!…¦h8³~¦u„(((˜sœµ6cH°.+Üu ü‚ˆüŒn.ˆ-D.HaÞžÄoN2³õyË=ó0'¸‘Ó†Ù‹H¢q™“h\Ç¢¦iI$ZÛËI,Æ_ŠH¢qž“hÍÖ)FÃR‰Öõ!¢9T¢y+ íb^˜˜è™Ës53Àc24 'h•ðÒ¬™&Ó†Ù¼¤tÄKÊäx)ñçXAÌãÁøKñ’R9^R±G£mIx©ë%B0"Ds(/iŸö„ñX>´s$<&ÊPÐ âãÃ<0«Ân¥ ©}¼•{ÎYŤvÿÐüü篷w»Ó6c}~«°ì§íÂ6x_š;»ÅÆe¡xƇÆüR&K–i>)Ü °>ßÎFy¤ÖÛ-¯v¬êƒ‘’ÊiÃ\Û@’(N’\6œL<’¤Ùp]¯^÷`üe” 'I.N’؟ѶĶAßK„`DˆæHÛ@RŸ WH‰†å'&…jÓ þR}()\rÚ0›Y”À$Y.I&¾ÉÒ¦®—#2$0y4#²\“d±§£mIˆ L#¢9”ù°œpºî‹ MO¯œÎ ;m˜M¯"J‘"—"¯i H×ËÑ£R@<š‘^E.DŠØÒ¶$ô*†ŒÑJ¯ây ȶ‘ˆ³Ø;óéVú |Ú0›nU”s U.ç@&;t©Òœƒ®—£Käx4#ݪ\ÎT±¿¡mIèV 9#¢9”n•Ù›n1©˜J|˜SNÛîè²0‘@ª!‘@™iÃlŽ14âÃrÓlÛ#R6"嘶—ãÆ_Òˆc ÉqŒ¶1mSŽÑ#‹ `DˆæPŽ ‡^Ú<žÔSä x˜‰vN!)ó2äň™¥ÿ‚òÆmÝdô{eÍcV‘l‘f°-5`Œê5ï0m˜+މÒ"É¥E¨Ä HšÑõêÅíÆ_FiÒæÒ"¤Mœ"6M‹è{‰ŒÑ)Žñi»0p’EÌï¨3 ˆfA®À ¹iMfX¸Ó‰ŠøØ$ïE‚o˜-h”¾¢X.}E%NÅÒô•®—“,H_ñh‘ h.}EÑØEÕ¶Ä"¡ï%B0"Ds¨H`ò<"ÎãÃÈÌÙ#˜ 6s¡*6äËH3m˜Í<Ê—Q<—/£_‘i¾L×Ë‘9òe<š‘ x._FñØóÕ¶$lÀ‡|™ŒÑÊBÆô_©ŒÑ˜„a„¢àG úW§âÁèÜ$Ÿ7^ *ÊáÃ|\ ³å‹Œrˆ”Ìå©Ä§§TšCÔõròÃñ—Q‘’¹"%ceÛ’È9ä`DˆæPù¢|Ñ +ˆQÉóQ8ëN0p`^Z`ozde[&áp‰&Â=…“\0çIÖ–sLÌ—†ÊÇ›Ýpß0[jIC­sÒ0ñ×*ç¯ „YÛËI;Æ_ªHj™“†:ö>·-‰4ìz‰ŒÑ* Íó¬³7•Œ9k޲1æÂÒM‡áæÃNf³’‡”Í%©ÄO¦lš<Ôõrdnƒä!fd›KR6ñúÙ4y¨ï%B0"Ds$hB÷f0?Ui Vj˜Á]9B4›5¨lÐ0—5¨4Í%PéÄ;¥iš@Õõêmã/£*Ms T𯾶¶%fľ—ÁˆÍ¡ŒÈÈÎŒHáÚyÉnr~ îzÑ4ò³ú¨½o˜Í<ÊÏÒ<—Ÿ¥/•æi~V×Ë‘;ò³<š‘x.?KóØçÖ¶$ìÀ‡ü¬ŒÑÊ|ø˜â„˜=B²9)XX ¶}›™OZŒéXvÚ°þH;©‡ÑòyfÓ¶E™Pæ0(ª kݶø8¶4`@8Hž-³héƒh\ ²²' e­^óW@ûø ÓvÚ°Á ´jèð°C–¢há«¥/z¢°CpœèiÃê:H†x†w×”dê 5óÕ(2!V2êzé)wE|,Û_›L¤[Œƒè¤RÛæGn&uFGÖA2tø Xî!јÀ6fC^À³ìÆNÏÞ]äæšå†E1jÃr1j“ØË†§1ê®Wov`üe£6,£6,¶þÛ–Ø,ï{‰ŒÑi–>ĨÁÚû°ôD\˜ÄôMN»"¹'ä:¾p›aøPþÁ ³ÙND¡[#r¡[#ãÐmÛ’°ù̃ñ—QèÖˆ\èÖˆ8tÛ¶$l'†ÐíF„he;yâÐí¥Øaé®ÛH1ÊdÚ0›T»3*»3*ŽÝµ- ;¨!v7€ñ—QìΨ\ìΨ8v×¶$ì †ØÝF„he=|ëæ‚ЙŠ0\&—ßhïcå”Lf󡉂‡Æä‚‡ÆÄÁö%áC30þ2 “ Û–„Í<ÁˆÍ¡|hiåÃå|8Ÿèí¨SAƒ'ú7p ¨xi óx☨û8ç²oHœø}êIŽÁY¥"ÞÜļ±ÊYe‰7ùüµÌ8«lâH²#)t7u½ôŠ¿ò1gÍ3Î*Kb‡XÛ;«Ú6?R>qV8ŽtVY:¬0üµ¾M}§uß³Þùféï]Á¾a®¹eY·,·‰W̲4&ÞõêÍ©Œ¿Œbâ–åbâ–Å>¾¶%6·ú^"#B4Gš[– 1ñoÔÜÚæ£ J°`Â,›ÖšG ¸…e),>Ó ò -3¼}¼mhsdê é~|Öáé'ÎíÝäH›74FhKÃw6x–)8Y½Ñ™Éê£|ÌŸ˜Üé3£TzÇ™ˆìáxh²4©>@xø3vnl?º7MØØÑ=LÃ"f8S^¥/è(ŠÂê.ó†>ãèž.zu=Ò=–àÚ¿Éóê>&Ÿãe0l “ƒç&páÕ£`q—O’›Upl•JR*Ñ!í$Ì> endobj 5297 0 obj << /Type /Annot /Subtype /Link /Rect [60 771.500000 141.750000 778.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn32 >> endobj 5298 0 obj << /Type /Annot /Subtype /Link /Rect [87 764 178.500000 770.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn33 >> endobj 5299 0 obj << /Type /Annot /Subtype /Link /Rect [87 757.250000 159 764 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn34 >> endobj 5300 0 obj << /Type /Annot /Subtype /Link /Rect [60 749.750000 129 756.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn35 >> endobj 5301 0 obj << /Type /Annot /Subtype /Link /Rect [87 743 181.500000 749.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn36 >> endobj 5302 0 obj << /Type /Annot /Subtype /Link /Rect [87 735.500000 153.750000 742.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn37 >> endobj 5303 0 obj << /Type /Annot /Subtype /Link /Rect [87 728.750000 144.750000 735.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn38 >> endobj 5304 0 obj << /Type /Annot /Subtype /Link /Rect [75 686.750000 123 693.500000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.lua.org) >> >> endobj 5305 0 obj << /Type /Annot /Subtype /Link /Rect [150 659 219 665.750000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.eluaproject.net) >> >> endobj 5287 0 obj << /Type /Page /Parent 2 0 R /Contents 5306 0 R /Resources 5308 0 R /Annots 5309 0 R /MediaBox [0 0 595 842] >> endobj 5308 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1700 1700 0 R /F8 8 0 R /F1409 1409 0 R >> /XObject << >> >> endobj 5309 0 obj [ 5296 0 R 5297 0 R 5298 0 R 5299 0 R 5300 0 R 5301 0 R 5302 0 R 5303 0 R 5304 0 R 5305 0 R ] endobj 5306 0 obj << /Length 5307 0 R /Filter /FlateDecode >> stream xœí]É®äÈuÝ¿¯Èµe3N€a F^ht^^-Ë‚ .káß7“CAž ã¼d¾ì‚T•dfŒ7îçþô/¿üçé¿ÿqúéË/ÿsúmüûË/oŹ.‹á¿ÓåÏïïèæ<þûT7åé·¿½ý8ýxûùíçîÿ¼ ?øåË¿uÿú¿“>ýk÷¿¿œþðÝÃ?Ž_º|áooµª»¿ÿÚÿÝÖªûWqýûòüÏoÿþ»Óß/-N݃yüü{Ý”¶¶—a¬týãmš¦êÿüã·¿¿ý4,@X/e]´¶9)kìIµVŸþ÷¿Þþt™7X}?X}²§ù€‡/“n.ÖÝ€õé:T‘†•Õv¡íw,Cq[=.ƒ*†.ÚÓ}‡mG ¿$^C¥T´5tÛŽ°†]wkØJ¿†Qèpisd°í‡^^ØV;u–vñÀY; Z]ÞVqüD.乩Æÿà¿ßCJÆ\˜{¿î2GîÙV-ì¹µJÕ•­‹÷¯Z_º)»ÅWºíZ*e)Ém>BãU]Åk¼¹øª(S)ëùèÚ–EÛÀ¿k^µn‡E+ë«vm=Æ–\TÌx_F.½(ÓvÃÆcïvsá_ÑvûÚzŒ iZ±ñËÈcí6l<òn뢮ãíö­õ¢;I¯ñ~ä‘v7{·Õģ춊Èlµ¶*")]Fk·aã‚J™¶FEÜÙkë1ß6™D?òX; —ÜÙºšvV7èÚ|„Õ7º‰'퇑‹¯Ê´·³ÖIƒV͉ÊöÆx[Ö—Ÿ÷öìø 97M·XV_þîìÛþiuy¢Æž¦'¿u?*ÎJµ—%ž¾eÚ‡f¦C7Ý/¦Õå‡'§²t»éž\ºyLÿ-ûØŒ}ìæÏE~¿ô?<nÖž~þõí§ï]wÕé×?u¯úþúµ[Á²:ý¾_súõ§ꦠþùôë_ÞTq®:õª.û/oÚáMy.ZsqLßÞ|êߨ³5ƒÃúöæóð=½º¾±UÿÆœ»5­5ý›æöà j^•ÃWÏM[Tú¾UÀ7½1_û7å¹;êáM1¼QÝ6£Ý06Ó¢…Ô.ñ°ß~íNÍm׎B·oý¶Ùñ(\ÉyxðW‡–Š-ÁSÖ3‰¢­«±åésÝŽº©zè®nOU{ LŒO~{«šñ„¨ë·êûV¦OÕHúÓç²?î¯í¬ŽW¼¹#±§i¤C+ó¸¯Ï¿K~¾;¯F¯R¦Øù°ð¼UìÇsm&ê¾ý¦ObéžD];ã³ãl¶¨áxÞpkº¿Á§W¹kŽWoÜ7ÈP`Çúdx!ár) ÇÆ´†7¬ÙȸšAè5fä.¦Ð÷½Ò - ­–t€¶q…s÷d¦\¾5Êø©™écéè­]ÒZ3ëÆÌu€þ[ö±ûØMF@uû».é1EczbXCƒû;Ìžôj ï3.£Î&L0cÃ3†+‹å2áo ,½ðÞnelƒFÖ"=2&Ûs‚냜Mu,û³uÊ9gëžÖ,§âp¶á[=çº53}´œ­{`札{ªgÝh—³ß²ÍØÇn²r6½®”cI™L†b3ÙQ'Râ<ói`?‰ŒÀ&ëáxñu ?ÑjÒ”lsÿཞ*Œ¹·ðºÏvnáuO«Gë«âXx÷êûV¦OæÞÂë>ë¹…×=U³>”káõϦ‘ê›…w×GF ¯E;íðw(çëÉC¨ðHzÑv׊°q'¨[B\gçëW{±Ò6Úbª°ÅäCªšû›5–R;Ki–4×QÚ?™i,—oÉÔÌôQ;K©–4–²˜uSÌ5–þ[ö±ûØMV¥lŽíÀ' M̶àoð9Ö1°ž%ËÔ1%ö‡1ívÀñqI(\¾éÓÎ×@õ­l¯æ`sÿ`3s­•Ã\k½Ä\kër½ÞIîðÆË·Fæ953}Ts­‹%æ:dJÞwSµsæZݸéµûØMVæZ×û(¡®6Ó”çA~®áù ##p?5<³²3%~ã‘vÕÍdÀ{ÿ`3h ‡´j‰¸>èþÉŒ\¾5žð©™écáp€¦]âMãvÓ4sÐË>6c»ÉÊÚê„Ë(Ì$æÎiB2RçOOƒYblã9ß~ÊÚ)'ÄLÇ¡r“¬RY±ÊlÑ™*§xJ2Ör*˜íÂCÂóÉÖV™!Ífœ(í‰?à(Vl Žâ9ؘé†!Æs#"|² ‘1&WÕŽ-äì,&g"ÂÀXŠ”ÝéNݳƒLT8až Žн1æï¹ byiY–Ö—¢t¶a¢iDZ€°ê%V(±âI; â O׎}‡2gvŽˆ\ gO Äi‚ž5Ÿ- •“ ÈoßÒÑ›$Æ<¹ÞŒPdxäŒ2¥‚Èõä‘ò™E3“,¢¨½„ö\Y‹×ŽxC)‹Ï¡ÞyˆƒA¸ØÏi5Á,fœ .ŠçÞ3u†³1!0Q“神ùFmMlÖ61¶zƒ4Ǻ<&£í§aשr/*]§RÌö#Ò¯V•CÀÉBw‰Ì,%<£fLŒÏîQuh¿Ž×¹JX‡ŠŽ§áÈžñ;q= “ŒC#àz‹¬šà/aaØsLj°W… ë(9emm”+k ß f‚'!aCQ»˜hÔ"—%0«óØÔÄe}øùý•'`šÊ·Â¬[HúÎ!UGÙ„`ê@á0ñQF!ˆ|of-ß8¿>Ó+­­kûFVÕ=vö03Ùâ1rââ»2uÜ¿¦]ß!H ³„Ñ ¶'y®ê¿B7è©Ø¢l"ž¬-€ÀœXÙ °QÖ­Ì/n·³e†¾…é!Ñu¥kጎ·"2_ÓT÷ ãz˜nÀ­†~E!¢<™CO#XÀÓå"©‚xlfp÷gãο±%”¹‰2UdP s%µÈ)]*^€£_ÙÙÑWp@ ³/+a—V¿ù$µ$ˆVMã®ãS'd_ˆëáÉ|EYÝÇ­{Þq°ñÏCˆ1]0ß`¢³[ÛÔP9R¸.õýƒŒ ÚšUÎ,áo;Ô±°¿l»º,µßBµ˜áú ­lø2uy5Á²<¨cYaL…IÿOªÄ3Q#<[¾§'Û’påÍsâÝI£Ö\ôã˜Bhc¡˜,.³Ûë­#µ²ÌÌý«“’´çÄYa?í“A[3K5?Ðȳ…Ø¢ø¦£‚˜Ò5AS¥{LãÊ“‚Èt|dàØ¨Ä²\ „ùáÖ©üσ)ÍÓ̘rOÛQ{˜+HE*´]éõa2¹®X­cÊ£IØÐÉàUà`)Ãi{ð;ìI|AÜ”u&ƒ2H„” k<ÀµÍØ4˜3ãÈ ã x©TÂà|L6…ÇåÊ}Àä󜰦Ë`e+Ö5Ó±ÜyÊqÆ0—èò¬ªkWž‰ÙÝ@$ A$Lγ¶‡ãš  @þeŽ Ö¤wXªSïyÛ“ úmvÿoþèÅÓ™ Ä´Û”q 7f½)Ï5ã;g²`RÅP$XÎ\ø2•Ú1×Å£@Ð @²¸˜ 0®õĸR!t¯/!ƒ¡Äxì™ T;ø —4ÊU‰|Ï f»ÉöމÞÚç¨R"ž¶8 ;gVº™²Ò·¬Ç++rßQy¢6XdXyÏr1÷8·V4cr}3U5/‡Ê½Óƒ˜ÉõÍ©ë|Q5ï“ÑíãÚ\äð°:7òkÑ›qÕªsUöKs·ÒŸàoZø›AIìÎÿõÉ@øí }GíÆÂRû½IU+”*·ÔÚpX”^¹‡eilp>ž±á™¶‰ÔESÛ‰¯ÕãjwÒ‘p(ž1íùøçÒˆÚ2žUž‹Ö9øàx>‚^^é¡{°Dª¨¾j< ¢yesÏÉŽ3šRš¸Åˆoú{nXº)u9±ZÊÑ¥yŠÌ2`„€eÈ¡¦þM`ê;¸^?s®Ê^n#Y_ÌP*‰žIÙe‚p‹g v _Ú#’¼=©wØɘ&ÙVÖM!y¢Y‹T2:<©!°.˜1ñ2o=™–§$µ<ƾñœ¶´w6e¶‰€ÔŠÂJ0°l•@±"´Ao<êÚv¿‘,z!ué-I‰äNÀÖ¬M†ÄeåŒŽÊØ_GÎ$ðþ…óóeÙ#¹e³˜«4"|’qÎô(ѤXO®ÅvSKÝc5Δ1¦Ô¬Hïþ6JíJ•BFT`”2a¾'[“á•˺,µÚ.±eKŒâ,/&M »ÆÈŘ™¢9pL"v¼û¡õŽ-ÒEjã%ˆ{¡'U½+ê6³D !À¶ã¨S1”¶q­µÈG+?&FÀáNäº õc¼LÀ%™-[.Wöª*qÏM6¸•*±Ζe«4eϺÊV®‰rwp¨íÎnÍÆ€Ôˆïÿ´j2yÛÜ8ØÁu­ŸˆX¦R<4Â\MfJigßd&ÕK ÿg ÆÜé…‹¯â–½ÝqHñ¡>á q¸S´žÊpN«sÅôžŽØ,7q)’°˜?W3¿Z¬±x‘Í$I…?ÂÜ)=’ñMUT#\”!ù]‰5B¸|vmóÙˆ¼‡2j ›ôi7ª(×,Æ·”ãzÐ=,ëEÌùcàåA>ÊZ žšåxÔ³+ Œ2þÉÁ3Y¼£Æ#pDWnxÛÊéRê†7l ßð6ãy¬ç[5¶¶p›ß³Æoˆ[Û¾Áó™TêÊ%9­Ï•í©äößðNåÂ,‹rÕHæÑq~Q¿ å bisÍ•A ½óKa‡'ºâK©UÙíÖƒ&Îmw#ŠÔM—‰0e‡¾FZetSQ«q„/.ÊHÀÔÃè²¼–w<ïíyu÷sø ß|FoTÞhø›Ž`\«¥76ü7þfTfÃÖÀÐóI³Ãu½ºÃæsÂñ´Õ£ý±´r-\¹î*ü ÞL‹˜~Z´p¦ Ò¥ßÀÕE?^ƒ$4V©ræÅ̹ ã1ö”=JË Š+ Åás‚iÞ`êI4| < žÕI5j¸ ÏG #l]–fõ¬{ø^Ì9¾„¯¼GÆc>9;æùZT31eø¨ñ9zYñEÔÅUU„˜rŒë’Âl`Âi‰¬ß×å02$[8gÏÞ‰€¸PªtøÞ˜óÈ0S*‡/i(\ 3Ãá Z—³2Qt/7Œ¢\dd]e©oå.±PÆ* Vï°ðdž%6ë°JƒFŸÍ1fr¦R€U?n|˜—rÏ Pª¬Æ)>Æç^W3 ãŠ^ü†ÊF‰[:2œìJªTæ3iº­f€9:vµ”Ó–ÑCËf„C½cg‡Ô:R†IšúZÃâÉ´ŽwÐèKïùzO«§ˆ UL@ä¢u@)PÑ2„2UWeÕì‹H¥*m¿øJU€@eÒ˜ùÌJGmœ“xLf¦° "žùàQ㼄ì´qv1 4\\R´Æ /RŒDŠA+ª£Û ecÝ'.ø¦ªGDÝeJŠ1I„ºA™×PxÉö÷QWäªò²(í¹“9#ò¤¦)]ž$šØ9& -n¦°ÖöâTivœŸÊ܃b.ˆÃØñåJBìøÚ˜l•ß®ÈÔ²“eîÂé ²×Ô#cì‰.Jþº©® PÀ·wÏù+ô œ€öê¹@Å`ÉïØ%&+G©óP>yMYø¥z‡EeÈÇ‹Z3íQ.j7S<2Y}gYŒcQ$XYák‹Ç4Êöì{ÉVš™º0ùÝ;?he*ÝûŤO ^QÌevYE³TÚ‘Š©¸±ÌíÆ\ þ!Že½È^[ù:ä“÷ØùÃZŽîΙFÖØÒYCê´¿u¾µŒqvñeBq‚ùÅeçØ”µK\Çd³È*Š 1ª‹™´Mqïu^VÈm?̌܌—¶¨cðà]ÕÝ Ög” ‘é§±P'jÇ—‚öœ’¸g=†ÊRØq$F6]A¶8œ "3_yK(õ€Ê…"”b ýcNòŽœƒßºr ÌEºŠ;½Ò4Îôd¯zP– ZíQù1nƺ:¤qãA“½Â‰×­'YϺøeãBbôGH!N-zåtíž2BfRf‰v1LHTXË–2+\¡vǹÇT’î'À¥Å$Be¬ªŠÊ•÷© Ç£â3#9Y¡$æÚ‘è1óXBLV¶ìØvìtˆÎJà‚ÓWÓfò]h›"CüŒW‹pÛïá­í1an‹lÒìâ{F¾"›¶CëL)ŸT‰ù`K©¢ì9þ޲TÙïº(׉>µìµ‘zõ ½Ú¿s™Ñ«#£J[íð˜Ã¡J7Ê™Á.4§e€3dEwfx¦v;ùz²EwIØ¥ÝNØ»ÅÏ*+“wƒ²d†UÚݺ„˜ñZ©ëLŸ ½5vj~}Ẋ›Qª* sË$ÇT«æuL~L=Õå^Xú_`a‡.£D"zíÌáyU5j;·¹3™ÖcÏÉ^H”€ÒÎÑLå' :Ÿ+Uò`‰Ò"@†QÜ.1å1C›áZx¦ÄÀfÀÖ<>zÑê^<9€²€{$Ìîg?JTf ““†é€ñ¦bw¹˜„O€ ;FN@OÜïÈeF¨˜:ƒ[ÿÄ¿!ßÙ:‹&Ížò¦wpý).v:|µc Ás¦f ®?c+0ÜT¸ì:J\Ë}åvû–îG.QFÊs©F |Œ­YÝoL=ºÊfaãmÞž¾âÑ2±ÈbàÊDàž)Ê/“ÒÅx¬b ¨‡­ÁŽ“×Dè{¼æøNt‹Èå DÐøãÂX3ÒFý,åäí9¡›ðì5¿ _LWŽLÆ‚,b7€yqc‚U¡ÝÞKD;frT5Sµ^áÂW¸ðåη;?²À$±ïÔui]ÉvÌHeÝã{{¾-.RV}ÇÒ„Ry0`BIØ(aB<1P'ÂH†(€Éôã±góƒe¾®ªQl-q@)¾_Ó¨«¤‰GÍBðx›e¯1˲<Ù{Z ¡Éú__;öûi)ÅêH!SJÃeê›À›°#PÝRÑÇýFÕpoᬅ£Þ¾ë]â=1Ú—ïÕ–pÉóãõ0ëß¿9ÞM¼“"µÖâââyøšD ¥eñ.¬ã~ì·pBö0ºgËø!Qþ¤JikLöɲ P—$x“p‘1ªHØ­CPF ©®i¥Î£àŒƒzÃuÖ/áùžñ„§,8„§‚ñëö1ª"´¨ç6çÝ©ªp%@2Uïé„h=Õ¥òQâ"ͮà ` üGâ¬K uếS΂Äb´ÉD—«öéÑŽE’$doV¿€5(2KUº>DéàoåÆdômëp‚Ýð¿0@ˆ' '"ŽpŸ(KõäÄá±á~vŒ­zP>¹ãœÅÜò¼õN8ÙrÄIÖ­Ê^ÇKgÛ´S[YÛÆÓ“$ 7÷óq* ™TÄR©zu”«žINfÿÉLʪ˜VÊcRn7´ò (FƒÃÝ|w@1£¸æ¬HiÊÆÝøç 0™ËÌ•‚YÆ ƒ%”J¶xBfóJu.w͈ó;3ÇÄ.JrC¢…¹Î$æ3åŸ,âP|¤1…+ñdaÃyï}…gÆäüä6Å3q­‡á}Çb²ØuLô}æå`B’LªÁáRÕž 2+·ÓZ"Tæ:±ð$²*Ež"sŽd¾­ÊnHwGÇøþâ_Xâ1R¶we¤óŠØkŸ+;ÛúË$ĺ_›ÐXñ˜rL0òHÅv“•Å"$ª°^N¸F¨K¯ùÞL$†Ñä2øK3ã@²XÅ‚HÁ™gü‹^è Qã$š2*¯l¼CÙ.lñ‚zp eXÊ4™`eŠf{D¨©xê´áúìð£Æ‹·ß$2*Ÿ^æDñnëÖM˜|ü3·V¼ @ñÌlen™0þ ‰L™lWç¯, ž,EPÂýHå ý›6ޝ1‚x-Æc›ÂCQ¶p«rUáËÖ ¸.ôc—9€ño0&l3mâìÊqëAqų¢¨´ãÕâ5ÐhÝdñwµ!VŽ`T¥—FýdëVóÁ¨Á·X ¥>›™9éþÆÓ?¶øèÄõU©78€ˆ©Ð3BpÜ+Ê'4´äÍDõ¨QÆÝ^h¤Ž{I¿Ö§^Ðï†é³B©3_Íߌ†°>W³¨±‚¦øWÔYË YÛ÷q¦ólmÌr¹ ©€ƒ‚]³ ŽjNÃùC ÓP¸5ø›Ñ®PAS¯odËÜåß݈§‘CØ ýw˜6ÿ h‰ý"O¼{SJÁªÂõöP Þ#H%ZÀóÁýàÖš÷ÓB]˜óÈG¶…ãÔ#G]㦧ŸßþïD© endstream endobj 5307 0 obj 7384 endobj 5311 0 obj [295 /XYZ 38.2500000 377.750000 0] endobj 5312 0 obj [295 /XYZ 38.2500000 377.750000 0] endobj 5313 0 obj << /Type /Annot /Subtype /Link /Rect [230.250000 384.500000 369 391.250000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.eluaproject.net/doc/v0.8/en_building.html) >> >> endobj 5310 0 obj << /Type /Page /Parent 2 0 R /Contents 5314 0 R /Resources 5316 0 R /Annots 5317 0 R /MediaBox [0 0 595 842] >> endobj 5316 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 5317 0 obj [ 5313 0 R ] endobj 5314 0 obj << /Length 5315 0 R /Filter /FlateDecode >> stream xœí]K㸾ûWø`=I½€ À<ä`0ä°È!ØÍ&Xì.2ÙCþ~Ô¶äî–ü•ÄÏÅ’l+ƒd&­IëÅz||óç/ÿØÿë÷ý›÷_þ³ÿ¡ûûý—]v¨ŠìôŸýÓŸï^þÀÕ‡îßûª.ö?üºû¶ÿ¶û¼ûÜþï·Ýé…/ïÿÚþë{·ÿKûߟ÷ßÿ½ýáÝ/=ý¯»*¯Ú¿9þÝTyû¯ìü÷ÓÏÿ½ûÛö¿=ØO×-æõÿÿÎÕeÇeLLým×f~üóû¿íÞœ7KQ¹ºÉöyðaŸ7ÁíÿûÏÝOíýðÙ¡ y^•¡Ê®™¨rO3Ue;„k§+\=šèøGgø\pïê:Ùà§•«S%÷í°â臺tU(²¦†ÿ¾Šh¾);¢yŸ`Ož‡O0ø½’ ~\¹:Uº FW”f_f½¸cµq=‰ž‡O0xÕ.9ÙàÇ•«S¥ß\<ºææV…ïT¥¡¿OGÿÆ%ü¸ruªô›‹GO¬ªCVõD˃>Ù^ Ÿ`ð¼NgN+W§J·áÂè‡:øÜW®O’ý$ÕE]»öß­~?ýçºïr¾³oE•€jçÑSl‰kBÂÁŸV®M”~»áà©wÛ—EJñ~>Áà¡JÈKÇ•'o¡›½eìÖB4ŠÉ·2öˆðÑ—÷˜ú–£Õöƒ-u¬sÓ5$V^UW°–ŒÍ>†é\û–Q¿‚¾eŸQ×Ë›£)Cvœ²õ^hžÊ*¯«bDêpþ„MôLÐÓ(÷ïêܽx§+ˬu“i:t*ê¡D^úU8qwRö‡"”Okµ$ç9é‘¢åÅ“½Óy&ÏŸÑ1ñ¥_ ÄÖ³‡ïêË. ‚‡‡ßåjb´á– dôÀ8âRÅï1‹(‹É…W¿‡b7(O Ý0G ²NP4/âé&pžSÓm$ÀXL±úÃcÖX¯dÍIÆHk2‹¬0¡rñq”V7Gm5>W¨y8h¯J?t6ò„•y Ÿ`Vˆ:X¢Tm–ÏçK,ÊXeÎc®rAcrÏÁÅoeŒVÆ„$<=Ê(™QÁs};Ÿ\xb̫؇ÁKÂÜ¥fvkF‡&J5Dè$‚¨Â;¶öÿ’ÈžžÄ1¤mÒ1LëÏäYí†ÌÇ “nB)D [(¾ÇáPæÁOà÷xœÁe(pB dãäfÀ½j g?ò ¬ßf¹ã‰‚Ä:¡(›²ÕÇ®aÒGg}>GÆC¦\åÝQì/2^!~gÁ¥‚‡Ìù¢)Op|Å_l–U¨úD‘ï=•ª,æ¥Î01¤dÄ$"Žsø Á¤‚;<:«†¯™0…ýp®gް!¢ã9& £¯U£ýº_ê> 7ÌŠ\ 2â8ÇH“@Äá8+Ë ºª¬3_*hÞ)NIhÞ öíÞv„ ÌwG<ï?uŽ%'œ<*}9ßÀQ™Alg𶌖4ú“ö#<à,?¸%K—JÂ’0«Yrêh9_æÃG-Ã0]Ã\_OîpdÇ6pWÏá6ÔáJ8¢ƒŽªÐ$ªí×p¬ˆþgaˆšïÛ¤¨ÐÙcÕ—lP31C£„¾‡ƒÒ(F"ƒç9§{›6çq´Ð¦ì(j)Oý·,›×÷H^.È\Ánë"¡.¾ ÆgÜÐø7àõ=À.èÒÀ*®äp(E¦'}maQž•:¬-T®Hõ…ª ÈL‰¯YQî(m­Ûµ8¿ˆUB£!P'€jífªu[ñ¶nT‘ð<ñ.X].øO8rÁä’ †=Aê™]0„w¬Ës¶hó7VàoèF.–÷”ý•–¢Í³:Ÿä¤Íßà´Ãæo¬!¦·ù"'nþÆQ6Ù™V+Nt4EñZ¢ÊqÍ.Á÷%Y]å²â‹€uG³BÌš¸î솰ˆ+U(FÇÄ×íæ¶º¿dù¶øÑ¥âLK £…íWå|ªa„°)óÚ^ZÊü•¥<ýd–‰ÍcÀBêè­|‚q1= wðÄLŸtøç¹3·I 5¡ÄǺ~}Ò9©á|¬†Ÿ´éQ™–‡§9Ý5Ù«ü²û"œ…®;DÕû¼¹Ø›yjÍlšâ5ÕòìpQQí“nwŠƒ"/âÑ„w>ÁwøNÝïΩWúÅ;Ï·Qá§Nª2/{6xþR‡Þé凜ð ~'Có8øD #èö®à ¯ZX¤5¦NçøD}žó¦A»ôÜí.N–<î2nßcâó.RÊ–”Êèª@—B×6žçÎîŽiÚŸ–GAT2!@†#­° 5ŠÑmøÇNÚèL€WOÀà ‹]<§|7ïšq%Ò Â(D¯k„º$²m”aâà(`ÍW†áìûŒàT1×ÀØ"õé˜kÞÎs‚~¡€f†@QêšQ—Ñ "ËÄüS!«å Q[ùv&ÊF8pº{*È*!åÚJE7§º4Šö”p¬M9<þÝÛ™áNŽG¿“1†f7¤ÌO Z½|Fþ¦rºˆ‹ÌNŠSïDô 7½eËm=Д`£. è>60ªˆˆww…Ë}ÔŸÄ\EhêØzεÎÿ£%E8EªÎ;ÛêPm~{ñ軨ØL4òÜ*At1A¼r³wxsË1Û”øYÅÐ(êž3tá …äî5KX ¸‚ÅÁ7H¥xgÊ(Y7‰‰”ø¼.X“ˆ€ã)$ÆHHáÚ„Ca,cIN@)Ío> ÔÝ­–Ow £áµ1F狘“€.ôšîI´Ü¯äà PGבbê‰TQøÍ@X†ÌÄ ˜QÙi£J#ÁÞÒßùZL‚%IKÊÚ ªXÔåõÊX3PéÇ­y¥Â'Ïx ïðÔ=®,†´þSÅu¦97SwPâŪ ©Û%vk Ì™¿Ó#"ã×3Ha ºÔˆ³ºüÊHÌúB[f±DDB8D2¥<õ¾k¨_s°Ú¤ÜÖ7}_.u¸p·S ëB!.lÍw¸i7Q3Í͸iRµYûqʇ¯hC+F&Öñhº-ó'BZ ënXNo“w&KÏ•šÂ°<ÞSü„˜ÇáÝ&4¬°Û>B€Ð`àJ uœZ;Á´= yuWl6TÒ› ÍÌl(Ekød³®›u},ëšc3B+ ÒˆW¥¾6´‡¾œæKl0E% -‰ùÿ&-òòr&èȃ‚b­J\0 ØD¯€Ø¹‚8Õ Zˆ8 ãµQóLÚh¡¢˜äËUË3ÔOŒ¤¯ù‰® ,±5"ü[Aà³ôtu.'2ž•à×àïÁ£@{f»ÀŸCÓW(ùY,NS^B»û _qöŸ) bòPüŽJí‰at»(t+o–/-µ‚¶Ð¼–ÖÄG+Îpæ7zRÜb«ŽJmùB‘·ˆ¦rDSx2ušKï –g8I\»êƉ¥.]g`…wpÅ`Ù–i€;PÍ^ð(0‰¥š-Tq]rQÝlLeÝèä´bxQê¦ÒoÌè+ŒR#èå*P 8É%¥´be34cJwLëË£U“jE%T¡u Ò™˜×†–´º1:öîf p7Ã2Í4„“jc¤mŒûS’"aUCû“>Ÿ%¥Ë(œÅ­ñ¦ö9µ¿¼„ª(eK„œrÙƒ»{8/Ý rèûw8·>clÔù7餢 u9çJÙí†ô_¾7•Š¿DÄ– ò¦Y} ¼±Ê!…q=#N:L[ð»ÙkœS5IJ—Í@_(%ü„„,sK1nËÂ…O8AW€çÁ¥»BòŽH0 IÜ-ý¾êê–~9qK¿o Eòª·vÝö½jçŠÍ'Ø|‚Í'HálíÇ"nÞÂæ-ÈólíÇ'ûîêiÓmïcJÇoÒ0+V­ê¾3À3uŒDŽ‹ÁtÊeUo½Í»Q')šžêÌõ˼³Ùu1{q^Çd*\%Y Úh–ödJšà;˜#)4QL«Ë*F×g2eå#†ç³“Q´  êZš^S“Ð ¬‰Ê¶ŽÒß/â!L6…î¯[ùIè꘯ZƒC'¾'íq¬ÿËŒlûgÿ­/Qú>Oý ñ¬/I§o5të!·Ÿ´wá5_òZNÖ°º@¹S ÁÜ‘óÇ'ÞrüÄèÞéœÊV7‡<òÍã§8îÒÚ>u_:òk;ŽÃe a(¸Ê©`§x°ÁNÊ…ÏÈñhðŽÕó¨O¯žÙ–e¸§·+îWO9*`Ì9V¦œ‡Ìþ±'Þ½Nµ\¢*¤·À%x —¼€¿σG«¯ç…*ó‡NÌc —㊗uJ›î?ïþÖ©ÀX endstream endobj 5315 0 obj 5393 endobj 5319 0 obj [296 /XYZ 38.2500000 525.500000 0] endobj 5320 0 obj [296 /XYZ 38.2500000 488.750000 0] endobj 5321 0 obj [296 /XYZ 38.2500000 674 0] endobj 5322 0 obj [296 /XYZ 31.5000000 560 0] endobj 5323 0 obj [296 /XYZ 38.2500000 224.750000 0] endobj 5324 0 obj [296 /XYZ 38.2500000 525.500000 0] endobj 5325 0 obj [296 /XYZ 38.2500000 488.750000 0] endobj 5326 0 obj [296 /XYZ 38.2500000 224.750000 0] endobj 5327 0 obj [296 /XYZ 38.2500000 674 0] endobj 5328 0 obj [296 /XYZ 32.2500000 558.500000 0] endobj 5318 0 obj << /Type /Page /Parent 2 0 R /Contents 5329 0 R /Resources 5331 0 R /Annots 5332 0 R /MediaBox [0 0 595 842] >> endobj 5331 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1409 1409 0 R /F8 8 0 R >> /XObject << >> >> endobj 5332 0 obj [ ] endobj 5329 0 obj << /Length 5330 0 R /Filter /FlateDecode >> stream xœí]Mܸ½Ï¯ès€m‹Ÿ’€ ÀØcÈ!€a99Þl‚EvgùûénQ=3’[|]¤Ô=²‘xÖ´¨R±X_¬z|÷Ç/ßýó·Ý»_þ³ûþüðå¡Ú×®ê~펿xùºÙ‡Ÿwuãvß~yø¾ûþðùáóáÿ¿?t|ùðçÃOÿÛéÝŸÿûy÷׿þòÇðŽÿà—‡ZÕ‡?ÿ}ú³­Õá§êüçñïÿõð—ßí~=ÎØ¿.óú¿ÐMm•?’qáÕßúÏT§ß¿}ûõá]Ç€´·¸Ú6Fï”5v§Z«wÿýÇÃO‡ôÓWûÆejíìáçÖÛºrM£?×&üb_^ëÓÛ}½Sº=R2z÷é·Ìì*Ãä­6ù&?Q.Íe¼ŠNžyµ®\Ç2]µòL{ž>Ê8«ò-wG¹8WÂzGfß7>ü‚?“ïnN<; šUÍnB±´V©ú(b×h°Ž{¾mº¥©}†µ9Ïžcáë:£T(—fJ/TpòÜJ¤Ñ¾cYë2ðì<{Žiu•oòåÒLéWNžyµ}¥z–)+Ï´Óg˜\eô:ÊŹÖ;2{îWuoÄ3eX“:ŸàM•Ïßì(çJ¿àxvAKím¥óYêçÙs°ßÖ×öDy&K'Ͻ•o2ºûÏÓçX‘ºÎçt”çr÷dzN™“Òý HJ|<øþëûOíî0ÿן”^Øýñõ—{øcLjëÝ×w¿?Ðãþ°ûúóƒÙ‡昫9þ»ÓˆnN#voM—Ã9TЈõa¶j8›Ò§‘fß´•×nÖ3ø=˜êª£º™1 & ?ƒ™¢*8[ GÌXK|±O±5ék‹iÓ-¤@b2/¶jÐôx$" ݈RýCsÖéãiÄínÔ«ýiø˜p±~1!ç Þü„ –ZJ£†Ì‡ŒŒl~,Ö»ðˆ²XÛ"¡àÒl¿¬f&ƒçêÙ/E' 5w)¡ŒPo¥x©l…Øyˆ[ŽÜl«Áª·ûÓGOÈÃÄHÐw#ÆÀ±¯»àµÎåÙx±±ZÝî2ú Ú*êÓ¡4‚‚ˆCŸ3…0í”4Ô ‘Io¾XV1"Ê/ã¬ã ŒgÃráA[$êÁ}œot:±V¦—øç#ùLðÆ-|,îART_¦œ&°Ñx'ñ®L È(4f¶§R®N{&ó‘y5-Ücâ ¼‰F’€“$X·Ÿ‘91@Ò„KŠGƹ ƘœÍ¢e§ÞC¸—‘bÕ#…ö>e+ ÿ"¢ %¶•…dÒO˜mØb›±f£Dá€RÄæ÷&l;037!¥„ËŽƒ†‹þqÞtMgè¯m{zpRF¡‘ÀÅ´OG`Š¿'èñ©ÙàˆzO<ƒ¿´&xðG mø=Ï'É•‹ðR@ÑFpTa©Âèô÷Ì7‚£I$8Šy€9LcN]¯Ý@Ó°/A¹éö5’ÌKÄtJD“Œo*ì> `;ÍDZ¢g—²k²Iğ©}œwM}RÎ}BN³k4ÉüÀt±#’bÄü ›¿T>I-ð[<£sU;°bãø©³Æä± Õ–DRHL²qÓµ}Æó­L”i›^÷oQf¹(~iXû´¸C”êH\iÛbÖj‹YŸmNÖÒ0;Ð[åbVß¼fÀ³¾‘=@,UyU¨8óíø5L )àÁ#£[Jd⡚(–ºbKç4"ެȔé\Œc¦ö{'>ªÚûZ½ª«À±id«Š//žÏ*¶ëî#g!Û"¬@Eõ"ëƒ÷íÅ“x¦œ[¶¬vÅ;ŽjÀe¼ú1±"šIw/XÊÚz=°‘¥táØâ„€1RÚÈ&‰–ækæÍÇ”|ÉFƒ#1`ˆex>_þ°&«­$aÝô=§¡`20’¾ƒým‘t~Lnâ”þžå•‘Ä8¦@ ð*DxÍ”Rá5uéßIKãD?!ð‘5½ÄƒŒöܸf°g‹%kUu~%l“H±–DòŒJˆ2vZ•ˆÿ~v@USÌçl8vœ²oJ÷ͱ£LŠ1KLQ,ÄLp2æûTJxÅm Ê¥ 1Ó½Jõ=%t0µøxÕñ‚%<‰VEV àH&GÄŸ³®(ä¾0^ŒY¼OºÔá0Fs#Ú¶ØÑ_ΜË2kCëà3b}ºÍNµS›Xwç<êŒ]^©ª½ë|ð¡¶› »Ûíµw“Ç-IÏæN=Ó¢gŒë™Ûм RÄhŠêꬣ[ó:G0m!Þšúž÷p¶'4¢ºmQïÍHô A(•ïåuê#A›‡|*I5=®>µ›ÑïÇø4…j[K!KDhiŠÍõ2ŸN•~äl[l'âp0®ÕâÎìaYf€JûQJK^ÄWsÚœ+;pFgX™Œ$lVÕœC„TGò›%ùëzJã‚tÙ’k&ë 3±'/RÞNàñEZ˜1ˆzDb¡ôEJÕál˜oÊÁ§9£î3ƒ ¸Ëá7:]ûþ­ºà[[·íº›ØuÛ ¢1 ¤de{Îû‚o5æ ÉÞ¤'6¢á~ :»Ì ;½é®7(}EuW­–ì3<“{k³Óvê•J^iݹý)¤«ÌÞØA2¯E#aéýÞ’†Ÿà3-z¦êëqÎ>òLõ¾m†ï );»%ÙžÐÈ9ŒgÙ!ø=Áù¢ ƒ³iÄQ×'¤n§¨þ¾>AÙM¬yJF×ý—>ÚωÈNÈ76 kŠ9 ÝÄ*àÌë>M>1[%µÍ/¤{]uöŠB¾zœîMÀßf:ï"Ÿ8])Z°@á (Ä® ‹Êí«aâ×&áâ&3‡Ïq.M"ó,›,¤Ú™4o!¬óqV^0|¦f R:,ŠöO¨ªê¡̘? L¨ÄqeØâÙþ2ž­ä‹³ÛÁ“ÁÊ?ÓÇ4f¨öñˆHm Õ!Ït~ö!`=òp2_H6ú§í¥²˜›UÓÑ3óEdRÂ6fÐ$¿Üª)[ä‰=#Y+=ÿ‹™ä”Ý*QÖZ ï,YëåìÌlõ0:Ä…Œ÷‡ ±Hˆ–+ tÖ¼~¥Taà'â™Gø . ìäÍv«û♲¥oSˆmîÐgIš>ëK94ŒÝX<½°fÐ!*…õGÞžÛˆáMpzòâzŒ?‡²X*¹t›ðD«öFÖÜtµbÅÄÄÈW\앵9©š¾Ìw-¯F%D¸®ÎT¤cÅ[R:²j’"ÃÍsr ¦ÊK$W´Ê"ÌÈLˆöÎö 2Z>U©z`ú¶[ŠWyK± ±¶ÔF¼³ö¶ «-íÅ×_ÄÉŸ ótJ¨+.‰S aÍ:Š;˜&å²89­Ÿk뜂×É´¼ÎG(-¥(o3÷°|F‹Âæ½oøÔò-Ð&Q¡ ÖS ÄD«—rCi—J /žšN8Ý¿Bóf´o¾¶ûVªÌKg¨’O+êa.Þ+U@™P÷ƒÕ?a„±öDÑžÆûƒ <‰dÜrª$zó.Ÿ å/8ñvðÊ% N0zF{ ïI*Á¨RaýÞtu-/F ®U¤äRP¬HÅ×Í€Ìq¹ÕÇ@©2 ¥-Ñ“+⸷s'4²‚8ð$°GK9]oǽWEÁ$-¬G¼Â{Íi«Z54V7uJe¤t¹é¿6çÊ|†rÀ7½2w3—.Ü2˜J™vwXH„º3ò7rs3eRìKálx¯R®zS¹×"Ú ×!Éó£nö-’ÈÛü”;ðSÄœ‚ˆFÔZvÆ ‰$Ì£åUïE•˜ón pî Í'zŒ#{¹y$Î#¼êñqeùŽ>k›!ÿ%üî"à6ëõ‡e8¯ë+8¿j·õ>[Òvuµõ«ruµwoN~W£¡¶½%+Ë-¸·â@åÞØž˜•ãg Pypl”í­‡Â› îàˆF´EÞ©6p6üžNUÕ{NA§8ŠgÃ_Š¿®O)xuo=XÄÛ‚W¿×Î ¦)g…॰à)X•<1ÙÃ^Ù,ÐZõŪž™¶¡R’’pAu%ƒOÎ×¾L1Ÿ¹®.GYKNäjh½Š]ì Z¾ « d+k¬†F1oM,•€¼Ô *•n&ù^\”BÅK²0WLá®~gfãäFòö Xz…”‹ðA‹Žn©x9˜ï SºkþQm„úì6WUÚ CF‘CfâœNØ%¹ØQôF–1X5ÙƒQ±5IÐI²ÇwÖÏ}'V¿ µ·¦?“Ø®ªîòÔÔ:{ GˆSéH™2SLI”šb3˜jQé3.j0úýŸ/ýƒ‡ Ídµ2ûJKwºßÑÁM"u+YOu¶Aïõ 9b,K~0(&|"‰«&>CáÙà3álO%}ú‹ºVàŽ?Wçõ½KÃ"^,®ÓBaÇbƒ¹ y‡¥$‰m¡¾'”êN=ƒy€%KV3Øî˜Èw=¡ i°‚ÁϼÔ<›9#˜¶ N) ¸‚˜ Vaà‘‹¡Öx‰;ÅîÙº2û ïçm^?[¿È^4jŸwŸþ )Ûñ endstream endobj 5330 0 obj 4868 endobj 5334 0 obj [297 /XYZ 38.2500000 332.750000 0] endobj 5335 0 obj [297 /XYZ 37.5000000 74 0] endobj 5336 0 obj [297 /XYZ 38.2500000 332.750000 0] endobj 5337 0 obj [297 /XYZ 37.5000000 74 0] endobj 5333 0 obj << /Type /Page /Parent 2 0 R /Contents 5338 0 R /Resources 5340 0 R /Annots 5341 0 R /MediaBox [0 0 595 842] >> endobj 5340 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1409 1409 0 R /F8 8 0 R >> /XObject << >> >> endobj 5341 0 obj [ ] endobj 5338 0 obj << /Length 5339 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯ès€m‹½€ ÀÚÈ!€a99»Ù‹ì"Îò÷£nI==’>JüºHJݲ±žÙá4Y,«Šõ|÷Ç/?þó·ã»_þsü¡ûúáË!;•yÖþ9žÿ~wû]ºïe•øåðíøíðùð¹ù÷Û¡ýÀ—n¾ûßQÿÔü÷óñ¯k~øc÷Kç_øåPª²ùúïË׺TÍwÙõëùçÿ:üåwÇ_Ï3öËuÀ¼ýÿïtU™ª<ƒ1³ô·C¿MuùûÛ¿Þµð[%/‹²´GeMóOmõñ¿ÿ8üÔ,ÐOŸ*k”)un›ïë–Y^Uºù¾4ÝvñRŸWÏ‹ê¨tÝEV¿ü•™^˜¼,‹p“_ ÇŠ2…rÏúÀ+[vHËÇÔv?Ú^§0y]¤¦ äâXéÏ~ª­Råù ïa%—=4´’uRVE7Ó˜\&ÜäÈűÒ®cöÀ·¹ÔªȾ_§q&VÛp“_ ž³‡>ðüzC°ï›éL^f*Üäy{ðoÇì¡ü¢†;ð×éL^ë< 5!vàxvAy]eeP^ßL`rU…SÆZÈCÉkÇìos¥mHífú“›<œ‚ÖBìÀñì¡Ü^Ÿ,!Ø÷Íô&/lnò 䡨÷xöÏ>³`PÚŸ»Ð7Çß=¼ûÔ ³8~ý©ì²`ûåë/‡†:¿;¿³êøõÇãïx¾ÿÃñëÏ{²¦5–¯±päÉ/#æ”Û¢:½ŽT—‘jÉ$pa]·“œª:+ô›é5y¹Œä'£+µð3º‚°’ë8pPÂÏ`ˆS†Xgt”£@20šUUtüa\à}ÁÙlÑÁ– aSê2¢Lì ÖQï‡è‚Ä G»>˜tðñQÂÏ8ÂæXC=D>žÞq£!}ãÙ¢Q>fÁ˜§ˆÞ– øòµ¬dbU „â6IŸ¯cÌ¿ð‰ Ù="ŽËe3AÇe^#uaRi@ºQªŸå.`·C5 ©ÙÁ_F‡1‹7ˆY^xDª‰#]ŸŠì8Rˆ%Qaö°\UÁÒÒš]/´%`çÃg!óš‰%Ò«¾ŒÖoáH$ÚK/Uò³p鿜`ÝÏAß Ú8ÃIeu{¼S|ú“€ª'«¥1x–%†|¢tf;]BŠ![鎩Œ(íwš›’•ÍžËNVWÚm ¥>]À|…#Ñšø \§#È©‘pÄÀ‘O3°ÅÁ|]ßùNÂy0çˆ?ƒÏ¤“åS#¥(­…^„ð–á“cÖ70ÃôƬO›9áB \gÜ¡Výû$=wpœð{ÉûœAî`rØvž¶ÕóÙyg¼fµÿ-é,‹qx§éßÂ:í~7z½UO8/î8aæ!¡hâÊ@ÒŸ°±ϱù*M=nÃB™™Kòr Q&ºÝC—ˆ1Äaty˜è°{Í–çXžÛž ²'­ûÁ‰`/,¶ %§|í`:`W´/R¨›}V—Yeú=@S’Ã0… ³Ð¡±¡AÔy¶ã\”V™ž?ah²rìŽ8N8®ûmj¶:"浺‡‰°‡k;¥ð ‚wØaôÅÆBÑsÄP ›8cÒ‹Íæoê“ߺ“­ª{+qç“RÙ©(ÕÛD ŒÊOYmÞŠdÓŽÆ?a½Ñ;Mn{d,e¼1¶:jÈX4ð)̹"Â21—ƒ+x'È)t›ØvË* ²z=ajfXÅ ¢©Œk5u†7 .Z2ß™ƒâ×-“ø$JëémVŸb¸b­3uJ¿ð03Û î^Ĥ€RÛ{BÓ÷ð׈Á/óXá¼D¨¤#0Ûø0A¿ý`¨ñù@tŒÄ+XÓ¦ƒ,â}.ú`òˆAz¥®ö0ÌP\d6 sê3˜+Fâ<ØþÄØ¹(Ž@H ‡¥-‡cl¶e¬ÆD ˆ\®è<¯1Yl1Uí ® ÔÏÐe$;¯ãž‰âíAýUqè_糘gö­á™`=‰J6ÁôOÀæðY.ƒƒ,^}i¬çß›±X›‚RÔb.B@ǼÅY æ÷s¼ã+½ÌËŽ0²EØ>€_*ø}Å씀Í1Ö_°F( –aX+Ɔ ¦UÃfj57cç—ègb;ì5“óºés#¯3<¯uÆP1 •ø˜_ì’ijá0a\£4R4?…Hƹ„q@Äî2é~ŽvÂÑ-\ô]ô PŽ{ Aò@.Ÿ:y̵aê~ÁuP–š_–ãòÕ DàXHéUWñ%7Ãxò׉æGŒ– ¼<&§³PûÉ ¬L0Q“£)"¤Ä'•nyv$%—s}‘"ÜÑ.Z¤ÀÛXˆŽp†Æ ðõ f$ü›#‚Ÿ Ì ™ËWÙd‚ÓGgÏpXs‡:wÂ}‹Gì|·Øhƒ68<›õ`0…Æ! G,&À#lã»ñpè6Ña¨1p6ìÒf°c°q §wâ“ÃF, 4ÕbÚQ±’lyÕè—ž¦¢Íeß›„¢AEÂ?fDq@ºR¥£‡‡í¾–¬Š\Xó̽ÎUï-è"ñ¦H « ˜€à^ešùl£$± YÓãþŠ[Á+n›¯+ª%Èú:ž1ÆV&wï+µK²/ÒÅãÔ@œ9è ÷©!èéQ’Ø$˜»ˆäÛf£tUÿb™8WÜñŒVC’ñ0Ë˦zK´,•õGÉ&øËöhNðuöR æ)ëËuyö7ò3¹ï)vh`´Tè"¥Ì±Ž¦—ÕÔbÕ½‘}ÂÂJ¤H©h%ÛW܃Õà°£MÙñ0Hß§÷à!V"¯ÕEüUÒ®U\2]¨ K‰Ž ¤Lª‘(›Ž#…bÕ°¢”Eæ­À¦!l{|<êKž*â´Íh½H6Ÿç‰ÄH³¯›€2*χ2Šz7‰¾æv‹HÁÖ¡ Iáðr‘Î:Løñà ”%Q'û¸KVšMövR–Ü5Å„9VÂrƒQ̺xùµ¯Bú¦ÌVËâÀH¢Ô¦+&…§¢nOÌjNŵ»ÅóÔŸ|ž[±ÁlY¼vëÀçˆoçˆ^ûDìÕ9ºÂ55®'‚+,‚ kXRa0ýX˜wB•F˜ªtD­Zdž ŒÈòç«Èü<œ+ªD,ûZÀ‘¹bx¯^iúç™lk÷qõ&Ó›ˆš".a; ¬})mµWfU hÌ!ž‰b¡Žr¥s…)C¶Õ±Åðf=Zž™¬5>0a\PøæFÊåßt@mЖ?C–ZÐ$ïÒ’LÔÉz4¦‘¾9uw‰Ü.ŒÞdLXxŠ+í1Ex0í,wR:(Y_T¤ìu&¾Üqüj|”L)A¦öW¬j&OÞ_¾ÝGæb² ‡©ò ’åܦTPäòðˆX!u±žXˆ¨ÒJÉöÀÑR]Œ,dêG0rMÔtļa(sS£’é²¹GV¥°ëööÒܼ¥,Y‹U@)^Öƒ tá§Q,èUvO_;Y.²åðwžì rtHߟŠè`à xÙÞ”L¿9Qz‹l¦öò39<ÏØ“ˆ b¨¡¿0V×3ÊóŒ÷Ãt ™óp'öXVúZör÷}¯Ú÷-|ñù`NŒ¡&Î÷jŽJÿ¶ïí‡ã‹ºÞ®qà)ì÷q§y’æ™È.‚æ-.žKÜ“=îÍEo{ÜÛ,¯¹+ãb—ýNl“>•쯯™³|9||ݹvÒ›Cð³´oÒ®‰MáL¶üƒWñ2ñ¯¹@®¬ËÂÃÚ«‹zp}-ä¡×»~År¤;…|[›!ãf¢ƒøâ=Ý]ÝNØof‹ôPLIØ…Ò„©'U’‰)6!u´<’€‰môhi¹fý0–ßkøôMÞu5V,ˆL‰›çˆB¨Gúáj|†AËêr°m¹R"ÕQÕÓªx»d]½]²¹‘mTÝ#kËOzŠ×51óúLwï¦>SÃuª^µldÌš‹1à#Ýœ;íD]q2JO Û©Ïàuðl× /h¯“Á3Åëtvµ©‘‚¢ç5C·"U"Ü“ø GËÞ)µKBDKŸbê4y”Þ‡Š’-:Q–‰ôÎaŠ%§Ò8W˜§$kà’)¡;š„ˆ¦¥hIÖ¨øXå„©6Y¯c Ï:ªŸãÏô Ÿ> ðH„Z m½êùó`ŸÞ+ÍbS²dãTÆ$æ0>@Qm*ZGœ\ãaÞJn ôp$R§ö‚­±Á•7À:BNPsI¦‡âs“®]tOÝÊ–4f8é6{ëEz3 c”ñ0D½ Ø’KÇmÖÍ—½%÷¨³:^3^~J[ß±ÅPx]H¹««º×¨îˆ=˜.%jðÙSŲÙgý«sO½ŽçáTlêÓIpAWìœMÅÞ@ºCœÖåì ;¦™„v"mÅ‘JDÌÆ¤RË®ã(½ŒÃ€ñùàÏpÄâD8ShÞˆ¹ñвíMA cqÍéíDÚ"5©"=õEÃ1‚£¹sŒ"@Í1‚ù-Þ¼µŽÆ?8šK-\‚^,þz(òù{©0‡e !a¹i0U@ºÔøÖÂupÙ éÅ`™ŽS1÷&øSúý8¤0–Xæ¬x§˜ áý`¨2g“ØÁt€%‹ƒB0+Æ­<ûÁºjòý8p!`ø„MPÊéø36~­G‚`“å_‘¬„»‰ªb.‘ªía0ô¬p '¬‰ÏÇþ‰-Ë‘ò¯žÇG¿êæ±j¤ÇŠSðˆ"zÇ4]ër¾˜ìjL½SŸÁOÇ4Æ¡ŠZ?*U¬Ø¨ç ŠÝ¤¶z“šQêéîLzó˜£{p¼Úš•1óX¼c$ü“ÑTù[r›Òâ6>?Z7¢ûƒáóɾe_wLJS F4kgã¡>{n“tZ1~…TLAÀ'¥„Ì=5õP:n*Ñ{…7ÔÃrÂ4ð-Ñ:[oôlB&¬HÌÁ¥Ë¶M þèÕÌE{0 E¸ák¬&‹œ^KöBغ[f( ‰î¢8 FÄ G)Y-+˜zð /œÔF¤m3*åtóðH2Lb]ÙlÔÀ-L™´›åÂЧ té9ú“zLÏ_£ð&1›õýrÒ×ß””V˜5™£6¼ØÕmÅä[b$8&…nL>¢9ò2étv`J-—T:g9ñn–-ŒK¬¯Ì k2<=p6¿¬„é§â 7±ú¿s©g¥;SCg¬1—Û([ŽÊã:F ûr—XÅ^™’„i(³)Ê›¸ïˆ®ÍàG.˜C«‡,Š1WE009È6íM}&|оGtÍb¸æþ¤£ˆìflç•é—‡ ®à×q,ŒŠ—=ü1ŠcÛîÙ°uŸ(Ÿ³Vá°{ÇÃ0üU‡`wb/YoÞ+»ÊZnu‘/–!ƒzp¼Ì\W"¿ófüÊ„;ÔáN nP`“eùZë«H)SÈg¤/q¾I¡ÒÙð˜ne{-Ç2qìúÙzô³ͼ¾c)er©X¡­AÀï¿êhº=Þ_„Ro6 OšõOß–DÖ1,C» ©2¤³Êl#(Ò2Z#\Ù„œ§y¦Rq¬×n¨£XYq&kì’ (ÇÉ«*ƯnÐè”ÁXåðã ùû}…V"ý'01§ÌTY©‡ïPB~RN¾äjÞóHlD™,‡¦@¨Ô"}KHÁ៑T!Æ"™Œ×¥ξãÝÁÞXö}2¨r¢å¢lmB‘ŽFL„hêî‡!ehôu¥ ÏÁ–4<‚w-úÌcåeÁ‡E^D^ŒCCû¶Š&[Š”âÌ+’™ c‡ÁÑñKøÍÁÌF³ƒB:_úXUõ7ÂÜÁ‚ŠÚb$j×%ÄRtækñ妯èq3\‡×T„±è²í° „àáêJb$¯ÅjlDŠÍ¯{€ÍbV³Ì‹z¿A›¸Aéãñ¶Y56êí®ªw¸ÈÊýïw8Ø~. ]è¾eæ^o=ëë­ `¾B©ºíC¥¨®J?¢§…ì]Â×ß'ÿÏÌ>H§Öù~¦†Ÿ©àë¹?ÄQ5Øëõ`·CK,~Y‚x<„Àà x>‚+#´Ì_Ù“VË,¦|> v^ lpîbb;Žl˜0ð)gJQb‹ƒ¢?¸E§ñ×Á³9 ˜ÃÎ…=6ß>èd“Ÿç~aŧšL¨W攩ó–ŽzPÌl -Üå„­ªåcz ï~:JЧ¥7[AùˆÖ1s¶·)Ø>u;Ó¼AÒg‡—[…‹ñ;M §þ`kúÄ6ž ~¦3;*¯­ßHu–àÎß7¿e{S¾hÌ& hx˜º˜Hí1…;ŒUÌx1l/è8 €ët/ç©Ï`` Æ”U ®ƒ †7Ʊ¯èBÌ`ðgÞwÐwá®KF0l]¤Õ³€'ˆñ§`Ð q +˜Åýw¶ÌÌ©ã÷Ë.¯ÛÖ7fþY¡öùøùðÎOów endstream endobj 5339 0 obj 5145 endobj 5343 0 obj [298 /XYZ 38.2500000 446 0] endobj 5344 0 obj [298 /XYZ 38.2500000 160.250000 0] endobj 5345 0 obj [298 /XYZ 38.2500000 160.250000 0] endobj 5346 0 obj [298 /XYZ 38.2500000 446 0] endobj 5342 0 obj << /Type /Page /Parent 2 0 R /Contents 5347 0 R /Resources 5349 0 R /Annots 5350 0 R /MediaBox [0 0 595 842] >> endobj 5349 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1409 1409 0 R /F8 8 0 R >> /XObject << >> >> endobj 5350 0 obj [ ] endobj 5347 0 obj << /Length 5348 0 R /Filter /FlateDecode >> stream xœí]KÜÆ¾Ï¯˜sØ>0èaÈ!€ 99rœÀˆ(>äïgfØœÝ%ù5ÙßT7ÉYZ°%/ÅfuuUu½ëÍŸ>ÿýøÏßoÞþÏñ«ÿýýçCqªË¢ýçxùõÝóèæäÿ|¬›òøõ×÷ã·Ã§Ã§ó¿Ú>¿ÿËùOÿ;êãŸÏÿþrüñoçþäÿÒå/üz¨U}þýß×ß]­Î*n¿_~þ¯Ã_ÿpüí²b÷9ÌËÿÿN7ΔÍŒ‰O;tÛT×_¿ýíð¦E@ÜWʺ©UuTÖØ£rVÿûÃÏçtË'g•ª+[÷|¨Ö×/•ç%´;¯tþ·ÿ¡ë/¡å,îl‘nñ+äâXQ¦RáÕO5ÊÔº´—ƒ¾rÙ4úüçÚøîDšÓiå²Îä¶¼üâîÌ ©é¹8VºÇ«'>p§\é‘v^)Á™Ü–O°¸ÑuBjº@.ŽàÕS¸qGš²)Îä¶|‚ÅK•î¾h!ÇJwàxuÁûÚU®NÉÍOË'X¼Ñ.ÝâWÈ“q3^=577爳ž¥Kuüòó²ëÛß¾üz°çÿ¹8Œ:~ùéø}Q(÷Çã—_ª8Uµjêòú÷®OŠúú¤95®¨tY<=Q|¢ÚÕÌÉèFéç«5í;O?xý=YÓz^ŸÑhùâ‡ë“²[ýÙüü~G½í« \¾"€µH–Ø`y}bN¥­.G;çl°á2G‰¡6}ä7håä6Ÿþ0 ð÷ f }à°?@Ø Ô¶=Rwª«R€DE¸ÿU('0§1ˆ´&‘ £ ò“z×§.L™˜õ0ÎÄ a Hà)^üáËùîJsí\¾öòÞa$rïØ¤6«lö[—ívÛɇž;¯p¿8ÛðÉ;ôDÕ艆ïOðcOlü;¾ã¥M ½Ÿ,'|¶A§±Ø§1‚ÏÄâÕ æõ[ø„C`0ÅbJ* loðŒû>Á”¡ÖšxÒ²çÀ5” î'Þ˜ýXŒ7L‰.žª–ß©¿¬¢öƒ¡ÆgºMì`:( I¡0+Æ)‰ý@‰´ü~¸Æ0ò–ë^0ðÞ6.£V¢õä-^@z) F°¾¢¡¬ÁßadÖ²˜Nj2yN˪i"0’Kïd´¾À 3·–X’Êêvð;²Z_.¼ ŸÁw0ÞV/}«¤ØºÂ§EXýÀXdPþã'ùOXðù„¥|¦ï`¼Pà' §Ø~À·#>SÂûðäˆ~ß`߆šÑ…ðNñ;0— Æ72>m,ñ)´Cq Æãqz›Q®×î=m›Ôë˜ñNEut†’˜ï`ËÚÀûñÁ1zZ.-ëiY5+×LjVŒ=„5«I=-˾ª3j¸¹#®îœ †œ½Ø‹îåJîÀ¹"™(ócµ¸5Ž'Ãøn³8sog•@ؼûmd5üDøÔq½Ÿ;"L:Dìg†`Øð!R*)x8{K¤Šèö‰R3V lg†àì,â(ù˜d>À2ÂÃÆdAØnŽ;ã_šñ$"o+@fxK&©(Û»à0œFa$ŽhÒ^º–_ÏåA\ Ce"‚ –[X ‹æ3Æ$_bÍÈ.—©”Qaý}Íz€l^õ~£Î»QU¡«Þ•*c—áÛw°ˆèÉÇ$œcvÀ‚ Ÿ/ÎÇò‹RÌ"ÛÀ×2“·ŒO£ŒWÏD*dù0cF²+tÙŽ"a+ޱᨗÖà¨ðú3’ÇÞÁ1ÝçÅ›‘bm—Cï3ò|µ2;Ÿl‚OråŠQdÊeÊÊž„''§ªB휺sê¼;uőܜ<¬ô ™¢S[‡m<Ñ©ºSIWX‹°”°!Ëø_EcN”‘C¸Ê†ˆÄ.TÂÕ8´»˜çòg¦â7—Ÿð8`ë7PÝ0ø;;X%ç~ë€ï/"“Îå”ÎÅ-òौ8šºwî¾Áå}ƒYT0­»T¶Ýl)Vm¶ìŽ8O±¶KBÌiÞ몺ƒO4.XÁ… Dk é”)¯À¦-QúØŸö÷D¶,s†š9…e6yx¦Ùƒ<Û¸[^—ëØv¹»¥ »Lé^’è˜ÆÛ‰´aOµ–¨”=iÕËpÓèIÛtÌ9˜©~¿SÁ'ø›¯ž3¥ZÍêx\c<3ŽÅÔÅÈæ¶4uŽÆH ç˜c“±·v‘épJ-–¬§ –¼c¸<μÜà[¸ZKOJwf@H çÁ Ÿé»(›#œ ×¾^iLz`3¦2œM¼#›Ù<éŒJIqª/‹0{cja¼ëx5&›†‡ÑfwyüÞþ6Dn„¿Ã”fÅ\Ë„:vÎo>»‚,ñõUyR²r>ÿ2Å|T™Ç« ZN†ª“¦´«ªw×®¹¼!B\1½²r 2¦Ì*e­:ü–«(,KÕIT®HÙE6éDØÜ˜RŒš½AËO éSÅLÝLSÄ€|#ò/’¨ÍyÍÏ‚Èp癦‡þãh",ªœ·ÿaƒ=K)`Øœ"4BÏ[³x_ÙJÏUÛµšÂ¤@Î:‘ñPYXå¸e³5_Îã`ˆ B@éÕ‹7&¥,•,ÐRNG)ëÞuIõge¦ùÌÙÄ*ý±à™"PÙ†¤ÉÖgEô¹‚g¸™ÙLK‡ ½Lk9ÑÓ`:¯1· Íý{¨3cð5â;£'m^Y™¾š)xXvYV 4€¢Â™é}‹wj‚Zø.µeµX…ÎØ'©6·; ¦ñH"\ÞÈK2×֟”™ç„«®Wˆ½Bp_‹K'q"&N·ÄCà0Uà'Dç\¼‰ûøà±WúÇé°L¢,Æ(† vS P9.˜–=S 5#0F ~Æß1p5ê|vÚ ÐŽì8SÜÏI,Z1CF7õ$g0½É·#!U77®wÙåm6žaäÓšu‚uðfST«áÍõaís->G,/!×¾vJšˆI7•zIF#1WÔ_:SÆVâ$Æ1/Ûq,ĵ…xÓ°¾ÉÖ‡^Lý ü¸»õfȤ¥¥UYMòÖòM§ï`î&¨â ÄÒc‡¨Æ\¾ñœ?Ÿô>­ºŽ%¹BŒOU¸$`~Sk‘ŠaW.çƒYÂxI¦ÜdŒ¥+1ãrSž{j2Òü\×\Ž™±¥óÃþLÙ$U¿+8.åmcuïºaª•d&ÏO‚ßfûÀ˜Ñì˜J±àaf÷2›é>]s nOaÄW¸]˜ Ì– Äk6õ#ºV`ç°Â¶¹IŠLS"šÁ+‘æMÑSDÍØâ·q®úsªE(Þ~²âÈ!e]È6”t3%þ…•²­…×äŠÔ…0R8³óæžh~€,$r¤ïH\Éà>¼ b[õ´×)•8!¢š²‡(œR‚câ1*ïRêÿrC ˜†hØmÂ$@,ß÷¶LÊVÃÌã%ºqOfv¤¯Qq%b2“èÈÇL`pPeÉDÂR¼33™[:qúâü'œ¬³\åz·f„š~—.'Áb> f,Ã0-YîÕ$EõX•‰A¬l¹*SkˆýzP齆|ÖX)ײ® Æ`­ë¾˜¦pE©Ò4Ñ“ÛbÕëÖ ›3Ò“–yÚºwm(ÀpSº@"|²‡B$¶%dÉdl±ךʧ+­(ƒ‡Òv5T奼iiäÊàÄŒÊTAg,È1Å]#_öhˆ(¶ ORÊq©¦7¦ ‰ˆ&;’ Â69’mÉ¢â|… LÑSŽCŒ @@PU ¸‡@†¹Q¶XCÑnB€‹5eD‘ ƒ?1#ÏM©o“l¬Tn¥«ÆÎØÝ”D€´9*7¦nûÛ¢§¦©âÔÊž1“CO¼Qžt?º¦>Æ¿Ó9IGÞqè®Ø_hÛ'ÕÉ(ÝS£[­Of Þ>EYû Þ#Øðwðj Þ|-YzƒÊš®èwE`¼¢Ëåˆ6]X>®¿žPå…•­DZa5‘ˆ\3“=VÐ\$W×£ÅÝ*âÙ“­sY V­,lï¢cF9fë,KëÌè¦$ñÎF«ñ£*jÕåÆKÞö¦â!è *‹I\#ÒRd5Õ;Ò_RV}•eßL[<šH^‰hö&ªqX˜ø+\^„¡~ÛÛ “ ÍdÌNZXY`Öݪ ÷v#b‡´&:B#й)ɺ8ßå;­RMcDÖ Îœ ©2Á/ܷ̈ùÚf`^ßò`ðWž ß_ÙXQýIBg],{‡©¦šÁéɃmø¬×,$[%j³øŠ²,˜¦¥8—Çê—¿ÄfMi9ÿ:~;“fr?Mý…Ò¯#ksV¼.ÝuyÔ7ù§ .Øâ§aäöBÑ'}õq ±] Ÿx¡¯OÕ ì¦ tû€¾c¦œÞc°}ô;Eš2.ª·}I=NÕpƒžh°í‡]#ÛPx5øŽ¿äTÔÖŸund îòç3Ää°`ACÓ€†'IÀ8Hì˜l0V!î0•xa=ÂàwüÍ=öƦ`LYM Õç˜À¾ºiƒE 0øwzïyŸóÃæ5’1aOãOAg ~@1”þR½‹g뜼¼ŸÇ¼nÛ?ñ7ßÔ­wütø?’=^ endstream endobj 5348 0 obj 5108 endobj 5352 0 obj [299 /XYZ 38.2500000 148.250000 0] endobj 5353 0 obj [299 /XYZ 38.2500000 148.250000 0] endobj 5351 0 obj << /Type /Page /Parent 2 0 R /Contents 5354 0 R /Resources 5356 0 R /Annots 5357 0 R /MediaBox [0 0 595 842] >> endobj 5356 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 5357 0 obj [ ] endobj 5354 0 obj << /Length 5355 0 R /Filter /FlateDecode >> stream xœí][oã¸~÷¯ðsñˆÝ€¢Àd²)ЇÁèCчb¶ÛbÑ]4݇þýÊ–äÄ’?JütHÑŽ&˜IÆŒ(òðÜoüüÇoßÿó·ýç¯ßþ³ÿÞ}ÿúm—Êðí럛Ÿþ·×û?5Þÿõo͇?v¿tü…_v¥*›ïÿ>}¯KÕü”¿?ÿ×î/¿Ûÿzœ±]·˜ËÿÒuft}\ÆÄ«_wý6Õéë·ï¿î>·ð{K^eE^í•5v¯j«÷ÿýÇî§æýôÙ¡²F™Rç¶ù¹.l™åU¥›ŸKÓýa_^êÓÛ³æÅ͇{UT£—Ÿ¾„¦0yÙq°ÉO+‡Š2…rÏúÀ«²jV vž=đԹ 7ùiåÒ@éN~¨­Råñ”—ð‘ÓTV÷°oþŠèÝô&×UnòÓÊšҭcvÉÃ5uûe½M`ò¼8ùiåâPéϘO«BåáøôÛì!ޤ8ÎlòãÊñi<¹$)—šîdϳ‡~3}¸ÉO+u²pòÐt\u2eCœÈyú“×UH\:®\*ýyãÙIYg¦c£Ú–ò z›>üµ®ÂYOíÊšҮcvÉõF÷‡€rߦÿ¢ ˆ9§•‹C¥?ÜÑìÏ>³à¥´Ÿ—ΫãÁ‡—Ýç'e³†¡û—ŸšÅÞÙ~{i€’ï?Mú8/?îŸeZýaÿòó®>:ï—ØŽ(‹F2GJ4¢álZÑâ4òÃKÖà©Ulˆ|ñ‡ˆ5ñ Rª, D¾Â‘¾§‚Ï@X¼Qü5?¬/ÆFÄŠ†u]P§×¾S‰J[¶º¤-·¢WÚìôÊ*3=е¯TÙ¡(UUæï/?˜Cn‹ãÀ;°uϘƒit1=ï™ Ž´D[ª:;ÃÛl-1åýkFlìic2sfk´r|€Ÿ­†¿:ú®ÃÄce èõ0|1>7 _ ¡åxnPW~p~dp¶ŽàÄkóyœ:FH8=üÌÂc©ýß±¸6ÇNáÚÏà`Ö…Ñ>c021L̓§@¼sОí±Ý êümƒ€4ÝC3Fº÷b¹VC)6d唸™fòóŸUçAÈk=yÀ¤m"Fi· _LçxLK§ŒA0Â*‚ãé)î1± p6,«8{tpX,céˆ6#… u†R@æ‹°®"Æ«fÉ˿¾‚vf†-Pèc°œíŽDòKÈÙñPLf÷Îê]Gh•zˆ‘´_Æ$ÃhÌ„¶ÉçÌ£úñ,}cm-vÓ6Ýȹ$«!†z,Ã/®Ë" x«‹¡xsኈ±7‡§Y9T&>´r¥²r¨]u.†Þ²/þŠƒ)«!áb3¦~Y7Áç(vÃì4¶v ÖÀƒç`%DVH‹ú4ÈÄDj&ÚQÂgÃfbŽ#Ó—ùxe>[Œ«xI“Fo|N¨¿"ƒƒ °b xX— VÔªlm‡o´p|2Œ2Åu,?%>g¸ý$Aî²@ž ý!‚ÛåbÔ*PæWÂyN13†jsF l0Þ__s¨2˜«…áëx†È2ÒðL#&G#BÇ1ÎÄËš°cê*ïA˜ûó‘õX£ÄauKYÛG4 ëFUiÆÅ ìü,+J}ôpÖzhsk…5<°â8§Á]‡–Ï8”GaÂëÿ¦J z!8^¬ ¶Éô¡køô­FìZÁ–¦_#É»\øX0Y`ŽÄòŸ•A+ÓZ-Ü‹ù¥î,*)Æ|Ѩ¤ƒZ'öúÁUß‚#B„ј¡,Ä.&§žQ¨çKcÆÍ¸{Éê(’iqC凬6—+€¡·.ü©t?4gù!Ûg‚ˆúïÁtñ Ž]ì·”Þ±È8“õX§W*E0©É!0ˆÈ,…Sû î)SÍê&‰þ¶ãËO•UX k6øéÖÏŠô°§S΄HØ¢7}ì¢,òÔg`àq`w_Øàav®Œ—M†ý8¶ä­åˆæ&H ;ñfÚ¢CúlI ¼hº†ì×7Q)Qñá:ø˜e‘ôÆ=,뜕uC'Ø€#}¡"Äî¢u*ˆ`ŒµÞÌ÷²p~Ê2“/‹¹fA”ƒÑ}à3ìq.•1QNÑ`Ìj ×ÖB˜ &òúy@e ² OxÁ—§Í4 °àÕebîÅ(Ô¢U5±š>1N‹&|H¹X˜ùH"kÎŽq*w•P±â8GrOaçj “¯q¢#-{*a; bTÕ`k7ªY®Õ‹iòr·-(Éj}¢\Ì"Í#|“Ï5?˜Me!OL@R¾ÿÍQÈ0€Ï`Àtiê¤u ³r^:ä=ìæè…ûVá@ìs`^19¶ÖEùºÉÊ)ÈÛ|äS×ÛtÑ'–ÌãÄ =aQÕ+‘Â%_²ÕC'•†Ê\³7j€W¿z²ÓÁ‚ê#ÚŽ x‰ànÔ²8èST#Z¯¡àçäñÁyµ "° |ŒŽh‡Gðù>°,©ö5y©¢Ð#ŸòÄÂåG Ç2)ˆÉ‘´ÍHËùLŠÊÚÃ}€˜®"Ý+ÃvœÁr'VÙ’HDh¶¼~—Ÿ°í@˜B-ªcj±AËm=Z²õÐŽ Ñ´ åG6°NÍ&š#A‰¾Ž6 L÷Ñ+0}´b¢Éa”3Äc¾S¥'¼C§²}½ö!{4Y­j´Û×·×e=úëïçLÓ”Œ¦;IÅc|¨Ã¼¡ouÁ6-£À㈌0†¶ˆVôðäÍÇ—ÏÃLæÓa¹d´B‘TfÈƸ(kƒ‹SÙÕpëã¹Gµ¬†âÍCc"kå„Îå'Ž6HûŠ…U&DÉ·ìßjq|; ïZ}NÞRQ⦢Ôç¤`YÈO¦ˆøµaůEOX˜´ÄqxY;Æ7ì·ÆÏ`.Z`š¦c^ƒý•D©Þà N4ªf¼’Žó!")—¨8 Š1žh*­øãH½syÇ–€¹ŠyŠ›°lºÃ¤¶ŒŸÁ|ƒ‰[bˆ©ž‘@‘® ùpz@ðØ­n`Ú½2OJGˆÎ¥”7.Ö%‰>Šƒ*ªÂ8x/qMƒJ ÑÁËx]îš)Ç£îÇŨH„˜d®G¾ p¬ÛVIØÛË8ý™ôXQìîÛ¿šmÍ¢÷d.Z¦"Ûæš Ãà@¡èUFT_R"j•€ ˆDLjŒ ÇŽGÓoÜ~@+Àc®W°EG™äí3"Wr}ÀÎŽ±º`@2—Å“¢]ëðáäiÒWvIJ³ãeÞ謨.q-Iï§ÃßOÄŠ˜K““há§³jÉEá±ZbâÈžaâw0G"b¤VÙ’K¿XŠéWŠ^àí€| ­Mu#Sú·¦ÐÚT«¢opOE½‰(¤£ògï`O8Ž™aü…Øc!ç˜ôÅÇ9­jIfi¬| _G–Í`Î)Ã9Y(8ÎŒgà Lj"Iÿ$ruucE/Àå»Ã±XšæØÖ˜/3”WñÒË OƒH§A:Û(#%ÊÀyÍwFgì¤AfIަc‰¼qÆÊÄç¸Q­8Õ2ò Sz,ªõ6lX%ŽUŒ,H«brïüÜ¢›ÐÀH­ð9£F™ËÃjàœrx¡˜Ôº—z {WAÊL*7*F¯.êùZÌ«#yRŽ\MzŽ®Œt ʃíð§PX´²JÏF«”Û¤©X&©ˆ­I …JŒ ½C’ÄÉCµ&1TzH ‘û{…%­*÷P_dKï7Å&úªæõø+›ÓÆô¢%JG¨Ê#ÆÊóh¶K$dz䨦lìo¹èWrÑcYÉTåðü›ð5£½—ÌœÙØ– —~0Ý\FâÚCï¹úA¶ýzL~¡H&èÌ¡.ÔŽÔ6Mæö-|¶Xë%4jƒäã@kQWëvY‚DµFcºôD0®Š|ÛYÌÒl=ÒØâr+–Ê9¨j‹üv^V’#™¸Óqq(q&ƒM£Y€­ì%ÂyÙ§L‘9†¢+"¦Sç™™<¡õ±‡‰¬Ç,€Ïµ^Å&²oðíàkÕøÆjòÁ´ÑvxЈ ”<–ºá³gf“½ð_|îÀâZG"]ø_,Á>ƒ±œi¥ «d)¡œ7Fð¾ ÿ“Áÿ²¾müg"(¸Pk¨Ílø¿ÿ›¯ýkƒèN:xžú…Šê‘e™:zžöÚ^žÐ5÷R»îòнÞ:‘ôA·±’Æã‘®•>£°BƾzDï1SI×ÖöÔí9ß°»Á¾-)ƒ‹UÝÖGì çÜ`Ë•m(<|¦s½(¯­—ohË"ÜñçìÜyGÁÌ }©4< Œ¦†ÈŽÑCÂcIÇö®cð=³óÚ3ƒ1fU2p ÔbûzDi0ƒÁÏ> endobj 5365 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 5366 0 obj [ ] endobj 5363 0 obj << /Length 5364 0 R /Filter /FlateDecode >> stream xœí]IäH¾ç¯È3Òd;oBê‰R«[â€8 4bF4sàïãL/Ueû{ÎøòEØ™eZÐEE;–/Þ¾¼ùã—¿ÿùÛñÍû/ÿ9~ëþ~ÿåÊ–U~üöËáûñûáóásó¿ßí_Þÿ¹ùéG{üSóߟý[óË»tþ¿JS6ÿûòw]šæ§løûüûþò»ã¯çûåºÍ¼üÿ?ØÚ¸æ§f K?ôÇ4—?¿}ûõð¦@Ø*ye‹ægã?šÚÛãÿqø©Y Ÿ>;ÕÞ˜²ðevËB¥=¯ä=[7`÷~²ÐåÎô&ÂäE™Ç›ü²su¨WyöSåq¥Íýù¢Ï—œW•m~.]÷ŸÛÎUÚ²»ð¬Ž¶aúwR»ˆ~Ù¹:Tú dzG¾p—ùþ 63©ƒíÙô&7¥7ùeçêPé.\˜]‘|;k‹@uBÃì1ÀïloòËεÒ_-œ<öSn¦ŽxÛÃì1.Ä1Qé¼óX· '×|ǹ©"Þì0{ à&"Ú\vëfáäš7[=xÊzš>ÂäuDé½Ý¹:Tú»Å³k^n]uòI^ÆOúñ™È~/;×JµprÅ›õ6ëù•‰ ?›>ÂäÎÔñ&¿ì\*ÝÝ ³G–­¼«³ˆjÒ³é#LžÛxtºÝy,5i:ûçYðVÚßcÝwáÃw_o>ß(ê¦8~ý©ÙÜeÍö¯¯ PòãgÛSƒ¢_<þ>ËŒÿÃñëχúTؼßâÒˆ­ÑHfàÈG8òžØA g{ g+à78¿00Uø:Â-ÀÙüƵ{ûøµAÇè˜Ôà>IÉ ˆwð)_„½AìûÆo&é=æ¶_õCüý Í4RÝy3eVöK¶À©ž ÕÞJuªêì²Á§[ÉÐHGaüÉ»ÖQó4âFÓ ')ç¶TÏ…Æ»Ï/#î”û¢*_|ãá7ÌlÌÑóð{€×©à®áyì' àCwìqn6 â1>øéÞ~Y [‡´ˆ¢ ˜34Òc‹÷†¥Hå2Ìó ^‘AIÅc.‚å+‚+b¦“ ÒàXYGÁ±LW¶€# Cù•¹%×!ð¯“+êjÇŠ›°¢ã¦aç;HIážm˜T™rǤÛè Þ5梌¶ ϳLrÅ-˜„¥|ªZ°`³`°<‘=Åæ w¿6Väù:7ÍéJ¿ãüMòT2›PJœ¯{Ûž-Ò­ZûãÛ›ê¢| Þüä‰â…îîZT6¦WÞŸ. š¤3 ´8tŠéÆVð¼·è¤*æ2l—a,6Øeð±Í¨Å+ãú³_q-”¹Û*=üfbÄ·§ð…±Mðß:ž~râ‰-Ì…'²áXÓ²—ªºÂhœà¾ÃÌ«„²#°^h–cÄMÁ Å. v‚A87±`Éå‘!æò3âˆÄã ¯LñLòr, là™`/÷þLV}&¥Uê™þ;_tßd‹.$Š×®>Ìà˜þ”_«½zt‰Õ„Ö ‚áõž;|w‘=’Õ%„d•c˜„šó.\³XmÃ{{wýmZT*m +»$—¢3Wñ†|` žÐÚCÔ¶TQ`Kqå(cª1UÝ´ …×Áâ!̇5Î8£f¨ƒìÜXRÆØéóØÛi-x®ãKÑx†àÇ1Nlšþ†.ü ¦¥TWñôºìjlèšþâ—턉âø(»'#¼Ž"˜–󭪜+¨Ê! Ã’Ê€{bä5Aöš¼+Lñ$ U˜àß’‚Ó —»1Wë°4;¥yyU ÇÀw†‰ÇäfÖv <>ßsQ1\ø§˜Š* åYšn- „y‹‚NO„ ‡Äu2†OUÞHÅ­¦˜hà»fToÔð0;bo«)¢ëÞ‹:DL£qY™¿ÜúŠñBQœLÇ„‘â°XœDø.áÔ~ñt8êGŠ÷ï^ÀŠt)fΘ›ÊG©‚TÄEãð®qÄ^Æ6 Åë#‹FæFÒ•¶rÆÙW‡c© « 4‰öOйéW]½à™;퀃­«Wá¢ô câz‚âÆÖM<¢—²Z\ă„%D.šGëÁcúTÜҌ߅Jãf’1ÖT•l~Km²G«K—J%v°ºxÊŠûÈðÀƒF¨:Óß°*L(ÉLU—õBzýVTÂ4t½¼©º „¼P½tçʼ@WÁ\ŸBÞçˆ.]mlÛéz¤÷“†z×·TôÜ)1yžD”óP¼Îútð>G”©7S©Kò„A\—z3U;_/ˆowCÁž¤@Bª‚Vsùò°üäÔèÊ„–3AçD.¶ Nxº aiB*áG“_0EDˆ¬d|Ö²|ï>š+0'¶&UmÐ%OLÆQL8Sú@)ñô×?­”.Ÿ ÑaŒi `»iLÜqžÝ}±íe劈¡dÚE1fïõ•åx'ÕÈ.¼Ž¿•®¬¾óö¦DmµÝ»<âˆ.Åß²ÁhË/Xˆ¢&Â(~¨Ê«w>Õñ)KFÀ>²ì#Qøv³c7 Ö« Úi!§4P³÷Üæz8§!Ó¢•ì@ñC/ÕŽÄÏ…Ùö˜¦^· Ãø“5£ÄJ‹¾Y,Ñ9— sL×Áßp÷Ö¥ÞÍYñj4›·á°Æ;èLTsÆAµÈ X>«*Gx$˜—u³TTêí_ïϼ)fbÝêÌf™B[ª.¦T厺 ­¹'‹]s°2E§m(}Ãø`„ò*×{N×lŽéÈ)‹åÙtªJ¢.…Âlº¥±U*lu8„ #^[äšL)sùšºG>&t.`¥hÃf°}$ ¼ç#q/ëLÏièz9`Òžt§¼`ÏGÚÂÈžt¯tý~ó‘òj¯ð¸”xÏGº[ê½ç#½>^?©ðC¼\ç›±rÉ?L»Š€õ‰™X9Ee{FÉdÝ!¬³cdÅù,î aa¢gˆ€wLÚ¤jr ¶V?|ctªŠ .û¼~!5Ž$è ¾öc®„E%¢¾,žM0·a…ª Â:XÀb‚nVø SyYPø•†>S":^µžþû¯»—©¾nIÜ,õæ„X@n]R»áÖB’øõ‰Ø·³ '0ä’Èñ ×µ¿áIj,ÑHhR¢šBž¬ÀëU°RÙØ9‘ß0œÄÞ„]㽭ϧ—â'¦ ¿|4†0qmò‡22wܼL'4¿žïsx¹²2ó/—4Ù© ŸH#3#ÝYó“’ ÿFX§†ëT=ƒ)ÇÉe/ŸŒã|ñˆ°Žƒ#Ù fëÐif$ƒÐéœJåÉaní:ÅÉ;KýæÖ»îp~î>%¢#ç&eÝ’«w­UQ!ƒª‰é£®`¿æ˜kw¢¶F€êx—JvÓÍáHÕ …/”;’reä’O{wiEƒSD&™[;æ’ª>ÍN¦A¶­ÈýFSõU1lm ·ÌÆ#Sγð91™Ðø “¦†×õµÝÖ¬AäK?fk&öë×­‹ÜVÝ÷§WÁ¼.Þý}!Û"ê &÷™Ó6A3F„Õ­A—*n- \HJZ%È—ãäÖ䉵/G<1J°ÔUÙÈÄ+W.HˆT)Üïz^Å4êRI S.tWn§èçêõ›©ˆV]½ n§ F—Ø4F€KU¹ö§dtÌdÅò ± ç-3FRixÑ9µÉ܆ªMG’U×Á‰£„t%Ä–2 ž h»DK77Ì àõ&ÑȹÍë7ÎŒ\†0¤ò¾¢[ä.TyEÕÆºQÐñ­cL Θ‰™É’#¦õ(i\*ŠÓ™+®wP—kRV¥Ú¤ÒS†ñâ×GÅd¥b0 dDVܦùxÛWX·8„ß0¡I8} QýíÅò‰› gÚòîC-ôÇ·ûCÜLÿn!‡MÁu¢àuê0´¬a¨Ã–Óö˜ÊÃ뿳ûÑ¥†B;(N„ aç¯*ÎCÏ“ Ó&n§; XXóô=1m‰nTÃ~6L7˜T²nìtcaˆoQR¼ð®Ó¼ôº/²å—Τkí/}é Z†ÓÂ0^cY€(Ñ…Oø¾SFâÁ:Ôó†(ÍŸã÷†à‰ôðóÒ?¸Â!TÍKgÜ)3g§ôÑý7[š4çyne¸rÆ\Üb‚=Ù6øúÙHK­ŠéH—¨aOŤ¸i»ƒ9“ù´Ž[òÐÌííSwRä—ÇáþiKÜl_yrÀ5pÐ5¶ïÏÃàÙà7åßýûfîüs³ã—ªÌœÏ†Y`°ð&0 ¸";F U;Œ%yyÂà:‡oî ŒÁ³ªÑ3jüb„sõI“I&0ø›wÝî')!xï­cøsÄÞ †Ÿîi<"€RçÊ5ûfËÌ:zÿüñâç†i±yf#\djŸŸÿ13GÝ endstream endobj 5364 0 obj 4432 endobj 5368 0 obj [301 /XYZ 38.2500000 709.250000 0] endobj 5369 0 obj [301 /XYZ 38.2500000 107.750000 0] endobj 5370 0 obj [301 /XYZ 38.2500000 709.250000 0] endobj 5371 0 obj [301 /XYZ 38.2500000 107.750000 0] endobj 5367 0 obj << /Type /Page /Parent 2 0 R /Contents 5372 0 R /Resources 5374 0 R /Annots 5375 0 R /MediaBox [0 0 595 842] >> endobj 5374 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1409 1409 0 R /F8 8 0 R >> /XObject << >> >> endobj 5375 0 obj [ ] endobj 5372 0 obj << /Length 5373 0 R /Filter /FlateDecode >> stream xœí]KÛȾëWè`eö‹ 0ä`àrr¼Ù‹ì"“=äï‡Ii†ä×Tªn’#®‘xì6›ÅªêzWõ§?~ûûþŸ¿í?=~ûÏþ{ûûã·]v(\Öü·?þúáí_èòÐþ¼/J·ÿþËîuÿº{Þ=×ÿÿºkøöøçú§ÿíõþOõÿ~Þÿõoõ_þØþ£ã?øeW¨¢þýß§ß«BÕ?eçßÿ¯Ý_~·ÿõ¸c÷º˜÷þAWZ×Õ`L¼úu×}¦:ýúíû¯»O ÂÞâJë¬Þ+kì^UõOÿýÇî§úÝöÙ¡²J¹-²[^TèÓ›Šb¯tUãÆ Þsú%³»Š°y^ÿ!Úæ'È¥‘¢L®¼›KR¶ÔYƒž"€Ÿóî1_Ö¨‰·ùri¤t”…›Jk”)´³G*)ìÊR×?¦ýﶯªl‘ÚçÝ#ÄeZÇ£ö òXÔ†›G¦¶Ë Û Ì1ÒíƒÚÊÄ äÒHi©7”ÚN«î¤¹¡â¿A—í#lnò2Þæ'ÈűÒÑïû(Û˜jú²{ ’؈jº<’àÆ›KeS%_vü<¢Jn EY¸¹$eóNAF¡lSý¶ŠÈ6' ‰²póC™ëº¬*áÏ7}U™©ˆÔ>ïƒ e r¼ÍÇ¢6Ü\òWº3X”€ Ëöò›ç™È7'ÈűÒÑï.HÜ<«LDâ¾Ù>Âæ:‹wnÈc׳»$q­nMO£#Ä-/ÛÇÀLÜ@.ޕޏƒÝŸCvÁ 4B믞?¿ì>}­Ñ™ï_~ª!;½°ùíå—­ÿpŒ¶Ö.ûËûß×ð¨?ì_~Þ©ìª,Üéß5+î´bÎæÇ…ËŠjŸ1£K¥¯{¦„+ú´RÊ*ËõÛ•ìé´âº×¼Yy<­Øƒ5M–ä¼b2¸|®Ð †M}nV®øô,‡›``‰OÇïÉLØþ_P”ý]!hº$€fP€ŸÁ\fÑnR ø „zÀK¶ÃLj`üÕˆY½m¾¸:¹ëm/K[Œ”‡ëñE—2á8Ç YŽH,A<Ç BÕ?ŒÂ'š‘™vâ=O/µöŒ£øœr=͇‘êÁ>Ý Å £)`®•{'¸ß}îçð•ölŒ¬èîVÂWžàÊ´bán¯Àï1UBjé*1µÄb2jÁ/]<µl™˜Zx%µô2©5á@™¹E¶c˜όµŒU¡¬cBÃÞŸ1£›¥º7_’0?¬ÓÙ$¸ ûF"cÆÀPc6 yÞƒ¿ï6`ZìiáÈAÊóf>>ƒ£m­^ ršÄÎd "¦ ¬:¢†HßT.×ü®<Ì“±ƒ¬±°Pö "{8¼EËô<÷ŽÇKV¤áF³Îú¥”K8·Í4ü=ÃÐe*Ûÿú Š‡Ø„3gd´²UO1VŠç" ÀqBá4Ø„'btKÔ£r±IŠÏ‰è÷›ŒÊèDHuˆÀc”¨ ò7×NH,Ú ™’? ‚ZO ÊA0ñ©c_iÃ@‘«jýû» 2ÉjÞ¯×~³eÿ<²mMv fäTqôEëîù㦳éD6}±eH(fô  ,)ƒ0 cúR4$>Dø8°Âm:¾á¬Ç,ߩʾrÄ\#+ÇDó s…ð÷¨ÒÙûq$’‰”‰Ò—žMæ§m€ñà@3¦×ìñ¦xœ1?©€€¨þdp±®Ked~‚VÄtÀø›QK*¥ú>dªØS@|1Î|XŠƒ°7’IšÍ†_… ßZê Ü«jLè¼9ÿ¹~ÿJ•; oGVÚCàºï¨¯Ä3ð™®Tp·²SªM¥Å›ï):á‘UæÊüž¶šô(ŠzÏü=;ªaõâ`ÀÁ ‚ =†cïyBÏx`ÃÏ`*4Íæ$:Æõnê ¾ç¦Ð{Z—$ o•ªn¶Ì¦ Ó2›Vè\±Âo [ eÁ$Ó©!QSö£TN˜°ì$S“ÈXñŒ1-ò©Làë­–z#ÌKøPb&`U¦{S¤ZJ6¾Á$t®'BxSÌ(i¦ûZ& dƒ+™ð&bŒú¨há \ÙÛšÏnhT>ÀÝZÓDúú{k¼Êeo×7Zz³'5>ªmv‡}ÙOR oºw´t]õªÁ›¸w´B+ v_{ºJ‰U¼‚û@=Pcà~ÓEô—…¾;:juk~„õ?†)ž1€a[@r¥»a6ƒvš¨ö é`ŠŒ$êÐS%ß<žS²Ä +Q‘©0Ô "aübœ^ƒÇÇÃ2˜ÍDç€yz‹˜H&Sq/šâgоñ÷¤´¾ªòL¨± góp]ÆÌ¹Ÿ m ¼2?D±›Óœ³ªZÁ9³hÅe6x6ÛÌeØ „öd°Îs¶j¿&º÷â2g;`.)ë«hž ›H{ _dûD‹>e›·–tvKÿa@&‘¡à`ûDó*¨TóõÅÔ”Í}}8SØß½dƒ±çwê=wìê‰Ì’õÍq‘_t3 íÊžzN30øƒ®SíNeç‘ë4Ú±Û¼NczÉ+²†¾,M=PcCšóØÕÆï1jì>RPãQ²ØMÅ”Ãá 5‘®’ k0ãte©-¦Á°1C€ì`~ƒPËž9*”BPnÕ¼±°•Ø€ù‰€:÷m˜swÆ ¡à8Ì5ycs`=ÀÞŸ+ì¯&ê,÷¸„Çt#2C;©Â[¢{„)µ1¥ž©fCÌ5Î…j`MP˜nzúMd•Èx%ü>‘¶v*$ÍhKÙÁ„˜³™z*Ù>›Ù¬šuŽœ‘57dÇz1ã.ˆÛ'©˜a"¥xõîcËo¸%%æÈäBõÝ5"ÁÉ´Îb569,÷Z­ûVÙ€^¾­Í(V›U;H2|19îê;xÒݬèŽ'þèaaJôÄ¡@&‘èfºvÔCÌçÕûƒ4nÆáY¦rRØCûtu–N—å$…RñÈÂomtæœÞ^2®¨d!9˜TÎüw“.„“t~'eøžÜ©•4_g]‡SL‡DsÎf‰ìÈȵkž*XŽÀö3vþî´$c+ïÉêM×9åì¹o]¶8ÌS80»†b,šùK³æ_‘-3°ÐËÓim}ìa~#ж<%F1¸7 8Ï<`d@Æì-X`™¶I‡„2ÓûX'*±s6añºó¬ˆ¶öul ת&b¦Êv­j„Ü«+`5ÓI—Ê­‘èÀñ$=™ Ìúsè0.<ÃÍ™yáq±$;wDvâ03±Ð“üP-gQ+©Šž:[rIÛ†¼.o†q²"FK&šw9`èéÂfÊäl`5Mžªb`udꦷY¶2ÖEÊ8¤;Opšî¢'»†[pü g[fo,J™]sçÙA…½àÙ4;0ö2/WLÄDòK‹þ””M¢Ź”`~MÕèpX5Ñ($\À³ ÁUœË6®æ OIȬ\1!¸ŠRM:Tƒ“)>eÃ,¯²? Vû’ÜÈ]Ò/›P!v¦×Ï•%Jßc«ã* D÷†. cO´õÑã[3è¢ )™Hm@|f™c¶Œî©Â­ëv[³4ö=ÕÇ,i¢8»¨‡–Ï{Êpp©ëTaýØ—B+Ôà¹AL¹ƒì8Xì%0a¢¨Áâ < Ó”Á(äìC1³­˜Ìž.ì‘ÉNÊ‚§ÑƒÌñDÀh šy¹ŠšyÎæLbœ§ÅóCÍœSx™Ò,ÆÀ»1¢ÜŸ“ÒZ8ooÖ‚ÏZÀ+›µ°kižM5çг£Á{Å#혦„µ€ã·”.˜ßöH”’•k œˆaWY×cl˜â¢´Ò PΩ²óFƒ ²Æø–MÉV¶ 6ÙêXÑɪ¸Ãžª‰Öa‚¸Ž+n¡Ãf\ìü<¢œŠˆÌ©3ÝãÎTµ¹”1…é‹]aÙ¡¤Ì¼ŠåÍ@÷Ì2’€™·V8ÄäÁ¢Av¾HtƒèŠYt`'`¬=cÌ>‹{þèÃ2î¯èš(·®o'1Ä ¸‰âz5¼",âvÊŒ ¿ÃÔ߉ ¦ÇÓäÈÚ#wì1œ‚¡ÖàªÜ]§ š$ð§«óÅn t#uÔ}7q§O2t÷H$YûZ¶©8‘¼¶ n©ÿæ™Ù h’e»D¯ò`ôz;ImR®˜èð5ѶWO‚9U÷&óEœÐpã1¬Æû‰’~®òv¡A¬r¯ªÑæaÎäÅûWÖfDS#= ÕÈJûiî û…Õíu,aÏ< gðJ›3Û­ìôU?_Ò^ ªÔ Ï„Wð{º ”:¸þn­d;íà â`€L{¦‘ùÁœXò*Ø<ïIU{m³ó˜(£N"a‘ ׉&þ>~ü_v7†(7®µa‚mqʶ¦¼-ì¶ŠZ_×)7a àÝ7sqªíõÌÄÜ,`Æb¾›!êTÕ×^‰ Z˜ØÐ60|,üÆDTx¾6®)OÔ(’̤ŠX'ï§õ½ÝûzóØ8ëÊ÷ äÂ4‰©¬Ì¼VGŒy‰%ºKßsçùžÏ )\ÓßÜ÷4z¸‘ó̶\Õ¿ö¯5R¼8{žúW(ýr ¡¦VI™:*нîÆi¶ZLØ6˜+F|ÃÍú ›ˆÄ€›óáJÛË¢ù ,£ |ü‚Þc¦25c°}m¿ÙXEØ H¶‹^ >°eÜ‘‰%ôÈg(¼|¦•Ý*èÓßÌ$dîøs qùÔ:Ð$Ä, !%0 ˜ 2;fŒUˆ;Ì%­h9à{ÚÜÍØ3˜ƒ1g•½càa¨þ‰ñ|WW >ØÄ`ƒŸùÜB?¨+Ç+¶¶tpLX@ bü)h©ãŠ¡Ôh•ÐMg¶ÈÌ¡•÷o/>nX«7và¤R{Þ?ïþ¢¦Ã endstream endobj 5373 0 obj 4425 endobj 5376 0 obj << /Type /Page /Parent 2 0 R /Contents 5377 0 R /Resources 5379 0 R /Annots 5380 0 R /MediaBox [0 0 595 842] >> endobj 5379 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R >> /XObject << >> >> endobj 5380 0 obj [ ] endobj 5377 0 obj << /Length 5378 0 R /Filter /FlateDecode >> stream xœí]K¯Ü¶Þϯ˜u€ŒÅ‡H ( ø•]0l ‹¢‹ÂiMP7‹þýJ3ÝÅ’Ž)®bÄ÷z¤áó¼¿ÃÃ7úüó¿~?¿yÿù?ç¯íÏ÷ŸOÅÅ–Åí¿sóçûǤ»´¿Ÿ­+Ï_=};;}:}ªÿþvº}áóû¿Ô¿ýï,Ï®ÿÿåü·¿×þؾԼðëÉ [ÿü÷õgeEý[Ñýl>ÿùô×ïο5-Þ»kÓÿ÷÷²RRËf#];ݧ)®~ÿúÛéÍmæõR:£> ­ê¿ªúÓÿþóôSÝÁ½ùâRi!¬Ñ¶XÒ‘•מdy²*ΪþÅïèú‡§y‘ q««t_Gξ*Boýâ´ÊÊR7Ýlr霬·ªýoÙ¼\!ÚE³)–í¥ù7ü›¬ñëÈÙWå¾á¸õÄn ©ÚE«[b_¶‡æ4.Êtâã6röUi7<Òzê —ÒÜ­J Ñ_ZO±%J鿎œ{QîÛ gTÖ¶ªŠ”¬üÒ<ãNH™nk¯#OÆÊ¸õĬì„Õí¢Õÿ'Ø“®ù+“N1ÜFξ*í†[ÿ4§<”Û'Àƒøùâ»/§7?]Ôö®9ù©ܵÏÛ/õ¢”ç﫲rç/?žÿPBÿñüå—Su1²¼qô‰EOŠw艄O”­ýG¿ƒG]¼‡O|ò‘К„3…­EF]­>êÛ>~©‰;5]–µ>6;^JÂë+ñÊëŒ+¢ÌNUoçsjñ@qN•xÔ°Ÿ½Iü ù1ò¸nÉó¤k ¹6ÛZø´ |g}}†û­áÕyRíˆûc£Pˆ‚œù·Œzª,=5ÅvÀûèàwð‚äzεÆó)áØð.2:J£Xó¯?ŸW£?Hû³þ|ö¨Û¬~uº"o#óÁö 0õaŠ…tìû‡æß6%R4Ö8W¥‰²[¹Qæé-—ǰþžæ”iFÈC¦íV¦IÑ;dÚèíiIdš‡LÛ¯Lƒq”C¦mÞ™–D¦•ã+òzhlw2`§<3Ê3îÈ—›ÒÚÞhŒ³ ¬(¦H?p 6arzrâC¶°£ãÙtÀ¼ µý!v(ÖGœ·.¤é÷šÔ–AƒÑÅm0Nô7N”—¢RÍ¡jŸ±ÜÅUÅu¤þ&„žXøä¶¥ú¢Õíè¶oª q)µqõCŸ@Ê‹’NôZpBÍ‚çÓ’Nà‰Vh>x¦Ey}¢î}x¢ç·Y7g WTÞÔ‚ó%¡›0’V`„æg<ììX ¿8sQÌo>Bo½Ž)ÄÕJF7 ôÇ|‚Ê©{š‹œê˜7ñú9‘€"v¦ mîœÊxhÅ•j%aƒø ¤%iÖƒg+9)ÉÊ%”DplH‡A²'‰ŒrFž•¯D’•ÇiÔINYÖª%”F°|€ò®ýNž9È*÷~§!äY+íF÷[á°~†ýŽ»¶^ßüòn{úÜgÙb“: ‘Öžö–póØ÷šn†GÁ.¯KLp!#Ž<Þ'ìHQ<‚#Ù‚{Kšé»é.*ž öqÇ„xD„0  ¼x¹|fÄŽ5)CÙ[Bð$²\Óã–#<ÁMG‹âb¬è ×+ÞÂÖÞA%À¸ ÕZÓ}_¯E¤/¦4ÂFàmU˜?°h hVмÄÈÁ™惟 #xxHžÂ²JRæmÙ›"}&ñib‡BbÒ¦%™‚#°Qòpl˜_)†!í Œ”M¦èZÈ-‘ÅgeŽQù“PµVÆøªÕ÷›"ò ìËóWß]kkJû’ ¯¶6œº÷<…æ :б¤Ð|b¸Ž¢U(òl0ÀÓ ˆò â¬$a5æäÑÙ¢4ý‘Îf"*„ ¢½AP£yOyvØÞ+EêaŒ=É3Òª«AÈÊŠT4Ãð¦E¸º7*Ý[Î?å¼ù–³NIpõ–³AwÆ?O[wà áÅ7«3„º'>¬Ÿ5ÚD˜Óx¯ˆlýÈwĶÇNæ G8S´iè BæÀ’rfCOXCæ$zØ2œ"B5 j ¡ù¬X/@ᬵrZ­Xbü„Q¦,$KæôXÔ+%)z“õÀPgÀæyƒŒ3P»È()3”ð-üÀ»q¼€%8?=¯ƒeA#K@Љ$ Sk. À( uË{Âe€áðé32÷°œ ¤¬ÚlOÈŸõµØÎr(ÈX$­ó!AU$ÆÌ"vÎhJ›³3'í2“kG ]L­®™‘mIAßñ*Q֜׸eõ2(æÆpñYybE‡ „ 1‰ðÉ¢ƒK÷áßn&{$áÞ5Mö7ï¹òRòm¶²¼ŸnRô'œ?‹@Hüƒ}Ò9·ç— iºÆOðžâSX¼×Æ`ó6Ç%Å6“Àæm@ÊÒÞÏ‚nR–•Ý)2ö±‡ŒM!c×MèqZUÙåÈ@ÏZ¥@J¹Î"±‚$ÈÇ)/R!¹Ý÷Ië·³`:…˜‹öQ8í8½¶úéµIød’3f9N¦KOWE¨ÓÓ:˜k;l™Œø4¥¾ Àj,EÌBú©‹„tf”óÖƒ”°ˆ Žb«pÿg ‚”˜‰Ó‰ñ¼xÓ+»~¡ÁVAyÌÈï®^hýŠÀVEЇH…3âMàõ˜ 2™ÉÌIÛiÂjAEË HïÎìŸa SåsÕÞ øŸ$i?ݰ%9:X”³$õòúü%,Îva-s$7¥7!œ§g(8Lâ$eźy‡¼<äå!/ÇZû€¬Àî¾åcÄO^1Ëm&9Œ+ýqzº=)Ïºå½æ©+QˆÊ׎;©ñºZY¶Í(Iš‹“)kt|'¢î°.òéç&qú8šî.)Ò%˜—Agig9jÈ{$œpdŸ÷pÛ‚8dJ…\Ÿô6|(˜÷Ê·l'}3ù;)z²“*öÌ‘3¼Ä3ÒY¦Çd9;G:†YÒO¦KAvg£b;Ç>¦T¾VÊž Gc¥?¼<%ܺ\h¬Ö]5\S‹•Æ#ôJ©±K‰Èð^°0#i‘Õ×!ùTþ©AR¡¬’°ÿÏR„™r‘UDìr‚g@9g=çÌ~®Êc¼xz¦ŒDJb ΰŒä^fººbÔìL©LJëiRz'%m‰`G\ÓĦ6\“t©@.VÍMS¤;ÉûçMž@›‘ªÌ ¹²ËQB”¥ãH#ëçú¿¿“ FþóU¥}UËÁ©íMµ5348)L©â )¥˜u>„™™RÔ—bePBl„²‹£õRÝ,È\¸ŠÕ>Ï#yVTÂ;)4Åw©ÑXèÍÈñ©q\ìËœAš)B0zî-i!.ãoA¤Í1ÇBè!!” ”Ø]À‡Åk0 ÿ®Ë3n¾x)Ã[1bFþ2Vn˜ÔóFþB”@ JÏ(}¸´©Óý(·®ÌHË"ù$i‹óÎ7Áƒ íŽ?pñ ñxÐyÐ xÐxÐtñyðú–êµ¢û¸ó )BêO„ݼåz­¸~Ûš;!ܬ ¡ï”0e»÷æ´|’¡iK¸ç-!d3°ÔXç ×&öVHŽ!%ƒbÚ‘*Z˜ ÀgCºª/«"$+éË«ú“LlÞR½VÔcLt.$õû¨?ÈÄæ-×kÅõûÈ «rœxÆS—ð!{J!¥¸?ëí?O-ë—3RU¸#UE`¤JÈ›O|Fº¾¥z­¨Ç>îŒT6ÀHõý>êO|Fº¾åz­¸~é©z\WQâø”˜åº4 *0])xåú^ò-‹Œç¼´ªá¶ËV# ¯-nk‹òRTª?5HqmÁ!/1‘9)«¼É'ƒ*ƒY\™Ã fËä®Üñ·ç¹ô)!ž—->¹VùYŠ*¤$l“’úé1“ÄÛhœñÔɬP¾k,r ™¬ä÷@‘™äH‘I•v·…–þôpä —Îgƒ‘ˆçí‰G¶uЦÏ^<¢aã gº’” N`‹QH=2FÞ;̶r1iä¯ «°I‰L8݆ruúMs¥¹‡5Q‹'¹+i™V“ߪ׸Bªþ®1•°§¨øÖ¶™W_À'¸T>®Z‹Yã±íœµm*xŠÕr|OàÒÊ.]ÀF)¦åõé?²Ã°°gäöZÊØµ†\«àþhHÿ‘'øFì*#ý‘†þW÷Û1UD¤Õ†éRAÄû£±c ŸDmxKtd· Å}%–xçp-p¼„%õCÙÂØ"úËu¬ ð…BØâÁý`-é€bUìnÝp?I놟äÔFn‚…Œ÷‘@cxï±Äô÷þ9m¡¬{_Ý&*SE'Ê{=sEJÊ%εðî¹ê-¬^9í¨êTÌŠ©ªë<lE&7‰êc %Îù!ž·7_Fb‹˜âÂム'P’4 (I"©%u9ÒL”$±Ç‘“’t¹„’ð•B¬”D‘}%ÁçÑiô‚•_?"ˆù$ƒÈIÙ®+º39$KøÇ*( öƒc÷9wXr áÈŽ`½š„ªQžGI8VGÀ»ðŠF¾Cˆ0òÆ8)º2r =AráØ%šEYkJDoËüÙ9¼?„HhÁÛ UåÃÜ›]‚))«ÖÒ{õ^‡]2W]Y¦H J<”#:½^- J ~Ô˜ÛíL‘û‚£ Ú×b¸^–N°%Nl,a}˜†À­Áï´ÊQÌšúC•àšßëßGþZ ø¦Hî&öè. Z;¼ªpí0•´Fc€ "#€ý´ÖVè;x 0cÊrDÊç˜È¼î·Ž QXÀàï¼kGß–z™ò­µŠCÂî ^?­Gü$²ÄPj´ÊnÏÚB]Zyÿȼ˜Ý°,n¿Ój¾1­wþtú?ãvA endstream endobj 5378 0 obj 5669 endobj 5382 0 obj [303 /XYZ 38.2500000 170 0] endobj 5383 0 obj [303 /XYZ 38.2500000 569 0] endobj 5384 0 obj [303 /XYZ 38.2500000 170 0] endobj 5385 0 obj [303 /XYZ 38.2500000 569 0] endobj 5386 0 obj << /Type /Annot /Subtype /Link /Rect [128.250000 65.7500000 184.500000 72.5000000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_ownership >> endobj 5381 0 obj << /Type /Page /Parent 2 0 R /Contents 5387 0 R /Resources 5389 0 R /Annots 5390 0 R /MediaBox [0 0 595 842] >> endobj 5389 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 5390 0 obj [ 5386 0 R ] endobj 5387 0 obj << /Length 5388 0 R /Filter /FlateDecode >> stream xœí]]¯Ü¶}ß_±Ï²EQ$¢€¯cèCÃúPô¡pšAÔÍCÿ~µ«¯HJ:¢¨Ý½› µsyE ‡‡3‡ÃêÍŸ?ýóøïßoÞ}úÏñK÷ç»O‡â¤UÑþs<ÿûÝõJsêþ~ÔF¿üzøzüzøxøØüÿ×CûÀ§wmþö¿cyüKó¿ŸÿGóú_:ÿ¯-tóç/—?­ÍߊáÏóÏ:üíÇßÎ=ö¯ë„ÿ÷w¥­J!ÏbL¼ú롦¸üûû—ßoZ,{‹2¦*루duÍÏÿý×áÇæ}÷ÅÉVBèºÒÅšérxSi›ž¤ô^tù7Q÷t®”Ù®ó‹äɵ"d-â½'œ\{îÿ¢ Yn0¹ßºß@ÿ¶Rj»Î/’'×J7¹‘ÞSN®*t« ²4¨hè~ ýë³iÛªó‹äɵÒO.îýd*)¤.Uužèó$7 ½lþ®e÷ÏJ¥™Î––…ÝbNÌv¦ÚZ»á„_$O®•~ÂqïéV³-o¿¾î~ƒÎK½™©î$ßÈÇzO9¹².[ŸÌ­×ÐÐû꯶ÎEòÔJé§Öíüã’N°$íOÀ.àkäÁ—χ7DÕØQ?ÿØÈvygûÇçF%êøÝ™*{üüÃñEQÚ??ÿ|°§ºT½ˆmKñ¶¼‡-fy‹¨P‹| {{-ßù|¤¢F-%”:2žVê÷Ÿ˜l>ÃÚLʃ[ E´è ZòèÊêºx ¥%l‘q J#R¿[ÞRÀõˆ%(JØ‚-|&ò¸î™‘Jl+ ÔÛ><¼á{$|&bË!Þ"Rã‘X;Im £7æÆkE/R®`‰ØV1žNB‘¯F†`;yORŽ’k¶#^³1,Ûû|ÞU[iï*ñlá¹Ç+ã?­§ÄHzzÊ|ž’°OwÊæ Ô˜-<}utÍ=}5e-ïs~îØ»JÕÏ0´ëÝJO ¦*Za¬ãd„8©ª6Z] ÓKYÉËyüŒ–ŽÌU§®áª¥ls2¶¸ŒûÛ”JÔÒM\¨¥8u’¥ãÞð3ÕrÙð{ºEbf ="î?ƒßÓ®4!ûîfH€•ÏLK·nIMM Ö‚²°…Ñ5Ö1§½ÁgJõÖê@ö+úªEç™SŒÄ®!ðü`àÙŽè@ºKC«ƒ¿Øµ%â{øb¼Ž !ï˜K@Øò=óì݆¾J ã:+Ù]¬-‘{‰H€Á2ßUD5 {V¼ 1Œ¶ d¬°×ý‚_%ü…fJñÄá [poå;d˜õ$¯Œ¥ÆxS‰ñG°ÎÈ´<ÝÚFn k¶ª uKº€#úËïßl-ÿe²"¯ÇbG´“K×ÏíúSGm’°"çžÈ®‹õ×E¦–‘ÌÇÀC¥Ð¯VWAÂ9‰`Âwµ9gùמÌŽ¿öÿ]'cŠc]ŸÿÐBt?-µŠ^ºŸ|9ÔÕI[#†ß’£^äõ;šßïþÛœ;:O í¾£ùIóÌX’óo™Q/füŽŸ/Ø.pjÚXe3¥=8˜>NÇAsÜ2%A”H%U%•‡’*€’j@I5B‰tP"ƒ(‘Jd%r@‰¡DæEIµ %ðȃ92Ìå ¤¢¤öPRPR(©G(QJT%ÊC‰  D (Q#”¨¼(©W¡ÜDÒ[ðñq”h%&ˆã¡ÄPb”˜J´ƒD‰öP¢(ÑJô%:/JÌ”DŽ(q>rÍ€;F‰.B(Ñ…‹’óO\”\~KŽz‘×ïPbƒ(±Jl%v@‰¡ÄfE‰.Ö [ŒHÒ Ÿ´%Úa¯:È^µÇ^u€½ê½ê{Õ{ÕAöª=öªìUìUØ«ÎË^õ:öŠ‹$0~öd¯Úa¯:È^µÇ^u€½ê½ê{Õ{ÕAöª=öªìUìUØ«ÎË^õ*öI'ÇI1¸hhOÆ¢^«ƒ¼V{¼Vx­x­ñZíðZäµÚãµ:ÀkõÀkõˆ×ê¼¼V¯ãµ85óÚ=w?Úáµ:ÈkµÇku€×ê×ê¯Õ¯ÕA^«=^«¼V¼Vx­ÎËkõ*^›¶h…²Y8é8æ–l‚,Ùx,ÙX²X²±dí°ddÉÚcÉ:À’õÀ’õˆ%ë¼,Ù¬bÉ8ETáDÝí±`.l‚\Øx\ظ°¸°qaãpaäÂÆãÂ&À…ÍÀ…͈ ›¼\ج㘱ìiŒÃxMññšã5ã5#ÆkÆk‚Œ×xŒ×¯¯1^“—ñšuñZ¦(#öj‚ìÕxìÕØ«Ø«±Wã°Wd¯Æc¯&À^ÍÀ^͈½š¼ìÕ¬c¯ öŒ·‡½š {5{5öjöjFìÕ8ìÕÙ«ñØ« °W3°W3b¯&/{5«Øëƒ–Ä'@£Ãkm×Z×Ú¯µ¯µ#^k^k‚¼Öx¼Öx­x­ñZ“—×ÚU¼öAËN×£Ñ:ÌÚ™µõ˜µ 0k;0k;bÖÖaÖ6Ȭ­Ç¬m€YÛYÛ³¶y™µ]Ǭ1²pü‡( Æ¥þT òÛo˜[§_¤\¡kG»‘l®™¥i맘jœKÅäŒâ´8¯i!%`¬ü‹;ýÄ [¸ñ è67 äØsÇB¿¥qÌà3ö›°8¿¬\'“Ð o)xå îGGaKU.§RKv¹îc\…§?¦äÙÓ 5„@ðeIuÇ þ¥îÆz µÃ\õ¡( î0bŽmrùø<žu–{GjË/4bàÛ\ßÅlÆ'Mü–'Æ…r4–vÏq xf°aNz£³k‰¸-âÒ2êžLûMêÂPì½V @Æb&9rï.‹Å©Öb<ë-êTX9žAèÜ»Œ(û&—D$°æ(lÈ”—3Q[”büÊfhm¬Õch–nI©SéhÅâ™·è,[§öPoí’òÔΔÇÝBÏ”P¨Ü‚e+ v$– …^}’¢t`{ëŒîÙH9 ŒŒGB©_`oð=Xe·”ª>º?C¬ƒn /’ êðV÷&á–æ'ÙÍïqîd‹oð«‘5Jë9ÓÞy™ëҽȹ)sÅèmÿDºz÷Û#`¼‚9Ç4,‰"s­£LÌfë³BæÒUæN?fLoÞΜ‰Ë¤8ù¦L óØòÞöB;®/In_ÄÌ3ïfM²®2EèR脺˜œá#LêŽÎ`©3e…EFŠ#KI¾>]c6s‘δ_q™”‰ÌÓâÊçœX¥9£KšùÇ„v7ÁŦáàBº®~¦…ùŽGÚÔ7Ÿ“ìîfßA¬­ˆô„f¨ð’™´!kÆ2IM¹òà’† ¨kŠ ¶ý¿4ÉX3Ï´é½Å=U¥­P»iîÈ 'N”0ÆÁSÄ}$­YM© YD1¹Òg1YÁ`’â[7Pæ–4§ã`Fš"§˜ú6ÃVn8Tä|K˜-å#Ë•ºÍóuüc·™+7’fš”‹PïIû‰4¦Ø?m‚ðƒT’>¼×ß;ä‚çkÿÄ‚%׺¤=™Oz¶¶öl²Zxû¼²Ÿ!Xl)rÿ0Ÿäí¿>æ‹Ó6Ó~2©Çxư§ ê¶µZµ««®ÇP^vm2¾hÞá‹ +Ô"áÕ›‘Cüáü±â"ØJÏKÆ.=Œ›(­Äœ¢®ßÇ—IVùtUÕäÜEZðg» J™R×C©#sñ‚g˜(–ø›Xjl­rIm3â²”“£K‹$¬ßˆŸÈ¹R«rÅJ½O"á{ÍòàgJìAð3PoŒå¹S]ã+réšX§óÌþþŒàYX;wêñ{0£ä™ô²g’….fø©ZLÊózüTÚ€1—È<š®ñxþÔtÒøh6:‚Qìù÷Ï«ñÔüì?žGômf[~ÚÛØxðŽï 0úˆ¸[D6ø¼/xzþÛF"ãù³Æ¹¬Ýë™ÇG³ê¹c¸i¼åÚ1ì?§9mšfR#¯cfÓJÑ{Ú´ÀÛÓ¦mbÓ¤~ڴǵi0Žò´i·€·§MÛĦ©zR#¯cgÓžö\3“kÆ>óåæôöhK{fÁhˆy‘“|g~DNOÎó¡j¨ÜxEÖ¯MèíŸÖá­Ãþ'ηnd9~ë¦\f¢È¬2}@ƒùž-sŸs}È=Þºùý«7pänW¨dº{Ò¯Èf.ú)óÙU $é~™©_ŠxÈp^Oœ!g%œRk² n™WEd)ÙFDŒeÜf5I?ÉH–“gE¹^sÞÌ´P³ÅÄýˆš´[^3‘‘»‚+°T°£ÊVAíTøô!cLRÙ5g“‰ñŸ´â:âM°ÏÀ,[R\2ùçd9÷É"ÞWàb¥ÞÃÌ![‰eÃÜ™‰çá¸!>7¾ Ó9À+Òh¦Øémä:×bÍy3å§î3’šÖåœa©VÌVÎXl­ÖœãFÎV0Fp ¶6¯'[¯ºgíÍ ð9œÅì7o=¢PëU縯ÆSEVà}ò±L —±vi«´seî`»AY”ûDU&–Ÿ U¯k×bWÝ»•‘Ój!ÆoÝTsùz¸f3m~õ 4æ+Åø.d…ž‰|++ãQ°vÒ$1¤-íµY÷Iƒ#„;T& g®3Šy$Í $1‡ýO$5sŸôÚл‚œHRz ’ˆ´Tê*?ÂöáÿÉ•‘Góº^¡ùýó"W€b‹›iÓž¶%²µ`ŽÚwŸ¹ÈH±]f¶qDàâ>St¨#&zT&EImS¢tæ¨U‚5Š1Ê%`©‰pKbTåµHy¼«í¼…R)T ?…ïÁ Y9™«ýAáëáOÔaÜÿ¹ñ¿9óMÌH™O¡0ž;“ÎÅ^˜Õø ‰y,¾”Ó’â•™Qq ª?´x=^Ka[þôZ1oòôZ7`åôÞr„åé‹ÇôŽZLKº«wŒLÛóI]ÿÊÖe‰âTk1:d¾ÁòH3ñ Uÿ#±ó?i¼ùyä“óXi àñ×\™o(§½lÊ6\F"»‡f´ä©‘´P‰Ì7Ðwÿxø‚g÷—'¶ŒÐúà<S¸{W’îûÜËó¶à'ó¶ÈS)¡\W…§ C>®"ë†0µüâkB«Qi Só•Âøâ¶“È:a5–¯Thñ|u1ŸXÇ"l<¦]JÍ¢¢/1E¹2 #¿Ö˜Øá{Ýw©§,1-¹VÚn·Iù¦#†!7 ,=Ñýó°¹×…ÐŽÛô†AMÒ»Î"™À’@gR+’Í{ñyÒÛk‡YÄx7 IEd<ž{Á&ˆ ¶²O¾ÕµràœÖpf±©®ÔÃ*Æô“XG¥½a ùQœd©/SA´JM¯1fƒ‚x]R¸ZàKsÑ–mC0|¶Vž°‚–ÄX2-ÚÈmA”gwUu‡ùÂżJ1@lïñÅ"%& âYx€¸… ±%µgE2èšoñ‹™Èn¶ø&¡”ˆlDÈÀç@ئãÕ¹ ¨ÍìZsEÐçù|zFH~sÇWKí8¾ÈÆn<S¬/ÂâIk§†-Q—7? áI‰(sÕ5~&rÈIlQ“‚(>ýPT8ä`+¤ó$„ucw‘c)íÅíI=Þ¬1Ýñà†íAŒ“„H°Y¥f}ÇQ!„uãa¥¶I)¨´IÉî#1Çó=þ\•u;SF_)ŠS‰ôthéÌ…:•nøR| žy‹ž‰ôfQoRõ.»Í»ê ާ[Š!ÙZ£}>]°r¼9†-X¶îšZQ÷¨™ñžê ËUEþöÌ ê­‹úZº a@j,A·’Bme«OòðYÚ‰<Çé­•MŸ¤·@áx¡ƒÎ„Zðú!pÝ™þv"½ág0B ÞÊdWüM„¯E9”xÀM ãF6&kLÂÛ Q;â™È¡‘Ö²došöý†CEi™eD; bFÌŽzAšcÒ-6“9½„cUãü4p¤·ý¹Á‚È®Le¦§Ê KýíúšÝ¿^ùâsUñŠÛ¾7·™-»æþï[žaê~^X6)ÏÂ7œ2e`Ìuj̭ڻϳ2"…œXjquÓ[þ¼Qkj×ÅbãÎ¨Ž YŒ%M—‡2µ®† 8,‰cÌ-“4æ×ï¾®ŸÝ;×Zfçï°è²è®W•­ªö'³–£˜¿ËZ;ë±j$ªS)fS&<›ÄýX·Èˆ;M¨MVŠ| X¬z #áÃ茆 š^›k-F?øåð)b÷7rÂE赓jþ=~m:¾ûãÔ/Ì΄d“±-ÄÙmËþ¨¤‹y†¦½µ :•Ö•ý’»jiç²ö[ºøDyªA~`Æß£÷È©E’íC7Rä¹1‘¬\K}`í°Ã3ÎgÇ&;0 {ƒÏt‹O,úÕÙ ¸ó߉{ÉßC7ï&À(áL`H ÁŽaƒµ u‡QÒYÙÀ2ˆHßÓÑÇÐ3XÁYÆY@¹+&2®>déu"±ÁϼtÒ×nB5nÁ²uD d,à bý È qKDÅÐj\_Ê®Y]ÈSgï¯/^nØw–½ó|S^ïøñðËü endstream endobj 5388 0 obj 5408 endobj 5392 0 obj [304 /XYZ 38.2500000 737 0] endobj 5393 0 obj [304 /XYZ 38.2500000 491 0] endobj 5394 0 obj [304 /XYZ 38.2500000 110.750000 0] endobj 5395 0 obj [304 /XYZ 38.2500000 737 0] endobj 5396 0 obj [304 /XYZ 38.2500000 491 0] endobj 5397 0 obj [304 /XYZ 38.2500000 110.750000 0] endobj 5391 0 obj << /Type /Page /Parent 2 0 R /Contents 5398 0 R /Resources 5400 0 R /Annots 5401 0 R /MediaBox [0 0 595 842] >> endobj 5400 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 5401 0 obj [ ] endobj 5398 0 obj << /Length 5399 0 R /Filter /FlateDecode >> stream xœí]KÜÆ¾Ï¯à9€Fì_@`@»ÒÈ!€ rrd;Ùø¿ΰ9»CÎW~SÝäÌŽ{eµØ]]U]U]¯þø§oÿÈþù{öññÛ²ïáçã·M¾­Š¼û'Ûýúðöl½ ¿ÏªºÈ¾ÿºyÉ^6_7_Ûÿ¾lº¾=þ¥ýÝÿ2›ý¹ý÷—ìooÿðÇð—vá×Meªöç¿÷?›Ê´¿Ë?wþ¯Í_ÿý¶›±_.süÿlS˜ÚïÀ˜XúeÓoÓìýþý·ÍÇóV)šÜ•uf¼ó™i¼ÍþûÓæçv~ú|ÛxcªÒWù% U¶[ÉfÆ6yV×ÙÿÒ™ÝD˜Ü{oò=äÚH1®4âäš”-š€ûÝ¢ú:Lcò¦ˆ8ùru¬ô´Å³okláw„Þ¹¨[heŸ ÿ\´/“ç¾CZSècíuö$1ySGœ|¹6R¹ñäŠGÙX_ô´<¢ ×é#Lîª&Þä{ÈÕ±ÒÓÏ®IÜV(Ä$îëô&/Êx*¸ƒ<qñìšÄ-Md|½NaòÊFÊ{ÈÕ±ÒÏ®IܪÎc÷uú“×MÄ“»‡<qñì±-¬Æ-¬ÃìHbsQ ï!eaÁÉ#SÛæý §¨b$âýÉOtwk#%PO®(¸­=¸%lÁýfú“»:¢”ØC®Ž•ž¶£Ù¿Î™ƒÒý p̽>>Ÿ·¢±ÌžnÛ¯Ùýxn‘RdvîšVª<ÿ˜ý1ÏÝÓÙó/›f[Ú¢±15)ÑHŽGЈƒß83Û@,œÍÃ5Þ°Ó¶/Ï-›Ä¦°ÏMO!I©=ƒvò/päq>½-Ĉ2'88aÓãDŸwi –ìÑQ•Åžá1«·u“äÅ~Äm _ÖÕÑH'Pê!…üÖ».Xò:}7bL?ËÓy5kCøªØ:[›ã Z´uaü £ ÿU¼ QŒ)H¬ƒ·A‘¥„¸RüÁ­ ÔðÄÖ;Ùd\Ï*笃¿Á[‡ôä¤|Ö­ÑÝœ¶Ü‹ŠÂÇKšÖØé$×ÑNŒ-SlíP¼˜'â›Oð›Ž4p¶º§PeŽ™3èˆV6å;sDX§£]¹uƸã ãSöLò =ÈÍÁb:Eë0°™TZª(\Ìg¤,\¯€]8µgŒ0²”9èÆSUØÍÐÇ‚\ÄòªB#¾ ÌG‚oÃÉèð9ZnÚ¡u±79Ácô>ƒ|ÃP3¦V²£5¤¡˜YbzZvúe¨*L1V"Ÿàl43v;”fA-ÏâDûoˆÁ`Çôy8ÿ¨A{7ƒÂéÇØz­°~¨Ø–$5]Jb¨ñlC³žº~éjGærŠÉ‚¡Æv–­ )‡Š99£›&6Ö@”>S‘"©¸™1u½‰ÔË]>Ü®|Hl$EÔ¬&ïÝÕÊXÛ%|cžÃæÉÈûḚïçR¬k5ŽIØsÏÄnr]xëÄõŸ¹“àH£N(w†®ýü(I;-î²ÇK^{ÌãFE_LE\º!+à“ˆOãÖŒè<ÿªÁÈ8ÏÈ8Fec¨? í‹DŒŒAò_´˜r:¡]¹—Ÿ0+&fEû Ì*°8wçåÀÜ!çËÀo„Ì Œ˜×0¹Ÿ4ö~’Â!4”žÒ½S˜ƒY18CKȤûƼˆù—áEwйó"Þ)Ìÿòž`žQ€: Wœ‘çÔBüÓðT‡ -!‡gþ©J Øäæ °Á“ŠG„„ó× ¸S› w•8p¬Ixf\3½o)–]XJëf¾¦’Å‚”z¸*êi ã s¡ëÊèa¬ÕUå •CÍènâ4<["Ê¥Ìü®ªêÎËé ;DM„ —ñ~ð:oï‹Ë›ò.¿5 —óõkί*æoí<&¥‰óÐ$•­·lÕËX| _%u9›²´T%n=Ê·ÙcKE;ë8Mà Ï,Œ+–?g+ÁoÓWx:Ì áilïñ¢'·æ?Ĥòeãoàæßh7b§‚”Æ3¡At!°0Ö¬Ò·©{³QHþœJ‰?•_S o„„µ5„€MîªIò0‡D0K˜¶ëçžú‡ÝÖ,,±¹Õ!\<>!ÿeþghB‰uF!3MR9v5EìtÕŽ””üè}O7s¡\ejáJÙ 0Æ DÚ‰J¡4s”Gd ÏH ÅYd£¬Wª8P7{”ÉUdRÐgÔr«öž¸Òj«õ§á®³°ˆ¨ ÎU!U@!(áô3UÑ H|Ùrúª…õÒ¹h¯«Jlf2ă´ è¦ÊË™š'¢Í× 8§q¶°±D‰}¢ÜR°§° &š_­@&1ÈâåÑ ¿QôIÕix ¨R~lw0v¶‰Ñ+° >„Dg¸$ÕÐÅ@q®àJ0ªÏ"°J)èÅÖ‹·¼*çªÚ}¦ê¿ [|ŸìJ:%J£wš4¦,¹ÊN“!ü²ÊN“½³c ûI ½!;¦¬¶È—S]#1 l¯ÍȆ-œ-‡ß0-ñNÅiÍûòÝ8íXëª62a®wÔ6¹ºÍ¿ãÍÃ&œFC `D¯K?¶ŽÉÈX¾ª7[ªIä#Ë—±3FÌmèzŠ f^¬iåeâý\1]¹Î ôÜ Bª77L«q«žócB'ÝÏP!­¥®Xªhóý6Ê¡m< c¯Û1°Œg !ÕÜ‘Ð;&Pó,vŽ2¢ˆ¹¢ªò÷r9*6¿é*lga„ÎPxq•?õR´·¢zvÞqlG•T{Ô¿ŸôŒTfóŠmaÁ]›*¬ÎÄ\U;ƒ,X^ªvð¥HÉ<7mKßg„Žœ*¡ÀíÔ7El±Ø;Ñl5ÍWíÓ\A¿@§Ð„…¶ âvjºn­'‘È¿æclW¯DbÞñ¢£Ó*: Û4Ó˜Ç%ë~cÔ8sI'|¶˜—D…÷B‰ž+ÿRQ€ KE<‚KšÖ][mœ»¨‡ÒÚOáÈK¯‹ä„ñåÍ¡XyS–0Ýu£\ÌmùVË¡¼KßoÖæwéä†/ý1è«´îB¼Ô½ëÌ×îø Ò¶øµql=`jA ´OX¨¹«þ¸@C« Và*¬™Âš+À•À¥Äímífá«&èÞ3aMq¼ä©4÷óÃÒ÷PlN9p©i¦l/ÕÔ†ÅBm+¨dJ•’¨’~Ϙ1¹!L¡ì’NîÒ×Çly3NGìäÖ5Ÿ×ÜEÉáæÇØYË)LB• CÑ»œäx§D+æ5ÓThÝM48øJ$a§ðœ ër0' — jËheÀuRö3*ËÞ‘½v§tY÷NiÁÅA„ð\W›ÝàIÒûÈ}$©®UµQr õ”{-‰|ªòÞG’Ìym]É¥+oWãÆ[å ¼¼'ùtÁYˆïô­Ê˜ª«§*ÝZ:ä:/³`äK”)=§¼ŒÉÔWí±æ¾L‚››Ië`’ë*°cäŒ7æ%ôųRRµ‹Á:1UTS t”nT—0P5'çgU1RÑ3ê™iºŠ«‰¡óv>ºÆpÕ&™ø´édzâàXü«6O‹œhHEFG2éÃÄݱ]•ª ðݨÏ9±úÅG_uµiÔ¢á¼èZÝ4hªšFcªIó‹9\#‘Êh"Jq3fì5µ…L™¿Q›>mVx’çoà¤`1ÃI¸Ì‹IWýT »> xíñͺ0Ó¼xk¥´8ÚkùTºù:ŒWýÖ0ºx†ZÊtðúÐÞvY963hlqLžYÉØ£Ü’rù'+™ý¨TíoÑ*GIt¯q¯ï¤J€Ç>°9d" €û±1õ˜uFÞ1¼pJ뾩Ý"Wœe|–ú,]³æ Û峦—Ï¡X~DÈbš ¬˜ßé¼ۊ³ÇYð˜>‚t!ÞÈ¥òäˆ(WWŸF‡6qÞ;Çúcù|ìå%ä}ä>’T‡.ž ™0SÛææ¾a#UÉ&¾[Ë÷‘[”ikÎî¶yÕ‡›p‚ì ›šEv‚*g)è6 À@扠¹šÉ˧/+?}Ì4âž‘ŸÈ¡~k q¨Jœ‚È$jƒ ó_ŠkdûÞÊ~U0÷†¶ÓvqÌ׳3¤4Å'wFã%(ù°­q«åT±é[iI‡t?÷CF5ØðÇ#¸ ã"ÆnBœþG@½¤€¨}u¶€ ÞOaX_ ’œÌÁˆÃÆøïÙ½Ëf÷ZsHFbü|ÂñVC0>»»X\·×Pדep¬SÇp ‹WðR ¸1x]îÅ/¸§ åÃ':´¤jOnÕrBëÌ4§Ä°-;1\÷b8èg“o;…8²NŒ„kt±µC-jžˆo>AJ8[g«{¥9ʯ 5¦fÔŽàu\'ŒÕë9 ¡~„#oA}í²°ó Ü:cö CP÷íN̖ÑD­­µ}ånb¯`8cß6UAÅŽ(¼0Ó~;$™’G|aר¦¿äUm/˜wÄ™ËCžó¯ 3þ¾Ò ¸8¿’œña'ªr‹ƽ¦úÂÏÁÁxäñÃç3z”ÃŒvªZax„I4;i†:‹¡ŒFÇ Æ*|ÃÉã¨QÛFé>6¦ûXV*“ûä™ꌶ.ÊBµ„À€ÄP6šT^{ÀµA„öšœZ_Ö¬ÆÙ«zŒé’¯ì@oRÒƒÐÃ+ŠàxÇ:PõÝÁÂ=?hÜ+Q¶R²Ö†£†º-S™5+î“I]¨p0i™ÅØqcNÚ±cá–·eØWžïû¼P‚nF;²‘K­q÷(L %[™r€Ü¥oÙóÎläÜSÂFlkƲÕMÀÔÍ"^üöº¼ÝϨnåçωóÚŸ®ÛIUHÊ<Û¤~…ªÄ&r„Œcù'º¡1¹.BÎ3®9ÇÄ gx?ÂáDnˆ@¦.ÆñFTJNff(ñÁÛgèÛ_ÙK{¤Åÿuê/œaOÖ§Äkï,­öo!̬?Æé)±ÝÑ¡:!ﺳe·¶ËºqO9 Ýí¶%=(Ð?£uÜ”sîlOa§(»#üPÇàka9Þ`88bíáÛ0x6øMP]fÖÖߤ'± ·û} qù¨Ó¡†YÀBJ`p dvÌ6«w˜K‚ :q à:Á:õ Ææ`ÌYõà 5<1¾ú&e£I0ø›‡ý¨åÁ°…{â)a)ˆñg`FP ¥ÆÛƾ왭r· òþíáÅÇ ËâÎ4ß”Ö˾nþy6® endstream endobj 5399 0 obj 4101 endobj 5402 0 obj << /Type /Page /Parent 2 0 R /Contents 5403 0 R /Resources 5405 0 R /Annots 5406 0 R /MediaBox [0 0 595 842] >> endobj 5405 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R >> /XObject << >> >> endobj 5406 0 obj [ ] endobj 5403 0 obj << /Length 5404 0 R /Filter /FlateDecode >> stream xœí]IÜÆ¾÷¯èsµX 7 àÑ ‡‚ääÈq#62ñ!?½=3ä|]_¿Zº‡lÉC±Xõêíëû?~ýûöŸ¿mßøúŸí÷á÷_7Õ®­«Ó?ÛïwÏ`»ÝðçmÛÕÛï¿l·›/›/ûÿ>nN/|ýðçýŸþ·µÛ?íÿýyû׿íøãð—á—MkÚýïÿ>þÞ·fÿ§êüûáçÿÚüåwÛ_+ŽŸ6óòÿßÙ¾1õq Ÿ~ÜŒÇ4Ç_¿}ÿuóþ€°¯Ô½u¦ÚïüÖôÞnÿûÍOûŒËW»ÞÓ6¾­®ùPk_²ÝÛïW²~ö¡ã/¥å#,îöèmñãÎÕ¡b\cäÕwwƵ¶ö‡‹>\rÝuvÿçÖ ÿ\w.ïÚhm °=-añ¦Š¸øqçêP/¯û›¶;ÍYãNÆå#܉;ü86v®•ñÂñêŠìÛ™¶?¨¯#€ÿ¼zŒ»µ­‹·øqçÚ@®/™”³uDÞýlù‹û>ââÇÇâÝÂꚤ\w£ªä"ðégËGX¼5>ÞâÇ«Ce¼\¼ºæå¶]Q?-þÞT%üq籄°°zdVíM3h.¶jbÜIO1ò®‰ÇªO;W‡ÊpáóÕ¿„¬‚·rú °ý…¾mÞ6¾Úk ÍöÛOûÍ¿yúíÛ(õöÝÁ”Ý[‚ß~Üþ¾ªŒÿÃöÛÏ›~רzÜâÒ“ÊÂ'>ùŸ<À' zâzâ€ç»`нõð¸ka5øŸÇÁ]»ÓÞ>}Û£ctLòîL‚X¡ˆ±ÏbLÂßéÂwmë" ߨñ«µ¾Š>é«ã'½i_º©vMkº¶ž†©wÕ^ ÖÏ/á„Ê~çÝÉý:eÆŽ¦÷Ê;öôĘ]í›—;8]Ì.;è ÞÁÀPº]×WGLxzR¡'•‡0hàj¬ÝÎÙÎØú’ßЩNLµ»ä€ ™,!;Û ÎÀ9_ÛãÃt ­OÇ'õà‹àˆwß±=ܾ•îr°ÈÅ ·ðNNÌw¨«ÄO0tà;Fç.súƒI8 Ô¯û‘±P* O>Á'X'#4¼AïIù®¿í1 Dê½u¾ˆ Ø>€8b!D\¥j¡`;„Ø›€¿˜¶TaP%¤†Ú¶Ë8“O<¤-y—‡·U1–Æ1ÂB1ÐÂ6þÆKÎð;ÄðIkÌoRîÕ)y¹oŠ¡@Ý'Œl¢¤5þá=ÈÏ70ÍX®º×@Ý—áiƒDMCgM] eܛܬ›„÷Ø^óÁ‹ïqkÜh€`ï™í ™ è¹3»Ÿ°3‹pÎ Ö>ôäè:a_H€kLøðtÁÄxe0ü?ŠùaŠ 3Ÿ~×ÀÁ0Â÷ç]q$!xqñj3ßA !Ëëºâð•2RÆå‡‚Q4®Ü{´Y_‡ƒñ\«Å”]½¯7¹)ø3ÜK@*Yt`da‚¾ƒÑuvë8^©°YF·Àx‡ˆ)ß-#·uhöxâÄ‘?bo/ùHè5¢þ¹Ì%Ã0á¼bXp11ýˆ"ðPú5º0„ À0—ê«l‹Áw‘v!ðUŽ-\?”&‚œ!Tk] ‹AgJe€ßÁ·-ðß<\2L®Aª 0ܰ¦=“S‰¬ø^ž\3,’ÀåWwpw ›AðóÅ« (yù÷0c‹+evMkÌ"»æíDZqh1W'è;8sB÷;B¦ †Œw-˜q‚Ÿ¬ø–ßà˜çgâɚLJêÓH w†â*% àÞ·™Ý³J°•Þ–Ãy 5Îé`háÍ`ÕÛá|î@€†®M…7Çd£•\7»HÁit)?:Å©zxnœ%OaS›Š9 ¾{H©ø:¦MÁSÍ#ÔÕ0RÁM—Òmî>¥^^ÓŒÞTŠ×`ÊÀ|™É‡ðhó&ù`R›½ké„âXŠ24Ì{UºkF¡­ìOò×Ü®½*¸“®½*xzî+S *÷ªÀÖ }&a¼„ZŽ`cÃ< û4°†»r®8Ö’r[=¯ÜA;ÀŽ9˜o¬Ü!wpØNY±WÂ^øD¯¿Ì¼ó©D1;·[-¥•£ÈúFÉ1®¤ϹJ,?­ºÌ€{óÛCk÷À(”Þ®]wcÉg½îrQ¯«œ}‰ˆ'g¨ÌÀÀB]>î À4óð SåW*Ή‰L{ªÓ Ó% ŸçòÎT ˆgýG„Þ4—×ò3m»˜RÔ%¨löòæTï¯Ø£?A¸ÙÙ#/«PnWEár:øîµó^37=$àÆý'ô~Ò»’á;Ds,”`zTQÂ…iÁ„AÌtÂ$Ä›®ðßMÙ-Š€ÅÇ48ÈÙò„"$à7C¦²ø‰n‹ã¸ZÓ›IøNRm1• #žíŠMwÚõ:±v ƒ¦ˆ·¤jÔŒ¤ 4믉;@È’€nÞš}ŽßàÜÈD]é\U›eZ¸î”Ƹ),™£ª~¯Tó$RÍåöVžAª×æp‰z»säTïŸ%¦g.ªªh¨˜ÿU`le„†-Ðl\°c g^ýù¤?ŸÀ”TƒQR;é(1¯—Õ]†ß3•çrÇš40ÆPÛ¦ž@)žgÔ¨j3•o·pÏùG´¤’b3-€rkb¡Åߺ~õ Ë8/²O€”¦Ä3ñ„`îÈ„#.R4k¥žŒƒ«ò eWrvlž3Qìˆyf nÓßש)LNan“Á ìûÇ{ÃßÁ7¢ëÉÍo³0÷£ëu"xtfÄ ³·ü<\ÕŠ™{b·iÈQÕ©Às^`A.Qg|Ç›©êeت¸Ê.}P©ºLK#U°H 4Bpó¹L?E#eI­+¿nrpÑÚ ã)Ðb¢\ëzðRiGåy¨Ä[Ýà™.£x«qú[GÄT²ÈÝ"Êܦi¦ª[y‘ãR½nRl2´Ëø5“‘Œª‹Å2“sŤüD¬1ð‰œ\•ðã-˜ÚÊ옉ôBºM57¿OvR¦rjI§Œš×ø©ŒU¶=£ì ˆ'\‘¯[ ;Fg>’’À—gÏ ƒ1?ÄÛ\Î׆Ô­ªb¬IJNÌ(ª±5ݪõW•,¯›š›½ï@äŠ9 S¢‹:çë ó`$]*E‚JáÈ^Ã$øÄѾa—Pɾɻ~¹êXØf£&Rµ¨qXJÎÎE8Í(÷S¢£'+`1õؤrM—“.1@%eòQñÑ…Ä^ã&’]Á½‰°VÜ•–\ªÃØSw¢ $ª3-1†H!f½Je&âl ×…i¤ªº¾r!,€˜˜ ~G£oEªœ#AcÀ8„÷À UÝC3™ _5c‡‡Ûãvø¡.Š[ú£*dÛ5%Wóð ‹È &Í| ‹›ë0p ñß]3ê)ÿm »&FC2ßÑ¥ ×'¼ûúüÕT®÷ƒÎnA2Í%u1l¢„ä¥Äõ–˜ªšå=ÚyfBD—=‡)6Ó‰©\øíÑì9!$ž¨TˆŠH2€TÉt v»ÅoÝL¾eïÎŘ՘R¡€{ÈuŠ›V¦: ¶Â8°c¢ÖBèL7™@U—`¼ø© u™RN!¿xÚ•cÞîª,zÍe[ÇGxYh™mçÆð̤üy¤>7lëðmÁw˜a{‚¾ƒw øð°1Œ}ª#…iÇ„ñ`éô9ן[’áÓa(Âiøù¤ÅE0¯ ö†q Ó™. ôÒÄ—ïÞ›z™†oòIþ‘mëHUî¤ÂHU~b/gt ¸ZÂa«Î;_ *[%dŽ#2´‰y€…ã±óóuÔi:«]1”qorSoÔé÷ØŽ zƒì¢xµM:ìTNÃIå™Ö-ÊSMD.Ð³Çøï„½.ÒØ]˜™TuPºŸ²ÇãçNMǶܩM˜ÛÆ4¨ âW|ESï˜iÆÎN„"•º©X[Š%ã3Œ`¸×a^*Áܵ6â‰+ßf™oö‰>·0u$÷$ǘ†ö–ÂDê´üWµ2"WF wEtÃOVó»·Þ•zƬˆ¬Ô똌LUp6%"UÉe¢¹¹Å2Ê ÈLؔڔÈu! 3Tu„¨$šÞ}^³&òF­Úõ”¿Nƒ™pSòìA6bM„IqWÍ[W™‰É´ã¾Àt›bêvžÔ-  † ÎÓHË›Ž’²,¹9'5¹d‚’, sâ$C!1‘ ¿ãÔS&Í1Q’-NРJ™!Üðýà4ßbÒPÓàÿ9 ã¿Ã  Ó›«Ò(*x:œ>‚©c¾Uá;8Ó#“~‹wͤ8AÚ û1ÝcXcªÃwŠ“¬pš¦T| ˜/Ã[ ŠÕ—ÊØÃhC>VÃ0À¸ƒ“M1•`騊½oNÎ¥b O ¦áN‰ûôAŒ½ø;•0ÔH%]2Å-Lò­jB¨€UDc†¸ÃÀ Ÿ󄉑Í91’J/ÅI÷¸$ c¶»0 Pà€õèü²ZU7ÄØ·ˆ—aRµ\ï€)MàÆXÌ >(¤æcýâõ"tÒp¡~l°%X²©¢¼­o^’ÂDy‰ÀÌ}—/à·¦Š]rbÕ‡rbHÉý\ Ž3%¡›UHä¡R9ÑLMKŒásºmQbJ±ÖLÄX¶¤~AJbÐaT¸|K*² Ì›Ë6Q$ÙôXÝÌÇ;-–ɖЧ›˜ªœaÁpcU½il•ÄÊêú©HæD¸Zx‚èšk\Õ&@×µÍ"ÆaJZãÛÂP\j™"ýU ­uuÌt9³·5§˜Ê)^lÙÿÚjX§%p4%éMêvÒŽá4¨¨“¢‚C7ØäÆ¡ì€%R•„æ=·SMæ(K—œá­±×à?‘T¥Dð…¡Í”wçPÓ ÓÖ’[æxºý¯íãþâ)¿,ý… 4²î58ãv•9¸%¶Ö¿¤â×Dý cÚWäÎIÚ=–òÍo¿™?œ4v7¸EžQ¤ ÊGô·TäôÚÞ>'EÕ)XóO[ªàfÍpôÙ2°šóÊ1 ^ ¾3¨&èèφµ³wøó~ÇãΡ-la±F o£ÀàŸÄvÁk°ÃP…°ÃX2°–WÈ@ØüÎà‚{í ŒÁ³º 5¥á\A:Ì`ð;Ãî‡ãKžà½ †ÜkÌÞ †Ÿàø‰bÈ5ž‹–fÛÊí~ÿœx1¹a^<4ª$ß’ÔÛ~Ùü`¨ ’ endstream endobj 5404 0 obj 4666 endobj 5408 0 obj [306 /XYZ 37.5000000 341.750000 0] endobj 5409 0 obj [306 /XYZ 37.5000000 248 0] endobj 5410 0 obj [306 /XYZ 38.2500000 695 0] endobj 5411 0 obj [306 /XYZ 38.2500000 695 0] endobj 5412 0 obj [306 /XYZ 37.5000000 341.750000 0] endobj 5413 0 obj [306 /XYZ 37.5000000 248 0] endobj 5414 0 obj << /Type /Annot /Subtype /Link /Rect [358.500000 709.250000 449.250000 716 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_catches >> endobj 5415 0 obj << /Type /Annot /Subtype /Link /Rect [43.5000000 701.750000 549.750000 716 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_exception >> endobj 5407 0 obj << /Type /Page /Parent 2 0 R /Contents 5416 0 R /Resources 5418 0 R /Annots 5419 0 R /MediaBox [0 0 595 842] >> endobj 5418 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 5419 0 obj [ 5414 0 R 5415 0 R ] endobj 5416 0 obj << /Length 5417 0 R /Filter /FlateDecode >> stream xœí]Iܸ¾×¯¨s—ÅM °»Ýr`Ø@ƒO&Á`fÎò÷£*-î–ôQÒW”ªš1wš—Ç·ñ­ïÿüåÇý~|ÿðå?Çoíß_Ù©pYóŸãùÏ»—¿Ðå©ýùX”îøí×Ãóñùðùð¹þßçCóÁ—‡¿Ö?ý﨩ÿûóñ‡¿×¿ü±ýGçðë¡PEý÷/—¿«BÕ?eýßçßÿûð·?;ÏØ-×næõÿ§ët~ÞÆÌÒχî˜êòç÷o¿Þ7X·Š«¬vú¨¬±GUÿ|üï??Õ tÓg§Òe ílýs•Û"se©ëŸ Óþ‡]¼ÐçÕUž•®ê«ÈòÑâ—?2Ó«“›Ü…›ü²sq¨(“+ÿì§zP狾³š3äZ7².ÄåöÓ€¿ËŠ"Üå^v.•îrñì©ÙÕk©¹æ¦òwÒOâ­2á&¿ì\*í…{f}áN©hn,;®Û÷éLžçÙÇeçâPé.Ï.Ⱦ]yV ÂQs?}øçJ•á.÷²ó`Ô<šýóšYðVšßòÙóáǯ‡÷OÊf5“É_ª7wY³ùëk w|wV$ózôÇã³L«?¿þ|¨N¹vÝ›eÑHfàÈ©à:%üF£Cì@åð¸ÓÀàÓ×úbƒßIEí|\¿SÏé0D øÍ§õwâùbÆ1 o˜бÖú‘1ñðÅd6ÑðÊÈ –kxž b¦¼7)Ãs?‘`A\öÌöaüÒhÓÑ0ıC~û—­ÇKF2´¸綬~Í­VEKÚ¬Y²*:4hˆI©“³yY¸`k€SžÊ*»Àg(´ìÉšÆ9diߨOð›8â.#¦ÛÚ¢0³5R.˜DÁ¶|~Ñô²xa¿Á³ýÂÄdÄA!pð¹ls“îdt©bY+œVÁBáóÀo<ë`,#h£ewSë`œ%N:º~ë ð™hAì¡´C,&ðOïÙl gÃ0/àˆC–@ÏÂÄÝzHáÄ!LXXè<„–€.Ó8æŠ"¨áBÉŒÈóÀˆŒG˜“z¾ÁØIˆvý´X®á…=€\®xpCφ1åÃpK#n‚¿ÅªD,4¨z\Ó=ÜŠÜ-ÖˆýŠ`p+nc’&˯%Ô`‡ÓcæÆ°=†éhHáùÁŰ=^ («b(=Ô0ÄlFšákî9+V’ddôFéÇ,¢©Q‹i—Ñ|W¨HÔÓ\VjzÏš£Ãz ˼ ›+U¦c0¡ÔªòfHü1ƒ÷8šDD{#d>%>êëŒÈÖÃx™…çè*¼¥Ñª<$´ /†`^@Œòˆ_ޱnÍ©C›»QÙ)/Ô+Ñ&¬ÏÉŠ€­ã±âU¬Èê³ m”‘Aaß/”ÅÕHob쪘ÈñÑ‘Êh:G–i?Z0²G„\n†–Á¥{µ•tõ.LÌ!µdeF/ǰ\þÝÞ°Ž½\øéHIª ºè‘y53üÚãð:+Ø ¼[›·Ì–û¢±{±w¶¡%ë ‘|ë7u-"Ârq›q¥3»ôœµ/^!/EŽÅéªe²J-—Ue9| x?]îA#Òš ‡˜o#™nE˜ ({Ò*„f"bjXyzTcz<“Õ…ªô9 ÿøk Xm^þæ—×`1ùˆÖ/{xMì-ëqE/b‹+žû É%Ü·-MM5$fÙÐiOà ½Œfxâàºh—dþ¾ ²9w†/ÂHùFDÅáx…D#WD¸yrŠ1†X¶"û`g½2²<ªjJFêFD:5X²~u71Ý#ñ?1Ò’˜;éa ¸z"¾ùwPÂÙ*4›Õ.9Ôß[ꘚ­AR•w×ú}žGAèhÝ«@•Yºƒ82·ƒð±IΖÝfT·™¡‰†1$¬‰ÙÇœo©½!wÊ÷€{mN³ÒÝÐw*~DD«1?†NGƒF⛽`k‘l¸írÑàQÏ®ÉaìÆ¢OÕ5ÞN &¹C6ƒx$ޱä¶ÈcCà w`ÄŸª‹taR!™GWˆw+DØ•]\B"q[ià ›Ô Ûe””6&k+sð<Äó•áÙx6áJ©µß犴¦zÆöY+ª©Ü‚„‡õK¬7§…ÔœˆÂÍ{α`²c·÷§QFyŒ¢5ZôsRÆaŨ(Df5ó¨#^ oÏšAýxco€ÒKeÎ Å×ò\wO’*~Ï.w‚È>ŠW‘Ÿ ÞŽ2Ùñ?¥^„xYs¥²¾;åZ2EôærÃÛoòLÏLÄ]J•H[áé$|Œ‡BÆÅ• &ä‹É;¾±* Z¹ºîºÜO¬Ê%÷‘=ÞŽRe9w]óÔâ²™ ° U=÷ô*€;ðT¤ÆÕ²á7×PÇ 0 pUú¹óĹáÂÎÞ°§?Áç†PÄõó™6Ç`½y+¿{*¥?7Œëçcìý-`}wª¶¿&nAô<¸‡F†w€OŠ9ÁQðm±XžT[õ~ÄDµ7JµÛï:&ƦÏíúâéx²g½Þ£Âýƒð®!Ü<i Dñýxà†;^AŽbˆN&ï@¶ó „Žð:¸— –pÓ†›X€ËJwó˜”(½¾ üÎÀüS-œÍ:#Ó5q§w¿Š)µÊrc‰W!¥—'ÝŒÒrf¥IL*³bv? ÂÔ_7/‰—g×醛Öù7Œ©Ë#†c9áÁ±ˆ]øJ뮀"5²9þÊêÈLwTlW‰FÃx6¬Ýa¹‡a×aºw2o2¦ƒ©G}EÅ|'”¹§MÑ‘Xï&1oQ¢w2óÙž$[g+Ðò›µ"”}|U,î@uofl쌅#–%esôŽ63ÈðH‹MîP}Ãb$Ĥ˜¶¥J«+ÎìQûö{ïÃ&QÙ0²ò6-U·W°LrUdLJV´+n«(ws'Â#˜R±Ó=–ˆxǘ½y$H^±î¸7 w`ñI ­–ÑC5¶"@9ãÖžáynnÄ;a'štuomÏ#Œ¶ÊØ y¶½µb/õd±”¶XÎÅ}0ü)r™ºÆÿ{³v W‹ÈëÏg§ÎНêOt*ëžM8 ›É™.Ï”Ài§›WZÑFÓ“WË4aã“W¯¬˜µ|’]§Žò„ã%»9•÷Ù’0$„1=0A›²ÊÈ $»M}ƒÓ-n2à7…ö÷#qè¹ì; éx«ê¬¿¡ÄEç"÷–6“#hÕiãÕN›¾:nâ»æ·™à€Ï³ýÞÁ“èž+£ÝBT¾ì:þl(cœý)/ql/$Ž}wÛ£/oÎÇRphd¾\u¦ý˜ú²Q™>q_þ&îËq|ž=”â]ßfX#ƒU²á319©1]:KžgU—<‰“.¼¹ÄIî@[ݹåÁh6$)Î~ªþ”Ôª%ª|iÄâl_¯©­ý<å±ÇeŽä› Vx"¾ùwPJÎÖŠ©©oÚÆ~± aÃ~µ]ïÙq3À>wôÍl=÷©ß0èG9¸þ&‡#ø¸·–m¬‚u×çw ¬ñZ¦>¦Ëö4Š›ÐR·"µÁ ¤D5¹ÀÕàñH¬²á‘úùxú·0Áq£ÎrÃ68 ‹iÌè©d¤wš§©#ÓÊ®¿}ásDß*O÷»Q¿z"^ÔÓw7‰m\­eF3̲0ÊÜ\ ^ê”=MdxžøYÃÔà§á:`2(¨ì›H¡6žuƒŽçé͘‡ $|ÛŸ"b?Ó†ÕÓ+ˆ;LOŠýË2+ÙÞ‡PÛðè!„ȽÏy°ÆÀàŽÖ‡Ði3b¦ÞUË›¡ÔYMhëF±Aû Z;à4ÑÚ£3y.LS=üví ÊôÝà ='ÅpcøÉŠfzqõËuùU˜Dñµ0ˆ>"Ñm· òÁý cf(9ÛEFÄ´I»¼÷]&/bò"úo.yoÔ‹èÉ8¹Ãx Wö‘ã1ò¬÷6&Nš8iâ¤oŒ“¦xŒY©ûsÃxŒv$Î~L—1-#¯úJ‹÷ÏÃÄÌÚG&â12%V1g&z è1*Eàø›)Û%¶ø0q#ÿ8a!aLM7íÓ ËsµUI¾FŸ0O¾Æ{ò5ÚJDp·ƒ­òášÉ‹)ìŤüŽx6fo„eéýN×<.ѧcƒ§<­:„Sˆ $Ã*°‡ àð7Y¯¶h|)ÅïD÷H×/ÉCãÅ>ÿl$ññv0?Ƈ“(éÙL}oÁ)x‰ ^Ú8”G¨.ª‡*ñÑ—ÇSÉ*c­…€…ˆ­%ÎŽËÉŠ9ûæ¬|}»œÑá ×gV0ð½á[H‘ªÍøEðˆ!ó>© ÍÄd-ÏщŽÏÌAñ •Q©pâáÑû‘G‰ŒŒåv ¥Œ¢]‡»¢¡®Û§òÉ*³5øçé¡°ÓÐR¼ƒ¾€‘:fzÜÿø¤¸Ì7¶HãîL¡6lã·9;Fu€Í…f´X~ÙG§¨ãSÖ+Ôýš@sÇDb'ž§F*¦Ó‹l´¬´ýæÚbk SÛ<)ƒºhìJ-<°³üMFùSD²nDªf0’çÿ‹ú|01ߨG6$]E°-Õ¨!ò”»qZ#¬7#/t¬Tç«,}au•YÁt>"ÙpJY.ËŒ±Y˜ÄÖý•s"JÀ‰º‹’nÄ=&–7zLÊ’ø¢qC|¬ šøÅ eU¯ŽX’M¾µ 1fôíPw*ïT¬ÆÈeß䡵¯jŒ¼G¢ØÜT¹ëƾ±¬~™Lçú0ÃŒ&<"S©rÍ¢$2–y×bË`/Ôžbâf=ûO=sÃe>{Ã_ÁçÆ­•pî qÃ7šŒO48´–3iúF,Ûu/«ÌÍcŸ¨>á²4.{Îó1"&i;{'Ñ¢I6§á܉5³ûaJÚ`íÉSŹ LŠXö¢ÊõPôð!W„9æ¸s'E'˜ãÂ26x6\HïMTç)X‚‹®@ž´=Ü ÃyÄÌ h¦TWÐ Ãq©|{‚óxpŒ( DéüÄÝË–óÜ)Öj±…ãRqa,‚fbqL›5ûü¼î+ºßz?ªš§“7£Rü;žæ˜g¦LšãõPtÅPLš£Ws$Þ÷ ŸÇ”z›š£%Š›FÔó¬È¯ ™¤9r0Hš£ôkK˜×@nU‡«:k±Gð»¢s券®LL¬bQÄl·])õ Ü0P+ZžÔêîræ< cËsØî¤ÞÌ,µ”oN—C—B‘â…"1œ@¤qt ø„Þ‘”qOjP&%Þtƒ²úÏñ¹(^yóyî,Hå”<2µ(ÍÔ¹αähËÖOµÁˆb›×ºî2b^Œ4¶Œ|<Ò¾&õ©­ÃóóÄ¢G´Ž™+9µ·§ö¤£R@-&à‡Ž"6Vÿóñ[¤ÁZ&Ô‰c(<ü¦å*jÕÑ‹ïhË"Üùç¬ï¹¤>Aæ1 hxZC ŽŸ‚†*„Æ’–µLgpVÍ›úÃc0Ƭr@„RŒç\]}çÑ$3üÍÇv÷mû%#xo­7Å,à bø)øÁ#ã//ÂYš-2sjùýKâÅä†yqQÙJ¾9©wü|ø?FõÞ” endstream endobj 5417 0 obj 4443 endobj 5421 0 obj [307 /XYZ 37.5000000 629.750000 0] endobj 5422 0 obj [307 /XYZ 31.5000000 321.500000 0] endobj 5423 0 obj [307 /XYZ 38.2500000 280.250000 0] endobj 5424 0 obj [307 /XYZ 37.5000000 629.750000 0] endobj 5425 0 obj [307 /XYZ 32.2500000 320.750000 0] endobj 5426 0 obj [307 /XYZ 38.2500000 280.250000 0] endobj 5420 0 obj << /Type /Page /Parent 2 0 R /Contents 5427 0 R /Resources 5429 0 R /Annots 5430 0 R /MediaBox [0 0 595 842] >> endobj 5429 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R /F1700 1700 0 R >> /XObject << >> >> endobj 5430 0 obj [ ] endobj 5427 0 obj << /Length 5428 0 R /Filter /FlateDecode >> stream xœí]ˎܸÝ÷WÔ:À”Ň^@ÀvÛ²`Ø@A'“`Ä™E~?ªUí–t(ñô%EUkœŒ=-‹"/ïûùæŸÿ~úço§7ï?ÿçôÕýþþóCq®Ë¢ÿçtùõÃ÷?ÐÍÙýùT7åéë/ßNß>=|êþýí¡áóû?wúßIŸþÔýÿçÓ_ÿÖýðG÷—.á—‡ZÕÝïÿ¾þÞÖªûSqûýòó=üåw§_/+Ÿs›yþß?è¶)Úú²…O{Ž©®¿~ûúëÛa_)ÛJµö¤¬éþÕZ}úï?~ê>0,_œk”©ui»?·•­‹²it÷çÚ¸Ø×úöuÝvW¡›Éǯ¿d–W·ZÅ[üºsq¨(S)ÿê±/ܶºZ[Ƹ’aõWR6UDdºì\(ÃuÃÅÏ­Uª¾ÜòKøH‚ª1Ž”‹6€nËÇ€~ÓF$åëÎÅ¡2Ü-^=2)×…j"òî§å#ÜI­moñëÎcñnÏê±/ܨ*ï~Z=Æ•XUÄ[üºóH¼/~n*÷ü3ùéæ ±ê¢v¸6£ÊIºêtæxRãiù÷ÞèˆLäºóXRózl&Ò6Д¶§ååïþ#¢Hºî\*Ã…OVÿ² ÞJÿ`©~ó¼øîËÛÊvØ1¸/?u›»~³ÿíK”òôC§Þh]Ÿ¾üxú}QØê§/??|øÒm=úWm循Õõ«í¹Òå˜þ‰²èIaà“÷ðI ¿ÓÀw4zbàT…žh|žðÉ#ƒá{+jxRøD¿…ßwZ¼#nŸî ŸÇÂ[ð@‡ÀÏãÙÆÑ"|5]Â;Å;À«Áóà'xµd·€iã(¦F¸üƒ±Ÿ?ÁTw­1VAXãóxÞÁ»†{3ø¶ .æøA V•‹t¦MÂý4ö¨‡D}•Ua¬Â…0ÐPÖ2RøµÅ!kYû"Ùf ³¬Óê„ûÑúµ»µ©xŸÉÙ„'}=²És?xX‚:³kLÁ%ÞA")lð® yvÈg/¬÷+Ÿ­Z¤³”¶°©n_=äó!ŸIùœµU‰÷vÈôC¦2ýé/•¡u»,ÓFŒMÛ<—é_EŸ´Åõ“¶Ü7—m]•W(Œ‘¯97mñü‰#ç¹'=º”g£µöžÛ³5}zýÓ“Þ%bÎ¥­šºœ’Y³bÅ|x¼¼#¹À=:dŸù°²n ÐÂÕàÞtƒVÃO„o½†OÌøn‰tÒ]©áìk ßsa‡ˆ£;}iîIÏ”`Ì EëøŠfV{„—Œ©Ò«‡Â tÔc8%›þTq®jõü<üΈ²mø¥XY4#16$f@À„ 1À³*^Íšp¬É‘Ñ`!‚1 “Þ’(kÀ!ÏÝBÈNåFQ¼#jE”%YÍóÍ·cÕ ó3ˆ1žÍâ+Å[Âìï:@e„!=ü‚W2ÒkÑ!„Æv8¶uñ%â06>)áeõx)˜p"c×cs…QËñUâ£3ÑJœ€½I¢(œÑA¸©ëÉ`,¹õÉ©ï1Þ+"jÁx =ñ4†H&Å^S"öN…³×ø†²ûñsÑçá"˜cW˜1! Y—-DS3$Á÷ÒŠ'ô.›<’ÒR«¡_ Îwõøpn1®ÇuÝLæ(aéfã?IsÃææ!ƒö5Þ)SÇÌT8+XÿJUR3ùÞïÞIi—!Bx-1m1ùÚØÓéÁ$›еy Eý¸¼Â—Ålì„XñÃß=öe›”XÑ‘y¶KµL²ŸF©eªÙœÿZ¦Jˆˆ‘P5:P—ðP÷ñÕCr:j2+ ²ËN)9Û¾Љ$§‡îsæI‡îq¬êÚœŽhŸbPe¸Ùíñ‹ä6-æÅPiùŒ7”p1N5&Ï‹*Ða ÃÄi2ÎL”ºE]vRÃw˜´#E1)0¹ïY„Âa§ k<6®#[¯Á&Æ•¥—ô¶ç’ 'XaõÂñ‚˜ñˆÒŽ÷I0KŒ›˜x"¢Õ™²Éòî®VU0ë+Ø'ELb¥Å‰äŸD¸Ø(; ð„ºh¶&<*;£üâ =Sñ#êQ†´M;¶âD«õ™”ùdÉaD6'k‚IÛSš%£Y½!BŸ`÷!E²É3ÝÖŸ‹âå››¶9Q¹–ÚN¾ Ð,Aj]G½™ ›âvM=Õ,§žà0ãT'p¶’|ô9g7ºD­õsVúLj®Ui=1¦#d;úPb’éµ¹½ßH5YC”õ™qS=ªdhULô¤Ê^\_Y*äcºÃÚå‡õiMê"Y7Lb~"bNÜç,rÔ¾±cRÌ2ÒÐ(³ZçÊÀ¸HU¶µ¬?@¾ð=ÑV¯á¥])œ›XÒQ]É0«ËE¿ŒË¶TQ6»à[ª˜˜üãÊ€q¹$N)»|+'i*#x Yƾdl7¦£2Ó@¢ÃÙ „Rçë­ft1F3cÄŒ6Cù &܃‰“”#Ø8²½(1Ŭ¯/ãúU¦µ_‘í/£&<~{ÌÍÏC%5ê©bó¯¸oÓdÓó´ÚfÔ v,JwèØÍQ—4ç_Q L¸!Õ+‰llG*YIÔmºc ÉÖ¨P%"Œè à›îDn|ŸakªÌ+LÁL•Œ¬$X5nz¼¼G“í˜([s˜6Í8¦ hš‘¤8˜ãìåÜ §]Wnµ"à’EY5Ÿ2 *3_ν«8EÂvuQýu’uZÂ=Ç™.ù÷© KâMÔ&‹.uQßv*Ú­äÀ1Ží³[U&Û ½îmbJ*þñòõúKˆ±ªhŸcŸ§°†ØÓ¥Nãfø(“ñ´ ß±:¯yM¹(µÒõKx,5òð ŒIPŠR«aþB¼Ãô¼£4µDüO~²XÇØ¼€Í2E|Œ<ËXÎëÁw&?<=9 )ÁÌGóX0óô†Çß! ƒajœÅï`Ú†O( K3 YîrЩoø;G3î0AŸbl»ÞÙ-¸CÛLW_YXc¸QÔÈðQ‡ÁìÚ£#AZ(³ð8);̘9|¡¼íw¦ïo?£×`»c/ö¯ã“ÂZðTÚœ‡?Á“zô"F'سž—†wV嫵°j†©J÷&g„'!Ò$™4Q˜“0ðx_‰;-±?Ñë1†^tdš‘í2^ÌLFñpb|R¼ëD¸ã‘F‰t®œý”µÈèƒÄœOÊÿ[§Ó taaåÑkÄFدةæÖ9í%zqH­ë!ºY¥<3èƒ)aˆÝpŸ™=¹Ô-¿ÊÙ¡ä†È”ödWã¬Ý.*c.n}“Ù‰“O*ˆ©Q|LÓA!6·–ž˜/-t̶íXX2cJ( 5혼œØe0 `}1çy¼o=#~K«DH|owI¯KàÈj«ðÃS'ZïT‘ÕÀ“M¯bÚ“-9ob¶Õ-Çà*Z”¶ó´ÏŒMøÃ#æ<ϸ”ŸÑc3lk â7€°iGÄø0ãaüñŒ' †Éß}0D®íÙr<ÍØ{­s>²öš ¤qV ް3Dv_™= sMu5åi`ÕŒª¦¾Úœ´Õç¯#³j[ÞÒ^{‘qqLöòr ê™'Ž¥Ug—Ì0Aå¹wZôŽ# eϓ܈wpo½3D„fvЋM­&.X'Ƀ¾ãuÅ·½/u”½UIˆ)!¡5 Go±žöv´YlÁRíÈw®„)–ª·*~gÿÀ¾|=0fâQ½ñw’øâ¤b¬¢qf.“É#Üñ@Se}Û\M5XgËa3ý æïd“‚½4zgB#«ó¶Æ .E¢ºy÷N’di$Ž%L{A;]X•ç¢é¨oájNžºÝc‡ü™xÓJó¼D¡t¦ƒµLbÓ¤-n?#£ãL(=8€OðÍɣΟ4j$c§#1ñæ;¼bs–ÇØ !ñføh :Y^&Æ./âð‡)}8B‹!*Ú@Ÿš°¹úKàKRí2-—IH$óæ8s™Qÿq¼%B)blmj àúÔ¶E+"²j]ްu_ަTþQóR&ý@ö€{ªkÙ~.(c¸‹)÷æÙÕ(ì}Çf¶O'£¨&º¬Úv,wÅJä«<¯(*'{ ›IË­óWE’K.liFq¯z¦UÞ¬L—\RœÇICrÉô‰ãåYOR;ªðwsœ{§…ßqIõ¹ÕϽXŽ€.¼cäÅRH¦ßqôRÍUZµG/sO0ÜðjpožwிïÌj!)gfn`f5 ðŠ]ãïØT]ºÿ (q»‰ËóN8ôž*J)e[T%¡BE¢Y%Â3—™p³ë‰¸"fÃRnffÄ2 láí 4Ï®cÌáΌƖSûÛ¨‘¢Ëøå·ªÍLå6 p²0byÊá˜æÕéø87j}—.sc*ˈwdt#·g¡oO¸68ÀÅÃ(„[o‰êÖ$JȃGÅÉ.‘*XLãï`|`Ô|Òô¯-Ë‘ÀópG&.„vÌ K¸S©Š` Ûgˆyd²4; G˜B‚ve“›)N¨£Ûx*˜¨ifGªØïzsÃ~â¾ËUŠUy»zýÌ4¼ü§·§¹á¦Y¾aXe‹;¢ãs{êÜ11äñ) y¢§5ÇS´wgºÒ»tøRõ2máZ}ˆcxš¶ì´ZY¬ðtš`ðCsE<Çw§ÀUóLu>Þ¤g<ãé¶ïÔŠNsÄØKáž&LÌ†ÄøfÄŠÖWp]-B1çþ0¸o…ÇðTŒcÄœel>;'ƒ‰¡øN1ÜðÍ\Ès‚°6†ï§Ä0€pÃØ+Ë!±|Ï„sÙ¡9ŠIØO«®ìâ}SÔ º5î ©¶Ú˜Å3xì=†§`þ°='$f†bÎÎteJ¥}3¹óàCM¡—)HŽCÕݲޤ§¦¬ŸCn.€è\T3n­rØÑ:óŽ³ p¥éÜ“q¬ oÉãÇ…ËŽÉ'Ü_Ìæ úpOsοGøŒFØaµi;w|øè‹!àWê¹8¸% bç@ö$´¿èÃS\zÏOì¢s‘ Œð;º&H"àâà"¦Ç²™DG§ÎÔv;pn5—:SÛMSÍ-“ÅáqHhî ¦Á ¦Àcx†Ä=yv/–ë“u;»"/\?À'˜ÏcìÛ\—z|¥š47õkZL2p„Èå  ›ÂªÂzf” «1ýN6»ÔŽÔ1Ac(Á-éT½=›ö¦áóí{j¥ˆcÿÌ€ØiÖ‹,–{nà|Ÿõi¥T¦°h*/SïKåPÔKo5#nß9ÄÈ,sÐíÇB&©P‰Ú¥ÓŒ¤ÎQûRPážžeLMÜ$±ÔÝe3Ãe{¤ØaÄ’óa¬(¼RÏjL^+A Lª‡PÖ¨¢õàÌóøYÓ‰P3£r†€†o²Å†¼¼Ž:C¶‰Mª–Wß,ùÃrÓ!Ì´ëeøSÙ²ÝÃj ƒ¥?~gˆªš±¿?ɦsüý–&«ÏŠÜD—Qñ\­R¯id{‹nÜâ3•2³+w[pðN*švÝ8/Ì+ÚÌÔCL»éŒ%ôÔ ‡u¹ŒA,ÛÅ`³.3"b^¤qàö82²tküa&ôä¹É¿ú†sá/µ_#Áz§>Ñd}¨®‚Ƀ0Ü)‰¾ý˜¥Äq5†ÜE¸‰ÔÄfñe Oñ`š¸>倾U²²2 q>Cü%ÓU#U:F\M%½;¦éªU9±øÆÎ{½¬GFç–m¦¾žQ¡=¼%FWë.²ä!4+ÑVkÂS´Ö'gÚCªˆ`Q±«`B6Ò/L)É%h‘Ÿ£G mëðNt4eË4å›`ɼ Œ¨HÕPdÞÞ$04é|†Ã‰äu²‹Û̹—È÷*µIbæ%P@«¡ãžSK!Ú®<Ÿ{j?;¡"À Lœ˜‰Ñ GtdÓ[õaO%W™!6&j,QéÕÌðcB'£¬&ÙÚ€€ v‘B­øU…É(Fé¢r?˜z¶¨mº³ ì 8¬Án×[ü”°U§qn–CìŸÇÓŒ.ÿ†·ø> endobj 5431 0 obj << /Type /Page /Parent 2 0 R /Contents 5437 0 R /Resources 5439 0 R /Annots 5440 0 R /MediaBox [0 0 595 842] >> endobj 5439 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F8 8 0 R /F9 9 0 R /F1409 1409 0 R >> /XObject << >> >> endobj 5440 0 obj [ 5436 0 R ] endobj 5437 0 obj << /Length 5438 0 R /Filter /FlateDecode >> stream xœí]IÜÆ¾÷¯ès·Y 7À e ‡‚ääØqÃ2¢ø¿v“lÍýY_¿ZØC ¶ä)±–W¯Þ¾|ÿ§Oÿ8þë÷ã÷ï>ýçøãðû»O‡âT—EÿÏñüë»ç?ÐÍiøó±nÊã___»ÿ~=ô|z÷—îOÿ;ê㟻9þíïÝþÒù/|9Ôªî~ÿõò{[«îOÅõ÷óÏÿ}øëŽ¿g—6óòÿ¿Óm[TÍy K=ŒÇT—_¿ÿøÛáû~«”m£LuTÖØ£j­>þ÷Ÿ‡Ÿ»Æé‹Sk•ª+[÷,TëóJº±Òíìål¡Ë/™éU€É˪ 7ùeçâPé.V¹g—¼Üª¡ßý+¢oÓ˜¼il¸É/;‡Êx¹xöSc2µ.íù¢Ï—\6îþ\›áŸûÎÕžéÆå5m°]§p'­²/ü²sq¨ŒŽg|Í­iL º þëì!îÖ–M¸É/;—ÊpµxrÉ›­t1<Û*ÄÕ^§ý& ‡ïw.•ñnñìét‡Vu4Ó4Àv^üNª¢0:îw.•ñÂg³ô™o¥ÿ Ð ¾:>|ûùðý‡Ž4¶ÇÏ?w;»,ØÿöùËAWÇïκ@‡„Ÿ:þPêýŸ9¨n‡•.ûýõ#ºE#E})Oºê‡¾Tþßà-úÆ”ý7æT«¦~1ܵ2pEÿ:•Ým>ÑpïM©ËHu2ê²g³½…°Öp:OýHuj:lêÆ¾í@û¯3Àíés‡¿÷¡^§?U·PÏ=êµz¼Ä%ÚS=á€zÍx²g‡Öpäi¸£µö›w—{²¦~yU*Ö:jDäaº5;¨ÑˆégkV,ÌoIY-éwWä´ÕùU¯ÙlOÌøÉ³ ŽG˜;@ ×™e M^Ï Žcfõ=™NGð=©†¸A sŒøñ:qëj$¾UÏ›¦,C•§bJäßÀÙ–¡Ç¡5ï¨!΃_A#ñ:nCÔLQÃñ&àˆ(K> ·,m=a—ɉ°– ÇÄó³ÆŸ`äw Æ' .Ñ]π7,ºYøúü†ä”V`@2"že{Ý«wn–70‹uP8FÌÅ;€²#æRè wmKxs -©ãyb ¸5s–.2ÞŒƒx3›€ U¶špT‡ƒI‹”’‡×Ya²ÚLÌ}SŒ*G=!,‰0â>1–D„tFM"h«†tŸQû(ûÁyîî×HÚŽGòšÖ ¦6­Ô¢B@º Æ ¶ÜGëˆù€–o!Awã BùÞ®çn„2Mi$‰…Vç1Bcíßí›Û∟~‰<¦43X0lŸ!qëµý ¥`TÔˆè@HB–4Xdg¦×¢»v\˜(ÿqˆµ˜º1’6Cáãk6ei&<1–×1qysáj KFáÙDõaó8&òøâdelQ £-ëd?4WÁâ(–ýàle¿ƒödf¦›M» ‹+ÛÁâQ¬~ëEfÆÏâ ðŒ?'‰m¯œ²ÀM¿‚ôz"esó°÷2t6 a1tøOdm±J™ƒbç,ŒªFõÚ4#¯Ë*øˆ`—ªJQš½å‚›¨¡*CÂð¨6+f(V¶@ˆ[÷œÓ¨fäÍ@@.»{qÜ·p¤E#ª†#ÎöDÌGŒ!va ýÏ£áˆÁ'ÅЉµë7›Ü5ă~Üš­‚ßÀ½iü>øŸÇÀóà“š·©ƒ©÷óhwâ8( Àß” ¬ñ«‹ð_/娇1àŠUÛ1«%µapÑ@Ì΀SÁ—ŠñW—Å'ð rœ4súm•¹ƒ~STÞ‰ƒJãuàÝÇÂe ÷&ŒI©´5×T¬ˆTúœÝœ¦w€1RµÒïœ)»ƒ‡mSoaNŠ¥¦Ü){ÓÞCÙcÉI˜àYŒHWË¢¹ãNdÏ- ß,´‹RÒF‰scø:´ý˜°²ò𨂠¼*ưSGælnçzÿÙy5éà÷²1ù wY”ØB&_TvŠ 8Å£‚¨,³©ìžyò#sŠæí1¦bJŸ²|+ÍfŠzx&D-LuUYiEVìs@gÀaó\1¹[_)Zµ•ª³Zt…$'* ™)SÂxåÂÖÁ`x—#œ ä¾ÊØ0Ì?_[z¸˜ÈÀ‘#„á–;ßm²3 ¿¾+«ëm“ïîE—œþöï ãÎÎw9L|u|7OÜyUÖ€FÅ:÷È´=2mSæ¼ëMZ8qÁǘeÛ«#ßÖ^Êz·ye„ÿÕXÔ!¸ ÞõU7Žðfb‘ZU½áÜ*€íÁRMqv•å"WíÈŒÁm¿Â™÷fÅ"ßW`RÓ܃IøÜ8ðRT|Áá6ïÞÆÉÌ$«àƈ –ø¶ˆÿmðñÜUÄUuõ¨¯Žßv¼-Ì[åDÔHóÊÞ‰½–7Á]žÊˆû©ì=/Þuw˜Ó`×ì‰ùÆÜyœ,œSGÿÉŒ)T4cY$üI¡T¡ïÀËœyj´Û"f‹õž£b’ ëL°aÎ#XÊH¿·ý<’”ÛÞªúšMA”lsXÅÖ—.VIXc÷–Añ[Å*"ÎÀ\C¿‡£  ±ªB-aƒOïÕx¸š~Ž#ªtäú’¸”W(.¦„ä|u=a}سæxï7f Žá’àÂA*ƒ¬BdYÏîÞLî5ug!nÎáSö.í'Úji]•«…âè{ã+™ÆWéŠöGið²a”m§ú¡hÙlŠÀÍ´¾`zzÈÊó"ÏÉ¢’õ§È¹¹œ-ÑyÉ ¿'YQ"Z>†âP="¼*šN(<³0BJÓ’íBØ$ÁPÙŽ~g‡ÌŠe}Lþ!äñ–L½MF\Â,£ô'BQ;‹ddŒÂ"¥S©Û#4,ÊC>  °øéÉJFÙˆm¦ 7¶J`^´ƒb£2¨2 Û‘“+d¬e©'œ5Cÿ”LWrYEDV flšÌyd©ÑÀŒ‘€B«ÆŒÏ{›×’¡6#Ñ—{ȼÑÖIØÉ[AḠmÐÞL‰¾Áì·¶Ç}™ubíš‚¨èIcti¦<öû»™ôAÙWÌØ°“iˆ²ægFßôh!ä@7ænE‰g ó˜Þ­øiGjKÛj³L^)Ó Ö#ŸüÙù_‹ŒñõfFúáÈk6JxèMQ|•BÔXÖ’Çx·|GÖûˆg›ºü}Ú{c}c}èDΦT ¡|Ö;SEgÈYô¢Ú©›+†4^ ñ ߨZ¬¿9Ë·ŽWÀø”±ÚÁHT¹²1­„-V™ž;øÀ)Qµ™<8G»/ÜÔ çÃÉèÍÈ+ƒ éM=•ÒÛD…ƒl“ÇæDˆˆ+ëÉíAº®ŸþÃaݰéS„[JC¾ìˆ)›‰uDê‡>(£M$'+‹¾p‚ÓU{‹à誧7µz¹d'áö†ìßUž4ˆX÷úfèFqë›~c¯’Ó´Äâ[x¾)ðzꥪñ~§oÙk…!ŠO ×PïÖ:Oð¤Ì:ýSªOf†üxCÞŠT©³5ÅXß;úl‹`¶sòä!Ta±^"²BØq#ë*Xß­\8/‘1î1±‹¢u9©|¨HÙ`vD=”{C4;†± Ç}X ÑøwamÀ#ô&¹Q.NsÐ0½)+Œ=Cqba‡áŒ0¶Q^YŸC¹ew Bò^MÖ–pÆÒ£%šgýGûa(!A’, &9ÿŒþ4¯*' ”1~‡6[©t¬$ ytèOVÊJ"²!j²z§¬ ‡Dì+ëƒ<˜[gÒQT¬¤Ön#XúZÂH„B-()(96ÖAŠÊ—l¾”šê|ÞËq;æÜ}ÿåP/~ðëá“C#Aœ·0¹ÙLËÙ&¯ŠŸ>/Z€miÇX¥X~?ƒH¬·lãÙuˆ¶Wé3ü©®7Œˆ*Ø6„€Ñn ìŽDÈ„2—¬ $vEÊjÉ:Ç0/‡VÍè ï6/ì„GQj&C/cÞß²}QH Û” ½ˆ$T¤ky”ÆB²ÉîKZŽß~üÃb¬Å°N.Ÿb¹Ñ!øN7‰;»ž’…žùGÌÞ†M¥—ñe·–dm-É™ÖìÒyÛ;…Ü-9?ì–œ…u6gÉYHQiU=^U€[E‘<Šd=XÎ N)§²2öJh^ o¡\x¤$áâ™a‹eýž˜:¨8•€¸Êô­@™Z—˜¦8Ò)d ¯0õ*Ã絘rÂH©xùe¼ˆ¤çØ')ø/ÛÚzYâÂq‰-Ø„öÎìË––ˆNsXJ°Ô‰ý„ïÍFÌ/h›v\ß ÖpážÍbˆà`«7ÔRJ¼Æelw‡:©ŽåU®Î”䪎à &îã/~ D]4O4 /ºN´èÌXú{$ûJzm¬ˆ¶h‘–gºa« ‹éå69/öà;,hx6Œÿɱoçöœ‡Y–ï:ì¿LÞ‘ÝBÑèX¼àÑòyÏ”ø[é¶X™ZŒ´‹¹!Yí´ÆI7oã‘EÓFåé2ÔK ¢pÄ2ÑøeAÚIÅüŠz‹ñü~D«><—–»_ǯ1vÒêKa…I³¹EÈ2§BËÔ¯ñ”ß»e¯í!Wß°Y÷gÕc‰ÈÙ®æ#C$’> eòžáH¿ƒ[†Ê÷h³d¾µ·ÃIQ9\ìN±S¢‹ë"Vó}kúŽXt …gƒß ÆåuôúÚ²wþs·ã—Œñ–£V7Æ(€Ñ£€áÝÿ|Nž]4öZÁ À(€/ͱNsÿÔ…9 ÷ùMhˆÅøaýœŒ-‘°ãÇÃÿVÍÝ” endstream endobj 5438 0 obj 5477 endobj 5442 0 obj [309 /XYZ 38.2500000 271.250000 0] endobj 5443 0 obj [309 /XYZ 32.2500000 359.750000 0] endobj 5444 0 obj [309 /XYZ 38.2500000 206 0] endobj 5445 0 obj [309 /XYZ 38.2500000 632 0] endobj 5446 0 obj [309 /XYZ 38.2500000 206 0] endobj 5447 0 obj [309 /XYZ 38.2500000 632 0] endobj 5448 0 obj [309 /XYZ 31.5000000 360.500000 0] endobj 5449 0 obj [309 /XYZ 38.2500000 271.250000 0] endobj 5450 0 obj << /Type /Annot /Subtype /Link /Rect [174 326 201.750000 332.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps >> endobj 5451 0 obj << /Type /Annot /Subtype /Link /Rect [293.250000 248.750000 321 255.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps >> endobj 5441 0 obj << /Type /Page /Parent 2 0 R /Contents 5452 0 R /Resources 5454 0 R /Annots 5455 0 R /MediaBox [0 0 595 842] >> endobj 5454 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 5455 0 obj [ 5450 0 R 5451 0 R ] endobj 5452 0 obj << /Length 5453 0 R /Filter /FlateDecode >> stream xœí]ËŽäÈuÝ×WäZÀä0|†€ž®n^hL^^#K‚ nkáß7+3˜UIò\2N݈`få ¤î)ƒ7îûùó¿þú_‡?ÿóðóç_ÿçð[øóó¯OÕ±­«ó?‡—zûÛÃßmW~ûûÓçoO߆ÿÿñt~á×Ïÿ>üíÿöðoÃÿþzøÃ?ücø¥—_øûSkÚáÏ¿þì[3ü­ºüùòó¿<ýÇïÿxYqü\ØÌõÿä†?]ÿ²•OÿxiNÿþó·<ý|@ÜWšáïmw0Þùƒé½=üï?ýiøÀ¸|uì¼3®µµþÞ7¾­ê®³Ãß[þa?ÞÚCÝ÷½kÆöÕÁuÝìã§u–7Ú‹sÖ'Z|ܹ:TŒkŒ¼ú±÷Æ´/ýÌ:¨0å ¶IþËê)î¶©"ÎiçÚ@9]­´¸æÍ¶UÀSÏyÆûôº|‚Å»¦J·øiçêPﯮy¹½3@w×Ñëòú‹›ªqé.÷´su¨Œ—‹WO*„ S§ãÓ¯«§¸oÓ§#æóÎñi¼ø±kÂ?ðïä§»—ïZ?h-Þt‡ ù³†Áù'@gý!¼øË÷§Ÿ¿ÿÂÛšÃ÷? P9}óüÇ÷á2êÃO/Šjoßÿxø—ª2þ÷‡ï}ê­Ç-&yÒ '¾S}OžáŸ|ß[ÕÂ'=\­ƒïXøÎgø\MØ5üÞµ°7üx ß¾S øÄÁÕ0&bP«aLÄ'Å÷cLÄpÃçÁX…¿ó‹&Ø>ÁïO¼¹ðäË÷i§æ·ƒ„Z¥¦Õ;ɳSw·óeŒÙ˜¶^®*3öÌc=\ÍàÕ༚ǂwPÁ'Ö5þ–&ªú“…çÁO„Õ°€qÂ@ SÌ)(ðN QHÛ>ÁÔ(ÀѹÖv‡ãûþN9>Öe„Õ˜ºóÝI‰â< ã¦tA'ÀwŠOºg|+Ήu% æ”lc Šo›ÀQÆÊfôVû)£déÚ4Ú AϺËPS€|”<¤°c9þðö²g½C”Ñí0‡TÅ*5RL ð;˜æ„“ÂÕ/Û²p![5iô Â~ ¸P&Ÿ-uR‚Z,Æe椄FšMº3)!ðuLYxתzš ¨òh¯±G⥠bº´ à*5R1"j)ÄI~-Hd ¬Fx^=ï-§|·õ:|±Ò¦#$¥²†Q\S¤hóv5EïWõÆæft;Œ±8rúˆÔp‘Æ£GY¿ºÜ Œ‡ûþ…“Bâ³ð “+€÷†=âÙx'áu샜3÷Á6nÎTŸ`(zBkó~dI0ØsVP…w°¶·<ÔÔÙUêÞG&‘«Ì*fc º·Xtùì#††±Ü{‡.Å„Èvùˆ3ãÛÊk+ÉÍ]ÇSrùl™Ûf4JŒV‹{#Öí«3ë®/!“óÑŒ=zwªõ}%¿³qÖ»¾:íôç£uS™ê޵oº¶žcÏÒ"pùÓ×僸[XÞ™éNÎwèÇÓ¼YÕ£'Æ–vbáøÛÁ`(é¿>:ÛøxKóûÂçŠØ qéA|F40Ôî]8…Q(ðƒ¨-aÒ`0Æœ‘ظè¯Oàj®™@è«Íðaö‚ñ÷„§å> D𥠗3n -âcÈâw QLÈ—Öð/¡t«™ˆ7S¼B•ë ˜†™áŒå1ת˅ñ$qû‚ä ˆ\¼7¸fÇå•‹Y(PõM«ÂeãÍb9@\6Ã0‚àÕœ‘×¹H›ÙÁ3’!F»D¦ Òb¢Ç·0åæ9^w£k¦mêëåßÁÒ:ṵ̀‰0uD¢&•¾ÈÔ¬¾ª¦jû ¨ú`ôXŒÑI4tˆQ©Ÿk»®-¨¢ÄÆèÓÕ2”u‰í fØWð³™êØ´æÚFÁøÍ—Õ6ëÛ¾£ÕíôÒÉÖü?ÍØÊ;÷uůÿBˆÒâ{#cËz†“„q)üNMKßùOÚ'G0k'&ÀýxáO}&ìæèNDµé~CBH{t@8,¬v£çÁÖÂï<ýÁ]Æ»´7x ¢nj8¾b,Ô~ì+ÊÔª„ð(=œÉlëšÝ,Y>¡Úù@õ@ðâСZ×hJbúúdreݦê,ä¢ÞäyîßmX*9u~bÂqGU•è8£³5R6²ªf"Þ æÜÞ¼ö5;茢Áä? C (V9/„qö?Äô’¦> DK‡ßâ8F±ä¢5wiÊŠ”ЇéUlÞhaŽú …X¹2öïŒG(«Öå+Q°üÇ8JĤŠ)±ŒÎ¶Û~Û‘N`F„—ñíªC7v“OäÜP"ˆ (\ov±”ÍbÉÄóÔnÝô¹Lé2wâB¢z°‡ÎGi.˜²ì$dɾŠÏÔÍuUZÏTèv ™£YFé5¦¾¾µ¸1XŸÑÜ}[è± ¿ÃŒª½ø÷çï¨ÊtÌð_Ý¡¤x$.|B%rRãÐvŒ‰BWy¸ƒœƒÆçW)ñd(ÐáñÁkQ¢MÇà²q<”±8ç²x,6ži€©Ÿ”Á‰qçd8±2ïdS⑺xØ(þN&šcFË2ƒÓ…½a.ÆŒÆÔ•`º:3ò›˜˜" ëÅç°Ö¿âZmºþì ERÅ⤂ðÞ†Ij$@>b–âI÷Üæ.S«?ª÷|Ä W¢6§½Þú‹ÿeÇú#¥%2º ZEÀÈ7fòº––Ç®ÚDº÷ìÔBˆ<,J‰ê°®\c=1¯–ûú‹Ú§jÃáy~ @LÃÄ SüÓ a_V˜š ž4‰œÈ‚}éÞ}Ʊµ'yNçÚñ†xgÔÁða¼Gç!ìonøN1¯`¼ ˜_2œ4¯¾›ÞoÑõöú“Û¾P=)#¼L&ˆj1¶ë"’•ë—IÔÁ¹LÎ0“ãpƒ-ªÓœ0-°T«µwàÐÚÞ-IÅKÊð‡GÂÖž¶2T¦z3›ª“êQ#˜÷;¸)6Q áç{ åñL 4|t¢°!¢·+#öØi[£tâB]Œ!#Ë2:å Ò¯2]Q¸ËðføúTA2mþ¨ n¡#qõºÃ«˜ñYå'Rf¨N.©¸¿Ñ\-C©~\=…’Þ;×_fKÎN$`Þ½åôàó0½2 ¯Ë €ÛvŠ$)&ª]b áÝAg%¦EîxÉ\uŒi­9Ê~MÜF£ó4SJ7sÜäÌáê›±FÃá\\"@ÈÒ…ßÁÑ8ÉÄŒÈ µ68§Æ6…< &‹ÇPqÜ•ˆâZµ˜ãìëÜ:ö1ÁO0öÁ¢ä0£Ìà<œéwíá<<Ç{Ãw¯Z…c0¬!Æ 'ÅÙ{ÄjçÏejmˆûÉU %ð[ÈíÊç¹0y—L=Ky¢[!Tc|crü ý` ƒÉõj®0ÆCˆ®®–C†šA`¯ëÅk•w“K¥Ä…UóäŠcâΫæÍ è¼ÃîzTÍ«s‡GÕüÊ{~TÍ‹;xTÍ?ªæÕã[¦ê/QuÝõâIâA©œØ:‰:{.íž#£³Üß­šP‹ÜL%Ê2Wn„ ˆUAôãû!o.'Sö•Íá³cEœ*l%ÊqÏ”¼êÞ6ÃCt x¦˜P÷Ns+3«©*ÈÊÎ ¢tTÁj*ím¡ —sIqòD8>›+ޱ7*%ˆ;enÛ%ô‚ëRPÅÁ&eîM¸*„“2nxœšÂ»Tq[¿˜|xªƒ3ÖM'½»±\kª ,<©ÆÙÐÍlʹ‡ïôè@˜Ö2+_/d.šæº°ZˆÁ¶Ç¾›ì@x'LöÇ™>ÁçÁ;§Ð/ÀÚÂï|…=£‘5¨ô/ê;¹æc{iüDùŽÒdªdȦ¨‰Uª1ŸŸ8b°3¯$íÊ…SŽgMˆLüˆ,[f*3}‡Êæ…—Œ1{25+Q™ ÆšPâ†ÝÒDyÇ£üõrÒ”mÎs¿ÞÊ,‚åéÌCb¤‹ê\yÝį̈<ÈŠaáãæVøÑ¼˜uLÀO¶ÅTW2ï¨t¶ˆaÔWš«ÓpŠž´^°®i§Ì»%ö_w‘r`³÷Heí§¢ˆQâR·ÞИ»•­jPÅ”LœÀL¥f„4Žè¥ÚªŸéÝ@©¢³cì¸ÅALþÈö¾l‚M™6_…™†(0b«²º¦#¥÷·¹êöò­wªá^9SfkžBLªÀ3L­COçÊ£¹T)ŒŽòòQòD•Éé60ÕíO“ë~üó+/zËl̳9ÿd—2Û¹”ëú —Âêð~›N^Øø@f —sžŽ9ðŒáýAÂ5þíþöô«Àè ÙÆO`¿Š#õÈ„7áïö¹ìUY„y¾¾Ét:Í%|m¿@ɶã/ºmH#ì.Ê"Su™y¯pPmзG?NK®˜þj ¯šœ¹<¹ÌïlMý‹»­÷«8¤qÓ¥Œ*Vv"Řø+5âb{O+–X ו;ª¼‚iˆOµÔ[ç¥Q0³¢¼½ª Y©ö»º1Å?UD/¾[Æûªáæ Â´*=iU§bdkg}gù4”jÎ'…$õÛº©¡¨<çg;=PȈ¼ ]–À¸ØC[ ë´œÓl±)ïÊOüÆsÕÀcL,™ÝáÕ„ÑŒ"ÇðýýÇÑ28çê±Cí½%Ð ÎÝñaºÖ>ꔺqÊòÃM»$¿îÌM›ºŽâ–ü¶¹–·‚("I›÷®“â}ÓEbÊ%g…¬“:cû‰¬ºm8ø)ïãƒ%:K ®¡Ù Wæ€{+…ñáÓvªS©ô2m8Õ† K0Ú€ª“AЕ˜,țơ\a¦°âLÙÝDæw{óدU~$V„^ËTU \ð¸ÞLÆÕ¶ƒÏØ€vá<Ïð üN Ñ…ïà“Ž­Ëc¾cƒ:âÇ€Òëjç´GŒ÷%<8¯Ö݉æwšžÔU¢qtºÙ¤¹¾Ã´Šœ2FÍUí*M•ˆ0€ÌTᘻ)j.ÛsþÄw HìÒí‘Í…Ï8÷±rÇÔ1ÞXgºÚ؉èBÍLØñícÒ>L–àGè½ÖVíft’rkïµ—sžŽÙ„Þkmgßþ Dïµ—-\Ã~µÃZÊØR?ÝÍ-ön‹â»öÕüÝì:¢œÕ[&&Ÿ«_ÄžÇtgÊýÏe—ïË*¸%“èv]uhš—?ZcÂOy]OG~9üä·§Æém×™Ëo¹«UÜÛo ¿þÛ½¼v˜¾mgß°/ïLv2üVwµJwý¿<ýò»„cM‚Ð_®fmrÊ)ýt3ºl7#-r‘¢äî´„™nz(VØäÙ\ümÑ©LRµ3¦$Wµööò>POD@½(ꙨD@}õ•¨'" ^õLÔ " ¾ˆ€úJÔyE@s¹ 8ÏÙâIÏÉûç˜PŠþfŸéð>éÀØ8o‘É»Ø_î¶Î= p9õ`ý[Y;aýí"ëog¬¿]`ýí…õ·W¬¿°þv‘õ·3Öß.°þöÂúÛ+ÖßæeýÝq—ügøÏ4ܧ qÝôÔAò.AÂ$&Þ ëú8ö ßc×P•Á“ÛÑiùÁ¸µ‘1e~YÛ.‹}j”¹ú÷$ne®+‘ÖŽ® “õ¬_ÔÉú™NÖ/èdýE'ë¯t²~¢“õ‹:Y?ÓÉú¬¿èdý•NÖgÕÉšj‚ ɧI[èù­Œæj!a$¥†fu¿ájxåâAº ã™bKÝ?1@—Š|Ý”…%—FΣ§*§wYmíÛn¤îÞ$º©6)ʳå¶'aRI-ªÌ=W‘p¦ÌÍ„`>kZÜ©’ Ô‰ýé‚(b‘íÝmuô¬V¼“2ËÃ×›_®@Ê›nú3U)Qí}ïðÛ£§^ÕÐÒ]4oÖ^¾ ½ñæú“%ËÐá„¢é€ÐM–1í±·“'°˜9`ÂBi´ïŽÔfºk¦¤ü¼ƒ¨Âq\pq¡;àâ@¼·Ïè`/ÁÚ¥–©¡Ô»iÇÕT©·Š[붃l·„VSšþW»PTxÄàŸÎØVBËpÎ »†XFÝX6W^ë´ö{HztÙ#_@xÙL‰•€:LF2ÓJ\¥A¦Ž¼1U1ŠEe) ½ÝTð•/mRfò7É(s BGyjSb±¹›àà:~á Z‰aºí 2IÝyÊ-fsK<Õ$#=7‡oLÇÖŒs‰W+qÖîÒ;>©àœo‚¿ƒ3^`æ²#2—1 |‚³d„¬jxRá†ßÁßqn¡A]\ö6ÌÇ·€ñ@8ÎSÇ‚s•Úxìõ0 àj¹hŽùŽÁÐÁ…;` ƒ) Ó©pRxŒ †à<ŠN×à–VJÔ]?øR0»Ã)†cÆ‘+1RØCNe±ÐH†3töÌîXCá&ˆ 7, 0SëµÈö\:·\zÑÈÃ'‹T)•{”kVU1¤;vï>ò ‹eEgË ÛnÖ ˆ¨b🗽Z|˜2ìÜϯ,V×)›Å¶Âôû-?¸‚ñŒ>˜q*~ì N¿xûNñHs•ó”Ìbx˦ò³USÆ•;kçdâ™CLR#‰˜j’íIä7ÐJ8ep5µLr‰MÝ^uØj±‹{ÔULÊâ³}?°BW^waºøêF½•Ù1cã$ ¦ bFôªcí’2ƒ[­é×o("Ã0B[ž¥8 !¢épê ±í"+QíØ¬ð€)|ѯT2i¦švªJùB¹ÌŒø„A¤›¤¤Ü98BGSéÂŽóìLçf›2#™Uõ“w$E¥L¾mf’ð>Ê(ïÞ»!”þ7aµj;ªÀ˜1)”']€¤D9¾Yz޳œ‹`—IÁØ%¸á™ÙBPÔ „•É+ñP…¤ûYå2I[›Wn*I¡O„™O*Dü‰ZEs§„¨p§\ô—©6ÒE{Ãey¶A«á8¨Èbék`É sh5|žq,ú‚*áoA€¼ ƒlcV×è(ƒ'¬ë4‰zÜY ÓxKÕ×NžR’u~Š̸=Æ¡ŠÑu#1N;›Ô-&u{/ärÀ]c·ñ ¦IxAå30ñ®jW¥wê,á=wWiKéG{ìG{K“Ìs¯t˜ó:§Kz)˜þ 3ŽNDÓ3d%wí„¥—7=…Õfê´Ãjx ܱ64‘ËRCÝy;²’L‹{®®¶x¸@>ªžˆ2efD·efÔÁûyÔjï¡V»|5ònjŽ£J!eÁ‰Ê‚ÓʶÁœ·Gͱø|‘•ö\?ܵ£/ïQ?¼Å²’œp*3I‰W= ›Üm‚Üí¯DBh­Éd%ë¬Ç—o$m£ì&,O ÙíIëpdB,‚sèÞËZnÊM*Ü$Ѱ“J­Ü¦+/Éo3“‰É‚ÛA®›®RQ*Aøóg Ô®¯5lUÚ¥Úì`ö¨:Ã7½ëfePô~ }úÓjººŒíî“$R»2%*•ŸE™­GQ®Îk–ÁGÖ·ë¸Xа iy›¶ax~&.«|q|&ôßA+žŸCÌtxˆ-ó_·þ/—1|ïžœbƒbcTáˆh€ª˜ç9Çô.wê ž/Ÿ”ãðy0t˜ø(Õ}Œ<Ïsgi4‘4š•ÜUk'‚ê‘F#ŠÊò­ûw ᤘœ0€{ÄÞ³&Ü,f]Ä$&Jaaö•6æ~(…BßœpÛ{±*ƒaaqGàUåáú¦x"ÜÝnÐ1ÂUº½«ä0äÛ#%ïnRòÖJ™˜4¾”9s¦›pǘéÛÛ R)*{îL©ÚÀzÁ ÝÒQÕ Ýáµ³ê\ª Œî¨ {C3‚¥ {ùúør5vÁï-ðw)Ìœ”)‰V†»©nOϯû‰ÐUž±!ÂÙW±˜ÆiZ´3Œ&[KÔ‡Íú>«Ñü†j$F´‰è ›xÀ¢rU’j²Ó7$²«™~Ü\]»ÆLcÚ;Etüa„™j¶áž³w(&¬Û[kMš0{ø÷ðc@aÿ­ýÂè–(À d]™ñx°—9çžè|Cí&œ•$;o*œa í¦Ýsx'ˆç7wgà=<£ï¸5­lio_ÃIgB—K«V=E Ì9›ùjà2EL8 Ç0x5øN juôömY„{ùû°ãqç_ ùB…£€ÅpÀ(€Qú BOv ¼á|ø> endobj 5469 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F1699 1699 0 R /F8 8 0 R /F1700 1700 0 R >> /XObject << >> >> endobj 5470 0 obj [ ] endobj 5467 0 obj << /Length 5468 0 R /Filter /FlateDecode >> stream xœí]K$· ¾Ï¯ès÷–õ‚žW€,v‚;N`ÄF6>äï§zZÕ3­ªOUú†’ª{Ú{׫-=(Ф(òã§?~ùûí>=|ùÏî÷ë×»jßÖÕñŸÝáç»· »½ûý®íêÝ¿Ü}Û}»û|÷yøï·»ã_þ<üî;½ûÓðïÏ»¿þmøÃÝ_:ü…_îZÕ¿þûå×¾UÃïªÓ¯‡?ÿ×Ý_~·ûõÐã8œ›Ìùÿg*5ü¦±0ô·»q™êåç·~½ût$@Ü(M¥‡Ÿ²ÆîToõî¿ÿ¸ûi`ì¾Úwûþž¼; nM= ®ºÝÌȽUªml[½g‰­> SwýNé~èiø×èåG¨û·m—®ó—™‹SE™F…{Ü\SUúH m[y½vŸ€þFÛt›{œ¹8UÜæzO+3ŒÕm™ašƒHÞüÕub šž¬>¶(5.y •ð2ZØg0Y:¦’êÐöà Œó¶­ãÕš¬2Îfµ©ÃèêW°-Ã#XjáËpi„Ÿ«à WYã‘; [ñ!‚+°Ï¢D5¡-¿ô\®ª~”PÎ}0ãXQÉXŽÃÊ鄹ßæ'G…°¶€èíJØ ¹^J³¿"foŸÒŸ¨ÀëÏx¨™æF…ï(øUÆo¦ÅÀן¿ •‚½¹í›ûæµØÇxê”§ùÒó¤ŽÁtkà8pn\©…tÃßàqû9¾jK·|qË}FYÓèe*ÂÓ¤‰·aÌåÜáÀ8—+x6ß|Ñxxž1—[|ž1­ážZ,Qð¬ñ.@©(˜ÖxçDiДxÖ˜ÖPN^)Ž­€‚[ð.`º¾+Å\v}FiשÅ=)¯í“Dܦ¼®N£>fÕÅQiÓ|¸] èW<þ†ÐTÏš‘wpnš¸x°e$^i€°¦Â4 ô+cPúŸ<Ž('ö‡°Xºm™ãñþhl–„Óðé}Žº¯,·ÈÎ ÓÜ";ë驸EvÞ";&{©‘¯ÂðÙ). n‘å";¶^ƒxOaH„ª|œ8ÎÀÃìúÈ”é–â#ÎÄ?o¹E0¯ØŸ„Š´Wµ¯H7|¦n±ÑÛŒ¾‰î ‰n™pÑ«B.{@6ŠÈ±A–S®züˆ¤°› » q vbç­¨ëT‰¹ÌTÓÃɦó˜*~÷įØ+Љ…Ç©a |ñ¨rÄKèºöÈÈZ ;¾sðQÆç¸Gø•-;ƒ9 s‰Š@`ÇM«¼…±‰G¼¼ÀÁ!óÇ ütC<þã•ÖbA÷>µ}ãó)>Rðõ'p@sH™ÚøR¦fž|ˆpAæ/˾ÔðH¢ñT±öÀ-„xcÇß`و߱!‚׃·˜ç'%jxOÚFg8‘]eWŸHg¹f m1V/2Ö mÁ—h¨q@—á#L êe!ÒðíèBóBhg_0Ç㕉 ²20>¼?8Ômé§Õ`m<–9Fi®E,vÉÏÕvçRyîÁ¿±bÇ,ó.+ëË—}GÊ΀|ÏÿÒÞ<f°+‰ˆ‰Ç™<å¡TPá[P–™¶™Ø‹„"ï ëÎeÞ-ªc?ù+¦X Œi8¡„˜†¤Þº˜3,;ƒ¥×¶¸ âL1d²t›>Ã2¡D¬ŸË=êvÚξ¶ß ¬n·<ìª=·VœÌ˜iq”kö.áÍ7 ü¦Gß8¡¨Ú©Íèæf÷~¨ƒ‚ss\ÚîûΟÁ=êÍñ¼V(^in¥OÎbó7A´¸ÒeEæ0Då[S7×ÇÍõñÒÛÍõñžç¢”¥0u·ÚZÞ`>^¼^HIËÞ®V©v’hâ·pt³hÝ-‚54ḛ̈TB¶ã, I_>M8Ïæp¯*ã ÃÞHµí‡;%õ/uÆ#Nk’ËZò`šÓîä½$'\Z×zKËŒ’/•üÎäêfÂa’ž#ÀW®-ç]6'AX‡I¸H®ÄÝÁø;ë:";NDàBSEa¶®ô’2Ç£ñ…+9ïÌ1oJ¹òõ+6¢¯7E³¹e²{EÕ?%#X‹b‰ÍL Žx‚# FJ ÏGøtF˜¬ 623¡Šðl6ã®õ†, a g€”uÒËì÷è7½=äš„‹[2cP[áYÌòÓ °žŽƒ÷Ô@Šbpc8 DÓî‚{>KïEê«S%D}йMbýŸ©‡HFïe^¶²Í:“/ŒùˆXÓ`_(þfôTßKŠ[ŠYˆ¹²`_i±°"*Q`&¸·eøVHGÙKçEãa§ô€Tµ¯è® àjn‹2áD–»×nß§w=ÿ")™ÌÂËBàºR·Ð´`Þú,‰€Àe‚Ó™@$ÆQ#h€b­=Íʼˆ GšË¾‰^(ÃvýQ-_>\øš±þ¸֒ůë¹ì†¬ì^«ÕÜ%{&¶§©äõÚ‘ Ü]zhÉà Ô-ñ ¯ܹ¢»– æR,~3<3¾1bŸP¦¤mZsˤè»áí#2c·_K'ƒë­ÓËÓ,ÿ–D¤˜LØI?û¬êUæg4•YgÄYàŒ»+àpÃh†Ài¹xb„L 'PzD,«}ÅÞ·fyï·ï8⊌±¦êõ2—â–+ÃŒº¶“€ôÅ¥206æe<¸sï(«åd(¥Þs2q¼÷pOraÚYÌ/¸hæ B–Î3SlkLk|1ÎÚX{^6ïâX|î±$Ín”_$ðœ:ƒ%û†í]æt« ƒg çf £۹<üß‘1!ó®F þ—0Zoܸɟ†d^¯o¯Dpf¨é‚~à-ÆxDøÞsA‚aô+ÆÅðö;cÿbqîÚò+õáÖGH1Âm²)RÑz)3!•¯…É-[@$Ûæö ºEQˆŠˆH!ôcGÉÔŽ¹ñæ•ËC£çÊn0F75Œ,½ û–¿á¢5¹ðú)\D†¸Eýö2k”]΂l©°ÔpÅØ¡Ã‚KxÈÚ¡Ûy¹kލæSÁ‹BÀþ™iI€oyCoW>›AM¨aâB@:^f°ÿÍ«s…±£²¹¥Ä%?À× E‰;ccÉÜûˆXïlúÌÁ-_[sƒÉX?0ÖLâhúü‰ÊW­ç¦A¹ AþRϾ<ðÙzƒJ¸”³q‹nÀ½ÀŸõ×=avLHBç26Q@½È– ‰€#ý¨¨ <‘Æ"–§˜KRÁÚ,}ëS¡”Så›Ôxé"$"~.,ð,˜<ºí<æV8H— 1Ä¡ŒDØ(•VÃÖÆá©0@—Ñ´8”â`J¼R ×£1uˆ•šÎ'RÀ¹Êr㹉Ò͈…¥ÃX¶ñ•KŠKEÊô "êÈ¢.í²x¢ppx¥ˆØ¹¹ù¢Ü|“Táó¿½aÆN½Ef 9Ué øl±ägÈžH¢ÚíÕ—ó¥00°C‘x¥ö/³œ“ðkaÕ0F·¬"z´³•8ÍÄfŒšh±uÙ3Å¿*Å–ت#^•°1„ãÀqêQ+oi„“/¢Æ˜llòe†ë$ÖÔëx`@ù±¹+iN`w™øvêl¬7žq5DªÌÎ]Ããˆ>)f09üÛ»H¼#2#iíŸ1"´]æ°-2ý–…íÔ“¬(®í,‡½`™«ºó!¬aÏcÒÆŠâÓwDš}3©BÞÁozô NPíT«?£ÞC·û¾ó[4üÆ 8ó~®Ó¯ÇyìÕ'Ÿ¶àÞðJ˜ë Ò 3Öóžéí®Ò:°žö†÷Òm¬ô-Ó›{]Kï*´9gþ8ÇBq#”Šæ,öT!Þ#œ£¥. Œ§†y,c4)ƒ§ìÐkæ,L&c`}V1Sì<†UeÝ¢öS® ;Ƨ°b±­ŠåQ.o\i|Ý»”ú§3ž’å1”yÖæÀ£Î‡>rÀÌ^ Œ4³“Gg”?‘¶·¤ˆ |¸ T0ˆ,j#™3X*Ê•Ø[ޝ˜2f‡‰˜*–áE” šbõ—ŒïÿrV,Ú`Ã’![N®ˆ¿î.t™A¢î;1Þg“ÌDzQ~‘Ûcj ój6xZ{*r³EÏ<ÉÔÃ!$CŒ@å\Êw³Úç&´—òË{‰JÀSÆ—pŶ Ðn”!'[j5â”;›unKž` &š †xD »wKQ1é#S¼vßǯˡòÏ¥¥Ð¹bo0ä&d¹â»w™X3¡-ƽpM1C0#:¨ø¹øsL.f[ãWøo œ{ 1ûj"{–¿+ˆâ¬]sE½èö›ÑVø„á*(ªeÏ8bn…³¼þVR hŽw±JŽ!]ÔYOÅÈj|¼î yÈð?1P(8ï¶Q™×ÃÐ@çìTSlê=Á¯nS–!ÄED'ËpåvGÔ®–OÄ.ÌJ8·˜íÇDaÌåLäšZxØ aö)“vGZ]Ú7¾.ÍnÎ0&¾|ÂÞ°£ \ÐÜŒ[ÛÈŒt5ð›ÉM",Yˆ Œƒ '|ô3 …¹l@>g„…¹Œg[˜»¦¨ªžœhTš‘¡Ô†Z]DPd6÷ò8ÿL³Ì7KWèeÔ&s(|¡UUçø: <-†ßíT?‹v V8¹¹0ýj? íïQ‹{³©÷zr³ìâ¿qOÂsßôpœz´+Ž~Ï…<§:Ï%:¦Ì´½iØXž[ƒ¾©îá75lшÖqà¬tÃãÏV³7/æÒªo3`vÎS40ØÛ˜h3ÓÛsüJqªšQj¬á¸?crN¿áY‹U¶]xªoÔˆ>f`Rï xè%7w]É…2R¼èì4 ˜ ;–Qc5KÅîà]gâcã™âL(8"Qäká|&×#S¶C14joyH«¤Ð5Æ×QLù9| p˜—Á„C>¯ ›šF%ÿ`hèX€: ®zDèXñ5ÔÒ™P8x\…:ŒÖÝÖGAÒŒO H»#9ׂá¨!À·Æ0Þšë†ßhøMá›4€ÒÌzŒ˜sfÅÞwÍ{h…Íao†îÆ@íx‡!a¾ÄÜgð¬Eù›ãYã9~Y¸·VmFDo9÷D“["ñG${ &q—1˜tB"OŸ¹Ñl éç/1YJÅË^ÞfeÝö§T•‚+¤àJ,™T®RÕ[°Y¨ô±aCÂà]Èh*vÊ\­6À±¸â‘(ÇæàŠƒ°kºó!ç BÙ ~X‹bmSNïõ)o”q’)«›"ñ²AAº3›¼å;Dñª£Â5r¹÷s¡£È–xf®1²øW¢s“Åmb^ù’TMM©7›ÆSœ“‹ £y(<âÛÆ3Mg¼$h¼ F'a-Bå¤G$¶ã£Ä œ^ОŠ”°›@DnSÆmË5¹o¦V>SKXƒÈãù1E{Ûy:÷º\JýÜD*%R]ÍàEj°xd0K±åƒ3Ï·?UQTöž±þY+Ð}D±öÄÇTŽ­ø#m~w+«èŒXFÑ’×´óá1„,þ®—pÑ]ï-:—ö°Ô“©rkŸ%®:péX5Øš‹™‚!s‘˜Š&ÈDëk5&)÷üęŔ .^ƒ>[åJÂ&Kƒ-¿C•‹?Æ“å ¤Lè}[þQ‡RåŠôÉcYeÉG\Â)ÿ3¼PSZù Ý}l ©@ôFE¬Ï?Ìæša^†#eS·ò ¹M‡^4ÀsÒ´­^}Í̵{Wò˜HeNмÏ1NÑ›aðÊVêØ‚C•î­o}â 4‰ƒ“q0[^ÊeJ)ŠL£|Q”ÂQ“v[«²¯Þ³©­Ã‘°¸åšXÄ£nà˺ÿ"j<ià²ïË¥^Ê›[Ó ¦²>—ã¼>f>á95Ö¬>§I\î‰7¨íÖoŸ†“òAMµÞ qIUuMQOì¢E°’ÀN¥ôyêÚ7P2ÕŒžZþ t9Ã>åCèÖƒêl ŠUb?3S~^ôQŸªØHäŸS2æÝoý†½­¬5üì¾ ‚$(g>/ý…‚¨›Õ¡ÊìÑ3Ìw§Çä\w3·Ä#Ó´=\ïõfôMË1¶¸Â…zßLU1®ì#Ç,ù«çæöìVŠÞÿ±ü´>¯`Go3] ãüx‡…ÈÌ2î ~ãN¹ŠZúøJ–á¿f<ÎÆóiøœ‚YÀÝÆ±À#b¼¯î<Û5d†Ä 0Üš±BS©£,ìÍIñ¹o`oîÅÏ®¡,Þ¸'$qðÀ |LHH.µäfë oØXö¨¶•Ý;1ÿöÌj,ïœå€ZœÂ[Rv»ÏwÿgÌ”{ endstream endobj 5468 0 obj 6435 endobj 5472 0 obj [311 /XYZ 38.2500000 482.750000 0] endobj 5473 0 obj [311 /XYZ 38.2500000 482.750000 0] endobj 5471 0 obj << /Type /Page /Parent 2 0 R /Contents 5474 0 R /Resources 5476 0 R /Annots 5477 0 R /MediaBox [0 0 595 842] >> endobj 5476 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 5477 0 obj [ ] endobj 5474 0 obj << /Length 5475 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾Ï¯ès€m‹"õ‚~È!€a99Þl‚Evgùûé™–zl©¿Róëb‰Ò(FâÉÐ’Èb±ªX¯^ýñÓßÿüíðêí§ÿ¾ô¿ýôP›ª8ÿçðøç‡oQ¶ÇþçCÓV‡/¿<|=|}øøðñô¿_Î|zûçÓOÿ;”‡?þûóá¯;ýòÇþ=þƒ_לþþ÷Óß]ãN?—¿ÿ¯‡¿üîðëã‡Ïõ“ùþÿÿà ×µîq3Ÿþú0,Ó=ýùí˯¯ÎˆûJ]ø®..øpp](ÿýÇÃO§ ¯/ŽmðÎ7eN?wuhŠªmËÓÏïÿÃ~¼)/_/»ÓVÔõäãOt^ïô_ʲIöòóÌÕ©â|íä·'ÞðÓË«3Ñg¢¿'—×§xyÝ$|ùÓÌÕ©Òo¸ðöcœk7úQr^C× §¹lèòúô¯\×¥Ûܧ™«SeØ\üöħ¹òÁ'ßϯO±áuѦ{ùÓÌS‰oáí©7¼q!¡ø~~}‚—×E“îåç™§ßÓ·Œy žÊù7ÀÎü*<øæóë.'™Y>ÿtšÜÓ7Ï}>¥:üðhgtÕáó‡ßEéþpøüóCw¬Ëj˜âyÄ4Rx8òŽtð;-|¦D#ÎÀÕh¤ÄëyGÞ4ø?7žÛûÏ'J¼÷á´±³ôÅñp ̺ ¸'˜ûJHyaS¾‚ÏÀ½ÇÏÌ}Þp‡OÚäŽÓ ×]b~yMì=~œõ6|ºçÿ]ŽÝÁåUy—/¾÷EŸyŸÁ#Pó 3€+-¡¶. ­1/cîópY[–\Þ¸Y~)ày‰)¯;’Á ÌØú˜µ$¢,–~Ćc»y §k/ì»ZŽÅÏr¬;ýƒžŠX‹ªê‡u?a÷ ¼ í…ŽàY V>øb9ó?s_t:–÷EW¶wð¿ÀåXŽá‘œOÓò#ûyÎú<Ï¾Íæ<‡fø*s3†¶™àÿ´ ðlVØ:4²ñ Bg¸[u}Ïn-o“¾?ä¾Ý1ËåíqÂ2Rà ¬[vü‚tr€'Cxï¡N.‹!êÖKy…¯¢O†âüÉj¸ÖúAD7uõD…1»µÇ¶+¾éÙíÚÈyÂ1øsÊæ3ƒ¼ƒ#5ñ€Þ&Ì¿­A#=[+­´wƶ‰ˆŸÁK÷\úy²þX…ºmnÜ–É™Ý8+ÌêèËÖÝÏwx˜ïàHùa´@‡éç¨Ôí-“†L,Œ`‚N>Œ²‚Æç /ƒ`oeIõf¼Ç «B¢˜ELH¼-ðmœ–zû j³Ê•#uÖ{šý±S*@EÇü†…,"dÄäšbò Lxêük¸ È¿X‚3ú”Úc,Eà®”-œ^Ö*ÒžQM·«Â•”Oö‡Û'K°Aðñ†Õu-ñPY]fºáþdv™© ±g45|¦„áüc›äv“‡2Eðùg®9Ø:‡Bqy5aÉ —NâÃQT5RB¦õ¿xFdAþ„òÔ·nDcoJÚí§_߿ݫŽi[ÜÅnaž´N7|ßÓã˜qXb*ÁïLiÁè*F”㥷g»w¥ûpIWÙXèE2寳âB©¸ Ó Î ¿ 0¢Œ"’_7óë^åNLÀü"œg¼Ã8B7af/˜R.˜R–(p·WÐÔ‡š0§„âQB‡ oÉWpnÙ¤dÙh–¶ž]÷:G+‰I:ÂVNn" [„ÓdÅÿÌ d’û଱/|‡±½ñžb ƒ°#(Z7v2 •ñÙÜ­KñŽKX—Øz±ºe`‰»GzG‘’¢œ2½¸-´jT-Ã<W9¢{juå­0ÂØ5_â·UXª®Ò²Êù®æ­yGi†wµüìº×9¢{WøÚO¸h‡ùÁV–ƒxÖp$àÛâšõsÜJ÷{±ö½s/äxÌ×+¾×åüV9²R¾äý56üÒº•pvåºÙ³¾N=¡i_uºP”ü~Aq{bnÆ· ¬_m¤ƒoçwk•#9ûƒñmzÏ6س žf`¹gäàÁÚb¶AUm6mÙËóÿËñªä~'l6› ”±ÕGe`/éž°gÚ(«öÙHÕn«¹U{€Ä—ÔÙdbF-ö¸=/j·ÕL =n¿Çíå¬3nOEÀ_TŒ ö[ÍEô&cU0ž?\ù‹9 ÏZÕBØ#ˆ+ *…<|Võ¥Uܲ3Á¸jŠÁíÍ`\QxuQè<âÜ€õpÃwüYíÞÉ_O aì) ð1™,ÆjÂX ·CA1h[8Æ‘³¸±”=¨Ò3Ç üø¹Ê—8¼z²}JÀ'ßöJÀO%€ ÍÀÕbAòx¿Ú3g­:·ô8¼¡ªF|´ „'B÷™q4üÎòøÑö1Vd¯o×yª2f„s¬J>ÃnY3¼*¶ÿ,æØM$Æ‚@åÐ6ñdó/hžÛå±Ñs…“D¯+üØÊMlÕG eC€gÛšiâ€é¡p·|?c`ž5d¾š ØÊªW8ÊÒe¬ |¯Å"œ™ÁøÔPZeò’‰½hDP,ú¬úé6¦XÞØ´êÚD)nÕÜaiøËfv'²=Fæ27Þˆ~Œu©Š3ÿ⌯ôw Fݨ:cÌ”¤‘ÓA¥ „@”Å¡™÷æ´7ßÑgá°GJUØu#]h&Ô­Zö$¶úf>×F“W`’ÞùWëÆÝzýé˜[ãý‡o‹‰{®¹QKNoLœÍÄ0ÞC–Òˆã¿Ó7ˆN(ÒÛ> ä&‘žK4¥[sÞ?_÷öÐ*× qyWá⮵+Í@4dk/ÈT „h–ÍœõÄaåô:¼Œ!c++ |¢¡IÃЫŒ£Xi溩Ҹw¬pNß­k™ÝÙ·d¸#q·nèëÿ®`xHîp¢)h³öðÙx%aûܵi›ï?éŠãyƒ&çÊHÏ#Õ±œ¤d´ñÏàô¥…WžéÝÎÏŽÃoÞ†gýôÛÛýDH½¿÷Î_ó^{ÛÙ X½+¯Jᨕ ß)àÜଊžÅŠ«Žgn½‰nÄJ©g*¸Ò­G˜ugd2¶å€åà/L9qtGä6cÏ7c]Zi l0ö~›ª'ŸÉßÄß¡<KŠ bL¸+BOªdÝëZ—‰$xÓ±Íu»eE%ÜNj†a˜ {•еè»]7…:æ\¥G×ÍH©®r,§wðS¬OÛd#‘úo–¥SÁYc×®§%‚øŒ†“)mÁÏèmC߬* «›¸ÒI8=+ÖµPâLÊàw¨Æú”Ï«ÔÁŒZcêãŠ2Ö—'"m6¦oc’‰$aA]ãïlÝa,ä 㼌Üvƒ‘¯Vaä6„Ù¥å™-6Ü?/ Øu÷6å ¢•¼ÒuIíUÖ\µ˜8¹#œB˜ QIüئÃágÝì¡åO vÅ×Jª¾¤ÈUÇb!} ßvNwwå0d¨|áŒÌ‡lî<8Ñaùˆ£„t"Ç8—3´æœ&BÜñ…šu‘(dœJ¸¥νÔPKª†¦’®Ñ±tÊR½ÝEAÈU ¨±YªOW ÞÞ´×ï,­­u–Té"µQ•LÀØŠ¡ P4´¯àT° 7ê&Æ›„É <޵'Ö©3Ÿcf•“±Nøl-ļY͈9u‚ÞXÄ©¦®F êî1ÕêWe±Èä3±šuÖLá“ÃÐ@£šO¡ËÌ5­rè·Ö«ý™3ºÖÚÈÚ¥Iò¤®Å3HK"ÝWÏQÈILqÈò©<0ì“¡81Ç bùÕ#0½ŒÃM·äÜP‘CÆó²à]¢*ÝH¯ Áj¬æ1SbÿÙòB×i ]É£Ðý0k3¸ iµdΦC†z@xãþ1ÅY‰m#¦4"ðn¨ÙÀ„F¤ÀD¾£/¨k56)íK »®)Ô Ò5—‹@TÈ·‚LÇG‰ ‰M¢É«ªÉJÛ_ŪݕdÀ^Û‰ƒW£‚Þ̯» _YB¦÷¼un@ÝaœLÙ{ÎåÐÊ­ëˆÀ´¦€K™½R¹ûP'ƒ)ÖMÇÍ6Ò¹`†jo˵›5$dŒNÐ%$q½d.41À–ª÷2&î!Ðc“í® +fõ‰ ²¸ Ì9©}WµÚª–Â<~‡ø€‚“g|L<âvç?ËfÜ L€?"ÜÁh"#žJP˜h×:…ÉJQk•òŠç|5¾ãED 0Épø—±àUkÛb—Óã`•‰#Ln”NžÌè¥~º¶Ýºå¯Â+½›¨ú*… ³RÝ4J]ºa › Ô1 P ¶6.ëvt2•yB5#…ê¶Ë§¯Fy¸Ö]njìYùòÒ²— VÖËIc]¾%¸òa‹Ȫ4¨2Êc\¬X/#ÆAKäø çir94B–WF‰ß½dv)Ýj½ • cÕgt¯{¯µ´y´%A[*!–€§…‘iKø¶ÅQ› ˆ]¶<êÜ,*  WtU®X[QÀò6¤o8‰–ž¾˜¯0ú6Æv†ôÅx}²'¤¯ð FkǧK<ià1J-Ʋ‡ÏxHƒÒ/xÏy„8zXJ?Pà>ü68êmªË ¥ãYg/y. :(NZœ¾XwcüYAwcy‰gW*X)Ö¿`ôKùtylÉå›åÊ>Å—é_BŒl±¿Fè.óÁçs)FãÇëVÝa÷À¶ÜA¾`¹ŒŸ!f³u‡m¸€­;Ì;†Ö]Utwð?Þ-A‡áBVøûÄ]ßìlîçysç?ÓÏÍæ<—— ,£Ïr>;ÿgÍÿï¶¥> CGÁúVõ/XÉÿ î¿ëäXxÿÅ>9SŽ­ëyŽeì¬c×Ê±Ì ,mŒ¶šåX¬­Kbq{çXm޵ˆa̤Õá2]¨˜9€‘$„ ˜W1Ei dp ÝD¢'ö‰#8ïJ·ÚA£ÆÙ,ÍI²ÛÓ#­rk2@WQYBr!9”%_v‘R#UõH%QªBóž!w¹À¸x‚€êšf£¡Fè4EÀ¬Xü3ýT옒RÄ ’áâ=˜2H^¾û ¼ùò„˜–— •UÛ5#eÅÔlQxµÌdD¤–jë7ÆÜö Rv¥ÖaLûƒcÌwV=Eã›aÅq$Ñ^D)‹u$Xü˜2—rü U£6gù¤DÕð}õ˳æÙkhïu‚VCžOhg—÷5„P¡ÀÁ 1ÞfF+m…ó¶a¿Ø¢›Äù¢Ì) E#¸M·Î6MŸìb »¡&ËJëB§SLïAeë(o=JbÕ[Ū…³ýÊWS#ˆƒÈç˜bbl »*5{,‰€åœ=·)ÁŠv¤%z¨€MR²vÎÀ6IÚj.‰±[K¤½V™/”eBêà$4Ë?‰RN!FØ–›Í%wùDåtF˜€ˆ9I8Ïx‡q¢ã AR©™Da’W¡$Æ#Wér¡s„·aТ€{£Ük#ñ/ ìËËhe‰­lY1Úüe'/[3æ¤38ž alb¼§Xóú¢µZó¿yÐÁølîV_!fvZ€÷® —Ò•…âd·’H+‰±kðá5À¶ ñ ËlŠÚl¤÷uyy»[p…$Qv n·àÒÈ€PŸÍÝ‚£„ß[pVžæ ¬1b·¿écd.°åòö .ô ¶w»sÝqF V»y*®rDWBêê6a„±! ¾Äo«OhÆVlξÏXw™fy/nó‘9ß‹­˜qäÏGQ±…G¶xÖ¬ŸãVºû ´}˜{çZ Ä}'wD×ͯa•#Êw\â¾Jµ üV¶™/Ó‘O/æ&Kñ´×…VPOá•R¾‚{…¸©*ïlÙkpúsøzR.¢îù8÷nÈ–o¯)&ïü±pµc‡rÈpèm™kÅ0çµ6WrÓÏ\Z˧F»S*ÔÓÿ®¦¯]ûfÎ3¸Vrð}Çㆷpnú•NÊçúb\מ§TÀɺ~é“öì„A2p1Á•e8ü6øL_f࢖þ©Ä2Üãϧ3¾Ub9ÈeE°À;Äx_{án!3$¦ÀpkÊfÌ{¶;GYø¶¾žìÚ3ðm}q¸…²xãÞ#‰ƒ?\Α^#$$—ÃRŠyÞ°o4 {T›Â{1ÿí™-±¼Ãißô‰Õeþ|µð endstream endobj 5475 0 obj 5550 endobj 5479 0 obj [312 /XYZ 38.2500000 633.500000 0] endobj 5480 0 obj [312 /XYZ 31.5000000 217.250000 0] endobj 5481 0 obj [312 /XYZ 32.2500000 284.750000 0] endobj 5482 0 obj [312 /XYZ 32.2500000 215.750000 0] endobj 5483 0 obj [312 /XYZ 38.2500000 633.500000 0] endobj 5484 0 obj [312 /XYZ 31.5000000 541.250000 0] endobj 5485 0 obj [312 /XYZ 31.5000000 541.250000 0] endobj 5486 0 obj [312 /XYZ 31.5000000 285.500000 0] endobj 5487 0 obj << /Type /Annot /Subtype /Link /Rect [60 505.250000 94.5000000 512 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn2 >> endobj 5488 0 obj << /Type /Annot /Subtype /Link /Rect [60 497.750000 99.7500000 504.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn3 >> endobj 5489 0 obj << /Type /Annot /Subtype /Link /Rect [87 491 147 497.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn4 >> endobj 5490 0 obj << /Type /Annot /Subtype /Link /Rect [87 483.500000 163.500000 490.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn5 >> endobj 5491 0 obj << /Type /Annot /Subtype /Link /Rect [87 476.750000 136.500000 483.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn6 >> endobj 5492 0 obj << /Type /Annot /Subtype /Link /Rect [60 469.250000 142.500000 476 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn7 >> endobj 5493 0 obj << /Type /Annot /Subtype /Link /Rect [87 462.500000 109.500000 469.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn8 >> endobj 5494 0 obj << /Type /Annot /Subtype /Link /Rect [87 455 112.500000 461.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn9 >> endobj 5495 0 obj << /Type /Annot /Subtype /Link /Rect [87 448.250000 129.750000 455 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn10 >> endobj 5496 0 obj << /Type /Annot /Subtype /Link /Rect [87 440.750000 144.750000 447.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn11 >> endobj 5497 0 obj << /Type /Annot /Subtype /Link /Rect [87 434 108.750000 440.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn12 >> endobj 5498 0 obj << /Type /Annot /Subtype /Link /Rect [87 426.500000 159.750000 433.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn13 >> endobj 5499 0 obj << /Type /Annot /Subtype /Link /Rect [87 419.750000 129 426.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn15 >> endobj 5500 0 obj << /Type /Annot /Subtype /Link /Rect [87 412.250000 154.500000 419 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn17 >> endobj 5501 0 obj << /Type /Annot /Subtype /Link /Rect [87 405.500000 125.250000 412.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn18 >> endobj 5502 0 obj << /Type /Annot /Subtype /Link /Rect [87 398 165.750000 404.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn19 >> endobj 5503 0 obj << /Type /Annot /Subtype /Link /Rect [87 391.250000 125.250000 398 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn20 >> endobj 5504 0 obj << /Type /Annot /Subtype /Link /Rect [87 383.750000 139.500000 390.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn21 >> endobj 5505 0 obj << /Type /Annot /Subtype /Link /Rect [114 377 192.750000 383.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_smart_pointers_shared_ptr >> endobj 5506 0 obj << /Type /Annot /Subtype /Link /Rect [114 369.500000 176.250000 376.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_smart_pointers_generic >> endobj 5507 0 obj << /Type /Annot /Subtype /Link /Rect [87 362.750000 195 369.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn22 >> endobj 5508 0 obj << /Type /Annot /Subtype /Link /Rect [87 355.250000 108.750000 362 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn23 >> endobj 5509 0 obj << /Type /Annot /Subtype /Link /Rect [87 348.500000 144.750000 355.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn24 >> endobj 5510 0 obj << /Type /Annot /Subtype /Link /Rect [87 341 119.250000 347.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn25 >> endobj 5511 0 obj << /Type /Annot /Subtype /Link /Rect [87 334.250000 130.500000 341 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn26 >> endobj 5512 0 obj << /Type /Annot /Subtype /Link /Rect [423 313.250000 465 320 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.gnu.org/software/octave/) >> >> endobj 5478 0 obj << /Type /Page /Parent 2 0 R /Contents 5513 0 R /Resources 5515 0 R /Annots 5516 0 R /MediaBox [0 0 595 842] >> endobj 5515 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 5516 0 obj [ 5487 0 R 5488 0 R 5489 0 R 5490 0 R 5491 0 R 5492 0 R 5493 0 R 5494 0 R 5495 0 R 5496 0 R 5497 0 R 5498 0 R 5499 0 R 5500 0 R 5501 0 R 5502 0 R 5503 0 R 5504 0 R 5505 0 R 5506 0 R 5507 0 R 5508 0 R 5509 0 R 5510 0 R 5511 0 R 5512 0 R ] endobj 5513 0 obj << /Length 5514 0 R /Filter /FlateDecode >> stream xœí]K¯ä¸uÞß_QkS#>DŠ@ _7@Ý@FAÛÎÀð{‘¿•D©J¤>–tî!©º]Ó°»‹’ø¢'ÒÁo¾ì'1k8ÑÁ¹I8ƒÏ艶èI Ÿ4ð eÖx ÷ï›ü´ÿIB>Ào üŸÜƒÄ pobÿÜ(ð&)ˆ±¯C˜iG!+|Ú·Ço¾|ë }v­ìa¨*3Æ4C †1 /¼Ô»  ÌÓNÄ%1aÖ‰ÓÆ´†Â«){m R‡ÖŸŸ\JN£Ð ,Á%à¯JŠÊ §à?Q §‡Ï417Ê<%Åû’bzÛÿ} Éû„kye;žQ V`z{`Ü|ÊåäÎú§ý¤Äž;}ÚyhJLЋëÂàõ`ÙS¸£*C¹(sKÀA¢ÐA^M‹¢ƒ%è“,F…L#ÔaèÆ‘­s Î íð1Î(ü Ö 1”ãYÃ'ß+<2Oß·Ò§ÜÉmï¤hMǶ]šFÉÃP;fÚù˜0F·©——V²Ñ4u3LS4“IÞ“4Ñœmo¶m\@wî\3Ì4¡@ÞÄŽ~Ø|ê‰Ã$>‘¯áÀ;àG %¥ÀÏÚß­ˆÜ$vâúÉædDÆœHxN¤&‚¶eIp˜òP¾ÁA¡V þÙ@s"Œ²j¹Ê¸$ãQ $ñ„°ÒTÁ'‰Àõ€ÈïqØÊ+Ëa%ÞëNà¹í`yxé©B|®ÇZ]¯¤JÞˆ²¢=7N-¤2'v÷ž²!yÅã¢g!añà‰%±ÂP‚RDG¼ùx|,O¸;Ü%Ø2…¦EäÊÈ„’2dA¬’EbÙݰý—Ü[ó®l¢Q€¹žÁWìÅô‚Wì…Æ»ˆäМœ0ß34h3/í„Åú&>‚6¨D€Au‚g’àÖXNRô!ä%h6ÕE{A¸­¢ˆš ˆá…?Ž›šDxí‘m¬ú$ z$£œAŠ) 4^i)µ‚&‰Vò]³ËÒ­! $lårƒ÷D,XÉ#ɬ_ÊæÀBº)WŒa÷¤ý£À«\Ÿy C1&ݸ7^Ù«¾FÒb"œ Üöî°Amg<”ËüÏåuh Ð‡HÂ'HÞñ.íæ×9mR= Œ´”a¯´zFé>qà„{Wà·);49’Ô+¤QxsöÌqû1%8-6oâ£Å†OŠ ó¼pØ5ðÖAá‘98{{žu…Áé Þ¿ ÿII1…°*,¬b¼ x+Ao챿Ùgô¯oÉcuM˜Q±í[¯(ŠÎvý“âH—˜ÒvêžÙ"•0;⛬OA¢»³QN¥”Ÿû”²Âš6øÞæˆB¦C¸®GaÌœåÐ~;x…u€kÌ "6ÚQÒÝ žž¦]Xx¥ršk• øf!Ýz‘Røõ0tºø]Vu*Ëx¬Ö|Š/El6&ܘ HŰ£DE°š‹%JJ´#ïd怤»OVCN1FT(Hƒ’Kï}^&¬}S3±— Y!éâšô(¹b’"  •›€7—²‡6þ׊‚Mo–J-VÝi„EHbÎæGq*cN-•Þá ÷œL~Ý\ÄûøÉ²º)©`?Þ‹êÆÕžÐ)fÊM¯~^ýWíb.A‘ìKý8 ³Œ¹y3kÞUS>ÛB´„$±È¾“~¶Ö|“âÝû¼ž«x=Çw½Ü„[9ˆ’v9¤hΣ#"ø+O<”·gY=ºý߈WøCßøŽ¢='uó îÍÇ(›i߯O>΢Gž]ŒgÏ*Òý>îŸ5ž–•Þ<™]›üFÂoH»¿IÌ­”Ҥ̔i7°J¹aÎl=)œŸ…äƒU|È=(šsôëCzñ ʉo82äR&K æ¦è¾õ-¿¥âß*F’iéêûŒaݤD½·V^ÈË3x\µŽLÇ( ðv;=ýã÷ê¦ÕýãyŒq0À¥xán:”‘9vN‡ª E†£%yË1gv¦¸¶ò ÷¼èWŠ<~†âÓv÷‘„Ù ³ÊdYs+ÕßübF†j–¹ÔA˜%eÔ"V¼œ•Âúp8Íþ$–LoÞ áYó}…“ÁÂ>Æí¡ÿõcu߉¾Y-Гē(¾f8O¡ú ³ófžÜû¼®ª{€²¦&‘R sŽ˜”÷¶Û²““š6à;{D6ŠóäE08ðf§ÉRãéž«$çJ±ÿ‘`èÈi?J©t$=r›ÅâFΫX¤êûŽhWçu g×Þ1bO:üÚ…A³ÆMÉ€YòæàâQÒöV÷GK½æZg¥|Iß™iñƒ)h“ÐÍ{–nÔò`Ýy˜Ìb á“×ýO<8®+è3[ qPÓ…,0oÒ-^÷ÿÌæc’7éV! ‘b¡ì[œòp{H‘€ŠÝ3W¯­wèÛ <ƒô’7F©*];¼@JQB‚¶ÏRÚ9iM#~3мvñÂ{—)U…Vé𷘡³èxF’‹èv¡úi½Ø40«õ‚dÓ»ïÆ ¡íÐõŸÂ>’Ï{©—ÀÛ¾¢Â@ñ’$¸…“2éÐor21q±ê÷V¥â‚±×Ås–’«)ö=ã !ÞÁ( ¯«G-02oá^)”‡â&Íš©‹ÞB˜Å9–Ä.£ØJ‰ßúé-9–~h©“rÃK©‘|oÖYS8š€K&€$"4œé>뛈ޛ@ʦD¹fâµ*ò^b؇åþ(ÎÍt71K5m%WK}4ñZ{Ä×f²gëÛåô¤Á°2b’g5îT¸Oª9ËF-qìž|&õôhà ¦Óñ¬§ÒÏ.ÂXñ=Áã¨pnŸà ðï!Ń¿· ðO¹Ðc]3u05ˆ@…–ºÆVÕ·ƒSË÷þ£ÆCêü–r‹n¦Ÿ©ÁºFƒlÓ·\†YLfxK/»ÑËa~ п¨‹vÔ9Mg¦Óĵ/YQyÃÕg(¡²f·ç½a¶ôQlÿ[Y×P8±÷”X4lF^ç–Èk›fym#¬º´„È;¼5"çÜÇU?Ìy]·†¼Î†ÈÛ·DÈ;¼¥—Ýèå05‘×6mä%”y¬_L‚ײßÍSjÐSÄÚÈ Çz7“0‰Ñ¯â7“Û˜‰Œ˜æ¶a+éÅ–€ŒôÊð ‘"$#}KDF.oy22u3ýì–dÄözmLFlŸÁ0}KHFÆ·ô²½¦*‘“EµŒlwéàÅêYxßrÉÖãÆ ß-~i•]è—Vu+ú¥Œ"v0Š,5Äá-{ÛËôË.ôK«ÌŠ~iUhܹ´„úå¥mš©¹Ñ/¯cÔÔ/­ž23(õ1Ö›^Ìà-¹œðÛq“ÅÁN±¥°Œ¿™Êyó–'‡ÎŸI'ø[-VëI:h ›¥ƒÖÒAkפƒÖ…l{0RÌýò–çþS7ÓOHm»&´:FÇÒÁð–^v£—ÃT•Ì|+mÂôYkÔÄ+Å¢a3¨Ù65kÖ@-²Yo%Z@Êå-JS7ÓÏ65«×@͆6¯KKjÃ[zÙ^SÔz?'NãýXi'÷Be7]pIÙÞ6l†J§¨tíTFæëÍ  º¼å¡nêfú©¨tj *]dÌq2†Êá-½ìF/‡© •]¼W*ËQÂM(‚%ULÉ{=V¬ÂËN\êšéNLÚæ¶a+.uB-q©z—ºÈÐyÀ-* o¸2w3ýTK\êw~—:Z4.-!.oée7z9LU\ê'D·XÞ%´›RC³÷°DK1çu¤ŒƒQõ^1ôí)§ë;åÕ7lFH%„Tj !{å?À”ÁDàÓå-pS7ÓO ¤k©šh˜&FÈá-½ìF/‡©Šjƒȳ9íBåf¹¿½mØ „­€°•k@é~×ý0tyËÙÔÍôS@Ø6k@¨CMöÒ¡¾BÝÜ^SÛ9Ê;(ÔÊ!G²q8ßã…LXG)™²V´Ó]“jÅmÃfZa‡•ή9¬t‘òÞÙØaexËÓ»pX™†¹Ò ³æ°Ò™Ðqi‰h…™V®Ýèå0Ui…½ï°Â ·&LjFpÔ'‰¹ –d;ÆØéžHšî¶a3Æt—H?Ç5Œ‰ ‹½D†·†·F”Ÿ»™~®Yóøè·#¦‰=>Æ·ô²½¦&IpB‡$ðÆ~R"£( Ìv¢³oFÛÝ6lFi4ÝDV ç­ (VW¸Ÿº™~Ú ¤YCÚX.- oée7z9LU4Pê.dRR(l£JyKÊê+°‘ÂCqªŽqéBŸ¥Øœ 7ïi„•+îÒ5»N˜EÃfú¢× §×\'\dpr:vÞòôC/\'¦a®ôE¯¹N8šÏ.-}ѳëĵ½¦*}iå]úÂÌf @È[7šÄ€ÙL6®Ý:ZwÛ° LàÖáÌš[‡‹l)ÎÄnÃ[ÌÍ­cæŠfͭÙÐ2ti‰ÐÀÌn×nôr˜ªh`Ei4€fdR\–)es~ˆ{ggO·hxƒ/²ôàÞÉSÛÿùÇŸ_>‡i)ǼÎÍðY¨lðŽäv$P&;UI)nWä£ ú}ĸ@Î8Óý¡ê ‡â‡ÙË@K˜}tCƒýûíE{Vz³¡o¢4¶‡•ꔦŸÄì2ÝÏHúïEÄ7û£àìÇœGd1{â8}Û°QJ¶\zâô +ž8}k`%Z)y|k@Ýk7ÓÏ¥'Nß°â‰Ó·6Ñ0‘'ŽK/»ÑËa*JÉý,&OŸ/gŸA„¥êTé’€s¥æ.°X(ŠQHºwx¢ì¨ò©êªy¢0#jwéJ=æO—Þz"H»|Òl£E@ŽõŠOZߪC:©#Ÿ´ñ-Onµ\c-r¬W|Òl£\8ŒŠ|Òü[zÙ^S•ë9 EÁ£èY”ëæ}jy¿ªé2utœ6ƒšiP3+.M}« aÀD.Mã[”ŒX€šiPkW\šúÖ.¦\šü[zÙ^SÔÌäÒ”ˆ°£ä˜ 0í%)˜Sü°¦wæ­…Ù컌éôš,GÜ6lÆ2ë,ëVÜ úV‚¹Aoy,êš–Y`™]qƒê[m8ŒÜ ü[zÙ^S˺٠* ˜ÔãTß;,v‰( J@6E&ß ÉÝt+(µ¼mØ É® Ù­xïXÑÞ;CKÉÃ[R[@²ëHv+Þ;}« !ÙEÞ;þ-½ìF/‡© É¢ÑwùéŽý]ƒî&#¦Cñ ¢°£Ä8;+ÑÌþ=VÝ6lµBò׳¢,‡ ~f®HF*ˆÁžP[“”ªcÏIAÃï­ÞGý ðÕK­+áÊfš÷ž‚9Öž’Ì#áX(É™³oß³æ,<.]Àú(ž‚$á)3cË[†‹§Få³*ÅçŒr*Õ OÖ÷nÅJN?GQ„qoò zB©ŸNICÅ\ª˜ÈÊ|I¶·RB;"€)Æ8B&Aæë0JžEÖí70¨¨ KËEÓªTI´›ôhO9IJºÍ±º—øœÅõ*GsÛRÃf1Ìa "¥Š¬[áæÈ”»>ùŽ¥¢4Éë’·0*Ë^ü09oUÅ„â… Yt’—3?Eï&$-­] ºðÒkå†ÏR$2'»12à7‡I2¿ö A7Ó ÒôHB3G0eà„õ›UZOK„Sü(å…T¿ŒkŽÂfkº oîHæµØå¡ÍïÔ›¥¨zÎòäª ¸VìØBÉá Lps¦–€V9é8† ÇF\^¥éxy«%˜7Ò²Tm³D»ºHœ÷ž™EFÚžáƒtµJH¡À’=”¤EçÀÁüæ;)¦4>S¯8ÌD•¡í"d5cy‚Üsö÷纬}ãà7Þk®-#¢º¸zEýû«¥µþzâ%)Æ®õæ/?ô9rš“pnp=‰¹á•ºìlxT¹T3gá¯nyç1ÊR$\Þ›%ÖLè{Üv3K«¬J”¨ÄÎRÔ A½&Brb¤äQÁEŠÿ3«—KÍÜÙ‘wP*ÖêÛǹ­Ð_îÌ>gØHc¶&1‡·*ò3\Á†$Åþ(œª±Ð Ä—;ßMô,Àb݃&ìá±°{Œ´ÌázÇ‹\â­ÉRÌŽzÁêÒÈ<!ž"1ƒÈù5l€I¦8%½8µ„S/%ßÝöì Gv#‰µjsᄎ„´retO÷D\’CÎa"RH^þ9|Ýv±*ÒÝkº R±*Þ@Þ4WkJ$ Qc¾½¯vsÍâ(Á nùO øE€"yN³xóbcÃp1f#:%2eÇÁqœ1)³Ö†JJð«‡I'£ ¼á€;b$ñ«÷ༀùËlV°òŠ¡‡¢Ö²PXVóM©ûÊ»‚GFHV €9I‹Ø¬ÎkGÛaŠHh¬Qq‘}ëiO{ÚÓ’sÛcO+•±ï(V³|Ùþ–‘­B‘ä}¸o¾?¬Bç¿×‘ü½Êù¸©@±²õñƒ!H¨˜ Ž%b3Gñ„-q7Göü#zåìF ”AèH•" þ@Ýy˜M/b퉃O> '³ûwüÍGôDâq$|ò=Qp¥®41kŸÀoð8”oZ¸; ÎMi. ƒWöB‡–ßM@tÁ˜ÅÔÉí,fìQµÈÕi#àÕ¥øãbH®À+ؼR^Áµ±Äæ{[ rÂáOø !˜JÂ'x=“n—òlôpâ!€­õ’Ox5Ews\\wŒ`ÕÆÓ‚æ-*ú޲Æj)–d¿½ß£øog Å–¬7W¯ëžÐáX¼~(÷”KóCIöH ›Ÿp#} T^•׎9ýZ-':ò µ°Ïð ÔQ…EO$ü¦3Hh¢öVJƒ‡½I<7¨'ökÖ÷ö­ $Íi0$ùZíeæÓda×y = ë \7†yŒ'˜× ¥kßÀÝñÒÞƒ20æÜ}˜gSïÏÇˆî ­‡ * !ã †yl¡+µŒ bCbwJÍž‚ÂëaK².•} Â;B±c{7œ†Ø„•>QxÖ¬j÷Ï?Q–KYEŒ›…UxyKq Møå±:‹1Wú"ØhcU¥ø…Ö/‰ÁìÄ{¶ØF)‹Õ`|§^ê>æ3\)‹*Á±‘dÈàõË8°%íY:ˆC˜j}Ô+”Ç÷Èé]êï·¯ûArp¦ÔÌc½R-iï³zNp„eÍú65¬é⳯'¡§<¤•'áMDÐïëÁ³ÆÖj ;¸7øä½\Â>W_[ìšÙ ÃÕ73¹–Á0¡À ÚBÐi³‚ðN-×<&sÎ_«4àcF–?5óä)ÒÌÕ$ΨPmÄOêió7yÿçô{O“dò—{/l £ÝªgºPçF\¸Öà;8Î[@ÄÚ®ó(k˳,±œiâ'þæJÆ~p>1è=ûŒÆQ÷ÜºÖæöêWŠÌ¼4tH›°¥qÍÑOÂî-|¢Ñ2î ~ã1VìZº½‚-à.ÿnfž-`N^ׄA@`|† ö/<ñéy¦º¶«p¿P‚ÏBIðzð8¸·îí°`uötä($F(Ì›[Šzšž~yùüë”y endstream endobj 5514 0 obj 7823 endobj 5518 0 obj [313 /XYZ 38.2500000 617 0] endobj 5519 0 obj [313 /XYZ 38.2500000 729.500000 0] endobj 5520 0 obj [313 /XYZ 38.2500000 486.500000 0] endobj 5521 0 obj [313 /XYZ 31.5000000 372.500000 0] endobj 5522 0 obj [313 /XYZ 38.2500000 729.500000 0] endobj 5523 0 obj [313 /XYZ 38.2500000 351.500000 0] endobj 5524 0 obj [313 /XYZ 38.2500000 617 0] endobj 5525 0 obj [313 /XYZ 38.2500000 486.500000 0] endobj 5526 0 obj [313 /XYZ 38.2500000 92.7500000 0] endobj 5527 0 obj [313 /XYZ 32.2500000 371 0] endobj 5528 0 obj [313 /XYZ 38.2500000 351.500000 0] endobj 5529 0 obj [313 /XYZ 38.2500000 92.7500000 0] endobj 5530 0 obj << /Type /Annot /Subtype /Link /Rect [415.500000 623.750000 438 630.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn18 >> endobj 5517 0 obj << /Type /Page /Parent 2 0 R /Contents 5531 0 R /Resources 5533 0 R /Annots 5534 0 R /MediaBox [0 0 595 842] >> endobj 5533 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R /F1699 1699 0 R /F1700 1700 0 R >> /XObject << >> >> endobj 5534 0 obj [ 5530 0 R ] endobj 5531 0 obj << /Length 5532 0 R /Filter /FlateDecode >> stream xœí]M䶽ϯès÷Š% °3³ ‡‹] #‡À޶‘ùûénI=3¢%¾)RR¼pv2²(²X¬*ÖÇ«þòÿ~?|xøòŸÃÝß_+‹öŸÃùÏw/¡ëc÷óÁÕåá‡_ï¾¾Ý}¾û|úßowí _þzúé}øËéߟßÿýôË»ÿèüüzç”;ýýËåïÆ©ÓOÅõïóïÿ}÷·?~;Ø®›Ìëÿÿ)L£ÍyŸþv×/S]þüþÃowZÄ}¥*\m«ƒ²ÆTcõá¿ÿ¼ûéô~øâXWÚÙ²hjø3ùq§¯_×Mq(÷íË™ÑU‚Á›B§ü2si¢(S©àà‰w».N‡¢%Yé³Ú›‰öbøƒkn»Û™‹S¥ÛïÀè©7Üô;âªT3)÷Û&”íÌ¥‰Òo7üX[£ŒÓ¥=ýÜTÖe]ëÓÏÎtÿ¼mUeU§æÏ£§ØJÛtƒ_fžH˜ãÁSï¶SMK2]4 ˆv>ÅŽ4Ú¥ü2sqªôûG? íîø3ùíúB³ú$V¬ªcj$)«5ªî·ëô¯ø†½>ÁàÆ¥Ó#íÌũұZ`ôÔnu'ëµM Jž‡O±'•K§JÚ™‹S¥ßp<ú±±J¹óF¿åÂÙ®ÁUM:£ðyôä?Y…é¿Ì<‘Qè þ9f<“ö7ÀQñ-ðâý×»OÊžÔ˜ª_:ÍíòÍö¯¯'’”‡ïÎWU×¾þxøcQè§?¾þ|×+]öSlŸ(‹ž5|RÁ' |ò1~úŽvßÁ3ÐðÉ'ôÄ@(Hf=xÖ% ?‘¥( Ó@c®‚´.áŸ`¾Æûƒi€ù¿ƒ×ƒgíîÅ£Á'·¶s˜nXît4øôõ$´ß&o‘°µÅEØ6ÆöB£Ÿ¦«ÊË|†Û[ë¦xý¤(/O̱´Uí^=iEP=äE{´¦uÆ©]·¬<]«×ßÓh& >),ü0~gþìÆ+n9O©žnÏ’»—g¦{iÆ“Àw¼eT~\Þ oãZèÎ2—ª!Û3°Ý+§æŽ¦>–ŽÙ@©v³MOÀç'¾C,Ð>¡'úa7¼·õàY?Î>âAà¼OÃ]7­PSE?ÜŠÎíòg"^°'TUe¡ºJA9X¬#Þ!Σo:u·Ex´ûùrs''C!Ó „|8p=¦%$NŒ=…µ>æ;BhÎÄ|{J·“UúèÉKo]ð¤6;âlJǸA°ñ†Ç …ú  ]DOµ@ÆX'$s~3Û ª*”jT‚¼”Ö"îv~'pkÁLÌ F~-¯›sf…Ú$ Ej0§È*F|À•RÕ|wsií>œÁ3UšIUFI- q¡®«Œwޱáö›ÕæÔ¹.ëÁ‰Ùª-ÀâÄ%„R7‹Lú$°Ø<2ˆÝ˜]¸ç†¿5+/-Q’Ï€Ñ*²z`Íh„YN dEð$ñ*GgõМÌtÕ PŠÿ].Ì,FL6 Ð7N@Ï,®µdîÿŒ@ÃJ‘ðÈ•ÖÄc¬ãY-ê8¿/¡b©ìE:¥ˆ‡g,Tù¶pû—wp$I-‰ QàH»! é–ÒE¬O¿èMÌ{™k ›™2(&^é/†™D‚- ¹?e gp : ÍßåsƘ¸(#Lç'% GÓ< ™IMÎ%‹xy™ñ(ÅûõA5£Þ½‹®O\ôú“ª8¶žàªä#zÒ‘½<ê¡ûx§ïÔý&zYv÷Wã°1c¡:UõtŸñ¤;l#së6~ä;êœAËâÕÑ\„ÊËw*¸RŸÀtyÅQÅtÓ®TÁõÀYãï(ÚäQ uQ^ï ™"$žd®ÎT.ˆË?Ù¤[„Š<0ÌÄá˜ÄX]Á­¤\Œ+@Ô£`gì§Ìu‡ž¿ý2Ž‘+-cká)¥½ 3b!Â'šÄËŸ2çÙ õuÃÁòY6?j~jfê„HF¼`žÇwxìy`Fc2BJhvÌ?©rŒ¨ë­;äå5é*8ž, ìNFÊW£‡ÔÍѤîËŒÂè1ø€q$*!²ù‚#r§ÄLB6m¬°)Îôß”½çgU29žÅF‘7åŸIDä ên¡jdÍnLê6KŠöS{£Å©UÑ7ì8"×=Y%ŽÈZM®<¦¯)·åaêIž™ÚküRnÍ܃g@ëÀ³Æ+ň2X"à•Âõ§„ÕQˆˆ²¼ƒg`Å2pfX‚un{o²Õ'šÑ9Ä Ÿ ìÁïdÓü„ÖÃrƒ±dv-üÎiñ-¦Ž,Çc^<Ö»„M@y#Þ+¥,tÂ8yGÈc-4Í4}—÷aN"0­±Ü lb| œ¢AjR3Üb,,0IŠ Ì¨m=›¿‘…~£w ÆÚ­ð‚qf¾dÂ;Ÿü³M›Š‘šíÇô/ ¬f0`[ Tähñæî Þ3™³°¨§g¢ÖêÜú«'|­•„$w§aAªq=˜iúKMkd,}iªÐ=J0’ŽUÂÑpv>üŽJ¿¨´GÃm–ìD´Å` ÁׇÇ("“Å<ÈU– Çn˜ÝIå<âZO"]6‡“B쟟LL¡=­©Á„-ÕPäÝÚ‘Ÿ¤`þİŸXÈ‹ÂT1à· Ôeàt‹bQÞŠøŠP¨ó!PvÃn™ˆ1eýêâåÕçŠëVµ²²J»¡öÊ\’$+Ï–7c™Nc.r¢Ê`A!Zwµy»j“ÁWÙd9àjTR§œ3“›¸í»Ä$šHJg˜ÑC*ãm Qû„ƒ„-€Q5 P¸'¡ð…3PÕåaÒÉRéÙzyE bã®x"H½ßg˜ûÝqÍwÇıB ™ÊòÙrøYvƒ!´.’õäŠg‰|†øðb>SpSÛ Uå†4Üf@î ˜*7¡ lÓ“é åaDßX0o±[P.B®ÙÛ‚;€VÊ4Naá^DøK­^Éèö7³„»Š¸`þ “‘á„¿Ÿ2|¯z°%•òIuYñeÁöxàLƒæÕo~¹ûЕi”ìesµì­^)³Ùe^rI0{üN&0û\;†’…Ÿ×˜ÓíÞ@û]"gl?žn€aîâ×hP€Aóq³GøÜíî:•ÞÏlʇaÇÚ›er%†’gPš±…útå¼_g¯òZ‡ 4†óš)0Øü²ÈØ„­h« Iâød(ëŸE"„HõºÈt[d"ý“éás6ŽIðí5ÈvØBq, $\v¨>õš»#æ 1 n)4}Ñc!ÜIL‚‘©LÏ\ Þ%zHFtÄØ „3%àf™È ð,scM>¿µÎÂØèô•H½°ÛhI胋g ˼|_¦”Ù/çÉtm®Ó,Ú€x WV™ö7„žÁb„jt,ZÅA… ´¼òˆ¸ 3›ŒŸà^ÀL„… Âå=i(© ie0J”¨´cð£„ó6É}»ÜØêÎMÒ-}ÈÔºúµ Ž`Èû D"¶dc.+Ã+>{‘p%g놷%Ç S{p 2~£ jææ5‡ÞRìÅæød“Lޝ,kfJë“Ëâ›Ðoåsßù ÍR5žž""dT ;2#‰æÇN…SudËÖçBT ¤H&Ðâj'PJ+ ƒ(¼aÒÊ„+IˆÂÐÀ ÂejŽˆ$É€zK‘¹—2÷¨ë¬ö¬ù„ c‰zÁG\nä)cFóå ˆ‰äàŠYCaåÊn¬‡`·"ˆâ§6á]Ç'B:ŠÌ™ˆiW‡=’½ ìŠÏír-„SŽr!V%«zL£-U¡Ü»¿(ʲš¬…pMùY3xlýn™†É²cr„‘ DK«DІ®~/ߊ¡9s€6;I[ëÂ$®Ì|SÑŽ…ãU)5‡SÕ±©K$åèqM2–È| @Ùîk.í¥àq­,p®('“ǾbÌÚ-Ügט õ¾_a‘õŧ€„J‰$_•Cý™Û!Í ©,y gÅn>+ÎFÇ}ìt Ÿ(øå«ÖŸ˜3©ªzÖ[fÒ|b嘲ÔÔBƒFË…e„чxN­§ÔîhH×óõ+ ¡‰€ŒOly¬—¼´j­ŒŒ}£Ù åЦÄ+š#W{âM:[–wÿ1AAv~¦l “ÄŽ#Ùʶê±ÀGAX_^Ãú¬“Ë‹¾¸_Į𔼠5¬«Í@ÃæB‚ÇÜizËÙ—/ïÏIuMº…ûÇzg‹ß#Hõ`P¿w»júF’þþ¬TŸÀ·üµcÂJÉ,B¥F¾+èC³¶öiÓˆµ3Ã3´çª Vˆ#º× èNÅ#Eq —K0"ýo)µXå¬@evÉ‚™î¤Ô èÏĶÕtTÔäeÖ“ÿ;pÞÇàgØŒ‚eüNØ‘'z<7•’hËCDBErwe‘¯÷ éœ)Qb.=´®ölª®ìd$y_6íQöø1=±Lbœ¨[é±µüEðý…x–ׯ»ô5¥õ™’2àøSÖSW¢¹ÞÁVãÈ 3m“æ`VBÅ´{dTžDó ª51! oµ×’l=ÙäÓõ”œ0ewŒÃ¨>ÊB]üºÉÄf|ÉÊÔ›—J*ei°ƒÅÜpé”ÀÅæS^ë”Uvn¨Å°Ñ0Ñ9ÄÅéŽÿGÀ{ß±Oð&bÐ;x’ú{´ÒIO@›­r“  .€˜ue›†11Ö M¯9£‚ ÐÍO–½=ŠDżA(ÓJ6zqÌ•?üIJÐMÂ}5ú b³MX½̾È«—î±Ñ¦Ù4_ ÃÜïpí<'=_lÐ0#\{£Ÿë­6yêdáÚw°ÐI~iªMŸ­Œ°ãQ0…ßôÙŠâËUÀg7ÆØmsŸ(|ö¦¹/¿”fÓ’½;ué…¶¸BÇ8xÕ_ÜÕãåH«cÚ¬ú³'¼¯Â5¹|¹²>j$"WßÖò¡FÙŠÑÉRõZ™2h‡}¦(ÿòYŒ”ØIý‘cT uá&Åã6ޱò{ m:•–0?…2^œJ{" › ïjÅ‘ÎÅJ‡Û”"@.»¤’•T) Bšr è¶ ©$RÜ,`Û‹ØŒÐ.[¾Ò9k!"˜k&y¸SÚ/ÚÁ³f¤}Î$[©~>›t.Ë&‘(Lø»R)ºáwˆÒp‰¨›'¸hœbƒòpÖZÃàdŠ÷ɧådL¦°õ[NÆž^U"ÁÌØ­¦yËnå:Ýøœ`®€œÄœGÃtS§nì;8´·ó?Õµ7Wú[f‰½pJ@©úK,eåÀÕ, ¸'›¶™òì–ÙvjžpBì&-Â[L¯-˧b*fL¼-ݶ“eow;iÝvÒMʱÆNSkü§óáw9†ùŸË%æ1æ†9‰¡5¶)ZÃSX>MŒíËH!b9ˆ¿ƒ)*º§©šÉËÉX"²œ¸IÂw˜ÛQŸ‰£^sÄü†o {N¤¬’sË¢Û*e&÷q·.C¼ü~¬Ëœ¨êók“|)[µóå~ëÉ}ë©J5¹ÃköÞÈùhêƒjFûY´ÀNNõ„ê2JUql!<3`äIǼåQq„žAš"Þ3èÄÁÈ;ì97kÐÈæèÔàI—º4öΚA—Uj÷êù‰As+îãg ÄÔÔD}—³ Џ#&G‰É…d:`Üjé r%ZÙHwÄMÁðÞbL&#IL#)P¤ƒ ¹iì±wÔQñF… S=bÌÀ©Î0)‹·T9Tt[Â.ïr¿/:ý9|;Q"H¨ÏSÿÁ JÖ£¸Nk-ÔyÏú ¶ àƶŒYkKd}Ô-¦g(Uþ“î ëcå¥ ÍGô3•õ=6·§n¥ˆíq™J œ`_ù ìXë"\ð2² …GƒïtBHE-ý=ËpçŸO3îgþ j¸&ÌîfÓ@fÇlƒ© i‡¹¤“£#Ç 0øN«½ƒi€9sV=8†ž˜ÀºzÝïCcƒß¹ïfïÁòâ'xnÅ7&,àbú)XþƒŸH ¥ÆK—={f]a޼yxñqSØèzq2©Ô>>ßývï› endstream endobj 5532 0 obj 5578 endobj 5536 0 obj [314 /XYZ 38.2500000 347.750000 0] endobj 5537 0 obj [314 /XYZ 38.2500000 200.750000 0] endobj 5538 0 obj [314 /XYZ 38.2500000 709.250000 0] endobj 5539 0 obj [314 /XYZ 38.2500000 347.750000 0] endobj 5540 0 obj [314 /XYZ 38.2500000 200.750000 0] endobj 5541 0 obj [314 /XYZ 38.2500000 709.250000 0] endobj 5535 0 obj << /Type /Page /Parent 2 0 R /Contents 5542 0 R /Resources 5544 0 R /Annots 5545 0 R /MediaBox [0 0 595 842] >> endobj 5544 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 5545 0 obj [ ] endobj 5542 0 obj << /Length 5543 0 R /Filter /FlateDecode >> stream xœí]KoÜȾëWÌ9ÀÒýâ X¶ ‡† ääx³ ÙEœ=äï‡3$G9_‘ü¦ºÉÑ‚=²ZlVW׫ëÕïþøåï‡þvx÷áËߺÏ_LVæ¦ýs8~ýðò®Êºïe•¾ýòðýðýáóÃçæßïí_>ü¹ùîwøSó÷çÃ_ÿÖüðÇî—Ž¿ðËCiËæóߧϺ´Íwæüyüù¿þò»Ã¯Çû×uÀ¼þÿÞ„ªG0&^ýý¡_¦=}ýöíׇw-–½¥0uYU|8Ø:¸ÃÿñðSó‚~z“ÕÁÚ²¥¹æE¥;½©¨ÖÕ ®‹Ñ{N_:³Û“W!Ä›ü¹6R¬/¬8yVo}éòpÜåãçUåšïKßý¹euq·Ï³ÇغùˆGJGÈcí6œ\­1E¼}1»>ò­±!ÚÎvÇÙYaò¸|l³¾CYóWiÏÓG˜<˜ˆÛ}‚\+ý~ãÙ5Y9ä½^³!þóhjÓš<¦ 8A®Ž•~sñì±¹¹p¦CZ3“>Úž§0y™GäæäêXé7Ï{Ã+çcrøóô&¯}oòäÑ8Ï®(¾h"nî‹é#Ln‹x”ÓBks…Ù#s³u6¹áÏÓG˜Ü»*Þä'È£m8ž]“›ÃùpesCijÍóˆ”s‚<ÚæâÙcssaʘþ<}„Éˈ–^ y´ ÍþyÉ,”ö'Àiû]xðñëû'L}°ÅáëO p§w¶_¤ä‡ŽÎæ4ûõÇÃïñO8|ýù¡Î —÷ ¶#æ#yD#¶D#>c ¶€#ÎVÁ8›©áÈûå°9 Û'מÆÛ§¯ 9F§$g'±hñž¸å;l1%Aü:¼Ã1Ÿj¥p6Ÿñ¶ Eˆ$‚iI¢,^o5Ü¡:*¶  “» $‘QMeæíY7òêNéÐî  ™³sÑ[‰Gˆ\ëõ)_ LLxI#½wI–›Ì×dz¡¤¨í_Ý@¥ ³ L†cžø=YöTØmƒ¹½*ŠîÞÍF9Rõ*…'X勤²P}Ûé)Æ4¨0IÓo¤ßYÌ:J†ÊkûÔîWÖ¦ìwvl[ß­aïwv¯n¹$””›bš’0~ñºáˆ@IŒ‹YµCYÊPîòkhqï4wWæfÐKÓœúƹnÂáœ×gÏüê=Ö?€)úãj¼ÒÕ=§º%”§Qµ¶àŠšªÈ¦åå€× ãA8«b(*t¯Tm1´wîZ®ÁuÔÆwimµÈŸ U¯éúïÖ÷Ý?š [EWôL[¡»ß‚,É™¥Èo<5y/ã¹aßVQÞvŠ­n±ÎN}\Âcâ´ô4œQÛiŒàÔL<‚1‚Ÿ!RzÁ\ËxLê#’1¨q¬†àta¥ Ôo&. இ¡* 5åÕÇšE7UÓAŒýI"!K{ æ7-!‰ÔsÊÀ³<#ÌÆ$¿· 8`$ ¶7pÑÞm‚ªì`\3Úˆ‘XâCË—Éj (D×9äŸdö:–;øü¡†v£]™ÂŒ7ᬇ¹ÇZ M™— 5˜›¾ÉnËLˆ3Ö ÜGÁîdN¸¤Cys×ïœ~g|øD‡å:æ,Ý]ÀºÉÜa·„´¨—È5c N@ªûKÐ,DÞ¤ ‘0g1e£Ð³…±ÓÍ?W§¬¦‹C©’•h¨Ê­›£@Ð’‰êÞÇD§˜V¯ÄU@LRÒ½D_Uú:î}1“óS²&ÄøB\`‚9:FÊE"_άYEóbNk:‘ªÀ®+ÓS%®v£FŠJ}"Óx[W¾0Eï8}•H©®­ÁF “ÂËH¸¸…—£›Ý—H Õ¯Ry{¦Q²{ æ÷º_².¢ò˜jå^YZã†Ú2$"R¥p ¸ÃÛÉdEcUKH‚È zîõ<@å0ßYÓÝ“ãÛicr„½¼Ý Ï[uî'LœÆnÕ›ú¶hÛ«XüŠc*â*ГNW-æòfæŠFÆŒSÕº§»Õ tùžr'm¹´ÞäTÕ¤ó=F)«Jª|¿f´Iñó„n2¯?e‡††oš.÷z“tt‰ëM‚³áýÁ#L‹o(Ÿ„«p>EJ¬ÃMsà~ÊMp`Z®­ŸÄÕ–Ûȯ/yÎEVËbª¶¾ØG¤m#R—ý&v²5YëJyæ{4Ò!*ÏÜÐÿbŸ–?Ó1ý¥gjøž®³¸ÏÊagñÇóÉiÐ'©;¡]©Ý½È¼uƒó‘ƒÏà÷àÙ >¡ü÷¿çÅu¤Ã‘‚¢?« qÝ‘h›}èIüS¿´Q»­ùŽŸÕúßBG_ʰ Å úB;½ÏÌü»’õã"RRPúEI$±Û7§êަ{M‚‘ÃwTÒí…vÿqx&F‰ï¾²sð3ý Í¥*IjçÝ@wÝÙÆ'Ž/­˜ qSºäÆ©Œ)·¸é»’å!㼃ùĕг…÷,ØÕkT˜388ý‚“‡n“Ëytö UˆM¹%BQׂK• >?­M [Ýh=#…o²ve;"ÙnÂ]8h1 A¶DynÖø8Šù6óÜtôËW·ïiO1ÛŒ; Áï•þ£š³¶ES)nQ‡Š=£¬ãçêZ-ÌI*@­œw>¿\‹)wÃjXù\"“0òÅyKR ™äÝ{u´Œü¸én³¦:ì·ÎÝk¦LJ²ÆMRÓS‡É‡a²¾t»UQ=Ø\œ£‡)ïÎ’‚#È=ÚxΡµîÜKcw ÄÒ Ë¾D=²”G U¬O}Ép@Œˆã€è®,Œ]_-ѧU艵Îâ|ŸP„|†û’2ýÞ0½ý,…~®j©Ò¥Ã8À\ ß ½H/Lw?¥7!ŸÖ_ …±þÀ:gÃ+ÅR¯C-蜛Ħ¬Y Áløva=ØV]}=®1Œ<€°)ãß•‘*ÙÖ}Y_šFrË"†ó'2u‰¸”±ÒÈQqL.Hþו¸ÄÏŠ=ØD–êHðvòˆ€l²ˆ©šºÝB.Å‚”$¢mGJ÷º Õk¡~é8öÖÜÑ—žÁDZûtp¦¡¾¢Ü©ï:êÛ°ƒS ¾Ý½¸y÷¢«Š7#ñæú.I¡y‡OGcÞä“XÔIU„o}Ñ/mý"üŽ}– ?övø¨zá{8Q6/”¦·_f~dn§òÏ„çþ‚[)P¼tb®ŒY=Q|ƒåƒº­uŠ÷†X Á) ¬îÂéÕKðg{ñ2p]¿Ž<3Ãþ˜£ÏârȺ©¦B²+±-ºy¾Ì ›Reä‰v[·qÃo=S࿲=/ê’ª‚+Ðíƒ-0ÑÌ•!úqóûTnWÆñËÈ]7¿JŸfÝ„xÆ""#M'0V¢rAÝz2aÃä«^ÙÂètAg¬U1Yé½LPà­$šï䜪5_µB¾ðÃh¢ðdÞûŒF'P!˜¶U/âÃ+ 5‚zËÅÒÂsA¦ÃTˆñ6;1펎kOP›qt$pÔ9‡°½;LnÓaõú˜j@5»+FÔ#»+FÕ³Lµí“Ýa²;L^?“ÄaQy>´[vWÌîŠÙ]1‹ }õtîÝ_"ò úK’$E…ó^{Çs¯‰„i(é|3•Pqˆ“t™º\œ ŒSò0õá|ËQ ïálë÷ƒ0ŠaÉʘÊa©òžb¨Yƒ1Jð³p£#Q»ÓG;ººMØS\Ÿ°“Oþ|ãZªŽL„T,ÜÉj—·ÉxF¹ Áê6ÁFxÓ»Íð¦@}D‘“pS#–—kß:%M„ óª|MF©n~߀ψˆl2a¦qd»ºq$OÕÿOÕêÇh2¾ÈM¢2bÜrTØ,îõŒë·„¸ ü“ÈK¯Óv&‘_]ð]á&M€iƒÎˆ*éA^HÔ[ð†êRp“¡o*X½™n${Çz%”Ò•_œ[tbS\0ì‰&Ñž0ì 6«¡aïp“ÃÝýO¹2Sl‹¼¾iºÄM¸ºÝ„sk§e#õ_Øp°w¥Á{ŠŸ¡š£âÙ ]c׬€ÜeC° —\QV“ô²eÉå0?ïu RhõÈmöÆè-mo,%IŒ)d#r°.'ñ»e9ˆûîrÐl@n9Üt-o6_‡ï Š<úyêfø¹ªK ì­ÏŒ=úc®OÏêÈ—œ.-ÜåGK¥.s§"šñ>ã‘®±¹ËŠQ+²‚KÞ«è=~êÆÌK°=u+E.)Ün7<ƒd °}7±Ñ;‘‡Ý½ØÉaÏŸéÛvÑÒËg²e îø}q9¬üõpM˜Ü L¾†ÄŽÉcâSI'’/°|O祾ô Ʀ`LYÕ€ ‚rŒ°®ˆ!=0ø™Çú®´oΆ­ \\p1þ, "ãÅPj¼Ìðey¶4>ëäýKæÅìfqãE?çI¥öùðùáÿ´ „ endstream endobj 5543 0 obj 4517 endobj 5547 0 obj [315 /XYZ 38.2500000 625.250000 0] endobj 5548 0 obj [315 /XYZ 38.2500000 625.250000 0] endobj 5546 0 obj << /Type /Page /Parent 2 0 R /Contents 5549 0 R /Resources 5551 0 R /Annots 5552 0 R /MediaBox [0 0 595 842] >> endobj 5551 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1409 1409 0 R /F8 8 0 R >> /XObject << >> >> endobj 5552 0 obj [ ] endobj 5549 0 obj << /Length 5550 0 R /Filter /FlateDecode >> stream xœí]MÜÆ½Ï¯˜sØd“€@’wä`!99rœÀˆl|ÈßgHÎŽH¾&ûMu“Ñ‚­µ(6»«ª«ª««^½ûÓ§¿ÿùûñÝÇOÿ9~iÿøé\ž5ÿÏ¿¾»ý]žÚŸ®Ì_~=¼_/‡—ú¿¯‡æ…OÿRÿô¿£>þ¹þ÷—ã«ÿð§ö/ÿ¯§\ýû¿/¿WNÕ?e×ßÏþ¯Ã_ÿpüíÂàÊ”ñ¿Ì\œ*-Ã=£Ÿ*{–‡šÑ÷¨’f Úµ;¢Ê#Pè:z ò›""o/3—&JÇZ8xì­luÖ’ÌÅ ÚÛðÏ«ˆƒ_f.N•ŽßxtÉ­ìTÑH[D×ácп*t¼Á/3§JÇ\ý%d<•æO@ŒàÕóâ‡Ï‡wÏ59‹ãçŸë™]>Øüöù׃­ÿç|@´ùñóOÇïëù¨??ÿrPÙ©pªtùåï5OòËsÊmq~ðöDµï˜“ÑeílÝ<1—'婬²BõN‰F3ÍhåÛ‡?^þÀž¬ib93†Ïž.OònFs–‘98šE3`FSü\)ž®àh:ü;êCø ‚9¨2É)e\º„ïà3ÐÍ¥º¥Î3ÝðžÀâŒG³E@ë1 û«“i_šñ„ÚÁg–N1 +1,Îðɪ5f þ­WÊOŸkûÉ4®o›"ËÖØxûAÓçÙ²?j«Bf†í ~Ç)¶*›!κ¼alUvëî”Ëeš#ÖmäIKß±'Oè‰)Ñ“–Vc£Y8·>Qð;p´ Î-ÃsÃÔy¾Rç)Úš’±'>yŸ›©ÒÉe©Ü¦åÒÀ0r©0 ðJwYöqÎ…ÓK"žž‚ü1p4 ¹` Ti8kÏ 2b§X®ñhXF=3À»1¥æ2Ŧ5—Æû™×\i(Ÿç“{Ï´Õ¤ifZ™¯tI¾Z)=Í/üä#¡ýà;úm î‹åî'F+y, Þp¥“öœ¶¶{tx¯ãï@Z+hS=£%<ëTFuë†^FKù˜Gê&Ú[•™0ðX‰üKÆ&qXq0Y<<¿$Š@&#à´lŠàB€¢èðÆG>° 1!c,LL ›­/ù×1o ˆ”õÄO™Ø.ÞrxĦ÷|‡á~’ꉈú2›ñ.Ä´|¥é™¾ÖÓ*çˆ)^Òüý!ËMN‚ß ¸XQE”Æîó+d& ƒÌ_ßp®øÚ O€°«Ìm sYFù0²Rp4k¡o¡!\KbJ!R¶”—ãâ;žÛTæÂšqKESð•y|ÛUY׳]Ôí2æ"a±™Q›ÃшQÓø]‘÷eXa9 0X€1!%€GÖñ‡Eµ“º"’èb{ÁÄa’4F/C<{†8óÝá»|¦ÈNv²³#!0[<_`Ú™D êZ¾'ݨ¦N™Úˆ+rEoE8Báq¨‰C!ö¤&-`ŠX´Îò=ïf Í{®ÂÒ·×:s{ÞÍÍ“=ïfÏ»ùÞ—s‚GóÌš¸÷õì,,ט ø¶šÉ»‘Íüs[yæÎªâÊ{ž`IÂïX{ôÔž¼3¼7±üYlžÑ0ÝMŒw µÓñhxŸa`}ËxcDî‡0·‰Ì.ôâ•4ðØj<ÎD!,%ox=ÄÎb²M)ÙÁ:Ë(ái¶sKb?”Ê'ç³fûá9Á$²,žÑ°ÿDÈ‹g§ïZˆÒBÔiŸLÿV˜ ¢þ £¹<òFäªâÝ(¬o‰“=sþðÄ0°va4ÞY„`Èå­–GU)Ý„r•»©ö:6;5w7äxž´Çÿü¤û†ê9ü¶Taì ½Óa+èagó¤8ÕP÷íI³aÜÉ ‚ÖoWÒ•+K™þÍ3H··rÕùÔiouÆFËàÜž ðwáWæÔ0ᆧ®-놟x¸¹P4€õÐzŠ?ñï“´2=áI5o‰Ûlæ± ±ÝVšG Æ!äJ*­dÕ·’Tߦ.€Selèòߢ†÷äÛ-ŸQ;+R°É¢ FIçÂŒèЀ§Ô‡Z2 7yß-N3Üì ÄQSÁhÀÉ]7:UèªÏ¶TWœD°k2d3Û%+z”¢’*q=` v»Ý3Ù]Ø p¨J0ÂPiÛ"^`t{R–eŸþ„Ëë©1“­9Ä䨪I•‰ÊH§(® S.èc¾Ã¬Gd·1Û\DºÍ²åØøŒ‡£©Î…p¥ø†‹œBŽ ó׈Ž|-UÖ•ª’_ò¨’ äg®&‘ÐH²åÝdb¦î¯‡±Y‹—¸S*}KÊŠ9YXW&K|Ï9}þÒ™jÛ‡C3~Ôxøòáï4aiƃX8.•«­Ûã”*]ŸR+†ífJÄ(ÿ~¾ß>"«W ï–òª°<0ßYnY*\ñG0‹|CÃ8‡8UZú”—T¢èeæ¢upLJ%í9ª¶ÑTs¸ƒ<î`@Ä,Ñi” ãˆâö —N8ͲpJ‘E‡‰g{|¤-Ì“Ù*Á^'éMT”#`‚`~Ï¥˜ðù:ø¦1*’S> cUæú Û±ã”*û¬[óÁiп:”º=^œøÛ¾‡Ý›,Þà0ƒ£Nø„²”3’n ‰ƒRx£ffª¾f%â%²Nƒlžíò êž3j€3/ª3VpÍ6ˆÁÑ8÷O)a÷=m²+ÚQM‹½4\È`7yP\`Ÿ(O%Sok?ÓõÏÑF“apd+©q½4U'‹1w"ë˜kûQܹEn>'k›ÉúOU‹Ö2i2Ôu!ô8¼ä~J'²öÍ•Ú$Þð˜=$À£uzÓr) ðˆù¸šÈØ£" Ž@¶<ÔÐ@ÝSEÙ"sÑz©%ÍŠ2và¶2-¯á;F¬ÉêTÔÒv  2ÔqÚ9® gêÜðw‚¡{+ßNÀÌk[RªÎAVšÆ€Ä>KjvYȱ[ªˆÀÔa’¿CN½Ì!ƒ(Y¤È'»DÀ œŒ<gd.z×hóó PØò¥tùÉG s…9Nˆ‚á­B á¿™µ˜/0"8|È•hÕ(6°©D}¸t¬ñ®` µˆïxÎ6L°E$î– 1yÅ@¢nËôð0ŠÆ~‡ŠØãõˆ §BðöÜoÁÊ£˜ÁŠÌéž•¥[>aCT6<Û" ?2øâZ Ã<‰;¯Ø™/©Î‹­Î˜sÈšÑ–Šª˜¦œ,9pJFa 5ÜúQ ‚ F·ˆ˜¦­Öük*¬MX‘ã0+÷¿Xf sõ › ÒœãÖœË@:‹$InñÔ² ¿@JÁK1;n“É9w‘b6`TyÏj¦:|­#ÑàŽ$¥`ÎV_ó>¨äÝSZ/Z>¶‚2ù„˜J®¸–2â"R¸nƒ3Ì1!­ j3$ µeØÿ¸ÛH50¦7ÌYž4Ö‡øö•л“íÈ"î mÊ>ÝcTÞ.%VÚ™ ‰¾DÁæ1¦ñÅʸj\¬b~³ìóúQƒýke±Wñ‡™à{dx¬Oz›TÿÜ„0…–©0A6 ¼,Ò«…©‹ŽbéÀÞ  Ÿ(rq2±&Ô8UÏ‹ksðóbxÿíi9°§Ë£ªmªuŠ*òtüA›m·ónºb'?ÕÙ‘‰4¦Œ˜é\MÊØò3L+ýÂI”㸎?Ã[<šN©“Ü•[ÛÔIÛÌfYqàaõ:©¬&ely”øn3~DÞ\‹Ù HÅœ9×´9ªžU=¯@ ­²K£*‹>¥Ì#¤ào·©T› ?öá€Û…v{¸8Üòa·èÑÛ^„Ý(€=Úíð%n”“¹ Ià•Á¹LÜk†rt,-¼™›ŽlnýytÓ+‚çÍ4䡌6‰ƒKà GÁ]Úx`̶„èʸÞÔ5U¢;ñØ U´I„,iH:@*\DŠ^æ o’õ9‡LI°ÇË!¾yzÂFS!­¸! .ÄVì ‰r}Ja hwKvOhùXÀâùÈL”€i¯Lq]>Ox.iRHÌßÙ”¥¢ˆÂàA`‹ˆ“´˜–²˜\Ä£ƒ‰8®8QBò àú)=ú¡3/о¢r¢Í„“é¼-%¾ácâ mº20tuÎ,÷VÔŽ¥Š4¦K„õ´‚dêùT+³ø]ôj"ölÓ&o!zÿyô³(›µp\ÙCf„\ÑÑ\<Ó¨‹ñ›=÷š9á?Ö]ÍjÒ´ÖÁ— ¯´÷ˆˆh„Jø; ÷£iáLÑcX'Žœžì¬ª5VSE·šä°3Ðúîy©:æD¢³·…ôQT¦/Á\ 9E ÅäÇÑþ1ÚaªBÚa)iUåÈ6ðÌ~§ ÂŒ½ƒi€%KVÙÛêïϺº»«Á +ü·vö-Îøœ'xnm(LY@bú)éÆO<$†ZCÝDqÙ=ë2sjõýíæÅÛMᙸùI£ör|9ü ècó endstream endobj 5550 0 obj 4723 endobj 5554 0 obj [316 /XYZ 38.2500000 452 0] endobj 5555 0 obj [316 /XYZ 38.2500000 408.500000 0] endobj 5556 0 obj [316 /XYZ 38.2500000 496.250000 0] endobj 5557 0 obj [316 /XYZ 38.2500000 452 0] endobj 5558 0 obj [316 /XYZ 38.2500000 408.500000 0] endobj 5559 0 obj [316 /XYZ 38.2500000 496.250000 0] endobj 5553 0 obj << /Type /Page /Parent 2 0 R /Contents 5560 0 R /Resources 5562 0 R /Annots 5563 0 R /MediaBox [0 0 595 842] >> endobj 5562 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 5563 0 obj [ ] endobj 5560 0 obj << /Length 5561 0 R /Filter /FlateDecode >> stream xœí][ÜH~ï_ÑÏHÛqÝ|‘R2É ñ€%ˆ”eA+vŰü}<íòôLÙ_Ùþ|ªìî4dHërêÜoõî_þ~üçoÇw_þsüæÿ~ør(N•+ºÿŸÿüðút}ò?«Ú¿ýrx:>>>·ÿûtè>øòðçö§ÿõñOí>þõoí?þèéù~9Tªjÿþ÷ùï¦RíOÅËßÏÿþ¯Ã_~wüõyÆ~9¿™·ÿÿS”µ)Ÿ·1±ôÓ¡?¦:ÿùíÛ¯‡w–­R*SVú¨¬±GÕX}üï??µ ôÓ§Úe*ílûsSÚªpu­ÛŸ+ãÿÃ.Þ.Û®n wTº)޶qƒÅÏd¦W &¯›&Ýäç‹C¥½nŸ=õ…7Nù 7U°½LŸàN¬©«t~Þ¹8Tú dzŸ«Tõ|ÑkXI º¶€tÑ$€ÿËô àïŠF§ÃœóÎÅ¡â/72{bjvÊú©ÊWò2{ŠûÖ*÷îv. ÝxrARvºòŒ´.ô«t|Ú5*Ÿîv.•þn³^2 ÞJ÷/@¡|Š|øáëáÝ£²-oQåñëOíæÎkv}mâŽ?W„Žðî1…áuðló9 ƒÖÄ1àÙð"¤0àÒ˜¢1Ì3êaMÝ[zש¸ƒð"íÈp6ÑBTAè`Xl@ˆBë¶pc³a¬mW»ËÁ¶Jp~ËÁå*½}{l&nµ€˜áPyl¤ˆŽosB x?ØÇÉŒøóäÁåª÷dô=G%®Z&b®ÏÈÄ&L4Ïm™+ñå[UõºVNy š5þé»<¸ËƒýÈ­6ˆØöÄW-,äú²òÀû$ÆF˜óö¶.‚ã.C§Éˆ—esÝx)½bðs\_¨¼Ïˆ/u=yà ï>SLÉdÔÕLQ]5¬<ïÊ+ÝkàWʇp|]Ô‡˜‹Q;ÈȇŒuWM[YùPi¯Vr|(‘·ö’Pòx^rYtTF‚Â8„™)ÄL7ÒQL ¹¡ËÈáUF }3e¯xds¼Ó5ü‡¥§p(- 6F…¬sZ¬w`Íç~B_TÄK…½ŸbÞF̃ëRT¶‘ýAžNwS¦§òheTH…bxA× øÉÂ$&—)’å„áÿ1YÓëõÆ4cD6ŸkÈ1Jà&œ² ±g*ocŽXÙsºE† R~0”p*ŒgÀ5@F¿Lq)‚ªx —ÄØÌä„Id~EÆTSÍ¿Œø6>ÒÌËŸâTVj¦B!U å<¡Àkl9®Uͺ¼|šÉ¼cØ¥èlXk‰¯øBV!HHÅŠØø€+b)ËZ™œÓˆÚÆØÆ˜_bʨ7²ª„u«°1Ž!²%S®ÏÌmÈû´g}e°d+$\g¶]nè=ñXêNºtö<.ÿÆcÂØ7 \§îi«“l9Üâbј™#‘u )^p>˜Í³¯‘‘BÇ›ÛÕÉ¿àØºuÊ“QzKÇÖ»ö4v ©rï@m^¢ƒXsu#EH“©auÔ2B2üÈI ý%Ro# Qæ¶) Âeð@ĺ‹,̘¢„ìf,P‡¢ï„)ctLXDécš>ØZ dYÄãm eÁÝã= )§t)ÂB‡œïo¢XÃÓzˆRƒ‘{¢eXoî ¡j®‰\gÍ5£—,Á™‚7{,µNï³T¡D)+_aÔÆQ#{Ða F¬4àÂI¯§ap-pw9ÃyÜç‡ÑÂb¼Œ‘uö× !—¹D1ÅÓ/P%DÙÊ&.¥p‡ÀÁ›*™ Y§^ìžnwÊ ]¾¹úåJ`üˆX'~bëæ9z”Åàþæ"ÄZH}ó]Y •BÞùìl2QR(ÒLI(ŒnL§'†HMy0.-ð˜dBb_²L›ŸÀá‰1¾ÏÏo£Ò?¯,‘ÅYŠB"'Q8HÂ.Á¾ÆÃ£Ã…e[¿Éæ‘aóJV-ÈÄÊ)ö%!Ö(SisËH†Ê&žî—ÍÍ+¥†ê’*j¦¦ÖÍDü¾|ÅMBÙ¨ U…Â1mZ9ö>/¹Åù¿º›ˆðÊ1áŒG¡g‚û‰Ua!ᔌ Ý+«+íE('Îbð.*S½E¤{CÈ¥{&ý©l)°®ªß.¹e l¿Ù<¶¸´—]1t˜D×rù"‰®ŸÐ7‘½áoð-tIÂ}wM$áF’}a‚pnpJ¬{Ôo,Uß²Å7‹Tºgã!ÿYWSŨ"/ãg'%![’]šËÿ-b¥ˆ&¯Þ|¦(ãùÌ•ºÎt´gvÀ¤¡ ûÊÒfaPžwY…)Æ"ê#—ÌT;Ú×<û)ÉXî”ïUÂL¦‚/˜0EìX&}UúÇV!™+}°g¾ç-²Ù\I „»yç"0Ê&Uq+›0š+™•©$g’Õ˜u˜äЇ‘ÿIŸÔµï‹„.Ò1[é%ã gzñ ”†¥ °ÞЉšVnRœ`0=“dǰ&B&j¼F¹gQ´i bÊÓfÜô… RAw,(½ßy G<~7 1ø«‘À._ížR>ºÁÅgR v’¾‹á+à ,5†W¼¨*ÜDôîçX%…)ýi«&¨‘ʈ ½秅Mæ†'”s¥å\â,Ù‡¡÷œ†JɹétÍ\±̤ˆv§Ùúøm€ˆ$1Õ®·ðã‹ÂÃyG‘§Zðs(Älž]$m5jCnÕm„IѬ³¿À~DÝMÌây½#ij]Ò¯pOÔù¡‡%Í‘÷ ¼5A#œ rSõÜqn9N«R¸7£lG%,æ=¿Ë!底h¯øÝuZ_瘢”‡\-…xRHÈŒ6#¸UÍïÞã{\Ù ÊÆ½]r˼Ύ üC„R¼q±Lî¤ðãur¥ðWÆôÛܼõßLj²´[qÖçê($RÂy¯ HœÎäO1Í@ÖtHy"q†j| š‚B¿öRDRŠ56c·Už+×"mÂ5.T6îµÔãáÐJ‡Ú*Öp+26mš'åÀd² ö»ä ¶L¹×‘×Ì-S()ˆZ…D}k6D‡ªa$Øã;·çÉ•.$›Ö!Üz/*îâ9m[#á²ÓIë ¼²°;Nå}(Åg*ÈÁëèL<Ûµñ'Úh-[Ö-ãH‘ËÞZgø[Óý×Þm•†S¸©º€\q˜p¹è:Œ^zuM» ȱP5£Á‹4¸|a ­²^ÛÝ9©ZZÑF`KÅSX—IMbÎa@ø¤L×þ^¢Ú¬ÊK8^Gä,ÝN$¯±Õ|Ó1‰Ô:ÊWI(Ê·_þ»mq øÄœK2{D¹Ù»©”ø—µ3EÙ0Åvˆ÷H™«”mIul'ƒo²êeçã,x&"½´UÁY³uÙª÷¡p!  ÛSš2 ð n.}w?»Jíåæ=R‘û·¤–eFȆ¹3©eXï\âÓŸŠ¦ôòöÉx)™ËòÀYx †F©ßð››ÅîÅlQ×Eÿ˜Œ…)¶Â›ŸÁha‘äK"~-[xãY¹H$ o¯w¹s)›9”ƒ5ó&j%©Oò¾Ï”©Aª‹pÍí[˜DêÈa&C»aöŃÇu"' MêèØÂÁ;i«%’du¥,/›;ñ3I ¼'Q0ßöÌÑû;ö¸žAã1q$Úé,IÏ`¬«g3*Z0¸vÆV_LB‰Ë}Œš}¹E…FpÈ<L‡ë(¼Žè l•f`8ߨÔh\úàÚåFvSy¶,©ógJ6˃Ëü6mBd¬ ŠEÆ©™©)É'²Adµlý.±÷çªp„IjŽTÊ;ÈdĶ1¨~ÂH¢¡…p‘•h3‚<Í`Ç„î˳Âsò» Ló«%ůDh0"²[tÃP°2C[lço²×úEÝ¿‘ô­*€Çm%{,©“ˆ8SEsp´ÙeÜìÖwY³'tY£ôç\/ÕÍ/wöŠ\e=ñÍð>[p·b1䱄2º}’ä­ñ&MóÞâP«rùM"Ñlé¥í9ñ'd’mftD¨Ž‰É1r¥µÝi8u‹žl‘ò ž¼]&KP˜µ2l~Ø22=sýósd”ÓÌMp“V¨›Pjí&÷à;fºÂSˆÆ „s£eë‘e#)™:Z‹¼ÎH]%«ú1XxÏuýÌ«Tí7.ý`è(W¿t&XE°QÆA¯ø¤ T]žh£ªžÌ½I0 Àö 7 -Òø§Â‰µ™ES¾•ocçÖpLô8‚[®Àu0¬,Ùì¾—×Åà~ð…¿ ž gûA:Áw©Áˆ=’2ãN*»âN0Æá|Á\÷ÉeÜþ†ü'¾ÙÁIñ»7v?®cÄ\¹3è¹1Ó”!*A xnæye,E#we2Þ\§åGîž4"á1^büåø¶ÝÇå³i žšrÐŒkµú4Cé2Ds¼Èç–G´tQi¿=/ÇôŒ1WolLMõFWµÿ3JDW¸`Õ­!W6âPˆ‡xÒ½’Ÿ»uq¶šÊ7–¹†Eæ¸Ô=t¬f{5z>[±ê÷iÂVUõ³Æ>â”p…³E„ΞªGM~Í=âS¼DP˜¾ ¢žP,D#±Wb×¹üd”o B{è#ê¾ø(V¦rú=Œ67Š—”‚‹Ÿ0Áª¯(e\^.3¢ˆˆCd×jb×yhÆêwã]Ì=F(#Æn?¡QXS4#ÖÝh^–êFñòæxù^ðòÎËë5w/›xk|™âå˜jŽ’)ƒ$²A—Å**“ß‚l¶‚ÉHéM³†Î0¬°^ŽñåNé…›’Y°Âª5Ít"95øtDh!ÂEn “p˜,+V˜* V@ šáÒß¾è)i+\¹Š”ìÆak&ûó$“6÷3}•ØCj3ð¥rkðÚG”VKpžÆâoŒÝ_²bE³&DÉ |[w[”JÙq½zN­‰ÐDZ7ât•;¾Pø‚µ-Öñb¾˜UщÍߨþ†sá cM¦_æÁ1·*Ò@X48Ò|Ç1Ç0·Ú ŽUkn뻫zfî8Fâ– ûÀ±z•Ožké8ùŽcŽù”ÃÝâXY¬j×Îølî²RZãËaÎ8Öþ9>µÈŵÏS¿0#k¿}‰O™S¡ž­:^Jü:ïÒXúwÇ»ª‘Þ.*¨ûÊ\,‡#>gLŸü£Y¯dC·ÜÔvdƒóèàÞýIÑs¶¸Ã£½l©€›Uþèƒz÷ÙØô±è Ï¿ñ¬Q-:ú+W‹pÏ?·;îwþ ­eà™0 hx|] nò9; U;Œ%žéŒAdp_0ö †Æ`ŒYu@„ )&r®ˆ f0ø›~÷¾=䜼7o1 xƒ~ öÄ#C®¡^‰–f«Âœ<¿M¼˜Ü.ÎxÿZòMI½ãçÃÿC>‚B endstream endobj 5561 0 obj 4592 endobj 5565 0 obj [317 /XYZ 38.2500000 425.750000 0] endobj 5566 0 obj [317 /XYZ 38.2500000 173.750000 0] endobj 5567 0 obj [317 /XYZ 38.2500000 425.750000 0] endobj 5568 0 obj [317 /XYZ 38.2500000 173.750000 0] endobj 5564 0 obj << /Type /Page /Parent 2 0 R /Contents 5569 0 R /Resources 5571 0 R /Annots 5572 0 R /MediaBox [0 0 595 842] >> endobj 5571 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 5572 0 obj [ ] endobj 5569 0 obj << /Length 5570 0 R /Filter /FlateDecode >> stream xœí]Mܸ½Ï¯ès€m‹ú‚öŒ ‡† ääx³ ÙE&{Èߺ%õ´¥~Tóu‘¢º¹ÆîxM‹,‹¯ŠÅbÕ»?~ùûíÞ=ùÏîÛðóùËS±¯Ë¢ÿgwøõÃùèf?ü~W7åîÛ/O¯»×§ÏOŸ»ÿ¾>õ|yþs÷»ÿíôîOÝ¿?ïþú·îþÒá/üòT«ºûùïã϶VÝïŠÓÏßÿëé/¿Ûýzèqn æûÿÿÁuSÔ2†~}§©Ž¿~ûöëÓ»ž~£Tª¬”Ý)kºÿ´Vïþû§ŸºÆî‹}k•ª+[· TëÃHºc‰Òm7ª­gÉt¯tÞvK¬ó#åâ\Q¦RîÞ%·­ÚžAe„ÿc÷:¯J®óžrq®Œ‹‹{\ܪ.ìÀ :ÿߺÐySìüH¹8W†Åuô¾o¬Q¦Ö¥=,ôa‘˦ÑÝïk3üsÛ¼Z]…\ð·îå;¯‹6\ç=åÁ÷.¸›;àNë&ÿO݇Xܲ (9GÊŹ2,î¼÷Ï>½`Rú?¶â«ãÃ_ŸÞ}R¶èȪv_êˆ;ŽÙÿøÚ1¥Üýp0;Š¿þ¸û}Q¨ç?ì¾þüÔî+]Ž$.µŸà75ü¦E-¦ñ§ÀÑb·ØR|ôÿ¦ÔþߘêØòñk'¨Áe¬³NCÈXå¥PþÒ§>Ào07)—ŒŒ8GKLëTÇ 2†[²ŒE“1 9Š[A¸¦ ƒpw&)K…}eìp^ b©UYÆR–1¸uWks‹¼@é+±Ír)­y¡Œ%/}Vß‚Šï3*& }ØîK]ú*Dú²Ý—‚ô%"cÍMk}jáâyèÌf®mƒXwŽóÆËÈEìW!ÆIYÊé+ /^Ö4¤¯Q·ÜNÈJ_¾Ñ–¾¢L\úÌ-÷ÂØ5H±ïÎ4¼¬ô•Ì-HLé+o¹Ñ–¾|Ï+-}‰Û}M}ˆ°ôaÎcI–MÂ2&|ê€ör"2ÖÞr£!,cX‹2´%,IÂ2FÌTNÆ€Ùâ(`­¯ºRé½5ÇSˆnöM[).¼?9k±¨E·°7MŒÓo`¥ö¥­:D>cá(®f:Üâ§‡ÑæízËÜŒãÎVÕk‚ÖÀWg13ÝÀÞà7ª€- â5æc>½7S™½ÑÒåU´ÿ,!xC ˆ}©·™â âEîá«g~£`ào®'KJyåÁ!)°7ýŒ d6 û1šê¯:ÂF¼ÂÁ/„êÇ!VnØ­ˆÇ1ð8N]aÅ‹ÍXQ׬n|ȶ`ÇfÍÜ‚C,Ø<%ä_2†k‰M³6"èñò4c@Æ€ŒÉ`œ–¨¸aO£fÜȸ‘qcøáXx}€©vì`ܹÓÊÑS•1͵Z8ÐÈ^vfLs¶Ü¦i,11 ƒ]28Cº mއw¢`Ú&¢d 1 õóP;†)eÜȸ‘qc˸‘ÏC=¦)5¿eLsQ+ð}}ʘæ”QYLƒÜ‰Šf AÌàòÙÆ ´ÍðH€gDÅ€r Íà¢Àa滞Œ$à=j³HÏaÀ¥Ã[Q281à9ÞN×jŒÃIb"6ËHø8Èsoº2ò¤<øùn‰Š6ÇlC‡HÏñÖÇ€Œ$:-QÑ¡ÊÑg²ÌÈåÃìôŒâèljŠMŽÌ8£€ˆ²pÜ`0Ò—=„IÜ`˜"G2\s¸·½™1 :ÄÙÏöt#Eª|rFA¤´ÝEE.q‡HPšœMãšqdKJdtÈèàÆ€4ÐÁ9ÏÆ5TgÛ!£ƒ<:0©ÿ£¢ƒ>šÑÁEõÃÄCetH¢b€É‘ g0¯Añë¼|‹™1Àp¦iäé³eŽd8kÁ1ˆ‚ŒXtÀïËÓÈZcëãpŒ9¨åνáFF×8©ç¦±mŽ~8ëMT’°Uñ8žÌŒ®q,äŽÅ9ÄÐÁ]œ¥*ËÓc/\œe¨?1];¿Ò¦0¥X¦”8êCeÔ㢳:¸¾Ö%qTÁÕa0±¸^ÈlÄò8 mઠ˜$bmŒò¢ÚZÚÔ œ)–!ü x,ÅXÌà7æÍ¬qÌ~c°8ucl ×ó vÁÅtÚøƒ7.^9¼K<ªÝô-—jÍà­‰uÔy"`T.Dªµ¶™è5Ÿ²Z¸l.΄Á–@PÛ÷¦ì^«IoL]%Œ“Ä®v”ûH ›‡Âa,F¢™q0#ß_m«¬/wL!±õ™¯úÞT±¯jõÔ¥Èü©À›÷„†ˆlŠ34nTÃWMm£&ªÉa­âýÈè륆aQÓÍö"ÅËf§ÚK¼ÔUÏÊV}?de˜~ƒœ÷¨e€¶r¯«r"Ÿˆoð8 liao͈JõÄ\—¾Ñhœ7 ¼¾ÓV@îLA/#ÕÞ(=‘8ØÛp*>X²­ùžx>RýöÇÁ<‚Ñ;C­î›® ó`ØA^ØAÞªq«¦´>bE,ÜW•>ÅÌŒ^¶z¶T¢6‡ÃB¿Þtào$§GŠªŸË$|‡Žs1¡óô§)IןУM¦$ÉžúWí>’à5–]%Ó«Z´ÃȆû—ªq}ý‚ÉÙvKÐ^OÞ¼<„¢µÆ_x™ °¹B—½ã]÷ëuLˆoÔÔ¥2帉kû{ózX±Ì.¡¯›¯-ÞæÄ²0§PY+c-»pÂ3cØŽ™nÜòÀâÌè\Yw§šášCu¶$ý†óuÐK’vƒ ŽrŸL©gŒoJ~gÇL½‡¢›õŠÏ×Ï<°É10ÜÊ?"C¬¨/ Ÿù¬& wß-ž:V‰LL f¦ ¸°¼¦aáõ¢â‹à*kÌâb&x0¤ÌŒ¾ó°0”©¦«£ÈoqL:β+še÷戤‡ïMpÍLG,?ñšÀàˆ}Ìkâ]SËÕñ6xýŽóñ\ås4áù¤,£¯ñ{EYŽâ\7Áouʺ¢ áFu•Ø2¸‚fÂí= Q‡È\ºcõ‰{c®Òˆ0†E7Q@¬õLe¯¹î’‰:ø2&qŸkj=)êÁº¨²]¤ ¤ÿÆ\óŒ P>ѵnü©wP)ûDeÿ yvñàÜmJ•SøÙT|¢\0Ñr„Ú,§Hq$ÂÆ;N<È$Á‰ ãýÒ±8çËêûí›æ¡'>H_£ %%ID^ºŸ‹k²IÇ…°T`G“~…á(vd‰Zc¦Ä©[FÆd9‚w7NHF”&§Ê†â™bÚpAéõw¥¯Qæéc§ÇgJ?bIZ}Ï8‘(ú¦žô«1§r$­ìæô¸5¼Ky¸ýlßj»É¾c®æE­l!ô…rŒ3p<ã!oQöH[ŽS¾ÆWª–tÄúÝ¡pj=8S|âŨl±í‘^·u³i©0ØÂà¥"çÛz‘WŽä‡Øÿƒ=6*ÚìêBU›–+}rŒ\­~ÕŽÏMì¡Äi¯Ä´Áo0XvRÀâº0å;µ´›Þ©XÃÊÚø„w§žÚ8ÒWq™wŸÜj¥O&ÏGpá‰7‘­IÊDààÞf)‘˜X×Mÿ¶ýf~{ÑĺT“½CÕOÁŽ5lPàoˆLÚk©ÓLñgËNáVÎà†púøÀ ñÐ-BjÙAQží¼Ç}Ö“@à$–4œ‡ÙÌÌ3¥‹ñÔ§Û‚ Ðt¨IÜ[$ÿ|­6õ”ScáÏÆô‹ÿ7†IÚ+9c%3!cÌËp5r}aàÀ&[»cy˜n& \¤è…hÊ ê AäG÷Hƒ›¸œ1g€þù—ß  ?ðvIд=ÍDFËéaºc¸dÞ y¼kaNLþÒUS:9ÎôU9µ”˜3}ÉW# (úU;ýMžµ)Tî©E `À€,Ý2s§ê-Ç,ă¨R‚íÇÛžÙÀ„†[·o¸¬šÂ‘‡3Ci¾ø›n oáæEh:*ƒÇú3Å—3p¦ Píqþ„Ky'ÓHz1yÕR^0ÑùY¹þÈæd‰Náߡԉ+‰Xëí“Bp*­7 â\ˆ/DRœÆZÑÆíüž?„Ç~V_æêÐΜ±³q›TÏ„wkç+kÊ©" Ë Ê%6½g¹a™å:Øè¼à’ÞÛ|6%¢ó,›Ðë½)bwuÏkO0ZÞoâ†;eÄA€z´)›‰uÜ«bï6÷˜r5±l`ìÇcòúWñÑð‹)׎y°ºWÐ'1;š!w'LÁŠÉ4·)¦Ì·§ƒõÌëY0Ÿ“+žxë±5µ©L1;zHxᯠ¬­¤Ëº0O Cƒ‰‘[ßu糟™»¤õ]]«N˜¤7&qO)LHæL#ﲇð®^Öekj× pœ†Àž™°Ã Šžs<"¶/Ž£œhMÇM©Ž¹;s˦ªŸ7Ÿ|ÆOĘSë{ƒd©ÆÎxüÜlkztôú¾éÑX<\ÿ.Gx¦מÒÎøÿ˜S^‡xýò83u<ŠÅbDL‘#1aS$0S’¾ÄH6ª;¨7YµÓsm²aáü¿Z#.h|I9¸x“!ðtšCÝÞë ËÇñµ3ÜIß$€ÜÍ®ÓT—2ªU=rW#rI[T±ï³ÈŸ‰Ä{Ô2€G¹×ÓÔóêñ · Yj/õÖŒ–Q=) ¦ëQÄ‹Ö\Ùâ§·Àª½9.áù7˜½H¨j”–7 ôiûM(ìÆKhÈ7‚6%–qvÁh0ʼn˜„9§:ÖfØØW´ø¤mdRþ,zæ×Oet/™V¼g¼ïcå„J¯h2#CLŽ&B¡o„˜$1Œ Ê&A»^tdë´8Ø%›æg)_ZHUÕV]åÈÖBäWa¶’OòÙ»GQ ŽVí8RÎ)G Ú{SVÄU‡T1ZKÂ"IœÉÜ {h<‘Là)¦R½“b™§c¾=òç2¯²Â'Jª›éùM¤¦¹¨ó’FÀÖJ-éðàáWqsž’…¼`SnÀÙáfIv°Ö#uxÁÀHâU}:š®‡$‚KNµ·lº„ÁY‹»„¼‚¶v²fŽÐ Æ z`¥žžëơԉë?á‹As4J/SŸ >ã>/°—L‡åÖå¹qÙxXXŽ*ŽËÔáBy°”!¦McÚpí#Ìk\„r‰oq$©UË’ÄÅ푤á®, ­Z¦Ç!ó¸r–yQ‰£ªzAÚ ÌAî(iÉІ¥K^";Ç1S<†˜×Ë™ZÝÞ ÿTË­–àNgt2.@ú@ÅEr‰ÇÃ7ƒŸØÁQõ³m–×Q´ÅÁ_¬Ó¡®uìt<¡±¼hx2pHEÄ2Þ¶ªoX-#V ï J›j…QËb,s.kç3–f|þ¤Nþ:ì]¢¹ƒ;xG‡8KúsáL±„Ä´6Km—eùÞÎT˜YûÑu²DÚµžlÙæ~Æupί)¶¨ù(IŒŠBv|—QHF¡ 왣üw¿v¯ ;÷Á祿pÅM]s1’2ûB®ëw'm]ôÔ]º“ïqµ¾p5Ó{ðõ_8ãv5oìj½¯fzz .ÝW½ qÌRÔÑ%Ú> 3E øÖ¾‘T@bÇ.³ ›úR÷5l±h ÷¿.%•×ÔÏ®úY;ü¾£x¤4pNX4\ ,¦…ÂŽÅsòKÉý¶ƒ8Îp{éÌ,ÁX²šÉ6pÔtÇ8æõ‚6¤Áƒ¿ù0P_M_ÙáLÛpÇ| ,à bþ)„[,†¨q~IÉîÙº0ûïÏ7/Þn ‡ œùR•ÚçÝç§ÿ£„µ endstream endobj 5570 0 obj 4505 endobj 5574 0 obj [318 /XYZ 37.5000000 394.250000 0] endobj 5575 0 obj [318 /XYZ 38.2500000 327.500000 0] endobj 5576 0 obj [318 /XYZ 38.2500000 410.750000 0] endobj 5577 0 obj [318 /XYZ 37.5000000 394.250000 0] endobj 5578 0 obj [318 /XYZ 37.5000000 356.750000 0] endobj 5579 0 obj [318 /XYZ 37.5000000 356.750000 0] endobj 5580 0 obj [318 /XYZ 38.2500000 327.500000 0] endobj 5581 0 obj [318 /XYZ 38.2500000 410.750000 0] endobj 5582 0 obj << /Type /Annot /Subtype /Link /Rect [106.500000 365 171.750000 371.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_std_shared_ptr >> endobj 5573 0 obj << /Type /Page /Parent 2 0 R /Contents 5583 0 R /Resources 5585 0 R /Annots 5586 0 R /MediaBox [0 0 595 842] >> endobj 5585 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1409 1409 0 R /F8 8 0 R >> /XObject << >> >> endobj 5586 0 obj [ 5582 0 R ] endobj 5583 0 obj << /Length 5584 0 R /Filter /FlateDecode >> stream xœí]KãÆ¾ëWðÀZö‹Ý‚óÚ9Xì99ë8á52ñ!?”Ø”4$¿"YªnQyaïz¸lV×ûÕÕŸþüõÅ¿~/>=}ýOñ-þþôuSn½+ۊݯN Ã6þ¹ðÁß¾oÞŠ·Í—Í—æ¿o›ö…¯Omþô¿Biþý¥øñïÍŠi÷¾o¼òÍï¿î¯½jþT~ßýüß›¿ý¡øm·b÷¹ÌûÿÿÁ”Áû°câÓo›n›jÿë÷o¿m>µXö•JyçªBYc U[]ü÷Ÿ›Ÿ›tË—ÛÚ*å+ëËs>äõîKÆÔ…ÒuƒvÚÿ’Y^%XÜUUºÅ÷‹cE™JÑ«oƒ5ÊxíìŽÐ;"»tóçæöŸóöU©‘憜u>ÚŽË'XÜW ¹i¹8V:‚ãÕ%¥9hÕ"È6 DE‡åà?hŸPš÷‹c¥#.^=±4££¸é²N@“Ãò)îL:‚·‹c%œX=5Áwþ@‹´f%y´——_¼.½MGð=äâXéŽWTßµÒ>J³õ ðX>q7éßC.Ž•H\bõÄÒÜp•‹H«xß'Ë'XÜÕ UÅrq¬t¬þeÉ*”ö' B|#^||Ý|úÜø¶UñúsÙþƒío¯ß7¶ùŸ]´S‡âõ§âe©ôŸŠ×_6aê²Òn_û¤ô色ð§ý»µ¦ ÂO,z¢k¸6 *á;¡}2ãÜ­ë‘ò²â¶ Þ¯VAÔþ‰2ÝKs hWSº{t|Çô·é„9E=Žãï嵆óøXÙ±²w{V®œê¾Ú‚Qo÷аØÈ“験ôÄôDUp5 asð‰‚ß«•Ïp5ˆò3Ü©AO,„Í@¼a¨5Ä›±9ÉOÓ^AÚ—˜+ð¾!÷áwˆÕ '™œòê«–G!¸NyŒ¦rÑNeeC`1Çf”{_†•{ ùÓdR‹Œ½c2R« °®Y¿`9Y³~ÁP;¡“ }Xš{Pp?jÌåÔ9µ•­®Z[V‡ñLGüæKl"í(<™‡òÎÄ@¯ÜV^èµ`š­³ÕîÁɦqpˆß ð Ž¿aàŠW3ª%Fë4ã4B?^eA?ˆ÷?`ä1ˆ¤¤Š2ðξ°-Ùú÷¢ùƒó3ø;XÈïl\0’!Äò˜Á«é6¥º—Ψ‚߉8HiÞjÛ·o˜Mf+YÕŠA²#œàl§¡§Žý~)ó1bûÑ öKq$…c¹‡å°i ô¦ \ãøz oy8É›iN‚øÅQ_Ãï`Ã|Éá1óÄà>y`Øàwì`9KÁcËøîsHÌXäáåZßy9;/s¾SâÕôÁZ~í[+•„c1_rVcñåcF,šixˆ'˜{îºBXº‰l8÷Ê*©¶>ƒÇ‹1"jï ü2`ÜÄá6Ñ,5¶aëFìŒkF5hÍô!pÍðŠWb›ª0Í—²OnŒË9übÄj13(üÔºó¼Á6ƒá÷ÎW³ eYe–YmƒëâGYû™êÃ5‡Ú¢¡6±§F޵ÃsF©ÕÖ1¼¢§Gk¸Ãî®7rËLɰ6³dÈJîš!z}8tÌç©…²2«Á§`pf>#…´rÀœ63ºo­C [E¾±NVíD¶R–©c‘\)M±UÇØaXhNݙا{ÏÉ©åÝŒžù»¾Ö·kæå5kÕ5ã-‡<Ó§©ƒ)ïsÎLyŸsFÒisÎÂnÜà¤d¯xî‰ð\%5®`ßcÒÏÄùˆQ¢€qžsyfXÐË™ð|!ìgbÏ#S1I&co«©ëé}§˜Ç“ewuœ¤Ã ΂ »ùû׬0MnM p&“­b’W°ÞݰæpÊLkÑ ”„£j(T=¶i]µ›> \P­C§Ê­kÁ9á=‰Â䶺r½Èã3ãø [Œ±ÕB޵ÃÈNöÓB Ô¶¬ÍÌ'ø;ÝÔ3=œzÖ²„ªºÀ웆;mt¿5 ¼¬¶Fé^°Šqða{ìvêz;chÆV+á;6ÈÄNÅœç$^ïGû„JÙ÷ 66Ðè=‰Œ<f¼¿ƒa㬙eìNOù>áBOJ¼Sü˜VÂß!RO‘õt+ås`S/è;¦¢Qú6f8Z֞ŕëñ81ž1**ÛzÞ1>žx„°=B¼ÃiŒQQ-¢Á-éGµ¹ßê8FË£ È΋‹Iœ‘im‡]¦Ÿ˜ÄO"¢0 —Á–v¶!γ†ˆ2²ÏxÞ+û¢T'K:Ïœì—WˆE -ŸAšËÁô°ÌÒX)aMêO7S¿Ë6ØõúGxD*~2ß´r&äæqJLtØ1k¤1Ö<˜,¶ÉÁã‰dUß }¸bˆŸpú¦ï¦û¢¦{7å®gTž—+–^ãèÜôøðWÉÆv+—¥™ßXôŽÍ¯èwþ’èuxô?ÇÉt'¿¶>¤ô$\Üs#²níw”àjNX|0GBŒW[àC ®Xai›©$O†Ô?XÁùÍŒ„¼`á–œüÁ¨*mcDD†q‰•ƒÛ ý!¯^ÛSþ”´ï/uo2‹'Ô|žÐeèóDŸ1ñ–d½LV‹ 8‘‹ãC†‘*hs2•8h…–Ôv„ÜÓÑí®/¾ovwÄŸüà×Í×D,´ûPOcª`íÊPŒ¶)"L#´‡¿fŸA÷šûFö=i½ußcI¸4ß_–Í)±#¾]þv»&ð;°rÉ;æ‘cƒëÓ“Uè±zûTrpÙ~ÖÒ%’‘˺ÏÉëï?Ãa®Siþ˜ÔíX¯¯³¬^¿‡bl§óï<Ì•ÏÃI-ðqn)<ÇÀà‡A8,zó×eÊæþ9lÑ…‹Ž8{dóÈ.–ô ©6r_÷|Âu¶‘ãÕp{÷CGï~9Ñ( [›q;tä¸1¨qs5nâžj®^„ƒXíƒC[Ü+ˆ7ü„Ñ”®áb§]·³èƒq`°,0x4V•Ç Àœy[È|Ø"¡Ú²J÷ô¦/!e/‡Š±µ7½ÏŒ~ÿI©nbQ_pymâ‚å­ø/7_¾(Ú è¢{Ê9œ¿ ÈAqŸï&;Å®£³–Nw>öÙñ60(¦kh«@ˆcæÕÓØ;óÒGƒÇ’1 ÝN”.úXæt 9oA„ž+q—i£óßå¨Äl÷>Lu¶>ŽùÆ|0ÿTÇ#¼DL0†{Ê"2‡,Ó‘.i5!Uݨ˜k°Ó¬˜öË4Ãf侘{}Þ„‚7¸vâÜ”eÙlÚr¶ŽYTÖ$ÊÖqd3ðF(@ìÌpB3ì‚A¨sœ Âç/mßÞ0,(ŽÒ >Z`x8š Yêy„ ޲¹xLçH âPc$$qm>àÅ9H&v•ÂTåLS FÔàY™Ûž¡0+ÇÄ9¶ÌÉ]þКDEàª\:ÎÁI‹›KNÇ)Ò´m2HÉçô‹aÇυµ' Ï– Y¦3–Y̲*C?&¿Ûe€*åülüd´¾¨¿}SN£ÒºžÍœË*ˆÁ¼œ U¦F°¦äNSìôg dô-„™Ér¨#CÆ3tø±Fñ×äRs%8Kµ¤aøÆŽøÎ5䯉œGÚÂ͉¬ƒPç*Ôº«™[Ø$&œ=Æœð0; ÈUYÃ,ãÇëãpõ«à¯|²âërVã“-»HdÏÔÇæÙ«äØ\<WNÀK”4#^ÅØa 1›º”Aꪃ|[—‡+®“cWpU’(Ç—•1.š'†øAjùDùßa ĸʔÀ¾b CÀ¹.C© %‹¸4ãšQ yôib¸Î6¹xô:mè*ü´º<6F_¥Õ[ÁÕ`Æê­<æ¨K§®@î“øÎiñÛ&„jU®ühÑtÒEÕÇuqNcùünNÚU¯¾Ôá÷³E‹vΘ¬)ÜÌ+:ÉCøðsŠ3Y)‹ÑŸ¨±ÄàlȲ&4XBËÖ&1m}Xœä7z /©ÝÉš·ËÜ’iã ’Q?'š:/>-y²NŸ%àPÕá«ØQå$¶DW#ÒpØ&Öª6‹¾»sþòh1º¬X¬Ã{…!œqx‘ c¾Ék­ü$…ÚaîÁ»Ãi\NÄiMÌÙ8IŠS[÷4«˜‘S†µ©ÎàXΓ[+Õ`Í£ñ~’N”Ö–À5NÊc½å,“÷@è†N#´ã.5‡9â€(‹­"ñ­›¤ ¡áÄ g@z¸À@ ’su×ôAØ{,iýpy©Ú{,=„=æó+plàð~Eȵû/FéIxîÅWiî[‡ 2¦+¾æ´'ÆÉ[±‰*¨-;c+<;•‘Ѽü%××p$qvÇ¢»Øµ}_wGUà FVÇ3Dq×ÜÈ6^ ¾{Ô¢­ŸÌXà2ÜîÏ Ää/0{Â, !%0 ˜2;fŒUˆ;Ì%Ñ0ŽˆüN uÇÞÁ8ÀŒ9+ôÄ€`¨¾ÄûzFi°‚Áïµ|SV¯ø²ù?QÐû endstream endobj 5584 0 obj 3944 endobj 5588 0 obj [319 /XYZ 38.2500000 465.500000 0] endobj 5589 0 obj [319 /XYZ 38.2500000 509 0] endobj 5590 0 obj [319 /XYZ 38.2500000 465.500000 0] endobj 5591 0 obj [319 /XYZ 38.2500000 228.500000 0] endobj 5592 0 obj [319 /XYZ 38.2500000 228.500000 0] endobj 5593 0 obj [319 /XYZ 31.5000000 75.5000000 0] endobj 5594 0 obj [319 /XYZ 38.2500000 199.250000 0] endobj 5595 0 obj [319 /XYZ 38.2500000 199.250000 0] endobj 5596 0 obj [319 /XYZ 31.5000000 75.5000000 0] endobj 5597 0 obj [319 /XYZ 38.2500000 509 0] endobj 5587 0 obj << /Type /Page /Parent 2 0 R /Contents 5598 0 R /Resources 5600 0 R /Annots 5601 0 R /MediaBox [0 0 595 842] >> endobj 5600 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 5601 0 obj [ ] endobj 5598 0 obj << /Length 5599 0 R /Filter /FlateDecode >> stream xœí]K䶾ϯès÷Фž@`_ ‡ /CC`Ç ŒØÈƇüý¨[ÔÌ´¤¯$~S¤¤yaïxµ¢ÈzW±ïþøýßOÿüíôîã÷ÿ9ýàÿøýCv®Š¬ûçtùõÝË?°õÙÿ|ªêâôÃ/ßNß¾<|iÿûí¡{áûnúßÉžþÔþûóé¯kÿðGÿ—.á—‡ÊTíïÿ¾þÞT¦ý){úýòçÿzøËïN¿^Vì?ç7sûÿß¹¬©òæ²™O{èi®¿~ûáׇw¾Rš&oê“É]~j´§ÿþãá§öýòÙ¹Îq•-òöç¦Ì«¬¨kÛþ\9ÿûñÊ^¿n‹“±Mv2e=úøõ—Òò/oñëÎÕ¡b\iäÕc#¼ÌóhMjO«Ç@Iåêx‹_w® ”ÝpñØØ®KªŒ³§Õc ¤qM¼Å¯;×Jm¸x\lÛ,³¥Yû¯6Ð^.aqk¢i ¿su¨tø–V?7¹1Õѯ1º3äµñªb€èyù‹—EÄů;W‡J\¼zln®2çVŒíÂ׃íyù‹×E4Íàw®•áxuEn6¦ð⮨ô!ô¼zð›vùx‹_w® Z¼xdV6¶tÑ̰«Ç@ˆ‹gtûÇ1ÄÅÛ[“<«êþL~º¾B¬¬Z‡ÞÔ§ ’èËÊ*ö—ëվܞ9)¨ÍÅyùKȘл?‘§o‹¾>¼{4yÖzMåéëOíÖ®ßì~ûÚr\qúî41öôõÇÓïÛ-}øÃéëÏ͹´E¿Åî‰mГÌÂ'ŸÑW£'¦„«åpoðkàwàjÌ“ÌÁ'áQ¡ƒam æÜ[þ~gÃt`1D1Ü0¬«ðt€÷†! Ÿ%h‡9€mˆÓì1ü‰°7ˆŸó„¦xaà:|þÚŠóè’Ø™p –Ä9”·”$ÆTw]%ÄV±y)` j[Éd”±–ÑgXúÂïàdŸü`:€XÀçÁòÛ¦G—Û¤e³Þõ 2ÍQÄ‘>þð(J‰O<"xPTÙ•A\ÞØägknwmëpe†Àëªï-’(&™`ÁS›5Í@åùrÂg؂ЖÃ$ºÔÁD‰Ù‚’ÜË›À÷ªw`–ß/åÚ’ù”Àýñ`· 2Ö÷y)áψɸr]LÎØòÆÒr˜À{X.¨ŠÑ`Uë4msaÐêÛó˜×±éŠÅ§Ø¨ÕèXÞ 2¯ö ¢ë€ó/-x"¸Y¢êAC“(ë‹­¨þÈŠ£4‡æˆ¦9Š¢@7/½DÏ–[S‚+A/fØÜ–^€û1²™ÜŒX‹Kúe>$}æÆ[ˆpêÞ7ãû2âÖËÑq|Ï‚Wcb¹Xœá½Åuá›Ø(t/}æ\%›oVòÅ•JœÛ!PV¨ ¯áwˆwšøË›¹ò¥O1]¾¬.†¨ÿDáïÃ]”õƒ´‚»¡!<‡qdf¨8ŒSFB€'ÄHVÝ$nT‡«ÙÇå$X"„ ’¸°ñoyk[@¦À¤€ƒ¼Â9/J‚¡°LÙ°Œ ’FíånFhª°)s!-\’¨ºÛÔwRE—ƒX¸hcŠõïȆ÷š”ª$nÚ•!’AcÆÁl5Ð]ØÆ.è*ÈKpª$MÅ3Ƈ¹Ñõ³ íl˜<$øÄ-%yV—c©¬s*¹#Œ…¿\„ æ/£P‹5 ¡KÕ1ß—ÐTMªd¤£„q†Ç¬×5PeË¡[¸O‡J7? ÙÑڶ³r÷Â/ 5ޱbð–4BQ|ð1³<ŸGf€“µ½@¨³Ç¼†óD1ÊÒ*Š˜š³tÚØ õ{/Bo—sãgºó˜ì\VæFfãÕ0ÝáwR¶¢©›£Í‹'‰ZÑ)G¸Ü’(DVN·ÁeÚ:¸ ýhdzÛv ïßq %ª&Ûghúí¥™DIæ¿ãø—d…/ÓºgÕt ;ÐU:ý¡2Íñý ¦«êaº÷`þg„"»t½V•Å€ôtó\Öʹ ´åò`¡¸já<.&“ Èd 8îÌT 6Tc3Lð#9´OsjÄ>jRDÉ^î­H<Á dÔ ‘ê­\Ö~ÈÜ ™‹ÿ~H .‚†BFu`±¹|2‡‚)™^tó«Œ:ÑÍþӶ1Tõ®„!´=-pã¼z ßvš  µ3†’tªe¹‚!…#³Ë˜ÄR¡oƒÁåî<ÓxŠ$)öëMpÔrq±‡Ix÷–usdœl<ã„ȸ·P[µÐʧªÞµ|Òƒrw°´{;|¶•l‹4ü¼÷,_¬Q~Vµt©"ƒ‹õ3~çàç­hTcö=X,‡ØJÆÇðÇdtp ±âhg×C¬¦<2Ì ºÃSJb·‡1r‚$†²†’Ę*æ~¦ÁV‘ï[ª‘²c g¶S+ôþr¶¼Y¹Yº<, ñ<÷iI¤¡¾Æî@3ôÐ?CÿõÉ4SÄíe3[ôÄï“Lvî²ÜFªzâ‰g;L3Ä;ø;%|ÒÀÕ:ô^.«7•4ñÄ ÕÙîŒáyüÍðÔ“Ïð;jÊu&‹Ñ6O‡ÖÍbÄ 8mA¥·îü+&Y…Èá²p–B@ʺjå "ˆ¤LwR*ôžgWs€Uiˆ.²[¬·`Šjv•Lp€n_}!’¨'Z3ã±0n  uký¢±ý#F"¨Ìƒê]j‰ˆT¹—Ly‹@©êwt+ÀU­&jv|ª‚«DãNˆjª˘ÐoTá•F¿j2±ª…wôµ Õ‰&3Å@)nG);:ªuï‚ȸ ª{ÆÆj´­]ß%¦êÕa¯Í)âº}ÇU‹±„î‘kÊæH4~xËe}ùJD…&˜ >,Y ’´˜¥«AwP†Õ06FÖtN­uJfºS¾‡ŠªÆÊNÂX¯š]·kÓ¾…)¶M5ÖG%p '¦¶Öëî✠.P”çÉ1­îÂ`òa‹¨Ø"S*Õ`߸“ (ýÉôEÃŽQm–M3P›;º«·^ÙtØ’ÀužÄö7q¬p¦¥J€(ߪ:-L{æŽy¢+»Q *b´LІ5¶ê±=õ5QžN§z³%DjuÛkbb¯#l}]KÆ:pÄÞ‰âÝ«õO™‹Úzü© Ø÷mw`ò(ûË7«;WX7lEäÆ }–Õ !òðåvnÃÕ–J‹oB¾“Öåz]YgÒÕ]Yß~r“éêþº%(]ÝWo™âÜY¡/ÞÁ{ó æe‘ç'q¥¸ûŠŒ ]ãiñÜ|ÇÂw(èàd~¼7“È*ÉŸã«ëÕÒkUóv¶Ûü0ná™)‡¨j¸p-*®Rbz²à Z\¥ô!ºàª!¤T›ø*§ó\”)ÆÙµR4ï¤ òZ­HuSÐfåiLMTÖ®£êVOÖKå@*'DÃ4Ý$ê-V lϤò0U³"϶ә·ÄÜ<2’#®ru¢À€jºÏäp`î\>•A9jÍ'œDÔx—¹ª·IÃc½•gÈì;¬«[›jÁêš|‹¥Á¸â ——k÷dX¿wS…© Ü·ye& ÚóZ LW­¿®ÐIƒeÒ’"7«Met`Àí.¦qìã1ÎGjð)Ý´åéLG,q‰É¥KÔŒdý0¤ ²†iT9`$ÌYM1Uca‡Ê]Õ;\ )J[=˜y¸@±\ d5=ªZù°X7m±¦êPöV,ã¨}MÜÐÛ<ŒniµÃèŽet ×s©ï±Ô?s ˜ÆúN?+Mo#ÀN¸ëÍUßJ%O’†ë…éGq8Ü4›¸¤ºÓ8Ü©%Ä-€¢›šj,†6·(>õ?ÇcÁ˜½ - xL8ⱨÌ,†|ëŽSvx¨Ê›üÆð–@cÄXAV@`Xc>Óu+œÂ:ñ³0^P³¡H‡f~?Â`n8¼èÛ–ÌÀ˜C:¼5éP>µ1pp¸ZÊÁbåSi©fü̲v·$6Õ½ŒN1:¦òŠ©{Qíl¢öY«ªeZ Œ3ž˜º]&x¡;Rf3ya¹ZkÚyéS¹}궪#Gñ®-<©®U˜RóTE1{†ÃKË^c‡¥Ácµï±Áî€áaïÂ<,œ4%?6n×x´òºãŸ‰a•B,™}Û —ÖPÚ5½ä*Rñ=ÞAR<º§k¿#ê±²¶ñœëú©ñI¢Y¥ywh“Ÿ­Yìä`ÿ'*m/QŽJF[m\fÜ&\Â;nP³¼E7­K¥M?5FU·ç^ÜÚr*ŠÅ¤¨%dê•wÖÊ·0f ÅvÚ3% ÑLuâ™ Øðw5½ÏƒwÒ(r<„9Õ½Lc{G@èβåäÞ€¶mÈRÕ*2¢‚éAÝÒƒðcWÇÅГÛ,%»“²0];Z·È,F é}TŽmf MLÕ]ˆ‰$D½xyº•ȉúÔÞëe¸Ë }=²í°À±X,«Ö³…4a¤þ#aJDŽªéÚÛéx)U&œÈè 1ôE®2æ3­™µ`Ôwþ{Ö‰ù#¤Wø„ š/ïÑÉØrX„3£y©Ö -0ýéRÙÚLSKYÊ©¬ÖØó—1n™€èHNíï”oyLk ô£#k‚à\UìÁ©ã¬Bùè°D*m¹SÀ}”ÿm_Vìþ#¸lËá£Ù”RAÚÜ+Qí¬I|™•+Y+$þMKn G»AÜ!¥úö,ëcÀÍ+/¾ðdk¦)Ѷ<äú–ÉÕ•:Ëû=…Zð¹@L&j´tä°ã0#·¦‚|‘nÏÆÚCÛN!˜ÍÂãJ5Y'UÆŠà:¨¤‚àVõ>üL™,ÄZ‘ðtH¨q ZNPÊVµ_a]W”C È^Y6u}¼<ÒêRc[× qëÕ˜n}ëwPœíg‘Ò+ÐÍKOgÙr—‰Ùà›h½¼ðúdšIšº²·¹€úæ“SÓçߣ'þÐÅÙï žKßßéê‰Õ´ZæE¾÷†ëÄ”{ëÐüÓÀ½}‚ß±áO|!öÄ?Õ¼:»é™4v‚É\=Bü캟¹· °ñ :¾37E¸™ÃÓ„â7ì3À¸l2"ü b¥SäÆT¤êö[^pÈøßÊÕ_º%8pNµ`oc„Ÿ‘YQ¸ìk‚µFµf:»©ªo?¹M»©·›¼)nŠsì¾'VóvFyvÝ+‹lw¿#XapÞ!š‚¶µ0:Z4eO¦  ƒ¿cÔZÁÌØgÆ<̓ÙÌýÔ¨T“„©2_ž*„a®˜ø¢®øòQt_u`2Jø8•=EÙ‡ª·þºVUŽÌ×U;åPIDË9;¤mÅIŸy]ô¾6¢:aèfÚbŧQ@—ìÎŽQ½©z0Ù¥ºi…L`bNH¶It[8"@¦þ”‘pÂwÖšÚ–LõmXYé–Ÿ…tW# ‘ì.¦*PÅ=òn6ñ9¢"mª‘"ÕÕ&w÷É”ÓNq â¶fÔ1*T2«ˆˆ6åúcòªUÝ&ªó†Û†Ãê:ï*9qº:ž¸ä0Ñ“ úx›+f͈g¡=@Ac —ã]è¦@kæB•&*V)C³Ì(F ‘¶úöœ•Ù윰%‡¥ë0yL…‘Q©—fúŒ vÀ£‚£âúËkp˜0ê+’JwÏȺ Ëop Hˆ-'€nìkz¨e=T––Q|ª× :iÿqo¬¨Ö? /o¥z!þ®U;ƒ -¨ê™ŠÒD¹uÊýâT륟j˜¨ò€ ¦mþüÅ5‘LšÊ„ Ú£¨ÌrÐ mÆwCM^ Uëûâ§|eLý”Ÿ‡X £Íˆ"ftœ0¶pp¶ÏµÓäe! `±Îúƒ;™afëÓÅø!(D(ÍÂ8…ï;`Æ©˜Ã'Ýò®ñj)FôÎħmþ44m{÷0U¢’Z9Rj¯È¡Š> endobj 5610 0 obj << /Type /Annot /Subtype /Link /Rect [60 764 94.5000000 770.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn3 >> endobj 5611 0 obj << /Type /Annot /Subtype /Link /Rect [87 756.500000 161.250000 763.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn4 >> endobj 5612 0 obj << /Type /Annot /Subtype /Link /Rect [87 749.750000 163.500000 756.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn5 >> endobj 5613 0 obj << /Type /Annot /Subtype /Link /Rect [87 742.250000 203.250000 749 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn6 >> endobj 5614 0 obj << /Type /Annot /Subtype /Link /Rect [87 735.500000 168 742.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn7 >> endobj 5615 0 obj << /Type /Annot /Subtype /Link /Rect [87 728 132.750000 734.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn8 >> endobj 5616 0 obj << /Type /Annot /Subtype /Link /Rect [87 721.250000 207.750000 728 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn9 >> endobj 5617 0 obj << /Type /Annot /Subtype /Link /Rect [87 713.750000 165 720.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn10 >> endobj 5618 0 obj << /Type /Annot /Subtype /Link /Rect [60 707 166.500000 713.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn11 >> endobj 5619 0 obj << /Type /Annot /Subtype /Link /Rect [87 699.500000 187.500000 706.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn12 >> endobj 5620 0 obj << /Type /Annot /Subtype /Link /Rect [87 692.750000 144 699.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn13 >> endobj 5621 0 obj << /Type /Annot /Subtype /Link /Rect [60 685.250000 119.250000 692 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn14 >> endobj 5622 0 obj << /Type /Annot /Subtype /Link /Rect [87 678.500000 112.500000 685.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn15 >> endobj 5623 0 obj << /Type /Annot /Subtype /Link /Rect [87 671 129.750000 677.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn16 >> endobj 5624 0 obj << /Type /Annot /Subtype /Link /Rect [87 664.250000 114 671 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn17 >> endobj 5625 0 obj << /Type /Annot /Subtype /Link /Rect [87 656.750000 108.750000 663.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn18 >> endobj 5626 0 obj << /Type /Annot /Subtype /Link /Rect [87 650 114 656.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn19 >> endobj 5627 0 obj << /Type /Annot /Subtype /Link /Rect [87 642.500000 119.250000 649.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn20 >> endobj 5628 0 obj << /Type /Annot /Subtype /Link /Rect [87 635.750000 169.500000 642.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn21 >> endobj 5629 0 obj << /Type /Annot /Subtype /Link /Rect [87 628.250000 154.500000 635 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn22 >> endobj 5630 0 obj << /Type /Annot /Subtype /Link /Rect [87 621.500000 113.250000 628.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn23 >> endobj 5631 0 obj << /Type /Annot /Subtype /Link /Rect [87 614 147.750000 620.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn24 >> endobj 5632 0 obj << /Type /Annot /Subtype /Link /Rect [60 607.250000 135 614 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn25 >> endobj 5633 0 obj << /Type /Annot /Subtype /Link /Rect [60 599.750000 110.250000 606.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn26 >> endobj 5634 0 obj << /Type /Annot /Subtype /Link /Rect [60 593 157.500000 599.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn27 >> endobj 5635 0 obj << /Type /Annot /Subtype /Link /Rect [87 585.500000 158.250000 592.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn28 >> endobj 5636 0 obj << /Type /Annot /Subtype /Link /Rect [87 578.750000 128.250000 585.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn29 >> endobj 5637 0 obj << /Type /Annot /Subtype /Link /Rect [87 571.250000 137.250000 578 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn30 >> endobj 5638 0 obj << /Type /Annot /Subtype /Link /Rect [87 564.500000 129 571.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn31 >> endobj 5639 0 obj << /Type /Annot /Subtype /Link /Rect [60 557 112.500000 563.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn32 >> endobj 5640 0 obj << /Type /Annot /Subtype /Link /Rect [87 550.250000 181.500000 557 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn33 >> endobj 5641 0 obj << /Type /Annot /Subtype /Link /Rect [87 542.750000 123.750000 549.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn34 >> endobj 5642 0 obj << /Type /Annot /Subtype /Link /Rect [87 536 174.750000 542.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn35 >> endobj 5643 0 obj << /Type /Annot /Subtype /Link /Rect [87 528.500000 180.750000 535.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn36 >> endobj 5644 0 obj << /Type /Annot /Subtype /Link /Rect [87 521.750000 189 528.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn37 >> endobj 5645 0 obj << /Type /Annot /Subtype /Link /Rect [87 514.250000 129.750000 521 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn38 >> endobj 5646 0 obj << /Type /Annot /Subtype /Link /Rect [60 507.500000 96.7500000 514.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn39 >> endobj 5647 0 obj << /Type /Annot /Subtype /Link /Rect [87 500 121.500000 506.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn40 >> endobj 5648 0 obj << /Type /Annot /Subtype /Link /Rect [87 493.250000 164.250000 500 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn41 >> endobj 5649 0 obj << /Type /Annot /Subtype /Link /Rect [87 485.750000 134.250000 492.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn42 >> endobj 5650 0 obj << /Type /Annot /Subtype /Link /Rect [87 479 127.500000 485.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn43 >> endobj 5651 0 obj << /Type /Annot /Subtype /Link /Rect [87 471.500000 129.750000 478.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn44 >> endobj 5652 0 obj << /Type /Annot /Subtype /Link /Rect [87 464.750000 116.250000 471.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn45 >> endobj 5653 0 obj << /Type /Annot /Subtype /Link /Rect [87 457.250000 162.750000 464 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn46 >> endobj 5654 0 obj << /Type /Annot /Subtype /Link /Rect [60 450.500000 132 457.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn47 >> endobj 5655 0 obj << /Type /Annot /Subtype /Link /Rect [60 443 141 449.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_directors >> endobj 5656 0 obj << /Type /Annot /Subtype /Link /Rect [87 436.250000 134.250000 443 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn48 >> endobj 5657 0 obj << /Type /Annot /Subtype /Link /Rect [87 428.750000 129 435.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn49 >> endobj 5658 0 obj << /Type /Annot /Subtype /Link /Rect [87 422 175.500000 428.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn50 >> endobj 5659 0 obj << /Type /Annot /Subtype /Link /Rect [87 414.500000 137.250000 421.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn51 >> endobj 5660 0 obj << /Type /Annot /Subtype /Link /Rect [87 407.750000 153.750000 414.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn52 >> endobj 5661 0 obj << /Type /Annot /Subtype /Link /Rect [87 400.250000 114.750000 407 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn53 >> endobj 5602 0 obj << /Type /Page /Parent 2 0 R /Contents 5662 0 R /Resources 5664 0 R /Annots 5665 0 R /MediaBox [0 0 595 842] >> endobj 5664 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F1409 1409 0 R >> /XObject << >> >> endobj 5665 0 obj [ 5609 0 R 5610 0 R 5611 0 R 5612 0 R 5613 0 R 5614 0 R 5615 0 R 5616 0 R 5617 0 R 5618 0 R 5619 0 R 5620 0 R 5621 0 R 5622 0 R 5623 0 R 5624 0 R 5625 0 R 5626 0 R 5627 0 R 5628 0 R 5629 0 R 5630 0 R 5631 0 R 5632 0 R 5633 0 R 5634 0 R 5635 0 R 5636 0 R 5637 0 R 5638 0 R 5639 0 R 5640 0 R 5641 0 R 5642 0 R 5643 0 R 5644 0 R 5645 0 R 5646 0 R 5647 0 R 5648 0 R 5649 0 R 5650 0 R 5651 0 R 5652 0 R 5653 0 R 5654 0 R 5655 0 R 5656 0 R 5657 0 R 5658 0 R 5659 0 R 5660 0 R 5661 0 R ] endobj 5662 0 obj << /Length 5663 0 R /Filter /FlateDecode >> stream xœí]Kä8r¾×¯ÈóS#’Á`˜îê6àƒÁ àƒáƒÑëõbá]¸½ÿ}ëA*Å C)ERbfuÍ`¦[!&IIñbÄÇàÏÿôÛ\þëï—Ÿ?ÿö?—oáÏÏ¿½t¯VwÓ?—áߟ–é^Ãß/ÖéË·¿¾|¿|ùõå×þÿß_¦üöù_ú¿ýßE^þ¹ÿï/—û÷žøÇÐhhð×+lÿçz+ú¿uóŸýÏ/ÿú‡Ë߆ãpa2éõOJtVvÃ4n ýý%>¦ÿýû·¿½ü<½€}£)º‹áA^þ÷?_þ4<o²r9YyK>á©1sÂ.NX^æ©VéX€„Bßw¼†îúdx "¼oqY8°Éo'¿C =·ôqß¼Ã~sYh¼ÃCø°ôqê¾@?M]öïÏÇÁÎ}y„¬=‚Ô×·®˜/òÕ™ðù÷{Xɀ땻p…×|ðÈN)rdBX¶»ÇxY9ãûNdÿ?kª2ê]й7ú¸ÎÇ™×~)B±ÚyÅ/«„Óëñºþû¹ö~ÀËWŽû²ÓÌk¿”ðeéÎk~Yéíôz´=âåÇÞxùJ«Ùf˜yí—¿,î|—I¤grµv"_¨Œ%Àø¡ßË_ãµímŒë5öø‡bò¦†›~^ŽÊ·ã^…ðÒ91·²Ë^ÂU£o®ÇŸ]Я‡›é=åÛ šIO‹3ŸzIŸã[¿žûô‡äˆìjñö}凟~ùù«¿sùýOý­ñ#LüÞ[U¸ü4>·¾üþÇË?t4ÿxùý//B¾‚—´C»ñŽø4Þq3¡“áµ×ÜFêEÓîËxG¿*éDr'ïDõªû÷b“NÈîåçñΗß{~»¾–«¸É%´&°Ê ˆ„Á±º K™Ðùz¤§dL8´²Ë^â•K™ÐÙö«4FOɘ°§Å™Ú%Îc4eBñ«‰ »WcÅÀ8‹fáH#™Oˆi*´…a-9†¤p£sûÃë(½Ûµ ¤+ŽÂïûUÊÐ^w6v ndÝ~ùøn¤Š"wFÊ·þG]àṕòI7ñÒöœ fä^ÔA§ñ0=e&™ÌØ Òn æÏH1œ!B›Q ´Pñk~¢Tñ ÀxâO6Ýáp´!gðyÿ ¤'{£Ÿ”‡!Sôó¬Ì~£äÜ8OJkŒ÷F¿zÖn?ï¬hÝûõ× ,£¬@Ð?Jë%a³“)0iK Lz¬YzJ¦À†VAAÅnâ¥A Lê’“ ¹Ú ¤Ã4U`JÆÏù6)0yàú¡Iq£ ¯P$Ûp˜ð$¥·búéßb­vŸ>Ë·Qx`zöt÷ôW'ŸXt ·NîT#JE5bº%a³Ô˜’™â¦Kùî)™Z5»‰—©€’• £r52¶‚´H‡iªFúµZ°>_¨ÕÍ•°bM?”Å{W»Þy@” ýR8Þ/ýÞ,i&é°É×Íœƒ»>èv­eЯ`Âfm)h£K ÚX¬9ÇPÒ¯C« €c7ñ‚6ª¤ Ì†‘¹‚[AÚ ¤Ã4UÐvþò zm9ê°\š`¥{Îê}‡®ÛÍ”žýîÉïµò†éÅ;½p¥•;|ä¼÷.i­ˆ¾è›„ͪÎ)¤ê”T3Xc¤©†VA•Ånâ¥BªÎÉ’ªs"Fäªnli7ÓTÕ9}*MZþÜÿ”aµ‡qÕ¶Ë’ï‚(Hë—„­²d:™Ê’éTA–Lx6!ð¼…±Õ$+s7ñR¦²d:Q%Óá0º™~„&Ó]æÙŠ¥,]‡i)K¦sOªl‰«š»•'¥m39UuÍ´¢$2ýÈñ²hÍIû†´æÌ¤æ|w–Ñh¿‚¥¥_MΨU8ïîl6¦‹ °~IØl¤@@Ê’È÷&îý=´ >v/2²+Ó%3 ?wé0M €´O`NDz…B÷ÆIáir$HÓðFC Žúà˜ºº¦»îW¸i·+0FÊÀ’p7tÉ@ôãµ(@— (+2c*!­ì²—xÕ%Ð%£|ºd”Ãc(—A—Z˜iè%}޶Ð%懋…')ÍšÖž|׿l޹­L–öÍŽtíp•i¦â¸ÊUQ#]ø<úµóê~ãJÏšÿÑ^î>¤œ;ëa¿$lv$µGޤéJŽd–0!3øC«à(ÆnÂ¥öȑԮäHjœç(™#9¶‚´H‡iêHšZVŠúÎùX¹sVHOª•–©_ÈÞh!Ç-eÄV"ú|%e—Ž>lOc¬Øú1èF]ÅI~:uD‡q8ž‚Ùé§šˆ£ »#a³~´éGëKú1K'˜NHÔÛÐ*è¿ØM¼tH?Z[Ò'GJ¦ÇVvé0Mõ£‹xúGÌZп©›ÏàÈ߯ùùØíBì"ŠMu~I¸±émºØô®°Ø´ƒ¨% A;-“åâØÊ.{‰W6]lzSZlz›^ç‹Ížgj–‹Mo`±i»¸C@Ù)µFoF­sR cIûÞtX‰•q¨bói]ÀЇ¬Å&)Æ´+¶éÊ4ØÖÔé´Þ±]ÄKÉ!¶s%lµçV `½%`½Í"ÚVäÀú±Õd¯çnâ%Ö[QÖ[ãóÛó©¤Ý@:LK{neÖ)÷¬õNÆ,g¥8w(+#´EN^f$læJ…pÚV•pÚVaœ¶U9N{l¸N%8í8Ì•+U §mÆi”Œ+ՌӾvé0M¹"N›^grìÇJ^ºª‚ÏìGÝÍštouï»e "´EÚnIØ,KAj­.Ajmj²:‡ÔŽ­‚¬èR‡¹Ê’.Aj­Æ³’É’ž!µ×n ¦©,™ùs2R£{Ê*ÇßÙË•FÌÞ- ›¹Ò"ô£µ%ô£ÍøÖæèDZUà:› ã0W®´%ô£µ8\1P2®´3úñÚ ¤Ã4åJÑ+)š+›;л™ÐͰA¡—„ÍLèlÐúlÐz ´>‡ Ž­“ù6‡¹2¡/Á­Ç°Á’1¡Ÿaƒ×n ¦)ú6ÈˆŽ®äi‡y»[¼Ò £^Ån~õ~Vš~IØÊ¯N ”S?Õ¿ºlåDŽr[Mü8w/ÊɉÊÉuxM8P0¿N­ íÒaZò«·QN7n…;;¢–,ˆLæ)d„j|ëDŒù‡ C$læ[Õ!¾U¢Ä·Ù:Ë…uVÂvC«À—±›xÙ!¾•¾Ä·¯JÆ·c+H»t˜¦|«ÌÊ·…L&MM¶©—“”¤#°ÙÇ`’³N²­¡ü,Óvõ¢f̆µKÂfõ³át ³á²¥§Ó9fclÔ‡N0q˜«zfÃ^H”L½ÀŒÙ¸vé0MÕ‹Ög«:wW¥ GPµ G¿¬äÞsÙ阕PÊ. ›U‚A0gJ0—­ûÍa c« ò&)Äa®*Á”` Îà(Æ@ÉT‚™a ×n ¦©J°sÙ?ºödUä ks¿—=­žrvIØÌžÕãsΕØ3‹8Ÿ×ã[ö‹ÝÄKTϹR=>çp|c dìéæz|×n ¦){ú˜m§‹b<@­’ÇóaWönÜá9®ØNZBë-Yý\pNø%ánˆL?³"ã;[€Èø˜“ÀWüIA.c+»ì%^Å4v¼ÖˆŒï 2ˆÌ@‹3Õ ˆÌuŒ–/æt4,–ævšsi»é¬Õ$­žÏsÚÛáè†Í_'sü„#8Ç‹‘îWBR§JHš’’xÖ]H ­ì²—x¥S%$¡¤„$Þx6P2%ÔÓâLa©„¤~%¤"2bÏF%¹µŽÞ¼F6ª«ôÙÀ»YÕŒ¡ü¨d%AHtIŸ<àÇ¥¡•]ö¯ DP%A|‚Â@ɱ§Å™ª¥ <‚ ê9€Dnâ”´X±)´íbÀÂ+×0£…‰aï8¿©ÃÞ±ây€bǾ‹º,º×ÑsÅ2H[£Þ ÌŽ7%ÌŽÏ¢]Þ䘱Õ•˜»‰—³ãM ³ã ŽÝ µ˜ZAÚ ¤Ã´ŒZx3W,#}=% epj7°Êý?•lÑA÷†}DÎZ掯±9:âm7k‚„°Y8œò®œòY`Ñ»85¶ ’îàTæª \ 8å“”L¸8uíÒašjSglï^ˆwF ½›Z&!l” ÙO&‘‹žPhõTÐ)H.¦V#ß_»‰—)@«'”ZÞc€Ö@ÉäÂGAXté0 墟EhÑ»è‘÷>62$ÂÕÇEæÅ’°Y¸d‡„KPd=Uaá’Šlj„GŠD¸d‡„KPd=ÕáaD†" ­ íÒaš —Œ(²=[ÏéÒò ¸g/Ð ‹è¿–í“_îcÉ~õ±ŒcÉ §töTc)(Ž5µ²Ë^•JNéì¯ §töT‹ÇPÙ)#-Î|qJçbŒ†q¬þ¹ç‚7ïÄdm‹Ÿ¼æ¹;,Ò¬˜Ð6«Î„ÍvI;d—tk$;¯)™]2b6DÚ'vI;d—tkÔS FgX£Ð Òn ¦©]2kTwƒ]óšŸÐÈ9Þâ‘W•,˜‘BÎOZb,tWø®îy$Û!Þ¬÷G Ó[2¯#°­pg»Ãbbž:·$lÖ­Ö"Ýj @9ÙáÐHÉtëB™Ænâ¥EºÕ€r=Uãal” ­ íÒašêV7—¥adÙ*o®ã”Õß¾~^Ù¡BO¶ÞŠ×ÍÅY4, ›¹ßÄý¾Pœ¥§zÌ–>+Î2µ ÜímÂýÞ î÷…â,=5‹Zù¬8Khi7Ó’ûE'ŸûÏr$ËÒ¦¬pó—,ËÇB¸_í¡—™ùÜÕ)t [™i=ŸžP¨ç#ES"«ç3µšÕÜM¼Lëùô„B=ŸžŠ#„+²©¤Ý@:LSE&#jm%sœE¶¶£Ö6ìÔl¿Úi¶:Ø^¨å¹JpNcD|VÎ¥8¾pH/:ó1¥]BجÏ }¦ 5•zªÅŠFe5•¦VA_)è3HŸ©BM¥ž*³a²šJ¡¤Ý@:LS}3spªæ=°“ÕþŽ*Xq»8"Êq`î1Vg å”T¦Cšœ³äÞOE'´ØXžÜ/ ›³VH1ëDq8™kLA§VAñjH³VH1ëD±§âÿ@ɳ³&Ö2QÌú ŠÃiœ·Ù#3áºù! •¹ž®*–„»³ÆÂF?*^«BÖXXTÊ{¤à¬ñØÊ.{‰Wœ¯E!k,l—ÑeYãg*Yãë-³ÆÂnr"8E»gó 5¶&s…KÁ8¹$l6 !øz+,*|Žà[á_æj@|Á7l[ÆÃ¸ ÁZAÚ ¤Ã45 ÞÞÃØœ* w/ÖNv%¬ìp\p `1˜ZAÚ ¤Ã´)æŠmï¾2fû­ô'.Î^6ÎÞwÎ>Ål½}™#—„ÍŠFz¤hT¡v[OÅ!.©²ÚmS« HT—(é‘¢‘…Úmr(烆‘Yí¶Ð Òn ¦©¢Q~Hj¢° öi‚––r²+²D¯!ùÜ¿©¨"ía¨"¤füáä²FÂf„?”PÂÊ,!uŽ?[‡¹Š”ð‡phe d"3þðÚ ¤Ã4!=ÉFóÞ»Áh°Ê> ¼ïµ(z®­fô’°Y ‚ŒIS‚Œ §i >µ9dllØ=v/dLšdlx4ŒÉ!cS+H»t˜¦â`#dìqB?æÙJý§˜Ae¶[6ˇC 2éJ 2™…¤ËAec«Àÿ.•Åa®òáJ ²¡2&•M­ íÒašÊ‡¿§ŒYåã2¥2X‡É°®‹œìçòXJ/ [9YuU¤ºªHeÑÕ娢±ÕÄ©s7ñ¡ŠTWB©ÇB æä©¤Ý@:LKNVb®…UµŠ&Í•tž97gy[÷d[NR÷dcZ·¶ÞÊ[â°ÎN ©DÌJ)í–„»ó]J&Õ¾úëBµ¯žŠw0*™UûšZÙe/ñ*©öÕ_ª}õT¼s à|×@‹3]TûZŒÑ2ߥǪ̂ôöB:§Ê9-ý$XbåYŸä‰Ö=®ñ@O;N¿UÎkþQ©ù\°»‡¹²„+íÍr6Ùq¢ûŒ¸=ÎJžæàº´xÛ?똽© R¤y‡þ>U!¬ @mÏanÚ9-2t|È ¤¯î©:œºU;´!'òÈ™lUuu–8p"F,Ì"¿Ä}Ù³,7 hÞ^öð+zyËSΞhN…ª;×’š™ã$ý9ú¸ÊÁÅ;Nðâ—2»Ï_›Ò^ '²þœŽ¾ÁÖGÆ}…ñØ*îˆ80€œ{ÖXukæTØnMŽÖ— OP~­ »ô”X{ún¥ðNˆûyqó~Ø–m`áè¯8á´|¾Õâ/w‘PÖ¥#ËЈ¯³Æ´¾päé¡Ík².àò7žú a ÷š!©éÞÈYd«Ïî-$ s£Ç‘¢Ö§º¡ Œ›+Bs‚Ûuý†Îd…ošûH+^C¶›“³Ü¡¯ÎÚÍùî2̓«u2h; 'dËX çÎcÕƒ:ëîd­9x†í)–•ôBU´rËD Ø«9;­Ø-#®¸²Æ9(ÉÑŽ{3d÷,ºÝVqPDuaÌu¥{O †‘dÕÄ =óaQwšÀºÇ‹qÒ UËÕM±¼vaÏOh’¼UÈ$ÑOðŒG{Üé.?HÁ·ûžâ êËßù€Í‹‰UöãÎÚ[…½ëjãVOÖQéG`#¦ÙNÝñÐ+NÝ!mIùY ÎòòÐÝ}V†úce˜Žðm6-©ÞÉÁ¼U\ö§<©÷`§î6 Úi^ˆ°îÊwΙS°JµÔ“BÿÏYãáᎷ:2zê%v_N{íÑ´U•VeÌúG$§ö‚€søÉI–Êð­ƒwÄÒÎÕº›¬¼aÕ³oê¢ÑY»u›Çæ·|û¡«Bc±¥ãð§Ð §ÐDÝzsω¥ø«î¾Y Áïààºå¿êÆ%v¸Xæá>ð*ú„С¤Ñç'å½w|—G†÷q*!V^ñ=9Ò,zx°.ªE½1¬È±€”#u‚JÓóùe4Бƒ%}†Š´ïìL÷çñp¹dÁ(8Ÿÿ£¸õflLf±h:n÷xÔUj¦±ÖÊ|Ex¤íò™ñj^¦õ®LÕ—¬ÔÁ¥·8' nσŸ¦•›¯ÓYç!q¶?Ÿ”)¬R–…•aT®xd¬W|'«ÐÍß RUKô0hÊ#!ÌZ`[XÅáÓ"œÚ›'}ðG^=ÕîʃË®̎óŽÍ•5ŠÏ±2 Œme;ö?´'ô®â•'„æl<)ýcãÚ‘u‰_÷»b­Ý9ìZ%[zRþþ´ÅqU$쎤"ËqþHHsdå¬Ý©Ï9Ë£s£ÇÁ ÀZÃòoðØ"Þãj3ð•+k%’¯¤Ýþ…šãíWBV4Kœ„a<º9ÙÇ=›ûcƒîFÖyÊmEh®9› 9 XlÆØêÀzoï»%dfQ›ë„‡> ó™ §•ìt2V)©\²óü Y²3øÃ=¿Ï²ìæJ©NCöOäœ>„T*ªÔÛ¤dFûì*#Ê)*üÑJ&D ‰u]œb¡œÝJsþô“¥ŠX.?§NÓýTõ=Ÿ}ZA è(U¦ŒDºLFe<)ÜÜU(Ü /«ôº·¯‡«éhÌçg«»mö”Jµý@…;A1 ;¬ñé`½Ë1¤Û×Ȭµ+:©ݚÅs¾œ .vÚºã¥J§QâoZ&ü¿ºþßá‘GÕ {[8Àª§FU)«ÆIH¬,«~ïÊöß;=³u¬·öãài>Œ‡sɵ¬Kf:ÓÀa Ža>Ë>žëxÄ ·å¬sg%§NÁ°üs./ìÔ†ÖØL·ß‡S·Ú‰üºÙ5]éž“âd˜–&j®×êlKg¼âº):îçôźk>Îa!œý€÷m_RNÒLºÉGÜWܷѽf;ydž‡–ÙÞ…7Æo~!ã©ßÎW>Ø^z ¯Ý¼*!‹NéŽ"gÝͪÁ·%y‡~zA‚J½Ñ_Žgûªˆ°Fá7ôóÐs£Ÿ‡žçIã^™Â/ŒÞÈ·³òF-ƒw É×ôÜNBì)¡DœLÕòÛ?ÎKOµ„cmži¾©¥Je2VÕž{f>ù§­ñÛ£÷ßYŒá|mVú¯ó\îOHÆ…Ýl˜>qçˆnÞùMîõ ÷‡r·‰¤÷”‘(ù‰‡Œ­D¯ÈÈлZÈY¯Äéäþ¹ÑQ2ú®€=Ä'=…“ä|¨Þ'u§íuzx®¸*õÁ&Ÿ'Ä!J³¦£“+n¬L¥½k/Y•ržÍË0Õ©UF{­ÛOÅ®RÖ³.¨eÏ™ÞOyj5ëdNesÏî8²— ªÃ:t­Æ,§uVÖûÖ×SÌ­Rh>»ÌàÊæqÚ5¡í´Æ[ÑÎ=ÎY®9à$°éÞHMÏ@ÑK:ñO&ä—AêþßË÷ž5W9÷×[ 6ø ®¸KT¨×ÞÏégx™K”¦¤Ô¦yÛ‚ NïG¾Ê1ê²¼3IƒÉï„sd^ŒK Re½Qã¨[IÜÒܾ†'¥ptÔ°gIƒäJÕÆ$Ù½½¡4 !èÞÈßV»Ý^Ù–ËpÃßûÇM¾;úsÒ, hƒC²€4{†:y°å£}¡89ï„~ïd÷òóýïÝvê5Èì¶´WéÎb:7Ó¯—__þÍÝ?ë endstream endobj 5663 0 obj 8032 endobj 5667 0 obj [321 /XYZ 38.2500000 101 0] endobj 5668 0 obj [321 /XYZ 38.2500000 729.500000 0] endobj 5669 0 obj [321 /XYZ 38.2500000 595.250000 0] endobj 5670 0 obj [321 /XYZ 38.2500000 413.750000 0] endobj 5671 0 obj [321 /XYZ 38.2500000 101 0] endobj 5672 0 obj [321 /XYZ 38.2500000 729.500000 0] endobj 5673 0 obj [321 /XYZ 38.2500000 595.250000 0] endobj 5674 0 obj [321 /XYZ 38.2500000 413.750000 0] endobj 5675 0 obj << /Type /Annot /Subtype /Link /Rect [513 631.250000 541.500000 638 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://github.com/swig/swig/wiki) >> >> endobj 5666 0 obj << /Type /Page /Parent 2 0 R /Contents 5676 0 R /Resources 5678 0 R /Annots 5679 0 R /MediaBox [0 0 595 842] >> endobj 5678 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1409 1409 0 R /F8 8 0 R >> /XObject << >> >> endobj 5679 0 obj [ 5675 0 R ] endobj 5676 0 obj << /Length 5677 0 R /Filter /FlateDecode >> stream xœí][¯Ü¶~ß_±Ï²/ºEŸc»@ 6Ї EÒ´’ nú÷»»’öœCéãŠßII»1;GE‡3ù|óîÏ_þ±ÿ×ïûwÏ_þ³ÿ¡ÿýùË®8ÔeÑý³?ýúîõtsèÿ¼¯›rÿï»oûo»Ï»ÏÇÿ~Ûu/|yþëñOÿÛëý_Žÿþ¼ÿþïÇþØÿ¥Ó_øuW«úøû/çßÛZÿT\~?ýüß»¿ýaÿÛiÄásýdÞþÿwF©ªU§i\ùô·Ý°Luþõû¿íÞuûJ¥iô^Yc÷ªµzÿßî~:~`¾8´V©º²uqˇj}ú’5Õ^éöHëjôó/™ÑU„ÁK¥â ~ž¹4Q”©”wpÉ­ô@{e#èeøƒ×¦7øyæâTö~h¬Q¦Ö¥=môi“ËæxβÏôÿܶ®ã=ÑŽÿÊ“íexùÁ­*M¼ ?Ï\œ*ÆãÑO³ÕEÙ¨-#ÿ2zŒ½Õm¼ÃÜÍ\š(ýÖâÁ%wÖVuGž²Ž@ŸËè1ˆ_êx§¶›¹4Q†…ƒGÒ¶Rº#™.ÚD» cG]ÄüÂà&¢µÕÍ\œ*Ã~Fÿ2 žJ÷à¸ùæyñéëîݧ#9«ýןŽ3;°ûíë¯;{üŸ“«¦­÷_Üÿ±(Lý§ýןwí¡®Ê÷žÿÞù‰nÏOšCÓoŸ>y>?±k:ߨËu~¢ŠCU«æøðåI÷UŠöüÖË“÷p´§î=<š3ÓÍúå\Fžè_žŸ˜Ci«æÍ2üŽ*à >žŸ”£õöL|>7†7.‰G4‡ëòÐÏ+†sÄôóìþÞÛžáͰÔX;è’Ø³À’>1ÊÝA¼ûxöÄ®{„̈˘)aÆÇ¬©ämþöx&Ë\8šG°ãÝ4ÿøõ¨ï"©ªÆ:ºJYbâ˜õ0QGR‹a#øá#5";Á¶ 'P\Šg€·‡-àH1Jl¾à‘ñXga=‡Å sþ±x?_c ¤–áò¹úκ7 Õðå;¨Ÿá;˜(O.ƒàuA!`ä1ò˜¥p´±bìTmÔe“Qí²öñ;4b‚­ÊuØÞx'á.lÄàYÏWÂ{ŒO6þžÌÕrù¢<ÌmpMàÆ¼quÎA{z*wr…ïàóÙWšžcD ªÂ8$Ô(˜ò{ŠÍ#e/_£í%œJø˜ÙR¡lö¢.»­¨Ú·üÐÎ ˜ÐÉOz2õNßy†Oˆh8ž­¬áwžà¬É˜÷ð;p ÏϺ…Oà |‡áàïÀ•ö'0hn®Ÿ…Eïícø.h<~‚ñz <%æ<§x·!­ñnc¾îåAIÜ4oU’òœ3øÙ}ô|'‘þÀ3°X>a]€GSRüÒìU;Å,º:3KifQŸ ª PXbêIÝ[PÚj÷ŽE©wZøN?7sè̾‘=]•Üxw'ÄT5XY/¢Ñ;½vj|‚ß)Ðw4|â¡&èöÎà †g홤5¦N0ƒÖƒ¿ƒùÓ øß»Ý ø÷Ʋ.=©’JHbŒ+Á¼Á!†nØe1ßéÙþDþý+Ï ²£Ü¼ØÇ$ë)‘u(ºáD*OiäŠH”Ì„cŸž£ws—pØwy.»5Ô#jËÒ”ŽºN äK2íüL*7%‘ÎÅDÁêÅj‚bx¢Ña™DÄ=£}ºØÀn¨©„›ŒŸ‰&½;eʧ?’±£Ä¬°¾Id1DÎaNtH®ˆÂÒ€øð#Å&‹†U…µŽŠõ4âp¡Èb|SŠÑí¢zzÚ$nÂû $®]©V¹\ }ÈÇ«p¤F#<1.ÑÄþmìwn£‹]7™dØšg¥2®&i †j‰ï‚¬ŠËêq…xŠTí[æ@·aW&qSa²ç=ëÁÔ p„‰^ d˜Ÿ)‡crîDRJq¢ýÈò[liÖTÞ•…Gb¾û…*¦ ¬S¥)êOÀ¾ê€áû½ë'·%šlÊü¸ª¼)?ge`ûÈüaòãòçîmÍ>/Äìó|Y7·ð%Î|ƒÜ‡ŸPÙ™0“Éð˜õ…³òî‡ûän‡3¸ïRõà>Žûðܘ•®“—Ö&ŒÂëarüdù òÎ#×s幞A3ðH |~ _+Qµß<»y?+Õð”P¹è×rÞ“hÊú¥Ôi•šÒ#kxʇi x6·¦=7 \[²1,Ù&`vÁs²îfO=ÅÒåIJF_‰‰ÔµÔ\*¬? è‘ܧuÅm˜d(¼5O6µ6Àï¦ù09~!pØ·ÌD˜8ŸÄÀWÈzÑ™• ç–nŒnLþab,Õ˜¹Ð…«£¶"ÉÆ–!±.as€Á|ÅAF<7Æ@؆þÖbêƒRÕ0ð7“,9Î>Ú!•».{-³dâúð;¹óúb"øU¥£6™ôšÈð^TµQªè÷ÇQN…ý‰0V†£[‹öubföÈh¯ò#j^­ÃG÷‡ôJ¹, û!•Ì—E´÷ì-&q€¸†¢×V=ë÷,ÑApÊ(9:· ~?¥5Y®!¥©]a(k¥3åü‰ê[…ŒD«#zXÁ)?4¶21ÝDZö4ÿlJ›A ðˆÖë„ÔpËf <³õ²ÜQH`>öõÕáãBkWûÊ:VÖaî$}&üTUÔäd€]R1;ÄiJ €/(Ìqƒ¨;Ÿ÷×Zzºªy’@…`´#§Dþn«ø;ŵå[)ÚÑNiw&Á™êÔiwjÏ[¯òËîK®f»Jmë2— Ê[•HÜSRJÔã,({wß^“ÆÏKmlyUV¤Ê^ˆ}µH…ÔÝ]‘•j¬˜êÚÃH8Lëû‰½>ÀAo û,ÎÍ£  p2^ÄËÂ:úLX½ÇQ¿Ͱd¹Âë²Òj)éaßÉ¿•EÙ&´Ý!EU †ÍŸg9íЗ”Rôd\µ½Wê•^ÄM1ØNkÂå¥L“C¦”wÍe¬Qá!míl=N[YÀ}mÉŠN4/9YQM1þaˆoeK6%“Aê6Õp†“h [:_](] "€²Ê¡®':**±“ðŽªÜåÝóDïò§ËÚ¡®°R—í“Êá‘¿ý3¾¨1†C7¨©Ç—.Y•Š/î£ËñÃÍ•,üÀáiR:#ŠÔª¯&y¥]Ëy¼Æß7S‡&þ½Ò๽ôX@ƒg<ØØ·ÇMœjðŒ›ô2Íša3àGçË齟6Îa<Ús;TûÏáîê`”ž·A¼cºï¨òÐ ×9{j,\)¤Aªï¨è:¡¿v·Ö“Áq‹\ÈÙ²F=¶.í:D¤‰§[´¬e&[- WðÄÌp:FÁ7Æ'Édðm­%øª¯I²@8¨$Ö!šÕ{îgB%†|ˆ©\ÊÊÑ.‹¾ÉnµŠPDro-§´FŒˆ_@ _äá©,}¼ÙD®7• ¿#ú€±Æ(«†\eëù¶3ã÷@0З²îÚåÛ‰1ñÖÆ—²‘89ç;SX9? ï89¦Y()c0P8 L·DQÕž²™`{i›¥ˆ–QHáö(¢y[Îè³ÆÑZI6| Ï箉RGŸqë0›"¼ßñ˜-^Î ¤¨l>¨ ·úÁ1|ÜD‹ØaO®Áÿ©¸<Õw0¼œI×fÐEÞ0SÜláa®À@…Ù)ŸJŽ10ÀûX^ü)„Yò“7èÂÚŸ-Üê î}É´Ç}âiÛ†¡B Š®3[ ïÁý²óõã‰ø¦I,”! _S?®"!Ú—yN\ngˆµ«‡:פK}X›åðe"}hñ[cîýÖô¡…ëñØ84–˜¢ŸÍ‡n{\ØIUþ2:ýÑOˆkºC”ÕS×¢vnãÕÈqûR6®žAÁÀ‰øR>e<Ѹ²ÍìpG¨\3Oå.£—‰Æ@×1`&¢—îTÏÌ¡G#‹Ï£ À Ôû˜GyÐ{±¸áÊËÒJÂ\%Œù€¨ö4È"ù0\Ê@FxÎ}|mWÖΆ¿Âös"‚žKƒïà^cÐ~ç÷^füF”KÔg~Àï ì „»šbÏâüÛ/gSÒ »_j×"L;kÍ¥Gr~ØÙ^¤=`gå`g[ô†5Åßñ¼# .Ûçõ2@¤õÁŒ„¦ž5±%vÎ3Z(êÙÓKc$ØêDï~Ô›€Vi'ëŠÄ2®¤÷*sƒm/àña‰àáeàªp'ÊÿÎøN?ܧåà›æ M–4 Û‚Î:›ÜÃkz-sc¥h†Ã ñ¹¨QÖÖÕo²©&qÁ«)ÀD²‘øŽl—¼Ô!½e¯B²S¾£¸–Q¶(Æ:ë!{ŽÉ¦ÜX +‹Æ@=•„ŽLž¹d×zt[ËÞØ[6›Hvn P…™ÛeL꤂nï]¢0ü œ"=i°ëBÑÜ8áÔ1â<å‡oOlß$pðÙú*ë‰TÜ çp÷FL%[:Ûª¸Zà­ÅcFâ¥ØÉÌ%“ñô®ScïÜèÖ‚/y 6QDº,ºà;g‘óiŠoØ%¬t—Aâ2^\ÌŸá’éìØž¹É–ðïÎekÀBXŸT`,e9€±èHœ†´¯#nXzî?L}£×³ëÊw3rëb} IleHP9 Xˆ™‰¨¾¥Z¡=ÂÀsvP¶/sY‘-ºNëÈŽkˆÙªr•Äò톘qbcz0Qª#ZªØ á± ¹Ì‰”a3‡O4Ø,—Ù{Í:k/¸}øŽ&áxZ¢—‡¾P÷âûqêÄͯ“éWãéÊ=x ÛdàÍÒD÷þÕ¸«&Ìg¦btl‘.Xb; gDQXeÝme.“Œ"&ª³˜fÏ£šÓ#_Ð}£1¤üõo2¡I&M|m‚Óf:Iù´î&‰ÉkÀÞH¦ne[_5lÓTކejBêÜGkÌàA3¦"c&ò!. L7“›ª=[¶_*ß6hYÊeÍ ´ÅÍß’íq?<2:nÎè¨ì¥óÑÒÐÓpÆÑ=-Ù˜F@kÎ?H³Ã¹¾Ã ¨¹èhÌãõ˜§tô­ } ÇávHDÞ‘‡¾øœ¬ðö4(=ݸ]…Æyans¹hóDO“QºÉ5ŽšÁÿZ­šÿ)Ù'ÛÄŒhÚg€£²+MѶl÷ÙÚ@,6µSá7ESÜŽsæ8¸wî´Â’ë F~{æ–hžóˆŸ`Ƀå ~Ëo,IeÛ']Ëv “DF6nÆtCÞuš“ÞuF²võ’O­Éž?Ÿ*ö5|jRá¾6åpåÀÅ“²ªqž “+Šu#‹þEá­ p<W-rÓ&«`Ä {S(­×Pžg…ˆp`‘‰ºäïú•=¶òp Ç4mÚâ’\þ(ó{”ù±ëÁFÜÃX\wà‚¡A|³¸­.º9†YYôjg wwHböO¨—º¢PLv–p.^jeÜœÉdÝi ÈjĬ3_BëJ¡»¨S°'ku Q«ŒKTÙôÜT bL*4¾1m¼PrQÀÂlEõ©òø™o±2ߥAKªÑX€ÓëÞzªÇ T­£b—Ü­ª?YS?«¡ ê…Ö§‚9¢ $T_BKŠ@ÿ1褚8>Š{¼.ÑÙS:ÄÝ;$W~Á2l¹ÕhBÇ(YÛ×¶¹|’Gœf¥i&3Ѱ °4‰N9ÙTÑH60–Âà &J™1TšÆ=’肜´±.uèÚT«Â˜J¶5înÞ±FÔ½âû"xƒ¿Lšüh[E¥¥™nÝñ±5@»Ø}—"¢º&+Gy¢Xó³zGÞR‘°ø•÷pÜENL+_™xq]:cà}€…c;󠌎ïËÆ¦L°5uc]†Otwæi¦k[Äôb*gvÙbT!>(ÆŒQ,×¥J—cn,9†×¶r©KØáÂVÙ¸x©"„[ÈLbBà;#IÄܘòÂÈT•t²-GetEZ¥«ç³¡93•x²v“À·Ìí.òIM•‡ºÀ«è:¥H®²ËÈ&d<ª‰Ñ°ø’w#ÀÕ <î ®}¦vjÍÀÃæ–Mñ~GJÜHhl¾^¥ZRá¬ì‰u‹†>È›ÏC!w FçÂÝ‘õTiAÄ4(‰˜1 ²ÔÖQtÙPK(3F4Éh V7–=¬ê(ÔÌtåbnD©Å˜£À \A„”2ˆ~X–Ä"H¦D”i”`ŽJî .扙ÊÒ¶Ž Œ\Ñ‘%«,šö-ÍÃP² ®Fabð™6‡&„¡N7F WïÁQÃïàõàY‹îF ³8 ¡²=@Èx4L ÖM€ûzÀüñwRE²á ,Á¦Âg`0Ö>?¯!-KN¨¢¹:Ÿu>Y2& ð¬±¬ÁÍS°Ü`ÀЉVÌJ=9+D‹ á]€™ú¡Ûð p;š(?n£ªK?)eQ¤g`öA…ñH½3ù„Ë_±ÊYÊøù…Q8ʰ)•„.›—,z¥Ê—ÐË Ïω Ë/°ìþ0½†ÖYSŸ+s$Š“À!ÙDÒb¢NÉ®5«¬ ”])B ÜŒ_5Oocœ£²µ`—Áaà‡Á’Í'rÄ÷%šÚá= t“A'¹9Äj›š½j'ZWB¯µ>Ù_ŠC"ñËÔ“º“Ú«õ z§Oqšz§Eï˜r°Ø:—Ë«´h´þò25ëâbW8Eï>Ásë­Éê`”ž4c§Fû¿Ó++U ,çJ»‰ïôÉ(S3øß©à R…tuu½ŸôÁàR¥ro¬. À%Ûß9Nz¬“Øy9ÚG_Ä“„ÙË»˜xÌ¥+ÖBÎQÏI¤1µ D(1‚jÔÀmíl«pFX÷ÅÅÎöxdD—¾@§aþ/ÙH{ªjðd^ÊåCæ) 2j¨u¢Ê‚¢e í¿è]ÿçka†ôn&uòQÑêt§Ø_îÆ=LÚ”;°Ûôzbk;Õ¤º»˜¾zòÔß GȮþʽýiuEmN|Ç\Ë]ššÛ§~¥èZ…½Ö•¢ø‚RØË 5Ágqb ßéO© Zzý¶,Ãþ|œñ°Ñvx;1 (,Ç è ±gŸèjçlÚGÄÉãA0Ýáðúùvº×…9ôgvÞô>ü¤—^×$×þóîÿa \r endstream endobj 5677 0 obj 6140 endobj 5681 0 obj [322 /XYZ 38.2500000 206 0] endobj 5682 0 obj [322 /XYZ 38.2500000 206 0] endobj 5680 0 obj << /Type /Page /Parent 2 0 R /Contents 5683 0 R /Resources 5685 0 R /Annots 5686 0 R /MediaBox [0 0 595 842] >> endobj 5685 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F1499 1499 0 R /F8 8 0 R >> /XObject << >> >> endobj 5686 0 obj [ ] endobj 5683 0 obj << /Length 5684 0 R /Filter /FlateDecode >> stream xœí][Ïä¶ }ÿ~Å<Ȭ%ù öZ Y EФi4A·yèßï\ì™oí9ë %Ëe‘ìæóZ–(ФÈCòÍ¿ÿûíÞ¼ÿþ?»úßßÿR웪8ÿ³;þúîõl»ïÿ¼kÚj÷Ã//_w__>¿|>ü÷ëËù…ïßÿùð§ÿíìîO‡Þýõo‡þØÿ¥ã_øå¥1Íá÷Ÿ~ïsøSqùýøó½üåw»_#Ÿë'óíÿ猭k{œÆO}–iN¿~ûá×—7gø}¥¶•³åΔî🮴»ÿþãå§Ã†á‹}[:ã[•‡?wuÙUÛÚß×ÿÃ~¼±Ç¯ÛÖíŒíŠ9ÐnüñÓ/¥á îº.Üà§™«SŸÚÈ£‡Þð²2g¢uUª]F±%‡Ñà ~š¹6Q†í†ƒ‡ÞíÚ]Žw€h×á Þ”u¸ÁO3W§Ê°ßxôÐÞV¶'Z5U&“í:¼þàuQä¦ÓÌÕ©2l8}ß•1ÜèG,…3Ì M›:ùM@]}$Q¸ÁO3×&J¿µxðÀG¹vfÐ¥M¢]‡0xÙü4suª ûG×<ÊUã™a×ÑC¿®›pƒŸfÈ Ãƒkîlãú[IàBu=ñ›.œ}ž¹6Q†…ƒkîlw¹o†0¦_ ¯?xcL@Ãí4óPÆ´0ºâæ6¦-{Ù"ý/ÃÜ4œÏ3W§J¿¹ÓÑ?ûŒ‚§rþ pà}^|÷ååÍ'Sž«w_~:LîôÍóo_D©vß}O®Ý}ùq÷û¢°ïþ°ûòóK·?üt˜âùIÑ¢'¦†OJÿw,|§øŸ|€O|òÉn®;=ùøå°±Á÷ä ÿï®á=|ÒÁÕÁ},ì³ìcç†WŠO\…»€iíàJKß³vpnxOË·èI…9r-êi:\yû¯Â5ôôU˜šLYœ&s¸iKSìëƒòhªÉÑ.÷¥;G˜ÆG¡½þàÌçí¾íŠÓ¢®»r^‘q{g[c«9OðhEŸàÉZøÎ™3«a³žà¹áwðÜð;xÖâã¿Zž¸}UÖÇ­ˆ’9ƒô§Ô‹æ®@ï83þ0Ķlp]AÛñ‡K8ûpøŽ@jÌçxã Q ¤ìt ãOÁ¼‹7ÁcHÐ^qÝš=A6—°èjá–Â'x4{ž›1ÃKs Åß)?ÆSiåᲑö´Œöêpwí¿ ÍLlDU¦ÑŽ©X@NLY¼ÃxnOÃ}Þ9ü87aO‰ ­‚|`àžÚž@xð ð5hù¹ gϸv ÜË\ïñ|æ0¿UÄYÀûƒ) ¿ƒÏ0ì0Ág› £‘…¹aÄ’äø;ÌÜà Þ¹ÅùÏ Ä’J‹Gƒn<vjdî%¹¯ïž¤ŽÀ£™ãŸ‰ãW)1$½ ùl¯uç6v~–—°Iïv>§™CÖkAÆ’U˜¢DøYðÌáýYþ&ŽíDÆ·Áx4±·ËÆCËøùo+–=­ãøÓ­fŠýM˜"˜/ O¡à™& !ÂÙ$¼ÌK|È}¿IùÓ 0gSøá¯eä† ×1E±„d¤7ä,—–ƒwàBU3 ݰ‰M]æ3>²^0¤@Ê0ŒÀÁ@C5ãf¯Xa@HqAaKèY$t‹€ÁU…% ¸Œ¼YžncÄÃcB2>†1‰1Ú®´P0yà ùÀ`÷TÕ½½ ¨+;Q#†aÙç®e S ï¦*» ï`Õ„g=QPä•uÏFÅ„FðË ‰Ç{+ȳť#c\à]ÇGásŸ¤. -ÆG¡÷1øíúDÈ@±LÁ°#r ˜C÷È…u_u]3Ö[ø&‹='Ø;ý=ØŸpϯP›¢.G¡”“z bk©är|MæÞaP› ™É/šh{"¿S¹RÚ^5ïGðD2öúpŸ×JñÝDÐ} E'Z[ø$á[,óp²xIPŒ$Â[Ðåª÷[ÁYÂìíÖ]”y1ÿÃ1S‚êzÈrÍ)A©¤Õm5|5á” !„ÉZˆ`^<ÃO0u€PÊ\Ž)*ÜàžZ̽p=ÔÎ1ðÕä'!e‹HzI™C„•bPÑ»x²³)Êû»•ƒÔC:ΞØár™!9’ÞÀ ÉÉœ¥Ý’œ¦ ¦eHN0H©Ä®‚\ËÇq±Ïí$„ŽÎ3¹å}fvû5RÑbÚDùŸeœ™£Ý3fR©4f¬UðÁÄL‚Ÿ`žð€#bRŽà%AZa±¯ãS.‰GTœZþ„öw·dyc¬öEç¾]Ï[8ÚÙÄ6vxôÁcÞÎßdÆt˜’Hœ’²TìƒÙ~áÈÅle’™•¢YvëA„Ô–]ëfkKŸX¯®Ù2Ÿm9R̉FáÑV™ ²ÀN´ÉÜÊ(ÿ“¤6Dp€uÍ}^„2P/Œ3¾ã!þc‚»vSH¦kF›×ÃDn‰f¦–.^õ|”$ÞMÇHæ"Mɳ*ܨ=rç_h¡®JÆi©rá`*^ ¢ñ„c ‘ñ€µ°5,P‡q¨뱟櫌Dó`2kGâ?–S×ôÏAQ¡ªú\©T%&úçámÁäbâMÛLURJaÐ)= šj®“¬Ç˜QªÇ‡Ò@*!½HŽèå‹9h¦u†Ís3 ÷cóD·ÌA,ù•c9iÇ ±œð^£Ö åÜ„ÄÄUÞËsS6-BæÆVÏÞØª½dLå,¶T²ØºK&FÊYlL9`aÖªYl9«H:µx˜,6!ûƒÀö ü–JéŽ'vT“ª|æ¨3w—ÖqtÎ%Ó Ÿ *ŸÝ,hÝÌŸ„3s™³ép!½ceL%Ýò ·@ášLa@ŠZ¬%à™+1ï0t#$æQA·aŠâÑpSM|à9- ÆXõ _ÇjïšpÖ%æëòž½ÇލMd-±ê¼Ú8{Ò^æ“«ä*ä ÌUÈ»D–v T¨w r¯|ÏI އ2%=5jGRñ¦òmàÜð°Q7ÝÊ®‹GCõ2™Ü‘жTöò„EñÑÃY*¸Èñ‰„DÕHáEkQâ!¾t•WÂiQLëB®²ÀAhœ^¬ÜŠÜ *t/¨”¶‡K3•"úK­WN¼4Ö§’=ƒ;_0ɧ;7Úx}·ŒÝ1‹A>âÔ”ËüJèÂN——µ‹WòÙZÂSä~{ PX,a‡2ΉV#”™vÏÅÁ“X•÷yžpÛ „bN*¾Ië^&tó‹Ôæ¦lGû›-ål)?‘¥ßÉ+˜ΑÀÇ™R¸ët ¬c‰´9Ý΂[“•šÀڲ6åX[êÆ>6âŠdªdDJ­‹¶&ƒï©º±¦ë'óÀT:V) Á¤-zt@eRÒÇsœè¼ŒSG8|*±¤‰»lU½8¯»ƒS”usÞ%æ‚7ŸU)ák{„Œ2Ûr¬B&‡1æ–/¥Š;Q>m›/׿8ªI`¦zÚD4Äj|¢UIèçQËÆ²É ½TTAô„/±S»1Ù!ãÃM;R’+‡Ùƶ´=ŠÀ.^5RèÄÜ„ÝgP›« Á® «áŸ¦,K'¦E¬2¯¼‰ÞQfŠö>ïçëêõ |mþWÛºüÅ+0ÏSÇY¥‘ÀÞQO6UïVµW…ðÐu>Ǫm˜àéd\eL‘Ó°áA92x(Á´ù{t„À®mÇ6O¬Rï ¶„qŽaÅ0Æ9軑š(×fÍ÷Xe¨ö}1` j¥‡ª.›ÍwÔ1½¨b'bP½¯˜JºW·.7s¢UÍ´µu 2E7V¶ËgŒPÊ +NUÕ€ëQ喞ῼ5Á gÆÐM×á-·nJÛÜ_À“8…t=¬ÛöÝò1Q-”ѳU7:^ލ¨U0u:™ êÁ¥³õˆTtJ5 @%ZXKê–üLWÕ´¡hàý¬ætÜ ö#¼u0ëajŸ©(Zb²T§ëå=ˆ©œÊ€z¦qv¤g²Ÿ‘Üùù¹')ƒsuEú2ÄW1t¢];˜k:NX%#ž`ÒR³9͙ޓzhSâàKˆ’%QûÅlÌädám^Ê…bí[ÝKîå;ÇÔVíåKY*hà5u³ŽѵGRis2UÓŒõÛOJçC§O`¼C¼þ¿µ=>}M¿ÎЧ»Ÿà'L× ¡ßîA†;rÜóª+õÙ\ßK¢Wà:i`0'2Íðzˆ~|Ì.à“%t‚ÃÝ\ð™#z œg€{ £Á]°xÞz‡!®‚´vp„Y㈦%¤r¤^›”.Á{Êô¸&Nce#jþKÑjAF/þDØ­§Ñ9ô›ï5³ÝÈô €¬.X%¬vL‘ÄFXÐéxç6•ʳªâûTøa©ö\g9Ô‘X:u"¤þ1õXÜbW1¢Ô lfBÊ©d@ø©t¦¬%>Sx‡³nv#‹"õó\¾Nh4>*ƒn[ƒ°˜êÅ‘)çbzÑ]9Á¶Ø°Wí¨¼Î›¬ë"îÉ%Üå°ß Rcò+|‡þ0ª77æ$b®X|)¹Ah~|…õ'Š+ÅÑt¢X¦1rZÁÌ-PˆçGŠ™3(A>qv<ƒ’ÀÃX<Öz˜цÏ´4KÌ; Ý0¦Ž‘£Ç—x4&ïžS•¤{_føKX̽ý¤zG¬FCƒù?¹wûŽb¯”6¶–Àçy;gOÜ¥=ö+áucÝw Ûª”=ˆùE×RÄš[Iø žÕ$Aæ ßÁ÷æ. ç&XV„}+ÈÝ[v–v‚>‹ª›ªKÅ]hŸ2O–Gqæ'3ž„ÇjVæ‹ÒZie˜ ¤MèCÔPNÙW…È­»êòÅ«¦x¦¸†›B\ÓKN¦N¶FÉDåäÍgOQ9J°©*StÞFC«![AvLÃmÀ¢™y¸üv,De†É+ñƒ ¡§@¨VÙdTˆn5<üU•(V}ññVNí-ÁŒ<9¢k'ÚOµ(¬à´XÛ5¦¶˜Ê‡ÇVÅ­“A&qØ,¦€¾‚áQŠ-ÆH§ª¬b6×U| {ÝŠ\>ùÕä|Î Ÿ§öf18Óœû–ð^1ödp !M3¦TøŽ:ÖŒ¾©+E¢Ü]Me×Äb (¬²6ö·í˜ý—o·µ4Ôå¯@”;R7¹18pZíÄîdâ%º=x¶SŠÑm‡­Z‹ Üÿu}-‘¾ãÁRiÏÎ\×£Æd²õç_[VÞ¦‹è^ÀØT-t|$æßþ—.]xKC:ÿêñH§£VÂ厬KµÏI‹—j_¾p¹§02¼•¸ëakRDaP$DQ"ÝÇæš¢TÕŒ¦(< /$x¡-Àã˜1¨*áÈ0Õk˜û“®4¯T-v,Í'2n æ’Åþ=ê"÷ ˜lyð¼•ÖTÉ=r‚«(ó;s¹AîA ¯4÷ ˆÚƒàðñû2zuYX¦ì`d߹ѱÈ. f u@‘]bƒK7àc‡>(x4ÂLÂÊ '‘  1Ã`#‹yl"ål,¦óXÙ¥O„Y3EŸp¡"º$f-( lò‰·Ì v£ƒ"–q¨/Ep“æ~ª÷i.ifõǺªôÕ‚M±¯óg^ð¨1¡ì¥$ò.°G(?pgèu»Ø|òSAµ…•ͶìF§ ß©q /ìqÀ£ *[¸îöŠáw°hÄë•ð J|—*B M×¹ÑþRµ°œ›H&õÁD¸p0™÷N{H½ÖÛ„¨ºIŒx4œ`©Üþ\àJáL'ŠgŸa¢0xàå1ÑxÖÌÙõ1»®Ñ¬eyÇr(£œžPN8UW€o›CØwW{eW¨ØÖ >†oÚÖ¶îzˆI¶­g®ge¶µ1ÆŽ7˜¹R3Õ°ˆD¬£%/:•r¤vÄRñÁ=wmêfR6Û‹¤·o+¼3µ1ݬˠu¡ÞÓ;†nî>L¹FnÌ_àò×z!›ƒ  µç»(uˆå ƒ"V¹ˆÇ«VZAÒ° ð&3 òùÂeùÄd‹„Lº6ÝX.n§†³a1‰G»—l²`ÙŠÐq=ÂK˜`!2]…*|ç,VnÄå© t¸ôã×LQe|4ÁwÔýŸ˜…¯k²¦|™Ùr¢Æ˜+JeK¦ hÄ„¢¦¹4¥$Š˜Ö«Žh$“ÅÑÅJ¨Êœb’SL^ S¿•FJ1 Ò²3¼Ã²µÍp˜™Â3LŸ ²Ä šª¡³™Ã6a¡|¶*kTýˆ J"¹rº!¬\Áˆs}ŽÔUZ·DÔmÈ4\fš±Ðêx9ñÖ|©B}‘ÞiÑZ#RUè¾âþu/dÒ?ƒ×«­l©ÀM½m|Ë9„¥1VÁºH®I• †uÄUš‚Þé~‡q˜ê@Ò­[éQu“áH5«$—Gá]˜÷òøhŒ­‚®u¦M!•¾6Ÿy7ØÎ¦¶cÕ4ßÖ§êÅÞ|Ø@@–ÑñKÁÓ¸¢e`Gº‰* $j¹S})=`& ™ Tº©Þ»ûc˜$e° ÓfX5ä®ÁÁÁX6÷Ïšjäk}ùÄôZ¸ •QwªÆ/Õëdþ Q¯k»;†toänŸSpÚöBí³wàp·>{Ä'ó¾õ¤é`Çnô~^ïØ¾ÓÁï´œ¯Þyw‰£–ªýÙ4õ°E×XôNÏ#·fPÃ'­§çìzɋ7FÃë鯭•Bº +=Ÿ“fï&ü‹gPÁ':æ7¸?¦#8ï¤[mö¢h/_nÍmyNÄï@X†«z‰]qµ93€g¡·™ð ŠÇ²nÆòJÛ óœ4oŽ•ŠÑ]K¾}€–àâ-R¾ M«îeÊÞzwÁ Á׿4ãÉö˜ƒ£PÕ*nH¦ïÑÆ¼Þ*Ðb*‡U÷ [†„‰ÝmÑŒR¹4n¤]}@8—tSË-ÆTNÀ¡FŠ1)×x‰ÁW.Ê£ZœbtƼQÍ Sñƒ ¾DF°1™ðºuût;‰BË.E˜^úNY¥Ñ„Ê“ž³ :9»²ß×T§XZ-pgœ·þ[õ ÂQ·@I¬;ŸJ-UCN7w_åRAI}Õ;…"‚£õ®¤Y("U—2þxñìè¤I¶¡Ðà/¼–SQ¾)|ç½ëVÕJ–:2h$¼eakpzˆìhÝ%»fÈe‹v?Ѳ‘:ÑúXyª&•:”јÁn¦édv£Ïa®­µSö¸³Ì¯PËܬÇ7ƒÓ­ÕÈÔìÁhÕùW/ʼôHèK¹ ₆OU–#µM:®É®•D H_êÇPí£ãUÛh ÷Hµ !‡ç©3ýȈŽP8ƒ¯Â•&t{R…ÈâîWj¸¤'£2œ È˱¸g=ãê,¸ÚŒ‹t6Ÿ‡—…瘢ŠmNïòSdþÏüÿ ÿ§Üîü¨Å£Dý*‹«Y`k S4R­#¦z”®•„gP2¼ƒGÃõň½Ÿzx‚q/`¦u9ž®¸‚yTU¸^–½X"ánÄ1mÈöâ"¿§Cö.ïÊÑ| ,­pc|Nˆ¾áBçe¢öŠ I1÷0àp}<,—ñ©ÃZk:¦36c¹nŒËe\csc£èîSErc{*h­{U$ƒÇGs ¡Ã.qÊíVY hyp£Já‹á©L@Û¶5ôë6ZÕnM>èV K¹é)Hg¼×+eEÕU ŒBØrZµS‰FB„N' ÌÑ\­h.ƒËÂ0e"Y:´•áúįdI¦%Td<`ÈtkÇW­m`i¨Ê̆¯ªàoz7,ªªE¬¼Ì]Ï–¯¶Lí‚ ô™¹fä+Ðìpq®_ƒˆPTaW)•™HÉJ©Ë8CçjØ7QiMó-eüp3Q™•âJ׋¨´!ËŸ ,\u±Y%³'¿A ½2nLâØÔq“¶ª2—g.Ÿ5·ŒŽÌèÈ;ßÉèÈŒŽ©yøµûzP‰¢Æü|ï/̸¶7; ·/Ì1Ž´³ïî™{n¹Ïónn\Ïô±{{.+üêÉyêé÷¡§ךî+0ßòª|@ßq÷¢{·æö©_) ¥á<Òò:¥Nv( =Y`{ÇþD|{¿± ƒGƒïô¬n¼–þª4ËpÇ?f ôÂí{ö©-åœMûˆ8y:¦;Þ¾œîMáöý™·½ôº5âµôº'¹vŸ_þFTó endstream endobj 5684 0 obj 6430 endobj 5688 0 obj [323 /XYZ 32.2500000 260.750000 0] endobj 5689 0 obj [323 /XYZ 38.2500000 220.250000 0] endobj 5690 0 obj [323 /XYZ 38.2500000 338.750000 0] endobj 5691 0 obj [323 /XYZ 31.5000000 261.500000 0] endobj 5692 0 obj [323 /XYZ 38.2500000 220.250000 0] endobj 5693 0 obj [323 /XYZ 38.2500000 338.750000 0] endobj 5694 0 obj << /Type /Annot /Subtype /Link /Rect [93.7500000 346.250000 148.500000 353 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.swig.org/mail.html) >> >> endobj 5687 0 obj << /Type /Page /Parent 2 0 R /Contents 5695 0 R /Resources 5697 0 R /Annots 5698 0 R /MediaBox [0 0 595 842] >> endobj 5697 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F1499 1499 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 5698 0 obj [ 5694 0 R ] endobj 5695 0 obj << /Length 5696 0 R /Filter /FlateDecode >> stream xœí]Mä8r½×¯Èó“#’ú €…îé.>Ì>>½^; ·÷à¿ïÌJ)+Eé1Å—Áei»U•J‰ŒÏ?ýó¯ÿyøï~úù×ÿ9|~þüëKuìšêòßáüïÇÛ´=¿:Û¾ýñòýðýå——_Nÿÿýårï?ÿëé·ÿ;èÿœþ÷×ÿÿÇéÃ?_:á—Nu§Ÿ{ûÙwêô[uýyþü÷—ûáð÷óÇá†ÉLÿþÑ(ÓsžÆ¡¿¿Œ¯©ÞþýãÛß_~º,@Ø(­îtÛTmêƒêk}øßÿzùËi€ññÕ±¯•êÚº«¨Óç‘”= ¢ûÓ“t5èíŸÐã#<ÜT&ÞÃßf.¾*§_”ÿé’›[Wýeš. ]Ÿcù붉øðóÌ¥eÜZøpÉmN\-ÞÎ^Ÿcñ›.â©}›y¬…—ÜÙV„ßµÖçúô‹ßUU¼‡¿Í\zQÆ…—ÜY[kßÌeúã ôþøïû6ÞÃßf.¾*ãÞâ§ n®Õ]!¿?=Âò[£ãííeæ‘2~øÑ¶Ãðwrh{·=Ÿ†ZÙÃMÙúôåN7õ™¾Î´ÕX«O¿wføï¡õìÕ•NŸŠo×Íã#<ÜT:ÞÃÕå ¯Ê@ió§ÿò<•Ë'À¦üî¹ñóo/?½ª7]³=üö—ÓäÞÆ¼üøí´(Íádz!iOýùð§ªÒ¯ÿtøí¯/ýñ$ëÆ)^®¨]1ŸÂ¯à§éŸÑ•ÊÂ+ ^ù ¯ÀqT ¯tá¦á=žYW ¼‚÷έ‚oZ}þ(k 0%âuÃ÷à÷Á³ÝÏÉú0{êYQÌ]î­Î×ßNŒþQÝ#Ýœ Ž)“ö_7³. ¯4w¡À‹£·®«·—6¦_àòÒJkóæ~µËÎÕã…Ùi\ºr¡*ëi{´}õöºïïZ¡+97G£­š^±îã5zHmˆÙ×èŠîádá <ãtpQàÓÔE+3®ÊšÌ– O îE©/×'÷Õá”0¹áÝÀSR—å2Ǧnm7¹§AW q~ )à7¥®ÌH¨ð( º«Rã®àxQ<Ë…™Þ~¼Ép <[)ºýè„ {;ÁL£&ø%fNø„á Ã3 ž6//¬:xHTTS/ˆ©‹à„JÁª! Ô—TvNw=±ÅSUǶSSNÇ:Y Ã7ñ¬g‡mö¡£RúR.åŽkÌk$kĬ=|&X{”XYj-kf¶~¢,ÝCˆŸ×àwÙüÚ@¡@¬Ò]õ7¢¼kL缺FóÔ˜3|+õ%ü5ź!q`dµeaßÕå`.8^ 4ÊLƒ®kÿ˜_bw1& Ïd?l>-²ñà–µP<Œš!lsRx6<.í™hÂRqÆè,Ø f<2ËŠ.’úN»"éu½z‰rv¨=ª6\ÏLf4Ï07™½(žc¢åÀ§ÐþÑÀ›<›-*ƒ=ã(¤gâð+ÇÈ"¾ + »?01a† °‹zW(. ©Ë£S’è®Ó6»Ëö©µeB(à+ _^Wˆ¸ßªî ÷Ä sϳ•1ÚNj Ý£{"aÌQzÏg*ûÙ£(  @6ú# `Å«ðP_¥xÒ}Üs]ëéƒD77ð|…Ám*ˆL¬+x„ûÉ¢µ5„">¦´dœ0Þ¼¢ø E£Þ*/Õ®=(]¼¢p¼ÛHkðžâqàÎyÊø}ð¬á j†vðùÁ÷àqàÜ<|ŸFxJÁw0õÖû)®†\YCºöŒƒy<\7Ï8pE=ûÓǶ{±î»q26‹0ÇîW‰íWñ¨²ëC4b‹q¸¦ÇrÂÖááviàÌo¥ e¯²_ݰ¿ÍCxo×ãœW:¶/=‡Ig¶÷"3kV˜rœcg áBJlpe•ÇmËxDý¡x C ÃL` o8¾ÂÇ[“øšæzZ?B"뀲ްՋ}Ø: ì:fXcõärâàYC[û† aŸx,LxlCãTP8·¾)> Eï|šÇ—‚×Ï [ñØ„× ®ŽV|ƒw> ï6¦ë&U²p[]sÂ6ü‘ÈE– ñä3ÚöØÒ[’‰-%ÑüÚÆ>¢ùí¤=‚ô§=‚t‡F÷ÒAòÎ-©I)sºÑÁÔ`{ `Ÿ‚{_²]˜ß{R²`·õ ·õ!U <$¾uÞ™lÅXçT².Q% rR0eHáE‘­ 9iб£g¹zØ‚W û!¶”)œ”(«S61F)97C$‘ýn¹ ¦bXHM4ÏIûg/xWæ.™´ž²˜Q^eiV ‚üÌ3k¦Šˆh‘:ÊÛˆõu$eü 'õC ØU'63@¼ò,þ|‚†„S´ñàäÀõ¹ЃH!T‘4\ÙÊ0Lž1> Pqd€á†KÌ„À“^ä PÄ"jAÌŽƒly’¡•– ¤Žj€æž¨þµƒ‘ÑÓXya&Kœ´d•Ë%’²žmln8ºÆuÿTˆxZ-9ÀÄÆ¥<‰z·LýÞ ©UmœML…°­cž¿bï¸îè4Ê®¦†8I 8“ká‘/ßãðÀË%Q^Γá•Í…÷lÝiv_ˆ(6ÛZ;b3qE¹œ^F<'Ñ“„äŒÌÀ[Jà©Ô$Ìáf’ˆ1úgv¹2¢)Qn™'m<H@ôü,˜DNÚúšœÔ‚òSL«SénµÙéy9ìƒ^ïUí$t׳аð™bÄÊ‘xÈ™GÙ¢þ2ï%V)ìž{®»öðÕ¾˜&|–(•ʶÕúJºG—Eç6öÓsòô* ûÖmªdh¢âÊ»y[°CO¿(¼“LÃG‚fSáú’õ˜³ïéñ[ê^"Ü­žéºv¨aϲm³°èû†0õÐ|Ù®ÊÂf.£ÈïÚ{–X(H‡é‚¾ãW }Ì4ïéÁ1Åš5Ž\‹-‰°-ŒuLâ˜#0atÆá…ç¶Þ•#Ü•G´P`È© ™1bZ–o&âZ²Ía=oÊ«ÁPypËðÊ:ÍúPÊ<}‰âŠóC"ûÆ¥FEÛÉxs M\óÔP§ ¸– ®ì3ÆUôzn×$›‰FN1=±”»ðP3Èa£BX°·8€ùRu¿HCw"yžs 9ò¢®mV+Ñ÷h6ÃM7hJvÖ{ô4̉$ª=Hšo1¥SÓÞÛ^á:&ëew“Aòì•c*äËšµØ1‘¯vŒltkS`TÑ£@é;¤éHS&@~犵'uZoíÄ(Î5Tœ™¤'™ÌsÆ£'ZçŒòöÈXÖ·ß)ºú8Ó–SW.WåBLUx@TEöœ#Y…›!3$²W°íªôÎûYÃÆÁU]qÝß{•SÓ¬ïµm–§º{ùWD֪Ǯí,–gópR\P]Á+˜1ÉÁ+¸È·§ü7CÀÌÀY7°%>Þ5^Qø>ž{p!ax§à7fJ?Ã{ˆñ†(éî9h¸H>^¢¤µ,U¥g?Á¾Yï'Øwæ4,F®ñ pwÜ7i!V´W˜qjÙ{ûØÊ^« ¥òljFQB¢]X¥b:ÆŠæøRÑ<c¡‰F_>°Ã‹‚ìr^BÎGd—¦¯~)“æ%›Ç¶¾=›0DPVuNbÎ}ä¶?Eƒ²ñâËBhd^„1ÇÅD‘áõÃJY.aH»3¦#C1–lGCYó&mq†ˆÒÒv½#-±Vä¡'FiÀkXÒµä,ÔÓ˜Œ„À“á€d42­+$jSbǰ‡¬/)Aiƒ² ¼ƒL½2Þ)d¡ §S´”÷Þ5{â{éT5Ö³M‘bâu”u7Áríi`×·£÷°gÂæ He°Ä¾‚¡ØÔöT;cúúf°Ù•m—ÈRŽìÄOÕø™ #ÀÅ/°j€IÌÚ}—f‚7BÒM‘5)1çM…{/ý ô'P—LWôDö¯Sx±P-^CIYð"‡q*Û$rT rj‰lÉá$:È•¿¤¨óLíÎø¹ïf xݸ[8ÉÖªP4UçʵDJ”KÜ6 q_ÏÓ[wÏÀW¢w]hºÖy<({Üß3”ƒ£`ã­D u*T£õ¥ò6&JøÛ¦!%[þ€Ñg$õÛ˜E‡›™ý·>­M¶èUN 3´€ØGZ„òófúˆ‹ìúfœÇ!åýé¬LÚ0…¡c̢¾þúÎQ1Ë|çµjÎk[{83̶?žüÇøwW­­m{þÑ)5|ªms¼h×ÕøÉ·—¶>*ÕkkÕõ[fòs;ÆéûÃßö|ÛÁ¹»íÜ1NŸœî™Îäü-;yŠŽñûËçb›!ÓØ&ÓÀíFbǵ´”ÒÎÜqwÅÚSMïOSð…ïÁ=xqIx¥ŽžR£«ÞYÝÝ*ÒJ%‰*ÍšËÔ«ÞLßG,†œ} 0¬°$bk8ª%«<‹í½^bÓ:b³_›ýLlö b³¿ŠÍ~"6­#6í¢Ø´3±iĦ½ŠM;›6¡Øì¯¢§…ô̸µ±>]š6Ú] BGq‘†µ †M–+Ø,xØÙ¥+ñËrë¬û.ž3ŠçdhmÔxš0DM´¡˜:ÂÆ1˜Éß’hq‘ÜÝØå£²¬D#Èù=âuž¦ Oµþ~Ášp!H“á Azº. $d—§ÏΓ葜3ž_÷®dÚ¦‹\¤ÞS~NWt3^‘¬E$HUvSw.r3^²)[¥ªõ2c_ Z,[Ê8ñÆ29ø©BNÙyNŽôÌ »ã‡ê­rD GÞK°¢ÄÉõ%é%rÇDu¨<¿lÛ¹œ ±Ù²é$Q ¼'ðã4WfWˆcðãE8zÆIÕ£Ä²Ûøxn•ˆC 8£UAÉé™q†™|¦¿¥s§*7Âèp"4ÙÔQïÅóõ†öϦ2S¹´¡èàsR8²£DÃú†S‡ÏG½0ôÄ)3Ĭñ›Â÷©1`Gþðû`À †ß”¿¢ñ•ÓØ‘CUR¸)ð6]ü;ç¡TƒfŒªÏ“$kT¢ S×Ńžîá jn„W—1ý<^I¦Âs 0Ì@ƒ³*ªy´Þ€ú¹x+]7“—4‹òi›_Š 3ÍqèAð.ó)猔Ę—¨ò¢¹ »Ó3Èé)ÛhÞS%ð5üÊ›ƒ×-{6஼ÄrSPÊì,) £Ï°1@(KÔ‘cê¢Q„øRRôWL&2+Rù7ªÃ‹Ø›²[Y°š?¨)!‘‚+“‘¤Y\?Z×=—Žðlje*,P™fõ{C¦¢ÍGS;ŒD£r]Öm©xdÁ\¶À¼&ªš¿Bx˜è3ÇðMÆO¹F÷6”Ã+Uõø‚UáÄÁb6sWµ+jgœŸ)&=®[”°<°$ ejÂõK"Â`*¶ +`NÍ€¶p0žySOg™ŠpܦW}`Ø">ÄDÉUÙ&7TK sEËbu‰RÖö›]¤RíE4õÍ•ŸtÁ+Ÿ>o>Gí'ßvŽf"ŽÂ©sÙÏRîܬޏ¾}`Mc·ôÚRž0c¯b m› 8MÀžgZI<à~“Æ{þzf!*ã®~“akãplŠ/˜$ÍI”&ž[îÇŠïÉÊëTÍFç¹ß²&[ö ضY/åMåÂâ²3-k€…f¢Lc¬ ÞÃ}Ål,ß»V̦G”‡¡§‚Ëojè˜äW¤%ËúK1CËÝâc‰m¥ê1W d,W»¥kë™g”¬ø®¸Z5÷7&;¿Þ„i$ÛôãâóeýR»·“$Í'óvÊ" …pâù¶Ü#júiãÈÍm¶·(°³Xbx™S¦<³¨gO¶.lªnèÛ •ì!ÿ0&—¬’Ç£¼ˆŽsWñY%µï‰g¾l??|‡1+d#.©¸"vâ5•&©: { ËÌ ØŒg²KF”Ãc‚ßܶ°â­¤®=SgW“Ö óØÆEZ8&j¶éœí}Ý{;5ë?¨Ö½ xƒ¡èÍÌj€3¶ .@ø‘®Læf*vÁ~I Öõð(ÔúòLAoÔ ½/Ö·üíå×U]5%Ïåy Ûë.gª_Lo/Cv×!_G…è’’4[ì¥+Ý@¾ÚÍc^ èÇéá8v< -îæž÷Œ-Ó9D¸Û‘Jßg Ñ=ƒ6µ4ƒ^Á÷Th ¯xÖಢíѼ±Uk0TºíŽfvPá8c¦ÛÂþà+ š›jˆµVðMñ¬ñžâÓè}ð „wÒè¹_ l”v6~ê̄ՈnŒ›K6!/ XѾçHVÖ04«U¸*ç >¨KÊH¬µˆJQW®¥¸§§'µƒIêdôõÈuÂq„ž)ëvõ¡¦ÄÎŒþ ë7I½;Ù¨½/•#ú–†t1Æ{‡™· aåõEa¦¤qà…Œg–ðäïèNÕQ`¢ïxuRKðι|“*î U ð(·X|çˆÂ>‰€ÚE-áh\p„(fȶ«ù& JñIô¦* îÆÅ4.’)>"6IÆÖˆF.6+'ÖÏwí.lJ¶aà%„n‡ÝxŸìYf@> ‚¹Ö!’E"{É‚M±ÁTÍvEØ“lÆ­g‰sÉpÙ2”½$ ëdô@Ñ%î\(›šV^• ÌX3Lˆ`Ùæ˜É0]ëª8LPiFëµ!ÙÖ¢©4<žšõÞ~é‹"·K6}e-Žm:B4-¦…(åËZHVg›õðfŠ•h›ù%+Dv'ØÂkˆ ïù+Ú±¬.pN =Ñ"ËÌ®ên½ùµMñQ`s9"w'U?‹áú( ÕCuH¤àæO¾¦l+ÙÂ#¥4IlÊ;—3¥¦î[Gôe«e[´xÙÖ„ƶ{8³z8el²LÏñ$œ†¬52c“µq²yadé»ÌôÕ¾mYëÑ jëàà^@2zÉ%1ñ3ãdËä{3 ¹ë*»aøD†á¼NL{-Ï££_Ähû%[„qQ%Ö—Í{ÍÞD¦Æ&5*jD–8žº$‰´½åxO¨YÃSr%Ôäõä ÍÅ}vu•Jí\ßRîé«×îq“œÉ /JÖK?žšx|S«ÕÛTäeŠàO•q-Â6ŒZ@/ÕTÖ tÏÙÀê$ªddíô¦”‘Òœ­Ri65ŽI¼8›ï’ÜÔµ+ Ë >}÷YÃA˜Á­'×üŠØ>Á§BÆ AAB’FSésOÕ8–,rX˜Ù{šÔ¥wÄ©ÊhW–W&s›J8Sé”ÚpˆBCA•ˬl€ÚÌ—È(³E÷‡O1Å>3Óß'ΧôGJ¡¡µåÎ!J;ãÐH¶ˆ’pË,¦6Sç3Ø5 %hpÑØ¯LsÙPù^¾ =w›åฅpU?Ù­dÀ]Ì©ü .Š˜ KÛºzÙ³;?,KGâÉò—dQZÃ7Åãàu#è`àc ûã¡ø¯át=¬A|ljÕýtãÃKž½Bå4^Ÿ9Ky¸³³ÚËÓ?oyzῌ ôãye6ÅdŠ„3Õ}€$%ì~aйpQ©2ÄÙý´› S"pv”ð¹Ÿ%ó•W{–ÂV4ê\®wC(Éù„—ÆÃH nµGE·ä(^ÞŒÙíËWf= Ôš0Á4ã¹'Nˆ¼…]¯"冨2aEÍ[*|}?˜þߎšœÖÎÔߨãy¤?®÷Gk«CÛžtJ]>mÕ¡mŽo/rúòðÉ·—¶>*ÕŸþR×o™ÉSÌíß^Æ¿»ómçî¦uÇ8}rºg:“ó·ìä)v:Æï/ŸˆÄ2ìà´ië‘ÞZ¤ÐQW%ga¦ÏMdt®hÿ“ÔR5=2ѨŠ2Dê™îÖ›h¢…2„q«É/L0î÷¡‘ëMÓ8bFVO¯uÔÍ» ß>¦štÝT5éì’jrþdª6Øj®š¼+#ãSÌíWÕ¤k—T“®qÇ8}2SMÎß²“§Øé T““Qs—-2 Ö’,v"» )À˜o=ï‘•"Ë_§ÂT¥J…ëî$LÙW—?JÕSþ‘4õ¢ë¦«C$peHuŽ`KÆ $ÚX¦²å’É@<ëD,d {'ËÕÃ΋T­Öd‘¹ÙÅqþdÞüéõÂÁÛ&MÑäÊ4ÍGòëú1Ã\CÚÝ»õ(²X¡à[€¼›ª+œæ¯•ó~ƒŠÓß&:9±5º2úÒ•/ðŠW^Ñ<·kÑÀùÓà=¾¿žu×-z@¥šÖ%Ó{eSÃBêLô€àXC`.L …þ–˜í*šJHḺkâ À.òqŸˆ§lpöÕ•U;L“j•Å‹ó‚b²°Z;«àL u}].J‘m–»Zܺ`h­§b‘Æá(̸¦™sÍ]ÁŒ£`­¨ŽÞ­1µ»óL§0~fà¤u;œíj}êH/­uWJ­ƒ¯„Øô„J³ ´çhL=èøhŒ³æ5›©…¨‰™ÌÏ áô´ËÄíf0k}ªÌ­ÇÇ©ò«Jö”dQøìøÖeÕö®2Â(óLn@~³^A" –$Rx…ó陬o¦ë›ž¯WS<_¯–ð|½vñ|çO\<ßÛ·Ìä)ævŒÏ׫%<_¯\<ßùÏ÷ö-;yŠŽÏ×ë«3 G¤Êƒéî™Ù!ço™ÉSÌíW;Ä4Kvˆ©gcÔs;äü-;yŠŽ‘À©Ç&* æ¥Rx)Þ‘ÈP hý®dÉ(Œž1ãÆS̳³&Y‰þ)Ü7M3e›M»Ä6ë²´Ó'3¶yþ–™<ÅÜŽqe›M½Ä63ÃÌÙæù[vò;#Ûl¯†Ëg›‘ºÚ:K2pƒ0@ Üz ø€!ÞA `áK@¸FÇafý™xœ›s«+b à܆ðáÒ8ðÀ¸–\Ÿ¦0Åçi¼xÖx¦x¼¢O 6Â'+.ólzWžl“0=Œo1|Z‡‰Ž ëªÖÙ‘£úã7ÍïõˆÝ.ƒè/Ãøj=9Z3‡#Ì“)Ù,©ÅÌ’Î1KºE³¤›™%Ý‚YÒ]Í’nb–tŽYÒ-š%ÝÌ,éÌ’îj–t³¤Kh–ØÝ,qÍûˆdÝâ²õŽ]!®²¦wÖCÆãbTgìúTå«/Šõ) Åàoâi)BÃË›³Õ~ù úØ Ê9{GSë5µ~¦©õ šZÕÔú‰¦Ö;šZ¿¨©õ3M­_ÐÔú«¦ÖO4µ>™¦ÖŸ–-COó[xŒ‡o´òqòƒ…³ÊeKàã`ë– ÀîxÍÊQÝiGB0È)ªþ,q¢/D²äM`JIÜ„à}w5¬0hh¢ò¾Éø2c¹ÍÚ&aÅ—É“EÅÈŠŠvÌÈiÂê(P©ÈÖ)ÓÙÖLÂã=âYrN»Æ uº2\S˜éaŸO&›Ú— }),¬˜ÔKY(2cçî¢ï㈾øÞ´þ´Þ·Þ´ÓßÍÜ›vú´›zºÞ>q¼i—o™ÉSÌíƒ7íô·™{ÓNŸêÙÚõ¦]¾e'O±Ó1xÓôuLjÊ”“–hŽU€2îÒóL‘Â8¦ˆ‡kt$€üØ©ª1×üJðÆTŽܼ[4"Ùº¬îPî‰âìØfŠÙ¼Ô!Sï¯æ3–zéÐ~#K¬œ½e`ˆr‰#ÎëKLaæK•„‘ -ˆ6«‘힢1„ÈÈ]=Ì 8 ylA"ëWH»ƒQÒÆ-SæÁgâ˜ì_ráü%Ô”j\30{Y×¥LµHf÷ܸqU¶g«»óäºJônýi«:L±!™&˜Š"wŠbRiðnˆb9? S°tMm#6S)ç´É‚Nž„eJýJŒ¨ŠùÃÚŒZ¶^E Ø$£ÉâgÁ@ÆÍÐùV6t.ʹe3@¨˹øµ-w½¿rËFO–Y X6LlšyÀòü-3yйã°lÔRÀ²©fcTó€åù[vò;#AÀ²±Ã6ÔШ§œ³¢VçÌý³'<¨_ïÉiL{2ÁžL S/%™ r‡=ÖÌ韷ψ°Ô#=ɰåEŽw´¿Wd7$=÷@ÂðX‡D+.‘žfùkðË2´lˆ}†ÂùåÆQ Ëð;µ#«(®ŠyL&«øÀŒÚdªšÙXމv:óØ~dN2‰-]‰lam3^ ¦Éa,¹‘(%IÓÖ’ù U@Ï4ÜNUïºýܯ?÷1…vÛ;;òÓ^=Ž×›ÐDŒ*†«K1åŸÐú–aFˆ·’ˆkàJ^rA±¾šÅzµsëU½}2 Š¿e&O1·c\ƒb¶_ ŠYëŽaí<(vþ–<ÅNÇHëÛ‘ß\n8Ÿ'cKî}%VãÖɹ2+ ©aùï‘MkXŽÇ" ‹¾Dé;2$/ª:˦¸Ë6}¦g<‰0,ã$¤\ÙûöæoI/ ÉõÆg ”²eS0m•ÛzåH"Š/ÏðúXhÍ‚‰0Ò”ÝO ó"Ë|@wírSÚ¥ã“h@Àyì‚ÜZ”Ú&.@Ûd…Jm³Aé|Á9qc“­#?óÇòk‘4PêOY<²í²” ŸÈß ƒ@ >]ŒÚ~wøâš8Ú$ÈÉ‹£Ò„ˆÒq_þÖ½»y©ãx7#—x2‡‡äŸ',' îÊï ,A„H(jL‘»=QZ‘ ƒg­¥"*ÄçV¢°Å8zEm[[GÔæ§ùdÙVuP .‘û5¶ÔËX&ÎÈ"W€òpØõ=÷!HzÅíÜ]2ueÆQa«YÛà*ØjVÁæ°6üÅ÷àF¯¸=í@ KW^ß×÷ôïðý´ÞuþåÞVH?»XHèDK•:SþA×ãì$ï ×îhéBÄú¨/Ù7W.»Úί˜/Ã=ÃÉ›íŽ1-ŒcîyH—æö:¼):üXÔ. âøM;ÁáèaþŠ…éÂk(ü4xÏ 8ª WïÞÉ–%¸óïÕµS†k‡·“~&}O[ÅÆòÂÚ ÌvéÊ='ìÒN@ZPxð›x¬1ý|EG¿)žÁP^ui­?9‡ÊC¸Ìѱîãyê_õx¼˜¨ðfß³jƒ6Îà 1wgHôžçûÛ–ø±}œõt•9/¶Ž)ÜzQÝ ð{ÂûðËËÿv¬lA endstream endobj 5696 0 obj 10297 endobj 5700 0 obj [324 /XYZ 38.2500000 743 0] endobj 5701 0 obj [324 /XYZ 38.2500000 671.750000 0] endobj 5702 0 obj [324 /XYZ 32.2500000 712.250000 0] endobj 5703 0 obj [324 /XYZ 38.2500000 671.750000 0] endobj 5704 0 obj [324 /XYZ 38.2500000 553.250000 0] endobj 5705 0 obj [324 /XYZ 38.2500000 553.250000 0] endobj 5706 0 obj [324 /XYZ 38.2500000 212 0] endobj 5707 0 obj [324 /XYZ 38.2500000 212 0] endobj 5708 0 obj [324 /XYZ 38.2500000 743 0] endobj 5709 0 obj [324 /XYZ 31.5000000 713 0] endobj 5710 0 obj << /Type /Annot /Subtype /Link /Rect [393 720.500000 417 727.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows >> endobj 5711 0 obj << /Type /Annot /Subtype /Link /Rect [324.750000 302.750000 399.750000 309.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_readonly_variables >> endobj 5699 0 obj << /Type /Page /Parent 2 0 R /Contents 5712 0 R /Resources 5714 0 R /Annots 5715 0 R /MediaBox [0 0 595 842] >> endobj 5714 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F8 8 0 R /F9 9 0 R >> /XObject << >> >> endobj 5715 0 obj [ 5710 0 R 5711 0 R ] endobj 5712 0 obj << /Length 5713 0 R /Filter /FlateDecode >> stream xœí]Ko举÷¯Ð9ÀôˆQ?&@ Èa‘C0›M°˜YÄÙCþ~Ô-©Ý¦ú£ÄÏEv»-;ö6-ªXo«ŠŸÿüøâ_¿ŸoÿS|~Þ>nÊm]•ýW±ûþtün¶ÃïEÝTÅ·›çâyó°yèþ}Þô<Þþµûí….þÒý÷kñÓß»þh÷?6µª»Ÿß÷?ÛZu¿•‡Ÿ»Ïÿ½ùÛŠßv3ޝ€yýÿŸŒ²®´;0f^ý¼—©öß¿ûmó¹G@Ü[œnuÙÊ[¨Öêâ¿ÿÜüÒ½`œ¾Ü6Ö(SëÊv¿·ÎÖeÕ4ºû½6ÃûòZïÞ®ê²Pºíþéfò_¾ÿš>Áä¦Ôé&ßC.Žeœ ϾmÜð'ßÝì^¼g4«š"?«UMÝ“«­Ðë0{ fpJ7ùri¤ŒŒ'OMínšeµK€³Ãì)Òì4rªÉ÷K#e¤6œ<5µ[=ªbe íezñÉMYš*¹÷‹ce¤7ž=-Á;¤Ôm¿áxú“kÕ&䦽ÂMã7„fß¶V©zGè·x¤ýÌAVS7áí(2éô«)m•¸{Èű2Ï.IÜÊŽ¢U§@ÑËô &ßmð’M¾‡\+#qñì’Äm”NæcÍžýméÒM¾‡<˜<µî¼û„Ô>Ìž€ ª¬R²ÒòTÔö'ˆ™CÒ"NÏož6Ÿ¿*[vfÏO¿t°íßÙÿxêPRŸva¦ÎU|ú¹øcYê›?O¿nÚ­ÓÕb?R6hD98bãŸÑð™òŽÜÁG¾ÆÃfÚýÈýSGØä4±jÄ„cc^ëB­ÆWŠù®G·ðˆkWj|B•/Ýj݈+õ Æ"æXûR‹¦ C¡ÆÈQ«36í)Ri·'•1íf¿hÕÙž_­Ÿ©÷#ÕV»~èeÑx6üÌ|¦EϘªÆlkÕÔ¯fkÑlÊ@Êþµ­Zój6 G0lå zFõì¶Fõ”Y‚ïU½(Õ[ÓùÀz!l·×êù•Û6ý‹|ƒqj¥×ÂF¬T‰ Òm¶ì¦®G0Õ¦ëyÏG»ª¶¥Â^âíÖšú5áG´ëqÈ'Õ©gzæ7Ûʺ×Ì?ˆl³`’AÙýi/ ÍHå£YÑ·èAY2^—…#‚À1lx¶û9nÔë•NÐż.}p!ây‡ ôÌË2C[¼ ‚êJÃgàlƒu{MÆ@ÜLе²[œt2ïÁüÑ€Íøˆ„ÀÄ@ Š÷ïò™ÅžÐðUÕÄòa:3Ú[KB¿4£á|t>ê©eÀÚzpó뉧Ch„€bóª•áN¬@R€V ŒáÁNÅrg)—šò] §ÇzŒá‡ .0Ú0ý°œÙ€ëÒ œMÖ̈º®ÂfóÈTÛ5 $«eFD-7"mm|#rùjÿ`T{|¨)>vËÚ¯jŸˆZüèvƒ¦9þäûæ1YÐázƒ‡ìå~欀vÇ~–ƾÜI9;M¡íIÜ©=欮ÆW~=8ƒÖcÓŽôlê¶n\qð™=3°¶²ÛIðK¡‘Cßã Ô7è=z€ ™BÐ q½m‚À{ Ôæ \|&ðŒGJ„ƒa»pb¥ØÆè÷”Åkˆ7 qp;ƒôa±]öÁ@ªCÜuú€ qIøs»BÆë°†Xq ›j6éÄhf¿ÇûìÀÞÚù€‡ÌìÀ1Ôð=S¾‹p³™-ÇòíC œŠð¢(vÈ/óQ‰i‚ê7t&Pl` ˜ …Fø« ¾vœÐ¶¿œŠ#£š°œ`+z.‡žRZ².ˆµÁ ak7k„x»!ì ‰”U9ÔùÑr=dmüÎd6ê˜ÒÜ4Ú·7ËSȾ9³Aó1ö†)P˜]VPº/¸ž#ÂõÄÿ2å÷Ø{)Ÿï/àôsq¥>î û7¨zž]'Þu<>´%ÈÕ âü]=r­¯ç2º‡¸ªy­ûO­an$ýήVfDQñ‹ýZá)§Ëå?ç4µsóª|m_•UÐw-ûŒœ½}Uñû>éø>[üLÓ4Ãm¬_vÆ.Ñ*©<Ô‘ ûŸâb«Ñ¶À{pƒ'­¼· Âíˆðlx¥L £\‘ç¦1§­…˜¼Ï@lK41óZ3ÉÏûf*|e“d#Û1™Li9Ós*— 톑ò-ÉcDø5€”åù×/üL¾ÓòcrYAŽHD pÌ\<5e‚1¾å;{‹¾KîÉC•1¤-\ Ĥñl˜o™ ;Ùà<½õH”¶’M¨ÎTÑQCuN팰ñÐ3PGÎë™dV†,„h¨Kãf‘ׄÆW•¦ö¬o¶†ž ¾™*Úåþ—ˆ•M> xœ™*Ô‡àü¹m+†©‹0io(:Ž©D\-„#æ„»-Û¤jê—eËF4vغ51«¶R¦_Ã-É”¼3%ß'…©<Å\¶’È=ÅW:^ê‘ $ã¿r_>î“Ío^)w ”«0lX£¨Œ’~¸0DAÍ(,â½|!_[Tœ§žd=éw-ºïþÆ KLÆ •µsÁâÔ=ú˜^L" «˜¬,{Æ´JM_TÕ*8N‰ý÷9Ï>å‰MÝxk»’N–L‘lëÖs £”SÚå|ƒ“+Ë ÷0ašõˆ´2¼KG‹2÷:1½˜ÛwEî‚’Mv½Ü(p: }¼˜¾˜ioÙŠš€#ÚôIz¢BÓ¢¹º1×ÂM£r5xC:CBC×8å:F¹“r\x9·lÆ?N‘Uƒ˜ d.lú—ÉÍ t‰þp®Hâ{Ÿß•ßÉládîˈè˜-šŠ&yoAÜ‹Eº½çMuM-±Îú–ç{á8 ŽÿÑÀ8ŒçšXñ;)kSog©@!S꘶ívÌõ\k¯E›™3UÅØÑÆêÀÜd„ÇyBwp‰N±Ú€I848ˆÅªSÅ+»l|xŃb ד3yÁÔí<ÿŠí²ÀÓ6³ð\©y=3'XU¯šcÕËùŸyIýàR7U²íÁy`®¶=Öþ>šÂNÙ.À5v?Þ~(°‘¸ô{еÉ^C½ðô*»$B@&2ÄTG2·z\l¾FR‹¡|…±%O{/ƒv™tFó-ïR œTÀ\J$ÄYž-ÇœdË£;s?Ë´n•³¾å×îuB•XëÊÃA ô@Äœ~QGÇèS¯Ðײï*ïíÄáŽ"¢g’²$1k¯þŒõ£¨ôR/j*;6ßs¹Þîžÿ±i_ð}óÐ\iT^;½ˆMRÚÕˆO´6šñ‰¨¤Äe•”’'ÖCUQ0Íþ˜ÛÄõΕ¾Uéñ2n_|®”þó%yà„a<Û|£âŽsár$ÙkY é`\ ¦²l*QL§Öåûù€V^ÛÚ¿ÆkžßüeéO–Ò9ã¤ÏÎÓ¶¥j$½ˆ\˜ªsÖí lë‰öž_œšÏ=É™ ã̇M5kD—1ly¸¢ó..»é`i]½H[;Ë«¥x–" êKœ¼¨‘@›ÜÀs<æ*âBÚWaO´¿¡`“•` Ñ/0!%”}eš÷A©Ÿõ1R_Ukʺ:¨ûó_U‹!€—¾hWfÛY=ƒ/¤-áH‹  6ÜÖ(}2qêü<[®„˺[îêûqþ±¯Lþ ‘҈ш–±Sp&A<‘k—˜ƒ&Ëì/™]ûø¬‘Íc~X/rJT01e•)Ëg•ñìÛZ° ¶ú]ïë˜0møNµy(ürÃ"îÒŠ7–ó˜ŽÌ¶Ž °ÁŒy<2×S÷É;7žzkÆX| cƒÉ+Êuó|F•Ö²ÁÖëB°eŽKÐ=ÁËUï[1=#ŠÂ°FÅö™!?¡4D~@ZD1¢m-z>fŒÉø8sï ©º±÷m{“›ÚÖúÞh„ÉÀŒÆ\~à8ÑnÓÙ A͸}Ø— ê$Ìs„P2±˜;[Djâ°èŠta¼†+ê *Ó‚Ñ…¢a¦kU~öNáîx¢¡3&Érj±F4© ÐŽT¥]Ñef$õu®G x· IÝwñÜ!"ˆ§‡¹?X€Èæt„¨Û¨]Z¡¨T®½õ«O¬µG²Þê>cüh¤·n:2¤Iê­ó“¼µ‚òu‡Þcæü¹S°}VŠòð°ok}•Œ›.p` l.ðûÄ2ž >3(Qµô£’9–áv¿w„†¸ÃäÄ,€Ù³€ñÝ~<[;c2¢Þ3ÖTÄà{ðeO°'À{ Ôƒ»f—ü)žKf5‚ÙÈ¿‡ú¤!DÇ—óãp=Ëýui¶ƒæ\&ê2Ç8³æá¡xØü·ìØ· endstream endobj 5713 0 obj 4051 endobj 5717 0 obj [325 /XYZ 38.2500000 749.750000 0] endobj 5718 0 obj [325 /XYZ 38.2500000 248.750000 0] endobj 5719 0 obj [325 /XYZ 38.2500000 749.750000 0] endobj 5720 0 obj [325 /XYZ 38.2500000 248.750000 0] endobj 5716 0 obj << /Type /Page /Parent 2 0 R /Contents 5721 0 R /Resources 5723 0 R /Annots 5724 0 R /MediaBox [0 0 595 842] >> endobj 5723 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F8 8 0 R /F9 9 0 R >> /XObject << >> >> endobj 5724 0 obj [ ] endobj 5721 0 obj << /Length 5722 0 R /Filter /FlateDecode >> stream xœí]Ë®ä¶Ý߯èu÷ˆ¤ž@Àó E€Á EE`Ç ŒØÈÄ‹ü~t[Rß¹TJ<],±»å=×ÃÅbU±XuêÍ?ÿýðÏßoÞ}þÏá‡ñ÷wŸŸŠcSÃ?‡ç_ß}û¶=Ž?š¶:üðËÓ×Ã×§OOŸúÿ~}>øüîÏýOÿ;ØÃŸú>üõoýþ8þ¥ç¿ðËScšþ÷Ÿ~ïÓÿTœþó=ýåw‡_Ÿ{œ†'óúÿ¿s¦ªšÓ4†þú4-Óœ~ýöïOoÄR;cªâ`JWLWÚÃÿñôS?ÀÔ}qlKg\c«²ÿ¹«Ë¦¨ÚÖö?7nü‡¼±çÑm×Ó¿ž}ú%Ó»IйµUºÎO3—&Šqµ v~ìJcšç]¾†­†8× ä©šô9÷ž‚ø®K¸³§™KeÚYØyês\–MÂs|î=ņTÖ¦ëü4óTçvžz·k3ÉÕj®2®'ÚK÷ :ozÚ%ëü4sqªLû{O½ámÛ¥Üð—îå;·E™›N3O¶á¸wAMm ä¬K@ÿs÷)6·¬Ò ïaæâT77лäæÖÕ¨:{›FžBçÞS¿©ÒIêaæÒD™¶v.¹³máòØ¢K@ s÷ ¨ï “pkO3§Ê´·³Þ?Åô‚§2ü ¸ò |øöËÓ›¦ì'dêןúÉÆ~ûÒ¥:|÷|ékÝáˇß…}û‡Ã—ŸŸºcm«iŠCKÑ¢SÖ2þ ¿)>À–÷°ÅÁ–ñssÝ©å×~cSï‰-ìòÞÁ–®îcae <7Øâ*8žlq˜Öå÷¨¥Â;w÷&ÇåíÁt—XÜÖ‹×ö5¡L/‡éøbçRKsj©Ž½J=5½´Ô¢ßtè3KcucÚ¦ú曱ūÎ5¯¾q°·~cN-õ±'Yu‰ù/ÌÚ ¢¡9º®ðÆÛ^$ÁúKÕóöºâ¬ÀŠ™)aÕÏ\‘´LQGŒˆ{•qÙ69|‡î‰MM™²õŒ¼¸81B%ÌQU¹,¡Þvƒ¥¸Æ`‰£ŽV Œ> |SÄóµZH7-Ë!XRR,ð Î-;ŽÇÁû#;k8N`ÖXËXE­×•xuL 4æ>bO´4²lÜ4žÛmj×Řî?ÌÜkîÞô;–;p=¸·l$_z\U•Ód6O]¸i"R ò D-‡+M5öFÓ± ûÀëR‹à‘Dšw2{YÛœ…>hÆL|3{D¦2.nÑh™¯qÀçM<þƈ°{O[Ú2þåÎÈSoXUöj9 "á hTÙG¼ˆè,ÙßõŠˆ n L‰a^ætã"¼šá.¦7ü¾C)Lk¥pZ*OiÑ* <©2O€ûëëY*ÜÛå(Ñ;³Î©åD\BEO‡š^Í/Öâ¦NÔ6#¤Ê%=TAÖ{»9P‘ˆ¯H—eÒ¾¢•¶õ¤¹Á¥øIXÔýÎ N¸äNÑÊT #´[À+€ïÌ-„HSÒŒ^ªK·Ì2ŒW¿aÞ£«½1cZo~î­"½j3Íg¿l[„yYôu2çf1.Ñro/š”¨u+ÎYk¦Qa\ƒ™ˆ8cÓ”IM±‚"w&“ Ö:J‘ »ä¹OÉÓ¼¤.kùÁšn2\ûÁ(ŒFQ¯£¬ãhw|i-êøHœ™>óžüÄÀ¿!“…w=&?icGbZiê&qÚ-Ÿ®·ü;¥Ø¶Î[[¾¾í”dh|õ%ûîA!Â'‹ #`d´Ó´LÖ^Ô"”¸ÙQ¡â 7FÙA7ƒßl† ¡Öñ±ÌPBß|<à[µZBQ°FÄYŸùJF‹XOIßOÞæ­.køÝÍ“< DÄUàÈ„§3!†÷aéÆèŒÑh˜ÚøLü ßámÙ*då á’ÖmÑÁ,/º ð&.ÛgSúšI»2¾6ÑÙÆÖ®ÞÆ1é?!IMOËûgË2ò9¶XS2–ÝÝ_Ó^1dí° ,[­¨é{¿ô2ð¸˜8#¸´pû×Ïì0ÆrZÊ©Spœ–gõ˜qb¾é/>¦UЦ°·´³Œ5ÞldSâ6¶†LU¯&¶‚54¾ ®!vÀJ‰BjÄÏÞ²žDÝ l e`&á´ý÷hÜ"!ãÞ5æ^U]ë?©6ô%çã°ø~ç¹²6(Sd}ú•l1Ä•G2*``\׆¸³d`-ÈËÉw æôDèÆ+B.ÒÚ×mí+Á-/3mëßPïê2Óÿú°åe¦såjbïrm—kéCÉÔüúLu®í½Ï*cBÆî–;c{‰æI¶õ‰çž“„7YˆqD=Ÿ+t†‚§»†  ®rvU¥ WDo†ìC%:ˆFwÞ‹‹IÉð èïi鉨½¾UÊÜÞÎNèZ1ønºè"ˆËF‡9ÚL-fÖ¸vJî˜.]içsoø Tíü “À‰÷þ6ëF)Õˆôf`o E1 p- ŒÕÂÌ€X)µ§DÍ « s<œA˜]}uGãY¢UÓ-Sd×&»6ÉB›`ŠR2naª.á“¥(œuÀ¦%t­%jy´pæ8J]×¾ÖÉ=•¶hìë…^J7Œˆ¼À©8 %ÂEš691^b‚#¥T"\ý²1›"Aˆ”G™OòÆ ÅÌË3(nyoòlŠ„Â¤?,Æ`&( Ԟ ¸|‰:‹>ñKNg%8 ´ó‘²^ÖãÜŠõo€LÈÀh› a´Ô2Î)gðô˜|E­2F»èÝÊï­TZD„)΄}‹h„BV¡'ÌË/õÆÍ'e$ÍæŸiß$a´kb>·‡Bßt0C¥-#sáe¤0>(ŒíEÕQ)ç[Å)SîÖ£Ë"ñ¬&ÆÂXM0n£Ñ¬à‚ë¼·ô mnŠÃ!µc¢ø”*”Ú ‡ÌêVÜŸ\#”SDúÛîNRd~ÆaKøMkÄJ׬Çþí!E\0ðÀÿvÄ‘“Èÿ§üsnÕRWDný„æ‹9JðËTÞÜA”.‘P±Öñ;â9K$70{ő뎬lèo„–Ç›MX<ŒéX2õ†%áW!Þ²~Â/­˜‘nM}.ýŒsá˜Ì"ÑÞ¨œ;œ)®—gMk_ŸåKy9LV̱±8OÈZ²8çÒ—Ù­@nÎöÍ»0îœ ¿Øâìâ†ü Îe#Öíð p"l)‰ü7Y`” Ù•2´Æ™‹™£WØžeçÈ}$²/Ò ï‡É—‡œ”Á©%v!À}z›Öºs-h±ŒÍ£6²†®à7¸e×ê¡õd¯Õ»:M#*¡­.Kƒ¬eñ­bRYgª‡Óê‹ËËÀ ˜@)Âwc,I ¤–ôuØâ=éøœYˆ†°ù‰³©i 9Wn` ¹‹í5Ö÷K<¯Ä¥7zËd”´‡à8ÙkQ?å´(ßn;¬(qËóC£¦Ä-Ï5™k-£²-_þRqxü¤±þ=S¶8g”:*Zé ™©PIX+Eæ1Œ‘:dl}òçöùÐLÄ æ¡˜<ôú ÓÓf«U1ÒJJ»±8ÝÊ–žæ‹ ˜çÙ1ihÚ±1¿{àFr£†ŠñW’&½€Å%Ö~ئÈa¡àþd÷VK¶c™QëúΤœJVgÊÊŽ%£ ™d¡Ÿ‘Ää6SB$mþEü™¦eò×E3~)ÁC,]BX¤“ „0aøî‚[ÆÕ±“Þ§V¤,ÀSªö(b‹ñÌÝÕÐõ\.µ$­JZù{ªä®TcYI1}DMEÙ4 ¹¦&‹(/›°ÃTû à ‰N‹9)¡]òçØÅQ¯\ÒR“¶ŸûLr˜òh'*,úfÑÝq‰¸ð{Ž•šƒ¿© _¾.±Ñ[È,êmÌŽ¢5žÁûxé0—Éˈ÷ÂGL¾=%힀 Hï´˜Ô9êžYRÆ»„ACÇ·ÛêXtîõd1ë d3öè_Edßq6PFYHy%°þ1§À{#îYÌqÇjÙ«3 ƒEü0ø{Ì!EQ­zíë ³O[¥ËÔñª¡šÁ H<.±Ó¢´žÌ¶8 ¦Eþe “ãiwÅìb³ôLœt6oc{;EÎùæ*gXŒ™!«kùrQf^Öî·ŒzTi_ó¬$cLˆºjÀ¦Zr‚‰ÄÁ§† 4]²õ^_ªny«O}@ˆˆ>¤ŠHãsñ4c†ÆLC -RJysª%VC]-ªI}Y¦tï-vw2÷PY@㟠ŽKÁ’ŒÿƒÁÂÞúÙ§»¤]ìø’ÝµËÇéŒ ï 3j_jiFrXDõÍx+½ôMÇ1“<›eù -õÑëñüÀWÍÑͶ÷%Æ—¨ïÐÜð8¸·À à.±D²ƒ£vžH üLu_£ËE/ßÛ-…$PnT¦·ˆÝ½¡R•Š"®Zø¹[Œ"•5ΙצÁÌq%Šò«v‰-¾€­%&‹QæøW¤$ò!iíwëé9ÆÆCùÊD¯F¸|Ý3\“VÅ‹&Y=°²Lx:¨>ë~}yZL-Æi#\’)ã÷’r’(£>¿þlç²Ð bXt}¹¨yä&Îzƒœ)9°t+&-Õ>ú ^”åž8{á¹òÐËx+uç…(Œ•ƒø˜T’èqˆ™A“ŠÀHÔD]jŠn™Š `™Ž îEZÅ”'½0Þ!ÕüFÝ©±íëFÒù,8 ›Ö½Þl¡÷¶ÄÅm©×€í-Лôz2i5‹ÙŽBwô £;©¥GÜÞµî°Û{‹wÇ…ú¦Ï.eŠ€ZW¿žÆn+ØÃŒV¢ R-F<·ŒéÀÐÍ›¹­&tt‡Ï ^7ÆÍ%êLì-Aº‰Þ¿òéaN`γ¦j4Àœ‰¬iÊE.ÏÙ3qw-9ó?¶Æðzà7®zAHÈÇ‘(Ú¸æ®`!†=°BÖtçj »]“CKÎ'CVÖ0·ž]ÖHË»›VIà½DQÞvÆÞ4ï®%gé€å-¶ÓvÛ.oy«)kÜT‹h·í²hÉùdÈʚݶËAÖ<Žm‡£W4åmuÛT¼»–œ¥–·øÔî¶]ÞòVSÖÔç‚»m—CKÎ'CVÖì¶]²æql;K,&oñ»®(Ï$0—ƒ •('x¯qÛgt Çý2•”$*Q*c)çzºÃ ¬à‚ÀîàYˆ·3(ÜŸ¶åRò§,ð½`rúB¨ß¨·¬3B!Óý¯ÃמAB}Zú +(Ù^"¤ë¹°0ÏÁÁžK÷ᢃòh.e¸ÆÛ©&ÈÌ@«ç-cj“=Ö>þ‘5 ߣqÜhÅ¥¹}WŠò[qšGé‹AœµTÏ8Z ù†Û…eÜüf4LÔÒ›¶eîùç~ÆÓFCÚáíÄ,€Ù³€›è=üùÜRÂéÊQãL•vbè=J” ì‰N`8ëw¤\óWq÷ø”aV#˜=@üPž´ÄÑñÏù8ðUÜßî8JÎuÇÀ|€ÌQ}«C–ôÇáÓÓÿ¦ÌjÞ endstream endobj 5722 0 obj 4960 endobj 5726 0 obj [326 /XYZ 38.2500000 321.500000 0] endobj 5727 0 obj [326 /XYZ 38.2500000 321.500000 0] endobj 5725 0 obj << /Type /Page /Parent 2 0 R /Contents 5728 0 R /Resources 5730 0 R /Annots 5731 0 R /MediaBox [0 0 595 842] >> endobj 5730 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 5731 0 obj [ ] endobj 5728 0 obj << /Length 5729 0 R /Filter /FlateDecode >> stream xœí]Iܸ¾×¯Ð9€Ëâ"Š‚¼´äÀp99ž™ƒÌ 9äïGUZº[ª’¾z¤TÕrÃîv±¹½o!ßÿéÛ?²þž½ÿôí?Ù÷öû§o‡üXyó';}½{ùöÇöç¬ôEöý×ÃSötøzøZÿûth:|ûô—ú§ÿe:ûsý÷—ìo¯?ü±ý¥Ó/üz(UYÿ÷ù{Uªú§¼ÿ~úü_‡¿þ!ûí4b7]»˜×ÿg”+¬;-cbê§C·Muþúýûo‡÷ –ÍâŒÉ+)kl¦*«³ÿþtø¹ž >?zk”)uaëŸ+g˼ð^×?—¦ýÃN^ê~v]Õð*FsŸ¿dFWWÞÅü¼ri (ãTpðce•*OX¾†¬šèÒ¶à©ÿÊèyøƒ[gâ ~^¹8T:ÜâÑ%‘[œ‰Æ¶ýè1Àï\DÂ9¯<ÛÂÁ%1[*³ýè1€ïUD²9¯<fáà’˜­jë¤O@ÏÃËnsoðfåâPép‹GD®U¦ŠˆÜÃG¼¶Gâ ~^y,äF—D®Í[•¥mDýð1àïŠxB¹Y¹8T:äâÑ%‘[æíEkDýð1à_鈜{^¹8T:äâÑ#ymåU‹p7>o à¤>N mcRÓiåâPé>ýë’QðRšO€«æ)ÐñããáýeOÊÏe?׋;ÏÙ|{¬RdïNn]d?fÌsýå‡ìñ—Cutºè–Ø´Z”E-Z/ï£ öÉ`ËgØb` „^[Ž×†wŠ!Šç-êl0Àº‚+€8Í?¸6±` ÜL³¶‡Çš½¢s†µÓôw—C(bÜcøî<³mZƈ±€ûäˆÂý`>c$~€7!Uaêµp§æ¸6<šÁ܈ñô`Ìá>? ¶™ØO€0—02ŽÆhÊI ›F8³Ëèû•ÑŒ—JF3’ú„kƒØž´àâKâÛl!ô‡}rµ\ºd'a•ìÚ(6BªÈægU¤•M*?ºRù²x±˜âÜbŽ…u§†hû˜£Ñ^éy}ðî뇿:ú®ÃdÁ ­M¸ HõQ‡c¼Y81„V Ü ö~p}äp´¶` âµáÑ`$ž~k¿]BKµýýÀµv ×èƒW€E&gØÇ`bb„Ú™é.ÀGx´F%*Õøó;ÅgÚN3ZÚy"*±B«¡ŠrJÝL ùù}ÛƒO܃e§Í óš]…L|¤‰o¨x?ØÚÎÓ‹xšŽãÅBÙ‹wP°#{ ‹v<5£”2%FÃkÃjÔ|^n L (Dº,î–©/HíìÖ–1‡¥ Ý‘^%,R†ý0éá‚)NL¡*ÕÙeþ±TÖÖ_w/&©séˆàñq¯‘Àm”SaäH‹¯Ì@w9È\„°Ec‡#v¤C§«Á!ƒ©ÀMT›¼¸l”GsˆÑ€ÐÃŒÁXsóÍÕ€ûläiÃâŠ0¡lŠ)]áæ 2ÂkXõ‡Ù¶œ°w3`ÀyìC IÓ°‚ÉË×bz™ÀH(N˜èh VTÀѰ@î<ÏÇ„8Ñnr=¸G7'[ÒìÎWìîÍ©CqNƒ-g¯¡ÅD9ƒ8öúv¢ó9”„ò}`OÇ´ŒûàŒ œÂ8|!7i"K‡ p ާãјlÌ%Xþ %Š7WPyÀz rC¹UtIä¾mCþÛ\ÇÑֻ悼VwlZÛÃKL1hOÄmÕ™¤­Á¢Šc^™WÇ5Êe4åRŽ jï»ÛŒðŒˆRe‹!Nï*|²^ƒÃß[൵/Ä€ÄÄ‹ýT8?ˆOX³œî¶ê­‡ºÃš¡ ‘)“]‡9‡Ñ3x4‘,¾T<5™Ù„ùžòw— DG>‚#tb ¢1?2È…‰\ŠN@ö‚\B04»vÐ6²ýkíPBcO06sñ·LE?"ꥪ>±_4€£Î9]ˆäZ¯™;W•~xJ[½1 ±Ý$3`†gÌLâ¨BÉ ‰jJÁÞý¡v?†nèn/IS6ÉË`Þu±à(w×EÔe5Ø@‚§Ì`Ê@jk¢;o¨ÂsÑÛ"»ob‹iføT—raŸ–A–ÑÌÉE4î,R¥ì.“õ{!|ß²du_õïw¬¯Â¢ùîÌý2ÓÐémýKd ²¨$ü|Lq;U׿VÝA€î°®g4º¬“<ý¼Š›­0z ×öº,“’$ÉTÅ€Röº…ÕÓÙ*WM®çv‡¨|—¬—"-kr=6ïd»MP˜D_wHÈ6¿î¹D2!0›’~ûGÜÖOs´Jõ¢ëÞ¢H"'®½&edkR®¸åo»‚¹6U¦ún \¬*»èûú¥ÂZ·E1© \RY2#üXÛ¶KR¬ª®zàí&KR âyL¦¼dv—Vý¬bñ€³Úþô„O+߸pyFvË2’)º7‰Ÿì]ýìØóÐ*,lÛºžÐ®œæ3¼ÒDr5€GÙ²bYܧÔ¾ó"ÉiŸNÓã)õù=kl{E•'úH ^j)Û#¡ž÷E}4îS¡>­‰¡ÌqX®ÑˆRãh7lÁó´âöÂÚZUpimö©–·ä?*•cÆøÎKÔ>“u!N;ùfÆ…–%YâLÅÆ´Ó#²Çf‘S÷/ˆjãAþ¦|rõǪdnãMî~^X6‹”™GâÞ_¦(æ¾1µNåjç^ÝÉÔUýPËx¸±pdªX˜t‹D¹§Å%Jy;eOƒiù9ù3ôë·l€Ÿ7œ¼³K¡[ö¿z·¡¥v~Þ6?'ºUëFùy·*x)äûÔ³] ¥“B{"ç êô‰ÄÉêùUBœmÇ$A‡ߨ۹a®Ûòýܹ³§Å=ï+QZ\~óǤÍÊ>Ð's&æb||s N@Å †™’H›ÅûÁ)° ERLá—˜£yÌÔíw—Öö¥Ý)z~ 'eÛ¡:ÂbÁ7Ø22¶Ì°sa û´¢^-Úú‹g¢X‚;ý\¯¸C4„F'&L6˜Lïæó±bÃéñ‹æén»]ïV±] OÌ:yàªÛ«íœ_ÅÃc.äF{øPžx‚u†|ÞN|õ—¹9¶’s¨H^ê)ý‘}=ü‰âvR endstream endobj 5729 0 obj 3651 endobj 5733 0 obj [327 /XYZ 38.2500000 519.500000 0] endobj 5734 0 obj [327 /XYZ 38.2500000 294.500000 0] endobj 5735 0 obj [327 /XYZ 38.2500000 153.500000 0] endobj 5736 0 obj [327 /XYZ 38.2500000 680 0] endobj 5737 0 obj [327 /XYZ 38.2500000 519.500000 0] endobj 5738 0 obj [327 /XYZ 38.2500000 294.500000 0] endobj 5739 0 obj [327 /XYZ 38.2500000 153.500000 0] endobj 5740 0 obj [327 /XYZ 38.2500000 680 0] endobj 5732 0 obj << /Type /Page /Parent 2 0 R /Contents 5741 0 R /Resources 5743 0 R /Annots 5744 0 R /MediaBox [0 0 595 842] >> endobj 5743 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 5744 0 obj [ ] endobj 5741 0 obj << /Length 5742 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯èón‹¤øðxÆr`Ø@A7›Å"»ˆ³‡üýH­Ç´D}”XS¤Ô5Ö3ÖƒE?V‹UÅ÷úòã¿~?¾ÿøå?ÇoÝÏ_ÅÉê¢ýïØüywyAºS÷ûÑ:}üöëáûñûáóásý÷÷Cû—©ûßQÿ\ÿÿËño¯/þØ=Ô<ðëÁ [ÿü÷ùgeEý[1ül®ÿ|øëÇßš{r]gÆÿ~§„Õuu7H?ôŸ)Î~ÿöÛá}Ë€8*FéB•GQ6U¥<þ÷Ÿ‡Ÿj}óÅÉ•J(+uYÿ^™ÒÚ9YÿnU÷•¸•5õ²ruÿeU…ñ‰Ÿÿð4/øײæWªÆÛž³sE(#­ŸªRÛ ô[Õ2HU=÷m þ¿6Ÿ qm6~î9;WºÁ ´Î9¸F¨–AÚ&àÐÐz öS%l¼é97Sú¡…sެ“E'“kÈÏ ¡ùÜ7¢(Ó í¹çì\éÇ·žX ¡MÇ´º¥c24Ÿ qé\B45=gçJ7àÖS¸­tÇ4Q&`Ûkó ¯Š„~î9;Wú÷ZÿÓ îJ{¬¾^|úzxÿI”E­ÍñëOuçÎ4Û_k¦èã»f‰Pºã×( ùéǯ¿ª“‘ºïb{§€wD‰îHÿŽ0°5øNñï<Ã;Šð¥°oîþRG ïˆèN 鼃ßcª Gäj{ðòµž*ÉQnìÝa,רcôa:ÿ¸îàK‘ƒ "K»ò¼ƒ¿‡€Lg'sÓ™ÇÜ|ÌÍ+™›¢ˆÿžâ ~¼ƒ[Ûû|…~ÌçÇ|¾’ù9ŒD,|[œÏyf­,³6ÿ¬Å<à鹿fNÄ–j›9œçëŒÜÆâÈóuN¼}­“¥§²ØÏ\}xÎv!³ _m(‡³[zM‘wyµFr[Oãцã°Î2®©¤¨zþ²É>D²,Z’¶¨(NÆ gµ7MËS©ÚÀ«©Hœ»ß‘-wrUqæöë;ú|GtišxSÛ­ Üñ\#–mkBô/½ŽDtÄÓô3ð£°ùRFã} ê Õ½´âN€d±*ÐRÆ3²SPn D# ƒéµJŸ”tB®ì#æ¡5Ü7Œ|G‰ÕLÁÃ#àú^-@MƒŒ2¢‹å¡ò¥ÝBf„°0Àö#œ¡„Z†¢çH † Åà§@˲äÊ«Rf¢¼HÚ}½uDbC„P¼5K‡‚§õqŠ8¶E€ÅëÍ?Š1NQþXU` vFеhÏ©tè ( d(|þ ‚ôÝÌy³½ Øõv)ÅàYâ__`¥Þ‚lbñPtа³ D°}tÖûI?JgyYŒÅ˜÷é˜KxéÅ¡ÑÍS4-‹¿r c‚žX‰'õ '5¯}05 úœdkЭù”z¯rÅ·Ù®ÎÃ&Šs¥zB*“/K*8É(K$˜uñ‡ #ßäžÄNÈ$ŽÙUµÞ•ºèaŠr÷Rp[ Ì,¯ «Ó«š“Ì~™ü¥÷8êéÒŒ7¾äLßJnfcL2nºÎÉÛY·ÖèÕ–Vb? Ëâ*b0¼$¬é)Ò™²éçõžâä | vg®÷£t8dYîØ„«ù2K¶›$M‰ƒŽä§ÞfjQì1lîŽí¸ §Ðï8õŽÄt*ôNÇS¡N­¡wÑšíÅiQ©•w0N3}ëtá\ß$|§Š¿SÀñ ¼ƒù†ûV jhÂñ‚îè´È6'už%—£ð„zЕ+˜£ƒ1ªúŸ¤Ç(>tÑ3Ê[œu@ÖþÄü[ë`$O¾¥´AkØ\óô$‰³^#Ñ„]Y3ƒ‰•8fªØÏ|ŠW xÛy{Ÿ-a)Éì$l¨$ßȶ¤`…ff›˜¾k–Pj5U4´óe!f€²+ˆZ[¿ö¿ âfцI¢3²ä7•Cö¹ÄY|8³ g2Rjàl4 [ÃYµðN€ÎSFÎYÔ……ß°t'OO‡ŒhóSsæä5seÿ˜³¸0‹Ó ÔºÃïà,R8kÎVż†ãƒG€òK÷.´r¥À‚#C¿n¾ zR¢kÔð~3’²`É”}å9…e.žÓXvÀ™…¸¸æ¡‚C Rg&¹&1w°ÔÏPÙla®ÛB,ž´R&lŸo°_É‘t7> S„QSœl?¥ÙÊ1¡¯–RL¿:ó.}À[úŸ!Ò•^e¹ qÐìé®ÅÉ›G·ˆR~µ©&_}kéq¼Ü+y‡a‡¼-”T”ˆp*Â"#àx¦’â¼™R׌R7¡,1ž¥ìâàMkÒ&–?,ñÝ‹S²÷é R–T ;!z¬™¢üpÀcEvs"ÂA)„¡äN]yi‰ïžÂ#Õ;a Åg—ÈÅȳO˽ÃSØ%fú&´hz&dWEåU‰á¨¨\®6l½R‚ÈHùà¸êÏR&F¯¨\Žc¹ã@¬Ô‰êžbgh(\så X3¬†¶Ï Ä¼çÊxåäõöG÷·ˆ³'åfàâþqt?î%# åè\¤þ3ì5Œ“äeÀÌàΊȶéU q¬Ž…[ Sd.hÈ)ÍœNp☿ä#œäÍkƲᭀ SÁ™œÇ×µg±¾ãÝÏ¢ºã-&‡G}ÊŠk•Sö'Ô¯&*"pHÕwy= ¼‰Ì¼û”*[뽤bà„êFOaÊf‹üÇ]èâÚåØ~«š¤Ýu]$ä«S8ŠG…SÎ=":ñû«ª”rÂÊ&l SéÞ`*¤üj;Uu¥1- E¿opiι©^2Ì”n¢8­Æ³=.À•7©NÈ'IP’>(áÌ› ÒÑ{ø4œÞ‚¹ƒåãMÂ8ÀïÈx¾"YS–ðüéæ\ž™n‡t³ý«Ä¨¨`fOŠ:ÅèƒHÂáüyÆÚkÌæãu—0ò ¼”¿ åXþïå¸×”£ƒ)I™1Íì³<3*1Y½í6%²’Ãâmó4¶»“Ò;!K-ê%‰dcc$4ÅÂÕ„È\¶™Î)¹Ê!™ûn$W—ðXoÞR x}…ûv?’YrñڶćÅïX è`TaË•") ¯÷ìÁ ÐYZsä‘Þ®/Ÿ°ë8x²fa©gÛâ×m_\§È‡RS ¥Å(Úà~ì’NJ걞ٻ%±óõŒ)†bzYs³ÞLJ¬¹sYƒÑ›UÖ å0IÛ·OÛnؗڼ̟j¨‡C@ g,1ßJÈnÌuhÝnJ0Üp b¦c6;k‹5Ž™%;œR°žN-~¨~¾(9#Ü35/ÖýØï…5¶e°¤D•áõ3ÅÖÌ·ŸmdᮚW¸Àt ôôæ«ÏÀ>о㌔¶ï)öýQ¢û¾ø;B,A*âhßÀ&“W|±6éÖ(J@߯ríˆ`ôíY.¤‚Ü ÈÁ½Ë£3ãfgF`yÇ3û¦$ôr–0ªfû¢òFÉá '†tÞ6ã!æqe`)§»í¸bq.'TÙ—Ó4Ó:AÛ]*_ 4#`†ý–ž—Ès]`欯Mª C©-ÏŠfæ3)NPÖ³™òdåN _•’ÆÏZŽ$WÁµfë¥'¹}Á5\º –úê‚­DÙ'_¿¶F8â;P 5ƒEÀ¥¾0l¦H5Äbuî<ÃQ‡R/Œ¥žRŒN¢Ÿ23×û ÓzNðãš"ð®4ÞÏ?òæ†G@1ãªó/›à÷Χ T±æ8‡œ¤º±r¢Ôuc)ϼýqDŒ˜õV, Ä”ÞSN%KQÈ0e…¯öÄ® Íà.áˆJ!DÒêu½Æ£Äad;Ú’ …ò•¡”²d®°¿c?ó<"ÔУHC gRxÊIŒÛ;Ý!”2µ¬x øïL7 Å[ŽdÙð!Q´¥ÏÖië*o‹¡†WR„;IÅq„PâbÚÎÌÇ—(öñýDÝßq‹D°U½¾ø\ž ž¯RõY; nÌu®òGST1ݰìýͯé¶ ÷ýZXÍ`¬.©À‰?,þ3¯5^àZ§”³Ø0—;’…‡KgÇð/Ób"W~Kzû¼¬ôDYíy!{™l€?ø•SÂç”qÇæs<5 ÿ:ü[œ+ŽÆ4?¬ÝU}4útûúáîÊ·ƒ)OBTÒ91<¥F­¨KõóÝ¿EóÚqúváÑ8¿3éI}ËZqc?ž~H„×Ù3æVý™‹–àœÎÉ9À¹r †úЏæ)5jE]ÒçŠ9ÀÙjJ£¾âÎë[qcçì­žr¬ž™W7:œ.Ä àt¡&`h®Lw~JZQ—4ÀUÕà*7\}Å\ó”µâÆ4ÒNæVÇ%Ç´¨Æ°’Ŭ¤œÂª¾âÁªyJZQ—4zXiáf`¥…Ò¨¯Lau~ÊZqc`%õ­ÂŠMZ)7†•ªæ`UŠé×W{ã™àÆú>ûóSjÔŠº¤1ÀÊÎùì™.%š+¬Ì${é³¥‘VöV}öI"Ù@Zýü¦šóóÏl7•ïç??¥F­¨KHÝœŸß¸éò£¹âÔõ~þ¡7¦‘¤Õ­úù)ñJ[¿…`;Ô;Ý>Xà`ÜœÜŃÔË1yçæ¾ ;!lÓw äÎ5®â¿'…\¾ÒÁ¹Ó¸Ägît…Wæz [“ð{9š>‚ÔÚrÌ™ÔXR`! /q4¸Ÿ‘HˆÛ#IYÞZµ;N{Ž8|Ä. ª´ ò¤"И9(þd¡&fŠ˜¼C™OqÄ8„¥G”‰æMÈØ<—rQê¤Ìibª‘"&5®ÌiŽyãu¯,=çžÌL)-ÙªCdª8³çÒÛ§#dH„ZÁÒ×>$Tü"i‘;ɳH[~¶²n¢Á®;ŠkÉ⚨¸†(®°ºT6mb¶žªtʔ€¦$^y6¡R„Ï«ùHFcÿCݰ­y¦³¥¥ÝMþoÎSgœìwJq¥êÀ‰hø´B\Wž‡=èPž‡#åp†Çãžåsxâ¾ôqçq'|çCü;s¶ñ Æ5ö gÀâ3 XIÿ~$E€o7´Y¡YŒYæ/á\ÊYã·†1æ“Îà÷NùÅçºÃ/%³A8¤„RUc„@TáÖv ?X5‹‚ïµÅÂ&Œ6Æ5–x´)ˆÇ²* × çâQd"¥µâ"ê2¹–p}B­‚ü½Ì!|[‚4ªr˜ íwÍ©©GÚÚÝÌ•z¯Ò!ÄR›'Ü!¢˜÷fg$¤å#Éÿ”ÖÌ\¾œwÿ0‚³”}0V&)+íæ Ï ÇUàðçÝùK RN_¶*Òò ¶«ŠzÁòožåŠÁ‡QâÅÖ+¿,þ.B`)‘WßdÚl ôš·”ãí(*‰pêi´YÔØ£Ðe¤Öªº:ô¯Z+p¦(a!@Yâñ«ÝõÚa«ó XÔËCK¾Q«°DR„hÊ ПîF®¤•={qø–|ºZ쌟A!(§§×—rúñ{vlæN ,ÿ~R62kölfäZèú&¯Nç8=%0êXüB1£Åyl7‚ÞS#F4N¼&$å‰kNºIéaµåTùz’'SöÓ5¬&«©GíÇ\æª9{#ò,ÐáìǘÕe[‚päÏU§-?öS©Â¤éczº:Þ³³€eIG1=R¢I9Õû½ñòZûÛŸ1M‹¾Ü'ȼ€*¢cÏ^”\{—~ÁaÎ\ž,Zÿ9~¯ÅkPú~^z`…xvsÒYÕB¸MzêQÙ½NÔ–·v†ƒ­[SžäÙSqy§ÝÔ2þÎæ–'ãÕÚp¾<#:j “s}ûÔ})ÊÐÅG9tØô5þvR{e0äg>CàÖà;ÝdQŸn_aK\ó{1\—wx810l0TÏïöº/H°Ž‹¢ÓÙ"QüîdÍ <ñÔ Ð½îöË5âæñ,ÃP#€=Àü(OaêLçùeÜ:ý¶P§Nr®›]­Ä9pŒtÈ’þ8~>ü~ìeœ endstream endobj 5742 0 obj 5153 endobj 5746 0 obj [328 /XYZ 31.5000000 633.500000 0] endobj 5747 0 obj [328 /XYZ 32.2500000 632.750000 0] endobj 5745 0 obj << /Type /Page /Parent 2 0 R /Contents 5748 0 R /Resources 5750 0 R /Annots 5751 0 R /MediaBox [0 0 595 842] >> endobj 5750 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F1409 1409 0 R >> /XObject << >> >> endobj 5751 0 obj [ ] endobj 5748 0 obj << /Length 5749 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯Ð9À¶Å‡D xì™90l ‡ ‡À›M°È.2ÙCþ~ÔÝ’zFÒG‰ÕU”Ô-ì7GT±ªX/V?üñëß³þ–}øôõ?Ù÷æû§¯‡üèŠüò';}ýðöíÍÏ™óEöý—ÃközørøRÿûz¸<ðõÓŸëŸþ—éìOõߟ³¿þ­þðÇæ—N¿ðËÁ)Wÿ÷ù{åTýSÞ}?}þ¯Ã_~—ýzš±}]Ìûÿÿ`”·ÞŸÀ˜xõë¡]¦:ýöý×Ç âÞRš²re¦¬±™ª¬ÎþûÃOõ Úéóce•r¥uù-/rº~“ËË"SºÊ³Â Þsþâ™] L®´’›ü 97R”)UprNÊjë)ÛÍ.|“[¹ÉÏKQN~ôeóþL|µ?½×ªcVùLVZœ'9¦*(ÓÍ.Aö¢ä© r™‘Òòœœ“²¥*)ÛÍ.|§Ùæ ¹eá䜔u¥iÐcŒö»é&÷• ýp†œ+-mñìGoªUEaO„>¹ð^×?;Óü¹m]•u ÒŠ¡6¸m×éù'÷y%hVœ!gÇJKp<;ãnöʷدÿòãÿ:½ÀäÆÉi äìXiˆ˜“¸V{9%|]ý…Ör“Ÿ!RÂxrNÊ®¤l7»ò˲d›äR”…“ k`ïÚÈ„µ`ÜÃ{%ÈJgÈ¥¨ÝŸüKÌ$’Ë' ê÷xðéÛáÃK½uÊìÛO5`ç^¾}ûå`ëÿœâ|•ʾý˜ý¾†Gý!ûöóAåÇÒÕʦ8ÿÞe¤ºŒǼ2§0éuäãyÄ­¹„O¯#O—gt;tùŸ)Î#æXØÒ¿;ø£¯òR¿ñ—‘ëM¯4šDyôb<2|1e]؈鵇+Î!Ú0BÍl„ÖU^Ì‚P<=^B€y)ðŒü‡gëSC¿ô>p5^z}QªEúMì­«xH³V:`ÄŠ™iŽF{¥‹_ ™7FŒØtzþV«SMXÔÆÖ{U@*ÜSÊÂ(…Úü3>|Ð2p¹.ß !¬`ª£+‹Q²ô >ó|A»=jõZ£g&wFÑÒp ˆÇÖSÀ÷”Ý_àJ+ø„©Q„•B*hLµµÒNç®Ïa¥ÙpË}›ç©/Å&LÀªš/$‡` ˆ:xßbœ[§Ù–wE05JÚðj¨iðz±âoco‚ÊŸ4®%»²ãšì9 -’€)„9€ÕâNfï.nv2KDxÛ¶?‡eÒPV`D¨B‚ÏXñâÔ7Ÿ'ÌËòE@1`S,QˆÈBÙ0ÔÀ$ÔbUÕ×b¡ˆ™³˜âÝM°½¡%Šžo›bI– ýónQŸáÈQhøL!hŒó±‹FìG4bŠøõF xDažáȧ¥!Ðp¤Áµ|&œ*LûÊËöËÛ‚I&³ ñã{,3YâmËÑ"2ƒV›=+É‚’2`ABx/&J É”*™@ädñ¦Ë¬ J¹žÅSH’ù¬ë2Õò’Ä7oN¦¸:;µàè©3¹HL‘¯§ÆzAÝÌi³›êA8ÙâM@áÌg£FDŠ#µ÷46Y¾óRí (ý(gÈËG˜EkHt2…H2þcêÏ{Šm-†‹|tUçÓ‹P‡µ× ó{X‹ðî¡Ô²´6Z̃¦Ø}¤TwŠ$ÁÖ Å£e­\X‘74…Y“ ªxÍVRv/IRÂn:ÜX¯ëƒ²T óîáTZ’·ûFL¯;Šð ÔÜFØè”Š B]K _ûlGÈòˆÙ÷¸x¼lPœs(îdÆR"Ûˆ˜e©DY>V§0Ð@)Á9þÛÜÑ4Ì3+æëµU›ˆ‹§š§©ŠÒ 1'$BE8É=ëo¿D²V?! h–FÑX°Qªð)VÓÇÙtâ-Ÿ äÆSê„)u3x6ÜÝnyeJÚ$ñi'b-1’Í«TyÅe c0ýËÂg(\kpg`6/ͳªr}¦]KdJ8GÑì Ž«Ä¦&[u!ÎòÆ=Êó¶Þ°üÀê£tÜXqHöÞâÇS¡g?2Òð”²Ç'ªÑH“~92ÒÈ'w¬ülØi7² ›z†°a.-ÃÑÁE@ØcÌG%ljŒX@†×£áˆÁ+ÅØI5.ìZ3Ôp´‡ñ¢”YâõPJåšë¨ÓH­'á¹7šÖÃ*ð3×xײE$fð‹íÊžS]°\TÝ™6«Å@º‚¾‡ÔƒC"u®!ii«Ä¢œ²Ñ ¥’}qÕ´Q¯‡µ&<¥¢+K? Oóu1Pgø=øàŠ•/±j"qEBÕtªtJ¬šœm­'R¦ä¦.¬ˆHcí]‘*³ü­ Ì1ÚåKXª"øB¿êK Ÿì5,Â5%M’ÐU¼t9Ô}¸Î6`3àŽQ8ÙÛ¿Ø*ÄŽ»øñvat»”°Ã/¥Ÿ[ªp™Lî&Gôt‰Žý&d$>¤Ü¹²ç* ;eD§ò\Áþ>Á äõl 3ö ¡^3•o©±ÍK ©UëöPªªš¦0®SMd³âheÊ5é¨åk[xt·7‰mì)îòŽ(ïùë–5*µryçókë¡;“w˜ö–w®=YÑâ-—/þ¿W¦[(¡å+)—ƒ£á*¥ë8åö æI¨¢OÙÄ.Ñ‹¾}om{k¾±o}>‘‚iÖ^Pë »là^^IMçL_ n Ò›´"ÒY;ç–EÎ"»÷’mR}?ëík»ý°Å˾¸XËÁ¿äÝ Êî–Õ=‚}Õç¶¡ÄÚþ”„ †…¥Ã,¡&!ðJ( Ôƒ1JW,¼ôD%V^•]X f Pô»ð™s@S LlÙP(¸÷ˆµ ‹dÀì,QïYêîú$¶Ž¾ÜC÷f?ßO¬È˜¢/«^J Û ti1 УVÍ'%l‹²I¸¸Î›Æµ”zÂù¢f«*Àt¨Ù|v¯×Nî)YÛKÉòZçÓÛt/²Ûn‘צš¦ð^d·ÙÉpŸsÓÜ—Ö ˆâ¤—¬ÅLZÁ;}ŸÞf[CeMÊ”#=§\ßé«.#£”Gns§?Pç¾UHclûÖ½Ø~oSæØ5C½IÛa)ä¦k¸±õïšN@Ó-^ïmÞÖñgS’!ð{(÷ž²D“™¯ÃñX¼@œò°T¢ )”Ã$ÖJJ“Oé+”¶™Âu_MÝÓçóû\4'¯IŒ[v7,~c“‡©qp+à{3iÖݦÞ[?ƒ+X1Â| tr}Xé˜Òa±]ª–ó¾(º8‰pל¾=GJL’#\åhTó”8ì §4’UŽ®ê­í‹„Ùeçþígí!¥¿Ÿµ‹pßµ†tj$ ¤¶;+Üðትä:ã}.WïYâš^Rb‘kÕ‘nÏ~œðÔüΕ̥Àq1\û†Ë¼oFèêÅÅšS¬&ß\´ãDÙ×3{&û¸Mé:wo.š'k¶·Më9ЪtGçÌ4…7Ùlºª½¬‡Ç“µáó¶K¸OtgiÀFÅ:•ãºÑaJŽc…G~းüá>oÝ©È-£¤û݃  V,¡ƒcʺìŸ!¸F–Ò~„%{f}7®nàfaÉRè¦ÿÓUÝK"?‘xƒ¢·K (cÊJSQŽÒ *Q:à·Ù|ŸÊU!F°™I±gµFiúÈIæ_Ô{öN•á65Ï ø²ü„9Ç7¼ýÁWxZ³m‡”rˆG¦”p‚¸×µóRDXýÎ:Ó¨¿²×ôàʾLýÂŒ¥ûÑ–nµÊÌÕÉÊt—ß§ .ö«á’‹i£úœjðväb#–Ñ&!V{ìHPp—}Fï1Sòk ¶—f¥È$ÄCÛ¶Ø)‡ lXgz`·bd ÏŸi„„ŠZú›ô.*Ã~λ“H q‡É‰Y@c<`ÀŒ )¡ ÑŒy!@ [€®6Ê6€§¬'vð{0Þž‘ÈÁÏv1^¶ÆL¸i߹ܙ=oªg¸5õ[í5¥¹²/‡ÿ×­Sä endstream endobj 5749 0 obj 4356 endobj 5753 0 obj [329 /XYZ 32.2500000 344 0] endobj 5754 0 obj [329 /XYZ 31.5000000 344.750000 0] endobj 5752 0 obj << /Type /Page /Parent 2 0 R /Contents 5755 0 R /Resources 5757 0 R /Annots 5758 0 R /MediaBox [0 0 595 842] >> endobj 5757 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 5758 0 obj [ ] endobj 5755 0 obj << /Length 5756 0 R /Filter /FlateDecode >> stream xœí]Mo丽÷¯Ð9Àôˆ_¢f=3r099³Ù‹ì"Îò÷£î¦Ú¶Z’ž‹”Ô£1²vL7?ªŠÅªWÅâû?~ý{ñÏߊ÷_ÿS| ߾ʣwåå_qúz÷òº>†Ÿ _»âÛ/‡§âéðåð¥ýïÓáò¯nú_¡‹?µÿû¹øëßÚ_þþèô¿¼òí÷Ÿ¿7^µ?•×ï§ßÿëð—ß¿žzì† “yýÿßÕXל¦12ôÓ¡[¦:ýöí×Ãû æR™ºQu¡¬±Eûk]ü÷‡ŸÚºîËcc•ò•õå[òú:’nZZW7㜿dzW):oLÂÎO3—&Š2•Šv.ÈÙ¦´U 1òzÑ}‚ΕO'7—™‹S%ð6Òû±¶F¯=1úÄdW׺ýÙ›ðïmëÒ¦¼ÍùT»öž‚%ºN(Lç™K¥c7ì\r+S'äìµ÷Ä7MØùiæ©8 ;—ä¬M«¤mJ%íR*i›TIãÞS+é*©’®R*é*¥’®R*iعäVö¦ äQ6ž»OÐyítºÎÏ3§JÇ[Ü{ê­Üšz)u÷s÷âÛ²4 ÷òyæÉt7îýXWáü™»>ÑLé–f¶uÝRzä¶ÔeØ‹ÞɋՋîSˆUãÊìyæâT¹ˆÕ@ï_æô‚§rù @ž"üáñðþ³jiZ¨ªxü©ÜyÌË·Ç–(®xwœ*,~ßNÉý¡xüùÐ+íº)^Z´G-Ê¢–²†Ÿ©` þ 3ƒóg€giù[>ÌŸ½EVú@¬TCnÿ@Œƒ9g?™ä©ÁR…i€×ƒi ç¦p ì ÏZCÙÁœcä:×Ƴ¦$ï¹Ïçð¬ñÆsÃ\hæS§T’œÃ;KùáY=Š×ƒgá)>1°ôâÀÞ©ùé±=ð“ŸÕ~\’˜¸‚Sjâžâ†e¸Ó#s#N°ˆ,'‹Æ²#«ñsI<B¥ö†'ë'/£´8ÀtÜ™Äl8°5pœéìÁSR—cF™Nd&ÈEP<½Õ³3áfö÷1{"ò76NZ³Îh×S ž>ê= õž-éÞêJS›Þª#LÅê JVF¬°"2Xžá®ÁIWGÔ@ÊãÌ«‹,sžAæEŽéñ¡á?UqxJöS6߯)}ÓÉF8 ¯ÄøÉޱ‘1ÈøØ#Â4€>Ùèzòp¸©Ç9LøŸ6™pK œdr8âi`yÁ2†% û-ØÛ‚ü ÔÉ"}Jùqéc(Bì:Ìá5{Í«±Ýf­ÇQ‹åi½M„"Â×Ã.&èSk«±–<3u.³,îHx¹#ᬵºI$üÞ´ï ða­zLTîX6æ•»I¡UÅL Çé™Ôa´”X†¾èU+¯^Cã˜\U‚(…ʦ€$ïø¦â熬Œ@=a¤[„-xfc ŒO 9Ü"+í«t f žÒM`ìc>3XWfÜÌ‚néòÉgŒùƒ×sofI„„9·˜uè3xn»«–ÍUÃ0­ƒ0Ud¥x3É›Xâ±I¤8G¤J¦Û œ£ê×CÙÐØèÀž¬ÕËo,XÅl‘µmS§EÀÉb¯a7(£r·fƒ5f0•ÚÅÐ<ΑŠ\p¥3ªîÅíÔ"™/ÎèÞá¸g¾,œùb|wCÑ`CtØcîfuÄeÆ1 "[€q:"ÜÂÜÆacèŽLìáVØäÇàã´ãYãèï6ãC˜¢xŸf‚–§s›ÉÔŠèƒmFϬîÒîîvã2c#¬oP1±«[;ûÐØÚ$Ɉë‡]YL%lÄÞÕE…YîA„•LÐ ³…Ûa?³?§5j÷<ìiöÖfó°íž‡=ÉöÙó°SHŸÛó°ßh_ïyØ»§·êlÓÓ[{–ºÛL–º»f©ïÈel=;rYîÈå*4öšÏ³{;gV€(V×||ƒ¡ Þ ’Å·™Ÿz©Þ”튷¶l*ÞŒ{¦§x¦çnÔ¬À¨‰ì9l,¯üý5Å#ˆÑR&Tïm" “ð„SÉpo¢'ÈÍ2"Ï‹HĦ" %Â=3i‘˜ŽúáˆäM÷Ó«xáâCÂi˜ D¤5Ò‘úHB rYL²)§‘ ŸlšåŒ¼ÁÄI¢Ó; ÇÏQŸ¾„–ó½S†RŒJÇÂψÄììÌ¡dÑ|È¥cQ´XîÅÒz€•kú» ;m؃/\àÏ0ãh32ØaInöz[õí^BDnò‚"jIS&òª´gu/œGã½î$jÏ£¹Ë<ߨqïy4{Mé«õ5OoùØ+¶!po°qÙâg¼[sÔ_Æ^󬱄ܧ¼N°¸®mÇDQ°øãtéR#&S£cË&WRáÀ×%M1‘KÙø¤ÆTÄÆ;N©ÉIEï6-qTŒ5“ñ¢EŸÄ´°ö Ó›ÃÆ»h@VYn츌 f²æv¨Êc>âYGjødã–=!=Ý|´Ô¨uÌäi‡¬ê×CÅQºþF ˜ÕXö6éßž©UoiLÌbµ(ù©†ÿëåÝ©PBti'‹|e‚ÖTõ ÙŠ93‚®D ‘÷ÅnV²ÉÆÆ1Kg¯8å‹\¾îËüôçþ"!&àMdDÉ–§f®MS‘!¼0­ñ­y&´·ûMNÇR‘Š'Xó*šEo¨‹d^PÙ2XÊD÷S€Êß- œÏ'*fÖ!Á«0]Ú’çóàùM¨p§ö¤x¬² †Z.‹®ŽÁ~~!FüLƒ>Üöö»þFÃ^` \G²”=OÆ›º÷™ $³ ~ÑPo%j‰¬]ÁÞ ð8ÁVj©Ð ðJñ8Á¾OÍ·bZ]S RølCZ(0dµ‡ïzDâAXt×”Àô‹zMŸŒ´ˆaOª:†¤ðmHþ"DJR¹u©ÄF|´0‹D©ÏOÙÊ\2 ¢k‘'z™7&{1G6 ÿ†û¹rïEŸ_ΑÂÝߺ2‰¹¸öïGhòa©a®0F4ñ¶ðU”é©”3î$D ýåŸ=‚F‹¬ÃGñ‰€<²A+ÓëÿGÈ5ã|c@«LŽìÝ´è½H™Â˜cRðXktÕ·Há=)ƒü™ÎÚ6}w·P@ ¦!æ¡g˜¼|aaµÿVpÑñ{ÑI²wå„1Œ>ekƒ¢¹ì[?c|Ê€?ÕÑtŽÃ@lr¦ŠrH(žärçµ€rJYÝcÕFc÷3¬ #8[б.æ].Ñ4 Æ—%däЩýŽ=z,ÍLåŲ $®Q'®Oǘì(ä¶ 7p{Àâ‚õ3”è íƒw>q?ÏåJ“°º9 ÷÷¸3k ïØÖ›s¯¹5ëª@äJ‚hå`œ¹^€g@”}Ãy¨‘$w¦(."GÔþ­¸< DK ³qKäê#U˜§Ä]\…9'ÊSF®e/¸}q÷ Ò›QŠ,¯!-!—øz¥!߯Ra ‰[ E™÷&‚îÌ#Iß©X#ˆ^³ŠT5 *‰^ÌB_£ÔèKñ$Ó56Ü[ÎKdƤ¡b¤W Y\«Qõá™óžÎÉ{Û¼eŸàk»¢Üм[€Ïîœêùf]. %jã›uóQô¤¡liBãFÖ#:·åm£ˆýM¼6ñœ˜×FD½:¦<ºÆR•­JZ«Qj?NyÑ–ÝÓˆÖ‚Z¼ºVYZ)!;9½-[V™w†°WGX„Âd:×lå[<·LûÌb>£ýoµ[Íž¡$VtgdÓ±99lmfn±‹¨Vw}üi›ž¶º"º˜°+˜˜å[ˆÆ72{Qy$¶~ ZÌ´8(—»ÍÏÙük·‘]™1—E#º)o(‹:mëu:7‡sZμÉ^ÞˆÔJ#$;Rb{™Ì e–Ú¤vÉ!2…¨õdBZ³Ñú­.ç²GhrÅ™¹­x7mØêò¹1{Š÷LDoñsf™®É=ç´ *“)¶ ˜wq”PãÀ L^~^š‰à2™ÎÄ îÔ²I/ULLœÙ%X—‹æM3²A ‹¡5“×É["$>ò¨¬¦MÙ§ØÒ»U=áœr¹1ÿ5G2#;¸Cåó‹žS+È´ žèX‡RùܱaϘ@E"þ"#IXcC½,ûØ#cî&ÜÂP”¡›!²Z"ÞÇfÜgÍ&â+ß : “‰äá7LW‘ÍãÕz$)ÒÂÜËYËC_;Æ”mß8…0y„û-q ϪylîøJNdÔ×¹q_ad¢;2*ÃÛQÎå¡èŽrî(çè™S—¹3ó#µˆ;~²÷õvÄ’D,™;²›D»©ÊpkGzk;V¿#½;Ò;ÒÛ"½µÍk̵7WŒ™Fv±…O†¨JûU<µb•Â/c0¡hg=ø>¯2ÇRªÁ×Ó Äï«_æíjY^ì]}Ôçºÿ·ç}uÛÐ=ðŠãeCER?¢qÂŽÆU‚‡æö9¬ô¦ ~ÀqXû<¥NV…¥ß>â¨a÷¶X´ …{ƒŸ šµô® +p§ŸËëÕ" i‡Ù‰E@»ù"`Ù¡ç'>ô}ÃyÌE…Kc§àȬ—gž5ŽÂ|ªázðJñ8ÕÛeÏ—æôÖ4!Ï ÁÇ´wñåð>Æ• endstream endobj 5756 0 obj 3654 endobj 5760 0 obj [330 /XYZ 32.2500000 183.500000 0] endobj 5761 0 obj [330 /XYZ 38.2500000 122 0] endobj 5762 0 obj [330 /XYZ 31.5000000 184.250000 0] endobj 5763 0 obj [330 /XYZ 38.2500000 122 0] endobj 5764 0 obj << /Type /Annot /Subtype /Link /Rect [358.500000 296 420.750000 302.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization >> endobj 5765 0 obj << /Type /Annot /Subtype /Link /Rect [174.750000 149.750000 202.500000 156.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps >> endobj 5759 0 obj << /Type /Page /Parent 2 0 R /Contents 5766 0 R /Resources 5768 0 R /Annots 5769 0 R /MediaBox [0 0 595 842] >> endobj 5768 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R /F1700 1700 0 R >> /XObject << >> >> endobj 5769 0 obj [ 5764 0 R 5765 0 R ] endobj 5766 0 obj << /Length 5767 0 R /Filter /FlateDecode >> stream xœí]IÜÆ¾÷¯ès·X 7À`mr H@A'0l#Šùûa7‹=3ÅþЬ¯ŠìZ°%O‰µ¼zõöåÍŸ>ÿãø¯ßoÞ}þÏñ«ûýÝçCqªË¢ÿçxþõÝóèæäþ|¬›òøõ×÷ã·Ã§Ã§î¿ßýŸßý¥ûÓÿŽúøçîߟû{÷ÃÝ_:ÿ…_µª»ß¹üÞÖªûSqýýüóþú‡ãoç‡åÜf^þÿwFÖçmL,ýí0S]~ýþõ·Ã›q«T¶hªâ¨¬±GÕZ}üï??u Ó§Ö*UW¶.–,TëóJºÐG¥ÛÖ¥-tù%3½J0y[Út“_v.e*ž]ðrUQT=€tUɃèiúðWº{«É&¿ì\*îr³K^®ië@çUåAt>Åäu™pòËÎÅ¡2\.ž]òr[º—Û±@y]§OÝMœîr/;‡Êp¹xvÁËÕZ Øßý+ÿ§éLnÒü~çâPq—˜ýÔTîøgríæ³¶ƒY‡\Ǥ¢œ® 'é2Z]§Oqóm' %›ü²sq¨ h5šýSÌ,x+ýO€ºñ-ðáÛ/‡7U'UuüòS·¹Ëšýo_: ”ÇïÎ:Fm_~<~_ÊþñøåçC{ªt9lq3#)>‘fb¶_ºKJßÖlŠ¢#…†# ޼ƒ#oá¼ûÀ®?ÀÙàˆ‚øRü—ª%`À@~c p3m¾—Ñ*cÍûŒ§3jùN“Þ:€-ú4ÕË笊SU«¦.Ÿ!_y1§ÒVçg#õe¤95mq9ÃÓH–OGnýÕ·íÉšÞ0èÓö9“¨·ó×ëiCy2ºQ/'ÁÓ7p÷ÊÔ ÍÙ›E³é~SÁ][øÍ²ø˜Ûdz1Ä;ˆ8†øJ1Œ×[²¼L.À—€qJ÷;Pj€Ûœ— {RüJðoc>R&þMÂ9±nàð:ønSÜSBNUµÏª0Å+âoÑqá¸WoÏfðÞ˜óÀ¡úT½©V?I?­¨÷j”?+O†Ã÷¯0æ`jŒé ¦ So™ØAàL›D˜$^ØŸ$ó *ëË[„¨® ÔA|JÜNÈnZ;b7FJæ=ް&“ÀYÕ˜Ö´) ›à2Ræ‘ mÊõ”i/ Ìà§ÄÈø¹`-J…õfo ]€¯cHŒØ&‹šXÂw`?HQùIž*L;Ð6èdÀ` {š†nhÌ ˜á± š“±<`¬|›ñNÊfr?”ËšÑ56þo"u½"̈Æ.7è\Á8Ÿó@¾­@1£3B)U.¹o|ØÍo50t éâî 9ú¶A»”É|À>ò“œž…±â˜eð`*Mð:L¥²D-)OöoNã;Å”‹À…w€_-–‰ó0·€Cg0Žn"¨ ctKÂm²òäZ¯°ªV3(!!ßaŒ „aÁ{°øu/ ðž½nË´8'ïÖzÐŽ LG¦FòìÔ6/_ÚŠa5Ê2pêªô¬l¢VÃWè‡ðcì}Øk0`岆Ž.Œ ùaj5‡Öüȯ€30ºà‡ÍËø|t¼ë.< ÆÙް¡›@üÀcaLú¢!I°+%gj51º@ˆ$d&¼jÂ;Á„ÑD¼6aŽçÓ>õ.Œ=¸)ÄŽ´r\U–>‚¾ 4”kµöà ”~øs€nÎw<Ž`ü~©%‚éÈ@!z’å¸gÂòI¤ŒöÑ>W,Þ#šà©ñ71î£#T±«x¶\ÚQ„æ;ÿa2‘IJY$+[ÐÒ]Ê’Œdå„UžŠÖ¼@k ¢ë‡3=‚á(ƒEO›ÉkÎfwU›âE«„ÐVÊzàf§ÆØ ðÞ˜<êZ‰®À7›Ig£‰Íb¾Ÿ+§C–ŠÖÁ ŽÈ»%Îf#d¬zóYcnbâ´#¤½G³—Rää¨T…ò¸äxGb£uÉ’-"4[Nïˆl=XR E¿MƒñËa*…µ âíÉrº@Zk®dOѤ&M7ð2ñ±õ-¶ÛLúW…)‚N¼- þëóp%£8eM¹&ø¸¬[BY„2êÿU¦ZNà)Bü¢ÔüÕYæöâˆéú–¹Gcø•œœÉ2Ĩ D×·“$®–¸0Àú¾¢ …ެñ˜ãƒD4Qn¶ –#Ü`I˜2R€e• ñ£¦¸2#>‹ºvðÓ£œKöQKóôlŸÞ«)¬!`‰Ô´yUÛú¼Š±œ ûi_ÍsWàfÝíú¡²<#z‰¸E…o™ÜYÈŽBîÕa>_ Bd°Í=•šyŒ ÖŒ¹Æ¥D( )áÆz7“XÉYëÜÅ=ÿ½þV¨ÊQ›†Ú5ü&°̸ÞF»µíä~^W=±Ž,€È^Olä›%•ÜrV)‹%•ÏözbÅ^O, ^ê%uîözb$&íõÄözbÁ[¸ßzb¥]R¡0+O®Ì «žãwmå˜jF¹ëhÇôýˆ:Ze–h­»Ž¶ò‹êg¥Ì‹ê‚ï:Z±ëhiðrQÕô]G#1i×ÑvíAu´zQwƒœ<¹¾Ö»—[uÂg[7×2½¸HÑ}·ëh*‰û íé3εGû™ ©ÜGOSpÜéü0æ­ŸNñ(±1)Š¤Ì‘PµÇð$G"†DYË ºæ¸çP=XÓÞ–m¶l^MY¶¨|xÜݳ ÏVùÇÛ¾5=áu7EãÁ#[vvsu°cm‚©y’¸Q;#OR…³˜»{tQ±G¥ÁËV/ÀË=ºˆÄ¤=ºh. ÞÂÝFéNi»ž¬ ³Êª× j&„zѼ6™"×<Þ='&HK·ï´Ý휽`eš­®ùéû ¾ÀíûÑ÷¸ÁŽЪD¦-ÖjÅ[‚ý¡Óý{Tzz¸Ê°Xó¹‡þ>íúÑ*µK‹´j Ôî~FÖo¾˜«õø#'¨î ­Ä˜MJÉZå1 æ™Sý‚ð©7ªž­;ùÎÆîœ êÇ0ÈU}_¢W,VÊ ­l2’(¢Ûg¦ÆçT[½ ÚýOf‘{Ýøäž!u1"A}n¢koa*+©#‚w™óî‰z<·~jŒg$»à˜>¿¿4 kžÿä—Ã瀼’Fйìá%êÛATwÄváÕ‰ÏÞ³NÚÚõÃ÷ÆEÇÅü9Í„åæ©8GƒèåÕ9ޏì¯LÙ“öPPkôÍ$´oéžP#S%\SÁü Ü›s›ÞºÕv‚²Ý‚(„5ÞAñíÀÚÔ ˜jJOR¶A&³ž3ðF‰ÈøªìÀ£*Só­^>q™,#뛿dí k§.¤ÌÓ(|Þ–MaÄJn|I VŽvO§kYÕ€ïÀëš᪾)Ç,&ÈäQR”L¢zAD;ÐŒ(ú,ˆß ÞEÅoâÙp\eÀ?£¡™¨‚Gk]í=<ˆ4Ûéìˆb%pñsA´)6zï2g×{.H^zgìÞ ä™D¶ç‚ì¹ ßï¹ ‹(Ju'ù™Ú4òÝ@&¢>­¹€5R׆™$Âë‹UelàÁ¡ˆ.´8Âè»K9áDž¨; lÌd g1A_‰£> #aàú%ìIT„)L EdÃ%±S@Ö•‘ÃÞkµö þ]ÚÝÖµà²RÝ×g=œ˜¡bØ 3ÚSî-¢þüú1Œ#IB´00jtWŘàb"qçß{=: ^ZÊ*¼õè4SK–¢à[Æu‰jŸ†Èùa”4aà¯Å!(¡\´.¤ó-LÙ¥/ë£2š¸¬žÀpã€IC0ÀÀó¸çWŸÚÆ!¾q–é(¸áûq>µ(<ÐŽœ41·Ïã侸[ÈYìU¹ª”f( ·ž]:"{µ63¢ÖÆñ‰# DÃs„< ‹)ÁàËZWŸŸdÛEDô.»«j²AåýŠ©Àhòøm= (ÏֽŪëÆçYÉ£ò’ç›Bes³å ú¤Šh@‰I­`*5`j•©ºCÀºÅ¤ùßÄ´*‘ÖΖÉå@HëGl\ÞÈ3b‡ëÀã¸) £7‰ªshT“š-´ÖzJÏŠZë³¢Gõ6f )ØLˆS¶F[˜3Dpc‰z€¹j-Q¢èè[vDðψ¨5Æ×¡Ø3JQ·…ª6&+†NÉHìmåÀ0úq€a½;©×uÁ°'qE´°vÍ8n¡`-Úuà#Ú‰úeÍ0&ÌK²QJ{ëíêÞÉVÙkÍÓíúyyC&ê‘ÚÁG¢‰o\Û‡[ß´pwÃc9á7ªEë8Bp㛡%L5ÜÕÓôõy¶ÇÑn͆awÝ“•êd.˜øoÑlxoÀ“Ù‘QëÀóà¸ÞA’ûÉ ]5C!Fiô(®’ÄæÑ¯Tð³¨Ñkýê®@Ñ€ìs •ÌÉ‘ŒþBÚc¬»ëç^v-ÚäzÓžíh:—Ô©<D–I›oGX?B˜8¥10F5‘,"¢úA’,s¹…ærawÞõöz„RÁk²ÍãçK /Â#ÕÉB‰7ø¤ù^[–à PG¦+ر‡a}KšìS‚ *û™Ö½C%Æ1Îo&;qÃm9…E¢Ç°a0“25%em>]ÎÙÿ°6CèF ~®k€kÃ.þ6D%ø@/¢z| N†®?už<7\—Ó7¼ý q½/‰ÎOLG2f ëmt>«Û%}Šp×F]³1°ÅŠ@çU¦û{aaÀׄa€ï‡‚^‡èb6¯OW÷ëø­Côà;ø4õf¨4ÍÍ$ÕNª)ÔÙ”p©6ÜŸHAÍ¥ßw}ƒé÷tUŸtïBñÔj<â¢4¬#{KFzÖ1S"ò­½}t'EÖ¬ê[ÿ`íàF™Z‡4Ø…¥´ÇPx6ø“ßTÔÑë'´eîüçnÇÃECØáëÄ( §ª&ÜBQBß+¾ •W<¸#ˆ% ß„š²&ÇF§§Ù9@ÁÓ7Þ$øÄ.äãÖ­c˜ÃÝ;-)Žô¤……,Š>¯À>üº0'Ç4æQ<¢žú&9ã§ã§ÃÿbQá_ endstream endobj 5767 0 obj 4565 endobj 5771 0 obj [331 /XYZ 38.2500000 367.250000 0] endobj 5772 0 obj [331 /XYZ 38.2500000 367.250000 0] endobj 5770 0 obj << /Type /Page /Parent 2 0 R /Contents 5773 0 R /Resources 5775 0 R /Annots 5776 0 R /MediaBox [0 0 595 842] >> endobj 5775 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 5776 0 obj [ ] endobj 5773 0 obj << /Length 5774 0 R /Filter /FlateDecode >> stream xœí]Kä¶¾÷¯ès€ízÝÝ9ì99k;™ø¿õHꙡú£Ä¯‹[ÝØÓ¶(²ªXU¬çû?}ýÇþŸ¿ïßúúŸý÷á÷§¯»âP—EÿÏþøóîõts>ïë¦Üÿu÷´Ú=î»ÿ>íú¾~úK÷é{½ÿs÷ï/û¿ý½ûã׎_øuW«ºûýïçßm­ºOÅé÷ñïÿÚýõûߎ3ޝóöÿß­l¡ŽË˜yõÓnܦzþùýûo»÷=ÂÞRYÝz¯¬±{ÕZ½ÿïO»Ÿ»ŒÓ‡Ö*UW¶..yQ­oª‹î%ºíÀ^“=ÿÈL¯"LÞ–&ÞäÏ+‡Š2•òÏ~h¬Q¦Ö¥="úˆä²it÷¹6Ã?íË€ÖF@ø«é#L®kòç•‹Ce@¸göØ7‰ˆð—é#L^šˆÔô¼òhdzÇFx¥ÚhÝLò`{™>ÂäuáÏ+‡Êˆp<{l„7Å Û2ÔN³Ç@IÓÖ'?®\(#ºá䑱Ý}V÷«é#LÞé´ñ&^y¬ã=ý1d¼”þ/àVñäyðã·Ýû/Ýüשöß~î÷üÎþ×·(åþÝñ*qýqÿÇ¢Pö‡ý·_ví¡Òå¸Ä¹‘ÂÀ‘Op¤…ïià3>ó¸6ûÎöŽThDãýÀg0 „žMÕæðNñ ðl²8ÅpØÃÏ@Jôì‡8 æK8~J 7L½ã®ZÃUë¾ৃÏß:ös™r|ëC·vr{ ˆÕÙ‘4+­Í,eRçVt6W#Nšù˜¾­ž— ˜Ã0Üs²õy6æ˜PBc„e*^–÷Év g˃c¶Ž:{‚Äx)ZŒ-úÅ4'ö=²Ëº*Ÿ×ó²õ<Ò¼@¸ÇqshÚâíW|Qý$ÊL§ímª§ü ~Oã,i8”öp´N¼%8ý@øå¸¢%Û`Þ3¤9”¶jê×#ºŸM©qhÁllÈÀb2Éä|Ö¸_-ц= °hÑš²áh ǫÆk8dÐ  ‹ C¡“3ç8Ùº+Á žL/AÌ2ÅŠAQëžm²$L9øhÌQND¡SjãH…¹ ^gM<y=Å’0ýâýÀU«‚>À <Ãà0 – ¤ E‡H(øUk€2 ˜°}±ª•6 PˆRÏl˜o2B…Ü0~eÍÃc¥0€¬1çÀüauÒ /föqñ1 µ(Ã"¯#ŠÍ¶m±É𠬩‚¢.¬àµQ| ÓÞéjçþ]U –þø™Ñd†‡Œ0š ¶#Èr+,DŽyFÄ."Ç=<–'¥› á­q92ªqŠÏ‡ˆÊ ×èÖ9Ómq“Ô.Ë:cÒ£¶"°ýˆº*¹*ePJ¥Æ¥ a ±¨›pñˆGDb}KÖðŒ5><‚÷ƒ©˜°Ðæ¬ZLí‡X ÍÄŒf¹¶ñ1–˜÷\q–Û•(Pg)×ʶtäZF—æÎ龘ñÆyh$ÀÕp7æ&çu/1aq $:>©üI‰‚Ì¡9óP‹ÅÈölƒ!kŒ Qc¸nÜŠÊF Èiø#›VŠÞ8ûúŠø%¶øVÝ[]ù½~L\+› ClSrU³Ùàà¨ãZ@n˜#ϪI L‚úd$.˜"¬žrùâ%1ª ¡:y$|Ó!Þ“BÁÓZY—H0ý/ç»ëm©œÈé­®I„šQ.]æé~2Ö¸çç6´Ó¸ÇJ…:˜ q^B|/›U.YÞ0× 6E Õ.fR9¹2ެÁ‚‰Õ‘H„>[‹NAÀEÑc‹c ¼päzì uѸ"ª€üøŽàLT±ÜH¸[;;°%$•DyP¦¨Æ¤¬A¼©òP´æ ‘PŒæª øøL}X~%Àn|Æ#z{CByn½=ÌU1Fˆ/,ÓÄ™l²ÁøD*Vλse“Íe‘u¸-?aŒA†B ¾ŽcÂp·a?§í½åW©±¸çr$šÊO¥ÎôñªžB5¸l\[¤ms,)4w1fÒÿ5“à~•ØÂÅ\ ï=Q‚TþL*Xs™'Âé¡+粑 7‘jLØÕDX7—ßýXhG4y0B°ò¡<•“ ÆÔåp0´˜ø,Q)ƒÕæ ‡”ÃêõÝ,LÅ6×äáÆ·Œ¸ö,6 —9qØg7ˆG®KʯH£' ‚³ 'ˆY$¦)]™Åx™CMðçõ A C'çºNé>ㆱž”Ä^ú+=]´S¶åá—. ZP=•¡?Ì7™tÐÕ#P¦P"®ÌUªåÆdÞj”À ¦Ušs“¬âFŒÔ‹ØiX­‹‹,#ÖUÙ8ëLUü’’à[·ðe`Y1-¬Z´Â—§0d#æ~,MeÜu®nÔØÀ*e-lAUúWËâHæÅY!WÔ.­/ã)€Ž—KÕu^ â J‚aþ%œ“'­íÀpýÊ:nˆy+æRL³(³È¹NúFÂÕ ‰¿N·ÛzrÇá10ȇ¸QÁYø±.k¸¶©—«±L‡I S¹"ãÖ"åá, ‹’­\qUé_)2:@ÜgÅ'âžp}âß#Û­‡ÄgÐÿXMØÇÒ˜ÖÎïA´¬lRJª¾ á iO 5†<ÙTÓÈ6‘Å*sýgü"Û=Q*Ù½[vb*7§X÷tݲ-ç;ÎÞ{P_ß:µxÁ}1OíŒà)ë§%åM;»Ò{Ÿs•§J¾NZŽÒO=ì=¢#Ôðˆ'mó k¬ŠÊÀë´<0œÂSô‚)|€ï DᛓâIäGYŒéË)Uµ­²/{Eäš[©RÅL$¸hõ{Ê_†mÐØHœ*Ô:ãð2áÌâm¤¦DÉŽ]b¸rYKþw±˜hCEßWð ê!‰Zš5ȧ®BÌ>ƒ[xÇ”xõ¢þ(¯$ÃÙ˜8&w+ ö¬¨«V6¼ˆ©ŒpÃYÂií[*ºÂ„ŠºuùàØI"Ê…¦r¯BëJͪ|ÓÖ®à”½â\eG⤷PM$ -æÞØÅ9¤J™‰E'Ëpr¥ÊÖ•?ɬ]íèºÁÎrT?.èü*[…ÊBš¬žàuÂÚ7¦€'ë¨ÆÌÆH‘£ +#$ºr4,±²÷òÊQ·«€ÌZ"¢&ó¹2ë}¾rôyu*ñ}>碘¨eOLˆ"`@Ä]h\œ°x¢˜˜LÙ¬U k&BV¶6Ñê@˜FF2V§õ©âtÖÏ\`²,ÑsíJ³Dã³q¹ñ<ⳫöôVŒÇ„ë©OMRÅO2• (i@DVf “qK本¿Ÿ»ŽqC:†çš±xÖc ^±–!ã&ö\#™nÌ„¥ÄSýxkæ­;ëeÚ‘^¥í8ç3›;GùUÛfü6¸& žmAMø†S«Ñ'Û4ÀSaа_ Ç[‰žDW&ØY¶+Bª†ËŒ »3‡aa0X©ÉÄVRÍÀDD-ÁµÒT¿ZQZ2„4 «Nåoˆ‰19 °—aëkõ‰”ø»S^È)ïQzñÖ™2ów¥w]F]Œ‘H7ÄÐá{˜µÆPÍ‘ßýìŸ:ÂðÒÍãÜÈžæQ™îˆ꘴ף™qèó{Žaô{­Ïœšž®ôA÷¥&w€j:2$=éC5)b­ [x@ï1sêã¹µ}vŠªYák¬u9Η©¦è¹ék8bÑ6ž >30@´õú…lY‚;~.^îWv˜æDÓ9Gª¯ ÖµÁ#A*Q{ Ú ,æ™! Î. ž¾q&Á;RÏaî~¸…†±ž¸°%Ñâ•Õ=øuaƒÐXÆðˆz•w6+÷»ÿ‚׋% endstream endobj 5774 0 obj 4122 endobj 5778 0 obj [332 /XYZ 38.2500000 718.250000 0] endobj 5779 0 obj [332 /XYZ 38.2500000 139.250000 0] endobj 5780 0 obj [332 /XYZ 38.2500000 487.250000 0] endobj 5781 0 obj [332 /XYZ 32.2500000 173 0] endobj 5782 0 obj [332 /XYZ 38.2500000 139.250000 0] endobj 5783 0 obj [332 /XYZ 38.2500000 718.250000 0] endobj 5784 0 obj [332 /XYZ 38.2500000 487.250000 0] endobj 5785 0 obj [332 /XYZ 31.5000000 174.500000 0] endobj 5786 0 obj << /Type /Annot /Subtype /Link /Rect [373.500000 695.750000 402.750000 702.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps >> endobj 5777 0 obj << /Type /Page /Parent 2 0 R /Contents 5787 0 R /Resources 5789 0 R /Annots 5790 0 R /MediaBox [0 0 595 842] >> endobj 5789 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1409 1409 0 R /F8 8 0 R >> /XObject << >> >> endobj 5790 0 obj [ 5786 0 R ] endobj 5787 0 obj << /Length 5788 0 R /Filter /FlateDecode >> stream xœí][oã¸~÷¯ðsñˆÝ€¢À$™èCÁèâÅl·ÅbwÑé>ôï×¶(Ç‘ôQâ—CJ²5Á&Y3¢ÈÃsç¹|üó×ìÿõûþãã×ÿ쿹Ÿ_w١̳æßþôõáú]Üïû²Ê÷ß~Ý}ßß}Ù}9~ÿ¾køúø×ãoÿÛëý_Žÿý¼ÿáïÇttúƒ_w¥*?9ÿ¬Kuü-»ü<}þïÝßþ°ÿí4cû:·˜·ÿÿÁhmJ}ZÆÈ«¿ïÚmªó×ïß~Û}lö–ÂÚÒÚ½²æø­¶zÿßî~:¾ >;ÔV©²°eöž¿6/ªj¯t}œIÙÞ‹Î_BÓG˜¼ÊT¼ÉÏ+‡Š2…òÏ.y¸Unbîëô&¯‹""æœVípñ삇[dª%­2ˆ®¦0¹ŠÈš•‹CÅ®gvÉÃÕ6‹H¹WÓG˜ÜDd ÍÊcQ®göCU¸ðwòÝÕéÅ6+ÿˆZQ¥}‘­ÄÔU ¼z_~ò²:)E±ðê¼ry°´ˆÕŸþKÈ4x-Í'@)ýîyðáe÷ñ¹Þ«bÿòÓqiç6?^Î0ùpRCózÿòãþÇõ¨?í_~Þ©ìP”ª:*ë§¿kFôy¤:TuVè<»±ç{°¦Ñî§ŒäçsÈmqzÍÕH‰Þ£ ¸‚GøøŒ®à3x¶§:ª]öeÄ<œGêƒqMÁïQîÌÁèJéI§€Ÿ1„>ÓÏ瑼lÒª-\;žgà ¬E«Æ³© a"ñÀφ÷C`¼‚gêÙ)¦¼¶f?Õ+ˆsâ†8>¿YÞû¸•²bXG¹}fXµm‘ûÙ‘×yÝYS#ú|Æ ¼¡gžàÈçð÷8‚ßìÍÀg<³=‘k8‚ÏÇX)L‘{•é€}€³3rS§‡¯B.°I·MºmÒ펤[Uäw'Ýt gSá«Æ³9v1§Ô©35ÊqݰÙt°Y?w>ðPöCçO)–°âTÂ18M8ƒò˜¼øø=„óœ!x=ûaÖ&ÆE«½ª‡hL Ù–ÆTC*;ä Éw¹ÿÐHé6 ‹|õ‚žñ¬ †ÏØ g¨Ítu õÀlZ£g2¼‚æ¨TÑžbÂÞ÷c>¡Ùð{TC0åÁ‚ž-G«vbd`6 7UÇN¨Ëú-pU~Ⱥ`Ǽ R¯GÀœÒÃwá ŒêŠÈ»ÀÃñ{ð6º²K'l(àmXCH F¦bY‡UîÙM/aM «ô3x×ÇH5Œ&%¢¨y@M,¶gÓ-/F;òl¾cŒ½ÃÆGЉnP?"+@˜±ó¬$®Ù›kÓ‘uÎr‰(^sÓ}'ã°òKWº1Ð÷Œ¬äö kêVkêÝ!bÀdIðYß–‡ {\Œ°þd¥Ûýɇwf|‘lujxŽ”ð†zÔ9B¥Rü)ßöŠ_¹®eê…O¨iBDM"µV“…ˆi`XÊžm¼@C¨z+Щ>èN8 :‡´ì=rý,»þä—Ý×äQ-ç5¼=‡%y+’&apÏŸ —‚q ÏZ˜ †(IyX¶Ä$Œý{#B>oõ8Œñm›¸Ü-˜ñ1«'$Ý­ª\ösÛ¯qsæ™j¯<5¼òÔyl£°¹ Ë³¼½<`L|©Gñ%ŒªÓõÞ{v4IðÏ Tˆ’`TÕ?UÐ-æø¢³ »ÿù%K‘¯UäÜ~ï7þ·+^›Ú/ïQ¼0ˆ:~W`pGvüZÛ¸kxŠH.Eãi¸&"RуpŒ›Î=z@WÍðaâZhâRÒ~áE³Åvõ, âš[8„!¦“""ýWE×4¡®ÿ7Ód Kšß4!pž‰B·…[uö:éémJÌ}f€§IV;µb<Ì »¶07&ö#{-F]&3ÿLÌ*ÞÏšÄgb}'_­Tã8O¨>›"ucŠÔŒ^ &®ÞÀE¼'ÄqÈè#Ìu̦ܚ>"ÖBasªôÙ¥œBÌhƼîHX횃 y`Þ‡ÅYº¼È\eE»;ì&„™nAnÂÑìõøJ“²º%Y&®20‘˜Y ß#âœßJ›ý&NøîìÖÓG7ã™ÔùSˆyù¨»¼õæ]Šs{1Ò(e9® À"6ž;A¨:x„±›ÌøªƒVfSR©©lä(/kòڬʛ²ò^ýƒ7äcê*ï0[á‹£4äµ­Få´‹ö’ÓX‚cÇÕK §«K5C&#ƒÑï¦â U Av?KVàÍ…ç=):DRšgÓó±Q‘’ÕÉtb€Q‚$ã3@“_ Þ¥b€« öf¶R•«Lˆ¾vÞ¨ï$’™Yk*æ””Ÿ×€Ëòó´áðñ9½ÕížÇ%%ëQï©+½°Û–I¿Zž«—Ò›§CI6›v¥™Ò›¸½Qq5.ë0ÅMmƒ©ˆ>wNå"ý‘k(-¹Â#‰“ž–¯ƒX±dÅ4ñ„ J!-‘ÎŽW¢âÕZtÂû b&©UuGž-H-_p( %Mo<ÕŽ€õh ¸ÍW¥j6}@dõu˜˜ˆ&YÁÍDb‹òZ 8Y/o¢z!–½hÔ#•šÈØMಲ—Ë >Ô"â2kÛYf2݉ŠaV”mÜ­w,®#\[ÓAÃû¾Ù4*ë’¥h)máâ×·¾@7s˜~ÌÖî{Åõ §Ir&ؼ'£˜‰ÂÕÕWSÞß7‰ÂS”\a+Lˆ-Sìkzˆ Õ×3•¾†$@ ›?«n݉Þí×1M®¼ìS§oy©_·ÚăêH•Êû OP¤#Qj·ýÒymu)¸€Cµpö 6]qVÂ:srÕ¦f¦ ñ]@þâü« ¦Ú¬/KœÍú‘¯1”õ˜½ºËÈúÁ˜D¢yP)„¢¿óvžç-|æï¼í°<¨ó¶É[Üí¥j8îݬ­8¥;‡ø¨1½5îμ'C#Žš†ö£Ð{pOîì!|©úkçy¿î@mJº%òú1-bç÷“,1ÊT¤Æ&s‘ã@Û* áñ¸AȸErŸ¨l{L‚D¿gN2¹—×´AÄ•0sëTv ž1$ÏŠ®4[`íœgX^4 Ãô#Žéì!w¦ ᜠL’é\„’¸«r'Ê,£Ü VüÑ=‘Ë0O½Ä­ñü…¦æí¯Õ Õ‘b¸msª[&Ê)@2}©©TLˆ8‹†)ä¡{Æ,+%Ec\e .Ù/ëÖd ru‰y+Q1äÅL #ñðý*ÆHÍ›é…ÜÏDÊQ½7¾—°P‚’v¥8x°³$"X”êÁE–µ-¯ÿ{dî¹yÈ­\A&î:$éÓK=MK¦ð‚ÑDXSéx̪=k“…N¥áãg ÝOáÊediÏDz•`æ4 UŽ)Tï{úd³vç¯u¢  o€=tâ.·u;Äh7‹öYΦ²ÙÔý+c"ƒ&©[¬¯êÊOÖ5‡÷Ó»ÅÅD‰­ (¢îuÊ9p¿ÈN?Jݨ²n³éLðF|GØaì)È4~”c¿Ç&‰ÔÑÈŽIa¦‘VÁJàa3ãí3æ7VSeu®+rŽÉy‡êÑ^™’WLà¤HBÛüvŽ •‘þu]tUä@öŽ ×œÎð)3lñÄŒm…u[ÉL¯È)Ú.DÎBr <Ãe6À-º¹¸ï)çCà¨GˆÛßoŽ‹"\µ†³1;Åû¹dCößó÷ƒ×ö8"ÉpôvÙ­@.Á“SZ6ÄJ­ÞÂ7, Jr\Mj$C#®MáµÁ Uƒ‹8ÁàÙð~t WŸ1)±ÂŽÃ7ÃÝH1&Á}3Xs=X‹~ágp¯VˆcxmócQ3Á=gJÐ&žÍƒ£8KŒƒxñ`!T›×Qð…Á8†¥‰‡Îà³SaÚÜp9.—ÕèiÝœ^ÏÑÞ¹Æ2b\U¯æüìÆ6F<³a#aÌ­dŒ`“ÃcªÁz`÷#kzn&aÖ[U—Ž XQ„‚‹ƒÅ;d|XLÉ2eM0Ëû`½ãøRgù(|ç7×iFbgÉf$e®’×lêºãÚFÁ±û1J…)}£¦5S“½Ä',ÙøM¥mf1À¤³¸®tç¡=&^A"w3#i&Vdù¥Z-db+Â>T½“±7FÁ X¢]§QÊ(ÿpm?ßc±21Ñ#~°áÈ(?X™[‚êQdåelÁÆüý¸pé[s Ì/?<û5Yªz|wX)ðH ;,›;lšÕŠ5+•UQ¨iÉ#Kv¸ÊêO÷Ã…(·êƹÖ̹ô¥ Å:Ýѳ;·=žœÍ¹Íã¥-F!¿Ù)œâ‘gXfl¾ŠeëË ÚbÝáBÕnÞ……ÐóiÕó_™Z_60û•¹ÁÕxm{²€4]OÊ-~†¸äöÌ–Püè²­ÙÄO¶lç6f–Ø”ÆÎ ¼êM9]©0›Ÿ‚=©´CŒ_†ê®k=Å»q óNL›–ãˆ])sU߀gº¹š1JEÙ÷’GdÃà°ù±è0¸e`Ÿ™ ÷6ŽŽcC\^ÆÞ˜F©±^/èN8%> •‚mÈï5ßuí6c;å¾+8ÒöÙ.º±؇ž©Ñ3„Êz‘ñh6×ftà™ ï§9^­P½Ç°÷Àý8t=²¿Ë'p~üf¼Z¼&§( ¬ C%UñÂ^r‡"w/ h͹æ8ÕÜ…éå2½s†§¾/n9aáôEB™~ LyªŽ0.sñ© Y¦Ð,n.ˆ‹|ŠfMÔƒo‰…z%ÚÀYÈ„{22Ý»d‹0¯šF›)ÇlGž«®àëÕÍeš70È‚+ÁcF€e1…LlŒÈxm½fŒt!¶‘ªÛ¨‡ 3Ý $D†«HìóØ.Í`wµçê›Æ8ª »Å‰ª”8"Ø5QŠÈw*]u`HõWfŠVcEq^´ªœ×é ­ I‚GÇ "óÆÞŒŠá0’F7ðê²G´cÇ„Š”á3; Ÿ¿ÃÚ’Oô É‚÷õ`…¢ÁÒêRè¹=¡ž»¤‚#m‹¾‹ gœ =ôL Ÿ¹¸åzäpähàvðÊi“#¯BÇyžËƒz~q0JwpÑÀýÀµi8âŽ& z¡-Qƒbˆ%Ö÷ãY³ébmð´1&Êžœã}Ï8þ2D Dñ lŽžq#ñ«¹nƒ¨æôËk2žª5–uŒ)åA"͆ñ“Ét=|ºÛdϪpSqÂƸ«R·^O¥¬ÊžF@¿î —uv‰Çe«Q¬ó˜¾P[udcœx˜b¢6†±<×g˜›0ΰ×2ØùÔ-º›íRg’ÙÛMôøöö\U=)Ëi{/«îˆ¶ ¤°ŒÐ-Ò4“ÊÚ19Q9<~8Â(3LçZæ¶Ë#™k"ž8b6ûΊ®¬í“5ÞÓ“ÑÃ$ná©@"ÙÛ8¬ìžêJ=žÝMIQ–ƒñÀÃ>l¡´×Á > endobj 5798 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 5799 0 obj [ ] endobj 5796 0 obj << /Length 5797 0 R /Filter /FlateDecode >> stream xœí]KÛȾëWèÀ2ûÁð3@ È!È!ðf,²‹Lö¿jHÎÌRúJâ×ÅbKC¼3;m5›Õõìúªúí¿þ}ÿÏ_÷o?|ýÏþûðýÃ×]q¨Ë¢ÿ³?~½yù ߆Ÿ÷uSî¿ÿ¼{Ø?ì¾ì¾tÿ}ØõøúáÏÝOÿÛûýŸº¿?íÿú·î—? ÿèø~ÞÕ®î¾ÿûñ{[»î§âéûñ÷ÿÚýåwû_Ž3ŽóÛÿ|1—qáÑ»ñ5ÝãׯßÙ½í 0ï)U¬ª¦Ú»âÞµÑïÿûÝÝÆé‹C««X)ªýñIeÕMáÛn&ßÄ“'=~)ͯ?yÝĸØäýÊõÉâB7¯<ý¡‰Á…Ú—ñ¸×Ç}.›Æw?×aø“H¶¶ÈÖÍ´À®[~C =¸ÆÅ̓Û<¸Íƒ»–¯×÷àˆUS;‡Gàlîöíú\M)>Þ{ìŸb«5—  ~a¬° U ˆOäcóà8ÎRšJŸ"MªÙ]þ§$ëXݼ Öë§L8¶v)Þ.ÜG_®­—OÜizº&Þ8¿ÖåxêeLk¼?‚Ôªj‡óaM„\¶t:Ûg¬Ÿði¹M)aNeLug{ED…G°—ƒGú r†½6Uí± VÀ¬:@ºQ¾Ð¨%`m'èA‚{Ã{;9k‹¬Šn\koêúÛT& c¨›q£>:“iľ1› ;³°­OÂFÅ{mp·¢‘u¼7ߌÉd ™S"+%PT GÈ3~ŸÈèus`m—‡Þˆ)ȾðÑp¥U ìÞ´•‡üë± #¦¼Ø”¿å«u×SwFÜoÈ#xDÐ=ØgÁöD5¿(X4"¦b²ˆÔªq<Žñ6DlwAˆ+Z¯î=à‘œ³¼T>›É›3èÂÕù ¿)–ù(¼þ ±J²øóvËÇüdÀëÁq?Æ?`=ÈÄð˜ŠD6A@«KX#?ÄÄW÷¦ñ Ïë¢JɃZñƒÍÀqF‘`]4+Duµs㹕®°Ž$8ANÆ{PÅÖ1(Bam„Ç!œ ”Ü›OŠ÷‡ñˉ<¾ð¦LÅ‹_[}xÌ!ª1ƒà1x>U]Åpâ½ù?ºUöB Ġ˽¡­ãYñë‰Z¬•*:öõH“e4áÊ”œƒ(g¨ˆyY&‹nM¸:¥†T·WÕ‘S‘8Ó6¥|›Rk·~G3̃)ɸ2à"ºÏ„û¼Kªc‚‘>eið‰¶©L5%s¶„i êqÏÁÞ~ó>„§&ä#ˆ\ð"™l§Qí,Mg™‡0¨H&wŠísi¨ÓBR5æ$&ÛÏX 󦋗Qµ›ccØÓ öeR¦bõºD ¡néIÔI´Rõß­¦ëÇ=¯§îMWšî­ÍŠ3¯-«}“Tó²Õ–eP[¶~<¿Õ–]’³PXׯèz9cÅ™7ejTà;Rˆ¦ OD¨™ÏÂ6ŸR»a%3B÷†“ðãÝ":–èzFŒÿ“³~¢*(W¯ÀÉDjcJN2ʘP%uˆ5Êwæ\ ÎÄ̸×$ƒTUîžÀdÓts¬yHw“Ôétuüò=îI,Rr’B·=IÌô#%ÐVººOILtC¤j¯1E ”ƒno-3/Ò [”‡¤û¤Ljtƒ»šÝfÌ{›z0¾Œ)¹BåŠ6"‘{®0V“øÈæ©í2µK¸¾A™ÃÔ1¬˜µ©ÖU1~Ò½ÕQÔ1‘ŒÒ]Q)À MUg£3ØrfKÊr†d†ñÅQ&¶[ºk#jü›*xŽ7ÙUL@3ù"¹ç+Ë2©¾!g©Í1`³µõÍD·‰µ’{«ŒO&Z¤M9™4ãØõí8`Ã7þ¬ÏËØ‹ÄõÖf}P±±Äø9˜:˜¢«wû]ŸCn7¿]¹”3Øõ½©ÜϺª`]w`y¦V•æœÀœ^ã.L—©ôÂZÀ’«t´%_ÕE VN÷|WÈ®Îqf=|nòôƒA’3{-»ºÔ>©¯öMî£p_,!9Ÿ2æ×Ñü©Å&zj Õ]L$—±œ e d׈ÌްÌâi¢ß—pC8sG9‘ÓÎ…Ùˆ˜ÁÁZ½Æu ~!?Vç*x¶’é‚;¯þ> '2Z™éFœòëÒMÈÖdQ‘PWæyœ›<7(ñnݤÇ|)œ“Zòe“’á±OÐÜXÏ`1Ĭ‡iq½°aõ"˜3HPÔp6AÉO_#~²ó5[?æ ™Sª—¥nÕ0¶hãXR§‚ʧœk;ËÌû,óðÚ×Ï +¸„ ZüÔêîFˆ~Ð9ß F¡,T1ܘEt²TÎ÷êâš/eôm¼…ªNÙ{¦žïIÎXóŒÑgÍx€›5ÚF^Ùaðí–‚>ÐÅWµãÂlº7Ó1·•0Ž™{?n¹‚߯'hÆ“DÜÝ%0÷v¨ö×ËÀ+Ùð¢›O°ÜçcY˜K­tâ¥/¥+ùªñgˆ;7ÉÂhºøs\éúñ;ƾað~”ÏÚu+¨7[½l#ÙûÂÙÂêÚRùÔ¿ÕTÁ‚5{מ3_¾êÍ×s;ûÞ¸âPöË™:çFú´byðU?ôüjíüÏ íÏ}¦EŸ®>ráÐ#z^|¾Ï›¬ÁõtŸ:GÌÈq;®õ!pé™Ï«~׿áH…fëh ÖáÌ{ê@>DÞç9qÔKÕ<€FP°¾Á›½5(à—là ´4^£@‰éŠ_?çú¦ ddФ«C“™­tQ‡ï`Ï b!uæ@!±¬_ÏCC8sC1xφ™wÆê1/Ý$˜]P?ËC†‹81@wyܤYÜù„ÿª£¦¤¾N1öŒ™fŒ–ªnZÏè[i«ÍœÝ›9ô3V2L±&o2(¦cÞXØI†²¼ÿ» mÛvbGJ„æÑPC?Sõ4p6\ä•PIºlžÂí47¾UeAæt.4“—cÜ#³Jk,áSŽÖU¦Œ1¯!#„g#xPX%㆘í¶\ÄKÓà´Ï‡Ë䀯L0sV蘄—xdI-WTê.ä¶’Šz¯¯Ä¦Šl‰àFPL0À„W*}3òÓJºuñ”ï9ƒÏ1¹¬"LFo.O„'BBˆÄx¸G ãKÚ†ÉZèžÐl~Ì5ù­‹özÉÃâæÄ §w„ªÓ5¤Z“„cÐ…á€E=å »‰²ë²œ¾Ûõç ‚¸0½˜Ïˆ±²ob¤25M7q†IùÞX5‡÷Ôþ0gͺɕüEƒUrጺ86®Ûü˜¥^7­·V`²ÚüíÊÞ’Ë!l!¦éÝ”²×ñ”!zVÓkS?KFÊ®ž8*N}u§T«OL?æäêdIׯ1¸é?e|\ eEæ]Ÿ‰`øÁ§dSÑ× ³RÆŠ{ƒ)ÃÇ̰£‹ä'6/ðºróéö‚ÆÊ ÙîFÍxø5lUÐÂH,§¾“ÃwñâÚg\‡‰oëÕ–¸íÅN)KÊ”÷qêf2)ÆÅGØC'¸S¥‡6#J†­¬ïžJûðõMøÚÜt‚i1ÛDiÌตƒn›"¾4‹¥R©³nIµp±,¾H‰P¸¬œ™Mh1bwQhãCʵòÂÍj¬$ãbºs÷ÁÖÜT»6¦=£¹p³Ü9¶t Kܤ#%´~¶‰¹Ö^Õ¾5½Ë{¤€;Ç\Õ.ð5^ÓÊ· c.˜ÇmЈ«F•±áÆrÌÅXáû0 ì°>`ÚØˆýašÍ2~ç Y6ö°NцWa6¾iVŠ›ÉQ×Kà†Ä8:""Qåf¾ØkÃZS‡¸ô§`|M¦i#¡ñþ$4æ5‘ŒP4 ’¡ËÌaL«ná²/¸[‚`ø…ˆ0^5¦Ãz_BÍè[hݘý¡¢„Ý:[ÕµÝTC<嚈{Cð/Û_)ƒæ& c§2ÅpåÔ\26cÙÅYã8A]Ùà*g ­‰~Výtœ 8ÜsÆ~Y•É«îf[É/ÕíÇÊgÉ¿Ñë²gNmUM¬S6±e˦ãÔ(»zRq´ífµ‚"0L_ÆvLÒT" †a L*’'0 T ¾en¨µ»µ)Ãxú‹0xD¸uÓB¸s£1ļŒG˜›û009ðûàôõanVij1Ò„ÓD L'™Ã0bŽ=º:°é&ë=ˆï$`o‡à]`îãÆŒ¹ ¿Þ†n8ýÉ” ¥¼»¾ü4`¤ÄÒŠ—Ow£ªZq]Ý©[„ƒÛÌlø„‘MBf{ÈÕâ¨+¸¯ÝÊÓÒ¬ãúåiwç×är’1O×–U.¥Øm K«ÞÈÒþ¤»¯ýC'¢„|¹ô®8@lΉOpáP¸c"iï' ˜s¹Œ~Ýõ™ÃìÞøƒïak';TŽ  @¨¦h¡¡ðòÜüGôœp ¥rnmŸ‡7EÝÌq{‘ø¼¤.v„6¼àÀ‚¸é>½=óÏ?38ÐnÖ«×ÏlË2ÜñçnÅãFCÚáíÄ,à/¥SϱÍHïþ÷/GÜt£q§q¸˜ð¦ ϯáFTàiBüÝô5˜ÅÂ% Šþa®lÒù¨.ÂaÐA×1”0â^jãKšxÿe÷ÌS£ë endstream endobj 5797 0 obj 4301 endobj 5801 0 obj [334 /XYZ 38.2500000 545.750000 0] endobj 5802 0 obj [334 /XYZ 38.2500000 545.750000 0] endobj 5803 0 obj [334 /XYZ 38.2500000 245 0] endobj 5804 0 obj [334 /XYZ 38.2500000 245 0] endobj 5800 0 obj << /Type /Page /Parent 2 0 R /Contents 5805 0 R /Resources 5807 0 R /Annots 5808 0 R /MediaBox [0 0 595 842] >> endobj 5807 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 5808 0 obj [ ] endobj 5805 0 obj << /Length 5806 0 R /Filter /FlateDecode >> stream xœí]KäH¾×¯¨3ÒÔ8_~Hi§g‰RkZâ€8 Y´bW4{àïãªJWwÛþÒ•Ÿ#Óvu1‚:ÇùˆˆŒwD~üã·¿ïÿùÛþã÷ÿì¿ûŸßvÅ¡rÅù?û㟯¡ëƒÿû¾ªÝþû/»çýóîq÷ØþïóîüÁ·‡?·ûß^ïÿÔþ÷çý_ÿÖþòGÿŽÿà—]¥ªöç¿O?›Jµ+.?¿ÿ×î/¿Ûÿzœ±[Îoæíÿÿ`´5Ê·1±ôó®;¦:ýùíû¯»gÄ­RÚºÔõ^Yc÷ª±zÿßì~jè¦/Uª*mUÌY¨ÒÇ•léöJ7íª¦,tú#3½’Ÿ¼Q…N6ùyçâPQ¦TáÙuûoM¥="úˆdW׺ý{eüf­ø´Æ¥@I7{ |k['$¦ãÎ¥âÑ'¼Ê±ÆƒÇ yÆ|½LŸ`òöOºÉO;‡J‡[<»$rÝ…‘V)@äRòéÊ$œü´sq¨tÈųK"·ÖIoîËô &oª„7÷´ód7Ï.‡\W¨Ò$¸¯f—¿+´«ÒM~Úy˜<­zå S4díLò@{™>ÁäÖªt“Ÿv.•ßxvÉ«Ü û3€LþM»\W '?í\*r³?ÆÌ‚·rþ 0èŸ~zÚ}üªì‘æÊýÓOíæNkž<µ@qûG+¾µÝŸ~Üÿ¾(”ýÃþéç]s(µë¶85RÔhÄÀõ?›*á7~CìÍ4¢¿ÂÀóv w ?Áoð Ì—xœêŠ€A…Ãߞǜ÷ö婽’ÉoSË fÜ&ˆ-LcÅñTޱåàÞðˆÁ¸'`pyO#…‹çBuY !õR|ýsü7‰Ïƒ!Êì®àÄx,űÌÁX€;À{“…¨†'Å#üà“BÚÁ’C' 1 °üa êà®ÝÃsŠæžbz#,GfŒ~+¬£üZcº–åxׄüÁt9’ÇO­Ä•ÝN ÿÆ ¦Šú0¶à:Ø×ÇÈ6†§¬R|g0 —ȯ&¦ŒÆÓ@h§ø¤3î¦Õ£°Vamá:¶œ ߟmbÁ@ý˜ñ4k†®Í§Œ¿ý9yÏ0-cŠ%lWÌ7ð7rÈlÎq¨Û­šÑWQ›.j(ë«Ð¦-’±Âi-ê‰ ø*°|%¼¤Œ7VØ6aì YŸø¬óÜ×ű&“Ï×ÕôM¥¢0øn-X÷‹{Ô0 Ð/‘K!ì­À8exÅâ6L®èKì ÉçÍlÚKõÖŠÁöMœÄÇw•±±ôf¼ Lä›±L ®ðõ2¾ Qfl}Q¸Q^S¦²S‘…wmñ7+Ö~W@£xØ+ˆ=: (^TƒšáûË#YÊilÝ=UwOÕ'Þ$ ÍföÜñ³nü¬¡Öµ)ªKã~jD`§h›¶8mS™ÎØô"X¹Cјc/¿$œGêCÝJlýzÄ‹¬±‘ ŽœÕp{°æÜ1ðeÄ¢‘ÀΆ§98[Öoví•úúŠ…=•Œ¨‚8 é/ ÏØ}) Y ( Î¥ ö½Ò6²Á´äÔȈ5p³²T†é¯1 *¸7e$gûÆ8õJ›;]«·; NêËî”馛ÇSðI¯§oæè a® F2aÀ…/s ™«`o©%ŸSM_ôåb bÄ÷OßgÃ>§ø*Ǽb°µµPÂØ7Ì}Ä Æ@Áë0B˜Ùu-ŽŠ%ëõÜQ}ަÓb«Ò½ÝRbµmðOëA*ó] ”ê¶B‰Œ̸AD%Ö°¬‡³ùò«‡±OÐGUq(+õƒŒ2ƒUWânXx7|£%¹llšlÄrà‡ëí¨íTÂR°_¤4mà·¤æWuL¸\6­äÆÜÚV¶eNàÇNØU8‘tÑ%…‚±DÁµlPÅâ2æ;]f£Ká2A‚§9¢Á¦¬÷L»IÜJ7ECu0¬2QÅý>oQÎÔ{ÕŒ¿.ÏÄ__*š¿všôYY}ÜŽT^[ÕÀú‹úÆkÅcß4p‡N¹<«ÿV560Pð<ƒvíMÆ£ÝÙ·À ¯zíà|Òê` 6³ùë…ŸtÎfAy0J÷ŒV¸7ςƠqŠ×Á³v€o „·éTÙÙ,×Ì¿QÂS/ƶ£™ˆ5m†`ï;]˜¸×ÀQý Œç{Ò_0È„#—ðœcüg„—‡’.ˆÓ€ë‹q¼KøõŽ'솾> Lù²WáN1Õ¥þw*Ãù(8»…¨Ô20¹ä0»gÀ;œÇ#ÚO\g¬#0{KqQ&ÓM–^˜®ˆwêÃÆÑeU€Uv•ærd1#ËwSÅÔg1ýgâIŽätïXcæPߢù{WœÎuõY¸~-@¿¸¦‹¨I‘Ãê„-át§.è/ÉÓÿED$» 5ˆa¢á{*ýM!páPß§el6ïÐÝÐtoÌÇ(“»Â\ØAN!Óü3W@L¶³Ÿh|ä^}™‚åÂ|ÑB÷9ß•ìª40œ\‘àÔÿE¶.À"ìeƒ블LL(˜)ÔÙ ~‘ àëP Јƒ÷™"Ãö±¢w„‰Æ3ý(Îu}¼! m˜¾ï¢ `TúDÄeYªšD.’3aûÕÅÅܼt±$G0ÿm&“0¼>„%Aˆ‰šþ[›®ù©ƒÛÐi¶+gje “ ox×ý[C©ÐçR’Y ŽÁùÞ/òÉV~Äãú\qªv`-í»7/‰2v…ª]˜¾§ÑÜÓhÂëÈúý-îÏ#ÒèÚ“eÚ»?¹Ÿå±µŽd™º™,½'ˬ;Y†I˜Px"% Ðd;Do1õ¦Qsz€ÝSoî©7‰èÒè4–3õ¦qJ|Õ ûõxÖò-—|öFB·-ßZ.Ëb±lÆÍËh¦wk±?#Ì¿þ×Â-âqç´yJŒûaÆtY‰¦OfuȾ<é3NÚ–Mõ¥™hçáÀÃð{ë+Qg˜H |°¾èxâ–PÌ« ²ý:c² Eùg¶®I×Ó,uùeãë“_z‚Hb;ÓD6˜È$¿1]IR¨|Iû¦){µ d$gÚW2¬„Ð~0)0`¢¢¸ãz„ÞÌôH1Á3 ùÄyÄ«1þèªé³‡-GA3xÆô4ÝVòU´MœR\i݃2¥»cÁŽ9ut?¶ºbJ¦g“i+«$Í7)Ö½¸_pS[6§3гêÞ랃·\6xÊ&c§ÜÑëTYFs¿mé•­{Jþ:”)~Íž¦ôÆ»µiBÛT{Âlª·à¯M¡¿%öa(åúrQ4/6«œ¼wˆR¥énS‘=ÙD„;1›¤„¤h *Ï2œb¶#Î{×äw ÅÞ55k ¯»Quï¾Çx!¥‰Èá”»-èj¢·FåAö æM‹\9Y¸w:E¿7óz5›XÊ|½WÍh{?ï•«/!«s½†*g¿éÈc#•?šî;[uC|cá7 úÆ“à‘lûÏ2~F#¾þª: îǾ1pð Gç¹<9H–€ø œ§Dëvg ìàŒÓò`”îÝ:b×o0D íàÙ0bètàÜ1è|"(¤îÔå¿ñõ[cëÀŸ”¡Þä~ o*Ý•èÚ6ɦ÷á–oX¦26£q¤U/1¸bÌ–LÞjáÙr™›|Řyd4Wµ‰ÜœÔ=Š #‰Š£'y |1?v×,Ñœ©({RlO â»ÜÏŽÈVÉ*šä{+Ä%5c ”y+™Q.˜~²LumDës‰0•LÏø7'É6ŸAÔWÞs±2åb]ãæ Ä%ðfB”ÈÈÊD&A&Cё+¬633ÆXs_<ÝhùŠU&­Ÿé®I=ô.ãOÜ5\´¼O¶M%#ŽÎ4Æo“gð¢Y3ãÒÅT¹eë(Úª¹tÅ9X¸ÎèÂ/Hál°oh`68‚;þºÐÁ“â.\¸–®Àï^áú;:à ÷ÐÚ$ ð:ïîZãn«îFè ­æô[e "Û 0À¹ˆÞ‘ýgëÑ×bË\ÂI¹:ßéºy{Ш–Hq%U¾Ê¼ùF8câG™,²Õ)TVÍòÆÙ–z+¼g#:íKv²A æéŽ@2/6Á0ñ2¥Ü¢±ŽÌщ”ò­1=7$¹Á…!2æìÒmN;ÔØKß_øJEàÝü*1ÓÏëëX„Ö3ÖA™Ž*¸O´œä l•]ïã@lB'¦úpc ã ±©Îñy X“P tê…¢…߬ŠM3 Å\v ~‘CQöƒw4BÈ …)„è²/Û³?`õcÏ,~i‰8©—•Yn­Uõ´œõú2’Šñ*2¼œYÇAJbø ö®€ ‰j„øf`:ÈÆ“õ¾€¶ŠõKÌkˆ7âd_µ Üæý"ѳif SÚwD±dQÇÅ)3Oa(Ó›Ã;` ƒ÷F¼Mf Gò¼7½ÝV—ç»™Ì5ÑlxÇO_p â%jí±Ûf‹·Q¤R·n=——Iz”LœWg@…©Òv¹¤¨ì6úxD$Ãp,|¡ó·v¾nûETÝP²•»t‹zGÏ7gz"ùÖ’y(3h“08sò:¾„(1g┳s§›áGw™ÄNl|1ü óÌQðHÆP…+ç<•घ² .â0Á&,6Ö±k?®`Ü»‹?Çp®Îä/íŸýsKšAÊ}œúWhkõxã1s(ÔѰ©ÍUÐ;ã¡QÊΚ>èsÇÜ*‡#>õPÊ~à ­ ¦û­c¦ _ÆööÕŸùP°QfûW ;UÊá=¡M_MØF#ÇPx6ø×¯UÔÑ«²e îø÷vÇ¢!ì0:1 è©Ð1²éà}þýÐâ|…hì!€À$€‘XCuu†©Q?ôÁln©ëõ3BG˜*ëùtTæàyÐuy•v3Éh÷»ÿuŒ°t endstream endobj 5806 0 obj 4523 endobj 5810 0 obj [335 /XYZ 38.2500000 198.500000 0] endobj 5811 0 obj [335 /XYZ 38.2500000 113.750000 0] endobj 5812 0 obj [335 /XYZ 31.5000000 253.250000 0] endobj 5813 0 obj [335 /XYZ 38.2500000 198.500000 0] endobj 5814 0 obj [335 /XYZ 38.2500000 113.750000 0] endobj 5815 0 obj [335 /XYZ 38.2500000 588.500000 0] endobj 5816 0 obj [335 /XYZ 32.2500000 251.750000 0] endobj 5817 0 obj [335 /XYZ 38.2500000 588.500000 0] endobj 5809 0 obj << /Type /Page /Parent 2 0 R /Contents 5818 0 R /Resources 5820 0 R /Annots 5821 0 R /MediaBox [0 0 595 842] >> endobj 5820 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 5821 0 obj [ ] endobj 5818 0 obj << /Length 5819 0 R /Filter /FlateDecode >> stream xœí]ÉŽ¹½÷WÔÙÀ”’Kn€a`$µ ø`@ Œg`yþ}׬êfæcf¾ 2—¦䦒K0_ßýñËßÿüíðî×ÿ~p~øòT벸þ:œ÷òº9º¿ê¦<üðËӷ÷§ÏOŸOÿýötýàˇ?Ÿþö¿ƒ>üéô¿ŸýÛé‡?ºtþ¿<Õª>ýùïËŸm­N+nžþ¯§¿üîðë¹Çn87™×ÿÿ;£K}ÆÈÐßžºeªËïß~øõéÝ•óF©Ê¢¬‹ƒ²ÆTkõá¿ÿxúé4@×}ql­RueÏÿˆ¨Öç‘lkJ·ÅÁ4ª7Ðå·L÷1:oêˆ_f.Ne*îýØX£L­K{Þèó&—M£O¯ûõغZ]:¢•}Îzœl÷îå;WE]ÅÛðËÌÅ©Òm8î]ð4+«[G :ýïÝGè¼l#v~™¹8UÜæz—ÜÜêÄæó>¡´«âxÙÏqßÞü <Þ9l!|Ò¡¬ Ð {GûôŽêv+ÞQÛ<"IáÙš Ÿa|‚ðydÎV*ï(`Ÿ¾ë#á©;ÃsÐý˜ûÊ4<°±W|Î’î°©‘uÝÅ» ŽPÀýÖPW16XàDãý&<õ@oØÆ+%,-&³7+P6rJ­n‰cŠõ#C«Uk΄ҳQ9ËÖË‘ðļlŠ„3<†õþŸ Âë H‘mz D4KyÆ~_ /—·QŬZ4¤-.C¶EÙ yek¥Ž¥­šº|±¥WiŽM[\ès'(üÆ^Ä­¹faøfãPËu{L×Ù‹qšù½uõ„e89?Ђ»WöÖ e¸û‰¡qŒ?YüO1ý,jqá¸¡Þ ÍÝAn¦Ó.#°¥pŸœ/R>™0ÓÆ&1Þu'Ýfµàq0Eü]OçHH®á­„3’#òYïÑ"p1A1ƒàÍÆô[J Øçtú°-»˜tÀflÂÐØJ‚–ˆÅñ–„VE[×£TÄq Y*ZøÍê©ØV£T ÜzÉò"¶¾±U¼*ªB•ãçǺpô›ñ ñ­<#Sˆ³ÅŒƒoI¾õ{æÅKrK¨ã60WÁTm  Dî ëJW˜sðܘ•âõø„¤äsœ¦GЙ ]àHŒízDÕU¥¯»ˆÌa~Y(Ùís#gˆ[æþ Àâ3ì,ÏRŲõ¦:k³gW;˾<žè@nC½Ý¬ôž±F¬´§Åò™àwÓ<À]{ÓÔ9Â4`î"{爑6\”Bµø?†jÔ­}lÔôЍÆÚFyjlãFsq½3€àÞðE2vþð Ô3ÄJ±µšÌѹžw)üO"mÏ@O˜ˆƒ›JeYí,BEzšØÊ£ ßÕŒiMØpI0nQúLusÈP°ƒsmð ‘Ï w™ì\LQ‹ïÍ0 Ó€¨Ô œ½AdáÈ!ÌÝ{ ÇßkâSBäôPϘn&<ÀL…/L7ÌñøFߣ§D6+/0BZâ<þ€ÜÍ‹ÂÔ¡ø †Æˆ«õÎ%Y_«½À¦P£@ªäX’uD¦Ö×EߪLaC^ðô¸;ã¯À‰ƒ4Ç!o‡¼gÆ ^‚‹…ÀaÔÆú|ÉÛ®Œ?ÏD9Ãϳ½³ÐÐhx2"O˜žLÅOáË ‰H5ö`ŒˆSb&DX²û£õĆãBzˆ·LRÇK%Õ1÷¥ÂòlÅ×£Û”öõ!Û9°:bÔ…ý¢€ÖèÒ·øDDÜ”¾=™ÂB®ê9^c®yLò¸;ÐIf¬ˆøÏÐYçËŒ„ž’ăZñºdO"H+ìàkšéžp €²¬@Rª»ö¹‹È´ñ¯ˆòM©¦pQm{2^DvƽbLÀ à®Ø¥Â° È(!Æ<%0'…ØEïXä·‚°'ʵèuòiº›*Š{å"&Ž!ì´1îÏŒ°c°ÌˆÏ@ȈÞJÀfaûÁ¸Ù»<Ùù`µñee\÷¨‚`LM&Ì€‘§'òQF #­™bTL+U”GVcE´c¯kº•-‹%ëRˆÊD^$c¹ºrSlªÖöõŒ›߈v๡+V"†KñÆŒÀ©²†°DBÝœd>òòò:¸õañmJëã«þ4è¶+°¶f€è `Ô€H<…A˜øü–€ÏÞZi†7sÔy+ðf[y*ì Á›éª Ì(2$öý9Ƥ/®5½7Ó QàKG›UíìUâÓº/æ)9Ž9ñÊŸøF( hè^²7·µo’'îûÂ…”9ÌÔúÃ'¢hXàA“Ú'þ&1T½Ñõì>Ub´FäǦ§RW å­{ši#*µnzϨ~Î~s5<– ­-}Ö]­ÞV6¢XR)e„û¬Þö€p @®z*}§àù5»lëamÊ»K"&„€Ëq«KDÆ1õð¢ "ç‹XŸ®ûÁ{ª¶ðyf}ép‘Aªfó:K™ë¦ô7\Â)`”+hÉ»§¦ÄØ€L|ÈDW.EñØÆmáÐte¹_MW‰5ÝÎ3bnU>¼³aΙÈ9“Ö%‡‘Èš¦í˜Æ=Ñ6Ë’M˜Ü¦VŸÁ»¯ì=C{§PãS©„¸xpŠŠ®J” HuÒ(l[œtfYŒÀZâþ1Õ@©<=9ÚÈYMØ5×Ì™ÔIŒš9ClÇãq}vº ‘#Ô+XŒ_2c'‰îe““ñ“DË? ÆhöÀÍ>ÉÖñ5`ë*"NÑ€ÂFÃDɦ år3ÏM㧺·k“ñvx˜tâ›ÅîQ36S¹Ÿ"/SAÒ)õYoRzÓ1|ü -šñEO·†9bsŽúÏ1u·‰AŸÌõ·×}÷Êì“l¡Å¡ËEtl€ÝDò]ýQÁ&˜bmº{sãG&q‹°\•-¼IäQ´fž”k¶W°´.Ù‹é†å nÁ;'ZRÙb0…†qÉ^¬CñÉÂçòNàüF‰- lçAêø S[Yø´Æ+¥,Bö2gËkFöhK…ãõ¤*Ž­Q‹ KŠ€“0RQªñiR²æ2|0Ã/ÔÉðÁ  ®4Ë  JŠu€Ÿj«ÇùÏ4!ä°®”ø¨#PŽFU¯Yy^R1QcrÎí×W¦ÌÍOï®kÍx ›˜Ä¡©Êá@~G5ÖÁé?ÄSJÂÀ['U­ë]5RI·ÈÏŒ)í©:l£ç¨Ù0{Ì·¸Lí›%²e¹gè;æt0"ãíÂa3ˆaƒ †¦¾qT1dC»½ñA ÄÀÒ ƒ2ˆ!¼sÄÄ]« .®ùÁú £±WÚ{-Ò £È0аÿ‘aFAZYFQd){3Œ‚£A†Q8G×ã|¹ Ek+ñQ›ƒ¶ƒåè/‰yú´òŽWÁuùZïañ¶\…Cut!í+}Ó¢oœQr"QOy÷ãßîßÚ£M7ìúYsrJuàwð†ÖgàLY-Ü%vˆš ÖFå­Ž~I¾Ó-½ë gÏ ]b\€_¬ê­žß›z†½Ý€ ó }ãŽÃÐzàܬc–gð8°%°R|Ëwîé­F[œ´´Ž4ÓEÛIH§6§¼±iTÃÐ }P¿šK½$=ýÑD¦ÂDà¶™¹‚ŸñpÞ0¯ÿ—ÝXüµFŒœ›¢ÀÓ €Ò]šǪV¯åƒÓîå±h=íŽëaU»Žâ¡žhdÄœÄãªëy½ëäLÌDZ{ / C0¦ëØÛ¦ôƒâtFÞ¼Z:üDA‹°lg¤ !õÈéî5cR²>ÖûFœñÈ!q6(>Oõ–rÏ”À%£ì'Æ,ø±:%ß„xNFmÎà4™791ë1¦!µ°¶œ“x²3Ã0QØ€h;`ÄwC(Ëå=ñú¶‹$1˜ÜB úhñƒkJue<ܽé‹9àóʼá*›Æ bHSl7!áô‹¯b›Òc‰D§Ì–PxˆÆ]sd"²Â°ç3c_$}WÔŽ(­ëŠ‚h¸%Ð>LÜgÒ09²Lª¬ã˜ê.[ZŒ§%j¼ômˆTAÓ a†LÂÛrÒ 'SÄ6g|Žèú´jkOŸ®§ð•W?ƒR•ÎÇJ2Qþ$G6VKÙ.1ŒT=Ѳ s<+"TO•±I¥Œ×ã“ïý@ bÏSöUÆõa­Ê›ÆpسâØÃÅ5°¥héžÚÿ~þ7 ÓÂon7ç~¤Êá ë£éí\©³Æ†Æ1¨Åñˆªº]œð3kÏÎ…‡èð„sƒë Ì ¯4Ñ3lZµ·—;pPq§!½éß2êÙFìc ÎØŒÆX$¢7Î"ŒñÂèæiµ€‘D¸ƒ²eúú$&^•c"=T|ŠAn$ŠÍPæ„•.küžø8©ByZŒ1Ýq %÷g\E˜¬·xZwp·5p6,Sgg÷¹›ÌãïcósUiŸŸEÂŒ8ÂÔ?ÑtžhíDÆÛ§Š’ІZru3¡è\ÂêfZÛ@%œ“Š% ÎÂÆ9¶DV,–Î8—·ÄùÙD¦'žUá ÷FìϦuWü q"ã=@¼?x·a–|‘*¨b oÈlÊZcBòë‰ ¯.¬³‚à„³€Í®m¦N<ʨ™¸là]ÑD–U_8½‘LÔ˜ £i=‘s\÷ƒö’€I0!F*0ŠÇ‘'Ì“xÃ¦ßæöPÍa®TðÞbï^LÂÄ ô3Rö»¿8Iö.HŽÐvN@ÜÔ/ë;X"(ÅT'”ˆÚÊ-°˜lc§ÔášÎ{xŒÖV<„Pßæ¶0» sÂRÁ@ä ¸r Â\ªÝϧ.ÄÔzºöɽ¥„#Féü=,˜£²§kv]jOëà`$¼ÑئrŽÅ¡@\Y6 Ï NUürù[ŸÅ½‹Å^ 0 S0oÉÔ¶¾‰§õ£Yö–^›f‡›['PkØ‚“Õqš4ñ$u`‰§¼©G±‰çæ)¿¿ïðé÷áÛi+ƒ;ýyìL°§šaœ–9êlà]ÞG~©FðÓ²õ€¼ºª}ÔÅÓ§\Õoq=ðj²‚Bü#njŊ†æöÉ­UëÀ×üÖ7ǰC>ôœ²†Ýã·s-Z†Â½ÁoœRR³–þâ­Y–áÎ?͸ÛhH;¼Àt€,  dögÄž˜B.EÿÎά·S˜±ÇX Ú¢À†7þx½Œ}ûÐöÖ…9:Ñ0mŸ-åK!9& ŸŸþü endstream endobj 5819 0 obj 5584 endobj 5823 0 obj [336 /XYZ 38.2500000 66.5000000 0] endobj 5824 0 obj [336 /XYZ 38.2500000 66.5000000 0] endobj 5822 0 obj << /Type /Page /Parent 2 0 R /Contents 5825 0 R /Resources 5827 0 R /Annots 5828 0 R /MediaBox [0 0 595 842] >> endobj 5827 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 5828 0 obj [ ] endobj 5825 0 obj << /Length 5826 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯Ð9€e>% =r`Ø@Aw7Á"»ÈdùûQ·¨n¤¯Z*Qlª›Ø3nŽÈb½_¤ÞÿéË?Šþ^¼þòŸâ›ÿþüå ÊÚŠîOqüz÷ýÊ•þç¢v¶øöëáµx=|>|nÿ}=t|yþKûÓÿ Uü¹ýûKñ·¿·þèéø ¿jY·ßÿ}úÞÔ²ýIœ¿?ÿ×á¯(~;ÎØ/çyûÿwZUÊVG0®,ýzè·)O_¿ûíð¾CÀ²U*«¬T…4Ú²1ªøïO‡ŸÛúéEÙ)ëÊÔbÍBµ:®dt]HÕ´3¹f´Ðé+ÐôLÞþo»ÉOÇŠÔ•¤gIܪöØWb âž§ßÿÎmHÜäÁ±ÒÏ^:£¥®•5GB‰lSíϵöÖí«éÅ­©¶ x³¡4ëFlHðäÁ±ÒϾ1ÁвCšv"<Ú.Óo@c¤ØnòäÁ±â >žýó’Y0(¤‹ñJ<øáëáý‹4­Ê‘Uñõç¸ÓšÝ·¯-RlñîèW¨vôÇâBHóCñõ—CS¶@õ ^ùG*4¢4"ùGžÑˆÖ¶zù: Žh¸Sñ²;× ŽèO ÊíO îTcédîÓ×V-m®QŒ]¡Q¬½/]“M*³FËïSN‚ê˰š‡á˜\át¿*”­pð `Œ8SÙºgƒnIiKѺÑv,ήt8A:ç©‘ŽtâlJ£»\ÓenDÊҚʵƒ—g:ÂÙR+'ßÌ&!R/ÁûñL51b4ÚÞ©ÝNEYÕòíN!Äœ­z©ú¡9xÌ@1L~ÆÏ¸!Hz8=‹W1G:A‘Ò=£{&ž3‚g#dÂÂÙ ìI¸ëY8TÇÓã­cäÃÙ¢Øëç)µƒ×ÁÒòa6"‰éñÖ1YF²>ú`PŽ>À<…UÊóÖæÍj5°o˜¤`X± 1ïcAŨà Ï×’G,˜¾%L³ÀÚ@liL&†Ù&4C±øÃÎÇâŽtƒ¹~_`‚˜…ddųQÜüZVM2„&‚%~zë´h?‡’¶„ñ–Óœw˜ºÈiÎäÓœµjúU¡"äjL-Vê.hºÐª Úc=Hð˽éè„¡æXd, ‰H­q»ÖŠû,Åb©ÅÖ?# uäèš,›ÉÈfUgÙÜ»lr"²,›”l>ŒÇOøÑ¼ ["zÐU»¦ãÝéAìodåÁ|'l–ͽËföQ²’}”uzP™]Óñîô –Àì£<šbt–ͽËföQ²’}~;y#ë·˜j\å4»†èªÄ Wœn l¬~yVkî { RË!fçw“MÐkZMƒ442øƒÓ;Ρ5† 7?²Z‘ÞfÛ¿€ê÷Ô ½èøÁ]´,oÚþ=´G±Ä~Ÿ‡˜wC'aµ—sĬCäÔY,ËpNnIJžœS3pê%€šfYÌÛO¡ôÌõð¿©ä\ààÎþea#ÅD„c8$…ϰÁЗÀ§ÍöËDGÌTVãú&[‹ÃPÜF 9Öp’x|›¦ žq²æÎ$ƒHa¤HÕ­ïWÅ»Ã#Òò¥Ämáœ[›øMZ¨ú:Mà"§U1æ1µt48=ˆÛî±MÆÏà{T8<†wúXÜWõí8AÏIš=ì· ˜'fû‘&nÍÝ6ØÖ­%˜ç¡Nbt°†ÃÞPPyÄP h݈£MØÛÄ¥«ˆÒ-…N†“°¿KømŒR?Á—a=a̱)DZ*µ‚ö÷&÷¸„xûø“X‡iç#ä„í¿½JÃï“F®± ˜+ÍØ¿$Öáhy¬kðlŒ£ÃÆñ18¾¯e\®ÀÙ)±†~°áÞÞ‚’ž†¨fDkÒ°Gç±_ΑôÛÓž‘Ý2ŒÚBÊÙÐ{«`úD•Úº¹ÊIɸ}ÞWãÄÛË3æË qŠ‚YΨ<Ö¸<6o€³âa½Ð°M¦1©¥.8ja‰e˜“Ý'³$;ΩIÞÞ6ÅÔ5zÍÛUö™7H9Ò±Xf}»W-Sžm_ÿÕñ.pÕªÑWy>lÕw)pú$ Ö}˜!ϬE’¨Gk¹¦’´OÏÉßÞÑ=ÖC0·ª i Ì(\åbÔ× ìà,Î}ÃZN_%|φ!H##ÜŠúIÏ'ñâlFE{„œÌ[,B¼É) ™±×i¿Ó«‰9v®CøLŒ\1ÖËÄ:jFŸè>³ÕQ%£ZS©ˆUgåä8 Öÿa=½\ÇáIFâ]ÁÚ­©É°Fv™­ÜM—²}¾³Þ¼´Câ;F¬©ôeÿ4[Ç=øF­©1ÅÌcs‹ì¹q±³çšqöÇafƒpæ, ÌŠU™ð°}1)ÛÑ utV—1g?Œììc)²jùa†÷‹Ÿ!ô%žq©&ærN- {óa9–¨b?Ή«„£-âWF5 MŒqéZè4ú6¬YÕÅÒÄa{ƒÛZŒƒlYX–%i4‰üµ¹"2ËÒ…­ˆäÛs¢ÝžÃê$HØ«H½*dëØU¡ÇéçËg¿y;MùìwànõÄëE¶‰]/ÊgÿâR¸’kj%ù¼` çW²çš=× <× œ¸c ©íÕ}g9ŸrÌV"[‰´15±]s¯mÌ›ª^uoê.õÿ]ÚþFÝ€{j}ÝÖ¾S›sR™s†ÑU3Z›Uõ•ÜŸµ×þ¬°û zƒn¬Œãcu¢ÕU:7”å~Jfr'E…܉öPhA_‚žF'ZíVÝ>˜{Zr·œ-ç|ăõ´8»¦™{Aª”-ÞÝí=)Ǹœ’è·qjM­‘sÇ8G28r–ˆe0k*Ù2dËÞ2ìTǦ¡/«5u¶˜5çÂW’Ð’Fœ–lô9°îH"EYÕÒÕö;ätn‰+]#Nø¹¾37”È©_ít‚)®í”Ü]&ñ©§©_í˜Ð–Z9ùfzXÍOOL9xÇc<Ûpƒ^%èÒšêHÈY”aôÀ¢õLâoF‘ºßú  ¥^>‚éåuÀ2Jâ­×p6ÌÞ˜/0ÞüçoÈœu‚›±èAv# Æ”[ l^†Œi‹1T~•ƒÏàÙ ?Ú”õP tAa¼ºð†&ËJ;°YXÈÂîÍ—<‘õœR¬+;`’°dí`“²—¿ ½ ªýC3F˜B[aÝ—Œ­gÙàæ Só,ÃÏ,°õG„ þ\ö]x¾KV)›74£R7Œý²¶º½¶"|ǰñb$sß>~4‘ˆe£0Þ`üæß³2áZâÙ´2¼ÛZ¡õ©,[]§Pذ€AoóÑSÕ‡Þ³L„SˆX'.ÏoiÉê!å‰]¿@^†‰O!Ñî|åabÕé'©ÊaÐeZï'é4ûué*âY]Žé ›V_ÀAs£àx)¨…À²¸ }Ï*Ä` b.ƒ´%Ò·ϳ…¨Xġӆæ³jFŽÓÍ9`ë*VE£IÂ&[b}FfmôÁ65ÀXA%ÇM‡Ï`Þå¨? ÉŠú DÎü´DÆ2äÉøÑÚ 8 ]ŽŸ õ¡1l‡‹OlŽJ×Ì6¨µÏRW ¦ 2i v‰æ „­Mpð6Tó„æ5ýŽ#¤Éêsûð.m)¶„žÅZaA ¬:uc¤’ÐÙ¶ÕQ 7`C|æ ò{´6”=UUƒ]ï/ KU 9Ÿ¨ùPá6‡ ·4ÆÎfßN_¥Øšr³„GØîº8U@Ü: GƉöÛ•ƒôYŒ\#Fj‚ãÞ²¤X×#C½@7q EXkÍç8鸈i¯«®'+¡BMq²Q¬Ü ^'h ŸÓZC@qð4@ñvóÃ'úBT®9{INçtqO)î« b£°öå¤Q"Õ8ÍscOdt0#MÁ™`ÁêÕ‰FTç£ÐŒ+Ë ŽÀ‡ŠY¯l×ëàãÆœ×”0^ C\ïÃxµ ñúÁ}^äÅ¡)>Ú/_»B<Žœ_¶Í¹ 7ìwa”ï“ûˆ Rðåíœcýø >c6“¢IÄ7òübs⎎åpyÂܧð¤pàk ðõ6˜ÓdI–Ͱˆ÷ƒ±“†4]^ÎËñÍ×Gr<Â/Á³1d“˜¡ïóê=ÎU`‘¼CÎkW8WG¾”(Žž_´ËñÚ8Zž¸„-è…_¬«‘± „•Á~VLMzyaÖ¤;Õ¤DìÇÈ$£Çn—ªó‹q=ÿö+q!3^‡ÖËWã¸8ÔŠþºX#ø… j™4¨µêEU)(¨¥Y²Å‰“ˆÐÔùÅP¿‚è÷ÁV?}°XÙælS;®Ðç:¶œØ:…µœûŒ[bʰ¾¼ì‹`—óRSaaš`Ìs²™œzZLÙ:¿°)gfô¬/ÒÚîÔ`à¸;‚åt…l¦›¤OD4¦~»5)Ê®Åh$$S#¡³¥µÄ?-†€ AÏxe'Mßu™­K‘[ý¦À»¤³ Á3ñ½#U©eGÅUP{æŸÚ@ûÁPû»ÁëRZôŒï^™XÇ÷ÂLQû»ó4íWñÚò%ɶŸ¯ýÂŒÞ97Ù/uÙ’¾¯P½Ëïo™jÓj<~ÆÍ"ÿªRuWŒ”o5ñFT•Õ§žªS @Ñ:÷ç>CØ^üNQŸ îÂ2CFÃç«ñ½Ã]z¸[ibÏŸñ}?rÑÖë Ûrîøs qOhˆ;LN‚0 ( ™ýbOŒ!ï‡]˜Ãk3‡GŒå‰‚»áz£®=»Š¼µÐ¥W óèLŒ<}¯$¯)ÈâóáÿÍÏ>ò endstream endobj 5826 0 obj 3665 endobj 5830 0 obj [337 /XYZ 38.2500000 453.500000 0] endobj 5831 0 obj [337 /XYZ 38.2500000 453.500000 0] endobj 5832 0 obj [337 /XYZ 38.2500000 173.750000 0] endobj 5833 0 obj [337 /XYZ 38.2500000 173.750000 0] endobj 5829 0 obj << /Type /Page /Parent 2 0 R /Contents 5834 0 R /Resources 5836 0 R /Annots 5837 0 R /MediaBox [0 0 595 842] >> endobj 5836 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1409 1409 0 R /F8 8 0 R >> /XObject << >> >> endobj 5837 0 obj [ ] endobj 5834 0 obj << /Length 5835 0 R /Filter /FlateDecode >> stream xœí]K¯Ü¶Þß_1닽€¢€¯º(`Ø@E…Ó´š nýûÕŒ¤_j>Jüæ¢t'FbçÊ¢ÈsÏûñæŸÿ~øço‡7ï>ÿçðuøýÝç§âX—EÿÏáôë‡ï ›ãðçCÝ”‡¯¿<};|{úôô©ûï·§þ…ÏïþÜýé}øS÷ïχ¿þ­ûáÃ_:ý…_žjUw¿ÿûü{[«îOÅå÷ÓÏÿõô—ß~=­8~nØÌËÿÿÁèZëú´™O{©Î¿~ûúëÓ›a_©JkK{PÖtÿi­>ü÷O?u—/Ž­Uª®l]Üó¡ZŸ¿Ô´¥Û6åä;ç_2««‹—‰·øyçÒ@Q¦RÞÅ%1[hè c"èº|„Å릊·øyçâPq‹W?6Ö(Sëî/tˆ>!¹lÝý¹6Ã?w«,tï*_W€’R©x|¢ßy¤«ŒmÕýÖƒLÙ¹,aqÝĤ¥ÓÎÅ¡2â¯.È»K«FÕ1@t]>ÂâeLäžw.•¹xõØ·¹*ëhÝ¿ò`».añÆÆÖýÎÅ¡2"¯ámib²ïëòò‹WEáçGcßxuAö]©îcguä%þËê1p«Uyzó±³cªÃ—Ÿº?Øÿöå—'ÛýÏÉò¯Ú׿ïöóö‡/??Ù£5½ïëô÷ú'õùIslÚ¢Òå÷OÞÁw*øÎ‡ó“òht£^^¸ûš²bc°DË{pˬ@T˜…aø¹—&„¼Ýx®DSÀÂÒ>|éDX$éS—ŽøÑ=´Uq¬jõò¢ŠRx*Æ£zä)3nn )@*Åï(¼7ü ƒ !c–È|˜Zͽ º ‡Ÿ‡3,g<žÝ’ç2«™=±0€)2,‹k†ƒcçb“&,”Õûp ègxtæ€ð[ ç)î‘§ë@2ühBn˜åC:ŸhÎQ.eDiÙ¶Æ5ÖÁ_V‹Å¬È#¯±äƒL×¼‡*ñdÊíñ10GÀ€Ä<À¾‚œ*‘X¢Ãsy¸!r=v>&DâèøÊzNŠÅL€äÚF6ádñܸƒ© ˰e†ý,W§ì)Žªl˜ê`”Z¿Úíñ¼ïp®Ð“á¸7ž `½õä>yw`ájøNÎçO7dЮñÞŒÙ$tl›>ùþžTÁï`È~GaŠÇ˜ƒ;0ð ÞµyNÈŸ¬šÝ¾˜ÆˆÛ¤ZÆx„».áÝÄTn!U`³ð‰ib¸rtИ~·>êS©rüä¶úÁz¡(HHòW¬œá`]6D9[jFwVýNÂܱHHhÃßÁd€‘Ï# ¤<Ä„QŸWfüjª<²F5/™÷-g†lô~÷¾Ö€ØXÎé;{ÏFc ã=õOø©â"Õy§ö¶°“+NÄR= <È)çZë:Oþ Þ$ò9=•ŠD4'Î3!Jªæ›(TÍ€QgœA¹½í!V[gUÌeôeNsŒš–¦]²áä‚6<›¸SLUû=Úd÷ÈT#0Ùµ8Ï#UD›Ÿ1RÅÓ/ ašhæŸlSÆT=¶dmãT¤M¦º2 x³tžÀqhêy¼¯h÷UÚÙ&¥ã`Î)’m.ªvyTÂå›eÔÙ¦@­–÷M¥Ä±D‡Îdu‘7|Jî¢Ä¼U¶‡q"Ë*±á&ǘ A¢`‚Ò çtãˆ"ªTÊ‘QÉî®(/ah›êwÅ|GÔ+óX¤;ñ1ũ»Œ€“ñy8Õ„šEI‡ 0m GªìW–RlEkP¦tdm…oÄwT²Ä z쪈L½žB{aõA¢-ìFí¼I§Pf<£¦Hô:I5…e­únϦ™²{‘nä„!(<¤€¹ûØHÅ25nóö<ÃŒ¥²Ž¸ ¸Â¢ó]d›¹QR?U2FœãX(Z ë Ú¸QV†ˆæ”LNàéò¥¸ùW½לà' =Ñ|W‰ÕŸ£S7ÆÕ¦©î1«µx]ë‡øü0Åc Y°5eÔãROäöWDþ!Õ“J–ç%Úõú¹žëM‚ÊV7]1I&„}­Q=–Ï–°!;KRD"í$V’ÎØÎû%5‘ˆ'*-¯'¢Æ1C¢#2€peÛ"&rÇC÷Œ*úL1œ;tHº%„aæhα©G­!§ÉÖ8Å•kTY–Êòó{0¡‡Tƒ<ìçÍ~búq[WUXŸ±=:Ó}Ç™Åú㘅‰ƒï43*òДTõÅ9º0^+bSJxb§â䩨Â'À8U‹Ö¼1.¿¦uëñQBi©ŠÖµC)d1Á ßeëå\ÿ,Ëd—:Â2ÓÃòêƒ'≧¼*„-4|8¾C­U—‘ nÉ"eÖp•+dÀ{ób¬–=¡Ó"+Ï®.kçnQµW“bŸY£–õA¤"õõãh²9®!x©˜:óÓ“¹Hä2¥r">_ŠB'‹Ln^Ü€hŠÊOêTU‡³½†Ô©ªR.?Ï/O)Ï¡­µÖ.è¢gÌ5ÇÅ›DžÍúr'CÇ ìˆÌÝ',ɶꡲÅ&WB)g%OH4ص†ßûy×醟®¬ç’% â{RV¿p‚;<·*¡Ød'¶~áÈrš*ëOtå<ò³‘!˜îð]—¨¤J*D4† ºíbW•+G‰LËÙDVJ5Î’]­zúW%"[ßbLwÂÕtW¹wLc¨å»_­å%ãP®‚­ cbò!=]Í'  ‘&<ÚM´6„¹AdÛjX¤ÞRLæo+‡û{<ª˜Áa¥_2Ñ´¦ A“&ðÞ$.3ò’­$Ç|™Ÿ»Ö%€13×,QÜ~*™Y[Òî7Zœ3çÛÛºÓ\VáÉfæNLS±iYë ºEÉoV‹ù¨”¢Y¯¹”u}¥¨Ë¼CöKŒ­zŹe9÷ F ãxÍéM™úz4UÁcJ3'0l4\Ÿš¼&$ª18Y¦®BŸ=Óh‚¢”³j$\8€ ÆÀèd²UëµÜ²YIF¿ÍO¡AçqREk”ú·±L½2vÖl-UÚ[†"7 Ft­ézT(ˆ8‘2áÍÜ„¸ƒ%dBJó_nlºÉDÌÆîmãÚ‹ŒOžèºrÝ™±ýæÅ÷8šS)Ú‰úâËîmS®³ÔaEa$,Ï£Ä蘻d¡.œpÒÄæ½½«®û¦¿Â8¸Ê¤/w»3Ž‘Y³0(ç ;1‹+Mëbf§ÕƒT•õm£×ña‚¬T‡"ìBÚSCÓTÎM m¬µ.[«¡Í¦†m±nLlc2 )çÙ²¬ˆÜe«Ô\í3d>Á¬‡gd1[E©‰:L”­?)Æv•ðnêÑE7͸EÆ®…éŸp`â½y\„q‡ƒ@[sQ‚üuDY×A|Ãݨúå'oå³Idiã<l{úM’Ž&éÔ²…Dzò8y†¨µ)…eúÆÉN¿‰þYäò3^N†»Q£Â™Î"²7Q'x“‹MjÂNî›¶¶•kƒyȇaûŒ›^VµK•-™”i‰VÉëO©¤&)zÓÉ…’Ê“ÎHbŒæ Ú›³Ïûz SŽ—nHé,©>aa²»[OêËêI‚ÿÛðw†[që½3Ä¡;߽ٛϣZø¤g·ÕÑ(íÐ/^­—4'¿kgÂ]“+•ÓC®«•hµ¡òÜ0æÞ…Ÿ4~”wô¹µ—JvhÄ3-md*Ë zõæ’²“WÊ’u'äü’er¦Hj~YÀ4Ø tº‰ÜÌΊU!ÎǺ¬m^n#,2‰c]8>FD@™Œ÷äà“Â]{Î31:é a¤¡ŠªžÝÏFãâ8Ç`ÆžmS½:È{òB¾¼f}½Èã< ¤¿äô0ÇœÙSÄGHü.Ÿñd‡áò±”¿dº˜DcüÊêdU´^ƒágÚr›4›ty¡<퇈p$kŒ“M;VáP ã;Íà‘èòÌ4šòÜš·Ô¼…¦µ‰Ý1;³¨Ê‘s:Ý<´(:N G‚š«QB¶œN"ïvo ˜gh‰‚{³g3îi™,çÎ ÷iJ™ éÌ6ß•m/ÆÔX 7YÅù;²̲Šdp,fsÏîºFàj£‹Ýå-B³M6Ä'R‡¹«’l¥†Ò×+Õy:M–è‰ÅU5Ø…ë-‰î”¸ˆÁ¹põ~Â`¶s&>iÔžÁªqÙJ’¦š ¼e¦žå”kyCrŠq1ùWX ‘ï!¥Ž/+«Ò¡€½†»ñ‡ñ89Ê´e&2j'¾Dás1C²SEç•…Ø«²Ù^X\¿ez€_‘¨ÂãuRæ‘T­sÜ Œ  5L~‡h‹Î½e˜¤Œ/ÖÝ_xq¥naîIšê1êa$· ‚î#Ó©cèT†’ì]¹S?a2L0¶p7 ¼Z‰9{Æù7%¼M&¡„®«»2Ë2~"Û’øA—‰é²¹+ï.ç'¢}¨t™–.›ë\¢õ»5õ%M?íüS¡Rpà‰Ld°ï$¿m§SÉ^QNÜl41r/ãaÒ•ù=“|B Úcš,á4l\Ã0ȸq!^Í“L™nœ^U\šžáQg̈CjœC}„þ•ǰ- ±#11ãô Á Lˆ“ÝÆ8Á)y¢÷LãÈ}ñ;I)éÚ®fÄc'1NV§KO LH©èóÏwD\=ÔG ¿Åí3ØÖBe÷6'Â$÷–ŸDŸÈQÍÃ'WŸÈ1\Ì ‰ê2Cq2Ì¡g‚õÑLŒõç‹•ê¤)v0(ËA{X÷­YïÑ“Á·qëfº†A{Ã0À;H5«£RV½n–åÔˆÁµ¦Ï‰x€±ÿK¤—ÓL“š¦”(°y¸î´#ãå[> U¸áÑõ*vÖê‚Jurf&l &€FM:7®ü‰Ü­„àþÔwDæ<PÜ=½ )ÒaR4¾é xàPs¥ÎæÓ t'z“Hi™N£Ä<à©æÉƒH$hÆ +Õ^†~à0Øc‡=i8V :Ž‰Ùµ'"†ã Ø[‹ßÁþoìá{y|†ž{ür¸$zn5,d<ƒ¯nSÕê…ø•¶—ŽVpÄ)Õî<@½ÃšÅG¸%‘y²’Q¤,M¶Ï~Öãî§;0Ú=3JÉ…L6ë@Ô^Ú¶M’h:Aâb¥øõßK&ƽ { d zõ ßGäb†óɈ*@:/×Í<|TTÄï?XC\#á9çLÑ#z1ñbÿtÀx0Ùjæ\ÊLcÖ劫@e’þ=7”餕hV¥l-aš)BʬÅBÜAY«•L†Xí˜b`º¥÷˜*Éš¼dœ?eÒ^¿^5ï^N3G&fá¾nœE6ºRÆÅŒvò"„¢_HñäÅ?'¤ »¸B×¶µš%¦ ¦~ ‡dêðy0-§¬z1e{î=µ-‰°eñM…ÁU î™ê=¦zÕS£'[¯´Iœzjœu*¾'÷V83gÎÈÞ,<È€Ð^fë¨Ãn Ó9ë5XRbê­§gr6pf7¬ÍöH#]/Ý7w']qKö‡tݪt%pz‡t=ßÀî×á[wÕ¼7ñÓÜ_X`í77‡(s,ÔÉÉy¸ô$È-?[¿ïú†QßãAõÙ+5åÒÕôÉ9}¬&¥ŠýpW×ß1sA¨[{û8œ¥)c·¤½n©€›«'®..^À¾õÇPx5øÎàŸQAGÿnb$Kp§?w; a‡Ñé! HÚ@bÿ€ÈChP¯Ä1ø»íbœVƒPäAxã~oòƒ¹wïBo]˜ãÀ–áÙóä»V™³üïÓáÓÓÿïgC endstream endobj 5835 0 obj 5813 endobj 5839 0 obj [338 /XYZ 38.2500000 737 0] endobj 5840 0 obj [338 /XYZ 38.2500000 737 0] endobj 5841 0 obj [338 /XYZ 38.2500000 341 0] endobj 5842 0 obj [338 /XYZ 32.2500000 168.500000 0] endobj 5843 0 obj [338 /XYZ 38.2500000 341 0] endobj 5844 0 obj [338 /XYZ 31.5000000 170 0] endobj 5845 0 obj << /Type /Annot /Subtype /Link /Rect [378 319.250000 429 326 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_features >> endobj 5838 0 obj << /Type /Page /Parent 2 0 R /Contents 5846 0 R /Resources 5848 0 R /Annots 5849 0 R /MediaBox [0 0 595 842] >> endobj 5848 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 5849 0 obj [ 5845 0 R ] endobj 5846 0 obj << /Length 5847 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯ès€•ŇD Ø;@ Èa‘C°›M°Ø]ÄÙCþ~º[TÏŒ¤’>)u»g°;íш,Ö‹UŪâ›?þÇñ_¿ß¼ÿüŸãáçûχ²pUÙ~Ïßß½ü…öEø|t¾:þðëáëñëáÓáÓéÿ_í ŸßÿõôéG}üË鿟ßÿýôËÃÿà׃Sîôó—ËÏÆ©Ó§òúóüûþö‡ãoç»é0¯ÿýÑ^5þ ÆÄÔ_Ý2Õåû÷~;¼i°l–ºªMS•5ö¨«ÿýçá§ÓÝðeá­QÆéÊž>7µueå½>}v&|±“;}ž]{Tº)ÊÛÁä—o¡á nO$N6ørq¬(S«øèEc•rgB¯á¬v u©[U§ÑäQt>þO¢œ¸ÈűÒžXšÖ¦Eš.›4¹Ÿ‚à'̤ü¹8VÁ#£§&xíêifdïX¶ëð hâËÓnŒàÈűÒ^ø:|ÁÏäÜþ‚³³V´ÊGf–Û8¼²4V%Ð#Ïç`«ª®Ò ~\+­†£Z2 ¥ý °f¿F^|÷åðæ£²'Ŧêã—ŸNÀ]æl|9!¥:~w6ÄÔé_?ÿX–ÊþéøåçCSÔºê@œzR>¡'úíòÑôG8Ï{8Z ßñpžwð &ÖC¼c Ôx¥ºYu‰qq™sæ*GÀ†1 ¡.Íò•b0Ô˜«úu…±óX)”S,?so»Ò_Nê/¹æÒÍÍÅhH­ˆFÁó`I¿3 ™•+¬ïf}’šMiËË”Uiº);åàÎq‚j¨|á›òõ“²º<1Eekïª!y|ŸÆ¶°¦Ã=ïÑU‰|bú[4|úš˜.0¨¶ª8ÛL¯ßÑh4eà Vp´!RðŸÎ'Æl„cðÄxL ŒYH[…GÃü©ŽqŽét÷¢` œ.ÝÀF–Ž×C0¹ÓBŒ#†ZD* .Æ£E–15ZÊÍË÷w¯ˆ¼[‚¬xmŒõåPVi(uy¢LDŽ눇Ÿ0R fÇø£jÆXA×-'ØŽTk䩲h͘=qaz`û¼%Þ©á; z'ðÈÈ“ þ”*ªÆ¼b £Ð“â ¸š®0@ýAÐÎSFéQí06„:0òv>æ2z½ê¦T0µSg›c@`y#Œ6Ê zº"·î™%:ßÇ„—f<‘ÝJ(Ó0ã°"¦´Þ™A×oâYÞüŽŒl¥xwÂÖÛ)ŒýÍÓÍým ra¶Ò)Ó mˆâ´_ôt'Žå)é,Ñ›ÞhÔM_û3f/ÖU„/¶ðbH‰gûhõ"êc~|""ˆxâ™ÍDJJi¾êŽlÿ Vþq¾³€u~ç ¢®ËÂÈ ™a8çí|¤d²Î˜4ø‰DLº‡6ð&,jˆ¨wfT®íã#«ÌCp4ýÙñÙL!Fõ3ñ+¨"!O‘pvòý´q}³"ÂXØ©dTЇ v_8šªMõz c‡hðIä(ã×|ÙQ1#ƒ˜ã0—2g‰´íõ]IJ°…•æá$SNs¶ØÑâ xj¿‚WìB].Ž‹¤çÔCÞM®ëƒå SrÅdÚqŒø²žæ"­;b£â¤]&s)¶D“·eù…²mˆéÈÞGÃÉÛ8uZ¶Œ@c2úÝ^W™¹u™a¬&LL9è-1 ù l© Rkí4/3RKÄi"žU(BdQeJØ2b ‹°æÂ%ax4ì â"!¬7nRjÌñ×÷¶à¢Î}”„ùú•ƒ»IVx¼ž–ÔÍ}^CDš¨"QY»„Ñå;öe1‰)ijJutÌ“hôËfÏroÖCÄ#ÂÖÃÔÙù2_vçåÜYSÎ]ÁÓûÛäòФò+hr£’ºãaVÚ;÷íÑþëÚ ÷5ÝiË.<9Wª.’½gO{ c1ˆj‡'÷ðä®Òdì Ð1£'çÊÊLsÏMÊýÝyrÄ©¤Æ>ÆÛöaW:½‚/±Wv›»š4jMnTê^Ù…öjU»Î¥ýÃ+Û ÷][.æj®çôºæzLí$ÑjnPጫE#UjL_$¢”‘)»Í܇a \èI4 ˆ2‹¶0Ûq©=S9KÕîÎGÕåQ¶IÜ£¤z%ÕÆÀK'ZÓe,úuºê™ˆBICŒ†{=SE›³rš>Úuà$={ažê+» ï¸Èjf¯n®áJì@M=É©Qµ|oÚf×Çøyј. ÷ÐCùôЮwÁ]èHS]“óö®#Ý•çïLGî:¨ž“}¦zèȇŽÌ¥#'™¶NÈL,Xº·†[k\ª”ê­`¿KÇ@bð‹ö˜Ã=!©þw·4à8•pmÑha¤ß'&?Å‹Ä÷úíQeƒ‘L0<Â]GÈÏÄÜ‚qN4'è¡ôŽ«¦§/©Î¼˜Dî!Ù(`·>Äa:×bì Ó‘š6‰^þ .~Ž*Úy߮х ÚòA¥6ë¾õ»—@^Bí鼕°6‰+)²Õ«Áæ°—ÈCB¢zçÆ‰šrN?p[2¥ luÚöwßÜýÕ‚"÷ŠFpŽmllåçP[ªlúaŒÌ‘©¤ŽAœ)"˜ œÒHš¶»êÀÈeÚÌ" u³sGæ}VÜk“’ÙM9Ø‹oÏ6VÆôÍÄûÑG6òW»;ëÝæ>úöA4Yˆ\DD#Â1ËHþpâ”Ò›ÇÔ¶;÷·c—ïÕJ…7úº§6³]OØ+8$ÊC–¥þK\‰%{ù3s\@U~lkˆTòÌu{É3H(kUç ^WMmlÌa¾H`\bHL{þÍa‘}lÁŵ–µ1— ËÞö¹ Úe„ÛÒ…ó¦êëbŸ¡2˜Œ‰­pT sù´è…Õ²Áí¯‘§ÒDÃI`LÜþ]° R‘îÃÃÎöùv8TVOÊcg 3Z{O7¦*S÷=ÅÉéã€ÕµŒŸªñ•°#)•5ôr•ß{©¼l9ðö‘ÛA€ƒÚ¸u‰`Ý»EÀgÛÌ:aÅ[*–ILù¹‘ADäjS™®qAõ"aÔõâm}Œ†¤pðQec^ƒ„4[u t÷hc?„‡ƒp‚¨ý•«‰“],{"&afzîô‡_¢8ø¨QÊí§©úûÏüf_‘øú޳Rš ÙbKØiû=³-£ssźe5ø~+dðÑ•¢‡‘ÃļÓÖÛP;Ô€™Œš%u²xx¬‰E³;…³2°S*ké¥X–Úö÷ѼՒ»Ü"67n ™8 ÷DøcÞ\sªì^ÈÖ-u7Èf‚ÄF™6aÔéôžM¬]/ùÚ±­ŠÇŽ4˜>¦©†˜&­«”º r=ªR9^¹duŠý—Uðày”M|Áûå£í°P_dL'¢Æ^ØX$Np".Ò@Ñà?•Ív=(ˆTõˆ©·ï€ñ ÷?Ùr?«Bü +å&«W¨ºS‘£IY/×=Û£†™ð~‡2Ž0cäÞ.ñŠû¸Ôî%c’IÜÝ„6¨Œ^šµ€lI'pËÔÝ7¹¬47 cÍ?á[‘'4ÚêÍìm“Ù„«Eï}a*Š—D«pXð€‡½g5Ô+b¹Wþ¨š1>êâŠÍõø\Uí‘Ù@fÆž¸°=(‘{K¼ƒçiÐ;¡¡²ªŠƒ/ÞyŽ+õâüê|bÐ<á~½º0í4/ ~‡ ŽŒV"4|‚qýl÷ÇFÃÔ†ó„†×cxkÇf  F#0F1lA UÝI茕Rxc¸*W#êÚt7Eä­rŽ"Ñ ¬\§¿ h²ñ‹lqøÜB"~MųDﳯo~üÈÊŸ»l0ûšƒ Û3™@£R4²YÓìMcˆ¦îí|Kê^RÜy˜¸Ÿ‡kzë5¸.Îu ®ÏÆ×!Gº½¾_¾!Åâö¢=M˜«´K¸ µI^¡é*Ý—Ùæ£Sf›ê¼ˆ*ƒù˜8·h|c¦–l“t¾Àô"J/eE½’•ö7³„LͲƘžÙǰ…V³ãqLEF®Ê@&3ï­  •—8P½U-ר!ל‰¡½+ÎïŸÃ³uóò7¿>G´wµa½Þ$fm^['S¸¿„x Kó ™Ôòl˘ï íù‚sa¨ù°S†pãõtÆcÎqÓ4ŒUo š¯®(Âc—L…«ÔŽ3Àql?a¢¡[µêæ2Äç£kI »­ú[0¡ý ¥;¦/£uewmØ\Æ‚#0˜€/Uµ0œ ÜÀðL…Ãx[ùŸÀ€ ¾>™¹ ¯{˜y"÷OáÀDá'x=0|†Cn¨ñG¦·/ÓCd³TnÙ6øO»Dʘ H¸Ï›lÿ5¦“ô3ßïäŽ-ª·ïü2”G£YëJßj¿­%z±eÛ€ÒVˆìY 窚’½{*u›ö­hK5:Âlø†›·2ÐŽ/ɼ¢¶´ olßõÀ!œ°‘ü^d_›>œÌ­¸fß—S®ºÑýU4šh7Ù\RŒ ¤ÞyIuЍÑhT?;¼Ñ,èíµy?ýí+»·3p‰<ÖI„§Èøv²w& o©iC=2÷p2M×á‡p±L|$:Ñ«^¿ tASí&1'{·{¤÷Tй÷DVè€D8\ȺĘXã-¸Ÿ†‰ƒKtŸ`ì ]pÙ['oªóRÆÎ^=g)á<&/ŽÉjí¦+˜lp&ã:²ŒQ¢NWìDòG0ˆ¾!‘|OÙêyœo„q@dÃÞfv ®öÂÙúÖ'âvÙÑv‘ùãõ5;rçY<^›ža¹H‚"<儨 cj¥¨ê™ÍûÑ0¾X_F`ÃZ„긂ça²ú™Ê8‚ß"{-äxœ×*̉LŸ¥‡•$l%í¼××üf\I€A™Á’NõZcjq°U°‡'^_3…su+yÈý*¹ÏÃÏÖyѨ55ò²½5¨ ¶L^†{NLÿ-¦‡Õ¡!£dÌšßlý[®`ú0dê6BÅbàz"Þ9|‚åyžß~ú>~=1`”??MýÁŒÃ?Ƽ'ÍX”êY¾£¼ô°ÆÂÇ-Ün$VÛr©î® ìHõðI8âÒ#E%-cOh3u€:ÛǰR\Çg,ö¤Û]Ê9¬sÐpxŸX´ …Gƒïó\-Zú‹ ËpçÏ'ˆ;BCÜarbPø¤œ`Ó 1P¶©£¥1|CŠ+L 5æa¨Sp>sÄw^ͱ£ ¢iD"? 5Å@0P)²èõ‚èJS%>O"#²úœÉêÓñÓáÿ1œb_ endstream endobj 5847 0 obj 4770 endobj 5851 0 obj [339 /XYZ 32.2500000 614.750000 0] endobj 5852 0 obj [339 /XYZ 38.2500000 505.250000 0] endobj 5853 0 obj [339 /XYZ 38.2500000 102.500000 0] endobj 5854 0 obj [339 /XYZ 31.5000000 616.250000 0] endobj 5855 0 obj [339 /XYZ 38.2500000 505.250000 0] endobj 5856 0 obj [339 /XYZ 38.2500000 102.500000 0] endobj 5850 0 obj << /Type /Page /Parent 2 0 R /Contents 5857 0 R /Resources 5859 0 R /Annots 5860 0 R /MediaBox [0 0 595 842] >> endobj 5859 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 5860 0 obj [ ] endobj 5857 0 obj << /Length 5858 0 R /Filter /FlateDecode >> stream xœí]IÜÆ¾Ï¯ès·X 7  ™‘ä@€‚9N`ÄFò÷Ãn{F$¿"ëëWÅehÁ–¬_½}«wüü÷Ó?;½{úüŸÓW÷ûÓç‡ì\æYûÏéòë‡×¡«³ûó©¬òÓ×_¾¾=|zøÔü÷ÛCûÀç§?7úßIŸþÔüûóé¯kþòG÷C—øå¡Teóû¿¯¿×¥jþ”Ý~¿üý¿þò»Ó¯—»×9`¾ÿÿŒ®UQ_À˜xõ·‡î3Õõ×o_}x×" ì-E^S”5ö¤j«OÿýÇÃOÍ ºí³sm•* [f÷¼¨Ô—7)[ž”®³“UõàE×_2Û«›çEoó+äâXQ¦PþÝÏ•5Ê”:·—ƒ¾r^UºùsiÜ?÷}W¡*‡´|HY÷£íeû›—ÍÿDÛü ¹8VºÇ»Ÿ«ÂýÿL¾»º¼¸Ò¦%Íۣʑæ²öhòRþl^vpðµVE¼Í¯K#ÅÞ\òduÕ‰ðFôDÀ~OCÔn.‹c¥;[¼»äáÚÆ"º"¨,b ¿Û=ús‘m¯K#¥;Z¸¹äÉ å\Ñ£‹G{Û>ö«:žÑB.Ž•îlñî‘ »ºÎ;Ùü+¶—íÅ7/2e"Êé+äâXé|°û§]0(íßoó›çÁÇ/ï>*›5-N_~j€»¾³ýíKƒ”üôÃÅÅlLÑ/?ž~ŸeÊþáôåç‡ú\è¼qrå­dxå)ü=ÆÀݞъ~þý¾§&vÓÄ3ðK è÷â䬂»}Hó=9Ü ¯˜vå׆£s`cðhBZϲ+oF¾È'Û”/Ì÷¬Y¾àïY»|¹ü@Z®M)“¬®RË$bK‘ Ri¹Ó<^Q·² >S„Æ%©GwC¤²RÉ Ù÷hü 9JSA åy¬úsmŽkóÌÆñ÷°oéß³BÐK*KMØ‚ZUh³€ÉmÛ4ØVƒc³˜º3+²6p`ÏÖ´åN}ñ_«:»BÚ'ÿ±g,ZÑ5Ü-¿®˜sn‹ªün¥ËÕœk´½zßÛDámÙ@™³Ñ•j–^V |¦‚ÐÃ÷X?ã)Aª¼èÁ¡Ï“és9ï¯ÉLù¶Ã{Þñ«•2ÃcŸa!o;µ;öbÈ7ò39~†Q âïæ¤üfa2Ä9þQ¼=FJK *;¥º<4çœ éLBSõUUŸ-°æÁºj8º"ØÌ>p|¬&ƒDW<\€£ ërÈS²&‰GŽa©H@Ù#¿0Fñ{ÚÝ”êÚ¨ÄÁb˜xç( ~õ@93&çc*ÆBŒá£¾ŠUÏáÄ{ ·–EÞÛƒDà|_FÿbîTD[—St@ÙX 3&"Æ%¦yB¢zÞ3À2– ÊŸ˜Ð|‡qA0µ‹½|†ý E‹Ó¡˜"ïŠ\’l1aW#å4<ž²˜(À+:G+Tˆ»Û+ÞÍ“bLÉ Õ=%ž–Åâ&ée'\f÷”¥$;áMÒËJNXßS&°ÑND/ž²|ö ÓY¥íŠ(Ž0~v¤å½¸N‘€­NÚŽ¦Ô•\+uËɼ99­·Ñ?ø±•VTgYx…¨÷è¼âŽjl7A9Œ td4 T´¤§ì¹öP5„ ®x`+àŠ†ïÉl®8rûøÏnø´á—:hl7Œkˆý!hF«¡»ßéCíª Çv3ðL1…ˆÕUÞyžl“.ìGé~f7úq$O8 ¡¼ HFn*É*šSõ²˜P°hÜÏó=0ræ æã¤'‘¶ ¢Å£8Ûg5‚ÀƒëùÉ œx¢Ž‡¶1°¢™\CSL!‚P4Ê’vÈCOËÙ詈¼q‘¿Wfé#*ë??É&œÃÛÒdÒ‹ÎU3Bt²HýÑ€Ù……³¬òH A€"›ùÄŸ>_By’¤©lµ{,\¦:i@¡Ø’a—Dé>•™Ãh°)‰Qû¨Ær쩟»$,V ƒ#ÂÞaÿÊŠ¤.Â0R±Ô…ñœÓ;ge¯¬ÄÈO$J©`ÿŽ .ÀfªDì ¦² -U£AaV¬Ì`*ŠTÞ²«Ñ±6 BxJÉ¢ØÙSð¤SqVyzî òC9%´ó<ôD„ÊBJVfcØ-a¥"µ"À¢„OU2qQ|‚G9·D9w|m_«[“-¬ÜJq»¨hÂÝaTé¯l›QH"Èïo2|ž’|QwƒÊ4 XYV±Ç°íÃÞÍ °OD *„ÄpÑ3àuR90ÆP™o!1JÆãlà‘™ rDº§¼(3?MÙ»óųz‰¦ªE¹o©`I$Ÿü•E •y g¸Ö¬‚ ±IAÀØ?+ 4ˆÈ[QcÍÓòÍD8§ÄxÔÄ•É{:1Y`L¶1Ñ ¦¢Av“pü‹ U ”7ÁT @`©RøÔà†5Gš•ÿ,•úg*i&½Û¡2£'‰\‘ÆTCQÖ¤¬–ÝÍl¢Ë¥iß“‚µNLå!ÅE+¤´Á‚­øõd¹É}›‹ªeÙc Hîµ`8@ƒc‡š˜ÆŒ‡¢b²Dì—2&$R¶‡í™âFL(Нæ ÓWs‰å5ß²ƒ·³kÀ±Ÿ0uŽ¢ÇûwDXï‹°¾fLU÷G¥0±â H•$Ò’LSɺéMu¬)eÊ~€ •ï":~4Í¢õ*©f;¦ªÙ¡ªRõ®¥Ú%AÀîe~à‘©ÛD¦.]ÙcuÆMÙr¦Æ0rÈ> 74q0?L bíÁÅeKè™À§ûžwÏuTçç¬6ß³ÎLºÉ8ú<ßìN5«Ÿ‚ç|$ ëDŠ™b—E‹Æ¥eÍ|Æg\¾ÕC0sœÊ‰\2Ê—u_¼Eå(–j« ®Ž!.™ ”"&ÆcU±{«|Xj€%ÏÞZ~Ræt–h¶¯þjsÁH‚RÉZõŸÌ°b왈 ¶œ‰ŠO Â’ ê°šÃf V´»бSXSŽ^ô¸NÝÐõ´ªe’¦Ù ÆyÆ/ŽÜG›¨íRNDúÖ“”›•ÚF¥J6æJê¼ì±3«Îƒ)ær@&¯-z9à1åÈ¢Ì3£dQ„LuYZõ 2&b—{ãä·g´ÈÜ*¿Ê‘X¥V=¥HÙ:˜ø™Úå£(/Ö„ÀŦFÌç倩V²Ã€½-l9¤JÞ.n‹ÅT^z‹ÜwÁ$˜°©’Šøš°˜qZÕ}zLv8<;íÿT×1Õ™¶“G¶æ ‡òÙ˜òIV žVÅì!>ZW}‘ph˜Mh˜5ÇÒ<ýz¸f$ $J´)r '٨ɣêž #ìe;¼×8Qc-³[bCkÕӀ˛±©*øÞN¿î1 Äý–üÇ0¨•—À}H{pä[0¶ð:‘þÑp=>ºHÍa ‰5˜hë¾ ¶:‹r6>m:&A¨Í&zwLŒðÄæf•Åͳ5¢˜è·ñÀ¶ÔHõ¡º"ˆŠ)–ÆÏǶd”D×N¦Ò=9ö†‡ï®FE$òõfR.Œ$µ §d¹ä5Qì‰1Aíå³Z‰ 7æIü£“%^^U”}…·“Ò×=À‚1ÓãrKŸÀÛöå–ŒN–™Ý'§%Û]'«ÿdË¡wS¡LVõ#Gþ ,„iùl8»@v¢!™Q󃙱h{sSµ…,~sÃq£øœÜ”ÜÄê¤êÑz´â*"Tv·ãmÅÒÉc+¥Ãœî—99?iä¼Âìææá:•܆å^ø WÑŠ*ÑŠ†ÏdgÚŽ¬ ‚Ž­<…C ñn:oG&cÀ÷Ø÷ð™<üc!vàÊšiGAŒ:‰ô=î=ñÎÚVßòØ=>²²éÃ¥ä*S,±j‹ŒiáØ”e·p.UÈò—¨ _nΚ˜^&Ë/Z΄6<×®ð!(S\ø‚‹ à{<¸ÆïÁ°á†â‰óñPˆå ñC`C€wcøãÀSÞBP/S”㡆ˆG£i4˜©»ÆXÄ߀qEпçì ‰Ëâpy×Þ´SÈf l ¶å•4|Vv±‹ÃR<,ÅÕ[Š„¦;¬Šl VEØ÷`]@ì¶¿S"–ÊS<—FÔÅa§íVÈ6ÜAËÛ´ãçPm®º£rƒ…F ˆøêÐô™Ë£RsùÔ¿P¥&Ó±ÆJ€£ºs·Õ“$šx>9 6¦vÉËžzY# ÆäÁ¿lïÓ¾òÓë+u`ØrwW—HÔMzjÔ™ŠRñ6«æßP˜êW0‘ÄuϳÃu?\÷Wò#•랆Êõô7Då88É„nÎæŒ ‡¼1 BìÈñæDè*/»þ¦å›ð÷Ö6¿­XÂNü¸D¡Åa€…98"$Â4ìÄ[Ju—O*ç™þIÜ#/â” \¥&ÅŸƒ‘å=…Ç4öx‚Í86ƒÍr÷LhùBÝ._ú®å·­yb§Êy<€ž`Þcd‘W1O©®þ ˆðcêZ …í(Ñëµ0ERC,ˆ1çÂW¥3GÉð^€¦fÂÏxÜÉ”ôŒzKCÝWt‰Ʊ¡ÜfÌ„ãÎ\’@õ#/mJkwk×0[BÝT·â†Éf˜¼áxÇzéœw”Å…9@ö®ù-w1…½'açSy+ŸÊ ?b¾÷$íñiÁöœ}Â^âòVjÃôÌó <¦w™AõÄâï™ê‹OsÂVßsÂ;ëªõ|†SÔО>X,#‰^zÌ3+¡¾BÔ·&êÃÖn„Ä^ õU··Ânú”ðTêV?·bËOa­N'â"H•®Ø:{[seÊ œIJ‹¹Ê‹i:4Ú4žyBDI¶kƒUeoH¡'ŠËjÓcZ©Ü‰h5V²À/SCÐ’[Øh¸Š¹øf—ÁYkœÇ >]òµŠÿ\P¿S¯$R§1¦u‘è\Q<1KÃÈóš/ÔM§#Štõ=YØ2sÙ½0;„™Cˆ5->-œØhn¡¸ÌJÌuT+›(9ΓíL"P­†¢´Œq”ÊomžkÜ ¯4UÔv ¾}ƒÅºœ„‡‰ÑxüÕDyœiNuŽžLÆ~ÏÅ8€š—šÌ ¥UŽÏbÔS PŠ(u«6k­ªNª½wªh_YÞ‚G;/®mÚ(DZ•Òyqºßéç:ðFžÁ+žÝžá35zÆmÊœ·ÿøž–Üʳ8*;OðK[ç°8¥{®’»ZUóÞu¬ð—b ø¥>S‡¯`ì¨4aœ¢qºJ ªýTv&Ðü ï5ßh»·jíù¸—‚ÿ€#eJ‚á3žZ¢üŸÕÓ³ø%Ù{kV a,fŽ'ñéžúòø­úJõ4Ò!°¹°;ÑŒ29Vdü Ó4Œ;\˜vy¢Y€²:e“–g&Iw‚1ŸALW¦Z“o&¢TGⱸwL7Š`¨óº§“΃àh ®Áñ-"Bl‰JÕô™D´,TVÛ¾i±´e†0è¡SªDäN‡Fæ&&[S>áë2wVxÞC@°ü5â“Gš Nfì4:6äˆß£^õ0·&Ž[\$<à‹˜,ãY™êåÆQ¥:ÅTЬ Ù&sOŸ‘Ò7ehú¡@¼Âd)r~À„òaɱ8Ýí´>6fh³Ø¡f"cý¹­!2vuJy®Ñî3\"‡òuY$1ôÁ<ƒe†š ¶29*Ñaì²ÈQœÍp)>9l801\Q­6T¢c!SDíJÕÓš+è˜Á~›Õ„ý ÿO1¬zàü»¨Ñ D¶(äš]&Û6{É ‰F9)+ƒž ^˜O$¦Ôá–5½X´bg@¶£ûúxÚû«zãæ×é[C7^²ú4õ3è®#;£Ì9Sßç¤oñVÑÒb¡¡ˆÖ•ÔÝÝÙ¯VZyY W\Õµ>ý2V­ ô}Fï1S„6ÛG÷¥¨v{:¶/Ç€í*’èhgưE;ò ïŸqd«‚>½|![–à.n îâ'&WÍmFžÁ²Ç3$Žˆp=¸«zd3ü ‰Ór#gå9yHG Âè¡dø¼›‡Æñ—âÄ †bÇù2¯X3$þ xØX§-°ý5Æv}zpÀÞÅmefÎNRÏc;,yÍ+hR}:}zø?¶ÔZ endstream endobj 5858 0 obj 5368 endobj 5862 0 obj [340 /XYZ 38.2500000 133.250000 0] endobj 5863 0 obj [340 /XYZ 31.5000000 82.2500000 0] endobj 5864 0 obj [340 /XYZ 31.5000000 82.2500000 0] endobj 5865 0 obj [340 /XYZ 38.2500000 617.750000 0] endobj 5866 0 obj [340 /XYZ 38.2500000 448.250000 0] endobj 5867 0 obj [340 /XYZ 38.2500000 617.750000 0] endobj 5868 0 obj [340 /XYZ 38.2500000 231.500000 0] endobj 5869 0 obj [340 /XYZ 38.2500000 133.250000 0] endobj 5870 0 obj [340 /XYZ 38.2500000 448.250000 0] endobj 5871 0 obj [340 /XYZ 38.2500000 231.500000 0] endobj 5861 0 obj << /Type /Page /Parent 2 0 R /Contents 5872 0 R /Resources 5874 0 R /Annots 5875 0 R /MediaBox [0 0 595 842] >> endobj 5874 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1409 1409 0 R /F1700 1700 0 R /F8 8 0 R >> /XObject << >> >> endobj 5875 0 obj [ ] endobj 5872 0 obj << /Length 5873 0 R /Filter /FlateDecode >> stream xœí]ËŽìÈuÜ߯èµµÈä0 Ì}ðÂÀ`ðÂðÂ,‚%x¬…ßÕ]¬î¾ÉŠdeTäÉ$‹Hs5œ"óyžqâüþù÷§ÿüÛÓï¿üò?O˜ÿþå—OÕóÐUçÿ<½üõ»ÿÀÏ󟟆±{úÃ_>ýöôÛ§Ÿ?ý|úßß>ðË—>ýéÿžÜÓ?þûç§ý·Ó?üãü/½ü ù4ÔÃéïÿýú÷i¨OªÞþþòÏÿëÓ¿üÝÓ__ÞxùÜ<˜ÿÿªÛêe+ŸþíÓešõë_ûÃ_?ýþ¼q_éûÊÕSÝ6íS=µîéÿãÓŸN¸¼¾zÛ¦n×µ§?O};TÝ8ºÓŸ‡fþûñÁ½|}šN_w/ÿsZ/ÿ㯉^¯y]÷é^~¹|UꦯÃožÚº^6úž“u^ 75óމ~ýß_Ÿàå­ëÒ½üuäòU™77ðvåævÃåô×m‚%z}‚—÷c“ÓWW¼*—ÍÅo?ý²žúj[øgòÛãéînÜIOÔãÓ%aôå+Ò*õ—›l_>ÍÙt©_%ÞòË?Ǽƒ滹ã>š;î©}ZšVñw/žþÔ=ýúǧ¿¯ªvø‡§_ÿüizú®wÝëzŸŸTýë“ñyœ*ïÉ·×'ÝsãÆúÇ'_^Ÿ´Ïms­¼?Ïo{ÿÝë?hž»¶‡/©ë×'usyÿû“ ©ÑÛðwªææ!U-šWSû/K£ƒK ?ÜöóÛªÅÛKwoÞý>aN ž:5\7Á·­}çÛ¯'Itߥ;É(tï\Û{¯®æ‹÷:šj¹Œ×žLðÉOðIÿ¤ýLŒà zRÃù8ü6Ÿà±É6íb3ÖÞ.©/]ðõ¯ñÙ\\åÛïvà­ð×mú[US7ø‹KH 7 ÁëÁè3(ƒRÐV¢Å ¯£#°&ÅgÎ' 8ñL¿žˆúò£w} Íü£žlóšGØFç/ _ð‰al‡…iÇ\Wøa‰íÕTñ7aùzFØÙú+š;/y]=÷Cýã­vvB…4ž‘g³áãK(¤€ÀÃG‹Bì)4ñØø½_îì'0|b~º}M´v¡BSÖ‘PýõgHÌñƒë¸œR ‡A˜pA@Ã;"ÙuÆÜžëtHÝT —‘Xjr„E8õ„ÔX j—z½çøfSwh x)SÔžaxáÎ+s¿° 8¬Ôõ´-¼?ó+%¼yíJÃhºÆ*ÃÚ1±mÂÄ["v0ÂÚÄ£g¢éØKÂbBjï26ƒ;¿íJÜÅ"‚¸þÒ(]À"cl(xZðþFd›()‚°BcœdB)ǘùLŒ§CO˜ÀFýý|t–Ã9ÉéœC XXÚ26æä3ÚŸøM@ñäø/âØ¼‰Pö„¬Ÿ‚J¨6'W{j3p6¤‰|,­fÑbŸñKà`)Ó7B9JÍX|b̈Ða„ç…Õ *Ç¿aTn‘M™‹ÏRÉ´#ΙܔˆOh£Ûþqc’8Ø£¢öXK­Ö.¡À¦M2Ù»IÔ•A²JX¡;´ùC鸳D¸æRæ[âD•OfŒ4,ä}3'æÅ¢oÿ-£†W„C‰Oª‘%‘ؾ7u|º“{|ÝÅã{×RѤ ‘˜#­*ð¡gLaæB2ûc”ÜØ^àÀ>%SVŽ>³Ç­‹¿dˆ>à¸e…[ëÓä<í[tDõRDϨ ÆSÀwVëko¦tSôA,&·ª ƒ¸Z׬¯6¶Žµ¾½4cc|‡ÀØnÇ_mÚøNx²]í¼£}`uïÄV`[›Z£k>Á×yãæwÜ2ÁC*)ñV26+닺ëùÅmÚ™ùÑbø¼îLàBeäšÎÓÂÙ0r ”•ŠÔfsmŒ>a=–¸²Ê%?n%M&’8ïEQ •­ú6_ÈäbrsæG0PöMUv µ!<Z§>:³õ$»ÏSâÊ Xø˜Jý¨UȬA pp—b·Z¨Àüãü‚$ê>&þ€£v ÉÇ@~7€ÖIÉé×7žÛW&{pF3hb•(`¡P™xÓÙQ7…­ZÛ—¨I¬@Æîûí»ÏÄè­È "Ž7_påÇk œŠŽB¯Š½Lu¯Ãv«ÀáµóѸL„~Š—×LfQd„ÒÚx¸8#sUò‹ŸÈÍŽc’1ÅÅLmžÂäcÌ`jH) 1_HúHL[ ë‚q§ «ªVô_ÐÚàbùyd´ˆ&,ÅXMŒ¢ÓV!£Ö8)ôuRQÞx²ü-™Í‘[ Šè£$­hÒÌ “ðiÜãª1Pþ_¦ºo;Oj bhF1Ú„)>ˆu¦­Ô2¥R>=–ŽÌ¢0zŸU<¶ìZ%¿ /fdôMÈ~šÜ=¿Ç<̦HŠHnZ_ÁíÌtÛfylÉ»`–Á瀡[ð¦núÀ\W«»OŠJh›õFÝGð…YâK€±@³[Ú’º€-r{Ôœ”MÝø—+'ÆÒ,ت8›Úªv_ÜömïÂøqš’ãÝðeðõâ;¾ëO­"0J#PݶrÙÔEÓ†õ4ª"/,Ψm)Ë8ˆ„×/¦ÿ”Òâ—lüç’6H_ Ã…ÇÁ‡ÖÁ)Hì®’-ôÄI0m“Õ9ôòÆôr)rØ ~9µ{U¦´”Œ'[_áÖGõ´8ƒûˆrì|ÑÉê“Äú"œ ¥Ÿ+€iÉ©„G3ìf3lWáþ”mV·Okf¼o€ã#¿8Þ@ò&™Ñ8âaÄ$.…Ìnäg,7Pf@]i‰"î~LtNÚñe©kFÒh#³¿ÙYÚt/©cmѽéC½»tFrçaÖîy!’ñ²kÍi°èŒ%ƒÁ3e¢  wK[h¦=L XQ ÌT˾œßd)ÃÆm ‰à°ÇXhÂd§.Þd¦F•7 ’–EOž¶Úň¾^5²bV{¼æ·ÿV[f•ª ú ?Ü)Ж|CâHÍ˾Kú4vžòYÎQËfä\²SL[!©œl džKb! :Ç€®yÊ(ãìG&±‚@©µMÂaÆl%¸©Ðæšûh k×;Áˆó6VENÿÚù‹K•ôH*÷%/Áç´¶„Qá+ :ó1ä'Bá0˜&"-¡í—(®ÜTl¥¼Fbîë€9­í¹“8=J¬ßª…•2:9úÚì¸Aw΋8zŒI±J}ðÀ¹5äYUƒj©e÷èöÞÔ”a]p,ß*Òƒ©”5Q"$Íòí4bž´4·­}§8åÑL¥NßY)4þ0›nüוeÇÉ5s¬†‹´0 àë«ä¡ºn…MƤe0JèH&™+‰ˆ—”çÆfÙœJ0"öo½ ïžÁqÄ8bp‡6šj±-ÀKZ›ë¼ãSàõ:ÒH!é÷8i¤Ûi”gVQèEÁ{™0ŸUGu£¼Ó^‚V¹-¬¢íŠm»”PÕè[a%GÝf8s—ñ¢–Kö- U&ÚRmÖ4d‹ÀÂíi¾¢'LᄸÌK‹[Hn\‹|{ÇŽìH`mµLLÇEÞ(GÒòÂóÊ!mÍk绉·ãQ̺Jo“· B1lÓm;ÐÁÀÝxi#e$ç©[„žýÀ^¦È HlæZÕ!ó]ÂÛßT½ý­´?E OÌ¥“«ð¼D6ÆX>ÙB¿IÓLü®…ñ;qƒ‚T!ÜÐÆIêÐgJæ§ ]v.!ù“Õª-óN$¬º–J2p=&¥%" k1ÓÀ0XXÌœb)÷{þòb³ê»i-‚>±{˜±ÿiíÚÑW—V~ìà ü5±å5²ïô¡½¡Zo/$É[0ËO±—I%qDo 2uµ¬ /ór¬°F¹Ðb™3–î:Þ§Õ™2::OLZ¼è¸Oǧzº67wŽîí[Ûøï—©£7‹“tíÉ0OÍù!ŸY^ù ~xÛ„~3¾u{‰G½©=™è‹0õáÙpõùÏÍâPOè7³çuå;oõ2‹ù8Ç×`–(×F gZ‹ÿ΢~åmzÒöðmx·¿ÀùœW´n^¯Øm«ƒgŠwî)>!:ÄLñÙ ìOeejŽÍå“çkåÉk “#T”†Éæãiä‰HüèÛf©ë,´¡„żˆ”ù“–'?Eyê¦ÔL«“ÛMv«£±ÿ—RQL­¯)v‚“Ɇ¬fˆ ŒBuWtœV«Q]99 0n̾¿:É6&=‹Ï;@Ð2”ßò9%íòà«Ä¢ñ`Ì™X—›x^‹„ ììvÚQÁªÊñÁ·á¥ÖÁ©+&¨EÿˆéL»èÜ­é›ô1´±r릫àI3~‚•¡! ùÀ.Fo‹6mÓ\y[€'òöËê¾ß¼›ZK‡±J p[ÊÓu”ÿ÷ -dL@RZyp¤¥øOÊ48B#„ô§¸Ã¦Ö bŒ#['#¡ÖìoØìߌ,O¤—ì¤à,M‰´,qrKZ)OÕ– üÀyL“k"yfEe¬Õ&1æ”U9 6Lb a c5·ÔûàÔG$¼@¨DWAQ³Fîcs!É×Jéh­i£™ ¹«mÁNíº„êvWбËð*ÝåDjqî{+ ˆàrèDjl5b¥èMÐVP¨7ΓêíÅU}çkæÚ“ >ùŸÔ艃okø¤M­þ.­áßWj£Õà;#{¸@Eûû†¨÷ƒÃ­5Êy<²ê’PðnSؤ)QB3S×»øßµ`‚¹Äã6X}$.5ò²öBÛ"豨ڟMšdGNçô tÝ›ƒbÛD0áÔÆÞŸÚ¸Û¿’—´¡°ÊÍY©0f†œþ°£;jcvÔjd$ex°©=…c.÷Ôm®”U ƒ§d‹Òf}QÚr²z´í^¬ì„¶ûpŽ4è8­Ù¸ôĦzhìó˜%ñ4ƒïýmé3äZrj-ƒò&n×ËLÖn™¤“zcÚ¶zù0Z?ÑËõ–%!fmí%Á¡_?ÐÆ4`måOJírMÓ,IV+'ªv˜üó´“(©¤ VÛ³0-º…i˜’¨+öV­¼G¬¥" wbhÉYPÜNÎ[Ãôx;õÞ77Z=È„vòHÌlŠø#q°4jÖ…7ÂgP ÜÁ`¡BõE¿$<«¨´“YŒ'-¤(Ûno蔳ҴкŒ»s¥ðaa8 °Æ Z•å÷Æ"–x[}š­âÕL–ûÄþˆ©€µ$žR;gS8äm·g² .vo{±¢”l"îÀœ]cûK©BGo¡(ÿINøDÐ@4\Їɯ!$n¡£ðM"jEÅÀJF2GgSýƒ‰å d˜¢|#ÜѾ¢±£ó$òUj]?ykhP3>4þ7‡º´¿Ô–¦ÍÑïOM܉#s»B£BÔùSñ툈*£ÿüìl.])[ÖVe5>[ ‰¾t”Q„­X†s?Iq'’V“/”n6P]÷u‰qbáküáô ²ÀRHxæÌ#2Ô<ÀÎ F8Ü¥ª¥6}L;"¦„ÛÈæ ô ƒwÿf±(” 5±ÌOÁÎÓ &¼lnqÛ(d«$È…³V@-qÍ)×F«®¾/EDª%»A‰)§§FÉFðjK8#ÊÕŒbÅV¨ùå9—”—ãí!ªc²U Ö¢ì$“GO®,‡fò•e~¢ÁÛÅK@gm¨=v`‘Ó{Yæx‡d§„nåI¤­(m¿©®r £7¼–WÔ§;üã~^ë–S}MžÔ0¡·ÍÄ!žÏœí±Ù­Ö­Ž?™sY×vø'8;˜0up­ðIªáy©ðÊãÓ‡w®5þN…Ï%œidžgÚ{ê\üo:|¿À±M†§¼¯ï9åx·ðI"Nù6Ï‹©´×Ç#~åXà¼À3VÄnF€ï03<ŸþŸe¬á±”ÇÒ Þ <<êZÆ£pÃYž¦;Îe#ƒ¯´®Ç{¤'–P°›.#qñ™wðü:8l:8ŸwÆóÁ·¯èÎ,a¬+)»ßC‹£~k¹©»©ãS=]Í9ôçONÛPWÏç€Åe¼öä,»gçÌ*ðÊoðü¶Yü_ûÍ„~3›åµ[D…ßö>«3›¾/Y;¯÷Üo蟛Úyž{gú¾­BOð|€ Þü¶ù’ ÏÍ"ÇÖÃs€ŸÀ5Àc›¦'Ï{×®é~\Ü+­­*íö‚É”°)k™ ­uÛ¤žH ÑÎÕÿÈ*] .B:ØÖ÷!R*¯±óµ—´Æ' ÿ`Æ:ˆb8¬TYzBFPÜ FìÉTëo|zR*¢(ËK#¾5óFÃZœ””™2?µõü < u "úãàµÀ÷—¨dqß=… |)Kößc >ù)fKVMè$ ®ŸY¥C‚Ä\¬y`’Áå3,Æø;¼uh¾ëÚu—å½êåºi½É5fJ3o‹€5âp;yuJy|pưœ¶™ª– Ë̵WpE@Ø)‚ÁÃz‰ñ±ŒIkyGÔkn±–(e'½j¡™naÕÚF#Æp÷ñW1lm´‰2-ˆWšÅg¦q»|£ÊXò³ j³ Œ©TpæäPÛb;RB{iÓ!iÛ¼ªñt¢¶ÃŽÍž)¤¡Aäf¸‚µ3ê°}vµWÃF4NgT Ãåt-úM{!)šß›Žë–"ís%aÑÚoBÛÁÝTŠ›—a"+¥ÇHV¢! =eúl IT9Ogc8[X9Ú¾ÕÀ„Do’áã8È··ž¡–ZÐ øIødGpkHŒÝ;Ø,ëãwi#Ý• Tý®ŒÂÕTD #®ãiq%® Ä•}ÄØu‚pu5Œp¸6+06¢º1pà.à™âý)½"¸i»Õñh+»ófj¾ñ>â3†Ÿ0÷WõãùŽ©¨$žbûöŽKr,áp.sÆî\}ŠßÐ PŽi«i·©›šµºwÕÙa*ïáä×ŽÝÆ3Åòi­aHæÊåf¼ø‰¥ó¼x¶ê¯®Ä4Ûnð/Söø~~r&ÝIqóE€Qn³-yԲò  Ad²ÞD-Ÿ¦4S"MKM”ÍdR°¯°‹¯œAéè»® œA¦ü–!ç}àÚ”‚‘$Gý<)qˆk0Ÿ¤×æ@Ýt'¤•¯tõ.Å^KYêFO±™Wd130¨S°³Ç»îB Ýµ”¢áb¬V¢_Fàpi±ûÌ>Y)<-ˆWJ£@5áËÞå{õBô†~}һѠÃèMºèú5ìhX…{»úÂ>g–âĉhg¦ZŒ‚ž‰°> PQ‘#¨Çfä0C BµÁi“nP "i+åbÐÕ ²Ì;'Ô]5øÊq›åmF?±¿¥Õ&iÉCcjZmZ¦í.m“ˆIFäÓ&8] ¥‚ÍifúQ2o)#Òcë©Â’Ís&ÞŒýÞ’s» I[ç;öîSPG•‰x3W\ÂýËp¡Hµrª ƒÐ_ó¶C8qŸ½HQéÃÛ+¬VLI:Ñ:óˆJb Ë“=˜ø€ÚPë 0¥ºZÿ!H»]`9–8éÈw4b '96–€õÅ!>oX à&e¸vª=¸)`K~š'<Ÿ{› ¾:°²ŒÉnÕ2Mk‰2ŽDºy˜çêñŒ³cˆ Ú¤ÒÁ%u×¥œuÕMžz:(AÌ‹žSºänæü`à+´I8Zb«€\aä2öõ°um•h¾9ƒÈ]÷¶rŸáÊ1Û¬¥áÊÖ¿ívS$`a”GZœ˜Jî ¹ºñÎmL´`D€xóÎÞ¦f³äÅë« ïH€¯ƒ)9KL\U½s«ã¡x§ ±ì0Sàڊı‘Á3†y)‡ÁêTòîôm}Ç©¬"Ã`‰ßù©¿ƒ§ÌÎa~.°÷â×øùÜÁ|(âì«ñÃŒ‘øÎá‚O–!xç .hð©*C÷ú¯®x×C}!\µ"ƒ7B†0;»K0E‰ý Ü[!Ðuá{ü „êÎ"ÿÊïÕ! ¸ô·7æoõ™ ظ—0VâaD÷G¿Ã7"’æ9£rë|}Çœ$…ÊÙ 4Öz¨Óôêt@r­€*”ªz ç~{kp1lTŠb—ìkk¶×*¥³5)ëÒ†ÞS^{͸0N÷ I Íðke£-98¨9=#¹³sPkܪˆ®]Vú âÖHÞU÷q¸æ­ÕüaOöôþìéÔ‚.?í³Ô•ȯ® ðz^¦„*BIjñ¤…¼q+‚ÖWV;õC¨ æ=fc£·*®„Ìa”Ô’FGT*"pD6à—⃡¨®kÆ<$²ïàQ/€»²´üøTOWÑÃs¤gxë*ùýbœ³ò‹Ñ]{2Ìsu~*–ÊW~ƒŸà·Íøk¿™Ðof„JÝ^pïOðà̘’á¹Y`Ÿë7A05?ž_ü6Ÿ|ƒoƒ3 ¼­Boc¾3ß­këö™ø>ox¦üNGdž׭Nn᜽ñ“„XuǘÂ{ oU×[`…'ã‹`Ð0"“¡*¦s'‰ó»CÌTP1n³Q¨W\RßFõ¬Ú‰XÀ,˜âÑ‚ý¹÷4žÅ–‚—8—t;ek`¢FH¬Mä2ñ‹åªç¶ŸßZEDM‰¥‡ ¸¢²ªÑ ÅNR¥Œ^,{UÔö$U B§¤(›ÆS…‰™µ7øæ`1D›Z4l1Ö–RZ3f!µ\¦fŽ6£„ñå`®'ÁÐÚ+W4¢=<3Øtaôµ8^óVÚ\0äÃ@µþrHïCÀñjJ™6{)¦v&Â#†2-+’‚ SÜ u>PŒ>`Ì+BËC¬ÍÁ*îSÑ`Õp)`f0ݯ°è"ÖÍÌaúV2f‘{¢a¼–PŸžT©§Pñº/‘t$âî¦uZ)Õq;Z@ØgïL^²{q¤irðÀÁ‰:«-Œíåom¢h3pÞ‰hJ×Ê!ûjÂ7ŽæÚK" «_ê25«ÎžZr™Ý$¬.IÅŸaLò.a¯ ¤ æR‹†Kج»ávlʬPc¶Yq¾Ìp c…ñGûÕˆkñúô´ÍÎ?ûV¼\%ZDå´iA|mÈ« iøLÜ2"fÊä€ógÓ¹V=Ý ƒ,{ãFmæÝðÄ.S9v«§U¤[ëFQ¼I‡ºŽQ×L>Œ.Åê$æâÙ«·Cq™eCÒ¶™˜]€‰¥0…´Òú­;ÔhÒú‚…~3:X{¹ÌûȈˆ5‘B  Û0fÎí™ jK‰P–®Â\Wj͉dÚÜ‘#ÎTÁ'EkD3ªb¡%‰ø13XÆt[ª ü+B>¬ )),sô•£Ql|Û–a.¦Á<–cÑ1ß;!.Ñû1cµûš A`ž›l~žÆb•n×2’\Û$Jé#rSõFÁS²¡ùÀ%m5Ý{‘àk• ŠCç±Å´G¦ŒÅ´` ³x±U€K’o×Þ¥%ùSd1öÌíqq°OkMdqJªÉñ ä8Óȇ_!@Êèé8y*°ÀZ+& YNQ :…–0lÃÚ¦ì%#ÍtS ľ'rÀ(ÿM&™ÄA¿mf0 ôämQIKÚÖw²µ%aXdc­X †SÛN?>žþšÄxÌŽôb¤TÀ¾T€Eñë#­m6ºf]k02„±¬ ÿ¤ö ¶8#(9îP$䦞Ù^ÞÏ+Õ#‰9ãÒSIõ˜Z÷Û«Óż)ÙQ fX¬MúÙIVpZæ˜I"ùbJн—´kº”Ä)Ýàë&ÆSÓrEq”i3jVÝu³QÎÆDº0ùy`îƾѪ±ä Ô†åwÊ5 ò˜€§SzcuÓú*/M"ËêÔ—K„›×²²ó‚{©.‰HÚaPMœRKÅDÀ™µýµ]?ÄTp;†kUºø©áfFùÙÒ:Â&‰%iû„Q"?¹¦n§ÉSgD˜7}6Ú6^j*7¥ƒ7½ûm?¯ˆ†[¬DQ†.f3”¢?Ä£Δ»+e9J@ñ¨NFE”[ëžTŸÖÙSŸ‹};tÒØž–e+àA{ÉŠAMÜðȪŒ‚ÁG4vd@ŠVÃ]ÐÊ瘷™ûM ò“{3slnî1ZKIInÔ86P»mïísþÆÝbUŠÍmüˆ†f…{D#½ÀnÁ¨(9_`{®îEGð¾¾ùí´ˆ~8‡¦ÌIÈڔɵ¾ÉƒMBGÖ”8©ÿtJ³ðx‹bJŽ6œ ubD(¹ûðzÑž©$˺°b)5 µç Öí³«oîGÁðÉI¡yJnôôg‰@¡˜œ•Y{–\ýg´’MÃǽ$k:œúõÁ½]n¹ F¡²Ý”YpéšÎ»0Æ4q‚¹Oõtun¯áeW5o²àûejçhÎB"^{2ÌSs~h>—W~ƒŸà·¹þf‚#8×ðÞÔü(Y>£·9‡~SáÕ9ooÝ_vÞõQß©'%àªáBÐãx’× ¼8ðEjVlØ1.tcH‚¤õ˜ZâAf>V«£LP 1 ÷Õ&q¬›„uÎX"5"+nJ-36žš)1æ ÕêS– €ò‹¤9®@âo:S©¤uĬ´iqÆfPÈìôFùBwÚå’ˆƒˆ2E[ÜkÊ0ýäi@3RžÛ³C ŠPëð‘Bó1ó‘ÒÇ٢ٺ"kF¢„1–˜+¹aŒ«&Hð@%˜ðúä7ò ²Ñ½¿¨›’0Œxçw\…m~x¢¶¥œ¤–ØÈãhûy‰«ˆ¢µM>/ S9¹ÿ%–ZˆÚÅOb%§ì°rÎÝ~Ð3»?>Œ¨ @ýŒc1FÏ#"e´ÔÊWÓr“9K ƒ©"X)ñ¨µ (Æ£.?‰š”ä¡n}·Œ¸Ôä˜T l _”@@ŽM‰®°¢ˆ°ú)~-¨0ó4Ãq-½W4!H܆2™Púd]»ËÊÁ€,µ¦Šrúr„q’XOJ­ÛuÞöŠcçL¤yÃòÆÀ#òçðŠ.-R¾ä2…ˆô2sœ×—éð·E ËoÜ5‘0žÂø†š›qçÃó0y¬b?¡'âgÐÕþ 5šêÙlÍ¢ðkõ®½<ºaLü•ùœÏJ=-ùÓ¾¡'ï|F3uç=tÍs]½‚ïýß¼îî鯧ßNÛÜåŸ×þ…4Ãxí4'½ª_B[O®ýqï®ñó* WôíùŒ¸K­ì‡'ç¹öË'ͼ>Ïý¢j¡†â÷+úN³f7^Û÷y¦¨16¦[ÿ8aœv¿œà| °ÜÇòøÊ4jü6ø›Y“ÖQSÞ-{à^þ|ñe£áÚáíÄG þ2[Ëß`M‚ÇWx8¾¡ƒX»Ñ;6ËG2»kWö*°óðÕpŒ“ ¿ƒß8ãx¦8_„G Wge|¸ªøBâiÀÍÆƒ7¸víüó0ö®Û6TÍó,©o»vÉûÁIYUG??ýüéÿ'u¶Õ endstream endobj 5873 0 obj 10292 endobj 5877 0 obj [341 /XYZ 38.2500000 95 0] endobj 5878 0 obj [341 /XYZ 38.2500000 393.500000 0] endobj 5879 0 obj [341 /XYZ 38.2500000 95 0] endobj 5880 0 obj [341 /XYZ 38.2500000 323 0] endobj 5881 0 obj [341 /XYZ 31.5000000 538.250000 0] endobj 5882 0 obj [341 /XYZ 38.2500000 393.500000 0] endobj 5883 0 obj [341 /XYZ 32.2500000 537.500000 0] endobj 5884 0 obj [341 /XYZ 32.2500000 136.250000 0] endobj 5885 0 obj [341 /XYZ 38.2500000 323 0] endobj 5886 0 obj [341 /XYZ 31.5000000 137 0] endobj 5887 0 obj << /Type /Annot /Subtype /Link /Rect [60 778.250000 134.250000 785 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn1 >> endobj 5888 0 obj << /Type /Annot /Subtype /Link /Rect [87 771.500000 164.250000 778.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn1_1 >> endobj 5889 0 obj << /Type /Annot /Subtype /Link /Rect [87 764 147 770.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn1_3 >> endobj 5890 0 obj << /Type /Annot /Subtype /Link /Rect [60 757.250000 112.500000 764 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn2 >> endobj 5891 0 obj << /Type /Annot /Subtype /Link /Rect [87 749.750000 114 756.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn2_1 >> endobj 5892 0 obj << /Type /Annot /Subtype /Link /Rect [87 743 130.500000 749.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn2_2 >> endobj 5893 0 obj << /Type /Annot /Subtype /Link /Rect [87 735.500000 112.500000 742.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn2_3 >> endobj 5894 0 obj << /Type /Annot /Subtype /Link /Rect [87 728.750000 119.250000 735.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn2_4 >> endobj 5895 0 obj << /Type /Annot /Subtype /Link /Rect [87 721.250000 153 728 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn2_5 >> endobj 5896 0 obj << /Type /Annot /Subtype /Link /Rect [87 714.500000 159.750000 721.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn2_6 >> endobj 5897 0 obj << /Type /Annot /Subtype /Link /Rect [114 707 153.750000 713.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn2_6_1 >> endobj 5898 0 obj << /Type /Annot /Subtype /Link /Rect [114 700.250000 192 707 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn2_6_2 >> endobj 5899 0 obj << /Type /Annot /Subtype /Link /Rect [114 692.750000 179.250000 699.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn2_6_3 >> endobj 5900 0 obj << /Type /Annot /Subtype /Link /Rect [114 686 180 692.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn2_6_4 >> endobj 5901 0 obj << /Type /Annot /Subtype /Link /Rect [114 678.500000 205.500000 685.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn2_6_5 >> endobj 5902 0 obj << /Type /Annot /Subtype /Link /Rect [87 671.750000 201.750000 678.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn2_7 >> endobj 5903 0 obj << /Type /Annot /Subtype /Link /Rect [60 664.250000 141 671 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn3 >> endobj 5904 0 obj << /Type /Annot /Subtype /Link /Rect [87 657.500000 134.250000 664.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn3_1 >> endobj 5905 0 obj << /Type /Annot /Subtype /Link /Rect [87 650 129 656.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn3_2 >> endobj 5906 0 obj << /Type /Annot /Subtype /Link /Rect [87 643.250000 175.500000 650 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn3_3 >> endobj 5907 0 obj << /Type /Annot /Subtype /Link /Rect [87 635.750000 137.250000 642.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn3_4 >> endobj 5908 0 obj << /Type /Annot /Subtype /Link /Rect [87 629 153.750000 635.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn3_5 >> endobj 5909 0 obj << /Type /Annot /Subtype /Link /Rect [87 621.500000 114.750000 628.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn3_6 >> endobj 5910 0 obj << /Type /Annot /Subtype /Link /Rect [87 614.750000 124.500000 621.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn3_7 >> endobj 5911 0 obj << /Type /Annot /Subtype /Link /Rect [423 442.250000 459.750000 449 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn2_6 >> endobj 5912 0 obj << /Type /Annot /Subtype /Link /Rect [228.750000 246.500000 259.500000 253.250000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://www.php.net/manual/en/function.dl.php) >> >> endobj 5876 0 obj << /Type /Page /Parent 2 0 R /Contents 5913 0 R /Resources 5915 0 R /Annots 5916 0 R /MediaBox [0 0 595 842] >> endobj 5915 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1409 1409 0 R /F8 8 0 R >> /XObject << >> >> endobj 5916 0 obj [ 5887 0 R 5888 0 R 5889 0 R 5890 0 R 5891 0 R 5892 0 R 5893 0 R 5894 0 R 5895 0 R 5896 0 R 5897 0 R 5898 0 R 5899 0 R 5900 0 R 5901 0 R 5902 0 R 5903 0 R 5904 0 R 5905 0 R 5906 0 R 5907 0 R 5908 0 R 5909 0 R 5910 0 R 5911 0 R 5912 0 R ] endobj 5913 0 obj << /Length 5914 0 R /Filter /FlateDecode >> stream xœí]I¯ì¸yÝß_Që®' @ ß ‹n ‹ ‹àÙŽati{‘¿©4Ü¥ÃÏýHIuo?Øï•’"¿yüá_þïËÿüãòÃçŸÿ÷ò}øûóÏ/ŵrEÿߥûó‡û º¾ÿ¾Tµ»|ÿíå÷Ëï/?½üÔþÿï/ý ?þ÷ö_ÿwÑ—kÿ÷×ËþW{ñÃCÝ¿½TªjÿþõöwS©ö_Åôwwý//ÿñO—¿u#ŽÓ ‹™ÿþƒ1ªý¯[ƃ©?SÝþüãûß^~è7 n–²Ôíe½¨ÆêËßÿôòçîÛ¸ÅêûÅꋽ,Ü?L.¸¾-X™v‚i©"+«íÊØo؆âuô° ªßoe/÷Ú@~ν‡eS&ÛCoì{X6Õå~Âj=L‡k‡#»M¿t×î_3N–wó®­v¯»8þâ6òZ—Ãðßo¥¦%/ʪze›¯Uª*mU¼……Tú6MËì”nŠ‹«DÓ]Én ]%¼_¹ô¦(Sªàà‚'kº¹nÛS• 6=ÅÉZS¦ü¶réMN.y²Îèt8û:zŠÍwupðnå‰p.y²ecžì4zŠÍoU³tƒßVžêdáà’'[›&áÉN£§Øüºq ïVžêdáàie7ÓÔ9d7«ÜHLu!4wÃ'\Wé„·~åâ»2@Õrô(/¥¿Ò©ji9ê¥RmT7îå·é·¾Öu+âÝ_•R½zkZMª™ìcÕï/e}UªÑu­¦§ªûQÆ_ýíóÃï¢{íâ½­ŽöÊ÷o%íµq¥ý(óïøþò——Oÿ4۵؅¬i¿^üôËËßZì//¿ü¹½u;„þ¯_Z$µ—?ÜVQ]~ùãåŸÛøô/—_þú¢ôÕš›±{®¿£owêkÝ¥v÷w*x¿óõvÇ]®ÕìŽÂïØÛ;.íÝ1Wg˺ڶ6UÂy>£y´éw§¸–•ê&z½3ì›—°áÍ®HåÔpœ¶§«Íµ*ØvƒiñB.`LµTãô\/l†ÊÒzPYº5¨\hÕfЪg@Õ=5@Ý8ÌøÓzPYš5¨,}Awe•·§ì|;ŸfW¨¬&™´„¤þÓºäçZÈd’{ƒaa;$W£L[}a3$ׯƒäÚ®Ar«Bz vS4=@ìž ufüiÅ!lGU;úLºl’» ¨êª j9úþÙK8Üp»§Qõh ÌxÂW)ô6öR*χY!S9ºzZÅãþ‚2Uå©¶È” ™Þ›~Ä¡ÚM8dï/àPãöÇ!W˜‡8ç#¢/à1b Ø èçW‡Š!òBDÄ»ÄÐz<eâ#,¯”€ ÷팑Bäã ÎöÑlã…­P§¼p §ÖÂ5œòÃ5º+¾ôöToàœ†záN­…k8å‡ktW|hÿ”cçÓìiuz ×ÈAx‡È-Â-@¶+˜Ö@„Ĉ/+€aù„0Ø×þ¸oºó`y ï^&ýZ+01ßnüðb·†p6e§G¿±íóÆ oŽ®vf” ÇßåJtµ3µùÜ]ñ£«oOU÷£Œ¿Æ8œñ·]‰®vÆ,æ0‹èêîÚ¸R{]ý:ÇžÑÕÎŽ±> &a:Þà¿ r¢(‡ òÃ_Ìda‰W wg!´DY¢ˆ‹)f@mðáAmõ-ôAâÎŽþi3àž‹Ñr΋Ñrn-FË9?F«»²ïÜ£5 3þôb´œ[‹ÑrÎÑê®,ä;7Åh½cçÓì*ß•ÓiÂ,£¦ÊZóre}2^ŒGý þ‚‘Á—SdYmî/lƿʋ,sÕZd™«üȲîÊÿª)²lfüéE–¹j-²ÌU~dYweÕYö:ŒO³+þUcdYÀáu*¨|ž( WYºlî/lF˜Æ‹ÈrÍZD–küˆ¬îÊaš)"kfüéEd¹f-"Ë5~DVwe0Í‘õ:ŒO³+Â4cD*¦´1‰°JF¬:´ÊM¤ÛX ©•MbØú"2”8pÍ6Öèû [ Z©Ôœ •J¯´raú,Óç==º=Õ¬i˜ñ§š´R+­,|CnwÅ'hýSv>ŒO³'A+Õë“ç¿Ý  /¹üˆew(‡%ÚÈf„,ÕT©)î/lFHãB*ÍZ!¤ÒøYn¥YBº=5 œ™B§yEH½V©Ô~Î^wez*„ô:ŒO³+Bš©RÚ´¥€´€±YÔ™MŽ4hÇÅê2f"gl ¥ÛßLņú0ÛñÂfÄ·^±¡Ò­*FªÒ-‹ ÝžÛÍŠ Ó¼"¾]+6TZßäÖ]Y ¾Š ½cçÓìŠøn*6x–["àƒq=æ‰TkÛO™ŽQ÷6Ã^Y{°W6k°·0Дƒf:ÝSlÃŒ?köÊj öJßÜÔ]YÀÞí);ÆÎ§Ùöª1>/ò¶Ý4#²U׿Cø{¢¾š*Ô¸êþÂVïæÃC/¶º-ng^éÉöÇÄan åz·O›8æeõBúbB7†%Æ—Èø!búCœ¡<¼ •Aku×¢1óµb¨†¥_l9|yñ8\x*‰€ÆÓËã0Ö·@"t¦ hê ñ=™`(ÆÁ¤ÐÊf”ã8¤íaÃOÜPže9½àY§B²ˆX&^äýTJljÎd#mý‹iõ†Ê’cý#ÜHQB}h¶3%DJŒž1.u ëcBÚ"Ì«”9’)È“œÅªb°ÜñØÝ%&­â ‹Á5í‰w`½>•¤ólT`*˜¿G«­oî;¡¦‡TÕçxò¥1E Þy(Íe€ÒúqñèçRž…LÄð¹TayŽÉÐ>™F5qxLn ÓÁˆÑ  6¬¿ù²I. Q«‰Éz/˜D&h€ afB¥™è'¬ØË DÉ(Xg­ Ãx}–$qX2iªFÔ´§Ì—²2¤(bQnLjˆ.Ñ~r1±QP‡Œ:d½J‘a [)ª$õ—8ŸK2jRDÊ &“¢u !¨•H9ZYâƒDá]Ú1 ¯ŸÓa'Ê?wÃJʽŸá@‰¥3ŠlKtÈ¢DbOö4Tây°p Kòª÷¬n⢬'q™ÚЃ·—§1ȉ.6 Ü%Dí¬9æWOïõ§2ˆ˜¶M»ÛJe@†ÿÊ%C81|/êm2¥g"ìÆ™êmRFnÙ˜÷LòÀküG¤$0^!³¦ÕV¦ñXít\Ñšiƒ[)Ý—!­»[–$\–iE´YdD†Ò‰æC,‚rC_dÓ<„¨U}ÑvÝšw#VM1Ö&;u·xiçaÕƒÔ²rg påu0·nz§Aï p¥êëÂz‹×6x’mÌ;£y\¯½ÓS­êÚÔþ÷®MãUÃÝ »å=Ó(Cuµ¤¤‹gñ¸æ«ÿ¬!v9¡±.ýÊ;pOÇ@þ•ÑÍ“Þ<Õ¸i EGÖ²˜8älÌôI1ª;¬¬ã;"gžð{ërµ0?¨‡/`J㑲€3[4<À¦w" >æ×o£«ŽÒ÷$åN•ÖÛ)‘2oLˆ*¥ë3ý”·†µÑYÿ’ bÊTåÚ'%”Q"-*Ûõíg)äö^ž¾HTb” Új1†…¼h–’XÕµóÉmŠ|Š´<£"8ŸQxk\µ™›Pú2Ó“l Œ(¸{I©ý«1¹`,Ï%#ð^YB®D¸´„»r7µ;¹ Ì7üúqÖ¡í¶_3lwuãõ¦m]k‡ƒâ3%$aÔQkɾ3 ÔÚ/Ä—ÂD‡@ÒLt(2ùLáÆ‚ëØ¸fâþØ”$‰(âôÆU•O•¬á °öL!öº“­] HõŠqÊÈF­áí:Õ©*›cZ™×@•’uÔ>ïx’Ó…uÙì@ᚢLY€ˆS²=:D9ÑC"˜V°/+í!Ï9eW…µ,ïâwð÷àUCéY'—žë¢òI Dà)eÉgrø"ÂBDí*Tš$_µ9¥±WYr2î$2ÁÏ¢5“³Å—¸€ßGlÜGlÜYز|íÈŸåìÎyp´ÃUÍ|[…Œ©XL;§Ø0™ªÔ,_•Î?«w'ôekzAŒHs5I"6_ÖÈÔVÎúÁdÅ)ã#§^/0:[²‚M«>ÈÚŠ)3Ô¬öøÜþjx b AuýÎä€ÝMceNPÒÕN9‹“)JÑbÄY*íñÉTä7ô®ÝQá–•è(›?F5Þk˜Á:h§´§,jlʰØÒû¢#ëÇGfq²Õ+`Xü~º-‡Ï(D>ƒU•‰$Âjìv[Sè(¦W‘ó)[ÿ” ôXx}A4 ì1°{\ÇU '”-zAÄC½÷Sš,L÷ùÃ9eÍf‰}ŽLDãЉ Ip/¨ºÇ¢Y›²¨ ‡5Ùv 9.L¾J—¼ÎÊ´Ž+±ùrAõE5k,CJM=)5½ŒÒjǽ½v­+wÂí®Ú7ò ¿Ó w†Ê@-»éUú»w^S~=)b½µ”ðÎWb´½£áü¥mÚü=Å'ø=pžÀàw|¯ B"þRüŽÁkëE•òjn¨¼i4|¦ªï@ œB‘ZfDF£õ¸QÐcólI!Bž‰Ôµt…ýÓrùÊß_neª=VÊ6d.uãqãÑqŠjW²{ÍÍĶa‹ ÔÙˆ@¯lÁTÑÈ•uªb"Twþ„Ý.;W6Z[,n°ËWá;”/W¶ô3P·¤iXC}¡Wþ¹/8Ùò¥ï§®à¡=ò²/[­žÀïýI¸oDZ ã!ûä{7d›-e–‘3Ø»¬z `|Áô&ZìV6$ð¥¢~“ˆœ×7#LÉ«kçÖU§¸¶ÝÀJ¬ÙY6;*Ýe²ýŠ%¢÷÷wåÞ¬¸ŒîvMY ŽA¾#I`‘ûUŠ,‡Êû„¹ñj™G•e<ò¡îSL2jç ÔTñïP%=?Áï©áøNç{(鉿ÞÁ+Àߨoð¼o¼K¡pmv˜} œ†DQ\``4€ÛLqÙ¯ðÎbw „àµ) ½Bð;ø{ðª!Œ¾ŸSx¸Y¸«Uæ0üðœÜ5À U pW —˜ªbLǼàɰéÈ4- ã<Ù)ÈîA³>v4D]>IñÑǶš˜ÇþÑÇ_à;0êÔÀèc&T8^xò&/2¤¿ÀUÃw{ð½sêÈ[â]§¸Õuµ~¨)çlÔvþ˜6S —é +XAD·o¼Ø\ÁŵªÇ/‚ÁŲQ˜¹„çsæ,Ðã…ÃYê©Üµðk¿á°YÜI %=•ÌÃ’ÍÝ¿·ÓE6"@8Њ±©0==E+Í´ê;‡SÇÁÎfRu®ö¾@$°^¸JW¦,—Ô‰ ¢mK?ŠFnÙ ½\$Òk™Ö6eg4°œA5u¥çë9f€ Óà”ýY˜°ž§«w.j"{CàJzƒC3Å´Q‰`î „8»Ñ÷D ‘çBH¤ œÓ޶Ô<˜–­‹ýK,-%?×cëaª¢[DíéÂùïL­hJ•Ô }žx&o;e‚ x¢Lýö…ßI4-)@ú˜ $¸ &T ðîOŠ£G0/,_1~Oæ3DxS0Ä@Êb9—e}Ñv5µ÷j7ÕT âÛDLìÜÿ4vYZÞ¶¥¼–‹Ž<_à; zG]–*Ôw|mm ¼cÐ<D­mì˜T¾®ö \íâÙÀ¸p•c"{]t|ê¡¥º6µ¿~|†ý77+"N…FûØÁo©ù|¯úÚbCPŠÌ¦­sIùÇDã¡Ïɯ˜ØfŠÕH4¾a¶X6>2IVǞ֟̉ÂLtŒ›‡ˆ 6L1óÀwpeKóÞ·¸g"øDˆX‡¤*lF¨_²€(M?`xV®@€,5\T´d„µ™1fêAøþ\ø‡v{ˆðS¦vö)ýòLs·7è6 ÙgÓ§¯Þ³OW"·”H´vŒ©u; HT²!Ò¹œ<{ÉWÙJ\‘£Ëöã 8ß{ äË`!3Í„ˆ\$ž÷=·Õ¨ÄNçÌä7PÞw†Èzù%1œBSvOY>‚‹DÔ©•öW#ÅŸSU¶¾p†‹@Ô¯]C7‹ÏèNæÚf)cNúŽ›wû‘+Ì)àGbzˆÃP¢]Ûõ™×÷‚ ÖÂÂá:uíŸÊ$¼Eld¦lÆÍSæI*`í®ýŸ4ç8W¬¦ÆøÃOåèÁüSDêK¯ý)µPówBµ—°yëûóŽ©Ø5©GÅÔãr;ƒ#U³†\zPsêiÊo#ä-Âô~DwprW½àûB¼ƒçià;õœ=º,eÆÇ<9s ;\¹ÓÀ=è‘ ¼¥WUèµwðÐçîN/ü—Ë;ƒB¯bS"¾ yÌ#]imm߆/EL«öuI\ìH´¬§Hc&W>CáÑà;´ª¨O¿Ëe®ûw»âñ ñÞa¢A¿žÔáw¾"`>=¸6…ÏîΠŸ¯q¥Ouð;xÕ w©ËnÙæÀjx/ððo˜ª0×ÚnCõ¼ëÌñ¥ütùéåÿ" ày endstream endobj 5914 0 obj 8617 endobj 5918 0 obj [342 /XYZ 38.2500000 67.2500000 0] endobj 5919 0 obj [342 /XYZ 38.2500000 473.750000 0] endobj 5920 0 obj [342 /XYZ 38.2500000 251 0] endobj 5921 0 obj [342 /XYZ 38.2500000 104 0] endobj 5922 0 obj [342 /XYZ 38.2500000 473.750000 0] endobj 5923 0 obj [342 /XYZ 38.2500000 67.2500000 0] endobj 5924 0 obj [342 /XYZ 38.2500000 251 0] endobj 5925 0 obj [342 /XYZ 38.2500000 104 0] endobj 5926 0 obj << /Type /Annot /Subtype /Link /Rect [154.500000 74.7500000 247.500000 81.5000000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_overloaded_methods >> endobj 5917 0 obj << /Type /Page /Parent 2 0 R /Contents 5927 0 R /Resources 5929 0 R /Annots 5930 0 R /MediaBox [0 0 595 842] >> endobj 5929 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 5930 0 obj [ 5926 0 R ] endobj 5927 0 obj << /Length 5928 0 R /Filter /FlateDecode >> stream xœí][ÛÆ}ׯÐsËså( ¬×Þ}(°ð}úP8M‹ ºÍCÿ~)‘”vI!çè›!%+Fbgé¿û}>þùë?¶ÿú}ûññë¶ßºß¿nÔ®ôªýg»ÿõáíLµëþ¼-+¿ýöëæuûºyÞ<7ÿ}Ý´ ¾>þµùÓÿ¶fû—æßŸ·?ü½ùáÝ_Úÿ…_7¥.›ß9ü^—ºù“:þ¾ÿù¿7ûÃö·ýŽýëºÃ¼ÿÿÖU™ý1&^ýºé?S~ýþí·ÍÇqo) § ·ÕÎ6ÿ©Ùþ÷Ÿ›ŸšôÛ«]í´. WªK^TšÃ›|µÕ¦nv2jô¢Ã/¡ílnÊ2Ýæ‡“‹CEÛB‡w—D®5u ?¦¢ËAtÚ>Áæ®Ré6?œ\*=rñî’È-”oTû:îžüEp'—JZ¸¹$fK¯;ðÔ)dòiû›×.!ÛN.•·xwAäzUÕ ‘ûfû››26oOž ¹Ý%‘kmOýÚ%Ñiû›;gÓm~8¹8TzäâÝ%‘[ìòtÈ=mŸ`ó2¡©Üž<rñî’È­Ž¶¬µ @T%4•}]¤SèíÉÅ¡Ò#w´ûsÌ.ø(íO€¯þXøéeóñI;իؾüÔîðÎö·—(~ûaï¿5šðåÇ핲OÚ¾ü¼©w…ñýÛ'ê3|ò =Ñ%zbàO  øÄů1púBÀÀÒßóå¥!“Ô6û§í[â±€<Æc ×T’v ®1ñ»x…iÙóib ¤$—“^¼›”b8  î~ñˆ95ð‚*ZfÞ£ñ{ðLËÄ ,†5¤×`*7P’âtkèãíï‰ß6ÜѦeàê…–«]U«ÃO0Uè‰z<u€Ã£’‰k`ôq{l,ÅļN&I™”Ãíó„ýÎÑãä_AñùURºxªj/F6¨Xýâ¥ÅWÕ„Ó/8ŽKDð”ÎÈ:÷ä : EÛSŸ‚wë\°sĄǰÀïÁ..†›öèl “ÉЄjÍÛr ×®k|˜D×5BC¶/†©v©¥%€È’«—Ôµ[‹7P“Ïæ+jæ Ãü²õ™P9ªí ¤<±=%Ê ²;Ëóe ËÖŠó7iÿ•±¥ûº/ÌT:̈„•­ƒ¹›çÐËli‘pôNЉ«­®Ï¶uJ\½:¸{ê}‚Ö‘yóEèIÇl~g†ÞOW†$µ¦Fk:rÒ®wÀN»pÍ))8v©=|b tð{à©;Öm|Ñÿ…ßÓRi¹³ µáDñnøKñ÷` É4Hß«SEö—þ0#?b`!æâ´sõ˜$'ÓÁ¼¾y¿²Í‡ã‚y¤dfŠvïR‘Çùá ÊÄšèœ>Sq6Ãâüê%á«á–ª°Ê;ê-iÜÑRŒÁÑ IøQ”`p& À0`ús™sª-~~€†º+R´>‚©™°Üƒk %…eÖ1ú  EÇŽ 'ú3õ*ËÞ#¨h‹FÍJOëë +CÆe%ìæ@ŸÛ›Ÿ`¥ò5éÔL/æ¶;œ™\sÔ4­c0%±3„–оÔjöèé`¸D""×:YÚèõ±LüÞ’¨Vо±EÀëS3Æ=Ñî(pÎÔ¬ˆ¿'cQ´×EcÂ\‡yËåè ä™v ›&ô"z1³…k²òã±Ìœ¡‹ù‘i&®ƒHBØ~CÉŒaüžLt‰§VÞÌã./‘Vĵm@ò`,A݇%dÖ-¶2ÓßË"\\ßìe‚þñ—2¾RNªpJ¯òÄ Èß©óÔ / D¦è?΋Âpƒkð,ÿ©H-q¶@¤ kTBzãݲES¯Ò›vØBÈ7´Ã;3Ö¹ëôHU9>á »²wÌq3~BíwjÐphíïzÆ#n¥´*"@p/!¼ŠÂlÕN²7ˆt­gQ7{ÀSÇì71³dn.›_þÂt£bq¹.¡f$âò &·)#ŒèÄl×ÒK m’?šKÏÈM,Ê!DyD9( ‹’໺°üdØ=SU¬}°"Ù>¿—‹"<¬àªŒ\Ñ“ȼ¡Þº›¤Ø?m@@7:Ðu¹BH`í˜Ôº_«Êâ¥DÓ¿¹Òê^s‹‡ŒÇ”£3BUbÜzåGQpÎÔKrºðI VFà’D­SÞ[\Ø!G1£°A©V³Œß—x\a®á×Ù‘•ËbŠðwùa%)U^] 8”)}¢n’»>eáÝXI’ú)#C•—ÈG2†L :ÁDA˜aû"u•W5)ÂÜJˆ¸x€ ‰ô)¯nxð\¦• g$×j£‡’ùF²~L‰2#UDG φ€ò309 Ë܈ F¬ËP 15L6È LÀ”ÈÛ¬ÀP×$þWkMk«Ì•›Ó}ÀðtmêŠmæ5_D¶ŠH@á#1“õD/N¥ÆŽfÒˆÌìm¦¼†"Æž#,#Ùß5 FÎe×ÝÊŒÁ;‡Rêªr¤¬(3!*âN„'ÃE,¢od¦ÌqY–L|ã6 d¯ã[<{óܯ«”'¢|*BOŠŽg\¡ç(j߬ÚÍI7roâ—B§X, <¾ÅtkÆ÷‘¼)ÍÞT¢àšGƒ–zŠÕæ¬_w_ õ"sÿ hú)Û *>#•Ô”Çej¤ê~ S-@¤x(nÁ»áZÝ'O_,v–s.[Q÷^ï³ÞUîékY0\ê>ºk~ ž˜)C̼Í6wO¬b&Yiý$×­y>|à=Dã]`ŽÙŠ¡ÃÌú]ó÷0Ø–ßoˆ —fåÓKï&¿aòIú¸f¥úK.©¶LB²Íë·1êX¶)Û}ØwG ¡h©Šã¸Ûû€æõ¸qþ»Ð\Uú=—GaKÖØÈåò\06 Nj¥&q’ËÌåV0†¦Ãf(žÚxѳ­ƒÆt=IcXÝiL|”´èiƒC7¢×26F@ÊCl3áNÙ U`FÄOàÔÐÊa.èÊ^„0`F±SŽaÌa«Á)aŸ2CkIJÖusõénÄÅëæºdhTÝ\w“ŸvýdÓ|jü¥-ØË}qÕq¾ç \«ðp­QRÄŽIÊNWØ3Õ(T*®ŠÀ9uüžå#3÷B÷!¬³Ð=b8SD”Š0s=rõ~ßj© ÃO²Ã´"È-bìJçð\ÆÙTOóq%Ùmúmù®ì+ýÆäƒ!5R&Xe0Ÿ1”3”åð݉>Ì5T’G Ë3²`ÃxÚØ`åÍÐÌ'Â+ߢ«Jp 'ňûÒðn6¹U»jÝ £¹F½ª©Ó‹`[A‘÷݉q@®k&åÝàY³ÁãŠn7!Ðæ‹i¦cîCÉ5èYt”K’ ”R^áÌ‹ÔZ‰¦j mK2•`‰EhDLTbÄ$S™¹Þð@êoiY¿£åö'³˜@ÏgkËtù÷3ã_®ËpEëèL™QÑëð®`NÊQµì§Çì·ç¢•»ýúvˆü›ü²ùÐRiÔ[7Çþ­zË4å¥Põz¦¼tå­QÙj}œ€5J â,2‘ÆS^¨ÜwM|)Î}ãSìx ÿÿØsy ÐY_ZJB'°†˜ÏØíMy`ókûÚpSÙž§þ PUí ´•ÞŸok޽4šNu¹±¢i9ÕìL‹º7ã'Ý}  ác4ÔŸÑ{ìTøÜÙžº/… :M€Ýk7$ ¬¶Šñvj §qXìÌgh¼\ÓÙ :êÓß4L±·ÿssâÑvØ€$€×H’'…#¼æ "vaìÁ³iŒWÓ+¬ñ†Oˆuðü]£5 àæ…AX5Üžç ¼ýES*»ë¤í<ÖÁÒómuÙ¤JyÞ>oþg ÿ endstream endobj 5928 0 obj 4339 endobj 5932 0 obj [343 /XYZ 38.2500000 104 0] endobj 5933 0 obj [343 /XYZ 38.2500000 104 0] endobj 5931 0 obj << /Type /Page /Parent 2 0 R /Contents 5934 0 R /Resources 5936 0 R /Annots 5937 0 R /MediaBox [0 0 595 842] >> endobj 5936 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1409 1409 0 R /F8 8 0 R >> /XObject << >> >> endobj 5937 0 obj [ ] endobj 5934 0 obj << /Length 5935 0 R /Filter /FlateDecode >> stream xœí]Ënä¸Ý×WÔ:ÀT‹‰hÛíY0º,‚,‚žL‚Afgùý¨ª¤²-éPâñ%õ°ÒHÜiZuyyß÷ðÓ¿þýøÏߎŸî¿þçø½ùyÿõ\ž]ÿs<ÿùáõ?èòÔüýèÊüøý—Ãóñùðtxªÿ÷ùp}àëýŸë¿ý飯ÿûóñ¯«ÿñÇæ—οðËÁ)Wÿü÷ågåTý·ìöóüïÿ:üåwÇ_Ï3¶¯kóöÿÿ`ŒÉrs^ÆÈ«ŸígªËŸß¾ÿzøt%@Ø[Š¢PYqTÖØ£ª¬>þ÷‡Ÿê´Óg§Ê*å ë²÷¼ÈéË›\ý&]eÇÜõÞsù#3»Š0¹6:Þä—•KE™By'—ÜY]ž+yŒ‰AýÛô&·õ¡Ç7ç•‹S¥Ý[<»äæÚ¢ºHE ú·ÓÇ ¿;˵hœs^¹8UÚÍųKnn™1OîËô&¯LoòËÊ£\<»äæVgÚ\N®.cп>ýŽ)–/+§J»¹xvÁÍ­%›‰xr_Marëâ)ôëÊc\Ïì’››ë†ûµ`+¿LƒþÎEäœËÊÅ©Ònnoö§YðR®ÿܹgσwߟk; 8~û©^Ùå…×ß~9Øúÿœ-|­Žß~<þ>Ë´ùÃñÛÏ• §ÊÚÍ=ÿÞe$+.#婬²BçÙ«‘ü2bN¹-μqð{±'k®¾ôˈ†Ï|¹Œä'£Kõv¤¼>óò÷pzübüx¶‡+¹Tûí·ó™xæî2RLóЄÏÚà÷˜ X ·o‹é“xú>)† ð3˜JÄlʈ®­Gü«¢çIÙpry¶eúÞb!£ïÐÙð&ѽíÓËÄôP÷ÊãÖ˜Þmë·k3$¸&“¹ø—釛±¶·¹ ú•"’•g½ÃÔ3lÙœTIáD •i ÐDL6ZøÂ¿@5l]Y¥¹˜#¼Ó¤ °11{ãÕ3µ²}-¦žÝ7jâ®ÍÌvu ÓªÙWV7M/S£ÌIƽXaSq|»ã#Bè(mÊîÉ„:§Æ(4‚ŸYçÝÞËDäQÆšî6Î É“ ²W”SOP˜é–w'"}ª¢CŸd(d;pPìžð¦šeàð*¿h¡Q(×k9rVMÖ–¸b°ª‚|z|^ÄIì‡ÎtEªèË•Uùt&ŠÀTÕ‹v#,QBˆø ‰ŒÆTù)«Ì[¦Âç· › ÀM/{Ìd¦7ž‰ãS#’æÅÂõ,¢Äã`ã³Î‹Ÿ˜áø¬êj¤€/ÓÄ›1q³õyžw( ú<¥JD EÞŽ¸ËEf:ßÖ4ô¥ê˜lhdÛ!ľI©ÃÈ-JÉú7Œí0»&¿‘•1pšÒ¬wfn¦ïHÏx&„ LW$øcZJ™8 ‘ §à‹ˆØãö ƒH‰æ}±vôœÌ€'QÛE¥I,lñ (×c){BáXÏ`ÜÙÌöÆPúF#n ¢‹·úÑòÒ˜ž¥é,fó% ¡úœqàˆw¨¾õBõ9Såã;¼J ªOrÁ3ÂÀÏ1ðY¸¡7¥®øÏYs‹©íÀKbÃ4€k3¢ ý; 6HƒÙ!ôj±ÅÙ!ôv½lÚ®ïz;„Þ¶ ôòâ&y7¡—W·J¾Uú?;„Þ»x,¬Ñz…i£5ó]¬B¯Èó(TüXzµ7>NÅsö2ö¤êÉ£G'v°?ñµ-øÌ,C :£F)²Cky÷~‡ÖZ´†_§tX/´ÖÙ¿óf“Ak•YkžzJe#dÍÁ8öˆë5Ì_¢C5HãµáÙÝë¥Þ2lçˆ"!Ϫ‰ÖÀ­\µ>sã²Tüuº¨2ð»šÔÓP•_iG„)ËÐÇTM®êè¦Hè3¢Àø…`µm½ÜŒJA=6ž¼ÓxÎ Ýïa:'“c6¥ÊÔ1ýͳKá•âVÉ&'—%³ '/:Úk#­ –™,R„pn›èRî '¶?Žèöh¢O‹R}[÷|šmتñ‘+èbkaßaöMáê(,F§#A6Ÿ‘ ¢§í;öa#ÎÄ L(e¢Â²1Ìùñ_ëmª‘0öm.ên,/7¿AœL0’õ ¾£#jǧêªMlZ}ž,Ÿ™#keo¯` q1•½Í$UÃ;óÆŒúÀVF@w ‘Y¤Âĉ,Ðe8eÕÖ …ŽüÌnˆ¤@ÿ×EGMn-Ò½äü%À$nB[€¤YAê7q’$n•šÒUÏ"æë»£æënÄ+vio´y„bƒ–M4'JÕÊs­-á§œêò„hÝ"K›(Æ#{y§0­ÒsÜH²8¬DÀ0öœLáñl‹]²+[Ó‹¿‡‘½Ï„bxB§§3˜\çnª!0e&ÐPŒwUäîIÙûeñëDŽÖî5‚^þ¨hXŠ?¼]+*$éÉèÓ€[3"_Ü»ö¼Aa¥ðDŠz¿Šuº,Ð0áËÊÜ_ÌT/A#ÌÿLu×üáC<ۡѱå@\'DÁô3w£Ã1÷0ÃËøvãBܸ˜nàË–eɺ¡}C!¢pð‰RÔ¤±Õ*ÛJB3Á „sPAS\/{í#‚eîËèG¾z—.—Љôz†˜Ô1|ãØiÄÒuO+†¼ÁÐÁpÄA¢£‹"Ó·òeÇFÕ_‚X^UJ‹^©dˆÄx׳žØ Xu¶‘Ú;*»#›YNÚByÒ#›uskè _ê SÑ”ÆF",]Ù®(š=0¿ùŠ[¹dQyTÕà¶^‹ +{{åck¬_ñð{ f`¤9vùIwAô›z¦A‘z¦BÏ´7‰êž‹Ñ˜äÅÉ(Ýá‘+÷¸“é±ÄK@§›0»‡ÔïÁ³yV€w¡ §NîC³epm_ ð{ÊÖý¹n«=uílÝ$ñì6Þ…‚ ¤¨‡Öcûß&¬\Ùaþù®Ñõ„<ˆ¾W&'BÝ6—Í•ápª›KSÕ)Âиi]SÓe3<’¬Á†IŒÃéÈ€"¨DGý€..hˆRáùZª¨'äÉ6vÅ<@9~z׺®¾›«jQ¦ôŸ`Ñf¬Ø±ÔuÞ@¾`(µT‚gÖ‡lÊ£wör‚ØÅÇ«'joÂ*k³Sù: ÕäÙ'¼ë¸’§DG1EÖõ•Æ[‘­°@V©ºcj}ELþùÆ—áÅÏc¯žaYFÔ~¸BÔ4'.AD«rã1}?<Á"Ñã`4§2½æoª‹ø‰©t›Äñ &Ò¹L¤Í ÕO'ÌV HµQO¿36ÄÞ\ር9rÌë _Ñ%É„JVݽ•Lcô4;ÑoÁ´ê2Áve ûßÞ‹¨]VtU"Þ&Z’•À¶{Ut³Òž°6Ñ“:¿+UYõº]}‘6º¾ ,0[44ɦ{9ƒO‚†³TF3À¾L²@ôê¶d!{”ã]QŽTðeft{„[D-׫D›-˜¨ Œ©Á‘¹zŠH$Œzm¦©ÿŸkîð2ÏÓØ/Là®rˆ¹LmyfêÌFÇ,7µÿ•¿ÜÀ]µ¿>é«j5r ’ý‘ƚѧ¢[“ÖÜm:´Íè=fL( ­í±ùÒÞIjdVض+¿†Û–Xö>°aÜÅ…uÅÀg(<|¦a[ôé¯ÚGX†;ÿ½^q»Ñ˜vX7CÀÏxX²'µGø™/ˆÙ…w®Má}…ÔiÒõC’øü ~ªÐ3[a§…Ù°²;=.ðôï:1.3§FÚN;:Xz¾¾3zT¥<Ÿÿƒ¹Œ« endstream endobj 5935 0 obj 4525 endobj 5939 0 obj [344 /XYZ 37.5000000 488 0] endobj 5940 0 obj [344 /XYZ 37.5000000 338 0] endobj 5941 0 obj [344 /XYZ 37.5000000 185 0] endobj 5942 0 obj [344 /XYZ 37.5000000 488 0] endobj 5943 0 obj [344 /XYZ 37.5000000 338 0] endobj 5944 0 obj [344 /XYZ 37.5000000 185 0] endobj 5938 0 obj << /Type /Page /Parent 2 0 R /Contents 5945 0 R /Resources 5947 0 R /Annots 5948 0 R /MediaBox [0 0 595 842] >> endobj 5947 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 5948 0 obj [ ] endobj 5945 0 obj << /Length 5946 0 R /Filter /FlateDecode >> stream xœí]Kä¶¾÷¯Ð9Àöн€ÀÀìÎl€ v€‚‚µÀˆL|Èߺ%uï¨õQÍOEê1òÀîqkD«ŠõbUñ㟾þ#ùçïÉÇÏ_ÿ“|k??=¤Ç"K›’Óχï¿Ðå±ý=)Ê,ùöëá5y=<žëÿ¾š¾~þKýÛÿü¹þ÷—äo¯¿ü±ý£Óüz(TQþûüYªþ-½|ž¾ÿ×á¯H~;ØM×óöÿ?cSmO`ŒLýzè–©Î?¿ûíð±A€ß,y^¦¶L”56Q•ÕÉ:ü\OÐ Ÿ+«T‘Û"2Q¡/3éê„öìf¢óÌð*ÀàÆèpƒŸ!ÇŠ2¹r.I\SÚA¦ªBà¿>þ‹2 qÏ‹c¥#.]’¸•ÉBîÜËðð_iU…#îò`;.HÜÊԚꌠ¬€þËè!hkunð3äÒHiI‹—¤l¦²€”½ŒùYH¶9CвppIʶÓXÙ­Í6A×á ^‹µpƒŸ!ÇJG[<º$q+Ûm,E×áÅ/Ò4(΋c¥#îÍèÏ>£`Pšo€/÷êxñÓËáãeÓÚ~É“—ŸkàÎs6/5R²äÃɾ/UòòcòÇ45_~H^~9TÇ\gˆÍ“ô>ù„ž¨=ÑðB røÄ¢'¦ôMW6íƒôóùÉÓKÍ ¡é¨jCut ˜ÂOð Ä"~‚i¢ 'E¦‰'}ŠHGSvÿd ´‡øu`ÞFÄHm ò~åæYü2²Kc^„;Õ1ÚƒèhðSEäŠ"ŸÂ –Cî{ƒ¹"&æ«læ³l§‰˜ŽdIà½íàx¼fÇè~ÄÆñCSÌ;æDˆÑeø²y:%ug~_V§ð Æ<ñÄ@þ§lü„OÌnZò±«lj ,!q*s`ˆ­Æ"âN·S’‚ðNÇø]gÔjGûKgåe˜xæ>ÊšåSúl|‘†‰t S‹HƒØ$µll‹CVìöËZ퇅)÷³Æ›åQì3;âa÷2q7Ç©5!Ódã{x¥¾ÆëòÖëˆ6v‘u‘oœÑê³ð‰oå5ã¼AÁPº Îþ‚)6TªNòÁIl \³‹p"’cx˜>åHk"rþK¿É¸Ã+ƃà\/"KÏ‘>…!`rñp†Z]˜˜lJüŽé{ó…_„MÍôÉ ”s$¿3¬ ¯!í ×QÏ%¤¤ÏúÐÈ!Ι«þœx›IUáØ‡‘0lŽy¥pXjÛ 0»„ä¾@>Œè„¡­þèÿŽÆˆÂó`Ø*ôŽidËPž1Üó-a¡V‹<{ûކO0l­Üb <Ú'FOT³Ió£>'ß5šÌ¯ÅjwÆ ÊKYé%âvÑKÜ…î­ËmÇ)(á™8²f±G7V(ØÊV=L98#ù±¬Æfǘp*÷pu0º?! }Ã8VÝ & v¡¬&\¨«c{ƒ?<6 °}?ŒŽAbù-¼;RÍè¾äq8ÌŠesJÄnùI¶Md³É läàB:\g†GûÉzí]…¥Fñ hk-”²jíþpËü!¨ù+a·Ên¸îÕY lÅŽA‚ëÓêÆo‹ÆF¢µ¶J’2àDZ÷0&všdiSÌô„bqÄåÑ_‘ KxI}ÇÙ6ßúç\”‚Àdy¸Ÿ‚Шqp&cbâe0Z³ÏÍLχfòØ,Ké~>X©KmožMßmÕ<‹ÙM£ÊË·¼&•QŒãÉ{ÃôaÚS{”TÌÏÖðŠeë|oö~›Ë¡]dS϶Ñ&!¨2zñk_WmÄ.gR€-“ÌDDïo†B%êñ=ô£4k(Š®ßŽÁ¥øð Nâ)Мø“B vqCܾÓ2ðÅÓcë‰BáRuÑ%GëL{Œ&M bÞ2<†Aˆµ]¾¿Fó"æ8ŒE˜¸æ  ~Òs…jü±Ç> endobj 5958 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 5959 0 obj [ ] endobj 5956 0 obj << /Length 5957 0 R /Filter /FlateDecode >> stream xœí]Kä¶¾÷¯Ð9ÀöŠ/Qæ ‡‹ #‡`Û0b#ò÷ÓÝ¢Ô3”¾’TCRÒ ½vv3Z‹Åb½Yüü—oÿ,~þ£ø|÷í?Åw÷ûÝ·Cy´¦lÿ)ο>½ü¬îÏ…­Mñý·Ãsñ|øzøzúßçC;àÛÝßNú_!‹¿žþûµøá§þèþÒù/üv°Âž~ÿ÷å÷ÆŠÓŸÊþ÷óÏ9üýOÅïgˆÝt™×ÿÿ“Rºi.hLLý|è–).¿þøþûásK€e³TUÓ4e!´Ò…h´,þû¯ÃO§ :ðå±ÑBØJÛò-Yy™I›BÈótR &ºü >8p[–U4àóàTª4ôp›kË G ¥"Ðÿ >p©›xÀ/˜§J»¹ô›«tG}¡#è >p]•ñ€_0N•ns1ô›«kG [Å ‘üÆDùÌC¥ÛZ<äÎVVµä16}zè1ˆoeD‘|Á<4Qº…ÀCîlmš˜Úö >ð¦ñ€_0¦m1ô€›+J­â ä+ôäBÔñ€_0$1ð;+lDU{…ƒø2¢wÕbkg!ð;+›˜îÏ ð€ëˆº¶Å<–@& ‡Ü\]KG Óè߃üôoDÎ9cœ*Ýæbè!7×Jídcè >ðº‰ü‚ypªt›;€þu ŒJû9}&Þ>>? ]ždaU<ýtBî2gûÛÓ‰(¦øtJU<ýX|)KQý¹xúõÐ+i:Û/²A_J¿Ü¢/B£/ú~c0x=åÝò1k‚苪Cb 4¼ %c…Çp¾`08„Ø˘çžAQŒþ"\Åà^̉p”‚_0†Ýì’ÖŽÁçSGµ’üá餞ަYZÑe«VN†¬›²Û^[™ >¾ªuSz_Z²ë£VmrÓ'TíÓt ˆ†@0x8ÆéÀ±y0 –'œšËu4ºªí«1ÊŸâ(ÚS!ÔQÉZœfž±b4pŒs‡Êã9³e_¸CÎQs»¦"+cc¦ŒÓEX»Ã<æÄÁs,.ôQ Ï«è ¡aðóA‹uÕ›ƒµ|„óÜ£/ÎéÆÚ…ÛåˆTqZ%«IvͱÉ@±Éwâ /ðÿYÁ×ñt"J…£¤ð A%¼ ¼˜E5céxoñbUH ÈVŒ ÑM4c Á˜áÜÅX ¤$ÇÆuÚµVž'|óGø[¨Ø“Ä_~€^”ÄqˆAlqã1 &=¢ˆŠ½*­¯Ùç‹M%üÃLjÏFì/¦a(#­9 e†¶&Äô` £ƒÐCSùÂ$‘@U÷L%#." Ï:–]¬øŽlbÙ…e$¦”“ëI³ÃMç__k„½1ËÛtôÕ¢žæEÌq˜ŠX‹qbMpï1WôåÄžñ<ŒXà>ãzœjʼÐI;v³Â󿸬nq±½µ{‡|l ž!NŽ3ü2VP!„1B€”`³÷¦üÇ•$9¤Ftµü„Hå¸MÐ Ü3,º¡HÅBHðlߘ[”ä"æÁê‹A·m¨£ä̼œbM³É=Ót›¸ÏäžÄz‹‘Ü“Ýö.Hy '˜Vrv$¤á„ò2h0%qš S'Ã`ªÓͲ1hŒ”$‘xÄé8˜ö# =„¤[`Ü`Šsaóà43Æ U‚³ê5L*ãp_¹¨í•«óšœåv[0©9%èYœýå8„{9ÿnQÿ?߉dQ‰ãö1\R¼@"¿`é!®à q®æQ@8þívï àÜ:‰D(O1·ÍbdV¼¹ÃI÷uI!²àsPj›0DzQ¯QºÐœõ!»Osd6) ‰tsð<çJÌ0»ÌˆÒ¦Ë.—qî#âcºa¾ãØ€¬"Á ª‰H0 –Ñ6hžTÕFÔ…¢ÆS†îjÏ"‹í£Ô}¬Uf&DY{Û¤pÕãÀ'¾ÕÀ¸µÅ ½â süS KíŸÃàÛcF¦ ZD.Ýtá)#óé O‡°¥RœHáÏùîØâÂ’ÅÝÇy£›58æPÏë‡GÖå,OlÑ)A\V8‹Ksœ5ÅÇçyä°ùjNÝBXñˆKÑ1E‰B9Œçº&£ŒðÃjËŠK? 6ÐÎV¢C%8I’À‰© ÓR]€#L|N_2ÆMÂ(~mN}á…Zµ„û$qÔZ 2qX)@¸²!zS²Zõq’µ‰Êxq6zóî½i3Ð7óK AŠ¿Ì?ËáúxÕ…hF‹òªËâë²[¼+Êå±­z÷ úRve@rPnt¿|Œ˜cc8OŸTëÜwû`ýnp gW$e œÑ‘õ¸|Ù9Óàça\AZÕ1É h®Hj䋆´Æ+í²G#+m¿TG%ä¨Bà SBsÞêu\ñßÝðÎaÜà.¸¢¼Eó`º9Ù6 ®” 5ÆíÒÍa »ºÀ4 VzÏ)Ä€Àú1‘_Q«îcØ^Ó‹6r,.Y ㅉͅTÖýê%‹D» Nâc—& »Àa:.›5ÏöªDsV8QûÇäbô"Üò°Î7§7H1aÐRž%>p‚Ô;,ìlù^Á­›ÎD÷€Œ®}<ñ|Y÷IÃW)¢Û¦nüµ1 VÇGeÈ5«‡æÔjÿɬ%“e˜Y½Ãf*B!¸²Â˜‡8ÔÙs²9±JVý&#…1É€eyc­/Ëááˆ&­/è¼0Y#Ÿ¤”¡îoîæOå»ìñÔ1½Ãx œ´5.a«à’”°…'œÒ ¢aFжýÍèÁ—ÔOÃIªÇ”ÑmóbÑ“‘ÑG,Õn©‚®‡U*Åxg‚ŒBVG¯ Eaœ®q;Ð&ccb4™I#kt3MùD¯ÐàrS¢üýœq8„°BuÆ\ÅyáƒÃ£)Û<5UýŸèIAq}×¼{Ñbäöß‚º°Ut‘£K«‡8wõXweq· |ç3U('èÎåô'½–Bº‰²ïGš=£ìeÏèƒZºidMc6ãeÿgWdÿ'˜—³þ&!L?%?7±£ª=4‰‡þpGVNßÈ) 7 ÁãE½áÝø”ÚeYÇj%TaÛÛ)ÈbµÒÁ>:§b˜«"ãv6Qˆý‚‡Ö8e©hþÑjocj¹ZyR1YÁùü «´hA%V¢S@Ü0dT¿±â“»,ܹìˇ±¸~ÐÛÎ'1Ž4Cril–oX”`¬÷ƒL»Â dQ–¾#†íeNvcØåÙo¸”°ŒPȲϵå2Â÷XF(¤œQ(šËyšÂ¦pà?ho²(qlŒÀ“®§z’ÅúIÛ¿}¸å ßMôã<DIàl@9¯]¾³Èa7ˆJl冽¸7¿cTàèÜÊ-Žcj;«|é”Å“]mËõPJõ‚6Héªþ®JvHËwéªþ†@vH©1ù^Û$'õµéû|4;ìÍ•}Ò UåÖÆïYUÛNžÓ?Ëb–,Þçyä÷¹ÒT’‡¨µepÁo8D ¿p¬UéM…cp!»œSUoCIâ‰0µîÛo:L}E‡©ñ[ðJÀ¥Á1œ 7~ÝÙÀ1ÃÔJø”ú8aêÕ XÞðÐðÚ•m¥,&®Á©¤ñN†îNðPÃÀ/xŒ€¶(~F?#á< ëR¬•0nšÄ–Æ Zø¦"¦^Œ^㯛Ɖ߲³”Þœ|Þ=Lâüû¬›ÝA ‰ 7Ö e˜ªs·®ÝÊ·äyÃfʉÓ&?Ìy4•xËg‹¼.ÏxH‰Spœ2¹bDw5'WÊ \[M`4JOï}õñB}«¿¤I¼} ¿l#‰cŒš>Ý8áù… "ˆ˜ÿ9g&ì[©p‡9¯Âjü'£¡Ç>å2qÒ±ä´aëc¬±3‰åGÞ2^7%ø¯‡l±¼Å` ‰×ƒuÄ€8%xO14L7F”Õº×ŧ´k¬œ¦o"ÍMh‰D:}ÓzŠ!{'ö8Ÿs+ƒ5Gb-¾‘؈|ó Œw±Ä`¿€S*€øølâóŒq Z¦éx¼RVÓ2FK*Î:VqW¢]ŒX«&,u6¡Y*1ÃvΚ%k®faø„%ŽænX\´µÏ8Ì.#›ÖSœÒ¹T'Úl;Öm²™ÜǬÛÈ•fÝFà6ÿ±õD¥“?Sa¯­s‚¾]¿Å ËwRP¹ýKÑq˹ÛÓkÖÝg&C:æ"Ì…rNÙÊçÜ:¿;ŸôãNþžØ`V´M=Wè9Ð׸Šc8N…?cÖ,»›9/¶›sWÞ fÁáÈÃζîl±¾^uÊJPkì[h+Aw\ jíŒKß1NÓ¢}TÁ.ëÍ Èõiž\ƒ¸DÂÎÏ€QQ§õk³˜Ú\ßo_-úû í¤ZmÎ&ݬ­Í[*1³ÍZ4kѬE³*£mßi&˜È“5²ò™7çÉržìËòdWÖÝ€|g`€å.–¡¸j˜hpkNÝó>õHLy*ŒÏ•9·ñ|œìYÎǙƷ °kÍw,r/dc§ƒSìÌèɣÊg«ýåý*—¼œÅ8Æ’YdÜ௴GÝ—ùÅÓ¯âùœœûëÔ_˜\=ZY"Ô±g úõn1c+ãìˆ\lu»>jîödä¹sç÷È£óA^p…€ÊæÍ£¦|1ÜÝJ‘„µ©öõ~¶.Ð1÷x;a½,C`hpŒSqbÑÒ_taå2ÜùÏ'Œ_›jc´Ãöd<†`Èž¬=Âc³Þ=ˆñФŽkž6" œà9:x žÇ]Šë³zã7‚(œ «}ðüsÁ¿éÄØR´wt°ôto:½3¥sН‡ÿñß

    > endobj 5969 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 5970 0 obj [ ] endobj 5967 0 obj << /Length 5968 0 R /Filter /FlateDecode >> stream xœí]ËŽÜJrÝ÷WÔÚÀ­ËÌä0Ôj^®/ /Œ;36žåYø÷]ÝdU·Hž$óTdd’E s¥iŠd222'^¿þÓoÿqúÏ¿Ÿ~ýòÛÿœ~þüòÛSqnª¢ÿuzýýËÇØö<üýÔ´Õé÷¿>ý8ýxúöôíòßOý ¿}ù—ËßþïdOÿ|ùß_Nÿöï—þqøG¯ÿà¯Oi.þ÷ÛŸ]c.+n¾þü¿žþõN{}âõuÃb~þÿ¿8WuuýºŒ…Wÿxº~¦yûý÷ßÿöôkO€°·Ôéœ=™Ò•'Ó•öô¿zúóå×Çç®4¦©Ë¦¸çE½½Év—'™rò¢·ßB—¸-Ê*ÚÃû•‹SÅ¸ÚøŸ~nëáü;ùîö•f¦º0UiÚST¶²egú­©š{z ®ªÊ&ÞÃßV.M”©ðÃ%w¶¾ðNOç"èýñ~Q2ñþ¶rqª\÷?]rsÛb×MB·§Ç ÛD<¶o+—&ÊukáÃ%w¶«Ëž<¶Ž±µ·ÇG ¾³¶‹·µo+§ÊuoñÓÏméŒ{U7¯ýºÉUÛÚËß7üº“híUG6Qö¤§‚]YE|øÛÊÅ©2løôéßBž‚—Òÿ8?<7~þþôë‹)‹ËªOßÿ|YÜÛ;û?¾_ˆR~y5Hëêôý§, ÷ò‡Ó÷¿Ñ]ðh¸‚²@W*x߃yÔaê+°:%þRL¬3°TehP…~ƒçÓÀs² ð *âœâSï°.ÐÓ϶°öúÖg©·¢W–EÿÊ‹7=:$M]½Qá}z´ç¶+~¾2ˆƒ¹+_4ÈfÇ߀ÍYeï(qãŒïÜðmå¹t}te|äæö§AWqjOM]Ilê–mÕˆÌc/ÎëZæhؾÿ $ø ÞƒeÇ øŒ;¿zÙ—Kkä ägÏ &Ȥޯ®k Žsïù<^ñbgæ¿+¦61¡4!no€¸sUÖm³r¿ñ=-¼ÂlÜW@.…W<‡üRgOHÌ|:³X7~qMhâxPTÂWíY|ÚVÒÜ{±b!­=¼Š×¶^ü o¾‡XÁàÌÒö\lŠsݘ×-c®KXqOù‚¾g@!fžV|‚bç q4àñÚJxÏà/άÀ³¶gx|þÛOc¯—V¬ ¬ÂE|®F2Òµ›Øp;ã‡`‘Ê(_ÏžAE`1¯cùµMYdÂWà‘ø¼¿Àïç}p·Mu.:÷“FðH‚Cæ)Yp Uw¤›ˆã7!pØiYïÝaÿfâÝ1¬°=Ùr“éŽ)¯¡ã°}õØÊŸ¤ù„® ³>§áÃ=ðiÃÁŸ»§§i&>ã Ÿ²È ÈÊóø@š~¼âY[ ¯Xøž­ÍÂ+WÑ3ó=ð=ž§»`-|¦5¤ÎUÑ̬ ?öÖLüÈxÕÃÙš{šƒ{Š9ä«’|4ݲMà‘œXô‰„,­Ñ0b31+ t+†j)‚(:â¡#¾co…<=N*{¸jü̳¥#üHQŒ2–­@ÄVâŒAüíÙ~ŒÜÈ÷xÖüò9›ZÖ˜1B¡(þè9“]Ÿüà9Ö¨l3Rfžm+&†WB€uÌØx € ?¥98ArnH™˜3Bt2£'ŸBvaá,+‡<Ò¯ À §tþôõÊ2ѲÕî±pEBvLL?>@äc}ˆQWc›ù®èÚÇfìKÝ%a±Z˜löd³*‘ä7¯é-nTÂ+{=JŒüŒt óïîòl?°ƒ _ VÙdÄG‘lÑe§cÕò®àDZ³©CÁ³bLÅÙV#îQK‘9”Ó}ôÃüD@e´ sÜ h) î’ÅÉØxã3 …‹âdb«D^æP´†œ'"ºKAAoQÐöå­”)üÀTˆœT-*š Þ²ôÙéŒB!þø!ÓŒHYwƒŠ4L޲¬bOŸ€æŠ¤Ž‹~1…i±CÊ;[ŸÅ(™ %BÉxœ âxd¦BŒÈŽ”%pÖãД½»^<{VÏ ï“¨X€¢¨’uÆñɨ,T–>¿ZMb“Zcÿd4ˆÈ[Qc »¹$Æ£®\5Ò‰jÀ˜¨¸—-`òpZ>ÃbÂ(HLT.f-§¥ àgxΪh*¤Ú±QJòIàgòe}X@¬v‹‹‰œwÆäk%鎋þ(å+»M"àâ^“ô4vŽ™¾(ØÇ—ÅW —2$¯›íéƒ)ˤ_îÆ5½¨ö±&LebË6¨aœËk‘ëŒÅƒ¹“p=> hi,´Tù˜'ôwµrø¨p$V<a%-ɈÈê¦ÄÕgZFLïÐÔÝH)z¶ˆ‰›¤jèåI ÁH(ÁZù7T¦‚V`.™+ °\kïøè#ê¦uSKatæÖš2²©L¾`d`>¤c¬.dfY`íÁ@ß²éð ð Û©áffžøã¤Ï´FÃý²p@çÛ‘ðüûœzÞñp•Dj_lÛV$7XM—uNOwk>_'“þ¬àñh_$¬ˆŒûS‘•T…Ì‘õœCYUŽ7™ñ3E ƒ½ee¤j¡@?ZTUfwt[ªÅÍ-,ÇžÖ¾Šƒ¨öF¸¯o܆^”Õ×qLg¢bRcDXT6VsØXÊ6{¡¨€ô¸~³lO¶£“Åh‚€òeF%ž“µ{Å„ÁdGÌ0v3™a=b,ÛšŽŠ!)ù”LÛ<Ï÷gŠ Ëã ‘4c9‚@ëlÈ(A 0^…˜¹'©‰éDÂè@BÎyÎ+³‚øùze7R†T¼‹°~©® ’'šÜ®Uø‹¿×Ú¢”!¥Œëz'„i ºÇá=EŽd1ÏÐ"J·iS5n*ŸëˇsøEÀ<áÔ Æçf†ù2 ´GÖ<䱪àÒjõ´þä´¢”íàÏx¸Â>¶–¨ˆZDäc[ÔcF>ò±Óåt0ngð5¥u¸rI+îõ`Nݘî€Ã¢«ˆ( OLÏ´‡ŠØ‚ŠP+û:Á¡²R9CgL¤)$×W´ 82ø¢ÖÅyc^˜1Ö,á ‡hÐFÚËörɱwVÆ1­äè 0_sí„ú8M6Ž^¾ÕoÉÆ÷Xÿ“‚®ø€ãЭâýHìjH·È™ð>à¶³"ås¢Ãí=ž¼H2ÿÖZQ ã‹çYÙGo6á6MÌh²Tia’HÂò¬M%ƒ ¢ölºjlN” Á”L­¾GX¾Èv#JSwß]wÙ%"(ÖÃ9IZ~ ·oÔPû5Iì€:}I)ç2Q…LpÖ]ÁÙw—5;cÈ×R€Âº[—ɤ¦nÈ«d²ò´Z{3¤}sÛ3¤.ÓF*NJ¶K´¬þ”M„Ž®˪é…tfa`,‹g÷ %£ˆzAª?Sg¹77P«l#ùè#Ùöã…e,“¡·>š#×F¸=™n>¸õ& Kw³‘o3:ú£‰g3se Bu¶ãÄ$ü4Ï=ø=ºÇõ{g,*›5ØFuš'Ì}iï©áª¼W`áü¥æ+\^A@›³›p)ÞŸ/:=—Ög÷vJ>Þó® ®ÀtÑõ}ï–¹2‹VÝÞÝMµˆÕ<¡~=*NÖ.éÊÆìúDÁÕ w&Œ”ðI“aTÂ^öUñ2äÂŒ˜¾UbÀ°žYÝ4&<ËXÚñÖa¢ê»óÄtx„Á”anŒÊ1^‹HQ@ªÂÕÁ×­P“Pf0ÚE¤ÅcE#Ne'6–Xy1ú`½ø‘Pm‰’Ÿ‰òŠã >íþÕ4þâø¶kíHÃz,Iߤü/{V0åÙŽyh%Ï´ž™á •Èœ¦är²Ìó¸Ù‡Œ"™dÊæOöé“•½fr¸—A%÷°ÜÇ>Ã+ŸÑÓ +ÞSÀ ¦íÌçÂW0€ sW¾„¯Àâ§Ùpºá l2·øžò¼§ ¿ghØ7Gx%gÞ1¢ƒÄ úžá=ñçªé~fä¹^‘²Å²AÂTr•I\ÈÚ"cŠ.6eYÄMbÓªéð H„#¾˜â­S6è6;W3^¼h§õ3A OŠ:a\o¿®†–LïJ1~7„’ÞcÞfX¶,Ñ=»ÇÁð–U¸þÌ‘(‘‹¶• /j +a¤ï:O•J®/ôN‹Ãé]{ÓFL"›ƒkóh°-_Q9gMqÅ.Kñ°³· MwXŬаïÁº€xZ~æD,•—ΜŽþ°Ía§íVÈÜÁËÛ´ãÇP›Ö^·jh,4“@Äg‡êG.LÍô¡¡LM¦"ÇL€#»s·ÙÔ!Qê^¾Ø—5j¿Ôf¤^räÁ¸]‚<ô—­}ÚW|:¿TæXîn ‰DÞ¤'G™0¯u¾°Yµ~rŸÖ4¹ Ë®{ë®c|×ýpÝ?È-×]‡Ë«å.Äåœd ÛãdŸŒCÞx BêÈÍèª+®õMé‹ð÷V6¿-,a'~œ´8X˜# ¦è`'Þ’Ö\-ç™iþILnqÊ®Râ÷Á(ª‘Âc {<`3Ææ!Ø,7edIË—·q„/áZ~Ûš'v¨Œ‘ǓՇ÷hYäBLÅ“Öß„—hSPb(lG‰ÑÂI5± Úœ 'g¶’9{ššŸq»“%éuJC7VtJŽãØPn3>„ãÎ I ê‘S›Òv˜Ú5–Póè2na¨ÖÃäñŽ|ùœw”Å…O€ì¬Ür’i—‹z#æô„jìâíÓaüÆ=Ϲ3xI–øi`E¶6ÓÞY«ë6£½D¹×sE±Bו žvq÷˜ÞàŠ×«K”ßrSØ{ô*Ÿ\qKŸ*àyÄçÞ´Ç»wس÷zµÄ®¸¥Ú053Âgî S;ÈôÆ jbñ÷,ÕÅëìpãîÙáUÕz¾¯sÔО:X,#‰Zz|f2á¾ÎÜ—÷a‹k7BbçÁ}Æ\{ª9XM¯ºžò–?—±åg°V'’q¤‡K3¶ÎËb6u»=Ñ´˜MÛ,Ÿ C£å ÑpÏ%Ù® f‹+Þ ¡ýÉeÎÖæçC+;ÍÆR~™‚žÝf‚ÔáŸï (rõĦq´‚ø@ÉYi RüZPõ½Kq-Ùr1iï©Öõ„öÐÂåqg.KÜ“~poã ‘ú• hzÒUW¬"gïÌa®ÀôUòL<1&Â~£ºNŠö¬Û£Gç³¼BŽeÞ-*òˆïaÕŒqÚLø¥[Á¢W;cGNở?/ëYþR¼‚~©…÷táW0uŒ,UÙ+FF•ÓÊö8ZŸ±žó„Þ½eŸ¯ÿÀ½0l)“â ïñ¤éüx7¨¥äC¿÷V|r°˜¾¤Ä§{òåã·0f¤‘͈âÚN¸"íl˜"h\±Ã”ÿŔաKX˜ˆ f\ÙÆtt˜|Ñ-š*µJ^E©å6¿wtkŠ #tU7ÒI÷Í!=8΄‘[ŒªÍõJ¥Øa”º™ˆ–…)ºrlZ¤–£LS =tJ•ˆÌ¨ˆadn¢S7åC¾.3ƒÃóbéÇ¢/n©NVÖËäØÈ¿æ¾Qn'‡8n•pÃ2¢SŽçÊzR§k¯¥ÕD‹É”mÀ)Ùª¹§ÏH黫eèÆP ¾Â²”G¹0¡|Fr$ç»MçûÆ0Ûrl*`·™Á¿ÆÝfC$ivª7h÷q¬ ±CH:¾,‘þ`îÁ²¯šT™H”h yÙ±wÔÉfN)Þ9l0H-w 0¦E›Yj`sCªÖ»ÖT«óŸ}°Ò¶Üz)¯Õj–bO­DF`® `„¶¬GïHôÙ^¢kÍhÓk]S8¦jªš1qÓ§³lždºù3IÝ¢À²ìHMµxpÆÇ<¿(ýN_"¶5øR$§2ß T<' ÙÙRÛUc›M´•Gà1uzØS @òc¼T޲>dR0ƒì3v¡„¦Áv Jh”ØuÙ²­\]~vÅÄe|ø¨ ø¦…k *keyX6>Àw+uyxÚWÈ÷åoJEb¬2¦à'FvѪ bm*•ö2ÃŽ©iº„ͲÃCYM¤¿l™¶È r Þߨµ-JLÜQÊ!f>ƒñÀÁ °ñÞ]m)?œ“„ÎIò,2œ¯”c.ÛN]ðWî)AÑ‚AŬ£±ÞÕ&•OÉð ‘ù>ÝgüœðΘ¾ÊQÔŒ•)u €T‰ªÙ”ì (†Â¸ª¬Ì䣉¤tŽ¿Ø¾¬ß}’×êHÀÞ|aÛ.Û•)kÐyQì%h?×™±Û-4ž5æ°Œày5˜iˆâKO‘Rš¬çÁ˜ª<_˜øD(ÆÃfŒIÆT 3¥ø{$L>Æ ¦–£J7‰`5Æ. 6Æf&µ3…¿CÔæ|1 ãGrÈ#'‡ÈÀRŒÕÄ(:Ù¢bÕ±ç¶óú:ª(w#YNMk]g /2ƬL§ºâL b¿\ºÉZqÙ¨)•9Ù±ç "ç—¦ê\GM- "•Ê‹–! 1éEJp«°ŸÈ ¥3ñ—àŒ9¡¶#mÆÌ8`Â.±;a­ßÄÉûd'+gI7‘xŒâ‹Z;Êÿ –ŸqK¡ ´XÎ…øØ0¥ƒu¯jçÌ!pr8Ûì¶°ÍšüËKSÂG±é]Öfó[DŒ—lK~bö:MÐŽù˜ù ÿðGÿððsmÃþ¡, ŸßS¹Áª™T|hõÓÔJûÊ VíÚj¤CºÑË–øÊ68Šlê$?0uÓ¶é#C¨¸žHB)y\«Ä–é€éé§lÉ)àvÕmÝpü#_žƒÃ$H1iD©X€“äyÈnjÇLUŽX!@« M9f¿$Ôœ"i²%9»lɽ-ªú‰¡5ÞS"{†ÚÓ¸¶vHѲì¬ÀM•“ˆNõñ¬m ߊ¨%kÛŽ´äœé‰áÅá´ –r[]…‘s½8&ZH½3ïñÈšT5RGÿ°šæ¸‰¼Ôã·ä²í®N1 ãCÄè½$d{ïQ‘vãÿWÎŒÜF½ÔÈ®@¾$­>2M8rW€ÂÍþSM¼8ä˜WùnSÚd ÿ0Áv*γ“`ÔYUf¬ò´Ú(xêÀê˜Å=EkÌùø¢…/‡(6YÜ߃ß#Ú‚ÐCüŒç nj“=`®lÃT¥¿‹‰¨µEnŠjA«Lá½ZãoÆœL ek7Þçôe@³ Bf{ú©¤jeÇ`wøÙ†1GœÄ+ˆ‚°¬}C5cK¤›Å=ãç¤gøœrëjlóÈ „»,3ˆÑ&LQ@l·RO¶)å¹céÈ…ÑÓ˜WñÚ’kµd+ÙÞ†cC1¤LêaYc¦ÎˆéÑ™rìÒíÍ@Ûf jλ BÁ|À4.€xƒVd³nqWÃQ£ ´ÚPÑ}@, ‰,ÆÎLn=È´yl‘õ£GR¶•p䌇+'ÆÒÌØv8›Z«r^x€ÚÞ…ñã849£Úžtw¢Í7UsÀèës±©b,F³´#’H{¯´ŠÙ×׎mdK˜j¿¥„í üjÑœœ{Ó<œ¹“µ¬gH®%ɨ)Ë–<²Ã¯™l)cÛv#‹ÛŽR'Ÿˆ{R³¨–`$¯\1}€Hâ)Z”­éeÔ®DûL™N­9¹é]ùC³dm•PÈ{†½^±×èÁ&ÙæÙ‹ULírÍÒ½©­‚€ hu¡VdjþÉîO]ÀúP›Ì ÎyÌA@’AäyTŨlt&·ŒÏ˜ër¤sN8BJ8Ǹcä„À¸ý"ÏJвP20ΔĥLjÁ†0ãê¶ö r|b•öeý!ÉeΓØX›e܇ÆÈÙ§J̰¤í0ö†"q~Ê ¿-4›q ¦ÂÙƒ=‰–Nfx±±Š•×·ú,}FÙç¢]–d…e›2ÃûD›ÁÝ•ô³3DY­t“§’éJ+;•”JMÀôH¦ä r©ÞÀ ›è› ÍFú8Çîl¼z §]›ì ê,1À4ÖŒ… rÆ„¦3Vç¢sÍÊSÆÈÔIt:Ó«=CØ9 ´#µM_¹²XÌù&†/¿O?.òÖ+Ž¿-ýƒòºu†ç¼&œì­‡›FwÏ+Í åzÔžmïR¸Ò³|=½âž‡{†$”> endobj 5986 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1409 1409 0 R /F1700 1700 0 R /F8 8 0 R >> /XObject << >> >> endobj 5987 0 obj [ ] endobj 5984 0 obj << /Length 5985 0 R /Filter /FlateDecode >> stream xœí]MäÈq½÷¯¨³Õ2ùMÀ°=ÝcÀƒÀÃc%Ù¼‚×:øï»º‹¬žNòe1_½ü «´v´Ü"ó#2"2âÅ‹Ÿþé—ÿ8üçß?}ù忎ÿòËSqìšâüŸÃÛ_øñ”ýqüó¡ë›Ã¯¿=ý~øýéÛÓ·ÓÿþþtþÁ/_þåô§ÿ;”‡>ý÷¯‡û÷Ó?üÓø/½ý ¿=u¦;ýý¿ßÿ>tæô§âò÷·þ_Oÿú‡¿½½qúÜ8˜ÏÿÿUÕU÷6Œ+Ÿþýiš¦yÿëï¿þíé§óø}¥íª¾«¦®Nÿ3Ôåáÿüô—Ó¦×Ç¡6¦k뮸åC]yúR]ÖíÁ”ÃiÙ‹aö¡÷¿4¯7^^7u¸—¿\¾*¦jûíǾ®LÕ•§¹6úm“›¾/Oîªñ?7.Z7-š©CìIpOš¾ (Mo#—¯Ê´áøíÊÓÜ›b\ “˜è—èãõ^þ¦é‚½ü}äòU™6¿]¸¹Mq‘þ'÷‡×xyY„“œóÈC\ÇÛO¿4C[t} ÿL~»ûpWž>\›þ°àDúò|·‚¹Oöå·mŽ¹Ô¦.›…/óy;Ìókß|ÙòG_¶<Ô‡¹?{Ó1z_ܾx“âùâÞt>ONÔ»,_ñ±|å¸|¦8m8ü8Ðátïøe#{Öu¦ µgö»3Ú³ÓÐÚÃm7´gAÎÙ’0ä±aÃû”ÍÛm˜¹ÍºëÎØhóλ6þ¿ð‡öã§ A×n?úéëp8é‡ï9™ï÷<ÿíûoOõéÿ¼…qúáðýO‡, Sþñðý¯Oý±жlÞ×{|Rû?)š÷'Õ±©Û¾ûô¤ƒokáÛ¾¼?©uuŽÂ}<éÏ¿ùxI_'XTÖKðè«ÔßGÿúý$áa6ÓÔµ›ó)ÁÅul"^1¼!5|Âl/|[9HGýòþĘi÷Vü¦üóúþ¤9VeoÊ•âå–’h8Ç|zôÄð;ð0Ï ÖXdð‡¥Â„7Ì1æpzÅ¡ql­˜þ„Q¦K±‡.gq|Œ9«ƒjúÑšÁ2‹Ï(òXêŸJü6â9fzmÔ­p[—¶fö‡™¯óâ¿tÕy‹†c×6Ÿ?ü°¨‹ê»É^&TŽ}bvÿ&?£8[?æzápˆ+Céâ â+Ô$EóHÖ{Žma„7Ä­9ä½Ó”æÚÅ“Z¡ÙQõ8»x¥ðq`|7<¸#Ø dp°áhȳ½-„ŽØ¦KÍø^ÅÏW<…€GuŒ÷ EF®f”A­½O~M‰æFÌ.RMWWɧ)Úä¢ðP—ƒ±Nõã å”– ¯PànC‚âàšä΋],T^^z¡ÊØgtDå 2«Ìús8š)¥‹»Ãè7µ]_†u  £:ÌáX?ZñÄñb©™2á¸ÖLTjn±;*‰H¬9ãŽ;NaU4×~ÆõÒ*í}ƒ9>8D¼9>”‰Å&ï6—øŽñZ©OA‘ºš6äCßXÆg>GÆbÜ)ª‰’œ®:/Š)Žmg>yå3òCðo¨Ä«AoÊãŠqÔ ÷aP`rÁlÆïP7mâD9§øn#“\ÍÕDƒµå4ÌX)‡Ô¾C§=B¡ßÇVÝ´.Œl{è-F-j«ª"`cM]@xNÕZ»5F#†ãûh>i:ƒžü›=© ôdÔ›KO‚KoUÔ¶ôƪ`ñö¥%¹Ÿ÷j_ÂG{}@kT;¢Åªœd¾#F¯)Ÿ#I¨D Â×CÆ6»™]ÛIl3¿¢FáUÂ8SiÖ+4õe[jÅ¥YŒYtÓ¦Ùï'eTþùîôpšÊÎØ§ÉÀy¾\Y|!Yrš \¤™›__GÒ™ª´=xÊ’1ÉKŒ¥»&¿bª}ùy‹[§ŸÙ4³Ê0…ýE&GÈÄ •ÏE .ñF“ éë_ó“âGÖµ=÷“†]ÏäYE5$‚g‚qãui§4c;#¼—pXjç+kj8­!Z_âL…rŽº)"ù̉ËâX.mØ77ì¥hKµYSG$Ìe ·§zAO˜ò"q1${J˜VÍ,ëLuc.¼ÙAñµåj>Ñ 3Q\G)¤ –a]kwÖãQ¨+ß5o9x®>}êªäeÀ âaW¶yëÛ2øwuHçâS1g9®ÄeIlEð¸ejüÀt,mEQ,Ö/-ÆO’ÑͲ.'¡F݉ë’,ô1ÍDÙje»Á„$>;sŒþh= æM†ðF™rX$©ú¿¿<ÿúßRÔeZ›²w  ]Ë@%L-Òrêúœ8fË‹)fÈ»2.Â’« Š3•ebs¼§kÁù×î‡â‚å !Ó6AÓÞZ·™³Ô–úxĨ þûdYfý(²?©JžO=,Û8u6bU`¦èÄjÁ¼±pp] ¶þß@˱–RyÂÀȺ–IGṴ̈˜*hÏ¢Ñ^>ùuÌ9X33= OÆãÕK;ƒßFýf@¿½YSOA¦Å5èÉ(ob#£ñœ7¾;V31ÐoÆëÔÂw.E0³ù”%\ƒñ /ÎÔ¼ú§x†okГº…oûýÎç¼¢í±z?þëVÏï6ÜS<,!?ÜÒì3Å²ãØŸ"ÖMc˜zF˜ó1÷ºžk¹Â=¢Tè…ɱãi¤sH2œë!^¡‹'´—øÙ¼ˆæ1”Öî&=;èÆÊL“ŸõNr¬°aä»\HC1Ô¶¥Ø D%\:c¬ÿ#E¨µjTC9N¤ûµ7àÝ–8zP¨1™U,ÕL†_Jv­ÝÏS£\…d)ZËŒF#3ºE;â› ìF'÷Æ%¢ª³߆ €êN]1A-pGÌgøhW,’»kö&|¤Ì˜îº+‚ƒ'xÒÌm –£! ì„G©”½µE{óiëkùuýå+gÐzú M~Vºÿ½¢©û$¥åÔŽ‹´Ô­Qñ݇F(Ú.Y©Õ1ŒÛ´Ôg[ÍìéîÌüTzÎ×<‚¹“¶zOœÜ’Ö¯Se²> ´kÓÓCÌP(µ&>îT¬ì˜0l;Äõ„VÄ`Á)*ûºï‘ðf ˜[A„KuÅk‘“f"J×éÑ]ÓÝÇ2z—j°®Ýu Óú«ã—áUºé©E–oâ¿ PÆ4êR$Í®V‡íXW¥¥Õ™ÎŽ^ø7°§à¸9KOžá“= ßÕ´1ƒµ†ÑÂNŒÔm$¬x9s†Ý]4¢í½Àògy¼µ±`"áN<¤ô7ïdä¼»ÒK!‘?…m0³í <”ömL…\žÊþ&Åø@ZˆÔbrz>)ãKŬ6ÃÊëÑ&ŽPÐsŸtø‘ÿ—æÿÃ’Ä´v :~·T 9ŠŸxo+Bü³+¯†‚Õh9Â"î#w E·Õ3b'¤¤ýîåù2An¦|š8¦9{òA„)¤1égÖdKbÊÄjY4µ¹¥M¸èÒ¬“¶ÿOº¼–¸1±§¶ò3]^y”â]C‡+PK¸Æš®L•„wß³ñƶ³ìè^bza[ØfH8Î𦠉/Œ±.psç¼¼ˆ!œÄƒÅœüH•7:F‹„wÕ«Ž_ ’ÉôÅÅž6/yAë/k#îïvÄ(d*I/2׊‰Ÿq᎟ϮNJ6Ké}2 Ó&¶WÉÛ#­zJï…Eކ¬ª4ƶ’zÚ£¾NÓ7Æ&.ié=ÍÙ •”ž¸ÚS1ËXwGZé‹ Z5TY¶Ó¤až)›V7¡‚IT(Âÿ0§BÛÒª~U ”Ù5g¹é†Ï¦w©¦á+|ò ŸàÚ ødtÒžT |®Ä€Oßyޏò”}O çPÁ:ÇnÁvì}oE*›Âk~gvÕ¤¡«¸«CÄñ4ÍÝüêgB[àùàj3¼:p­ñw >ë°F.WuõCÇ}^‘¡ºAÇULE"–8¨ZJ¶ãmð‰øtC‹å?”x¦xO#êüÚ”7H_îöä@dea›bògJ¨¯°VrH´;Ž]e¬ ®e~Øk±½vè®,4Gó_ |‡,o`‡ëæ†Þ)[CpY.±TÄÜû¶¾º÷ØRQ{¿I?’91N÷•àpk¦ _q6¨~²ù±l+œKdùI¦‹þï"¸õ™Áå\[×PCh=4ÇÌÁ¾„©èdðÞ[FxIÕƒwö¶´Y#ÎðÃJÞî˜/9æH¬'ðFÎ@$%ULYÞz²Û 쌤À¬ÒzȾ¶¨0½4ëp2ýáMϵ|y&i›‹’ÇmßFOÆ©-µ—ÇmìáoÆÅ]ú lc_ÝUÊyw•¾í |G=Æ2–šÈ‡hI¿ð¯Áîëê·™ótÇj&”xl-Ümü®[Y„vq¦8ÀÐ}^\Ó {ÙC4’öCdï´<’‚u2(øX¾#cƒ´5LEM`‚êTl9Z⑜Û_î¶üw“Z@{³» <¨fVR i—öëÊš‰‰Š:"ƒ>Z–ñõi ò ‡¾LÕWd[µ±u£&ˆ§©™& àx¶ÍJµÍJC–öc»[›¬Þg[šTkÛ _TÜ_•‰"¦gòôèÝÆž'»¼J¹+sbJRy;|0®3-±«’bè;áXiÀšÁÞÄäÙ=*."e%JO9æp«ˆ†ÛÄ =<©`>I`ÅÉË tÄl‹T‰Q\ĨPÒ[úÜ$fëÉgSõ¶e•ÆM5èUByäÜv0ÖÅÉažñyôˆ'%·Œ§²˜9+C~¦¡ûе–j‘^UéŽÚ󯡕ãÐ6Ö ´ý3烈’3ÜÝl;w‚ЉDëèÑ‘“iÊ4´q|g½‘AUÚ›"p9X]CA”â!Xx!Kc—”7Æôᪿѽ+~²4Ý%®Z/4˜b|÷©?º–º×„ƒ Y7ðp·ÐeWÛÇ/}$pæ=UåM0¥H9_öÍ0sÊù] åÛwÉ„ýw­±l¡GFj± >N`Nd(Ä´‘‰EOÝu—f:øþ¢­vŒÔ(1tNP’ŒÜ‡çÆ$÷©Ìi`t²T½àk,…óbZ83FÖ–Èœ Ž4-"!º;lë†9i ÖÀølHÅyAiF:Ëfå•™‘Â|£50Š<|)Ö¶r¦ØRÖ_(OOýÙ^ÙüÒT\@ËÎ"ñ1™h½GXòzfš€¥út¬Ê-54µ}¿b®‘êØ(ž1"L¢ÙVfë#» ™Âd'7£àâªS«zJêë;d5½[µSyˆ´®»ƒ±#W77Er5öŠ]k`¾;š¢rñ(gÛ2ˆp ³tž ©¥Y Ç‹+uY®!«~ŸŒ¦|•Èl í8ökÌÚáM¸Š¯ñƒ=%Û8|OðÐaÒPIž¨ãfÊã^l•Cáùq.&–ÚOVÒŸâÎc°øÃX¨(,¨À&B;’ÅbOáÚú5f⾞º"V°ºÆàŽ_¸ëîëU¢'ŽÊŸ/þ#À½djØÛ ÷¹qt?"Ææèˆ WÇÑOŽ À¼ðØpÇ$Ü‘ ËÜ©‰®Å9[º Zn‡Ncdkb<Ü¿/¹­uì6Ñç5÷N›Cq‹®©dáÿ#½´DÒ}õJÒa¸´ŒÏ'é+AO2t‚GNbL~OŸ”vÄC 0E½¶> “àè|‡£F±˜ê˜ì‹Çyb"MĶì¥ÑF.¼£A!íe¼EŽÉ­Kƒ¹Ÿæ+ð>ÀH¿MFŠÅ„‹Ô4¯ ¿m&3Ë@:Uï¨5¹–AŠÂ*†lî÷wÞ…P½%˜…P'¡\Ç8‡pië3˜}Šeñ´E…Ò&<ÚÒXŠß'±w„èÜP]ŸtršAa%±:IMç|¡šˆådP}¤%5AøÃ‘j_DžC°bõKý <6‡+œwô¥V+s;î¼cF¯%÷οZ>dг›™"HD%Ìàþb¿áÿÕWGØ@–)éÊw{•&Ø~ê’ðE× “vP¥·Æ «’>_ÏP»Ì³ñDbÎÇ^Ÿ¥®gøèÅ­Ù¬Û(ÆrA™–-‘jcUB7§U˜ƒ©Ô™ˆq3ó8yâ˜i,Ú¥0õ-ÒyEëØ÷…ˆ€mÌ­Ž¸CPõŠZp•¢YYúîËZºl†ÌǧnK¤/(v—¯±"†¼Ž›Ò6ÚÄNòt”¸"Njm†–ØÚ¾}ßr' è°®rÂíI)¥îhõÀvï §ç¡™éÀ®„–èNP !)‡Ú2x9»Ú c ¾ÃæŒÌ»¿`o ¼ß>î”@n)¸LQ¯J-lfâÁºº›vÇç“Séˆcsx{…œ:AH¥½yR LÎá¿;´yZ¯^Ú\TŒØÀ3Uä§ Ýµ¤Xi‰MF%Eàâ }lì’XG©ýzŒe7UcáP¤Œ1!F iñìÃŽ•e\öH¤˜TA%ž–B—•‡Ù˜ïÏ9Ë1R¨ ÷Õâ¸(·cs ]E)šÁ2OâÊèdZ!¯äeQÙþÇÎJ®< ˜°½C¯¤/ˆñfE¹k/Á¦¶Y õˆá¦Ê8¼£Hå²ÌEZœ~ ~A+MeÉ­A:ãZ0*@¼ywçoÓ²EdooNŽÂ$…§óÞØG³à@nL5\Åg åóÙ_[?n(c˜íŸº0Ä’Šx|®iú¤Â±ŠLŸü6È{ÌðÌ?ø¯ã]˜ï‡cKbóâ?ŸõE\ðŸ9Üן9,!Xª°Á;mA…¥*MÜuò¯^¹]—ÕÔ$H˲t(oÇÌÁ™î®:ß§iéÞxA"S#fÆ  \lE)pÃ#iž2*×”m¤´8¹”ÆZæ4¼9}ñD7õÎ}vµÔ€Œ8=¸þúZÕs2§&dõY×ZÆk¯ÒY¾" ä¡°ªçdD#ÖHço„±zE'²Œ¥õ=ΆԬÝP'!ÚÖLMH^ó’ezxÍ·ß¡]úFCÒ C,£œÁ-€aòcÊ¡SÜO¸±ZÒSEððmTÇã¨<ÁŒ©# YŠÖ²xÑH±¬ØøÃ>H¢õTªŽ‰FÂNmZóDækžëv|káešA2‹CPRQR˜…b'©bLÆGÏ–oÊk{š*SP\Le™ÂÀ\X×ùF°jL-~ÕƒÊ [K)³ZöÑhmÆãÃ!íúF)hí‘Æ+ºÞRƒ ,¿Ç«/ÅÈÃ7"˜¶Þ^éypÜp˜; Ó©#lŽRLÆL„GJ þaè_´².Ê«'O¤jY{Y¢øŒFÙÇ(3ýñȹ‘˜#g¯wŠc,^–ðÀÄLLÄ„)Š•ViÝ`FƒVÌì[$ÁÚËaÞGÞCl‰FØ¡h0¤†qsÖç#¨-%VP s\©5'Rfc§ ?WKŠÖ‰fLÅÌJQbf°Œë öT—‡~¸6¤ àËÞ6Ž‘šSãÓ6f1ß±óŽìÞdñÞï„!˜X»¯‰ô1@ó;æ¬IvÏÁÓ˜­Òz+#ɨÝ@ˆ!"W^ètrv´ \ÐЭµéa¼Ú ?UèY¡ï0©+ÊUS/¢E…c…±$¹smx]Z¾˜ž×{ɈwZÏ ìRRÿåœÐÉL³0…Rö!#¡c©Ý‡9˰:ŠIìk€ÄÇQOB@A`mãóœ±á‚( êŽNß`Lü&FâÞ6³ÞÊã" Tö…Y[Ä…U6¶ŠZ8EyœCú±xzÜÊ$ÎcrÔ£¥þ¥Þ‰_ïA½—Èq„à^½Âj0:„ñb•êIýìq8F>º%H¦,*K*©>DŒ$Ke Ð15èë«ÆÅ|&Éq›ÑÐS›tç“a‰b`1“DåÅT{/5 bÏBÒ–´­m˜[—–©)C˜6«m2ÂWŸ¨5Rc¢8wÌ<Ãx1Zcåè"{ÚûîÁ²Ñ6Q@Í!Ö¦ž]ºÂ$’qœÖ]3"Ü–Ðm”7)°—ª<ÒÔĵDHÌXÛÓOÛsCL”Iª}˜N¥‹ )WÀ Tê’ðIÐ+ŠÅR&n*«¼Al{4Od`Šv¾Ž]÷°Êç‹·™Ç ËìƒßYÆÜPßâ´¦‡ËlÀŽ`\{7Ó·ÀLìTãïx´ó(›#ZÒ9v#ð‰Òæ‘§êôéÝÖ!"À£1¬OÍДI£ IÛ•½íØ`ÇG ¤µvçΖNiFo‘OÉÀ£¡‚Ù§ED"mÜ}=ëû§$—â ˆÅ)(TŸ'hêciVwv`8Û¤iþ´ £ª´ìgŽ@a˜ÌT´F'©:¹h5›†óz :H¤5|€°1ÕõÁ<º¤¬9 ‘Be»/]É´D²j¬„ŠM0ƒþ`†Åœ+lšærâ¿Nƒ9Çlf’´ðdÜ‚æXÚü6ü›²…¿àwêËâÕg-ñŒÞV–è7õYë™v’6[m{}Ç ±ú0‘`à˜œ¤ï3ûu|G‘L;iÌm  1D<ÒjH-…3ŸX«£…8P°. ¿Ô&‘tš„¥Î8vãûȼ±!­L_Yf&ÇøÖl¨¯W²ò|êŽ#ÍW9’ðxÓ™ "í¥*V²5,28x19…Pº0œv¹$êÀ£|0.R5dÏ”v°,`4Jœõ™Ñ@>îH[½#…uŽ“E’uÖ€1"©ÆYb6.ë+­Áw &Y„×'½“!³ÜÚ‹º) èw^¸ýjbÓC µ-Ø$Õ¿‘nu;.qáQf¶©ÀáÂáEaj÷¿ÄRQ»øA¼ä]LÆ<ì‡Ù½ø0ªÎÛ‹$ŒÙ8=÷ˆz ìÐR+»\M‹JF–fQE°Rr£Ö ŸuþIÔ ´ ¦¶¯eÄq &Ç4yšáü˜ø¢ÎIlr¼ + ‹Ÿýׂ 3oÁBhÈ3E0RJ‡dý"#ÓÿDˆ@–ôr0 K­©¢4>e$Ö”¯¡±¶W;g" ÌÛ^6‘>‡ÇjiQï9—x¤—qf®¾L=¸-ÑÀ÷m{ÑéÁ÷=ü ßOÍß›ãy?fÛ»4¶~ç |‚W§…ßÁO `d¿Â€gø›ô$ü¿+:k^ü»›ŠqmúR•A}ƒ™$Ü®EÂaXÓÖcCøÙhEak 4 EmŸ¢5“9"®Ï%)¦Š«áÅ_¿(Ïq& L¾(|pnït³ òXÍ‹´Í&Âf|)ÜÛúý?ñ© “â5p6˜â¦f.ÿ3'•Å {½ñWª>?Ìer}”, —>çú! -Tå’)<âuYèŽÝ`QŒ¿ '^ìó"”f¢¹´ç\Çò´TŸ|ØkÄ{e==Z1‚éö¾0Ÿñö>ÌÉÔ_ÑÇwžÑL'b…|Ü¡–kì—Fð G]|ÈÊé¯Ãï'¡pÊÌ·kÿ ÿª_’©êt39]öNS:”õgIX:\ç5íLÒ9–UN]³UhçOª—ñ7íŒ^Á@ýõ‚¾S]Kp-íë8ÓÙýwTdØÀÕöfâË_;Ÿàx¤p€믅iü6ø›Ñ»0^Sï>Ä–¸·?ŸF> endobj 5990 0 obj << /Type /Annot /Subtype /Link /Rect [60 771.500000 94.5000000 778.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn3 >> endobj 5991 0 obj << /Type /Annot /Subtype /Link /Rect [87 764 126.750000 770.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn4 >> endobj 5992 0 obj << /Type /Annot /Subtype /Link /Rect [87 757.250000 123.750000 764 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn6 >> endobj 5993 0 obj << /Type /Annot /Subtype /Link /Rect [87 749.750000 177.750000 756.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn7 >> endobj 5994 0 obj << /Type /Annot /Subtype /Link /Rect [87 743 120 749.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn8 >> endobj 5995 0 obj << /Type /Annot /Subtype /Link /Rect [87 735.500000 136.500000 742.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn9 >> endobj 5996 0 obj << /Type /Annot /Subtype /Link /Rect [87 728.750000 167.250000 735.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn10 >> endobj 5997 0 obj << /Type /Annot /Subtype /Link /Rect [87 721.250000 165 728 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn11 >> endobj 5998 0 obj << /Type /Annot /Subtype /Link /Rect [87 714.500000 201 721.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn12 >> endobj 5999 0 obj << /Type /Annot /Subtype /Link /Rect [87 707 191.250000 713.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_commandline >> endobj 6000 0 obj << /Type /Annot /Subtype /Link /Rect [60 700.250000 142.500000 707 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn13 >> endobj 6001 0 obj << /Type /Annot /Subtype /Link /Rect [87 692.750000 109.500000 699.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn14 >> endobj 6002 0 obj << /Type /Annot /Subtype /Link /Rect [87 686 112.500000 692.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn15 >> endobj 6003 0 obj << /Type /Annot /Subtype /Link /Rect [87 678.500000 129.750000 685.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn16 >> endobj 6004 0 obj << /Type /Annot /Subtype /Link /Rect [87 671.750000 144.750000 678.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn17 >> endobj 6005 0 obj << /Type /Annot /Subtype /Link /Rect [87 664.250000 108.750000 671 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn18 >> endobj 6006 0 obj << /Type /Annot /Subtype /Link /Rect [87 657.500000 114 664.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn19 >> endobj 6007 0 obj << /Type /Annot /Subtype /Link /Rect [87 650 119.250000 656.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn20 >> endobj 6008 0 obj << /Type /Annot /Subtype /Link /Rect [87 643.250000 129 650 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn21 >> endobj 6009 0 obj << /Type /Annot /Subtype /Link /Rect [87 635.750000 192 642.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn22 >> endobj 6010 0 obj << /Type /Annot /Subtype /Link /Rect [87 629 154.500000 635.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn23 >> endobj 6011 0 obj << /Type /Annot /Subtype /Link /Rect [87 621.500000 125.250000 628.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn24 >> endobj 6012 0 obj << /Type /Annot /Subtype /Link /Rect [87 614.750000 133.500000 621.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn25 >> endobj 6013 0 obj << /Type /Annot /Subtype /Link /Rect [87 607.250000 125.250000 614 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn26 >> endobj 6014 0 obj << /Type /Annot /Subtype /Link /Rect [87 600.500000 139.500000 607.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn27 >> endobj 6015 0 obj << /Type /Annot /Subtype /Link /Rect [114 593 192.750000 599.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_smart_pointers_shared_ptr >> endobj 6016 0 obj << /Type /Annot /Subtype /Link /Rect [114 586.250000 176.250000 593 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_smart_pointers_generic >> endobj 6017 0 obj << /Type /Annot /Subtype /Link /Rect [87 578.750000 168.750000 585.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn27a >> endobj 6018 0 obj << /Type /Annot /Subtype /Link /Rect [60 572 175.500000 578.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn28 >> endobj 6019 0 obj << /Type /Annot /Subtype /Link /Rect [87 564.500000 123.750000 571.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn29 >> endobj 6020 0 obj << /Type /Annot /Subtype /Link /Rect [87 557.750000 123 564.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_builtin_types >> endobj 6021 0 obj << /Type /Annot /Subtype /Link /Rect [114 550.250000 142.500000 557 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_builtin_limitations >> endobj 6022 0 obj << /Type /Annot /Subtype /Link /Rect [114 543.500000 224.250000 550.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_builtin_overloads >> endobj 6023 0 obj << /Type /Annot /Subtype /Link /Rect [87 536 144.750000 542.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn30 >> endobj 6024 0 obj << /Type /Annot /Subtype /Link /Rect [60 529.250000 141 536 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_directors >> endobj 6025 0 obj << /Type /Annot /Subtype /Link /Rect [87 521.750000 134.250000 528.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn33 >> endobj 6026 0 obj << /Type /Annot /Subtype /Link /Rect [87 515 129 521.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn34 >> endobj 6027 0 obj << /Type /Annot /Subtype /Link /Rect [87 507.500000 175.500000 514.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn35 >> endobj 6028 0 obj << /Type /Annot /Subtype /Link /Rect [87 500.750000 137.250000 507.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn36 >> endobj 6029 0 obj << /Type /Annot /Subtype /Link /Rect [87 493.250000 153.750000 500 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn37 >> endobj 6030 0 obj << /Type /Annot /Subtype /Link /Rect [87 486.500000 114.750000 493.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn38 >> endobj 6031 0 obj << /Type /Annot /Subtype /Link /Rect [87 479 124.500000 485.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn39 >> endobj 6032 0 obj << /Type /Annot /Subtype /Link /Rect [60 472.250000 145.500000 479 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn40 >> endobj 6033 0 obj << /Type /Annot /Subtype /Link /Rect [87 464.750000 147.750000 471.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn41 >> endobj 6034 0 obj << /Type /Annot /Subtype /Link /Rect [87 458 167.250000 464.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn42 >> endobj 6035 0 obj << /Type /Annot /Subtype /Link /Rect [87 450.500000 165.750000 457.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn43 >> endobj 6036 0 obj << /Type /Annot /Subtype /Link /Rect [87 443.750000 181.500000 450.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn44 >> endobj 6037 0 obj << /Type /Annot /Subtype /Link /Rect [87 436.250000 141 443 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_optimization >> endobj 6038 0 obj << /Type /Annot /Subtype /Link /Rect [114 429.500000 140.250000 436.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_fastproxy >> endobj 6039 0 obj << /Type /Annot /Subtype /Link /Rect [60 422 113.250000 428.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn45 >> endobj 6040 0 obj << /Type /Annot /Subtype /Link /Rect [87 415.250000 162 422 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn46 >> endobj 6041 0 obj << /Type /Annot /Subtype /Link /Rect [87 407.750000 128.250000 414.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn47 >> endobj 6042 0 obj << /Type /Annot /Subtype /Link /Rect [87 401 142.500000 407.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn48 >> endobj 6043 0 obj << /Type /Annot /Subtype /Link /Rect [87 393.500000 126.750000 400.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn49 >> endobj 6044 0 obj << /Type /Annot /Subtype /Link /Rect [87 386.750000 135.750000 393.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_default_args >> endobj 6045 0 obj << /Type /Annot /Subtype /Link /Rect [60 379.250000 87.7500000 386 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn53 >> endobj 6046 0 obj << /Type /Annot /Subtype /Link /Rect [87 372.500000 139.500000 379.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn54 >> endobj 6047 0 obj << /Type /Annot /Subtype /Link /Rect [87 365 132.750000 371.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn55 >> endobj 6048 0 obj << /Type /Annot /Subtype /Link /Rect [87 358.250000 137.250000 365 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn56 >> endobj 6049 0 obj << /Type /Annot /Subtype /Link /Rect [87 350.750000 151.500000 357.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn57 >> endobj 6050 0 obj << /Type /Annot /Subtype /Link /Rect [60 344 112.500000 350.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn58 >> endobj 6051 0 obj << /Type /Annot /Subtype /Link /Rect [87 336.500000 175.500000 343.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn59 >> endobj 6052 0 obj << /Type /Annot /Subtype /Link /Rect [87 329.750000 222 336.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn60 >> endobj 6053 0 obj << /Type /Annot /Subtype /Link /Rect [87 322.250000 183 329 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn61 >> endobj 6054 0 obj << /Type /Annot /Subtype /Link /Rect [87 315.500000 192 322.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn62 >> endobj 6055 0 obj << /Type /Annot /Subtype /Link /Rect [87 308 170.250000 314.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn63 >> endobj 6056 0 obj << /Type /Annot /Subtype /Link /Rect [87 301.250000 129.750000 308 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn64 >> endobj 6057 0 obj << /Type /Annot /Subtype /Link /Rect [87 293.750000 272.250000 300.500000 ] /Border [0 0 0] /Dest /H#0f#d2#cf#2a#d8#a5M#40#09p#e0b#d5V#9c#aeHu#e7 >> endobj 6058 0 obj << /Type /Annot /Subtype /Link /Rect [60 287 110.250000 293.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn65 >> endobj 6059 0 obj << /Type /Annot /Subtype /Link /Rect [87 279.500000 132 286.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn66 >> endobj 6060 0 obj << /Type /Annot /Subtype /Link /Rect [87 272.750000 140.250000 279.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn67 >> endobj 6061 0 obj << /Type /Annot /Subtype /Link /Rect [114 265.250000 178.500000 272 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn68 >> endobj 6062 0 obj << /Type /Annot /Subtype /Link /Rect [114 258.500000 178.500000 265.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn69 >> endobj 6063 0 obj << /Type /Annot /Subtype /Link /Rect [114 251 178.500000 257.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_autodoc2 >> endobj 6064 0 obj << /Type /Annot /Subtype /Link /Rect [114 244.250000 178.500000 251 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_autodoc3 >> endobj 6065 0 obj << /Type /Annot /Subtype /Link /Rect [114 236.750000 199.500000 243.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn70 >> endobj 6066 0 obj << /Type /Annot /Subtype /Link /Rect [87 230 143.250000 236.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn71 >> endobj 6067 0 obj << /Type /Annot /Subtype /Link /Rect [60 222.500000 106.500000 229.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn72 >> endobj 6068 0 obj << /Type /Annot /Subtype /Link /Rect [87 215.750000 159.750000 222.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_modulepackage >> endobj 6069 0 obj << /Type /Annot /Subtype /Link /Rect [87 208.250000 163.500000 215 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_absrelimports >> endobj 6070 0 obj << /Type /Annot /Subtype /Link /Rect [87 201.500000 183 208.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_absimport >> endobj 6071 0 obj << /Type /Annot /Subtype /Link /Rect [87 194 156 200.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_importfrominit >> endobj 6072 0 obj << /Type /Annot /Subtype /Link /Rect [87 187.250000 165 194 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_implicit_namespace_packages >> endobj 6073 0 obj << /Type /Annot /Subtype /Link /Rect [87 179.750000 139.500000 186.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_package_search >> endobj 6074 0 obj << /Type /Annot /Subtype /Link /Rect [114 173 207.750000 179.750000 ] /Border [0 0 0] /Dest /#82P#17#b7#60#b6Z!#e9#7e#f6#07c#e5#01#20#12L#1d#d4 >> endobj 6075 0 obj << /Type /Annot /Subtype /Link /Rect [114 165.500000 178.500000 172.250000 ] /Border [0 0 0] /Dest /#ad#0f#ad#060#f2mBR#83#0dz#27#ab#15W#d0#21#83#21 >> endobj 6076 0 obj << /Type /Annot /Subtype /Link /Rect [114 158.750000 207 165.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_package_search_wrapper_split >> endobj 6077 0 obj << /Type /Annot /Subtype /Link /Rect [114 151.250000 233.250000 158 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_custom_module_import >> endobj 6078 0 obj << /Type /Annot /Subtype /Link /Rect [114 144.500000 185.250000 151.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_package_search_static >> endobj 6079 0 obj << /Type /Annot /Subtype /Link /Rect [60 137 105.750000 143.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_python3support >> endobj 6080 0 obj << /Type /Annot /Subtype /Link /Rect [87 130.250000 139.500000 137 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn74 >> endobj 6081 0 obj << /Type /Annot /Subtype /Link /Rect [87 122.750000 127.500000 129.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn75 >> endobj 6082 0 obj << /Type /Annot /Subtype /Link /Rect [87 116 144.750000 122.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn76 >> endobj 6083 0 obj << /Type /Annot /Subtype /Link /Rect [87 108.500000 163.500000 115.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn77 >> endobj 6084 0 obj << /Type /Annot /Subtype /Link /Rect [87 101.750000 134.250000 108.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_2_unicode >> endobj 6085 0 obj << /Type /Annot /Subtype /Link /Rect [60 94.2500000 161.250000 101 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_multithreaded >> endobj 6086 0 obj << /Type /Annot /Subtype /Link /Rect [87 87.5000000 187.500000 94.2500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_thread_UI >> endobj 6087 0 obj << /Type /Annot /Subtype /Link /Rect [87 80 152.250000 86.7500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_thread_performance >> endobj 5988 0 obj << /Type /Page /Parent 2 0 R /Contents 6088 0 R /Resources 6090 0 R /Annots 6091 0 R /MediaBox [0 0 595 842] >> endobj 6090 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 6091 0 obj [ 5989 0 R 5990 0 R 5991 0 R 5992 0 R 5993 0 R 5994 0 R 5995 0 R 5996 0 R 5997 0 R 5998 0 R 5999 0 R 6000 0 R 6001 0 R 6002 0 R 6003 0 R 6004 0 R 6005 0 R 6006 0 R 6007 0 R 6008 0 R 6009 0 R 6010 0 R 6011 0 R 6012 0 R 6013 0 R 6014 0 R 6015 0 R 6016 0 R 6017 0 R 6018 0 R 6019 0 R 6020 0 R 6021 0 R 6022 0 R 6023 0 R 6024 0 R 6025 0 R 6026 0 R 6027 0 R 6028 0 R 6029 0 R 6030 0 R 6031 0 R 6032 0 R 6033 0 R 6034 0 R 6035 0 R 6036 0 R 6037 0 R 6038 0 R 6039 0 R 6040 0 R 6041 0 R 6042 0 R 6043 0 R 6044 0 R 6045 0 R 6046 0 R 6047 0 R 6048 0 R 6049 0 R 6050 0 R 6051 0 R 6052 0 R 6053 0 R 6054 0 R 6055 0 R 6056 0 R 6057 0 R 6058 0 R 6059 0 R 6060 0 R 6061 0 R 6062 0 R 6063 0 R 6064 0 R 6065 0 R 6066 0 R 6067 0 R 6068 0 R 6069 0 R 6070 0 R 6071 0 R 6072 0 R 6073 0 R 6074 0 R 6075 0 R 6076 0 R 6077 0 R 6078 0 R 6079 0 R 6080 0 R 6081 0 R 6082 0 R 6083 0 R 6084 0 R 6085 0 R 6086 0 R 6087 0 R ] endobj 6088 0 obj << /Length 6089 0 R /Filter /FlateDecode >> stream xœí]K¯,¹mÞŸ_Ñk¾£õ‚žW€, f€,‚,‚±ÃÈ{‘¿ŸR•¨*Qb•ºNWŸ3Çž{ÅV“Õ*’¢¨OÔWÿòãÝþû·¯¾ùño?§¿¿ùñE|qF,ÿ»Å?¿ß”ÿ’þ}sÞÜ~þåå×Û¯/?¼ü0ý÷×—å ?~óoÓ¿þï¦nÿ:ýÿ¯·ÿøÏ‰øÇÔ)vøåÅI7ýý?óßÁÉé_"ÿéyù÷ßÝþ9¢¸ô0eû÷Z» ||ŒWDÿú‚?SÎþñóß^¾Zà˜댗ö&AÃMP·¿ÿéåÏñ·=¬Ú>¬ºÁ­~à¥óàûù§«[~ÔSKPÐà}Ç0ˆuT¹Œ··­À0)ÈCç¤y«1¤¼ß` 'ö¶h/Ã7ÑÃÖË9wÃbóÑmöØÁclíé (³Žbjõ$ÿCׯÊÚë;5ËT&>wœtRÛ~ñ~š¾DüËI¹¨¦šþ ynK”Ÿ_¬ÿ"ePÞËÜËm¹`k‘1õOmˆ_»ÑoëJ†ž¾CŸDßðI.åïøyš¿þ]1&²ÉÍ„¿î|ñëŸ^¾ú>Ü&ßðÓŸ§æ—¼üõÓdgpû}| -o?ýñöOB(ûÏ·Ÿþú"ÕÐs|û͟ȯçO|&µ¾ø ¬2›®â»ùóE+/‹Oj&f&è/¬w–½úfþ仟&}^‡¥¡*~±/­’ªH#·„¨¥÷)!@©„`ZJŽ*ÈD©”0ör[.Ø‚R A·”p Y¨ U+áDÃ'Õ[%Ì2.UB“_°^”P|±NF­èÐ,^]¤gUŒU>)—'Ð(¨Gaû–2bÂ3 #Ñ0œÝJ÷Ýø¾„…ÕÈ 0«î4$½[¨1²–I;‘òóô%‘t8÷Ò¡`ƒMÔ3Ô¬½”¬ÄÈYLù0±”l óâaÒØÅ lHoS'+¨«> VXÜùdD£-Ëmq΀óÇæÉZuX>1_DÐåüåöu§®ÇãêDÒUeõ–Эì^e÷º¥ìÓú™ha\QSe½’2#l*¢ì^¶”}\е²Ï½ d¥˜K•}ú1IÙ §ìÉ©u… §ê«„‹©Xö¼³ßÙ™°øI®wR@Cñ ÅÀ–Ðk(AÈÒP‚P C ˆG 5”¹×b™ 6ei(Aˆ–¡„@ e¢T†²e¬l s¥¡á06ú𸏀· ^Çy?®©Ž³ÆÅ‡QR7®‘@îd—Àñ€Ñ’ä@9©Vozž=ÿÖÙ_Ìû¼w«Žù¯ |r?:„-¡Û)Aü—’-ÿ5­è‰ÿš×ýÄÅ^É?!l â¿dhø¯0-݈é+ÿµô‚’ ”b.õ_ʾòS%ovSåí?Õã¨ïÏ‹dúÍA9œÎÁl Ýæ 1-sEõtÎ@m޽’º#›ÔLbVsоeÚQ1ÚÕæ0÷‚’ ”b.5‡éU±ñ‘æ°h\¨ßö˜qOŒË„–qU©R…mÄ^Éx 6=1.ãZÆeh¢&R*ãš{AÉJ1——|ß²ÆuyÈzòœÆÛ9Ÿ÷á#|–›òìwxnì[ÐËZ&|Ñt³ÿdG#ÿ¡{U¾“\åò€§yOðÁâÖ˜vrKèvJΧä|Ë)U)¨RP…OÙx!dƒMGœ’³-§ähB-R*§4÷‚’ ”b.uJ^¿§ô¨cÇðÜ" eXG&ÙUù·œÍG;ü¸ñž†ƒØwzîtrî[؉ގ:0ÛªÚ–ÐíÀ‚%,¸–«Rƒ!¥ ÿ{%…l°i‰ ¦åÀB•è P;°¹”l s¡³“º Ú|Ç­àw–#ÒHþý\7ÅîC×k$ÞÊ+øÜ íc‡?]éš}Ñ-Ùµç_¿Ç9¢ÍüSó±û7¯¤zôä p߬Ü:´Òz"ØÚAOT’ûœ)ÄA/½f¼²Á¦)ôD€ÚAOT]‰ÑÔA§^P²RÌ¥Z!†KÖAóÙ’gû …êÎæÉ~§~Ê^ÿÉ©[†ç®+vÜï@âbgô¨tËQ'«oÚl ÷­Ðlqj7`‹•Àg -.½Ü– ¶ ØâÔnÀ'ªªdT°Å™†Oº-nd\[´²ÿ`ýîŽÆòÚ÷ ¬û¹É>~¼ãký{w;iGTö TåN(Ư¯ùYÏ d‡NØzôKXˆÒ¢ tG‰F“(Ñ4à¥ÕÒðÍTðÒ¥WŠ Q¢Ñ$J4 xéD••˜ ^šzAÉJ1—F‰á¥Ò±ùšÇî¶1WÚ î”¡[Õœ"ªæàΉj¨¸ ܹôJªät¡jNUs pçD•˜ Ü™zAÉJ1—ªšCp'¸ä"5ÝSHUsÀ³Fp.#)•Ùºµ2H¢•¡¤œ¨@Õ%THÊ¥WÒº  ­ ’heh )­ðŠñ’2õ‚’ ”b.ÕÊ€HÊ„ ouâ]«6#ÏÈòµ:AuîážÛÎ|„‡”PNl ½¶$e‰ê› TßD¥¹ )+TßÒk±•Ì›%ªÏJÑ@õMTšÙŠjKK/(Ù@)æJ[’2£ú65¤|G <{~¾8k~ÚzDoªgmÒMïA-ç®ÐJˆAê®p¢*j)ºÂ.½’ÁiQ¤ Ä UW8Q£*\aê%(Å\jq…;G(yƒÉÒl%ñóÒQ%Ô'͖Э„à‰Bgeµö“¦Âß-½’’A(”r¥¥[Bw”lœG›œGWI mk8ÏÜ+™.²Á&óhÓ‚óhCS4‘B£ä¥”l si”lçùð;ª§œOÙLY†€¬Žu€bÝÕÄÕkPôþ…‚ÍE“l w×l»Æqqí9Ê­çLSyà{îå¶\°…ˆ*l›Æqñù—P4|R³9.¾Ê¸ò¸¸öˆÚ:70KŸŒÀ¹/a —µ©Œ_‚ÐV[ÀãÜ×òA«š¼þõT 㹡æÎ¦ûámÞùÚë®ê-¡;\ “¨C “¨«l«5&qî•ÂÑP`QÌ®†&1þ*¦Æ$.½ d¥˜+ÃU˜DÞóá-úVûËíó´í ¸½ÜY“ ½š ’À»@¶à] )¼+R¨fϽÍÍl°Ià] [ð.Þ)T³—^P²RÌ¥š­²³{PÅHÞEóE]‡¦¾ü ÓUæ7/9jJf»P[Âý9=Ðòúœ^ÌT¦Ñd+ýž|Éã£.)yK\J_àm*Ѓ„´cÌëµÃ ŠfçVÛ÷ òúð×'<ˆ_!—Æâ”Ò;ÊùiîàöÄAÑ[ÂÛm¯EA¥ÙîDbÉ­ÍùÙÄ@çØ“¡þåÅ¨æØ¿Í:‚A× £4p5mî•¢UW`ÐPÌͺ ,Å EJÍÚ5|umsi4냶S8m*9àþ,åN®ýÊÿ@þgœ‹}-?Ó»|O šƒ¿7úYÍ0®Â¶l$Ì!æ`Šd6Ìé‹2å=÷r[.ØBDZjûÐH˜C´ÀR†÷UÂ<ÒÒ“&.åï¸6a¡£ÈÐ@‚äžüáP>dàj‚B>§ZâÈ]$;;:õ"øT¿È?ì΄Þ—szØÞt+„\! íûX…$#H…$#[’L•-2²®4÷Z¦éÌ&5©dD«B’4÷)t_zAÉJ1WNãF"vKòÕšæ¿¡êxÏ|‘ùÖàÀîöN6¹^Ψ·„nûS¤8”Q­âPFÓ“w‘RÙŸÎÅ¡2l’âPFµŠCEÏFJe*‡ZÙ@)æRûÓ…÷=;›¿+­ü8»(FçêT6l ÝÎf g3†ÂÙ"¥2³Z²Á&³MãÙ2 p¶H© 2œme¥˜K Æ œOb?¶Úßɺóåõ9¾'Ä‹·é¯¬úÆ…øîØúèwh&câ‚Úºš%eËŒm•-3U†ËغlÙÜ+9,[”-C1«C³­²eÆÒ|]¤TÍæ²e+(Å\êÐàø¼¾±®¬ú7ýœzAÝøƒ4Þb5Òo.WE bKè6HOHÆ·HÆS’ñ5iî• Î$³¤o!Œ§¤H© ÒgÒÊJ1—dÈ$~›ôŒÍá]•SqÞ‹#ÀâGfñ‘ë—Nݹ=šl7Zz¹Ì ½†ohYÑhÙ*IeE К{-†Ù`“´¬h´¬ )·H¡†¿ô‚’ ”b®4|+³Ú¼-lidjGÎÁe­•¥å–Э{Šz²ªUèÉV «êBOs¯¤[ª(ô„bVÝS­BOVÑtS¤Tº§r¡§• ”b.Õ=ÕqUjþH|8 •å¿3rFê¨Ò뵬“ÛîÞÝ´€®Ûº±»iÁG;'_Êýɹ—ÛrÁVa¶lìnZ• QínF>©Üìn®2®ÜÝ´ðz¥§sï|}ë£0;#w_`6•£Ïx=Ts ãHüt!,[£pgSK½%tOÉ– œ¦ ¥5%Wkk„ÓÜ+M¹¶@8¡˜uJ¶-„ÓÍR1¦F8-½ d¥˜K§dÛQeëú«SG‘üÄ~*ü÷³Æ*B슱ò[B·{RFÌúV1[%b¬¯ËˆÍ½’û¢ŒŠYíܵʈYGÓJ‘RÙ¹ËeÄV6PйÔÎ=ªø «w.zœ gH =õƒŒêÜû!ß÷Aà;òdýNÉg\–“[B·S —åD —åª$‘5.kîµ8Ì&ù @pY6´pY6T)¯Pã²–^P²RÌ•NÉ ÄeñÄÃO‰ó†YíO?pÿå£<`ÀMîxö `ùé¾(Ù»›þÆoCÌu;‘+ÓÙ‚Ðë_&¿Mü‹láÎ\•tªÆÍ½’‘î Ådÿâd wæ$MkF õ/K/(Ù@)æRÿ¢wöÛÛu*p9°v=Òõ£ø¯§Õ»~'¨p£Dغ &XB§[XBKè Æν’“C6Ø$XB§[XB§)–0R*'¨3–pe¥˜K ¼Ž%|ºvèú'ÍÖ8Èp9!·„ûë8××p‘gü9顺L®«ç•âÄ?ݧ¼]ñXáî]BçÐÿcÛ6v £çÝœP+÷ùæ^nË[ŸÂ64v £ç,#…îF>)lv WWî:-©1„¸~Â2 #k7/íDn¼·ä'$>â¿à±w«Ìù\ÚJÙ-¡; 9åB 9åª4’ 5rjî•¥P §PÌH…rÊ…*)jäÔÒ J6Pй2ò"¿M~CŒ7 þ:^ŸF\~jbä÷8 ™+.…‚ÐmvŠ $& h™]µŽºFI̽’Y!l”DP-”DP4+)•Ù©Œ’XÙ@)æR³Ó%ñ®°ÔïÉPŽFKAã&–raKè6 •|´*ù„jÁ ®ä3÷J†E%³ ´*ù éƒH© r%Ÿ• ”b.5“ñï*4âç'Zådèº\> nõÐÓêþ³¢@ä–Ðm\–Tå ¶U•'TKò`ëªÈüÚôbOqòVö± J¹Ê2[Bç$ê¦wYL¢¡š˜¨$µ1SÈ$ºôš'É• 6KÐÄDh€&&ª¬ÄT ‰Ô J6Pйpž"ƒ&ª«ìì­œQohz8wcë=MÖC»cJÎŒ RO=½~à˜ôPÖo l,j`ñ0SõIoÌᦈ cŽyK!ºÝ£RÄ=ª0f¢ê·TŒYz%÷§tá•"îQ5€1UTb*`Lê%(Å\êU¾iíÀÌ<‚›A½\^Nâƒ8ÎwUÔüdÈ߈>ðñå¹[ãç5î€dö{j•o~±%¼áÍ“ â~«è2濼i[/áÕé$™.¡c›¨@ç1¨plK¯4‚*¦Kdº„ŽÍ ¨]áØR/(Ù@)æÒéÇv$%÷ iì=nÿta9Õ¹Õ6<·†âÈÒç·ê qJ—À\.2º½¡ÄÚ4q¢jê¦lM\z%ogeá ­ ÞÐ4 ‰ÕS1¦‚&¦^P²RÌ¥ÞÐ"4‘¯à<âv¼ÆgZäˆܱó·H”v9óË£{îRÏcÊ;r½Ê©ÞýŠÃ“Å#Øhú [B·v¸aß(œ7Qõ¾*œ·ôJnÖ‹Â »@ܰkΛ¨ŽŠqUá¼Ô J6PŠ¹Ô û|¡ésÃGv·Ï=¡`‹÷¯x®‡8ßõ~\ϵõ\غ]PðÄ…NÙÉjûKŠ §¼ôJ.&„ÂO\Phà”'jµ™*œrê%(Å\邤@œ29=õ!ßßöɯéýe²“[B¯QIY¢#¼¢eTÕ¦‰T yéµMfƒÍ…<(ä‰J·€"…ÕÒ J6PŠ¹Ô¨¢w.È):1pÇqí¶攥Êð]é·„·Ë)GAd"ý¡ªÝüŸ[$dÄ=”ιqah%û̹¹Gżc0rcÌÐX¿ë°xÄÂøïì…85ù­!ÒÉôðË‹5’Î÷ TÔ¸€À¶«ªnŽ/¶èÑ™BªK/·å‚-©Yª"TÝRáæ§óÆZ¹3n'”«æÁã碮éç£!2l ÝKcÈÒÀ4ކLTº%"Mu4dé•Bc‹¥1di`GC&*Ýà‰”ji`t^ (–æ Ž†8iñhÈÎÒ`à"•!|ËH)0óõ~|EÿÚÇæžÎm Ý&䀘kðœ¨4-]UÀsé•Lę„rž•&ç#¥2!§²Í8]˜{‚žNúìÆÙ‚ýïó&Fî;€E¯Sn®k-;Rrsä§~Ã瘃–éó‘¶„»ë;äåõΧ‡ŸJþá”\ÏíðÜ4û°'˜ÙRdÞ)àX& $ÜofJŠëÍ,®Y?ÍìÓÌö囘™ ÄÌd8ËÌTx3ÓîÓÌ>ÍlwP¾{€™iOÌLû³Ì ü˜™±Ÿföif{Ülì<33Ž˜™¹»<&š™uO`fÎ|šÙ§™íÊGH“¾­“p¸™KF ½©Uå Pù0–Å*sž‘BS«s¯%ušÙ`“ •o¡•§hÀH¡©Õ¥”l sejUøôlŸFÜ…Uwµp[ÂÝ{ý¿b¯_ ߨë×R}øH¡{ýs/·å‚- bÛ6öúçË(JÂT{ý‘†Oj7{ý«Œ+÷úµ|—eQù‡Ýq(U½•ï á\ôßÁMy-3šRø-¡wÚÓª,†:ÅP'*=µ)tÚ›{-ÓZfƒÍ²êDhC¨ô z¤Ðioé%(Å\9íi¡0ü%'#%¹/¯5dý¨ÊPœ·t+Ýó­ÖéÑFl ÝÞ¤GC Ò£Bz"¥ò!=™ 6 ¤GC Ò£Bz"¥ò!=+(Å\ê=L®öÊVbÚÁœVñ!¿殎¬´GÐ?º•t ÂßSï ?R?pà0õH‰Ì‘s!çUxÐ&—¤µrKèvJ–€¤´m¤´¥ ©H©œ’Í ©Ì›$¥m $¥-IEJå”lI­l s©SrYmøûÿX›ÝYã¨Zµ&¾¼<ÜñÇOíFÎ8~¡xœIèô»G‡H5jKèvžÖ¾U\XWHíëâÂs¯äþ|Q\ŬîÑ·Š kOó©‘R¹GŸ‹ ¯l s©{ô¹¸0{ ü˜Ð£ŠæðîžjÞ-ò§µø”ïÙd%ûÉÐásþ;ì[y6ùíñŧ>X–W‡\–w)<ˆ„^Ç‚”åÑ*Ë ‚žÉQ—å{-Ž#³Á&)Ë ¢U–7îS1uYÞ¥”l s¥cáßı U8wLã#ç«GÎJWeŸÎÈßœWt‚÷Tp[Ÿ•Úöt9­{RådãÂÒ´öU§H!UP­BªP%±AÕ…Tç^É©¢*ŠYœjRISò‘R9¸GSE!ÕUÌ¥N!”Sš(ˆªÜ¹¹™GßÞ ˜F±_Þïàš”'.O¤ý@JRªïØì ¯k#;ïYoŠË$nók-¶„·›;£ ò-$.ßr«Ã¢s£®´}F”ë—pžjÛnË<0¬ùt[q[Ö·eí£ÜV~ÇCådFì} >roÉ«5{ûí<¿ž@ß¾ž;íÜÙ'°sŸ/—gñ*'§òïÑ´~`µd9°w4‚s-}Úï¥|Fg.à3$¼¡—J€Ã†V‰—5ÚÎz‹ß¸Da¤.S;\]ùJcHcé;¾ÓÕs½«3¢£”æÈ¦ËHÄ}nváyü «§ÊQÁï·Øí8€?¸-á ¯ÑŽêû3OŸ ‘Ð?IíÀÙzW£D©~y1PiÙ}®ÛHx×­:PÕüñŸs'Üþ¼óÈ!\‘åÖï:µ\x•FÙÒŒà0Gî#xf¿Õ½•&…ÐáîóMFc܆mÛ8ßd´'g"…žoš{¹-l!<ÛÐ8ßd´®dèê|S¤á“Âæ|Ó*ãÊóM‚ý®"ð‡ñwL’_ñÜõSoïY(¹ºbšápØ6¦6†‡#…îïν–ýÛÌ›8lL 8l G Ýß]zAÉJ1Wîï‹o“/’»³R9PgüòýÝ!)ÿÉ@býé² iרµºbAè¶LG0«Æµ0«ÆQÌj¤T–é2f5³Á&Á¬׬G1«‘RY¦Ë˜Õ• ”b.µL‡˜U~w‡·L>…vòº@pàÙø_z8ÖoKašÊ–ÐmKÀ4MhÁ4M 0ÍH©l)d˜ffƒMÓ4¡Ó4Â4#¥²¥aš+(Å\jKsçœÙ¨épDåR#ûlfÉkŽÌ«žäÀ£3™a†¨¼Ç`†V˜¡•-˜¡•f)Ô@ç^‹f6Ø$0C+[0C+(Ì0R¨.½ d¥˜+ ÔJ„ò“ÝÝ)›ë+·ŒìMŒœEÛY0Žœl;#ïº3\äòï©zÙ³­D¥¶bKèö<šÜnuënt«é9{«ë»Ñç^ɳèânt³zÕºÝ*Z5 R*Ï£òÝè+(Å\êytÆ~¾§\_?u'F0lzwäÕC7QЄ4Bú”W[ÂÝZ ¤¶ ­5ŠdOíœô)s¬s/·å’Z€×PcÛ72´6n•2ÀUÚHÃ'÷› í*ãÊ ­5[{ ÌCsØÉgåyç¯Ù#É/8¹‘J#{Xãû^½éjkl^ȇ-á ÏyM‚Jëá—«#6rÊ©Â'8ÂÓ½­W¾¸XFÉ´Þä«q—%µG­mÕµUÞѺºöèÜ+ÅU¶¨=Šbָ˶jZK³¨‘RÅ]6×]Ù@)æÒ¸Ë!dp',aÏÔ>¨³ròž*«ò9íÍ*Zñ?ÕÅ»ŒbUfKèvÈžÜbo½o9ä*ymC}‹ýÜ+9\dƒMr‹½õ­[ì­§©øH©²Ï·Ø¯l s©C¯Co? ~wêaçî^˜èÉ••îÝ%³¡ZË-¡wÿªˆÚ< Æ À/•¹‘ì Ö‚kÁ'$ûRøK¾f¹ î¾æ¹ìÜ·”ój=ûÔ’7Nö {ßÖΰoA©ãoAðe}–g³X¿kDÏ^«X=H©ÁÖm×çþRþ;¬œ÷ûb~DÙ'€Íqúsûuò»Îã‡×:¼ê]ÂÍ7HM.WÈøcoŠãã-Õ5¦Äe-¤£ý57 úÛô4Ø›÷ Ù1ý–“£_Ë–µžíûôKk]´,·ô¾©ªóàc[ÿÀ4!ñuŒøS(Ÿ!ynìwRt#ýôÍŽÒ¨ÂÅOOŒ/š;~ÁǪÏmG¾eUà;N=wFÈå¨ ì“à´Î:ŸCÚ"ÙgÜÑWVÏmG“ù_ÊüS³£“&âAòfÇÿ öeó«øy‘7.ªRÞoSNè/É÷ï_õ&R~uÒùáöÃËÿp;£Ò endstream endobj 6089 0 obj 9173 endobj 6093 0 obj [349 /XYZ 32.2500000 667.250000 0] endobj 6094 0 obj [349 /XYZ 38.2500000 647.750000 0] endobj 6095 0 obj [349 /XYZ 38.2500000 180.500000 0] endobj 6096 0 obj [349 /XYZ 31.5000000 750.500000 0] endobj 6097 0 obj [349 /XYZ 31.5000000 668 0] endobj 6098 0 obj [349 /XYZ 38.2500000 647.750000 0] endobj 6099 0 obj [349 /XYZ 38.2500000 180.500000 0] endobj 6100 0 obj [349 /XYZ 32.2500000 749.750000 0] endobj 6101 0 obj << /Type /Annot /Subtype /Link /Rect [474 758 509.250000 764.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG >> endobj 6102 0 obj << /Type /Annot /Subtype /Link /Rect [426 158.750000 463.500000 165.500000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://docs.python.org/3/library/distutils.html) >> >> endobj 6092 0 obj << /Type /Page /Parent 2 0 R /Contents 6103 0 R /Resources 6105 0 R /Annots 6106 0 R /MediaBox [0 0 595 842] >> endobj 6105 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F1409 1409 0 R >> /XObject << >> >> endobj 6106 0 obj [ 6101 0 R 6102 0 R ] endobj 6103 0 obj << /Length 6104 0 R /Filter /FlateDecode >> stream xœí]É®ãÆÝë+´`5kàzx ‹n #‹À޶‘ŽùýP"¥Ö+êYG·ŠE‰6’n?>k¸u‡s§7þüý¿~ß¿yÿù?û†?ßÞ‡º,úöÇ¿»þnÃß÷uSîøu÷uÿu÷i÷©ûÿ¯»þ…ÏïÿÚýí{½ÿK÷¿Ÿ÷ßÿ½ûáÃ/á×]­êîÏ_N¶µêþV\þ<þüß»¿ýaÿÛqÄóç†É¼þïïŒišº=NcâÓ_wçeªÓ¿¿ÿðÛîM¿a_©êº.›½²ÆîUkõþ¿ÿÜýÔ}à<|qhªáøwòãÍñãMÓ}תfŸúË*ð—[«T]Ùº¸gsk}üŒ.º!tÛ‘ZÑŽ>túWfxapÛM9Úà§™‹ïŠ2•ò.y¸¶vßܸ9ûßD<ÜF눔sœ¹ø®œ.y¸Mmû jËÛ=Æö·U‘pŽ3—Þ”óÑÂÁ;®¯k[mÿ~ϪÚBw­¬å÷ìÛè¤-ê:âàÇ™KoÊpÚxðØ§­Lñ´/£Ç8ÕT?Î<ÖiÃÁ¹v[–Ãe°º‰°A—ácì~ÛÄ“ ýÌÅwå|¶£Ñ?…Œ‚§ÒÿØA_=/¾û²{ó±S_«ý—Ÿº™>Øÿñå×íþãhùÔfÿåÇý‹ÂÔÚùy×ꪬtyš_ÿD·§'Í¡i‹×OŠòôÄJ[5õ«'Mÿη¼?ýÀ¬émÏoOŒó«ø{JÃ'ÎÑÂÃÑŠ—Ó“ò`t£^?ËPކ¿3Ú%w/<3{o ‰™àóR§'ª8Tµ:~ùÛ“þàTy(ZóšÞÂÑÞõïèó£Ë[ ,î!.÷WÜLBâªÂ‰—¿£›ðÑ´A'h”»³p²®€7¥†[üØ”D„è™Aþ‡÷O +6gªšC¼øÎcB$x‹jà^àô›òò¥“•qÄ\ÙYȯåœî¿©Ôy¢sN“¹XR`)÷г»˜°0 Â'2"Fü«ð23.Cžä9Áwów ˆE`úcf?ŸY‹æ¸®Sy —.ú­äýõÈ7¬>Æ•°í`>W|–oÑÏÒ±˜G‰ß–ˆ¾)µªŒ.6>J,ý±^]ŽªÎ>té˜Áú„°ÄÄ‹ï,–ÆÄõì¾n˜Óàw±L)J{œÒ÷n]LÛX*2Ü– ŸÂ|‹ÕN ^™™0SbÌZýQ`/îPÁ#2¿3VÖêiùƒ18Ôcé¦w 1Åa¥’ÈPY³f!u#w²âžŠ®G*)eßèž0“]&c´yÙ¥Çxël×ð«ñEC£ëó¼77Ê]â+ #éð=…è«çÖI9ß`,k1-¦ƒ‡2`¦»ù”DÄÌ O–9ää•ð-yNƒ0‰<—Ëq¬ÉA{À|@+eÜ  cR‰)SíÊv%Ï~0P†¢'µ ‘…RÝÇ€`€€3&H•Ñ:ÀƒûS-%{1Ô‡)Ï:®î—µ ;Š,!| ¦…š£B0·…à¯"LsŒ4D¬Ç˜pG°2ZDß„Âh¢žè8¥1*ËÈÓùAT²‚\Ò9& áa<¢î"Ùk¯€ëË£F‘¦jÞ­SX©jZçÚe`о „\ïùþ™áÝ së·Y·ù´[§Í:åeî»ýÓ¹þÉ/»ÏÉ£…Osx}†ölš ˜ÒBRºu§³*ÝA—löÚÞ¾týþÔåù“/Âþ¾XÃdn<tÒê0@™Wï¼…ï´è3\Óæà"£†gÝY{C±€£ Ç{cnø;ZÅ&æBnõeBf¼ ~ÅÄkAûz í¡×®×]£'Õ¹ñÄÀÑpëÉGø ¾g€ç†GÓðAݽõä|bDW Oï(Þ|¦¤¡¾ò¬%¸#žý}× W§á;Ì™¬šÆÒœp«&OX.,az>F9VQõx(Ó¾(Åð‰‚O4|éêbð|ü‹÷R w´Ä;Šg¿£ñhSsKs3t;y3ZÖ„¼Ç\šº›ð„-æùóï0ÞŒaÒИ½¾bi †ãΘOSÝAÙ枘Kc9©Çsƒà ¦«T+…£l5ˆÁ³¸šµµ$F[¥ÈÄ«5lªÌ¦Ê<*ƒ®…1î½ \ë‰:±È¤=-•vK……b!¡E‰j Üሙ¢;8§¯ˆ?NÏ©Ê81– …ûO¤ª%Ò&ˆqf,_”“Hšҡã:t˜|5æÀdã…3÷e+ Ê–˜Œ+óÍyŒ™õjjW4=h5;*Ý6C=ðÁ*9­  .` TeÜ+È @S8TÌšÖº˜oÝE.˜¬{÷)’>2Ò͈Œ¦œÒ1I ’ˆûÑÊùèòjfªþÕÙ%€g«Ë‰nÑEéäñ|í(UÆ: ”\¥Ú¸®VºJç,vðåÀU–úµå¶ <]æ4P¶÷PÒæ¤—vÒ{dFÂ@¾ªh§W‡oÞ_ÌE𺱇û„ñhØ#‹¥œÁç¶£¢ÚödcžäÑKˆSÀïxf÷ ;&öÍ# UáY,3 ô¼ƒ%7–¨x¥ø–ààˆ|>ø; UÁ}cFó¬Ÿ6Aøƒ×ƒ¹ Ö’ð Ù†ßIÆCRq$üT:$#³²°`ªK-VF tUr.†!†ôÎ8-·rQçIZ\UÕ=4’±~ª1-\:Šæšæ„›rãsNZ)9G]Øû9‡”v†“Eã¨SÞ†Z›Ô·AÔâôh˜ø ,†Bvûȃa1÷ï¶ ZöÌ€° =+%n~gy»ÛT ßðX©øŒÿ”Haøfø?µ8gƒ¡xâäò°©j«'gºiF¤6EÜŒåýOÜQÞ˜ p•_‚Tr·EëFþ«Yäbj8?QÖu«¿Lãaª˜ÑàoyÏÛèøËJRk£´k ô¥ÒÈGw‚i…ih~ëò $…nkûj-W,zRÌõè[ø¼<ë©B1ëŒöÅÜ®N‘Ñï'ãâ’bY¶)¦!Å ÕÑÍÓZ™Ùäë‘x·Ú<¨+µ ¬©\ÖòPB¼iíCpN©:Ĭ”ÚºVl²RƒLYMÌ$Š0Ôd­d c&ªeÇ—·<î«áÉXåL3ú/Ë꼸èg«\¦$ZÝpI¿u½ ‚"!çP‚P‘›frd uR­0GYU/FÂÈÊ2éD‘âd…CžåÌ ŒfùêÖV뉢ƙ–8‰*®+×BÞˆg¿ãiÀG3˜;ãÆBD8'æè…‚Op¿½&õUú\æØÂÕM>I3S[?‚Ì ¢E…çïÓÊŠš~¹ˆç;|o‚gªà)xf²4÷¬ªæÞû ŽÐý»ÿÚMÉ;ãOS¿0CmnÀ›C¡Ž÷^Û×Üø–ÎÖß§ú†–ЯHt_G}tªñ“!¨L*·X¹VPgû€¾c¦Œ÷[sû8¬tóz†Ù¬{)oMö\?}´ÀÑâHt¬ßX†Â£ÁwB-ý*ƒ%¸ãß»ŸïÝK8 (¬WCÐ"Ï©Û9‡ö‚(y<Þw8¼~ÿ¾×…9 wvÞh8s•u6ɘ>í?íþžŸ ³ endstream endobj 6104 0 obj 5826 endobj 6108 0 obj [350 /XYZ 38.2500000 512.750000 0] endobj 6109 0 obj [350 /XYZ 38.2500000 350.750000 0] endobj 6110 0 obj [350 /XYZ 38.2500000 512.750000 0] endobj 6111 0 obj [350 /XYZ 38.2500000 350.750000 0] endobj 6112 0 obj << /Type /Annot /Subtype /Link /Rect [53.2500000 407 81.7500000 413.750000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://github.com/swig/swig/wiki) >> >> endobj 6107 0 obj << /Type /Page /Parent 2 0 R /Contents 6113 0 R /Resources 6115 0 R /Annots 6116 0 R /MediaBox [0 0 595 842] >> endobj 6115 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 6116 0 obj [ 6112 0 R ] endobj 6113 0 obj << /Length 6114 0 R /Filter /FlateDecode >> stream xœí][ä¸u~ï_Q϶V$u‚;Ó3ò`°äÁÈC°Žc^#?ä離Kª®"õQâW‡©Ë‹õ̶Zyxîןÿå×ÿ<ü÷??þõ¿~þõ¥:vMuùßáüÏO·?Ðýqüû¡ë›Ão¿¿ü8üxùöòíôÿ?^./üúùßNû¿ƒ>üëéß¿þø§þiü¥ó/üþÒ©îôçßÞþ:uú[uýóüó¿¼üû?¯8}nÜÌýÿdÌÐ7Õy Ÿþñ2S½ýóßþþòóa_i»¡;ýTÕ¦>¨¡Ö‡ÿý¯—?Ÿ>0-_‡Z©®­»ê‘uúü¥¦éJÕ¡Ö½ó¡·d–Wú:Þâo;‡Š2­ò¯~ì[ÝÕM5ôð¯”Ñ u­8ÔnV—¿’¾ÒU4dw. ”Ëu{}ÛžîCÕ€ö¾|„Å[ÓÄ[ümçâP™î¯.Ç»{u‚Ð@:ï¾Y>ü/ëÆZümçâP/׳zdjV¦žnäô¯<ØÞ—°xQ2\v.•éÂÕ¿…¬‚·rù P(x^üôýå篪®†ƒjßÿ|ÚÜÛ7/|?¥9ütÖ"OüçûŸÿTUêÓ?¾ÿõe8¶º™¶xyR}†Oð;¯è‰ªá“®6À'=|¢Ñw ßñìà+±7xR¿CÜjÃoÁsRx§•‘Ü5¾Ï®!¬1 ( '5_Œ‡°Öø¤:ø¶1&â'&ŽßùòýÄþ¢s®“¡¾tnámQXy€çN0þã`ÈcŽ‚q™Ù5„¨&¨v§ø?Ç î4ðæ0†lãñIGÞ™†o +ðòùäù¤ð'Îù“G@^ƒ5Rf÷†¥D ¹ƒ‡Cn’z$?†(~Ÿïš°?¹wöîíNe!ZÃwRJÊþô ¥p»ç“çö‰©ÒLÝ-ÊÀT Dð;X« xl*;roÒ¤ K©oÛbh˜¢{†±ž•ÈSŠ24£6…cl߃}”M9³Páxé‰%d‡Ž,eÔ¿Àw*øBTáò¹Æ÷ƒm{"F†a’j‡ª.“¨'„öáñà{IJ ¿ƒ¹<ëÌ.Ï0Æ2O0¥ GAE#-Mã>†ÆøMjÕžó”œûˆã3O’J mÊáøÌ†f0‡ÜdôØã‘•;óló¶ËðbŸ«#ŠáŒM1IcɽI|ÉÏ<šâ&ù†G¦—A›­*†ÎòF êÓ´ýùŽïÕõúX›K=Ü;‚\к?öCõ¶S[‰{§FOFårnµ‹Ð›ºí»Æ%à~͇5Z^ýb-¢ð¯^Ü1ÊîÕéÑûßéáîáwj! Y¸üÏyð=aLÁ0ø²ƒ¸ C«Î"„mrämJægÖ§÷ˆ¬Oc‘}_B5ºµE”C€ß4ŽX4¶è¹z3‰†U¢ó_ÈÍ=<{½4ô|˜ê#}©êØvêÌù±l¥Î…·äœ‹ VôÄPÀßùÓÜ“JRyð¨poî ÖÄÚ€·Îh:xKº‡ßa´â…0»NçÙ5¡ SZe0W‹«þ uc«[.Žˆ(ÕI%›—ÇRäN‹Àß<0DÌl“þb)†¡„ G0{t!$-óaFtPrÛ¾„:…clò÷˜Ýš¹¥”8ÄäÁ]cÝ"Åh1‡btsüd²ö#°"lT4=ú zm]«Ã#ôeJMœf s‚÷\ŒxŽËóLSï‚éåd9u­XŽKT²Ša {V#(ŠÒ1GÃjE€Þ´5P½¸4QC×6–ñWY–åÁã©&äfV £±ªµ†‡¬ Dðбpaƽé²/f³¢žÉ€8çÓßëØt !«ð=š´‡îñ…á$ºd‘%ϨùÝ6."sAÖ½ÁXc;gf1=Z[ÄbÊÆdëù´Z,€¸²ÇDðµxY ¸%H7k&,Ý”²åáŒ@I$e)/>)‘÷@¹ÔŽŸÙñ?­ÛØŒUÇØDŽ\¯qPù0„ÙóS¹dD¾fšÁblO¹ÅÉ­l.ÂmI¢’à¸V]ý*EÌžA;y¬š½† Ë~¢úµÝñR›‰öÓ^„yoªº‡ò¹Dœè±%h)öP,'GJÊ”ÃB)k…Ñ4SeG•—ÎZ@Þ¦‚;`B‘øZ§aªÓŽ9Ž\Ϫ­3$îþ'ìû ®Lî•U‘_£t,$&y. dÛ„X¯`j8lBx.'€p²z$ Y4ü‚E©ç茘g\©I<61wCmq Oy÷zµQ]ϬˆTÜg)U»$båTe³fl̰ŸOtÅdůB*ϲÕ1„UžG}çéÛtËG”£ƒ«É—ç²abŽúr ¥§GkD¤.[û‘E¤Dª% +7VJ÷y úÍÄŠ”ž|uWPå«<‘pLP"üƒ˜ñ½€'Êû°Ú  $P*7Z€K,rR5~"kðd©«U; ¿Ð8 QpSq뿉¨²c1˜öö» L‰±®Àå¾~—7‰/›Ö0ƒNj0eà]c^ƒ1$Õhe¢ "æv>ˆG±bîMpÏ¢¥a°ñ5Dm¦©”ö¹vV2N^ìÆXïù¦rëDKçð1°×18¨R3âžÍOö–¹¢bgïÉ LªrRƒZ¶´‚Ê€+‹ó{My~LA×ô–¤ ©Ô ¨JU,Nx(vBÄ}¨ï8™"Αì©Ñ›ª°ÉT±]ÖXÏ! óc×¶yÙ´²-—0tœ,¨(I1£Ú²¥%V+™´¦@üImB¦wÚé&ohŠñð•‹Àm8caÛÏ ÿ~ýïáØ÷Õ¡mÏtJ]~zÂÙ¶9¾õôËãO~{ië£Rƒî{uý-s·Š¹ýÆé÷Çÿîί¬·ÛÖþÆé'§wîwrþ­þn•þþyùô‡xþÞ~têtõ=âæ÷ÝÆŒ™›Þ>5æé¯ˆýà'ùÙÏÆ ÑÊÆM©Õ‘•Z¬=Q ¢xoyÿøÃä`oÉÁ~VŽfäàp•ƒýì-9ØÏÊÁÞ‘ƒýŒì¯r°¿“ƒ}Z98\%–£1egÓÙÚ™ì|vŒ‘Êo—(É“­³[ÑÁ‰éwwBHHÜטêHZ^NfÎüÚe_‘kfS%jÃ+’ÑrE½RT†2£ê1d‘‹k‰Äúc—,¤’Á¦ÇóØûqßT÷¿©æ4~£lÿü[ãû-s·Š¹ýƤñ›jNã7•­ñŸbküo¿Õß­Òß#‰ÆoÔ$všÓh; †ùm¼e¤w¢ŠÖgÿ‡U\t“~ ÝÒÜøé“\Ú’\zVrGr™Ée®’KßI.mI.=+¹´#¹ôŒäÒWÉ¥ï$—N+¹Ì5Gÿ™ËÌJ.SŽäŠ]²œJdôPzJ½‡¤žÇ–”5‰SY}{•”¢ùÇZ|÷Ù˜ìsÃ7E{±dKÏ¡<ßLZÑ`*Å@‰ú ªõG¢AuTBàzU$ê§Ï_(LÎÈÆ7δ^ÈNUgjÜJ6z)e– ~*ot}ý€ã__dQûGÙFKª4P‘rÝŽ_ÅE°l×(žéˆ&r Y^+ ̾DZšGW©Úp›îJt‰8<+<ïMè þ–û ™ÖfuM¡’­g£d£`Ùž¶ßlO؉K.ò÷õ*&?Y²²DJȦUIㆫTÓZW­pNŒüàˆ±Â~cwT8ÆU²O{®Ë°Fä%¦lf"[VÄLg 𕺗£š0eEØ1‘JÎP-d]ã<òk‘r kjQõÙ‚Dvá¶(: @'êu &<’yS2§*OU¥Æ@Äo;fdÜè$%ÇEE{y„–(›¤*q¯“ªa[r&Q-Á#»™d«ÌÖ·Ò£brDïQÊõ/;½âµ­´•@²QÛ`ÒŽkÚi[8¸ãEÜ!v€ì˜§¢§ Éú3ˆ0ý¶L…=8øËL3eKAªù1TDŽӆ·4k«€.)ò¢µ©-t_¬>›Kq†ƒ­ º…+㢗ïëAÛ§ÞYÝ“Gw[_”àÙl9qÈrt±·Vª @¬¶1ÑTþv î'—‚G6c.a<2¬®xi(_L—_ 8nÔo¶¶*â‹|m×Ù‡ÀuKÛDËŒåî]glè ôXû%5²+@lcg¨Ç5ÍÈxRO6ލqSæÑêlÜQqÔìF¬©aÝŠÑÊ86[èÁÔà" oÙ* › ¤Ìšq­–[ª9ÌZÈ#®t×éÙ_'&wñ9›™yRM½–µSXH¼3jî¾3¢­vXóˆÐíÑ(=K¤s'Å︃Ïá»õ«¹'ð;#'>³#+”ejxbµ1,ß;¨z:À€ä+%™p>ãÇœŒH5ÈÖ9Â.&á‹í€™oL`Iv:'T•\]P¶´ G<&jo:‘HáQöùÕ©,¨’§a—k[E”€ÍØ&é]R«¨Ð¢xºh½™Ïž·oÖøâüûqm0 3BS6OV$';¥äÆýu:Àa7›,Ÿ¡¤d¾¡¯-Aº{s&uAÓ ŽÒ פȉ™pŽÉ°'¥‹ÐˆbHŒ”íOBÙÙ„¥JÏX2ÉÖ®Å-^´øóŒYĸûHž¿£ù*­}ÏÛ*Þc‚ì"•šŒÁËp%ј7ÕÌ5@¿‘íÇ*‘%=öÜ Ê¥cÓ„xí!‚“½¼J…d¤/‘ššL.çª?dTaãf=ò¦È«ƒIuÆØ:‰l‡5¦`W$=ZâfŠi %/‰lÝ6“"ä^¶hOÛȽ¨Qm"òõâ¦ä±uÉzž&.£n˜¹_¥ª&—å»hڻ˒êÀ*’^*‘ œOÍ(Ô"é¢jNì*0†M–’EŸÀÕÖèešÎßWG,‰u ýÔï6ÕŒÁ€†À²5–Lx‘‘^,*¾ Ê™ZFùŽä§ê.ÛîXÔÚfF‡l¤«Ü 8&δÊ3ÁTð¸7ÒkõMÕX’ˆñɘÝ[žÎ¹yjH–`dáz!ÌÄv'ÎD›%Qy·ùÂ9yÛkYÓ7©õo»¹;^þ1︺½«‰VÞ{Îcb ¾¡ë­»J‘ô§„mªžQÉš,n³egê˳ŽÃû ‡ÊÞP&·ÆÝ?§N_ºÊAYEn•!þÕDr`1½(nÉêþ—d½Q·5¬LŽH9sŸˆl+‘šù½taO$á P3Ë ›¬¨ aZýVˆÉ&Ý0éÁȵC -,©ôâ’k.e+˜T£D\¤nÇ]WËYLz&S»€5Àw*ðœ+§VYC7;mK[c8 Ë7¸<%ɳgåojV_ª¬UÕ×$"ÙzzÑ|fªc‘¬kj_F“pkòD£—Š©wŠ<­¡í,Úô„^ÑßÁ«áp™§±ó›U™ËôŠ[^%Z1îèÆÌ%–ÿ ÚÌQ6Sô56>Q#ýDÂ%•ÛŒ%f7/žÑ?ïÞž£«Bø¤' A¬ÎÀ£ŠtÍ…SSƒh“c°&’?=gdAïhøÎˆZa0€SYϓ䆕©—oQ8ýIt5æ†ñyŒØà‘ðmÌ#Ó¾<–Ág¾xÌÝã]czÄt©·Á;0˜EOj0^ŠÙM+°¯[¶$ŸØW ˰d8)#D ÁòAmË=Þ<Ø >ÁþY §eóææVƒp3û°ÖWÃXŽW“…[Jü×j…Î#XX±Ÿº¢Szä=ü¦Lu 5ÔçË÷á†󱂟àr O¡þ–›Ä^ÏÞíÀ£ÿã'X 6¼çB3òH-ü¼|?ùLXÓ‰ŠaÀàc àÕð̯aÖ^<7§hÄõ} wÄhY¥ÐÖ6 Ncæÿ›Á‚Ç3$Zf¶›FõÄ´pìŒé«ö@·ÿ¢;8§*ü ˆ3×#¦¤ºáƳk‡I‰4$LÕ;€‚â–Kɤ¥¦"œT¹õÏÔ‰d©fL3yXï}^2ys ¬Ø!¤µíšgæï;Lölê®Í²½íEºzH‰a¹&kåW ;4 ì?[»è”‰X¦kï!#åÀÄÞìÖ#B;a°<±#NêÊVie36J§^¾b V,°Œ.yXr°®µ­ŽC$RwšYàÆøÒ°ÊEøGå/{µ·˜HÐÜa¬—¹õžNµe)3€„°øm{U¢ÙSÛòqØ0g>eÜNÏL¶ye3ý0~;v=Á•“EE6Ö¦£nm‘Á\8f ž»"…qßmœ¯z0ØÚÓEÔAš*#Ó%îL"ª]L@û³Dé±cˆ|` ÙÃÿÂCìˆwREÙ0¢ííÃ<¾K8Q8ÆŽ8_‘* ³• ›ÊözöþZžº'€É½ß1Ъáž|çâä½wÛð] ê£V³ع'_˜ÎÌwF3×$­ŽMòJ ¤> endobj 6124 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F8 8 0 R /F9 9 0 R /F1409 1409 0 R /F1499 1499 0 R >> /XObject << >> >> endobj 6125 0 obj [ ] endobj 6122 0 obj << /Length 6123 0 R /Filter /FlateDecode >> stream xœí]KÜÆ¾ï¯˜sØÝ|A¯V CArrì8Q|ÈßÏì 9;jÎ×d[Õlri#ÑZ\6ûQ]ïúêÝ?ÿýðÏßïÞþÏá‡þÏ÷ŸŠcS—Ïÿ~wû¶=ö?š¶:üðËÃ×ÃׇOŸNÿÿõáòÂç÷>ýô¿ƒ=üéô¿ŸýÛé/ìéù~yhLsúóßç?»Æœ~*®>ÿý¿þò»Ã¯Ï#Ÿë'óíçÊ¢µæyŸþú0,Óœÿýí‡_Þ]6 î+ukêÒLéʃéN?ý÷?>0 _ÛÒרª<ýÜÕeSTmkO?7®ÿ‡ýxcŸ¿Þ4õÁØ®8˜ÓHþÇÏÿ ¯0xW´zƒŸg.¾+ÆÕ&<ºöwuÑoZ5¦63¹/?¸5Æ(RÓóÌÅwe8p<ºò[kZÅ~3¼Âà®R¤¦ó̵nx`tí/»çšRaÛ^†W¼.:½ÁÏ3ß•áÀñèǶ¶MY] ~Õºš¶ß´“P‘ßµëèGÒÖ¥Þàç™KoÊpÜppíëÝ”\E~þ2¼üà®(ié/O*øüN ŸàwàÜì#ZOÑÁÑ ¸£p¯ñ Šhey~òáˉ_GF #ÓVïѪ]ƒÖf;¸‡Zúï¬Í”ZÞÉó¯IÝ/â<›ÛåO艃ïàÑL¿ƒŸtÚÇmÛvöq÷ Å üäfžzâ xÜ sÀ$ßq—ËÔúÔtg¶EOð2KŸ¢ç¨ïíýe(R€kG7¢Œ¿¼=£:³ÀÖ9o$QÂ]ƓŠÄÄgÐH~sÎÀ ÕÜÛ8Ù¢&¶‹|ïñ2ˆ-¦̧®À1GxôÁä™G×êµã†{4g¡˜Ïà …{!üÑÛà阬1c’=¸Ç?þU¼„øqóçÍ…u™âX7æƒ#â²L^uEQض¯ ÁÛÐp!ÅÈ |'ðF¿ XyÀ¾ƒB? èÒm`SðÒ1‹€£•Oý”zR¿9°Ë;÷Ìn‚ÙÞñ‡ÜO‰ †"­C¬aÌØD¯¥9|€$ ¹¢ý½SB„°–FGÌjaÑQFÒH$aîÉð!F/ ¸ç¤­§(Ï—`ãù:âDÁ–eˆ1ä%’ÑlŠï Åó|ƒFâŒÐ¬ñ!G\6Ê Ì¨±-&ê~»4¬²[Ípý±($®+c»¬\F/%¸$ÖP„YI"õ…"naM(³ ¯“Ôò¤v @Æü9À¹C$™ cx=˜õÌ÷«1–BáÂ1Ã8Ç!6¬?k`óíÐ ¥?s±b4ÂÊ B1þ”Ê ÒÒ“ûj¦»X«ÏÜë¹ö ÿäEá8™À—Xéh2wžôÇ\í(xL¼cKøN‡ÞqÕ 4øî†oßh=κ¸ŠùÎ}˧á<·>Po=p´'ôÄ\®Gst ìgCºD=öŒôÞ…¸¹ÕpÕåðňlªj õg4¥vHxdtjÑHA`ØhÅæ9™¦\Ró…S H‚u‘™.-QžIâ;ù:Kuss\eyŸX}þÚù«^ÌM3•Éw›‰>“Î9̓蜲n?Âòpwü|¿ñ‰Ü’@˜ItéúÖ˜›ì©S 7­âïçÈ%òÇN›p˜Qòx¾]~H †›Kp{ú…~ê‘tìÖ()ÜGJ±¬½÷ÄÄËt#^›±W¶VgÊ< ìo.šQÔ¬qv´Å+ý ºRLËuBz)›Äô²‚ÊŒ7˜bá¬-¾3–\O OÁ‰iÌ ¤º¾ ×ÐÏ4Í|Úêõ”­ïÍêÊëaÁ¤Å€”­±2‰}!„ƒˆRI˜hbœd"µ_ÉÞ&Ò‘±’¬\§“) UU÷aâ5Œë@ÙÅ'’O]ij¤K‘ȧìSœ/Âä 2‰7 M¤®s»Ú¿ å3½ØÂØJñºñΊ-Þy\ÂÊ|ÇñTUëÀ cŠm%)ŸB€–‰S0¢³8ø6Á›¸3xßðhxÄ8<ƒtÆ—=isÓ¼Ó׀ϑ0¢ñ JèŠs˜ 1;Uàu3°Ü ¬REËĬ™ó±B¨õ0³†£U)åf5CÇXå=[få–cÜþ[»µØ÷ÆnmÝMÎGöÉJ­#F×Ì…;¤¡¤v¯"\þ„1õáÑðfnıÐr „V1õ–Ö-ÞQù°ÂˆÛÄ@@íÜq‡p ÇšrpÁÉ&ki×â1™X¢Um"ù(TúsDªÙ¨Giˆ ¥Ò e¡5ˆ]¢ "u#T®éRW  ‡iˆH©,À•"º|Q­HØ×ði ÿ)JÀª¨}˜*šˆcy$„,Š•†AX6"%M˜ªa¦üJs/ µ¾÷·˜ûˆpxge+ä3.ó¢Pˆë£­+ÕÉwà!—u?Z!¢Úá-–ÈJJœR¢(ƺºõÅØÎEÖÁE©ž´8pM EI´˜ŽÂãl  ¿3†EÒ…nÆŒ[¡ñšÀGViG«² ˜ÄÛµ ?ã*ïˆVj[‰äÍ.oólMBÏÇѧ²}ù»«$`½kµê0J\ f=ª œªõ÷Ð[%9¢­ïÚ½¬ù˜ÌßËk?š®Í¶ô5—D¶Åì6˜ Ú(o§|œªÁ|%TÖ:ÀЂ%n¸•BnJ}ï†ì†12TA- {2HÌ4£V»r.¹ÜËÖÞxÙšµÕP¶°—­S¯ò· ÒÐKãIиßËÖö²µà¬÷²µ"iÙšm_“˜Ÿs9Í^¶¤å½l-iŒ+ö²…Yï0E@¸hÛ‰¦ùcº HÔ­N`‰g58â>Îïc àÒ ¼ox‰81ó€gö î¦Ñ€ %æX1Ê.Hu ‹q%ÄѳΠ2êû‚];DpåÊžÍ;7©9æ7‘Mv²L³µq^SÅDd!HÀ»Q ÄážPm^kQ8ƒTLrñ,Gí›­œ“- NUH­,ý­²¥'ÖF§I%n2Ý™k_ÌÒBBŽ€<•Í(‘MÛ$2~J¦¥£̯,`ÓÞ(Uyr†Eðc²fî­lŸ&L6°ijÀ„:}Õãâë´7óÌ©ìÚÚ—‘ú5Y£¥²¶# Ùä:BbOòGÝ;dŠÚW…¶æÎÉózÓŒh=Ã.RÄwÞ FÊm±fy¿V²ŒÒ²¸zaFi@Û`jnñF®ª ADLJù½H)ýíR¸ G*ŽÇlWÄ9‰zÁó.YýöòÞC^í[pßVZsͪ4^o<½H<ʉ¨X—0œ¨jZF5•EMÛoÝZyì|Ц*=°]˜…W}”}ƒUç›8?5—8MÏš $}ožóÍ>ª.U¤WŸ²åFÄžzjrºÈ–:ñù;Kq€Ñ #ôŸÅű0\aÓa!`!F4©L”[îhPÛÐx­¼}©Nº4. Ž4Ôþ¦â¡{RÍÊ“j2¸m„øìè|õ%‚Д¡¥Å擜µ‡xS!E9Zå¨ÄÖe¸E˜Í²8R¶ã̃ëÉÑj5Põ¢©:ûv°Qïþ2vxô¨¡ƒ€"@, ¾²|fæJ±TE‚ä¢}*6êú¾÷Æ!Qȵlf"¶YoøËäÀ1J°èͤDÐ|u•’Ø¢=–¯h[.¿q¥hr‹¸êJ3½¹{?S6†Ÿ.˳©–½1wˆL¦d[´'VY—">‡Ñ¯§ÁXÅ”/EVÌgp¥žbÊM¿æ"d!‡Í;„RÙpûÜÁ>on†Ð¬w°Ï+‡LsŸËvrGÖ ö¹¹*Hø i¸9èP, ÞthU7“ó‘}²C´+ñ€4ôÒ¶þ5|‡¹˜cCé¸×îχ8.4kÐV<7Lê˜BÖQ:A8ãïö]2Ïz}õ¬ï œ÷œïó3µžu„s~ݾl½UN#KŒˆI‹úë–nš¬î(¤2»ˆI2§¬DÙsàêá‹,šˆ¢kXaVº&ÿ|ë…E9_í5gßÞ¨Ýj©f~ÿxc[¦ßerhpⳌí=Ó/]6iy^›¨¤àí¤Ó'aNU¬f`3™EŒrŽ7Ÿèß@UζÚì~ð$Ö3hžpÛ6й©Ø’NÛÁÔ˜-(ÍMÙzç»kÊ»¦ü†4åôNÞ€:áQkkŽ‚t,Q€! W¶5^)é0T-è/}i¹Ê„tmW$SƒªØ¨îªa2ØNMTBaHxÐ| +½"ÇLÁC¬"ãäÏq$ÿña0NÀå‰%Üe£à¨¨áØ‚ù±ÃÅÐt¨–X[ó.1Þ|R¥„/ïNÐòF„l£1œlÞ‰ðmঌ“Àù.»]<«)@2 6ψ5ÀM)ë~‹‹ˆÖ= uÍ?õý"PD:5$J¼`¸AÎFìXod!“$êjƇ›Ö’+O³M­iG.œC tbnToÍ…`ו+៦4–£S´"1–¾£¬1ån$64#½®ñŽuyà 0σál&ñuÛ(„'›‚—‰Ú3RvC.¦4kŒ/ßÖ"º2õëÊ‚„­vÚkOMË´1F †H´ÁÀÛÐ< @øC™O™¡B Ú›`ÇÀèÛ ª_à}ÃïàõàY‹ž¾Y%¾Y¸!¾sØõO.@‰pP>0z'ÚAèäãÅt€© çôëÂM6\¯”pBN[°½Ue¨+/Ë 4&² u–+>eªÆDÌ“€ÎÂHKB3ÉY޾¢™‹¾'°í†NF8!ä#Ý+×ú;è—2õD7óÄ?¹M%Èj¹˜V…ÀKAc-UǶƒ-j]‰¥ó'5å©}vË´ìÆ GXÌ0鉌Ã5‚á0U~LÐC´[ùÞ_LÖ¿,,1f[Â¥i×ökgtáK(¢øÈB4ëæ‡-)Î9nš2ÀÑU×Û_Ì“½‹q‘Ú†^^²€ðº ‡~ ì…û3.kì,Å~F¸R‡O Ÿ0¦XìÚ!(– Ö1§Èg%fp§Á†ÀÁû†GÃ3 öÀá:ç'ïsÛNó>Lÿ8\Ï‘ +”0h䘠8¦Xì%zNc¹X¤>Š–e;eãûŒC‘Ìz˜Yã L:¹éN†È0\^ÿÁ·Frï\H84Ê{ðe9B»ÃHÔÀmbfÍh/x4x%0ƒU¦N’°(í! aàÓÕ#¨ûí&P©ÊÂÑ{MØß©öšºÛø–àõš™¬mHô!VÚ§A¥ÑJìHy…÷G=áÀíµãj`©øá?‹â2€çÌ p-hœwÝ=–/Ã{ó™ª?"¤;›æW5DÝl‰âá^D4fL„zKe•©<™·QóVÔ°°þn#·‡Á–Ã@R©âé{®W†Í"ãòøDñ""‹‰ß¡àR!eMöë‹éuÃ'íhöPiGÒOÞ$¥›a›¬=‹|Ø×Ê(j 2Òˆu‰(¸@ÒÞüË@©Å £`idŸ²b/ •áÓ‰è³qWød{]Ë¢w¦™Â|»ñQ¾è€ZczEšÕ2¦ñwJÖ\$‰íj*»&c.LÒÊÈß¶>ùïæZa…u&ïg`$ɤ‰¾áæéÆÄØ4 —ê‘""{ý˜òšˆ®ÞëÆû%:3ìŸÂˆŒh )féòÇôG* ›qas†åC;Ðä,Ʊ8ÐdbØEU‡ºöŦ2 BŸe¶1dëÊð dð.¾1Ë›õJ‚MdîÑŒ¡!Ì™ôhC °µª·ÚÕÛºM:(—°X¨›’IÂÈnUC3(~®¯ {aÉå2`ŠËEUïLÖiòLã3Í:É…ïyœÒdÜ0Í M‰òÝL9J”Qƒ{Dö—³P SgZÙR€šzíâŽï)À±–M¡z0(ë!Ìo*³Oö;Œ?V ‰‡ì|ûš¢H1 2,^6‹|ùôkœº=÷L;ª:n>ñn°ÝIm}Ñ4_×§ð숓7žA¼—‘ñKe¿1Ù–Éj’­ÃY >[&߉±GW."g´"ÝnDíne S#œ‹Ã´¡­/™TôŒ¥©¦ïšh´l}åÊ[×y{(œÔ'ªüRšç[ˆ}ÒÀv·ÓÝ- ¿Tø”Õu·/Þ“m}ñˆ&sçI¿ÛÕÑúntæ[Ãw:øv ‘‹CàæÇ+KôZnöwÓÔýÌÀ¢wz¹7ƒ>±pG/”]±wiñÎhx=½À¸·R¸oÑ47æl3|gÔø> ÌÒ¨#ö†wÔtðѓ뿓@d½€£=Abñ¾9›2x´ÉÎ{Oà)¸!Làú—f’an¸0°Œ(Àu'MH´²IÄÙpX1<©æ–Åžcˆ‰PsÌËßó'4Z}aÔp}AOÚPpcÚ‰Äè0·Z*ªËxãê•it² ©ÌÃüëÊÖŸ‹Ø×5רT8Zï“›•ª"š'$œäªQá«ïŠ«^Àµsîó(\噢*¬‹õbU-Z©«‘ê‚ÏL?2‚UË«k'œÌGod4ö€ïI`H„c& ÊßqOf#Î6B …a" "f`Y÷S*D’—D*€2ÅŽ„©ð=pdå÷Òx%ŸÁüï%£qbÉ4Êo œ2¡YHe‡@ĺ"ÊîdÍNÑg2|¨Å‘~R²ˆðödÊY 6’"&LèDŠ¥0.hV(#méÛJkêgTàdK"f‡(¿ÊÅÂEóhÇ»$‘a"¬æÈºÂdãRú‡D¡þ¹JàutnÎÎ.,SMߢµÞv/×5„Ñq¦ð!j]ÓìÅí°¶W15ÆÙ#nE£—1Õ¾ ë(^ ¤ÞžÜ*¦„ˆ8ÈÑ[v‰3ϸúx¾ÿ‰Šä.ìžÝ@½[U–žXKÆW¥çá Â]À}5á#PÀ^fú[|‹¸zú÷ðõDÔAšÿ4õ 3.E{ë´ÖÂ<ŸÌÁ–ü Üþ˽nî¬õ²Éöh/åh7O.÷¥?é‚öXû•]Ö@6ø„¾ã¦ôÁ{sûد'¾Ë¥Ï™±ŠPØ“¶1»½³ ƒGƒïô<ÃD-ý¦KpÏ?Ÿf<4Þ»ñ$`0w€$Ð[6wȳ‰+çÚDÉãAð¾Ãáíû×ï{S¸cg瀅Ó1ßp¯)Îuøôð‘›ŒÕ endstream endobj 6123 0 obj 6823 endobj 6127 0 obj [352 /XYZ 38.2500000 487.250000 0] endobj 6128 0 obj [352 /XYZ 38.2500000 383 0] endobj 6129 0 obj [352 /XYZ 38.2500000 487.250000 0] endobj 6130 0 obj [352 /XYZ 38.2500000 383 0] endobj 6131 0 obj << /Type /Annot /Subtype /Link /Rect [352.500000 340.250000 510 347 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://boodebr.org/main/python/build-windows-extensions) >> >> endobj 6126 0 obj << /Type /Page /Parent 2 0 R /Contents 6132 0 R /Resources 6134 0 R /Annots 6135 0 R /MediaBox [0 0 595 842] >> endobj 6134 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 6135 0 obj [ 6131 0 R ] endobj 6132 0 obj << /Length 6133 0 R /Filter /FlateDecode >> stream xœí]ËŽäÈuÝ×WäZÀä0"ø ÓÝÕ¼0И¼¼0F–AÜÖ¿ïÌJfVfOqòƃ,j éžb‘ Æã>Ï=÷çýõ¿þçáçÏ¿þÏá·ñÏÏ¿¾TÇ®©.ÿ;œÿùéþº?Ž?t}søíï/??^¾½|;ýûÇËå†_?ÿûéoÿwЇ;ýÿ¯‡?üçé‡éü éTwúóoo:ý­ºýyþù_^þãw‡œŸx}Ý8˜ÇÿþÉÔªôy3¯þñrýLõöÏ?ûÇËÏ— {KÛ›¦¯ª6§ µ>üï¿üéô‚ëã«cßê®nª¡‡'_ÞéÛÛõP”ª—¿ý#ôøo‡.ÞÃßF.>+Ê´ÊÿôØ ÞksÁßááƒiã=ümäÑ?=ò‚×J]'Íùi»{|„‡ëº÷ð·‘‹ÏÊ¸àž§ûÚ(Óé¦>ý}hë®jú^ŸþÞ™ñO}W£û>â‚ß=>ÂÃk]Å{øÛÈc-¸ûôo!OÁCñš"?<7~úþòóWUWÃá´¿ÿé4¸·w^þø~š”æðÓY‹žŒ¦ï<üKU鯿?|ÿëËplusâ努ѕª‡WZxe€W~ þ ¯À÷4ðiø 3‚ÊÀ{à—V^QðÊ'8j¸>ø{\9÷Á+¼ò%|v*¼ñ®êföÛë÷Ó‘Œ~šN&ʧ îŠT;VÁQ¸/©÷À[Wð8“Hn|œ3ƒçÏx%Í9kšýœíçl%çLa ŸM|þ<ê']jb‹§OƒûÚc‘â…ïÁ«m.<£ž•ÃïÁcÃçÎglpx®ÜUƒ¿§`kKe|²j“Pvõªõ¡çÔâuħ Ë,£ñ^Þ˜6òxJødllJÖÈÌ*xN³¦Äù)yµ=såÎ')éDw]½‰îNW%sf×6oã±Õvì‡êñʨ§®\±>Öæ’q}Wf—ioŽF÷êñ==ºG_DUǶSý颭<&î—W©cS·÷À±Çoâ{”_Zç]Œ sÀ’÷Œ›%hF=#€ë3cÃWÆíÚ/Òeÿ*}½´dY˜ÃŸŽ§>Má{ðFÇ †ïyEG@á{ˆEö|)ÞÎxœåÇû;Ñ™À²Äóø´Q%-¥g"‰-ÃŒÀ³ñ*àeìEÆ"‘ìçØz­QÊRlu ލZ©¸át–ÓÄÓ@þC ‡÷††ûIUÄ\#ðìh¼‚Ðhñ4<6,±/ž¨2×›(‰MHJŸ°%‚‡äˆ/øϦ"¶NÀÙÀòˆ™‹º艹9®X‡àÍÅì¥O&ÞÓ•0ùS\ýboü/PÜ5èʺÃ3Q}½ãÂsâ9AŒå ¬à®¡ÜFô1>q…ÑHžÙa \f$Ä$¥ˆ!Q[.6èB>=‰äzæqš—υǾÂjO¶¢ˆÃl`,Aü®îçw+ MÔ¨(›q÷(;ËçD‚ÙçŒ]@¹5Ù¬ Y/¿-ÿ†ÕL*“’‘ y@žIa nè5™+\ÜØQG|%AN\kÛÕÚH2*o,ϼa —ùÒU{XTp„AO1k»1÷Lدaô³ ËmÏt1nÆî-®–TÆ´¶„+§p>®GÅÕîsU§ñ•}ežØ2®QäØÜk‚M4–ÜöÍST/;qÒNœô.!Ë,ŽLHœt:ØOœ&,wÊé]Q:5P? ÇöœŸ5µbÛÍÆ—ëÅhPe‹mÍÞC.”2aòáÔšæ÷t¼v]Øje4LöR°*J: Äš°„KÌ:+ÜËM‚öÇÓ’/U6zo!eïlQâsËU–`Å3f\î8Ê‚îDzé0lž06czJéÅ.dÀ Åf¯Ë•^–ù®¸ì‰{ö"[ö"•Û‘ .X«8VŸH5ÂÖ YúQ‘öLŸ9tT,0F¿ÍˆgL›Á:d{üq]ø6ª‹'SvÁ´P.@–Þ]yÜp}ûlÌp<Ý!Zº Ü{\$·..Ìš-ëlË6NÜJZH ÂÔXï»ç”WÎþáuo,½–­ûÇ|Á[K¦é4vÃc[õ‘-ˆÉGU€fbÔ´¬ÜL$µd‹”=_JD<˜lÙ´¢á9fe¦AÃóXv9‡Dö‹m¯šÂ2î¼HH©Ðb*)|UiÛÄÜO˜õ±‹­ÙÕiÏÛ\Ë"zb©ÈD~J Æ©PŽ« Y_&ïM¡7˜}'ø—ßSÈI؆í xz‚€ÛТY(9cà±Ó°$’` tßbj§¦[Þdl.È8ÐOÁQ9¬ZSñ<|àÀD>>“½•²ÌQmâ¶£ŸžA?ʼn׭Ö6´^'®jï_,4‘ {§ÕªEIûõÑ™°÷ÄèÑ–f~o¼­îõU^‘å¹÷¬°ßI²}óŽwfð¨kÜmÏîZ¿ß#˧Ÿ†;Üx8øá=ö‰ðìë’»=1'+Õ{ö¼Ÿ`òÜs _O«á©÷< _3Zã}À¼^1éz6֪0жWp›Dç K”üšr¥l•kZ²ì¬±LÛ ìÔU;»Zë¼’ÊJ*ùœí²s{kZ´ì„û _Y±ìÔÍìj­óJÉ'Ýã‹zÌžNи5žÑ‚=Ù£%ö½#½wJÖFù¯Èi£Tœîo¯¼lÊ©ÞDÀ# W—1²YÙº<âOwp,¢m ¢Ô í>Úa_*KÚHPºP‰ÊŠ=YjðT…"=—6ÖˆŠê•(¸2²“F –Ndà~²êL¸²DY[¾ši‘›L&-/–‘­:b _¨&<)¢šÏ)µßdÊ‚v®†u•|m«Ìé¹ê]ªËA®7~±Î¹¡Ñ£Š-ÀÚ*°Í›h™ÁªúË1šË"™‚QøXØzÄp"-ê(¬i§x¦+.é©l¡÷^R‚ðà0ÌZ®>¹¹ ¡:¨b¬ŒµCÊh{ñd©cDûâ‰ðßÅ&K߆,,„˜Ò¤\:*ŽÂâDÍZdÇÖS .R%™?’PÙûL°ÃJÍb¸mÂjsR1õ‰f™e¸˜‰Üm•Ý1,Ú1ŒlªíÅUûˆaP$¾[N‚~óïKT´K’O±¤ª‘MB Gð%ˆ“K6©„iï ¦ |LS™{!Öñ^|³D¦ä*¾ÉŸÊVj«ÁÖ–ÙíUª t9ßžÇÔa¶Ì¤Ú'9 A–§7жK?ž–xg²Ö«4äU•OU-"6<^°lì ['ÐMÕ…˜¢WXzeX cw=ÉfÆ1E'€ ð;';#ܵ©k[–—)Ü|³YÇAXÀ-ß®ù3±c‚›BÑ aAB LSÙs[§3–AùIfôXÜeĩꚷzWåQj®Ó§Ú…Ã2É–¾A1sÈ}y‚ê`$b6'jÎ «³e÷¨&D¥ÄÌZ5¿97”‚C3(uAÑS•vÆÚ#Ù2JTõ,^¦Çà R4Lÿx&å#Âx.›*ߩ㠲s×IŸ¿íðR2à.ÙÆq› QÄÄ‘ŒU wvÙÖƒÊ~Âõô^Ã<òLÚû_„ ÎÉOiãùR|E¿T¸Ú>rŸØ” âÖ±«hRk¼³¡ÿM‰s¼—³^9¿ª¿À½G_ ¿G> LèOK=†®’‰£ÊJ-Q0ÃØ!l‚7¤¢b0úûD社ëò¸Ez–­ev )•ôÂÖZ§g˪¾›c &L^Õ8dœòœ°#¬Gt3¼Ž, ‹š'PM ÷y¼Ë–'Öv(So›5ÏYTà0h[Æmº†ÅU–ê03$ù½Ù­ò䫜ˆ;•ËÔvKäîGAûCEQRuënU“è\Š ç`QA„5cÂ|x«ì!Ì ¶ªð¯ˆÓÅR˜æ¢\Ø[cq*°8Ý3)"hyYŒ‡h°²d‹ ìEÌnÓYê2UQ¦Gì‹RÙ‰€ä)ô$“Œ ;Ä©Cþd€¢ñtO3Á£;Q¯B,¨™½*›1LÖ‚–1è æ*KVn/Š ŠL6˜Ä#µøÈ¹CYÊ,Þ“ ˜ÛUCFÕ0‹Ÿ KÐa ‹DÅJ~®»ma AM=?ù¡ 9LÝ Wu@䘺´í­­@Í¡¬»%ÛÇhp¨)WO6ÁB¬„ÐN¸`ÞØbve¼3!‰Ü`*L´lá^*¯.[³rûAÆ,&«mE·Õ"¹Òšþ †©¹Ô—º¼¶»N¥úzÝQd»3˜‰+ã4GmÃá™{ôïà=ÍU \ŽÁÝ=ïXÔÁ<ÚŽº…W^‰§Uè ¯à/CöJ;'^‚+w‘íѼÉWpMàüRbÔÜUF‡? MÁ]…WŽ™üÏìà=Šßw¢gv.¢¹;G‰u 1CgIšQÞªî8h+†Aœ%Ï|ÀU=U_ëxìUŒï·wêJç¥_‘*g*=<îƒùå½cÀ3•B³3n]Õ+{á1¸é&DúQ<‚Ú©<ØrMÕ°Ðrö€¸gÃ3š‰¶TJ°áQI{%Ä_ŒÑUPІ´þ ¨ÙÄ Fð;3*Ýsc)Gá`Zª@•(Ø$„vk¾¸-2Ê™é$˜½úÀ4pX‡,§Ð }xHf,mqþ0¯8YNv¥’«²=zDTï3ÒG–V´çH¸BŠ©j[ÊÒ9ˆÎw@y§g¶Þâ´D¨þFH4´Ïço—Ï—25çYgŒÙ$¢™«à ÁAÑKZ…sªÅÆqbêáÁÞiTs‚øSÇìNfdwÔ<ÜšÙ]ûl§cܰE%‹é.1ØÈ—çúP—›¹SÏJ¶ö„ÐUVþgeéÏT}4wEêÝô7¬€“V].h< Ùž¯8LDù(Ëd»¡Î0pø †¸ËÖf ¬š^@‚ªºÂÁ@ÕNû»Ãñm8Ëô º2.ÓÔ¯|BWƃY~¨ëfA£Ë÷lb'7¦BêK#yr_² ã•1”PÂLÄ«ÌgR ÎP¯6ñ¼8UõưeTãU‰{HWÕü¬–²äKØÈ|9-oBý^j«©}ùÉ"q¯–‹û¾­-qÿqJtÊMòïFV ÊM–˜rµ'ù/”g/QjâÙ)LÞM…È0—ÌúÕ7‡à¢!”«!΂þMÎ÷ÇóýçhdßÜÿäo/¿z|†8ÎÆÛÕÏ#¢1cƦV¶?ÆЋïç™} «,óHN‰ø¨Ždqä^ß2 k‹œNUÉlèTU6²½ûrQ Q¦üÀ’ó Œ½¹Œ({³H·­(H±˜ú¦Ñ–Â&wŠ\D+Âð=u*2Ó¾¹ZJõÈ÷2‘òÝ;R­çÝp&C«ÈT®0™dÆýж nôäiUpÅOHÓNƲá{—N-%¡v=0UQ*œ(Ÿ#¦ª¨[KWÏ!ƒeô¼¬ˆÃccÈ'`FÒ³'D¸ÊK›1¼˜¦\žnÇ‘bšå3€é²!á`$ëI0ë$ƒ[d'ÜÛp¨û ¿ë* 8p”ˆÞ™]C‘ëª4ú‚¶ž¹뽑ñÙ/2‘““©ØGø«¨iIõucóáØB¨ W©Uêv\°* Õ‹÷#n<m†LÄÊvÇ ÎuÍ3§Â‰%à(Sº™¥×ûÈø0LöB–µF¤)T‰žµu¬¼påÍ.ÏÍêúÀ¶™gòq7U(%à J4Ò+&¬S‰õÆÖbL¿v‚Š",g‹ÿ Jbj™a°Õ #ŸÓjÝ•€%p,dƒb±¡Œ ‹ØËš¬àËI ÞUß,)FŸ(toûsUûÐ\ëܯÿ=û¾:´íùN©ËO[uh›ãÛ´œ~yüÉo/m}TjÐ}¯n¿ežbîßqúýñ¿»ómëßqúÉéžÇ‘œ«xJÿøŽ¿¼|ú],èÞh­·WïI·ÈŒN¢ƒIˆSJž8ʞΠ@%(LžY ÈF1‹ ÛR#29EGR¬—§îì­ƒN<~d, £+)•À5S›³áqÓXjfU ´û Ùs¦I×=š&]?ešœòh6ô•kš¼#×§˜ûwÜL“®2MºÆ~Çé'Žirþ­þá)ýã;˜&½™‹L~€ ´{V*šÈü¸ìEž*³¸FQ2¨&_MV2†#xcdŸQÙV4± VÅ©žŠ‚lCª³[>Ðv¢í*ë ë@aÒì m{ B²(¥g7,žæ˜½‘=^·s‰ð ù8¼²>Yøä9üÅê„ “,t‰Z%ß¶¶«H¸Á¸Û˜ax#Qâ,…ek*õ€e;ý÷–­©´…e{û‰…e»ü–yxйLje;ý÷–íôÓÆ~‡r°l—ßêžÒ?¾#:–íôf^¤•QÝáh^Á°ÃÑ„lÕTULÐ;;+ŽðQ âãL…ã 0ud6"™„]-xfó&vÌàHÝÙšnÕ;Ê¿­ ê$•œ©¯þì¨ÑïîyÒKêõ+²LR•Ô{&’S/à‡˜öÑ1Ý”bÛG8ýÄñCοežbîßqóCL3凘ÚyGíú!çßêžÒ?¾#Rëë2à> ‰ ^Jv¤¢Ùg('Z²BŒbš!åM²>£ü—µNl6Í£ØlÚ)±Ùô¶H;ýÄ›çß2O1÷︉ͦž›qÞa\±yþ­þá)ýã;ˆÍöÖñ¶|±¤ª{kJFi–r‡©ðQZO¥öq’'ðaš^Ã÷Œ‹2uEÁ+Ÿà¨áìP߃߃ŸaÎÎÈ»–€c3pÞjxg‡À8 \Sfv|^mÏNÄs€Gׇ€à`8 žÑum”œÆ#"Gk¬s“y„^.Bxšè§vh­ù8>þÒü±."¬#Û[΢ÁUH‘»%%r>j1磳œnÒùè磛p>º›óÑ=8å|t“ÎGç8Ý„óÑÝœîÁùè:ýî|ØÎGÿŒfÝÛ²íŽÝ¸­²0Öª³NÙn-U>~Ll-a4†(OKÞÕƒ-y³q—|kkbÊË&í°Á±Ã† ;l¸ÙaÃ6XvØ0i‡ Ž6LØaÃÍì°!¦ªëÖ÷`ÀÕEÛhïÐj. ž|œ*VáÚg¼,¢=WE`ºc.SGu§- Á Ÿ(–HÄ¡/›d*VÀP!‰núز#²oÖ ƒw&¢§M&—ÏÍiƒ _¦@KÙ"«*Ä1£§ ¯£@£Â-Ÿdø2¥¸PºCb3ŠÉ”6Jß5u¨—£ne;öPÌ{‰ `žÝ™Ì½ÖQÙ[¬ ·Mß5ÞÖ4^‚ šRõCM©f"ˆ¦Tg¸Î?±ƒho¿ežbîßq ¢)e&‚hJiçÚ ¢½ýVÿð”þñ ‚hú¶b­›mÏ–-†å+ÜÀ´±`¤fý= _a`ú8ܪ±`} ›gÔ«´(§ý£„ÖY<åÒÔ‰)3c•™©§”™imEcZW™Ë<<ÅÜ¿ã¦ÌŒžRfF9ïP®2;ÿVÿð”þñ ”™¹ö ­aÏV*[ êL9šcÏ/ ëæ=¿´ç—öü’õ-¿Žñôd$N¿K8–ÔX*êœËlÚ@^EPlÈ|J`sî!‡LЊð¶æga’•}Ùò=Ì~­+Ûˆ"!UF4z#Þ¦Œ™8»ôn¹Ók>¦oœ,Ûòk<8‚lÒGïÆ²í©{àî”=˜ÉL<êåñ¯È®~Ñ^úÞÞQxÔÅÔ9¤2Ÿâ7)RMÅú¢*_ñ‚;žDí@Ô.žº]¢i¢¯Ë¿Ä+ˆ§ »ý8cÉô#gÔ;–‡Ø~)µef­´% péæ:áBP†ÛHuï‹ò\º°ÓéÂÎL¥ ;› ýü']xþ-óðsÿŽ[º°SSéÂÎ&š?ÿÄIž«xJÿøŽéÂîºIKfÞȸYSâC‰Ñ@ÑvÙ4ZÝø”e¨Šæ˜©ÎN1Z_ €™Jgo|°µÎïž}Í8œ ë,xÝLJȂ¤Ý>T؃YÞ5‰QkxŸSN"* èÉ•¯À&~â¸j-½†Ïÿn ­Ê |ã³"¬–‡¬(¤ŠHEÑðl)ÉJ›Ûì]œòáò[’oyãoÏ223 ½±EYæ­ì. å È‚hww#½»@¥´\´R«"êˆ'úDíD&o!¢½fÕ¥ã<„ñ¹`ư¹5ÚqûÛ1Qµû 0 QsÍöjîê9³1]¼¼í®º†¶%SZ`Äá q:u¶‘üás¤Âˆq¾ .KQ¸kˆÑ˜è”®j'+Å hßY õBäN0JYJÉÃüÎJ0»:„ÁÄÇ66í`õò8mÉ}>¨#¶<êë9ÛD­CÆ.})µÏ)é¢+4^H¤îR¶iô| ÜQ®˜®zi檾})sÅ3¿¥(‰ Q¯_™f¿4Cêý‚g¯0ۼlsW¡n>MpÔ¸!žQOû¢ôìò˜ÕÀoGšf> >> endobj 6136 0 obj << /Type /Page /Parent 2 0 R /Contents 6148 0 R /Resources 6150 0 R /Annots 6151 0 R /MediaBox [0 0 595 842] >> endobj 6150 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1409 1409 0 R /F8 8 0 R >> /XObject << >> >> endobj 6151 0 obj [ 6147 0 R ] endobj 6148 0 obj << /Length 6149 0 R /Filter /FlateDecode >> stream xœí]IÉu¾÷¯¨³Õd,¹†6É6 ƒ‚||0F– A#˜ÒAßUKUGæ™ñõ‹—YÕ5Ä {ÌX^¼xûòË¿ÿ¯ÃÿüãðËçïÿwøµÿýó÷§âX—E÷Ïáüëw×`›cÿó¡nÊï¿=ý<ü|úöôíôߟOÝß?ÿáôÓ?öðûÓ¿9üñ?Oø§þ/ÿÂoOµ©O¿ÿõõ÷¶6§ŸŠñ÷óŸÿïÓüËáoç‡åúͼýÿß9oëÊ·±°ôÏ§á˜æõ×?~ýÛÓ/ÒV©š²´ÕÁxç¦õöð÷ÿ~úóiaúâØzcêÊ×Å{ªíy¥Êž&±íé?ÎMzý%4}†ÉëÒæ›üuçâP1®2ñÙ%/·-L ²Î¡qöàoO[Î7ùyçÒ@®N~lªþø3¹tsZ·*kw¢¦9d%Uã}w1u%3—Ù3\{Õš6ßä¯;—JSxòcãqµ-ýù–Ï7\6=ý\»þŸw‚¬H¬ñ9n¤ÎGÁëâ$=äÃ¥óÎÅ¡2Ü7ž=ó…צmó±ŒËì9îÛ–ùî»Ûy&–'Ï}Û®¨3Þö8{Ž q§ÿÉ7ùyç¹n;œü[Ê$x'ÝŸõägäÃçO¿¼œ°:üøóic¯ v¿ýøíÉŸþç¬xsøñ§Ã¿…kÿíðã/O¦8VµiNjÛùnŸ_GüÑ»N›G|õ:⎧ŸÎŸ\}óÒÍfŽe7t±¯#ͱi‹Ê^ã 4bðH…F"{ƒçavP”ý:e¸Žiàˆ‡³Á½ð¤¶ßàÙ<±-ܼ9¼Žý ñàëëHyt¶1oa ×1.}$²k¸ƒ¢ƒh³x¸°…×Ï ³ƒ„âÛˆ|ƒñ[éõ?Þ¸âwˆs8¢³%|ÉõÂf¿þ81á<ü³´uÀ@#/ïƒ!["ÈÐÙ½}IG`×Á­=ÖU<Œ-øˆ:¾0ŒŒøèÝ+0nZÃé0]#Ó×öq¹Ö¨žM”b»/:ÌI#¸ƒo ØX˜è¥çŒ{°V#¡=KCÂl ËI £ÄÒÝójÊ.|g¼2ãlxg“M0,ÓkDîÚ"[šð‚*iQ?lxvñpã(zµûùé¡uݛ֕æ$Áen›—ŽsZRë6`c·â­’EDö ݇ŸãP‚Ù—ñËEЀ!÷·l ‚ÆÐfVÔìŸH{|ÝÍ›‹4pÄÂG>£wà_àˆG#%>œÍâoà®1 ðlxצ…#_ÓᆿÁëÈî Ã-kx?Üy&v]½5 xSѶ¦ žf‚™yBŸ±ñ:b<Ä|+ˆŒ¦©0Á;”” æ±&¦A͆ÙâzWÄTYï%ÙÒÁd\\Hä…`àÖBJeÊDCØnac‡¡w=³Û6F:á DËð(á[cO¦´ƒ!@y}†;Pce}!t¸ÃÞ«|Ih€V‘ÏÓ=“êè^ÙæªoŠg¸NG,¼… ®¡cÆç>îÁ9³“¹Á ƹ·9i½»Šó·T&wϱQjmš$Ìx¹ë‘3Ü+¡|––G,Áï* ?™’¥[Eài&ãµÎ¿=Ô\¨>N¹ƒAü8§Y˜rQÀ‹“ß`²L“Œ œÚA$ F΃Ӝ0¬a‚B!–(Ò ¦3c¶uõVL™áz½ý KÆ3\Ü à˜ú>ŸÑȘC6ý¦…/2kál/ äK¹s;¨ ð7x|R 7|R|?‘½÷£`×qº¶crlÊ£UG©7un@YW‘ØT:Œ¬Cþ>„ðíQ?ÙHùÈ&aýLY5‰^ÙʱYÙuXaED4¼k’r´A몲2!É›èrL€ÑrnÛúo©ÊZJvJCÄÄ^©ÏlÕÆhá· ò1³‹[ÕI´\æ/ v“õþY³V~€õb×Ä lyȸ8´l¹Z6Öî¤hšnÚ‘ÃIÒfH;¡`jüDÖa|À -g˜Ž#ŒÓh‚·òSSd§vœä§1!KÐ"'x‚dÅ*ýÄ©²4…Óº3ªy_‚—JÖvÇ X‚žÅÐtà Î/b3$4Ü­BAJ¸À%âË$ÚJT¥¥j÷àšÑCPº Å ä¶Þ€B©’ëÓ@¨ƒ£&ѵGÍ-@@Ce7(íZ6L±ˆ1oÆöØÆLò¤cˆ”Š‚÷]åB¦â)S{‘ÀŸÝs0ò•fEítF}Û?tÓ,â½©Žˆ²FßOªR“[ì™Á§Ø3ɯb&xº)41ÿ×Íü‡,‡çcD\Ùî}µ»$ºé«~b¹“>àõ|™Å{™Ãšå¤AÊÊ!¤@iL ĕल¡¹zÒˆ-†b{ZÒˆl}D4fªÃ®·UQqjØr‹[âh Üdl¹–›EZÌ*±ÁóV&]I¸÷6ïÝeÄ$p'"¬OÜ¿¢êèb•i )ÁbaDF…%l÷ ×úå¼×iS¸õ ~ç6“«ãÕ.ö—ÌN޽Wʈƒ×!†*‡Ô)¼»z9+r¬dvbbÛ#fxLhûćõ¢öò/7“÷åËC}œnP‘kQÁÁ+G.ì¡dLù9FüÛ³§ðÖ”Æ>êùB¶+.´y5лcùLü ÁSòs´\SiÚåÜ/J¦Ñ3úŽ'ˆO!® â0a ŲÉK;Î3W«pLÐ'&Ò™-BŸP¤heIÚ>‚Ô™Y2q»›°Ð €´s´s?A¬'•Îù<¢D‚JÝ^/5h™bt›Gÿ¨)Y1~Œ¼áΛ妲ú´ÂpÎ(¶Nᑇ[0ù‹„åq±gEN;o²u_Ń`µšO1@_D;&n™÷0²Óº™j]ëúü_ÊÚϤgŠVðQKËÖdͲô=QÜÖ‡4â®Â‘xW3„Fx‘î F âSäC#¤J&6š¨]±ê"zó÷æ·Æd†rmå°]ñ ¦ÐV‚!G)p -n=Ô|XÅ}Ñ.‚2¡ˆŸ-´8Õeã§8wJ CÆç·CÐÜ77/LÛ,&Á ª'SÔk}ÏRŠG¯/·™žÐå…Ká%0&X óÎ-k†µuH7ÃÃN_’h©°žÉ)ð4·¢_:ck’íÀ#â¥m“üû”Ç¿\kæðí;Áû`¦»Añ-“J|¹¢HÁžMîj¬+HµË)»ÝÃÕñ‘]L¢‹l_a£çÃ…F€ëÙ´•‘wc ‘cbjvíf‚:Pï™(ã¢Ö‡‘ Pf$SìÞÀFˆ:dB¢Â²° ªHÅb=Žœ¦—@33›éo§ƒW.Þ¹ßcŽÁn›?æ”`ººHçT×~ÉQjƨ™’.°çàä¼Ñ×;d²‰À¹ýY"-D5ha“Ÿh*ž¬ä“ÅבÿE3´}³¼p*¾‡Pß¶ôIù¶ XUm_¢³Ÿù¢êoÊÒZ³«­½¯m¤°ÝJV3%v0 “bN¤~GdH§VÐ^¥“µxkÙܵ ;Ì“[-)]ÒD²Ÿ67ã,Ζ‘¶M°ÂHqêÞæ[‹Ö½…NòÃAr›‹};tG›/RÞ¬Ÿ»pÓõW(«¡.y¹”{«ýffFúTÇ>Ûóê8[=3ß ¶êzÊ'á7=o­m®Ócœ?NRQ¿ Óí !ÑpxÞÎ1·7|žÎfáý´pÄÁ]N¿Ÿ^¼œ¹ŸÞ–ôMo{?ôtèjÝHwzjÕ$Ü)†¨µèð†u/†ÍÍ–=\¹7¾UcÔýºžØ)%e¨Õw;an½9dŠyFd‰ØSÙvM§/Ö_ˆ‚NÂUˆñ7¦ÂÕW´xÐ,[…u‡âØG‰c‘2…l˜£åû8ó Ç“1˜Èv ß¼÷LæTž^eHbµž¨y¼ß¢¨{òsE‚€šÎ„cÊz¾$„˜ûªÁ{yÃH¹;©£·Ù£ÉiY«]¨‚=žã-  óÔ<Õ“sŠ—pì:!‹3b.1÷p;PZ¶¬!ÂVáƒV¨6ЛÁlo(sè„uå®ìŒ°5¦ ›‡@‹ÖÚ’µY$°$™¼ú¥”À ‡” Ë;§D=î’¾?ÓΦñtaOU5fñôÞºâ8ñ]|A#ýÑÊ£¨ëp¶È7Ÿà7-úf(P[»Û½úæyD‰À6o¾¢‘+ËKøM…vP`¸eï,Ò³´zl7K FŒÝO×%"Bs.:˜W‚ñ¥cw£S ™yF#¦F#~SÀ˜ì~¦©xP^ÀÍJg.½} Eròzø¶/¼.D»½tW4²ºvL@›öÜÁ›±m`6É cæHáýÃgy)–î*ª²¼=¡bnħcá7=ëOƒÛ£T·¡Ðé·Î¸cd¹Ö ëŸÝ"kØæ4NŸ1ìEØ·l-™;MòÔ”ˆÒÅ͒؉H‚ oP&üØ¢úRÙj>ïs:¬Œ9Þz¯ #ÖEH!Œö¦ºÌN.~­©ëáa=ÂÚo0@qÅ ·£ÚÝÂý`/% oÂ×½á8 y­“ÂÙüÆiÉûmi ÷-_Où¹&Ňœ’E(ˆPDkmð2n€I$¹ë·'½‹$1#ásUR>QE­›ª§~Wý„&ß{·¯à/!w'¥ÅºT«&÷8¡UÂí;ÉW)1o &AŒqa3îõ„"‚_Õ¤öú™šnb˲Xf¦ØfD0vŽ’À÷ÏÀuðe4u¨á †¾a-½lÿXqcb‡"'Ö­Àrï†Uá¼XÊû©ìû_]v—omì°Í¸|ñ7ÐåÛËÆèð1¥¹bK8b!tð:¸¤,ƒY§#õÑßÙDñlø¤;.ƒW›* ¼»ìº)ú¸c'ú$;†ò1•X#dâuvèD' q‘ºèŠlB5å´­,. ÓˆX©:&㓵þ¶Úz±8å­´ƒÂIZNç+îÅàe«a¤P­¤!&è~}›P] ²{ÁšSïL±' Œ)ƒ–5œ)@‹Yn$Û_V`ÊXiù$˜ø®ÌùO5±H‰Ùæ ð\™Ëþ$r¢ÉZ[¶4…Y¬Z^H#O‚ ¹½3ò–¢PßÕ4Š 4 ˆ‘fDy†¶y7)ø v¨Z¶í(ñü' S¬gó¤\¦;c¡TßíKÏn˜œiMàúÖœ@ÅqcÝàÁ4ì^´„KÒn?9WÖ¥³ÍÅþò×0]ü ÕÂ.A„Õ3‡¤nßC¸G¤hM4&Ëã·ÖæUÐdÊ_2‰ß wÑâ|JRF‚o+"\ˆ*Ò;\ ݇$}s‹mH²Vp,¾Fu fò˜Ê‚⿊ôäü¸A"1‹‘ž ±ÐËIȵåâ­hÕÓ’Å´ê¥à½E8¹ìyd‹…a ‡¹¤lEy-™2¡ƒ«’©VOì!~>ÄÏ›?³Æ6”wÜ^°eZä&Ô8ÜAÈŠ(³’‰B`\$"‘l {PûHíe Óž…æ‡@ž‡§«Yƒ ð؇~±ËP „ãÑrîeçj‰r2òŒÄ$– ÊbòžäU¹ƒ¨ÊB¬¶ë‚õÒ›1 ˜èÕRE¶ìed @ê^2¢¶gâ{昆Vÿaª|4Q\;¥§7S,/*®”€¦ÔþJ¸\C—ñ: É¢èþ\í™ÒljÀT×[R¥sZw›:à‰Þ£ì ßᇠñN‰{ÃñøyˆDÄ1í%Ó£,–U—77MÜ 3ö%$?L¦tGŽç²¸×Ûç#ü-sß,ÑVÔ™»™ß´Ó,«ÖÙT‹•W0ectÂXDÁ[ÂùµYFY¢WU„•ßUu«˜sËàøxR¥¨^‹«.©½±Äý‡J´ysVŒ¶. wßðñºÑÜé×áç zQà~[ú + ßÌÿ„@…9{ü—F->Í õÌÅt)öh»è€«‘Ž&TÓ‘¾<¿=Va™»>»6gÖqK(<··—þ¤¨©¶øË–Š‘£š°£XœÄ¤zæÏ¿éߘI:úUv(‹pçŸO;.Ãîk: àÙ0 ¸";F U;Œ%='œy‘Àuztî | ³šàD*|1‘s QF“I&0ø›ç~÷Ó8'8‚÷Ök;sÄÞ †Ÿj:‰€RëØì›­ wìéýºÇkᱯëí.2µo‡oOÿ<«8 endstream endobj 6149 0 obj 6497 endobj 6153 0 obj [354 /XYZ 38.2500000 278 0] endobj 6154 0 obj [354 /XYZ 38.2500000 278 0] endobj 6155 0 obj [354 /XYZ 38.2500000 117.500000 0] endobj 6156 0 obj [354 /XYZ 38.2500000 117.500000 0] endobj 6157 0 obj << /Type /Annot /Subtype /Link /Rect [324.750000 431 399.750000 437.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_readonly_variables >> endobj 6158 0 obj << /Type /Annot /Subtype /Link /Rect [153 144.500000 188.250000 151.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG >> endobj 6152 0 obj << /Type /Page /Parent 2 0 R /Contents 6159 0 R /Resources 6161 0 R /Annots 6162 0 R /MediaBox [0 0 595 842] >> endobj 6161 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1409 1409 0 R /F8 8 0 R >> /XObject << >> >> endobj 6162 0 obj [ 6157 0 R 6158 0 R ] endobj 6159 0 obj << /Length 6160 0 R /Filter /FlateDecode >> stream xœí]Iܸ¾×¯¨s€)‹‹6 à5@ È!È!˜É$ŒqrÈߪ$UWSú(ñ«GJª’v·‹-Š|||ûòæ_þ~üçoÞù÷ñÇîûû/‡ìTæYûçxþúáö]ºŸe•üvø~ü~ø|øÜüûýÐ>ðåýŸ›ŸþwÔÇ?59þõo͇?u¿tþ…o‡R•Í÷_/ßëR5?e×ïçÏÿuøËgì_×-æõÿ0֔ƞ—1ñêï‡~›êòõß;¼iö–¢*mQ•m>PµÕÇÿüãðsó‚~úìT[¥Ê–Ù=/*õùM¹6G¥ëf¦æ¯û¢Ë—Ðô&/•Ž7ùeåâPQ¦PþÙO•5Ê”:·çƒ>r^Uºù¹4ÝŸ;Vؘþ2}„Éë<&6WíÀñ쑼ʲ¼Z3“8Øn¦0y—x“_V.•îÀ=³ ’ïJë¢P>ä÷ƒèeú“›2âá^V.•þpñì’‡k‹<æá¾LaòBEÄœËÊ£.žýTº´yVWðçû€VÔ-Ðò2Æ‘ô³Ç8’†ED¦óÊ¥Ò7œ\ò*WuOëÊz™^~ò:+"ÒéËÊšҟ-ž]ðpksÅýeí~ø›ˆW«¶E<:Ý®\*Ýágÿ2 ^Jû Ðó¿{|÷õðæSCLŠãן›•]^Ø~ûúí`›ÿœ5ûÊ¿þtü}–™òǯ¿êSYä…Î/ëkG²â2RÎwïõÈûˈ=5ÛÈ»=µ#ÊÀg>^Fò“Ñ•šùõ®yùÕüò9åö¬½Þþª…/ÖÄ6ð3Æ]ÒàülåþêยÌÂ☲—¥z@Î >¦ ^›Éàl~ž÷àU»(ä9ZŒ¡íàlž âmÌGkàÙâSWí©g§¢T¯O½nGòSV›×Kz gk!«t?4gƒË‚aŽÑC _’€KÉP¼cwz… :BNÞž_Ö‰ëÔµÃvÊ`5qq Ã82m(3×ÞÃÕàbóJê4•ÍÐæŽùú@uÝÉ—uÞ.ÈTh¤»ýc#ÑQ²0¥³[t”Íg/›:xHÑ/¼H D(Æ@FâbðYXòaØŠ{ýñÙ®™ùbÎC>KâÈÓe9÷$2E¤µVõPÝùš~Û3ÐÔs¹D¥Gõ +Ãvq?½¸O ¥„l-Ëé(º²>¥\”yv!rè˜ââ&xðŽDVÏ0õÑAÿ|Ÿ’ÅbªX­a/ÏV¬a1|È2öIŒÐŒ`øv¾ö…¬ö3ü²þ Î ÃSçÁu”µÈ2ã¢Î¢7x ?†B `ºÂ+µiòØ Ê¼¥Nyñxcª?é0jl$ƒ# Žh8bÂWAó‡Â漂>ó>ó>Í,ØhƒWà9¼øžì“ä 2 7¼x Ƽ‚·á;Í Ü Þ6aˆÂUßa¢ ƒ5œÍ³SCäÄ­4­ùÞíŸð‡ð³W%Ñøž‰Þ&üŒÆøñÃÒÛÉý¤9áÚ¾fìc+I²ÒB™i\d8•èl .âý˜w ákô=wC–ßcø¦’RðiaÚù£‚;}4îdê„›«Mc,悘sbþ({ŽÌª=³a,Ç#„T‹o`R¼,gPö ×SÕ«àñæ½Òö¢ˆi¯ÙX¶ƒâg°©™ðöxVÐv4w*÷|neÙ7¯QîÖ™%16»'±`ÙI?¦£ e]ö›‚vf„‘æ(] k•X–"dÃ]«lñ¥REb|QXö†ÏXhYe$lY-ƒ‘)m†Ñ? ŽáµQO<!î™:VíVRß-‰¢‡¦¡i¦·…&ã˜Ê/NŸ6Àé‚´œ(!¾A+ØíJ‰ïsÞ«›V%|ky *_±däñ9ãSe¤Æ?ÉXØw)g—rvª8‡>Õ½(}Ú% aIb›zŒ!šà,Ÿ6>9ˆ;â51 cÏj¥î¸›©¤ MàÅQ¿½(GõP!|Óecµ°•G~Oj?˜n`‰'aÔSmî¹3;Üyà:xàŽU;V]F0Dq¤:ñL'sŨ«Þ‹³ˆ™¼¨¡§·âL0ìõÇ4ÐË; *-ùÃxÖ™¢B•0Ãxý>ãV$a3 ;Šäð¤˜3È 9˜ì²ÈdÁ¹„AÌ”bÁ·†É¦HCÆÛAKKÝ¢–ðªÓMêúM’O2)Q¯cϰ•ʰM9V5¢yOæv]z×zj=²º´…ïÉ_)ö‘Þ³nmiîsÞG‚Z|›k!“­Ëx =· Ÿ#ö'b@dEznã[ǹ*˜B29Ó¢«Æ+`<ÁŒØ3^ƒW`Þ粘„ˆÿ±ý(QV<¦ËS!cq~ ámÂrg?ŒjñÜVl-¤ö#êÙËÓÅUTYÝ«˜obY†ñÙ)|ñÍÀ#LCQynÓQ=aû42:–¬¶™5‹¹}ž®†B¥Tóz‡6Ý¿S©âš°*êßaŠœ?¼@¦È2SmPyµE ¦)m÷Bkã^æ4UÃÈÈ©€.+goTM@Œ×K•"÷xzˆºÒ£0чaõ^ã;iš†#Ú´µ«ÿæØÁÞSH9‡¾ËGçtŒ›¨«2VÀž©9,êáñ¼g©K²õà1Ê`/­)>@¾æß|ƒÃ˜:Û (x² ËÚe+¹/PÊet‹G#(±Hê¤Î®U,e.ÏGA› ¿ƒÀžçEBô£Ë+ ¼ h}Fq¼¤ùm8WýŠk´°f@ •ǵG˜¢9kMâ…}ëtá@7¾\‘N”â3"ñ§Xô“ˆ?Ý£7}¨ó^Ü]EåêlÙ|EÆHÕŠ+ÖzlÌÐkÄø`=+ÀÞ?‹%šs›°’l¥¯uWQI¶2׺~OǸÆs­>¶SŽrÌÀ—ku+¦sÇsܺ ³ÑÆÝ+¡·ZU«Ôîž`GDUTt©ÈˆMëCmd`ÝÀM±!n`ú‰Ü¼ŽP®°{Êœ$r€ŒÍ‰©zN¸‹Ö•c(— ¨äŒzw?@#ì2ñ 囟B*5@„¿qæ‡Ã1.drVoÆñ4å§‹+VÖåü›¯#’ÄRç¤ j§Læ`L_•3å|êøÚOfÁ]À½°¢îAQ‡…!äˆ;.ú3:QŸÅc~¥KíýPÃûqFó3–7”áüü·Cýúƒ__<”+É«‡W/@IŠ«ÙÉ6Wòè7¢2‘§…3ð{d‰Üf²ð®m²hñÅL‡C¥ ÏÊó§«ÂÒ‡ÄŲøY¶ÉûŒ•Öfòìv*» *´êåG2\®ŽxÞƒ ˜…)qY#MåòöÀm •inŸˆ±—hŸ¸óÍk©ªøvß³3½[æ–쾞ôzâ=S}AD ɤ$ËZ„,§}¦{Z<¼4`Ç òHÙë ¨0±Å’Ì d³¤m ýØVÊá8ŒxGÑ)¸/{³}xJ3uìåë¨Å͹ÇÔ’º¹îbe/Õeƒ!™Q¼ ´. ñ(f+îŽî†XE(6¤*W¾'˜#U-‘W+¥“¤Ì®Ù™n˜ga¬Âª.Ómßh<ðTB'ŒUŒ™„ÚÏúo}î`óîR Z‹ýyºc 臵¢³ŒGÌ[^è‘){͆K&l¯š‰‘!ž¡úÉÉöÂJåÎéiOàãé¶žÀòxíÆ$[š[¸5+£am„ÅîÆhŒ<¥ÕÇä¿UîàÓ Þði2Þá€(Z¬y“!Ziªâ×˦-[:ȶ5ÌT…{]¹…ЏI•Ÿ+[»T6Tž¹Ÿ»§fãžš;r¢ºV]JÀhkÖAåjnWGUÁ°ae®™ðŸzÙ£uU 32Ò!A~Ò®φŸéÀ>öL ßSõ‡8 }wUH‰©;ª±‘ E–âd”%ÀcÏà÷àÙà <0`Vðà÷dCà{nšŽ¸#Ý Šû]ÄW䪲.ÓÑ^ ¯ñ3}$¶qo<’ܘ?`@øÆòYqáGÅmÉ–€ ß0=pµÔ¡”‘œeÃ[ ©wtéÎ ‰Ü}ÑÎ!ž÷ ®°ÝÍa`CÀyªÑFïVëN†Óœ™òu²­ù£zê¬îU×å­NÇ7ŽÄq‰é2Ù¤Œƒo~yáxŸå¸R¥U¹8ž€xÙÅ»u—áLt¦Éˆ }GÝ’D§Rž  ˆfLVM„„E-‚]:ìR8*‰‰B È LÔ ea€l#ª»ÁRÕI¦¤2Ù¾‰È½'š òw£X5 ¢mm˜@f|Èæ13"›¹–Žº ”[° ™jÞî°Ôõar5h?9PÇD«ä®@]1s_>GŸ‚ß É=¦!R·,w”­2ÂP6ÑŠ88ŸŸQ©dÓ—øœø–B¥ª{p„!0gP$0žj"+†M‰ˆ1ù¯­œce2êS]}†`QÏ»â©׎ÑÐ@2Ok…¸5]—§ErE¦øHnz²ÂœÁŠ»Ðá0YƒÁR‘¦7k¶¤§¯~K'‡Ç 6Ñ…{½GZÄ,f•UÎÞ–¯‹°f¾|†¬¢s·Ü¸h/Ç<£óÏ,Rút…´Ru«Z¾Ôݘî´'‰6’¥Dì'/¢á >­\ž¹µ–Õ lªpM|•µ Jêž."Lp†°1Äb›~ëØÍ‰­/„êxã&bS2™hu/Bd¿5¬%Lb»ÖôpÅ|†‘ÊÉ,‰eÏ÷RÅ®{\¹LxvªJÙ²U7&å…V Ñ' x]³k}ùB{¢¤ƒyúÕ-…Q¯(LûÉ,Ò¤L•Æ8´iùý­ „}͸ʜÞî-”ÕÊg`]`eOç [»ßÍ¿¾xXD$ÞÒk¥A§Hï4Ê}ç ŠH¾ñA¢Nɾή!(84dÓ²Óóhž¦D å5•ÿ“5kˆ6Ÿ§Œ D棰1fÛjQ"“Õ ë‹ ‡å§Š6LÛ;1f²š-\v¹ÍdÎG%qa„ –á7+òCʶ,­ó/™¬*ŦïqÛ]ï=}0ÈCeCgew7JGMk挚³ÖÍÏᬋ9ž)WK Æôixá=„1ºe‘M6—g@ÝWtªýSävµLÙêùÌ0€-cŸ¥Ç‰0=XÜôzº-Ë2JˆÃH“©âùãªQwäæDÄE­´‹Œ‹©ŠÁ³”™9²ï‘j‡AÊ#ZRaùhà4E„nMÎ&¢é²VŒa\ƒ¨ÌÅÄ’xÐ-QäZ×jó‹÷@Ö>ƒûÿ^%5Á= œèZìé Üâby2ƒƒOUÔd}yí5wùõp_L6/²Bo¯0±‚ί|JÅŠÚ&dž˜…À/‘¢&ÛÙjÍñ“C)ƒL8O±-®–SWÛQLk^:ìR¶ã°lê%S;Œ*¬k` а%ÊÜKVK6Ü#nå*}WÖ&gp:ª„èiÈ::¨ÀªçFéµÉ½a[òQPÕ Em»Ûó†vaË7:c@ˆA*ºõ¼•!¶L­MÞ{Äq“#ÜPÐS7_Ämbpã)¦&|Fã¶\8mÃ7ø™ÚO𮝭°q30F˜‡L›$OËT<‚ 5 œmo}%~¦xÕ `Ê`à&©¸á)Ñ|qÇwdyŽçLqëÄÓ}óuüÞc/­þ<õ 3$¶j47±¶2u6¼µ}}Bcd»îrD> endobj 6168 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 6169 0 obj [ ] endobj 6166 0 obj << /Length 6167 0 R /Filter /FlateDecode >> stream xœí]KÜÆ¾Ï¯˜sؾ€ €´’ä`¡rrä8Ùø¿Î’œÝ%ù5ÙßVÉÙ±`K^ŠÍîªêz?>üñÛßÿüíøáîÛŽß»ßï¾²S™gí?Çó¯^þÀV§îÏDzÊß9<÷‡û濇ö…ownþô¿£=þ©ù÷çã_ÿÖüðÇî/ÿÂ/‡Ò”Íïÿ~ú½.Mó§ìòûùçÿ:üåwÇ_Ï+öŸë6óúÿpÞ—ÙÓ6f>ýxèiž~ýöý×Çq_)ªÚ›ìh¼óGS{{üï??5è—ÏNÍsSÍoùPiÏ_r6?[Ÿ?7þÐÓ/¡å,î‹"ÝâO;‡Šq… ¯~ª¼3®´¹?#úŒä¼ªlóçÒuÿ¼í\¹©: ŸlÏË'X¼p&ÝâO;‡Jp¼zj„—™mV  vY=JʲL¸øyçÒ@éÑ Oí:s ±}Y=Bê2!ëxÚy*lÃÅÓb»Î2—%Ãö‹ÕåRg&K¦t;OƒíÀ⩱mêîöåe „ÔÉîvY_'$¥óÎ¥Òc..§…7ì#3 ïñeõÀwe2%¼Ûyª{ —Ĭ¯:6ç¬K Ëò) _eÉÔ¯nçâPéq‹W—Dn—él©—ËË/n²2¡pÚy"[*´zb lŒí­\Þ[òrù‹Û2|ow.•áãÕïcVÁ[i|5>k”šâøðS³¹§o¶¿=4@É?œTÖ~<þ¾ÙRý‡ãÃχúTؼßbûÄTèIfá;>ùWsè‰ÅïÀdp× ƒ;@Gn½øä |rGì „…ßÁ«¹¾¡ã!D ¦^æ,>)¶±™“BkªÛ›½”o¡ †^°å°º®ÃSï@û2àM#ülxØÏ€írÿ¾ƒi‡ð³uBÜ^-ƒp ìÀ+ÞçªÖ¾Ïïçž­îµÆ4–Û€öçž¾…`¯5#í1¶!Ns,? d9 ¦*MîPd‹çÆ„¹Ã–ýæÔ7ã›.ŠKˆã#´_±.ëÞŸåõ-Aûu¸<öó,ßIb4åÿÃF÷òÎÅxçÞ…Øcï%ã-?üãÊc²׊qZª9¾2`\Çþg|{˜0F2> o“eˆŸƒx[Hï16ùPˆÁƒN /âÓ8€7Z„¸÷Œk·‹½OÅ!ñ‰¢Ä7UVÜ0üeõ0ݘø1 -§”̇üŒ‘ÁnÂÜLXÌH]+¢ÜY97ÍAÕ9ðN¯û»î¥O{ƒçÁÑ{o!*1Z"È:»–~0ÚNÕ B­M5ÙX82J*æ"<“ÜD°F׎±ˆ‹ #l¨bÕA6h(£˜„jKL#"Á‡Ñ e_4U/JL¶Ý˜•cf8‡}?Ueû;°½” ½ax‚cô4F ïI%ÑÌø(]ÞÓšVÆöµã¨n^»ä󾢯á —Ñä@F ŒI £G0UàxÞ5Ç@œ‘ˆ@âXégr'àr\7°áš¼ë¬qôŽ©…Â1w\os4ðàI=ƤDïÞAà¤FI÷©²>yÄÁ<ÎÔQµ}ºŠ6hà,We­ Ùj*3› xD»T¢ˆ÷-Á@5g“êNĆeѱ2ÈJ0!HTÖÝÈ03ÂÉœÞeèK77ï°úhý{D …ˆÛG4 € ¬0·nt ŠÓrúmÏkÂlV6el$ë)ÂãŸDeG*ûVìÈ„‚£*ëÁ©©LƸQ@7:u=Â5UÎ'¡á g[ŠE§AŠ˜M¾è`‘`Á¤b=–‘Ž"ö»lÆP®¯tG(«§ ]›[åV°=u BÚö;Æö† Vð:Ú^)†ƒG$tá’m&Ó|}‹.‚ƒk‰(œÞ„18$*!SÔd º{ˆ„ä#¤ “8«Ôeµ*]5Šè¸Ë-.½ qF©¨S!ÜÕ—Gbdr‚WóʺD Òfp'¹é|BJE sŒG07wñ Å­Äà;æ |>að#›ã¤u±º0øÔ“[EÀâ®})rÐSŠŒ|$3néÝQ¶÷®ò‡™à6fA²i£õ·˜Ü”€¿ÁÈ ã9-ãOÝD•°Àw´£ÔÙD–‘Õ>lv@•¯wɇ’o}O§SjL¹ï™ú"ÌŸETˆ-;ö®]ã¢À%jzS_Q/±Ä*DŒ‚J/ªíKLuÚX~t*¥W¢ñÅ,ͦ,ûuE5Žñ¬à鬂ž¬jÆL¿ìAÆ0~YK*­¶ø0Á¸°9“1Avº°­zËO¸–šTµäz‘~«ûo4KxkWô·êVÂK Sû^·)æÜç}ù¶gÀ¥µ¸h—-Já;'¸l6kÅ' Ýb §H|N­™Ög¸?@b_ÆÎˆcbNÆX¶DÔz™¹L£ ѰMSF¸º’ÇŒ! ÄQß2¹ÅbÙº¬åÌ,ªËcyv˜0²‰É_³ž¯”2«ö¡µÁüçÀ  ƒ÷>PÇNð1üŽH—ë=Ô¾l Žåæº9ôäöÍ Äð‡”}W¤˜ùP 8SÍ7ÕÀêÒÕõæ›’þζ}S îŸ{abÿn¶Ex†ðj̼g“kÌ­—Ǹ²ßf—?aÉâT~"‹X¤ÎA«þM8È1zA$ý›Ù=ѧ™Ùìú5‰+Í©¤¦‚‘ÑJç½q„ÝIÍuþò„çŠÚ¦2’®ÔÐ}CmÒ¦[~ ‘”F$a g 3¬uõ"¶›»¢»~OŠh•‚"û´t7Q*ÒnuÙ[_ã›QuDËXDBԛνW2k°Öà ü hZIë4ñ¼8“CÌÁ'ïH抴áºÒlä]µÈæ˜Ä¢Òú}UĔų.ð̆¹9×)§zÚbpÊZ–ãJ Q P V;6È:Ö—Ò’=]—ä®”sl;¯Ö®‘`Qæ%ƒÓ6E-uWë…%Ng$ïȃN8‹c* Ê»ëûßU³°kõžŠ,ÏT¸kFÕ­Õ®ø îbF9Án z‘á½exT)ƒÈà°‚Š«Qð®q\?‰Šœ4K`ÆIÕ°¸7ÜuÙ\{-]“ÒðD[nÈÎXÒjÓ!â²U›#›á®¤ób Lë Œ&eE¶>“Q˜€'C;J© ”/ª3Å G‹Ðý1C"æD4¾ûgøÚ èìD®%*qàší@5Ubç.}D¶2ÉFhú¬%M±¢háI1 ð'VîºÃ¹›…â–•÷٤ܤðQÄ}V½þäTL„cp­¾ý1•1kù9¹!„‹7%Ñz%­\Û±›†¨¾cjº7P¹ ƒ‘ËD~ŒBv+ÑÚbi5C2ƒ-qƒ»hý?eÔÖ·~âß‹¡©®üL®hôfÆ9 yjbâF̸†ÑÆú‘X@õÚdüs"V¬V5ôžŠW¨Ö8#§fƒ÷Ô¸y‹žz†éŠmÈMsºÄ‹³lÃëL-‚p_‹ôå•å¨ C$¢EÉΊˆÜhÙ9ãÂtŽí&òÊ›Fðe^L+8Ñl9K W2¤%f“á,ë¥á[ú¤Ì…Rˆnxeíøb×E‹–®ßÙ§¸ºùE+7é,¹ú»·~XÝÅ«ö ÅfáóØd”QªŠƒQ‡Wçå[®1`ú˜RË$¦ƒ$VDÜg(;›[x,öêT¼O„mŠwMdg(„Tá)Û›núÃ$cßS%ɱÍî˜ÆŒ¼ c¶;r<:(•BÔ¸2Iäû$<œrá>JDx‘R‡Óú ÷§’˜æŸª/æ·©U)o*N_+a>QÓð[>XštÀ„7Éz?¸JT§1"€ê4¶V+™VýËÛÈVzÇìQ´s%†—'ísAb"¨™Û…¨ægéhB¨1WO)q+Àx Wýº~„q6^~Åt©²òð,,Sw½ˆÈþdäÝò ÙfÏ”%"r…™ùw˜2íÎGª7Q]šØˆeLUÊ2’mè*Ø(ŠmRêAÚ&5[õk]_ü躗¦Êq«‹Õ‹=ÖZ“½+W¿üD©È\mÙ„P¦„;uó†»}P¥ J™y[8¤JôC¦òt‰ì²]Ì׿«B߸µ¼zÃERfài]žU1€H’©óIëó!N•Ü•jlL¢*)F¡Ç´º¼´I¸Em_Sê£&;;S¶`G­w(_“"Àª£©';`u,­îµtÓFLvj#£ÍL<éÈ(?Ù¡7¯†ß±|§Fïôí8ÜÓ>)NÎØµVžÜ½ÏºPíÊ ¢œ‚ü^-°Œ­¹Çõsé_{¯í`Ê7®7ÌjD-FjD½DC«ˆ¡Óªœ–r­f;Z„ÈHC&2'Ò¹œ£|1mŒæ§?n¶s\JÁÔÙ_Ï’)@ûL£¤‘Ú/ÛŒ@Äs´¼y£ ‹4ìc:ø3"Dx¾îê-W "ú0‰N5ºÅI±‚¢’^w£¼bQI“85§SR‰äW‹p(³ƒ@ 2Q£˜dk«vŠDÑG §QãÄ\ÙÂ: y"‘—·P«Áw“yM# ú¯Â$·Ÿ°+À4»‘´ŒDRÒd“ cì:Â_Hͧß°e9<†b/còK&XÏÄ< °i"¿ß2B ‹*\ÀÔÏÁÚ†ýf¸ŽfÃB9Päi¹ô›¡eŒGL}²ôo ST’©Ý°…«pE±åñ}Ä•ÞbmQç±eUÆV€¯â¾JÕ²÷žQxeiYmŠšu}ÿ‹7pB­;Ç_ðÍÀWäìg'ΛyEzÉe½ê»Ï”É4ò<.wEÎ8V›„±ÁÀcêÊfµP¶<öš¯Õ–j .Ú"_¸Œ…™G‚C0̘t'ø•&‘€G´´§rwWCh†RL'ŠSz ÔBÀ8ÙÞҞ(&ñ$nWà¤Ìw´ØîZc’0°´z¼unp­\òÂë‡ß¼Õ¯Æ©¯ î0‚¿O)ÆÚ)/ˆ?IÝQ\jM„àgH/ñ„æR+µÏÑ**Åé–[î/ã–ͯãcs!‚÷å~î/,¸PÕäô™†V2sN~:Ú>&Ô9y¦TªöðåÄ[.hOöÉ-ôòIË~‹ñ“.ôoOŰ  ólMQÄgô7§RMííkwR”ÿ…S`ýbó±°£Iœwˆirâ¯ßé¨ÕD½|&[–àÎnvÜ#ÃîK< àÕ0 ¸;& U;L%3q ;€ßéâ©w0 00eUƒk ¨á œ«/¬-â0ƒÁï|êvß9«—<Á{ë)f1ˆág Ž†Ÿ@ ¹ÆËª[öΖ™;uü~ÙåµðØöE_÷Y¡v¼?üDÁ¿â endstream endobj 6167 0 obj 5028 endobj 6171 0 obj [356 /XYZ 38.2500000 68 0] endobj 6172 0 obj [356 /XYZ 38.2500000 68 0] endobj 6170 0 obj << /Type /Page /Parent 2 0 R /Contents 6173 0 R /Resources 6175 0 R /Annots 6176 0 R /MediaBox [0 0 595 842] >> endobj 6175 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 6176 0 obj [ ] endobj 6173 0 obj << /Length 6174 0 R /Filter /FlateDecode >> stream xœí]I¯Üƾ¿_1ç±n@ÀÚä@€‚;N`ÄFò÷33$ç=5çk²?V59óhÁÖ³Z쥺ºöåÍ?ÿýðÏßoÞ}þÏá‡þ÷wŸŸŠc]Ý?‡ó¯ï^þmŽýχº)?üòôõðõéÓÓ§Ó¿>u|~÷çÓOÿ;ØÃŸNÿþ|øëßNøcÿ—Îá—§ÚÔ§ßÿ}ù½­Íé§âúûùÏÿõô—ß~=Ï8,×oæÛÿÿÎù²ª«ó6&–þú4Ó\~ýöïOo:¤­RµÆ•ö`¼óÓz{øï?ž~:-0L_méO?·•¯‹²iìéçÚõÿ°‹×öººmOð¯Fk_~ÉÌn&÷¶Ö›ü²si W™èäÚ·íÛ¶Y[j\È0»Æ…”­SD¥óÎ¥2Ü6œüØzcêó-/!"Ý ªÆôà9ý+ çé&oÎКü²sq¨ w‹g—¼Ü¶®ŸíuvðÛ¢VDœËεž-œ\™H[cJg¼Âd—>‚ÏÓËø<š|¨-F¹p)üÌ1™Ä·8 !Ú¹+L¶„$k‚ŒDÎ#J”â‡YÞ5~Íî=|Íxü2ßΦî‘é1ˆßC¢„¿™ÏÏ"” ¿J (‚¼~ïÓ¹Öz2óƒ "Ê‹)H‚€wï« Å SÒŒ"sl«f>s¼oÕ¹x†C Q7ˆwi°þ y ‰ì€˱ž!¾ "Ë’J÷”ÑÞE&aÄEF0þ>Øìèd㈻è<-:g0ÖMfÉ{RüTvopìi`ˆ4Å6ïrhòÑÚ‡DW×¥ÁD6ŒáBÄ"¬ïK‰\üü˜ʹ"( ȇ'“‘§º!ÏòP޳ºi æ>BËÊÐ2‰G,¶2IoZ@ x£“Ð4åm¡\uÍðF#D? FšKˆ À6¿„XáÝx.ÀÚ ÙÂTÖ+vAr¸@"N;è:ЏM°)¯ó6ã87¹Ÿˆ‹;+§Fòœ®´ N÷êØá­ÙÚŒ·U›%¸˜Éuo1¾àçÙòHõðÝGÖÁõ 0.ãoà,vÉ3_øš,QñS‡ à7˜DfÃÐ0ˆ¼LÿËŒ¥]‚åéÜàÊDE‘ÈkÂx‰w@àXNúßí‚ÛŠpëóNAÞ6 ¿u)°ñõSL1Å =ál‹A$íS‹Ö}£®Q&£)“².¨›*8Ýfˆ§â•_†wúPî“Ýñþѯ÷Yáût¼ÛªµòïBB3?lK87™m{aoK‚ö"Ùç ‘0¿dÄ“8òðaÁ#ùžùÕ Œ1 G.;!ÉÀbB5WvÚ*˿އ[‚±˜‹uX<2åýÐ,ïq:íMXuÍPÕXà¾ÓEŠÖ†ú6ÛD sê¾ê¶!/ö¢z( I#Œ(HåOç M‡À9%¦®žV$ìgÇÅë0™:½Ä1ΠÁœâ{8[G®†æì@¤â£ ËÖ‰$Ò+"¨¹zjU$2.¿ÜÀ¤]xërÎþ)ãæ—rLÄó0ÄЗK™¨é¼&ÖqñZŶlPU&å µÅà=mÆn–VV«ÉŒåA­h ¦ 6%EVXòB&Šž©ƒ›`oÌ•!»zùèÈ+€³EPï- ,¦Ìp²Ù#Ê#šÎ!kÔ£D/¨1ŽBáR¦"uŠ&É¥©æR|ˆ§ÀôG'0º!¥-úLU‚=S)ƒ¼ˆ§q:KÀkWƒj.¡GÇn"êLñÔȺ^‰޳«™èœmØ®3ÏÇ·‘ TU…ÓÕËŽLÚš2åÊ!4QV^Ú«8!\Týgꞥt¿ ¢!B¼Æ =Ü#cdJé‘вcA-® ´Âë(³äÌ£¬‰1ŒžŠR"š½¬ÙĬ9žùƒ¥¢íÍ0 §àö[Åî‰ï2YÊý!"/Ìv£”ÑÞ"ÖµŒ5쉞|»;«1`pÑ䘌5ì DÓç^=¯›Éøö8×—Ç#ð¤smá‡\Àõ³å¬)†òÙôc]C6 @´÷Ë+E3Lúá­Ì)ßîÜI1<âØóaþÄ,SVÃÖ3us‰”´ÀŒ›p? ,¢%"Ýiˆb8Ñ^V tp×ÎgľºÌŒ}›î%D`…Íy[íPö-Òý—èÀ½wˆŽAXøÆ³áw‚;ÉvÿY€IYnØ·ü=ê+¶ºj6kµ=¿S+ä|‹Ø–ÛxF ˆ›Qé(OÌúMHEdX¡§2•$JÓÊzE5*JBÄvÏälŠô æ±Lµ@p™ÊDð€H,Ù ®+l”e:WÉOõJRUáóAd¸›wJHñ2×3©À첉„¾ƒß­`Qëâ£öÉX[?ð}‹‰$|A6Õ"!SÌ…ÈÚK–ºvU)„È£ÉÖL÷.uþ=ÐH*Ð(£[Æ]smrÆqôËî–)^™[Æy³ì›t}¨cì·ŒPÜÒ>!º48øM¤v`;nZŒñ»Û™¸J¢ƒDäÌ”Hxe†râž4~]—š—Œ3Ý"ÒíEÚaE'“ñ.ZÜT6xr5J¶,¡ÁïcµH•»T¨™J)€T®®¨bÐaC­_r½?†¾ÁЛjÈ¢ÅZMÅ)ºñÁ¡…Æp'<ªÜSjØh’UpqCf$ÂÃŒrZ²Rnƒh9ü"R8“C±a ;Rp{¹î Oñ0R;,R ‘P>r¹d¨TYBVEðÓHš¾+B÷¢’sù=Wªˆ(R¼A¸¬(Bçªk}9M­ß¬ˆ2gßeØóÞÆ|Ö$²\å~ ÎX"kcÇ‹exAY¹˜ËÖÅ?*—PÕ©C²ùæ(ªUhÛ€'>šƒuϷؤ?-Å’‹7ËàDõníŠwÛëj¸Ý^ËMÑçöšx‹Ó_Ê»´ððÕK;œ’„“˜PüŒ¥‡Kë&÷³~éaœò•³ðo鯺2þ±Ÿ¦¸ë÷ôˆ¥¼ËvI)ï\'åÄßÊl¨vU„в–·^Ÿ´½~­.m¯ßæ¼ *Ááº4À6Mð†k¶ášÔ%cŒ$Ô"¦Ï Ïsw¥s"Èã"/Khò2—kú6»îºXV©íÐ÷ëáê¹?`¡Ú箾¿å¢úŒµ—¡›âêª<™„jƒóEç]Ç#oĸð¶ô³¯ÌCtݯÇ/¶eEl½«&¶ëªdÎ×Á#]`R$&®®nÍ5›[ýuiÇ ­Ö¡3²ûÚ…È^©‹IM¸&Ô°Zo™IrÕpÙP‰À‹)œÃ$•Œ€IÄPOÑ`°ôâ «i3š‰{}-þ¼æîÊäKL$§q¨)‡vkÙ\šÐ Ó×ÔC@G.Ç¥]½ji‰]•¸/vµcSÓ”‹v›5C™ Ür›´àl}#Š4L c¡jy2;À#x6 QÂÜL™¨áz<Ð7S¶×vë¶#Ê·ªDÌ÷ñ2Ét«9ÚeÛÂݧ]lçyý|KÊ݃$o0Å]»áÖ½u€¨H¡­¹e0sáBUÀðµF¬ln•è“Ð)Ãem¹j¢ÉU〓ù·ÿúÚúig4m¸jßv±î‰I—½ []ÛäîµrÑ·åŠ"wǤVIßà;‘Å K`ß>’q„鲄± ÛÔñ7ØZˆÁˆ]G¨¶¥ékø< =~ÁøÍ/K¶gÓ–Óþ"Åþ.¢Ðé:Høp"³åWø¡]ÂõöÀæwíf ¿KûÈ.‰L~ƒ) ã¡Å¿m†ŸažNtëÞÁ=Kê~eW´×pÆ4*›º¹~t²¬³d{•©Â`q‘åÿÖ¯K™suYÛŒcY¦ÇŽ,ؘP„Çuf²ªÉ³Ê6`Z E\;˜ÒIÄ(‡V §bæ…[u0…Ø™‚In¹ïªpÙ„Ìí<å$¦ããgAˆfQņçç1e˜®R µŽfTç…­iB^Ø=¥Á2!:|ÃýTAâZ# inQŽ(À¶p¨]|¢˜#ÑPhý–7cYœñCQ¢Ì±Œ—fË~ }Û -®µc™ÔÞͼìl9'D_Ç-Kv(ri²£€Ã”ˆûâ3-±TÖd$›IÕP¹ŒKå’s‘¸¸¡ Î&܉&w£%};_U‡#\)‘g ë²ÁÔ*¡’®H͆1& &ot Ô¹zo>JF-¾'¦¿~Æ.%vˆÖ„‘í=!š{Ó•*š¶ ¥ õBo'Üæöª¶ÀPaS–#(}P4—qBQ …‘ÕÂð‹dQ§š°ÿC4í•ÁQaÍiÝjÆÔùÉŸ1  j!MÆ#*©#?S{uË-O‰ç+ÄìÒxQ;ZcÚV _f0ýÚ%šwJ/ Â]¡]‰fuŒÑã)«5ðZÆZ †¯R¹q–o³‹õ6|Ê5—†¢kþ¢TLîsæÍQ±)¢†ª­°-¼ 0‡ P 2D9* šo!¥f¿Å\X7ö!‚®£…ì):>"¼©²¡¦¯´Un$õ=Hm?&Ù„òû¯[qT«¹rɪë¦ÌÔ€f’¾)³}•04e¸æ¦a­¾9[æbTH7`DÅL)*¸º=Y;HMVè5Ùï6 YèöèaÂúꡱu2Ùƒó•Ù;)Ú>óv§*ƒ1ÙϸÌ\™÷«]#ä|u_3å3%B Æ…‡‰l}ÆZÒ+w8ßL{ÓfÛKÌ×’¦«kŠcçmæÆHßåц^#<þ¦Ç¸[ß´pf ~]؋ٺuNºnѺ™#xoA§‚{³ð›6}¤À÷ó¢-Ñé×áë +¢Hóiê/Ì ¤ÍÍðèÓ=漿ƒÒýú>·h\·ïúÆcêÂÚíÑv—úb¤{‘ÕxĽ←Bøô° åÆ:nŠ…ÝÚÛÇþ¤¨þ0¶ºúZ`m§°'z8!k–7Žaðlð›ž.š¤£×ÏhË"Üùç⹎-†Ý‡tÀ³ap-DvŒ6ªvKzžrãDv×éIò­o0 ð-`Ìj‚gA¨ðÅDÎõ=H‡ þæm¿û*d5xï­÷'Ý"ð1ü ô•ᑈ!ÕxYï‹}³uáŽ=½Ÿ÷x-> endobj 6184 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1409 1409 0 R /F8 8 0 R >> /XObject << >> >> endobj 6185 0 obj [ ] endobj 6182 0 obj << /Length 6183 0 R /Filter /FlateDecode >> stream xœí]K㸾ûWè`=âK X ŸrИrrfw,2‹tö¿Ù’l·¤ËÅ’dkÓv›Y¬*V‘õâ—?}ýGòÏß“/O_ÿ“|k^Ÿ¾îÒ}îÒú_røùáò]ì›÷I^¸äÛ÷ÝGò±{Û½U¿?võ_ŸþR½û_¢“?WÿMþö÷êßš/¾ð}—«¼zý÷ñµÌUõ.=½>ÿ×î¯H~;ôØ×óùïŒÍ2›Àúc×NS~ÿöÛîK€°Q²ÒèÒ&ÊšêWiuòߟw¿T´Ý§ûÒ*•WßO¯(ׇ‘ª¡¥Ë íºè tüáé^Eèܹ,^çGÈÙ±¢L¦ü½ï k”ɵ³BˆìŠBWïsÓü»n^YZ4OËh;uƒ&…ŠHð#äìXi Ž{ç\Í¥Ö ‚*6áGѹ{þÎmZq|4â!gÇJK\Ü{äÕlUÚ®e#ÐäÜ}„ÎµŠ§jÈÙ±ÒÜÓ{l‚›4¯‘–g°vê=ILQz!çFJKnØ9£ì¶6oqŸÇ@йûþˆÖùrv¬´´Å½Ç^ÊYYÆ$ø¹ûYÄÎG#8îs5—ZÕry zþ2¦¤8BΔ–´°sFʺê\ޠǥüºè>B續§‚kÈÙ±Òжßû[H/”ú`Õùð<øø¾ûòZ‰’,yÿ¥‚ì8`ýòþ}g«?Çüê¼÷þSòÇ žç“÷_wJíÍŠÜ¿wl1Ç–ro¬9ZÁ&´¤OÇ»o.Ẕ¥8} Šã¦÷üU¥ë¯î‹2ÍôeKZt:éð,„ÕÀ˱Åí.Ôçü G?!Üãq0lÊ„·`¨• ŸIÑ3FMF¾®Ué>ËÕg†ìuba'%„>ƒ-yøŒo„«§wâaYÌJ'¸å¢ÂfóF,å™›Lt¼ 1ÑñLºì€¿Z3³2íÈSÖ1DÉšpD¦£‹‘Þ^Þ+ýGu9wtW_ @:+(š<¼…ˆ‡¬Ó—.Æ?E®Aš¬n!qÖð$¯(›"vÉ]Í-™þŒ»r÷Ó´_aË l)Â[:ÐbqojüŒ‡ ÙÓÉФPŸný!Ít„Xôp…•ÈMÇ)4?÷H-ƒùªÄ¢*¯À¢s~GðkŠ+ð‹q¥X%™,™±LÁà‰ ST8í)½Q ÆxÓ9ÿ1å0®ŸÎÿ.¿‚û ær¨ëËà¾CŽï ¸OÈø£¡ƒU”&¦5b;lBž]z6°É`Ä9i.Å{v,¡„Œ^¤´s˜ ¿ä­ñRg‚£–æz.o„+l»áÀ‘õ‘‚„±¡Ær{ƃ6Ï3íê ¦…Ïà8s5 ú./1À3N×ôÚÿ Jœ9%€×4J2úQŒ‹]¤Pb¸IDÇáó:n¡0qܬ,*èä±Þãl,Izë DÜ E*ôøïYJu­†mvn’ZÀ„Á¢‡þ¹ƒÖo_¹á,16ö|‹*‚C޲=é¯9BÆ\Ÿe!w{T ö©ñz1ÿQÒWð–ú™¿Æ…Ñ ”#É¢ÈÅ´f¯ÿÆâRÖ aH8Á€buWØ7Ãø (ú©6ÑõgævAß„GYñç{,ŽAbà=à2‡LDN¾µ°z¨ìMgÚB¬¥„Ý“§% Y’ ÁªI;”Ù ü~«% I^vÑ@˜ÇÄþ9qË…½>·<Ç¡/¸T£'7GµòZ—Qª±<Åzo¥ŒœâÐyKÐybû1÷àgX\ré&…Ç!´,¼Ð¢­ôßÝñ˜T~G&Š-‰r…ikEÌ_lƦE›Fç1ÞFÒ©e®l…Í}ÊåÕŠëw!Mcy CKNþ¡D­Sp Œ„{Þä3Ö {l¹ö„ ôäùŒ‡O«Œt™’[+$v0Æ•/g?$P¶ë¤\²avÃEйw)Ç;‰âÄKÏÌY[i7¹•±¾ÌÅ‹Òà<¦ÉýÈò­eÓt‹àk™›Þ!Þ<ò?CÐ`¼ÅÓ(&R<ŽÇ*W:Ǫ²µÕmg›eï6}¸I|~Êy¸ >c!F5kµ~–JÛkÚ2 '–|á‚Xbë9ŸRš´å½×sÕôõk"îøÞº‰¡Û¹ÈÊUz´£¡X-2¤àªž‹7y3n]Mà½d3h^E'Ò%Ø6gIAº¼&Ü“¶«x#}I 墻€Ì\Ö¨ÙU)òù/ Äã ­XÌÜœÂu4,ÅQ")I(qSŠeî+š1åºm,þ ·®²xø%#sÓ^) !ˆMuÌÕ(YMœË¨Ñ˜ŸÓá¥â9×\E-ŒŽøB-;^s°(å'ü:ÁQ é:ÛžÚ…Φ¸&æwáÕÀ,=ïji1à *´xýÞmùô /ÿVó–\AöäD7±OlÓ®LÛ­•…!o$[¯ƒpZYÀmò[0Û”ïÎP°…ÄKÆÒf¿|Ñ£/¥îG ºÑ„úËWFúuZ5ìU(¬›IÙóoEŠJä(ªÌtùdþ%ͶÍD³ÖZug-\SÁ„Ù ¨Õ¸¢ ÛÁ•°ÈÈÆô¸ŸR•‘R#kL®ÅœuVvfM*ÌaÆ{C§T$.·&E¹¦’·VÓô#%äÑs¤‡Á‡i ©›¥ŒR7¢,ÉzTª¦£Kí)4ç†SÉXjøN#Ýë*%ú¦‡Æ"o°R½m‚#µg¯/|ÇÁ{žøÂ4F‹v L¨FŸ¸ôׄqiÑŠËÔ„y€ÏàZ-'öòxb–A(õ]pÝR}XýÆBìxpÇñÀ–sÎÇó ½öÌPo¬x3ß<µt28Î3œ©Ð|(€š’íCP³#‘2EOáൄ[`oKS$þ>Ui3®(æTÖB*ó×S+…Ê;!D”Ålà9"|­¤CˆP!qÊ6ÑSº‡b–lÔ;ñF­Ï±‹R`—r–§°hÀ†ÃÖ%|cJÌÜB•u4¯t$ã)¥øxï‰!¸pñú¦†h´üÊà:÷-8|Š×‰â±?t§AHÒäµ ¦t8•Ÿ.¸› íãKÁe§GƒGÂAgoI1®a åj±š_8$™pM¹g-PÖ)¥h:®Ÿ$W,Û©²µÜäÂ׌Ï/¹–·›äÚ$×Y:I29*…ÂÆ¡'ŠH;­î/”W3=I>˜“X“Sç¯ú'%‰7içÝÉ/˜oYW?ÉG%r½ùmì ,[Å ÿJ™}ª¶ŒäTe² 2XÔ3ʬ5Çé½®¯5éqOÖoiªYê}ÖómÕ ŸÑ8f̈:Ûk3SdÎÁAö R mî½ 6‹û˰Oj` ÷ŸiDž šúEØ2•áïÓS:¢Æ¸{ gÜfSBfÇlƒ± q‡¹¤QËÀ§qÊ =ƒq€©€9«è,CuWŒg^í]î½N 0ø™Çú¬{ÙnÁ°5.¹!a)ˆñ§ W·xP ¥Æ¥ª¡®Ù<5ûFÞO[¼N[_…*µ·äm÷®¾{T endstream endobj 6183 0 obj 3812 endobj 6187 0 obj [358 /XYZ 38.2500000 584 0] endobj 6188 0 obj [358 /XYZ 38.2500000 584 0] endobj 6186 0 obj << /Type /Page /Parent 2 0 R /Contents 6189 0 R /Resources 6191 0 R /Annots 6192 0 R /MediaBox [0 0 595 842] >> endobj 6191 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 6192 0 obj [ ] endobj 6189 0 obj << /Length 6190 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯Ð9€ÛâC/ °~È!ÀÀrr¼Ù‹ì"“=äïGÝ’zf$}”øM‘¢¦e#ñ¬iQTU±^üªøþ_ÿžýó·ìýǯÿɾ÷~üzÊÏU‘w¿²ËïwÏÿB×çþ笪‹ìû/§ÇìñôpzhÿÿñÔ=ðõãŸÛŸþ—éìOíÿ~Îþú·ö/ìÿÑåürªTÕþùïëŸM¥ÚŸòÛŸ—¿ÿ×é/¿Ë~½Ì8¼®_ÌËÿ~glUªú²Œ…W?ž†ÏT×ß¿}ÿõô¾#€ß[ʦЦ̔56SÕÙÿqú©}Á0}~n¬RUi«ü5/ªôåMí[2¥›v¦"Ÿ¼èú[hú“ëF‡›üºrqª(S*÷ìçÚe*]Ø £/L.êZ·?W¦ÿõºï2åáSÉz=Ùž¦0yK¶p“_W.N•áxvÉÝ\”eO –Rè›>ÀäeÕ”œËÊÅ©20Ï.ÉÜÚÖª2…n³‡ £j…ëÊ¥‰2°NZO7UÛ·Ù0¤Ì[³N”.+Åm8¹à>.U®ZàgÓ˜\á6r·òPØ1{à­\š<àV~š=KLn+w+´•ñä’[Ù³·ÙC¿È«p“_WгprIÎE³·ÙC¿4ᢤnå¡8 '?×¥®l‘75üùu$«Ë€Ü¾Í‚!í¥ËÊCqN.¹keFÄϦ0y£ÊÍuå¡"bÇì’Ìmª:$sŸ¦—Ÿ¼Ê›€ûöºò`ÌÌþà3 ^J÷7 Áþèxð÷Óû/Êæ­õ(³o?µ‹»¾³ûã[K”"{wÉ·qé·³ß繩ÿ}ûùԜۀfXb7’€# Q±p6¼G>ÑOhÄ*4bà{LAPŽ`h8bðæ|&å‘ÓŽàÙlNÈ–D8‚W`JÈíˆÙðÚð÷|+À2Ú­úó·V•×BesZëš„µ…µ ûÔ\ÂZè#œòÆh‡„²ƒgÃzÐ@‹¬°î„²“ë…½- ÓB³ùU¡m‡Wv ±gk:<ÇÓbº­TŸë&¿®tÌø™gt§T~.+U·ƒcÖO“X8I_\¸Ø^Í} ü jmŽt»¡8]«µÏàµu»Ûœ [^(<‘žzÍ$˜·˜Äp¶~³ù’Xágà§«ÎæX5ó¥lŸî˜3ÌHLOl,•07à ô—ñg0{ƒÙ·ëg>¡ŒG&“(Cl– 1k‚ûãéñĬÅ#Õ¿¨’CÀZ-`ÂÊÞ¡ e ±ÿ=Ž_l‡Óû k–drh뵿ðџ㽌W¯>ù{fˆ]ª²x¹Æ;DYÇëZ<cƒ±È0t›ˆãÂlqØYö{83x *Qb GðlSè½ú€6±)Š‘MtÐÛŸžúÆÄ.wˆ-ž ³—pm¯»Ì„ʶÊá¨A#9¥¹¨ÃààÆV~;¥?dO·$UœóƼ|1Î¥tI'¥‡¡5º sëOÙ¸`½òeT,K$-‘ä n'Ö…Š1£å­Yv› 3VéD®Iرn©UnÆ4dÜÕXb_7¢Ô°ìWyWXÜ©°Äß9ºMüV,ÀD²”ñ/,Œ&)¯ˆÉGc\Ÿeñ_8SèÐ ØÍøÇÒˆŽØsKÊ_‡# Ñ*Šrd´ð>¡œÞÍN@D ¼$üaOe­&•UòÐMÚ„:?Ä»PŠŒ>«%f ¸–ÒMË/Ó”ÃÒ!Úƒq`{äÄŽ8y¢¨,úksLÔNG”%|£²0VÉÄògs`¯à{‚Ho½aUYoÄB€jHy¬°N;´C zCA¤µÁ8t¥ì@µ38i,ñ„~’‹xVh3©½5í` åíÄHÂÚAa?{K• B¾Ö5ѳŷ,ÊÓ(ãï’ÂHÂÅa½ATÑ9ü ¼-th»NÛUúj;¦Ê÷Ðv‡¶»Ž@© Rc‹WG4ê­ê¢ÆöЇ¸ÊN»XzqNÑAQ¬… ­ÏÀÝÈxIØìwcx<]a‡ƒ+fWNöϘáàvÍ3Ú!Šªr p ƒ ™ %˜ƒÂ³MÀ'ÐoLœõ•%Ñ@õ¢u* PÉñ¦Âu,1Šïi9iÊÐ@L”ÖÓ*(ì“€s¼y$`Ä\HØX^ŽìÛ[…Ý_%}¿Ù¢„EskÞ«=t磖ÄÑýb¤(ܺtŒË­'Sbq‹8JM„[¦ŠÌ­í“6‰§Î­âfIqsªÍKîhßž1$i!áP©!+\Áb±ªK™/eB[¦˜îîÜbGù “´bäaŸi ¦0iŸ=T"•Sx4°pdZ#g9¼ÛÚOz}[Ì5\§)Æö'|»0ӌߙ^_*&ÈœÈôíÙ¼ÔR8· Ö—’goØ–ãܳ…*{}§D&[܇ms»³ ¬HÊö_¢9K‚gT†S !BïÒ¿Ö4 iªk52MÂÁÐúÃI‡^Õ˜—p®ÏÇ`ÕÆ2EÚ ¾d;"PÍÛˆfßiýa·ƒ1›ˆ;qàŒÆÑ€GD*¤’vH–ôO„œ¥Œ$v@¼¼à­¥À¨>[µÕ9é~#. ·X™þ¤Íôö™ÝÍi½\¢ÉŽCà™>fLÃÉðà(¥Gvͧ!cDèÎÎ$Ðc_>Ké F+®ocØön– 48ÉD$)ã¸þ6Š“)[±°ùIE(Ò¡ôŽï`îw¸ä÷m¬¬ª‘A¥|m±I¹“ylÛ±'PS¯DåY™È{û}ØÛvj mèˆHÒ‹åþK¾b…ŒÈ^^#Ú¹7²ú iKÕ˜#T4$zdé îö–së0ù?Ñžã)ž‹T ¼ª‡ºŸá~ IÓaCéQíáN€¢YXgª™Óº‡T6·WvUy*?wy§|¼˜™‘žêÅY“Ux6Ç3?Àgj8ÒÀÙêA¯¾ì«ßZU;¾ à÷ 7gµŠ{ôŒÁ߃iÝIku6À©òZA¿ûæÞó=ãX~s¡£hy6×}ôü™OpÕ9|ÏG¸6…ÞÓïr?ºÁ¨X5,µ®§„yfÀ:›^·­a¢zŸË:0Ø”0'TÝ·hLøVà®"w‘2¾(ÁÁÁÀ—­ÊÆe±ÀxSb!öU¦'‡HFEöé°éÔ¤ ¹E®ÇVÆÈÇÜf'zÑ­¬ŽÇYQÈl¤ëXv:^AìÑNÇÏ­ò¾–Í/-…“\¢×jïÛ7»Ãn;¯ÑºT¥ôûwQ`®aÚäý"˜‹¯d/.I£WH“çwÇGGWØDØÑ÷·c':Gáµ%Ф)†;°ú{æü4Qëë“ gr×ÅU±N–‘UÎܪ÷T9!ûé A$·€_ŒÏ‹ñù(&>f˜h‹XGÕ-“­!¥” Q…¿'¢ W¶ò9ðdó›P… Øp@0"…©sbz&ìêÁ£Ý¦½C×9b†Û˜t2ÜŽÜÅæ¦‘q¥Ȉm?ÂÜ™Šo°Çy/JàðK¾ÿ;ð=Ad4Žv(bgßsB^RÖÇÕµæîø3ƒð®¶UC|Ü×ÎÁ´wU2©Çþj ·ÃÅ.=þ ¦käº#ø‹O‰4\q À™^®ãBL G¯F¦IaX*ÉbÊdKR…o‡‘½ßˆ( ÞX´¬™3á~"²ÕyÛW¦Wä*› ¡zul^8SÙ_iιȭŒ&Ñ}ÇÑùã:ü6Ù.nG±£P±cÄÜ¥-o'›æÄº(÷®J¯J[ÛƒÃkV€1„˜:0—º­T,äD Ó¬Õ²QD´¸a¶ÑX`V…“§‘ «9”†â*ÕýÕþÆ’ eS©XP\í¯ÅàƒAóRgê"¨W¦ /½V¹b‘ûd²l² ‰J^GìÁ¤Ø™öݸfÀ܇FÉoÞ£ºÎ‡IE0(ÑØšŽ‹dj=ò3i^ÕdôÈ®×ûš•j^r}Γ&`+8Du¼·ïè`Œí¢îK¡j`X‹gsxÕ²e{8J`Ò:¨Ábˆ.aÅÒ¡ÊéHoô¹Ï=“3eåzYRskûÒ)ªßúގ @”ÓìE7xÃÎ|†Â³Ágz5£¼>ý¼‡¸ËÏíŠFcÚ}ö<†C¬9ÚaªBÚa)é•ÜÌ6p¬¾§7ÌsÏ``.`ɪGÛÀ!Pããø®ÁSœLb°‚ÁÏ|èWßCÃÖŒàµõ¡Õœ²€ÄôSйÃ#C­ÑC¯Ú³Unν¾_·y5üló¬ bѨ=d§ÿÖà6 endstream endobj 6190 0 obj 4300 endobj 6194 0 obj [359 /XYZ 38.2500000 310.250000 0] endobj 6195 0 obj [359 /XYZ 38.2500000 771.500000 0] endobj 6196 0 obj [359 /XYZ 38.2500000 310.250000 0] endobj 6197 0 obj [359 /XYZ 38.2500000 771.500000 0] endobj 6198 0 obj << /Type /Annot /Subtype /Link /Rect [168 317.750000 246 324.500000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://www.python.org/dev/peps/pep-0207/) >> >> endobj 6199 0 obj << /Type /Annot /Subtype /Link /Rect [258.750000 317.750000 347.250000 324.500000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://docs.python.org/3/library/constants.html#NotImplemented) >> >> endobj 6193 0 obj << /Type /Page /Parent 2 0 R /Contents 6200 0 R /Resources 6202 0 R /Annots 6203 0 R /MediaBox [0 0 595 842] >> endobj 6202 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F1409 1409 0 R >> /XObject << >> >> endobj 6203 0 obj [ 6198 0 R 6199 0 R ] endobj 6200 0 obj << /Length 6201 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯ès€m‹¤ðØã90l ‡ ‡`7›`±^ÄÉ!?R‹šÕ%}]¤#ì7GT±X/ëñî_þ~þçÏï>|ù÷ùG÷ý×Sv©Š¬ûsn¿~xù¶÷ó¹²ÅùÇo§ïçï§Ï§ÏÍ¿ßOÝ_>ü¹ùég}þSó÷—ó_ÿÖ|ø“û¥ö¾*U5ß½~¯+Õü”=}o?ÿ×é/¿;ÿÖÎØ¿Îóúÿ?˜Ü¶nÁyõ÷S¿Luýúï¿Þu˜÷–²³²g•›ü¬ê\ŸÿóÓÏÍ úé³K+U•y•Ýó¢J·oÒu3…®³³)ÕàE×/™écL^'¿B.ŽÕNœýbs£L¥‹¼Ýèv“ kuóseÜŸûÖUe¦Cšn˜KmOÓÇØ“ÚVñ&¿B.Ž•~Ãñì‚Ül3S;5d"Ž¢ÓG˜\Uñ¸¹ƒ\+ns³Kn®Ö޵Š*†žf~]E$œ+äÒHé·N.¹³Å_5åTÄdÛJÛx“c c¥ß[<{d%l+›ÅÜðçé#L^—1©Éf7Ï.ÈÍu¦µ³°ÔÐv¿EÏÓGÀ­M<-ÐA.Ž·¹ÃÙ?Ï™ƒÒ}Ž}ß>|=½ûÔðJyþúsÙõ…Ý·¯ßNyóŸö W›óןοÏ2mþpþúËIe—²R¶9·¿wQö:b.E^¶Ï#™¾ŽØ‹­³R¿Qp$ëf³&É>\GòKnºãùóÈãu¤¸m•ž’¶p6 ~†-‡#%±R8›®álFón¥n÷_<£adª¸dµyýÌ{¸ž‡îÝM€-@L$ÀœÀu‡¥zJ1ÔõÅøPã‘F1Æc¼É)ÊÀ¥cÒe«a Þ£išþ¡ûÞâÊFHš²ØÁ8° ¦¼ \©ÃÛã×FÆQcEVxz ¯ÚdN¸6…ŸÁ8ÄÔ‚ßó0]+bRÀŠ¿‹,A ¢W‚RDÒë[D¢Ë+´¶¥{å§^¥WXÀÜqK+.º,¼ÀÙϼ‡À§noÍf{à«]õ*ÍWÑx¿§WÞ‚ôgÓh$Ã¸îø¤º@”·žé¤]y1WÒŸ[à=ulùäÌl]©QƒRÁP„?Á½©l¦ý‹Næ)Ød°ÃXŒ68N·”™Cž>`+V"cÅ3Gê¤NÐ]€ò{ Sq*Ûv:1aã£&“5¦;4ILãº1§<í•Èà̰YÆu^9­R ÌÑCg€•ÞO'#LÙPr3Üâ”âsuôˆrÈ}Œ¶¤¼Ìù~ 0ÿÏpyN×sM‡ÕŸ¦[D²ŽG,aýçRÒKå`Uç0: z}éŽÃcÊ­‘G8bç8b¿1bÞÃÙàÈG8bæ¯ÔÑoŒhu`= w87ãëþG U¼Ã˜*ô|ü:fKƒ«Rî]`¤šO¥ŽŒ‚J1Ô½Çô‚wÏ÷ÞÀÙPci• j1ɺ´jtu²”„ñÐ 95Ï&ðãÎô‰ïÙ›äÁÏh¬Að3oŒäÙ(®!×&Ã5Á§óÌòúŒ°³0v6ªñ{°EÉ[Òóž»U› §Úk·COÛx‰“dàœ±3\ãõ6¼ ‡ŒÒ(Öü˯çÍèj–_Ïu›±oN·1ò6°|¢ÃçL}„ß-|>šÝ”Èhþ”~®¼*‰²[¹Qž†C¢¬S%–ßÓ¤Ò®.i÷¥Ý!ÓÖ@o‡L‹!Ó •bäíÐØÞdšÆ÷‡L[½2-ŠL{NŽ:dÚþdô2m ôvÈ´(2­¸'Òqo4¶;™FØiÏŒòL=Ž‘ÝÅá=8ÛÞhLö†–Á(† SHà=DÆ "ˆÆ”·áevO¤×F¥æM¨íé°Cé°||ÍÚ¥ƒ¶¯ßÕ–)¹QZózãn¤&S%ÔˆjÎT½Uôƒ¨¹È&ª>àì[*wg€õ’x#Rº‡i±Hæý3µªD’Ù™’"ƒTrH)‚+Ó‡àhÕ 1¨pÙÔ”m:-NH|#B~s¸s&aZ_U‰©Þõ…¨/MçÕØ(JI}UžšúˆC•–GÈXÀ2ÊMivë¹>óâ»Å¤†Üá@K‚߯DìqU@,b91âžI³£¶@#1Ü(ið[d£4bðÕÆ:h¤¬Óˆ¬4fôAJ9m­] ~÷(§ë¬Ú¼œ®õzN{”Óu^ŒÒȲr:ì²´ÙS½;öÞꒀ݉úh ½fس‡§Ÿ^‹3q±úynHÂÝp:¿B¿»¯ó,Z"?€.Ÿ±˜º6`ö–pôÏ()[±’"x Áâ­ræ#2js_¯¤/¦4b#˜& LyÝT] p˘¿Ç­T½æšæoH‘nI<fcìPHLyéH&“¸„fÊSZ<1Ý7ïŸsŽ Ñ6& 'Ÿ¶Í^DÕZ—¥¯ZÓT*?*ó/Y™Çš49´„j]Hȳí ¨Në‹ ŠRš?…‹Îf•~ é¬Ëý£?—ù“°¿Íê§*ÞØÅ<6’R¥ž0GDj ãpL‹D€ÎÞ¨toùiLm”5gHP!OkÎ\Øÿl¶"^ce{þÁõêŒ|=VgO²§W¦ èŠ=ß{Æ-reš(BÖ+sí0ýÆJ¡L×7|áKy·0•Åh¤=Ï5“A¾•Í3‰Û®uNL–Ä…Éò9_ûñiYåëµÝÖ0>¿À…%Ókw)o ÓÊ7òm䜀’D÷¼”Q6£y1æšq$̽ƃsQ‰º‘“m2;@¾Hª%VtDwkÙØ„Ôœ*üo5[5¬jpæ«ØMÝ™¥Ë¶ºè£µ ¾ âéî-옄Î*n›Ž/¡p«ã¼§8B\¶ÙÔá?áaIq8Â)Gx w÷ˆÓÖ¨þ~Ô@ã:ž3nÉT‘z¢Ž¶á©P"’9­1gÚõ€LÂßÎ2 —_b8íˆí\<¶s’;Jf G¬ötUà$?/UæÓJ½Û“eQ)ß5‰Æ“‘ÎJc=|PQø˜à[EÂÿ4ó̸ |ÙŽ×%{µD`vù4J%V sÌÈÏûjî\qc«þ¯H…+’½P’=)_¢'2“…BÒDÔ‚ +z©±;³†1ŒeqÉ œ™Fœ?)i?ݰ¥:X”K$ª gâ$Ї 1jŒ›«˜Gåk¼dÉ^Œ„›&DÅ'M—öTö×NJc,–Í:ý¨Ê„ŒbiLEuˆºM5ýÔôÞ]‚´êºðÔÙ™(Y0£v–Hœ´h¨8SLK62Wö¼æ¼ƒ@U•d®û”ñ kÚmT;íÞPKåɹ™Äl˜(8-™ý'[=AÖQ´½KSø‚ G°h&RF6f Gþàˆ)ü †à}týP”>Þ£›wyéï5SÃ#`?0J >3'ý¨7EÉ8â¶*æÉÄ×§ N˜nd §J¼aƒCV³½aoHª0AæÄ;£?›(=¬ Šóö¬£¶f½€u„ãÉaU{*.‡ÆàxeÍ׃ãÉa;8ÇáãÌ“O±m%•ÙaÌØÌ… ¾•!L/ÙK*wnz@GÅéH8‘2P6×1EM9çaʳž>‰ZkZ‡hš+šêÜÛù%¯ÀÛ\J™Ì 'Ø6Å0µÆ€žŒ5Ãñ¸|å#Ù¤ü ãÆLu ’ˆ×OU8vq‰ ›ÊŠY{ƒñUo:€(JòLÌXÿÚ×’+ 0Ä}ÄË –"°>Ò²ù¦g -›¸‰ò{™ÊSšI€‰žæb¤¿˜PÎÎH•Àǘ 3ìéD÷ÜÂêkzá–j%à_q¾(UNc`Uéû.KR ½Làsó0ƒUe W®"äÊ ÿý½ü¡aú>Ɇ·ËUxs%j=Ž9HhsîëÎ\F-¯˜nÇ#„O‡ HX£{ a&ô•ñÿÇm$·d]Y]Õ>w3¥M±àgˆ¸#ÊË&Ry|’©ôrwÔ«Ýé>™´­jú¶šJ{ÛŠ= ¦aãg|ÂìV †+h¹ÂÑ ®ÁM«MìË~=}‰„‚öEe?Bí©Ô]&ÍÒ#®ýÁ¬(%Wím^†o®Rqá‹woüÚ‰DìÑì·Sa3Ÿˆ±ü#¸ ë›e‰ÓW‘k¥*¼U¬µ™®Éðò鈔ZoëóW‹ó—»íÈ'ʦ–#^É&[¨¥eS ‚§zÅRªì¹íêzÃíbñòò镟z’ì2ƒsÑ·ÅEû§<[à™÷5œÍö‚¡ã°|Sõ"пKÇ#÷dOÕ{ÆÑñ-¨;®ÊžŸGð.ÔhDk‚pd ‚ø®“v ˜å"$ë«.l$ëÅæ±éï|<x6ÄdM…éívG°ÐšÛ¼ìvÖ·bájÄ©ãÁ–KâÆ¬täÜM/ÝúSggò˜ð7&÷M–‰…Ë>'âÌ Û^e‰v™•m²ÔF¹sKwÓTaâÒrN¥†ºðÞŽÕŽŠš5æj\ß©&e»êM—'3|Íœ)ÑÁR—zfÀ(åÈ$' v-Þî‹ê[A;6&ÊJ-–38æªR}»ùÈ=OkJJõ¼NTB$5±…v:ŽM’t-lO©Ž¶q‚&ŽíÇ髸÷Î; òpW/ª!ÑQñŽü†$;\*_¢w’ Ô¸©Ë0Ù˜¢ L}ÄH GÞCÂÖõøº1ÍcüŠv `žØ{ î™l¥p¶ý'ÐKnï¡W¸>ÖÌÞÖCÈ1¦ßéJ¤HYÝAÔÈŠ{¶:³âÝbú¼âÂÌlð™¤òÅ–wP…ÁÝX®¡ÊŠ„ðŒ@«rÂ)‚p‚¢û 'Åðh•$–|ë‘w"-87•)’?¦ãc«L ,ÂÄŒ0ö4u†$ì Ê>:N˽˜^6€ù[Ï@Ûmùsž†P›‘bÞJÊA¶^ -ã}ÄÔ'KÿXªaØr•n·êÌ&Þ­§bÛ(‘¢$± vK÷Þ±ˆ!MxCUçåýtýŒ^7ÄУ æ&0Áö2W΢¡LpS ƒ(Öˆ­½\Ÿ¢M„û¬º{µhÛgªÁ› “¥âcRá"nêh ´SùböŽNgñ<‡ì:¤$”71£–;t.“úk_'zàˆ á!è”ßuz,Õúc)I‰ÃÈæbæ] ¢ ßÅ2UDù虈LX•µÏ„G´ê¬hÕt×uVÛ!ÚY#Uà•⃽hÐÆá ¸.EqhZÄíÈb'Ý}Õ&1•¯9°Ñ`Ûj`c­”ç­Å“ñÖ˜S~„›¯ó÷f[‚»öyì&Ø#öfõ½F_7‚°ð¬ó~­ šÜÕ }Ý ú¢»Š/j.‡#.„G_ÊAYåè=f,ÒælŸÜJ‘…ÏÕù3HV¹¥è;°#éÆ2ž >ãŽjÖÒ_ðe ®ýùÙöÕwóIφIÀÔØ1Ù`¬BÜa*qBç €ïqž[Ï`à]À”e=6”Ï1uõõ(“,`ð3úÒ¯C…G0l.”ê–°€;ˆñ§ SP ¥ÆË-˳Uf.NÞOc^] ‘—Õ£Jíóùóéÿ#É'2 endstream endobj 6201 0 obj 4345 endobj 6205 0 obj [360 /XYZ 38.2500000 708.500000 0] endobj 6206 0 obj [360 /XYZ 37.5000000 386.750000 0] endobj 6207 0 obj [360 /XYZ 37.5000000 424.250000 0] endobj 6208 0 obj [360 /XYZ 38.2500000 440.750000 0] endobj 6209 0 obj [360 /XYZ 38.2500000 708.500000 0] endobj 6210 0 obj [360 /XYZ 38.2500000 440.750000 0] endobj 6211 0 obj [360 /XYZ 37.5000000 424.250000 0] endobj 6212 0 obj [360 /XYZ 37.5000000 386.750000 0] endobj 6213 0 obj << /Type /Annot /Subtype /Link /Rect [329.250000 448.250000 369.750000 455 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus >> endobj 6214 0 obj << /Type /Annot /Subtype /Link /Rect [106.500000 395 171.750000 401.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_std_shared_ptr >> endobj 6204 0 obj << /Type /Page /Parent 2 0 R /Contents 6215 0 R /Resources 6217 0 R /Annots 6218 0 R /MediaBox [0 0 595 842] >> endobj 6217 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 6218 0 obj [ 6213 0 R 6214 0 R ] endobj 6215 0 obj << /Length 6216 0 R /Filter /FlateDecode >> stream xœí]Iܸ¾×¯Ð9€ËÜ´A·ÇCÃräx2 ãAœ9äïG*IÕ]’>Jüê‘RUWŒÄN³Ååm||ëÛ?þGö¯ß³·ï?ÿ'ûÚÿýþóAË\uÿÉÚ?o^þÀTÇþßYYåÙ×o‡ïÙ÷ççæ¿º>¿ÿkó¯ÿe&ûKóß_²ÿÞüð§þ—Ú_øv(uÙüýëéïºÔÍ¿Ôùïöçÿ>üíÙoíŒÃrýf.ÿÿëê¼Pí6–þ~Ž©O~ÿúÛám€°UŠºÖFeÚY—éÚ™ì¿ÿ<üÜ,0L¯ŽµÓº,\©®Y¨4íJʘL›º»ž.tú#3½Ž0¹±6Þä§‹CEÛBûg—D®3ºP»ª<ˆÎÓǘ¼¬"N~Ú¹8TäâÙ•³Ú–&w-¢[$çUeš—¶ÿÏuçªÎ‘Çàæ*&ÃÕ•‹7ùiçâPŽgãæR)SV=€šå„At1}„ÉVñ&?í\*'äzg—D®+LLä>Oaò¼ŽÅ¹ÃΣ!Ï.‰ÜÂ=€´‹¢çé#L^æu¼ÉO;‡Ê€\<»$r+mb"÷yú“×&7ùiçÑ‹gªdµ@+Ëhu%ÃìP¢UK©v. ”ÝãÉ?…L‚wÒý¼é¿{>|úrxûQ;ÕÇ"ûòs³·ÓšÝ__äÙ›ö!ß¼á¿ü”ýQ)ûß²/¿>|i¶}Õ!ݪº:­Z “€éFÔ8òÑü¯cÃw`êðhGrïÃ×±O 1\ëåsÃ…á‹ñhˆuD©Ó¥…³YŒ­:¶ŒVâR-éT·d‘`{wZÒ팬ÏlV¡‘žügF¬>TÏ¿Úqdu¬juò3](4‚§ï9n6GžÆ[‚¿ŠÖݹ´=ZÓ¨¹ZqÀžTóá“ ³í@9I ¨’Ø>)ž9)œÍƒdŒ¼ƒjDÚ€´ÔEà©«AëÈp'&k̷݈ÖÇÜU™_I¢öñ5>ÏÇõXÇ4 ÉMV xöÖ©>vÀJ’#^Q¹ÎÇwÔ˜S'„ŒùßbBÆÄ_A¸ŒwâAÕäW Jð°ÄçÌðg f›Eæê˜ÀR«Gðcă Ö±dÀ‹o BÀÉÊÏíÌ܉¯Ž=ì!«ŽE©/)²Ã“Ϊ¶—”5~Õ©ÊÚ C‘4c̯XíðÈä ï‡paæ:ƪe‘¯½@¶¼>µÊ‹ñý‰©þÝB{X‡@sáxö× ÑáRéc·ÉeÛ¿ä6ÇÏTÒ$:àâ5™À–T¹ÔÐ~XÖÀ‚°L7K±¢(?éØX7&äõ&u$‰Gõ¦ºÍ f½Âï±YóÊZnG(>DŸû7ù†Ã„?5f¯”=ºq¾òX>ðlxoÏSlýŠjÓ.¯(Ü1ub ËðS®çî“ £C2Ô¹^c§T¬€ÃÝ3¬;=ñ6Æäà!ÌÔŒy–òëE,sÁ†7sA0êú½jܳ•&æq`nñ-†º¬Ç Y_ ãÊÅ@c‘ct;gãþøž1ÎzEôê÷ßàe•½†ŸEƒr"\y4hæuDÐÝDì 6 ±¹þåëyϬÓbчU¦ëYK[癲n` Ý9a´:v¾µÉffFz6Éfìóy¾yw€g«álÕ d;wìäµÔPøØ‹G<ëtÔZí Û/¿Á»îhDæŸw`ÎÜ7ÚAÏÿs;0nÄÞ´X¸í’쮆Èè>^xFäô‘ÚõÑŽÝàx„Š+*LØaêÒ‡Lß qù¹tf9ÌÀOåJ4bà7˜é©‚<ðƒKÉea!&'V`¸´‹NYTÈÕæ’õ„JárN˜1ý2´èðI™Eø¤° ”‚çé­5x×I¨"×z™J7Ë]}*Ï!0äÙ.ËG<G ,¼fáÞð:·  éÀè„Ø5îÔ1D#É,Öø8‚éwwqR¦QsOÈîÀ@‚×.„{Túœ[‹K‰xþ6%K:¼ÉDœä×í¸y‹p«¸1C1/g˜-ñÙûé“w” Pft{ÝT¤=“²Ðë!ŠnªÊ“úÇÔù (¹¹¾#UÒk3ŒØ'²Ž=ú”l·…íeÒª¶—2FOdëuÂI¯N•²cá´ye‚(8ξƒ¡žÂ°Å eÛ½©XìF…¨¹Žøëò’\ñëÑsòÎæùæüf)T#l¶~3¸q&¬F# Ÿ¯õL¼Žçyß“žé¸|ÍÞô´NÒg×ýtoJq¼·ø$Þ6¥¿ q>Ü *7lô*¸cxxhâ îí º{zA„+µD·möŽ9mTá2PÂ}IEKŠ÷€Â ¼Î$/[SÌÓ ’Ñ׈W‡pë¸õ~Y™Ö)êE™¼q•€c pä‘…ë[x"›pî6“݉ã^p$ÆRž|TÁ7–|²W¬²µ»\§t¹ÊŽ ,\=[¤¦!A=®F‚uôS57 ~„_x$ ýá JæSeŒµD‘ÑíK‰.F6EŽU+Æ×°Å¿8\0E\W÷¦WwmÇW7Õƒƒ‘k»ìIY—UU¶M®ìM#Q€–2º‹®3Ñ/dCLðl²|¶ïÓ³Ãl³›ŽBÙe¯ Æ[ë‰m"‚Pñ7 ¯¯°ö$°áåçëP¢“»l³]tjåF£âÛ°ÖÎÄ&½Ôqtr!\FUcšX˜-«Ž`´:ì)`¢¡˜ã‚_ܲ-[ÖF¶ˆ<á±êƒã¬µ// °]h$ˆ1V°te”Yè~Í9+3hêhÃv #n½wÝ#äÝ$Ñኾ3ñÃ'ôý†Oà]CvÞ9C:ªÝÑsŽ÷%+aØyö.“U=¦äý"ÌÁ0Iµ›²µœE½hµ›©°Õ[³uŒD-Ú…C˜þ»ŒWF¢å—a¢N¬kÒ˨ {&W@ô±Hu˜‹Üâl’+ÀDfOv°µ*Mb&ˆy³¶ÂT$Ÿ‚3ËØêÑ=·ƒ,|QÓÆÕUÏ (;úšsÒúD *)Eln8F1Î&ØÚ¦ìÅⱦ33v({°i{LQĉŠÒ÷våoDt&¦´Èä®ÂzhÀ…÷ò§\á‚úVTߎuã÷¢h4Ó×üõTJ¥6ïX~=щÛDækSÕcÇñ}D»O G¢ü8SŽ×à‘­î‹ÛÙ¹²XL?滨mFÖÓc>†^^éu™dÕ¯ËV·Ó‹$}£Õþ1SÝd?L¦*êžOzöX„P"iÇá,…;4YÌ–Ÿí Èã°uœ¿¶4’ætçƲ=Ë<„ÏýÚ” *æ;èºÓÒ˹{ï]rùۭ\ñÑ { 'Žó IAO2Æ0µV3Ñ£ûó¥P–­ßûw«óÛtrÃÕùåÖw©ZÜSŽHüÛ‡v–kwÉHs·-<ƒ'c b؃ûTAZˆØ«:žŠöøòh»Ðfòüª¾¦‰`å¡Râõ¶w 3/ûIŠ¾Ž ÚYaŠË%ç‚ wë?îe¦L&¡Szt/ÑpÍ܇;HxJf)R„•©çÎÄ»0})¶4re}I–wctÄFnYõyÏm í»p¸y q²NQ,\¡ …™æõŸŽÜ&N=•U˜z0˜ DòœW—Áëà“bü`ÞfNJp=Ua‡\'YÍö«CöÞÒ¥>;ƒp5à'¸ìmâi¿šH’>F#IïZQ…©–fJÒÒžÖ¤2B]FVrÉÊÛݘñvÉ‘×$Ÿ®à…øFß²>[ ¡KžI¸L•Žv')#7UñŽ ª˜À/Qà{H¶ “x!Ú†jµ÷ˆR’²õж¨Mm Ç?‹Ù›¶!ǼÊr©çõxÍÍ#”btCÝ2PÔ„“´©Ì§€ªÿKÂ<®)\1ÖÖxµ6"CÃ3yÌÄA^E|Ó8Žå€úf²ÍÏ1+Ë„N.ˆ2tT¸­”ú·S/Jm\)Së1÷>”©Ú¬–s!±,L±¥ÇyäüZe«ñÕ„ÃIo9I0f‚F(¯¿7EÓ¨Ê!EðUa‘B¨ÌÅí{S+•ûkÚ2®ªrC"Gb`îÇÁúГƒã±ÄðDr`Û6üû¡=’ITÊI³.Î ;;¨*»L‹·|{yÕnZí‹îÂ>Çד®¾}ähÊ4Z ©3Ûʱ_^ý\‚…ÈÀV7áò·¯Ø &’’Ð@ÖÊ¿Aט¯ô¤ÊnÁvÇ×=áòÂ$™d L:‹$^8áA7/fdû´ƒx"]r{¹ß>bû ªŒŒ{¦* ëP ‰8ÌÓ#C0ÿȆÇ•n:&Ííj†ÄÆíoW|³lŸº±ÙùyŒÈß®›‡F'LÝÐÊ Ip{–vÛ'N쀖#‘;”v×&‚4²ï(ôJÊOK¿°ÂÊ\ÍvQÕö¨të*ÏÌÙ­·Ô±œ1#v¸3Óî€=´gúöqŸæØ»ê'róͬc— qs{ûØŸE àr‡îyK nV÷GŸ°áÐ Ü;s gƒßôatô>–àÚ7;a÷!œðl˜zþ˜ƒ†*„¦’^L̰gp>\hî ŒLYÕˆ <5æϹõd‹ þæ©ßýÄÜGðÞzSÊœ°€Äðó´mÅ>( bÜLø…éåÙRÙc/ï×1¯Éáv.n¾¥[/ûtø?p–; endstream endobj 6216 0 obj 4387 endobj 6220 0 obj [361 /XYZ 32.2500000 703.250000 0] endobj 6221 0 obj [361 /XYZ 38.2500000 627.500000 0] endobj 6222 0 obj [361 /XYZ 31.5000000 704 0] endobj 6223 0 obj [361 /XYZ 38.2500000 627.500000 0] endobj 6224 0 obj [361 /XYZ 38.2500000 187.250000 0] endobj 6225 0 obj [361 /XYZ 38.2500000 187.250000 0] endobj 6226 0 obj [361 /XYZ 38.2500000 734 0] endobj 6227 0 obj [361 /XYZ 38.2500000 734 0] endobj 6228 0 obj << /Type /Annot /Subtype /Link /Rect [55.5000000 711.500000 137.250000 718.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_ref_unref >> endobj 6229 0 obj << /Type /Annot /Subtype /Link /Rect [183.750000 635 219.750000 641.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_builtin_types >> endobj 6230 0 obj << /Type /Annot /Subtype /Link /Rect [60 605 98.2500000 611.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG >> endobj 6231 0 obj << /Type /Annot /Subtype /Link /Rect [111.750000 605 156.750000 611.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus >> endobj 6219 0 obj << /Type /Page /Parent 2 0 R /Contents 6232 0 R /Resources 6234 0 R /Annots 6235 0 R /MediaBox [0 0 595 842] >> endobj 6234 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1409 1409 0 R /F8 8 0 R >> /XObject << >> >> endobj 6235 0 obj [ 6228 0 R 6229 0 R 6230 0 R 6231 0 R ] endobj 6232 0 obj << /Length 6233 0 R /Filter /FlateDecode >> stream xœí]I㸾ûWø`<⢠ôR ‡n ‡ ‡ ' 3A:9äïÇ.Q®*Ò%~~¤$Ûݘ©jË¢¨÷ß¾üøû/Ýÿã¿û?|ù÷þ›ûùáË®:´u5üÙŸþþðúÝÜïû¶«÷ß~Ý}ßß}Þ}>þÿûn¸áˇ?ûß^ïÿpüïçýŸÿrüð'÷¥Ó~ݵª=þüåùgߪãoÕùçéóîþô›ý¿N+Žs›yûïL]ÕF¶1ñèï»ñ5Õóßÿ~û×îÇiOi+U5z¯¬±{Õ[½ÿÏßv?>`\¾:tÖ(ÓêÚïÛVu×éãï­q؇·úøôªoÛ½Òý^uðìç¿2«+ùÅUuÄp®Å‡KE™FEÏŒm¥´@V·r^=¶UWe\ü´si 8lãÅ]ãþÀßÉGw§çub,ªÛ_à*½Uª=Ñ×5ìk€]]÷1Gê”GÍËòoú|,dع8TFªÂ«K"·µfÑ9{^>üuÕÔùû¼sq¨ŒÈÅ«g–ZÕ#úÈ}äqr^>ÂO¼.ÛâÏ;‡ŠCxdõÜ·}•O|Y=Jê.Ÿ¾1ì<“ˆÏí¶¥©²€ö²|†ÅûJç[üyçâPñ¬þ9e¼•á`¦~ÜøþëîÇOÇ=5û¯?îìùï¿îìñ'½µ2û¯?í{ÜÏ»ßí¿þ¼³kÛýô½ç+ºCWªèŠQÏWº—¯6Ç®?Ãõ«¯ª ]ÁËW®öÞ0üjõô|¥>Ý©¹nájø9x³–xu ¯@ãÕÞµñ|€ïíü¯ï§{öøÍ1ÙAGðEP™€bµmº¶Žžž}5²Y† ¼¯Fì-BIJÇ߃Ÿ÷!ü‚a0lÁÀ½…Ä4,òôõ(¡®.ÊVP¾´µ/`ÎÜž·÷K]q4|éžðʼ¢á¼7ø¯(tÅÀ75V )#u¯|ŒàsƒÏ4>¹Ç9Ö5¬I×BÂ-Á÷RΔ𠞘ÂÀ94 …Åi^ÖÑZŸP•à#N©ÛI¹Ì\q˜Æà=ê&ø¬7U˜ù=XéÈJÓpZêÊ;â¨ñFðéMº°ã—îW"gÓ^M”F«Opo?UO@‡À¶© +†áH­îöª¿Ä uóÌ µ´À®ªÃ *™~áŠcuõAûò¯¹çºG[¸ZWëFqÚ*ÏÎv Ô¡êÍÌ+‘ç „ÜL I`ˆÏiFiO“À÷0Ï©Æ÷©ý÷ù!Š1aYí=ÜÁGtïÚ©Hip{‚;Àïw­jtÅ6p5 Q7ü¦ªÏ­G»ð„®ë‘ëA5úZ;öõUyQó^M͵V{¯öŠ  ú…ÕlÛ8uÆYgh$öÃ8jñ=ØMšvÀ¯,„£DÝÙTìî»­N7ÏBpMyýά`8/*×Ö39?¢+ÕèFhò÷ôèív`û]9{€Ã›Oµ‡¾óvàñ¥ç`Àçà÷ ÿ¤çÀ];.~éwÐÀ+}:~F§Ä,TðM1tDñyŽÛuóBgïÓ¡Ù“(TF‡Ì…½a\bÊ€XžÄFÖcÛ€÷` †0ĸbN±sˆ&;Œ+·ƒü.2c»ñ‘0ƒ—²)Jåaâ”CBÓ Ó ;8E»LÈ=ZŸYÏäTEÌlLcŠÁ YØöƒ«™ˆbC5!•<²<d©b Â1 Ðw\ʪޔ£$.œ¦±Žý"˜©2Gñ›F0àn9“R«Æ“b²ò … rïO¦§]ÊîîÑ!‹PÀ§Ù¯žà—J±® ‡"uÜ 9dù&Å 1óHðlß ƒ§‹eè.Ø,^cë´óµOªF"@ù¼§¬9Ó€;ãg>”±Ê˜" Ä›´4¯™-\ƒµu}šRÖ°Âà+¯ÑK?_”žÇd9MI¹>¨¦ÍCóMdª4W„%&ø_ÍX½‰zêSò«L`YV‹ˆ°}Âõ²)»|}56oRÚ0'(‡Ú—ôœˆÁt‡íD¬ð$$ ¯‹Û¨:LÇ¡»Òã¥9;mA NÈ(©²cRR˜´TLÅЫ‚ÕOᦠ¼$£ÔjTïë"ŒsΗ٠Jà} ·b²†JÉi™´¿ù!uD*3GW"W‘1?MˆbË¢ç_Dãe+sÔ³¤k¥…Î^J||u€Q!òöÄ*+~ÈDAKNí EQµu[wÆE Z™ÙµHü¦ß– ùQ…–»nÔ×5®Ö—…T̽¼iobD’aX0EL,;³FX$S*gÑ_ÛøçR6‹pER™ckÎ ½“°¥ö_>$Y•^V«ÑæÐð>Aºv*ȇf?AoØr©{\-â uïsÁA‹­+›þ>æÄ7„›KŒozhUòê ÎsÁ»~àÆ@Ô‘Ö*"N¤¤{à9±Ù»ïik=êVKe{$‹ô¦¼ßD䇄£$“q·@R³ò²¬ 8r:A/[i.Ó®¥P›Þˆœ Æí.k&o)g•!ª¦E¹u1Ç$¾\18!Â'G$†Õ·ƒ HŠž&Ý&93zµoœ¬ ¨í!U’Ž9!¯“>ð¾bÞjÑݲî·H/h¥šÎ?¿¸s0ìé »¿â^²‘yS½ds µk©2Ç¥²+Èô[ª §XÉÚ3ÜXΡ°ÆÂt×b2%—µ>·ÏÓ‚¿*œ³#šs›©Ôk|›aŒí}ow9v¦õ„{¨©3V˜H®@‚C(‡Æžä—‰È&] £ZËùhCijfŒW¬HRÊM©ŽW"-n͈Jànª&ÔÐÀ•ÑžÉÞ^ŒuS¬Ð­TïM'>ºtƒKiø£|k‚‘2P"= ! 5[CØ0‰äD7m5?X´–‘ÑùƤÊå˜M¹¶š3>AVµ¥ª€R ãz=M9]ânfÏ+ªY¾XxD*Z5Hñ4ñÅøÄsc–@©~Q²|¾CWz¢˜óÍ^ÎâÒo̓cÞ’®éñV'<£@¹ùVµR¯?Xb¾Uí&<Ìâ<°—D+bIëꜸ):‘t‰!3‘42ô` Žÿ@—&xÂy“F£Œì2s:œ^©àÆ!)W"s:K͵¬M?nfýMû‘iõ…Møå“"a³~22òoL‹©îYJÕ¶rRê¯×,!¥N[ðÎDÙàô"ô­µÞK …;ûTœñæX«—>§-Ì= ]מl7A™,•Ûèå!œ u¿½]Ö“)Ü5my–\(˜“¿A`ïëÞ+H‡* -å¡“é›’RÇn,Þ;(w—T\zÃåÀ×ílf/lËbÈŠd.ßžÁ1¡ „9Ì >Ñòð”E«,LTª |JEE¶P¥]¸ªÂ)|y©íPlU÷úíNÓ"ŸOðJ—~ÅÉÁK‘Ü®†#¹ðJä9ïËA¾Qêí¹IŠSãØv[ÃÜ‹5 ™3!|e2Öž¹ÇÏјzÄÜø3`eû À* ÍGxÊGy¼šè›šuà¾é®Á}K_É jµyËx¤BJLPkq÷7åLb`à«X¥z2¤¸,™F¾²)=¢¥ÀTòcrñA£wì–­ 뱂áWË{=%¼“.¹œõ¢ÚxRÒ2Î>fÎF„_°Á™l5øûTNkÛ±µr)UC- k´ [‹ðŠÂyÕ¢oŠuw¬m¯Ã‚oûú=Â7‚-h™D2ÚñsOŒ0òø04VÒ¢ë”}«ç”yªňÁ¶0Q)¡0‡Ât…ï!<]Ì Â÷¬€./[ð®WÎ¥»ZOSß6éïc«$WkGwQ®ÖÏàP¢^NáÓ ¹ ö<ã{œCJˆ*ÅöÕU¾ümê‘ð9¸žÓØXmL¦×£_¾$¿ëí8coy-nÕœ±\nÂØÚò±Âõ∠Դ0ÃØ^½œhšÉý,Ïq#»Mª()AºÑ£TP‚課¥Ïz!9±|þÁCpÁaëhˆ…•ó|]C=Û€“TËó€åi¹  Ó•ýmr2,ž5¤«þlÉŽ¢HÞ¿‘¸wJ¥–h–ìÌ%ªG%3§©Tkòå{©ÝožOBVUc“оTË-œÊ‡‘”$;( ·5`æùàBH|Ïd T^ÑìÍ¿”Øfš!¶ù})¢}MÅÏrVë=Í^A wj-Õ5T«—@} •‰– ÛñXVÎ8qsÛlDE𧬂dÛðˆÉ‚‰[ŸÉ”KdJ.?^ ÿ‰ÎùÃï• Ïd?FŠS“ó&VGŠ p§ìp·ÌH‹åkÏ0d+À™š¦„3QªðOth63–·°Âþ°ÝÉtö¼Æ‰F׿JÔ¸Ÿ¶d΢ [{oMUXš_¹g¾2)=ejç•)‡dôÑr†Üb[–bpá{¨¶)„@*AeGúâÕð Ê6ˆ¼O 0æOê¹F_^‡¢¸OöªÑ¾÷mµM©%óFz;!¤Bdà7'v0cn™% ¿’…ñõ¹q¤7÷^žú0äK¥pè‚íêF†÷LÖâ©h¶ÀyœPþu}+Ûu›±2óºf ûÈîZd:yÊ-.ÚÏ|ÍÍI™°†hB¶ÕsŽI-¹ß6•7ÓÒö'çIÄ­Rx\õGa>Ï«{^ꟼZî°]ÚA¯ ´ØÌ3¢ÂÓpáJä9Ú~S'].Üãz¦\€› ¸^zƶØ0â µ®Uç±y9”™ãîÚ{<û·è4»a†à‚±©vðYs{RL–eD>–Ê=fòVm~'UÂZxÐ3%/‚ÔJW }}L+w̱P›Ã,ss󲙦ö g*KããÞ¾ÊR7ébºTZÙ=¡»*@üò-ûKÍÇÞ4!ç~/Ùæ9²Þî ¥‹ç¦m*3ìQM)UM¹˜I9eçÕÛFß[mßÒM’eqyÂM>'2Ö Z‡…ÃÞY[“6FE®XKˆù"…j*aém0¹O7ýãX®êXš®ö0r‡ºÙú{/e*Ôziw Û«;H¼ÃÆj-ÓŽÑtD«¿¥¿XS¯- Ô˜!¦üú ù˜²–±7íGã.Àö[ÞÔT+¾{Ç‚Q6Y—éÊWˆ`œ®&”š³A—õuÙõ2μZ½:¾ ŠuITeô|mw}¿x¶1è…š"Ñç`Õjã ­?f '1!ÆJfðá|9Õ*<ÕM·?ÌÎN{øõüïúÐuÕ¾iN?Z¥Ü§í¾©©ÆO¾í{Pª×]§Îß2oV1¯Ÿqü¾û·9ݶ÷ïÖÁ3ôéo'ÇouoVéÞ>㟻÷¿Éû¸YæL¥Æ‘ß«¤kâët}ííóV½:Ty9Q—Ðê^¦ws$H`?2 gêÊó!8þÝ?R{ô0|žúÂŒÓÒ]tµ˜Jøå^ŸÕB…â€ÝöÀG²>èa\Npà›ðŠ‹2êCÌ—Q»ð3¥9^ÚÛ'÷¦È‚©Õ¾l©‚›‡û/èÎ4NGúׅ×Px5x£}•ôêí Ù²wúý¸ãÑvOé$€É“€á=|úfp›’ „‹áí#Î|L{|5•a)EY~œèeuÞщœÌ)"L;ç²hÏÑãd®€s:ÕÐ^·%Y Œ ".BJpŒYÁ™cäLà4Â÷Áö:NÉrŶ2'Qç±GWÀ…§Ó-¦ôŠýçÝÿÔ†+™ endstream endobj 6233 0 obj 6003 endobj 6237 0 obj [362 /XYZ 37.5000000 728.750000 0] endobj 6238 0 obj [362 /XYZ 37.5000000 728.750000 0] endobj 6239 0 obj << /Type /Annot /Subtype /Link /Rect [226.500000 69.5000000 252.750000 76.2500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Modules_nn2 >> endobj 6240 0 obj << /Type /Annot /Subtype /Link /Rect [43.5000000 737 176.250000 743.750000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://docs.python.org/3/extending/newtypes.html) >> >> endobj 6236 0 obj << /Type /Page /Parent 2 0 R /Contents 6241 0 R /Resources 6243 0 R /Annots 6244 0 R /MediaBox [0 0 595 842] >> endobj 6243 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1409 1409 0 R /F8 8 0 R >> /XObject << >> >> endobj 6244 0 obj [ 6239 0 R 6240 0 R ] endobj 6241 0 obj << /Length 6242 0 R /Filter /FlateDecode >> stream xœí]É®ãÆÝë+´`™5p( Ðc€,4º,‚,‚vðt¼È(=±ÈSdÞ*QztÃý^‹bw¿ÿóçîÿýûþûwŸÿ³ÿÚý|÷yWê²8ÿ·?þùîöݺß÷uSî¿þºû¶ÿ¶û´ûÔþýmw~áó»¿¶¿ýo¯÷iÿÿyÿ÷´þÐ}éø…_wµªÛŸ¿œ~ºZµ¿ןÇÏÚýíûߎ#^¦ëÓÿ÷w¦Te¡Ë˜˜úÛî²Muúóû×ßvߟ n–º0Ea÷Êšö/gõþ¿ÿÚýØNp¾88«T]ÙºX2‘²ö8•©ë½RMµWåp¦Ó©ñSŒ^ê&á觵ˌÑ.<ºè—MÑ‘+’\Áuü£×•K >Íé„¥¦»`<ºè7ZH·Èà®ã§¸[Ø”|Z»üÁtŒG?4Ö(SëÒ/ûxÑeÓèö÷Útÿ-<6U)ÉöÍø)F×eJ:­=ÙŒ.‰ÕÖTi/øeü£—*åŸÖžì‚ñèɱº¬LwlÊ&¹–ëø)F¯ê*%H×.0Ý¥ãÑ“_z­]ÒK?ÅèM« ¤ý´öd—>ýSÌ(x)çOŽš¢jŠUsÒð”9ŽÛ*ª—ÛCÓÊ‹UuüQ·'zþ´ÚWå‹>|þä뮲¥œnuý–ébnçh¿ßý[_Ûûo«ÁêøŽ·’ö[Mo”¦?ÇO»·ëÈßGööËîûímTû/?¶wr:êó/¿îÚ}wšËí¿ü°ÿcQ¨÷ÚùygÖœ ÇïÑOŠwð}zÒWTº¼}§†OàhEyzÒ˜­šzæhÍùÉËVt±Æ‚÷U¡wt3qæ¾´8· h”-ÜèQû€Ó§;œÖÙ[†OÞ¡'ú-|ââçQ>)àh|‚Wð=±p ßQÑ×f ¾3y¢ „àÈ´ì­GÖÄ}~¢Ôÿý½!&>æÁ˜;@ˆÊÂP$ R¸€ œ€e77£ Ü ¸aàæÊÀM›Qn ÜŒ0pseà¦ÇÀMFnVÄÀ1R¼Gxj.ôÞt/Íx’…Ñ)[ylJH.!Óêž$$¤ª.½u>…´”ðÄl‡9íÁõøº*…3½c 0^ŒM ·¾z݆²–&° ÔáhªIŽ8-ðà€Aœz`ÂYÌÇ1]D;ò„‘Ÿ0.S·nà~ð¡|8=)F7jñ ôyª8Tµês 5›À…òðq5Ü0‰nŸ>Ù´ÁKk„+ @|Â`š‡,ªR>m" ø %÷9„A¾/¡Qa% ^Rf ™£!2è>D¥4Áe,2$SIÙ³g$`L¤0Õ—UŸˆÓ `Ís0IÁ,€˜w@Ä;5ïãyeäÆ+𯅡aë5¯%ä°®²>‡%’ É&@‚æSì€ç/ ¢¬:ƒž2——\^È.(®%õµw´?>› !pÖî1[`Õó}Êxƒ¶îXG]•³•H¬8Hfž)ÐLÈðJ] p¼I Οn€IaUïGÖúŽmì˜IaDÁïànš³Ð`êþföµP.å\(‹$þð”B‡Ù%¾R| 2r&©6@4e}p¢†è$²WJ‹]í<÷PÄ0 0áyž"LQ‰P6þ0ã¶^ í”Ô ÜP̓AmUPfôàãÀ‡‹Õ‡!þyÞ›ø'"ÀL 7z7Ì h)Œä ßÁ— !rãwî&xP6<q\ÂNÑÄ>¶ù¸Á”€¢åÅÑ)‚mOaÎʨ.Û´löæƒ_vŸgw3¿A¹&gª¯›ù8½„ãð¾ÃÌsÁÄ‘wÜ„ž7bÿPX?S#eZFaÀ‰3áwðÚÞÂýð‰K-Rvì\«+®—>ˆ(|V× ð!G™*½ߢ“ÁI9íVVuw3[ÀÒƒ¹cJÀûIìn“È h|¢f•\D‹¹§€nKDÌÜ_ƒEÊÜò :m‹^¶j$ƒN[ãe·?ñ3èNß2½QÌí— :mÜH6?Gû‰ŸAwúVÓ¥éÏ‘>ƒNÛêr/œ íI”דɓ` ¢xmó=Í^ãôßµ+ ÙÄÍxõL¸/¾QÆHß‘µ4ÔU† aáƒñ­æ l¤(+BÞuιJ†uEX—™ ¸Ø[vdjêl”ÐuÙqµë'.²W¦é¸ÉùÓ¦ý¤îxÎ哯-m®:Îôò­²?Ly;ÍñîƒKÛû˜Á4æôR1í·.«í†éïæÈÛÒÙT ^QvzE˦;ò C-„cpp6öGÄÎeÞŒ “ú\ù(2®%"PÑ+6f-Ĭç‹NK–HN^s XÌùME¥lp&c( 3ÑJD ]L¶ròøÊúœo#cB Áß&9_Z«r=¸Y³ üZ{õ‡ø'’05z¢`%5œc³I¶¬Ã̦.^u ÿÞÎZ ”߫ܞÇÀ'65rµñ!™`œã3(Í@Ŀɖ-¹C‹(áBD÷ŠTˆÉäȳH}Hš»ÑµÒBeL5N 玜o8r£†#70¹Ñ{1¹¾áÈù†#7j8rÑ1¹ÑëŽÜ G¦P}Às—är¾ ì¢Sø@"ˆ¨t®ÞΖΩ‚ID¦ å\^aöê¦ûEø–¤*K„à˜üVŒ8B‚) œ)'ÖVÌÓŽ! 2˜/½íG—ó Ä®ñBÓÑÖÆSº@¬=†høÎ¤R–Ø SÞuY,¼Bu€Æ†\æ*xƒGÃê í±zƒ¬àµá" ¸Ü ¼Ä;5© BãŒa%B:Æ#ëTˆÎÉ&?¥-§"kcz*(i§ÂG‹\•ìde›€ÊÃä-ÑwStqŠÓ¤7.%d]¬úJoÅ H!3eYûÓ>¤ ±±qÐE¦PþýN±ñåAÖ¦T½ kSê‘ kSZ/úø‰d}ú–ébnç¸Y›² ²6Öùs´ŸøAÖ§o5½Qšþ郬M‹ˆ=€i¶ð˜¥˜r'Žæ‰Ã²˜N0ʶJÔó :)¥5eÅÔ6yŽA1ùëóå綠IAëüŒcÙ¨¢Z^À2vD­è@⪗ µ¹Æc‰…±wXŽÍŽ6 ´•(ÿ)‹ ”®J0±„Ër”°H(—©K‡ËNÑÅ^›'3åa‰r„ 03È9ðÊÝ“«©¢ª}MáU«i3ˆÅ“ Ó2-¾D«ŽŽ§å‰·Õ<ƒ‰UÔFÅ¿0. ÛÝŽ»ÆïàH?ØYú1ûa±F¥s._»Éá'Ýò *P¿„;Up G³Y¯Ø6ÛÏØ©ÆT > DMk3be¶æ€EUo`±,¨øÌH!³Ê MµÅ2°x¿¶€¤Â„'á³Æ'šÈÊâR8ÚàÃ’2ì¶ÅÇH$bi@cPb\×PìfŠèá„”@"äŠÑV˜'œ©eu]fWòsÄT#Úvb QS\äZá¨Px¢00å&­Hô˜Í‹VúÍ®þ$võ\¸¾f8_sŸo‘ ¼ð”îÕÆøL2‹m]Ê3½À_‡¼RfR¢Ü àOj¯Œž\Ð+²w<£¼*Õ‚+ä‡Åï˜Ï˜š+.F”ÓTÕÓ§›hOoŒÙX^ÁTO„(&01€IœN^ðk–ø=™£g8a€Â`€Y‡¡.6¯ã2bjÐa#óJ¼ŽµÞ¼Ž ÁâÑõµóã äʉJÏ~ÙÜ$M‘¨Ä¹h"}®„ý€…¨¦¬»N|˶ÁXo˜Ž”vP/-[s:­ip+·—"Znߟ¸Öi.§Ë­äyü3Y­ÊMi§Y3“ÊO„ ¬[¸bi^OŒË:lÔMm&籜?F•ÈRFär$n‰Ù~ƒzê1ø‰®€ñ[ti¢à3Û+,8Â\mðæÔóZâŠ)aç†ÐÒ½€±KìôU"©ffmL ˜k†ƒ¼HÓ\1í!üŠT©T|ùÈ2J’¶ö4æþX,*[ä„`[èé‘\Ök[4×[À¥‰'w³4Et£úébó/œ‡*Îd¬ÏøõX5‡2Yêc/Sö*¢Î+Ó@ qÀ­>ß2Ó²—2l^;íñúy¿ez£˜Û9º~^í¿«a?¯öÓÒŸ£ýÄëçuþVÓ¥éÏ‘¼ŸW»OÓ¿ ¨&51Õu" Œî§€3‹ð3IP1¸°?^´tU·ŒÉšï4{õ-±Ma=Ä£Ì!ø 6IÁ“kKÙ²QÞIáž÷OËÌÕU/¢[U9AÑú™·í=“²>£.*N+Ó³˜(´ˆÐ)'Zu…ñQ¨‹¶F{þÔÓ{Õe ïÝódŸ­8©D8(Uh”?­´‚œm,b#1j>.>BÔ`£¼doRóÛ²RÞI1$‘ ·cênyúT¬ ÑBH³É鱡‰ ¾9|ÛDAú@Ÿ¡­‚×$‰¬µ§Á—?õ$ÓöšK€ý Ê;•ÖôÁ|ÄvÙ‘|U gúF¤7H™ëSéË#5îßü3®·-ÓÇ«ÇDiª.IÚà†˜˜áב_Ìí%kÑ}ºpif§‘öŒÆËF+1æô'ñ+XÐx> >> endobj 6245 0 obj << /Type /Page /Parent 2 0 R /Contents 6249 0 R /Resources 6251 0 R /Annots 6252 0 R /MediaBox [0 0 595 842] >> endobj 6251 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1409 1409 0 R /F8 8 0 R >> /XObject << >> >> endobj 6252 0 obj [ 6248 0 R ] endobj 6249 0 obj << /Length 6250 0 R /Filter /FlateDecode >> stream xœí]KãÆ¾Ï¯Ð9€eöƒ/À°Ï9Xì99ë8aÙø¿J"5RS_‘ýMu“Ò0‹d7Ãa³»ÞU]ïÿôù»ý¾ûþÝçÿì¾ö¿ûüTìë²8ýgwøóÝål³ïÿ½«›r÷õ×§o»oOŸž>uÿûíéôÂçwéþõ¿Ýý¹ûïÏ»¿ý½ûáý/~á×§ÚÔÝß¿ÿnkÓý«8ÿ}øù¿Ÿþú‡Ýo‡‡Ïõ›¹þÿß¹ÒúÚ¶1ñéoOÃ1ÍñÏï_{úþ€¸¯Ô…o}µ3Þùi½Ýý÷ŸO?u–/ö­7¦®|]¼äCÆûîSeQº1M÷=çF_:þÑZ?Åꦣt«÷®g[yuU[×ô ª“éyý«û"åêǽë¦G0^}ßxg\mK@öÑeÓØîßµëÿóR°µU6ã“ å¼~ŠÕ«¢MIR‡½ë¦G:^]‡«k{øJÝt‹Ø¶Ó–¨4,¯‹€ÓâmÓ¤[ü¸su¨Wyõt}éŽÕ×O Ÿ|8>)÷Î6fî;ïŽOüÞ»“{~bÌñ‰qÃrÏO ¸Zszòü–ÇvxyæøšX ï ®†w€A,À <>qûÒWM}µZ¿ƒWcÞ!ƒËÇ£Ò8ýøÄÂpÁÑ™ jÌ·é@( ’îÍ6M‰]ãï`q@É;Bv )³‚i3 »ÙǼ?þà×N{ÏRÉm¨äÖÜRÉíHW¶n¬’¿U^/S^~æY%7í-•ÜŒ4ÓŒUòá·úÝË\Ÿfa•Üù¼=6ê“Îë´XíEpÚÃ;²ß„Rb_ LŒ„|A(áG¨Ù¬¦!Æ$†0f¬wOOŒŽü"øMjþ@Å0‚´“ÚH––¦d©ûØ»7ÇÝ\±…OÞÃ'>y Ÿ¼ƒO¬H <ÀC ø›MøÍÅøÛ`ŒBÀ;˜/å¦"|Á\ÆlѲØWµ¹§ï˜r_´îú©nàƒ¸G¼GäíŒìA b‚œ$36$ñŽpÅÍæ|@b<Åø=i!*ºªê(s'qC@œ2"^º@ ‹,в\º4mp¼ô‰²}“ …­0˜0aT;€Ù,!5„œ u‰»PA×bµ‚aýq6*³:ý¶>ç~¾§{«+qú]÷“HYËuòHÌd°'ºüY•¯8Fã1¯BîO꘸D1>O£QøÈX*9 ‚91…lѵªjšó×]sM9@hùèš÷çOê–qäðŒ±Á!6'Á@OÁ!ŒXÛ„Ya’c®¤®´ÞS)e‰ø¡°YbØ«büo*óxxÛțÞRQâxY´¸èÍ–”~3Cüκðœk®uˆALðãD'UªÏôЪ¿™-Ó×çä•4N&ø–ëhþ1_LãÕeSÔ¢{㪡€ïÔ„Zª(²ÐT¨™¸^·‰”ñ–ÊTÕ|·êT"S3¨Â󸾀Hp§ê¸§Ü³¤…Lu ç¶Úñ8óRµÖ‰I Š¡u¦7ÃÌ„0Ìz=XÚá&ê>Ãqz>è`ù殥ç ÌÖ9Û\ùŒ¹Ì‚Àr)ÅÄ®™ë§å/1t„++ì¾Ï J!:ÉhQÐÉu èð% × ºr8U–UþÜüä#´VÞOL„ë–¡A|Gx§…¾,ƒ¶ƒp]æ:'«ööè.Í2œz;ó–-òퟯæÞ@¸1'­âw @ç|[û“×·¾w W³³6!gâ¼bîöèö®Î¾õ¯öžÀ<¤W& zÇ%JôJÁø1ž•O£E-°Âñ®žë Sä#ÄÒ213ÕHŸàÐYô^OðL/‰ˆW ²ª¡¸»n#˜Ö ³¾ ˜ÔB£TpA°gÊ8'Рë™äÒÌÙ2€7"¡‹³Iâ**<ÌT¾¼ 7Ë÷FK©+Е @t† ¢šÄ¥BLÅ©DqTÐÎ`ÊdWPT§š ’­(а¨ä/~—Lm·ÊE9E‘ቩ l P|Q^Ïæ[ÝûÉQ›-JÍà;¯©bÉ[ÇØ¤õj³íÛæ\˜aLö#…qQßb½*˜$ŠL]tù#wí¤ÀNe;L¿ i|ñ°Úmiò¤Ë¦Õj¤&B€uqv“GUz3IxªyfKú£¦ô®„Ý̱‚‚`|¤Ða¦Šè(ˆÑA‰TeåÎ Lht})•”ŠÁüh?ˆAÊ1NœgÊt VëňeeßyÅíÃÆâg„[¢í‘rÈ™¯®HYñb«Py1­·ˆ³ AÌRÑã™â¢\o¡¾at”ŠÐ…Íèª3&ØÉ”ö†—Òõ*Ú&P_~àÌ^Ž);1bp'Œ€¦”/æLâè¤:ªlǾGjÙ Ñ#¦â'Ê© Œtb¢SW#"[¶œ”†5D‘:ã‡iTˆR^ñü\3&èÑ\!Ôåá¼àIÙWè4âô’ƒF×ÚŒ!N” fpÄüHüáQ®$SUÎÜXªÎþ~uÁö[»~Ðx¶ ÙˆT‚‘•[Í'޹ÝÔf×lÁ馶ÎažÂ ¬ÎœÔ\̉@1bçf“À¨.™ÔÅÍâCD™YÇ”ÉÈØg ³E°_bÆ×©6µPÉ÷Ìå>S×gª3¶u ­˜Që÷©‘x{'¥šé /ŸõÌ£†”tfÝÓíRê8q®êKFL¦½EõLy ã,ÍO‡ß¦NÇñ“F§ÁÔÓ—º©Ì3)e‰@]‡Ê2Ï`¶,-¹êSjcÜ5VÖ9làÀ½|ðyˆfVYFV 8yå¼â#…Zÿž)Í$†ÖL=BË5ÜóŠéR…ùÃíàJ ¸»—@c¸‡!_¨&v™h§„üªÂ8UÝîá…÷¶œæôZZ[OîG÷‰ g0U@( ͧðw_Öâñl˜Ê AåÄÞ»>of´çZ_½€.ZºÀŒVkyJ_¨ 쫾§†ÇMT—›YÝ\ؘ6HLÉ(ŽâG™¬… ÷½Rgƪyss"Å›;õ4¸„!“©1¯Œ¸oÙn•SpΤ±Õcf£,˜åË$‚P™Õ™òJ©$Rª×ĉ§}1ÝÂ(„=¼à\lи#øÇp³ëË#ÈxÙ^µ É„âñ;DHÍÁ0„…3çñ;B¨ Ÿ^T #up€â>§g¥Çf¡rc†ô!̉w ©OðA0½à0ÜZpu 74i™†<æ "Kž /Àc9-Õÿ^¸ø †¥ Ñ‚LܽfiÅæ3smZ®Ú–ï‚–ñèAÝkxahäâZKOÊO\¼X;8¹fcéd>3e!ØÄ1¢H‡ñw‡^#*¬Û9>×,Ž-¼2‹ÜTû£2Å@Ôð|•–PÝ·TKÀ˜Ò"ª·¢šÔGý½sØÏ6¶¡7îx:éäRB÷ÔEïº ©™Æ3P3f3Ñ‘o{iP·a4y0mFuóøm…ÈÌ4\8 Óh/_ñžB|k×5‚›ë©¾·°0…í„v}S„†}®4ÝIÏ.6NÈ‚ê÷@cê„«(z˜Ôkh 1ß—èC q)TðþZèkß™4ÇçE’ûcæEáˆRÊŒ©î×ÐõxVºn—_f4Ä g_D$%òpJmâê¿^½´M+ÑJã\¢áH8~âp´ùÕ ºäÜ^›ÛuÇ/Eô-,]¤—£Âcš@C÷ JW£W“Õ—yTÊn3¦ 8è¾狵 {t«bͭŘ:…ÔÆ6s› ÛŒ”¹9T¹Õ½Ü&ƒ¤v ¨>¬Ì1R˜7"‘u;¹Í­”ò…¥”›ù÷"óy3Ò6ÿéí¤ ÈùääL’-ÕC‡™w9µƒ´á<ßÖºAÂDª§Ó·wcv+‡ÏƒÓWñ;Lñ€Zò4œi܄֔roôÅÙ~ùf#ŒË'Ì*eô|g<7W&3çÞ4½•5üYÕꪘ1˜ kU'Ly@Ì]æG´)gæv1É'BV(oMlÎ…Ì>ù)#Ï*ø0Á5G{)CÍ• =ýd–ð5©­ ¤¯ nøDðØ@mý­¼j¨~ñAìcz…7æ‡×ñAã>á.€ðbqÖF‚…¢¿3B‚$ˆ…=&;lbá-A„Í%&B! áç-TDë g 1ÎæÚ0<É&3–Ms”0ÕþðÍÎÇè|Õ‹üòôY0ÓÚœçbgåJ¸L·ýÊÕ>™Šåðj1݃4.N¨R?¢’‹ 5Qå[¸T%Fü>|À‘ ’©ÝؤyÇ w=˜ZY`dˆ Ã,Ï¢ ]DîÀ£Þb®Y‚3Ѫ‘@%¬ e‚TT‚Ò&Ï™ºó€›‚ ?˜ P¶¸R„t“Nh4¡.\>Ñ€¨LÊw#Óœod˜ ÑMÌf³›q÷p2ûAŒ;&åI8`ô(å”Õ«uˆKÚÞ®LFé蘫+Xþí‡Ø|!š£A áG9ä=3ÑÓ†•|‹>Œ!‹ Ó&ÃÁØåß+D • •6ÇŸ õc»sªMœ—)½„ o3ZŸ1kOM5µ.GRÈMm|*È¡•×q7WHYž¸ ³JäغÏJw0;Gh"«ZžÎÀÚâwˆ±nL.+ÀÌq¤òš‰lß\˜†.àöx|~©WÈú&v}8MœØŠÅøâ%²ÓÀw0|Kˆa,© ¡ˆå ^íè%¡Ãi ÐDz'×MøMþê%q¯.[k° ,QÈŸyB¨@|f`ˆ$'eWÚW¯xì™°Y•’Y¢}˜nÛjG¢ÂÅØÅ¢i~€\·ÿÏ+ªÍXSl¶re¨¶2d»­óþ<€©$°†ù êáS¼$®¥Ñ8`ü=]¹¥ÛÒ†¹QÇâãMHVD˜N¹ NÄ-$s×È\Lá¨æZêÐÓš¾n°Òϲ@ðzpl ‘ØSÂÑ0ÉÍË~Ô<î)X7»íéÙ—u€?j)ŽãT ='w—JëçÓsÚ¢%ÆO£ŠlT®Õ4Á*w<¹8Sg*¯# •Ï”±É2iô…ïÁj߆–:Ô´™upÔ2 ´°Õl9w©Å)!Õ„²d34°Œ#¼>\þKÛbZ;©º"‹iìqÁ=áRÖED@u¬l3•C¦FÑ¡"bz&³ˆnç’lãëñ ‰7"3¼—™B¥•™ E_„ÐϦ”#¶(ôßÒí…ËoˆÐòòg«þ?qÕ†bBÈöÀY2Sù}I¯ÕÛðj×P’ƒ{ж–Ïüð{&!‚€#ä+bÿçÁ˜¹'rPWЇ5Zÿ½A<)ο¼ƒXs\>)ÞÌÝÅ'-q’*N“ˆEd ´£6Dz†ì,Ý´þXœ’3úI$y0\ÛiÍ)çÒ Pdl”3ˆ´fCÂø=|nF#â„P¼7lc¹Íø<Ø µPFæ”]•™« ®üɉGÛ¾ØWšz’çt¾`Š+–rB»©&½¥œú©~NÅÆóæU¢ÎÉcÂÞĪÁ»ÆÕY¸rò*® Äuuø<ØÎÆç) ÈB ËVö 󮢄ï`Y*|‡’‡7­‰dÆÚ{ûÌÐaÂÞÔ­‚\>!ì€à¦Í?co …¬¸Ê[ªØ‚R›ÄÀÀeôk?DI°ÂXæBì ÊxºÊNR£Iù彿MÆn2v“±R¨9Gå‹©¹K5ýߦ˜¦‘uD’ó’8 uº‹ûc^dŠ.GgŒ45®ÉL/œOøD >BÊb9ä¦l½[ßÑõê×'ÂÞ°ÝGDø’pSž)ëÜ> endobj 6253 0 obj << /Type /Page /Parent 2 0 R /Contents 6257 0 R /Resources 6259 0 R /Annots 6260 0 R /MediaBox [0 0 595 842] >> endobj 6259 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 6260 0 obj [ 6256 0 R ] endobj 6257 0 obj << /Length 6258 0 R /Filter /FlateDecode >> stream xœí]K¯ÛÆÞëWh]À2çArìk»@ è¢è¢pšAÔÍ¢¿”HêÞ;Ô7ä|:3¤$ÆH®#^ gÎ{Îó퟾ücÿ¯ß÷oŸ¾ügÿ­ÿùôeWê²èþÙÿ¼yùv‡þïûÚ•ûo¿î¾ï¿ï>ï>·ÿý¾ë¾ðåé/íßþ·×û?·ÿþ¼ÿÛßÛìéø ¿îjU·?9ýljÕþ­8ÿ<~þïÝ_ÿ°ÿí¸âðº~3¯ÿÿ)µö¸‰Wß ÇT§?¿ûm÷¶@Ü[ê¢rÎí•5v¯«÷ÿýçî§öÃòÅ¡±JÕ•­‹k^Të㛬Ó{¥›büÔÑéÌò*Áâ.Ó-~Ú¹8T”©TxuIä6µë¤R ÷yyùÅë¢Q )ç¸sq¨ ÈÅ« "·•kM mëð?/Ÿ¹6!çv;‡JÜÀê’È­‹úI¢çå,îÚ-'[ü´sq¨ ÈÅ«œ5ÊÔº´GD‘\ºV†·†‹éÿ¹hnàˆr¬ðpâÒ1œ+L•šŽ;‡Ê€p¼º 7»Â¹„È}±|‚ŵI§º§Bn`õÄÜìtÙ$ß/–O°¸Ihxu;O%¾«Krsi†;Mû¯<ˆž—O°x­"÷´sq¨ ÈÅ«§ææº š: Nêtö’klÂÅO;‡Ê€ðÑêŸcVÁ[é>~œï/¾ÿº{ûIÙ¢2ÕþëOíæNïì~|mRî߯…ÞýqÿCQ˜OÜýy×*][ìŸ|8=ùøµ=ÔuûA›±E·™²î_Y¼;½Ò¬éœmçÍh‡žOè‰Q§'îùW«îƒƒkŠÓqÏOTžàå W{ç½Xá_íö¨ÌÁh§ÚGÏË—§'æPÚÊÕ¯¶TÃÍÂ÷Ža!ÌÉ÷(üÀjÌI?žž”@‹XÀ0 Ù°6ó)/·dM<“äBá|ž€,§ ñÄAnÁ|$Š[ ®Ýù@ À¿ŠÆ€TÃŒ5"Q̲˜×ñ‹ñ»'J /š±LJyJ­ðJ¥}‡áa€Ö…˜V¬3îž´G[ X Ec¬d’¿%ýÉ>c³,Neø=XߨO;—Òc ‹%&bÌ—Þ­´åé!À5XꚈ?¢|4º!a‚ŸdBµÙ8_m&!9nުŪw Ó!óÂÝ[¿CO |RÀ›|òKOÜÄ“„XUEí£Õ~Ì€ˆÎR·Wïi h¤ø; D7|ÒßD.<±E<ñ”ð;ýí<î¤î îï ¯†÷¦°ó ~§—yQïÁøÁØÆ˜S ÆÞ„(C!ª„ßyOì ‹$‚KäSõÿä„oÔy0D…yó6Á æ}F‰ofð&|R@z™|’çt¶¹âtRBå%EÙXúBù‚%–Xb÷$u­,Ü !±)¸Á]3ô¶ü“à òs`5¬Ï°ŒÅ²<ÏaYŽeZ™Q¦Uîf%v8èY+mÆ‚î\Ý)a¥‡kîØx©«ÒsQt ¬ŠCU«W«õ—«¸è È2Ž¢€[Ã÷]-ï ¸ æûñþÆ<‚hÀßÏxª0âæû– Æ¡"ìŸ- q‹IÇ{ ¿“VH8 Bê:½ àÒwü0¡{[õD[\!mDrHJ¼Ç2²É‹i(¹ÖºÚÓkTZÇü,J>‹ *Ÿ‹‰¤Š@(‹Ù,û‰ã–óu“'Ð*¢IWTŠÐú¢xwk Ì.ovDäD$#<#Pš>$XŒÔÍ|ã8`kAºb䧬òZMv_ò8©óQ{Ë.ȤTWú Z* @X¯9ÅHÄ‹1߀¯Š‘)e¿Vål`Rö)IÆà}¾y€)AòÌW+à¤ÑåaÈ2Þ?þÞg÷ÏçÏ@>9s]eN2Y|²Pbp»R›¥Œ'ñ‰1šƒ¨öX¡(‰Ñ]•¶4_fÈå×¥§ m·=eZ½f€¡Cèlèµú'}ŒéÅ D¥(aJ ĽÒúZ0”°Û··à¢ØÝÂ` pþuÚ‚Gª¸ oÆTR­¦«iñÝ’J½ÄÉ^8M'ÉádIœâI$•Ñpú¾ûwò' àïàÔ> kx 7&Á&€…›LH‘…N®”²\©—8Á2@·ì;‹£&íñ&“€RlKa ¥0ŠydgØ¥g]‚NuÇç& B,¶J°MéEá]c OpÒ8ܵƫÁóJ_àyJœ†% †(N¶Äó¬?àw Ö`ø=ü“<X]“¹Váô`\4AÏÊ]ˆâ ªhq{)w $–|à.ñ.#-;7M—˜*0%áDè)Ý”åÜFWÓÖw®Ò«;³"×Q”ely…”ø GãÒÐä‰ÒÝÞÏÅÊ^£ëˆ'›>)¶;Õ!!sp£¡‰ÂþœwDãLÞ\kIÔ4Dìs_JÈ[ršHr±Ï:Ö\¢¥Ðj¨/ðÆ©%í`±˜ßrùÕóSÀ$ãÜBõkN„ˆ©‚¸³Ì_&«‹Ê_”H` `é‘RI´R¤ up;KÒXÊœ–J{šo±ö°ÃÃÂÕ¯ØèÍŽòP4æ5ßã*ï÷мù€`hOÊT²Í€e+²V­GÖÌšó‡d? #)·5He¾gâèGhÀ¬ ë< =XIÚÂfÃ-”æÞYÇÙ»ÎcJi+é»Ü cÙÚ -¹f¶Ô¶s”\ÃG›ß ›‘kË—o3@Á‚40Dƒ±Z™z/pAOH‚º/~¦Afºp i†n»„( X¹„j®ÉÛ%8Û%˜¹ó.U Ûˆvò—åYºÆvßbÖHû‚I{6¡>«jãÛT²4ˆµÑ?º/ïÍ%÷o²Ò“©ùcœíª"JübbC‹ûЄëúƵ²X[­Ô>i‘iaës eð᪪ôôåx–²µï)ϳop–Å^²ºG¢ÑEø²Òˆ ¢ YWG¶@†¬o–_-mæ£.Ÿ'·&[ày&‹ “6zöuH’f})³œ åŸ`ùÛ!Ó•ÙFei|0®™ia=µkÌ´D_,Tçëãïðãå²cmªeÉ»åâÞf´G ¨ÆxàwÆþ[±kÛ«æ¢ÍÕS\9T›ô½Z u· ÂßÌ…'=Å• Òæ¢¾ƒwÐÓÈ…ïô†UK=HGæÆ¥Õ:<¨j@ш®Ô¡ôh±¯š«ft³x¿k¼ƒžz.a¡€{ƒßÑð;t0…ཀྵäÆXo‹5g’Xq¥’«13²©"ö?ãhƒh×Ôm¥#+ÌŸ"ÜGLÀ%"ý(›C_v˜”ßQd6¬&î(ô'’Fãoïç3Í|+FXˆf döí&íÂ[yJ ±½h¯m&}‡Æ'*¥J eÃ\·7´¤rÖ#C ïô¸ÿÈjF¬§¼íWʃ£Šêry+FÂ)ŸL™K3©Î œ°õ?>Q„8YØ‘*š±À$Q2uT”0ÜÌÌà~í²ci"˜]V}â«,¦?ÑÜ ˆ"Ž»bRe‚ý¸Ô ³x†qª›Â4•'B>&Š‚m AÀÊT÷Á”º¦O }©ä[×¾‚“M¥ÁÒ¿®RžDÅ̪suç ¥q%A²ù–DvìlÜÔ7R¦†BÄ˸IæuQW•ù½U„´™DÑ– ?Q'½Ï ”|û´·gýɤêRò˾ˆ®¹ÐúÉ>3˜bfσOnê:F•õÓHe¢iËÄ|‚xZËàèK«ÝTïHÆ’µÎÿM&Ë1sÿ  ¾K{VMŒš‰>LøÞ«-¥Ê®=°dËŸ{\%øpqºu;­çàÅÌs¸]Џ›1l˜Ä|ed\#¥›ä3]éDø˜Òmð<20S¹”i(Î7ððdᦚP"¬¹MÂÖàBJ–3îÚi$êÝÀÓ®Wp3]³Ý³Ô­#À+L^>öt;6mÒÖºZû÷Ã¥Íe¦ydê‰D‚2&d*û]âö™«qêæHBe¾Œ?w.ã„Ź4u®Äªº‡d‚Ù£^æåó.1zbº™§õLÄ„ï3édo®²«‰Æ?¨Þ@DÌrÔ¼TÙä•/¥†jOEÝTøq›T‘jRE@`£ü“¿¼È•âq“·oó"/“ïǤ݉&Îd›…YÜ÷a¤PL=%ÖU¥4ÒôäÛÚØ×ô¹ÎÉ𸋮 ÀÝšV1¾.‡)ÌÛ4ù"µžÄP.aæ‹çœá]7j5° ¼‡i‰+˜WާÎo]~Џ«Ê ¸¥qXáÕ%§¾l”Î+ܘ'.&øNú¼ÕÈÏ<Ø2õj°õèU”3°Už«—ßZ—™i¤€ý=e9š¡ÅÌ;†» oR`[®½L‹K°­äŠê¬Ôa·ÂUÇ—‰ѹP¹Dá“Óµ|.;Uq»x9LÙ¡‡“Í^^ãunùìÌ…çÉ$BP{*Š0â„Q ¢™nXÜFÇIDó¨ÍŽâ|,Á»\JQ–•DÙüª ,"J$ܱ‚IØÅ,"x·ü¯\ôW ’¶ÐýÊ5«*ôHµÞR›®ço–=[vÀÍe´ÇP¯YzËÈy뙞àTÙLb(à‘Å~ש'yNW»+N—‹43ý Òo@>àøùºsœjê;¦R­Î]G3d8ÌØO3d -ßÝ¢ñSØ2çI{Ùâp„5‘+Òº‰™÷æ S¸ÇP„ñêÉ Qq[†.·øð$%ÙÁìcyÞZ ä}¥d[=Ï)çœDñf`~'öãAâñø,¦óƒh뛘‚‘®Ìµ¼Ä|’ÔÕOxK„+…Â1QEÅØoH«%†H-á8§*™¤‰ùø& )G7ë…æ©gXK¶ÓÿüxÅæ›–òM‹Ž2bê/™v TÄVv@0“´æŒ'‘±{ËšËÕ‘ýAºÏ¤l9mŒ¯7JuÖ¹IÝNÉKfó;TR]eyxÅYà+”"Œ­2¾Ýb•ŽªhçÍ€‘Ä<1”iÓ2…I.®ú-Í(”«¼„ö6[_ú÷ ̤I?G qŠhöççöÉV­°ÛqüŒ•8·Tf3õ ÂMŒ‹p»è û¦ê¨Þé(ÝÓ„ûÖ/{\ióbÂ$D#D;URt—6‰;ÛHÒ­¨2Gy²žê»;_¥ˆJÖ’Ç„Á»y yN4ø’ÈÔ+"ë>™Ej>uV¥ó¨ÓvRö Õõn¹€\Ÿÿ‡º`âgD¥ÄT“qŒ~-ä:2Rc2:RÉÜá¸à¯;W¼úà—Ý—€L#?[ðäg¦®TƒS¤Ï˜¼DÆL®Ìâ}è…/÷Bˆ0²©¨öß®˜Æ´v¿&ü%+¥šD@‹©ÏÕâ&"OSÔÝ¢Ý×_ZLãi@™×$b‰Äh›«Ó\ Kø;”»dñÁ+iÂ8qàn&=Zdþ £2~i¦Õ?>ú–0)HÊ´L3ÝI6³E4 N²b%iÑUryOö/Çd¹¯¢EyninpX¨w‡5w¸Ãp•®…ßѸ†¨ ÔDN' †«Â¼f߸:HX׉ñèm±xÕö::‘Túš©¹*j°ÂïÁ¹Sæáœ*{ sA˜#˜^(é i,+¶ªó[WÑO£j\fJt”Á5ÿDz¬ãe;AhÜm!Óä÷b°Ôâ“În<3ßÊðÝ‹¨‘ÎVDp÷Í—#¼ê¢M>©ù…¢¾ß=&ø§!–MÂp4ö d³’"‚²¿ÌY‹)µKm|õòÀ1N_ä ¹À,+Ý‚‚wL•Ÿ·…²-lu“a«”%å®òÔç[8žàŠó¼Á;ëzñ„¨Þ‡÷Ø ÕéÜs'ïy6iûgÿ½EKkŸ§~a†tw—PjZ¹X¨£ßkû>—DuŸú‚\ì²²ñGð©ÆOzϱ>ôZdD#—ôùô3er^ÚÛ§þ¤H‘á ”}ÞR7«ú£Øç¥åë ðÂ1^ ~§·iTÔÑ_4ìf îø÷vÇ¢1ì>Æ“&Lv€w÷ùË÷À½õ çábx÷÷SlåĽžGMå`HQ¤Ÿ^¸]¢,ç±N€3§ˆ0ŽÏeÑßÓ»Å/HÎÞ-n¯Û’,PF‚ ".@#”Fà‹ B2lÔ;èãßÛ˲%V*Ö…9ôužxì' _zòb;“fÃçýçÝÿ5࣠endstream endobj 6258 0 obj 4767 endobj 6262 0 obj [365 /XYZ 32.2500000 395.750000 0] endobj 6263 0 obj [365 /XYZ 31.5000000 396.500000 0] endobj 6264 0 obj [365 /XYZ 38.2500000 286.250000 0] endobj 6265 0 obj [365 /XYZ 38.2500000 286.250000 0] endobj 6261 0 obj << /Type /Page /Parent 2 0 R /Contents 6266 0 R /Resources 6268 0 R /Annots 6269 0 R /MediaBox [0 0 595 842] >> endobj 6268 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 6269 0 obj [ ] endobj 6266 0 obj << /Length 6267 0 R /Filter /FlateDecode >> stream xœí]KÜÆ¾ï¯˜sؾ€ €¥]È!€ 99vœÀˆ(>äÓí6ù5ÙßT7K+ŽÖ¢Ø]¬ª®wU¿ûã翟þùÛé݇Ïÿ9ýà~ÿðù¡8×eqýçtùõÝË?ÐÍÙý|ª›òôÃ/_O_>=|êþÿëÃõ…ÏþÜýô¿“>ý©û÷çÓ_ÿÖýáî/]þÂ/µª»ßÿýü{[«î§âöûåÏÿõð—ß~½¬Øoç€yýßß™ÒZõ ÆÄÖ_úÏTÏ¿~ûáׇwWÄíRMcŠ“²ÆžTkõé¿ÿxø©Û _¾87Ö(SëÒv?·•­‹²it÷smÜ?ìæµ¾ì^׿¤tÛÐáËßüù—Ðò omÂÅŸ!ÇŠ2• ¯žšàm[^‘¦u“‚&ýò hÒj­rÓrq¬ôÇ«Ÿ[«T}!ô=¢Ä!¨íOD9%øoÓ¸ÖZ›sÚçó&ŒGÜÀê‰OskÛ*%Á¿-Ÿ`ñ ¹éy2‚ãÕS¼.|-ëX»­ž‚$Ré†\)=¹áâç¦rÿÀŸÉ­›Ë¾mq1 Usá31­¡ mêd<õbuy²w‹§ÓHò4<X\’²¦êuj'wäômù‹'Ô=rq¬ô´Å«K·´ÍAu•C·ÕS ¿Ò í3äÒHéI —¤l÷?ç£uÿÊ#è¶| ì·m›nñgÈűÒÓv°ú§˜U0(×?Á¤¯ßyx÷QÙ¢ÃhuúòSÜóž×ß¾tH)Oß]"HçôåÇÓï‹B—8}ùùáéKzò]+Ó爵wmÏ•.{ÄðO”…O*¸|§x‚OáŸ|Œ‡­¨!Ô-zbâ{>ÄCP`*àï(¸¦©Ö¼ÏÈåó–™Ëßt„XÄ. ÷˜û0l_T“Zm¡zÌ›Œ»ê{8Á=€i‹+˜¸ŽXß?oiÏÖ\s1>‹5ç•Ïúâe싞87¶ÚUQ™si«¦.‡Ì×ÌÙØxUi¸ß`UøW­ûaH®ºD©þ{æ¼#‚L¯ =Ñâ PîãþÈ:áÇðK„O€S0®¯Š¯<ݨ×ïÀÕtWÃûøÀ?$Eˆ#ŽÉ/,0¨!l¦€§_CÄ P ?Ð<"ÚRO”¿1>Œð‹þRêŸÚW@ÊÌOPóÀ;Pl Ñå –pøÀÀ3l+R1`J|0±,‡ò? ±|a ¸’_çªV¯ ¢˜‘ŠsɾcD/$æøÌgë€z† ©GžRˆA0ʽcúoŸó6Qõ!9(#s1;óù@ó Lr¬w0«Î-`_a ñÆÉUak´¯ 1ÛBÄï`µFÙ›>!˜³lû¨E]•³åô‰¢ jõ½ÿf±É‚}ÀÉ|’â´ÉðDÛ’þ´,Âî, lJø¼Á'BmlFî³ufîsÑ­ƒûîëÄnµÙw„ï'©ÕôVQÆDf« ›™G°„:xd’ZÚ,Á#v i@©Jé*B'2zÔ†¤-–ËY¿ctõô¨J€@ÅÎ à<Îüp5\ „3Y8ÿ!0ùÚ[cËIxO µ ünC´jø…Éíáʦ]â@c~ÁØi3Ò¾òŒò¨oÀœaHÇ…3VÙ˜ÆÜq܃ó“ð»™&䀼ÃÔÂ'6b¯àœ@Ž};2É0W+ûÉÜÄåe#4è&>'ƒÏ`4Sı(^ŸÖý²™u—K’k@ÍéÒƒ>2VþêÚ6m?`ÓÍn»ˆë'øÀŒÑpŸÁ¦á“¾`jä{à>Õ Mñ—:jl5Œkˆ¾»n‚+ók5Ì÷à} `¨ö[Í@šb›9á9¶æ6^¶id/_ˆlFPÞ!ÌeÂá ÖU_²“rEÓ±²WãRÑÌøoJ8ÂT²j}ÝØà¦È-:Ñ´¼¬·©&ÞÀ™˜ìøŒ‘•@x¦,¹Õµ§Ì"’”E-1ë<ñàêÅ•&“\rCöÇŒ,R¥?8„ìbÊlek´DX!²ó ˆ°rÄÝ›hÐÚô}…‹µÍÞÉKzÕ¬ò}©»$lÄ`숨xb¦–¬m%F~&iȉóïî¢zD¾›?÷*Ù–˜‰ÀXïwÔseˆ"•·»W£c©BYѶï4vv®äNÅÙ”÷ì­_xÛʉâ'"T ê°É޳ÄÔ鿉ˆ‹2>UžÃÄE1‰rªq×Ý1ý÷iKz²õÔ´í±™Ágik ™ t”EM4Êåê=[¬ sX¯3¨)ÂõA¢î•i˜_šB)öå{5"¢¹öI¦Z?áyq¢Ó\cîI‘a!Q=Åyg1$ÍiOyQg~š²wç‹çô-51ŠŸ¾¥‚%‰|ò#T–(T€^¶½pyÌ f•"Ì´6,h‘·¢ÆZ`¢ áœãIWnfÕ7˜-0&Ûm½¾ Ó²SŒ¨FÙPÕ˜_zO«È^_››ˆR²±9á³—©R(E•@êà–êvºMõgfäÉŽO]ªŠê e,P^3§Ô‹Uí±Â L`@ƒErstLíÒ ™2Ó\È78I<®°¥¨*—%“H¼s¯õÈZù¡ŠLÈ7ïDû”Š­ö´ZD®y…S02ûák2Ø©0 –@„«ÚwñŽÔéc"œKf¦#Žî—Õ½™Ã˜«¬ÊFŒ6X\K2=+wh”þ¢²ÖW­ËöÚ-é»`‰Þs“†$â¹îtu†8n¦Á<G"ðNœgªªìººè‚¦Œlµ 5ë?m˜?æörYÿ[vH3Mt ‡póÑâw»»‘Ì‘šgC&I Ö²¼óL17}’SVOV§Zßž9$âê'¦dï*RrŒÊٔŻ`àÛib>&¤„ ß’¡p󡛯WxóÉÓ3øL<%P¤?AôBã€?/R-É « ±0͘¥M.Ê­aú5çˆö1;GxŒs›Í–,¹5Rƒèü À–ÿòkÛéZOâÉÇŠàl¦ ¿#,¤˜èóÎÛȼ»"‘xÚ›I·0’Ô>ÅIÙòj ¢8ÿbBåËg´RTŽ&Ô›í@o ¢ø¯RUï¤BvïdÊ^=î ¼mß=Êèd™YiòYSR(CË´“ZR}–¦pø <˜îæÊ1F™ÃÞ¨ËÌ踽9¹zO¿Ýâ¸Ô}N>InRdsRí˜ÌÕ®œ¤¾ÉÜÛök­Sá3òÄa¡<ëA”Çy9cï´ès¥Òƒµ;sÏ›&è8aìKKøN¡6ð „@Ã'øKÕ„ Cp= õÙ ¸RÛê1ì\¹´:›çSòò÷6j3Y?ZÕ=³äªçÛ»³0±š'Ôo@ÅÉȼÃP} ¿ ôÂÃ" #EäÊ/&ðtñ2èÂŒ¸ü4¬ˆûÞ°Èš\‡<ËXÚéS²­ò´X £Á#Ì-+µŠczŒ×"Òœ°ÔŒtáVé÷ÏPE›Pf0ÚE¤&`E·ØÉ^Êe±òbôÁ|ñ#›u †™/~&lÇs>íþÕ4þâ ÉÛF{6` àÜÎò©ñMÊ{eeÏÚçubZ03!Pö*É5žP‰ÚmJ./Vûžvø®«'IÊH,ÕåU*Õ7‡å£SÉ×°ÜKá“÷艪Ñ ß) δybL<.:öäC<¯¦ãñ†!pl2ÜÇ~ß)ãß1b>Y3ï(ˆQ'1£¾Çí“>àltùš‘Çn4’í§M.%W™²¿U[dL߯¦,‹´%p¹::–¿N^¶ 41]-L._´²› m. ‹8„ ¨ÆõFâ×¥j<¥¸\ü:m eyy›iYkÑ;»ƒá´e¼þ\#R·g yQ7í1õ¨‹ßJ5JÎo ,²¡Îˆƒ•õÕf¦ÖŠUÐFxŒóѨžVçŒÁÎX@+Ôé£5÷Û´¹–!Xf튙3±ù²¥©x²­pLjèŽjÆ„|¬•öëb*W îSÔ*•¹dBÖ ŸßÝsÜqî‘(È.¿!CvÕ-¾+íÄH?J–)0mýÀ±t)|HÃ4“ÊÅïRí8ý SíØpÚüÍ”(p€÷! p¦).|ÁEpŸ®ñ>6\¢Àp©Y4é'0¥§ð˜–’@°Çæa°Yî~‹)-ßÞ>àc¼–ß¶æI*cäñzâðÃr‚BˆéµÉu}lD„—ÑÜ&lG‰^ß„9’Ÿ@ ؾ›!%sö"45~ƃ6¦¤gÒûZ_Ñerdžr›™›àEï9£:a—6¥µ»/j˜-‘½u}£ÑfzÆŽw¬—ÏqGY\øÈÞ‚‡2ƒÊÓ"rRo¤œÛ_ú.Þîc:ŒßÁ¸çkîþg®ü‘Å^-X‘ÃÌ Î5ï™Ñ^¢Üx’±û¾¶Gõÿ‹ÕŽ$î.ËêJOc~ËBqû¼è.ê~¾v(RàÓÔ_˜a5cä1T¨Kå¤o]¬ Jæ+íêËòÊçºï#à§>q×Ðësåß ¬´+Ñ>fJoÁöÑ})J#aGÆú*ç«á:!ƒU6V²#Ÿ¡ðjðçVª¨O¯¿±-Ëp—Ÿ;ˆ{BcÜ=ų€ÆxÀ,ðYà ±gCÇÃ?€8·m„"úBnQÆ¿Â}ðjNÆ_Šãdjˆ³q ñ±ÃŸ‰uš ÇÒÇ—ÏØ»ÎT]˜³“Çó—»4?qšiJ+>=üZË&Ç endstream endobj 6267 0 obj 5549 endobj 6271 0 obj [366 /XYZ 38.2500000 116.750000 0] endobj 6272 0 obj [366 /XYZ 38.2500000 595.250000 0] endobj 6273 0 obj [366 /XYZ 38.2500000 595.250000 0] endobj 6274 0 obj [366 /XYZ 38.2500000 377 0] endobj 6275 0 obj [366 /XYZ 38.2500000 377 0] endobj 6276 0 obj [366 /XYZ 38.2500000 116.750000 0] endobj 6270 0 obj << /Type /Page /Parent 2 0 R /Contents 6277 0 R /Resources 6279 0 R /Annots 6280 0 R /MediaBox [0 0 595 842] >> endobj 6279 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R /F1700 1700 0 R >> /XObject << >> >> endobj 6280 0 obj [ ] endobj 6277 0 obj << /Length 6278 0 R /Filter /FlateDecode >> stream xœí]]¯ä¸q}¿¿¢Ÿl¯Hê ìÌ ‡‹ A‚µÀˆLü¿Ÿî+õª%ž.)µ¼°w=Ú–Èb±¾ëÔÏÿôÛœþóï§Ÿ?þö?§ß§¿üí¥:wM5þçtýë§ïÿÀöçéŸO]ßœ~ÿëË×Ó×—__~½üï×—ñ¿}ü—Ë?ýßÉžþùòß¿œþíß/øÇé_ºþ }éLwùû¿ý}èÌ埪÷¿_ÿü¿^þõN»¾ñö¹i1?þÿŸ\Ó¸¾½.cáÓ__nÛ4oýý÷¿½ü< î+©ºÎžLíê“j{úß?½üùòÛë«óPÓµuW=ò¡Ë'®_2——ØáBöËý½ý%óz“àåÃ0¤{ùÛÊÅ©b\kÂo?÷µ3®³M}=èë!7}o/ÿܹé?íËT™¼äÉöíõ ÎÄØ&Ý+§Êtà· Þfk*—ðp¿½>ý­3é8g\yªÃ ¼=ñm¶Î݈Ö%9—ðLš*áËßV.N•Ûã·KÞæ¶½‰»:nþîõ ^ÞW}º—¿­\œ*·Ã½ýט·à¥Œìǯ~øòòóçËz.ËjO_þ|YÜÛ7Ç¿}¹¥9ýtµ). øòÇÓ?^–äþpúò——áÜÚæ¶Äñ‰ý€ž¸=©>Ã'ü|RÕoO>}¹55Eúª™¾jj´üÄ5pŠø‰ƒg‚©hzø¿C¬:°L·Añ„mýÈ cúbþý&øÖUŸâoÞO9V‹— áŠÚ\±f?xX&uñ+ÀßÁÎ@}T<÷µöྒ¸Ò Â6Ïve_on_}-a=ƒ–mBlab^Ä|…e ¾X?âà[GÜû’mv-9ðŠëú œ‰¦54ݡѶ¡ÑLÓž£Z`|ËÀ¡ï€… éð‹‰‚€_Œw )Š%E`ÕE©ÒYm„¹ s|EXsLÒ‚ ŽUŒñXóHb¬dW«dGͶ+¿³®Õæ-› Ÿ°¬BĪk,“D¹œ’˘:ø7Ð/ަĞÎGàö§kµÑüúÙv¼~ÃûõEˆ©Î͸œoË|EO&½9Ûv|ô„uüoßÐoª‘PÆÇ,èwosð;#ƒug7KwALLy:ãÁ·ggÆSôÞ˜s3¸nå ðNñ Z¸S 3Ä?ÁÔ1ZuÎÝr„õMëw3BáÔõ§‰PÎöæqïeMa¦5ëõÓÂ<{Dny”÷ræx%³ÄûìD+dk)¨ï¬ß` ½ŽS嘅ֳC€ ïF)Qž€Ií`ÅfÕÀu‚§Q»xÖ™Ôñò˜Išæ\yRyÒ%÷Þ6Ir{{´†»ðQ2E"ø71¨Ë(r±ˆJfëö㻂ùÌÿNB…Ôãi¤C`sÅ[X°á"±>Q$Ø6P:…׈ëÉÌÍ2~´bX¢SÝ—½|1ÿeaªá0ë@Æ”Fì ßE¼ Ñ N¦°1 dU‡O®Éõ‹£ùÌHÃÒÛ0ØîSHÚÐ žN20Æhô‘yYŠ%Þ‹q­LÉ>•XŠN%´,L5Ô¾i‘[ŽN¡™(cÀAR%³5–bdfÔnëKùP„¯°¡ X£u(‡œÑa}jáq‹“5õ296äH.v‡Þ£ÜN.qÚ•€ÇBÈç€ý„y?YOjüáy‘¬ïDô#áÈRà;L+þ–ò¼TLFbÆPxEJßÝ,Cç‡ñ& Ky”ë&”ÃHŽì|w4d&Tšme|{ûÞLít1â¸8ý]€µûd؆Ø!¦_Z–H 0¿Á²¯š‰Ë2é,†…DÝDaÅÄÜR|rØÆ`½Lò2Â"'X&ÕðYOk–k/§¾ëÜ2Õ N¶"$¤uS’(àÖâƒhAÐì4%@£nѽIxqìüæàj.YF«¢ÑûRDÊÊHà3¿:.êÁ¿aÄñÞ¼øúuÚiëð'føÀ‡³“Ùˆ"«£(ã†-ü •ž©´æcØ µdWõ¾–|úèx\Üêˆa¿*ù@uuÃVkõ‘°æ1öܱ€^_•ˆ¯M¿QÑøáºÞV%1?1<|é•ÂåIäjÚêQ[·ÞÅ;ªG·W=êzãb~í¢kO§TMMç7äÎBJB3:‚Éñ•ÿ9‹Œ ¾æå•~í¤BÄö tø&.Ô/·­ÁŽ$_åÉ&WHýÐø6›(f|@à1ÍߨS âTEÊ>.wö‹Cáeøq*ŠÏØ…š*@GBõϘöƒô \NQ † Ö WÉKœºl/p©®?,GrÕÌe$BmŽ©)Á\ÏԧϵØÄ“¥ø¦íѨZ"Y–-Ág¹‡•º¼€º†÷'b¥„7¥21VSÛ”¢ÚtÕ±6•ð"bBÔÞel†œ°Au3“þ²½ÇØ"cl(È-ø|S7LJT#1eŒRŽ1ó™Oƒž0o 3È´Ã9ÉèœdGõ’á|¥ž#Ùù‡Âe "Š| *%8ƒ5žÚ¤j'$:¡bš pcúF(GQ3V?!"táyauC„Ê9Jͽ23ZþÛçLnJH@¿PÑm xì‹QŒ(ËÖŸR«µ[(°î’l Fön²êB¸D6„ªUÝ!›?”…EÝTÕ÷z]% †ðôEåT?œˆïI`Jȉ-gat^¼uÌÝÉæ¶¾•b²Ñµ:J­æ¢-KøB2磔Ù@iÁQ&•L– øÀA Pö†æ·¯ÌÈ:Oû-QÆ=îÁ`<|ge½gÙ›)QŸS4#¶Û@‘B®m—©­cYß^4ó£=c|‡ˆŠô6V×kõXû(ë}LkÕåê´%Ýó `Ë!7&ì@a¤’õ%;œBÍYܦ™¿° ó3_¨Œk<-œ­œŽÃ’½‰]¦œŸ°K\i¥Ÿ·éF 0q×T¶FݘRD&“«ï³Üb‡”á_kz_¿1V¤,øVÄà/"{I¤-犖 ‚`}óÈÍ` ĉœ†ˆ¹ZA¯lyÁy_XD—̈ùë’˜11 铨…b*Џ‚)¥²i}±|d¿‰ì÷&J Õ G#ª\‰þÙÉ”ìhËÂÁYYK•)j© üø¼þô™¸¾6B{óýŒQ¾¿,>TÑ‘ëE±—o0Îו{o`çcd;šLÉÁLC´Rã¶ N]béŒ Ì L|"Ÿ`3Æ$cz—™~¼ “1ƒ©%¥è—Äp$é#X]!ØwšÃÇ´ KŒwP›.ÆT&Ï\a"–b¬&FÑÉv.«–qSè뤢Üy²œš#¾œ¼Èw²2Âç™uÕ~"¸t“]ë¦^©Îñ;Æžg„L\éš ˆ¸1+—+.Cœ…c ”b¶ÂÎ&n‘˜É£FŸ`Ê1Ýà©Dfd“»I ìµþgßc$,ö ‹®é›IålÎÕຕW‘©³ì+Þ:¯Wˆ4öýŸ|pŠ6®ÌÞ¡“¸i5`¤2Þ_º—t8^¿ÄO2ÅŽøÒŠ–?Ä„÷DiÏÏÍ^ÁðDµUû(yÞf™o ÌË8æåEßÀ]~ï>)‚ßÌ“UJ9jìX®R“¢AÑúU"‰,œ~ÛRJ:Àˆ„Û/ŒX* ú_ŒñŸºÏùJpSù ü6`¨-äF­dc>qrM¶5K+!W¾ O”ìªîi,€ò%þ3èÝ(LÆéÍ ±˜ðÆÚ¶÷®ì‰âݵEŒw`2ÀJEOÂÎü,ò Š˜W8T)ÍG$åI#)™3 Uì•ûûˆù¥e}o–$¿8Þ@ž'U‰HꈇÜ“pófv3 ?È‚ð$i¦p+-vƒF릛©ÉYE+ÙT*¸¦@T#Ê Eá¶Õ$ÍÒªb‘¶}äb…ÄË…Ä ‡Ø¾¡—iìy&Ñ1Ùe­ÑbÑ1Z¦ï” ¢J¤¬eûßd™‰):– Èv*‹7߀dô0ƒ?®L‰@íÇUׄÅO]|ÈLë,ÈLÙ­] ž¶ÚF °_¢¨I KîùÆ)¬ÿ­lë™V¦ƒ¾üt\ Û]Z l%µ/ý,Ã0 ú¦|æ{”Ùa26ÙAµ ,H¤²¿m#Ш «ª1ÚtÏ©Ž(}ÎÎ]‰m'p¥ 1+D˜ú‡ d¦’ŠÁÊöÈjeTT ¤MÒÖc5Ÿâº0Ì!·”0hð °„©+XB9ø\QÝzÌÞVsGyÝ{bà“>IŽ2áfâQ­çNqZä%Xè2¿4*ª¦ÕÂ|G¸ÐNBˆ1˜ÞÂå.|´=eóq¾dØI°³¼ˆbbôý@I¬ìدÄåý?æàó÷E0ãQ¦¢¡«w)•ÁjµÉEîÑú!ö”“¹Dü¤ø“}íû›ŒÜãë€qÔ=Ñó'šwžVRþ“pÊ»ËwÐTèªóo“û|]  vHîMifæÀ׫°î«ÚŠÉXâº#Ϫ.­3ÄJŸ¿ Ìa£ŽIÊ1Î=Sýã-Ao4똿ëµ<.>òž¡ãÙrÞóAÎdœL‰Hªt‰˜m d¹:_'*¥`÷³Êm|8¹¥jE‡Æ$ÂíÌÃD K66[ZŤБʦ6᪈Úhx<î=aš‚„[ùyRäÉ~¦Yg¢#¬Ÿ©“½€^¶É,&ºc&î(U[';¸aIï(Äâ̰|ͲM˜ß&"H„^Ù¦×÷<åª:˜ ŒE˺“²6°±žÔ:¼L!{ ±­Õ½/Û¤…õ%[ˆ'’vUÀKOóJwbºd ý&)kf¢l5Œ²= jϾ®}íI y205²‘©€FÿÏ—ç_ÿ[ ¯LV§ì]Âj•À2õŒLá-’Åè¹qÌ6p­*SýËp±èX„ü­óIr•)ƒÂ®mý°ðÓB{ny. 0Šh¶ü 3ª0¿³ºÍT¥lNDl™€ÑÏ–\`èG!ó‰JâùÖÓB‹SwC«;2 G 2wkQàzh}·ðU€–¢ü„9€áõÁ‹ä €ûÓÕL»7¡jä¯îÆ_æó c g¶˜;O¦ 4g;«ÁªãƒW0ÕAßùÍd ›ú ú¶ƒžL|u•®~U5¦ÁÈ=ÝÙÍŽj@¿™¸çÎwÞ»\æt³pm“ ¸·j¸Só)þ;·Êò;okГº…oçýîg¤h{vo2duðNñiÃ3Å+Àò‡ç¯€Ø)æÀùTJþØ`n°ðf¼æQ®½,:xD$„ Û0ùy¼ü1÷u}yXêÆ Y~¶/bÜ eµ¤Å³ÉÇŸzÖ;3h½¥­rTv“:6µ¯)vRÞ’­Ôºà>#½(«Õ¨4LÕ9Q*P ½ÛË 5&µ‹¯†,ÈÊŸ¤žŽ|h<íYt-ÃË"ïkvƒ°-žÝ¤;zT¥|ðm¸©¶pë”­F=<¦$C¾S¹æuEœj ƒ©Í¸Z††Ht(}™LÝx¾i›æÎÛ@ë/«ý¼ú4·iélË+*O•Ržè§õ4gôÑpéEKSÕf,?}†Õì” bl¯ô>®ó­£Ã;Ú­wT²„W0·TÒö §ÙD»ð©æT¢? €ºAÑa;ÌøaœEQmcNiuú`ÄÁ "|¦ÈCËǵ¾ŽH½3¥"º‚ˆ¹ÊO.sºw>É6Šé˜¾.3}=F3r—î.{ê"xRë])Æ.ÃTzȉ”-”ßrǪÒ6f&˜Dæm±:íÀÁÚYOªO%½wFžà!…Kï=ùŸ´pðmÌ~œƒOêÔj¶©{ïD6Ú¿3p´§ RøÄï=~:p´J©›gV‘"(Ä ›Å @Êò$ë|]hßeÀß»S<,k$­f»Õ :#d¶p,/ÂáŽH&éŽã¾GóNÂçƒ>Êœž!¤ Ι¸ÆÌÜ ¦¼FdR‘VS_rp …Ú!û^æ=Dî ôCJomÒ‘=гÓ4ÛœÙz˜ŒiR‡´ÎW"»@/ LB n‹)öaæŒlÐøJ©tM›0šdƒÇ@n_+b˃X& [_ÿȂܥmVžäù”be'ÃOH½¦YÖB Èâ®SC™ž„#“ÇÌìÅ.ž¡SŽêè<*0 G²Sd«ô(g½©ÀdlæWGÔA”›¯NÖudLb4ƒ,šO¾Šf‘È‹hç@@WÈVƒÉÖ³&¾Ì”F‘¬ZÆ^‰Æúªi/¡\‘$;å6m-!3G+qû…°ã«åˆbíöÀL"À‹Õù’ý’ˆ  8•Øì0Gµz_DRÙs)IX'i­ßX=³N)îÔ¿aD*Õª$Ù¨üý„šÇK/çÔµâÞ¢ «L߸0ü3ŸöP—Ù÷Q%[<%÷@ˆHä7Ô‡ YÝëó:ÑeU"3H4¢(ÂÔ$¸t¾hF¢å:'|{*h©å¬$ãú0Ýh^¦…’©GT+ïo’¼\ ›R¡ÕA™¦² \®O“¡B˜œ¡`lµÙËÌÆ&N]¦À• ½+Mܶ%[.·¯{+“l,¯^/`8ú嵉¯3Õ-ñöNÊØec}ÝU0&eÿ‰6`=ŸSAÍ7åh\ ž¬#’¸I‡ñç#¤“Ña$üN-6o4èÞ&PÚëàL©{ùÏðÉ'øGþq¿FO\߆óðIà;)ßx£Vî¬ÇÂ=8˜% œ<áÀÙ‹åBVP¤«O? àð.=ÑÙÝð^¶ó OuÐ[ϵšðÙn¾û…x?– ¤u »‰ï:Î{!ã¬3‡Œû‘"Íò ΎɧcŽƒr1 e!gÞŸßnœÑW²,Þ)>SM™ßp_éÖö·ºø24¬koöŒ…xÿÌ“ÿỎµØ¡•¥µ²FÍÑ ¾ü–1RâË€Ö(™/—N+J5w¥ð]YeþØžø„7iiáU«ž°5Ê'Œ}•MK8Óª9“¢O Û‡ž(_O4ƒ2_>žÀ7Cõ„»þ8áT'|ØâÛ–±IïæBQcãÞËÓÇà@\ûky-3ÛJ@upL‹Iþšé‡æþ–fÂÓš»e ›(®Ši‘€õËßS±8¹.iÓóàiÉ •$›Z±¡R[œ°œd0ˆðÛ™'  Δ9¯U€ž)«d¨´¾ùA??7S°ùXƒzOZ”À¶ržJ¥‚Ø” ¶]ï¾7D&-å^`»zbœüüèJ²o+°wWа?™á. éˆ‚ÓtïnÌçÆë2[Ì'Óš³Í¢©ã3êÞoô7ò¯±ó³³ðmáHƒ)y5<4‡é6´ggì]CéÞN?À·Uè ¦ÁwšÕo›bÓÝÙ͘¯­E+<4Àk³Uj“cŠt·ÆüHÜ{`²8ÞØª~ºA6þ.3äU+:²Md®Ä}¹ÌÌ•:“Ú9¦=í^”¤ VW­¯èD½¯ÌarÊݲünúÑŠ'EÝeb"„ŒP†_•Mü<–ýŸä%#=Òâ¡” @ÌQ¥ÏX30 &õ’8Ïò#ÀQ)ŒOëM¯ôeƒñT “¯Í?â¢dÕô„¾+—Fe_d+*UX@opFó™o.; Û€ÌwxëP!ÒçV¸,G”FQ/W{'“ÿjªU¶1o‹(÷À°ç‘âÒ'IËÅž( S‹0 1(Ld4ùaèÄ8—X¥5Ò#A)÷G¶*1:ˆ’rˆm|íÉTÂ?R.4»Ò„òŒeªT„D•½ˆ¦(+„èB!>³ˆ’ÄüüU›Â ÙJðìI–Cm Û‘©Û'#€2£0Æú%.ÀŽr2<Á¤‰.4Ù*¥¤¡B§¾aFÔ#w›úl7¨ÑfTì$äºF¿©_§'“¼Š]·”Ÿ¹‹ÖøêtSÙl^FD”´”#Y‰!0T —60²½È¢£+ÄÛâ8"AM¼Yw¢âõD—Šž®’av 0rÄt—ÓØâl-ì'aαaìξ·þ_Õ3ѽC.:Ým0Ø+†Qî® ŽàÔ1\„Ñ©!¬-%D¬-6…Ar êTL¯1Æ|€)áNñù`¤u°ú—¿N_/×&x«~]úV(¿þÞ•s‰U™«©r²7êÊ@Ûl¤vwGfŽô±7ÿeÆ#íüɼmÏí¬yÉ@9ûŠ¾ã–„ç½µ}žvŠR]XàÖ¾ÖÃJ¡opb´{¯ïà“mÃà·ÁßLêÏDmý;|v–á®ÿ|Yñí 1í …YÀb:`x…,ð ±g€B½Çó?€+™Œ³;'8_È-®1À¯ð;ømNÆ;Ź1¼jH)-ðÝ…Ä×o6^ì¤{°myïrùü0-ö¡;ÕUî<Éãu—Ë6ðÉ/ßk¦%­túõåÿ`éh endstream endobj 6278 0 obj 8094 endobj 6282 0 obj [367 /XYZ 38.2500000 626 0] endobj 6283 0 obj [367 /XYZ 38.2500000 527.750000 0] endobj 6284 0 obj [367 /XYZ 38.2500000 484.250000 0] endobj 6285 0 obj [367 /XYZ 38.2500000 626 0] endobj 6286 0 obj [367 /XYZ 38.2500000 527.750000 0] endobj 6287 0 obj [367 /XYZ 38.2500000 484.250000 0] endobj 6288 0 obj [367 /XYZ 31.5000000 296 0] endobj 6289 0 obj [367 /XYZ 32.2500000 295.250000 0] endobj 6290 0 obj [367 /XYZ 38.2500000 247.250000 0] endobj 6291 0 obj [367 /XYZ 38.2500000 247.250000 0] endobj 6281 0 obj << /Type /Page /Parent 2 0 R /Contents 6292 0 R /Resources 6294 0 R /Annots 6295 0 R /MediaBox [0 0 595 842] >> endobj 6294 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 6295 0 obj [ ] endobj 6292 0 obj << /Length 6293 0 R /Filter /FlateDecode >> stream xœí]MÜ:vÝ÷¯¨u€WO¤¨/ Àí¶dÀx²²ÞÌ$dqf‘¿Ÿê.©ÝMÕa‰§)J]6æÙÓ²(òò’÷ûÜ_ÿé·ÿ8üçß¿~þí¿~þí¡:vMuþuxþýËÛØþ8þýÐõÍá÷¿>ü8üxøöðíôßç~ûü/§¿ýßÁþùô¿¿þíßO?üãøžÿÁ_:Óþüï—?‡ÎœþV½þùüóÿzø×8üíyÄésãdÞÿÿ_ꦭ›îyW>ýãaZ¦yùý÷ßÿöðë™q_éŒíŒ;WŸþ38{øß?=üùôiøê88cºÖuÕ-êìó—Úv8;œFrÕìC/¿EÃ'¼¯útƒ¿Ì\NS·&<ºrs‡¦ tâ'=‰~¯¼®Ú6Ýæ¾Ì\N•isñèÂÍ­[;q]' ÿÏá ÞµUºÁ_f.§Ê¸¹Ñ•›Û×&åæþ>ÁàC›ðZx™y²ÍÅ£ûvüÿN~»?}ØU=IÓ’J{g­;oÍé‡ò½ù9z‚w'iŸpð癫‰22üØ»útÚÆ=ïòó7}oOïêñ×m«ªk{&™­†D{>ÅŽ4.áv¿Ì\N•i¿ñèʣܚñ–­OIO¢×áSÐH¹¹/3—SeÚÜÙèßbFÁS9ÿ—?/>~øõëI€œì‰öðýϧɽ|óüÇ÷QšÃ/ÏåiÆßÿxøÇª2î‡ïyŽ­m¦)^{R ðÇøÑê=±_áh-œÛgâ œ5~¯§Áë±ñ£Ù >éÑG<© >¨ÏtûòýÄöÉ9Öu7p,Ååp·*#å1ÈËYC®À£áS[}‚O0uà‡WŠg€Ï\Å£á#NzÝ·Ã;øîÄ3€4°øFÁ·7^¼Ó+ÅûƒWŠï'8|sÕCÆûédòñwMý”q¦}#ÿ*úäI³{þdïf‡©k›*ølÙû¡zÿ¤j^žÔÇÆµ}÷îÉ™]zÿ»£«Ï!ŸƒßüÓ}oܦK3±ð ü°=?1fšþ‚uÇ êIÄÒ¤Æ œ òu9í$3LêóMul;óŽÔµñ'ËL rLÕÅO6°À//OšãÉ®0KŸà¹áwðÜfç ’ËàeÀw˜½Åßõà(¾£ˆOle€:‡åÌÖ¦žf»dRÎÜ•Ëï#L¥.„R­©ZO¬x8²m%ÎGà¼yXäâõ,çõÀÁÔÞcxøÆfæ¶%‘äj¸@†»àw¨«¡qÂJ™ô„UOè;õdÕãK žPè“Ïf³Ãˆß­‰C‚œV}‚ß ÜÅRþÞ€j—P>'O½—yÎXn¦TRŠaކw’yŠçšõŒÙwÜ—ëŒÌð5æ?æÖPpᇠ^˜¹ð>iu¤õÞ5--ƒS«®’kòø°,ÌFŒ!ȨÀw *c#Ó ჭտÔb$'¾&ri ÷cºÍ9¼tüa¾dnL”ÀǸ3éxnU;lð;ŒD¾»Ë –qL¡Ó/÷¹S³'l¢$JcB‰Ú¶Æ×Ì2¥1ªá(Qá?¸¿î š~R}ŸA^Þ1 ¢ÈXǘ†qaûwkÃѰüt–P;—3ãׯ“-@¤+¤ÊúÙw° w–[@DctòåÁXÊÃGIi×.vdPwD.=Ú3Ì!¦ PÌžÙR¬7MæSü†0)jùÉ;^s©{ÞèÙ]i]”õ­M/¸g§D¥é1VaC0—¼8Ë+Â*–J¤=ŒÖ 96Ÿ0? ”-´¥9²°^%_ ˜†M)>Ä´±À˜6ƒF¸Ô ¼ÛÌJ}þÃ" 2"®Kÿ»KéÊÜIÏHw¿gFÖ™üÁJ4q¢äú“ÀEÊbx=·8O™Šée•›¹"ˆ«•ª5eË¥iÝLÔsD$3îhÍâj—*g%:±]6ÌËT5†"¡32¡«$úQZˆ(cŒOG >¶M87 \˜[^0µ”Ŷ¾»*`ýl²-¢Ä‚qî•.õîM®Æº¾ºTSD&¡¼ÛGH9f›Ia Ü ù'­&õy#B ¨t™ ˜ë_€[~m"I„jÁœa1‰?œ¦½MÉ6ÖxeA ú Ï´&P¸÷†>[v}:WçCáYCeÙBd諉C9‡<6ž•Á‹+òáùÖ§ÃvW¨)é â^3îøçù æƒ1èéð¿ž:*ˆz|æp' |æ0‡`®ÂwÞ9( jÌUeÜÄ®–5ì ¨«ajäB…Æ$µoIRÚïX ÁíIŒµðáð &ýòÎÌH*¹r'ň”E;›;—Û@΢4s#"¿f%Ec_Þ1¹S’bìÕ Ô#z§éÅéº(»¨§RàggP‹ÈHd(¯ß#.6—b+•š¤Xé­'¼öq¡ÂÂ_Ð qa3Û«A³ÜÁ:ï½­žÁ4ø¡¹DGÄ“ÊÆһ쌙:ÙÞUïKâí®zo\ H}Ñ­ß#JjulJ²`0(ŒLÍW„<Õf©š6~‡ë­\Û©uC¹FoÑàð œ}®jP¤FÝZRF€E¥W…x‹CQ$VMR é‹g=K–ûûƒ.]±v¼a›é†5_'áë¯üÉ\x2®¨9ÚY‚€“¾3 wÆì㦅ŸO>ÁÑðJÏÜÓëYÞ´y=îCýžKñh>ùGƒ+ ŒV¡Ñ˜ïŒ'è݉ï@êVÚÀï´pÖxn˜n&µ3™çÃk’-´Ï<*™?W¹q…§ŒÓ/Ø#Æ Uo²v€y}#ê˜À êŸÖ÷+®ô‡£Q¯wr-l¬2£áþ*ñ²!)ÀÈñ‡crš–ƒÏš)‹kÓŒ\fîc¹âÙµã¨U„o”éʇÀݢ¬> ÅNRe¡ŒŽ¾%è+ê¦J3•4C§öDabÀ¯»‚|‡a,ÿS›IW†¥¥m!¤b5›¡Ía|8øŽ}ª4Eí‘Æ].©É¦s–_ñãYóZ]pHÑÖû䞇€…ÃØ$Lƒ”´1J1â4á±8ƒˆ¢Ñ"*)0:µÕ]óÅìʼÂe1gbm¤UqF˜jˆ\]¦jÓò _]ݲ) L_OFm"bO”#¬È¶É­ñ*¦ûÌI%ˆƒRM‰ŽåàiËž‘´RçbÉæÅ=L³¦ œ(^uз·~ÇMÎ6“´q#æÊR×ÞCù+MÕ ¾ô’ÜŒÖ/µZ®v¦ZrÝ$´.IÑ…½‘{^‚|A1d X× n³ŸØÒ;Q+ÀmVðW¶¼‹™²ÂØ#³ý‚ì@õ› Ÿ\*Zëó~®¼µ /´‰Š;h˜gÝÑ‹ ©ûLÜQ2ÂgÊÄ€×WÎî=xS;Z÷”«È^!Xëñ¥Oò5ÛþêÄéÝ®µ¸(x¦»d‘ìL'A&o]šÖ“òg¯†™¶ZÒ-¡Æ‰á· SY+-õºAŒ&-E˜É·LŒµ—üà‰X)„pà¢Áy9Œš³<¨Am)áõ’d¶0Ç•¢9wÄ©*˜S´J4#*fR’p53“eT±¦ÊdŠEÜצ”4ƒ³÷…c¦6Þø´Í= D $pE»‡ŏ‰Þï]0¹v_ã.d²Õ?0ðÍjv^ÆŒJË¥Œ$,wªR\ÿŠÉS²¢½2Ã¥íhímÄú¹ÀF¨’Óq1 ›)½2m H6×r._˜$НõÑK ) <>-i¹wHìBÔ®xµ,RI9;>,„t`º1ù_(!e¡Cm=ÁZ`±“§ Éó L­@y ‘Ù€k;Ê—œêÀ»’$2™à·ø#=a“¡+±+q›q‘ýys’Ö@œšgºkkÒð•¥bNQíà~Ìž¦Dy\=Œ¹¥ú¥"[‘Q›Ä‡Þ§WWíõ#¶– œ‚"ü”SWk3Jõ¬qf°E‘9?¶6¦Ás¤ L¹ ™ºüå•ôbŒ—ÕÓP³%ƒmÒ&X-5*W>/Ãf’ø€>cïå7å Å„b¬›+Œý§…Àʽ¦ ée k®…¤ã?g÷Ò†ôaT!­Ä‹Èr#’µÎþÝ'gseIôNšqc:_ä¥ m¬[;3"ܤ—¸Û(“ “Kc/•0©„sUãýÔ"L©×Úf‰Úf&bR"É<BVJüÔùn™¢L¾Œ³„Nq•¤mF]ùÉ%µOœ•k¢ïŽœ‹¿.5‘›×›Þ}×į+¢åTT׋ñ¥·“r©É§Z»/g u•Ȥz-¤¨ MY:94žÌV<ço«Øô“zµ0cã jV¹ äÄŸrU|0ùç-™$E¯åÀ®Gå‚×Å”3¸ÌZ,'µ9ªkõ2)×vJéìu½¿½Ð˵ƽ6“Z,l±>Ž¿Ñó-¢ ‘è5ØLÙ[”$(°°­KñîR¼­õÇzÉLj`Áú©!*$íÀ«>Zׇ8n Òª—lwçs§4¢ S €5½G^bàQÎJ‰E­@1uùAÔ¤­fŒóÍ2â8P‹czfÍ’ÿ¢$©3Û”h +ª «Oñ´ ÜÌ[ €¶ô\Ð !qçÌðCÔND&Z`øh8…”žÖ¶÷ïiâ0X„â´±—Ƭí”ÂÆIŒõ xĸ ¶e?Ç€ÛÖ¼_Ãp<ÇæJÇ¥'_à“>þÉx\xR7p´Çø'ïÃ'=±xW1ÇA.Åë ð<悳ñJñÜ0E3€ßižˆÝn‰]€»=Æf/=Á3Å%¯ŸŒÎô+œÇ®~ÅCƒ;¤£Â•èl7Øé``ÏK¦.0Œï+ ód±òt³ÙDËѬö!ÓÓô”$"(舕"ôQ¦ç5ã¾^ðF•;5ð¦ôØ=ˆM ý0ï2u×Z4þ,e\)£³Uë ¾Ô©üx±ÚÖéÒü|j ¶“ÖQ´¾'QZ-GUà2߉p‘HýGŒŒ²?³—7ÈSøœ(SyH\â‹BRFÃdHG4óMìžæÓa’¢ÂYOÐÅnÕKéJÖ”§R)ã¢ÝØvÔ [>ìÞ£Ö›êœÃhæ7\%dz/^oÌUjÏÚ®0@YZP1 UÊŒ§ºõ¶h=U-ÂvÏ•RGt2`îR,¥ t/}—j&Sš‹=þp“%¥%;ɇ`ß  ¹Ú:ß’íƒb’¹®ÊÑ” ¿«Ú“op„ÔVÐÆkA?®W ÂûS[ÖÃ(]Ùâ”Åj¯Y2úÖ½?)÷̬\”ï§r„œ™ Ce¯Ráãdfi³Ÿî9N#Y³g»×µ®Ÿã4¼‚a ¸\Ћbܳ-¡Ð}<µiÿÁ¿bëûれ«…¿¤ùdÃç rå: » ´$̓ò…#•¿‘Ë C°Bч›L¢d âpQ,‘ó¬è7š« ¸€ü;iö íÀïPP;{wm”ïáO‹‡a}õžt›˜¼!H bÝå¦tÏÛíN¢túä×׋äL22žŒ‹o­j[øÎ€ÞÓͯ²1ÓÖg9/ç-³fþ~G›0O/|ÎzBj½°Ò'øÒú|wÇ¡÷G#h0z:.íÏùÓ¡÷nÓ¨9áñµ46¤ æZb=›ü®çÒw2ù]ÕOå£ÙÀo$8¥Š2eœ©Y$…4¯;Ñf¾hsÓÅœIx¥æ„ÄÊ.“o"Åý×Àâ,ï±^g Ÿá^úF;èàw¦àáxK/yBUˆçj-õ—jû]Ýí”îD;ø21-P$ÕÖ/S Œj#u·n+æ¾d|¬„ï“p3~ÔkMs¬ü®ø"õg{\~)î)¸ÖUG5ÃûM@„hc­ëáÒfBG \R‡2øðYái}„­'[×wÛüß´L"½8“íÃĘ}Š©xÖ÷1òå:˜Ãúj“­8£`3 ´9ì£ Mï 3U÷Ëai ºw$•Âk5 [׎ƒT`Cée^_û|Ũ%LÎ>Å⫸2LÛß‹ËapÅ-4=BwÐcJ)KµdfÜGÐUGÙŠ8ÏÀ^m Ö.—6`¶àÓÏ”aJH\´ˆ2nÊta¤ÂŠò³ízO~Š{1¦Ü ¹üâdäõSõøA\)ÉÕ¨˜),ùv"!b`âJ¹¹EN FET×û€×øŸ2˜ÄZ7 •1m4§´P͹9VÐõ±©$™M;ùbôt¡‡*ƒgͶ¶Ä¼s–2ËVËn´œiK¹û¹z“Kê[3#»Š<Ôb—_t¡S ®¬wÃibøwnÿ&œ8Ia9ìµ¶O.e¯|¯¶¦cïpéæ±ç| ÓNÏT„Sg%OèÉHöæhgLÿÎÈh—Þà;ý´‰gëýÿŽ=Ïíd-úz~‚ç6^å϶§ÿ¦u )j‰ÑÎÌßëÙ±À «ê—[óí;OhSaÍ…¹}†s3è;£¼¿0·ê1~ÙJal5!—ÿ½'ˆ‰k=qdŒu/µ±rE™K‹øIKŒ6µñÈÑ>BÃ1YbäI±p:OŠí$¶²Zô=s‡…€Ì&¿õ™D”Ô…L"´ýmÿV¢ž<ÀC³¾ºRoÐ á¿ȦÎ6¯5•#æbŒÛ>Áˆ¹½cÜbÄ\8€' ±t™nê†@–Ì cÒB4_ƒiG à Šß¹@O{È;$hL¼s¥ÏîÆ• 4c\i‚n˜®ÇøÒZ;Z\é+îžÚ,hžË”ãB™Õács%øÌÕ„[úÛ­—LÅ噈&v'àœ zÁE9×u¥}*¦â9S¶fÔR‡]fyª¸öÌS Œ»ü~ˆ “M(i®¶fݦ6¾À›aÓ>¦þŸ‘´w7ÌŠn˜Ô8'Cçª Ä ¡eÄ LgË›îs².·×½/uûŠV-'æIÀF$¬a‹},ðñÚÍCÅþ5Zívâ ÓÅê*E.Ñv c|wp*x´€ ãytU½mNÒîÖ&ù²N²öÎIçËB8É™;'mc4È—_z¾Þ‰Îµ·è””¶yèe‹èåŠaº‘œ<¼Ü Ó Â3%öw*ÆËt`Åß´Q{à ÍÅ|)íO‹wS”ÙmWÝ@Çj¢K0Õ?XÛÒÇ_«œçyè¯R„êáMtgbïf@Ôøb8–ÈÀ'ËôÀz™y™˜5•S"µ¨YÃÑš6ß9kÌ”ï…妅{_á|"¼'L÷vü„Ѧ{&uðܰV‘‹nŒíwÛâÓDÐ- Ÿñ݉wY)¦^cÀwp¶~'𤔜·ôù^M79ç²uº’âhs›¨œ£ÕSe4ëcŽ”œ¤!ñ=Kh= ÀÄ­V1¸Zâr¦žWsdSоõä“èÇ`FÒ†˜<ã‚kçÍo¥E¡LCÀÓÚ‚­³>?–¢üÅi¥”5$¼;º¶÷ö*pn|<,*™S›$¬ÅI’ §Iñ=™ePÇfÐM«%È]KMx×ø\fŒ-TÓ”ªQRHT1âMbü2¢ƒ*ÕfBj#®e¦Ûƒ´)â¶ŠÄgê sëûéÊ1ò‡±kâ-‰¯!­>:¹åûžð¢ÈK’èSÒ‰GøßÆûfÀ`Æ'•ñ?)®ˆ$Ø{‘ªˆ(cdëÚí\ q© pcGùúž~~œ¤ó·kÿ`ÁíÐ_„6>ñRež9ÿ`=`ÄKì}¦\w—ÎLlö ÖùæÉy­íüɈýi­:9&/à:Á ß©¯IåKsû:®~l68_´ã·v¾Àñèa§:–ñ–aðhðñÂ5QKSùÃ2ÜóßO3ž6ÓîK< Œ™ q,ðÏx_;~ªq³^΄£~é–ð±bÌG#Ö‹[‹M£:ÚF—fgͬ'°O_Ðm¸,ÞÀI±²«êãx™/;™ø”Ù7xØW%ַ÷‡ÿ÷­V endstream endobj 6293 0 obj 7096 endobj 6297 0 obj [368 /XYZ 38.2500000 568.250000 0] endobj 6298 0 obj [368 /XYZ 38.2500000 568.250000 0] endobj 6296 0 obj << /Type /Page /Parent 2 0 R /Contents 6299 0 R /Resources 6301 0 R /Annots 6302 0 R /MediaBox [0 0 595 842] >> endobj 6301 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 6302 0 obj [ ] endobj 6299 0 obj << /Length 6300 0 R /Filter /FlateDecode >> stream xœí]I¯ä¶¾¿_Ñçn‹‹6 0k€ <@A'0b#ò÷ÓýZj¿‘ú+‰_KR?y`ÏøqDÉÚYË·üîï‡þzøöÝwÿ9|ßýþî»§âX—ÅåŸÃù×7/à›c÷çCÝ”‡ï~úrøòôééÓé¿_ž.|÷îϧ?ýïà:ýûÓá¯;ýð‡î/ÿÂÏOµ«O¿ÿûù÷¶v§?×ßÏ?ÿ×Ó_~wøåÅ«*‹6#æœ!W?•þrG³J™ƒrù 0¾¾ýüôíGÏ'Z>ÿxîyÍËoŸO‡R¾9+Œ'œûüÃá÷'Ê?>ÿôÔ+_ö ^F|F\„ßh¤x G<\§‚ß@0lîÃæáHÀ°}LßO„°EGZ›Ùð‰ð›¢!îžN ×Á÷ƒa ¶âƒæ:¼Æx|ÖðŒ½Âlp§Â7 mŒUÌé`š{·â%hAÀD¸SaÎæß<ÅPˆ½XÎ8›‡Å°urûÃç“Ê‘][hÚWw÷Õb¨1l˜6ß<r.ûà>ŒÿËSFxk‡ÿuÑLsEÌ˱l˜oXÐxð:„ÂXñzx€–ãu¬bøkhmFÂÅVÖ;=ÖÓ0&b}ãõ&é‡áø¡5äľîW}o¸j¬¦mGÆ"<,ã9#ŒlRcY3méÊ&¿¸nÆH-S­­*ïÐÚ¬èL¸ûµóâ&.À‹›"¬†/Ï .ÍØ¯¶G㸘¶Ö쉌×V×K¬³f¨Ö1¨·I ˜®]Â7Þß!á€ñ’áû(_1ƒÿøî 5‰&º%4‰jÛt»jí¿+íÚÇ®}ìÚÇ”ö±vÉ[·“ð<Ú‹È6õS9Þöïd–r¼uWŸ0äÒzð `bq¦öÃk¬«òž¡x.Á7îë‘ ú7Ǧ-¾þÆ]®Þ…þ£!’Çc —¬§ßö"6]q¬j×Ô呚ß&‰p’„-j4Zoc ,>¥‚§ïšã'áXÆê|Ò#~’s>ý6Ô¹Œ8×ohò–è ð~¨U. >±0¾d¼uÿq,³cðm4â3f]¾wÊ{(̘ÝPGƔކ®j« &ÅhI‹Ÿüòî~¼SÆÐò“–Ÿ ¤øQv”Q…2¶NûÖ<Ûê)£ñ;elœ2†`ñÙ¶K®p“NŽØ@êï¡TІUéD GœD¤ö®j¼ìJ%œ¬˜÷ ¼§âÙ?æI–TÚûq9»S³tí5Òër=7\ŠØÕ"¸.áK`ƒ.‘בq]fvÜ «L‚‡Øõ‹¯ÇÊ݉ýwñ~FÇÅlc&v)âo°»“ñû Æ GÆ.RŒ¼pøP„mà#é#Ô«¾°¡““‚{Ÿ~ƒÝ›é-ÿ>¾'ü&€òíðnñŽáùMrÞŒ°ôn )¡Å<´`Œ†'5&¥ùÜžaÔã–Ñù û ~¯¬:` `…o¾) æùé¾`2ûÁ(ƒEºÀ™‹UU™Ëðò.Ö.íòjŽ‚”LдF?€ âa^÷!–B롌§0“÷Ï(6Û¦ŠÍ¥L!!hc)1[ºêª±+ óY,xC×HŸ€1„è`ìqð±c3UpP&¿ZË„#Ì»€ð8…1R„q¢uÉÃÍœ{Ç a.¦Ê|!`dÖ°ð=a>Á”È.Z}¸˜bé¨0f £žñÖRZ+‹B4'CAÌéàŽ®t¾Ɍʇ0:µðëæàÚ›TQ]ˆ¢¼ÅÇ^+ºD_l¬#ÝŽÊ£†lû*ýa®ó®góUîÅl\9;:Ú0w$@Ø ô‡#êŽ*nµ.Ô!Xƒó7 Îßoá:p§Â~*¸>?ÒÏ{/ìuàN;ôÖý;ÅPwèöâuàvùsZ{c€nAÕX> ÞÈh³hÂL¦Ü<ø¸oÕR¹º GÛp »TuVþmÆÅdÛà7*h=RžÕ§ oó”<šžy,Ý]ºÃÙrJ³Ú ÄÙž‘• ¯Ð‘ʼ˜xš;èh±Ä<|²Œ½®f5ß8¦üªQpfjŽîóYް±¼aŸMY­S ¾É-~š&áÌ.òš¦Š ‡¤cçDp屚ý84áêé†îy½{n<›À¦A“ðÈà¶k—ÅúÔ™5êÄÃc2#¦Û¯äu %æOËù½ŽÁ¹iPE§® Í­p=&ˆhþ‹ž0½®©úž†ùgBö ˆ.$ÂvÎB×ÐÆ·9^gmÏœI<^(ÅøÐ™”7Ãm0±Lªá¶–iBuMn[¾ øžij–iêð09ûDÁSªí›Q~ì^XÕ°°êÚ9”±èkc¬½@ôW¯”jóbÇ´†"Z’ 4L´>¥œâ*Ì:p6a§_ °a˜VWŒ¬ÅëXfZàb‰ŠÃb¨u1‘iµ»kIÊZÒÊЖ1^©7*œz/QâÆÂ{ÄÔ$̆%Óä—F¶+^Ærº‘°°»W¬€W,_»‡iŒVVõ‰õ=í‚©‚ú{[åªyë¨qÛÚ“t¹¥«jÒL Š/þŒc^®‚Õ®²ÆËÃÜÊcÇÿ หµì>² ÿhuqu[`é6ÆÜhë$KŽRFkÚ$špá{¨S:¦ Ÿ+¼Mì>€‡ó¬£~oY‡<´Éè§= #›´ÍW‚mÿ’º|Cº²Š½ AÆVÍåÈe´©@&ƒÒ¥Bž®ˆ»,4“…z<Ýo(FDÎ$ð2•‹GÃ8¼™‰×W©[KH}-QÚ9ψél+åõ« 9÷8.›IÅcª'è^2S‚(ª›ÑÅÔÝÇuÖËœ”Rz…2nDO&è~Otx¡ çHtș܆¡nõP–ǪlºÅ ˆu‰„J,*U™"ô G­š–¹}…eP}í€÷h©£al~í¤•æ©g¢ö‰üN¤Ü)uÍýñëûÔK¢ &]{ãm“ŒºQï˜4‰Ie³cÒÆñr%˜T×;&mc6ˆ—Bôˆa¶eÝö”{ãâá^~^WDãÊûq9ÿKxS_gïb¼ ·ö.0AÊ¥Gۘ߱U¹Ï ÓSGµ¶ S›X¹ù®UÙ|†TËF17á¥{S‰ž›Tý÷„¶yªO€L+TQ½º¬M‹ëÄ£ú¾2•ùú¤f®²ÏÜs––vIlX`©Ì1k â-F]ñ˜b®v–/”7‰R£†“PJ ÑAرQc*FkKAC‚n™ÀtÃbT9ˆAËບiPÕQ@LÑ‹õƒ òÂZÑ­À›JÏÕ¥·u£„K`ca2ß×ÐUØJ3|p-yêe³ ³6#|ˆ†¯¬i'¡X’J™ü-Åa-Ð!¸Ïúxq‰ ÀtãlWÜn5AŒÙãÒVàô…ûI‹ªÁÔ{Û,2e4E•äÕÔ FÐÑ.U=IV¾QåF4Ä3u:Ù%kUŽÔ£‘ÇK£u;ÀŽ }§6©ˆWT]e"œ:iõxEõ"aZ¡itõ1sxÀÙT€5ÓYt›b1j®ªv!„A ‹âÅó)'[ñå´ñ\ÑNŠ"sR""¦+'=ëŠׂ Umö(ÜCS Y/¿Ó¨õ×N:L bÆó¬Û3zmmØ3 ÕðÚ6Y\7—[1ÔSE63Ò‘/ýàF”cãæ?g “,EYÔ«ÈòAD„Åð4’Ã’ø…'L7º@ÔTì™_P_BT ÓF»žTQð»/¯*cx ”¥½GN7VlçμPÕb˜à!æÙ•ñZéºj5Üãfö>>bYÁ_[ŠšY®{ù*ÝäíÈ ´BdÆ_Î ¿€$xÄÊÍ»~—cföhFšNÊÒ+²:ñ\œoðáËcJ°ar Â"(еøê¬«ÜA‰ ʉjOøµòì=¹ÏÆžW>ÏÏÀ[ã$J©Ä力ämì7:-ŒN_ ñŽ K›<•ò’‡KUãw•“D«šg]óÉûåŸm×”ƒ€™§ ªV#¶(Ý8ƒubøFª!ÎCÀm.|×ù~h‚q§¨º½rˆð›ªÆ!¬FYıLßú—%EÅ&ë][Ž•i­ëeÇë(×ýÐõKªDÕ1±‡ªõÈ3ë^“N˜œÞÛªH‹¹w^_ÏÕh}ª”Ã"˜Ø6ÆQ×IaªaÐT *aŒ7È„¸3ÑL!t&[…äFl™Èí§¼V™9SNWÇa'q_Gp.n ¸‘}*cÃYÅ íF‰ÝéX%™3<!¡Z}"÷66ŽB„)Z)„™£ŸtÝ3:é}F¬‘ÒQ!‡ÊíèÜ|½e÷áíâR„@¥òŸ`¡i$b¨H¼¨–6&¼Å7~D›L‰vü ,·.4V€ë#aƒÂ7¢•»0‚KÎ¥íqU?{„Œ+ÂÐ*‹}ÔNý³`®ˆ##qþÛ²nðº™å½Tku†¢Óìu³XÑE³×mk´üE‘Ì*îoÉuàáÃg®q4×|íŠÙ—@ NÝ…­ ¹0q¼ u'Á¦bÞñfx‰»¸ [AšÙ&3ù˜w¼ôJYKrqZ€"V7p:Q,áÜ¥º¬‡Ä‰'l"M±XĬjŠr¸7#´R.£—ò«Ê;r—ÜÌZäÃV¨Èzx½¸YŠÎ«6fæªU²²°Å$cˆŠ ÒHÁ3ƘE©Œâ¡ÊVtþTPÈ£»³¢]“âª(·Øf\Ï+ÉûO4¼5¼á:ôÂ} í¡±oß#öú§(¼©‹Âk ¼-áµCÍ(â¶€qŒ±Sé›Z÷ƒgÃ;…­ˆ…sƒ#Â~0ÌN1OØÈ̆v˜è0ìáÍá6ØxjòMð7Lõø °Ì¡0~£WSd†”hý´Ô²xäïàqaZŠîzÉ–õûZÔ{ÇÅ1qÛðÜ”50Þšw¨â˜Û1AÔjÏàU³š{ ‚9vÄë`üÇ:®HÆìC G¡ÝáÙ–×IÍvj¤áêîG°Ž°ö‚µ1HY%¶Q1l˜ˆ¼†-DC>ØÔ†zùD´›W#Á(Úm7¡^s_±”ëQÝÆF9T^;tñ|“9¯.ž(¯|бÈ„u–Íu5„3²f(/ÍŽ Ÿ}[õnòaIp;áut‰°2ÝÅÌÃ6WãzöC¸(‡^»‘áv# g¿Á˜[ÌSvUaØÓ ;¿™íâ’Üï?#âý`æU¯ñ^ãv0àŒUÌ–ûØ‘gôŸG0Œ³»R¦œ&r7¸ò¹ëðóˆê3úæ4=S Át6õÍ ‡øõ Û¬ZÞ(„)Ž\ „ÆBA)°<"t@A—Á˜­¡´xÌ£Y Ì“ ÀˉsB0˜ÇO¬›ajdxˆ®GP0ÃŬΚ b¢BÖ}Nõ!Ôã ,¬ ©ª ûÁwj©-Ô½o‹ÑÌ‚·•CJ]`Ø/„¡fnaqJÝ‚îý0Á†VetWx6éÍÝÓö4ydOyôâ!Y{š€ˆñ«Hˆ±Ë܃¶÷ í‰ÛÞƒ¶_YÐv¬êÕÜã´½mÓ;݃¶÷ m6HºŒîkä¿Ñ’ŠldB^Šå¨Ý™Wê8ß N|›¹¢›kÎ|)xüÓU›—-Ùê«ö!ÐÊ89#Â…¦œp:­Ïò‡û¡´Xs|:S@:¡É.sI%²¨fsP-TpÕ6܆õãð¸4’E¨î~ªíF¬ºïX¥‘Põð0:xŒÐ€ÉK(ðH$¢ %zI1 :H¤ïÑ:aJy»ÛÇn§£VmÞc†‡l GyTã v¨Í~lVÞØ†Ã³Áo:Iã’¶þ¢æ"‹pç?Ÿ î/ŸÝ‡tð%ïÓQß«pãS§šõ|$ìDœƒÄŽ1ùz£-š&h'oA¡fö#ÜÓÄ fñ¢¼KuŽ3ŸG™˜Ê‹ ìI‰õéðééÿwBo» endstream endobj 6300 0 obj 5576 endobj 6303 0 obj << /Type /Page /Parent 2 0 R /Contents 6304 0 R /Resources 6306 0 R /Annots 6307 0 R /MediaBox [0 0 595 842] >> endobj 6306 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R >> /XObject << >> >> endobj 6307 0 obj [ ] endobj 6304 0 obj << /Length 6305 0 R /Filter /FlateDecode >> stream xœí]KãÆ¾ëWèÀZöƒ/ ïìÈ!À`ÈÁÈ!XÇ Œ¬‘‰ùû‘DR3nêk²?U7I©=°g<u«ªë]ÕþôåïûþºÿðñËö_ûï¿ìŠC]Ý?ûÓ×wï¡›Cÿó¾nÊý×o»×ýëîy÷|üïë®ûÀ—9þô¿½ÞÿùøïÏûþvüåýþàÛ®Võñû¿ÏßÛZ*.ßO¿ÿ×ÛÿrZqØ®æ·ÿÿ)ݶ'0&¶~Ý ¯©Î_¿~ýe÷¡C@Ø.µªÊ¶Ù+kì^µVïÿûÝOÇ †å‹Ck•ª+[·lTëÓNUsÜI·Å¾¬Gûœ¿dVW¯­·øri¤(S)ïâ’”mŽŒFÑ&‚.ËGÀ~­L´gÈű2Я.HÜZWq›"þ/ËÇ ne«x‹Ÿ!ÇJO\Ïê’Ä­U“¸—å#à¿)Úx¿ƒ<qñê‚ÄmT“¸oËÇ niã·ƒ<qÇ«?‡¬‚Aé~ŒÂWÏ¿Ù}ø¬lq«Ú¿ütî¼g÷íåÛÎÿçd*(³ùqÿû¢PüÃþåç]{¨t9€Ø?±ðI…ž‰'߇ÃV(øä\­Oj¸Úgø¤ ß§è¨ðéåÈ@·Ñ^µ¥Cy[ž÷,F7êМOç'ö`Mç@¹¹ö¤Ã»*Õñ\ºøPå¡hÏŸrßúÚjO(=<š.ÎOšCÓÕÌ÷16ü3x ›Òð35„ÂæÙ§ã0s(mÕü×,¤þÌ'Ä;ÁŸû(!¨Øð›ŠR®_-âi¶F9§™¢~Â`ŸÌâ]tŸ¢DÜï9e¤if.¼1uˆ1ÓË!†üÆA—‡ï÷OG¿¥¾Õ˜/„ŽQ€Å æ —íðh ¡žp1jö"ŠQ’½ ajÌ8“c°j!°øð ãóAŒY|ÒñÑ6 ¢+¾ö¨ðæ*¾ÞµyG<,Fǃ8Ó%CЙÙGÖ”ÃjÛÃ5ú±°@ÅÊ9@C¥:ÃXUÉZP¢z¸‹0’ –Iêù6†þL(!®ñŸ,…‹SY8m yí"ö4¥¡9‘^>á8ÁTýsüú¿ÒÌן‰†Œ ÎHRÙ¦¹$* Š á¤”ëo!¡Ùý±ÖenÞºxëzt.­¹8qS9Y‹ÇSß,Õ–biuJÔB?åÊ”5öýˆ(²ùÕ-²QåæU$•£˜a–‘THj JÕ?¾¾"Ødí³u;ˆM‹sÌÌ(˜ùÃ!¨BfÙÈl%„>ñà‹O¬\˜ Û¸Š*$†_ £!ÔX‰ŒQ\KS@^^¼ÒC¥þ&É™iu6®îĸ “XBbØð¬g—BÔ4È£®áÉ2bí¶3Nº-çJž0°8…5>gÄ>!0WbŽÏ WvÚ–‘}‚ï!dŸçNDu´”%Áß"tš˜SKÝÙ’Ò.iLb^ÖØ+„RÄc÷aNblÅ&æë#èYŠÜ­ñX«„÷™¦„«çØ,F,‡9ž²–„´ñð/á³Êzž}ÒÙ¸uQ_"@ØZ„ïà±W‰»Â<´OgÖE[ß ™e}§å=…Tïƒã®ØSè'†'á ¥.Q¨ßäàñW}œ¾´ÁVªD”ïK„¦qßû!LO\ÇQ:øëæ©ã FÍàr6ª’vK+Ì ,Œ®¶Z”^È2•pY*t=¡Ãhpy6þÌ ‚Œ[¸ŸÄO°[[9ÂI¸Ò*Q×l3Óái[HT_Zëb0†uæ•.O}9Ó–»ºf@r÷%ƒ+lZ\N™/ßBy¾Ó%{½n¹À特5.ñL0fvc-/PÌnÛÆUQw6ñÂcKcË€¹ýàîÇP¤L6‰XÓAÀ0äT—ǦòáDš ŠÊMf3cR2B™pñ[1o‚¼Wy÷îx‚‡„’B÷œ.ßñÿ„ŠÌè´ Ø/ Õ{qWènÇðܹ©­D]ʮׇ5§µVËfˆ¼åaÍFªâ– <ò°fî}Ö>¬¹ÒÃU+Ö\]&¬\èˆ+x˜Šn%JidX‰R èT»ôüÛ¸¼{tx~ÉAÁe‹˜uëžà(¥ñK1œÑå–ný¹ö˜º¤¬uOW m´2 ‡/ÆÕsjEñÆ Îe§MQ£+ê§U"S3@ïÉÀ¨Ú‘±–Ë[#J±ºÔ³•ø6å5•¡Ÿ–6ž£æéŸ\(˜f ò™†\]q6­rYnù±u£AsŒö˜?^Zv ¤úÎü{¥ð3ý½õ×ÔðS8Ô±‡} cdp¾>Nõ¡a'‹V$1ýÉÓÖpJAJ4Šyi¼±I¾0‰îþ½‹«áðõšÚˆ  !Ðv ÕÃ$µrÞa£ìöÐñ]T#ÏÕc„05Ô7‡ãlÈ$ÉÍÔ3ê~sg§+ïì¬/u[¹³SZŠçÎNï™Yygg£³ Ù†ã±\ïÿ`õþ½år÷\ïïãŠåëýsïâ}v4ÕôD„”°m1ÝK¹j=¾–ÐSÖÖY[ûÎÙ¥Ž3këâî´uîÎÛ²Nn­^ÍÙÌÝy¹;oBvæî¼ÜGVÃUø&Í‘0Óº%wçÅÀ¼bK¹;¯ÇHYMR(wçI¿Ïʻ󚢺X—ïÎk”¹l™ª;/UU;†Mö¢Çõ×Õ ÝÕB]z€ ëúS] ô„Èo½eÜ’cüă|fb9ÃÌýÌýa÷m\.ÊTžqgÁðø3LS€°8mâ æ‡ˆê¬T®>c*ðez¯™Òÿ Ü0âQ›$WÚ;Æ‹ˆŠ1ª®“ÂWøö;ž)Xè2=­=û0â++û+}¸D/§Q+•,b™´ÍošTúQ/-šGSв—…yd‘Hû cyÞ‡ ‰íf`̺vŽÇüÇe®5%v*{à$AðʶÓ踳Îõ¾:ÿZ+µhwmªQ ÌU€³’ HN‹¨}YÖádFQ÷`ŽL?ìN4ýBÁˆa\.Ü—(ÖºMá${a±°¡ß”ˆú'‹¹3M©.Äô¼)öÔ¬;QR2Sœ(tÍŸ™,+š ÛÚ¥äUí‹]!šM™ "›OéíÞ4§Å—ÿLL:GŠšÔžÕ\»A$•£”â':¾wy䓯‰ó1£ºJiW¡m)òG=†"åº*gç™hWܰ¡lj+áÔ’FyjɈµÂp°î©%¶ŽÙu Ò<µ$O-ñ®v‡SK½õA{yjɪû WÞ…Üè6Ï ™£á·Ù…œg†úyÝýÉQ«šÒ˜2Ï Éºr&F7«+M'vܯ®Ì;6­ÛéVJhߪ×r§zR)m«7¾=T§ºmnññr§:÷>kïT/‹<¿`u4ÑaÓŽ_û×ãÆ^¸ž§þ`F¶²¹zǦ2‡Brv{=ø½w-1×Á]_É‚uÖ>èsÍóX×Tã'=~ô¡Ï¾;w×2þOh3Unq ¶Ïý›¢´%nC²o XÕ¿úèûc„[²p•×Px5ø™>U¤‚^ýÝ5,Ã~>B<ã^ Y@— <…³¦«‡âSX ƒz>ö6¥ÃÄc>Òµ cZ6 Bh_~ 5ó>:}BÒÐ#,šÛd]˜C/ÌçL ÛIß'ý&5Öóþy÷Ê­Ž¥ endstream endobj 6305 0 obj 4069 endobj 6309 0 obj [370 /XYZ 38.2500000 299 0] endobj 6310 0 obj [370 /XYZ 38.2500000 761.750000 0] endobj 6311 0 obj [370 /XYZ 38.2500000 299 0] endobj 6312 0 obj [370 /XYZ 38.2500000 761.750000 0] endobj 6308 0 obj << /Type /Page /Parent 2 0 R /Contents 6313 0 R /Resources 6315 0 R /Annots 6316 0 R /MediaBox [0 0 595 842] >> endobj 6315 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F1409 1409 0 R >> /XObject << >> >> endobj 6316 0 obj [ ] endobj 6313 0 obj << /Length 6314 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯Ð9€ÛâCAÏÃr0ð99Þl‚E¼ÈdùûQëÑ3#õGIŸŠ”ÔÓkìÚ;´Èb½Y¬*~þã·¿'ÿü-ù|ÿí?É÷ö÷ûo‡ôXdióOrúõéítylÿœe–|ÿqxI^O‡§ê¿/‡æƒo÷®þô¿D'ªþý%ùëߪþÔþ¥Ó_øq(TQýþïúwW¨êOéù÷ÓÏÿuøËï’_O3v˵À¼ÿÿO&sºHO`Œ,ýrè¶©ê_¿}ÿõð¹AÀ¼U Uf6M”56QÎêä¿ÿ8ü\-ÐMŸUªÈmõÁ‚… }ZIå.QÚ¥‰)ÓÁBõ/™éU€É3[†›¼†\+ÊäÊ?»$qó¢E-²(:OÿNe:qkÈűÒÏ~,­Q¦Ð™=úDä¬,uõç´ÿ,CšNm‹4eÐäuú“›JQ›¼†\+-Á=³ J³3§INÒ© ÿnúøÏBªŠrq¬tÄų‡–æÜtɆNÀr´½N`ò¢Tá&¯!ÇJGp<»¤4»¼Sw.€ãõfzñÉuª²<qkÈűÒÏVšuªÓNV3ÉÓäuú“LU´‹c¥!¸ov9i®ä:oµ”÷´ßN`ò¬&Í-äâXéˆ;˜ýiÎ,”æ'à¨ÿâùðîùðùku´Ë“çŸ+Èê›ßž*!út:¶V§¾çŸ’ß§©)þ<ÿrpÇ"ÏrÕð5#ÚÕ#å±téû‘TÑûzÄ­i¢)¯#eóÍù N¢T=¢ÌÑèRUC‹ö¬cˆ‘fæ˜Ù¼,ÞAÁ u)xº„˜ÍáôõHÖáqàlê®,Þ\؃?¼0¦ Ï¢žo0RLëçÅtb[¸Æ_ §Àˆ§g8f ¿õŸ+…·LWUÆÑ]ÒU:¯uU®ÏK~mC¥Mk°Ó>0FZzdG=Ðoùüo0©ƒß”:«6óŽåU¿Ñp§nþ†-…û1‚F=çGSsȤÙZ¶Uê˜9óx?B}gƒë`èÖÜØÎN€ãÀ¨ùØ/Í7y'[¢Ï£”˜¸$yVöSwškŠre\¨=ÆÏÕ­¬#åñ޵Îà {:˜>Ø^Ä /LlCa3žvRðá~<®"cÉ‘ê”TÞØË¾UÙ1í«Ö/p¶;¨KþžB0T§¶ÁÌÖw/=Àb-€§Ç¢ðeºD Z¾,-z¦o;g„Õ´ ÃW"g:|4õ€4Ø×à"‡ÿû³{ÖÀ¶HÈ=þÆáyy f¼B9zvŠ£ ˜—ú3Hðˆ¬Ž÷„Sßb†ö‘õW÷ªµA^G{ ›‚†ÝF‘Ðþ¸ÜôíÏê®=v=|;0k˜ùæs´~ 7ôõ˜ìÙ%¬GêÁßô¨=†kn*šÎ;݇d.d·aÅâ*ʦHÀ‹¬–ïB©N™5 wlâ?o!}€#whDhDÃoRA{¶¾4bç£á7­hÎá÷‡Â&¥°¹‹uïEïæÄ\ © ¿ÁtÀ¼ˆù—áE‹w ÷ƒe ó"†­ ÌûJƒV9_³a¨[ŒÆáؼ— ±+¯qxÊ4ç=ŸX<²×ñhf‚<q€¡Ž©#Kc`y†#K´¨½ÆVÙ`=„gƒ—š ~c\D®°ö½¶YžRêEÊ Ã:óÔ„[uÓP4í]ªÆ±ˆå ã Z|oNàJc®À³aFÔ3x 1}¢r’ž ¢#µ0÷áo —cþß²ÌxvJœŽ-Ždps9„Íâ3ÄhL+êŒÛÿãXÖ}ÄYÝc᱊aåKÆ?Äçû-{›c¢~õ¦×!¨M-0lاeÎdøì‡#Pw ŸÖö‰ƒøNƘCbZ×óýe4ëŠ=+L-¨×=·%xÌ/‘|»¨.ŠÔŠ·u._Âq»ô$n±ÈÝâ@Ôºí„uÛDTÅ¥jÑ Â•é'&h+ª‰Û0î¼6Œ2Þö>pl {Òx„¸ûôD$päDZVÅÚç/q”-ó›ç4±…s†«Àˆ¬o±~’=ÏËj;g“Z™Ù7µp¼Q–ZØŒI­Bï›ZL4ˆ¡Ö²\ê–Ü œˆ 汘ÔRj‘œÄ‹ž8¥ÝûUƒbÎ_‘îTyNÅÁ•L¸ö~cçlŪšµ«]¢ð’6]ÌУµ‰FÚemÀ²Þ/}ƒ³q¶|&!²¨›!¸Sê®ro{’Š#YY7Û0¦â`¾Èn²uݲåìrÙ iëF™s-Ð2ˆz•ªéöð«uÛ0¸¹Ó‘Ï6½ÓÂ!VODOM(A–¡‹½å^O¸AÈô6mÖ‹¯KF¬>:±ZL/Øf*ÒÏiµƒ¦­ ?ä:뛂}Õj‹Ø™¦XCû—`mLô—¡D‰hAuðÁëmÚ®¥ñ­hÿ‡µER„ê€"%Ó‡ÐËŒÚ ¬(< n ‚C¤˜1˜^HX&ÆÔAÈ;ÆôM_X"bcgÓîŠuG»y!Ö ‡M¶‘|fõ¢ Û]â—*elˆ®î3ˆI>ó¬ƒacš¦)L‘Zûâ~Ÿ<¶‹{›¢ ±o|}-­lŸÅSv2&AfuÝ'\bSΊØåÙ”œÅJܧœØù@r¶‰$OëbjRr+•sŸrF`çÉÙ&Òs3µ¤\ö–ž™ZfIÉpÌôÜ,ËÞ¯s#y%ù9«Ù4ÑÑKé¹3žcˆô ó‚äð]ô*wqç<ïâÎÑ qD‚IŸ%ôÕ„uû‰ÂqøåÜÄò– ³|ï-G o骼çV¢Ñ46Ó â&;•@ª$#›x8"»ŽG×Ä”çsC×[i‡ÏÚãÈGÑÿ)^Û^™t [^¸ŽÇŠÊ®ƒwSº_ßbÞxqI©v”¡¸äÔk’D–â’äþõßµôTÂ`\ˆBÐz|ó^ÉŒõF*„ÍtúÝôßUÆ#3ʨç9Eýó<)+7UämnœGMð·l¥’)Dñ*« ˆ.u_é2ªA¶äŽQ¢õ CB½+pÒ8“ÿµ¼Õ¶Ï#ÛÐ#p"S4˜žy-Ä’´Õ¦Ÿñô*UF3ÆÓÏQÓ_Ÿe*‰¨WÈ¡¾ðTíùEì0…íÉ}•}±8 L”»Ä:o ;wÏüÚ1@S½<æÂH‹íì¨û%ÏíuɬoRüCß´¥‡l«ál÷pâ ½„8),g.=±Ò=N0p§wp¶xp àlxõGrÞ)^G;mƒXÊv5öS €ôÁxô/Ш¼“Ù ¼³kN Ÿ2Tº.ï™ò|¦´š‰ûȶ5‰Ýñ0â;çô%ë1˺d˜`Œ+;Ý›nŽB84ÌÖ¯¤J~ÆqyÝ:buÞ˜ýõ8%štÈâ‚jP4A@#™iÝ·’«Kw´ƒÁ·×ßPeFìkƇP"Yræ>È0-·Bô*Y!³{{6pD‘ކû áyÒ-œéÛÙ| ÏcÙ8‡‘y,ç2ágvÄ÷âì ]öM/£;°L3M!%Z3ܲQ­–ÕJûA‚‹ ²¸rùdŸq÷%ÛrNoV¢‘¤G‚¦àC›VBUxx6¦ªnÅ{,eò¾ ôpø uJr–ü¤La/0VHÙÖׄÄyÚ‰bF휹Z`´P”œe eñä%ˆ"åÚbÄ3øŽRUƒIú9Ñr—ìcºÝv< ¬ á] "gW‹ÄcÙ”3Q½FSgÄu˜­Ük2¦bNª`€ôH4^“%Rþ1•0àHŒYDÎÈÿŒâ›…¼ØJËžq´–pí™" ìr]ÿà˜ z2«^fOÀ¢YÒÑÚÓŸïs”ÇŒèä‘{(ž¾½˜_ÆúYmW‚²Ø]–m 1»ßc Â}³0WàÓÏæÑ²}ÀpÇ|(M²ô¡¬5î®…;þaú`+Jô÷ŠÅ£Tï1¦³&ÜÆÜKtµgzOzø{,6¸SOÇ}Â7[Ÿ1M±5Š×+¾²9Å’^ñÔÖë˜ö˜—ñ[tز` c_kè‰D¥£ËÐ$^Ï]QÙ®±ª9÷õ#4™ÇÞozÞÜð){)ØÇxó¼ú‚ml/{üVŽw`»EôwÄx‹a¼‰?•À”ÝAT6ñgƒkmÆQ=¤mô¾å‘^Ÿº¶¾åûÔŸ1î[~m#ñ:Wò|~QÕoY1±MÌËØn1ëì§Cê¼%ÚS‰L2Tíï‰q‹j!ވȿuË´ÞHÆ¥µvž[Îò(s³‹±r–=Ò š·ÊÜçyF˜˜qÓ㹞»FL……™ÖÕ¯ä¥bM/ç>ý… þVy‰­MewRu²’‰îôCiºd ÚìNcðôQ׉Cɇ#mN”>æƒÇÔˆ;pa3V›u ¶¯íN‘£€ýEÛw´pYZ>Ü`«qž ö¸.lCáÙà7íaIÍÚú›§XY†;ý9}}Ðãîq> ´óXàa> `ºz(>†ÕyPOgÂÖÛ·Sx‚Ø1æ£6õϮŦ³Úžé/A¡föã¡Ó#Ò†eñÆóa²HͱUæÓ$SèµzµXOÉÓáÿ#_Óà endstream endobj 6314 0 obj 3929 endobj 6318 0 obj [371 /XYZ 38.2500000 335.750000 0] endobj 6319 0 obj [371 /XYZ 37.5000000 319.250000 0] endobj 6320 0 obj [371 /XYZ 38.2500000 335.750000 0] endobj 6321 0 obj [371 /XYZ 37.5000000 319.250000 0] endobj 6322 0 obj << /Type /Annot /Subtype /Link /Rect [308.250000 343.250000 344.250000 350 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Library >> endobj 6317 0 obj << /Type /Page /Parent 2 0 R /Contents 6323 0 R /Resources 6325 0 R /Annots 6326 0 R /MediaBox [0 0 595 842] >> endobj 6325 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 6326 0 obj [ 6322 0 R ] endobj 6323 0 obj << /Length 6324 0 R /Filter /FlateDecode >> stream xœí]KÜÈ ¾÷¯ès·U½€`Ïx ‡Èa‘CàÍn°X/2ÙCþ~º[R{Fê’¾f•­‰©Q‹d‘,’E¾ÿËçîùcÿþñóö_ë¿?ï’Cž&Õö§?ï^ÿÀ‡úßû¼H÷_¿í^ö/»çÝóñ_vÕŸÿvü×ÿövÿ×ãÝÿøãªéô ßv¹Éÿvþ»ÌÍñ_ÉåïÓÏÿ½ûûŸö¿Ÿfl–«yûÿß¹,±ÞœÀèYúe×lÓœÿüñõ÷Ýû ãVÉmâ »7Þù½)½Ýÿ÷_»Ÿ 4Ó'‡Ò“g>OnY(·§•\y\É–Ç™Ž¸n/tþ£4}€ÉÓ< 7ùru¬—yvMâf™¯äE—éCà¿Ìòp“Ÿ!WÇJC\<»"qMb“ A©ëŠˆ›Qô}úø7ijÂM~†\+5q…Ù5‰[¸F´9Eß§0y™á&?C®Ž•†¸xöCáq¹Mý‰Ð'"§ÅQI Wÿç¦}ÙËq³¶ÐG› yš­õáDu¹:Vj‚ ³‡&¸3e´,€ø~5}€É}›Î«c¥!xgöç1³`PªŸ€ËÁ‹ðá×ÝûOÆ'G°²ý—ŸÀ׬þúrDJºwº”ÇÑŸöNãØùuW2›6 †ñ ±àl%IÇ<a3\ÇŽŸ #ìâÀðˆQçâÐÇB>°x?˜>Op¶;˜ ˜ß>Žç]îMàNñ7âM8Á˜ãUσÑÓ@àS‚!ÀçÇAŒ #‡<}9ªÐ?5id‰/HUG°T…˜ä>3˜+ð©ý4 ::MÜLj¦N}U´¤OÎKfIÑ,Y1…1‡ÔgEž¾"cu¸‹CQ&gü´Å˜?xWùÛ½ö…#Ãmäˆ:\m’ŠOÓƒ³…±¿ñhIŠ ’GþC]Ëãš­A1†ï´h‘E :F œ¾9ÅèÌbÚö±uØ3o³¢}¡¸Äê•2±¹Ueö™šÅ›Ë| »ÞAF`f«ÀG ËGŒ@ +‹!ÀB_íDA}–æ-‚ßpòÇák)Œ]¸ŽÅj˜Ðl OòB ì§€M9ß6¢©îö 5Ñ,4ߘ¯õð k¸FÒº F9…ÙéCýz¬8 ™Ó.œÂêb¤Jw„8è„·Ñ^Ø™ÁÕƵm3zlbCµ%ãïãxËÀçõ)ͳ´5Æ!ŒGœlæÞAÙpÆ`ër$ÄŸ ~0þ:7TÕ» £û)µORÔj©ÍÚj­£C0ͯ¾„ñk? VxŒ0Ä‚mÄåÁ?i±ße••ysôîíö:ÊȸÎ)¨±;¯ƒ Ø-úÇrsKè• ! ¼y`ÄÅMXxºq`Ÿá¹z“`>U&ŒÃ<ÆÉ@ü ³áÞ–¸D0Ùäð|ºñä`#ÂÌ8˜&̆GphšHk‚ð£)€Æ¡Ü™HÒÜõ³¥õli=,}”Óz0®±M ¥*c—/3EGÐzL:£Û°­ÉèwÇ@m6¼äD ×ÁçTHØŽÀß0;ŸÖMzšE:T^ÚÈšrK‡ AǘÛo0q u“¬š5dA.·a&S Pª sˆi¥EãeÄ>>|«sXêc:b‹s…‡‘2¹Å'æ0÷`‰‡-%lwaM¼H¨àï`n'6ìÕ ÖѽôZ#áíÕ‘Ÿ8"¬£{\f¬ƒ°¥îÅÒ[Ðgø,àý`¨ñlÄ™«¿‰£?ì-á†Õ7gw—à2ö¸ëÙÜ= \eY¾=€&=$¥{VÆq_Ýlh&;~DÚ*þUœ}£šŒ)$WTÓ$‡,7o³ç:I#L|^÷=ÀZSðˆâ½£mðÂÌ;Åüûšk±Å({;¬(¬kø•ºùJÍÒtnøðé覣ß`\,íFºÊÜŸ¥!èH$ê‘Ú]6_ÐnL¶ºÆ…‚Ñ :fIˆûÊ8‘‚Ù_0;$žýRµ ˆg+T=ÌÖp§z/{y&¹TĘsZ–gRŸ˜ähìXgj;qÃâp_n—Í}LÊSÍ*VÈi€ªZ¡úŠŸªt¡Û§NµV„nÙ€=™'ócŠ|ôUY°²(ÚWNÁ…0–kÁÖ-Áˆ+cÖ¯#®ÍVé+c›¡ÛNÁÖ]{ºšhLEF é¶j÷ÎFéX†TOèX–9Œ9Ã(¸Óé;KSŸÃ6×V]l´ý²üZæ[jrzYÚe.EðXŒéßÙc/3G‹pFPOÕãº=\‘TÁe S>mÇé·÷^ a×zÓf}‰b¤ÈäÞ,*Æ¢ÚÝG°R ³‹ºj1¡/õˆ˜›` 2n Æk¦‹âò ì9œqZаi:UÀB¯ÝSŸý”6¯wbõ\Œ¥Ãø0ÿ²¯nv?*ìOYnŒ™©k;ªv4‹b‰Z—µØ|¥öæµop9Œ2´tqÞ¶ðÎ|€Ç&cVÀoFØMLD*•gª¸ãí^úÒµuÞ:š…*›ž3ŒÏ®4`ØuØDá“9:Aüõy6oÎsõ“A‚À ¹o[Ó?’2éø³Y ^DsEÓ¥È ±g¼–‡Ó÷ßvÅÑxõƒßvŸáFêÈ ¨iŠ.ƒ ÷·SþdÝ´%µÛg±?Ud¾b—×ø)›º!uuÊã¬.Ÿ`®ŒÔr5=ØÎ5#¾ñð›}ãêƒî›Kó÷Ù*´Ÿü*-±Q;³ƒ3¶%Z§&•É*øÆ6õ*ã¿Ë`×pÍÀöwš ŒQ<›2F ¨Úµ©€®ýó±È}òöX`67®éé>åÚ7Ø…ß4FÙ•oÊÃêš4Êá–”Xº4›mîåX]¾#;سmpí^ÞùÆáü“‡àÊ·—`BøöW²­=XÝ*LUHìÒ!*Þä¨x[ØÕÉßÀq.&Ƈ·•¼LTX #ãmú‹(“¨„é3Õ«6*.4búHù '"4J%ÑFH é+ˆòJ8N<>_r8#OVœ'ÖÛöÉ’Ûu³…Ùð™ì–á!j•ôûIÀUäöüáoCе}‚xD7ˆÞ%²nR»j>EJjÝd· Ÿ]—i[m : DÒ…å™ÇâØàÄUÖtS¡—læ­&c,ZBUašfPBRP¡UÀ2L®Ýôœ0½åΘª¦ÀˆbMc. ÷(OZ¨¿¤x‘•oÁ禃Î8\²](þ×1¸ vâ<.8›SóÀ|QôïCÊ4Aƹu¸¹‘©Ç”øF˜å+a¨€ÛJ«)Á~N*“|ã¤@œäaqzÌIv˜VHo;·tóE‚ÚA\ÏjÌ£s†ŸÆK;›õï{“vœÞ„ß`i'´‚Ä6 æ$œåO¼k%;—‰]I¼LèÊõeâ@Ð÷ƒƒí,É=÷ƒƒ¶O»#`™¸\«Ñ§oW½Oð·z•ãÚž­—Œõ˜ðS3y<Êe¶Ê ˜Š§8>Õ~ݦ‰Á-~q•D–ˆÎu›¤—‚i}}Ç]ñ%w—Tu¡ Î/B}9Ü_U‰0V_‰Zíü\‘Û~šèŽ0½“‰ðɬ]DH@8MŒ)†OÆ<ø²4±ù2ÒS t„RèÂ:Œ\& Æ/„ˆ{uã“ÁôxÆRˆ ââÐó&…n‘BQd±e?ÿo:pÁÌXÜÇ„ÑTøºîðXŽåyØÆß’Ì2ç‘ÍvÎÙf;HûÙ¤÷&½Iï82º¸%qb³¹¸SˤTl§væ§–™M7À¬KSÕ '>Œi«Ú$íÇï"G6[5ÙlÕMëmZoÓzóÓzqt›õ±uNqê Ÿhcó‹›¹®-Ú­::¢#õZy‘/•û’1ûY}ËäÉ“f†WcêP¬G¼ÉV}A¼(ΙOâ×2…~LOõ­%ê½4MÛŠ¿õ¿Eª,©¾S‡›jvܦ’Óëª, ÒŒ‹K1ݨtëzŒ©©ÌÆJšw­Í‚²äq %¨Îp¿,ª5øÃ`%Ð[Œ0dÁÝÄÙ–œuy9¬4£‡zAð©÷ˆ³<,£>¢³ŒðÀW›Ä†Žnë§é‹FÙÎ1¬†[—–'ÚíÜð:*‚o©lõ¹Û#ÍâN:¹_…º^βΥõ¾Íê#ú®…°d·°,òÖ~·NŠ*‹67-îAŸK›§[Ž— A^*‚ð‘êÌ&Ô‡Âyój{²¹=Ù¼pE9€&ª#³NîÀµ ð~˜êeXÁáÓ„SE0Fa"€šÄ$«`¹ŒwÊTŠcÌ œògczu ;%8QØ”OŒªŸmÉkëK^ë«Eçœ~aÓ9+Û›ÎÙtΦs6³h#<î{¥sŽö/Gå"êžç¾_àÁ)®:pŒ;$æä‰ß_ÒLØãµ–"ùN%û,ìñz¥ûkÊ´‡¬ÝHÙV\óIDë8ì„°}ªwÚ FÔ2û¢ýwlÓY¹³ÁZà\›¶®/ÇW¶aðlð›ÚgFmýUŽ/Ëp§!nq÷4žlJ°ÀÇñ,€é*P¼«ã ΄µ÷Cx‚Ø1æ#›·aŒË¦£ZçÎ\ƒBÍìG Ó’†‚°(n?yâµ0v2-̯0¯Üö½ëyÿ¼û?ô< endstream endobj 6324 0 obj 4407 endobj 6328 0 obj [372 /XYZ 31.5000000 485 0] endobj 6329 0 obj [372 /XYZ 38.2500000 443.750000 0] endobj 6330 0 obj [372 /XYZ 32.2500000 484.250000 0] endobj 6331 0 obj [372 /XYZ 38.2500000 443.750000 0] endobj 6332 0 obj << /Type /Annot /Subtype /Link /Rect [396.750000 743.750000 437.250000 750.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn42 >> endobj 6333 0 obj << /Type /Annot /Subtype /Link /Rect [229.500000 715.250000 265.500000 722 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_builtin_types >> endobj 6327 0 obj << /Type /Page /Parent 2 0 R /Contents 6334 0 R /Resources 6336 0 R /Annots 6337 0 R /MediaBox [0 0 595 842] >> endobj 6336 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 6337 0 obj [ 6332 0 R 6333 0 R ] endobj 6334 0 obj << /Length 6335 0 R /Filter /FlateDecode >> stream xœí]ËŽä¶Ý÷WÔ:€kć^@À3Ý ‹ƒ ‹ ‹À޶‘Iùý¨º¨ªnJ‡O]RRµlÄÓi(òò¾Ÿþøåï‡þ÷ðáÓ—~p~úòPë²8ÿs8ýûÝë_èæè~>ÔMyøáׇo‡oŸ>wÿýöp~á˧?w?ýï êþ÷óá¯ë~ù£ûK§¿ðëC­êîÏ_^þlkÕýT\þ<ýþ_ùÝá·ÓŠýçÜfÞþÿïL¥´Ò§mL|úÛCLõòïøíáÃq_©µ¶Ú”5ÝZ«ÿùÇÃOÝúå‹cc2µ.m÷s[Ùº(›Fw?ׯýÃ~¼Ö§¯Õ”n‹ƒª†ùWhù‹Û¦H·øËÎÅ¡¢ºë§¾ðƨ3ÐtGpò`»,ŸàNŒReº Ù¹8Tú Ç«›Êý&¿Ýœ`¦Ë¦c/ª9Œ Zk•ªO(v ;_M·ÒùjÚXu]=V•E:¬:ï\(©ðâ’7[–u›½¬žøU™mN;Ou³pqÉ›­ ëÀÓ y]—O°xcªt‹¿ì\*ýÝâÕË~Ó4ZäN.ËË/n‹2Ýâç‹C¥¿p¼º 5[e{NÚýOþ×å,nRóyçâPq—;\ýsÌ*x+çß ô[àÅ_><+[tFuøúS·¹—ožÿøÚ¥<|w2žLsøúãá÷E¡ì_~h•.û-¦x¢[ô¤x‚Ož‰'poÜ~ŸGÐùwÝÀ'p׆è÷ñ;Ppnxo“Â]ã ocþÆQ ƒÀI L œGÁ'áwjôÄC0ý@ŒÐ6„N÷†©>Q…¿ƒ! ¡³MþfÎ7÷ôµ\ÉeNgÕä•9øî'Ÿ@Ã/à(;À]Ï©”:–¶jêr€Tͱi‹—úŒbìÉÝʣњûΧ hÐéÁoϽ‹ÃЮwq</’¶Ñ­‡ã޲ìÑšsàëºHŽ¡E=q8Ñø$=òá¢'»Á<_‘2='š³³·Šṵ̈NˆÀe¡|&mAƒoä{Mš·Æû«Žs™^lΡ­!Ì'õÑÿ«%±|¾G¤àwÌ‹Tq¬jõVu0艇c;ˆ€=æ^øVà“ˆKÐ AŸSñecÞoR½|È!K†Ë~‘„V6ÀFÇàXÀwjBÈ::¦‘!§Äxˆ7;ü„²¥5•oø@Zf."†’0è0€ð‡1ÞW´*À|BÛ°æ1×ñ®‡2˜DŒ 6XjâwzSĸ—f<¡ôiBÆF]Ëc¼Ð2eDˆIšÑ¸‚ ˆZBpçÒf†’£Ì”Ù–Á5fôÜÍ,iCFhCXL!MBh+Õxàì3â°X´1tù!¶Lñw¦UZ#Ê1s©Îï ß £Ò237§Ô£Ý2¼É2LìJ`@Áw²6KÜ¥TÖcó‡= ó<ÅdÂ8öŠpo8þ¬¿O-D+åë,” ¡KX=#’ –07¡ÒÖUéY›˜¡K€˜Ñþ±6ÐS ìÚ›\~ Yh`Nhd eC÷„SH8Œ˜Ì§øš½ªA®£šÇ—U„·±Ñ¾-™ R™ÜŽŒÞ¡–Q&±ç!8_«^ëév^.Çœrc-Z´Åëßüòð%Yz,´‡O{˜-ËE­4­ºýEÝËYMHxSî!F¾  F|‡±‘"âäxó½-“ò&­ÑÔ{"Ëžœ‘ m Ï„›°FØYt,œ5ŒÂp"]òt,å2O¯·èÌ .ì¦/° ¬Æý…yÔü˜fàÌfk9ÇQ ÕW*&,›M±â gÀ2et ¬܇*&ãQ’õôÌ×P˜åct%‚Ö1E®¢AL6OòpŸm+O4åQÔó{›Ö;ïî÷ô{›6.^ý„˜-•×C¤'Q¶_b“87C*ÐŒù#Þ,‡I®`œÌ‚ÐU†'ŽÝ2îÃèÄ–¤¹¡>¯¾m?SR‚Æ¢œÐµ·•~»«Èu·›Š¢1ògV‰85¨Ø3,¬‰©bÉ刨ŒÂIlDe¦M0½s®*.RfcõyU=û ¹É|¶,ƒˆÐ%Ã; Â/³>‡ÐÒ~ Òü¦Ð±bÿƒÁ½;°g7<À±*왘jD²l¾n}¶Æ„9pXzùB°%­É,²‘…¥Ê'Ísg/•ÆôØSàÖØƒ=„!.ä“5«pÀtà4§R+=vs”Nwðr­ËQªŒyý‹%R”N[x‹rí)Íî“¶oß䚇¹Èž'¯ä1 ]÷Åñ=x¢žà;í„R3¶ÚƒUö¨•‡ØÏ©Á®Êƒ»kÜ0æÄÆp¯Ü§~„ª tUjxè¢ñáQ³§V8éâî¥ äRgöVõˆ3« Ü›SSB·içC·„Ô‡1&¿MâÔØðjEr‚c‡5Ôíd=ÕLÌG®­L­ê¹Sí}3Êÿæ¨d ã“×_øÉM'Àï˜ô'èi6Ñ Ò‘{ZjÍziI‹I¶IZº€¢¥'x‚2-ÝvÌ ÒŸ §¥T'HŽEŽ–êÓÓÕÒRòôÛž–®``îGS•e ¥ÛN€¹AzÝ §¥O€i)½\rHTÚþL8P¶Ð£$“²xOŽve¬w]{¢Ÿ 5åA÷îœóL:ßüÂ,†C,–ÓÈ Š( cúº$ü2]—ªµÉ ^ˆzùî9Xm$R–©ÚÍ\½³OL„r=%ÉËñ¤MõnË]gL`5ŽwREjøzDûRÅ—‰\OÊÜpצð*«„ƒ±t@—Z s«Dú.¿dN<ÍÅ„%Gâ=¦ö…©¨`@™:ʽ¿Dý@½Ñw‡ê„±I=5bxå Æè&"ÐùL· ÎÀÚNc8¯$¥O¿ bÉûãn²ˆg·Ò6ÖZaÅ&ešÁGÙZt.-°JyìG °G>0ŠÅOpû$¼ƒäiùÖMl|%ù24©Ðþ7·S˜|ϲÐû±ŠÃÐæ>_EÉÖä«QIùà®Eì‚yB¡ÊUa¹WºGaèR•î«nT}×ͦl£<‘ðîrP¢F³ï:7ðÕTÖÃ#‘ˆŸK[ Ѐë¶ÚTÊ©PfH÷˜…¨0qÀë7Ì;Í ìô‹Q3QÈ „A!– :+3}'²ODI?ÀÊð`\ÆøŸ<ø16€Ë˜špghÌš1e¬/ÛBçÆËLO¨ß‹úPàï0|™Ø5VM©) 6a,ÇÅ\ˆ&:; ÞÏÊÃk´Ê̶‰ó@þÄp”€F‰q C›A ‡Ä;ÀÚ >éTw)“bþÆÑ€ž†OJ`¢ð4Èñ1·Û¥^¢÷&õrÊœ²Ýí®ìwo!ßXƃy4ÁQ˜Õ>b5ŒÌjî½{µnn¡Í?ÙíÕí’;tž{ïÜ{÷ÎãÛzz§ïÆÎÇÔ´Ûù»?aìvþ®-l–¿e”9¦0enM~·óû†V»¦xOš"³šèI…ïê+ÔjøÖà1…_%žžîþ‘Ý?ò®4ž]êíRo—z èøuîÊmr¡Ý¯´û•Â0ØýJ»–µ]þ–Uæ´¹ó£ñÝO>I^òkÔu R¦’ßÅ‹Le;!QÝ[$š jKç—ÌS¤˜Æe¢íO2Ïü‹+ ƾˆ1¡“- X,:“‘jSG”úê’Eï«íwO‹ñ=E4†LߥўÜY;&Zðeë»"Ò—™«Jôˆ<²-4p‚Ô]\(¢™ïüF£²:w¢ B'SŸÔ˜Ùê;Zg”bíÀzÚ &½Ë…ÈÌÑ™®:íÞ©¶•‹÷ÎÉÖ¤ôÞLÕjI;-ÁHÆärŽzU‹Ö¼5s‰ÖzÂ{L™ºÛ .¿ªcè<‡yà´çM´£rÌ”ÙFzó›JSƒOÖ'øÍÜDfe7 "1Ç Ú™3Rʈ;TböŒñnÐ0kÅŸý”’ìÌ‹‹Ø5ÅŠ1Wcˆ0Åm'í¬¬|q†q‚ÐϨA¢,=&°7Y¾?ߨ> 3"°ˆvs.¼{|Ù¢“$߉·x8YÄZ[ûH¶§5ÁVW ¸7&O½P<ȘåDŒ9—K‘qZÜ›;h¼aq¶¿7x ³Gž8åalox×¢æžç>Á¸Ó¦–†½íØö½Œ»øá¤Xf*6EèX€2¾vÌS:)Nå(°tVi”>•&™C–‘X;%ÆʤDsÚežr70º/±W×f d˜ÔbÑïD$ä3aæÀ12Õa ˆ„±öbÂ@|K†r›«$Zqbbòt0&w-ÀܱâŸ6/ŒbÇ¢…Eš 2eo²>½=|&“°Nëe8æL„æÃ¤.+¬ó¯pø¯HÂÃ|GX@¿ÆŒ–I³M„oZOÄ2û¤(5“ e2Ôdj³6@Ì¢¬Q@(’Q&D‡ÛG”˜SfY„KïD–&$ΈP2›%®'Æa€õ—ð; oÈ\Hïë3ÊÜpC Ù¯¨ÇE´Ç-á}(ÝxÑõ†±t…Y©h/˜!üŠX„R¡å¯¯º)qZ•pÁ4ƒS͈T?Ên—@€ÿŒ)‘è¶°^æW Ê*éÂdAê÷Œ{«vLdéê,±Ê‹ áb—Åq¥}DO:•G=ÜMü;ÎE1öN‹Þq hl5óí,H¿Š[£'¯2 ¼'îyÁY{ë£è#…{ë£è#{Ã0ø(yž\ÐÁß ÀíL÷õÑ%j wD«ž ¯O0ÆãóàwðÞrÅþM{ɇ~À;QV6ÊçsµŠŒP+d‹ša i¶ Lµ{☙Dr^#Š+–wý¾c¦0Pn0¦e &pÉ”®÷öU&F4Éc˜"&)F†¤EhÆh¡7PØöÆÈ¿¾X©}’"˜évõÖ^RHñø <ú ’À ˆ1 ÕˆáÔp<0Bv¤Žð®3 Þ5u𠮆Çiàá)˜ð0 x<00.ëcFîPÝ2@i›w"; óüNÉÀS­˜Gb¾4ýð“«~¾4}‹\YJç…ߎеrœ¾Ò²ÍÍÊBÌ\^ €lp£ >fB+tUÑNîçÞ&Í2x©á(¬È(š*ÝäMUÓkOÙZ»ùŸ®’ÄmZeñäj"±¼6WKé´QüüÉ€Dû†¶âI<Ç€ê#R”±¹–xbMå±÷€,‡²Ïÿ è xš(ž¾ILÌLÞ.ö¡Ëdn‰¶èß=Ûôl×Ç€!ÆÌ2ã†?T`ä26DÖ?¢8Ï —Õô Fq`È1ü¾û@삸{‹Ê{B:y°¯Ý#gs¨)ýXÜɵü÷ŒÂ\îÀbŽRH®†}9=͵6'Ómíîì‹~9öÄ1aìÛ&=/· T;á,mªÞ?èÖE¤Çê3ÁŒdG]‡¢ Ñðf³õ”iTF4ž\2³Ã+e ûsyÖÒ¤yJ8ZWé×¹Qx(Q8¸;6èüiuŸ ¬”ÄÊM(Êeêi¬‚'µ¢F¬Â ¬°·Ü=…X]‡‘ôly69é±ìó+\3î<_­›Ì÷ 7a.ɨ´¢®“•p¶Þ¹€9 o Õ;ìuίšòöûNnwǸ\ 6…˜¹ó›SãE Ó8`ëÝS¢€*ý›ÍìéIÙ©m¼³íEžÅÆü*²ê ™¶õT.ÿjœ ¹|K7Œ\N)éjã3Ä ”:SÔ‘ËôleŽÁ7¿ßšå$Í wýIJ¯|v±–ÈwB&Ù(»kVH¸§„{ëcÛÐ>"†Pùç Eàâó˜¤üÀw˜HÌ®a¦-ÔT?ÿô^¥{— ›3ò=q$5 )™€zån¨ˆ„!Z†D)0{GÔw˜)$ŒÜJ׿( ëè¦öèù~|EÆ”>¯"¬”ºAà‚L9¸ w ŒZ5ÿꨖûäM‰«ËãAõŒŠ(1\{د{¯2»£D#«šbšL÷*³íV™YÕ¶Ó7¼W™íUfI°OÏ©bͫĥ¾,_]±5=.-SúŠa½Í¾~òšŒ5kVÏ©fÞ)}ÕuTL}à6)ýµ®[wØ«ÍÓaÅ6qyïÓ¼‚>Í9y€Ù«ÚwIwûyˆ&­¯±¼û÷ð­Cç ¶žú 3<ÅÍhF™c¡N¾Îƒî%bqö+Ž94Ïû®G¼‡g(è£~) JÑjøÄiúXùóÀ\‘NùŽ™ ííÙ¹{ñ¨/{ÝR7ÛBС ËâàËÈ1^ ¾ã\ì*êèõmY„;ýÜíø­!1»§xиÓDÓÃûüûYR82×xÈ?¸4ˆŠÁqŒx>Ž;çj¾Bøé©'1Á0¿ +ëÂG›‡žÕÜ;Ž·OñõÃç‡ÿì|xÆ endstream endobj 6335 0 obj 5148 endobj 6339 0 obj [373 /XYZ 38.2500000 202.250000 0] endobj 6340 0 obj [373 /XYZ 38.2500000 202.250000 0] endobj 6338 0 obj << /Type /Page /Parent 2 0 R /Contents 6341 0 R /Resources 6343 0 R /Annots 6344 0 R /MediaBox [0 0 595 842] >> endobj 6343 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1409 1409 0 R /F8 8 0 R >> /XObject << >> >> endobj 6344 0 obj [ ] endobj 6341 0 obj << /Length 6342 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯Ð9À¶Å‡^@°€ã90<@Aw7Á"^d²‡üý¨[ž¡ú£ÄoŠ”ºGØ3nŽ(²X¬¿*¾ûÓ×dÿü={÷ñë²oý÷_ù±*òîOvúúáùº>ö?gU]dß¾ž²§Ã—×öß§C÷À×iú_¦³?·Íþö÷ößú_:ýÂ÷C¥ªöû¿Ïß›Jµ?åã÷Óçÿ:üõÙo§‡×õƒyùÿL©UmNØyõÓa˜¦:ýþí·Ã»Žao©´5e™)kl¦«³ÿþ|ø¥}ÁÐ}~l¬RUi«ü5/ªôéM6o»ÐMK›bòžó—Lï*Fçíãu~¹4Q”)•·sÉ•-lqeÇÞc¿l™>Zçç‘ÇZYØù±¶F™Jö´Ê§.êZ·?W¦ÿóJ’5¶'™²1Vdì>Bçu^Eä¥ÓÈÅ©2¬7î]r+7ÊtªÊ{Aþ¦Ž('Î#—&ʰ´°sÁ•-r;(ÈVˆèY÷:WU<¾éF.N•~m=½G–Ó…ÖEÌ¿t¡sSÄ“ÓÝÈ£-8î]r7Û¼éÔJžBcï1ÈoˈŒs¹4Q†¥…K®l+ìbnÛK÷:/mD¾9<ڶŽǖÓÕà¹FÙÊUD¿¸¨bŠéóÈcmeعäV®UqeÇÞc¿>……¢u~y¬•…K®lÓ ¾FûWž@—îå;/UqÓžG.N•amqï‚‹[¶ïé d#8žu¡s›Ç‹gu#§J¿¸ÓÞ¿„ô‚‡Ò}‚éOž?<Þ}nÇTf¿´#;¿°ûöøý`ÛÿœÂçµÊÊþØŽçýÙã¯{´¦;a8ýÞ¹Eר%ÿˆZ”>·ÔǺÉ[Ê,z¿Gå°· ¶˜®åò…Ó(Î-æØÚöuõ¢“’x1&Š:·(s4ºVíCK&Gí!1ž)~¦vɧA…àü†#=‹ŒÉµœ(Ê ÁzÖéáÜR ì°äÌC3üÇB”Ò®†þìvϰœ±n`o˜AÜÛn±[ÿ:ñ¬Î>ùU ]g }:ÛìÞjºa4Çó¸_L÷liP‹ª`‹…-pª„#x[`‹1 0Eñ u4¤¨†ÏLkü̇„ÜW˜y®¥ˆ§7fM>†ó‹ì:š&ájµvnÿÖORo1 ] ¯T®à†úÛcî`‘îÚs½ÊØfxH}7§â®µ2Ê¡¼‚CçpË|†Ï@¡hml¦RUãÌí éF1ºò£>5|&Ç|©Í¬,6Hð>ÂÏ@5â1‰>&6o°é†×´§Nî+ó#kI3RÕìFø‚÷lÙO¬%W2g̵²²/Yâš~#Ì'Ý-¼Êe¥N î2µ‰YȨO"äÔ;éÑÖ[Žêõû$l>o'’…M<×(cX³÷=•Œ>Ü=ã—àu¢ø;`HŒÍŒXlÏÆÂïaœÂ‹}Nìx‹{û.»ì ùª²X,=çöFLÔÔ®JÂôx¿|!°8Æ‚ »’ð=)Ý´jt‡µ‚ Ñ‚Í(lÊÆçnÓ˜Õø±É®°ej®Àæ=Œ³¦2üó”û±,^êxÌ#iÆSÛ×sB|ç£6£M#¬«Û¯ÒaÅ ¹2ž ^ AÔÅðkbÐaú¾€Çr€TòLƒ9œÇïqÍ6†æôh¨„Ö§ÕáFO¨FÄ¡`Üâ1y÷x(㔈}P{é-i„·£&¢»4E^8ŠÎ#@$÷äH\Y6bÎÀ<óbÔ !<è0Âö(-†ù!G÷'ö×F@ø­‘º–Aâ‰EâóZ¼”˜Ä@Õ!¡²G u»Û9¯³sdéó²_6Øމþȧú“NoæC¥ByÕcŒÖÀ(³GÜ’Ë;ÝúX£^ƒpF j->ŸQò‰™ Û e‰N8û™ÄùCЉêfæåaoü q(é‘o²ÞL€ã)⽊úHx0@Xl+¼ÂOŒéY+ë(¢{É“à'Š7Ýx›§øŒ2– <Ê®œ¨ã$›³·#&ÂðYÄ50¡ã‰#lfÊibΚ’` âºÉÕ*ÃÛÔ<„ÎMüÆ’fb^›Ëœd´ áY­‡“¼m‡”9ÈÅ-sJ8AÜ«1¦ÌAÇ&Є͈ëù",#°,ŸÿÇŒ&VyЄ…†[0Îb=8Ck‰ñvž™âœº„߃WŽ@{zF×Ô`®Â4ÀóÁ´Æ‰‰¸§úÀ±y’ ôªg7&ÚÁxÔÇã=‡SWñúàQãŒÇ†W'ÂBêä 2—ØY8I·ÈÊQ–Ó-Qš0Ö€½ÖL£«G¤q2u*-Žã·©Åq¶æe¸Ó=c#4˜‡— Í‚« KüTõÃñ[ž©‡nR¬ŸP]äz|%Mfb T…9–]Cš8Çžý½dd¬˜;ƒn'ަ°ÀÕà)²€’Å›Œ.±![bÂÂRk–u2µqf½4!ˆ0ÈÔ \žŒ4{†SUÊY¢ýttÝ8m‘_@—8ÂKI~²' ÇØÈ8ÈøØ#Â4ÀùÊsóI³ÂãñÂ^~-÷x4{ùµܧ”žç>†"Ä®Ã+¼e¯y3¶[Ð| qj±>­o3BáY|®•®bpq*&;+­¶P‚±PEj^Ü#áù g­Õ›Œ„ß›ôÝ@|XçΞ*Ž­Ùÿ2Ë™‰V­•-Æd™R…sn)c™ àÆˆ^ÞoŒœ:*Á!qQ¸è¦ÑÉ¢…k)´0^ÑØÜ³R¦ghbÛó³.êA.®Ž9£¬ž›´9dëcî>H.ìƒàøcËÀã™âȃJÄÑìØ]Oôr¦[š§…®Æ‹að~fèË\ë ºŸ·,Óò”+Ü”ó«%ڲ媶x×y$#+ ô-æ$i®0ª˜çl,q™*Ó yÞŒw<î<ïåyBC3cóè:ÂŽMl}Çi™z¬ãÜÇ´®ÔJ-ÝIED,Ê^üiÁ`©Ò„o&Øp£Á Í„H¶\'š OâRK ¹àLp¹÷ѵuj?í(Ç@¹2€ÒÚàĸ÷¢·62A,ˆ¾ Ðâó˜Õ¸…IêdŽ}¡sc0uˆ«ƒW‰ºøƒˆnf€)Š÷iªãˆÕ©Ã$E3€_<¸M†mÆKêï-I/ò]ä®aj‡b[›L5GìúaWS‰©~uƒùnAîg)@su*á›áåOi#€uOçÉï2§(›ùÞÓyötž8ÜW×óÜ·§óìé<› õîéÝŸ§·õd§2ÁCOv*õ‚Ù#—¾ùì‘Ë|\nBboYŸÝ›žÙ@D±¬‡¼Yæ*sÞ¾¸÷N²«FiªЧ!Œ’iaJ9S{KBÙÄ„Ý*Ø€UàѢыzõ’°ñúIÙ*\Xz&­W¢£Ï™¦(Sˆ0.àɃa!ðu2—º¯ɼÅò‰Æ:BçÍE™cJtãŠtêŒHºFiHiÔò‰…K:ÑÛ?C.tÂ²Ž‘[XÌ3ä‰Ô‰‡7äøòžž©c0 'ž¹8s{­–BaØ€‚`½tuQ°´‡#П%¬¤˜¨$Á‡ÚŽõ@Wûã,jÏ` va¼ƒ,Uå¯-ûn ÔY7®€qßœ4Ù”AÙ›ÔEL€TN;Æ„½^^¸°Aõêñ\nÔdb6ËolQô+{äªv¤Äî‘ Š`e]ê†G|J¤eF‘Û1‰Z»DeÄñPJ4BNûuk¥ôÐtQáÝ|®ÄÛq6…ç‘èmË·…0`ùÙ,ϸ2»¬wðFxÄZå®n‘+ŸWgª¹öN]ž_Ù˜!Ž×{-'wLùŒ>¡–~ÿG=Ùuø3ž÷4虾P»›Ýý×}®=ÓŸß•Ã^F­Ç=ëÄkzõ|­7H7^b¸WVÉï±²J™/©óf*«¼9eŠ©“†û–TVa¨(ÚÃcx>}U‘$ôUc]Ù«6^ôÐSqu°&–ùžÞ`‹'ß0UØÓzËÕD¯ØrMæz!Æfò\£›»@r]ê´`IšîÊ¿R•vv<·i#x2ĉóÊ"ÄÕTÖÏ]Ÿõ¥æÑõñ¥Vc™GŒÛjh®ÒîvAñ–E¢3F„xfJ„4g²>oé"/å´¥?tÓÇÒÍãìK4_tŸÐ{Ìœ3}mlŸû™"T V§ÖÕ)8lXN'Ø36-°ö¼2 …{ƒÏôªJMýYæËp§ŸÛ i÷ÎlÌ@ïîóERØö©æÀ/ö,dÅð8f<—Ç{û,Œ_!ý4.™ùÁ3Øúõ\Y忨K´eì‰Y­—]½lŸ“ëÙ—Ãÿ¶‡â endstream endobj 6342 0 obj 3860 endobj 6346 0 obj [374 /XYZ 38.2500000 584 0] endobj 6347 0 obj [374 /XYZ 38.2500000 318.500000 0] endobj 6348 0 obj [374 /XYZ 38.2500000 584 0] endobj 6349 0 obj [374 /XYZ 38.2500000 318.500000 0] endobj 6350 0 obj << /Type /Annot /Subtype /Link /Rect [66 591.500000 102 598.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Library >> endobj 6351 0 obj << /Type /Annot /Subtype /Link /Rect [384 199.250000 420 206 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Library >> endobj 6345 0 obj << /Type /Page /Parent 2 0 R /Contents 6352 0 R /Resources 6354 0 R /Annots 6355 0 R /MediaBox [0 0 595 842] >> endobj 6354 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 6355 0 obj [ 6350 0 R 6351 0 R ] endobj 6352 0 obj << /Length 6353 0 R /Filter /FlateDecode >> stream xœí][¯Ü¶~ß_¡çY‹¤$J@Q ö± ô¡€a}(úP$M‹ êö¡¿Ú•´gµWüvHQç(FbçÐâef8÷¾ûã—¿ÿüoñî×?Œ¿ør(¶.‡ŠÓ¯ï® Ûãøç¶uñï‡oÅ·ÃçÃçþ¿ßÃ_>ü¹ÿÓÿ ]ü©ÿ÷çâ¯ëøãø—Ná׃U¶ÿý—óïUýŸÊËï§Ÿÿëð—ß¿fœ–7óòÿ¿3QuuÚÆ¥¿¦cªó¯ÿþðÛáÝ€°U¬nLÙª2U¡ºJÿùÇá§~iúòØUJÙ¦²å# Y}ZI×]¡t×ÏTU³…0yUêx“Ÿw.eåŸýØVF«û¿ß#ú„äºmuÿgkÆZÿ?Ðlœ\¦0y£#N~Þ¹8T&„ãÙc#¼±všŠqß§0¹=ÍšN;‡Ê„p<»$ûîtó6?O/?¹-c"÷¼óh·Ï.ˆ\Ûk€lü—ÙcàV«6ÞäçKeD-ž<2Ÿ¶úrê¹Ê'€‘ˆ·ÍV•ŠHKçy¥¡2áÏ.y•{>âU¾Ìü=Ç›ü¼óXWNû*Û²‰ˆíËìQ°ÝF¼ÉçÇÂ6œ\òwv”k]>—Ù#¿-mtÇF×Ó‡Õ¢‘RÃoªðmáÜ[ùŽ8Û÷poàl¢ÐÁ{3p$~M ³=ORÁI:¸pGàf+1ß,\X•”†¥ŽuÕ¼€³ÎHÐfšlF¶A{óœ§u¢Ã§§°N¬£[‘àÍbâ-k„ †xç0Ljƒd€·¤?­…R %÷ÄÕÇt’¿jí´uù:1â‘âPºzìU(Á° År—’zŒŽwí9é&íïQ¾'¡ØºlRS,Ö¹ád·) îu}÷6èŽ`¯ï„"¡£c[À³¦$Æ‹ÁS_XÝ¥¦¤Ýs™õmJJ}U›šúrö\fL%¾{;“Òr3eÈyïøéÚç‚–Q½›gmyTµ\’΀º†„š•©e TËA¨ÊgSõ±ìÌKÍçÞ „¬ô4´ºª†‚*vª`õÝ£_ÃoŒã|0¢æ9ö Wsª+zHwÍõ~9|‰V‘ÝoÁAör;S6†#v+Ë¥Lúeðɦéáudù˽óDuŒj‡ä<¹œøž; y…ÇvÍh9k¶-Tw @z¼’Í>Ÿ&þ[‚ÜÝÌ‘Q-©§(ø-wMÐ7x£¸ñ ­Ìq3ú?å;Rcäó7F&©qcä Ά×ùgðÆß@Œtuø›)ƒú܆{43®ŠG4:ϨPÞ:iªTý®¼€«8Š=wÛð0f$£m>Ó¼›eÿêÓÆ1P°Òñ½Ëıà²Æ'Á>Fe´a– 2Œ<Ø'"¥ŒÑæÉqxÀÑî¡C¦he-ã¹#q«£F‡ê"JµSÒòK±VMÎ!ëJyY[#„õá¿ å“ „·4FS“øžºzÊMæ«düŽ0îÉ”aò!ð:›¬EÇ™L¸ao6±ëœkÞ=³­OUDU¸yŸoX}¾«c¯CÑ¥(ç’=㊞”ݺN=@n…Gpä ߆c§Å–ÔmÂ0 à–5¿…[ ¿Á#™sl[ª–íR’ˆ_bœPµÊ«ëLÔçð*,éÒñ[^r‚z1éòàlyÉ¡(›É·À¹ÉŒtÃõ‰îcRººdHÈшßõnÕ%úfÓÿ…ð3z|PkõìH–‰ÍoQ´ODJãÓ•Åz$/öÛ YlÓó9„/Á-Žœ«•r'ñ#ƒ{:ŒMQâWL5&„MÐíÝèË-nß!¡å!Æð‰è½lTƒQ‰2 °zÄ1[Žº˜Ë£ »Áîƒq­ŸÖ6.‹Æ.œ2DógO!-vuÜshDs]cÆ­]o®¾\“© LœŸ½äÂ3#+1¹§ܲ.Ó5дÊ.h†@þ˜†žb âa Oq䆯”Sc¤¡±®¾Oc«Ãw£Í3Dƒòë'~T ¶Eé`ýfïö$ZÆ%¡|ÌVÿµÚ=Ã~é÷Ž9~èdÙ1ǔơd¦ßJH·¬Ø2^Š€é±ÊËÔœH8fSEܨš‰÷éê›Ä5¢&•wÎÝbÊu<Æ6[ƒë0¥œÂU«º@@bà ÂÍuH¢ÞBŠÃt½ +î…B‹®DªËŸ_yÓ¦BH›ŽHGŽªWn]é˜ä­ È݉ûE]…:m±MLœ©12¿ÄZx@ËŒ"e\›»^q~?väÑw€WE¸ž!<ëÃ7—'ƒPjÎòn©æÛy T"ªæáï¼2˜ÀQiÄ;ˆ²©{ÆHصßT&nÂX©ÑÉÞ!°ë7ÁÍ †ƒÛÄ2Ï«e<°½ºÞÁ9«Ó¨ç6â<<‚ùCñø¤LS0#rN˜ÇT’µcóÓñÐǨ¤‘zÕ%1‘ÔKURΔ`3ôâ¹›D±¢G'ÀKP_Î2K½r}i”±Ô Ý0.$Ú.Èsƒ‰$OYòêmÊ“òèfjááÉ$FÖ§rŒ-Ù‚û(öTÜ·HaÊ*};ÍÀ õ1©QÙÈÍ4tÙMm%ðc*Ä#5ŠI`U)‡Qâ»{+;9À¢ä¥n##¦š^kfݯóË•ñlvK‰ƒLFnÏö[p/Ñž-œ )¸­, ÇDºàØ^ø^¶[LñRÏ€*O¦:ðÌ^Æ Â—ÂYÓ¯-*rø2 ŽÈ뜯'Óß_ "!Cí,CŒI ò<4ÆÄíEÞ2ÆJæúIË>]œy³-Ö®ld¤;“E”*:@,¬-àêÎe ±ƒEÉ]$K <ÅG„ê"ž=[­m iœ!B„éZUûXT…4âazz%I@žÁ†Ÿ˜ªj¨—ò[Ϫ=Ð`¿w]Jàì.Š¿ä1K[w›q“23Њ2TÜõoÅ ™Sþð+iEÑ;#¬–·™òÐCçD+LŒÛÈbÁR–N˜'H LC²÷‹õ»Þ˜ò³Ó®d’Õ3Eû?SEN%Ô†d{`KT_ñes,gÀg Â1*Eª©\΄-¿m”u+ªyø¥lT…9iä‘ûÐK°cÊɉYÓ5ABíVç™~Þñý“µr¤UÖÇøÕ˜n»/>¹mvï© Ä#ÚuQ"ƒ`ÿ"Æ‹GKÃ@a žÞÕØVGœ€+¸¼z=uÏGV,'ýŽ3°Vz¢2|ŠÎVL‚Qe뀇˜Ç~–®§g·,d¸-ý_$Ùé­èå íRÀ!*((W”h‹ <»KwHÛ¹b†©R¨y©^\ëÞgÝÜ;U‚Dª{OpROöÛêÑ锆W0[bˆ6QÁ|6åÛЩö* éæZ„@üÞ83ói7D4DDdn¢nñ1a|í¸ð”x¼Ä㊖mx ÛMO"8B¥ ‹6Ü`êeRåxˤð2Éå²Å=P(«™×„8ôÌ¥2pyv7U=’e*kg](¤j‡!Ñ ég¸7¾ 2º2¨¥Ÿ 4b%*+ñn>#ª…T.¯Ôp!Se¥‰xX¾6LÌ×#ÊÚ«ûÚ¨»•È—/WŒpO“iì]qÅä}ïÚ®¶ËôMeZÞQ%Ú"Év©ü}«'õíAJ/~d+ªƒŸxzŠe5²ÁQqF±ë5££q$]Ö¥Œ"a¤ÈoøF¾«·[[·/•'‘°i¬CËžÜUœ¿‹3(aîª'³¯ƒs8q¾«Xî*NƬ\Í—i#µ¥÷»ÝŽê[ʸФo@W=¹Å<‡|EüѸàõÕ‹-?Yt6.îܳáØ8ÌÃõxmç󭮈˜îëpK,1¹PÛ€5ÇÈ °g¸¶ÇÓ÷§‰U}ý“__<‡’Ï{XÊÇE¢4ÏÂ6}?]™OZúkIö °ó·Ê˜Ô¸ÈUíªrH7›â­˜]ô¬qNýJrI©Oí ±~ϲdO1Å÷¸—\ñc ¦F#XuÂ#¸Q¯°ˆÆ&Û¹+QŸË S©Œ‹O˜Re‹dØ-÷ztR"j“ÌÎeœžˆÔx¦.!ß`ÿ6¸€lê»ôÓó¢:×èÊÙ xD:»ÕÄéU·ç,å,$k',‘e œHÖÚV6#‘,Œ™²7­MÏmÖê,&“_‘§ùÚjWÌ@’˜!ÑÃÊ™^XŒ3:UVI@0&½IôE½ëINºû6mÆmv0PE¦"ü ˆêo§µ0Å51½Ý‹7â½Å´ŠÛÆ‘µcóº[1{‰çßêsPàzdð©6ó‘1~®£xuÇ$€'´Ž¹gÉÞÚÛ§ñ¤3Ut$'¬T®ÌÃF|3?àHEØM†EÜc(<üf¼*èèWÉ,ÁþÜïxB4†ÝÇpиŸ$3Á{øù")ì/jâÀ {I@14ŽIïÀ¥ñÑÜ £W?}Ï Šù.†ùCTiKs9Ú2òĤ¦õ5o¿Ç׋χÿmžq endstream endobj 6353 0 obj 5188 endobj 6357 0 obj [375 /XYZ 32.2500000 353.750000 0] endobj 6358 0 obj [375 /XYZ 38.2500000 292.250000 0] endobj 6359 0 obj [375 /XYZ 38.2500000 785 0] endobj 6360 0 obj [375 /XYZ 31.5000000 354.500000 0] endobj 6361 0 obj [375 /XYZ 38.2500000 785 0] endobj 6362 0 obj [375 /XYZ 38.2500000 292.250000 0] endobj 6363 0 obj << /Type /Annot /Subtype /Link /Rect [219 763.250000 267.750000 770 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_default_args >> endobj 6364 0 obj << /Type /Annot /Subtype /Link /Rect [113.250000 755.750000 143.250000 762.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_feature_flags >> endobj 6365 0 obj << /Type /Annot /Subtype /Link /Rect [183 320 212.250000 326.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps >> endobj 6356 0 obj << /Type /Page /Parent 2 0 R /Contents 6366 0 R /Resources 6368 0 R /Annots 6369 0 R /MediaBox [0 0 595 842] >> endobj 6368 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F8 8 0 R /F9 9 0 R /F1409 1409 0 R >> /XObject << >> >> endobj 6369 0 obj [ 6363 0 R 6364 0 R 6365 0 R ] endobj 6366 0 obj << /Length 6367 0 R /Filter /FlateDecode >> stream xœí]Iܸ¾×¯¨s€)‹‹6 Ð^:@ È!È!˜É$ŒqrÈߪ$UWQú(ñëGJª–Œ¦E>’o_ÞýñËßÿüïñ݇/ÿ>þØýùáË!;•yÖþ:žÿpû]º¿Ë*?þøíðýøýðùð¹ùï÷CûÁ—nþö¿£>þ©ùß/Ç¿þ­ùáOÝ?:ÿƒo‡R•ÍŸ¿^þ¬KÕü-»þyþù¿ùÝñ·óŒýr0÷ÿÿSX¥/`L,ýýÐoS]~ÿ÷ÇßïÚ[¥Ô•γ£²ÆUmõñ?ÿ8üÜ,ÐOŸj«TYØ2{ÍB¥>¯dŠü¨tÝœM>Xçò[fvar›×ñ&¿@.}(ÊÊ;ù©²F™Rçö|ËçΫJ7/M÷ëu»Ê•ŠxÛ×Ùc\H‘ED¥ ä±nNû¶‹¼ìŽLÙ7r>Âä噸EÃ¥3äâ§Òß7ž]’pWZG|Ê×Ùc­Šx“_ õ”á䱟r]T1ŸòËôò“×Y‘-\ ö”ñì‚O¹ÖºŽ÷”_fq·F›x“_ ô”ñ䧪è~Á¿“KWçu­iHˆUÕ1ª\ß Žꬎp5×écÜ{e#R£ äâ§Òcž=2‡¨ë²ˆÈ!n¦ŸÜdY‘D] Å!<³Ë½f“)Û‰cº¬"œÿuú—kU´Ëí ?•örGfÿ2 ¥ý °$}÷|øþëáÝsCëãןÈ. ¶|ývÐÅñ‡³í¨‘Y¾þtü}–©ç?¿þrP „…Î[øº‘h$+/#ùIíÐuDWÄ7~S£o²§ös*UUÞàý´'£.7#BÐ:åµ¹[G6¥Ð:x?õá2RžL9ç–!Ø0ÔÙ§v¤8UítsÎ ®ƒwªÚ~úÚ¼†×!rCŠ1Dnxè‘MV 7m‹3N\1ï/#õÉØ üsF²öØí©¸ÙZ‹®U‚7ßh4Ò=‹±Ùà7ݱ´³™~£7X´Žg?‚Yò“Ñ•Ò#ȵêŸl7ÝŒsëˆÆØ±ÓÌ´³½üoƒ¸dÏÃu¨­3†¿Á™C4ÃûÁPãkÁëTî…1¯ëâà “¼Aæd™{‚PëZôµÀ³ö`1¿Ó ºeBj †©yÜKÍç^y£ü9ì뱯­¬âeV÷M‹jˆ竽Üly–ùßguÿ濾D“úºCi ?óÑÅç8`¨‰˜I§š!¤);Y¯( ù‚HÌ<ˆß<~Ùƒéñm0Oa3˜˜¥…êˆáNµéU®¢Õb_pUÍ~Xä••Ò\LñÜFÁ€×ƒy›çJÓß°ø8”µ®s‡²zÇØCˆç˜% Ó&õ(uc¾Þ&Kp >HFzųÍg¬”°?ÿ”0±ò1Y`y]Bà1+›M™•t~¬õ©µŠÝBú„F:HÇFyFº;ûÆBØj8[ G 8aëHÍø›gâÜà:Žàû©¤0 ¡‘ÖÆÅ£µM­KšGcRMÓ:¼Ób¦®w>ØË¹®×(y·?XB×;ƒpÙŒ¶¤?Í—MÌTn !¢(t\ÏGå§ÌõÅ<ÁÙZÚ©t?4笑‹±Cb룞ÍWo=“:k€/À£¾Ÿ-ÑyÈ#ï¾®és‹ÈÞ‹ÒÎ܉qÂEzJÏ`t®ZÁ¸Dé˦l;[¸RFçg4ÓújE^ÍRþñåŸk*ßæzÉBDn©T•»ì’Ðʆ'ÄH[q%B&,ë»&¾ñP¶TïX@„‰Ù+æ­†×1j¹…NL¶2ÊÓüó#TEÆm?Ia‘Ç0\v$¬®îï3ÌŒ •Ø\ŠM¹x ÃE-„ÀB¨=ë¼Ow'V•“ðà‘ ›Ê‰ö@€ üĈn‰TûÁ&yü&ÖÑ9<Øã® Ùscœ6× Äì62ø ÄÂÃgPÓ{æÍÇøðLÈ!¶VÓœók¬a³Ðu)AT"ªjSÁ›Šðäüëñ82ñca¶gÓ-lc»î6R ª¹µ=€0æ€I%Zb³• Ç6$¾0lŒhºêxÛ †äð<âM±ƒãUð~°ÈH(Fžoà:žh üÆ¢œGü#,ÎbaŸRD0Ô˜R‚»G ¦°¹§ãl“¨¹›É½$(Qö³ç’eïg}òšÆóX^cœ”²êǃ9Ö(W1æÂSÉ q-€*³•É5ö­`Ÿ¶1ž'H;äµkÎ]¡%mwªÈ¨  ×vQŠ2d"§±¡ †pL56M=EG—Îñ2”$YÛ3žÎ&°®™kä7f|ø8{Å$£¿w‡­7¨WodÊ2¸¶=i ~™­5Q7Ú¸x·™@*3ÂÃÙîWÓSmy¥Ù:6ȆXjðüÍ8GwÇl9]h—>˜[bi{e9¶èÃË vÁ`¨‡ÁÊNˆ!À4€9QŠÌä=W»ùm7ýb ð"Y5©Þåû…{ðaƒÎèéIÖa}b(êïQJd)åíê)姬6÷ZCªtNìš…°ufƒ±ÙÚkQú bÁøNø@"e$<‘Ù‹‰“6Ã"§0’2·,°¥xŒWH 1ýIçl-‡“®ÙŒ³8µXQè D”®0SÆ!0Ëב֛ªkjÿîGÛýhÁ¬C÷~´<"$œðsKÅài *X0Ñ癃fó°K ÂèŒTÒü~#k–©"N² ¢•º˜hx«á‰b¹0 ù€ð+R*ÈÛ±LG6D'²bìfí9=>s,mî2ÇÝ`.j0B…ݬ½&Åsë‚3 ¾L¡F‰ð³¾{“¸%7ñŠ5 “ù4REú½I%øqF ¾×µË Ažˆ"nCä¹yÄ#Y„ÂDp>Q¢œ<ó«WÖÓ‰jT×:»V]ZÂ’â13ÊP¶¶¼§ó<®ù½p‹Rµ³ë”¥u¡ï¯<Ì ÍŒ{‰WÜI¥&áÙûKHï'U‰ÕÐ4¡âZ{‡ îl¯ÃÅ4}2ÙuÕñá©üÒŒ¹¶iëžÏ˜Í¿¿¸Žß]œ²'­{·Fßx´UU)(Lª®ƒ¿)àþÂÖ±ê1)°F³u–ý ³Ætd_üªJ–@ìžÕØ]a= Ú¾ áÒë˜Ç’ÁÐL càÛd#ÄcØwâRySY÷EìÑ{´GxÄ}1Ÿ²n³-ãoPχ0ö¬F¶–„;ƒª£·|¨?vl0ÖE|øLQGQ(Å¢$<`DêÌWé?7u¨âŠ£š=°‰†Âz"6ˆx-&×"Ä!ûü¶^²|`÷£å4o RÉòÁ:o8–e½ÑHñ=” °úìßLÆzœ\U•ê¨í¸ ÷‚¶V_«>_ßÞ+)0##Ýñ§În:x«cßÔè›îá({„µ½G³u&ï‘o2¸Ÿmµ ZwßAë¨T1 ¢õ4s±ø¿Á?)蘪¶HeëÁ¾5 öÈ$‘í&ŒãP¼›iÓ½T!áâèDJˆþ–ȸd‹nÙkŒ$&­ ç ¡Ö¤¨–íèºryAò¨|´U!‘Óc2]'¶’!á¶½`jµ¸½†rÛß„¤*ˆÔu ¸Òè1œÏUç4¼!v„«Ôã–†®lO›JåäqÉšØl¡¶Ö9©ø¬¨¶.+b„8ªÎ±„ `%ßV*™ˆ7NV!`* pc ÒRñ<f/‘#·æº!y$ó3d(f€bÏ(I$Q7¥°:%#%°·]ÓߘÊ”³9©\œá¦òÑ¡Æáá¤5Ú ÞºÇB·6—£Süñö¦ÊD†4T¸ #A))·¯¬ÿ|ñû±7î²[Š¥î(Vû“Y¤Np ¥RÇHÛ"š?ƒ¦žuœhÛöèÔðèÎ'p9€útþ¾9’ZÝþà×ÉÄÃkåÜŠí:"< AÂs˜EŸ°(‰HÖ‰#¿úŒõ'ÈÙC?e'e¨9&PùƒÄ¨u¢v·å«@¸;#ÓQÕ D›RE¹ÊÄ1?©·.Ÿ&$Ü'®!= ;]S»µå›%ðDfÆaZÌ wgòv˜¾´ØÓœ*ÔZ4ÃfîªÅÓk™‘½W'‡Î"$ùl*\CƉÅ8{©“Ñ)cr\#oîòVQó¡'S‹9 ò0 $Dy 9lw™÷u‰‡€J ^dõ4Ñúè‘c~© ²µ8§¼å löZàNÂII"ö ¦ïl¡Ø8-¦Ð*&Ó­µ‹#²U R©¢µ ˜ ‡ÈÑXT ,.¢´)÷¹l.!0Jdˆ!Ÿ/D•”u º1Ê“O((Ú RæÖ™DÑu&12"Ï-ªϯe —|Š™)¬êñvaíæ«~ó/å ¼ÑH÷Ðó“qÆAߨ'øM¾éÞŽ*Oµå gÂåXjû|à‘¶ß'sAÓYt"ÏØ><„Íó „ºÏ°ÎÖg>O'ƒxЗ(-zž5^Ç¦Šø,ô%`0ߣx##FE=‹T*‚¨9œ²DÊÚ­d½í¢é"…¢dûPo´Õw¢JŒ˜EZsðÈšzîØJ9ˆÚ,#„η0.Ÿ•$Lœ¶Ðõ6 §ŠHZx”gÆ‘f¡#M؆ƒ¡~r·Î8ˆ€ ØT|è^ZòUò(Õ!•o‚Û,ÆÌÊÎs‡áy¨#SV ì«-R¸ ûļƒ¡‘ ÍTF+AĺŠF¼QäDÖúèæ&ÕY?Ïg/²ŽÖù:Kʆ|EÙÇy Ÿà‚$¸ƒìyÁt©ðôÉÀí³à7šhÊæ9ÜJnj?In¸Tjú†×_Ú&z?Üìlùæ‡)ÛA–fÆÛÂ]p Žá²móRµvdðÅfáïÌbؘþEpõBGpSÁTP{RbjÇà^ó3wR6V,mýŠ—îá{_dé%ÑÞÕbüÇÍH±$÷ƒy üÆ-:=½Å˜Ö³‚T<Ÿ¾9ü ÄDÏ~ˆ·€%+|?9>LU1dÚ ¼z%”ë¥\£X ÍŒU«rZ’f^ƒèlŒ®„÷“Rò¬²â5ºCS0}XžŠ6†ÆœŠiöl§„¶–’U:Ÿ~A©j»TÕuÉ=ÑlÆ6¨j¢ÐäÈ„Pí"g1]L$ "S4’ñŠa+¨í¸TÚÔƒÅ?¬. ,z=Œ4ÑuQÛD‡ëìq{\4‹§¦Hªº"qÃQïe£Z¢”®+KH8™"‡S Â™*NDÇöð¨™øÁ‰PsE¡X‘[ÆÇà×1ƒ§êÚa›TŽÄA9{ÿÐßý⽓’u­5¶©Pf9êá±<)] (o‹Yí¨Ê4ræÏ\ã[çêì1±]–tÆÄGm‹Àö#JU ÈÆY^>|ŒPÆ(Û C¶Ì´lÁI&>–±Ð®Y´iµâ#–M[,µW¦sÜbÕøVÉ×ò:wøÚŠ”Fçœ_mÇCÊ%º´ïÆÜ’ÿª‚‘˜°8PI.•õ'%vʶ®ŠÜÛãOT3*™HÃEJäɶ[ ©³»°i%댳7*âslö­šU]þ½|L\k5 ClSrE³ÉÛ¨ãZ@Þ0Ež“˜_*Æ ¦©§\¾LŸ.QÑI¸Ý¢ü¾ÖºH‚ñ~<ß.·¥r"§·º&ajF¹x¹N÷“±Æ}?oCê0•»ñÕdBÆd©V¹hù†©ÖšêãåZ»7“ÊɵâÈÌX0’XM É CŸ€ 6çï 5“Ú¯pÒLYëÎH(M™IÊÒel’QVÙ7UU÷9ˆ¸ $E¥6eýßRÝÃØAEžbÇLœBªcT„e¢°›*øÇ” ÷XOE¥È´•ÇgÀ°Ùì €‘TÍâ¸ucM£‚¨°‰Ã¸–«gÎ"@ º˜*³×ÔÁßÀjk›®š'T“‚¹ŸEEìX®«õ`y¢úvª¾Mš“·}=™½ö”Ïâ¸×žò}cÅÇ30¶è…‹_®%jb 7%Þ4—º¿¸Í‡ãmI!_sÊöƒä=ÈÄQo2Ù`ù®4² $!µxÎ|¦é'(†ie@ãÝr·þ¶ØqÙ­­s—‘­ÒÉÞîà|ô$_ª_QûNÇZRŠv×)Á"ÚznÍ 2ÚDB¢Ë_˜ª_§,Î2ÆåTÅ¢øX¼˜J”rhº}DÍð²ÕŒ„³u˜[$ö³·Ã“ÒB: T9]vo¢ã=ƒW6Ñi~¿7Wé½éÏSÿ`ͬÆcbÍ)Sç·wlânX+v”#ØÜ>#}j»Üq¤Žtå…õ©teWÅ~Dë˜)ÿílÏÝNùÁ’ªuÅì> endobj 6378 0 obj << /Type /Annot /Subtype /Link /Rect [373.500000 282.500000 402.750000 289.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps >> endobj 6370 0 obj << /Type /Page /Parent 2 0 R /Contents 6379 0 R /Resources 6381 0 R /Annots 6382 0 R /MediaBox [0 0 595 842] >> endobj 6381 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 6382 0 obj [ 6377 0 R 6378 0 R ] endobj 6379 0 obj << /Length 6380 0 R /Filter /FlateDecode >> stream xœí]KÜÆ¾Ï¯˜sؾ€ €µ’ä@€‚;N`ØF”ò÷33$gv›üšìo«›ÍYZ°%/E²Y]]ïúêÝ¿üýøÏÿß=}ù÷ñ‡þ÷§/‡âT—E÷Ïñòë»ç?ÐÍ©ÿó±nÊ㿾¿>>ŸÿûíÐÝðåéÏç?ýï¨:ÿûóñ¯;ÿðÇþ/]þ¯‡ZÕçß¹þÞÖêü§âöûåçÿ:üåwÇß.O^×/æåÿgª²h«Ë2f^ýí0|¦ºþúï¿Þu{Km ÕꣲÆUkõñ?ÿ8üt~ÁðøâÔZ¥êÊÖÅk^Tëë›ÎÏWº=“½nF/ºþ’y¼Šðp«Úx¿®\œ*ÊTÊÿtÉÍ-uÝèü¯<‰îððZUñ~]¹8U†ÍÅO—Üܺjz•c!@ÿÛã#<¼yr¯+§Ê°¹øé§Æej]ÚËF_6¹l}þsmú^I´ ½.DkË[2<=–¨¢±™éú\a¢ Û .x”•j›x;{zŒÕm<ß­<ÒÎŽþ9ä!x%ÝO€•øÍsãû¯‡wŸ”-Î’±:~ýé¼¶ë;»ß¾žIR¿;3¤ÖåñëÇß…ùô‡ãןí©Òå°ÄîJ¡Ñý=¼Ç +ª‚÷|€W>†¿ÇÀ+E ×ÖÀ§Yx¼Â¼Ó¿Çó´÷á÷x®àÃ|€w~)¦›!Ö†éf:ê|üz>¬ÑÏ™µóû¯hx6uI<à1ÙÓ„÷ž9g¶—OVôÌ`þWOpðJß“jÕx·1'R|€ß¿‡áÓ&<é•yÅI÷Pï0qje%мì‘BXstK*ËÏn¿ÃÌFÂ)ÈI– yØ\¦P‰5²Gë)xŸZ,°\Çró –(“’î£~Íž˜ WjÚ5ÞZ6Ã[eý0ѧQÒó_BËÞÔõ¼VÆÚ’ÐÊ‹Ówýˆ#!{k&UÔi·f8k&íßVóRDLJ£ÅØâº[ª—gOÖtåH÷Mè ­æÔ´Åu¥®8˜ºÇ¢+ýÁšzZÊ1§ÒVMýâJ·ÙÍ’ç¯öfÌÔûFO…Õø>YàÅï1Ê¥… qo *s2ºQçK (ëyÏò+*øx+J?¶ƒ‹Å§§¯/m~±‡½!_à+ž§¹ÛÃ0±gãööМ!W§žÊÍG eê{ŠðSãaQ,g1 X”Gw=ÅÖ]eQ¹Ê ³Ü÷ËõÁHás"rt Éê!{ÀÛ!µS»I»œÚŽxëÒ8û«’­Íà÷š!XWåK—µ±SÇsJ-`×bOØ/Œ5¤›pCÚó¥o‹?#cùô±–„LåÙìå|îá hM2gƒ¹G„—L8ϱ—AØÜg%'0Iµ£š<;Bˆöñœ:¼Ø÷îãñ>Cµ6~ˆÈiÀÔÂÂò¯lè…r©M;"ÜcÎb,QrøoiüʦÕ<-æÄAæÅˆ¯lËQ…¢GÛ0µ†apÜ ¢Îj›ÒÕY»R‡šÏÔI•DÊR‡1àS¥úS]œªZ]>õ~¥{*OEk^Òç:í¯ôpiÉ :¦Ô@ìûAb8Æ}¾²šŸè‘Ë®¨ €‘0døËç3ÖòÔ¸ûÿöΘJsnGüpÔ%=+U ('SN4¸õðññ"E\ýÒYÿ’ë^Wx8´ju¦J¢¿"iõ¸œžA[$„ÁÛSq¥iËMK«­»ÎÕÃr±…ù™àMJ óÎEÌ@ähGÁ7ÊuÆa¥õóPâc” žO;A`Ñ‘“òeåp‡§Î•éÑMäç)AkkÜƸR¢å–iˆe+–Røx&:Ò{½eüÔòÚˆNíJ;Âßc¢¹žˆî«'[ëhU˜‘áš@ÇÓâ‰ïk¯Q…Ë5L B@…‡Á˜<|~ö£-¬ìzEdæu™G&o/›ZµH„¾M¥¬nŠa‡Úz8¨­< Iʺÿ†fj‡™òº–;ÌÇ;)›˶™åX¼ÄçLLËHyÌæB.Sò ò%¶½Kü|ñ™! Y¹ž—WêÖ˜f¡2ó Å;ÌÂ+è[–³ò!Ï8O;”)<–¸¤ERÉQÛÙ•îP>.Oå±M^f|ÄYöÑ+´ð¯„e¦5¶Euà6c,Œ¤ÀùçñðÆâ™ÓâiôG;Àøf*SÛîŒâæ˜+‹ƒ2#›ÎÅQãÑê‰sƒË!˜ÂÒŒËa©:¥Õ¢StcžÆ´_ŠÑ^ï ‚ €d>Dú,¤ññítãçcÖËWgí™Ç•3Í wÏÓH{*畺# ŽÿÔ=pZ•]jxäs\u& 0‰\x^/,ßãYlUÃ^ÊRÇp$#=Ì”aýË&‹¶q·®ªÅ:*Dl¥JpoÉ.`¦âzj˜òW̃;´ !eë,)“k ‰lUZ"ø¥ê¡#(ƒy¬¢YY,õ=2šÃ3ªôÈxbë,£Å¬¬éÓw~Ú”"ËÐÁeÄnøÄR)u#¬ØÝÃ{ËHÙŒÍá B­ `Ö|»AØG-LYf£ÍÄÜ!Ê_dg4¤ê7Mˆér=çs둽âÁÀýɘû å=\Aœ™ 0-d‘Œq'6ÆêÅ%I˜ÖP:¬?Ä#k˜ò/fm‰p”²ÀÎPººÅS9çFÛ—–&",bO뾇¨®.X`&„Ôj¤Êe-/’Ý Oó«hHöás?‘¡še»¹¨ù¤D“s¢)ÿ{õÜ}¦žK~õBòw?Y¤2T€Ê0µ£3˜–Ö}q§‡¦#“îB+ÊÓåþ_å™RÏ~ðËá‹GÇQä—%¼Ü*v²|<)•Ì:º×RÝ‹ªÝ¶>¦0 — Oΰ%”‚1¤–𨠜%’h8ŸŒx(£¨e Y™/]¿$7aËâ·Žh&ÓšC öUë<àæ Ù]×õîcLè3ã¾S¶&P$÷â )2º’©Æ ËVxP‚õAðÛßœ~ØñÎ¥ª’6Y͹&Þy«Õb%ò˜xç \`Šï\]¾ùÙOÖ<¿®áå¾¼Äóø=4Øn2q‰ú¢3TòÉ*å \Xr„[°àcV/íö &W’qŒC˜³*_º~x8WÌZ{}]LUÜ ‘W¦Ÿ×TžC%_—Û½o9Ð$R‹?}@23æ±éŸ ÿU´Ø,™² ˆÿáÂŽT[H¶}üí.kSÇå©4ÙÎûüîÈßì™ÂÝò0æ˜Xm}¤áÙqÁ‚ŒQŒ[.E° (øh¦’œIQ2ªG÷e»•Öê{© ÓÖ RD<ÿMåº&TúwM–ˆ¤õ]“DȨ"³GBp°˜|f@¤)c\$j0–ÆÌ€jÑ´•L&R\ÔPfÑNõµïRÙ; âjZÍó)펦¸}Ã\ñú”òÀ CáR4X¾Ö«¼øvGc†Ø[ª!=ž8>ãMvÀ,H> ²ß“³uÝy‘cÔl üCaÙŸTÖ·´ƒ¨ŒRó_¶Å€,žLnªw©B$@¼øÍ4}[—-Œ¥/2bKØ#Û6YJyÞÚ[€\Vž§íîH éoÇ=!6Ù8þÈ\ À.gü¨üB×›ˆÝhãÿ®nTÝFmé,¡¸+ò Ï°‰/ªîa­³µ~ 2$X΀}TÆ<—nã°ö3\½ƒ5+>E)¦%Ðð BL<|84aŒŽÅ˜=—}¹Ð]Ÿed–g\€CifüÑnÎA[µm tm5{@dõ°bL…–¬âÉÁÈZf$<åM¯âÙ‹ÖZR¶<^t‚ÕmìižU­u–™Ìvg h†o6:7®­qØðmg6*Üc)Š /Œåþheð긕aa¢rl]^ö‘ž}fÊ1n³aª°DmuÙÙµ V¿Ž¥—EÄ S3Ë`×-/qñ(“õí5Ì FX"¸Ö‡H,ŸX™Mš#¦ËUÖŽÂŽî3°“ùµ²=êLjÀZªè/ÜA‘[©Ãö™òê˜áœãR-Ü ‰]WÜ•°É]TÃd™T%¾öØdÝŒ°Éº«ÝQòòÛjŽ’¬&Ža×ÇŒ‡(ãȼñF0Þ“hËT ýéŸ9¯U1Ðgý™ó=—Íœ7å €Ýi ¯i·¶êd”v6ñ^Ó±|;\uï(=Ò‹=8ÃÔÚZ[¯K§fÛ¿‡«.à=pÕ½y5u¦~ÏSø—ö*`ŠÖÄ—ör=dç_ÇoçÓä=lŸçþÂqÕLg*Ì©P—O:ê[_·‚â©[w=!‹;cVŸtwFô©ÆWú®3+ºû T„Ð{Ì\H`jmŸú/Eø¿ØYµî6ãÌv5þÀ^2c[[UŸ¡ðÓà=½ZUAŸþ žƒe¸ËŸ‹,¿Æ´ûÎz.É6Å6½»Ÿ…Û³Æ0Âp0 àMó¼§yýÔ…9õ‡wÙNô~*¾Ò‹±9vü|ø?Uåx_ endstream endobj 6380 0 obj 5270 endobj 6384 0 obj [377 /XYZ 31.5000000 161.750000 0] endobj 6385 0 obj [377 /XYZ 38.2500000 127.250000 0] endobj 6386 0 obj [377 /XYZ 32.2500000 161 0] endobj 6387 0 obj [377 /XYZ 38.2500000 127.250000 0] endobj 6383 0 obj << /Type /Page /Parent 2 0 R /Contents 6388 0 R /Resources 6390 0 R /Annots 6391 0 R /MediaBox [0 0 595 842] >> endobj 6390 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F1409 1409 0 R >> /XObject << >> >> endobj 6391 0 obj [ ] endobj 6388 0 obj << /Length 6389 0 R /Filter /FlateDecode >> stream xœí]Ko举÷¯Ð9ÀjøEA=Cc ääÌf,²‹8{ÈߺEilIÕ*“jJ®ñîØc6KÅz|UÅ—>ýñëß‹þV|ºÿúŸâ›ÿ~ÿõ$ʺÝŸâüõÃë_(WúŸ‹ÚUÅ·_N/ÅËééôÔþýrê:|½ÿsûÓÿ Uü©ýÿçâ¯kù£ÿÐù¿œjY·ßÿ}ùÞÔ²ýI ßÏ¿ÿ×é/¿+~=Sìç™yûï´µÂÖg6ýrê‡)/_¿}ûõô©Àº§ÔZIm iÎ5FÿýÇé§ö=yQ6FÊÚšZ¼çAµ:?I‰ö!ªieSMžsùŠC]¦ Þ¸„ÄϜNJÔV‰ÇÔ¬®DBÍÔSߘ„fsá<•f!ñ˜š5õâÑ:…ôò ˆ[•Ði/œG—J¯[L=¦r­óŽ¥¬M!—ÐoS%´œ3çÑ¥Ò+S©Ü¦©½€ªiX ÿ||âZš„ž{á<ºTzåbê•«•ð®Õ†òȧPn¥T:âΣKÅ+7@=¦r«:ažüz ñ[›Îq;ÎeS˜xLÍÖÊûUU'Ï@=…ðë:]¦Öq[(½f!ñÒYÿþL|´;?×éö¹Fº"m(hœO„\K-¾jò ôn\•‹.œG—JoUêOk¨`Vºß€™Ÿ—@ÇÏϧOM!mñüSËÙåÝ·ç_N¦ýÇy®Ç4ÅóÅï[~š?Ï?ŸdUŠFŸ'ÄΟ»´¨®Å•®V½n ¶Ô°åþÒbJ£»i·¡EË®Ï÷ZDDŠõäU×"eYëÚÆï}¾\ZªR+'ßR«.-ºïòªÅ ç„y“„>˜ƒ‰ ¥^¯AÙ‘º—ÊÌâç ‡q+{ôqcùÁdáéà–鈱5C§ °ôyL>ªÙaõœSƒîª¯–Ÿ4<öyŒXzÌ”_»À%`Yú»ç|ynÃ\šU ; Qª“¥¥­å›±MD¶8B4ÃÔ4D£ ŠbØ×¨ÜÉ¢)k[½å„”'`Cvë%KÁ\LäJÐR$¡ Á Ûê KÁ¤8ÉØî°LÈ:V c ÂØŽÍ-¿xб…”–^Ÿ"aò#8òC¬¸ã*#gÞªy&ì¨Ï ÙóŒ9ykÁOñµxAÍõi õÀŒSÃ\‹G¨^Ìì#;‹³¥ºÈóªñøÜnî9¹Ý¯×œÄ5 As²‰eÈÒ”CÕÕÅ–•®û £ççÂÌùÞ¡ùˆZ´…-Rƒ}|þ0ÓâÁeŽšÔjÔB’æÀ¸¾‡r« 5Øg°¾iË”æR ŒÊMkØZU\°…`4죷ôÚÊf#«Û·äìµû&|Îí=cA6žÞ~“ÿIJ؛{íÑ<]CDT+×PìÏ·öç…ÂQëa»,q¡åÕ»®ZZ`ZUháñÊP8R¬ŸÀxâ–Õ\î&§Úi†Äw……@J(EüÜêÞJdܶ(Ø‚mKÛN$´ƒ ¸Î"Ù6Bí@V9'Û9£©ߥ§slËQ”|›Ïqù~ Dá’Ÿ1`¡ä7u?S¿Ï’ßò ×ò®ánU¾s‰LY•ê7Õ1„eû`Þ*%qÀ¼Ý¼xÎY:8œì Zo Ù€ãÉ5Ì]Æ1n0n|HÜÀS ˜žb Œr­ ÖP&²F;H yÁ\Gݾ¯ ×X¢‚Pºn6áD(©HÏ"5lÿãÔpçÈÓJ9 7eªœb™àF%Y÷{Ç ¼ãGnü\ã>ø9p9“Q( ¢,&n•Áቊ<°³ÞZ"9·ì;)Uc'cç~±“À5[UÐvâúv±Í5Î-;m”‹?ðâ5¶e¼@†±“#G0Ž`Á’E0'ÜÆ›sË>#X`“^_"̆Q6©sÛkcýµpÄX ø’߽ǂȫx­•€\Xs¼ {¼ø±Ï h+®±Ue ŒÝX"9·ì4Ä]µáXÀ± sTÝi,àê,o‹Ï|wš³|à鸱:p ¯(íQòÀáeŒ»Å ÊÎö¸«×jŒBŒB= 5‚OÅí…HwfcéàŒ‡ð28F!F¡+PHñÉÀ½£_‘7¢dpDS÷KÜû¼bûŠë”‚à×qÁ7/óÕ ÂÃ+ß(ˆáçæé$_â`·—FhaøÇq}“¯“Èñ3ñtËwÓØÓùˆÃÙhÎÛ:2¿˜A Ç÷²íøÊF»<ÐŽ··ñá£Åh$…eÝ7ñ±¤d½¼y|;®3?H¤¥âÍÉÇÅu^rωo¿ä®¥°Ë%wÿ*)ËÊØ·¯¶ÆËÍ·_¼VøÚm¬^ôO•æ¯ï 8Òýœß‘G2§*Þ%¹w‹å”-oÌÄÓk¹h—ìéy{:/paÏË,D¼%x –k¨KðËŸ± òˆ¡Í2âs å?†æü_ŽïÛÅ÷×г(·Þ“d€yƒú ÄìÁœìÔŽ˜hÁ‡Iöž`±/»r]Öp][¢‘chè­ømŒÞoúpEÇ‘eÃÈòª¦<ßõX‡C|Œª»Ä³ ŒƒDÌÃÓíQ |O—ÐÓ)3Fx{u ƒct8&:¸ê Úú@èÀ@dm‰·¯®X¢Ç¬âŒ0Õ0£wÞèÍóv9xÉí# ïÄàh4D#ÕŸûâU¤½F#ʹ/…/ à÷5e€Ñ$‰Þ|±Õõ¹Þ6ÒB {0žA㊎¤’ÿðȽj.ê®IÊx&Y–QﱤƒëûÌ¿øÚîð)÷UcùóÞ=]aýàAl±8æý‚èeÍù q6,÷œk¸ë‹ñv¯x«ñŠ^ÿÀ)öMFUFÕ,$à:ã‹_ñ Zä÷{SV# ’IkšƒzÆÚ)°ÑÚ>ïõÜã¬ÁÂuµUÕoÚçuµøBV|QjÜ÷Àú07sa.e¤þºÂ9 oøŠ[½ë\Ÿ¨×Èò…¹)‚³G=ŒµÕ…¹ºZœ#ß9À‰&N)ð¶éF¸²r€ƒSwœllGââ!‹4Ü*›·j9š§Âêí½–#K6`øÍ1{Ǿlœ=}¡à®ÅÀæ=*eoȨüXWáò¾5…Rhá"Pû©Õ7]1RC)Ò£r-ð.ñs(å{ uJМç`“`VWÞÊ<0\ã5…¥›2¢À2s‚’ò"(§ú-;k¥.ugpß™y@-¢ö¦ãíp‚és}ÔÇ JšrlÖ~p†šR¨€ãñKzJöv=6ëuÏãñËY­¡¿ôñ“1·˜'o>3h½jé’S7vð9h|ã™Ô@ª˜5 É× @ºî9˜Úx>•Ÿ!â£Ë\¤0<–ßõZY *só»J RÉO@æøowcÉâÊÁùÆÀ£a¨§(2Ç–,¦}ÃgåîŠDå‡ûà猥äãܪaŸÿ“4ìpè¤çÿ›x·‘¶ôÙ•Ï3gZ4æK§³¸ºÔ °¥–jd‹Žò¦`K@:ƒŸ€†sã\{+〠ë×¶`¹5ëÇà÷# PSëíÚãØL¬ül£˜S¡>¾%ýôi3¬ÓëA½“ðCÎd:Wž¸V§LFâp`îOm@pÜ¢Ll”¥PfÃðs¦Sxƒ³]=W•x²‚’‚T¹b"5ʺÄF‰g\mL1eÅ4Ãä ˜ÃVßia5I¥rÆÓ¸Q¬¢P¤Ø<¡Á†X$ÃhBÐb`nrõ÷¬À¥0Ò ìØ D¢ê‰d¸Œ, aeã ‚×WaËŠX.yøâáæí"§;ï‰ke„ÜbMZ5"ièÙ~›*Þ÷7§~ØBIfîŠELXÓ GÊbÝ9†Z)ì8ÖNÝ {Ü<,ÆZ;i»PÜ57œà>àðx‡ÊVéñͧ¦IÑ#*ä`;ÀÇŠZhÛEß f¦¬Y”Ïf~’xÛ™Fî1 ø”š>î4¥öZC ž‹3jÁŽß¹G3y@VªyC€2–ßÒVAq‹ƒ5e ÝuÓîÐ~“ÊwUçünß’44cÓß6Ä[_^< bZPî‡ Ï¸6†à=JXýøT?å ">ÔB0çÀKs܆:©†Í)ø$'>Ï’bYaPÀ@‚OÛ^xAy { …À¾ZZⓜxpEnâfS5©K!ÏÓF—ó¯mÊ­g.R©éaY3Çhõƒï3=%)r‘™çè¥ÚfŽ·G?RtJ%püx Ôx'ÂÜqCÉ×°Å aHL öñ[®ú«L™jpçŸ[Ž{EcÙ}!˜–4ÝË»ûýë9V4^H„Æ&€•x†ì·fMîÆÃ 0‹ÏÜ;hGXîývT ]z ºÎ œ…U¯ê›E }*žNÿ%º endstream endobj 6389 0 obj 3799 endobj 6393 0 obj [378 /XYZ 38.2500000 375.500000 0] endobj 6394 0 obj [378 /XYZ 38.2500000 375.500000 0] endobj 6392 0 obj << /Type /Page /Parent 2 0 R /Contents 6395 0 R /Resources 6397 0 R /Annots 6398 0 R /MediaBox [0 0 595 842] >> endobj 6397 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 6398 0 obj [ ] endobj 6395 0 obj << /Length 6396 0 R /Filter /FlateDecode >> stream xœí]KãÆ¾ëWð`µì@`gw ‡‹ ‡ ‡`'0b#ò÷C‰¤f–ÔW?›MIØ3V‹ÍêzwUuõû?~ý{öÏß²÷¿þ'ûÖýþøu—ïË·ÿd‡Ÿwo?°Õ¾û;+«}ûe÷’½ì¾ì¾4ÿ}Ùµ|ýøçæ¯ÿe6ûSóïÏÙ_ÿÖ|øc÷¥Ã~Ù•¦l~ÿûø».MóW~ú}øü_»¿ü.ûõ0cÿº˜ïÿÿ+ÊÜU0.¼úe×/Ó~ûöëî}‹€io)ÏË"3ÞùÌÔÞfÿýÇî§æýôù¾öÆ”…/ó9/*mó&W7(6¶Î³ª™mø¢ãÎôFr_¿Øä-äêX1®0òìûÊ;ãJÛ¬­!ôÈ¡ªlówóTûÏ<¤ÕyÑ!­^€ào¦×Ÿ<äõ‚Üt„\+Á…Ù¥9XßID(@ÿiö%hëš›ü¹6R:ÒâÉåÐü,HíÓìKÄçõ‚¬t€|)jÃÉ5åØW076ÿ د–“µ"7fA¾9@®Ž•ž¶£Ù¿L™ƒÒ~<ÇáÁ§çÝûÌQXŠìù§¸ã;Û_Ï RBöîà.6Ø~þ1û}ž»þ=ÿ¼«÷… =ˆíHnшýŸqhÄð™Opäóô÷88’×¶ Îæá3pÄÂ÷ä†XéG‚rúžÍ=G>?7̽4_šæ —àÁ#yP]7ærHGÌå˜+\N¬óò“æl9” a6ÈËÂ3X °aÍÅÈLÇUqøßVsø_•+°&õc±eð˜Zº†úr}yƵÿc«…­£…|€1Šm c£Z_Î&e TÕV‚d@,ÖËË}I@½M½a Ôº¸¾9íPG”ô¢¸UIÇïQ•M‹wT1éX…ÈtIJeánBó‚Üor'ÉxT kE<5œàÏ1±†Hö9`ÊAîÅôö@‘Öƒéƒw0Û”Æ«Ž©‰mî#kbLaÌ M¨a\[»¸‡à¼ÅÒº8À¤¾¯µÖÅ–Mb„Ùíh¹æÕèr숻ÝÑΚÉá÷Àá"+µÑ}:•Ç>q>Š·Éh»mFå…Ø–&(Ï—cØ6ÉÇ»qt[˜d¤iýèÇÖr’´³¸à18gðJo-ÛúðínзKÃë«Ò±‚}†<&̆9sÖvDV7ªWQÏ©õJz„‰Wbj©fŒ™¼@LévfNTÊ#”o†­5öK05”µ¾? ÓÇõÁ‚·‹gS­ÅÖå7&oÃø2ã`õºRìk žžne+^)Ž?™SB‚©<ÔêÚÆy4»ëb×JFÁ¶ G ±œa­Š­+–tBf°N‹Ê/!vÅÝŒ]XŒ”±k×¢®®Ž]rk±Ù4*,½™S;ðˆj\į‹“|ì+¥gûÊǾR_)p¿ö: Ÿ¥L}GãCô¬õc§±Ë­øÈ¾ªWxk°ýΟÇ#‚öÃWÏ«ž$"W3¿ëR¬ý¨± b‰Æ¸Æž QëDázõ³L÷6aÎ&øp6"׷ͳSSŽéÈÁàM÷T CŸHŒWŠ5Ö|L…¼ ý (]Ås|[íû¨éýô]ŠU Ai|bs?64fÜ,³¢ç«WÜÜÚ)Tݸ|Põ9Œ˜û³ÂöaÝý™ÅÑP, ŒÿÂÄ ˜ª\Õª‡M{CqøÒ÷ñ1Áab䪳Qù·ŠhÑŠb™h1>•¤›!ÎèzgXWlÓ 'ˆu½ZÕN§Q¥©œÕôÑ­i šÔ³ºUbO€‰/aæ”m,yÔ­dI]ºw®ÌØý1Ü·¾­$: •Ϋó%öºp¬7Ví•àá•ü¦ÊW÷Œ3Ûꢫ¹bZºÒ¥Ó_’êhWaN$/fd¦,çÔ´2‘E!¶ÏD0™ÓXÒbòHíV weúHœ!Pƒãó˜ªøž$&ìóÚ®µ{eŠv¤ÚWu~„tÈHçFJ8Ò2’ß{×^ž÷:âшA²tûà‹ê;¨;“Z]ñâ®.ʸ½³ u›I ô⎷Ïäp¤‚ÀbDbti,½s@«kV ±ÔÕˆM"ƒ ŒsïàuÙ “mGŒé—:ô…BÐ7+Å8€¸¨@`TÀÛ'¸Œƒ Ê”A…Œ˜’RÈè”îÂÏÀ÷ŒßƒÅ“ ?À®ñ3tñäI4’!ؕČ,Pª:A 2\s=–ýçxþNíú˜©…5fD7/d+‰ÓF±v¹Œ‡-TÜýä„õð=Lãðe¨"óeѾ„3c8bƒãYž8i HÜ1ëFÔ„Ùˆ¨•ps[Êë!øMè4i=ÈÑ2U ¬KÖ|DDúbÌ5Ž-(Ë|©ŸÆYÕhý;—ЪqèXéÐ÷ˆ•oZšĠcÈMH†ŽŸ=]ŸŽ¼CGç“¡£ÅÖ6ñâÐ1¸dèè! #ï5Å¡cÙ瞺ˆùâ¦`^·l0-zºzø^ž·ëy· Q{"wÂdH”ó 8Ôˆƒç8²‹s 0HíB –wS‰L'pÝÝT]ÁGb6#J:Q{çø=8[4–Hz™OÓIzrÎÊ"|?›®òŸ:D¥¨œã‚Ì+Ìv#Ì«˜7_2ÃäìÀJ.Ìâ ymOÉý(¯‹¿Š ž®Ÿ„ÑgŒ«B¨à`!,£¹ NuâÚ\cÉö24¥äèú’áŸKã¡`^Uõw(’q߉jÊ›!J)Æf“ð?º¥É{S>KíLQÁ‹Gs¬#È2á"|™#”1…† HX„ 3ޱDHnAËTíQ¬:/•zÓÛpñ¶Å vimÕÇ»NÍu6%íLa›` WÛ­fÓ)E^Õ­õ^Çñ±˜-"–ÕÌ#>ò0q²!Ó-f4)!>Ô©‹ ÙÌ-ÁS?é™gLA¿ÆbÄY¯¢,ÖkBŽoBô’ ÔÅÚÇàó˜ŸVwêîøè‘Q;Ze¦>ëÔuRq:ëbÚã©&ß·‰­0gFº„½eÃ>LFxOžé dÅúB®3³uE ¾œ}5ð™Ž{Î=óŽ8¸R8›…#já™'„·îPø9´¬Ø»£­›¶sP?Aì+f hÄp6Èñ~™„×ï8ðÖñhÑkšs:vĆ ¯T9†>jmz<\ä1ÐX7´ÜRîÝȺb‡xh…54ÁGF ‡Bd‡ðA·˜¼2‰Ì hlq×ÚÃPH\…2ÚJ9ZÁ‰"–ÁìÞ© ß„L\zB¹Â­¹õ÷ënOˆ#U’D.]Ø0ÝO Ç„þ%ï \6䥋¨^´î«˜ÂéÖìi’r¦Ú 'âuJöõb¤N±Ô½4DÇÈhoUO§à^ÍÌ)ÜGçg®ó³^G¸ Ûwº4w›'U„í“*U Ö”4àýžÀ¡v=·‘lÆf\Åbz¯Q°LªMU•PÙmÌù¯rJS°…ñL„hò`ô¬êö[P2Ö—Â?‹nK†¦0Ýmɲ.y(«&þÛÉ[29_…!Æ:”§RT©&V¥ àúÑ‚mÅ#™e‡‘’Þ‘Y*F„}/¢ûðòV±®†Vq[^‰Š'rÄo¸Œ˜A;÷Úvýö¦ªA;Üh…jBG´wÔ]i´¦‡ª—Ç‚Z¸ø’¹† 6™µ¡ýÚªÍ/!ýë}˜5²1‚öT56B&ki"¹Z 8Õà:/Ý•ÄBh„:D„£º 7·ÏÙÊ(@ˆ¨šîMBq=d±©H&Nϯ~ôeœYg.íÕˆVOŽI¤|º0銋Å÷P¾û6¥n‹ `å¡PbdKØLá¾6£“(kÙÓX).!Å\±DD‰\ tÊý([V·›hœÒD€ˆ±(Çì°õgÎ2}`Rîž§rñYJ]àêrd‰û¤¨¦X}¦¦œcÕôúv=ºÆ› adÙâ}ê¸!\ú”ž"Ì©ö}Êe„‰Ç˜eŒ¶`Äöš ÕD‹vW8:ÄœŒ2™¢2ÖïP¥‘å¥Â‰–rÀr•rÚ£L22Ɉº`N×<à —…+±qÆæE„«·ñå{8—ߣ[pK°…«I%ÿ’£LÉ¿ÀoOõÆk ióóº±ÂP \ޝ"®Åù{êâRæTBjsl%Øf\ƒŠ¹*ÿ3‡ÿU¹B¨R+\‰©¥Ka¨/×—gŒQKð¿`Óñ{p ĨpL,ukR^†Gw$š†¹OíèÞø­êÈøÅr‚k”/êܤî3j ÅvjÅ›Óp¥©È«d¤ _À©|Í&¦ã&÷qŒE¤âXšð” Á—!â ŒŽ˜ ðŒkÁ—'41£1®±'¾MY`¼Ã¨ZuxÉâZ•ª 'hBÅUµ7¾6Ý0P;†— ý¤»¬íðHê{­âõŽXrFŒ0Þ»Á^öƒU# Êñ,"tG;%&ÄßG„gˆLÖF÷]L¤øÒy¡µý"$£í¶)bXšp–Œár Û&£ËÂIÔíú•OFšÖÊà“¾˜ÿñÉËõý€mê!ÀyÔ„WzkÀ‡owƒ¾]^_™»‹«[ÄAf˹k;8[^EiçÔ%=ÂÄ1µT3€Ø¯IDºýœªœ”G(ß [kì—`#rÖ”µ¾? ÓÇU³‚·‹gS­ßÖå7&£ÜõgõZGìk žžnµ%^)Ž?YPB‚Œ2°EÒ.6¡/Tv·¸ŒùŽ`Û†£…XΰVÅÖK:!3X§Eå—2v=âŒ]XŒÔ±kÊb®®2±k;n-6{±‚#ÝœÚGTã"~Cìœäc_)=óØW>ö•úûJCˆø½°×Iø|_ê;šªŒžµ~ì4– c='ßÓG®]ã­á´Ö»éÿ+âÜ+€áßG .¶¹úiGŠ‹š«˜CZ=Ëzk§ˆtc1ixuÕGåÞÚäæ'{i¦ßþåÒ®èÚUÍ·ÏÍ¡!hvº»ã‹s͹Zl•gúOµ:Áîíñ…ñ.¤tX°û®!é·àŽÒgÞÓÑ÷ä<ÛÝJQ¯iÜÞÖ¿‚”C`M·ôÑ;㇯½ÅýàÎ,ÃàÙà3]{3iéå+Û² wø»¸'4ÆÝg‚0 ¸ßíçoGÌи7|1fL4á=p]Tã\/ìÃe0ÀB:ïajTóù¨ÌݾÓA×1”…7MwlÓiãKš8û²û?ÌÝ.6 endstream endobj 6396 0 obj 4039 endobj 6400 0 obj [379 /XYZ 38.2500000 537.500000 0] endobj 6401 0 obj [379 /XYZ 38.2500000 537.500000 0] endobj 6402 0 obj << /Type /Annot /Subtype /Link /Rect [142.500000 669.500000 235.500000 676.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_overloading >> endobj 6399 0 obj << /Type /Page /Parent 2 0 R /Contents 6403 0 R /Resources 6405 0 R /Annots 6406 0 R /MediaBox [0 0 595 842] >> endobj 6405 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1409 1409 0 R /F8 8 0 R >> /XObject << >> >> endobj 6406 0 obj [ 6402 0 R ] endobj 6403 0 obj << /Length 6404 0 R /Filter /FlateDecode >> stream xœí]KÜÆ¾Ï¯˜sØì&›‚’v ‡‚ä`äÈqÃ2²ñ!?3Crv—œ¯ÈþXÝäÌÒB¢õ¶ÙªêzWõ»?ùÇþ_¿ïß}üòŸý·öï_vÙÁYóÏþô燗¿È«CûóÞWÅþÛ÷ÝÓþi÷y÷ùøÿO»æƒ/ÿzüéû|ÿ—ãÿ~Ùÿø÷ã/jÿ£Óð}ç?þýëùïÚ›ãOÙåïÓïÿ½ûÛö¿fì–k7óúß°e•eõi#K?íºcšóŸß¿ý¶{× loËÌT{ã¬Û›Úåûÿþs÷óqnúìP9k¬Ï wü¹.ÏŠªÊ?{ÛþÃ.îóÓê&;®ž×Ù¾ðƒµÏtf71&/]ÄÉO;׊9Î+N~¨1þ„å9dÕœ 7e_F€ÏeöÀÏkqòÓεÒaN®‰YëlžºˆŸËì1€ï¬7ùyçÚ@é0 '?Teî]‘ÕüyȪº™‚‘Ëô&/‹ˆ“Ÿw®•ßxvÍ«ì ¹ÏÓG˜¼Î#N~Þy4äâÙ5‘[û²Ó­²ð÷ñDð@EDÊ9í\*rñìŠÈõ¥ïtã"Àÿyú“û*ÞÍmv®•¹Âì‘-¥£}Ú]·+fÚ|°=OaòºŽ§v5;W‡J‡ðÁìŸCfÁ[i~,ü'áÃ_wï>uƒrÿõçãÎÎ 6}ý¾sÇ9ÙôGbûúÓþÇýÔÚýegŠCVÛ“ããôßGòf¤:TuVæ/G²Žx8òñ<âÎ6î•çušc…+«ãàó7ç‘â`óʼž­8Øî“#­#|wmÊðó üi``»£>dpo•& Œ%Ö'µst ¶1è@ˆRÔ‹! qŠ¿±ÍÞª ÀÇ›H×q–8 ^ƒØöŽ.p¼0¤‡¼ÒÄÅ—¢‡¬êM"ìsB0Éã×£X‹$‘ê¢/’0Û‡§O0ŠEô)[¸.œz,ätêQMúÄÉË,CÉÇÜË>Íc¡¢Â½øÅ»}Æeèzkz0ÿt^¶>œ·÷Š#±ÙÁIÿë±B”˜¤GÃc*Hm¤uÁæ!\LZßžÀ—E÷òb2â©+ÛÇÁM)dÕ V± Ñ`”Wǰ ìŒ 'èx³paAШh[„µœJ[ehV fÌ1ñ2³z†`ÛÅU—ºÃˆ†þ/\OØÒ^œŠt;†¬þ€/=oD”–Ææ-°9¶É¥7¯ürC~Ì +o>ºÍÙꘅÝ ¶B\NX!Ù !×êh  PUÝf /˜ñ·RžÅ¥Æ·Àû<…î¡dÚ©ª¶Ã°Þç#ã²EÂoMÅItU[UåZˆ­^0*îƒgÃÉÄ}0DÇD]Xä‰ñ¿Åwã¦/M0t5nèPßèz LMâêYLSU9q*é|w1Â_Ä–’yƒCM*ñª0‡†,qÅE‹JZè“åhPa $0UŒ|Esµ­ûbî>ÂÇwâ½føšƒ|mF€),_âýô»¬êY  G­«$Åɚпq¦»2¦EÅ0òHŒ´tmäɈkÑÈ…´†#ïÓì ¯cÃá&ÌV½ÁuÚ«²à®[ÑumâT8ÏÃÒçiãóA߸îÍŧ­ ÒÔeÂ÷Pš©]:‚ÕãÍRjüt¯± /NˆÈ*¹ŽG›„„CF¼Œ6¢ëâbðÔ°¤+NCÛ‰ Û~4a„ñŠ ÷vÓ®RhW¹«»ý@No°Ì׫]¥:£ÁdXFcyKèx¶ êÅÌy„@èBÔBl[¸k['¼eu§70|GtG›Û×à`r ®±è²eë™F¨IW RÁ!Õ*@F8(‡Ú$³°n^Ú@7ÅáWÕüK&{?$¹ˆ­&ÎÞ?s“—ì J&Í4>c¦ó›=F»’' Ê `’OÓí²ûp5'³<îÄŒåëc/R¾¹}fxûN—è|‡Ü©zÿ}Wöå/~Ý}I^ }ÚBïbßb‘PJ[ÒúÎQgaA ÖWs쇅¦~eÆòafk%Y^là7ï ëùxìAÇÞcˆ9‡w¡qZ¨Îæ oÃcCÇ`Ó5>)ƒ9|¼78‚gÃt€­:lqn^šÍK#C”ñÒôö!¡Ô«‹Ñý«¦ ›¸˜¯c‰ìðÝÄ´ÌÜgHIX,/ß1N)n‡×ÁÞ:Qæ6n%Ô›1÷{úpqݪ© s\y ܬ0*ŽM—»aUŽŽ·¤[n‘ÊË+ØšLÄ™)O ܰŒ§†JøžQg@aP×®[z²|iSqË¢hd±`æœÒgSäy·*–ËXŸ‡6Ö¨°Æd 2še§Bƒ3Õµ`±]Gèµø]»[°m±ýˆõg8"À φw@ÀkÖ™Z¦ä„û|É–f¬Q µvÁ®Ã8!ì!Ò?¶ƒZÆCÌ…°/Ûh؆VÍú¨œ°9Ì嘯3çav÷†ýh_7Ø[†eqKl’nd-ß(Ç¡¨<‚¥ãÅÅxÄ2À æ[ÕÈV52¢;lU#ŠU#xšï\dضÑ:ãØ¥`Cá|7ñ7 'ÆÒ‘Ø› saþ„÷gd-¼3˜£Ÿˆ§1˜fK”3ÁœK–d±X‚t­_Ìñ•s°U)G\™» Øø"½B×þÀ«œ^Jƒ^(ø&ò#Þ¦ç/%îë¬k‘¬1Y]”¯–›£07Õ]<àýU&>¨›ž!„Ϧ?ÞJ½f…CnD—)Ý@8>ÏŒ' ´á*yV$ð†¯FÓrÝ®ýTß=ínöv-ñoú1}–uUðBWöwAIåΟQ•œnAÅ$z„QuÚ©zõ3¡PÆ‚gc}BeV¾çóÛé§ œc©½gÞg¸1•üDb‚€¬$JNÊÜ…*¡¬./vUY­Ë!•õ'Õ>õ«NÙaÒñˆîKÌÍPîŠ!ŠÓ6˜ÎC©’ÇX¯™W 5ªB‡8Ç1£Ñ*ë++NPZaކ­ÓHäªKYP–Ⱥ–0£•3Ú?¡G0Vºn·.]žÆôÔMIöŠÓ'Ý©¾¯Di€x¦Ãd"O”o.–.ÿ§à[&´K¡û’ªD9‚± îÍugÞ‰U¤bzãæ$w0oÿa<®Yf0iOT6fÝp ßÀ˜K—¬âM9çíFLõ^¦ð®Šjß\ê%M¼7¦Ï&îWO¤c§’gÂ[ž8ÊM¼ÜŠõ€¤÷¬š }0ŇŒFhzóòêŠ=1Ô›¬ðSåx†nE"£Š‘Zº™~”t\…rÙœXn²8¤KœËfpÌ ¯ƒqgú¼.]®ƒ^òÔ±é^nš¿¸9±Ï”þW ¬ZdOl{@¤óÅëi¶¶Î;x3uUNï§ ´¹-­/|§BZø˜žòÓ“ÜT+[¡á%ñö`ëóyÑ$3àÍã7×ATù­HÜ6¿9€,¤jgÃ7˼:h\K]ÛÁ$ÂŒûÌ9u}]þÄt_éÌlÂ\ùùYؽžópãz²K`àÄCǃg†™—nCº‡ë>Ó<à–ør̦ñ%À›þ–m«À;Ñ m«‹0‰pÛ!}0bAƒ/•vépaåGÁu;ì3¶«ÊJ°Ö}ZWtP˜ƒ0P¶RJ4ØøO‹—}™H‰&La˜ŽˆÙ:êË^AíÃæ‡ê; qž•˜&½€·)0ì™›ªºŽî½§´rB2ÚE2y7‹aÇæId ¦´˜T,ü¦”ç1l$pÖåÈ­_ŒB“¹> ñ ÿ å!ÜsC¬®«8ú É€)0ÞçDŠ86[…{8]ãxá$}ä-nØßº¢kÇ·1¡¨ìÞöN½)ÎHÆU]‡‚³ƒ±½Åt¶æ¦G6Ã2E}éÑf4]¡<‚加1okŽ1Ã`ÄÍ¡ŒÐÅ•‡û’Çap¸*r¬kè¥2WT=À9Üfkö ÙLô%Æ•Žé³­êç ] ÊßQ^j¸…³2\0ŸÂPgnªž×¨æoW´ Ö|@tŸQV§'è Á¤¹{ÌMà «—£#Ôe*ò›8KRÏßœ5Ê3cšËYÙ^ÂaHB×ÂarWá:–ÁY";S`yx6Ý䯥‘Ce¥à Á…1aPVÄ Ó½t­€TÑMÂ.èõ%tÌ€ˆ›pÀ¥s-ÉQc®™ïÉZáÚ1U ¨6çø<ž‡£Êò¯D¹‡Œkz˜K®›ŒÈù›Œ%0ÎÊ™œÖÄJàF{n·Ô-wººÊÅQªnxÌ"æÁ8 U½Y NÈêªê㔆¤äÔIÙÖwæ_u Úôš§å“ÆÜ£Ö5o¥â³®-ùzj™hCµu`Zúa0­np3]¢ƒÐ¢SÈXÝÖ(ãžeÜ[û"ÕFÁ¯bÚ|%|ŒÉçsšÐ3OÍê¶)-0NRa8aû8yT]¯)ÛˆñZ™.5&oXÍ•ê0†@˜È;Ñ„a¸éT™—x6ÆÙ¿|@ºÒ¢Óm¿æÎB³}ÍY6+ñ ýÆ‘«uqæ*“`ĘœŒ[Š©Pm0” ¸Tüà(K&v¸ºêI¤!=1‰ÓÓ·–gEw\häB¸ou³Ü©Âˆ¥Itý–!™ª‰R:¿ð `è|‹ëQ×g…ª sI˜>3Ò_¢V? êôX ÅZSYXH=º—ž_·ÄŽWšê¤ŒÌ µª\SFÍD-ñlÊéª)› ˜h ÇcÌÌë|ïÉ*Ì*{Z[aV²Ú¾vá1T‚¶èhUÙ?ÚV ¦“‹bêêb*B)Ö[vkXÞÛâúÞ Šó§{Étó`ÂBºÞ f³!ŸËwÂÕuD›$1Ë÷\_|nr, ™ W¨t z/¯¯3Úƒ–÷¯ ÆÍûe‚‰£í§ãK¾¥ ÔÞÞ8)sy«ËØmχkÙSÄó¼ŸnþÖòí„“ì´•§—úòŒq2zÁØúGR=ñ™ð¦Ö—1Å ™ÓÅá'’3˜™‹i^ _ÕÛ€÷6šWž—‡zSÝ c˜áŰ~ƒšm“¥ÁñÏþéH´"Mû&XÜÕÕÌÆ2sªÑÚç]ÅPf ­ÕðlE©j(.?äg³ðåHc-—Ñ6‹9?´5bƒtMÓ|@ëØ1÷ܵ½}jOŠÊÔ°åáž·”ÁÍšö胶‚ [Øv¼r ƒgƒß´†š :º&[–àN?wÜ!Ãî‘  H¶ƒwóû—#¦hlðÃ…1 `¤ ëÀc˜ÝÙ¶ÒMYon©UÖ®ÑÆF5ŸŽ|f-šFP9tw½æÆcœxÿy÷AñtO endstream endobj 6404 0 obj 5026 endobj 6408 0 obj [380 /XYZ 38.2500000 764 0] endobj 6409 0 obj [380 /XYZ 38.2500000 513.500000 0] endobj 6410 0 obj [380 /XYZ 38.2500000 764 0] endobj 6411 0 obj [380 /XYZ 38.2500000 513.500000 0] endobj 6407 0 obj << /Type /Page /Parent 2 0 R /Contents 6412 0 R /Resources 6414 0 R /Annots 6415 0 R /MediaBox [0 0 595 842] >> endobj 6414 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F8 8 0 R /F9 9 0 R >> /XObject << >> >> endobj 6415 0 obj [ ] endobj 6412 0 obj << /Length 6413 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯Ð9€Û|éÖãq€6CCàÍ&Xd™ì!?Ý-if¬î¯ºõ©HI=Œ‘x2²¨bU±^$¿zÿÇ//þù[ñþáËŠoýß_vf_—¦ûOqüóîõ/\³ï.ê¦,¾ý²{*žvŸwŸÿû´ë^øòðçÃOÿ+\ñ§Ã.þú·Ã/ìÿÑñü²«m}øûß§¿ÛÚ~2Ïÿ¯Ý_~Wüzqø\OÌ÷ÿÿ¯š¶1G2®|úi7LÓžþüöí×ÝûŽÓ¾Rûº­Laƒ…mƒ+þûÝO‡ Û}¼õµ+Ãáç¶ µ)›Æ~®}ÿöãµ;~½)«ÂºöHÂùÇO”†0xÛÖñ?Q®Îë++¾oƒµõQÐs4ë4‡Æ´®cPYësèeôìolhâ ~¢\›)½hñàš’u‡_ŸØãÀ çácp¿tõæD¹:WÙâÑ#Û馬ˈKùyô"©¼¨LGÊc-e8¸æR®«ž=áð5}=û­óõæD¹:WÙâÑ…Ûº¦wcuƒýM<'ÙúÊGTœ#åÚLéE‹×”ì)b?²§òm=¯Ïý`LÏw”«seíÙ蟧Œ‚Ié~¾'áÅ_wï?Ù`ÚÂVÅןľÙýõõÀ”²xwÌUêP|ý±ø½1Îþ¡øúó®ÝW®H¼ñÉã×ÃtçQzXí%2]u$³1~ Ó~:}ÒxÙ‘óLŒýˆž˜úô¤Ü»ª{ô2¦¿c*øN‹Þñ¾{§Ü7vDµC£¹þ‰Ý—­¯Ë›žX(°ŽŸàùØÝ;n_Õ¶9¼ô2Ú(ŸNYª½ïXðŠ;RðΔ¡R`>¼® †`m§ë#Sa¦£˜êÇîIµoZs|vƒ^c¾ Å´áï<œžÔ{ß‘vÓ¼±^·ZFÙê`:#xpd=;:³öÁ×#ñvf«äñêÉ|§éÞ[¸ ƒôzeýÞ»“%{yÇMÿ°…ïô:?íI7 ¿/CÕ|¯Ù%|âGSÇ$™ù‡‡‡Œä4–FððÃX¤˜$< f´3ÕYLËñPß¹}Æ6ÀA& yÿØÛÄžø[Ö•7Äê!V¶ ¼$0#ñšŸÀȪŠE0a¡« S‰Õ€R{#Û"º»ÒÙ±¿ƒJãœAÛkñò€€—”°p°Ì&˜EÐh±á&ø'p ûHl^ΖîÇé º·ûä~ÓDŠnŽKÛÄ„J„±Záj½â8ÁïµðRU" 'ýì.<Á£õó¾ôNŸ@ <|§OÌ.=iáwêéL5æææ¤ ÏGà5–6 R-P¥€¥Ýw¦ñ~ÇÁ'ËçÓt¾ òˆž8Ÿk„òÚãU‚5¾³æ'}?é‰ð£º‚ñwÞÌ fìµò|°õo÷å%ÛŒƒj$¦|€¿“8ERlœ2Åœäw´÷,º—˜i¤ÌRœ÷qÆ™Ka¾ ’#dÚohkÑFDL”†ÀˆÏGˆ¥ ¾éƆX¯–¤ç}¯úkk!µ+‡:­‡ôóÆÆy5±Ò-‡ßÁ™½P“Áu&§\qA¹poU¦Öˆµr'UMFÈ‘±U]qe›ò¤€u”©T`oDÄR©â¼‚Ky€=¶L埉 ªgX¾4qDmçXÂ#S‘<¶jÁnàU;Ë’b^¶{n&®ð;Q"äKOàªó8VÅ9.a}=äæµÃ¶Yø;X p5 ;=|¼‘dùÃ?ˆË,¿6KÝUËT1p­¾ƒi£¼(±»³¼}Ú¨ `êBXCðÉÕ'˜f>©rŽ5ÓVâõ³¸mÎÇ«®…åçã°EÚ®wMbÿίZœÕb{ u9©ì«*±ýÇ„³kÊijù=Λ„Ñ›_âlbñ½4‡ßYE½>˜0_³£û:¦¶Ž<.8Ÿx=æœLz'çd9'ÓÏɨ;ߘ‚˜[zªÂT«aêè«ÈTBpWù›³³ú¬#TsÎ¤Ì B£ÿÕ+7¼ÊrB»á¥Œ—÷ʈp¿ßTº†W¹liG¢Î÷½E ®Ýˆ¸*]]eE\ÂT_PßrLn•1H÷žå„K¡”S½Ë(\׿‰âŠ/¹ò£õÑWy¬9ƒ<Ç-‚ú$x8UΗ/_…ÿ /_VfØÒŸi;-ñÊ.6¤Špø §²8-U=BÅP€ß¡(ÀWdRQõá>B%HîÚa¤ø‰VU=ßÿ¶Èc Õ„¸‰fbd5—üŸ*ꀇ@0CØMˆF2Äj„ TÔ£S¡ùãb2kƒš"@ðm)ÄÅH‰P )ûªš„2âD?޶ã㮚0ò^‹¡ÎRÐMgПØÍ—°`ñªf‹”OdR}< v y$ƒ'‹s\ÿ ¯{l+R•¥°o%SúÑóe`Ò• cª¨¾*VgLj_…Ô`áŒ0êñò¹¶#ºMkú&E/~3•ª­¨þ<ØÆ¢Á*w»çfBPÊpª´å`"öÈÛ®o7ºÀÓèÏÚRÍ#„µÏd$Xpj§®ô^«Ís:°xïµþ˜×Û»qAùôÀl—¾;Ÿ ]Ì0ÕÓi£z¢éö7k¯Ù•\nzçíô«Ãp¦ W³©zv0Øf߬놩Æ`8Æ=‹œ™¢<á ©¢Q§ÕEa¦ªoLJEøa&qbZÕ¹z!ͧ2P&vÄìú0ž:q(i ¸ø½wìÑ]ik†¡OP5õØK^«á¯ºd“ls {láw ÎêzÉ Åó¯Ñ Ÿ§œ16³·ŒB-ãtBÅw7ÅËs‰Pb¡ô‚ÓŸV·~'Í@ŸÆ­‘·#/¹©“­)ϯÖmø~•\:1G\ù÷øô(Ÿ@êÜo‰¯cÚ8áZ28¤ ®,HÑ*̦ ž–¦MõR0†Þf‰Õ´ËIb×;ì£ä6)âÙæ2õе\hÏÊC ¹µ ©ñ ÜƤ{¯C2PH+‡imüx†·Õ¢)#µÑX1ü<x´êH<· È-(†õ\ßÿdh³ mFÊ'C›™5@›òIm¦«×Ê gwVƒ[;PZÓ¤nˆ”Òbȱ5s_¤JkÝñ5·º³Xp«Õ(ŸA! H0á'˜ý{ËM0nLQ¹Øf=kí™[RCàçÌM´9s“äÃì a»ÁDÒ9§Ë9ÝætÂL±åcdJ`×mÓóçOk©´UêF8¹EŽBƒš”¶ÆÌjõ‚eGÄ L¥@ð¼ØJãsA8;"¾ÃÐæ îlÓëèr7ÚZ ¯;ãmŠšØÜ]Ý ¯⬖n¸|2C´BÌ9L,+ªž~ÛhÅ”É*‰Óo #°Ö„9ç¶Ö¼7¢{ÖËã[1Xc™ˆØYóé,̃͞jM)Ç\>F:VâZ^µX“0ØÆâÑàÚTÖË”v¹N~â!ïüäQ>yçG|’w~òΫ‰©v~0mDì-T5ÅÄ›ÝÁhM;ç$\ÞõõeÝ»­µsή}§ÄúÔç–¿™‰5ß~\¾Jºæš¾¥,Ø|b—-Õ½âíf¢¶L½×®[¹Èõ‰(ZQoeçÞ¶svî©=cUË^bOµ¸ß£ný'ÔRgºÆÉ¸Õ­«†à®O_§uþY_‡ }¨'àd'kdÁà÷‘)œT ‘ˆqR‰ÎS)Ph……æl=Rû œ²‰h\Æf€i=¯¸ƒ–2@;„)P ÑE&ŠY‹éèj7Rñåp¤Užu;ÌM€Y¦ú£jôaRil¥ÛäkŠŒ'€ëëš$¦§Òâa ƒ?¥s#ãT1—kg¶Bð ” ~g½¸Õ}c;$ž/áŸjø¢ÛËU·AÓ_fÍ¡bdÕž²˜×ÓdzAŒòֻᬪÇgðÞ‰!P‘©=¸¦{gX©ø¼‰PK„Õ]lÑ”õGÌj4V={}o‹y )Ã3‚^ç“¶ÉQüÁÀÊݲ+ýJÍß·Ã)îUIåŒgÙך»ïem!›<ë¾÷F’“ôI¸r7KƒOx™Å2¡I+®Jbê—¯ éf7_ŒœPÆcZy)·–g4%~½­FÞw¯ Þ+˜néšPÊW1­—ª6SâLC»M¶ûc\m¿=3„˜àUT\Sª}P mÖmÈ,q¡òÃÚOê»E›³4^•ãdI%Êc"6Â>oj«J©°)g6±˜ÔéÅN¤*[̱X‡n/Ûo3ÓB¦3±nÛkÕFâHZâ×½‚ P?' ñüã‚éžµnÌÔ Gû˜"³“‹ô&Ü ϻ븩eJ@Ð WÞ„F®ø+sñ_?ÖàSmU'\'Z$ã-5áú¾VF\R6fÒ¶’´A—ÁëH_Ll›‚ðõ7TEžM¹Ig¢ßk‡Î*͜ˤoª¥j[º9W,· ³÷v€;W Ú·¼wÜ,8`f…g¶ Â&Ê'7N5jMÖø µ–§Þ¨J /x Ââ ±þÖ1lí®µ_H#­fwJP•ÊÌÒ‘Ü5·G]yž!ò¨6AÍ•¡Þ¢ØÔ€×9o×sΛ2xuÊŒêÞ*‹[|¬½X«0ÕÌZÀ?¦_·[yVùÔ`Ï9 ›!­r> endobj 6416 0 obj << /Type /Page /Parent 2 0 R /Contents 6422 0 R /Resources 6424 0 R /Annots 6425 0 R /MediaBox [0 0 595 842] >> endobj 6424 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F8 8 0 R /F9 9 0 R >> /XObject << >> >> endobj 6425 0 obj [ 6421 0 R ] endobj 6422 0 obj << /Length 6423 0 R /Filter /FlateDecode >> stream xœí]K¯ä8Þß_Qk¤©‰í$N$„ÔÛH,ZÝ ÄÍ0 Ñ̈†ŸªJrN}'ñWÇNR7´à67Ç>>o>çû?~ùûáŸÿ=|ÿáË¿?ô??|y(޾*ºÿξ{ù Ûû¿|S~øõáÛáÛÃç‡Ï§ÿýöнðåßOûßÁþtúïχ¿þíôËûtþ¿>xãO?¹ül½9ý­xúyþý¿þò»Ãoç‡Ïõ“yýÿ¿suÛVæ<‰O{–i.þûÃoßwˆûŠwm[؃)]y0miÿùÇÃO§ ÃǶ4Æ×¥/nù·ç/]>bÛâP»vô¡ËáúàeQœ~$¼Ÿ¹:UŒ«<ºÞæ–EYºž@>ýŸ‡O0xm~™¹:UºÍ•F×Üܺ®{9—‚þOÃ'Ü·MBÎ9Ï\*ÃæâÑ57·9ýŸ„›û<|‚ÁÛ&¡ä^fžlsñ芛kLÓs¿=ù7ê$z>ýM™Îæö3W§J¿¹Âèš›[ÙÁã©ÆžÛí$z>Áàµ¯Ò ~™¹:U†ÍÅ£›Úú²:©%ø÷›Öå­ïˆÖ¦æ§ÑSlIcÓ™næÚD¶;üsÌ x&Ýo@ˆ÷Mxñýׇï?™“í;˜úðõ§ÓÜ.ßì~|=‘¤:|wŽëÎO<ü¾(ܧ?¾þüÐk[ SìŸ|¼yŒÿŽƒOŠέ£•ðüÄü‡…O¦Ü9Lk<ëκüg]ÀwàÜJ¸ xç¶IQ,?”,@êà³p=¶‚sƒ»-ìÜS¼‹×ƒ9„F÷>£VõnZ;`~Áú ò²°nHß >±xñ °î„Oþ‡Ü'Hñزàà'p4l)ñþ`©e,ÖXCbZ;¸Òåõ 3·mjH¬W¯![{ƒ†¤ž@Åøs,öQ0W`9ÃZó ŽÚ\ûXž‰wÞä‹tN3u·p¥ðh˜¯à;Ö„Ëû—Œ—“KËV㚃i¯}ÒÖ—Ošbø¤éXÇǪ#Âóö|DOŠŽÔÕÑÖݣБˆ{§†ï´è^Y{¬½i|5r9V­óÕX)^­€ïtÊ·>:ÓqH¨à®Ñ­S±þèÚâõwðzœ3°ð;xÖðI i@P§¬ØIHYtìZú€Yì±¼Ìe¤ü‹ž”ͱmL¾Û©Mw¬Êºyµæ¢†ƒxô¸wˆ¯|?éyåy²e·Ðr É(¸ö/°Œ­ãŽÎ6gI™ñ ÙÇw×HLÌÍp4̘np“…ÑFœÁˆá/&~ì%¸ßc„õa cÆÇ£VÎHÏûùäƒ$ ¸ÚÁïàe`¹ÂœƒçƬ¯'$$¥—qq5ÁX+"1µë MWUT¡í"VÃüº*?ÁŒŒ·uÄŒžÁ<éWÆOV`ñ?ë3F‘bA™73x›#¿ºûŽ©ŽEàïàhO^úÈY#V:²b‚~&ø¡½®p×½ÙJŽ0 ˆÑÆrÄhH.Ê èzü —ËÃLNgr[hNÓ Œ¡²Fc˜€L߉'˜ñ÷ðìm÷äœè^šñq$á2R@Ì^à?<ƒPÚ„Aî-ÞˆØÁˆŒ ±¥“nn†DU]Oì>Œ,ãcQ™ª®oJ[W›€lë0‰A<Vv+`ð܈ï`Z Q]„•ÉŒPª¹œ•˜¨X5WNIÎO¨ rK8RIX&°Å›Í¨Á‡Ä©~]Žåé‡c¹üsÚ¦òQˬ ÇÕ½c‹TA½pÁòà‡¡ä+†–nøü ÄßÁÀBƒBï6|G‹œh ˆ7³$ˆ¹ ÏM`¸R†:ÝðE†Gà'¦–FÌU˜ã Ö½Â"Ì€Ðä`p žÖNÕΆJ`?‚ô“å2•xS0^ã;1ûMÝEJa{Ûm¯{Ê%÷Hµ¨r1¼Jh‡àN/\9E Œ[γØ?‡£á\^i¡ãÀÉ 4”­ª…y÷!¡¤Ù¦ ç™)LgX_Pɳ~ÎÕ¥¶™Íg.Ý`]ýÚ« NÐH‚ã4–X%ÀcB2çc–Ǽ•„ uÌa¹¡ð ‰} )•`ÕÕ:+†7mS'§·^Þ»Ðz§L1Ç»ªÇŠ”±¬Ø”>ô¬øDHBÎhüȯ™ònì’N…ð ÉÓ¡à¤6,;¨3Jþ±ÎˆÀMŒÌ/VÕøº ^—.:˜¯1}¼‡ø€y~ø. Âr–ÕuÆÔ¡²ËœßKÉFÖŒòx‰uç} ¨‹08Xƒë\Àäpº!Å[ùÉ ä?á뜠™ ZFƒ|š«Bµt¹ˆÉdÆ'·•§ÏŒq ™r…"2Ý8ÝdÖ[I2Q·@°ãÍd!UPT™²3~›¸­Na^çûøº˜²qѽmß8Áà^"«JÙÆµ]¡Nh»êÖ‡N˜Æ=4†.‚{‘Â)J\õ§®BŸ`q|#FðaœžPpW0@Ãmp138Z…+¹GÃtVŠw—ñJ^i§õ#iÏ!$N¥& )w©Ó–ºãþ0ÝÀýI/'Æ´¡úeÅh Á}Ä65"’"¢•øwðv‹pMh”¨™òâ2$Î|¢{öwñŽ@ æP#ÒԵñ$½ 'Haνrm©îhKr.ŸÏqN‘—Ãiä“ʈGŒa•”'‘d_I%ŽÒ¨x?WiŸ´Åcêb~¸ÅØüæ1‹e®¨¦8Äd“\ãÕu‘ârtSW™3dQëm7•â‹ëàf)DM?Ý::èðV•üþëžüʂɘdœÔÕ@öG¤¬”ËCl“Á4n ÜËÍŒˆ ˆæ-#3e Ï',ÖâiÙt¢J‰lðTËdÎÔ¦4• ì@âüŠ€Å\M¦,søÆ[ÊÔf»†«rîs§›ø,”êÎxÜiçjÖ·|‹tƲ ‡ Dr`Étck«ÙPÙÉcx‚¨¥3Y>’9žˆÊÊ Þnb¹¸_›pÀÃ\¦"ÞYìäl1g3Wø©R¦Œjq…k·›\«W—Ú6 I:k§­q¶ÄtSžŒŸSÚn—‚>;×oÜ[Ü(Ê3[YéM‰l¨¨R‚ŸJˆ1É&xÙÇ f&ñe½ª‹O j–Põ"ª2-X°§jm`?K˜kÓÍoRG‹Uuâ£ÊÄ›:Ø?Wõûw™ç« ¥¸'šLãª7UãËMR·/ÞMf ¢›¯ÏÜŒG€we©Å•glüü`2mÁÕ¬¬NÊ€o©”¯ —Q>f°½¾7O¾^ÆôF•‚pmFŠ´Õ°:\ÊX7.¬Rá"‹ØÁ£á‚'¸ Mù1ž:ËÓ—óøWÃÀt#Šÿà‹¬B1#¦$¤›ÅÝ™R(ø;X Áõ0\¶Y ?q¸d?|RA9t4Aë\²Û”XWá¹á=ÅrÊèU‹ÌìŲ€å‡x"Hãû|–¿2å4Ç.ÎË‚­Æñc^ÆÖˆ)¬‚K6T – Ü»Ï —Ö[±¿‚µr!8L7¬ñ¼sª…úJL¦|.‡m(–,,?wù!<Œ {ØÏƒÔø S{YX‚ Zã•Rž ¡{™cJ»R~8.@‰×“«%öT=&¬)'c¦¢râÓå(<|Õ›Iùí”@üm¦ønNîiÓ¬A "Aù彩½Ä´¶Ô ¾óž]س ™ìëfµ.ŸŽðÅGUáb§ó Zg‡9ì0y¶T¨…Áà£^aÃZ‰<º¸å’õ;ŒbÊ_y®+ºÃ(v…ì0ŠFAzY;Œ¢Øa¤îÝa vEïã”fš/W£hký¯Ê0 S˜êõ–\i.$v™C5æú?®ÀŽ¿³<ÐáÎZZaêP­aá¹²Ào™‹1,ƒi™Ñ£C¹+^D¿ †Ste‚ð0'©Ìw¢›‚h±2¢­Ú»$A5¥,¾QØÀêvÁfhT-Ý>œºýUÛ«àÊT_ñù-4™%õFlL)Óc•rÏvSžÝ”3”Õ컵t¦|—r[´E6ÂfÕuö WâÀñF¨†ÒŒq'q¤b¼»™1Ó7T_$ @j}þôZ mU0A°þVÑ;“0m’ÈØ¢ ÝÔÅQv¨Ê²¸ã!çžÔ7nIH„·“înJHµ–FÙcìŸ1 ¹5B]ÜôFƒ &wÀXtÇ/wWЏTÚxŽŒ UTSåTB7é¬,å°é® õ7u¶O;›äÈ´á bcÎPUàB¹Sâ ž`¦|ï”;ÒŽx*S±{áHg‘±-Ê”ZYØ­¯¼ ¶ky¯~oRdk’>Fðu=[E'¾P-èFÿ~ŸòIæ„@Y¬ù˜$|zв)¢¤”éRz;o/y‘Mþò™z2Ôõb掭†ŽÒíPVPU¨ÁÛšÃ)þ¸"¨¶7yþ©„RgÎMqìn_&såI¯«£ ¯l÷H͸wøN‹ÞéÝS; ¾x®§×;¦v$t·Î¹ÁÖ½Vÿú£N½Ÿ˜uÂM4µ v¯­gêkû[ÀUÃw,|‡¢;æ=<·Nñ×G×mün±½×S5B3µ<7<ÌGÂwðJ?Æó«@Qg ßø@—Ò¿Ã|¯çäkçºÒE`†©z·8Ë‘,ÎUZó#Ú~7œï¸þ¥OÖœàT Qö-1@üÍÀŒ”k.Œ! ]DzÄeÕº“nuB {9 ymb)®Çð1 ¦ªI3ž0ƒ_§Ò ×ßI@##B ƒb”ðw3¤ªœ›œÅx)¬*°\Î{Š‹TºÙÊýæý Ó¼ä óŠ+ºßÌb'aÉê2à§¾zñ¬}ް„®»/þ}Ò Ý&šñ&ž÷â²åñüþ¯ÖW/ñËÃAk¤Q7ÖWè®O©¸zèØŒ#@»®˜gTcëåó Lå*‰Ç¤Öï= ˜`³Œ¥íµO%®TËö eÔpY^¦ÐSÄŒ)—‹ñƪXÀc¼1Qœ¯‡uäá¤2 E0W0¥ú„Bnø’ ÆÎcîÃûˆËE¯¡°ïÉ®µÓ´b0è{ü<œÅe'1.?_¹Ac}så—ç_Ýf"º\!ì=.æKÌ€).¬‡y'—dàÝ&vá†rçË–Þ4¶½¥Ÿ| ª®Yžuw‹âe,›ÐWÄÒ„Ÿ>öKˆöŒ·ŠŸ0Ź×̉xÖ¹è¶<' ŵOð °Ôc[½†RÇÆ™úõWöÚ\5œ21¯ÕaŽ#Šå\¸ÎÚwy×Ã8K3µåõ ‡ðh¹¼‚œ²ÕMf˜f[ø¶µ ØGÆÒ­v28M‘ÒÜR’>—X> a‹y>Wì¶¼t3-å2Qtñ^éfÈÙŠm n˜'ð%ö¿‰V;ËÓ`‘-s€Û¿­¨–KËë§•G'eÙ¾þjRj☽*f@ôù~Ú½‚Ón)3*è›éÑò%·Uƒšx点ã{$Lõ{¢Ã…26$“fJŒ Q^ #•)zm%½2gcˆK•÷Ñ©©ŽExBì‹Øc ʉ㩪áJÈzdÊô1ç¦Ëg&pSðÉ3Ý<;ü\Êfq/\wïsqlOCÞZ|›‡cÛ§ª‘8H`ñ˜L!¦ˆÐ®xÅr– åÁd1'ótq»€±ŸDËYßàÜ„ü&ÁoËs• sa‡0ïdÔOõóÅ_Lá8÷Í„'Æ¢ÄÒ„¹?ÁRËœ7/NkíLdŒñz¨¹a}‹µFÔ0¨uÂçüN¹Oð¨nãxa¥>£¬¦OÙw?MäŠÝOÛý´ÝOKq†å ÿšPJWEËîw,"º‡0Ýj5J,2tû¥G´“Ìun¨Û-J·v{¶Ó¦²Å|îF™}º:Ä …PR‹h§N•Í$j^ÅÔøŒ(I6ú§D¿, WÀ9§47•íÍ eë†íø8<²dº¥GÔÍÃå™&Ÿd‰‡|½p›‘ÅäYZž}ôk5w›ò¬»mvþMÅ¿¸W>Y&ΜKüü~ò¢ÄéÏáÛ‰ÍD.ü<õfØÙæjÛRsŠ¸Ì¹ÂÞÁxŒk†¶ãÅFvy{´Ç8§PŸôY {¬GM[̄ݹò7åý]›Û§~¥£"ƒ½¤b@Qr\t²/°÷XpOÃ\Y†Á£Áwz÷ÖD-ýE”e¸óßO36Óî‘`LÈn w÷û—OL¸Ñ¸½(ü0f¼iÂwà2ÌТd¼ —ÁLN©w›¯ñÞæv>ò…;ö:hCYì˾À…M*ÚχÏÿ)€³L endstream endobj 6423 0 obj 5686 endobj 6427 0 obj [382 /XYZ 38.2500000 189.500000 0] endobj 6428 0 obj [382 /XYZ 32.2500000 285.500000 0] endobj 6429 0 obj [382 /XYZ 31.5000000 286.250000 0] endobj 6430 0 obj [382 /XYZ 38.2500000 189.500000 0] endobj 6431 0 obj << /Type /Annot /Subtype /Link /Rect [258.750000 743.750000 339 750.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn42 >> endobj 6426 0 obj << /Type /Page /Parent 2 0 R /Contents 6432 0 R /Resources 6434 0 R /Annots 6435 0 R /MediaBox [0 0 595 842] >> endobj 6434 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1409 1409 0 R /F8 8 0 R >> /XObject << >> >> endobj 6435 0 obj [ 6431 0 R ] endobj 6432 0 obj << /Length 6433 0 R /Filter /FlateDecode >> stream xœí]IoɾëWð`讥7 `[r€6CC0“I0â俟¦ºIIÕü^w}|UÝ$ÛÆX•XëÛ×wüò÷Ý?ÿ»{÷ñË¿w?_?~y(öuYôv‡¿?¼þmöÃ÷»º)w?~{ø¾ûþðùás÷ï÷‡þ_>þ¹ûî;»ûS÷ß/»¿þ­ûáOÃ/~áÛCmêîë¯Ï_ÛÚtß§¯‡Ÿÿëá/¿Ûýv˜ñ¸Ü°™·ÿÿƒ«‹ÖÚÃ6&–þþp<¦yþûß{x×_@Ü*µ7÷;ã]÷Oëíî?ÿxø¹[à8}±o½1uåëâ’…j{X©í¾Ûv3?Zèù¯Òôú“Û¢T“÷;W¿ã*#Ͼo¼3®¶¥?<ôá‘˦±Ý÷µþ\vi¦¬ûK³E›àMNÓ§xpW¥{ð~çê·2<¸0»"6ÛŽr¤|ÜÓô)UºÉŸwžìqñìš[oß»:ÁÕ ×™Žœ%{Üç«ßÊñqñìû¦þÀïɵ›Ãuü­ºÕ“Jήš2T½Ìžª\Ù&œü°síK€ O®ù²¥m¾ìiö—_&íú§zY8¹æËVîH«Ë1q¸ü‚^¦O0yÝ$„›ç«ßÊñmG³Ž™o¥ÿ Ð,¿ üðõáݧî:«Ýן»=/ØùúíÁwÿsÐ%;"ùõ§Ýï»ý´Ø}ýåÁ”û¢u…ûð{Ï#¶iöM[Töõˆ±h¤ðÏ#~ï]¯¼¿Œ|D#Ô:M?’hzãâG ¼Ù:þ3ÆÃÏ'ööô`ƒÞ [-Œ©>1Ä¥(ÇU\¨*I‚zO_;–x73¾@ ­ìt¡·ÍôD¨Ý?ïæÍñZ42`GOÐÉ…Of,f2#ˆ‡¯,  ž~¬ -VÁW|9„X"àC¶GÇ€ê«á…Æ1(”& Ì~ZètdBD£H¯*¹fÐÕ™Ù—bú_5îÈ“/cãøèñ¯îê`×U¢®ˆå}|R,&¼.½FBvÓ¶#𪙊wГVþ0E ÃûŸ@Ì„˜5R|J +ÆUp¸Éë¾L@‚0Èfè/¾ ‚@Ú&^ü§û´B¥2Ü sUŽÁJ)lÒÊ–ñfÂúˆö¶?š1GTš³M€I ÷]»`ß”(ƨì™4tü”܃þ–l¦mC°¸2uMp‚û³h’ ;²ö1ÚUñŽ0ƒà­ ÝfLÈÈ$)Ùo3"XŒŠ¡åÃ||$òÍ·³ùv.ELAça /Xð¿î;'x½™·$ô5®¼r¡¯©ýy¡/éš#AóªÅIÆ\µ™u4ë\!¥1E]]9©1ƄԒ±¼((EPÁ郧Wõ9 ÊT&ÏÞ†S¶6!@ÞŽ[Å™P¿»UsÎ`}Hoªn;6°üžJ˜b_ÕæHà1e™¯PW©’+ d¾Y Óì˜H]R}ÍJÓ&{¾¹ÈÍÏ[][$s°÷ƱI ?ÙqF}N”vp$½ë´µáí¦·^”ñŽS ŒY*#öªÄòÍç˺v;*„/BcÊŶ˜à†mÁuæ¤K‡†¦«i2‰FŒý{¾±™b[!¬ú§\biŽ”=SD¨€ÿnhŒË„øÅ9Ÿ&IL=ã]WõÇ8€1Šð¯ ~ÆÖ³E^ÌK˜ÇfB'b¢ÛÒ¦ýQÑ|UÕæ½^©¿)CŠ åçÊÏj XÀRñJý üÌSü®ñˆ wÀ˜:5s+MÈÝÒë¥ñÁš”…©4üÝ1!-­½‡» ³ðüõ+™Qâ¿™÷¼fþóV£çuCæÿØNºf£Z6S sAhNŒr*0z‡ÞtÌÎUµ}Êt`3åw;ÆsÌsð ÿöP‹c÷í¡±íëüúð%{5ŽÃÎÒùs´©„⿚²%ˆõ³ô`;èߤ éá܈‡;¸1û,>)†*÷!#”[?¹Sa¿>7±Äýâð“C,žÀZ’ð®bºñ1žrY¸¦Bˆ°küÚÌí`J|k˜"°KéÞ®‡Gð½a¨‚³Y¼7µ¶ÔÛ» ¨·.%.0·‡Ô8Œ›ºÐ‡)Þ5ž S|f.£ ÄbÉ*/½ÍƒM•–Í2EyYcêã’¹Ü=ŠJjœ¡ƒI ÂF ª¹Ê"nQ¶Ò:wkãI>L|Na]¾XŽ£PÍÕ»Bo˜ï½a¯J.ɾÀ2ÂmÚJ• ÅÆΠ°2+TM|ßѸ™üºá Ë—@ÀŒ‘>#Ò¦Tkòݱoš&±OY´ÏÖç ]Ê5 om™bˆ7—¥{»~-&q® )Fz3"Ž1¾-ãlšA™de5Œ!+y+.g°ºú’‹Âp…Ÿ¯“©½ÇÐù5eã0:•NÃÝ©£ãü¬ƒ„ÇÐËÏžö$˜6±8Oö¾~Ïå=¼8GG`ÿŸ#Äá íÈMY¯²@Ò¡«æä;ªŽ`?îäHž±MæâØOðmÚ>ãð>SLÎJpØ×¹!6ÓH®X>&Aˆ:Á|à >Ï#ÁðïÃ?¦B¹"µp¬ÌF¹ÒP®<ô©)§±é:G¶ødí¨ÐÅqs‹Oæ(ÊÍA⟼úødW\”]²â‘-vZ”·Øé;‹vÞ®7•íaŒaZn!” ë\øú”Þ§åÚì±íE 4ZøQ^¯Lõ|V»†wQ½‹‰ ¼kºÞn¡Ì’F Z*•‚ˆÞVvFêb˜Jõ&¦-.ØLµòŒîu1e Ç!5ª5ª5Ë`¥¬=dmÀ¯0 ­µ^a eD…§9VŸ§Ôô¤aûUøÜwÃÿWX+/†0áb¹"î· :m¹üƒ=BQxµ)Ž)ãíËPdª ‰ILIk¦Œ¸n ÷\´Aö G|ÄôÓl|Ä ß|þ~§[ivÑ­?‘Ë%4;#ø(ÆoáÞ"*G9„xᘠ穅S¶qèV¸${ó±m¨ì' õˆbÊ}Ѻ·ŽÐ ©ªí¹tÖ=€Pg!uÄ*"v‚eû\$"Ú9æJQ »”(+ŒLƳØå!yqÂí|Î'¼>ßÿ!ƒ)®>ÅÌ…*–p-/¿N {Éôh3´@{y¢{ÑÝ£˜áH,fª;QØ‹×!*O ´ ‚ú%¦qp'”™ƒaáy¿‘¾¡yº;МÍyšÏy*¸°ÕÒ¡Q³q›ÕWRY*šP¤aÚÙbÓ5™Ðt ¬°QÙ¤a8±ßÛ•[ŒÆ  ¸?<ϧ éS;HZ&© éaéJi‘QÛ6<ø†¨k@T*öj “v®Ûù²Í(šXÃ`Ä Â´œ6Âd‹%‘\E § [f0¦­A忦®0e3žÙ‹ŠÇ_‘Ó²  F¹Ûw®ð´LÆXÄ¥j1m.EiÞ´â£mCú¶‰÷aËòÞ‡œ Û{`.ÅóV\}˜q¦cIðèFAD»–SI[Öu²‘ù‘Ѻ½$®ªÅ‡°0#š©z=©²÷+ ®]œ*n±´[,- nwK›4Jôhš{ᨣ{P=%0d8—NªòÁ *ÁL×=ÂuF*º4©)c…®ý5cq=§¿Q[¨ñ„+FázŒªõà™ZR›âfýWqp@ÔCÁ³­àXóÒa"£nßœê×nºý¦Û¯So4ˆ<ÞtmDýgª Uºwpk´ ÷]Øh¹ÎýØ!Wn·kNQ©ê±ªÚ„ðö÷S½ë)´jZÃh0ëÀôöT…˜²ÐoÔa£uàï`ŵٷŽcâ+lǶŽcÍJG×Þq¬µöYЉ5ÀÖ ÂÚÂxö6øßäYŽÈŠþ™ÑSÓÖmþU]aNé•„×Ûb:Dô¼(¶H¯¸·ø*ts××ãNu#á˜X¢û¡²f2?3åx( 3rµ®EÐ1±G¾àóà½1ÑLxoÌlŒ7ðó1”Xâ)Øaú¯2л8ž2~r]/Æ,ÁB’Éæ„í%üL©Vð`¯.ÝBuy5Ƴ5Ûu)¤I˜06J›Ù›’°êw€%l‚ï®™ª2~{áåplI.i · Ï™ìõœ‡ªÖ§Î¬DOukaÿñö‚܉ýÂX*Wµn‘Z[¤+.o×¼£¨RÂc°¼¬dø!–þ‰iñ;t3’ÓŠØ^áss±2˜ÖÔ[ˆýÄtÓÂWƒå‹%&FÂ`ì0„ÌÆÈ+¯ÎÇ«©\-âMèÒLâ¨7¶¯¬!¦ÀsŒ)¸IF¯£qúÖfgýùúñý’í)‘³¿‚CÙÿ¶kèPtçÌÈPܧÚí^}æ=üLGZ4Û Ö˜z\å³1ã÷aˆϧ…#=£¬÷mŽ‰Ã¸$‘ƒwP ½Y8‚ï`@ÚsŸÁ/gãO:(ŽgÖÁw ì@ å‚ïÎú“5£·Ÿ)~›¸ ›rÑÍQÁÖÒ‹h` Z ®°wÃü‡ªF´ À'Æœs!çâý˜s^þ¤BÅg¢Ñ´n³Mªºá‚ÍèK_œïŽàˆ)^Ê”OUiF»¾æí¹h«2#ÍT>{üêóK:窕ŽOL3'v Ô£_ü›Á'¡CD»w‚¦3-Q©W‡³ •~3a ¦)Þ-Ç MÑwGyÅ …#Dôn‡¤[GÏÈD†™þ¿[!vÀô\Á#¸ž6ÖcövØ¡ªškØ„‹ÌÔ–™â<|«¸ F¥ÊMcÝš[O2âx„M'm'ÿ#ZjªX:*)Pˆˆž‹ÑÏ”)¬oC¬È¥p&üPMi÷(D0}µð7SîŒ;tˆîÙ ïáÈ'¸·]þ¸ýÑŸýè³Ç¡9 !¯Ø†ÀÀÃà×l0t *÷Eø1ˆbHIÎ×jWÞ†´§Òhe+:w]£KÁïÄHòøŠñl)%ù(¦"ðSÝÆØ˜Êº&ÓjŒ¢#ð‰!ý ziCî5(Æ”GœvyC'Õx+Ò†ü-LÍ1Q(uc‰B˜8щIt»a*(SÐAHÏ‚'Å¡±„¤´ð”6€Ê\V€ˆ·nIR¶¥ð^¦´è›hë‚FBäT¶å%ÅËC&I´È(ã#R7\‚q‰¨hTsè Ü(L]¥O¹I4¡Ž1nõ˜Îõ)ܶ š‰(섟i•Âf§ +!çkp>&.kcN” 7ˆäÛTaBNO}ç3}ÿ¤…0Ó yîT$RHƒÅ)ºL+M¢pÈf(”­Tá5¦£jZo¶]«¶.Šã˜…í7TIf¸T.÷€‹š#TY"ü „Ý‹yÂ2;Xþ2¤¸O—]{Ê'?>H=JEÖzÀB#"MŸ†{œòO§“ùºŒ ÌÄÞ­ÀΫbŠpÕ®P &¥:Â<> ccˆ@øpÎ\1‘щCr™Äª)‘2ϵ¨n¶•SP‰åBkˆLbJ™¥ù„‡ Zº­Jt®$t]{ ˜6ÞR9w¾ÛyÎbº&eŸÜ‚üÔtª‡‘¨ÙB8"’¼ÆÍ°¾ÄŒ;må êξq @–/(²Bu¿âôæ(oN· üÏDVPNe~ð å‹fÈ%ê#Ê©\Y˜™umë[Ú‚„Rx*±dó >2õÇ(­“$Åš¯¦= œ½!Å—§%‡`Âb?ª]úˆF´.÷vTô=üL£:[‹>3xtM¹ïïöÕg†üB³/ƒœDó„FŽ•PÏ|¦B;(àâ] ;€»>V·=ór-éA¼Ú»þr^ô³Õ{7qw] ½ ¶ EÓ—\_9e€eºU*P0朴ålÖhŸeniyEIÕ0"Üã(Ä#‹W(\¾Öšž¸*„º¹Žˆ¾%¦ÎÂySÉs“¼©Ã}2~?"OvÉà]ï«àÔ Ò*ûA3•8ޱ=áÛÊF§%D·€aÉÐ-û¦â(Ëå6RhP MQÉ0˜Ÿ•µ\n}×Izë.!ÅT5Ò•ÅW\Êf2ã)!cm]ÈX×Ú'`ùâ‘hW /G1IŠá1¹¾ î®8:†*—·dØQ…ÉàÏÕ"uÕ®´Ýab¤÷¾-]§L ém˜eqâ?|ÐKÂmV6Ø&S'cc[3@Z3)}ðB×wÜ'úA£ÓÃ4=úYkBÀfìÙº’€Fxg„¦Áðp3‰tCêcB˜XU§nΜäîÖ¯£²nñ„lKœ“Lä¼ •¼˜ÜZ˜'‹³q8ó~q›vâv˜übj6ü LsyœÙŠ[œã½yæØ7Â`‰po+Æíc0!÷C0Öã,⫆øôzUeê·Ouƶ-!mz “(¢c^qH*{†x[o¡ áí \O”3€¨ ¤ÜÐPWI˜_ÞiÕ J‰Ó‡'x1͸À—/D°` HiLÈ×2'Ó+W;Ä~ Ü?ÖCD¨„¤Ü‰Å±ªCˆ½ƒEÒ63MˆÁwgqLìHй– VMŒ <ÀÒÅ”A8i@F Çfj^ØÔ| àS”SaÁ¸…é3aVaŒhsxR‡tÀ’rØhkp‘>¢tÝcy ¢=NÕXͼc wPb3–50”ã×Âe ñˆR®B©CŒ3ØP‹a—ýĦU,×a³"¾Æ™€×Á{Ã#øˆ×v ¨ØðŒ÷†›ÍàÙ˜‚ºø<¸¤ïUb‰®Ó"?ÔuM0Ž(ᤸ 5¾ƒ©B·Y¸^ÝýOípÉd ʉ¢Í‚G^@”§p„ŽOÑh¦´9Á§(.g#¤e|oTAi¼–o1T¥¨" —§¦œøŒì_á9º…Ò> >> endobj 6436 0 obj << /Type /Page /Parent 2 0 R /Contents 6448 0 R /Resources 6450 0 R /Annots 6451 0 R /MediaBox [0 0 595 842] >> endobj 6450 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F8 8 0 R /F9 9 0 R /F1409 1409 0 R /F1699 1699 0 R /F1700 1700 0 R >> /XObject << >> >> endobj 6451 0 obj [ 6447 0 R ] endobj 6448 0 obj << /Length 6449 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯ès€m‹¤ž@ÀöŒäÀ°‚‚Ýl‚Åz'‡üý¨»¥ž©?JüºXR«i#±wdQd½«Xwüò÷ý?ÿ»÷ñË¿÷?v~ü²ËU‘í¿xý[º¿ï«ºØÿøm÷}ÿ}÷y÷¹ýÿï»ó _>þ¹ýÛÿövÿ§ö¿ìÿú·ö‡?uÿèø¾í*Sµþzú³©Lû·ìòçñçÿÚýåwûߎ+öŸë6óö¿p•©wܯħ¿ïúcšÓïÿþøÛîÝa_©rWÕåÞä.ß›&·ûÿüc÷sû~ùìÐäÆTe^e·|¨²Ç/•®ÞÛ´+ã~ -añªnâ-~Ú¹8TŒ+uA俯Ù3€ªRB/«Gn³*Þâ§K¥C-^üPçθÊùËG umÛ¿W®ûu#ÈŠŽš"BŠxÌ–»ÂE$¥ãÎ¥Òc.ÛEVGÄöeõ)³ˆ‚ã´óX؆‹ÇÆvûŸgÙ:º/ËGÀHû,"ºO;‡Jo¼º š.²*ÇÊ/«ÇÀ­)cÎqç‘X/™• k³Ž•ËVÙËò10’·œmñÓÎÅ¡Òã¯áef:„7u°]–“º‰Èß§‹C¥GøhõÏ!«à­œÂß=/~øº{÷©g³ÿús»³ÓÏ|ý¶³åþ‡Ö/¬Û?¿þ´ÿ}–™OØýegÚ–¶8ï¯{ò„ždÕéIq°åùÑË;ïá;5±ÞAƒÞÉ»”‡ºÉŽ^V;§<8sZìÕj>1pµn׿P4®zsž§'ÕÁ·6g®DßÉÏï436ëÙ>ÆøÎ3z‚ßÉ>¢½ŽáÎxzþÚrÒmLкLå5&ȳ3”yÿɦß]ÙrfUŒÈ¶$?ä®z °üuOx¯žœq‡"/ëjæ“ ®–£'Þ~ž'Ëá“2|5 OŠ¿c> Ñ—÷Ð@¬wôP²!¿‡«u´oûG3v`?^øåŒÿ—w ‚dàZ0*1D+âçN`;[›·¨Äï`$°-Ëž ÛØ†€¦ž3Æœ2>$M\À&†Wcä\§ëisZ$ci6µëˆº°uXÊиp&öœíý€°œ™­Q=â‘'ø\ž-Àd`ä?Ezp¹ 7@ÆIJø©ƒ_§{_=éMR{~0K"`zÀ2ix ¼%Ï1òp–ðÎ]ËX‡›ÅOì§Á‡1׬@0#c¾¼qីFØÀË$½GÜ̲¤Ö4-q Ô¦Gbõ²¸‘åùN€ç *5/Â奇¹Då²Gâàw°!"ê?ɶ”)„a€=«Š$ì-¯by×^XW0Âe„0†÷òØÂ¼ÖnZ”cIGÐbmP ó*ÃL˜1Fá>üOáòžˆ*Jâ=ÈD`(ey3øÕ½ÉPˆo-ha0Š 2q,|À§p¹ÙÝ5‡jxûçA¿„¡+³&x¼ü ¢pYÓg ,­¡ ó>–É êÆ¢6å¨å‚¨]8$Á²%&<†¯Be OÛÁó~d$*s.¶Älêaàù‚Úcub9&êK0·õž;yÑ€u£ÄÄ +š²¯eCH²j™¡Œ…)Ï(jôµÊç+[ŒÌÅ¢(Á  ¸ õP‰DŠ>×xLš‘˜Âz«/&v!šø´¥‘É3È­®¿+y‰õÜi;WŒ²+OìûèbŹj¸Q悈ï Ûã|„9~˜µÉÜ´¸À|FðŒ°1C$2Ê"þS/&÷äf€_Ê~–5y”ù2z•í‹+1*{wý·()®?Ó'€цómE¼…Ñîçǧ™l˜î’@Á8quî®Èe\ ,½æËC¨é.Ë!<*ž)SÈÃ9‡„iê±Ç1Ì1›T¸@AžlŒ¤dQ2Jñ~™ìE¬æ§ˆñ(nbÌ›M× t£pe`*A“Ö‰#¾ÈœdÂå¢z à^ÖCØ–ÄH`,/- $'W-7gdOQ¹ …4ê’…yÜË¥ek8ÌP±1y“ cB))`äDPEÐLø|H6LšŸÇ!]ÊGfgBBÀD${Íedh¼h%YˆÈe .[úö·¢šM ×ÜieÄWz½Î»À=€½d5=^Ê)UúNH5Á‚þd‹ºÙV•j";®D¢ƒƒHÇò#oVx§²X™1uÑÉÄãD8ÔR«¦^Ìlc‚KÃMD/rdcq+(Åxð{M_§UcëêtÝtõq?ÕŽì®=)Ñ“&מXôÄÂït0 Úƒýaó÷á»öì ž'ÃpÃ]má;×Ç=+ÐRúræí~$¾Z6ðr~øÕŽsÃðé ¿#7eÌÓ¦¾Ók8Ž>õ̘j°›x\ZÙæŒÙ{A¢\ ʯÚe¯›-†¤ß¥ŒbÃß=Ïòµà?í–ÈY¶)†‡î4Û¦r³R¼!¤¸Y¢§¡ðMè]fÀPÒq.™f—Zqósq=^-œs’ˆ²š^¾r©ÿ5’3ùYÌT}ª‡ù‘ú4q¢kJöýÔYƒV“ÝAƒÞéÌ8“÷Ãë_V« }a¸M]ø][í ™a1\ö[›³W¢ïäçwªCQÍOjÁ{ÃçùßyFOð;ØÀçÉ!…x讆©¿Ó™ÖñÓŒ±ov¥Zgen‘íDuƒ“Ê/S_'‘Y©•R¦èN½Rny)Xa,þ8‰Dž{Œôí¸>}^ŽÔöé ®k¢ë¿ºž º£ž7C¨É¦7ßUbíãxì[¹4__µÎaÔZ¸cýýå=&;#Jç»§ûnªšS"ø~W¹áñU`S4¸ùng¹Æ•mu¾v0eÑo=]þoõòÿÚàU9^Íuð;NÌbŸAåuÞS,Æ0~‚yžs¦±NCQ…‡.ñ;Äp~Ç#žàj§ã“zöá†qj1•¨¶kQ¹á IβPB2œEíë© >øÉ‰'  Ææ9ÈÁ <–ÙÁòXPÐ`w.Ö5ý'e3¨é®¢…¤›ˆöJ¡0ŽæŠjõCqho)’:?ø¾ƒé[ÓÝ´—®Ø†žÇMæö Ìml.0ª?Ãnº¨É„wŸ8h|d¢æìXhä­wœî.U%Þ}‚ƒÌ“$7冨û,ëÖ.ïTRØÆX`\ûÅ]:aÒÅâóQˆŠ†!o‰:ZÂÅÑžà¶Q¦žÄÏ”vÍå[Ë”Æï¤Lé”)í§ H×+È”ÎÝàh)Sú VqvLW)SZtR¦¯7´ \,[‡­šŠ±.$ :¶ñµf\Ä`Ó˜£[M3Tµeó‡èÿ8ò¹üÜ€þ'˧—vùé¶4ÇJ^aÇRÆ&»§n´Œ¿éñ?$îP©¸ÀŠ‹}„§ÚkéD¥[›ujXc¬ªØTeµ¢™TŽ!ÂTªSÖõ-~Øü´hµ¶rÙŸºÎùü‹ÍŽuE~éc•:Öm¯óTêX—:Öõœ^ÎàÍÔ±.É ïIScùlÕåS§?/ DÛÇ§Ž‚^.Ichñª™¦òÇé(X^Fl®£ ÑÁcYhãqÊFKå“ðuà[çÚðÅ~ËáÛdn5–=¥{‰h•pX±LÌx´V²V)ƒG­òU<ÞSÙŸD¬„ÂS´ÞSÏ€L3h&‡A¶»ì”9­[Õ”$¶™þ¡)·i¹Ü&™UógÆP}Âæ@Îá#’û=ÈÞLã°ÂÕ¹7/U·b‚šÒŒ¿CdP½r$ä&N @Ó“Ã81‹Ñs­V‘‡ÑHôˆnª;wáʓВ͒’ê¡æ7¬¥T1fºTfí@ÞÕœ{ŠHc÷ô¥Îl–õ*DÕñ˜àG†:ÑAI;¤rF·Kw¦OT†ßà®+É 7 ¨õ•è2eeç×­ÑWÑ¿kêr@FãXž¬9";Ô. =‰HL^ ð ©YòL•Âò.ƒ'ìŶ±Úò[†B"¢áY*žpa€‹:î©9=S'µ‚{‚õœ)ÌG*›¡N\©í¹R.›‘b×mAí±†gKWQšb…ÉúÜ\<`ÞSÆäÓà\nœÉ„3`ˆÚœ#‚wíÙ®ÆÀpÃ9¸r=>“¹ïY žÔóÎÅj©Ü–“Tî¡KL/Æ<œsÆ=<¿ÃP¹õéæž e$3œa!UY˜ï·|u•'OÓ„AWÃOÕꩳY‘gÚùRg³(x´ÚSg³(x,+vç…^/ û66 ÝS†‘F¡§Qè~:Àа^~zQ¼È¶{…ná¥s…>’t«¬M£ÐÓ(t~; é³Àô'»¡Î:¦ÎªÌPi1pŸß„Q¤Sp»SFÚ¯°'ÚH}jõï!zãxºæ`l() ŠaÈÐh' ¦¡Hê~œºÏëÕ_{5när=L1{²°ŸÃmÅ­Œ,—mõ0­ñî±sL˜‡ CÔâÞÚõ¢¨Í4?26¨¢KcÔeǨÅ V1ì¼(/m†SIM¶½´òTR“JjzN/´®½¤¦T/2J²ÏËu©ý@j?@òÏã”"i¥Œ¥’§TòÔkÊÊDÒ‡©äéMÉSû{ÿ½E˜ŸŸ§þÁŒàE} ÙθC+^Úî/©¸Î;;kªêŠ7|Ö-öJÝ™š¯dع§î.!mÄi8gñÊwÜÔ­ûµ½}êN:Ή+áj]ÜêeKܬéŽ>:`GNx| ~]9†Á«Áwº`ˆ :ú«”;–àŽowüV\ƒÝs8 ’YŠ8:NÏç`䱃W8¹ïžø’Ôyþù,zehsŒø;õíTYeîÐI´yäiá-P'»:Ù>%×÷ŸwÿÊž endstream endobj 6449 0 obj 5212 endobj 6453 0 obj [384 /XYZ 31.5000000 509.750000 0] endobj 6454 0 obj [384 /XYZ 38.2500000 224.750000 0] endobj 6455 0 obj [384 /XYZ 37.5000000 713 0] endobj 6456 0 obj [384 /XYZ 38.2500000 224.750000 0] endobj 6457 0 obj [384 /XYZ 38.2500000 642.500000 0] endobj 6458 0 obj [384 /XYZ 32.2500000 508.250000 0] endobj 6459 0 obj [384 /XYZ 37.5000000 713 0] endobj 6460 0 obj [384 /XYZ 38.2500000 642.500000 0] endobj 6461 0 obj << /Type /Annot /Subtype /Link /Rect [159 266 237.750000 272.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_implicit_namespace_packages >> endobj 6462 0 obj << /Type /Annot /Subtype /Link /Rect [381 252.500000 434.250000 259.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_package_search >> endobj 6463 0 obj << /Type /Annot /Subtype /Link /Rect [170.250000 272.750000 197.250000 279.500000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://www.python.org/dev/peps/pep-0420/) >> >> endobj 6452 0 obj << /Type /Page /Parent 2 0 R /Contents 6464 0 R /Resources 6466 0 R /Annots 6467 0 R /MediaBox [0 0 595 842] >> endobj 6466 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F8 8 0 R /F9 9 0 R >> /XObject << >> >> endobj 6467 0 obj [ 6461 0 R 6462 0 R 6463 0 R ] endobj 6464 0 obj << /Length 6465 0 R /Filter /FlateDecode >> stream xœí]Iä8v¾ç¯ˆ³Žm€a –,>(t> |0z<63—çà¿oEIécˆ_>RT„º0SU©E>¾}ýõŸûÃýýðë—ßþçð»ûýËo/Õ±­«Ë‡Ó¯_n »£ûó¡íêÃï}ùyøùòýåûðÿ?_./üöå_‡?ýßAþeøßŸø÷á‡tÿèôþúÒªvøý/çßûV ª®¿Ÿ~þß/ÿö‡¿V?ç6óþ￘Vw=mãΧ¾ŒÇTç_ÿýo/¿^÷•ÖÖÃßÊ{P½Õ‡ÿýÏ—? —¯Ž5jx£¶ÃŸûƶUÝuzøskÜìÇ[}úzS û×ýp}7ùøù—Ìò*Áâݰåd‹Ÿw.e^ýØ[¥ÚÓE³Îg>b/jy½­žüMÕõ ?í\(îjñâ‰I¹ÑZ_@V· `v]=Å…è6%_v. ”ñ¶áâ©oÛ˜ÊlÀ7y ½-Ÿ`qkMºÅÏ;‡Êxßxõc׸ÿàŸÉowg˜õí &¨î0ÑÔ Á´ª›n £Ó÷*sùëÇà8 ¬»¤Uå¯émù‹·mBéqÞ¹8TFƒ«'ºæÎ¨”×ü¶|‚Åû&!9ï<Ù5ãÕÀV÷}:•àmõàoM]§[ü¼óD*^\òfkmÞìuõÀ¯2çËÎSÝ,Z< kn›7Öœ@Å»Y>Áâš§[¼qÌ3‰Š7]ý{Ì*x+—ŸŸÒÏÀ‹Ÿ¼üúMÙj ›æðãO't;}óòÛ(õá—“#ÉêÃ?þ±,Ð:üøóKlt=n1ÅýåÉž¼þ!ù=h˜ùᓊX­êá;|Gg„o—Šø~z*øúO^øªÏðÜÌb¦–ÜA“Ú|÷Ø©.ó=šÂê><›¹G…ï‘ØA!÷X7™ïÑB~w÷Iˆ ¿ç…HÕÒO Òph{Go®àøvþdwìú꼟·£}EOÜ6íÑšK`÷íOðŽXØSlæÞéÑ;•=jÕµï`pùN}4ºSïWÃpÓð‰‚«}u(Ñ6µ÷Î…Õ4ãÖ–ìÀ1Õ™ïØË;íqP‰ÔÂ]ö†Ïó¾óŠžàw»Ù>…À Ñ]«>C0(é§B{Óð †cNˆWÛꜮ¼Ú¶¸©m޵mÞ“¬c q„Ù¡Õðs¹ªî rð&Ì=±A©0¥¾BzÄïÀ½8‚èw0 ð%;:QfÜÂ’tÞ…á-9Û_©ñË»ˆ‘Ùƒ¸dÇ<æVÃÖÜal3@31*ã]rb¢@‚‚)ÈbpaÅj}ìÂ{÷àcJ%æðCò­VÊpSž„O™.# 1\®`Ô‘ð‰à"ú›bFFaÂ$9½u†#D,‚¯´‹'¶"2ºÞÛ…@UulZõݦ\˜‘–ø€„¼vJx¸0?#€×윣F‚;`` 7JýÑ h 03FûËc.…Éa²¡V:ï_œ=­Ì ä4„_@nÂÕ¦T!‹µcÆÞÀÚÙò{¢cøbLù´˜~ºår9ø§XÌ`(ù ¦ SŒbÑÞ{ιÞfÖβ cUÕjù…cÐ>ˆ¸39KöòQ^Stw@„dø=ÇqðjË{Æ/Ç\eÃ1Ó„Õ1¤ ±‹ÑÜN=¶3>¡PlªÚŠ»›¿H!Âh³¬Baâ0ŽÆ,‚ß±¯R4u7I«n`$íoî*ΛyÇ#q %“J¨Ñ“8qòÜ1è Nûì ž'zŠÓÑà;&$ãóx&­PAˆðBÇVñ0¨pê5„Nà~ð;øæà0¾Ù¢¿Þ.J`p§àc°—IÝq4„£}FÉÒŒ ÑCC—_@Þ¹c‰:(‚Áéøq7µ w`1¯7ǬÆpÈ¢Aˆâ'bœ«;¨~6M¿9³-¥›÷€RÕñbšÜ€ð+zRÉëz’„ý ¾Ó«Á½9›ygL¹oF‹Ãg©ÍÑ(íÙM>Qp57u¬{óÞãpQwÚ£™X{p.å~æ;.¡º[þ}Øñ˹'_àûø£ã:Ù4wÉÚ›†O&GÏ•BÞ¨fôÏTD‹Ëébú<¨¬£®jrŒÃòº“õé%³ú¸È½Ääß¿¯åï2>8¬ÔÌ]&(´~ø@¶|œ©S­ K„cÖ‘×òíK„c¥M­«Uã‰-<ªÂOð¤ÂäµHu]{' è”©,Yuô¦Ÿ‹¤Y0@YNìÛìUîJ(¢ÙxoŒ‹†‘ã² 9%7é™ÙNűʟG²ñýèP~“m¯ê»¶5Äh&΂QÑ4‹©mý;(ËgË0æ“üD¥ELí!\Z”?7¾"äMÀ°Û¦7•ÈDqÔ™Þy×Tí]„¦Úh/o]ž­_ëRU×­Y—Ê¶Þ °.EÌ%"x†y‘pJ(#embQ©µ«3ïÔMÁÖ&h9ƒ”™‰é«t²©é«bzå+LœU4¢˜tØ´:IãÂâÛÕIšÞתÖ×I(WAÄâÆãŸ‰9ty60\¸kî-J¸yx3ížMË,ûn"§pCÙ&9DSjoE²øÁpÞ’Ý™-Cwõ€$“?Jº“Ê¿ú„Åmí2?‰U–ÁŸªÛ÷Ÿ|h£®7Þ¡w›îY)c Y˜+,;2@8þŒi†.us=Ù“³Þp5c—ߦ»î‡è¨‰»©êºL#iDúþî~œ¿!ªû~"ðÉn ç½ûVuÅܽ,=xÅ߉i˹Ñîdç¥`_ÝìØ—ˆ'é{  s¤:GD§Æ6èLÎã`•é„´Û9Ø9Ÿ¾³vèÞ€ \9Í®±™…i`Èþ$ôÂ:0&Þ){G«ð®†1Äq–a°\öN‰ÁcYqY«»Ôcgrû€—;.§Àe›Fö—¬}ä¢&ì°ÚqYÜÍÖ÷ãœô\ÍϨ鴸Ü—1c7ÇòI0Ùf<•šN¬ZëáÉÉá×OŸ%g§Î˜$:TàÑÂrìR”Í*c2ì–Ïi(&s+¥È«[Ÿ¦–'×Å 8“*1Öp‹Ýì¬'»|ÉR‘X›Åòe¯áH•x, óló² zðMHÃ+I¿¡áõ;üc{Œ¡Ç§)­®­‹×?k-vU²Ä‹ òÍ&Ê0F_¥Ð%ÄêõGð¹&÷s¶•ªã!';ë÷jtâ–¢ÝËââ«´šilT›P¦n—xœˆñÑ,g—XC¦n*È2{#ÚR,FÄ ˆÓöûez[dkˆ¶1Ïh­”/6 k¥ŽG0òšhžÂŒ±£¦\¶‹Ù%ÃÏðHƒ葹™Nù˜½E`±ÈÌá‚síšÃÓŒ[ÆJ³Z4Ú%6OÚ‰ ‡íœ¹ƒ3Šq~¶(’Û­ªÒwlÛ8ê¨"ºJÅ2MßI<ÔŠQ`9ç[¡1–ÊÊî× ~7³ºß­Áæ4£â14%SO[â[ë’¬ããLÁ9o²ÑvªX„ŠyDÜÔµ³nö©1Pwz1®kgTŸˆl2ªAxŠ$ò´¸iºÎ»ó=ü‘¥ÏGïË«  ½׫͗e¬FÓ äNcÊ_>zNx(i¦ÑCe7Ó0õÁŒ¬Õ¦ä²—×—y1@ñy Ã_ˆ,Pü¬5’z+åKd‚ –cúÿ07¾<OÖ=* âõ æå~81,9ޔəc|ZÜœ7G·`Цai/btcÖ»q˜ylãÁ‡«2HÆÚßÍ3«^"YìDú<Õ¤RT]ËUÈ9 ]1«ÙJ”ÛS4JS£Ëô(•ͤ”­šxŒŸÀfEºóŠ’6UoÉ µh­[`×ÉEl3ê»õ}Û3 ÏrUeåªnŽ@m‚˜ñfùp¢AÔ-d×áà ˜©R¥²®çå„ðfѯ 9-ýØÈpíü¹x‘íÂù˜VÚ^á%û$)U{u 1W&˘}òf¡{£|Ý2.õŽq]~²ˆã©åÏ´Ýb–§àpxüNÀiù‹VðÂ_¡°ð|…H©)¤N>ŸWOFU·?øËËoé‘HìÔ¾Üa|êÃ]v:äò AᲜLk§! ¾ö¨Úó4ñE´îùw¬Þ±:»š´ÛSëKFGí@Mm’ÍÀæŽD—_û ½ƒŸäªfö†Y,¦º˜z–µ’ „Ûîì5XÙR  t¡lzæXz÷—R˜ ™2j¦ƒ;–÷T¬„ðqÉå7ðÙM®]9-@9ÍÖ”nQÒ\v–í}ºÜÆ.W£ËNÈcÏ«œ²®ßý` 'äi ­P Ô1áB¢‚Ût¯Ÿ””-"«ì5M´‚b‹ÈÃŒ(@ùÀŸ8v†³ sX†¢?•D„\ݤ©ˆãÀ¨#›2Ì(À¹æÈ|°Ån×Xo•/3jBõˆ°…VOvžÛZ°ÌXìn:aÁ çnRUgo²†¿é¼7³¹º«î‘i(2Î% Ôhl§ÏdƒíK±äÄe}½7ÀyRUPúÑL] ä¢"X"E»_ß-(’6¶|ðòÝlJÇÀ¹éÀŸ#C)ñ™áÏðQÉK Ù¦²>Ñ´ù–å˜JtÙ +LÜS´ Yà—H’a"ñ-ˆã´ƒ•g§ya}–ÇW¼¢'¶r.Õ¨Õœžk.Ô¤aªü=>ZûÝd}§po‹í‘“R¦õ ûoÏñ8(FÁ&Z—;È@Oºš0˜M5Á=Â5Ÿ)²(k«%IŠž{Â.2¹æå:ÿÝqê #'3p“ÉÕ’uƒ0!ŸU'žàÖ¿¢’…³DJ¶°3ZÂ^˜żÀ¿$œ:'Jë7L¢½ ¥S ™ÁL‡?ÂWCaº$càÜÝAõ³Cv.ÍTµ½~ò¢ «êxak•¿™™'îDõQû¼Ð1„¹Õàf5窞ygt¯ê©{ŸôòNs4J{,?1p×Õ÷=7º†Oðyðœ#tn5xÒÀw>#¸9+* n½}FO0Ü𮵆«iƒ/è‰kT3wR¸ZàN¿åR”Ûn<@ ÙnDËBY>¼E…öàúäÀ¶÷áñ`MØ6 æ%žØŸ•<µÎLXëÓºè’ʯ΃²pzÆ>YÛšF¢e«ÜDcǹƒ»Ø™I¾%*è(gôê•¢þD›¤R|³Èõ§ŸСpgQA9Ú+ëk+>'FÎSЊÛK ‚1z;Jñœ½‰­×òíÚ¹hôÄÂÕ*¼š_ÍÀw|‚¿ã†uz’éÚñhLœ s‘”ýˆ„R‰ ÉÀhwFp—"€ÄSQµÆ†è%'íâ)7»Y¿?§ ‰¥ö:M¸°x$#½X¼a ™±ƒxJ¯“™à¶h4»¨‰Ç¦SÞa7=$ñ$Ô‰œ^“ëYWÔRד 㣭˜ XVŒîÁ¸TV¯[ßmSúцW´ŠëyœoEçð®*1à¸m|-b]ᢼ\}ÉDc"²…ë²õ; q'Í<læ«!¬#¼óãmCrµefº…Ø'1n—aLÿY|[ÁUºóå$S£!Sö$›‚´ÜÛI… S4\Mïå¶ÕxÍ{’ÀŠíSdÅT.··„PNŒ±ÛR%a÷S{ƒ|`ŠnŒæsü–ÇÀ/ÒRr“R7C’ŸÖó}c¤œ¤;jº¼cËæŒJÜñm 28ml}}˺TÖL!²÷Û@QRϤò¥Á–kIRBÊ•dÜ@j›Šó£çpÇt§`ºÂc™´WÉ6íjwÔsRt”7q;ÅÕ´Å)­\|ÚKIîï/:¿³dn²åô8y“7ía"v¹úrɆ^˜‰I2òf2 „i¹t7¿I6NfÓ² jÚ?wãÃ)»‘»¦ª7R’ÐäΠo?ÛÔÛŒ5Zëç/”=˜6*·tÂÄ ®SÌ ö•_Q—²ÆuŠ¹Ç–½{Q&U@/‹˜e‡vB¸fžX¸B·žÛ“n»‰äKËucÁn¾I  å·\݆ÚÃ_Ñ6®Zóaž€4›¦^.WwSY ‰a}pyà:‡] ô6Õ‡h9€«úÊlÐé }çÊp-”âp®Ï˜j™±È¨¾ îÄt$Úׄ øpÚï²*ð“˜)§Œ»˜h#”+ù±°$¥h}‚CLóv¦~D”äÖWp„§N?MÅT@1¼'Ê38|»QŽn+YH4»"BaÒÍ6 ¥˜.Q%‡Å©&(Œeµcž¬ØÑÛt>ËM/«K&}ûf®Kûš]\¾O]7#·,?]yyÒÀ®ájº&8€è fäÑøczí²Qê,d›}U(“$¢DD© üA,¸˜¸ áñ–Ñè™t˘x7•ü(V“ësq_³h›[>Õo§~~Çžòû½°€‰w³ºã`]Wêä 8è+¤Ö .µ3~‚>êsbÆT5Ó'æ«{Çù"n § -~Eß1÷ˆenoßÜI‘;m[ŸXp¬£™С7ÎòIJmæ ¯ßq(¨¢Ž~““È"ÜéÏÎNjư{GõÅ1§é;˜_BäpÙFXvØ`vÜ ­8 6@“]‡"»à]…w¿×}}ÚÊëY†G¦/ès—¿~?|ùËæ–— endstream endobj 6465 0 obj 6666 endobj 6469 0 obj [385 /XYZ 38.2500000 743 0] endobj 6470 0 obj [385 /XYZ 38.2500000 107.750000 0] endobj 6471 0 obj [385 /XYZ 38.2500000 107.750000 0] endobj 6472 0 obj [385 /XYZ 38.2500000 743 0] endobj 6468 0 obj << /Type /Page /Parent 2 0 R /Contents 6473 0 R /Resources 6475 0 R /Annots 6476 0 R /MediaBox [0 0 595 842] >> endobj 6475 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F8 8 0 R /F9 9 0 R >> /XObject << >> >> endobj 6476 0 obj [ ] endobj 6473 0 obj << /Length 6474 0 R /Filter /FlateDecode >> stream xœí]KÜÆ¾ï¯˜sØO² €žr H@A'0b#Šùû™Y6gv›üšìš*>fhÁ–¼›ÕUÕõîª7üò÷Ã?;¼yÿå?‡oñ÷÷_žªcíªöŸÃù×/ ›cüó¡nÜáÛ/Oßߟ>?}>ý÷ûSû—÷>ýé}øÓéߟýÛé‡?Æ¿tþ ¿<Õª>ýþïçßC­Nª.¿Ÿþ¯§¿üîðëyÅîs˜×ÿÿƒ©McžÁùô÷§n›êù×oß~}zÓ" ì+µ­}]”5ö ‚Õ‡ÿþãé§Ó®ËWÇ •ó×§=›Ê´ÿKýd­Ÿ¿iNPëpúðé»É'Û˜–X¼öVnñgÈÙ±¢ŒWÙÕ…ÈܸБÙ 뺼Àâ!òÐ3äìXéÈŒW?6Ö(SkgÏ÷¶®\ÓèÓŸkÿ¹i_MeãÙp5?Ö®« ¤Q§‹-þ 97R"¹ñârÔV§OžqÖœM5þïÎ’åyIW×\ývv¼²‹‹SÜ/IñËò"4±¦\ýv)ŠÃÅÅ)n»c"Cq+z ]]KòÓv)ŠÃÅÅ)î/ÇD1›¡éú«×V’¡žaçGL¤9^ý¬Rõ™Ø·ø{­1R-æm¤Ë ,*9“¿…\€¸­™†Wç$nðºE³XJV@¨œ$ãœ!ç—Õ-iáâÂþVP!Èù[×Õ%¨­“[ür! /.MmS5-Êj/€³Ëê1gkFlñ3äÜHé¨ —¦¶sFðl_V— ˆÔÒ-äRg;]üsÉ"’ö' œÿ=ó⻯Oo>){Ƨ?|ýé¨=³ýíë %îðÃ9°ÛØÃ׿?dþpøúóS8zí:Û'¦BOª·è‰vðøD½/RøNSþN¥Ya«áˆkÝbôã×IÓ¾®ÌjhÏ tܹo5ܧõÎ}W:¾ƒïPžÐi?›½³'„ˆ7ÌÊ—KüN…OúG‚DÁ°AÞÉ`®Fâ*x攂OðNñÙ¶3J;«vi7EŸÍ%±~†«­@r-/í0ÞàÙÌÈ'̬ò©úTna™F’ÄðŠ„ÌÈ[|°Ý‰±ƒ¥*æ7 Æ~ç;£X"áwü~‚aÓ˜ Xî`ŽÇ§Ÿ…Ý^yx{¥9¨0d¬hÿl¬4Ug¬¨V4¨êèZp®`~@O¢ÒuGíÛG©*Z >ɬ†!èÝ2¥2ÇZ5õ«ÕZÑ ÔÑóúI€ßyßñ‚(ІÞi™Åj)Ÿ è¢FÂu!øˆžd¾Ób´>šP%;ż±“b'˜Õ æ* Fáw¢@SþØ´H¸ò›†ż1šÁAà ȱU+LxmïPèÛ³”2XÓa£‡Â¢'•‡OZ­Ô¤êcà¯Úvy{´¦NÎÖ{ô¤“' Yÿjƒø;™ÕÜ:\-šRS6ˆ?\ÙrHl ‚Ñ®0†§<Á«eæàj5„ óÈ0®?Fct£&² ~'zýÍ`Jùs¦æ Aüe8c)•ö#—ü5a¡À÷,» j=®=¥3oJ'˜qxf rÂÀÅÑÎ9×NÖC“5žw‰ Á}¾Ù¹OH&iz[”+òdSé®ê$†\ÊüèÍ,ïõ,ìŒë ÝŽÌ1H”Õzγ„/+dTm–ڥ̣Kcê”' c¨ŠgmÙTuýZ•¥èp2['8ƒS&!$È0ïܰSy­¦ÌÅ©éw¬Ò/E§àà …«áXÓ˜ö”eøR\-/®ÂMDÑÊ¥œ˜‰9â*æQBد½˜1èðj8r3(¦ Ö^ŸP²!8òKÀ†-͇ÔÎd„(ÑÛ9dÕùÉê„Õn[.*.]ô7¦ˆKJʉâ‚e’DXøRÒG3‰Kf¨±ðåÈ­fü_ –ŸXæN9dRªÓÓa(8 ìÕ©52êtö:ØšXpTfKðz=jSL"6Z"Ô5^'¨Ë¤æ g—##¶¤rÊÁ§¬†%%xJ~-Ô@ýúJ–<åˆÍ’4Ð\vÀô’§G(4É]Ÿ—zµ”Ú.B±É6Âø{;Y”SüDŠ_õ²FêF:6­[qÉ*q-å}úÉ1ý.©2«ãÐYéË€™ªÛ쇌@eT‚‰L.{£8ŠL¹žB¸cð…%ÍLZ5 #é\§ªIº¦/Š a·Œ˜K%"©4—`4fl‚јI*õ.¥0/ÏkcÕ‚W땘~š®ä°@¢X]XðÔì4•)'m«õ¥cåNç —‘k™BÈëeðMê¶ÙX‰@HæH8†@">ûùDóm¬à“+so}gÙ$o(E$‹¡U•—,ä1åºM³Ù"#ó‹O.ï1_ytùЉmZkð˜¯8Ü=fnyw(oƒ‡Ÿ AzR’H6™~Cp)Pè X kR²pŤÊ2£³,ä3BFs`É%cÖÚ¦ò–ѨÂ,´½b,ƒ)žÉ[Ý™‘U”ô$Îr±Þ··>™3h|w—sn:hšm'·î4–1ñmµíû>ˇßVÃ0{ðkÙà—õ—ÃJÚ†ŽÁ¯ë'WüºóèÁ¯dY¾ÿèX «ìÐnÒBX4˜Ò£zgÁ¼Œ‹~÷A¢MÞ¦[œ—Fkd%ƒOZ'Çq$½XdÍ$ÖÛ¼$f©µÝ ;?~yê÷ Ð6ƒBÎ\Òê‹›°Ë—±Ü›A¼á€•sÝŒÀ Xíá¢û §‹Î儯pÑõ“+½ØËBJwÐL°‘HÍòwæz~"©Û5åz,G½ý6"o——½£ý¢íyzZöBÐø<á\?¾øÔƒ‘b¾n¾w™¥j <5©Æ»«ù²†¿¯l‚½=»p3Zp·›± Ï\^%¨NÓ< S_'¯˜aö\$‘1·›‹<;¯´ô#ä"÷àË]gCo;4#ƒIÎM•#:°­Ïêôüç΃¾¯©Ï²¢WW&á¤ØÕâóεWé®çm®0Ëì©F‡×ùWsYËrÈ,ÚK×VlzðªPl)BT”C†`”`uˆM¶Œ!ƒ•+ŽIÀjÈI®6WC€ ™™Oà<§É×ã§i“~W†Ç7°1Fí|ó‚›ñeôÞ÷Øy=\ÚŠ\ž&œJö°V$œÒ!Ýõ‡!8™ÃxG2ŠÅpBÄn^ŸìÆáFûÊ®Ù<%Ýgs,ý0&J¨. ‹t{ä&eØY‡üájìL(RÓu/¥´¿R]™ÉpoájíÙº¶ÁjªØ1µ)8q=뫆fG]]HNÞ bj Î^5Ú§ø ´š%MçKïÆºÌÂácÎgH4þîĪ{‡b- IÜÔÓYkVLnBÓ–;7,…—Kò–ÉŸåËmßC9Go{IË×Þ%æ–x§cœ„;´/\ãÊ1¶—’&ÝëÖ1¡åÊò=ä7x—ªq©ðÖX•À'8hA*v¶Âà2( Û(gUµ—N&iç’)Äøš5~²xï%’£HTÊ,í™nϦG—lJ½K¶;–l1ô§ªæ–ýž«ÿÆåâA»nÕsõÀ–biCÖÑ5ƒ¸ê® ÓùnweËÚæ(‚3S«M]Dä2ƒß1[s¥%1#£–^ªM‚åKªBDzœ­{3b+ØË…Ñn 3vz¦nÜ€²Gté¾dæ{ïŒö©BÌã)¿ƒßñ#²sè „-Ön ‘7 Õ¬.Ç5† šÝC·’­ôáQ1Ò}壌`ø4Ê•ò‚) ,°ÆZFw­Ø”%%ã(ÈŸ·yÕ‚¸6ÐN±EDQÊ7(rI·Ô»TF,váŒâð†ä·dfºN‹›éñh¦iYÞ;é„Ê'Ò<Ç»-ÌÔltaLRÿwÂm~%Ù&¬mQýR‘â£D0=y3ò¤–»3u*©cYÌ™ÉáØ”E‚5+‹#ñ¥ µ Âj~’êj1#R@qLPµ¼±ׯqõ%¢ˆFÊùOštúf©žžUEõEÁ ¾ï)÷-_‡.ßýÃêt×›ËPä.Ôµ(Q×yk×ÇATgH¸Mí’ã­2)–y]hV;¹r•¢>Æ,%YQàªT¾ïU\Yq¸±*.oÃd¡·|²hùËŠ(éª1Gl–+ËÚèµq|ÙÕ臹d?s Ny§U7õøQ˜aPPNÖ)¤Ë;8 ^´UÚ¦øØ/Ú^žPb+Èn絛ö&aÃÝ.ÍŠ¦Ù¥¶j&‹’}%ïèj7Ì¡»õÊj½»…Yw7#`{Ã+:~ñÕøeŸ]AäËmúAVu½mKÞ¡ kò‰%­7WYI>ŒP´C ã¼ Rƒw3¡Q eæb½\÷~‹²vÖɤ¯z¦ÔmQ’%¬]HÝ ƒˆv†jí‚æ\K¥ÖŽe0Ìt Î;x½!(;(’Žõ;%b…PÃÅÓgª@榕V¤Øs”{¥,š´Á¹dÙnpmÉàmæ¤u¢P)Ý– òÌæ(fK¯x¸@ÂõnÞDC[+P’¬y¦’šJÙ4EiBmô¶|ÑqçmT[Ðr£Ê„ц™!`eº±x²=ɦ\þKETOdàéwrS¥¤s åÖ‰¼j .á+Šq•¿,W®B–÷ éÙ;—+°Y/-a“«d‚ÅÃU¾”Ä?ïlàÃb\6WAîš«šÖYüáIÔYI`¨ a %šU õ † ó¥Ï™ú+< ÀÎpÙF[Q^É(¢‚À¥™6EcÈÄì$r!é*ŸjMæ,Aü“’ÍwâWQ:Wl{Œc"áQW1 ç.Uq‘;.°ƒ%~ –¥gÊq¹¶uÞ~±>ÁûlÝ#7)(zªŸÍГ.ÁcCxþt¡nÒCš±í)^vþ¦ë·Li þ0!ìLšÂÊ"Ây›Å²`Û!Ó•¤þ4ÙÀ%…âÖWé8[Æ»?=¬ÍÊ2ú‡—1XÎÜ‹UÄæ¦/x§¼1ÓÆEƒ0«Ï:Ñ" ß?nE¸Ä÷/óÚ£0O¢ÈqGÝ›¿ð®ŸdVƒ°Eonà§mè^H/²à9à”ä–âE*4J'ä}ßi¬>ÀzC80p§6 Ÿ`DF‚ÀÁýˆkŒ ˆ×Ù†ÞQ×jcŒvSW|w2¯Õ£jgöÃÖù fcz§Scb*ÃGø,A|dh…OŒx÷¼r—^Bæ‚Â^N`ºzîÀ)\½ÛsÄ26&¡&ŸÔ u.»T6Q2[[qJ£w–)¾”@!8ž ²Q²Í„bŒ’zÖÆÿwQÍXõ¬“ I¥‡½£ÀáY‰ i”œù§C¢78¨Þ9Ÿnb“ " \-NÇm¶iRÞ9¡ÕL$8-Y¢ÔÌ“®+á³@¸ÈÜxKwF‡Å, ×8>G)7bpp'DÎ <„,9E¨IEÞl9!,ê(ã›—µ³Á …ÎR¾Å%Û‹‚Sn–±Rƒ¹êNÂ+Ÿ¥›škü¦ÍÁL¸±'Ïø=ý:|?!2‹çÏca‚xm—'ß®Rç`ßA_J&ñèæ–BõÀ©iªî&k÷öêûOâ˜Y}ôi°1ê›!íõ}ÇŒ‰…!Ø>ÅöG…áۑãì¤ ÛE`{ŒŒ†%"¼ lCáÕà;Q|«¢­¿¨K¤2ÜùÏ'ˆ_[uØL)b˜0ï`Í™Ct ¢Ug' Yáê£hf6Ã)'Çh³ð.JŸaíævö©+sŒ¢gilÔº—BxL>?ý!Ùf endstream endobj 6474 0 obj 4582 endobj 6478 0 obj [386 /XYZ 38.2500000 681.500000 0] endobj 6479 0 obj [386 /XYZ 38.2500000 146.750000 0] endobj 6480 0 obj [386 /XYZ 38.2500000 681.500000 0] endobj 6481 0 obj [386 /XYZ 38.2500000 146.750000 0] endobj 6482 0 obj << /Type /Annot /Subtype /Link /Rect [392.250000 778.250000 415.500000 785 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://www.python.org/dev/peps/pep-0328/) >> >> endobj 6483 0 obj << /Type /Annot /Subtype /Link /Rect [103.500000 125 130.500000 131.750000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://www.python.org/dev/peps/pep-0420/) >> >> endobj 6477 0 obj << /Type /Page /Parent 2 0 R /Contents 6484 0 R /Resources 6486 0 R /Annots 6487 0 R /MediaBox [0 0 595 842] >> endobj 6486 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1409 1409 0 R /F8 8 0 R >> /XObject << >> >> endobj 6487 0 obj [ 6482 0 R 6483 0 R ] endobj 6484 0 obj << /Length 6485 0 R /Filter /FlateDecode >> stream xœí]K丑¾ç¯È³çˆ½€ÁÓ]Ý ìaF7°ÇÅxgÆŒá¶þû–RRV&¥¿ RR–¦aWU2EƒÁxGð‡ÿüú¿çÿÿçù‡_ÿ~þ¹ÿùñë)»”yÖýwnÿýñþ]]úßÏe•Ÿþýôýüýôåô¥ùÿï§î¯ÿ»ùí_g}þ¯æ=ÿéÏ͇é¿Ô~á÷S©Êæçoןu©šß²ÛÏöó_Oÿó‡óßÚ‡×õÀ<þýGSÚ*+Z0f^ýý4,S]ÿýóç¿~èö–ÒÖ…Òge=«Úêó?þïôKó‚aúìRY£L©sÛü^¶ÌòªÒÍï¥éÿc_^êëÛ‹ò¬tórôîë?™ÙU„ÉKmâM~…\)ÊÊ;ù¥¶J•í.¿…¬zô”E‡ž:üaöȯÚõG#›ri¤ ;‹&WíÞj•U¡ËöTg¦ûó-ki†Êá|)+Žªûé#L®êh›ÜC.Ž•n—}³Çc×ÊÚöÕº¬šWŹ!4Ñ¥9ÓËnJ?»ÉMÄÙ¯°‹ãÅèÚ;yô·Í_wü6}”=±•Š9{ {¬‡“Gßñ¼U[¤I )gú({Rè˜ä »¼ðîvMIxíÙ¸ Àæò"ðuú“GÔÐzÈű2o<{\[+W™ª:¤ s,gö[¢²:š­ÕC.ÏÆ¯Û'½ÛÊæÑ쯻Ùclˆ6u¼É¯Ç±¿ðäqX¸²Yqo³Ç؆F7ùòX{ìNþ%d I÷ pù}÷<øáÛé‡Ï HÅùÛ/-¡µ/ì~|ûýd›?ZOCußþrþ±çÓœ¿ýõ”_Œ®”ίðõ#ú:R]ªºÑ¢îGtu±k:ßé‚g<ïéf«^?ø§·p¤€/†³) ¬(Ê ó‚¢:¤˜Kn‹ª\¶-ꃋHüU<=F—ºŽ(3@»déŽdl̆aÂÀ¹>–p¿¦kø s^ŸBr8Þ…Ï‚“àRÀÊn2~qˆwÃC)„lñàŸ½nŸ¾5²7ŽØÌUéÈMÌÔ=§ÚEªþìbsl|îñ3/3›ù Žà³énÅ*»¥jÏÅ«èSî b(#…“8Ã<æÈ5H `–§»Ù”†Ì6F~€v(Œ‡ÂøÄꀵËéO?÷⫬ºFjdü©eRL-—bmÊ£ÃüYÕh?ðVõ 2—G©ÞáCñÑ.뺪köι±Ì3cï?ùíô5¹¡}…áÙ6‡‡—Ô¦“põ¥,òÅR1²Œydæ½ÒÕ–‰º+ŸL :•Å1fæøÔÃg<Èâí§4²Ü5¦üAƒÅˆõ´è†Ôà´EøZ±>A9Rðfb^8bI@ˆAÕ|üˆBÆBt. þëÁe<Ôu.ùiì•K€u/G¯‹}€ýŽ8òŽ|„#ôÚðÔ~ÏÜHDÚÔEîbW2¤ÔLÆ„1Šm5ÊûEÀæq02–ìrä{ü ¢ kЬóHNfo êòˆ"LL$®ÖlšÑcÙ¸qMnµÃh(¶š# ;Ò^=Zàñï1Çûs°Ù½ Œˆð8Ûñžb¨!¥(Ce'­ËlVµü ÔŸ ÛOÎ2QÅÕt•;çZ†1“Á#™õþÖˆŒÉh묀RX±ÍÇDXWÏÀÈzKu"Z×GøòKV›Çõ`:®©ô0t¡¬N>y"¦€3µ+áÇsdÑ@¹vFÞëјKÊ"rMrFê31Ê€dt•̼0Ê!auãY–¤5÷ì&H›UP×ÇöÖÎ3 5ÔÎ{"2•Ò–‹…“‡|1)2Îæ€;–Šzt\wô¦Pî2ì§l ÷ïTÍ.°˜ ù60FX´mÁëêñ8¼ÃƒŒ·Ãƒ·¡ýIÃ7ì›èác/RðTgUOg \©³[mÅçÁfí2ï6îô¶q~Ñn:dï`™š ŽàÙzé?õL Ÿ1p¤;Xª”‰W‚×7]µÎ? ‘ž¬Ë‹æ[q1J;ª„­wšM¼GÃŒUB Ôx¥o‚‹ñþÊ«ž@øékbúý1>d_’Úù«{øï«Å·Æ7O`&&ØA5¦h*J—¨E㙲> E#âÓ•È× aº˜µŠ:EÄ&ÓEÖw²Œõ/‚H•+ª|¶tÎwçF‘íÖ9Ýf•ÌðŠÜ¸jFbiÏDgd<®©Zqå!å{ºO2s˜dQã”˵ڀ„¼HªÈ‰¸ëµŸ «ŒãÄF·mz·›~2Ó&Å=.ê6P&²e‡žH' ‘]b¦pØáKá»¶˜¿Ç;enJôŽ Ñ|cÏã¸EŒP¨n*ƒÛÚxZ[ÁCapû( Ûµ›¥®y>}¢¾³vßI/S9*„Ã(³ú2ĨH¦§Sï*›7 tAk‘#š5+œƒË¤äãx4&Ÿ6Ê53otz-w_z©Î¡p,¿23bøÂâ*)ÝÕ¹‡’ò¬JŠR h)aò8º®3ÙKXekvÕ$*¼Á*T;0“§ã$Ë¢ËËÇFê7Fcõ‚QpD#ÅÇi^ÁdÜï)e/ß·»«è˜†Ès·d²¶åyÖ:È甉^*5×9|Ž.×ÌÓÞÓ |Ÿ#ÄJ Ä›G±fÔgÜöBmÄ€ N­®g×êÔÊB`°¹uð-ð ÑS»£wj„¸¨‚jǯÀ<¹„¡x†ªV¿Ãs]vó$:I¥„­f!}GRÓ3²j8}ÁÞå±÷»àÐÄ !™†°.U6Íx>µÖÇ\([tnÆTÝ®ž´a„ì÷Ž4L±¯¤®Æ¤^Tç–`sui'þýö·¾TUv.ŠöG©Tÿ©=ù¥;UÙðÉϧÂ^”ªuU©Û·ÌÃ,æþÍ÷û¿³ö±³ó´­Ýw4Ÿ4Ï>ÐsØy»cÊúA‡1U6¡Ã˜J;úEû‰«Ã\¿ef1÷ïtSV:Œ)K÷Í'®sýVõ0KõøŽ$:Œ©òYúyGlÃækR š!wh;'¥D“Îxe“ŸŠU'æ¦uL0̦îC”æqðvé™gåƒô̳jBzæ*s$[û‰+=¯ß2³˜ûw Ò3ÏŠ éÙüsßÑ|âJÏë·ª‡YªÇw$‘ž¹2Ë‹¤ïXzæ·èÔ!=wNJ‰¦*vmù%#Yb#…IBð…/ ‘Ù`êmYE{ƒaj#ñÑ8H6™"«v̆6¥¿í@ÏĘ‹â†¢Œ)Èî8™ªŠ7 ZH´($Rk¾)]ä3YéÐå¡ÉlH,ÄìqShgç©–¾¢÷O2ejT¡œÄ™öTq&é.µkµuhÃSÌ*Ú?"e‘Y©ì°:˜žÎŒ<[|ðà­o 13x-Æ/Þ-¨ÊbS—g0ÎüŒy*¡Ó?¦r¬Î3TNtî`vÁ“TB@íq `3; àˆo²®ˆƒYó1ÍyÎõ,F¨8áÚñЄÀb®ˆ¹C±˜—éVXÖzÖ©¢ejf°t¤ÖÃ@©SÁ½1…hÌñ‰³ÐÓNîPªY,î“;xt³Dá¨}ÄŽ„T_t÷Ù¸7¦ƒ{ûög#Ü»žÇ¢ðÈ‘3½SŸÈ[s¦cÓr•Õo ËCÉžNÙLjÎ;Ð4öÁzÀæõ€JW³X”9{||c×Q† ŽÄß.¬›Ø³€oØ!}Ø2m;ðá)ÀÒÞ×±Œe æ\DtJ{'h,Ç<`Ã2Cí9MøÔbG¶‰H‹Ãíâà‘mDc<ÔL·þ}žzæd%’®=ñS9ëL?’ëDëgO:lCÝ¢pé‰hÃ%Ùô2&yuµ»‰î¬÷P Óé™îai[9o—¾Ã'µt¢rÜÚÝyæv,Ìùˆ.^ã^gÌÑ–sŠøYŸeé`9Õ=U©:ääå‹´²cîÒ¡È_S+zo™l¶wÈõk£Ý}€w’©½¸sÜ ü·,òÇé…©šà^ž¬íѽy$ä ^ævЈûm„ï¨z77õ ÿø`ExuîªÔ…‰LWR¼ó{ºFhÌ&™ á%:´îМQ ãrÈïÈÉvjÓ­›IÌè‘¯ê¹ §n¿×.áü­Îq9K^ºù/G&î’Íq°®vio-k’ºòó3‘>ò„"î)&f6©g\žeJ{0­ÈJ×6YF®+gçg-1¡1®ð¤Ü8ñ8âVm·€<¹tšòF‰6j¡üÌÁ¬:.k+ª|-Ö¶z4~«}×`ƒP5Òòý…ñ¥`u…H"` ð¨E©"L‚C€';‘/X¤1TÖT¯§u='k s©ñi¸1Fʸ +Ä*Åeõر§™ÜrW—þì|à±î0ãYÙo­ûÎa‘™FT¿h¦$Ä|€€Áò˜ ŒCFÿŸÍîKànµor·2.&lÀ}Ý<Œåb]€Ñ²ÆáBÌ6BëÛY™_ÂiÏN¹B+ù¥’”1˳y¥Š+tÆ0LÓ2ºM,KeŠ!Ñf»ØÎ?—³Îñ™ÌºÕY+]Œb鮺¿™Lý *¬TzòÔDâÿDò-ßÐM) ¢ÙøD‡0y‰C¹rŽD¥k×¾Ø~âQd”Ô…‹’Ã(ÐÝY¤DeÅèÅÕ™íKÏ ûÌØEz £Ãglj ^uíSnƒ-ZÆHU«=öQ‚Ñ·'˜ªÌuk4e,2j­j(Ú0W`”ÀXèY`BNnt¬ï ò 7Þ=âqÔÛÆ¢ ¡QÑÈ åp~È?»ÌÈ¡"IÌmN¸¥ãÉ”õ†C\‡0fØç¡·T~Éjó¸a?ÁÙ:MéaÈ•t xj=t,êõÒ `dïõò”•jD@8•bØ£,ê2Ût™µHôsÔå"À­º–‹~»9ABr•RÏ «)Mc„½¥¢Æ¡ÄõY[9RãHÑ)úE¦gŒq¬ m ™Ó(S‹0Ö¨âšu“¹ÊÌ8;ûè¹,”ËÉ6Ü&"áˆ*Ëo7Øl¸=•OþéªÔ·z×ý@}¥Ã~§ày7±w†>5Û»èíw¬\[{,´’,UVóDµ:[6vEL¥¡—WEÃôr¨]n] Ðíè¡$¦ò]×Êȴ"¢o7’ gˆF’S%²$}0bÙ°mäP™H±‚§1<^1Óœ†q7â˜,‘¢î!ÑÕãÅTyî(ìÍ„A™zGÙF½‰üv 'ôd#¥êŲ¿®˜íá.u_Ü6 k9ŒÞˆÃBø*âBÁÍX1CIyî*&DÖ«'J»zi¤p[BÖ3éвù$ ‹¥Ò#EÒV¯þñD…ðXú‘޵¹ \oÑáï9çž*ö< d{cÈÞxAð*juî´«Æóêq¬'!RÅž—o¬o{=w{~S˜iK$r–]︫ýø°rvdå¨!’áîbÔwÖÎ;ß±v‡{oÈWTgUOö@¿–Q+cnkŸÑÚ531Ò/:¿h·ëpïÄžš ŽàÙ´…ÏÔè™þ4Nt¯ŠaG^ߣo´èx<{N1µRüžð™Þ£_\ŒÒŽtªc“„*F4‘A|h¸#»¦°xvCñŽ!Àt$ ”ŒgÓpf1?vg^³áö¤›kì܆QüŒ°™Î´-íiuv¯LÜÓ˜z ±î“EÄ©–§Î–S'.¿ÇÏxBVZABCÑ8-U:L©1¦Ú_×Û0‰æ×¥¾ÿà·ÓWÏAÃ!Z7ññQUË %Rf113æÆTŠ­ØÈ©²|o…{¹‘RjŸ–ßJÒôãY{FK\uëÉZ½ˆ º]t—§ÝsVL¶L#sÝŒŒiâ){ßóÁ’–”Ž% ×°3]\öhf¢[Fô^Ðd*Y¢¦¢Lp/±êªøïœýŒÀÁ#©š¯3°a3¿€.@ZÀâR¶¡S¢Vβ]Ä©»æŸAŽ%ðVõ<ÛKT­ÒoPVU$8~ˆ²ÅÜk0Û#žé5Gõczð¤*tÀÞmè?ô\Êùa†™Ä¼ý¸Tîyd’@ÖW‘$|n‘pW³=•û¤ìåaÝ«“ÂJûpúN!e‡žÂ_\v‹Ëç`ªÊú=¤(pâ ÜË(eû¬ËuãY@±…zwËô{6Š•íËŸ”b«y\=ÅzJÈß Å2eôkv<ë ÅÜäÈ•jÆUx›Iªð¸M±ÁQî´æE´v´9é¢eŒãßqaº#‹{*ÓQêãŒ0åpy?؉9v|ùpød¥*oZ÷J/X7®] '|Y>ÍÞ…a#ª¡’ÅDWÊä‰z¢ D¼ÆãôIäF§"²Êeã¤p=ãð &x<×¥Gý‹{QÂ"nËMvmÅjq#¦—Ó<ÆI‹ZŠ®¬+l÷ŽvµlÃ¡åæž¬@½«‰aûä‹äÆI·V“!UìDê­°ª"qé ætT <†8»òÚæßù{ÃT½<÷ËÜ0åjŠ'›FÃÎTK‹gmè¶‘–øéll}Ñyy7Òy¾ŠñˆyéŸ)Fõu îÝ z™ÓH§`ûܯÅšñI².9a#¦/°'[œZŒÕЉe(<|¦ç**héå+Ù²×þÞ@üh˜aGO ôÚ¼Nµ âЃ>ëÏ.@sÏÖ1w#Xq¸”Ü+RvÁ³ CßW½|ÊÌ\zÖ³ŒŽ4.½‹žÌò×/ç/§ýUÞ0 endstream endobj 6485 0 obj 5809 endobj 6489 0 obj [387 /XYZ 37.5000000 69.5000000 0] endobj 6490 0 obj [387 /XYZ 38.2500000 514.250000 0] endobj 6491 0 obj [387 /XYZ 38.2500000 514.250000 0] endobj 6492 0 obj [387 /XYZ 37.5000000 389.750000 0] endobj 6493 0 obj [387 /XYZ 37.5000000 389.750000 0] endobj 6494 0 obj [387 /XYZ 37.5000000 222.500000 0] endobj 6495 0 obj [387 /XYZ 37.5000000 69.5000000 0] endobj 6496 0 obj [387 /XYZ 37.5000000 222.500000 0] endobj 6497 0 obj << /Type /Annot /Subtype /Link /Rect [214.500000 485 270 491.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn3 >> endobj 6498 0 obj << /Type /Annot /Subtype /Link /Rect [150.750000 360.500000 174 367.250000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://www.python.org/dev/peps/pep-0366/) >> >> endobj 6488 0 obj << /Type /Page /Parent 2 0 R /Contents 6499 0 R /Resources 6501 0 R /Annots 6502 0 R /MediaBox [0 0 595 842] >> endobj 6501 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1409 1409 0 R /F8 8 0 R >> /XObject << >> >> endobj 6502 0 obj [ 6497 0 R 6498 0 R ] endobj 6499 0 obj << /Length 6500 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯ès€m‹¤$J@Àã™ CÃrrv³ ëEœò÷£nIÝ3”>J¬©¢¨®±kïÈ¢ŠUÅz±þøåïÇþ÷øáÓ—~ÿôåPœlUôÿÏ¿~xùÝœ†?mSüvø~ü~ø|øÜý÷û¡á˧?wúßQÿÔýûËñ¯ë~øÓð—ÎáÛÁ*Ûýþëå÷ÖªîOÅõ÷óÏÿuøËW?7óúÿ0¶²ÖžÁXøô÷øMuùõß;|èö[©ª*ª4ÝÚRÿóÃÏÝn˧V«ªnjÝíñÔ¦ÿ_ê'­>³¶ÍQé¶û~í~±Ÿgu%°¸­ŒÜâȹ‘¢L­|‹ Ѹ)*A_W— CÓ‚‹Ÿ!—¢1Z\ˆÆmS÷ˆj+L]W ƒ.$i|œ)#Ñâ24ÖÊèQ• Ãuu wYpñ3äÜHhŒ?µ¥R¶.mñÅßïÀj#HÙëêÈ·¶\ü ¹eÑâB§·1JNBßV— C«åT|¹„Æ‹ŸšÒ(cugrwÔ>Ÿâªit÷gk†Þˆ²îäNôuu‚˜ÂŠ‹ äR'.Î(«*[9ÊÞV— ¬4Õ{È…( —‘ÕFWVÎcº­.A#hÆõ yLxqaYmLS žèëê)K9ß©‡\êD»‹YCÒÿ„ë¾{^|øzøðÜ ™úøõç³X9°ÿíë·C‡åκº=~ýéøûõ‡ã×_ª8ÕV5¶ºü½þIÛ?©NEkÎñÍÛ“—'å©4}Üóöä¡GnO>¡wT}yÒœš¶¨õ«ïhøÄÞyº<©NF7êÕ…ß)áNá;ª„«õ8xúÚñˆ yU]:ôÕý7•:Ueýš¾|(þ„B‘¢éßYÁ>EuybÆý­b¼$¸n „ßÑ „Õ â'x5c0ê9ÄÌ€F9Œ¡¥ÏÔ 2ë¢\™ª`=8§“ãA`Á *=œ÷å9IÆ]Ÿv,oX%³GÞÙ^sîT¶³ EÊw(ÔVµÍø¡5ÇZAE9…GÝCè!?E»Ð 9`1)!Š –L-öaÃb´_­=Ùºr4,ÝbTg•®Vë³ì¹«ô%A®°È°Å8ŸX$øøMþ*Æp€€ ]¬U(nÖ¹ÃñGÒˆLX cCdjÌR´?‰p Ëg‚Ͳ9Чœ‚ÅA[–Ô5tïC2 Ò!ÞQ—$ÇÙŪÇ6 %ŠèÁ-> úÙeŠ¾á ±p¸ÂI÷ëE·Çƒ£øi˜Ý"ia’Wî¢ S‹T"]3jrX<¾×’ý!¼¥Í(¢KÄD‰7<¬>¹!ê Ë`cYAè *Îã4aØ(2Q^ùUÖá UŠÕ >LXbLM¼R=ÄÃ&æN¬=ÖKu‘CÒ}©Éº·éÀØQmŠ7A"ÏÉòG‚æZŠ^s¾…ÜÃ-¤ ²¬k×b ¬‘x"òxC£˜xÁÅò)–U\5£^© £˜ ¼÷ç=ÍÄRp”Ås[ñ€6¨{Øf"úž^ ›i9a«>ï¶òq`èá3/¾ƒï.‚_£˜d„”DÉ–-¡ÊÛ_0Y¥^ˆötfásOà“Gôd8Dsï` |òŸhøD…C`0ÔŸÂa3£$ì`ú´¨ñwð;•qt"OùÒ%2’’–ñÅ3!•ŒÒŽ\xÀ½Â%õ`{såUQøŽŠG©C"ÁƪHƒ’ ÔÓ¤Ö|Ë7ôß_^º‹«ì`¶«°fÁ¬ÆhÐà†Ì‘{ôš§qÆ!Y½fæÉ@Þê¤'6ÀG¸|‚WS6gÞiá;æz]fy€O>A¨5|Ò³k}2&šŠÎØ0ƒ}1Ü©g5‹`ó¬6XÊõÈ•k¾ó¡~„ïỔ­¸\ï cÌkDÍÈRœ0ay’¡@éÅZ/ÇrÃ@šaH1ó)A›€ bëžPyLIaá‰F2'X£È£ÂÖv¬‚JRg›‰OÂч*V¢.Æ Óâ%oún5/ôÚ®š%݀ÇãmÆ™ ¾öPcûË[^ä³ÔŒòFjrØÉBÛÆXŠ4àš·±ã5%cV¢àL麌°TËSU‡ßïY&%¡øI‚­±]D*¿ŸD˜)—¶,ݘJɨa5û)Á]‘9÷Êm¢»¾eD´ˆ7oºŸ––lc(¬Ò‹ˆšªwÞ{²õr`³Ù X1¿áŠURoUÚ!o@ó€èÈD$™%±š»òÊnÖùìøÂŒ¤‹&í« T¿;ó&Èðš÷$9д‡-JRÀïgZ™;=¼¥H„8)Z·v_2ÑÔ(G÷ ßîmˆS®/ ¿} %Öߤ¬(ÿ[Š$MŠ%¬¶ÙÞnOË Iʇqà‘eôM”ùê’Aܦv´JHMõúÞ,¤ ½HèYB?ž9z˜%–¦y&yÓ´ÝŒ?^ªlSʼ„ìñ¤íñÄ Zé±!@ÊE6Ñ*©vVç§JãP‘¥»<éPS‚ú—"LIÜþ|ØVÛ÷Çbu“±)5Λ‹à‰*P”Ѫ”Ø jU[TÖW`Ä…j]»Ÿ\rìi =ô^ Iãm~™²ÝÄe ˜ç± êõ]ÞàÛ‡Ý5nÓnSqtk£õKÝ>™€8º“Å“8Š–¿ƒ‘B¡xº/]ûÈû¶•¹‚ §ö’º)RâӬΠåN%1)ûŒL>cöØ6ôؘCÜûœ4±^ðÜ“±v Kzމ|ÖEa'Üç#Z8ºª…ÂѬUm¤ÄJ¾>¥V“rÓÏ1Η‹'W«ùFÕM¹jÄÔ_?÷„âéH« .Ö³K«ÞP{´@O¬ò—]†¤åul9̹i¤ì&%å&±t„Ž”›Ê²8i]i;§Óy“dóÙ:û¤¬Y΋ÕœTyµ¡6k‡[„Ú,·f:‡‘º®ï´?:ǨSf ñîo‚s}<ÓÔŒ­ú%‹4a£kÊQTDj_çcëmâJÖ:ø‰6‡‘ÒÕŸ¥¥ò>“Ò³1/kÌ NÖ}÷õZgLA4ƒw4'x?ÂÕ༚^Âixj¯® Â'LíôÔ\M"Û<6D^ej‡¾x’³goOpð8{O1VX,AZy&9 xÇÆYá~<ß¡$²cÊ  ÌíTÀœ-† TõÆôyŽdzÕõõXàò©X>KäžHYûprÐܦènî”CZ!“ŠXOËvM°÷܇I4?ªvÕe®w¾;¹+úÄ,ó"ÍèÍI«‚^ŒI\wPé…£yf\nÖ¡ƒ7€r[¼ýÌSùV\ŽÒÝ÷ ežiÆÛÜ0àØ±NÓ Üóó΢á=Í»ÖÓ §Y•ÅRȩ眕÷íéÌ+ƒO†ã<÷ä =ö=óÄá« ²9¨ëðýÈwPeíà9³™Õe®±b’‹W‚TÔºrO–[n³wÞ‘E”îp±\8Îs›Ì~3Ú:tÆ¡F³=óâN…ÃÅ΀\à(‡áb¦6/p.&„‚Ú¸(€|5\Tâ'+6úz_Ý÷ÛÂÝhì®gœÓN™õÒë#¥ÇG6B¥FªDc™õÂÚñu;»™ AC梾7WÔ‘õ˜¾µæ°}%f­>ÂÕ’´VëÖÕÙZa_Úºt9?8doVi0Ýž"¦,Ý£M4ØÕíøæóÇx§wÄjštÇŒX&ÏV‚â]\èb¹Ê5fA‘u4R´â‰ÜAùTJ[HȬ´)i”“ÍJ»yçÏ{Ò<ÙÚzÜ_ÛÇ®mugùŒ-”~?{(Ïç€Åår7ÁôRéð …íxë¶(‰âæÂ–­«÷pØb‰åX‰íÓ›lÊ,MÜóØç°¹I ‡0bR1VÓ´›IñV‘‚™¹C[êµÖT®^Ër…Y®$S+Äe¡å‚ž\Гã+ Gá> q"uËÉ=wXÇcT3fuí³Ž'Õ»°ÎÔæš·”«4x¤W®ÒðB«4Öpq®Òx³FÑ­ÃÁæ ¿« cŠ6ÌçìäŽ ×‚¥œ¼ ¶œœ³“svr°å›³“ƒ‚[9;9Ô²(Õè®æ¼Xö¼ØÒŽÈ½»¼XBd¡²ñ ù„Ù‘žª0—6FƬKù{˘ŽïÜ;6œ‚i±ãÁ(jLœ³kÔ˜+=cd1Þ`òâ,š Øqp91ݯã÷îhxOÎ祿°Âójf›­wÖC¡ÎàoC¢—NºQ»½„Ô3yÝÛæqxg@Ï ª*(…ÑwÌRÑlÏÃN§ÜƒÏý@o—˜XdÖÓ :§b›~f ¯ß,(´u{c[*ÃÿÜAüúøÎáî)œ†ƒmfÞÁæ5dŽÁ¿ÃÅ#å 4k,;—Ð̬‡9\N2"Ëïzô"þ^óvö±…9 ¢gi˜2<„ð’>~>üM…¼• endstream endobj 6500 0 obj 4818 endobj 6504 0 obj [388 /XYZ 37.5000000 571.250000 0] endobj 6505 0 obj [388 /XYZ 37.5000000 571.250000 0] endobj 6506 0 obj << /Type /Annot /Subtype /Link /Rect [207 94.2500000 241.500000 101 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_package_search_wrapper_split >> endobj 6503 0 obj << /Type /Page /Parent 2 0 R /Contents 6507 0 R /Resources 6509 0 R /Annots 6510 0 R /MediaBox [0 0 595 842] >> endobj 6509 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1409 1409 0 R /F8 8 0 R >> /XObject << >> >> endobj 6510 0 obj [ 6506 0 R ] endobj 6507 0 obj << /Length 6508 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯ès€m‹½€ €ã90l ‡ ‡`7›`±^ÄÉ!?ýPÏŒ©þ(ñ›*Šêщí‘E‘Åb½ùÕ›?~þûþŸÿÝ¿yÿùßû‡ßßÞU‡¶®.ÿíO¿~xþÛ†?ïÛ®Þÿøu÷mÿm÷i÷éøÿßv—>¿ÿóñOÿÛÛýŸŽÿûeÿ׿øÓðNÿàë®5íñ÷_Ï¿÷­9þ©züýôóíþò»ýo§¯Ÿ&óýßpmÓúî4‰OÛ]—iοþûão»7¤}¥­ï›½ñÎïMïíþ?ÿØý|üÀuøêÐ{cÚÆ·ÕK>ÔÚÓ—êÓ ¶¯öu;úÎù—ÌèFaðÆ6zƒŸg.Mã\rg›¶WÜÙÇÑ5ˆßºZ‘mN3×ÚY4¸9í­5uÓ5ö(—]å.}!¡ºöB¨¾Ö؆ëèÛÐuF‘N3—&Êuáà‡Î;ãZ[ûÓnŸNqÝuöøçÖ ÿ½lUýq½ý8ºÆ†ô¢¸8Ï\ëDÃÁ•wÛ›æª;—'ڳᷭ/]f.N•a¿#£ *gï¯w”ŸF× ¿·ŠŒsž¹ÒQƃkeüMo·GרÚvЬtš¹ÖnÃÁ%ÏqsµTUv¶Q´ƒ}Óë`—™kí,\rg[?ÈP[õ z^ƒú}­(Î3§ÊuoñèÊBúøÌëùRO£+lI]õzBú2s%_ ®½Û¦Õ´®Ÿ ¯0¸íô¬ëË̵¬ëÈ育»võ52èd÷³á÷½¢ 8Ï\œ*×Íþ)e<•ËO@àý[äÅw_vo>ö{Óì¿ü| Á>xùíË×?þå‹5fÿå§ýïóyû‡ý—_vþàÝ%qúw—'íùIwèúª±õó'ïá;=±=­>?q‡£Óµß=é.ïÌù0žlŸÀw܇ó“úàlgl|JpÅÆ¦Øxøö€&‹GÄôͰÕän'ÛÁ-Å› ‰'kÌù‰q×µÏØõ‰+b=p["„Ä\ìBî"˜×vpxH|ƒÉ‰á;Ì«x“1c4ð.™(Ù…WŠ™‚ÖÌ ìe¦:4­9ûIð™Ùâ-BbÆÉ>|9ªO%Í×÷ê+YzDØTD]âA­9ïÌ)À£…âÑ~ U|K8ê ‹êödfQH7{͘ëK/ûÞ¹w![ãЇÇ$þ€–á°iŒß¹L¶?¸á¥OÖiß(K¨ˆEBðªÃK'˜É|H·.\;lÛÔÁ9ôŒõ§9­&ð7sUÆ\ÕÖöŒs̸cŒŽÅsc<^æ4Ã'ck“˜1Ðç¬"*BÖFÁ”%ìšlöÓÂÇGÓŸ¤±ƒ+Šè{l|Ã'‘µbÞÇBD”°zGGXSQº6ØæTaµ‘qŒÇÈy|zE\PbJ”ax0Á‚eLçP%Dì™ù‘hF¯lAJu«/›ÁîÌóŒP¹4žÄb4‰¾ÆkLÚ"åÈ1ȶ 縸Dõ/,q#ë!f°˜É>ŽbÉÀȰ¬À5¾Bg´«MxF? ªä<›ï–÷=1-zbá;ÕG8Zßéá ¸…ìì°BÂ,ƒ46%à!Ä£ 6¦"kÚª (Å\·Ká¦RR´BÞ:S‹LÝÃÑ8…Rᢄ²­<ðy¨¹˜‰ª±Hˆ13^\þ›&¾ëùÂ\~—½Ö9˜ T)›Ÿ¿ËV²’€ºL¤,d®nˆÞ…Í&*¶ügžüç­ˆSfŸ3Õ{¥æ‹* ڲ޶XTÜ5[>vÃðh$>‚g€ß4X>®á·‚÷ÏÚBŽE´¶i¯KËuw†pâÇ& NŠFb8²¸Åœ­²#¡"ÁíÓH*']¥ÆÉ‘(€+ Ä.#§ÐÙ€ƒ“¬žˆNÃZ~çõX²Z‹Z#Þ9H·Öy¸Ïõ÷•Ä}ØJÆJ#¥í¶Q™¹•ÎÿO©ÙÅù?—‡ÙÌ/¹,ýÞ<g ¹ò1ÀåØìH@M!.Ë&Ú0"ì¤òÝšp)1Ω¯Ð“ˆ“øö²•Æ^§ð44#¬y™¹„{U× ˜U.¬hD YH±,ÕIY,‹¾i¦µw¦Øë뱬ï-ú»lT¶‹Új¾²(ÜR]Ó©»aã?X€ºXôN¤¶Ã Ùe ò45ü~§Oð;pnƒÊ¿%ïz4š·é´Æ3’c·äêè‡Çmø(¢>Bo€)IÐ&‚õVúax©+#ÍcÞ!“˜„gKr]–¤Ê½2Ñ—ÙX¥!¼—ì°éM¼“¡Ž°©Cñz!R·K·ZI<ªþZ´­ …À´¼÷/ Ü‘R»øÕ5Á2P8bE¥a%º‡`!-ˆVRǾmõ‰'.{CÖØ¨15õŒ¢K€é’àOp@riŠ;ÃO/:(»0L±”ŸË 1wb™†V"Q=½ê+Opƒ;#É­xdÜŽ%¹÷ážÉ0ˆN[2þzëde»+QàL“ ";]H#I>×™àl|ÍùüS§Ää&3\+nC™(Šfº2æö&D0&/ÇN­s©(¸OExò(!‘Ë„]ÜïŠ|‡€Å{Eþ݆˘?*R~X0ÎÇÖ-R*KGhð”žä˜S0">h}Å";x—Ýc,&ƒùêÖ~¿…£Á'x4;%xÒ|bX\3àÜ:[¸¸æ²‰ÍµŽéÙ;¢x‘ïTèId´÷pàwp†—e^¸`Ê>„60®­‚D±SäÒ<[u.HºÁQ¾5O†} ¹#Œõg€™ÖÁ1³ÆûËT 2G5ÂÚÌábhýQÛubÀæ1˜ë2}¹Q¢¢R$¢%ᨓpa YLÃ-·ùŠr› (@„«0Ž„²C+Ì ö,ØxÏ÷m¨’ˆTœ,oÔõê¢óPáZ`d&SÈs æR&×dZ¶™ªpÕƒŒ7›© /¸Ú’b^ }=¹@Õ®Ãu 6#[$[¿ÎwL«êÄR„™õ½__È…­- íÀtm< áý¡…e,S°C¤™ãC9<ŒnÊ…Œ²¼8˜:Œ¢s~š„ÌÆGêWÇê>$꤯§YÞY7Á†gë [^„3E׉–P2liÊ'íí[rhë{¦qö½'/J–¾ŒKHõQÆ+…â³Ùh“©>Y²…9ÌöË6˜IîÙ¢YÚø@‘¿(/^*?ÇxTJ2á %a­zX¬ +yÖ)±åŠÐ&ñÒ¼é¯ÀŸ<[¢ë…Z»Nì3b¥¼4⠭Ƙ³ð ~‡AyÃXȲ¼Á\Æ»1ýDw»ƒôš>Ïö±³U„¾²O–ÇYåØîåíæ“‡/™<[‘f¾XŠàÑržºZélmü[@$ïªújT0±B]tï|«5…<ï­¨³€2å:<â‚~'Ò=“‹(S;ÐøŸŠºÖ‘„“,Ô(ža¹ÀðšÚ¥nõB ±•´—Í d|\NayjSøæg‚ \¼ "²ŒÅ‹}#,Š…!#Ÿ™ZD‰ÀºlK·Q’p:]¢ê|yÓu²(J³ÆÒ7N”MâEÚ3ɉùá:¾éĸ3og³©0dƒÃSž—®íð0’‡ù®Î!Ä1ÓieºÓü¶ *D(ïÍ4]ÆÙm1„€©€žõ/0­dªÊ@¥6ÁâÇg‰¹á„5ƒy-EOU¸3åŒ[†gÀ°"ãþ%ôçaÂŽÌdwòŠÆ’“-;e%„çF TÙ©”ÝÒ’Ó,™I¹•·Šº±îlh\!&ƒVºÔ½‡-âÊIÖå;âÎo„•âaá~=Ä%}YŸÓ/Åq5“³]\/¨˜;ºå9}ßR=Rƒ«\a}™Åµ)°–)R±TJMæõ;c|¸%¢9™ªÊw2tO±UFpi_)R“éíÐlÓS^²H¤“89"á•¢€ ADï ?£ðêV, ”hÑƲW…W.XÊÙa|Q}Qá^Ôóœ“MïÕóðþ!ƒ²*Ø]ß®GUߺí…íà‚g]ŒÅk¥ð‰‡·äJ^Oæ[ Its²÷®–¿1áëë5´Åj1«’)H­?X¬šwù4×ç\‚qX œsÝî³!‹ÜêÒúâ\SÚOšŽ® ƒ6ž+G°!dmYkÃ[¹„¬Œá‚úéÊÚæòås«êæñ“øq:3:%°¼´.Ï„”A唨âÈvãH¶ÐcUíì˩›Юˆ ”þeksKÆšbk—¢ÎŒÐïné@HûÐÝ 6ý löP2þ|Ûæº.ÍÄÔL0ñîZV9ˆ«¢°5/ËÙ>P¤Nψ7˜ L&" M5©*¿Äø~UUÝ_r$XöFç zÉA=OEŽúAf²}ʉ‰(ßlnþ+”­JLVê#Go¿HhÛº:8*¶üR8EÉá*ЃJ”0¾ñ|ƒ“‚€AiI¨$eQ^8ÕˆT°Ñ+J¿Þƒ„¼µ œºÂï\%¤^šñd¥æ?×Ä”ª«†[Ê‹µ%kÛ¦ %^&7)"IBî-áòsyéÛ%;UöUhfCl`pZEQÍEÒ¾”Úb’V%‰)#¢â‘Â?  %ŠB(ÈfGÖY+Û†Tò(B·„¼ôåÑ EaU_O•/ì'ÖŽg"ÒÙ˜GuÉHQø”*â4䬸lšîJÖò£bÛÑí‚hòzpµð âÀ¯ûºikƒ.¦¦>T½ûÞ6bÌrí^Au €ïH¦ùði²e 2‰wÝ=V¤r¶ ð:c[„Ã2be”zÆu¢bhÄMy¦Þ/…\¯]­¶] óV`k"÷öuhlØj3ÎvŠNpc3… ¨‚0Æ‚í$n¶!b Ue x´í4"–•‘òXŠBçw·|ºrÏ®ÔÃY[87gW Ýsð~KŠœ._NQ¤ù{KÚlÉælÉæÍ›áÍÞšÁ½%û·Ä}…˜Ã²é‘„N ê¡HmøU„.ŸÝJ¹ï¬ôŽÚdª™É…J« µVÉ·Ò2&^ê£úž6. 5láéj OgtÛV¼\6àSWu3yš–w~ׇc<ƒòíº“[@y (ǵq».X•^` × k/MÝ;‹Í‡M ¢(r  X›’ŠGÀ:žæÎõâmžÈ£Ðeˆ#$E·/^f¨6õK”«ò¥R£!s „â–)ìÙzü«*®X™Df.ñæìd`9™žŸE™.O%ëQSŠAÌ• I¨þdpa•}yBš¥dÉÔµVÝ9Kcn|Îz3[àaIÕTm®kÀµ0;nᬼJÉöã 1œk'V© jg˜ ŽjªB mÖ xƒ(ïD*_ðnÃÚ&ÙÝ®ò*ÔÖÚiúÊ>aª½ð;xO0÷aŽÕ¨:%WÖÙŒUˆÖ›ÉS)aj`sžÇFéÔ|·S·ô©›ß¹'”ð¡6o A/cy&øD4-BÁ>BΑ¹Ñ&Ûl=¡ß# ˆú΢‹õ* z©ólBI-s\# aÆqÏ„ø,|ç¶”h¬fÈØPW1…—¢g|#°Â JRöæì¨Š‡­q~fqAÍ´6£„»(œì r• Æšùr1´vÆJXw/{ÙòÙ®<Ù úœ«_²Íü…4eóÍÝ^Ýf½…© ù ûeìr&H<¦9,^Óh¨”ÐÌm&æëÊÞA‰è›\8"h3Q-ZÔƒç¢Ò|'*/?™%cMʵá&”±ó… l˱u!W¼l‘oщÒgB7‡Óû_wõÑ9~öƒ_wŸ#ŠRGÃÖWÿ|ކMh(‚"ÊtÇÃìpqéC#p¨ÄpÝVÛz©È’$al'uØ¢+nÜÚm¢Â¨Â+%jG×yJ"ÔÁugø”0 p¦®’Í„§¹jœ©æÂç'‹ÖóUw¥ï*ñ0#Í$Vy[·rÀëñþXüÎ*©ƒià0>â*qkK®PextùªãuâýÞi sÚÙ^]3–z×^qܱ·©rßἺã¯ý·ã2¢«ü4õfÄ:º[$pÆŽîÐq†{ûØñbûÞ ý]ø¼½ ºPÎì¹4}¼“ÍøÉ€ÁbC(ýg^fp+üñ}ÇMEÐnÍíã°RÔ»|üÓ”*8Y3,}´Àá¸Þ¾…OÎøºÑ˜vé,08üîÆ;8~™c¤¸q †‚Q?ƒÌƒ†Cïi,@L6Â!'jÙÏx×àÙãïu/gŸ¶r‡AôÌã# “|Î>ÂSxÿi÷&B endstream endobj 6508 0 obj 5522 endobj 6512 0 obj [389 /XYZ 37.5000000 755.750000 0] endobj 6513 0 obj [389 /XYZ 37.5000000 755.750000 0] endobj 6514 0 obj [389 /XYZ 31.5000000 535.250000 0] endobj 6515 0 obj [389 /XYZ 38.2500000 446.750000 0] endobj 6516 0 obj [389 /XYZ 38.2500000 314.750000 0] endobj 6517 0 obj [389 /XYZ 38.2500000 446.750000 0] endobj 6518 0 obj [389 /XYZ 38.2500000 314.750000 0] endobj 6519 0 obj [389 /XYZ 32.2500000 534.500000 0] endobj 6520 0 obj << /Type /Annot /Subtype /Link /Rect [64.5000000 719.750000 99.7500000 726.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn8 >> endobj 6521 0 obj << /Type /Annot /Subtype /Link /Rect [287.250000 672.500000 324 679.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn8 >> endobj 6522 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 626 114 632.750000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://docs.python.org/2/extending/extending.html#methodtable) >> >> endobj 6523 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 618.500000 114 625.250000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://docs.python.org/3.6/extending/extending.html#the-module-s-method-table-and-initialization-function) >> >> endobj 6524 0 obj << /Type /Annot /Subtype /Link /Rect [166.500000 322.250000 193.500000 329 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://www.python.org/dev/peps/pep-3107/) >> >> endobj 6511 0 obj << /Type /Page /Parent 2 0 R /Contents 6525 0 R /Resources 6527 0 R /Annots 6528 0 R /MediaBox [0 0 595 842] >> endobj 6527 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F8 8 0 R /F9 9 0 R >> /XObject << >> >> endobj 6528 0 obj [ 6520 0 R 6521 0 R 6522 0 R 6523 0 R 6524 0 R ] endobj 6525 0 obj << /Length 6526 0 R /Filter /FlateDecode >> stream xœí]KãHr¾×¯Ðy€Ñ0“oÀX Õ|0Ðè|Xø`Ìzw°˜Y¸½ÿ}SRR%%ù¥˜_E>H±3U-ŠùŒŒˆŒø"â—ýö_‡¿ýóð˧oÿsøÕüüôí¥8¶uqùs8ýýùöÝÍ«¿þñòãðãåëË×áÿ?^./|ûôïÃoÿwЇþûûáÏÿ9|øó¥ÓþxiU;üüýü³oÕð[qýyúü·—ÿøéðS‹cwf0÷ÿþ¹lÛVõ§a<èúÇË8MuþûÏ_ÿñòËeüziëº*»ƒªÊê úJþ÷¿_þ:t06_ûJ©¶©Úâ=µúÔSY7¥û¡¥²Ÿttþ+Ô|€Æ«¾ ×øyäâ«¢ÊF¹[?vù'ûu¦,Õ‚’Usêá¼5u+¿7o­Øøaþá¨ê2réE1D…—ÜÙZ·wöÚzˆÅ¯»2`ã§‘‡ÚYظäÎvº ¸³×ÖC,~×?<ÔÎÂÆ%w¶/ á÷u€õ¹¶`ñÛ"$C8\zQÆ…»ªTe«ëê´Ë§®»N¿·¥ùóÎ%»U…Ø‘€gmø=$-uç³$¼*f¿­Ë塟S7åpŸQªÑUȮѤý­WA[?]~atßζþÕ§<”Ë'à^ùÃñâÇï/¿|QUÑTsøþ×apç>/?¾T_~>]“j}øþ—ÿEùåO‡ïé®Ç!^žŸá“è‰jÑ ß)àTƒž”%l ?y…cëa?…kÅÿùhžT°5¼?¿³ÊÕÁkPÂ~TµFº.àZ;F÷í|)‘¢ÑŒçƒ)D¯’':N œ)^…ÇöèÉë÷A —`­GJpÕùï¦e%6ïLz¸ž&]—×I_¤;v}qÏÛ`>£'ÅejÕ±*/¦õ·w>ÀÖàÜšnˆw*øNÞ)Ôù‰*ŽM«ºááÛ¨/Oêc©;u? gŠß)á>ÁÖp? ÜøÄ0 ¯Õqôç£FÞ6õ}?%ÞL‰¯¨5Ǩ/S©c]5w{jÞ yȆÃý)3jŒªŽúL`3Lp27Ǭ?Ãwà^9VWl=§­ŠËr\9­ÑÝæ†Y=8"sOêó“rÜé›'"è–42ù*É+:àÅ#†…ñܓͫTËç… 9‹Qœºó2ÌN•cû ž8:Æ«„Ùfø¼\x×ñÞÂÖ œ{gBnxQpóp‚SÁ+ûHÍí >q6é8š‡ä-Bø¸Çèá*M~É~1dçXj|ô`?˜ì‹‚éo9Õqz0ƒ"N©±1xñ ÓO@X—¥-?CõI gÀ¬.ætø|òͱ‹°5ÁÖ¦¬ŸÌ– bÄÛ‚yŸc‰™ã ººD·¡é3çP”†VÅ8ÍÚO¹…ª2µ·±ôDf$£1ê®ã˜.ŸC¼2,KäJù£¥…¨j¸µÚoÞßœïõ׸ÊÕ\?Œ ”3»$ŸcíÏ®×Èê5 lý*ÎÉòû$¶16$Ç;8¤Ž¹½¨T)áâ#cH@BÓEiQö;»ªE_ÞÓ6ÿ^¬áJ–p BÊŠêdWOá©3çÛ$Ã³èØªGî¶ð•±Š0#ãñp$7&Q„ˆéG{‚ø‚Dx&Þµ+‘nÒÔ¼ 0*£C¹ðX?žÊÊѦï-9Ê(–ú“ÿ *{ÁûŒ}ˆÌă7yŒ>ý¥‹Ñˆ¤¾&m×üë˜lkÿßÄn¥Ö – ·¶ÜýLéšÉùƒcê²#xt iÜU²íŒ `\Ÿ» ²á1ž-,hnëãÄa’€± Õ=¼!°)zbò¹°½óúÜ.€š„4©e+§–¯\ßÚ+‡ [Ì-‡¹ O4Y‹õ^VAMWáSV7ê0v8j¥n?øýå[ U„HqvÑ[N¾XA‘É•¶ï›ÉJјŸÇ-o¹)‚‘ŽŒ|¦Ì΄á»3CL·…w#¿ËåÄc‹uÂâ|™l©l¼ i`ÀkʇGØÇY¸êØÆœ%Hy!åcÝX»éЃ˜k“ª ¬Û&Y|à‘GO1ZRzg¹Œu°j‘Ìå^<úÓrúÃÍg ¦fà9ãЪ${’xáÆÖtœcD½dè#âþYĶB¸"ž‡å¥»]Š\¤ðÊË;RúAÎ< ºª[ L®»6›ƒSXË¥S™d¯oòÓ#9ÆV¯‡Úç«Ú_ä ›SãŠÜf³N¿cW)¦€ý Š¶¦ÛÅ')ƒøT&8S‘D¡ÚÖœÐo÷ôÙze³„lý B¾îU9Vu³Y•qy÷1S"c9±vÀð¦Ô€µíKK R°²ÀÌIÉÀØR"…Èâó6‡ M¯Å³ éCèÙ½"Ø®Êæ=‹›þ"¸&¯°£b¶½x¨çŒ9M6ýiJü†¶)zåˆÓƒ™!s¥^‰lÛ²N‡hH†]JX뙲ILI§•æãKnZ¬nBócçÓmz[VQ+•8Õî\Ç+Nh{Ú”óž´&¡mÛõ·¤Hh{Â=¡à €',LæÆe~ œ!üX@ÂÀ `"9B·’ÿmk9$¦‚FÆ•Å~™#*‹«ÚË~®,¤!í­Ü7&cÚ \‰=ÚS"Øôáa¬ö›ÊÊœlŒXé¬Lü%¥@=zÑŽ8^µ:5ÔÚ¦WMiË­Qç\Í!½ImWM‹' ðÈÀˆ¼£´3pÎ3vGªÊT*\¯ºÇ€B·oK膾ž…usS.ùÄØI£TR‚ÏÊF~Êì—‡ _;E¡]«Š“á„&%&‚¡­_@ÐËy…SŠdUÈ‚Òî_5Ö>ÇÒueKEgÈžÔ+ñN¤,*«ZHM™‘b…Oîžç'ô<;#~àPádÍÌD– ßkÒ#õN23»Ò¶Â+S•àm>¸åI¤ã X¸¬É‹È˜B±~¹\ª0j•Ñ(VnPœèƒ¹En=KM6—áà}Ù¼+²—cÕ9ŒdÜw‹%)UGˆÊõAÃ2¹ “3½­ùò¢!Ñ:]-RtôVÊz{TLó¸2÷"æò›Ð$R´+ZÉ#ÌLÄ# tð½hþ8Ù ¹2yêò‡Ö‡dúUgq}ª*ñòÊÖ‚±æÈBReí¿‘ŠO¬êÚEY –£0¯p˜p 3_è(Ê(ÀÓ”z;#}Ú–ÊT8 ció@Þ$sxË^FÙÓ[õú&>—DÿÎw§0â®®L\ñøïúØuÅ¡iN?Z¥Ì§í¡©çU(Šñ“__šê¨T¯»N]¿UÞµRÞö1|ßü»<½v°ßÖ“>ôék$÷º»Vºû>~{ùøSôÐùÎÜ0›ëvCŸÈ4Ï8c…`+±nH¢j'ÖÅ“IzusøÞÈiæˆu2n”9bZ÷·, ÝLJ·-ïo[ÍÞ¶±ÖðÉäðž¾UÞµRÞöq=¼­ž;¼­šô¡¦‡÷ô­î®•‡·í÷ûùÃk*‹oWX‡×|"cöªWQÖŽ¹G×Éľ† ª£ì‹ sHucpE”…ÝÎXaˆÁæœâ•Êÿ"±Ä¡ók¦/d%*l󵉅,¡*K&2XÞ­…ìáz÷LµîÍ#AeëRÐ# ƒÕÔÇdö•¨Ä‘Ü›âpÁ¡ð;Ú [ÛÅ­p¸þdUï¦:ka«Â(áçáÜQëôD}AOÊ>Q°5øŽá3O̦ϵVÁÖÚÐd«”ªmº F«ï'1å›Û¼5RIÞ/y:†åõâ$>.^ÆÕ‚×t9Bêa Ö <­¶Ö2}²À©9öò¨YjÏ9'ëaFM`1#›R“©½•§±b+×d­jMa+Ç5Îp÷È64œ×±u®TŽ'T4z„ÚV¦¦£hmƒU]ó,uÒ±íM–-¿“žo-Jí‰âSó º®ÁˆõÃhWëfĚŒUTIÕ­ë¦>Y$#ðV¥ÆR>.Ñ|“-¥×Æ£o$GÃæ)9‡sÈê¿Ñ@JñËÚ×EoÉOê’4øÄVO*\F ‹¥Ø¤¿¬J®í‘Âá³ïe›ÂÕk!‡^"mBzÌeí`¬Ž•¿‰‹=3ØÔ&Á ™›”²/¢UD«Æl@!¢Ü/¿„É&óðI²±{;sôvn +87½ªQÆ7#X»î|Z$µ’£c‘ ŸL¹¢¥¶6gÕøÐ€T¬Ç‹üu¥²ÆU2ªn, è6 Ý¡³Ì¥×£<”Y¦ú”èM1GŸc“‰µëOÌßS”–¨HïqgŒï>|ŒÀ‹fû XP$8JŽn'Fð< BÆA2“|:Þ&‰0˜h—§½"B–ráãD¾MFï}ØZа•¢µ„n2>éö„mÊq@˜ú­²ó‰¤½PJ#Z×\7ˉS ¥˜¼:²B‰0DÄ‚H6ƒ7]šD’ \cÌã²ÐÙ \&á0cQóÐÌD9i‘Ò ª+‹ÖשàÇ*D›^¿^•v›ÞîЩDÍÖ²|ÅDZ%½µ÷MÕr`â„ÊâétU9ŽûÖ#IŒuí{¬¤†©2ÉF‹FŸ ‰¨Å䚉eÎfÈÐK µ—3Œ6]!ù÷ vr‰/QRÙ¢i<æxÜÎ%Ç$­Ð)ŒeN_¨˜ëw;Þûέ¨Å—‰â|èê™ Vw–€[§QÆ(#lípdM=×Űª™æüb„ùÜ;5|òˆO 5j{AV‰oɹFÇûZ.٠ư”æUÆÊ4Ãü ïK’Cî©ã‘ÆCx·="d=ò1Ɇ²ŠÆ§1N:§ ³=°+g?ü®ð¤±–^ÒÜHÔœ5öU%!ÛšNº9d=‘% ¯¨C!l®Ïs¡^UÈ"‹³9%…#¼…•ådAu+óYª¡wK ËT®Éζ’‚ƒÕ­*£XÆ|9ýe—Â9ìvúyùÁ˜Ø©wˆwaÏ0^mY¥lƸq6!q­,šHÁãЃ#åMÉ Ç ­6¡ÐÞ{Z'ÝE '—Í .{ö2Ȭ#a@ÃxJ @Eü¥8'CR—›M­-¹ ÿOXFdOè˳œël0çÁiS£Æ¬;¬ÃK†)ua£>Ãc—Û›Ò„DáÌr1xÝAWó9]Îø(Ýç'×$ ºÄòú%æ®H8ddÉ5}ФôàÐUIcœrÃCDz$S*¨:P8Üä¾ÉXé3¨Úb9IžG7|Ù|òëKS•êuשë·Ê»VÊÛ>†ï›·§×ÖÛuc÷1|2¼s?’Ó·º»Vºû>~{ùøS ¡Ù¡ÙŒÊz‰y"’_6ù•Ñ"ݰ?Û®MÞйuëkª.„ÑõùówªíFÇXÌÇŽ£Ÿ‰j,ê±]Cº4Áä ;QäMõêNT§;i°²™NdÒÀ1æ°”ùƺ֒oƒ¡ Ëú¶ÒÍÚˆ.yklxŸ.Ù¶÷ºdÛÍé’§Oîõ¼®˜ê’oÚãØJyÛÇU—l›9]²­í>†O&ºäé[Ý]+Ý}tÉnÌÓ£­I81¯ð ÄÊ8ž|AO ¾&¤¹µ·nÑì šp†Ká€z¼Ë³»Q4‹V×é³ ¼ ƒ1a‚Éâs<.f‘à­²ø.„}²eÎdØ““‘Dç¦xƒ©[•]`ûÑ–¥ ä°5&R‰çÏ[r~ö,iޥЊ‘j mß+Hl¿píßXà‡å9æ3Cb²ÏIäÞ¼´Œ ž—qéÏ–0ŒC2?Ïi¦ ¤/¸Ë²¶óóÇI¾™Ïè‰9!õQOâ1?ÄiÍ,ûÌ;vr’ö†|FOÆl<3ï|‚ó}“¥Ò/(ÑØÆ÷œ©aÄscƒ­9úÁcÃ3Å#±:´ì¾ ©e‡µJ·ÚšÃúÂ4•5ƒ­ÙE³NæMäÖ‹•vjóuç©` Ñú+YçO^“bü0ÁEH1VU6…úi¬ò "ø! ô>9Òžôo3~*ÆAƒ9ƒ"²3éøT-bb«E ”G“p—ÉÖÂ¥*8¦ŠdÀ >A²‘rËYã-æÿ}bÓuyªÏ‚³ªÕ=ñÍ\„OZø¤O>ýÀw âI‰ÑFÿ|0B º„)¼%F\Á 1î§ è ‚—h£y̵×ÚI¯~4|GÃÝ.‰™bƒV’ëVâÕÁמS<Y )à> o«‹f\vˆw÷ ؆b‰vpÜ<ªtŠbÚ¨ÐÔX©y˜Ò,ŒWpÝiùÒ_×—°Ô6»X›Áù仟Á: ÎÍ”à°i«´öJ¶–=U@FÖÀdnI–¨Á£‘X®  .a9“M¿går­hÌ+Ý÷Ã\ç˜3)+cBSŽâŒŠåò†n‡TkkF›½ÓŠæq¶Ùj²°xÑÛ­ßOiýöÈ#a•J!›ð!’>0&“5#ožÊB¤™ ™b¼ß^Ågz¸ßó@9Ö5M5ƒEî;ЬñTßvìÒ‘…üy*ˆÉRíòpV‡\aŽ?¡ÒQÈô­K©=֞˽œ$]W“¤ëjwTp醴Ø#뇋’àw¨$ôŸÐ“2';Õ·BééO>ÏW™üôU¥n?øýåÛ¢Ì÷²8nemB´¤W­ºv™sÒ+üNzU÷” IÞ¼ƒ“^]F0—¢ >)ðº]è¸=–“XÁTPŽV0±36ÇÀÔV8%˜Axý®­ºln2«Ì0Õ+}Öu±¼Éã©VíŠ^Å2±®*ã>ÇóÁDÅdÌ¥P׌mH‘É8M¦×—å‡ÿa"¨¹½•M;è] -¤Nµ¶ðZ×"°à>tE˜¼dĨ¨ ?ƒ”=²…¤m¤Î\£nNb#ª4ŽQcž`€†áaÜgšWu¥Í«ƒ …oÂ7ñ«ãF^呦OTiI)“úº´Osà=ÜXw‹äê–-)Œ‚’Õ8eñaËàÊ:¿ÇœPJq¨O ÂüªU Â’AŽ*±HõjЬX¾€G–·fd(¯·DpÈ$îEc¯Ô֊鳺ÇЍXiÆakør{•öIÔ)í!}WU` ·†é¯Òýy°Q%B¶ —ƒDmLe¼öÐký:!-‘&ÈîMDyx˜ôŒéêî3àÆØg Øc¹âXˆ@®ÄÜWˆªÁxHÙ¤L k4VMeQŽuv˜laâ,EäÿtDhÃ~ ˜['63pª€GM7öY{f%>ŸLÒ°°R£e2bÆ&’‚“¹ð¶¶ò¬©íC&«$¤·#Š&s¼Cˆ{{/sÕˆ¤ïÉF«3$#S•–©N3säy̤²]}-$©r…#ÍèÓèx®nM¶ZŒ#Y¤œT¶ t0×Ã^é±KY¡9†Î¢2qÖ‹Žžq Q|\Ô®¿‡¤hÎÍÕFó2\T$ÄXyˆLϔà ƒì —0ø`Mö1ÉŒ-! û…-Îd=îTæÞUÞB˜¨VƆ±*¿¤z•¹¢™ùp„©L¨¯,2=..4»¯l¥ìq®Q|“ÍvŠŸÀÖìäìNYk˜LEet}ÿÐÇ çz ’Ö-Zd\Æ‹ ¼5ÁÛAÝÃ-V}s-ú {3Õk6Ø#ø„)·„í+„-k£Á4s£V©¯«S߯öÄaIýì?j‡%ÊqGA-œÜŸ3<¢¶µƒ–™Ú˜B6fMfV4†ú!hQ<öºûLvŸÉ*©Üígi‹º¿ïr.q‹lÆ~Ùû³lˆ ÓZ,õš Sæ*ø2ýn³”IußÛ«›<ߦå‡Ù0Yj2NÕ&lÉë•+˨êÆ"j‡C(c7nJÆPW6Û•3¿tŽf¼U¦EuÔV ˆ«åcªŠ|„b±Fï\± “'ªE?18ƒ¹\§§s£ç=J7³ŽQ+8j¬4ÀÕ12mŽÀ™âù8ú ^c~{Ï®5¦£%ÌåLôÆŒï©Éd2·Ö=\œ“ ®¨IÙ½k+c-йw„,F¬/œ§oî»ÜðU'U0¡pZ¿dŽYˆíÆJgîñš^N°S§KäΕ%ƒ•æ{ã‹"…TïÛÊ’x²\~#é.…3³®2± U:W¶ òG{“E¡`²À”ë&¬É£38 ·óLyZ¡÷CFÇÕ6GJ€*S¨'ch«¨Ï“Ñ(F6÷¢³…ßίâò+Uô†…-¤8œ ²2*¤ge,S©Î¶[0¥Pöì¹sÊh °¡*/Þ·²¾žÆ=Rps‘‚Ž~wÁŠ(ŒäóÄPa!‚Ñté…ý5êı—W¶Ú\ƒ"0)=zrêð÷ðc“sÈ_}a ïfÃaiW¨“l>èêþÎ àË·3ÒîÂôŒïåÂXg¼2ågóNcW†7 Ô¹+ÉgÔOùHíŸÛ3S¤ž`Fõ6¤V™©O&hNØ\óØKW¡i(Ü|ÇÜ”×ÔoÈ–%¸ÓïÃˆÇÆk3õaPòŒx‡ANâ´ÎÕ‚eÖеúp™ý ÒAýØ•·;ÒqÞ,<ÓWÄŠêý¤ÖåѰ©e4WÂst‹ˆ}È‹¿¾¾ü?= endstream endobj 6526 0 obj 7763 endobj 6530 0 obj [390 /XYZ 38.2500000 469.250000 0] endobj 6531 0 obj [390 /XYZ 38.2500000 469.250000 0] endobj 6532 0 obj [390 /XYZ 38.2500000 266.750000 0] endobj 6533 0 obj [390 /XYZ 38.2500000 266.750000 0] endobj 6534 0 obj << /Type /Annot /Subtype /Link /Rect [165 294.500000 192 301.250000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://www.python.org/dev/peps/pep-3119/) >> >> endobj 6529 0 obj << /Type /Page /Parent 2 0 R /Contents 6535 0 R /Resources 6537 0 R /Annots 6538 0 R /MediaBox [0 0 595 842] >> endobj 6537 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 6538 0 obj [ 6534 0 R ] endobj 6535 0 obj << /Length 6536 0 R /Filter /FlateDecode >> stream xœí]K¯Ü¶Þϯ˜uŒÅ‡$ ( Ø÷Úº(`Ø@AEÒ´’ nýûÕŒ¨¹÷Rú8Ò7‡”fF1;—yxx^ï>·ÿý¶ë>øòô×öOÿÛëý_ÚÞÿ÷ö‡?ú¿tü ¿îjU·¿ÿrú½©Uû§âüûñçÿÞýíûߎ3öËy`Þþÿw¦vUSÁ¸°ô·]¿Muúõû¿íÞu˜·J]ÖÆ{eÝ«Æêýÿ¹û©] Ÿ¾84V©º²uqÍBÊT§¥Zü(Ué½*Ô`¥Ó/©ùSÌn“Î~‚]1º©ã³œ5ÊÔº´ÇÃ>téœnÿ\ÿϵh«¶vªÇrž?ÅìU‹²„$u„]1þÐñì¢\]9M™ä\Êó­II=GØÅñâNžœ¥)“²ôËü)foª”rü{2–Ƴ˰t­ÛUœQ-eéö'ªýWráô &/ —nòäâXi)GÅg—<ܲ¥¤‚Ê:úûÙS ¿*MBÂ9B.”þháä’'ëjOúÚÉjœ`úØoNò8ÕÑž ÇJ¶xötЏCšV¶Cš°…Ìžâ¼MB1ÝAžÀUc“ž3 †¤û ¸ñ‹|øáëîÝ'e‹VwTû¯?µ°Öì~ûz„»Ùw¼6vÿõÇý[˜š?í¿þ¼k•.{»åÐH¡á7~g‹¬càÈ‘ÝÏ4b lBP(8òqþN1®u=ÿ00BÍÐ>9שà¦Qê•…šÁh„Þ õFxA”ë×Ì ˜·1Þ"rç™ØÄ(ÅY˜ë‰×1Ý™~üÚj»ëÒR­â>*)k›Ì÷§%íÁšÎ_nÀ\Sœ jä݉nUªZ¹vðekQº—I,œ¤ Wpk?Ját‚ò/ Ýo2!3‚IÓ@§±ˆÂ#˜Ù í=! álŒX‹ŒÀÙ0ÔØd±å1‰0µÊL˜c•ʲ £Ÿ,$̲ Øé1Bˆ”CÀX 65q‰Ù³zV¶µ×0'Ŷ‹³`6FËzesy£1JÌ«‹K²ž‚ÆföeÀŒƒ¼$[»ëe¨ÀÙŠÆ#˜•1oe¶²}º{Œ¯uU¾½xÁ1roP%úæ|ŒxMSŒvj∧Ä1:n¬úí xaìôá µ‚PëùØñÜ8v¡„;ÅûQð.âM›* …À/ÅF ÀôÁ(„Ÿ©©¥˜ì‚¿ ªÜÛ%Ç…¯í±˜Ci«€(;ûà•Wº°¿`àZðÇ< F7‰2ýiN92¼Ü³Ž·É\HcÒ{H0fñl$¯ñÆ‚e&Ò‰Ð,^®c°ƒ#ÚAØàH6ŒH; 1a0ðöAÖ!a0èbø#’€ ŠA/h‘Ô r¿ÇNBTj¨¤¡$À[ÂÎ ‰…†Eë‚K!¤"šn}b8,æjâøeù=‚7uDE,~ § ÓÞʈ=ì©c\?Ï©·«M°õ<Ÿ|-¼Dè!$Üu£Šðܰ”}^d˜ë ”~Þ;&ãà:Y£§µî£§»ç°C ;"ec¤x;"qz‘ö€¡Ž¤A™€± ©0ÉA¢ RTÌpU¯9ÍF8å,CZÊ!`ûHõY7™@­&œÄšSïˆÄ*C„a0ÔI†­8ÂÈßóW‘æTùVHo i""ÊUA¼YD»%¤qb`ͱw*Ÿw‹£{tufÜôúfµª$7)mé`IR——7±©¤˜‡yÕ {-àȃ©¤Æö5ŠË¦v]¸4MŸ4éïÊ#f|Ägìù®|U4Áö6wgqwîÎÈ:Œ~$Ä·§„|j|æ %go§eÔv £Þ=£®&.‘Q«öâ0•Qo4pñ„‡HÚ ‘fæ¹ÙM@WDJò\[FGŽôFÅÇëÀý` 99&'àRr[ÊtŠÂ…‚ Ó8f."ñDVŒ £xá0û›±¤(»lv>ø“0ˆù‘ON}a«lhÞ§Û&!ç*Uªé6HÚbYÇP´SÛÊ ïb ¼e™ìA¦R(W¨3ùb‹ ëõ›Ôøy¤lYN"dSŠ8ׄ$²X9›X:o¼üÖeÉØÊo£e±Dé)S,Š1º|¹ªÏÝã†bCŒúh›pÈø(ï­†×M°dþÞ¿.V %{‹Ã[Ç–€Õ„%08 ¨Ç"Öét,m>'®ö¦kàÒÚ™¶hyxk•TÖºpËW•f¸<@|4uˆ„´=§\<y–¦ß̬`“pqÁ1H¥B‚ <¾8ñøˆ4A™N×Lÿ숰÷=UÙÖZ…¶òñ¿»ˆÿ#¤æ4exë‹ÔTÝ*fT1/æ-NùOj²›zLŽUª)'³ìŽ¥bð9ÁéÝpJ]¶Ðn tCžáº¨þ«y¸ˆÞ­yÜÂës­ó5Ícµ"Þ[ÑÄÊáŽ2À>ZÆòË”O©»¥ú M@$㳧«„‡ ³BDP`Ý=Ýñ<åë3œLÝ&cÞb¼$½MÐÞ¸pKÊÜ_Œú‚îõr6k*}¸¥#ÝyIôù‘nß`²•Éc{ÌÈHчAôÀÑÿ^t6›¿¤Œ|Ó‡àÍ¡Â>t Î7æíH¡îè·:¥Þ­SÌ€Œ4„úiþ:x§‘ý@ðN בýTj6j•<9ÎG.õ˛Ӱãç1ȸk™•XbéGþ+¼Û©»Æªàp÷ãÚ‰<ÁŸÆHN«ªq!>¿+ELâénaÙøÊ fß›"¤tMÔÄaÐÉ[˜ ‘C1d™ ÷¥[Õ¨‹\åÅÂTñ‰0¹ô™qæ&ÅùL>Âôòˆˆz=~J„*dy-§ÊCØ«‘ÈdQº:¬9 X¸­jXœvU#F&$:PǃHdoÜæ›Á˜ÞqΘ¿¹]'(ùG¸…õÆôB‰ ¡%]ŽÛNc üL––Æ„õM/ó£¦Óªµ²0Ò[W–ø3%0 Ž0š‰™ óCw¢±ÀHÜU"KpNÆ®hqéÕΨÀLFv£¨:ù[Aý…·q{µ~_.󲇈ã gUál4"C*΃" ŽäAáìü㌠IT+Òh¦z1ªZT4MÁBÃ=bs3i£Óû‘Dt=¶ã°â…%Ën±üÇÈXíø†JÜnÓï"¹-4ˆ¤ßÌ0½0 äx»{¿Ë™R÷ZëH"S7¢#á:‘\nüü2ÎcÆO]‹.2ïÆf3$'ÐK­6z™b‡á^û6¢’ Rb„Ë’ÖNcSú{m4&Mc®©Š•SŸÕî"%E¸rj¤¶¯C”b*gèR˜ú0ýÈx¶¾ORÌ'Ì#VX²ã³Ç`º$`‹¼JNx"ûÁòŽâädµhDb3•mð| nWw* ~î܈ù‡&pmUm\{×*<A–h½ÎhŠÓ3Ù2¹dÀJ8Ðõ½“Lú&]è¢<׬ b޽eL¼•)ÛX„ a')6²—ꕼt3òÄn²ª ÈQ¶YjDÀ0¥GW™Pnªr2³3ŽhÊŸ¾@¿·ôB‘¿Í+ç´õ}¬Hø{BüFn)™š/äª0Ü*åî®RN´´e±œT‰Ó­ãÍfz•mÂÒ <²8Åä,m¨Ì!f_ÍJ Šø ˜¿lŠÛæÉ*6OVê\ž,&uM.m남:çlåª6¥ü ¢ýbæxj2u Ú,ÜÛ´p™jdÙzèÔxœ1ɤF¯Å•z#®ºŸL’sjŽ¿Ç‚g"¾ô÷ Gð7‘;¦ý§ù#&ˆ?w˜RCL7|Úou8~ßJzS½þÁ/»/‘HÙ˜*8„lºÖ:à®±‹Woq U|ü“zd?šŠŸF…ÇF¾©.ÈìS«f‡Úzku¬u…žk ~ÔÖÚÔvR{ì-ßûÀ§×•‚´Ü…øf†J¦œèL:G&÷n¶÷!îÂt’éչ苇PÝùD÷WºG"qWýÂKŸý‚£ÍcSäöؤÌý¡7×ܸK¸ÏÐŒ;;qå£ôïÈHZð›„8SPÒnÄ¡öÊñ¸æà¶Fð·¬êd¢õÙ:»NT*ƒlº{P¸]³h=ç¶t¿%C\´Aõ Ú³J›fSW ¨«ÞÏ÷’Bý8Öä}TÛGåÐåSf}ñµÀØçjåö/ËÕ[íÎ]ÞŸÏRª§ÔÎÞ¤ÄÉps¬™ôÎ<ŸŽ__U"ÉÄæeoFƒaÙç7ý5ë›åKä…_š›NwÂL‘"‰ÊLJÎcb²D³iFÚ`ä3û™q`›äMªOéô«W7ÆÁ!Úº_4/%öò}íúFéøuyê­ú÷’³y™õ».{k´sf>@Øð»óÄ{ð‘Üá:>óª>à7[§8[°AV‡†#‘Wì?ÀožÑÞÖ’³E ~‚ç÷ƒñf õb:ˆœ¦x¦¡NïÊrGÁÑâÇéÊ,S!ó.däÞ…7•YK˜§3‰3rf˜2I¸Ìm2S‹¹”¼¨÷ˆ¬‚ýH¸ê ÷Fƒ{uZ h§ƒ½­Õ°‹)Â’}) À½Eß*À„@up~Ÿ\…¨P‡Ør9 ßêêö'{k& Ý)/JÞVa³jƒ“”5U'3®Sá¨ÝŒ8 Hiw¼|ß *1.ì¬É”¬Í>Œ™Š%$|jĘ‘|ÿgˆ‹\aÐÛæ€FqÒ<9(T™Ìr‰ŒûÕ†ÊUK+“ÑHõ96ñžh¬Ç<÷Â<+¹Kmù3ôQT¶ž~ebZÒ2½â{I¸" Çm˜@>Së…±…íîE¸–ø ó?ƒ÷Ó4—‘‹{;àL_Ù&ÕØˆ‚ÆYaà{“Åäú.€‰S¿ýg©¾ºLÏÚ[ðîËfb$ÎÙÉR¬+$ÿ(íüRW*h¾R)G'ãfÄ#™Þ–“é¸ß#ý殺f–W;W7ʇ½ÍŸÐ7Ø«ÝqTà Qy™ ؉G(g%lÖ$Ó}žaµéžé‹M‚ÆšÛ‹6»˜`‘ôÅÿöÓ+•7ÝžS^/û¬Ë$~™ŽÊÔû·LcãL©'¹ú/ «nQ;ƒÉÜšaî3iY˜0(03x¦JGz\u)h¤çâ8Æ~±þÒ~òœ°m.Ÿ0“í*:sÂx?Þç‘¿®~k¤ov€E˜3Dè#@‰áaŒ£ §ýR(ø†²"æœ~$šñy"†8…ˆ À†`:À2 §7­…s™b±nÁ9üŒ1±SÌéZtÜÞÆ–ói'bË@~Æ´#÷ήÕý«&ÇëËýª•É,=#ôËXwk©¦š¥©6 Œ³ÀðNW¯“¾F'cŒ\ɲ;Uœoçe—2—oŒrðÄÝòjl¿$Ž@1nÆL}Š®ð•_÷î¤*ì¾QÖè›aÝ~Ž G†à©Ëçdcøw’͸¸’J-ž‘‘¸xµ <ê‚C‹IA¤Â8cVŒß8h1Ù’ôE˜2ÐU‹É &× §O÷ \_D¤ðžÐÛL½p7Îy¨ÓC¿T&ѵ[¸“‚2F­-Ÿc¼‚î!X„HˆzáWOÖ¤›JÊqKš”6VWØhc…)^ó*mÏQaèÝcF"¾,"º£ ?æ äUÌòçm1æUĘsôìy³ª–áÍ<»;¿Â]b6»er½0ÅÝd¼·Â‘ÑÈiù*ÆÐþÚk #J7Ÿ/ý… æ›íôØ^’ utîµ}K=cúº;ïzD_w6…î_ZœP5ñ~I}¨Â¿žǬñg´Ž¹dÄŒÁöÉïtøt<|„Ýë-ûRí;26è…ëØôÐç ¬‘m(<üÆ›^jÖÖ_‘-KpÇ?簗Ƹû8Ÿ¾ÄÁÙ0qhƒØÀ{ì4{ ‰ï(óH ¡~Èç’†þ<ÙéG$ {=©Õ…9x15æ ä#õê}QÞÞýµ…¤ð endstream endobj 6536 0 obj 5105 endobj 6540 0 obj [391 /XYZ 38.2500000 97.2500000 0] endobj 6541 0 obj [391 /XYZ 38.2500000 97.2500000 0] endobj 6542 0 obj << /Type /Annot /Subtype /Link /Rect [239.250000 586.250000 262.500000 593 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://www.python.org/dev/peps/pep-0383/) >> >> endobj 6539 0 obj << /Type /Page /Parent 2 0 R /Contents 6543 0 R /Resources 6545 0 R /Annots 6546 0 R /MediaBox [0 0 595 842] >> endobj 6545 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1409 1409 0 R /F8 8 0 R >> /XObject << >> >> endobj 6546 0 obj [ 6542 0 R ] endobj 6543 0 obj << /Length 6544 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯ès€m‹¤ž@ÀÏ90l ‡ ‡`7›`±^ÄÉ!?ên©g†ê¿)R”š6vg<±Éb±ªX¯ÞüñËßÿüïñÍû/ÿ>þ8|}ÿåPœšª¸þ9žÿþðüº= ß›¶:þøíðýøýðùð¹ÿÿ÷Ãõ…/ïÿÜ÷¿£>þ©ÿï—ã_ÿÖÿð§á—οðíШ¦ÿúëåkרþ»âöõüóþò»ãoçÇ&óòß?˜¦«kužÆÌG?ŒËT—¿ÿýñ·Ã›+ü>¥©:£õQ•¦<ª®ÔÇÿüãðsÿãðÅ©-2®Êþû®.›¢j[Ýߘáûá¾|zÕ•îzzU“Ͼü•]¼¬T¸Á/3—&Š2ýW×à¡w»*Ì•dM€f·ÑClHÕ´?Ï\š(ãnÃÁCïvmÆRMËë‰ö4|€Á›žÁ¿Ì\œ*ã~ãÑCox§«hýHòd{^|ðº(BªŠËÌÅ©2n8ýÔ•J5ç~™p%POœ@ýòô>ÀàFÞÃÌÅ©rÝ\×èaOsO´vÜ‘&Èž´7¼ªBrS{ÙaªŒŽG—<Íu£Bžæ§á ÞÖE¸Á/3všñè¡Os§tÈÓü4¼üàªgŒ 3vš'£öOåúà øîxñÝ×ÛO½„©_îgvùÀë—¯ßeÿóýÐ4ǯ?ßÏGýáøõ—ƒ*N=ç¶Muù½ë“êòÄœª²>?xö¤¹çÃuéj\á’wZ{p²ÅÇË“êdt«^N‰ ¬ª‰Nv‚·.Paš3¬3¡,\—)Ð F-ß<ûå3aXÕA6<Ùå{ìÓ?ÁCLos~UIŒ¶üH0Ã;ÞÁË`DS!Yf®{Ûšºz9| Ÿ˜Htéh²¥™á‡_{ÕF«Uº´Õ£C0¯O6‚Q7P`ÐïýUT:ÒÑÁÙX7ŠRÖqRèÜ<„д Ç1‚ÊÛ0ŽÑ–›b k¼¥ø V ø £Ú†·µemòhª>™uaš?žå\7ªB×–r6ÃðhË¥"#Ç›Æ\–à;rź­WÆ%®¹ŽË,s5Æ\ÕÂÑV3Ÿ<\ Ø,„§Åqé´ÜS~”dª,,kª«$ën„PÃæ2™ìO<„Ð'¦öGkÿw¸÷¤£á¹ÁÑápïsÞÁшƒžTp4 gP`ŠÂw†Ô½'üçf>úï)¦Nçæx‚©ƒßÁ|)Šià™³Ò·ð ÜïàóƒwŽ9Yxnð”à8x´Œ'‰Ï¿°Š$޳:ÝÎÊÇ9«« /jBŠ”˜K?O°üÇZ S‡X)>AZôsðž–!­ E±Þx'àåo÷•­yIB¥Gûs‰(á¡xÅå8üµ‡˜åK`|C|ÖŒ÷«§'؃Ix3ëa0ð§[¸sð åJ’uÀbN¹V1A(Ñ òlôæÞb“…£y“+3& # œRe ?‡q¡xx °·…!Øs2õ‚wa–­ÆŽ¼›øÉ;{I g­$äŸJ8õE$ÆÅèÄXQÞm{ G3£TÒ‰…;f/ªD¢1ŒÎgŒhGdE4€ ¹‚6ëªÊÖfL.“˜…ßñ°H±êµl¸Gß™}ÌhAeêñ ®-pxñ ïzÊ^|‡‡‰ðÑp¥ŽöüCÿN^Õª—³ô…|Yc*®î¬!'Õx´múÜjuclÞ1B‡`‰;<“ é0WE®XPçQNŠõó„¯ßÛåÖé¦.l ^›*^ˆUÑ‘s_w~7ó$Ÿ:hZ¾²T!3ÏRóvÏ÷¯C7bÁxW÷C2þzìq8g¡„sÜDç´eX3¾îJ›ïq^¶Ö±Ý‹#äøF¨CŸö¦Òöª%”»L•¿U Œ/ÒpØÞÀn`"šâФüMU\Šö Іôá™ ¯/·å²N4R—F²n]—#;Gr¿a÷œ1Ì̧.©~ØÅE9æˆDHF}É&Ñ:ÖçHúí)v[Bê8’‚1‡Dt4Ö·vL3OëŽôŸ3ƬÂ'ó?>›˜_¨ôrÌIXÚaÇ)6É÷1æM¡_ÏËqfÚ_‹=Ì8½!`ãßÚÁ2Ÿøœ!žë,Ãçh8ô+qRRî”c4<3kª 9èÆÿ‹gSò”¯ÑT'›‹Êo<ƒ–Ó¢¤ÈÁ±Xú2á]h—;ÖCèW/³föÇ`þgÖÃÌÏ s!½1‡8JË[FE”Õ­D ÓŸ&ÆÕ'šü¡˜³¹úÜ¢•V›¥¯”½!ºÛËJÔÂ|MyUˆ’¾NCQ¨‘VŸè=‡òmaŸ8ÁŽBDFëw \ÊœmYkÁá•antŒ7—9?ÄJqŠ!£1§äžò¥baô)ãM¬Äm‡¼Ž•ÖØª1œƒ%l8ŸÌ0"‰„ª-& Œm¶rU¼(‹Üµ<3Ì#e@Z¼_8lë)úxžÌ) L&$yÀd…ù”¡ara¤ö+¿«êTtæå¾…£]ÕÏ= ˆðõ¼mmëÙB°HEóÓ‚'"A/ÝÁÑ¢ièÂJ…Aã“ͨe*ñ p]½HÙ¸„E­¸”Y ƒ-ßÁÈä²èç$7Gð³”cØ0Hn´Ô-V´•ê/ZáçnÀXIm…¹4ý[@Ø8º6Ê:ãO6 À3C¢Ä³ýÍÕ:ѪuÖlÛT¶¶®“µp}@ÀÂö/¡Ïɨ&Í Õ2ú+úÜZ[ôÇæájsç ~‡±ìðÅ{xçÆWz¨)=ÎË:¯ªºtÝ<~;ôã<ÿÁ¯‡/Ñûnž§°TÈų1Ûg{cáéîÿb’ “&½Vnðš[|Ê}‡buðÝn áwFÓØØá#üıëP¹;îR±0¢ž›‡ßlkð#lï35ãQ$1ÓCýHƧ}kì( Ã&¾~¨΀Âx Œf±S›‚:5˜²©ÀN¼è-pFÂź?lб٠0A“k˜_Žk$h!Ç Þ†¶$TÑ(›TLƒˆ"0WJÙ¦ÌTÐ Ô ˆF`ñ9$a/ 7ÏfòÑ–Ç1³ršÂÉ2Š!—«ÎœñuE5ÏêxWÞ°)ñMimÑ^Lö|WV#D0Ÿé -RóÌ2xÒ“ö‰ÎÄãE©nŽZ?Lùo<Ô}à/«ç‰'Ý@‘7&jËzH‘yfÐH §‹€öûôè“ Ò`Ã"™a1Ñ5»jlQ ]ÓÏÀTÎb”\+N ¾8ß¶ìs¹ó„ÂÝY«ê4ÚøtM“Ïf>›kœÍÕ±Fvyž»±‘\Æí̸32 ãv:hngÝ¢š¥HÆít錌Ûé<ÏC2n'wâávÖg!5«í5.búÏzrZ;º+Áàõà+ñzIJÕ`.¿.í#³7p‡Lbô(q­§ÒiçdyxÇ’*n,¶0"^Rf¿¨zlEkp2á0ÛúÍŸ°ðs„@0ݰ(Å¡FìçÛÚÄá¾VÍr^·c ˜"²¡i<ëwñ¨¨‹ÛLẩÆjD»nÙ´„l®fs5›«‹d€º9 ±Lë[0Ÿê–P¾~Àtõ`nÊi896åÃÅ ›=S[7õì|dÓ…éDâ•*…w«‹HùîV ¶´.Lu[èZîòõËÑ´~Æ‹«(}:~DrÃ0a&î=-ŒejZ ±åù2²»A¹—ˆh§Ãí/Ñzf'¡ÅõòvÑŠÚX:k}Õ‘P0–úŠ…éºÐ×zH ›DË¥z&Œ…`ÂW,à·XÇÔÇrMo7Â+­®ª-¥õ8­š­T ø(Ç-m“ÂioÆKV¾ñ•o¾¢„ô‹àx«çûDmê3)¤ÔcRH44 ¦˜©¡Ìé"aÒEüÂ˜Ö ŽÃ;|mcœXªÈ'0‡B]¡P|š0ˆƒnpÖ\"XèHÂïÀ$ Y¹Á ·×%bÁI¯çyŒA\Ãë–«Ä^°ºæf†e9–€KZZ‰Ê1íLQ¸R sI¹ÌRñ*7º+8ãfüÂ¾Ìø…ÉãVª™¥HÆ/t錌_è<Ï ãVuÄsfæq3 ôï 0ß¡2z mYeôÀNVÒ}Uw«úÄ1zV“ŬZ?Áøq‰†9©4.¢ÔÞ‘BÃlK¢ÉS»QWu&sÍm®¹ei½§š[ ÍgŸ˜p€ÆXŸIi't#,ã˜*Bþ:$³Dò£`|Úbú-/,ØVªo†`|•ÅC%.2©ÎÌ)Åpy8Å'ÙŠ4#g°ªë\4uS¼:[Ó‡­ß{û®˜sq=ÊD×Á­äuwdÙ{”$ŽRವݲÒW¢ÖŸ*0[nÕ8JD˜’ †²¨ÀŒ\Ü+€Qt â.dQ ƒB,5ãã«Õí¦‚ yoÀÛ|¸ÖÖ^«ÃbœFaa&¯"±Ð˜ë7váÂó»ÞŠ¢pPUp3yfj“0Yó)lsš”Ë$·íJ(cä0•mcÉù‚Hm[¿Œ(Fi ô`6¥MÃð^Ó¦½¿oŒl ËbU7a1Ùì±¹,À{Oˆš¯íå"Ä*eî3¬—½=±}`1­Ú*â~”®wtã%ù¸|é‘bÕŽ«.nùƒM`Ù Iæ»u¨ª³ä—Ã…A$ÛPÍ 7mkFƒ Ú’á7[Öí›Q]ì¥GpNš›M—ðÍ<×ÍŽð¬MRɶ¥ÅOÑä,Ÿ‚¬È¶©È¤²|vrÊfm i Û½w–y*Ôzô´?hûèX¿ZDub9ËŒ”-áÈlÏIÜjüËdÅãÝa;´¿¢¯wà@ñà^¨¬-ɵTQK…!§4 æ†i]âri¢2 óèÖj¶LÙZ'3–ºË]½•5²÷Ó–»)Êñ¨í¬-÷6S§fLÑdãð²6³¼œ›|ÏR±1Ùs“ïl$g#9ÉeM}ËJ¢™xÓ(ÒÛ´¨׫¯4™,ß{܇qW§[4Ùl ôVµ³óÉ-ЃPÞŒ8¼ÑZ ·Ýh¸®ÖrL*ê™$¸õ!êÖŠ^æøß¢uí#ƒh¯Ý™}€K˜°iØúÚy7|å j,Ý%[Ʋ~)ƶRÇdQ³D3q7EÈ4ÚKve5ÎçaÚKnóZºÓ°‡ßÎåf•sç¹.gϦìy^ÿ4mÓ9†ÏfÒárû·tø-ŽDiÍ,Çn¶)¦êW•åå&äenû[ä¶¿ad€C¬¹Áenp9×¹Á¥ƒI4¸TE¹@ÆbþÏ .sƒK÷yÎ .¯ç¬SrƒËx;œ\»»õä—®]È .¹“µ¾§!Vú]¬v™J©›{==èÉdÚ$®ekÿ¨k£ÆgÜë&©n"7jôŸÚ>1‘³Eƒ Ôe,r!Uª‚§i´u28—m%–áôT0ÀÑ ‹Ï—è&-U<,tŽGUµ L¹‚„ (éÚV¢Ž–@AsÀîãfÒÑ%êKðëOöðû¼Ó½®˜oÏn{¯Ç|’n&>nÌ䇳œg7¥cw®ÚÃDðL™r~Seq¯×:|'ÙcRqVµÅùÀ?[ñ–Êq3)%V"ÜUwôÀEÍMŽ|·ùZ!<™Ì'M«“¶ËЇD8¡Ñt ßéà †–Úz¶c³í;s»2t}2J[ŠDÝ„Pg^òÈ;ôdàÅ{ïàYcêÀw†eN×….™Áp‘¸3Úp¶îͯô#\é§H Q«[­{‡äÕNd.%ÛV4žìZ ÙÇ“tÇÔHO{ìe³'“½›î¾3à÷µ˜„!ÕεÃí3½³­S·>²‰D{Æ&Ó×b÷:$÷Žw¸á=îÕË¬ß iw=ù >uhZÆ>wÀ*¢ÎhKíÍ'š§s {–"ŒÝ™²äÙ”aWƨ¼RÚØÖo´ã¸xÙ]cý r_ ÀŸÑ-f¬ë‰_r6N6Ÿ+ýK¹$#$‹”µMwBêNîÚTò Nâpƒ×ým÷nVúlSªBàS–È ‘5*6 Ü Sù{bƒ‚IÚZð|¼a³?)ÌEø¢¸{·Ý>dbœÝuO”]ÿÒŒyˆsë;ÿ%ÀÌ-ï„t?vƾðlÁ}–]aÙ&ã S­mc>†+ÌtËLmJ”Ên]«ì&[ÁM6z'+=+G6á cÚëì=;‡ñŸ17&1aj^`Ä ¯øE†Â7ª!éÙŒ+\BYÑë,žµ-Ì °¥YfZ¢·÷³Î¤$'æ)4–FÚ)XOXƒªj&dÌÈ2†Á4Ø2.EPì‡Ê6* e°1pb¬†±)̸žÎ=¦T7ž³•²Y®!2»‚ºùûp¥ì¦ ~a®ˆ ®½L@ G’E˳&À€£1!”óMR†;šÅ=¸èþïñ{/‰‚úóÜ/,äí=Anz3¢Pg/ÕQ߀w¢Üà=lîlÙUÈ듾Ö?{rØõôÉÐøZŸj»´x@“¿'¤> Ï1sçÞÜ> +8ꆃƒ•IiKG쮨§ ˜'PaÙtg ßNŸòZú³8Ëpçïû¿¼ˆ`w¡ ¨9ç£shƒŽÁ ¢ËdÔô~,€' éà~xÎ, ñóðÇJ?" ð¼cËjMaNƒ˜ZÆsž#õB`Ï ëãçÃÿýæ{ endstream endobj 6544 0 obj 5458 endobj 6548 0 obj [392 /XYZ 31.5000000 464.750000 0] endobj 6549 0 obj [392 /XYZ 38.2500000 408.500000 0] endobj 6550 0 obj [392 /XYZ 32.2500000 463.250000 0] endobj 6551 0 obj [392 /XYZ 38.2500000 408.500000 0] endobj 6547 0 obj << /Type /Page /Parent 2 0 R /Contents 6552 0 R /Resources 6554 0 R /Annots 6555 0 R /MediaBox [0 0 595 842] >> endobj 6554 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 6555 0 obj [ ] endobj 6552 0 obj << /Length 6553 0 R /Filter /FlateDecode >> stream xœí]ͯ۸¿û¯ð¹@~ŠPØä½è¡@=,z(²Ý.Í¢éúïW²(Ù–ô£¬ñ’%ؼ·–5g†óÅáÛ?úÇñ_¿ß¾ÿôŸã—ðóý§ƒ(œíŸcó÷ÍåÊá÷£óöøåëáÛñÛáãácýï·Cû§÷­ûßQÿRÿ÷ëñÇ¿×þ¾Ô|áëÁIWÿü÷égådý›è6ŸÿrøÛŽ¿5»á2×ÿÿF{QjÕ 13ô·C7Myúûû—ßo[,Å•R•æ(®ÿ©Œ:þ÷Ÿ‡Ÿë:𢨌”®4NÜ3SýHªª!I3èô— |àÚ¹tÀO˜³SEêRÆ¡ÞèzfÊšf¡›E¶Þ«úw§ÃŸûæeTˆæRí >p[%~œ*Ý‚cèœÒ\ZTÿÇO¢3øÀ½‘速0g§J·¸zjiö•D³ã}‚aMzðüÀ•0 ÷†æìTéC/|þÀ߉cû†fÒÖé“#+g¬¨<ü8²’e3¶‘ö(Eͽֱuž—:èµæM½Á›.µl¸(pž#LÁ*“ru{ðIèo½H ½Á=ÕêBà<«+k%[ÒüŸ”¾dŸÅ<³ñ {Ÿzƒ;;]tmïÅ€³®®>åêöà“Ðß5®P:è î©VgÕÌÞÊ”š¹ŸDwVÂ%„~Â=•f†ÀYW·R.åêöàÓ¬®×)¡7¸§Z]œsuµÐ)mæ3øô×¢J¨ZÜ­.κºR¦ÔÌgðIè/Ë„š¡Å=Õê\cÒ~üß"/¾û|xûAQëÉþ¹Æí4fûãó׃³Ç7MзÆþóOÇ? ¡?üéøù×CUÔö‡bûD¼À'ïÐéÐßYÂ'fù8ÒC * >¡Ð 2Ÿ÷pŒµ‚O048Ÿu~˜ÁíõsÍö©9V7OçÖDÂ'¯Ëiá1Ìå™pÛ2Wh½6u(+‡)ª!4<Ž~—Q2jcü$BE¨­0E´<R>‚5^­*#å­éF}á iÄiȧ«‰JQ”Nzg/ˆÓ2¹/|%Nô.‚)Œn«†K:õN+€¶ÐÊË[Ÿ”h7Õ>‘²°¦¼ž©==Ñ݃S-z¡žO«ì<þ@Š<´Êuj¼¶N‰ÌÇi—,1©!JÚBÁĸ–¢Ô2šc.ÑÏÀ¯bÖá¥ù%Œ=aàŸk¤Ý´¼™J‘À3¦ˆÄ+zǼæÛL©ºyCkŠò$bUv{ì7as÷öÄìzŒ[ÄNÃÅÑè?DxÓÒmÖKÈ#µ^f–ÚÝGù¨ó?¦Ä C ^ekv¤vT‹ý_ÂìlF9±²ÚådCr‚wÞ§” í;|‘̘ǰõ q\†0ŽË%s%g@áÞxe"ÒD±8°®ÁgnpFÓ CÃh€£©"§<[7K‘ÿ[‚½ËšåŠhEÖ}{7”}ï‘ù@î#ñ2kRri>¬!4[f”3×eí𾩰½÷™Èš` Ä’A‰Vàw(YÖŽDR9ˆÕF‰Š`¾Ü³ªKS‡¤Q(Ô¸E²~Nd¶¬ &ŽPó5~‚¡ál)¯æÛ°dQ2ò|Ñ…™œj©»\Yi Qé«F®ì)™1—kJ»ÕK©d”اÄq,ÛX ¿ˆ¶!¶P,ž„¦ð;kißQØÚÆ`ï j$´Ù:ô”G•”ìt‘… $‹GMJþðžFjëe¹Ò.ÀT‚…¢4X´/Ö¤ âMÔ¤ùí«Ïr„•dÞäÊ0lV%-;ÝMhåFÚýY"ÖX~÷Îw;q”Ù;H*Õ~è)®Þä ›B1óÞĒ󔙊iŸD™›2¬†¸§HƒRA@)‡Æj‘’ž`U¥xCGÉ»G|ý9¹MrS¢ëÑø;_ÅÌKPC£[}˜fΔ{©-Ê#§f÷|È5˜.Æ.§òú·XoÙÞ&•¼ ùh¬ ð;]¥»r~²ZÃçÔe”¾ãÕV”ï„K8ý·¨À’¥Î‘E ©‚Aá;J=Õ‡àÑÓ4Õ/ìt».ßuù½º|Tç¶ „KêçÅÛ‘fÃò˜…»;gÃÍIsÅíîh‚šÒý“ÊvÅ ”+ð^þƒE†ra{ƳB&Hñ¦Ë†».åTÀ’vo'hñe‰Ì~86VØX‰[½x‡Òody?Ð5s¼A~–sRùӌΗà bŒqáB;J}sÿBJ}D._…r‹å¨4”rÜóž–”™ú4p6Ï“Õd~>Èïå&´Ũ¹Ö z&` 5jmõ„Ç¡@ ¹‚‰wº«ŠuѦF«:ñ†&»6ú$ý>wí… ²¡œ+ôhá1Ö¡?—eEº6bã(Hk ß)áL!u0 >‰Ì4#Û¢U¨ï¼°–h}"óït þ­)–¼>¯pœ«Ph'ú¤Ëï9¯o×úoÉŠüÉ\—miÕuBÜMþç5ùw«_’Y&8Ùšáʆ/nfÁb–F>m{Ù‚¶}»°ôµ$åpÈ [¼"Chêµ8á–sÃO•罯L“âˆÞq¼çÁª/6íôS  )«­G;±ä¬.åX]ÊÚ,k´ž÷E3Â×óUák•(µo~:)OŸV²þħ)ˆî“/µŽ, )+åýù[öŒ½¦y#|àšµÉ<¦þ¤yé ™æ[¶Ìõl¾~9|ʾ‘JÛ6ÞÔURK7í‡Ò›Á$£.»4_P ¡vÑU×_‘œ¼´A•r@©-Wx>Öglgá­>WßXŠÛ²å ”à-Jño™¥2–rbimÅ›í¢›;i·ŽRˆ¡B„·#G”=ÜT¼éXÀ‹tÞ à;ê‡äþ¯sJá~eÓ÷%â²½®Ä˜¾} ¼áVÂnñr ¼ÜðV\/ÆDl•¹åæ²oðuÜX(óÙ¾íµh¦…ù ââêËTæxLLƒÉ<vÄLå®1Sù G¬ùʵ‡Ô¹U—~Tû-{ Æ^Ó;b¦*'1SÙÁ0Í'CGìô­ÛòÒ;³¦#f…~|Gì<‰ù”î–•Cz°Ön ‚û^Ïc–ܘ.á­ÚŠˆ ZãTž)åÜŽbgŠp) ïIXR¾µÁeV{ØÚ†ÖAÄÖÀ¶ T¤'‡`Ÿhhí^«wuËÏGa‡ÒBº™3“­”-¥êÈÁÆñ3ùØ‹!×ÏÇž‘1¡˜g"xŠwLœ1[+‰ÇÒ`býSÐ{žyÅ<óúçö"ï` X޹PD.WÇ ‚W‘ÅŽ‘&l&¥µc$¶V{8)ŒK°"(ŽÄa‹mËVž©Æñ6Uƒö,%hOŠ”Â™êä×Dëà 3+Û"§;#ç%øÉøúñyt%ßÁU]éy(„Oï;œ‡Ü€ïpFæY|l“R*×)’Y;9,è<µ»M»Û´»M»Ûu›p^Õ+{WõªœÈ«zå Ïæ“a^µý–½c/‡éóª^™‰¼ªWz4ŒåUOßê°5—yÕó0kæU½îmQJ Ð]Õ3Uî±vqÇÝâ«tô!÷YÒý:”d¶w¾?k>Ïû¾4ƒ=]¼@ch8{ gª`ebØHöH\â˃[k£R}ÁϺ¡¸N‰TeO„ï&·¾h=“˜@wE Q]¹+ºö¸ÇîJý©ºö#NŸ Ü•ð-{ Æ^Ó¹+õ~ì®ÔŸºá0õ'w¥ýV‡¾¿pW.†YÑ]©çÞ'¿vwe=weƒnÄnÈÚÝ• »+Yì -ÊîÐÍî”<ŸåYl9l*|ÄjwJøm )Ü5ÝWvJ´47D6vÑb­Ç“úïñ[ÍQý8÷…äÉOöÊ“º¨ÍóÃcß.ÌuÊ„hñv;y«âÔø8G ÏÄAýÞ)‡½•„†Ï GÏ¥%§pûfŠÜ\h`Î( ˆlwÆe4ÁÀh¸-¶T'¦!14øN0Ê䢩_eT†k~¯1îÓîu9 HìúÀq"ÌÅ ²âðò9ü$BïW$ ‘u…ó 9ø©w(Àqúö´£w"tó) ß >ݲ™BéÂr'ç<ªeï@Zë ò(#«€i=R‡y•®™¹KM9¡‹°Åݦ¯4œöeàì>þñøñðáâ5© endstream endobj 6553 0 obj 4424 endobj 6557 0 obj [393 /XYZ 31.5000000 481.250000 0] endobj 6558 0 obj [393 /XYZ 31.5000000 104 0] endobj 6559 0 obj [393 /XYZ 38.2500000 785 0] endobj 6560 0 obj [393 /XYZ 32.2500000 535.250000 0] endobj 6561 0 obj [393 /XYZ 32.2500000 480.500000 0] endobj 6562 0 obj [393 /XYZ 31.5000000 663.500000 0] endobj 6563 0 obj [393 /XYZ 31.5000000 663.500000 0] endobj 6564 0 obj [393 /XYZ 32.2500000 102.500000 0] endobj 6565 0 obj [393 /XYZ 31.5000000 536.750000 0] endobj 6566 0 obj [393 /XYZ 38.2500000 785 0] endobj 6567 0 obj << /Type /Annot /Subtype /Link /Rect [60 627.500000 73.5000000 634.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23R_nn2 >> endobj 6568 0 obj << /Type /Annot /Subtype /Link /Rect [60 620.750000 110.250000 627.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23R_nn3 >> endobj 6569 0 obj << /Type /Annot /Subtype /Link /Rect [60 613.250000 127.500000 620 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23R_nn4 >> endobj 6570 0 obj << /Type /Annot /Subtype /Link /Rect [60 606.500000 98.2500000 613.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23R_nn5 >> endobj 6571 0 obj << /Type /Annot /Subtype /Link /Rect [60 599 120 605.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23R_language_conventions >> endobj 6572 0 obj << /Type /Annot /Subtype /Link /Rect [60 592.250000 92.2500000 599 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23R_nn6 >> endobj 6573 0 obj << /Type /Annot /Subtype /Link /Rect [60 584.750000 96.7500000 591.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23R_nn7 >> endobj 6574 0 obj << /Type /Annot /Subtype /Link /Rect [309 564.500000 355.500000 571.250000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.r-project.org/) >> >> endobj 6556 0 obj << /Type /Page /Parent 2 0 R /Contents 6575 0 R /Resources 6577 0 R /Annots 6578 0 R /MediaBox [0 0 595 842] >> endobj 6577 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F8 8 0 R /F9 9 0 R /F1409 1409 0 R >> /XObject << >> >> endobj 6578 0 obj [ 6567 0 R 6568 0 R 6569 0 R 6570 0 R 6571 0 R 6572 0 R 6573 0 R 6574 0 R ] endobj 6575 0 obj << /Length 6576 0 R /Filter /FlateDecode >> stream xœí]K¯ä¸uÞׯ¨õS#>$R€a ïíîYhtYYm;#m¤ã…ÿ¾¥U%‘úXÅs)©nyô-QâëøúúÝ_ÿ<Êã¿wÿ÷·ãýw÷ðÏî¥þ…#L÷ïÿžÿmèþª.ÿöÏ?üç/Ç¿÷=ŽÃ¹ÉÌÿª¬h*ÕOãÆÐ?ã2Åù¿|ÿûá·aÒF1’UsZé£hµ<þÿ_í»ï?mS«áßÄÁm?x]™npaë,ÊlW¹[sÑ­ZÖ #Iéƒ:Í+ É) É£>†t4¼ü¦Íµ=‡›û–Ž»íÓ }¯°}Õuû¤Û>Q SkÓ‰¶¿ûº˜™ºÍ3¯ï-ÁÌ4Õfý¯Á,-!Ã6Öž—ÜöðjÇIîX€w½e^먬.¸“mÜÿàßo!•¶û©mYGÖU]EF–F×Ukáßđ쇽¢,Ûžƒ²"³×{¨2tnEÆÎû™soŠPˆvžÚR©ŒÐ¾ôž ª?`äêü<ó\І熶êt |оôž ZÕQ©Ÿy.hÃÎsC»ÎÊÉ뜜¼ÎÉÉ뜜vžÚM-‡-kë {vé=@ŒÎˆJç™soÊmØy>h ÝŸ ´í·K؆}e^÷¼ q½·ÖŸ¯÷óÜù!.ÛhçyOuUû&dÚ10Øƒá °ÁÇÉ/ß¿}îT°öøí¯Ý–œþùö㠛㯽ս;À~ûóñU%>ÿñøíoÑͰ‘õ0?×òµTæÜRŸd34]¿ù{ƒãDzÃ3hÑ7J ßÔ'+¼o\oâT·ÊÌÆià Ĺ¥9©¡³I‹JÿF 8ƒ×s‹9ugÛyo†„-ŸÐ8xßÄËð<5FØî£{fg- ڃꅰn=ÍÉM÷ìA÷àbÕ°ÒOß:~ùµGÑ,‘Ÿ®òk¤RÕžŒj@J;®9ØŽú¤ä€ãþÒôI+ãm»F-²…ãHØ‚ÇÈÂúpH[F}nQ§Z7ÖÜ·)‘q¬7%<{W¬p÷”)AhDæ¦p‚[,-œïËjlºcGÛ_jñq/P«ô$!<ÆU‘D6…uœó1®B’†°Å4g¡=ÊFÞÏx‰¤0sÎ(ÅêNÝ‹±sÂû÷0²ïP2 eÞ)̆ñ7úÀNœúš´ ’°L–ÄI_/:Ö°Ž{ð/Ýgû‘Nð.áîÔ€]î½Ð„Ùcc†s¿.Fâ&A'ŸïÞÇbJ§’®Ä I s[}#1AGt?¼o øÜ„BF×ÛÅæ/ÔQ±j…'ŽõÚO\K²`I8¯HUí|š 'Qg¶XhqGöæ$Ï&ƒð(½´ŸÐ8Îl±€±£¹gAo}³Æã°жËJº}¿¬À7ªÀð¢0ÃÝu´°Ôò´•¼»U:1îEfàöMÈWŠZ:ƒîL1‘jàVbFM¦2¹—¨¥x ,"@º>|xÄ(œÓr§†íÐ ÝFtP|.Æâƒr°^A{cD“ %"\ž Ý7Á+¬ôà‹¹/>×É:÷<•Ö>b;áÌ ?:X;¤ž`ÎGˆí´NùG¼@Š2QdñQŽ`ÝŽŸbqoØŠòr÷ù¶bA·X®}•ØY1+Bö‰[œÂ{—©À ý“2%Òl™ú¶ÀÑ/è# :%)¼^ãõMýäÎÆëŽ—)×ä““±ÚÊG¬Æ­º ¸$+³FÌbÐô„çQs_ЧÕ7ç‰X”ºm‘u3É/šueÆ%bË!A Ýô)Ϻ˜ ˆÌ+X±ÈtF´$‘)جš·¨òº ×fÑ wÀR 0U=ÄuÖÃÜLFY_‚S\àQ®1[Ü€!庂Õ8Ūƒ~ÙMz»'÷MŸ‹x}Ñy}•㥷`²¬{žÀ‘0òŽüó¬¾g´ëÂSÜ:‹¦Ø2)Ñ””ègŒ)+ÆxÔ²õ„–SB–6ÎS;'ièÖŒDb¾òr‚BQDœ ݳDçE¼˜01;¡DòâO  l$k `È#(TM|æ•Mmùþ S³ڌ)‘¸<LÈê¡à9›)B„AJQ%9â•Iym“¢òç7#TJyB7%öº.ZJ»@®ë 7ýˆU°Eœ=”8— ŸññJ)àýìÛJÖ²$÷ãM¥²€íÍšw‡›q¬`dÉ)Lkò@ÑI‡»[Š¬Êœ,DÁh‚Ñ€äi£$nØÐP,sw­ ëMŸ˜B- ¾‘=e¶ìòh‘kÖòËܦ1žÌ}õ4‰î7ÒŒ’[Ñ"·ääå±é³žDH #Ån¹áÈcŠ!A›!©)u\XlÒž‚5HRÄÊG.IdJ.I¢¡"K]_²5]Õ6s2íœ»à– såAÝ”b W÷wPU'Y©¹"z‹¤›î˜ÁXéma=®Ò[ðѱ^Ø‚ÇQážâŒ"„á¹¾©jº©öÿ¸üîF³ÕÑTý?Fˆs)ûFVǦ«CŽO¾{¢•ÖŠË[fÚËøk£{ßýnúÏŽÞ×¢öÇèž|?x3éž3z™¯ãûá÷ÃË/³=ÁžˆûðZܯa¹Ê T#aÂ|ùabjç„)P­¡P…¬¦fw+ÐE5stQf ]T냲{ Kÿ–™ö2þjæè¢ê%tQ:C‡èÒ=gZOÑå2ƪèrMã­‘–µš?i¬Y±0%VÅ…+ˆ³Ú]ðr}ªü‚š0J¥zI£.­ HÑN¼ºêzN]u³D]µõ1¿{PWÿ–™ö2þªçÔUë%êªU0† ©«{6ÎTO©ë2ƪÔÕˆ‘+ˆ.Ëo†êC)W*Þ«Žµ62Jp!_+á—(¿9r˜föàíÆè9‡1õ‡1ƧþîIÀaú·Ì´—ñ—žs£–8L7 r˜~šrÚË|+së‰!GLº)(J5FXJ`3¥ÌýmJ¤QŠ£¦k›éƒ·SJ«æ”Òê%Ji‹»'¥ôo™i/ã/5§”V.QJ+‚1DH)ݳq¦rJ)—1V¥”örâ‡áÊ$å‘@¡V” 'D˜\êdEk^¢˜3U5Š9={ðfâ5BΈ×tXH¼&°8˜³ÅaN~ç·Ì´—ñ—œo×ëñá[Nú'>ñöÏÆ™Š ñ^ÇX“x;yðõr OÇRcqµ PnI±šRÏà䜜Uu7&‹vCFL¼“•˜c²’K˜CÌÙâábÿ–™ö2þsLVÕ&KߨÓ? 0Y^p×õ2_Çʘ¬.%`’3oUx^Un«Œ\Ù‹¦¦îEÿ ‘…¦½ØÖCžÝ¥$°«Tm¡:Ò¤ IŠ“3!ĉÈ‘þ˜R”Ÿ—Ü?0KéÄYÈtLJÌ¢x÷׺¢ìhpÜÀ“%dÛF¦HPÂçf¨jÖ‚f­'š"> ¸¶ d‰¯^–nË7`‘Ô¼™‹¼!-Ì’fÏ%7A,E‰s‰ÑÖc ‘Ûj-vY.ÒÉ{’–YpÄNG–Ná“^5"x"ê!zèh>¶FM¬q$ê§0Ç2¾H¯Ç0+/!Ç”bh…ü€IQÖ²$Õå(Ê{g /Ÿ§Ìš²Y22JÕ¢J˜rĉ˜¶¢³/Q4+·I(ODÉcA’’ǪfîñBºœ¥š´ñDà#‡(LªT”ÖÆ(W ¥[0››)N]ÖÚs)b“5 —R#ªvnÐ|N‰ +hŒÇ@ްîRÄ[JY+y DøÂ^æE¸>%u/€f$Ïæ‡eÍ'k¹%Ýz‚3RQ”÷Ƽß÷'¿†Æ¼Õõ×çiyIeÍ­Mp@’*çlV)w â¾ îE’é~ D¬ØÙ/}mcº‡ÄY+¼EHóÎt#y©Œ—FštÿepQ7%–ô–<#~É*@0ÖÀ=Λj«¶æ7ö¢¦c\X¡m–X¡­ý1l²Âþ-;ëÅÎÇ(À Û±ª>ÂP®3¤n"‘§ 1XIßçY^ºP.{€®ôXÒƒÙð1Ý  =`Ì-[˜›‚3€–lCˆÌíÍ 3–.[˜5¶b|JŸÛX»§ñ9´”§ÂÍl¶p¿JiueGvÉPLý,Á2ÏêM1õ˜9Þ÷FJ‘#/kETRM,joðýÊ)Ë¢PY÷§­´ÁÐÆzQ%KÁ÷Hª‡èfÁœá‰µö\ÝG´ÑR6CT eæªÐ…Nçy-«¥¬ë3êB³ë‡/­¿×¤¨ÄÕ v÷¼òÞ1I“ðŠ©Ñ…ˆÐLa¬ÏbD\ýÌÖ“†#[Š¥–¶|@-NÒ/´8z[ê ¶àÞœµ„ß8‘¿Ôò¶(Øò9}n•¹±×e°¢¾Ü˜ w"°Wpuú…á µÔ°EC,wÒx©¥~/Ø'0bŒÅßàõàYC ‘×<nîA~ó™£í¾TDsJÙEÞè¦ lrûúqÒ»¼H&åp_êÖ½BÅK™³DDÑBdÓÌÑd“º)–K5ì ·”ÒŽ#½Q4±]ÊÙ}j;‘Þ`Ë£An§$iëç)éÚò<%=ùÆÆ!—eßòŸÆ”¾°J¦áê~ZÞë·W+ œá‘pâ!ø2—3â-îðp޶ŒyzÞ’,/θºqï˜uθ‡Êx²pḬ…îÖwxG‚@Â)"÷òæG8{f I¹Á¤ZK” 9pžÕý餢™b2A —C©õ¼V4t)„Ä¥“×,DØ:3ÓUâmÚ“Sè4Aº/”7.”µ”{„„RÞÆ§ ¹.%œ¿˜¿sOáÃÓÜö·qÝÛæ}uÍ_|ºŸîǾåéFxº¢ûVÒý¨ÅåZˆ§û‘ä~|r¡(.c©÷nvçÉ£÷ ¹ºzus¹xg{÷Ÿf.£ûô¯>ý«ñìÒܽ¾_'¥2%X„…ymŽëWŠ(U•#G¸zV?®ô]©@xJtå¦×÷“Z@ªRòäºËu$~ ¡F)jc Å ÁKOoD(ïø4ÀM9¥<2Yoäþ¡²˜Gã6í}^³·¯âJ¥Î¨”ÄÜ„¤ˆ1ˆÒøSЀ`vàÕP)gbžx¡²Y·Œr×Z[ 8Éš«Ë“ÀÀz*¦ÜWX+Ï)\k76xR‚Y–d©£h«W=xjÌ4Ú]ïXô é ˜OxM«„“;EÑM¹A*Áº@ ·¼u[\R0*çe‘%_#Åö%ŸtаXuËXÃ’Ôú3œ¾Ð+æŸà àÜJ>Ö»¨ ø |ÜkhÆ3¨f¯ÛFàc}©N©q!Ü¡qŒ9 ÎZÂÞ4æ†I˜ñzpKdß0m>ÃiŸá´TÙöhëyLYßfÜl¹‚êO ñ¨ØdD¸bO)rŠ v–¥8 6åPLëÛÜYʹàkÿ0‚@†–"ÞVlÌH¸ÌÄß6’ ˜rcèƒÜñ¹>âßÏ’)±õ¤kvnÁ6g„§–žÜUŠq„kÝïM#™ößoZ7Þóˆ¸& ,¥nx|¼e2žµÿ?.ÇÀ˜Ï[^pÍÒ@¢ª}K¹‰2FÖˆAÒ9—£€ÔjG’ü¿ßWM:P¼ó¸l!ŽcÓ—ÃÝ Î$ñU*SNƒLbj,Xñ¼„wA7ع®ˆ{¯¹^«€M¿Ø­ƒC°óƱ㛲ñ¬Á…1™ã•b·4Úã¹=šë¯G«°s:‚oxw0L1Žâì¢Px¯yéïtø(‚£™„½ $ÜÁŽY¼H ”à-`W·.' L¥os;ˆå’€ÿ‘k&Ÿ¼3FMpn7q¬ &IuÂx#ß¾xæf×ã…½ÆPn°Î(ç²]• Û û˜µQîQ÷‹a  I`«S„R.Ý&DÛ¬VF¹}‚ÂË ulÜ@ VŽXŠóÞ, T „ôU8FèÛ±BÎ y^RåÈ/#8àvQŒÿ)~‚ÈkÕâ­û:­ä‚ àJ9"¤œÆ{ô×òÔwüãò[¬­ŽMÓÿc„pOëcSŸÎóî^vO¾}¢•ÖŠË[jÖ‹šŽÑ½ï~‹þ³£ÿuŒqþÆ›I÷–õbçcü~xù%ϰNŸÖŬH±–ñr÷””¸««@#{¾úý*x—7ÖP,^fO¡£ç54®ù¨%o…)äT›•/qàˆª¡r KÔER¥X½¹µÊR̉õ’–H¦/aRë'P“®Á£ð"<7Â^g¾Ó/åÎóÌféÌŽ¤]\œÈÆóŽ˜5;V§½P©Ç'ª„¨M¿ o0|)Æxh•Á…t°Ô„â;ûJcc=CFxD!Ë-F¦ˆ>@92â•ò^f‚k3ã¹Q´˜À¼A nr3²Ñhu½²1Іƒ{#E¡ãØB®x–»¶˜´ð7xRrJ½¶õ°…%ɺïÌÇ;úQœÁÚn«¹µÝŠ%k»U¾%¼{XÛû·Ô¬5ãbm7í’µÝXŒîI`mïß²³^ì|ŒÖöë½I»Š^ÁúE9/=°ÇCÀÃøK6`1]Ý{ÀãM©íJé ÇB?j9¡Ô@Ň“ÇÈÌøÖŒZÑÖŠ› ,R‚íXÈáåDl¥†" ßB›óF·×Œoœ£Ëµr§#Yâ¸n®g]$oþ²z¬Ú$ðòp9ÜB(Î)¥Ë6à"„¢.øž‡HJ=.h[H%%p  …R7•] ë*¶o„š˜N®‰÷š ÂÞ@|»ë§mõÌõÓ¶õ‚ë§mç–éŸø®Ÿó[jÖ‹šŽ1º~ÚV-¸~ÚVcÈÀõs~ËÎz±ó1²»~úŽÂá&8ŽÞæä'¥£òà ¥ØBd)yœÕOŠÁi—ÁùÏÔœ\©9‘ºƒ~Ò„×¾;[ó&ƒ]H¡l,·RpÔ·zCwV·ŽñÞj9 Ée|žÂë)¼ŠBt oŒ%ŒA±–«ž”¨Oˆï-Ux`ý‹­rW¼Ù¡ª—5{c(7•¨{Ò"™Õ¯[´Ä {”z×|ÑÏn7Lçºs°Å-­9¹¤Ð»¾iá7ƒ¯ÃœË“Ñr¢7îÿ¶¸þõ)Èa0@Š€Ó;çÓÂ7Nr-­£-ø› #aKd'ñ $„2ÜëÈ P³šL(Uñz<3§Öú³&@ÏÚ¹'³—þ««övé?Òq I ‘u÷Ÿ0°‚²~ù¬-ëÁˆ1ÆŒ#7®Xn9o ÁxÉZ޵ÃûóÅßP@Žé(°~Õ–b˜5!³–ñ¾ £/`ÍaÀ§†=Ÿd°H°=½Ÿ·[–Æ8cxõ[n®NK-¡TÊãÐöU÷’4Ȫ:°ð®ÛPÌG¼É½Ûç)9¯Ch­'%×?dVR#ì¸Ð t˜MòŠ e)rv¿RAªý¡Áâ‚^]cxÐ ìÏ|¬ûïø³cXQ~öåÖ w0<»ÄïTÇU*Ñ+g«ô0oeÐU³°ÖÁh&Oò\HfÚ2_›°ÅD‘¡=ÐEuà27 ã¨['Ï¥¹}v+ k(67hY_§TÝ`ÜKO »77ˆma÷¿qh+’–>©îAE¸þïnÆ# áÞáŒ3*ˆ+ïxx‡ìÛwÈTêä¨ë¾­RüŽŽŸ¹ÅcŽ_ÿ·.DC endstream endobj 6576 0 obj 6526 endobj 6580 0 obj [394 /XYZ 31.5000000 610.250000 0] endobj 6581 0 obj [394 /XYZ 31.5000000 390.500000 0] endobj 6582 0 obj [394 /XYZ 31.5000000 390.500000 0] endobj 6583 0 obj [394 /XYZ 32.2500000 693.500000 0] endobj 6584 0 obj [394 /XYZ 31.5000000 729.500000 0] endobj 6585 0 obj [394 /XYZ 32.2500000 728 0] endobj 6586 0 obj [394 /XYZ 31.5000000 694.250000 0] endobj 6587 0 obj [394 /XYZ 32.2500000 658.250000 0] endobj 6588 0 obj [394 /XYZ 32.2500000 609.500000 0] endobj 6589 0 obj [394 /XYZ 31.5000000 659.750000 0] endobj 6590 0 obj << /Type /Annot /Subtype /Link /Rect [60 354.500000 94.5000000 361.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn2 >> endobj 6591 0 obj << /Type /Annot /Subtype /Link /Rect [87 347.750000 126.750000 354.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn3 >> endobj 6592 0 obj << /Type /Annot /Subtype /Link /Rect [87 340.250000 161.250000 347 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn4 >> endobj 6593 0 obj << /Type /Annot /Subtype /Link /Rect [87 333.500000 163.500000 340.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn5 >> endobj 6594 0 obj << /Type /Annot /Subtype /Link /Rect [87 326 136.500000 332.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn6 >> endobj 6595 0 obj << /Type /Annot /Subtype /Link /Rect [87 319.250000 120 326 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn7 >> endobj 6596 0 obj << /Type /Annot /Subtype /Link /Rect [87 311.750000 167.250000 318.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn8 >> endobj 6597 0 obj << /Type /Annot /Subtype /Link /Rect [60 305 188.250000 311.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn9 >> endobj 6598 0 obj << /Type /Annot /Subtype /Link /Rect [87 297.500000 187.500000 304.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn10 >> endobj 6599 0 obj << /Type /Annot /Subtype /Link /Rect [60 290.750000 136.500000 297.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn11 >> endobj 6600 0 obj << /Type /Annot /Subtype /Link /Rect [87 283.250000 109.500000 290 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn12 >> endobj 6601 0 obj << /Type /Annot /Subtype /Link /Rect [87 276.500000 112.500000 283.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn13 >> endobj 6602 0 obj << /Type /Annot /Subtype /Link /Rect [87 269 129.750000 275.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn14 >> endobj 6603 0 obj << /Type /Annot /Subtype /Link /Rect [87 262.250000 114 269 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn15 >> endobj 6604 0 obj << /Type /Annot /Subtype /Link /Rect [87 254.750000 108.750000 261.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn16 >> endobj 6605 0 obj << /Type /Annot /Subtype /Link /Rect [87 248 114 254.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn17 >> endobj 6606 0 obj << /Type /Annot /Subtype /Link /Rect [87 240.500000 119.250000 247.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn18 >> endobj 6607 0 obj << /Type /Annot /Subtype /Link /Rect [87 233.750000 129 240.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn19 >> endobj 6608 0 obj << /Type /Annot /Subtype /Link /Rect [87 226.250000 158.250000 233 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn20 >> endobj 6609 0 obj << /Type /Annot /Subtype /Link /Rect [87 219.500000 126 226.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn21 >> endobj 6610 0 obj << /Type /Annot /Subtype /Link /Rect [87 212 133.500000 218.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn22 >> endobj 6611 0 obj << /Type /Annot /Subtype /Link /Rect [87 205.250000 125.250000 212 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn23 >> endobj 6612 0 obj << /Type /Annot /Subtype /Link /Rect [87 197.750000 186.750000 204.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn23_1 >> endobj 6613 0 obj << /Type /Annot /Subtype /Link /Rect [87 191 135 197.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_C_STL_Functors >> endobj 6614 0 obj << /Type /Annot /Subtype /Link /Rect [87 183.500000 134.250000 190.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_C_Iterators >> endobj 6615 0 obj << /Type /Annot /Subtype /Link /Rect [87 176.750000 139.500000 183.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn24 >> endobj 6616 0 obj << /Type /Annot /Subtype /Link /Rect [114 169.250000 192.750000 176 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_smart_pointers_shared_ptr >> endobj 6617 0 obj << /Type /Annot /Subtype /Link /Rect [114 162.500000 176.250000 169.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_smart_pointers_generic >> endobj 6618 0 obj << /Type /Annot /Subtype /Link /Rect [87 155 170.250000 161.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn25 >> endobj 6619 0 obj << /Type /Annot /Subtype /Link /Rect [114 148.250000 165 155 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn26 >> endobj 6620 0 obj << /Type /Annot /Subtype /Link /Rect [60 140.750000 80.2500000 147.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn27 >> endobj 6621 0 obj << /Type /Annot /Subtype /Link /Rect [87 134 129.750000 140.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn28 >> endobj 6622 0 obj << /Type /Annot /Subtype /Link /Rect [87 126.500000 136.500000 133.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn29 >> endobj 6623 0 obj << /Type /Annot /Subtype /Link /Rect [87 119.750000 125.250000 126.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn30 >> endobj 6624 0 obj << /Type /Annot /Subtype /Link /Rect [87 112.250000 138.750000 119 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn31 >> endobj 6625 0 obj << /Type /Annot /Subtype /Link /Rect [60 105.500000 135 112.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn32 >> endobj 6626 0 obj << /Type /Annot /Subtype /Link /Rect [60 98 110.250000 104.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn33 >> endobj 6627 0 obj << /Type /Annot /Subtype /Link /Rect [87 91.2500000 168.750000 98 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn34 >> endobj 6628 0 obj << /Type /Annot /Subtype /Link /Rect [87 83.7500000 144.750000 90.5000000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn34_2 >> endobj 6629 0 obj << /Type /Annot /Subtype /Link /Rect [87 77 136.500000 83.7500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn35 >> endobj 6630 0 obj << /Type /Annot /Subtype /Link /Rect [87 69.5000000 134.250000 76.2500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn36 >> endobj 6631 0 obj << /Type /Annot /Subtype /Link /Rect [60 62.7500000 87.7500000 69.5000000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn37 >> endobj 6579 0 obj << /Type /Page /Parent 2 0 R /Contents 6632 0 R /Resources 6634 0 R /Annots 6635 0 R /MediaBox [0 0 595 842] >> endobj 6634 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 6635 0 obj [ 6590 0 R 6591 0 R 6592 0 R 6593 0 R 6594 0 R 6595 0 R 6596 0 R 6597 0 R 6598 0 R 6599 0 R 6600 0 R 6601 0 R 6602 0 R 6603 0 R 6604 0 R 6605 0 R 6606 0 R 6607 0 R 6608 0 R 6609 0 R 6610 0 R 6611 0 R 6612 0 R 6613 0 R 6614 0 R 6615 0 R 6616 0 R 6617 0 R 6618 0 R 6619 0 R 6620 0 R 6621 0 R 6622 0 R 6623 0 R 6624 0 R 6625 0 R 6626 0 R 6627 0 R 6628 0 R 6629 0 R 6630 0 R 6631 0 R ] endobj 6632 0 obj << /Length 6633 0 R /Filter /FlateDecode >> stream xœí]K¯ä¸uÞß_QkS#’‡/ 0ý E€F…‘Eж30ÆFÚ^äïGR%>K:—¢tëÖ4ìnQ*R"Ïû|<üùß¾ý÷åþyùùã·ÿ½|wüöÒ]µì¦ÿ.ߟ– Ü\Ý¿/ÚÈË÷¿½ü¸üxùúòµÿÿ/Ó¾}üþ_ÿwá—ïÿ÷×Ëÿ«oü“{hxào/šéþïßÇ¿­fý¿ºùï¡ý·—ÿüÃåïC~8÷2áõOÂp©ax;CÿxñŸÉÆ?ÿüþ÷—Ÿ§ Ø6ŠV’¹0paøå~ùK?€ï¾»Z`L+ÐÝkÒ|‰Û~nd2Îø§Nïl‡Îy?5»u>¾yíIaB±bçW£Ü迉C›a\!zzf.šÚwdàpÐȲçÿcFV#çG®ÈÁZ؉ ¤ÞæÞ÷`2ݳÀ~o^{R<£×\YÚMƒ&èÖý[Õí×ùøæÕgů-Þ{ÿKÖ˜6€þûC1‹ªF#§«µûÈæ°‘‡en9Õ ¸ÌŒüuKÔ×ìfã•/W~KjÀ¾ŠÆÉår âtr_ÅŸƒ‘ö}Àôu·éãnúX7½š½,_ÔöŽÆ·7²f†Y¶×šÅ}ŸhÍúWã—å‹ò7´f»ðYŽα`vüd5¸÷Ö¿äÛX,Dv½s:oZ5wµÿÂá{ûi&ŠSZí¿¾üü…A×þêòë_z >Îáôׯ½i*/? ¾½a—_ÿtù—~ŠÍ¿^~ý닽ö«î§ÜÝù€Ýáèî#ú‹Ýa »#vGj´7‰¾úÝ/èPzû²ýK;ü{>oŸãÏ¿öìµ7%ñ®»OIè7ô7ªÀg¾°Zø[s”–Ñ;…7@Ç)|:o…qÐ;ø[l§>ޝ:×G ã0üÝp)T•7 ó†Ê÷#…_œzqþÁÇÁg‡@;¸6µ^÷ ½ƒs0ª «€K$ôÎix»ÎaÖë@ü}ð5i¤§Hrƒ`8£Úš` Ý´ ½}î†ô"dH- ﳜ¹Û…wºI¼‰«e´L—ÊÄüWS.öÖýt‡1ßËŠîÝloºƒ¿£„ÜrôŽ&üf¢RyܰàÃØ[ÆÁ¿”ð'#K‰NcÓR ÿ…·;b; –ý §86} 89ĉ֠ÓUõ{6, ¾¶$n©:Å|¢|Ö]•fky%3@EUebúD ™/Ø “øí ä$ùs‰¾§–´&R“‰b+°Ý‡Xp6’Ø…¹¤è&Šv$|®< §#ègEãoPP„õ)|)Eãæ:;…Õ&Hœ¿ã«}OWàwsáãwÆFvœû!¿Ì¯9}ÜíeÐ;nrÕÕi§dys¿±èo¦Éeæš(;üÝ&¶`°å7ÞáÅŒÓÜoúÖè÷8ç*÷n°;ø8ή̽ÁGì­]|çJ(ýçŠ"]OìÉ<3ÜmÀ%%>.ccZ°Xw7Ò ëD)m‹j\Wvzj ꪮòC™¤ âªâ­ˆÉX3¿ø…ð0s‚{Í’½žd(V¸ÀybÃ+­Yû{CÃð¡^+xz J{Jø¨²‹KÅ n.çaŠ+Up=(¦ª*RmÜhÕq Nò<–%8N…\EÒQÈ'kŠrÜ@ F.ÌßáÜI‰Qãï–LWA¾R̘ÜÒåI’æ(˜°{Ø~;*VÖ³]¤Y +‚sÎ…f(2½.ÝÞ'Bp¯`vüsC«80釬gâ€þ˸•ÊD_ðøgâxêÓöq ½á³ƒGÔÐÈP!…¾ópr½âsN¦é«5ñoðHá­dÿ¨öÅéÅ ¤Fª¤™¥”èÊ·9]¸Á¼á)!ˆªá„ hˆlp)y¬£œYË™&¸½&Ù)‰ù‚+§×Ï9ÁÂÚ;TŽArŸ)iÆ„YÖ1Hl(«/«å|î˜t²3û˜t„Ô¡ó—™NÄ´c†Þ0èØø«w(U!q‡•vû‚©ÕÊБR´VE¨0ÂEp”WqÖܶªh"„†(²Ž‚V$ÁÈP’Ú¯ª#ªäM ¯;Ý$ +N)¸;ºVw»ÖaÖ9E—ÈÉët÷ÛÓ;Baw|:*³cèÄæ_å}zOoÌ{ÚqÑXM7ˆ™i¿Ïâp¯cgdñ9½?Æ!Z‡§ãñt<žŽÇ=uR%áUw@ðÅ.„m(Û7 »HX³£Ä~å5>£r\îáfú†(a‚ ¤PÙîV [:Uwñ/ëÅ[®ºí©@ó±ÜL¿ëÁìù>'L$ ›/%qDÙAÙùzv°ã³Í&Û@1¯q ¤ ›S  — n½»ŸqO§“1{+âø2'P”­ qèpËÞ©££4,e!A©¶RµNM+ö•Ðñf1?;°¦˜3”}}uù”"n)lB‰ªUe z²ÙŽ)%|ÑÊðZƒþ…½ºòµ=µGó¿iד£'ÎR#®n­žGÛY¤Ì\º”ø)“k0ν œ,è6ìÄÁ FB€é°ºt”`<©¶X¤  ò—’S¨[.¶î¦ ·”ÅñÏ¥Üd~¿5ÜhˆT)ÌBñ¿jlíz”Mëãc¤ú¤Ub…uƒ¡Ê[àÝ×MéUBônœ Ø;‡C¼ö®»}T»ºUе×b·û':ëˆ=O?™Îì®|68zÚ:þ›Â[ÜþÖí ÿMa|Ð3âñó®9:GO¶§œê.ð3ÕÑõÁWŸÊ»uè)ݤU pIâÑ•+ü]9Žž¼^X9”OE+  á+Ž#jt”8)#R7pC©ôÏ¥ÞÚÛ†̤ƒ¼ÑÉ߲ǡ‘?E±°›íÃmå#8âÒÐ3澦/hܦA­ª‚ÆÂÇ!ôF²q‹ÕÚjt¨žÅg·ñ/¨Ô a¸vb{ÿÑ’gì¼·ÿPnè:(©ª=Ûá<ƒÛô(UP¨¯®'R òª6paMñ/%¬)~Ÿk‰KoÜ{ÁeN£8UárãÁ¤PaÞªÒua|FñõA)§Üó¨?¸ôÆ5·]óS¼r@ÇÁßçm@í¼7†{Ëè—ⲪÀõ­âj8âÖ#ð6>…·qy¾[Kð8GC«Ä2†LÁJj1{jä§F>‡FnEñO]ýÔÕO]ýÔÕ+uµðɇ‚|xé©ÅŸZüZüx^xê÷§~ê÷7­ßïÝÙs`­‡=p~< "ÅQ¶ºPPuKµÂQ>üÖŽÃáÑwñ$ûz ‚ÛHnà¦2.ü wð´:¥·ó{Šx ÑZ昊=¿ÚʘBŸˆp’H¤9 ÕDžpŸìƒ!7Tï"m“[o 0>hí¢Â¡¿~³ï¹¢x'a/tÝCo`ºg±$Ícå¸aYí!K…|Ó*ªÕYO3§¨Œ«GWu'EVkhtŠƒ€+ GÑÊô»ðT?ÉOã¡Á¾l‘L7Á¿à8ãá|M ¡¹þ¾©àY]߇àŽ”E§¢¿©²ìZ²²È„ßP™TµU=Ò´Id¤$$eûV!ÆŠ&t9!Ý]غAJàw(P ³·6“bm¶ñ0câ1«œYÛªä ~.d"S«ª“f•Âé[Iw¨qQA°<÷…–Dè.ûBw&Æè¼Û}tå"nuk¨j² ºÚÖYÙµ¬—1Á6q‰ß˜aOѬ?Û'Ï ŽÑÎ!¸ã‹=>7œ^q6Á›9Óñ^(üv·fUäkb]M³åp´õèÁººh ³ï|¼"OVù(iÊIäuÅZ#«eEÞ wÂ3åŸù?̉rh;nÍ&Ú Ÿb\2îa&ÒYï𠬪é÷ôÈ%‚?/tÊЕO›yÊåSËåà=¡ƒW¥î#î×Ýwì ™° ÇñHžgP«“¯ê¦X &Nr‹lêqÿ›94‡AênÌ!œÓ[YãGÄ Vú–ìs#ùðN’¦û¼D¬špÎÁa4x\‰P/‡Ôe£~Õ2FÏÂC¯3ûÏlTlQ<%B±Ž×G( $7„ÖŒºkòP|¸B\ŽªrfiòêºT¢f›î`nß‘&9“Q’RO„é&I×/Q3˜)ã̳s#˜)©è!e·ízg¾nñ¾G ©Sb­Ê•P\4ŠË^æâßÓ(žXp(Âqs¿J,gçˆ=±óÆfÆ"¹Ûªz2àõéñ½wèN>üÝðÝ…]†”ãûˆ…ŠÖêíYNR”ú(RÄ ºSJo¶µ¾kòÕÎ8^¬o3«Rú¸U˜GÙ“‚þ&Uá±BB¶J gZoÓD_µ`…Qˆ—âø<úï… ÅlƧ«•N‰ PvÍ™ÇwWm`m¤gêæ:ªæ¥Hž %à±>Ò âB“„â5ø§oyU7–}0ýq˜œã å,ä]ÁÌ<ÒOÛ»’í] d tŸÈªEv®‚SÏ}6Á³•¨FzæÜú§mÀL_µ&A¡wpñ;-g¾ØnüÍ¢»ò^N „ÛUÓ rð·V¼ãÌ[;.d6Õퟱ;ø8b".®¬³"øÍ't‰Ýq!®qÝñ…½QK)Bó˰°F_‡×üÛ|Ý¿»é.ºþÒŒ™±Õve¯S¼¨ó-ß_”¹2fûß°ù)½ìÅ_McôÏ»k5üìýÚÈxŒ¾åûKô&}›Ó©—ð;¾¿üöòáÁœ°dNØ:.aêµM›X¸~œ¬È™ê&ñH.á(ö%òsÏšœÃÈ·ŸñqÂÁ‘/ÓjÙðûË·2ù3;òø=’.îènjíW˜£Nßò½ÿQçhx~JØ ©yÎ r¤Þ¸H†q˜ðe†§ ìÂa~ë¿¿509%'Ä\®°W›’w>~C¹Ú•åu’î‹;xqú+i}˜Øq^…£U®Ä²a5±s;W9bç&¦Â¾%!öá)G̾)#bï5r†Ø¹H†)±OAØ „ÃJì‚…Ëɸ_é5⎲àÁÜiV÷wñw£g(”)¡óªÕë ®RÕÓV+k/ÀwòGH¹lX-À"2'À@Ç’¥oIØð”P¾ ‘‘`½³ÃS6>a7s¨“±#’ño?¢U²„DÙ: õÖ­1µ¾Àdáí)17Âæó»f½‘Ì‹Õ-V‹%"1¢ 'F”Šù»oIÄÈð”¾)"1¢xNŒ(– ÃR12>a7s¨Q>Bä 491rTf åCJ8™}{Ì¥;ïd8òt «™Ëðˆ¹ŒÈ1—‘1Õឈ7†§óønü%˜Ë°s‡Ãt)sOAØ „ÃÊ\ÆW+x ”‚<'cƒj©ªÎÓ”t鱞ŒõìrÙ°– c!;@Ç3ìIä\ägIÍãS¹ÏÝøK²t]ŽlDz6e;Óÿ­‡9’ ›³k'6YO]kUi´Õ)‹¸œ©KÙ¯¶!M¹GtµP‚ÎxX³eÃïSnN÷Úß_³L:¸ˆR50FîÂ„Îø”^ö⯺ ÌfÒAÐÁL’ÚÜ›º^Âï86ÜïäŸ1µM©ÖU9‡£ )!ÿ*ðP†ÂºB8¼òä >µjL² ©‹ª¥Ô_?Å/ȇþÐ @_Ém}]›îÓøƒÌY4¬6S…ÌTèrfjòò ÌÔá)g†únÜ¥æf¦ “1Sû‰Š‡:1S§§ ìÂa5S{.ß]4—8;1Ì亩:DŠz¦@>(õpêÊrJ]Ql–n<€šå£\6¼Þb–&´˜¥ÍYÌŠÅÖìãlÞá)½ìÅ_™Ðb–:g1÷Ÿ!Uj1—½„ßq°Å¬ T€»×~ØÙ^ŸPö"”Š+ô†»à¸Ümä¶»ãl7_'•Û3èì,å4ÜØeÃj;KëÈÎÒ&gg%akpaëÀLZV¾©#;K«œ¥ã üÐ’ØYãSvá0‡ÚYFÜ¥´Æé–A㱜 «IÍFÐF°9h#$!a°)´q|Ê‘’  ~˜©Ù´là¶)´qz Ân æHR“‡6ªŸÞbIÕT)»ƒ8R¾a-UJa%Ëa‡óÛBr‘,Å ŽOMT7wã/# ¢d9 ¢d1qh‰©rz Ân æPª¼•Sø‚Áª¸ »ë Mܨ5Í€Cr‹’ûL9×ݲa5/‰'E'“hŠ)n|ÊñŠàp~˜/‰NŠ864´$¼$f8Ü­‡9”—à¾y\'ŒKÉ×Ó+«®§J`³„7ˆÕT)#t•”9t•”1ºJÊ]5>å¨Nè*?Ì*e]%eŒ®Zª”3ºêÖ „ÃJ•Ò£« ‹ª–{Û¥àçz"T3 ‰ÉeÃj"Ô Iê I&Ô) i|Ê™PH~˜ê IêØZ"Ô3 éÖ „ÃJ„ú5(¤Â6dÜ`^o“p{Õœ5©g˜·Ë†Õôj#˜´9˜L¼(iS˜Ðø”£GÀ„ü07zµ9˜4±O8´$ôjnj˜Ðm˜CéÕÞ‡ U¨ÄôJBÝ/¨Qn­^sˆµt«XÒ­b,C·*ñ³”ó³–d7>5ÑåÜ¿ìBºUÍЭêb¯qh‰évz Ân æHºULµ¦[>å8B™v?Ìcx.Ó®xì- Çð9Ó~ëÂaå!s wÅ.Òœõ†oÁ$¢d«î;¤”ù{§1Q%| ]@аZ$€‰DØœHH\Yå\Ù€£‡§Ëûnü¥‰DèœH€Ø1Z‘0>a7s¨Hp‘P—A•SJ€ne9çF[6¬fåF•ÊåFUâL+æFǧ™ûnüe”íÿ˱ŠCCKÂjÎÞºp˜CÙ@‹ÆlPy‹ëz7©ØPø°šk¥ôœ¿5lÙ°šL”¿íW-lj¯®Lš¿Ÿrän‚ü­æÆ&—¿U&Ž< - ;˜9{ëÂaeË[³å$Â¥]ÎîªÁvNK»lX˺‹ƺË%Œuâúë.MOMd>wã/£„±îr cÝÅŒ¡%fƒé)»p˜#Ù`xÍÆlPwß*acé€4J­sÔ z£ _5_(®N1xÑßlØ8äN¡ÉYÀ(Ñ⋌O Èm’S3ŸÂvÒ-VKNÁ4ÏÁtÒ<…ŒO9ÉÈx€æ&9y yÐZÉÉgxÀ­‡9TrŠ™8—œ"(/ò)Uag õCÎìÆ— «ÙMEð ­rð Äh´JáãSŽTßðÃÜØMåàZŧ¡%a75Ã7nÝ@8Ì¡ì¦ÌiØ­`ðR’‡”ÊŽïG¥ÕŒK±AÃ+ö½qGîÚ^dÿç~ùМ¦hâHÓFßà•«•ÆaǺGrSrðýͽRùÛöÏžŸÑï3†µj3—P1Aƒ×Põiv(¤Ù7 ƒîOh4½·êT©yuM/i¬9^Ò˜nåPêÁO2–Õk,ÔTÆ{£ÂÁ“J{”f_¯*Á'…’ˆW×o12<ËH“©ßbT|–QéXãSzÙ‹¿ À22w–‘ñXCK\¿ehóoº<ë6Æ‘õ[Œòp#¼´YåJ÷µJ{5gËœ•£¶áuŒŽð:Fçð:FÇx¡%±ÆôŒ×™»ñ—^§Ÿœ5¦c¼ÎÐ’XczÆëܺp˜C­13ãuå¶(ç _\MàÚr ܆}FÕ@?ÆÌ Ÿ©@­oXÍK6ý›ýƒ~†–„—ì ú™»ñ—èÇØèÇØô3´$¼dgÐÏ­‡9’—lçA?•'¤ÔoK6ʵ¬à‚oP°ó)Ǽnä2ÛÍõ#¦bT¾a-—YD,ËDlâØ[–DƧ&.š»ñ—@IJ@IJ8L1´Ä\6=a7s(—ñ™8ðšÏU½öwBì|FpH³lXMì"BpX‘CpX#8†–„ØÅŒà˜»ñ—‚Ê‚ÊÁ1´$Ä.fÇ­‡9”ØÅŒàhuø!=.»ª‚vUÈ) {–éZÏ™0ƒ=¦0¶oxµon¥WpþZd|s›øÍvô›Cïz|J/{ñW›á¯YÆ7·2öÿ‡–Ø7Úü›²…o~ãHßÜÊÿAØî]"ãð@Bê§RNáê­f‡²Ç‰#mÈ:F MÑ+g KØðz!¤Y(„4Ï ! ±€Ã-‘žÒË^ü …îrBHÙx eS!¤f±ãz ¿ã`!¤=øáýñIH!ÊN—cBõŽïô\QÆsƶŠ2ÖFe¬ÍU”±ILÆÚ´¢Ìø”³ÃmPQÆs³ÓM®¢Œ5q„ihIìt3W”¹uá0‡ÚéÖƒWNx8g«sÆaú@WÎÖÖ}TQDŠÙQê¨Õ¨áUTYï¡Øh£aÙ°R&é® 6º7ëR™Ô·F¬±%’IÓS£Ì¹uã.»hÓ7d€6}«Ž‡é { Ân æ@™Ô»Úð˜Lzzq[jç¨ÃÑ ±HB¥¡„«ÓòÉÛb=1ÌØÏJ›Jè莛ˆCy¦„Žîâ°ÛØ’p¨`3Krp(7‡òL ¾UÅÃ𤄎{ Ân æPpŸnq]tjfi<ªžßÊm"<ÅdnXÍm #n“ã6ÙÅl “J=ÓSŽ›|7þRGÜ™J=}«Œ‡¤R{ Ân æPn“ó)&ïÎ3~kuSûź÷ˆ׆›t§¼&ô×: 7õ­Q(hl‰ÂMÓSzÙ‹¿òØ-ÓpSß É‡›Æ6ÿ¦ònZŒq`¸IwÚã‡ðýa)J˜P®²g¢0Φàgÿ•sjSÚeÃ@__¾^~ôy£½Ì<½÷ÀU»…0ÙMOýŒô–~ÿy>äc¨#9I>‘7“äãÞw_Ü™¼•Þq€z~u+¾0‡êÂÆ÷Âõ¹wûâ¾4­£îÈBˆ]ƒÜË2÷éÉ:BÅ3cÄŽ¯žÓ²¹5B¿Ç -<£¶mœJb6ìõÄѺW'XÖQ‰@çŽ/bPw¥ç×Ë×—ÿFËC endstream endobj 6633 0 obj 7752 endobj 6637 0 obj [395 /XYZ 31.5000000 351.500000 0] endobj 6638 0 obj [395 /XYZ 32.2500000 350 0] endobj 6639 0 obj [395 /XYZ 38.2500000 289.250000 0] endobj 6640 0 obj [395 /XYZ 38.2500000 289.250000 0] endobj 6641 0 obj [395 /XYZ 38.2500000 170.750000 0] endobj 6642 0 obj [395 /XYZ 38.2500000 99.5000000 0] endobj 6643 0 obj [395 /XYZ 38.2500000 170.750000 0] endobj 6644 0 obj [395 /XYZ 38.2500000 99.5000000 0] endobj 6645 0 obj << /Type /Annot /Subtype /Link /Rect [87 778.250000 139.500000 785 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn38 >> endobj 6646 0 obj << /Type /Annot /Subtype /Link /Rect [87 771.500000 129.750000 778.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_Typemap_scope >> endobj 6647 0 obj << /Type /Annot /Subtype /Link /Rect [87 764 138 770.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_Copying_a_typemap >> endobj 6648 0 obj << /Type /Annot /Subtype /Link /Rect [87 757.250000 138 764 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_Deleting_a_typemap >> endobj 6649 0 obj << /Type /Annot /Subtype /Link /Rect [87 749.750000 149.250000 756.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_Placement_of_typemaps >> endobj 6650 0 obj << /Type /Annot /Subtype /Link /Rect [87 743 128.250000 749.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn39 >> endobj 6651 0 obj << /Type /Annot /Subtype /Link /Rect [114 735.500000 147 742.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_in_typemap >> endobj 6652 0 obj << /Type /Annot /Subtype /Link /Rect [114 728.750000 169.500000 735.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_typecheck_typemap >> endobj 6653 0 obj << /Type /Annot /Subtype /Link /Rect [114 721.250000 150.750000 728 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_out_typemap >> endobj 6654 0 obj << /Type /Annot /Subtype /Link /Rect [114 714.500000 159 721.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_arginit_typemap >> endobj 6655 0 obj << /Type /Annot /Subtype /Link /Rect [114 707 160.500000 713.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_default_typemap >> endobj 6656 0 obj << /Type /Annot /Subtype /Link /Rect [114 700.250000 158.250000 707 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_check_typemap >> endobj 6657 0 obj << /Type /Annot /Subtype /Link /Rect [114 692.750000 159.750000 699.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_argout_typemap_ >> endobj 6658 0 obj << /Type /Annot /Subtype /Link /Rect [114 686 161.250000 692.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_freearg_typemap_ >> endobj 6659 0 obj << /Type /Annot /Subtype /Link /Rect [114 678.500000 163.500000 685.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_newfree_typemap >> endobj 6660 0 obj << /Type /Annot /Subtype /Link /Rect [114 671.750000 168.750000 678.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_memberin_typemap >> endobj 6661 0 obj << /Type /Annot /Subtype /Link /Rect [114 664.250000 155.250000 671 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_varin_typemap >> endobj 6662 0 obj << /Type /Annot /Subtype /Link /Rect [114 657.500000 159 664.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_varout_typemap_ >> endobj 6663 0 obj << /Type /Annot /Subtype /Link /Rect [114 650 159.750000 656.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_throws_typemap >> endobj 6664 0 obj << /Type /Annot /Subtype /Link /Rect [114 643.250000 162.750000 650 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_directorin_typemap >> endobj 6665 0 obj << /Type /Annot /Subtype /Link /Rect [114 635.750000 166.500000 642.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_directorout_typemap >> endobj 6666 0 obj << /Type /Annot /Subtype /Link /Rect [114 629 175.500000 635.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_directorargout_typemap >> endobj 6667 0 obj << /Type /Annot /Subtype /Link /Rect [114 621.500000 145.500000 628.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_ret_typemap >> endobj 6668 0 obj << /Type /Annot /Subtype /Link /Rect [114 614.750000 159 621.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_globalin_typemap >> endobj 6669 0 obj << /Type /Annot /Subtype /Link /Rect [87 607.250000 137.250000 614 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn40 >> endobj 6670 0 obj << /Type /Annot /Subtype /Link /Rect [87 600.500000 131.250000 607.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn41 >> endobj 6671 0 obj << /Type /Annot /Subtype /Link /Rect [114 593 190.500000 599.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn42 >> endobj 6672 0 obj << /Type /Annot /Subtype /Link /Rect [114 586.250000 190.500000 593 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn43 >> endobj 6673 0 obj << /Type /Annot /Subtype /Link /Rect [114 578.750000 162.750000 585.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn44 >> endobj 6674 0 obj << /Type /Annot /Subtype /Link /Rect [114 572 143.250000 578.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn45 >> endobj 6675 0 obj << /Type /Annot /Subtype /Link /Rect [114 564.500000 135.750000 571.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn46 >> endobj 6676 0 obj << /Type /Annot /Subtype /Link /Rect [87 557.750000 139.500000 564.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn47 >> endobj 6677 0 obj << /Type /Annot /Subtype /Link /Rect [87 550.250000 181.500000 557 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn48 >> endobj 6678 0 obj << /Type /Annot /Subtype /Link /Rect [87 543.500000 168.750000 550.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn49 >> endobj 6679 0 obj << /Type /Annot /Subtype /Link /Rect [87 536 129.750000 542.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn50 >> endobj 6680 0 obj << /Type /Annot /Subtype /Link /Rect [114 529.250000 180 536 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn51 >> endobj 6681 0 obj << /Type /Annot /Subtype /Link /Rect [87 521.750000 180.750000 528.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn52 >> endobj 6682 0 obj << /Type /Annot /Subtype /Link /Rect [60 515 110.250000 521.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn65 >> endobj 6683 0 obj << /Type /Annot /Subtype /Link /Rect [87 507.500000 132 514.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn66 >> endobj 6684 0 obj << /Type /Annot /Subtype /Link /Rect [87 500.750000 140.250000 507.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn67 >> endobj 6685 0 obj << /Type /Annot /Subtype /Link /Rect [114 493.250000 178.500000 500 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn68 >> endobj 6686 0 obj << /Type /Annot /Subtype /Link /Rect [114 486.500000 178.500000 493.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_autodoc1 >> endobj 6687 0 obj << /Type /Annot /Subtype /Link /Rect [114 479 178.500000 485.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_autodoc2 >> endobj 6688 0 obj << /Type /Annot /Subtype /Link /Rect [114 472.250000 178.500000 479 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_feature_autodoc3 >> endobj 6689 0 obj << /Type /Annot /Subtype /Link /Rect [114 464.750000 199.500000 471.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn70 >> endobj 6690 0 obj << /Type /Annot /Subtype /Link /Rect [87 458 143.250000 464.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn71 >> endobj 6691 0 obj << /Type /Annot /Subtype /Link /Rect [60 450.500000 105.750000 457.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn53 >> endobj 6692 0 obj << /Type /Annot /Subtype /Link /Rect [87 443.750000 143.250000 450.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_operator_overloading >> endobj 6693 0 obj << /Type /Annot /Subtype /Link /Rect [87 436.250000 172.500000 443 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn55 >> endobj 6694 0 obj << /Type /Annot /Subtype /Link /Rect [87 429.500000 153.750000 436.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn56 >> endobj 6695 0 obj << /Type /Annot /Subtype /Link /Rect [60 422 117.750000 428.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn57 >> endobj 6696 0 obj << /Type /Annot /Subtype /Link /Rect [87 415.250000 181.500000 422 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn58 >> endobj 6697 0 obj << /Type /Annot /Subtype /Link /Rect [87 407.750000 134.250000 414.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn59 >> endobj 6698 0 obj << /Type /Annot /Subtype /Link /Rect [87 401 128.250000 407.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn60 >> endobj 6699 0 obj << /Type /Annot /Subtype /Link /Rect [87 393.500000 127.500000 400.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn61 >> endobj 6700 0 obj << /Type /Annot /Subtype /Link /Rect [87 386.750000 126.750000 393.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn62 >> endobj 6701 0 obj << /Type /Annot /Subtype /Link /Rect [87 379.250000 181.500000 386 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn63 >> endobj 6702 0 obj << /Type /Annot /Subtype /Link /Rect [412.500000 303.500000 447.750000 310.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG >> endobj 6636 0 obj << /Type /Page /Parent 2 0 R /Contents 6703 0 R /Resources 6705 0 R /Annots 6706 0 R /MediaBox [0 0 595 842] >> endobj 6705 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F1409 1409 0 R >> /XObject << >> >> endobj 6706 0 obj [ 6645 0 R 6646 0 R 6647 0 R 6648 0 R 6649 0 R 6650 0 R 6651 0 R 6652 0 R 6653 0 R 6654 0 R 6655 0 R 6656 0 R 6657 0 R 6658 0 R 6659 0 R 6660 0 R 6661 0 R 6662 0 R 6663 0 R 6664 0 R 6665 0 R 6666 0 R 6667 0 R 6668 0 R 6669 0 R 6670 0 R 6671 0 R 6672 0 R 6673 0 R 6674 0 R 6675 0 R 6676 0 R 6677 0 R 6678 0 R 6679 0 R 6680 0 R 6681 0 R 6682 0 R 6683 0 R 6684 0 R 6685 0 R 6686 0 R 6687 0 R 6688 0 R 6689 0 R 6690 0 R 6691 0 R 6692 0 R 6693 0 R 6694 0 R 6695 0 R 6696 0 R 6697 0 R 6698 0 R 6699 0 R 6700 0 R 6701 0 R 6702 0 R ] endobj 6703 0 obj << /Length 6704 0 R /Filter /FlateDecode >> stream xœí]I¯äºuÞß_Qk¯çô ‹Ý@FAÛŽaØFÚ^äïG*‰*‰äÇ’NQCÕ­¾xï^I$Ež‰gâ¯ÿöí¿OÿóÏÓ¯Ÿ¾ýïéGÿûÓ·7v¶šuÿNíÏ/c€pçþï“uúôãoo?O?ß~{û­ùÿÏ·î…oŸþ£ùëÿNâôïÍ9ýþ¿àú‡Úþöf¹m~ÿõòÛ[Þüņß-üÏoÿù»ÓßÛCwý`¦×¿H'µº ãF×?ßÂgòËÏ?üýí×n–õbež¸’êĽ§üñíOí·Ñ+ƃ'uJÜ=L°kl„vMÃP«4Ì•P™¶ï˜vÑOg]þ4îÐ7òmã9tÜóµæ0n{…9lº§q‡b‡9\s‹Swýeè¦e[>t¶íäZ{ TB_g±¿"NäÙ™þüûT®Š»Ì47=«4óþMìÙŠ¶kåü‰‹F¸h[u‰£Öù ·«5~yíIáÒðbãk¯¶nXoµ‡Ö×X£ÕŠ¨ÔŽ|­Õ†¯½ÚNôSfÍ s6´¾Æ‚8¿"㸌¼ö¤„ÕŽ' 5žn(¸RÝNÀ·¯_dÚÀYƒ1®Ýˆö·å¼ƒŠV¦ô=Èæ%væ.æÜð”ô“fºËÐMóF¸öÅÓ´æmÔM i»¦{JM›QÓnþÜHåñJL÷Klµ~^üøýíׯMwæôýOÍ­Ë„w¿¾73¨Íé—Ë·ëÓ÷?œþ¥ùÿ¯§ïinœ™—í´}ðrGtwÜÙyÖhE£;\ ;L]’Ývözç¼£/wäY+ã&#`®ëgF#…!áŽá`%:æ6;æ]#\že£ï4·f ÷#»¹øò½!°+n䨦YâË ›žj„Ÿ¦Ê &;Î]DvÜçÈNð˜ìHBvíS=Ù…fÂ¥›’ç6Cv¼Á稛“]÷”š6£¦ÝìJv ¯ì—Ó^–ÓŸ­ÑÑB÷ $”P¨Œ†ÐŸXˆëB\·l ˜ëÒF¸.]׋‘P±×Õ¹C3áÒF¸.Mץ޻i ®_žRÓfÔ´›]q]ɰœŸ;däÃß… }䇅ÍÃŽß‹ˆ™O\J ‚D޳‰K›ˆ¸´Í—ö1Ö7„¸Ú§zâ Í„K—Ö9âj·UQ7*%®ËSjÚŒšv³+qã+$.ŒR E³{ÑߪôgdD=`6ýYÑŸ59ú³.&Œ’Ð_ûTO_¡™p©#ú³*GV&ÝÈ”þ.O©i3jÚÍ®ôçxØ%uËÉÙ¹…ŽéSY“õ‰€{"†IÚ¸A"ŽÐÚaI5×ÏÒݘ= J!Æ€ÙDìUDÄ^çˆ8±NðÞ:1¡Áö©žHC3áREDìeŽˆ}bkñ"%âËSjÚŒšv³' 6`˜DB”3¨‡â;‰†ú>‘^0$—™þ-:K’ƒèP«ý¥›Ÿüñíãæø#„ëð§AènfT·ÃÑAܧZ{@Dº.í|¶Ó)Xà‘ÜŽÐE² ‹t·xÝeLÔ lã]ÒÈ×ð^XG…´f ¨€Àʵ½½ÀØ¢å%^ú÷ŠHÚ Ú¢* ’q@¤†erQ&¯åÕ5â^]#ƒW—Ûåû—Ù ÞdPˆG¤8,ð«Gö´R‡ôè×KAݘû…Ø(ÝÔ'°QÀ«Û¨ãÓ™ÉÍó‡]BÁãh:{Xq=xA™*¬¸9€´ÑÚÃÌ| ?Š[†bM§p—¥+m‡*œÎŽs ÆEU8ËUá4>®ÂÙBbÇå©Î€14.£*œ Ud ÆÅU8[HlàèžRÓfÔ´›= Æ?YÎ|µÐ1,Ò6Bã‡âžÞŽsIȲ¨¸§e.CB–³·[HLB—§:š —QqOËrÅ=-‹‹{¶˜„º§Ô´5ífO²üžâž…º€±œáÿ¥ wÛD“\ I\¥,egL*9?9š4ØŒÝÍ’9‹.²5¹3›qZ|#й1`6ãQáV+r…[­ˆ ·¶„qŠ¡pëÐL¸Œ ·Z‘+ÜjE\¸µ…$ŒS …[¯Í¨i7»2N9n¥TEÆ%%)’¸Šc+ÆIÉ*8˜¶*ž¹ÀX5ò‚ÂóH,.þ@1×ú¸”â+:ÿUÌæR*Н°*_aU_ÑB.¥†øŠ¡™pÅWX•‹¯°*ޝh! —RC|ŵ5ífW.¥o—·-Hb &W5TÆqÌâ` lÝ«žÅÍ'*=ÄUX>Üo`²æ9ÈÍ.ho­ùY\'øáÁ@å¿`CÀ£^“Rz]£J²f‹'#ñãTNü$–3Û[Î&Ò£}ª/¡™p)#ñãDNü¸ØØBñsyJM›QÓnv?.Ä|<”eK}´„©Œ£ĶI씢8¿öK-zöìV\Ű2_;ðC` ›îÐ. Zǂޮ光YÖs×AõÉøžG±ùñf\ÏÉøð”·®DÏ¢Â5¿p°øm–ôѾ¤¹%Æ­L¿£eƒ·9tê 6…C^0A$Ô›ìE1™UÍh¥p4'©ÞV¼pl(%ug®oéÍBJ[J~˜«|8Á§Ê‡"£|¸ÄtæzÓÙXw¸<Õ)C3á’O•'XFùp<6¶XùpWmãÚŒšv³§òáÄíà™‚…ïëFÚcI“3‡WÌ–eN¸a§kÇ€Ù$¤XDB gH(±ë¸Þ®3¡€ö©žDB3á’E$$}Ž„dl¥j! ]žRÓfÔ´›]IH õ½;<â*¸3†….D}˜Á+…Þ¡TA%%XÏÂÇŸ¡ôBÊTÁí.¼î·A9}€ 'gô ÉŸÉåò-m@fNGdæj•¬pþ%+<“/2{‘YqR¾¬Ofž©)™ÀýdæùŠ€x!^dö"³âé8s±™ ‘™¨UTßËÕ÷Š¿ÈìEfÄãºÇLº.“PÁ™§:‹NÌ5­zgñ:WœÅë¸8K ‰M«—§:ÓéÐL¸ŒŠ³x+Îâu\œ¥…ĦÕî)5mFM»ÙÓ´ê {q¶϶Âz3áÀìp·¯ßÛ C„k•ñõ{k"?| ‰}ý—§ì¸•pÂ‘ÂµÈøú½åI<ñõ·°0R1òõ_ûØÓ×ïmy*$£cßâ‚òa JanéGÃ`>Ö((±€¾ç:å½ AÑEÇÀl±çE$ö¼Ì‰='¶DìµOõb-4.E$ö<ω=§5¶Dì]žRÓfÔ´›]Åž¡0¸ä )üuÿŒr‡É¢F–$¥Öha'A) ]- Àûá˜6̤YÇø4¦dihHsD4Û=u¡Ék3árHÓ24Ž1wÃ’@šþ)5mFM»Ù‘f›Q„@šBªAQ$QæVùk¸ÞNÕc›ñ÷ÈÏà2œ ' -¨`”J\`dxÕk•4h(c¨øãô0›]I±+™ Zj 2æ#2 ZêžêÙ‘äv%YÄ®D&h©º¸‘-õO©i3jÚÍ®ìJ† %“OR1}Ò.Þ¸§Qç»3´Bµá¤˜SÝÔÖ#󱥜@• ¤îÝž;¦üx{î˜féö¼ŠéÖù‰¶çÝSvÜJÕ÷ÑoÏ›k—nϨûP6Þž_`aäîº=õ±ãö¼ùn}û H”Ã’Ò”ò˜Tš«¤àÏÜä7ë9Ôåê%›^T—Ë1ã" l2u¹Úß±h´I]®î©~ÆO$°q‘6™º\ ÔÄݘ¤.Wÿ”š6£¦Ýì*­ºo!Á$Ú©l! œ’öW8­j51öZX“O:ž„¢ƒS ã°ÐÊ-0_µ°×ˆ5?ÌfqÎF,ι‹‹ ŒHÂâü•§…fÂ¥XœËÔMk :îÆ%uÓú§Ô´5ífWçC˜ÝKWêlØ–Õ”Š ÎÌ"ƒãì³ ùàÀNŒsIˆ³i­© Õ@c{gI­î©ŽD†fÂå´‚VÈTÐj ±õ²…Ä$Ô=¥¦Í¨i7{’çâI¨àþ¢ø nZ¸60»7K\À¢ÛÀlú:¢‘©ÝÔ@cIí¦î©ÿ…™Ð‡Ð}ˆLí¦›ËZHBB!Ô„>Äj79.CìÛnZôû<Ч™ù¡ê’ÑcÀlrP*"• ˜j 6ÆS•LuOõè®ô„”ŠÈAe¦¨HºI¦ú§Ô´5ífWrз±’”êO؉¼WºÐÃUFŒ³éÂȈ.L¦ÆR­ Ü$5–º§z¼7jBFFta25–hlÓi! ]>‚º0òtafÔX‚&:¬`Q‚† ”º!H,±\׬9@a»TÕ¤"?ö,N&:9¼C1“‘Jé¥y>#³×ÂI~ ˜ë­¹IÈl>!+v¡c!nf@Ù+/©\[£V6é—ª¥A)\(¥‡'áw]²^˜ªpÍG| 4+Ó »¹âG [JIJÈå€vØO!Z/AÆ?Où"y¹SËž2ZÎDÿ:¨Jæ4ÔÜŽá™sÏïF³ð¾ãá;=›+äSX ÀÑö&”\ûÝé1MpTŸ2×Z·š\“­„€cƒßSþR_ InH8y#܈q ᲘÏX)Š\ ¹œZlð–³'Š£Êž…±ØúW¡c¼pÝü€[™*'ô$H¼†bÖçÀÚ!‚¦TåÛhXp\S¦)ypÞ(!gÞD¼Å©VbšûXŠmµIŸ¿-#å0?]Œ’¹²$Â1/ ¶”ɡĎ’ˆ`Âé(ˆ²BnÆ›$ôÎGŠÅ©üT·æë#å§Ú/«BÁ྅ÎÔV”YÞ‰Xf=»ÄFFLu òS’%(ĺʪ¦ä`P„ !»em-€’|ãC:’R†ÿ$Ñ;,½•ܼåJÜÀ’5¤˜QŽ+x(d”R&5¼«ì„W\;.E¼xp4)“ $ÓPxx²#há‡Éû_dÙßÏU×NHJ=x™H׮ƱÙ÷PÂþöÅĶgb$;Vîèø°¢¸4ÂDâr7{g'’8vÝR%U­.…/ÅìqAU½ºâ—æîuI©µù)Üõ".nmAlÈx…‹Ý§,a7ë˜g1ŽRê T1šï¯q?díÓdò£)Tª¥EÒäV‘ ¤Xs³!íX­‘*}VŒ;ZÓuÎ|$³ ÔMÙ6Õ½¯J$nE©õH1öÕ–‡ú‰…`}*œþLaº[ùèk¨*KÂÉì¿@ó•Š„-láR“ek;ßåCR?öŠÂÙÍS[·îèžî ïE$$·bj´gÝ<‹‘ öþ{/hK8Ö …Í/³u™¬¡2y_u/@öH`»Œaº†øÜƒ'Ñ,Hn,Œ¤uwo5|¸kGØÜ±',„IJn•žK2!oà× ÿ¥‹ Ìž~sÉ_uûDÂ*1sÓ:ÒŽMÙáW±ÍRÒÓ)ƒÝ¨ ô#†èVI_å>{Î`çãTrèòkPý’JïØD’Âù¡ê;½#?¹—¨[בÊOÝ‘pÔðïàï [‘nú¤X{ö"ºÇ—^M854„pFRe‡ÅZ5Fûˆ9ÚVç)v¬Âþ„R‡êÀîÀ%™S[‰Ò5Ì3˜okÚäù”4"bT"”èdM: ÌñÝ‘¾óauÜ—¢¸~éD.Šý j ú²"X}™+=œbÞ[·3+×ó¿†8xâAÏ/rw>,ÁÆØ»hl·†gô ¼óÞ‘ð^S¼>öÆÊ­¯Eik§(±,:äÈZÔVgý¹6Á$§ Q,¶ jIÔeÛ7d݋Ϥ©o"f€y½€2ECN«Wß¶ç@Eìì¥ÜÐGÌPòúÙô‘;pô¥½w¨ù r˜XïÍ|ÝË-RP1 JáÎâ”Û““9fo˜€ñ;ø{ð¨!;«³Ét´Š… žj NÉžÄÕ ­¶A«E3*Ö÷x—GÅ5û´"î³j’æ¾,ìy-jPG <ºHnòº )iëFÂQÒNë`1%›ƒ;¦Ô´ªåU×àvÓý¿f„¹¶ñvr“øs<«ŒzÌP R–WÕˆŠñ ° ó-8¤äûsGÙx0âPÑÙ¹«Y--ÄÌÊ% ·ÒÖÆçñÔÕ=gáˆ;Ü­ê\W9ˆc[›ðúQç”t^¯^PnŽR„íÅÞv9Uª•à@¬½ê×­¢UPN%^ ¼x« « ÿþŸá;8£ Ãl®‚~½¿§Ÿvs–\dõ»Ü2$ðz ʵ†W÷ÓŒ=K™’yþžBÖ áKáj™;_­ÁÙ)̨%àŽxǶUt‚uáàÒBÈÕÓ$ K(<£ð{Ñö‹¶—¶q B‘-Ì)ÞÁúA¯Õl£mÛHNá\0ÆX\ëǰ¼Ž˜sðó Ì!!ŽŠ˜áïÙˆžñjK¼Ú¸(þüäu¥ë Gkãh¡ÐævXºÂÅï((% »o8o¤õs]˜<6¬ÉFðâ.wY?ËËebQ2Š:ËUÓŸ ‘ÉÀéssL°.^§] w(Ù4›eoÁ,¤Â;0?©'¥\>ÉÎ5žžÌ—eäÁ~0r´ð9G·r§Ö¬ðvpÅ¿ Ô¼ Ôä&¥nœXUeECp§&ŽÉºõÖ–PÂ#y”7‹ü¬ë´Ÿ_•¨.zoUé¢QEÈ@,|i¬‡õ=äZðHΠNåVu©r5¥rEÝJì”z˜ì0?^717’ŠøG¨âñb³2uÖ=¸»G:*œrè;>:‘Â9ååÈÁhó÷ìZ"¾~j“‹7tu´I|§n^º©M$1€‹û9rµÈq½§{yÌO~ -6¥ö欄ê[±FHuÑšò¥uwZÏ6o›å:y/!lTqn·´RÇ;J].m´f{G›×ʦœ,€Ë-â²Hû«‚ ð–’¾¹n¥Œ´ù§¡QŒHûÛŸªz“ÿÀÁŒºæÀ®lÃ-ïhè´¯w œ]ïcî|àz?«ºk]Žç}#f¾›“”–¾@òTeâeq‡“{›ŸÓÏÙŠ¸øÛ­f «ËŸ(ÏŒ·î÷“,'Îv‡­63 ÝHœE:2ºÓñ`“ÞébÅÙı ‚CDûŒú‘·ôàÜØ¾ö_ŠŽÁ^J£vt›ô{âÆ©ÅX¾g>ƒãÖà;=BóEŸ>ŠF¦"\ûw3â°Ðpî((À±nQ@Hˆì_zâÕ !T™Y…ó]À¼FK ¸€¿÷ƒ[s÷ã‚eòÜó‘yH!ápúÀÀž£Þ⦧ßÞþ¸óz endstream endobj 6704 0 obj 6829 endobj 6708 0 obj [396 /XYZ 38.2500000 348.500000 0] endobj 6709 0 obj [396 /XYZ 38.2500000 284.750000 0] endobj 6710 0 obj [396 /XYZ 31.5000000 136.250000 0] endobj 6711 0 obj [396 /XYZ 38.2500000 502.250000 0] endobj 6712 0 obj [396 /XYZ 38.2500000 348.500000 0] endobj 6713 0 obj [396 /XYZ 38.2500000 284.750000 0] endobj 6714 0 obj [396 /XYZ 32.2500000 135.500000 0] endobj 6715 0 obj [396 /XYZ 38.2500000 502.250000 0] endobj 6716 0 obj << /Type /Annot /Subtype /Link /Rect [389.250000 509 417.750000 515.750000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://github.com/swig/swig/wiki) >> >> endobj 6707 0 obj << /Type /Page /Parent 2 0 R /Contents 6717 0 R /Resources 6719 0 R /Annots 6720 0 R /MediaBox [0 0 595 842] >> endobj 6719 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1409 1409 0 R /F8 8 0 R /F1700 1700 0 R >> /XObject << >> >> endobj 6720 0 obj [ 6716 0 R ] endobj 6717 0 obj << /Length 6718 0 R /Filter /FlateDecode >> stream xœí]ËŽÜÈ•Ý×Wäz€Îf¼ø ’J20‹ ˜…1‹A·0܆5^Ìï›™ fUy‚Œ“7‚̬la¬š¢ŒÇû¾çþü‡oÿ{øË¿?úöÏÃ/þïOßžªcãªá¿ÃéÏO¯¡Û£ÿùдîðËoO??ž¾>}íÿ÷ÇÓð·OÿÕÿôÿ}øÏþÿþvøãÿô¿üÕÿ£Ó?øí©QMÿ÷ßÏwêª.Ÿ~ÿ×§ÿþÃ?N#ŽŸó“yûÿÿdZëT}šÆÂ§<ËTç?ÿúåO?ö•¦î*£Ê{PÕ‡ÿûÓÓŸûŒÃWÇÖeílÿsWÛ¦rm«ûŸãÿc?®¬=¾nJµuÿóäãç?Bë£÷û–qôóÜÅ÷Åè.:ø±­uc]Õµðç+7­s~Ó”Ír(—ñsŒnª¬uš»üÆø3Ç£ç»æ>ïZÝWwÕAõ#I.->Ãà¶3ù?Ï\|WÔiØèèùnù°.W×~Ó„i9>ÃàuÓåü<ó 7|8p¶;žgóæ”,zâ—7÷Nßùˆžømœ{ß©øäzbêÜWÚ(ÞiLðú=”ºÓøæbò­áwàý%¸QUþ‚™ äÓï1l€8„Åïd$°“Ýð–À"¬ÅÑðÁ‚b ž¿¾ssƒß±Ÿ ðGe­DUj‘Ÿ`Îé Ô˜£aÎIÌ@AÞí0ç|†œ³Jón?ƒB©Wˆ&bƒ½J–$#Çg€7ÏWd a~IÿŽ1é„I©(ø|ðŽÂ¹1+Åë1öåldu©Æ c« V׫Onou½LÆŒÇÔÔî­À1*´ ­”Ò=ÒŒ­;Ó˜½Ž¨ºp4Ï_çæŸ0†í¢­¸!UE,Ü¡bÎøàñOÍ LCøláðEµL­Û·ÖL’&‡Õ¬e,J?¤Ïàá;ÈC/ÖC94ÆB ïU…-½‘’S…>ŵ×ûŠÄzš!áÒôÜféöãüƒˆ3r œiaa¨Ç`^r“Ù&‘•Âõ`ï3 ïNd„ÿÛ`ɾˆÜ¢HòV ÙìïŒUfquøÎDRíp`Ë_|&XÊâ¼2(‚TnJ¤Í;oôâº0¶8<O+rŽx÷$$Âö ïch¹ÂŽà<•"f½”‹Y†þZ¦ÿ½ßáæòÕçÜÚ¾š:=†}oÀzÊG¢ôZìObbÊ;õmÄŒï:$˜‡í-wµ«Ãë¸y)ÞöN}ÙhOdÖ'6íqÈHÔ‰KU‰®_ãBt€äl΄ŒŠ‰÷ãtÓÚ_¥jr•DCõ”ÿ‡˜p` ŸüúD§¨“Éâ|Q $2øúLĈCù²>ßõÉøl7säb. ›Xqwg<Yô&éƒ(mÙ Ë(Q;Ÿ"üJ9½¥’,“ç,wÀrNס°¸IÔÑñ\<'PŠ2Á2)æÞ`>‚‚¯¿Ä¥Hñ¯âly&7”ñ'ä“– ‹8*ˆ ÊM°?»·Xm°#.Þb¬vOpZB¤ ‘°=ÊxmsØY­*rù ±OÕçõ$ÙÂn¦ø—)vŠà—ná—Ízµ”o ©uŸ¥®ëÞîLZR%Æ‹ÁJ-N‡"’x5N(¿MDª•˜Ñ±L—µº žNÆÃOꋤÝbHVæ;–-N‡30¢7ÙÑ{»3r†úŠ;c®‚j{Ü™Ç)xg"0ÓDAFd=xÖK·VŠÞp‰—K×Q":Þø%0’Ðé¯GPÛ‘õÒúðic^¡7¼üŽ)(YÜUX˜›K–Èea޲T–FåwÆ×#öQ¶w›{°gÙÆœBäf½›3ì(æ.¥xôBFQ£ÆQÜB@62àë8çPa C³áêªH#:ÙãÔ­B¢ÜèLØ>÷Ê£ìMñ†#ǘl ƒuÊdñÈÆŽd¡{²x1}º˜—P¡"{Œ ŠÎ@¸ô­H²]NÀWß½ðE°Y ލX±#™¤Bë«ÄrC…,TV ž,SGLÄoK%nDb° ›Á$gJN‘"" ×LY‡&(æGÌ^Dj¯÷‡Â>Í'V,œv'ªŠOÒ‘ô3dw0CjËr‰®Ø…LÁ£y$0+¦Špg4k"k‡Ò±N)¸²ÝÔx#˜âþR]–¾UÅK¤ì‹)û” ƒˆ~Å ,j ã—^ÀgVP+¼I˜·S. øNJQNd[â¢ë68¼É… °È ™<Ô¦âK„9&QG)m¢ .×€p§M’?¡û)ƒÆ ㊵O»{°ŠõB)XIá¹›W¢RZ&þÎâÆ!&¬gÈöþ“u×î?`•³ÔÐvKr”òÏOø AO‘½”­áfÊ•E qd—!Z%¸}ŒY•B+nj·8MªÐR¶ žÀ›ÄŠý¤L·ºL¯õ—jF%Šb)\ê)[M‹wGÔï{[®ŽûÀ¾ºÅý27%gd¿2¡Ä{àpÞç•’u‡h™ nQ£ŽRäöl"Nt#±¯‚Š»(^s;±Æ¹O…Â[)Øøë/2Å'&ƒH€]‹üZL©7bjøÍ*ù¦BïõD¾)HÙÃÚ”;Vy{ªØXÅ9¹xwñwÜ[Õ`Ø:5ݺÓœ7 >ž<ÁŒôVî«ßüýé[D{È£vœçœËæ*¼pïÊÍy…sz%¸&­,:³×b®©ö ºÙÖ=Š^[]Pô¾ŒŒl(-™,`îIã7W‡õ(>É*éÈw:ôŽqã!Ü÷Õ :4š×©æfíÕut+Õð ž›/J[ÏG8Ú3zâËΚ£™œ'~U¶bê31·ÎàKn“ÓsþÖŽ-<};Ú9‡/á­ôމJܦTâ6Á¼VSbç4Üò˜à‘7f§ç̽0&Ü".Ê`j‹ø#‚%¡Íaa\‘I³Æl`šïKƪnî,¡—Q {J%åîЄ/eÚ8…/TΙņÈ)$;{ûRÒµZLúÍÆ “ÕÜ“ò*lÊ™íŽÛµî–¨LyÛ-5Nc—(K)`¤ÉVdGõ‡ÅN>x<ŒÊP aúÑ™f­¿7´.·­4haI˜ç E–ùŒˆÙŸè&"KUj"Ý%è—Šþ&dåR8™Òâˆn¤71L^DãÈ“€Â0R&õR´h#%Q|Ïeý…ÀÃ÷ɤ•1¡†¹´wœb¹»éÅa­—5¦\µ@IöN]",˜¬Å iÜ0]‡aÛ0ÔMðm&3}Ê/âõ`Ø6lŽ™ì(¤ÊC×Eà<h ŠŠi”Œ¼!ÿ0„!^iä|hç½áó!è‚=Ä'‡A¹K ¯¸ô¤ î3Ï…ºÅÔ‡éE”:€so8kWò´šQû`$ê´(Äÿ#TA@áSÜ—á/Š•€ÿŽìÉûÐÞ“@¬'BoH>yh±'‹»SFJtjñNÌÜ& ï³%4Wʆ’ÕEùÓöÜ»Â3ÀOà, ÞáX_ÁzsÓ7§ÏÔ߬Ü.¯æâ8N‚°SÅë¿dpD²ÔK§8úe2DÂT$pNd«Qø½Ìh±F)â®M(Ô[ˆ|E$8[!õúë9Àíû؉•ø²¤°£„hßnÐa˜ªÊ;²]ˆ!¹†è›®ÒÁ7½ö€ ׿:“ø íLIq ;]õPÔ1!î´´!|%³W'¸¦ ÏíÞbü¥¹ö,Ï ¦‰g6µ*ÇØVØ‹ÿ0ãmo'Æ‚,4^n4œi³>m_8¿2Guö„Á×Àp§RéT! ƒ$[P›P˜Dld&cz‡)¥ ‡$zu#²JDËRes] âC—Œê’|~d]CJÈ—qEM¬è^SºK•›<ŠJd‹J’ô¨Ýh¶B¢N2`ŠkY–™ËÂPŠªX”²,Š ÑtD¬7÷ä”ËÿnzŽÖG±ßHZ|ÿ­¾óëdª±W¯¬¡¿GC«x¹h·™{UFïÍ^L©Êßé™”n³ã«=›þvlHQ‡Pr·eÙàeäÇÑ&Š¥ÐÖ޶»¹m/À|‚[ºm… <›J«ËeÛÂÓ+þIžÕ%AàQÔG£ô¬º7î‰ß°ŸžJ“f!/xQ÷í °ÒüÆvc%–—VV›§l‰`™ëÔvaf'ÚP3Á‘'›/+ÛDd*÷eådBìf}eJÙIûÃxc  ä“q1ýú ™¢etï¬è˜] ζšPü¹P¤íø{lœöð®ÙóÍM_á¶¢`ÂòŒÁÞfÒp¼šñ½—j‰I4—L(f£z™) Ë™ýÚ¨@Þ½iÂÔG]SŤßRzº(þÌ4KLÈ™Ìd%4¢‡1ƒµ(šzBÙÌ„ÕIÂDõóf¯nðÍ5j‘ânÜßAð|ªê†w|äL®ÃsNIå`„¯,r.¾;¢FJŠh –áJ²ù-LmM‚~#Û»Xs_¿t( ] ¢-R<ð@ŠiûŒ"à Ò@v —1 1I¶›!“3ÆMB]æ’?"£¬ª uF˜È&6‰Jœ åm,å%Á /‰l~[„ý'ø‹*Ã'˜€ÍS*UꈳF¨`Åè´…Q·‡u16´'¥ªZЦ{wYFn5f4L fÑÕVL¾É¦*‹¤.ˆª9¹q6Éø9N½€«­[q§1‡¸¹žò ÛaôØñCe k©ëë@C–]• ^,*¾ ÊKœ Gò %¾QU䄎1†n3£C6ÒµY% E€/>'¬"$¸*j¹‰â{Êн±¸³6’÷•§ye#£ò"ߘ-ˆ¦òa%ò(„sårÜÁ¼ø­nFB2høÄ¡'þ’J5•ZjÍ’3aM¹oŽ&s§<*«¯R¡å¹Uøa] «ë¾±T•D`+’½€Ìû«:̵Û%ýݦ4Y4Ð x­»b ©GAçzNðqìÏÖ3Þ4o1øÓ^Ôÿíáðw0Â@#Ê'x5/€!Bæ@Ùªâe½RÀP²0p=Ê!›GkÐܘSÐÍø§?‰ÌÒ¨!ö†wô^f=ÔsrJ¬?Ï‚@´Ú×o¶Py§ˆ†|Û¹ÎT*ð3’E—^’&¦´`[ö„u¥U»Z¹+‡™2óëfý/Fpr¸©D\¤ŸY›Ýò|ÀuÕ.s¨¼IͲi£‘®¯"¸·¢è‰)PpD—Ù]CÀÛ¥9QˆŠ›—²˜ñ="ÐU‹µa­²ˆÔy0þ¾d,Ь [ûNš«0 :eíRÛÂUHèF&lᛪïî ÌÀ<úÛ>|Ĥ:ÍÛÍ9!ت:µŒ 'ZMžÀ¾°k“i F ÔReÛínd Ï)sU¼‘D-"#ãeƒ ‘=hêq0*+±À‰‚@uõad®¨×²Tè{³(Œ,~~ÖŠ¾þ’pê†ÞÓœ9u0;™àÉÍADc2&,¤@q<œ;plOU®ÓŽ…+ÅßY쾕”CÎÀÅàY˹dVp”S“……Õ1;B±˜;0°%dcÿõ¤IwKºÛ„-Áë‘£ÿö í|˜b þöÉñÌè` •˹'c¿‰zÒQá¾Ó¡w<Ò–j¦¾?š=NºW8ƒ>ùLŒV¡w4|‚Wj>+upÓ÷ÚŒ}T^~£Ñ(Þ‡Õ»6Ò Þ¯± ÇÌ;p÷Ç.3£ßÁ»Ù}üHM‘Ý™ùÔ ÅsÎGëcmÏvÔUT™5Ükí}™­È^{ålæϲgž˜g4šÕèFkOÖ=.Àoî4×åÞZiQ< íŽ'å¦m… rÖH®3oÞG§”÷|³êaá+ÆÛŒ·¯,Ìöìãt¹õþnƒËÂpÒ,¼Né‚‚3í;Á¸·I¢¹}˜iF ö åL(½˜­AåÀŠæ/î:`(šü8…žK‰%ÄÈ$’©\X¢¦:IÌ.œÓønLZá0™Ö¢YÓL…HÝž’‰Ï€B&- ™3\Üš@ŠÉ2R&e5…ùÊX_ ‘8¸ ødϰV µ¬ŒÕT¬¡l}Õ-§”l¨ze±j ¸œÊsT ’ Ãteq`o²9¢¬*•_ܪF…´Çœo‚€ÕaR íñº2ûò¶B_ÌìÜÛ3XÒfÆ7¥^27/ñ’fAºg”.ªa3vgâ`EM¢[FiØ—X¬¹š2>žíƒOÛ6ã¨ë.frÊG¯‹…ÊGÄVÍ8”Þ=û›DöìÙ½“xž¶jd&¢–‹« }5¯Ïw²KTE-Q×Îè4W8¬rZ‹ÊÖ¡<$”/Y°,áŒ<ëR?;Ä›ÈZ¦äœ9ÛÍ}–…Ýö¼ŒZ$õ”6p·'ƒD”-Ù6 Ÿ X¾ä ÓcgwÜռ¸‹1îv‰Ë°1çF0Dæ† Ø8RF…ËD»L ÷P}çÆÞŠ;cÍãÎdº3˜^²•¡—Z?èå>è%ÿýŽÌšØ·HùØR é™þû?‡=¡GïÁ×¥°B¯kg©”9öÚc?ÃÃEñ‰ùs:þ°§ÍŒ¦5Я>ês*ÿT:ÕÓ'¾ŠCÏÔ„(¨P?£ï˜¥àÜܾø•¢¸.¶fìË”*8Yå—ŽŠxæ†otå™e(<|Ç+Í*ié¯êûY‚;ýÜÏxýò;¶Ü endstream endobj 6718 0 obj 6793 endobj 6722 0 obj [397 /XYZ 38.2500000 147.500000 0] endobj 6723 0 obj [397 /XYZ 38.2500000 753.500000 0] endobj 6724 0 obj [397 /XYZ 38.2500000 753.500000 0] endobj 6725 0 obj [397 /XYZ 32.2500000 491.750000 0] endobj 6726 0 obj [397 /XYZ 31.5000000 492.500000 0] endobj 6727 0 obj [397 /XYZ 38.2500000 458 0] endobj 6728 0 obj [397 /XYZ 38.2500000 147.500000 0] endobj 6729 0 obj [397 /XYZ 38.2500000 458 0] endobj 6721 0 obj << /Type /Page /Parent 2 0 R /Contents 6730 0 R /Resources 6732 0 R /Annots 6733 0 R /MediaBox [0 0 595 842] >> endobj 6732 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F1409 1409 0 R /F1700 1700 0 R >> /XObject << >> >> endobj 6733 0 obj [ ] endobj 6730 0 obj << /Length 6731 0 R /Filter /FlateDecode >> stream xœí]Mä8r½×¯Èó›#’ú Ã@wW· 4¦ ŒY¯ ÏÂí=øï[™IeV’zLñU’²Ô™ªN¥(Š Æç‹ˆ_þé×ÿ8ü×ß¿|ùõ¿¹Ÿ_~}©Ž]S]þNÿøömî÷Cg›Ão¿¿ü<ü|ùþò}øÿÏ—Ë ¿~ù—á·ÿ;èÃ?ÿýõðoÿ>|ø'÷¥Ó~éT7üüïóϾSÃoÕõçéó¿¼üë;8>ÎMæþß4¶©mwšÆƒGÿ|_Sÿþý·¿½ürY€´§t]ÕwõAÕfø__ëÃÿþçËŸ‡ŒÃWGÛê®nªÞÂßɇwúôtÛó×ý°^Mðìó_™ÑU†Áûb² ~ž¹ô¢(ÓªèàG[e:ÝÔÃï}[wUc­~ïŒûó®·Ru7.Ù0’ø¢½>ÃàmÕåü§Í0@¾Ý¾ŽžcCê&Ÿ>w™y®Ý†ƒçÞífjYv»É)2›6Ÿw™y®Ý†ƒKrí®Éèv¹žcñmN®}žy&· \rg핇šÐ XýŒ,ÚT:£´?Ï\|Uƽ Fÿž2 žÊåàþ¹ñó—_¾ ËÙ~üy˜Ùù—?~©‡ F]¥ºÃ?þ¡ªL÷‡}é]Û´ :ï|E÷ç+öhûêþJ¥á•/ç+õ±6_ûíÊ×ó•æh´U3GSê|E™ñ¦Û<ƒæ|Å›ºµÝÝ•>§&Þ¿^ƒ¦-¼V£+‘ës™óàà«x•ŒÿU8éÈÔà²á-Ì>˜^}žÿ¢˜–ÙQâ,*C¼Þ„`Añ”‚µHXÙÓ@˜ áu„Ĭ,$s†sá]¹¼ú׃<Ê$JºÞ“%•[©êØvêô ·Ù\èW5Ǫ7÷ïö nÑåô)=^º^1¯ˆJ#ë‰3â¸G$f}XbÉIÛ\¨R©‘n£Uh4ƒ¯¨ù'¿Æ§ùb€Ù§€‹ÈÊ’ùLJAk™Ãõ1oï·ŠÌ `†ŒV‰aؘ.ðƒ\g¾¶ƒ>ÐVŽÏÈ+"óÙ)â&`wðJ„›tÒ©k¸ëXœ½Üß³üÁ"„p~Q«†Eóem!]±úoð|½9r†°B†Õ.Ys «3pñ#|‹rFZáYc… n¥êћֆЭ™3HF[Õ£d L)Ú oÈš›9Í ç¡2­¨©Æ¸’‡&QÃbåøHaêÁkßÇ'èºÖ¡ DÜ‚"Z«€nñ¢bë±”'’!lqb¡‡¹á!¡¸øG1JI÷ø¸ãÄ,`º)þ†;ʪ¢Ç(2¬Š`»K/Fç.´nÂÆË|ŸD„¾1Mð|g@mk=DY z8^8<%)–‰óRÄ¿˜Ûç]Û?Jú›÷A„NFZFf?ßCœYä2~²ˆÂÅx8W,•Ÿä€1¯A pÞæÈé UuëIºˆC† ÄÎ?çÎ~x[{Pý¤]éÞµ»Jõk¸ã‚× „ÑÔ•Îm—öA>îÒîùïéÑ=æËh \Œoî¹ED¼Ð°;EiW œ5¼GÃ+ø}Fß°}ÃêQݱ×Þ87DZT=¢°fÌÀúÚ£9À·W.kÝM@¿Ÿá›^´jG¢Ÿ³ŸàžB5˜và=N¾O;ÖðMñsðºtàŒß‰ý‰Pü×tºvkß#;ðÝûŸ’L„g<·‚b ¨Š£ËÊ …dö–ppFÔlà+ŒïÞ·h(dP! wáõë²9&³Jó¡î{_œÍ÷y• ïSa÷BèËP-[eÂL”o˜ÁQÂçÞ÷_Éú8D|Q‘Aö8Ø@øQq i£ñH†‘Ò˜h|©ü¡õç,d”Y½5¾Ì"^:"¼0ƒ›ˆEŠ'kGð„Q_"šïb‰; ùU ¡OP‡ÝüÅ©¿ÞŽÇœtGœö\eHÕæ”FyøýúïúhmuhÛÓáßîÓöÐ6·ê~—O~{ië£R½¶V]¿eîF1oŸ1|ßý[Ÿn;øw«àêt7“á[ön{ÿŒ¿¼|þC&–aÓ¦îGJl‘BGiðŒ¹†ùž¬òBĦ" ‚1§ PX¨Ja‰ˆ+%•K'”LQd¤pÄ⬯TĬƒj¡îæ›h J±†bþ®Sq¾„´eY…!ú0¡_ɯ˜6Mã‰Y=½ÖY7ïmøö}ªI«ïU“ÖL©&mã« Ã'jrú–¹ż}ÆU5iÕ”jÒVÁ3ªP59}ËÞbïŸQ@5ù-BNCeÆb)‚yhvf1àãò¾@ÆÓϰ±ÚmËÌJQ14 “ÉYªÄv%aÂX|Eq¢Š0^ø{B3£]– 娔ÍiƒùÕ”!Õy‚m1\Z)r]3<32k¢â5ƒåë=1â ;/ˆª'ëÍu[^3;G¡EV Þ& 8Ht±R="ewÊêú9Ã\}í ÐÕ”$xkUW¸¾‡n¼7wÊOŒïŽç‹²³Ï'¤Ò—J³`b¥Ñb5C˜@) \B²7mÂSº6×l Þ\¶i_NRÝù’nÓ”F…)7¶SŠÏÔ£ÙßF*âÍ®+¹X­ýi&¥j-DrËUì­îí­§ì]û6ÂðI`‡œ¾eîF1oŸqµCt5e‡œ>¹ÆðI`‡Ü,q{ÿŒvˆ,áž8¥^Šw2¨C'Zü«X& £gÜ8¯Š™ãâ¬IÖFb„ ÷M]ݳÍZM±ÍÚø,mø$`›§o™»QÌÛg\Ù¦é§Ø¦±þ3†O¶yú–½ÅÞ?£Û¬¯å‰×Ï63cyµõ–Äqƒ4dD 8n=…€ÀXŒs€WôgtÅ`|ˆìÜà "£A䈸ºJ_<7-œz¼'²Ûp®A£%WGÁѦk8¦ª Ïï:Â"¼¢ÛÄ)1Q„Ý5­òØÝ6‰,ÂðvÁÑ*ÈLvXWÛuÞŽ|e¿éò~Š”l¶w¸Œ¤dÍïû¸fCÓãÚv|eJÞR¯=&Q5Š”%ˆ”¥b-Ÿa˜A1]L¯ ¸iťШ’u…jñˆT$£°`˜%0I­NòQþ«€ó¤õœ'í¤ó¤ œ'í„ó¤½:OÚ;çIë9OšIçI8Oš çIsuž4wΓ¶ ó¤Ý'#_'í{¬‰Ý _·­µôÕ¢yêµ+Tt;e»…XÅ $½i#ú Óé6?ç]¬xÕ‡·0ô0ëéavR³f'ô0{ÕÃìf==¬›Ôú@ë&ô°îª‡uwz˜-¨‡Ù‘ô#u6´mxšwèÔûxø¶s§Xp‰ ¼-²·TÁzÇŒ'ô¬½é¬'‰"¥…0jK´³º—³lWÙ¤»ˆ½æzÛOx¢˜J‹+nÞ%+YEš¾âudxíüÚTêF©ÚýP%Ç蚎05çÿÙEÓüÚœo$í,‚ëLM„ë(—V±™”nYqPs«TçÉ„J!L¨]$?¿±l e+š©ß‚•'‰:“2=çW\ã#¢<ÚÁüÅ7MÕ@Ì š°X`V›¡ðBT´–ø®ŒõÁ„cO(T’¨"г¥T‡¨«J8èä¸I 秊W)WÜ®bî*æÄ? ºä ®vÚŽOªe†¡¾CõIS^qíI¢æCóˆvåbÊE©ÈÜs€•©ºŽL°0ÁuÏœ w²tX9+¸Þu¾‰K©E¨RX ÇÏ‘éêÄœÐùN¦C#|k¶«e‹D–ªã!VY\gèm‹â«€ƒM×»ô ­»üJcº;H¥1vRij¿äêéRyþ–¹ż}Æ©4¦€Tã—Ž=}âC*Ïß²w£Øûgä‡TšÚŒ m‡T®ï±C*ß'ÉwHeTÛ!•IËõÑ •SkÐÊ Ü…°-B~Ÿ¯ÑžÜñ’O,?qIu†cV¦°…õဌLßUS$c‹ËàV®¹!åY,›š¦ç–꣹ÖB-¾%JJÂ/'Ñtç OøxaÈnàWÇcìèå ‘Œn̘Š7ð%V½ä‘ǫէéûµ˜Ó‘,ÄÞEVS) û ¯SñIñîüS°§Ä§òœˆµMØ]"]}7­Ø­Id3ôîPÚ!fFž¬9öA^ÃYgö<ã”nƺBf¶jí5 ˜QŽvuãÉуþeY[ÒZdM„%JxFD&ׯPßÁ½Á „r‚^…¤5dEBT®º ³®Ÿ‰Ë1ÁŠ)¥'nÚÂJso³ÞñÆ,ÓGO¤®Y1OQªV¬d¿ƒJ ¸ê¬‰k)á%,Ù)…ˆ¨¥Š¿<JùYøK!É%Ôíë{ nßLuûÎÑŸ@ÝÓ·ÌÝ(æí3®@ÝÞLu{¿%§n•GÅúˆ` `2Yq( ŸkYÔh!íP¶ >ejÈ–À\Ÿg C[®„œH ã[ËË}ejý•WðjÊ~•:q‹¥ää(L‘Ql¶­õ§„¢Î¢eAu‘Žín|Õâ‹CçÙÜí?ì­ÝÀ~é‘þâDu7ƒœÈý^O¯Çß*eµ2ö¬l¹" Om„‘ù ”ß[á à|Ï×q8/WD$ŬÍoªk3¢G¢›VæD–åM¹R _„Ka(NuüZBy¸PaSÙ{ž5%¹kx…Ѿ¥ë(ž¼‚5¬×8›­KŽÓxfì£î¶£&ícW^áYcªø ¯¼Â+F’–Ýû”¡Š¶yÇé6ðžÈ*‰¬±[ø ©‚ác ¯À3p’*í4=šAJ²õãÓÏ=~»Ç…k…÷±†kšôõ¬<¦>ÙYô¿M®ˆå«ìÎ1+Š÷§Á» éÚ–?æØšþž$’pj ÀÙ‚ÕŲ‚E‹kE¼·¸XËbYLª0º'Á|…­&[,=]Ö- o˜åbxŠhNÌ“´x Èš áÉòä3jk=áX*ôWJ®-ó8w@ÙD1´ºD¶V3ƒAÃ)Š‹“S§’y`õ5Œ’ÅåÑœ”~ºêˆš,J‘ˆîD:-t ·½¾ßû$·,6Œ*lðcã;Gðܰi†ŸC8#´‚ÏuM8kM¸ö>–s¼Scµ™5»4áÑFjíáÔÜp*^yYÂîêLøveiµ—0ÑÂ+—h. ÿf9ðh=¼ç²„ª>úñ}§­L\©ˆçŒ•ºP¼¿¢ç¸j¡WÜÁššÁåžîØ[ïŠWÆ”‰7Å£Yô>®ÑÔZÃ{t7Î`xévÞ•ÈZ;­µ§í þ‰us‡lj­á'v§Þ´‚£UÙ­’‹ÇÎ^û‹bĄטŸ¨•²¢íL"ËFTÑYs""…ÏÃÆJ†aK±”gÎÀŒ:žñ_)à¬ê•'(—Ð}[´ù]1yðáBËs‘½JA~ð¢„:@õ Ỹ<”ŸÂ ðâ0®ÿ­´5±ÖU?Ù¨½Œö*0¾œÂ·wFk}âJç–EÖ ßó ÞÓ£{F lŽ—} yÕ@›s•ü'®¼ûþ=-šAßÔ)ò[ƒ}uõÀ2Ö 3(+VòúþNÅ\½eÄØDŒrÂÎ?ì”îÄGȨœ‰¶õÖc[±o,[“Ó;fñj&«=x&µ&o_¨½ß)ç x®ð}NéÕYϬ¹õÕ®м&Ì­‡±…H¤‚áì¾i·£¤á½q`x-xï캲®®ÞÂPµ´´`‰úJ!¿M­,'“Zs!#ª¬š¬ïL´àßÒŠIRÀbyõayý·D‘–ˆx­òðò²†l¬/²kÜM¥„ ÇÉœàÁ4VLpÿŠrõúLDJc=i»´½Å‚ xª š ­Xp®¹‘lBù`Ê>X¯E.«12ô÷Ž\ÒÅÔߪ9 ‹cŒ‘ò†›¤+f[ Rî=)T+b ¥<¥ª#cøA1 §7{Õ 3C¡¨”;”¼æÊ•7É;V+ãqq9Ånc½ýeŽHDÙ`i>‹¦ò© ½8bƒˆÁŠÆQtu­ôlq\å%R厹‚½`¸N Þ3\‰˜A$5ûá¯^©ê8Z] 0]ÜC‰ª Â¸KiBÍ€Ñàe+š2½^dWåKµºÙ-ÕçÑ6—¼ïÝ‚¨’é=A©±FAÔ„ŒèhDÍYÝÖl«Î[F”Pålo µæzG+È…z’^„Èײýµ„}LõܲŠÉ úC‰ž0Ù(¿$v5oøFù¼{Åê9„Ã'T¶Räb­*6)Q ·“N K-Ï©#'Š9Y¾)n1ËZLÕž½¦L,¥,ÝÕˆ™wðŠýho77*ý–µâµò—qq›Œd¥»Þg[BtæÎ‚ÝË£¹öò(IÄ[*s¡»EÞ”/[•3OÀ¼oK,‹®—°W÷B]R¡B&ù¤”ë™0#@¡Èô.–w±œO,Lê×Z™í5;m£!—•nÇ.¼Ë{Œ) v~³¸b}Ädµ°ô¡K¼–WçÞ»1Ù wVx…äƒ#LYùS Ô·‹Œ­Kõ{|Äs³¶b3>íf.…•7¯7A§œ"e…¶Ûè†a"ÏøÚÓ¸þ[a½ÛrB ÛÞ›xgvþicpKq'ÞØÓkE0ù%p£7T_7­IZ33¿1iºîòMS¬æžlW|¥Tüâ®ÒmA°DÝ)ï~ìœ ãrHnë±£è…PôÛ„Ê–TLê[Õ¬0Â_´Om¤(fðJ©þ±`k{¼El‘ÕÙrYê©{p'ãBm_tmÇJå%—|d 0Ì_TÝ]²¹¸Â­¾À…H7]¾¸ŽÌWtêåŽ~RgnDÁ ÂzŒå—à+ÆÃã+y³Ù)%>ü¢åÝ©rLÏ]±?'ØTY_œ-^ö~/õ&Á{`@Èã¸=o›uuïo,&b–B› ØŒ£L²õGG2Šƒ^â`“¬ü‚³·¸×eÙë²ä÷(Sù5”ŠÓ³¥tñ7õ•ìwïp9ïð.†?^û¿uúY›¾É; dKG¯¸’Ó%ñâ' ëà>³ë¢ù”ÈÏ‹ÍíÎÝd³fª(SÂ^´Þ•Á¸èJíöóÞdõÚÖžpü8æâ6ýŸË'G­ x»=ßeW÷¾º~Ã$#ã±ÃÇãÙë2]¯Ô5œ=_iæ9Ro|‰ñ>|€ƒt­u;ç$mÊCЧí˜ÛØûÔM:#ˆì\æHÁð‰b¾—©‚K%Âàј‚M¢^€ÈsJe&µWD6Öé‹e •ÆY­¸éÎnùÄfÀÄÅ(¯æâ®Ê-6Á™å*U&dq[\Fn‹Â°¯&S$«‡ëlnÚ4µ'Í…ÑL8RðÊÀß¶d0J8e Ï/Ò$û‚”ª¸ƒZƒÔ‰K®8v•»Î[‚Œ"¸MG|GÛ”¬¾ª¿É ¦¼pÆ;ß³ÙNQŽ#\N«6˜1EÝ Á‘….V¬¸nÝ”*‘°€ˆý´Ãú!—3Zy\N—xîè¤j®Nª¬¸l(£iýÉ/bÛ€ VìÚßS4Ÿ>ES(+O¤Ü)iŽPÎ]RÅ;Æ 9þ¢ŠÜFñØ š¦­ du)g¸DÙmõQ™ï®„¼îÍ'Å’DZ%Kå §Èæ 2‡‡a3„Ë‚Á/Øôg¸²ÄÉ‹´bÕ•—‡ð2‡$%µhhl*Wøÿ&53Ç#Çaþ }ÒXï’ý ®"ɲÕO–ªuúZ?VïV]UÇæâëñÏÔ•ÎíÃ@ÁÞ*àÑð=¯ðžÝãìŒÓyñ“C^Ñ•±ôÿÄ=_Ð Ü®¶G£´Ç¹ šÛ˜„’2U*ýµ3þ4Ã\™5Ù)ÊTü–€ú˨ገ5~K9û˜,=J/–PâÃæ¬Ù™ô$¶ú­ÇXJp}Y> ìМNȵˆk]$[k¯½T.FAˆ¾§ï´[(Oµ›>V{Á™ù¹­.Eñ¶†%Û t¶µŽõ£ ž­ôQ‘¶×\¸Ä˜ÂË4±òx‡áúj\þ ÎÀà•/õ¦p4ƒ6”²ámùN_7§Šo&éeãd»Ìö¨CµµOëç”I2[g?aºQÞ¾•ÙÃßÃÏað賿?úÂŒÉÙé¦ÏæX©“ÙyУlwÿÔù¸¬U7A¦_õÙF¥~^qžw}l}©VPß~EÏ1bUSsûæÞYÞ8nWûŒ{.ÚðÝ©ÆalðM¼†Â£Á{/RI¯ÞÝÈ–%¸ÓïÌdžkÇ “€×ûòyȰ ™öƒH ÓÁW”G„ø,EHntd´Wôs|Ïg7çZ˜s/±³"&Ž> º™ð•Èч÷­Ï®2GÇvç!_[¿‰ >”-ßß_þe| endstream endobj 6731 0 obj 7224 endobj 6735 0 obj [398 /XYZ 38.2500000 666.500000 0] endobj 6736 0 obj [398 /XYZ 38.2500000 297.500000 0] endobj 6737 0 obj [398 /XYZ 38.2500000 128.750000 0] endobj 6738 0 obj [398 /XYZ 38.2500000 666.500000 0] endobj 6739 0 obj [398 /XYZ 38.2500000 297.500000 0] endobj 6740 0 obj [398 /XYZ 38.2500000 128.750000 0] endobj 6734 0 obj << /Type /Page /Parent 2 0 R /Contents 6741 0 R /Resources 6743 0 R /Annots 6744 0 R /MediaBox [0 0 595 842] >> endobj 6743 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F1700 1700 0 R /F1499 1499 0 R /F8 8 0 R >> /XObject << >> >> endobj 6744 0 obj [ ] endobj 6741 0 obj << /Length 6742 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯ès·Å‡D ¬=v€ l ‡ ‡À›M°È.2ÙCþ~Ô-ª{†ÒGIŸ‹l©»×صwhÉb½X/¾ÿã—¿ïÿùÛþýÇ/ÿÙó¿ü²+®,ºöÇ_ï^ÿ@×ÿ罫Ëý·_v/û—Ýóî¹ýïË®ûàËÇ?·úß^ïÿÔþûóþ¯kø£ÿKÇ¿ðËÎ)×þþïÓïS퟊óïÇŸÿk÷—ßí=Bì§ó‹yûÿïL]Ù²>.cbê—]¿MuúõÛ·_wï;,›Å9ݨj¯¬±{ÕX½ÿï?v?µôà‹Cc•r•uÅ÷Läôq¦º©÷J7-$3œèôK¼ðVÐ¥~Z¹8VúÇÐÅ·-L‘P7¿Ÿ¸ªt:à§•§ÒÍè’‡«ëäR è>p[%~Z¹8VúÃÅЋj{1h’psJ{©=ïtz [y2nÆÐ%¹Ùõâ®5bä1äR ÓÚ¤³â»•K#¥?Úøó x%ÝO€cç%òᇯ»÷Ÿ•mÍÀ–æ¾þÔ®í4g÷Û×%åþÝÑ›Óê—¯?îß.©ùÃþëÏ»æPé²_b7¢j4Rhø…# ´OhDõá¿ÉµSÍàoàˆéðöékKZÉ©Â6Ó»ƒ#ü³ìž#Æ/†¦á9â‘4¸6ÂyN«½ñ}Çi}„ßT˹AcîÆó0çXBÌ71_»»Ã¼0?º-j¼S q¡XŒk<’ÊMQTý¬OR³¢)mÑMÙUþxÔiJU*§jWÔŒ*EcŽ1ºËȧ{°¦‹Ý]F:ÒQº ™dä¤JJ[½]Aw¤¦È¢¼/êCÝ'J‰wlÄßtìSŒ®Õ›…¿±×ø¼SæO!¦_öœÀU{A1ö <%§ì] vœ3t{íe1Ô‚#nÂo/䯄̮Ý`Kð”1¯E(CcÎ_g8e£Yª—Æ#¢Qýž%>örψ 3!ÃÒL{ižM3É0ÅËSc#X¦Oɳ”ªÔºSÕS’ó 3ž`kˆRFZòé)21¦'(õçÙKŠÏ`_Oì§|è1¶õf—øº ²ž­§±Áz |E˜r4äÁœ1oµù¢ë¡×ЈsíiùåŒqÈá«QA¸k"#ðÚFÍ£®J¿Ú4Y`2õ—¨‘‘{Ê0²FÁ+(à<%&L ðœÈ’y×&£°(õ¤OcûŸüÍ"ÏœšÆöCàÅ<×øì7,ðÎd¡7) l÷Īq˜ ºc5Ü‚«öÖZÆo¦ Ø*©õÔ{ÕŒÒ[w9=^5=r>÷wô²[ÎÕé¡<èª .óMƒ¾ñ÷(¥‡ž ©ŽÜÜÁ ®@® Cë4üÑé8w½6V;õ’kl¼ê}ãeôØ~hºHî"èœMºîˆ^žøº ö©ãoz‰jBo;a¼à‘û2ü» °K‚òÝ®Ôt¿G ZdƒŒ»jà`|øxƒ„³"—!âžA{}#ƒ·Ž¡aw<>dìw‚lªkøÍ/; ¤ ã+ű=ºšXØ*N¨ßJå¡'| Eó&©¿zˆÃâ($! ¨€6q>‘Èè™ðI.ªšo´D2Dƒ1Â*""6ëmVÆJÂaÒm@š%Ô¾ª¥ð~9?pJÉGlèAhêiù<¶w“¹BÖŠÀlfxD$4"†?£îÍzå0cöQ9|XKY„Ìí$‚ë«gRR9\L~!d5L•æ¬ ‘D*—Š6á4EྌÙ>˜¥dFó& „9öšJÕØðd6æŠü¢9ó¢L bQªD¤ÀÆç⤜úÁ”1%z¸œ—ƈ™àPe.8‚ŒãÄÄ Œ7¢œ¦˜JŠˆã8>NïˆDë§2ÇæÁ4ŠçÁÑzŒk-²S‚B¼Ë#Ó\_zjð 㬠œ„„30Ÿ‰rþFcúÇô‚q€S•¦ö“ç„›³7žÉäH–•Zå¦i‘ÑT¢ÐZÄûÉXfn¬©¦¹F–Ÿdm¢à5Wó[ÓA«(ø6¶,ïŽb±æÄÚëTYªˆ¬šÉÌ\1ýã¬Æ¬ôïúÊ—ˆ+Ÿ±žæ\ßrU[bÂVÚÞä1„S)âˆbJȰó ¯`P\Æ„ÖVð6¡G±±#ɨÙèºy—xNXU¨·‹5F–:ÁËzÖ^'XéšîQ6sou‚²¸Ÿ:Ám嬬Lï¢Ûn`UÖÓØ~¼{«¼Å6žYbG¼øˆ1™cÆÇЈZ¼(ô-^5Ž’ŠEôg%çÞ2WžY›jú¢06‚==…g²¸5QqÌmR*ŒkYQHØÙã ÂhøÂŸÑéT9½|÷ŽÊœêÀ;M‹u‰˜&ÛU²x¨ƒM¨ƒ<¢4“D]7™©‹ú-B—ånã€Â €³tqQö‰ö"eû52ñŠÈˆlíhÃÙ[Iwé^0¿>?Rç‚kc˜x"ØÆÔ;% ×oUNUk,(°ÁÛ,³tK©ªš®Z±Ü¤ØoRDDŠOˆÚûGͧl‹‡,¶f]=Z;¾õÌÅït»Ó Y<.¦›¸˜&÷SL˜Ìùàoˆr/#Ö‚r†À¬ÏXÄì÷31p:.!˜## ×2iÙ8Užx¯.B/¢%;xžÈ[WDÙ^äí. ã +A¢À…jq+ºê`ÙIPU¤”(„Œh0Ù=Þ†\Á5Q:Ã$ûG$ÅåzÓ¬óÌ+«”‘N˜ÈŒ¹KàAh%¶…î¦<ÛeÆRÎFÕž™Ï3é/;Wîˆ^¨¸·îœÄ2´ÞR < ˜ÓŠ.mBV‘µ¸'­¦ O?^öFµ#úý%æ’GWrF(§Ô7ª #O¤úBØeÖ„’sA¹áh:&~ãˤÇÚbYATZ2¡—È<쨖֢Å#ïVBO¦ŠV³+l‡½ÑHÿ ¬ËˆYÕÎ$ó¬2Mà ÝÕÓä’¯ã×IÛ^{±ÁÄé×—hGa›¿ƒƒ žû3E–(è[·;W˜—øÁqª'îüG¶#K¼Mž¹ïJZo‰­š€ˆFb´p$Ò@GŸRøåS¾¤TVv)G!ójØ‚¼QlJä>²·—5h‹ª·†ïNŒAË×+εþÌ?º§NáW»KÝO/ÊH]õÈ p7AÖ%Òmð~rò°Ò3h>_µUæ{ºƒß‡džð”¨æÜÂÚ&«5ò÷poJ=åÓ2U`÷þlü%¯ ã'å°ïiàíXà>õacàˆL$GäoÓ%•yqkµ9I5† ‚k&seÄ»óÔ£H‘|óË…åLÆÇ×bЧ ÓZåâ®ÍÊ6¦ä¢yõ^5£ia—Q›ó3 TqèLÔW¨©àˆóv†íÚ4øMdžÎÓ1Š2‡.ÕäÕ7þÙLu(ƒ§6=Û4hÞaWŒÒ£&ÈØ7x -×åD_b×Oçe ¿IŠ¿éùÕ„¯•â‘A%êg {’2Dòö[þ‘4¹ù¢XT¦ sMºÞ ®cÌ]Hq`,lïØœ#XB6;q­ñihujè7añEdmQÐb¤ž+Y_.&•s,š‹6­¢ EÂçtwºƒÉ~’LãI{o®:nŒ_Œ‹D[‰×Ž'£º %zS¸ðÆ"šË¹=Ý!ž¦,da§Kæ·EŽšÉ':SFg «gSÜ­†g)XLÁ2Ú½EÄšUÆ¢d[Ào˜~:Ø Œ/gºèݶl¾·™¬±ÕÒ îú;g)¬êÃzCÃôχiúi\˜¯»Ž5õt`hÓ6Ê¢Îö\9~u‡À¦ù;9bmX’®âQfk‹·ª¥RD3íô‘¾Û0ooE‚÷ø´‰Þ¥Lg¾…àS€ó`ìd•OVm€7si:üö­ÅüŒe§(7áHM7‘`ÏÒá×Ú™¶Ì78K‹ª¹ÏÕÓcƒE£cOËGç,“-Àä+P‡|õm0b2Ãl³¤Ù‹,OÏGP)̢ЄYM„û7¼ËP”»^[¡ËTï=ÂI™-ã+¶´}™žò ¤}¢±Áz"=÷§úëæÁ\u~èñ ÷T4¾-nö –Wdy~^EK|QÁÈ"%òÄœ§Ä¨ßäc3¥X{ç¢îÃ~L~중Ëí˜ÞCUTÓØ~¼ÈvlXà]Èb›b@ãÂ&8b°w*£Pi'ïWzÑò‰B©ª^O¡”ﲬPÊ—CéaS^\(e 4¢´©€;õÏ•¹ƒ\Vr¹<>wGï{úUaE™çƒ…aS$c$‘,#¸êˆ£{ݰCñl1éÎØëvµ>ÍL—N|”L ãò”è ºêAˆ®Á)7ó|róoÿ-+æÀi–¢©™ëÁãP•ué ×ZB¹çms(÷«HúƵ 4Þ£ÕÄí¿¸#‘i%ÌÖToC¬X_º_ŠÀ"ů^g›xº¹º„{EÈlÀiLí8nJÄôùÁ¶l¹œ0õóœ\©ŸÇWBq_ó £ã‹r„’ ÛöV/'ú%õ=ƒGŒAˆ%)Ü1¼Œ;® b¢Ài¢þXr3&qpTùòà ¸13 ƒ‡ÏjQNbô—l#“«6~ƒÅ³Ê…è¾Ö|¹²$Wxy¤&˜Ò$4MÎ:X×ôÁ\í‰â€8Sí++q\ 'jàØ ±<‚Ãæ8œ³Ò¡VçÚA\3ÀT¡âjWÆ'*WW}ÂWçá΢Øö×þ¥%Í(å>Oý…z³#kÓÞ9 u Œîõ¹°‚Öt·n7"ª;i£º ðS Gü³úP…YŸ2¦óžÐ&=Ø gÃ1ðn¬Ù†ÂÐà7^ëªE[w²e îøçâü®‰†¸cHCÃ$`z|w?køÚ´lƒH ÓÁ#* BÌK€ö„¶a°Àß|ð+dàŒb¯CGØ 3ˆ‚<aȼ¯SYÖq…9x±;‡ ܶyuûÔ-ÏûçÝÿ/3Šè endstream endobj 6742 0 obj 4057 endobj 6746 0 obj [399 /XYZ 38.2500000 133.250000 0] endobj 6747 0 obj [399 /XYZ 38.2500000 723.500000 0] endobj 6748 0 obj [399 /XYZ 38.2500000 723.500000 0] endobj 6749 0 obj [399 /XYZ 38.2500000 133.250000 0] endobj 6750 0 obj << /Type /Annot /Subtype /Link /Rect [307.500000 314.750000 362.250000 321.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_memberin_typemap >> endobj 6745 0 obj << /Type /Page /Parent 2 0 R /Contents 6751 0 R /Resources 6753 0 R /Annots 6754 0 R /MediaBox [0 0 595 842] >> endobj 6753 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1700 1700 0 R /F1409 1409 0 R /F1499 1499 0 R /F8 8 0 R >> /XObject << >> >> endobj 6754 0 obj [ 6750 0 R ] endobj 6751 0 obj << /Length 6752 0 R /Filter /FlateDecode >> stream xœí][Û¸~÷¯ðsuÄ›(Ed&)ЇAôaч"Ûm±Ø,:݇þýÊe)}”t|HQgÌÄ‘Ôá¹ßøîÏ_þ±ÿ×ïûwO_þ³ÿæ¿?}ÙUkªîÏþøõÃëdsð?ïmcöß¾ï^ö/»Ï»Ïí¿/»î/Omúß^îÿÒþýeÿãßÛò¿tü…ï;+lûý×ÓwgEûSuþ~üüß»¿ýaÿÛqÆ~9¿™ëÿÿ «¥;ncbé—]ÿšâôõû·ßvï:,[ÅZݘf/´Ò{á´Üÿ÷Ÿ»ŸÛúé«C£•PVÝþìjm+Ó4²ýÙ*ÿ‡º¸•§ÕÚ éÚÔƒµO_<³‹“»ºI7ùiçÜ@ªÑÉN a§| ZÞÀTÎuàq†>—Ù߈„hÓíœ(þdñä‰éØH]w “•K´óô)ND·@I6ùiçìPéÏÏÎIʦ €Ú¿ü ºLŸ`r«DºÉO;g‡J¸xvÎÃmT“OŸgO~§"Îiç©ø4œœód]£žìyöÀ¯+›mŽ;Ou²prÆ“­Ek¬tà±) ™>ÁäÊ$œü´sv¨ø³ÌÎy¸º²)÷2}‚ÉM8ùiçÉÏÎy¸µóꈬS€è<}ŠÉI8ùiçìPéw0ûç%³à­tŸ?ÍKäÁ_wï>µ¶Z½ÿús»³Ó‚Ý·¯ßwºýÏÑL·jÿõ§ý«JÛ?í¿þ²s‡–ÂjiNûëFªú4ÒW#O#æ d#®GžN#ú Uç »Œh4"\ÇœFÔÁ躱W#M÷Ìœ…Uð«BÂõ³Â_Õ ®Ç ‚n¿¶huFÛN;Ž¢VVT¾ÆŠ'8âÐl ¿øG¸ƒfêü†#R"Œ•š Àˆädk&Ð…(":¸ Õot*’Ð ž¢Ðç;v"˜v-*ß±óioO‚™×‚Íb(Q6²ÂÈñà÷‚¨#›å<ñ˜'$YmuH²”Ó„‡;Å1 EƒvG”˜O0XPŽ•”ú€Oá}ª£)!zHÎàc ÌþP¯Á‡½@ã ?ÐÙ]!z³æDnNÖ׃;œ¶;ÂJFFT GœíŽ|„#poþÆv álpDÂ]GF ë:¾)›Ö$´ÃŠ“ ÐÂ“ÔØ†àáã‘ Kc„ÏÈ÷ð™Ë‘™1+¸7 ×Á#•ð:•…烑Œõ´%„›ü”‘ÅiÓïÂJA¬ˆ@CQÂŒåv¥ñÈ'8‚ß3YL3ð}ð3 3LLµx„Âd1Üà™âÙãî .Ð:MËD•³ÂvVDfSò ðiÍ”Qf™rMJ<Ìlñ¹j Yƹ/»*Ÿ¹ÀÐì…µ=äµè—üÔËý.¨5Fc#Ös.FÂ"³Ág$^Ç¡g|ÔEȶâÕûú „ €Ûá˜=¨Á =Ÿiß);Â/Fö†×Á³EváæÕû ª uÃX¡zÙ4~¦·”hÆHDÌ÷ûG|¡8n2ŸVyÂ%®ƒõ!Š_k.†UXâ}³nçÊ"%Á)¬öSt6  ¨uAØn°¬YEÇ«5%:F6Ôñ^±1 BDóúÒ2K?O?û½ymãÕl”À–)¼û€þákð†)¼>²·¯<ÈzÇà"^IàåI¬áð\‰¹<©š¬R?ƒÕ"!qÞI—)ÝÀÆ…Ö>ˆ÷!€gÑÒ1¥®Ÿ¬É’¯ºÅ¢p¾ZK2x3ðya2„úAÆL#”¼F—1' â´ C›{Vq€†6L.ˆð ; ¤^à]{×Nž6bŠx¦[`ˆà³Ç¡ã †ö#)8HŽ!“7"³á 6ïãŒs´çU!ÎóígÂ*¥¹>. o¾x{xó–M’#Â&<®¾BRøsÒº ¼õê^Ïmº2×óEßi‰ÅõªF8”nt@«éë¶´ ל$ÏÄÙd•Â3f«ľnQx¤ Áó>9T¸ffŸsbÚÙáLòôçBMñ½)è{#9Z¸ñïŠßßXiM(¨$ùq“k‘¶9@Ä÷6YHe¸Ø>›*Ú.)@½Ï(©D™Â PÜ“Væ² ~SÌf0£+Ϻ`±ì)AOR˜#±}¸b­§‘çP’Ä>ÄU†½– má2"èÇàS~f@Î5ýNU²*YÙ› g´ÀhŠë3 â``%R! ×1ô›¬¹õï“…Y(a¯õ¦p wçyõh pÃÃU¡fx´ÀeÑZ‰$â‹a€3pñ?Žc”Åú"Žzã]gÔÜŽýIýN)Åÿðì±8‚Iû0e¢ý”VÅD¹f¦ÿÈ3XÂÙpñ„£°•øÏ &«jÁMj$PmùjÁ-"jdd–ÀªJD?§fíÔ$2æ(©žÞ©òAì7;Ƹ û-n ö<¬ú|Nì}ÂàÆ´ds&Läêæl…{/þHS\Ó†=ÿøÖñMEºXzÏPz´à Ä‡pa|n„êJ¼3[AŽöá06kiAâ&ƼÁfÞzµH†/!ü  áÐ|ÁñÚM•Î%©­Lší%CQ˜«AHq]øšúÄÒ>;Õã˜jxÅ[nÓfªv*!.5MðjšæjÿH š%ÖuH= Ê z†ëÔªMð)™¦}û«%Ú@âÄÒ”êA¥žNiE±¤cOŠ\Ùô†Ö|zý,X^@Þ=›$Ñ„'”uEêYóš°‰‰ XŒÂÞM¬+c×6ŽìáÀޝBGù åIur3_)Ǭ £/EçZЯ{äλ+&œQ”)MÒHWr±Zë+—»‰ClÅñœÏ¹„ÂÖ1€á4ÒäÔ+ªF0ØÔKš¬³ö +PñK\Ê„»ÈÓTkYÆ[_e,é0Ö\cÇ2eaõ¦D¼wÁ”ÑFÈ8=¹<‚ÃΓ#YÞ®ꆷ{sªóØl[!Õç¦e$\$äÖP¸@¤ ÞÞ5NöÀIÑ:¸ Æ ü N*Áê"%Ìñ'ÔG JHÆÏ`jŠÌ†¡aÁ7ÌIMFÚ¼©Ý\Dã¬3lDZóE¨‰bÆp,+'µÓ!ɽ‡ ›‚|ãn€|éú”­úÒšÚú|ù¶¿ÅϪàî’£6Cˆ(ê¦Þ®æ™Ò7£Mx¦w´|¤;Ì™d“éÛlbš­ úŠÁ­UÈhhJIÀ¥\´A™­¼ë·nÉ'ÄtObòw– ‰ß" 8ðM‰ ry/SIA¡´GZ’[”é†ÙµS%ë¿Z‡šRi‡mXBm§LnÓ8ß»u ']345Ö½]&‚N†övÛDsÉcÌÎ Ç#aV©@Š  ’*~r%_Q´0‚BNRSy•^JŒ™7b!Š×!\ ) …œ _¾Û±k!û¡9;`¹‰b ³"m®Îý¥Zw±´§cG³À†3 kÍ@g˜IßXÞû7›i±áú¹nµbÍÑÉìÉ]±nõ :ßJöÛ&–—¹ãžãjVLq×܃³.¥è¨u ;(Jï=¸”È#—¸5s]ÆÚ 1ÂTg‹ Þ[X@òöñâÝ€ó°ÖjñúIª4´²]WÍ"jY&ÉegÏŒw!ÆùM€ ½ÈÚ÷ »ÈÏaH«:ÊŸTÃ̪<®öê¹4§Þ›x8ªp˜ø‚ÃÎ ”BuVdL.úái,Ð) IPx;Éô wO¹G,ò‚Ø?1?\<éŒJïµkÄ9EÒû²F¼Ý „ô %Aó’]0奶Ô@|‚¦•6‰b›yj‰¯äºû&âY&Q6ìb›6i“Ã:t œ²µ)g‰rcÅ5d%Ê«—(·1¹Ÿ’ËB5,ÝÁDÚ´ã~Ëœ\Õ—9Päês ;oKkì_]wåPIxª;X3·(ò²Àë¬Ê v”“ƒ8:;ñ¦ÑQÚcûë[S9ÌX´¦Œ*F]]n\Ì%š bV°úƒ7®•ǵÿ8ÁBßã’KeŠÔñSR™q4ܾI¦E¯®.6R=\ØJÀ—H=;^‡ÐÝ!×ÙGr ñMSSNò`ÅùRÄõUÍZˆ€=1…Ëï$ʘ+âÅ’OÇ›‚Ãì­~»q€G¤š)ñªäBÙ%•À„¨Bâ Ó yœVòF÷ÑLÜ1S|øMï>ßà fð6pNV¯ôšŽÅwŸÌbb>°:dKtžòJ Âüœs–¢RÔzõÊ݈pÁ¬…%öB™ž¢®L>R%GqIQIa[¤ìI'o’Á¼~‡‡§f fðúI7‰¼E2,jL¦Î,ˆ’´«LIæJ„‡LÉÏÔŽŠÔ‚µ1Kb_[jG1eú\ýò0Ì:uÊ%׈ý'$2¥ëÈ8údkFT¾—âFäßR‹‰õ«›¾Þ§5UCà çA¨:ÂÓYK§#»¦ÜÞœ)꛸×=Å^Ü÷Øñ>R¶!b3ø¶.íÔWzÈ´$¥Øõ­.(Á’d³žuO) ˜ïg%µ \`7݇…C’ö¬…2w¢Uð`&E ?4Ÿ{Ó|’HÚ„’©Ö.L›–á©ÒYד´^dAé"Ai¼%aLºt÷ƒ[" }B!è’›^KîqgÑpÞæ©,›æ-ta•Û9«¬Ô×¼(',’G†sϹÐφwÍzKÎ,F«Õ5ª/ÊBÇYŒ‘s„PŒ`…ΑZNžÐúع¯¦ˆ[9l#n€¢¹Ì[oûµi…óç©_˜a³4£í´Z°Ç”Åý™çzUj̸êömG$JW¯$²Ëó|5Òñ„z8â³hå¡S&}þò˜h~F먩6™c{ûäß5½ÀÚ‰¾l©šPºëá ztÂXÍy gƒÏxå@,zõW-¨wü¹ÝqÐvÀ³aP=¼»Ï‡BW/[G!TÃø£ðˆÓRàAGf{F¯¡0ÀÏ|ð;\ЀG0ˆ}}Ó¹aÐÄ#ÒÄëÍÆ›HÇVêàÙî AJÁ,Q½R“&eËçýçÝÿ~`+Ë endstream endobj 6752 0 obj 4531 endobj 6756 0 obj [400 /XYZ 38.2500000 547.250000 0] endobj 6757 0 obj [400 /XYZ 38.2500000 547.250000 0] endobj 6755 0 obj << /Type /Page /Parent 2 0 R /Contents 6758 0 R /Resources 6760 0 R /Annots 6761 0 R /MediaBox [0 0 595 842] >> endobj 6760 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F1700 1700 0 R /F8 8 0 R /F1499 1499 0 R >> /XObject << >> >> endobj 6761 0 obj [ ] endobj 6758 0 obj << /Length 6759 0 R /Filter /FlateDecode >> stream xœí]I¯ä¶¾÷¯è³÷ˆ›HAÏ ‡ƒ ‡ ‡`Ç0b#ò÷#=-ÝMé£Äê"%õÓ ì÷¦ÕâR;kã›?}þÇù_¿Ÿß¼ûüŸó×îç»Ï§âbMÑþ97¿¿ý@ºK÷ûÙ:sþúëéÛùÛéÓéSýÿo§ö…ÏïþRÿö¿³<ÿ¹þï—óßþ^øc÷¥æ ¿ž¬°õÏ¿ü¬¬¨+†ŸÍç?ŸþúÝù·fÄ~ºn1÷ÿþ^9§ëßêeÌLýíÔoS¼üýýëo§7-âf±¶tõïB+}•–çÿþóôS=A?|q©´¶Ô¶xd"+›™ÊªBV5ØK1šèå/Ïð)¯LÂÁ_VΡꃣ_œVBYitƒèÉÆ9YÿnU÷ç¡}Y!d 4Uh~°]‡O€«…I7øËÊÙ¡Ò!<0:#7[#Š@6ˆ®Ã'¼zéY9;TzäâÑ9‘kURΆOW¨„œû²òdœ‹GgD®+œmdl ð÷£§Àmm¨$$œfåÜ@éP‹çĬ,«<"ÛÞ Ÿ`påÊ„—•³C¥Ç-ýâJiµ)*h_Út²Î–  6Œž%F¥ÓÁíʹңžÛe! îaô)K8x³òT‚ÛüSÌ x%í'à„ÿ-ðâÛ/§7….j‘Sž¿üT¯íeÎöÇ—$æü}cáÖÒèËç?…Ð<ùåT]Jiú%Î=)*øŽƒïHÂÀ'ïÐ ÷SôD)ÎÑ(«Æp“6sü`X¿‡ÐkSí >|©Y%9•+õ•+LËo œqÂÌgž4†©â ÿп‘û¦Œ{NðªñNñ<ýï€þ­x€þ7ÇØ"Èò\–m#”T-ØÃúöòÇxª¬Ò^[À^Έ­ªþÂØ"à$À÷øHXòlZ[c)‚íKVÎÀrLãѰ”gåÍ€,‡\» ÙWI×ÏŠõ=ÛzÐbtÑ.ÆõGºNÔˆâRZᬡT˜KQ©&Ãiú¢U›æá3‰ý#Ÿx'Þ‘í!.F—÷+hÅ­»ÔzãVW)à“–ÜT?؈¨&ÞÁkë˜ÑùÊ\”tâ~ —ŸNŒß‹ Ìó.‹Êx´•D\$d©´ÏË)#@x/Î'¯Ñ¶1h%˜Þ:]9±Fýá ö%žV1FH隸k!TãÁ=ÿ:ü[_œ+ÎeÙü°BtŸ–çÒ\3ÆÚO¾žJ}¢–¡N ßRw£¨Û9êïwÿ–Íkgÿm1šC4ïx+©¿åîFq÷sü|zû]"Rt/rºž«šGª]N^ÿÅÄ#EhuúGõuÉh2講شõ°@èÆGµ˜Ã’W £©ý*¤ÂºãÍuxY$¹Æz»×*ÐK±èrž™Sù …ÑQ$·›$˜ ¯ ·ú<¤”)¾óvc)¡_úœßAÊÜ X}Prw"/-–›èì$–SOëÓ4ýñ™þ$&Ko¦ä²´”¼·´”š²´”ñ­ ú“‘¥Õ|KÝ¢nç,-%¦,-UŒæ(Æ–Vó-w7Š»Ÿ#ƒ¥¥Ü½T?,­§µ´®¨†j§ƒø`™Í€ª €3Ø^ʇÇþ´ŒtzH:f›ä憋ѭ5´º°ËjNÍN‘~‡â4KA¾qþ‘ o#¥ía¤O AOQB¾™1p¨A.¢, Ó­tñ”ö Ó JSŽØû‚2!”Eµ\ûag ¿gýôLÆ~GQF>:Õ5ñ¤;Ѭ(ªoý©Œ¸?S9u¦2Ú?ïÔŸŒÎTÍ·ÔÝ(êvŽáLeŠ©3•®ü9êOFg*=œ¢úQÜýÎTÆÞ#5­„s•7k@À½%xG ~Àôn!µ¿ëë„pÔÅ&VØ$+k |NÞçáÇø°‚¡ƒ#Ô)Œ–ÇÂéi‚¦â}rºpUŸH‰ Pk—3ÛŦ/ÖéJx𡸙™I$âœDàŽÀ!ÂdžE›¡µ<æ` B^J` ¿åˆ£¼®g•šA„µ>8âÜ ·éZFs)hVhs¼¨Wƒ- ©‘”à´@ƒ-ñªq &NCÅe8m“NÜí'U\³ðJqB&%M}—8)ðÚà“\ ³¦J![™ú¤³8Á»ÛgiŸ†%ÏC X<â ÍÌcXÏïáõ`¸3­â¸ê׀慣m„*LuPÅ=õ¥x îg#Ta{güNmL±.ë™-ɃûÊή'ß-íAÈ焯jžÞO§x+Óæò7¨qÖœ²AÌ÷X·à(‰r6ØFÀO0â'x4 7Š„ÃzÚՂÂ4J1Mj^¨Þ”Ùâȳ;3´cÊkeçÙêêè§Ä<+Â"’mVwnò¤§*9^¦Ô×--Dq1-|14õ¤Uæ"ËöÑlx4øN§@¦Þ©à<-; ui«poFkçbT†‹Ÿày WPô£o´.~4ñ¤€Ð-‰Ú‹‚öñ ÚyÊ‹-õ^ŸH8\u'x¦°ð‘‹(gƒzhw¡z;Äbá °®^Í£f£0dG Q[ïjç§â\~üŽÙÑ ½( RháH"G¼‹T&ŸŒH‰ãáÐX®à&s¾ç{´Õ[ Êçü„D)0²Lâ kBYyâb—.Ñ# aÌ¢˜@šÌY=pžÙ4„°i<|¯1ùPØn,‹½B"’B _}TAºÝ ©˜Ì,äqfÆu„>åÍEZ®is¦d­î—çrÁGuJ‡±ñqšÒ©â%¤tj6ËGz„ÜÚsOòìÎõAú½«æ×S5Ó[æ…ƒ¸ó%a?¤.s*%¸=v bü°vô;d×,7 PÏ(»Ê¡0bý¾{Ö yÏ€LÅ,ùÔ»²=39 ™¼pžÀz¼(¾0R2¥¹oÉ7 ³ž@!$ªZîwŒp ñ:©ד<‡H¡HdRkÏôåý•õµ «›ŠTèQ^³~Ú¨¢ŒPdMšøðò>ÖnúØ?¸œfƒP:SüÚCÔÙý‘j›¶ß.#UE[ hFèU²A¥€¡ä‘⎧זU×åª-7],ÎÒ!šg{î1Sc©O˜cƒÔ;hyx;gÀ–Ci&¡d{ÙIß8%ûÅéšøö샔ØÓˆŸÖyp .cºf…;ÑW>Y`÷"ܸÆÈ‡ïà 6pEF g›’ßKptÏæëçab7äŸâjìZÆLpT“ˆ;Ñ!;PRÃ'÷:!Ç?°j¾NijTá 5Ë ‡h=Q8g{¿¢ý†,¢‹Ü€ÄQGüWøJé¥äFö &Ì­(¾<¢G@ÌB¸| ‹ÜŒÅN‹Y˜â3ø„ÐÒbûâs ÜäŸùÄ'¶k0À˜Ã;ÝDR+çíÒ€°Àt9×£ ÏîìЛá¹$‘‹O{¹YðŠÜ@¹3#$¿Ãö똸úZïÖö«„…é!ˆ‚‚ït¿‚èJÏ&ˆ^—U©¾#ÉŽE”97Ѝg Ü\Éb,n0Û"ªÅ£íC:;QÕ€xPD=câJ›Q„ö«Q®¸æ-íÎ.—qEÙúVí“2/y³ ©K™+ý£2úŽzü%Ã?ÿ½GáB©-äÀ:X+îU ã`íKèµ茼Ë"݄݀ ¢qÉo¦"T'¬y„Ÿ(Å«çÿ?—LN+¡D©|:Y]@ð5J†Ç")ü]S¬‚eDt³Â5À˜¼@9@Z é.ݾÕfxÒ ´¥¿ë¾c¥l›v.’x¬7÷ÍÚ§)ááŒã]óV¤ó¶gÌUùwºÁZkÂ-ɼ…¨;æK7ñbñi»rHêRú6ßkÔ¥u¾dÊt%¨“bh•ÕðTùE°Q 0±¬ 4I‰¨Ø&l0¦0oýûK7XÕKð5îµ'tæ=—1ßp¼zcì€*¬ß¦Ën´byÕuL' L”æF$¶¨!¦:EJcèÐ*i™ÒÓgGo¦È eI¤^_i½å‰»ÚÇôv!ØF$«)W³ÂA*ààħ#^Ù‡m"ìbÅûa‰øQœ¯8š›«Û<ûho=Â-Éþ ´b!‰üômf¬ðjÞ†sù£öc3¼ô”«Ÿç. ÙQëEŒ’”Œ¸ èÉ:ñmÆ«ùlg° ŽC5o.Å0êŠgG[y;Úž,2e< ñ2äxõ˜n1ç(šÇ§Èk}m¶Koœcß9°ñÀñ“çNW>·Wžú;3Ç6ô£t7INÄØF8[{'û¶Öß5áøË)Ï7¦ôðûÐã¾)¯>+F AIqXÝ µ>õPò XM¹ `õ¬l¯ëÈõMYc„iÛ3B[öà'Î 86p`˜ÆÌÅÌý¹Ÿ]mG{n*MQ‰§5³ÝŒ…Eö±vøõŠž›—(J oýŸ wpðFÝIyGûV¨¬…që'ᬟlL‰Ó¢|„ NI]Í®›”™È{Áò ÄÖL¶Bx9ŽGqÈ;ŠV.ZU…¼_z\C\·UÏu]‰ÊpÇ¥¶¸p7ÜÕºe–r øjç9`MƒµÊw‡Sr(¾Èw²Sz´÷z²S¦78Ö¿?ÙiÑ·ã a˜ VK¢HžZîÚÙré É­QŸÀšKðBJCŸþ‚^¸ÍØò Š2%Gâcû6bÒÊmëÃÃÄ‹FÊ<×]¤œ©)Õšññþ´Ül¤ô€–ùÜ2yÀú’ŠäŽb©Õ‰n:’ª~D‰y% pióf´$sõè“%Q§îàA¿Z;­ÄuºZIâòyàÞª‘-„y "LJI…ïP*è(§Ýgi“¡ xÛ1áx=!4B‰±f+.æ­NÙ²cé•‚Ki(ô#VÖŸ8CÌ2ÔKPõ´ªC¨BL[ëi'5>D9³‚#ƒwW *ø}Çs]¢Ècò-¦sQDö9Asà}íÐ*Êøh{Õ^5YH³nϸ¾wø¬‰MJÊùtÕ:#aëa€MåXÌØßãþ•šð®pÖxún£½nñ©)éœ>G“’V)ž–µN”(¥ìŸbáRbY¼/#¸øq$¦`Îh¶æå«ç³(‘PÕÿ”¤1Ä[Xí0Q˜IðfúΦ"¤ìPPZOѱ´ÂÁŽæ¸g³åºôê7RÁõÁ›‘Añß.a£‰Ò•k­dçœ9ÇÚ¹{MÅeqváŠÀ073p¾ÅY|8‡ç6îsd%âk)½Àq7åJ@|í¾â߯¸õ€hèJAüïçÉröI’Éý½þ 0g²¡±LÄÔ‹)žB£:ȘmŠþNL׃ëÕXR.%hJ UpoÙe•(¸áZ¸ê@%+Ü(uU$>£È <¦Dü„ ûá­ù"P|s)JJâl‘BSö…ˆ%¯‚rë@¦éúõÏðw¾ƒ…d‰½èðŽa¦ÒùX ·ÒD¥#·Ò°3k!¢?©î mçÁ­R’ݶٜPk_>Ç ?¹Xv×]¬¹2<7œ¼Ÿ8?Œ¨– ”hÔB¸Å…§]®Ko·,0k¯åØ XÏÙ$A³’:'>ç¹'i“Cí<í{¨“W­N²% PÄ!áöPQDºåb’LatÞSÄ3&;?G'Ÿ{䦬íÜdÈÜ1Ó>¶†¶ß€9¥Ú-GOSŒr¯ æ^,(y[¯~)Ên’#q(G ëÈ-F‚ý.[¦&9=¦³k¥|qÃ8‰lû!ë”nF9Rá²§%ü„µ Zõ|ãÖƒòš×·•²ò‘·a›#g.j©L/p~ !¯¡ÀìMɇÂù‘PXà¼GÃO(+À‚Œ7G´¶=‹ù¸L‘ç̱NX-«( 4º–·eãu¡’ŒqŠë™âÇ'.ŽëÜc¢#¯ø–\2×c Ùap—ùGÝ`òºÁÔwíP|±¬³8Ó'Œ_¿÷Ž$!ìíÞ‘úïù[McAü4÷…4ê&»VÔ*µMø³ôƒLivóvb‹­&㛆;M0qqç—® ý qk’÷h5çyZÛÇn§¨>”ÚWÃ8ß©o°£É©áí MNlCàÑà;µŠ¨­ß¤¨S ®ù½^qh; àÑ0 ¨ÞíçcNǦEÜ< ‘¦…Ÿ1/H":0Ú{´ …%~çm·‚QK/üƒ¸«™`7Ì »ÓñQ³dÞîäùëØB]:±{ÇCS°H7¶Ï¬nùtþtú?î{ endstream endobj 6759 0 obj 4842 endobj 6763 0 obj [401 /XYZ 38.2500000 440.750000 0] endobj 6764 0 obj [401 /XYZ 38.2500000 440.750000 0] endobj 6765 0 obj << /Type /Annot /Subtype /Link /Rect [479.250000 448.250000 516.750000 455 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://c2.com/cgi/wiki?DuckTyping) >> >> endobj 6762 0 obj << /Type /Page /Parent 2 0 R /Contents 6766 0 R /Resources 6768 0 R /Annots 6769 0 R /MediaBox [0 0 595 842] >> endobj 6768 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R /F1499 1499 0 R >> /XObject << >> >> endobj 6769 0 obj [ 6765 0 R ] endobj 6766 0 obj << /Length 6767 0 R /Filter /FlateDecode >> stream xœí]Kä¶¾÷¯ès€í’H °³9Xì99ë8aÙø¿uKꙑôQâ×EJšiìi·F|Ô»ŠUÅ·þòã¿~?¾}ÿå?ÇoÝï÷_Å©.‹öŸãùçÍÓ/´;uŸµ+ß~=|?~?|>|nþûýоðåý_›Oÿ;êã_š>þð÷æË»?:ÿÁ¯‡ZÕÍï_.¿}­šOÅõ÷ùûþö‡ãoçûéºÅ<ÿÿ7ÆyÓ¼Ö,cfêï‡~›êòóû·ßo[ÄÍR×®¶ú¨¬±Gå›Oÿýçá§f‚~øâä­Rueëâ–‰j}Iûf$eG]~„†O0¸+Ëtƒ_V.e*ýä¬Q¦Ö¥=#úŒäÒ9Ý|®M÷ÏmûòÖµ@³e•l×áàÄÛ¤CøeåâPéŽGOŒp_*ÕÍ— Pr=¾«"ƒ·+—J‡n<¸ ìöµ©ZðÔ 8ùqôÀw)Éæ²ri ô˜…ƒ§æcW™„Ø¾Žž!Þ$T —•§Â6\’ý2ð”ccOú×áÅw…² ù²rq¨ô¸Å£§eåh>+?=¾u•Œ•»•§aåÀàr¬ì £‹„˜½ŽžøÆ'3¶º•§Â,\³ÖÖ 1{=ðKÌ ïVž ³pð“«tmËÂ;øù6Õ6!¶¯£§@He}BR:¯<¶‡ƒŽ¯¤ýÄí¾^|øzxûIÙ¢guüúS³¶Ëœí¯¯ HÊã›s,§ùýõÇã‹Bû?¿þ|ð§J—ýÛ'Å'øä#|ââŸ(‹žØøNçyŸÀ¼68ªã÷SÀ'w z¢!t †Æ)„¦¼jUJÒÆ‚†ó8ÏÖ¬¾<ùøµrÉå“·ý¬ùfuÊÌCS”³OòìÎè¦ ޽ÔzÐblÑ.ÆÕ=@[²r'ç‹Ëz†À™xÒ!aêVüÛ“5íñÜãÖTûÎãŸVpø"~øŽ×Ê“ÑN- n00O» UœªZ¹æáPª¨òTøË[OÞÁÑZîRº´`º}¢Ô©´Õó´’ÈôFšoj4OÀ€ “Ùû <¨M9 { ÈžXq(lx©‡a€DÌrnï8Êô¬»ä‰¨Ðêäñ”ìp£0¯a©2ÇS€Äp3p4ÈŸUÃyð~¬óˆñ4ÔcΉQV*º!±Šc?&àicbÌd+`èˆ~à 3 ®01´j ƒŸŒHs¹èÐÞ—Î7ú"‡Ú¯K?;ˆi$”šNWËU8Á‚À:‰`,†W ½ DÏQ€ (Ýä ôœ%8`Þ ê<›ÛŒJébp’:°Ÿ¼®ÍiCÓ6@¦ð,÷)XãUC]Î0>£sE+´‹·M&ãÈÊd¡GH)¼ã¥N]ÀâÁÅ[çí´´–‡ÒÞ #myƒò u‡2v¹q˦EQ õEnÉEò¡ç†[ûo~á€æú`„D 8“XÕns„‹ÅÀOÖäQ]%aç¢2J‡`ˆ×ÆØ;ØvÀÇš< ã;‘¡.Qü0ÁQ*Ø‹¹òaHè„LÉ-­‡ !W”'â]F 0ÄqhA OÉ&<äÿÙàû&#¡‰£š¶ê¶Q,ÕH‰ãJ 1˜•‚3Y q„È+Kn}Ö•J›D›ã„KZ#& ¡03ÎmRúõ–G¢Îmជh§IuNÓ8?$™¡’2 -°úrt„Y°º¤±X°Ù‡ I6×@D6b4‰,IÔT¢ÂðصÀAp,þׂq |À8ÌA4qÕØQKC«'mÁ¬â.C8i ÔÕƒ-tv{úO¯s§xR‡tÑ»”€Ü•îÛ¬PMœ¶YÔÓ´¼  »“’ÇìT½øˆn†e˜Y[›å"{­“añ»\:1êk ¥LIéÜ-s²ÏÕ‰ì\¹3»r3…®·ìpÊÆ°¹Î8\ƒ×ö!ƒÓ€y§žóÃ&‹~÷—¥2 yžwv߸°–8™–âRVŒû@Ê0ÞÏF åØRþl©wñï0Iá 㑨£0¼z‘7Ã34{L±ðŒá@F*ÊVñuïäá&ãná&L—ŠùŠª}QÖ7ìŽáTFwc™hcñºd~]í„âÎ xïV\ÿ$cS ¯ÌMí!îV\VŽ>7I¼[q›ãÔ»·K+NÕênÚºNõ7ùçw+n#2_~'§m}%ÜðeÆVUÝ"î–_^)àÊ[°õÒ¤ùêQ:Üö2Ðs·Ôg {§¾ìÔ‡½‹WF}ú–Åëñzw`ÙÜ=å]zÊÆÞwÚ¸ßrn{~×n/@O¸mP\8‡Ü[síSß.s¢Sm mKDJnß»¼ÂzË)©x´@‘°½éĽךÅ^ª7mUpÁø¡<ØiûêI²TIÝÚ5Òñ^Rª&[¹éžüÊ•IHôï °;ÎÔ}·X§3]»s•ƒÍ¶ï|Iò²¤ºÜ`ÄÛ ´n$êù ®çÇúg´ †Pà;wƒ{5FKk':7´÷&{I!_XÙÝ0èë5‰™5ŽÜZÆÆhÙl eItÖÑý¶B–¿è7§-pÛ‰oDZeT=-ù’NªG1”- ÕÙeêúámYÎJŽ€ aZB¦i÷0«V™[ dï´‡ß/J#BFL׿‘3Åô÷ǾšXùòœX¹fèšÞ쯫R€S1ÍãŽwSWÉÁy"Z}b“«˜aWÊÄõü´x_»êýÍ„Z™{>˜ëÇ0ÏnY¿ÍD@l2Ö˜¬?Éôda0'«r™Û"™!ª{1wO–½äç×I4²Üœ¡gpÀã-롱¿#ho•rCB`’øæ´¨«¬_ uéoÈ©üˆ‡Ÿ“Šªuêºsf/¼ÅwÅœø”¨råN‰R^d©«ÅœÌ´9{ŒÑÈt{³3PS—ZÚ¾jg˜STÀ?MÔ£ï€Ð§æÁ9ÏÄ@þ+èŽÎ`°êΆ˜šç#z'°6ü„ŽþßùW]ÀwÞõµ²§:¥v”!àW |j;£;®¨U5Ô°,¤ ™NJ/xB¥—GøÚ8uÇQðÄLÓ/¾QX”wÇ”ÄDOEêENuvuc.µÁ.×’“;” çG*“¹Á[vÓäbù‡\¨”áôÎâ|¢e$rÁ?C#)šAFÅÏbœ[Õ›&ÃVRq¤Ê±Q‰:ÓdÜ•ñø-tÙ„ï_îà4;.æÅtGœ÷ÊvècÎ)ÇÔÅœ¾cÓe­S•€ÎǧRDµ—j›TÔ®J—4æ,†¨«þ+|ÒóMÖ‰ÔÀ@ª/ñÄà¾ADkxœægà~Œ˜w¼Î½:<ÚõãÔK|΂ÓÖqa¾: g”d —™hг}­‹- &ª}c²3™¬S‘6¡™Îˆ¨Ô:Ñ|KE’ȸ¢ÛÉeâD£*_Óh wlˆ2ÑÆé¤za’aZTÀýä4Çœ¿F °rƒŠ*Påƒ!Üx«J€Âj7ÊÕXõã'ÄÝ€Ñæª}E¨Âû(ŒE' ãòQq’.úd¡s\¤»–O6.ZUµkW#‹$òªœÝÃ]…ž0÷Dn^=’E.I„ T .äƒ"!@̘”ˆâÙ,RÒ”C^ݧ”ܵ#ŸÞ]÷õSî:Ñ”ªÿÍu¹Ž÷cˆŠ;Voiÿú"üb-Òç 9w¶)æÅ,Ö¤D^:ÓÅ`·P5y2Bþz=/¾Ã·QÁ&t[ÃÜgs*ˆÜt¥¯,`sd ': ¬ÜÃà6} Øè*¼'/ÞnkVEýëS–4‘ZH—Á.*Î~`®Ð«K™Ú)´B™t™€U-[|н&¬C$5àÌœ2d1NˆBÚaîY „7p…qtÀ#›»..ü¹‘¹ › ݃fAª"‚f^À´ƒñCÜz¨Ð´#z"æF&5+ 1ðhL„†HÆücrZ ‰Õwk!`-0 wk!Ÿµ@݉ÆÈ ¢¶tö w)JPU K;"š±pü–ÒëÛ™ŽdŸVÔ6?Çï¢ê‘Ïs°ÀÅw“ÉßÊœ uN‡8jûœJ§â2-|ê ‡ºÅ·>éöBª•Vã']…¯>Uú҆©¸Ì4™‹tM­íS·S”‚s‡ìã’ ¸Øþâ¦Ñ;¢ÁÙ¿82± …Gƒït±µõ'dËÜùs³âÑv àÑ0 ˜Þí÷cS'øÄÍc©aú1ø‰!æ¥ @DFû€¶a°Àïã!È)X$ª'̬nù|ü|ø?[AȾ endstream endobj 6767 0 obj 4320 endobj 6771 0 obj [402 /XYZ 38.2500000 627.500000 0] endobj 6772 0 obj [402 /XYZ 38.2500000 392 0] endobj 6773 0 obj [402 /XYZ 38.2500000 627.500000 0] endobj 6774 0 obj [402 /XYZ 38.2500000 392 0] endobj 6775 0 obj << /Type /Annot /Subtype /Link /Rect [93 634.250000 137.250000 641 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus >> endobj 6776 0 obj << /Type /Annot /Subtype /Link /Rect [264.750000 398.750000 348.750000 405.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_operator_overloading >> endobj 6770 0 obj << /Type /Page /Parent 2 0 R /Contents 6777 0 R /Resources 6779 0 R /Annots 6780 0 R /MediaBox [0 0 595 842] >> endobj 6779 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1409 1409 0 R /F8 8 0 R /F1499 1499 0 R >> /XObject << >> >> endobj 6780 0 obj [ 6775 0 R 6776 0 R ] endobj 6777 0 obj << /Length 6778 0 R /Filter /FlateDecode >> stream xœí]IǾóWðÀT×Ö f¤9$ #‡@Ž–‘‰ùûi²—áTó+v}óªºÉi öŒYb-o¯·Õ»?ùÇþ_¿ïß=|ùÏþ[ÿóáË®8T®èþÙÿüpþ®ýïûªvûoßwOû§ÝçÝçö¿O»î _þÚþö¿½Þÿ¥ý÷—ýo?ü©ÿKÇ¿ð}W©ªýùëégS©ö·büyüüß»¿ýaÿÛqÆa¹~3/ÿÿÓÆêã6®,ý´Ž©N~ÿöÛî]€¸Uªº(k»WÖ´ÿiÚOÿûÏÝÏíÃôÅ¡±JU¥­Š×,TéãJ•jöJ7íLÊN:ýš>ÁäµÑé&?í\*Ê”*<»$rë#¥Cîóô &oš*!åwž ¹xvAä*Ý~ÜÈyMŸ`r“s»‹C¥Gn`vIäZÓËÍÆ%€Ð8{ ð»4É&?í\(jáä‡Úe*íìËG »ºÖíï•éÿy%ÈZ;'¶ÇÙS ¤¬R’Òqç©° '—äãZ×=xÚåô<½üäºPé4p·sq¨ ¸Å³'fe]”=?èv pR¦c7­›2!5w.•áÙ¹Y; ·h€hœ>üKÇÍÝÎÅ¡2 w2ûç˜YðVºOÀ…þ)ðÅ_wï>µ{*÷_nwvZ°ûñõûζÿs¼Â7ÍþëOû?…©þ´ÿúË®9T¥+µ;í¯)ÊÓH}¨›Ây8؃5gdÑ5)ÜiÄœ-ëê|6õ¾[gÆô…… 7p³pá¢ö¶. ·d”¿{6UÄ´ÐĹ(áu>žFÜÁèö~1s×±Q–€„CÖâųaàï`Xc¸á]3ëàÙ˜½A(ŒíŽ¡”J†F‰u"QVλ¦`Íì ËDÌÛ¾tVWùñk«{Ó¨M§µ§7-£7¶ÃŒâëM†§”ß©¡~ëØRˆP¶@¸¨Ü •Óƒ þԣⴙ „qa¤—Û—Fj8ÛG8ò¿Ž1p6¼üfo:(8ò! =%]‚Ž…»†#¹àFanq¸™&#oV꥖½t†k#yvÚŒðÁ¸Ãj •ÂÓ­š~ñyðÞxZÄÐÉ‚ûºh6Üߒ슃¨‹Á³Yx ÷†G°UÀ Ø2 %bªÂ;Xœ®WcË$¼„ô¾»º´soYÄh£ªë†8d…â=¡rô˜dqâ½i¡œ‡ÆLy#eãÜfTÌ9Ï”Me7Üß’ìZРTp×+Јbò2lʨÖD~Iª8”•:º}¶PîÐj—~ÈP—œ¦8”†|pHÅ7|uÀÑ Ý©êƒ?IÄzD@"f=“€w/ÌDøD£‚8ˆÍâ8‘ñ‰ƒŽ8X˨擆y 6G@ö¦"Ic`2˜L‚QŠ!KÄžLö²®ôätÊóó,˜@•Á˜!‚óÏpçân,Ó'4èK &<,p'˜š‚9¡Èa¨?ù0_Ÿð0CVuĉ E>!
ÄX*Ë3´ÅLŒÉÒ)q.ªÞdµ–T–MÙø—š âe]¦œ£IŠ#NÁ4ñlÌ•l¢·Ž˜Û£=1§b‹…HÔ‰O®ºD0J6KMX°Éfºb2p?íF”¦›Q¼`fðëØz3Ì=B<3€L ‰SÚ£Î\y¶”1…ñ‹¯Â„àPLÚ"J&Až9 N~e$‘e¡ùy¿1& Œ*ªübm {îíùqz§I†ûtmÔu»»'Á¸Dä›lJE@"ÉÚײÂ)äõ‰®Î GM¨y§æSœªŒGrvPû=Åísñ¤l¶Gd›!óÊø»Æ#Ö“Õ‹Gdœpaý#ößwºÑçüºû’½ƒÄq / $ bbÀÔ•— ¥¹qÖçXÚ‰Vbü¹šWYèû2Ùwxo;5ss @ÞVŽ¡h¨[Î(¬÷ª¹(»¤,¥)¢> z¸‹ÃMui¤êÁ®ýà]`6ü÷ð;5iàlõÀ©¾Å¡«AûvÁëôZÙ!‚ù<›õ½?„N_‚V ÊKßédRy0'Ò¿` MwX'W|O•C}w¶6ËwDÁçq{àpcËÀPÞ¨;‘ó²¦ðÞˆø«°ó‰á=‘,5Q›‘Ê%î}”ë„I’dz1v&À\–î|yÀ! GP`æR ÂoèŽ3ÖÓ’oÇQBe,ž"@9*±8a“™B´¢Ü6Íd4ÞÄÏŽ#Á„X¡<¿‰JU\`V½¹3> ™¨Œ[+“ÑÌdÇd¾hR&×;ªXU˜Ú×±"1à‰|Óµ/2q]F&mwI¡‹¶2æâîì{»5÷î” .·zéA5•Ã]}µ?ŠÒfŒ{á~P¸‡јŒiYf`ÿ@— Ø%ÐmžwæÐD[ÔÞËÃcSÞ@çÜaeݽ”Ûš2§»7º ìî-Ðø÷÷Á|{èýpÆ<ϽáÔá>Okèwz"æ~å‹ynH‹ñ+ÆgžÛL檒’¸ÇPu²ŒY,ZßK˜ ùeø<ñ>ïY)ï™o͸Ò%à$‚ Ôå ÏÑq#Ši—)ö”m²|hþÍ\’­Eø ä”:ˆÓÛlÚ•>L×—Ÿ):‰–*2ÅØ=?\š­<Áä'I¥ÖhæŠ6Û²'Åâ5wØŠa¨Œ—­¬ñNÔ½H¥e®Àþ|˜ã8U$9?º-ó¥òûD«[2´¥¬OïÜ[X!QÑ2ÛÇR˜Éè÷=æÂ-p˜ÀÝúúŦ+E|3‡Ü_ÆççxÒ/¡|«‹Ò—oLÖl²™D³ë˜r-RWÖ¿½À{w@ùG ˆ_Æ¡E”Q 3¥Š­ ö †Ï5†5¹ÃuŒh†ˆpþ.ãþÍÕ‹IÏ\¬+Âäqyè £zo6ˆd㩟·¿³‡â…Óߣ¯Ú)S.sž¾ ˜§Ñ&@z/¥UÍUœçj\{£·ÒÅc@eGt¥“Å)“ˆ}µ_ù¥ïÌ·83(!D— _3Ç­±`ó_ æ~Â|ȧ™ßÅ”aà€ˆ°ûl¾GS•­†DÉpuÄ=û× eæ~³¬îS—Ï”L®Wz*7.¹âWzï÷,þJO¯¹/½„ßÕéyL•!?à÷{4‚_ ìàŽ\ÛAŸA=¦Â/^%ÒO ðÖ-¼/çzÅD6c<Û­8W¦ýü·›ÿfï4ÀËÄß™¦%LûŠ{EÂúN|oOšdëšÀ—x¦ô*TÚWtë¿uÇuh#zªQ½1E™XøUÛLœyãÂ6Â3¸Â¬™ühT%Þmr'!»(×KZ“?ŠÃTŒMñOóù‰¡.¢Õ[ŽWt*%¡&E#Bò$`†¯™3#䱬º”Ð3F (G¼ûm²U·Êl"}ïºH着‹!':qÒ;£üâûY YLm¹¬Á´ˆQ²‹åû‹=èt= ²¯ ã\:˜‡óü4ÎÙ#òïÙ–LnÞlË<~î•“©0?ð‘ÈÎe¨S1²Ž¯š±f‡z‘Ãã‘É~Æð%pwÈ»ÍuR8Û:JÇ›±ö„¢V¸äk÷órŒÙSv½)2ÖC0TAàÊLpçÁËÚŒ¦JÖ*Q³áÊ‚œò¥r¯ ŠïŽÍ8Cc3î'|Õ…á“Mä'œÓ«Uâ,ðõetÇ´me.ÖØÛÀt\%Z!,Y›®U14,ÖÖ²:)l1â[¾1V&¶ q•«†»ŒÀÊKjX/ªë8DºkÙF ›ePÍ:lLb`áî>Ä ¸ŽÃ„É”8ãþB¢d€u>Ç–VzÌ ½–dtÝèöolïU·Ž¸e7’¾=¬Y îc±kìÀ>h|·‚0èÍÛ<ŒïÆ÷@\ÆU«ú:V7q!ú˜¬_ÜŒd7„m‹‘¿s›bMcÑ]˜`0 pta ‰Å4vÜá]‹½±0C5£ƒ»×°;ö6Û´"nÍNqJ`ÂïàÖFÌeÙÂäÂ;ÀÜصÊÇMZ Í,àÌŒÇ6 žÉ"`àœ,DM ,âBö}Fæ2C¬$`;^yvêì&610#Y0b@å pk]™«@ ¸ Ä|—W‚}F·pXäÌTíÊ䮊æ|3UŒn¦ùNÒÍÒ©õ$ê„«Åe«srõ­¹¥RßÄõvT¢ýòïÚMHLºxLO§ù,Žy¦žr}±wú8|46C µÕ¾NLû.@ ¢!h‰ZV*éc~QõBsD#»:›‹…Ot7ð>^B&¬ÊÆg­ìm¥:jSß룎t¼|R&žLT¯`0Ï0Ê€ dƒN¾\_mun*_s…”Á4v«RÚšæ:o-^!•·pºÔê“´u£á%Ö"sƪM¹ITÚvRÀ©×Ô¥lR ¯pÆŠK+®w÷܃f…®÷¶Ø\Õ›«úµ­áD½—Œ7k±ÀÕ˜iE°Ó6+¦· Ñ4[+Lì²\²¨r¾Žò9uBȘÿ©G¤$ÞµŠyØ„<²/7ÈØ$Â[vê%4Q1vwωÊ&÷@$ÃàNx0pÀÅ_¸©æ«éo˜´Ï¨+}ýyS1$Báö†ßªX¬?ÞÛi~¼|¢M&üL%M¦^U“é}IåØ44´7ÁX0Ï%N6K8±’? éXëò|…IIâÒ#û~âªLÚŽBÂY9ݽ±PÜD_û7y‡Ã„?uf·”5†qÞZEÊÌDUy*ŠzûŒiWŽó´«ùÜá²alH†:ç[씉%ñîõdáä\Äݘj²Ç¼%6‰±ÔsZäÍ(Æ\¿Wk ‚{–²ÄÁ¢uéÕ¤ôªªñ/@²±&”;¿R‰‘ct¹`ãúøžqÎET?&ÒþÙ?µd˜Ï×þÂ Žª/1”i\¨c´`¯ÇV Ú¯ëW 3êõAwo~Ÿt‘šr:Ò§éC9yX[AýˆÖ1×R-.ííSR0Á~'ënØSQNØ“æln^8†Â³ÁïôBKE½z&[–àŽ¿·; aÇž “€àÝ}>ÕsX‘Ç­c©aú1xDyDˆy)@ÑÙÑ1 –ø;úô!á9#Ä}Ϧ ì†DA-G¬™÷¼"eª0‡^ì¾à!È)X$öœÒ+ kÊgÿy÷$Ð endstream endobj 6778 0 obj 4435 endobj 6782 0 obj [403 /XYZ 38.2500000 495.500000 0] endobj 6783 0 obj [403 /XYZ 38.2500000 771.500000 0] endobj 6784 0 obj [403 /XYZ 38.2500000 771.500000 0] endobj 6785 0 obj [403 /XYZ 38.2500000 495.500000 0] endobj 6781 0 obj << /Type /Page /Parent 2 0 R /Contents 6786 0 R /Resources 6788 0 R /Annots 6789 0 R /MediaBox [0 0 595 842] >> endobj 6788 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F1409 1409 0 R /F1499 1499 0 R >> /XObject << >> >> endobj 6789 0 obj [ ] endobj 6786 0 obj << /Length 6787 0 R /Filter /FlateDecode >> stream xœí]K㸾ûWè`=âC¢ LOOÈ!@cÈ!È!˜ÝM°È,ÒÙCþ~d‹r»%}”õ¹HÉMc·´¨b½YU,~øÓ—dÿü=ûðé˲¯þû§/»|ý—¾~8ÿƒ®öþçÌUEöõÛî5{Ý=ïž›ÿ¿îÚ¾|úKóÓÿ2ý¹ùï×ìooþø“ÿÐáßvN¹æû¿ßk§šŸòÓ÷Ãßÿµûë²ß3v¯óÀ¼ÿýS+£ÌŒ‰W¿îºeªã×ï_Û}h0ï-®Ò¥.3eÍTmuöߟw¿4/è¦Ï÷µUÊ•Öå×¼ÈéÛ\QgJ×yfª|ð¢ã—ÌôJ~òæç*Úä-äâXQ¦TáÙ÷•m>ëta„>¹¨*ÝüìŒÿw%Òø:"­Ž@ð³é#Ln\Ln:Î+OðÀì‚ÒlŠæ—#‚ê"†N³Ç@™»x“!—FJGZ8¹$eËë+û1%ËÕ:"ß ÇJG[<{l=]uÑÖE@[‘àVé"Á‹c¥#8ž]Pš­ªK ÿ§é#Lnʈ“!ÇŠ'n`öÈÒl­ò®ªÑ1Ðvš>Æä.¢›ÝB.Ž•ŽàƒÙŸçÌ‚Aiÿ¶‚¯^vž Sf/¿4_Ø~{ù¶³Í/‡ÍŸUÙËOÙxìÙ˯;»·¦Ý>wÑõq¤ÚWu^êâl$×pÄÁ‘Oè=FµÏ¼}´D“¨|þô ÎXD ~nG”Ú¶¬šÁ ©D!ˆHK ²êƒ„?úù8Rì®Ô{`.žD=G>¿4Rx5B] .[ª:RO-Ý?Â’÷Ñ?6âüZuYô€gÃÏ|DÏxtŒÍVÃÙZ’)³wêÀÆg|ì:ÏksáHà=-·–{s¤öù3-¨²£üú$}=¼üA !ÞØT-ÅzºÛ³æ©ÓŠL½7^Œ/Á’PFXUÇF^žßF |¦e=Ó-çJE9C+1JÛhmé˜÷Èè{ŒH¬KeT5¶òÌ2ð{°±Å&Z6ÊE>„À`¨¡L0²Àh)‡ñ†WŠu‰êhÙÚ—¾©PÅЈ|„³µÚLé}_›yÓ7Ï…{@úã»}ú\îÐ`[3y™iÊqh× mû†`9Ê=e«8 5žÍôYPÝÂÖ‘ØâÈ‚¡Æ~Ö­ )û†‘œÈ{+f‹8G‹¤âfÆQÄN6}‹›—M?ܯ~Hì$E´¬*÷áŠ7ÓÊxÛJ0øÆ<‡Ý“¾Ü|f)ëÜæ¦XÖk)° fŸ ¥Ð…—Nlÿ™=‰ig«÷®¾bÌ Î D ;À]ÆOK°3Õ´k8#ú"K©÷àGÙ¡¨v=™'ÏïmxuéȈìŒ=óG Á|¦a‹iä+ÛÃ!%ÿX.™`âÀmeöì¼Ï,UaÍÊ8 ê}¯&‘ç€A²Ÿ½+Z†­õ´Ðc~€"çЈ†Ï`¡ÇÊÅ Ó¬g4|& \D•˜œBš¦peòI û„Txlý^ôÆ0WCÌUªðLÌ‹˜^´x¥˜{0/â•~‚#p=>Zƒ¡NÃå´óaÄ ¦áitò=¸ˆM¯XÝhø<ðyñc0˜º-\Eƒ)‡½aìc¼á=ŽâcÊ=%T²Õ4<˜+äËÕTóÍR~kÞ+S*¯*sƶ˜Ë¡†Ä2‹¸æ$]EÑu}í7Ǥ!dsýŽÉ[`¢`u…Uc`!J|%‰ U½'xš··‰çUâ‰Uó ‹ç[â(ìc5ÛW%¡¢|Ï ÑÛÆ«ºW®ºmžmñ¶q]ƒ=hð€›¶½åƒ¶qŸáž­Õ·noG±àlŒZøÌM6ÈÃ+ÕÂf l|S \×jÎz¼uÃæ^HmŒ#æåL$®lÑÕk{g¬# ‘¸bšQP PõP¯ÅëÁxÃÇP ب~a1”½'n·L¦%EäÅÛÃØ8GÌôóÁÏ ›6Ìè‡Dôá ¸K¤ Ь&Ä »ãÀsäbËöÍÁ­qw¥ø=•íYº@MÜR+ÑŸ3‹Qá²mÉe;¥›BàþLGH‘õÅô' 4x :¤-ÝÓì»´ñ‰ºqß«%§œôSÍè£t¹ŒøzñKšZ<õð¡?,'n(M5›Ýžá¤Jõqr›ˆG)žÙÁIiÓCâän-2Y•Që#«èÉ~ªºX¬+ D¼6®xFv2 ci§WÇXFöX#fÆ©Bª˜Œe\Õ×14ýbÝn¦‹®÷¹¤BMíïÄѺ“ìÝÝIJ¾-îÝ÷ï¦:@3þyó»dþÞ:ZÇÛá«LtÏ®É/ Ë/·xüϸRB¤[36&X¶ý,K„9¶W´ß6#ôeÖW6–ÆÉ†9œ9¬Š4x]‰.?K}•é<.aƒ¯ÈÿD»—'nWgÊvÍH*ŠÞQîR’3#¹ê-J¢›~¨KV¦ÃßKgžÞj‚p3zЩ©±ò‡ŒSû¬¬ÚÀa~ø%ÊL›œtòK¥æÖcXMÖ7"ÛjUôùörwd ÑA@0±ÂZžáèA˜&aÇÍfm-Ûna¼Ç[MQÙ÷Â=¯'~†éíLT÷ø÷*»É®ý[)lNõª^ž¯qû|o@à.6ÌDW—ÉF§³81E7þ‰œKyº8$Ä$ì0µ“füYO™i¼€ý1b·EaT´à¯‡É¬¦ŠµÈìRa-Ù"Y_›ˆ@PÅg‰â ²Ri=Ê~%f=ÙîäsŒ”uLëUÕ=ó•¼ sêAÖ$-V‰’ªTq±‚«5÷ ‰œ÷–-Ñ‹ÜÚ&}}L¨÷µÙÄ0“z#zìP¡Ùbæ|§DÇñÛêy“ªqÑ ¿‡))™“)ŠßA«¨z&‰xÊž›™Ñr%,~†9èˆ-œmNÊXT†o‰!”´øuËv¹ÍúØÛÊïI4· ào0}ª#É¢Í@ö†È0¹ÎR“ìæR"•š¬Ú;FéCL‹TëžIº­ Õ#Ÿ0Íz͉Ö'\çØDæÅ‹_{µÆó²+LÞém †º¡ƒ›WDO>3¹.ÜNuñ”-µFúœ3y A̳©uO&S`”¨ßÈòEI朡!dD¦@Hät1ᮋԦÝDA nžëx‰ª_”=ëˆÛ7„*}x€„»\qcQ÷ %i¹rš}/·LÇ}¼Á¢ÊLE/jLÕ yÉûªP=Vˆ]ýÄl ‰‚ód•ÍDè-§‘ÝNËöÀ¹ûÃâšà^·ÿДbWï2q1$Ѧ)\[GûYç 9CØMÂñHS@oÎÆxE‘ýè„¥•VëSQÕ½µ:`ŽlâÒXbÀÐ]Í¡Þ4JâZÁb?߃‹ŽpQ·…ÏXÜRó.nÂE:D‹Î׫/×\@/wÈ~Zs™¼+d hÒ„ÅVÆšIx˜R?ÙÆBT[l»qÉð&AœE›åbt³Üwg¹S5s±¦>7aÊ?qeF¬d5½ ;Ü*\Æ@pS8Ñ®ÿs.T]¬êg}…4T,m+g)gXºÞ fUô,“p8sf¹Ë ƒl©ðݶ:¹÷ʌŧÈuC™ŽØB½_ö¬T}ê@^ïR‡‰V ËGÖ¼õM×n¿·Ùøy‹K]À}Ix¬È§[9È6²ÙhÏiž›m‹c í®à1áö0EÂu¿Ý ¿øºñaq‘±÷‡ÅñÑóóÃâÍWöÚ 8Hç©\°{«ÆÈcš}g®ñÃìÔ"ÓCó§[¸ÝÈŽ¨ôê½noÈw9ñ¹0½÷ñË3:(¸Ã~Dï1S[à1ØžüJQÕ/vúíH9Vù¥èÕ!®KÅ[Ë‘e(<|ÆïÕ¬¥Ÿ9|,Ã~n ~oÇB6 àÙ0 ˜ßíß‡Æ Ÿ[š÷ƒX óÁ#ªÇ„X–, ˜í-Ã` €Ÿyð .Æ#ÅÞ/7, EñH@t ðž_ŸÃŠŽËÍÞ«Ýw2%«D}ÖóhÒ¶> endobj 6790 0 obj << /Type /Page /Parent 2 0 R /Contents 6796 0 R /Resources 6798 0 R /Annots 6799 0 R /MediaBox [0 0 595 842] >> endobj 6798 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R /F1499 1499 0 R >> /XObject << >> >> endobj 6799 0 obj [ 6795 0 R ] endobj 6796 0 obj << /Length 6797 0 R /Filter /FlateDecode >> stream xœí]I䶾ׯ¨s׈‹6 Ð3í C€Á CC`Ç ÛÈ$‡üýT•¤îJ%~õH±ÔrÃîv³‹ÛÛ¾÷îŸÿ~üçï>|þ÷ñ‡þû‡Ï‡âT—E÷ÏñòõÝí/tsê>ÖMyüá×Ã×ã×ççó¿º|þðçóOÿ;êãŸÎÿþ|üëßοü±ÿ£Ëüz¨U}þþËõ{[«óOÅË÷ËïÿuøË]f–ë7óíÿgZ­{ÙÆÌÒ_Ã1Õõë¿?üvx×]@Ø*uc˪9*kìQµVÿóÃOç†é‹Sc2µ.íùç¶²uQ6>ÿ\›þvñZ_V·ê¼ºn‹£Ñj´øõKfú“×&âä׋ߊ2•òÏ~j­RõÐ÷`Öõ eaÊþ‚Îh"~E7ÓG˜\Uu¼É¯;¿•¸žÙ#Ss©UÛSsSD¸¶—écÀ¤lãQs·sñ[Žg—¤æ¦ì)¢®"ÜÐËì1®¿5:Þä×K_ÊZ8¹ d«¢­"òé›é#L~þ¿x“_w‹O{f̧+}f×K³¦“aú0©#ªtÝÎÅoeøhöO!³à­t¿ÖÂWÏß9¼û¨lqÕñËOçÍ]×ì¾}9_Jyüîb"œqïËÇß…iþpüòó¡=Uº¶Ø(‹Ḟð<[Y£‘BÁÙ*ø™ÄÈû™½}ÿå ØØ0©ô°ªn‰3|G „ñ†–ۇ»Æ³a8*¼·”0)›lèß|)Ès‹˜‚ª„÷{˜ýªíGCê,´$f÷NrîZ•Ãéà4æ~G &èžrŽõ×1ðv,ä6Ì: ƒ„NªžÂy’‡óÀu4¦gÚ ¯áãYφwÐJñ Ä4lÑ1Ú9šÒ'k®¾ï×£בæÔ´Åu§¯€ï¬y…]G©æTÚª©oÿ´—S“Àé{Žû:}/z&¦7ÊùÓþÖípš›Y?À‹FzíijŽt”TžŒnÔÒÏà½á›uo O¢ˆ…ñcâ‹ô¬ÓAP™á¾–¬#{Åx×xÌlpoø”Ÿðñ@›Ø>©îF”¶°>xož“ÂqÔp6Q˜báÜ›g.±{8< `Ì–ˆËïg‹(ßÊ¢vœ0wq]†ã`*xrE_"¦pbõLpùzm.ß«±aÀ†¨ã¡nHžË_.Ê{Ûv ‚0Du>JB4á’Õ£bžŽaƒ}ÅW!oØä-T#Ç®ZÆ@ÕrÚT®…Л­ª8]Üë߈îlª<­ùöŸàM½Gö¥¿ÊâÄ3f0©ÍÈJzÿ­Hë ¢Æ¹\ìõ^ÕŇüõÐVÍí/~9|ŽæÅGÀ¾lÁörÎÃè>]ŽÑM±žù,¥h4GÕN]®®7ר—%?dRvv½Ëì¦Fêþº*‹Â³áÏ<;hálÍ ²;ª¿aiõ@&.Ùã¼ÎÀ^ôˆ½ô$|!GwƒFð:ú#üÌ3é…ÑÔg> íõ²êd”žf}ët³Õ'3"˜T¡ó×<¿ÇR[ñŒ~ì²’ˆ…µ¨òæY‡ñ(|ùë)Së@2ƒ º1œ’Ð걤Áþ³å1±.íú&)¥7‘ÛŠqÃyT,ˆ´Ø$_W*,Ɔ XÔÎÄ—âÁoìÇøMøg‹Ò %b ³‹éy2•#HñÕàz@˜$™;t´03ÉrGÅÊñl„aè!PÂ]1VoV.¢\ð””Õ-1¬‚Ñžàl˜Ô­GÑ£Kxg-Öɽ=оlëØÊø;V ¬¨ó¾ù†Q;Dh11cÆÿ?Ò/äÑQ—Kçd‘œ€Íb¨`ŸzG`Â͘ý3†‚)yr÷”.\mgmá|FOÞγÂÙ½8ï ç¥Â]Y™³ò ?! d­ØÃ5ñAkWZ2˜<Êwê=–½Œ³)Þ•ùÜESNëAg…‹©ÀÒž¦„‘ŽŽ`ªrl–Ð"OÕ®3㎫“Þ3Á &:ð´­3ž.3¤<x£…xѨÄ:Sà7ˆÆ¦0œ"›G½÷®~2ÉÙ:Ú (”€´Õ.î­îL”M> ¨yÄDþg³[¢{ýËâ¥9MßÒiªª ˆòø¾7ÿêŽÈWö\>V“1ÚTÝHUÎPâùìjQ¦ˆ…nbÏþg;X•ÅËË?ƒc°8žŠ]{¸³öc¬ª0jÓ‰ŒÈÁ1b•eç!¬ŠjÂÄ]1Ý =ÎhÜûŽ€=î%›¡ˆu¨œ-FåT qÌÚy›SgÃ8¬pCõÖ$ö†kì(<ƒ}Ðx¡86àˆÔÍH ⩤ Óño7þ‹Ýø'å!îz(§‰ÌX£ªm¿HX{æ5kÜv=µ>ˆ„±D{ó ׫جè»DÊm„_Šå÷\/qÙÆèÏô’‡áC©j©F~‚ùP˜W÷F­h_;bsóI;)Ý^ºÔw(%Võ°s +ŒÊ´@ÏØ!Öï: ìkuÇäìö’u<¬ûjkަxaÐøÃwe1LðÍcꆆœì£'Ê=@fò|=8FÀÇ`(`ìƒf.†Á»&2š=¼S-Ã9ƒáø;d]e<€¸Sb˜";gàBº™Å1c† ôœÝË8PÁ`_!–粎¶¾ŽØ¥Ì8›u™ðÜU•͹MJí¡)³9·Nˆç¶°ßž[dÕvnUíTh˜º9Òƒá 9‘Å.o€ëà@/5 kÚ„’ËVƒÄèÏX.{4^Æ Á³Á[ܵä]KÎ]KÆÃ¡L^2L6«ð®1ÇÇ4÷¦&UÙfîZÿ=Z†ÇÂ({š°‹÷†y4£Çb7“$ÃXÀPQR†Ð䚥-à(/êtk–ªÉæÜ)íÏK€/—s§´?˲úöÜIìϲ¬}Yû“±L±õ·¾eŠ­f9Ë´9ªvòÍÙµLY™Tª ¨âÔUÝ©S#*Ržô¨ûž æ }F[8[ gë”!eN]ÞÛÍlÝ”:­Y8‚×zƒèQ‚]Ï. 4î:xÖ1ð¤Ýª“Q½~B¡Gäúd@Qˆ©ÏàuÞ£óxÖI• YÕ©ûÔ$ë%ñÀË“æ%[>ï`Ô §g2_ˆdÏdíe}ÆN^mÙÆ¤2Q¨„*‰*>Éú§¦z+¾þ:™pU \æ¦{JëäÒ1jš¤v$êæI•J èTµ¼© F=æÕsißøfEÛ’yF–mI’•ßÀ³1w€ÏCñé¸ã!Ñ7²©=e4嫌"/¬Í毣DmÆSŒ„-¾^̳E[I w1yLÈ´É"Ê z°D„é}O0#‘–•Á8ߢŖ¸xÃ@½ÏM=&R%pöµú­àd^„ÜXSLyܨ·†`«=ö÷Ì6«Ñ/Þ¢n„Ë‹ÖêÞJ·pÆDpKøQýsaÜ2ïxa™fÄDµDag Á!/6³˜"Œ²n»(D³WHݸòt în6e¡AP-dk±0e"øk+ê,».‘µ.‘¬v­_r,Y™«•zJ•àãñë2.}\¦+w„ çq¯ÞQwÚ®gÎň7BÄg ˆàl#„§Â„{RPl]I„e…d€ÉÒ|ž¿”+´„#în_…é2Ò±†ÅÛÅ ¶·¨œ)&Ô‰gc4áTÞu‰Þwï¸Ï¸qU;Œ&ëÒÒøÕ)SPžxWIÕ&ˆ..ÚR»PŒQ…5.*¶µ} TÄ%/f[‡•¢Àˆ½h)Yº<‘–Ã㤠INdátfbÜ_ëW¼–õi1;Hõ€Jöm[vG"ZÜkUµDjØZ!Í;:WÇdŒºuáÀd늲'ÊkÁ¸³rfâÃŒË&ÿG(긒fõ—É¢'õê=cÙ¬÷­y&ßÌ«X™LŒ€²Ùò¢ Ç.¾PL7mëj6©TÍÍ…ÞVÏ âA m/åѰ¡$¡¿iÏ(•L‹fb0êæc¡ì:©ngýäÓ{6Ë·ûªh´kœ¦R³rVñÞ]H¤(Ÿx8œ.¬2zׯ·Ô+T9.èõgë‹Yéaè®È&„1^ xe~&$…1À%Ôʼ‰`\ÿ£8V=±DŽë‘IcÞ—{Ö‘8õL>Qy´õ:Ã2ž B‹d˜Í¬îÓ)¡GÐmß‘´‘a8³Q¤¹Èâ›ñ&Q•xˆ@¹°°ü¡ÃöCúK'ò¾‹¸†³ˆ“˜.éIŠd¼$)dÔºv¡È•É–UÄ š±öEÍAœZM©GÕv·æÒ!¸!Å®">áÿ6<6–¼Â(aˆ™Äz θøšBÍnS˜£>”K"­SxWÆx¢dS&£ØBá*œŸÂÐ&£¨>ÒKÔq]Í×E=}y}dó .âÁ?Ìt—§Ô GËVyeÛ‘ ƒ-‚<í߈–~¸ynt—ì­ ~‚÷ö¦_Á\êò:x”`ÍÚY3JÞHäÖdE“zˆ‰ Àœœ[= «?wz¨ø²'¾—*ó¤1‘*‰ôHZ­âƒyý¢„óe³^E³é#ûa­˜_g¾cèyñl¤ò.G#ÉÑ ~¬žÔ[»¢£6žMÃàÄ=ðÐÂGâÞ*™íÜ=5"ÖäsžsµÅÐÓ{ç\;çÚ9×[»OonLÁø<¸ü ¼7LÁ;|¼Þ ,jѻޥx)>cÀ·•–Lõtdc‰,o¯ÂnŠ*¢åSÖA]ÏÂs&ȃ±Þc¢wÛÒ•vNøikd ¶µ{:²Ÿ%^ù1Ú”ÈÂI HöJI«Á˜ÉHÞµÔú;Òœc>b0ýƒý®¸5Mtµ®om3Ü©í(bª èø՚O{pxÄÓd_ÎãÔºåmC¼» ™ éyžC(]T…K¢@~äÊ3eA¢BÐ&Z­Ådú¶u¸þ¶ª…‘!Á"¨:¬X|2¯Ör®ŸÐò,I郸¾ª]ûJM%Œj›¶«¾@èënR)‘U¡_Øl¢¸ÿzý™w *õHeƒïhióð¯M<¶Êí‹ =KäWÒʺœ;Öq‚LjÃŽukEǺm”s ”í¦ta€›ì‘ «!ÊL‰Wc›qÚJh T· ÑŠ!ÂÅ7E_Àz|ö²/m\`‰‚Ê”2ö6DPÝ4ûÓ0终ž¡Üµ³›l*Å<µuÕ ¿Gl‰”TIåÚš½$Q¨iå¬ë¶m³SOu–™Úª¨«iÍõMf—JhžëE·Q$AÄ_—.ÒcÕˆ2v–§÷Êâ‘ØJœ‘±¸ÕngE\'´% ûv’·3ô˜gàßõ ŠDŸ÷0§3æ­ZǃómU3b »o.¶o.™?#åÁ 6’é?´`$ `ÛÞÇŒ#b€ACds0ÝGvm–ï~¨D£{"™˜E2iÜLgk‚WRާ äý4ƒKæE`Îz¶ƒ*y`O”§ Q×ÙòÔ¡Á5eqx×O±Õu¦Œé¦ÎÄ«  ª‰ÆWHË*Æï7z§ic`FË<ã‘ío1JÂý=Bk}‰ðayÞ2&F€Û™Põ<×%Ú94²¾“°n¥ôPFÒà’\¸À$Aïyd wà)™E<Þó—?cvÃwž€Q /E‰ù8VÕó8F(=Ly9O¨â ƒ}TS¼\ì1LšIÀ2}º(ç±)1‰¹".ñÀ”=$ö†CðÃqu®¨+.ãr‘©x@×Á¥,3æ—;ÉXrkh¶§*ZéêåOPß•x£±µ˜×jïG„£ë¿`É°Ü “„¿ø";L™16tˆ÷e3MW*£Ì¬tÀ¸„òÉcYb™Æ”é†ò¶Ä|Æ2-g-¡¿Ñ4xiô,¾<¦5š³ÖŸ ö¥Á±zÁ¹EC]9Ã>g‹{/˜’çry p¬iïÀ1l—y,6Œ±eºs󢃾ÜF¬€Å‚së:›së„xn«Á³§ÄÂß V}-Ÿx|B¸] ;¿!<ÞÎðOQ¦ðbÞŽ×!ä›lËÏí`=’°‰<ëÅDS#`(ໆx€yÖ!nT6yGPÿdzá]-qT¤$ZÚ %äU¸! þŒGâÙæô…°;Ë¿š—ze1ølneíùëøõ<½wõOs°À!ÞLfâ+s*Ô%ì¨_ ôuµ)?`GOõ„­;‘>ék!×1uVã‘þîõ©ÏC»~·ƒ)Þ3ZÇÌeVOíícRô¸û¹íë– ¸YÕ}tÀžmOM_Ã‹Ž¡ðlð3½ÇSýÆ‘Ä"ÜåçóŽ@ûcPφQÀ ÷Ýý~,Âq€&lƒP ãÁ#ÊABLK€€öÌöŒŽa0ÀŸyßï ¯ÿ¼d_q¯!L&³Uñˆ‡t ñªê~Ò© sêÙî74)³ÄÛÚ³²åÓñÓáÿ¾å+ endstream endobj 6797 0 obj 5591 endobj 6801 0 obj [405 /XYZ 31.5000000 93.5000000 0] endobj 6802 0 obj [405 /XYZ 38.2500000 686.750000 0] endobj 6803 0 obj [405 /XYZ 37.5000000 670.250000 0] endobj 6804 0 obj [405 /XYZ 37.5000000 632.750000 0] endobj 6805 0 obj [405 /XYZ 38.2500000 236.750000 0] endobj 6806 0 obj [405 /XYZ 37.5000000 632.750000 0] endobj 6807 0 obj [405 /XYZ 37.5000000 670.250000 0] endobj 6808 0 obj [405 /XYZ 38.2500000 686.750000 0] endobj 6809 0 obj [405 /XYZ 38.2500000 236.750000 0] endobj 6810 0 obj [405 /XYZ 37.5000000 199.250000 0] endobj 6811 0 obj [405 /XYZ 32.2500000 92 0] endobj 6812 0 obj [405 /XYZ 37.5000000 199.250000 0] endobj 6813 0 obj << /Type /Annot /Subtype /Link /Rect [106.500000 641 171.750000 647.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_std_shared_ptr >> endobj 6814 0 obj << /Type /Annot /Subtype /Link /Rect [43.5000000 207.500000 62.2500000 214.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python >> endobj 6800 0 obj << /Type /Page /Parent 2 0 R /Contents 6815 0 R /Resources 6817 0 R /Annots 6818 0 R /MediaBox [0 0 595 842] >> endobj 6817 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F1499 1499 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 6818 0 obj [ 6813 0 R 6814 0 R ] endobj 6815 0 obj << /Length 6816 0 R /Filter /FlateDecode >> stream xœí]Iܸ¾×¯¨s€)‹‹$ p{ CÃrrf2 3ƒ8sÈߪDUwSú(ñëGJUn‰{L‹ËããÛ—7úüã¿~?¾y÷ù?ÇüŸï>ªS[Wïãù÷wOÿB»“ÿùغúøÃ¯‡¯Ç¯‡O‡Oýÿ= |~÷—þ§ÿõñÏýÿ~>þíïý_þèÿÑùüzhUÛÿùËåÏ®UýOÕõÏóßÿûð×?;Ï8.ç7óü¿¿3Ñõe K=ŒÇT—ß¿ÿðÛáÍ€´UZ×Ôª:*kìQuVÿûÏÃOýãôÕÉY£L«kÛÿÜ5¶­jçtÿskü/vñVŸW×®_]wÕÑšn²øå·Ìô*Ãä­rù&¿ì\*Ê4*>û©³Jµç‹~ f]ÎÐVÊxõh"¢'Óg˜\Ù:ßä—‹CÅ_ndvÉËU]›ór§Ï0¹Ñ]FÌ9ï<ÛåâÙ%/×8å¤lø_§Ï0¹ílFÌqŽ+ •ñrñì’—[Û6çå>NŸaò¦ÉÇЇg»\<{f!«m•ÎIª§Ï0¹³_óeçÙH5ž=÷…»‘yÖmŽ+ÉÉš»:£PwÙ¹4PÆë†“ Òn§\3€§«åáó8{ໜºØ°si ø›Å“Ÿ\ãÁŸÉ¥Ýy]ãz1ÕöZæU/ÿ”2†Áð7À¼ð5òá×ÛÊVý¾šã—Ÿz¨\ÖþøÒ_F}üîlSÐöøåÇã÷ý–º?¿ü|èN®Ç-#Ê¢­Ó¿1T-ü¦ëÀ‘ê-Á'ööáK}Ù!oÍⶇ|dop6Õ„b£Ç3`LPé˜P}$ !ϼ­ÚHÞ½ßu™;éu£Åý0Xú¸-ÑÁL»DÏ£öpÃMµã6¿áZ–zê‚ðUÝ à{Xº%¯[:O™6®ð Gø5¼wPò5ôšÚmH#MÛ<¿!‘U»¥U{}Çc=”ðHU£‹ßÝ{¸N•¾Ž‚’:3[gñI­Ôm¡«²ÕåªÚ:POìÉšÁËýx‡FªwhÄ "®{ü§ÃKq'×U—ã>B»B#vøÆœúŸ\[O)ÑÌ7xKžÎÖ'£z¾ g³(üÏw€w×Á»V!ðñ–0¸†TÕéì­>ãÉõnG’Þžµg ×Ä:&ج§œæTOnÃ…'žüE·ø2†¥Æ½…OyfÓ ¯ƒÏh‹F¦/_-æõ0ïƒ8òJCL±f#Êy¸GY,‹<Î%’œ‘™ÕUp³Èn ²DøFdøNin^°®mO¼æ¤ ¬AyGA–ÂR”ùÜ›Æ;À8œMA=¥†òºevu:‹µ+¼kÑÈlØÂ‡÷†1¯CÀŸÔ`mžï­&nnñ-d$c®Õ¡PNˆ"”dŠÉ#Oc¾…×Á#ñU˜»'pNBÚà {U}Üñl›¢öL°Sϱ¼á9}ÂúçFZ«z"ÜãÙð7oÑ7ï ƒ³ 7¤ÌiÐHžÌÖŽWUufå^gT}ôDõñ8¯šñ~C=sOíÚ“™ Ä°Ns2J¸ˆað÷öpE×ञïÎÍVÁoðÞ DN*f}r€vêAÜqF?G×$¹×#òœ¦„gÃß¼…’&³8›G–¹oFÖ8ÑÔB#>)^²¼NÄ|ñΣž^ùš½]…É:5dFW3þto ²6¼·ü(®êDZf$TvÜè‹àŽáÁ‰¸·w¨O_‘„»Š`KvÔ›WÏ] ÙN@ÉkXŠy„3‚ÝøVŒx@a¾LÂÂæÆ2…uþÈlXˆ%LÌÓŒJXbœ˜q±ØI˜;Ý3¯]B×Mð2*ìÅ–¨'VØÛ‚Gðp¤öÚb={ ±Þ g«° Â-¿)ÎV!åÖa±6:"“[Jq>䇲3”) €‰¦4ë}K Ø` ªF…Ñ´†IɺüðI?@ùkxd=keü5˜åaWAeð…1¶+F¼ÀpÔgI›óm/¹Ž2LJ4!Æ!Í4‰FF¦þʺ·eÝ Y··Y&Š®147?<Ú‰¨ OÀÄÈsš„ˆ& ³_Ñu&òEdK˜]!$†ðyS|c ’€ã ”dáI1 d¢>/S!q,bJÖQõÔƒC檫•>´¨DÞF3Q|aT´ ü&áú_`¹)`ëôâ#˜Ò±Â/–AAüpÊk˜ª²ÄdƒÒlg‚m¨HÑýS°ËÍ?½Z5ÉÒTëpB­Ç ]¹'ÖG›ÉŠøZ-¶úcë,VúÎ;% X{f€²¤Ù_©Â€jŠ狼ܣ9'=œË<ù‹_Ÿ3¡Ðy¡€ã[ÁÔ•y |Èé2@øõçt:h®œjj§Ã×zï²GŠZ‹K~Dã€b¡Ýý†B¼‡ß@w´¿Þ9‰3 èt^t-Ï9Ñ—,~içÙ‹ë?'"W]ˆÉû*˜ƒ¡¤Ô›îÑR…USF„KQ¹…1ñPÇ(@˜…"/{X$²[¨”AxòþÂØ€Q#ë`D\oä  7”ºÇhá”—p™œAÏÆ§ äÌó2*às‘}†8bg6&颦' üäY@ÚaÞC†4yÜø øÙ31ØìxŒ&Ì ØÚ“&ìÅâ±&ù;‡#·q{LR$šEÌà÷ä¹RÒc:‘™˜œ« ¯ÂrhÃËËü)·¶ ¼•Õ·cl¨/ŠF6D()#ùÊ –F‰{;›w, ;‘†ÛDÙ+íºð…ãX=œ–cqlŽ®Ã±mxo¸0Q |ÏM½ y‚ŽsÑ–FÊœÎÙœ.Rù¿ |îoM™Ãì%AanD°zç¾ôÚá¿¥¯›X F\FlU;–‹Nç“‹’T²ÍêîЗBY6¶Ö÷ïVæ7åè†6· XQ˜IâÛ‡t¦m÷ü!Íq[x†HZ#¾-xÑ»SòW@¤ÉS«×,è’X Ü…4£]{°Š`)¡½í]Â4Õh?1¸n{¡˜¹öܨëÙ’sÁ…»õ¿÷2St»lc©Ðš¼îÃ$<• ³)éN¤ãRñ.ØÁŠñ{K#·Uö9ZÞѹeÅgÆø1ƒÉ¶#Â͉ÂNÑ[x0”vsx׸ÑÌMÞO¤â S§ß)¤.‘“âª/x¢ƪˆb€wÀ´þc*ß00€ëÈùµWp#3¥÷n`¶õÕ Í„Û«Ó²œAcº¼=Uå L½)]çÛQ3-f²\G¸m©èËØñä›~/¸…üFžZ_-NÐÇ$X•J?¹“ñͪUQÑ , ­¦dú0AÓŒõbÏu³ˆ’n¥ìå«ý“Mø0® HæMÛrò–Æ*±¦ ×Ü<º@´Tÿ’xDm¸8Á’ÊZH¨¾½DÌó’‘f(ôôTòâEÔŒªiôü#Nò`Nã{V§]_›ˆ©ÐëíwI.J™p ‰³”(!EeÀgî¹ÊˆÂy{¡0Õ¬²ä¿å¥2]¾ÞWa³îVÓ¹?tŽæŒ™sã*]‡¬ ‡‚Ýr‚OÎb¥ø¦hh1•õŸPÀjQ)bÈ0nËØ®˜¦X¨|»¥yKÆDÔîzŸø½â×m¡ç ¶bŠñÜbüû"”I”ÊQ³7Ü]ƒwîgl”[ÆÅ[æ^i^÷[û²ûs°çêÛI5Ý>ê«dˆucư÷m騂_®y,Ÿ@Dùb«›péÊ;qh‰¤Æ%Ôé–uMòúäSTdK›G™cbЦN¸¯p!7&(£Îĺˆ.)î·v¬ €p" ‡c(ÖJa ú„ƒvðf­Ì:KÕ"XÑÁö'¦ Ñ_ <¸Å—¿ÁqYLÑY$«àÞ4\'2‚c‹±ÌGÄJGd8›ÅÑqXãÆz5„µ§†™ëWµU€ÌU€ Üu;aÒ ± )J8h2¢²cÂ!lJTo¹é4‚2’Icß&VxÎoß‹±/IbÀ#wgÄ(æ‘Áp¥(œº@ȇAÃóàDR–– 9eÞ³»¦·¼j”¦aˆ¶âû×4Ñ_ ¶½ã‡/ªÈu4‹…¥VMayuóŠ’©E®º6Ð((µ8½œÐôJå¢#„t´{*÷-*‡óÏ" V¥¶ÕÊG*÷’{£r»Nsí5˜ ¦¨ì°bfÇŽp(–låÙ~i d’e;HzÀhÇ$q0íwòá 9 ï­’TÃÒ™à}‚`”i£–ÛÚ^‡ æµöÆ-3Tx#LdHBß"S Ë÷šÐœ»céíåã¶6DT…õ<‚  Œƒ»ÖpŒ3±ë- „³íjA5“bP« I.&äL:R6€ák ÃÆ) ݵŽù« ޳Áa/Ó ÛàÑ"â2õ0¶>……GpÈ6 ±FnÌ®·ŽªLˆ¢vH…ãl°8‚¶„¾A ¢ïÞ^GV$‹Èq$é³¹Õy±ï”ÀÓpGÕÍ’ËÁ<ßu×Í `WÕig&òÌÜHëåÊ@‘Ùð7oÑ7^{œ›­ƒ³¹Qä ¯½”ÞžÌD>óE›Ô© =©íxŽÑœŒÒ\là:®S¡o4yR¿|õ:‘Ùðâ[¸–ÁšÕ°nÐlž8Íí` êeÒ5ë@<𞸙o¼`n6a€1DL\Ž»ƒ\ÿ‚Æ% U9³×ªTæËœzD©ÁŒâJd×d®JQûWÓö#Áu4ñPáõð}WL+ªd“†…U{|bÆ{FÜ~‚¹”yWGܬHÅÐÈfqž™…›Å7íZ“l2üO™éoϺ } uð9œwñÂaÜ`üëkŸQ”uÒRž˜êƒñ©”‡[køM^—Qä†C0Ö`Ñ(æ™SµÕD›Qp»%±wT§›•ÉLÇ%ÊìYTfX_Dçõ€ñt!g5´jpÒ>Õe‰ƒb º0~-Ìÿ'¥‰sT˜Ü0jŽ ö’¥ÝT»I¢6¨0õÃú#2&D†ˆÆàí Õ"èrø”Þ©gônø›U„R¥ÖìXhk¦}e ÃYÕô¬ý–/;v§óçç’³Oÿû—ÃçÓÈÃmºˆ 6 †ùD^«hà*Ó¶Yû“¢“ Ò"À›UŠlÁ²†Ø,,06йâ {IÄŽ•kÉdœ>*W‡làβq„›kãÞ°–e…bô\âÈ6Ãç¡#ßo\@~O‚Âm‹©–wDšDø[ù·åÊ8tiÊíFÊíã~fðlø›· Hh6o7ž»U‹2£ .aéÜ„Á5_|îm)ØeŠmÚs³Uh$ƒz³çÖ`Мôà¿Zµ·Þ0À{óQQù#u”nŸwÆ1!Ìü¶Ê¹ŽðÌüÞ#¼2#Ž˜Ð'ƒGdUœ=:‰×ÛSJ7Ûcbx¨––"ºc³Ø\|–ÉöÄodB˜§AˆÑ÷•IyÃßPªÞ†?Ûé€ï`LcJ+ìÐd˜àÌ£: K˜ˆ„k~ì/ÂvÌ€7™@[Ì-!jl ©až8cM›¾€Í÷9s¢u¨²P±ãË2$$fKDê1â’H‡ûRþÙ¨œ„ÄôÊJ¹h ŒÁ’ 9"Á8x¶Kò}†›Üˆ|5yr„À Y©±]T¬@õ’uÍ6/8tD3€bZ!r“àØ5Cxî•uH¤ÂYÌ™˜26H‚ 0xN9‹×Gü2þ½›¨SƘ¿Aò–"gnM«Uð·»%±ßŽtžPøKDïÞqÕý‹ë›ÛÎdÝ“Â|KuÏ™&¤¥z¶2³IâºlîÓ" Éš!WMx­Dn$X*£L"|áŽT’G‚[šPgÕ$wׄ„ìÄÌ1°eSs—Þy3ö5¸œ#®ñ&Ú ”ªHT:4ˆÅíf‰*¬‘¦²x6Ñj‹xo¸n®Cˆñ—…'Å÷“¿œ´©Âw‘ŸéšÊkî1@«™ ”¥4*&[ùV™óŒ9°˜»u‡AQ!+§BO ©$†"Š(EÁµeK|º)ëÉ};sö†P]ÈÌErÊ÷Y@Õ‚=dÍŽL%ÊtÃË™\8ٴƼ wÂùJ¼R÷ëå¸RU†d+É”~Hi,$“‚Žåš©8}®?мW#Ç«‘ãû›0r¤µnx(øšŒ[܉Ü=n؃ïã î}†w{êà»ÇXŽz-,>éM¾Z©ÓZ&‚;˜®ã@lO7"·M4·ÁüCcNÉ´½a^0ÆL»‚t°3CŒX)ŠoQú9äϟߟ«õÞ*µˆ%³9vbã—5tï:«o³TÛ×ð³×lÜè›ßq6n¨`­Cž(AHq£‰ˆ‘0S=ŠJ4θ—ºpbÖ#bbãlˆ X¢ÅÚ*!SG$t¨ `ý%Ò4Û¥ þ²i¯ðj"FRæ ‰ˆÑLñ"¢Tf@¤´.ÉU A¢«¹6[ “Lqv*¾}à9#:%~¯.ûr6wêX§ôO¦2Ù·“ù• 5c¿3öõcq~Ž2@ì„F/?&R4¢*K¹ËœÉ1>œèº¯tþ^è|±Ò,™«Véô)¦ã¥’)"Õ¸µ}Ããs×%?^UkæP~nd¸²æÔLº•ão:ôoÏ¢ZÔÕkn¶÷µB¥fÖñ|PÙÓf•›­¾æ m%TS‘íY:‰”Ž–­óš`ˆ‹q01g Ä¢Q”v‡1œ‘…P‡ÉÏ[ñ‡²` ŠH"Y¿Œ.TýˆJf*z‹Ò°ôº>Y[«»€½ Gñ2-\ ÿL‘|‰@_Æ`²ç.˲ÆKJÙ¼™,»–Ö¶/0—»6;S¸LBn”‰ößüÑì:6bc<ÏZ?¦ËÌPeÓ¿n€¡Êzd[¼1®p*¿ ߯ ZšDsF%²0órq³,=Ö.sšI>‚‘1¶ÊˆÜù>ýïã×Q8}Zú+éfËyôg­Ôùb/–Ìaß°g·.¶3g€¬aǸ™^r>]OmˆZÁGü­c–> endobj 6819 0 obj << /Type /Page /Parent 2 0 R /Contents 6825 0 R /Resources 6827 0 R /Annots 6828 0 R /MediaBox [0 0 595 842] >> endobj 6827 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1499 1499 0 R /F1409 1409 0 R /F9 9 0 R /F8 8 0 R /F1700 1700 0 R >> /XObject << >> >> endobj 6828 0 obj [ 6824 0 R ] endobj 6825 0 obj << /Length 6826 0 R /Filter /FlateDecode >> stream xœí]Kã8’¾ç¯ðy€v‹‰"0 ÝÌaB°‡ÁÝóÀ`z°µsØ¿¿²%9Ó”>Jü¤d§«ÐY–ÅGD0Þüñ_ÿûð·~üôõ¿ ??}}©Ž®®ú?‡ÓßÞ~ ÛãðûÁµõá—ß^¾¾¿|yùÒýÿûKÿÂ×OÿÑýö}øS÷ß?þ¯îÃ_‡/¾ðÛ‹S®ûùÏóOïT÷[uùyúüï/ÿù»Ã¿N#ŽÓ ‹¹þ÷Æ[­›Ó2¦þþ2nSÿþû—½üØ m×¶¶Öe=¨îóÃÿþåå¯ÝãðÕÑ[¥\c]uËDN_fÒ¾ƒM=™çüWft•aðÚ6ù?¯\(Ê4*:ø±m´³uå[øûM»jºpYí2Àì2z„8íò ~^¹4PFlÃÁ%ϱWÃI33 ãv]†Ï}¯k“µç•‹CeÄ-]¹ÞT§Ó6ù}>rëŒ" _¹8TäFF—DnSÕùxòëè9Àß4ù~¿òL<.‰Y1äóAßW•ÏÇ“û•‹CeÄ-]¹¾R£ö™Aq~3zÜj[åü¼ò<Šsdðck2N×ö„å†ë¶ÕÝïÎ n™¤˜kr Äg“‘¾2M6ÅyX¹4PFl‡ƒI¯¤ÿädÇ«©ßÍ}¶ÐÚóÀ‡ß^?PǶ=±r{úéToȵæÄh†5ŒŸüÒ½¤Jyݶ¯ßR×è·ÓœÞè?pþôâ!Àµá4Ý'§—®sþVs=Ls=Íß_>þ.îÈøÜÇo/?þ¬¬ïnßþÚ!ç ôþÇ·VªôÃy¾úðí×Ãï«JW8|ûÇ‹?6º‘Ô?15|ò|ò3z¢?§?1ŸÐeÎO~úÖ‘Ü­Àª°´¶°”E ª<|ÒÂMàÑ €ñ;¯à# ® ¯ºÒΉÑðN#£ÁTÈTóJJ7²$ï¯YR÷–TW:à§OB–ÔK]£ÞNóÊ’|;Ç’¼ YR÷É„%¿Õ\Ó\OS†%Õ•]dI R²vÄÉ„ì¥R O23eÜ)ãÒ rP –t¬¢VmÀ*”ŸcZ…¬¢ûdÂ*ÎßR×è·Ó\XE­Ü «¨;2 ¦é> YEÿ­æz˜æzšB¬B›e\a¡‡7­úŸ@Æ£à¹èÓkföblÆ=³—Å㘦£`äc‚Á(Þ€ñÜFˆ&lÕ“Dg¡ \½×°Uulœj]=Ù@}4ºU§•¾>é-†Ž‘ØæôÊ›'ýÚcë«æúöüúÄÂ'x8ÚÀ)ÚzÒÛ†ƒ0°pÄê?¡wÔgôΠ`%½£~Bï öÛÌk ž0n¤»ž©úXys Ñp´·JÖ@ÔB,@œFÞÁ;ÅØÆ‚)Ï’¦Âè7éO¨£Íl¾3( s+À'yr^ñWá’ÌÀ#ÕH+@lð. Ä_%xJ ßäŠ1)Ë'D 9Õ¶ŒÂ²¶:–fT\SÜ‘!NŒxÏ-BDÅ J³2ãa^±$†‘ê– §ð4( Ù­È5‚R<1Á%1ž0P"xbHTT9‹5Þ¦Õy—¤?A®/1¼0üÖŸˆˆ'H42äG¶àĵ° „áa –Å[È(ùTw¸ÑA'ÆñÆ*#i{yõ±DG £©­gNÖ"Pc®9\ëEzdF²b(Mø%$ïˆÅÔõHÕÅ"Û`N6^5A³”Y€Álˆ9f—Ê9†9cp`z`ؼ,?“PÓ"v4aaËJ8Æ€bH3²ì'&´taô‹Z›ºë:†PäQŒŒ7Q¬Se‚ÒûnHŽ’é ÂpâIÇ~¼ú '•õè¾Êû 6FÄ?6bƒKÂ.“U(¹É¸ë<ž o‰ÒaI©X;[éY=„CÖô©u×Þ1НäôA¬’–¥TQQiQ!˜ ã=•2G}˜Ü„]Ÿ¨p\¤®ΫZÝBêŒa›—9F<9ŒîMœØ2™69Å¢«CÚeB„åQ ž™Gøl-ºæ”˜$œ‹IçÃzµkêØ'bEö'©SIvÎ{­.‚E)‘tœÍsÐqæ<,&ˆÙàZ%øDÃŒvW­e×sÝñÚ"¹ûø\(ºTj!›¡ŸV#€±@TPDŠW |‚Ϧë¥J»ü –«ýHÈ _ÍüžŠÈï°B"ißAp¦6ñPIäw—Rßq<©xÆ£8}Æ…lN 7P(¤³ËSq~T+#¡‰4´bìK$Ä´[Ç÷*ß ¼0æãf¥„åü°aýå E|›LÔš)Ü“M'ÈUÑzŠIH …I  Ü£{ruÖ¶]/EÃìT¨N´üJF|bþŒx|d Z§‚jDESk!R@˰ ¼XÆâŠ(ð²tÇ$ymž³çœkÆÿ?¸;ç¤=>6XCÀô&ÑËâÙhFyæ½ ä¡õR¬[4ù3è”|BÂ+³gßà œ{J‰É~G+¥ÛŠ0ñ‰”Ķõ_•óìµåg»£5gnßš ·ÿyÔ†úÓ„8瞸ÈÄ¥’Þb÷sïx8χ‘Mö*Ü›'p?C£³æh΄1=Ôsk«.ZJ 2ïhøïtÔ“¦;\s+ÀkÓ:bC´TH´uúñI²Î6Ãù®n©Ðm•h¢Ç±):î ‡Å0ãÈšl]"3Ÿ_²–n©ïVÂ"9Xß *O0 #Ám•ûˬäÛœ¢ª­YÅD±#æ%ÃØà;)‚A¶)Á¹#’hâbšXŠöû`°žÇš z8‰&ì> h’ö̽²Î­Ü*®vžá·Þ„ƉÜõ ±i](gÜh …‹!8•ðI…OLˆh»˜¥b~.Q¤| ×» æòÆ<)÷øeO’÷´¨Ê©ùS:Øý¤ÁªÄ5ïØÂI’“ƒ sV©¦ Y! ±kˆ ÄOØfvXgg¤ˆy"¹ -"¥ “h(iÊ•-ú4b°X*àÙõjq1÷(Õ„Úµ–JjߎCJ$cæé? Èúo3÷þðKïÚŸ ŽÉðÉq3²OãízþɤO3rl}€E¸áñVHrWè•Ê,Næ­j¯[7¾y—*3†EØLAµÊ®+5uxØ…«|™‰˜iJBg©#MäR%Ž{éÀ›‘n[Õ†BjÏzD!½¹XRæþBT»ŽÆˆ"ŒªšJ°xD»>î°€2°™ÒV¦—s°dól¬½²EéÛÇ.ó:4M¨ˆÝUX´`K*oëkưËÔ/v¦Öle‰fU‘'¸‰ѬÊ|,ˆáæR [01Mº"T))Bc¶ DÚå+Ç#mØêô'JÀwºã«À‰³ihF´n‹àÛì̅쯈4 cš“Áý0ç>Â/sð¤§Éw³Ýpšî“³H/ïT¬ cNìŠsRˆÃ)|ºñIŧŽi¿Hp‘¿Téû¡šzb)J@4²,gðQ¸Eš”2˜{D{é5IçR4†¡ÈhD,!¢a=‹ X†ÿGZ×bú/¤•M¯÷ÕC}¬äzÔéi?ëþ£Wï@·Ú…Õì•©×SÌF¼OÆÈÆ„6ç¥:qÞ¹ðMʾìi×ø€Kì&(›³©®v!o|wYÓT‡|ØaV(–›r7µ/‰y&L0œÝ™þL:ˆÒZáðãÀÁn씃;­±‹»Ò‰0`?Dˆ2ð!`ðH‰$ ­Æ1ÀH§aÆŽÃ1×Vš¶&zÕ6¶qdJõ ˆEj`¶»¡;DûãýPz¬¢Oh‹2XÇà"¬ŸGiÂ.Ú™ž±0 #º(uIÞ„–SDõw½‘Q²ôW3MVFÉ2šÌ¥á\²—ÝÕ]lë±Q7„$®\§IXñ¥H4!®0)Tg‰ÈÞr“ùøÅ.bÄÙd±²xB%Êb2å¼¶¥[W ks_¨T(F!Ùxò’†&áuݰ~‚@…va`îJ5©7¾:mõ0ã9‹>©0k '¶‹r;<8sª679O’ò¡ÖzÃ^™‰F«úÍÀͰq‡Dšýì!먲“ž1*@§\ fÁèÔ˜·>¸‰“ÌÆKé „½k„w/¶TO‰; D«Vt²›@]ÆÃ¡výþÑ™ûß1ì)÷q¡öX-1†êgEüÖŒµK\æ|CWFFp*Èl¿H­ t eÜÉ&¤1žýû¼Ðšéõ$쉕í=›ÓŠ÷Ž/´ ô%ÈÀˆkLô`¥$?‹ =dtÞé@ÐEè § g™rÛï¹l#áü^Öá:5x¦/fÏ–2m¨pݵgËÀà!~"à(S4ÚŽÎÞ…ÿŒœµõ]uU-稳—Li&ž/ªË—R²Ë“fê‘ïÀ“¦¼ výô¤­ÚWBº ^c)&ȨcDN¨°™à,ôÞmƒþœÎÙ€EØ1i{€ÂîNdZ2’gQ ¾-ÑoPØæYŸG%ñ¯g_¥ê ¨fó Þ‰Í=…Ûex1©Ù¢+`jÜ#Â$!Y´ûǾ^Ñ[Dö¦£rô–’oÒ<Õ„Í$\MR KPé@ÄNÝH K8Ád6¢ ”Ê¿ àë¼R* ù!D.ÈaÔ¨HèqÎȲ:÷Ê‚ÞòuÅcúOV1'•îßj–µÿ¡2;éJ°”Þ,LŠ7vÔ»ÕŠÚöWiFŠˆï‰mÚÀÛS«šRkGtgšóÇÓx¿½h}õÁ?_¾Fdm!}ZBpàeoÛ«MÌ%yŠo!C˜D¹ADõžæÒ½}Ú_{P~–°úƒ¶éJõºŸªŽýYŸànî‰6 ' ‚xgØôÜ;¾sñfMBx=¸£™àîtèV}%?íö›îôMÃ'ý9iŽFéàÄÜ}¬ Ìvßcs˜l>€|Ž~„£Á Ó%‰agÉ×ÔŒW¹â 'ÕW`½èc®BÙµ[%_†a,ûÚÖBeïgÒ}rJÏÖ†;Ø> $ëRb,W¢<ö)J¹D£NT:¦lššhÚˆå°çTôõ¾,Ë¼Š‰u&ä5ªÈ´.˜v 7MSØlò4„7“ZFÇ`…2ipËôpGªI­_D Z2¤Wí ‚À`=£]àËsPÊ®¡5zB£D†ÚSy»åÍ ýÑîWys.´'kxÏL°èÇîŒI¤yEŠ÷ëîrÞz5•z²]çU2¯_.½]}v§÷võ;LKžõMR"°Àt!ZÉQȹ˜b—D‘„XÙò3¡^5!/q°lííoÎâ¬/à¤lkIjJ©lg,gÙÔŽ  ?>JÔï™Î'}ü35/I-¹áf³=ßB]_´YΙl“ŒddçLv³:xÏT•ûZÅÚdy}ÙÑP—2Ó™i ›`Þ`®QFqLáëZ÷ˆH˜˜‘<›ç ïàbz‘æë¢²aâŽàeî£%‹[Ñû‹5y)äÛµðʯÇ(+ zv)+Û¥,†#ޝh‹tp„a(|­xäÒuâ²úüA­Æ‡:×ûëíX8í#ÉÊ^»: †ŸhK¦p-A)ÏÝ „µ§9#bÜ ‘y² E߆BqþÌÒþt|.×g¢m¯Ý=È•ó2w|Hˆ*ÙÛ?ÍŸ™‘–²3— -Rs^åyôÏÙà÷“Âåà äÏ 2á”|îAæòŠJKUUTs{h(¼¨CÒÝuB û+q¶rwÊD²GûÊŸ#kÜ¿Õ>ód3Oì8¾(ƒÈh—GF#à†™ †[ Ÿ`¸ çOž°ŽÑ(†¨ë¶Ä|7ÙŠ[Œ!|5>gpßV˜Dø†/|RA?:ºNŸ§Æó0;%ømdm Ua^•þKã ð~ 4XR¦i2%¥«{rü÷¦sEÝ=¾31ëë)ç‚Æ²y—Ø'WªÍþÃ'Aí/ÛF䚚“¼Ac]Ý÷—úßÿmU@™Ê“"¦7¾-•s¸ÛĬòá.Ù«+"E“_™t"aIÊäî¬ÏDŒäɯ™È*RÕ#®wR¯“3OJ‡¦ÕžipסÒRÉî²D¿>“©œL1áî*ÔLÔ…oVŸi…°y1løDµ4º2!mb¬Ç¯¯Ž-—‹ÐñnçG½õ½åOÿî]ùw—iY+·ß§×ÿ±¨bÁë¯Ý%ͪr¹+\w¬ß§Ü—m‚AÕ*N4ßµB´+F¤©SYEíç^ ê0VT^õo3+ ¤Þi^ÃXêAÙfiDe¹z–z8 gÏDžÀœjµ ýˆP…‡1ÂóåqoÉ"’âˆÓ_°2$Šü '°Áyð“ˆy…‘ŸDFƒ†Wd4ü›~U:ÜjA"[d=vL¿ÏWøÓý=|ïÝË—¥/¬Ð~ÛÙ˜p'À+uRsÚ^crNèéÜÍHˆ_ú¨Ï1¼él¦OÌçá&¼þYã …>£yÌR©ìÜÚ~vŠœ¶X—°!c}¾™np §¹áÝ‚HŸÙ†Â£Áwa¯’¶î^É–%¸ÓïÝŠGDCØ1$€ßÁ$`>!ÀPàCâõ-3`¡ê*sNäx!@ði¤éÀ›–øÒáËËÿ¼} ð endstream endobj 6826 0 obj 5895 endobj 6830 0 obj [407 /XYZ 38.2500000 604.250000 0] endobj 6831 0 obj [407 /XYZ 31.5000000 387.500000 0] endobj 6832 0 obj [407 /XYZ 38.2500000 764 0] endobj 6833 0 obj [407 /XYZ 38.2500000 604.250000 0] endobj 6834 0 obj [407 /XYZ 32.2500000 386 0] endobj 6835 0 obj [407 /XYZ 38.2500000 764 0] endobj 6836 0 obj << /Type /Annot /Subtype /Link /Rect [43.5000000 770.750000 111 777.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization >> endobj 6837 0 obj << /Type /Annot /Subtype /Link /Rect [43.5000000 611 535.500000 625.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization >> endobj 6829 0 obj << /Type /Page /Parent 2 0 R /Contents 6838 0 R /Resources 6840 0 R /Annots 6841 0 R /MediaBox [0 0 595 842] >> endobj 6840 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1409 1409 0 R /F8 8 0 R /F1700 1700 0 R /F1499 1499 0 R >> /XObject << >> >> endobj 6841 0 obj [ 6836 0 R 6837 0 R ] endobj 6838 0 obj << /Length 6839 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯Ð9À¶Å‡DxÆv€ <@‹o6Áb½ÈdùûQ·ÝMé£Äê"%õÈ{ÆÍU,Ö»ŠÅþúì_¿gž¿þ'ûÖ~þzȦț?Ùéë‡ëdulÎLUdß¾Þ²·ÃËá¥þ÷íÐ<ðõù¯õOÿËdö—úï/Ù¯?ü©ý¥Ó/|?aê￞¿[#êŸòþûéóþö‡ì·ÓŒÝëZ`nÿÿƒ²…°æÆÄ«ßÝ2Åùë÷o¿>4{‹±¹²:ZÕÿX-³ÿþóðsý‚núühµ¦Ô&¿çEFžÞTæõÒÖ¸)ï9ñÌ.bL^ƒoòäÜHªÞÉ9wÖhÓ §0ðÓÏùU®âM~†œ)ÝÎÂÉ9wÖzê¿üºLÏ?¹µ<‹¶µgÈÙ±Òí-žqs…:ž@¾ÌcoU^Å›ü y$Œ'çÜYUæ zLùÝì1¯UÂäÖDÔ2gÈÙ±Òí-žýXi%”‘…>môi“‹ª’õÏFµîZ—ÌegóCmp7Ú®¦0¹0ñœrv¬´›¥,[ìË<‚Ÿ}™>þuOT4³c¥ÛÜÁì/!³`PšO@ïÍóàÓëá×ڢ)³×ŸkÈÎ/l¾½~?èú?µ©s›½þ”ý1Ï•ùSöúËÁMY”²8Ã׌H{©Ž•ÍoGr GžÏ#Ÿ_k,Ü·qq| õ®:køÒ®á L~ ‚#ÏhD”pÄÀÙ,‘p$ÿ Gäl øEÈ5'Þb·Å”>jÕÄÆ/ÐhHÅyD‹š³M1\uqT²s©ªÙÅêòF á‹'w’)*š>¯Üé “qªÃÎeD!`EA‚ Äïñ ÅÀ¼L:˜ÜrøÌùxŸà2ZÞ £‡‘ù±4âô"W"ˆâ˜[u ÁG8[C¢BvCýˆ.Ûõäsé.¢ˆÐÚ:"Bj™ºÅ•ø«´iRš‡6(ÇE*^ ‡\)LæJ:¬„=Xœ:_|y Ç+&€DCš§°.¤¥; Ÿ9Àb,‘(¿ã<uF`ñÞH&þ¡lÁòˆ¢¯Œ‹%ɪ=’cËfŒs</GOÁQÃÚÊ8V~á°pð¶X¯ÿ  PÍ–ìŠNô˜ôc_‰Ù i W<_D4R*•ËaEáM ø;Ì’Î\$еˆƒ’˜'›DxINÿy3"DG®$-…± ñã1c Ø”f¶F ?Lnf…kµÛ”ØlI§×¤ µŠ!µês1¢Vç8jöý åÍ¿¾&¤ž@p¡çñTV“‡#(ï¡8Øø &~G×°å= L¸•Â!Y:aU™°£„U6tUvt%ÛOÔ´Þ„ݽ1íä@@žñ@`Ñ3²è(ÎU íÞÌÖŠ›“Âp‚fŽ`T£ÁEqlöð긞–OÊ£jXc<¡ñŽØØ>D«§‹Ü8èÑÆ Ì·7IAŠ©ˆíLJɆ`â” VJ!»N‰OlaL¢ZByÏ’j¢d‰àÒUgE5Áô °@Š.OèMõ†E¡ü˜ú ŽBð¸ ]"q©†BzÌáàD® jh9ãx2b5̇ a,áØß32.˜9h¾¾ÆŠ$¾éM>­c¤è”íìèAú›¢ãçË#’a-¡H ÷ÐêNù4Ê®jEMQ®®Ê¼s”Ì™zZ‘rÝÁ¶teló âê–…°‘:¦’ðF¸\­ñnJWìWðW1$Û@’Bº€52T¦¤”w@ÞÓžÖKã} Ÿ-q2"j7¢vÜÒI ý9Yl•J/c=£á3x¶'8ò G`·Z…»ï®¸ž•⮸x¥¸Ç.^éw8×£ lН°qš.LùÆÖCcx=ñc„Fö ((­ÆYü°5‡) ôKhÂmƒ.ŠWôÔxQü BßÝ-:Ž9aŽÆv ŽŸÌ'ƒÅU¤´UÍÅœÇw@=…­XFþDС-ŽõaG$„Ú3R°¾GÄ×ÕB[ØÏNY‡,$t-H&ëæc·GÂ÷à‘£_MÅšp$I0"1x¤‚ñ;Ju…4Û½aæj “ãÒÝŸ=ÇÅìnì÷»SÙ>̱øí3žgàÝ/íÞ ÝɨËáî<â™­¡EsTQhÃ×C¹3ß>ãÁ[Ë©rð\ Þâ箬R€,;t¸[èämÁA9§AH@Dv†(}8U—eV.òñoɈ§Ì‰ÒÕ>¹­Š§ökª¥P˜ã>(þÆ>Öû>*¡a©& ÏFq)Äb]°)è±Qµ"ô÷!5 ÇÈOäõGI¢DÔ‰…(¥¡ˣ{͵¿w°$km¶Ÿùq8£ÍÛª¼¥Ž±ºX?ä)~ÃUBpŸRP¸VóÁÏ{ž’a^Ô sžTÁU¯¸u‹c#l€ø•úü&;ƒOÀáÚ<üJ™*än‰9ˆP?ÍKIŒâ’SF1<ï¡H8LU‰vNàjù©sXKsºV“ð0÷c–OSN>š H%U—ç¦TÒnù•b¹¡–ÛÜÓµËÁJtëÆˆ¸àºÌãÆ2ñ¤Ð®jó{Öáò4?i¤Ù­SºïšŸ¢ÂãO°a:Ç÷ iÁDHîâü'zA)ú„±$J‹ìå›ñìù‡Y0òV±¤D¶MÕn¹®qÁ ¸ZB«Â‘ÌÌa¬Ó*蘙)]ÆÏÎ4õ:Wï\k~ÉC|Ea\Äñúók!¾±Ù¢ß&[jœ,ÇÄúÔî8u‹-¬©ëÂ\É€¢ÜضâºFÊ!0Þ‚Û;î«Zò”Ñn ­Ï@‹ÚÃÒÕ“Ì-¬Vã”,ß1v7ª[¢b zÇÚ2³íŠ ¥BªÈXÜZÄQÿøv¤Pù|C’Òô‡tèŠr0“Ž¢˜¿Uì-é©VO"ŠùÖéwo«DoйØAÿ½·âýÙ©»¦·{oŽ·b×[ñŠ,ZîK$â D–ƃŸ!D~=°AúàØ³§Ì ’9_ÏÃŒ_–;ãßÅø ›¸füž,˜{pá”ú¥1fUV¡$V¶ÈªØ™ø>í=U¡´I&¾níŠk;̪p¶#ñ}e¥{^Xê:Šm]ñŠ=HJû"ÊÍ~,¡áö–M«ÑÍ…>J·G%¹|×ÉíJ2>¡lwÞw6§œòÔîb;Ú>”óØy]>zïmñó‹Ø.óŒì'ï’ÖpkÑÝâ¶sm:ªÀ9·‡ãçýÝÃ>I!¹ªìtP|¬þ¡[ýB]/9Õ5nº,º„#ÁYK·SX{Æ¢gZ£nd¤ë£¦wP¢‘®wÕp¤5yÍÑV³aëz¼ ׃aëz¼À†qðĹžTØÁïñà­S†¨jqŒvŒJ1tV õzÖƒŸÁ°¥:†UÈþ~£¾%áà\Ëå¸í ¥‚–ám†CÌ·õ$ªØ ¸pƒù Øü/Yo7BY1)ÒÁqTÀ$¼Ëà˜ ¥Z„7ŽæéE8TÀÅâírЉ“‚”Áô‘ –(×…gZû¢éښ‘„"f)ЉKÐ{<&JIL.LÕÙEË7™Y<Y>€ ±ûŽWºxÓ |sðª¡ÆzJC4›§!ëÂõÜÑ&)t°fžGÛÞ¶MXàg ®1×&Lr”¢+•ãkü4)MßõiÊbH‚Ó÷ÝLÖC“À¤:·ÅEùF*^o*¡b0wõœÜfR ]J‰*ŠrSöùêT¢¼µA*ïã=ùß`¹ùpJŸ^ÄДÝñ°[ALó1z…СYHâÛï<ÊRÒËJç,G?žÆnOV:âÝ£Ëñ‰h—zlJ ¶±UˆÝèéàBI»”=”«±òÜ#ÁÛ‹W½#í)PÄ …Ë›°¡KˆÛx !±#=l¸SŠ'=¢cj=ivØæÓ;LpŠ)WçxÊáp¬Ÿ°÷¸ÌóÝ)!Œ$ÔgåžišÃMžlÁâA®å! „g–B% <½I™m‡쌖'{КH}XÏ@Jb¦±mríòxKÀ›þ¨¬ï‹oX_›GRw߸¤6Ðln°Ãø-á*ßd±°8…Œ¡ÑTý¹§‹ItHé°îEÚì„á™3š°–²l Œæ'rq?Ša¦aS•®Ë’Ì/mdñº±3Û„òò «{dÞ÷^Ð2Ý[Ååì8!¶óº®xÝMÍ:Y¯ 5}¯b*^WéÂåRŽïîÉþRt…l_Qôƒƒ S–ÒÚã =RòûDD·;›8®³©¼­œµíýòEx)é95JAþÜí ´´©éŒr⎻’¸! Æ“P‡JZ¸4èÑÏ­&¾ùf·ŸÂlñÒkÉæF’•лe…”{L¼[—Ú†þ¡)©¦šÃ ð¼ J»UB¡¹ç=”.8¨‰Ö;âE¢s3Rê>@“Äý9×ÈÛZ—íå—ÃRŽÖ ˜ýTBÐ{R5°^äÊIYi‡Ÿ'V¤šc ײŠà¥¤° <¤ŠÁ½côÔ¹øvÕ“å=1¡‘Â݃ ʶÈ'®LåàÈSðO)B'dídôKB UÎ1zÁ^ʳÁRi‹i6ÝO^m÷ä•TBOïð~òêž¼ª¿²·šÌ¼Tø2õ 3ôf5jÔÖ²4'ÉŸ]Z (Þ›™YÚ¬Hv7 $T9i[‹È‘ŽáªîOè=jÊ̓íK»R¤üpól})‡ÀŠvéÃFîrÂÉŦèÈ2ž >Ó"héW7ÕS îôs ñ­#;f^H@b<`À„ wB@Ó‚g' lž}ŰQØî8e=ɰƒßƒñö‰ü ‰‹ñz°µÊç.¾3¹:¶2û†!›ay*¯BÛ“Šé%{9üåˆ endstream endobj 6839 0 obj 4504 endobj 6843 0 obj [408 /XYZ 31.5000000 253.250000 0] endobj 6844 0 obj [408 /XYZ 38.2500000 232.250000 0] endobj 6845 0 obj [408 /XYZ 32.2500000 251.750000 0] endobj 6846 0 obj [408 /XYZ 38.2500000 232.250000 0] endobj 6847 0 obj << /Type /Annot /Subtype /Link /Rect [468.750000 210.500000 531.750000 217.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization >> endobj 6842 0 obj << /Type /Page /Parent 2 0 R /Contents 6848 0 R /Resources 6850 0 R /Annots 6851 0 R /MediaBox [0 0 595 842] >> endobj 6850 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 6851 0 obj [ 6847 0 R ] endobj 6848 0 obj << /Length 6849 0 R /Filter /FlateDecode >> stream xœí]Kä¶¾÷¯Ð9ÀöŠ‘ðÎîÈ!ÀbÈÁÈ!XÇ ÛÈćüý¨[Ù–ú+I_“”zF3°g¶9,’UŪb±ªøþ/_þ™ýüGöþá˲¯íχ/‡ü苼ùÊNßï¾ý@—Çö÷Ì—Eöõ·Ãsö|ø|ø\ÿÿùÐtøòð·ú·ÿe:ûkýß/Ùÿ¨?ü±ý£ÓüvðÊ×?=ÿ¬¼ªËûŸ§Ïÿ}øûŸ²ßO»áÚÉ\þû©œråiC?ºeªó÷_?¼o°l_ic\¦¬±™ª¬Îþû¯ÃOõøüXY¥¼³>¿e ¯O#i§3¥«í¹ tþ^EnëD~žyp¬(ã” =$q 7ªŠê¡Ç@¿S6ðóÌC#¥#-’²Îùˆ”í¡Ç@¾¯ÑmN3EYüXZ£Œ×…=QùDá¢,uý»7í×m«*•‰Híz ‚TyDV:Ï<µ!ðû¸ò­ ó.ò}<iò"&Ûœf)e!ð€”5*w-zjMû/à#תŠü<óàXii+@,¤ö^+Æ&{šøxjÓXÏLof+Á1ô»ÙÖz APÍ&ð߃Üéx*¸™yp¬tÄÅÐcïfç[XD8¿@Aob2Óiæ¡‘Ò‘?–®ý‚¿“C—gŒ•õ¸V•Y\!Ru:Ûû¤©"šÖùˆöÆyæÁ±ÒqÕúç%PðTšO€?ðYèøáéðþQÙ¼f:—=ýTOîysì–g}—‚Á’RØ"1µüH­ ìô]Ÿ%áeÄÈ6?3r=n·èfšöhMâ34²®´´‚âJKkæ•Dz>ÔŸG™îƒÇQ9„æaKÃâåË.£8·˜ca]é/€8b`ŒunQæht©êNsg- ¯÷)‡è‚Ë Bð‡áHÈ]ó‘¢ š¬@§Fž;ÌéƒyH@1ÃpnKRBœCjèÇ!x†uàŠu¡a®Øšt¦FQ˜Í7°Ê C¨þG VÀ¯Í¤áÝi¸Ïë(ë 1˜‡Ìa©•òðQTªõc"3ÑÙÞ硆âjiÁ¨Á‚{hµ Ú“±Àð”FZmJíÄ¥µ2CÌ3žÓîU"2•òå`moЄø”N`øþ'ÜZJRÃ>­ö±cƒ*}¬,6;ð>Â}  è­¦nˆ°©‚ýx>-vÒpŸª¦g:Õ’f¦¦¿ÝÛMí;5µkÉmzõ|e.Yâš~#̧–ðJu n†aepËДlÕÑ[öõ<¿l=oÇ÷„͵¡%Xiدø€ø{‰Ó ò¦Åß ¦ÄØ¿˜±……ÇaxfŸñÉB˜,†öq¹ì²ó®˜Ë¢ÔÞÀ³þ~>º°ÐÄâÞà8)FåË”¸Zd„Y/¿ðñ°¦–„uÌw^3䄎‚{„¹ÂGk ³Án*”(¢×!‚Ÿ(Þ`tã}žƒe̬4夊SÛ}wïs Ïc!FØÌ”ß[ZÌ8½ˆ1Cê=ûJ•á}jž :ŸGçÆ’&,„ .záêÑ&ÄÉj½›†û>2×X¸eJ 'ð{%Ä)VqøÚr ž~SëÆK¾XT@¤e AK¸3xÀ$ë -Ø7ѱŸIåbÒq8äÁã`Ê< p¢3æ*Œ¼Œk¦G$ÉãY !wİí`!q•áx‚wpP&n +)„S04,”Â5îT^3ûTha¤¾[KD*)½Hh-˜~ÔÕÓ»Û˜“îÓŽÀwü˜—17B‡ ¼Lè6!>$¬ÎY=„÷>µÞ}âz×F[Ø6yÙ…áXê{•˜ø_æ¢{¾WnänB$ö±n1ˆÛæ2fœGºZÀOØÉ¡F±±™še¥)Í`Õˆ¯!Έü«Ã;æn…cª3¯$Úï›Wö|+3£81Ž#',-¦àã+ ÎJicéÓP¸˜Q”vOïÞÓ»ãpŸ÷Ó3ÝBz·Q•»a7ì^=±e÷êÝ«h+'‡£)0º¾¯Kê’Tª8敹¬àܼ×Ê%bRöÏÏë¨ËÅ«òz}w” »ê‚n:•q‡…FDù ¾¡ùnѰ‰ŠLM*Œ3mPK_WY ôÙj‰ ãK–`…!§U&ï’¶×óz;AVÌJ÷Ë^Ñ ßø8àcÇ^ë·á•b‡(n!\v>»Dp+CÁxKXÒÄÝžÃrÁ/S1Ñ++‰uA:Úé²ß7\Îï“ hGŒk¼»ñnZ=«k{übœÀ½ ÇÜ»[y`«"åµ×éÉâ¬) §YC9Cò¼6)OX‘ÌÜ{Œ8¹%>Y§á¾ªºó*ØÅñÄu…-z÷F{]‘W—žXìQľà°r"d {–Ãø'ƒ–‚°#Ÿý胙í RÝ_§Çôõ\lÆ{W5×öhë‘"(ôPlåñ÷¨Õç†úoýhk¦àUØÖ¿ÖbÄ™[_¦>» It_!ÝŽ‘xCïC,КD ž0ïC-]ÿž»RCõ·¤.aY l¹Yؘ4]«¿2ÖÌlÃu¯¦aT  Ê[_é®é6>ÌùÅGeÍ`£m&’4feG«Ù†æ]œé­N(#A€bFdT'³R¶õ6+~˜ÕôáT$^äói{Pó¯ñx:íG.ôŒô·ûLpÜþcAi(lý4…÷Ç=Á1÷97Í}iåjôØ„·“%ܹqjë㚊àIi½:v˜¸#Fñ3A jâø¦pé|3$äKA–§€»—\&¢4è ßL„“°p¡_™ø/†³…`éËdK@]k0vˆÇ(™È'lËSòK„»”ØoGŸ½6­µTsWt!faocç[',啞ÜiÌÞrö•%kh· 6`Z4Ø…H™i{ý¨Ù˜/ÁÙ ƒîCíàBÌÁ–†¼îØVÝûf[à>êÓ €ZôŸhå¶Àu´_Ùã°H`{ìU9èÓ5\™mwxZŽZ„µ+ â£>Á‡f€WŠÇÑy86UÕ56Õî̦eï}ïØ4?Žâ`KæÅQ@ôi®õ©PStDl®¡Gšå ´– ×f÷†Á°¢ lÁsk™ßÒDAh˜ pœÖ›ª\g›Ì€Ö €+ã<À­ãõ``*tà 4† Ÿ 4Ì­Ø2#£ÓâÁÁ{á1‘õ]¾8ÎaذWȉƒJbǃTC4–&¶‚©ìdl1aŸoÍEäQ­Šv…È-…Ca™X²Õ§TŠ6Òp&a«) °× Y?"ŽyBQg Ì-sž Sa{8L ܺíu˵ èÕ‰ÇÔ›œ&6?^AŠžðèÈúµù‚¾dyˆ¢SDŸõ£“×R< "×:-а˜ r>ö'‘ÛÙ`#÷é¬/34oqËfžA¾1÷ƒQ޼²™œaÜð÷nâ ŠP\qÑÖMvžÿ†õÎWØl-¢¶é¤Ô?o¶ow“ºØMÍ'³¶¡Z®üè8 ï#•:BúÜíÝó,µ›ÖêêegC45&Ú÷gÔûã À)¥¤Tß~òëáK,ºŸFº¤»ðàÞp©Ê(Lå·ÌÀö·§„k‡ØÆÚ,Žì<Že¿ûBzò1"Ó"DÑÊdbüÄI7,"…ÓБLV¶p\Æ[ޱæç¿Œ)$pcUù!D±aH$ª…=Yñ|2ï‡&;cÇLºðÜ’GQwCy-ìil´< ÷^ЃÓYLA”qmUÿì!“å%Dˆß·8׆-¸J £f™*±¸b”Éij¥gNêŸW [ñRÈ@ "Ï…;Û„õ¿«þ1@ª¢h¢hs -eÖLÕ?GÈàJˆß\]rPqþLdŽXNGG›«br a1/ä’`]—N ØÜØ[¤@±¼EÐ8'ÇFcš•̘×]ˆªá8S†™ÛúvQļ:Ad Ù\×Lö =¯1W¥«æ`óÂLc~·˜©!d4¬þäñ |‰ó0¶zj°¹¿å•Àõø *p–V"Ý´e«Øâ¹%Ú3ŸESÚË•J¼3˜7X¾Xö%¤–R·`Þ¤{‡Ò*]]Î'ͨ¶¼?aÏ:Ø6¢^íaª`)ËXóxo0¯*¥=·¤á>w‹¿­€<¶[Ùœ•½u«T•7ùƒú)™w³¨xÆÇq·ÞH7Pkò½¼4kÐvQí-~‰°š\V¡PY†y»‘ѰxoÀ÷q©ÝÉÜI`;‡¨´)¬'‘o2®_¡Õ¤ÝM¯Û¦ò¤m˜ËãY@õwö\YäÏS0#2©¼Æ F™c®Nq»Y¯ƒZ,\ Ÿl8Á_‰›i°­º)*1’nÜÒê^}¥dK3ƒkÑjÑ8f*"ñÚÜÛ•ŽC—„ÖFX¾L)‡“íÊŒ+¶hÞË–¡04اUÒjÑÒ¿)\É2Üé÷zÆ¡!îÐÅrPbö6‰ÇbÊc**†ƒ"‹VÜ^™ãPÐEã(é\Âõà•âqÜí¼çsslåÖBVÃ2¥­ÓJð)é}>ü-È/+ endstream endobj 6849 0 obj 3805 endobj 6853 0 obj [409 /XYZ 38.2500000 294.500000 0] endobj 6854 0 obj [409 /XYZ 38.2500000 294.500000 0] endobj 6855 0 obj << /Type /Annot /Subtype /Link /Rect [357 301.250000 420 308 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization >> endobj 6852 0 obj << /Type /Page /Parent 2 0 R /Contents 6856 0 R /Resources 6858 0 R /Annots 6859 0 R /MediaBox [0 0 595 842] >> endobj 6858 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 6859 0 obj [ 6855 0 R ] endobj 6856 0 obj << /Length 6857 0 R /Filter /FlateDecode >> stream xœí]IãÆ¾ëWðÀšZ¹AOÏL€4f€‚‚qœÀ°t|ÈßJé&õY_)M¹aw[kyõ¶zë»?~þ{õÏߪwOŸÿ]}í?}Þ©}ãÕùŸêøóÝëL»ïÿ®šÖW_Ù½T/»çÝóá¿/»ó ŸŸþ|øë¿•©þtø÷§ê¯;|øCÿ¥ã~Ù5º9üþùô»kôá/uý}üü_»¿ü®úõ8âeº~1oÿÿ;{xÉvÇeLLý²»lSŸ~~ûúëîÝq³43M[ig]¥WÿùÇîÇ×áÕ¾sZ7µkÔ’‰s˜Évª®´é³`3œèô#3|‚Á]ݤü¼rq¨h[ëð肇ëÓžd„$ÿëð àï•6é0ç´rq¨ô‡]ðp½¶Í@ÇYåá>Åà®K8øiåâPé70ºäá6¾Ç~«\]‡OÿZyŸîpO+‡ÊåpñèûÖÙÃÑïŽ}-«õÈÛWjëÉ3«ë–`¦˜ÇJây`Õ%ñ†é)ðŽf¾'ÖÖpðþ Ö 1ƒ;˜ßaIpOn¯®svÖŠ ƒñMÇŸͪxŒÇ0P²T“‘×ííŸ#/ìûŽªÅ<àø¹¸…¼†Â>F‚aÊ`´œ÷±¼mrkÏøL0¿Ä°‚gOaæ¤__ ^5Q)?a ÊÀÍb™ÎÜTð<ut§êÌ4óíÜR±Þ3pKaˆËóòŒ÷dg|nL"tŒ€NZg„•s›¡ºfcü…²%p‡ÁôHè}ß™‰û"£Ej¬+2·v‚[4 ,urr„Ú.À¾œ–3×,²Yfõj‰eQØrïÃÅrV,g¬T,gÅrÆJÞœ–3o–èIïc,†CSZmœvW¬`ÊbÞù`Ôöbé W°uë¡·K¼•ÅzX¬‡£= õÐûE~¥\t¶a;\€2jæØ-¾Éí»Ib#Ü®tëîÂÎ_ìŠÅ®¸ËkÛÓÓYÛ%¾¬+õöí¬Iñ-Æ©ÓbÕ¾e"ZíëF·…ògèÝ{W¼zr÷í¾íÔiCµ¢r¯[_=S”Û;{ΈJ”9ƒô—‚Yó9’ß[Óê·ƒàá[¸zÝÔ^&š³6‡Fë-K·Þ©áª|gY|Ìéãј âDlcˆøH1Œç[²êc £h2€˜~ÌŽM W€çÁg›âœJ*¯š¡¨ÂOÅŸb/…㨞Íâµ1û'"Âõ¨0¢©Q?É?…¨×jõpTžŒ‡ô¯1æ`nŒù æ S´L¬ ðæM"BO<$ó **ëë[„ªÞ_~o!"$9ÌÇ\Êt¾J™=ã"C†#dɤgÄHK ¨$xƒŒò…E#Ã’2Q£äî0øÂʨö¹`-Êû„¯ÌÚ¾©cHŒ¶&‹šXÂWà>Jqùi+\S_¢-`ˆx¢€O…ñÁa{7Sµ ?LÓN¯‡ò@›=¡˜"]î¸ ƒý{8Γˆ|Z€¿Y ßê%Þûœþ„Ö.ñÎûôpöMIĘæ!¸ö\3ÑqÅŠ(Úz¤[ësÇ0ØÇÐ&æ¸ïž°ÃÑAp§k&LtƬi‰FãËR“lT ‚s¼6wGcâ»™è"¬÷a !ôŸãEˆor| Ÿ8˜]€Ÿ¬/%;%âÈ…ñ¿ƒ39~Må¹ù[:]¶Õ6¹ã£d1–ÉÐ ÜÂ~Kéëw)‘þ„¹Ýn L$p&X+ȹòc¥»—˜ÄNÛ5fõzš?dÒÇtKdÖæÊOÃw­õ3¹sÞÚ»f‘ÆšÖÔ“<»k»·Ô™”¯…#†½ºa±à4µ?­g(î…<£ß`À„ãÓÄa'].ïèÀ˜hf©V‹Õ™Ô˜ Ëøa:~o¯:ÂM 7ˆq6"HEØ™O ~€X˜°Ñl‡$Ø•R2µí@41AHì(*B„¡j"ƒ‰Ž 6a‰7ä}½!.âô,µß«Î¾Y¥v¬XTÔ›üê(uŠèŒzÃf1B¯‰×§€O¤*ÞÙLÚV )dJ©M Ý j°DÊ•!ËEóàËÈ\%&ΦŠ2Êã|Åh5LÈsÌÅ€Ùqû'nª‰WNÇxTe&ƒíZãUÆ„À\Ød9‘*™-áu„h)Œ[ ‘F×õk2%¥P÷&†$›昘]j¤¬x d“æÊ±MJa²cT&j“¢’ÔˆT4&¿Tö!bÚ²J¿þQ‹9Ƨtƒî’yÐûôn•䉸À¿ÊT’ Ð Ä/Ê4°º\»#5õÞlnîRd„ •Á›Âš%¢ÇO@t} Hâºb‰³ç7ã¸JYÈÙp|—ã3¡^0ß,Çh{"ö¬-VVY N¤ QÓ?%ÀM[Ôs„©”ò]EXrD-¥,UÍWÁDÊàPzÜŠÒLhv Î ˜°û÷Á ê”;Þ,±å¸ Y%ŸÑÎ$|вú¹Œ›S²£°.æv1_¶/Pқ﴾–ãxŒÐŒE§¯"qQH)m­œLâ+HÆ:V^_3_J«`Ž‘¹~¯·MdWyÝ.©Bõ€u¹¼Q¹{;•º\=äÍ’jW8®TÈ ñÕR!+øä[ªå+²fí§TÈ*²ŽOJ…¬R!‹ÄëR!+ˆ×¥BVÎz6ÞÔ¥BÖÎU*d• YÛÐ~(máÁlhw[?Ì›öNê‡y«V¨æ­1o¡gVW:GÌâ„|\Ÿ[lÃÆbëEZÓZÜmS:aŒè1ä;Nq/÷bq×’ï×âîôŸW±¸‹{Î;g±¸‹ûébq/÷0)÷)Éo³ûÚ‹ÅýN%r±¸çƒu6‹û]ÚÐî×âîügNÛ·kœø¬™ ÞtoÉùVSwµ„àˆÚžó3ŸKÝ“9û*9qj½ZÃL… ` n0?™Œ!£õë’óøïÔ>¡¾’gÃU{¸‚÷¬=„5„ÎÅÀuc§Oh}ÀÇ­“ ø˜0AÖÎyl¡£znjÓ&-—NË„a0¥¦©{¸lIk :s”«5lÌÖ+•Ñ"Ôñ\$Çw–t`‚ÓúA‚Ä]m˜n­mZd¢pR°ï¤aõ@l¦î"Ëbƒ?æM#;Ϩäñ¨,0á#`úDôÏí\H5³bzέ®Q†Ž!>Äð›‘Á›¸FoÙ¦$,¥Eú0@Á¢sŸõeåP¾8C•,‰¯Û¦Tª;KDÀ ƒPÑö¬8{™e’Ê”’Çp8¬«®vÓíºMèÝÔ„eãG“mÌ<_CNÁ¼V¸W"®‚2Æ=dDÚèȪ›­Gd,Í?á6^·Kˆ¤F™–Pà ‰9t kšL: £KØ@¨|‰€À-v±e‹«®»k—#Ù,MÂ¥›¤/ãŠYWâ^% eà—‡R_Ø#Ü„2“µ%f1æ%˜Ã3 ¿™ÅŽ˜»´¿&ŽÑŽÉ@ͬ—äd)]¦µÀ-;·ÞK@™€e@[^Ý’ëîÒØÓno†-ß\Àw@Â+`Œ4 Æ#ª‘Í~Ù g+àqÂPb|^A†ÁE0úƒðLšW®÷\¾Âù3IÝVo’yîlØrs`P3´˜c’Ð^)6ɨz¹Ì,½˜ é²×À{ŠuÏVK"k|É#¼¡ —¨¡³ZþZvS¾`ÏWH©l–-ë*‰ÃNLˆŠ^çÜG)‘2]Õ±i/‰:ëWTÀ„}3¨ê§¸¦4®Ì*æÃž>“V]+mfìùÐûñoU0†ðÁµšØCôbPûnµÎLcæöq6ªF5³6¦? îJFU½ÏµjÙZý™VÀƒ-¯ÒÏ6*7·µžÜC`w>þI`4ÌDŸV€¹®]‡»aõÖkÃÁ˜Š{˜¯ã®[ÖLvY¸õð“à[ªm¯¼wçÊÈE:ÝNÒ=Ãpÿ©@†îq7+̈nLϪožG¶gÔ$ò•бœ‡‘ãDÏNªÞ)Þæ±¹:dˆÊ³@oŒ!™îãžàë÷¤ÄÔˆ9ÕE•áH%]g/δÒ5ú^ïé s¡»ÜÏ6º›v~I³Ò¥¹‡b³¤sQ °gA^Ìt—£¬œ„Ô±¸_%–-„Fi™~¢ø¼6x>øäV¦SVNþÒ¹”±~Åõï&zÎt›Ø„±VÚ.ÀŠŒÝájuNÉÕ®VíUÁ…1T¨vÌ21&÷”Ó-¼A&N4m~B ²“%»V®5•y|ŠßSSœHÔŽ{ÇûGÍ£qx ÷ƒwŠç©—ã^£ì¾ç[o£¾§¿ ódÎÏÕóîötè¢ endstream endobj 6857 0 obj 4217 endobj 6861 0 obj [410 /XYZ 38.2500000 632 0] endobj 6862 0 obj [410 /XYZ 38.2500000 632 0] endobj 6863 0 obj [410 /XYZ 38.2500000 349.250000 0] endobj 6864 0 obj [410 /XYZ 38.2500000 349.250000 0] endobj 6865 0 obj [410 /XYZ 32.2500000 122.750000 0] endobj 6866 0 obj [410 /XYZ 31.5000000 124.250000 0] endobj 6867 0 obj << /Type /Annot /Subtype /Link /Rect [148.500000 638.750000 176.250000 645.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn37 >> endobj 6868 0 obj << /Type /Annot /Subtype /Link /Rect [178.500000 89 206.250000 95.7500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps >> endobj 6860 0 obj << /Type /Page /Parent 2 0 R /Contents 6869 0 R /Resources 6871 0 R /Annots 6872 0 R /MediaBox [0 0 595 842] >> endobj 6871 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1409 1409 0 R /F8 8 0 R >> /XObject << >> >> endobj 6872 0 obj [ 6867 0 R 6868 0 R ] endobj 6869 0 obj << /Length 6870 0 R /Filter /FlateDecode >> stream xœí]K¯Ý8rÞß_qÖæ´øÐ ´¯í³À°,Y=é{Ï,æïGG¢t¤?ê¨T¤t6º­K]‰ÔW’ÅÅ_þýëþç§_Þ¿þßé7÷ïû×·ì\æY÷çtùû‡q®ÎîúTVùé·o?O?ß¾¼}iþÿó­{àëûŸš«žôéÍ=ýù?›Â¿¸_ºü·R•Í¿ßÛëR5WÙðï¥üßþã_N»¼±¯Î5fúóL])•]š±PõÏ·þ3Uû÷¿ýíí—€uµ”u¡uvRÖØ“ª­>ýý¿ß~o*è_Ÿ+k”)un›ëº°e–W•n®Kãþp+/õ¥v••'¥ë¦ ÊÎ*oÿ ½>ÂË[äb½¼m¹8*Ê*üösm•*/‚Þ¢Y æŸ “ÅîðúøçeQs.-G¥.|»ºˆW«¼¨šß¹Øvfº·}Mi•sãCåÁ^A¥ÒÅܶ\•^ÌøíÍ“ª.²²²ðz\wn†^PºéϦîºéÇò¢è åeûäwúªK×÷û¨]êÒ‘ÔM#àõ¤]öds5mOS0­×Wp¹²îbÚ9`¦õÚkµ1€ðâþc\¾Œ‹ká¦æåͻ̨Y—ŸmóR£ëkemÉÆ¿ú<ºQZùòÒN›Ó8sWûèÊŽÛá{V–¶vTÙ¸<HD$?&>”ÆÏä¹cÔŸ®À¶Jš_¯®5Ž[2}x#&F]!°¤AÄF͘ØI»¼åò@9 ù«—Gƒ­—Òîj¨‰N"ÞjbeÑÛVá×ÔIy«Ü…3ªöBÊåT¥kGU’ú<ÄÚÛ1 ÆõÍj™81 üxO½Ë2.m3è6›P‹»"ŠH Fõ÷F³¡‘I¶ªÒ¾v"ªQŸœX÷fÍ!ÐLe¢pÅ‚Ð8²šN™©4·UUšuù¹&*Ú´ê\–O–r2u=iŽlçz5úïàYqXL°²‰ŠÉÄóxQW<“çfƒãÓÔ½vöW×Ç-™>,çrÆŠs©ÄPû™LDèU L°º‰GŠ[/¥ÎÝÔD§o41“©Þ¶”WS§å­r«Î¨º !—c”víPšÔç)˜Z{W ĸ¾Y-ã9 üxO½Ë2.m3è¶šP‡»š*"-ÕïŒF¡«IvªÒ¾v"ªQŸ|jÝÛ5‡@3•‰Â BCDàüÉZh:e¦ÒÜjTj˜0ŠÄk\A«ÎÓPÄäg)'£§ñ£ûøÃøÊ*™”Kâó@e $"’©çñ¡¤üñšNž› J‘0D÷ÚN¯-UhxÃdd®šÄkœÄF͘ø%bzäJçê&)l½”œZJ‘xÍvjMªèm˯™–·ÊíÂÝ…”Ë1.^Ó\ú<ÄÚ@¼æ „ñÇkæÕÊáÇ{ê]–qÑE@t›MHƒíx -ÕßÍv„F&iúxÍTT£Šq9±îÍšC 1þxͼbAhˆœ?Y .|ÒÜjT†& ‰×¸‚V§¡ˆÉÏRNÆ’xM>ØÎõÊúC%“riXòPe $"’©çñ¡düñšNž› ÊÐ0„éã5ÃÕµFxÃdd®–Ækrj?³ë”ˆé‘¨^SÐ0„§€Xûv¦ÂˆÄkfÕÊáÇ{ê]–qÉi¼&—Œ×äCP"§ñšÄkò!(±¡‘IC¼¦Á\N¬{³æh ¯™U, ó'k¡É•Oš[ŠI åט_cuÄDàׯ1_d|B%‚üš,”_ $"’©çñ¡ø5F„_c(mÄ üCù5†Eä0™+å×Êñ€@‰$¿få×ÀfDƒ­—’óCË@Q~ÍvjMªS~¡üÓÓJŒ$¿ÆôüCi#¾bíüš+€_3¯V?ÞSﲌ å×I~H$†òkhÁ¨þÞh$ù5fà×@ ”ëá׌ üšyÅ‚Ð8²š_#¦5­-‘Àåט_cuÄDàׯ±ƒí\¯  ¶A~ …Å+›ø H ‘L<%À¯1"ü3£ üCù5†Eä0™+å×Xj?³ˆ-bzäÊ«›x¤X°õRêüÐ @Q~ÍvjMJõ¶å×Xʯ±=­ÄJòklϯ±”6â+˜Z»•à×\üšyµr@øñžz—e\(¿ÆJòkì@"±”_C Fõ;£@èj’và×X@ ”O­{»æh¿f^± 4DΟ¬…fà׈iMkKÓÀ„¥ü;ðk,¡ŽØüKø5và‹Œ¯ü¡+ȯ™ÁBù5°±@""™zJ€_cEø5–ÒFìÀ¯±”_c)QD“‘¹R~¥,O?P"¦G~ (¿6#l½”œZŠòk¶ëPkREo[þx¥üÛÓJ¬$¿ÆöüKi#¾bíüš+€_3¯V?ÞSﲌ å×XI~H$–òkhÁ¨þÞh$ù5và×X@ ”ëá׌ üšyÅ‚Ð8²š_#¦5­-‘ÀÄÀ“°”'a uÄFà×X¯±t­^ˆ.Vm3‰²m`#¢AæäTi%J‘°Š„\¢˜RÕ.MO^ÆÈñQÇKÔ耉˜äÒriP\þürIÉÚºêàѺŠÐðúè—sÃt-G¥—-~{ä„^eóǖϳ‰ ȤŒhËµŽ©Me›rK•^àøíçªpà5³îª©¸ÊTS±UÕi¨ùËšw`ºïgàÁßÞ~ù\ŸTqúöû%åÕ¥ÂîŸo?ÞlóÃ%EVÔ·¿œþ5Ëlùo§o}«Ïe‘7Åmûº;YÑÞ©ÎU‘;ŸÚ;ùÙèJMï¼·wì¹–åîkßfÑ3º†Ïhɶ)ÕÞiæ£î¡[êá´b ,|¦êî Ö@ˆáE^hI[‚ekÈ놭\ÿú@“(8øWq“T÷sÎmQ•·Ý™*Ñú€¶á×sžÚÀÚ¾³%³^pØÔÂ5uY7¤»;Jõúv}&GŠÈrC|eúô­éÞâôLyÓ‡N»¦¹uC% ‚ú&Œ%ÇEœ"–Ãb9ÏŒŒƒRÀºñ3°N€©?ßì@í')ýU6C*\æ­›,Ÿ6½>·ñhGšöh{k{k~—ñx#ЧcíÃsÆÌ’p/ã¶1z0Žï4 GÒÖTl†eg¢º˜}⑞_14 ËÞB]ÖÐ23<¬/ûÛ3–öîöŒ¥pq}^F±¦ÀèQVäAÔæ6¸OgØ ž?f0 ]´Êç º\}­ÓÕš«>æ‰gÆm<ïÌG8ã Fô%åè97f±=¯HÕÁ#UŒØÇk¦þš©§ɇa¹dUdý,?*@LàÔÃ`…p¬™®ã{aÚc:@ÎÀßƒÛÆYš—}Û=-ô‹ÓÖРnâ§ŒM_Í8•ê6Ÿ¡n÷F+â4 tÇâàT;€Ô Ëw¶ŸÙnޏ쪋qÁ÷·¯Éù¬—&L±¸X±Þ£:]ÂÊóÖh×;Lß»á…ÊÎ̼†ïNéü£¦Ê£ÏZP£gÌ{¯_¥òR¤@žó=xe3 Q}VÛ0:©pƒV`s`[À-€R°:1K ƒ˜;©jC|ÐbLdÝnÒý»^<clæÄocíȃlÅ™ÿÀ~4Ð×ãMœÎ•ö½œÏˆ%F²)x Lùdµë®&vî™ì\tÁGÚ…«üœÑÈ߯ðm.†¦Ï+¦|œ V…ÈÓѽø‘ç§ñw/+¥gî³Ä‰’ì­mîð-ÌT3vœXÆÀ=0˜d-1ÍSDôh|g©mq…_–_–-˜!3XÙ²jñP‚¬¸ªcÅ·arØ# e°®A(©¬ëé¡ïí¡RÇéÕ¤LN˜ˆúÃΫÒ#©Eo‘WµHf‘/áï-üÁ'˜»è#9› %âÁ¾ÍzÜ— 7Øêf¥/qˆ&üx(A™|†ù×»;Ð<oñálkælHN7 aÅÌ›-•,‘å'ŸýF+ºb>¤©4ÿ†jÁI‚ B`è)"pâÀ‡R˜Þ[Ôš™cL`fŽžCƒåi– [Xçá_pç9¦mƒ§Ÿ¿DœØ¾43Wœ™°/dŸÃ…Vœ~ÎÎë9–ê»;ÐÌœãtYôæg_Þ,2ù\g7 ¸VFïéÜq*³ÍJ.Èïà·á^l`¤C~®>r¤JûÏW_+ɉ„?ø‘Íq1¡.`Å8…C¨8(‚…ÏQs’mrRÌ=‰Êþ*ùÌü¥˜w®˜¾V—)½ì‘" x ¡qÛ°Ñ0Ž2²˜RÍø‹®†L׃#4pvHÉIÌHë0[L÷yÈž&yôèeœ/ã”7δ}Ý¢{TÁ8Qn5'i5'õ÷CúÒô;H^Q†½…ßû5„˜p* œ~Ó q€kå‚F9t,щ +q žœrŽòäp8Ç€p’º,É4®\Nú$À°ïŒŒ ÖðžqšP€µ€Í)Õ¡d²guDQf©A #Kk †ã ðiDŒ…#ÎiDœq…°•ƒq¦¼09‚6DÖ4…±°9KJ©„ý|±_ø6‘nQbI<19ˆYAú¬À‚G]o‡÷»±õ#FË¡o±*Çow}¬u¼CBBAöA$ë¢ëév räôb ³BQÖR°;+KûH¼¼Éð^úóíã'Æ.¸5àÆ0 È™%2·‹b4ëf„N- ’xWlLF˜Ö50‡¥¹fÇ(¯W¸ëÆÖ¶bÂÆé†·ì÷1·‹Ç3Y¯p©(¾¸_aճ㎕Y‚!gÐ$‹;«×N–ÀÜ^ÇK îv¨2gÌ$oßr&·‘ƒ«ó±ªì„áx{û_ûø¶}ñŠ`‹<}ß±¶ÛÍ)0)Ä«@‰6…Åòî3²-+}pw4Çö‡y÷Kdæ˜]W]“¾ëΗ\±Càx/F¿ â×Xúáæ~0¹ç]¢‘Éë™""›võÈŒ÷ø)<`ýèúT„Á„XðM4$âì]I•”,0_䌧Vìá„Ö¥qʳ¦@P"!UD4ʾay9v€¼´¯ ^ K•4|ò({‹ŸnN99k×gç–}¼w€%H7thŒŸ‰PWŒ=°"àžûeõ©¬žC·`íÛN ¸ÏT8¬°Aò¡I¬L¡L9t¢½‚–Oë9b’pUA;¼È> $¤øÆê¤jß7êîm6Tù¹Ùt!™|wJgCzG`<¨§Fϸ ‚JÏÆcF÷½Ã;­+&é{\§^œÒÞi²ïK?À·eèÆ›¢yžQkÆ­Ûï`ÜTªM^özø,ÎÁÄ¡xÊ2²EÃߘ!h§ƒ?r¾«÷õÓ;ð—ýÜ7ÌúˆîÈ&}€í5,ápªpµiQâx@Å8:Їœ©ö?;¯âP­Í‰ÇŒ‰`œW5íÑ˜¥ÎVÔ—Òµ®ê9Xû¥nß;ÆfÛ{â%¤uzÁIÙÉYÐIÎ`> Ÿ ‘hÓêm: V›G>‘Ñq³hÕœˆ;Ÿ$ûÙ¨õ°Q8‰ªØeŦ…†Ìwjy÷´­òÁþ\*òŒÉ…Èòׄé'LÊ퇾Ê÷ù&Lû;Ë5yº9q ÈsÇXó”²­˜ú2–¤Yâ9êœG–ûìJí÷“BÄË@"HÆÉäœèò#£Õømò)N}ú\T‘|2Ö|Ül9¬ÝzØ>ñZbœpèY&ÖÉR¨á8 gØu¼¦ÈVZΜ˜µ"ÈÞEM#‘+Ú‡ÞS¿—;NeÈ9ko>­ã,¤âؤJ5#ŸÛž&U«¬–EŘrûr†V³hìpÛ8ÙvvÏ©#<ôÀÑV<ŒåäÛ‘ˆ¬MI-f¯EV9+UNDe¿F\då˜ãË'ðåFõßÿZPH½ °êLOØÁ¨@ 0¢øm8•6Ìõ$’l¦¨m†u*¢èÛAA¬cø$Å ñ­ªÅ–Ne{ÙðÚp7ìËñ3ðKSúŠBªËøl.,{Ž—žI#G›o#Ù`»ÇËWœ~" I)Q,ì9w ÖyÎ‰Æø48,{è¥#a†Ï_ÌØÝãú#xj#«áŒl^=ïòè™Ó¿¦ñ•Ùâ1(3½<ÊN•˜ºÌKW¥…+â¬uFz”ÝÂ8wž?ÃaH|‹Ê ËÅájp²óqˉâV3r;¯àsï&'û)®Ô€&cÙÝh<:L4óÊð˜–sft‘PZzˆÃá!n).FÛÒ|Ý“Õ_¬#‡™Ý¤‘IÑ›Q,ÆwãÙy€\úš%‹?b/­áÌ6`›)}dµ%þȉ[´‚e´Pc±.ãh Õøm8vÁè»9–žÌ—4vGÛtzÄfêိ€Åº¼#Œ?»¯‡¤wÙ}*êcš*œÑ†“ùsÅN0ü«˜gŒÙÄ¢)8;ÖœÂщƒ9…1áÎÀlf×ty47ÚÕ€¢„¿+@1”¹*~Pжý ŸI³íO2Û¨¶þ¬ü—¾¥jªî«ü<èµ5>}w:‹s1ËÎYÁgjôŒëP•=Ïvs}@o변ΟÉð÷tæ¢Ú0²ªžTù4«,ïWMö;ÁëhGÜJm€Zaª³ïÂãø],võíbâĨ9k ÷½â"›ö2v*¯Di]EN\äZàì/È…aá¡ØÄîjk R uZÚ0‚HÆ­»Ê 9 kBÀHð°¦7^qRíîY“YCÑÙgÜgÆÎåèœìI°+&öœInçô.üŒì0tiŒ” ÞVöÆ]'2Ýeþ§2Šá~»»áì!Ð+Â…"mÐ@´%nrDNrYj¯LŽÇDÇì°R(32‚p¼ÞrŸì.;Zú{5ñ>]ÉMnK­ñü3·ÇÇ2‹æ.£‰;€Ô Ëw¶ŸiÏ—ç›/óqÁ÷·¯Ï©×íè:#ìu$ïðMú{{Yö¢.Bnýwa£†õ_ý ölŒ ý†tWë¼¹h´1ÖM4†Æ:ËŽ1^]CäálŽa,â°Ò ‰&Ó\sú8Gá7$†– ¤šGŠGéh7†¨d“Ý‹37dEŒ¹ª˜Òiq0ÔŒ£+eìý€xÕ˜£a =ÖþˆKO‰8øœ{Îdóæ©ãHB#Ÿ»¢^È,H‰îyh1v£Ká¸Ûœö­¢á#Vfäƒlá†ÓWd__cÞm#’€9r`·p,ÓÝø»¸‡e-’‹N*å,Øô°Ç\"ɈÄ78I‚d³MÏ\.‡·‚“¿Ó­5ÕÑ9V²©'‹Á„…ÝÎ2 pSñ\n·¥ðD‡!NœeL×°£FË&ÍßÓÏÆ6ƒ¦ûeén°íÊgÚ¦QßL]Fuíþ»®Ý CgŽ¥G0]|AŸu·Ð5ºÓ©o1¿ã4O{vå)ÿGTYr¾¶}v_Šö©ãqº¥Æ€çž-„N5p|{IÏg(ü6øŒ³1µêÓË«ÚrîrÝ´¸4ÄŽ£z‰ÚâS›ï®|î°F‚Æ YPX°ÐõTÛPföìŒw" Œ÷»óÆèŽscK.ìôåíÿ Ö2 endstream endobj 6870 0 obj 6988 endobj 6874 0 obj [411 /XYZ 38.2500000 785 0] endobj 6875 0 obj [411 /XYZ 38.2500000 785 0] endobj 6873 0 obj << /Type /Page /Parent 2 0 R /Contents 6876 0 R /Resources 6878 0 R /Annots 6879 0 R /MediaBox [0 0 595 842] >> endobj 6878 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F8 8 0 R /F9 9 0 R /F1409 1409 0 R /F1700 1700 0 R >> /XObject << >> >> endobj 6879 0 obj [ ] endobj 6876 0 obj << /Length 6877 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯ès€m‹¤^‚k ‡† ääìf,²‹8{Èߺ%õÌPýQâ×EŠêщí‘E‘UÅz?ÞýñËßÿüíøî×ÿ~ÿðåPœšªèÿ;ž}÷òº= >6muüá—÷ã·ÃçÃçîÿ¿ú¾|øs÷§ÿõñOÝÿ~>þõoÝþÑùürhTÓýþïËï¶QÝŸŠëïçŸÿëð—ß=¯8~nØÌë¿g¬-ZuÞÆÌ§¿ÆcªË¯ß~øõð®@ØWÛªZUiÊ£²¥>þ÷‡ŸºŒË'[*ÕÔeSÜó¡FŸ¿¤M{TÚǪ™|çòKfucq[F\ü¼si (S+ßâêŒ[­ªº­uG½§¶0ý_ï;KišPÆDÕóò¯joñËÎÅ¡2b® ÍuSõ ²UX]Wˆ&&–/;—ʈd¸¸$“nµêÁ£u@×å#@ßeDpÙ¹8TFÜâÕOÝåV¦ÑUyFôÉU÷¯»?7føï> u„ï*?¯ßúLð±¿ì<ÒUÆ‹ŸÎ|º¬ ÛÂ?ßu*£u²nò0»®!ÆÆ“ýýÎ¥2b..ȸmG÷óò1 _7Q{Ùy,ÆíY]¹gë´PDÏËGXÜV¿ì\*#rñêbÈm»–fP%Δ_-aqec©\ãÎÅ¡rAî­Õ?‡¬‚·Òÿøn¾y^|ÿõðîSN{üúÓÙp;°ÿíë/]¿;{kÚîo?ßAþÓŽ_>¨n‡µ®úýõOŠ>i.Oª“®ûG×'º G}ß±èB÷ï4g«´mªç'FõOÔ©²¦yõ¾£úwê“Q—Kv  |bÃσ÷æyîZ¿G«i S`:øØ?©O­-ÎÏì§ìwýñkwOî#ñÎþ®o‘xY\H¼£‹‘$®©›×ÄR|¸<)O¥iÄ—èÉ@`­K íž •Þx2àN™“Ñ­ºÓ[ïàïàcT—'æT•uûß­s Ï" üp Ÿ@øi ßÁ›…;Pxð<øžó|®áðÊ$3Ô…¡ƒ à fׯ%.U†ß Ïf1Z àw ’=à‚¨ô3>JÏ® ˆŸîm}rÆäs1P§Ú½–@ÔaáÏjî õ0[,gðÝ%(ÀCë²ÌÉÅ3#–§ÒÕ é†Ñâdy|œ§«Õ¯²lq ý1ïÈèFOá÷ßô|Óžš‰EBÜ€mJ"O‡çñP1¡ y+Lèð;ž½‰J"™Rx\v€1蹌ùë,E­mZGÔÊ`ƒnù"ÌÝòP¾Ýø}€Bdù1ÊZ>~í3„ì!×#–áÏË/¨çzLö(«yF3^­zQ ¥2ó¤Âça.¥¬qŽo'ÖfqTYé_VnåG)έÊ1ï¦êyw£F-îÓ ÅõÞÄ)o<ÑßÃw z2hq·Þy‚O>†Çà”á;ðìB§PðÉ{ø&|×%|Ç@¸10`v=xÐo½W󼃱ð>iá¼kâI‰w amà~RÝFÌàI=°†»Æ'Õø;Ìý'Bü¶é–õFŒ®Çý3öÚ-Ùd¡¾ ½£ tãÉSt Á8‡Ž,ñ]áxGX熪ÁÄ_#|.FÁ>„mz¦·à—1w¡±™ ÔúÓb(y(“±ÁxVÌ0„Ö.ëÛƒÚÏ'ÆÒ eª5áL¤î=á™ö¿}ñ}8çŽ-ÀgÕ˜ÿ”±Óß°˜ö8/° ›pû¹Göf ®ègv[bcjÐ|V‹(0ZÕ¸'0ñÅ—¤­®–ƒÚc[ùÐ"LìÆ5Lf-¥Kƒ:k—£»Ö°KåaÁ6õb Õ‹á !LJÄb<ú þ0ã㟘MLš ¿Á±øBS`bØ °~d×E6%d“Îñ+e]ÑéqÇ`Çò±™$xÌ:=#À9Á¨žŒ"˃ɕmcîè.¯²gµd˜ÉòæMpJÆÊg<@TææÕL¶˜'}A¡#¶žœÏ•Xúãû‹ãÞØé„s¦bŠŠ¢r`¸^@‚I63É!ÕØñI¸DCâD„_5Y*a"rIŸâª¾}…më2cúÆ6‘n¢ç¬å[nfo0ü-y¼ëø–|i—³ö Ñ£[01Œ‰{}ûLDO•8Ù,!Ó‚É  ì&«íY­ŠHŠÖÉF¬FwY´ªu™'LU?’ÇkýûñèÅꌥ"œ2À½±øE)’Rþ™š7L‘Oð;Œ…È» ¢ö DýcTÚsmJÄô–Ð+UªfÜÌQ-&bûý ú°j51 ?/"–ñ ‹°ä—ùºE³>~\ƒ¨ 7£El†—SLÄ>)’[nqgàsÚ[<ì-õ›Õt•½¥Á¦9IIJXÃ|nàúê¿ÚÈ"çÊQøŽ'Ü„«¨1tˆj`¦KV_½cÁƒ…¢Y@T´2Þs³˜šy¹jíYÉRíNcwñΜåÃñ=t‰1Çà_àþ˜X(SÞ3ÝÌî?©0ÅfLc©†v*φʯ‰Þ©¨œêôfl(Š^ö;#xgf*#êâš] §ÄNBÚƒ1AÁ˜ÈyLwÙ S¸¥®D²~D. S›½Ã<cŠ‘(S–ÔÆ&¢yXžŒ&&5˜ÈóY¿¹Hâî {þKJN žEÛ!'Ëë™4šŽ[,!‹}$bÐ Ýž¤ÒÇd´1Ó•r„Õ¶òm$꛽œ3¦gï|¢ñ”‹ŠX•(U`l1ô¢ øÓ%n–„¡ƒï3ÜAI@c›‚5þ1ëã'eÃkH*Ì_0-ã¢uYž!©Âã'Ä­“°´ÆçÁr¾ƒ'÷xt Â÷…åÕôG§nsL{#Y¿?Ö¦ ~* ƒ¹Éä·v@4þbäa&œ«´ãWF5lÛÌ⛺ ¢«1öȬ?|mQÜ» lªõ[¦%ÒÒ±¬ÄÒÀƒÅšM" —iµ•ï²s¿u‰bP¶h'ªü$•£ßM¤³è´:¦•8Î*ñ$¨OÜëq:S/¾cºþtÓ(µt÷åp 5ÜvBñdy b–9èú%I’‘£F{Œ#ur‘l˜öêmVô§‹læˆl*k9öOZ.(îWcèÄU` ¨²BYóðØ¸™)ÂékµFZ/Ýiyo>á³«Ž ‡}‚¬uÄ&•tΔ>3I0Öjµ{Gbé/:¶0ëJ~ÜЉcÌ;’]âzž”n'„÷ÆEätÊô³Ò_n4r“a^¸Æ÷Ωâ1©]–uƤG]:ˆÀþ#ÊTŠÛwí רÊzsn‡AU 3•DÛÊXµ˜ú±š1ˆ¤‚ÌLÎÕÚ)d)×*[9r-#㟱9—·‹ò°r†-ç×7gn²^) WÁDLx(‰ÎpÊÆ“e§m?x‹¸['ÆèõŽô‰––ᵑ1m¿ÂºÆ_ŠJ9ŸGkŽ~Š¥ÜflWËÆ8‰íâñzÂ)Áq-z9¥=÷çÍžîÇçžÙ²}4—K*¼Œ·Ä¨„š&Û«)ÏÊmU—.‘}µ@Þ²Ž¸z?·íĺŒré2ÏP—){Þ†ÖaZ÷àÙTjÆ©¥rÉò s­`wSÔ¤Tíb&U@-ã,žõZA‰†—/5AËó»å:šÏ)ÜÕX70>U k^ˆ"ÁM¹‘·Ô¤.vvJ€K™íC¼3è6.šeÇVcŽžœG"ÖBÍ ÝdÖý›k S_**WXMâH9óå¸QÊ„ýѬ.ìëãÕ±WжòØI¸"œØ§1ÑÉ;›Îiø±gŸØãÅö>±g¸M•½ã6=ÜÄ‚÷Q<`Ÿî’–Ê›vüjºé.¶Võ,¾÷é.wÀ×T³;ݧ»xw½OwÉ~ºK½`fm²é.Mñh)o®_ü£Äö7Ý=Žòƒ!˜°v3áÅ€>¤›LoxíÇ1*)êJP_R»ÂKÂERï)ru Îê»D£à2…5Uý^ /­j‘4ëÚ8gÃX’ 7åuž`ªÖûëçØè‰âÞ©¿¨f—¢DÊŽ×x°qx‘‰&3Ík儎úpZåêù kty©*GZR©_“×Lùx@—ì€Û@´mÊ)l‚0’vùܰ Ñ™‰·®½ãáÆO·ëY&¢É–ø€øÉ¶¡ü†\{zF«"v¶p=1ÆÁE»ŽÚ »Vòs£ƒ1‡k}£Ò¶éò\zñ¯ôøè®“Šð-ÃtyЂñó icÆÉÌÓX½yÚJ¢%1Lˆdýš¿Éæà«Ë4÷&ÙȲý¤c÷–·..²,öSUëìs6µ©v³˜‚£Äu×y˜ÓZ¤ŠxÕyb¾¶ÎfBºY^xS×î>W÷0j¦E#Sg'ëœÍX­éu²QÀ%_^+É¢JÁK*ëÞQO²".4Ã\F4îœ'Ÿ«‡6ûÏ0\4¡‡gaˆy ¾ž‰®ôž8?æ»¶b£M…WáÛ¶Q®n•¨|ÔÓµ¿#Vü€½¦Æµ.S¸j‡1j/8?“R;I±a&}ɺÆãêc{—¡˜gÊ.­ºÖŠí5ì{ {3Íüöö½†Ý‹í½†}¸M×¹{ ;ÇûööükØ;]iüjÂv«Ì,ýfcxå©‹4¿~óõ””mžÝé^“ï£òT5ùÛ¤å(µÿae ~âe€o-†Ö1D;ƒlÓ2fî63½ˆÙÓóÏÑæänüdªN“ymrÜò63jì¦ ¨€®´œC3’€¥â1® £uíõôäˆw\[ãÂ#¿&ɇI$j0©³¢N1ÓJ£ê¡‚õL…ÊòfÂÝÍEs(˜úï7œZ.\¼ûè©Ìo WmÀ†Èa›ÆUÂ)½–I”ŠÜQ _L›+6%jMy›0³Ì'ß;qy•‡È¸Íù’i·‘¤¨˜øòÌ™UEmÝkž¤S{>ÝuÜÌ)ÊQýˆÓ¼S6¹3×Éî ^‡GbQΡSÀ£h¡·àƬÆH‘« +#–7W )O H Å7€°ËCü¿oWÉ&[5jÓ¦Ö‘{ì­¨üD͂雌ö­ŸëÉöÃñFEÀ€ˆ‰kW`ŠÜ<&DöVªL j:œ,…¤ÊF>ßt{Ïõ³‘Ì·eè’¢1ìëc8†(ÎsƒtYŠBç‘ó”»_ÇoÝ…òÞ·Ïsÿ`nÒÞl#Ði…:kQG}­íRPUê÷ÝÜÐzZÔ'Ý÷~ñ¤‡\=}2d”êӠŽ€¶‚úðúŽ™s«ÞÚÛ§á¤H‘ÄVJé2œ QO8 ö(cÚc(¼|g°[TÐÑ_$ë°wþs·ãÑv h\å IÀŒðîþò‰rc˜0Ò<ßiïG@S˜Ópy_aç/ ƒYõùøùðË .» endstream endobj 6877 0 obj 4982 endobj 6881 0 obj [412 /XYZ 38.2500000 687.500000 0] endobj 6882 0 obj [412 /XYZ 38.2500000 411.500000 0] endobj 6883 0 obj [412 /XYZ 38.2500000 156.500000 0] endobj 6884 0 obj [412 /XYZ 38.2500000 687.500000 0] endobj 6885 0 obj [412 /XYZ 38.2500000 156.500000 0] endobj 6886 0 obj [412 /XYZ 38.2500000 411.500000 0] endobj 6880 0 obj << /Type /Page /Parent 2 0 R /Contents 6887 0 R /Resources 6889 0 R /Annots 6890 0 R /MediaBox [0 0 595 842] >> endobj 6889 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 6890 0 obj [ ] endobj 6887 0 obj << /Length 6888 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯Ð9€ÛâCvÆv€ <@‹o6Á"»ÈdùûQ·3#é£Z_)©[¬»wd‘ŪbU±^üø§oOþù{òññÛ’ïÍçã·Cz,²´þ“œ~>¼ý…vÇæ{R¸,ùþëá%y9<žª¿_õ ßÿR}û_¢“?Wÿý’üø·ê—?5ÿèô~=ª¨>ÿ}þ, U}K»ÏÓïÿuøë’ßN#¶Ó5À¼ÿÿ¶úÌô Œ‰©_í2Õùç÷ï¿>Ö˜7‹KS•ÚDYSýUZü÷‡Ÿ« ÚáÓci•*r[¤×LTèÓL©5‰Òe5R–&:ÿ `pUºpƒŸ!ÇŠ2¹ò~tÖ(SèÌž}"r朮¾¦ùsݺô‰kNH+Bл=IŒÍ ~†\)-¹áà’[ÙÚ÷¦’òê†ý"¤œ8C.Ž•–¶xtIâ:•×Òyˆ}Û ÿª=qÏ‹c¥%.]¸§qjeEôw£‡ ­6:ÜàgÈ¥‘Ò.IYíl@Êv£‡@¾ (ïkÈCQ.IYS¶Œ¯hÛ7Ü|‚Ê%Ï?%ŸªoöÉó/‡ò˜ë¬qê‰þŠžMŒF¼c z’–p4ß;ê |’¢'– B­á< â cS›Â5žçA’>ú>Qp¸R•Ï_©©±óå¹ Á÷³)ÚY?¯žê3Ä~ôH8O ù s%+0gcØ0/Â}ŸBÎf°c°|apk= †€ÁN,Ž–VX×ŠÉ $4lzÚôP¨²cZšSÌ»ÏzîèÊô i…cO ø¤&¼=ZSGÖûÊuÞ;5ó+s4ک꥾â­!ˆ9f6wïVšZ4Oš¡w៵\´ž/ðB×q@ÑãR¿cjØ\ßšÅL"ãwðšÁLÄÒeQŒ…ecí+Õ>º`´8@¸¨ù2«zª³«ÿðx“y±e)®a=,Ãâ˳u üa`›³ÃÿBað“gc,Áâá­&–nú A‘¤>Ïÿ¦=yÖSgXü‹hXBXyXR ¸ÀÆR’Ø„ÀÜìQ^—³Ž‡¤³“§ƒ°“Òã –'# v+ˬ° ®Q˲ìωÙ3–4˜ƒ[6ØÖëSËž£¡7‹ó}Ì|Ų³#"Ž‘ºX†3ø[\‹PaÉQëÁPó>ut$üì`Öœ‚-‚÷/5Ì<cOŒ1GàÔãúÈ'X1:LGoLjÞ &¡höÍ{¢©ÐÒØ3Žc 0:†WÊøÙSŸXsœ*ÃQ~‡‰àÑ2ÓÆTÀ‘küãó(Žzá]cN~ÃØÁT°å†Öí¬bg —¨rlJ×SºvJU£M¥ÇÚ0PcOŠFÜêÛÀͧq\Œ½SÂwlg€õ#]h´&afäã ÞŒ*ouNßĘ7^O !x„O ¦VÞ,±º¦a#ݪú>K\ä»` ỉâP~Þ‰÷16Šü3Ìnfx<ÁßΗðNËzC`&«H!ÔT¡-L‘4¨è+RF]bRˆŒ=°…yÏ c>NøÄ“ïŽë~€ï@_·ÇkŒc8®€ã$YDÌ—ÿû·7‰EÙz?¦ª/VU‡yˆÇ/™R“ðx0‚£ESO⬮ËjÊ"âÌš»È£pŒ î4O’ˆƪ¹5xÌ¥»Šªƒ2WDæÿbs9ޤÆârOm#æÿW#bþß÷ó–÷s5ùŽùWŽËk¸óÖîÖüÒj·æ~ÉÍ$<Ûµæó.Ñ'¦5_èØƒçñt6Àû g™áyà^Çòa?ø ^µ,^Ô$R]K*‘Š »]î¡‘§å‰VÆ­K›—ŒN”:Å*ô¸‘ô0î4`*œe€ç­ZfbÔTó‘ªo‚ØžH.8^,YnýÛ5¬•esÝÓ ø¨ƒ¢§`D‹$%fîÂvºìáC6+øæÓÑ&Æaù9×}[ç¾ù¹¢èÅü,ÓŽa©zjYQNm$F¿õåSñÊí“uÇ!³šlÞcÊ]”®ÉŽ¡Š@D¨1X±D&•[4˜c˜°Ûç4ãÁƒÈ6ýZ>Ý•)þŽk¼Œ™öM]ßH ø Ñ…U¡„>]u‰ÉåV‡lAÛµ:u£2iÖ·Ø–§Q4e¹[k,¼"±:ìyO}ƹïóž6EL‰ SX5<É|½üЩ±é`ÿ0½7_¼wg%Ôª¿Óo%j±>¿ÿò…¢Ñ$ÂýVËË,ZO:¼Ã°dˆÌeAŸ…YFJ^ÜÄxf¸¦qtæ06ÛåÒ-ërCØò%Ð{Íâk-ßË£±ÃÎÂÅyW8Çè…hp¾®"úÙÅÌZuù57®=kÕ¹uÝËVêiGÅFó÷œòüÒÕ Üâî,»Œùˆ9åªÂØä\³ðÞõ“Jûý¿Ö)˜¸XÊÂ~¶«®ŽÜk„uªg=Ì=ŸL÷oÌ;LŸf,ñhø –ÑDu=Öˆx=V6FRàú"üÆÑÝ£ÁDk¬<£1+ÅO˜ž p7z8žà7ÔŒd-¤XZb)†o`¨¯»ª”Ý5öЬÖ#t¥õùÄø_ðn"4 s7€gf×2rcçÆ< žýƒeç®wcžàUšµÞÃþ5ÿ]J©Î•¹ü]|wC39Ö©¤6˜uC¾¿¢ ŒAÂÑàÏz4ƒZ$æG£j>º`=‘ïãž©T–¿ß;÷ØaZæ²À%À¢5L" ÏÉTÚ|U¤÷³e2ü#Ýê¾Ç ·ƒV:mOn·fI/›SØÓÌx§1Þ <ïàÓö‚‹v¢:ñˆYÕƈÎÛ¤° \-QrÕeì’c—Ÿ¸N¡Þ°é¹ëŸº _™ìzd寽Ï0µ±—†‰|ÞÌ7E×ìZ¥"‡É9­%b¥J3õ–8·XôNêÂA|Âæ=Öô+<ñJä© _@&R»«iì%<÷vÿÓæ=pƒªÈµ8/B6úReOÑínp¸±{Êr°ÃMä”åy°ñÉÃó`‹˜úkï±¥;¤½çXI4€Þ¹|5\þšV7\n0'1I»ü¿Íáîï‚>á±k“›Ú3ŽÀÌt‘ æ„6/CÄGtE¸u6Ô›ák½ù»6ÕB5Dßø¤º4 v¹ kG˜Rõå"“=Ldßã,åÆ, © lÙ[uŒ>ïšÌõ ÙS§öfåtIuäíp36å6 &mWÞžG9Ñ‚)ƒOxøtƒ¯ e8ï¼³pƒÅ9~›§iª U´8s»>ŠfÉU·7wͲk–O·—Z·kÊ]Sîš’×”žÖ;„Gz²‰ÀÍÈQfgɶ«ZTïGÏó.‰ú*buJ–½ÜŒÊÓ¸âÂãP_4åÌw]EVô¹a-FmÈK)TÖ[µ,Q©ŽÓˆºÔ…»kR5 /#5ñú.)˜ST|K2Īür²~“2¤ê-MS«ÉlÞc —{€ uAYöîJ5Î0ÍÙñœâ‰ÑvÖ]ÑtÅ-‹©°e9;¦=*ãa2!vŒÆÑ9¦kk¶Iƒ³A™ö™Lž(#Ó°K!ÜÞqù’uÏÓ>0¬ ]Ы,ܽìËzÙuú^‹2^òü·¸÷Bi[žSNÉÄ> <ã׈Õ Ö‰ÀÁ|!gYSý$/•PñÊœ§©pvp£ýü*¹šª“HtwÍ‚¢¾^k1"Wkz룮¢ØÎ‡Oš$F}ÌY: šŸÑ> endobj 6900 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F8 8 0 R /F9 9 0 R >> /XObject << >> >> endobj 6901 0 obj [ ] endobj 6898 0 obj << /Length 6899 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾Ï¯Ð9À¶Å—@`=^È!€a99»Ù‹õ"NùûуԃÒGµJE¶º§cdGCÈb½X,Vßýñóß³þ7{÷úùßÙöçëç—üRš¼ÿ_ÖþûnÚ «‹}ÎÊÊd?~}ù–}{ùôò©ùï·—þƒÏ¯nžþ—ÉìOÍÿÉþú·¦ñ'ûGí|})EÙüüµûY—¢yʇŸmû¿^þò»ì·¶G7œfþûw:¹T-C{qÓÝ¿ÿþøÛË»ûF©r™ë"ZéLÔZfÿùÇËÏÍ®ûüRk!ÊB—ù‘JÙ”«LȺU,Æéþñô¥ó*fç-äÜHªÁÎ9)+•EªòºýBÈxw³cÅÑ÷ÎIÜbà}³Ô ø)ZU«×¢qN 9;VqqïœÄ­ª²GlÖ¿øwÝGÀ¿ÍsZÈٱ∋{g$®ÒªêTG íØ{ ÚO+÷s#Å’v.ZÚJaŠª¹xiþ´ÿõ ¢*§áÊÚyÒ}„ÎKc"rP 9;V•qïÍ—¢.ò²ùô<Û¨q Rºa›=Ŭ½ÝJ K Oîï&Ÿü ºj·?OÀk`6ºn`Ï3ðtV5‡§žçÀÚ[è´}˜ƒÃŽ­àÍCt\9 }ížöbiÆHìCÄk;‘-zº‡±ûFè #²Å±‡¨eF$7¯z8*½>,nïÀ™õĈ–é°‹Q¦ |hñ°ÿµoØ‹—Œ!àE¨|ÚûW¯aÊ ´k×¼«ƒøRÂòÏ´Û)^ºW:HËQ3£Ð0\÷ÄŒuܵo£¦‘ñ¨lUf«û½pœêžFHÍe"}óß¹4O]ÎÁ©+ˆeC9…j­'~$u@ ÁfŠ)ʬ:ÚÆÒtà‘º\R6ÅϬ½ð8×6h Õ®ôД›¦ƒtèéÀ˜<•S€]ƒ¨ž^þ¨½~ŠŒ( ×™(²/?·Ñí˜ý/ RLö]MY4¿ý”ý>ÏÕÇ?d_~y©/…4Äþ¬Ñ›~# øÍðÍ+ìMÃo l¢‚ßÈýãÈöö~ß`rÅÙ›‚¸`ÒÏ4€ëïß ®{NüáK#úǤ¶"Û,­È a캦uê¢*Í ¢ÊÂtŽhÝsQ²Ù£›%á«KUçóo´æšÒF•ð¦fu¾hÕg7Œ`öù¥(Å|Ò¦{£6&oJ45Ë•Oàµ?¥€Ô3…0—¼Vs¾‡½õ´Ò½éPØ æ‹ Vþ4 °VîÖ&§.+ØüFäðMé¤!Rà|'0Ÿ†çóÞG1f·‚ô”>Ì]xœ[Q$i³6Õ•¸)˜ÝE˜—U ÊQû.ÃãøÄÖjCX"êk]Ö¾Âöi@Êñì±òÅ‚CàEKaaèM¬µ0ÔPNüy0°Ða†€óÁ­3@d ,d3ùq¯ Á ˜¡]^ù²Iß$EÔ!¥*¯6úä+´t!]0-),IQæû9c—,P¬Š…•Fcî.JŸÓHêã/ÍÿØn¡¬—v¥LÁ½Þ&]ZjpYL‡°`&º€žb)œØÖæµo(T9gA^‰ ˃î*(ûÐHó3 > ?ôÃŽÍeÀ,ÀLEÖîŒbnö¬ßQ™M0±IB2}n¶§$¨ ’é! 14Å!…­\|Ue¢^ã+Yô|UVYo/‹üÒ;­X{SZJßÓmÅlß7~S£oÄà¯õ½¿ÖͰö„ã¼Â7;=‰ÂQñŠo¬EÕ.ÞgÚêì⢄ô âÀù¬Wz+÷÷†!°3+ó‘A@Á¦G°m(âF»åÈ”-ŽyÎhj°Ì;ÖÊ p{ý»Ç2[à‚âÛc=a¹+bóM6l¬îY°aƒ.øMÀÍÁë(^Éâ<—Õ`ÛeQ8ÎÂ~0ÈMÂp>Lýßà Q8Ž‚o(çŸ †'Þ>Õê„4üR™MxÁ¡œ[o’ÌNåÚá”ÍÝuŨZnó–(5IÃã`©à€p A€G(²¹çRÓfÐ¥†pàŒ_ø†—Z8°Ÿ¤1áÄ‚}…«m\xñ¹ör¯½'æË“褺>À±¸úkQ‘á„C³¿¹Å¨ÃÉÜ™W$aRÍRʪ®]JIRRXëcjA hÏ–´3øIš(Ѫ°Kñ78­Žb!R’ôXw§©vÁïƒÎŒ7ls`Dá¬(ãÀ™Rö‚)íô¶îþÓN¿ÂNgM­¥XðOÙ<ƒlžÃþ1æˆÿä÷*¦<2»”»SÕóQ£®±R… i˜ŠM ¤HudxWÁä”\ |’F™%ú‡#~OŽb§„F%Jè¸ïøJ@7éØ9ÍÉ;%œƒL±'ðŠ¼Ì¦ˆ,Šñ#—òÚ_vi ‘Â@ *%kË›Μt’(ì)UÒ3v•ºáüÀê‚9ž ?¶PÒÊ’aK5­ÉÂõiÅ$‘NRÑ€«.æ|Ê2® ú†Ó&Çä?€Ë8zÜQˆ`í’L‡Ê%â*\×…¿ ?Æ6ŠbdíææWª´BòÁŽt˜{È9`¶ñÂ[i”Xb5C)*'Ö‘Ø›°D%[ UlmìÜr‘tT£¶yûÍØ‘ ç¤ãl:‚þMhGª¼<âÚ‘§·#U^ɺ{Ú‘O;òv$¯ö}Ú‘yJ;R ± éÝÚ‘JÈ#Þ˜”Ðû¨á£d%s5gß}wNÝÊ_ËS™ÿú;®NÃO8¤'-³ŽÀNÇ œ•ï9ITbøv×`áŸFÈ1Üsç;%ö®bâ&vð^7Ê[+`?ÇL‹uŽ5ã©àîCÁ1§~SIJ‚ÐÍ"Š®W_:IIB]ùbü<¹H|Tíã=íí%qÙªªjozOGF ¶ªkãá}3?<ÁVxˆÚl…9 ·¶7iã½y.°æaˆbVPªÜÜìNå'}:Q<¯½N²Ê!Ρ$?ÑÍ ¼žcƒK¢à"œ” dlp…×ò1Bû‹Þ°;L)ýYSJ=\Ïú'ÌáIVpðÌ)\¬–ÄÛ¹N‘T3[,óâx‡bS€}s<)iF÷xˆq½ 8þ‚sW×d¦:öd9ùeY°±þ§Ü(Oѱ;ªÞ| Æœ&›¦–/¯eÂ4\wH;Ì[Lw×áo•‰zmLÙOSåÒ{öù¥¯6·‘µ7¥R¹(QW¾ÁãÔèõêÖýÞS4ùf¼èÜsÙËÚVÞ¸*ª{ °–GqQBzKìMJAŽ©Ð ¹(œ¦òâ®qD¢Ë/”RCo=CV'2¥D É—–ªR !+§Ô3Å^ T”%ÕuçðR‘8åÑ °ßUÜ&2Åå@A1¥Å=EËí‰0&8=œÀÆ\ßjå-p{ö©¬îVŒ 1d©”‡MiZY1þX&w‚€R¼¬·[µ• °«ìO·T9pëÇýúÊJ/6ºö}CǹW¾©Ñ7ºŸiy1¥ïJ€Þë<ûñ®yÚcÆco:ëµe‹­)îŒ,Þ‘òƒ#:YÏ@-D0I8ƒã±z¨9ð,äJ „ä ‡xìö…9¹~˜C0}N\GâÃvB@²`àDi$ f僔¥‹j¡6á9sé"ƒi’ŠÂ ËöÔÊí°¦e{šÙ·¦ûà蟶þàŠí_µšj¬Ò\´6t&Ýj›Ãú¥V¾Ë«´_m¥+EºÐJÅòÅ‚¼‹› 2ÈÅ4ŽÚòà¯ÁöÑÎm#°§A åXwYÄb‚–½±3ïMW¦!poðkœ‹]SŸT†kŸˆ¡!î(, ±ƒ²€røîÛ§o„Ohìa†À,€‰§:N€2W+¼3J`|ã]bªÆ¶TXöéåÿ›Å+ endstream endobj 6899 0 obj 4802 endobj 6903 0 obj [414 /XYZ 37.5000000 297.500000 0] endobj 6904 0 obj [414 /XYZ 37.5000000 424.250000 0] endobj 6905 0 obj [414 /XYZ 37.5000000 297.500000 0] endobj 6906 0 obj [414 /XYZ 37.5000000 212 0] endobj 6907 0 obj [414 /XYZ 37.5000000 509.750000 0] endobj 6908 0 obj [414 /XYZ 37.5000000 770 0] endobj 6909 0 obj [414 /XYZ 37.5000000 665 0] endobj 6910 0 obj [414 /XYZ 37.5000000 509.750000 0] endobj 6911 0 obj [414 /XYZ 37.5000000 212 0] endobj 6912 0 obj [414 /XYZ 37.5000000 665 0] endobj 6913 0 obj [414 /XYZ 37.5000000 770 0] endobj 6914 0 obj [414 /XYZ 37.5000000 424.250000 0] endobj 6915 0 obj << /Type /Annot /Subtype /Link /Rect [357.750000 313.250000 429 320 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_default_args >> endobj 6902 0 obj << /Type /Page /Parent 2 0 R /Contents 6916 0 R /Resources 6918 0 R /Annots 6919 0 R /MediaBox [0 0 595 842] >> endobj 6918 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F1409 1409 0 R /F1700 1700 0 R >> /XObject << >> >> endobj 6919 0 obj [ 6915 0 R ] endobj 6916 0 obj << /Length 6917 0 R /Filter /FlateDecode >> stream xœí][¯ä8~?¿¢Ÿ‘8Çv.BÚ¹!ñ€4š‘x@< …­æ¬xàï“έ'ŸÓùRvÒFìé㜶+uw¹ªüþüíôÏÿž~xÿåß§ŸÚŸï¿¼$¯¹MšÿÎÿ~;H‹×öó)/ìé§·—ï§ï/Ÿ_>WÿýþÒ|áËû?UŸþwJO¬þÿËé/­ÿÞþÑùÞ^r•W?¿Õ?Ë\UŸ’þçyü_/þÍé×óŒÝr-0ãßkU–æ ÆÂÒß_º×Tõ¿ÿþôëË Ö­R$º,Š“2ÚœTiÒÓþñòsµ@7}òZ¥òÌäÉ–…ò´ZɨDŸTZV¸±“uê2³«“—yÀÉÏK#EéLy'—¤¬.BR¶Ÿ=òM²5ä¡(‹&WgÚ¦ÊfE–Vzéõ,ãõ¯ÛÞŦe‹¨|ª&¶£ê2}€Éój8Øä5äâX騌g¯¾©Ê,É ?×¶º·ui5Û›3Ð~®¬UV±”;Ðýrþæ7wª³ûyW¬5eü<‚Ëœ´5Ý#°´µãågÌÎñL.TrØj pW«~€‡oõÀ2^š…'”ÜD§ó\z@§ó連´¬Ë§ z€;þ}aì»…ƒSdÓ;„jn&y$Õ@ Å†ã¡PÖè­ù´Œ¥áÂênÁ‹ÒÉÌìoãqS³¬vŒÐìT1¤Õ˜›†‹Ôè©Á|²C€”]ƒ¨†^îªõ@hD9äy Ì!j¸ð„¶[%­È;ˆu. æ­lÕ¤ôPY¶p”åü²xÜQõ€Z†ËNVi$1´8ØoUÎZ¼Ô`L)%W5~ÆóL:7\ã©4OÍ?Ãi‡x©žèD~3ËxQ3¢P¿\£|Ä‘1û±’YFM "ãFÙÒIr«þ]µœÚê}²ËŸ~s¾*¦y´JÇà(í1H‡PÍÍ$¤´Øp<Ê:5êè , ¾PWHÊFø«1çvÆhvªízhÄMÃEjôÔ` >¥C€”]ƒ¨†^îªõ@hD9ä)§YD žÐv«¤)Ó‰˜qÖ¸€hZÙRSŒ×CiÖ‘fóËâqGÔbh.;Ye¤‘ÄÐâ`¿U9kñ¢Ì!¥äªÆÏx`žIÇ㦃k<•€æ©ùg8í/õÂ3Èof/jFê—k”82æq?V2˨QÆCÆ­²•³ú÷¢ãÔîÓÒã5þªœæÑåãJÒd@ÏïŠFãÒH2¾ÅFŠ)Ê:µêhK©³¥n¨+%eCüŒÆ ‡sÛã4;•€rÓpÓËÖå“v¶Fb t ¢Ììª~ Œ(‡þ N-7‹c¥#.œ=L‚š-òŽ*A‰< ™Ë"\b¹8V:2ãÙ×î¦.yS¥Ñ㔫j`èáÙÉ@÷Ëù›ßÜ©6'¨•eáÀSóËãñÓ·n&±Ì´)š†Ë÷«?ȣšB“™¶/FÏtãî·4Ã|Âóïçô8UñkÿéÀ0…ÏŽŠ ”6ƒcsˆéÀü¹Åh\I6÷,6…²Ž@oͧe, ¾PwÓ>8KgfÛñÞ²0.@sSmÅsÓp›w` > /Æ_¨–^zŒÐˆrÈ3 Ì"ÊÌ€]8êóÛˆ l3 {¾{¾øîëËŸ*_0;}ýùìAl~|}{1Õ/ÕF8IôéëßO¿«~–¿?}ýåE%¯Y®ŠÜÖW?ILýļÝÔA]ž¼‡OàwÒfâµ(“,µÃïØúI…I“<)šïlZO¯TóêúU§…J‡¯ž"`&’ÁWÏÑU ¨µº)iîþ)|¯äcýÄv¨¸ zæñ:¢øó¼)\GØQ6•À'ßyÞsþõâƒAÂHYÁˆâ‚¡S¢Ý…{'!÷p6eà“õ“_+²Mû@û§¦Ñþ¦Óþê|é%œÎ雂ø±N‹¨¹ï”è;¦yÓüÕæ®+DÞôZ'mÈ[¾æ™u À}¿ IR³AÃ8Àx‹†FÈ”yM•c¦¡(µëÌ’»TôîRŽ^Íãà:Î|hÑÞze×蜉BVšÉU®Ô{M&ùä xÞðñDÞœ±žuðkHø»Ø»˜NB˜"ÊÑfEX×Qí!ã‡2ÛìJ¸x3àY˜¡º(§´ÞÀ:æÅnîÄé#v|ÔNb…Pîû"fZ7«KǼQ[fÏùãc¢+>’ú#¡Øˆmµ›Àâ' ˆdÙËËmß÷²Áž× <Ù´y¢TÇ¼ÛøQ6Œ,ÆŠmaÆÀë0,ƒm¢¨Þó!^GD1µÐ|ªÄZ×~2ᬉ]“ضa‚c¿ÌÃ$“éwÛ¥FßÀM»°0c¨t_Ù†âÞ à“ŒRò¡L‚D$oDé¬ãO-)j`f7ó$ý~G£'­aŸûÎøäãúu4|ë}Ze97›’œ­áÏ=xkùUoÚŠ—Ôø;*'¾SHBBQ× Óφ¹ âÚ@Ê(ÁC¹ Ê‚Í@©Ç8ÀM!loj}ðw Ìi –F¼äx¬ßð:ú]D›S9gKðà')äòÔ³1¸ÂëÀÙ,ÖOcSø5$ÖØJ@.Ǹ¦ø¯ón=/3Òd±ýÀBpUÂð5ödʈ²™›nU±3ï…#¼4-cïîâ Î³'Ä1mˆG*}J6ä×±8âÏÚ=!÷à‡ Ozr×pZ~ b—ú“yã€âš\%‘(õŠ˜*‘…(»ß§(É„­1I±z•Ð ƒŠ[ ÊFÈS>e ¸&â¿ûñ£|e 9N¨ò@Ͳ3^s°,jÒ…óvŸçHÇ>GŠäŒQ<Ší%N8aN¿ç 9liÆ– h/ËR¹örEÂ9–]"ïcMÒÓÎrvðY4ÀI<ž³MlÞ'{BVe=êˆV´†™ [h*Ï™xÓûÏ*.¤„MÕ7ÝÌW‰dÚ8µ€=ìeÎ= ®1ÒÒ¸oXü —ÍCe¢Ïã c§„àÚÀ)é;ìÎ\fy¦s åºî•ÌÄ™û)Á]ŠØD\v*ºL´ç&½%*D|ý¦ÂC[&¼[% aú‡¯ ¹96ßðýçm5$mæØœ%d⌾!´$¦“G{áS«f€P›ž†ŒQ¾¥N&'k °Î%öñ”¥µ§0§[²±þ [²Îílb}…6~¸4ÿ QäªÒ9ÅÓY¥Ý£Ël7µë=ÝÄþ‰Õ­E§7Þ­CMtkIº$ÎiöÞô÷0yvD!ò¹óísÞÂÛ2­8¶díÐã0ɶëÝÜS¡Ì¢wß½"V–A–¶"`.‘¢o ×tB€/ˆ§7)$‹„//wоœ}oÔVcÂÚXU!÷Xcet˜+¦4ÁµO˜ÂÿËVyÉÖjb6¦þ ËY¬Š:,1똌^Çd“Ò%OàV„‡HÆJeŽÜ£ƒ:½ûZ$‘˜™ìA ¦Ó œ§,±pÅ/Uª9T´6½× ,JÎç«c”àŠÿ#ûDØïÖj-Ú·„‚ša2ì{a\ãu 娎&øM!Ô˜rÔlx7qÀ&CÔ˜ã±Ìá=„ÚÃ; ÄNå®ÑÙyçzt6VC8˜€¶`Ôc4âÙ²˜Úü‚,¸ÛðBšY’¿ƒ¹žé¦äÑ0ø; Ü“2Tð@ mjBÏck뚉Xa}…9C€mdâ“*¦.Í’.0ËKÈÌ%Wi²¬//n0Å ?Ácq]*§}Jä H¤Ö$ÒÓZîv}˜Jî̇a¬4µè^èÐ:K>Öd åˆn¢žÈƆšé&ŠÏWLL—õ¬$ªã‚!GÒq=JðY[,Àì…¨H$¾G¾ ßs½6&®)ƒÁCS&·C-ÚçYv‰1zk{“™,QcxY‘‡±qÓ‹"Ù†YûÛXõ<ÁzK1±]ÁÚÂciì`oÍ#«˜e¼ñÅ{ÛÓ<=þMê¡Ì–ŽzºG€Gw3Š˜rݱëm1y`c®œÆù6eʺšŸÔ]´mZÞ›(æ;Ïb)éœÍ<ï˜ÿë£e›WReßÄUt÷ߨ-pŸõ;½.:Vãêý›ÛR8/¿øqŠï«€0¤‘,sÇJÞ[ƒeýAíyBˆS©+ãmËÖû•˜_Á‡p|æ ‹UïØ îݪƹ ú!L7/Ê%é‹.2I¬¾ÿÌ:XY3¾3QR†TKÈy…»ç£ZMN„m…pOjÕý6ÁÕQ[^Ù °Ç0v±Ø°1v<ð>ŽñL™mlO8F3D^¯Mnµ^ߟ_ÍKrgK1´2[~W| s•f߉çÄ!dF‰Æ¦AnÆ È*KÞð0êWÓ,Ö|棂–;¦óÝÜaчÁsS¹lÞÃäÌÊVd2}? ñD¶Îg:`05» ¿yªÖˆãiÏq;‘Uò8¹0ož'ï^¸³¬£³¢£ããôåÕëT}‘_}äþ_)N¹‰”ouŒÞdEŸ %Û›ŒéVÅt‹e¹cöË*û:O¹~Y ‰GeÖïo2ñ(ŇîLâQ'´+RkZµ±êþ0O/æ AýL<’šTköò¶â‘èÍNžÝ;Ã|&=¸Ù¢5öf2žWXs‡»·Æ¾Me-Wh`Øî“·_u)ÒcG×mbû¦¼¹¡:ué²*¹ñ`‡èP艒1Qüx‘›äÅ2®¹189ICØpG,*„1 ×ñÀ†×Á§1X£ÀˆWÄ•MʾX'ÞVõwrlhãÒþ·èEâ Õ“H6Bµ,S5´'G†z›㦊…0 *û%#…=ñ&æ‚"âµ"µ5pô*V‘Òn7?ã×à‚ ;wF12a‚É öLÍ s #ƒ‘j>=wØà8•h¦k´»rx­ÐÚ4uláMÇX!¦/Rµ&q[{àä}ÌTk\•G;ex ˆTZCñq5u;¦æ7Q[na‡j ¶•IÓ r`e#MÆàòœÉZN$tÏÔh`Æeœ7ÆÂá×MµhcÊsÊ•)>ûär ãÕÿ…ÀŠ ÷Yísswº[bNmR#U?Ú´¿õÕ# Ì^-Vû€›ÒŽáͭɲz®ÒÅo©¶T¸YÔ½9é.k3VÈÇŠèE„ëu©v-µÌm¸¢)Tê(tÚ“®9g’!:±Éö„ÐV„"˜Žq×wM’é @4umRsähòÞ÷ÚÆÌ×6&籫¢;*Ü4f=ϯY'¬”ígõÀ^ÓýiÍñýþ­ˆ&ËkZbI,Ími[iöV5ïªÒ ×ðÊŠ–hÏS’ûWÏaR©F+ZŸ«Wä=ëá|e¶£A\•V%ϳroTÜ;®½Š}˜æÓcáô"œbu<ç‘!ËwïaÜ™ýB!-ÛK¨TÒ5ØæfÄ LÕÊ}¨½ÕH{7#W©}u½Ú/òÒQûm&ÿœÜ˜£ÛóÖéËçYÐ-ìÞéi¸_M¹ÿÌÄ5Û×óÌçœ<Ž|{ùâñ‹Â8T5 Žh‰\ųóÝ%BÎ “JJ]CYGKí'òeqMÕíÎoǼyGéĵ¥7àFTfú^ ÔÃÔ§ÈEµý ­Nzf¹Íƒ¢7›¶ †O.×5×óA=õlHj=m:FÞ¿Yàš$§ëýÎIjñ³»ß³»ß°²Ù©"ùP{güÌ¡-ŽF«[½þrAÆKf"²Ô&1ºBæªÜ1?ãt?Ì}–Ñ.f ? A?~ÎD“«¼šœ.Lœáö„3–³¹ïÀ=Þë´¨ƒ‹¯U|&^øgcš¯ìãa*ލwŒ ,âø,æqω¢i¯VAÛ¨ÇÐÉè3LD¬V$Ê0×$ý`Á@ϲDÒÅîÃ@0YéÌÕ7z£ƒH¢ÏîERž~{¸F§Û i·· ~"\Àµ¢‡M¬Ê¤[ê$ày "'aQ‰m«®­k.Ÿ4Õtj€g‰f(ÜÂVáȘÏƽÅ0"DÚJµE¤öÚo0ÀbGÏ6Ý*Äß+*cR‰ì¶<)‹Ì­8¢»Ïž@ö¾H}Ñ<:ŽÀõÝkLݽàôÒQâ ußÁD̯/ìÀ‚%ÓÑ[Öó}öîÓáñ‰ ïè€>ña2²ƒvO/]›ûÌõvpÔf@d—.G0›3%2…·Å £xø‰§æs9ÖÄÇb~¡ª¬7\qËo”maذôèNf—LxYÔ^ óæýwýDÜŠWuÆ Ô²q7aŠùSð#dßGötÇe% ðÔÜÒˆq­åúú-{y¾Áø7}ËD1íaÜäÎÄÓ1åÎ8‘Šà}5}~ù?€(° endstream endobj 6917 0 obj 5974 endobj 6921 0 obj [415 /XYZ 37.5000000 566.750000 0] endobj 6922 0 obj [415 /XYZ 37.5000000 424.250000 0] endobj 6923 0 obj [415 /XYZ 37.5000000 272.750000 0] endobj 6924 0 obj [415 /XYZ 37.5000000 708.500000 0] endobj 6925 0 obj [415 /XYZ 37.5000000 332.750000 0] endobj 6926 0 obj [415 /XYZ 37.5000000 566.750000 0] endobj 6927 0 obj [415 /XYZ 37.5000000 424.250000 0] endobj 6928 0 obj [415 /XYZ 37.5000000 332.750000 0] endobj 6929 0 obj [415 /XYZ 37.5000000 302.750000 0] endobj 6930 0 obj [415 /XYZ 37.5000000 708.500000 0] endobj 6931 0 obj [415 /XYZ 37.5000000 302.750000 0] endobj 6932 0 obj [415 /XYZ 37.5000000 272.750000 0] endobj 6933 0 obj << /Type /Annot /Subtype /Link /Rect [55.5000000 432.500000 147 439.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_ownership >> endobj 6934 0 obj << /Type /Annot /Subtype /Link /Rect [43.5000000 62 541.500000 76.2500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_exception >> endobj 6920 0 obj << /Type /Page /Parent 2 0 R /Contents 6935 0 R /Resources 6937 0 R /Annots 6938 0 R /MediaBox [0 0 595 842] >> endobj 6937 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R /F1700 1700 0 R >> /XObject << >> >> endobj 6938 0 obj [ 6933 0 R 6934 0 R ] endobj 6935 0 obj << /Length 6936 0 R /Filter /FlateDecode >> stream xœí]Ë®ã¸Ýû+¼Ðnñ¡èg€,4º,‚,‚™L‚AßA:Yä÷#[²®EéPÒq‘’eMcÚ÷Jm²X,V‹‡UoÿøõïÇþ÷øöÃ×j>?|=$§þ©úÿ×ã_ÿV=ü¹ùGçðrÈU^}~¿|–¹ª~JÚÏóóþò»ãoç¯Ý5Ätc]f2Fºþq¸S]þü÷§ßokÌë¥HÒÒ$Ge=ªÒêãþqø¥êàµùäTj•fE¦«1žŠÄÔ¿²]æúÜgQ1Gé²ê¸â˜ÓeÝ€Pó/‹<\ãÊŹ¢L¦ü­WßTe–ä……?ßöšvݼÑEµ:òöçLûOšß.ßýî6v^.¿ÜP¦rÚ²"þÜ¡Ì+Aí„zÇÏÏDÙú³K‹—:_;«>°Ä‚—Ë“¹\©éèOç]“•^ÔçùãFt¿T¦úO®„\–û}Ïœœ´„Ò5Jߌë¦GüüBÊm;Rüètévqó»3\†¿\žÌåÇðÔÝÕéׯ_:¿vúÈJƒ^؆,}Kå}¼2µÄÜ´ÙáȹÏ*ÌýB‚yâÌ‹yíT˜€Ý/·/ÆYâ¸;—‘zU õz²l^hÉ4§Û…Öý]H¿è´KŒÎº4ô~O;4 µ#Π ¨¯[Š_ÍäÔšgŒC^ÛiZUÖÜ>·]m~·.5C ݯr:BtÓÉ…5g*^H;ä9¹™À¤f¦LŸŠà\êNMGõ™ÔéÕÔ.¥­<æÌæÉ=[­‹{ŸéʉºìtRÊï^›°5ɬÉÂ5~¡\œ+;ÇÓºää¦EÙL® °©}m>ÿ “†küB¹8W®“‹[—œÜ²h¤¿ÚÉs¨m=ûó¤HÂÍí…ri¦\§6.8³yÕRÃcpÿµù§Ö„küB¹8Wš¹õ´.9¹i™4¸¯Í‡à‘œÜ å¡ n¿õ/sZÁ¤ÔO@Xü‡ç‹ï¿Þ~V¶"HeÇo¿œãÚç>ëoáÊßœƒ»•ùöóñ÷I¢?ÿáøí×CyÊt»k®ß$%z£ øƒÞè÷ð;úòæÓ·Š{Án*ר;pk!A <ƒopkxàæ³>y':]Ÿà(ž‘Æ¡Y0pN !ÏC5äŽgæ0¯á\ç°µ<²mõUnÇõžÆ‹æ£è¢Á­e1uÜ+³’ƒZw ¿­áï`m'’Y«ÍLP¤’³à¡j2ÕpåãùÁºÔC5c5à‚öH"¦Ûa¼J°f†o–Õ²HkØä¬4²s ´™Ä+1y–^èqLq*ʤû¦½¡75síÉšâ2ªpgh ‘fV¥:.œŽU;6Ä›ºysJmVä’RøÃ3t<@ ß@3­Éʃ­U^zÊrÕåŽÂ­}j¾SÙ>Õå)3(˜˜j†£ËYL3ÈÔ(såÊFzúÁÃÀâì®0܈‡$¸ŽtÝšR×WZëqvÄZ÷ÈlOï‰.~ܱ.…A,½Èª$ mLk=Ë}W+³¬äG8 <ÀwP|°hㅂǃýlÛñ‚j’ò!‡/UÜGœq?9¡ÈÞ»BK˜ ±xèÖ‹â9î£G,aM¬!c$·Ð3žwîÐñÄ~â6×S@£X–Ú1ŠûJâ»_ŒFeì4á)`Ú˜ü vÀë_﫲Ÿ²‹#„ŠO3ÅèÐ<ÌÅóÝÛ=ާgà¥û1çrså\M¦Ò×±Má^wXÇ­a±dÜÏdô/³5Ìñ° ¯|ÂiÃa?¼Ý£Œ,!Œ¾òp” `Æ6³f¤¾éÇå0õ„óà‘.,ðxÖ{¢L¬bFœ«ÑcªµÿdrøPab\ëµ »ïJâ «oL Wx„¥‘€ä}}S+R•ž’ÒtI‚±Ãæ|À˰Ÿm¦ž¡8·¿qu §ã }ù-ܚݵhÞ«JŠq)ÅlgVÃJU|°®¤Ç,ˆ]ñ€·¤ÆÕPXŒPÁˆŽ2´$ª2s¹+ªÃ±"£Â¬ð;3\C›‡M³KšŒö¸ÉØ™“=êùôbJ°¢§m-y¶ CK6ê‹àiž÷¦¬8KôÆfç§4we?‡«¢´ì¤ëCÞ›~0ßàÄÁ~Z„hì…ǃyÐHöÀH|æ× ÔKWÙë€&ð@ÇŠü©"6’ƒ˜à ãÈ"´6~† {Z-&àny#è‘L¼Å!ð ²'ž0&¦mñ'&ŒéYX¢Ø!*”+±L©S˜ÙÔ1¯úvÎÅ[Ló`H(ejE×…[ÛšÒÀ`à>GƳ-z”çQNî±;…÷=cñ(šž‰eΛd}Æ1qzÀ /¦#¶ç¨ÿÅ©ƒ®;ŒžÀÔ‚'C*Ñ™c&ól…¯ˆúÉË›ðXVØJI9žœ>'{QÊËr”žåçÑÓÚŠçQ#µLºI"å“öëÕäÃ¥Ÿ ¦ÍÆ[Fw¬@ÌyMx`ŒÄÊZY-OÙ&ÆÖbùÇopZNÈ7¯ ©±Œ5$á…Æ’<ÛXBÖlYF5Wýd®É¿~B¯idipkp×á±¼Lr_ÂòRýÄݱƑŠêóÙödX¯ÊJ¬‡j¼‡Ýw…^ Yù®Ð”v”&ḬÄ2ûì¯ÃÚZu½ /gmG`6»n@ö«7¾~v8ƒTBé¨vϬG:×.žÿ‘J3·þÜd;”ðñ¡„£ U#ÜÊy5†V£±Í¹¯Cè-|•ŸÑ8Ó SPà"" “ç=ðµ5§¾Œ„ú™‘b«ŸÞhcE:˜ëšT‘Ù¼wL™ì]0ÈE"c¡G¾cáÃETH”:?A/ð$ʱ¨‹•>™%ÝH=j[&ª[©ñ=œ:ã@÷8‹oÄ2²$‘:Úc¸ b=F˜¯ˆ8—™ÎÜà“'f‡£²¸à*çö=ÄM\‘žàE÷zl„dÑb ˆ¸Õ €ù:/»–¹Ë…ÅrÑ0vƒÉÕ!ëy‹VÕZcüuºíB°H.bâ¨té{Ào¿$YÈâ¢TB\k0~HÀµ=¡Ìà†0ÕÆán„-@oF= / ÆŽIè„Ài)…±Xm¤d·×LÉÔm$o¡’ƘS·n)A|¨D6«F…ÍåàEÉ@vyˆkØü¨¥kY™Àø6É«IP4ŽþÜi„2­G½üÍ]æݵD»hÅ\æ#®ìy.2Wqê!æ¢ø*.æeVÒãyƒG‡¥Ø—%eS\ļ²—em¯/Ègy[0ëi´§'e†hb˜]«EÖje˜8ŒÄ3ì‘1b §J`kX^àwV ˰&ÖXs­™;²ß5¤ZÃ7Žc㙓՘ž‹ü«¸âŸ«%êä¦M¨ƒÓ_Œ½‰Ci~M>ñt§?ó¼y¬Õˆ7QW@iD ¥ƒh¯x~²ÒÃhãà5ÝèO‘]n“aK%W ‹;‰ô™ø-…ªCaýdÒÐÔô¡åÆZ¨€¦á ŒÂ9Webê7Á@‚q¼Ö=N`îs WýàOƒÛ5T šê Z%/q)N篿´Ñ·¾¾ÔsG]ImRÜÀeqqXÈ⬈ñIq&áåpÎëÌ V}atæ™Gi§G²G(Ô)‰u÷ˆº±ÍäÀškú]éhðô2¹JÜcÂÓ†§c à:†YSÐìk\`ÐCÚLáƒáö;¤}®ŽnüÚÒ¶„Å!í²Ø"êš.q§þ‰k:í8ÂI­ÍHÃY=õGL]iEQ)¸””.TyÕ,R‡ÆÑ‡Í>‹v–†Þ0­™‘M#vñ½ùßôŠìF™‹"wæâšªiŠ7§ üòðºÎcþB©h„~Hbƒn‹G âñ`ÚzŒdDxr<"@>Sº‹}ëY˜¬ˆû;=€'{%:0]Öyd ¥êçNI)â›bJ¦ßi¬#2'Ò®!Û†KK%‚"BÓwäJ”Éäv™ã«¯Xk‰$TŒ•*|ù€ìc'œs¡lFê}ŽuÉ"Bü,ËF¹ðÜw4òD=!Êc Ú0‚ˆ*€¼±½âS,ÄWÙ±²Ë¢™óÄ܃f–•>ÏŒå!°uÂ¥˜ˆí«.AKŒË¿§|Ù^tíèß<"̇Ãbm=Š~`Žó5•_®©(¨L÷0ß\eÝ„ùLºž0µA"â}ž»=Äúæ»Ï?aÂa·e‹/®`w·ü¥AìÁ‰ä“Zê~[´ýã³2Êï3E%Ÿ¹Xí¡:|$0w£pxuzʧ7ø=J~ßLñŒTfË3T¶È “—Q"è®eØŒ)…1®Œ“ áÒz89N\†[#Êþ5³4Y©«,)3xŽœ<8ºo’ÁÁº‡ N¹JY‘+8‡…Z_±g¶|¶è=Æ}$­9%ùÓ• å`OPx¨qã&BÜ®=bYANíǼAÏ©R‡‡ûÆ~–>dH¢Ñ ˘¨Zïo,¬ ƒÙõË„QJ[,µ-žg"uLé á¡‹õDƒy,¸­LK×Yx¬[·‘.ÙR¸žÂ89)ÜqùS¼€ÅϦ6k·es•¬Ü/šçP8ûßZÐ c‘¹;Æ}Ü×Ú~â‰.C,šõQ"„ìJ…Ü"&¶†çÁ³‚ðj]7A°ÃÎRÇ{Œߨ¹Ö3d¿ÕV¹ëð¡ö_"çU"WK–ª×ÂÜd ÷Œ–‰@6Ùõä å%‡U)ÌNæä%ZñSÙ“¤‡ÜˆH F@ó™[ëšÏX©#Í™òªÔ¾Ov ÉÁxÞK¼wÔ ž7aÓâsüµ•†i„áy þÂñ`´o#Z³Šc&ca¡â½ô2.܉KmŠüeÕžÙ†³à¡–Oõ”†k!faa›™QJ=……!¯<%ª±”ã7x¶ðÜ‹––)¦@Á‘â"ÁLI[߈bÑ ·ÆÌ6ÖvxDË;{ÊH¯¢à¯-ôèèË.#¿ <;¨xa²Î“¸~à¥v=*!øhyÂÖ<¨\º‰Í¸äWÒw¾´‘{­;Îb}ƒ0NÅ™„îŠÑí½YŠ´—¼…UŽ?*Öx9÷eìL`m1ÄYS¹¶‰:{£GÝòÖn6©ùê aÍãjÈÍ¡>5ÞðͺUеýˆú1c~ámŸ›‘"‡o í+I $V5Cï °‘IÌÆ^ÅÀ0n ~§h5kè7*„¸óÏI{TCÞ1" q¤Š€¹ò»~ÞßÜL4ö4á`À“æé§¸òÄœšÅÛ™ Ìol¬Ó[56¦ÂŽ_ÿ»lÆ endstream endobj 6936 0 obj 5472 endobj 6940 0 obj [416 /XYZ 37.5000000 180.500000 0] endobj 6941 0 obj [416 /XYZ 38.2500000 152 0] endobj 6942 0 obj [416 /XYZ 37.5000000 785 0] endobj 6943 0 obj [416 /XYZ 38.2500000 152 0] endobj 6944 0 obj [416 /XYZ 37.5000000 620 0] endobj 6945 0 obj [416 /XYZ 37.5000000 393.500000 0] endobj 6946 0 obj [416 /XYZ 37.5000000 210.500000 0] endobj 6947 0 obj [416 /XYZ 37.5000000 210.500000 0] endobj 6948 0 obj [416 /XYZ 37.5000000 620 0] endobj 6949 0 obj [416 /XYZ 37.5000000 785 0] endobj 6950 0 obj [416 /XYZ 37.5000000 393.500000 0] endobj 6951 0 obj [416 /XYZ 37.5000000 180.500000 0] endobj 6952 0 obj << /Type /Annot /Subtype /Link /Rect [364.500000 129.500000 393.750000 136.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps >> endobj 6939 0 obj << /Type /Page /Parent 2 0 R /Contents 6953 0 R /Resources 6955 0 R /Annots 6956 0 R /MediaBox [0 0 595 842] >> endobj 6955 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F8 8 0 R /F9 9 0 R /F1409 1409 0 R >> /XObject << >> >> endobj 6956 0 obj [ 6952 0 R ] endobj 6953 0 obj << /Length 6954 0 R /Filter /FlateDecode >> stream xœí]K¯å6rÞß_qÖ|-R”DÁvÛEà ddxÆ ºéÌ"?:)±J,ê¨TÔy\ÆÈ´NéŠUúêÁ"E¿ÿ—ßþëòßÿ¸|ÿé·ÿ¹üîþýôÛ[õÞ5Õô—ëß…mßÝõ¥³Íå÷¯oß.ßÞ~}ûuøßooÓ¿}ú·áêÿ.úò¯Ãÿÿíòÿ9ÿìþèú_ß:Õ ÿ~ÿí;5\Uó¿Wú_ßþýŸ.¿¶èÙ9aàïïLU÷u{cƒõ·7ÿšjüï¿ÿýíû €}\lÕÙN_”©ÍEõF_þ÷/o |óÕ{o”êZÓUG ,N½é.J÷6ÍŠÏøŸLëJ¾q[•­ñIriPTݪTãêª[­šÖ¶z°Þw;<9þ<T_; ú>‡ææ34®û|Jž$GÅi9Ñúð¤êÛÁÍ yònê9"*¥‡Ø îzˆií`R˜à\Ÿü‚›º†Á?¹T§ÓB×@.sÑ•…ò „(ûý*–qP9˜û™Ûp‘¤…¯#a/.“+…R×µ­zküm†FÿZ®ê±þ>¤¦fÁZ7PÝ"!Ö„&”*Ö’Í%7Ë•ÿ»à‘/DS‡×h™yE-Ëè !ÀUSà·ÐR- ´IÌtø2¯¨iáÖ6J€ñ¢åƒùW]»)ðá¦1˜°Èá¦À§ ¡ì´6îËÀpgKÓab8Ä`1ñôsÍV„þ”ˆîÆ¥61E e[>M]Ýx¹`SÇóÑÉ~Âf šíŽ\"xÜd’ДwŒåÁˆcRÏ ©MBG}ËÀIïÚø/óÕ")œæ¿¥"O¿ Ô-ö¤¡‰Oʺ4HmŠL™ ó ráh%ƒ¾ LÚ•ò2Ÿðž˜c·³•Ç'¼åºztÿ20Á3б\5hJ^Ì€nªrâSf z`pŠeâ_Ž[ÔèYÊ»ú2€ ‹ˆn |ºŠCû20\ÄÙÒt:‰Äp†%d»âä`A軳—VÅ)åW­Âÿ2€èÆË›ˆ<ú2pGÞå›L ¡™Ýx%F{d¶¡iUBG}«ƒ“Þuç¿ ÌW‹¤pšü–Š<~¨-šâŽˆQ‘•û2°Év f 0e‚Ì+È…£m”:<¤î¿ |}ðƒŠ6%‡lüËÀÏ(Fp…‡FRt P¶‹qâSf z`pŠÕÃëÃ5z–õ.f‘Á"Â"¢u¾eo§\×xW.¢ltŒHò°¶+. "‰Á‚ПBÎ^\&1VŠ”ò«Hˆ)¤/lêxä1ØÃ.WÆ1‚sùã&“‚jhf7q0âØƒ ³ Í$¥Æƒ¾eª 1kg©óÕ"ixÁGå"Ú‹kð6å!>*2ôÊã )“`S&ȼ‚\8ÚF©BCêI»B^ðt -× (Ú”@"6äšy£rx…†Fbt P“¾0×)>e ©§PU|x}Ü¢FÏj¼‹5È`a±q¾¥Ö?ù-¹†Ø˜œ £Ùdy &•‘Ä`A軳ÕÄ)åW#>7RH7^.Ø”@äÁûr Þš#x—?l2Ih€†fvSð#Ž= 2ÛШ&¡Æl˱låÖÒ4]†õ.së9ÓØ¶ÊØøUriPüB²qIÍö½_È4tkò-ÍË7Þ«ªÉ§ÚQrqT¼nÉÖó¬µëUãÊÑiÝæÐD“¯Ú]_g\P9I.ŽŠSs¢õ½ Ù²Ú«5®a'ѬþÇõÉ/¸©Ã‹ìº&¨.wn+çÌ>BÇŠþZd·Bk’s~g@)cZV·ËÄx¥Éƒ™sk`ɱÖ-ù©–«EPæ þW´ \MÒ6hÎ)Bˆgü€. RcÌBz.ȼ‚¾NWÛ(…ŒíË¡U¤õ¯Þ¼Ô (ÖÔQ„4´¦Iã—Ú„W í×rt PN_:"Fn zÀÐ# ”‰[ÔèY½w±,","öηšuÝ(~êÜ¢’á"Ζ¦£Ð ”EY`éÀ„)â"’,}röâÒô1EJùUÓc‡êãF éf–KAAGžN!:…GÞå›L¨!2–#Ž= 2ÛÐ4}BG}«ƒ%ÇZ·ä§Z®IA™/ø[*òX¸š¤µhÎ)BËHb-Ƀd›3˜2AæäÂÑ6J(¬åµ+åe¨4Ðkd¹]=[9¬ôôp²&.—õKmÂ+°–DËÐ-@9}鈹BêÁ)T68!Ýõ4Ûzk‘Á"Â"bë|Ë®30~êÝ¢’á"Ζ¦£Ð ,~^` Ù®¸€ˆ$ Bß…œ½¸Ø6¦H)¿²-v¨6n¤m¡ñr)(èáÈÓ[$P×ÄÞå›L¨!2–#Ž= 2ÛÐX<’\ÀÚöpcQ7‡œnmÜ`3ü-y:W“tcéÿ@ˆ!>*ti¦ƒf 0e‚Ì+h GÛ(Æ‹v¥¼¬#Ä™ÞáÔ-F Š5u<k åR~©Mx…†Fbt PN_z-Fv z@pНt{ÐÓ:U{«‘Á§\Ÿøâ•‹CÚ-*éà© [šŽBƒXü¼ÀB·±f+ Bß…œ½¸¨:¦H!¿šð„¸‘Bº™åRPÐÑG7H Ý Æ‚‡M& Ô˃Ç™mhTPãQßÒpcQçX®IÁfø[*òÔŠãÎ(X„Xâ£"@— ŸºA ‘ 2¯ ޶QÒhHÝ ¬$S‘Ö‘³¡ó<Á`bM ġКB&uïÅ®ÐÐHÌ€nÊéKGÄÈ R N1 t|x}Ü¢®b¼‹¡âÿ+ÂÌÖxß2’q¨ÑNx*Á–¦£Ð,~^`!ŽÛX³•ƒ¡ïBÎ^\LT‘R~e°CG5 º™åRPÐÑg´Ÿ°ÙF#Æ‚wùÃ&“„jH‡ŒåÁˆcƒÌ64&¥Æ¿Ž+Év¬F£—´Mâ`ßo‰üüöý/ö¢ÚËç?®k¯ §>}ÓæòÝõ(_Û]>ÿùòÏU¥~ùÓåóßÞì»í«V7£|Óª%ïtãónêé„äù޶Œg|Ô ©{²µŸÇ;ý{×6ðU“Ï|ï´ïZÙñÖ‡FôuG©ñNó^k«à3?’²‘$¤®¨Öè²é©÷ÑšäC£3iAÿB‹zƒÏÏŸ¯;æ0=á0ƒ»_¦×ÞaªŸ&1‡ÀdÚ«œ·;LLñÂåOÉwuøÄlÄPº«,nþù§ä{ÕÞk÷Ð w|H”ꊺc&Pj/Zu \5~u”RRÇtkÊÏÐ|h3Á‚6bš1ý‚SìPµèaéghay )µëÅèø¹ËÅ÷€Ok[ö˜5ÇèÖHÌiühÝÖêö×x‚Ø¢~"ÿ”~¯Šû”»klêUßHÛï[¤=–T/mWŠ|F÷ä3–z=¶Hj†fœ°8†Í»4pׄ»¯4H+›6JѤãôýÕb~rVÜv(›å¤‰Öoº²â„=0ºi:]§ùrÈÂI.†_n·b:içô‰o‘èÀPÙ²™­7ý6cç¨ÌpïÈ dœPʉìˆî‰œž~†Ôm?œÌ]8½_ÁÈxh©_¾q¹µ€[+SQžÝ5“_Ûˆ©OéßGa">¹£ Ÿ©©;®Û‰=óyççý|jZ‚Žl­'ï|Úÿ>šnDtž(Ý!-µ X1t ù y‡Ã‡~Sš›;Çþû~Súަ}†a/‰¢¦­‚ᵉ÷a<£èèPQw ­{Fkš¶rÒÓéè@ëT7û½©îO³e;¸¡ç*Öƒ¤?( Tc¨WßJd³ŒD’IgtÞFgÝtš;ÉûtrÖ(l5ÇÈYÖ³tÞK'14~ô€,b%Ï aéÙSÖàëöa-뾑ÐÓÌE‡?²˜Ÿ’+U±M]o?K7ŸÝ‰"3òGÎoèìº&¥vÄì™BjŽ‘Ñyc„Aç÷´ô(+ñ¦Œq«5zMÄl: ÑÓäÔDzFºµöÌh¾€EŽ­¼„PdV ϧŸ¡­žV$k‡~†!AEŽ<9ZHHMöu ©qžîmRsfŸèxE["-Ý70æ'93¤êÔXÚÍÀ˜©èIVƧâ“ââüâ†Ö8#OHô¸œX*;çZ<ò <²ïx¤b¤÷ŸÃ,¼XÃé¥YR‹Ž…:ÆÑžOG2Žæh>4¢ôÌ-5Ý‘2ÆëîëÆ91Nk“%Æeùˆ}NŒ[ ¡¿›8c!ÖL©ü„3r‹ÄZZ6μÒIk(:嬮 ¥¦í€c‰¢cHÑèmŸr-Í©sxºQyz€s8Ô7Ì`Ý¿o 'Vwè8B{1c¸BG‹DOÃ@‡ÎÖ¾J›,7Æüâ«iJ&0¿iÞ0t­¦ ÃPI3ÁJš±ftö€Rñ÷Ì©êå%è×VBß‘µàM°b~Gì](‘èÆ8¶è"mÖdùYK(DãU"Î3–CpQβ÷:œ4NDé ±ˆ™.µckíÍ«•ÚÑtõŠSj‡~fîà×­Ñ”"<©5óuk!¸/W„Ç}h‰¼W©œQªò”ª<Äû”ª<·´V |-óBEx:Ü7–"<7h¦áùØExJa…Ržç¶>^$A=·®”ç(>“µæN¥qgXêÚÌîü]ñ·l Oê´l ?w}Ûë<=À+ÖéYÀºßPêô”:=eK&0¿é9uz–0TÒŒGp€’fl¦ê(åAêô,/QêôT¥NOZ?Üa—:=©7=£NÏÆÂå®õ«/èò‰½¡ô²M΂Nz¹¡iÇ~iÎnγöŒ½Jñ ÑýÅ µÐ–"Z2ä6ÒËâöL÷¬û§WWË"àÔAzdë¢18«.ŒØöèDVmzƒ:»ÄƇNÙ-‰ÖÅg¶µXzœJpzÚĉ“B ¬ÓÝ­¦YbC?Èôã¬B ‰HÄÉ6V¥íèÍÂå°Ëóï_¢éÕfµ^ô$Š}¶Ã 6²[H¶–矙uõáήlÑ‹—³+S¶]Î"â¡óœåŸº8)bÖåìÊÛ£l½]PªœRô²{¦œ‘YÎÈ\°>)f·îŒÌ½x9#ó!<²ä¥¯<)ÆÙrF&Ž~¶œ‘yPêrFf9#3ùÌ™gdöµ*gd¢·@rÿsÐÊ™©7}˜“±vÅßrxUR§íðª“â¼)'aÞÞ˜ræ-²•“0™ßÊŸräRúûùM3Ÿ„Ù*†J2ñP’ ŸL´O}Þe‹^¢œwY•ó.Óúyàn™…c¢Ž=œÏgÂ÷aÎ#ͼͧ¶¸ox”ÃN³×˜êÍ|vòËÕ˜¢% kL1êEmVQ¢K|èZG½if£OÓeìfáT±ãœ‰É9C’S ùU*°bc­¾¡Ù¾Þ;KÆlºöžëàc–M×lÈ;´‘|銥wJõNM=÷N®Wå:žXáVv›³hïD÷݉ÐÉØRNKØ [6Xgî>úø<ÕäAê>šbÃJ«±;ƒP¯ XÑgzê7ø¼Zv_p]Œ´æÂS䙊ÆÀ…ÁÖë ›Ä>>äû¸ÉÂHk47 êÞk"/ŽáF·ÖPR»ˆiÆMt8Oߪ‚«š÷ ÃÎ8=Wöð<áS8ž©dûY•²Æw¯à)Üß—")Ó‡ßT$…S§˜N¿é¹ˆʦUÊ8„U7ˆ“ù¡$ïüµé-ê¦ÜB©œGòT˜§ìÂ;–çt¬.‹SÚœs¨wïžÕpStŠPø¤ú™g–pNííÝ>^ÿðTÇ$²ªÔ1&É9ýlÎ~ÖÑL&(iö ôå¦NDÝމؾ½¹¡ë >àxO±LЩ5tWFìûõù¯o}ׄ„/o¿%zè<]{ïÊ^.ZÙ<|ý–°B›- aº§8«›¾×9½"pF¿/ÒÅŸYÇ}Гö"pí8œ”{éó~E}ª„ë”’š~~²ñá7wÈdvzÆÎ‹SÖ×$Æ7£YïGžf’ˆ1‰ä¬ûØ1ýÈ9Û‘s•ì×YÙCFÏêìvÌþ1VîÈzgæoùÄ6ubíÙ³ò‰Ä‹öÑiß'nçíücp‡û̇‹et—V+ì.Ou !à4#ábŒ!®!‡¸²#²ºÖ³4½ó*Ï`DÁøÈ-¼ö ç$EFÿ·-š°>þ—¡É-!éþC†Í'0àLÀˆxÐ*£clQ` ŽV2Êæm¢ã›Dã[ÄxÙÏeèüì{u¬'gBùgܺªß¶ùG>3¾¤Xç¤XwœJD/z­½°Kv+ÙŽž–ÎT8yBÉT>N¦"»æ¡·LòµsÅ¢iqo)«ßšŠV4º´M¬'¢ÅŽÝþžØ™N5yºs ¶²¨ù ¾Íï–y•`;$"'Ué:þ†.lBשȾŸFÕ z·Ùô]5åtRÖ”9vqVöÐÍM*Ld¶ý97lÍ5dôêÚÖ8b}˜Y Ù!/?7{ïIŸÑ †ÿ.ßsOzï[pƒ»Ø¨· ÖZ©ë,ÒEû4«Ú*!ÔEàŸ>ÜêH©¢ äH#w~½~oWû‰©²Ÿ(>õ–¿ÄdûŽ)5‘F¯52Øè5—íúiÄš'뇸€y E·F>ãüRízõà`,®Á]¯‰½¢Iì8&àVì2Úã=Ñ׉C hz>ŽTm´Ò|ìqtUýîœh‚Æ›NA~ÃØV»üúöÿ0‡w endstream endobj 6954 0 obj 6918 endobj 6958 0 obj [417 /XYZ 37.5000000 268.250000 0] endobj 6959 0 obj [417 /XYZ 37.5000000 118.250000 0] endobj 6960 0 obj [417 /XYZ 38.2500000 643.250000 0] endobj 6961 0 obj [417 /XYZ 38.2500000 643.250000 0] endobj 6962 0 obj [417 /XYZ 37.5000000 578.750000 0] endobj 6963 0 obj [417 /XYZ 37.5000000 484.250000 0] endobj 6964 0 obj [417 /XYZ 37.5000000 578.750000 0] endobj 6965 0 obj [417 /XYZ 37.5000000 268.250000 0] endobj 6966 0 obj [417 /XYZ 37.5000000 118.250000 0] endobj 6967 0 obj [417 /XYZ 37.5000000 484.250000 0] endobj 6957 0 obj << /Type /Page /Parent 2 0 R /Contents 6968 0 R /Resources 6970 0 R /Annots 6971 0 R /MediaBox [0 0 595 842] >> endobj 6970 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R /F1700 1700 0 R /F1499 1499 0 R >> /XObject << >> >> endobj 6971 0 obj [ ] endobj 6968 0 obj << /Length 6969 0 R /Filter /FlateDecode >> stream xœí]MÏä6r¾¿¿¢Ïöµ(R”æÃC€Èa‘Cà,<‹Lö¿Ÿn‰’ȪU*Qêž¶aš‰¥§ŠO‹_?ýó¯ÿqù¯¿_~úôëÿ\~s~úõ­x¯«¢ÿçrû÷O~AÙ¼»ëKÝT—ß¾½}¿|ûòöåúÿïoý¿~ú×ëÕÿ]ÊË¿\ÿûëåÏÿ~-ü‹ûK·¿ðí­VõõÏ?º?ÛZ]¯ŠñÏ[ù¿ýÛ?\þv{ãP&üý'S˜¶¨ob,TýýmøLÕýû÷ßþööSÀºZš¢m”¹(£¯ÿkMyùßÿ|ûýZÁôúâ½-Ue[^¿ñ½)tÿ“[e]^U˜¢º¨²-®u*Zeÿ¡×ïðòªÝñåäâ¨(mUúí×'Uk‹º1ðÚ¯»Òc»)ÛúÚÂw}µ|{‹ ?nOþA_uk,¿{r©º¬®Ÿ¡ZxÈe.ºiCy®Ñêå7±Œ»Å‘ƒ)¨~¬íz±,D ߺ‚µ¸ôb̺I]·w5“XÝï ªÕÓÕ$@ã!V…¿7©©š´¢Š@­T(D¤ ð¥Š½I¤^T™W¾dƒ‚¾uWË(OÚÝ‚ËÕ]EÞþ-,¿Ubª’h*PìU[ªBkò*éṉá_¾@•œÝÔ ¯j.Æî@õ|ó b@Ït»(Ó±¯‡P_Ðv´§Ãzlk¨$FO5E(PÄ­~ÿª$‰’“84ƒNâÕyåûEôòÍ/ˆTôPËÐtb 5n%å!w¥6RnFŒB¾jI|º#Äsl¶F¨ROà²äÀˆƒú¤eh:1þ¶RqYMbu¿í@lÃÕ$i5U>*ç¨tŠ£"ļ ö¥Š½I¤NTYàÇv‚lPó^Ë(ùOÚ•"eŸ Ü¢sš {•€Ûò­É¯¤ƒ§ûª}*9º(§¯*"ÆÞ@õ„¾,”_ñL·› ÛG¨/°„ý\¡’IL<ÕÔD ‰®~ïª$‰’“<4N'ñê·PD/¡g‹åW.]Å‘‚N’FÀd’ЄjüŠåÁˆcDŸw@S6 5nm[FMbu¿ËÁR‡«IÒ`D6ü-Å<#¹;q*C„˜h_ªØ›äAªL¢²€˜v‚lP££e”üŠ'íJµ2Ÿ œL (ö*ò­É¯¤ƒ§ûҾ@œÝ”ÓWco ˆzBrŠe‚AH¢Û­-íúŸkb1XR0‰X¹¶Õ]Hñ­¶ŽW‹Ë X‰Àp„ÅÆó±ójå`!è;ÊY‹K'ÆL‘RíªÃ',ˆiXnF¹êPÐÍÌÓÙÿZ—®âHÁÐä7›LšPC_±<qìC’Y†¦ªjÜÚ¶l¸:µ²í`©ÃÕ$i¸5ø-Å$™ehŠ6¡Æ­m« WqØR–:\M’†ë6‚ßṚå.VWDˆyA¼W”Kƒ¤«De1íÙ  GGË(•¤KÝkWª••AÑ+'ˆCнJ€‡|kò+ÑÃÔ{ÿŠtÄ è œ¾šˆ{EÔ’S ¨2Þ½ÞnQ]˲C³Ä`IÁ$¢›ß_Hñqo®ñjq9¡3ŸJ±$•I-#‰ÁBÐw”³mcŠ”jWÚÒŸ…NÊÍ(W º™y ™}àÒU)šüf“IBj¨ñ+–#Ž}H2ËÐh›PãÖ¶e¼Àìö»)§š·¿õoþ–bθ±–LFŠ€^‘…ó$¶ƒdËDe1íÙ  GGË(Ú¥®$ È=Ä©¼¢TMV{•Ùø´›žN ïŠv¤ è œ¾šˆ{EÔ’S (º×›-ªkYzhbš,)˜DÔ®mÙyÆç¡ÚM¼¹^Ä«Åå„êùTŠ °ÔAR™Ô0’,}G9kq±:¦H©ve5mP:n¤a¹åªCA73OMf߸tG †&¿Ùd’ЄjüŠåÁˆc’Ì24–ö¤© }Y³./.Jž_ò=ñàǯo?ý¢LÑ^®þõ÷Û²[ý_¿½™ëÛ¡%e{ùú—Ë?EùË?]¾þõ­}·e5ˆØß)>¡;ÊÂgt§üŸÁ”ÝŸ¿^a݆‚£.{8låªÔmW¥*Þm­šºšÁ! LB=MMäQŸ8ªÇ`%À;ªÝj¥+òmQónt¤Ð„µAwÊ^Îæ½i‹î#¦/(Ñü6,®§°P‚Ý+#{3ïŽoëŸiî‰JAÁõüÜÝ©ÞuÙ¨{ßF?CëQâè)ñ Ô~›†R/¹cËÑ¥¦-‡£"ˆÖU¢žz=R‰VK¿ºgw5ß`›ÐŠýç .Âyðk¨µèÁË Ò=öíÐE8cˆÝNÊE û{ðV׃Vj'Lm«P_²4©4ÃÁö„ŸQ½•)=<´©­'žÁm·NÈÂßsæHáä”ûÝeÂÌ \¬ÏФbN›À<ž•¯-tß{ÛøŒ>˜Õͦr ~†Z'öH0Ž 1O|F­4ñØÎ9Qã™y„KƒÄ-œ¨}†ß zWû*›£ÒD$“ϯfô>|¾”^z8¦¯‡Ü]"Y…»g>Ÿ…+³‚ Q²ÂÝ4Fðˆ›zÂ)p˜ñ#ý@NÜ|?J‰Î,C“øm.(”bŽ'^îöån7ÕŽÜkªšïC9r¬c}%Œò¨èæÌy€Y{L¼^Ô;'Â7ŽÝÉ&ˆdýZ.OĈ%ž·‰ÏQ–Ñâx ²<–`Mˆ‡§%‹/,ãä η­+êsñØ+Ç›0²ñ ¯o¬” þ‰1ë½ãégk;Gܺe7gtU”kKÜ“ÍòBDRc{éÙsÃ_Ëv.]̲jÇÁ þ !pY!6gÎ Ç®ø­{Ï™[uA´øÃ¦ÇöÍ„—Æ ì¡M­5ŸoN©¯æc,dàìéÄ¡,¼$I˜Ìî%Ãd÷¶%®ðdœmäŒÖí¼É üâ5‡3֌ؘÅgû.[“%8VÁh,¬¹ôKA†ÄPZ}}-¯-ÛŠ¦{ÔŠ3»È”H «˜,ÊÆÞ¶´V Öñ±¯¤ÞW+C λ“)¼[FǽÝR]“Øß6ŠT™àL’¸›@¬¼•H—óh +ò;œe™²½EÜü9nõ|³Ž9Û¬$êa¸ïD×ûÊк8á#NiÁß­aÜ„CÃVpŽWÍ'`-ÂdÍI:æZTÊ`º„éÉ®¬_1·“3k·-ƪÅéJÌ@Üe¡ö+_•)ÛôYzãÑÙ«9’/‡[÷´AÆlwÖÂZÆ|Ä™*e)‹5µ|Å>KLñx{§H3íúÁg­¸`$üYCØÇ8IÎÔ^LáŒ] „wc¹ ÎF'½'¹…gŠ®Nr¿…4ƒ¾ô,—3æô•9ÚÅiÁ».s™yTÖLÖÕAÂ=ãýœmθõäHWLûâL}çØ¸è$hÙ}£pǃ³bïÉ~™(›>Í?ýðe¶rãKÙ¹r8©æ„Ë „çëÅàœ`ÃŽÙ{:d«©Õž³aiQto™ãæÐÊŽž‹. K /Éž>ÇÙÁOv;úg Ð$Ò|¬ñÎÛV¤—EfsÆSE÷„â4`ÖÀê¾ᚣéßûÉsÃ\Ñ=¬µVÀÊô¾Žž5ÅÊ­h/Œðüø j³Ù9cïVø!1¡ý°7ÏÚ(s­Ò—žq3gÂg…À‘;Û*Ó_È:EãD–ÃÒds:ÁÍAtÖ¡ÌB׳dÔÖ½Mv6àYV¹gÈ*šåÖ—P‡!3Å"'\Ú/3pº"û‹·¼uÚ–/Ú±­•ÖÜÝØž$%º‹Øå½Ç´«üe}¤å0ÅaõºgpПQà3-|¦ž >ãÆ ×­’PˆY8ϸ™ô1â6ÔŸ…íÔ©ÂXcÜ lnhLø6ã‡ÏèmªBw0: à´U\±ÐBpûùݱ}™”i!±–ýj_S6aŒì.©ñðŽàîð#lÙ05ÈÀ 7<`ÂYÖ¾[*Õ7šª )"&P?Ï@M0ÞVB°4XC`CûIì w[U\k ëÞÛCBj¨m2™nKjdPùŽ™bwàGà6„ƒÑ𬔄"ñæ¸øm²ŠÄ @´l˜%&FÖºÓr&#ÛåÃwþˆª JÐÖ¶zÖ+†±ä´”Lª$hŸA&ÏÞŒke2yvldX‚ ûü—g?¯gIw4²\ÞæÅ‹©¦¡p=xƒŽ~,»ìÍ~%¥¿„ÅÀ˜£…uœð<ٵʣ¯^]U1v­!W¸óÕu¼·ÂŽùáæ•µG7©ëգ˨âÃìô½ÀÉ0‡dC¨²3XMCI÷,qP&o£írcƒ!N"µÃ¥–…ïà fðNÂGN8å±áÉèïFƒùqüÄdUl ¢œFc8Öv‚qß7Á374ü=9š m ÊÙ˜eE•Â9Q>o°3Br¼•äÊØ$Z$ƒ-XY+±ÝGï‰Têrñ#8‘J"QÄÈ®&L »¾\Ñ v±Ð˜ñ—âk#špY£«¸è&a~g6‹G6æóÅc˜ÆÊ^ à¾5À‘K¶¬Þèþÿð'ÌOÌ='IÜC?ûOÔ¶z4½Çœ¨ý>óš"¼eŠðS¸_é%'j/,5³£ïÁ{ê³v¶Ï¿ë±ìþ5¹Þ¶–ý!ö¢Ýy|B^¥Œëal©›ËÊDöøO€"»ìuËÚý)×^y÷ëÏpØ®¥]©ga­D#à¬ÌÇ"1–•Ë2ÅÚÛýÉØ^dÎÄgÈ~ú +>ŸwÞò‚³QÇ¿­8ÙRtŒ›LÏýé¬`ÅÎþ÷™É’»3†:Æhf®t³‚Ù)#6# ïB_*•ðFÞ0V9¾sxü¸˜jº $þ«œÉY›å‰Ò´ÈaâÙ"{‰Ý[YŽ–±ùPbÿ¦û…Ý{ïÔã÷·m¹ XÞ ¯ö9Û*q<»ö¸³LìÚŒ5‹ß ûu‰•{ |Ï[àu¸Í(;à9Gœe`‡·ÚÄJÌÞœV»´¿Ù:©—æ‰FîTPÛøKK8‹+1‡Upç¼EÞhôrÛäl4™ñ5\áö|8oà·%xc)GºÎò}“PT¡sì0è,¶)îÈ‚ËÞ9ÞÆ cã5ÓxW"ÚÅ6†­¯clžÄšDŽ}-– ¶ÀÄTñÃí £à;x;*Œ§ÆVÙ8áíñ0œ™æ¸WÊZ¸ÁÀšÕ“e,¶Ãû ÉöÌÏl½Øª Ä€Cr–<&´—ö@-àïá´¹\èäÊŽA_Šíà!­*cÅú.;xîÿ¥Ç÷¸=Žœ=áf<ºŠÓGÜ(~QR“µÖa瀦©·g#hÙí±²Û)âfƒ¿‡³Þ–±ef"]ˆOGȲ)‹nˆ‘º·u|F8Óžïø{0:øŒ Ülq4Ïñƒ²è¼eØÀ¿­2»|g 2kGÓÿžŸ'#{ñï‹_üëó¯Ï¶åœ ÀÂåt5 3ÎVkOé'ÀËÆ íåƒR²= ál6¶|çå»_¾{ôݶyÖFs¸ïÎÕK|ùî”NÏâ»Ç†öòÝ/ßýòÝ/ß½Ýw·ÕbCËuN_®~jâ˜g<7'Æ‚”—¯[öuíyN!>³¯ËÕlŸŽÍ3ávžWEYfþðãû4/ž/NÏóža¾xþÅó/žßÊófrñøì&>¶Â”¿ôÙü=g›޶Osðåá1ÏØ_1O2æÉDPí»÷5Ù¦j‰É>ãßõûtf›K8EF sfj•e‹D\ŠW÷Š¢ÃÙ¯ãx-dupSszL‡ãEY5Lü¥‰®&,›èpí| Zž“3$pæ ÿN<1)!ùqRçqÇJçn²TÂßsŒ™ad °ab¬e%x̘çÄÄÁ: šAB °5æ%ŽjÜ€á!áÎ6Cw|àH+ކž-‡™·{3šl‚OlÌœW³#÷Z/Þ%Z²¦Ó–4AÙ1 Ö&62Æv°‹¡°À @·ìÎýSe1ºdxˆûâ‘°±shÆ3øìøLBê=3œ@¾æX%§Ø©,ýû^vGÇØ¿¶y)”Úy™Ø 5¸,F§gÿÈaʉƒö4’ÀM ‹<£sœúÒS¦J3Z9î'0–s&ÞÆX6Êò” ^Ç$öL–ícŠù¸aÙ+~:‚Ÿa„=>ë–q¼t‚ÞðñWø€Bx×ñç±9f†ÒžŸ¢ˆ?pvº>Äs*á’=d!3­ÆeÐÏFf¢R?™éʄ஋ÕfÍ:†“q’žðáå³ÀnÂ2N/Üpš`2kÚņœìÄ”Åx›ad²Å_œÝħ,SŽË˜_ñ×óÇ_œSÔ9ÜåDÊÂPÆná”\ •™9b¬†§/À¬qbL“qj!–QXbµÖ†ÂÜuz/ŒÙ­†¾žsbúšþÓ‹î~tº«ô¸Aæ‰éî}ÈÇ È*;fB_}Èó4méäÖÃõ†©ìƒS%dÃ1½ª"1š1LU@ÜÆ#µçÃG ‹†_Š£ x'ÇQLοÙq(Hã, gƃÿÇODÄw8‡˜2–äžy2CbºËs®ðwÙeãœýÏ<ý˜1ƒNx^<ž–Ƹ“-Bµãm¢_‡ ŽPgá~Éì¯râDãÇ`¨H³Ô#óˆ 1ŽKaVL‚ϰÜ«Lq.ÈfÑ-ÄÀ5î»l‰a‰d '°ï¹pÝt'l§v“ëëkã줛†Ð“ó1øóbÆV ]b10 €•¡_ 6Ë×IQã¦óq먛&JNKá¤D2-s’¸œLŸ±xÓ†ˆ_fFÂÌψ%¼;çK²qšgB?÷+OH匓,Žï|³µ”žq‡1Óê܉Á]ýý; ÑÔ©ä8«Ú%j5ÌXy¶R¢ËŠ;Í8uÁXu“XªöJC¼Ò„]®ÿ^¾_›t²ÅYú wÐPí\ÃBݺ¦—Ò„úŽyÜÞFêˆCê{ö%\?Y½¡?»g\ר³Ø)QŸQ=z©³“í÷¥³Þ¹ë¢ÆÞæ hDV¹OŸ} 3ÎØëñè‹AŸ¡ðÛà3.¶P«>½žÌ–kp·ë«Äƒ¢!v(?¬7=àÝ—ûwU4.‚ À&€•–¨§Ù®€ºÐï®ñšÀxãÈÕ XêËåËÛÿ¬…e endstream endobj 6969 0 obj 7418 endobj 6973 0 obj [418 /XYZ 37.5000000 506 0] endobj 6974 0 obj [418 /XYZ 38.2500000 302 0] endobj 6975 0 obj [418 /XYZ 38.2500000 272.750000 0] endobj 6976 0 obj [418 /XYZ 37.5000000 506 0] endobj 6977 0 obj [418 /XYZ 38.2500000 302 0] endobj 6978 0 obj [418 /XYZ 38.2500000 272.750000 0] endobj 6972 0 obj << /Type /Page /Parent 2 0 R /Contents 6979 0 R /Resources 6981 0 R /Annots 6982 0 R /MediaBox [0 0 595 842] >> endobj 6981 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1700 1700 0 R /F1409 1409 0 R /F8 8 0 R >> /XObject << >> >> endobj 6982 0 obj [ ] endobj 6979 0 obj << /Length 6980 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾Ï¯ès€m‹½€ €=¶äÀX99»Ù‹ì"Îò÷Ó3-õtSúJÒ×EêÑŠ‘ØD²X,V}õz÷Çïÿ~øço‡wÏßÿçðCó÷ó÷Oٱ̳ó/¾»þ­ŽÍ¿e•~øåéÛáÛÓ—§/§ÿýöt~áûç?Ÿþõ¿ƒ=üéôߟýÛé‡?6¿ôò ¿<•¦<ýýï׿ëÒœþ•]þ~ùù¿žþò»Ã¯/_l‡k&sûÿ¿óY^•ÕË4†þöÔ.Ó¼þùí‡_ŸÞ 0m”ʘ2/Æ;0µ·‡ÿþãé§Óíç³cíO¿Rø2»g ÒžFrÖž>bë­³¢3ÐëÏ›¯mïã¯3W§Šq…éýú—)_ÁSyô›ð⇯Oï>×S¾þtšÙë€ç¿¾¾Rä»®<Ÿ¯?~ŸeÎýáðõç'c޹/ªÓÙ}ù½×'ƾ>©ŽU6ÏÞždùë×¾rõ¤:¿óöü‘ί>¿þÀ½;‹13ïØŠøšŸþŽ© -àÜ0QÌû(n4A›¾.a' øµ=ñŽƒiç†÷éÓë“üèleni`ÎÜìÚGcV ×Ãp 5¦5A7[ïçHà*¸ ïŒgç®|`>°Û§¯'aGŽz[„‚ô Rx{1q'P,¤¶É4YÃÁ¯ BqÞ ÔZ™í×µÓ«’ÐC7D ÓBmõˆí«úQXšöa|…pkE_hÔh‚õñu6=wmß“=iT¾w,|çzâàÜ\tf²™ ¹éc‚ òç;²:íS³RLQH7aJøÄOçWÀ¯ïX¼ž÷Ó9ÄB`º ÜËð5¤¨07Ÿ|š¾? 0à]ø8ÎZà787æI|IÑ\;Ua­Ò•"ì×èŸSú¡`lê´`"áèj3rf4¹ÜG´“ø‰@|¬‚Öæf]›–ß„x5¦CÇÜÄä )Uav)F€c еCÑE÷±õï€ñ0`\–U(]W†W™W.޹¶ÖÌ[ÛDï@ôDO^)Dk±æ£"É&/C¶CÉtwáUÆh˜¾¹Œ³cQš‘ñnBèNôKÎØ²cá…‡E`bF°cû€ñ +& àÇÊÞ#2&˜3à˜ ñµÓÞU A|Mð TFFVÝÏS2ú)í?>¬¢jÈOH“Ô8LÙñ¹*ƒØL/lmÊvo6æ…ÅþL }­ø<ŽàMÄþLìý<]½ÛýÀœXðöb`?}*/l»[–Ø\ž–¼‚JÜÑ©P]Áe×IDÀ—^`Gdt)ÌÏ?\â Šò‘i$fQê Ç€J£:a«@l \³ä¤IFôMpa› “TDDÀ sêÂuu Í +'¼T:sþ iÂ$ë%ÆmçŸßI€QcAGäZg:ŠˆkN×4wMtÙãÛ®×– ÈŽ ¶:2R#Ã'9nñE‰ÄØÖ£·8P»Ž Abˆï‚èÜâ» mÔ8ÒK±[6®+\·hžòU7@*~9‰( ·îóÀ­{E‰"üÁŒI:e^÷ ¦˜c.s×`פÁV…Ñ81+Ómë,\uBgÍŠìvÔ•á1Œ3£‰Lì¢Py‡˜Á¢QËÝå³#ªì ~—O T,H¬2ÇvÑ"r?ê X07,ò7ç<©‹[BíΓ‹óäBš :OÞÖ¶;O6azÚîÎnÏyò&¬flE㬠)݈Îü˜Õî6§„áS]®ÇQ±L¢3ó5¦À‹ÏTÚ} £Æy<_Ãc!ýEÞiøò€x~•¡.ÒÏÜ@ñá÷Ì?ºvÕ¹êÕ[лª¬o-lò¯|gÕĽ,­ðEÇ"owª¢Û1ë®b;W1” ©ÃBD"U>U­¹”2ãÌí¨‹ݔӥ˜btäÅÕ=p? ¢…û%,þÝ©v¨=©_ŠW­ïkºÅ)™*<ºyKX¾ÁÊJ‚¬Jå¢0EyË`»‹¢uQ¼‘f;Zh뢸ZÛ£áwQŒáڵĭ‹b ×®­\½ói£Z«›j0>¾¹²g¾Ó\㣎SÔF·ª;àO)¸Åôrgºx¤ªŒ«Ò3èá\Jø~ÖA‰–çlJ‰ëØìÒrpcõiûŠÀh„в¸Ê)Æ ­$Ødp*L‘À’YkÖU·“YwÖÈ]4\ÍâDUÄg‚àüí$ZŸtßoíQ3H¤RVÇ÷ë pø™ÐY2%.(wÉKoPyº ǦEܦÜE%h,Q„ ÕgYÕ‰œ¬÷œ*wm\BÈPax Dí ²Œ&Ì»zä0¡̆ —˜ÑJµÆÍª"ê¶Ö¾!)ÞQ¶ùå›Ã;p áfðT¾n¦ƒŽ#ß|Ýó'Ý9s!Ô6áÑœÒ~ £5ðîÀ·ÊT|÷áJ+]œ·Éxca!ò S—¾Ø‚¾UÁw>º»×ÖUx’‰r~;B:\ʯ+2!BÊô®c";4W†æïñ˜S²ñŽƒŽb}>NcL°û†ceï ;HÜj*ˆ¨É2Û3ñmóà¡Êe³ÈȨʔü¤šâµ‚@‰Q Pê„ú$Dœo3“¶†dª%g°Í¾wÊéFÄè =ޱ#4LžÎ ž¤CAªKøRŽì )×YªNž‰®M]%pJ˜âµm|Üçl “©D&î8Fï×>0.Äácô{ÆAÄÇ–ÄŒp¯ó@$M°Pt•V†)u­šT½X)Ĭ½¶Ê"¿gP­R(‰²GO7€hÓý[‹?{“8£éd6ØÙµ±X"J¾¢öá æÇÃ`‡ág&ofeÞ«,Ü_ê‚Á™u8°$U¨“ŠúÈ$=é&d©" ¬®šº§‹´ª$%ö'GNÈšVVWò™©l¢Ý9óOŒ±Q—šôæ’÷²C“4I1).ü²;Ð)>ItúÜߪïnÚÑ˽ÜÑËí¢—÷a#+Àc†)5éšW‚tvô2UMŠÆåêÔn`Na…g?‡¿ª›×·Í å¸–RQÕÁ1¶CFGÔbßál¨H,"kG@Óv—ÈÆ\"1¡Ý®y±igKmL¸Þ•9[jWŽ9»³%¡Q²»Dv—È­ÆÕÛ»í’ò»»=€ÛÃ×¥ô¼,Ÿô:dnòvÈÏK‡°C¬ÖM{ëºø"é0ƒU,áÞ'E u§Kq´¯É¿ã¬‰Ø˜Wíb!¬t|ƒ!r6r½†âæc†wehw0tI}è–ÞTÕ­ælŒFÝa½”¸NYÔíÔS5PÅh„°Üòúk0´ŽÃ"„ ?Â3L#Ian8˜cþ0*Ëo'ÓØHX¨iúPÇî(ÒHè«¡Mœ]ß5Æ~µ‚©v‘·¡*ƒE$F‹cö>pùè "«Œ3f§Úªè?rK€KÅxg‡ãî£ùšÝÇÍ@³¼ Ö5#Öñe-¨F‹ª9댙À:‚°_µèÒ̸©…ç¡‚¶ (a½mÜ ëŒõJ–‚«ÒXŸ–Í7U=Úº(kìÞN„ŒL‰VÞÜŽºÌˆ¤U&ƒ1mQñ8ëŒ%ª<⊀¸}Þ ¢áºŒDªI¸²ýfMTyœ=©b…VÄk¦[ä*RY\-Œ˜ß1´Ò£¾JÆÜTÆWãò½Éœ}ey;Í夡Å\3¶ €;mã¢VÏp°Æ…Ů̡fT`—šé±àòŒ«{‹ÜB¾ªF3ö!™Œ™…eÝh&][³[—×ÁÚÒ@ç‘óûêb¼˜…ù}ÍÜÆ?_­÷}ì-ô.¼S¨Š£gyØW\%El…/²`Û‰­È³ŽldªŸ•®…‹dÁnÑu:õ„B‡U£$t鸢¼ìž⥠-•Õߥ¯ú%ëÚɪ(¬Y§Ÿ&V—Wë{ÞÆÁ‚:RûðøoG©ëPÕ¢RùÑ©°£ñQ'±;ÎG7àLV‡b}Õ"-2þfŠñœ.Naãƒi6 Š”aµq·£.K×-ƒÃG¾nù¼½%¢8J€Ãð °·ec¾(*8ƒ)óÎøewï뼯‘C Û:®#¡h:6ÐxLñ›Óé[ûú–P=X3®Þ/ÄH·^™8Ídi6º¯q; ú¢!W66º9î¡·6ä±ÄšYÌTÄ2 ÏOJ­¾Úl&ü“ÐWp«õ]w—(ºëÁ*.³æ–P»²‘{gW6F*W<–ø*‰¯l\ŸÍÎcuï˜ÅyÈ·"ןÛ#{.ÅÛ!@ß“óùȶÓ1·"Þyß©Ñ;Ü}9µ»M·þ€¾f-z'Ã4hÚ íÑ %δqàzšÛÏØŽàtp<Áñ˜VX(`A‚óæð8L#Ì—ø 17ƒ[QCê¼\ ƒ ŽpΘ¯aqŽwiš³ÊüVü„’5Ì)!rb…üc̉8„ï“óå:Ã! ­Õ’ú†¥·3—;Ë'\×@$öQ¸¹1‰öB ܪK⇑îCB¾´õà|ùõ fÝÂíH´£î@|§3º&£¹b‰e³ËW·ÛŽœŠyYÀÚ°=£z§SÝ54в’Uu<sOQˆæ¬¯ÖFõÖß!Q–\’ªÑÎøjv»ö‘ìZUÞY†]ë½æKæÞ$$)c‘ Ú.öï`ûé´ÂT¨%hJã×¥¶‡ð¦±îÙ¤fMœŸ”¾'ÿVw”9é³Û{dˆZá¸F´ 75Ö™ÛþŽ‚;Óf€o{,»K°úºÁ!æ¤S: Akݸ¢T8 sNbÛTf˜“TŸ0¸µÇ´‚;ì g¥§Iƒfêø{Uê(÷cf0„dÎlœ†¾ãº„1Û¹¹'’gɲ"JZ²–¡‹b3H$™ªãCà-ÊqqÃ箚ãÜ—Å /®3/@Ð)?¶á‰þM¬1Τý¯êoZ²T9ö~þx@ƒ§œƒ9„ÁAð×ð]œvˆãÓHâºõ‡ëJâù}΂¥‚ýgÆ"ÜÄ ”óH†b‰’ðXáFdfn,DŒD`$)“ºg²$õ&ù]Þ„D<ÆD .™+(.'°†eD¼e‹á^[x§?‡o§Ï‹£ú…u ªÞ2Æ3óRƒêp‰žiø¢¯HÊ™ZeO‘‚³$³G{.’Þ¹{‹î“† öXt*‘Ÿg€ëôŒÓì1.ÃÕ7·ÏÍJQÿ$\ÕÕ¿M)ƒ“m‹£wØ\²}Ÿ/á–að×à;*i&-ýªÊËp/ÿ>͸ÝhH;†,®ÚYÀµô>ÿüú‰ 7×R…€Yoš0Nuÿ”™;6‡÷f'0½q¹ž«r\ƒêËáËÓÿ² ¹_ endstream endobj 6980 0 obj 5700 endobj 6984 0 obj [419 /XYZ 38.2500000 589.250000 0] endobj 6985 0 obj [419 /XYZ 38.2500000 589.250000 0] endobj 6983 0 obj << /Type /Page /Parent 2 0 R /Contents 6986 0 R /Resources 6988 0 R /Annots 6989 0 R /MediaBox [0 0 595 842] >> endobj 6988 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R /F1700 1700 0 R /F1499 1499 0 R >> /XObject << >> >> endobj 6989 0 obj [ ] endobj 6986 0 obj << /Length 6987 0 R /Filter /FlateDecode >> stream xœí][ÜH~Ÿ_ÑÏHÛq]|“É$H< E‰ÄÊ´Ë‚V슰ü}ÜÓvÏL¹¿c××§Êv‰ a<.W{ë»?}ùû៿Þ}øòŸÃýß¾<Ǻ,Îÿ9œþ|÷ò¶9öÿ>ÔMyøá—‡o‡oŸ>wÿûíáü—éþõ¿ƒ=ü¹ûïχïÿÖýðÇþ—N¿ðËCmêîï?ýÝÖ¦ûWqùûôó=üõw‡_O+Ÿë7óúÿ狪ñíiŸþö0Ó<ýùí‡_Þ÷•ƸªmÆ;0­·‡ÿþãá§îÃòűõÆÔ•¯‹[>TÛÓ—¬í±më¢}èéÎò&Áâ­-Ó-þ´su¨t¨5òêÇÆ;ãj[ú¢OH.›Ævÿ®]ÿŸV×=Ðê$8¹,¯¿¸7>Ýâç«Ce@8^]‘›½s=G”uð_VO[ך„‹Ÿv® ”µxñĬì½w=ÈŒO´çå,^–UºÅŸv®•ßxuMV®l“¹ÏË'X¼ö yùiçÉ‹W×DnS%Eîóò o›„È}Úy2äâÕ‘[í`óv^D/–O°¸µ6ÝâO;W‡J\auMäÚÖŸd}ëyùð/}JÊ9í\*rG«ŽYoåüp§ÿ&¼øþëûOÆíÁT‡¯?u›{úæù¯¯PÊÃwÙ_{øúãá÷Ý–Ê?¾þüÐ+[[œzbÅŸêP] Ó Æ=>{Ÿ¾åMP$h¾pðÉU ã½áï@)"ìíñ²ÂAAŘÓ Óªª½CYŒùNd`PÖ ‘0V›„ýÑ_ñL1¨ò›ÄNŒN®MaÊP;B†S`.€9“<Çl ³$Æ1”.ÐMÒÁʧɕ»¤’Cy&Þ¶Ħ–Vƒ¿«½”Øm‰Û™d-A.î¶[L‡¯&½6!©[ëZÇþ°˜+"æÕ‹ÌîÙUœ¬Èt“~IJ°UI‘eÌ\ÐVXɲ>õŒ‘ È×\„¸1íUÕU ½"b|ÞKÊQ—ëƒsæ1=-nÔ½ár£VåØL{Õ¨;s…u—û˹äÒÇs`kt€kOê^~ØQ4¬‰§ç¾+ïà'}’ÙµÕšAxlº÷º ê9{ ñÚjðIáöžç¬ ª£{’ºcîÚ ´k Ÿбpoç]×G7’ø;ðÉYØj ñpÃ'àÖBÀš(~§7 ®ãž´_-½ÓÃÖCæd_iqEDcqëð“Ñíºê…jqK!ïèW™z´5kwÝPn&í.ø>ͶÂFC%1aq%½»kÈ>”³d¾SW…c2ÀÜÉ”ÙAш˲1!ÝŠ!Ž¡,A¦î¨)óul(<ÊE„Í|†ï1ç`ŒhÔŸëtÕØdLŠêG+ô¾˜s0Ý1Z’qb3²HÕ[EÑ¡›ÆÌ¡Ârª^ a5]Í@`P× Kµ©¹Áuh'£œ/J˜aÃgÑLž>Ïõ…Þd8S?ÆoÊ~*oÑÚ_^•¿go\ÂÅ æR–Ïš#¢IážÁáÖ^Zv.¬5´Œ¢ÅD;o¤T˜¾ ðÓ}aøˆª "®L¥r¨ÚºTòøˆÀ˜JO9HO¨¿¶­ ¨¯Ä£‹pi6n•<.á{ó™ގŦªm™D'•( åÆPÉUb`¾â$¶­å电 x÷ ›õ¸ien«Vw1©ÖõM]†»ç/Â$yB„¡¼b8â…ïrX2„‚½åT¡íò…ˆºöQ­'FV&iÍ[Šº˜ÈØ‚±=ÓñN“ž6æ«ÞHGê2N›¥|mVM¸F£÷cF]{º´(—·m°[Tzo¥3—[x¨r„ë23½!­kXE˜àË1•\Fð<½Öí›ý½ U[-×H‘V8½ár‰å}`* b–óä§MIѵþ?Äò„H%¯2Æ+ãÙaäãv(«EŹ<ÿÎáG]«Ò—7–fÊèbŽD1ÌüÇô×åŸgœÐ㪡Dî+¥!˜È¬jÝÊ}Vn¾–#mÔBy&ÃÈÉtŽ%²$„Üuµò¥iGª¿T‚înLñ;ªnLaÄ/*¸ð xb¬öäe>]>WÖaç1æ¾À°ÂTŽ)AÇ#HIx×ÌC‹‡bç\Íãï@*_%•Ƨ¡$,+ U`[÷x´&¦Š¬xtƒÑ¯7|ÂV6—(#“¸¸XÅÆúr tÛ¿`±ÂBªuËŠËט>ê>­ê¼ÿ1ËçÑEäZ3ùLI²åŠÉãÝL«KKj¶­•”—Uœ`9ÅRy›+˜J©;«1m¯L¦‡ ÕY0b~®?9MFq®F‰LbDJ£îU§%½¡nóéÎë]*ënÙëj¤m«P˜ Ï{íI WƒO.}ïQjý5{1ÞÛ‡ ›1iÝïpÑ¿ D¯2N „î»#‹B•†¡0’¾ ¸3†Ô”!y¦²³‘7®6À,â ÃMÙ7Ë`Óš¾„šjy§…ª£C'…d© õ"W³ÂªHãNª ™ t¬/ OÛaK§.Huü¼pû!nÂ5½øåCÈXŒ¸|l¤jªªÌpl6ÇáI‹ƒLu NÀ~'j„O˜Ô–oœ)=·¥ %8¯°s”©õP‰'ã¾³#o»n¡§nf„»®˜Ž'üô Ú”Ç"œN Û‡3Ïíðè& äÊùüƒ’ï®/µn#´'Ý©)uU*+E* Š7ª dú|ù¬Ûã{ÍíúV û˜ï¬/ëjÜX%9wÅÀ彘t2åëd|ëdëæU2­è™„°òæë¿ªµÖ¹ùjíÞóïRgãBkOy =#uç:çJ ½7ZUmÇ“^Á |eœ5Ì%IešC¦,éÌ·Í Î¹Ö!rº/»)i‚oÂrÚŽŒõY|YÒùmåCÚÚ“ö3ä;×pÏ’³ï¼ ÑýRö][†§Þ^ƾ·ÕlÔÝqÂþ©ïRÀ8Sùú)wÓŒ¢{Ê•K'Eý*c‡"ÆJ2.Z]‹u~ VÆ`*«<÷Ä1GŸ?ÐMgl÷Н‹Ëh©n7·B‘‰n¨S¥+)IMéßõ6ÐoŒÀf(©€.µÀ¹­9Ez©ëˆÛˆKIϳS]¨0ÓÖŽ}÷ÑüÄÝc"l:¦éÄ–”9ójd-ßð|3Zи*dU ¼ ±/½¾ÓÓD¦r!Â.QüŽjΞ0¤ÄŠË—23Y»XQ ·kÝ ¹nàvÀ¤ŽÀ¬9x}wèOWSûZèÀå³\&˜®Ýf’OŒé?²yê>ŽºŽ=ÕÙ1ÔH•LŠ”"à¯,zßø&mvÔ0º8ŠQ—aüÀahâ0ë'w©´E€#KP½5.Ô082›¼ÏokM¸L¤YÀcC¬`ðÄ“oJH–!wm0m mæC?>m iÖÛˆ­˜Î|Ì­Ÿ Ä2™|]l’hLã¶4¸3Ø ÛlÔ-9q÷ô…ü½E¨Co˜òÌÛL-Fõ†èM9¥}ýZ#]K<`äíè§ZZMÝAç7¸O=êcùûø6ç6lÓÝ–©p?טô,XÜp©¾È§­zqMœ€™óEYW‰;þ:0f„H†6.ÀŒ`aM¸©ÀoDùÊiÙ{¯ WíÞ³x§ƒœÒeïY<©]í ½÷,Þ{«súÝuåÝ{ï=‹©êÚilñOTÎÐâ‚B0°‘AL‰š‡£`#“ܵÅßÁ×R¬!DñÞú¦×ÞÁföøÁÕˆb,`V…ßñxרÐÂO26µ>%Tô;ÍÑ’üg*OyýW1oA J«h¬Ò°BÁƸª+›žzæ3nÙ]I\Êï-ZDˆiLHf¼­T÷ãQä{?‰¸NO”×¢^+N«¡2p7™ÛÜ3óµàx´§ÆÐOæL¤ƒ*ÍIÅ©CͶJö5¬vù¼&D{Jœà0>Éo*clÏâxKY*],T«C²`„Áª"ñŒ—¥.©¶ML_ª Æ›ðÊ Û"‚ƒT Q9º½"Rfæ§T äºÉ’vÝ$^ÝD9ª±@Á¯8{¸,üe¼]¦Zì<ÉgQÊ"bpJDÖUâÞXÔd(憈wÀˆDgÝš š±‡%ž®JedÕˆDqMP¸jïP¾†¸ùuK‚¬×Mpf*¨™A…*“uT…æJ{Íå/^SvIÊVÞº1×mLe¶^„¹Ï0<Ø×5cž%îF¼Â®šØD¸b(‹[5…œ±w²ñ­ªU%t¶ÅZÔ7í„Tìt‚cù¦C Û„ôUœíP¦ÖÁ¦p6Ø(ŽÑdk=¦"—5¡ãÌð2LÈø6Íä…@´G˜®¢Ši˜=ߦH\f}'r‡»à?B+o¶ï¶?.‡·=Iß gð»UüòGÄ\å2õõ§n¤XQZè`sñi-Z4 u^U…´A„z©>/óæý7W_¼ŒÖNÍSº…U“°âkY„‚îsÌoTú "×ç@b¢­‚µ:em¿u¡v\,="{‹ÉrbÒÓr¥qéÅãJ`Õ½í…ÓQçQ.œŽhW Û- "ëOŒBçf“6ø;Xù2ÊŠ(̤ŠˆmãüÕ´m'á—öªÙ¶¡jÃ>D ÂA-¯–Ì>YôÿB;/¯«"ôöš; Ïo*"("¦liñzJÛ Ó$R¥†u›%774¡Óéƒ1%2xàêAŠ-×(ndJ±Y˜—6“ÎañžSšeLwv­½§Žï©ãòwöÔñu§ ï©ã;ä”.{êø¤võÕ´ŒÞSÇ÷ÔquN¿»äè=u|O¤jUÞ U÷ÔñbO±½§ŽOr`ã3sàd“â¸Õk—ˆ²ùØxØÛ‚iŒñA`‹gsbZ†¼)XïX;âÛ¡ÏM÷fdš.¶•í[|‹Ãô†yçc· ª2žï@ëŒw{E}ˆß!àÆØëÐz¾p“°Z}ÁÔ‹C@DŒ¿xÁ¾êà'š%À‘X;ynÝ'q@eÇã½ÉŒGáRÆø…kL¡¤``ÅG‚Ù…)VÑõ0IU"Üç’™$;¦>Á¡‹Mlâ$>6ÏTéRg«–¨2A]é€á–«lÃËÎmÒèÒ%“²n§9cñ'ËÛLõé–N«ÒØ.íîPÚ©ÒÛêåSÛd–5>czi.é|¹ ÐËz¸ð*–פ¼üwöšnªVø–ÂŸÅÆÈ0ÃU„”p¦že Õ{ý‚raï^€î éù:Ѐ٪¼˜2"bÈ ÕõáíÎ&[áÀ;¡Ó3ÙWc˜9S¯93w5~ÒÇÙì±y½ <žù}ÇMÀµ½}êO: »õ _±}hæá‹G5>`ÏÂ8¢…ùåÊ1 ^ ¾Óó²‰:zýL¶,ÁþÝíx@4„Cý5ŠÜïóÏÇ\ûÑØ €I#MøNs;êÂ{æ}… ïðêó"û~RB}>|~ø?_›Ó endstream endobj 6987 0 obj 6066 endobj 6991 0 obj [420 /XYZ 38.2500000 96.5000000 0] endobj 6992 0 obj [420 /XYZ 38.2500000 96.5000000 0] endobj 6990 0 obj << /Type /Page /Parent 2 0 R /Contents 6993 0 R /Resources 6995 0 R /Annots 6996 0 R /MediaBox [0 0 595 842] >> endobj 6995 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F1499 1499 0 R /F9 9 0 R /F1700 1700 0 R /F8 8 0 R >> /XObject << >> >> endobj 6996 0 obj [ ] endobj 6993 0 obj << /Length 6994 0 R /Filter /FlateDecode >> stream xœí]ˎܸÝ×WÔ:À”ŇD ø ‹ È"È"ðd 2ƒ8³È離%µ»¥:WÒ©+Š¥¦v·‹->î›——GoþøùïÇþv|óþóŽ_»ïï?ŠS(‹öÏñòõÃól}ê~>†º<~ýåðíøíðpx8ÿûíÐ>ðùýŸÏ?ýïh:ÿýùø×¿?ü±û¥Ë/ür&œ¿ÿûñ{Ìù§âéûåóþò»ã¯—ûáºÉ¼üÿ¾µ-.Ó˜úÛ¡_¦yüúí믇7-–R›²òÅÑxç¦ñöøß~:Ðw_œoL¨|(n(ا‘lS]áG=~étoVè¼ñn½Îg®Nã*#÷®Éܦ);æ^‘"ú÷ݯ@ÿʹjEɹÌ\*=sqïŠÌ­\ÝtÌ­‹5èßw¿sCU¯(9—™«S¥c®Ð»&s/ÿy$7õ $zê~úëÂzÌ}œ¹:UzæâÞ™\Ñ«–YÁç>ë~…νµëuþ8suªtÌ÷þ°¤<•ö~|÷åðæ“ñ—iUÇ/?'÷8fûíË™(åñ‡K¬ÜñËÇß…ûô‡ã—ŸÍ©²e?Ŷ¥°¨Å¾…Ï8Ôb*øÌØòqù8¶ œ[ {óðØ¢;Ì<¡7LQ8ŽÐò~ùJ”ûŽ –*ÌSHLQ ×SÀY \På¶07CÈä©0ƒ°¼…’Qh)²H:§k]0OÃSè°= ¸Ý®çã—³‹^Ý»6vÚFþÃ@ù÷Pk=¤ˆ…-Kžu±œ[Bç†}aÓp cbi à]‰Y¿©ÚuTí-뾋gUƒ17XUÊcû#+A.±Öb)Ç2†ý³êî {#‹wŽŒÄãûFÓ1E1JÈ9l |÷†uÓ55Э£gB¬‰£Ã’è‰v!O°-w8BÆ3ÀÙ,cLG<Ð`ù7P7…è{G¼»"ü™àé^MÓå¶r|‹wqXÞ°ÎAZ{b—Wj1àzð »Îd'pV”ñ‡ø‚nLÜ™ˆ×óM2^Oð›{=¼ëÁ-QùXÕÉðÑbë›ù8ÅÇ:Dæ£à÷p”CÄfÊÑ.Þ£2$ñì@]T‘¥â>-» }wyŽÄÈ%uâLì3ð™ Rµ˜n±b_á\ ¶Ü§Œ¦ÇÖ¶LƦ3m_¿‘­]¶vúò–¼}ò>+d«´nãÜ`á8åRÀ,á ;Kì‰ÔuUÕc¡Ç[œ"ÇsÃ4À‡nxŒ!Ò©”Q†ûáõàq u ì¶ ­cq›¢nÁÚˆç†77Ö®'–¥À3¶²·qpÇôVâPó”pÃBò>‚égå&)²}‹`o1·Ï‚µIà°ªŸÂ²l±/À%f€“I ,{lT׃“B öz˜§ŠiÉIݬm2(PDÑZM…ùM½ŒëCÄÕYýQѾh‡ }^§ÛIs*}U‡òë[ƒPŸê¦x¤ÏPë¡Í½ò«Ý¦Óõ½Ïié¢_ò®½Žÿ½Å£–.]pmxz¶pîlØÎ¿¤x8][ÄÛ];J\›ûðWûe~—`H‘nÝ×hÕ2¶<9[›k-+J¦©ÍPPž¸¶ܶÆÎæv·ñX‘¤Öµ"éG$‚…Àã`µ¯Vµ7”ÞÍî^ E ì­Û¦,[ž[}Ýz\345´°˜ xéj‘d7¶ „'À,Z@:Az2´J†VI]F“cëtì`Ê1ÓöõÙÚek§/oÉÛ§&6`3u&´³sn]Û™³Ë9»Ìr{oÙåX–"g—EmL·YÄžjÁv·ž…Šxtó¢X–‰0³vŒG&bbÝõ”ðÜ’zæðò’úd4oYô´´b)C& 9J«âƒéF€]2sÃ[Þ½AÜ2ð”BÀ äyìjz wÙ‚²(˜Þ„m .VJô¦«g‚ ÀЯY×vƱ5“AS¸‡·RD„¬l»L(æê.·®µG•2+÷ôâ7ÇàaÁkÜòBi%ÀNÈ7øÌö = n°cn`d MÃ/Ÿ¬€Ú熉¢ ë% ƒÌÇ ‰Œ”²®mq…jz¾q#dÇôî°BÓk€#‚<8‰cLŒOØeM¢Öõ¨  } ¥Ü ¶[8ƒ(&Œ|³[¼²ùYAcØðªÚp¼åÓEΉޮ­ÒÁ4óí$”½}p'Pi;P¤ºC8?‹–ð>Fà<íê{½¦˜¯H1²¼í/d€,±0‚É[l^`™²ŠWŒ”rÑxÈŠ' ”og€¬Ö»ú[.ke€,‰ KgwP +dõVµšÁ-ÝÈœ®Eåþ kRCì+L +d±þ,_aÒæöÞ®0e€,Ñn…) ¯×ľܴ=ŒÊ•Jû"Ìö`»ä£‹ ”œ²ÒÏ”å=TlooÙï|(CÆdȘÔe4õ8¶ ±opÜgÌ´}ýF¶vÙÚéË[òö©‰ `œ²´mgÎ.çì2Ëí½e—3@VâÙ刾­2±AÝ3@)Ë ë•dUî õ·USŽ™˜XX)ÖM<7"Faæ&\ŸÞÙÎD·7‘8 LÇ:(ÛÕZÔ¤m “iÆÔÁ§tªz&X.&¿³¬ry¶¦ºÀùÉ–8ÀŸß‰%\YÃÛOfÛŽÅšA´±¢ðl±€2¸9n¨ÀÞpºÐà `o x7®YÕõ$åï³%볤ϺУÑôÛœ¨Å)Blðá .¬KÀ2÷€úâ1ØØeƒQWçKõQ',ëbä^Ç–Ä …·[FxU @NáÑ¥Ý3èk#$a¡ãÎ/'µ2Ì“ôd· ¾Â} ó„QX—¨AÆáî½…·¶3n>à/ŠVÅK¤d‰€æöšü ÆÞõP‘1\ š@H†ý@îVts¥ñ? ên´XF-°Pn¿K¡qª¢3XÎŒš ú97?>ºWµ<‚äc¢`0Öè¢CUˆ‰’W—O¨ð%/£ä‰ãd”¼´ÑÑR¾9’QòâÉAw82J^ë]Ã-5‘%Oâã}Öèd”¼¤jwÔyU(yusöhF¼{EUOñnJ›3Ãö©Öëoÿ’ÑëòýÂ4ìS¾_˜Ñëhß¶ýýÂ4<˜½¥ x{¼¢="˜5þDÁíRvɓꖂ¹Œ—þθ©cno=ïI+ãeü£Ôe4ñ¸/El<Ìíã’ík ²åÊ–K_Þ’·566²äÞÎQS¾ïž³¤9KJ{Êͳ¤…-ñ,iL?å£#ŒfDµŒ¨&®g‡ˆj¡¨îí0££Iãdt´´w ;DG E}HŒéL\iF:Kz·¸C¤³`Št¬C®­•fË?Ǫ†Å•­BoxnD¥F–†nš{@!̺)ê¦î ŠHºépE Ô³ç­u+©ÓÐMûͶ“-+£}:7\8̱Bâ-+NP㊩ÇI=ü >HÅ—Œ‰õ<mâ0@²1$ ð8ub¡¤&L&¥oûAŸñÅ„õY›Rd L[;7ÞhX›Á„#KÓÜRHs¦ÖxõQe Ì`Ÿ`Ã;!5å©hÜL 4ß:Dw* Ê1à] ƒPyØF‰òÄ8xn Tã? wØyŠe°•¢Yqª‚y ªÅà– Zè‚– °hó16'ÁðÖµ¶1C­½Ë K=”D)WÕCJЀ f'‘±n3Âyë©ß„âõ¡-}²WwI*؆‚\m`)È/0F( xÏÃqŒú5š×„Í`Pvy®k¸¢pfäŠ \D9¡"Å#¬b«¹¢Ý •›íVnÛ]™uŸÍº1Œ:Ví씂mÂËÚȰºßªý|¿%ÀÏØ¿ŒYWÁ¹NàuÌMÕ[(G˜Žð0XdFŽaÕñÒ™@CãÍ”·erC±˜À¼­S–y !TþCG”nû?+Ôa‰KÕâõ0j: IöQ²°yÁãD²6«°?Bb³n&ÉChjS·-ÕxãéÅ%º4WÞ.릳±M_ðv&'¾eÞÙ‚¥«;ƒ{fÛ‰ô¹ð1&BÁ©}œð ’‰L†jå7•Qz«¢Owèü×|yo†~TƒÊLÐO¥i—Á„¦£¥c*1Þ%V‡7Üxnx¥„Y‰øZœà|½ïõ¼G¸ÈË\DÁëa.‰×3RÑÉ/æ)^Ñ YRùÊ/æ‰' @t¥ÿbže–<â•WÝtu7’wJj˜Ë/xÖX–±Ea$– 5JšÆuWϤ,cIˆ‚LDÆš~¿­†Ø—þåB¯‘REXÄËo…ÓŠÍ+«^êž´&]¬¤’»Ã™›·ƒN˜ÊJœ‡c2ÑLVtIJµªBWoU–AÕ ŒŽï7á€C|ÂÙ‡[œ«è–¶…ª{^?nÂÀÑm¾©Rùªr<¢ì$ç›rª¾Ÿš.Èä>ÔYØ‚Zs¼.lg°E 2¨ÓL¦þ޹ÂWÖÝÔÎ ,~©Å."3ˆÏ*H1"¿$ܵÆ0|N‹ÔÃ3ˆC¦{öÒÍ`E¿j.x¶Ǻº3?:ôæTõ%S4Ú2‡¸*E^÷¹ÆwTñåå·°·Vûí›æD]Œ¤Œ Ìuâ°{qÁ»â¨=F-U/0\WnÄV­.¿ãÿ©—‘¶k´€k-¡#»ouÚ°è™.N½òLGŽk½5°·')Éü»§mâ@æ»}ÜµÞ øL«[ÕÉ; HÑ#œÜH$àz:#umŽƒgý¶Tu:D’õs©¥ëÞ»Dó5ó4r# ö ëîrV¾XLm¢˜2%¦N_›ÁλGbnºû9êÖÔ؇‘ ÎOÑé„@ªtK.&aí]ÅbJ©f.31{j&cCDŒIÙ%FÖM¨ÝB\3=Z”CßE¬`‰ðëš@Õ¤Ú’hŸ9|S½—º$‰éâëÙK®}áãÐ|@Òµ7?@és¶À!¨Þ¶§Â[üe!ùÆXc«f 7p†)ßDdblÊÚ.@ãÑ‚™x)œÀãŒw" BCÕã*<{ª*g¨mB'{Ûo,ààÆ'·U¥&Ø>œ,cE»úº¥¯«Ì@¨Ux>¡Æmû ž›*.SU±ähR5~Ô)üÓ Š¶TNIÎO¨ z«@³uëœ'+“ª€N'ÿ¼rݳ{âç¯ã·³ÿÝÛÃÔ/ÌðõUˆá³dær„x´Oå+’¥å¸B…6«dO¶ªzÖÒò£·t){ª†g¥C9~@㸩äñµ¹}êVŠO°ú¡¥ÅçlÕxLâ+¬–W–apoð™N Í¢¥‡ïbË ÜåçóŒ{FCÚ1"`qjŠ€ëéÝ~>öÏÃaÈ,˜iÂ8õí …;uÊû‚˜Þa˳è|ÒB=ÿoå³ endstream endobj 6994 0 obj 4585 endobj 6998 0 obj [421 /XYZ 38.2500000 473 0] endobj 6999 0 obj [421 /XYZ 37.5000000 569 0] endobj 7000 0 obj [421 /XYZ 38.2500000 473 0] endobj 7001 0 obj [421 /XYZ 37.5000000 569 0] endobj 6997 0 obj << /Type /Page /Parent 2 0 R /Contents 7002 0 R /Resources 7004 0 R /Annots 7005 0 R /MediaBox [0 0 595 842] >> endobj 7004 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F1700 1700 0 R /F8 8 0 R /F1699 1699 0 R >> /XObject << >> >> endobj 7005 0 obj [ ] endobj 7002 0 obj << /Length 7003 0 R /Filter /FlateDecode >> stream xœí]K䶾ϯès·Å‡^€`w½ ‡ /CC`Ç ŒØÈ&‡üýtOK=3”¾’ôu‘’ºé±=»Ãi‘*ëͯ¾ýÃ;ü㿇o?üðïÃÝ÷?<Ǻ,.ÿÎ_ß¼þmŽÝŸuS~üõéëáëÓç§Ï§ÿ}º|à‡:ýé{øãé¿_ùëé‡?u¿tþ…_ŸjSŸ¾ÿëù{[›ÓŸŠë÷óÏÿùôçß~;?±Ÿ®[ÌÛ¿㋦nÍyS}ê_Ó<ý÷Çßž¾½`Ù,©ËÆŒwþ`ZoÿùûÓϧ úÇÇÖSW¾.n™¨¶ç™š²>ÛžžäÜ`¢ç/¥ÇGxxÛ´ñþ¼ruªWù銛Û'æy&P[êSèåéÈßœïáÏ+×&J·µøáš;[ÚŽõ݈|¸@×ÇÇ ~s&@¬‡?¯\*ýÞâ§knn[6„„>…®O@þ¶0>ÞÞ>¯\›(ýÖ‡+îl[TTó¦‰Aý*žÐl}ã"òÍyåêTéövøôÏKž‚—rù °¿ |ÿåéÛOÆ'iR¾ü|ZÜóœ—o_~}ò§¿œÍÀ¶>|ùéðÝiIíï_~yj•-û%^FLƒF ?ãáHG Áó88ò¸wð}Þ/§ƒ#¦‚óÀµaŠzH7ü<Ãtû®>ÍCXLÌowðþ8Hk¹Ê}\¾¼ÛxmÂɪ—¯ÀÂÏà‘î6Å;Ý L7|J Ý x‚ñ©Çoj±<À§®ZX!a æ*,«Þa¨3É¿œÔ`4 Vùj-†7åÄÂÌŒS#0¢îÉh:·r®_ÌE/s,}ÕÔåà7ÇædWú2R£‘Ž„M¸c¹P®<:Û˜·#*ø£w—à^H¹Wÿ€~Õà‰ág:í9B‹ÎºyšÃ#föb1©ñãýå]¿Öコ —¤w¢ëÓ<ãPªl,i<ƒóàU—¡€¨ÃHбwÞU!ïÚˆº¶%h8hĆc&é”Ý¢Üxmƒ×˜/©6jH'òÕgK§÷íÄÉŠÈ£¥ñ³¥“÷psá6t®ã¢3Û}&îÖ•¾ÜûÖUÍ|Å2uNb™E»Ö ëkèˆìS5UÀ>ûÜ+_¢Aö`3¾w‡ëª|»AC3v¤0¦5¤Ž ª®Äó@ÁîOÜ5®ÜŠ\åÕD± Oš¦¯O ÖèÿˆÇ¾-B½×‘gÑ1ÉúdŸúdlžîǪ6o=¾ ›šòX´î-ÝÞM˜JÆöC7Ñ`¶EUjL~Aî.p„!ÌaØÇ$cxáñÁ{ቱ‚j¦ÆÎ~á¸2ö>96…Ãjl5ð÷6©¦ŒmŠ´Þ  ðiH‘ÔèÃî¥í9¦}qj§c½ßañh‚7 LÂbô!Aw¬§z—ﺌiÔ1™’ÚÀNµyø}ˆŒTlûk£ù‘]ÆÁS6:üRn Ù°ý‚ÃÐ ƒ¨úêšç~lâeƒ½l|Œà’tÎ6 {KðÂݠ%œŸfNÚ”é°,¤êz 4ÅÅÖóÍò%V$¨ –âÇRë&T¬ºÛ»kÙ»äcÀ=ªFÀ½¼Æù±“÷qb‡±^ä*uÒ&â!lŽÒ=Fø÷=bð®DïÆS—Ä8cŒþ\RÓ´šTc(KÐ|‰4‹ïuž&³ÀZŶbªˆ¼ªC%ø(LÄ‘pÊqþ-Yrã»+1UHA£tJH¶bB&+®o ;í±\7n`ØxÐÕã2Ý ø¾ê€Gpí|tÝg y3Áœe8'–ïBÎhYüY&ó—HÚ Ñ"|šSéE¬fÖ¦Ë-+ …KJâ„z3úà„ú²—'±œÐ :‡ ¬’4,Ïì-Î÷ÇÞ=`âó‚9?ÚZVá ÙHp(4’nIÌ»ºpÁkæ{ò¢¹ú=ùøW0›þJÑõ¢šå¥ÜSÝB,ÆÌ„AÕŽÇ•ŒVá}˜B¾iÙ0D™¤#¼øió #GÈ(hib±©Ð ”!ÈVwšŠÖ6}šw½&!£1xäÌå3]ø|ú†e Œ%Á'pܘˆB/¨÷fnj VN ÜÈÚœ§çz© n¦Âv_P¿3Õ–¥üm2åñ¯Ñ½À¡P½ÀN¹'ºG޹Ÿ*:° šÏ\êRÙb Œ7£zv7Wì1 ´$eÌ¡R—æ_.ˆ™ºv»èH wm˜0ˆF}´ ™{’*ÈyD…ídÃŒ˜×£/šÓ¿½0¿0ÀX K:qŸžÆ•*!ÔÈÀ0-`N],‰™B[‰hÈ’ÌeÜeÅ»ÑÑOUØ{È ®ÕVÒýQQ2L V»µtknÔ1ë!‰uPÀTЇît"ÔQ^•Š;ÇxU¹¹¥Ù…ŠktÅœukËÙPÙÈcx‚ 1ž/• ÄkÃó0÷éA®dÞ^ùÕzW:»ŒFf½©XÚ?¤sÕôK«àÏ̹&þ\ëbÐ'sýέÅ^J•Üu-ÎØûhèXÝT®M~* Æ›àÍt×_ºwad(ËUÝJ ¢—YäTðdD,æu¼ÖúÓÃX›n|“J¬.¼j§3<©êºˆ¾ìŸ+»ý{^ç›ÅÀ‰Y‘ÝAó¿âÍD­j7x³iwÔrÒdÖCtãõ‰›ß §ªžã %f¦0õ|grÀ ¢-ƒ‰ÛbX'd@¸·TÈ€¹×¾†ÿ˜@÷vuû§u®£z• ÅðˆkÓQ±=ý “õ7 ¬o!ø"‡çÁ ߇¯Û'ü#q¼Ž”rUY¢û“Jà~mr<>s¸,>ÛŒ¬RÕ9ÌþX¸̉I5‹ß°°°' ¤mJúVU”w8Ž]ߪÈÀÍE2àf¬µ²ºC 4Õ*ª„”3÷MaMÿÒ¸ü;Q£ÝÈ1J&gçÉÁÞì•7aO7è™è(x uƒ¸éü…1Ǩ=ÅN\ÊQ¼3÷kÚPC¥Ÿû¾úµ'-ªR3C颌ªM‘f¯mÅñlC ±AìeáÈn²‚-ü¦Ñ ¶üã#E\î3¾Ú+æÊYª2˜­+™+X00g-aZ­9#‡vò' êöÿ)`à°€î*ž‡-˜ îß@¢¯í}BkýäzÖ åD¥4ONTæD%kQÁÆløÝbøií¶“Ž1=úµSÃqjÀ”Ö_¦¬û)»,˲Û5²P-D–ÇŸémWXì®ô4ÜÉÆáb±^„ ,{S¢KtÓêÂý‹¢wá0V”J|¯úšAz7˜wð›^ž6‚xÓ ¾êhŸ1rf½^10Wp5Ò†O+ˆƒ. d¯â`Ë5 oìæ`U€Å:V‡Ðpá‚ +P5N±i(¨jl4â÷Ù0W oŠ t¼§ØÔÅŽ cl¯nR Ž nùË*°aÏ‚`díÒIÞgû¼ù†™¯Æ0¦PFŠE1îꌋ…2cn‡1—‰.Ý~ö‰úÅ4Ö·oI8†á8F·©Ú4@ä¶kMîìκ,ÛÂ…o@$³©v¼ƒš\x£ û ÖÝJÜ”P©í†Š¨Í¼b¿1)»DÔWÃYQ?l‘¸×'bôäZ—wu›»ß}—Ÿ¢%ìyä­øëØpLb’8´³6zÿ÷ÚU³m“Ívæ­«z¾‰øqÂÄl [·íì ÂÝK¨â}C€#†7<ÓÔáyJ ŽŠËìg³â¦5¡NÖëKÉ…ïmT3P¯ÒŒL]S®sŽv–©s8Ÿ†ó B¨7gê/S§qÒ«7Üm‚£^—Ð&£Òs)êa}Ÿä¹’dé…¸$) I’²9ïE¾iΙnˆw⪗¦n³zyK’3O`\?N†Ø]ï¡uÈ#=u®Õ2@óœIL¡p!Õ£ŠE¾‹þÑëwöÜp26͵î¸ágW…’‡Ÿû¤áË /®ÜXÐkª”ýÕCpÝCôõYÍoÔº©÷iì \é¹Ë2ÑÖ YQHª&j^¹T6n¶\ØfåRUTÁlŠH ö†gÐ=H‚(”ݸçó¹($l2!ÖL’G4¡M±~Ž!ß’æ‚3Ñ]Û¶)gÛ`*Ý”ËÍ/»N™{te½³ÇÀ¤`p‹;;a[Îâ)#I§™ÚÖàáC¦®l’¤ÉVá´¿']ä‘‚×mpëoQË`¦û–`;c%½àU\I7`Ká.ªúRÊÈ™L`øÎ¼FÝðüŽ‚Ö>”(´vM¾}ü9[Ì)psßà[]¦n ´rmäP³ó³Os¯rGö¢„#ŸbŸŽ²'rÅÛ˜ûL=åÀ²¶‰0•~‹|»ÉNÆÎÒHõÀ{Ñ ã5ÓŽÆ0.™+ï>S/Àcƒ]©;n±´²fùg:ܼ‘ÏkkÑÓºøƒ±ƒê%gá:p|Ç¸Š˜G Á‡Þˆ¼àÕg¾‡«.á.¼_Î×®SGoÕ‚Ui_O J«L]ÛPŒKš±&{ª;„L‡%=›ðbU*7ÄÛfE¥TKÃè¦*´0&Žn‘±jEêj·i©ž:D‰Ð‚%­Jqeºý¾ ”doí •äõŽ+BŠ^Æ· ’ rto·ëÖŽïÓ/4'#ÚéöúŒÓOåUŸ¹z ² ¤îêÏú¡òû8¥Ê}î1ÏœÞ2Ðx»ÐDºÆþe;sÆ’åˆí*eÉ7\*“¯L”Õ‚+{Ä oí-DîKÝÈ“÷Ñ=JܘJ¶Ca{á€HÈ æ,eÕ3:ÍLØr†˜ ×í»ƒ*ñm¥‡t4à.0H“‘Í™ûP©"þ›1|c^ÇíZi¿¨5&E¦ nBÉ1œ²ZË\Õ »ê"žÊ£ÎÃ]«åâTÊ÷ˆ›‚¾Y`Äè꛸žbd¤‡^Ë‘w8·‘½Â7^¡)C·0YYExaˆ€ Ò™²gÂü_ârE†# ¯…Ý`$iŒXyüpYY\aÝïLç¥2D°".ÓÀŸÁ‡L· ó. ¨=M©§\s‹}‹%Šª¬0¹§¨¨t2Jlsay›èœ)¿)öÕK&a¬¯šÕ¬;²O?Ç…ø ¶¹°FÅJUß“ÑèµûœHQgÌ£„´3ø”à‘œ©é+—ÆöóNÚ®ñËv[cë? wÀ¹ý­GAêêíŠ-~Á†Ä¼ŒãªX9CåH¨®¦L¹÷mßöÙ¥è¦ÔÍZßÏšó½9ßûPÚ:çn3WésÕ6ò°õ ÂvÎÃæ<¬8Ï>ó°Ø×ÊÙÖIéPÚI^ÎzFä¤ÕõLζî5Û*D‰rNõîrªx·+sZ¿ kæÌiΜ~·çÌiÝÎàØœ9Í™Óïræôy$gNsæT¶bsæ4gNoÐÈMqKýxΜŠgfã™ÓÆö5™)3§ï«çt]_–ÇzˆSÔW° ŒH`°(7U!°^tA–SÈúGÁø*Øül3e›é™ýÞÅ–;®kÀüÂ{±Áh5¥)˜Â‡nÍãKì³€;Ætddž†Ùü¦`3º’é" -Àèâ‘B£Cÿ 'H··&Æ)#`©†«K0r D6¦Iƒð‡›Gy çQiNÁÀ&ê/š¬“Á ßƒ˜9-+ñ0œ(‡)ˆF5‹{ÊÕºÞAÄ Ž”d½Öìݵ¶2{<¹žao8’*^Àðlî"γ'-%ükÛö.UZu†K•F.Õaº1ÅCø:‘Xà Ï@Yˆt Ã¥kuôÊpd+¸-|WRh#Ïèã6®t³J3L¦}à´‰i‚]kå¦Wª1¤%æ>ÞIÝp“®éž÷==uJ­Ö¼|‹á­»#´EÛW|Ü[w„l‚¦3÷³kµWsÿqòü¹;‚Htuÿ­1×Èûã e0·Èò­Òž¦Ü!sâ~9qØ­q·àjb«ßbø×2¶·®nc"=EÝOÃ7‰˜Ûa˜C6ìmâÎG{n}Ã9ËR~ÓR'StwN÷.–NæÞmsoRiW—ÓÜÇàm¨ÚÎx‡©»Pºg“Ðë§Ü7mñàýaº$©òNÒ³ÙúÎæúØ&ɤÆ_ÃQ3³Zw%Çj½®BÅízÖÖÜ„jyoH˜Ì©U=Ï„‘Iœg Û®m§‚*6Ü6âÖÝ‚žIYï¸DçýñÓ˜^^ºÖ æX<‚Ÿ†=k†ÿ‰;ç‚|"Ь(|z¦†ÁÕÄ´fJvq Ÿtß ä“°§%g¨L̉%^£w‰¼šƒÁu3p[?e“Pz—7áP&’Þ9?Äå‡RÙÄÉr=ðÔ þ^–ÄÛ°¬êH^\®“¢2-‚>#"ÔªW÷W-¡Ïp$=gÍ-hyÌÈPP™;Ì/w†uºe½ù82š¡Î>eô6ì WÜÔÍ{õª*Ë–“KHìÁãÓÄø)–>3ü™±7U7¦Chm¿¥>Œéõ¡kyêÊŠ¤mpØ-3Û÷5þÓéëðõDN‘ÚŸ§~aÆv4£ÝAN§¹0g„³ƒíïft±ê±óp±4ëFº"öhŸaÔ†ÞY5é,H{ìÖ^!w÷{4›2xÆÖö©{SœŒ¨Õ FØ®†/Øñ FaÇL:ò? ~¦“ fÑ«×/lË2Üùϧ÷ iǰ€ÅÖ0d×ÓûòóáѵÑnf¼iÂ<ÍíPîØÞ7;éýqb¤cS"ìðùéÿÓ¬*h endstream endobj 7003 0 obj 6112 endobj 7007 0 obj [422 /XYZ 37.5000000 83 0] endobj 7008 0 obj [422 /XYZ 31.5000000 635.750000 0] endobj 7009 0 obj [422 /XYZ 38.2500000 479.750000 0] endobj 7010 0 obj [422 /XYZ 38.2500000 338.750000 0] endobj 7011 0 obj [422 /XYZ 37.5000000 161.750000 0] endobj 7012 0 obj [422 /XYZ 32.2500000 634.250000 0] endobj 7013 0 obj [422 /XYZ 37.5000000 83 0] endobj 7014 0 obj [422 /XYZ 38.2500000 479.750000 0] endobj 7015 0 obj [422 /XYZ 37.5000000 274.250000 0] endobj 7016 0 obj [422 /XYZ 38.2500000 338.750000 0] endobj 7017 0 obj [422 /XYZ 37.5000000 274.250000 0] endobj 7018 0 obj [422 /XYZ 37.5000000 161.750000 0] endobj 7019 0 obj << /Type /Annot /Subtype /Link /Rect [39.7500000 643.250000 124.500000 650 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn23_1 >> endobj 7006 0 obj << /Type /Page /Parent 2 0 R /Contents 7020 0 R /Resources 7022 0 R /Annots 7023 0 R /MediaBox [0 0 595 842] >> endobj 7022 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R /F1700 1700 0 R >> /XObject << >> >> endobj 7023 0 obj [ 7019 0 R ] endobj 7020 0 obj << /Length 7021 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯ès€m‹½€ €=¶äÀ°‚‚Ýl‚Åî"NùûéI½cJ%~]$Õ=´‘µ3´ø(Ö»ŠUoþøùïÇþ÷øæéó¿ß>}>T§¶®†_ÇËïï^þ@w§ñïǶ«ßÿrøzüzøtøtþï×ÃðÁç§?Ÿÿö¿£>þéü¿ŸŽýÛù‡?Œÿèò~9´ª=ÿùóóŸ}«Î«®^~þ¯Ã_~wüõ2ã´Ü¸™oÿÿw¶êÛF_¶±²ô×ÃtLõüû¿ßÿzx3 l•Nõµ¶GeÍù?½ÕÇÿüãðãyiúêÔ[¥ÚƶÕ- µúº’î«£YXèù·Ìô*Âä]SÇ›üyçâPQ¦QþÙO]3þ‚'×î. ÷u{Æ,ÕWÖ­­«¾ƒ¿¢ºRu3\×y Ò÷õbvydЕV:ÞäÏ;—Ê€hžÉcß¶nlÄÛ¾ÎãBŒ®"¢Òeç±nN.'2teMñf¯³Ç¾íUÄÉ/;u³prÉ›­íDUµ¼2ðrú“7}D¼yÞ¹8T¦»Å³K^nߌ2¬m"@è:{ð«Ê´ñîöyçÒ@™®N~ê¬Q¦Õµ½Üòå†ë®Óç¿·füu#Ⱥ>Þmÿ6{ŒÛVeû°óH·'}Û¦ª"ÞöuöbÚx|{Øy¬Ûv'ÿ2 ÞÉðàføêùðݗÛê¼ÄQ5Ç/?ž÷ö¼æðÇ—3HêãwÓó¬D|ùáøûª2ÿpüòÓ¡?5ºž¶8Œ¨Ž4pä©zøMG¬cáÈ{8w`Þ¢‹×ÁpûGžD׳áh ëîØ%ö†GðlxoÆÀß4ÄJÃL ð<žuàI+· ž`jô¬ƒiBÔ`<€´ðŠ 3Àà׳@‰. ÎÒkM`,×wVñ¹1¬<ðÅ”G0mjLµso8R¸Ðè ßO gæ\ð~<0À# &>&zîô]BùÑ×ëZ9¡¯{´>x'ýÛpož†{Ã#î@P-^Ç`û&NŠ%¿Ç2!xM…µ$,‘¡ä×ohhi Eðˆ‰K ¬ý`î€GÖ¨$ Gi”½£yæI%Ï*̹ðq ž0ÜNô¶=Ü›FŒ”HÅí<2ß¶ _!Å MÞ³7 LØÇz—x êNû„rʘ[4_ÌQDy †¢çF[†ßÔXÃü6 Ÿ[qŒ&“Rçªõ-¸LŒÜ§ƒ½Ï!Ö¹°DžKQ«”‘Ÿ”Ѭˆx™Âvƒ!˜CâTÄI1&b4¡{¬_‚Û)L%x¤Äpª ËŒ;‰`@ù°±6–}6·Ó¼,ß)ŸÊ>tÕVÝ «±ýàÑH1e`ÿ-–,DlRØã*+wSÞ}]õ}ºUÛó?W-qåW~U²¿Äˆ VÉcÕ>â½­înÐ$J¼·Ä{Wduöx/¶ÜJT÷¾aÛU,/È‹cÙ%P‰êÞkT×ã*±Û‡‹ÝâÛ~]Ú¶iVá["´%BëÙG„öRé\.Ú¡eµ¤¡-ÚG´fJ„¶Dhw£«vÕ-Yï%Bë¥ÀGh;=e’¦ŒÐvvÊùóTµŒùšAàèhtS†„pB©Sm›®­_`˰ËîÔõÕóF°Òž¬ʘºØ¿ôÍüÎ6Jç…Ù^ïMtÕà0Øfü¤Û²°Ä$£ö©ÌÉèNém78›‚`Dý…=µ}ø¾Zcàl£ØmXƒMø „…øðzÆPŸÏî ÐY .ü ^ÇÅ¿1Tvâ·l øÍ±^Ïhm]¶†|–¢ Q.çáO±å‘­G"y ;ãZ‰Ä µÎH0Õ©iÕ7n&Å mj±jIÄòHø¤ƒ*ZOœa ¡<âÒ¡5»#fÉBX08äa­޼s dëEa8K°x¶ y‚ÁƒÎR·îaPŠ@( 7¢äë­k‹yÔK)ÌH=×J ‚[ƨ@ZÆÅ4BxyPã †Ÿ„Ùæát"'fìEQ±&lñ3d\‹Ÿ±fF×ð›„G÷Ø9Œ†’H’çµx—°<'Æh€aÁ ¨»%2åã°Ë“ôû ûJ!žwùrjV[XmÛ¿Ú¾S¹À·øQµ™‚ fühãü<š~‰•9ÊyEøú(ç3cýaåt/êà•I D¦æDfžû{õ•º?þrÐuûò?>G+ ŽÈ÷²…oéW‰¢º£¶Kk*5,i¯ïI>^Qr¸xWŒ, ¨ßœFÌŸñÉ¥ozôÍè>Uí\²§‰=¡uÜÁH|í©ïÜ‘)9GIƒv=*Ç {ÓpÃ`Œ$/}ïg$— “Nb`¾†gbÑZè•%\ ÕÖP;iYXAÂb…Q#±"‹w ¡¢Ü#Œ0ÄЙ魌ŸÝ#M0 ±DÅò9®©Í`$c¨‰¸»=ݱ{ÈâÈ7àqalÈá@V2 ™žx+sÙ"6ñlÌÖœ&å]­GàM:>ÍŒ0쵞…^ò;­œgBÕllù>ØXµØúTõŽ“ <˜‚)•xeÓ[Öˆ `婼Û“„¨ãÛPˆö¿Ô2ZVK ¿´G„›õè=ðâò% îu™Ð6^`LDyªªÚµ ©00ãØÆÓø¢âˆó„HV怄ü¤¤³Á}e8ÛvƒÛö°Ö/šñGIòDA,O€’‰53öᚈˆíEÓ—Z×I"›>²©ÆŒ ÂàˆLC\¶ÁUÍÐ)®ûγp|™Ý×.ºÊ´S)þL®Ê,ƒCTMå÷¸P¶;Še9sÀ–æ7f†#hírÕI•@h\+H့°Û‡H&btÊvɸ#,Ùùô3B"|⯼l¶hà#ß3¹»Näb Å1.}cJ;¡Sþ´íÔ ë¥2"?~Á<Yc1ã*UãH³lñT˜“Qä$¼æ åót‘Pf3JúvfE½pÀžoÆBÍ&ÍD¢ê¢‰3”;ÑXDŒþŽ~nO,ß™Ï$èÚuŠHåZvŒ½Ãh‘#„‘¢<>±²Ë¦v0‚³ &ì%«>Zæå˜]aß¶õˆ›{ø”MFÃZUÎøæÜJ»%„x«Â¹Š 1%smkõ¤1 $ÒzÛŸ {0-»Ï}¶‡¨~ŠC"óˆ¨<ÙÜ“©œˆá$ ä¨J­*¶Z,>™²l–‡b’"žd{â_bLÑš{TÚÑ¬Ö ð²IŽT9°Tª s-Œ€•(¥lQLqÓ5޼y4SÑÜ./D™ÉH±¸‚,“»§j«”G¡8ÈŠƒÌ§û{Ó|§Êc¢r8©Ø~¶gF8(Bù75Ï~’xkÅûÏB¯›Ú«ãÖLk'\¢ßÓÜœi|ˆwÀ̆ۯâoˆæÂ'ŽñÍáÆJp׸9nÚAµÅ#Zy?@¸áÁ¯™æR¸AÐ ø_Övê$ã) VÔ¸tutJD,㣺=«~"¥ŠjñÄ^¯þ(Sñ†È¿|DõT÷SF×£©§ž½•i]e)(©úÅ"–ƒ·×ÔêM%«Ó¬ÐcGÚ‘jð´,è›Ñ¸ôM¾™rëÓÀÏg(~N†ú€F^¸Üo´ƒ à îÚ³¸ëõÖQÖ£lnNfÎ ùÛ“âni×ÚÛX:3¾¶núÚ¹øôUôdqq3xEK&™`‡¯e(¥êHÜõC‡yê‰GRÕpMÔ/ÙKéD‰o î?¨L”®‡8{ÔHºr„S>‰B9‰a§Ò•uňd'+ï,ûæZäõ¼HcÐí^³•?)£·ƒFw„Œ)%«lîØM¾šQ³ÅM¯R’¯W!xÖ²êØŽãSý ³—u)#†SŠ0y2zúv½j‡•D<>!åƒ0´òw[c2ñÝwVÙUT,Òå&é7`¥Œv.ÒÀÈ‹'‘§òàˆŽ ­Å~¢Ö¼ì]Äfüª²[¢èK€AÀˆÚ’{ž9ä|ÞÕýðˆAUÙ ÷(ûÃ2q×ñ:oá®á,üÆ2¹’t<é ²³á[€çñ¤à¤ø Îaô¤`ÊÂÉLŠÞÛŽi»ÆL`Èëá˜ê †Î=c||ƒ¥ÖæÛ«Zp${¤7o)'ã6fºÛ‰:²„kê1 4TÄ‚²-Rð7DIÊgŸë>uÙA‹Äy½ÂE@Šf"ÕùKšg,"Y+åʵÄe¹SÕ¬ô´šÄÈÏdßûp½vcÓº{‹ˆܚΥàWçqŒï Q¹òÇn½:¤g3ó",c#æ³mæGq5gv5×íµæ› {œ[Ä;!ìVaœhKxR4#Û rÚ*èpQøY>\G‰u4Ü€ýµ‘¨³š¹Çî Æn8¦L¾-üâ ï»/1e@W¤çÝvÔb\&ŠO`¸yÜŠ:L0¯ƒ÷†Gð-·íÙ5v bÇ3Þ¼Sêí#¤ê=ë]R‰lÐ"•<” M0(ÏIá!ø ÆTËà?Ô<÷ˆu!¢pGJàÙdCs„õOqoâ<Œ£äžÐ£1ÜV)0l¢ ~‰O¥o0·cÂûŒV‚o‘FD=Œ¡SF÷`0ÛXæ@èXF[HT1SÉhÃ¥‘”f=÷”Ñ<Ëkci ÒêUˆìÆ7¾D %™Ï—Ì÷˜^¦¥]iJžd¤5+.~uÖèo¯*gu÷ðX§fd몙<È.a.T–ÁõpFd ªSã©È+ØàŒJÖÂ:v$¥ ›õl ƒ)FD”šäzÚÓ¶×ÝágtLîÅ,"Åä eÙGÕ©ó=ëA-Û’C$kâæñ\Ù7†‰Â·žd&{kÇ劥³u¢ÒÉj˜ŠôÔÌ\µ$jÆœuäõ¾z¶ñí™$˜E·¶*mL’U¥bò#S7ù£¸cªŒÜTõå G¦A %˜š[ µ0 T"u¦¶ëÌ” ÃØ% s‘Ÿ|e²˜O櫱†À ‰J”6ò¨“ø&IÊ<ªq ª¤Ó“tV?F¶ N.û=[±ßL½¬;Û„òí9óè*Ñã®ÄO8Í®}©¨Ä"K¿QÇ@LÉÙYk6<Ä ÀFƒ ¨&JÖ’¥€ƒž¸RêÓE´1d~§óeî»–P˜Cʹ4 Ïîqa˜c„™ŽøyævYVP~©Tº AqÉGwúZâ,Q4 ÷( ©™­OÈŽ«£2Ž(ê%à,Ò‡$‘òÆRY•é!û˜1‘ßÓ¾÷6r’Mœ $`ÿàcPWÉ”dÀƒ‹xêÍ(’ØuAEæ]à¯ú2bFmãGê°¢$Êf 뀋Øs»Fí#rh(ǨŠ{)c=ÌÛc*a0‰1„g—j5'QÚI¤GJ‰¥o1’õGŠÁh£›Úº”÷üÕ¤®÷¡Ú±|I•4GåfXþFÂ¥1e³·™0û ‰Þ8kÓV²Ô—ý†óˆ½ºqnþA2ª©vŒ%_._.ua%Å+RŠ#9³EÜwÝzU¶1ãvU­e²fc`WD)ÙW?Á[&òZãaVxR¸µ³¬Ÿ%Ñ:v,RŽ= c¯ÄsĺȆ…«òwÇ ÈYM­¼«Xa¶8TŸñ3‹:¢dÒ¸SÅ7²i…ñÍOeŒ+Y#7Õ†vÐÓ£¤쨉92«¹æÝkô-ÛĬ™¨ð —`ØCë!­½¯œb9ar¶%h~3:ì›·ð›}3ر'íæ?µ§!tVý>K³MuÁfVÊX`§™¶¶ec…uÆÊ4í©n·»ðÞðyÞÁo> üÍÈÉ–¸<…âÁ8ÛÄýBv¬èOoõ·GËØ/Ê¢ÂÉܵ (X»#,¿?ÅòÑð;õ3ü»Ž÷½îÐTÜ×Ë«¾‰ÚªíyZÚ[)WÆ©$ËÖî²õ-A3fæ³nÝ}>œd©¯¹B^OîÕ£8aLnê‘0|*]Ϥu©*2ÔA”-^–,›,£t¬kåJGæÔ³ÇÊÌP‹°†JÇáº"“­—(‹@~O-8Û†ŽÍQ¬òh¶#÷ÌóM FÆÑŠ êõ9“eL˜Ïs?²!/¢ÞeY&JÀøÐ¨¸ n¨‹Oš³èùn\9—½ I@% ë\û{~žª3ÓýRØo+Û’‰‹BG8aHÖ«Í@'@ÍÀ¡Xlqáâ·1Û:6ÜÝu›°éù}U‘5@÷W1&,m;7<¶Ve%\PŒÞ½çHá,¢é9Œz½gª.¢¾uRWÎdÞÂR˜’ïJ~½4Üð&:f_'Ûº*ãßî0“m'œO{}­K9ƒ ~î”Oß¹6n)OßK5'ïl¥šS)ð<"Z™©”&(¥ ®Ò¨ÖëØwŸ¥ ¬ºóFFx×¥4A)MàÇ ˆ‰;(M`ëÒÈh†`¯ÚuRJÜdzo{p<ËaL•xÃCÿ˜â¬ïyVJ܉kõ1Jàª!LïÙ€dõ(©¢#bÀë»ü¬U¸¶ áÒ!’33Ùtiæ*=¯Žq¦`vmæV³ AÓ82÷AºQ©Ì%±ížÛ‚XCI?+égéhï™cŸ¿žY³—sZûX{·øôõL†•ºxRzêÅTa‡íp¢vá†ú× è<\ÓæýøÍèÉ}9X²O½Gë˜5 wioÇ“¢’8AĺD€ß/5óŽ€{Œh ÇPx6øÍHl*èè/|Õ,Â]þ^] [k;ôš4…£Òn·ÀýBzÏà8Þ#<ñ5æ1ü|V2†é¼Nw;9|ë$Ĩö¢gõ’ƒ¯qïã§Ãÿ×ù endstream endobj 7021 0 obj 5889 endobj 7025 0 obj [423 /XYZ 31.5000000 548.750000 0] endobj 7026 0 obj [423 /XYZ 37.5000000 662.750000 0] endobj 7027 0 obj [423 /XYZ 37.5000000 770 0] endobj 7028 0 obj [423 /XYZ 38.2500000 592.250000 0] endobj 7029 0 obj [423 /XYZ 38.2500000 527.750000 0] endobj 7030 0 obj [423 /XYZ 37.5000000 770 0] endobj 7031 0 obj [423 /XYZ 38.2500000 128 0] endobj 7032 0 obj [423 /XYZ 37.5000000 662.750000 0] endobj 7033 0 obj [423 /XYZ 32.2500000 547.250000 0] endobj 7034 0 obj [423 /XYZ 38.2500000 592.250000 0] endobj 7035 0 obj [423 /XYZ 38.2500000 128 0] endobj 7036 0 obj [423 /XYZ 38.2500000 527.750000 0] endobj 7037 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 106.250000 143.250000 113 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Modules >> endobj 7024 0 obj << /Type /Page /Parent 2 0 R /Contents 7038 0 R /Resources 7040 0 R /Annots 7041 0 R /MediaBox [0 0 595 842] >> endobj 7040 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F1409 1409 0 R /F1700 1700 0 R >> /XObject << >> >> endobj 7041 0 obj [ 7037 0 R ] endobj 7038 0 obj << /Length 7039 0 R /Filter /FlateDecode >> stream xœí]M丑½×¯Èó®ÅIÀbžéî|00˜ö`ø°Û»0²ûà¿¿™)‘A>*EUY=Ý™V…ŠŠÐ‹RÁ ùÝþôß—ÿùçå»~ú¿Ë/öß~zé^Ý-.÷¿¿ó ýøj¯/è/¿|yùõòëË/?ÞþÿëËÒà§þp»ú×¥¿üþößß.üÓøgûK÷_øò2ˆáöïuþwÄíª[ÿ½Óÿ÷å¿þíò÷û;+Løóï”è)ïbì°þõަ˜ÿþó—¿¿|·pŒËØ eÌE(©.bRýåyùë{|÷:*)äÐku»žŒ:=ŽýíúöˆåO)ó¡¿s77²è§ÛÿnxQæó_¦Ç7xø04|ø,9;*B‘ú뤄±¬åÆÑ, ¦BëÓ[À?ÝpjöðYrnPœjáÃ_GcÿÀëBÖão/ä 1%ÆKDÄݪz¡Íhúáί“ËU(ÞþL‹Š&ÑÀ¼¶Ç7°)”jöðErvT¬}ež~kyó›n¼öyë•ÕEŽòÖ†{}ë>ÍÔG÷ýå•>êÞãþÕ“KÜû¯é&¼亽¦ƒ@¬QŽ!ûaØä ŸD¥âCk‘‚r»ýÜ¢Œ/3a—…q¤É*=ÝŸ¥<=ÝÖ·‡*£6¶ Aû¿z%M+ÓoèNDœiåî]r¤ÚòÃ2sGÌ|z+ˆJ¾„J>ãHŸµðLÆábÒ\Bºž[\]S6sQ•ãvòKBM-. ~—ÀpØ€HãXÆ>.‹Hu5ðÜ?‹|ì•×ý˜)"xüg BÆCÂJ@à1ÎÐB4D'2愆¨àËL8 Í"F¤ÍJ§R?v¸ÿ<†&êÚÿÕ+iÊdG¬Ü½«@ŽT[~XfîˆYƒDTFžJ>ãHŸµà³FkëÕÆ1Äpb²ù¯  *FLåJÒù²J³ "R+Øœ–lÚÊg¼©¸ÖÅn$ë[SÚRCºž[\]S¾Ó;9zÊ/A ÞÞÇ‚Táó‹¸Á‡ ˆ4ÞatÙÇe©®Ú…f|ì1DBðø;§a@ÈxH8IzÀÓ‰wW[&Ô‰ÁŒ¡!*°ñä(4³‘6kJv›XóÏ‚˜¨%hÿW¯¤)_QDµr÷®9Rmùa™¹#f>½HD%aäI¡ä3ŽôYíP>> A8ëtWÇ@Ã‰Éæ®Š ¤¨1!”+IçÊj(ÍΧ7ƒÍiÉÆ¡} |Æ›Šk]Lõηú´¥†t=·¸º¦|!G;94å— o×± @øü".Aða"w]öq™Å@ª«v¡{E ‘<þÎi2N c:ñîjË!Є:1˜1#4D6ž…f#Òf­Sio2cþYµíÿê•4e 2.'«iò3A îÏŽñ¹á˜{#tˆ.HÈÙGIú¢Öj°HVKÓdŸ^ÓGšä±tƒdŸ!☕»wòl†1ÙGa14Ù‡„hQIhC)”4HöiŽDqù 3¥¹š0.?a85ƒ“c ü¢©#QcRD\Ãa"whû¸š¨1LŸÜsÇkÖl„ ¿õ#‚ÇßõÚ  'Éc:WT[&Ô‰ÁŒ¡!*°š£Ð˜)¥ÍZ§IFb¤‰šqýôß~õJšò™¥Zåþð #ÖIñöúbžÁ8…0 Ð!ºCÎ(|ÍÈñ­MJG­¨QkE"Å"ªAE"5j­ñ¯ÒÅ,б¢&‚…VÔ@!ZDTÚP %PQ£8*jÔZH*j­¨Q®DqVÔhWQ£i¡HŠjJsTÔ¬@hPQ±e"w`û¸(ZQ£8+jÔV6B+j(ÁãïzmΊ½VÔhP’¡‡ãŠzË ¡Ñ ¢&bÌ QÁ2 9 Z+jجfö¥ðkRÓŠ½VÔhR,¢TÔhRQ£× ÿ*ý}«+j"XhE ¢HD%aäI¡*j4KE¦…"z­¨Ñ´¢FÓÒFL6ÿ¥5šÖ…$éR6;JE+j Í`sZ²qh(ZQSoC³KMη҉M+j´+$Ñœ5ÚUÔhZ(’"o稨ـ51[> Òx‡ÑeZQ£9+jôZ6¢iE %xüÓpVÔèµ¢Fƒò x7KE ¨¨‰3BCT`ãÉQhÖŠ6«¹{)Ñ´¢F¯5š‹è5ZJ'É8¤ÄÛ%C¢&Æ#¨Ipo„ÑEr@)¨ÑEZ*–¦\ô*‡"ðð'j´"⨕»w•ΑtnX”Î0 l¨HD%¡ ¥P’éDÍ¢ÏZx”ËO¨t¢†ÐõÜâêšò™‹›åÖtº6E šâ˜åÞ€ÓÛ1[> Òx‡–±‹2ÕU÷ÚjÍF(’¨¡¿ëµ2N c:WT[FƒDMĘ¢; 9 2)mÖ:™ö×´B¯ÕšLôëÕšTCèuvß¿9ÆjˆZ …hQIyR(j]] ±¸Í?è5Q£éw¾¦>L6w5T Cň CÂeGi  MÔ 1šÁæ´dãÐ>Pš&jªmÈ ]âé_Bú²ADD ä£*DhQ>³Šá] >z¨E Êu&4*TÏ—€*ˆê¶6h»Ò$ j´]Ï-®®)_'æj´4-=JHÿÁQ£µj´b¶|@¤ñû«}\h–檶Ybðšß¢5Z”àñwa˜³FK¯5Ze褿`©Ñò 5Z1cFhˆ lušµF‹ÍjîžAj’4­ÑÒk–&UHºA–žˆ8ÓÊÝ» äHµå‡ef>½HD%aäI¡гtuqÖì>> Á-¦[¯6Ž$†“Í]'*ÐDň ¡\I:?P“ȰóéÍ`sZ²qh(Ÿñ¦âZ›zç[éÅt„®çW×”-ä˜ÎÊq»ù¥¡·/. ~— ø°‘Æ;ˆ.û¸,b ÕU»ÐÔ¯¾CÓQ‚Çß9 BÆCÂJ@à1ÎÐCï®·œ¢sBCT°Ä“£Ð,bDÚ¬t*Ó…‹ÇLGÓ9‚öõJšòAÄ+wï*=Ëйa™¹#fA jQIyR(uéUt‹>k*Àg!(këÕÆ1Äpb²ù¯  *FLåJÒù²J³ "R+Øœ–lÚÊg¼©¸ÖÅ„v¾¥Ó–ÒõÜâêšò…œÞÉÑS~ ñöžaŠwÂçq ‚i¼Ã貋ÐÕU»Ð«ïhbˆ„àñwNÀñp’ô€1¦ï®¶M¨ƒ3BCT`ãÉQhf1"mÖ:UïM¸Î?ÄD-Aû¿z%Mù‚Œ$âÈ•»w•.lèܰÌܳ 5‰¨$Œ<)”|Æ‘>«ÊÇg! Î:ÝÕÆ1,&àÄdsWI’TŒ˜.r`³£4PVCivADj›Ó’Cû@ùŒ7׺˜oiK éznquMùBŽrr(Ê/A Þ®&ä6 |~— ø°‘Æ;Œ.û¸È1£ºj’ãê;#1DBðø;§a@ÈxH8I`ŒéÄ»«-‡@êÄ`ÆŒÐØxr9¦´YëTÊ›»ÿ¬itÑ›9Ó¿áÏ\AFqÌÊ}»Ò©¶ü°˜³ 5‰¨$Œ<)”|Æ‘>«ÊÇg&è5ÖèȠé_NL6wÕT Cň:”+IçÊ䨩lNK6íå3ÞT\ëbF8ßiK éznquMùBÎàä(¿xûÀ0!·á󋏸> Òx‡Ñe#2ª«v!#VßÄ Áã!ã!á$cL'Þ]m9šP'3f„†¨ÀÆ“£Ð‘Òf­S ÞôØü³$&j ÚÿÕ+iÊdF"θr÷®À4ôÈ8=Ga¡[A!ZDTFžJ>ãHŸÕå㳤³Nwµq §~91ÙÜu¤TŒ˜¦¤¹ì( ”ÕPš]‘ZÁæ´dãÐ>P>ãMŵ.6*ç[éu|„®çW×”/äLNމòKˆ·OrcJ€ˆK|Ø€HãF—}\FZ¼€7ï*p¡Q­¾£ˆ!‚Çß9 BÆCÂI2ƘN¼»Úr4¡N fÌ Q'G¡UJ›LË7„B‚'Æ„èÂÉ>ª~ËbCþc'Ê8A¸\ׯ ¡ ã`$±Ö²<Í"Pcm`ž¼)Öùg²Ø´ÿ«WÒ”­£ºPœ¡sÜý«t)C@g†e ;õ!!šDTô^)”Æ‘>«ƒòÔsûØ%6ÃòNLÌhAÂ#AH—5°ÙQ¨îÛ‡Äh›ÓÒÒ—í0ÞT\ébC78ßJ¯'&t=·¸º¦|!G89å— ( &u7 À}1[> Òx‡Ñe—nȨ®Ö…|ìUhˆ”àñ·NÃñp’ÀÓ‰×W[lÊ3f„†¨ÀÆ“£ÐtCJ›µN%¼)Öùg²ìÓ´ÿ«WÒ”/ÈôDœ~åî]¥K:7,t§>(D+ˆJÂÈ“BI¤+_}V;”ê9Œ}ìb×5è°|€“Í]{*POň é²6;JE÷íƒb4ƒÍiÉÆ¡} )©·¡»gHç[`Ç7B×s‹«kÊr”“CQ~ ñvÅkdJ€ˆ‹Oà"w]öq‘9ÕU»\}‡ž”H ç4  '‰Œ1xwµåhÀ1—1cFhˆ l<9 Lj³Ö©”7Å:ÿL–}:‚öõJšòMÄÑ+wï*]ÊйaÑ}†YƒDTFžJ*]ù2$Ž[,p(ÔsûØÅ®{jÐaù'&›»j*¦bÄ„tY›¥Ò}†]‘ZÁæ´dãÐ>PŠ”ÆÔÛÐìRÒùVzõ'¡ë¹ÅÕ5å 9ÆÉa(¿x»a˜ÔÝ€0éuº1[> Òx‡Ñe-3ª«v!-Wß!‹;)Áã!ã!á$1€1¦ï®¶I¯Ì3BCT`ãÉQh´Li³Ö©Œ7=6ÿL–}:‚öõJš2—“54×™ P÷çH Gx€Üp̽:D$ä죔.€YÔZ ÉjÑ=ÞAû¿z%MùŒg â +wï äÙÆd……îÍ…hQIhC)” Hö%¶ƒ;ÏèpÛtºž[\]S>s™œå— MMv2¦ˆ¸ø> Òx‡–±Ë˜S]u¯=®t.Jðø»^›!ã!á$™cL'ãŠjË!Ѐ-ÔbÆŒÐØÍQhƤ6kj" º?—#hÿW¯¤)[»Pœ±sÜý«tŽ$ 3Ã2Ò}ÕÍ@"* "O ¥€q¤Ïj‡šhþaÝšk½Ú8ÒŒ&fƒ€´ ቑ ¤3$lv”j¤»¬!1ÚÁæ´´Ä¡} Æ›Š+]lì¤ó­t¢†ÐõÜâêšò…áä”_‚@¢€`HÔl@€ Õb¶|@¤ñ£Ë>.̨®Ö…|ìUhˆ”àñ·NÃñp’ÀÓ‰×W[l¡3f„†¨ÀÆ“£Ðt2¥ÍZ§abb¤ûs9‚öõJšò™žˆÓ¯Ü½«ôš“€Î ÝW Ñ $¢’0ò¤Pé ͘ØÊ«À¡||‚Ûšk½Ú8†ë<81Ùܵ§õTŒ˜^ÂfGi è.kPŒf°9-Ù8´”ÏxSq­‹õÆùVz›.B×s‹«kÊr¤“CR~ ñvÉP9½6T‹Ùò‘Æ;Œ.û¸ô&£ºjêÍê;d.Jðø;§a@ÈxH8I$`ŒéÄ»«-‡@¶P‹3BCT`ãÉQhz“Òf(פ„Œº‹¸ýõeøõÅ%yîíæ¿ÁÏ¿S¢¤¼üòåe¸;Œ”jºˆ~ê.R©Ë?þrcóãÆhþËóxÑàáæöAÙìá³äì¨iDòé?y e¡üôÃnWÿºô—ßßþûÛåºÿ|ã€~ÿóËwŸo2™ËϽI63\þùùæR·Æ^¨Q\~þóåß»NÈÿ¸üü·—ñuœ:ÓëY>{§GwºOóý*ûQ<ØFˆùÎíÀ6Úž†ù¨ùŽzUrлÝ6P¶îø4ÈG.RÛk@¸2"ä!V’O?ßl¥š…¡zîžB¼jeÆÁÇ_Ïw¤»ñ.ý_¶åÌÓ0¨úh-À "|ñ = ·É¼¶Ž[4ÖäÓ ÇÑ)±1¿“Á {èã.$:> ƒ…Åj)_J>~‰ïÐà”y I¯âtÆŒ6 ²ýg*lã¢hƒ•MíO}â á#὚#¸îמú3”{/BC¶·ÉÈ6ÁþaqõÚÓ>ÀØÑÙ“¤ž¶¼éô:MÚ,gœhH ⣖6ëIedÃïó=ló ÝÁm¬×¥úQø> [¶ŒÄ·‘CëQ—\k#ÂWúµ›dãJ†<=ÎÛºzØýv]:–LW Œ‚CîÝϲ¡'¶â~,¿O4èzsC|ûÑ?Î /±9cܨZ2ß%I ¬–‚tÆ®¿6ìÎt§Iv$|8 ¬3l%ß¾† d ¹äÕK’`gõ^ði8^¥gð°²`¤Ak¡ w<+Ý„ß'c‰Ø®¿|Èðñ¸’í·ƒèÝ­Gú™ÇEzæ1DÈ´ã)È–gòõ¸7.éYßÊÜ”,0·sG¨-÷·˜J?"áËeºcœcÅ/wRÍÜ9äÖßæÉr|šÎ“1}Ç|›Í*óÊ“+'äçÆ3ú6ö®&ÚN²OÄž¾M³=ßbšM¨éqXÒFÊp´:½Îr/ïX ¤ÚL莧tÇúú¡7ÍÈq³^•Ò¼#á›â§&õN©¥>nU{ƒ|°ÿ”ðé1nkì?Ÿ9Qì?رæ g•ð9 QŒ¶x,µ`Å­ÄF?ŸØ îû_uœºç뙘†Û`Ù°õ©‘Ÿðûwy÷%þؤw—}¬Ù‰½#‹Gº%ß,«EX×ñ¬ü(YÅñx?PRA‰B]ô‘ɺî³b wBBϘ]´ßiZã}|x »†fSDÆ^0tù„¢9g•ݾyÆ®(Csà³ò[2á¼…÷o¶ë„’~8cÅQ¨+qmÖÕÖ_]ôu'Ö[fcÇžtŠßRöOÙ‰”|mù¼§ ÉæÁ¶8zx•Ñ7”ÀÉ'øØèi{ü'ÄØmë–¸ó|A¨0üêøm”Rr‡dëáèÕÏ*úîoúpÈ-†v¬ «$‡g«qÞ¤dñ¬]) ²‡¿¡<)ãLÝûH›ÙI»dïèñZ/Z2)Ã[™ü„»96®69ÚgŽÀ8‡×^kÙCM†tQEiz_i_W¤ªè5d_]òöþòD饒Jâ}}=Þ¶$÷ÕŸ„Ǽà›õÔŽŒÙ•|PHŒŸµNIB°ñwtÉÓJØpo·f¿a—hŒ¡]"ï ¾$yYPÌœk/ùè*裎¬„/Y1ÅâÕ¼óßf0 ìÞþ+€wE1ÏÏwŠçW7–m‘¶iù(¤úöXàøoŸšh<û®G©'$ÝUÓU—$êNÚ ÔçY ^{•:3„¢ïËÏko£H•¤w\Q©¡U’v-HªÍÛØžcˆWØÙÚNõJë'%äãŠWw:ô4Wš¢ƒeÃojWªÍ÷èŽ=þ&qÇúh‚~qREõýØ b`LÕŽ·¸ ¬¨–«Bì"ÕH!‰²b\QK„Kj­aas¦Ö¾)~šÄ¸•¼©9.AXö]Qtݾëê;·Ð ³ƒœÍT_ã#ÌYó™LÞ ø~*9ñõ¬I4ÞU땬%»!f—|)>ñ^5%ù¢Ú`–Ol^ó>3Šû'™p›~@xdz.|…]Ñ}¤N°©Aˆ›Â³ÔðÝÖ㟢ñõ3X‡‡@ãóóz¾Aªíà,OÁL¶ýÞÆß+ð{ö)t½¢›™ÉíOÓµjFûxöç›®Ct'¤ë󿿇ñalŽÍEãíS÷½§e8Æ®*ÃñfqÆø©+•6<ôisc_•áx¯H¯o­Ù*\w‘VUùo\ݰ7gÿ¤gÃC~D¶¢OË2CU†£`ŽGO¡éæ‘ã‘ÙyÚ™ªrÐCp¶õɵ3éúw;Ao“¨É—”Ôsã,@QÝÖS¨7tµ>M£ª&[QT¡ÿÜ:Xñ`®.?O£¦&ÿF3¹œu+˜Ë +0ª‰ôçEê±*÷×½”TïàxŒùÀ§=…}¬è> Rí+:d·öO8ãl÷WJU)â;°:£IdêÎÛMP6,5^½ˆŸöJ0À6{_—‡øˆ³r²«sdú¡gîS¼·>-.»ª±@IMëS m˜…8kž_vu=1Dºæü³÷ÖxåÞy:âalåÝž;âxo}Ö<Œ²j `ÌôHoo çÂX­=³W¤ÃZÔ‡÷•ÁÛJœjÁ»‡OÑ1¼§gðZƒµÃ;•ìcÿæ;CE{Þd^oŽ7*̼ٛÞß¾…Rh Þn®`#:=<­ùHrä­KN³Ê„ lx£®Çkyê¶NØæ±§Ê;k¯.ֽ኎V+ØŽ+#[ÉŽƒO|pG&2ct Ž™=°YѰ¢äÕ£èÁ{ÆÇ»ÜݯdO峎âhr ñCƒlC%B>~gf(÷æ§ëkÁV‘“"}íY=]Ñw_Á¾²™0\ÞÓqŒÙ‡ÛcÁÁ^Ý0Òر_ü~Ø®R[F–ìÜ‹ïH$[Fê Ú_óĉš¦NŽDÆ’ÑG·.íÖ£qzqxŽ`ø5§>¿ýîÑ™~ñ3âÁVÉpbÿôìòS¦Û:—¨¤;9¦äwXvÿÛÉb=­íÛ =y;ÁYû“d9 hÉ÷[qJ¶£è”hØž¥…ó}‡, ÛË®%¥†Ýoßü Ca4µ=Æ“s·É^®,—i—·<¸í#l3³ãÅÛ÷À’<÷îàÃÑà›–ÏVqYêP9|D6è×Åw¼6ÑÓð!l%ïc;¦D›Œlø°7x¤[Éû`flg+¡3/ØÜY‹ñ©Ž[UưrN çúù~=wU6ž‘›óÊèðºä«33\+ÉD°é¶›+µê«Mj[(é[è~tOž™y,È*ôŸ>½žù°¸Ì°mpÝS”®*H0eæeK²×dถˆ ën³yè{ëåË‹ìŸp}ù)jÚÄ(i W<›-™¥9Á¥±éÈA}õŸÊ-g_GC¡<é#g5v?w &Q¶†ãÒLÆõÀi™ƒ¢ûYÓƒxV¾$f¼]½šššÀSoƒ9TEã<aÌGÕåß¾û>«6«dfô´óüÊÏAl™:Ó‚tZÌÙí’úø!s!ï§ÈYéôÇe‰<¼çà1÷¬£âI3¾‘HESÀg2‘‰µŽðXOöÀ[Ú†%ˆf‹ª„Xû^[-:$ø,nÞã )¢.¯¤œ²àåN>4þ„Ôæ´QÈLpa{ç­I+ P%5Uoÿ­MàÜí&g#7,\`àWÀãÝöY´qùBAÈŒ¥ tXT÷ù®”Ìs¼u’oîÓÊÊm({$AWòYÊ:„ƒ}Æ×9 ÈJVð&§[IDf-”4wîl°eJÔUÀ;Ÿà‰îàõSÝï´Ÿ–ŠV'ñ? ¶±_zu¯rºÔàî×7‰¢!vE&€q€& 'dì”-†S(«“Ú¶ ,Iæ½ÜþXh/C¼èRÖ½ÆXo$C'_m€ ¬Ûħ;²¡v/Ì^~|ùŒd Ä endstream endobj 7039 0 obj 9070 endobj 7043 0 obj [424 /XYZ 38.2500000 133.250000 0] endobj 7044 0 obj [424 /XYZ 38.2500000 133.250000 0] endobj 7042 0 obj << /Type /Page /Parent 2 0 R /Contents 7045 0 R /Resources 7047 0 R /Annots 7048 0 R /MediaBox [0 0 595 842] >> endobj 7047 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R /F1499 1499 0 R /F1700 1700 0 R >> /XObject << >> >> endobj 7048 0 obj [ ] endobj 7045 0 obj << /Length 7046 0 R /Filter /FlateDecode >> stream xœí]KÉ ¾ëWèÀr׫@À¯ CÃrr¼Ù‹ì"Îò÷#M?4S­Ýý‰UÝ)F2Δ»,’Åb}$ßþñËß÷ÿümÿö×ÿì¿u??|Ù‡*íö§?ožÿÂÖ‡îïûªûo¿ì¾ï¿ï>ï>ÿ÷û®ýàˇ?ÿö¿½ÝÿéøßŸ÷ýÛñ—?vÿèô~ÙU¦:þü÷ÓϦ2Ç¿ÃÏÓïÿµûËïö¿žzì‡ë&óòÿ¿ñÆT…?Mcbèï»~™æéÏoß~ݽm °l”Ú:_Ô{ãß›ÆÛýÿ±ûé8@ß}qhNÿ¼ôUqÍ@•=ä|³7¶)öÎûÑ@Otº7 :/›®ó§™«SŸÒȽknnåC·¹e  Ý'èÜ›"]çíÌÕ©Òo.îýP—öØZ45üûuD UK´ãÏ[Ò÷žb¿­q ™é4sm¢tÛ;?ÔÞWÙàOb}éP×öø÷Êuÿ¹’deÙ’ÌMŠé»O±#¾ò yé4suªôû{O½áÁöX¥ Û¹û—MÂΟf®N•~Ãqï©7¼®M'á>…BºO°'Á¤ä¦§™«S¥ßpÜ{â GíÒm¸Ûý×ïÉÐ}Š ÷eº¼¹:Uº ÷þyI/x*íoÀ•ñ»ðáû¯»·?†pûˆíÛÝÇÊ?ô]Jú6î9YýTvø›Û”ale@ºÝs˜:uRiì$ÇêRß”Q‹”ÎLóâ+ãÒßñ à9ði y Kƒ [˜_°ï€¸Éá•f•Ô0ƒû|)ì–Ç>Š_ò|Y6ý¨ÓÏMÆO“©ì`b·Cšp(wB'Åd«uS<ÍôÜÒßþà]‹g:oü¦Û8w¾¬_ŽÓ¶Ôç_”ËîxéÒÀxJïãUWŒ¿¯ÏÑ-_Wgm‡ƒ³µ™û‡“eàfWª3€+µ5±aNðÀ˜(‚l3ð9Œ@gªH‘Ú·À[<ã—¦Þ’k\×øˆR> ®$ J£ùYûür!¢Gg!\š'\#f‚îÁ”©jÕ“€Y:Vz‚†™Ô SÂÜkN¬Ñ*HÿÂÊg®UUÿD†Ÿì hÈ ,TEø¡ìjÙŠ¢Î²µ)'÷1çc^í†GŠt`Îä­Cêàür–T‚02·ÁIUÿì³ Jczrg·\¢l\xÐÝ#œ×Ìc)~‚ÄOƒØ…‡g ¹‡®`þ%`=ÊöÇú#Fa!ô² Ç0‡¨:Rê0²€¿Ò¸åÇgA‚·rÈ£½Ý Qˆ'ÌMkb,›ëÛ¤,šò@¢[¶#žË¶ <¸MóÞßÔoBúú¢¸?¯À/86u¶,³E¶õ… “²µ¾ŽÌ* Þ_! [>SàÏ×§ÇðçÝÐËÏ&°¾(¯ß枨Âê ¶j×?­À>^2ê!8yu`Ÿ7®zÉ ‹€}¾ekw(æC”ðÒ¤00·IxË…W qœ‰'Ktb`  0úÅxKÔñ‚Ô@l‹JKÁ¥´ÛjŠCY™©â oU"Ja<’EßtGRBÑ·e¯ïÆý¼›-“6 C¬F"9ó#îC¬º}v½ž˜1–/,Ç ˆ3# É›fàUl$1Nql a3Vب .˜ö†[˜—_ˆÅס{´˜0~¬/}A¹ fÑ;¨ïÚM4¶oš£v°c´çú`ÿ´@ØN¶ŒéÕçU ¢&` ¸Ýp€`ïaºá³’Ç §D(cÙ_]|P`õIøò…—$Œ+À~ƒ)eJL´‹æ#q‡ëW=6§®8)×V»˜CGFØ…)h²\†¹b«þ£^F\uc=Æ]ÝÉ5ŠÛ â7qËωÀ™X6ˆ3 #ønt¥æînà‚-„Ç!l®Î‰}Á†Ä·ön?ï–ŸH‚’Æ Ì ¬í<ÅiÍÀ¦±±ï×[÷ICÒâ[4~ Tƒ}"ꚢ®cfsdî0ŒX’o¿àŽ_ %×÷¨«XSÄ)Ø¥TL(1·œNUÛ4“â‰Q`Þp óö°"¯œ뉱þp¥Ý ²ì£žNp”…qUÌ£0 ™âŠ0 c%°×…@Ðq‹¶€‰j vsÖØ#´~\¦>Œ¿ s#õ˜nE…qàz®x\Ê£UÀÉfèKÄâQÞZl¦ã3ˆTÑÅ˦×Spßè ¹*DÅÁÞ°Í•íÌQµ;™øWÁVe$‹°ÙÖ—SFJ&‘•yN‰j:# ¥UqËMê/ñ ðç¼]5C’8L_]Ê’j›–y›Íd£¯ÐæráDű]«ssÚ QVº.e†‡ã“q ^Á… õâpæÂkà¡”`ÛA°|ñ.ÀYã¤ÊXNñJ1ݰÆã|Kp®·àõàYã8¼?ö ¿ñXê3Fgz×GŒ0 7K\ÐÑL,øúvp®;£o·¹ÅŸ°V<ª¾%(s¶*ny‡Ù5̽6ÆÏMO“NÀ½ÃòA~0H–õÞhoàM]a·dø™:S¾ûI8`ZÅnm ÖÛב)“±.¢”.Ö‰JžÍ‡R&Wk#?‘C|QÅ;›ÂNHyªùXŠ3`ÓC|”êjñ Dç’»ùg7U±9ý¢Xg¸-x“©à4øÍ‘›é†Þ“á³*ói ÒÕGóüaÐ%øºñ‰Ž³4žLèÊdÆ^"ŒÍÂûˆýnßÅBÕ¼T+ÞÓ©LÆŒoëÎíÖ\Ñ YY·¡‡†ùöö/c^̈S*M5ɳ¹R `Îô˜Ïq$ÕD ºið«#^b…q°Vç†î8ø&ru ï­ø„¾É !Âz2%ÜÀ»yTˆ½ÆëÁßHèÑJ)]¹ dòS¯ïId ¸‚û†eX5Ÿ¹p:êrƒªT•&ü¿ó ãzp>Q|žá]Àã0s#0G'2ÈÇÕõ ã¸Í•nYã3¥t¡«²Ú5•Ÿ–3,é«'„»ŸYÛ\éå*Û;äÎV†IT_œ3׃V*]L½2­¹böUó¤ŒÓåàÔ7Ä“‹r>%ÎLR!Š‹U3Ý0‰`²=62,ƒw's z[’Bç—À œ4òtç@1Àc¦2Ñ93¢ó<‹›Àz˜%T²}šg‘òKé¦E"’Ë…ru]1’º;V+™ÒdQ;ˆO"Ì•„ÊŒT 9Œ9Šìu;.aMp'’–#i.:fŽCFÇ eÊ¿Ÿ¿X&·#VDŽb*-(‘ÁQ`ʹ0gc©#ŒÕ\äÒÍ׫lçBò2‡ÈÈÄcò2\<–ÈœþºXÍ+ v¥3êâÔEqfp×ù™ÔE¾^˜ ¥gˆMœt¤õi×eD‘õß@®xíI™è´t1ï„å6ð‚üîÔQ‹Y“qäm9¿é#¿öm¿á W*BBÝO{”xÖ ×d¨,1ÒëªYÅ•+·VK¥gDz;â讂ÄÕ/ÒÚ¹RÖg‹çe^™Ë߈c˜è»ùSë»·Y7´v±Ù‡ë†v§à¥\ÐÈï?åÁ>£S ÛX—h˜¼¢h]›˜éÝ’uˆÆÜ²]ó<ô/8 ¥Bé\Õþ%{%Üœ²Œ‡œ2¯RrJM&[úÕ«J*W±zm5*W¿|¾¶2–‰/ix`Ÿ#ˆÀUM¤IŒ8ƒËDPÝ&jx›U%ƒuÑþbo^xûÒ^Ã骖Ø`â@6äúúy2ÂqJ¤¹Ê–ëiÝhÆûxO%ÐÔxÔú“¾Òlm¹äëÁUáC´¤Ècµ-pίóJùUšâÒ“Ò¸(âSûu¥,\†ÛT…ëë:#± ‹î•Ã\¸Fü@€›oÎbe”M|Þ{ÎHXŽÄ-»ßð¹%ÚÁYQäº%Ú-ÝÏëoà‚;ö‘\òK¼Ó·R•lã¯T{3øâ|¡“F9/qêeo#Í|s©—»÷îg+ÀJìcòÙtÝ9ãlK€K/…˜×€‘Òºh|Ùqt1:XçÇ­Ÿbšrqáy"­On §ØME¦ÞÝYµeẌ(L®ÇðZÎPŠËæ'ÓÈ%œ—¥w­º2:)Ì+³ÌbˆŸ;á´KlUU19ah¾½¯WbˆÐÓ”ç–ðUoù%/‰³#qD\"# H—ÒQ\¬>UÑ 9’H[W×Ñò„Š˜yQ[ 7µñ£31ù9Ü„ø&zS¶çúy`tã‹tAŸ:‰œ˜ÔŒOY×+„n8.cV2IYð+u5ßH…äÊY´©1Ã[Ñ&Š¥œç#Ø›(>Ô8wÅŠ“Ââb·ŒÏ˜)káˆÒö¸ƒÐ‚„3ãà"Ù9ø×º&b ¡¦®¡CT*cE¨GÇ ˜11é јÓÍeüÐצªy¢sÖÈj*3© ÊKjªÛܰòØâŽ”N¦ÃÌ ÷†mj­‰lÖÛSkÇ‘›ij?ÔšÔ‚ånV­=g ¢bÇ›«ü`ÄïêJÅB–Z6¼Áçˆg{×K(Ð8V CvÞQí ÇÄbQ·jé3f¨l;$³€{â°ÊÞŠ_{‘ÂÄ-·¹áÀ4ÀÒ{ópnJ-¶Ó…Yc=¨–šs†døêн3ÇÎð³ä 3g¶ÀÇ(o¡œ4>Èq!2¼Œ‰…×àñ† H fžu&§chežuEVöpoøfYeTʘSÆx¥7¬ŒÏlA(cÁBÄv T×ÿöVFKß Qž+LUùÖIqØ\ÜÓ²f9„òµÄ1Å¡­½ðlš%livT°áÝòo„4è›>›¡»×ÑÒ0΃Çù€Z:¬Å¥Y·ë)δ»ëòe½hÖ¶`êôhËphÁsfÐ]!”fÍÌ­O„7î­Ëƒtiœð›òä“©„h°Eÿº–«ö “Q%ŽJ A„¸ 2ŒNa2Ù‚™qF06\ˆFV©„(Ë$&dbc™º´¸t¤ne"Q“r}^¦\ð„«QÑ6󃩀#&„‘0Û·šÚIæcmt(êV ¾¢hà Qiº™}1N«­Q¼$UJ¥fÆaJSàue<øë€Ï+Gã1ü­Qp†²P¯(ܱ$M^¦¢L‰o‚šî¸|5MUF'ãSd?/ö‰'*2Gs)&£¼˜LµI¬ ‰jOÞÀ•ÓøÌÏP Ø?øV£zÛ`Ìg*­áZv«’§„9²VsÞ$=+3¸Ùì ÎVŽf‚Ú¨ rÆòÎé3¶Š¶hÒ! aTÇnQÚôóŒ™ØeÌ‚YvÞÜäiMíã%éÚòóÓ•$ööܦµB²D¥KÁi®–ÄlúeÔVá%—½"c8~“ÆÀø&á9f0_@f°Ÿ^n™ºd\jÁWü²O\§È Ôào0¿`ÃÕk`o9á9θ+ö>à¼Ù„#ð<üÀ„Þ0¸‹a‹C´à7’æÕ…gì°³×H7¦<¦â3Ûêøgÿý¸ q•Ÿ§þÁ s¥¾X…ëxFætߟÓoxÏnw¥º`¯´·i{¡Èf+Êov졌!æ#ÇM].Íí‡n¥È og>>¼°TŽØ)×KÝW°Å£eÜü¦3=Í¢¥?c[–áN?Îø¥9~ÉècXÓ²€k³lW¿Y€ÙΘ0Oà™몺«EûûYû‹kè Ü2ZF}=“T…;t æ·`žøùè™™8©E?ï?ïþŽÄé endstream endobj 7046 0 obj 4605 endobj 7050 0 obj [425 /XYZ 31.5000000 464 0] endobj 7051 0 obj [425 /XYZ 32.2500000 462.500000 0] endobj 7052 0 obj [425 /XYZ 38.2500000 381.500000 0] endobj 7053 0 obj [425 /XYZ 38.2500000 381.500000 0] endobj 7054 0 obj [425 /XYZ 38.2500000 277.250000 0] endobj 7055 0 obj [425 /XYZ 38.2500000 277.250000 0] endobj 7056 0 obj << /Type /Annot /Subtype /Link /Rect [43.5000000 471.500000 111 478.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization >> endobj 7049 0 obj << /Type /Page /Parent 2 0 R /Contents 7057 0 R /Resources 7059 0 R /Annots 7060 0 R /MediaBox [0 0 595 842] >> endobj 7059 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F1499 1499 0 R /F8 8 0 R >> /XObject << >> >> endobj 7060 0 obj [ 7056 0 R ] endobj 7057 0 obj << /Length 7058 0 R /Filter /FlateDecode >> stream xœí]K¯ã8vÞûWxÝ@»ER ÔãV€,ª€,Y5™4ÓƒTf‘¿Ù¦}¯)}´øù¢|U…î{˲ø8<<ïÇoÿòí?÷ÿýýoŸ¾ýÏþ‡ûùéÛ®:tMuþ³?þýõíÚÜïûÎ6ûì~îî¾î¾ÿÿ¹;¿ðíÓ¿ ¿ýß^ïÿuøï¯û?ýÇðáŸÝ—Ž_øcשnøù·ÓϾSÃoÕõçñóßwÿþËþïÇ/Ó¹ÅÜþû×Zé¶;-ãÎÔ?w—mªÓßüøûî·3âf±º1MµWµ©÷ª¯õþÿk÷—a‚ËðÕÁÖF™N7õð{ßÖ]ÕX«‡ß;ãþ°“wú8»æTºŽB'?ý•^%¼nMºÁO+‡Š2­ žúÀÕº¯ú`»ŸâL:]§ü´rq¨\~èk¥ºãA?BJ€úËáj›þ}ºÃm+ð6ŸV.•ËáâÑ·­:ý¦Kþ.áÙ*“Ž œW. w´xðƒmÝø;9µ=Ϋë_je÷B§úÚ]ººjÍuøçÞ™Ú¦CªÓÊÅ¡rÁªÑè_cFÁK9ÄÖŸ?~ßýöEÕ{øÔ÷¿ ‹;Íyþñ}J³ÿõ(«¶õþûŸ÷ÿTUªþçý÷¿î^¾KO>«5·³ö‡V7ÀÜ}ÒÁ'-|ò‘˜ŽV½ 'º‡ï¨|ð­+ý|«ê3+øŽÁ§…GûŸXø„À—N8 Ö†ÀËÿƒçÑà<ˆ~!î3\[1¬?g¼Z=BáðÍ€Xî ˜gwu+EË–wZfß\Ðå êúP›³­Ê¿Îö`ûê´ÒWÓðIŸ|Bó˜3q°¯_mÑ ªŠ¾2ÞðJtõê¼zeF[5¼ôúNszbMÝÚîf¼%¹û×\Ƙ3ê3,”º 7²?ñ®nÝb«Ñb­ÆŸ2ÜImZÛ&ÏðRjY¦Yd¬X°Ž65)1ƒ¢ëÑæ–àË^Ç“wŠS×ßzL: mÄ«ŒW H£{ƒ‰ Üú˜ÀâsÂkħŸÈ]rÈάõo8qάÁçŒqcMÛøÑð;6‰™†Ï&Ä< ƒ N@9|,xpÕ·@öÞËÈ7/PBˆ| @c(ÿAý’O¼.ú}eòDÌa*2Ö±’RrÎÅÖÎUÁDÖÓ£õôµ·‡²Qªpàì°´×ÄËVúáhØPPíáhXÞÄks7;JÕø|ë>dÄ_ÛÍÅߤì#0¶bÎÓ;L#áhŽ&§kÜ?û¶j9ûÍè2kBÃïÔð6Õ}F¬ÐÍ#g_¸Q±­ëGv·9…îÁ·}Èé¶Ñ”Í‘|gs$%¹µöWné4¿«T+½ãHêš‹8f.(ÖµgB Œ& ¿ƒMŒINÖý…çñ­&³¶•c÷ åŃï,˜„±Ž±zÐŒ0ž-gµsÇ_ÚNÝøèKPÍ¡êÍ- ?ÀÑÎÌOéË#ŸTO¬MŸ×6á%Äû  ³‰p•Üs6,g ܧ‘ÉÔÄ#þÊÝäxIpLîOjŒõØZ‘V‚hÚÆçÍØÜƒMŠØÄ›¼]«t1ÁÌ Ór|ÜN5§‹G\ô®ì‘4Cò1p 0Óñê ‹zŒ«“‘ù@LMrÇ3ãå¥)*Ð1!(ÔOΤúFy”®èðš4%nh@LaÔA±Ò@ˆ_Á“k)Õ.m ##¸ç ~”eLœQ&ED}ŽGüš±Þ0Úm&&Œá¸5øF,ƒ}­kï_-ÿ2rF@M'ˆ>£à–ªi¡R.ºøÍe2Ý`ÈPLL1táÕD%Fh"Ö¥t’À!DY2…_ XÑÀw˜Ó¨ˆ]¼¶/³ET&&u<¼¨€,Æ”%ƒ8­¾qc—ÊÞZƒƒúÞ[KtLÆÀ#Ûv·×0.Ø®ü€d&Ô"äíUì‚AÃç\ P|ökôÕ#Ap8ˆ? `lÁá8ÎÂbqx3\Aàñ<˜®æpö\Î^?"(J ¼ãKFš}¬Hr‘<³¶„+ÉÞÎ@R¦ú¢²5Áù÷†öƒ)¦˜ÁŒˆrò„¡æ¹µö‘jó-Œ/X¶'‚8s…ßNóÛã¼nVŒ¥bë uÛªintÊË8á˜èQ»ïJ+D¸(Ó†I=‰K/›ú¹w ^ÄwÀqìÉ‹ð‰aœb­pMŠCOIôíQý±—C;ìðìûÄ®öùQ˜ŽAø‹(ˆ(I¢ÊLŒÀµx9¢쪂ådC% õj‡Df«<‚UŒŸ&!™¶¦÷Éô»‹¾¶‘2ªQØ$¦0 *_jb«ªÍÃ9gž€[5 [’Á¥+°u[\!¬…çÁÞ+ÑyÏpïë+Šºè68a©ß–):C8ry}r†  {{¥PË”aƒç¢Wovýþä Ê>!Áã5fŠ¥TÑMJŽHÒÌd¸ÉR»HébÈà.bä•DÔÃÂ"‡ML½YˆiT’{DF4Ü eñ˜Oé(þŒoê|òX=cÆÄ·Ž±Òp¾ËGI¥5²Ù®ˆ@ —óïF6òíÆKyE*0—2WåFg¢nô½µ¥ÂyÏc±ã(}Çñ¹.•­ý$U³ž(=#RF¿®áŽ#ªäÊ‘pˆ3bTÀ-š’ö@%ƒ zKcn{ž?™EœT¼}ËÞ—þY$ª¡KŒï’ðKò ºÙ‚ÚòÙo„è5‘ÍÚózœ±U±µ®NÍKmsìĸÿc§õÍÛ}KÖ‹¶ïÑ£‹ÐÄßñ\bSæú"qÖB1ñ;Dš1b£”sÔÙý1+bBú;û·µ¹F乞]m¦ˆÊÔ“3hŽ>¼ÙÀøŽ…Oz4Ú¥gWèíé¥×wðªÏx¥Õ¬>ødM]â­Ç)Ý%Wíðjb4G §ÖßÑð :ðÀÚÄ Uß‘twM5tH9Q S&ªlT®Ò !‰çJÖ'+ßÄ8ZF6&JYÂ}C•1`* 3×H6ÄñÉü+TÈ»¬F¢óÑ9[Åâ´Í=%}¶)+¸¶Úã–ÂaïLUYu‚q.˜“YÀø!ï AËs¹â™ªk¸f¾¬HQf±6‰Û5Ý®iŽˆ™u°1UYãñ±ˆ$4ÊD‰åW‘΄qŠ*±ÆÄfˆŠÔ¸}EÔóú\…&Kn!QŒlÁdÔ_k$ADÆË¬u<}‰‰$eìN¯ð½O[€š2Q º)ë¾MÏeŠ€¾Ìôìö(ox&Â"H)%¾'”3ÂÿÚAÏøfüdñdúô1Yï^¦y4I³aô½«Ûü¸tÆÎH¥†36݇þ›B­sò®þÖ=ûF_\ý—·k«}{úÑ)å>µûöôÅÓVÜ'?vm}Pª×Öªë·ÌÍ(æíÃ÷Ý¿O¯íý·Íhs|Ç[Éð-{3нã÷ÝÇ_R%ŸÙƒ1* ¥(Ш»*Q$kH"Þ†¢j¢+AÞd 6äòfæaΉf–nsEfÞ“¢g¥{l².!ë¦ôj©Þc@KÓg¤®oº™@êΆOFÈñ[æfóvŽ«R›)¤Ö£9ôX9~ËÞŒboçÈ €4‰T•MyŒ:­©oX@Þ`Ê%,ÏÂ7¦û~™îÚ)Uñs~Òµô]nÇß„»ÆcÓaü hT™*»æ"­²m) lÖ»yb¤ØÙ:YEDÈö½SOïÎ5öZ‘i×™8p) “¸SÞò%dYGÎ¦Íæš¤#áH ˜3E1VaQD” Þdæ›°™zÙ ÈL¾s¦Ù Æk³•6µÇ-ådS€ç—ÄiySqo>÷œI¿f„e*ªoù” ¾ÌDœîGÄ—ÊÖ ôx&Ô)‘â“ÂÉ‘¹*Ȇý2º‹Dá$æVŽ(aD³gÂúq7¸,ij€«›ûÊàe`ÊË`”Š‹ÌçŽL;ñ“*¥©ÍˆÏ÷}¶Ô†øi¢ïŠpÅçhºŸÞ¼UW׊آÜÒ÷°/s¼¶‚íÏ~Háò³‹Kßw«˜¤Ì80ÊCzµÄts­”èZalá×!cª{öLâÖV^ö¶dõ3ÕORž³öP×׎ñ_.2¡_ÅëRýlâIçv¤Gõ°>Àw¬èh=zçbwmg`mb4Wý¬;˜‘ݵŽ_A`žêJ°=)[½ 'xž‹4¯GÒ¼vOꋇðõ|Úð‰ÖÄÚj´æTáGÓÖà3½Öîaý×ÖÂÑà“ÀÚ>A¸O»=˜3ÂÏZ[rç"Ö[í]Ìì™((S™,K…|elåb›¶©D@xeB•+Öÿù 댲ŽH Ý&âì'¤$&—Û³(5‡ñ"äR´ÖŒÅ)ÁÚx èYïc¤\u"H²‘½¢5‚;ÊdCŠsÑ—@û²Êä˜0ÝÁJŒsK|}æ»ØˆˆÉÿâ–\ÆM“+qï¦ì~m´Ç«FîKÊÿŽCqaÚÎZ”û—`ÓÌý7æ„gm'¸²ŒcŠ8ˆ:س*¦ ‡`c@¶¸#b´‹(I’"I ½]¯©Ôh{ׂ”pò6ð$yÂsõkó탌‰%Ð#KV‰eBÕ"š™2$AT¿Y•C)-›)l3èÎÛq„Cf¾ä#l’ˆ0ôê$ͦé=fˆþ' yÊÖÒ’íSNOeK{Êzà$l!=þä°SÕæªÖ—æ>9±äì%KÐ[ôDÁw\ôóÄǺâFû Ÿ¼À'x?Uêëo+= ÝäiNÙdòò$¬Jc™od©Q»zÓw>CÜèdrS×Ì'8"e_e… Æ$5bËLOèù¥bE£R §lZ§#¶@V•¸¹†lÞr¶L¦F_ë„g yL)joG%"¡¬÷"mœ'•/([3…ñ2IÔ«eµª˜õ1* cß*¹ªxD{IegRÌ<1…`D¥%ÊgJÔ[X€ñ5MãórÆè'QœZ’&N×ÊfÅØèY¶8B‚nRÊ,\{”¸’Þ;è_w®¶¥k¸·ÙHdY­ÛÖ㬲½¿cPû~C9¦M¦šâ2á‰Lµ5¬ÄÈ:F™b?Tto&ãbDˆµu Õ¡\Z›ÁÖWß§¿‰5·åœ S Ê‚¹îÝ<£”l±7>—Á:®Õec‰wy,ç;‚"‰ŒM9q0 Sr´¼>é%– X /¨x\¹±äˆœíÔ_9cïH!™&ä|mßxœ¯\yró!„·ž©µàòormɦ Ùög[šÇi¼¦•A ïîwÆz–¾¸¸ ”öš¤AO²#!&Q5˜ç·S¡êÆFptŒû.PLîx¦ë*¸Ï§I?(Ïa¾JóP.îˆ>"IqŒÝ=W`Ó=2ž2ZDÕ#Úd”µ§¢šÏñï0¡‹Ï™²ZOßû)W2¦,¦,f3{Ç8ÄXdõ ’·qì;_{bľÀib|b*T1å3dÅ /Γ ‰ãDJGdÊ^0>›=qEð§n ~’ËӪ릡åànê®TŽMÚ:KT]ˆ´í°)~ŠÆ¾s4¦NÈ#‘zÏ¡+BŒáJb¬“G/g²];³€ª^LH_K˵C^shZÊD¤ºõ¸e ´)kód²ûª,jK'nfPÚú²˜/ñ”åý í–_úæ ²ãr|K$˃똵F«/ÆÏÈÓ1ÞHQÁm †CÙ |áX¨’Ìô²CbêQÞ!Œ<'qÑèr—e58‰Þ˲y§Ùª^ލ‰h=\áÒl‹d¯b¤lŒèt‘ ø[ëCPz Š5©[5¾ºVÌ¡­3 P6:, ˜11XõÚ‚&¶±T ¤pÑ<*Jh‘›R”4Ê`³æy19u]¿¢jK»¦ o¾<ÍSÎ l÷ªŸƒ>û1:}…‚3W‡sˆíhGSO:·#íÇ庢'SïXb´Ïð½ã8U_‚†_G{.èÍ :Ö-­ÂÐù„ž8iætÚ®Z+¸Ÿ í¯Úµƒìf„Ù=zÇaéÄ<Î6=±­3Ññ®½ö`•Œb ¯"väÝ’HFê-6XADˆlýÊòH¶p@l&õ˜SU€™àtÙ2RL'ÆJ!ɦ>Ìχ¥¬†"6®’U›Lö7ì¦*u¥w»¸^¯ÜR¦A2cõùÎð¥)>ApXªÕâ!ɹ¬S›‡aó0l†;PZeŒåÃÖVÜQUmíë¡[†ÝœÅnòÇ&lòǃL$ƒ}ÍL^6ŸtA>é”\ÖÖ2nÞîux»©¨7 È¡A¶Û¨É=[Žr.VgxRM¦¤”‹O=µº‘¢…UÊ¤ÅÆg››ÂT}Þ&î|6ƒí:\ã›zVzöô!Ã)õOU+“.¦ŸÝGsÓK”3 © ŒýýúSK«‘é¡`Í%㧆5o‹A )¹ï'm}kªëˆ¬Úe"VÕE±6‡ÊêÅ]7]ð°¾¾¶÷ßV£9Ôño%÷ìÍ(övŽßwItM¬»%íUJ†B¶Î*ÏQÆZ¶{˜p¼_yªË‘3‡êÊüNÁ1ƒÅÂL—wàL,,F-åK\§¦´|ÕÞ‡Zßá5ijm:ã1¼Í¿N{|z›q`2Å& íyl;y2§ì‡2ë4¶ŒÇ$!^âJÛ|ª÷¸ÖÛÁý{ѰÌ(VßšQ¬™2£ØÆ7q ŸŒÌ(Ço™›QÌÛ9®f«¦Ì(Çï{sTc3Êñ[öf{;G3еwµ‡ÍŒò4fYŸ !jxÇjUøLV ÃS¦sB„<&z÷(á‘)Å!x³ÓQJ£H£<öµ¼Q*WZqƯ-dtãM›‰jºå–70BƒHÂxë¸é#nz_UÜlvq†¼¤›amqƒ×’ÑÕýµÚ1Ž’»[ž/—es©½‹¨Ì¥4RD1mÐ U8Ç6ðQkd9FNÇØõÁGQÂÖH`ž‰ç(g=?™ ®fBc˜Ñã_D½iaõa$KV€uŒ¯¬Šô-0@…„üï(¤®¢ÀñªºB'Üû[ô]{ËðûÃi¹7àíÐwÀO ÍYS§ž|ó´ñ+¨?Àw^àN?ÂýÀh<ÜO…÷Ÿ8´œzÇÂwðEœ+€ïhx><çï‹Zƒ;Äk VÁâûãî\Ž›Þ ¼åœQP œ}Ý€w³«n8Šæª朵ÑwoC»ço4Ʊn\3 Ò©»¸”˦Fƒgb˜µáyòÉ]Õß_)~Ò@øn¿yUõ·³N­§Ï¸žº[ßP¯ð ÄÔ¨PlÛ[,Ë3«mŠ¡’Œ|¤ˆy+€tÎû¤«kóÆËÏÑæ,}àæ q”ŠYu.ÌÆ:¦²Ç=\˜ã¯–¯ëZ?€åX¢ZÿÈ`€¹Aûïèøw ¸ÏbN!'–·åèeŒÝ²Âö“°ÍN_–¿µë$7,ÿ0VÐíÖÞ½µv¬¶[+-3mÔ¡lê°N ùAZ3üÝÿˆJæ|½÷…žg;EŒ2‡A¤V¸×W=ùì™rÕž÷ÚMDWœ)‚>ès°úríø‰ƒ‚>´~Os×U¥MÌcî½L­í‹Û) ÀNéúuI\ì¥Õühƒî²áÄ U6± …Gƒï8W˜ŠÚz÷ж,ÂV|9h;×!Ã)FQ§8q Õt \€uýÐbÈQ ¿£ð6 ð×à!$ì*spì1ν@<}ãR¾K¥¿î¿îþhîÌi endstream endobj 7058 0 obj 6277 endobj 7062 0 obj [426 /XYZ 38.2500000 215.750000 0] endobj 7063 0 obj [426 /XYZ 38.2500000 215.750000 0] endobj 7064 0 obj << /Type /Annot /Subtype /Link /Rect [81 566 172.500000 572.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_ownership >> endobj 7061 0 obj << /Type /Page /Parent 2 0 R /Contents 7065 0 R /Resources 7067 0 R /Annots 7068 0 R /MediaBox [0 0 595 842] >> endobj 7067 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F1499 1499 0 R /F8 8 0 R >> /XObject << >> >> endobj 7068 0 obj [ 7064 0 R ] endobj 7065 0 obj << /Length 7066 0 R /Filter /FlateDecode >> stream xœí]K㸾ûWè`<âK ÀL?ä 1 ä°È!˜Í&Xì.ÒÙCþ~dëánÉe–Šmk;í5GT±Þ,V?ÿùÛ?Šý^|~øöŸâ{÷ûáÛ®Ü[S¶ŠÃϧ÷_Èzß}.lmŠï¿îÞŠ·ÝËî¥ùûm×>ðíá¯Í§ÿ²øKóßÏÅo¾ü±ûG‡ðëÎ ÛüþåøÛYÑ|*‡ß‡ïÿ½ûÛŠß3ö¯ë€ùøÿŸ´P•®`̼úm×/S~ÿþÛîs‹€°·ÔÒJ' ¡•.„Ó²øï?w?5/è§/÷N a+mË%/²²ySå´*„te¡Ëjò¢ãÏô‚r«tmòrv¬4„ö}­•PV} ôȦ®eóÙªîÏ2¤éæë#ÒŒ@’aöôÖ¦Š8ùrn¤täÆ“Ç¦¶©t‹2AºO³Ç H¥\¼És#¥§6œ<6µ­¶©=̃ µ”ñ&?B‹ÚpòØÔv²3ÎDÀÙ0{‚ÔeLj!çFJOm89£SV ÓYѪ¬#`˜>i­‰§%ZÈÙ±ÒÑÖ3;'qëºG4.ŽNó³O®J¡M<ê!çGKOÞéô/!Ó`XÚoÀÆðÍóà××Ýçg¡ËÆÑ©Š×ŸèŽïl½6h1ŧÃ>§Ù&¼þXü±lÐÿ§âõçÛWÒô Ψ”_ሃï±á”QÁg$|æŽàõF”‚#†ó=oãšw¥®"¬ÇÃ;˜žYy>ãšט{–¹Õaóð(Æu"¨)xSÇ‘§×ÆD×ÞÒ||+^<]¶ÀÔý+u/Œ¶2GxN¨nÕ›Ú]ÕöÃÈÓqÄìUã,}|¦Uñõé‹÷z¯UÚF´B#åQãé[A®÷µ+GÐ[82.´ãœs“H8‚‘ƒ×±$|&ÏdðÅq¢Ÿå´ô½Xáqñ‹(I!‚~J'غÙÀGQìʖ×Y)± §8yU"µ§ëºåÈ™Xqä'¿1X/MfÅÒCQÍ``ïNc±Ð¸¾s– Ž„p["cJbáä5Õ]SŽÁrŒÅnËCÃ¥¬©ÃÖ!ªÖVcµyóé…a‹ªº‡.á#\›–ãµÅqn¡Ìz¸ËßF<=†¾8•áñ,píõxþXccå„1CãœSÃc…9Î&è&ц•k™~|DaˉÆÀd€äƾ–­0#\®Äc¸lËV¢D¹¯¬ø¨Ô/wÜ(ž¬Ã…+óÅ]] _˜}éÔGðF¨åh!÷é­c]›¯{”ßPÜaŠ:œ€Åȯî¡GQóYíöòS ¼†Z?vÎJ§*.Ñ}Çe€x ÖË„=cò±ÏE`Š-Ä*œ$Ú+—(B?¸hÊz–%ÖV1M¶c#À‰Í£GéA5…Ñïqë°|sóŒ_Üþ®ËÌ&µ›Ô.”Ú42cܬÌ(¶Sà à±}K¹Ô£¡ ÷H‚}Ų…5Eº5–ÇMîïOîì5ÄNÇUi¤Öõ—üz´[Àm¥Ì¹÷Ðs)–†Ó`q¨PNiÔ©µ6”!ŠöóÐëÌ=lÕš`ÄÉy1Q»ÍÙ›fϸt¸ÒB,À•¸º3,žÎ, …K OUÏKäêú|A«Ô4X¬+PŸ›²ÊF{Q"Ì­”¡œRžŒìý£ÍÆvÑz—ò6IÎÝ:˜J-À¶±w†Å:¯Žr–QâhB.yîr…›áŠJkÀ†#º„XÄgÃÔÂ1&øŒÆzC€ý³¹lO À’#/̸ÆïÁÔÆQ;L¹„žh¥ú¨ó¦û¼º~)¦c1÷Ù~Ä«c=Ñmì¿à|Êi‚¡†\®1Qöp=žHÄ>±ð¬ò¿ÂR WŠñ&!Þ0FÁjiˆkϹAÿS0Êk4惔¶É-ŠW`K-–tŠmÊ¿þ4ÌfÜX(h…™•{’ ÄüOñÿ1÷AŽõ@}cú2¥V´j8 Lp"0SRaë!i%›äT÷ë\UåsH:2o;dÞJªIçJEÜI——à¬þ/³§h—PŠ.ÆXò¬‹ÐÅ3 „ÐóbÞ^Q“ú×ç1¿³RðÕ¬Õ…pç¬l{%ÖrˆÏtÞå¾Õ¯ïPÁÛ¡RŽ•rǵ瞩 ³aØz¦;ùº·§ÙÌ Ó£ò¯ÎžŸ™­Ä< ‘N«½rÄ‚ê΄œ­óÏí^M˜E†ÃÖù¦ç V¶ÁÖ•rÆ÷êj8ØNuñ9¥YåŽzŠKT¼å±”öwX3sô•'õ{_íòÆ·) ¬0ÕÅ{ë·˜Ž{­c²®3‰J11î!%=ЇŸ iÇÐ8•·Ëk‚^ärl 8)øHÕï„U›„è ÞM¥´ŸÒkŒp?3s‡[Ö»gyû RîÂfQN$¯ûq„Ë‚IHIDJ’pt¥"8Ñ·¢ÄÎ&å2Ö!‰z Ÿ#»y#¾E‘ÚÜÕÂÚ}¨;¦»¨ eSKQº¬­ß˜¯¾ (jìXQúÏpp ïµf!M€æŒ9œ,D’c?7¤£ÞZK‰¯²(¾t¦žÅ|Ê27$ÍÝOa>NLó¤9àÄ<o8iBŠ„\qJ–ڸ“üåIâÀ+Åœ„5N¡KÇ®’Eî‡+prÑKsn$ïV®4}qX­ \éÄîIU:ŒS_=¯{dx=Ïéh"Ä ŒCRƒ§9 ÁF{R~1¶ ¥U ËaÐõ,ÏzRáê< ý¸eÖÆ NH ¦x{ž"0üBZùúžö‡²ÑjAéÞÜ寿ƒ¸WãÝ1«œ&,«vâÑÝ4ׯ——XÔ°‚V%5Ä#øíí‘üÖ•Þ¤ª«YH=´Çt¤”ä³rì¬_“¿²4óü»iEšm"4ÂÌo)å^J}×rßüo "½x~™ûœë×爠„Ú—âQœèÐzóçÒ‘ZüØ3‡q­<ɽ<Þ3¥P5ébZr_Sç»ýĹƒÂGô5wªy¶çn¥“,îxŸ„êH%¶¯[˜,°c§sÓ[8¢Ñ2ž >Ó«Š ¥¿»Þ˜Êp‡Ï Ä=¡!î(, pº9:ñ ¢ž‡â«OH º$½Xs@VÃϼ Rèb°ˆ m©öûÀ˜çž Ÿ¾;(˜ÕÒ/ÅËîÿ̵e endstream endobj 7066 0 obj 4027 endobj 7069 0 obj << /Type /Page /Parent 2 0 R /Contents 7070 0 R /Resources 7072 0 R /Annots 7073 0 R /MediaBox [0 0 595 842] >> endobj 7072 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F1499 1499 0 R >> /XObject << >> >> endobj 7073 0 obj [ ] endobj 7070 0 obj << /Length 7071 0 R /Filter /FlateDecode >> stream xœí]KoãȾëWè`4ì_@°À<<r099³» ÙEœ=äHY&õÅÝŦÌ5fìZÍêîz~U]ýþOßþ±ÿçïû÷Ÿ¾ýgÿ½ýþéÛ.;”yvúoüzwù¶:´?ïË*ßÿu÷´Ú}Ý}mþ~Ú>ðíÓ_šŸþ··û?7~ÙÿíïÍ?þØþÒñ~Ý•¦l¾ÿûù{]šæ§ìüýøïÿÚýõûߎ#v¯k‰yýÿï¼ñE3DCÆÈ«ŸvÝ4Íó×ïßÛ½?-À´·T¶¶Îï?þU{»ÿïO»Ÿ›tÃg‡ÚS¾Ì漨´Í›ªª*÷ÆÖÍH6¯ozþ 4~ðÁ]f|kð–òðËb\aF†?TÞWÚÜ÷ú¸ÏyUÙæçÒµÿÍ\¶ºÝ“<²+uÄ-/}L~:R|UN;.{Ã+S·‹Öü ¿l/ÇÜdYoß)¾*݆Fÿ:eLŠhˆž„~|ܽÿb|ÖUìnˆ{~çéÛc³(ùþÝÑúøjÿøãþY£`Ø?þ²«…Í;Çžd|báh%ü ~OP ²OðI ©Æïù0}Ý„Ñà“Ïp´>3u§™><6ŒÇв›ƒCôØR8»ìËô}´ðIËc:+Rs¤.Ÿþæ ÿfpOþ *˜+„}Äš¯(”:<Ó°£aŽÅr/è (ÕXΈµÎ A1š@±sQô²ŠFqY>C£x(Ës¬Ã6S ¤¹ðŠ ´a^Æ«ƒ5$ô¦–÷>cÛˆÏ$àMAMy­ö¹>+j.ë_SªóVï’ñÀ ö°M†: ûLX‹P^cû±l­Ò›Êq,û¶¼ÂΦ͎sv\@½­›š ƒV”±n)s¶¼ÂnãýIØJhñNåóæø°(Ã×S?£éµUæõ[ñTèñ¦—{Œb^$4Þ¡S€åñ£â*º.à4ßšãÃfWkf¨G(\{µc¹õ-ÇÑæå39ËSÐÝøkpø$eäLð°µdpÛ„#4Ìת֩*oÍM‡¬ly·vE\:¨Ï–wã4‡°s˜c±NÁŽˆŒ¿Åº+ Ï/Ïç 83üÚè8@(w^š[×W‡žúy"4!ƒc šÁ<°¤1<£»4D˜Ïaæ©aüÕ–Ud¦Èê92ÃXh‚—l•Œ® k©˜8Wð –×veIX£l"ïÜ[…ˆ&2YØ9ÕÑ”•¸³,OX¿&ek”r &ÖUørÿkÆdEÑÃÅuÞZÍ©Ô ‹A ò„­S©°ÅJ¡«µ‰üÆòµ\©£`eægÈ&Î` ³Ã1YX9cäù΢”½ªþ+å]Hܳ/íœLe¹Þ-!²ÅÈ‘SÞƒí ÎÊ¨Žº]6]£¤¼§3jËt$ÐÏÉ8iÆ ea–XŸj޶¹;[Çà"˜jœ$¢Ž{ó“-s ÄaݘZ¬ÙS÷Eê9y¥M;ÚÎTð_°Åd.W:#mq>ÈN,ÏUx¦{¸6u"ÒZíì„ÁÜGd±Ôz,3¸Vãï *´\ÐO›vHZ;àøGŸ`î%:Í8W¤£ŸÜœLÐJûQ¬€2#Tù'/µô #2DŒÇ¯Êÿùœ.Oÿoú_Mÿ3\Μ3LZjÓ³rNF]Ó«ê9ùÅ·SO”r<¯ÉÙµ™“¥ÒÄÈkw3š¯CO~óy‹k»¿õ÷Q« ÀÑNŠÌØîÑ-À]iÍÛµùäí~åsöËݾ²žà6øbÌ-3‚°+KÐ&Pp2ùÁÙÊÜÊ«Ì{ G¶¤1«ôÁ+œïôÔ«ugzÆŽæ¡§FôÔ¾GP䌫¸r¾ƒ´…8Ð)„ŒÃÃÛÅ ‘ÅO0Ǽg ވ˿ÖÕ=¶NÀÈ:Ç‘^,BP„êløž3&ÑßW¨ ÊæÂZ;EeQt(?>ë@õ#ÚñXï%—¹¬ß»M} OÞûõªÏ ¶ Ú1‡0˜ —Ñão¨$=¦ 7^¥ú´ð=ø‰Ã©5f·ñL‰kÏ…ÖT˜6¼sXÍÃ]p˜ß–LµULÝ8Û¥nÂX× _”bp€€F©†þ˜—1CY & ˆš£è½¦¦c¯t<´£™ƒj2Êž,¯Kñ{˜]ÀM `ì 8üävß‹‡oS”×Ì/^âQ»~{‡'ÊåaØ;ŒÈ-ÏÖ·w2kQ<㺕œõâ¶ÅÜ$O3¢ÐcjñÅŸ"ƒ¯ÚŠPèŒL`ÎH´‚Ë›[Õ}+y÷¢Ä4X£ü}Üâ †¢CæÇ&–‰±>#;ê:¯Úõ;â'«2›£Nê5ÕÚ.e‘÷ô‹rkF¦ebá1L'Xó»1ä«>Gš”9Á›X”1o êl  Þô7Ÿ‹º„ ~ Úp‘XsÍΕUÞ!ß²gbV‹8y¶âìÙ[,žÑÑj FÕ$ªÝíÚìIÙÕ×¾­s»ÉçÚ“ >Áiè ç¤˜À¤â‰»ÁÂÖ• % Xs)¡k&óg±hoÀÖ• é&“ÎÀRJù Œ²3ÉUaÄØ†ó"W?áR:š›’á `†½ƒ§Ý¶xÉ$ìV` Éý ©Ô!ZÍÀäL² ~ˆÑ6`ØmBn…°Õ˜qĆžžaÁ>#¼pæÞNÁ£»ï4f1›ñ½•b´KläsÕqù,/ú|–r¡¦ÀÏJ÷ ž8qÓ†cÂøÅª¥3}žX&+¾€­¿ÁÉejrˆ# TùkŒc1‹°²¾vÇ~ ÃzŒ÷¥VÄ^ë,îÀ¤2hñÚr\ÙåVÕ¸>ƒ16=§!\G2<í*¿Ý.†àÛ GYGÁk ]GŽ˜\éüÀ[üǨ.Œ0ÀȘg§€ÕsìÂVV½•U¯¥¬zBÄÅ`&wåÔ8SõµÃâ>‹ž¹²èÏz1ˆ øE1 ‚)5,Bd¤Øûþ$6,,ºÀÑN iìaBÜI°Œ0S¦¼gÂiúÈi5Æ$â6¸áQÎ!Œ”jÆoDź8²Ó÷vEßÀ1Š“i·Ãà—Œ!ØZôVA žºÔ27¯û~JÜ'U&0~ŒBÚ˜Ù¾,·=›¸BÈÒdeÝ·ìcg8¦UâS$ºwð”>û"œµÂ§Üð}?8­€× zÖÔØ®ë…åˆd1un`‚÷´®Él0 ┆ҷGù‚ÖÆšžð8Ââ430åø›1gÞWpXÚ&d®-;ôÚ,Þ*øó-`>}4eo>¦B,m'(w=è™?5°Ùäf”Ý£dÿµ<Í襓½eÜŸTÛÁº`ù¥Ê”©ÓvDÐ6õ†) Nh-ŽèSG[DšÁƒÃÜ´ 9·1TW¾ˆì”‚l"Ý‚Y¿XNTéŒðJ³·oܽ%Þpám‚9†-$l•†ÀvŸW™D…›ëûÀŒ\„…´($( éxZ›pççË6Çë(àO ¾Q…­m¢b¤É÷Ž(àiç.ËT³rDô¿|§° aÊ ã›ß¢î1Iн¨&„Àý_eÎ8TX¤8Haô&Ô Ü’ªUo-¼‡i¤ÆÖÆžé‰i?X£ÐímpÝÚ”ŸÞâš2Ê9°õ½×–˜-JÀ§R?¥µ›°lÀÁUÂOp‡ ? ËBLÅ Ø“Ï2fµþ¦„vY‰Ð|íŸyÅýëØ/Ü ªë'úÝ!3GÏo}7#çz²å•}8%mgœ.žœPñbø¤­Þ±‡6ò¸X9÷î3zó®Ñö¥)ºê [4ßwNpÖ§N°Õ¬×†/G+Ó0x4ø™V¤Ì¤©_T’± wü¹¡øµ+vÍu!XÀ`ç–`Žö¦…I»'ì8^Õ$­ô³ˆ˜²þŒÁÓ`…ƒYLXfîÐ*°W܈yîòé+U>¦Æ÷_wÿ¯Ð­o endstream endobj 7071 0 obj 4015 endobj 7075 0 obj [428 /XYZ 38.2500000 307.250000 0] endobj 7076 0 obj [428 /XYZ 38.2500000 307.250000 0] endobj 7077 0 obj << /Type /Annot /Subtype /Link /Rect [420 778.250000 487.500000 785 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization >> endobj 7078 0 obj << /Type /Annot /Subtype /Link /Rect [248.250000 88.2500000 343.500000 95 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn52 >> endobj 7079 0 obj << /Type /Annot /Subtype /Link /Rect [43.5000000 73.2500000 534 87.5000000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization >> endobj 7074 0 obj << /Type /Page /Parent 2 0 R /Contents 7080 0 R /Resources 7082 0 R /Annots 7083 0 R /MediaBox [0 0 595 842] >> endobj 7082 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1409 1409 0 R /F1499 1499 0 R /F8 8 0 R >> /XObject << >> >> endobj 7083 0 obj [ 7077 0 R 7078 0 R 7079 0 R ] endobj 7080 0 obj << /Length 7081 0 R /Filter /FlateDecode >> stream xœí]]¯Û¸}÷¯ðsuÄ/}E$7)ЇAô¡èC±Ûm±Ø,šö¡¿²-ùÚ”ÏH<&))Öm’ËH"‡3g†3Ù7üü÷ý?ÿ»óþó¿÷?v¿¿ÿ¼+•+Îÿí¿~¸þ®ÝŸ÷Uíö?~Ý}ÛÛ}Ú}jÿÿÛîüÀç÷nÿô¿½Þÿ©ýß/û¿þ­ýáOÝ?:þƒ¯»JUí￞~o*Õþ©¸ü~üù¿vùÝþ·ãûÏu“¹ýûV9W×ÇiŒ|úÛ®_¦:ýúï¿íÞœ ö•Ú(U•{eÝ«Æêýþ±û¹ý@ÿúâÐØã¿°Uñȇ*}ü’6í+ts$»|èô+ÎëU‚—;åÒ½ü4óèTQ¦TòÛµ5ÊTÚÙãF7¹}T·®L÷߃D+«3Ñ\Ë> ö¤}‚=Ñ-õrÓqæÑ©Òo8~{DiÖªýË™@ʦ ÿåõ ^nŠtPqžytªt›+¼=±4k§;q³¦J@¶ËëSìISšt/?Í<:Uú ¼ýSÈ[ðTDã›ðà»/»7›½*÷_~ngvúàù·/_w¶ýËѨhÔþËOûß·óQØùe§ŠCY©º5½Žÿî<âN#æàly¸©N#õ¡nŠRߌ˜óÈë4ü§ïO#¾´{l­Êh¹µõ–k>ž¾ÚN“)®ç£áÈ{8ò蘾í|¦„# (ø ž›@ƒ:Ön¡­Òí&z¬y¦»=´ÂångƒY³öx‰êdÂŒ®•¾’ e;«N ŠþŽ 6Xö,\)žÏ;oSxnÓ‰/¼$.ç3Å‹,b~P7ƒ„bi[;û–RÖ@>‹¶up6Öù ¡ËfËb:oÇ<Ǥï½~Ltî}ÇŸ–? ”ð‡!\åšæøm˜u|GØ'Â~êä9ŒÄg¬qýú¦p3£­â {€l`ZÄ•H?<7ýÑ_³ÙXùÆ ’®ÃñOx‹+!FÎâ݈ÁTÖÂ×|ãiÀÆÔ¾Ì¥C¦CŸ€íЀfÌWFtXÁ¦õÕ¶^ØÕ´ WÓ7\›Ç¾tËîŽìW=(ÕãeÙà€´t6DF]M6J„)aàå7úpT ^•nª,-;Ö¹Ô™_Õ_Olwâ:}ô]í[FÔúæ'¿î>gw_æà ƒÁ€„`¬´ñ§£^µ®¼%@l€<3~âð4PÿhðŠuòsçÙmª•]šà"bœGx‡¢:uâ‚å¨wg÷@¢„/ü˜^wàóWçdò’L«`¤$ä{iý«ÌÉD`CÂND„x&.æ ¢ÈœÛ°—ûíý­L£¦)=ÍvxÁÛê“qLÅ 0À*hGl´¿›|äµbñ†à•¯ÎÆ”.m¿(­{#Ø]_¡ÁõŽÃÐùßEXL>#„0 ½ž,;l =ºÃæ]Æùhu‹÷(£¦ˆ‡EZáº1/bþexÑ•®€Kï=©SÀyGƒ<U=Î#˜Ú®s![œ…œ`¡¤*È‹‚n€3À¼¨ðzp– æl<¼Rœã÷‡™Æ(B £F¼‚ß–LkŒ}Âzð à3Âþà¹aêàï`Ýßfñžâ¹Á=e¤ãh‡½y¿©úùÀ´¸û¸ÎÝrŒ…W Q,QÖ‰Þ:bVÙ˜œYã6Ë*¿eEPÔ2Å#ømÌz˜|d¸ ÂJ ]«p3^)#ÏxÖxò›€Bø\KØOX· ¼ƒçƼ £7¡5æQH7üŒÆx€uæ*¼?„d)ÂÆgü˜nÂw˜“#¦aÎØO»p›ØºÞ׌mâù1zÑv4䊘6טwÍ6ãå̓»ypéÔg«[6RîP4æ6®Í„,‰ô *h%¤?¸Þ‡c‹D„=nŽ»@Ùé+î0ìNBe”kLîBÎPlY\:‡ºn¬7ÁÌÇ7¬¢å‰M œj0Ü„ ŸŒÃC;¡ V!ø8@ýãÌwÆŒñ´ü«Mã±ãÉsÌÉ…ÁBÄ^S̘ømĕǸl.ÐÚd ÓÇb±=?ÊÀa¾H_Áz͘!RVåŸÁ§Á{¿bø|e &¤€IRø€M¸-áâÒ«„O&ìe˜ðr®ð?¶£†L5Ü\êcɲ€gÝ(ò¨“¦ÉÅU°8]Ðà`(R.Ù9C¨-‹iÀ¸¹äÂÎ@F Âg°²Å¦ˆà¤ƒ#pÀ#±Ê'•1›A÷A‡¹bÅÝ+[X&ÍÄü7L‰›û4¿Ñ”ÓȨ\ƒÚŒ qx,›xdÉf¦5æŒiË0 š ·™ˆà†X±Ypa‹Èf â¬"Œ¬3I À‚= 9U|]ôá›È*ž9ç\·Ÿý°Át(LÑÌ+¶˜ qk‰9 æRHTt `U™ ß›zʥìƒ[ÛùQ”ŒÍI½„Óèwè¤n ;¾Ã›™#™9ßcÖÁ[ÌnæÇ} #qÊÕëðæ/øÌ‰MÊœfA£ûÉ–ÖQ¤T£·Á´8‚׳b˜~e‹Ù¡#Wruªj2Šj}a’gr˜év‚D=QB…„ÕBÔ[`MНN “ˆ¾Ø2¨2Š©ž:*·AǑơmBÉ/:^Ùbvë†ñX1µ/°ŸY°{˜¼+œCµ„Ì"]4½".âäÂáÈD<¶ø¨‰íä|U;µR[Úêƒ`œ"ð™ü¾¿Veo© _p¥v¦1s«Ï àª9qûšÓ/‚izÃô;‰ÚV5N³¨ý\G»v5ÁÕæ»@X½ûAY ¦û ~˜>¥8ÿ˜öŽ[¯ãùzô„ÉÐü¶1žjŠÒºM«L,ÞCA]ëÂwf%¥{W¦žMLÈÁS‚{¦CJ®-T+Ø€´xé‘È¥¼¢¶÷tH¦Æf¸¿¦éý¹¦{hˆÀC¸M*^ÏüÆí ËøXc¬”rçiK¦Í"DI2ª\¶k! Í†¦«šWôMk_‰oÐHçP ;L7—3RÓúÒaH¨±‰}nØóCøépMKì)4xÖø.þQQל¼Ä8µWÅÂa1ì †4À@|§XÈHÅtÕٱŸ¨»yÇàú¹„wû’±ç42õ°…È ‘†…;òýʘßpU¯¾è‚÷Gð c©Ç2‡}ø87cb¾<­/ÝÃÖ©?–Ì}Ï£Y„Yc®ŠÊoL¥m,ϸ`S—cÓ,Ú ¶aNtM¾Üìèïíˆ~ L_a¼§ø;›U›ã—ŒY²ò¢CBnnGã]ˆÚ_ã“Â]’g?bÉÚp0Ždo¿ÚäŒÝZ˜xàºBÖ‰sW3!²«„M˜?ͪ kÞ €@æB#g4Qú0=Ü(t¹Á‰C0Æ$„Ó !¢iD²‹îÄpæoŸi…„ ÉqI;“\±ÿxcÁ„¶®òÔÇóØ‚[Ô邪 í“Ò Œ‰LÊdÔ$r¬çF3;Âô‘žJi¦´¹Œò§Rì7ûtAö)“ºCeæ5TS¦fu®ª+ÜLàÍP 0Ô”*ìÓZj[\c}vŸ2ÚÇ<Ê„JáÍÊàŽsæVâ6ccб‘’{v¼ì ug_ÃÀ^üÌQ/uQ—¤–wy© Þ]xdc¹nCl®SÒuŠE-ÆðZ‡ÖùàöDÆá–â—A}–¶öÕgúo:ísõ‚„¹Ô/å ÜSc¬•¸WCã^`Ä7A_àzˆmÞuÖŒ\ðžàÂøÚe¦króuó]Æ‹ ™nê.ñ| ÷ž`9ÈT1JØÌé~VªR¾ö^Ÿ‘«TãÛ [Úà*Ò3øÛªu›ˆÔ z|t&t÷°¸F@@°c¶8ë°Ž^ .铌R>lE)6#ñš\/™t‘-.÷Q°ã•I[Áû͸†&âóŒ“{(Ò°”/؃Í8 âäÆ2ü°àXÔ (B­<ÚB[( ¦šsÊúz P¶Ñé÷¨ê‹Q®õžuó‘1òáÉ2÷ˆ˜BøÔ·€øóùÍt> n Áú–aÎq!goLY&¢Åi€)µeár{˜8¦à•NÌzÎ"œªe(O;v6Î=ò2[‚‰ønºÅ E–ÊI‚"$(‚¹O¤3“˜QØ™0ˆr›àgÑgœfúÒ}ÆÂ 8Ò3‰Ù—uá"•.ƒp†NªÑ1¾Ê!ƒ1 -D‹€Õ+d»œ5ÝçfjŸûžÇç¶ÝÍZÝÝ,ç_37÷H+Ž®±¾8nyBOž'T9¢×Y†¥:F ]½WÍÝ~¼å™resËIª8œ»Š Vto¤êL[í·"Qoá3uøÛ„4è™>ÉÎV÷üî¼­S¼ÕÁ ¬_>ƒÎQz<øw·^ÐHgbÜ{æ=œõ™³Ëƒ9/t`bÜ£è»ð¨\eï\QÝ÷Þõ7"ƒ‰ QYpL‡ðøÆDdâžNb¤WÇ Ä [RäJëë`8ŸªG¸#»çX¦XÒ`7â‚Oƒ÷>|†q!B€ó2D+pb d ‡K%ˆ;÷@®Â¦ˆ@k¸‹Í|´ÆH¬2J`cÆwx3è¤B6ãtX7 –>N,ÕÓMé±ìó˜`73a€lv£)§‘Q)½Ù ‡U<JK6 ,6¿ñ3Ð`U ydÆM@¸Í,FðÑkÅnòW¶À W!a&Ã[,ŒàMÁß™ÝÇ!Øw ö0dUñ—´ÆÈ*ž9g\wígÎm0 ÓyÝñy`úŠ- 8fiñÜ⺢36¸¯õ%pð\UÚ ¢6ˆ@Ô…-p`÷„ìE&ƒm?LúhM¨&ˆPmž:­6èx :%¿xè¸b‹Ù­|u7®u“í¸MPïÂ÷vÜÆ¡žœ‡ÝÆN²¸€ÉÀäX& +1‹¹ûX±ƒC)†yÞ’¿»ʯó\U#…7&KŸ@ƒé1ÅìpoLâ^yâÎ9Ti\‘¸6LÕ©ìàì%ζ¶Esÿ—1Uš¦\TÔjùãà£U”jöŒãmoö5ש®;ÿd»ªéìêj »´‡ü=»’”¿·y2-e¥n4LÍM,98¼‰çÖUÇÕßD_傪g6UC6=rÛ‰Ùôáøü×]UÕ×?øu÷9Ÿ?tWåõÑšÏË3VÍpœö©¿îj«|Úc—FY§0ÕŒ )a;—B•°,EîT–ö(9,ç‰á/`ãˆ^p!kƵõ´|HFÖCZxçòÕ­/÷AéÁ1Æàµ‡ç ”;¡$áXí”áS4“Õ›`ÉFmÀEîŽdù¼µîBdhàS§À´™Ë…¥<ºnŒMíóæÓ@Ì|Ù„[¥kíoÕó¸ýãzÿha€ûü¼…oƒNš®ÌŽ9£-üS|T|éĽ[Å”³°·D‚/ÕLeº—/0r{5©4h,iÓ-ò=¦—S€¸®)mdHê¸8KÜ&H2ƒ„:ñX½ãV'RÎÌ”ÓÅ0›¦ÀI@QïÅIê:â" %Ds¡ŒÙìé=.* –ɇY“Rì _¿¼~sQ€©nìØÎ41dºWñnÚY‚ÒJ[ÿ0&X†0ŽbÙ‘7Agã¨E5Ù(Iâžh"}'TÆ6×?I¤í=yÕe×q{·5!¨}™Hü–§õ_H_4×?˜#D«zvõH¦YÜn|ó·Ÿ¥rº¢ÞŒÎû9hÓærΫ¢¯9g:‡ËWL¯¶sÞ|Ö–ùyîsx½€ç 35£$´D=ãR§RføÄLä¯äryg»Ù‰÷4Àù‘¶ä•ƒ5XÄ™èkŠ#RÒZõ’y¶“ïóÞ/‹|]*וšÄiiDˆÐ•á$ŽÛ€  $Œ²ÂéÀ(ŒâÉuy:ÃP+ž¤Jåbç8bÔçKâC=¨Ò¡PÏ÷s•ñÛ2¥îà ‘&ZÉVxf*M„CSdaÎF¹³RhˆñXDI¤[S½> endobj 7084 0 obj << /Type /Page /Parent 2 0 R /Contents 7088 0 R /Resources 7090 0 R /Annots 7091 0 R /MediaBox [0 0 595 842] >> endobj 7090 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1409 1409 0 R /F1499 1499 0 R /F8 8 0 R >> /XObject << >> >> endobj 7091 0 obj [ 7087 0 R ] endobj 7088 0 obj << /Length 7089 0 R /Filter /FlateDecode >> stream xœí]I¯·¾Ï¯˜sšKo@@Û CAr0rä8aQ|ÈßÏ,=ýÞ°ç«n~SätÏk ¶äG5Y$k¯bÕ›?þÇö_¿oß¼ÿüŸí×î÷÷Ÿ7Å®.‹Ó?Ûï^þÀ6»îÏÛº)·_¿m¾o¿o>m>íÿû}súàóû¿îÿô¿­Ýþeÿï/Ûÿ¾ÿáOÝ_:ü…o›ÚÔûß=þÞÖfÿ§¢ÿýðóoþö‡ío‡ÏËuÀ\þÿÞTeÙÀYúûæ¼Msüõû×ß6oN·Jãœ1ÍÖxç·¦õvûßn~Þ/pž¾ØµÞ˜ºòuqËBµ=®T»­±m±­?XèøKgz“`ò¦¬ÒM~„\ýTŒ«Œ<û®ñθږþpчK.›Æîÿ\»îŸÛöÕVÝø6Å…÷Ó'¸ïS^ørõS9_8ž]‘š}ãËÓÙ¢Mpþýô ο,Ê„˜s„\ýTºËÎþ)f Š(q¾ ¾û²yóÔnMµýòó²ã‚§ß¾|ÛøýÿXО“|ùiûÇ¢põŸ¶_~Ù´»º*+[á;Øö8Òìš¶¸),yñ;ïNB½1æ8bÜÎÙÆì?zÁ³}<Ž”çO^Àötúf¶ páޏpa¦/ÊãˆÛ•¾jê‹I*babƒÂ:ðdñ:x6á ÇÖùøeO/·¡ºñÂvk]€îåS‡îG8/¶÷ndDTgi8…k1Ð4ÏÊjB4üþUQ(#lÇÇ&Oнat†ß(“çëMˆ¥~oM]b)¾+ao'q¿x¶w!F3׊åœM@`|\ÄÄÊEx'ioÎ[íGÜ™Íºî£ #Ì-’ÊeFGѽSÙ¢·p|ÊJÿÇz ¡½äÂH[‡$8Ô¢®Ô»xþ ËÐ#´tA“ %ÞþB½L]1)"É9Ätñébìtf:G˜ò ÀbM ê—‚ƒ…I¨P2„‘oº€`Š:#‰†U /­Á{p&^·$¯Øµ®B#~S¼E#Ý5ÅÍöŽ|„#x?qpħ–!ƶ¡qo>ÄÓ¡=]–±»vŒqÝ&7 ;wbÙo Kk¬@Œ;# —ņbª„Ò+ ð,Øð:ºBB`øwwu ë„(ã?f`·zh‹êŒŽØ½ˆYt<šX쬄Ìî}ü7~#°n|Aî'Ï {?zÃNÍM<žªg¸P X 7ñB߯EŒ¿ .z¸Ó`éµoàéfä òàXcÇqþC>xölöR \»oŒq¯à} XŠo↠àQÊ.Æ_LÃXA`ÃÔGðlŒÂ©¼›6üïT0®0î`< fF˜ýàÓÔˆ¿)á:xDÀ*|§eay&HG¼† s1B ôƒ!Àx€q´ÉÈñ];~÷pß–RÂ`~ ñó‹u‚ãuÔ$IË)ªe$ ÃálÂ0ø†¡ÆëäÒBí‡à·ëê„ãPàXJ`ìeì.LsølT‚-˜ROJ´cR¢lΚ<¼GawŒî OÑc\ÆüBàñ º*coÚA‹ó=¶Õ%ö(Ùwc¶ÕéˆmÌ+=c,!íW+ž¨*;'õ¦ç¤+àÝc+ðKŒ/;`½ž±ÂJÆ{‰õ,l%CªÍvÖÝ3À;Í)g|¬¢5«ï|õß‚c­Ç1BZ ¶/Á~ÀYÄ¿J{ö Q¾?Œ¿„& $¾àS$|O"´âlÚü憧8× À)>™Îš±M®HØ¥Žðg¥ZߌƒGtñ…¹-‹)ƒ€@X‡ð¢aüÏun ö)ã›—«úrwyVmª(H9nÎðU<ÂÄͱ4`"[„6Ähj‚€5ÂEF…îµ`Ã7‡ù%¶Tîï­ÃaFŸ#ðC #r“òbØ2z8ª¢=_]Œe,ª\±\ÿ©uðé0ÙºØÃ¡šÛ¤—eNkÈŒ¬&¢Ö‚ÏàÁrÉÁêŸmüw”ÛY? )“¡›åÀÈ3&ÊEÁÆ|£j [œ‡¹*¡o§ƒ9 æx§8«†Èèn›ÉÂ7‡õ'ÁèÓºk#íôÊ»K\γjeG)ˆ‰{ê—Q7”‹÷ ëèò$Œ‹ ÔŽð!Ü_20§Ãdpã»çºjÌ(<º#žG¹¤阱t[5#‰;,Sca¤Þ<4–ºHÃQ„xò˜ aï¿Å\F /Ò¿Íð !ã ﯃ã)X²äzã‚¡&Þ*1yº¾ ãjÊúúœùíF\?‚ÈaÕEY! ®ƒGp`HxsÏ'>";P€ ßf˜ð„j¤3Æk¡²èSFÑàÎ9K8Ït”]]g%¼7Äõ ™J¹êz"hÎ/å(†óïpî$Q1ÅbU„¨Õ!pb“‘k;~ër&´9å¬G‹×£æ(—/¿»b’U÷å›WA.Þ½ª ×-T:kÑ‹3÷0¾a0Æ~³ÐŒy.ɽŠ^JôbófÁ¢÷-<¶»Uûi`‡PÿvU Vµ`œÅõõËWµ@¼ûU-Ô‚=‘¯9µ ¯X¾ª¤Z@xWç¯ôh¡¬`fA¸ …¬«áuî^JSÍØ¹ŸSÄÛ¾t¶²ˆçKEäÙw˜´²éX6ýˆŽÓh1c¡k Rl:_… oûÚ²¯‹E¹b<+‹œ‹ø›³¨g´ÀEê„BõD{F¯«»ÙòP_í•±Ž¾@ÛÊ:8Öñ¾éhqwíF¨¦ªÝd3·‰Óz<˜¹³,r»®¯è·ú³%\^óÕf4À|5×® nTLÒ¦içó˜@PLî.üÏçq }ágoÒ¤—{" Ϥ+0íü›ñäÝê¿‘Mãjl<›NþbÚûçÚP°LÎþWŽ(˜@<Ç.(`5à*—%ef ·!S=X_}™‹wÿ©:™˜]¼ OŽÐM(¿À#ˆº©LÛ†½§¶äUÍ Aá2³X›À×Â̆_×Á²r¯Û΂±"´¢ 0eÇM¢Å˜|º=þÆ..¥ØiÛ@î k®3ÍM½ ®íO7ÜFîO·*„Ój“a BÃf`z©è¦)Pè£Â™šéúH™ÕÝél ¯ ƒ|æÑ~Ñ”-èª&^ó‹LÌÀ¹¨ÛeK•º—PVÆ*ÆžŸ.|‡^FlÐa†“I¶S9ZX}bB&Ä Æ8r3«×˜c’U2u¢ó•íÃü3Gã‚ãxø ÌÐ É8Šî¯+F4­f¶E¦Š¼‡’öõ‡­CF;D㗆 eâ¤ð¢Žàç6yBãáñåR¶nÇs ŽʘVžƒ\|eVr¹5“É7¯ž\R'fJ¸øùÃjŽjz’޶‘ËûœÉ8Hdþªnµjî¸p· ÃÊ­›=pG¥ÈoÐä›É¡Æ4<± Ыæ0,""ËâþÖÓðdu63ËåøÂbf:md D˜Cå%jbcz“ ë]grt)Z­Mò˜Ð÷`†Ïo)™´é¨á‰=†â’+!NÅÛï=ܱJu„ûKl %L0™ºŒrÌ—}¤á—Dj.ˆôô“IÔm"\x¾¨[Ðça"}Œü#¢|‚‚„ÃUõd ðþ1 ‚‹â¨>Hn?¡«¢ëëŽH·G¥ý„ß6¥½øÁ¯›Ï‚¸J#ç ”PÆÓ.…L ‰LIST2ÆLü véM…„¯2߃Œº¯û‡ ËÔèV»zYW¼a]éÌ+ž-üô \‹Öq0…φ±§$ŸÝ‡x:ÁgÍÄ9gÀè–ò ªW1/ÌUEU×Òé¼¾œUR€¨=]ûƒ)f—˜è±¿NE«N_ Ásþ­®®:ãR*©ó*§2ßÝuÀð@J{ÅŽçO./yŠWïQBx}𾬷L&“pŸäîJ#‘Ú² $’Àòð{ &gΚ‘Ú½(º§ž`rˆÈP !1L^¥¸Tæä0Ýçù³ŽšæŠÌUdðPsÅúé ï©;fšÁØž›i¬[U–id·º®W×µö•âÙ¨uT\Jy%Qz¿fÝ7¯¥âlÓ ¶$~MuƒpI)M=ý”¡,Â)qx¶¡I0ŸÖ>ªÔ•- ¸öí¢UrÝÚ€÷ lF<&º$ ˆÆhâÌ)©V”PÑ4îïá¤Êýb"ÁÌäþ2íf¥Çê&k3|($mÆÔ^Þ½BCæ<õ¤)ÅU .%ü2/Œ7¾Ñ‰QÇîöds‘Ï_@¯1h)ÈâÙ en0ýÏ5*è6/˜a½ól¾£™&ÚÀìæ¦mÉ,=^W ”´C×w0ë;˜{B¶Ò´i5©<Ç´Û ^ÁªY9ù„XKzW»«ƒ ¡š¾czˆ¨¦Ç¸t}°ƒ«"¦Ïõ؃y%ôA'\»s~®Dž®1¥âfP bIÞE匘׫.Å(+ ì1’PlV¶ ÄæÚ½$íK›ºð቟÷#4Ûƒo/ üö·pÀí’§›Ô• vÍ\ê@+fg1U–©Ø‘J¢x„&ão¤Zàt ŽCDwrIoî5Eÿ WNcdw„ ÂèKD³î:Ê˨åIkº6ù‰¤qÛÖÁRÌ}ÑM~cœÊŒJ\~`¬Ç0âcó" ùúRг² Q=m'Áÿ¯jD(—©ÄÇÛÁ}S·}•n>Êè#"¡e‡n_–û¿?Ë>t#FÉœ¡ã&m±JitÁöÓH#cÌ6Ý\ä$5•RfQ8¯léZ™"ߌ„o凷L{F&0> endobj 7095 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1499 1499 0 R /F1409 1409 0 R >> /XObject << >> >> endobj 7096 0 obj [ ] endobj 7093 0 obj << /Length 7094 0 R /Filter /FlateDecode >> stream xœíIÉ…ïü<ªr© 0 Œ6>$ÀÃCã±1°–çà¿o.ER"ùYYÉ*v©!5ÕÙU¹E¼x‘ùêÿ¾üçoËWo>þgù¹ûþæã¢XÕe±û³Ü|ýðí|³ê>/ë¦\~þ²øºüºø°ø°þ÷ëb÷ÀÇ7^úßÒ/ÿ´þûËò¯[ÿð§î—6¿ðeQ»zýýßÛïmíÖŸŠÃ÷ÍÏÿµøËï–¿nÞ¸¯®kÌ÷ÿÿ!ºº ŦWªþºØwÓm¿~ûüëâÕnúÕÒ„²¨Š¥‹!.]ýò¿ÿXü¼®`ÿúbÕÄàBí˸þÜV±.ʦñëÏuèþ¨•×~[{[.o‹e õYåÛ¯4¯w¼¼ n¸—o[ž|T\¨œýöU«7}díúPŰ Æ 1¹‡×0þU,Ûá&wÛò䣲Ÿ\~ûÀÚ\•®ÓˆØÆæäðúæ¤.Š8œ4m[ž|Tº ?û‡>oᦘVè«ñàëO‹Wï×úS-?ý¼nÙ¶ÂÝ·O_qýŸ ÕåòÓOË߯ÛÓþaùé—…+WE6Æyó{Û¿+iVM[TþÛ’ÂcI%o¶%qÃŽëÙ•8·*cÕ¬ o©ßæ |¦Ù•Üõú"b7”áJÒ¤Šž 8qWOØùM §Å±8﷾˲TüH%!”ùw»’bUÕî{ùË$³}ÄKâ®ï>­è>ìp±%øXÃÆ>œoöêö~[k»Ú6¦8— %ÎS‰÷éúP\ëC¬¿‡ÀK}xC%¡ÂìwñKÞa ¶Í5Ø‚ˆoí撀ó(Õã°§1ƒdûОˆ‹i‡2JJ|Æ•)…[P`=% &¿íuÕH+æÆX‡Œ`QUßC”"À—zÇ3ŒãëqN\•oDüš±Ïðy|zƒ ÃçQ,"‘ÃŽs ÃZdÁgü$Ïc=\RÖIgÙžÃz ãÂPŠãæßg„8}‡#PÆÊ‹g¸béc‰emâ¹€ŒKJ^Q°nr‰¥ø 3^6h<:ÜwÍÄ÷C—Qg*7Ó‚»haÏ&L ŽbÁ†Bè8^;E’™dh$#0ÕSf›{Ê£Ã=}8e ,o#ÖnuV Öj)X6 y Ð<¨ “ÀÇ:ÖZìOd dûqͨgÑÀàšë3<:‹Ð±çwº„î(‰ý<¬ø(%l”¹ž‡“&c¦9 CûðMb ¾œý>ÝÐ1Ãt_˜~ÆhæQ,ÆìŽ—€µÍ¨\m|‘ ƒŸAå.PaŸÉ„Aå(Šö¬ÒÌðG ³5Æó:£ •îeBGÓÎÐqyÆí߈ň,Š÷Éðsž'Ež6ü ËçyxD9ȺÉÏ0r%ÛZ}åhIYíwÍ„½ ×U¹mϱÊY Þ>ÏÏ솰\߸[Kð8…ñ Àž:lu§²½J¤#9·ŸÒà“$=΋=žÔ¡®g‡gN…„½Æ†î¡Jºz†µÀ¾mO´–a'sðo@¨ e}ÚëI¯RNSݮ외ôzF@áÄRgYņ4VUy"|¤+×AÈA`jXø(C<FVëkÛ7œîMûf…¯Â»·ý»º“Ëçç6;CuiPCy`Úâ𣞴ÀB0ÆÌ¬ûwp@|iü)¡0(-šƒ ¿>í%Ž‹¡~X1Cž¡d|F9ôWóÄG­o_”(&Üx›îÊ-8S ¥I¼LŹX+³¡˜Í\+ÂÛ—¯l2:7± û¡h¸$áef„R’„ EQ¼ A( zÀŒÑaÝãõ’ð¶<¤b@›ëBð—}½0ȳUdÎã æfè¡Ú»f›p½1;‘H‚÷…!òYVsü ʕڧMêbzMöIPHÖUïP/kÄ6Ôð¶+ô+“­ÁÌõàØ=ÜûÜc…=Üå‘Á“ã ¸\IX”ö¶LdP¡.iWf}b[ˆ"¾ôpÑLÐi¼95'Î’~[d8ÕŸ«çÝ‚B°·—ðÑ_c£G×8¨¯ì_ã±ÆzŒ4=¹BCl'ž†P ̼%`ÜÂÖ•;åš¼’ !ƒÊ>/VæÓ]ÒRUÙÆ$,<º,Ì—ŒVª¢DI&I.xð•½]çÆî2@Å£Ÿö–E“ogcûWZê…]ïC–F¤‘¢Iãc áæïãé—gïÇÛZÿY&š7/&îà"Ù­×|€‡|ð¹¶>«‡x^ó n'¥ÁW6™õ€ZEôíùCžuÕ)"ô0NÓ­¤ÎÑnI•% HUï/Y EàóÄœ–j(‰ŒÔœäã cIe†k¯ÎpHvô†ö„ð½–&Š[Q#ì·q­—r‡§—áTIã—Ò^é•8Ÿ\7yd¬ô×e>#ÊÖ퉥¸4ß,qBj ã‚C%îÊúÈÙYæ•«ù8q˜hÈh['!=’¡AœRŒãü<mcõ8†˜qUn>5ØËïï¯PìQàV3s= “~2{ÄÝäkÉëÄH*¬rùž«¾¿<š~¸KVÑt¥$­Œ)3œ+fÆ·ásÒ—k܉M¬3ùØjU.Í%ÿ‰ý± ’r‰²{ñ?é> eç¡âc4xã“E*FᩊÃÅÃÙ4P‰ð XnÈXRï‹Ô6噤vÓ£¦ó=žÆ> Æî©/5vSóE“Ü›aD-˜×3¯ÉhÓÝáîæ\ˆb¬Ü„5rAhZt0êI‹(,IB ”Vo<וÑ)…ѱ¯kÝáNòlð𵀑gM±ŽIÙîÌ‘òz<²<ïKCfÆ_HŒÌsªðÁq0q_ÜGš¦uFчïzÊ•×uš»DÓÆ Œf_ÅÃ%$àœ*+˜g“ƒqðNïsG ¥’9‹õlÎø³X÷ã\cfŠã`}Uî˜êXŸp2Á8á.œ²1ÖCB>%vûxî0‚s(™N§8$Α6ŸÁˆñvô<­É[Ÿyš¹*eY~8z?þdgZ윜Žá˜=dÌU…˜;68M®™+ãÊlfË0³ê!ÖCÙvº‚í†jf®3>ݦ›cÆ'ƒ¹f:›”•kÖí0ºùdl,ÛéÀcµ”œ†Ê™SéD ·M8/qï#ocöHÓ´ç¤9Z¤àŠuj–˜*´Ù÷L)¹ ”¬,}·9Ot÷ìžÈé)‹ázî7ÎwØõaðK‹ªØRÎðUwx1ˆq=žp¥žt9’po³Ñjå ¾›6Å 7‰ï’JÒ¤^ŽÔãrWåBE~^7É÷¶uð{éZËL2ÛG °$¾K‡¦í4-ã!Ë|}@h=»ýY,BYnƒb^ÈÞñÅž …O+;ؘO ç“Ì€•z®­-‡•lÚ±`1e‡WÉÄ]5Š¢p Ø%T²`òÛ”ÍÚIÅÜë,šýAl>|tU€9;¸ù.«*ÃÜÍði•ðòrºðy‹ˆ@¤øÖÖ" {Ç' xëá’RɪøJØãÄcÍPÊ1­÷!.ìã9iAŸo/4r8°·^ðg˾*@iÚìp”²ÇŠóXÚÄ-Pî3ÐÁeÔ™úp[ÇL $Z`س Ó‚£X°¡:nlBUI†D2S=e¶¹§<:B(9eá#€cÖnuV ÖîÃ633e9)sš›:ÖZìOd dûqͨgÑÀ:Äë3<:‹Ð±çwº„î(‰ý<¬ø(%l”¹ž‡“c§Èˆ©DNÂP—ûðMb ¾œý>l™aZ„égŒfÅbÌîx X3nsk\ñ"A¥‰Í *w ûL& *G±àP´±Y¸çÌ`7ÌÖÏëŒ*TÕ/:Ú¢œ¡ã>>òŒÛ¾‹/Xï“á3æüøÛö¾ëiÝ5áXRáÛv³M*°±®ëúY;séõ5–Dê†ã·á3óßõêú7¦G¸Íçu‹÷c§ˆ€ÃŠptä´×ì3ΣúŽÔ Ûòïj¬!(jüŒãn(ƒ¢«Á]BXaÕØwÒˆ2ÇrÚÉ\å×`|ùañUÔþÞ endstream endobj 7094 0 obj 3800 endobj 7098 0 obj [431 /XYZ 38.2500000 751.250000 0] endobj 7099 0 obj [431 /XYZ 31.5000000 497.750000 0] endobj 7100 0 obj [431 /XYZ 31.5000000 497.750000 0] endobj 7101 0 obj [431 /XYZ 31.5000000 107 0] endobj 7102 0 obj [431 /XYZ 38.2500000 751.250000 0] endobj 7103 0 obj [431 /XYZ 32.2500000 106.250000 0] endobj 7104 0 obj << /Type /Annot /Subtype /Link /Rect [60 461.750000 94.5000000 468.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_preliminaries >> endobj 7105 0 obj << /Type /Annot /Subtype /Link /Rect [60 455 99.7500000 461.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_running_swig >> endobj 7106 0 obj << /Type /Annot /Subtype /Link /Rect [87 447.500000 147.750000 454.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_running_swig_generating_module >> endobj 7107 0 obj << /Type /Annot /Subtype /Link /Rect [87 440.750000 138.750000 447.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_running_swig_building_module >> endobj 7108 0 obj << /Type /Annot /Subtype /Link /Rect [87 433.250000 138.750000 440 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_running_swig_loading_module >> endobj 7109 0 obj << /Type /Annot /Subtype /Link /Rect [87 426.500000 132.750000 433.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_running_swig_using_module >> endobj 7110 0 obj << /Type /Annot /Subtype /Link /Rect [87 419 162.750000 425.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_running_swig_options >> endobj 7111 0 obj << /Type /Annot /Subtype /Link /Rect [60 412.250000 142.500000 419 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping >> endobj 7112 0 obj << /Type /Annot /Subtype /Link /Rect [87 404.750000 111.750000 411.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping_overview >> endobj 7113 0 obj << /Type /Annot /Subtype /Link /Rect [87 398 112.500000 404.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping_identifiers >> endobj 7114 0 obj << /Type /Annot /Subtype /Link /Rect [87 390.500000 112.500000 397.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping_functions >> endobj 7115 0 obj << /Type /Annot /Subtype /Link /Rect [114 383.750000 162 390.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_nn13 >> endobj 7116 0 obj << /Type /Annot /Subtype /Link /Rect [114 376.250000 182.250000 383 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_nn14 >> endobj 7117 0 obj << /Type /Annot /Subtype /Link /Rect [87 369.500000 129.750000 376.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping_global_variables >> endobj 7118 0 obj << /Type /Annot /Subtype /Link /Rect [87 362 163.500000 368.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping_constants_and_enums >> endobj 7119 0 obj << /Type /Annot /Subtype /Link /Rect [114 355.250000 141 362 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping_constants >> endobj 7120 0 obj << /Type /Annot /Subtype /Link /Rect [114 347.750000 150.750000 354.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping_enums >> endobj 7121 0 obj << /Type /Annot /Subtype /Link /Rect [87 341 108.750000 347.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping_pointers >> endobj 7122 0 obj << /Type /Annot /Subtype /Link /Rect [114 333.500000 154.500000 340.250000 ] /Border [0 0 0] /Dest /#1b#ec#91#2a#5e#da#a0#3db#a3#9b#ab#11#9cA#25#7f#da#0f#ee >> endobj 7123 0 obj << /Type /Annot /Subtype /Link /Rect [114 326.750000 148.500000 333.500000 ] /Border [0 0 0] /Dest /#1e#17#8eg#18#87#14#a2#83#f2#06#95#27#9a#f5#cd#d6R#af#8e >> endobj 7124 0 obj << /Type /Annot /Subtype /Link /Rect [87 319.250000 114 326 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping_structs >> endobj 7125 0 obj << /Type /Annot /Subtype /Link /Rect [87 312.500000 119.250000 319.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping_cpp_classes >> endobj 7126 0 obj << /Type /Annot /Subtype /Link /Rect [87 305 129 311.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping_cpp_inheritance >> endobj 7127 0 obj << /Type /Annot /Subtype /Link /Rect [87 298.250000 130.500000 305 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping_cpp_overloading >> endobj 7128 0 obj << /Type /Annot /Subtype /Link /Rect [87 290.750000 192.750000 297.500000 ] /Border [0 0 0] /Dest /1#3d7#e2#1e#c0L#7d#92#c9i#89#e6#04#d3#f3y#aa#3b7 >> endobj 7129 0 obj << /Type /Annot /Subtype /Link /Rect [87 284 125.250000 290.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping_cpp_templates >> endobj 7130 0 obj << /Type /Annot /Subtype /Link /Rect [87 276.500000 125.250000 283.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping_cpp_operators >> endobj 7131 0 obj << /Type /Annot /Subtype /Link /Rect [87 269.750000 133.500000 276.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping_cpp_namespaces >> endobj 7132 0 obj << /Type /Annot /Subtype /Link /Rect [87 262.250000 128.250000 269 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping_cpp_exceptions >> endobj 7133 0 obj << /Type /Annot /Subtype /Link /Rect [87 255.500000 110.250000 262.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping_cpp_stl >> endobj 7134 0 obj << /Type /Annot /Subtype /Link /Rect [60 248 135 254.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_typemaps >> endobj 7135 0 obj << /Type /Annot /Subtype /Link /Rect [87 241.250000 170.250000 248 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_typemaps_primitive_types >> endobj 7136 0 obj << /Type /Annot /Subtype /Link /Rect [87 233.750000 104.250000 240.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_typemaps_arrays >> endobj 7137 0 obj << /Type /Annot /Subtype /Link /Rect [87 227 136.500000 233.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_typemaps_pointer#2dto#2dpointers >> endobj 7138 0 obj << /Type /Annot /Subtype /Link /Rect [87 219.500000 109.500000 226.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_typemaps_matrices >> endobj 7139 0 obj << /Type /Annot /Subtype /Link /Rect [87 212.750000 97.5000000 219.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_typemaps_stl >> endobj 7140 0 obj << /Type /Annot /Subtype /Link /Rect [60 205.250000 111.750000 212 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_module_initialization >> endobj 7141 0 obj << /Type /Annot /Subtype /Link /Rect [60 198.500000 100.500000 205.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_building_modes >> endobj 7142 0 obj << /Type /Annot /Subtype /Link /Rect [87 191 131.250000 197.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_building_modes_nobuilder_mode >> endobj 7143 0 obj << /Type /Annot /Subtype /Link /Rect [87 184.250000 122.250000 191 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_building_modes_builder_mode >> endobj 7144 0 obj << /Type /Annot /Subtype /Link /Rect [60 176.750000 107.250000 183.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_generated_scripts >> endobj 7145 0 obj << /Type /Annot /Subtype /Link /Rect [87 170 121.500000 176.750000 ] /Border [0 0 0] /Dest /n#3e#3bF#f2#fb#8f#ad#ad6#28#f3#db#a3#b9l#d8Q#c83 >> endobj 7146 0 obj << /Type /Annot /Subtype /Link /Rect [87 162.500000 121.500000 169.250000 ] /Border [0 0 0] /Dest /#e9#97#8a#1d#dc#1d#0e#e0#be#fc#09#9f#7c8g#025#a2#a6#b6 >> endobj 7147 0 obj << /Type /Annot /Subtype /Link /Rect [60 155.750000 102.750000 162.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_other_resources >> endobj 7148 0 obj << /Type /Annot /Subtype /Link /Rect [160.500000 128 201 134.750000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.scilab.org) >> >> endobj 7097 0 obj << /Type /Page /Parent 2 0 R /Contents 7149 0 R /Resources 7151 0 R /Annots 7152 0 R /MediaBox [0 0 595 842] >> endobj 7151 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F1409 1409 0 R >> /XObject << >> >> endobj 7152 0 obj [ 7104 0 R 7105 0 R 7106 0 R 7107 0 R 7108 0 R 7109 0 R 7110 0 R 7111 0 R 7112 0 R 7113 0 R 7114 0 R 7115 0 R 7116 0 R 7117 0 R 7118 0 R 7119 0 R 7120 0 R 7121 0 R 7122 0 R 7123 0 R 7124 0 R 7125 0 R 7126 0 R 7127 0 R 7128 0 R 7129 0 R 7130 0 R 7131 0 R 7132 0 R 7133 0 R 7134 0 R 7135 0 R 7136 0 R 7137 0 R 7138 0 R 7139 0 R 7140 0 R 7141 0 R 7142 0 R 7143 0 R 7144 0 R 7145 0 R 7146 0 R 7147 0 R 7148 0 R ] endobj 7149 0 obj << /Length 7150 0 R /Filter /FlateDecode >> stream xœí=É®ì¸uûûµ6àjq& @¿)@Ý@FÁ³Ãpi{‘ß&ªÄá°¤SG¤ªîíû=Q,’"Ï<ñ‡ûù¿/ÿóÏËŸþßË÷ùïÏ?¿uW£ºé¿Ëðç÷ën¯ó¿/ƪË÷_ß~»üööÓÛOýÿÿö6ýàçÏÿÑÿëÿ.üòïýÿþzùÃõœ; ~}3ÌôÿmüÛÖÿ«[þÚÿòöŸ¿»ü}ÑO7/&|þ½dVulXÆ©{óŸÉÆ?ÿüþ÷·¦ Ø7‹¦ëø…I!/ÌI~ùÇŸÞþÜOà‡ï®V & W²ÿ·ÓÒtÊZÞÿÛˆù?ìä†÷³kÅúõs×]¤“ÉäãšáýàýÎÉßVN¾+LhV ÇÌ™ÒVs3'¦ÇǶŠs1mWÄ2ú§Ì¥9pðaåÔ›22<øÕIÆÌ€ÌPé ô²÷ì^ ÀàFèãWN¾+þláÑû_2§;c%øoäÜvÜ3©zvÁì%Ã+*ÍœžÖá3ëf3«…+NËdO0Ò™Ú3v™7©‡¯¥~‘—TòyÆÍµ\÷¤›û~J.3c7ؾî¶}|Þ>ÖMK3—õBM/¡þü$gfÍ µsfñØ':³~iì²^({¢3;ÏrÀpŽsÓ'Ûþ¼œ_äs@»ÞŽÍM¿áþÕ–ÄYø@ƒØbø7 oý…(6€áµ|Z°i Aà`4/˜`d¦0alg e¡ØA71ä C¤09΋tÛˆÅ7 Á†pŒ%³;1§0Zrê¯.¼]0òïB1¸ÑLH;œ[²~ïbv‰à&; þñÔb¬” ¾³Zb¶Ìf¨Ü^(ðxÀѤ"åz ì˜`X]ÛÁ×h}5µ„2 A‹处7…M½MÛûÂF˜Ü!&aÙàŞϪñXq$·µ ¤ÕŠaÛi{=XªÅJðNøÝÀÄJ8ýÙÁƒµ-Œšœ¿=˜›V™#‘óiÁ‚& ‡Ta'‘‰ Uû=`ƒ=ÂdóüÌ<ìSüÕËDKg"ÞuBÛW{±åi»‡‹ŠV&ñXÂÛ d–SŒ¹¬` G+È?±(Ëq‹S¼š6eH(©ƒ‚$1*‰{sàó"Ír£5rµÔƒÕ'„ÄnOaá+kONHÂS(“åûÕ äW*Le²ƒÕ¨ Wå²E“‘Ç]ÇŬ¿N~ßXè ßÌ‡Ü ½é>Ao„ß0ð;\'˜ÍYÆ{ß$hÎ"öÝ›«PÍ[+[Þ.8‰î®¼+XÅ;Ÿ:Ž­ºQ6Þáä£ãJv”Ïj»€JgºÀ™*⥎dsðâ ƒteº 2ƒ£Íé›4ÿZvXÚ´nD w¡5È´‹ÊÁÀ7-‡ƒ•1¬ÖƒâÁ£×ímOÇŠÈp2m-šÇ”Ýè:ZóÀÑÖ‰%øíNxŒ•¸V Jª#Ýâ—§—ïØ@öTi…ÅÂ%'hÌ’š+Úxëב}¢K¶vp„騌Ù·Z¼žóÍj½çOkÌ/&Ùñ¥çô3ôëøÍË[hÓ½hBZú,ŠGÁkøåe‰ÛgÖ¼|u5Ï0m)Ã2J[PîØ8”ÊÆÓ#“+„ŒøÚžŒŸcö3› ÚK]$ƒsl‚8Jw€7F²Z…kqˆ„c$ ŒÆMjªzyü]u¦‚½Kñg¤ g¾wªik{[ts)›¸‚vLV ­U.Ô`›*hB¼ãÚ7šZ?˜=ÖÎMÌ O˜˜_ǽŠÑ!OM‹±´Bp ïÒBE¼ë¹j¢ðÿÉ £ÊšogQ46ÎZF;XÞ„%_ZÙûˆþÏÎ2 ñ˜ xDÎú“VÖØî£¾›ŒUÁ6§7HÚµ„‡Ã9§eÑG¿H9”pÕªHêžÚ8|˜>>“)±½ÙÈvº1†ºïHI¡M­ÞNAHd¼wW´]šYÓ¥V{;á…]íƒæ?G×0„Ù[ó:¡ÏuÃÓ{¡ñ{â¶HµNq˜V¯’@å{É U´ç;uŽåsç´Ïú¨%€&û‡ñ{ЯbäLœÅu±(¹ª®ª‚íý\1÷ªnÕjÖ5Ò@Ý”¦±‚‹-N¨/ɯMŠ4î¿pD¤.–,n‡iâ'4lïa]U”¶ÌMsÆ€I%¶€¥<ŽçÿŠÉGXB³û6: ŠëVò ')bª$ÐæÉT >Þcâ 5£ÒçBÄãlÛ£Mè~åâñëwH( …~ÕéˆÈ$)Z¬Mxá#žÂøTQ™hµvx{¦(æFÚ|ñzRŸôê-,õ¡òw—ÁðLR¬ V†§^Qé~pIžÙÉ ®áÚà[ÛáûcšyÆVß‚¬)ðƒùLj5©ÑŸÆµ‹È£=Ahî;‘èk_òÕ8N]bú̱"…©gQ+pš´Ö*ùv‡“yG Js)£3Ž&`®ÿ”¯ +÷­‹Þǧ཮ëÜ84QEì¥=„âÁ?ðo 0î<Ú™áõ.pŠX»g Ð'ðn ŠÛ5ËR!¶sqO,FÚÞ§^Ï”>„R¶*¥“0 #Â)Ûf/Ñ:2JÖsêÒji'HCi¯mµ/¬úܨ†Z8Œ9iÇí~r “/Ò “1UÂ_Ë.÷žvÂ0Þ#¯‹ëXÌ´Þq€0E4X{ýâ#CŸHÄ~‘ ýjñ¼µn§z†„KÒÓØS ò,‰y‡æ#js­§ÎùÃ8Q5 ÿœµ­N½ØþÊxÒ”Åj±]ºwe¸ZekapÝ¡c¿ŠFC;Œ²tbì™ukªQÙgw8aH-ÄV­f—77§ÑÆþ’ Ô˜˜Étïa. Ó²f¥ê(û%Y&;“Äúf×AÏæüÆ›Y߸˜`ÏôfVivýfþîÜx4ø7_¡7\ÁŒø¹ï‘ào~W︶—ÂoÀµÞ|¿TïÿSí3ø›OàÉo`xƒO»;ðo+0–€çƒy3K »ÞFC|) ñÄ’Â `¡Šƒ¿©E« ßÃÛÿ¥…yNL-1§@»£…3E¬€Ä<¸ÆP1ƒ + å˜ó鎩(ýô㥟¦v0nbN ÞùÓ€‰éCb¢—˜h¥Ÿ]‡¿ ƒõ ãCbú˜>$¦‰©…Ää–âGö¢SK?µìoÎý†Ø^ô!-œ€º`¤íÂh0Ýiøæ'wŽL$KæAh)íeÂÌvo¬"¶„|ÈE²ÇǛӿ!–‹*ñÐ÷£W¿šµÅùayÃC12Û‡­ñ´Ç^ÏÞ°:É7ÎøožÃýÍÕ¸è‚A ½éà`¿i×9» ™cå»+ïDƒ}¯È—þÕ†Ì`™UÏÁ\Ì¥©_¡7¨/ý ®®• GÅÁߣn°à ŠX E†_z`°J]‡)]žõÕÚîbºá/ØZíE»ë°oùþ¦í•1Ç­eK/³Å?Msôýçg9üìÿZ$sˆþ7ñJÄůt%üŽïoyûô»`OX²'lf±w˵¬fæ$¶L† æž"DyƒBâ&«Þ Ïs/ˆy!‚ ß~ÇÇ ç3ø2£× {ûùAÄ02D £rˆaL ´}K‚C/³Å?É1ŒÈ!F¿€xž"FßæW*Öˆ±ÌÑ1ìÂåÙ§.qDA­Íào™ÇÖ øœÉi'ü¾AŽÊ$Ÿ¡kjÕ} ›aз|ïÔͺô.Æ?Š—>Âh<K¦aã4áb†^2F†Óü%Bÿ ÎÔTËÓ:žf®Ìï™kÝ>s‰Ëû˜3SJ®ëfÈç:hð¨C ÃD!€x4¢V0êV¾qÛ¢]úõML|'Þ¶{Ç1R×}JqS)ZbŠ3öš(Ê2Œä!Åq=ÇI)Žc]2M—Pœ©— ‡‘á4-)Žc>“™…¸Q»b*K` ÉœŸzì+ãp6õ”9OÙœZ7lFQÁ"<‡¢BƸӷ$(:ôšQÐãY„¢¢Ë¡(wñ4}K‚¢ü†“Ë02œ¦)ŠŠÅèÖK(&Áþ[#¢°"Î ›Qu"*–CD%b -' ½fDóÃøÇ.BDérˆ(m<´)"޽d8Œ §iŠˆ·,I°Âàš ‚p¾ò}6ôþë¼”s±nØ r\G ÇMäbÐØ’€ÜÐk)?ŒÔÈq•9.“id rc/#Ãiš‚Üû34HxQ÷ bŠ—/` Pbbö‰ýպa3HK´Ô9Ž)cKÒC¯dý0þQE -e¤¥H¦)H½d8Œ §i ÒʇÕH°¨ã3VCÜ•ŠGP©sáóÙk~QýŸüéíSõæÜNlñêaÞ‡˜Qw1–Q-ˆ‘;TBKå0ŸˆŠa‹ª¬× ÐØ+ªí¡Ñ.þyy06Ou¡½beÊ +\^5b4T9ôç¤[ù‚ÇDçDrÆ·+ò.ŒÆè2Ñ}k¬Œ±.‰Æ˜zMÒÈ2Œ £1ú†L4Fß«–¬K¢1æ^2F†Ó´”VX·Ô•ã¿ È‹¨EO|Qn¬JÒÆþblù(Z·SÆbÝ6aºuÃf\â,Â%ž ›è[c-“ñ$lbê5ã ç.qáÏ„MØ©%˜†%av<¼ p‰Ÿ l¢_…›€m…4åÈ1µžñ~Ó½‡^6|ø¼ åºáÈøH:f h¹x­ÐÚ#µÈè{¹]³øH“Û™°íåv&õK‹Íâ “Þ‚/f’/ Õ+s‚Ö>Þ pÐaØ7zñ}s³nØ,ú‰>ÆåDËb™Ä²TôzÍ¢Æ?ÚHô1&'úOct*úŒ½d8Œ §i*úXïè.äÖº ¨‚åYo8çL­ˆ—S퉿ÝLb,D˜0 p辔ʹ„w‹Op Y”û‰Â~­K“6ì}¸Õ=:ÞûÇPˆ3yâÞµ)ÀˆŒae%iCž(ß@9¾ æ.zs±ˆ lݰUTà"òr‘órûG‡–XT{M¢À2ŒŒü£\äü£\ÄþÑ¡%¦^2F†Ó´¸ôþÑB. Gˆ ·vDâ‹jwJ\Þ<§nݰ^•ŒàU©¼*’2)¼½fxôÃøGÁ«9xU<™†§ð:ö’á02œ¦)¼êå8+E¦w…!bÍ7x_éàV{c2—bݰnˆàÖd2ûûÖXWâ&ÉìŸzÍpid·FDpk2™ý}k¬ù - ܶªáÜ.Ó4…[ãjÃ-Bb ¾£¡D ¬` GÙ—!d¹½%ôÛuÃfŒq‘/”»œ/tÈå‹@Ù¥¾Ð±×Œ.ð…úinãr¾Pîb_èÐ’`Œ[|¡·ad8MSŒq¶6ÆÀî}’8[„ã¶röîvŒq7§X7lÅÁ"§`9§`±Çsh‰1fì5aÄ2ŒŒ<ž‚å<ž¢‹=žCKŒ1S/#ÃiZbŒ`ÞùõÔf¿•†‰¸9£"Š1ŸAȶˆ’˜]Ú¨QwaõìàÕ×J“Äœ>¹“ZNwŠü‚y'ŠôdnW¹+D‘c‘)зÆ6!’rS¯y‚äXt9æ™r}klÁZrÌíB¹ ȱ8A¹;R+ 0r\HFFÄ¢˜dš¯K¦¿rë†Íh ]„*“é߷Ʀ¡’Lÿ©× æª Ð@º d&Ó¿o CCK‚Ò,p/m€ò™þý·«Úh€É-¯å­‡å/2w¨PzA»nØŒ:òÉ óÉ‹Ä2#Lê“{Í`®Ÿ¼Ÿæ†:ç“:¶3 - èÅ'F†Ó4E#k£¢"/*œ%éPé)»àíè`–èËÖ ›ÑÁFÙÍÂæ²›Ebv.Ín{Íàî‡ñQv³°¹ìfac#ÒÐ’ ƒ]²›oÃÈpš¦èàDmt€þÇö¶ãÓU+éw~‰²ÐAÃVt]”y-»\æµLl*²K3¯Ç^¸/ÃøÇ(óZv¹ÌkÙÅ¢¡%F‡©— ‡‘á4-ÑA2^@w¯€eÕ>P“lɈfnÝðha+yp÷@ÿœ¹{ oî[¢Â8S/³Å?wôÏ™»úV‘Ì‘Ü=0¶ù•®îXÍѰ0Ž•‚Ý=ûÄF’¥eåNSMe“[·½Í ÓW¨„†Q~ÞêЃò´6læn2 Ú2´!Ý\Ê4hcì5s/møinÜMæ‚6¤Œ- CKÂÝä´qF†Ó4ånj9ÍowÃXç ¤6ÇʇÉoÄÜ»‚‰ûÝáÎD)YÅvYC-•X·n8.xx˜(ï§æb÷·:ÚÙ~ŒËmõ]«£#©sF21üH½fªƒ#?ÍÆê\€‘Ô±khIh¬^ŒnÃÈpš¦4Vû#L”&^+i–°›Ž¯6ÑÂn¤Í…ÝÈÄb"mv3öšáÄa7~šÙ\Ø´±ýghIàÈ.a7·ad8MS8²Ë…OD ¾€0Ž0Êã=uÿvµKœò}q>ª‹â|T—‹óQ‰GuiœÏØkBÁeÿÅùô9u‰MÊ¥q>S/#ÃiZ¢¨ê– !à"CßFq;În¯º¥Œ 6ÂÏ5(5(ž5Œ½fØâAPƒŸæ{,Ô XÔ0´Ä°7õ’á02œ¦)ìñ%¨¡‚QñÅóbÕºáa¢ž°ÍϲË•ŒîO[bâØË¬G™Ÿ„÷¿ûg›1 *aâ9„I ˆC›_¹]os´4 *©îR¤Ê×CìÓe1Œ™V%'½À•›X¯[X`«µ®yI±ë†Çñ[Ù¿U¦r¾UšÅ¸§“ÊùS/³Å?Ù¿U¦r~ߪã9TR9ló+5küV'¨œßïÀRPàÝÜG{Ñ ™[é% Ö‰uÃf©ÈDÑ Êä¢T¢Í*›F3¨•ä‡ñQ4ƒ2¹hebÝ|hI¤"³D3܆‘á4M¥"»h€ï @(™…²vµ° £dÖÅ©íÒ¤½Õ—ë†Í¨ã¢Èår‘*Ñ2•K#Æ^3j¸ òÁOsC—‹|P.Ñ™]ù0õ’á02œ¦%ê莟‡µ¼°ën‰½PݺáaÑJ³0öB³\ì…fqì…fiìÅØË¬GñOaì…f¹Ø ÍâØ‹¡%­†6¿ÒuìÅmŽ–¢•æK†ç¼ò“¡+bI@Eb_ÂøU1AzûÄ2Í—¸ƒÉIæ¶ò-¢¸-rqZÄqZ¤qc¯‰w,ÃøÇ(î@‹\ÜqÜÁÐó–©— ‡‘á4My‹ì^”·4“íÜGÞjPØuÃftP‘‹X«œ‹X«ØE¬Uê"{Íà®±Ÿæ†*ç"Ö*v- :¨ÅE|F†Ó4Eµ\NPë"é÷ôº‹€^wD"—á¡ÈeDNäêµäHuéHhz™õ(þ‰‡"—a9‘ËtÉ]*rõm~¥l-r~‘Ë,.nðf5âë”1ÐŽ/qµézZLm­œ}³ød–ÄKg× [Qç.˜tÛÁDNa]F,)*OuE1l%‰V~„lý¸ó>¸@ênÝÐÄÛ¤î÷¥õ>‘fžw'…Œ™:2*¾‹ÖY»½¸qY]ŒiaûñNcÅT.ÆX!`γãÚDé´n–'Õµs"<ÁÑà°Ïöf°ó9¾1âwAÌGxa‰)&Ðd7å=’—h1â2ï"£´ÙU˜R F ßÇ€á¨ë4ò?­¦ƒ¢I´ÉÈ´¼Aq⬂ÊV¯' Pq[çcòÇs-Çe̵vÔ‡¦• 0uÚ1דæ£Õ*ÍPÐ0‚¼´8Wq†ñ½Råç3WˆMKG’ÙBì¥GùœE›„ÀŠ¥„É·FdH«¹„ÞÌ8¬¯³ù$!¹ß8ð73å×·–ÏþœXW;sþÜøz3Ÿ g,7ÚL^Ç ×~Oamð—ÖòP ÙgaõïØ°Cq)°)LÝUÌÎÞK1Ý䊇¶0‘=ð¦$ÖJ„¹åÔY5g¾ªVÌa wP%×Ç$Þ‚¬Ea€.Ç;Ê[ÃV=FGQ'e£Àûƒ ,—*f…ø›ý0X9©åAsl¹Üî©Ø$‰ëî©x-i™Š(¥7’§‡])ö…çÊႃ‘ ñL¤‰yˆLPã ÃøúÛgÛaDGŠàÐC¤²C3¿XÄšžœV€ªñÕá;8&«ÆÇíé°(•ŽÂ WØÐ¯ `‹gŸÁý‹9ìƒSá †ÔíyàïX¾ZKéýŸËo=Ñ+ÒÄŸîuØ@4mþ&Ÿ^Ïc7Äk>· Ã1™sŸÌ'üÊG`ýf¢Á:}3Wÿä©Á“3&¿@óˆ{Êinmßæ/M‚Fà¸='ìwÊYt98¼ßHè3<ø›™B°]Ÿ¾ªq¸áßýŠC1”wƒ) ó]/ðÍ@ð„Oo&Œ¹]÷»%ðPR€ø{àyàÑìã°`:qéH öÃà23㙢ޣ¦—ŸÞþI¹ðé endstream endobj 7150 0 obj 8450 endobj 7154 0 obj [432 /XYZ 38.2500000 574.250000 0] endobj 7155 0 obj [432 /XYZ 38.2500000 395 0] endobj 7156 0 obj [432 /XYZ 38.2500000 395 0] endobj 7157 0 obj [432 /XYZ 38.2500000 296.750000 0] endobj 7158 0 obj [432 /XYZ 38.2500000 296.750000 0] endobj 7159 0 obj [432 /XYZ 38.2500000 179.750000 0] endobj 7160 0 obj [432 /XYZ 32.2500000 770 0] endobj 7161 0 obj [432 /XYZ 31.5000000 770.750000 0] endobj 7162 0 obj [432 /XYZ 38.2500000 574.250000 0] endobj 7163 0 obj [432 /XYZ 38.2500000 179.750000 0] endobj 7164 0 obj << /Type /Annot /Subtype /Link /Rect [230.250000 778.250000 312.750000 785 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping >> endobj 7165 0 obj << /Type /Annot /Subtype /Link /Rect [288 416 328.500000 422.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_building_modes >> endobj 7166 0 obj << /Type /Annot /Subtype /Link /Rect [258 402.500000 334.500000 409.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_running_swig_options >> endobj 7153 0 obj << /Type /Page /Parent 2 0 R /Contents 7167 0 R /Resources 7169 0 R /Annots 7170 0 R /MediaBox [0 0 595 842] >> endobj 7169 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F1409 1409 0 R >> /XObject << >> >> endobj 7170 0 obj [ 7164 0 R 7165 0 R 7166 0 R ] endobj 7167 0 obj << /Length 7168 0 R /Filter /FlateDecode >> stream xœí]KÜÆ¾Ï¯àÙ€FìwH»R€ƒ‘C Ç1 ˈâCþ~È!9&¿&YSÝ$wÇ‚µ«á°Õõ꯫ªßþåó?‹ÿQ¼}úüŸâk÷óéó¡<:S¶ÿÍŸ7×Hì~/œ7Å×o‡ïÅ÷ççúïï‡ö…ÏO«û_!‹¿ÖÿÿZüøúߺ/5_øvpÂÕ?;ý¬œ¨+Ï?›Ï9üý‡â÷¦Å¾»n0·ÿ~£E¥l†1Ñõ÷C?MqúóÇ×ßo[,ëÅ+_i]­ê¿*-‹ÿþëðsÝAß|yô¶ûþNìÜ×W¥°uçÂ#=WZgµ+ï™býwÓM% !«²PV ::ýái>EãÚ$lü4rvªˆ¦Áhë5ûH§MYyøû]ó2^·D3.Õέ§X«ËtŸFÎM”~¹aã©WÛyÕ’ÌÙ4;·žbA¼ñé?œ›(ýjÃÆÓ®¶.ËÊ%[í«ÖùD—Â%ÓåÝÈÓ¬v¤ñ£×J('nLvc®÷²þÝ©î¿ûf¥¤L¦É¯ZO± Ê%“ínäi4y¤ñÔ«­U™P¶Ï­§XSštŸFžJ¶aã©WÛ*Û‘LèD»4Ÿ q§«tŸFÎN•~½që©Ü—º•Æ$ Û¹ùk"J“›N#g§J¿àƒÖ?-i¥ý ß#/¾ÿrxû±–[|ù¹Ù©ÃöÇ—o‡zÿó¦Á%LU|ù©øS=ñçâ˯Q­Þ™Ó÷Ú'UûÄËJ5°ÎåÉ»Ó}Ôª…{.OÞ·ïÈþÑåÉzGzØš==ñG_•VÞŒàÃé‰9*éÅíØOd¦ªíçò9} ŽF[3uáቫJ8 Å|ói”짪àÜ =°AˆÈÇ@ü°¤Ì^Ì5I²Ê°Ÿˆ_@Q“ØgɤZå4}n=Fјe¦ÌåIÚ.2%†2ÕˆF#öäë6wææƒßŸ³{»Íw7¯z&[‚¹yÌ Ï€$²P5ÈŠ ´ ª¡H?pÔÕJðö‡vþ™kÁ}!õØ‚ ѬwUËjßåÇV¡¨^ ]VH£' Û£5'" ûØ;zGu*ÍõË:Pªº)äÅeO5|GÂ'x>½£bCN“òhõ‰mB+;ÖŠN-ûí.¾*ìÉ`8EEÛŽíË;6ïÒ}½eJ{سzH•†ñrQ혳"˜ƒ§ý®Qc`®ÄYÛš›wëîç]8XüU< ìãÁÒ!› ÊÞ‰i‰%°ÉÏã@‰vŤm¡µˆz¡lÞ°MÑàXOc°®3FLY9Ê~ KØÀîpËl–‚•e(ÄÀðX<á;Db´ÄûÙš)"-Ø:2Aº6Ki´ªÕ"è/^ç{ƒ>#MW-¹ª£ly)À̆7Ì,CÕˆ‰À­ ˜‰@|­¡öxX!Áʉp&ļ‚™Œ< ö£È¶µ·öŽõaP÷B—Hã{jüÎÄWÇ»^žtŒ9öä>QðÉGô­tðI•ÚjVÖ…VkƒDX«åF…gGÇ{dÀ 2‘À ’H?cy¢?d\gNLW3Qïa@±‰á{(jP $|‡"¸*•(¢<+lÕô Wp¤~ùì(­QVϧ;©ÏC_/'yË –…«œ(³|Ô¹‡ýHIx‡`°%”GÅfʧ¹BÊ»d‹@+W j5 džG °¾Ë5SØšÂï`þϨ+¤ª¦g‡­¦/Añ:F´4ní‰ ÝXR·¾ŽÆß±Ž¤µÇôÅ:ÊVÄÃý¸b#ºØ¹;(¯Øb|fŒ´²÷pÁc(Y=²-k(ì<“Ýê.%Ì=<öztô‹sê.¥ôNt—2êîY]we•A'28g>¹…;Ã-ïðL%¤hDCa.Ï©»*qÇæÔ]Z¬Ò«<ça$‹m<‘fÚ÷†Fa˜-`;˜{щ) rp4‹Ï (É럃Nµ––›…Ó!mhN(PR‹€<ñòÛ 5c9?Œ?ÔMäÌ1Wæòü%e»£‡÷¥4/ÊÒ°”HÖÁ ¼$…²¢O’8²Ÿì¦Ð½ËN\·ÏñL±›É{gŦΟ·ç°’?Ïl-8ìÃU$uR˜“ë_˜³Î“OF9˜^ØLý:½kNmÄ‘²‹ötÕ—+EWu±ÿ·<6 ™Ö6?œݧº°æ|+[÷É׃ÕG!*é½8KÝ´¢®û¨¿ßý»l^+nß¶UôÑ|R¿s3’Ó·üM+þ¶_ïH˜¬Új)w©¥·KE/°¹ÅÆ¿ƒçƒG“o’›)L°ŠÙâHjÿ,*Í7Ú””" ‘~ö móP-ESîqK¨ ÕBÌÖ/ö´ Z.ÉKã-;LQN¯Gy«À¬%‘*:ûÃÚ}éC§uõXu•¼Ô±ïPÕ+ »»€¸È¢V¥¦wG~ÊÊ4*Ü1¥7®• +E;P|Z’Ë—+w".A ‚äD# ‚<ƒòDˆ Ç@'B¡ù$Ü67 ‚Ì "ȳH`Tš ©q ‘ò‹7÷& óéCç…³u³mî·W&r ª0#¥)åÐ-mÑ{’ßÉ[»ŸP',╳ÎçE4çtIZnŸqyGÉH®ô+|Éâw0W±*Öü2ÞótžÔ:ʼjyáëz³À<[Ý<Áý€4é{q‘(ÅP#(%K 2 éÉÜVÀºAä¬DΊy¼.æóº­TÀëòr0x<¢^“f_ }\B+éºðcgôõ¿>'Z„¦£” gÒTO' Eu,CẩúfÍɨ‡pK¶—ZÖ:׿‚ÄB¬Y® ’÷²]ZÏôϯÙE¹Ž;’\Ç[n‹ål嫜_> º\ª+äWu œàG"è©)S(„õãz:i§.4¹lj>hÎÞUÜh]1é—ç<‡½UlB„3xTlœãË@Žä)F¿ —gp.ÇZ•*B6Êq¯%¤ Ï/¤!ü„TÈl—U&Ö,…ÖÌëМ±ƒ®u*Á“gH —ÁGCtôkTJ ¼ƒ]{í@SÎÀÇD‹øXÕãcÊ\S&`‡‡Ÿ¡Äg z·+øíÐd KšÕv¶_ ÃýÂpVwåöˆó¥¾‡G7z»ïrý{xð;ðž–.5°¶­‰¼zß¹‚oÁ·±à»]’Ü©3ÖZŠ›o’ÞÝSöjîÔ©'­ûK—1LE‰ŽàÍÉVVƒ7Þ„7i{N6éðõ°™õë#’¼œÄÈklT®Ü±\Q.›)(³ÌÁ#¸˜CtïZ G¡r ”X†Â¼.°û %‹T0ånÕ I'Q‚J3!É«%2våÇšÏs^Y ;ˆgº\q_@ÜZ¦”‡J„bêû¼ Ž{\; õøµØx‘êQV!K¯¨5‹+SàéïKÑÚãĶ)Ãé£ G³¾¿­ÄÃÛJ[6"­À[aCÖÅer ÀGî#ÜåeT¤â>É ×»S›µ¢82YËWÀP×=pk–Ç¢›«e¥Ã`} \PKãÚø¾ Ö›K™gŠ ‘Á“‘`e,Y¸è.dI¨_)*†5îPX-268LkR7žÏ†Ë´½´ûp_Ç5‰3¬„®vm%"ÚÖQЬÖј“¥2Ã-3”’®"´öð÷£ë³¢¿ßAÞ²Ô=Ù7\='ƒq  ‘C* 6ˆÉ•ø—\E_™¨‰èGª³:J¡(a>“ õ‹©j³Áh¦ p¶óá!©­A† &Vî¼÷ SÊ…Pî"YPýú´Àpj¸ÙŒ³Ö*z@E‹ipT”òš_cCg=V&ùvƒºÕÎâ:n´¼¹÷TWéf5¤~²TõgÝ3®ý¸|oq`¥˜I»£G™í…Ã$²Eɳh‘ùQ”¼oRŹLaæ T9)š 3/+rGÚeÈMê;H¸™)Íbê¡mÇŒm®´SiÏ »~ÚéT’äXÚ©:{aZ"Ne”¨ŸGréR6• øè%—ªò\¼ŠYÌtS0)éj—ÉE,^edÁ(4Xs—€~8.•pWäI®û®s’¬ž¾Í’î6DŸ)·"Q мâóŒ²Êô·ûF=ñ|MkØOäB £Çð5n™‚G"4HŽOw^–§‚üjâÝ$>Ä'´¶¾½%](J¸i ·FÊÝãõÐ)HÄÀ⢥°WB€÷Íç´vÚª[&ßYÈ,e‘³P¿º%Æï”lw¥ÏàK߃øBZÊé½ÂIBØ×¢„¸‚¾¾‰QnRC¯v NQÙ¤c„´‡êÌŒ{ò!s—¸gâ >¸Ã  ”¥8X °©õ1Þ+ÉôûH¦Ÿ¬…žô.HXµ\µ‹ö‰å“*%ÏC^û„Ëm&2aŽîÊ0äæˆZ! < G‰ÇÄ!›DÀ Â|±¼»×¿SèÅŸQd F1®·së£tâ±(EÁè¢B­í:°dŒn¯'ü£ÉIéº|Gп{R›®„ýB¼¾iT}¸Ö…uqÕ! ¾F`f\æÝ+Z^¥1¡À&ÎU|Ë)k2ó’`ŸùÙ(¤³3^È`1¼–T¥vz=’9Oð¬­ng—>^eue¨3¨É”÷~rÞøG¯D(‹ÖÈ|óv—ûš #%Íf¼*È=rª\Pz××ùþJM¹V‡‚òl4ý3ÂT•h¥pz3V<É«‰e¾Œ3b‡)¨|'9°^l¼‚¢„¼f‚ ¶¼ ‹P4éI%IÉ,pä)Aú™N׿¸ˆç²aH”œ¾¦W¹c£ï0cýà(c\Çëdô¹¼ 2Ç6âkÖŠïõ£óÿ4õ…VÙî1…:–¢ñ¨ŠK¦¬€­ÕånÄš´«/²E¤¼d‡OÔs÷Ž€ïª‚gÔš ÛÇn¦È©Äx†µ>ݶà vŒ-ÖÐ#Ó¸5øNçfˆES¿rû© ×ü^¸_hH; ç„Y@L•…c…X¯kdðLoøŽÀ+Y:…ðÞµâ®TǮÛ¥‡2aŠòZoNéÌâÓáÿ±AkÑ endstream endobj 7168 0 obj 4655 endobj 7172 0 obj [433 /XYZ 38.2500000 524.750000 0] endobj 7173 0 obj [433 /XYZ 38.2500000 481.250000 0] endobj 7174 0 obj [433 /XYZ 37.5000000 227 0] endobj 7175 0 obj [433 /XYZ 38.2500000 411.500000 0] endobj 7176 0 obj [433 /XYZ 38.2500000 411.500000 0] endobj 7177 0 obj [433 /XYZ 37.5000000 227 0] endobj 7178 0 obj [433 /XYZ 32.2500000 544.250000 0] endobj 7179 0 obj [433 /XYZ 38.2500000 524.750000 0] endobj 7180 0 obj [433 /XYZ 38.2500000 701 0] endobj 7181 0 obj [433 /XYZ 38.2500000 701 0] endobj 7182 0 obj [433 /XYZ 38.2500000 481.250000 0] endobj 7183 0 obj [433 /XYZ 31.5000000 545.750000 0] endobj 7184 0 obj << /Type /Annot /Subtype /Link /Rect [225.750000 503 279.750000 509.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scripting >> endobj 7185 0 obj << /Type /Annot /Subtype /Link /Rect [43.5000000 431.750000 93 438.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_rename_ignore >> endobj 7186 0 obj << /Type /Annot /Subtype /Link /Rect [452.250000 198.500000 495.750000 205.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_typemaps >> endobj 7171 0 obj << /Type /Page /Parent 2 0 R /Contents 7187 0 R /Resources 7189 0 R /Annots 7190 0 R /MediaBox [0 0 595 842] >> endobj 7189 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 7190 0 obj [ 7184 0 R 7185 0 R 7186 0 R ] endobj 7187 0 obj << /Length 7188 0 R /Filter /FlateDecode >> stream xœí]MܸѾ÷¯ès€m‹¤> €íñÈ!€a9,rv³ »‹8{ÈßOw‹êé¡ôPâÓEŠêé5ÞxÞ‘E‘ÅbU±>žz÷ç/ÿØÿë÷ý»_þ³ÿÁþýñË®84UÑÿ·?ýùîúº=ØŸ÷M[íøu÷mÿm÷y÷ùø¿ßvý _>þõøÓÿözÿ—ãÿý¼ÿþïÇ_þhÿÑéüºkTsüû—óß]£Ž?—¿O¿ÿ÷îoØÿvqøœÌëÿÿ»ReiNÓ˜ùô·Ý°Luþóû¿íÞõûJ[m[ïUiʽêJ½ÿï?w??0 _ÚÒ(Óèª<þÜÕeSTm«?7ÆþÇ~¼Ñç¯z¯twÜŠª}üüGfx%?¸*ª:ÚàýÌÅ©¢L­ü£ÚZ7eUt-üù&¢•e×­j"lÉeôû]U¼ÁÏ3—&ŠÝn<øqWíðgòÓí™bÕñ»¥j÷‚¥+•jNå ÖÓ®«ì®kÝFØšËðö]«6žég.N•«ð葵†ÖfØUFØ“—á# nªx*©Ÿ¹8Uì†{F<ͺŽ›ÑuU1OsÛ–ñ?Ï\œ*ÃæŽFÿ2 žJÿ`Ê~ó¼øáëîݳ*‹ã´êý×ŸŽ“;³ÿëë‘(Õþ»£)Ó§òõÇý‹B•Úýy×j] SŒñD×èIÑœŸ|úz$^ôu›v˜ÏG8SüD…¯ÛTpÝŸ(8·¢…ï`Êk8kƒž”Ó K¸ÃM}¯;üžÞá4”ïªá«ŸàL!—zø—‘6é֭އ%±,ÅgPN–¢E—E¿èv¤¦gX¥UY·Mu5™ž-ÛCÛ百<é—VJÓû•\†x§üßùˆžè¾ƒçÖ§:ݪ×OàwŠ^\¶K†oà“Ñ ½`1aG‡¥]@6Ï÷ð;£áÝ_”†Ø Ì(x&p4uÃìUÞUýÉRfØý›æèÙ@¼+x4xhtGì1þÎrrø$€Cu wÏð;:˜–ŠCݨ×<»ü´Z¥7õ.ÃCY )¤ Íg9&¢n©ŠÚQ.x6ê½Ë¥øŸÂC­ |îYˆØ=ˉÇpv"i⑨wz$wÜ c¶E}X®¥á‡=‚ÆHGÑ^ø;Ìi4ðHE‚:íE¨ 挧¢gÖøŒãcCè&fÖ7Xgu :MÑQ‚ù!êIŠí^uStн) ô@õ…¯ÇC7Lk8ƒrb!æè„Ç¢iswÄ:Á¦hØse}0J;¢ÒdzWbô˜qG©zðúšþøv‡ft|EíZÆÂñÈ`Bƒzü)„fSØ.#î”Na,xÆ& p«a£+î]òÛäg&„8™àUÜC‹åëòWÌ£áE\/ØŸ¬oÈ3Æ2ÃĘn˜Að)ųfôàÌGõˆiG¿Éú”™[˜‡±ðÜRm!…=ßY]¦{´²lÄû^DÄ#VM=¹Tu(\+û=íÃp§²îM®ØPgÜèuiÎ’Eåk{r*ÃæhœáÐÁ'Ïè‰jàœá]S;”ò0`¢SIÅuü°]×sùRA:&{ad׌hN¨‡Y¹šF¼éù„¿ ˆ·©¹Á(miÔq¥ïTSßY]±1Šz›+M¨Â/<¾¾ gÄôC—çªË_ëÎt¹lÜA?»–ÁC/ÏéåUSÕ˸âÎÚ³æúŠg-ª—=:–ÙbÖ uì…_SéØTžÐ²„iµs| WµÎ¶Ôx’øW÷¬cN++IÍ#|[]žÜ‚MÏÕ&{§æ› D` ‡ˆ?< sL•Äö2Å…;îÌö2 &AO=¶þ0u *‚Æ~ÂŽ¢¨ƒ¿#ëÉI4ëtãË)óÄš7Ya—ˆo êÎÙÅâ:¨<Ñÿå-&ëͨÅcÇ3|"k‰ñ^F^:cBâ‹c>yœLx=Lj=!Ø ¾ÔžHü„¦°EBëñw,t1 àhö™ÆD½@ÜÜ›‰šA` ÓnøÜ…ÍÚœ D=¤wš—ŠI·°*wgu»pS9•+å bÉÓ˜m]Ž[ß‹–ÓLC‹"—¬“)g‰pï)SÛ¬“ W§P‡¥™=SÛw›z>Þí1æ°ˆ,lœâ'ð;Ø©¡1W<†ãUÜ$Ý<¸«8²¯" ÍÖ—ÊÐGUR²êKÙ•b$‘ <ˆ1íÖ®uXÎÞù§’/h?TáAA]0L’1Ëy¬«W8Q9íñÏné|”Ïe±§3¤ù`¬t!‚¨G鯀¦Bºn]ÌèœUÔ3›7 ¨“áooÊÕE &y¶’AˆXÑùUiW¨ygD²b©¡A@°“¥'™‰2ÏùÉâïÂóö@ȯ‰øÛ·ýà¼cœ]Â8Ãø 0AË!Á(Q=º0‰¢É¦º¢$Á†±MÊöR­Ixˆ<†6û° ‡MR܆0"=áX"°‰o.§ÖƒûYyVÔˆÀ˜žb\(ÇêÌ`Uu™æóEÕ—¯q ÔÝñ+æêC=B…£ÙMœxg8Àͨ¾3`ë–„Ç;žÅDzbÐw<ÞõXã©9t­ûÎ4kë"žZÏÀzcKÎÇz‡¦æ†×Ó¢ý1Oáïèf˜ÛqëeO<¼c Õ6€n˜CÜÞ1ÝðÌ;:ïÄh…Ü1÷‚xW]$o ÄŒßyßðÑæÂÈÖª}y‚Gƒs³,qäÉ‘‰GóÀ2cŠFAXë¿6—Äê8Ô5Žï9xéøÖ4ºßþS™.:Ä Ó<$'[š€ø¶:oÊi’a¾ø¼áwœ[Æy O“‚Rböa«T’t®ÒòT\¸ŸUO_ÏùuÃïþ7‹«Bœ­õr ½ZÂe¢n8ðL¥YƒTVÔâÕž}Ô˜}N\pf‚æÔˆ|ÿëî¸õ׿øe÷%Z+rÄ™§)8œ¹¾<\?Æ¿züoV½GÍMkžðÌû†eÝåª^6­„I¡öø V`H,*ËqôͶï +[cBS½bðy'š SÁ-õõXר: è½v?Q€ÒwdL¶âˆ,g©$îó]¼C aæV³¡£®ÝÇèºÍ$~xŒpââ%ƒ¼Ã0 #UF ÕÁì“îѪºe›™Œ‡{÷$pc,F|ƈ*oY§Ú½*Ýdæ`äL¥Ç–&TÌ¥ÍDL/Ÿ™¼Fê6&*@Clµ úœßÐÙÊ@\Êž§õ¿Ã8/‰zÆŽ¶>hBêlû‚pYfl³pQQÏuªvôœÔB€Ó‚rfI´^N…Àøí=÷Â_(\ë“߯2‘òÞŠ8ï·”‘ŸAl@Öe* k`¹Õ;µ(z©âà°j.N³µÖ#R¡m*Ü«»VÎ:“ÿÛ¨ )×Ïÿ}‚ïÀüßfßZèÈ“TuÓZqþoÞ±Š¿>˜3êÔ šðw˜Üd%Vð>#}šK—#Of0Ó>[Y6¥­±®Ä ÷žGÝ”dsyó΀wnP€­y¼aŒ5/rÅ‘)EÆŽ ÀÛ– ðà ”°­Æ¸æTrs3 pUŠ·ÇwöÛz/Ú…rÂ\iX\âᙋ?;N>‰´*½Mô\e –ÊÐÉ·ÜÖà”‡GQíõMµÔŽºKe—嘇š·$ ‘È”8 Æqï”Ô“œ¤@>Ús}e<âhC:ŠnýC½~@‡¹©xX€9»kÅb˜ÚMáDZYA#R8àrˆiñÊRkÈÈÁ¤‡bÁÒb¨—­ÊiÖ—^ù…·ö›}<îãyk‹ù¨}ý‹50OSxÍ[wR['âg”Å´éÀî‘Pxx kZy›8ñØö` úe%%··©<ÇTJ"]T¦¾ûPðÁ!Âð¶M”©r÷ñ¹|Â[9öaK”,Éh@<ƒ€àKê(V!ãI§Š‰¤òåßütI6òÚ-=Ãü(s×£¶{u5 °×sSv ƒË™öÈÆí+YëÎå†~B¾åÙõ-oªÒÝ+ÑYªã ½GyÊ-±xÁ.[¢Ì?ÉAmkål¾§÷èãßr„ƒ:ÀÚb·¨'U9[?[aA¦+†$Ò dð;AÆöOžÂ‰yBO0NŒåÐ)üAfh³2ƒdh0§,bË…0Ÿu[ÙùUžÜ[^ P1Ñp‰ÂmÝÒÆãïaòš‰ZbÜ÷Röru/¹aéXò&+yqqW˜8€G01•ÝŸ˜áMoŠuÝZcž¡ùDX  z¢á;œ¶¨±=‹ßÑðÏ­ÓÀÐëI±Ãú(YçwÞ1ðM¯ŽÙa¼ÛU= }Ëî*Âû¥‡³ñ ‚ü«ñ-ßp1g§Z)Íàw0¿¤äŠº_–C˜¾XââuÃ}düE ìjfÓìIÛܰ'Ô>BãqòhNüb‡)®€ú>g9F­Óšçÿ©'b~ù“¡.)àÿc^Æ6œ%fÝ—tÁ‡D ù7%—–Ö·s/øjmæíÍDÙ^Z«Á¬ßû Ç,>‹Œÿñá!ºQŠp¢ÖÚ99›ræ.¤GÛ¹’"UÒH~îæ„ž4­›Á“†-DÏâVµ>£—pÖ)ïuºS³ëöø%˜¶”tºuÝÝ0Sæ‰<‚9ÁŠ™@þ´È+{r´r<# q̯:Ž&üÎ{øN- ×?©‡Òº«w »Uã˜Ë|b!†'*õàJüŽ ¤LÙQx¥ކÍ[Œ(‰ŸÀBL¼KÑøæy9ñY×Ýf¿'dŒ“ùR§ï$2˜¶Jø _Z¦–·RŸ–ÊD•…° äÉHü3QKðk!á<*顊‹Ò‚qD-©\-)®D7Ÿ€RöšA ̰8. ƒgÅDU#…t‚Ý©Šâ$¸ùîÕ´ •î,oÕ³Bá1à îbª& Õ„SL êÆ8ÉÃ$œ©´N…>MHìøø°„±m¦CNŒ:³Û)uvguu«YÖcà]zØM¤do’ÀÏVÁ3 3+N¬†ñh²÷Op«]@WÀ¾¬KgŸSOf$Ín㥮KLW¬Ç0¶„(®vlŸÓšx}À}‰Z#ªkI"½œLÿ€JhyÙëÁ6{”®-"êѺéÑû/ë7ézÃd¶X\ðÊïÆœó1Ψ‹„ÀŸÅ€LgȘÌ=Ž`º¬¼Í%gd\r¥Œ{í\Ób] ] ¢ŒŸwå¼)Ý€3®Ëæú7«ŸæàðŠ„µ½Z -P±.Û¡ŽÆ&ù©êP8Ø?©ÒÉf <Ò‚,hφ18Õ²vC»·—FA¥#Ž\9Ëû51ž6Ä&áŒ5ÌæŒ…–êìó×Û˜ÊÅ–;]iÂa–Aã…å­Å©S‡íY¨Œ=)æÖO–,¤íüÔÅaloú0óF€ÁS*žñpFΖÍÃF26%ˆ´&ê‹&VÉ®‡‚4u–2Õ#ŒÿÃÕ&È%Ý£ÞÎ$ƒp>™PMâ†<Ú ul*ô^#OtT83ƒõ×Cí‚( îË?·H/‹†c©»èe|vñdU¡g™&ß» \¡ø1œ¦ ƒsb@O nˆ¡ ÈY´üCäP—BQ2ÂdÀï„ôÎÚT;´;iÔ™q¿²µŠ©’…H*sI£Á}µ“»¬íZ‹[ÜöÁ,Ñ*×ÈqÂÕgLî·Ä9erdsWî¿æp”3× 5®½e”vÄ6]0R¤fÆ}ŠcfjW$2Å”èˆ:1EÝi<¢1µX=âÇMz-ߎ_ÊéËÂÛ²t“°ÇÐyk ʺqåÌO„Ê´ZZ=Øcpõ!óŽ ÁC«Gžñž„Ñ ó6ï?ïþVÒ:» endstream endobj 7188 0 obj 5338 endobj 7192 0 obj [434 /XYZ 37.5000000 658.250000 0] endobj 7193 0 obj [434 /XYZ 37.5000000 658.250000 0] endobj 7194 0 obj [434 /XYZ 38.2500000 374.750000 0] endobj 7195 0 obj [434 /XYZ 38.2500000 374.750000 0] endobj 7191 0 obj << /Type /Page /Parent 2 0 R /Contents 7196 0 R /Resources 7198 0 R /Annots 7199 0 R /MediaBox [0 0 595 842] >> endobj 7198 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 7199 0 obj [ ] endobj 7196 0 obj << /Length 7197 0 R /Filter /FlateDecode >> stream xœí]Kã6¾ûWè¼Àhø¦¦_ö°@cØCC0Iv1Ø ¶“Cþ~d‰²»%}”Y&iù‘FÒÓ$‹õb±XUüøÃ矫ÿüY}¼ÿüÿê‹ÿ}ÿyÃj«YÿOµýùðöÑÔþïÊ6ºúòmóZ½nž7Ïí_7}‡Ï÷ÿjÿú«Õ?Û¿V?þÔ~ø‹ÿÒö ß6–Ûö÷ÿºßÎòö/¶û½ýü¿›ÿ£ú};â0æýÿP‚+®¶`,Lýº–É»Ÿ?¿ü¾ùØ# n–F‰F4WRUÜ)Qýñëæ·v‚axV;Ź5ʲc&²b;“Ö®â±J 3™¨ûI3<Ï0xÓ¨|ƒw'Ç —†‡G¯%¹´B«-¡·DÖM#Ú¿­ôÿ·.'M4Á\´í†Ï@ÉUF‚w'ÇÊ@pk‹4?ëS7««ÐbRÀQ¬Æm[»)Ù§nJU+Ù;vÀ0Ûµ4uãXé¾åöá] gµ±¼i÷-²mÿî>µVfûÍýWy[I2Ô¢$.ƒK4†€=v-º–¢áöá]rè´ Ï£àz°±fLŒÊð¸OZäO–1ùAÅÈÙMòÃz7új€Q°H@H+~ˆ i½Ò²í óÝhÂÅCÐ BW E"ÀK„Ñ0ÔJÅ ?Ö¯ŽÄê4 Ç“âZi¨îsokºÝ}ßïk7~BN 1fF<fú¤AÌ–„Ñ—žX·RÈ2^¦Þ¤(*+'ÑF+„b [€‹1¯NŒfŒH¬ÿ!"©®Ë”\{¢ôؼG'¥@ G-^¾gZürçF»ƒg5[$jQ°E>ÆC-0ª µšf¿xuó˜&xž®D1ŒÈ–0G@Ji‘bÑ\·Q¥åÖÅó•€}r a;[¹•¬‘7¹}‡.xa¹Uä¶‹ª_t³[ô4¸°al¡¹GKÜçöq¨ô¹3Ûƒ'ÈÄËÁ „€ÃS#t= ?ÃØ+ewhžÀJáz0Ô”Ñ0ÔÓv¿}˜ZtÞå·°±xؼzãjî\s8O€\*a»õ¥Øi0ÙO9çˆÇg¤Qœgˆú\Êy#e Å¡À<}„`ì7&ù"äóQ߸y",Z‚­Bâ”5›vIBÏÉBÉ6 É:fшóm’AÖÌt§IN¨å£Í1 ÷˜DÁ„» Šó8° Š÷€¢ m›Wt“sžwpàþ©À¼‚ÿŠeÌ`îù4ÆѲx¿)œøš»ò÷­(H™8sª@Šm>±nOkÞ1gf—rxñGBŸ3p:gI*ÌiñÊf´9^Êq¯\ZŒ”bH‹ÁþL˜È¡o'¿0öµ¤aAMà{n—ÖS†ÂÆ.S8iÊ^7¦=æ í%L¹º;œS„ûÓGð¦V@î ‘ 5cq2P1ìÀÑ(IG§§éš¡˜C°†„(œðÃRŽvÃhrŒâ–d÷´hb5¤æJEÝ„Lje¹?9ÇÝv“Ûn²¨5¶çÎr=j­w¬Ig’:­)ì >ka\á“ÖO˜cáh‚Â/¸ÌÅʹ¢º0W’â!…±æYL±O´›ø_'Õÿí1ÍÝjhŸVKŸž+°…»z®Ë…oNß =öˆaÏöãy\! ®(Jam SKB_$Å{޽»"-nÉÚ–.®tER‡í¶’Rçôi¤®Èê Wç©<À UËJ—T‹Š ß”³?¶ôIž¸UêDq–Þ;\x/ K ôQØR%PPê‘pÖXGù7k®³lãöyHº¶Y;U±\æ0ñ9喙䤔•ºzNhŠ{d ÖNZÞÑÍ–wì“>Ý>³7â8«ûhô7`*ÔâÁÔµ˜»ƒ£á>>¾u®ƒ}9·ŽFŒöŽKÉíIQDsçÚV?Nš·uVYˆ”,ý5'À”"Þè"ªú.¥Ÿe>¿É±€K|°ÂW%É.© œ†XÅnæmvó–T¤ׂô¥ÖuÍFG­ÀÛªðt“¿tþå‡=›ÆØ„ Ñ´õŽcؼ0[1Mž8NC'dØ^ª©å;±ŠÈ»åqnÆ‘#ö¼9§%N»ƒÉu¤«Í¥PМE脲oÈN£$žS4†àôõnN–Ÿ¿T¡4zÌ%K5Ê‹TÃtnÝæ®q#0I/­¯´’AH7û ’Ð'N5¢öVªšá°”fލÓxSÈs£ü!— fß=¤1#F¾T‹xW@µ×÷l ÅHzˆR€,i=¦‚EqÓâýê²…RŠÕú«aýØÜÀA‡„€H8(rB(OÉ,®˜å…yŒÂ” Û õ)œ˜_xñ@õK;€ÞÛ^…•-LaQru»@è#ôPH;&™ælƒ{•P¥­ž Ý)ÊPËŒžáš[Ne!$ò­D:]é´y¼o¤“ΰ×VI­Þ³rœG‹ò%!üD<Ï­+¬}Á'{5ð–#]ø%Êk9IÂ’^ØéSO„W)¦JûÆ8%à'"Ðóäj!à²$¸9}ó\èÆ•ˆOÎ-Ñññž˜W0ãÃ8R¹³ @Ó@¦ ôk¹P=è s+FV}÷cH$6¼Æ£’27–ãä“ÜP^0źd¼rRîE©‹Ì˜pAm“¥¡Ü0Ê ˆâšs [>ŸE­š3ö¶Ñ£‘”½vY¤Ã.ÁZ¢¨ºRñ³gšp%¶ñª­ÃŒcY?½¹µ¿ø\Y'ž•ë‰_~ƒH.D¡ÄîÍÂÛËB—ø²RF-S˜RM<éh¤Ú“kx!A©FƒEJmBÕ:\W+ÃõßJ^¸k&u ÖCXÛHBíT —â«0µ䊕ÐdWZ(P‡ëyJ…>¬³)R‡_EØÇ×”¸Ó^8Ãïx¬â²[ëÝ+…õ¯¶ÇÔâ.¥³•,KÊ­;ªª5!܃R’ôbNÒàÈÅjÈ©x ã€R·Ÿ°Ç§]ÆU$ñJ j(ÃK×ù¤Øj¿¥*ò®¢¿2ò¨jà7mµjm…mÜ+ÓIºx +áD²f„O°d`íPTÃ휫é+ã†u‰êþ þV»‹§¿Ô ÉRyÁÓšq„k¾@äÛ¯tûS½¶¤rÆóÒ`f6ñ¶…›ñíµs%vÑE‘Îk.;s§Ð3œ¨EWÕij!˜i‹— Q›I)eŽÃÐY g |Iyfûøë!µô7ÑßT†ÛþÝB<âNÀ5aÀ£a2;îƒ)Ž)ÑŒØ&@€1‡ÓRó«×Ù3€Îã#Yçúàц8Ò R$V0¸Ï‡Íך;¤ÃæwÁ9eñ†ùÃðÜ`¨5Þ^QeÖ2Y{}ÿNx¡–^k¿ó-ízÕóæoðý[ endstream endobj 7197 0 obj 3201 endobj 7201 0 obj [435 /XYZ 37.5000000 662 0] endobj 7202 0 obj [435 /XYZ 38.2500000 678.500000 0] endobj 7203 0 obj [435 /XYZ 38.2500000 678.500000 0] endobj 7204 0 obj [435 /XYZ 37.5000000 662 0] endobj 7205 0 obj << /Type /Annot /Subtype /Link /Rect [363.750000 197 414.750000 203.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_features >> endobj 7200 0 obj << /Type /Page /Parent 2 0 R /Contents 7206 0 R /Resources 7208 0 R /Annots 7209 0 R /MediaBox [0 0 595 842] >> endobj 7208 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F8 8 0 R /F9 9 0 R >> /XObject << >> >> endobj 7209 0 obj [ 7205 0 R ] endobj 7206 0 obj << /Length 7207 0 R /Filter /FlateDecode >> stream xœí]Koä6¾÷¯ÐyÑðMXðØžö°€a{r&›,‚L°Nùû«nQínI¥®¡(¶›1wºL²ÞU"KÅÿxþ±úåÏêãýóÿª/þ÷ýóŽÕV³îŸjÿóáô ÑÔþse]}ùº{­^wO»§ö¿¯»nÀóý¿ÚOU¢úgûï¯Õ÷?´_þäÿhÿ_w–Ûö÷o‡ßÎòö;þÞÿßÝ¿ÿVý¾Ÿ±_Î#sþÿ”²Ccfé×]O&?üüùå÷ÝÇŽ—­Ò(e-«¸’ªâN‰êÿì~nè§gu£$—VhÕ~vFY¦›F´Ÿ­ôÿP·â°º±®…q£Å?q¦çñ'×LêÕ&ï0Î. Ï^;Å¹Ý ú[4«c·Ò3È®Áÿ·éW˜\ª'?`+^¸ÙW¶f-·ˆFë5dâÖ38#”[Q›ö˜GçJ/p<{Dk6Òzî ¶‚«~›~ áêf=kî0Î/ÜÀì+[³1òhÍf¶™çUûy×øóè\é>šýé’Y0*Ý7 §| üô²ûø™«V¹©^~n‘;¬Ùýzi™¢«ûœ¢QÕËOÕß÷ßU/¿î\m„îQœ…pá B œ2Æ]Žû !Ÿ ä®c/ÇšAŽ28k<è0x|iÕqmMj„H¬I Ó y…Ç0 K‹š$î.—½”ù&]B­P<±V¼– ä|À†¡¾ÌÊ$ çÍ Â^ [„|>––HÈ×|¦$êôå~¾àVp+¸Ü n+ã–$æ8iRç?8—ÁùŽéQóµBÀ1 Rª „å©ÎFÑ1LOy¹ÓúôòæåΪy]¼¥¼\3.¾SuØÛl·¸a?”3ÖZjÎX èyrÆZQvj·ÇŽÉkËw6wSŽS˜ÎqÚ£ãì¶´9«u‡Î A<º¦½±ΆÇÖqp.dqY[ÞØSˆßˆç¼ÖNžA8ƒ‡0àò›ZòNVoÇàuðlƒ(<"‹–BBÕ| { j ¦€=@ˆ§ÍÔcûùÞ x.´µì†,â.–¢D²ú­Œ#‘É,J¨ƒ@8—çæÛôéĶª•´vÀÙðÒ:wpŒƒcš#Û•Ù{¡¨\mGÇ Ä! ¼²èZІO)ØÔ¼ž-š² ”[±NYt¯,Ò"4dƒD{ë -0æ‰×?’Ë^º'NðÍ’I,\Ø@ˆ‚³Áu°&` $_N†þ)ÆS² ðo.ÏÑ“F¢?$æø –Pþ̱ %½$ Ç…à#gÌ7(aÁàQ©( Á‡R2áñ³Pªhùˆ„‡ÌE˃|ƒÞr /`4Áëø1i¬ÉÈbMK´r§XS¢±ÍÌI£ÿ(úåú¿}aEÿ5ÆêAJËŒËX»½el¯ÿ§ Èy€Ëˆñžáõá=ð(ð22.˜Æû¸\í.¡G|ЏRst øüzwñ$¿Aáh<_3Sà´oÀâI+§)ÉNSÊa1Ëè°8q­F,}À°PJÐ.\…‘òàM‰¾AéÙ w×ܳg*ñJ÷~¨VʦֱœÑryCuk­0fÞRoêÝUÍæßæM|hŠ=TލÔ}À²>˜,ž£Ó Ëç8çˆs‰=ÇmD™:ƒÉùH«ø!¯ºd0ޏÔŒfLB•ɳ‘Œ½@`ë¾ø‡N_tÉSi\b Êùð«ØI§ ›ï¥z[vÒ¨ùÌ"r)P9žìwrÓH8}¯üŒ=aÉ%æôÅ19+áÛò‘NÍgW¥(,‡âŽ”EaÎ&Ï0á集¶¥°¾`.ž°“ð‚Îû7å “©³E|n„wr))ëø1i8oSgq¸W¢Á°ç(Êk…+¹Ú9G¸L«áκ*‡“mÃMò<zâ9rñ¼)¹Í9G„HÛ`ÏA9ÙŽ—„‹Ôhzûî»p’úÞúsFf¦ö© TûÃêáÈb!4ÎÄï8Š1ÖÀ&¹•ÖLÛWã—þ†×Ñ16AïK&ÈgšKZô”3ˆÒ8—ÐÖ/JÃÄÈÁëï;åùöž.àg. ‡·¨©D †P^ÁÃneD …³„Ì‹Xoîm=JGÒ€!c^`Óv$]1¾9#†ñ ç„ÜgR‰`~Œ²åÏËÓ—(W$Ä5j‚‚•P¸Z(LtýÅ•?­Eݸ <ÌŒIÑÍ8nè <²DÛ^œÙ2“ìHZÜè;} "Æ€G{7fŽ…²oAzЉ²¸ýîÙÆ–éq&àƒ…<,|÷ Å ÇOö›H ‰BÐ%7Kžx¼ùVvª†?$¬£¶´¡ÜÖ4ÎÓâö:"ì‘nz Wƒ Hê¢DQ¹h´Ndµ²Ã˜ U ÍJpiS  †KB˘Tå).GR4H‘t}M~G|[#ܨ3Þ6¹ #ÅÞ ?ŒÖ£àăÒnû¨˜Ë¡ýÁO ŽŸ\÷Í"KåË-µqzh©þŠZU ¾øÁ’r|wJð³HÜfo”¬ž‚AŒ-ûцãì¦ÞÑ¿wZÃÇZ³þAö¦Þÿºãm~úÍo»ç@X'vp8WIÒ™¨†žz«c¥¸Þ6p €·$ðƒ&åù(î¾åòõ@ ‰º¡<‹}¥ÅÉ:÷h6<&ÕjΛ/Ûo[cùHÜ+s ™&Ø7ÕzžQùí_Evº×´ý[nK]_‡¶ßº»&Ì ÂÅ™„\|œFŠd.)Yz¯çÏ^äjÔ±—K¹È•¶'¯ö"W£Ž½iÊöoˆRÊö/~(÷Ó”)—ø.‚äÜø1¾Àp¤çSiÎZGÎÕ†OáöÙSŠjq}•*>N¢Í˜@ðp`Å9ÅÏÇøLˆ_DúÉþ*UáöŸ[ŒÏÝÉTžiÂ*€gÃ*à?.Yƒ%Ž%Ñ Ô& €¡†ËJë«wŒÀ®ã_뚃gë+âGL‘ØÁà1Ÿpø\ƒ!•^ã´ºŽj³–ÉÚûû3ã…^:`Öú4òÍE½êi÷"i/s endstream endobj 7207 0 obj 2802 endobj 7211 0 obj [436 /XYZ 38.2500000 91.2500000 0] endobj 7212 0 obj [436 /XYZ 38.2500000 91.2500000 0] endobj 7213 0 obj [436 /XYZ 37.5000000 485 0] endobj 7214 0 obj [436 /XYZ 37.5000000 485 0] endobj 7210 0 obj << /Type /Page /Parent 2 0 R /Contents 7215 0 R /Resources 7217 0 R /Annots 7218 0 R /MediaBox [0 0 595 842] >> endobj 7217 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F8 8 0 R /F9 9 0 R >> /XObject << >> >> endobj 7218 0 obj [ ] endobj 7215 0 obj << /Length 7216 0 R /Filter /FlateDecode >> stream xœí][oÛ6~÷¯Ðó€*$o†mÒØÃ€ ö0ìah× ÅZ,ëÃþþ$‹rlIeŸt«Ak× ¿så!E_ýx÷{õç×êêúîŸê}x½¾ÛˆÚÑÿ©ºŸWû(_‡÷•ó¦zÿyóP=ln7·í¿›¾ÃÝõÏí»ÿ*UýÔþýTýú[ûá‡ðKÝ/|Þ8éÚ׿·¯“í;±{í>ÿkóËwÕ—Žâ0\`æðÿ¯´"2¶ccaè‡Í0M¹ýùúþËæªà´Q¼¶NªJjÒ•l´ªþýcó±` /j¯I’SF·ï«0Þ«ö½£ð‡;¸SÝè–L%UÓrÒ~:|û“†¼LOÜéŽn&â=çÉQ‘deœzÝh)]'è§hVñ®Èeí#õ²µVå#¾å<5(A´˜xfSvNê2R”´ù ñ‚l>qo9OŽÊ oL=¡){á› Æä€ žC¶ÒSFÅé8O J-&žÙ”½2šI žÚŽ|‰ÑOl9OŽÊ ï õÛS¨`VúO@6ùéøæ~sõNjѪ¡­î?¶ÌmÇì_î[PLõªK!µ©î?Tß !õÕý§MS[es´h‰ZHm[ÞÞ·àeŸwëYúQÕ5â'Òç€çM¶¼†ÔÞAì[´.‡¯jñÎÁÃ>°…£‹ª ÆyÇž"§ Š"µTÝœ>NèS_çK[4´ÛiÑ[-ú‘†JÇNUPÞ+!Ÿ‹=97iš5v â¡qIuëÈ ôíNèfÕ¸CDür´KÛb°ŽXˆ/Ô¸HË×Ђ05íó&]9 Ke.Õ§œ7¾9©õêmñË?qjÜê‡v~ãVD+”*žõ4P+ mi¬/o bEk3BÄ•Î`pe׎p%JSÊqBŸ"È“,Yh· ¶Dü/ÃDAÍ&Zó‡"®tþ `.  Î[ËâZÍK´4­Ö¨:BÄ–ŽªØÒ8»8éâ @)½ʨP}šík߈-?ljÔ¦¦kMý‘ÏG  5܇5Î ìÓ >Ô›‚µm—tmã#µ!IvÖŒ¨ÝÀ–@M×jKl¯b {gg‡.{- öéUÂÔ¤¼ŠQ)`wÁçSF»}WOóxv™@ÙGúpÎ`j°zÑ>(áÈyX׸÷'4‡05Ì®=cÜð~äšÅÖ7n¸%r6 K›¡!œ='Ή|††Jum³ÛôåÔ«ÖeÖ—YIS~V" 9 d)5ø•Ê/“–EŠUu1׃± pV‰!™8j¹u5©Þ%ޕɱ Î!HBĺŒÍ´ä ÐéaU^ì„ce郳?¼ÎãdX8ÿd¬w"gž!5|&'‚ä ]^x„ŽY[ZÇ’®²$–~.ˮà ®~¨à³fÝmm‹tQgʼ¢'pÊš®*|Ë[YÚn Õ&.Ë¢½?"&^”E7Ò—¶h¨Ù%-º1Å#ñù+zeë[£÷"¾UÁ¶¾x¯Oöj¬vppYŽØfœÏ/Ø‹"ü0VdaM†KÓ,œœÉ%!!*áFRd•$9ED|ðõ’ž¤KrF™Sµœ’g! ||e•µ?©á]Îá§Âµñ¬ÞÞŽl­¬žr °`©µcxt=l‹¨ßìa/µ\–ðš±°2¼€&ÎäÌ8B/í2òë!°˜çY­‡À¶ó¹ðC`˾FQñ㺡|YÊ^™âWò=vDÜzåÎ!"$‹_¹ó6m=™#,àùoÚ–ÁÊ®×ç"¢EñësžÃƨ׺xD)›å–AÑ®QèsÄ׬|{›¾’ÍìžO_6~(ƒ…Ë ¤¨û½Ç=!hÔØ4µš\P©á>áv®¹> §Oܤš\ÆÒùîyˆ†÷.R°Oï6lM²—Õã8p¦á4ƒ«iR«/ô¤·rˆš!㙹µ$Rœg<¿œøyžçwõÆô¢¼%ùWƒ³yUèq¼µwÂÍ7BBEì­BšZŒ¬/œþÁ—§µöš'ȸ",ŒçxÃzÇåù ëøžXW0zHŒeÚiÏ09Kü(æ ߀7‹96û湑zÏ^Ø Ha?cf>„î3Ô2iìqË‹v–s‘Î WÕ±"wZℾ½ŸÜ'R/tê(Éç âi:"ÅQkNLgÝë†Å21¬gl ¬‹œpHÁ `çRàò'I£˱üØ~â£kœD¹ÐC߬ŒG´s–kn’;7‘{ßîÛþTÝWžÇìüvéŽp~ÎPk†Bvµ¬Jíî€×š‡5»›A¡W 5½>=¬Ùg.VG6Tm'5H Å|ƒÆ¡%G0ÇÛ»0St%^1ë±æÍ1;”' ;GÞ«”sfSƒ}‚BË“¦¾W§æ*\÷¾åx4ÄNÁ9aÀÔ° P•÷ÁÇ’ð#µ‰`¬aÆò…RÄú¢ÅŒAF8€ã_=×S»AIØÁà>ooayrL æ-Ô æœÄ ëþ†ˆÈwG`•Á߯±wÊšk³NPüýñB/1ë½o\ j·Õíæ»pë endstream endobj 7216 0 obj 2294 endobj 7220 0 obj [437 /XYZ 37.5000000 254 0] endobj 7221 0 obj [437 /XYZ 37.5000000 471.500000 0] endobj 7222 0 obj [437 /XYZ 38.2500000 168.500000 0] endobj 7223 0 obj [437 /XYZ 37.5000000 471.500000 0] endobj 7224 0 obj [437 /XYZ 37.5000000 254 0] endobj 7225 0 obj [437 /XYZ 38.2500000 168.500000 0] endobj 7226 0 obj << /Type /Annot /Subtype /Link /Rect [314.250000 723.500000 366 730.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_module_initialization >> endobj 7227 0 obj << /Type /Annot /Subtype /Link /Rect [209.250000 771.500000 219.750000 778.250000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://help.scilab.org/docs/5.5.2/en_US/tlist.html) >> >> endobj 7228 0 obj << /Type /Annot /Subtype /Link /Rect [163.500000 749.750000 180 756.500000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://help.scilab.org/docs/5.5.2/en_US/typeof.html) >> >> endobj 7229 0 obj << /Type /Annot /Subtype /Link /Rect [276.750000 749.750000 307.500000 756.500000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://help.scilab.org/docs/5.5.2/en_US/overloading.html) >> >> endobj 7219 0 obj << /Type /Page /Parent 2 0 R /Contents 7230 0 R /Resources 7232 0 R /Annots 7233 0 R /MediaBox [0 0 595 842] >> endobj 7232 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1409 1409 0 R /F8 8 0 R >> /XObject << >> >> endobj 7233 0 obj [ 7226 0 R 7227 0 R 7228 0 R 7229 0 R ] endobj 7230 0 obj << /Length 7231 0 R /Filter /FlateDecode >> stream xœí][¯ã¸ ~ϯÈsÍZ[2PØ3g¦@ f€>}(f»],vîCÿ~íXÎId²ÅPò%ÙÁΙDzLR$E‘¿ÿó§ÿýûñûwŸþsüâ~¾ût(N¦,ºÿŽíŸï®?öäþ}4¶<~ùzøvüvøxøØüýíÐÝðéÝ_›ýï(iþÿåø÷4þè¾Ô~áëÁÓüüõü³6¢ùWqùÙ~þóáo8þÖŽØ?ÎMæö÷ï´ÔJšvþvè_Sœÿüþå·Ã÷âžbµ­J}Z5ÕZÿû¯ÃOÍúá‹S­…0•6Å=2²}R-šAdݽ¨:ÿá^ð^ a“ ÞÍœ*BU"<úÉj%”‘4Œn™\Z+›åþ»“h¦g¸´)xb2\Õ&¡4—7Uã§f¸‘ŽhJªd» Ïϓ撮Ó1ü¨ºN¶.*yýU­ÎWôI«Î»ç¼¢ÑY£ç‰®]‘ü×¼aŽ˜¼o\à7ÆÏˆÙ…ƒòTÔê–Ù?ÀÑ^º{diÎ ÞŸ¯”'%­¸å`ÏÁJ$¼ÂÑ@õS¸‹¢²»"Dÿ 9œƒs+”'€A0‰RL‘Uȧ•"–&^®–ó5°T AÜsÃb é†ç¦ðò3,9ü¦ÝÜÞnì\Õ¸zžÂ³QÂ9¡úÒ—[ŠÑ <Ka8ƒ_/f‚IJCsŠÌ“”Ťc-‚Ÿ3PåoÞ+tüì럠ϰY ŒFpÁÜÀÔùÁ'ä|«Iq^¿,¦ûdþ{œè«“,e-bú¤9‰CœÐfÕv`³0=Xý ñ2[­È=4ì3`nâûoOÛФ´EnŸ^Àæ½€¥vO$qãáà aC0raM5µ:êç>ìemJ³7…!Bú È2œ€H±Ä/ü(† Xw*5qá‘ @ˆØ`BR̯'K ¬à>61æ—J¼1>0«Ã¡õ›®½V¦bp$æiaa­òí"A¾Fĺ¿"ÃÛËŠá˶s>O¹nÏÔŽ_¥×üzø”ýT­Â-u‰d„\\ã)Ãü-#ÅþÅαì3æ8ªÀ³'øòƒÄq”ùt…i’²‡u§‘¼½IWÊÈd9ëËÓ™òtÆÈ@aAûF×Lž€2yç›–Ûý$Æ,µ&ž‰´5þxûD^yÇÂJ¦5…é™7a-á«Yã¿Ú&3áð¾v26šAnd5)X¼šž9 ·¥áÝy%èÀk`¢PÜÈg {ÿî½­°Àæn1ßš qI6ñýr–¯l>¾5}úÕ1Â-‚­‹~ÞÚ’Ôˆ½Ò.1t$¸?)Xczåí÷èŠ|w÷Þ6ž:ª¦údªÒ›ë>? ©±E`5_ذï¸QB´”R‚+t8Z n±¼/DÐsÁÈì%1X¡ [Ö¾ñqSŸÎ³ÑrcWjxÅÂ+ÉCu­ýwK«¯­ÿL–} o=%aGx ÊhóKH.Ï€²‰óW)N8Z rc}No${ùc„mzØÙbÎëÛŸ»-D†Ð¤®_lH""¹¼é“•KŸ‰¤j;Šm,Œ{’Axã}{× ”•DqtH 'Y}\îÔE%¯‚œÚŸN§ :¤6£KAÕEyýÁ)¨í<:Rd(G©3¬Ù¤2ýLio¤¬ Lb¬òp¬²’¢&)'‰nXçWšå ÙlM×V•òu®ó8FÆ™ „*DJèôQ˜Öö-Õn´}K¾…µ½é#o3´= ð(-¤BDX+ H_síݬèìøQ2"iÞk $kcbl[¡µ¢pRÜÿ.NÖǪj˜7÷ü©:VålÙ}òåP铵l~»|KÝŒ¢®ŸÑ|¿û½¨ÛÛŽÞÝ…õŸÑ|ÒÜs;“ö[öf{ûŒŸ/H•³ÕñߊÅ÷îÙ±irÙVB„“äp¬¯æ‰ÅG4M™ÎÖxC<¤Š0±È~æ àPr0û)ðp4if{¬”Iæ OÊœ!igÛ5æóÞ3{¼>ðî‚2A€I^ßÞ6¤ìÁˆÓXV›±µÍ½q›û·U- ´®x/J<)[Ë–ÌR沪é‡é·m}€£.äõK8j{e£"jÁXÊ#ÃÖ^•Ó:k* %\Q™DBž‹8SÎtLP§”$RÖl JÄeùòœÝ¥&­°b;"ඃt„z´€Xóºí¼ù{¬ê`§¾”ƒªôÌåîb‡[*Ýý‰búx×–ÎóV¾ðôf¡Èê³,xÿn/.îbÇr”SÁㆠ¾} î‚û 7Ÿ`&±‡`Ø @ÀR˜4²ùÙèqÈ•I¸TÕÖVBJœ#X+õ4 ±=!´,#í(ÄÍUùühA«„B)uíIåNNTIŽW&¬ Ö-F’YÄÊâžÜ¸ÄA„Å«µ7`À)TLéä3??,[µµ}k4 P /ocô!årñ&¾¦Ý^$î¸HÁÏ x¼ù#¬^X®³‚xn¹$“ü)^!r í([{JT•N‰žß`D+Œ\ÑOG@ i¸^Úe¼wË«…÷Ìm:=šm?>ÓþÕZõ²‡±œ^á•({ʼ£I9•4vEÇß#á=Ž'q4Pä÷ÉÃá·B78õ’m>uûÜ$ =L@m'1â|o,‹X~)²èJ )hhQs  ®áU‡Gn"£¼ˆzZ~Ùö;3æSö`﹬5–+‰¥ó_š, óð}-°RñzÄ넲‚0EñÜàjX ¸î™yJÐ}žRì#~Ž‚£‘øó”€ìðúpžbXgÔѦš\© ð>°6±Ä÷`ÄÕ§¾Í¶f(úiÍ>ÁJÖf]®fmRö ÿ óëK¸j]’Â'u ßèÉ{ôQw¶ûÒÞˆNFÐÏä¸ 1xd™Úé0¶€K¬½Q('1yniÓ¿˜1N§ÎâpC(蘃[JŸÎõ®e¡nvÌúá+Ð3Ýt4zì ö§±†}7ìmÁÑþÑ*¼Y©EnIÂ{6ìÉñîh jxr pÌš°×uÚ*n„]#­€t Ì`+£š!ÿ¬+k‰éKØ@Ô^Á²¸Ggä–©§é‹%›- hž)=–…"J˜;fŠ-g@âà=Iby¨X–™µÀš#±Xg—ÐÒôŽQ¢WŠâH,¦–ì‡Âx¯µÔ¸ [NeôjÖÌš#¤Ëòq">©å%m!¾4¥±h¶€ÔÞÛgIÖz²õn¬+K›j”E‘3RX}~lto}¦sAXª_ ~ˆ(!“!ŠB€?™J~j]õ}¶šCŽã’Œ,^û»»UÇRLI€CžˆQ(¡bá‹êWYK¦ra_’³(pÏËñ±Âê?((7„®At.dç»ÙDc=£¸©‚KˆÚ Óƒ¥–9Óê^!RoþUÀ¾§Û,K&FÞpDòk—† ôInª0î«– ®9´"q¾OZŸSÚ.­ž§®¦‘ÕU ¡F’µ˜[ÕüAŠŸ0¯5Á}œ·˜éÌø²è/>Ä/'c £á{äÔžnì9?À{Ø"›ˆ„¶òHèB³c‰•rzwN ±´ãhåÈsÜé)&ÔØh®>·mUºâV/^!QÔ¹œ_EÌ }°Û…ßJ} %LŒ…8~à¶QÚnQÀ%sí(͵ 3!b€ß‡wß·¾”aL\+D‹göJ}Á11eŸ…2s„~î”4Ž%=ëBAª§4*´ò\½7z.38! :o/*%*Ávm “(PJ¬mªHíˆèo󓈊¼ˆcÔÅZN<\!Å6bÍHZ }ß‹%!&ZìRƯ\6æ›IÌu¢JRúáÖÅ1!I- ~gà¨_¡„îX)š-“§´—i.ÞièºóšÉùfkÇ:x4J*ñÞœXŠÕ¥tC#dTD¤9?ÞžøºÀûžžÈuUÜôD®+1Ò¹ùÔë‰|þÄë‰Ü}KÝŒ¢®Ÿáz"7¿ôDn>5þ3ŠAOäî[öf{û †žÈ´ñ®{Kó‚å­E•ú ¾ ™æ²*\l„KQ¥X|Å•8[¿òèNªÐ d”àÆ”’´a/æ\aÂY8¥§IŒ«qãÇ<(½Æ<^y§9Ð 6Mz6MÚ45°ijĦ©‹MS76Mz6MŽÚ49°irĦɋM“76MæµijE6 C¯`k‡k±–´\¦ò¨K²\§Â”z'–(É£iªô©ý¬8U¼AÞ§s0í¤;UæÒ`Å•ÑÏõ¿J NIÔÆa`•I[Æ-¥õÂÓyáÓ2Ê¥Ÿ¾Q÷Ó„(Ý%cÞ³ÔÙ¤4IÕ@X–Bª eR0hYš²ƒ2wNUNBʘÝTîä&½˜l§¦¦èqáž-Oi™]©‘–B?"×|IJYYK1;W.x„ûGàFÌBÆôÛT)}Før“Z÷ :ýž˜Á* 3ÍÆxù•ñ„› ­ÚÇ‚t5µÍ,—°nÜÖ·„scÖÿËBÏLZ ¼þX€ðöeN„§¼ló¢p«ˆáªq l©à ð·UÊÓ:w#Ÿ€·¹7M˜éH(—¥Z‡'P ™[b7ÙÏ §¬•˜–ÒÚººšnCÑ‘]{½IËGéìh(¶S‡‡Jñ8No¥ö”Ö‘yGÊF Ú7x$NA´#t õÅ`…†P¯PZ(ÎÝ|ç‚tè2ÿ0é®F×=ªY·¤À{â°YX¦(¬vÊ ÞM ó¾‘pDŠTK†¨žQÓTH«2˜MïU™ù\é„n0øR0J«’ùX®¤^º”–H””hÒ6>K”æö.;ˆ‹„ŠsCœÐ–¥o ŸÍo¹cÝx?AÀ’©åèš8:æ¼j>,åkY{(Le!Sº> endobj 7234 0 obj << /Type /Page /Parent 2 0 R /Contents 7238 0 R /Resources 7240 0 R /Annots 7241 0 R /MediaBox [0 0 595 842] >> endobj 7240 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 7241 0 obj [ 7237 0 R ] endobj 7238 0 obj << /Length 7239 0 R /Filter /FlateDecode >> stream xœí]ÍÛ¸¿û¯Ðy(üI (L’=d€=Ùn‹Í¢Ó=ô߯$K›Ò²ŸHJ¶5ƒÄÓ"ß7ßÿåë?‹ÿQ¼úúŸâ[÷úôõÀJ£Ùñ§h~ß~ lÙ½/ŒÕÅ·ï‡×âõð|x®ÿ=øúô·úÝÿ Qüµþ÷kñã?êê¾Ô|áûÁpS¿þÖ¾:Ãëwlxm>ÿåð÷Šß›ûá:`Îÿ~§„Î6`Ì ýzè§ÉÛß?¾ý~xDÀu£XÍ´« ®¤*¸S¢øï¿?×ôݳÒ)ÎM¥ [2ÍHJØ‚ W£]©Ñ@íoœîy‚Ϋz9“uÞB+\V<Ü{i•äÒ­š…nY[+ê÷Fv?ËæeëŽ[¤I–bÁ‡î¬ çÚ¤[ðòèXé÷‘›¹`®ãæZrÆÇÿÐ}ŠÅUN¦ë¼…<:VºÅ ôž˜›¹æ²ß&Ú†îS¬‰Ñ ©©…<:Vúǽ§^pËE‡4“moÝ'èÜÙ„·GÇJ¿à¸÷ˆâ[pÙ4Ò²ø(zë>þ…æ,]ç-äѱÒ-î¸÷çkzÁ ?ÃkàÁ/‡÷_¸j´JU¼ü\׎y|y©‘¢‹wý[£üå§âOŒÉO.^~=¸²ºñØÂj‘µ°×·H×¶|~©‘—|ÞÊö£~ð|ŠF±ÃdÞÉYY;&¶vhßÐ&Ú[ZÇZHß–çˆP{ÁWÙç¶E—RÔÒè¬ܽm[d©UÕ@tÒÛSÛ¢J%®÷Ð",já Âf`‹ô'¨P÷LC`+ÂÀÖÎãã<°Nx< Üž`TJ , ¦.…ZÔç7î»D>ò1_V¶q›ŒÜ-¾ËÒÖ‚ºªšÃy÷©.*=„ºO¾*Ur|ø–<ëEžŽQ¿û›7þÓl4FûŒIý-{Ö‹=ã—ÃÇI$ÛI$iç—é˜a£0&/L¬XÜ\!T0ô˜·ï^6>ePÖBV>9Zh¥TÐâ€-ü)“e#a‹JmcH!=hóØÂyO#o-&+Ÿ6`YBQŸ,†ÇIlàg$|3,^ < ‚Þ¦H>’„&fhÎc¨<‚…¹ ÛÜ’_LrcÕ@`¥\Ö^`Û±r¨¼fCꜨ¢„lcØÈR±IÇÃqïJ®ªZ¥s+BÇóS-øØòÄ£…òõ”޳d×I¯UP\kŠçéo)P¶ª ƒt¹G× kËL¼ðHW$g—Êúc’BPsÏ:n‰7í¸ñQú!¹ƒ#ü1)öYÜØq.þßœÏ}oѱ„tkõÍ.—ãÏbw¼ Ñ'QƒGYw…¦ÉÄu)‚é¯Ó Ðe4¯á‚µW½åwÕ±6ð0Æüœ¦Ê3o+@Jš]TÉÑ™À9pÅ™¸@ ܤ|¸·L’¸ºNÁØN€.1ýÙ*·iýÈëÁvú_Fÿ¤S9{;kõH:•3W-€”4»9ý˜о_6 yk}ذžÈióð!"—-¶³ï¤,‘ìIm„pø–sëÎq›§7²¤…Fª·íR±½LQ¤ºfëWÿ¥ìŽè!JbùÕ+<¯µÆ Ž–gôï_¦( ˜ò(3¾ÎJ‘Ê~Ý9IJ²#Þ6Äkµ½´ØÇ©¨šqg– ÕGwñ½ Þˆ¤àˆ¶v 6zÀK€Ïཎ@”ã{Ösóɳ–ͯ0Œ+¢/Q{£¬pà&håPçñ+¹=çõ)ŠƒQ=L=Œü_J>ޝá™â˜'æ{é%àcªÈ¹öÒÌÂÀ/…ëÁò.çÞ€Ô}Ì“róÇÑBd>ë¼ÚåÃÊÅåù—æT‘“O” äÃÍÞLÆ›[gí™héµóðÔnϹš<žéï6s5#ëªmçÄq]åΉ‹,o2W3 ³ ù+x—“²o¼ º¬†K÷œsš{¨œs^ ‘™^rå.ôëêr,n^@*nƒÆª ()“m…e~\iµi*ßJ¶ÝÚtirçmnÚ†Ëu«77B/î1ó6Ì·¹À2OŸÍeïÁ¤Tö%lšv[£Û¬bx“›Í7Zˆè2—Hù„‚-â‹R”¤Š+:‰R#çŠÛK!ÓPÒ@Iw”RØö$aéTìòQ(~™¼æ×Èkç ìN{pVV†_J‚ë +{®Ù8*—ÕL¸o_/Kµ…§†~;|½¨WT¥YYoºªWɎᨙ©ôÅZ†"ýoª–EÔJÌ‘gt·3%/Wjú®¿ïØÒó‘BItÅÝ“g`䧸{1e\]ùº›˜H(엣е¾i‘+Í%$L~ºSÆ›5EE±¾)ÅÀUô±öÅê„BÏ8aŽ“3/Úªì»ÚÛÏW¾. ïàÈ !ÓkëûжÊ}>vϧa7œOcmî¼…Í(ìX»'+X86_é±öHœZ)©ïäa*M!mòàWgß«½Éz ٴƪ9'¶àn²þxët Ƈ³«Çá¬<† GæåDKg¤ëRø±FÜ~¦sT§žqpœ£ä²@”Òf¤¬Ÿ‘‹"’VÓôQy-W}³ýRÅ{ÕÒ‚T¦š§Ö]Ûgs]gck I‚W£‰k²È)÷(RòWÜbÚ@^$,Er^Ž °W¸÷–ì›Ç¸Ïu;¥à|HÜÓôo+MÿqÒ(WgÇŒyœ‚Ùw{}[–;_4Ë vAã½¾-¿C>W #Ʀ¸¨¹oŠ]Ïùê¯f]­!; ó-–P8—‰Â zÉ—¡)„±³+´é½”»waÞnÆLf!Ü’êÈës4ÎùËE”º6zÙÀ|0ÅR¸–’#1JÈ"ô–‹Ó)PG]‰õL¾z¶BòE5{ ¥P\ýJò 0ÔX'SªyN6`«ÏÓrÀÆÀ¾Áò¤H»õ5˜&TÒÜg Ï`¼-y¤ƒÔóܵ%PÅŽp2"mÀãü+¼Âs ¦$ŠÍ…[0(ëZ<Ÿ¨<ƒ++ǵú(UqošÂ ¹ÖÚ5XSlseZÓMœ{R«ÙÙæÓ¢4Knõ˜F(Váê\µ7àUî^òVì,7N:òíè”ZJÊ(#Õ°¿œ ‹XsR°¸‰¸¤’K0’SÓ(åÎG]s¶è^vWQý[¼ÖázžûÂYv hÉeÉx“~Qˆá¶£í6•cqÄ£™Ød?R­(Åñ òHcWã– ¢¬FÇ­L%}BãȹãœS°}éfŠ2Pp€z‰A`y7õÑ;•‡ÏÔâ,‰ipÜ|¦Ë—àWMý¤h6•àš÷5ÄýBCÜ 8'L¸7LÒAbÇÏàÇ+a=² ,€OaÆë WÓkªœ`Èpœ.[hêÜ[n„‰ ~æc[åWFÀ-¶Î žo˜8ÌóÂ-’Rã4̈́ʳ†É²“÷gÌ ¥4fDyRegV©=χÿåœpd endstream endobj 7239 0 obj 3402 endobj 7243 0 obj [439 /XYZ 38.2500000 567.500000 0] endobj 7244 0 obj [439 /XYZ 38.2500000 124.250000 0] endobj 7245 0 obj [439 /XYZ 38.2500000 124.250000 0] endobj 7246 0 obj [439 /XYZ 38.2500000 567.500000 0] endobj 7247 0 obj << /Type /Annot /Subtype /Link /Rect [204.750000 680.750000 226.500000 687.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping_pointers >> endobj 7248 0 obj << /Type /Annot /Subtype /Link /Rect [85.5000000 101.750000 178.500000 108.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_overloaded_methods >> endobj 7249 0 obj << /Type /Annot /Subtype /Link /Rect [67.5000000 674 98.2500000 680.750000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://help.scilab.org/docs/5.5.2/en_US/overloading.html) >> >> endobj 7242 0 obj << /Type /Page /Parent 2 0 R /Contents 7250 0 R /Resources 7252 0 R /Annots 7253 0 R /MediaBox [0 0 595 842] >> endobj 7252 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1409 1409 0 R /F8 8 0 R >> /XObject << >> >> endobj 7253 0 obj [ 7247 0 R 7248 0 R 7249 0 R ] endobj 7250 0 obj << /Length 7251 0 R /Filter /FlateDecode >> stream xœí]Kä¶¾÷¯Ð9€µ|I¢€ ÀÎ>ä`0ä`ä¬ã†×ÈćüýèAõôPú(±š¤Ø=Ú…=³Íæ«Þ,V?üùéÅ¿~/>|zúOñÍüüôtbeS±ñOÑÿýáò¡Kó{ÑèªøöýôR¼œOÝÿ_Nc‡§Oí~û_!Š¿tÿýRüø÷îß̗ú/|?5¼é~þ:ülÞýÆÎ?ûÏÿ}úÛŠßú§éÌbÞþû%jQ·ý2V¦~9MÛäÃßß¿ývú0Ào]‰Jê‚+© Þ*Qü÷Ÿ§Ÿ» ¦áY©•䲕ê~okÕ°JkÑýÞHó‡:y#†ÙYpÑv¨`ílòáo˜áy„ÁÍã >¬<8T¸¬¹{ôØ×Õ„pÕDÛyø8‘¬mã!|Xyp¨LÇ£—­â¼é}($¹P%ç¢äzøŸ‡\]±xƒ+ƒ\Ç葹Y¶BŒ@ëWlçá# ®„Ž7ø¸òàP™ŽGÈÍJñITóºùuøÈ­e<Ý<®<8T rç£?úŒ‚—2~lÊGLJçÓ‡¯„©‹çŸ»• Ž?ž¿ŸT÷Þ èôËóOÅ»õÈ?Ï¿œtß<|ÀÅøA©[V‹jX°ùj[> -ªTr´ÖÏ-’Á>x8Ç£ikxx®ü'fÕÐ"ËŽTus-PZ8+ë†÷ý¶ØØÀs [àÖØÀ0‡ó൉¯›±á€’B-¢…£a<Ù¢¾ |yîö:^ãŠ!vkªÝjVOK·Û–úßl ·pÔbHy¡ÅÒÒh•ÿhBø÷Q ®í¶´p ûàµAˆâÑx ç-Ã÷ùB€(œGÂ>²MHå¢Ê†Ê%b*'R9”(*ǘ˄ʕʆÊ1äY²4lÁtÉtÉ0îáhs.)ÒÁÐXJªå°Â8Á”´*û’ì»aüŠ•’v‡åäyK@ºÂÚŒ–¾²M,¡°Lqhš¯„>X Â>X?)²Ë¡m³ÐM¥ê»[êÛ×:[ñji>)T9‚óÉðºµUK¾èoÀÞ ãDXê“¡Ceæ#Ã;÷U•²ê›á.¸™ï ?sÆH8Î=—Ø&³0"%Å‘H LŒ@Ÿ R†§¸u?TNÃmX¾-A}Â>D…Á{ ?ã<ŒHO}bWú A.UŸÝ˜ðmº…{è–†[ÊÅØÿKîûüùþ¬…GHñ9¤ú ûUý¥UñýTIvùÁ¯§§ä×VýÞ"&hÞŠÀl ª6(e«w Ž%(†?0Â^ó9DÄG[Kã¯b5€…=6¦@Ðl$]9ÙbÙ1Èv£Í1¤%¼/R¥ÜÇ9¨ 7 •áy‚ á05I*çBmÇÑ mÕXzï@r‰C‘d×±¸ñÄ›p4‡@ ðÿ~½÷à‹ dî´ÅpÐ~X>¯ÉÍ›²³x÷¤˜,o!G‰Âx€¸Ã„† úUÃc—ã-gÊ‚®c×ì@Ä”„'¦0+Akä­Ÿ‘{¨ @“æŒÜi’Ëö8#÷K°ø¤"H¬#°$#¨îT‡=<ƒx)öqX›n¦u=4ƒ(QÎ$÷cX˜'ÓÇ}³Fq¯i•²~â›È˜–B+leýªÚÚž3· e³Ö©˜9$=[(eŽ6܇°GÀ#E€Åô9PöC RHÄײÔAÏ©ZØgÈ3Œá°”)ÓK…Cý`‹ƒ7qJÐ3a!Za¸AXcèR2–5ó¦Þ°!\ì ™öðƒa}›øÉ",³©ÓA‘ØJ¡œ·l¦Áp-²Á0–±8ÕdoÂx S½é  ‚|ÉDVhž˜’ç™ ézaSâr>ke“®—‚be?o Ë"aJ29¥Tà“J*¬ªtrH²&¹×éH%I—J’@×é‚·K&Ÿ­är"0>"‘³²—c›2 -æÊ¢*E=6½‚ކû˜cÏRŸÎ3¢ŠËr e¹mœ‡ó’µrc‹c [Ø4Zef‚‚Z„Ž!ñ¦” ¨iãÂðs€xÕ˜°‡ƒrc–³ÎÉÜ?]WõÛY÷ÖgíùYºŒ½/ÙÄãùñÉá}ygÞ—†ËÀcJïKs~•=kï Á.X×a@BÉÞTü Èç,q³ö¤¤¢¤°Z'Õª)ŽÝ!z»ÞЦÙ@ˇ·âðV­®Ã[ñ®¼„=Iþ…´Ö˜¶ú ݾugm¢ÅäûvdÀ¤ª¨ õ9ŒRQg{¤ ­Ä¸¶ ®Ž€âQâ(UÅŽTBÄ@KäÒ&kõ‚r¹ýŽÈýÂd­¾îšR;„ôvPŸÚ#ñ?UY§ EÃnÅ ž•Ei÷R)…tê³ÂÞBïȳr­€’g%ƒùqaa[7­£?Õ¥ž_d۞׊蓼QS+{oï½Â(‰C-lúˆ\ 5¶‚û… üà÷a›m–[­Ö6]ŽÒÔŽÒ˜EH¹›mû²Ìãꦌ+HÁ¢å«ª3uó\ÏŽï n™yrSÅ÷«›š² \[MµcöCâÊ}¥%B„âíÀ·ÃXEçâóõ2! #åMWÛÊÄt™A%!çðÜÑEYÏÂÏ8lŸÑ> endobj 7261 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F8 8 0 R /F9 9 0 R >> /XObject << >> >> endobj 7262 0 obj [ ] endobj 7259 0 obj << /Length 7260 0 R /Filter /FlateDecode >> stream xœí]KoãȾëWð`4ýn˜±gäÀ99³» ÙEœ=äï‡[”Mê+’¥b«%ËÆŽ½¢Ù]]ïî®ÇÇ?}ûGõÏß«ßþS}O?¾mÔ6zÕ}U»ï¯?0õ6ý^ÅÚWßݼT/›§ÍSûï˦{áÛÃ_ÚßþW™êÏí¿Tû{ûáévðë&êØþü÷þguû›êî>ÿ׿¯¨~Ûx˜.óöÿ?8S;0&¦~Ù–©÷ß¿ÿmó±CÀ²Yjï\­*í¬«tãLõߟ6?·†WÛÆiƒ‹êœ‰¢ÙϤm¥MÓ¢]7£‰öß2ÃëV¯7ørq¬h4=ú¶vVÛh¼ÛzGd_צý=Úôu.ÒL‡4«Ü*41ëѤ±~Mnj!ÇÊàxtAiöʪAN×ò(:¿þ[™ˆë ¾‡\+‰¸Äè+Ks+MRßjõ}~ šDµ"Á÷‹cå@p<º¤4GŸ°ßø5ÐïW¤mí׳ûäÒH9.HÙ LR¤¦^´ÇáWÀ~ØÙ°ÕßC.Ž•D[bô•õt°>$¯«^AO‡_ƒ&Ñ­Hð=äâX9|4úÓ’Q0(Ý'`+øB¼øùyóñ«v­áСzþ¹n?g÷ã¹EН>ì¶«ž¬þ¨”­¨žÙ4Û`üÄî‰ú Ÿ4è‰Žð‰ƒ£=Â'_à“Op¼ 5\©óX GS艇ŒkŒƒAXN)§ F/¿ GÃ+Å<Š9¯ÇBØÔWIú`Å5>Ê0¤ÒÇb¨áÛÍóå¹U™kk;¯í4~±~*˜ÿ |ÇèåëÁÒ`9Õ5òå•JF“‘Ë­9Ì -jVxb?ëÝÇö1,|C€¹”QFÈ=†àâë¹û””Ü}Œ¤íÚ=àÝǘžÃFÈ £w¿$¯T]”_‚ŸælÏœ€e k,ÃØ—þËN`]¥áaÎ&ü¬ósrRí2sÖÄ;Ý…µ'öEœT²‹¹ÏàwŠà˨lf¾dYÛ‚ù²ä3\B+bMZ_:›/olß5g—j<|R¸åa¿ˆrRÉ– ë1‚—±¾ÄzÏSð~%M.#/Çé“‹X'1lò¤µÎ‚‘ZÇ3 %Ö€÷aXßeÔjµ wûx–}$´À»²µÏ~ÆQ°Ç\€}ÌtçÊ’ŒŒ¶®Žn’“Þ—­k´9RÂ_…\šÃÖÕ•nN-Ú„nѱ_tçîjµõ8G0z¢:ÇÑoMèÑG#Þù„ÞÁOÔêˆjüQ®Ôf¢®£Lz¢·¾±ñÍÒ,\´‚ïtº?l­îØã8DnÒ{qk5˜§Aï8H„ÜSPÃyØ¢äzˆw F“Å:ÅFx4Q¼YÌâ> pžG¸ÒLë! Æ|ýBÍ™s<~GK~Æ›€¢AfÈ©¢ñ-æÞºDnëlLGªz[Äâ¾sdÞ¨-{pþlziÆbž€`³ =qAì´‘‹wj¥J­8R=üS ýpT`£€X(-Y•ïPp1ú¾›|¡[=›*ÉäΡJòLO°’fàÞYÈ( ª`ÑP æ2Ìï˜ú_’†µ¦Ög¯†!0µ$ÔÄ;o#Å!J~‚Èx+‹_‡­hï¼ÑƒGÀ‰QŸàÑF¨s_²m3½ ‡+a /ˆÃ@xPƒñ‰ÃÙ Åòƒk²PX+=I጑^› Œ«3|Ôù:üH“3xÑ2Y¡Ï˜1 \A‡øò§cå<Üg›iixÌOŒ“ð°($:‹ç‹Ð6Fû3ôaDœ-¼P"‚x±î*!ðÝë&µ’ljqe‚iŸï’ÃNº¡,B¢ö€X)¾fÄ8à¤Pp.z08½;Óz,¦iF»eâ9×S¹xŒÀ|¾Kwoý–B†ÇšÞº|&†k(Æ. ‡la³™¬2N/ÂA0ÍÁÑ)Ê]çÎóÃGx‡iêI2œ$TZÅýáX7ËHWÁºS6@Ba©‡Oðh†?eÛ[às0䄱ƒå”c18Öï ĉgØP×'/¾J¤‘\܆z¬î6ônC3ÚP|zk–ònC™6”ªŒµË”=\6C#å¼Í²¡?/7v—H+¾¸ÝÍe]ïvWÝíîÝîÞíîv—°x=œØœö°Ó«»1{èàYTÉöÐAŒº©tã»=¼ÛCA~É^˜¯Óº ÛCN™FÖžK=G0â2,NÆVœSÖ®Îg]éËágˆ›HÅq}=áTœŽpZ3Sv–ߪan† ÏG&é°Â×aVAbe¹+œÈ} Î’Xრ†#÷ES 8É+Dp?NÊY€.œKÂÉLYš…‡ÇÔÈ•x…E!%’ŽséˆÑDÉ„ÅtAØ#C§`}Ç9Gr`q1œ˜H:ÃI(8rJm¯™”£ôÐôatc©^W…v KÄÊH›¯á0o,Éà†K*”-YD°Cº sÆÑ59ŸEsæ›Jd+$ĉ¬+¸”h®xîŒe|Ú¯ì…< ޼ËC“¾ÝŠÉx.}l{pkœÀ‰‚*ƒŽ÷srB0ñF9s/_'¸p NÈÞ`¡ä©B8áØª@Œ&Î1cŸ‚Kìvñæ6½c[§9ï06IJå1ˆ $Ðó'öEÃ4œs+¢ céÄvh´95â@2Nì¨E‹£°N—ñFƒƉÓÅŠ(È9Ëë/9ã¨Jœ,m1R>ÍÇT]Dé,ÆQ ë¢jB|°"%qÔ–hŽÎœª¶æ1¦öˇ‘Jà£Àާ¤˜‘1ë}Ϲ¦»C·Øô\/žššÍµÆ[e×Z÷µÖ™©…“ ²Q‹“f]µ¬ÊL­¶­…vØ›Ø@Öµ;å‰ $᫊^*­|¿ÍÙÕܪA„9pvþ6¸Îžh-ß’«Æf»– žáàm~È ØùEi9GB“[Êu-¾³~hGø&MsÜN‚%‡'Øz. `”57oïr0¸¯‡ žÙ£\Q(‚µ³…¢h{½àè„cÀ¯©F=%|o‚½Á»¥-ÅÒÖá:,mÝÌ·´œÃg{ÊñT…;|ptÞgÍ¿2$0ËØ@à«Vƒ †ÔsZ—Ü·qgy\ùoÞ¡ZŒœuº6Q•zÉþ C]i±ÔCº/£oÌ!^¬è¾Œp4ÜÊ­cLm·ÝøÕzâÁÁ&?â'Ä<Œö‰‰t8Pþéßa;;ØžhZÇií˜ë°¿ } ®Èq…lº¶G¹Wî,…ÀA¸‹oó}h޳v[§HôFÇ.:‡Ý¦»ÿqöI™°d7%2çA² î£=,êœ-^†èvo3±f™ÚÄ\µ®*cYÎ-žòMšC<_*•¶(§<[äã(Z\4ŠN6–cÙ«üË Ž,FGÂ&Z „eÑ8‘Œþ™,ÛÃ1¡å¥Èž ²ü ŽÇ;?$WæÎÍy“bÚõÀ–xªÉàN!Dww¬X˜sFƺ—ƒÁÆ-09í@D[öÑS°­(…Ѹ¡Ê–æâl(%NEdœV‘ò>ØM_P§Š±Í–·˜ålE!hÔp;F`Æ¥ ëcÝf÷¼ÇS·÷ùR±‚ê{¹F  Fßq\o|²Ïü²´\­'¬0B9F8ceõ ú®Wí|œJÔÁ56 î‘íp’"N:cTÔ¾NU‰Þ p=žT;&‹ÞÐzƺquk,›¸k'£Š6‘|È€Õ €aµ8ëÉØó>è¾³2'í“£áXr0µ0…9]ò¥ïÝ÷ã”Å<Ö«œô]V%|ì+ây ™•&}¯6ai`xµ„Vƒµ»8rRæû®@¬ôó«´8e]V¶8šPVç½n;4aÿ°`Œb]ÎÁ(Ñ åÝ`kbF1Î胕Eßå'áîôwq{&[u›ÐOŒ^Q%{`²x#´o7ÆU„FÉ虾‹«¿­X4Û H};ë¥1W÷%´nójx‘«Ý1تí忟ý 6V¯L†·zkàÚ⹊škûF¾²¡<¹*]S„xΛb›¿ÇS*¸SÎÝî‘§[¢çD'Ω¾™UF²ý®^Z!$eôiêf¨æú”[m·Jïtpe 7§‚h:¸ã ¥Ù…ʘ­éRŒ_=év–aü$ùßfFyÖ)Zýˆæ±8ïÂö5­…á,wIA`IÇ£&!Àu‚p Û‰eh<|'™!½héñȶ\†ÛýÞB| 4ÄkÂ,€GÃ,`ÈìøLqL‰zÀ6†F00¦/¤"æ×´É;!pžÛyê<Ú#H‹ ~çs‚- à'¶äÀœRo˜4ÌìÆO–Zãu8Wf£²Û¤ïß/ÔÒ„þ~);iÔžª§Íÿ€c^ endstream endobj 7260 0 obj 3405 endobj 7264 0 obj [441 /XYZ 38.2500000 331.250000 0] endobj 7265 0 obj [441 /XYZ 38.2500000 644 0] endobj 7266 0 obj [441 /XYZ 38.2500000 331.250000 0] endobj 7267 0 obj [441 /XYZ 38.2500000 644 0] endobj 7268 0 obj << /Type /Annot /Subtype /Link /Rect [185.250000 651.500000 210.750000 658.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn30 >> endobj 7263 0 obj << /Type /Page /Parent 2 0 R /Contents 7269 0 R /Resources 7271 0 R /Annots 7272 0 R /MediaBox [0 0 595 842] >> endobj 7271 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 7272 0 obj [ 7268 0 R ] endobj 7269 0 obj << /Length 7270 0 R /Filter /FlateDecode >> stream xœí]Kä¶¾÷¯Ð9ÀjÅ—HA€ÙÝ>Ì99ë8aûà¿u‹êé¡ô•¤j’-u÷v§w8$‹õøX,’ÅþWñŸ?ŠÏÿ+¾ùïÏ»ª´¦êþû¯§?®ôŸ ëLñí×Ýkñº{Ú=µÿ¾îº Ïß·Ÿþ,dñ]û÷ç⇶?üÑÿÒþ~ÝYaÛ￾7V´Ÿªã÷ýÏÿ»ûÇ_Šßö-öÝybÞÿÿƒ–N ±'c¢ë×]?LqøúãÛo»–õâL­¥,„Vº–ÅïÿÞýÔvÐ7_•N+¡¬4ºýÜÔÚVÆ9Ù~¶Êÿávnå¾weêBȦ*”k¾â4/4nµN×øòè\ªtëe£…°{AŸ£YÝUu ÒÖ$`ѱùü·ºJ(ÜåÑ¹Ò ·žØš­–=ÓÚ¿ d"ÓÉÄÖB%Ô¦=åѹâN´Ñš­•ÎCu“ªßšOÀ'dºy £<:WzáâÖ[³¶é˜&ë$2é›OѸV ?P+^àÃÖŸ–´‚Ié~|ÊW¢âÃËîãW¡«–¬ºxù©%îÐg÷í¥eŠ)>ìIÕ–þXüµªäãߊ—ŸwMYKÓ“8Y"P‰Ð°D‡J*XGÃ~*HuÕÀK¾BªëåT H›x`PGÊà(¦­ú“ ó×é¤ýå¥5¯ä–a̤.W_º K›%RfäH£Î ”5:¬W6߸wŒ\Fû‘x<q1¯…½£ç„͘i-¿-ôlÝüÌè©!òäDÏZÞ=ÌU¡'¬Sa}aøžwŒœ´ }÷0ޏì¦YFZ™ÝÃÄÖ‰--.BÁ:ÄêøŽìç ÚXIKË‘ŠëªSq[¿W=¡J%h z@ÇWº¦:PÂ é« =V§¢.µê6C³«ƒ[Ó°5\§U];k†ê:RâÁÛÍÁ.»œ)x€˜)B Q ëÀ¡ŒdÐFŒ4d±¨ ±x°„¥Åx€x*æCd ‡çÒ-×b,<´1#¡™Æµ#ƒàpô€Ï§,»br‹È-\ÝW‡îýì×ñP y¸gÅv¿…S´¼qöô¿ìž“mâ@ñ´$âáÌx­ø‚aʘà=¶-ÎT‹¥­›1ŠÏ±ü%WˆfL¬²>HÕ‰£¿Ô¹¢*Mç¾½ŠF%~¦”µ [#ê|BuˆÖØšë•ÅŠ÷‘Þ3eÕ¨™%¸Øm똰5‰J*8¿(±¥¨„„u:³¨K%d ”6¢Ÿ\®º3º'óó‘ÌÎxÞ¼ƒ>j®¼ÁÍ(áx²„›…±ºY,üà¸sóx‚¤¸k<Ùr(`À-îa‰ó×I›ò÷1—àî'¥E«¿µ*dšéFMŽ.¡qˆ—ò¸c†9«‰Ù…iû² “4@,l€• ç9#t8ÑÅ]ŠÞ#¨;ç­$ô©9!"¬=xÍ®ÕrˆÀ­+sF ƒ€Ìâ»g&3n[ &–¡2>t?6ÀËsb02ÊÔ4ì/êZX›åZæw±Fì–c,w3÷20r‰ƒŠç‹NË„®{?ÁÖg—~f­°‚©•@¶(«¤-Í·3ÏlÔßH«‘x„³Õ1Ôâ¼1Ðe›U®8[_öU2ÄଚT4–U`œÁû4q£î¡Ú² b0¹rv±¡BçŽÆ-ý<ì\ F,xǶÉMb@al²6þq?¸µP] ÇÿffwÎÂŒðü1Vp–_ywæc'X0ÃâÇPw)_!Ô§('MÜ–ñD|¸Ïõ*ÜOÊø¦µ?"/ÕSlB~Ô2ÔlP0ë‰ÃTΔدà,iVÏaEA39)ñΑL,$š5}—†ÁB¨zºöjT³ü*¦$îDÌXt^Þ‰{ÀsÁFG÷9§ûXB†^ qætÁ¡ZÎQÄZÏ7‰ËkѦ³†¼¶EQºlÂ÷ÕJ8oÒǨtØgzNkÎgœHÃÔObaYÞÃÂ÷Ò%,QQïná›FñnIÂ%Œ1§ô— ò÷ñšzÆB.ðˆŒPÚX¦É÷þp†ÆT‚üÛp9$lÛÞ¶*Xv ÁyBûàxðBâ63îRMܑķ41¯ñíwLÖ8R“áÆå -—Õµj9CŽKøòsíÝšX·ÕW ¹)/éÒ`ú¼3À[í„¥GmãËàñø“žyøÛóÛàܘWض¢æ÷P0³ a©)¼»Ež'1žŒÂLŽ;.Ú` "t,_æ+”ž”еé"Æù5ÏN„÷ÀðûÎF´É¹›à¶3¨‰,ŽS‡!9bžÁ³(¶,Žî`ËbhG> "<Ȥ! Ûî'£)¬¼¹¹àvÖdDûBQs­²rX_™¾;áh"#$GGÏ@»<ÈÕˆIz"—lÓâøÐj9;¬<§™¼¤ÉÌ™«ôí8‘ë5cM…-+—·œÑç’">Ý‘k È•imÊúâ~p~ZœÕ9.vfâÛ ag®UvNì”ͤLâ–°PÊž@!ÜÏÍìÄY­`.Èå½pbpÛäèÍÌ®ëØ–úœwOT´{3(­í9(e‘¿m®8§18±÷k›í3¯’׋î˜L™áI`ÌWÌg¼‘󀪦߯Ù&ЬÆNòÈQžsšc£r¼Â•­ÒÇ[ «ØVnúŒ}Nlצ÷ïr½²„wBñ»Sqcbœ—ãe¦k‹à—g9+e}Ñ—™fXFcVcŠ¡åËØ¦Æq\÷~ç>XçïÈÅC.8³p¤@´†i[¦Õ{C¹0m›šÄz)v›w¬8ȵ†—b­1Óg,oê¥Xkšs(]ëkÚô›P¶~{T}ÅoBùIx•oBùô[cï.ÁWœ¼a‰ºO‚ÐØËO ”|{Š à–LQ<Á”­ïÚgNcž*/0Î+‚óßäzÅ)r²£\häÊü:ȶÇyôj*s~«ÎzŽSßàdG12¥çz„`ׂ4s¹’É1ÞÃåä3Üh~Æ!O¥œO™ŠHÕÁD§ú-úq³‡ˆs§A3'^½‹›oK ou`íÄ“ð×ù@ÃÉØÈI,ÍÉq#Ÿ-1¯­Y­cLé,åe€;kJ¿=/áéG~X*nŠbþ gI_~2:˜&¯ä¹›(³Vjb<É£Ž1Šp¹ÎywÏ.\+~­ð1iþSÎéR¶:óÀÄÉêŒñ—pü¿¨®à=Ì+[ù\r-*…t\õhäça¯#[ü Ò«s\ût˜ÀȨDÝ]úé;Sð ±¹-™¤Óéò¥É¶¶ž‘Dùž&{Ãi²mÓLKøž<”Í_§ì4¯¢¦T&Ò)a]„àƒ3,«c"PdI†œ©§Ç͸¦@è ç˜8æ/Cö˜N:½È#šÐ>«&Ù³®[ÅÕ>ŽÕák°Œch¬CçS‡Yóȱ9ëºÕ=iïÐ8Ö èm®/ñH‰CÍœÃÜl7BåÖNrî)?4¯Ô9iWï(œ'rZƒ9'=e΋•;'¥'Á+‘_3`à/1ÆÚ‹CAÜÔýU× 67mò*:qÉ‹sa _Eç´ëdDB׺hç#á¥Ç ëuÑãúUHŽËùô–­Ç7ŠˆûœíJ|#a°á·8{Åøðë£~ÔÔÍØ1Ú¾ú‘¢ƒåc­ùàÖI$Vø¡èÕ vp`d·ëø…X4ô'“«pûÏ-Ž !ï$VÜVÕ@eÇu°Ä±$\ 6„B #ËJë«_¤$AìLJ¾ÆêàÖ>#ƒT`pO[f\Â%˜6?ÝŽäÖc丄Pˆ§ç5¸6k+Uz¼g¼¥ ü>‰MNjOÅÓîÿ ãˆü endstream endobj 7270 0 obj 3223 endobj 7274 0 obj [442 /XYZ 38.2500000 116 0] endobj 7275 0 obj [442 /XYZ 38.2500000 166.250000 0] endobj 7276 0 obj [442 /XYZ 38.2500000 638.750000 0] endobj 7277 0 obj [442 /XYZ 38.2500000 638.750000 0] endobj 7278 0 obj [442 /XYZ 38.2500000 166.250000 0] endobj 7279 0 obj [442 /XYZ 31.5000000 137 0] endobj 7280 0 obj [442 /XYZ 38.2500000 116 0] endobj 7281 0 obj [442 /XYZ 32.2500000 135.500000 0] endobj 7282 0 obj << /Type /Annot /Subtype /Link /Rect [69 646.250000 88.5000000 653 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nspace >> endobj 7283 0 obj << /Type /Annot /Subtype /Link /Rect [442.500000 180.500000 512.250000 187.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus >> endobj 7284 0 obj << /Type /Annot /Subtype /Link /Rect [215.250000 144.500000 225.750000 151.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_typemaps_stl >> endobj 7273 0 obj << /Type /Page /Parent 2 0 R /Contents 7285 0 R /Resources 7287 0 R /Annots 7288 0 R /MediaBox [0 0 595 842] >> endobj 7287 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 7288 0 obj [ 7282 0 R 7283 0 R 7284 0 R ] endobj 7285 0 obj << /Length 7286 0 R /Filter /FlateDecode >> stream xœí]Ko举÷¯Ð9Àôð%QlÏ8@6Ã"‡`6“ÅÂ^ÄÙCþ~ô Ô¥’ªIv·­1vÝ-Zd±Þ,‹ŸÿòôÏìßdŸžþ“}·¿žì¨sÖþËêŸOâ<ÚÏ™.óìûëá-{;|;|«þÿvh_xzø[õé™ÈþZý÷[öó?ª‡¿Ø?ªÿàõ ¹®~¿4¿æÕ'Öÿ®ŸÿzøûŸ²ßë»á,0ã0¼5 C¿ºiòæçï¿>·Ø6J™—²PW²úŸQ"ûï¿?ªºîÙ±T’K-rU}6…Ò,/«—+$Jû:¸õè\›Œ S‘¢à“Á›Ÿ0ÝÇè\Ɉ7Ç —U‡ÞÞFq®kBŸÃYAFXâ2ÿ]÷1ð¯«Çñ8§†<8V:ââÞC·”‚t ºß¹a1‰Û@+qqï‘UµaÂ"Íä1H""Ò›s‘™jÈC#Å’w›Ú¼Ðu÷©û‘:ÈK5ä±t·§÷€ºÛ(U¶’LE@Qß} üëœÇë¼<8V:ââÞcK³Ö<¢±t¡óŠï#r“æñŒµ§÷cYØð3qì2+ ÆE¥F/³™]θ)˜.ü<¹²?FÖ‹ÜöƒµZÔòROt_ê7^ºWëõïÁø¼fsS ?Çï—èœWXm©?µÇãúž7ûr!£cf4ðt˜Á“€¨q(ðÚ<ØŠšŒ 1Ï"Ì–ŸÀ=Õ ¥q˜Ñ/ §3É&2£ÄnsIè Ã[po\ÀÞZ¤pÙ½´b>ÂÀÞà8VÒÊ5è ¦Î0H¦‚N] À3ŽQf {#±Ìzòc™ð Rº<ÿTÉíú!.0“ Ø«Fkå1WE©G½å°e” ">é5¬ôH¬¾—¨Ѽ劻ö¢µ&XÆ–қ߯–$ë*l¿Ç|N Çœ‡ÅKE0"z<°B‡Žò:MÐ+î*tqÙ—…q"òµ®ñÁ¿l×¾JÛè"wˆJ±úXõ`N¿[­”°Ú÷Ø5¬}±ûšnE‘‹üvØy¦E• Ï à™Â¼šdxUEÀ¤¬ø‚â€áU8nI…“Pf ™˜ËÃbÑ.g¶É3¤°Ä'ë Çz¨…¹Â—ÿCAØ[ÒÐÑô§ œ”n޽,'ÐŽb<^nÁëOèaJÌI”Ãa¶÷¦“<^é¾6¸‚µžƧ…â‡RޏB¤q÷ß;»=OÒpÕÕQºÂˆË•àIP&Ãcò¹.q°}À~”ï†5-Öè¶EË3㟇”ŠKëÄ.´aó”PÂJµšgS©¬°i(¤´õÕSRJË[Øs˜vßÁ \™®öj*[¹;ëiÓP$W»~c$?'1‡Ô²'Žì‰#D_oOa{âÑjí‰#^¼Ýfâˆb{ö–ª(¡à|ç)2¥rÙ0mL(fêŠMÿÌíãm&n¨´†ÝPÎBïQbëo [ÜŽ‚ШÓhåÒ©¸[Þâ”Zqx—2ËrëÑEÙÚPi‘2cЏ¸#ò58„`Â$ÝþNJlŨ;¸MSQ •Rnt¥ô†³8)¸~W5Ê"ÚQSLìèµTþ •׸<×å“ä<ÉjˆÇ%ü…MD!ñEÐx¦­³¶°Ê¹Üöåü‚5 /<“_µþjÜ(2˜ è(z³­¯„•èl|ø"†ÓfÏ&ð^ÝþõêBJµö¢Üîq¿ðÁ‚“„–ÄqãªBæ.£Rv½ðÎÅmæÍá}ªèšÈœ»¹TÌ?ìé°§'H‡ê&A-¼ÃÕR±u[v6(òI•„/xW.'4U|.†§±Çç4Ï5ß™ƒO;¦*\ÃYèW©{ïg´“Y^JE(Ì·„‚b¤£ß”³íA] Ê!w’ƒ”{oRý_¬°æmÞ¦JºGšR:€P³ÎSÿë‚¶W'6†”w¸¼"¦x*^XUû|H>"Oûd]ùºr{3怮i 8Ͻó‰€ìÂHÒí ·xÔ6PØp¬_ §ò× ïµLË|Ê S5<¥Žu› ÇO^OMI…Õ08¬~ùª’˜Gè¡®±:#–eˆÀ–V&”ÃE—‹ÀO™Õ%7fJ¡ÕV²¨s8º!;mÚ–û°˜B-VÐò£˜Ô‚½yÞ¹ƒ°7{+;†mà7Ýim×:à¸Äª ÁAÁû\l3MÕ«j>JÒð?¥i=öRŽªP‹uºŠc1ñ¶ øŽAït^°:NÏ{›@ï08 å8ÁÑnÕ&p‹5s8`°7Øb“±¶áÎCÀ¿B\ãq Ø‚qCº4-äÎÍ¿!À¼Ãƒ¥^/,·yQ8‚f¹Íð™°Üö,vï:º‹jçÃ;u"BÍw‚S`ÕY:[Ö››GãàùtÂ<3NË`ú(—8‡+JEg?V¼ƒ¡ÆïHL9v‰Ïâ²tyέSý3Ü)²8·m¼‡!ðp ¦/ƒ½Á–pêh!<$ú#ê©ÂCÏ”²t$m[<•æ ›r”kÑo8‡½ûnrqv£)Ž|ˆÄ¡T÷]†Í$œ`–t¥Rج ¼LðšîïLµh÷lZãÍñÝ13"™t Ü~ó\² ì ›—àÂë–ºª§n ùÆMñ;B#ÎÅ-ÖÅA²¹Û$èÎÌL÷–c#——ÊÁ®G?@«¯´.Ó¶ksˆ›Ã;¾Å½E{ÑÏÂÖ „%/:fê]Ç8qg°-%zÉÅI@PÓË‘ëí’R£_GÙÓñø†ãRkº¸¼j&[ýdoÕ¬¼“þ¶ô+°RÎ^TWÙúJ Uà5¡÷¡^œ›kKX=3×ÖÇGÑÐ-­V*¦-Ö†‰iHÓÖ5™Ó~_Ð8rɃŸƒíÑÎtª¡6·Ü®N ±U=³°{½àïÌLƒãÞà;–mù¦©t •áêÏÄ¡!îœfÌ6˜d‡ïöùÔ‹_=Œ ÆÌÉéñ>0l˜ÐÕ°/cU¦Z3As‚wïÌáÔ%ä»nWm Yð;äãÞÊó¥L3y´z$nP@<-lh«–ìTöíðwöZG endstream endobj 7286 0 obj 4436 endobj 7290 0 obj [443 /XYZ 38.2500000 275.750000 0] endobj 7291 0 obj [443 /XYZ 38.2500000 579.500000 0] endobj 7292 0 obj [443 /XYZ 38.2500000 275.750000 0] endobj 7293 0 obj [443 /XYZ 38.2500000 579.500000 0] endobj 7294 0 obj << /Type /Annot /Subtype /Link /Rect [248.250000 516.500000 264.750000 523.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_typemaps_primitive_types >> endobj 7289 0 obj << /Type /Page /Parent 2 0 R /Contents 7295 0 R /Resources 7297 0 R /Annots 7298 0 R /MediaBox [0 0 595 842] >> endobj 7297 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1409 1409 0 R /F8 8 0 R >> /XObject << >> >> endobj 7298 0 obj [ 7294 0 R ] endobj 7295 0 obj << /Length 7296 0 R /Filter /FlateDecode >> stream xœí]ˮ丑ÝçWäÚ@g‹¤D‘À`€®ª®fa PxaÌbОøeLþ}ë}EJ‡J…‚”2S]°3Sº|x0 þ¯ÿ}ýß\þøõÿ®¿uŸ¿^²[Ydí×úßOãÒܺï×Ò×ß¾_~\\¾\¾TÿÿãÒøúñÕ·^åõ?«ÿýíúçÿªþ¥û£ú¾_JQVŸoͧ-Eõ->ëç½üé׿×5öÍuqÿ”«LªîÆBÓ?.ý0Eóï¿ýýòs ÀºVŒÎT¦¯"WùUØ\^ÿÿ.¿W ôÕ×E…ÕYirø}ܸ¬ë$Í—¡á aÊé“îWSæ­/\ãõû¨¢”En«æàw·CÂfmOª/}KN³çMwœšünÑqš´2zÀ‹ÿ÷æÉZ`Ú~LI¹‰`b¨¨!×èçˆoß.Æ‚¶2§žÄ’W!ܾ1®û]wA¶Ÿqàpšì›ª>™pþ>~±„F^[б¢A¥þpê¦èyÔ¡›Þ4·cǤh;ጻnjæAÓø¸$.è^Öe†áˆ¿_,ã$“Ü9RsãçÊeËæ·uþþ Ô³YŸH5ß'™·}>Õ¸/ÒýŸ¦~›µ¢‰KGÓøø8mú´Ü(W.õoå2k÷[»p ²©‡aª6êÆß¿(§s%Ù!iÉÚ²€58rÉá(Ÿ)BN«>!™„Ižó ê<·M¹7¯žÍJ&Ïç;/Ú6‡Ï|Ô·\4\š¶ý¶jeÃÃ<æŽRññhÚD´Ú(A Íç>N›>-7J–ƒKýÛº¼ÚýÖn'Ü‚lJÆa˜ª²— á‹C¦ù’씡¶,` N„\r8ÊgŠÓªOH&a*=ÿh)æÔyn›ro^=›•Œ‘n_ŒtÛœþn¼ùŒ„‡ÓfßVõÉ>þy¬e²„GÓD³’TvžR§Î1÷ú²õ^nÆŽ‰ÑvÂH¯±™®@of‘.ì^Öc æav”Ç2"¥ŒIx pŽšÜeLÓ9ã œ­g³R±À—b;ŸÁðéù3l_ ÂÇ3mÖÊ&6>.Meããã´éÓr£dÏGjr—WMï4®›’ˆ‘ØZÏÇb{GÂûàç`c™HlhËÖàDÈ%‡£|¦9­ú„d&ëù,ð¹XÏçb=Ÿƒeð¹ˆÌsºTú1·ÛÓß­ˆ·_"Aâ´:4V+n æñv÷š ±:@·Òd;§ƒ~ëû]lçuØ Œu¨ÑíGGÞìo̰N‰7PÓvõ"­×ioŽ,Mw/׊œqëC£¾‰ŒGWß,a4îÄ„²[÷[ÇP5¿=gLÿ@»ýp‹ò©ž†šýÛíÖêô§6³Ð1üÆ,`Ntï½Ä¨i»2Òj¾Wº3{ÿ¢F½‘îïØé|¦ÑF9E†È£‹«“¦›t«ÔÁi~ûayÅ—7î‡[”O 9§nCÑf£ojܹ²ü°è<И< ’GWÍ¡4nxBO.ÑÒ…/SÅ<¯ŽŸÛ¶à›_Óv½Sú®–R»ÍNw"_NÓŒ¨Œ›Zk4; ó »*f ]¨·U²tÑ‹T1Ï îsÝu§+ʧiÊÞï2}ÓÞÌOÈ7s‹„¿ßŠõ™ƒˆy¼]¥²Œ‹.¤ã¦²|ïžóÜxLÚ<°N‰7PÓvMc€ÓÅô¨÷/co‹tÇÆÈØ™F".®ú™b4nvBÒ­r6§ùm<®íh·nQ>½c<Ÿ‹\N£oŽ{e®,?,Æ÷ñ NÄÉ#‰«ŒæP*W´GO·'6•úÊËlËÞR^™-jÏS}¼¹˜èmþñT/"T®J¯ò¦ç쨥E¸ö›ÉU5²ŠÏkB×D.Œ‘Õ÷RuÿmÍv É¼ŒA‘&:ÉMuÏÙQé Žkç”æ²ì*ËĪ€¿, ¸MÏÙQé‰;©ýËšZpW‚™~ ~øvùùsÅpúúí÷«hsY´ß¾_*!ú©Îå ÕõÛ_®ÿVõÇüûõÛß.¦~Ý>(šêVäÚÔ0†7B·z36«H6z“•ðDoDË|lÞä·\µ8Þß(¯³ÒÂêaÃٯ͛_¿U”в¨ÌåÀ`!¨"Co|# "&DnLðÃ⦤÷Ö+À>9ªM~ŠMÅ^Tr³HÀNñŠ'^ï”9Å+Ä*x%œ£0_’0Í“q¬'ÇFâKñ•‘E"ŽÍEñ2Sųˆäˆf§H&›DŽ ¬9ÃÐR0h~‡œ¾ ƒ2Û2ƒèVlφúuæŒcË™>'‚ôÁ$ÐÞA‚ðt—‚uíbù2¬ût Z¼Î²âQ%°8W¯9y¹=å,0žç“ôüZá@^^ájÁâ%Ôú7Ü3sÝÅ€kÍ‘Ýt)êêÞßøÙ…|‹·D:-ž‚;‹^ILˆOP&I¥5«îžÍ!õ\G!©À ŠúTÔGSÔïòuhE­e¿Å. §† „$sø½í0k¶-’”‚Ô/5êžÔ¥AZsC\Ï*G@Þ*r}“ßÃwèÅÔpñ1s¿ÓybãécI˜Ê˜¥Y3ÖÊèE¯Å·¾7¦íç= D°†&˜æ#×Ò=Ñ»bŠ‚6õ}jeÞú¸~~WÍ›ìªuýQ Ñ>­F6œEËú'¿]t~ÂJcÄðWÊ©EÛ¨þ¾û­ëbW¯t¥1¼6ª'U·'õ_§ã¶ñס?D¢¿éè?(òìHË´8×u;DqÎ’S˜AvEžA]U ~¢¥’½5½q†÷½‘ðÒ°¶ÏèM|¥%¥õ¹–@T%üe%^"R\ÿXßO¦XI`uÀjPˆNNU_h›Ù@€+à°šÀÅ»Ä&H}|‚’¤Ô6aÞTû¶ð1§Ðy5¢)2ík‘¸ºû0ñT¯ÎK]¸µæ$Íã¾ 1‰{ÿ*œ=§>ø\†»„m"¬Hï7ÆKO6?RÀ¬)•ñEÓBsÃ@EBƒš5*º¡4¾ÚÉÕ‚^ˆ ¶Í½a{ðyÈ` ¹– s‹]É„7y±ßlhŒÏ$ “bùa%‡UÖâØÝmÜE¯ùº¹Ç_Ù’´8|³f~œ¬±);‹þ¤DšóRí—øâ½‘½ ¢ðÝB¯àV2›˜m«QÌï@ÃKKÛ˜¤Q“ÅIcuÿ¹;^u¾¨ÿbÎù”‚±»)€a ¨ÜOˆe“-Ÿc¢ 9,ž‹³4& Ū¢˜.»^”ð8VþBQŒêDW@s³jŒ€[79‘ñDüÂq7ŽËÜ›<¨“XË…”¯`,ãá±måTÞŽ\“ïožÅØØ_g$Sžâ•:2åžfçÐfÂ×}Ivb£Œefc£ì$6ÊÎÄFÙ!ª¯EÛb£Ìll”™ÄF™™Ø(3ÄF'6Ê$Œ²Þ&”(n™UŽan&læ5< lT°zeH²N`DÒÌ Çƒ÷ ×I¼Ì»:ë}Âöï8\UÎâ´â-dÿêlœuÇð€v¢I‹I\ÛDM"¾0J÷G °9}L¦§Éʧɬ穟øNŸæ¯”S‹·Ñ;}LVÌ8}L–OÚÈ'NŸæ¯ŒS‹qÛˆïô©ˆ³,„¼â©ÀšžW~»8 =YÄèëQ¸q÷;e©|ûx¿3/þ ,“Ã21zÑ@¨ï8ò0|ÒŒQI1ãò w?{ú!’Þº?WØšÀ —¾Ü<Ãëþe‰žxeWîlÊH™ê’ù»±ºÓÓºÛô™ìPïŽî +µ7'R\w”\©{êíLðè"B@(É»°WžŠd‹ÊDËgæ€gŠ$dXÅXóF™±Ä=’öRå÷ -8é(…Ípͦøg˜Œ’ˬN‰í'„òÎ=í¹'ÑåT!udï;=&)òÙXc}Oï×JV”eécx<ïeóëÙ€!KÑ}u¼³»åü:À9×ãy­ÛÄæ*ì¬ÜwËÈ÷ƒRŸ{ÚuðˆB9zÓñ~q“þ⹣Ъ2Ý çÊXT¦·çÔ­%ݨ¶öMySpñ 1ø€Þwya­è/VÆ> 7 %X·s@]w¿O Ð¥Tª€õ,ÜNä`±#{œRyLHüMðLI âYÖ¡¤à4IH´˜¨Ys°,ÊðÃ1 ‚ãEîÍs˜άggÖ3&U‡® Wü\­d^£Ü±"Œ‚cR>—ÑT?61'ÃXÚmŠÞ®ýi€¢4îß&¥¬ öÏ,É›Z>‹u!GqUâ2¤Ó€÷‡ÏS"û)çI9«8. ؉+ΘSÎ?pÜEÊ{2mÑcl'pÀ©ãÌN;9 €¬û[æ™{잢à0Gi8¯ˆ¬åÉèpÿ~WÀ ¹ÛºšõÎgèJÉ(ʼ‰º"¸=QZRL–îBŽu+FŠ=p¿ƒ‡¢+ysCÊ@á=}Ì#˹Õþ\HX¸BÝö24«LÂ)瀢¡¤óZáe\aÓÅW¶mÚvæI§Ê³t< —Æí]µ’Ö»Xµb…]×§éÀc:Ð_Ô61¹t—©Ž¦@x¨€´JÆ\C¿zæMw“rüS_´sè•ð™ûÈö[`¾!(Ð\&Þü5Ø[G9yCIz½t=ÏÏäË‚ƒ•/žmñÁ…Ï÷û©ô4¼;cÏ«%„Ì=‘.²º¿­7x°‘„M¡EƒgÕ"¸ŒÄ·üJÀ@íiÀÝAa­),à-ÝñáU·¯HX#‚¹s…+:ÇÑ\ßðm2r}ß0nXf2\›€¸±må.s’ÌòEN¢ðKàîBm$®€=Pâ›÷w )ŒæŒ– ¬ ±VÃD¡=”­·Cy5»„ºOa XGàK\ž©(:;!`rÈU9DGÁ^81Ö$ëö@a»S;¥®Ñb±?  n–‘„v$”tÅvMÑ41wXµø žð¨/\JÑŠi©ǰ™L¿°Ž´€eð›Ãk8k·HE+în3a€¥6Çö¶Ë±õM°±)ö)¥o‘²Ú%X§Þ@úP;àñl3¼Ò‡# ´ÃŠècZ»˜RÙÁ~ã$Ôo²`åk<ƒaHÐ̲€9>¡u©„Yä±€l²m“ÝÑSUîÑj±ì'MÙŸ|¸Y: ]ø ôÙ~9²ÏÏxî¬a ^ È e­„µ,ëì”C~Sl÷ŒÜ!3…X¤e]Iј óҞ 'œ«rÓ¯ÝNÝ÷¨ºïfa^¦x5(¶'û¼”¾1¯[ðzóÛêÿ"3‹›Lÿøòœ)œëe|Ï™áÐ3ÅfâÕ¾§½ÜIÓpMÀþú’Y±êØ£kE©S+>¸V$Y„‰ô%¯µúŒšTK¹HûÓó°·&5×:‹ÕLbŽ6Ç•6=EëÙ­=¡1@ŽÞt‹°â&ýc݉Uep²èp˜Ü‡£ÝKrš  {#n…½‚CË`™V–õM‰– ÞÛpˆV§—7Bîgj ´ǃkëvÙæÊÁÆF ŸJ9¨ÞƒOûßM9ÉÃ{r|’\’fûþ$##e÷çÚ-Ÿ8ïí kŽQ·“èØ&¾ô…rÜ5p…ÌC¢Ã“¯‚rb#ÿZµõaáMZÉ®ta=\À}ÅyÊ瘾22Ùéö²è=‰ÝZv…3Í91‰T2;úþk¥I× ’_’Úy€«·˜dðãM³À|]6%uÛî·VOg$MuµçžÉ )½ïÌçB£<)Ÿ KŽ9Þ¼GO’bSrÏó¤H1Ù™"e2Ù¬Ãàà)RŒ,—)|&¶ ã;„™d8$“²i‰·‹q¨$>,E9&iO8"‰û†ÀP¸" ©XºqßX¿¶±¾d=LÁì@ \H$ *2ÃÝõ‡ÉxºŽ&˜_𜶠ë<‚4FŠåìÀòŒƒ¤Žž@ÀAu¤4/#3 ¿I¨­ì€õ˜ m’b•oIþƒéÍ›ækŽ’- /Sf¼RÁo0Ö˜Ëñl@ Ö§$¶ÃòŒg7Ê:¯û IZžã)‘,Áê;fxüæLÅuèT\¼k¿×J«eËÔiµ°½Á›”ç´^¸uùi£œ6Ê1øúðö†Ý’œéÈZ•r.™ŽN%Ï„ñ` aÃqÀ¼,+Eðz¼ ‘?y™ÆË‹6z^Vz _¦K'³!‰äÿ¤ìn$ÚI¥È}R)óè-DïïfÞSÇö½ Ž÷ú»sxECâ_‚g‡”rwéðüºÚÒ&ðM#gjØ+9ðú&Àå0}EžŸmú1iʼK{äKYò*f­šÎ»+E±eölVdªÕ#æ—CD‚Éú2èôneXDZp³ÓÂ=-܇°p¹¸ ·ƒGŠ{@‰C§ã–F×H½ÜÓTW/Nœ{ˆ>§ÅäÑÓbÍ„^?&òÎm[W:Õ¿ëJµ5ÿ—¥?¸ã”¯™›”P·LÔ§y¯²÷îv¶ÙÜ1ë–KË™ƒ‹­÷EÞd“ cÊ zú¦³±åMOr¶=˜;Ñú µ£ð±ñ°oŸ»‘N4w‡Dçjë²ùf6>ý®§ìD§MÃ'Mg†!pm°L· «†^¾³-•áêïU{BCì$fÌ6˜Twû|ª*G„Æù¨0`Ø909q}Ƭ&0 ”À <.BÜMs„CWïº)`F)ÆËÀǵ™íRVfêÖihGÜ €,¾é檥yêúåò/~š2Ä endstream endobj 7296 0 obj 6184 endobj 7300 0 obj [444 /XYZ 38.2500000 545.750000 0] endobj 7301 0 obj [444 /XYZ 38.2500000 545.750000 0] endobj 7299 0 obj << /Type /Page /Parent 2 0 R /Contents 7302 0 R /Resources 7304 0 R /Annots 7305 0 R /MediaBox [0 0 595 842] >> endobj 7304 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 7305 0 obj [ ] endobj 7302 0 obj << /Length 7303 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯Ðy·E_‚öØC€ ääx³Y,²‹Lö¿uë1-RÕª¦ØRlìÎX"Y¯ŠEªøþO_ÿQüë÷âýÓ×ÿßÛŸO_åÑê²ùSœþ¾»¼ ݱý½°Nß=¼/‡çÃsýÿ—CóÂ×§¿Ô¿ý¯ÅŸëÿ~)þö÷úâíC§~=XaëŸÿ>ÿ¬¬¨+ûŸ§ë?þúCñÛ‰b×\Û™á¿ß)BªS7&š~9tÃç¿¿ÿíð¾aÀ¼Vœ‘R¹B(R…¨”,þûÏÃOuùòX)!¬Q¶¼¥!+ë–„µº²ªymmÐÐùoò"=q©µXŒxÓóä\dDœúÑÕO“•Z}²vNÖ¿[jÿÜÆ4SRÃ4iÌ2éÉ/!pgÜrÄÏ=OΕVàê ­YVUÕ0H/`̯Ô`?•zA¤8÷<5S:ÑBâ %Kºl±NÑ¢}%¿„h«ºË‹?÷<9WZÙF¨/ŒÓTéŽi5¥d¢—“‰*Ý‚@qîyr®t¨?Ï¡‚»Ò\ÁãKäÅßï¿UÖ5Å·ŸêÎÛl~|«™¢‹w§ˆÑÈâÛÅÊR¨?ß~9TÇ:@êº8u‡,º£à²‚ïà;‰ùÔðx¤dðÀÁ‘~†w¾@jM¯?«hqÙ;ѵú)_«$ªŽ òÞÁrP%¤ö4_–*Ô‘¾ƒ{u$òÎ'†Æá^3¸#9XAðì1¸¡Æèu„oø9¡†5ßÔ0ò“ÈM£'¶Zè'"†z™ 7ngÅ–ŽíKËTÂ;dغ<Ï6a¯ñÿp+±Va´ƒÔ0¯Ö7l§Xr¸Æ7ú£#|ãx俞ñç¹$ŒÛaE"pn’3Ê'knà¼ÀZŠï@?É#²O:“8>eô€Ókâð G»I{­á;øÎê1©Ò·XÆ&­ cÒš­‰Óëû[îõ#Z“*·5q"‰ûÏöðLöMÁ(’`¬(qô ©E²k¸œÈh“ycl9ã9E”Ùfrf‡•¾e=bG„Úƒàv`ß"Ö½·b+ú[Ý£U-û|*^YJÖÔU6q@õ0o>÷çÕ95Ê㎮*‡wZ3»Ó¨¯»æÑÆrÕQQ³Aðµa‡îˆR³ðù]Rˆ|»¤EG­Œ³"†ÑpÀ 8b¹Ôxn}$éĵBÀí`þ]/¸Öˆç5ì g!Ïå—º„…Qo¬׋4Bk ¦Ö„B¢<+Nä"ê ÆBÀúGPcÔç|Øi¨ËIèï#w3S¼ª“xŽWñÜÏ+N‘u˜[óZGœd¬Ê­Ë÷žL“p¯W¢cÕ2óO‰w1VõYó,{›¿V,3Žäƒ2ñWA|ÉÊ_}¦ÅH¼/ ËdÇ;Vf£Èý©)Ìœ§\æ[çrÛ ÎQï6³U›Qù4Ö•ÓûM"{o{.Y>YfäˆÊ½Ú=‰w ÆíŠÓvòpÐÒœ]•ý ›Œ(M*20À‘;m7õQúùË6g—ê ½ÓB€ÐÇ&CwÁv‰¨‰nÍ‘šW´G òn{ý{ 9*’¹¦‰Ts¥J5?å°Kéa;G(åâªò9•4Œó8CÎɪ·kÎW%íi>y¼ŽÐ.0^•ÇÅ ø 3œÅœŸž±îƒ—_0yÈ6¼VÄY¤‘1^isõÔ‰ÿ ÎFÚ¹^pmt/D§2×à+^¦ð"D0«}"åšZYÒU8Á›{­»q–E#P›VøbÕƒÈ:,ÄÜp‘±4'pÜaàpÖ+¸ ^ ü=-öHØ‹A˜d)S`GI×ò#ÈͰ0rVÝ#Êݰ]üñ/赪 ææ„‘x ‡±×G 3BR‘k÷SeûÏÛ?ÀÁsvi0¼+˜Ç‚a`A¤×Ë4+ܵ³©©i›»›5÷Qò ‘r¦pœýPÁìï`Â!0ÇÀ8ÃÈÅ”´V“–¸×˜; SˆL…0µž‰±5•³í÷ ãæ:*é¦òBøChÆ¢Èv8ü .Ë7M0ŠàÕ6Æ‹Á‹bTºn0²ÁÇÞAÊ”%igvšZ̶AýzaGº”i4ØY®…1­XA”ø[¼öÕg 8©­-í¯ÉÝgùâÃÕȱ0"v9]S²Q„^͸SµH!Ì©dñkÿo{t®,Œ9ý°B´W«Â辪y{åûÁ¨cý‹tNôOÑ€ ]¶Q?ßþ[ÏÏzo«  uzÇëIý”PqÃ6~>|üa¹hÒ5.]È>š\K‰©º@ž.Ш.P  4¢ Ôë t<] Q] @hD¨×èåÕÕé Ÿ$žö¤§G¥§éééé^zz =íIOJOÒÓ#ÒÓ½ôô@z:¯ôú²³‘YÞ.Žg>Œ¢Ò¦Òëé‚Õè‚ÑÛë‚è‚õtÁŽê‚ tÁŽè‚íuÁtÁæÕ'§q˜S8çK¦™¦Ýîhw¡%޳ñTÆž"³êÁ`é†|Ó¬äe® g?Ò¶Bdþî¦e„20ž[ýø26.Må9ci$²&ΙÎÃÉôŒG¶µ³¤íl!ÕÅR%oÑ]mùrv>aGƒsP7’MÏ¥rƒ@Nªj$“ZxAÖéŠÈŸ¢ºl£ 䤲#œTÆo£¾ârç§Ü€Š¶‘%;iÒZ)§šgÒJ®¸f³€Ô$¦´³E‘©<ž§‘£žFžFŽxÙ{yéiº6:O£Ä˜§QÂ÷4§+¾§9?åTܰ<žFnÁÓìsš5 óæRÁŠ%æõ&«¤åNÖx]ÛI½œÜcš§§ÖÜ¡ÕJLטÉÚŸjÚR"wè÷vvub+Žp”á¤f¼ƒ¿›ÂÇ?2ü–âøT8…åsUeõ…-PÕ~ƒÍDr>xw:?Û‡#êÂÎß0fç‰û­ûþ}ÃXÑö-¾“[&ØSÝ]&=Wз);[¼n½r™ºõ‘’¸oÒꙸÙ„Be'g”åÔñTIù‡ÛáffT¿dYNZјÓëF5ÏðĆE‰#r È3ªì¦­4;;ã8 ê0°%ÕñÈJèòòØ úß"<6¨¾JÃ#}ÎW¼cƒš§h@….Ûh RBUá±AõUç·Q_ñŽ jžr*nØF‚cƒâgÕmõY‡Lî§]½ª7®›Žëÿâ.ٌͨ‹¯c°\ñ©"áQ+I¸”¶²õ¦ŠIŠ€¦Cç29ûJ°Í޹d†ž+ u(iðÁ¡Æ 9âçä°oíœ&;5ÕÐÚ‘Søê«Òwu68…¯yŠTè²Þš‘Søê«Öoçð5O¹7l#ƒ;µ}¹‚´î4-ª¤8¿#‚ñœS&®:Ö!Sœ£—'¤á³Y8Ç3¤=[$ ‹ƒè¥³XNKj²lÒHy¦k‹pvDV¡2œaGÝœWu1êGüX%3¨Ìís9íÙ{XxÔ)NøjƒLáì¯ ØBž[c_42 ©ÁwZ…³†~±2ÎU¸Óïu;ACÞI8&¬Xm° PÇïæzþ‚Æ‘+l+'îA¤oXÐPÕVç1%2@†Ž †·AèØáÐ ê]ëF@)2øN„ù˜š»ÝÊlIÇ¡æ $rçb»Ý¤z.žÿ †‹ endstream endobj 7303 0 obj 4081 endobj 7307 0 obj [445 /XYZ 38.2500000 785 0] endobj 7308 0 obj [445 /XYZ 38.2500000 785 0] endobj 7309 0 obj << /Type /Annot /Subtype /Link /Rect [384.750000 487.250000 436.500000 494 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_module_initialization >> endobj 7306 0 obj << /Type /Page /Parent 2 0 R /Contents 7310 0 R /Resources 7312 0 R /Annots 7313 0 R /MediaBox [0 0 595 842] >> endobj 7312 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F8 8 0 R /F9 9 0 R /F1409 1409 0 R >> /XObject << >> >> endobj 7313 0 obj [ 7309 0 R ] endobj 7310 0 obj << /Length 7311 0 R /Filter /FlateDecode >> stream xœí]Kä¶¾÷¯ÐÙÀöŠoxÇ»r°Ør0rÖq ÃkdâCþ~¤–Z3"ùQR5ÉÖôô.왕ºù¨úX/²ŠïÿòåŸÍ¿ÿhÞ?|ùOóuüùðåÐj‡?Mÿ÷ÝËÜÇßcUóõÛá©y:|>|îþÿt¾ðåáoÝoÿkxó×î¿_›ÿÑ=üiüPÿoÃL÷ó·ÓOgX÷[;ýìŸÿrøûwÍï}‹çîÆÁÌÿýN ÞºÓ0º~:œ§ÉNÿøúûáý@€m½X-™k&…l˜“¼ùï¿?wœ›oN2f´4í%Þ÷d¸mïºS&èçô7Oë¬DãVl¼yn¢0¡Y²ñœœµÂŒäa²ž›/иSm¹ÆO#ÏN•3oq뙫c„sùIôÜ|ú+ÕºrŸFž*#s­­L®dÏèžÉÊZÞýnÄøçB¢qW’áSó%xâx9Q1Œ¼Ãqë9W³³£¸3<ÔöèoËISmÚ‚¢â4òìT937hýó–VðP†'ÀP|J|ñÃãáý§Î4pÍãÏÝÈN?¿¸nÞuú…·¶yü©ùSÛ²On=°n„š«a|Ã.ћ֜ި#×ëç7zûwý8ؾÃÚ0Û™ýÓ6¶ÆŽÊ 3ëGœÞ||ì8tq»Õ¬cÄ•í@\©Ç.Å0iw4Á¤‡©Ù£u­75ß<œÞÈ£ƒ££ ÈGÀÔö~˜=½G%µ·Uèha?Gö nÙ|l˜ð;b ]1 þ0adíECbÖ®RøQ û™-΃¼ :buÇã޽‘1xH1‰~¸ØÀ„Qvlê˜[HÙ¬LŒ ó–2ÜdòëfRBÈÀ€iyJ€‹)¨ù”`«U_ãP²a‹UR‚†‹¼&°·?¥(ú¨(9´V^¹Bâm%ɶÁ ”/EŠàæ(£à¯NʨáÚH¬u8ŸZR`Zë¦À’Ã$& ƒ‰ý°}É‘<#LH`ãÔx¬ŸÍ\å݈w”ðtðs(‚„#…­{ì&}X¿vÿß®’áLqQ3ÓœÒfK%·¬šÄ)VmᘦeubI ‰—–¾çH›V•ר=\’Ű)©˜5÷°C4 LãÀË ˆ‚𠬬ÁˆD?¾Ž¥˜&0F±²^—my&Ú‹ bŠ‘@0RCäQœlùDõê!|’§8‰@‡ÆÈ…£†ƒ »ëË˶(ÍÃïÈÏ2jÍ.2 ¥—¶ýY#Á]¿;Ý|;ÿ[´GkÛFëþ‡al|Ê­¦C•㓯-Œ9n-›>%f­ˆ—}tŸÿmû¯5Þ·¹ñûèžtß™¤ÿ”µbç}ürøðÝ…r›É‰n;Šn¡æpÇaû:ä^ä 3ð;rûGÀ4z3ª•M£n?À7¹Ð(=4ª(U€FA£šÐ¨fh”e2@£Œ QNh”34ʺhTûAcû ¾Á˜[udiY&Š, ËDe&d™²´‡,E–¥#ÈÒ²ô Yº.²Ì~…[ÃrNAÌq(ÍÆÖÊÛÿ’±³†‹ëçuÙ6D47u7ì=P¢z¸µ Ê{7RoÑH•² ïnåD„·”¬ý_xŸ>%f­ˆ—}œ…·."¼¥°~Ý_xŸ>eg­ØyU„·œ6§®/¼ñ°ðΦü¥öð££øÑ~t?zžáG{øQQü¨?*‚5áGÍð£ëâGï??lWä S;9#u‚‹šªå‹¡Ä×½Ÿ•W5‘öQ7Ä»k¾ Ä»qX‡b±I„‰õ-qÊ|üÁ´ÆÁm¨&Œr¾îæ­Ûkíì²+›¹«›™+Jðˆ¹¢„ôL‰þ‰o®œ>%f­ˆ—}œÍ%Úˆ¹Òç®y}tO|såô);kÅÎû¨b®(a–Mh,`3B`õ Œ—1„˰ <,¨(T€Á‚š° fXPT 2À‚Œ`ANÜW3,¨ºXP(æ!þÎÇâΊ2ÇM”ã&ฉpÜL73Žã&Êqp\G8®'›ÇM]Ž›3DZ ÏÊÇ™•ó¸ç¢Üs÷\„{nâž›qÏyÜsQîÙ€{6Â=;ñË͸çêrÏ™¹ZÝæ´=lwçXø>4›cA³4ó±Ð?ñ±pú”˜µ"^öqÆ‚f1,èÖÇBÿÄÇÂéSvÖŠ÷Q š™eÍ‹%ô’¼ÏÀWÏ>ÓQûLö™ŽØgz²ÏôÌ>Óž}¦£ö™ì3±ÏôdŸé™}¦ëÚgz²ÏF§d÷èR}[ȦøÅ1d£˜Ç¶b^â­9kΗf=1– dÞ`ÅOÅħ$)áñÝxÊ×ò%`M@ʆ“}‰,6Ê1DJ\.kæ)ýKAy ¥V˜,« ¬ÁÄv>žÏæ%W2 œi_¯UZd”4ºóðÙÛOëµ×ú°+%ï=ïþB­J’ybïs€¡Ò釨š @UXbÌâ³ó”LÊyž¼Åm(¶Ù º”ãÝ(ï P¤°ZRöEóÐ…ïLÞ-èWfA't_¶OPáÕ²ÙÌTUp  n Åu§TCª´Å\'ÉúŠ>N­^¤ÊDµj.ÜHÍìl@$A¶“Êçm°'òú’”¥@1¥‚²Pإê wPިĺ-©ù¬öU.Ð4¦x¨c땦M¨ËÁdüüªG(Uà:LT\À­åH7¦ˆÊ Ê—½.VbǪ́ZzÊ"$Öá­±D(ì'‘2EHÍb8¡oçS`ºácb8mŒU2§-+TGš —« &eÉ‘ Êý”l!§›»6ßï%Ó2;’7WÝ÷ZžÑnHIÕä´§›Hòk=Hµe)•êÄ’¤á›p±–°¾EtA:bÁÕ¡•óÇIˆž'”ew,ˆžci›Ã9«éY³ìæ$ÎëÄÒÄÙ@Ü>ÑG€]0ŠÓ”7E7áœ}¨ÈaëÇ“÷MÂɦœ%…Kà`)÷dÓØíQ0FXgEªSÅhP U ¼í¥v×¶0LÖ³ØcH%6WOÖ¸çKÑî²¦š¬‘„<Ž"™šo@r½NY³›\ÞýJ.>åKÕ:ëá,ŸO4²á•83Ž7)©YϨRî¿Ào˜öÅþ%`Êç-ZB d…éÊØ7d®n›²1ôºŠëã R.!»Ö%™Ï®`XïOp}èˆtjŸ~d¥d¾KË<]¸ÃãL7ýؾ¸0¯©r}ûãíe¡†¹?„Cõ‰cY÷‡H‹dƒ”“ƒ§¹¾—ÚA½ Ô»`ë”#[¯ò•ãèÇß½‹7í]LöC%Vz䜀#Æ+¬uíË'¿¾¬*ß’7ÏÊù,·ùìÑã©tÖmÈ\é•’$”õŒß†+Uk¥qu^Í9šÈ?´Þú;­Kg;ݺç“ù®n,x'·çß-Ù‘({]-!™0c7t›^sFŠê—Гª-ÜÂEÃkÆÓGoø~Þú¤lø«§•å¹›xC(ëMծ͛‘ž5ý{¦RÙ q)Á& Ó½2'[ÝK"îÏÞ)¨PužB•q†RŒÛ"yï/©–CgÏ)¯ÃE¨†ˆ…åT„e^kgélí{ÚêíšxÂzB/òûn!–,ÕÆœÇˆë‡é‚°Y½(³™ÊZä­nðšj mˆgR²)‰ÕÊRŽe¾Lm½æO€ŠÒñz]“¹ãZ8œµ¢ræl}Êw6\!½a³6«§Žý´ â‚eS¤´žœ¿ôV¦BêÈœ˜ çÖw!ón—rFrœóÌ[yzÃM±”â~y¶Ñòê‰Z9*¯@\SŠ–PàM*å$Ë®JÖÓËyêÄ+åØo"¼F©ž·ÞM‰ýÄ’j'§X+IæÎ£mKð¶‚þ»H¶¼¯_â5a£B«‡¢‰ë[WP®R¬«¼6w‹év·`H Åò#Ù‘5e¿Ä'ÂÜJ¬3Ly*r¹’oKYg/>ñ†`¿P"‹µ¼L¼šp 뜳Zʼnùà•)J‘5˜: íŠ×¦u¥™r¬)qÄœ0¶„¤Puø“HxÕcŠRÖžOE¿½?´^ßÏè/‘ޓߣôTÏê½Ä‚ýò öbo°U@‰SìØ½¯'Ý®ÀKV$%<,ç1·0b)^-$½Îˆ÷Þ±,le,3ÂÕH OKRlmf]3Z3ØS‘ãZ™Ú®õæÍH,I±îOø¢˜:˜ÛXÂaÍ@ðÇÇS™<[Š„åÆN$¶9ÛÕ×·cI~nEZ&+ÓêÖ¢ç‹1Ø:|âÊ'´Á®^´êPä9—¬’¶X£Áµ>fT¡ˆmÝ}­_´Ö%!þG±‹)Kôg*—4y\òå xß–ì²Z_0Ò[”]®­m§PÎQ¢‰”=¬{ÜèÚq£… I§Îª6‘™õ’®«ÕÍÌRŠ’Täå5QÛáå•ËG”*›HÛ¶T‚«¬’ëOÌÎņ„Q’}Œe?>kKËJa„?ë¼…¶6ÔèÃyìxW¿ `±RHIE§Ç<|!üÍgƒ’nÜ ÔÊ{ûP¢QáŠë•éBV Û¨Vý>ŠÝ–C°e±2/y­@Jv?NæÇR÷ƒñPyQ.bÈJɪ„º({%Ø5ï¶rÚ7y ×¼ÙÂÞ¼oÔòT)ëýÂIøz÷é֋–¾¶R8´ìEO÷«Û’k0¨’V¯nŠîhvì½nÊ-ÖMÑ­bË~3™ÆoªnŠn­[ä}ÅŒ6ÍÚióžõNÃbÞLKÈ…š(eÜ,£ôEŽG÷·yê:NŽëóÒVø'6‡Ç–õ·ñ4ü¼ß:Z™1å>pÅDÌ‹öüÈOvi¨Uuøf¤?Ž·üÂ~g¤±d°ÅÆöiœ)º—,•ÏCjá`Ù8õ`‚ã’À{„Ø¿ŠLƒáÖàwFK‘mšºy†-pýï݈ό†´ãpN6âLïáùË7Ìg4vŠ1`ǘx‰±aFC¨1 ë%1AÆa !6A8uq7Í¡”˜üN‚ø¸5{ù*3­8Žz¶ÜàI¼Q/uÕ’žj>þc‘Y& endstream endobj 7311 0 obj 4131 endobj 7315 0 obj [446 /XYZ 38.2500000 107.750000 0] endobj 7316 0 obj [446 /XYZ 38.2500000 158 0] endobj 7317 0 obj [446 /XYZ 32.2500000 225.500000 0] endobj 7318 0 obj [446 /XYZ 31.5000000 336.500000 0] endobj 7319 0 obj [446 /XYZ 32.2500000 335 0] endobj 7320 0 obj [446 /XYZ 31.5000000 227 0] endobj 7321 0 obj [446 /XYZ 38.2500000 158 0] endobj 7322 0 obj [446 /XYZ 38.2500000 107.750000 0] endobj 7314 0 obj << /Type /Page /Parent 2 0 R /Contents 7323 0 R /Resources 7325 0 R /Annots 7326 0 R /MediaBox [0 0 595 842] >> endobj 7325 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F8 8 0 R /F9 9 0 R /F1700 1700 0 R >> /XObject << >> >> endobj 7326 0 obj [ ] endobj 7323 0 obj << /Length 7324 0 R /Filter /FlateDecode >> stream xœí]Mܸ½÷¯Ðy·Åo °=v€ ‡ ‡À»›Å"^d²‡üý¨[R»[Ò£¤ê"EõÈÆîŒ[M‘,«^«ŠoÿüåŸÅ¿þ(Þ~øòŸâkûó×Cyt¦lþ§¿o®?þØþ^8oНß/ÅËáóásýÿ—CÓàˇ¿Ö¿ý¯Å_êÿ~+þþúßÚ/¾ðíà„«þûü³r¢þ­¼ü<}þëáo?¿ŸÞØu׿ößo´R¥µ§aLtýrè¦)ÎÿøúûámC€e½xk…’…ÐJ¢Ò²øïχ_êº×—ÇJ á¬vå=9Y÷d*_¿DV5­å°£ó_ž× þ—[WŠh/oFÎN¡¬¿ýèµÊI£O }Zd㽬wªýs'ÑdK4ã«k"ã­‰Se‘›N#g§J»à·ë§Íø;±o¦™Uµ(¾HÎjÎhÓ²š‹À —·Çà4Q´4#ç&JËhøå‘ùÌÓã³ÏKÞiT»/†ïŸo? }’¶xþ¥¦Ê¹ÏæÇs½¦xsÒµÖÏ?*KõéÇâù·Cu´ÒtClž”z"ù€žÈ÷ð ¤/îSQ—Ë×:@8ŸWàµO¹Â5Œ™Ï6é«¡Ìc¶Ô µÄÔÙäLñØ(’=åÎPÊv½b¯ÆSÂñ8Xï8[©pØGBñ4ñb–<¼ªR“ã¡øÞÁkù%°öx˜/ cÃ6Äë‘„‚2SØÉ:'xŽ#€3}=k*EzO‹Î·šR»i3CŽíg"túz?½V·öwÉÁ-9HŽš´3 ‡ä¼ N4Ë­aGÍê)Ýwp¼³þ¦x_ÖßY9Ÿ†¬Â˜åÁ6é†ýØŸÅK7úyOdfJ7­«7yv³ë‚ÐL“¡9µDñ\?ÎKiYi§×‘u…þ#,ûvÜ™5/§’5¤õ¡ÄAR(Jð'óîÒLñ©smý—P(ì[ÃóÁ'Óä‹%_ ¢ ÷“ˆw õÎUA-ãäÌ!s[î¶‘6“ãá}„”¿žàØ ¿àµ—´À‘Дp$i—³¿‡À½Î?áåÞGCv3fì[Ë^³X=9ž žì^f»ßw`ÖQXÌÙœ¹ï ïhœ¨É´És,!IÙ«ÛPyìçªìâš÷ý¼ïçíîg^e&{Sš}oî{sû{3‘¯"“]kÕôÞäµSyoöª[­:À»Ÿq k?Ç çm%»zV©eá<\â5¡ðØ”\NCy9ƒVk-°ï ‘W­ôMCãï))ã1—pÞÕnÙÎA¨©*R02AבP-–Pø¤jõÉøù$\.„™\­G”j¤Ž@N|Úž†ŠUjœ²ËÈÇ“‘¤èŒ„2RŠö(¢ScÂ;bÓPħF‹”Zú”èjJõŽý\?ݹ~À7“À—á ©Ç¶…çm¡.) ¢a=¡ŽJ«ÓýËß™_£'­¹gÖ4S˜Ó¦BmZŠêXùs£>³Ý5ú¾TÑ“V=µ±h%¤µPðI G€Û4‚Æu$˜ÕF¢Qã™â·µN#!缟0ÚÀZ–\Lt.¦¯.÷¼t2ÚõÓÞˆà¾*{Œ%á“FÖècCŒ¡fâh´õ7¬ÝÛ•ôâ–°Ÿ–¸‹žàQ·lÑ|Ú…?±D3ìïmìò~Ú…{ÒèÕ‘í¾Uh%±Ÿ1ØV²=Ñ(xHN÷ãûƒÅ«;ƯÇT¢ ·äÂmœù¾­ÍÏösÈE,‰‡° ðp‘á& ô3`øÕ'ìGü®æÜ -†*Þo¥ÖÒŸnœ.¾]þ]½/ kO?œͧJÖtWSwŸ|=X}¢’Þ‹Ë·ÔÍ[Ôuõ÷Û»S³¢×ZÚ~õ'u›Û‘œ¾åoÞâoûøõðþ‡HÊÒ7ÊR+ýZI§Àið"ˆ²Õ¸åÑ:q‹ š~„9–U´¾ƒokA˜ìÍF*ÑDY~Œ: EÛ…±~ðLñ¨ñÊQð+&ê# ÁášÐƘ¸ŠèÀ‚W0ÜOsèçLUtPŒ‚®—Ÿúâ°/)žÝ"Ú~Fšž>ÃFItSÐ6 4\mÁÓ ¨ÿñ3ÖÂØ“ÐÆ1 WínÑ«öcèµTYšrˆ^ͯvoQ×}\Ы¶cèU›~õ'ôzú–¿y‹¿í#z½#ïèuÅ}óšýE?ÅDAIqHˆJÑžÅ&˜$d•Êi²`Á6Å€›ñf Ð#8^c&-¤ˆ{m¤î)£À=š8oçRP²,`<ÎæŒ€·B(={:þá‘öwaî¿ûÊd ‹_±‡¾ÏˆnÆàÑ(zBašSfëwóÑö@Ïâ1\\¤ãZÊ~ZÝhàAΰP¦>à}¥,Ktw˜v¶§Î†äÈ&LK¬)°ËÒŸâ³§fyÆö÷ÃÅŸPF€C(F!l385, \ä@Ç p"á¬=•ª (ÅÁ ¬#ØÊ@O˜'Ûîs€²—€®¶+˜á via†¦¸´¡•ÝW¼¬âŽ1ñË‚Ö|Ë„×ÀBz.®/M Û“»‰«ËÇT)V÷çö4±O£Zª7 5o„É3œ"Jð• HF¬ÀìáÝ9[VÐV‘óëT_Llà’’ˆbÓ—}Ãà:|9Þ24ÑMÆ¥.l¼Õ^– þ*®¤™H ´ºË–eN ´° L°k+t7”°8Å'Ëá”8˜JHIñ“ð ži»-¤Δ’ WN°±Ñ„sÄ^ÊO¤rŽ èAä,ÅAZ›>– À gRUQ3œèñÆ›S¼?˜ø[ÆŸ\& %7fàÝÄ6 !*à§L}spÆL`*Ê’ ¾².®~-ò<èžúhW8v·¾×m«(ÇŽÍÒÃ@V˜Úmc. Íö;ˆI”‡Ã×ãi´ENcfh —}õˆÕØó·üúI˜~CW0ïÙžà@¾oSQÎg­!âàõÁÎ[?Z8çp€óÎç‡I's\çRel_2ãKï§J>EÔ •7³5é¬cokÙ+UЂ“Ý%OØ.'Y8üïVé;T'¥Í®#)GÊÛú©½ºÃ0ÕµÒã”T iå]ÔàmÓÓx9€œ{“í Š€¦AÖû(IG –ùÉêï¹çoé—* ëT»¦írý€¬'ØduåoG²ò¡ég£NUÕ•óÞÉT’³–Õ?Eq‹âRÌÈÚ#ihˆ`Ë‘4yF³méØŠå0¡vÑkYÞm˜í±Ä"ÆBaùj?ãXkUŸ/óÏ9|€(g«ÝqÊdùâFM¾¶óø.¤èZ«R¢omJÊ' —]ßó´Ób8y /l §é` ŽbõQN[0²Ø@©î ^YšE¾»õìJóõbÝÓp ñmoëƒËÉ{àâ1]¯HüÀ);à–<Þl^Ä´À%7ÅóAû£:„’©™ýržË=dk¥ºo‚”XžJD¦² òÏjЍamsÖµ†ÍÍ»ù.dáúØó¥ø*Û 5±Ëx™´åÍí\-׊¢—~@ŠÛ!Q…‡ fDNϬúâoOÊ]åAÄkDB” $Ñê·nùÒ\`#ÎÔNßÒæ&I ¸ïC¢„eÆ(§÷c±2L½!…ÉS¦AxeÕY.Ná…3”kÅ“y"âÖ0!á'pµó"¦ZRÆe}¶fRéûÊ1ãcÍdެ%WO§ì6Š”p?倫X¥8ÈoàHå­Ùàåս̊ËX| Ÿß>çh‡dQéóC FWZÙ3"ª2=ý¹~"ßÚQ Ë»Rw±†¥\M€òÛ|IÊ:%16QZO†'ðâ/˜Äó ¼‚¶Ú%Q6’(j°•ï/øü0 J ¯éË[œwÁÕ,¼~ŸŽ™TŽŠàb©È?> endobj 7339 0 obj << /Type /Annot /Subtype /Link /Rect [87 177.500000 161.250000 184.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn3 >> endobj 7340 0 obj << /Type /Annot /Subtype /Link /Rect [87 170.750000 163.500000 177.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn4 >> endobj 7341 0 obj << /Type /Annot /Subtype /Link /Rect [87 163.250000 120 170 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn5 >> endobj 7342 0 obj << /Type /Annot /Subtype /Link /Rect [87 156.500000 136.500000 163.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn6 >> endobj 7343 0 obj << /Type /Annot /Subtype /Link /Rect [87 149 167.250000 155.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn7 >> endobj 7344 0 obj << /Type /Annot /Subtype /Link /Rect [87 142.250000 165 149 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn8 >> endobj 7345 0 obj << /Type /Annot /Subtype /Link /Rect [87 134.750000 150.750000 141.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn9 >> endobj 7346 0 obj << /Type /Annot /Subtype /Link /Rect [87 128 138 134.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn10 >> endobj 7347 0 obj << /Type /Annot /Subtype /Link /Rect [60 120.500000 190.500000 127.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn11 >> endobj 7348 0 obj << /Type /Annot /Subtype /Link /Rect [87 113.750000 187.500000 120.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn12 >> endobj 7349 0 obj << /Type /Annot /Subtype /Link /Rect [87 106.250000 125.250000 113 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn13 >> endobj 7350 0 obj << /Type /Annot /Subtype /Link /Rect [60 99.5000000 142.500000 106.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn14 >> endobj 7351 0 obj << /Type /Annot /Subtype /Link /Rect [87 92 109.500000 98.7500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn15 >> endobj 7352 0 obj << /Type /Annot /Subtype /Link /Rect [87 85.2500000 112.500000 92 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn16 >> endobj 7353 0 obj << /Type /Annot /Subtype /Link /Rect [87 77.7500000 129.750000 84.5000000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn17 >> endobj 7354 0 obj << /Type /Annot /Subtype /Link /Rect [87 71 144.750000 77.7500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn18 >> endobj 7355 0 obj << /Type /Annot /Subtype /Link /Rect [87 63.5000000 108.750000 70.2500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn19 >> endobj 7356 0 obj << /Type /Annot /Subtype /Link /Rect [70.5000000 242.750000 98.2500000 249.500000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://help.scilab.org/docs/5.5.0/en_US/api_scilab.html) >> >> endobj 7357 0 obj << /Type /Annot /Subtype /Link /Rect [71.2500000 236 85.5000000 242.750000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://wiki.scilab.org/howto/Create%20a%20toolbox) >> >> endobj 7327 0 obj << /Type /Page /Parent 2 0 R /Contents 7358 0 R /Resources 7360 0 R /Annots 7361 0 R /MediaBox [0 0 595 842] >> endobj 7360 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1409 1409 0 R /F1499 1499 0 R /F8 8 0 R >> /XObject << >> >> endobj 7361 0 obj [ 7338 0 R 7339 0 R 7340 0 R 7341 0 R 7342 0 R 7343 0 R 7344 0 R 7345 0 R 7346 0 R 7347 0 R 7348 0 R 7349 0 R 7350 0 R 7351 0 R 7352 0 R 7353 0 R 7354 0 R 7355 0 R 7356 0 R 7357 0 R ] endobj 7358 0 obj << /Length 7359 0 R /Filter /FlateDecode >> stream xœí]I¯ä8r¾¿_‘ç&[ÜD0 ÔjÀ…*À‡FÇÁôÀí9øï[ ¥—)ERKæÓ4ìz)J\#‚_ƒ¿üË÷ÿ¼ü÷?.¿|úþ?—ŸîßOßߪ«VUÿ¿Kûß§¸¹º¿/Ú¨ËÏßÞ~¿üþöíí[óÿë?øþéßš¿þïÂ/ÿÚüß_/úæáŸÝKí ¿½i¦›ÿÖýk5kþªÆÛ翾ýû.okšsñÿQ Y ÝvãNÓ¿¿ ÃdÝÿøù÷·_ú XÖŠ©M¥å…5Ï.ÌJ~ùßÿzûKÓÀP}u55×RUÖÀ¿‰kÞ¶.˜¸0n«‹ÒQÛÝejgkT^Û+o{^zR˜¨Y¶òfUÝÿàßĦMÛ®äM»’™K‚άdL×RWt?wJ·0B¬°4·êW¨¼në]«ò®çÅge *\{Éŵʱ´àk,îXý óo¹Vë-n×óâ³2,.®}]™a¥dPf¨ŠÙºÒF¿iY©zï–c:Y½e½[Ë͘7j&¹J´ümIÔnÞðŸâ;~‘—ã=ÄÀÝäÖÍß<1¹IÉe¢î¦¯ºMwÓǪ¾kæ2í¨i°ø÷çX3])¹ÖšEugÍÚ®ÝÖ¬ÿõ4k¶Ÿ¥ˆá fû!Ûf½ìÐÉçX, »Þ¹=¯_µþ× ‡'ööiÂБ[í?Þ~ùÚ(àõåÇ_ší»›ÀþŸ¿½ÉæGkÚ0öòãÏ—ªšiýçË¿¾Ù«®UÍU7ß} ·]‰¹[ù%‡%Ÿºy•¢·%%¢Bß0XR©®D\•¬ö¾1°Dzý¥+QWÁ ›9ƺ&†nßÔp¤”¾ÁàÙ©úÙ1s†a%ryOØÇ ’L{¸zøMfBáˆy_ÂØÐÛ9 û–a¼p”ÚîÈ— }Lf0Y!±ÑÚÅ|¹á¦Ñ^»Þxœ^£þ•T–|E%LÃ؃r“gʆ6CN†T×Z3Ÿûù`êZYá“âX[?»ŒEŽZJŽKAA˜5a;•†=ø ÛÁk…ç¶SX‘÷m[R¦x ¹˜ªÍÀà9À€–àÚH{&gÌG=ËæzwQ„¡0Ôlvõ6S(?µ£]™…£ïüÎâ†ñ\dèoõÔJn¤IÅý4ùå6»sôbÏ{ݦ2f[ûA£Ç»ß¼ºS]êºýG3æžòK­F7÷äç[-¯MÜ6¾%¼ZÄ´æ}÷Û´Ÿ]‚¯™Ûhž4ßø=iß2^-Æoã×·xÝ[Dt¦‡¬ôò™2á9Ý ‚n±ö;úI}ó~ûæv»EªO¦B¯]ßV”)¼YW}§BgŽ7G,HO´U`ØÅ¶EF,yçcŠÂ»å»Ù@6Ðsy²’„´±R…f2Š­2ÃRXE¡(I„5+¨½×bÞÚ„/¡ ˆD3vTle{Ź@%Ê Ïy$§ñ6€©Œ êIU ÓŠÓÊ$¦•¦• L+GL+=L+L+’˜VD˜V$0­1­ð0­ØÓÊ—Å´°6' —™Ù¡9ßɆ}+SÁ*¾äŠ7à 4Â}Ã#=qés<—Ù˰«,¼»7À5Áºôا(Ç!”c =á~†‘™ ¥‘èé™LÌ™M²_F ¡@~øÍ(NyɃ;‹Ï¾(BŸûD¢+1ôNû¢>fDÞùŠz"‘ÔTÊîoJ)S*P¦ê¤2UGÊTP¦êQ™ª=eJÊ”J*S*R¦TB™R£2¥¾ÛqQ…»±7gQñeÍðÔ²b– ¥]ÚõvHñ7ÅÁc÷£¼ØÅ„²×Qè O å“^J¯DÊ!ÐzŒIKÝ)hö#“ª$&U&U LªFLª^.±Üȸãoðxp¯ îx$æ¦-9ƒÛUøþôŒù•ÆË\WRz³}"y°ôÅ.LX.Ã^gv‚;Rf<»Ë¤ šÚ® RQPÜT±Ã4Ám0³§Ÿô–éÁË­Ü‘©—€íNê=õnµr˜z‹êÑ4¸»Ýac­ ä {5« EÖì©)½ÞßAšëôC¯l!Ÿœ†æü0xhùtJ¡S ½®Z5Ó†%ͺ~GK²”uÚ-›an÷ !ÅÛcýu¥DH,g¼¦2ñšŠdÃ>td¯²)l_ÌSk³”(Ø)b« ’ø’öƤ\ë¡ÌÛkìM¸± _Yï\,Ä¢°ç¸zìª KvpMdu´ÍØnwçäsÛ’0e1ïñ®½Mïy=¯_+îÅë×J$âõk¥‚Xúí“0^÷–ðjÓ6†xýZ±D¼þv^Ã6ª(^÷–ñj1~âõ³ööS6d¿VÆ'eŠ<ü&ã À` ¾òƒB°ÛЇÕww¡ò6‡Îå²~Ÿ¯¼–ß™o¤óXùö n˜¢£² R”µ÷sÉ{”|Ñ»gký” ¥÷™pe ËÄÁtK™â‚G"¬PƳ¿j~ÞzÒÞ´à* ¦œr@X@X'°Ž€°Na=aíaaÂ:Â:„õ„µ„õ¶@XŸ3Á]JêªX4P]B£ÛØ(õ€Ð‹rdï¥ÜhŽÄЋ\åÛhñ`!9ì[Ufþéèf6ð+)¸¾èa®9ž\^á› Ì,%³Õic=®ßïTÿ `Ð`Ð&Á À M€A;‚AëA€A›ƒ6ƒ6í­í¶`ÐŽzuQÛçÙ`'ä;!ßÑ!_ž²ç<å~XÄÕh}ä%¬…éñ‘è2HâÅ#òljÉx±³‡ KáEÃB¼Ø> ñb÷–ðjÓ6¼hX /âÅöIˆ»·ŒW‹ñÛØ/ˆ¸EgؼxϬ¸ñð66’ć ø¦ˆ;7>yÁ,ØM*RñŸðú„×®`ÑØd$//º—ïªéßE(½‹Fš%ÊbšÀœ³À\t€²v­îß'Ú9®þ"\Ÿ9›Ç̼à8¡(öÛß{“ÅE*CT·€ö!b8y¿EÞ,UƒQJÕð~ƒS5ˆ‘~ÃÇQÉ’+‘šàé2ˆp_(!Ã8ÆŽ!7JqÿœWÈž!Èüy‹z*[#šûsÜ¡èu”+xpZ/Ã=cÌ9¨6n¯‚]An¯eB&‡ Ñ A4ì¿¡âopeþ®õúÊÚI(nô”\0Ou»>3)%L_…9{ ;VÜð¬xgÞúj¦C(ƒSÍÌòÛÑÔÌuƒ²Z䑉Fˆ÷ý¾3?ò:d¾W9Ÿ|‚äM nåQÂÞPöT’@"Xe¶ÌïdMíÏUŠ;aI&cvŠ9KÎ’³ä,9KJ”l±KØf Xe— d;À‘žI˜G‡ÆŽpß0^ÆQËqôn<;”ÚŽ’Xv+Í UŽvó•ਔhטÞt‰Þgg%Áµáèꘪ9Ã(œ•¡^B2±Úax³LYîV‰»¾Í.Áå©Kœ%gÉYr–³>ÌÔF\›“»ûµ ?[u·?…ý¤0§ÝgNplaË]‹3ù¢T~¢)"šÚ’ú„xê;ÏêŸY©Ñ+çôÝ …Õû;mÚ od°&ŲŠç ”bñÚ+)e<Í‚¢%ܳ’®™=§Oä5奞*§„M)›ï&uaA´L3"ÎõR6r‰,ö”\9xükØðî‰YIÁñw µ¨DòÖ‚ø%8fâ¹_IaR ±ÓI1c(9× ¢(C>ÑR¾ßH„¥òBY!ô4/TóÛÄy¡¬AΦîIªKxµˆi./Tó»ŽóB5OU؆Pa^¨þ-ãÕbü6¶È Õ Uød³ÌLtä¤ò“±QòB‘rÒ„lT6AÞ‘RTʽH¢¨²ÙII;?Îý –´l–Ç¢(êÅYb͈™BbìˆÌVBEÂ󟡸§3Û*=æT5Wòåp~ +kYÝcEJ ™ä©¢`¾YŸšà6#ÃýæEtÌH"HE@E[e¥)bpÃRøä-Ü0ïËéõ*ÐëUR¯¯#½¾Nèõõ¨Éµˆi£^¯’z½Šôz•ÐëÕ¨×+O¯WÛêõõq¸/ÂÑWÆ1»ÿ­Ÿ Z˜`Ô§Æ_D½yŸ’®G@AX6+åfzö €V¸Y$;1cbÄЈ‚wðâQHŽ’»‡ÀÞñ™'åd㪢´^ªèªè$T1T1 ¨r'Úƒ*:€*: UtUtªèªhªèm¡Š™q=:0TYÿ að€0ÁŽÓ&|‚¦íAS‘¤‡[%qÚ*‡øf@ØÖ3ªûúÐH†’î¸ áÞ‡³Äcël.mˆëÔŽÖ-³E yì&’AVS‰JÜêkæFwB!õEß—yÞ\£ ÷= ê«5Am2}SÁñŒ×db¹ û–ù·ƒçà#ìõgT’éÁ'ØÎ½¾=…¥f–š' °Ô2€©í“ wo ¯1mc€ÂRW (,k¶Ñ< ¡p÷–ñj1~ ð,µH$–­ìC¸i¶?¬r=wz­l¬e2Ó.hïESãR|¦)›#Éõ“¢Ïo{L¹î­Qº&pä«ùXMÇ—1)צ Vî†çXÓ»’ÁúnàB^™¦0kbÄÚè^VŠÈ¸XÌ€'m€ZlµØµØj±#j±j±j±IÔb"Ôb¨ÅŒ8Åz¨ÅnˆZÆÜØ›Ù(6›ö—ùFœÌþH8L'ÍÅ{ß99ç¾£“rq”p _ÙÍìݔ˦”ñ¼k\!µ¨ÿµ•UïÑ…»iÔ¥”•˜EN(ên¸Ä]µÂ÷2K˜(áŒuäÅm Ŷb>ÂV,…° vû$DØÝ[«ELÛ¶b)„­ªa·OB„ݽe¼ZŒßÆú[±Uv´¨,ZT6ohlÉÉ9ÆöTçIh¹€Ã¼ â”vnº©1ŽU˜©§þöö}õt0u¸^dÁe¡róEm‘©éÂ…‚wÊ:]4^ÒÊ-ˆ@¸ŠFòÞÊL¾€±ö:ÈÙ qQ,–Jë–;’#¬22öØ÷„$Ç(’ËŠg¢ç½»¬¼$ø4gN™)µÓ@Dåk ‚¥4!Bí yi í[«ELÛ5nS7aÍ“Hiß2^-Æoc D ¹HÈâmk'•DƒÍ\8!þïbŽ9šì—~ð3gJLì¢(L[Ù1D;%Áa–d­\ಕÄ~&¥yÁ^Ø-›â*{ïx€±ä¥–öÚJB‹ívŒºwZôUÛÀ˜U£’ ‹Í~J9‹ïY¸P[Õ•7ÔÈ“ ù†Ë¡hFܬ'zí6"fã _PI¦ ¿ù{0ñ!ÚmtwV×µSz‡ßº³¸èjj-©Û{vjS©ûÛfjyéÞÒÓZ†_õ`·q¿•³¸ø_˨öt:쉼 =íkñÇáì6[[9œe·ÖïÌ%a³¢Ä5*k”%m¾¸{ˆä¾ÑÆt6›Z‹Áf£ëéƒÖf“%&û Œ*tv “ÜÑ]ÿÔ4O˜£ÎáÉÏæ£ÊÑðø–°^5ÃOåÈs|Ð-/a"jFtÍøiß’~5Òoæ×Àfµ‰©Oõ§Ùµe÷÷l Ä)èãÐGžÂãÉôp’0ÒŒAˆb»$ ´5ªFgÕË+Ëüi#œMÌ`º’¾Ó•J0]é@²´OBÖ½Õ ¨±šá§ô˜®DB€éŠGÍðH€õoI¿é7³§Ól\N3sÿ< =’kÃsçm9ŠÅy¶Ñ£h{çqò`¶á"#­®‹^‡üÝ<‰ÄHû–C5ÃOˆÎSb„³¨‹‘î-éW#ýfv#ÜÞ·P‚—0¦>cÖ¢ùì0z#p©¦f³ƒä;H‘b‡¦ö€N¥ŠÙ¡}Ë‘ûPÍð“ìÐT–`YEÍT1;toI¿é7³+;ÈÁR$ÜU#ƒôF›\¼-•½ïñJ{´s äi—1WÍæªyйjR}g x£}Ë1ÏPÍð“ÌUW)æR6lFÙ˜¹Ô›Æj¤ßÌ®ÌU䆬…÷4JÐò­"‘ÁUÃNÚDpÉ~Þ󣿯\~¾Pª‡kB³éƒÙBÉTP2,%”" v:O¦´o9¡3T3ü¬¡¤mJ(éÐÞØ>‰„R÷–ô«‘~3» %S?PÚ bluÉd jåŸQ;—4J0BÀâ²ÛÉÆInç 0£G ^NÌ`ÖúÌTUB€™ÈBgœ…n*º·z5Vãä•kæ&À¬I 0Ù­ŽX÷–ô«‘~3{ 0S©ûüSždŒz—°(&qhÈXù(Ž8”ˆèe¯6á-höUÕ^$˜j8›Ü{0W$˜Û]×áM‰„ÈÚfœµÍ í[N$ Õ ?/ Ó ‘`Xh;lŸ„"¡KúÕH¿™]EBáõ¨VŒÍâ9G‘ Jˆ†r§j†§úÜò郹W9 ¿Œ/‰ ¿MÂ_Æ´™Ž=_ÓçCö<^º·ô´–áטŒÀýÒx_·™Žý6º|ÈAOšgCO뉿Œñó!ïä/cn9Ѿ ý•t)CFJ°¾²–Fx×+vx†ÃÐM2s•l~:³‘rŸÑªð`¤Êå…²nèØ}–Bďר$†ƒæÏŸbÑvxÅ„»äXb®O™‘ƒG…bú`6ìRu»”NÁ®ÈðlœáÙCMí[V Õ ?ëv)•‚]*4£·O"ØÕ½%ýj¤ßÌ®°«<+…@ëLJ:°ÿ5ô#{ÉSua<‰çà+'·ÎÏýáa`u±¬,§¸àS> ¼Yx¸nêÁUDr5}0[>êÀçÖè”Ï­‰làFÇ>·Ý[NþiÏçvhæ&uÊçÖèТß>‰ä£}noÕH¿™]å£|n¨–f’Bj$,p,09fšgc%›Á˃+3}ð¸šh¥¯&Z•R­U¸ÎH(zí[zZËðKúj¢)5±Q€Ã6x¬&6φžŠ©šhåÔD[Ý§Š²)¦Ëúx”=ZÎÜùZpѳ„§Xæ”Æ3 áÞeƾE8‹,àèÖ«*¶Ý>+ïÁܭزÀíÓ²”Û§L·–ÅnŸÝ[ýV;V3ü Ü>-K¹}Z¢Û'áVÜ¿%ýj¤ßÌž[±eƒÛ'Þݹbö^iùèRɼ³IM.•V¤\*­]*­ˆ]*»·) Ï¥rhæFj"åRiEèRÙ>‰HMŒ.•·j¤ßÌ®¤&—J Í~O•Šo1UŠÑ±×E†³©R¾ˆV¥|mdD±*öEìÞrT§<_Ä¡™Uª”/¢•¡I¨}Q¥¼‘¡ò|oÍìJ•jôE„ÖŠJN>¤€C¡e¡ìåWÒmþ-$¼N‹¹®¦fó’\è¬N¹ÐÙHá¶:v¡ëÞr¼¢=º¡™/Õ):[‡æƒöIÄKõèBw«FúÍìÊKúº%'!”‹(”ìöEbê– Li³j1—0;&¾ç,s kÔ÷€!mÊ%¬r!§ØØ%¬{Ë1œõ\†fn iR.aÖ„.a퓈!Íèv«FúÍìÊvp Ë„xÀ I‰þU6jßR"´õˆûÕôAK„ßÞ¾]~oæôFŒ‰)ÿvï…QËL2½cÃckáîetÊqæôÔÀ{Ó‘NL}o¬àWÞ-ã´¤Gu\âfy"3ƒòì3jGÜs˜Mõí«iìGPÃÚ\ÀºPŒá{I‰ìÌŽê°û¶Á%†ÁpmðÇElÑÐ'‡ÀT‚kÿnz<,4œ;Ç„I€c‹&Hž¤5Âß|AÄNZ=<;60IG4Ž{éˆáÈŽx\æq kÃ!8éä‘”)™’I°»"øÛåÛÛÿ0Ç endstream endobj 7359 0 obj 7543 endobj 7363 0 obj [448 /XYZ 38.2500000 350.750000 0] endobj 7364 0 obj [448 /XYZ 38.2500000 216.500000 0] endobj 7365 0 obj [448 /XYZ 32.2500000 551 0] endobj 7366 0 obj [448 /XYZ 38.2500000 428 0] endobj 7367 0 obj [448 /XYZ 38.2500000 350.750000 0] endobj 7368 0 obj [448 /XYZ 38.2500000 216.500000 0] endobj 7369 0 obj [448 /XYZ 31.5000000 551.750000 0] endobj 7370 0 obj [448 /XYZ 38.2500000 428 0] endobj 7371 0 obj << /Type /Annot /Subtype /Link /Rect [87 778.250000 114 785 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn20 >> endobj 7372 0 obj << /Type /Annot /Subtype /Link /Rect [87 771.500000 119.250000 778.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn21 >> endobj 7373 0 obj << /Type /Annot /Subtype /Link /Rect [87 764 129 770.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn22 >> endobj 7374 0 obj << /Type /Annot /Subtype /Link /Rect [87 757.250000 192 764 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn23 >> endobj 7375 0 obj << /Type /Annot /Subtype /Link /Rect [87 749.750000 154.500000 756.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn24 >> endobj 7376 0 obj << /Type /Annot /Subtype /Link /Rect [87 743 125.250000 749.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn25 >> endobj 7377 0 obj << /Type /Annot /Subtype /Link /Rect [87 735.500000 133.500000 742.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn26 >> endobj 7378 0 obj << /Type /Annot /Subtype /Link /Rect [87 728.750000 125.250000 735.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn27 >> endobj 7379 0 obj << /Type /Annot /Subtype /Link /Rect [87 721.250000 139.500000 728 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn28 >> endobj 7380 0 obj << /Type /Annot /Subtype /Link /Rect [60 714.500000 165 721.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn29 >> endobj 7381 0 obj << /Type /Annot /Subtype /Link /Rect [87 707 123.750000 713.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn30 >> endobj 7382 0 obj << /Type /Annot /Subtype /Link /Rect [87 700.250000 144.750000 707 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn31 >> endobj 7383 0 obj << /Type /Annot /Subtype /Link /Rect [60 692.750000 135 699.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn32 >> endobj 7384 0 obj << /Type /Annot /Subtype /Link /Rect [60 686 110.250000 692.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn33 >> endobj 7385 0 obj << /Type /Annot /Subtype /Link /Rect [60 678.500000 87.7500000 685.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn34 >> endobj 7386 0 obj << /Type /Annot /Subtype /Link /Rect [87 671.750000 139.500000 678.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn35 >> endobj 7387 0 obj << /Type /Annot /Subtype /Link /Rect [87 664.250000 122.250000 671 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn36 >> endobj 7388 0 obj << /Type /Annot /Subtype /Link /Rect [87 657.500000 137.250000 664.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn37 >> endobj 7389 0 obj << /Type /Annot /Subtype /Link /Rect [87 650 169.500000 656.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn38 >> endobj 7390 0 obj << /Type /Annot /Subtype /Link /Rect [87 643.250000 167.250000 650 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn39 >> endobj 7391 0 obj << /Type /Annot /Subtype /Link /Rect [87 635.750000 129 642.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn40 >> endobj 7392 0 obj << /Type /Annot /Subtype /Link /Rect [87 629 138.750000 635.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn41 >> endobj 7393 0 obj << /Type /Annot /Subtype /Link /Rect [87 621.500000 129.750000 628.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn42 >> endobj 7394 0 obj << /Type /Annot /Subtype /Link /Rect [60 614.750000 175.500000 621.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn43 >> endobj 7395 0 obj << /Type /Annot /Subtype /Link /Rect [60 607.250000 171.750000 614 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn44 >> endobj 7396 0 obj << /Type /Annot /Subtype /Link /Rect [87 600.500000 123.750000 607.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn45 >> endobj 7397 0 obj << /Type /Annot /Subtype /Link /Rect [60 593 93 599.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn46 >> endobj 7398 0 obj << /Type /Annot /Subtype /Link /Rect [506.250000 251.750000 534.750000 258.500000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://github.com/swig/swig/wiki) >> >> endobj 7362 0 obj << /Type /Page /Parent 2 0 R /Contents 7399 0 R /Resources 7401 0 R /Annots 7402 0 R /MediaBox [0 0 595 842] >> endobj 7401 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F1409 1409 0 R >> /XObject << >> >> endobj 7402 0 obj [ 7371 0 R 7372 0 R 7373 0 R 7374 0 R 7375 0 R 7376 0 R 7377 0 R 7378 0 R 7379 0 R 7380 0 R 7381 0 R 7382 0 R 7383 0 R 7384 0 R 7385 0 R 7386 0 R 7387 0 R 7388 0 R 7389 0 R 7390 0 R 7391 0 R 7392 0 R 7393 0 R 7394 0 R 7395 0 R 7396 0 R 7397 0 R 7398 0 R ] endobj 7399 0 obj << /Length 7400 0 R /Filter /FlateDecode >> stream xœí]Iïäºq¿ÿ?EŸ ¼~â&Q@`Ö9x˜r0rÆq ãÙÈć|ýh!ÕâR”X]¤Ôýï7°gš’¸Öƪ‹¿þË·ÿ¼ü÷?.¿~úö?—æïOßÞšk§šù¿Ëøç—u×WóïK§ÕåÇßÞ~^~¾ýööÛðÿ?ßæ¾}ú·á_ÿwá—þ÷×Ëÿc(ü“yi|áoo놿Ÿþî;6ü«YþËÿòöï¸ü}¬Ñ6g:ãþþEŠá§»±ÑôÏ7;L6ýùÇ¿¿ý:O@^+ºkÖ^˜òÂzÉ/ÿû_odžë,_w–_ä%ìðü2²Ãú¢Û¾ÝÐÀÒU’Š™ä2R÷ÓÐܦ›i`ÍÜ„¾¬Ô|«;‡]£d©9 ꦟñ‰ÛοªÏa:Œ-íös×ûaþzÛXÝÉxíhPru›Åùv"¯º5ÿÿ¾‡”ÚŽÂéÈ4_{ÉX×Ê®¹G… õÍt¼¿0Þ7Õ‘.§W;+Qù ÷ËU>öœzR˜hY²rʕՃ~*·²Kí%&_÷²`åcÏK­,X9áʲFªr+{«½Àä3Ö°r•O=/´²på”+Ë;;=L˜ [õ*ºÓÎ='Ÿ»¶p픋Û5bž Îu)Zª/1ÿ½hÊU>õœ|Vìâµ#MJn癜LÖ†«ñóÉ¢4íUëa²$ÿÄÞ\ªG‹Î´dK~ 5WÆz®õò–èjìϹ™á [ Ç/~"hFL͸ß’n5Òmæ/ƒM¼^ —þçÀÑñ3ñáÇïo¿~šk/ßÿ<<š&|þëû0ƒª½ü2öB°Ë÷?]þiûçË÷¿ÛÇkÛ1Ý©éÅù‰œžÈ«³cèöäËôD]׌«ÕÖLOôU÷MëxÄ3çO²}ç ÀIÉuÁnÊÀ‰‹À‰n.B€Óô–¡\áœl37Ê1€¾Ój, ([,§[5ÒmæPÊ– ‘tù›„—ážÌ ~ÔãÆ‚‡AëúÚÒhû¹LÚ`¤0(ͦ€+ál .Žl øÐ ×`ç“WÉ5ë§·ºu-ö—p6\ñȦ€+´Á‚MÁXf{ÊW›‚[‡n Ô‚Ðú€p¼Â^#x#ØH× $T$b<ÕfãŸFDPåׄ1bÛáæÜ/„:î ¡NÄ„P§|1ùô<12¾Õ­k±¿¸+„:B]´Ñ„Bh(³=ek!Ôñ3¡Î‚ÞXzó|5#Â’“ÖŠüÃ>Bp3N+ô{oÄ×$»±³Xné±'bÄž¹ŒØó#î;>¹ï¢ó>¢ >Ó[†yl5ö§ôm è#Zè3–ÌÕ.@Ÿ[5ÒmæPæê¶>˜2É!Ô®~k¯Kuêè¨@:ʘ»k§5«ýùCm$À9k†öÊ'gVød¿ìlÐQtNÁn!¨[Oê.&µlKè>‚ã[FÈÙjìÏÖ‚ZÅ„ ö¡%œÞ’n5ÒmæP!Ø[D• Ä 0(,Ø÷XKææ<*1˜‡ôl)<³ðЋ„rc³“k™õ H¨c낽BI6HH61 <\² ABÓ[³ÐYª±?=lb !Ùøþº±ÄJó[Ò­FºÍ)”$³ !¡@¡´^ƒ9z‰1OÞéOÉ4RÛ¯ v³÷ÐH’ÇÐH2ðVI¢‘¦· ‹pd›¹±¡‘$÷}ocIÀB|A#ݪ‘n3‡²X–‘Œ8n‡Ñ1èÃ3ûç¤X’Cõr]°›Ë¤—JÊXr(8Τ “CMo.’Nr(ÛÌËd,9””¾p, ¸L.É¡nÕH·™C¹LZèуž“y¯1}ËTjA×ÌÖŸ-¸;¨/[]#ÛºF¶>ºF¶!ºfz«[×b¹èÙÆÐ5²õÑ5c‰ÔËlO×èš[Gõ Øô0=èŽã ‚5:wN@#ç=ï`³í?±ˆA+'d­o¾Ö1˜çð©ÂŠ+ãdÿºßo‚ÁÞ)ÖgpŒlm}ØÌ¯ î—êÚ…jIƒjIíCµ¤¡ZÓ[ݺûË…jIƒjÉ·j%Tï9®×P­[‡Jum¡Zü H„°TGœdLì**Éû„¤ýŸ@'ÌÖ>G¢OÅ‘ÐD¾ÃÃŽjn’Sž”¼oá¤Í&R4É’J•§"ô’–L‹uÁÞÝôð®»›VM ?©¬jBüäôÖ¼[^ª±?=ü¤ìcøIÙÞå>ÄOÎoI·é6sänZ5?ù:꿺{K«š[¦1¹.¸ÛøQ¬wŒÅ›ˆñ£8÷ 5¹O]óez«[×b~±Þ1~ÓãG±Îoƒuñ3–Ùžë•ñskãHãGqRÔ¢÷wpõ¡€Ùr"BÀ0+¯ø‚èĺ`/±o.l.¬V6óÂjoµ"v[BT|ý ’| Î]ü¬­ž$Ô~.µ„j3¢6Ö°× NîöÀnŒØàÀ7Ï_…æ+¨æ¾E 4‰¥˜ª@:`_@±D;Rø°Äúl…b²z =q„60B£eÛÚ ‘ó†â°  uL±V"¥ŒY ï–ÆºÇ¶»S“ú|ek&©¹‡”‚ô£°‡>ø “&a/õy>Ï…ñ„æ ãðpA;!n4 E%ll`ÛXR=˜ÝÂM? .A„^Ò…ÛáQ:Þñœ ·i”VCŽªe½EŒCC˜``ŽOf+ü”—ÐÎA{å̦ïwÁ‹Nœ@Õ>”é…¿a¥ ÎíµØ½'£QIò%OàÓÆ\`•8IšÝ •Ç•dOKR lDb ˆÛ‹P!hZñÿìbŇ˜Üãæ2åb³Tií©S6»·F•ô’„´ÐC íÕ¢@ ľéÁoŒ‚io%ŸŒ¤ƒÜ›‘ú Æêг¬œA·8Äj›IŽÉ+àô‹õ O¢oðHûҺǸ»fïˆ>(O‹³y$lÜ™aŽ´—’¢(Ø Îñ×ÖB~•HfO Š˜l i4¦GqÅ·òt–™aW#OÌðbß|--O…VÞŠxlÊ.ƒlºËû†Ì*Ǧ|«àTm}-‹ºžðð¼›òKâë µ6O©eA„¦Á'-ø¦×ù=¨Å1p8RÏÛðÉgð‰@ô^…nc}ÊÚuîÂg½>µ1|æCFµ.?ƒ7ëAºdLpbë˜û.C!¶i/”Oì*HJŸÖómºÂ–è°ÜV ¤U’j )*”/Îh¯K®dÔ´:t·ÜôdVÇ4ú²{Þ‡ÝÓ/·´Ÿˆ —¸c·Túê„!‰¹9ñX¥É:Ÿ’“,Ä`†¿Ç÷¼¸8òVñ}Xcñ)V!ŬåÅí^©Yœ|‹¶° bËC|#C K1Î@Ò+s6ǘM+ìÁͦEjUºZ8cÕQW@“&@á±ð®¬ey…»Ë'?xRWÜcø7QÇ%!¯³iq(˜]*W—OX á~f)òÈ…c;Ž68„¹„õxU^I-çØDpÎUØ^ÂQs&TsU¦\¶þ•îB¦M. ¥Ë(8s¬ñ§.ÑqÄž4‘Y ÑF¹VÛ‡‘Z<þ1‰¦Á@„Å-&#ÂM‰¹Ô›ÕÏúh\zK÷z‘m=Þ\}\¹Eõ‡OŒÌQW Û?~ÓCßÊfÒÚ÷·'àx˜½H0µïbOØëfEþ•©àxªŒã›Zt”QJ%(àt µ…°N–&©?ö   Þß—†+¨³oya¢‘.m?Í-/¯;VpV8Ý+;¨‹{¨¤—D6~ø(%‚Æx`R6à7 ]ŠJ·½Z¦ÛQî ey×-/Z~ÑòøÖg'¾ãEo í¼’$ûö.’ì·í]÷.oË”ó,kàu|2©š°va*²98³fÁ¬B‚³ÞÍš&f–.©dô†7^²»îÐÄxÖö£3P«…/{(§i5¯ÜYÒc^Õnj!Ihç£a0P¸Œt‰ÅÆW0áÃÇ;‡8iÉ3Rbæ“ÍÛ‘÷q)Æ·OÉt/½ð7Šeu˜ U޽ŒÉŠ9”S nLÁæ ¢|ÌKÓ0:ŠôÔÌ©¯Ü¦ðÀ`0”(¤da-Yb5 _faR˜³'1@îXಒŸõxbÇ$hRS\VB‘‹âÞËU×,ÈœKvñ.Ë:Æ8%ŽÉÃídœ'U®Ü›çŽ…s7MÁ4íu¬q˜¡Øºä÷·o ÙXH¨Ž}Øë-ºÃ®^Tj[`À1GŒ#¬’&A @RÇx5ÔÆŒ¡k²|Ù[äÚo‹¡Z ‡Ò»–3Ãpõ:&|´m |êªÑ’á5“Íy—`-aÑÖ•æ²ÂʲäõºmUq[Õ²@ŠB~õ²Y^2¨KFá¸mF»ýçä1gŽ-ÌEZd’„à3‰;ÑÚõ<âÊØ0`ñ9£ë¬p'·WÔl‰ im˜†Ç#Ȳhï˜ß^ÜCqpè ¶CÀàYb~á`Öî5Ì0߃\—0–A:Ú‘ ˜.ÉœÛÔ7è¡õíi‡T‡U£13jÍèI¨\°‡¦r˜’`êƒí$÷šÔ‚° ÷¬ œ7SluÁ0X3€µÑÎ[UúW;lž7³Øþh½ÙŒÂ8Ç`>¹à ¤ùˆ™e'!ÇNüĸ;²ž$ÚA@ÊÎL½‰¾UêAÂþ‡ŸÀZ¦øX–ÃVÜ7 Á§ « ÁÁG&†?—ŸƒÚIj¥ß¶^Øá ×Ñà ׆ÞÅ —nïb.Äyºˆ¿nžm~åóUXý¶á£“ùµ 2àÏ=€“!FÚ[ÆXß¾š‘BV8Š+o]jÀÎÚôöÁ ¡ÁçJàÐ_d ® üƈ}–5ôU¢,,Áÿzlœ;®òI€Án¸‰ý Džðêq›Up¾T¯H% Z€Ç·צ暈®W#G¢¹~"øZ¢nIÓËooÿÜXS² endstream endobj 7400 0 obj 7271 endobj 7404 0 obj [449 /XYZ 38.2500000 659.750000 0] endobj 7405 0 obj [449 /XYZ 38.2500000 148.250000 0] endobj 7406 0 obj [449 /XYZ 38.2500000 659.750000 0] endobj 7407 0 obj [449 /XYZ 38.2500000 148.250000 0] endobj 7403 0 obj << /Type /Page /Parent 2 0 R /Contents 7408 0 R /Resources 7410 0 R /Annots 7411 0 R /MediaBox [0 0 595 842] >> endobj 7410 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1409 1409 0 R /F8 8 0 R >> /XObject << >> >> endobj 7411 0 obj [ ] endobj 7408 0 obj << /Length 7409 0 R /Filter /FlateDecode >> stream xœí]Ë®ä8rÝ߯ȵÉI=c€îzðÂ@¡ ðÂðÂè™±1p\ž…ßy3¥û t(ñdIåUº«ºtEñŒwœøéŸ~ýÓþýôÓ§_ÿçôÛøû§_Ÿªs×T·NÏ¿þðö/lÿ|êúæôÛïO?N?ž¾=}»ü÷ÇÓí…_?ýËåOÿw²§¾üû×Ó¿ýûå/ÿ4þÐóüþÔ™îòû_:sùSõòûóßÿ×Ó¿þÃéoÏ#NŸ'óþÿÿP»fè†çi¬|úÇÓ´Lsýõ÷ßþöôÓmâ¾Òwfhú“©]}2CmOÿûç§¿\>0 _‡Ú˜®­»êžuöú¥áò;\Fºìÿ¡ë/¡áå·¦Õü6sñ]1®5áÑ׺v7È9…ý^að¦2zƒ_g.¾+ãáF—<ܦq· íŸFרþË(ÎóÌ¥7e:Z8¸äÉvæÉ¾Œ®±ù}«x²×™k,\ðd]5~×ÊïÏëè ›ïŒµzƒ_g.½)ãÉâÁ%OÖt͸=¦ÖØý—á·}¯H7Ï3ß•élñè’‡ëúJ!¿Ž®±ýu§§#ßf®Äñà’'ÛÔím{šNa^Fרü¶RdÈ×™KoÊt²ppÉ“íúN“!¿¯0øP)r„ëÌÕòlôo1£à©Üþ8_~^üåûÓO_/öX{úþ—ËÌ®¼ýöý÷§úò?ÏÖøE÷ûþ§Ó?V•ëþxúþ×§áܵM{±A¯?w}b‡ë“þÜÕû'•…O>]Ÿ|ù~Ù…û`ê ­árªï×0Îg8_'SÍ×°ð¤ú Ÿôð‰O:ødÚ´Æ þ~ÜN¡>×îæe|™¹­Í/©ïÞ\ƒž¸ žö—ë“æ|Q¨Ì»'S|ÇÝv·÷‰ia¶GOð2K_#ç¨ïŒ¤°4šóˆ§dàž›š¸•ýæýh`&.þIÕÆÓEUK‚Á3À›â^u<øÃpé˜9®ÞH1¶ åŽ1©í›¸RpIm`®nÄ ‚6¿øƒˆpI‚F’]¼¡xéxÿˆ»x‡¸uÅ£aÆgE.fÇŒäÞíòmvŸüìó ×Zx‚•ÚãIŽ‘@åG²£¯/;Žé–`Ç Ù¹Õޏ13±‚ULÀÛÕÊ­ßfbÜ´°- '¼FEà*1Lc¶b¼¡pÅ Åä—úŒ‘i¿n×dÞÿë/Rœ.äÜhžy­l÷~g\ #Áƹ0Zø»J~ŽŸýGuÖà¸R‹÷í |ò>qĬñ)$p$m ¾º½‡ú ½àÆO>Î œ=0˜;à}ÃïàõàY‹žBcÞͶY§Š]>Á2£Áò »ññ9ÂÑF«-î>ÃY3+¥î3¦ò_ˆÛ„å3ž5¾MXwÀgÊð'QÉ’ô>÷u170Õ}®!]6ðÖ˜ú U|öp4‡)ò gí8¼gÞgû|àøÎ7›œÃv ãßÀ3Häù æ†e¨èw0bVš” Y[ ßHÅ…ð}x %a[ q—fžCu#–ar Õ7ÅÌTç¶3Ïæ×ɈFXÆC4frdûÌ2.¬ˆ]øùƒý©÷º©P"1+•PÀÇD³v™°‰¤â¥MþŠã)Ìv1Çr¶‘³’b²A%_SÕžè dáDd eç}L²qàÌè–¸˜LJ,×es¯D‚ð^GpšV„¨ÝUÆ÷vI>ß‚ e´€CÖߥkÎh*p­ðVGOZׯlã ʉ ?Â1EŰÚçò ßÄ\Ë÷Ó=;s!Và Ä×¢¿ªÛÝ ±Ûwßpê]e.x¬C/q'qp™p8ÇæÑ©I>¦÷£SUqÊi®4IêÌŠpaV”°6B8ºj¨I-vbpÉ'JéæY¶³W‚¹Ýaˆé{b­™¶’ñO¶S¹D™WDÂK|¿b¾6æýõ]bˆ“s{ndÝ`ê³5‹Ê¥'_W˜ÎÂwF³T‹^k_co§?š,Ó¢bOÛ]`–&î= ”lÎSì Î: êŒÝÜ2 7Y+>`ϬI<<ãS‰@€`ÀªD˜€¾ßõËâ**˜™ðÜq Á #VîP oFFÛ I†CÈf¡¼¸ôgÙ RQ> !BæR–˜=ˆp†åÊ¢JåÉÉ¢†/8 U$›öxׄ¥Æ·:^àQÎðã­ˆILëžZº~˜0˜‹™ —’*ÌzÂ`4â;:`tB ˆ¹²JæXø•$ÃÔ¶ˆ&G¿K‚Ì—N• +. í¼7%NÏÃæ‹,*¶¨®‹™xŒW©4T¨Î¡DMQ4< ‰’IÙª=JEeb²Œ›ÑQ°‚a ê¯lî˜lØšH­ˆ74‹6o½tÞê i*¢9ÚÓee¶³“1xweùzŽ¥kNäá0&\˰ºíN&º… •l ½h/¦ 0™wF$çŽ!*|,Lžãj$¦€SùØŠÕ%îHŸÔ­$ì}Y+êÔ+°¬+ ¤˜É ³n ×Lá–Nܶ×óvæå“7Ifªó-êÍ¢[ôd$ÙælgIW?Ç¿Sáï èÂô¢äv^ªØ¯º0ÚxÕ—f]½ÈÃÁ½¨Ã'xn“çoa=¿ÀÑ>£'#¼jwv3ƒ3˜éÚ‰*7ÌÀ|!æÖ¨AEW÷IˆöWRKf+5(9ñžªóÜCåw"%J²nR&ÀYç16g¾k­¿|þ@‰ÜY·B~¤ÙŠüiŒƒG Ç8Cß®TSñIbS Lÿ8¥_²ù™EWL—Ùf­®&PgªÑÕî`‹7ìˆÚ³#²?n`·9Øe­ÀJ×pÐÒPR]ÝAI† —À­ÃÍVà ê”·®¦½‚3M:Ÿ®vúÞ…ÆM]>Ü‹[iV3K1Op3Å >“á‘´„5¸íÉuÙ²‹²AêðAk»\$jWD¢ÀJcÖÅX9L ¬h YJ…¾é_ÐÇõõP_ï ¤¶jÞßû8XaL/Do$ŒÛà]$TÞ€ÒMt¶£èÓŸ%À½‰q/S¢›jà;øp/Ó‚ï3îMèt‰oúš)—†Ø©7ëª4Ñ7ÚîÅFÌÕb¡hÃE9•«^I’€…&‹u¾˜òîЉ€ÍÕëï ¥ñ—œ›‡µ÷Dý¼ Hy“¨l§ÒG ÏJÞ†NÆ“; |Qm![ÂõÕÈF݇';†—¹nÇeTÑ@¿QiLT1‡Dûšƒ_–Í/KÎ|‹àò©~2Í¥(Ⱥ +{i™¥éCo}¡ˆ®Æ8Vs®ü4_ŒC9& Ûé‘ÂÚ‚Mìà›DÏð@ßhÆ»²æP­ÚZÿÀÏ„‡t¡BcâmL"áWdT1Éb²‰RhZ„v²ýxæ%úÙ%t~À$¦·…:Æj2\WÞ01F¹ž“SFØ×ÞŠbZYŠöŠ>”Ûàîd7eRÕÌN¡(;òpÝ”äó :nã|9Qƒd˜3»FIN6vÌz#sGYŠöWÎûX,ƒ÷`x¢Â°ËÊxoù5¡D.0l·SHàÊ‚¸¥ cSÐô„‡û5@Õ…×·kò’±ÜRuµÛ)æÓc eç½™”Ú®T&ÃîK›Ã£ï¼ˆKÈ’Ï€ì •é‹ªÐàU‘&í˜ðóJ”%»:åð»Öîh³¡0q—Ž–£h²$“|þ£²²d})²²AYŠ‘½Oùa6ŽBÄB ûê(D|sÂ.•^ˆØÛWˆ˜Ÿþ™RHªlãü|ÜÍ;îfÜŽb:88¤ð)0{¹U~Œo£l4Qd 7ø‹éRˆÃ§MH æLUžÒH亠²à~8Ê‚ej˜®5Œ!Ó¥„±˜,t_¿î)cõR“͆nš*óB´°kC·owà"‹Fsµ=v;ÌæT­Gn<—,O4‚}É /"lÀ.f’W𬉢E,·‚¥µgþ,ÎGOÈ/ùj+#bÞí.èÌ•¬­º¯üŽ(Í*ç¶ömK]¥X&Mô—“- \PÙ4€ü¼6mÕû£¥»–Yô”¨@/[N%¥œãÍÇ£1jÚš‹Iß“8¼æ}aš'Üvbn*¶¤SU»35 ¥¹©{ï|MùД?¦œÞÉP'"œ#ʸ¥Dc¬:Ò±D³,ÊÏ£ñJI‡¡fuµ©}i¹Ë´NmW$S#™*exIÙØ©‰²«…Û°DÈ|¯±Ò+RµÇ¤ ëvÿ™Íq&ÿña0NÀå‰%ÍÜe³à¨¨áLõÃ,“bÕöúÞ%ÆÀÛNª05vúQf[û"$[e¦,<€hÞ‰ðmÃX€Œ“€Ç.^ËžÕô(`ä¹*%&úET-G¤l2™^¢‰ 7(Ùˆë `[’D]Íøp×{Brçi¶©5í . ` }õ™˜[àô™¬Í]†`÷•+៦4–£S´ô;1NGYgó ±y éuw¬ù ¦ã\Œ“Œ@ñ‹p6 “ø¾m“MA’1¹ŒÊ“Èó’ k¦ÀÛɸÊÐ)ÝðA@82ùPDÓÃÛÑ »¶÷užThœLn ãcú•á<‡Lð°cÃ+õ}1ÉÔJgUY2Û±‰ 1˜¤p )@–ãÊâº17ZTMÛ[›DS ¾°Í_1B ',8EEw®GÙ,·òÿüÚ“= Ùr^sKà¦Ì=*ÔC9…3ºö­{hw>*TDà¬l3x×+Ðì#oAô1ŒŒÀûGSç6ζÞ~PÑ©]÷úÍð0(ëûì1zˆ9ènPW7\e»ñ“5öVhÔøÞ¹aÜ 1Ù9LsDÃÆD×±D°8YŸÄ#´9Yâ‰7#¡œé3¹j¹„ûÐ%êqFÙ ¥ôiѬm0¾|ÛcˆPè~ÈÔ¯+Ò5¬pUïíL8541d3~‡æaŠÜÀ'Z}Í •j3ðh€ð¨ýÁöÀ`JÄû†ßÁëÁ³=|³j|³`£ƒÀîxrJ„3À÷Ñ0ð<>‚v€ýxG1`ª‚{íàùf½¾Ç•ñJ 'dà´Y‚ÏS/ñÏ­± %ÿ Êc€Gg8­#sò¶ªZñš™fêŠÃöÅ é^¬Þß‘;؆n–†r•LªåŽÙZ-#•«æë&Ôº¹s 5åi}vË4‰ÅÉ9XÌ0IÚ ÜB))ƒq"ýÁÚÇ2pL}æÂ5Sk§á %¢eÈbë&.e a–ÐKéy·Õ„4y´Š>ìï»(é%°w´ŠNGÿG«èß͸eZEËz´E}Ð4wÆ·ßSÜt™™5Ãwðh®w¯‡h]rÄ;“‚ßI­ÊÏã+±¶Ñ´…ºöªŠ?-ªQ9Ö=ð.â³Ï~ZwÀ÷ ¯óh¼â>S^b¥cü; •·ÍÖÕžèGö.ê´…G‹y­_Æ-L`_ xˆTö 3Ÿ¿6hîÉcJQˆØÉ< Z^*;u³%*R…°‰IÌ2˜Z‘GJÝhLãɼ5Þ5‘¶*ëïácÑÀ#Œn’*–v$UØÁ,.aF´ˆ™!² føª†5|Ëj©˜ |À^Ø¿ŸI?Ñšû@:\ØÿX{ù°¯•QÔ:d¦ëfì1øD„í—/, ŒDa%È >eÅ^¶~;§Ñü7â®ðY­º–ÅäL«½‹Äcµ×GhTÚh¦¥›Îß)}ÀBk¼oÊr‘$¶«iìžHŒ ex{#Ûûäàìj…ö™¸[€‘$k&úN„›_¤EcÓ$@igŠˆìõcRë#ZÍî„’hÃɰ ¸,¢_¤˜ÜuFéTÕ±à ÂKô³MŒ#;úYb,0ÕZé¶õŦ2 BŸe©Òá²×èÝ|L¬w÷š3ðD]DDq#8ÏëvÕ~º2Y&øÈt‘à"X¶\ÄkÆÛnb-c\ËžgR6Q÷Â-O6L‘›ÇḦ(Óåìð‘o!®GkÁa³lÇId,ë€W›ÉÀ‘E c#pâvÓ‹R/#êKJãʨø4u퉵dÜqOVÀ¬<ú•Êðç”eá½}¡\¦Ï#.Ä%·k%@B}IpISƒK¢e;£ˆ–›~ n*b);èß ÷Ð?¤ØT4†Kí0X?p‰nàÇ¡å@¿[¼£uBúoúƒþú¿“þKî~{Ç ”¢QNÅâj¬sáe 7à Ú š˜Ñ•“Ѭð^zx· yt7Y¤ûäÑG/öªMäãôi,YÉöbÿ8gzoïÍË¯Ó 3òêok?°Á¹Ø/‚´w®Ì³‡ëd_Š‘o¼oÉu“aÝ‚ÏèÆËíÙÞªƒfkmçOÜçñvVŽv›Á’;ù3úŽ[‹«-Ííë¸RääÃ>ÑúuJœìT—4[àè€Á‰{Øm½° ƒGƒïŒÊ‰Zú›.,Á=ÿù2ãé áÞÙ&ž ö²B°ûDžøô¦*9v¶ð$@%øŒ •h¯ÖßO ]åÎ#yGðö[8÷Æ3±Ê,¿¾=ý? ‰A› endstream endobj 7409 0 obj 6411 endobj 7413 0 obj [450 /XYZ 38.2500000 269.750000 0] endobj 7414 0 obj [450 /XYZ 38.2500000 77.7500000 0] endobj 7415 0 obj [450 /XYZ 38.2500000 542.750000 0] endobj 7416 0 obj [450 /XYZ 38.2500000 395.750000 0] endobj 7417 0 obj [450 /XYZ 38.2500000 466.250000 0] endobj 7418 0 obj [450 /XYZ 38.2500000 542.750000 0] endobj 7419 0 obj [450 /XYZ 32.2500000 310.250000 0] endobj 7420 0 obj [450 /XYZ 38.2500000 466.250000 0] endobj 7421 0 obj [450 /XYZ 38.2500000 269.750000 0] endobj 7422 0 obj [450 /XYZ 38.2500000 395.750000 0] endobj 7423 0 obj [450 /XYZ 38.2500000 77.7500000 0] endobj 7424 0 obj [450 /XYZ 31.5000000 311.750000 0] endobj 7412 0 obj << /Type /Page /Parent 2 0 R /Contents 7425 0 R /Resources 7427 0 R /Annots 7428 0 R /MediaBox [0 0 595 842] >> endobj 7427 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1409 1409 0 R /F8 8 0 R >> /XObject << >> >> endobj 7428 0 obj [ ] endobj 7425 0 obj << /Length 7426 0 R /Filter /FlateDecode >> stream xœí]Mä8r½×¯Èó›#’¢>Ã@wW· 4¦ ŒY¯ ÏÂí=øï;³Rʪ$õ˜âË ))5ƒÝî)•HŠ Æç‹ˆ_þé×ÿ8ü×ß¿|ùõ¿ ~ùõ¥:¶¶ºüs8ÿûÇ?ÐÝqøû¡íìá·ß_~~¾|ù~úÿŸ/—~ýò/§¿ýßAþùô¿¿þíßO?üÓðKç_øý¥UíéÏÿ~û³oÕéoÕõÏóÏÿòò¯8üí<â8ݰ˜ÛÿþcmšÞVçeÜ™úçËø™êíß¿ÿö·—_.7KךþôSU›ú úZþ÷?_þ|š`¾:öµRmS·Õ#µúlü¥ÆÙ.Õ¡Að >oäÓð‡À÷À½ì~®Úà»÷õí‰/ØœUãwÐÝûúã$ðɪ¦s„•îâ5°©x\šëš3\QsK\Lê*ÁÑôå‰Rãps6’ž÷ê5~Iõå÷Ƕ±ÎÄÄ’‰9Â'÷3ð¯b20Ãó0z¦”Àí,¦eœŽ’kxm+!$¹Ê¥R2œc ÕêØ´êæ®6…Q¸_O1Ÿ‡«m†—fY V`ß°†Ë|éª-,»'¢¸xžÈ¿J;Ì7Þ$@æÞ: ¯``bð  g Å%H)õ$-b!$°-?>d¸£=þ'ÆÅVÀ`æ<ÁCðòÄzN€DE5ê1uœ0ˆÿ5—-q3PØ6æ@ˆ-¤æ™¯DRô‹7EVq¢ š5è×g5ÖÛÙ@ªÞ%|+"Ž”Ñ*EsLú‚l2DHXn{–IÄa{d'˜KŸ-GXxŒ]OÅGžåõ¥$fVuŽ438·f~ ¢pî#dƾÆ,5Ï8þ3'¥¤HÉïüY@JÇFÒsуˆ¿š±¯"n´h–NÀZÀWçDˆ:¿~•P8ª3ÄôV:.0V¶èǃA¹œ$ÔUPËe“»J¥8PySXyaKÜ´lqQ‰¤Lã´ægŒûC,æž®U÷·Å»ŸØwI8ø™€E\ßÏÞ°€Ž`òqÛòŠ@ìŸáû›ð1:‹1P*æÓÙšÕ¼;Z(#™‰[SgZÞ¾eXðÚE¡m[GRQF‘ðýªÊÀI Ë„9œ'ÎCÑ“§ØM'Z.À7‰R;æ“-j¼ƒ,£-Ã{$J|£¹Ê5 ¬;盲à8C;@øŒÌ¹§l&õ„6Ý|›{þ¥®W* ,ó]i+î1‹b1‹eš²j€ýgp öO£xÈ–ü¤ðPî’·=sé(_ “wpoSRJÝÞ:½û×…C $à“dÒ#ˆÛ ôÊ·Öz¬v†ãÝÛ¯Y /lÝ 'T‰puѤ€€Ä…vÆp†ù@láÚÒ²æ1W/ï·ÛJ GµÁd/ï@¸Y3Í{êsJ±ÖG®ëÑP80‰cŽ@pÊQ†×6ßO#›jR® sêˆÓ²|3×’Mÿ |)á`§ 4.f"ëPcè;B)3Fà30ïò.‰ì»6… d p'ÐBÓ”B¥Ó«¡ŽÄKWUÂÛÔ’]hÞ]hâœÑËøPì1*"„ã*£ÛÌ—‰TSx †îD€ùw ëýlÀÈ38Üj‹vaÉ>þ€ž†9‘Dn¿¤ù–R:ÙæÞñf«“"e“é,Ø+‡Ek® Oì˜(W)do8,sd[íx¥GðJ ÅZS·®XÛ¨ÓzH¨½Ë¯ÐFæì0¦ûî–•DÕ•~À;7OŠNfYö×\+¢j—¯ò‰løÀ ëxJ’í.ÇTOgö¯ºÆÕúñàŽ7ð{ð;²•êñhŸ6>øŽ†}t½äNAÌÍÊ5Ï~ƒ÷LÞ`»jhüŽVÃ[ ?;Zc:`æOLÆ^„çæÅKÑ0­¯à1™îæ(å%åJ%Ø*Ïtɼ³Æ¬#ƒ¨*×Êß+¨†hnU­¾e·X–…®µ(s){¯Xg[wM‚$ú4 £-"¡¡Qµˆ?#ÞÐWTVtCú‰›$Ü?‰)(%Ñ„em ¢ya‹ª›Æ½©Œr{ßÕ@øeUÙ\à‘=êdE{=±9¤TgEÙRŠÂØÖÊÍU\¶­åÓñ®„’µµ®d]",§øE‰À3eÄKÉð%I XEŒ]»àÖ¥ HÅ%ßÊnêø™Æ²uB '`|ªqÊzÑmãª8­Ñ%œdÄ =¯6}ñ¦|EO–lúÊZët ”ëhµÍž0B¸ÕlîÅ,€lùôÎÊÞºBdw‚M|F®2K®Êš2BikÂ€Ø ÑÎ7¿Ö)>D@ ™—HÑ\™øßüCÄå›%ìu¤5xᢌ?sM®7áDþ‚dV¹Â‘ñœ/Zvì1IBÛÝ—EÝ—²4Ù(åªÚUR ¬U0.O¨.kÿ§u±ÈÒ÷>±”¶üμŠÉÄÅ #êk.¦ÐM\6M®²}¢qa™:rÌFîºÊnnÈ0\¡‘—ÁCÙ^ ñ¦h“ðã~À’-´rr%WR«hÔHØå.QDyÉ•p |¢4¾¦¹´½åxÏ–™ÃSJeË”ã”@ù⾸ºJåmί½ÐÔEª\G>íq“ÆM6©Ø¬šxzS«UëTä3¥-Àž+Z„m24|`ÅÊ-l½˜n®ŽÄT=„ùžW¦Œ`ê(ÅÔ8&«BâPþýù}ïs˜!µ+ —(Ü|ãYÃA˜ÁÍ'×òŠÔ>ÁMÁÞ…  1¡¹ô¹­×1ƒE. ³zÌî 8âT5ôÏù —WsJ8Õ:"ç%ÛûFùÌ÷ùAª›‘ˆÚœ©›‚¬,Ý£-Å¡˜Ág¦ûûĹI¤:S‡ê¢´5‹(Q鮸d˜~sLÏh×€” azÉ3!‘岡ò½Öû‚ôÜuÖz/ß'Hø(p—l¹M¹(R‚.»ÆÕ˶îüÔØ',Ñ@³4\øqbC}?`‹µnÊ×  |)¾‡¢_*«!¤nl»dk±Õ6W…½|‹­¾(½5´ß[~O M~’«]–Žßƒ@)<ÚôÄÔpßàh/…§@}ÏeÕS-©ðiÃÖWøLN-¼ŸJWµã”²Ei"܇xxÌɘp–4²!®ù-O"jÄ?±9¾À¸}L2"#öRDû^¬Gø‡›7¢º0ce•ËÀ± ôy½Ã£9+ùçʺ—- _ô£]¹#Â=[:p2L ÅL¡µ€£N¢~i6â—ÍdÞF=^l`Ìí#Øñ{†Èò3W£”­ö’­ÌœDð¯„AO?…‹7eÁ–θrnyMJ²U¤$2v—(>—Ü"qÚA¤´,ë1R:¢EîW©{¯ê ]ýöRv¹kœöÇ‹cÈÿÜ©'=|ò =¸çÄ“aó¦FÓð¼‚o¢+0ð |GÁ}t¨ÕpÕø{Œ…óàÀ'xü¥xÕëœzòJœ>mL½íSHïØì•½½0ëH°,–ÇD•]݈Iƒå…X, /t¥Š5øbá«\¥ÕF9ë¬G½nðæÍÒ9×Ù ¢¸ã’Òm +´|E”5:ÛRÊ3ïÚ­Ó)Ÿê¸Noý~¹’{²³I‘\hÙ²¡MOËcRdK¿ïü›¸H6GüÚªj×+ZçÇõ…ƒ\¢õš²Ø-}o\»EÖ)Ý?Ë´TÕ¸®l eÃWöïUÊã+{øÄâ 4uâjÞÂѲa%á;Üã…BU3r”÷'A¿TyywÜv}=üõ£]“;À_™dO¬êÕro¾ÿ.¢Kñó¡æÊÕ€*îJ Ì¥•ko±ä¢Å¹23;’ý)S ¤Þ•HÏ ¯–3+Ñ–ñ©Í¯I‰]Oþ¢× ´IŒb¨”Cþ8„¯0ÀEÂÊx¾†+À‡a ™KÛw.sÙì(#ÔÆVuwŸBv¨ÍVïé¨É`™[U™q£¾"s'¦&QÀ5€7Á £‹Cî¹äèxùè’l¦Ææöm1j}ùP¼p»’Íׯ•Àpg,ß—’´ªyëˆË\ü…røâÝÅ7”H®Û±X¬D¯e*)PŸrEŸŸ%Ó)­mÛi—‘¬ ‡"!cízë2ÖUºLrµ˜²Êô·Ç6…ʆúZßýSÊ8ÛøtŽ•”ÉÊ#ÒUÞæÔ Ñiû$Pî ¢@P­ U="H$M})lm7©\yÖ¶¯ÈÕ¯Á=0 .|óH¤Ê†wƒ"œGÞÒöea\RÔí+~—ŸÏݸÇôüZß"Íãýu‰mÉÎÕ¶d¡Úá úE‚¸{ëÉA¤¶®§-Ë”ÝÅ‘Ú'â¯{­AOª±Êhãaw_á;=zgè*£Zÿú £ÕG mà øä+1Z…ÞÑð þÒAXM½óíþž¡ÒMÔþwSÏ9ÙMsþ£Ujø©>4öø¶†Ó/?ùí¥©JõºëÔõ·ÌÍ(æã§ßþ»;¿vpÞ¶­;Çé'§wnWrþ­îf”îvŽ¿¼|þCªB_ƒÓ¦»hÞa_¡“íÎÉ +U^ðªq² fŒ9M×|Ur1E)²õD”Èk(} tãbzçynºo¢áLѼ5"›…‰F —O ï°Ö3²zzâ’g÷©&mw«š´ý”jrÒµáôO59ÿ–¹Å|œãªš´í”jÒ6î§ŸxªÉù·º›QºÛ92¨&ÝŒ&…KCð €I;Q\Ð,À(›­@H)¦Ï…Lc¦k»hK»º†¬6ú»’0aßÑÚ¢}còŒrüPG8¾ ˆk&ŦxßxŒΠ ©ÖlÙ8K ¹ÈUÖXi‰ÈLI#¹ö-à¼À¡(ÜB{Z^—OÏ-Ÿ//¼@q`Òd¶X4Š+Ó6¯®Ÿ2ÌÕ׎ (²X¡ÀGt/¾™¸B¥•ó}ëì£x­Üè†ËÑâwð÷àUÃNŽ:y'G¥lã’)´²•aLç{!»8õD¼Ä YÑôC áQU`ª‘¥latqÖÕ•‰Ð;L“j•E’óÅ€R2·Z;»áf 6u~ .Y‰l%»Ý#Ï'— öä½ ŒÏ5wÕ3êµ£é;þYS»'Oè¤80ÍMëf¸ÛUt§Ì”;Õ¹;%‹ãÁOb¬}B¥ÙÚöS–:ršâîÆùÓ<õ/¢æ´HseÂ=8tP˜ºâðI€µn*§ë1r®Ì«%ûÐ#rŠ(Lwzë²jzWa”yÂÜ^€Y/ÒNF)Û±œÙH&œG‹!ýju‹ô«ÕÒ¯Ö.Òïüé÷ö[æfóqŽéW«)¤_­\¤ßù'.Òïí·º›QºÛ9Ò#ýj}u&áXÕò¼;X/ÈÎv°ž&Ÿ+‡‚ äD¹®ZDˆ`.”[D&7ƒ[ÂKº6Î$s$i•ÒuT·®¤[5¥QÑÉäääâ3õhí7rwn†Ïò )”ï´ØÈ5—X°CL{k‡˜nÊ©+×F¨+ß©¯–Ç8Šù8ÇÕ1Í”b¬;Çé'žrþ­îf”îvŽ vH}íI3Žr)¼ïÈd(P—N´²W¶4FÏð¸q3Çâ¬IÖFb„÷mnÙ¦m§Ø¦í]–vú‰Ç6Ï¿enF1縲Mk§Ø¦­½9jŸmž«»¥»#Ûl®µ‡—Ï6CxuçlÉÀ â (0pë)à†`xƒ†ïà`P³‚ÏÄhp‚2ê ®€XÛ œš¾8S¸÷Àâ“#vGÁѦ^8šÆ{€Wχ€axÞÑu‡doIy:ÜS¼£p´ ÞS“Vu€®$`4úéÓøKË»b²É˜îDÓÆH‰ò¼x0-eɺ~-¦ë·Ž®ßNêú­§ë·º~{ÕõÛ]¿utývR×o=]¿ÐõÛ«®ßÞèúmF]¿Ûu}W׿nÉ®™îšéSj¦)˱E3ÞoÙ®-U¡bX[ÂØIŒ—&FËMÕ½Ëy‹Rymk‚å|®½£‡õ“zXïéaý„Ö_õ°þFë=¬ŸÔÃzOë'ô°þª‡õ7zXŸO³ÕHúlðì<¼Í{¤ÿ1¾nœÇó¤Ô 'bãc‘m*¶¦jª;Ä1‡rT·Ú‘ ؈*Y«‚è ‘Lù ˜ºL nõAð¾»Vš2S­Ül|™±Ü¼DXñeÒÆd$²¢"‚3rš°:¨Tk;‰»!EÐlzÒ =ðÞeu #²7›•éÜ^+%›¶– Y(,U˜´BY˜-cî2êydT·—UöÆíeU3áö²§?n]R矸n¯·ß27£˜sŒn/«ê ·—UÆ›Ãxn¯·ßênFénçÈàöÒj< ,I—ˆ¨üñԋ݉ö °;Ñì»-(÷v'Ú*hQl  qûýJ+‚žÖTÇÆ\P´BõÔ^.I¿ÀÔ•ÅïÀSä'J²‰Ô¶+_‹A–[sC1ôÏ WFˆ"v#Ã̦Œ¬8ÀtÀ  ˆø;˜´›„qmʰÑ~ô­^§•MÃÒ|¨ €žÃFM“úèTÕ5Óg—^¿À´×©±¥ïDaku—©Ut!ú”,yȆxÿØ£peÁé)žƒ÷ ¶æqP,W«ÜÆÖ®¶ã %b¹ÛQK >gëÛøœµSñ9Ûº±³ÓO¼øÜù·ÌÍ(æã×øœ5Sñ9«½9´Ÿ;ÿVw3Jw;G†ø\så| Îç-çwYS¤A‰Yê:MoǃÁ¹ XÄÂw„›ßD}™šÓɸ©"ø): ­€’@Œ _¼’sù&²~tͲL]Y°¡§i§E¦È‚Úü¶#˜mÏïUÁˆxLç”ñyè™´t°u¥¤ˆúB\Ð]s[•æ&äñÆÄÃMæûª(‹HO+Âu`Ï¢ØÜ•–ÓßûF”ó|gVõ’†ûªÞ‘0Â`Ã_ËÄÖd«7"(¾¼¡»OlÈ PYu‰r !•Þ]ר‡zóaŽG H2|Bó;`ŽÌS3e >QL)‡åPÀÞ8H>ŵCÊdàˆ˜’ñù™° ô äbh‰£ó"Å¢(ZZ+µÃ—R4®£¥¸Wi‘¯¶í]ñ!Š| ´ZP©Ec£[÷Û’‹ãÆxâ˜Ç‹§=úƺº#Õý¢äwñ–ÏÄ‹è'ês|@¹KKgmçÑf¸0¬‘«ÚÔtÖ©ùt¶ªºô{fŒÄ.°]_s\±K8²i:W1õo ¬«‘+Ü_Žè‚ë¡ãw2+%L OžîÚñ„‰žOIønÔ p­uWMÔtÔMÇû†µü¥L’Ö·|ôÒVÍô¢ªÜGÜ7® Ó!g앾‚9p/¤œë©ëÛ³˜µ;œT™‰)õ%u¯«®näË”ª:^„ü‡nÐ“ášØ£v5ƒAÏz§GïŒmËÍÑK8ìÑhƒ"0µ‚‹p;{„œÐ†OðÚ|ÉÄÚ†VÊ/Êчy¾ wl Gû pœþ=üÕ[ÿļï4ý*hº½¢y̽óÔÚ¾ _Šôdl<Ô. bøKãàÀg±[›•Ÿ¡ðhðÁ5§¢>ýƒÇÜùï§ß^Ò)SÙÆ“€‚…”1 è{þ@k˜Ø»Á.™zr/†=u>#ø¥ƒ½aŽ—ŸI~†÷ÜŒ‹õ†"ÔõŒ5ªžÆ'wLÚÌåêÜáùû1kx¼˜ì09Ü‹,`Gø÷ ðKÌÿ"¾-ÀÍ)Ž=‹ Ü Ÿ.Éð˶2Ça¯o'”øÔOâ]…âûáûËÿÆ© endstream endobj 7426 0 obj 8753 endobj 7430 0 obj [451 /XYZ 38.2500000 116.750000 0] endobj 7431 0 obj [451 /XYZ 38.2500000 116.750000 0] endobj 7432 0 obj [451 /XYZ 31.5000000 416.750000 0] endobj 7433 0 obj [451 /XYZ 38.2500000 375.500000 0] endobj 7434 0 obj [451 /XYZ 38.2500000 249.500000 0] endobj 7435 0 obj [451 /XYZ 32.2500000 416 0] endobj 7436 0 obj [451 /XYZ 38.2500000 375.500000 0] endobj 7437 0 obj [451 /XYZ 38.2500000 249.500000 0] endobj 7429 0 obj << /Type /Page /Parent 2 0 R /Contents 7438 0 R /Resources 7440 0 R /Annots 7441 0 R /MediaBox [0 0 595 842] >> endobj 7440 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1409 1409 0 R /F8 8 0 R >> /XObject << >> >> endobj 7441 0 obj [ ] endobj 7438 0 obj << /Length 7439 0 R /Filter /FlateDecode >> stream xœí]ËŽÜÆÝ÷Wô:€)Ö‹  Íhd@€,‚,9N`ÄF/òûéG±5Cò\6ÏÜ*’=mÁ–<%«nÝǹ¯â»?~þûþŸ¿íß=|þÏþküýáó®,êPžÿÙýðü¶)âŸ÷uö_Ù}ÛÛ}Ú}:ü÷ÛîüÀç‡?þô¿½ÝÿéðïÏû¿þíðÃã_:þ…_vµ©¿ÿûô{[›ÃŸÊËïÇŸÿk÷—ßí=ÎØ½..æåÿÿà]ÝZs\ÆÄ«¿íºmšÓ¯ß¾þº{w&À¼·4uh¼ÝïüÞ´‡?ý÷»Ÿ/è¦/‹ÖSW¾._ó¢ÚžÞÔV{cÛÃ[C¼èôKgz£?yuà™d“ŸW®Nã*#Ï^4Uüþ™|ws¤Yšg™fŸ”­ê²ªÏGSWúgó}ö_›£ì¥šü´rm¢D¦Â“kž¬iÙ<¡NAünöÄ·Á$d›ãʵ‰Ò,œ\ód¯ÊìeöÄ÷6áÉžVžJfáäš'ëkÉã\ ê_¦O0yU¦ä›ãÊÕ©Ò-ž]ópë²ãýºI@¢ïÓ'˜¼9,9Ùä§•«S¥;ÜÁìŸæÌ‚—rþ ð2¾ ~ø²{÷ÔîMµÿòÓae§žûòËÎþç;&äËûß—¥kÿ°ÿòóΔEU›æˆ¤Ë8bšÓˆ+‚¯ŽßGJñÅa!î)ŽØÓHS4mYÙÏ|<„ÂÙÆ¼©Ñ3φWЪ͇ólW,oÝ™Þ$ÞÁ•<Àƒh^ÆÓEÙº—4g;ïËØnèšà­¿ïS‰9lx¤eÓŸžWYiLIàzUà6ü>8½+á3ø=Äl¿K#ÙÄÚ‚'±çcº5]£80ëêAPC˜á~fÂÏœW`\·Õ+f³OW+5Û:sÊÔ?~9XÂDF¬m{VLØ><ÌX˜×!›âÃÃ6@;`°U~$$ô¼¶¶¨«Ð£ÃÚ>C̆EÕ¶ó5Û@ÿ3æÙ˜¤r(Т¿zA¹cæe^ÌóÂÄa>}LK`6 €aY[¬ a%ñlÜ` Âõ ,—ÇÚcsóQû#² îCÔ¼®ÍñHzûiJ[õ (ÅY ÆÁŽÇ f'ðJ6fg !ÖAØÖ.®Ì7 C³¨#h8"pÈõJ/—ì1¾*ΦҌIé+Ä€W]u‹qp™D¸ ‹Ô± ‰‹=gûz (>Ä«X'[@Ws'·Õ¶´=[Pë hb€êME.Æ6ˆgƒ+Ðq Ӻǂ"PÓÌÆ—ˆ¹ëpâíÖ¶ßG‹~ÚÑ‹ðhäÝŒD&{¦„ï©àÈøžŽ<ï;V€GŠÂµY]à“ƒ³EI{†á<äLQnEáÚÁ|màˆ…#nþ „SÀw ŸNŸÞ)^äQá°ü`º1kÃÜ‹G|O+QÕÓ\Ž5>æK<>á73b1_êò?–ÚG8õcwK(éjåáòæâ¨BÊ»0_—{¬c±­]œûî\þ*.ÏÁ±ÕÁߘä> u¬ÇôÅ|‰µ<” ñ‚`V, ÇZÈ/#½ÅµÃÒ4å?äáë§16äXÌ—ÊÌ]ÿßùÿô ötý&lÖ€™ª²²Eˆ>ÁkÇ^á}êúd‚oŽgÃ#„ÇZb=ÈD½02ÂtƒÔâ-øä0Α%ȉ>ƒG¨S`¢…p§L4 kU ùÀzÇ+!Þ#p‰8r<§Šö#‹&6å¸Kìæ=zÃa!,X?a]ƒu4>9YÅÚ!_¼±2¦äeŒÞ1â¢êðLiº±‘ÄÌÂÎB^ Ûç§Œ’ášI”#DUç±mŽäòx—·ÜØãňÁ€Ø‡Âïì&–MÂÒaÍ•3¶k.ÂÂ92Q_Œp—³åGî’¾Iä™x®8Ú°v¨§s•X`„€9ÉÂ#Xð´t£«ÖØOÁ'÷f4 #Ï ÀŸI_8<·]&×T2yÔ€c4„ÞØf¾JÙã…Ï̱sùǬsݘzMÝüιéæÏà3–ñ’‰jIª¾Qµ&’ÉS¬¹B™É< W¹×gŒ…ÚÚ¼~¥³ô˜Ùõ·Yb,‰ÇUðÊÁzK:×$t4“§tÓ=@äö„ìââ5³‹®|MŸ®Îbð¿£Çf|öXf°NËèK‡PMž½€ƒ1¦ÅôÅøgñø+U ©0nT}€™zvŒUñ¶€9c<æå¬îrƒØ&3’ål³GSWäêPÓŸ¨zînó#*I1Îvºüíñ¸v‡ÐvwÞÉÈ;|ÝKß^²Ôªÿ^µ«­ñï˜]WIQn›­I«œMBÅ2c®¿ fZ†79"ðäDw6ìŸ1÷¯2‘%&ªÈD‰˜•}Ê•@›¼c>[Õ›ù6EÎû~«z=ºS72@â6Ì\ü¿æhn.Ü#m\¤-›ŽÎô]·TínÙVç±,M;y&Û¡º*‰(†n\ÇQÞÐ=+÷íë²Y —/ÆrÝXœ ½dªm×­£¾|Œ%¯íþ .¢‘I²˜.»mú™»«Þ€,`‚;&ÆÞ7F·5ð'§€˜\òå.5]*äR²[Wá´ž> ›¢iËÞÈ™„¾ð®/7P¢g ‰eQ®¾jêÏ4pÄÏ_[4 ##1P>6›%ÞŸ‰e¨ÍK^\Ѧ?=¤¬p¶pzïàb1-Î" gs-?à b¾;Ómµ&Œë–ðý™ó©›²¨jóâ™`ЈÏàµE;Bƒ(îÍÇ" ¾8Æ`F¶n w —„ÏŸf^,ªÍè®\¼K§Ÿ‘Øõ~0øø¼ð¢ÚÀbÝüqb Ò±Hÿ¥EŠ¡Ý±Âúìz2`¦‰wÁ1Àã|Õ‡ «`nðÛÀ|¬1‰ÀqøGp)~n82C{aå(ÐK;Æ0„ƸGØ´sø=Ñal®8 F(…mÀ÷0 ƒ˜»à{¹ÅvËAk¼*Ñ9¶Ë&ä •Å ]+øŒp¶)àGBƒÚ6¡gPñ®)í‹å0-œaÉ)¼Døb´2ˆ!fRL(ÊÖ½2Büަ¬>ÖòŒÒÀgJX]¬"P§à… b¢ &ѵ’Ò髸úrF¬†@3ؤS‡M`°!6"`¡ yy³MáôŦ4“Ë@$áF Ýæ)FKH…Æ÷©p£QÀÁôÑÒ)жÙ[?F[cδõ—²˜§‹<û—†2^‰<2wT‘žœ-ä‘gbÒ×ÔCï>µP]´Mÿ=çxñÅ€ÇÑÈ%õ12pø=Ñ{[ÞO€³YDÑ.~:2âàªæŸOT#çãç?cën§‡MW×¼­Q3ãL1EcqÒÈ)àLëhùÇf+s’K¯ =#±‘`ûœ8Ž+38Öê„k.„"™\ ÌZŽÅ{8[Ô¶ºfØa· ['lüfDTSkNoR¾Û A8Î*)#aõØ#Ä4'|8ÊMQ§ó|EŒÏ0 ÉÅhÂ~l6¹U‰La–>KVúžqìá0ãí°NÇÏtÅ*®¯íñˆpxÀä&Ì3[óPR©ä®J¼GÃû¢ì“ÃYXzAia—c2)Êvôzâ3)œ-°…K¯7…sh?øÆ¹Ý…†¬ÄaJr«iþyÏl L”òÜÚ¬Äòu+8¨ª¹4ÜOåšÓës£,¬›XËýæge‹gvu³é*¶ »Õjm«Q»Ö¸øÊx/±–¶ß”–ÊM˜å3²Ð£òú@Õ¶j$glt1ðÍdÇU㬸P)*›&ÐT®Ñn§‘M|bS¨[§:C£ÎËiÁª †b®ÙZ/e42T=s´VµW¼jü™jüy=†/1¿<§€W!3ÍáÚhî0Ýð^æ,g˜ãs¥ÿMíûäPùõÍA1×Rm”T êõ9w¦ÇQ¥ëzeyÌ•ûªw8  DDU¹3;dLk×ík–$0,¡jtçÚ¸ç;X8 ·€Ìò­í¾ß~ùÙAþ†¢™r;}m›ŽVÐNÿŸíôQ-Ìk/á3hÑvU…;wíÐÇX£=nè‡+ÈÕ‚_;[õ–9¬Ba"TBY–êµ(·zaèýªMiÕ‹ÝOËd „ÌRë÷¦‹&·•rШÁ7v¿¢˜+iuÈÀ]ï3Lœ`²·! Øwuï½µTÿúÓòœpÛáp&š­O‡ô² pS>×Nálǹsápà ¥ ¬£jî-©ÑÈ­x+9b¡ÖÚžd$QU EÛV¦/Ûk)pÊ_ù òUóøo†p複¶RR ‘ =nM]¥é–7ÞS_ÞÖí¸½ÞçL3„²žôt´‚+ͺžÊ¿F à*,ÌÍÄ aéNë”å9j(¯æ^qö{yöé“’•_Ñßø˜”Œ˜Áø.ÛgøyÉÂG,Z›ð|39¼Í\xÏÕ…Ù1ŠâÙðNW|›y]5— VüQ¡bkÅiÞAË0•%>Õ!l鉼§yS§yñÍpæ§_ï2¸&| IV߆¾ÚT’5c¨£vþ%¯Î `磄#Ž`w L7ц6Üè¡êLQ‰f¢}H¹«ÓpKÌ;xïçïêÞ†á‡y¿7daZÃÙ„2ºßètZè9ï÷‘+©kÛ­€§FN+=üÚ;,I\ñ§©¿pRiFûGX¢4GLµ·;l p:Kq=‚%Î:Îöô™¯!7WÑX`‹je2?¢÷¸©ŒÑØÚžâN¬Ä޾4ðuAÕpƒÑÀàŠWœ¿Ù†Á³Ág"¤2³¶þŒmY†;þù°âî !íl˜Ïx6Ì®…ÌŽÙSÒsIT#b ¬¾'–¼Œ=ƒi€9sVÓ¡ú#ì«+ Lâ°‚ÁÏtŸøŽ¼f¯-FnÆ”> endobj 7448 0 obj << /Type /Annot /Subtype /Link /Rect [153 320 188.250000 326.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG >> endobj 7442 0 obj << /Type /Page /Parent 2 0 R /Contents 7449 0 R /Resources 7451 0 R /Annots 7452 0 R /MediaBox [0 0 595 842] >> endobj 7451 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 7452 0 obj [ 7447 0 R 7448 0 R ] endobj 7449 0 obj << /Length 7450 0 R /Filter /FlateDecode >> stream xœí]K¯Ü¶Þϯ˜uŇ$ ( äúQ ‹† ttQ8M‹ êfÑ¿_ÍHš55üî!%ÍLŒÄΕE‘çž÷ãíŸ?ÿcû¯ß·oß}þÏökÿû»Ï›bW—E÷ÏvÿëÍù´ÛõÞÖ®Ü~ý¶ù¾ý¾ù´ùÔþ÷û¦{áó»¿¶úßVoÿÒþûËöÇ¿·?ü©ÿKû¿ðmS«ºýý×ÃïM­Ú?Çß÷?ÿ÷æoØþ¶_qø\¿™ËÿcsÞocâÓß7Ã1Õá×ï_Û¼í÷W×µ³[eMûŸÆêíÿ¹ù¹ýÀ°|±k¬Rueëâ5ªõáKE»„nÚ•j7úÐá—Ðò wí–“-~ع8T”©TxuIä6¦èÔ” t\=ø]¡m:Üv. ”µpqA̺¢®Òaö´z ̪:%Ùìwž³xqIÌê²éÁSŽ9ÿëtZ>ÁâV%DíaçâPp‹W—D®m\Jäž–O°xeSRÎ~çÉ‹W—DnmËA•J¢Óò oTÂÅ;‡Ê€\¼º r¥t eåAt¶|‚ŵN‡ÜnçâPé‘X]¹º®S"÷´|‚ÅM“Næv;O†\¼º$r­5éTåÓê)À_š„„sØy"U/.‰ÙªÔ“âÚž–O°¸Kèév.•·£Õ?Ŭ‚·Òýø×¾^|ù²yûQÙ¢ÕO«í—ŸÛ;Ùýö¥J¹}³÷¹´Zà—Ÿ¶, óñOÛ/¿lš]¥Ëa‹Ý“¢AO”ƒïˆ®¦*øÄ¢'ø<æåðä×I©áÛZö“gÐð …Ž‡HñŽ€/ܪáw^àyàƒw ±Åàï:°¦eüÒ2ÆœþB§ÉH—¦š¾'ï3î§,ÈaŠ›z"°S´M[¶Ù¨#pºk¦Ô®´•«Ë³Ít$æv®);=¡¿Ó=±;kº O–fxå–ïvÐ!ÛÝòa —·è¼~G7ð;xð;f ‘º*½wŒwôdñ1JøNM€ ðÃáI¹3Ú©K :aþÑñ‡í‡|w¾©Ì$Â<¾?T”üÁ\óx¼w½Jù§ó„¤ŠEé: cªú¯¥á½1úÖ-~‚OJà´€ï,Fï%`-ŒSh/¸ \í~™ãô@±e¼ž©M¶º.¯‘Ž„-Íp‘{“tr_LžÔÂÕ é2IGÌ} Ï_´ƒ÷ÆxòJÇä–«+ÊêP×L1h[ .åÛÐøTE¼=§ºå•,¡ÓhÃŒ\ XSØÒÃv#aéž`Ë¿#kÓb¸½xÀon ¯f u }YÂp>Ý~€Ï…Q ‘€ïFà\„›¢—bKb O1$Æ@˜¨ãìNùPJ×4žÄ£.ÊäeƘahC½§ ‹²ïú‡Û‚%¹‘äÜ=˜Nµái£å¶Ñ,aQ Šý9„§§ß[êÓCì^žŒáÇÙêËEå˜*ÖIÿ*',w‹=ø;Ø{ÁÄ䉌…Àì Çï`: vÈÚ à¸ÁDH€âñ®1§Xevˆ\NÀ œØY>½ÞŸ£‹Á‘-ëÏ Økó\$#3CÉãíI ̱¶Ž7+â³—Sÿª¸,öÐ2š€NÍtí¼³1^š]39>·$àÙd0:±i ŸÌ})¦œRÞ´?öÃO öù‡qŽ'ì-…œs쫼wIÇ8›úìTUìªZ]^LÌ+ˆÔ7ÆOøÎí—,°&7"pð„cþIëxdMÉöuû­ è78L@htó.:öA3lAV´31B>¦‘PйJù‚nöh‰KÁŸ2'ͱˆ *,/~OA›à¿…ƒ žÇSEbô½ë ´¢ñèÀ–FtÁ0U'iÖŒ2QJY¼B%«/4A·Ô•ÝôzE9Â(%guqT÷ƒU?,|9óÌa¸«Ý êî"*¦Qê’ÄÅÞf¯˜ø˜‰|çÀÞðpTg·ã`æÏ“±’ÙSLÓo¾JfgìtNÐ î¹)¡rOÎñä·Ó‹«§oêƒßº ·‘µGåêq‹5µjíŸáÑvBQ•ó KeF¬Ú X##ïÜIÀ7rýDøÒDú8<HNA ãsbzxá¢å&d$•Êg&9c^ãÓȈ»L>Ãùn/DÎ Ò_„8=|ˆ@¶D¹¯7xšŠÓ¥U«*ëKþU«× Yb­KRŒµ7¦®%æ`J_T0å|—íO»ŸÜw÷f$Š:¸GeR†Ð#^qÑ1ˆú(ó#_êî‡ß=™¨ÜìûÎn¿mšËüºùœ¬ó,ºzÍøêEIi-;†0fؾÕ‰ ±š¿#Ëä‰óPe„õLn#Õ;W~–­ë5µo±9B&L_œßI%°ˆv<]US6¾&D±E„‘ üÀÝë „Ÿ(@vø ¾ÙŒ“ST‘TDÒ5Qn$£ÚÎY Ôø"j•ŽÂ&™¨¦È¤3-mžéY+LÏ*ÍtМéYey„Ü3Éâ™d1M/Õt:TÎô¬Ò=l^u\;;¤Åª~æ2rÃNu5‰»'—]—ÚõüO Ü> |7"ZâãvCšhÅ /cÚÕÜ ŸGvœ¦^fœÂSnÆJÉ·UÍÕ/]¡R厂 Û¦*v!v¨ =éEV¹Ó¾õ†WÃïø; üŽL².6="½½‡¶1×\Ãמ4h½éWíŒÒ—–eo.^{¯w€³ƒè þNqŠ¿søöŸô;¨ûׇAú G­íx›ž;ßÀpH೘þ¥žD$%QÞ!‰„P*€!Ò…ˆIÆ•ÍM•€ÕàcÝ¢p&pÀ€œmrß½q"R¼Eø’hd=ð\éO í€ Ö•' …›Ýíj¨Õˆ›C Î\^*ªÙšhž1'ȕԘ+á`Õ*”–lœ’Ö£éŒó9˜l§vì&à'Í'äèMQzð˜ÄZ5Êø"Úâ¼5ÉsäšRûö"h3 ²¡î…ª Q-Wñ Œ½€™›,ÇyglÙ¬ŠÆ¿ùWûÌAYaJ}ÊìZ¾èŽŠeؾƒc¨8æ85ŒâÚ;0ªfad1ðŒ5Ù|C–]ÝÔwJ/ F«Þ–F õa¹‹W#†&½b<6þNês¦L©ÇÆÑ Ž™ãØ"30 Ç¿qNƒìÀd"’lá®-†¼g†`„¿ƒ÷¦p<ŸàÌ®1ßÀc¾|Ãc›5ÁítW ðA†Gc@~3§ÍÕæ¾-²¸LB`¾c0_ÇÙ$ĈPMì ë®–•boh8ú8;ÿIŸYœ¡óßMGcs,ÅœÎ9uÑ ÷@¯Ö¾°¬Ü~!®pêKèôð( ˜_Èî #´nYéHž ëfZc1ÑÁÊ'gÆz3µU|QHOaU½†Fæ›KdÆSƒ×eÕ°)1¥üí»–ŸÐÊ”tåºú â2ŸŸ†‹Ì ‚a0:HÂAÖ' š]!2ŽdM¼(WgߦýÔÀVÜ¢¸OŽÓ5ž-o1 ׿¹+×Ó&›èÊ¿^™3-rÓUãœmþ¦ K–à«¡g(*ºpË9Ÿc<^GâkêäÀøášg$”]½ÄD}½L7ÂÁ4BÜí×kœv%¬µóe&ÖpÆdvcB!àÆB€†â†C(’9S¨n<QZ÷èREtÏ€÷alÔ¼ÅUÆ­©Ž2n£rdÂê‹áº«ž`%Ûž†¡ ™9²YŸø²0®˜§Õ”¿qÙb*æó$êAîåÊ] Ùs£´Gn»Q¡ÑgJx]@°‹¡‹Ûñ%2ê9j¸*ñxÓü)0úÚAŒøŠ˜,wëÀÖ=°°ÒýÀÖ½ßïìs l=ºµºBN‰¾i”ÿÍQQ|P‚Dœò üò˜‚‚SCV­;=Ž%hÚL”‘PQSÙü?Y·†è0UÊ©@T> ;cÖmerY‰´N¤ÏåE›«Ãq†z3Uúoõ˜÷z‡#R»ˆ(*#2JÄÁS&>!Ú«_²ÞTJÒ¾&òŠAÍ\4B‡Áîô¾ÿÕ5ÃW´jþ(~žb¬(f¸·7¯M¢Ÿ¦­)«<±)ËÇ*•¨UƸ—”œÍ,o޽Çia£+ÏÄB#2E™T%fD Çw%F°Èª«š8•+Égݺªˆ+)b‘‡ËJŒ ‰-¹½ÓtH()åQi=Ä躢©‘Ì­ˆ ¢~BÉ!;3:$'ë¥MÒ¬Œö 7L$Ú†Oµ+LxM«Æ×cÏŒ&Ù»=Wnøƒé[)Ç>©‘x“mð!:51‚ŠÞ¥L]/©¤&yêö›ôœ$¤âgœÔÞÐò’üãz}‡=Û±ðǪV ˆŽÑxFž%0¹ZÑß{~XX0UXL¤Ò¾“ÞÏ\:ß:Ã6‹(·Êéª3êˆdƆÝ{ø ÿ‡GÓÎ?úïÍLŒrÅ£iñwƒaEGúæÂ‚fγ„­ÑÍ¥êví «Žžk(êä€ÓÑ)©LFUÀ1J¤þgㄲ*e„1Å_…”M{OøI(R==ü›ƒaZpfk¬"[ií} c*§.}¹ÆƒtF½¶%ÙïL^Î{‹Þ&ŽîÄèF·ig‚d›ÿ$¢`=b¸RµÆ¤o]®/ƒ@½ãúìK© OмÆúÇ~v÷YWÔ9 ÁpcTrsSˆhÛmUs}Æú²«cå@ïÝSÅ® gl©BOz2*wÚ—%x5üNŸyí~ç8ChÔ¥õå(<'^¯;_[­€ïtÄRíŒÒzáIUG”õΌЛ+‹´:%:Ã)3hÂï œÜô/Ýð„òYN-áY(º¨ê-[G5]é"?êEØ´³ e{XÅÀ/ÓÈ5Ù˜ñ’GHä>CL8xÌøÅç°'áæc‚-s6Û/ËÚ—묃§KD?rTæòaQõÕ _‘m71a'Sf ¥ ÍUt.‹\1-ÊÊŸÝ=¨Of“Ã2)±‰TEÊ$s¯“:»úÉ­g6cDw“\|K–1‹„ëK¢AÎdĺ8ŽÁÁÞ\˜ˆ‡ý¼¸ìXã"fœFºãwp9pÀa@´Îè÷vÀpûkû½EeÓŸ¦þ ÜÀ]-l/r¡öFÝV‰x½mr9u¬®¾rõ:ÛDïôÁšÓH5~Ògè]5rD*xÁÞ£ï˜)öµ½}ìOŠr¡qÌÑž¶TÀ;ÄÑûËí&¬{]9†Â«Áwz.ª¢Ž~Ö%¸ýŸ‹#ÓÑvºŒ'¼&Ó@bÇdƒ¡ a‡©¤g:W®A`ð;½lºö†¦`LYλ‚òoLà\CrÐhƒ ~ç¥ß}ïc¹å Þ[o’^cƒ~ :ð“ˆ!×85ì­ ³ëùýÅå…\ZÃc÷W´—|SRoûióª™z= endstream endobj 7450 0 obj 4846 endobj 7454 0 obj [453 /XYZ 38.2500000 416.750000 0] endobj 7455 0 obj [453 /XYZ 38.2500000 416.750000 0] endobj 7453 0 obj << /Type /Page /Parent 2 0 R /Contents 7456 0 R /Resources 7458 0 R /Annots 7459 0 R /MediaBox [0 0 595 842] >> endobj 7458 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 7459 0 obj [ ] endobj 7456 0 obj << /Length 7457 0 R /Filter /FlateDecode >> stream xœí]KäH¾×¯¨3ÒÔ8~Ii^‹Äi4-q@Ð, Z±+š=ð÷quÙÕÝéúÂί"Óvu1‚:ÛùˆŒŒˆüâ‘ïÿøíïûþ¶ÿéÛößû¿?}Û‡º,NÿÙÿ¼{ùÛúïë¦Üÿe÷¸Ü}Ý}íþ÷qwúàÛ§?wÿúßÞîÿÔý÷çý_ÿÖýðÇþ—Ž¿ðË®6u÷÷¿ŸþnkÓý«8ÿ}üù¿vùÝþ×cÃpýd^ÿÿwÞµMåŽÓ˜úq7,Ó<ýùíû¯»÷'ÄÒÔmm«½ñÎïMëíþ¿ÿØýÔ 0t_ZoL]ùº¸f ÚGªªfolÛõÔôôG©û7…I×ùÓÌÕ©b\eäÞ57·)]O “bsŸ»OÐyG¢„œsœ¹:U†ÍŽëmnS®>¨-Õ)ô¢w}òwÇÖ%;¸ý̵‰rÚZ¡sÍuÆžÈã¬K@ s÷)¨_•VªÎŸf®N•aoqïš›[7>L~Ù}‚Λ6¡Pxšy"™,õ®¹¹­ok*ÅÉ}î^¿sS4 …òÓÌÕ©2l.î]qsiz[¶®ÿÜ{нµU2K­Ÿ¹6Qú­Åkî¬+Öïþ«O çît^ú"]çO3W§Ê°·£Þ¿Æô‚§rú ¸¨? ~|ؽÿÁø¢“&Õþá§nrOcžþzèˆRîßoçÉ~Üÿ¾³Ë?ì~Þµ‡Ê–ÃO-Æ¢ßÀoZØâQ‹­á7QK[ì­‚-p=öfáJñÜð8n» PÏÍÀ–/°åS¦=ųþAsO…•~ŽÇÁÞ¨ý¹óŽÀ;xºaNÄ{ çæNÔùòÐ úä2ºl'O†ÀÄÞ gËAü œæØ»¼Õ>3Œ|Z³M°’³Y7«9›÷A½)ØOx±¼„§ö­sb£Îü>²QÓÝ÷_±‘)E뎞Äp{›CÓO3 ÙèRK [NÂż;ù+ŸÇ9µs(}Õt¡¨*Îv÷ðr¼‰Æ1.¾¯§ßÞ -Þ¡õà•º“Pnžµ‚ª„<74ŒdET‹°@1—XT ‡~$=?¥Ö–¥ Õ%f~L:AÊŸ–dÜðÑ;ØuUN%A¸Ž×^Œ& æuÌiÂâ_…” Bwø/ùlÿ¦©À¸´-)›ßá0ºg€ñl­CÛßâqœ ã (¬ßÍ>æã¤¶(¯á$⦦{óÄßøcúîÑŒr ¾ƒ‚ØS¸ŸÝh­¿‚/—G¾ü€ZJ¼[ø4aYNHy¢EÄtƒ(¢ Iá©-±Ü€»€i- 5xn9å²wIøy¤nYÊO am{U?Äßz•oäø®9ÿÂ*X¿Ð’í÷a1&‰!/ qÀ—†ù+­‹Á…ÛQí1^Â@£îÃ0à°ê+&ɵ1lÀ€Uˆ>= ð‰7/@øu¢Á+Å$¡™é1*S†JŒ€+{];KNcTiÔ qîhª÷ö]ò|à3L‰Oª®ºaäËâŽ1ócšÏ)ÍCyÆè`Aš0ç³V3KÏåÃê´ 'ÍAÓYøf¸c¸þ£-ÂÜàz°¿Ð[¸•x["\V6{.û`4%ìVÑðߘb¬#Ë ž § Ä ckÇ܈ƒ)ð¾¨bÓA7ü ÔQŒ ”šÒè²ùqn¡,xìýeìg"´Ɉ8Î$œòÔŒ°wc³ÿ&5üÕáW´"êBMÄĨTFOFhC<0îž¹p1÷hì †3ˆõÒëãÆ…—"ÍçžïUŸ¥ãT]ÜEµHGÅfH>0Б„ÝRÑéhá7B ÞGœäƒ]fØ ¿IúœeïMÑÌ=Aéµ¢©Î¾8ø”Ú³Mlb…õ|ÌJ×¬Ô ˆ¦‚„]Å>'®vÓÞ§l·[&š“pFêú¿”3ب„Œ(°¨.¾Å3ÕLoûÚúæ Ø/ïÑ:&òˆb6!’ÏœºÑ2ð¯bT9Â÷“ ýY¡ç€˜¬nŒÒH×SŒ¯&?…ëCcG&ûZÒ?*ަnƒUS®sær³ „ÔŽöšÑM*®2v¥ &Ž»S¹6ùª§E1¢Ó†íXF;ªÜßuCL°Gly£;Â0X M˜c¡¤Þ-<ñªæ¤œZbîËøR‘·fU­6ÝŒQË¡"^. ]ÂopË]«KëY»V÷õù ®å5ª„b´º. V-‹á™Y½VoëÉùÜšV7p±¼nÀ˜Çà›…ønŒ%)ó¢£®ôuØâV=éøœYCØüÄÙÌi « æ·†Ês¾Î 4Ö÷KžÏÄ¥½eB‰ Hy$l8<ÎÚµhùdÿv´(ßn„Î)qÏŽ¹œ·2ç[/F¬sÕj¯ªê5á/$î .ùþLÊaNT^.*zŵC¨Ä‡L‘yTNwâ±­* Žu"ºŒ‰xÁ<“ç Q´S¥n¤rnhDôïŠßçÊ–±—"N7eÑvëÍ@1Îß"ÜýÙc;5ê.Ü7’5k®Õ$è,.±nԨȤSñMwosÉv,s5rC·)å²du¦|“· ¯dTk\ÑT<!’˜ò”I›¿¥R>œ¹èfüR‚‡) QÜS/è¾wÁ­uLÖÕÉ€©5å)³O y6U@üŒ¦àø˜ NšýX†{š ®Ì&Æ4²’b zÌ«óS›” ÞFȵLUÙtßÎÔMØÉV‰”ÏIQÍÞ´ëiDZm+Ýœ<¦8œ€‘„ªPKÏFåÁ†h î #ŒÓ¢o†:vìî9µTglÀF'«n´½Ï¶Pëê LyanxÜ›0H7£æQœÐûõsêÇ–ä™ôMzâFõƈ­ï˜òl„_"âÑieS. ¹T±\ŒÈhCÆ3§RRBS4Þ€UF°UK-‰ÁõW29ï¨Ç ’£¾ö¡ÒJ›œÎ@TW.¢Ç<›ˆ…ϨàiLñÅù…)äõLIÕ§ð–«H‰uSØltM×-’–3U@•rŒ\bL>å×µo]o/Y&­mM Oïøª’%ж1CJ“䂃¤q`µŒ@„Á˜6„ÃÁ™ÉDr\ÎpûÆUÓT$Ò¿„”$œPCôuSl1剔œèFõ¿ÉÖß”ç7ðéÍglmm~¥=¨œªfƒðžêÝKü’¾˜„ËÈY•©mΙ(XXÜš¢PóÇOÒ×t󸂾ŽÈŠèË8º1åñ8¸b³ŒªÂ&¡®-V°P‘{\+€™5Î ‡½y|špµ’»3N†-®8¤¯Àc˜"Ä9ópO<¦¯îyÆ\Admêž&3vñ7o‡n˜wît“èÍ|L·þœæ‘in°¹séŒ+¤|ÜžÀ¹áql>ÈÅå¹îÑ”6I~õ2Æœ,Øä£¤Ôel„–F¸=G9•ÂÅ7êì`.Ѻ‘sJ€‘þ¥j^g{^*Wªóæv13`B* ïµN/Þ0Œâ0ñÔ›ËS6¡›¼ƒÖE$µƒDâ ªÜv­¼§ÏÆ-}ƒnäž]Áºµ… ØP¼„cšpÌÔÖ—j‘ †gÖ‘'¤wlÀ{“ËðL"OSª—AÉ>²õ=ȬõðkT±+Á7†™Q#&‹‰_g®8ÊbvÉC•èZ_ò`šÁTé`6T”‰n"à6_VÔ­üÅœ"xS·ÌV†ØÆ¢ µäfRm*6\%m9W 2cWQ¨#­V˜öEÄ6 –ÝRÅJ•xVz»ƒNð¸@v /»`/"¬w/Äÿ$‡(Œá"é•Q7h Jq¡°ð©2¼馫Ÿ®ÈCÈìVÍô¢WˆGæ‹ 5Ö^»¸‚­7“D~ã(›<ÜçÏÁñ@0þ·‘ɸ¾§á!}qÄŒ07¼Ã86Gή%:;½4·mú‘Ò¡.l¹©O¥ ×—˜Wrù!ÛfyÌ’ÁO;¦AÚPv`ÊöPÞdÂû ´¬8 qy–MÇS%­xÒJjyÞß1V” ²¹Öºò©Ž“ÝÁ–+i”A>™’e˜STK#+Œ(Éñ„Yoç;7ã¢B¤9NÖiH¨š&XÚ=¾6. ƒ‘nw½‘Jo¨–ðDz_([Ï”‘žo1HøP#6æÙ³{d~ú"„/…nZŸ6UPk~]Ä\ÎtåpΈ [ª÷Äå yóbR'9×Õs¥ˆ‚ä%iÚ@‚a'àê.ÜB¹ïp}&¾zUR›¼¼l”'3ÜQAèáƒÁXsóÍUÈÜŸÜ`4€k‚zÍq`ñ¢†úpÿ%†ÖP†°û79!B—!œjɳ:k¯XÝ›S‡—z˯ό†qÝBÚPE,‰Ê;Ûl) $´ðÜ ãàr˜—ñ7¸š Ža_xš˜ZkX:4À%BqÅ;ܦë†å™Q¢T×p¹`=à˜8È—LIá4a¾Ä3 x,«ü¯Û+vKÐÖwÍ;Eù¶¹‚òk·Ës1õå‹*›²LÒÞ`1å¡žŠ£ £5¼–úbu«ž)ó9|îéM¹OîŽW±û[s¼nó»¤Ñ§w6z §©(¦7•ʹÎÔd•1|îuÞ¦_Rð$Ž<|º%˜°Gc¾gžy²AåILÝ·"bb˜\N& ra§mbû×ûPBc$›¹ø‹[¦¼I«kØËpÒ1ëÆî»´LÑÚð~ <“Áƒä¾ê¶1/ö¢zh 2•ˆ SJpÈÂXa„AN™©‹g"*ûÙ1Eñ8Lr®À¡Ôk_ÝÎMsf Rr‡¹ «2-“±æ rBd\h~MÖiÎ<¶ÓúRÇ™2B} ¹”‰šÎ ±.™üöP±5ª‰EyDÝs\x-¸Y”¡ \“åFQ4ê {€H)¥|˜À¸PªVT ªç.öø©jJ½n vL¦é(°˜‚át³7F’G5CÔ£L/x¢^@aŠªUé$×M5×Ň8 Ì“Ï`éB cDŸ)$D¨g*e7ñRÆFý# Ϻv1ªæ2ztxœÑ&ºµÄ5žúP¶àÇÙÕLtζa ëLàùx7"Œ ¢¬²aºxÙ‘I¬)=(WÙ!4Q×^ºVqF¸êõ_¹Ò{â "Äk¬Ð5Þ8Yá ±ªê•²Òñ8‰Urf†I|c=¥„÷‹W¢)±>ã…>b¸”yêÓáPcÂ)¸ÑçƒÀ³¥÷Ä÷™w5œøÎ¸?Tì…ùÑnʾ-…®½¬1ÐýÙ?vrJc_§~a†œk.‰9×±Uaއ`oϵ $Øiñõ…%žøÙìS@ÈË–Óu¾·ôÑöÐÂD6Ph}Fã¸)xðÒÜ~èWŠäfyÊk¬[«ñ{nÅÈ(æÉ Ë0¸7øMÏ­&jé/ò‡X†;þ»›ñ°ÑvýóQ,€{Ã,Ч¹aép‰v˜ªv˜Kzùtá3€ãôwãKß``ÆœÕÇ@`¨ðÄëˆF8,`ð7ûÙ÷ajsZðÜz4õ’°€;ˆég ¶Å-‰¡ÔxY׉=³uá½¼ux¡”¶pÙý7½æ›Òzû¯»ÿ3F®© endstream endobj 7457 0 obj 5259 endobj 7460 0 obj << /Type /Page /Parent 2 0 R /Contents 7461 0 R /Resources 7463 0 R /Annots 7464 0 R /MediaBox [0 0 595 842] >> endobj 7463 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R >> /XObject << >> >> endobj 7464 0 obj [ ] endobj 7461 0 obj << /Length 7462 0 R /Filter /FlateDecode >> stream xœí]KãÆ¾ëWè`µì_@`Þ9Xì99ë8™ø¿J$¥R_Sý±ªIiè=cµØì®ª®wU¿ÿã·¿ïÿùÛþý§oÿÙï~ú¶Ëežµÿì?ï^~`«C÷÷¾¬òý÷_vÏûçÝ×Ý׿¿Ï»öoŸþÜüõ¿½Ýÿ©ù÷çý_ÿÖ|øc÷¥ã~Ù•¦l~ÿûô».MóWvþ}üü_»¿ünÿëqÆþuÝb^ÿÿ;ï³Êùã2&^ý¼ë·iN?¿}ÿu÷¾@Ü[ªÊEµ7¾ùÀÔÞîÿûÝOÍ úé³Cí) _fs^TÚó›lÝÀ&½çô#3»Q˜¼,¬Þä§•KŸÂ'—Äle|žæy]¦W˜¼¶¥Þä§•‹C¥Ç-ž]¹u•µ* ð÷³+€ßfy®H8Ç•K¥G-œ\³Öœ¹Z©}£È4­sŠ“ŸV.•·Ù%‘ëª\ïØ^f׿/yÂiåJÇO.‰ÙÜ8EÌžg×~^é)iíʵ0 '—Älá3E=êÅô “—¹"ÝœV®¥Gf—Dn•õ,Ó9]¦W˜¼vzJr»rq¨ôÈųK"·®3Mä^¦—ŸÜ«¨JV®†\<» r©;Ö–—à¯õ§³¾V$œãÊ¥Ò¡O.‰Y—=Uê2»ð]³d½É+WR¥ðä’˜õ¶R<³çÙ5€ï+=wW»r­3 '—ÄlîzÂÏ3]¦W˜¼P4›Û•‹C¥Çíhö¯1³à¥´Ÿ€PÇsàÁO»÷_ŒÏWìŸ~jwzgûë©J¾wtÝ7ÜæéÇýï›%UØ?ý¼«…Íû%v#Ž|B#ö#©ãßc<Éál?į¿Çµûùá©A¬:Nì û†#„¯!0̬ÀÂ_Âg =;uuBl¹ºëgýõ Å46úi1µïQúáôJð®è^@]¡‘î`\1-T‡ªÎN»»<ãÚ‘ÀøÙjøÕÑðÙŽü®Í w‘µ¤ä¹/ªòÕ3eül®'æ²È'`Ò¼+/ö.Î ¡T@(eñû²íˆ1ýjo€Þ  àév2Œ`øa ÀÙ:©u ĘD?·éb°cùÁÙÊܸÁÌá ì—ÛaŽç!QAø€2$ÿC:¶^ù²'—/+VKŠ„)Šéxb”ªP<¡*ƒW€•ŠqJVc?ÀÙà{Ìbåà ¡bT5Ö\·¼R¨2YL/ðláÙ°‰gÃ'Õˆ-¸SLÿgxU> †ë¬×6'9‚¾ê[çg=*f"R( wœËwF'…b6 ´ =b¬ÇâéšÐÃàVØ ¬£‡Qî!6(³ “&kl^@ó“ÙÏØÚÄ‹e´oüâÛÙ£(o¯Sñ‡áÇ<,ÂÀ¬‘§2MáR–é8©Â_Å6öÈœd¸$ÏÁuUŠ<χ€NäÈ´¥6ž4ØD÷ˆ¼¼…”çˆK's9wB«Ï_ñDuúü(™Ïñô-üLv(JóÚã%êYSÖ§ž(ŒÁ"=Æ_'*ú<Ç –h€.˜±1éÅWägu6Š©9 |ážmìHÇKj¿j\?ÿ-º|†²|Gp„` ìPCð ŠRð{dYâ»´ù))‰ã]¢Ñ‹c…8{?–’ð= C¶YzÏ?V’°é\Ì6svD° ŸrûÃ06W }á…@ ã‘ }‡-,sCXF(ÿ&0‚a€CŒðLñ`±Ù3À)¦7&7ŽQöƒG¦‚Ã×ރ󰘌3 bÕlO­Z=Èd³ªÏ H¥ ­ÑšOÁîM ÏXeŒŠÍdieÝÚ®8•Z 7ù!«Ýk=&íu'ÉØ~è–Œ¼ÎØ›…­l«DÁâ¾Yz…‰H`PØrdf‹À:ïÖZÒ?¸0+Vo¹©ò-"r@Á…9[¢Ž(&Í•¢´åéÆü™(sà™»t’-Ÿ½ÁŠœ ä\)Ê3˜aI(2­².ëdÜš‹](g@?Š×”Ч»4Ék:C>'ÍP˜wCÁ™ŠoaNÃÈãÛ)- 8‰hy ’J0fÙ”ÂÅ ¨€Ä&8œÁçc±ü»4¨ìE2‚Û3±R‡NàdÂ$qö¦¾ÃÐdå$L‹I?šÊ°QÜtå›Þ“Öq¨†ìž2ÃF“Œ€¨Û_éÌH@ ŽåBU¥Œ†M I@ g* Vlac­s…ÕÏŒŒ‰0Z;“³Ë¨kÅ/æ‰B2T„¬¡.N‹¬ÈÓ@ñ Æa{Qiº©âžº'nOfÈ)`î.NÐm™@)ö}Ú¶Ü(ÝK6×øÁ’eƒn2S6Ž›apÝ^†˜D6€+âÚ%âQ1²²¤.æÑååb­KT•*aª3‘á*lÍÈ{Vdâ£X·*„UÆÓb<¹x± ÝET .ÖM¤Ý—l-"ìööDnŒ=·uI›]€cêüõ2âÒÃoëpQ.n`RñÓµµ*1¹žåÛÇ⢳„Í[­uç’ºÍ[oXO¹µc^ÝyªoØ÷⥤_—­§²uŹ=¡;a}ëíiÛËw°ÒŽú­.Ú ’®ËlU ÎcÓðõð’1EfÖÕÙL>ÏÝ5” «Ìxx]BS¶˜¡pIñN?„Íf»ÎÖU¼©úc¹âv ;|Û§3 (x—m°°5™4™Àv€\ïï ½Û×ö58î¾¶&¢oßíêö¤¡{æbK¿bËŒ)D7tùvbik6ÞVQ Ã‹Š³ÜŸç|98¤3|XŠÌäxÅçUf¢ùÎjÄÀ?]Ú9F-Ðqsœ¦±,±ûÒ ‰]Lá†ï¬†ïd!»åBf’T}_F~W"YãAš Çç=I0`Âd 1ÜS4,¾aÃbÖŒf±_ÛÕþ¥,„õ¾25Ö„IéPj6ݯ4­shá _^ôI ©‚V´¡%09oBœ:ƒâ Ŧºú=CdøŠ6ˆí€Ã/#(Q4õ…êÿɬàÙ0D w(åB…+èè@ßMYœ¯Ùî²c„ÒºFD†¨hÍ,UÞ(ë:»=ÀNÕ+bË“ñ¥51š_ªB,ÝÔ…å/ŒÈ¶ Tß=jŠô›Ëˆ–ôehÊ¥Æz-˜Và\Lå§aYöÀ’ª>[¡coƒñö趒ó"üb\„ˆ!ËTfÞ^¬³ Ó>À~6Qí§{Aêjj"5›fæõPÐÝUµeBŸbQÞÃO)“ÔŠzÎO[’ZöF’Ô¦)©4f%Qžæã$KÈÕJw~+áñtØã‰¹Ä0å%e0ŒýÎ0–; Ü6Gì'àwư†«f¼Ëßw7õŒ¾¹¬Î¡¯»NÇ zPÝžsm*÷Ñæ¤¸/'öˆäµÈÞ>“ï@Õò)0T¾ ¬ŸAöÓm_¶£(/q”uùMafºÄ.ÏåÏ帘D%l÷p?CŽvri"^N±­ˆ|7Ì“nE5Ï'bØX•ôâVÂsêsH¢éÕÔ Ê7‡$j'h?M\ÚÛ{ëÜm²®u÷E€®Y_Á##݃I?Â?Æ0” ëè8² úò:Q¸˜´*æn&r³Â ë5T¨ÜÖPa‘|k¨pÓ VYG¬ª*‹”dá3[kNÎÍO­K÷ÖúÜÞ³£ý(G]Ô¯|÷ =î*Ýdá>!y1 ‚}BŠá;¥¹ÄjËì—t¸2IjDÊ U± êýÔ’‚I›js¼rÀ+ ÅS÷B1Uóº}„›ÿ` 0•ÞÌ¥·½Rù&ï {~1Þ£¦Æ3˜dÊ$©HÏ–ŸPš5‹j¾we«¤3¿]æç$‚? »ÑeÅœ„æÍݘ­Àµ w£Ëªl%%s7âÖ1˜–‰ö˜*ð½*^ÁPì”Ã3n6bÛHpó ,p L×ø\ÆÀ4¼ÁÜŽhk#{‚üÓuª>x?¢wú¨ÊØ¾ËæBNÌ }ƒ<¬ÏÎ%BnÚËY{zϦ¬\' ä¡Á-Û•šdlÐGqÕDåiÎäþõ+…·²ùÇ‹µÎp‰”²=h„èAbñãü:"V¤£Y š DýE²îÛK üçîl¥ e˜B‹¿**'(â˜ZµfUš1±F1•Ë¢™€.Ón3€ˆ6£¢Y[LeL ôEt€§îN•-Œ}T>j©IDã°J©oLïZɨL„HAÍr‰“‹Kö˜” ‚¹Q?Y9Ù ÉàtsšúÊòBYIñ Ň÷”¼µžäd¶1²1B¨ˆhmŒiÉhzë+òî´Ž®³sãE•¢{w„PZ “»©/[ó!µ“ýÞ­Í^è®ÏS¤]ø›®$ÍY{.NÄ1& hXˆ#ª8¾ã>8ξü%XK£0ÜÝ~Kiø¬²¥Óþh¼±|YÖó~Ùv†A#J!°.âÏèYøè1ÄË\›µ`ë çÜ ¨:Næ¤âøËç9>Ú“· Ÿaò{º“çˆs[ˆœ TtŸ dÿá+3ñœ8›k* . Êç\öJóÝøÓ¸Pà‚SŒS"ÏW6[Žâ\ëçqÐa8$Á½±ˆ3TqÎ"@öìÔ ôíPŸõÝʹ‘L8B¤“Óvb4=Ó¨”é¦2ã®ÐTýý„ƒD›íç¶L£‚DÝ.‹E 16Û×ܘ‰ïo®)r;@‹Ý¶±šŽ j­²p ™qßçOé¼ò³Êþ—7qyÜÃu§-0ÂFSl÷† ×Í Ü Jyƒ27}|3(gj›A¹ü­`²I†Ô%tÊ·®/»1æ@¯Ï€}”K"$*]î­ïœ¯ÝPˆÝU:jBs+/æôIÕeé,‚ 1ÙnyÉÌ“·3²å1èôzLÃQª9çàn{o§»Ð Nࣈv´ Pìà ^<Ñ¡ó|ðÓ9/{á¢h~öÏ S òœ¯S_¸A¬®1$×hj »lV¸·çÖAª¥-Ê+šZK=ö`Û&/FÚ3\ŒGÜçî™Nc~mMŽÏè=nÊÓrmm_º"¥[îþ²¤ .Öt[m°c“¸à; ®lÃàÙà3Ùe¢¶^^È–%¸ãßÍŠ{DCØÙ<žðl˜º2lƒ]ƒ†*„¦’Ž]9À÷tükÏ`` Æ”U ŽA€ †'&°¯¾ÙÌh‡ ~æc·úq»8‚×Ö©)טÄ †Ÿõ”x$bÈ5Ì‹väì™-3wèøý«Ã ¹´…ÛîF:É7%õö_wÿâ$•w endstream endobj 7462 0 obj 4057 endobj 7466 0 obj [455 /XYZ 38.2500000 77.7500000 0] endobj 7467 0 obj [455 /XYZ 38.2500000 641.750000 0] endobj 7468 0 obj [455 /XYZ 38.2500000 293.750000 0] endobj 7469 0 obj [455 /XYZ 38.2500000 77.7500000 0] endobj 7470 0 obj [455 /XYZ 38.2500000 641.750000 0] endobj 7471 0 obj [455 /XYZ 38.2500000 293.750000 0] endobj 7465 0 obj << /Type /Page /Parent 2 0 R /Contents 7472 0 R /Resources 7474 0 R /Annots 7475 0 R /MediaBox [0 0 595 842] >> endobj 7474 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 7475 0 obj [ ] endobj 7472 0 obj << /Length 7473 0 R /Filter /FlateDecode >> stream xœí]Ko举÷¯Ð9Àôð)Š@°ÀŒ= ‡ÆÈ!È!˜ÝM°È.âì!?ê%»%}T³T¤d»3H<1GÅbU±X¬?þéÛ?ªþ^}¼ûöŸê{øy÷í ŽÎŠî?Õéχ—¿PÍ1ü½r­¾ÿzxªž‡‡öŸÝßîþÒþ핪þÜþ÷—êooùcøG§ðëÁI×þü÷ù§w²ý›~ž~ÿ¯Ã_ÿPýv‚ØO¹üÿŒ‘8£±0õÓ¡_¦<ÿùýûo‡Òfi]KQI£M%½QÕ:üÜNЃGo¤tµqbÍDNf²º®¤ò-$+&ÿ0ϼnÅ#ð3æìT‘-kãÐ9™ë´ëäê  ç #U>àg̹‰Ò³çälS›Œœ ç ¾×>£Øœ0ÏÅYœ‘³FÔ‰ð9èomFæž1g§JÏ\ “¹µÑ@Zg Ñ3ø ÀËgJu˜³S¥g.†ÎÉÜFe4¥ž¡ç ¿ùL©óL.ÎÉYï{Ú»,Ô÷ùXkeSnN˜³S¥ç-†ÎÈ\«”èd]òÐsðV¹|çm‡97Qk1pNÎjÕ²Òd Ð3ø Àɧ‘;ÌÙ©Òóvý! F¥û p®=E>üüxøøUšÖ¶“uõøs‹ÜyÎîÇcK[}8ùŠ”©¬þ(„þúCõøËÁke{»iЈÐhD}†ß(8Ò¤c  Öº>|ylY‘Š­­0½ƒ˜Z8‚©x)é+kHß/éóD0€+ÅR¿‘:kqWõºÜ' ³¢)8OyòÐwSHàj{¦Â3 :²é£5uã.FºošcãÅå7RÁ‘AÃ#ZvІ_˜Žûæht¼óknÄÀ‘!‹¡m1÷ \zÐ=Í5(uiZ5òDvB¥-0FŒ‚b€W¬¯_ñ„8û TL-,‡iŒ#††Å.C5œÜ—÷¥î?º÷ü˜ÄxsRöâTTñº @&H„ÙP…EÀchXUB¡Rž I°€`9™o‚ž%­”íüE'¡jtîQ;brSÎ`¬+–1'Xøø$¬$M@¡œ'¢—1´Éé5á-^—&o‹4c† 4Þª¢–ŸÆC&Dô&Ööî†{˜×Ne>)(Bœã yv°¼_Ð>BïÜõ·BV=“²S ÇiwÃyÌ.F,ûœ$’à;ÓØã}gØëç‰xŠð7·‘}|"ÈüF`¯Á—ˆý»ZÄà ¥WCháN œ]iëYÚse´PãWh! ï%ôÓG¤û‘ RAÑiÊÉïÑmLlY<¡‹ˆNãÝ Ñ¹`·‘Ûv;ÀÖj!%k!ŠvPX^A’0Öø›%ËŠ~Ù;rHÙ_´žÑÄÇÁ§îfiÑŽ0É#‡}·[ù~ŠÇ(Â~…œBG&æ…Ô~)ܧçYÝò{Œ‰@¢|ûßm$ê e5âûNØ$8¬50v­S"cd#»R6â°ÛÐ?j|=:ÖDp9Šcíä%Q1évì§D#ß|Ä)çö÷ÂH¿2^oˆïCŠœ( ¥‹•!ÁÌáxRJ–.Ì[¬œ¡ÜÖ×ëØ1ˆ( JH‡#|t:ƒæn*éç4·:+nÓnË~ʯ½âîLþòU£‘ Çö¨Æ÷ L‘¹o<œ§éµJwÚ¼€æúÓ]x}åž'ˆÓ nAÎá¦à7>}D@Іo²_^0½Ó;8–gL'Ý{tÿ+FRÒ!p²l‚±˜p\¯WHj‹`‘DÌV|*¥º YŸ,Vþfi2¤4ŒÒdÅ¥¬‹ÌÉ_ŸIÄë<‚¼µMÉê÷X¼TÎŒdIÉ™çªüøX{UI7”’V?Pæ\Hʽ&&®:Úy} xû­¨ãÈcîÉ)g2R¨KÚ%År"ñBœA(h4ÆCˆýér±?#•¼¸¹h!‚á#¤bD*LAŠ˜em/=rKc¹b»^AEëWPÑÂÌ–}}]³‚¾˜V‘Ô2JÆkfJÆ.úÆRs<0ï)Ð(XG2'`~DDþ ù48]p'ò?dÎQ¤Oc)Ç™sxÏàœÞHÙ3¸IA÷Ýä/ò¯†œ­W*ÿ”ŒAÈ“HŽaÏÜäÿÈ¿¶+ä×|Ä™¹„lF,ËÅl@m'’dÍ IÚ%MÈ~à†s¼qÛ(lI—ä£ë[@i¬»J…Gµê¯g¯»H<‚RBà´Pö %ì±Yâ3¥r>ôZÛµG»`ý¯ÑÍAO(\ØÞÑ« º5+h¥J…®¸©ÀЖÚ2|”kªMßÃÉ•fÈÀkäb7Í2¼×Í÷ë4;¾ÄQ®]åú_c×” “xÏzàf RÑÕoY?x»BF¶ï%l S„"¿'O)ɦÛ^ÚMÁK»•½óE´¡¬Ö—û$¿CÀ6ýÑó¥3%4J`)Å"‘o UTábK–R½íÓ½#óLÒ`'¿È’OIòæuÓë†7&J±¢¬…|Ìå¬y3ù±ª|‡ùæùc« [8ºjÕŸ–‘‚^ʱ@©£œëÚÛáv;ܸõ^¤G =((QPZöSš†lWvÍÑO‚tdŽëH;w€Ð"Biv ªMšRXeFgX$¬Géü‚ÉMxÊ%%ÚJ±jXT“jŽ&²ER÷†9È­~«5N”›ûöÖÕ-~¾ÚVÞð=dE<õ8¹ÒwYõàÿduqrU‚!cƒÒš”BÅ='hã¶ž”æÂ{/§rCDàýÈX©ÔÕˆN"¤T• ;¼9¹}Ji#†'¸>AÛd««^­Q¶ï³Š{ŒnÞg5øùçFÄ`¥Œ ýÌH¤gjÇxwÔ Ò0‡A7O}ÔRÍ‚só@¬qGYQ*?ñôºe˜'ya±S&âi§ß¥ê‡Æ‹Îu­ D£)¶tJKvxGÀfw©ì 榟 ¼>$ÈÒš—B6Rl‹R%eSây(ñìRÍœ 9 $¯!Q‚äJÈcÁì'4ZÅÞ;fraÝEpZPæYt1fM#QãSòÖ=õšmþšz¶¿©„‚N+ôÓ]æ”z&µ`–€}ѧ7Z)ƒi=Ô,ˆ¡-ã#Å«ÈyÁ2ËêŠ81Yy¥òRÞ—hM§W¢äððöö‘t+½¿œrÎ×ÁúpÆŸä½ðC ¦ïYÞ’)ÒhAÖf$+´pF)–^ðܬ=)Ñ o³1Š»ßJ]¢W$gçÝÚø±Î¤¤7…vÍõ›"Ù¿œq?A<áåŠ.M8=»l7¯­{Ëëö¦ÏöJmõ¦Ï©,˜ùe• ÷6O‰\ñY3"?….±¸;5Îm*‘È¿p±Ó¢Y³Åyß,”ÝüFtJ¡žËÉö[š-‰­Z)9^uád숙ŠÅ‹%ƒ¼„T)ïFô-¬¦sÞNL}µì0wC(ÀT¸êFVMª9§ô¹"ÜÅH7!Ö¬ŠS)!ojûZsìSâmÑqýí†äæÂw@Œ,¾òá’¥Z·–ŒZ7£.©'t׊Îb©¯ãH *y1ÕõPJ(ˆ(e!àëÚÊ~XË4îKyjŒPéÜ‹] pž,²Sfg¬z•£TæÎHØüßvigl¯]ÞëÞ`)å«x¥§ ¥„ rÁ°5W½B*V½è²½TìZ“îT*ÙÆõéR‘Ê*JÒG+¡väÆÉ·#9-ò>m SÚmÜð¼áè[-H¹ŠR’(ˈ3¬P…'_‡òxEµ}~EdÕŸà7¸Òy á„!Ÿa1„R«–IÕѰvÜ@êDhç‰àæ8×ù†^¹=•nÊ[¤½†óÜÕZ¥~^~XSæÁG ´PévVíŸê©ÕƒQ5ù°ô®0;›ÙxWk¥´—ç¿J †§„§­T˜S,ª£êCLôX= õ­ê›PN³ûÍ£—Œâ9ܾ†•"ß:I™±pbC°ž.0X¸¶g–!14øM°8dÒÒ_©wú{‹qÏhH»ð4`’`hX´‡ÂŽÅSÒKI0ng¶A8O¸wÍ}ƒi€%KV3Úï˜ÈºîцÔXÁào>ìëq»<‚q Öûœ²€Äô“0ÇDH µÆËŠ©{Ö } úþbóB-­à²_¾ø¹x¨=T‡ÿÚ@Ÿ endstream endobj 7473 0 obj 3336 endobj 7477 0 obj [456 /XYZ 38.2500000 571.250000 0] endobj 7478 0 obj [456 /XYZ 38.2500000 571.250000 0] endobj 7476 0 obj << /Type /Page /Parent 2 0 R /Contents 7479 0 R /Resources 7481 0 R /Annots 7482 0 R /MediaBox [0 0 595 842] >> endobj 7481 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1409 1409 0 R /F8 8 0 R >> /XObject << >> >> endobj 7482 0 obj [ ] endobj 7479 0 obj << /Length 7480 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯Ð9À¶Å‡D Øc;@ CCàÍ&Xd™ì!?êÖÃÝR”øM‘RO+FÖöТ¨z±XõUñÝ¿þ=ûçoÙ»§¯ÿɾu¿?}=äGWäíÿ²Ó¯. «c÷çÌUEöí—ÃKörørøÒü÷åÐ>ðõéÏÍŸþ—éìOÍÿÎþú·æ‡?vÿèô~98åšßÿ}þ½vªùS>ü~úù¿ù]öëiÆþuÝb®ÿþƒµÚ¹ò´Œ™W¿úÏTç_¿}ûõð®%@Ø[ªª( )kl¦j«³ÿþãðSó‚~úüX[¥\i]þš9}~Så2¥ëf&e'/:ÿš>Âä®ùq´ÉÏ+§Š2¥òÏ.É\×È{K cbИ>Âäun"JŽ;ë¨0UzæâÙ%™[EK ºˆAþ~öä/s[GœÓÊ¥‰Ò³N.ÈÙRÕyšÊ˜=gµ³ñ&?¯\š(gñä’œ5ºŒÈÙaöÄ·y¯<gá䂜u¹qñ8û}öÄwJéx“ŸW‰³xrIΪÒF F]Laòæoåæ´òXÁ(Ïì’Ì5ºŽÉÜïÓG˜¼ù{¼ÉÏ+ÆÜÉì_BfÁKi¢á/ž?<Þ}nÖTfÏ?5+;¿°ýíù—ƒmþr –.{þ1û}³ž÷Èž>Ø£5mŠàôïÚw©ŽU—º¸y‚Ï|<(u,lY5ƒÃˆùp©¦{hÁˆ5ð=xè~†#ŸÎ#ÅÑèJ-}®M¥zj¹`úé–¬rÛ´³UK^láôÅyÄôrqÁ– 2 Ž3 :&Lý„TJâj9Í Á”U9A%3^,&ƒ¼$^Lh^‚+ðXB@(ÿSü–Oˆä“Ç,´ïùôÜìšq6¼¢ùñõŽ'k=ä6PÉTgÃkÃ2Hðë¡«¶ju€DãÏCõ1\ë¬ë¼ W£•`˃5Ó~±z?þ üO±ˆb¡‚¢ƒ—d?I©Ÿ²9Ò@Wœ°Ôƒ U+΋¹"Þ8R£åàˆ…³á8ò Ž|D#º@#¾ÇÀg<Ô#˜ÒMÃg ÁüϬ?’cZÃ<›Í ÙÁ’Gð L yúž ÖFOñ—jø ü9Çaå2õÃY.y²¾å*°½Ý-×n¹¾[‡ ‹¢°$ÎY¡°÷@êh,‰eBkWTgí4äÖúÖîqlÚní8kçÑSü=Ÿá æì`+äÜü×½1+dÕ=Z! )j!îÓr [!è;`¯Â3åòŸ°„²ƒgÃvÐ@]ÀžöŸð ³Óíˆè.ãêŒî_)šq58®9ްâá[K´zÒLËknàˆ1“%"ûžlÎGâÙÌPxÊ&…xWJÌ œ*ÿ<þ F7½]Î8&7£[åWù±tê*e?òdSpN{"v¢3€a-öÌZú˜;aeÆ[¡‚Œo?VǼ6ן„·ÏÖÏPºZ¢† ÞÀ²xX„ENâÉ(c ´eY —¨uœ`tp*V„¥ž- 2CX'CØc¼5‚(û=Î ÓÀ£¦8¯ÏˆÃ…‰„ÅŒðe7ƒÙˆ¸ÁÕ¶opŒh/÷…)ÀÒr(u,d6G|º#±P✳-?1xÐ\¢»r[:Ï’ˆ£^*[ëAÎb®cI‘ÀA¾mð!lI >V"x#»kRHô 2§ó “…š?`Ûu0²>1¨"f‹}pOÕ¬rÛËLzÒ‘‰RRL*b!G˜´4|†Íxª|Г¬‚ï‰"ñiôY›Wèóú`éÝlAŸ”ƒ5ÜÂÏy(Øqeû(–µ…w­}$­UxßÜ!·sš^ö‡¯-k:ÉîšþPš%$ ܯ:nVùè&†ŽîºùHº¹eP)1S'?l°žâg f1^>YtÀçøñÜÚýb0ÆC™öLë"OíÉøÀ÷Pù°I–ˆI¼0‰x<Û$¥0Áaâà•,Ϫxò ²$`ÐÀD‚ÖóÒ9–*ÿKˆ÷Þ ãbD¶AÆ[G@DA Älç“—£ýí­&â:Þ)[’c]] UΫ÷[IvHÄU„xd®R/·ÊFos ÷˜HÆ-¦wÐ6¸¥ËÄÜÚ@†é—’€[þcb™W}äYÊǸϩj˜/e$;ªpÉc=j`äá>› Œƒ"1“;3Ù’Q8àThñI ÇÇæØw¶íñ讯‹M‚ë4Åxÿ‰_~hêñ;·×딉Ü0^‘úõ „O¤¸p‹(Žx+{9ŽZh²'I•#b|]öé–vÄ.²åý?nøÕ"ÖT\S '~p3þà:«ˆ[SÕlI×[“ðahyJI¶Ï8Õ?„p®<ÏÉ‹€J;™b%‰²õ{ŒíÙr±'¥yÃõˆÔ–1Ù‰[˜zº(76ì'Òxæ`ÓÉ&³‚Ê”n´bç4¼cZü8¬Êûußg<Œ*]«“‹H²òø/XÜR…ý7½g¯æ] SÙå%*Æ=Ï´à`z%ÅRz´!„ôåaö‘š¯‡jº¨•«LÕ·¨¬Û(¹²Ãq»…ǨüغF¨D#:G=ö#ðlžgÞÃg*8RÃÙª~?i#Âßãzƒ?n¬‡Gð{ú–{Íö1zÆàïÔQ­z¹£Ê´‚Nõo½çzƳ6ü æBKÑòh”)ÌG¸ê¾ç ®M¡÷tç«0ºÁ¨T°åê)¡.”e@×!Ý‚pþ€ÍQLÑðÐ[É`Hô8¢R¾ŒkËtÝùÀDa¢F¤GžG)±ˆ*ŽÉê$º2Úó ·”m)r=Þeb³L£NFFe[ðÑ)$ ’¨ó^×"{ÛëZ^éé1á,Ùe’moÔ7{À²—týJ=t&^ÿZ-Ü€)À0{ÙÞPÛ(±ÐC»ÎÇá£çz'ØýÂSÊû%\xm(ò0y_ÓµV»å§‰î¾!¨"&)ùBÑŒ”çd•èF‘+ÂR-–A‘ÈD˜+µðu(XR°t‰vWð@™¦(2&OJ§ËÃýñD )ÙíÕ³¹1íÝöéFQ÷ì§Ñ&WÝ6°­Ó¸Ê3ò8MÜ6¬Mw}4‰±Æ\“ãΚ‘d/öÀj¬À*u0X~¾ A£î1Ë„­zJ[•×KÛ ±™ÅŽYÿÖ“îÞˆ²È‹kEºµ½—»{¸9ìá}Bç³Ðv–C©ddëm€ kî€V¹ÂÚIXÏm«ÛÜìj#’TêWHî£<;’æë¾÷êÀ|H•+(Íл+®9EÀÜÎK]cHøf±ãñq/ò}@g7a¬¸¬^+Þ¯ÞÛGfFö‹üâèOëàò׾SY‡\4R»yœY뀥 Çxىﻲ?ÑöU7 ÊwU.D@7¦…§Úœ)³ŽK%Yt–l9¦p³KÙv­žz`eÔú'7Ú΄{pÈV¦­_·½OÙXÕóoõb°È±E[vjž‹4ac|°‰×D€Œ=×¥°Vß&Û7r/ô*ôK»¬Ô;X½(%ÙõçUvT ·níö®£þ0u`,u]©˜‰‰4g©•M"¢õ€:X_DSÁOì&™b¬Ï6 W]>^Ýk*©ð GV• ¿ár ïf þ–Ê©‹àT™Ò¶í•ùÄŠ'dóœº#GÙd(U¬ž³bgÚøâê;%×¾zßeª!)Š`î¥-&õ؉D )™Hm@|f“Íf £G[áázµ¯ér7âú-Oš€­à#ªçÀ‹a" ƒQ±sü[_Н±…ÇZ<›Ç«–-´Ã§&¬C€ðeÍŽXÌS†¢PvðÊ#U8¼A·zÀ]øD†AdLø j£‡X≀Ñ4óJ4óè–Ì<‚÷la±ìà_FO¡62Ð,ÏŽgc"4ëIé- €ïÝ[ðy xd÷¶à-0u¶”Ý êè<³1kcv0Â_ñX;lÓD}¿¥ö‚õ}D)Y¹êÁ™¶²}9²§¦L´¹¬'6P®Üœ`KÑEOH„€Ü ƒòDoÜÝò¥ ≂k‹…ÑKÌÚpì•i{)KFF‰÷0©ÀTWÛÝtuÚ3à­õhßÜAƒë‚ªûÜ.i¤N÷Ø£#|Jü*Ò%êï*»ËXÛÎ ¦[BÔ”Ó wã=TœÞ©+œs ~OŒ‚å4’TØ]’îÉF—¾Gžáˆ'R i€s?xÄ—gºÊfHe#ÂæMÅš|¸ÿn Ð}g¾ƒ´‰‘H(®.¼wmÈÓÈØÐloë.­ÍúìŽÈîÒ¾F’T½KÒ=YÂ;si†&­¿'§JÅZg¯ÅhÍþLŽg‚nÇÁ~\öÐü* ¸¯ä®šm‰fFðþ×DÔßU6Mæ’ÄTU7+ֺآÙé½%K|í¸²1 –3è`ýVJLI/䯴Pk{Æ7À ¡z;|ñ^Çk»ž8Ë;ÖS7”¦êr* V[s³¬Ëz|¨ (Ig ]"ÜÕæÉT¼w×tÜ’A<s$›¨…è©#ä4ÀìžXSeû§Ì‚®äEê 6Y´¯h§XÜ1€Âxïðl›_ÙKcì¼¶ðËÜ?X`,«[¶Ò4Þf®NR“éQèùÛu»ŸØ†€ôQŸƒF—#m”£œŽt–H;©½ ²‚ûÊGô3g¸o­ís÷¥?‰ÛsÚ±AÀgñrúìcÔ:Þn|†Â³Ág:iUAŸ~ŽdîôçfÅ=£!íºŠ¹ À³aè‚ÖØÖÜ¢¦*¤–’ÎÚÝPÏ à{:ãÖ3˜X‚±dU#5ðÔXc<ßÕ;'“I 60ø™Ýê»Pö’¼¶nO¸e, 1ý,óÁ#C«Ñ^¥³.7ÇÎÞ_)/´Ò~vWz×í|s»^öåð‚Ò— endstream endobj 7480 0 obj 3916 endobj 7484 0 obj [457 /XYZ 38.2500000 758 0] endobj 7485 0 obj [457 /XYZ 38.2500000 261.500000 0] endobj 7486 0 obj [457 /XYZ 38.2500000 758 0] endobj 7487 0 obj [457 /XYZ 38.2500000 261.500000 0] endobj 7483 0 obj << /Type /Page /Parent 2 0 R /Contents 7488 0 R /Resources 7490 0 R /Annots 7491 0 R /MediaBox [0 0 595 842] >> endobj 7490 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F1409 1409 0 R >> /XObject << >> >> endobj 7491 0 obj [ ] endobj 7488 0 obj << /Length 7489 0 R /Filter /FlateDecode >> stream xœí]KÜÆ¾Ï¯˜sØÝ|Aí® ‡ -CC Ç ŒØÈƇüýp‡äì,9_‘ýMu“á[ò¶Øªêªêz~úã·¿ïÿùÛþÓã·ÿì¿·¿?~Û%‡"Kšöo¿~8ÿ-íŸ÷E™í¿ÿ²{Ý¿îžwÏõ_wÍßÿ\ÿé{»ÿSýïÏû¿þ­þáí_zû ¿ì SÔ¿ÿûø{U˜úOÉé÷·Ÿÿk÷—ßí}›±[®ÝÌÇÿÿ!M]‘oÛYúu×Óýöý×ݧ~«”e‘VéÞ¤®þO•Úýÿ±û©^ ›>9T©1EžÉ5 öm¥¼žßØ*Ù;ë éLoL^åi¸É;W‡Šq¹‘gWDn™˜¼PDgӘܔ'?î\*-r…Ù5‘k‹²Mª :MþiHäw®•¹xvMäf®ƒ¾ À–Ϧ0yþ€P“w®•¹xvMä©iTe tš=øK—…›ü¸sm t¨…“kb¶*;ðÔÿêè}zýÉ+S„Ó¦š«C¥Ã-ž]¹•µy@ž|6}€É]Žá7;Å“‡³?ûÌ‚·Òü<ç^…^vŸ¾VûZÉ{ù©ÞÙqÁæ·—_viý?5³ÉjýàåÇýï“ĤØ¿ü¼+e•ä6;î¯I,qÍÈé¦<þÀ²4›üý¯<É—ãHvp¶4vâ7ÍfÓC ¿¬f;’¡$9œ­€#eï€É#ZoÖ8ÿ sx׸0PšÙ¾¼Ô†8mb{Ô‰n+‚nUá!à7!S¾¡˜´1 ¦“¶@ xaæ€æ8b\GÁ×q<¢{…ðUýÜqŸ_ ßbÖ@@öŠk~i¶éàéáfñݸ)¶o›cº•¯cL˜þf&ˆ$xÓfYÄ‚X`€É8s-%Qžf}=‰A>ì€Ò¦3l÷„ÖÃ#ÊŒ€‘ʰÀ O9ÿjêÎI1±%Áú0A€¢«Üñ‹ ¼kû•gâ°nÁÈ¥†¡ j…ŸB Šî=¦êšÝ™äæƒb€IžzõyHL›Þޤ«_㛋ïçìü:íDp‹ý³o "Œ¤ÙÉIå>~óžç¡ùÆvCWé…Â#_] ë'¤»f×ÕÁõwGˆN×0’ûM¬'¦pÕð ÖÁÏjHö]è(!B(ÅX–d=9†O-<™!cÖÀëH"Æ(¦¿ª:åêÜwÀwjwX!w˜ß¾tխF’â«*ÿˆ¸ ɃT‘#"ß—Åd²¢•+(Ãü8*»(dIÁHº&®m‰råÊ$í‚]ÐwcÀB]ø†P_RÃy¹aø}ª»¶˜„x"¾LÊâ ‰«„â'@ž¹'[ÌMÅ ½¤ñ R¥Iò+0lãfâ@Äž¼3xnÌm0]¹ˆg8U°[VÇÔq ’»Q¬:l@€UùSZÓ [¡ ¡ttDAÑ$* %.àK$V%%ŸBàL¡ÏñJº¼ˆ·Uúh+!¼ÉÈìe’©ZÁÅótûí¨Öö¦ªò`º Ûœ…1 —1D!òEÅlÚŽ ÒaAW@ó(cE”^øc‹…õ± j–A”.¹k Ã_Tê*1‰2Ðó+IiÞž'¹¢ÓnÁ~Šâ+ aówÓiÚW9(sÍÛr…®n¹ÜÕ‰ð™ÝLaí+Ƙ¬¯ƒ­,rÔîò¶YcûàÕ- =‡QÖ]ÖÀ0v,ŽˆŠº±L6Ìc·=O[¤+¯¥b™0ö°ì¯*{‰À’þšI0üò‹¥‹)·|ºÉž—ÆiJ‘Qå}/ © ×Óîç}8~<\žOæ:ïÆ;WÄ6ãÒôXõÑè&K=¦Övȇo†[[f~ÏÔ‰.ѳlú­¼KÉݹ«z ·Á™pžöפìä³Ç9/ c¦®Um3V…V˜ö,T÷wŒJÕ|š"@ ÁìDмp¥ƒ|«tbºyb,*÷ÒñHñ{táKÌPÅzŽ r2tŒõ?›™vy =gmúßmuÜäßM¬²ÙI…U zÀñC„ÛŠ ÒpZ0÷2Æ;|ª6}lM3oûÞY£ñð\Nyª‰ŸªŠ®lQgø/& F:Œx‰v«›jË1©Ó™SÎ÷–ò·Ê¤Nç’ Ãï#+LêtW%fßOR'®€v…oÏo¶%À›¾ÕÈÛê~.ƒ{㺟.^½Ò]U&é_*P9Q )…T!ðÛÙ+ö1ü6Úyˆcø<-~âÐò© Däx?ù¼ÐDîq(¦W]ˆ¦µÞbi`«Ó¦6 ,v•â87ýTLd“ýGY´ìgÎs³²?=•Á·[·”e?– fá²ÿTˆ¦åáƒÙ)u¨EÏ¥JDÀŒržŽJ5ì ˜žÔ­\²©w"Dè¾£×î>áº0!@‰I8gp«W¿ØÔíE–òdÈpù¤/ר¢AªA87–qéÆÊ…˜Šn98ºÛBtƒ.ZÖ&Ho‰=*‡xAbjº0»^Y(¼J‰A™`¬ZÃPþÍ%ÀÁXÿ6?ôL´zTûº¢&…x2Ù K”é¾n*LµCóCaO¤=(ÅbBÖ&"žÐ%ÖÕ|"ŠQ-+ÌÇzÎ "ðâ~Â+ÚfPq0\õô/o;e§yÒ…×a÷€à8î h€i‘_\•®Íå‰KŽ`—ç’[ñ9·m‘·²û£Û<;b³Ý2·=ûàreFzê³3{+½²Hº®ŸÊ¯×›,„/èöø‘éñŽdm>“¹à°$œœÑ¼'ª&sŠ–ìŽ”˜/Xo¾ª/@×A"ܬ¹bZ©rÄxD·ÀÜuøƒ6¡ÈMÕ¶¨C™3óUŒ>%ÿñ–˜ÝòQ*-4týRªLÊÇ9?=®#tõB&R> H (Fµ[U“ùЇ£«¤{DîEE{8£W©¶à^“ç¯èK±•Å40ž1!¬ßCBTö™ zŽh ³£Ó,NõiG™.¦³VáÖxD[ê6§Ó­¼£¡ÉT$Õ¨Gq7êYcÕ­#XøìÉ]ºŽ÷íb¢GBs®‡¼ÛŠK‰X¥¨(ÆÛ_3ye‚ ;ÿ A_p‰áÜÅÛt.NSÁuG0N‰¼dìÄڜ͛³Y>ÏælT±ef—rQuÙ›Kw)ײ|¥4²ñØÇn<67 gäÑZæ§™ÙÔE.7­ä$Zô4²¼¨ ¹Ü÷Ið[™1¹º­É©›¶e¯Íž½6É?$Ç,FfºíÉ*Ÿâý[S>×ÂôuUeIP ù¬‹ä\Ùƒ°ˆ ŽÑU4Œÿ^AÆæŸápb|.ݰÝ~¨‘ ŵòäåÞTõ6yÇUrêzòµCU£ãŸ]ã´G˶ÿ0À³ ß|Fß´à¸4[g+;•·¡¼³ó*?häG„u’Óà÷MKF—vÝ¥É;Ì¿@¸™ âÇ;x„#c;ÿò¬Ò®\ëüéûÞ(ÇÞ©VR¡4Ø't×Ùn\øxDX3UÂóêzI=9’zúzK¢Z-–wâXù1óöZŒÑ"ä³µ°}A§–ËŽÀ4¤*„Å*馛1ûͼqfëaÓÕHF¡¨ì&-oôvÎ^ÞNEåÇ:˜@ÅUJ˜b³0“Ö y¥˜ÔYŸÎO5|É7SÃÇF‰K 93¸(‚pÔ('°˜@h¯dƒ%†+‡(£ÁT•Ÿú,° ŸFÊ•QJ”MÕÕ"ÖUÓo`ŠÑX%f¼žw…ãÈpl8ŽïRíG¹,‰Œƒ+bÏâ`8Ë?Þ—à™B¤ †ÜÐ㌡ L}ÄÈ"Ê8VI‘Ÿ›è$Ð ñ)@žÀ=ÞŽïvR8Û"âí«¤J¯¡V8NK÷Ây>Æì€‰U_1Æ]AÔÈ‚ãí…¨zŒ-&FÆÁS³ÁobòãìT£Xã„3d&â~ähe“ ¶1¦~!.èB)†O+•Q„©ç2xÅkžÏئÀ”óa O^¤ñòÌ+›u¥¾©î®øKèŸL©o!SöÖ¾·ªßI±ŽQ£±Å¸mcþ÷Š Í#Z lÕ=§Y¼U¹¦gûêôñZxTÎ]Ó)Ûí8tsN…;ˆ×µ`ydê–`à×.¡3ÝŸÛ~Íá5SWõÀî§é.ݦê d\ú‚û‘©˜ˆ=ʪ.%ŸÀDÂÉ­Ú¬JÂâ1Åxo).5pp压éé• •âߦO²Øô+ž¦ðºªv¸c.å@L´Êë<¿©íËİ%‚…ð3† Uª€3¶ ôD¦…êÌÉÂý¤Ot7P/à%,òª ·-¶¤dýkÿZãBDÕóØ_˜€Ëò*]}Öļafo;‡e›+x ü¶W\8kd{°MŽèÙHÃyòáHkô·‡|ˆi £yBë¸1Ûü¥½}mOŠˆë$iŸ÷aÅ=°% ¬ta%üÂ1 ž ~Ó²aãuô³ò,Á½ý¹Þq‡h;›ù“ž “€« ±c²ÁP…°ÃTÒr» ×@Ø\§Õ /}ƒa€)SVÙ»AõoŒp®®©Ï`‡ þæ¡Ý}ÞÏ\Ç#xo­Åé³€Äð3ðA†GC®q® °w¶HÜ¡å÷./äÒÛžÕcjÏûçÝÿ½–÷2 endstream endobj 7489 0 obj 4263 endobj 7493 0 obj [458 /XYZ 38.2500000 412.250000 0] endobj 7494 0 obj [458 /XYZ 38.2500000 672.500000 0] endobj 7495 0 obj [458 /XYZ 38.2500000 412.250000 0] endobj 7496 0 obj [458 /XYZ 38.2500000 672.500000 0] endobj 7497 0 obj << /Type /Annot /Subtype /Link /Rect [329.250000 419.750000 369.750000 426.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus >> endobj 7492 0 obj << /Type /Page /Parent 2 0 R /Contents 7498 0 R /Resources 7500 0 R /Annots 7501 0 R /MediaBox [0 0 595 842] >> endobj 7500 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 7501 0 obj [ 7497 0 R ] endobj 7498 0 obj << /Length 7499 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯Ð9€Û|é xlO€ ‡E7»Áb½ÈdùûQ·3-õG‰_)uOÇHì Gd±Þ,Vßÿåë?³_þÈÞüúŸì[÷÷ǯ;µ/sÕþ';üy÷ú¦ÚwÿÎÊ*Ͼ}ß=gÏ»/»/Íÿ>ïÚ¾~ü[ó¯ÿe&ûkóß_³ÿÑüð§î—¿ð}Wê²ùû·ãßu©›©áïÃÏÿ½ûûŸ²ß3öËuÀœþÿwιRW0f–~ÞõÛÔÇ?|û}÷¾E@Ø*UU;[dÚY—éÚ™ì¿ÿÚýÜ,ÐO¯öµÓº,\©.Y¨4ÃJ¦nЮêÉBÇ?2Óë“ÎÅ›ü¹8V´-´vIâVÖ´:¬*¢azùÉk¥ëh“w‹c¥'.ž]ޏµ2÷[ÿ&žpÕÊ–ÑÔB¹8VZâúf—$nnʘÄ}™>ÂäE^Ç›üy4ââÙ%‰[j“¸/ÓG˜¼r6ÞäGÈ£Ï.IܪÎ;iÿÃôò“k¥ªˆœs€\+=qñì‚ÄժЉûjú“ë2žAo!E\Ïì’Ä5¦sJV’ÇÐ0{ ô[£âM~„\)=iáä’”µeg´\{û2{ ä;Qß!—FJOÙñä_B&Á´?Q˜gχO»÷Ú5Gn]dO?7°×lÿzjP’gï'ó¢Îž~Êþ¬”}ü!{úuWï “÷ ¶#ê#Ñ©àlŸáȧðu¬…ßäx§pDáBØXaÃ#¢8PpÏH*ìÔÇ‘ÏOàÅ–™\•‰¹\‹¦&äRØb{ñ¬ó™ž•-Ì󿘎†X'•lÁÙ°NJ*.ïWý”pÕÊÞµ@,k» -P(s×W£ £ÅµZÒ©vɲ7êÃqI·w¶½Ú}³ tìfÄêãHõò«­DVûC¼ù€ä¾PhOßIþ¹Ù yƒ/¬Û}i»·¦ÒÍG 6رjÞ2– :GU)ª$ À;ų1;…³yˆŒéƒ!¨FŒ¡-H+Á]:µ´ŽŒtb¶ÆrÛŽh½Ï]Q•ù…, E[ãý<.§:æYÈn²ZÀ[ëúØž*DŽh¢rmÔXR'ŒŒåßbFÆÌ_A¼Œ!ñjò«'xÄRÈó ø³„°M”"c:&øƒÜêÑ…þ5ÆPÃCu¬°ÄbKA(8Y=ã±ÎŒM|s2èÙ`‡Yµ/J}Ê‘-t¾Wµ=åèñwÁ-mú¡Hž1–Wìvxtr€‡÷)\™¹V°ê}YäK ÈšæS«¼ÛOÌõÆ"„Ø#:у㠮âÃ¥òÇ®SÊÖ?É­NŸ©¦I´ÁY3™ –T穱},Á!˜K±¢8?ùØX7fäå“Ú’Ä¡‡:S]§Yîð{bÖ¼³DÛEàQŠwÕç¡þUžá0ãOƒYÄ)e‹×8„\y"x6 !ó”E7Q‡âÈSåÁ;æNAÃj~cÊåÒ²a|H†;—{씋°c=#ºÓ}gcÌFÁBÍ„g%¿\Å26„½Á¸ë·ê HÏZž˜ç2ûìŒr‹1Ôe=>ÉÞµ0W¹‰cê1z,@®wÙ¸=¹g‚³A5@lñ^¥v—ȳhRNä„+ÍœŽ¡²›b#’Q›ËO¾žóÌòô7-–}Xeº>iko¦Ê¼ Ý^ÂhµoïÖ^ѽ@#˜ä{3¾Ã³y¾ù€¾ñÌVÃÙª^ɶױ“ÓRÃáãûX<âY§åÖboÔ~ý †ºå]ô”À Ò7‚ “ÿsˆ76-–n;§»ë>3ºË>£rl_ãaÇ×àx„Êìu3· L²R²k‡Dé>LÚ<@7¸˜£A@>?D1•ÕHäÞ%È–5nlؘ¨w¢ JÙ4ìíÞVo3y”!¥DàV«‚„¹YôV‘ +­žMz××®;IQiûpÅ`Zo[6)A&`N8̰oçP,ë5.¿O®ŸÃ×> ºDsט3‰er÷eò‰£ëøiñv•Ö§K^}I›*·@]ŽPäé„…û3à®°£‚§?†wn˜ƒ-¦‘¯Ü‡”ü3…´‰ŒÂ¾÷Y¿**ÌØ`éÒçBß5 ©Š¡u9,À¸U‰F nŠ! òÀo n%C´…a”˜œBZ@áÊÍR8eS¡ZÙSÑj„Û9a:`^ÄüËð¢Ã;eZáâÖ…p?]´C†+Œ™çÒ„ÍÍêâ&\žsX„<ÂH6Ü– Žx$ŽØxÍBØð:׉ ùÀè„2SÖóû†bÝ…µ´‡ZX2°õO¤‹·Ñܯ®«y ã saë<6•±ÃDsUF¿xð†}\Æv3íñl‰(—®õa}`“;/_d'˜öšžær¼¼ÆÛÛâr{ISæ[ÓpI1ŸçQ0kò˜”&¥»€&©|½m7 n°XÛ«Æ¢,gSž–¨ÆÍqûiÙÓ솱ƒµ¢;›&­/i˜žãò«ËÙFðkG-Î׆gÉãA·?ĤŠeãoàóxP2©#vÊ<¡ÀXY ¼k“Zo"H­ŒªnqÊ)SA‹o²'ys¸ö8ÙÍoƒˆ²™`ݵ¾l0²Î@íñ¡˜û¾dQ÷†Žu…Ž”W c+[GøŽÇÖÓÆ%’PØêü”Ó¬jçóÞ_m&ê’†öyÓd3vÙ©ê”ÉÏ|x*4'ijDÒpH—¯å=¢¨AÙ$RÙ„–'_çCHÉŠ®®²aõE~¼Bø©¬±@1½ =c@â«—Ó/$(›Vfd½®*Ó˜IÙîüU7UeΔ>1}NZ.o@G$°7è}¢êÒãOÉv›__'-*ày­côä‘{½L9éåÊ©Rv¬œV¯ÌŽòÁ à[ê)¨8b¢Þ¾opSé×?øm÷5š…FDà;F-Øèé¾¾ïj=Ù(¶uqŒä„ –+Eª+ö_ûµL‡u,‚X‘ʾõ²þÙkùÃ~žD7Ød]™¯É“ ià@t<î$ž¨ß…l³ƒdgÿ9}»³gc)Ü›¾áΞ C°zgÏÞ̘©™ý;=½8[¦,÷è—s]:1 l/Í߯D-œMÁo˜¢x§©n¨]5<¸(zCÒ8ŸhÜ£©m$j¸z¥oÈH4ð`^ˆ|a ã22ž¯hê¹aÉòô”Ç”@‹ûªl÷ÕšRá<> 3fnõÈÎmàNIôä†iò‚ÐD,pçâOÐ I9/Š>Èt)};y0©Üæ ûžpmªüæb„1µñ2K<ɘÚTõXÂqz3Q¼îI|&J†<°áÖ.x$E }qËÕB?Wó\T€a®<ïì>†¯ºÍ&¬Éï¾.…-U‡/X5v}¼:3Œ«0lD‡! úsm¡ŸU#ÏC÷1ª“î87’fwuëÂ²å‘ ¼ï·æ„UAo£R¾¸¬#ÖÆ¥¡:!Éõñ‹zh=+}e_땽¹c"·úàÙXû¼³>¿Ø{Ûóz£tîôMú‡÷ÁÖè˜Ò;+ {*Hç¬-܃ÅÞ¦¤°‡öb‡ü©.é$Û—Ããn›©”¾\y¸”8½mÝḭ̀j‚^L3ÞYccN—<—_¿üªý~½¬|®‘¼ìIñ |Jï%š®±ÚõáÊàR¥YŠ”0Õ‰L¾ Se½f»6Õ)[ÞLйeÝg&øL5¿aÜÊk'…¹„¥ÂÎPXhžq/ñN‰ÆÚ[¦©§;Ñ®ÚÃP#yv åÔ³ÑÚ s¢ç0!m.Œ¸ŽÜ]ø æú@öÖƒÒu1\ÜãqÕ€à²Ö7:L¥Iï#÷‘¤¶VÔGQê¹ðZýTõ1’dÁCܶQTsÉêÛÍ„ñ6)÷‘·¤Ÿ.…èA_­Ü&óŒôê-o¤d$vOt& b²ãD©ê!õ}L©„h”-wóÄ䙦º!Z¸hŽž-õH1^uÔ7¦qÕS ÖÌÍxÍÕsŠbtã[³tOôæ—USµJË3×f•y\5rÈùW¼#Q  Wœâ {@liœ §ò´O n˜#Ú|‹²Là$E[Ñ^‘sP)‡w¢`™¦HLJöbcT½ÆÕ2U5–Þ»³ú§v±ž É>‰ÑG?rEls2›¦Û|x/jã€:ÀnŠP½>ÚÖͺÂLúÞÄ1†Û1*"ÏÆ&Ì„j˜~þ9+ôãôzx÷ŒÓÙ±Æðä^àh4~€ G|±fÕ€rÚlžÂZ%ÛÎh5ó¼xÍÖ+èìªÝ¾è·6Ìõ7‡ÑÕs=Vh÷Å.ëê±™Û7óÒ4…ÈíÇQ7ᆵWum%RöºÜ‘¾f”}}Mâí³T$8Rr'.©p“F¦à³Î$†ˆNéÔ›¼ïùA½QK¼éJ%ìå*ø-'ˆËšcwOƒzK#D²à–eÁ£à:TÒ"—Þó66>\¯±S)¨Dw¡«.YIc]˾x±®d߆gÞR'ø¿Aï ôZˆyž*aB÷‘ka¬ëêéÇ Ë#´©ûB³õµl ¸ï>r¹k»™‘M[ؼ¿³Â)àì19¤*œê ÛÇ™WÈ4$366T,ûŒ=ó¨M@½I¢ðü­õ§¢’VqÚ'“K( F-„?Nù †Îÿ~e`îý¥W~ˆB)ÂܼbÉ èƒ5ö5nµ`0ö; ×WïVº1£j|Æ#¸«VÆa5¨$ ^SAT®\¬ ¨'šVÄÇh$gyc&õk7Âá=Ex&E¸ù“=7÷äËÜ/, Xu¶¸¶Ù«ÒÊd¦O%înpΡ¿eÔòÌ^[$›½i'&¾E1é*;¿Wßy¸¼ìÌ:v.ÑälÝNsâ–ùnlÁ°–(¦ìXŸ°±);³ gƒßt®€Úú«,<–áÿVCãkqgòpÀ³aèr ±®9‡;ŒUˆ;Ì%¶;#à:yîŒÌÁ˜³ª‘xj,1ž}õ X“I,V0ø›‡úI:Á°užsÊRãOCxP µÆëZVfKe÷¾?^¨¥ ܶ5¯-ßœÕ˾ìþ‹¥ê endstream endobj 7499 0 obj 4061 endobj 7503 0 obj [459 /XYZ 32.2500000 762.500000 0] endobj 7504 0 obj [459 /XYZ 38.2500000 715.250000 0] endobj 7505 0 obj [459 /XYZ 38.2500000 386 0] endobj 7506 0 obj [459 /XYZ 31.5000000 764 0] endobj 7507 0 obj [459 /XYZ 38.2500000 715.250000 0] endobj 7508 0 obj [459 /XYZ 38.2500000 386 0] endobj 7509 0 obj << /Type /Annot /Subtype /Link /Rect [60 692.750000 98.2500000 699.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG >> endobj 7510 0 obj << /Type /Annot /Subtype /Link /Rect [111.750000 692.750000 156.750000 699.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus >> endobj 7502 0 obj << /Type /Page /Parent 2 0 R /Contents 7511 0 R /Resources 7513 0 R /Annots 7514 0 R /MediaBox [0 0 595 842] >> endobj 7513 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F8 8 0 R /F9 9 0 R >> /XObject << >> >> endobj 7514 0 obj [ 7509 0 R 7510 0 R ] endobj 7511 0 obj << /Length 7512 0 R /Filter /FlateDecode >> stream xœí]KãÆ¾ëWð`µì›$ðάä`±ä`ä¬ã†mdâCþ~ôhR#R_“ý©ºIä=cQl6«ªëýøøç¯ÿ(þõ{ññéëŠoþ÷Ó×M¹­«òøO±ÿùðöÝlýßEÝTÅ·_7¯ÅëæËæË›ã _Ÿþºûë….þ²û÷ç⇿ï>üÑiÿ…_7µªw¿9ünkµû«ìï?ÿ÷æo(~Û¯Ø=Îoæüÿ?X[¹¦Ýocâѯ›î5Õáç÷o¿m>÷”¦U¦n e-Tkuñßn~Ú= [¾Ü¶V©ÚÙº¼æAµ>>ÉJ·eaÍè9‡™ÕU‚Å­ªÒ-~ع4P”q*¸ø¶qþø7ùèæ1×îÈJ5EZšrVyĘDuZ>ÁâuJŠ=ì\*UáÕ%‘ÛhêŒNÜ~ùð×ÊÖé{ع8T:äâÕ‘«UÛzÕIàß/Ÿ`qã.~ع8TÅßcktEÃ7- ±·'â Ü[nx5xOnÄ®mK@GöÊwÄ=Ÿ%iTCˆðOIàüÀ÷Á;ÀÏ‘¥·ž ñSbÚÁÐ!°m*¸ÆÁ]ô¢Ÿ_vŒþ:ÝÚ^bÐJ´uýfŽ`Wfk¬Ù;¸O›qèJyÜ¦Ûºêø §+øžÝ㧲ݥÓ=ÏèJÏNŒnÔùu¸RoÛf°£às ðsðûxÖ÷¸k¥á=îÀÁ+m<~Õ«3G„Í9„ÜFi&NGiD˜yÌW%€‹ÁS€Å2t7Ú,^ck¡óõÅÀ""¼™Q1Å@œ^¬µ•šSóÕ—!ÞD Í yÍœˆß) G„€M¬g¢CÊv‚ì:B•aÄ7Æ›Õp³"ö÷l”n &±"AiêX[œoÀΦ ûËàlÛG*ÀË,1™„/â£Þ§ ˆcB'bô€€ ØejnLhÂŒ5ŠÁ…M—ÂFŽñÔ¦P颞|•ØÄÊL„±áMæ v¾÷T۲İ£ÞǯtwiÎ0u1ØHÀÁM©oxKXã¥P1†ô˜`…9ô¹|³‡ÝcCQÈ0夙X5n ?PÆoI²Š(Wa„Ä€>Ë݈Mc­•0-Ý…bË¢ç_DEe+ÃDd=ŒŒUæÓÊ.©Œ !VÄhɹ}ÈDiÝr½1ê„bS•­ÐŒKKG|vJ`€ˆÄf2ùd™p^€Ûb±µ|Lu)¿Ù-äò¼/¯_Wž5WÈÅ€$Ã0eò{˜8ubð}ä-X£îåÍ£Lx<´©†çC–|7 ŸkRYV’ Ð aÿâi^~Š”_¨ö"!xOGÓÓOª.·£²‡®xyUmõÈOÜãiçÒ=-¼§w©´>¼ÞšN¦àÀuk4„Á§ø½uéãã{¼i{é}àT¥„8õ÷¤ÄN«n3ëO`?€ãíûªQ±ªš(5PÊv6¤'é7Û\<5£–ŒUŠ‘~=¼×8ãjŒXPÕû¢äbg¤6õÛ~Ù|MV– í䦞‰2¬rÓ·Öú†uŽ®hÂWÁ™Ðõlf/lËbÈF8¼zÖ3u³#·'SN¸·؈ðY)Ã̪ù”²Šì8E4qõDŠrEäM·dsµ=ßiT ¦¶»Âͦ˜6T¹-y›>ä[s~n¢ÚoÜJ c b8€{›"µÒ“ ´dš~í5¦17þ Xu° pHóžò !W}S³ÜWÓà¶ç›¼’>@ÕœJ‚eCJLPkq÷7åLb`0T±J6PäÆE¸,™4º\¥e²®‘ܸÅ[xܱWX6‹G¤\gùbÑx=%¼“.¹”QÚ ¤¤eœ}L–?FÄ0Ç,€3¢åsºíç|ºXS5™mTÛ+3 Òq;ï'tEöM±î޵íuXðM]_£‡Cø.ß*<ð>²4–ÉãÃÐXN‹®iݹž“å©­êĈÁ¶0†6¶¬1‡ÂtÅ4ÇC$˜kæ„Ë˼ë•séÖØiê»Mº$F˜ääjmÕy¸³rµºó"çòr ŸNÈm°çßkAÐâƒC%¡Øö*_þmê‘ð9Ó¿Š?ù.UÿÔ|üN—º]·jN(:>ìF9!Oµx¬0@½8"ˆ‡CaˆBl¯\NèÒ6“ûYžã(ö6©"§qG)«i\IN,Ÿð…°@Ø:baí<_F å+¢­#:­0ÉVtÙ*<&O*o›ˆú’ÏO† Jkæçéekk†3ø0‰¹HT.Q#—$m&iâºÛJÈ!*À×llîpÄ¢;Ó8 $¤X@º0e§iç¿eÌÓÚtñHƒãÂØ‚ÃÕ<ØÃv=áÓT@K[—ØoÈØ\ މÁã7Ь䡤J]CI¢ñÆzÇ÷Øw–Óh3ÚÛº.¯ ŠUGìDs¾S ·œ§»ét;mò=Õ”Í PO.Þ4·šËˆaÝÅ”¼ç0ÏS­;§«ô^@[ö vÞûx Y· 5ˆˆ™.²x{váù]‰†02yØrµú &|UÚ¥8£±Í€O]!>²SS׃}&"ðßÌÀÈN?\ Oœ­†ä!ì’Zá„ßÿ#VÓœQ¶30•” -6E妯ÒÜÖ ÔõˆÝ‹*iÔ4"ôqÀ¨}}ULtàTzaÙVv¨£¼Sšgš RS| f`c£®z¢P¨ÍÊ%mCÁ€œ›Ù€,!æˆúÿ2„(’_tÅX9á™TŒB~“¹52†¾XWÁ)Ÿà©9é ÌÌ5hJ[×ۘ˚z†÷ÀaN>×VUÛ£Ñôæø>ÞÒR®ƒûé A…ÇVQ#¨àƒ¦J¸7< ÞCA­Â{S¹ÎwÛgþös·FÝú¦ÝŒ½·°äÌ«\ É{Jl0™‘ó¹-óà5'YSy·ë³f„ãT"úŸ¨”Òî$Rë×U€¿!¡ÔMÎIMéÝåí %öRÌáÆ×L1=Nj¹ÒÕ²^TÆVÆÇ)/ª¬O´ÇiâðjŽr\¾¯¨"Dµf,k /!Ô옴r•ªÎ¹¡±‰Øƒ–˜ Ùê¬%KEv` ˜“JÁñ’ˆŽËæ“­¾cx_DÉF.à‹ÎP½)Óˆ‰dãI”"’¸3¼lëû'ˆ§§¼¥.*•HÀð¦k} ]/½Û°R×G‘¼¢qð´qdÊŒº_f/¬ýË:·r)@¢.FËe§‹Ï”qqbØŒ<`1.‰ôðò™ô9‘sÌT=äUôRº H›R! S±6ž5Q³RDg×fcé ¶½‡ñè`{›Ñ2órÆ-9-€D­x[!ô¬À[³Þ³”µ S…«ÊnùK†J/è€mê¡ùЖ§Q&“剩•ñhÂ-a:Px⊩L…²?‚*å’=§œ]U×Ï­Í%¨ï¹¤Q$f;Ú áš]>S£'¦ãXZÇÄýÕ• ¯&4`æ×2ÉËQóR¹RTsFÁXXÒœ8;€ 2>¬¤ãΚ²ùµ¥i»3Í*cJå$ªŸß}†ï XÞÉј|0ÑŒŽÇ,îKÒ%c§UWÖçô×O÷‹Ã©àÄt‹\arN)qºŸ ûñáé!†˜¤Š÷¸«:{ÍÜ–»š~­»fBo¶ó„©”˜ï²zœ4ƒÙ½I÷3áÁªMפÓÿ‘ˆ“SÂÕí5 s”œ]s›ÓÌU"TïV,_rõ+†\å>JàfPE?7gÏÛÆ^ÓK9Wö•2ýÙ—¤9{­7§ùœ†qi'>t|¨Ÿ¬*LJ&t¥Öö]°}3Ý)>'à¬9"L4ð¢vÀ4Þd²ˆŠ0Æ%¿|ò9U ºxÕË ÞOäL8)XÄœ[>R–˜DÒ˜¸‚ìèÃôÁBÕ ¨l6fИ¯ˆÄߨ͎"s,á¶\bLö(‰ó«Ò6‰¸Žpó&sÇœrµ¥á֢˫ëï?Ø."YW[u•PÔªÒª¡±ZχÃzñüÛ‹ç·­=?Òx~țќ«÷Ï7e?Å—‰Q&ËN]ÉóvýdÙ5Gà53ŸWt>äÊ£ö¦¬§¡xÃTÚOHÍ‘“0½åºŸG4ÞC¤±W@$[”ò²Ð\ü*clÔèÒ\û@l”ÀÖ#6ä"kˆ­;*ã¼k£íì ªä±Z£Û~HòRsí˜ñhLt<*™iF Ú%ÆK#Ò7¢¾”˜2‘º¾o‰p=P8&*Œ¨(rÞ^À ¶i©¶Z~r]Úºíu vj 9d*š™£%Ûd}¾ÿáË•òåŠNta* ©ÙL„“‰†á`“鲿œ‘¨÷––«ötDIÙq˘¡P\\)IÔíå&e;Å/™ÌošH5ò“=Ã+Îs^!¡º”Œ¬[,Ò±@mP’‚'Æ:23_bÚØ` ¼Ë:¿¥2âE30'ùjz/¡Q}˜é6Úî87Øw6iÒåè"š8yÇiq²¥0+ìÅ3¹ƒÑoà–ª7g÷S¼îŽhð™úÂŒ#Þ\:áfwLJµçA…î›K*°#åÕÞõèÑ[}ÙüöÊ1^àÆW|ì_oÝh´òŒžc¦äÈ¥½}ïß9“°*o‡œ;8Üø=aãîØZ½ð ¯ïñd«¢^ýMŠKpû¿w;î açË,£H“ &ÛÁûøùX“Äåábx{¦õ¸¸çÀ÷QSú¢eAúñ Ë%ÊjG'p2§ˆ0îœË¢>Ç«ufLLc®¡„_cþ"ÄÌ4¶Å¾7»âHu6ÿà«øX]š­—g ² ÌÐÌ™60¥ _6ÿÁ…~ endstream endobj 7512 0 obj 4339 endobj 7516 0 obj [460 /XYZ 31.5000000 272 0] endobj 7517 0 obj [460 /XYZ 32.2500000 270.500000 0] endobj 7515 0 obj << /Type /Page /Parent 2 0 R /Contents 7518 0 R /Resources 7520 0 R /Annots 7521 0 R /MediaBox [0 0 595 842] >> endobj 7520 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1409 1409 0 R /F8 8 0 R >> /XObject << >> >> endobj 7521 0 obj [ ] endobj 7518 0 obj << /Length 7519 0 R /Filter /FlateDecode >> stream xœí]KoÜȾϯà9ÀŽÙ/>€ ÀZ¶ä@°€‚o6Á"^DÙCþ~8Cr¤!ù5ÙßT79-Ø’‡b?ªª«ªëùá_ÿžýó·ìÃÃ×ÿdߺï_ù±tyû';}ýðú]»Ÿ³²rÙ·ï‡çìùðxxlþ}>´/|}øsóÓÿ2ý©ùûKö׿5þÔýÒé¾JU6ßÿ}þ^—ªù)¿|?}þ¯Ã_~—ýz±Ÿ®[Ìõÿ°¶(Šü´Œ™©Ÿý6Õùë·o¿>´›¥ªÑy¦¬±™ª­ÎþûÃÏÍýðù±¶J•…-ó[&*õy&ç2¥ëf¤æïp¢ó—ÐðwÖÆü¼rq¨(S(ÿè’ÈuuÑÈ©Hþ—á# ^Ú2"åœV.•¹xtIä–uÝHë*üûá#Àßæ:&åœV.•¹xtAäÚ¼.#žÜWÃG\Û*"åœVëäzF—D®i>ŽˆÜ—á# nŠ7øyåÑ‹G—D®sß,‹ºŒü…‰§Oµ+—JZ8ø±*º?ðgrêê4o©M£§«*‹KSeÙa½v0s=Ú«ÒÄü¼ri ô4—Äl­]DÌ^F|—«ˆds^y,ÌÂÁ1ëòæ[ cb@ÿ2|„ÁuO´+‡J‡[Ïè’ÈÕ®»¿T¸—Ñc€ß˜xª»ri ô¨þ2^Iû 0ë={^üøtøð¥áEöôs³°ó„í·§ïÛüçdç1.{ú)û}žó‡ìé—ƒRGg‹ªtçß;?ÉõùIu¬ê¼Ð.y¢ªóÓ¿òê |'·ç'öhMkS]2…£=ÀÑð<1Z jÉ eøÖ=àrÄžyðhŸÏOÜÑèJ]?©´ÂC E?@ꊻ ]‡CV‚@0ž†K} r£Q—Ó®‡Ú02àðžÑ0š …‡‡KÂÔæ!(˜c}\¾ %æñ±52­†Äk1QÌ£ÛÅ~~j¤hèL=€!DÉ`f–x8#m6,N=PÂï¨öP›þ ,Ù)|S¶ìIõ@‡9÷p4¬Š1§ãÇ3^õÊŠ <šgƒxxëŸÂ5"ÛÏúXn°SQÂð¬úÇÅÀǧkD )ÕRDธGÊòÈWÍ ªˆrT士$ug!®…Þº"$ψÂ0–‚ª²9léZ°VUÏ;t¼ä¼˜+}‚O>¢'ªDO4|'‡+èÓÔþކït(ƒ¡÷“ÃV×Çwj¥>yÇcÇZ‚æÁx4.œúÑXÆ{ÖFð! %¬g®¼ÑvJåŽym®´Oaãa~Ä«çV†ï^ØN-kûaôy8šÁWâ‘¡^.E®”¾ã¹s0fQkmˆU“h€ßæ0-1zæ â;?vg2x"h(Àm k¢cÌúß½ï0¦KCë¡,²< ›Ê·„„ãrwã½7ÞþòÝÙ¶DHÊ:ÛvGÓîhŠ)«êªʪ»ra%ôºîÉ Û«×·n%´ÎvÞ'2»Ò0 ¶˜ÿGÃÆÆíüß´&a µÇé{ª„TQ”=¬\ÂY«âZÄЖ¥žõíŠ)ùC™»?ìüaHº÷uöêøVéSŽÖLétÌU/IÔÈ6Ôå6GÊšÛ*ÉSV¡¸—N¾¶~`L—3Ï5”°î{®È¢×PY;e^ a¿¨E‡1’ŒÁù æp„AÏÝ’òQÖNÌÿ)0±¯k2‹%|;’àxI Á/'D@Å €„ɯÓÞU~,JµÔʼn“(·(ãE^~Ö)µp5ÍÓùHVN–˽•îƒ5¢mÚ†s3^[Îý¥snÅ|÷y" ì•Ñ=uìFö"NÝD:»Jˆ”ù ÙÍŠù›4+VU/¥Rºêü˜‡zvZ¼cZ¬õ.°ÚÞâæ‹x4ìjÃX%hÞ“>é—IŸÃ§!UÒÈ6¤r]ÜâìÛ9arNˆwš†^*y7à쬶¡Îk*î|´¹ëU„d·ËD^9ï'À>ˆ'Æ÷[ÆrWÀX¾dm$ a„ë± ‰CÇ$"Ô@Êë·\LŒÉja-šsFer@'åžÀÄK˜ ;s*ž€‰Aˆ›ÿ0ËÌb¦Äz …e8 [JOÔK¿ÀWÀEDsý˜TÇrȾ°ƒp˜'Ë¢\-%K”ª%C3Âô+"•È.&¾€Hë áí©üþ²Z¡hÖQ8+‰[tK åÚS=W¿(¾—¤â°­ãp€÷›©ºi§=sZnî pP,/Q°½ÍË®î‹\¾/jIøøãè ý%T¿ˆ)0K=¤‘¸b cW¬2ƒ¥OYåqñH\[ÿç,ùS>‹ŽF©dx´Oéø“Î‹Ùõx¸.ç9÷$Íî´»†iTù8sKÓÕeJl‚!Ì6{S‘hn^cK¨"‹Œ/QZsìĺ¸Wþ”×Tc!PïàJ„E"u-ÜŸlá 2jà;LP°G=Ä4J(ž @]ãËZ✆۹[ÊÖ7–1ÞŸ¼Á';·£NÉ ç4 *oIï¤ø¿¨mËÆ“]ëÛ6RPºÊ¦é$¦Ñ4|£¾ìŽI g‡{ºÕÖOíé:X¥K<µV/N‚ŽoØ|ikµ×z”®õ¸z¸àÚâ'ÝÜyEÂr¼Ω†sF®Û¹×ÓÌ÷zšT¤zÜÃgj58&úá³ùpÎ%)s7œsõ>Ñ«eíIa aOG®ÕK÷n’!ºhéhÙ¢¢!io¢©=ãhàDe´7ÐÙn->65§®xɤžã$î9¿Àåk‘£RåU  ½ÿÅŽ±( ’ªy¨,Ï€¼vÌ–Îÿúœ•HÄÞ »ÜswkP¼,E¬US¢ˆ2¬»ÙJV‰J´«Â¨sˆº¾=jõt¦HÑ}· TÔ ˜ÊSù+ö @]r1ÌðæŸlº¦Š"ŠtÎcj{·>KÔúMUÑw¥‰\Mh"Œ=³Æ«f Ó#z¢Wæ–5¾ÈÖ…eø.¯Ü§÷{RÖQ‡ˆ“–Q e<ÿkd”ÊÙJå|L§Øõ«—z8,Q>ò³¬îy[®¬˜¢ªRYÅÓø`Ó•.ïª=eÂö1®¾©=%“uƒ35qQ›­4ÚŸl5ó–ôã¡^&ËW–ÞpžÎÃgÉÃÛ0 pÖSÆ g{Ã&°øçqbaóü¶P75¿å·8WgF:\’ivHdío€?½µ'¿µs÷I;o”{Ç·‰E_áГ1qO6ñðŒÓo7l,C¡TÔyNCüï· Tšn[ʤñ˜Ìè‚Wˆ)´ åq#æŸ¢Ý =ó áC#Jî'tð<¸õw=$¦h§…¨VãˆH½žýàwðÚRl/Ý%š¢ËŸÈÏ©_¦M9#¹E³yd/{ˆ†·‡\d®ˆLd‰Y„—“qP†¤“®V!€bnŒÂáÝØõËhE nil"q=!Ï‘UààÜë˜ {èE&†tÿH— lî\=9`â=‚E*‚%a÷f½^´~;7\醉1 žºáL}Zì‰&jš'[5ôgnzÕ8ú‰ðtbo¢Ç׊Û@âjé„¿9e»ÔʨÙõ¼5œxö#Êð;8Ö†:µ [¬Vî2kª¬’:ï»èÉj ŒÅ“UBÜèf½+IPZ»K×ÜD¬œ9èžVEë« Þ©‚€÷ƒ™ÐÆ]]ÞÒ ™gòq†çaB ºÄ¢‰¢Š„¢©®{Gz*Ñärw‰V•­#É\sì5Ø´ RYçTÎ]ßF›*TG¢¿Ä•Ì{ eu±>A¦(idÛ"¯Ø»G–ã$ œ ‚uØ'ÜÓ¸ ë¿X+œK%‹ZõJ¡K¤ö2ÅA<Âs·lßeÛ©‹aç yÑ'’±CQ™:¸Ç.a[÷À³Ž¹ý¤Á°¶ó&.ÅžÎvL@Ñþ¿ ”÷&„0tÒP_±{Ζœ&÷cu#×ú+`Ì3 s!¸‹9 ìºÊŒ† } =NU*1¶vsöE¿œzÒ˜0õÝçy^n N팱T›™°Dx¬H“šd%ß×JÛõ\昢RË+Y˜4¾-,N`¦„itQŒËså¨B¹"Í~˜¨Éדwͤü‰6î¹ÏðÓ5ÅÙÊ dÖní›±ö5_Ùsq/Bç~aƪÉf¾Í^suÂLv±uuA¦ÀßÊçrb¯-õQŸ­Æ7ýbü¤s7뉬8ä'4™ó«N­íK·SDœ8AÌ9óÔbU·õq²¢žÑä°ÄžØ†Â£Áw:>¥‚¶^¾-Kp§Ÿ›_«ñSª  'á€I.Ä„‚J/¦&àÚ> endobj 7527 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 7528 0 obj [ ] endobj 7525 0 obj << /Length 7526 0 R /Filter /FlateDecode >> stream xœí]KoÜȾϯà9€Çì»I`@–í9, ‡E7›`‘]DÙCþ~8Ç$r¾&ù©º‡Ñ‚-y(ö£ªºÞUýñOßþžýó÷ìãý·ÿdßÛï÷ßùÑyó';}}xù.íÏ™/‹ìû¯‡§ìéðpx¨ÿ}:4/|»ÿKýÓÿ2ý¹þûKöãßêjéô ¿¼òõ÷Ÿ¿W^Õ?åý÷Óçÿ:üõÙo§»éÚżþÿk½3ê´Œ‰©ŸÝ6Õùë÷ï¿>6X6KYÚéLYc3UYý÷‡Ÿë ºáóce•òÎúü-y}ž©p™ÒU=ëxžó—Ìè*ÂàÆøxƒŸW. eœ .‰Y«;Ø×åô<|„Á*â ~^¹8T:ÜâÑ%‘ë\KûUü.âÉò5œâÎiåÒ@éP —Äl©lDÌö£Ç~•—ñ?¯<fáà’˜­\³ýè€ïò"&ÙœV ³ppAÌ:¥[qå]à÷£ÇÀ¬Î#’ÍyåÒ@i1‹—Ĭ.L cb@¿>ÂঌI7§•‹C¥Ã-]¹ÖDT¢žGþÂÄS¢š•GbÈxpIÌe{® øeÄSëL‘lN+—J‡Y8¸$f]¥b2äçá# ^ê˜tS©ˆ .‰ÜÒr?z ð×_ ç´òX ~,]ûþLN]Öóúüt¬*³¨n0ŸW-b¼à{>Þ}éâÔÍÊÅ¡ÒRÕxô‡%£à¥4Ÿ'üSàÅO‡_•Íëe¹ìñçzqç9›o5PŠìÃÉ5[?e?ÔK*ÿ˜=þr¨Žµ6Ú-±y¢z’køŽ…ï|YþŽõÄhðÀ¸ aXµ‚Oªó“/5™DÇpÍêZX¸»OË1  ůxL£l‡-5+šÒæÍ”µ¸l¦4÷ç)•:ö$‹^€ !±òXVù>ÏO€ÚcmL¯ÁVœŸ˜n°Od—CL^þ ¯+ø\¬Æ„óà V0µŸ¸´¤Š!f<*:‡Œ>ÑðxY›hUUö†Q§ BƒÂj{q4ºT3ßQ 3U¦{i!àsC¬­ex/N ÞF‰,~"|Ö0Ëð’€T˜1Àǰþ4@ üœXì|zÀC Žf˜ÅŠñD(é¼2D†5Œ€:ú£×.‡%uFKbއì60‹(á;Ok"¶™?ãÅ2hÙõ§€.î†ì“ºÐf4«Sà}׬€p ÷jHmcû/`â€DfÄñ6žKÙU‰кñÖ?G×¥ÛÒæ½ëæ2xB¾5$4(hÆÄ‰%%V iX×b(Ÿ¡€D†Ò•Ñ ˜ÈÚüÌWœ+—æÁj—¬Ü,6®®£K?8Ï·ã+2¦ò*ÂJI¡dŠ‚Þ2jÕ|ÔYC˜‘äMqéÌ–fq3¹ôÆqO0=ßŦ³ÂªÙtаƒQGê?c¹–Âçåç§zzWÌÖ£j`ÕwCEšÆ;+ßp›0Ph‹jú˜~†O`P X¸žÇXüŽ&÷ ©][ ûrÃ\)Þ¾`Ľ0¸·wpmX+Åï@ ÒF0½0Bb!Çi#?VLNS_¡Ü4õ¥U–¥ò'ƒIÒ˜þ×¢¦/ÚÁ'}Űnˆe'sHBÒ1û1ט„IX…Y¿1êKì1Y¦MÝØIÇ: !’7W°Hñ+áÞt³bˆ`~‰áK$ºÊ&ÔÌŸRQÅ6iSìšW½IÝÁ` IÉ*[z! o WÀvI—„Ê'ÂÙÎúnÓ¢ál&ψZà8°„7™ Ž€‚ý±xƒ8åáZ‰.P˜`’heÉ\ ²ÞOfØ à`ÄF[t…8$&áŽÛÈk%Äç½P¸º!‚Ef@eÄnjì\ÁøÖTÞ‘†úT5M¢ ŒÆà9˜^dñ˜Ò`ñ¦¥Ê‡ôUï'‰›Á8Òç¨äÀ$‰1‘«@žñþ!J³ÊÑWƒ½½Cå"a6EÙ›{¬=$ô÷X{êsnz¥SOÒ¬´ìc…»¾Q%<±”\§¿¯²’X”ø(_Áy‘#½ Êm*¡™àköÃ1%­ïÈ÷„•²¡%\ç»Àé… Ûp 7Cß{iâŠ:OìÉäL&¯žÍÌMvZ[³*ÈômK؃ÍÕ¤>iZ½«l.7êµĸ‹®¨º¼ìó°!—”­w h7˜/h;3ß³pœb&̬þÊ~Òø1_ÙrD‘ Žú `¥pA¥®‡#ô #ï?³¯yãw¥:`ü0])D’*æ;ˆSõ1ÀgD¶WÙèíiЦ-Ð At+ùIôDÑ#·i…2˜Ùi*Ì1M‚e‰íÿæ-~Âí;fb„ÎLy-±¦%Øû†ñáÅ Ë×göF…á6%Ï ]¿qû»Evÿ²m£Wèçß¶AÊ‘ð“)!ßï¥ò‹84\ƒŸÝ©¢|MË÷DQTÀ/ßaVSy˜"ºÀì›Ç¥ã8Mƒ)¤bÊqÊö¬ãyÏz E ¯ cªÂ0ÀûÁ°Æ©pDñ:^u ­ˆø0‘Ù((e(Ÿ9¯ÁøÁ«fš?`,àÔK³‚·"ɤâ´PüD–bpn‰S¥ÚEBYíý$%ɦì%“âoTŠã¸5¦exÒk#$X€– Éh€'ËñSQ<Ó8®`Í; ÐÁ&åÇõSx6]âJ é– ÷a“+Ê„eçûFÆq  ¿7)ˆås'|áLè`\Y¸÷·žßG]¶±š1[à7]½_ìzÙ # Ü+‡½‚-°£^N§(Ú££WöÓêç¤Ë½¹ö-6×vfÎ-{Áï^ð‡ú´¦¾½åîÞ\{°Þ¦‡båm·±}ÍÕº‹þq©Ûîžð|÷„³Úê&=á·Æ}Wà¶jÀSÅ1¯Ìë>HŒ·êZÕbÉî__w‹Tw}ÞˆW› n`'¶h‚çªó‰E[¥Pù½ ¢Þ´Ö‘Èä÷n£Àz?QL¿U×r÷‚OÛ Ö¿E§ìBÅÝ$vë#§¬ÆóXà–cx§ØgÆä#b?¶Œˆ¬Ý€ßR†[Ê!¶¬Þp2¨‹ÑVœ©à¢‘Æ÷Ou“Æ«f¬|èHI±E^&¦ØmZé;•“T«wä¨|»Q¸¾ßxëÝÈΫ×&6t°Q)ki3Y { ‹¥.#z7FìF Û6½ewˆ:.5nºÃ€ îtA†æ­¸G¹ÊWL¥+ŒÇ=•îÊ©tîùù«wŒgœc+ŽDúãò „ ñ¦¼ BCÐ`èWl^‰^á(“ÞfÀCŸSÂ,Ý&t˜òX&õ3À¶ޝÓ!¸•r­$—,.²ô"ßA°®±é‡MY %¦Ò+Ÿ™T2zæÂ6ÃèO©ú9‰×{adž ;|ŸV»väÝg/ìˆB}}ªô^ØÁé×{aÇné­:Û´ôÖ^öâËÎ \{ÙK™÷ðÙ=—»çò‡Ýs¹v޽fyvkrfŲèkø±«‚poP*²áêf—Rz˜‹Lq)NB×K•<'OX˜1¹r»ØN&¶©Ü?ƒ”Ùª•ö‰O“ó¸çЦã(ëÈ¢®¬KL—¼ç.×@— òžË죹p÷ιKš¯W×-³Ç)iUÝ=i•1wl#ϳީÐ;­P¢þ G¹‡Oð>ÚÑìq(o°þX•ƒwÚö…Õ¶âöÒh9zØ»‚£AàyÔøÄ¡àâytžÆ6ñyÑÕLE¹¶72ÿ×Ã=¡JÌá¨êÁ^óŒy‡˜+Ð ä2àŽØÞdÒ°%²‡´Û\Pü!{c (S*µ®¢÷ÛŽ±OuÝ©h‹ØUûùðèÊ$ár‚Ïè sÓU ¥ˆIè!zõ ùÌϹ“8“xýî-k¾‰š©šõš.è…ÏT1á ¶ëWö-¨™ ÐÃŽ‘Í"kð²…ùEzo8WÅg5Ÿ2iÊ ãië…à¹#Þé̉Öàó$ á`J#.ì œ &='~Ë£¨‚+Ò¶ng8ÔMïQܱ„?sYh O \W¾‚§c¹Cœ`¦¬¤Í«˜å0H«¿Çô!Y=@U@i5Ù)1,Ñw@DÃ ì ¯‘_ ú)0JD;-0®Y@„®H1öG`j&*Ï\Û¨çÇ"ÓƒDa[ä’Á%J#k /G*Ÿ¬¬¢C5`!T}ÔÊ$¢XsÚ5-µÕX³ Ä\ñ˜Êà]`„-iü»@½wÛdŒ½˜xžˆJULŒa0×Õ«þ*?¦l4PL š©ð<8Á¯€éŒ¡ƒSù™$"ß—ôMR å¯ò7a~Èêb¨ ã”(oRs¢8eèZ¶äþ}ä¾Ìà~"×ç– K\€ƒ»Z3­ ,Ã!ñQ¦Œ¼åi(©ïNNqR|¶ˆò¼@¡(Q àö¾õWöT2燩_˜a³•ï—®­ª\<ûYßZ¥½Qì’Ú@Î_Ðõ*ÓG}®wŸ47~ÒÊa}!™WAUÿ3šÇLy|.­ík»SÔÉ [;öyI9\¬j·>ÎåÕpx?al\؆£ÁwZEC-Úú‹Kp§Ÿëwˆ†°kSÕ‘~“@«Â^r­Ü =Â<Æ¢ÂnÎY´ãV`c'âyö$—p?x§x÷vÚó¹9¶|ëBn ÂÖè$s~Èÿ‚'ì endstream endobj 7526 0 obj 3650 endobj 7530 0 obj [462 /XYZ 31.5000000 88.2500000 0] endobj 7531 0 obj [462 /XYZ 32.2500000 87.5000000 0] endobj 7532 0 obj << /Type /Annot /Subtype /Link /Rect [358.500000 95.7500000 423 102.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization >> endobj 7529 0 obj << /Type /Page /Parent 2 0 R /Contents 7533 0 R /Resources 7535 0 R /Annots 7536 0 R /MediaBox [0 0 595 842] >> endobj 7535 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 7536 0 obj [ 7532 0 R ] endobj 7533 0 obj << /Length 7534 0 R /Filter /FlateDecode >> stream xœí]M㸽ûWø`<ü’DA€î™9hL9,rf³ ;‹tö¿Ù’ÝmÉ6ŸÈ²ìæ4fºÇj‘Åb}±ê‘üøç¯ÿXÿë÷õLJ¯ÿY¾?|]©MS©þÏzûõáíÆo†Ÿ×¯Öß¾¯^Ö/«§ÕS÷ï˪áëÃ_»Ÿþ·6ë¿tYÿø÷î߆_ÚþÂ÷U£›îû¯»ïm£»ŸÔáûöó¯þö‡õoÛ÷Ý Äÿÿƒs¾VfKÆ™®_VûaêÝ×ïß~[}ì׋o£ÜZ;ÛýÓ:³þï?W?wì›W›ÖiÝÔ®Qs:j̶'Õ¶kmÚŽ×]kãŽv_iš×÷µÏ×øŽòä\ѶÖáÖSNnkîÕf`Ñ¡ù ü÷Ú5ù&wGyr®ì'·žpr½ÑƒôÛ6Ãä¾6Ÿcrk]çk|Gyr® “h=åä6[°›Üî‡ô,:4Ÿÿ­Rù4·§<9Wö“‹[ßøzø&ûö;žµB¸N´Þþ)¦ Ì„`ÐòxñÓóêãí:#ÖéêóÏ[v}ößž»é¨Ö¶‘JGóóOë?*¥ÝŸÖÏ¿¬ÚMmª=‰9ž¨¾ãá;† ¶f{ >?w“”¿¶æ¯n ?¡'>±5lí ¤¾ƒ©6˜j/êas_ÕsôŽ;íla}4ð‰r‚\ì¾ [¨*þ nÍþ/¥XƒÔgÂFúˆûa,n`Ù1:“T›,öðB±bY>5RBvì'9ͰÚJG«I##&" ĤIWi}à’£|‡iÒ3[“Œÿ­5‹ÑJb“j†˜•œáJ Ï–}]#nÙ“®¼pÔ°ÅD\ˆ†°-fÖX^EÉH¬o…%¶‚rYb~.æ_zŒì”tÆ|iêjGÏkÀÑã7¾UÇOsyêI¯Ânãlæôkk=Rô§Zkà“Þ ø×j~¨ØMåjß5RûqÇpÄsiÒÈäLÚdäp|0·à;ƒ<ÇMzÿDë=q—Ì ¤- ª5LÛå³?™§Á'ÇÍÓyA‰ wƒÅ=-cû€¥ÚXãµ¹L"ÄhÏ#êÇî;¼tÁ“@?Ìühl'Îñ §“iõÈËÌÊc‰ž8ü®% \Zw@ø»@?X?Yg´ÒðÒ×C §ïo¸5‹icƃµ »À$až~ÂhX‚¤‰2^®ç—~„rˆ%´÷.ºÚ¨Öë/cõ3;Ɉæ±Å7r[qnDÊ>³ª=a뛋×[c€AŽ–XÄ,Œ„-6þpjšpha,! ^nB4¡@°0­…Hš(7^;aa–R¼Njû,†6Æ”@³HEèžÉ¾ÊRiº=/Ù8Gƒå—Ð-÷9Õ Ïç@ÛfÒ²šŸƒŽ±njSÑÅU =¸ˆ ]ÛÎÁÆ0Õo +ÈßÅ…38Â<1¸ò‹ñÄ^OJ~Ë“%¿Cá)™s ìêdNÚ$p˜i÷$0)ÀmÞ¤¸ÿ%ÛÞmG‡'2~×ÌÁo Öò½rsPMÔ a bvׂ)Z<ÎÝ«ZSä)Çöc¢ÓîÉdN&¢€]…´‰í!vöá53³s”±iÌ>΀†q¶Ú´ëŸÎŸx×.q}à;Lµ<%á q#ö Þ}Še”Ñ`lýñ™‡°þ˜¬sø­2æÛÐÄ^yñóüoòì#1‰ÅVë~‚#&øŽ¤ôi•Û,C©qÉ{ {¼>38L‰V›ºÑÇEÄpÄøW¥V¦œ vÎB’®^ ~‡XAÈ?  Qjb£Tá{2a¸æÁv ꀨùS¨§ÂŒ F`ú Ž2¨ÿ€B1"ƒiût±öc°AH( C>$ {tE[åìÈ9ÞÉf Ÿªa\Àk"à¶7…ýœ#\ÆÀ{»×‚ ؆•šòÊX2Ó®ðx ê1ð¤H#…ìbTÏ)¨z lû^,f8–Àá;ÖAF˜.°’`y©(횀ìvì«ÔJF)ó!|Ëî"W‘vÇk[þž ½àH“ìkb‚ï$$%æìb¶-œ !rs¯Wq e™äEÄNA"]3 O# 'F[7š™ÌKAü»7Õk]ðïÁÚÒMÞÅ´ iÎÓó¾ðüÆKŸ wx~Î[5')Y´fr® :UAtæ‘K'ë(ˆÎ‚èÜQ]ÑI®G ¢³ :Yë_ƒç¯¥ï+ˆÎ‚試 ì·ÖÍÈáÝÉ~ëg+ !®óˆ¦jÛžŽm-²á2Š~£ê1?nN­CÁ³Óãá-¿æšqº½ò#~h±ÕÄ4Wípø˜I4’to:O2sÅ&sWµž¸\0@5æ±O2@‡'=sáN=f›Y+3_3PíÉIXÓ˜32ßCÇÜ•K¬}&³ÈÕ«]Ö‡ùÄ€Dܘ”c”G‚v-æ¦1âVkêx|sdÒ…#T—Yk1,²™‚;¾»G#p¢DÅ×>©š1î× `uW÷ FŠ`lÏR*<2’TíñC’¨¥¦™S»¼G jÓΩ§ *Ïy¯í .JV2½5sæ»`P 5\Vsîú,Ô‚A=£3ƒZ0¨äЦ`P¹ñ jÁ ^àùg V0¨ƒ:KúfÀ&¹rk'–‰öj.Èâuã‡ùœ£ G§_”ýõA+»|hOœ?)Yå…ØìöP¸+ÔÀ壭Š.PÃX²¶ëi?‰ ¼“4\qXmTkIÂlz}ÔfÿèUâêa€jÎ΀²Aä•ê{»0ÅÖ‘` s[Ü#zÂ\„“ö,LDA.–‡¯ ¨ƒ$vÌ@°æô?­9 FÍ™û®£^ð†¦!Æ:qœÝÇ™vì×ð“âÆî×%¾ó@ê¾G¦ŸËw12711&„Â;&t÷&ÕøÖjë#«Ýr‘¹×ÛeüØÜ3¦.&„"¬/ãM† íEøù«›ºNk1žÀ<1AÏüÕK§žJçVȶ2æÔfûþ÷ΞUöí'¿®¾â•<ÎŽ†cÑwûP}0¶y)'…Xt€é'ïI ×yO¯¹KVÏñkãN Ô`IýáÊ/‡±ºãdˆ©Ñ“ÁzÔ›ÁLíÔ;-zgz´ÛŒíÊPP=E›Aï(8žAÐŒF›"¢úÑRI6}ÀiZh€sØ‘b¸Ú{f£cĹ3»cà¸p¾"†b-Ø9ú€Â¥»ÝTHø¨´{ec®U½¥$vÚTaÀ=3i?bwp@7ˆ œÌÕ¼YRÔ97T?öY„É£–Û“ ÁŒw!B^±Ðz<@*7L0%fÙÌ$ ±µJZ’nÌê•x'fŸvŠ@a»œ³äöòbP|ÝŒ±UÃÝ1 „S¶d¿È¼unÄ©ü®¨ucWÄqTr"Åhêϰë#Rö×[J&)†K2‚=C„7Ns‘*!R¡èdI­<•gDg"“ì^w0çE,ì™EQŽ ŠèiÃÐs1ÒÎct_ë—Î5=ÇÓ¹_¸ÀµøSžÅv> endobj 7537 0 obj << /Type /Page /Parent 2 0 R /Contents 7543 0 R /Resources 7545 0 R /Annots 7546 0 R /MediaBox [0 0 595 842] >> endobj 7545 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F1409 1409 0 R >> /XObject << >> >> endobj 7546 0 obj [ 7542 0 R ] endobj 7543 0 obj << /Length 7544 0 R /Filter /FlateDecode >> stream xœí]Mܸ½÷¯ès€m‹¤¾,xf<r`Ø@AÁn6ÁbwgùûQwK=3T?J|S¤ØjÅHìŒFY,VëãÕ‡?}ùÇþ_¿ï?<~ùÏþ‡þïÇ/»âÐTÅù?ûãŸï^ÿ@·‡þßû¦­ö?üºû¶ÿ¶û¼ûÜýï·Ýù…/éþõ¿½Þÿ¹ûïÏû¿ý½ûáý/á×]£šîï_NÛFuÿ*.þïÝ_ÿ°ÿí8âð¹~2oÿÿwei«Æ§1ñéo»a™êôç÷~Û}8 ì+­µª¬÷ª4å^ÙRïÿûÏÝO݆ዃ-•jê²)Þó¡F¿d”Ù+m;²ëvô¡Ó™áU„Á«²ˆ7øiæâTQ¦VþÑ%7·®Ûž@ªŒ@¢—á# Þ´*Þà§™‹SeØ\<ºäæ¶Gñïä^†§¿í~XGÜÜÓÌ£\<ºØævRµí7·°è>Ææš¦‰7øiæâT9m®wtÉÍ-ëª'1Hô2|„Á+qsO3§Ê°¹xtÉÍ­Ëþh5u ]FAþFGù§™KeØZ8¸äζ¦7wl>—ÑcßoðÓÌ¥‰2ì¬;øçAðLÎ?w¹ož¾î>žTÃgæˆ<Šó±j24WF+Ÿ^DÐk£Fò]ÍNj¾p2m9[8å 'N†=ßißJï3Ô˜@Çuž–©šuß)¶Ê¾þÁ/»/éuk7…·´Ÿä‘j³ø×U&˜m)Ú‹Šõôv'ã™2¶Èñ j6¸ÝÂEׄ\d¤9Þü<7—GâÛ^>Mðƒ9ßéàÝѳsx¥ÄÙLf‰à#¬Ïzˆ³€o‹x*¾ÅÜ+ks1–HRÉU_¾*–É7ã«Üoê4ˆŽÆøðz’Þ¦m;-qñ¹½Ýd ±ÂV”ž›>¾÷¤º}╨”r¨RÍô JÄR5Ãeb« ›³ æ;8ŒÂ”*ˆ"´˜Fþ€¯!ƨØ<‘ •tâR5N+ËÂÊ®d+:xEšߘH*Ú8ZgËærê< ©@Eª¢TÉËæÖEÁ™¼†!H$´0ˆ„”Ra¨Ã'"‘žJÌÝ‹Ÿ€–ˆ53J Àb’-×àõuÌNkµIUcáüeœh( Õ†•0ƒhÃÈ1&7x±s‹¼±öÇï  Ó¿4ã‰,ºL*`°›*¨“Ï“ÒíH‚ðÞ¸˜ÐFµîD#×ÏòÊ5wÎêUr»¬èŒÉºt6û¨«R@Màòöá:²Ú lã YLhYtH&çŸñÐælZŒý‡Ø͘IJ¬‹ ˆ¨ùå ó²Ôk•­½–Ñ培sºf¢q‰ ȹVgn2Fª`&&<”FgJÜeãI‰‚²}¦μlS,¼Ù²È-¾!á —AÇ튻°k¥œ³/WÄçØê[u_uõ÷ò 0qM¬l. ±]uÊ5Í&Sn£:@Œë¹c‰yì–.–9¯$K_&ë÷&Sã—ïä$[î‚3º¡c:޲0iMXVÎOŒwùw\Ž«nË>ý•"Ë2$\õ`¯æ¹ö’TªÇ×ùœ^kã*Úß&0D´]cÎ-j3ÚDx«¶Ï1U[Yže\®© øÌ±˜xJ92ÝÃ>¢ÎiYìáÚf‰õl-$¥n¡ Ýçm= Zºµ±òÒ ó6V¶¨¦w;¾¶6V9€<æ”`ÝV—ÓkØZ_m­¯¾ßZ_ù¹7›ôl¡õl­¯n¶ùPÂÖW¶|OëÄ­õÕ ¹/aã[¿§ñÚêZ_|ÉHÒ­MRb.o/‰r©Ú$Ùój'oŸ[›$ž¾ÊN®ak“ä“‘[›¤„rèȱ¦>AIjŽ“±kK·º»Æ kÉ‹ºiF*†ÀeB®8¼Æ¤fúÞdjØcøã­¤¸+~}Q»ÊK"¼P.st Éê!{0âvä¢ð¢u7)­‘ëªqÖ–¦XÛYãÒv7U?ŠåslºDù?©`)Ø•„²=gVÖ#r¹2õÉØÂ&ìÍÕYˆ Ì1í¨¦Tw!Ö/“;B}gJÍ ãNÖ ‹Š+|`4íüfz³É®£»‹G?¡½]î–!štŽˆŸÜ–!”_çw²:î~gŽ™)ßV®Î’ÅÂ@Èçå»Ë/˜”ÌÞŸê+_Í;9k¥‡GïZ©ˆØòÈKWæHH1ü‡å&Ócfq̺1•D+™hÇò¥{*>Èmï{A/¼)uŸÏ=voëîE–5Ϫjy¦ ì¾#²^_že×¢ð|àçÇ'7p,MmÜy.îÔ ²%S,ëA5úƒ†OÅYÞT.¯Ï‡ 骼ЧGJZv¾¡ˆ'ï×Ãaù%\ÎS‚Ö­vh¸|»N4IJK)ÍWTXl9€ñC¾K; doe‹á'‘Û¶]ÀUÑ{ÀKñ;b5 ¸a¦iæ›±L ë|”wYp—Å̱ QE(.™ Q¥c] Õ„Þ†Ï*Üð6ÞÁcZM¯aÃÛØð6¾ßð6üÜ»ámlx§'Ë#¤ÂÛ8êr†Üð6î‰ûVëʾ‡“6¼ oƒÔZI¹¼¹Ô¹'ÄÛÐvžç†·AÓןNi§\¼}yÞ­EïW©¥”ÆT“3Ý0]|\ž Óå6y9 vLô„‡ß°·PÄ6?–˜ÖØ"Õ·é7f$ÎZ`ôyî z·G¾Miñ4ú£И3@X:ζgѾàJ— úâ R@Å! |åœí°’’¶(q˜ÖµÃÔ7p ˆxƵ5.=òƒˆJÞ¦.nU¶,…St‹ƒÂ(‡{¨ü7¦æs>Ô‘pß$Ñ´DQ厫µ„á0Öžxƒ…XMá꣸¡G”°Mãá”]ËäGÆ›ÄÇóæ‚1m_Š4bÌ,‹¿6œJ¯ñ§2Qa«$åµÅÈ—gŠ*jëód~–òÒæ fçh~Ķ–­×ÁÂu4{BÖáf»”shex+ôݘÑ#rduÄ|èñZÒ€B|ˆ{yˆÿ÷~ IODÔ"`WgmU+ W­”vº+ÇmF—¯ZÁ3ðd#ÀÜ| ˆˆ¿†q¦nÜ“?Cäþ¥Ê#¡úNËrH ¶J5“ó‘}ÂäpÊæ¾Þh%R!y©Ó„syWV×´ÕußÁ3È"£º2Cî­«K:Ÿ¦|rŒA†ÁGÕ3ælËÀP•˯g³Í’ÙfrrcÂO[kLJ½ r+Üö\~ PlÆ¿ãÁz_›Ófí)"±àÛôxg`º¶s”_o&Ú„“¡ñh3Äâ»{Kå¨>Ù)<=Âë*œ%&Âz=`˜mÙ080íÅÅp„µÔÄúdéžT_C=Jˆ¤4@~ ªB¦ŒGE-•wœ*oK8—6?Ú<)Ï£&)÷ÖGAa?Ï^­ð‰‘+½óýšá$›ÅÐX’‘˜JŒ¨[\²Qº)óbÖƒg#좘ŸÔÕ„À⥒D2¨±Ñ‡—Î$‚3ÅøÖ\!r¥L–8Â÷ú»'3vâ{‚¸DQ:ü©`ÓÅ8ü„€;Q؉O€‹yÜÔЉßÓ- Ç6ÅڇܾÚZz®‘mê Fé™8ª8œ/4¯ØºFOzMSôèÔ†¿Óßî½cá;åEw»íîÑh=[_Íó3#Ö£´£ Ý4œ¤u¯iT=HUW }G¥Š—4v°œ©‹1caG6ág£»‹P€¯(¿úXÆèa¼!ÅKϸa©lmD9„Üúž ³¶wÁ£­=à•ªšA$¥_H…’¢h"’nç˜Q’¢u^†í4m¯½ót±DÜØãc·ƒÅ3jr¼T78Æ­ ‚ÂT 18ø;žÈFc·Œ|†#'©‡™2ŒÛßd² ° .1\ÖqÃ2zöåR$6í9eĹ 2í0Ûl]¦d)›ÒEYI·`öË&À@»Pu¹·câ‹Æƒ° ÷Pt„úø[êö½VµqöAffËbš/×bªêZ9\ÀŽˆ~âƒî±™±ñ™+’áÌô÷ë¤\kŠRʶ¢Ÿw„§@¤/x* ™N‰ªÒRÖëw?9Ÿ *ß™TLyѪoO§4<7È/^&NúýtÚLʼnšáDœö$‹»8šÕ5-‹ê{ÁTLÖ»ÂÖ—F‰rO˜øp²êŒDñZ Ë6 kCôzå©ýÁï©,ËÕñ,T+{ÂÖrG[GØŽ™•\µªì; ¢bê·¾oË‹‚KSjuSÈô¾ßœ£„Iœ'ƒÝõ–½ç F³Ä)N®ŠKGRO¼-ÃPã|EtQåRù˜{Ô3ØÑ÷[î½Rh—jIÍåÐÞZŠáÓ?íV÷gÿ­Ûï®}žú…š­½¶¥¦ãÌBEý^_PT1gåÜ\9ç]Õ}ŽŽ(WŸôþ+}¨GõV žÛ'ô3%æ®Íí¹_)JßÂ¥Ò=üØŽ­Ç ìYãÚðÍ„ö¹² …Gƒïô‚V-ýUó^–áŽÿ.^ª0!ízm hØ!³€è}þùøÞõj£qþÜÌxÓ<ßiß¿Maýá}³ðÈáèßéÅØ”ÛÞýRªÂ endstream endobj 7544 0 obj 4993 endobj 7548 0 obj [464 /XYZ 38.2500000 438.500000 0] endobj 7549 0 obj [464 /XYZ 38.2500000 206.750000 0] endobj 7550 0 obj [464 /XYZ 38.2500000 438.500000 0] endobj 7551 0 obj [464 /XYZ 38.2500000 206.750000 0] endobj 7552 0 obj << /Type /Annot /Subtype /Link /Rect [373.500000 416.750000 402.750000 423.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps >> endobj 7547 0 obj << /Type /Page /Parent 2 0 R /Contents 7553 0 R /Resources 7555 0 R /Annots 7556 0 R /MediaBox [0 0 595 842] >> endobj 7555 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1409 1409 0 R /F8 8 0 R >> /XObject << >> >> endobj 7556 0 obj [ 7552 0 R ] endobj 7553 0 obj << /Length 7554 0 R /Filter /FlateDecode >> stream xœí]Kä¶¾÷¯Ð9Àöн€ ÀÎ>ä`° ä`ä¬ã†mdâCþ~Ô-©gZÒG‰_)©[Ø3n¶D²XüêÁªâû?ýGò¯ß“÷¿þ'ùÞþþøõ‹,mþIN?ïÞ~ ËcûwR”Yòý×ÃKòrx><×ÿ}94|ýø×ú¯ÿ%:ùKýïÏɯ?ü±ýÒé ¿ UÔ¿9ÿ® Uÿ•^~Ÿ>ÿ÷áoH~;½±ë®Ìõÿ¿³YšY{ÆD×/‡nšêüóû÷ßïøõR¥*-ËDYcUYü÷Ÿ‡Ÿêº×§ÇÊ*Uä¶Hoé¨ÐuOºÐy¢tUÓÚªAGç™×x¹±y¸—7#§Š2¹}û³Ï[ðPœ<úâxðéÛáý—*Qyòí§zdç›_ßÎyWs¥JMòíÇäõx>ý)ùöóA©cfó²Þ»§ï5-ù¹¥<–Ušë,}ÓR õÔ´¼~U×|>·dG£KuÝbÏ-öhMƒ%¯-eÿõáWñëñ`Ç*%¦©„G= Ÿ‚ƒU -L·n³‹§Ž Ù@—ðû÷cpKIôó¶Tp¦°#¶ÂS¼°]—Í0UzÌ uŽi9ø‚•bÀj¾tŽ%ð4DÀ#¦E´‡ú×¾Í1A< b)šž^JÕ0†éÚ€Àó’Ûw$–tý…],Ý$–ž u` ¦h4¥mvM¨1_Þ2ÛEØ.Ânµ˜ÂòÐ.…¤Py™ÔÃH!…¥”5xÔŽù02 R4š|2§Ö fıÅE¤†;# jëic$—ChãÃf ÃC˜np¦ÖúKbÆ ìµ‡¼ðÀý˜%5ª÷›ÅX&S'°dÉFÍ&SÝ0›QºÛOsp›MP:0oÛÁÓ)o Ÿ–(Ü9$%>ÉÍã¡›ÕúñÐPºW€G6+¯ µ š,«ûÊžsß½V¼ÇWø©¯eD8­º“îÇS k±â‡qSÜéæh35nÑ=ÓÕõR9§‰½îôå±KêC;dØ/r4¡XV_žïÊrx¶M"†+ÖùFLF–_BVv±M,Q#(ü)M`åiowµ ¬µ ,Âáâx†-wbÆ”O¹¹D¨<Œ|Âý0cÃæŒãmÛŒ¿Í‹î@&m=Ï#ñ·ŒDa6Ö”wAYã㎠Yó‰r1a5üÃlñçp$ÝâÓÇ>.â(?ƒí *µ ÚJ*fí3QäF‘v‘#$7ð¨1  ½å†cÔ¸Ÿ5ËÂvG]»Üp¾m”ÝX¤lÄŽ¢è‚"q~å?jü¶–+–ÄÈRM'§·¸-„Lᵬ;1°ÌÈXQE ã¾éøS<Ø+íã¥ô2®hG¤;›# u<¨,»3auR4DÛvxl|Å{Ñh6?LF-– Œ™Î8Û÷èPÇY¦ÎPq‰eäñ‡ÁЦi 1“àÐÀH*í9ÈûDT@*õxÉÛÂY„o ?³¤Ê²ëIû¥û0pB¸:â'6}Œ•ÍÞÅ媫[­PÇcŽb„õÂH[`k¡LX94‰8™‚ˆ =aë6ù$, ÎA‰X9ífJµ©.]ÂzZêÃ|HÀJ=v‘ñ^÷Û–Ž:ŸMyfÓ`€†‘ZÌ4°DÅ~ÇrÓ2vò…5,˜)ÌÖ˜y±YÅD\ž‰‰™dŠÒbĘœ•ÉÉ™ÎOp¦k]¡ëòKgM¬çFËQK+*²£îˆ¶Páõ AkÙŒ=c/› 2×jùœFϤxÍz«¼c…>súõçÓ† ¼ ÷£V/Žl¶1ºá·ehÔ­…0ò6L·VH—Ë:ÍËkâªì˜öÉNX‘p`bw 99B ç!•;_fœýÖøk Tý5&—xñиÀ™ ß ùAÖ+ó Ñ2³Â9™º¢Çjµ(›_T᥀‡’°ÞõL›ž¬kÏwŠ×Ìôûd +Çvœ™­Âî—^… r‹F }„‹Ü'¸?Öý'†~6Ñ3JÉ S`âé9Kñ§d8°àKá­,¸¾Lªùd–Qó…H¥Õl!‚“N×hõ‚™Ò©!éN8 :]ð”üZ£~š¾ýä—Ã×èw<Çp½.-—dHšÅÁƒpYȸ±¬ˆ%¨!KRÞÈ–x u¨yB>¶:N°Y„\î |ÌèÃÖÔÚ”Êe?G°ýZ7§J»È5 #«´X.¼;¦G×ýÁ”¡2·ˆü,½÷‘M"e:ð™P$qUÿXA²¢ÁKÑ„‡ÿH²—ÝU"„,·þ·W¬í—w(^xŸˆ:~7`pvüZÛ¸[Ž«¸]òÖÓðf»0ÙF˜á9&‘³éȘ¸—úM Ú“EgYÄ1·pCH'EÀý_æ}Ó$Úõk»iòª[Å2MžgªÙ¼uzË>èmDYzÊš4Kig¢V N‹Ñ˜˜ÏžŠ³1ñY߉àWËgðüšïòÙ©8ŠÔ‚^ zá˜2À%{}ˆ‡¤­÷°ë#w§È†µ¬ú2œµ¬BÈhƬêIX‘çk+hUuy§øª€+ÊMÝ{^#Òær­åÔIcØE(‹ÞxÚz-~…øàÂ)X*BÁgwá‚xÔEè%U…íÑpÖ`¤?ÊIÓºóû⽹ȩAËôwÛîßàxB¸>Ú½ûf—vEQÆt~¹u+cX¦ãÃU¨¦ÝP2¼šfÒË…’«PÓ^dz«i¬šöJÃåý+P·ä‰Û”‡,²s&¤Ê•÷Ñpwûë»5çŒ1]áËÉðl?±‚Ý68ØjêÊ®ú@‘M®¤pp*öT3† ‘FFUÑ–-ÁT”eæ³f}ð>wi‰fº;¦1?ŽAë˜hÕe¢$ª5<Z{¹ò+n*:Ÿ‰³ qÿ›×3’™[ÇF7÷(ù͆ÚRõ­¨x^vnca<›¿é3u¹j »¾dýëÓWb÷°èu‹¹”×X#ùÞRÛwq{§â6hÒbÚÅ]{MÃq Ðúˆ²f?@à¢Wk.IGd¯%ŸÖ/ÁЍbéØŸE)¦%êàø¨xDyÝhÅ÷Bää…Ì*,«ž<[‘Z¾âÀJšÞøX7²MÞ®æE·åÊŠ-¦ˆŒÞ£p9%+¸™3TQ¬ÕØ€“õòF* âcÙ‹æxR¹¤|Eä.+s9œXeEe{ÃŒ¦»3!/ ÃŠÂÆÃzÇÂ:µ5=6|ì“M£Òþ¶­}늪†§¯PÆ-\ø$¤³³û^yýNÂöE²Ò ˜w$Ö0QX¢º:ãJcîcpÐM¢RXà›=)†=xòÈýr“åõ5Ì JX¤‚¤w둌1Ùn8æireEOà {÷™ÂŠëK1»×[W¨+Äbyçßžº…hšµòf…îö9ÕÂYŠØtÅY ÛÌqÈÓîî”X!¾¡õ—OØd¤ÔnÚ8ñn1ÓFVvÆÒÄäb¬ÑT¤riâ¶òÜvX»ümå)îßV^v09¸]ëéý[·SÔ‚ï wÜÇÝpÜØ]á „çG£ô¨V8686 [ÔÑEáýïíÞ£¾Ç÷ŸqP§‚#€´vŒ?yG–Ö˜¢­>ƽ°̉xmüÅÈ36øG­^œ——CSæÎ£MÝ×%j Ê:°4ˆäɦâÆa?>9QLÒœ¬aOTB¢l‡;­+»·®ßâäÖoeM¼°°ä$5d•ÓZM¾–UÔ}ž„ïêâ™RãØe@·xä-¼7ÿôK6NQÆÌ”™_Ù0RYu'Rìs…äd,å,á/*‘ ÜÙ&C-*ƒË[¨JL cXe4†HŽ©ð¢V®N¿–µãÓ)=l©±Ò?:ÞnL)?":ªþ+«·ÛmÄ·Ðz²cÚwö|€okDºk %=D!ÇqþàQãF–ñð”#¼gªH³IúDÛ'"ñdK€RÖ’꯿:æáj«Õ§ ès÷‰$ÿNOÈóÞ¬a¡aG„L\˜,N¼HÙbclŒÊ¿Ø•QB|Ь!QÖ+uÜ&oy†…È^~¢x9.’Žaç†,™2âšT—Š)0—·`ŠàúçPÀ@Cµkóœeð1_Aixl­lkÁµÙñ|pvAÇ>cÞ†á¯ÞM˜L½ýµˆ')¬av |›ãâN/¼ÚŽõÁ-˜×ah-:Þ¥ºÄ­oè'¹1a?¶0w͌ăæ)"_šlr<Œî°é»S¼Zú¡%1Òž¡Á;°ŠÈ}™½û¨», ½dÕ-x¦˜û}ËŒupRavNº©Ó ê:V:Ì:¶ÖlbÉ=Ëìn†ceå+£“â±1%pÌáMb¤5FEQ}™ÂrìéÂZ>a}®æj¡ùdL‚âòRXt¦w§í2ö&¶Ó Ë­~,6Þs˜Cp Æ^ø C똶p¥Ôäx„u.Æçйã î‡ðD>ÇFÔ|+s '™ˆ§ƒ•­n)U#ÀbF¯ß¦'‘ÁUÊÌœ¹AL´Æëƒ[Ö¬exµ!Çã5ux" hŒ—˜Ø–ÆZÛ&÷^GKL™‘—“³s´`}Ñ$¼uØ¢ˆ¯1¢#`Fmº­Ód醷¬Þš(‹[öf$ÍÊbiWËFÚµÑNeý•0bˆ‰½¡¨ZÕŒG„ôc¦2LÆÆö¥é0s&‡ok3ÛûÂEɇla×Äé0#ÓPømð™6lZyMýM¾Ëp§¿ëw i×ny/Ð8ç²€éèÝ|>fo×4€ €Y/š£Ÿòö(Rsl7ïÕJÀ-‡WB¿Iæ›D¨çäùðÎ5 endstream endobj 7554 0 obj 3940 endobj 7558 0 obj [465 /XYZ 38.2500000 545.750000 0] endobj 7559 0 obj [465 /XYZ 38.2500000 545.750000 0] endobj 7560 0 obj [465 /XYZ 38.2500000 305.750000 0] endobj 7561 0 obj [465 /XYZ 38.2500000 305.750000 0] endobj 7557 0 obj << /Type /Page /Parent 2 0 R /Contents 7562 0 R /Resources 7564 0 R /Annots 7565 0 R /MediaBox [0 0 595 842] >> endobj 7564 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 7565 0 obj [ ] endobj 7562 0 obj << /Length 7563 0 R /Filter /FlateDecode >> stream xœí]KoÜȾϯà9€Çì@°€-Ùr X@Aw7Á"»ˆ²‡üýPCr$qæë~ª.öÌ0BbGmö£ªº^]ýõÇ?}ûGñÏß‹wßþS|þ¼û¶)·u(ûÿÏ?^ÿÂ6ÛáïEÝ„âû¯›§âió°yèþ÷iÓðíî/ÝßþWØâÏÝ)þö÷î—?ÿèùüº©MÝýùïÝŸmmº¿•û?Ÿÿ¯Í_ÿPüöÜã8Ü0™·ÿÿƒ¦ûyžÆ‰¡Ÿ6ã2Íîç÷ï¿m>ö˜7J[ºî§0Þù´Þÿýiós7ÀØ}¹m½1uåëò=Õ¶ÉÖ¶*Œm;Z{s0ÐîG¦û;_¥ë¼Ÿ¹8UŒ«L¼wAæº`š@Î% ÿK÷ :¯B™®óÝÌÅ©207Ò»$skz¹¦L@¢}÷ èïõ阻›¹8UFæâÞ™ëM;¨¶6¤ ›Nqú]¿ÉçyæÒDX‹;—䬷eBÎî{OAü`ÒíÚ~æ©8 ;—äl¨RîÙÐÙé©”bS%ܳ°sIÎÖÆ&äì¾÷ÄoÊ„b³›y*ÎÂÎ%9Û„Á…µ¶IAýÎCe“ÐCÛÍ\œ*#oz˜Ó žJÿ¢?E>üü¸ùøÕø²-LU<þÜMn7fÿÇcG”P|xŽË½/,þX–îþ‡âñ—Í—ÇnêÉGmì0jv£¶Ûʆ‘0§ZŒG-¶”¶´°¥™?ƒòÓüq§’œ›)a ¤Ž±°ÅÔ³.?ÖûùÔÁ3°˜Û_ .|ßÀ•Z¼R‚¢‘õÀqL-IÑJHdÏAºáÞ"3Àü!¸‘b×Gd‡Xi„Û˜¢ÌJ±`ÙÁÔÁ»ïLLÑ;éev ^)Ö‚寇Ñ„•I"£*^‰)Íh‘ñ| }-¶üX¯cY†V/BE8ŽÃ3À;ï&,ÿ„¥Äã`­êð>cä’±S„®±PwâÜ›û¬¸3ìëXHy,}‘uCY¶p×ZK0’¤Jy×¾ƒòT‹’FÐâ£k¹šwP^37u½À¨Ö„Q–Dã~ #ÛH\ÉÄ:Ø“%bÿ…9ma²‘D”¨µï=Ö<Ÿe®EœIÊJìòvú»Xb=¶Ö‹Ë2ö"ñI–rY½ñØáJSS”‰±`z[\Bdµ¦EíLj6š‹‘—¿Á-ªôõïÉ–åžasU­- D~6ržÅ䙊¬4e±©.D®|9æP#ÍùØ42¦R'’Ï­y‰xdx?1µ(ØÃÄc‰?IÉ _öÂÒŽ*p2üÖ»þ¦ätͶiËÝL§ŠçÈ7n\t]…É7½[ÝL%Îmƒ¯šúõ?õ_ôvM§k ²ŽcÏGžŒ{ù=x×`k‡ë€˜LœEÅ3ÀœÃ{8Y÷XžÂ\)£i·BOŒ„3ˆZ±r’¡ÃǦ͇ðìZ‹ÊúE…ÃUÙdÃay¢Åae-­Ãa;ÆÊ¶’µ)L{lH[õC6ûð¼wÀL¹í]ÇW$¨PËࣆ­ú›¶!¾ñð›}ãzÆ·­Í[7¶„ë®yT[gìÄçî ¯1Ûк7½ Ž^½uSo|¸Nrì‡f¿±°%BƒOp¥¶T¨7LƒEÛùœc¨é ¯r.BkLƒ^¹˜j ËΡ–(‰F,és"­í>ƒÇ!f?ŠÚùAª¿˜XM·¬Á½}¾q¶1o_Áo`ËÀcßøù³Æ+޹žñ¯Âq7ŸÄƒôtºo Ê„ŒŒƒ—q;À|b’˜„tExÛL–¡¬'¨™1ÒøQà "DÁ㬌þæóÙÒ…sV‘SŠ0 “+À¹áÞà7˜øcdÆ!„vpúæ‰3ÖÒP½ 3Hhƒ ëȈ6¦GD^ñ¶›ªaŠá˜­²û0ؘ(Q`LÖ“÷¢ØÁ9wF`¥„Õâ§ó5(v c€µ.åý)ž.ÔuóvC‹ü|Ѷ9ߘŒdؘ“D&÷†ó<Ì7ø†:ƒ™!{«ß!N1.´ ‚@’ЪúŠÐ€Áæ­ñvp¬](ºáWBWExJœÞ ïzâ~—ÚÞVBk tƒør g@Ç[h÷wAo÷@¸J¸a‰)ÊÔú3•xnX«ÊÞÒˆÜÎ’¥(sfÆT™17UORóž*GŒ®F¡ja‹ë1šÖÿ¢Ò'|–«DQ|?>¢‰a‹Ç;py]#*;׈QѸpR.——ØH•×ñ\EåçG–Œ,ò¡RäñàdëY T¹ˆßIÜÔÂ%›hDh¥ØJd¢!ظM›wÍÙrûžÀÍÔÊÑd€ä+›×Á¶ S‡ÁfÌÖœ­pÎ6rÂpNg„©ŸVÌÕµf¼7$k%‚,‚ö¬sÈ{Êû fM!š3hh¢¨Ô^˜,ò³¬•`²¹§Pä¤4>3kÙSáå³3>ÑqŒ—uɸ‰:ÖÈíé{;'GÄÞdìõ‚¦®/4KßâÌyYm=#»¥32¬.’§”­Æ{[t—hžG¶þ=KÌŒð­iÌ-+æEÛj¬*UÌ‹ú.`©p3˜áíyΣNÆÕšjw˜ ˜ÌË‹[xEäv_îo°¨á CýÍD:Œº:? Ê%Q]$ "u7CƒÛ‰2÷ØýË{±ÂÈï¢/A1u¿‘q˜ Dc²g€[(º1úI‰: Ýrö.#ÔÁuœ¸¶P/ôeõž7[nG—Ëæ´ÆŽMgÌ€AŠ OL*(‘9@ë!wÞ\•vóÛ6L7\.7ñjÜtÕW%‹ •BÒ1ØYÚ=àk3‘†5_s>~B Q¹j" îÞ K¤‡æAcèÆ •a׎Ày<ð;ÂhdÝÔŸr Jà´{Æx"A²E Ù0©gà=.A™ƒ#ˆ±®€?šP¶õT.)û3DÅ(Š¢Èe>ddŽ °#dŽQËŒ§ˆ·ìùÁصÙ^&A¡•"‰ 3Ã9]4R… X]dïòù' ?òÀiÀ»;6xŒº‡?0g" '¹…6H ¥Å|B¬õ°÷“’dÐnE»e0ÝÈåJ€ÎÂù¦óد%/x¾‹˜ì€2q 3ÂiªÒÏÒàx²8®=èþ’œdEdo÷Ï7SO,.^Ì9T'Ê,1ŽZ s9#,~ôN]-¾µ"p¡êJ6siS‡‘*æYÓÅ9' …" (°ó–Ò»piPIJ(^³Õª8ùCÞÙŒ ÄãàGòÂèØ¼:†¯ÃOºõs›÷„ ~r?kÇŒƒŸµ»ƒëÁÑÁgúÆãƒ93ÐzÖλJûY»ÈIN´1ì !µò8zÆÏ¿QÏÌHâ°y­júŒY$l'Ò«sÎИµnøu«´…†Ô ‰h¡æŒ³Î Ÿbd¤ŒÉ~1*RẲš˜3æX*²¶§t9\vºØˆÅMÜ]òå„êx¿áÔ@…c’÷îkØþfÀI¯¶¶wáSø•§ƒ/Æ{_×ö„ì=¶Ë|Õ!‚¼8®¾ <–]Néf¸æ­-_÷å"éH×’HæÜ¢¦!€åÿ"uÀµY#æöEQæèdÕ·ºú¶5Ú”¿È5À Ó*é[‡ññðMJæ€kÓë²VOô%!ÆJ0z}µ¡×gC#4À> endobj 7573 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F8 8 0 R /F9 9 0 R >> /XObject << >> >> endobj 7574 0 obj [ ] endobj 7571 0 obj << /Length 7572 0 R /Filter /FlateDecode >> stream xœí][¯ãH~ϯÈ3ÒfÜ7_$„´sCâi4#ñ€x@»,hÅ®ö¿ONl'gì|åøKuÛNšœáô¸»ººîU]ýæŸÿ¾ÿçoû7ï>ÿgÿC÷óÝç]q¨BÑþgÿòç»×¿°õ¡ûû¾ªÃþ‡_v_÷_wŸvŸŽÿûu×~ðùÝŸûßÞîÿtüïÏû¿þíøË»ôò~ÙU¦:þü÷égS™ãߊóÏ—ßÿk÷—ßí}™±_®æÛÿÿÖ×å KÝõÛ4§?¿ýðëîM‹€y«4…o*»7Þù½i¼Ýÿ÷»ŸŽ ôÓ‡ÆS•¾*îYè¸Äq¥:Ô{c›#Úm=ZèôGgz£?y(Žäkòru¬WyvÅà ÆU‚Œ€ÿËô&·¡ˆ7ù ru¬t‡+Ì®y¸®îÆ"â~]¦0yp&Þä'ÈÕ±Ò.ž]ópCèÔ„èÑ_úxR¹…\)ýÑÂÉ5O¶lª˜l{™>Â䵨ÍOGc[<»æáÖe‘mϳÇ@SÚˆ„óy,¶…“+žlYµy Aös¤SÈ~NösÖîç¨ÅŒb^ `[3vþx³p„-©XÚÕX y$¤IWRõš°|ÊvD:ßÕA Iá‡Ö@¨ûâ$Ô©ú%ÛM{ðîtç‚ÂÐY•áé…$Ztøþ“ÑÁׇú¥¬éõ7ypeÄ´( gkóíHB·ÜTÏGðÉœoÂ,¢ÜXµ°(‡P÷LWàH/N£ÊBy!@S7“Jï[0JpªiqSjÍ¡¼šÃnµÃE©\Ê,kRÖØ¢Î²&¹]#¤ö³¬É²æQeí½ÊçIm.o×àðºÁ œrÇþ† K!œÒÊ2`ƒ2 Þ›æš°e+êê[äšâÐÆŽ^¡£D#E‹¨p°Ã€“­U¿iÐ7[{(+SWáÕñ¶#åÁ™»CƼ²NÇ~ÆBs ” úµ<[KÈÕÁhp6¼S¼ŸNÕ_;9 ק݉Söq¿vŠ×Ñ "MÖÅGí/¸ž{GQÐN]‹uZ8Òâ•ÈiG®×bª%š­Ó¥î|YW·àÙì»3ÚÛ.ß8[aƒë`tR¯¾Lïæ#¿£yãúHó¯}ƒ×© ûþSt˜ãÁD•h|pxa67Ä,žÓßÛá$˜)?tRr”€ö¡Ç´D1?œ:§Û1+0 aÎI@ÊÇ!°Œòü‹™ܻت*¸¡®Âpºx ‘Š yDF˜OnÇ2†Q€.,°ž ô‹-‡þuÍȆ0ñ¿Ÿ/g:îZJ7ÔªI0f Lš£€T•‰. #ŒBņ‰›mÞîò«4½6d3GÔ’æx5) ó9$é‘™âƒÖž&Šx\9P(×H)!\vƒ‹x,œ ÓÅ-ʃ=ETÆÑ ÌV×Îá-Ü„­Kx\›€Ú@Æ6ð&¡Nž÷¦¿yäp 3[œ6Âwð͉÷p á:8˜Ì$"p 5U¥(UýŽ×ÁÁ~œøÅÕüºPcJdRŽF1]dt÷ÔÒ'«FfnBa~Æ\›05郉ƒyL¥˜â–O}1S…êm;à7X&a9é2U©¦2תÞEd$¶%Êo…BØ„Ò`U °äJ% ‰d±FH|,wp±ÐËL!øäð–|ð›×itN5yåûJD‰†`ñÖ¡Ð'S_Z‹ç\dÎP–òêgFZ1VÖŽ‹û”¿ù€6z¸”*¿O¸jÝw¹z¢¨s! []‹û²9^"Á¶ÝxIY¸IxVPš Ël—÷¦Sy¹‚WÈØ¤øªæ@Bz3˜ÊÓ§¼BÂ2ZÇÕÒö‘Q=Ý?‘>+«jˆ¶qzßtÇ)©dêµ²"'$ã`bílˆ¿ÁûÑM.æ¤_Ò¤_åÎyó6QÒOh“E˜iL'Fá;9Œ[€ÍÁ”Â÷…VavVþžÐÉ6ñûˆ…ª¬ï8Çœô“¨ß}^žÊs ‘äçœBÌ)Dq$'qÒ¦«Ë…ÚœBÌÔ—Ø~ª‹òJÊ)D‘3r 1Å^îm'L!6E_\øD1–ÅSˆ9úò˜Ñ—ÆÞc¿l3é·fo:§µeÀvÓt;w.M•¦kš¾>§ïÎS î<×k8¥“(åÖ¹3×næ´KˆeáÏ ÌŸÇäJ”Ö¥nÛ8¢eÚ*L”²(ïqŒ“Ýãb”=¦¤tj¦,êp~—8·¡Mö*óòÁ|âs¡èße'¸Ä QÈ>¿°L–ó1íâˆò!O‰t4ÆŽ€7œxd(Q·='æ9L½¸x‡àSÝR:B^ YS]kâj£ÒVu$zŠÈR)D¦*€©’›ª›h?Vöt¼þÜ3@x8r…ïùªd‹Z¯ðáW5‡E)¶“)¯ˆŽWøyÆrgª—K™‡0‰_·é*N6#Ò„+À&R…L©DæÈƒ…‚E`SÒ"ú«¬©rA+zÂ~¤Øtc¶Lªx†®Åo ™¡¾,9žŠ¼·)í…ýiŸ9)b R¤°ÓjSí>ÀQ'×~hO¦°$Ä…¡‘0éÇDOåo7cUÄ?£z¯‘‹œÐÅ”ˆŒNcFšW“à}1 é*…\B®çvOX˜„I.+Œqn("Ó·b¦@Mm® ¸¸‹Žd¼Šì|Œªl¸ê¦øQBŒyŠG¦$c‚°®Xnõ '4#ØÝl¹ÉMU­JV(‚aÓuÚ÷gF؇1XfDg”€é†ž%`ÃÔr æ1Ñ›­Ý¢^±ñSò²ß˜+S‘µÖÈÕˆ¦Âï·ó #r™Ò`F|R巉ܯD_JÀQX†š×'àºR©k/"¤F FU´ÓµK˜ ÿíi¢±Æ½=:?ƉJLIÕàën3ãž´©Ž)¢ölL5ÔžiœÓMRZë˾ñÿó”T._Ük™n2pD(ºe 4u_IÕ§rÍ嫹HUÚ郩Σ-בF.Çõå@…=S‘까Pë¶üí¶È‰Rl8ÂÙ„»®KÕ¾>Z-Ê kyÎ9:S ¹v•Õ#Î5C8·uax.$ã˜7òëõ]œðø¡˜²!ô•eÒ]°@*¸*¢X²ž9U=]QUL3Ü4úƒ–ké²î¾«¦lªßÊ ¥d\5©jSe;"—AJš˜zý!jÇW¦U÷Œ›/d§‰+4T¾G¨/ˆZZ >—.ˆõØ¥ ñ; çzø {Ý‚Åm^ðœ!…rw¾»¸ÝâÊlŒ%¼ÁÅMõŦâ4*å§œ{Ì|ëÚåƒ 1Õ@0=ÙuŠ¡Vã„æ;k±,¹dýƒUBªzÒ5~ÆIÓë:^LSõdö¡Ù…8n¶M8’ *Wm¸Y*y MWÞ˜ ÔÅ6 ^â`y»6`‡‡¹s@|³XPz1c3•û©Òhšº)6ãEÖ›”Þì>A.ØéMßn ¥{LôŸ~i\ üdªß¸µ¸Ñªd¬Ôn=9P]&û®[ª+ß]ŸmwÃÈ$Q–«º/0Œ=­a|-Ùx64v ?=®ÐWoR)ƒ¥êþîð*#ßÜ©ËÁù O—Ǹh³0Ð…!mªú—›ª÷ÚBå^NšÜ4‰n¼>q{8¡Õ·ªçˆZÖD-áë:ÜäLÆíX‘ªðŒÁšßÖnëµÂtow4Ô}¡^bÕ;ë.µkÒa¤¼4¯Äw¡‰}ãÎßb_¼Cž _~ÆüûùØYù >é|,¾RÏôÀë`)÷C=s·É"xÄá·¼àH€|*Èhשx÷4òXVaØð™b>e䎪FfÎÇb^ÀüCŒÜø6¡æ·ašb§eAWCýa‰ž^‚6bzà^A„p€97x!úš­Ù^:¸évRÂxÃrà“Sítå1˜þO¸“Ö¡˜³0ÿ@Úø‡°0¶0°±#ÐÆ¶²0¸Æ;¥,Bö2<'ô`$d¯€kÜÁ ï'U7l-¨ZLXR6NÊH…÷ýª):…ö«Öç„ÆÓt MyªUa&)SyßSýûViåäÞ©Úœ!Ø´ÙëÏ^"½7QKZ¹s‡ |!Qµøo±¬9SE‰×Éå¹ü@>„ᾄ3&ª^…tªjV¯ƒS°Båï(“?ã ¦$“P[ÊæÏh £œ8f5¢i†*•øÜv3‚-iQ•*nJ?—îx 2¶«[XG-´‡…ˆŽ|b/ G1™87þ†ÉžLÅÆc>•ÝuظœÓ!Uaöœ†ZŒÈÀM¸^KYèUUçkÈOÀÅáz!ÄRÌPD€†JR/_:·ŠzÕ˜Ix¨§Gr¹].·“y&—Ûår;›,·cÌb*ä›Íï{Ìï%ï›-·«Í4<Ê#‹ë¶\¢'Ys¹D/—è°“Kôr‰ž¸Ó\¢Wä=QR¬£D¯¶ÍöJʲ¾Ú×ê«N”rÔµÿ–”ç]Ü%ú8ÎÉ~Ý‘2e2?£\ךë5rÙÄMšªå ¤wÔ‡`M%8ã§s™†E‰Š0˜'m“õ“~¨BTÒ-ö£žv ê°ž£fb4ØÇ¶JÊîÉÓWf‰nëëúŽáFd3kë¯:²÷ò÷â|]ËBÜu9´Y$`ñíH®Çwûû±~uÐØ»„€Iš°N}ÿT…;tÌûÍI@–Ã'ñúIõI õiÿi÷?å( endstream endobj 7572 0 obj 4484 endobj 7576 0 obj [467 /XYZ 31.5000000 396.500000 0] endobj 7577 0 obj [467 /XYZ 32.2500000 741.500000 0] endobj 7578 0 obj [467 /XYZ 32.2500000 395 0] endobj 7579 0 obj [467 /XYZ 31.5000000 742.250000 0] endobj 7575 0 obj << /Type /Page /Parent 2 0 R /Contents 7580 0 R /Resources 7582 0 R /Annots 7583 0 R /MediaBox [0 0 595 842] >> endobj 7582 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F8 8 0 R /F9 9 0 R >> /XObject << >> >> endobj 7583 0 obj [ ] endobj 7580 0 obj << /Length 7581 0 R /Filter /FlateDecode >> stream xœí]Kä¶¾÷¯ès÷н€ À>ä`°ää¬ãFldãCþ~Ô£ÇÌHúJͯ‹”ºG^Ø»®Èb½YU,¾ûã׿ÿùÛñÝǯÿ9~ë~ÿøõÊ–U~üöËáûñûááðÐü÷û¡ýàëÇ?7úßÑÿÔüûóñ¯k~øc÷—Îá—CiÊæ÷?ý^—¦ùS6ü~þù¿ùÝñ×óŒýr0¯ÿÿŸ;Ÿ—g0–þ~è·iž~ýöí×ûa«ÔYQ4Þ5ÿ©½=þ÷‡Ÿšúé³SUtÿÀ?“‹WÍâeVØfqSgV®½1eáËìš-–ö¼ŒqÕÑØ:;6?¯óôKgvcòÚGœü ¹6RŒ+Œ8¹&e­/[ôÔyü ³Ç@¾ó&ÞäOk#¥§,œ\“²Þ¸ˆ”fü<‹È6OÇ¢,œ\“²yYwèq.ö‡é#L^šˆBû¹:VzÚâÙ5‰[.&qŸ§0yÕ0~<Î9C¸xöÈ\ÝøÍñ=¸*+²–4EVéçyú”oðÏ´«c¥c+avMâ6Nn‹ g#øçÏÓGÀùx:£…\+=q'³?„Ì‚Ai¯ß…?<Þ}1>kÀ*Ž?5À=­Ùþöø„”Î'V[<þ>ËÜ—?>Ô§Âæ=ˆíHfш}¿qhÄð›Opäsø:Žd5„­‚³yø q9„àCø^Ç–lí:ŸFÎcÍg <"P‹ÀæŠslG 2cð:ÃgË Ç(ÏÊÆÎú8pX×`>ÀòŒñ†õ„ kHñ†¿Áë`úX¬½ m‡µªÅš îÇAíÍÈ)¦œ U1݉õ-aìGåSÛB›ÃP¯#à ˤœ…ôdƒ-?–9Ì;„4®où1¿Q|€wŠ×!F6â¯4ÇxÞ_¡FV·®Xj-æ ¬U±`dK:aù`ÙÄç Ô[ö²<¦¶êYÏ00ڛЃã€ð²„3´ü‚daù¼#ÈáåØ/ÂÞ)ö 0®1v°oˆ%˜À5Þ)ÃUŒîedNð²Ý+àRNàøD1¦TѬ)¿¨NèãTùþŠû” Ò²Á¥úªÕÑú¹%i—Ì]‚VqwrÞkžÙ²@#Y«ŠS‘·ˆ àÜ75ú¦#‚ñýÐXqÍŒ æÝÙʼÉà7B¿±pDØ ÇAgÀ6© kO…ÏÎ{¬æfé0Y@Û™ kzTŽE“Ÿ ŠÈŽ Zvfyª«ñ:p§ºT8ý#šMÀ^çØ›háÊŸƒ Î&È ¦r©¥ôžõY«ôê!Ô{7åÌ–±ª±àN¹/ª9ÌùS»Ÿ©A¯NUxðüÆ oð:Ya+álÎÖJu>Õ©Y÷ãáH!£¸SuAÓ HìŒÓÜlùÔx§ ,¶‚ßÀÙ03aØðNßÉ9’©O…âÙqg’Âh;…îY]ð­ÁÐão ú”Ygì³SQš3Ÿ „£#‡ ÌÄR Öô8ä?ïÐÓfÕùÈhõ>â”'`òSVlë{¸ƒÎG°ýÐ%T$XN%ü ´D‚(1Zd¢+툋qtuz2[81é„Ç@-Ìp×åþÇ”AÆ?2q€Þ¸Ëb™°ËÇx*Œ2þÈ›³ÁÂy…aƒ W3$nëº[ÀDêìØH€þÃåäÅò×^ô¬.b[|ë\%7 j ¤…Ö:ÄÏŧޡKkÏãÆ¸ì#1¶8ˉ«0p•ÎCèVÀálŸ½ô2¦Z”S,‚þWÕŒQôŒQÄ /º=3ÖŒ)ryD0ªºƒä?'Ðe{è5¥ée×çáL+–T,÷X†‰\¯ áp˜¨³¡ xk:6,ï‹ëpí‘‹§*"ˆ ¡ s¦ÄA¦–Ù_°gÖö¥‹]1ÁL˜kPª½~&‘Y&o^»<*.„7|{ŒªIˆ›ôE‡®L%U š_¤YÌ…6¦ „)ŽÓèÓpË‚)ÂQ)  îç©Êר¢R`:©6C]µõ_UìS 5ÉOèd´˜2“Dwõ6ÀüÌNï#²'ã9C¤¢.'¥0³Â¿*I•s„ZV¦#5öiWõ;aoØà*€˜CU52£*^Æ¥`ßD·^€9èÍ«6e¹Åîy&Ç:”“8”E¼·ŠS;TÈ ~Ó%Š¢6këÚ¾@|qÁ½ Ó|b¢‘õ;t¬ö4â¦~ºåTÙÖ€æ³X1U ÜI&)äeTK“„ "ZÀ<ó#( 9•O¶„_y†ŽàùÈæŒ*Ëd0»½è§N³^¢5ùÛF$¤¬û ¹{$$ÛH$¤2ý%^*‚w‡ÏÓøÔŒ¯/0W˜‹÷™è ÃA™ûœ¿†ûö8܇“ù`q¸*wWpùÛŠÃUeŸ-I‡[ˆˆÕ¶ìÁ)ûíu Ö½¥•ìfjÓB¦;^ˆ{Ž‘²ú›[·+ ݃c¢kaÓpê‹[,­ˆkH¼7#å}~bÔØV5ÆGüxš±ó4¸‘'š4ªü’=>´Öï‘/nQÏ6h¼“E]pP 2úŸ‰€ ‚Ð^—ús“†+o¡Ø\Õ‚Þ·R{×A¨«ñéNc‡o£@ƒW2SÏÛôë®íoÀòÞG¾Å¨½®S­Ÿ¿äÔ2@9¼dúe }ºìžZŸé0Wœ:åÅ7ïá75ü¦¥)§GîÆŸÆ®PçwÌÌÖ9Æs#Ÿ‰Ù2ô…#x§x¶ S¡“ *`çÑlÌN¼ÕáÔî#3³µ\UžêêâÙ:QšÃèGˆÈ!Â: Þ Ü¤öà™¾±Ó)š9*@4í®"ÎÁFà­['¢ÌM1Ö‚ª|ä¢[ò6Ð\5Úa¤¬g~Ìû%ÌKD‰g²8«Euuï­1•€ÓUJµü4à8'Ü"T©°SyÜ…©zÆáŸ€÷±×/í[?¡R­µzk¤Ø¯hM˜Š¯¿Ž¶ùÈàmññ×7Üãp2˜ÇØt.F\À¿­¿¾"ôo 0×*©Þ¥ˆm®¢°n#Kù쪗¼Ý'Ä™L¢*à=ÄEªG÷ffl6W÷ËBäý0ùjö”êG‹õKÀÁ$nþqÓë[*PbŠÏBÚ‰c`™ö:ë< œ @æ—“îŦXSà/¢c¨ðö<ḅx—8¦Ì/gÆŒS¨Ýâ\åiR kù DÄuèºMv<ª²çWKáóš–y ΖêY¹Œ¸iÈôêd:â‡à„ª Þ„›“K©&á13tÕÂwj6ó¬Ï–ù% µ.èD$ð"¾)«:C-¼÷!!~‡îE˜1ÏcÎzë>׉­óÔ†ßoÜ0Þ¾¿ÀÈ qP¸«ŽïŸâI¼S¾&•³¡+õ4q»Vè9€í^KÆ/¾•¿a™at Ã}‚í8¶ZD!²pS ëDò,øŠ‰ <=̉7Éñ˜{…µ½eÝi³á2µZuô«Ú¾4Ðñ ö•8¿2ÏTS3Ϧޙg´e¨©³5Ô}[÷™¬Ï—%ƒé~Áô*a|lóIõj1ôÐI©W+wÓ’Ætîôê®=7@SJ{bŸóNªS7Ã"| Üië¶Åevž{;c^öLœ?'y|JMh+ÝP?•ÒVº!c½þŸ»w»·m¨w»—ÐîعMÞ4¿Ü¼¿ðü¡j&ÿ6-¯ Q©U椔^A9¼µ’Ò+¨Ë+x„Ñ«ëgYuwºçE·¢W½)á¹·sØúÜ·g2ÓIà½e2•5ñÆsÞ ¯$´ð>"ó«Ÿûo3÷xoþÂ=æ÷|é–¹oÏïñø­‡J焺+7&±l¤ÊÈí:eþ=áíf³^¹»@¯ÞÙiëÞbo)-HSZ¢J­9å¶v ²[ ²aì¼­ŒO^•‹ð¼«³g|Z®(²¡*<¡El¶Ü¯Š± ÏBG¢®_3ìLà æ ]å÷Bt›T©¼xÐO·}Ám(ˆ^%ʯt\ÞJRØÓ‹iÓ‚¿YëQ÷€FŒLs!¡Ýâ}p3õHa@—0³˜c˜×|˜ÖBL#'Åž†1 RYŽ-Ò„šMb±e ~ˆ~¾L¯§i×ÓT&Q£‡rÊ2en_“>(ÀĤ˜…ço™¶ª \Ra!;Ü(†y€}ýâX¸°#hYšExtG”ax,›øIzƸzášÅå,«Ë™[" ô îeGfÖ—&áÑv¢]U žP+VÙ5¥Ø[I¦}±Ý#ÖéJkq¡Ë•›y©†T)íË4rÃ6ƒHšZhgRjìÊ^Ó4iË#ð³Ã…¾ay¦ì„@˜ 〱ÂXžW÷v Iœ7…´"QŠu£¶”ôÆap².©ŽöפI·<"œ°ŽÆºŸöð7г¢dæ&½¾—'‹æ×ñ{ô"O?,ý… ÂÍÕÃ;ãN™9Çß}‰…¹hrKÕr&pÚê!{²OϯL1WLGºH•y;¹…`.Îü ­ã–¢Ös°}évŠžøÀ)"ÿ R5ÝÖ§OòZ8} G<Ú†Á³Áoº¸ Úú‹`Y†;ÿ¹¸'4Ä]gŠ‚XÀ.½ò2Ç6=¾ÛŸ¿\ÂÖêÆ¨‡ñ ¿1˜p?/`1H$ðÔXR  N9c‰¬ ¼4$2µ;ŽwSŽŸª6Œ.8}wÊÆO9\¢S;ƒï/øVüÍ‹²"V‘•™;u2ñJ£AÓ…5š}΢¥8>þc«WÕ endstream endobj 7581 0 obj 4466 endobj 7585 0 obj [468 /XYZ 38.2500000 532.250000 0] endobj 7586 0 obj [468 /XYZ 38.2500000 532.250000 0] endobj 7584 0 obj << /Type /Page /Parent 2 0 R /Contents 7587 0 R /Resources 7589 0 R /Annots 7590 0 R /MediaBox [0 0 595 842] >> endobj 7589 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 7590 0 obj [ ] endobj 7587 0 obj << /Length 7588 0 R /Filter /FlateDecode >> stream xœí]IoÜȾ÷¯ès€i³n@À¶ä9, ‡ ‡À“I0È ¢Ì!?T“”%²¿×ÍOdw'±GeÖòö­^}øã׿ïÿùÛþÃç¯ÿÙë~ÿüu—Êþ^—®ùSöòûóÏÿµûËïö¿>ÏØ/×mæíÿó}õ¼3K?íúcºã¯ß¾ýºûÐ`Ú*uVUy±w1Ľ«£ßÿ÷»Ÿšúé³C+‹XfïY¨ôÏ+•®Þ;_gûàËÑBÇ_:Ó;ýÉë,æ³MÞî\*.Nž]¹Í¯²Cî *R€?ýÈ¡š‘ržw®•¹ÂìšÈ-|ý¬ˆ3Àèûüê“7;~žw.ìw®–½ÂôzøuYÙÐÏDÑéKæWÓÏ€^çòÙ˜·Û¹:TZ잘ýaÊ,x+¢õð$|øéq÷á‹‹Y£0ŠýãOÍæŽk¶¿=6@É÷?<› Í=þ¸ÿ}–¹ø‡ýãÏ»úPø¼ßb9?’}„ßð?}ð ÎöYsžY§š~žXNßu€ëd÷pä ±7ˆSelCˆz¸ksx×aú®1t„½Áuü@dwpÒÆ\¬!UµëÜ?6B{vy[Õ«‘\ÛÁ¸Oòö å­.¶“¼½1yÛü»ɵÑBn2€áZ‚g°ô^³´[5¬oGvÂ]cÙ ´,ÂŽÀš_ Q(×× Q†·<)æ9SmäËõÈuÕS(ÆâšOWäÖXÅúCËoÆ;²KÕ*Àëß`©†-i(¡<Öø<Ð* |Ç–«hLËD0 ÛŠ”¥ÆxÆVt¹bK€òr™X%2ŠSYÁzÕ–´¬×ìÏí ãï K,‘_ø¬ýo¡õêfÆZo›éY$Š †½W÷ Ð’1k—,{×Ñ·(uþñþñ;¨³ãHu¨ê쟡¢ÌÁWîíH ¶ØO6ªÕ+Õ%³æÇ‘pÈcQ•¯G\€{Œp'pΣÙ:‚<µ8’h6ßîÀ¹þ#J x³pd4}p¯'ÌŠGðl:[×è—iR&€Oâ+ˆsHR+$Ðxo'B]07Þç'M#v0˜¸7l¼1)ÁÄAUÕÔƒ`äpšx§—–¦ÃÐ-¦ƒö¼:‚åõ,ÒÅFSÆ—’1ì˜1.ÛšƒZL8b ‡n+±ëÀ„âTiY: íá!&(ÌЄ¨.t–ׇ+ДLÁ èg¸™³Ñ»³ø6Ú¨¸Ö‚:A®3ic#M©«°–Ȱe ©¯ê£ †%µÏŠmÓãã6v„r5b'§—i$¬Ýë²AóûjXòIAÆbø.¤Å;` ±TKÇ•ËÀ™Â` 7o¨‘}_$ivL7¥kG]Afâ)ŸF¶;¢¬‘1o|*D ˆ"c¦ ÕÊ&HZ¯ÓzE_X¶|þv²éŒEÊÀû»I»¦‘íj½«Ë™yµø<‚]y.ÛW}álÊe‹žÖÍ䲊Më”±^‰[>—)ÑÐ3 ™[ îͲª¾Ñ¦óÅ64æÎfÕP_+%0mb4’FÒˆ­Å’r¿Òl)÷›m8 ò¾qyÞ,+¬ka¤|qI#¶™hµ‘4²¸ƒ¤‘×¢‘ëyê£WÝuqù”FÒÈmèjäH´ˆÆU§…órLŠa÷Žèúú[+Ÿ%é‚4’Fnm$I|Î;ÓÓgÚÒÅ—÷ãB/ Ë"?îçûÑÚmžj±…›oá.j£¾`°)Ó|KX8¢ူ^w‹òÔÞðyˆ.f÷ÄÐÁß@˜ÁM£µnB(´'Ä=ó0 /ow'ÀCVJ z„s1‚AÌæÚ«Æ.ôˆº`×ËõdZ jH7á pD•Pé5V…º¤*Fn ÄB4ÂÄ-§ô°$(€é%IµwÅ|{I2ª)Nòt˜n§ø†ÌXz§ HC& D1dWØavxbwG`å#9' 'Qæ ¥«“VR¬ ²±Àˆ9f6†‘ ¦¤Ä66¡Dãì:·Îý@çRVƒ.Fî Mê…1R™oÌE¸*ÝR^ anüN(Êcä c¦áÞ÷8ê÷FÉ}Æã&ø‡|FŠ ¸Lð…°$ÕÕM·ÞÏÉ-ã{9_æÖ3}œðåÝsáDàlØdÆ£•ap4j›k#•@²Îó„­Æë<úÇÄ”tÅœnŒqrÎ|Fµé²P ôf×ç"¯fÊ‹|Xþ3iy,,ˆØ—²ÝÇTÜ¨Æ u“o¸²GùA£¦ ¢Gp’ =¶‚ò­sÛüº<ëoÕÆˆ(›ymÕ*Ö‚Á®\Y¥[àdüz,“›@ÊdN½Xå¢|×ñL aˆO@3c)g ¶i:[Õ¬ijê’Aœ:µ¦¬ç쾪¿»^¶9DÕÌA/Æ(¡¤Ô ߘ¹#Ô² àTsÖ 6({MÕS.4Ô¥»˜M¾<—0ÅE™Pöp¹U£ìÔjDIÇ—N0ç1a&û¼ªœ¢Ëj‚Å”ãRPÞwœ5g§95F÷=™û0LñѪC£˜š‡ò[ |Ý`‡Iîe~ý7J·`c”He3æ6¦¦¸ÌؘÇPÂÅb#U…Ùõ.L˜[Bå*QCåy¼é2ï*Jo1ÀÐ(€—IHaaሠ¥¡À™ª*2ä±Ó¤QùËx©š&ûcj zè"<.?dƒx‘pÃï%.Õ ]‹Óg©›·a” ]‰Ãwæ-ÖíÂ[ÅËÓíB«Dâ)"Üø7À§Îq“á9µ6ŽA®@ŠJ¿`«Ì¨Ü@õR8ª€eUm dn ŒKˉF3”1oª¨+:æ. Ã0ª¹T|Òîýi¨¼ü’;³YÆŸQîû -¾öÖ'ºa(lüQÜÏ𑮌Gæ6ͨ.‹êRåZå£l¡6Bù#Sx¯Ñ›h±VnV·í©¨q)›‡y¯P“O°ß6•›ÖÚ˜™L¢Oõf²òÝ þªË¬´ó§c ïôx&°6ŒîuQYtBÜOH•R*‰¿‚nÒw½(^VeúãîŒCSxŸÑtåp×x$Ã/ÍÀÞÌB¨M­Êx,ëwà1Â×ý2y!”©úöÓI›z͈¡rŒ{øöNßmb^v½–P³Ò®JÄTÅ¿s4m6L½D¯uݽa¸9âU+Œm†F…wµ‚¿ùh(‰ë—{ÝwV1obª€²&ÇšŽ‘ªøÍŒaF¦k#ê—ÄϽ•dÂM¥+ßr“ͪyÿ‘ ­ ËH€6– ý¼ÖŸ´>e¹bÝ¥/Æ)egÁ“R/gb¹ÌX‡˜F±!lg0 ~·òõÚH‡2žçZÝÂ’ò÷X¢`Ü3:ÌÈs³’VVÛíx{Ø–fƒ;À2š’ø˜³ˆ÷ˆ•®> †oC–uØ€¼¥¤*Æü Þgž]F¯Ú~Rõö–—\Bd–±íˆ÷X±6ÒÅOÄÒnÍôFØëÂI ýôÊùed´Íé‚Û€Š˜zp|Ž(bâ¹X"ÜŒÏa1"²”UÁøCD,‰ŠHXYüÛô®Tõ™2—`Ìa.1ÊJ ’¯2Ô9ùLšE×ë±âÀ5[mÉÞ¦è€Òï˜z™ f¶GÒmÒ®1¬èØâÇFõyžY^$¹¾n¹Ž÷Æð Q3ÈTBÒÁæt¦VLnŒ×„½@!ÌàGíªùÒ®ªÎž[wDð¥a@Wn{Ãñž5Ë[Ýj…µœÔ„þë¬4¦Ëøkí‹eN7Í*XqÅÅò~†U-ÆjüΈù5ó}a^iEÔ œÊÔó–Ö6õã¤]ç¸Çt%¾‹FTÁ/cY¾‚V€›QÅ©@Ujmó/vÕBuN§sÏ$¸N¨äT•¾Œ÷¸¼ ·f9vsy®õ U¾Øœ.Ît†åiñÚbCĽ%AŠà&ªõËß‹ÁÕË{:˜Ó]4?˜ ½a cÁŠ®M"1°¶’!ÑR»æ e mNWZgœtk‚•k­<5× bùrnĆbëë͹Ì9ëãﺃŊyëv*n6j ©æîÎR½ †ýŒ5W“:ì7-îQt|º«“ØGµô@\¸Þìxsº| }H¦ÅÅïůÀŸY135 Ì­ÑåïŽànxºµÂ:Xþ¶*CñX×ZuvT)D÷&°êlL´O€5ŽÓêvFex›‘é>¶iöו×\‘âj는5÷Ú´bB/ÞõµÁ¬C³jì³(Ëפ¨ˆvT$eºoÉol+l26QßNñéòö%s oÕýe‰_,”Y¶9]µPr¾‰þqŒŒ ¸ÞxÅñ’To|}º‰¢«žjº÷'™è%¡¹­2ƺÝÖ2Cß&d Ýëµ9·Î> ]i‰höMrh[á[xÕËžˆ20ÀîÀãÙ ‡gÃt!íxìõÃuŽUÀÙð»|ó–cªöÿb`“pºv(DóܶÕÓ›ˆˆï1uWÂm‘ù£¼„Œ¡Â>Uî«[‡‰e'óhòÍôC½Õ”–~AaUµÌW…êz_pY̶ðUs‡_,VíÚ˜¢ŠÒISË,\ëÍ­|K™¬ïY25‰B ž s“QgÞ¸X>¬ç'£%cv\²ô½“z€–E~„Âw´`«U FZàÄC eþ ü¦Ei5¤²IÓwµ1'F:ïüÔlùq$òXT¥¼%¸°¯à–àôŸZ=¸Þ[;â\¿Ðû@< >`ËÙ.‚¯œµ° ha ”.>x 6Æ{„¤*d+}ò~ó#íðNRÅd‰Xà+¼ƒ=»†ët¦ÂE@ÂO@†óâ0]`ÚÅ#ºH¸\úŒþªÐ!ÁÈPØôŒ+÷ù@eÅ»Žs‹Ò X ⓟÂ:‹3*Þ›0fnBU1¬Ë@TX‡1PT¹[ÐXBÞÅXö¦+@!DÜuôíŒ5>ÆHöÝMWŸ‘1r±} ¡>1JuÍ*† â½óS–ù[f:åŒÁ!xÅýˆ6B›ùWÏØ5¿öO ¸Dh>œû èÐê¨CCK™{¦ü½ïS²[~мÛ}—'h©%bð­ô~5Ò†&ŠñHçÒúCÇy¯¯ƒBú­ÎÙΧöö¥;)b~lIÆ¡ÔÆ¥°#šSÓ—g´Ý‰c8<ü¦c7éè¯^G` îùÏÙKÕ¾‡°óùtðçäÿ)²éáÝþ|¬OÍvWÀ†7üÆaLÀó´€ÙÀˆá…]cN0páެ ¸88ÒÛŇ1ÅEœ¾»T‚˜„ÍîbÆñ‚o&Áß¼ ¦²‚¬Ì¡ã‰7 ª.,Ñ«úͳšþaÿ°û?ëîKç endstream endobj 7588 0 obj 4609 endobj 7592 0 obj [469 /XYZ 32.2500000 509.750000 0] endobj 7593 0 obj [469 /XYZ 32.2500000 354.500000 0] endobj 7594 0 obj [469 /XYZ 31.5000000 510.500000 0] endobj 7595 0 obj [469 /XYZ 31.5000000 355.250000 0] endobj 7596 0 obj [469 /XYZ 31.5000000 434 0] endobj 7597 0 obj [469 /XYZ 31.5000000 124.250000 0] endobj 7598 0 obj [469 /XYZ 31.5000000 434 0] endobj 7599 0 obj [469 /XYZ 32.2500000 123.500000 0] endobj 7600 0 obj << /Type /Annot /Subtype /Link /Rect [60 398 127.500000 404.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23MzScheme_nn2 >> endobj 7601 0 obj << /Type /Annot /Subtype /Link /Rect [60 390.500000 102 397.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23MzScheme_simple >> endobj 7602 0 obj << /Type /Annot /Subtype /Link /Rect [60 383.750000 123 390.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23MzScheme_external_docs >> endobj 7603 0 obj << /Type /Annot /Subtype /Link /Rect [204.750000 483.500000 304.500000 490.250000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.tcl.tk/doc/howto/stubs.html) >> >> endobj 7591 0 obj << /Type /Page /Parent 2 0 R /Contents 7604 0 R /Resources 7606 0 R /Annots 7607 0 R /MediaBox [0 0 595 842] >> endobj 7606 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 7607 0 obj [ 7600 0 R 7601 0 R 7602 0 R 7603 0 R ] endobj 7604 0 obj << /Length 7605 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯Ðy·ù’DA?äÀ°‚o6‹EvgùûQ·¨~HúJÒ×%yڃݙiÈb½‹¬*¾þÓçdÿú={ýîó²¯áû»Ïu,sÕüËN_¯n?0þ~ÎJŸg_=|˾>>Õÿÿvh^øüî/õOÿËLöçú¿_²¿ý½þðÇðG§?øõPê²þþïó÷ªÔõOêòýôùχ¿þýv±.sÿû+—綪N`ŒLýíÐ.SŸ¿~ÿúÛáuƒ€y³TZ••Ï´³.Ó•3Ùÿyø©ž ^+§uY¸R=2QiÎ3ÕãkS©ÌÕxêNtþŠ3¼Ž?¸Ö¹_lðòèXѶÐò艫V ‚Œ[€¸×á— ®Ë‹å?C+¸ÂèG_„ðgrnš8/já´ÏtF®tU¨Ò;øó#3—Ú¬=sŸOŸÙ®6óI{¤Dµv&˜ùÓœ1X0¯v×ÜÚ]“¹¬o{๕­'è#÷!ÍàŒ{ô©+úL@ŸV h.»ÔÕ>Òç½ÐÌ{¿Í:co‰fÞWÙ- Õžh¶„œ 1Ã6V5KÎkzU-û Ð]/@ÆZ›w¦Zû[ZÂ-ì0V¥‡n[¼8ĨS${òå­rñ½ùëð „ ÆÚr¹ÁÏGÇJˆC„Ñc×Öf§APW9t‡_`ðÜ-Á6GÇJK\<ú²:Ãä2#²Uáó†4µÙ‰O›ËèK¾,TgÈc#¥eªîàœ!îArµy;§’›òöËáõGíTÍêEöå§¶óœÍ·/5JòìU¥•¯£Ò/?fPÊ~ücöå—Cu,LÞ‚Øø$±UžÇ— -gU¸QîÁÍbýBØ +\BŒx;.Ñ«s…Ô²˜¯°D¬4® ú[*Áºa]å‘° x£X'áõ0°-á¦@]Oö_æû¾7ÙŒ+Ç-˜/™¨Ê3ŽÕ)Ÿ”ÍËŒÑÈ 3ž APZG7˜Ž0fÅòÌŒÆ@ñf` n1å0Ì®¤Ï¨¶K#î¾°ˆw ±4á ¸²ÉHÖË„¥Û´dìÒCÖXß®Î;õ1QÞ—Iew…³  Ê))í׳ʫqŽÝ²ý`âgâ< ¯Tðžö#ýÀšxu>زŽÖXN‰H–²ûÕ¥€ÿ·¬Þ‘ÀÜGøÑÉ"s8Z*m÷IdÝ éÃP{}oŒò.1ÖÞŒü¬OŸküªç¾-ïC26|ªEpÒ–õíúO"Ÿ†ày¢J:öq„,Dìw±^\ÉÚ²üPã“çžÊVBŸžNƒgžß!²N6½«ƒ#¬¢ZW³¬ŸA%Äm8t—»:N­ÍŒVlÛ†£&a?[ £Qm5“ù´‡*­=´mf¬…1n¼3sŒS 0ÕeÊF…h}Ì]áËü9 yüÑWê éUHð;Íwt¶iu%©A£áwl«âË"ï¼Ó&ß•ÛB4eøÀ¼üh×÷äh¾°4´P!ÁhSp´ô¤PÄ10ˆ†4З”çÐhõ™õ(Æ@"Ops‡àŸ†šŽ¡áÇž$ÑXƵYÒ‚ÖÅVŸE1¾0öö°¯µ~C$¶}›Üç¡NážÈ9"ŸT²Ê×ÚJÅmmW˜q™a¢"O•¢†Ÿ¶`½%ƒXSk'hUÈÿLÍÙúškËÚN㽇-ËB* ITÍY¯+Nì_nCG[u™5Qþèúûœóið«Û Š|îÐÛÁLJ$ð uŬ$:ôÁŸPaìàwˆ3²Èxë«á‰ñÑΛΠºÑnÚ¶çO]gwÅ=h› ‚Â)ÃxÄhÂ7|’ø±‹Èé˜ !V,ˆsv•LØæšÄ:ïÑmë1ÙðÒ„'až%-“/;¦ ³ÖŽÎ2Ü3Mq9ò¯ ¾°’‰x47Ÿ;1Šçð`ÐÂêX”ú)Àèü¨*{O§7p´†;µ9îŒ$d º„œó–+'‚9–g‡0Ù.݉¶îË-N²Á¸”Ó}YÆ–¥Œ>æ%LR,50»FPšêÌÍDÜ€SŽ6ãz-hYu XÇ´2yƒ=™œ™Ãrv>õ°ùŠ%ÍH™Ä:èmWŸiuÏ„ÏYd"ü†ÛÞ*ÁæE‰Éê[.{-¿i–_»¯î× BÀìCa"2£aŸ'bÈ»¤Á,u—à«gMÏqâoýdö¸°õŒh)Þ>3nkÓä확þx‘w¯ Lž„µÇ`ªoÖú¾ãá“ ŽÖPH»cÏ'x‡F Ø-ÔÞÌš'T ΂ºÕ»EW×”ÇÊwGyfÖ9|’Ê”êâÜbçŒq¢‡xz€ÝÛpà×<îf ¡j„’Àe"ò/è¸jƒÕsس„ ĈÈ2ã¤s>Ž .øðŠ˜Mƒ>Rð2ÆXçlCnÄýÅÍ'“¬‹ža]‚ãz5/óc!Ã$‚A¹ûÆ=ø ™'ÂÎ$ÆÁtaf†ïRŒ *6ëB/ šØÄâw",Ű͈l¢è@LIFŒßIvmî+‚“<ŸÅYŸn—Ì~=”Öß~pwãrÏ]ƃ=p¯câ…Vc^óµØ¿‚frÆ‘VÜó‚Õ÷„BÞÞ¬³ƒÃ\- ç±PWQæ8‘K'1Ì.1±¹C9ýQ·d…lÌ£Kd˜ì,µ‚ Å™íoÁý ¢Œ9ý/˜ŒÆb Z¯\óõŒòbí}{<”qß^ÆÇŽäF¢ãǤMªÐUGà ,iÀÅ1‰Àòm £0¸–[àZ<†C à·ÜSK+T_¸}Ó… ååþög²^bô3y† â;Ï䂬‚ô‹S6{è³dìã|Çn> q´g ±«@£èr÷. ‡ï‡y áD®;Tdjp< ˆVO!Ci§’à{©“L2F’¤êÉ[ÝÐM@C”L|&Ý«Ò {?ØQ ³;ØÔáàÆ×…ü3ZHGMÏŠ›Þ?Ǩf♨%BŒ¿A¥"÷2"‰Âï(œÏÈŸjQýC.ëµ[vU«÷Ç„iш]#æÂq¦%n#Š›¹Í5q»$|•M؇[²Jû}—/˽¦=ĘÀ¾Ç O&]•Im>I¿«ÐØV]íË„ÆBŒÛ—aVėѾ´Ó¹y°áí¼ ›óc0å 6p4Gsr7kÄ-ø¡J ó,¨^вk$˜³Fæ!Yˆ¹ëŒ* OU¤ùÜjÞš=…[X¶kL×¾ÁjYç¡*íÓyx:ÛtRÑtûx[2¸·¦§ò"Vð[3xtž±,Ü=ty,«ÎÞ¡GO6Ò1º_𚪣Qö~«z¬ Žqí£ R@ØCWýâ¹è ž'ܦèØ›0Z1+ï´á\k&H±àtyÇðÐÖ`h… lÆu“P7ÇÂz|ÂLX¯Ì•€ T—•æTKæi‹ËÂïöè½ÊJuúVÖ4ŸæYQ= ÚO¾ Ôº2ÞëË_•·£´¿5sÔ~קײîÛª7Çé.$5læv”ûu|=ü|xûCòÒÛ°éÍ¥{)LMcòO"·ˆHàÑ¢B='œQã!Á©}ØûžÞK6r‚ÒÔšÒšQÏ|Z©7E~ûÁÔ’R¬Oœ¾×'Î é纲^ÒÓ'§¿*oGiÓ÷úÄ©!}b«îõ'=}b/$Œr¿Ž•õ‰›ÐsŒ97OÕ}³ÍÜ'KŠóŸuUÞ~ð¸¤ê^R =$)…írqýIORNUÞŽÒþ¦î%%¯†$%÷Ý9êOz’R £Ü¯ceI)Ú;4ÎÄêò\äm„!¤r§c´„ 2g˜/lÓ¶:š,ðEÙšÆÜÜ~°F·…ÃP™KÙs_K”«(f¤åÏh¨Ÿ*7jÆõ3qY™I„›A•g+3Ž⎖¨ðÎ;*¦ ï3±/nédزêõ@{DAEòÝΗ,r­LÇܬ¯+˜²³W”ôiF\t!œ4Fm³8'?´D¨6ew¬½f¤»Ñ›ðNªn½UÑÞÍ,tëÅýu™n½¸'ïåP¡'í)Q_sB¨Ûè'°gnÐêC°…‚~Ï\Ÿ+…ïÄ…Úb*@¼ PWl˜r°?±Ð™évÌðN¢>Ȧe;È´ïôÖ¿Dâ±ÅžáÉ0K\…¨©@¡ÕhŠ e*:7 †ã«fñ¥ÛÄõ´š¹Ž;êEÒøºháœQ Gª1`º¾L[ Æ(~‚60˜K˜úàÄ} \NÂèC\@ÏP[¸r•€ æ*æ q(õA»¤Ñi¾Ý(·¸¶iŸú J“ ¹0˜ZÌåíXsÁÄBFjq±‹Pþ×㈖°8Ïá•bŰE+ø—3­òQ9J `2!æA+VσyL ó?^)¶@X×@ŒZì`ÉH$3ŒÍH&3oÊŒq£žàt^lá  K£ÿqš-.v´Ô‘½6l O§[3ÔN•Þ%PàÌ!D¡l*ïÝÂ藉Ȱü`Ý×28µ®”òkð\ùH¢Ô–Ÿv3j‚•pAXGáz%|ÌÌp‚A\ýåx}‚OÌD&xw‚(I§<ŨÑÌFü€Ê¯{—Ožò©!Ÿ’×TŒûjÈ\—ãëÞå!Rb—±ÔbI{²x3G“û6+Yd=Ëç6¶#MCQ™öwðÄ^è»Ã5LI`Rd˜ e1Rº÷ 1]Ý™ |KìšS®ð®:ƒvÞÂ6ï¤~‡æÍä&R—’`¶c${FvÑ¢¼—HŒÿ¼l̸¹±‹÷}Ïó¼cç\ U= ·ë`˜ 8¼Rær¼¨×؉rqËxze¢û9Ö¾ßzÅK>âÞ&Ïð9å–vÉ"hº¸©Õ„ðSÖC€‹1cdnÍÁOR Çô”tÊÑÇ dÒ®£ÕîE”Å¥Lß—K tPWݽ¨6𵾿_ÃÐ.s …3X˜\O¢ySx)ìôÝ\J]eßjä‹´ù4ö$ÐÎÖQÒ'ç;3bÖ!nn$­à¿Æ€›£9›ü¾/úOBkÓßÊ2*Å÷h;V|3ÛǰÒ^ül/.ñr]cŒ#ס½:‡/GŒ×À24 ¾ÄPÏZúÍ5Ëp§Ÿkˆ[BCÜ…ÃêY, ±GH0GNí±ù\di¡\ؖнáC‘›ÂÀXT1·@œ[øä6=ž¥|©ì1h;€²n`Pp{6ª?eŸÿ¼×Ïi endstream endobj 7605 0 obj 4886 endobj 7609 0 obj [470 /XYZ 32.2500000 272.750000 0] endobj 7610 0 obj [470 /XYZ 31.5000000 218.750000 0] endobj 7611 0 obj [470 /XYZ 31.5000000 274.250000 0] endobj 7612 0 obj [470 /XYZ 31.5000000 218.750000 0] endobj 7613 0 obj << /Type /Annot /Subtype /Link /Rect [60 182.750000 94.5000000 189.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn2 >> endobj 7614 0 obj << /Type /Annot /Subtype /Link /Rect [87 175.250000 126.750000 182 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn3 >> endobj 7615 0 obj << /Type /Annot /Subtype /Link /Rect [87 168.500000 138 175.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn4 >> endobj 7616 0 obj << /Type /Annot /Subtype /Link /Rect [87 161 139.500000 167.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn5 >> endobj 7617 0 obj << /Type /Annot /Subtype /Link /Rect [87 154.250000 136.500000 161 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn6 >> endobj 7618 0 obj << /Type /Annot /Subtype /Link /Rect [87 146.750000 207.750000 153.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn7 >> endobj 7619 0 obj << /Type /Annot /Subtype /Link /Rect [60 140 144 146.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn8 >> endobj 7620 0 obj << /Type /Annot /Subtype /Link /Rect [87 132.500000 147 139.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn9 >> endobj 7621 0 obj << /Type /Annot /Subtype /Link /Rect [87 125.750000 105.750000 132.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn10 >> endobj 7622 0 obj << /Type /Annot /Subtype /Link /Rect [114 118.250000 171.750000 125 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn11 >> endobj 7623 0 obj << /Type /Annot /Subtype /Link /Rect [87 111.500000 104.250000 118.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn12 >> endobj 7624 0 obj << /Type /Annot /Subtype /Link /Rect [114 104 197.250000 110.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn13 >> endobj 7625 0 obj << /Type /Annot /Subtype /Link /Rect [114 97.2500000 198.750000 104 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn14 >> endobj 7626 0 obj << /Type /Annot /Subtype /Link /Rect [114 89.7500000 155.250000 96.5000000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn15 >> endobj 7627 0 obj << /Type /Annot /Subtype /Link /Rect [114 83 252.750000 89.7500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn16 >> endobj 7628 0 obj << /Type /Annot /Subtype /Link /Rect [87 75.5000000 120.750000 82.2500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn17 >> endobj 7629 0 obj << /Type /Annot /Subtype /Link /Rect [114 68.7500000 195 75.5000000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn18 >> endobj 7630 0 obj << /Type /Annot /Subtype /Link /Rect [114 61.2500000 166.500000 68 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn19 >> endobj 7631 0 obj << /Type /Annot /Subtype /Link /Rect [66 246.500000 81.7500000 253.250000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://docs.racket-lang.org/inside/index.html) >> >> endobj 7632 0 obj << /Type /Annot /Subtype /Link /Rect [336.750000 246.500000 348.750000 253.250000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://docs.racket-lang.org/) >> >> endobj 7608 0 obj << /Type /Page /Parent 2 0 R /Contents 7633 0 R /Resources 7635 0 R /Annots 7636 0 R /MediaBox [0 0 595 842] >> endobj 7635 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 7636 0 obj [ 7613 0 R 7614 0 R 7615 0 R 7616 0 R 7617 0 R 7618 0 R 7619 0 R 7620 0 R 7621 0 R 7622 0 R 7623 0 R 7624 0 R 7625 0 R 7626 0 R 7627 0 R 7628 0 R 7629 0 R 7630 0 R 7631 0 R 7632 0 R ] endobj 7633 0 obj << /Length 7634 0 R /Filter /FlateDecode >> stream xœí]Y¯ä8~¯_QÏHSoY$„4½!ñ€Ôê–x@< f!ÑðÀß'‹›8ùœä+ÇIÕ½Ó‚îr/Çg?ÇÇ?þöËŸ¯ÿïõÇ÷_þ}ýfÿ~ÿå’Ý “uÿ]›?? dy³ÿ¾¥¹~ûåòýúýòùò¹þÿï—îƒ/ï_ÿëWyý]ý¿\ÿø§ºñ/ö¥æ…_.…(ê¿ÿÙþ]¢þWÖÿÝ´ÿ|ùï®ÿjztÃÙÉŒÿ M®Š¬™ÆÂÐß/n™¢ýóßoÿºüØ`Û(•…ήB+}•–×ÿüõò·z×}v«´E®ëî¨ÍHy b!«zT5§ý§w±CçEQì×y;óØ@*ÁÎcîl)«ØivÝ6*´ªÐòª¯S5ú.n«²ª` Ü»8ƒ–z¦ïÀ—½€OZð‰¬šh  ~¢¢1w¾<ÊžU5ãÜkϼ¾Ï´gU^\‡-iÏö ³9d8džUU‰z¿*7ÉÇØ,À»^Y™×íšûµûÆaÀ¾|:ãK íö»¯—? ]o È¯_ÿVKð†Ý__k¥Ø\h|#F_¿þåúëÄÕo®_ÿq©n¹4äÝQ¢'™„ßhøäìí#z"áÜ𠔂ߤZ)ìMÁoT7·_k‚¸oïÑÆë¬Ýø²Æ »´íBÜŒÎË ý¾}¢oZun×—'ÝÒÊ—†¼k¸•UÖ.ê zb÷ÛÜ”,Åø‰ò»—°<ÇI'xŽvÖcíÔ2•–¹tó1Cጡ ÷†)î'‡ß`ÁO`o~ƒ9ˆEò¹'˜O0+-xX|)…›éO1¹`€CXIÈ/Æ Wúl˜”‰$Á±JTw`Ò›æ[spùw ±B•Ë«ÃT‡á‹¹^7ÜG ß@oï·#á îØÇm…^bî‹y,ò¤€&Aìþ&07,››€[@2@¬Â³VXf@>øKn,QñJ1•à@Ø<ƒUnLo•âÝ&ð£ðz0wÁZž!Ûð7ÉxH*Ž„ÇI¥C22 ë&¡aŠ;ôJ÷xHÎÐ0Ú›U‘ßyõ!áL+ó¤ú©Ä¸Hpé]4×;¬êi¼qŽ5; -ƒ„œCÕDðœCeFÞƒ=„þÐFÿXR,DjŒjçôZ¼„ˆò'VYÀsÆp 7l³¸˜a·VJPþæxo¶ä¾°ñ78ê@`"åqÁ”ED(@k–ÂxbçNaÉ©¬Ú‡ã?›>FépeE Ä!DÚj‚\Še,}:ÅÙõX!Ë裆sM”(’o™¢Èny!ƹ&Ýf s˪6“Ã&s* éù¤9÷M‡HÊ%» žtÄ4—¢ao8/&·Èõ&po1bðÀ(–VçÀu†Ì%U>^C$.ù–“¥ËgÀºÚÉuiœ7Qa»×Ðx)‚ÐÇÒìp¥w8¥g¥ß o™]€¥Û8á2»TdË8ŸPcUù[¦Ùn+=qŽºjNŠØ!ɹ+›ì›R··äµãN&¯N°©3ÑFœ´Âöpö½ÎÍZç› ²ÿ7€ E`@â=†Ö\\\ÂÖ\`Ãð…wdN÷–±Ç7t•žf8Ñ›ìæ6ç¤ÀÎLëùöo„G9_Äš•ú‡m0ì°[øà2# ˆõ0VS lÆ F¾'Ò['.<›ÆÄàNdˆ¾í”ÒЙÂsx¥¸(^–H"3²-j8ÅC˜Cïqå扄/K&äÈ‘J"jÂÄWSÍíõh9 ›v·8Š-fE›˜‚õqmÔÈ·è@" YÌ’J#Yt_<,BQãH0,Dè GMpQ>è ÅåÃqa,%ð¬Ú 5!xÀ™%K ÎCj2qKÞ>æžžY[8ÞbxÛít»,J‡gÀ¨Ÿî£¡¾arÕˆ‹F˜8;³Ò¯Â<kšLD‚û3öËi2]¶­ïsi"¾(RI<1)ce¾HMÏÆ!q‰ö3s;<ë@0Ö àþh\Àž8…FªÅX…¹Ö÷ñzNœ²r‘ÝuÒ®!`ù±pêrWBS|ºHÏzãOÑùS²lö¨Wìõ¤|¹„Ž `æoâäÙCgÍÇÂTç¾ÈꎚÙÂDn™2.^È»N-b‰9ïðzE±À74¸Ûo:è+ÒA¸ól<‘ÑæÎÂßÒHd}× ÄGŽÕ¦oÞŸIcÖ€«PD•g‘-?B{W˜¶°^sOõÇrSãX8Žíã]ÀH&>‹÷‡ñÒbÞGXqŠ9g %P€—Ùkï6qÇM1-àW`\çÏ>Á˜¨ÄÌëO„?[C¾ȵ&`ý˜üM`ìe$ÂXkQºS¿8+‰Ê\ ò¼ ¶‡˜l¡¨™f¯è¢UÂ~ÀÐIY¬Ì²]p9Õ•§ìÃv)á+ÜÙQ,[%Uš™ªòL0pWuÂz ¥¹'£˜ªx‰µ3ºÁ¹¹XZR•`0#j¯â<Ìý ¤ÎxYS W…TýÝçûËð5UÄ4Ïr‘"¾ð_Ë\uÆ,#î­E Àõà†Œ—/-¦—×-µ¸5sø¥ÿ-oe™]ó¼ù«¶êknníd®åÛ%×7!*YÖ*ª{KzQÃ1ê÷íï¬ùìê}­*Œº¥þf<“æ­rÔK9ãçË»_íDÊ¥%eÝó}æfï(—í=ÔÅÃø"2i[ 'ꢬÀ½m\˜¶_ï•ÄQ.Œ \GÃ` q‹V”[ÇãÞãKí­:kð]Òz;ê×'¦uLƒÃà#±R¬’a% £ Þ~žïy׷ўģ®ŽŒzÏu_:¾D Ó¦æB/†Y$¢2Œ{‹!%„ÁzÈ߀ÒOlòðò}ztžõè\Ìéѵìé¸uËDnÞR£^ÔpŒ^6ÕœmJŒºe¢G7o•£^Êñ ôèÜ"²ñ¨mÛ9„'j€‰c–A(6Ô…ž ÄÕI(Õ`ƒN’èf_Æþ˜*ºÔô¨÷3ÖF­á–4Ä%&¹iÖ6²¸í`æ:Ì£¸@@ýÃhMZ ®À7p+§@aØ\†ÍpœY:e†V»Îí7ÙZÇÈ®ê³ñÖQ°SñÖb„ ;^zQWe3Ø™5¼ù±ŒüGÒLSN?€c§œ/®KÌ¿‰±’„Ç9Ú ÚQ\ŠLiO^ˆjCdCH„áyûÆb;‚µ Ãµ­×Åü‹°í0— ð/Ü#q©S"Ô@ùÉCMe(WlTŸ_`Ão F@F‰ˆš6€M+ñá…1ßçÃ,ª±³Ìæ|˜¥ôý‹uËćټ¥F½¨á½³(ç|˜EáQ·L|˜Í[娗r'b ªÈ^Npb%S¤& M¾Í;øcy£z¨"XLΆaÃNdÊñ¶e@hBN›LÙ`Pf…Ƴ%›„³=w²-ÇSi”Oå¾ÝÓ‡™kOÐ1YH‘© nü‹˜4ßõéÇ3ÎÃ$C@×'tð€W&†S€R’ßbÀésb‹õ̸È%ü͆€[/] þ5Ú~Åj,¬]½›2÷$)öÿI¢š„"œŒ³ ˜ð>¡'™ ^P“j?zƒgì©Ú™•jx.÷¦*hÇtyäBºÉ½<{sÎͤë%-céQ1QÊ5RÈ8¯³Þ@lqySÜSLvÈYØÊŽ$U¯Ù§)ìŒdÂðÒ ¨®MåÜ*Ÿ•á'Lе!ÈÌä;*{ƒr¾.ü©äDÆË}¾(:Sg*€Ö‡³º@9klŽD9?üHdšj×)ãóÄaO8¯,2éËÚ€)Äp©¸”9¡NŒpû3R‘¹c}íøÁÓdUŠö-ÐDO7„H7ÍLR%Q£á1}¨LªÇÔ™ ôVöCâ›ËlÅܲJAC2S-•»„qõF½Jhçz. S‰ÊCê† Ô Ùwfû¦QÇ5˜˜â2‚cÆIî#‹ò*õ¬Úé Bº[Nŧ%ô˜AZÞ?óÄjLùͺ €½YF<ó½Ã¾&ã¾E¢^,·ªôû‡#‹n‹ªmÑVˆÒ·Éil<ƒ­¯ÐÞï43Ž53OÞCH~€ßtãH1:Öèào„„Ûîw jQôi˜X“ jH%öÒL‚«b\ë@(¶Øµ®vh êm:mûÔ6Ö+êÁ ÿ¼|Ùk9"÷–HYSY~Z»Ðñºêñµôº&\ÕSQOÁÛÑ= „mN"™#ò5>Œš»xO`ŽÄ™üÀz)ò+Ž$RYÞûfão°V˜@2VBxHß¹¸gÄW Ÿ¹?k‚Âúú„LÇ5sOÜ*c“¼o&(È sYÔñÂq³»ç¾”Êc»A[VŽ›‰Œ”ãÒ˜£•ã²»:mœxN›+Ufå"Wb´Fý‘ÐÌî)ÿ³ù*¼HáóI¶Æ4}ã1‹@íë`Þ’ä£ÚÌ­Ÿ¨LLeò¯µæ'`äÿ7U'£Xa-zB>Ld j¹þ#sºÒž4{¨â('¸¹©^„µï "wß:à‘s4¢äû0§d™;i™„¸ˆ±B%gUÝŽNûº î·¢š  Ï<É0cî°© Vù®*»ÉçFȺ¤jIí­˜ cMgí‚bÕôPîGôc+˜ÎÌÍ"¶T7Ñ¥§¬˜› ò•7mÆÐ±"õž#vE|Pª´—û]µ‡ãŠlx°MiqÍ«áñ·¦åÛ%/‡‡äÚ·Ša/îWéŽØÙß…=7úZåþuË·‹7“ºÍÍ´ëe¼{Ä.¹Ý :¥]9ß@¼ˆÉç"Ä&•>ÄäÒaÅ0Ê ‡îPÎmü\Ô¢¿Ð]¦è£q¶¡lQ·æ†ïÚÖ¼i;]Ë·ú£Ìâpÿ–ªFݸŸ®¶kßЕ~õ:0ÆƘv˜ÑdÚ·ô¸=ægÏ_’$•µouTÔwã~ê1•éÈS*ÓBN†‘*ëÞÒãnôx˜C©Löî†+¦ 8ÏeªL\R8â²èiV—Rq)=G\µ™îa}kÌ{´Ñ¼e‰Çuã~*¸”œ#.%&È)qµoéq7z<Ì¡ÄU/ñü*䙳-žÞŸì:øÞÓHŠœà¤þÅ+³Ö €švü[Õ°am‚ ô$kãô6÷[Íx’µ1ž—W·®±/¸}«öâ~É‘'Y1ãIÖ5äü1²‰'¹is3OòËGz’µYNJvƒ1Nô†4Cݱ!®Î¸Ê1éw œ;¼¯­§°opé`M¬\†¨Ê@&Άª,«s;ÎT–館6¬Vi á©´…œSi'îJmÝ•#´y˪¬®÷Sx*m‘Í©´¹ï|mZ&*mþ¢ÃöÝèñ0‡ª´E‘š}¸lM²Û:Ï-\øY‰QÃjâ­2x+1G¼_§¶¾Îí5oYâtݸŸ™G¼e5G¼¥ï¹mZ&ÄÛ¾¥ÇÝèñ0‡o•»ÆuɱîÍœ XõuhS¹¨­ÌF wh±²Û“WSÿùÏ_/ï’]"Ž&õ!é„á—ì­F/\Æú-Z¬pá[UªaÃZfid9f–FV3ÌÒL¼jÆzÕ†¼®}«c†}7îg9f–F3ÌÒHßGØ´øÌ²{K»ÑãaŽd–F¹”|x<à„"´ tÕájîi”é¹§6DàžÚœ€{š%ˆ¼©T¤Çá¸1jAÆ=âM•ƒ'ò„˜ó”ºÍäÄ%%x'8Œ‹ˆ6N¯AC‚Ïõ ¾HƒC9±&G¬w÷3ÔõFÅGQq¡z*ÖÆT\ë“ÇSqÕgòœ/Ç òEDìQKBǯ×ã\å‚:Jîǹ¼Ö=ǹ\ô µ÷ ߦl½çЙÚqŽ?jËÔ›$Žo9ˆvx6s4uZ*:UØïФ|øøÂºŽZò›ìîN›|³šçÂŨL§Á»†ýªã5y,2U Ç\¨¿zU9Ð%_Z.½D¸\Î%Âå'W.§‰pí[¯¬ïÆýôár9——Kße×´ø¾´î-=îF‡9Ò—–ËåD¸ÅT˜™'LÊ •·xb„ƒoÖ‰—+ø’º6DÐÌtvÍL»ìÄñeaCí“£n’IÆ‚7ÜÄÀœÿŒk›Vu_/ßµKbÑÚ "P³©N@͹ËyZÎþÔè™÷iù¨¡AÏÏ—Ï×ï5м ã }^zaE‘™rÃT ’šÝ×+oËà%ÆKêö¢˜I·rFW‡´x›ä(§…ÎíQ-\÷fµdaÌÍí“]é´:\{³÷½L)ƒ“uÌ´’»„Ý våÌ2î ~c¥‹Ø´ôâïY„kþõ‡%„„¹po,{™óEÿämt˜x>"Ç·Ó²¤¹Mà \Ò­Þp<6Ž™ºYþ8BvÈÕÈ>ðt, Ï×Ï—ÿÉ|› endstream endobj 7634 0 obj 6490 endobj 7638 0 obj [471 /XYZ 32.2500000 602 0] endobj 7639 0 obj [471 /XYZ 38.2500000 539.750000 0] endobj 7640 0 obj [471 /XYZ 38.2500000 454.250000 0] endobj 7641 0 obj [471 /XYZ 38.2500000 454.250000 0] endobj 7642 0 obj [471 /XYZ 38.2500000 291.500000 0] endobj 7643 0 obj [471 /XYZ 38.2500000 291.500000 0] endobj 7644 0 obj [471 /XYZ 31.5000000 602.750000 0] endobj 7645 0 obj [471 /XYZ 38.2500000 539.750000 0] endobj 7646 0 obj << /Type /Annot /Subtype /Link /Rect [114 778.250000 174 785 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn20 >> endobj 7647 0 obj << /Type /Annot /Subtype /Link /Rect [114 771.500000 156.750000 778.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn21 >> endobj 7648 0 obj << /Type /Annot /Subtype /Link /Rect [87 764 130.500000 770.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn22 >> endobj 7649 0 obj << /Type /Annot /Subtype /Link /Rect [114 757.250000 168 764 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn23 >> endobj 7650 0 obj << /Type /Annot /Subtype /Link /Rect [114 749.750000 190.500000 756.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn24 >> endobj 7651 0 obj << /Type /Annot /Subtype /Link /Rect [114 743 178.500000 749.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn25 >> endobj 7652 0 obj << /Type /Annot /Subtype /Link /Rect [114 735.500000 178.500000 742.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn26 >> endobj 7653 0 obj << /Type /Annot /Subtype /Link /Rect [114 728.750000 275.250000 735.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn27 >> endobj 7654 0 obj << /Type /Annot /Subtype /Link /Rect [114 721.250000 162.750000 728 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn28 >> endobj 7655 0 obj << /Type /Annot /Subtype /Link /Rect [114 714.500000 166.500000 721.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn29 >> endobj 7656 0 obj << /Type /Annot /Subtype /Link /Rect [114 707 175.500000 713.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn30 >> endobj 7657 0 obj << /Type /Annot /Subtype /Link /Rect [87 700.250000 116.250000 707 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn31 >> endobj 7658 0 obj << /Type /Annot /Subtype /Link /Rect [60 692.750000 125.250000 699.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn32 >> endobj 7659 0 obj << /Type /Annot /Subtype /Link /Rect [87 686 132 692.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn33 >> endobj 7660 0 obj << /Type /Annot /Subtype /Link /Rect [224.250000 610.250000 276.750000 617 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://ocaml.org/) >> >> endobj 7661 0 obj << /Type /Annot /Subtype /Link /Rect [43.5000000 554 73.5000000 560.750000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://download.camlcity.org/download/) >> >> endobj 7637 0 obj << /Type /Page /Parent 2 0 R /Contents 7662 0 R /Resources 7664 0 R /Annots 7665 0 R /MediaBox [0 0 595 842] >> endobj 7664 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F1409 1409 0 R /F1700 1700 0 R >> /XObject << >> >> endobj 7665 0 obj [ 7646 0 R 7647 0 R 7648 0 R 7649 0 R 7650 0 R 7651 0 R 7652 0 R 7653 0 R 7654 0 R 7655 0 R 7656 0 R 7657 0 R 7658 0 R 7659 0 R 7660 0 R 7661 0 R ] endobj 7662 0 obj << /Length 7663 0 R /Filter /FlateDecode >> stream xœí]I¯ä8r¾¿_‘çúµHQ`èÚ ø` Ñ ø0ðÁèq{0¨¸=ÿ}§$*S¢ôQâ—AJÊÊ.̼L*Å%ƒ±üø/¿üçå¿ÿqùñã/ÿsùÍþýøË[ö^Yÿߥý÷øA×ïö󥪋ËoßÞþ¸üñöóÛÏ×ÿÿã­á—ÿvýô}ù×ëÿþvùó\ÿbÔþàÛ[¥ªë߯ÝߦR×OÙíoÛþ×·ÿÓåïmÃpv2Óï?˜¢Êj§±2ôoÃ2U÷ï¿ýýíÇa£4Ê”µ¾(“›‹jŒ¾üï½ýÞ®›¬OV_Ìe>áþÇä„ëvÂyÖ\¸MU¤ce´Yèû0dw0h ÕÁ;W-ÊÜT-‚ü’†MYFƒ¡Ów 6euXíÃx¸´9²lz¬SWø5Ã`ihíD8htq‡âðä{]ÚÿàçP©ÐYËÜU½æ÷Æ(U•¦Ê!•n‡éćn²KQ‰n§Ó»ŠÑyÛo´ÎÛ™KEå¥òv.¹³U6€'Ï#èÞ}„Îë\Çë¼›¹8T†½Å½Knn}Õy;5E ð½ÇS5§¹4P†­…__TM™UµŸÇCë뙥F»Ê¡î{{æ0u>´ füӯΫíùä÷Ñ4T¥[®¨øy:ÛJe¦ê'Ò~ê›íð‹ ÝL¦o»sy$“ç£Z¢AÈÙoã†u@M¦1ÛÚ‡vNÖ®[pMî£^†÷Q'íE÷æW·«wQ_ª*wæSåθ íD´ý 0ãqo£µä± ÷o“öu¸tÓ@[ø˜®S¶ð±ŸFxzåÎnÃhünB¥„Ê$†™ŒA0·÷š6‚fº'%X4Î|ëBAÓMc¶›RÄU™ûô&í…ƒ²¶¡¿òtõ0ó©³åiÕÙ0‹ñ§ñ|ôô{d0õ³píxRd 9[3áHKPš <Ûׇ m Ÿ¾¡°vøtq2“R&å΄zHŒ¦±Ð0×b»8 †Zn©bmØ¥ž?­j2ð}‹…H­ÎJ—ÆÊEÌuÚ‹îͯnW³"U9óQ•3îBƒå j®N f<îm´Ž‰bîS®³—nh %­>öÓAÝ†Ñø–˜$ TŽ 1Ìd ‚ñÀ¸Ýácšéž”x`AÐ8[`ùL(hºiÌvSЏT}ŸÞ¤½qPÖ6ãW¾‚®g>yãÌ'oÞ§4µÐ`¹@÷!6|ÆÃßí˜Qdè8{2eEëPOc¶½ÓÛZ}C3 ïðé>âd&¥$„Ê@†™Œ!1žnwÃÃhµ ¡é•xühð¶Çò§P@§qßéǬVÙBïߦí:ÕúþiyB‹]=¯ZYÄ÷>Ïh6¸½kPˆµ^Ói¨ñøñá¥üªu8 ¦ÓÓø5fËfl³·«‡O· Ý_ù ºz\þjyZ…v&3oP£Ùéé÷Ø@ë&ãÚ~ ²a£, [‡Òxàû.KÁ§È]ÀL¬pw©[8ÓöͯnWcÓÝÄ6Ve†qGŸ¦FæÉ÷hðé†wGëIËàŸªQKp)rÏÞ=¬ƒyÒmÌËöÑaB¥LîjF5IiA0xÞ°lcCBvO–Ç· BÈÙ ËgÖAÓ <ÛF):êŒWÓ†e>3m/º7¿º]=Îgšâ qçM9Œ;ú4šÒô݈ðé†wGëøŽ8<–Á?å3Kpq/ &{÷0Y“y9í¶GæiÃhüŠ`r'Îf“Ò‚`<ð¼a‚ÅK]‰BÈîÉò8þ#!g',ŸYÍíÚA ]&dãš‚›‰5m„Ю峩ºjv´hÝdª;€F7ª¶ãŽ?MÅ“ï±àÓïŽÖñqx,ƒÂg–àÒŒöîa*jn–àfjÖœ5ŒÆ¨H&å}혔£–mÅb¨3…а'ËãLø„œèùÌ:húgÛ(DGj\:šÇFí˜5›Î&àtõ8Ÿ¹›$¦Ó2·qðä{4ø˜¥Ñ:¾#eðOùÌ\Ü‹„ÉÞ=JEjnT45OÎFã[*’€Éhó LJ ‚ñÀ³`úCBÆ7΄ÿÈAÈÙ ËgÖAs»7˜¡KP<öž½‡J¨y”›VªOk.Å¥ó–ý0éJͺR(`îÏ‹~}ûñKsQåå×߯º¹÷~½’¹®/?´“¸²Ü_ÿrù§ëÚ>ýóå׿½©+U_§VÝû'e÷¤~¯›¬ÔEv¢TÿNþžëZéÑ;*GïdE÷$†½S£'ø¬‚sƒ³Î>vOÌ»Éû€Éûƒžèö¦‰qà;ê§þɽÿ”¾Äý8Ÿ½’Àå–°Ww¡\eÓί4—×͸¡zŒ0ª¬ÞŸ0ªöq ç콬Ԅ0ïMŠÁY{z«ä›7`BÄäV…aVÕ+¨-f™|Ü0A[è@™.D®Òí`hȳ÷º¾Žltû·²h–wdw¡Ðµüv}é*ñT£ëúö«¼™tc¿Úa®o uûâÅé@Wî0×–v˜Édº_™i7f:Ì_ÊJAª({rÈ‹a;¿@9‘ãs÷¤¨a2æ.îAæìÁ=<0¦(1…bN°¦ÖÞ]§œv—ºM*-âë*7ðdS€'æ»AŸà¨ñxæ†g€u;ŸdàJ!IŠb$]øÛ­A€Êâôp¥r«žö0Szô}³>lg7Kð¬ÍCüI¥Í« )a0'‚†æR³\¸7Œ)3â¥ÔÛ­"k ÑÞë½=ºçù¸A€Dksmô÷"²ò.ÐEvfá)‡ ÕÀ£ÛYÎÙU“bO¶áq©³|©¯sY5@dàÑÈDV01¢ñL¬÷–CÝÑhÂü°À@Át]ë”Óút—ß¶¤ÇíæýªÓ:›¥\&‰­º ûÄïàq¶ëMºNƒìÏBÍ.dM»zX‚`\ÛYO®ÖSã†Á*ÏÚ¦\áYvŸÍ°Îà;& >…ßÁãðÛ²NFÕ|{+‹Ú%£%¸Qà¦y.“5tà¹í­ÖlE6Ø/‹fÜ €Áev .ë'Ã`Qióܸ]—´yÙŒp»:€cM]WÏ…Û‡Q¾;J©ož67lõ‡h²lêÑdjÁ¢ÉrÇQ¡mqý!º_õþ·n†¯ÙÔ¢nšˆº©aÚ×¢ÿ•™vc¦ÃìéqÝÔa;·Û˜çÊX@b\© 84Ùà¶£s3nx€¡÷·¶ÖIóòmø®{?œ*³Ó#¦Ö—rðæÌ†–ßÞÊÚ"Ÿºýª÷b¿©ÁËføÞ;á8o«ÊCµ¾<ÎL®mÃÌû^¦ëh1÷ß’£nmzÌÕ®9Ä“Yöž,o&u×$Á`Cd1SŠÙœ›w1p%;× [Æh©k6:wVOUÜåzû•ÀÀ†ì¬pKÂà†žâ?¬æÔnd·CA´²œ4ìQÍ©‚CZbJi}Ñf9©D?dsËøå†"fº©ŸžX~T¾[¡ÕOð¾cm{å½å£¥±¹>gk¥ÂRÿ9zbõ.­Pš³¥Þz„VæÝ¥K†KsƒëñÌ ¯´ItrÑùP|cnrŸU"žl«‹hýQ·»"¬ñ.Àk&KîKï|ï-g|Rù@0r?À×Oö޳‘ãœhmá•· &ôvsýêA,¢X+ríȵØGÆí2‘ò#Ãueìdsáâl ŒcFöŸ–QmaJ8‡Å¬ý §áº¨›ûñIüŸeØ„³Ä¸\§’ˆrèK`K*ªÕš92±Ó|$lt²÷ˆwY ‰˜ó#kP”ð VØ£fÆl²ˆ +5O…@1âžHà,\§J6p‹€ŽpÚÙÈ×ÝL–›½‹éœ3}#“ö|ž1ò…‹lêÇ30Jl ‹™°RkW…ÃDæž(óÖ­™8^èhä“oHžÆCö“£©ãŸ™Ò§¼Š=ry{“Á¹Ö1/LwN•rDB´‡çЉš23®ŒÂG&색ŸæsË€J™ C«œIôž›÷n:ûŒžX Xxb×·ôÄ ']—f ÂÇÁ½ÙY'°xU·£ýîÕj“ùì~³EU> A¡¹™`›€p⨒ñ‹I'j J`°«CÕ”I⾟20¤Ê€v`ýñ;öÜ]®K]"|¿7à!þaÏ–oqo µ'L7½3IÕŽ(ô”Q˜Š)ÉÁÜõÌ´#ÂcÁãÝʸ{Фr½ÜÎ!¨¸OBðaS¨G‹šÙ°W¨$DXòbØÇÕ9eiÄã—a·=Í÷R†e‡eİOG5³ó¶60þ ̵><G{þàû5Ù²Ø8¡Üš>³K°÷`¸kÊa2_¾oÏÆ#’¯£uƒUC@òä{g•¥»JÊ•qvÏæª=äoX‡]éÀNéðRs·Spàz`…Ç"¹,Á—ð3é)©\^Çlžýl˜b×!ÂDÁø‰SÅW·§×£¼ÁŽö3p´(Þî¹ØHäEf³@,…&œÀ+‡6U…« õ÷ß8YÏÑ«,fLÅ{Y/0"0Ús}9¤±’TÙ""Zw¿•<éÜñ¨¥+Q÷ÏÖ¼¿³¿p1J¢&)S¹@øšñ§ YߌyØc*ÄhäKz&sÔñÿruËùò2²o`q/pÆ¢ˆfn8vwð”uÁÛðelKnb>j&K s` Ù³eS»šjäR”ûŸ<Ÿ$X*å<ÕÁL©¢|ÌN2SºqÏ”,È{­¢+wå»ÛˆSÅûE=Åò0óaŠ ²õ´F3Ý}{ð <Ô­£Óp^ºÚ-ZšñIžÌàpÊ3¼çpE F*UçÈEG Ÿ§ÂÄì&¦ ,f óu’ ‡)n0eÿ !Èq„ q©2xÈ®ïÂî²B¦jÜñ2Ä §À•Å®ý+c%2ÔP™+¾$ãNL;©v…ïþ5ò<åg1"Ù¹D¦™±TJ¾Ë¸¬q$‹‚µ‚ö‰™êÂÔÎ < …ZªH.ªÂ!yî½\`™©ai(H”°³`_(G—ªTžµæ-õË⃸`¡%í°YÃPþ>ÁwàzR,¯ìØøDEC2Fÿ°P«ðÉ9¹ßjñ¯-Éw„Ó¨À®5­(°œ³do€½èT€œ“ÖTù³'->"SÆã«ý‰Y_/«1CÕõĴŤƒq¾iÁ³–ȽëA, üí×2UADíú!˜|°D2mŠRE]«öÏsRS¶ tš¼x‡Îˆ%›¤Y$–DòäÝŽ)êáõ·Ær4.c.ã*QH*vý‘«{B£?rÅJÙ2²>W”WJÕ™†˜ºŒ÷E²<߉rï”Y•Cb“ÍÒ Ókìx~FsQJÔÅ£Òž¥šÊÅRY'§T‰u ø\ææžò˜Ù%ÑÄÂܲe3½(½ÄY+à !\.(Uu¥ý]8O €(l–(#Ìð Jë“Õ| uÉdE½/8âžÎÖe¥]` ¨Õ1³6&Šà œ„¶¿2™Ø$×÷¤Ö®®†“¡¼f¯w.´ðÄ(øŽhâ ‹£QMˆuíÆaÄbÜäÜ«&¾›qå ¢iž#ÃwªãÃK˜ÊVÈu±]šî.±’8·Ë&Ÿîø’d#ܾ œ¨/U•BR–áxÂQ¿ƒaM­»}¯…ÅÅX]*e Â}$£TH¼)p=8N€Š{ÀLG*@Ågdb <;GÀºÀ1@¢9œµÁÊ?ÆDüÎešn˜æž.òwpœ²Z€Ò‹È‘Ýç=vÖצín†#4>U0^™wöX•áû4w+ç f¹ê–-»%r1ˆaÎ8ÉãÂD•;°„å*Ê‘_6G|G”œÞá°ÈG¾y<3f ­Áð€_nšâah+ê¯} âí©nÖz¡¬‚²iÌâz¨ÀuüÙ£6DŠº?WáE!æñ#>MQ/Ã2ãÊ·DŽG‰]wcù¢¼B³I‹¸Œ¤Š‡d˜’¨ÿ«l†KFÚÏ’ÒÊç6,3$Íc‚<ûM.áÄÑŒ®Ö5¦+³¿O¯˜ˆ¤ÙMuª£ŽÉDì&“7[$Ô5DÖAÈšÒv’‰dgo¦¸U")øôgQ†LçÈ+ëõ‹ùce&â5Câê?¥Ò/ꛧ̈4‰Jü$+%´û•N2“ú‘󹤢T¬ÏÊ+gêXníz%ôQk'%3…FOn·û³'µ#®­ÔÍ{·‚ÌYbŽñó Äi…4}ëüR¾ëî<1×1]/a|‚ç†7Æži‚f`Ï41Gïtªo|lÀê¡' f§8ñÄãEOäRÛÏ4ý¤:ìwY­¯•Q’á¢ì1í¯µŒ´KxÄïPYõøK«›X™q äGwÉŒØgvÕ³wElÈåÙÎï0Wƒwsx#˜FN {Ì’•¼©À1¥õv÷×/b–"fÙëìŽ@\v¬ÒT|Í4Wj•$÷Ë€‰¡-š·Üã5AÈn*ršÀžœåðê;{àq˜Ú‘§J@Ëv¬Z™ÈV¢˜^å6‰Ð&D~v ˜ãlÉ›—«›†ô%­«ë8 ÷Pí.WAØçvQ3NÒhÙ FoÏoáIt3¾Ê Ñ‹YOù|íÆ°fQíù‰ B¹ÅúZ1W‚Ö[IpKä  [†“Bo»áÿKo;´ÞÆ c`z1»'`v7ê¾q»sS7Þªs™Gþ#MaÝGzÿ‘¼v˜Þ’ÿȰxäîä×Áxoä Î`-Øginxdzžp¡±>7¥æfk‚šÁõÇåæK§}ì*…/ð.¬¤XšödÂ}à8xð¬¡Çƒ;˜æ4ô‹ÂSØgKv¹06T@)‚šóMø„B ¼ôÏ5Åb•¯5M5öÕñZ(N&t]ÆJáÑ °¬&ô*j‡Ñ šÑ¶±Èœ÷±¦ aíqBKe/Ãx=u‡®”KeÉD_yK'q&Äs­ør°ãìDo±4ÃUÁžB}*êuÐ@}:÷ìÏÅð•ÁΨu)érÞikšjóHh»­‚tï ¬»@ṕ!4UO¡è§VU(w¯Ré;…Ògä6”+û™ƒéý"Óëðx‰M‘e5žè},oúr_ ÷õ¡È‡øfœ¸Èc–"®¨ëÇïA 0ÚÙ‘tj@q”!‘N=4>šBp›—ö)7FJØ]p§ ¼fÈo,%¯ÿ.\©ÉKl?¯ý`5֋Ĩ®\Hµrær»=ÍÖîlª˜ö'n½p/ò‰ZkaÑïVÎè†h©Ohœ|mï–æöÅ®ùu.õfí®¼Æfçr¾@KåKÝc78ƒ–¡poðK*hé#×áÚÏ× a§×Ö%8` Q@çÙ?#ôÄ»gO KP…ðö` Þ#ˆ%\ÀëÁãàÞêÇq¡ÊòwËG&H©_Üîj”ts•Yþ|ùùíÿíÔ“ endstream endobj 7663 0 obj 9082 endobj 7667 0 obj [472 /XYZ 38.2500000 721.250000 0] endobj 7668 0 obj [472 /XYZ 38.2500000 678.500000 0] endobj 7669 0 obj [472 /XYZ 38.2500000 721.250000 0] endobj 7670 0 obj [472 /XYZ 32.2500000 640.250000 0] endobj 7671 0 obj [472 /XYZ 38.2500000 245.750000 0] endobj 7672 0 obj [472 /XYZ 38.2500000 678.500000 0] endobj 7673 0 obj [472 /XYZ 31.5000000 641.750000 0] endobj 7674 0 obj [472 /XYZ 38.2500000 117.500000 0] endobj 7675 0 obj [472 /XYZ 38.2500000 245.750000 0] endobj 7676 0 obj [472 /XYZ 38.2500000 117.500000 0] endobj 7666 0 obj << /Type /Page /Parent 2 0 R /Contents 7677 0 R /Resources 7679 0 R /Annots 7680 0 R /MediaBox [0 0 595 842] >> endobj 7679 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F8 8 0 R /F9 9 0 R /F1409 1409 0 R >> /XObject << >> >> endobj 7680 0 obj [ ] endobj 7677 0 obj << /Length 7678 0 R /Filter /FlateDecode >> stream xœí]K¯ë8rÞŸ_áõã) pŸ²Ðè²dôd2œ;Hgùû‘%Ê–Hm~.R’æbúØ’ERÅb½?ýË/ÿyúïœ~úòËÿœ~s¿üòVM] ÿ;]þýqzAÚ³û|2¶>ýöãí÷Óïo?¿ýÜý÷÷·á_¾ü[÷éÿNòô¯ÝÿÿvúÓtÿì~tùÁ7#L÷÷½ÿÛÑ}ª®/×ÿúöï8ýý2â8[Ìüûum•—eÜ™ú÷·ñ5Eÿï¿ýýí§i³´¢i¤> ­ºÿ´Zžþ÷¿ÞþÒM0yT´Me¬&?O'—ÝøRŒv q: h«ÆË×+zöëwÿñ äþ2Y‹0²Öm71ùy¾–Ûæ6ÃRLs½4L¿p¡_ÆôIÏCd6«?Ùä{Fàø»ñczå>˜æ ·ö©}×ÉzxM¾Nùý­Ã×qVÿFÝ»Ù@Oî¢<)um¶¨îä SÞ>¨éöÊù÷<éçö§ê¾3ƒùéÑÍzÝOÃì7ª6mx庀~= 4šëKO‘ã2vÿò“9ƒïÓZˆ6n'–'™\çŒýý•{ YÞ7¦ó¢jïÀÔ3ܰw~½¾<øî ô4)1z‚-“±Mí&½}ÐçÙyž}Ïš~r® má†Ä2ØgÄ$„ˆª#öìéA1|˜2¼ òznÓ»3Ãë9œáÇeðþí'³ßõyñ@³¡Ë 8n/–g™’6Øx;0Г{@QõÒÞÍ—a÷?ò3(ZÛN´6•î„s-ìiA®nµ¦Ñ¦zF€7ò2¨»!dÛ½qÛõÿx†ïp-ßàýÊÙ¡"T#⣧«æFÐ ¡½ o39cî‚™þôÝ{”M_²v®°X+ÜìÓO3ÝdéÙ§5',ÃìÔdSM*¼-ù1½°¥ÙÄÁ~2qpÓ6 ¿Môþf qÝö¾û#=-ÞØÊÌ—Ó]˜M»ð}1†¹ 2›ö:ÛEÒáÃ2ÐL¯ßƒÊ°j÷žÒ…yöÀ>L´.Ü0¶_NËœv „a³·ŸL¹Þ/g6Xæ›áÏ2¹Àú?ú ©p–l$Ó™²•½-ov½ãª»`§O¼#=OpD»¼*9­ë‡Û/ß½'óÃH.MÚÓ¡Ì òöeN…BM§ ¶ôÉ6Nÿ½uèzýtÃðé:ZFpLŽós.sHÿ˜¦›·<?dl²uʲqƒMº¥éÄ·Ýå:aRøGK,£ììºí|÷Gzžü(é-GÉù´áwwòûÙ 2ö:Ûå?–>§4÷ Ò/‚Ú½gTœáƒ‡™Þ…N wˆžN;‚[Çôí§ÓÒ×½³þ4îÌÀ2Û –é>°xÐw´%.R,m$×™ºšÊý£¥=\.ØéïÄHÏ­—W¥k·ˆÛ‡©,çßsÃH× “öt(3ˆ¼}™S¡FÓiƒ-}ö€MÓ×#ºŽŸn>]GËŽÉébÎe]{‹/è骖FâÒ°5Äd3ê” dã9štJÓ‰o»Ëu´oÉÐËöùuÛ?øîô<ùi&:êtðƸio&ë™?™8Y˜­§CìÐX†ýœà„PÑMdÛž=Kz´`hϰã_¸!³³`0€cr4§Hr¼ûé´á…)ò.ŽÄÆ7Q³óAÇÛG[îÃE7K;Èu|ëBýŸ]·ýƒïþHÏÓÓzË1í|Úð»;݆Sà  b<›ÍuZ~0,}NTîA¥_µ{Ï¢8ÃÄxn8mÝ!z8ínÓ·ŸNK_÷ùÓ¸3‹!¬3Á´|`ñ ïhK*\úe9_ŸãÚÖÂ:ç¯VüîßÉðoš*ßàýÊÙ¡â×áè?§ŒB/%´ü{äÁÏ¿¾ýô½[Ssúõ/ÝÊú ‡?¿þxëDí?^”µ8ýúçÓ?U•üòϧ_ÿö&:’«kêþwýÑöwìÙ¶U#ëê¡;ª¿£ÏZ qá×;²êï´gÓÔÞ3äêÛ°6}–â²´Éïä èyD§>+iÅ|ž–Z5ý¦ò3ç „¤FSÃo¿vxõJ´JˆVz8Q}É=爆ͶŸRX8Ù4•¦¶Í½ÀÒ†Ò£‘Ïԟ܆*wëgtãÞ§òßG|!·Z§¯-ò>†DP`U­ 7ýÕžÆxÄ@ZrÕäzžõw¡È«ÝÒŠ¯$Êl‘gD PÅN†½·!Ú÷d2ôÎÎdT«‡w«uNŠŸssDí¿A!^R}¥D4MŠAUMB—Ü‹Y7ŒzŠNnÙºAsä}hŠC‹1ˆASJ‹â[ºH¢kò(";ȃ4#È!ô8'º-|NŠY³HŒ‹ÛÈ›"Íç‡ñ*"岯¨Æ[7·äCqÇu–ÖÑ"z´Í*lŽncïï*)eD^úq¢G;°"›IîƒüîOœ°Då¥1¢™×¤ËnW(¼½aFD+AáFV½WÕíuÅa^f^ب›“I´¾"Á·¬R«þÀ^^Íè®W‚@½¬òúhz(Z…- i»teÓC+F¯ø>¾Ú°þ@§X¸ãö¡>ËÀ>ù)ýÇG–ži©gÔ(¡ÎÉ$Wíâæ–V]]·ªUs” ïÐk7~á}>“£}¥î8‡9«à4+cúšñ <°ÇjÒÖÖ+øž]î©D®G“³®¨3Šøã\‘ˆ« ²›$˜/ÉAÔH{B"N{ÒÖd@OPÂÙI@ûwn–޼¸‡Y ?zm¼¾]ZÒ  1ä FЭ<ƒh®ˆ6äøÓö'¬Èðô Ò€|œîÑÇçî’rrŒÆx,ƒY×§ñ‰v–“¸![¼25½62 Q‚"ˆEÃÚçk%tFú™ˆ¡!'+Ÿ¶$Ö…ôÐÆJ¶J¹"\ 8•ˆ5<-_K á¶™ë$¢>W¾&…@~ŽÀ ö¡«j}ᄜ'AÊÛ áI‘^>D’C¥_‰b®¡ç¡­Öâ?ÂÎhÅ ”®ÌÃPw)KD´uļš—PgÖ]ùìDw¢Z9R†õ£¤&Ÿ!ýêc6Yuñ쓾x)©g"‘ ¤ÇÝ¡íRÜÃpÊ›³ê¥˜‡æ‰Ä ô›ÒÑ ô jòνx„¥Ý&÷‡Ž$‰`½ $Ü"‘t„Çrmëcb©8'këQX|däYp¼^AFò8z&'ô‘¤4ÒŒë ,ì&·„çÌým3Vç ãâDïˆÎ„H;¥„rVY0’½ d"$”Vìûá§{ ŸâcIþ,¥h<žQO|!4@yÝ´tj=k½^' â¿+e•Í­NÐ.>ïXOçÝC’ÓE ­Çð ;óÞMèŠ|½Fx¯ç„Çö<•áRî8±réÎWòÎ÷;ódÜÔ¦“Áæo*¥ Z—ã­ç¶Ïâ5— b†VÀ›WK‡¨­e€Y¹}Þù¬Ñúf›Ú'ß4#)R„¾Ù;wrÛ…òiw~¿0>å䪡8lij@N‘aü­¨ùÆtÞ¢ 4]T¸Ruûb›Ä›X\™ˆê„(J¤ÈÐg‚W9]=P/¢S!¹ö…rL ˆ%dÆÈÎeGƒ§½2< :ž Ë͸nS{ë.æ‰ß“izö¸ºvqC’u«ÑJTG ï¼ ʰfK C½OäT&ÄÝnOÄB|=i‚5éë0ÙòšlÓ’ò‘lµ+V3ៅˆ!"ƒF£àB’¢RñD½"¿ä«óÖmÇ|É}ö$õbUçÞ;`*%Ç)¿_W§½Ðƒ–ºãЩ97A@ÌWò™–|ÆmésPFPw*rÕ‘yêÎ^Î3†£ØpÃÑ5玞,,-ÍC®Z}"߇|&2 G¾–Þç 9$×6œ-)B®D®Í™å–öDžǘðœÐ{ªÈ;µ§î<.ì\Ö_F²ˆˆ†Än$¬K•Ø1•1㔟®ä VÐRJd)ce9!¤E^á=! $¸ ße6u"9 ‚»¬õn‹e)¼hîÛ–½&{¤YKÜ Ÿ%¸žÒ!·¯ÝÊ¿¡ðèÂSÀh”!·&Ý†Šæÿr2o‘ÙRg‹9êÀ[z“SbãØçãÌQpâ¬<µ·Öž ¢iȉã Ûa-” Á)SK箲†ŠxÓºÀZ1íw™qÖ´_YÊ\8mÓ® Z\f)Z(ž‘í¡uÖpaÞ*c¥²Öãg¬•«#Í3“ kã°øÕ=Ê`/䥀ÉOÝOöWË€LwQþ«½ŠñH¥øBtàNÅžÂ' BØ,ö[^_IÂîo¦Œ&¯€À‘©i0döqËLÞa©”Ê'êŽÄÂgt[º£ÉyÈ¢ ×PØpd¡E®ÀávÚÚd¹=‘•º»Þ;ŠÜaòŠ.ZAîIEï0[ÍÁà+å°ªIˆ0×Äß|é;dYzÕôh‚¾Cà Çû”Á-v€/‘’4$½‹”¤VÍ‹/YÞ§ ¾4ÏÐâbø‚”h;0©,&™v˜)_Eצìô<¤„Z “"ò ƒ’’ckw€/4å90i+˜¤„Ù&=Åcïé½WÍö>BE>V,A‡¶~”ĤºÞ&†üc¼8fô‡Ã1]“wÛæ–qìî›–Á±ö‹l)£w+R”˜~†Ö€W§c…ß´Ži±«´0éð¥%µˆM˜¶Wž¥ûîbŸÚƒ›ö7Ò4i}ûã–y¿$ÏófÞ§ þלûõñ°²Gî£ÑÿõmöëÇÞ…2øßìÂÓ@óWÚdza›Ï¦±<¬Ëà²Ýƒ¤Ø>òFqÐpÎ"T‘1®%iû2"Mmø<¿Ú›*]Ž¢ÔÕ.¼a»<̺ÖV`P/å<¢¯üöÖè³­´ ¥f£¨éÝï‡ïU{yìä=]YŽîJ÷Ì|%—_ÙÙ(v>Ç_ß>ÿ!˲ËjDC“b¹ßt®!}üéB\ô<•¥˜O}Bw–ľÌ-e·Wfò ùÙw=Ä? Ó&sç%kβ±§£%{Ôè4A[D4{¢†ed> ¸y$Û–5ozÍòöu-¹7UÈRÌ•‰Œ£¨éW–Ò ¾ÀRšÚŸ£»°”˯ìl;Ÿ£K1ŠÚÿa)Ý‚&x´Ftf â‚tåU ÞòyËGn‘ ŸˆvŒSzmåû‘Öuã1¼õÃj ÛøD.ÛÌE.k–D.ÛúâPw%¹.¿R³QÔtŽ«Èeë%‘Ëê`Š\—_ÙÙ(v>G‘«½vª{Q‘KkŠÒÈê2ºžq5£“æIïEzr×ßÜ‘ƒQ?BÙ³{„›$5²$V9Šž§”†^A$<X[-1îšwEÞ”#&ÏÞ¡ÔÜÏ™Óje07]B:’ £Ñ»Y(Q@WÏ]õÐU]u#º*›®dªz¦+™ªYЕLÿb†ü—™¶ÓÿJÍFQÓ9F]ÉTzAW2•ŸÇs¹âëJý¯ìl;Ÿ#¿®Ô­åÅu¥”è €¿2ŸŸ#ô=Îx5ËÃmº7qaOçwÿG#õœ‰Êz‰‰ñfŒŸ³Á˯Ôl5ãÊD¥Zb¢Òð¿\ ˜èåWv6ŠÏQ€‰*’xL4×!„p#ÄÁ¬fý¼  ±GVM³.¤’Âêý(âON÷¬xÕöhúK VZÍ+­—« VÚ ±ÒsÑèò+5EMç¸ VZ. VÚù¾\ «Ë¯ìl;Ÿ£€`¥Çú·/+XmØÂùb²ÊÍë–KÊ•Z¯ég"…hèø%'洛-A"OiÙˆ• ¿H•÷}•+BŒä3¼áñ)¯ÄòoÐ8Ä,(ä ǘ¢d{ûÜÙ aqOQÎÈGE7ûÃŒIÙ 3À ÙN dm1ÎÀª¡B3J鮼a¶øIáÊÌPô3Py?ÖÂÎH®73Ug*"G¯:GbF~£œ­ÆTþõ´ÆöÇ"&T J±ËÏw•õ614v G°¬§Ø\YëË@)›¥$dÖžFˆêÎÌy{4½šq’V‹×êê†˜Ý GoP±XÎ’‡‰ThFö©[x*w« «[”ÜXÅ›pœ“ÈÄf"‘2,ÇÙº-ñ!úr-]©£˜+Üv‚›ØÖ2¿ˆž—+òö.Ú©ƒl€Y 鼚ˆUXgäšçqrÀ£8"UÄ+¯Í­T%Ôõ… ¤ŸÆ];wN¡UŸ]ÖÑ€š8|˜Àf;@^Õ!AÏŒœ)ŽœDÞ,e$‰Ä…™h™![‹xyQñí@á¯À›FÐŒ†‹­ËÆÆ¼jîš–Ï+²NQû{…d’jÙ"ÿM+Z¸ýJa‹í[šg—¥]ÌYQ[.rtÈ}åå>¤-kâ03»e-XÁ »:_N÷ æ´Ý6Æc†‡"í²ZÓ‹å?°2¶Õˆí®%@.©bµºˆqõx#ú™ › ÈHÍ»”šW#.¯u€³šj•ðxìA^†6Ü SK£'«%%g„W# QÄ¸Š„Ã°ZY‘<Õ0×rÏü,³¦—¹‡ *À¡œâ ÚÊaÈÉv]ÜÛÆóš2"±X¬>3¨` «iæU;¢®LI)¯»A[)óÛV8Nƒ^‹e@‘m Õ'9ʇ²6óø8êè'@ b|4bú«¿»ù¹gc¤/6•ÊÆEÚ±ò ÷ϱ­ˆ^X}"ï°æŽD„z+ +gg¡’ë÷Ü€œÌH<=¯£8{[v§ïªrþtYÈâwO´Ì$µÇûÖ?1<V$j°D0×$ÜrE–¨tD®ÉÛw£*Vب­©7*Vè€? äî_Ä"ê6êÌ%‹2×цØ"Òù!á5þùuèìKÞúxˆ•`ÆÊc‹X-or}d‹m T¨„DîV7Ç®Xî.õhžúôˆQ ÉϼŒª}æ…¥M†’$€dpšç8ÁA…ˆX 4põâÂ;-ìøbNŽ¤ÖˆFŸ}Þ¤Ö  9Ú80·Û m5@‹ô ÔÔ_š†Ñó¬é쎓¯ n Â¯ $ŒEXkF‰öB¹»“ß<׊±SDï‚0‘Œ}ÀhBö(³{Q2¯n)Q(NR‘Îb«`Ùu€ òºv“Áú<;?gÖ²ñés)‘“·ª ¹úCõ¹jÕ|¯èè•‘ yöYs–«Ù%ËQÎn5^X¬°r{mâ^ª×s™aÄlàBò[ÍÒd­p Ÿ4¥sßNËÌ^Öl-È[š×€5åÂéy"+à Šâ-CÒÊHÈOpÒrææäP¦õX”ËjdŽæ-—Í?aÓ¥‹¤²é—*·Âë·g©ä—[ü`e [n¢™»Pb‚%=™%š§T™ªµ£Ã3òĶöÕ¶—wö¦¤×!cä4 £å OÜx½ç¥ÈbHÅQÊŒˆÄpFÒÇ ¥¼Œ…¬˺ÓfÕRùÿ !E¼éG¼ÁÓ…‹æôËã#É‘<ñÈkl¸O̦ #°ž©õr3W¿Ú2¦¬ÕL—Ù:Ëáhg¶e•ŠýÌ]9 HT ³=Õ9R ðñs¯Ç Î!>¹ãl{¡¯œ~æãÆàåÆ<•òx±²©^,e¥”e«k u]QÇÙ1´çDâ GX­ÒØGIbØEmŽ Úq·'&DB„XŠþeVÞ>Ëš¸E,Û™8]‹Öãj¯*çzF.ã9¼Ûœå  <‚¿o÷#â.M’h1+ Ü4gmÔž»vÅイçÑ» Ð»,©T›Ø²aûy;kÞÓ$É—¹úbB :Ö­M–‡Æ–2ô¯&ïäí)tHB[ 5°•”nJædŽ$…WÝÝ|²6ÞöîJ‚Î]á&¡Ú܆#!Q0o@6ÒÌ [‡úR Ûjb>ïq„KžœÕ͘ÁÂûÜlmÕ*ào» ,âí6ÍaGKQŽ2kKËQÂ!-˜Þl$dëqY5Á/‹èþ‘b)ôaÙ^¶vD0IðO!ŽàµÚ;ò)Š$x"‘éEr óöšK©}ˆÄp”Š&fUö™ýÑØ±ád+žz6÷™ÍfZìRî,„,!õ,•(ø ©ö$ÚŦ Í€öŠ÷Õy°£[¸ã6¦>Kßøê^ í™Oä3-ùŒ¾BÛó:˜.Ü©È7¥ç‘UúhyfÀsVÝZzfô@¨ž™<6Ï7rm$ Û͈À·;Ÿ©Ñ"ó|%ŸiÈ|/D(…(]ìkÎn¡+ZDl}0~w`ð0ă¥;Ÿ©;ÂPw$ùLE®@do%lãÁcWºzîXÒ<…aÚWP÷ù :áMŠ·îÃêØ úRCRÍ"199ùš5Úr´O)wm%ä-÷ eo•JƒCü;¬^)„$ä®—¶k–„DòÖl6ˆˆ\h†N}û’ —îèôg$ùŒ;Ïi0P[”s[Y{ûKg+¯é‡m•Ï ™E À`µšãcm©ç¹|KÞ8-æ’ÛÀ«3‹$ Ì)!pæ¾k„V©>Û°&óÖËÛ°P.®bßvåLºORÖ¦hÅb”…ÊjCÌÙ“Rz/°O´Ü€„á„x抗COhM <ƒÚðÐj˜y˜®—-¹«º_ÛËrc©åÁÓ—¶PüÄ–[_n&¶#gÛúÁ‹F –j?˜¹ËLæîT¸B7ƒèÌ@o·(¨jáêbãj¦ -ËùS$j²n%ý dÎA¢—_†[ ¡´Ç.‹ù÷@Y 4²†@k:üòÝ2Öµ- m¼—øÂÞâ‘ì²`E[¼FhÞ–‘Ìõ]÷”g‘(|Ã9T,”£€K)×3l¥¾bÒÚÜĈw„5Ó‘p èK©ŒõR9×êH‡ø´¡£ß&}X*jR>·W™¨˜FPÊ]x†yÚÝo§³ë!œåÎòJBú[v…aÆ“êª0ZéQEÚTi¬½âyûIAõ>€aÞ‚ÇÈ™e®_²Aoû«AAä(ß¡Ç/\‰ØI×W‡IDºÞ% ,(w_axÈ݇Üý:Ù¯ÅzrÒRáÓƒ©E8áì®…5å8°½oß‚*²n#‘"9°=,_Ž¾à‡±|!©¼Ýl7c]J ×* &4G­ö©Y­o]*ÆœUu_=†RHp”cš·w;˜æÁ4?xLÛj霼 )¢å³„šäg«.ßÿFÏ ³¡4A‡ ùÊ\£ J5OPá_­dþ €#´ é¥BÇ‚4·@Ï˳ÀbÁÁÅ$Z=v½à•h Ê­G˜Ó!·ò¿à–A×ÂæM{IxC±v²õ¢Ô üc),±¥‡@–å58à s– Ö‚ƒA°)d.¦Õ)Qe·ÒkóIÒ´uWVæ‹RYÈÖf¶\‹)wÅSzIô«³f£AÕ=–¹Žñ”0úÔ£Ùê fÖYÒ[çË[Y^Ï4jÌ(ÄÒ‘xØŽdjß/@ÏÚªž9ÏX[AëðuKµ><%²,tƒ¥2Ûê wrzÂÈ‘5ÀÞú‡‘L.y+ôBz/«=|GhV tGáq´® Ãh–¼i&¸Bí‡^­‡!j‹$>'Ø©óÈ0ÙyˆÕ­ÇC6í~Üæ±=]ÚÓ…!‡(x-GMYmÞeKÝqo´Ðdݽ×3d;yõm$ªº’Á‡›ÆÓÍé]wªü•Yusp’‡VÀššÁœÈCÛI‘Rϼ\./áÊí—£w–I¼ ËiÕ½P[¿HÆ$[br„vÝtš9ß‘UVgFþµ:;<Á Ò€ÏÑjù¸Z(ƒ7BÈÖèYèŠ´ç ¡&u-Æ2иöÜ/fÖ¯äÏÔa¨;’|¦"WàÐq鎞±ÀÚHˆ/ä32}m¹67ZÝ¿ÓïÝöG±ãç{?x€©Ú%ÔQÝ ¨Ä%9ç$õ¸:A‘—ÀbNÀpôäYIç^5á&ÏM¹$yÔ=YyimßÝ›EœHD›£µOE—+Ü«/è€6.Òˆ§¼=ĦRgÇf§™$Û’ŒwÀ±Â{lðôóÛÿåì… endstream endobj 7678 0 obj 9309 endobj 7682 0 obj [473 /XYZ 37.5000000 503.750000 0] endobj 7683 0 obj [473 /XYZ 38.2500000 461 0] endobj 7684 0 obj [473 /XYZ 37.5000000 278.750000 0] endobj 7685 0 obj [473 /XYZ 37.5000000 444.500000 0] endobj 7686 0 obj [473 /XYZ 37.5000000 373.250000 0] endobj 7687 0 obj [473 /XYZ 37.5000000 329 0] endobj 7688 0 obj [473 /XYZ 37.5000000 503.750000 0] endobj 7689 0 obj [473 /XYZ 38.2500000 461 0] endobj 7690 0 obj [473 /XYZ 37.5000000 444.500000 0] endobj 7691 0 obj [473 /XYZ 37.5000000 373.250000 0] endobj 7692 0 obj [473 /XYZ 37.5000000 329 0] endobj 7693 0 obj [473 /XYZ 37.5000000 278.750000 0] endobj 7681 0 obj << /Type /Page /Parent 2 0 R /Contents 7694 0 R /Resources 7696 0 R /Annots 7697 0 R /MediaBox [0 0 595 842] >> endobj 7696 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 7697 0 obj [ ] endobj 7694 0 obj << /Length 7695 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯ès·ER/AÏØCÃrr¼Ù,ö"Îò÷£nI3=’>JüºHQ=ò`wfZ#²X,Ö»ŠoÿüùŸÇÿ~|ûøù?ǯÝ÷ÇχìTYûïxþzsý®OÝÏǪ.Ž_¿~>>5ÿÿqh_øüø×æ§ÿõñ/Í¿ÿþæÃŸº?:ÿÁ÷C¥ªæû·Ëw[©æ§ìéûùó_ûÃñ·óˆýt0/“V׿ ÆÌÔ?ý2Õåë÷¯¿Þ¶ð›Åªº(Ë£ÊM~T6×Çÿþëðs3A?|v²¹RU™WÙ-Uú2“ªJÛì<Ýh¢Ë—Ðð/Ë,ÜàÈű¢L©Ü£Knn¥t‹ Ý$y= ÿÖ–á¿@.Ž•~sñè‚›k³¼;Z:¯äQô<|ü[mópƒ_ ÇJ·¹ŽÑO CjÿÁŸÉ¹óF(è,3D¬ª£RE6ž¼È”-³ªÎáÏדëf(£1ÙþÐM܈Å<«Gô¿œßøÖ¿z– ?_ͯ*]ä¶™ þürþ'!¯LV¶¿´à4¿W/çü¤çkŸnz4ÍÕç‚ìÃ÷ËKPÓN=ÚÆ›6K]­Ð<ƒôâóü2kù FûAuýÊ70Ô{¥UžOƒ•=W?åWðè—¿‡FÓŠá¤çßC#i°5ß_|0…¥ë‰GûúË…ùxp0Ì‚ZõÇ‹_o?ª<³GU¿üÜ0åËœí·/0(ŽoΚVÝüöÓñ ûüø§ã—_öTꢱ{òpyòáK³¨àðXÛͪJªÑý€ždïáh9ÍÂwá“XPC2 çyß1Äz Þ \~'û@ì\©ãBM@` v˜Ñô&Šƒ\IB­ªH;Gœ`ß16O+kv–Ǿ©v»óØÇÄÁÎc%y,bhåahV÷SöˆªÊâÏpãëSm³—OºÃ<õ¤eù)7­þùI‰ÞQ-G£)#9†ZµD©ÌÉèZ5à gcÔäe]½˜§€O0vºõ,@WVè†ÅóÔ`óñDñÙ¢LE¤ì¢˜Ä#ªˆ4Væó>) ñ>â½7™ÿ;¦—9ꋃßÚô¸Âç„Áï~ûõDÙÇ:뵈<¢qXk•'»3ŠÃO1º]>_ç ‚e˜*0Ï&p…ù¼bŒ]ê8»UôŽnY©‘EÔ^Ñd &&×·U5èˆ2ÄžŸXƒŠÈ½¬é-¡˜Ò×½nl0WÀRºsƒð%)©ˆ¹éúRþÕè&Ñt:›†.ÊhÔ j†vð)q8¤UDÎUõVg,ΕòibxZ4ZÞ9Wœ+2x=+ Þ±™îÍŒ¬ `d§²Rgÿóp„‡)p´Æò²{'½3Œ#8â00ÞãXÆhøÑp9F‘q&*†cRÄötî‡%6GdÈŠA#›Õjöp:D?nÙ`e°H†1k ÅDŸàõhƃì3OF¡xÅj~‡HõÇ!’q±ãP>eʱÂtLY™Â°1xs@€çÁï`ŠÇçžz‡Š¾ïœ‹[bŽ„ùk|ê÷#Ïϯ£è*›Wòw=©G`ns ÷“±“¡ììÞoô Î@g\ð‡ÔÂ{ßÁ.N*wz.x*¤ã; ÖãÐÓðÙÄ»@$o9t 5ýã¹Ñ­*žj!ˆ”Êî"ø¿ã<NìJ|š0߈J¶ª*o¡$ÌE0™`!3˜Ä'Ìczði5[¤KÛ'VÄ 24–1ºÌ«á}Œw °ÖÎ7b¦ãY­žý ”²]šrxOàϤÿ„,HCÖjÓ'å`O×.³]ŠËÀhÉLEÄÓTô9”Eµ'Ú ë2»<ãäî¼<«úL“]žíòl·é^ìÀ ¬ÁñÓùåøÓ¿.l3‘£æÈ^k l*³î}¤wÞÁw,z§k2‘â©úĨQo§í?éFËOZ 2ø ]—Œ¢o’1"°©]Ђ.×sj¸WŠ¡&æqìB»R¥ûGÏï<"8ÚrÀ]«ïžÉ!6O’lý1£ö(sTÇ NŸn—®ŠSfÍËÑÞÁÑæhÄ«££ÌÆÝq„óšqóu§0)Õƒ°`L€Ž³µ<í|ô§üáŽDLîúÄQ™.Fº&ކÓ*¦!L«ø$ãlv¢i‘bòé1 áy0ÔxܳjyÉ‚ðÒ1eX&Z¸ÇâYU@±YÕ@nîÂù#Õ?x‚Ru-Œ  Bi.*§€ 3p¼Oé’Ë‹ŠH!x9¥]`ÍgÔãOäl¬~Äg­˜)‚($ìœ/WdЀsÐ^ lãH¬ôa¤xÐCx€ÜJK•Uv .)”A—­àtœ²åG8”àÁ-¢h2z9±t†8ÐÅè„=CYD\‡Ê€•zb¥iâJ:9ÿïœÓÊ.ءٺpÇ~0Šš‡’B¼°rŒ ϶[Èà\ßTñoaÒÏ7…½$u•É!cjŒÖ#Ñ.ÛáÈu0àÃÆHÙC]«2V³ŒÕíZ‡ß†ÐÓ·¬C-cNe¬–%"Rk"x“–›T²¸ ºôS¡«Ûfn``üܘàoÐÉ ֪(‡‚•ÑòÝ‘ °»í‘"‡>NE|p‘P¨ Cp+»;k¦äNŠ{4µ¨ì9Ú"”¿Ü2¦´\¬l2LJÑÀ1ïJÖ¯Ò+«K3ô£ õ$FK¡È&AÙ4‰òÊ uü2¼ÿìœßÜ1!f˰û Kh<š¨ëçÀ0ÚïØ¢&lSêŽ/g"aGËU’.àü&"rÄèéL®†Ú±YNÇÄ 7éÁ+2sšaP^[˜mÞ.Ö«K¯ƒm‰fu9NX¤Ã´öpÙˆæOnAvË1š¹¡ˆz$·°= ¦x®–Ç$àæ°ÐG„.î_£ .ïlVÂIì š›<÷Œ¶œt6á椌LX÷îTm™âO;™Ñnòü©éÇ^Ÿn]¸£ ™xÒm|qÒ£‚Ä÷Ä;‚.÷âþX˜S5,úkŸT'3B.~¢!ЫN7·DM1üXuºÙ:]\‚+Qq¨£~¶„£á•FªíÅ(¼Û£‚Ú±ÒB çÁuÔ¸†X} °ƒßÁëÁ¹eeOT‹ž`Å Ò;™q[fþŪ¹ÚKRa)VI*£fá+8Ú(f›NNGÊe2c´Éú;™$y&}‰ ‡+ >ñ 2ÊÉB€Deò1?&.tƒO4¤Ì²Õ@hÉV>ÝäxÙœQÑ›ÀÌñc;æ‰ä}—­;uØù‘Ò³eýJLRW¬›G£*/|4<†‘Pod#Å"bŒb€¢bLFEaí™|W¸OŒxƒ*2œ`‹¡Ñ‡¹È»ÅB$V³ŸôbÙ¶˜ž°1¶zôŠDbi‘¹8=ý¡ÙRÉxƒÖ]`ÁHÕÿ½C0äu]¦ûÕ)ŒÕ8-°næÁd#ŽúH¬¦[ÐSW/¶Ò‡ÀÊöø"iˆ±ºäI4ò –¾Z>‹GR"@˜rš3užDT3&|ãmp½'@×9êà„÷cÌœv?Œ¬˜q¸‡;™Á›bò{ël?‹oŽI…>—Æ¢m¦TºÑÆ£¨NÈ8?\²rÛU\VƒÊí)0år`<.Ϭ¡Ãå¦‘Ê ¦R¦Ü”)…ÅE¿LÉí^Ú»ÕÒÞêÙ‡_Àƒop“ÕÐp­£6Ĉ·„2 L@ÿ’í¨½5<Ú•µL9ãÇX«©³H%—ãâ ¦XZ´ùvÊE†T]¨—l¶–5hè@ Dßk1Úq¸MÖô¯)؈•‚/ëÃõ°µ™Õú±s†§ãÛ@dý2ùðqÛeÆv:QäþE¾P=¨ûß”Y˜bRâ½ëв·YSÇÛ£=.ïéô;¡²Wþ­VîA¼O¢ Åí.¯™=”Üi¦U %Ä}èÛ퉲væJ1ÇýÞwIT×C2JQ‹*bŒ 9V#˜X­¢‡ …û¨D,ܧ„R`Aé’cW¨Œ¤é󅮇æ(ªUP¾3¦v[4%Ó!ùÎà"ªÔv ¢ò–J'"ŸLþ_¬k»„fÙ«¾D‰^–?ßK¯{••}æˆúó×»Šiß ŸrÅãK¢%ç¡NÍÈÍ2Ì(7QÜöE!¿æß@´&èùÜ–¯R6Ÿz9HŒÒ˜tI‰`œ¬œfòÞgSÉ#x‹j–“q˜úm¯D(wýÔ”hW×òìöÊÄé²À¿¬‡'•°Ñ}nÓ]«mÖju2]¾'t¨C…rÒ*6Éjew¹’SV·»û›@¢UFU¶çñ­Œ"®Ä…ø’@|…"®ÖÑð‰l•u!¬XÊ™ë¡ûEŪ–¬MOÈçî½]"mú= ‘—w!qD"õ¡ËNx}·éƒº¶ð“XHY­i†ƒßàd¶åhê^ “š8ܰZ¿ÒH»)U+ÙNJ!åPm‡‚¢“^®‰µIøƒ#wM–r¬¯vK¡HÉä]4#OPv­wSÆRÍ„°-šÃT¤þK8B)yP†0}˜ñn„ÐóC^ WWCI(ë5ÛKnQ¹<.›IºâpSÚUØ{[·¥:¥ßP-‚»ª(iPÇd4鬒ʬ½˜bVÒÝ\£ªz@WÂyJÑ\&­ò†Æ)ŒJ5šO$'(ÚÅtµU= ÐÝ)S)'Ëù #Ï‘$D\k˜´?M´'@‚J•r(‹®MvÈEš{o©à7‘žðúå;P ¢ [×·¹c;\}.rb’¨"ψQYS–Q¬ ªôŒÜM5&¾ 9a¿R´ZÔUKë‹¡,”ÈTÆj…ì Œ)“lÕ‡¸{oŸ)MU²2ÐqU>sŒãKôÖq“Û¿Ç:’T#85KµØÌô „mxì ¦ÞY´Ÿ¥Éˆ½>¢¹ÊŒc7p±p å†.z)—÷­Íx¤”%Ù.Î ×+ÚEÂ/7HÍÐnH}VÜfyoºnÚU¬V• Q'S`)R‰OxN¨^ŽÁ \òL·X.ÒÎ/êë O°ì„õŽªóŒ©æëø£A‰cŸæþ`áÖ“9ñž©³cè¨óî¹lõj‚’Úð—žÈV@8ínxÒ§Î1u…S5Ccó˜9#p ¶ÝJǹï8ÿ¿ÓɆœ«båxÝÁÃÑO,‘&–¡ðhðŽ)(¯¥_ÅÁX‚;ÿÜ@Üo4ÄÆW#CèJ¼HÀôøn?+Ø#å5O§ä{ịñL'>:Žy Ԕɗü).½Ëšªd%<1> endobj 7705 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F8 8 0 R /F9 9 0 R /F1700 1700 0 R >> /XObject << >> >> endobj 7706 0 obj [ ] endobj 7703 0 obj << /Length 7704 0 R /Filter /FlateDecode >> stream xœí]KÜÆ¾ï¯˜sؾ€ €VZÈ!€ 99vœÀŒ(>äï‡;lr†¯9ü¦ºÙ3¢…D»¤È®®ª®wßüùÓ?ÿúýðæÝ§ÿ~r¿ûô”Ë};|{úøô±ùÿoOíŸÞýµùé}øKó¿_?þ½¹ø³ûG¯ÿàëS©Êæï/§¿ëR5?eý߯×ÿýô·?~{}c·œføû¶Ètn_ÁXXúÛS·MuúóûO¿=½i°n•ZgyV”5ö j«ÿýçÓ/ÍÝë³cU¸ÿàÏäâö´zfÔ—åA©<›.žgª.²²²ðçËÅuó~mê† íOq Øf““+Ý/§‡¾ô¿Òë— TÙ@\7+Ÿ‡@ô,eLÞ-qɘb¸ðÌ…ü áü›ÆÐÝ€¢vy´ÌÅuQIñõte7né)%o¢–ê7y"Òů|ûºjÑ-8¾ÑýÁ‹n¤‘>èÂ^pÎùÕºÈÝš—?Ù ¢éáïapÓ.>^«ù]ë_/oÌ¡ÄK1!”èFòRœq1pp½<=ùeüªÛY¦¢CxÊr´îÌGÆÓÁs¹n¿Ú‰{Ä1÷!Ã,ã¥(<$”BSy!×ëÑâîByùÈðª›ÙÈ4†ÀžæÂ;sZz¶?ÆÏ`ù~Ñ[ÆÎˆ&¦ZÆÒŒ y‡p…µ¹TQÛlÎh “+¯œ9ÑüpA€¢£Àøº>=ñ¥{TÌÚ*í%üþ^»õ.ºä‘Ùgo¶¯z|¸eÁ*×%ñ1‹ö¯—×çðâ 4:ÑyçNt^«Óâ?õ`œù^u³Ä+25 Vsh†ÀÌ\PÐéáï‘æ€Ñ £Ìêëé§e, ê©,„Ÿ"3cĘárã g@ÍCí…¹©4ó–{iòáò3†Šmð{(l9(ôdõØ£åŸe¼8HÆ”ÂHiŠ1FŠ!ÿŒ/œY¯í…[ùÇŽÌøæÂüòøº£¨4ê§h²C£þ¼l´ ©àg-^Z¸ÆÂU[¥Ê–Ù-QµR7F–Îj}Pº~]®šXY§?2¯W^^é:ÜËO‹cE™B;ýãš·`P¼ÙožŸ??½ù lÖ`´8|þ¥î´fû×çÆ$Ï?¼FaÓüóχ?f™ùð§Ãç_Ÿêc¡óÄöNöÞyFwT‰îhøL!P¼cáÛ4¼óï¼#îÀ·é·§;/ŸfNǼ^¤£yŽOYuz 1WCªV§ðÌ=˜ã0—2g0Àý`.Űa¼áó˜á·)ˆ7_Š×»-1®ðî0'a cÉa)@ð²‡ö„Œô`Ë;,#!Ôbctûý`Ø4>„1PnøŒ‡e¹ ¯Ãh^GBbÁÏDÔZEã.òòöÔ‚ë˜:"®Js®<ßÒ—‘IjaYÁÈ›! ` ÆvI,‰ »Ó>ƒïܱLj<ËÎ#Ƕ˜“n¡‚}% µ£ûE­Kx–‘5øNDÝT*uÿ›÷!µõ~R¯8A9†Bß–<ÿÕ¼X•‹r1&<•ÎáÁœ©qÜ s&”Ÿž(öF±å‡Ï-q:) ã`÷Õ¿#_=uë·²v÷ȯÅUq‹GžåëOç¤âh<Î A¶f"ÉJ&åi_Ýâ%bjFJ3ÏàœÖ X'cIäñ‚d×Á&+ó!ÿc> $)^Û wÒ°ÌëìÏÒ#±ì=g í¿‰yŒ²ÿñi",i,!O[Xâ3YV,7àN5¶Ë±ç†#y¢±‹”ý&ÊÊOCÞê+0¿g™î4ËÄH¡=—tÃi2·D›cY<±r÷é§xê°í€5Ö›ŒÏe'Öö„ýä±b7§OÊ~$õÂõwêGŠÆv=VRöS^-î.Lh]–ñWU™êsL{Ýi>Ì^wêÅΞË®;•“Å4¦Ò]Û×Iàä˜sŠUeÇ¢TU™_l¤Eeu¬êìñ˜”=êÓ#3ÆlYäÃg*íÑšvÕýsëÔèçæ)uÌm1€º7£¦dzÝá7žx~&I°ªÅ°moX.£m¥ú&†ö“~WÌÅÌ$ “K˜ÿqÈ"'Âb v’ `#pÃu2òi§B^g§B4*X¬eà~,¢ŠÞÁPcù†C²T˜< £o“•\Û߉%¶¿sŸ'pq§qø?ïÊ15ÓTFœû”ý!ÿcM‡! 4Áyá²!B  ¨Êjê9×ʼnÅõÙ‰lջʎmÇRËsRE…¼«1˜ [Ü¢”#sÀãnÐ9ÄsœÂ(p¬- 1é ¢Òj…ÉçQgãÓéÑ£âß¹;«¬BÓùÓ“ ²ÇŠÑH÷²ÇCÄ&›¾•1w $ë†ã”\ªL•#¨\á†éÈ5ôeH,ÊnÆBëz•.ë » ÌÁ‡;˜ˆŒ`Ð…õš‡‡0mDzñT?žÑ^•NPÑ&žCO@à‘ÄÓÂ(6ú¿^oºÃ!Îv6Hˆ1WŽ~£%+ÀwÇ¢qR!fÄ.F­òi\›1ûAb°”Á˜d¢,°JÅšqîÖXÙ„¢ñðÆyXaΰ·‡ dÙ‰£J$*dˆÑEÏÇÜŒ©Á>bÙB‘áµåë”æ‘¶d8o û¨P&a6¥’e¢'ÔÃ$6Ûa‹qŽÜ:‡fÚüŸñ‡„#L ðœóŸ´Æ<_¯Ï ÁÖˆá„1+X¹/I“k…­·"V¶gkƒss|…ªTUŒCŒ9tOÉRÙh¾°Â¾'±e ÷ú H‘´óçîRµ1Ù(LoO4Q4t+Óá¼×ó/•Ø™‰b&Š”oÇG"'c-郀ΔJ@Âyž!¢+kÊɘòVÈqžê<ŒPÂÿËÞÂ;¢å¯K¢X¸þ4VPZ2|'k!š!2Lô•"åêÈã;¸Òˆ˜ f.ÁPKV…iI&b²" Ge]®W/žß¼nÍc*â„æ4l^2ŠGô0{Þ&u‹ÕFAÙ°ª˜L[&Û·Yã\…+1<]‹%¥»[gÉñ²^ràöáR5â芄²¦HI4!We*°°)B«M=3ç 2Ö“,e+LÈþziìi"Z¢¦R’ÈàcYˆH¬Øçy Ó´¹wÓãçvónðäRЊMCÅuåή³z¦Ü–iÜeœQÁDÕG¯ˆ‡mìäD`áR/²ðbIC îát³çV±°G³1ÍR².²ö:ÖQLà (ÃVgPúÛøL “r¬×(T´æÿñëb%Ä£hš}Ýj,×·ÖaL¶ü¶Ðüáùð¹~Gݺ›Vç)*œ@‡ÛhÊë/áG´z¼à°å¬3YþH‰f&Z´ý$ìjÞGϹ{Ý<5äîÍ<ã&­ÍÉal“ãb¥$e«½˜¼½G„(ò)ðËj,Ù–‚eëd„lz‡Ñ¢›ûf{Ýâm–X ¹«jõú*9*4Üøq6¡UÝ¡ˆªüŽC#±J¨©$æ(‰4 ¥|î77(RÝas;I NÔ Ü%<^V´\ñÑæößU³M<+«ê>ÐÎXYøNþ|¦#’„Η†×Ű{–øžmÄë»1.¨9é÷I6.°Ž6ŽÑ…”÷j|º©|ã LD§h5Ã.a´¹—í[A"I‰—0³Ê©Ó#1 HòSëdüö›™| YA ¯"––Žä½D˜›RÙ‘6K¹â˜©Ê¥¦•ˆNÙñôBHœÍ>“ƒíhŠê‘Æ­ùì áªÈZ*“[d?¤€°„ÂGarÕ‹ ܤ‚#*¢ƒ©‹Û‡£¡PwãV´ú2%£±ZÄRùÒó €ëõX£lc1·H»yÊ<Øïz´ƒH`iËÏ«Z[Ï}ʺ ·ÊÆBÍÏ˸ޱ"sÂeŒ¢Á j3œ°"\ ò`ë£2E'c¦<†nûoôݵaPS×ÕØsÜMN®í™÷±b>±ŽR‚ñî2 þhòŸ²Qp*!’¶_3¯`)#ÈrŽ\=û$øÍßðšY»á/T@2šxÝêÉÑÊØAsácÕm#Q^ôvØ5"¾ÇkL¯ìçÒ·kfKp¶„h"õAZζ·ëRTË~Pi»¡V)Ç‘˜ÞMn™.¨ò‘>ó(q†"Œ=¼¢ª+’èöœjâã ±Ší([ýúÁ2E>±FMä3»[4±€Gª{ EÆŸ*õÔÀ×{â/LmtE˜ÏV²¯ Î y0§/B¨Þ}ãïBK¦ðœjæ—۳餖oó‰6›™Örq żÚjì"ë9«Læra«žYôp=úqæ™®kêÌ™ë‰1è^Ç`Ø ®—bžŸ;ºÏ67ñ¼8ê¶2õ¨=§.ƒë¼¬ÇŽÂ±*¸S¼M_ µ†w<4}A¼c+Ò½Ív:æ!® È×BëE -l¹x”¨©„ÃI%`˜€î@;©Tí"ÑÓáY'½/Ã2¦ûá¿@ÍìƒGwŽª|ý~ÖÌ^YÑJ.Š‹hQËôÒL=*¡yÎeÃpinò‘Æ‹&/e?¾°}Ö… üô£Çï±[‚‡9A»€ª¿al#–±³¿&ðÍ4e £q¾¾ÎÞfŒ[¦}÷N\2IÓerY]:;Šƒ^G¬û®sÙuïmøÍÏx¼ÀXã&ΘH+%>qDý“ç³ká?üîbeE±¬‰ñ ²©éí=Ê3ÄÁÑ*¬”Z¶,F– ÔcÌüÍÚÇ {R‘wz ÜÙI>S€°Â¨ðìŠÊaYæ…ÿ•µ"⹘»Jý2‘Ks£ÃVÀˆUàƒº{ X"™AzJªÏ¢h±æ·m6¡Þã4`]5.@ö–Þ`&Ó3Ã8¸xö⊹ØÌL]‚,T,*¬ša¤UÚ‰¤e{ãSŽˆŽZŠ N% ÒÅkþGDŽ=•„ÊÃõßÂ!.L`,ÇzŒ²REeCŒ"ÏüxBPkê”Y)€”J¦Œ +~œE@¥²þüQ‹EÛŒÜîN`öðÞyFwT‰îhøL!pø»c×?£á3Ù Cï'…‹|‘Âæ9"ÓB­²c5®,yFÏ8ÚÏìÆ÷#‹ü6ä_›éÌ]`ñ>pñ¦sÈU|[!ºS¸ ›‡j¸±X­¿ôRgæŠ6e&¿´¢ò5V*ŠÈ¯xŠc¨™hYÑÕBU9Ä{)i);î“ú„0“ÞÛß;iÔOf¶ñ½g2CO-fr’ã׋|Üuq8^H­Vç#µF¬2pûùË:+õБ›k1~ õ(2+Úù&Jn©mMp¾b¾#QëEÍ‚ý†ðçÈ6Nºâ£“TÙžDìšÆåtÑo¶ÝÕðU±—@5øù"Y>Ro÷=Ç#èd§¬v.S>'‘…ë¯gQ¦­·ÿ<<Îq?Óê€;öCä1\c™NŠÇM"’©‘r Üjˆ)ïò»BaNæËÉTûK„ÒsO¸lm›fëÄÀYFœçÄyz˜Ô¸ú×àêk˜OµLmÎÁâ,0ÎÁæðÄ'ŽqMTô(\•ÁԟĨðï8ÖÚEšÜé\Û‹kÐà9®=‚Ï0ÕOžª$\CÏT[ç™Ù§Æ ŸZLBxªŸˆêTÍ#žôJ§s6EïÄâr\md±ÜÀÕS¸ªC-z2dë÷“žÊIo܈¡“¸Î[²KÖé&óžzoLÌ /cý£¦´££©ï›Ž¸Ã&á*Ðä¹"¯ná ¦.WþcéIèqM¬ãáK¼ÂÛ{P¼…è~È¡Å@LGK"§¶ì+Y˜>?ÂóbN îÊy4)ï±áðÙÄçž *Ö *!±w´ý~<]S&¦¥£·;éu?¿†é®bô&Ž2~)ö¦ñyfú±žP3E°'éé_Âû€ºÉ¨|‘“v‘ݷΈÃI¦Ë&PZ‡èœ\졳ïÜ,ÒÁb{—ÁÕ]ö{$.^‡ˆcàu°Ä¶ Œ>Lh;äž¹~ÿîr¦Ç±Åœž™ÏØb»˜Þq³#õtv¤;AsÝœïÑ:fiTÌlÜN'½Óþ.Ž›Vv)ƒÀ*·õÉØÆß§ÃÃ3ÛPømðײ¨Vm½<³-Ëp¯?7w„†¸Ó°³€zYϦÃ÷tÜf ߆ñ ×qæÅ*|;3ÞøèxÖP;!j¯ù§øõp뺛Šf·Ú+8Ÿ% ’ÁBé=<øXXàCœY½@±X`ŒâËÚö—™9:08ÍPlkø=ÎË E-÷ñðñéÿà¼7• endstream endobj 7704 0 obj 5735 endobj 7708 0 obj [475 /XYZ 37.5000000 323 0] endobj 7709 0 obj [475 /XYZ 37.5000000 635 0] endobj 7710 0 obj [475 /XYZ 38.2500000 159.500000 0] endobj 7711 0 obj [475 /XYZ 37.5000000 143 0] endobj 7712 0 obj [475 /XYZ 37.5000000 445.250000 0] endobj 7713 0 obj [475 /XYZ 37.5000000 323 0] endobj 7714 0 obj [475 /XYZ 37.5000000 635 0] endobj 7715 0 obj [475 /XYZ 38.2500000 159.500000 0] endobj 7716 0 obj [475 /XYZ 37.5000000 143 0] endobj 7717 0 obj [475 /XYZ 37.5000000 445.250000 0] endobj 7707 0 obj << /Type /Page /Parent 2 0 R /Contents 7718 0 R /Resources 7720 0 R /Annots 7721 0 R /MediaBox [0 0 595 842] >> endobj 7720 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F8 8 0 R /F9 9 0 R >> /XObject << >> >> endobj 7721 0 obj [ ] endobj 7718 0 obj << /Length 7719 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯Ð9€ÛâC/`ÀöØr0ð99Þ8Áb½ˆ³‡üýhZ”º[ÒWj}¢(u›6v§Ý‘ÅzW±Xzû§ÏÿHþõ{òöÃçÿ$_ÜÏŸé±ÈÒæOòú÷Íåº<ºÏIQfÉ—o‡ïÉ÷Ãóá¹þÿ÷CóÀç©?ý/ÑÉŸëÿ~Iþö÷úËŸÝ/½þ·C¡Šú篧ŸU¡êOi÷óõûþú‡ä·×Ûå0×ÿ~cs¥õ Œ‰¥¿ÚmªÓßß¿üvxÛ `Þ*•Ö6KeMTeuòß¾Ö ´Ó§ÇÊ*Uä¶H—,TèוÒJ'JW5®M9Xèô×Ïôj…ÉK]­7ù rïXQ&WòìÇ2wàgrm{b­J物ÊĦÕpí,UUž¥…Ÿ/×Öµ°Ö;øæ>¸ukÙÒªûGïûêôÄ¯í£¯bøõb}UèÌVõbðóõú¦°µ˜œà¨?\¯7öÅ €«gû€ðˆ¸^¯¿ÊÅ>1Šïo—ßOãÅÁH· ¼‹MW—à¿· ÅùÓŒêб©RO':KÇÁÊT˜áétúúßk#­FXeŽPßšOÓXº¨¥²/üdºÝ[®÷ÅPÝÃP¶XèZ´Æ¹ÉÚZF¾¸&äÕ¿×–ƒBV_;×Ähøg/-$=J^CâÏ+2¦ÊÏB׿ֻoqž~ÇÅ䵇±Úä'ȽcÅyEÂì>‰[hÓ ÈŒøÖËQÔM¿þmšÛõˆ{‚Ü;VZââÙ=×êÊq¿VÙ øï¦_ƒ¸Yš­7ù rïXqÄÎþ®µžÿŒy7?¦œ¿Óã­ÁõÇ—ZˆVçÿÒ´«â}cüüåLÆ\®1æ1µ0˜öXf Ôb™1)Á±Ò”:…8Ö!8Ä`ìTá$#Ku´ Ñ2ü°–!Ó*Z†hnƒŽ<¤e°Ó-C-ãZ†¬ l2ÈIóXŸÁXÜ»æ)ʨy¢æY¨y/B€c?A'áu½8– #ÏUqß>6¤° › —c_jyiÏð˜ 3Xszðýåüu4Z­hµY­ûõ—s“EyÍ“ÅÓ½¨y–jžGó—û2a$½XrŽ©°Á#ŒF!4)ÃåÒQ€ ó2Äå±ï8jÁôÁn¬U1_^@…1œHh;f?ŒEÆ>Š Ûж9¾£Ÿ*= ©×A—ûµMX?a C™Áët„³6BÛùÕƒŒ_ÏØ¿¶À/WáhdZuÇž¢ÃNmW(5‰«{}yÞEôZ˜Eþi@ëVØöDpA.> ¤y¹R熴lÏBå.p]Œ o ¤0y~*¢Ÿò²ƒP«LÛ·òõ–`Im›%ónÉÆ*e•ž°pFh…F\ÊÇ­i®ÞŸQý4ÿ™4÷ºNŸiQ©cfó²<ï´5Æ=tóŽ3'cÏh´©€G0lî`K¥Ç¼PW° qÊNÙ£>M6"ŒEžõfƒ8p®¸æGòfÓóW¼9­5BªtjÓÙÑèR]Àgl³isL›e^_Ù7h³x?3œ>sd}HT“ Q¦ÝØyÄ@Ö(Ñlþ0°˜ßõ¶!ÈËæÛP)|ævj8Õ7,V—$Óª±8 Ü ×ÁèiçSÝe!ÎèÂÉ‹€eÍôJÊCÙ ƒû‚T7˜u &ÕóÈ3îÄäŒëÍ9…އ.åk[åk>!¦t2<Æ”Ø#06Û8lU9ØÃÐ…ÅÇoØUÆGi8T#Žì„$Ñ”K¿¦†c¿&DˆÚ£ۣ`|@Ä$\ð)¦ªhAî¡Ò0px‡é8¡LF G- l8½†gcÂ]œš‚Qîˆ* —ÛécÐÈåÇú½„“LÂ:˜—™´üýòrÞ™ ä) <¥Z ÌAsañU,|Ð5»¤_z)*]¢¡„”¶_j…H¬¶QÕ$…¢4ø–œTuÌKÙbšBoH¸pK\ h m*³b{P[бSG±at)'!ö°Fú<ÉðzÇ0üÂÜ`É °#”Ê28 ô ¶9{Þ)£QR¼ÎŽ÷³]““îY×`š…møl…‰"Ú t,º<2̇„G+;‰Ó]G©°Í‰ç¶-°”xûÌÌ>bQmÚ\bŒEF²%EÜ‘ç}Gœ{޶ü–S—Ù£º{/PK ¥·÷™Á´ßüúÕö9,ì#3’ jâjåN䬺!¢Ù³œÖ^€Íë•Åt4iwÑ @´%`sVÞ÷Y€ ¡f £;vCõ‰óJŒ „`ãgR´Ž†#`i[×Å`8küÌ#zOÞ­0V/º]D¨N|ãÆ`ç¼à.¬D¿‹™Ð?ƒR|tŠgËpˆ‹1ŠÃU\ÜžââC.Ád‘å¬Ù¨¾xE:­lÚ%÷é¢l¦Ázë‰b¦P:d\bâX '1„29\Ît$x°î`?X¶qÐø†¹ç{ñ›Sé#Xq¦hÊ+å„^DL ^ö¹&ƽS-a|œ¼=ª>çãl/ÏBC¯’¾½¾ÝÞ_a´Cä»à0úö|53êÛ¨o겚³fˈ’o¿8`âÊ[ÆR‚×ÁÏGº×Ô~ˆ LÜ=óÑÚ…éÑ(t²Ærê·ã#ѯšºÌO\²:ØãîØf1vޱY^ñ†eîá|©°9¦ þWvnÝý/Îÿйµ`¹µ ëh¿]©!'bÙó¹«pù` "¨³Ú©~Êa4q×´&jbRã21âÌ‘á$á½"D Fµç!¼>ìãS}Ëoat@×Ò'ꀘ 9sž)HSpŽ¡&.…ò£Œ@€=c4F ?RÄý篜۶E%ú+älžcv¾ò!ŒÌt­£ÌD™¹™ "yšFɸsÉrpØ×$šK0ÕTÌÁ4å`öñ¶ýÉÓö'ð±ZèGªÊB¼º µ9‹ZÎî™_]ãWž™&wY±±}½Ñ}f$Bá`{Ê1•Áø`Ï^Ó¾·‘d²€!m΢Öÿ¸²ðárиâ>yYÐB‚/’šh±“WXÜe‹áÜöŽýpø~ÏÀÍ]Kíj7ÖpÀ##nÙQî±=ÍÆÅKcÏTèW}[»ò}Ös·ïÆ`kX¢8šA Œ¸`"?¥{„ß©ðÊ7BwêlöØNsøŒ†PCšâŒå-2”/ÙZU×ìºá%[­:^ç|_W}‡<|ÁÔ1XÞÞ±kJ/Ù+|‘C€wŠ÷“Âu lêh¤»Ð3!ð¶íÕà‰ô‹VEOâg¹ÁعÁFzà¸2Ö/|»ÇL…Ì“©(açƒ_e|å%1~ì`çÂ$™¨xÜk€èÎôG’!C¢ãmÀì)•V¸=fÂh†ÍC$­æäU±c(t-£W´e™ pÎÆÌÙÜYñž#b^¿]¿ZQ©[DŒ´Ý®Ÿýær™(ßùm#jÒ´ž–d†á³SÌCVCNñá*¹ f^&Å)ƒ:Ã’C~¨>À‘  ‡˜&û÷ìÌ×@¹R!Á6ÃMdü}¯FßÏ6V7…UUöãº@J‘‘:¬.1Á©Ð˽Ȅ%êTC@D…8§%ðºßT€WëOùÀŒ¯}»“/€´yHJoBO\ÀýŒ‹‰$×Î.˜Ep¤‚G|Ä#») Y‘J«!†•c˜?}ø¢Bèã#tžSŸ' s&‹8sÒ¦3Rkj&=‹ Ö8úسëÍe‡O­ Û–µåEÞ³!L²ó+uˉádÂwgœªáýP‡Õ·Ÿb¹ë«A®GÝ6&0Ä[+…+Ûø:-¾0J46×1B“J¢ÍÕ@ã€h)/ã†V¸ˆÐËäËîÝéÂK0¦FNÖ“ï5H"ÄÏS¿pƒ‚.Ƕcjý˜ª×³î¤“´×»6¼TŒ(‰†*V›ŽÔ¡š'÷L>(¹WP§>¡uÌ”†ƒí“Ûé°ª¿rÇÕ®öM6ýùpƒNôƦÇo(²h ÏŸqú^ÍÚúÛ² ÷ú¹†¸%4ĆÕ˜\ùò,0-¾›ï‡Šçüf­ÓÞ_˜ƒo—@aO,:Â:jw„doùU<=ܺ+»«DÈ^ÊÉ`¥ô„0+( ,1„Ì <ôªÅ’Ð}_õ±B\¤æè À•4Cµ­ßÁ‘‹77LZ¹çäùð¹í¾ endstream endobj 7719 0 obj 4107 endobj 7723 0 obj [476 /XYZ 37.5000000 152.750000 0] endobj 7724 0 obj [476 /XYZ 37.5000000 114.500000 0] endobj 7725 0 obj [476 /XYZ 37.5000000 114.500000 0] endobj 7726 0 obj [476 /XYZ 37.5000000 77 0] endobj 7727 0 obj [476 /XYZ 37.5000000 734.750000 0] endobj 7728 0 obj [476 /XYZ 37.5000000 649.250000 0] endobj 7729 0 obj [476 /XYZ 37.5000000 353.750000 0] endobj 7730 0 obj [476 /XYZ 37.5000000 77 0] endobj 7731 0 obj [476 /XYZ 37.5000000 734.750000 0] endobj 7732 0 obj [476 /XYZ 37.5000000 197 0] endobj 7733 0 obj [476 /XYZ 37.5000000 649.250000 0] endobj 7734 0 obj [476 /XYZ 37.5000000 353.750000 0] endobj 7735 0 obj [476 /XYZ 37.5000000 152.750000 0] endobj 7736 0 obj [476 /XYZ 37.5000000 197 0] endobj 7722 0 obj << /Type /Page /Parent 2 0 R /Contents 7737 0 R /Resources 7739 0 R /Annots 7740 0 R /MediaBox [0 0 595 842] >> endobj 7739 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F8 8 0 R /F9 9 0 R >> /XObject << >> >> endobj 7740 0 obj [ ] endobj 7737 0 obj << /Length 7738 0 R /Filter /FlateDecode >> stream xœí]ËŽäFvÝ×WäÚ€JŒà0èîê6à…A¼xah¬1ÒÀíYø÷•IVey.'o<È¢„™.›Œˆ÷ýüñ_~þÏÓ_ÿqúñËÏÿsúuøóËÏOÅs[×N¯ÿþpû Û=?ŸÚ®>ýúÇÓ÷Ó÷§Ÿž~:ÿÿ÷§ë ?ù·óOÿw²§=ÿïo§?ÿÇù—þÒë_øã©5íùÏß/ö­9ÿT¼ýùúûÿ~ú÷:ýýõ‹ãrÃfîÿû‡ª±¦o^·±°ô÷§ñ˜æòï?~ýûÓWø­ÒÛªìíÉTeu2}eOÿû_O¿?_<÷•1mSµÅ# µöu%ÛŸ?aû3ØM=Yèò¯ÎçM€×Eîã—«CÅ”‘¿þÜ5Ã?ðgríê‚Zm_Ÿš¾<ÕsˆUç¿[´]¾]Ûž±¦0Ãrg’»ü·=ÓVyÞäÛOãó›¿ú»óê+5þv³ ÓÚºêÏkŸï·ñÆ0ªóÝ]öqþáýã7›~ÙÕÝ—Üm= »Õ'‹Ýü"¬Æ›ùãò“/”î¶ñ~É]ž¹9tù ¦»_Ü.W½oãî÷õåÍßÝO=x{öL•³S9ëÎüâu#vø!`n×}[íõ}@ÌÃý»ß/Ãå² t…Z`2õ µÝþ¾q~Qß¾ò;øÔÃhtÓ³Ûª.ÊÈë.n*î.öî¿ƒéº wÑ v’s5w¸5¥»…'÷z¿=U©nL7¨e©¯pÜ|>ÀÇÏêu¸_v®•AUš~ý'Ÿ¯à­ˆêüwáÅÏ¿<ýøÍTE:ãÛ/¿7wYóúÇ/g Ô§ΊVUœŸþåôÏç-Õ:ýò·§þ¹±õ¸Å¥'¦BO*øÄ~†ë|ëtþ;(à:Ô×,|bà×ÿuL ×é ¸ÁXü5|Rææ0à|ƒO¾Â'ðNñáðIUa€Ï#¼ƒOZªâ|"@¾ƒ×Ù&†;€». MNÁp$‡`è\wðõ—³H .l= Âc†¢€Š”œ‚;(!mVŸ>Š,À'-câXUm€¿PS\§üòM¹|nÌï05,=‰sºÎŽ0}ÐîµöÓÍØê²™W¿éÐ+*wÏ]_\öã’ýÌ“lÕsU^#ï×óâÿŽ­T×éÑ;*;>zò ~ BÇ\ÙXólMwÿ5áI Ï3²¶©uð;zÇÂ't®ë˜ò¹´9¿´WE¢_¹ùš;ø OŠa€1ž‡ƒ;ƒ8›ƒŽ…»¾žÔT#ЏBX nTWðÆì°™â¹i/»q¥ûÜ®ÀíVœu€öÜG:ç#Âz_ÐÅ Úç[ÁHC¬cˆ°0ˆÆ—Cù\WÍ=Fà-áwÌkáÞÿN ¿ÆíÀ»†RE8¾UÔè†oâu„;ÅëL( oö*PÏî²¾þ¹œˆMø„ºJ !@ǃÆ1UbìZOx\všã”j¯úì½X¨ó&ìë¡,`8fð–jx3ý ’¯[P¤¼ÄÌ(øžð1ð Â…+¨2·N‘\gЖ»`ŽßÆ!|t†ê#Þñ5Í<8j¬ÂkÁdJ±ƒœUñ}0¤ðB±ï][¹"JñÄ—÷険ºÌ–:)6›°™ɘÐ%®C?P¨ê^…º¤p·„'H ôh]ú+T%ã'À×_†f÷ƒg¯)ÌhyWðVMí^+†ÆØÊÂh½f¤k\1ÒVw©AF`§2¦aÞãg$Ô–!½Fü RÐ&i+0 |•„L¥ôfU c’zA´cåÓ âaÄ…äÿBA]Õ®dÇ#8Ç çᜠ˜9!¬¿&d¾çö†w3`Jœ™Eäï.fLTZÓ¹ –*ÁY•èæñ“Ïc—8¡Ëû•LÀu²ûTNÅÐ6r`ï6¡þìÅþQu)–0ƒÞ1®ð¦RQ·«m¥llG?òf<öü"‡@û]³@pñÆÄrÀÇä‹å´"4a‚uYÂ\—Š–íÖX³Œ‚Ø’#X¦€¶ŒT"¬æÃþäXl2'Zœü€€Äf›Ö¥6Âå£R`bžˆGÂf‚[§rÆU>E7“Œ³Ýý˜á8¤ÖÑÍëÝ’Y8.²Eã;¤W®êÙ˜q¢M¬à E©ŸT“(TõФ󗩪*Êð͘óP&Æb"ö+ùL7m0£/]鿵l[TŽ; mÑòé±È[bWÕC˜0\8¼ðmµŒÛTÑéáýo–Õ•¢æ ˜2š#þ1]$ K*ëÞáI¡5ÿõ9øÎ„Ä­-ˆ ¹P#oëû©PG*Ô4 aJ[tse£‡*Ö›)Éœ;Iì¤ÜôG¤×ÂÁ%lÕô.ýççÉˆÖ D¥sÄÍ<œ ²É½þ¬·„¸>¹Y@UL,¼(~ÑS¨"%SMî)ÄÙ? ­\ckKù¡:u LÕv~|:JüÄW)•O¸¿¡nòàœõ° š 2Ý>ˆ4ˆÉ‰õ<[Kn­þÍP¹Ÿ©Ÿ‹¾¼wÀ1Š6ÃÅ"u Qˆm&——O´Z·’dË=¶!¨«fø|ñH“ÈŒ3`T4éŒ ºªB ˆv~¥Ô¡ô€ò§1®üÙ—ƒØOÕ¨«¥d‘Qª›×­‡¤ræ53®ÅÀ/ƒçTŒ-ƒ†ºøÖ™ÄoU_ýG®®ˆPèßõŽÈË e.#tåe²,f/SIÀÔ𮂔öF,ŸKØÑüemù¶‡Oð¬ª}W©" ºÄò“†4Wíd@Yîðž°çC·î10ˆ÷Öm=GHà²ÿæÖ'³Áú [ ø@ð,¤ìê­#¼r «gl'%SDS”ò×èRAœ>†Ñºý|8=+t‡•D¶Xsª>€€èMï ˆ!`Zâ–#ºº¨WbÛ cZX%LØ’»{Êz +zatÛ¾-¹ÍaÐp×x ï`‡ÎåáÁÁWÊŸìŒG$Ü£íœj‡G$ãàÑÅ5<)ÙÂhiâJ8{¸djàXek!Dˆ!ßB“_YÏ—5¯Î¬ÎÔË×ü‚/‚E¸2Hl1fWKõŸ×Vø]]»Är9ÀŒ^ãWI‰«/+ø¤€;À•¡¸*òSD(¶U>P„±ðâ+|òâžðI£ÜIoì= ÎítéIœÖ«!‡«½p¿ÃTZcìÁø;P'ƒ=^ÕÙBÕ4\G |‚R Â÷ìCT¨ _ƒÁÑWÂ3Ü c/Æ7¢V­â~whúežOÜ–Ex[51÷˜“½biq°¢ëÀŠXO*Hu&anÅt(ïM {,gâÝýyå6›Ö}Rb‰˜3K.6ËÇêÂ6Ù`ßÞž”˜Ãa¼ÄZ1Æ$¬¶I…{0a¾Œ¡ƒOªJµÂ-@¸ çan.Òy*æošøk"]DŽÒ•ÙPàñDô!à'c—pÌ—‰èŠÀ;ñ×ößICQÖ; V2Ãb¼@YX“Çô³$?¢ðhSØÅÓOŠ¢Æ]» «ç€–3:áÍbø–FC:™Ö®!Wµ˜ñÍ'Í9Ö#`/sÛDÿxÊ«¹7Á‰à]ïa¬¤„®äWµ§*!¢ÔŒn(xÑáý`šÃÚÂð$ŽÜ}nuH0Îf!ìÌ;~ s/)Údfb0úmú ’ä±__žÄ¡ôzÌRÊ<Û²6ý˜=qd[r0Xô¥F¹GkÊ8¦}øiG+p¬Œ1Ž„—‚¶ oKuKµ qn«ŽÛô¶½ñüMfØ ÞøÄâ;…ü¿S2ÞaÝ`è{Ó…[¥ 7ìQËnº»Ž„oÜõ¢ç?‰#%ÚØñÚBQàOŒ4ÊÂ,Íèó‰e_QþÝu°eËÄ&ò×ç´4„Hþá¤8ưJß›¦ÈH ,Mt%]‰+B6lj厞uÙŒbézC©|¤BO”e •šªŽ~Á»÷2ŽŒéªÛô …ià‡w€á«UCPJcM7«®€¬Çö9ÂfÃ4ý6¾fÝ;"CÀÅÓ~'}þbÍTŽ$§Î¤ÛœbJ?Ì€UåÒI3åT°] Ê Ù’´vÍ3fP¹ÐˆšM4†à^xGÿä@ `íFGí›`:ÍVݸ…n/he»PíÀtïA×ÂF ãâò¨fB•t)ÕZA•ô+¿”ð*SÙ^9Ëød¤‡r±)H#™éÁS\€Þå¦PÉ$žÄªD­ª±8㮢èyK†L²xbÎCFÉUQTšA`§û$±É£ ˜Ñ<"…¾³–Ç*q‚ÀõLªÕ ±±lܺ¨A¸a•®€óÖ®¯ŠÔ×RIÚxÏöm¼.ÈθêqSõÌT )V:&P"j‰¡BÒ~Œó˜ÊóYßX,t“H|.&Dµæ]uÕó*oPnO–aš¡n´FWƒ ¥8!u­©pÄ # 婤 UŸ£ª ¬•躰…–Âmèºzto=²ÐÒ-§«bLljûÆ!p¼¹+Ü5‡á$ZI L~±Š´ß zyAiñžB¶õ-Kk(á™öŸõTD†©^U%û…пtGDÒ‡!»s)qÉoAH×c¼ò“4êõªBɆŒBŰŽà«êßÔñ“¥@U©Æ•dZ®Ô•úì¤ùnŸÜÃ:¿Áp?Æ“a»ûÉÜ(ÝÆV–;ã S-ÂÖñ¨Þ¾JGÊÃhrNÑl²[J¦¦¬Éä1..07^œ·µÔŠüŠeÒg’1Mÿ1@€Ò½u36Ùú@ðcý[ÒõoÙ Úc·o]K=gêZ¯§ÄbzØÕ¼©ácL‡®X­n”¥;ÓèBU+÷@žŒvqmÈhßjÓ!Ì‹•tÔIåà¤ÒæÖÏrQ™fäï3Ù¹·© :ý™{^,+òKÝaTÌmÒ–ªÓF¹•G>0ð sjøœÛN3J“¤¢zÙ8¿MÈ|cvÅ&ÁïÖêÑ7fÚ‘ÙkÌ Ùjwèf£U¦*îH?ÀQ÷ÂuE»G8U¹÷n$Ç™àYgjtsoq‘À“ÈÄÍT3 £¹Vuó¹F’ŠU”§Z(¬Wi×Á9*WÁS¿c°ÞH@£"Ë‹ÿ;+œðA\ö ’a®Îýz½Í³½r“›¯Aè,"å"CY;8朣ð‰pÒ¯èa ˜‘ŠaP|†{Ã;€'¾V£'U¿¦zRÓ‡V#Gßd?3åc×­Ï$¬ Š#3-±R·)çU â4"Ò±ÅFÁƒ"T¢»ª'4NnpïÿŸ86&B\)s®hcr½C°!^o‰§Ò¼¨úªµq©Ìïijs¯môÏ—ÝSry2àÃÜ;•ÿ;Ã…Í=éᓯp|ç|BÀŸÔª¬¸Çvy?Â+áî1Dà=š–X‡ÀŠ’8°7¼ƒÏppܽöf1þÇı®Ç2ÆËó x[˜ó Bï:ÊmµEù¶JxîÝñ|¸kRá:&áó`Ê î?±øN!¿Äï”øæ°Õ݆±7]¸Uºp«7 7Ý]çŒoKOâH ÛF–5„¢ÀŸ‚w |—mgÇ%#ù.)?¤G×|Õ,`!(FÔëGëf"[+,ušÞ:øx˜h‡‰G› 9­ïØB¥.™›êeIá71 Ú5¹tyLþZÁÓ¿T2ÞwRÙE•ÜlŠº= Äx4ŠÃ°ØRqÛî›ç¦Ÿ©¡\Íô‹”Ź}ïŠÂôý¢õDÖÂb Q·—áÎ,ѽñF¶SR_µŸ‚nCä6=á½c]a?a2½ÅT¼põgÿwpú76Ç=¤9Õ¼/|g¾w°³Æ·I(ÓÇð—=üeK‰¨_Ηu|…ë  •Á¦Ñ¿Qh°Å CÂf.a›Î¸­lts¸‘?}*]{ 3y¢Hú9ä*MNTÂÈ]ßp‡2/‰FøÊ½t»i0#¸˜L*àO U°k'L‡ "öKç~éƴ֑’GnÏ6s{´ª³¹&ÜÑ7r‘¬#ø íX`DÅéuó˜ÎŒ!˜Ê¬¤|ø±ZÈìLûRUMu¦C$”~¶¯r×íg-Xwë;úSFC~¥Ý”·4–¯‚®ª]r,ÁßdK†2=Ù ÄÓ†º¹kÌôÞÿŒW·cÕÖ›´•+ù|ð×#£î æÁÝfs¥±pÈpiœ³mÓ•;À}nh¦‡ÔÒjuø”†C¨t¹a¦Äyô„×íSLðJØgê]X‡¦+ „(ä .ÏkÝ6tÊ]͈€­®¦×€tÉKYeÐ鲦mʸ¦:+ÇžP°IfåˆeŒ‡C·Y6ÕÀ9R”go>£}…îC ¢¡!Ç»$ÚÓÝ´­eˆ1 nû A!ôð<ç¢b!*‘H¦X·³t¬ÁîëË.`¤¤à—O^UÌ`>¥GéÖÑe‰îëÆ¤©Ð4k/r~´«<Úeý¬¤h.ªlÛ̬1ö”ͦ}8÷õ Í;‚ÿ®mQŽcµÞQå&‚À°Ë¥ÙU!# Ó[ŒÔ‹ìHRË*I-93õÐ9×,gˆ:•êXC\ÙÞÛÌL˜aj »S§{–IŽhʺIâDgÏÙÅ4•¼¶#ƒé¬Ó‰TS¬ßZÊKzKêõé!¤tk±<èÈÝ#“^!Ø’)³¼Š1-öÝøZ¯QåW*ꤪýÄÄ• æ ¤§"žëc_º§ÙhÐ÷ÛzBNKèCR·m'®•#Ëæ‘,›¾Ì~¼ªi¹‘Ÿ?Š 9ÌÓ-dËoªåw,ý:½v»­¼‘Ò®4­C^¶@‹ÁÅÑ6!G§ÔA9g`⬴r¼‘rxiÅ“-úœCŠì±3Þú0st£P>忱yA£âB`œÌõh4*Hjr“„=ÌD°beíEÚ¯¯˜°8fÂØùŒ¢Ñ7€Âs|¥ØàÁ·¡KüY†¥zÓ¹j‹‡ÓÎcøPÆŽ}å~bÄÜ𠥬#eýú×”}“õ€€lõu/JL¯X.Ãä?*-†ñ)T¡åÚàíÍ(Ö„6D™`këm[àL8ÏCèÆ|5I¢ Ÿ£Á5ÓüYµÅøN†C ÇÛNKlËíȹžÑxbUE¥Ê¹âÐ ™Ù6Ž¥‚¹ .)Íø#L:äõcÇGà`úžz*™“L-¢ŠƒšiJ¶ÁUIØÞÑš¹~øˆX–аÏÇCÑÊ¥BÐζr…bض ³`šwb6¬¬ëxpP&_(ªeXF¾%&¨£:ì!\ÁÇWÖèZL-JØd ½f•²1pùö rÐ:ˆ¸…ˆûâÿŽZSïô D5g|†0°è[õWL0Õ³5k]ñ:ß>i qþ3\çÊŒšqÓ«Öù ¿E«°†è—±¯tR ë bâ‚Þu¾¶·€¬®¬k—×íìFð;ƒ}:÷5¸ƒÇE{¾c!ö?p?Á•§¦0#Yài”"4Ñ¢±{]7¾vÀŽ`a2¹O*I«“´¬°ÓΣ øÕ‚é&†R¶.cßm©ek¾ m׬ôÆa¡f 2\v3#;çž|AOÎÌ‹¿fáX5ƒw€w+mJ8²IÏ! \J]´{¿øŽÅ_ƒ;X¼®¹'{ƒ(ž2†ßùà~B&5.]Pna]ª,ÝÁƒBµ;Sì¼>§þâó 5n{îuÑ0„ŒIÏ6ƒ±ï]0~fŠz=Û¶H©Ðùîdœâ®lh0†Ú¦ ÂXÍÕ–|\aeýLuJ‡5ôžô­Q®pHÙPç75 ½·M§ESÍË$®ìãnugSƉ%ëa¨¡%©ä< ¾cÝòÒÀhªüh'µ7YÏ}.G›²våhâ–¥Áý7»Ÿƒƒ¹ÞG¹W`Ía'²~÷|SW™ar¼×ÂdS\½Öñ)NÿÞA[~–•+ ÷Žã‡”ÌGJFðxÕÕ2ò^Ê9N˜G>5éÛaiQyÈÚè³p‚×g4E?ÒçFë30Ž|œ\b"_^€Ü[6Õ+áÅÖ«^6€¦Â†î¯Ý›nΰ»lª¥„Ž*{Ó9ÐÝK‚@àJÓT™Xé[oö^eÐ~x;šoHÑQõ.ßý¸¶|úLä)t+W¼Y†•«:uÚ²ÅêVã1LJºNPÁA)ŒîTÕæ/”G=›ìƒl„~Èöð±IÍ dH–éëáÃaRó#µK/ž£‰ ݰ~ÇCuÀ£ ‘qY]éh¦ÜZ9|ŽÏãaôéößRÜ~ †Ò˜ä@ A·¥Þº÷ ä*Ñšã˜]ã:™¾²©.©:‰¢Î0#.Ý€×T27Gûs ž6 +f'¾ÙXuÎÎ Z!¯÷ÅàÜ “ˆÈ tS\Áܯrv¡‡>‹Ù ÑM—j×%î:$óÝhfGàUOí-'4½ûÀëz®žlLz]9Y:§à§$ÔÁ­EëÒT²¢¯*4Œ¹v½åky¶Æ0+Þv€£%[š~ãͰ;øÎ‡I¶Ôm…{¤aŠŽ]ûV³Ý4Ì÷3ìÎÈSNµ÷ˆ©#AsiççÌ AÓÞS-}À` )]šÊeÍ{ËÔÌ8ó#] )UÔ; <štÚo«Y¹rÎK,?NªäÑX±•D ¤+÷9\¯vÔÿçslUÈ䦆è™4s¢?O¬a§u" _üѬj –î­nZCÖ o˜†›ª—sbh>ñ+A#OÕ."ßè[¿^eKˆà]Ȱtåœ(NTÐOz©ˆÀ»'¦KÜ NÊ*ð! ÷f7{w2Æê¼û´Àø°×¾þéÝÄé«&#'š†ÌК©KšÀ¦fB25°8w몮m5Ð3ºU?*Þ%b³BlI5ßxrƒLµ¦h]¡%€xb‘ÆÊý±}3.¹ÍÜf<üÎr²Ú¼ËL¢ó¿§ïg:É𧥿°B#éfG­ž…`a^{²oùKÐng$ÁUa¶0slGÊ—áØ7ð1 t?³N¹$`æööm8éô¾qäf aWkÁ(ØL80q\—ƒõð™cü5øÎ ®Œ×ÑÛw´eîõçóŽïÙÄã…^ŒãõBr„÷õ÷SÖE°×:ƒvíïAË™AOL:Â:p׃ÿZóWñçáчf¥s²mBKxaHKxK%fJ/ð1³ÀCЬ€C_![ìà‚øÖÛÍq[”σ¸£fȶ-¬Cž ¢pI ž~zúë$yÜ endstream endobj 7738 0 obj 7764 endobj 7742 0 obj [477 /XYZ 38.2500000 742.250000 0] endobj 7743 0 obj [477 /XYZ 31.5000000 165.500000 0] endobj 7744 0 obj [477 /XYZ 31.5000000 338 0] endobj 7745 0 obj [477 /XYZ 38.2500000 303.500000 0] endobj 7746 0 obj [477 /XYZ 38.2500000 742.250000 0] endobj 7747 0 obj [477 /XYZ 32.2500000 337.250000 0] endobj 7748 0 obj [477 /XYZ 38.2500000 303.500000 0] endobj 7749 0 obj [477 /XYZ 31.5000000 165.500000 0] endobj 7750 0 obj << /Type /Annot /Subtype /Link /Rect [315 713 410.250000 719.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_exception >> endobj 7751 0 obj << /Type /Annot /Subtype /Link /Rect [308.250000 346.250000 344.250000 353 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Library >> endobj 7752 0 obj << /Type /Annot /Subtype /Link /Rect [60 129.500000 91.5000000 136.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn2 >> endobj 7753 0 obj << /Type /Annot /Subtype /Link /Rect [60 122 94.5000000 128.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn3 >> endobj 7754 0 obj << /Type /Annot /Subtype /Link /Rect [60 115.250000 100.500000 122 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn4 >> endobj 7755 0 obj << /Type /Annot /Subtype /Link /Rect [60 107.750000 104.250000 114.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn5 >> endobj 7756 0 obj << /Type /Annot /Subtype /Link /Rect [87 101 125.250000 107.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn6 >> endobj 7757 0 obj << /Type /Annot /Subtype /Link /Rect [87 93.5000000 107.250000 100.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn7 >> endobj 7758 0 obj << /Type /Annot /Subtype /Link /Rect [87 86.7500000 119.250000 93.5000000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn8 >> endobj 7759 0 obj << /Type /Annot /Subtype /Link /Rect [87 79.2500000 144.750000 86 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn9 >> endobj 7760 0 obj << /Type /Annot /Subtype /Link /Rect [87 72.5000000 126 79.2500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn10 >> endobj 7761 0 obj << /Type /Annot /Subtype /Link /Rect [87 65 147 71.7500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn11 >> endobj 7762 0 obj << /Type /Annot /Subtype /Link /Rect [87 58.2500000 132 65 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn12 >> endobj 7763 0 obj << /Type /Annot /Subtype /Link /Rect [439.500000 311 468 317.750000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://caml.inria.fr/pub/docs/manual-ocaml/ocamldoc.html) >> >> endobj 7741 0 obj << /Type /Page /Parent 2 0 R /Contents 7764 0 R /Resources 7766 0 R /Annots 7767 0 R /MediaBox [0 0 595 842] >> endobj 7766 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1409 1409 0 R /F8 8 0 R >> /XObject << >> >> endobj 7767 0 obj [ 7750 0 R 7751 0 R 7752 0 R 7753 0 R 7754 0 R 7755 0 R 7756 0 R 7757 0 R 7758 0 R 7759 0 R 7760 0 R 7761 0 R 7762 0 R 7763 0 R ] endobj 7764 0 obj << /Length 7765 0 R /Filter /FlateDecode >> stream xœí]I¯ä8r¾ç¯Èó“-.Úc€ÚÚ€ U€ŒÏ4Ý·çà¿o-T¾¥)~¤”ï½ntW¥(q ÆÎˆàOÿúí¿Îûçù§OßþçüÃýùéÛ©¸Ôe1þsîÿýãíÝ\ÜßÏuSžüvúýüûéëék÷ÿßOãß>ý{÷·ÿ;ëó¿uÿýýüçÿìþŽԿðÛ©Vu÷ç¯ÃŸm­º¿×?û翜þãçô=NùÉÌÿÑVFUu?;Cÿ~𖩆ÿùã§ŸFÄÒêÊ{V¶ÿ_kõùÿûô×n€©ûâÒZ¥êÊÖÅ#Õº©¬Û³Òm×S á_¡ît^Û„3‡Š2• ÷.¹¹M¡Fµe]{Oþ¦›rºÎû™KeÚZعäζ¶và)—üáq½t/ßy]´Mº­f.•ioqï‚›[«¦¤›tûÒ}ŠÍªóaæâPq›èýÒTîøwr즸¬:pY՜ӢU5±Ô²N°7UB†]×e:Q3Î\(RÁÎ%w¶)lBipÓ}‚ÎÛ2!Þ 3O% ½w_ª¶*êÆÂ¿?Â0ÚÊB†‘iäÅ5õÈån#÷ÛœÔÊêreä¯1}°Ó»í­\}kåê³=/-݇ȨnGBe7€0}ZmWúÞ|Å ø´Ÿ*Æ©UçÛ‰Vç_OßždÏÚ¢6©öÌïû@{ÖMÍžo'jŸhÏ’ÐÙ2cÃÚqÉu·_í4ÉçØ,À»Þ2Ïíšû•~ã0`_>]q÷†vûã÷ÓO?·gU¿ÿµßÇ?¾ÿv²ÝÞÁkÛó÷¿œÿ¥ƒïç?¿ÿý¤Ô¥´US—Ã{C‹ù8´´cÍàßÐR|ZìÅ5¼´(=´4—¦-*]Þ¶4C‹™&°¥¥¨PoúZO1öÖl˜¬nà2 4pQÃãlQ÷E¿âÀÀÄn_†–òbt£æûg€¢Ô¸fêîe<¼ ·ˆ½…¢[80ÞoˆîF~p÷ɨÍðSŒQÃÙl\p=Ö¢oì”ê¢U3gs¶Œ'°ÉÊæØä/ß;œHÜ4¥/oŒÆì˜B†ó,X8A~Ls<©¸Tµšñ$Ó”ƒ)÷Æ2\5¨0PþƘÒ]°¢@L)@x{°¼ÆR™@ª€Ä#Vº@aÅ÷FðÚW¢'ZÇaKB ì³ë‚ËH(-ÛJùÒr1 Y-‚Ð˰ jÆxa˜‡,“"$ŸúOJ…BÒŸbáx=;¡Æñ‘–á/ÔVbtÞΓd:É$-ñöcŒæ`@bc\FðH‚C9ŸÒHr>¹ªÉ=¯Í ”\B+Óz{‡"– –Ã÷$”- $šÊ‡Ä8Õö2Ìs6¡¶|B-®+-÷¦aËÇø8ˆûæCü 4ž›NÏF+Ÿ÷2máX °q¬9¢,0ÎvY}€“ ìÌ[¸ìöËxEcÌp¼q„A¶4‚ñб]#j;P^3\X€bDd´ý{ÐIÈp*£%” ]ä4d1Ãú–8ׇ=NËIg2îœ(å’Èä cä°û®”bòŒU·› \ÂÆf6æ”eÅXÅ÷ìš8Ìgì'FÐå:`LG)ö'¥Ý© ßIXcÖú åid¼­ K8YÍdÖUééå²xйã8ª¼­™ÓêØÛȇ•žš¢”Ý”úÚ=£'S[yOËÌàlš»[EÉ4FËÂÛKXéý¹¢NîÀd1Ge¬SÆRçŒFÿ,±aYìþ„«ëÊ#Ù€ Bÿň|`4 øºðÜž${‹å0Ã4v;ÁÜ.æ#x-sˆ»Ÿûò)­î'µÌöŠØbƒñ¾.‰„Б„ý Ì7Ä\gG#¸¶Ú—°Û•Æ"C‘+Ø*Ýã•2ê2süG˜¢¯$d󵉾@€3†Ûv^ £Ö&‹õ›\gÉ¢Î2CDt‹L÷D“¬Ÿ9ƒgX¥ï*z†Ã›WæŸ9€K˜ré”¶¨Ÿ‡Ÿô°3Àðq˜¡h¦„¬Ã(Ý1~FYä•åXå±…4»jKÊðÈRmçp mwåx ‘Ã(zÏézzÎ}ä0•CÛŠGÆïLES(:b„>QÇ&(Sè‚ ûÉ?g¶Ÿ–9Œš›P(6ÆxBñ¹3žô¤a÷\IT#±t*æ=ñ%Ãò˜LýʱÉB"nçÈÁë¹ÒuøŒÐäx.|(#R­å®‘ÃÈÆ )Ý–¾iwcÂIdðÜéê¾þ%Z¡+ 1±ÉL,êa¶ùÈÞ>ªö…lmz;W"Láš7¢%Üb|m˜j0ŠFXG¢G.LoØáa5DkÃð9½&ù«Y[z„QÝeª½!Ì9 ­ËÓÅ`çB‹cR,¶Wgu&·R6gÕ®FcÁضšpR‡Gª¸Œg­ |¥ÅmYyÑþ­[@Ô7º‚ß´è3n¦Ò‹l"£aoŸ` †¾*^n’šŠ š™n[ šõ”µ´Ò[[ÚL:oYØišÐ‰ÃXxŒrÀ¸jôM¨A²Âz)^±ÁŒ´Û+¬„‰²ÅGÙt©L‡¯$’r¿¼Ñ$¬¶.)&êõ¥Nã$¢ÀcôOL”;Ë”EíË·Ý}뇖b»—NÕ&õr%U „lEð8îi oñiE®R1¢QŸ1ÇK{¥,PÔÆäJ2dDR™hå§JiëF¶¥/¦ÌÏŽ F›ôz¸¤…-°:$îÍ!A\EI\…ÖsTÉËF¨¢4¾ðTÑ85S‹Ÿƒ’”z'¥¤'Äï¤uFEÔÔ°‚Z¦S28 µ½;ªVþ#šªõV”Z«b.yÚ½dUÎ/…—àÕD#¢=5[´®½ÂÄ1xÍĵR±{•¡Ÿ´@3ãþY‹D€,P^é©SJ?©ñ…aÌžÛ5³E¶¢pœ¹lµØˆrù þŠ–XÉu»›ìa"s\&Ó'›sŸÌ÷tKØjq'¶ÚÆTD]¡ªôþkHˆvñÜþêv2'BDL•z,Z‰‰­¥pÎÀŽ0PvºXx î<Þ]e÷H©jI©=Á ôV^úï{·¥.nŸüzúïiô‚ažbáýHë²yàp*ƒ£¤¼^W)›Ï-…ƒ·_{ˆ‹°[q­0scã‡8d–.qÕSskÇ-"wï9÷ËwDÒKRˆ9óÞÙË”4«ñ„£µñèŠ}{8 ?…FLBž5ÃtqaJ%®:¥*·ÈFg3õ’ ¸ha™µ¨B¶0ç5èdʀŻ`KÔ´þˆ`-{ãyjwã3M åðm~*\3×2øʤñPÚxb8à±9àÕ­DŽSf.âœáÎÄLÁ”ŒÖb¿Ha} 8¬]Ú•Ò:¾µÐ°µ¸çjŠ»B4ЂoÇ…³vY[y0ɨ»óÁ-C—ºç}×P P,ïÃ*€¥Gðê0ö`züDP7¤ºÀýö+àp ~ƒ[½°®Ô-†Àƒ¬t_µ`,Å+0 c^Œù7–{Ë1ÆâàYc,ÇÔÄð>OéöC<þcNÊP-æ(Xޤ(ž\)†£/8$ÆQÄµŽŒOU6 ötAìw“!RF¹ªÖ“’O^¯‹aÛÙþS £b¿‰@EËÄccŸ)Ð.§ç¯m®JÜ{ÐAŽÝÛö‘c÷÷p›Šu7ØPÌn ìÅü áQ´þÊÏ >m¼ Ç·© S?€±ïá6¡ìn“ÒO"öŒâ¼?øT Î@–ž3žtÔEY=@ƒKê¢ûSzÔ°µVÆC !jÀ¾“-¤½½´C ^O®Úu¹ `¨ï$uv‘(sWrŠ2wi9ˆ®[žßœ¹˜YÇ _ Ë9¡ ¢ ’XJi¢´ Ù*™”§Z¶Þ\¦ÛEd«Ê½¶ú¦¯¥æ¸s1é1A@zTVyäû6œTPëƒÜjÇL¤wÛ²¢ª*/…w‘c ×U$X‰§Ý~¦N±båŽ?Nˆ,5¾ìÛ~‹9S>=pÏs3l¦ÂÆÂE^#"?˜ÛÒ M$”ˆr”dêueª:¸ó¦÷K3…Ì×íô²z(U_iÿš³»ëÈØlÂë-ݹÈðUÚ},Z‘RDyâšÀ>möoÌì GT% @ ŒˆO&S6âZ Y«í‰J(7)Ã&Kí ¾læŽhÍÜFqÌL•5Y‡w„`ÈUÅyÿ$ä7Ë„2p–Ù™xcnfÎnZk5…6¾¹óøðC"„†š5S"ŒN›‡?1‰ÔɃ@¤ÌXø&Îw6@¾KÒ‰K-àÞˆ$gª6æP¸>¦nܤ€ã¹ØÀr"@4P,Ú:x·K"õè!Úº-ïÎç=D»x}!Ú˜×àoà Nü¼ÒFÙð?g€´1fQkuŸÖ }Š ê§ Õ`þ[pᩬ4£<1í#²[°XgÁU'RÄœ¦•Šý y¥r®"hÏéèù¹àFŒ¨‘Jx¤˜m¹°—ÂxÌÿaK`œ7S.QB?d°—áë”ÈîÄ4GP£ÊWެ¶ú/#Ex‡ïµäˆõ*f'µ;î„•ÅõòXbD6òŠÜ$"Í÷W/╺MŒ ¦Î«™Ã@ÙsæÐöÞ sâ|ç Ú´Àí¼r9 Bé¤Ju,à l §´ûuéÅg»ŸO¥öQD½så¤]ÜÆªhýÞ?óøîsߟ;¬xXpíºJÕúöÉÝaž¾*è±ìSoW" Æ­¯ÌuHç'*. ïV‹Z±—½ðGÁÞß|€ß´èrªÊËHë7ß|¼"¬wС¾ –$÷¿©Ð ¼R8ëÀ à¬'ßìr÷Ç`u1#pnZÆÞê‹NùµYhnîŽ×ôžÄªžrJàIÄÚ –@jãû{7fߢ1›ë®N^éKg´ö¸“ ™!ЬTþ<~%âîNd‘HÎhãoÑë`1Nƒˆ 7‰*ËŒ™1˵¦ˆŠRLe·lÕpe‘ŠQt˜óL$˜äWh¶ò‡»a-ãñ0P˜³Ì]­>ùÝNoIÏNYÕ Yq¸Œ÷a¢¥“… {bæ±Àl&Õý¨jX@©WEÕú6?Öݱ¾3M`>I òϽêu É])—ü³Å|èG²Ò\"F%âvµ÷ËÆ…šœÕëkÎìPp\å œ“F\¼ÌTC TÍòÖp~c™x:L=ª7¢êSAÉ餪‚áœN‚Jp;0m—˜‚ y;üS=SËï 0>ýáVݘùV­ø(u ÉX˜³DaÙ›.bîàõ1Éz¹„ㄈ½µ*âÓ²>hÑlz*ú™°Ä)#a»s¹ 81ݦ¾ƒEô¦ *½;W.É®áñ y“)d޹b’:î$Îsb—ߺo®*´‡AO`Ø'¤¨Ê¹*o(êÍyæ_$£šìLAèŸ1÷¼-Æqš²L‹g¾!Ãw—¬#ç’m̵hæ›L)FÌŸ™Ò¬„³Éb©WŠËR;¶åÜT¸ì%¾pŽ£LF¬(§hpY§.uœA‰ÝUÌx·p1<<æ:|ÁQ¨úlb÷²ìqðÜp Þb·™í-ž.›O\Ã\ä…ÇyN*‘uîç’‡Ù 7Wøàö~crêBuy“¨‚¥Ì! aßRüI¶¤9–¡ ‡dÊ ×[bÖÌõ ¬Â…9„Æ{Š/%ÀôÌô2r—)¯|Üž2'°Fº25gÌU!t,# ÙÆÑc*qVJ)ÑÞCd¤£ðU/1j¾ ‘Ãxרá=¬+Öõ:ý(k³f®g$,%-–`Øœ{Ò[q€ötÙÊÏé¯/u;ÏxÒPKÌK¥O¯’¤Ñ¨7õ’òæW¾qyæí²ÔÄØ‚=±°7 [0 œkŽ–MqÑ…™G–ÜK3ÐvjÚ0ƒD?Ưgª°‚Ÿ!Üt| ž›«DÐç5•f5ire¥x=xO1-(bðA ¦á.àq½aš»áM[꟬Ëî ©4Em]i•éwyišâ\ýµRÍø´>WíedÅôäÇ©j.Ju¿u}«¾íeú5ŽÑ½ï~›þ³³ÿµ^Œ¡»oü™èó4Ó±—ù:~œ~9}üCöÚ<Yyã‰ðµó;&¥“9AdªÎe)az¿ðOΚj*ûS5·¶VýÁXßš9Ö·v ëÛÊÇÈîÉëû·êÛ^¦_fŽõ­^ÃúV-ÆPK¬ïžM3Õ·XcW¬o§{=µ¹Š?…– ‰` ŠÖZŒ‰U`J«6Qô Šb¢‡º¾}ð0=¨NœßÒƒRf…”*=\íŸøô0¼Ußö2ýÒ3zPJ­ÐƒRÅbŒbAý³i¦ê†^ÆØ“úIzœÔU¾@ºÃ±BDM€¾1al—)”gßLCªh¨5·§!£æ4dô ëãw÷dACý[õm/Ó/5§¡Î|Y¡!ÝúctO4¤¯Tãz™¯cgº¼¼”KóqnyùÒö˜¬ªížKîÜYB…51U‘âÇ4Áu¡oô¤$eÇÊ«üš¨¹•Õ3ǧ¦{¢þNO~t˯o™vÖÍô³p<=°í€ß^¶ñ‡éžôÃÌ&3¼eçÝØù0¿x¬#K1вéä$«{j-¶HÄ­hÊññ¢JŽ–Õ¸¹SÅQ]6·6ãzÕz¸>r_×;žë!á`ôz¨Ú¿åpyêÆýtüàú( |\ïÄ…7LU/q}xËλ±óavÅõ—ƒˆëÌýbû`X]M¦ŠÛ›1¬i< kÚ5 ëLGoëÓCþ-‡AS7ÓÏÆÃ°¦^ð¦ò‡iª%† oÙy7v>Ì®v=4LaL\>ïfŒëÇ­Ò “ÛrÂdknlÅd]ÔsLÖE³‚É=ÌQL¦á‡·FL½v3ý¬ç˜¬‹j“uQúÃå“Ç·ì¼;fOLÖêšêõgª¦”è•S”Îä„b¶M¤D(/s®ˆü1RÕjòö›‰¦l©êÊ#U]¯‘ªn},PÒú·)NÝL?+Tu¹FªÚ.†±KRÞ²ónì|˜]IÕÜ¿v‘y…±3šIÜwÈ#&m”ª…‹ýfòúëJÝ>ØŒý¶ô°ßVkØ¿°,µ³,gÈÛ¿å°{êfúYzØoíö[ßNîŸ,°xËλ±óavÅþ묹œ¥.v®ã|Ú»GæI¯¡|ݹ«ÛÉ»ÔWá6{°™¼+ë‘wU®‘÷˜ÖΘžQgÿ–#ß©›é§õÈ»2kä]ù®þÉ‚¼‡·ì¼;fWò®¯Û o¤‘õj´@\’÷È73¦»o–7H+Ès?£q̽> endobj 7778 0 obj << /Type /Annot /Subtype /Link /Rect [60 771.500000 126 778.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn14 >> endobj 7779 0 obj << /Type /Annot /Subtype /Link /Rect [87 764 105.750000 770.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn15 >> endobj 7780 0 obj << /Type /Annot /Subtype /Link /Rect [87 757.250000 107.250000 764 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn16 >> endobj 7781 0 obj << /Type /Annot /Subtype /Link /Rect [87 749.750000 99 756.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn17 >> endobj 7782 0 obj << /Type /Annot /Subtype /Link /Rect [87 743 141 749.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn18 >> endobj 7783 0 obj << /Type /Annot /Subtype /Link /Rect [87 735.500000 168.750000 742.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn19 >> endobj 7784 0 obj << /Type /Annot /Subtype /Link /Rect [87 728.750000 94.5000000 735.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn20 >> endobj 7785 0 obj << /Type /Annot /Subtype /Link /Rect [60 721.250000 167.250000 728 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn21 >> endobj 7786 0 obj << /Type /Annot /Subtype /Link /Rect [60 714.500000 120 721.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn22 >> endobj 7787 0 obj << /Type /Annot /Subtype /Link /Rect [60 707 93.7500000 713.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn23 >> endobj 7788 0 obj << /Type /Annot /Subtype /Link /Rect [87 700.250000 150.750000 707 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn24 >> endobj 7789 0 obj << /Type /Annot /Subtype /Link /Rect [87 692.750000 134.250000 699.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn25 >> endobj 7790 0 obj << /Type /Annot /Subtype /Link /Rect [87 686 114.750000 692.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn26 >> endobj 7791 0 obj << /Type /Annot /Subtype /Link /Rect [87 678.500000 150.750000 685.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn27 >> endobj 7792 0 obj << /Type /Annot /Subtype /Link /Rect [87 671.750000 107.250000 678.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn28 >> endobj 7793 0 obj << /Type /Annot /Subtype /Link /Rect [87 664.250000 130.500000 671 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn29 >> endobj 7794 0 obj << /Type /Annot /Subtype /Link /Rect [60 657.500000 90.7500000 664.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn30 >> endobj 7795 0 obj << /Type /Annot /Subtype /Link /Rect [60 650 132.750000 656.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn31 >> endobj 7796 0 obj << /Type /Annot /Subtype /Link /Rect [87 643.250000 131.250000 650 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn32 >> endobj 7797 0 obj << /Type /Annot /Subtype /Link /Rect [87 635.750000 117 642.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_starting_out >> endobj 7798 0 obj << /Type /Annot /Subtype /Link /Rect [87 629 146.250000 635.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn34 >> endobj 7799 0 obj << /Type /Annot /Subtype /Link /Rect [87 621.500000 173.250000 628.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn35 >> endobj 7800 0 obj << /Type /Annot /Subtype /Link /Rect [87 614.750000 166.500000 621.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn36 >> endobj 7801 0 obj << /Type /Annot /Subtype /Link /Rect [87 607.250000 174.750000 614 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn37 >> endobj 7802 0 obj << /Type /Annot /Subtype /Link /Rect [87 600.500000 156.750000 607.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn38 >> endobj 7803 0 obj << /Type /Annot /Subtype /Link /Rect [87 593 134.250000 599.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_configuration_files >> endobj 7804 0 obj << /Type /Annot /Subtype /Link /Rect [87 586.250000 130.500000 593 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn40 >> endobj 7805 0 obj << /Type /Annot /Subtype /Link /Rect [87 578.750000 141 585.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn41 >> endobj 7806 0 obj << /Type /Annot /Subtype /Link /Rect [87 572 126.750000 578.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn42 >> endobj 7807 0 obj << /Type /Annot /Subtype /Link /Rect [87 564.500000 200.250000 571.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_test_suite >> endobj 7808 0 obj << /Type /Annot /Subtype /Link /Rect [114 557.750000 171.750000 564.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_running_test_suite >> endobj 7809 0 obj << /Type /Annot /Subtype /Link /Rect [87 550.250000 127.500000 557 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn43 >> endobj 7810 0 obj << /Type /Annot /Subtype /Link /Rect [87 543.500000 148.500000 550.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_coding_style_guidelines >> endobj 7811 0 obj << /Type /Annot /Subtype /Link /Rect [87 536 147.750000 542.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_language_status >> endobj 7812 0 obj << /Type /Annot /Subtype /Link /Rect [114 529.250000 159 536 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_supported_status >> endobj 7813 0 obj << /Type /Annot /Subtype /Link /Rect [114 521.750000 166.500000 528.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_experimental_status >> endobj 7814 0 obj << /Type /Annot /Subtype /Link /Rect [87 515 280.500000 521.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_prerequisites >> endobj 7815 0 obj << /Type /Annot /Subtype /Link /Rect [60 507.500000 111 514.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_debugging_options >> endobj 7816 0 obj << /Type /Annot /Subtype /Link /Rect [60 500.750000 129 507.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn46 >> endobj 7817 0 obj << /Type /Annot /Subtype /Link /Rect [60 493.250000 147.750000 500 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_further_info >> endobj 7768 0 obj << /Type /Page /Parent 2 0 R /Contents 7818 0 R /Resources 7820 0 R /Annots 7821 0 R /MediaBox [0 0 595 842] >> endobj 7820 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F1700 1700 0 R /F1409 1409 0 R >> /XObject << >> >> endobj 7821 0 obj [ 7777 0 R 7778 0 R 7779 0 R 7780 0 R 7781 0 R 7782 0 R 7783 0 R 7784 0 R 7785 0 R 7786 0 R 7787 0 R 7788 0 R 7789 0 R 7790 0 R 7791 0 R 7792 0 R 7793 0 R 7794 0 R 7795 0 R 7796 0 R 7797 0 R 7798 0 R 7799 0 R 7800 0 R 7801 0 R 7802 0 R 7803 0 R 7804 0 R 7805 0 R 7806 0 R 7807 0 R 7808 0 R 7809 0 R 7810 0 R 7811 0 R 7812 0 R 7813 0 R 7814 0 R 7815 0 R 7816 0 R 7817 0 R ] endobj 7818 0 obj << /Length 7819 0 R /Filter /FlateDecode >> stream xœí]K¯ä¸uÞ÷¯¸ë¾–HŠ 0Ý= ‹ƒ ‹ ‹`lÇ0ý~ze»8a…Ño­’ê­uJ¼ýýŸþ4Üv±b}±âM½¥RSwÚNû´ò] ÛŠõ7ÝøÍ÷?÷d}{#9Zíìø\ÅL«B›õÀ_£—Ý$/›d#†…d£æ•ýçn¤^ÓÌdg§Qó¦ÝbáÏ#¿|Òv&áv™eÖ«øOj¦MÿYޤÿZ${ˆþ7ñ•ˆ7¥Ó*á} ôÿùŸª3€U#ýËÖ¿a!Iúÿ~ü¦óD±úf¢ ùÞ)mÎh[Š’èß4Šä&zŸ‰Ïìm*ÍD$C4?LÛúõ÷°$y±¿¡¯€>ôC!_KÛW ãÇEß½Mô­ÛòÃŽÊA¶í">šõ@heѺR êJ)TFWJ¡#%6ŒÄºrœ5éÂeÿQ†ºR ‘Ñ•R´É6m¢+§Y*\F…Ûœ©+¥p‡ë†D õž~˜ÒfM%eãI­ v“š©)™#5ÕÅ4Ð$¤6ÌšIÉ/ã?ŠˆÔúÅ2¤¦šd›&%µq– —Qá6§’š²^-}d³¤œpäÔÇ%–§#å<µÍz`7é6¢#-rt¤Uü‚û‘„ކY3øeüÇ6¢#Ýäè¨sñ6ýHBGÝp–eT¸Í©tÔÛo›{Ñ´ø‰éhCº•R‹¶þe[·ØM-¶‰¨Å¶9jI¼49{iÁËfÍÔà—ñ›ˆZŒËQ‹‰}Îa$¡–q– —Qá6§R‹Õþu~¥¤NC*ÚäÝ0†i5Fª¾ +’¾6 @Ú¾¬â .CžA)»Y3s‹ô\`ÊØÍ¹ÝTÓdØMõÎ^Èjt CngMì´,3s×¼Íݜͱ›31»9“²Û8K…˨p›3ÙM5Ýý8 MPç.b"Ì[àãÒF6vª¢íž+©{›R5Ú‹-Ó­öŠ-ÕÚHlµ.'¶ÿTÍþi ¶†Y³ØòËø6[ª5±¥ÚØÛFb±5ÍRá2*ÜæT±%Ô]±%Éo„.$±ýY<Hí/-¤*i3TÕ{ŠaSþd g™õ*þ“ ©JêL UÉ.ÞCvI uóWªWÔÛgR•’þÝ)—.©ˆ§#ž´ž¸°v«%Ú7Œpà 6ÞiPÓqÓÖ’«]ùÍÑwŠ˜!‰5€DË‘ #½WÐZ)µhëf=ð¸¨ît(ª;“Õ‹Å貉„í0ˬWñŸt(ª».'ª;•ì¡RQÝù+íÖ¢zÙãTQ­…ÁôÉ.Í)$‰‰v q^¤ÆAÛ6 [D¼Ó¼ÊzT i±Kd!Îe¡LÐþJ¨n=ð¸L0](ŒÎÉcc~sW³Ìzÿ© e‚Q9™`d²‡LeB?æ¯T­e‚é® ¬Çȉ5Ý»Ñ]øêeñ7U£µZ¬“ýJ¼nÚÔlËØ.§[³ jE™ êT䂺.ç‚&!-5‡´r˜5»˜~ÿQE.¨“9Ô%:'Rtœ¥ÂeT¸Í™.èpó{¾òI,Mêˆ-ž@hGˆvNæ Kþ°wyDRaTªküAåŒX ì ]3º6Îè’pQצàŒqÖÄòË2þcÎèÚ8£kãà×0‹„i– —Qá6§Š„Öƒ3ÎS`û9ôîÉÎ.w,ê«ý¬$ð‰ëݬ$#ðI'sà“NÆà“N¦à“qÖÌ*2Ÿømn¬$sà“NÆà“a$a%¹€On˨p›SYIÚÓY ÷LŽ@+trÁ¶Èf=°›L»ÛÒu9lK×ÅØ–®K±-㬙 »Ûâ·¹‘i—öt*ƶ # ™ª]v¶å¶Í©dÚ™:dºaN‘¿AÌœZ1bÄ„Nû;ØÌ¢ñ;»˜zf=°›ñMSêL¦Ô™¦Ô™¦4ΚÛ0%¿Íñu¦Ôé¦4Œ$Œ¯˜Òmns*ãS¢î“¥³'úX‚6£øœ ãO!…'…2dNg#dNçrÈœ.qü;—"sÆY3¹™ã·¹Q˜Í!sæ´õ66EæL³T¸Œ ·9•œGæÌÇÕ™<&$¬ŠœšmX1t@œÔ>ûHÑ‹¢Ü:ç‰Ä[õ›uãõ€ÿì2ÁfÝSwÖ£'†‹ÇYf½ŠÿäÑþ³É›u£ã=›‡1¥fl¾íqf°Y·AB']!‡«2žF "'7øÁïÞ°³nØËL -ìE‹ö¢Eö¢e {Ñ2…½Œ³Ìzÿ)„½h‘ƒ½ô.ÞC¤°—aÌ_éörÛãTR–ö²q–Êj_±@)!߆pÓ‡´ Ÿr§d¦0–G03»]™Y HµèF»Økgj¥C;S+“±3u[Ðslam&޳&;rYÆÔ¡©U—±3µŠ#%ÃHlgN³T¸Œ ·9ÓÎÔGb´ŽT„ßå}Ø=†dUòšpR :غçÞí6"u· ŒZìf•©Ð:W¦B'¾¸Öi™ŠqÖÌ:(Sá·¹1ŠÎ•©Ð:Ž, # £è¥LÅmns*£˜e*ЭšOWÀlp­÷»YÊTH³ØMì6B7h›C7è$, mŠngÍÄltƒßæFì6‡nÐ6r # ±ÛÝp[F…ÛœJìny•Ò𪡓ik`*è` I¼h¸C»‡Ðvë½Ìkš‡`šÁ41Á4)aœ51粌ÿáL“Ã!˜&Æ! #1óN³T¸Œ ·9“yMã`Þú@ I•Š›\ ëõô£³ ! ï¡ÕèçFví:*Op#g·ü2­?ÏW»å—ˆÀFäÀFÄà#RðÇ8k–O"ømnòKäÀFÄàa$‘_bÜ–Qá6§Ê/áÁ´KºÁ¡X)…ù"ìG³bYg.¿AŒ´'ØBÂdˆ‰v=³_\ Ð*µ]ìW*•™$´eT gÍâH ¿ÍM\©ÈÈ8P7Œ$âJÞä“ @@·mNWj)ps•ˆlŸã)Ô—¬­¹‘Š…ÛÑçå¬] ’RÒ$7X:ò 2µ€š\³Ø-Ètj2:j2IèÑèÔ4Κ•@M~›› ër &ÓÅÔa$dÝjº-£ÂmNdú>¨i#«‚d;ù•d;€< J±l,ÿ²z˜¬ I·4ÈdôR9JÉõÀnaa"|š±9|šIB·Æ¦ø´qÖ, l€OóÛÜ„…ÉáÓŒ‰ÑÃH",Ì‚O»-£ÂmNv©õ 2U 2AO±JYÔ.°7+×»YÔEU’ŒËUI²I€Ö6i•¤qÖÌ‚.¨’ä·¹±¨ËUI2. 7»´JÒ4K…˨p›3YÔ6ã&%Å¢)Ž ßö›Ä¾b¿#J­ðØÓ6þˆ^¹ØË1¶5!ÇØÖæ8& Ú9$pŒXXdYÆ4!ÇØVg8ƶq€s‰9fš¥ÂeT¸Í©#(ï?ààBèÓJ¢t¥H­rÄe¯ª­X*5íz`7ŸËôfeôf“Xš•)èmœ5ó± @o~›ŸËèÍÊ828Œ$|.ÐÛmns*Ÿ+z“i¼”ÉB¢:´×£íLù†Ú«Aôj°i±ØMô]`³]Àf“¸‹íRÛ8k&ê.°ùmnDßål¶‹£HÃHBôÝ`»-£ÂmN%z}¿¾Oj3­khý„4¸)(Ê‹è#HO–à‚ìkÖÃÇj©ÃHÕ´{>Æ~ɦýy¿tr=à%?ÿ…ü{pi:^[àwAy%{ó ¢gÿë'ÕÙøe€Js ¬5â­ëÿüýŸ>W—ØBØéÛå•ð:ð@µUf`ñL\¿ˆÇõ9e ¥‘’œæŸó» 2á4­Ëá4m8³.Åi޳fƒË8M¿ÍÍ s9œ¦uIÐ¥8Íi– —Qá6§dnÁi’Ýï °v1°JÆÁUa3®YJ m›¥/šv›V6Bü8›Cü¸ÄÕw.EüŒ³fÓɈ¿ÍÍ´²9ijqàbIL+» ~n˨p›SM+w¿ªÔŸøJºâQ³]1?h€èLà“«}O}ã8™o¾Pwºqmän\[N”ˆWÍDzÉ%Eü†P.^ì¯4A§aîÁš&‘>¥¤êkd‡%ð_+š¦ô|ƒÍ#ÄÅ[r¡:šÀ{bŠhUÚA, òY ½°+×–xê®B©•J›FgTüjnhðé9R:–dY“Çn²Ü¯+Ÿ‘í ¬Xñ`ñû ’íäòµñ1’M8_ûµœxéèˆL)ˆm’ü¤$ÀiÀ[GêhlÜ:k+à ‰X\ˆ¡@×¼w?jÖ¶‘]¤ZéGÅà+egÒÉ‹È7çc ŽqÊ!›·q¢ZiµO~S`–è$Z¿Ðט,ÂJøˆ*‚¢DQ’îqÁ,+xP4`]¦jp ¯‡û­†d!Ì~þØÿ”c ®ŸCB#Ù@Õ HÍ;€ô+žx,§B€-×2kY[¥A·^ ‡ØG'P%f-o…'$[‚Ûϯ2t§L*/¢ å¥2Á’ÛbiEœ¯•Ìc±Tš4—ѲäÙ’ïQ8/[±ÀV<Ìëð‚MPÔúôæaÌÑqDóðT¤ÍJ‡Ä6 ŠœžÛ¥óv¡!ÚH( ‰Ñ YÌçã†)Ež”ó w1?¿e#ä‰&Î>Ræ© «"­€ôËj=oéƒ  ¾ñ–p p>»q<–4ˆCDbC nk\9é|.`ßþºñ<þâBú@ý6Æ õÛ¥3ÎsŠï`âÅ­Ù/&þ+ù?Ÿ÷õ/t¡qíäÕ"¿‘ó7%Xx×îƒx™k£Câç7îÔÍEsäD¶KÉq †³‹àÌ‘€o©‡qͳƒ7µ!'Cêý5º[Lk26X MS‰¬¡XaA»ŽÓÁã(Ý ýtŸÍ$SÊDÚñÀÒxuìålÜ#à%"h¡«¾¿=e0Ó{J—Ê×2÷Ÿ§†ÕZ¯ó«‡F¹º[gaË1 [«u®ö8K«Èõýü鳜ºUG¿–6ÞCŽÙäá• ³l°Š ÷3½¡<;›1ÊÛºá;$c†•D 3†%v‡\l­˜3¯§_«ð]ш,oÔr¤¯Óëžßâå•—S//g·xL¿u.ÔoºÉé7-bÝ£Eªß†Y2XE®÷Xô[gsú­3ñIõÛ0Ë«Øp úMww…Ò>‰=Cá}$PSCLïÈÉùr>–´çä~ÒV'Zmÿ©UzÆÂ…Ú±³É9cC9g\NÎõ¢(’A¶MåÜ0K«Èõ‹œ3&'猎÷0:•sÃ,¬bÃ=*È9»$3¿ìø—˜üArX6öa†ðz÷c¡"\¯ƒÛ’w»q؇L!0àþÊ-!oæÖHÎÁÖÁëcŠÝ™P±;›Q쪟*]5)ê@5³d°Š\ï±(v§sŠÝu±bw]ªØ‡Y6Xņ{¯ØU#ï³t%µq (Œ Ä"Ð3Âßg,a‘0WÀúPª™J•œ8¥Hßúƒ§ž´Åóñö÷ÞØ¹$¤1W10óHØukºjb‹7¬V =«T)êj%¡)¹àíi‡%Õð)Åð¤q=R’7ÍŠ7Q…bÎnåÉ=f}8Õ7™ÛÖ ¶ïO&Þ\Ñ/ñP{ã|ÐÖ+`°RT?ÎDúç[,s8X`‹g\¡Ì)¤è‚Ù®Õ4˜§:u:=ŒòAÔ o‰Õ‚ ÀÿÙΰ²sÑ–<¶{ïÉZTÄždb¶;¤Ä&^ÚoÄÐaK—Éà õ ’ôÆK5k±„Û¸5ªÜêÌ]IÄ\;¢@Þ<'”ï"H·¢‡s~z¤>v.¢E¨¤2ù< QxE¬äºqÕ,…%ö³!âá@u‡£ú[µbX׋ß07w8-Ê€ˆIZá6$U¾Ù,sWt‡-gŠ„oˆ:© IÖdÍ ØxÛÐçšI¹¦±±éÖ¦Û…Q4_ ’ºà  £OS+µ¡oUÄó‘ÌR–[vrAC2$†Œ„ûî¥Üådk’ON¥—çUE4O¨/Ô7ô»¥÷AB:­ñaµƒé³‚0Pb/]šá¡é´ {­j‹FÜÜ%&MÁâHz5òºJ=bλrZª%¿ùZþMûýѯчÁŒ¯3ñ²n1ìóG³A â#­Õj¡$ƒùü¨op…7úU$bÍš:8ŒT >ÛÝjG]°‡Ã«6ÝC,Ì òJ‚Ô4ß ‡Jxfe\É_a®'}:.?5GDöaiòÉÚªä‚àX²¦ˆEÅéºHÑñäN+D[ÒÆŠ·§çsžûã&=u¶¦_–茦c¥sî&ùMBlŸï<£CÏ@d|Kß ÐÆlC³4„ q°xs˜ À]×mwd×…¹«ÐJ{!%€c+Ȭ¬Ôî­Vhb£œrA'u…SÚ•[îB™—Ƕzf¾XÄõ>ßÃBj“!% ZàÒª 7áHG¤,[‰–Xnã;»BRîx>@E:ö€È ˆzÍÈ9Òþ‹7bð”^'R$IÜbίdÉýAFN¯³qÕH1î(´[-´ A)×6>­ã[g–J<â¿\8e‡­Ss¯©‚F0ÚˆL#mTÔ¤e‰ÁŒ³d°Š\ïáÁhÓdÁ нh~$n3βÁ*6܃¡ŒÝn£ÍR@Qf² ƒB¦õwÔW«ÞE»—|é}æÉ#µvçâ'Åê„|Øj¼Ç|,ÉS¬9÷ø¼  †ÔUÀ‡ªL±ì7ãÃÒIæÌ©0ñm@um4T¥ÄhJÊSí¼V1pÞlʧqPL–¿ðƇÀX0åN0#p«ôÒ>P½YÛ}«ê­V.ðùáO–ÐýF¹ 0ÊkOó¾õ§îKÍ[ŪÝÎkÙÓG–HZà@VË;ïã3Nߥ¸'MôCæ@UìÑ*zìµ’šŸA^%yn« o!ISÇöîã ²Ö8Ý ˜Øª=8±‰ ˆ_­¦$¬•t ûa©{ÉšÐZ$Z9òÞÿ€ âßï‰l\ý…¶,®s}–zBˆKŒ”Ð`­– ] t/Ððú¸†²òÄUk{‚Ï'•ŠyÂ`@LÛd ¦¼`‰! ã,¬"×{xƒilÂ`ïÑĆq– V±áÇCLÛùW÷ÉÒ4á˱Vf‡N«imØõ›–’t4ó'ÊA2ÈQ´(¤WÛØ‡¾6úNë>M:ÑuUžYOS` Ѐg”"*ñ?_ÙE&·yÎÖhã™m :åb)rZa¤WÎÝc¡ÑäYT*)Á\µƒ¾6Öân/Ç0C]O•Ú¾q.BïƒÄõ‘óÎc!,¯‹Ó£mÓÙH‘¦±¤ãYâþ´ôS¤DGÉÙ R¬‰\7rãe³6¡•ÕF«èµ?¸ •½ƒÒ0RݧVÄÌdÇ03÷Ë/tÝÁürd`K'´~¬ªƒHœz¼YƼ¬\ýÈ#ŒPÞüp–jÁÏȲ'ØŒú$Âlh_øôZ´¼À‹·Q)= ájÍ} @®‡+Gct¤7¢ ˆQ‡€d€†/-šÉ{@jñÞlÁ´LµWî’tHMÈg8m<ßu¸`Ò=Ô(A%# ½JyDPS¾JÌ××8´‘ú\åú¦ò¾å ß|0¤B­“÷oíʧ”¼G@çæÏòR‘Ô‡Õ Ò X5òFœioúÚ8ìf(E8bîgÆ‘÷tÍB˪ ’´„6¾yµÈä—Óþ"°Þ›ƒ"øÀûA2†xÄÖÁ*p6\‡Ö€@’N7ʎƼÔó‘]x[)TæDxäX‰À°*„ZÙkÀôW*9·q4ÛTöx €_‚›Öa‚›6¹·¤~®™êç†)jÃ,¬"×{, nýR™7×F’·a– V±áÜLTú9—¨…$«ÑšƒÉ$2:ÅNÉ]ôj)iôý\3Ulîá¾z¿ˆkpz©2æ“3 Vü‰‹¸—÷+.U=…ç( 3ÑÉ~hÏÁ˜þZŒHÊ92©¬õÉi­* ÞOÏ™ËÄ@6®šCÝ)oºžÈ{¹Å¹ô%EÞÆE+À·ª!O •ޤüa¶õÆ« ¨ASßE}3ß^Ñj³­‘ûæðST×ÊXúWˆ˜ØÂ¥y˜d?"uôöƒTGÚE¬åîõsXYÌhÕJF‚‘´Õ*;á¯XöxÃeµˆ‰®K/$õ͆ƒÍ[®íô§A.h'9eTG«1‡sµÛùöøsUÉø ͨžóH9Cšî4Õ¤¿9¿®&ýÜ6Rï l•ëÅÍ6`.¨ð½yat”R\ˆäø£V,ýdhóå¬úº^PÇ„7 ÒUȃäe6ÖÊ0<žã±åÏÇL—t{{¥Õ¥Õ~ úAê^1W»@Ž%–J…C3+G^)ŒàPÙ÷áÓN‘KBñ?XKe íq ãAÀxá-%ÈÒ×ðèÚ,½/‘€?+“|ôý燸žºËÏ¡5¥ŽTìÇj Ä£:8÷’ÜÅ5XÊø³ód.h$$øƒä+íCš@˜3×Òd=þâ©“ŠKƒ Ñ:¥ï’³ñp]¾˜"} !\¦ô‘jØÉ˜®ö£CŸ ÊtÙ© P‚·Øs÷ƒ­fS¿Ì>Í¿@á”óŸN­²Z!2XÀû _žn¾Jd«#ûáÝjø¡Ó1%È àä1å7”üþsH–SÀ äáTr’xú!¼°Ó¡º=ìÌÞ±oBeý¶© £uKÆ–‹Qáy·øŽúf~Ýú}öUË ÷GýFN´Ùk»eD«W;¿ÕÜ73LL½FÍ{¯cÃßÌt•»ÃÏäj õÍÆ½Ï˜pç/aÏ>ß“ûO§ZœÉIÞtH‰PÆ{pÝ}$¹Á柎U¹€[yaSî`x-TUÿºµaª§%¸ñvhàuÜy“†öCÌ (õkwuRFúŽË}¨X€:k^ ?v¶]΂9bFž#x?D#ÆOV}㵇Š{9mƒâ^N»Lq/gÚ¨ðÖ0÷gÉ`¹ÞÃ÷rÚdŠ{9­ã=ú‘¸¸×8Ë«Øp†â^w’ ñ~gze+jCÚWJû‚Ô&’h„˜`È1ÛéoMÔJ=RyN'YÔ’Øpl% æn)¼¶Èwcc #+’bq™“ÍCmf)-蹟dd>r: v…È&£Sí€Wz§ö™"@P/?ÕzøÈ™1k;\ÄšIO¥.œÓñ²KÏÅM6ó ÜM)BEÈÙ`”ëÕñ*(´Â›ú\+•ï<㞣òBÁ}møDô‹Cjò¢—xVA†Èág¸>Èä–þ˜nÅW@pç£:YÝÊ–Û‘uéç”÷Õœ%¦Ĭóq{IªÉü­¢ØÈQs5åþ²[‘xêó4?ŠU»ÿ)AåºNH¸q¿®õ.­00*1¾®\ƒåÛÆ]&»“ëás xXê©Ü5?Žmàº6âÀÙÉ¡ ð—•óÿL}3ã8ËZî ¶Íܯp%’ŽÅ‚1ƒvŽÅÁTÎ <òE·2qá6nö È>,¥i?†UuéC76a¶Õâe0°äà™Ì»Ò^)RˆÓ¢º¡¿ä7ßûˆÃ%…6Ñ3|%Û?ÆýPG:¹ãD´‡°*¢ —Eñ+½<(<ÈÉoÈÏæÅ"¢„”óPëô@’’©£Ï\¢–ŽÓÓg„$/@-?×ÌLJ80%ã²>;fɆa•LíÏ{U*Ì*Cbøl“ 9Ðn½0„ó,¬"×{LÃgdH £]¼G?fH̳l°Š ÷8:Cb¸Ïż§3$¤?- 7~ãçÚÒß0×É¡Iž…ož Çÿ:©Ì(Œ‡N*O(l°Ò÷tTȇë±ul– ‚®{ È‘©ˆ´×yÒžÕvåíŒp~óS¨Zòsäž^vä£v¾bv’áú ð>ôn‘0s˜«ä©zŠ­ÜeT+/¤ãØ^\%‰„,ŒôßäÍeã»3ç ’§ÚÌ1Y£hŠËXOG'^ô"ªÔó¹PÅ›o$ÁçÈ£ÒFÆïÐô½!/œõBEë^ödQ¬‰}°êü™^ð·•r­Sï;ý Y‚¯|¯Zá§#ó*„ˆtíS¹’‡±pf” PµJÕÖi ͤU <7("D+îJÇf =“ ˜Ä §NÝ•„Vt¬¯d4Ó¯¡â{ïçȘ«q@²RÇ*ì‚<^¤«Úâ}–ôÃÅa…šiï³Rz‡¸ú‘*ÏiB-Ó!€àdäW’†'â>¢ê´:ã¼EghÖcƒÆZBcm—ƒÆZÃVû‘;Ì’Á*r½Çµ2µ"ÙC¤ÐØa– V±á ±n¡k{lW.šÕJú>R¾ºäàùPk` ž_ ‘ÀòP€[W‚´e­ŽÍR¡ßšj þ£{òž; GBfŒ´s]aÞÀ$k9,ž.«nn¥ýKÑÞ~ Ý‚÷p†Eš }CȳÜ1’ýÀAŽ„YÐ äå°<òjè@02N-®ÛX‹˜¦ûËZów¼’òO4å jo‹€—ç ü´ ?m£2Ÿž¯¢ Ì0~ÆY2XE®÷🶙ÀOÛ´ÉmøgÙ`îq|à§m–¦•Hà§ ï“Ù ¡ÈÒb `%o„ýtþ•Ny¼þ{†žw¯BM—mç"]õ²61v~x ¢Jåk¾4¾ì[.Í]’¯”ð@%n.na1‰´ãý4±{¶Do´2DjÓ ^/:•5y Ê&ߤê†1™ÌÔ'Å…U ½×:nG’‰Ž-ÆÄ{8´ñ¸Dl-øi+,i¶°I@ʇd¾ .Êñ`¿VµaÌW‰\ÌW©8Û$1ßa– V‘ë=–˜¯jr1ßÞKöèG’˜¯\¢¼~îQ!櫌w˜oA,‡5ºø¤ðjå|¿BÖ7®†å8çã)ÒBÞ1Re¼àüå r¤r×ö1™ŽŒì*i¤+§H=™¸åTëU¯ìÃÕ+ûh6oçƒZ'ØçŸV@ÿQà%o˜½¼çVb¾ÂDÊð`W Òg¤ÇxéÔJÙµJÏwÚ<¢¹ \€’7Wy1ܬwèXâ¶dž¡¢šZ?¢T“RU4Û'I™¼´‚T¢ÿ• ï‚LÃzX¡Hggcâ߯Ul„Yƒ^¯ÈÀùÑØõ)Æ1”¦&)+_ºäëLÉS Z*E'm„Ð.t¥ ÄÁ6š"Z 9–åH<…‚û÷s\€Gu}, 6Þ¦éÏ {d *ž¦y‰²O£6èÿ¼ýÖ‹ýM­ðã½ ;Ô†Íi ÙOÓúáM(¹-ÉÓ«310 tñ.F§9uuúÍì^Š÷Y?­H¤%_ÌWjyOƒä®í‡ùN)Ø&mÞ¨Û%5äŶó­'78Ó ­MiŽÊÜFK¯FþfgmÑ­›Ù¢7ü»YlA>;IÞM-Íú4 Є ¼‰Y}dHš~ªí½8ë"¼Þ‹6|Ÿ…DðÆIÖdM®Bw%áo?~úë¢é endstream endobj 7819 0 obj 10404 endobj 7823 0 obj [479 /XYZ 38.2500000 785 0] endobj 7824 0 obj [479 /XYZ 38.2500000 425.750000 0] endobj 7825 0 obj [479 /XYZ 38.2500000 80.7500000 0] endobj 7826 0 obj [479 /XYZ 38.2500000 785 0] endobj 7827 0 obj [479 /XYZ 38.2500000 425.750000 0] endobj 7828 0 obj [479 /XYZ 38.2500000 80.7500000 0] endobj 7822 0 obj << /Type /Page /Parent 2 0 R /Contents 7829 0 R /Resources 7831 0 R /Annots 7832 0 R /MediaBox [0 0 595 842] >> endobj 7831 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F8 8 0 R /F9 9 0 R /F1409 1409 0 R /F1699 1699 0 R /F1700 1700 0 R >> /XObject << >> >> endobj 7832 0 obj [ ] endobj 7829 0 obj << /Length 7830 0 R /Filter /FlateDecode >> stream xœí]K¯äÈRÞŸ_Qk¤©q>ü’R?‘X µ¦%ˆšË]1W4wÁß§Î)»êtº¾´ó«ˆL»Ê 03í);322ÞñůÿøÛ¿þóo‡_?ýö?‡ß‡¿úí¥:¶uuþŸÃë_¿¼ÿÛ‡>´]}øý—‡/ß^¾þÿ—ó~ûôϧú¿ƒ=üÓéÿþrø×;ýំÿèõ?øã¥5íéïÿýö÷¾5§ª.ýóÿzù—¿;üõõãç†Åüüï¿ø¦6UÿºŒ™Oÿx·iÞþúÛï}ùõL€´¯ô®²¦;ïüÁôÞþ÷?^þ|úÀøúêØ{cÚÆ·Õ=jíë—œ³cûÓWëÉwÞþ’y»Qx¹·ÞËßV.Mã}¹äÉú¶?“Ç÷^ƒúãë5¨ß·š|óºrqªŒg ßn^ךºé{MÇ®rç½k7ÆždÚ©êVžV×·+„q':¨½ümåÒD¿\ð›Ó¿)žìåíį=Ñ|^¹ÖÉ—Kžlëò´}.o× ~gÂÛÊ¥‰2ž,|¹äÉö£HÓ0§®oW ¾­4OömåJæÔäåßR^‚Wrþ`ïÿˆüðã÷—_¿ž øþðýϯjÿõƒç¿}ÿãåd´þòjá»æðýO‡¿¯*óõßÿòbN+ll}^ßù‰ý€žTíÛ“úh›ó£ë“&ý7§‡¿ùxþ=6­éNÞÛõɧ·'íÑõU°6¼S{~bŽuïÚŸ¾ƒßöý¦ú÷W`z≃ԩÐÚìùÉ—ï'.½ÁNffs‹Á|uf°ÖŸtçƒïm¸L{ÞZwì&ĵðÉ™¸þèÝÙgÉqë7_B9Û™…ß¡ÞÖÀß o[²Á.üO'€?ƒ—FÍœ?쎵oºŸo\½3³«Ç+!}JXL‚m§òðõø7á‡ñê1#û"˜,ò†²xë-ñ6HbY!P™QZ†zaÐ%¦>V¡¼þßvÑ2ã»èf†µ¹ñPﺃÑ¿¡(>Sxr‘ûÊ\(,ÕàÚÌgøOÚz®6^BÑaz,œ"/qq„ ~ýdŒòg~ƒïæEÌÙøxàÛlG¼-“„óÍ@ê¦Z³Eè7ƒ—Æp&þŽÏ¤¯17ãUãƒÃû‘µ&l@¨ŽÈÕà ›^XºAr•WŸúJÒœÖhIe1¥˜ë†ÙSÿ†¹¼øŒDUVòSÇMâþEhA(l;VÌÈ;K„ãõ1b‘qŠd]¬Ïˆ:ÞIrJDÖipd†PUïvÍ¢¢YnÝa†:L`CÄ}ZK¤CñXcÃ[P<†9pxVÿ•¹(ð7E9„¸õ“KôNE68uoõU5u ¢L FÆÚÈÛq’ËÝ'9¶dÜÇRúôÃLÈï ëÜå:*búnäÊfg 2~[$ 5N¤œKJyýcDŽ…³Z«T˜¶¯ƒ++c¢Aʵ•="fë ¼Î˜Y1KL¿‰uêk´’ÁÁàEã+H¸±©ÇžÝÒþø¶ùŸ«GO†íÞxbáo*øû~§…OøÄ£'þ\ÜO¿ƒ©SáïÀýP+€ßÁ;ÅÔÙŸpO‘–ô$ò—~*xæ/é߉¬º‚O |bÓi€W‘;XºÀ;gào˜[åÛ (ÓÎÒ-²¶9äÑ9Ý¥tùÙtŽ}›ÆdZ¸bĘ$X$W©+Ax…,¾\m†‹â†ØÚõ M“ËjK™ ÊÏc2Ëi|r„‰Ø‡X[ÂïD$&–¿„NÄßÙ5yµaMî«1öÿtšüÖ °r‚k£8‰ (æ1L¼‚Èm‚\‘„Ái°MM)¬ ‘áÄÈ~ž†G#§Íèìu7Rr}&§äënê ÊŠÉ{ØtHO3ïûR+®³ÉsQõ•ºe4‘4Ñ%ižÙ;!Wܯ¢xÍ]W‡×œàèÈY98ª‹r-Ðê]‘« ­‘¬,ú AQ¦Â¿X¹fyMÇ´®2«fjËŠuJ§t ?/ê…LC Á´§ÌV(*Å®½J€ê–’DÎÇð%"7¶ØµOÀRÃúgR6L(rý]Yì»b…_)ÅU¸ÿ¢|Ë^y4$þmºñ3æ€÷ÈlÄúnq„íÂL2i"Vuû½µàƒv³å,¨¬¯å½ø>Ì=ɳRg~&å­€8Qñáˆ4˜lŠŽJ>àÔ1‘|PIé¦%ˆÔY$™Â”4pÌ)ÔÁ¿Ái°ÈNqq#^. öI¿3܋׆ËR‰ò&±ˆwêðýÁ§ÀËh©UN–ʃ$Ï£?š~\)N¹3rH›F$$¡?"§…ßF”çSû)^ªÀ<‘-Ê¥«”i¸È¤<‡DÖæ3J‡îâU)öØCdÚ+‰¬ “mÖŒøµ˜—±ìd€,öìÙêó­ó×»®"qü$Òò‡¹Ú€™¹¦¶‚ZŸ6ã?cºQí•p²úùÑx'b!àÈÓð 5ÿ:l”Ö_v÷<r“»f?e—1®Ú&¿­D>µAS¢”Å4Þ?õ‘ޢꠃø nˆ×æ0„!AQ&«+ËU”ÿ½YŸ°3Ï—ëy´{†5·ÅÔÙ-Êây4Þ™µk’8¤Æt#~ãúŒrÐ=_†*¢Ï˜šþMòÿîùír•ƒYåS«“=£"çXB…áØ=µ~Ï¢7{¶i#wæÁž0ýºPÙLÍxÄ‹Û$¿åŒ‹žþw—5+:ûH­$¾3ø;pÕ¹"Ï#k"ÿ69‘ÈRG,«9®Ê#íüØG\1#‹lN$‰£‹œF˜¦Å`%p,²“o#Ã1—C€­&ŠÁµaðs ùo•3_w„@ª@] ˆ ä`E UW.PQ f4Q™!0}3Ó;çB[n˜.<0}è]H«î-1£’@¢õQkNÄF~ƒÏ®zŸ4eÖXÌ/Ï3{)#oXá‰ðØt`ÂíLÑæ!œ0!T+•ïçóešiCg&ºuµub¢í… ËÍCê’âê2Ÿ®T±Â›ð7Ù”ƒhTeb®bD„%$ß–{?)“šáíðõŒüI¦ U¢63¢²u·Á$íSijcݺ›Õ”6kJt[‡"]Wv0aä; V\ùÖ@BRá̹&Ü3Þƒ(u"Ì„í4,hˆÓ^-© 'œ"'§\1ÍĪ˜T>d"Þiø²bc“é=u[שZ{Û-V­bš*™(ÓÖ)Q‚Ÿ+^ú Iö'ÈR®Ãκõ3‘˜gBHLÔóM©k™ló££d%ü7gõõÝ,ù#Éé„ÀMŽºÚ±Rò²)<ãÓâê?\¯'SXö9ˆ©sü Í1¦ñ!u·Wymºf1‹PµÒ°ŽÛãA´cÛºPväªÖ6îu5 ëÜÀÝÑy2–n¤é?ÁŠ _®L¦Î Óm›™–ˆ_ó!dÀM"•G¶bz©Zk‰(3Õ\Ï´æ%,ö,–oD¯Üh¯¸ð4ð¦0„æšlP¶Ç6LÝQ¡¤ÙçfÚPãaXÆB‹|'Wáñ û%Dk„"O44¸¶ÓåN¥ÌVÛãÇâUÜN‰ûÛ˜LèE2nE›˜ÎYÁÜTÍúæ¦øhSÍ%‘@#P±J%Þ–!Ò˜ððD«E؆ÈoDB \e·o†—T"X,ŒuÊøËcÄTrŸIáËÈá­3™¦`ƒ)"€Ôa\l&h! $[–A¤B)~ ¯@DñàÄ6msÇw2Dîê‹b؈rè$ÕŠö& ;å>Ê6ï,˜Q…âˆÏ{9ñ¢Å&Üx˧vZÞ̬ã/ÇèÍUÛ)\ËØ"ü'‹Ù,ŠÃ*\X‹yˆ0/pï…y¾ü®ÏJ*Uü)hK †„¹/L|ñ¡š Þ ”rë¦8d»öä²ýÝÁô7+ 㵿ø ç² SÏA½wg÷=ø·>ZPŸô›aÓ·~ÓÃß\ržauàžo3çSmnBöþÆÁTÎ2µ¶ÒªƒãgUK¦édÓ (B¡:0–Åž½Mm²@‘ñaLu¼r³åòòÛˆ¯Ÿp<å‡Ô‰Þ€lx0ÉÓþ4…ð€¬z•”c”`P0Ó”D±‚"ÌÏ4È¢g‹&ÄM™ÒÄŤDžìŒ>,Óe hJY¡êsd›½–s± :žH1œ¨jÊ•Ó)_„YÎ<Ì?>¤ŸhK Õfâ0nkÆ:”˜‡9{ ˆšÊ nTI|qQ!’àË­dO’rfð!ä ìRJ¹ ²ÚÜoSj–¢wÁ2 Yê2ÉšR¥Ð¶Y2FµåˆB (ÊcNÎøXî2#òˆ”gãy;|š‚‹°?ŠQ$Ò"ëmH1àÉÈA˜:ül¤Ëö3|‚]e¡]oJÐÎV“Ïâv ܪŽ ˆÑ?çó7L÷\mß–8WW…Ÿ -šëOëcÇ¿Á§‡¹·ðà®x̧9N܈ÀWÒ;±˜È‰&¡»Œy uåéx̯’±Õ˜ò‘å((G?bÈ2¶ôä£7mãÂ+%©ÅN¶ÝOÝõtÖ»ž 9郳}xÓ‰ÞJfÎ)îî´ê=® å[écèëð á"J¦ŽÁCñoÔolê ùÅYŽÛw]°=‡ov)°‰™‡èhÀ•4C]uÈþ³© ]{°žh§µz۶º oP†zîª ¿YÊ8|ü)ïL%Üg~#‚h¿›Î±ÁNŒ)CY¢ö˽ȵªê® eZDUcåŠH}uoV¦\{»uåÚOÌÓˆô ú®à0rÁSEDx®Á’¥À-QÚH¥þdkgD{¬Ë¿R!Â;9ª+íÉ­%ãl(¬1D(]ÐÄ2® 3wØXÊAa¥í]†z–AâïècÄ›ƒòJ©Â›Žë‚ö<·®÷˜hWœlË[½‚liyisÊЄL +¬¿¡‚"5éØhˆ8 DøB¶*Ò.J¬:C¿ ­BaQ®ÔkÏ5ÏçšõƒÂ™ç„m§ªµkH0GdÞQî!Ì5œD¶¾žZlȹº·™¾ÐåEjòV¦º›uÖbùþ8†õ-²•ð)…L-n»üõðšã±iÌaE8ô,Zk±-õL%’Ä%v*’øž$ð<Õá¢JQ[ª)[Ž e±7ôNfÊˬ³¿7ÍbhÕà9 U)L0бÿ€0™®:†e§ye'T%,#}‹O>ÍÖ¤×Ô—JÏâ],Ú}òQ Ñe¤f ¬ºcH$ÎÏà;ã f„¬³Ç¬zS0Z»î ‘¶^Ù>Õ }] éRjrÖW‘µÆp ¡Ye){–_è?|R_Æb`ªe FüãïˆTÉ2`‡„¶L˜ò–+»…õ[Jqc¹s:W ý™-÷UÜ­-`” žßæRùúÔÂÊšÌØbp…,îeTNôJA‰°h6è禵«}:#F"€ÒLn4ËxDM =4¼;xQ @Ù‰¿">ˆ½Eá!–2}„ó²¢µjØTˆŒ®IûQ“aØqJ’¥šÆÊEˆ ®zü£h›S¶±¡;ÃL¸7L)÷ÄÛDáò©9LQ¥¤€c.å4T§+g¦˜šÅ‰…o®ãš«£e‹Ÿæ ® ñ<ÛÌ_G‰ü×>¡:)£dŠ8ÿݶýÏ“>þ7„ Š bÏ¡H§áe?Ø“ ½bÄnü6ÿ‰8SÌ!9æDü6U>_†1ЉóÁ§0œ\ž›~Å>*Ó¼xø6Ùý¬YÖ”¿éx±%† Gð@áùD¤±‚È­…ðÖe€”ÍÐY›àœ™Ž‰©¦ž„>rå:q¨bi¢ê?2*„ÃJ>S@ÂdJ` ‘‘mŠ–(ý¦‚˜Á~ËeŠÆ "eÅËotD–êQIª0É—hœ¤¢Êj\hšëÀþ€ÏÕ^Ú_Š«WŸ|Ð *D”€6'Zð‹+k;䎠š`ˆ²kYìùÂûÌõò¨´µlž*׆ÇmAª­ ´¤lÐ-"RË·Ý`IÀt9”oá/Õ¿G}KF}s…D]ùˆæffŽ3ܶ™u¢¦çNêLÊU} “+b‰(CSÔ¦ª›P ˆc™@Å^¼–³1ªo.Ô„eå¸à?‰´1àæø$Ò|›[pƒCäm3RþÚ’†ËéçžäY饥Æe ŸÙêZm‚aL¶4’'}c¹öX30ÔîZK™À"á"VÊÚ‰l#‹*vÂŽ7 KõpAŽømçaï^®ƒß¦Ç¹ìÑžoð»'ç8W3}2ôºØc3 òH¹Ïè;nμµ¶¯ÃNQ³2¶à}hÏâÊfºÁ'±ÁZýÆ6 ~üÍp_LÒÖßU° ÷úϧ içàž0 ,Ó0 `Æ%Nb°¯n°4¦ª™ó”–0áúº­Üq?8¼ÚêúájârNT¾½ü?ò;sC endstream endobj 7830 0 obj 7679 endobj 7833 0 obj << /Type /Page /Parent 2 0 R /Contents 7834 0 R /Resources 7836 0 R /Annots 7837 0 R /MediaBox [0 0 595 842] >> endobj 7836 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1409 1409 0 R /F1499 1499 0 R >> /XObject << >> >> endobj 7837 0 obj [ ] endobj 7834 0 obj << /Length 7835 0 R /Filter /FlateDecode >> stream xœí]MÜÆ½Ï¯˜sºÙÍ/  ¯ä9$ ‡ ‡ÀŽ‘ŇüýÌ 9»Zμša©Ù,’ϲ½«­²ººú½êê*òÍ?þ}ÿÏßöož>þgÿcÿõéãÎêÒuÿìO¾ûúEsè¿ß×M¹ÿñóîËþËîÃîÃñÿ_vÝ>>ýùøÝÿöÅþOÇÿ~ÙÿõoÇþÔÿÒé>ïj_¿þûüµ­ýñ;÷üõôóíþò»ý¯§+^n×+óúïßŪr;©qçÖ_v—aúóŸß~üu÷¦3À¸»´¡ð•ÛûâÞ·±Øÿ÷»Ÿ7¸\Þšª¨céÚ~¯¼y]œî^ørï‹öhÿ㕆7?ÿIsyŸþâÁùb²‹wš'·Š•—¯>ñ„_¶ÑB<®–ô“ò|ý &¥*ë Ýé¬yz³ôS~ãòÆ\ë"bÕáƒßÚ½ùá¨TµÿôóQµó »/Ÿ>ïâñ/'t:ZüÓOûßõiþ°ÿôË®9‰Ï?~ðßýÀ‡C(_”îåW]÷«‡¦uÕQð"q’øî~áPƪ©_}¦„’0PÉ=1t¬ó"‰Hâ ¨Vö¼O§ÁûOÇéžf¦|hSëó=ÛC]•=ñD¼?KÊËÜ=b©¢…Wƒ6Ä÷ÁîƒDÐjùå‚‡Õ § ‹b­¡Eñx®V5¾<ž~a }?¼¼f\ø3Øæš«Aï ƒ\GšÐèöø bsa P¡¼b‚ÖpùÍø¥}ŪÁ¹Åd%¬hv vnHä ²ãÆ…`a rW¥ É·ªÊaœ¤XæÂ4Äse òàÅ|dáPJnd"aaf U¸ŒïƒÃ'l+Oɺi\à\|5¼&˜„m ŒôjiÖúð"i-«¢t<ëxÉẨ@&˜„G„»x)CÀ«¥§pâ»Ø’€ù|tpçéc};KÐÎêÜ[’JÞ"I?7$ÅüL %P·%Å÷ãµÆºõnwKò~ü}úY˜4éàü`ê5(ÎTÜÝóO8¸Kî«-ïƒÂÛ‡ñWØ+ MÈo$³°ôë.ì-bsqíî,Õ$ú´HŸ6ôq^±Ô”@¸éa{àA, X¢Ò‚ŠÇ°†á8V ÆšñxL;Œ¡x¬ölkد±Ö˜(ðlcÝÞ)¨JAñ"J¿Nó \Uß 9„•?ƒQÏ Ä|Ÿ€?ƒC¬5žaì¹0ghVö1,Â5²Ö]kªEû˜J7̘ñ COÂaºf;Àu¶äu\Éu¶ðu–v~ }(Ö³*2JÊéB ã9ÍΧEë@Ø: äæŽ':E =>À]Я9Œ.x׃ýGÕP<ÛÂ}2%1³`¤( Gà]ø>]"FK,^D²8Y|ñ,¾8ˆsp Ý19FLŒ˜11bz1ÅÀˆ‰ÓB¢²¸äodqG'‹OÀâD1l·¬,^dq²øâY|;6`Þƒ#&+#&Qƒ5FLgÄ´ðˆ‰uUÒ Œ?r®³èrG}\g&v& `nÖŒ¢mŠ1±äUŒ‰%OdLìRÇĸ¯ ûž9܃ÑR3Û–µž=úǧžYcß2ö`ìÁØãÁ«1öV0cQ7ÆŒ=LÄ8ó˜5ö—§ 0öØTì±ÈÓHF%’¿1*qŒJ•,Yëù£Œ&ÎCcYß·Õ=IMk>cé‘On%¬ˆ&:CbË'b,}©l€×ŒBkáQ˜ŠuFD‘|#J0qSzvçoQVvCD±£”Ý«D”åÛ€Xã$¬1‘!)KöØ-}Ñ:hÆ# &ê#vJ9qžÒX”lD6:žâ:÷¬KØè—hjö^o!iÛ,ATu:Tµ‘¡iÙ«¼ED¡ l£*ϨÉ2Øè¤h=»˜·ˆ´Áúøƒ¹·:–°Ñ/qü—,±A„¤ ÖÇÜeˆó³HþÀçÀ6:)Ú’ýÚ[ÄNÚ`}üÁJXI2˜KÍ`&z9Úz"„$ƒ™FoÚ`K Æ<™[(KØè—hvŒo!i²YÂ>Käè—@݉"‚‹Ï[Kxw¨jßÔåW†ê–y3ÄÿæÐ´î¬úÐr·$Ý5b¨Ë×VhÄUðj”‡S[ûƒ÷égè–-¼)¼ï|ć‹rŒ§š*+ ðê"Ý^5ÊXfô}@:öÜqãj+aÝÂFÁ@OÁ~çñÕÂÃK¡àó¸Ìå¢x’†¼ö;?à¹Å7Æ÷Ñh0b B•¼{Üuàå…‹hl¡YƒW¶xšœêjÈHp4^ê1øj|>鯣 Ôà‡“‡.xš†ß0ß@ `ÓP 4¤;0 Æ@ÁF¬áwãµ—¸³®ÊÁÓFB#¬„5S¡âQMp1?+ÃϼLñÒµã¡k¯ 슫iCÚÉ ®a@pW,‹Í xÀãa‹Šf0 c´Ç û Ô › ƒ“`È´af<¼ßUØ@X¡Q1R÷s¦¤Aê˜Í˜"¢Öø*–\‡^x\šx»&"ÆŸQl´wÑ*Æ»Ç ù ô<í)Ì%ÅV…×{+øI„³œ‹ÔT¾àœ'þ Π¾šM}¨†ÖÅrxíÁ&À¶bÛ£Ùâ«Ö+Ž„6P%q±u’&‹NâýårÀ¶ÎÐe„‹`ˆW0°Æ*Zxœé±w]¡´fS-l$ñgð}’D08äT°œ°ÒÒî,ï…©Âqéš –ÂŽ¬‰(±Y¾Ú´)2=fzÒ¦’0ŸêØEsµ”vw•+Á3b¯Xåá\='„&­‡—zÒ„†Óf£,‡F‚EpÐ÷€†ƒ»ÒMa Ç«¢ “´Ù6aH›Ø÷Òæè4™¸L8©¡•´™e±œ“ïc¡ uKÏ/Cb(e*”Òp’½6KZf<6˜xÕ<^Ø–¦.é’¸{æømfÓSL¼›N›Zü†Ù˜’‡š8 "UzVÐîø8Eµ£Áåo¡¯ó(ªã5ÍmZbÐd¨Rä…´l®ªX!žö¤Ôr½ì†ßg+*s¬±CÐØoD¼˜t!ç9uŸ2RµU•Éí¯ÙBh §ÊÕD_IÎ`#*Cøx¨­Yå‚eG¬ÿeæq2Uã%.ÇškŸ-œnÌ¿ÏÞ^ëÈP¥»‡éÓçýó nUEž“S]U Ôĸ% @SÝ›´rDrŒ9ùÔåá„C²Y ý|=t@UÍîɆÕB¿8~&”¢_<àfüĨ5Ö-ד%¶~B‚Ÿ BYüH³)VÂM±›œ¸ºÖû±ú©›’hŠá=S6WæŠE§4PÕÜFÂokOQÕÊ+ö¿ÂÕ¦`¥Qáµ°ñ}oW¿ž§ÇCs¨ËÕŒ’ë>ì“ZB©­¥³åê%ž¦L‚Öáá­¡À¹Žj‡öWE©¹žú³ª^÷‰÷±¾¨¸‘M³‘Å*S<4OÐMñx³¥m‹}¸Jðiv¿šZØ [Ê~háy‹QèªI#%ë½ìÝ„cí‹¿ëØ?ÓÎïj\ךŒ8ePPÙ²"WŬ¤ 94m‹óÓèyÄ÷IòX…%@ÊìgÏWt޽蔽°UòœæYcxÔ¹Žs1žù¤W[T3§Ðe7¢HPñ(Z!™›¶ÖIÃQIžŠ›÷bÚ-{›!ÖL¾eiÊá=³µR>I –éúèî¾%"øöò6ÕBñìwË "ü”û^ K4X~âSnRnÎ)þÌêÞªÐæC»Âß÷çü >ikmoЏ€J(Y³$;,!ðŽàðÕp$¯ˆ4è½6‰Gãxï€ÖõaäYÏUcÆ_–)É«.rg†)¡„’5F¤Mm† –)a´lAÂh9oä\efî—))3¢|(J3ã^¦ÄrN]x‹8ÞYã“0x‚È} %”P2Ç>%¼¼Øwv.X¦D³ONk3É®M’vŸRb®Æ1®ZÙy>¶ÎÚv~Â9 ¬ÒXGãoYw¥ÃH™ÄË’¬»Ò¦03îeJ,ïJ-3ƒ™Ø™J(Yá~5º%T [–ð\Í‚„çjNµ»Ê¹ë‰¡5ã/”,5Æ×ÄëÂÚÔœV1^§„Jæˆ×KVr¯W¢ÙK`nÃ=Éëá¾l\‰5¸ZQ½±Ì½DQšˆ½kÖÏ®W¢Â œÇ'¯x'Ë\GꄃÖÁOÈÀÅï1Q§[Öé®W© ñIO¥geúz%| ØÿUBÝÀìÖY&>ÍŸ'ΊOuÇë•Øßá¼"ÿ4¿EsáSŸˆ1 ÆOÂÕp– ÇOø>øj÷t˃v%ëg×+1€vDÕÕ¡þ ¾O„óSd|vqÙ²F’9$Ùêö'ˆX"TȱڇJ(ùvI毼. dKfÄ-HÒfÄ…÷tÀ~F¡† gÑ1[Î\yU°’9$9»Ö«ÈJaJfñòLYÕSMM4fTMM4Ö€y J(¡d É{Tì6 d‰å³ãíT4³Òø°³a'%sHØ¥aABìÔcgíØ¥AÉv*ž©éj˜ß: ÅN|*q0à]œí¬Y°O„’9$|®¿IZ„ pTOüÏeÍP¦hk 9; pý䚟÷zYY/²_ˆ’9$–óÑìe?c¸—i¹›uÅwiP2‡$gí]ݰc’Y¼<©DÐ@±Ëf…%”P²rI–£qv8‡’-I,g4¶S’6_¬Á¶êGÏÎ@Jæ°ö΂„¨: ªv¢R2‡$m¬š6{$¬gÅ{)ç·u.T x~pÞÏ~žSa;5'i³èB>!cŽ´-Ù}GÉÖ·Y¬ÓjöZR2‡„Ï|³ I‹iY‘«µcEJ¶$Qí0q¥¤âcŒÆR#f\G—ö½o&º ¢sìá¢d‰å¼ë€Äϰh $.Ø÷EÉ’Œu@ÑEvÛP2‹—'•ìÈ: J(¡Äš$¿Wì+¢d‰å|ÂvÎæŸ™[8yŠ®a‡%sHXdA2¦ÿì¿ÁKĶ÷~á.øµûæðΗG ÷Ïo@ëûýËC(RýÅ{º=j}(cÕÔ¯$݈ŠCáÏ‚¯$ÝYZu-éûã‹CUvz±\§A<ÄpþÈWóðݧÃÜÏôO¹¹¥ÛýHë^…I¯ÖeŠã‹J*ëû¡_ °?(¸uùJ"†ÇWƒŸq]’Üzýâ¶Z‡;}Ôø2ÑÐvŽ »€R¸v\ÅLôÀ{Ã¥±U=t\ìYWNho¢k=H¼šq¸´‹wÐ_mkï"á‡ý‡Ýÿò)@ø endstream endobj 7835 0 obj 4514 endobj 7838 0 obj << /Type /Page /Parent 2 0 R /Contents 7839 0 R /Resources 7841 0 R /Annots 7842 0 R /MediaBox [0 0 595 842] >> endobj 7841 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R >> /XObject << >> >> endobj 7842 0 obj [ ] endobj 7839 0 obj << /Length 7840 0 R /Filter /FlateDecode >> stream xœíM䶆ïý+t°½¤$ê ij»r0Ør0rÖ±#62ñ!?ÝÓšìn¦‹í!ØUÕÒãÝíyFEQ/©b½ÔÛ?~ü[óã¯ÍÛ»ÿj>-Ÿwwa?¦pú§9þ¼ùòí´_¾7㔚O?ï›ÇÝýîþðßÇÝiƒw>|ûOÓ6:üûSóÝ_¿ü~ù£ãü¼ãxøüçÓç<ÆÃ·ð¿Ïãïÿ±ûËïš_Ž{|>ÜR˜¯ÿÿM?Œ!Åc1.úq÷|šñéç×O¿ìÞž*àuG™»>†¶‰}×7qîÛæßßýp8ÀóîÃ~Ú±OažÄï…ÛÃÑ»˜æ&¶sh_ýé§ÎþcýiLWÛù©äõ«%vC<¿ûû×ìF.K¶é>f6üöa÷öCìá\CóðátOÇ<}<ª%5oŽíõH¿o~Bì¿i~ÚÍû¡MÏE„@®EÒ]ÁÞF‘ ig‰„Öu`OÚ‚«Ðÿáyÿp¿«+W—ÜÔ"dK¤D¹B+Þâݺ׫}íܦrÉ=KøV,H:ñúdúqUUM½›+ Ù)RÕ©@U߉Dë8b_Þ¿^QìUµû©VVâX°·$îMÖNù8òÞ.•MG‰ÇÎͽ ÙY”X§•Ï­›ó†l‰¤ª$Ó;Šñ'ûh–ÜÛC U•þ½ÑâC¶D<Ç¢x9 Çs4¸n”6S×r,V¬k×¶ósµ ["E3ð›Q.ÒBö³›«Ù!GÉ©<Ó/ë œoá8; ûÝ’6êà|ä§3±Ôª½Ñ0¹¹3 ["E QÓ2ãuñ8™Ñ¥<†4¯7ûÞȵÞÞrÿ¡£øÓè¦õA¶DÈ4ö@ê>ÈÑY;CA昸 ¸È Äó,YÃÙmȾ†·¸â D3k¸ëq)ALZyU’éɆ@ ÞˆNÿ>à}ƒXÏñ„íäÞUΉ+˜é”kGÞ›jÄuÂ7 ± d { (ä%…ìÎ3ˆ!kرÏÖšé÷ž1Û·~ZdK„ŒY¤D‰¯¢:j×áVƒXº±ËL¾‘|Ê:(k§<æºÉç|µlQyô/_97X¾¦ò•Ÿ2TG— ?Ä‚”èmæ~.¸Ïä»ö6µÓ^oå)¾žqjA,N-§VpâÔ¢ŸVÙÁ©ålË©5´8µ §–‚SKytÙãÔ‚XœZÈZÀS bApjy 8µ®¢ªN-ˆñœY…S+» N­+(ñpjA,ˆ¦SklqjALZyU’éqjA oD§ïqjA,ˆçxÂvÜ•£´r½ÉD|šÏÔu‰Û@,füvp]A,®+½UÖÛ Ä‚à ò@êê­¦rMÁO-B¶DÈÁ÷@*ûóK®\×ò6bo$÷Sªªq6A,Y©HeU•çŽ ôVU;G âyÞ‡<Òì6ä‘^C‰>)ˆÑÌ#F|+ë%ö¹šr¬;Å(˜=+éQ!Ȫ‰N:ã8Z/ñü\¼< Ê+D幯¢™~®õ9â"[/!³ÐA¹®¢\þ˜õ’¢ÕÏÂëï Yí2æµs›Êe#RÕ§„Ÿd½¤HŸäŒü‚V^’ßo_oöút›s¥}Áq4çJç7Çz‰ƒ˜ãŒ ÔNQíd·Í;Eµ›ý´ È ÕU]Ú]§Û›œe®§v)´d$C,ˆVö’¬vrÌ*³:]Á“9yMä7ž¿'bA˜ÿó@*{2åwŸÊ« ˆW®è]Wï›Wœ3LaÀ‹± ŠŽ£&²¥!&­\)žÀÊõÄQéßcÀS± ø<ÊQ96 ^ŸÌ;IåùyÍCùÄ)¶ø „õ’=ºªªª\=NÈ­(+{úV.Þ7¿¨ê€ãbA4çŠâäç¼!["äž–õédÕD§çŸyÄ‚{êhåžÖ 8ËRj#^>ˆÑŒ´¾ˆI+WŠdæJÅþ¬èÔò òS‚‡—K]õ]”Ä- Èÿ±GÂñ ž×-ÚN–mݸ«}/ª:â„X<ªzUqjA,HÑXU^?DVUÙ=$bY?=·7/ù·* ÙE\W ‚ëÊ©ì]uPvxÑÛs{“ûj±ÔšãÛ®Ãy± %ê]4§[ øöµs›êÝÉWAÜ['>e¨ê`Â+± žç¤x—FvÇïÒ¸Ù7¥nôsoB¶D4óo» ïĤ•W%%Ïjö187ùvd…9®}ÀE± žã ÛÉúªìÍ-ÈÞȬs"îM3âÚ·8!„|U…¼¨=>)ˆ!³Ê±Ï¬Ê¼APöœÄý¼gIõÞ*ˆÁà”(ñU´SGí&dKÏÅÛÉ0­m âÕG2E35kSkFÇÏÓz 9ëÊuåšp­—”(W'Þ™ü49ž ç…›×Îm*—}ŒHSŸ¦€ f½¤HŸ ÞF“‰wÊ{#¿9·ÍmΕŠ3Ö½xœ¥l:j×â4Y/qsœ±Úé©]+¶ÍÌ©Çi²^â@íPÕÕ©¼|œ‹:¨£vÉ ¢•½$«³Ê¬•ZðdN^ùÍD¥çŸð ÂüŸ¢µÚ^Éšz¾<›R°¦žæœáÜâÅ€XMÇÑÜû9oÈ–ˆ½Ê~µI7O0dQƒ„§bAð;x •£òlJÁ(+3ã-g£hFF\  ÂÚùH]íTU®¿äV”‹Õ@}+«>©ê"¾ ˆQœBG>=Ĥ•W%™ñ¦ävÈSÏøi]|vpé.æf:7<èb·1JØ´ÏïYâ´ißµS<ý³Âôrܧ~˜Æ¯ÈiÄÞîÛø^·ûQ$½tQÞ›¸M8™¥â«Ný‹W•6¸ã÷C‰Ÿ/´XwxNrˆwM@n¸Wb„œiÒr­F±áÊ-ëE#ôw¡ÇÐí‘øêŠ‹·öb¸;Wï¿”ËKRÙÜïþ çü} endstream endobj 7840 0 obj 2741 endobj 7844 0 obj [482 /XYZ 38.2500000 521 0] endobj 7845 0 obj [482 /XYZ 38.2500000 578.750000 0] endobj 7846 0 obj [482 /XYZ 38.2500000 521 0] endobj 7847 0 obj [482 /XYZ 38.2500000 578.750000 0] endobj 7843 0 obj << /Type /Page /Parent 2 0 R /Contents 7848 0 R /Resources 7850 0 R /Annots 7851 0 R /MediaBox [0 0 595 842] >> endobj 7850 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F8 8 0 R /F9 9 0 R >> /XObject << >> >> endobj 7851 0 obj [ ] endobj 7848 0 obj << /Length 7849 0 R /Filter /FlateDecode >> stream xœí]IÜÆ¾÷¯èsµje‘@@›ä@€‚9N`ÄFò÷Ó3d4$¿"ùæÕÂæóÀžñ¼éb±Þ¾Öë?~úûùŸ¿_¿ûôŸó—áû»O'u ^õÿœ¾^}ÿ Ó^†ŸÏ¡õç/¿œ¾ž¿ž>ž>^ÿûõÔàÓ»?_úßÙœÿtý÷çó_ÿvýåÃ=üÁ/§ Ãõû¿¿wA_ROß~ÿ¯Ó_~wþõaÅÛã†Í<ÿÿW®i•1ÛXxô×Óí5õã×o_~=½î`ÛS:Û(çÎÚÙë:gÎÿýÇé§ënË«KÛ˜à¼êZø3ñáÁ\ŸnµïÎÚtêlÝõðÆOüâY_ó/Þøà“-ÞïœÿX´môÂò—ÎiÔKˆ«?¢¶qÃù)q½ß–ç_<(½ýÎÙOeÀndõÄ TÛö‡æµM“Ûò)Þ\ŽšvÎ~*Â#«3rsh¼MÈÍß-Ÿ`ñV%;OÅÍ‘ÕSssë›áÐl nþ¶|‚Å»”¢âqçì§rCødõ[VÁ[éÌʯ‘¾ý|zýƒvêj34çÏ?]7÷øÌþÛçë¡øó«[Ò·çÏ?ž¯”v8þùÔ]ão[ˆ@RAü»íŸ± ATWk!$”>ƒòCÀ‚{±`ásÞBœ6pµ¶cÛ@Ȱ럯¢9¹T ¡ äHAªæ¡ò®©æ½r$ˆg…D´#Ô& ê3lo( 1õ3Ö¨‘]ãçÀÕð(V…@"»†d±=´öÕh# B‰[`Ío°/ýBð®±…ñaûs4ôÌËc7n¡a\ÉãH¶˜ðYã]óηÐÖUƒa B‘ªÇ‘v"U£8­]ªz[ †r$ÉV…9 F¬Xœ—+~nå¥*ÎMâHoŽmy$d0Õ`K G‚ìN\7ù,“ÇXütj–»ËA¨Ûª‘·s«a] wÕ¾ít5”$#A(Ò›”Ó%Hüò§³Oém1àjz9å ÑõàD G‚Ôœ“b~®`Ñ l•—ƒWÌbÙ© «y¸Ž‘Âç8ˆ17@òHbÓUÛ9$gý­qÒ»#"TÎ ¡øjåcpÕÔÛ D ¹ÃWÓH™@J@jŽ'§ê‹¹7—µ~ ¯–5âÚJ¢@J@¤^µˆHÈ% i•ôI ¤D*«j€”¯¬²XëáZBܯö*)k¤·J % ÒP„"‰“ÈÎ<ÒÎIÏ“@J@xc—¼s"²Û\»ôó™kB1~°õ±€«—(ݧÐËÈj]6ÒA%’¼ÅH˜-ºO Y³¼­¹*«Tm¥³I % 5gॢ?ú©èO ‰ª‡7r$HΊ~§¥oE E¨œÑŽRÑ/¤6Hýn¥cO % 5ÇŽSË\¯JˆˆG²bØ–"œ5ŽêPö–3æë¼t] ¤Dz j€ˆŒÞŒÒ÷%éj¨"] ª’®×I™@J@¤«¡ȱº¼–.”€HWC éjÈk]z+]d)‘®† ÒÕDªzéH HÍUÒÕýŒt5l–Äíù¡œ{*†Mó(†ý$†{…¡ÕÅ÷Û“Þ dÿú‹izÐ7HÃú™}f #m/A·á{ˆîÒ\¬îOw ¤_-\l§ž?G[´Ý‹ÖßÙg;s‚w  ð WÏ=ÇÀÕz ›KÛ¿êŠèRˆ!ìà„,í€-uâTÏþI>½tÓSØXŠ»‹{|å©|Ÿƒ|hM«ŸOFöâ]óœmÞö†© âg ‘ø™^÷´c Í-Ò EL ?WxkîñfñAN^/‚_‚AüÊü <üAsnÛÁz¬“°Ayu uQ1V)gY°k ú#ŸgpÓ¹ú&«V1ŒŸ¡È`X ¯6èé«u1 •ÂP$ñf· ±„:ÑÛf¤ ¤¬’"§ÜBªô‘˜ òK¿ß®ÏÜ-Ä€…»Mz`ŠÆ'úfLƒÐ-F|޳Û’$4¢!‡±ñ‡ü:? »îêH(jÛ`Æ'E¡ZЉƒ: B5µ„Ä£¯á Vc^d+“‰•.éˆY=‚Ès°ÅƒW¤Õcs-Ù·›3„7ÆØˆ"Á Š°6é(*S Æ-¯G…ýtLw)Ôf†¸cÈ.ŸY·lâ¬ì:Z‘Ö€ÒÑI*!¡¥Ç”Np±#Qy–x&þ AæEä%"A‰£,‘H$'—ûÏKj¸·‰ÁwÀ›ÝœH©gtX¯hŽk c¥¡¬NÆÑ\æ˜7¯A€u,~AÊ&!nlR³0µø\„Z)z-bÁQ¨x=E’ÐOxÁ*1Ë”#E¸D²„ä%Iˆ%WŠm;ö¾²9 8(AQ}¼¦n…ž!ι9¸%x\Ó°¢I†m¦T4eo÷"8 ™V*){›ô€‡‡ÂV!º’ ê6æÄ¼6 «Oš"ú(´ˆ” °y#¨”¸/¥dŒ×ÿß–!„¯7ølà³ ØçÌÏ!˜¼Æ#oÜI¢é]ºú*H_ð‚)ëÛt;ÒtꜼìä˜ë&JPgÙj¢*t—÷—y à#Þ&% À걓 '¡=VCJAÛ•9¾µþÕ#ªöíxÞÜx&&‰°kl„†ðsðlfq½Aƒào^$iešîF*–×Ö¡Ô*sVß§WÔ]MbtocÖ@zùp`¡Î&ÞX$Þ ¡0ãŸÄcòÃiÝ0fc(ag²Ó“œ[ÊZ+3¦[JÙª„pÙ‹`¥©Œ'ª¼˜±I[ùp“Òˆ¿ðL\‰›IàL<+*Òñ„»¤ðl¾%HÒ¶S7>]J©`†º‚‰x߬&Òe pÌ×ÞÐÝX;6²r Á ÍSà·øœ¡µzÓ˜ANh3©†&ÇmhóAÒÛ[ãàjph Þ[dåÇÉ´Ê63 õF`‚£ÍÅJ=¡…õ5HU/”PJ¹}=­mõÍ}©ºoR¡ËYÊæ´×%ªßyßôœj\줹t?Òxâ¼'Ê>¦u\cƦ‹Ìì˜?©®Ÿ”d`ò‰uJ¯G?V¶òª´µ$uE1l §' €ÎÛyQYƒ™_srf}N›Tr¼¾Á×îÇL݃ÌÚå“zø*ëÌ=‹Kè¡aŠ'J Lè¡pBC›N‹Õ·)²gÜ2»Ô:Ž-èñ;ì Z±P>ŠU.Nê¶)BØ|ˬ‘Úg¼· õ±¼Ý~•Z¦·ÚŽXÄâ”!L3FîڙȰí‘Qß(ŒH³ô¦XïRR´Å2.:ßZMô Þ知üPõqÞXlÍzsÂ'$“žNȼ±Ä¢2ca)îÀüI…n,C(E~ÃM>3cí(ƒBJ‰ù-Q€Š%e˜I„aYÔ†`æXV+ºfÌsÇ6mµ.êXcÛ&Rb3xº|®V<ÊÖá”ÌmCë˨rÕc3×ÂPÒŽî°°J\Æ’$0¸É[”F£êÖY“ZÈÞâ¾Î-sPâ «X¦˜hÒÇÂ$7݇ÎÜP™Õ…ýXKs÷¨àþ z_ÃÜj¸ç¢ƒ{£\‘̺k|:x×ÌÁÖ$ü¦–­¨~™–;Ý-¿ˆ–uØ#-ã]ãÕ ~TÁiœáŸ|bLË'XVÀ“/Ow)á‚=…»©¢3Ç£ OÐÉXïÁ÷1X#¥Š¸C®ŽÕ푼͹nä}Îú$©»’’)rõªcòˆð8¦oÁrWÁ| É0ø¤½5% åš­—¶hžÔ²ÃÚ‘9ÁQá )S†g礘R%93:„ÆJ§R¤=°ø(ÈlyÞfé w/¥íë/_ ¡~ õ¯”åô‘U÷QvÜösj´;7E">,öTÙæQÆŠ_üXÇZììâ¢=ÚèZÍ`Šžâ¥¯§»'rÆ—8Eß'²7B ^ê¤_­ýá|IÊíw¼s’²Õ²·)³ö'˜ƒö Áì\b ¡Ð&,n¦æ Bv3’Ø%QYó•lZKq±0ehL&’aoRtnùñ8™¢$M¼Ì2×Ù5#E2ðWJÝåÇÏ̧m& sýeÌ·ZnÈt°2é–cü‚ Æ_r“e>^-sëÄâY¹ƒ]åÓ&Ýç˜xq>2 ‚5C‘ ¬Í(U+lŠØ¡LîJßËhB5úMÔY®l Og#ž †å&–Â’+E:8¢3å½XÑþ¢Æãþqøgôcn 'HÆN– ¾q DÃp3žd pÅ(¬œÄaúH¥!¡*¿‚äBŠ\Ù ÄÁËo"µ¨ø 0::ðûPR" ×;ç«)׿XÞÏ$ÏN}·L ‰@<+$"á(•昇±ô%È,á"Ü5$ž m5ŸOèßÙõ„²*±ñS°õŽý¡â]úÃÞòÈ€.TƒÇ}B(2à8¼)2 /?›§‰åq²O‰Ÿ‹{‹÷ÉÅÏå§5à˜UV¹a}5¸ß'„ä `ê#Ì ˆx bËŸ[y¹ñNÏÛO³rÊŸï>!$Þ„²<â§ã<’ØèÌ:=×d™¬ZøišRylíRsDŽù98Ï mœƒ/ÏéÊNœÇ9øÈjpN“ü„8¬?Þg”(O“¸Êóæ>!>cFÆj]Í{ï"•e1"Üa倵õHü}BjöSŽ“¬9kH™‰ž3VaT¹æ—ÇáM‘™ù¹‘jÀü\Ü[¼7HùÊ}ÞPG‚m¥±€g!uH¡jäFNwJ* pºT5TÀéǪjpFj pºT5TÀéRÕD¢8©ˆd‘(y°ÕHUÛ ±Å ‰H+©jˆ@R$žj¥V’Ū¨ÒO9NæT2š=?{%Õ´ùùù8|&üœ™ŸM=8Ù'D*j€”¯Pˆä{1¶Yï·¯½Á[©n,à HB²†—Ó#{Ë8“×{©n,ÀÏRmP?«ÚÀ© ,ÀéRmP§Kµûe­½%ìpÉôŠÞ»…'ÓL®…Á·vF.ͯÁ=Úþç®ä!Ü19%ÊE˜¬7nM/"ܦ‰ïCо_g²%|ë/'¤ÜÑ–ø@)÷b“h‰p•Qâ3'±+åF[Œ'üœÉy„{ä"„LáìL×T‘®{\ºt-¡óʵ¾£yÃÝi¼Â—rsqŽºƧ·ëduB:k¼Ÿ桱`¡\Α‚ëɘr嬃WÎ2ßOÑV·GF–_Ûâ`ìßÏUà _œÙïmîÙ\×-b–{³ž;Y ·’j²kÂH|Eäˆۛ˜Vki5Uú0ë‰Ûã8ÇΔ“Va½v"É]¼ÅOæ0¼Sß1N±)×ã3§x#¬q’—€Ïšrw5À<÷¹Sœì1ÝaÝ­36 5í­Ùx¢p.茓b¬å\¸,#Â.~aVùKa&sÖkxs1YÅ)îš)dès6—¡¥ç;®ëw0—¯zžc—Ú0çööÃ𦨫×ëºo[Rp³zxõÉ Dƒ8Õ9ó¯?3¤¹ô¦Wÿnr•à~VOB <; ß “€ÆéTL˜p ˜Äø IãSÕ¸[ žÎ„ëCtPö2‰g‡¬m`[à@%ƒ¸\•ç§ÿÔ" Ù endstream endobj 7849 0 obj 4688 endobj 7853 0 obj [483 /XYZ 38.2500000 777.500000 0] endobj 7854 0 obj [483 /XYZ 38.2500000 502.250000 0] endobj 7855 0 obj [483 /XYZ 38.2500000 777.500000 0] endobj 7856 0 obj [483 /XYZ 38.2500000 502.250000 0] endobj 7852 0 obj << /Type /Page /Parent 2 0 R /Contents 7857 0 R /Resources 7859 0 R /Annots 7860 0 R /MediaBox [0 0 595 842] >> endobj 7859 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F8 8 0 R /F9 9 0 R /F1409 1409 0 R >> /XObject << >> >> endobj 7860 0 obj [ ] endobj 7857 0 obj << /Length 7858 0 R /Filter /FlateDecode >> stream xœí]Kä¶¾÷¯ès÷н€ À>Ær°Ørrì8Ùø¿Ÿî–ºgFê¯$~]¤¨yaïz9¢¨b½XüªêÝ¿ü}ÿÏßöï>~ùÏþ‡þ÷_vÅ¡.‹îŸýé×w/ÿÂ6‡þÏûº)÷?ü²û¶ÿ¶û¼û|üï·]÷À—>þé{»ÿÓñߟ÷ýÛñ/ìèô¿ìjSÿ÷ù÷¶6Ç?×ßOÿ¯Ý_~·ÿõ4ãåuýb^ÿÿw¾jÚÖ–1ñêo»Ëgšó¯ß~øu÷®#@Ø[ZW·Mµ7Þù½i½Ýÿ÷»ŸŽ/¸L_šÊÖ¾,Úþ™|ymOooÊãÛm[ìs£—Ÿ)Maò¶iâM~^¹:UŒ«Œ<û¡õÆÔ•¯‹{8ëü MÑøŽ@®ðú$zž>ý×Ôñ&?¯\*ýæ ³G–æÆWEG4[´Èv>ÆžTU”[uCÏ#Uø3?Ó¢gŒïž1‡òx~}9â )à—â÷øžÕáèx†žWÐ}Oupæ<Ùœ÷ G œíúóñ7~dœ0=Þ]@¾èÚ1ÿ”@kÔå™DÆÔ 4nŒ8èGöñ•ù¸xÕ®ÍÀ‘‚ åÃg„÷| ßS¼‚^ƒÖÆPÔ}H(µ®š\°÷x¡œYÌ/yP¤,škE¬Er=õÎØ“ÚßAEµ€@yLÆáÙ ñ=Pw9Šš:œ+°&ij11{íÙº(rOéb¼S#Ihe½_†Ó¬Ô™%ÞZµkÙɦ™Ök„å*°…õ æ˜2ܦ Ö. }ãŠË ûýøì#X¼[p‡…½÷ )bïñ_ ünL+‡-6¶pÌ©û&X lg1Š¢ëôt„ƒ<ŠÏe‚VÄ{ ©³ù¨W@C=èï9µæîq¸êrþÃg9=jO V¼¹8jF³uo·\ ^–ÿñ®×ÄÄå?SVÃ=_sp;¢pXç”¶³Õ|ÄM޲dïÌÍBø`±™Å y¾½#.â…KÈ$Ñè†Ë:ÜbF™á y<"0¦l|´‹m†b2›¡{mÀ‹‡cZÂa¶hœjOX 9Œ1„𤢹®¤ H#ë”LØ­!Á2È@òF\¬K?`¢+-p)[¥ A£d3VÛÌ{ëÈ(¾ˆ¶uíÀ ÀE”8fqBW‚‰?ƒQ“ð™‘Ê« Ãé §1ÛBèá„Êœ°×„m.ëŽv8#€ÍŒÚÇÏxG0 d˜“"p1RÙ ìÈaÑVL=a|±q<×N/æ1]íˆÄ5…P—É5XŸ;"}5d¸üC…QïuaѺ!ó0©Ÿºy=£Ì>æœ7ŠœéÂê;%q+Ÿ²°bÁ4~s¤°˜ÊgQFuhxC؈§rl±MØ¿$Ê+Ü"‡›LÀ¨òÊþŠó…Ê[Ÿ…«FFßbûBܾcÌ€`á ¯M@Tà÷@¤¾o÷&6[Õ¦oI±ÀÇ"·LF`åK’YØùþm§‚ù°èRu„òS0 ð*¬ 'Él#ÛÈ6òÈ#I4q9#é¢Ä® Bp%NïÃàëu óÅáœîõúòé;‚ÃŒÝHLëUÁûïI#×$]Éx;»IƃJF9M_J2÷·mDW2ð¥ÄòÅ„4¼6øLRiº¦u*{`ø»±Á/웩—ëa¤éþOÃ}×T]eîÃWŽØòâ@éæåhëòŒ[Sjßêš0­ìˬù?l‡™Èªj¹ªT2ã ­K¼¶Å­câL+£Î›+Ç´²ýɺ4Ÿ½´Õ›Q#稯ò{°œA~Á^Òò^ŸÅ¥_¦a³Á:ŽX¼ „†´ Ë/U3 (”ñÓC;hr]\I± ëÌ.X µ™¸`þ𤀻I ¡*ÓGN(ƹú˜E™¼ ŒˆŒ[G€ÌRÝT² Q`§n~%äHŠÖbZÐ] ˆLR&›VøF—ćʎ¬cd<:Õ*QΧÀX„f a|u¥›êOYîù‰’uq¢D®ðp‰°©\ÕŒKèfÄ⬠JoãhT7˜”°¸I”vhêT:Â0æ„Höé+”ÆJwKUwOp½Åh€'3üJ°e­T}·Z ¤2_sb:S"A8î¹”Ìü{ÔiŸd5¢.ÞÂéZ2'tf߉cÌdµ˜6»ªç3 v-—*"F)üÞ t£Ùò•ò™ú912—ï#dHá…Å“]uî° «z Bp ¯- ªïPýº3¬ºš¯óÑŒVM90£Éj=0¥Rt!•2¤ªwŸµð¶ÄëSéܑ߮:hö'¾Qå¨+U—WG±Ã•™âÐù/ˆüô_T,pZ‚žé7óÖ3-z¦×qGFëj½xæÃUb…Í) ð z1þâ¹Í˜­—å ˜NØêƒNù­g:1¬î¬uÇ~Æ­ïÁt+bëÝËQ·½¦Kâ$²ÝªjߪjT™b¼ƒë:çÅØ 1[„ÛJ™ åkW1w7ĵ"ÅnıïU[L£‹½Š#ó½ÜX:‰:ëLWå¶+»—+K3°’Ð L—Ç æR‡Ú榙 ¨J}õmÅ7× B1EP ~˜¨³neÑT].ÀauÉÛs>%+u‰VnŒ ^ñÍð,‰éŽÍ V[ó&Êh¨D÷oèÚ)3FáA:ï,o*Át˜Øõ=Ì…ë”W?žÖ˜k*¦.ü›ˆ?Ü…2ÉÌ;uŒ©¸^¦_êVïâaŠ'ËK黾Z˜šRÝ3X(æÚoäåŒo ÂÛD[J*ny,„®#°²"ŒÈ)eú–.ß;Qò@bl`H †ó©vñ#ÓSÒÓVµ#c•ÛZÉ·{-'ßíÎj»³Z"¨b¼4&¡rtçÃB€ñª9Á[4=}4=¾Ukk?°j‚ƒƒÍ6Xb çK7ÿ]¹Ç|¥( ˜à•jBü–¯ äPçù€œ-¼Xæò^ÃvŒÝRÕ^w”EJª¯ÂÁ%L f›ùàTÝÈÓaj匸5½á4•l<ŸŸ±\Ý”ÚZë^/ýVá>¢è).àÈ”“w°Ü Ð•J*q›†ò޾Ѡâϸ<¥°[¸Ì"Þ{Ÿ"ÕtCaï0ÇᯃÅ7©‚ÜXˆV%º5„b¢°`­ÀcDƒ‰T-D„/żƒGÚ„üß\ß ‹¨ê­Gö¯Ú£Î}½=¦<ƒœ”d½«Sݺ-‹¡Îfó¯­B ïÌ=o Q±‰rƒÝèÆ 2& Ÿ¡MSÔ‰«µ}Q 4å3¦Bwå`T¤„¯óÛÊáŒUŽ*&%2Ä1›29·‚Ž— ƒj”í;Š10šs~ BXIÎ UƒÅMcê˜ÂWTÂÙò±ºGGp'Œ_µEÓ¾f“°HÑÔãóå*ß -Áˆ0ƒÁ¾¼Ýn®}žï×ùhéMqÓö¢Ô1Móo$fF˜ÊÒ¾¦fPsÃöèÂIµ™æ¤UÆsæ¤Ü±Ge;P´#÷9s…îM\wºUqlXƒ k_Úæõ[7¬A »—¨§î¯$ìÑÝK3ŒÑˉ‘%W­s$ÆÕãg°u%ì®ð æ^]=ªzæ¤?“Ðß®ü '9ÌÓÛðJ^éî«®¸Ë)iû¬ð>ÂÙ„³â¼  Îp,ƒzÇx2Ìc¸7)ã;ÏgÆ2@ýd¡w‰O#‚}†ùÉztªRÇgµuúB9k amªñzAïà“I 2k¦ñÞâ6óÓ<Öªúvy_uÉ{$•30c•ÑU‚”¾¡°êÅ5_Ö9³jVo"£ öƒe†Ás󫸾a⢃r¨äâM}JGÌ¢LÛRÅÆ ¢ˆÚeT†D"6c ñ nX·¬U5ST¯y4r)iŠùR|1»87´›xóp²R•›8PҪ̪z’é´cÉòĆÄ×^dr‚ˆÆæT ]!Ù2L•s©¬Ê;*¯ -yTÍ¥À‘Á‰„Q“Ê‘i:óÔáÏ'81j˜*D¬êU¤:hd›|–3z1“{ž±ó§l£xê$ˆo•-ÜÕùÚ…IBNV@~ò»é€[ǤP'Ó‹ ÐL±ç‡â2ô<Ò­À”‡¢u¯ŸÁ‘×.änìe(¡=¶õP‚ìú¶) t7ÊczXjøBÒ¹êY•ÊÄo!Çø¢D¸™)PÁÔR Âº]7-Ñù ËDˆ›–êæ@C€äVõëÈ\}Oñ?j¿™2p©jãåÜû.çè݆|^SD“‰Ù.~U¾ëõ™«ì@¡)#æŠ.àrK—7tï-ì8¯[ÿQ8í2!SŒcšNŸã;¹ôO0%a(‰›]ÑADª)6Â&@µ.S4À œMØÅqÙG"6PZ›ªδ±À"2ÀÉD¨ePæf†gßnUðqUucuÃIÔ5K Î J·~`ñ–ï|‡ýN6*d’+„L+\àiÓĔ‹M÷2s¦ïñ×þÛ‘"?OýÀ 祹 <ú(…99×{{œèAwô©o˜„ŽÿìÁvi•£ªÆ#}š˜=ôÎý‹}0ÐN~BïqS÷T·Öö}ÿ¥è|]?tÏðù¬`ÏNø~ûð7>ÃàÙà3½{f‚>ýEMX–áN>®øµÁ¹u=¿ ³€Áþf̸ÄNô úKcªš©8Â&Ìo£ëÂz%ñjÇ¡h[ èŸéÕ唪ÜÞý#+“Å endstream endobj 7858 0 obj 5294 endobj 7862 0 obj [484 /XYZ 38.2500000 637.250000 0] endobj 7863 0 obj [484 /XYZ 32.2500000 592.250000 0] endobj 7864 0 obj [484 /XYZ 38.2500000 398 0] endobj 7865 0 obj [484 /XYZ 31.5000000 593 0] endobj 7866 0 obj [484 /XYZ 38.2500000 637.250000 0] endobj 7867 0 obj [484 /XYZ 38.2500000 398 0] endobj 7861 0 obj << /Type /Page /Parent 2 0 R /Contents 7868 0 R /Resources 7870 0 R /Annots 7871 0 R /MediaBox [0 0 595 842] >> endobj 7870 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R /F1499 1499 0 R >> /XObject << >> >> endobj 7871 0 obj [ ] endobj 7868 0 obj << /Length 7869 0 R /Filter /FlateDecode >> stream xœí]K$· ¾Ï¯è³÷–%©€ À>ä`árrÖq #6²ñ!?ÕS™–êS—Ø”ªº[»°g¶«KŠüH‘õæO?üãð¯ßoÞÿðŸÃ×ñçûžš£m›áÏáô÷û×Hw?X×¾þúôíðíéóÓçþÿßž†~xÿ—þ·ÿäáÏý¿þö÷þÃÇ/¾ðë“¶ÿùïçŸýoÍüóôùÏOýîðÛ©Å©»q0çÿþ^›®3ú4Œ ]{š¦)žÿþþõ·§7ÒzéT×IwZéƒè´<ü÷ŸO?õLÍ7ÇN a¶Í5Yyêɵ}'²kZ˜ £ç¿<Í öÆu#M—«ñqäìTʈxëGgÆ?ðwbßîD3mû޵p‡œl¥{Z•ç¥iÃŽ®_ù—æ34Þ“!_ãÏ#g§ÊÀV ­Ni% }ß"/¾ûòôæ“èizèYýËOýàžû~|é‰Ò¾?á]r_~<ü¡’úãáË/OÝÑÈvâðD¾CO”AOšOðIûO„†­ O>~é žVýR_~¢\:Eš÷ð‰L_­æcúj‘æƒG€WØÖþa¦xp> J¥5¼r ŽÓËL#Ôü\9J?ÍÛt~ÓpRGa¾î "Š»LßÇA^i¢P·Á4ˆ7d“ÞO!¡¦HíN$£ëªdìH2œ)¦[Dka ÄïF °vÄ|€×[ð –Z<‚Š(TDÑ'f¨ˆ²#D‰`Až¨1EI4¨ˆòhˆ¢lE”!J„¢”(^ØÅ‘ŒŠ(†(­©ˆ²#D‰ôƒgJØÁà•«èPÑaF‡þgE‡ý Ž?D$¾ƒm’œÝ™-Ôbt ìâ0nPÆVÑ. Úuº¢]E»Uëso¾¤Šv†vB¨ŠvíV­Ï½Åâ*Ú=Ú)y…lV´‹úFcqضÃhGA.¼¦pŸŸÚšé»'|¢p_E¡ŠB7ŽBö™©(5³•„O»`ì§Š‡®æAW 8¦5Áªh°"YJÁ‰iU¾ê&j7þÚ½…­½›Ön|ô²ªfÄ„æ è!5Æ-ü+¬Æ°ºÄªHA˜Ç#À£N0*p#™õ&T†‚b:`ÛèýŒ7CGk(›À5I™:6x Qð±:NPÔ#ä"™c4Ä­YRÜ<«……-9D¿Œª¾Š¢°…t$D ¤Ž¤¤ bFÆÊd=žEKf°ÙºôµsÄüh 6&>aÔ~À:‘‡» ©öRæÔ wQÖvýª»Ë¤TZÁˆŸŠâ%Âþ0ˆCB(‰bà’ì¾É¨%EªIŒæ>v/<¦a‚Fåu}ñʦP OOƒÂ ®^‚µO¡Rä AYiEJ^ÿëå.¸ÎA*f”à­‹ %É!))|̵ԯþ"òº3 ºœäá"HUÄCƒí ñH¼Aq”PÀòŠð-Å‘™\xsO0RhYò‘ìpLØRôq 8œÊ$ýO±@Xļ¶w$§FOɃ oH2êO3…³gý™îƒNãÁõ‚óóàˆÆP,‡RÞÜVÏ4ÉÆ›jFÀÀÈòSx¬v:¯g‚b„°P(˜Ád $»‘,ýÙ#˜þ¼&å~³9rî)…”þ¦rûÈ'k žâ<¤l/"ï¬O3¼/ Ë^2ˆ…œ¯ VàÅÄÔüÎ=-ìåÅ\ïТäJ“ö<¬ªM~Z=AR@}s¸”ÄëÂxKÖï|µͱ¿É(¨ýò{’" !´MJMÄŽ ŠIËëÂcq±&ÝQ¬ßˆû…1s_êe»n`43×Âÿ4OZŸÛ°Sæ~ød\os4A¶¿†ïtè1±—Œù“é„_hÒ(ÔÊÈëR„` ßÜ;ç¿£0U %ñÜÇ}‚°ÈøXh-2jøNd" >n®Ëx’Tècp*â}ú%Û}–rr…Rð„ ÊLW£“Õ,!éŸöfÅd)9­”€%Ó”¥’ÆMW¯Má¶='sf ŽW¿åÂW ¥b=!ÞÉ[ªpKOÓ_ÓM臭N•’à,K"ÉDqK³u(~þ”㬠ּö6O Ä:[ÅlÚnÞˆÃÔL’²§Ä‘nÁ®Ús.#E´°Ë c/Œ£×¬¤ùT9\Þ”sb¸¸äXÁ~)f)ï¹Þ)M©CB`™íŠÇϸ}Uüæfofz:ƒ#ž”Ù¢¿{_`Þžcó3_aÆyá8rœq‡žmŒtÇSÿÎÿîŽÎ5cN?¬çJL{|žbÿåñ“¯OF…è¤ë·<Ó·ÔY+êuý÷ÇÛÓkïmiü>úOúwÎGrú–;kÅ÷ñóÓ»ïò]bæ Í(}¾Ði—ѽ‡O( ¾Í1B9Ö¬u£3»~Ši3ø6]µL7ÁRV¸pB{8¡q¢ p¢]À‰vÆ }†Úà ½ˆ:À ½€zÆ }†º,N´“Ä´'(W¢‹ì2ß“ì|¥d~»¼‡{–_ãɯY”_ȯ]_;˯9“_ãɯY”_ȯY_3˯9“_SV~íÄýšr•ñ¥KKȯ--¿¹3µS~'¿nQ~»@~»ùífùugòë<ùu‹òëùu òëfùugòëÊÊo·;;}éÜá‚nÜZäâlA°NòWÒ­¿Šußq¸G,)úUÀóAÕvƒf1Êýï9]ŽÂ-‹åõjÎ6çjÎ6Kj®ÿé© Ó'¾š{þ–:kE½îcRs¶YRs¶ñÕÜé_Í=˵âÎû(¢æ¬˜Wâ⋱tÝÒÈ™¾ás¨N«š‹«¹W«È«æX‰«NɬS¤Ï  S”ÓË2À S¼‡] qØ ÄaBvqس‡õBv1Äaƒ‡]qØ9ÄaÏB¶lˆÃªÝé”!›+ÄÁr´ú–@åÛáæj‡%ŽHu‹òºÞHé4”Ä^pšdiHmöÝ·Öóã$e•0§Q²xKŽS'$Z²Ô„'Ü*Ë|uÊf)K[]÷uoµÈNLNu$œÝ>‰’¢‰O5gÁ ÞDI’dS2Ï(œ¹Ëªõ­¾žã•T–ÂQ)5…(¥ß)Ìë×!„(™«¼å½A˜õ‹”T¹³&¤š1”@"o:o<µâQ$Å¡(5G‹d3«ÎC…w%Xg>eœ|xÅ.…F3“Ô57AÒÓ V“”PÅ0!q–T’w¯´ó•ô#hµXÍMÅ΃`…³— Ƽ¬h¤¿(»‰Ïç¼/Ã`ËÙ§S~Ÿû; @Ê‚ÙÔ”j™¯ ¢\VI*GH#UO¨ËZjSNjÄs [„Píùª›7ß’¡p”>Œœ+šÊÙŽ>ç5O¶O.æÙå± ^áÓvSlbÏ>ÆêÓŽQ'¾Io÷ž=½ÃÚ! n SÓ¥<)ækRŸªúš×Mð}Í‘­r¡IÊ:Uç3«ó9Äy®d»´ Ëéuî:#àìÕê¼ãk±ðõ›ß@ÙÑ’ÀëN´V6¾"„V ³« GÛßåfýÖ:ÖZ+< G¹~¸Ðv‘õ 9nIë_qÜXã²e—’ksÚÕ­ñÇY ` GcZo4¸HVF$5Uèöf‹ŒëÁb†M3RÑŠ+;ïAÿb7"á#\Æ\d{Ž~#q^Ì Àp— -šÎÇÉ’Þ^a¦©îÙŸIÊÀ$ÐÀ¹˜y°GõÞ(Š}ºå|†9ŸôןR6šëwìXC°Ô ,vS/K妽ìVòê*Ù¶s”ÈYzØø}–Ô:RÍl„³$Ĉw ÇþðB‰ŽHÜ ¾SuKAÝ"Í|†ôÜ P¶|EâQ™Íi%|e‡(¡ý>KB”j.;e#ÂArG’¹qå!ØÏmú÷ kõXÛ.`ZéY`T:LGrX)Å@9n&ÞÁåòßo¢{ÝÊäÞÊUž¶½0‹xˆXÇVUqSUñ=ªb-¦êyw¢Š)¾½HH«HJ¨›²Yd­sO:hRHá’ cêd¹gtoŽý²ÜâÂË:¬”8m óó†ºb¯îÁ-:­'?ñ<¶8[Zø Á¹‚G]=¶Ä3 Õ®–0•±´˜%ìæ’8É ŠÅ²‚¶‰L*ÄyõÜsÆÚ Ï;3x™9£”ÿmVT™¿s>?æñw~Ÿ% Æv®È»½Á((*«Bl0bµFˆÓíÙìØÁX(*I ¬¦ñ®y´šÆ±U(f·íœHA¹?5á<'6’)d¶ˆ¥öI“ß"VAŸ¼~<º™ØcÇWÏŸºdƒ>)nN‚Ó™„`ó£U…ònƒUÂçoñá‘ü†¼³Þ8IWÔOªÀ·ðnLN§ó»òRÛööÖXYЦ<ÀiÁp¬—kákÊ…¢–¤8\îµD©»·œu=¥Z–Ú+¯ó]wî}”É] ñVK㻜`i-|—“ÀûA|)lMg/âa“$Á à­çÉ\⛣†%ö³Ô£Ì+]ÓÞ„ýÜ¥l}yƒA JÑÇ "F/Í›õ¼0þQœ™½E9ö¸Ù]5"¹ êì6ò¹TjYÃÝ¡´Ém=Ñ-¤AÉ0jça|ö€sH‡kqÑr«')ˆ|Pƒd5“±râþ9qûp­‘s\;ùWhlæÞ¶Mø¹ÓþRça5AŸ¬÷½\ÜHd%Ž·¾š^öˆ¾Ô~Ÿ¤k˜F‰]ÈW&\”Ã\P+ŸxÀƒ?²õ²ÔqÛbÔÓ=˜(,©)Ân‘« ñF ?ѹYDë€E^݈£{ŒöñVº-¸ã5F^\þ=ïx#c«{áºÙû¤î…+'îƒéwdåÕSFÙ¥ìd¤B\1—B7 ¼7—ƒT·Èíè|>)4üËïÃÎçãÿ¸•„Y¼Á˜­úGÒ8±Lš¬¡}Þ“_PKãO/»_P+¿ÏGñ n™Þ±ñUr­Z]&ï]¤àÍÝøõÌä€ò¡(kŸÚë³z “=†Vé‹L¿ý~–Ùß@ð…Ô ¥ÕƒS’ã«/±rb6NÌìãÏT¾¨–›cðÄ—önÖ3ºjñÞ•FO-Þ{gîÍ4r]<…K’Š_:Áì§li÷zà}*Îû‚`‘sgœó;bÆœ·W㼽˯µ &‘¿º€òû¬¬û÷`‰e>cò`ñ¶¶©Ÿj C­•êMJö&¹æräö{ëR§´ðL«7©îáKr|1oR¡™RFPÌ9àô\ϼ:ªs :Ö’«:6Mî=/ðu·yXEöþÚxäŒDûEîÅÕ&XÜt§¸`ùÝ)ßgu§Ü»;Åß+vœï.öéNqÝ2¬äì³S>°ÞŸ£¦ÿ{øÖÓ(JÂÏ—¾°‚ÆnÑèA§§R ©ÏYsIìl¨0œ¬Gù z¯Ÿ %íLøD}ßK‘¾—ùêG]²P—ÆöiœiP u\Uœ²®}Î[¬§LpÄ\ãCòÂ4n ¾32´Hšº}a[*Ã~ïG<-4¤‚sÂ, 1 Hua;±Àž˜v‘Çô&¬ÑXFV¯a(÷S*òFL¸,X™L7‚ùOÝ]/1¶QÇmÏDb¤„f«|̽¨R>>?ý¿Æh endstream endobj 7869 0 obj 5378 endobj 7873 0 obj [485 /XYZ 38.2500000 668.750000 0] endobj 7874 0 obj [485 /XYZ 38.2500000 429.500000 0] endobj 7875 0 obj [485 /XYZ 38.2500000 156.500000 0] endobj 7876 0 obj [485 /XYZ 38.2500000 668.750000 0] endobj 7877 0 obj [485 /XYZ 38.2500000 429.500000 0] endobj 7878 0 obj [485 /XYZ 38.2500000 156.500000 0] endobj 7872 0 obj << /Type /Page /Parent 2 0 R /Contents 7879 0 R /Resources 7881 0 R /Annots 7882 0 R /MediaBox [0 0 595 842] >> endobj 7881 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1499 1499 0 R /F9 9 0 R /F1409 1409 0 R /F8 8 0 R >> /XObject << >> >> endobj 7882 0 obj [ ] endobj 7879 0 obj << /Length 7880 0 R /Filter /FlateDecode >> stream xœí][ܶ}Ÿ_1Ï2/ºA{×.Ї† ô!èCá4-‚:è6ýûÕ®¨™YJ‡#%)JÉk%’Éïr¾Û»?}ùûñŸ¿ß=|ùÏñ›ùýáË¡8ÕeÑÿs|þõÃõ_Èædþ|¬›òøíûáéøtø|øÜý÷éпðåá/ÝŸþw”Ç?wÿþzüéoÝ_þl~èù¾jQw¿ÿûå÷¶ÝŸŠóïÏÿ¯Ã_ÿpüíù‹Ãpf2¯ÿÿ]­z™Æ¡ŸÃ2Å˯߿ývx×`Ù(­M]…Vú(Z-ÿýÇá—n€áóÅ©û QWúù‡ø„ªº¡d!ºQD%»ÿèÑH/¿|}?Ä×…¬~ýeîþ #Ûzò럗|OÅyNŸ/~øzx÷Iè¶=Šêøõ—nr/cö¿}ý~ÐÝÿ<ÎîV~ýùøcQHñÇã×_í©’å0Åþ‰¨Ð“BÁwøN‰žÈ~­%æöŽŸh8ƒÏMÔÁãèåtÓ˜pOå§—'¿võmg °Z¾°VŠa2/C q*uÕt2â2™~{›SÓ/3½, BO„‚ïôG¯¹üÅÃË_è“V½d²©=õ¤?#åIÉF¼XÂûRÃúF·aâ ~Çœ¸©¥C¢à•Ê‚øxn˜n˜:ö¶àtXÙ{‹ï:¤Ÿl ýàæt9hά¿ƒÏŽC7ó5|Fè±UV6¯iB³7UÆ„„þˆpK ·eýñƒŸ`± …sñ~¹p.ð×à¬lÀd% ›Z±|Lk¬Š9V çÆœÄ”wNê5žþšcˆ›å sñ­ÇwÒzÓ§7¬,(ëÖùj¤}5_#„(u5"© ÏýXT&`û¶jØ…Ì/¬¼;ì#hNú±œ|Ð~MÊVÄF*c¾B@YQŒ)µuØðMv`úNÈRÙó$Ð “pÅ(Ô´Ó g Ö­hfo[9¾6b8.I Œ[4¦xxÜ¢y ·X ÖÑ…Í1Äx=><kVÁ·A—ó·Áq²çKj‡œÄt Ç÷Ú–PÃÅ*Ô‹" }F –ÐnX¼[ÜŽ£¡ý®á äñŸ2üGâYCŠ Œˆ$üDâÝÆ_Ã瀈-`d=vR80&Œ-`Ï8¼§x=Ž'X{Âø aªàØfüébsXdUeù&‰LEWgj °ÈG¯Ìï†ûáÜ'³.fK)0pŽg€!à¿4Ãò4€ç@¾É<ϱ„™yrÌk‘˜në<øøá¯a…׳:óÄç¹N%öja¯#¾Ð<Ø›¦î‹¿F°»’ÑVñ¼?„{ßAFa1AP4v9ƒå‹Bg–ÿ&–¯°£fL¼ÒÕµâ )8×Cè¤TD$#Â2 [cŸz§öÅØÝa+R”íÀœˆ°ì·ØÄW¤¥âpJÀ¥SŽ3&J%–Û Ï ½H'L|&§Âá\à§…Sr8œp2qЦ°(Ä‚9)Ž„$VÂ"¤.Ñdý%]4GÑNöT=»lvi4]QœÊž{Û\}â‰Yky’UiÝ>½ü³è©wZ8Îãpâj1yÇ&¾f4݉'f‡žEF«^»l!uÌ×bäÇH©'¨Â:ÖCp¨2ÖÒˆp`…!¬@Í.ÖJqNM¬[)ës< L7¥Dwâ#–ŠÛÁ" ~Í„A$:¤ÎÛ…„q}G$Tè„´wãfÀè"Œ5Ãp(í±b輄wB®½€7o4>2ŠD h^4Ö}3L&|:Áõ) š3éW¯kƒežIª'Œ†,ºHÑ¥Å)6ص‹rûýΧ¡Ú;(lg7BÛcÆd7º”·Y‡×4ZE¸†ñ 2`Ù@s6„²¯$ûJª°^ l9œ ¶ŸOì œEÛ–Ö…‹ Âö˜1eJ)õë³5Åçp´5£@b™ÂTãÁ¸ Ž`”[¢v Sôdo2rÓõs¦hKÜ$]â*;4VŒ¹ÆÒðÊê<Í~2BbóMž×4e¬EiIØ«#xÓ‚ÉNÆê‘¥G‡•}¤‚ë0RÚc®\ÕA*mM "Ìý%¶ÀyVÊÞ,¯A; €sʺñ¶—P;–öFzñ¥$SûeëdŒI?äÂE§ <…KF©3ºŽ²³X=" P:ÂÖƒä–r¤ƒlé"Ý”4S¼n0š‚þX“ð1ñD”ð ƒäPP& æ‰~õ=|Ìð&õÏ£B<íÙAÉmà0’3ô’¡ÿ§*C/»ƒ^6}zÞ®lÆž2vŸ¯†+<ˆIØŽ†JVJ¾¾ ¢8U}þÆý‹±cS 2‘Ê¢„#$âV )åhǶç}èØ…$\c¹2r)ÚÂ>qi"—¢}â|"—A‹‡7Ó¤÷U_>#—¹ Ã5´´¹Æ= —º¶yu—éÇvSŸOÑ”RÎ^ʌǠor DmFD/ _¾¬$¢ý¶~L0fÀQÀ€±•"Én­–¯ÔÒMù|ä&1Sò¬h`ÇÇn÷Wð´»Zo‡ÑGF]x‰hkG 2Ã[˜"D¬ÄJbÆeq…-j"+¡×WÖöú‚«¦¢¨ìAc5:òÜ…Û–TÝû#K˜ c&È>1˘¿âõ9ß‚tî%!„bä ¨ýNxëUç`MàyNìsô­Œ[ó5$kT…µj¿‰bT—?Z]F¡_ ÅŠü6ôÛGm†]AVÊ$e_hš•ªð â?V¨eMÇÊÆÝ¾ãGé#jfƪÚp381(Á°§Í@0¯sÑ ð[o’`RÃ'û‡å(7!Ê­m#ê~3L ˆ5cø.–’ÕV-ˆŠu [Lºíð¦*®¶©çôg<·÷ö2|ø˜¢õ0^­ò­ßRùð4k¿•òêüö¬Â¥S²`×SžªKýžX•Òü–_Ì)O9åéÇœòtcVÏëØhµ™ú\ôk‹eE÷ë H ˆßý¢FŒÑ€që€é N÷‹².xšÉ#ª²Ñš˜³ª…¶˜1ç{æ;ÁœSöÃ/ =ÂÇÀGê©ö#(ë<«çm%è˜ÝWçÀU^Sj[MÈîõNÍN.&Æ—h5~=ØÐÁBøƒ“!£ÆNé•&j\_Š…bO7îîîùƒÖYÉôäÀµÐá¬÷† ÇC×Îeyv"Uc)ø`Ñ‹4D NR áêÝAD™ßFq ì¯X]·uîó´~×m8G×í ²údvjØuÛhSÕI i¯ˆ½µ›úl´$,¥=÷ÖŽ´Òzk·â<ÍÜ[{‰\ÝIoíÀJ@L{¢Õå8Uý«¦N±¾·¾mÄ@ÜÜ¿zŸÈý«g0BϦ[Ø*Qœç²m­û&½•§ÀÍÿì1# (Õ1”a¥¹5׿:‹.‡èRE©†Él0Ð,Jÿê+…g7¦õÕ˜QÙMÓÞfÛì_Ù€‹ tªê@¨ŒˆûÁrÿjŽ×ßEÿê« C…µÇŒ)SD%^Ÿ­)>·zŒúWc9Ä Õ÷"#©Œ¢HÚCS‰&ÙÛÁ‚܉d¿çø­]uAVu@ÃKB©í1™`9FßñœRÄ„*/Hx’ Ó{ð¯ö  !5!eéà3»ªúV‰øÄ®í1CWp#¬§1îï7?`}Õk£ÝyEÂú²S®õGUxñË·~¦lJÕŒªf$“˜ ¨XŠzˆj…[’¤ue«á%i]ÏW[C·ïÁû ¯U³d¤Ì~Çï ¾°÷ʘ=¥!m€}Fk¥:»ƒcu¢Ç¥[üö¨ÏðêÁ«{+3•²ë$—™rEg1½?¢9dÕ¾>®÷Ú>üŠiÖP6íïwl{Îo1:vª{Ì]™£²ØÆù• œß cVö˜»êm;'¤?w M³Nî@›;Ð^/0w Íhß$ £Þb¤¹Åm@;e%o[×E ¥{QðIî›;ľ‘3Ý[‡ØÕÌÝBµ¶íyÝc‹¶žÏ6ã¶ ¹l¡lSܹ™ûÇn< (F!Q'Ä9Rc‡,ÙÌ×¥LH\B@øÕÑoþ€þ%“ibÆÔ,¾UrŽÐ#äð(/X«Z&ƒd¼!ã!$º*KëȽÅú§òWï¹Çª`J,Æ0 /Ed“ˆ~Q—ö«G¿x®¶‘£_î(ú%Zü€:×cÞbõõC +þUiíR½¿¶ÇL&q¿&å[PϘé¿·nÈ46“§xu¢Ó«wáÀj˜Z{ Vã·G9A½¤Ômo$aŒr ©6÷ƒT¯í²Ï ÔO¥ÇË ³å{N»_ –g|ø#S6¤aÐŽ¤å‚Þl x;ÆWƆ·×Î6£*áò MX ¡i•µ[šÂö”)qSÖƒßá×ÌÜžÞ¶*|X/|äYØín›:ºAض£1c"zçN? ÔÏňŽ‹bÚ—ãLœE”q»œÿå¤AÎÿržÄõ±X­äpøÏýìàr¬zQJS@f,/#.42« š±53V|_.-)ùJ—ÖG(aWÚcî+Ÿ­®¢ßTÙŒÆ\­¼JÎ »Ã 2Ê“`x|Îþ™q–6˜ýS a˹;Èþ©j ÀSÛÒ=–’•d¬{ýv–~…|ÂéÇ›’Ü1±Ìnï[ËLŒ– ËÄ( ÑÈQQ £[x  <£P'HÑ”ã­Ic­4#½éeïÜúHoYè×Û» bœz±R/m“&<À«Fcú ·áuÚÐqŽðqÅ£1˜ѰgoÃè0hMˆ$¦Àèm9Ú%ì$ÆÝ³‚Ÿ&i!.óôªéÙÏâ¥^ct2_[ƒ§ê×ÑE|§…ÇÞL0GÀ+8ä ×èf-¸jŒWÂ+R‚G¢§zZ™R®£[›CO =­eaíÖ}‡žÖ#•ÄO)."šß³ïj-ŸÀtM§ÞÔõçv‰éë×5ã·'âü’yAÜ9A«p‰ÊÞ#„ØG¡¿@°K:“Á˜²Î mýÈ[¿E¢aÁâ]…# ¥F˜{p`y€ùå Æ½Á Ã°UçlÒåpÆÎÈ]˜Î8ç,m0œQ™”Ä —¸‡pF]V6oôZq0.¸b÷¹¬´½Ï9œ1‡3FglŽ¢ô¼&T•߆½ë W,ñ=zbö¡<É‘gB/ÇìÃÔ;-zÇØžïÜÕ;—N8­zý¤?q¢¶hÎø5Ãõ¦Æ³Æ_3±eS_ƒûcöú¤¯˜z§¿©ÕI i=µ|Ö˜ãÈf{C£*†~¹±‚T›*9ËÔ [sR` Sô6¢éÅ\ñàã¢@¼ùØ<–¤T•³HÖåèe<Ì zÁà'ðq sGÖwĬŒJ³2ŽÜ¦zã8pcû¡»çkì¢Øe-vü9ÁÐlH=¨°£¦ð¦™i¾­¤eáÍËÂdÄlöæKТŒvÜZ‡;BŽÊ3¦Ô©Åù­ž è¹S~‡èTeKDÙRë¡ØÞ»„v$ ‹FáY”Ðö˜QYT#“aQŽÄ_‚Ý8š8âh=‚udæÅ¥÷¦œæSh]÷çZTu¿ŽO#rò©Ï·~`ól&}Ä]Tˆg$÷xñ£õÔžÂÑzšÖ²«¿[ò${?ÁèÌWã'êѼS\"UhuK7ŸšÛ'³RÔ„›hÚÞæ©É^€ÑØÆáKغšX†À_ƒï˜--ýÊyϸç?w36ÒNÁ5á# 1à öèxbÚ9vÓ›Ø#ƒ2é9Š8ýÌr¼ƒg€9 & Ü|GwÖ± ü|ðÒ›·ß˜ºP'Ãm_]È#%ŒL•åµÜ¹%sŽŸÿÀ†nÇ endstream endobj 7880 0 obj 4596 endobj 7884 0 obj [486 /XYZ 38.2500000 486.500000 0] endobj 7885 0 obj [486 /XYZ 38.2500000 486.500000 0] endobj 7886 0 obj [486 /XYZ 38.2500000 689.750000 0] endobj 7887 0 obj [486 /XYZ 38.2500000 689.750000 0] endobj 7883 0 obj << /Type /Page /Parent 2 0 R /Contents 7888 0 R /Resources 7890 0 R /Annots 7891 0 R /MediaBox [0 0 595 842] >> endobj 7890 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1409 1409 0 R /F1499 1499 0 R /F8 8 0 R >> /XObject << >> >> endobj 7891 0 obj [ ] endobj 7888 0 obj << /Length 7889 0 R /Filter /FlateDecode >> stream xœí]K¯ÜHÞ÷¯è5Òt\/?$„”›Ü ±@Љb2 hÄŒ³àïãî¶ûQöWn÷TÙÝ]Dp}íz:ç;ïwüò÷í?Û¾ûðå?ÛoÝß¾lŠ]åŠã¶û??\þ@×»îßÛªvÛo¿l¾o¿o>o>·ÿû}s|áˇ?·ÿúßVoÿÔþ÷çí_ÿÖþðÇî—ö¿ð˦RUû÷¿7•jÿUœþÞÿü_›¿ünûëþ‹ýpÝd®ÿÿ¶RMQî§11ô÷M¿LuøóÛ·_7ïŽ0o”ÆšZé­²ÆnUcõö¿ÿØüÔоØ5V©ª´Uñ–”)Û¡¬)ÜV©R·ûî#þ}_Åøº«›ˆ_?Ì]~ctS…¿.sÀ•nGq®®¶íˆí½ÒVtÞçeàøñZñ>~˜¹ø®´”£F¿þyÎWðT‚Lè{àÅ—¯›wŸÚËRn¿þÔÎì0àñ¯¯‡ùaÏvtµýúãö÷í|Ô¶_Þ¨bWVªn™óþ÷ŽOôáI½«Û¹jW\<±‡'vgÍ‘›ŸŸÔÇwÎ?ø~D7p`<%8Ž®á Üá‰Ù9[îW~~¢jô$0ƒ =QðÕm¾ÙÝJ‚Û6®3<–ÁJø®ñoC1xs,qØÇ'Jõ“»aÖ!ÇyýÚÞö·]Te tW²ÞeÕVjX8¦öÇTáÑÁc0Àðøó¹ •óù$¦`|uæW¼ž¸ž#Üt»ü+ª?ÝΆáìMžXM°Ç‘"=Áì˜à+øTôkà8˜bð8x»ð¬ñîàqðfÖþQvÜD„q6èöÚâxyKÓ쑚ÝaÞÅLFžt¤5öŽïàq,|âÐ[¢'ú~í=±ÒbþJ‹fþ ô+|RÃ'ð,1ƒŽƒw‡9ŸžOÇ™#Š®á··ãj2J÷ âþ~FøáÇGøÎ»¬)¾?fJ™ÜׯTAy„ù*–¼˜³cþy>!E‘Á YФ¨ÁˆŽC±üµd²ïýè¦ùèÖ½€ÇâÊqfThŒ °ÒM)sI< ’0•wõ ë9i+Œ9Wz³Ic…œgÝ˶Â[Z¶ÞB1ÙV(¦—Ø–ãDY^Ö>¸SX³ ÏÖ\OæqmxÇYcÆñOƒãïê§Àñþ˜r’·ÞªflL]‡¬m?ä‘©ªbçŽ ÷|"ïÑ“îʺ.ÝõYu›&õNƒÞé.ÊÈ“Ž5”;£´Gýp¥êHaÕÎÃØ;p…çVœnLc®î…†O{ð‚Þ1øäˆ=À3ÐÍ ° ±£ð<·ÀÉÁ½V¯óOAìEÑÑÐwÓ àzŒ‚3À'×ÄfTõg(­ûYö€¯Ð$£g҂沓ÑÖÕ‹/ÞE1I*Ì€„w—òÔb*¾á \Þ T”…åƒ2æÆ€ ºtL«30÷$šœu}ðÀXÝ`®‚5Ä-ìù܃Àîà»ÇèX¹œ’Tå©­¬'Qñîb%8ÀgØqñÖá ‹X… ;n`¼Îû*E,Ó¶RåN±á8>°-".?ÌG‘ÆÁvBlÄöU<Œ}Áëɖׄ–WÕô¦sÖ-}nOàøÀÜ&2›ÃŸ¿OUI9®Ñå)ŠÁ¨-ÆdÆø1\߆¬›~ùhçN×ÉS‰G‹Æã¾²Œ& â3¬Ž`œO¬ƒ?±>M¥PBÛæØI\ßUi”}1Ê„È4ý-æ•‚+¨ ÌUÆwå—<@¤f&213Ê(4¦®Pèý=qòGÇÅ3䤬è^'òì¬1§‘Œ˜·Œ 3£¯Y,Ä_ÆjÜqá˜RóY0o £®.ü&¢UZÛqØwÐÚ4#º!ºø6^­2l[5l dÕC?X €”A¢^ÉÀzu¢ut]†>”U6j[á3§ÁUb8ãËäã0dĤVÅ££€sàªçÚ{|LŒ7eˆ§äs g±sqovN«ü¤M›Œ|@Ué-oŠOU¸ñcˆ:fãùDjÏú &ÄÙëÊÁí‚OëØjlø÷®ÈÌp¸Ð*âg@uü‘Åó/¾~‰|Jù^óM“ vM4Î0¦iQÕ‹©‘!±;A­â í©¦ÝÓD&b=8–‰?~ž½Æ±ÞÉ"“÷]DºƒÏ‘ÉO™œƒ}̬<à`Ùü^BeÉ·9ðvŽ™;¢äs-Œ¾}ËÐS7ö7<œ^†Ù#NžeØðíL)ÑŽœHR²(Œ5c"Q»d,Ž«êJ4S÷ÃâÄHìÂï`—l"¢±¢õ‰ø1ƒ•@¼R¬†~$:Übîìù¼;bµqn!Ìs~6Öq¿$Ö¿¡m8|8NàˆáA¦Ýú¦‡( /Otá{·Døæcs ¾]˜”˜{‡÷ÞüÉ»*D~TÉV>h úzdiG3~yk¹ÍiKžF‘1øPRn½Ó½qcyEoÉó(2²Udð8+Ò¢ë¹Ou…¢ƒµ«+ÎV“ÊêÊ3©+Äó]*L +~CžÃ‚³~25Ï•¥¸š7Ñg£Ôý+è³QÂwˆ>ÝŽ=aá~eÙÛp·Õ@¨ÔŒÔ¢ OÀQýÅ0ÞÀ'ý¡Ž4¨"*æbÓ7ÈRŦe«³Ëô§j½Ë¡Éc-'êÒ¯ øvB§Z¨0 }Å‘3ˆ‰Å¬öZ[O~RÁapSEÛR1èá2Rd?»²ðö¶°]Ç4)Æ7\Ŧ¦R5>»«äQ‘"eÊækË–áxÔÓHÖozF–…•¸Œ¯îR¤na|“˜,c3±F©q&uLçy2PQÓB@áE`b&èÏž©”L!dšÛ1}ìEÊ•1e‹0t$Pw ð_÷ ÖV{ÊÂ5|”6Ïc•®}k$à„©õUá1¾yþ)¢A”ÁA8Ctn zSp2¼eÆ‘]öá@ "M ûÁp©ƒ›˜á2Ds1|¦Øw(€Ù žâÆÜŸÀ܈pªiq Ø{Çx=»ƒ}ÂÄ“då*Ó;òd+Ç’ eËɺ–7Z\~L6¼lN¯DuázËšFuSx·(݈CwVVÔ…8ĬP\UÞ&¨ŠÜuÚ9ù(¾c‰Ôöáì Åö>ûMR*/.Õ~¦éíõ ek QÚ¬ ,ùØå䚃R™(ïbŠ0+tV´7§²0P*+2ñ5Êj!*“:À›¾JÆó8À5ΞÎðìϧ}É´Wéh§ÆÁIÞ¸úÀâ.øÉÄ•®‹Û:‹ ܘ²ÀL ÀRÅÔº/Ó  Ò=d5c‘€`ªô»©xL"„>U›ÏÚÂ3€‘rüˆ¶¯¦êb?ªÁ«t„»”Ò3VÛË#f>£ª<6¹|3Äå½à+È&|Ì ªb:ç<ÚÝ]sÛ½Z¾Taÿ™SK‚ Ù˜‘Tít×ÌÕVcqé ×¾Jòp,uŠNX—¬oXTUx_‰ìõ,šÆW§ŸÁë©\íÃãD ÐÖ¨çÝS”Û¢-}ëÒ\ÏxI· 6eâq°ÝßàD+e ×ÙIðL.¡t¶å¦ïÜ3ªæÉ‹e3ªTퟓQÅ)Æ iÉì¨}zžݨ 죠ÓÊÈ@ BBf9zµx<¹Ê (Œ¨…Ï'¤+ 4SÀE[d+1¤ÂÌXWÇ”ˆ¬Rá«æÔã)ã«{ÄWçÇ´5-°¿|u±_‰á«vØêz¹ÑùiÀö‰e1¶ÐÖ–Œ¢2ŠÊ(*1ŠÂUž°ÃF‚»Äd®°'ÓvÆd÷‡É.Ï $ÌTps%8¼(ò*ÆW‘—òªšëåÆG^˜Ÿbù-êçÊÈë^‘W2©ÔÉà›eäÊÈóùüBø `éyŸ~¡KzÎÒSNz*—<9—z$¤M*‰›#K2‚x6QŸLšAÜ#‚8VXf¸gÀ®ñ)=c 9l¡uêÔ€TÃÜ>± dÍüñäêš­þóÁ}ëñzpn¦×¼o'½¨ç£ö@tZ*·—rÇÝ/Ž»8?¦iŽFÁ¬pÞ’‹U? &‹Z ;@g¦¨ýÇúñ„¡ÚîºÆìŒQ–ãtµÈ€¶%rì“ñÃ\ú&0ëaŸN¢B<Ê\Š783¸%øÎ2ê†ýØL½›°kìÍ2Hæ3%)D+LÞ…¸tV–>Ö (6˜2à æŽ@!f`£ã£Ê4ÞNM¶X{tÕ±ùªŽÎ`­ ƒ‘רGWkŸ­LlŠä.òÎG7Ëþš†s³/± ¡Ñƒ+Å|Rƒmsò±OI_)÷-vcW,6Ra£¦ƒlÊ}8Sn2Óš199ìžMkçG¤sQÅ–W`Z»Xõ“˜Ö’HOSö^dÌ5 îL:Á5qqíÀ8ðr¤Zi 0+7’—n$/zr½Æ K8É ŽC¹!3íp½°&FXúdÏ£Ï]ó'W²”kæB´0„I0öTìo}2o sM×c¨”hLµ“þð“n;(©è½ ÛGa…åñÏ(圪ÜåýõÖµõ.\ÀiLCc„Ï’ú˜qÊg@ñ]ÐÎùg€¯5$å€ï–éŠßúT%j9O¶ù{’ªnyÜ¢û©¸{ A.ÑV:°&T@d#ñçqmtlïKâ˯ ïêpŠ5~B/Y²|vÙùKLvží‰)ÿNHhᆷD™ùŪå/[wê®ôå%îòÃtÅÀS,¶¦šŽ¯’¢Ešùº$‰vo§za0ǽE­Ü®hÌõ½‡_;be¥ûGÌe¦B˜ca(2®”ï‚vÆÎ–ÀÆsš&ø¿ÊăPÂĘº¿³|oÛ@Apn<Úµ4"ŠìéÔÇæz·)ÝØ€š”Å{s¦,Ë1­èÆ·ODû ¨¨XDaq3õµ¦ÔsÆçòíë¾xªô¶߇@ˆ¾]‰nqGÎ1ï]c|â!OÊdâ¾/9­¿{™Î€éSãtuLë)’/€¡2ãÍG’:óÌ-Ú)c£|Z„Z·¼F»¼EVß2ƒ}rq)Eƒü+l•¬øvSÎpc Çø5–”söœ‘#æ„WˆÜfB]¡^¶|`ŽQëd礎Þ’Ã[æaÆpÀ'²)ߌ?à¶%Þ쑪ù´zˆê#î)®êl•Ï!ŸÁ!n»"rី˜>§î”%#lö'dm0Ì®Hm4à/ŒÇ<ÀN´"åð ‰OŒÉƒ"ƒ/)þü€ˆáÄTfÆ3Šùèœhä¸q>ŒÅ!MM«Î§pfâW®"<™¸L_@l}žlk_<ãЄ,l{q».ÔØöÍp…ÙÜÄ^Çô2ºÓ {­D…à 2"%{UÒyU˜¤š¸zOí«=|@î €"C·ø4)º]s„mæØÉ9¶ìiÌ) î Üš¸Aé >§$ë(qžoL+M[íqAÖ„ ; 0õ¼Hl$ ½7ð‰>NiVPþ£Øž$"`…é ÃæQ².Ž»$šr4#©–±©ÍÑ”Ëíí†aÆnE iÌ}xe#¦¼kOà §‰%ÊnbR8ãÈ&X¾%tŽÈ ä¯Ù{0æHäö/†û‡Í˜)ESÙ›Â$¹3ßí¹sÉpðR'€ÌÎ2©®iãscæœì§x-×Xãg1R#üò]@ã5­¸>!+Vã=TÿXa§ÔÞq´Ï¬!‹+³á‚Š8 'ibG&.ç-:N  ž ¼ÃÌMv¯qóT¤XäÒ„“Tn¦‹ýßé.â¸>ü5âÎàFTºÞŠO‡9à~üÄÀí:̧¡W¯‡/ã`œŠ+㜟–c¨œ¨¯Že†Ãû÷`õÔWU“g¨¤ˆËãÕI=Âü'õ3`fmˆ}Ó&Zƒïà'˜Ê»#Ö>çúoÊÉù¬I¯˜cü1“0e°<<ŸupìJrMm'G5¶ß¦¿öENJûgû½RpÆŸ§~á»M=^NÁì µ÷ÉoõiEGƒã˜_æx®ÕˆaàHsz§þ‰¡´,‡OºóÒ».&à‚ƒg€“UFÆ1SÞ†±¹}êV:Ìj,á׺0Áó” 8YÕ-}°ÀŽáœlÉY†Â_ƒït*­šµô ²e nÿïvÆ×ªÚX\&÷’@ƈý‘'Þ»À‰ãý&Ψsö‚"¨Ÿ!¨À;x˜ÓàMÇ‚/âàΖ?‚é/½~û© ³ë¸íÕÕ> endobj 7899 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R /F1499 1499 0 R >> /XObject << >> >> endobj 7900 0 obj [ ] endobj 7897 0 obj << /Length 7898 0 R /Filter /FlateDecode >> stream xœí]K¹¾ëWô9ÀÊÍG¿€ €íñÈ!€a99Þl‚Evgùû‘ÔÝš¶>JüTdSרµ×=Ý,‹õ~¼ûã—¿Wÿü­z÷ñ˪oÓï¿lêm×Ôã?ÕþׯÿB÷ÛéÏU×7Õ·_6ß«ï›Ï›Ï»ÿ~ߌ/|ùøçÝŸþWéêO»®þú·Ý_þ8ýÐþ~ÙtªÛýþïÃïC§vª¿ïÿþ_›¿ü®úuÿÅy¹ ˜·ÿÿƒítßu{0Î,ý}3oS~ýöí×Í»a« ¶é[)kvÿ¬®þûÍO»æÏ×ÛÁ*Õµ¶«¯Y¨Óû•𾫔vh×v±Ðá—ÌçU„÷ªŽ÷ñäâXQ¦Uþ¯oûvúþ™\»?àlv”¥úêYE]¹«‡®,GÐÚ_Q4Ë…®&‹WŸðqS7ñ>~€\+A{¾.y¸¦kG M ôÏ_þÃþ£Îri¤ÌG ?.y²6zT9ôêó>Þšˆts€\+óÙ.¾þ9ä+”Ú§+}÷¼øáëæÝ³²õNJµÕןvÀÖûºCJSý°WÚ¾úúcõûHͪ¯?o†m«›Äñ‰îÐeÑ[£'õGød€ëôð[M|Mê÷Ԣة?| GÁuð~êgøµ6L½Åúº»¬ÑïÙNOÍæfÀ31†x‡  éßÀ³Ç·¶Á;…ïx öƒa3ð3HQ"=[H¯ßY¾˜ê°¤ª·m§ú®Y\³ml»ðjÓÓ;fkt¯ôeïôðÉxTý¶êF\æÒÌË\ò53ÂÖ¿œêH¿vkÍèqïÖ©'=Ño®£LøÖñ:Ô×ZøŽqéÙ`ïþèâ/ð24Œ6 I‘c%‡¡Ù%R˜Hñ\=øÄs7àQzè¹âøx;™;è!MHLž¯-‹rQ}Ãm˜'´Žî!làêIJÎõ•¶§äœR£œŽK>eÖ¸Û,¼GO&l·Û¶EõË;-|g@ïØ?ª[H͉ÔO|Í@ئËv ¶Q™Tv~tÁ:“Dï¶Cñ: ®ƒ!ÀØñÀ†÷ó)|éÖip ð)hÛüZK`gõ“Ã;õ@=›5K¶?À›op-¦6#v²wÃ9üãîͳøDE7 úÃÎÓÌçiE[ë!ôqFOQd” ®cj(ñáJzc38¸‘K;+˜Œ"‹a\,ŒQ€2F{ @ü¼Gwƒ_ÃÆkÀIz,`âþâ…=„/¨‚†Ñû@pF—Ê(üaZ—¼ Æ7@„g~Œ-åìät}%çø60çLXÃz|¢Ôü¹Kð†!¸JŒÜÆÈ÷K¨,l®¿“Ú:VÔ}A)3Œ·ç õƒq.2êu;¼KŒÇ»¡0aäèl/Ùå%Øél.¢ŒTíȨre£Ë¨T±ž¢nHÀ°ÊûÁ¥!l‹jǤ´ªŸÝmÜ F 0±Ù[ÃÄ»V έï¦ZßP 6§#ŠMezãÈM3'øt ÷9òŒïimì öáÈúÀ° h²1HÏ5†¹$>*¿áNmZv9c²%dE'Ç(@þ3øc¤ Ÿ†hªÊúKw/uå’”Îäç ý0­jqª*NÁÆ)¾8™¯ƒSaz¸ÅI¹jü‘4íIÙÄéÇ𼎆ï˜D;•=…Éøˆ¨uzOâm­ÊšJáþðp\ÌDbu‰XpÁ ¸Ó…7šÊ uePJiä [Jd¼W˜_aèb|*ÎÁ+×1àfp¸o†$'ëúõ ûòP£p6r†Re5ž.šâòÀöÉúCB ©­ÛÛÖ³=ë`û~Íc%B‹Oc+—aŠÚÅv ß³í4´Åv愘«½¿\AZß[Ôüå9cxYhx]Q‘Ÿ™¾sZÀ=ôØü8¨„é‰Hlȹ¶x=V‡³»ð5gXÝÂF“-1g,>Ñ:”ê´2êT/O·¬Ìb×½"Ô\Œ¸Ÿ®SÔö‡RÛU;7|)j»H%3_ž&HöðW¬‚b«`¡“¨Îá—Å*(œ´÷ftèzîB–µâˆ›óaµ+éØèÀ *Æ¡ò3‹Ê*Ã&•_›¹—jQùƒÓ›*DÅc[õÇLD&í7mdw}­3(Íâ^tCHLg3$âö±5½r˜Ü„’˜ƒÁ]3A”bhœ5qÝÌz©ƒP6sBÁÔ[ê’'!Å0Œ|¾cèê1ò‚ R0%ìøp5>S¦u«D—€ í u}%8 9¸¬uѶO”ô(ÿ¾²D‰S$0lإǔ6ÉÎI”êéq¬ÎÔ“µ·Jeâ¯&ŸÏ ã+‘­á“@q;¥Ai좛U†‹§g4(™d]O¢*|’ oÅÔ UˆfS³?fSsÅHY0‘˜H¬Ä ¥ê¶snDüPªîk2½>xsoÛ’äU͘¡è¶uÏlµFy8|ˆ­¨Ûäœ×D«o®;ݵtŸœí(7‘»ü”6©Þü¤Ò&õÛ¤¸¨©¹$ÑÖª©FÔRzf*ÉßñP¾ ˆ?|é•ìxàÁ”’M¤wyÒ"aÂÜÐg±KØ$˜‹0ížoaaªi—TÅÒåô—¡:€ÙPôYO"u·çR¼V ë¦uÄNÂN¦—¥êÄ)Jr'“òLLåó@ÍDæ ïèrìáà\ßRef>RÚ f©qs+RÉB4Yÿö‹Œƒ%¦f-/ ¡±ŠHÖé8Ü̱Ù#ï‰f«0=Ã"S¹ d'µ¬™`»ÙÑÛUáX²§BG™‰FVžÈ4Ž€ãý”!YçÜÓ„Ú³SœóA”$xpñŒÏ-Áxƒ°á¯y·(Á$Ë-iꌌ²T?ŒAn̘#Êûânƒ>óÀcŠÖ¿5!“í¸öùaŽY¡Ý:‚/„wÜäT$)+Íиx%:•Õ8w§¹àwð˜c Ô“s@¯že¶qµ\-·ß)‡ ¢™ãxèCMåMŽK<½r9­… y=ÄóüÈÄ3ÔÆ5Óâãª]‚M.X?(1eÒ DfʤGK¸¼½­'Y±ÄÖ7aGØO XN7é ýqf‘Žy„Âã% gÓ˜çáÏÝÄ|bÇbzKD;ÌkŒX,⎢›khùÎ8ЧåNÆT±:*%G‘¥Ï`µÂ¹FÎeíyZf8¦r¢ìÂ⻉©‚™8Áp;xÏRÁV8Wœ+dÏQZsÅz ¬Î=I³»~îÜa5BëŒ9vvÁmTpÂ~§Ä½ƒ¡Ý 3ۮ蕭~b pD2åEÉ- o€‰Jçܺ,ƒì+ê€;È”ÿ0GÉ' ‡%h}€Ì™é¥…¡^ E"Â\)‚ú0MÃ4Ž,Äh rM˜6d1i,$3ÈB»ÙäahLsÀT™f½LdÅ3å‘Zg0‰@²©ÊeH>3Ñ'S¶³×F@Dá«ê¦u¤¯ðÌÆüûK"\¦Y7s YL²M€,§ªbâ–ã0´ÊÌq[æ5¥MÏJà£jÚówì±³»ö?ðæ fëã´úXzgiÓÉb8£‹ˆx&9rž˜(¦>œ'ˆ£yD¦bª¬O … Y¼âÅeŸàÖožÌ3ÙŒˆkª¡l¹%\4\°‹þY9eùÒ«JÔ3ºQSë·øT­:¶2ÿ ¶?n&w cïxŠz uÑ ‰ˆ?íl%ë›äºö™É6RbLL»ÀÆ“h Yq¦{Ïçò))ÉbšS¥îª0ÙN>·éáQ"ˆþË*_+¢Vc ÞVÿpüÚªåÔÊÕîÎÑÂC°”Ò©XÆåŒ5¥ç©yqÎaû{°=н…UeÀªÖÏÙ—µÖ©©cL­(v ƾ%õz¨ ã Ö±RYÆ™×}6Ý5UZÂ.\uŒ! ¼HÌß$]æî“j†kêir µjÎíO–ýÞ¾L]šZU†düQýg°{Ë}´²òøDIÑé/ c&ÉŽm·VéHø¹¨+VÙ´n&ß3FG.äÇ”%Íà “Ë÷SÙOGˆŸû äQJ™ŽR«½vt˜6;îHATŽW¸;qî£èÐ[}(Rzýd”YíòÉ”¢áüÕSó„Ö1çÜ1§`{žvŠD\%d]ZÁÎ><0ûÂ0g=± …¿ß™®° Úú«´!–àöÞA<4Ä{Â$ ›p˜úcž ŒÕI ³ SAd $ FŠ6¼qÿða ðœTd<—·‡_ËùäðN1ÔŸž„Ý+BÇÁL#/Œ×ÁOúë¹SW›í$ÙÞ°)(4tKèWÙŽgÅ÷çêóæÿšÏqG endstream endobj 7898 0 obj 4525 endobj 7902 0 obj [488 /XYZ 32.2500000 539 0] endobj 7903 0 obj [488 /XYZ 38.2500000 498.500000 0] endobj 7904 0 obj [488 /XYZ 38.2500000 89 0] endobj 7905 0 obj [488 /XYZ 31.5000000 539.750000 0] endobj 7906 0 obj [488 /XYZ 38.2500000 498.500000 0] endobj 7907 0 obj [488 /XYZ 38.2500000 89 0] endobj 7901 0 obj << /Type /Page /Parent 2 0 R /Contents 7908 0 R /Resources 7910 0 R /Annots 7911 0 R /MediaBox [0 0 595 842] >> endobj 7910 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1499 1499 0 R /F9 9 0 R /F1409 1409 0 R /F1700 1700 0 R /F8 8 0 R >> /XObject << >> >> endobj 7911 0 obj [ ] endobj 7908 0 obj << /Length 7909 0 R /Filter /FlateDecode >> stream xœí]ÉŽäÆ½÷WÔÙ€JÌ…`˜žÑðÁÀ@ø`ø`H– Á<ÖÁ¿oV“¬éNÖK2_E.UE ìY²Iæ{¼øößÿýðÏßß¾ÿþ?‡¦ßßÿTÛºÿ;œ~}óútwœþ|h»úðÃ/O__ž>=}þÿËÓøÀ÷ïÿ<üé}øÓð¿ŸýÛð?N?tú_žZÕ¿ÿûå÷¾Uߪóï§ÿ×Ó_~wøõôÆùsÓdÞþýÛšÎv§i¬|úËÓ¼Lõòë·~}úvÜ€°¯ô¶múæ ¬±Õ[}øï?ž~>0¿¾:öV©¶±mu͇”iNŸêO_Qö½^|éå—ÐûU„·wZuñÞ>Î]~ctßúß~ìšé?øgòÛÝiÓ†¿ Ô5ìÜ‚´Ô‰¸´ª›®Ñíé{•ÿÊ~¯Õ§Öm{V=ÜíªÝJçõ²D0¾üă¢½üeæâ»2P¯ò¾=Ò1wÃoãV ÿ“߬¯¯—y_ [í˜_f.¾+ó1÷Ç9æ^uݸUuá ÎoqÊÚÚx/™¹ô¦L‡ _éŒõI‰vÆç·Ç8SGd/3uÆðå2 ߸«MÄ“=¿=Ææ*SÄ—ŸfëdÝ— y žÉø/À"ùâyðùóÓ·•í‡ýlŸ:q‘Ó7Çß>ÿòd‡¿ ÛÝ*uøüãá÷ÔÌŸ~ê®ç)Ž#ªE#©ÑˆÅÏh8çVY8kŸÁ#ïшÆÏ¼ƒÏ|Ÿéà¬âð܈óñÌ­ß7…ÏSˆè˜*|~Çs>pß0…Èî³ÒÅ)ΠúN!–§ëï>B(šü¨ûÎ ;)MJ ¾b%G„™4T ¤ýQêÒ 3(¡/ƶoI\UǦU][/¬;v}õ2Ó¯#Ï㈫4]øÑ‰æ;—œìњѿá{ø™I'{õúNÚ £6Ï¿^wðfž Œš^}4ºSoß6’¯9Ö¶9ñ‚ä/mñÌ ˜ DÄC…ˆ]7•CíýëÉÍa‘¢Å¤Z›©:gmÖ¬P`ÜÍ6Ã?çÙl££ovcC7;ìzà+å28õ!üÃÞ„yf¤“Ä0óC[–ÞÂ¥ãïXøÌš¤ˆKé¶u¯ÞDé)Ðv‹o„0Ý.¥fIp•ÜÄbED•µøŠéž¦³]¦_­Úá&¸äè¶5½qožÍB…{‰÷ߣkwèœñHˆBËì¿{ð"–‚‡ÝãÙc„Nv‘XFß7Æpó¬Î ³}@åR±xÖÏpnÄþŽ+TÝÈÞ×¶qÉnðêTƒŽf4~§ùÀÿbë/Í ^WµxGÅŽFºuåœ/Å­eµ‚mlûaÒ„¦¨æ–,¤Çõ‰…(þðî3¤LC<ë+„t•E¹X$"ÓŒ‡ñ£yû(Ö¾‘vF¹Šv1>IÏ^nw(`.âQ«±áGìwáü%2›d¬A­ÁTžÛ{õØ%[1ã Ãh»?K *ÊÇ›ˆºæìro?NÆÃ~ÒÁX™™>œÀÕm]>Œvy›¹©…T*É;¸̎╊ȷGÝ®.b‚_(BÉLr)³ÝÊprak*®b²b”ñL±Rj=Œã~-4Ó¿f;GlR±êyN—lLlq1j_€ÊÃk@ž˜;*@Ãpž\i‰¤œÁ¨q€Ûs]‰\ ü6™zY*ë»OìcSb¶Òz z§õ[½èJÐ=„8rGTDz*/‰à‚öÛ,˜NVó×ÕݼQ©6!ì;‘S*D4ï9þù„v9˜ðtÉœ´t§ª|š\+YK:rÙ˜5Þ3·’¤ÎØÞÝ÷T!FLp 㻊­PÉd²$r-E1>'Xfr‹å«Ëã;Ýì<>ïkãÄw÷Æ=ë»Ëa1×JN^º› ˜—âÝ!¼ÖŒÜÇÎV*¾DX·Có_®yvz{–𹝲Î"v‘™BdjU9û~{ùÁ¾:)[—GVÌÏ“"vžãÊ&b9‰ÔtÛ‰‡_=܇Á¶Ãz0>6χ%â¤!.¼ŒY¶w#¬±Úß¶ôoßvY%;ä¨Ê+T °?˜dvBNåæ“u$÷ɂЅd)lωÜ#!Þ#SžÎòªp¯ûËZFTïÑ⬓Hó’Rš(áwI^“JºÆ6ãEÚÙ¢sU”²®P_Üm¹@ާt»0ÉE1L…/JÌRŠø>Á^}‚¼¹SþYgšT P€øKTõø¸ÕO2õ3ºÌÉbåµT²¥S7Vr&Æâ™TOPw;8{ÖâûZcf£MÐÒ__ÉÕ.7åê´bøŽ>cÄŒ¾‚þ+ô ´+<ÅPßÇeØ«âi§íl a¿¶l`S%l‹Ô؆Ànس„Ëiˆ¹á}Æ”Ã6žµ§dƒÚá·­A×…QâsÊ‹Ö5«òŒäwdw zw–RK‘E¶Üq?Éõà®|øÜ‘8Ù®X7€—zi¤O'ZºaÄ-Ø›K0O¦D•Ñd/@*2÷¬”бqÓNcǧWŠŸ!h‹þdÂàq˜g!¬KÛubή[|9EuŠÝ%Ò_˜óÙY×Cé±…°k® YÊÚH¢å5úŠåY¬¸aL†[Ö(¾C·©ÒÉÞogïî]yOÞø+¸… *y#ðà;“A;"üIsÐdﶇzqö‚¥Uà Ní*÷¶Š¯ŽOàFðb’•Õ‰ÆR)¢»©„V)ŠÇ³.ŸâÓ°bU]uø¥›*Jõ×,Q3ˆ€£Ç—M8(Hvn¢†œgbÝd·’éîú¦ÔíË+ 9àΪ˜<“ÇÑ:ö‘JXóRØÖ(øþxv‡øÑ(­pc g3Âïhœa·F‰U{M%&°9É3V ñÊ`’{â[xÖØ¿Š=a)c.ªŸ3PL:°ûnXòºf»ƒÝW5&F,ÅðŽŠ‚Ýc)æ‘;øX$Çsò _b¼o¢@üx ¶à n³³ÒÅ)ëz8g GxºŽ+ݺâh'¥¢I kZãÀQvbD˜Ic wMÔÉ¥Óç’ ïS¤{ä-•Mã·Q•Èu¬²€m]Ëã‘­¨Ñ7/2RèX‘ûêVàÎ^4–Û³ï}O8Y¹g¥Àƒá™„‡}ðp†}àa|;¤…_°xÉÇíÌõÊßG[V¢>Pƒ›‡j4 ¡†i%O13Ñvf!m’ðeAX×îQdˆP»PVÄÂð›õBhÂc iH !Ìņ\ }|³RáèÄm!ãi_…/=®JÁÉM£:6­z õ4ª=ª>V½y»@¨8LAd¥ç¡-3`„&FÞ& A¹—ÓωBàÊÏá¬e›óä79R5åéL5KKÝ ûèÑ–qnYÌÔ&$…P/Š­¹[D$›¼{‹h¡eàË€ÂÊo¢®™" ?¦Ä™zÖT^(1û§^ xcתWÜuÚ=Löøª\"Çø.ÈÚ]gKcXS1×Övîé,.öžÁûÒT„2d„SÝÅJ4¦.ÑÁ"³Ml€Äu]µÖe|{œ-Eœ­³»ï·§ˆ¹Sý‚BwƼkÛEjÛF®zkÛªZ83nMÝVJ¹KÕ·wñÖXa펬ÁÊÛt‰tAºÛÕÎ&hù]µÎ)æî-,p¸íÀ±;þ%Rk<*—hpQ¦¿HªnŽŒv !åî¤Cœpë'ÈÜK âÈÛ3øÇ3ç³oCîÓ…‘iÍqJÃ_ó¥gzôÌt/•=.²úŸáÜ4z¦‚ëñÌÎÏ?3É’öØwî ðÜÄšù¬ÃZ}þdþ, œ¡”¨¨cRïôõDVH¨"Us=Yë vN5³Šk\ZÅ#Ì-{F2^ íN¦ :±Ãž;"›PºÐ ±ö‡Ms¬ãeWDÈÁ³@BU]õÅl ¨+‘ˆ#¢˜"á bRÆDJ稠8&,LÑÌ••µt\nEù'‰ \)'Û–W‚Dv)U¦ï"•HLÈFÅÏPn›í›Â„U'´¡K6ÞBâQÜ:m½DÌ Ð`;¢•Ò‹×`¡¡x n°»(e_Ö,$RÉCÒÒâb.0ö¨gÅWª'F(Ú\^XËÅ\+z¹Àì†23æóìa»ôÅôŠ—H€Ã;GéZ¢ž Ç«k®V€ïG…#­·+fLQÕ.ý ¦Ÿ½‡ŒD¿àÄ”ŒVœ0à/l÷˜ËgÛ3BüÇY\DÞ¡‘Ik¨ =£ðwzôÌìj× µweÍѼܘ×ßi¹=·qinÕ™/:Ž{ G<³†{¿3ÝÀK»óŒž™P/¤Z)ž[‹Î¿ Ÿé,ë.P¯†³Æ§ ݺ"¬k5ÃÎcû ÕgS³E¿c$Ìm»è÷,0À˜“H’‘µá˜*c¢/çAx?dË›³¶É\‘‘c¤¢©JÙPJ´ƒª×ŽˆÊç¡am´ &~Π•ÅÍYH…*Gj˜tMœ Á$I$*Û_¤Ê]‰,SE6v¥"/Ž‹×ëö8‚à€^c€jßõŽ@½… õåÉl”c^b“aܲ&ƒcHÄg˜üÏw|ÓFô¶ã¾…Àà VhFn ¤ûÆÕÝùî­1ÃéF×îD‰{)—âíÙÔÙcgÎÜ÷J€…^¸c–§o:nŠ&ÖµË,gÑžKÀ¨vL×Ý€Œ¼W¯¤pé“Ó †ëRUb,—ûH(Ü3[·ÐŸpf+¹yµRL^nÌþ¾uEïvKŒ©æ¤äãÅ JÆgn ø´˜o*ç1•‘wSʃ Ñô˜² ¸zÖVâæ¾[W$Å1.: ðð¤ºd²ù-L]$Ã4 9]˜£ni“ ÝàÜw†•ãƱ@(Mžôïì!ÝÕï$H½« ÅZ~ó›w®žFT© C,¬°^×vô7êÌŽ0ÀnæŽ=µ¸-:†ñ"žÑ¸í6nóŽ»ôâ•î#ûÈWuèÒìe;IãÆžÍé5†õƒqÏÝfB^wÁ@|H †)]ž›|ྮÏÅ>pÝûÈ>r# _Ï?ë}dy5’FJØîˆõšüzÚ>²ˆX¬õ‰ÞŸé;ix@#Ê&k¡e‘ÿ„÷‘}„æØ^•µ¥Ëàç^ã”w¯N”×ìÕÈfSai³êv_ì>âç„×à6ï\~NŒï©ï\©;è¾BþŽÛ†µÏ”(eïÏ&Œæ‘êW¤\W™ä?J‘6# Ф!jϙқ€ÚXJ2U+ªf Z$xŠ5S 3PAxÖ˜hó3KØ«5†…2ŽÈ“a‚:ä"fÄjHÚݹÚ`Ð RÕ.ëñp¼R¦“AUb~Dï;Ì`Gж¬a*’ÏÜ>#Z+_ ¸9ƒufgn6©ÆÕ†Yã£ô´7¶’‚ÚÓ”+cå^¹›‡•jƒl‹;[£ñ\UÙ³‚´— NZö¢ „—Hò0{ÙˆG‘ 0¤ñE;xÃó‚pçKæL%Ã3QP(X]bLÞȤøèOÆZטK$=’µNíêsL+01ÇHõCb¾æ÷¸Ü&8óÝ»Ëà qÈ òVNÇ„±SâMõçš3ä&º ƒDEDgóGÂgÄà L!8GÂyd 4·éœ£^ nÅ>’`Dö6å_Ï>²5’†{Í’gêÛ²Ká}¤„ )=Z¬lU¡•ãõ¬jåiîæ9 ›©»Heàg§±}„¼›Ø*eF %bdÏ=ØxïQ‰k[Œ[…(î…gº„ü©Sëô²s”}Ä;‚1ßkø ñð¬à›Žï&£oˆ¢fËõ]½éýé»kü’ÂüÁþWì1%¸ï®ñ”0ByL1½áÛ$k `»ø>m› ·%¾Ûi¸šq멺c¼:¬%ñHþ;O+tWÀc¬$ª{¾Ï²X{mÂhfLpc?ãáIø™Dhù)öÞF,öU`ɹ7A;X~xžaò Ĥ£?‰®¯ús¸€éÚK¤á¼*#ÊÂYËfØØ˜iÌôÊ H-#Ú5ô²Ä)ÐT~.¾Íd¤ö<“½/É„w+XÀ©S½aE0RYªÛïS¶G%C‹¿$f1³6®|Û›Ž§¿ )ÔLž|øÃm¢ªÜëÛ…±¯]SÖãÚû}¥¾ËLyœ8$LŒxœ=ØAªbË®¾ëœ=\ÕbΦoÝÙŒ†óD'ª€C `Ë@´âQˆ‚’'ŒÔ-ãaà(ŽÉ(6åU0íÊdIÖÞªjߦ”ACùvu„—ôp/â¤BÖÑ%®*¥ºÆ!-Œ#ê‰^Š*LrÝÆÑªõX¸þjÕ© Ê{eç01ö…3(?KÇ ÖáªtXN¡ b‘ - 3´wœ€ÑDSi:Ä!3±F«ÌÇ ï´_6¤$ì^"(-¨n „>ägíJ¾…÷U™V6NGyÁ”U|ð‰ì&a 2Y11#;ðšÜ,À“ÅÂj‡¬3+u%Q´„²6ÝÓз³r¼®õ·n÷BÕ"?<¨~”Ìg ˆLJ¥ÇpåDéV‘¹­×z®8®E;nQXq}‡lÖ‡é;~£+eÎ4Ñ ð-ñÔSàšb¤hzËÞw‰ÔDªQ~Š÷Œô‰Ý6ó'³e6o&xt ‰$ªÛvÙ`U&`sdƒ©D¬ÒÀ‰è’lfíª p]s@ o¡¡Y!NK<ûµ®ja-¶{G¨ìiYHtÙ*¸„¦Ñ³GŽ·Ì3»¢T‚¢t£ê.ZÆ*!apZ\>ŸßvJ,S)榳o?y©ÅóöÈ"%p™pk¢&–©4YÊ$`bêL„>QÖ²HC‘TM) „ì*­Ì©ËbÛ-L• f|„£ƒŠ``#%já¹v¤£Æán̶¶ã2Pi¤¢ £=‡ÇH ,3\‡Bdô…dûÝË5‰ÔÝ›*°ªÔ•'-º>V½yû6 Í4^ ¥ç¡-3¸“|úìd-“– ó%c֨đ’û½ˆ/DŒ¬ÃaaµH®eê0éx DSZeƒbžÊB?_f6\uFŒl¯a W°âûÕleV·2Žè ˆ€]—S„TcJÒnA4qs ©4h"<ΘµŒ!ʈe¦–'Ù0À4LJk@NŒD~¼Çß´]ïH•ï[`©UƒK”h|[Õ¹„¹)œñžßWž¾B¹i´#߬…`Œ1$. )±ÜËT¨Ô ‡g `cù/¨¾‚ˆT P–E±ù9µç̬[ ½f¶† µäjÛª’ A1±Ú±‡˜f›2®Ý&,x$`.„í=1A(•_Ql².œ~¢}Wd®$I&¶õ\D’*á§âÚDOª(ì!C¥Š¦J¬•ÚJ›b¢¹-!°.‹9ng¯ÉpDY²ÇÅ% æ9R&TsÅ‘2Ú lϤl‰!ËvÂg´‡ØP™p=JtÐ@öܘǃïµbè°-¢žÒ¾Ê³( 1Ókã¬`Ú¸zη¸R’ÈRå×݉á!ëz¸©ô©¼Œ¡­µ«è2È#„vy$"êt¿™ɦÀQ°—D»Â|&vNü<Ó:ÇJÇ™†•Lòm\fT4¢3þ“]Ft”ó–šÂX ‘@ñaÏ &Êã‘Í‘ô„ÿ½Iàð¶ÓAÒpøÍY%ÛƒºW-]®KwPýŦ/c§›º=›×çs£2÷êξC#Óê£EAÏL‹¾ôLŸ±gIêT*Lýé/­G£g*¸xÓ…¿ôÌ3úÎÄ.À}›ôãæh”vxÝ8ƒöhö®ÎÚó÷`m¥ñyOS±kbTæ„ùë±0ÅŽ ¢å.U+ *Ó<ØþX”ödβ˨يԡ¦Ò'gù¦km53ýEÁŸhÌg1Yãeš b&9q<£×§ÖÆ‘sÂF–DHêñÄAäL]Åô 0{^†¡S™å¢òÎ &Gd9]~¿çÞa.z"†Dz*&;ƒå±~¾ ¢Î+ ?­ýÀQÙ]’”F™c¥N¦ßA;P—¶e$ýöÂqn}Ôc¬ìÕÈhî6Ëóaz¦Y8ÔÊÎ]øŽYÓC/Ííã´R”ÃJºué Géšå'r‰Y˜S\X†ÂoƒÏL7W-ýU–%¸ÓŸ‡Ï ÷ÎÀ5aÐkjþ%²™÷{ü÷%‹yuÐ8|†Ó^ç¼~ñ½ÅOxNï–ºþÌÚʧûþæðà-Åa^e­2µO‡OOÿ®'×{ endstream endobj 7909 0 obj 6782 endobj 7913 0 obj [489 /XYZ 38.2500000 283.250000 0] endobj 7914 0 obj [489 /XYZ 38.2500000 283.250000 0] endobj 7912 0 obj << /Type /Page /Parent 2 0 R /Contents 7915 0 R /Resources 7917 0 R /Annots 7918 0 R /MediaBox [0 0 595 842] >> endobj 7917 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1499 1499 0 R /F9 9 0 R /F1409 1409 0 R /F8 8 0 R >> /XObject << >> >> endobj 7918 0 obj [ ] endobj 7915 0 obj << /Length 7916 0 R /Filter /FlateDecode >> stream xœí]KÜ6¾÷¯Ðy´Å‡^À"€=/CcØCC`o²0ÖÁÎæ¿¿ê‘Ô£¦úcK¥¢D©+†3ãV‹b±ê«‹ïþñôkòûŸÉ»‡§ÿ&ŸÛŸO‡ôXdió_rúó]ÿ]Ûß“¢Ì’Ïß/ÉËáÓáSýÿ—CóÂÓÃOõo%:ù±þû5ùù—úÃ/í—N_øv(TQÿüÏëϪPõoéùçéóþù·äS‹]wí`.ÿý-l©ªÓ0ntýr覩^ÿüùùû†Óz©l•›2QÖØDUV'ÿû×á·ÓÜØû6Ôæký¡~x>¼û¨lU%*Ož«'òÚróãùÛÁÖÿ803Éó—äïiªÕ÷Éó×CuÌuÖ ¤y¢rô$5𾓡'¶€ïèé#H-zb~€£þ[ƒï¤ïak¢éÃtºyžà~ðL)kŠ×?ÁÔkªá¨÷Æ!ž½€×ÒM|}òÃó…|BIŒB7£¬:*U¯­ªô˜ª¬%ÿÛHʖDzJ_3âIÚðwén{´¦Ñ*.ë\k¿cà;9|Ò,9f6?Ío°×Þ±h)uÃ:ÙÑèRœ§<Ÿ‡ l lŠ8AU…à xûé÷ ¬§ë/;T“¦rK :5¸¸ôP‹ÌJÔàÞ8d‹j°ÈUG¥†²Jujb„ÄoyU™NäÞí¼ÊÍÖ¥Ãæ ŠRቖ°5Qü©.a?¸5Lk̈L`AWÆÙ0Á‚Qîå 5ü°°4XXÊfÆ Ù3ê”Sñ{ÞÁ«M€R0b¥é}ÁzÏU¹Ûᔩ@+&MGo¡ò&‡ û[ÎLÂXw™8­åìU( ¾þÙ« ƒ! váØ•E8†2@ýž*:„Ž5¦Î™Ú8 Ç&=¿h>¦×Êá´¬â@îÆm6ÎCK:s7Zh“¦p ÓBì v[dK·YÏcæŸ`û²ˆ<·VE2à'Èá1߀,Rg,>2Œ'ŽÀ`ã ?»Èr좚Ƴ"Á¥«ÍÜ-‚—Æ`bbDÿ‘€õ1ÂÌûÁˆe¡³×3žWÄ%—G¤r’³7êy$p€Öcñâ .¥²~GŠÇFͽâùðò—çÃ*G‹çû¾«{><  ΔÓ[bÌù\ö–¼%{+$<Þç¢(!ø»·ƒaCkÛ¬Š „Ê–0ÆÝÃS[=&WÎPâô]™Ò¸ã 뻲©»FÜÆX!—F…‚³ëc88‹ÃäÂÔøÌ!Ø,¦P ¦Á @ {¯oÙPLëE20Ošhƒðƒ'Ï1µ ½1XêÒšñ³Ô:¼:~¦Óáñ³6˜Ù›$G¶¶ƒfÃÆÏnîž¹¡ÍÌ]Bï€V–)‚†…yD†i°â㽸TAèM dv{B ”ë¥<XŠâzbX?®µ7¡,Ï)Ií¬ü@Y[Í! °7f‰Ò‘ V×é˜Å€S(+xK]^{B9qÚ76cYfb_[¹JzÂ*DY[e7ŒW¸@Ï™v‹R,¿ƒOwašs¨dÇãü.¤ (·]yâU”»³&ˆSBh‹XXe1³ÜZ¹Qº7êùÈ)É:ž$'LBelâ#ù•Û—¼©Ÿ™ ¸=­ÕSÒâ,e³ ng¹8˃)(q–oÍYž©…GïÆÝ¸7xÜ蔳µØA(N숯5˲îÐȶoc]ÌÌb9ƪ¦W…Z,5Z1 0hǸg‚õÊO·w+kælûà·šY·C–"´Eé4ëÙ~/œB$àáíxâÁØ2]–=Oø*{ ŒP4&¡‚7o%=OЕÙä(¥ÄqT€QÁë³cĈ!ŸEhM4dÍ®ºñ®ÕÖ캒邱«oH6N|ÆÕz6Ö½”~xcšƒ…ÞŠÒÌÏviáÞÛnðkdɃiá^¯CÞðkñže¶CUW¦…¶)+åtH‰4›N yvIf¡F-¤¢VnÙáM \ñRL¹¼ç¹Äë|œÏ Q‡…¸Gc¤B© ‚³1&»%E¯¡5üÄ2ìÙ¼Í@ìY.Ë1ÏG”@¼|»7,¬Šù.WOH±«#±åÕ¹°æ¦Cl¼ýIYNx”ÄO‚åãI‹ÝÒwlïn.b×ÞOñ&EB[WíÅ$½Y"v•qš•ˆÝ$ÆåuÂyΟòeÚe…À,YWK”å›ä_±Ð¿Â›‚á™Ï{gÁ(Yß”ã˜xHÖL'$iù™¶jaÖ>EDûù@äLÞçó‰Y¸sÃ÷aãÈã¨ÁKs˹3Él¢ŒMCÃylØxÅï@÷Ÿ'mÒšåæ¦*w5IrðÆíX««zFÀ¡w_·V7O®ùG<üÞ7“0WªÌEš‹,U¦½¥u üŸa”²8 ‹ó™›õmˆ`wn*mÉF•Ê·C,¼J†5tõÉYÆšàëÑ6”QÇ—`4pŒ“|Ú”¸¼iå0²Géì ›"w%#oä¸8ç~K´l4X?r,7÷l•w¶m.Î'(öm¾c£wqÛý„iUél¿ÐaÚ¶R`¯C–0m{­N¯YJ‚ø„ë3±O*æÌ ØÏ„, ãm˜(ƒ…9~8XÛXêž„ YW»†Ygƒ}(!k YZ°{YWËnÕ"¨~Æ­:Ÿ¥;<ì2ò4Åf«ËˆÁˆÏiUµ7;öˆ.ñ[‰ßö'(ñÛ•ã·zïr‘'zªU6Z½-•Ò»>X 5éùŽŽ0 :Êâ»,ß® ”ø©ÄOHýN˜½qš'~¬Ômk9âÒkæ(iy¾9M¢<û£Ž^jÂVÏ­Tr×Ù&£ŠåÛÍ\„¨âîOSQø÷QK‰tÇP|SÏòz–­2Ž0 ]Ô¸Ò7*ϲÍÜá1'#Æœ5Ÿq…»KùœÅã;f‚âñ]Õã[äùxqßö.•­ Â'D”Ú%f`]xò?„Ó…LRg}¿tÔÕ½+¹PhÇ~ R¦=ž)îWx$TD¿SÌ~§jÖõDwìwâ½9¢oq‰Ëhœ³—‘)#ÇB»ŒRWpÆå2ÒîðÄe´¦Ë¨­ÊÜ[q˜—¸Œh8bs.#“ß­¸âqZWÞ/àšê¼ Kéܲ­YFçŠkj¾kªLTu=ŸªY¸Êv­6¶«J æpÊ•'-ͳ£‰Lz Å×Þ±g5Q™ËÕøç£Ñ;)e wåG£´³ê°5©ƒ[kß™‹‘O«®jIډDž®‚ñì ¼)µÕ±=ÅBgj÷‚Ù&¸|&˜%`DœaDò¿tŽ"µ)Foý­)Å)‰Þ$¿ÛBUH{ƒ%=}YÿÞLíG=x@ÅÒ!¼Ãé„d æ©4?×ÒÃ兰僟ÜÍÅ¥ž€5o9+Þ•Ã3Ř„ßâ ¿©Zv#yDÀ‘‘]HÔº§L8n0 ïßWv@¨À‡õråvØ×@‰¦GR¼'F)W-‘ΟRîç¤ÔQ¢ÀXõÛ#Ô2ê·×ájê—ÒBqãS.³†Õy™É²KVE¶®½*71m”6©«³·JÔ¢W-V Õ8«Åj©÷{‰³*µZ²ÍbR¥¶ü E=CáÑHÏjSÊ@HxgJÖæ’¡6JÉöµŒ’íu¡’ÝæÕkë‡`O_=ö<Á­áD1<¬¡%hºIÍ™IŸ¥9{„ZFsö:ŒOs›Ç * ´©²N†PÒƒçfß´r¹ko·Isp¾‡5)Lq9N•’N–ƒJpÀÓVAlõŸä¥Þ¸Í†}zø©þí¯D'?Ö¿&?ÿRøåug{¿0B”×o¨7ÇTê[$Ú^òÈ5YÚ ¿âŠàjhªZ•NTC…|øÄ<¶ïäƒ2$ ŠèGÔ¹u.ÿÚØ>¶3EÕqáû6¤¶«X2˜`»=®5_Ü€-W¦¡pkð–ÕÕ¤©“ÇU†;ý^¸[hH;ç„Y@ßB^ר¦£wóù öWÁà €y¯tšô7ø†g51µÔü5+Rsl÷ûÅâÁ]Š¯Ý¥­ä»%õ’O‡ÿ¸ú endstream endobj 7916 0 obj 3929 endobj 7920 0 obj [490 /XYZ 38.2500000 716.750000 0] endobj 7921 0 obj [490 /XYZ 38.2500000 302 0] endobj 7922 0 obj [490 /XYZ 38.2500000 170 0] endobj 7923 0 obj [490 /XYZ 38.2500000 716.750000 0] endobj 7924 0 obj [490 /XYZ 38.2500000 302 0] endobj 7925 0 obj [490 /XYZ 38.2500000 170 0] endobj 7919 0 obj << /Type /Page /Parent 2 0 R /Contents 7926 0 R /Resources 7928 0 R /Annots 7929 0 R /MediaBox [0 0 595 842] >> endobj 7928 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1409 1409 0 R /F1499 1499 0 R /F8 8 0 R >> /XObject << >> >> endobj 7929 0 obj [ ] endobj 7926 0 obj << /Length 7927 0 R /Filter /FlateDecode >> stream xœí]Iä¶¾÷¯¨s—ÅE˜Å ‡CC`Ç ŒØÈćüýTuIÕÕT}”øÕ#E©é=ãæˆ¢ß¾~ûÇïÿ~øço‡o?|ÿŸÃÃᆰŽm]]þ9œ}sû݇?Ú®>üðËÓ×Ã×§ÏOŸOÿýútyàû>ýé}øÓéߟýÛé‡?éü~yjU{úýßÏ¿÷­:ý©ºþ~þù¿žþò»Ã¯çÇ× ‡yýÿߨ¶nûê|Œ™W}?S=ÿúí‡_Ÿ¾½ ì-}­ê®:(kìAõVþû§ŸN/·¯Ž½Uªml[=ò¢VŸßÔ+sPúô¥ìäEÏ¿„¶—ß\Wº‰¶ùåäâPQ¦QÞÝÕùzµª›®Ñ'>v•¹üj»TÆÄ¸‰ëö6×ªŠˆCç“‹Ce¸f¼{¤k6Ýxõ”m<¬—í#l^›>ÞæÏ'‡ÊxÍp÷H×\÷*æ5¿laóö$ÐâáP¯"^3Þ]P"›ª­"²ê›í#l~Éñ6¯.Ðê§»Ùåò 5~õ<øþËÓ·ŸN,±9|ùéÌHÎ/¼üöå"ßœõľ>|ùñðûÓy>þáðåç'¥Žµmº“6}þ{Ï+º^éŽ]_5º®^V* WÌeåe“OΪÎýÁ‡çØ£5]þe¥~^1ãÉnŽÖÁg.»}÷åt APÙ QÙ /éÏà¸=~'u xš:§!@p/ _?~±‹U7iáÊäŒvî­ÀgŒr¶W&œÔG9ìÑ•ÛêùÆ£^ƒ÷þ©­Tx¥F+?)Ÿm¸Š;+æ;ø=ïánð™êÜM§†Ïh¼Ûx 7æQÏ©!ÜövÛ¼n©Ÿmzyþ Æ›¦-büa1~Å ÄøÍiòãÎwK6¹h}4ºS¯E$ó V0q?¢¿­Lý‰~D±8úH|O®.0g+JÁf•‚ÖôE)xX)¸bJÁÍiòS èùêFŽ:G &L˜CödªðÝð 0gž˜’ù…?h0zø/ÜmmÕ£nœ;ŸU=‚tmõYl)zžy›´6.<°Þ‚ñr…–R07¡”Pñ’¸º¢ç3ða™#áÄ'ÀŒž ãÂH”3¬ÇRbDùZRJ2`•*¢ÍдG˜³1Rg]0ö—©Öµ  'ÆŸ3›Zž¾á!· 5žÝ‰äÎQ©ßGDÉ£L`2ÇÆ±¨|¦Œã ðq” ‘ã‹ËÏx¾ê±ŽaZ8ƒÑcWb¶‰o5‘l-!1ÂÔ°œ2™,©ŽqgäaÌŽ.‡uå¢iè [Ù÷l+ÌÉ0œE$§Õåì½ Ÿà/”ÑȰ}ÆÁصVæð¥0Q V8˜@ØXÀ™eö´r‚ÉF‰.%›®w•9†B }ØC9D Y¸=x Kq©p“’A<#“Jîò$[Cj«]œ30z=~"“Çu\Æ÷AøÇ©0X’”.Õ8Þ@ÆuL—]gx̦Ägé‘gljʬÃF6 ê(£T$h”ª:,‘ÊÆs­±˜ÒD·.·ésÈqÆZH•è±·“<›¨g…H;ͬëà0ˆß¹Ÿ‘¨ëÈlÙ[\U«­ŸyOo›íhZ¥¶+¢¹×«OˆcÍâFÇñmÞ=þá¶É/µUøÙ2¡™Îî”fRñe ï^〰§¢Á0È›ûêê¥×gÁ$NÂc.O€;`bÈa…ß©«úšm-õŠÜE$ÕçˆÚ¦i¼a±'œ´ÐA@6¸¶¼“ý.Ï<ìÎr…²’õJ2éPVÒÝ)î½eË% O3ùÜcY9I>¬!îl·²’ÃJR²}6ßývVð,aL"<‹Ô{Š6¶Ñ•:¥^ÓtÙ|÷ÞVRq”õyMáB[]IÊkº6›ï^ÉßJ–úÒDÞ|ÙûÉ9šUpÔbÐñ#AÚÆÉd§¢mêp^œD¹•¼¼›I| e¿¤T.DüR*™À¾0ªv~zª†I™ôDý]ªDgOÓ(>˜³ ‹çÆÄ”€—öß7"0r•µd{fÀ¯Öíh¨”«ûƒgø01Z–:V¸ñ3PÆßƒU~†àݰúŽM? ë2þxwãµQ×lÉ2þIŸ¹ñÇ·PœË9?þøö4íàD'~0c1…í¨—ˆäfzL¾T .@ .=vÂ~Çí™®rH)`k† e=Lå#.°§+‹‡¦ñ„µj à—¢F“0s_‘(ïÛ}Ô˜šÌ'Ûe™ØŒ¸”h©…{:RjÑ+Zó±öÑýnZfŸ±P”íVñPç‰ aySuJÅÆH" ˜A›¦ÓaŤòO2¥TC£µiæçpÊ*C©‹Aä+1dÃÃwÒALa;&@\1 YoÑ1Ž£PÚ"Æè ÃNŒ$â(ŒV:T©Ü o%òs§ò§3ÑnfÆ(0Ü’{fS^ØÔ}&˜!ûj* >5Ó… ’é|.]ÊæaV_›‡]ÎT.†3Q=Y˜L«+œí Oí)OÕZrýBÙM®X\¼‰ó™ÒI¢Ht£mI1c`¸a:Å÷éÔÀÝ<ÍG!DMÈ;­#!îaEY)+â+žÒûÕÏVV6¾’†wÖצk›l”°¾–TV¤Wh›†fÚ«·ÚCX3ÒËõœ6uï»·ÜÂ6KìÛæJö4Ó_çÖï³óÙA2ëãØÞVLÜ)ö&áµj ä ¥gµ’ וÏ3 u;’¥|Œ>–âˆT@1?‘À)[ë^Òøáßêi|[j¡™fL€—ÉRag' _k•ým3÷%«ÆkuÕ:¢*ƒ©È}SV/¢ð$ƒy¯²9N»¯Sñ¼‡I¼­9I™ÓhûúúÂ,@ ÇÚmZžîm¢ÖÏ6¡#<Ô™u•j l‰¼¡ÜÍ‘ÂDL 8óç4%Œ/4öÚ®¯H‰"%Š”ˆ %r16~c  ;.¸Ðf¡ÍÝÒf§ m.¹Ç7CÏ…ÓR`[=„c…ãÜ}¡Œõ)Cõ…2vKÂ'H‹ÿa< ¬”ñÊÃH`üPi?Û©mÇ€îM•šg“dz~? O Ñ,“Iz†§ÓM‚‰§ T)ÙüS&Òû˜°=5˜q5’{Ãé"r›T©@“V›¢}AgÓÄbæW©áX†¸–!®H€XV ¤I‘gYȈŠDÊ<‡%rë™gD„}ʼ]5ú¢ÊÔÏýÁ ÌàõbÈê3x=÷Ãô^#<ï{ÃøÝÍúílí^ÕDA.ÅÍ_W+â›)<¹­Ug ÷Ê= £gM€¾¼ˆ’jV¼ú°‚ }­pñMâcÎàµÖE=Œ Û |¦ n¡†UÁM^Ì|c2‹’ÅNŒ§œ}! 4ÀP7ÉDV½)[ ÈÔsS,© ååñ¦Ç´­5ðRnŽow8§äL¥™n.¬É ͲUu¼¨à­îÎÊŸú¨c;ì Ÿéá3/RÍ™¶eੇ»»·Ò ÷TÑ{*·!t? ß¿Ôu¦>važÊ¼‡™Â4IÀ‚š™˜':`6vóBݧº¨ˆJïÜ6¦*ÀD} ­ =QgdÍNF´Š^ú^ì…l¸ÄŒ¾›Ú•‰[êäq.òK5È’mw’ª•áMñ˜X˜?"6Iчì8ãåV3#ƒ3èi#;‘~¾ †ã0`ìAÙdI¬“‰ª‰”@í…h-q¶',÷½u„U@û4&?×#^°^C Ê6cc²Ê0 ÜK¸9c3i)%•¹~Ƴû¿(Ð/+EÉ\¥õç\ÏÙó ¼u×þ:Ì¬Ü bcÕ”Y ñQ35ñj`]K”¿x3¨T{B)šI¤@Ö¶ˆÖcì,"·†ª`b*‹0S‘eŸ‰Å•fÀ´=ß[4!QRxš|ƒ¨Î:íˆÄ &IMî1t+Å_àz¦3a?Š\éúžÙR‹¶›Z´”E;ýu `Ißß Ÿ™¦ï-$©ÝÛZµÄº§I”ß’¯¥·~bȦ챨µ&ƒÅÒ[d'¬e饊y¼½¼Y'äú­vRSµžDÉÈ (bjhD³eÓùÖ,¡ì”rÄÚÞÂ:lÉ/º·ñH§lã3‰Hglƒ1Q41•U³Í‰}‹õüÎQSÕÉœ U0m1d ²ržË™¡a IhV6‡Ã f°„ÅŽ(þm±cÇšÙMDB.Å_‰TöC_&/ØMuDuç¼Tt",>W3’Ý;[ ‚3j'ôeàµ!ø4“´À¼‡ª+H…³Eå‹-«¶¥@âÃbêplʹÃË¿¾ìFŽR‰GÓÞ%VEd "˜D ¶§Ä.‘U“ÊzbœN&O؉T‹ Õ0 1Ht”Ìù›gTe^'„eZáVÇ g3ág`ž“gxÎÃYSxÎÎúD|ÎCçÆÙf8î\ÁMáÙ,Ì ÄYzžgà dw3bÀP“Ö›¾GŒ—x7ƒ‡¤¥ís*ñŠg·T|Þ?SC|Û&&z¾‡ž ytªÛÆwŠ¿”T ¡ƒÇ¸â[`Æ„æ,wk±áŒ dA“œ£$Ò¬4®À»á¢Ãc=gÃõ˜Bnç9¾Ì1 ð÷`ècì=0€t–T³jûMÃʃ/ͪÊZ³Ú&&ÍÊ÷¬×¤’,r:Š¿ý¸Ñfd©´oà3°ý¸\­vŒY¾<†>½æhÔî.Ýk2Nì†O=(i÷žÁï©àÙ> ¸á³ ÞË{Ö߇Ÿ U£u£Ûv¼ø2Òµ”Ѿ8 é™™èAt^<è4r•…eÙöÄ^3÷}yP“i´îÉ“%ÊEg“öbŠ›F;òÆCÝø®ðàà!³›XþûlsÒ$FËkÖØûAôkðø ›µôú¨|¶ qs¥o‡t߇{|1ÐÁøŠ ñ@'cNáûŒá†ý7nø~°O{ž1tÅÅÞ-üLÁu9Õ˜ÖT»R5È9·“`0˜×zãKôªœjŠT’Š6?ÏÑêI«K•‡î£‹ül gÜàÕ‰¹<ÇtÄü¾ð4uåžF°1æÁ[÷ಙÿÔ–Dž+ªáAÖ9âg*™ÄLˆ'²¹-ô4ËrèMå+ˆLÑÅák\ž¸bc¼¦™èŒq+ÆíØó¿iÕâ6:ð]âáP²=%¨yI²'€/'O\J@NΖóDNøé›Œt¦N¹ ]")s®à÷dP ›Ë@¢XM7rŒî$ Li‘ïVm»œñ©°‘¿B)—)ãtrO,vÉ+89ŸMöF öðZ»¡GeKÕ÷¡°Í%iÅiw£ë¹éæayê h£»M4 Ü’sšF@…„ðþE¤(=Z%W’Êgþ©'“g¹Soˆ‡=Ø«Ži™¨á¥l´ÅÓ;ã¤6É-Ò ÇÓ¿™‘2¡Âi{¦cz€'7aê–½¶yÈ9!£¤nyÓH˜”’ÔU’ºH )I]o0©+r‚–n]q4—1vA­ŸÔe¯µs«9Pd6IÕØrRå@„±…»”ÅËcñxRµ²),0c…%*Щêk\­L¸X1ËÄNÞønYc{çEr;âTbRüÚ™ªvᲾ͛ŠÅeØÑ2²#ûM6™ÏÌx<^%&8šÈ«”a?õA›5ÇêŒÜR gœ%3ö±Pgjꌙ‡ÔW²§©Æ@ðËW]¦CCŒÑˆk†š¢X¥Dy ú¾ÏH…S§ I+JUÁZë|–gàå†kNWIÃŒJÊf ALŒV½‹Ñ³-2„4¾•Y¨ó€…|”ô“@Ø%kÑÝ„µðeæ1áo”ëɠǢ"åÓ¯Ã×Ó—{óyî/,€\w7Ùò¤ÐTê¬~´}ÍëîéX—omï|ÑEz룾{rùÍte¨ÕÇf2EÍè™wÞcæ<š÷ÎöiøR¤býÙ¾©‚‡Ç„L>puØŠÄ(xç3Þ >3 § úô>Ê"Üùϧ agà7aÐsFÈ=´á}ùùíŠr/ó |÷:gûÉû&Ãs›Zêñ;k+sèýÕåA*õ\Þr0ËÔ>>?ý§MUÆ endstream endobj 7927 0 obj 5551 endobj 7931 0 obj [491 /XYZ 32.2500000 332.750000 0] endobj 7932 0 obj [491 /XYZ 38.2500000 285.500000 0] endobj 7933 0 obj [491 /XYZ 31.5000000 701.750000 0] endobj 7934 0 obj [491 /XYZ 38.2500000 248 0] endobj 7935 0 obj [491 /XYZ 31.5000000 334.250000 0] endobj 7936 0 obj [491 /XYZ 38.2500000 285.500000 0] endobj 7937 0 obj [491 /XYZ 38.2500000 248 0] endobj 7938 0 obj [491 /XYZ 32.2500000 700.250000 0] endobj 7930 0 obj << /Type /Page /Parent 2 0 R /Contents 7939 0 R /Resources 7941 0 R /Annots 7942 0 R /MediaBox [0 0 595 842] >> endobj 7941 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1409 1409 0 R /F1499 1499 0 R /F8 8 0 R >> /XObject << >> >> endobj 7942 0 obj [ ] endobj 7939 0 obj << /Length 7940 0 R /Filter /FlateDecode >> stream xœí]ËŽÜÆÝÏWô:€[¬_@`4š EA²²ä8Q¼Èï§»Yìž)òY§oÙ=´`KV ëyë>Ͻõá_þ¾ûço»O_þ³ûæ~úòPìë²èþÙýðú/t³wÞÕM¹ûöËÃ÷Ý÷‡ÏŸÿýþÐ}ðåéχ?ýo§w:üûóî¯;üå?ðËC­êÃïÿ>ýÞÖêð§âüûñïÿõð—ßí~=öØç&óöÿ°uUWê8‰¡¿?ôËT§_¿}ûõáC·q£´¥)µÞ)kìNµVïþû‡ŸôÝû¦rÿÀ?“ƒ7ÇÁëº= ®šÝ`duø²Õª¬šJ×Çñ Óý/;^­6¦Ü)ÝW>Xëé—Lï*Aç­nÓu~š¹ô¦(S©Pç‰Î¸m´Û¨Ã¿ Îáܽ|çVØF: :Î\|WúSƽ§e"¶.9—Uª®l]\Ã'O»W¦èŽæ8”øá\ºOpò¥µuºÎO3ßGVÃÞ?Çô‚§±ß~üúðáå@qÕîëOGv°ûíëiG~8 USï¾þ¸û}Qèæ»¯??ؽ5Þqü¹S‹*N-;i‹J—¯Zж˜®åòu_”§³/mÕÔo:©ˆŸN-Ï_ÛŸfç”ñ·N8›çSK¹7ºQzÞÚ”…-ø Û­á6þ>Á“g¦[Ø=3˜&¼¡˜Œ ±(L`p²ö“)[ ÓuãјéN¸ÝŸæ9r#-…‚-Ï°å µ8º›AZ ü÷¦>¹Mµ$¼õ¦µÞ‰8B(÷U­Þœ$‘MÈÝ|jÓÏžB[”†ß@zSxx¦îrŽ´Ø ¶àqˆYã¹x”ˆïÏ#ì ÞÆÀ)4ñ÷4pëñŽßàYk¸;÷v¦ ]vÎÍñ3À´£àÜw›¡*¼;+æU{Š÷ Î ÷8,ѱtÆ»SfFG¿ˆ'ŽðÀÇ…Ù&%Ìà7ÎM¿¤V$œáUt¿7º‹Ò½®éóÄ8ûUg…¿ÁЏ„ ¾©è$®Èd=Ì>lDæ:Ò†¸YI­g> 1 tÒz–Í­V<ûù×»n(ÿC'±”é?’¸È ª5•ÏQá¦å3âÖ9ÉföÅàžD°¾]¶]áÍ t‚]E ÏÅTJð@Šë§=ÒÀÀðÍøé ‹9uJa`ø'OiýfUÓú¼[©ÉU½¢ñfãanè ÎQ§h@B Ø<9$©RvÀµÔ4”ªê¼²4KT©ÖøôÛ–P•¡b§ÐpRâH8Bð«c—'ü&I”8)ÊÂú-GrS¾Y}¦6Bc ˆâ,œ©0Þ"–Ôñ•ö·ô.øRÏü/„²JЂªkož´@‰gF³“8å ¬6“O©XmÎÀXm67´Úç2kV¸0¶ H—A&U…¯¬HWU¥o½G¨×n @ºâq™SÀœCÅ6ˆÝª!vÙ?u¡Þ2Û ù3O™ 8*3ë´„ssÒè¿uM’¢Èù0›Àþ-ŽÌšt5/†WH«×›¶ôÖ‚.n«¬?Ì)ˆ˜1YûqãbKr1&â 7rp•#AJL:L(7Âë⯋‚p2úI„ÏŽÁe¦u<ÉÂY™¥XŽËB_3 iJ Áéa Ã;i§Tß]5IåV¾TfÖ&‹[d@˜M2lkÅúÅ|n"a¢_>ùâ¦TÄ# :‘Õ EdL—:8¬DGìßòb3Bg™’£Ü`ú,1œETô€Ë4;ΧÊ}Ñš·Gö—jL„Û`F‡IcJ±Iñ/ wEøÆÜbÖÁm%즀aÍÌ>­=Müžô`·°2&êùeD„~‚j+&Y&È¿”“ÎôqÍ¡~ÈhÂ26!ú¨„Y 3ì ó^« m=ÂapÆ@ï ¨™ÒURè‡)± •õ¤g€IN+Ùñ^Y ;ÁË€æmÀ ¿™TËçÄÕ¥wæ [aJø([·0¶n_` žFùâRA›Âà%pl¶Á1|¸ŽÈRzµLëÑ„-ámÃ(5;mdz ºÉÔç!_Îú¬}k¹0ÜH‹c«ÕÞy—f}Ó¢oœA~Ø=ïŒôr&%Ä(ÇFîX›VC®Ý]Îzß6~oø<·65‘9ÜY£zÜYÀƬX¢…pNçRZ5ãÙ äZ.o Ý È=B›f|«ƒ@„Äc®Q&?Ÿp´lt”(k㇚o™­ Ò2ß‘ž¡Nm|¡réï&I=Œ+€)e<1•aÚ UlcåR¬|q8 ¥/2Ùs"²ƒBˆª£1!‹UŠk+å ÇÅH\lŒiƒ\Kœóšƒ;²xšÀ1†¦HL2Ì^‹bU( .нŽÓÏ¿öYŠm…|Ô‹º©š~Tœ.5Ñsã¤BœžÇ¤ª®¸E‰¼¸;ð™TâÀ70Ÿi iCìN.eΧ®V g€káH ¹”˜׸”ò<œ«9¿š‚ùNæ¥òsmœ‹å\¹hT˜sa^ƒ¿ÁÉâ²%<ð¾ÁpNÎuP'ù†]– Ér®8Ÿ¦ræft€{ÃÅ„¹]¦–s‰£ ޾.7$ŒvÅ„ã±#a~Ñ]Æë©~?áW«lj¨lnöAervßhìù©·&ŒˆÂ}DFMÌ]ÈËZÞºX•¼ÕõJµÒøbíŠJZ»¡tµa/S6œ±99UW0iU¿Ú? ¦ÇT˜:ñë1º]èè,c‡È¿LÿÜ‹®¼Ý•o1ïuàУƺrÉꟽw)PJŽ\OPÆg¡óuYDV"MLâMaDƒ(¡ │N(RS=c¼Úg ÍjT 8O’èܰ¼6b¹&3ÎÄØ›>“¬{UöYS¥´ kÀŠãßx =p5·AhÖ²½Éî5ö-c?¾&P8¡[Lbfà¡l«à¨qp™|¦€¾+†?ƒ×Ôzš^p >a|ŽDsœ²œ ¹+FQܘ[ ö…¹7þ·@ŽOÝZÏÄh”# \(§öÒª+(6ÀQª• ÂXüXÀŠÑ>GÉÇQ–G&®ƒ£(uÕ Ü8Ê bGYGYžVÏkôô‹¿ žx«‹€ÍXí3yLòGm;D˜ÕEïÌ28_Lwã\Íq©Œi½ß+ 4ÈÌóæ?QAæMŒ¥PQIÐ/©2¦qˆ:W…Éá‘2¨2&U˜'2erÞG7ñi¬Ì奴'ª„K§'>3QËÌ`©t¹R‡SºŠ9«G®üHM<‡+ZÑ&½¹Â*+ÂOé¼l’H9»ÿ!ëeðß ðŠGSBÁYÂ¥Ãæ’Ž…ID%ø|\¿îÅ~ ªD9»­¸cÁ­¦¸ãòiM²ƒ¸7¼˜2¿1™ë­æÉ­pÇæ¨¤%¦8!3ü!Z‰N)ˆº÷^I¢­îh*ÖJURÄsPÀYôJáªÌM}6šyˆò¹Éê,™dÞkIô|;¡›âìÁQpŒ1ÆqQŒÉ-Q‹ÅxTŒžÁ`KÅ…dÚ\[cͧ€wTã¨qrqÚ½ôhµoçêgŠRd)U;Ë„Uä ÖfÒfqaÌ`Ûu\ÈÅ0` t/Y›xȶ×Ë‹¡5Sժ޼½q'âN4ÒF¹­ —Z®¤ß-·¦`\NIoËiŽx-‘àˆ÷Æûñ{šLrÞëMšÞ®4múú«µ=&M nCÕ?yã.êÛ—Ø‘:ŽÚˆ7AHîhÚG·BFWzÊ•n<>™X‰Í©a•—÷— =* §} '›2÷ÞôŽ€&Çô†S¸7MîV5¹²¬ßnn\RÄÀ £NŒJÚdá*Ý.²àÊ\Uƒñõ‰L1i ²Á,¢úçY ˆ©þ¹ vfZåó>‰L=Ùj N¾'ŒëÀ›€÷Í^üÖ­°â¥´(µý›¨ÀÔ–àk.G©’L‚\ëÁ½1³˜b0 Œ+!0õì¨*D:¹º ˆú›ÚzÔï.]ÙgX är¿í¶›¿ns4`àã»y¾ `ds1l.†#;©ÎEcð3ï¶¶DZýJU­ww÷vžÑS*ýëq¦°Þ)ŠÔœ‰°È˜t{Ù`ëÅS2x.'³y‹,»žõåO çøËúHBâ ! FÍÓ¢Þ‚u"*É,Ÿ:Æ$:1 ›¹|‚Ôî$~ioIbU•oï]œÙ»áÆ-Þ7w'PúïD5–X!Å3Àt@Ì»õ6SùfMåº8?½á*7\e¤NHh²š‰ä‰æ}0š˜{ð$Žh ‹ùÇaR…2••`êJÚr‚z“šò™e*3eI£“Á dÁ§u%Þ·§ädyÊÒ£…?¦œßì´u™vúœF¤^ÎDÒÖ…y>¢wVÕÞù¹_‘þ¦--êÍ‘©ÖûÊžˆâ2N¯Ð /Šsë®C½oooºË¥ì~àÒ‡-x=îâGí6hÜ5ëOñãzƒT…WÚë„m@—o>¹=ë© ½½¤Ýõk{ëYw“Qºç•s"£AÊêb¹ô^,ë#ܦ"9ÌŒ“Áž1ÅÑ$\ÈÂî¿o k)8¤À”.eÐÖ¹Àn²wlõàÉѧ´U|×ñ^3Al¢Ø$ƒ•­›#óbÇSªÁ.›ì"cŠŠB!SÙY4;1@Œkp:ÄTv½).ê€Ù˜á­2Ã\I ¹\+.D¶Š«(פn£(ò  !Ã5‰ö$L ¡ðUE50IM=R_¬ÈkD˳R¯’ ]Ü=n‘x%ˆJ}7¢.3,/™?ß½Á m(z`bƒS6wz'\£ì4AçŠF/Ïàe_áÐH) «Æ£–{c™J>‘F½V±‰§u[b/‡®ù“¥Ên¯ZK¤‹ÇäÅ/.7sÙ­yž•N(ú*SùŠR„™²Ø³3Xh1Fï÷ˆ<¹%<¤êà0¡é¢*#X“;±bfC—÷š3F C4&"ûöõ(¡c2{€aÈ0Ú%²±³õ­úÍvÊŠÅ£8SÎà=ˆóyÅiæ;‘£|…/Ø^!Ê38k•}Ô>±K˜”²Ïça3v~¡LåX13Þ*!5Zµ>…g˜d{|7M,å–ÌYŠ]!ñ𺨄²Úƒ‹Y ™(Fø¡YM•QQƒÎÃ:¬A*×P†0T,Ë0Vl&,‰©]RÔEZº2Rcš4ã|›/€R ÞH&Ü=—'¸GÀO"‹"ÌUðdP™Š‰°0H&â–ɶœÎ'{êDñJi­p£þ¯tõnšÝÁ`³£\¬îCŸ-[ìyš¨Åíi¹×ƒLDüM#Ú[‹¾q5’•ê/ö÷ÀÑâXËåù€ÖŒijÕÞœèzÈØFfÝ烎ôV ¼în©ª'¹9ã<Ãqàî8šOï×j•nûüÇ`E\ÔEgB²ŽÚ\&üŠ5ò–dH3`ÙŠÆ·e5j™Œ¸ a„©Û—)çvA¦Þ«ÄÅPªÊ$zǸ;þ–}Ão)ê7ã"rÉ%ni/rç»)}À•ý¿ <ðƒ©1P)†×39qq¢{%²¬Þ ϪËÒ»‰ ׂ'ÞrÁ%$5~é—iÄeN‰hãõ/Ð8^“ò͘v`Â$wÿ6­õ)‡È¥¸_DP‘H—Á”Rå0Åå”û·›aoÎ –HÉ0YØ+.7s§ªïØùˆ¾JS@JôÀ„/a¦ GK‰8ªpö.|:ƒ·_¼*Òþ38Ít9Sá\ÀˆÈSN?BG„›»Ó›w •Pd3¾ç?UÇ—Q ˜+¾>'ªl½˜ÀÕ–¥æ™`q÷($ >…,7i‘»Ò›7èc)Kí-bó £—Ÿ[ÿ¸W\˜& åc?°D…\aHÙùtE$ÛðG#?Zql;r¨­u?äš‘CŸà75ãŽwˆ z ¦ÈÕó¯÷ø&¢ðA¤|DM¢š’›áåa­ýE‡¯3ÀÆ5óÒ­Âö*à˜7Éù™è8E×îe¦”à½K¸éD¡”lßjïoŃôšËa(å '-–b1?†y1[–xEâ ¼±Ð0 49û,ÅÇ‚ˆŽ“Uæ-uŒ¹r0Ä¿ ¿ÁÐìf ¼É á2nçÇÞoÅ+ÅÎ1 ËÁ+ÅãÀ×m˜Qà [øî­Ûƒ,4¦Î/ì1Tp1âÓ‚-ª€€5 çfao%ìMaúÇßÀq Øø¾“Œo ÁôOžv´‡Ïç–ÝQ+53ÞM} Tá¨<ÏŽ”Íä ÎS^·:AŠJ1è”Yž¾ÝXŽcn…e%^)¡±üz<Ñ>¹ÀJñz0…`>gm0¿„s ÜM¨c0ë Ìk9¢û†)ÞÂX¼× ÉÉÿëú nÇ´`98-و圶§Ä yZ`ßà8øRÖÔB5¶gˆ¹,B{—µ¨„7à8%¦QÌ…0çÂ¥ÍÈQÚêýI,6<=Smì53½3M/›–ƒy^)ä˘cckšá 'ÅK@ ]¹¾ KsÅÙô…³=ŽÆ°DÄRïæøn2;Š÷€±3Doíû’Éú„Êuk±…‡Ï„‘xB‹ÄIË ëØ˜^ðMdzƾf¨áf¥¤V]A9µ;£Û·£.¼s¦ª'o€&´&F0w#Àã`K@ n~þ^?ÌC}Mo•åŠqbˆ4,îaÀ].OøÚ-[”“ó¹;½€Ñ¿E}oËÇ 7c:®Õ½7çµ–qøµû~è>8ú穘lƦf”ÙêßgçøÕV´Û­z@ÕñE½×'°ÿ÷T÷ z_ RºŒaŸ>¡qÌLvln/n¥¡µö2¥N¶ÏM,Ð1 7Çx½‘e(ÜüÆÂTÔÒ_©,Áÿ\\à6pï \S€ð>@Ð{`WŸáâo(ZÀ§GÌíuu&öôêÂìÝÍsŒð¾Žñ†p’½}Þ}~ø?šªö endstream endobj 7940 0 obj 5523 endobj 7944 0 obj [492 /XYZ 38.2500000 189.500000 0] endobj 7945 0 obj [492 /XYZ 38.2500000 522.500000 0] endobj 7946 0 obj [492 /XYZ 38.2500000 189.500000 0] endobj 7947 0 obj [492 /XYZ 38.2500000 522.500000 0] endobj 7943 0 obj << /Type /Page /Parent 2 0 R /Contents 7948 0 R /Resources 7950 0 R /Annots 7951 0 R /MediaBox [0 0 595 842] >> endobj 7950 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1409 1409 0 R /F1700 1700 0 R /F1499 1499 0 R /F8 8 0 R >> /XObject << >> >> endobj 7951 0 obj [ ] endobj 7948 0 obj << /Length 7949 0 R /Filter /FlateDecode >> stream xœí]ÉŽäÆ½÷WÔÙ€j˜ 7À00K 4€††dÙ,Ácüû®j²z!뙯"“I5fÔ9$s‰åÅ’ïþøýßÿüíðîã÷ÿ9üÐÿþñû‡âX—E÷Ïáüë»×?°Í±ÿó¡nÊÿ<|;|{øòðåôßoÝßüóéOÿ;ØÃŸNÿþ|øëßN?ü±ÿKç¿ðËCmêÓïÿ~ú½­ÍéOÅóïçŸÿëá/¿;üz~ãåsýdÞþÿw¾®kgÏÓ˜øô·‡Ë2ÍÓ¯ß~øõá]·a_iËÒWþ`¼;ý§õöðß<ütúÀåõű©líË¢màŸÉ×öüõÆ4cÛâPÖ£o?ýÒy»‰ñòÚG|ùyæÚ›b\eÄ—Ç>íÖÖOûùí1¤m\Ä—Ÿgë´áË#ŸvU¸2Þi¿¼=ÂTEk"¾ü<óH§_~l½1uåëâ•Ñ­ÀVE·=Uã#lÐóëcì~ëã1r7sõ]¹œ-~»âáÖ§Íé6ȹ‡ûòúû_ûÊÆ{ùÓÌÕw¥?ÜñÛ¿„¼O¥û €’ß„?|}x÷ù4§êðõ§ÓÌž>Øýöõ—úŸ3x¬ÛÃ׿/ Wÿáðõç‡öXW'B-Ÿæ×Øöi¤96mñv¤°päãÓˆ?zסõçÿéi¤Ü½Ä˜ã äžÿîË_-ŸFÜeàeÄThJÆtosGgc_¿ ?ãáÈ'´@¼]ÂÒáv1›oð\p”ý¬ûm›5ë'× †Ì 7 &|ÈE Gâ+#?óØáßÁoëCD^«šf°S˜\+FLEcS¬<šÉè„„:–Yx¡£)Õ™Ù/1ðDæ(HâÃÂÑNmhD6i‹zÈ& ˜  c¼AŒ.ħ‰—ÕÃ'ÄÛ¢(ž ïì–VË:lN bJøØW`lÏ`yI†²_€yxÖ¾êŸ)FÏÌ×kú†¢¡‘¥MB*‡vÛû×HqñÛÌ™&*b=”éß6’)½¹ÓØë½í³bM$õó6ªøŸ(®À̽»,3@[uYêè,6™ ÍØë(hÚùÆ4¦Y †àÉ<Èð“@nŒ£ëˆQk–Ö(¨M]s-²ß ¼Œñ”°DÀÇ‹w‰PM ÌtrL×DÞu-íÕÒð‡×§×^MÑ Å…™‚œ»2ÒÆxóÃ0>­5¹æoJ€À[éЭ‡‘ åÀãÅ¥.ã^PvCÀ.ÂÀØœñ!1ƹ@)ûÙ)/ãêeX`cîn €€Ê± Ì ò´ˆhïýœ¥iм̘{È2ÅhÇŸ:ŽÓQòqBé:äöä"N÷àHM÷S‹Ö½Ý·÷ðm]–±—¡9zÞ¡ŒA;³)ª‡œsä3_#>hó….¡=l> éna+5¦Ã´tmÂX¬BÖ‡n†£MF1"¬TŒS]­’H¬J ¯ÀE³d¸t Y6Ýa+ŸH1P-#¡˜«ó#ÒÊ^QÆìgb;º™ÿª.#œˆ½€f5E3T­€m&c‡q2w®ðw˜ÛXó½ º“Å[ ÈÁϯ¥BIŠù2 |]®ž&ùUúPÝ%÷m¬1G „!ÁùPžÊ¥½Ü'ÄäËküÌår”Jr<²jt‘ÇlíL¶îf¼ÑÂ]2œ½ÁÄ ‡"T~ÚüD?AAîX ÜàMÀÚHqê-Á*®¶Ó¤¹O÷ßRRê뼊'M$h„Ìž©Uª17&èGU队÷M±aÞ†äϦ äÍ›ë^áÍáKo‡znOâÉ@W1®nûˆ p›kÜD Á=Dö„n&D¹6›¨¡‘JõêÀ*ÕìVåôSA$ ¨L‘ª£1\9PtÞøŠeæî-swÇ·}Å?ŽöFíØ•g»õ\1wñe%êÆ0vb`YžªÔÛÖ󶆚֙ïæËØÒïâÌjÍ…Sygu ,€•—¨ú,oðþÄTŒ¥Ð,Á*Â1ž­T™Û©rTxi› ƒ4 FT–'s{J'Rñå©”‘AÉ2ºDõ^åqÇÐS¤ ¬ƒ•3ùø}‹éxlFz±wÞ <‚™šÉÐȰÎù¦Íø4Eެjèƒ1<Èœ¿pm¥»ÈE¶uÓf©Kæ« åe±Û¾jЋPÝËbƒj›¡úIqáu¨ó¶^q›Š­¨r1“(Èžåk‘ñ—ßµ¢áÅi¶æyÜDÂp|ä¹oÔ]ÄøxRÙRwcÜ£ˆ™6]¸!¥a9Oxf¿AìÒvW6ôÐõ©Þ#\õØ9ÉÀo¡F ¨÷ÊD4ÊÉfàV`¢mØéŠUE€›t¯G“£JR©"D&T­ ™hø;“]„¨|uYQ¢õ[3Ö™œ °¡.2ŒTÔ-¨È€@Át0û©b²Û0|&]\ÿ¬ï€/´À¾Ö Ž´p{T?Âg±ðm=ë_1pzˆ±¿ÙÁ¹9µªÚ¸=<+Œý¥+—ÜœÀ×Å»!œÉÓ&b‹Âw"{QTÍzA5êúÛ5J3‡èfÿÖ]¿Ô›(E%ìõ¥®X™ªt›Ò,qomŒ”p†%@‰"º²äo,oØ­0çÃXW xÄ@Ó¡ÏÓ‚ôøm4*0¤7pšŽôÏÄAιÙv@ˆ?Ÿ°×oÐÌ „Uõ–È´@vZéÆÀu“nÊiÄW£ÖŽ(ãSµ/yȵT½¯«Ç&›A÷ÌJ˜-˜¢…D‰ºÅª×R­¤qÑ1 ßMÎ0˜îÁtmÞ#Ug‘T†÷qü0]'U¯k/©H˦UP¤T¸' ¾u½þ™Øˆª 38Ø=qìTßWñÕN•)àqž¦6ÒªŠ±-®"tÂæÄÒqy˜()±J9ËzkíRêqÏÔ^7‡‚‘÷ª±¸½"nôàÜJSÒ¦*$pƒ6ÕäÌû!¦f¬·€âŒòQ½M–L0ÿÂÅ)bjäþ–ë+¢LT.?Y^rmÍäÒ"wHLFÜKµäJU£o×ë»^×3Ceo+÷^aŠ©% XðjÒ^JžöÕ@âã\‚œ“š‹Î &vã¼ ?º¯ø²ïL×TNƪìIZ¬fBëÞ+òÔnS{$L„ LÁÂÂDHè*шƒBKXÐáõ|&fݶoªrhlD·Ýšª½®î¤cgsël)üË·¤£(%À B”RT®8­êÑÖ­éKùǘÁü¦QºÝ.–».ç(ØšùœÊ-^ûgÍàÅ"bwºÈ6YJ]oûò ˆÉøc$7±;½eF;º3Ø]®kÕ;uÈÜêX:s*jƒÆz @{uâúGÎí¸Þ.osþ˜ÆéàJñ ^)® ÂøTˆõÑc¾µ/‡h2UêR§±TWä&«b°±ªËº­²Ÿ)ó58h³Ðzí—Ò_• ³h/F¾£Å6 qHHvóíJña(år£qƒÃþ1樻ô•¦|öÓã¨bÙ»çý`>B” ßµ…‘:ƒ£TPõÑ0<¬±Šƒ+Å·}M[ùõ6ë‰Z/¼×f]5šŒ]WßΙkàT&SF³gôb‘Ö˜Áî8Id†D8I¹àøÆ¼%½ÒŠ„öŠ|ŽÛé. N[ vfaˆó2 â`)Žín qp¢,[‚ÁY{¢·Mé€LušÝ…øð}Y"¸¯+ÀF ÉÜo[bËûŒ—ObÚï/™¥E¼-¡Š«ŠªÉIŽš› ?Um>¾²0Ö]6´‚Ò"rÏPÕ®DT*¼Àù2 $Ndx…ŸpÖºýœuJáèzP*S½…¿Ã òm‘ Ç.žŒˆ‰óƒ£ö–··gs*ön2wSD)YpD¨³)ÿOðÕí^2 xâZTMå†ò0Ñ56ìó³ÐTʹ¸0^obFp`5zÔ]ŠÐkrÁâKµ¶_²[*ctÍ]7À¥Rn8Q«ØÅ”$3ûc•Ê8 M/q³Ú®+惡kl ñ‰ÛQ‚§@íÎEs0íÕ€ÕmGó¼kôdæw’t¤+¯ŒôÌTíPüüLC¼ έ×aמi. 8*}ÿᙇn‹î@Lu9«#ýñ^™[ÏW¾cá ðz*8âàœAAì(Þ7káJ;1X± g¿#ìh¢„¯Ê¾‡Þ/ {0Fýâž¹€‹Tâ-¶Ô5Ê!î^½0¼ßú)òM¹ÂTË 8æ«%çî…iÌŠ˜þ梨™½ün&S2ç„F7!sFšhTù’a -T&ãVM—Áœ¦Ò<%ƒêßX±®¢ÔiE”*ž ;E­ýYÔŽ÷hzE¾–ÑUt‚ptµø…ãÁ¸pÄcP7ûñò„FË`x›Û·Ú– Àçäg@×Ý'œB1cŸnxxòW7› І\[Ìźåô5öžºÐ¡ŠÆ•¯^Æmw›2Åß¶—8–Ãù(Ä=^ánÌßðx0u_¨ýÂÜ$žº" u$*:íð=<¦„5Ìýnâõà¼$|¦pÖÓÎŒÂyV8—‰X0¦; ±o˜ë=œÇ{s³àˆûNÚ9c'磜_Fœ}¼‰¿ƒ)–øŽÅM ˆ0³vÄù$“\ª{PÂgðHöüìÌä|tGù¬ §/.åñJW,ÿË8T±R#tÓ´FÀ´pn›ã …z¬3ðJu¶m°Þ$¬+¦áÞF aôBáL×¹KȪÍF®Tªf,Ÿ0ÒÃH|ÅÚ¾i²¡¾åGîG3(Û¨Dc|ƒO¨ŒE`.êL±¬Ùeš ÓœZ¦ü´äòE=I—w4‚yF÷¦,¦eÆ+ß&tEÇ3Ðå@ÂØ gØ*º\~dçŒ 8ƒÑ@™p“/ó¡åÅG”}ç)ϱòÙì¢îˆƒòEx–}¸$>Sÿ6 +׿ÜD^ü´2Y^#ªê#üÆFˆ6Ö•yh·²¸)ÚŸñˆS+s0cmêëýè‰=Ò·V¯S‘>\‰ S/¤*‡yŸÁ%{Ô.ŠŒöÓóYçȵ»·¨]Yn5MÑÆR^°MˆL~ŒöHŸ$öHßš#}e½ç(Ìâ™=žqg‘¾²Ýcà;gäÅëôUf›ßvÂyDú*·Õˆí:=¸)-ãªÜj”w¥qôå¢Ýê­ÆÀSFúªv ñÒuê‰T~ì=XÜS ï!ÿ-¶nàܶÏË=:R›5dcP6Ùâ´, 0Œ™°þ`j éÆ3¦ªk¤¡X—mÎÙ}r™X µ_CÔzÇÎ;B¾/„,È4H‰BKÌ L0\amc¨:ì\m5Ö.T´d$1ÁMBÌ1m³ÙØôŽiwLÛSyS¬!f¼cÚÓÞ¦Å5ˆ)º†§°£Ð(RÕn5ƒCð’ÂÓ+–ODUs!ëVƒg¤#½…Êûªy™`¿†œ˜”Qü¦ZC.D5ïÔHš]lRçB¤¤‘¶¸%Š˜t¦Vÿ«]£Úú¢ ©F¤L“ÜÁ¬S4sš[yø½€v?L£9¢ –Ыt-µ„ÖQ>œ–„ê65Wiž‹w ¾­·~Œ¹Ç Öxƒ U–ØÄ™–z3âgˆžX 1¶˜®|[înnªik=¿ûø™±—¡›ÓÊYh#Š›ÔÍoÈty]L1ßv ‹†Åú)BÙ§Œì¶Q”Û'‘*¥Ò™Våkê¼I-#‘DLF¢ñ»ÍÖEU­!Ôl½x3Tª=ïˆ+ nI‹qCÁø™Ññ3L5’NªZ°Ê Фºˆ'’4&‘w©>!›ËdÞC B8C„-ÄÏdlD„ŒÅJ€s /árH‹}×Yh5ÀeÄ €U‚TÆlf á,„åÍ&ˆe_‰L:2ÃBÎðön÷Û2Œ2:7à.&;•{Ê©Éb×Ai:v´¤º*@ªZši²˜@mªKQ\J(ä‰Y\rÀXÜœ¦ZŠ¥št³q 2¦ÀŽPÐ ÙbÖ#Ì—;Y¼Új›HŸ°ô-Nn(N£E}X a¹AHÌé”LÃEæYC•U$J …ƈód'^éZË$ÕÖÜRö¾€Å|±TdJ× …Ï}F´ü`št %ëT Ó …&ñ¬!7 ßÁÜDCÅÏàï0…öð)8,Ÿˆ²¢v`vË4¢P½Ð2‡)pKÈA·q1TÌÛ˜zUu¦Á¨9w– õ‡»©$*ªÀ§µNª ZRlMra»—=ÊØâgðz°…I K¦XsÂB­µ­o)&¿#ÅbGŠy E¢M¡@UºMñzð {•ò2£r,o¡DлD{Çì‘U{K™yo³ß•3-½d%ø¹˜XáOc°P*ì)ÑCÞô®K> endobj 7959 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 7960 0 obj [ ] endobj 7957 0 obj << /Length 7958 0 R /Filter /FlateDecode >> stream xœí]ËŽãÆÝ÷WhmÀšz‘,A€yÈ"ÀÀddŒãFldâE~?”Hv‹Ež’xxY,ªåÁ¸§E±ž·Î}Ö½oþôÃ?ÿúýðæýÿ9|í~¾ÿáI«BµÿN¾¿üÀøc÷ïCå‹Ã×_Ÿ¾¾=}~úÜüÿÛSûÂïÿÒüësøsó÷—ÃßþÞ|øc÷¥Ó~}ªtÕüü÷ùg]éæ_êùçéóŸŸþúÝá·S‹}wÝ`†¿ï*_){Æ•®¿=õÓÔç?¿ýíéM»óz©‹Ê©ò u];søï?Ÿ~j:è›WÇÚi]•®RK:ªÌ©'mêCóWlÓ[ØÑùLóz…Æ]iÖkü±ðÉ{ôDÁÖÌ[øî§„ï|€O>ýàù|šßöð¸ŽÍëYk¸? Rˆz7¦xÔR¯­ÏO>~iëêçÌÖ}¯¤zE]:ÕvY»¾Ëª[‚ª,Ϋð²qíø£¯ÕðI·qSOZâuGg[ =<ÚïX[+ÑÝ’_4¤Žfý-ý9ѵÀ­ÁDúñá4ðŒG_…­ÎYá}Š£5^ÁÍ·#±Ç•¾ºq¿z!ÕöSÁ±áMׯ;°SÇO"C‚Œ, \üÈÞâ â±H– ”9D̘@ðʶŒKÛ~†ËF÷Éx‚RÖX·YU¡tÀ«0hàa޹†)²ó rcéˆàQ‘ù`&FmÚ'Z÷Í-¼Un ·‹ @;KoY¶âq„†,ñÓžÆ:>O¢XŽ×‚âàLk˜DGÔE7^%ÑÖ"8§N0†V) åvrîväVÉ#`c¹¨Ddõíœ6Dá«2úúf¯BÛP+«ñFÄ àÙ™B¨ vÏ BlxGŽ8’÷¦Æº­(£ÇPk€Os*}éÕ™á"û4Cû=À¸5leôÚí%ý Ñ·ð #gÊãghð3äŠÛÅsÊâ²3þY4Šæ&ÈÅæñ¦–ºŃŒÒª‚Oð;8áíÚÄSé"\]Q;pD("\…Ÿ²¨íŽâR3œ°„\ÃL]Ø’"€™Ó eTxñUûòêʇ ¸ˆQ nQÄý¾'φ°bój,€:U UáúØ-ÓÒ¢VDzÒC¦—3înæHbh^6˜g+f„w=rØfD±Ø¥!ÍðÄaz5ÈŠ4(Zeðh!ñÔ ä!^Y§ÛxH„SÖãœsèÍ'⚣.™,@GCnÜö£‹£ªíp¥°¬UðµéÝBG„ Ñ݈[‘󎤫Dޝl"ò¡Ôæ°±¥FOl¹ö¹©Tž›WÇ‚°W‰1~[l’Š9|ç! ­Hü¾6!ñψ¶„ÜŽR=Eejódƒ«6WÌ“…A%’3î}ŒuP U "ðø6œqSƒ²íñŽÅu%mŒ›FÓ‡WL"$ÉšP¢LgzôEz?…d?ø.SHÅH2rÐèv"a\—•ï¶3XÜY8ÙÝ™fÂ#‘@˜ÅÇÛÏ8°¬EèI2¨f܉›ÛÞ‡K(«ëëe®.¾³YÄÃû1ˆ:ãù­;Ý…î¿ô¹ÙQe‚Z…ý© óÙL ¢vE›fÄ’0>>¢òŒp],Æ:ò~|9îø<¿Aé§Ó\ÖÇSO¿ö¿Wêèä,ËÓJëîSs(‹c‹sªÿäëSéŽZׯ{ýü-;hÅ^öÑ|¿ûÝŸ^;o—UØGóIóÎp$§oùA+~ØÇÏOï¾[+iÇQªç;ðLý5ÑzÌ¥ÃÖLµªF%+ÀïÔùŸŸBBy±€+ZwæRm^tÞÎ×S@W넚OF@wú–´b/ûx:_M/Ã>šOF@wú–´â‡}$ºú†[Þ»Tþ÷y•ŠŠ™fÂ;¥]C΃C畟8t^«à@œ> Ýù[vЊ½ì£?t^•‡Î«"ì£ù$!Òé[vЊ½ìã‘L1…HÆúpcD:}ËZñÃ> ’5»D$Q!9U‘,C(£Æ>Ýžáö3˜íÓ+S¤ b0ÑCLtå&:âUóÉOß²ƒVìeϘèÜ&:;êÃŽ1ñô-?hÅûH€‰…îMqØËÊØöœ{±çìSÇLuc|F5U; –© *xÃû>§…¢%žËšø˜‚ØŒÇl éeå°ikƒ¼¯³ö:œ~DÒé£!tê>8˜3nÝÚ¥0?bÎÇÕRÕ^$<¥Õî†A$ýÃgOÃìôN¡'䵆£Žp4¦XL}ð¤ãJs‘ùˆÊ¸5\›“’.™ÈR"aKe,yHIZëëTw ÏáÚ“4³sõ’ÙÉb,D„œõ™}Ú‚(y{—üŒ’BE±/‚pL?‰¼8I1¶\äwÉc*—ÌNc1Åa#Î}Î4ѯð¨}R3Å~jFÃÃTŽG×Á±,PĘ%¶fGXÛT„ÃcN…-]Ø.“qô£'¤´<˜Ò. ¤ìù‘ÏÇ®b±Mw™“9˜~7÷nD¬™£´U÷¬O[»HŸ&ø5Æìeã~ºÂž ýXrħž ¥Ú”üĽ~cÅbÛýAד97Ës—NûáâhuloÌ\È[ô¤;2ÅÑ„×l4~ÇÏo­¯æ=ñNÞéÄ ]ÛË!#!åU”6ÒÑ“Ní™z§D#PpEñ¨;f25ŸðI7×ßvº¡Ÿî`MŒ­;¦óVöc4[wL«£H¦(Ñ à'xð"ëV£Ö:‘tj·ñÚéÀ²<Ú–¬o¢k%'ñ«2Þåp 'ê‡1weszE®°à”*x>8ßT·!¦tÃvzáN¤z’ìFÙ$ɉú‰Ü9ÁWtfWzœu7(Uaé9™£G RåÚȰŒDÂíTäíl§¥ÙZ¡]ÈטjžLfØš»Ð—¤ðÎR 4¿O¤h> R œ? R ´ß²ƒVìe]Šæ÷‰ͧvÔÇ(Å@û-?hÅûX=Å€wuo–`.,F’‰äß]ù[{Dê”îÝó+Qà˜Úf·§s¦Šì19\DÓ;$K„ÿ :ŸQD#U†iÑ<¡fŒ¢Òµí.?gL£òŠ,ÞiÖ­‹d`(°Ø ßé64Uà'wgÄÕÊ™Ô9BÙÃ|¡Ü@´/T1!Ú*Èî~þ$íÏß²ƒVìe½h_(;!ÚÊŒú0#Ñþü-?hÅûX_´/ô DŠáR´Â“ ø¡$S¨ÒŽ3&9ïíÕŽîŽî*!òæ†}¢Ûî³ûÂØ!O6nŠ'›2ä—¦óäÓ·ì {ÙÇ3O6fŠ'=êCyòé[~Њö‘€'›zdDDJY‹ìƒónÏy…ÍR3¸5CK·'Úd\3$¥1‹Ê&7eŒ3öi†Ip«¥ŽHqDqÀß\&Œøeñâ¯os6dk»³,83”bœ’b\J®K1§oÙA+ö²g)Æé))Æ©Qj,Åœ¾å­øa ¤×YîÓ0öo^µ|“ªøÅ#¥}Ž% å8G©‡œ£4Sœ£t!ª—nÌ9Nß²ƒVìeÏœ£TSœ£¨Ã>ŠzÌ9Šg^Ñ·â‡}$àeu€D i=°þ5cý£ÔctuÝ8šu{»¡»Rfëüà »·0U„Ü‹°ñDvJIVß.ÖbñL6¾…ðÃ¥ cKæ¡“]7Æ"Šw› p[Ð=5êD%Ž|©ú»þýų íW4ƒä!dÙ¢Ç/¢Ó1£Æ#˜!˜íÓ3¿½³{³Ò¤ØÊÀÔÀ$ì)²¦ef‘}5X² 5ÃÛ›^úr¾ ˜"Sžp»RÞ8Ɖ¸LB A©nåì’)îÔþœ(ÿÞ¼ »ÄÿœÅÙB‘3L`3®ÙSá)¢¹öf2ªG`<£CFÙg ¢œì›_n{ÏHrÆk-rL˜0ñ k¡û²&5¯RÎås†¹Wqýt‡s¢ÂÖ œÉ×fÁïÈ#ïõ\,ΚËÔÁ5S^MVù,ê´ûJÕW©"Rk’©ÿ#Z[+²¾8‹µK¸¾fQ=–Í«ö2UÚ"ôBT*Š ®r[‹à2Þ-QŸ˜ª-Çd¯Ç§–©ýÇPb¢º1‘ê0Lu0Œ(‰jî&«‡G½yEâýÖk¨\uýd`©ò‚duñIÇH ©cg„³`ª h,eÝ‚ª\R¹ìÞöcæM¬`ªUè“Ò‹_Rëîè…àn­¨©™ž*¼rªx›¬‚õ_BoŠŒ ~äÍ’ºlwGI‰jø&ÝáR_¥ßíí})m1§;°<Íç^/­ÖAe¬é¯ëÜÉtŒß`½Ð¨™ÊÕ9×Å~‡íkg3õMó°¬×õY-s´©•ͧòi¤¢(÷޼Cص#Ük.Ln<¸ Ø~ž¹­VÅ’š¨û´cEö„©*=$x>Øf’HSÀÜ ó°ˆ¯[¢ªÄc–0UÁ~ð;̶¯_+»ÛŒæ¡ìÁÚ¼Ö5>?‘:òøI:=£VÕ"­ã-æxÞp LË»ä9™KßµòKª‡gmíþÆßŽã."3Å’8æÜDL ÖôïNBÈ}µZßD=Ù\ƈDð|&b-Æcƒ­XK€ýà(Ö‚hçðºáÀQ<,ŸÂÕÉä̘Eq b—×n©[µðz"rÖÀ1^nË…ë¥5Ó].‰ÜÈÙ{ù ò•?S¹_âݸ· ÇÉxœŒþdµ$²æõ8MÓtqšÜž°Ÿ™ðË2VWæö…,×Jeânº`äÂ猸Ÿ){ç*‚ÑL$–…6¿;”Ì>—3õâØ1â®räÞãd¤Ø,b;LyÃÞtIMŒ(„mk§ücs6öƒb?PD²Âœ…¹-DHcÛûu…ãAîÌ·Tò­y°h÷@»ÌÑ.g‹Þö8˜óêd‚õ¢ØƒB>2w„Ü¥e7ìÜåºE¢s³À[«—Ä­<ðV=ð6w¼ÝeôQx»ËuËUí¢»ª>P5wTMŸ–¦Ê#rr5߈Š"Øçk_¸!¹Ÿ‚7«íQéS±‹ƒécÅ:›ÆT†ñvÜÕD†ñvWÍÑœË#^>iw¨?éb¤Í±+¶qq‚ÚL%Ïþ€úéV§þžÛ§n¦¨ÞÎeïBpÇÅÁËñ;¢™j¾‚Oš†Æ­Áw:— ž5õ‹Ô,ÁþÝŒ¸ßh¸vÎ)Bx ‹ˆ=²ªáâw(ZÀ»GŒ­cÍ‹v¯RöØüÁ6ÂóŠ·¤{§ÃÀkøwøüô”Xµ- endstream endobj 7958 0 obj 5370 endobj 7962 0 obj [494 /XYZ 38.2500000 314.750000 0] endobj 7963 0 obj [494 /XYZ 38.2500000 314.750000 0] endobj 7961 0 obj << /Type /Page /Parent 2 0 R /Contents 7964 0 R /Resources 7966 0 R /Annots 7967 0 R /MediaBox [0 0 595 842] >> endobj 7966 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R >> /XObject << >> >> endobj 7967 0 obj [ ] endobj 7964 0 obj << /Length 7965 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯Ð9€ÛâC/`ÀcäÀ°9Þl‚Ev‘Éò÷Ó=R÷ÌHý•ÄO%ŠÝ­É8æˆ,ëÍbÕû?}ý{öÏß³÷¿þ'ûÞýüøu—ï«"oÿ“ÿ¼{ý¶ÞwϪºÈ¾ÿº{Êžv_v_ÿû´k?øúñ/‡¿ý/³ÙŸÿý%ûño‡ü©û¥ã/üº«LuøùïçŸMeËÏ?ÿþ¯Ý_ÿývœñ´\ÌÛÿÿÎWMYù##K?íNÛ4Ï~ÿþÛî}‹€°Uš¢q¾ÎŒw>3·Ùÿ±ûù°Àiú|ßxcªÒWùœ…*{X©.‹*3¶9ÌdÊr°Òó¥ùõ'ojk›¼…\-Æ•fdzÅómšÚµ(²^Ò?óôú'Pæ¶\vž!WÇJwºÂìûº´•/ò¦†Ÿ…4gšîÀàçWÓ/qàEí—›üru¬´.Í®ÇÍe^çe‹ _ésó«éÀ¿±u¾Üá>C®Ž•Óáfÿ2 E´(ž„¾íÞ6>?Ð\™}ûùÜóšío¤Ù»£Q›ìÛOÙynü³o¿ìš}i‹ˆc#yFl>›ù g{€X8â4gpð ŽÀu ÄŽÄŽ) ¨øMþp ø›ÇðâÙ,ž 0Pã3…xç`™u0gt€ù´ãíÇoQ¶´òùé€Gr¸ˆá„?Àu>¢‡×Ô'Ð Áë`Ø 4˜Æˆ °AŒ2RÈA:pMDŠ=s3ô&溱‘8»;xžÉX˜S±æ%4UÊRs*†Kj§†À5¶X0•c¨1ÞÍ›†Þ«Ê|æ±¥Fh,¥›ÛVX‹b=% Á6†jDAW&® ãoXÎ¥£°$„²‹ÒGŒWÇøTXJ«r5ĵ²etØÕz[EaçhˆEAO`K‘ń߂yC-èJ&rq€)Éa=NPùæÕrF5'z¥œAÈXÁ¾$ü!v±Ñ\úo&à÷Ö蟠KÁ΂°á†3rLIÏDå™2Ÿ ¤¼‰Õ©Oà& Ùì,8b‰ø=5uƒ¡V–i‘n÷6YYÖøtâòã—𙙈¥`U`nZ=:€5wêqƒ²œ­Æ|qÅà—ˆ¨m±†d$\]l46…ÆRöÚ“ ¤*Ÿs#rG”tkþoÔgçÜXÝõÅòTÒ  ¿ÌÍË­QÅæïuôROð[°¿§q¼-¼áëàlN+3˜b1]b¨!ÏxhWG¥ŠæqtŸ´VEKúüyɺ8S®u8Ù¾¬«b ’ë—hÕ~óÕ¯¶öf½¯›ü•}ʼ0ÒQ™ß{×¾}ñh¤Ëg»4†m° báœØFGª—¾iÍ­bïlmÞŽàu\þê`ÇÓQ`ð¬ð´ÁSé$É¥ób ø‰˜€@€ ã ÞäáH:ÂÉa²&pMQ>b?˜±–#0º>Å{×Á°a iT8| ÓÒŠ—TxMÑÓx”zÙˆ>!+hGl€Àuœ™n ”/Iˆ=5øU, l âK×(#¸&Õÿ`܉Š'ŒP‡íÖÉ÷eeÞ²D‹Sìóƽ=Ûp¶V¢{RF—×<'Á ˜nmRzG×nÓØ†0 $*$}T…æsO2.F31ÛÒ2B•è1½RžiÂ$HKs(6!ðޱc|Fb3$ººR4Ÿˆý¬î½PcŒbíH˜@÷3þz@$ ^Ø/î uâ¿:Ýe騵ð` ¤Ê†×¢mÙÃÿ•ºˆê‹Li„oªI7ãJaغ;™06È ,1w«øÍL€€ ªÁŽ×cN0~ú·&ÖýP“×'.9¥UeÑ#ýÕü~U›^ùÒçnî¶0ª’Ž OŸð .¨ *DÐj§C‡˜¨à7ƒéBêºUýèØ‚ª°pMO&þÚ(ø¼1]1r†ñ5îb0–©pW¹„OäP2C7HF˜DÝÐ9>AhóQQ&|;sÙ'øLšØ§ý¬a»ŒQþ²©u­{Âç­2¯x„Êj±ª^åKcœWìš¼±=¢Xøbp½LÆeÓ!•æ¶^%C"½\)ÄÓ¸bMöl_߆£|ï5fÀ-zcá¦æü€ƒ „Äû‹]êB ›H˜rDãšHç#¥˜²JH¬ÌÏA˜#R~Ø­¼Ea!b 1Œ®󯋲è«>ÌĵãÀÉŽw·WžÒºGn—ÒWñÙOÏbT6–Ùªï‚Û\`¸S&£*@¤E ¿G’FÑ’ Ãi@ß„OÈ,ŒÃ¾!¡ˆéäF) ‚D™$0A ¬¥A·ëîuõ±o|O{-ô¸3&2â‡ëźҟnúG­S{_£É'0T 1 å7`a\r’)mÏ÷™ÖÛGžô‡ÅmÍVoÇNJI>D”nN9åV" %1-*±Ü sS”„×!šÝ1’‹js´ŽÄ#X A9ˆ !QMLU‹’ R(RA0…‡nM&]Nö ‰‹9…¦ŸªÈ4L£ö£ª…É¥*שýLWSÆ’ëT;9¢¤ºÇþ–OøÜ’ŸO$JÄ;M¡`ßA¦UsÊ~Æjdì1obª 8Ò@Dc]Ø6™–§-Ó"QHò²¦™ULËLIØ~‚²\hRKXïTûf,kpŒG”7²ÉšdÍê’º2fNËÄÍ‹KÆ\3Rèæt†M×B©j&ÞO´sg⪔þÀ%|\¬?Öç¹QéÄYø^Dkï­Ê 3d|}èféMF‹Ã'¸µxO$}(ÈõH±ÆËÀ÷ù‚†q²¤€|ŠONðs°…Ah~j6Âs¤Z£FŠ¢3°­o1Q’[YixÏ~Vóè”e@,ïû,)ßÀo1¼x1¼X ‰<¢õi4ùøb=§åµqÒ•ƒ˜Ÿ [hkã©-n.·ë*sum!K.Âú/0o3R•ñ "Qoßæ³ÚÌo?iMâ«Êš[IÙ"Ý$~Ú瓈–°³Þñ`ek|µ­‘TáÏ}Šã”Ç8,ùÒ™)}¯Qû%z;D­[jürZµG²P$vzuÚ«*¡Ré)»GQ¿J· UDnõâ+Œ8P® @@=,±ÇC»·òrKV´2¾§à"7‚‹b1¸âœE¿Åˆ$#d^ËãS€ÈêÞ·3µˆá6S"AoB^þfuب»m¢6‚@8.é#ÊÛjÖ{»I9¤+o“–vLm"‡ÝÂ,í˜Ñ“ã/l¶Ðf %e ­¯¹ñ( 5qÿÅH®ÍâÉ9‹‡¹…ÇPÒWvbt›€ë± Ø8šå\{}Ë*å‘û±ú-A¼1^„IJÓíš0Ôk=¨?}¨š ­‹‡µkLÛ»,Gé³½ó;²½¯ÓÞHÀîÔµ×q†Ùf¯ßd„Ò×s2‹îgäŽlU&[ kdÕZº–• ŸÖFº¶÷ýXåidrö\3s³|7Ë÷‡-êïÓñ8[Gyö44ï}Dœ„Á&øþO¹ÙqƒÂS Hm«…LºC™ýõô¦èÂÃ,ø î±M=xbp¿Ñ ±¸f‘nØ‹w~­Å–e^8ó/þ‚ž¶ /öÖbY†¤L¶Œ'aôM¬þî¦Ð¤»®*Â¥­Ì;͇ÉȧtÇà©=ñ’ŸÂ¹®áHPdÊÏË1êîõ*Ú ƒ c ã<’L4 QÖ`x‹+Ô¦.z U@*Þ’ê#þh¶¶nÑÕ2˜õºWùa^Y+_ h0®þôm(°µ p@4j¯GCMcB À£àA2î]QíªQ©áa”€3À#ÄõªÓKe«bá@ã¤mcAlSöÐMÕ"Â;P5WpMñ~]ŽM'\ûjºŽPf–:cbu=;.y•8PŒ¿9Ý·»~0.Êwkff¬ˆÄæ–‡IÂA Pl:eÓR)-¹ F-óºoÀ0´-Kæ2I— ˆ jLGÌ¥JÔ—ˆIQÀÆÒܺÑ#,ÿU«³êÚº/å,‚,ÀONÙ˜ |Š›·ÛU­2†'âI]Ô¯µ¾¯†ûhfÄUH à[ iQ7žÓ‹Vë õË£éÐSüA,β‚xM5ÊkÁÄ“Ó+÷,w˜žQ~̧L½vB ¦|CÌc£+ªå¨r§—EBv+skÌÄp4ZH0éMÊVîÕ€Fªnú¤ŽþT½KÆ7žLN¤ŠSt!!F>(ÇúÎñÑ=þÈ÷Û7¸‚¹‹Ó ‰L¼±EOóÅêÂ{tšÞB²0TÓ¾¨h36±ˆ<ƒHG$Òð~"`gÙüR0HÌQê³W{t¥7‡Œ\ bÊ 43 èu§Úà+Bâké{zS÷^#D®×ZÝÂA0 ¹Ÿ@î0¬©š#“¢µÏ$ðãkN ¯q[ÿ¦n^¤£«VcÂŹÆY6XG:KÞZZÓÇ{ÊÏͧç›ê&èa®¥¢×÷«ûãKk¥9OâЮÓUÂ&‘¢—Êoso͘\+Ë”zù­$ܤŸ½¿d­é› Ñl5UÏféûTÂÉI$ä˜ ­°¼–DPN%ݬ¨yVÔZO>”ÉàšBñrYêSç!!èÎäL&ìš2‘!³+ÀŽÞb–·ö™yµ·šb€e2²°¤SM ` ÖÉ0^6wÏ?jéƒñ²ÀµkÞTN_(¡L´£Hº!nGGˆu<eû=lÅ``tË4Bgšu| ?ÜÜâÖÚÆàíÑè—n'ZXÄ‚Z(©>ÖèH«‘HQFçÊ øLàîð™XÜŠ·‰À§¹6UÒëœHzŠiسIU ”TÅ8ÀœE´@¤ÐCD¹QU㜱º,Ç(VƒAFlÐQ7åœÖ¼÷ÕN¥1sZÇ&måc¹z Ô¨'\¸'Ì´ŸŠ¥·(‰‹54ÑÐ ënÁæa$¶ˆ&`ëkD¦ –¤ ®Œ2±¬0½A\G•Õœ†ƒ±ìÜü ËÁ~glq¦á&Æ!bÉÎ4Z,7™C— k-ÊòÜ´VžÁ¦µò4´–ÉÍ„}¯îÇmZ+žìLBk™Ü×sè2aÓò÷Í£Å}£Å ‰;³hѱ48½žå¼5)_àûÅ„e†Z rUÛL¸µƒÍÃ>Ã'×Ñ¥ op§‚.Àë`:À2 k0,;«·}gvŠÏ‡Ù)¡ßcÊÛcV^Þ,Ÿ®%ðkñÙ3<ƒãp§ •c=&U”³¢—ŒnÂ2“?GDo°GåálxD°ªqTZï1ÏÞæø~õ¨H—b#¦™ƒ‘MFÞ¤Œ´.zLbu)äÖaºÄ#»ñ7QO¸8åG¹W/°²§Ãôâê_Æ~aÂS­úhθ}nŽ/X³³åÖYú—Þ£´Øª.<*h9Òîís¶¡T*‡#ì¾{AûŠþZðÛµ 븱÷O—`ûÜíµðÂ/ý H9Öt[l°c=ü¿¹° ƒgƒßt Å&hëÕ Ù²wüûâÓACÜ9¸'0 X‡ˆ]Àê#"\ü E øôØ^×bO¯Êݾãü7ÇùI©îdà˜ü˾ìþ‘S•@ endstream endobj 7965 0 obj 4551 endobj 7969 0 obj [495 /XYZ 38.2500000 166.250000 0] endobj 7970 0 obj [495 /XYZ 38.2500000 166.250000 0] endobj 7968 0 obj << /Type /Page /Parent 2 0 R /Contents 7971 0 R /Resources 7973 0 R /Annots 7974 0 R /MediaBox [0 0 595 842] >> endobj 7973 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1409 1409 0 R /F8 8 0 R >> /XObject << >> >> endobj 7974 0 obj [ ] endobj 7971 0 obj << /Length 7972 0 R /Filter /FlateDecode >> stream xœí]Ë®ÛÈÝë+¸`d6»I6 €Ÿ²`Ø@A'“Á Ä™E~?”DÉbS§D›M]å"s¯E©Ÿõ8uªºõêOŸþ‘ýë÷ìÕÛOÿɾt¿ß~ÚåûºÌOÿË??^¿Pø}÷wVû2ûòu÷-û¶û¸ûØþ÷ÛîôOoÿÒþõ¿¬ÈþÜþÿ×ìoo_ü©{Óá _wµ©Ûßÿ>þnjÓþ•_~^ÿe÷ײß-ž»ëÓÿ÷Îç•;ãN×ßvçišãÏï_~Û½:-À´^šÊMžg]fWdÿýçî綃sóù¾qÆÔ•«ó9ÕÅ¡§²®³SwÖ˜AOÇ¥öõ/¼_®ñÓÈõ—ÅØÊÜnþã”fðXD1ý&|ðÍçÝ«MfªìóÏíÐŽž~}þºsí?ÚQÛ¼Ì>ÿ”ý!Ï]þÇìó¯;“ï«ÚøV}ï;>É‹ã¿÷M^e~õÄŸž\^pöø‚Û;{2ßßú>)Oì¾tÕ¡ß«'Nµµp°B#ïOʽ-¼éÍØàµ€ƒ-øÜµyLÖTðIN  ¦†#pÓûÁ­åp¦Œt –˜ÙAkÆ ¢ ·ÔCñÆ›MŒÑ¼›¾8Å{dA¡bTœ™i¸‚Râ݇‹OÉ9¡ƒŒF3z[œžsžê}‚ÂT|˜â÷Ÿ[§¹Œ¿+M8<ÁÎ@Rx¸bð eä yª„åvŠ)ì–Üã$5<º аyAݱÆ#€”z‚»!ÖœÙAAkˆÖ­!ìŒ.>À"Ó9Ç­Õ»‹¢ž&Ðìëªä}^h‡9ÆJG8´ ‚±„|Á Zì±Àv²ÊÆž‡° ‡×€Š;ƒµœ±›„ P‚Î`­ nÃ]09àÞ·’cØ 3´Ÿ•?0+¶j¬Iöõüï:ß{ŸgUuøUÓ½ZdUy¡»W¾ì*·7¦)¼7—wÙ^+öºöýÝ¿ýácYðéªûh_i?ÓÉá]¾×Šï÷ñËîÍ yßyŽú s±ç x‰ñ‚7DýXÞ#IÁ¨¸°N‹Cu$ q56Q!*[@Æ3¾‹ â°g|>£1\g4>lÀº‡Ÿ0S ’*;Ä!J“ •a»–°2K-yx ¡Å!¬‡ ó:G¼…SÀ5Þ÷qonášÆ„˜£}e€kï²½Vìu\ãë[¸ÆWaí+\sx—ïµâû}DÀ5‹kRzµ P:‹Ã ˜õ© ÝœFKL®³ªìô”¼,ùí;´(ùHP@º¤ Ã'ƒ.^NêlIUÛÀã „ô ¹<½íŠ&²3T{‰ ™ÑÀ 1ï“1æ@IÒŒñZWXbØ1UkêÝŸL£.Aå<Õ4!5]”71SÄZ0(Û`˜M Xnu Jђ䮺¤“™â¼b#`!SMðDkžt«e˜ÌU­:ÓMá‹ÈÅE ö̸™4kC›Ö‘cÍþ8ÎÞôà“N‹n}¦AOº¾õ†Açunµö>yŸØéOºpÒ,lͺÅÝ\ã™ÀQ¶Ýí¯)÷yc{ö& ¥rfcP@¤î{MDpŒg< 3j~Í$Ú‰®jJtƒÆé 47û¢½Åu²Î›Ñ:¹^0‹ý,`LîZ7 Å”U0© ¢ø^¥^°éÁû PZ ªyã|¨ælÇùaÖÌá4â@ ue­ 2Ý(g˜åRÍä*÷C$ìtOT ¨‡o*Hr@X1<²¹kfK±ì#n÷ôŠœU(ÕF@½B)×”7 ¥\g^ ¥Žï²½VìuçB)ר…R® ‹Ì¯„…RÇwù^+¾ßÇò…R‡~ºm8Õaß:–ËØìæ`kº§c(›¥Zd@Á˜Õk‚rM(=LjÙmîà:o¦BŠ9Ű |áß|CZ¶“¸6¤¥q7 iiÂjÐÃ+¡!=¾ËöZ±×}œ iÙèCCZš°ªõðJhHïò½V|¿†ÔÜ/RQÉÇM¹¢`Æ™ÏXåë_ýÁ”6RÉ$æ@²*ì}¸’Ðñɤ…”DÍâÚ¢oq­½eqmZÃö•Å=¼ËöZ±×}\,®5·,®Í}äC‹{x—ïµâû}D°¸ÖŸ÷'ô5jÆ™— ¼JŽ)zã€j*Vš¾Š•Å-+](þí+;¼ËöZ±×}\T¬Ìo©˜kÂ>ÚW*æ.JunÅ÷ûˆ be}Þ†×Ók¬£o± U7„Õã¸D÷` à.œÀØ&ÚPKx •uyT¼Ê\–H¸D–oà2¡¬âzҩפQãbª–TÿwšVžšƒ7¿‰å ’uÀþYðplxu”Dl ü(!9ÞŸH’ˆgбƒm"Ú´ªž£3ئa)Ç8®•ú‰¥‚Ð@Êá*ÒØž6-OÛ¦E’äm¯fH¬Ã¶KÆOЖ;†aQå*[ƒãtÕ5`0úÓÖ$akV—Ô­P^å?iås¬›÷žÄ™³sf§Êø,)”8A» fД ÷s¥ú!øÓõ\a>%ÂÌ’%V”áÞSg–ꪘƒò7™  öäÁt†AF8S"Œ Û§MÊÎ݃Õ+c ŸÏÁËO/,µ¦ë…-/ÌDnµªx· -Y?3‘ñfNÆx›9.o$ / «‰¯7Xkc­–ªMZ;Œx(-Q]ëD0W9'“¥‹¹˜Ê$åº:FŸÌÅðDŽ ›puððZãKÀÅÄõœ\Í –?‰2ïÆ¸9óÖ­˜c´aǎ϶é­_N¼©ëñêPÖ7áÕIÃÊ7vN¶HÈÈëÆtp·0’ðò&-JŸ`{«ªºyjƒ[ƒ"Ta „ý<:\k<Q(Ö;›ü#Ý@Äøj润¢6Ö4‰àÎú‘ÏáÕ&sxŽ©}Á;ÿóŒxsåŠ}Ýz¦ÔmEmçpçÛü¦(¡Ê VÌý`‘5¸äÁ¾ÁC¨·L"ž©«„ξžó-LMºræ& ûïçd0þ´É³µÙŒ%}QߎSø|?­»÷›Dç­ÓK7‹EÛ&ÃÙPÇa«ˆ¥b‰J§8RQYŽÕVèuéòc—Í÷/>„ ›­p„á,1Æ rJÓ°*àÁâ©!h…ñ&1$¬O‚ âÄâ6ž¸«È ºÂÒÔ/LÆbœ#SÔðUÂZ{XÆj0ïŒ! |"æS°<àm‚¯b„Š SL9±~Œ¦ SgF§®ÜOÊy1pk(£`9pÜ JèS–o%OK/èYMnÊе2 Ï0ø ’¡/Þ10F5]«"2º‘޲_V¥n Eqà˜,ÁA×*ö|^œj³¹9_¡¨âÁ¦ä¨u1)ãj(òÝtklÏuÁ5 Íç… ”9["óµ (Æ„²¨š±4ŸA®ªsýü¥àd ‹©‹Þ£U¬¶©ÜÇò}BÑj•I,¢†ØÃ0_Ÿ1™‰…ë0ôY-a?€„@R± žÆŠÎ±ª@M×$i Ž'vL€¤úQe¤±»ÆZ74µÉ”"S‚‰…T¦1\a]ãM8 BÚ˜@›Ê‡Å* Ôu‰ªÕöK'ªy\¼$ékøQå㺧ƫ›u0‰c UbU™_^/éxŸ–ö ž-ï çhÅœùQ-<¸¶ûîÂC#œ•ø`˜P‰&/€… # #"e•ïÒÁKr¢gwuÑn|¦•œªÌ'åâbU¨ð$«Ó€T•d¬úà g€q‹.SáFánPyû L ö&Ð&Ý}Š|ÿ¶ÑnóøÃÌ_¿~á»jB¬ê.†k£Šî4N¬o†-[oÈÜ®@­ 2ÔÈHPI¦ 6wŒŸLHžÅ"5x0¢*P¼ºQË—Þ6pgTÄ1½ñD©j«‹Uª®CA31…F8jçОF£&t!“Ñÿ–{‰V©À,×ZùiaêL€Êp¦|éÙ²õô¡¿TI»Ú¦N“)%KDžϸJD÷bAn ë‹¡a¬RFêâ7ÝRrUJxkáÂÅÆºY1ŲwÄͨ4À¸ùæþ63q3“çŽTzE,/ïÏAãeG˜c²”o`'pÞ<Ú‡“Ô»ÁU­DA•¾1P JTLÚhË”8©œXÔÝµŽŸ†J©ìúk1TN\ö5þ¢ã)K  Ò…[pøCtÓ;—Ð1Ÿ©Ê›,YŽn›ñÀƒ°7îý©YöòòVìÂéáåï=Ypê<Ä1n}Ï}0 áKüð',.¿µ­[8W*ñw)âï:Ãßû·¡{²äb7!&ŽVŠÐÚ›³êÐ%ûî+ÃýA9«n:ž ¥UϪœûХݓ¾udB=ðc ?*òXæ¢jU`Μé™q{Û’~È7#¢òG3r*§y¨s˜K]öæðõ¯  òãû)©b !å¨;ֵȎx2p7®[51ÅU1 EÕ»¶)ž‹ ª›qÓéÆV6up½œš«çØh¡JÕØ™rºßq¥»-/Î-¯‰ó6%ò®2F Þœ»;µ!ÕÄFªVÓ/EXô²®%³ Láf)”d2øã ŠØ%xA¦¼lBx®|Ó Ãþé«Ô,hT3PßW²ð(Ý«c^ gÀŠnÀN"Ý›øæ’ö*] Ê&Kßv¹rÁ©–MŸp|Wõ¤¿®d/rîPk!U 1Õµ…ª/áh‘(zúÂÄ&K,zFʛП1µÄã7Á}a DTÖ2FvJf’!þ Ilx¤ÛÖŸ•EcüÙ•EI×ÌÜÑä^eï/ÇŽS>ÆéI¯{èªß#R ¤ô™GÐÎ#¨žØW>–«R£rÈG÷öÝCÒÌ={Ä RºçBø6²ô.^ŽWMßø³,®^M¿q|¡Q.¡bè¢ÕÛ§”¯‡"øÿ…µ+ßþdßZUúã½7ŒÐyKåm+é¹9(wV\ÒÏ®íIëëqŠºŠ}q<ÉyýäÄUTÃ'ö]÷™Î¸\ÉŠ{øõcïáµ[cûÐÍt`ß:™ÄéL )&æªá;YÁ¦;¸Ó0¸5ø™N¹Í¤©×ßÅ–¸ÃßíˆÏ ×ÎÂ9 "€×Š@a‘° «ú .þ % x÷ˆ±]±»Wçvßi~o¡¾â-)ÊkxÏþewÿíµe endstream endobj 7972 0 obj 5221 endobj 7976 0 obj [496 /XYZ 38.2500000 332 0] endobj 7977 0 obj [496 /XYZ 38.2500000 445.250000 0] endobj 7978 0 obj [496 /XYZ 38.2500000 246.500000 0] endobj 7979 0 obj [496 /XYZ 38.2500000 408.500000 0] endobj 7980 0 obj [496 /XYZ 38.2500000 332 0] endobj 7981 0 obj [496 /XYZ 38.2500000 246.500000 0] endobj 7982 0 obj [496 /XYZ 38.2500000 445.250000 0] endobj 7983 0 obj [496 /XYZ 38.2500000 408.500000 0] endobj 7984 0 obj << /Type /Annot /Subtype /Link /Rect [43.5000000 253.250000 542.250000 267.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_configuration_files >> endobj 7985 0 obj << /Type /Annot /Subtype /Link /Rect [58.5000000 704.750000 81 711.500000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.gnu.org/software/autoconf/) >> >> endobj 7975 0 obj << /Type /Page /Parent 2 0 R /Contents 7986 0 R /Resources 7988 0 R /Annots 7989 0 R /MediaBox [0 0 595 842] >> endobj 7988 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F8 8 0 R /F9 9 0 R /F1409 1409 0 R /F1700 1700 0 R >> /XObject << >> >> endobj 7989 0 obj [ 7984 0 R 7985 0 R ] endobj 7986 0 obj << /Length 7987 0 R /Filter /FlateDecode >> stream xœí]I¯äÈq¾¿_QgSÃ\¸†€^ ø``Ð ø ø`Œ, ÂŒà¶þû®zEÖ’ä—d~/ra=ºauO±*™Kd¬_Düü¯ßþëð×~þôí¿úöRÛººüßáüç§ûtwþ}h»úðëï/??^~yùåô¿?^.?øöéßOÿú¿ƒ>üÛéÿÿ~øÓž>üóð¥ó~iU{úû·×¿ûVþU]ÿ>þ·—ÿøÃáçÇ× “yüïŸl§Õœ§±ðê/ã2ÕëŸþú—Ÿ/ö–¾1Ú胲ÆToõáÿûå/§ŒÃWÇÞ*Õ6¶­Þò"eíùUMgJuÍAד½þ^Ž­Úˆ£¿Î]|_Œî½ƒ‹žnÛÛ˜§{>Êþwª‹I;ç¹Ç:]8¸Ìé¶úô’Ó³ÓÖè¾:Ô­è"œÑew¼Ñ?Ï\zS”iÔÜà¿„ ‚gâ.?üËi>Ÿÿxøþ÷—þØ6u£ë×ù]ž¨þõIwìúÊy¢Ñ]¡Ñª¯¯O¾|?íOœ¥éÎ]›R¯ï¬FwêqŸ^Ÿ4G­ºWEcÅÚ\›g§Z4ƒê# έú"µ‡ýyœÔ¢Ë+íçaM{™Ím2ÝeÑ·³ÿê|PÕ¯˜cm›Çß*ƒ6Ìó¾Ë¶Ø£5ÕðöÄ¢'žÃlboå•o{i!1´hžUŸàßÀUÛ:¤ÝÃÝPÕx¢·#øàЋç´.Y™qëVP’êõáý™Ð´ù‰“£;ÈÀ8fÞgàeáá­ØÃ}áÉB*bNcØÙ·êJ`ïèV™“åúä· ²ò€áñ æ3¤•õ—Ös‰Ùï¦Ps»lï‚ÃT—E×õH8ÃLï<{£Ü¯ÂmñÜ7LZf5¯óìúúkæáAøèLøýö?&«õ\Ðób|–³¤ZíRMyÎs'üüYþˆgà±Çœù,Å {``½³?sóÆ,6”¡9¬à5ñ¸°ë›Ð_8DÅ}ŠÍ—»ËتYj‹­¡ÂC°ëïî ?Áv>£-b~,± ¬Úz./æh“ËÀâÖ‹/²ë„êFµ÷d©&þGµŽžU8=[»x¹<‹¶€“"4´á\ïûeÔtº× µõÙï{8GÔý¿½|‹æùE;žÂãÖ35Ï®Eç…ª1.ñ0ª¡cÖà‘ Œ)Kœˆ‡í'[ê,™€!U·Îq Sí¯³yXÞGôd!sOào*üžè‰Æ£}‚3ˆîD>mÞúK;‘'–‡%áª_ÔSƒLlzŒrty¢Ô8ÊÛ®§¨!Ûgø©¨¦ói3‚s[œuDÑ(W*N#s bÕÝ£Ôo€7Q!þ±j²èÜ SZðJE|*Ø{KÜÔ-*ûBž;Ï\…÷_*v‰É@V5^ï&K¬EK9< ŸðTàýƒ²xYbÚ…ªrE £Éšrƒu²j¿‰¨sí¦ä‘ñX®á q*‰'1õ,ßjÌ8ñÙËQ壣ÈF'_cɉÒ<ˆE ‡«DCw»¯GÖ³NH%MÌZ8ræ^j&Öꋸ—ÍsÿñºÖ‡¨‹kÊ¢K[cj÷v—)¥2ž¬Dܺdå `|8Ìz 4c1ó…4„ÃqTp!G†Üxv‰!kl”0zACúG”Š=øB†G2Ð!Ì¥à¾Ì %»ªu¥¤(ðÀ£µ2ÎJ¬µpßõà1V ¯,¥ ‹² ýŠÉ•1p+F6vM¬Ç3·üžº'C0ê ÖL)^ÂøOD}cÞÊ&†Â\òŸôWÐ_ O(À7üLàeÝ=²¦a èCÁßàÑÔøÄ„¿g¼sO4œ›EOê*6ijÛ¸û¾¤âÆFÙ¨„pÅ¥LSIž[ßqNx4û9œàôÒJcº›ú®,‚³Õäˆ&+¡puøh‰™S4dRÝv*¾Ýe»ÖyçBò©WÓ)ª¹°éÄèpnžT=‰d.&2.¬\1®™g‹¾‰$­ÈšùxÈÇÒKçÌ<É‹sÓ'|Ø5È8ì\S[vpD¶¹ªÊ®¶-ÐU¥Ü—&–£±7µÖî¦öñ7µq_àN¡ TŒÿ+ Þ+ë@bœ¶ë•®ŽýF5ó9àØÉ²d¢—Ìü•µºÚ\® —dãÑ<åNdS1Šš¼Ñ†Ä:b19ÉyóJ}^ĦuHxwêø3o;%#ù«ËDÑ|y*ê*ªBx"t‚q¬”j® 2­‡”€;2Åû¾½9­q™HPÐVYýEËi ƒ„`U4À&! “E‹ë5¥» Ιb¨•ÒAø¦œ»C`Nä=pw4®÷†g€‹yÁµð=8E°†O¨S €y Á¹áõXÜÒ¨gGq¢&Až•1¨*.ª­vØÐ6I&f*¯– ¥øe<±×šìÍÁ™ÈU9^¹–,|P.[¤ë (¾¢áö˜ìâ6æ†Û‹¢*ä3€,¦#Жcp€õGaнz1ƒl¢Sq~âÍÕ¢Ò¢’¥ Nn wQ%pÿµ¯ Ç`ù CLX‘Ñî6d++,Ïg°H1Uwlþ^†'„œ“¨­âJ[€B¤ü^.ŸS§™Ð/‘ûQã “ùu¢ž æeý]õ†.»1=£ãí&øp]Ø\e… ëátÂUC' 4#¿ lˆ\—ÄÜÖCãeK‹dˇɗ €…&£ÉîRyõØd(ïE’†8s‚‰Š Ù¾® \ ñ‹z÷ÕµE,¬Ø‹³l¯£²GíÔÔ¹¢¨¦5‰ÒÝ ^ ½4{ùò„–^_뱊ºÀ(o„¨Œ^ZÌ{rØ•PN•ÐBYK.n–·Ç"NÕw5À\HTŠP8Eàú¨Bƒù{Äm­ÅÏh[xfM¤nOÞ©!Ê­[¿Þ·BâL²¶¬‘üluÚE¸Èî–¾ ’Ì ³c•Òwd…}E3¸âM'OðèáOð܂ơ¦¹Ycû †Å"¶éàùx¬=ÍS±¥àh6úq£ÂìÀ˜EUÕÎT=`\ˆ|ƹ`,Bëy+Szòº Ê^1¸ØSä£&á¬óÛ={M Txó"…D¼fÈß¼»ŽùýMåb%RáEre»ãèË•­ ‡œ1ÞÚLDÏúÚ×?AzT)Æ(Ú®J¶ÚI:mº»ÊïQFNµ\¬+Õè7Õe¡^ê±("#u!£f4(V1, ½_ŠOÌÜ’.;÷ž%;;,ódº¹=½j\l×Í8Ic—¬"òË©*–{#A!Uv­ªäÐ.«C Öƒq™ðá“ =j0£ûàí)ÌŸ$Ñý’—z/öÄÍB7›J;gEå…¥-„9¡ÞÖ.ùâêð¸±÷ÈSb{uà5ñ/áW¢ÊŒ|M¤í¥pñý‰õW¶O•9dØ~@(BSâ9Æ{"W ¨‡N4ã/ßa©›p˜èž¬®ëwn°$D¯]k“:`̱$þû€ú¦[ÏäR!xDà ¬ûó³›lÏfR{j±&†§RE³'àmó»îE:Sx‘n™+ø)35^0k_24£¦ÈWMS1&ßW_·ß¡@¸‰ú°0Z.®T€ÄNrñÚÆ9|ªZ ¶B‰2˜§Pù¶s~ŒIL¼Hí² aÛ¹”z51‹™Ž’îvãÞŸ"àÉ^aL8öÈtÌ.J ˜iƲønBÚ9(¶Íº>´'>Ìüf±6ftÌ–­ìU¿=Í€¸"‘PV¯„QùÄ‘SŽg­¾ëÙsä¥sä—"ñ ìðæº…="~YH“‡ç0=Ï'13S½S´ˆæó+6¹òš=”Ï´ýc2ú%€KùI‡rNŽþЉ¼‘µµ=}Ûž0–êDí¤lÕõtŽªUoÚu{Z`ÉK„fÏò áØVá°\¶ÉšI!)Y¢dY2„V…{vg/I^@£|¶ ?u®1Ž8{6àD*ñ"\<–ÑŠT+‘ÊX²E9˜äÖõ­6™ õÓbƒ`©”.Áè9¢JxlâMÕßdS¾Q*uŠ+zT+Çðtd}H¡WÙ{Îp'æÄ±Ý‰ÕG,NܨHªLa}2 ‘{ÞΓJõ®Š—?S&u˜½§j(_JÕË7ªÔÔ¥”³ˆÄw!òòêÞY^Émï2+ßSÆ%l¦Þ ÛLí˜\…¿ZŸEÁxH¦³—ü û®òÂ{AØt>®'÷ú¾>ÌìE±GýwÔãPÕÍøÊ¡4eu¼„Aï®Ôô¤,z‚ÕÁ¿éÂGóÌ G¿[.˜cëÔô›³sÙ‰NÄ9÷äB4ÍÑ(=+:ff0V mÆó½={×£zø¸ž¡ÒmГ³5·—m8D£âÈ/äÚ[g CÒå§·xÒ÷›ï‹ ¿´zÖÆFø7L«ï”(Î\„b&Z“Gu]Ÿ{*ëx ‰40Õ3Ÿ¡¨Ÿ1’ã!—±9ûL SQ°:Õê+Ú|îJÌ ñ×t'Ö# (œ)CX„דAÀîÁ£a¿6Íã§oà)P5œ5ž±ž!„wháùàõÀ=À‘½zéÈÉú±E “ú'’dBµ>"T\¦Òºp»Zȳ=HI<7b=22Þ¯Ǥ„„´éz?ˆ„€SëK‰Ü„¤ßBz¿3®qlçuØßʼn£õÍ«À Éâ,ØØf²E="W6ã˜Ñk'4°G¦i}âÛ¦qeOø†·1É[Œ  «DÕÑ…5 D>¢tA$GÌ BïJ­mEÖ  ‰½+¶…wí¶ÝjºÝMw8í™Ñ'>zø÷ëëc×U‡¦9ÿÕ*5|jM}|÷éËÃ'¿¾4ö¨T¯»N]¿eF1÷ï8}øïêü³ƒóëó'ï8}rúÍãLÎßêFéßñ·—ˆ›¼ct»x¨! +¦¢¡„~¼ØÎM€¼lõH^VÍ‘—5îÑŸ>™×ù[æasÿŽ+y™~޼Lç¾ãôÉ„¼ÎßêFéß‘€¼lƒNÌ£’bV«üØÜ‰² RdÝ?’dSÍ‘d£]r9}2!Éó·ÌÃ(æþW’¬»9’¬[÷§O&$yþV÷0J÷øŽ$ÙÔiH2¤âUÜjÝ)(±í)±íç(ñD,•œ>™Pâù[æasÿŽ+%¶í%¶ûŽÓ'J<«{¥{|GJì zÒC‰X]uÊqV4ì9òw±N r“X+¤ø nâ+Q?[q·Tà¢üü ,Îl~ä,ƒÅdï d‘ aë‘mnáyNP¬GFà&(zRýpøý=  8šÁàø§;âdâ¶o'2‘åë5Zd{28æ³±ÁÖK ˆ Ê–·Ÿ˜}8ˆÀT$“@3Sy‡Ì{eˆA\ÈÆªðõ)¯ƒK‰×`ƒ$& ÀjGœmûx7¨KUéwAeK3¼I¢4( í"k„{ô7Y*Íf`f] &gW¸7¡pG­Žk\©X´.ŸH$äÇö1œ ŸÂÐä-¬|E€ò†™‘D  ‘§úBá÷H4ËÁýdûvRi²§/ Áøî¬Z5oX¾êñtº*O g²²e$Eâª1ÅíPàFƒ”ñ±OÀ`‘=vkö4âü¥BÔk&…WÔ-«ÆË4“c<Ï©×oÍ‘ÎÜÊõ&§'Ð,ŠåfÜ¢CE9{@´Ÿb@ABª“‡ˆ²]J6½+%ŸÕSëáÂLÀ)QZIäPJHáÚü6»§`ŽEG‘K/[5U¢IUVW6F!ZîFʵäf¨ÕøÊl¨™MIM†ŽßPJ€Q*=XRè` €3¦²‡„˜ë/¦Mf¬‹lñ„@DÔ\!7\¿X8)82ˆNI¸pfŠÊ³¶nÑp…Û¼ÎæaÇe[Œ1=«–ZÍÅÄêëìÕú}“%4)¾Í¸+¡–æ‰$®ÉÖá-<•_7/Ïì.Y,ÙòæL²IV½x½šðp" ÊÔReÂTž¹Ø&HD.=w¢º»Ââ¯|“»(Y׬ç¨gÌþa•˜=ZÀ]/XNSéØu·yLàalÕâæ€Ö•HJ/°"m²zyÂK4-ŠòÄ1¶kvÉÒÄ–ï¶êÅãy0°LKk†Dã–¦ iâÍØL†e)†}d·d£y¢ SP[ô;,‡¾¼sO`“¦EçãÜop£ª=±Ø g€Wêi•{ÚÙèiüMU»ú‚hrטI¹°²˜ïTÚfg®ÇÀh&À7Õ2Q•bz‚|ŸªÓCïë7tÁÓY—ºû´¡b TF­öô‘½Ó©ªª3²D¢—†p– î ¤8¤h‡cá$z†÷rdï!™y×Oà™ª™”©¸eµCafœ5ÎáÙR׸uáÔºTj–g²øˆ>‡³²méžÙãß©TÏñ§1ldéÏŒp1ã–ð“'¡ÙQ Ë&’É$Tû%Q0ƒá‰Õél] »©‹™?¼Ž+™Oc²Ý®!E3tû†]Ü8DgZ‡@ßOÏ@ÃÈÁpWæž(øÁ=± ü<Ú0ë˜. 푬»“ ¢3üd=n6TM6Ã"[ ¾]¯ ˆwø´î&lüÁ4n¦²¾ÖÇ.${¹gÔÃ6PWJw“¨å#Û¦)¤rÁr–qÈh ¥ AÞ¸Œ\É¡Œ³a]Täž›«IÏdµN ¨ÏYÛ¹š²‘Ê´UA׈»Šj…úZ¿nõëN­•i«ûO~{ùé˜G_¥mßr>¼µ¼;ö²ö±ë÷øßçYÓN\ÔÊéœ=KÖ¾õ´»ã+·Ù¾õ3 6Ot—™¦¦‹­Kçž\”³æh”vÈÏà šn;¨síhñ^ãõTpˆY{ÚÑ2síe?¢àFµ¸¹-³;Ôikâ=x¯Å²ïk0ìæŽ7ÀU¦IMxv ï®ìͬÑOçÏð¬àÍ\\Oü˜a«ëñ¨`e*ãB¢""›d d¬ˆÃ{G”°h,žµlŸãÈUŒEÊÿùÌñÖ —Í_KåMÏiÅ-[á£üGQ++G8î,<Ì( tITÁ– ªî5æ_"hb$ÓèX$Þ‘ÌO*Qžp›W“5OðޝwìRV†Íar-(†Ñ`(Œ ^7®¤#VKÕØ)¹z&?õP‰h»7•„‘ 0E6þEqÛrPVÅd¯ëP4ÜýBÇ”µÅÑ™°f°ãÄ‚¬¼)ûëʸäúþDD@E.‚XB¼³²ùݲÀpÙ.(ŒÏˆe­w3z†O•Õ¶ýxÞ² v…°…0 0Š{ž²ÂD¤¨µJa±x°UœÓûÃ¥#‘…Òž†ç¦ë9,bnBýÂùy¤÷šA¾"¢ž â‘( ÒÿÒìcJ¡ºsvyÑ¥s6M›K(ÆžÖ¤æã™’¨[´·òôÉkœ+˵%9 ¯2›& \ˆÔÞÚ8&B'¯"®ò[’ÄM©íkí½£ú.°V õ8ÚH4šfzò.­'fôK)ãjÅ ˆoÓ}$¨¨ŠD ~ ÄìD–Aµ«Ç:¦D¶h+ó ” Oà-ì{D T}‰ÉÍ ªIÐd¢s÷I6}˜põ ·++'´øÞ•:=ÔʼÛ®Ô=­R·w4s%R7aµïNÍé+­ãî?t姪$F5 y7ާÑ*ª´¨&´zIE¸¤(äúÊIì…Š(\>„jÀœöÍ”"Kà-DÚ_ˆ#"QM}Ï2³ £bÂve᥊ýrÛ©Ô;ê‹-Ó™+ª>~3ŒÆ}eFuª«ÜÉÀäòMHŒü9Aw'ónò¦ö®!‡ƒ2vé°ÆºäÙ&«0ŠØñ}e‰ô<¢]D/|z‰\ue{%ÈN¦£Ã%ödä{ž¬Ygí ÏŽfàh'óŒ†ÏÓ(¤7| ž=À¥Û¢—TS•­×ë¬ÙÈï%9¾HýCã/š†R Î"æ]ÕÍ䮿¯¹"Úa›Êˆsºt N¶îºí¥ìQ+g2ŸÑ]TØïxßvî˜`-<lÎâѦÁÚõZ3Õ¦0?ÜjgŸE=âÔUc<ΓáÓbrY”¦«çÙÓnIlÈ’¨õDJî†D>C¢@ #¶=(††DZ²ˆflX±d>ŸÝ+ƒ­+síqˆkÂc÷fHíxœR„ËNawâ.0–FtB]õcœ'i¢Yp5‚šp¹tYÅ•h%Pt)òìfX1Žž°Y3·dr阮lÚºhBcœh€Ú˜©Xðþ1œªu]²Ì^ÑÖW‹`Ú¸úh}Jßë X!…ÑKO“"ÑÑ…¯Ç`5 «·Ø®'žP³ŽŽdmrh"ÄS&RQL”ÉÐd#»f€ÙŒ§ä³« É+ßo³¿¥­Ý‹™¸!d*}­®¹2Éì×·p2&˜)©¶ƒüÊù…Y©xóSå šÿž×™¡†¡Œ`öà^ƒ,ªÅY;¢©œv̲Õ>ó#'¨Ò|‘±T¤öÖéöZD)›$¾Éª7²ÎÃ/ ²#®ë¨³Ã=¯SÁõ1ÀÇñw“ÅÎ+œ0Ÿxâ…x`t˜¥à“ãyRJàùÄïL®ªºsÉ’p²c~&Ü‹&¯ûW)eßû%ŽŠW®;ãY,Ü Gûc¸ÑÊ=ðì`ã7ÔÆŽË}F__ý|b¨ëœ¥=˽g*Õa‡¯ ¼TågÆ&RGalírI«8q…ܘáÝ:Œ³ä|OOqg…Á(£œÄ›DìĸÝ<÷Äu Qý»x,Œí_ö|&40 0[-*£vž^O—è—ª|e‰Æ¡Sàõ þC)תØr¬.½[áYrA™"Sùóà g2£MBøÒ ¬ €n/Þ‘Èi=z¤¯Ln¯j%îa¿;ÉÓŸÃÓ‘yOô—¥/¬iÝlÆùIpTê ì;è+¨QÁ[y¡„v†í\,1=–¹{r¹%ÍôÉ€¤ÖÇXx·?¸Œëgô³¤LÌÍíë°RT"kÖ•ôÜL86\± ›Y†Â£Áß —@-½½‘-KpçŸf<4Ü;×ä!¼4¬ ìÙÕ/ˆpño(ZÀ§GÌm`To:½¶2Çáæ?#¼¯øH†4á.ñ¿Ã//ÿ­ÉB× endstream endobj 7987 0 obj 8927 endobj 7991 0 obj [497 /XYZ 37.5000000 742.250000 0] endobj 7992 0 obj [497 /XYZ 37.5000000 742.250000 0] endobj 7993 0 obj << /Type /Annot /Subtype /Link /Rect [491.250000 713.750000 507.750000 720.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_starting_out >> endobj 7990 0 obj << /Type /Page /Parent 2 0 R /Contents 7994 0 R /Resources 7996 0 R /Annots 7997 0 R /MediaBox [0 0 595 842] >> endobj 7996 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R /F1700 1700 0 R >> /XObject << >> >> endobj 7997 0 obj [ 7993 0 R ] endobj 7994 0 obj << /Length 7995 0 R /Filter /FlateDecode >> stream xœí]K#·¾Ï¯Ð9€ÇÍ&ûf ‡‹] ‡ ‡À޶‘Mùû‘F-Í,[»ù©ŠÍ–è…wf§Gl’U¬ÇÇz|ÿÇÏßýó¿»ïßþ÷î‡ñëûÏÕc×TÇÿv‡?ß½ýAÝ?ŽßﺾÙýðëÃ×ÝׇOŸö}8~àóû?ï¿ûß®ÞýiÿÿÏ»¿þmÿÃÇ_:ü¯éö_yù:tfÿ]uþzøù¿þò»Ýo‡O¯'óí¿¿s}ÝôÝa3¯þúpZ¦yùóß~{øþ¸qoÚÆtngœÝÿ5¸z÷Ÿ<ü´Áiøê±oëÎ5ÕÐÃïÉ—wõáín¨v¦ÞÿÕt“w¿ü‘Ý( Þ¸Voð—™Koб­ ®Míf?€µÏ£kd¿kЬt˜¹µáàÚÔîªÓi¦‚åúM{^að~¿_jƒ¿Ì\|WNôÆ£k|¨†ã¦u­Â®G× ÉÐ+ï—™KoʉÜppej·Uçô¨ý:ºAZãôXé8s%jãÁµ©]×£)54 {v]ƒ Ö(²ÒËÌ¥7åDm8¸6µÝÞP3Ô^G× ˆS´3W2ÔðàÚÔn£HíóèÙ D½Á_f®Em8¸6µÛnP¤öyt ‚t¶Qd¥Ã̵¨ צv×wŠÔ>®AÞYEV:Ì\‹Úppmj÷C£h¥G× ÈÐ+ Ž—™kYippejw•;iV«°¼^apÓéـǙ‹ïÊHïéèŸbFÁS9þ€þ_|÷åáûgã@@»ûòÓ~r/ï<~ùòëƒÛÿã€ôïOØ—w¿ßO©ÿÃîËÏÃc[7§)ŸÔïГj€OjôÄ´ð3 zb üÌGø¸ü<ƒê=±¼p4 G«ŸˆÑ˜=xŽç¼xnxGïÁëù@ЧKÊo¿ì…ÂuçfÛvþi>î®{töxµùºG®ìû¡z™ª¿ž?ó^jmAYU{Ë3PðÔŽ`yÈ<•?&†Ã,‚#Hñ{àh5>¨+L,.ñ *|ì‘T”IQ&KxTQ1ô­ó%çíwŽ–e]7'Æ9mM×6ßjz€zk)¬ÙZøøkÑ=ìcãÚ¾[6üžº‡ŸÁ£9ôDvßð{£×Ó/Ä9®y´uoƒ˜ ¾¯Ô`f÷¿g²bfC1‹®EÊR\¾æ¨S=‘ ±­7|€ß•goãEÊtøÉ “Y¸'q$ËæÐ ˜ÝjÒ#Ò žR-LÍw¶Ö{§l8ò VJ—hð G«ÂO“¢önªÆßiælNfà í#Ò-£%ð(CEBaŒÎ—1§QläˆQ,’b5"†Ý&S=¶ùföã!5Íc5Øo7ç Žv4ØM}zt•Ý…$0š¯~æ#>Xs@Ž¡d<³@f4ü„ÙücJ”¶ÌI ¼‹,BÁü—‹…YÆœ¡¨o†¶öõ vÉ"L:âÅHÔw‹ß·šõÇh@,ÊKGb=³P³¾£ÌŸ“K6örˆCW“߈ttÐPú˜u¨<ûÕ¼l€$€Ó9„?7²PÚò£¸í¦vÞ¾ÖFmÂR‹' ¢buÿ´ÜÒ] fF<çЦÜ B]6’qµ±JuåÂÑu—ãÔ˜N²\2®Îç”úY ë;á½Å>§˜E V˜áñYÇ Ϛ؀ô\ÑYm]®H3„R$ ãÔ1·O*WY]¼ùG ¼A,+ýÀ‹1‰E„¨g­ÈåS»C„ÈzIŒÐeÄq`¯ñ K„p¨/t3'­5]Õª7¾ŠÕ ÉH|.Fë3ÿo‚¹Ðeì>Ùx,‚ê”Z?†kËû ¶W¯-ÈNPgkçùJô”Ìü&ºŽ¡ãÙ®îä梯‘ëª÷8y}©Ê˜–SGCu4µ(#ŒÌØ4`‹ìµ[ªø×åb=ÀÄ%u ¤ÛÎ"“••ÐÔÑÜ“«ÉTï€×EpAÎVÅöäªl9UH{Zl\ýŒ¯ E¥Š,E)Q°-çóÁX{×Ȥ€_ËD†¬%ÒïG›m-—ËîCYc(‰­Î~-LcÓ1A.m.þL/9Ú¸QRs Å%÷)ÉtšäÓ?ðœ€?SÃ'x=£t¼dq8äý$žz,ð†_á  9دţÁ°ƒ°7Q_ñn.k³¹(ºï+†TˆnDÙ;¢H†Œmt#@߯T­94ûö¼M Q*ò,kÚ\q3ðB‰·[m&m¸Ì2™˜º\Öùö^#Ù™í{Ï™ib¦ò²®—eÙCdzÝa¥]ÿö'¿<|Vkz†w»ó­ÏdÍ0ìÐ6FÈ1Þ Ž-¢ &FO6ñ8UÉÈŒM¸;Œ·)¸-š¥PºE'd/ÄLJ"0%ƒ5NíNÆÁv{*OhÅf®·žJÚxÆÓê‡ìFT†pYè1éÿêô²;yL½MÂM .FRÝ 0Z,".Z6ÊnKê3Çx’œ1’ÕÚàßÓÊ0ÌJäf«ëˆá—#‡ÂþñYø^ø–3U_Ñ2H9gÖ WÙT3§õox8GEs‡§s&ÜòKÛ@õ”‰›™qµ%•ËMÍ› g|j®nèÝÚÕd2`Û5ætfuy.Ài@¹É–éNX“½)ȸ`$Š Š «ÇÑÉ´4¹T]]™Â«„ÿ{̨5Æ`”¶5ØMS­ ½§×nõr*Y=âT±w7vͤ©SXl]¶ý&û¬DàØ© &lusmµXÉœ;Ú^ay«6稌¯#ªÉ.§ª§Š–>³ëßi \¢MÁ$x0Ö·H6S·Ùwd= AOå·§:$²94÷9Õ—}™æ!ቭГqç/=qèÉ ƽ6Àõ˜øYãÑðÜðzF®ˆšÁ(,£F ÌŽV¿ƒŸÁ;:·}uÖt}±p®o÷§ìk(Ðu«=®Ÿs\rÓ]¸ã•6ïÖÞƒ&ª™)Ì(Új-¦Y”þ…Q3xº)g‚3÷µ©Z %¶eëÅL˜q9ÎL hx”˜ÃÐŽË<ü«Ì”˜¼ &ºN4k™XBâlÈ w¬Hñ]Ådé²Чh Ó"š1kü§ôæ[{¾{Yß›ÏØÿvœÛsü¾ì™?ÁÀõÔ !jÐö§8ã@3.¢ÏîF“U¡5ÇX?TtdiU/ƒ0(׉Œ°ó¨Æ‡8 ”‰o’µæ˜[MgÑ»¦×væÛÅ·e¸ŒÀ­¦FjO%) À$¸¶Àa5&ÇBPšºh¢±D·V¤‰ IqÌ… ƒ†/G ˆVÑZ‰Õ”Ðmììpb:èþ`G¯¸šA—ÉÂÏ@ç;Fx=tÀ°{Z\MIWsÁ9kúl8ïg¤CÆü˜uá þïºÂÿ…ÿ—inh;à÷0¶Cà=ølBÊQë!Þc‰½–¥ÞQ 9¾Â3 $W@R`jýÆR5çóc]Bé=´ó\^¤w‘Þ)¥wÎôÁrîNÀ¶Ã³ÆsÃלð3#M“H”Þ4E¢äıE¢äMB¢àõà'}Ãsƒ²¦XŠ9œ¬”–bo]‘ë9ÉÕ¹o}¹N̓Á'ï¶ú¾.R5¾–“ª3j}º¢Ë¹d™v«ö»é.œ !Ì„ƒð™ôŸIé¢hvLºÞú™ž[*ÌIõÆe¤@¢ãÃ)·ÖU,"%ïy–E/k<-™uæ«ÏiTê p+Ìi7A¦ÂꈮgÆ„o*_6À/UZ½¬ÕD[ejN-¯¤G%#3yc™þ)ƒ6wî œs&(%€’ʸ`=i¸¯ÝD¦éêÜW2MïåÌ„¼¶:w´)ÍPV°3·„¹lºŠ„öéöÃ^>Lµë¼Ó4ÞB\ZÞ;¸Vú%¦àÂÍ _š…†oëqj=׫:`»¾ò¤-æ¬m}Ê0é°Ø„g: ¦J»mŠ‘¦*j&k}ùšê”Qê+ÓqY›^" ³2ô‘\!{z&í,&ìÀ4'°Y|¥>²Ð¥ &L„èÆ3Qü0€˜@pÙÆù‡¢«6¾jO³2ˆ ÕŸ"vk^f„ÔÝTàЦï§Se ¬ÖõO.Bjfl"&ÕF(â>Š »1é’0  5Õ©¢æúaØJ3LíC\w@´’ÃúJJvÒÔ…ÖÔm937{fJÂŽœô#Èôæ[RÅ%Œb“}r]"{7±V¡¬™O¥ï2¡#Õcˆ¨sÙÈná¨&å#UÝ£f½_dÀ ¡à¶AŸa@)™cÊÜUɲL„ã‰_LP=àGIÜ$\. åF” Zî²R€Œ Z¥õ4_  ±zlœ0jÊDÍménŒ {‰è•˜l¢‚L¹­Žˆg„´åÒ(Ëa-Ö¡¤™k‘KÚ-]P1º¼™¨zg­§úÖo@Ê>&/ÿüm(Ò ƒL²N¼ÈGõ‰òß €>˜UWJ 3†°Å„¼lúß*òd]9Ÿ)—Ë„ :ë¦júN¤ëP¹^Êy ¢ÀRE„ÖMNêä²-¥uíý@.´ñ˜ôŠéã_e¨›•¢r}”<·†Œáh*|Ònì$Ü:a0MÝØÓ4V Àµ^±[|éºÍÖéåR\ƒË»ŒêÆ.ϺqT9›‰ÏæQUÝDg³„ÀIKLŸï೉ۖé.œÍºäõƒ#œ'‰ºÔí1ãÍ3Ì]´ìHôqûB,"*/Q UªÞ 7W&yf œ¼<¸+`u‹WèPjF¤Õ§¼’U뜤¦3}Ÿ˜9ÄdK¨–$Ê àïS±j˜Ñˆj„©*Lf¯q7¹¬Tð˜lÉÁˆjT„!7¹fš½Ö‚Ì~c}•‰óÉ0¨‚! ,a †i£„Ýù>¹7Ø jw²ÉlÔ ä¬Û û‹ÆÿnÐ> ;HPµ-š1ÆèY 1ÿ²FQ™w©ê«àØ“ µ~]-ü$A8›¹‚eÛ¥òŽ…ÛåD*‘ÕÈ% <¨€^a<(ÑRn²qŽ1V}e<ÀrÝ:QÂY>æŸLªI$>0‰”\>ɤ ]q]¤¨»©r”5q$"4©; ÙB÷ƒ¥î8”qÝ‘ÀcáÌW Mˆf˜7º®6¢6æ†¾Š°’’ b‚‘à{ðÜ 6¦| ±å+Õ­êº+<Í-Eu0r6pM#ì™1Þ\¢Ìð+7Ž×·óÅ8«ä½  Œzs¦þmq¸,0ÛE ŠÑÄ9`Œ}#{“ФPR¹g4¾ƒ .”gó.n„£á.‰ˆ0³NýØ žÆ£š¤K@ÊW8^ºÞy[ùVA w)á.o¤dT&c€Úø ‘Ya ¾gt‰åMßùòfý›æ-#—䇨ú¨2‡j}¿¦÷ÕÄrË2e ×5³’`ý Þ” G»;ÐÂfŠ£`@G¢ÂÁúáv2€D~5Æ YÐÈ8ÎÔ^ŸF‘8MÍÑöžê`’0° ±S²ÍGd;Q6:3ëå픨‰€pwœ¬qµYŠª1½g¨Û/&ƒ0ÃJK&¾´i M–ªå£rZ*A„š8ÑÂl *¡Jõ+ÕʺÚÓ¨•1eífª¾3qCÈ=#:ìˆ8VX)48ƒ˜=-ö–r¦:Ó9(ЇHBãaeµÍÔu<£g(‹{ýØÔˆÞpØB®éã šT½Ë’Õ &ðY¶Õ vuµG¼úÆÔÆfÜúAL؈"LLªôS>îwhåÝÁ„¬W‚õÒ“T3k°m<ño:$Ælƒi  ù¡÷À„ו@ÂÐ J ¡nFo¬ŠJ a $|•ú%0"ûnð=’Û‰$4¦îýÅ•P£•P¤¡„ÙBÛæJ(Jˆ©P¥¸Ü¬~K0ãáøµÝ¼ÿÄÀÇ„LEp$jÎ%Ü< &cîa3†¯à/s¡Ýˆ¤Ú-˜N)µv_/pŠÖ¾9­˜ÌuñÒ×ýk]ˆ2AâSܹ­cjý®Þõ•íêçåR4Q\BÌBƦF„抩}Ï`ª¥&ø‚“ Üå|v &Uþ“T¶Çðí\ÌÙÁS…öÜ©ˆfS™Œ"r5¥©<ÔgüuuS¹·ÕMÕ:[À}®+Ü·uî»!8rǾ6‘)›5Ç?Í™ C]õZ‡Ø0Q³‰RÄcV%ü]&mR9ÿT¸†Aˆn  íë®ênµMG È#,ÃàhŽV?£a‰ˆ5Ô X“öà†àëü?ØÂÿ…ÿ³õp÷v_÷Œ<Ÿæ~a‘Ô_:$v¯Ã+shØÕg=a ‘rÜŸî‚?rB}ª½ðæÉ‘BíôÉ£Õc@Å:¤˜Íô;¹_šÛó¸RÓaz÷:¥ NÖŒKŸ,pdœ …qÓ Ë0x4ø™04QKï^Ù–e¸Ã÷ûŸ ÷ÎÂ5Xïd1)‡€`+þãâÏP¼€©G̭ꯧ^WÙÇñäCFx^1Iê7'gÅۧݧ‡ÿÜ„º endstream endobj 7995 0 obj 5772 endobj 7999 0 obj [498 /XYZ 38.2500000 328.250000 0] endobj 8000 0 obj [498 /XYZ 38.2500000 511.250000 0] endobj 8001 0 obj [498 /XYZ 38.2500000 511.250000 0] endobj 8002 0 obj [498 /XYZ 38.2500000 405.500000 0] endobj 8003 0 obj [498 /XYZ 38.2500000 405.500000 0] endobj 8004 0 obj [498 /XYZ 37.5000000 290.750000 0] endobj 8005 0 obj [498 /XYZ 38.2500000 328.250000 0] endobj 8006 0 obj [498 /XYZ 37.5000000 148.250000 0] endobj 8007 0 obj [498 /XYZ 37.5000000 290.750000 0] endobj 8008 0 obj [498 /XYZ 37.5000000 148.250000 0] endobj 8009 0 obj << /Type /Annot /Subtype /Link /Rect [101.250000 482 136.500000 488.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG >> endobj 8010 0 obj << /Type /Annot /Subtype /Link /Rect [149.250000 482 189.750000 488.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus >> endobj 8011 0 obj << /Type /Annot /Subtype /Link /Rect [384 306.500000 459.750000 313.250000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Introduction_target_languages >> endobj 8012 0 obj << /Type /Annot /Subtype /Link /Rect [489 743.750000 510.750000 750.500000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://valgrind.org/) >> >> endobj 7998 0 obj << /Type /Page /Parent 2 0 R /Contents 8013 0 R /Resources 8015 0 R /Annots 8016 0 R /MediaBox [0 0 595 842] >> endobj 8015 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F9 9 0 R /F8 8 0 R /F1700 1700 0 R >> /XObject << >> >> endobj 8016 0 obj [ 8009 0 R 8010 0 R 8011 0 R 8012 0 R ] endobj 8013 0 obj << /Length 8014 0 R /Filter /FlateDecode >> stream xœí]M¯ã8vÝ¿_áõã?$Q@ ª«*@Ý@AAO&ƒAÏ ,ò÷#=K.‹Ô¡ÅãKJòs™ª²e’"/ï÷=÷‡úù?Nÿõ¿§~üù¿O¿Žþøó[unëêò§á¿?Þ~ Ýyüû©uõé׿½ý~úýí§·ŸúÿýýíòƒŸü—þoÿwÒ§îÿÿ¯§û÷þÃ? üí­Umÿçoïv­êÿV]ÿ>ÿËÛ¿þáô÷aÄiºq1óÿÑ:S×nXÆ©›^S½ÿ÷¿¿þýí‡Ë¤ÍÒ5­RÍIYcOª³úô?ÿùöç~‚iøêìÝÚºêü;9y«‡Ù+Û¯_wÕI™pò÷ÿ„†Ï0¸êÿÈ6øûÊÅwE™FÅGÏ}ັ—M«Û »v=Ç‘]åü}åÒ›27<÷i›éŠd9m“óZí2’Ò°ò\§ Ï}ÚÖUOû:zŽ©M“‘”†•ç:m8xîÓn*—ñ´¯£ç8&§˜x_y®Ó†ƒç>íV5Oû:zŽisЉ÷•ç:mðŸRÁ+¹|¬‹ß#?üüËÛß”­ºS¿°_þܯí}ÎË¿ô[RŸþ8(ƦÿןNÿÐ/éË?ž~ùë[wnt=-qüæ+úÆTèÕÀo,úFÿWàÒG3pÕgâ›oék«Zø¦ü!¾Ñé§Yõe´¯¿ô$œúl÷¤ÔWáÆoŠOÓ%^5¤ †bñª5sgðÚà¾}Œ;ƒ.Œ­Þ/Œ®ìDü—íPÕ¹¿F®­¢tg×Uï+ýþÍå¨Ü÷4zt¤„¥oŒ7HÁ+ÉÖž­¹¸ø¾ÿ¦‚¿q«W?žáÒ øá’*8švð7x4‹¾)\jÕpžÈhþãAÌ…!Ôg£ºsNøHë÷o̹¶Í@îî>§È è.V9øÄ F–$r¤˜b¾¢#œ æø¼)ð7‘ÍÜ<ü&rÈ [Œ'ÆÛ…G &Æ«Wqa¦Ã]Ÿ2JµZùb혼6²6Ì4|aL1ùõ [XZLþKúñ˜IÝl›Ú;lÑãÁÄ7E8ž… 2ß ÁÑ dØ6–,C2ÛˆÎzÌAaƒOÁo°¢ Í:Müu¹Ù¨k”ÏF1I*ÿ]=>/!¸®ñ ú4´Ñ4$ž£w×‰ãÆ ‡átëÍ6Y{‘RòÖËÓ‘I¤ ¢õ–VŒZ­TFÎx{ݸÔÁ1Ôœç°ñ{Iè‚x«б†Ð˜Û,X=Vâ%´ªjTçB××è=Tõ¹êÌ|õŸàh—Õ+=}õØ»'D øµ½KŠÂ®&L­ŸÖŸ·‘""…¸b–÷!ÍTaÃèx7Dy'cÒÚ ò&,=ñæo¯×ÊZ(ð­<’r˜ò^دp^©éG[ñ‡¼6›m[O)ÙÃQThçQQTlÍ11¿~“#¶(±ŽDkq|•y¸;‘8.^>mü M‰Æ¿GW[F½®­_±“õD3.Af˜çb™…¹1–D-"O™}[Šxjýwûc‘ˆbDijØ{Û•ÕW§ý»»><‰[ ¼A2žƒRFL`'ÂkÙ‹à‚`Ý.ðø*™%A/¥WKøŽo¯òí]UA:­ZwÉÕúK®´v¾¶û Ù‘ƒÆ„Ìp=Æ“çù¨.[¥Â­zã÷®‡œæÓ°®½ýä··Ÿ³¥5ãsp¾Õ±H¸<"¿!Ö6²÷žG{ÝvŸGR2 $ð‹fQþ˜Â KE .ÖƒÁZŒ|0Æ¥>‘b^Ü%-PIÐRJ†N¾4Ìø¬Çù°"h&6ñaÒ8_ÑRI—ˆŽÈÆwpüŒo“ c´{M¿Œn„Û®Ì%dΧ‡017ѵٯR¢î~ÕžîÚi=›Wíáú·HlÇ3àh¸šT"FÃñ‚Ñ+Ó‰ìS›Z(®…OûyŸK+€oj!íÈRHç‰ÔB:Àñ3©Š©»Ä7™H.Á‘"k÷§¢cG‹¬ ßȨZ]LñŸò›WïÇÔzÚ¦bDÂãIÛ âƒL¾,¥}@ ,v-*IñlV¥#ê‘)ãb<ÉÁ’$-›Il O_6 _#"‰=¤%&ÈÍØË¥,\fó±UŒ]Æ¢‰ HµÍZ!k<ÈðçÈÉKT¡¦ÄÙûžIwÙ\^‹$µì&[4WH*¥|f}숩ƒ§Rj˜’I‰Ü°Èy•òÊï§æƒIQ'B½Û—…Û%8¢È-»T•Ñ«E`„Æ%*êt»š´™r…RAcÆø£°œœNQë!°V$J(O))t¢¢dÜÁVõ´ÒWÜáwˆÏ#w82ðÈ+"Q""-EÑfñÉaž¹%ÕsóøF±óÁ¿ÁÑFL‰xDcI‘j=Ì)pu!ÍðÃ4‘Y'/²Í•\!êªl¡SIÞaq˜$å¼ö)cÂ%@$f1Œw ±B•Ô™º 6ˆH$QëC–ˆ(ËIòö%€DÜdŒ£@ J"U•©GÈâ‹É)ª:åɪC•ŒD®kn1Ã.é¯bw÷ôì—¿â寈k¹¯<ɘWû°µƒiTØæÄ4Šƒßt{;¨nÜ´˜ícaDݨŠß-L“ªw²¥\¦¡ƒ0„”…£aæ…Y!fŸx*; vÆ¿…„•–bcbS…È8LÌ”½15?ë‘ÝŠÓ^°ƒI+–…^ºkyçLÉ«ÿb'm—Â0ÉÀ“õÖaáèØ¬ìåb´Š…>0@$(‚!…Dnv_k‹„ 0ç@ô>Â¼Š ËC"pÕÔoUØ/[Y+Èk¢3i÷a-¡¸†Eq„3—ÉÔ´Íø›*ÁÄÃøåño‚¬K¼ØWÊŠ½ ŒÝõÕTrJ^~‘;ÐFxîï¶ðÉ)J¬ñd …)#Û"ì~ÕôöEí"Å> ¾Õ„«µ^¦„.ãR®‚Í¡“0ç£âŽ›7ˆ/Uå¾%ï㙼Ël„{{Ã3]xðUèµ›äóœ.ðZ¯|Â5€ÇŒI%\ Ñèe:Þì3Ù0Ì—©ß&D ÇÌ0ê—‰'«|\ÚܧI"’GQëz—Œ¬nWÞúÒÕø2䇨G L_SŠAîY –(@Na(¾ta›7nª»Æç2›N÷\  ®àðþ‡‘˜šŠW%HJºñoL18ºýijŠþMë3¨<AyºlŠfßóp2æ2¶ÅZÉNU–‰cáð=@Ô¥PI²…r׊è`]ë|‰%ŸÆéf8¹kt0Í(Ò>Ñ`jÒ‡ÓL’vgÏÚ&^µ©VÂs> ]ã÷¹×Š6§SÀX»¬ˆ LêNª[4GÝ·™B#Ö€ªÎ5öæö|BߌûYŸµ¯û*ü'9^õx¢ £'eΗxmp¯ÍÀØþçùs¹#ª™¤‘O»KïS¡ÑÆHDs6J/*“K£á߸;pòwD¥]¥½JRÕpþ:ΰbÔHÑ¢yÊ­ÏHEëC#ª4S×,‹Y,jcáH†ˆIE©°êŒ2ĸpÀ1Ñôd³=B[˜ˆ¾"U7–uÎR‘‹B´:¥úà=d2r¾k4¾3‡¡=&k’a#ë{@Pá%¼Å 9ŠLœé9ohZÊÛæ÷(""à™Š¤ãP½dkH:"0¢\Ö5¸þÊQEÓŒ†Jˆe;š 9ÅŒbP ¿õ-7 ªÃ¦šB†!#ñD¸•ýÁDˆds…òæ&R<‰aÇ¢•†T\¡Ê)»„vx@žèVg‰3p…i…® fŽØjسë¥<L'‹(È„‚ËòÖtyLDi3QÚ.‰(Ýøâ£ÿ$QÃSf6йã*¢´^QZs¨PD O¹Ù(n>G¥§®U†™—!‚£yÇ*s‘˜$ÊÍ›±N,ØÆÅD…GÀŽä@át3>ojá›=ƒj1¾ÎR…ÿG:'LL™7¡]ÆÝ ´œ@ˆÎxÒËÂÜ6Ùº÷Cu¦2~°qq¯SΞTûËÛ7Ë‹° ©9A?”­~N)–`[¶zr¦{¸0”ŠlSL¢¢Ýž·„¸UUc=Iš¹'¸¬L¢Wcãà®o-h¶w7”2ب$U<šXúªSóôU§—ÒWõSKûO‚ôÕá)3ÅÜÎqM_uÕRújÛùsôŸé«í5auÅÍç(¾êÚ‰x >0‘õ.%”„IC¨h$KØÝTU0Ò;‡±n™ÂìËØ²žé¡TÊaL8 —PÖl—Í‘­S28ºuÎìQã ¦œ-’ýÀÜ]& á9ð6Ršr¡\:ÆáJÆ' ÕËfen,ÎDÄŠ¥tgöo}œhAà»d"c¥â†Ìå˜'k“›Î·’ˆz,ŠašÐ dSÛd•aÙRJSë-•±yü† >ÊgH°ÔRøŽ¥ŽI'"h1p±‘wöÞî£cMUMamœòDA…ÅæÿÕµ¿©[IøŽLòÚeK~¹#¥QÈô¿Ä~ZÌmEú®î¿ÇT¶=—õ.24+Z^"ëãet†cIéo÷¸[±ÀÎö:J¬Mã‰5ûB6yõÙX(7¾|Q(Ë–™FB<=F‹î¤ºÅBŽæBŠöªa}›T’‹óðæ„>¡oFÆRŸµïqTø7Nt´~ÓÁÑܤp‚ßcâ^PT}…ß8O…~£á7‘UwèMGª9›÷›|;Ïgø›ÍSA:ëÁ‰R[*#;õ…8xŠø­ñN1'™'{‡#;ZªÎN°?¥:AIø~(8¢Í!ö“‚¸;Ooc+÷«hpñ* C¬½^åo6?Ýy¥Ã¿q’£iÌ€˜µuœpZÏT Štþ͵R8´.TÚœõ¥÷N E–$Çñ&"ÃDЛ°"JÑÐ?a7`ÁÓиÁ­P+7:¦wgçªSÓ ´J]>ÕêÔÔç÷7ê?ùõ­±g¥:휺>ef£˜Û9úçÇ·ÃÏNÞ¯{ÁáÍÑÒÿf¾’á)7ÅÍçøËÛç?äí¬]ë+.N0fò·BBMJØA„CoÍTQh1N”`J¶óC• †æ뚤>Æ•M;çÊÆ-qå^©ö8¦­B®l¯|xÅÜÎqåʦYâʦöçè? ¸òð”›âæsàÊöZB*Ê•™Œy~-‚AÌxÆ9¡Êœ@6exýzÕª#±FÖo(U¹7”©†`ð¥ö×NK)Âò(Ükó ¬R"7À%9ËdŒóU".R)X( ÷u?ò#³=U‘úK—ØR—('‹o.ѸXyºˆÍIœù¸w¶Y»:ŽÉ;7öšl…H©'ðQKÕ›ìÙ'›µÃäúQhM|zìà¶ÐÛ-ȉfhH67¬Ð0> IÊž™59—šû8Å*™~ŒLJ:£'ɶgt«Ça6ü·m=÷ß¶Í’ÿ¶u¾oµÿ$ðßO™Ù(ævŽ«ÿ¶µKþÛÖs˜Ð;<åf£¸ùü·ý‚ÇsõßRX­÷‘ãòV; ãÐRÁ¢”Ywãæ˜S”›6Èò d½oÄJ Á…J,u¼=E~8z8ì{m|)ƤðSmÀ U(b_JAg)ã<ï=yþ&°œÜÂÔçHa&Îõ…†WT'VÀ¬šÂÁ…«ÆþüÍë|¢z[YwGV?ªQ¾Äi‘z2öp[ØxU§“ Vq™£yA"g SPvîÎäï¸ìïR¤GHu?¿û´©6·#"›,nf*މ´ñƒ‹ïO¹Ù(n>Gþàb£®uçÏ¡áÊSQ›Jk™ØïV‚bàë;¶Er›D[8Ri›Œ÷‘DÕ'“ƒž<¡I‚"¼…éÁÊÔvæ¨ÍýSÚ3‘bJv‰rªˆb7ûž”¯GDœ3­÷Ùðo@?¶ê¶Åà60¹› ¼^dS˜Æ‡XÀ•2ÖÌê³F(UçKÅ#HLÒDÅG©–šÂšz)€¨Rˆ G¾¢;ÐÆ(¡Á ã]MÜ(\»U Àjܳj[Ç,;FÖªÖÆ'Fq”±e¿A›êÍkÖDüU"žŸHçX‰¬\Æ÷Ù‚„ŠnLy-§ÌàßrQ ZÍ£@µ^ŠÕÖÐôŸQ á)3ÅÜÎqÕÕRÈvþý'AÈ^ã>Ó(n>G(PÝNç" ܸ>ä²PÖ„$½R•^ ®wO~4«ágŽ'o1á‚¿ÍËà×Ô\¢îˆÈæ3fT)w·¬™ð×¥ð‰bò-kêV{òíI. UN“ÿ 0” «˜×¡z‹2{Ÿ€ Ì\{‰½`Ò»„+鉷•E60‘Pò“èÅÛ{ößÞ$k¸Hמû8¾ÌȪ‰z¥•”AGyboµðήRÌü:¶†k56L½»)ö‚ms_Õ"º”*È+7ËHw*‚M´Ö*•üqD• ã 2Up…ˆ]¦Û;UxA8åEº¶–á”R^‘„ßz `F¯‘µ±¨»Å„ÐöW²MîŒpGâJ”²xüvê2ÔUÈ©|…À²ð ‡âýrÑO×Í£Ÿ]µýì´™ì? ¢ŸÃSf6йãýtn)úéZŽþ“ ú9<åf£¸ù¢Ÿ]=K!€Íc7‘OñÛ/*›áˆÙ@J:†ŸiÃäP°ó §’·9„lKs&Jÿ3)Ù,[?ǘۢp¹KóÆŠ#0H"9Yù™uí‰*ÊÔgŠo™´ŸCØ‘ª³©<úBé²n„R!M9ðR%ö¨JP,¥[y7ì;o›õ ¬'‘ Õë3?ŠuÐi§^(V3n¦EÛ¡”I†¢P&à©‹d¤Qˆ2 é ·—æ!ùÙmÏÈÇ= bP`š~Ô^mÎú]~>Ï…-_¹¦‚#ûÀ S_ûKc_d©_‘Æþ¢‹=ÒűœÂŒƒs‰º@æÅì ³¦y¯tFØVµ/×·^OèÅNEßeÁýEóieÓÙvPIH(î²-…©Ó–]Ûtdâ¶0V$U.Á›Å'IJeÄJx²©jG’Ûƒ A‡ ïW¬0…§Ðœ& ro¶ã—[/™¼¶“(~h‰WÀ…dÌK`¾û«8$S¿+z-{é"MëÍtY¶}Ü ‹±”³0¥í<~¶}ëÖÈGþüï¶Ö“>†[{b2ö#b¥°[ekJeÕqJJÉb<0^XYØžGŠÚƒÙýÅ îK·çZYQ²~:ä‡Deì†.Ô.ðàtÎÜpÛzbŒÑ¬R´$‚G0¡ø5€œNs0\ SߢŒÖ,RåŒA´\³”“ê½ö)ìXâYXyIpñˆbD)ÍšOn”/ékb=g‹\H|QdÙU¶Jñöbœ÷\ sßSÐéYñý'§`xÊÌF1·s\=—Ÿùž‚þKz †§Ül7Ÿ£€§ UÓ1àŠÂý¡tÈ@Íä­y¡Yû©b;BèÊf=î ö-Û:( l­hÎÂf‰r,ßÙ9ËwõË€;Ú pÇœiO™Ù(ævŽ+Ëwf‰å;€dø$`ùÃSn6Š›ÏQ€åw×s)Õ ûHP)¢¥cz56q¾ÃbpfI)xúLk@&hPªÑ l¢K!£³|C,ÁiƒÂ±ºvžÀ«.œ.­á§hsHc©aK a׈lB#á’-Ç®P&Ôæ}da:#òó‹Ô…t¨á<Á™ë”ßÐ èOwŽjé@ðoœäh¸ bd´/ð7äÕ°¦ÏàÊ ù;Üku!ñ…Ze…KàǵÙéGkæ©ÐÚF¢L“= \[—«Î§dÜ®™y7ø›Q‚-í¡Ø[#yj/ö£k¯dH$• óÅGˆIå͸Þa¸¾”‚m›ñ«àì¯qd#Ep\…[ I$ýP„Ø~çúyR]7‡Yîª%˜å®ò½œÃ'¾'õý)3ÅÜÎ1yR]·³ì:ß[;|â{Rߟr³QÜ|ŽüžÔ®Ê³,Sõ" æ³ÞIbXïh¤..átƱÀ·žéFÏDñ%²«„ö‰†#‹¹÷d¥3‚VTƒ-Öà™)JÉÙËîO´uç±ýˆŽòa2»­§‰E¢;åæú“ê–ô'­|ý©ÿ$П†§Ìls;Ǥ?uª]Пºžz½9úO|ýéý)7ÅÍç( ?é+ Íõ§¤ ‚» ›¢ –O× ”ì#p„óDu“´ Ï+B„]g¢ס‹9’ÄĵiçâÚ¸%qm+_”Ú*×ö* §QÌíWqmš%qmjŽþ“@\O¹Ù(n>Gqm¯;ײ  œ”lµ¯(3aä\$æÍ‘B2‹‚ZaR††_œœåäy¸Ö®ìZw×&—Uí‹!+2í´Ä3QHÆJá'™ÄÂØn;Ì$fPÇD²K9 hÊöÏ‹M@ÙÙe­öœé¦Ê8¯\€W.À°úDÊGŒÖ®ßï[£µÿ÷‚ÑÚõK›”ïŸxFëå)3ÅÜÎ1­ý¿ŒÖþÓÚŸ£ ŒÖËSn6Š›Ï‘Ýhíßój´ââðBh+T63!œdºˆ‰Zò¥ª·Šév„ó=bm#zèôÚʜǛ?;Fx_ñ‘ŒßŒ<ðÿ;ýôöÿ«K‹ endstream endobj 8014 0 obj 9841 endobj 8018 0 obj [499 /XYZ 31.5000000 515 0] endobj 8019 0 obj [499 /XYZ 38.2500000 686 0] endobj 8020 0 obj [499 /XYZ 31.5000000 353.750000 0] endobj 8021 0 obj [499 /XYZ 32.2500000 514.250000 0] endobj 8022 0 obj [499 /XYZ 32.2500000 353 0] endobj 8023 0 obj [499 /XYZ 38.2500000 686 0] endobj 8024 0 obj << /Type /Annot /Subtype /Link /Rect [79.5000000 586.250000 103.500000 593 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_running_test_suite >> endobj 8025 0 obj << /Type /Annot /Subtype /Link /Rect [218.250000 557 278.250000 563.750000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_coding_style_guidelines >> endobj 8017 0 obj << /Type /Page /Parent 2 0 R /Contents 8026 0 R /Resources 8028 0 R /Annots 8029 0 R /MediaBox [0 0 595 842] >> endobj 8028 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F1409 1409 0 R >> /XObject << >> >> endobj 8029 0 obj [ 8024 0 R 8025 0 R ] endobj 8026 0 obj << /Length 8027 0 R /Filter /FlateDecode >> stream xœí]KÏ#¹uÝ¿BkÖÉzéþºd 1 dadŒc†ÇHÇ‹üýHª*}*VªxtIVIô énQâóòÞËs_?ýë/ÿuøË??}þå¿~þå­86UÑÿïpþï÷·èö8üýдÕá×ßÞ~~¼}{ûvúÿ?ÞúüòùßOû¿ƒ>üÛéÿþvøãž>üÓð¥ó~{kTsúóï—?»FþV\ÿ<þ×·ÿøÝáçÇá†ÉLÿýû²-+ݧqgèoã2Õå¿þú·Ÿú 𥫻¢jª4åAu¥>üï¿ýù4ÀØ}qlëáðïäàíyðVéÓàª=,ެ›²*ºþ¹Ñ—¡ëÓºuw&‚j6øå?™î•xçM¡*ªóaæâ»¢L­Ü½%µ¦Ð%"5uúe§UUŸ)ë<^aú>vHæJM0! ¬2;¿Ì\|Wzsôè˜k] [eL€Íúè>@çMÕ„ëü2sñ]öè˜Û²¶J•6ë£ûw!ù2sñ]yÖû7Ÿ^ðTŠ«‚¥æ V}ÑMŠº9÷{ÒïÆ·Ç¶-u}þ£Qªÿ´9}R]ÕÈá“_ßêò¨T§ÛV]¿e&½˜Û1Nßþ]Ÿv°~]Wö§ON¿™Îäü­vÒK;ã¯oŸ~çV-8¶ìÓ÷·Ÿ¾vU¾ÿù|ËÎ[Ýÿñý$bOÿ¸¬Ó¾ÿéð/Eaš?¾ÿí­;6uuº«—“é[twi9mCWL[ [>_ZÊcizíý£¥„-¸·¶oYщy¿´TG£Oºª³UÀñªK‹9VeÝ6Õ£³‡{¡Ô¥E™q¶kæ¶~/ðÀwÏ)Ü.Ç GµpóáÜð8Žõ4°…8dUÇOÌÇAÎxŒ}[à±`ZuL–¹-Äot딺ïM©q©k¶ø b;Ž›Ì qÕ6È¥ç_ígòåûI_#ðª“ÀžJ<mÔpðœ)f‹Ç[çÆø4ßý):s‚s3ŸÄ ?ZÑ’Ž¢ñÀ3Nê1Þú¯ª÷ô˜ÝÖS5ºm–Ôè¶³UÜÓ'35úü-3éÅÜŽqU£ÛjInËÙå\>«ôÒNLj Fwz8†ªÑŽcÇLëB„LW˜ÝlM<¯²ìP|ñ8 Ûa”><C:ø7xŒ®ÇqHx‚àeßÁ˜Q˜~UëFM¥õϪ*8øƒõÜ^¾*}´åkùŽå¸6h=¸ƒq …÷M¡Üþ Eñ÷ôÆšo¥V ©g£½}Ò%öƒ]JŠ$ç­¯‡1Ú¿Ÿ^à ¾ô‡A|ù MØqY00¨ ÇÙbn/JÍÜš€ò¦;=ú¦òæõî£ @°Xadýþáwc`xOš;>'{gÜ3R‚ϵšõ9±ŒiAV6o<ÇkÖãf¯˜¼=ÁAÌ“•Qúyô& ãÀ,¥ÔÝ[˜Á¬UÜòžVð0UÝY§ÍÂÏ KÈ)FXib¡H±aÓM¿à<ì{x,Û_uì ¤6ÇÁª awVñˆ”©XÂëan)Ã[ˆ[#û,`ÆÁôFqDž¿”’ui,) £ÊR2KÉiÈ¡Ÿ3R„Ò^Ùó³PºœøYœÖ·àg¡tcù@œ?±ý,.ß2“^Ìí£Ÿ…ÒfÁÏBi=CÏü,.ßj'½´Ó1ÂûY(s¥ŒXL?ÛH¸§ÊºÁúxSÄrïz9±AFÇ›L(ò²ŒXâÎJd¦äátÍ8Sn7±8fnOc«Êrµs8”ãËüÉ& k­Ãy˜9M†¢‰§°øl ôl+! ïe'Œ½3jb=²¾ýÁMø]èOþÊá2áÁ( 4þ ôÑ™E­ÆÂÑ1ÄM¦4-Ú¦Ôwsf8“÷û$¤ìÉ;ºéÝ;i8:} A&(\C Êq“b‡+…Ø’†.j‹6d]ž(Ï7Fg"¼å<4eFô8.Y¬¼ëÝQËÀ'ˆ—Á@«»ò$g.‰l¢¨K„þTøÉš`„a&Q¯ý=@{˜¨cÉþI!=<šÒ–k{rÓ’uÊÈLFfEÛÔ3âü-3éÅÜŽqõ«¨Õ’_Em§š;2ó«8«ôÒNLjàWqr 8ø’¯OèùÏäcй šl;þpéëX®ŽõØ"Qø°e kL ˆ R›/’, sx‚Ây¼à¬ñvQ¶ÇF†Õõ}Ø÷z´à×TH ÝYoWx¥z‡åú™êdãHðFâí"ð/Ÿ *â¼)ŠXN'oÕT'oõ’N>Ë÷¦ú|oS­úü-3éÅÜŽqÕÉÛbI'oì¼uçOf:ysÕÂÇ^Úétò¶:1AŒ¦ð:Ï]Ç%dz&ÌQ”{·hxW`[–l ÑóAȲgÙt}ÂãÄò“5(¼€GqÙjKVdÚ“Vp· kìËy"VF¼( a–ÉIij\’Á½ž#=Ë®bÅ(«¾,s?M“lÐ@|çà®®mñ+,rƒn7±R†³Þ@L$N'ë:³Ï׬,½Q—Äõ| ÆMxà³»çðRÃf ˜º˜IécEÍ4ŒšÉ˜v¶|·Ä€[­º p«u±ÜêY Ý'˜@¯—o™I/ævŒ¸Õª]nµ²aœ?±ÛË·ÚI/ítŒðÀ­ÖÕx@éÛ )åÃ-u–Л—JÇåΙ‘ÜŒä¾’ËÌÍß"À­,™‘žä˜ƒ øÊìV3–¯gCt³Wؾ¼Â<¢m_ÇM,VdPw´¬¬Íï ãHn£í·W¤ŒÄŒË ZÊJr‰×Ò³É^awÁõ!{”oaupÈDYHYõ&–ùŒÚ<îQr$<}jkøÃhÉ0tY>À|S†¶ž“–OW­ÆÂJÛC±Ìöác O‰1gŠ™ªfj:¨Ú%ÓÁ,FR÷1’S𿾠Æ^ÌíWÓAU/™*;ÖóüÉÌtpþV;饎ÁtpZÆp 03Gj e¨§ôsÆþÀ$]{6‡û=½*¶hÁp] oòz¯6ÊjY;p`d„â^Vpöe2¬$r6î y­kKz‰ä¡x ~=›ÓWV„T‡õ Ô›¯÷:¦TâeJ)>Œ“«Èño$Üí£9üŠH™¤öL¶1ÙJs ßþœ4Eu]Zò“q) 0ÅŒdðsŠ$á妞" M³„€Ì"Òu‘>Å0Îß2“^ÌíW¤©–ÆŽ¬?2C@Îßj'½´Ó1" ­'~Šz;$€ÍgÉ1e_¹âÁãD"K˜²îDT…Ã~'[F…I”÷Ñ7^Æ,œí2lRö ®ñ¦âÈAas}aW/‚}‰äòà@×2Ñúµ»Ê‰ [­¢±Ðg31<£Î9}’E‚„tT¬*Kâe_ÒmǘÈrÝüÍïÐß¡¯ó„LæËuׯ8¼[¢)ÔÝKð$nÉÔ]˨üÇA¤^H#ÀO]£ "â×™¾òr,C瞪ëÇ0i Ö'‘‹V,nƒ®G‚¶™²ŒßÑ7†¾ÇdH{PÝbQÅÞ1Ê”WYÞkîª8öEÁnDÈϨe8Ãê¨íJb ÿ¦•ìM×°·ö6T9×s/¤þ˜›£™Üæ7æëõQÔ™)g}G-ƒ®µ´žÎ ÿ¦¿±õÑ\äĺ•Âq{ÝÀq>Á•âÅãh8ë/pÜ‚÷­@¿Ñ°e˜uÀËl†Ú7·î‡cñ 0o89\3NMœ"³ïø.Áq½Á=À+ô1U~ õCªt¬î(3ko€³fz^½R{­W´ÕÏ©·&-ðž:ˆ]3üón¸o˜?:Æ©ªÂ3Àû†éºâ‚0cÍO4c9M‡Ÿ¶åâßä@žles¯‡±²=€[ËÊ„³1hÌl˜Dñ!D‚eýpBÓAÞ¨êXØœê‹ë ghZsIvb~Úu‹ÝûäÜaÀ"º„*c ±È‹&/zúPáÔ(L~&Ç ãûÄठ™½Ž~3CE»d}k(¾èño U{x—Ò‘ëCŸ…Os—Œ3™ª8p Û×aÔŒùÜã™·¾,r û Œg¶˜IG¹ˆŠV¸¹ëÙjëÆZÕôóï£39zwÍÎ( 8¼0•‘Ü 3ˆ9–s¸sýKs ÿ‚.¹l¬ ƒÎG/fÔ«2á…éáÒMáQë¡j‘ô'”ËÞ¶°²ÊØ®¼ÚÒg ®žìÉúêz'ó ŠÉ7–`ˆV³"mˆåÏ ½Õ >D#ž‡³«G^§—¡ÈéÍ÷ ÍðÑ “1ý‰v£ ȃÇNy¸ÝÉu¹EsßPÙ ñd ³Îü HÜIÙÊ&§žQÒF÷pèêü: ,LŸ‘ªÖÁx'î+>à>añ¦TØX1©¨øì­ƒÉàRsø\$Cdö‡hò1z3À s©:“ÜW"c:Õý”–0Ù²]ÉÓ=‰¼N_S†rÐ#ʹRÇŸ]*¸äA¾G©E¾ ²P•…#+©ýTŒLÝñ2ÑÉÊKÔ2¬|©å¶Øòµ „¹ô›¶Tþ3Âô–~£a‹‚-Ÿàz˜YãßÀ“ r !£òõPéog$…sÚëd¾„ÞÎi·ç´‚s<œ~<¸þ¬Úe†h2D“!v‹3Dót•cÇÃà–°ÎÆçCDeX'Ã:“¹eX'ù[6Ã:Öɰޔ,tÃ:ý~̰ΦaÁ¸oŽóÁ3hCëbJ7j¼H ÞTÅ8<{ÆÞ| ¹ðæf2ÿ‹É±ˆ9*Êј)mS¾sÄÝVð7`r${ûLðÑÆŸ‡h±\[èDtÙZ'rWÝK"º²o®!6nxÆ{E<Œ@Åëã¨à"ÃÔöÕÜ_r Y™Î–A¯£å ãU-åcA¼P ¿ú˜ü‰]ýw…ø˜)ù¼Ûe#Äq¼ÄÌî"½Æ$Ë¡ŽA2‡.m~F¼36€FT*0óÉ`G*Cˆ‡!Y[Ng"î †Q3!Û²õLD]"e£n`ðFÚšIâ·2Eeszüš‘}1À—–†‹Ã{2"vzNÑi¼nÜ›Üê06ÜZk{’hl?¢ØÙÚ#‰àK>ìuvúë]¢(§‰äVš'ã™äAÄakRWp×Ïñ äÞ A™ACùŒ-Kòkë…Ò½oÁ¨\^U4šÜG£r¹%£ri)í^Êæ¨s=!’t®—½^"ùÀL)Ù]Êüoü/½Æå8¼L±äMk÷H|ÇfNñ²NñrA'´LTµ±EŸ"ÍÔ÷0VÉ ž¿J_µÙ±i§/x©ÄÊ3¿*›À3 ÐØÖ§ødØe/>u •àT G–^"ýmz$1ùA8Bâý…©ìg볩Ô"H(qâL~Jè2ºN;ÍxkxTbÁ“eâÙ™¥{”ôpsÚ`…1Ûõ¼üŠ6ð®ºy@H¤×^Ÿ )®Z½úœcYŠÒWØHVE‘qQ•š&ÙCÝlþKáÜëÁ# ‰ %[ŸFßžŽ‚Öç¯WFÇòÜdÙà¦h,ii†íž?51 zx eyðJòÀãyA¨bŒžðU û43 ›!·,´B -cÛu+ö¸ÈÉÍÅŽ¤b_à8pòiëQbèÐ"utò¹¹'Ÿëd†¬J³ ÄcÂy"Þ‘Z·…ÊP06 öË5ïyD%2–wënô{©æ{yÞ’ËŽ4ÇsÏ¿½éBß~ð÷·_¢ßôó¬c ~»taßuáPj¢â¯ìûv׎Ë9˜SNÅ‚+-Å€{G8U©}ÑÒG˜ÅèòŠq+q† "™#Ì}Tâì(pÖ8ƒ•Ïöæ˜ìÍ‘Ë ÓÁ½õ„ÔB;ûÆ”M Ô+õq³‡ éÕ±èÌÔY‹Q$`bê¹5Ì-í…x@d#ÁBÝÇk3;OÌË:YmšΞ[d^ˆÄ{82ù<ª•'grÌu*5d:Ì• XXÀÄ—8â~L°ð!$e³x7ýð®°©BàÛ%›ø€BýñuóÎí±¬‹+©ËzÍǪbÀ˜•%B{¢qoEUAdKº„¶oŠ(‘É µAëìΜ M7ãV"ª:c‹\¯ú‰ÄƒÄB†·SP‰ Êñaö‘\4™Œs’Šr°ÈŒda}²ºx,ˆ)c ©ýFBjуњLqB=¤ž-Çj ,i¡˜¹“ÊRoØu#ð-¿—¿ÇÏ›³ƒ›Bj¤ÈuæúR}Ôƒ>’» õ”en Î?”Þï-ù"j*9hÆÌþL$n|º\_ë¯S»”Jû”Ìë€Ø¥â,±D ç“‘WÔQà…ê&ˆî[úwZ4ë.åæf^¤^ j~6Æ{6¢Ô›Iß‘µiñçЂk|G^‡ÜÂ;ò:‡+ØöÊä‹kجÆÜž .ÆÊÁö"`öîซf»}´"ÖCÝ=»þ$IMV¶˜•áܱØÃÏi–GV¶4#ƒ±-)•#wWK¼ŸãíL[Ò*‡ouÝÞ~"ÇÛy ½{—HÖÙP¬ hè­™ßû”2Âiè×!· ¡_'CåUO© B›1S&— åÚ6Y63YJ¹)'‹¸ãØ ÑdLx†º¨A‚Vc¹´Äðy­”ýì —NÂ~AÌ8O†egSµ“¡D2U3/BÃ&A#{mDLNwŽ5…Š­óJDJ §ru7ŒÂ’²ª V¥M>²ÆâE!cfÂG# JYbTÁ­åÀb̵4W¿KÔ°)S×kÖ½GÁÄä>²Š%e¸OîIåöȉùš(2*‹ï › D,AÌ2@Æöµ'X,òëÝ‹«m ƒ7C¢ùƒ×·äÛUz™x:¹ÍÐb¤¤á±Ì»Â©þÒç[ˆ¥ÈR“éq{Ù6˜3,ZOlà [LDØ7ñ/gõE+yÞ=°€2·ëJKæ2&«K/p2‚þBz,†‹ªp•5ìáØQüŠ•‹r{ áBÏ0"¨—x€a5¦+2IóœµkO]UjëÌvõÔ•¤R0H“lø¿l÷gM øên¸þ‰¬Û'ÒäxÔ%;/‘ç '¹«ëͰ̠QQjÏ22Zú‚|b#éŠîã,›þ”ºÄøå›*NÆ1w{´DÒY§‡í³–èóÀ“{“·].>ðzÙÕפ;=&~~÷óû ‘ŸQ˰ÉõqH±:;î…ßà–!6f¡·!6F5ó×:œµêIC•G;ÿëXªiÞ¢ ÿ–˜ZÚ¢7¼C±(ÕÎ{Ópn=‡hŽ]kïœõè°²ÐÞƒàÅÅ©-Ûq;dÓûÆJ+;Ž-­¨‰`Ÿœ:©âe¢å“Œ•ÿƒ0*RžŒ²ÁWaz޽Þá õûä¦Â^%ÖŽêݸ¢hì?£ÁÝ}g…ôÓÆ’^é„…]Œ Áã(ÂæáÖ-+žE‚ŠEc/#³Y ;`dçc/À]4:[¶æÜ®=f–&*-Q·egªâ©ìÃÓÃT”þ½)"8 ƒ5%81ûÀ¢Û^FùEêÆ¨²@—¦©.W¦»Æ\ìŽ=4s»Ü¶Ô¨ÅÀý µ ºæÒoàÜò_êí+lù[Zÿ¼Žß”qZg SâóÁ{÷ÍHž†‚׃g­ðùà=À-p¯è×5q pnŽ•â}ƒsÃwÏÀqëáJsû£üï©ãþ<w!蟜ƒª°Ä½§É)„™µƒâñicNŽÏóQ<ë:¢î¡WÈ© 뾎ï \cn×0kð^CŠÕøÎdÝÃÅvI!Ž}ò ßB¶Q|Ó‡™¡³9z#¤„c˜FEõˆ¡Ì¯×­/!1p=é¹ÃwÚ¡tP8ÃÌ óD†÷2wóDܲý›G—2ݾu)|kaoéJœ°ãU›qœ-èR¢Â`-‹ÑWJ$ô¹XÔ÷n5¦„{6 æ¸gð„Óû=g æºMŒsh Œ§2Þ&"Ç‚äX÷ùäX ÂòÞ W—jô“êRÖ¥0_'ö€¡¾¬K¹nSFœ§mÑl²ÜEX'µì’þ_¶…ðÚO·ïŒfÑø#ÁÄ*k?Î;“µŸl ç.[¶…l™‹Å|¥+µ‚§%§$ÊâÏ„ÉsGàÌœ,’-$Ë©½òEÜ4õ&ç!FYcŠ˜Ïâ$Ûôγ²Í1ÆêI :ù VdÙ¶F¿õ;íôtœSd FRâF%˜³àãI|µ£;µpÝÀe q]¢L UwK¶`¡G-ÛH}rùÈ\>²XGCx`\oWòÒ}éËýøžÅ•,‰êZŽÒs _,º²|¤±e!>gGe^|ÉpKˆ |aŸ½UÛÚ›…µ?¬ëcˆÐ¯[ÂVíxW™Ð¤X·µµ»‘*Õ7…6Ñ+Õ¿ÃÞp¥úžª´ãªóŽ ò_ÐopÝ{<7\ ×|ǽ9ªÎk¸£ãE˜ó­®Gt¥xŽq˜pGá^3§=ì[ø‡˜nƼ¸ÔCÌãe5/Z‰³ÇA,…U´úë|ųua® +7>3Ùr9]¸tüHp<dÕmѹœ™µD1RÇ2˜íbf€·˜¨8+r'b¡ Âw³Æ{ç©5–Drì.&F†L –êx1¨žMr’ê·Sþe¦'¼´Ö}žiƒƒi?$ë6æZ«zÔ³*?—Œ¦ª‡3¨#*˜:ö˜ï½Ãƒ“UÈì³¥JÄ›²AÀ•§=ö³TBñ{¯Z"ü“¸üÑðOû°K㯂bÅ™Â"“=Ü$ö"ˆšYÖ¥-ávÏ€o‡uóv‚ç:^f@ò:33 O öœ,:d ô'ÙS—²êJ(iåû0û0]à3&ŒŸÝŒÑñÕƒH¢ƒ– ŠîØ.,¼>£Þ¨÷²¨ùõIYæòß8 T§ ±¥ä“ˆHší…„&E±†(”æå-à³m¢X«ˆ¶¶ØKl@žE_dx™@y?Ö¡,Æxó{i`oì; ým±—†cÉ£Ò·ÈÆ-àSpÄo1™;±ãw-é‚®ãÜZ}ÿÎÄŠñÈ·VúÖ*˜“ÐA—‘rS gØÁœ«Œx›LwŸ–‰(†“æÛ”e`L˜þ¦"G¯#ß“+“8…ÀqLLžVÀ‹CC`öЉ½ÍEúl’ÒŠ=ž•˜á·˜®‰b’ÍËKD›â}c2Q;ä!!?¨¼}84±ž}扔=9Çà;×U‚]+Õ;$˜l~"óÓ³I£XÌà¼ûDÖÃUEk!¦§Ñ¨ÜûZ'sHÇŽàÕ²6óè̽YîÍd–Ç4ÊäjŠuK6À£1…UȨ,[÷r€{íuL~[]+®cn‡ké8´ ¸WŽ›ž9ñ0l*>þ ¾3DµŒô”˜¹s=I¹Ý°ºª±ž"KÎ5ãÎ|á®Ð鼺¯¹–\uúÔGÝûÏÞÌàã߃ã8Ö>x´ßöº¨¦K[ð#3ã4š ·ˆ¤+ó‰Î"¢Xa9Á7¢9µžÅ?N4ž"¦ç\½Â–=ç¶ÐÂh\[ØDOΡˆÖ¤^‘„±²c}‡BîÙ9ãp‡l½ØI õc¸Ãž1ý8wffœýð¶Ð’ýð a?<Œ:<›Ê¡ñ0¹E™š–ÙV몸µnV ÖÙJ¸…–l%ÌVBV‚EóäÀ´ƒmb1¹3@;x ¡%1Ú‹ÃÆ€o:žæ(LÕ¹äòªd»Â¼[hÉÆGî¡™MŒwy@v±ßIKÏ2xvg2xv‡Ûu+L9¡ÁZrBƒçKh aŠò4G0>L! äG-Då+ éC2žnÙ±&‰ëi»äØáEÖ@ø¤Ü{é7±Ì ݇yá^ze¿Æ$qSRõôßáÇiuÎÅ»÷…övisŒ2ÇB­‡ 6dôónà^éSJOH Fó>üf^ø·ŸÁ’þŽÆ1¶þ çöuXéÜÌSÃÞ†ŒåS*àdÕ°ôy g »o`K‰–¡poð7–¯¼–~sWY‚;ÿ½¸&ÑÖpï \&Ášf~ƒƒæâ€s3˜p ÜoÜâ8=H?ŽÞàè]^…÷‡ 9\¼ä!jl s8Ù„,ñC.sû@¹Ë®¿¾½ý?ÕN6e endstream endobj 8027 0 obj 8499 endobj 8030 0 obj << /Type /Page /Parent 2 0 R /Contents 8031 0 R /Resources 8033 0 R /Annots 8034 0 R /MediaBox [0 0 595 842] >> endobj 8033 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1409 1409 0 R /F8 8 0 R >> /XObject << >> >> endobj 8034 0 obj [ ] endobj 8031 0 obj << /Length 8032 0 R /Filter /FlateDecode >> stream xœí]MoÜ6½ï¯Ð¹@6ü’DEØq ôPÀˆŠФi4AÝú÷«•¨µwW’Æäˆ»Ë©í¥E 9ÃáÌ›áðõï/þüV¼¾}ÿOñÁ}¿}¿ÛºýÅîëÕó”ݺŸ‹Ú–Ň/›Çâqs¿¹oÿÿ¸éxûsûÓ…*~jÿ}.~ý­ýð£û£Ý|ÙÔ²n¿ÿÝ}ojÙþ$ößwŸÿµùå»âë®ÇáuŽ˜Ãß_[¶¿ïȘxõãf¦ì¾¾}øºyÝOÀ²·´Tî>•F›B6Fÿþ±ùÔ¾à©{±m”,+[©vŒ[+tÿ+õ•µêÞ©ËBªFe}üÆþù0½Ë72bç;ÊCOŠÔ•ôu‰Ç²¶n¢´Ž0UOÝGè\K¯óŽòà³2pö‰Íº©ÝTµÿ"pbß}„ÎK[E”¡åÁge`3ì=›«Z»©’&Âd=u¡ó:&›;ʃÏÊÀfØ{$6Û¸l¶1ÙÜÄd³ÊfØ{6+•ÍϺйŒÈæžòXlƽGb³ŠËf“Í:&›UT6ÃÞ#±Ù |¨«sebr¹4ñ¬øžòГ20u‰ÇÕàÓFáqÑcVuDgª§<Qç‘x\¾N Tä©÷l°eD%ÑQ GâqcDÄu¼ï=´•DGy¬u|Üùý’N0%ý'¤}ôo¤Ü–¦²uÙý]×¢oº–f«î@í-â¶k1[×ðÔ"U×b·¶•*Ÿ?£ûÏøY{ü§'@ŠN^£ôñ5|¦‚ÏÀÞdÏŒ»‡Vˆ^ÆiºìE U6ý[ÍÇÎŽ˜F Ô"Ô"-l©Q ¦@šÜ¢n—?ã„{¬·Èí öön¹(Ø¢ïBŽGÀÙp¤nŽQç‡Ò^ l³ƒùW°€´MÎAfý{šTúpÐcªw‰º*T¯€-x[]K¹ÕÊÊ™†ç=2ÔDMlþ²4?ÞüÞ½àŽwº÷‚5€»‡½-Øã°Ì³+cb1I¸7{ƒÃpûðÈ3ZζwLÏi¶Jîx훥 á>Ì„;KáH•…T—]‹Öä¬ÙI¤TRNt”Íåíò 6›”¡MJ… œó˜9Р“¸t¸7,½¸šFxÞ<ïÁ½ÕŒ+]O¯3L©ÂÏ@C6¯t¾•.KÂJÇn?e¥3Éëš1ͤĒ\/èœcW?¯¦àkît\œc•åà!iGÄ 2ðübY¾ù'É2´ô<Ò‡ ‚–÷X`°7WÓ9[z<ëÙÖÓòOÑIÀë>¬<`éÃRu9lñPM V§]ÞÊ¢D^«/)eý`ÍçËIßb½þ&”†œ-h£§Ç{ÁžÐBjhÁ]šŸ+àmv¬<=@ñ ÿ Àµø sãg(h=hî‰0ágæG0I†LN£8P;!Ä‘²Dú(à T˜ðeT¤Ð’ÂgîÊT{ TœÿC„=-Œ–™Çæü·Z(:@cX’I–=´1I•‡* çBÎa¸„’gçYÁ„l:Ü›–dz|déê{g¤†q—xQ Ã¬ÄcP¸ðzv`I礕Áa‚Þðè·ÃJ¯¸Æs€!mŠM̪³Úª3Â3¨[ÙÇM@ Ü[Ðdàgþ*—T ‚å«(–<Á—ÆóFIqX?QŠKvRö2<þe¤8„HhñІWÖH8€Ç¸ë•¢šÞõ(»}PÄõd×ßÛÎ4YÛÑa“ÆWÇ•0LJÛÅï!œ-¥¤xtmÁ+˜’ŠDHêôÌ(Åú!D<ˆÞs’@ëK5,ðàB”44‚ÕG9 MÙs®g/0”õL˜Q®ˆ—$žç>Åæ¦¡¹Œ™¶bsª|-a­Ø”9wžzG-ÃÚø”d}Œ¶pF«ÊJO®MJ “Kc_O†Dö˜SÐ(ëÒ3Ò³\Yál¡‰$úJÚCÆ/ªŽ³ôiË]¨L¤ÊWå ]]ÜXŠmUËìfœß s‰]ᩇdâãÕ»(ÿ˜T­æl3yëqŽr¦Ð’3y ³#Eñ3Ø‚Å^ !‚Äf«SƃiÃ-ÌTýo*^È£Ug ­³H¡%ci{³˜Ô5sðќۖ@KÎmcô×)åÂrÁ°b/,¯‹Kz±b3~&-׃†¯¯Ó2æ-ø0oó©å-û }¬È¬VicÃÖmÆÖOåsY ‘~%ÚÄz îà‚'ITo2Ü&-î×÷¯^·˜Ó±hæÀã¹úy-ICVaAcJ:4^M€žt|1èaHO €r4RÀ 73àñõµoÖBŒ(.lçN x†õ:á’<Š5ƪQfÀ¢¹Ö·¯%×úf„_s­ï\ëûÉöŽÙ*±‡l=WuNa‡c—,bVWŠ@¾üô]¨)ôƒ¹JìÁ\¶šâƸ%>.Míàöe·†Î¿ßœ[U2c«gÒ’±UÁ‡­®X{A„Ò3I ¨J¾(Á8—ÕL[×`ß —”$j!¦rr¤HSATRB"åà¡`sâw*9E>ÏTžKÓÄIc1a†Ÿ¥¼]¥È£Ÿf`Ò”x„÷%º4]ÃQÇ!çXµ¤×Ù¬ËËÔÖ‚gÍQxZBŸ%ØÕ’HºzJ~†‰Ìž0q"3ÄåÈáVì·'3÷äºDÂýç"Sn-ÄPîMœa#~ñIzt »Î û™´dÐ]°î˜j ¸ioÀ#Ŧ ×-?”úÛ”$ lêS( {”ŒPœžú Ý3—÷‚4¾ÁnDÐZò(.l¥¢õÝ<z'G`ÎM¥8-éê©«\©{.0ݡǺKÌØxÆ@¸ç!ïIøA9—mUš­6 ¾n…‚ºf΀«nSÖv)cës.e‹4ë[â{Âê[ÂQ³õíÎõå:¯íGô&Âfæ)lr82Ç‚28¬Cm¸¥7CÆÂ5ò8 éõTWà ˜gŒw'.Ôö8îå¡ö&™j)³öi\›FÉÜÃcÁ*sƒQ2gŒ„'Ï$Õ3Â<|Ô†ëHÏqÔÏSµhþyÓ(áÍù¡JÑ ×ŸâŒÎ¹ÿ7ãá)´¤ì—\ZltýjçœØÄ¬{_±$=îu@h 1Ö¾~å~&©¢ø¤#Ç„/¸7Ï:Ååp<5ìý#PFñ¼Q"†\s°þ^à)—¿\ÚýRF±ïë)Ø€}RjÐ>i%‡}ûcؾ'¹6ØS#䛞úaw(¢»—;Ö=œ S£5F:<↩~s4@JñOEèËc’ TIž‰ìß3RCÆiÛrQâ8d%¥…DõÍrª_ 2•¯nì‘öÅ£NP+ºÊ¦cÏ,xqUDѦDÔs‚RUeã2³,'æ$íJœöMq.)iÒ”*pç2ŠŒò¬@[¿À9 {€Ëu^5±­@™×õ9·~x:,ŒD¬)Õ#)’ `¢hoÌSÂ¥ÃëÏ圹g5N]{,ª:ô¥6¸ƒØñáºö8M𪱠Kq¸< ¸7è(Œ· 'RùMì9-ð‚C'?IœR¶z†ºÄ¥÷¥'뎩(öy¶¢p8 }uÎ1Vñ7 kËÃéYÚz ¶\t‡Ÿ'öÁ•AרýJÄxÙ|X×£b±"Å)M„$¸ Çý;‰h¿ŠÇ–õ^ɸŸúƒ¢cG¡V©·Bî¶PÃQ8¥¿·*ê‘Yï…GÆêœr‰â¹«•ÕÖ-˜gÊMB‰x‹Þ£1Ën!mïÜH‘Õ‡&ÍñÂÇWV§t¢K¬c‹gd÷Ÿqr, ýYFUàv?·Œ†s§á˜°¸€±yÛ‘ဴi, ¸'™cN`îAùñôç@Uhñâ$€(27Öb_.µÐ[§ÉÄ3jù,,6©®ï‹ûÍÿ>:UR endstream endobj 8032 0 obj 3061 endobj 8036 0 obj [501 /XYZ 31.5000000 143 0] endobj 8037 0 obj [501 /XYZ 32.2500000 141.500000 0] endobj 8038 0 obj << /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_generated_scripts 7333 0 R /__WKANCHOR_1b0 5961 0 R /__WKANCHOR_1b2 5979 0 R /__WKANCHOR_1b4 5980 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_module_class 4664 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23R_language_conventions 6583 0 R /__WKANCHOR_1b6 5981 0 R /__WKANCHOR_1b8 5982 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_examples 4128 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_special_variables 4926 0 R /n#3e#3bF#f2#fb#8f#ad#ad6#28#f3#db#a3#b9l#d8Q#c83 7330 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23D_in_out_directorin_direcetorout 4051 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_multiple_modules 3942 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_arrays_pinning 3869 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_pattern_matching 2954 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_out_typemap 6912 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_template_more 2247 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_running_swig_loading_module 7157 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_module_directive 25 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_alias_templates 2448 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_memory_management_objects 3951 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_templates 4209 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_special_variable_macros 3017 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_threading_facilities 2511 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Doxygen 3393 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_arrays_swig_library 3859 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn2 6638 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn3 6639 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn4 6641 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn5 6642 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn6 6711 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_default_arguments 4624 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn7 6712 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Contract_nn2 3306 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn8 6713 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Contract_nn3 3307 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn9 6714 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Contract_nn4 3322 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_director_subclass 4226 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Contract_nn5 3330 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_stl_exceptions 2731 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Sections_developers_docs 1335 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping_cpp_inheritance 7246 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_typemap_examples 4986 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_what_is_typemap 4905 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_director_ctor_dtor 4202 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_adding_additional_code 4256 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_typemaps_arrays 7291 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn3_1 5964 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn3_2 5966 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn3_3 5983 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn3_4 5972 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn3_5 5973 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn3_6 5974 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn3_7 5975 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_absrelimports 6472 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_commandline 4498 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23D_features 4082 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_package_search_static 6513 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_typecheck_pointer 3185 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_getting_right_headers 4491 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_typemaps 4272 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_typemap_arrays 5432 0 R /#7b1#5e#87#8c#7e#d3#92#10#8f#df#d7O#9a#d6#eav#ce#3f#2c 2449 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_running_swig 4123 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_common_customization 4823 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_typedef_reductions 2961 0 R /n#0a#e1#cb#17#c4#a3#83yzDZU#bf#ae#7e#bc#e1_#7d 2527 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23D_other_features 4091 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Modules_external_run_time 3638 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript 5112 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn2 2846 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn3 2847 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn4 2896 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn5 2897 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn6 2905 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn2_6_1 5942 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_structures 5345 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn7 2906 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Varargs_nn10 3389 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn2_6_2 5943 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn8 2913 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn2_6_3 5944 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn9 2914 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn2_6_4 5953 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn2_6_5 5954 0 R /#e9#97#8a#1d#dc#1d#0e#e0#be#fc#09#9f#7c8g#025#a2#a6#b6 7331 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Doxygen_translator_design 3511 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_overloading 3172 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Preface_nn2 1339 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Preface_nn4 1341 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Preface_nn5 1426 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Preface_nn6 1427 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Preface_nn7 1428 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Preface_nn8 1429 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Preface_nn9 1430 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_package 4175 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_namespaces 2254 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_troubleshooting 5179 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_names 4177 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_noexcept 2489 0 R /u#a4#0c#cb4a#ea9#1d#7eh1#c6Y#c7E#d6#ae#ce#fb 3890 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG 1671 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_freearg_typemap_ 6930 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_typemaps_pointer#2dto#2dpointers 7292 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn1 4270 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn2 4271 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn3 4273 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn4 4307 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Doxygen_nostripparams 3466 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn5 4308 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn6 4309 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_converting_java_string_arrays 5012 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn7 4310 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn8 4311 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn9 4326 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_std_shared_ptr 2734 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23D 4007 0 R /#ad#0f#ad#060#f2mBR#83#0dz#27#ab#15W#d0#21#83#21 6496 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_directors_classes 4758 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_template_member 2233 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_implementation 5216 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23R 6563 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Preface_testing 1446 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn2 5603 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn3 5604 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn4 5605 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn5 5668 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn6 5669 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn7 5670 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn8 5671 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn9 5682 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn23_1 6782 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_memory_management 4677 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_commandline 6140 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn10 4323 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_new_string_literals 2460 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby 6581 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn11 4324 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn12 4327 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn14 4330 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_proxy_classes 4678 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_director_enable 4212 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn15 4331 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn16 4320 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn17 4344 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn18 4346 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn19 4347 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_standard_library_changes 2517 0 R /#17#05y#e1#c3l#5d#86#92#97C#af#fe#88#83#edq#0bGF 2334 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn20 4351 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_special_variables 3010 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn21 4358 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn22 4360 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_regular_expressions 2502 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_node_extensions 5162 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Preprocessor_nn10 2616 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Doxygen_python_unsupported_tags 3500 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Android 3713 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_ref_qualifiers 2483 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_nn2 3529 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_nn4 3561 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_nn5 3562 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_nn6 3573 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_nn7 3574 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_nn8 3575 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_nn9 3576 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_nn13 7174 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_nn14 7192 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_class_extension 2196 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_python 1591 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_director_example_cpp_code 4205 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_check_typemap 6905 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Introduction_nn2 1471 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Introduction_nn3 1473 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Introduction_nn4 1501 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Introduction_nn5 1502 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Introduction_nn6 1504 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Introduction_nn7 1505 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Introduction_nn8 1517 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Introduction_nn9 1518 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Doxygen_language_extension 3531 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_default_primitive_type_mappings 4891 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_readonly_variables 1840 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_global_variables 4540 0 R /#7d#ac#94#06#97#0d#7d#e1#a7#2b#3a#bf#b3#f9#92D#02j#3fC 2418 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23D_imcall 18 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Doxygen_nolinktranslate 3464 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_code_typemaps 4958 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23D_introduction 4001 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Modules_introduction 3619 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CCache_nn2 3661 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_date_marshalling 3960 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CCache_nn3 3662 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CCache_nn4 3663 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CCache_nn5 3650 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CCache_nn6 3652 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CCache_nn7 3653 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CCache_nn8 3687 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CCache_nn9 3688 0 R /__WKANCHOR_9q 2289 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_classes 4180 0 R /__WKANCHOR_9s 2291 0 R /__WKANCHOR_9u 2293 0 R /__WKANCHOR_9w 2309 0 R /__WKANCHOR_9y 2317 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_applications_webkit 5190 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_optimization 6320 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Doxygen_alias 3447 0 R /__WKANCHOR_1o0 7220 0 R /__WKANCHOR_1kq 6923 0 R /__WKANCHOR_1la 6958 0 R /__WKANCHOR_1o2 7222 0 R /__WKANCHOR_1ks 6942 0 R /__WKANCHOR_1lc 6959 0 R /__WKANCHOR_1o4 7235 0 R /__WKANCHOR_1ku 6944 0 R /__WKANCHOR_1le 6973 0 R /__WKANCHOR_1o6 7243 0 R /__WKANCHOR_1kw 6945 0 R /__WKANCHOR_1lg 6974 0 R /__WKANCHOR_1o8 7244 0 R /__WKANCHOR_1ky 6947 0 R /__WKANCHOR_1li 6975 0 R /__WKANCHOR_1lk 6984 0 R /__WKANCHOR_1lm 6992 0 R /__WKANCHOR_1lo 7001 0 R /__WKANCHOR_1lq 6998 0 R /__WKANCHOR_1ma 7025 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Varargs 3335 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_const 2324 0 R /__WKANCHOR_1ls 7008 0 R /__WKANCHOR_1mc 7029 0 R /__WKANCHOR_1lu 7009 0 R /__WKANCHOR_1me 7031 0 R /__WKANCHOR_1lw 7010 0 R /__WKANCHOR_1mg 7043 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_null_pointers 4612 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Doxygen_pydoc_tags 3501 0 R /__WKANCHOR_1ly 7015 0 R /__WKANCHOR_1mi 7050 0 R /__WKANCHOR_1mk 7052 0 R /__WKANCHOR_1mm 7055 0 R /__WKANCHOR_1mo 7063 0 R /__WKANCHOR_1m0 7018 0 R /__WKANCHOR_1iq 6791 0 R /__WKANCHOR_1ja 6830 0 R /__WKANCHOR_1m2 7007 0 R /__WKANCHOR_1is 6802 0 R /__WKANCHOR_1jc 6831 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_smart_pointers_generic 6206 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn34_2 6853 0 R /__WKANCHOR_1m4 7030 0 R /__WKANCHOR_1iu 6803 0 R /__WKANCHOR_1je 6843 0 R /__WKANCHOR_1m6 7032 0 R /__WKANCHOR_1iw 6804 0 R /__WKANCHOR_1jg 6844 0 R /__WKANCHOR_1m8 7034 0 R /__WKANCHOR_1iy 6805 0 R /__WKANCHOR_1ji 6854 0 R /__WKANCHOR_1jk 6861 0 R /__WKANCHOR_1jm 6864 0 R /__WKANCHOR_1jo 6866 0 R /__WKANCHOR_90 2205 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_advanced_renaming 1851 0 R /__WKANCHOR_1n0 7161 0 R /__WKANCHOR_5q 1847 0 R /__WKANCHOR_6a 1900 0 R /__WKANCHOR_1jq 6875 0 R /__WKANCHOR_1ka 6914 0 R /__WKANCHOR_92 2206 0 R /__WKANCHOR_1n2 7154 0 R /__WKANCHOR_5s 1848 0 R /__WKANCHOR_6c 1901 0 R /__WKANCHOR_1js 6881 0 R /__WKANCHOR_1kc 6903 0 R /__WKANCHOR_94 2215 0 R /__WKANCHOR_1n4 7156 0 R /__WKANCHOR_5u 1850 0 R /__WKANCHOR_6e 1902 0 R /__WKANCHOR_1ju 6882 0 R /__WKANCHOR_1ke 6906 0 R /__WKANCHOR_96 2217 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn50 5865 0 R /__WKANCHOR_1n6 7158 0 R /__WKANCHOR_5w 1861 0 R /__WKANCHOR_6g 1912 0 R /__WKANCHOR_1jw 6883 0 R /__WKANCHOR_1kg 6924 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn51 5866 0 R /__WKANCHOR_98 2218 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn52 5868 0 R /__WKANCHOR_1n8 7159 0 R /__WKANCHOR_5y 1871 0 R /__WKANCHOR_6i 1924 0 R /__WKANCHOR_1jy 6896 0 R /__WKANCHOR_1ki 6926 0 R /#93#0f#3a#1a#8a#d7#8b#22#07#90R#fc#1d#b7#1e#7f#11Oq#8d 2356 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn53 5869 0 R /__WKANCHOR_6k 1936 0 R /__WKANCHOR_1kk 6927 0 R /__WKANCHOR_6m 1937 0 R /__WKANCHOR_1km 6928 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_proxycode 4829 0 R /__WKANCHOR_6o 1938 0 R /__WKANCHOR_1ko 6929 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_sealed_proxy_class 3991 0 R /__WKANCHOR_6q 1931 0 R /__WKANCHOR_7a 1972 0 R /__WKANCHOR_1oq 7293 0 R /__WKANCHOR_6s 1945 0 R /__WKANCHOR_7c 2042 0 R /__WKANCHOR_1os 7290 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_other_resources 7329 0 R /__WKANCHOR_6u 1947 0 R /__WKANCHOR_7e 2043 0 R /__WKANCHOR_1ou 7300 0 R /__WKANCHOR_6w 1956 0 R /__WKANCHOR_7g 2046 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_customizing_director_exceptions 4783 0 R /__WKANCHOR_1ow 7307 0 R /__WKANCHOR_6y 1959 0 R /__WKANCHOR_7i 2048 0 R /__WKANCHOR_1oy 7318 0 R /__WKANCHOR_7k 2049 0 R /__WKANCHOR_7m 2058 0 R /__WKANCHOR_7o 2070 0 R /__WKANCHOR_7q 2071 0 R /__WKANCHOR_8a 2115 0 R /X#29#0b#01#ffr#2d_#19l#cd#df#bf#3e#caW#ce#5e#a2#87 2556 0 R /__WKANCHOR_7s 2064 0 R /__WKANCHOR_8c 2112 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_typemaps_ptr_ptr_functions 5445 0 R /__WKANCHOR_7u 2066 0 R /__WKANCHOR_8e 2121 0 R /__WKANCHOR_7w 2079 0 R /__WKANCHOR_8g 2122 0 R /__WKANCHOR_7y 2080 0 R /__WKANCHOR_8i 2131 0 R /__WKANCHOR_8k 2139 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab 7100 0 R /__WKANCHOR_8m 2149 0 R /__WKANCHOR_8o 2151 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_std_auto_ptr 2751 0 R /__WKANCHOR_8q 2161 0 R /__WKANCHOR_9a 2225 0 R /__WKANCHOR_1mq 7076 0 R /__WKANCHOR_1na 7181 0 R /__WKANCHOR_8s 2168 0 R /__WKANCHOR_9c 2232 0 R /__WKANCHOR_1ms 7086 0 R /__WKANCHOR_1nc 7183 0 R /__WKANCHOR_8u 2187 0 R /__WKANCHOR_9e 2239 0 R /__WKANCHOR_1mu 7098 0 R /__WKANCHOR_1ne 7172 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Doxygen_notranslate 3441 0 R /__WKANCHOR_8w 2188 0 R /__WKANCHOR_9g 2246 0 R /__WKANCHOR_1mw 7099 0 R /__WKANCHOR_1ng 7173 0 R /__WKANCHOR_8y 2197 0 R /__WKANCHOR_9i 2253 0 R /__WKANCHOR_1my 7101 0 R /__WKANCHOR_1ni 7176 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_embedded_webkit 5175 0 R /__WKANCHOR_9k 2273 0 R /__WKANCHOR_1nk 7177 0 R /__WKANCHOR_9m 2282 0 R /__WKANCHOR_1nm 7193 0 R /__WKANCHOR_9o 2283 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Doxygen_to_pydoc 3486 0 R /__WKANCHOR_1no 7194 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_further_details 4650 0 R /__WKANCHOR_50 1796 0 R /__WKANCHOR_1q 1478 0 R /__WKANCHOR_2a 1521 0 R /__WKANCHOR_1nq 7202 0 R /__WKANCHOR_1oa 7256 0 R /__WKANCHOR_52 1797 0 R /__WKANCHOR_1s 1479 0 R /__WKANCHOR_2c 1544 0 R /__WKANCHOR_1ns 7204 0 R /__WKANCHOR_1oc 7258 0 R /__WKANCHOR_54 1805 0 R /__WKANCHOR_1u 1500 0 R /__WKANCHOR_2e 1545 0 R /__WKANCHOR_1nu 7214 0 R /__WKANCHOR_1oe 7267 0 R /__WKANCHOR_56 1806 0 R /__WKANCHOR_1w 1503 0 R /__WKANCHOR_2g 1549 0 R /__WKANCHOR_1nw 7211 0 R /__WKANCHOR_1og 7264 0 R /__WKANCHOR_58 1808 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_std_string 2715 0 R /__WKANCHOR_1y 1506 0 R /__WKANCHOR_2i 1551 0 R /__WKANCHOR_1ny 7223 0 R /__WKANCHOR_1oi 7276 0 R /__WKANCHOR_2k 1552 0 R /__WKANCHOR_1ok 7278 0 R /__WKANCHOR_2m 1553 0 R /__WKANCHOR_1om 7279 0 R /__WKANCHOR_2o 1554 0 R /__WKANCHOR_1oo 7280 0 R /__WKANCHOR_60 1872 0 R /__WKANCHOR_2q 1555 0 R /__WKANCHOR_3a 1596 0 R /__WKANCHOR_62 1874 0 R /__WKANCHOR_2s 1556 0 R /__WKANCHOR_3c 1623 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_wrapper_reference 2513 0 R /__WKANCHOR_64 1883 0 R /__WKANCHOR_2u 1598 0 R /__WKANCHOR_3e 1614 0 R /__WKANCHOR_66 1891 0 R /__WKANCHOR_2w 1601 0 R /__WKANCHOR_3g 1616 0 R /__WKANCHOR_68 1892 0 R /__WKANCHOR_2y 1586 0 R /__WKANCHOR_3i 1618 0 R /__WKANCHOR_3k 1619 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_primitive_type_mappings 4249 0 R /__WKANCHOR_3m 1643 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_output 1746 0 R /__WKANCHOR_3o 1644 0 R /__WKANCHOR_70 1962 0 R /__WKANCHOR_3q 1645 0 R /__WKANCHOR_4a 1701 0 R /__WKANCHOR_72 1963 0 R /__WKANCHOR_3s 1646 0 R /__WKANCHOR_4c 1748 0 R /__WKANCHOR_74 1964 0 R /__WKANCHOR_3u 1663 0 R /__WKANCHOR_4e 1749 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5 5593 0 R /__WKANCHOR_76 1973 0 R /__WKANCHOR_3w 1658 0 R /__WKANCHOR_4g 1757 0 R /__WKANCHOR_78 1974 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Preface_windows_installation 1425 0 R /__WKANCHOR_3y 1659 0 R /__WKANCHOR_4i 1759 0 R /__WKANCHOR_4k 1760 0 R /__WKANCHOR_4m 1761 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping_identifiers 7182 0 R /__WKANCHOR_4o 1773 0 R /__WKANCHOR_80 2091 0 R /__WKANCHOR_4q 1774 0 R /__WKANCHOR_5a 1810 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_compiling_dynamic 4494 0 R /__WKANCHOR_82 2092 0 R /__WKANCHOR_4s 1782 0 R /__WKANCHOR_5c 1822 0 R /__WKANCHOR_84 2093 0 R /__WKANCHOR_4u 1783 0 R /__WKANCHOR_5e 1823 0 R /__WKANCHOR_86 2104 0 R /__WKANCHOR_4w 1790 0 R /__WKANCHOR_5g 1818 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_classes 4600 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_integration 5160 0 R /__WKANCHOR_88 2101 0 R /__WKANCHOR_4y 1791 0 R /__WKANCHOR_5i 1829 0 R /__WKANCHOR_5k 1830 0 R /#a0#03#ed#b5O#ae#f4#8e#c2M#9fk#22#e0#04X#b2#eaS#f8 2405 0 R /__WKANCHOR_5m 1831 0 R /__WKANCHOR_5o 1841 0 R /__WKANCHOR_10 1412 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_director_overriding 4221 0 R /__WKANCHOR_12 1414 0 R /__WKANCHOR_14 1417 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_pgcpp 4708 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_coding_style_guidelines 8002 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23D_planned_features 4092 0 R /__WKANCHOR_a 1336 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_nn2 2631 0 R /__WKANCHOR_16 1421 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_nn3 2632 0 R /__WKANCHOR_c 1337 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_nn4 2634 0 R /__WKANCHOR_18 1422 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_date_marshalling 5072 0 R /__WKANCHOR_e 1338 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_nn6 2673 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_nn7 2680 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_preliminaries 4492 0 R /__WKANCHOR_g 1340 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_nn8 2686 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_nn9 2687 0 R /__WKANCHOR_i 1342 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_debugging 5105 0 R /__WKANCHOR_k 1344 0 R /__WKANCHOR_20 1507 0 R /__WKANCHOR_m 1346 0 R /__WKANCHOR_22 1519 0 R /__WKANCHOR_o 1431 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_expanding_java_object 5020 0 R /__WKANCHOR_24 1520 0 R /__WKANCHOR_q 1410 0 R /__WKANCHOR_26 1522 0 R /__WKANCHOR_s 1411 0 R /__WKANCHOR_28 1523 0 R /__WKANCHOR_u 1413 0 R /__WKANCHOR_w 1415 0 R /__WKANCHOR_y 1419 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Doxygen_developer_details 3512 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_building_modes_builder_mode 7315 0 R /__WKANCHOR_30 1600 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_tips_techniques 4849 0 R /__WKANCHOR_32 1585 0 R /__WKANCHOR_34 1587 0 R /__WKANCHOR_36 1589 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_feature_flags 3283 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn30 5778 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn31 5780 0 R /__WKANCHOR_38 1590 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn32 5781 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn33 5782 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn34 5793 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn35 5795 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn36 5801 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn37 5803 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn38 5815 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn39 5816 0 R /__WKANCHOR_40 1672 0 R /__WKANCHOR_1a 1449 0 R /__WKANCHOR_42 1673 0 R /__WKANCHOR_1c 1451 0 R /__WKANCHOR_44 1675 0 R /__WKANCHOR_1e 1452 0 R /__WKANCHOR_46 1676 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn40 5810 0 R /__WKANCHOR_1g 1454 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn41 5811 0 R /__WKANCHOR_48 1677 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn42 5823 0 R /__WKANCHOR_1i 1455 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn43 5831 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn44 5833 0 R /__WKANCHOR_1k 1472 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn45 5839 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_language_status 7999 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn46 5841 0 R /__WKANCHOR_1m 1474 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn47 5842 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn48 5852 0 R /__WKANCHOR_1o 1475 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn49 5853 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_smart_pointers_generic 5578 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_features 3273 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_pointers_refs_arrays 4609 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn10 5693 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn11 5688 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn12 5689 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn13 5700 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn14 5702 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_operator_overloading 7036 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn15 5703 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn16 5705 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn17 5706 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn18 5717 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn19 5718 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Doxygen_python_basic_example 3480 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_alternate_function_syntax 2419 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Android_examples_other 3792 0 R /__WKANCHOR_2 10 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn20 5727 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_smart_pointers_shared_ptr 5574 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn21 5740 0 R /__WKANCHOR_4 12 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn22 5733 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn23 5734 0 R /__WKANCHOR_6 1345 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn24 5735 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn25 5747 0 R /__WKANCHOR_8 1347 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn26 5753 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn27 5760 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn28 5761 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn29 5771 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_variadic_templates 2457 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_visual_studio 1539 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_using_module 4509 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_fragments 3127 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_memory_management_objects 5064 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus14_introduction 2539 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn1 5883 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn2 5884 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn3 5965 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_C_Iterators 6793 0 R /#c8#f3#e6#0b#158#22#ab#7d#d7#d9#e7#c4#8er#b9#f1#21#86#83 3896 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Preprocessor_condition_compilation 2576 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_directors_example 3913 0 R /Nj#18zu#07#a6xo#d9#3c#93#10_#af#2d#e5#89#25#60 2500 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_preliminaries 7103 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_constants 4173 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_functions 4541 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Android_examples 3728 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_simpler_enum_classes 4987 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_autodoc1 7011 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_autodoc2 7013 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23D_typemap_name_comparison 4044 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23D_typecheck_typemaps 4041 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus14_core_language_changes 2546 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java 4366 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_compilation_problems_cpp 4522 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Preface_osx_installation 1448 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping_cpp_templates 7257 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_type_inference 2416 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23D_native_pointer_support 4107 0 R /#01#e6#f7#94#3et#7d#b3#1f#10#c2#99#82a#2ceV#cc6#84 3783 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_known_issues 5159 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Varargs_nn2 3332 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Varargs_nn3 3334 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Varargs_nn4 3350 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Doxygen_additional_options 3462 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Varargs_nn5 3352 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Varargs_nn6 3360 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Varargs_nn7 3369 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Varargs_nn8 3381 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Varargs_nn9 3388 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus14_binary_literals 2541 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_defining 2928 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Php 5864 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_type_long_long_int 2487 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_differences_java 3834 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_r 1599 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_typemaps_matrices 7301 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_building_modes 7317 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn10 1772 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn11 1780 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn12 1781 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn13 1792 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn14 1793 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_runtime_type_checker 3157 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn15 1794 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn16 1795 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn17 1809 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn18 1811 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn19 1812 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn20 1807 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn21 1819 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn22 1820 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn23 1821 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn24 1832 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn25 1833 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn26 1834 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_exceptions_from_directors 4767 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn29 1852 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_alignment 2493 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn30 1869 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn31 1882 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn32 1893 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn33 1894 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn34 1903 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn36 1904 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn39 1935 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_attributes 2485 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Arguments_nn2 2767 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Arguments_nn3 2769 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Arguments_nn4 2788 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_carrays 2666 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Arguments_nn5 2789 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Arguments_nn6 2797 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Arguments_nn7 2798 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn40 1932 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Arguments_nn8 2811 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn41 1933 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Arguments_nn9 2813 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn42 1934 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn43 1946 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn44 1948 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23MzScheme_external_docs 7609 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn45 1955 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn46 1957 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn47 1958 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn48 1960 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn49 1961 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Android_stl 3785 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn50 1977 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python 5977 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_smart_pointers_generic 6806 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Preprocessor_nn2 2580 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Preprocessor_nn3 2581 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Preface_nn10 1416 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Preface_nn11 1418 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Preprocessor_nn5 2573 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Preprocessor_nn6 2601 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Preprocessor_nn7 2603 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Preprocessor_nn8 2604 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_javadoc_comments 5096 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Preprocessor_nn9 2614 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_typemaps_for_c_and_cpp 4960 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_thread_UI 6551 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_extending_proxy_class 3994 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Sections_core_docs 1334 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_builtin_limitations 6237 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nested_structs 1925 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_date_pre_post_directors 3981 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus17_introduction 2542 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_other_compilers 1602 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_feature_attributes 3284 0 R /ti#c9#80#dcwe#ef#0a#d3#ads#23M5#d9#f4XG#09 1332 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_imclass_pragmas 4666 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_absimport 6470 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_input_output_parameters 4848 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_exception 3213 0 R /H#0f#d2#cf#2a#d8#a5M#40#09p#e0b#d5V#9c#aeHu#e7 6420 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_thread_local_storage 2474 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_user_defined_literals 2472 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_typeunsafe_enums 4576 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_python3support 6519 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus17_nested_namespaces 2547 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_proxy_classes_gc 4697 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_smart_pointers 4634 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_static_assertions 2491 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_nan_exception_typemap 5004 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_default_args 6361 0 R /1#3d7#e2#1e#c0L#7d#92#c9i#89#e6#04#d3#f3y#aa#3b7 7255 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_tuple_types 2501 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_importfrominit 6478 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_swig_exe 1597 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_special_macro_typemap 3022 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23R_nn2 6560 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23R_nn3 6561 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23R_nn4 6564 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23R_nn5 6585 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23R_nn6 6587 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23R_nn7 6588 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping_cpp_classes 7236 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_Typemap_scope 6884 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_typemaps_write 5449 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_smart_pointers_generic 4633 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Doxygen_further_details 3481 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Doxygen_running_swig 3440 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping_cpp_overloading 7245 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn27a 6227 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_inheritance_mirroring 4688 0 R /Ne#7e#5d#8b#ad#c0#07U#24#01#92#ac#f7an#a1#0f#2be 2445 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_simple_enums 4575 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_commandline 4176 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Doxygen_features 3444 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_running_tests_examples 5124 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_constructor_helper_function 15 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_clearing_features 3295 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_defaulted_deleted 2473 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_overview 4386 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping_cpp_operators 7265 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_running_swig_generating_module 7162 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CCache_nn10 3714 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CCache_nn11 3695 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CCache_nn12 3696 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CCache_nn13 3697 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CCache_nn14 3698 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CCache_nn15 3699 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CCache_nn16 3700 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CCache_nn17 3701 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CCache_nn18 3702 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_type_wrapper_classes 4716 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_typeunsafe_enums_classes 4740 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_mingw_msys 1588 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_cygwin 1617 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_fastproxy 6321 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_typemap_attributes 4925 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_introduction 2348 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Preface_examples 1453 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_basic_tour 4542 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_autodoc2 6442 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_autodoc3 6444 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_preliminaries 5128 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn10 5323 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn11 5336 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping_pointers 7212 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn12 5346 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn13 5337 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn14 5353 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn15 5362 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn16 5359 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn17 5368 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn18 5369 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn19 5383 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_default_non_primitive_typemaps 4904 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_running_test_suite 7991 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_using_typemaps_return_arguments 5028 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn2 7638 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn3 7639 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn4 7641 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn20 5384 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn5 7642 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23D_importtype 19 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn21 5395 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn6 7667 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn22 5396 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn7 7668 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn23 5397 0 R /#10#ab#8eZ#aa#12#d5m#ed#ae#c21#82#d4#29v#9eK#ec#18 3255 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn8 7670 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn24 5425 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn9 7671 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn25 5426 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn26 5435 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_test_suite 7978 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn27 5408 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn29 5409 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn30 5424 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_enabling_directors 4756 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn31 5446 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn32 5461 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn33 5463 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn34 5464 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn35 5465 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn36 5466 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_gtk 5173 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn37 5473 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn38 5479 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping_overview 7179 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Introduction_supported_status 1480 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_running_swig 5125 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_visual_studio 4525 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_interface_file 1621 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_namespaces 5410 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Preface 1331 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_chosen_unignore 1870 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Go 4124 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_directors_implementation 3923 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_directorargout_typemap 6950 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_namespaces 4625 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23MzScheme_simple 7599 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_special_variable_attributes 3032 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_typecheck_typemap 6913 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23D_din_dout_ddirectorin_ddirectorout 4053 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_class_memory 4193 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23D_ddirectorinout 20 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_shared_ptr_directors 2752 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Preprocessor_typemap_delimiters 2615 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_adding_downcasts 5034 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_constants 4550 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_output_arguments 4257 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus17_standard_library_changes 2545 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_java 1543 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Preface_release_notes 1423 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_building_modes_nobuilder_mode 7316 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile 4267 0 R /#83I#e5z#5d9F#93#f4#f9#98#d1c#1390#19#ecS#eb 13 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_directors 6262 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_class_inheritance 4213 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_simple_pointers 4865 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_C_STL_Functors 6792 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_catches 2292 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_typemap_examples 3939 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_sizeof 2480 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_newfree_typemap 6921 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_exceptions 3880 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scripting_nn10 1678 0 R /#f2#a9#d9#e1#9dT#97#b9#5c#bb#7f#11S#29#beO#2d#d2z#3a 3938 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scripting_nn11 1669 0 R /#eb#2f#87#7d#27#01L#3c6#c1#3b#b3#1dc#eb#a2#88#04#7d#09 2435 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scripting_nn12 1670 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Doxygen_ignore 3448 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_limiting_renaming 1862 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_pointers 4591 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping_cpp_namespaces 7266 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23D_special_variables 4064 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Doxygen_to_javadoc 3461 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Introduction_target_languages 1477 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_typemaps_primitive_types 7274 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Preprocessor_warning_error 2621 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_directors_threading 4768 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23D_test_suite 4103 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_configuration_files 7970 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Doxygen_translation_overview 3411 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_outputs 4183 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_smart_pointers_shared_ptr 6807 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Preface_installation 1424 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Doxygen_python_further_details 3519 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_argout_typemap_ 6911 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Introduction_experimental_status 1476 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping_global_variables 7195 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl 7334 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_module_packages_classes 4537 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_member_data 2088 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_running_swig_building_module 7155 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_arrays 3854 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_default_args 2138 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_varout_typemap_ 6931 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_runtime_type_checker_usage 3165 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Sections 1343 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_stl_cpp_library 2714 0 R /W#c1#03q#92P#fd#3f#0ebO#f2#da#fd#a3#d0#e1#bd#d5#17 2516 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_introduction 3782 0 R /#1b#ec#91#2a#5e#da#a0#3db#a3#9b#ab#11#9cA#25#7f#da#0f#ee 7221 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn2 6100 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn3 6093 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn4 6094 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Doxygen_troubleshooting 3513 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn6 6095 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_feature_autodoc3 7027 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn7 6110 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn8 6111 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn9 6119 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn10 6724 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn11 6725 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn12 6727 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn13 6728 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn14 6738 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn15 6739 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn16 6740 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn17 6748 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn18 6749 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn19 6757 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn20 6763 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn21 6771 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn22 6772 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn23 6783 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_template_specialization 2226 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn24 6808 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn25 6809 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn26 6810 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn27 6811 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn28 6822 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23D_nspace 4097 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn29 6823 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Android_overview 3731 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn30 6832 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn31 6833 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_examples 5113 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn32 6834 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn33 6845 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn34 6846 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn35 6862 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn36 6863 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn37 6865 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn38 6874 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn39 6897 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_director_classes 4206 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn40 6943 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn41 6960 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn42 6962 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn43 6963 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn30 7507 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn44 6965 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn31 7508 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn45 6966 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn32 7517 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn46 6976 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn33 7524 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_c_arrays 4864 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn47 6977 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn34 7531 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn48 6978 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn35 7538 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Contract 3309 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn49 6985 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn36 7540 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn37 7548 0 R /3#89#3fq#24n#f2#2d#9ek#2d#12#d9t#eerd#b5#b1q 2169 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn38 7549 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn39 7558 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_director_foobargo_class 4237 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn50 6991 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn51 6999 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn52 7000 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn53 7033 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn40 7561 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn41 7567 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Doxygen_file_preparation 3409 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn55 7035 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_module_initialization 7319 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn42 7569 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn56 7044 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn43 7577 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_features_default_args 3293 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn57 7051 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn44 7578 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn58 7053 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn45 7586 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn59 7054 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn46 7592 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_commandline 3789 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_nn3 3234 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_nn4 3235 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_nn5 3245 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_nn6 3246 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_nn7 3265 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn60 7062 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn61 7075 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn62 7085 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn63 7102 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn10 7416 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn11 7419 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn65 7012 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn12 7421 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn66 7014 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn13 7423 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23MzScheme_nn2 7593 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn67 7016 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn14 7435 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn68 7017 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn15 7436 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn16 7437 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn17 7430 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn18 7443 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_exception_handling 4839 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn19 7444 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn70 7026 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23D_command_line_invocation 4002 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_building_alternatives 1622 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn71 7028 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn20 7454 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn21 7467 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn22 7468 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn23 7469 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn24 7478 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn25 7486 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave 5485 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn26 7487 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_supported_status 8004 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn27 7496 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn28 7493 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn29 7503 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_partial_classes 3983 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_typesafe_enums 4560 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23D_din 11 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_proper_enums 4572 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping_constants 7201 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_multithread_libraries 4717 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_warnings 3130 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_running_swig_options 7180 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Mzscheme 7598 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Preprocessor_delimiters 2602 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_nmake 4526 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Arguments 2768 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_default_typemap 6904 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_further_info 8037 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping_cpp_exceptions 7277 0 R /#90#ee#ddo#bc#28#e6#17#28S#90#9a#11#fd#ab#ed#e8#80#25#eb 2526 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_Placement_of_typemaps 6892 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_range_based_for_loop 2425 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_director_finalizer 4238 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn2 5481 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn3 5482 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn4 5522 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn5 5524 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn6 5525 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn7 5527 0 R /__WKANCHOR_1w0 7953 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn8 5528 0 R /__WKANCHOR_1sq 7682 0 R /__WKANCHOR_1ta 7708 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn9 5529 0 R /__WKANCHOR_1w2 7962 0 R /__WKANCHOR_1ss 7683 0 R /__WKANCHOR_1tc 7710 0 R /__WKANCHOR_1w4 7969 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CONTENTS 14 0 R /__WKANCHOR_1su 7685 0 R /__WKANCHOR_1te 7711 0 R /__WKANCHOR_1w6 7977 0 R /__WKANCHOR_1sw 7686 0 R /__WKANCHOR_1tg 7727 0 R /__WKANCHOR_1w8 7979 0 R /__WKANCHOR_1sy 7687 0 R /__WKANCHOR_1ti 7728 0 R /__WKANCHOR_1tk 7729 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_running_swig_using_module 7163 0 R /__WKANCHOR_1tm 7732 0 R /__WKANCHOR_1to 7735 0 R /__WKANCHOR_1tq 7724 0 R /__WKANCHOR_1ua 7823 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping_functions 7175 0 R /__WKANCHOR_1ts 7726 0 R /__WKANCHOR_1uc 7824 0 R /__WKANCHOR_1tu 7742 0 R /__WKANCHOR_1ue 7825 0 R /__WKANCHOR_1tw 7744 0 R /__WKANCHOR_1ug 7845 0 R /__WKANCHOR_1ty 7745 0 R /__WKANCHOR_1ui 7846 0 R /__WKANCHOR_1uk 7855 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Android_example_simple 3726 0 R /__WKANCHOR_1um 7856 0 R /__WKANCHOR_1uo 7866 0 R /__WKANCHOR_1u0 7749 0 R /__WKANCHOR_1qq 7484 0 R /__WKANCHOR_1ra 7539 0 R /__WKANCHOR_1u2 7769 0 R /__WKANCHOR_1qs 7485 0 R /__WKANCHOR_1rc 7541 0 R /__WKANCHOR_1u4 7770 0 R /__WKANCHOR_1qu 7494 0 R /__WKANCHOR_1re 7550 0 R /__WKANCHOR_1u6 7773 0 R /__WKANCHOR_1qw 7495 0 R /__WKANCHOR_1rg 7551 0 R /__WKANCHOR_1u8 7776 0 R /__WKANCHOR_1qy 7506 0 R /__WKANCHOR_1ri 7559 0 R /__WKANCHOR_1rk 7560 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending 7743 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_method_access 4850 0 R /__WKANCHOR_1rm 7568 0 R /__WKANCHOR_1ro 7570 0 R /__WKANCHOR_1v0 7887 0 R /__WKANCHOR_1rq 7579 0 R /__WKANCHOR_1sa 7645 0 R /__WKANCHOR_1v2 7884 0 R /__WKANCHOR_1rs 7576 0 R /__WKANCHOR_1sc 7640 0 R /__WKANCHOR_1v4 7894 0 R /__WKANCHOR_1ru 7585 0 R /__WKANCHOR_1se 7643 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_uniform_initialization 2417 0 R /__WKANCHOR_1v6 7896 0 R /__WKANCHOR_1rw 7594 0 R /__WKANCHOR_1sg 7669 0 R /__WKANCHOR_1v8 7905 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus 1976 0 R /__WKANCHOR_1ry 7596 0 R /__WKANCHOR_1si 7672 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_default_args 1873 0 R /__WKANCHOR_1sk 7673 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_directors 3915 0 R /__WKANCHOR_1sm 7675 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_typemaps_stl 7308 0 R /__WKANCHOR_1so 7676 0 R /__WKANCHOR_1wq 8023 0 R /__WKANCHOR_1ws 8018 0 R /__WKANCHOR_1wu 8020 0 R /__WKANCHOR_1ww 8036 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_directors 4760 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Android_examples_intro 3733 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_overloaded_functions 4611 0 R /__WKANCHOR_1uq 7865 0 R /__WKANCHOR_1va 7906 0 R /__WKANCHOR_1us 7867 0 R /__WKANCHOR_1vc 7907 0 R /__WKANCHOR_1uu 7873 0 R /__WKANCHOR_1ve 7913 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_allowexcept 3244 0 R /__WKANCHOR_1uw 7874 0 R /__WKANCHOR_1vg 7920 0 R /__WKANCHOR_1uy 7875 0 R /__WKANCHOR_1vi 7921 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_ref_unref 2308 0 R /__WKANCHOR_1vk 7922 0 R /__WKANCHOR_1vm 7933 0 R /__WKANCHOR_1vo 7935 0 R /__WKANCHOR_1vq 7936 0 R /__WKANCHOR_1wa 7980 0 R /__WKANCHOR_1vs 7937 0 R /__WKANCHOR_1wc 7981 0 R /__WKANCHOR_1vu 7947 0 R /__WKANCHOR_1we 7992 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp 3784 0 R /__WKANCHOR_1vw 7944 0 R /__WKANCHOR_1wg 8000 0 R /__WKANCHOR_1vy 7954 0 R /__WKANCHOR_1wi 8003 0 R /__WKANCHOR_1wk 8005 0 R /__WKANCHOR_1wm 8007 0 R /__WKANCHOR_1wo 8008 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_in_typemap 6893 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_allprotected 4812 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_module_directive 22 0 R /__WKANCHOR_1p0 7320 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_prerequisites 8019 0 R /__WKANCHOR_1p2 7321 0 R /__WKANCHOR_1p4 7322 0 R /__WKANCHOR_1p6 7337 0 R /__WKANCHOR_1p8 7328 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_anonymous_enums 4559 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_adding_member_functions 1913 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_throws_typemap 3071 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn1_1 5878 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn1_3 5880 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_csharp 1550 0 R /F#ed#3atl#f3#1f#12#af#26#ac#be#01#c4#1au#99#99#d4#81 5062 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_typemaps 4889 0 R /__WKANCHOR_1s0 7595 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_using_own_jni_functions 5111 0 R /__WKANCHOR_1pa 7332 0 R /__WKANCHOR_1s2 7597 0 R /__WKANCHOR_1pc 7335 0 R /__WKANCHOR_1s4 7611 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_overview 5122 0 R /__WKANCHOR_1pe 7336 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_examples 1548 0 R /__WKANCHOR_1s6 7612 0 R /__WKANCHOR_1pg 7369 0 R /__WKANCHOR_1s8 7644 0 R /__WKANCHOR_1pi 7370 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_module_class_pragmas 4662 0 R /__WKANCHOR_1pk 7363 0 R /__WKANCHOR_1pm 7364 0 R /__WKANCHOR_1po 7404 0 R /__WKANCHOR_1t0 7684 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_structure_data_members 1905 0 R /__WKANCHOR_1pq 7405 0 R /__WKANCHOR_1qa 7431 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Doxygen_basic_example 3465 0 R /__WKANCHOR_1t2 7701 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_structures 4594 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_typemaps_c_to_java_types 4912 0 R /__WKANCHOR_1ps 7415 0 R /__WKANCHOR_1qc 7445 0 R /__WKANCHOR_1t4 7702 0 R /__WKANCHOR_1pu 7417 0 R /__WKANCHOR_1qe 7446 0 R /__WKANCHOR_1t6 7714 0 R /__WKANCHOR_1pw 7422 0 R /__WKANCHOR_1qg 7455 0 R /__WKANCHOR_1t8 7717 0 R /__WKANCHOR_1py 7424 0 R /__WKANCHOR_1qi 7470 0 R /__WKANCHOR_1qk 7471 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_running_swig 7160 0 R /__WKANCHOR_1qm 7466 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scripting_nn2 1639 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scripting_nn3 1640 0 R /__WKANCHOR_1qo 7477 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scripting_nn4 1641 0 R /__WKANCHOR_1q0 7413 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scripting_nn5 1642 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scripting_nn6 1660 0 R /__WKANCHOR_1q2 7414 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scripting_nn7 1661 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_doxygen 3600 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scripting_nn8 1662 0 R /__WKANCHOR_1q4 7432 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_debugging_options 8021 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scripting_nn9 1674 0 R /__WKANCHOR_1q6 7433 0 R /__WKANCHOR_1q8 7434 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_date_properties 3973 0 R /__WKANCHOR_1r0 7504 0 R /__WKANCHOR_1r2 7505 0 R /__WKANCHOR_1r4 7516 0 R /__WKANCHOR_1r6 7523 0 R /__WKANCHOR_1r8 7530 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_functional_interface 5095 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23D_ctype_imtype_dtype 4042 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_package_search_wrapper_split 6489 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_symbolic_symbols 3581 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_enumerations 4174 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_proper_enums_classes 4737 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_directorout_typemap 6948 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_Copying_a_typemap 6886 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_dynamic_linking_problems 4510 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_unbounded_c_arrays 4872 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml 7610 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scripting 1620 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_installation 1541 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_director_base_methods 4222 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23D_typemap_examples 4098 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_throws_typemap 6932 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_ret 3072 0 R /#b6#99#3f#23#2dG_#87#40#939#1b#9e#3e#f0#afb#92#96w 2280 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Modules 3604 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23D_dinput 23 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_multithreaded 6550 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_overloaded_methods 2150 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_builtin_types 6224 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nested_classes 2327 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn2_1 5879 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn2_2 5919 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn2_3 5920 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn2_4 5921 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn2_5 5923 0 R /__WKANCHOR_i0 3033 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn2_6 5933 0 R /__WKANCHOR_eq 2691 0 R /__WKANCHOR_fa 2750 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn2_7 5955 0 R /__WKANCHOR_i2 3034 0 R /__WKANCHOR_es 2702 0 R /__WKANCHOR_fc 2755 0 R /__WKANCHOR_i4 3058 0 R /__WKANCHOR_eu 2716 0 R /__WKANCHOR_fe 2758 0 R /__WKANCHOR_i6 3059 0 R /__WKANCHOR_ew 2713 0 R /__WKANCHOR_fg 2748 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Preface_unix_installation 1450 0 R /__WKANCHOR_i8 3048 0 R /#dc#aa#ddE#b9C#c8#60#ef#be#eb#e6#e7#f3#91#91#92#b8#10W 2337 0 R /__WKANCHOR_ey 2722 0 R /__WKANCHOR_fi 2749 0 R /__WKANCHOR_fk 2770 0 R /#f5#aaJA#1d#aa#7e#88g#ee#ea#98#b4#60#01#28d#98h5 2503 0 R /__WKANCHOR_fm 2771 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_ruby 1595 0 R /__WKANCHOR_fo 2772 0 R /__WKANCHOR_j0 3103 0 R /__WKANCHOR_fq 2790 0 R /__WKANCHOR_ga 2845 0 R /__WKANCHOR_j2 3113 0 R /__WKANCHOR_fs 2791 0 R /__WKANCHOR_gc 2895 0 R /__WKANCHOR_j4 3128 0 R /__WKANCHOR_fu 2799 0 R /__WKANCHOR_ge 2898 0 R /__WKANCHOR_j6 3129 0 R /__WKANCHOR_fw 2800 0 R /__WKANCHOR_gg 2907 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn2 1975 0 R /__WKANCHOR_j8 3144 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn3 2044 0 R /__WKANCHOR_fy 2806 0 R /__WKANCHOR_gi 2904 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn4 2045 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn5 2047 0 R /__WKANCHOR_gk 2915 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn6 2067 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn7 2068 0 R /__WKANCHOR_gm 2916 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn8 2069 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn9 2081 0 R /__WKANCHOR_go 2917 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_std_vector 2723 0 R /__WKANCHOR_k0 3236 0 R /__WKANCHOR_gq 2929 0 R /__WKANCHOR_ha 2977 0 R /__WKANCHOR_k2 3247 0 R /__WKANCHOR_gs 2930 0 R /__WKANCHOR_hc 2978 0 R /__WKANCHOR_k4 3248 0 R /__WKANCHOR_gu 2932 0 R /__WKANCHOR_he 2986 0 R /__WKANCHOR_k6 3249 0 R /__WKANCHOR_gw 2943 0 R /__WKANCHOR_hg 2996 0 R /__WKANCHOR_k8 3256 0 R /__WKANCHOR_gy 2940 0 R /__WKANCHOR_hi 2993 0 R /#06#dd#0f#40#fe5f#c7J#c0#bc#98#05#d1#a3#d7#1ez7#f3 2976 0 R /__WKANCHOR_hk 3003 0 R /__WKANCHOR_hm 3011 0 R /__WKANCHOR_ho 3018 0 R /__WKANCHOR_l0 3328 0 R /__WKANCHOR_hq 3020 0 R /__WKANCHOR_ia 3051 0 R /__WKANCHOR_l2 3331 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23D_dout 21 0 R /__WKANCHOR_hs 3021 0 R /__WKANCHOR_ic 3053 0 R /__WKANCHOR_l4 3333 0 R /__WKANCHOR_hu 3035 0 R /__WKANCHOR_ie 3056 0 R /__WKANCHOR_l6 3351 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_2_unicode 6541 0 R /__WKANCHOR_hw 3036 0 R /__WKANCHOR_ig 3074 0 R /__WKANCHOR_l8 3353 0 R /__WKANCHOR_hy 3039 0 R /__WKANCHOR_ii 3077 0 R /__WKANCHOR_ik 3067 0 R /__WKANCHOR_im 3069 0 R /__WKANCHOR_io 3070 0 R /__WKANCHOR_e0 2617 0 R /__WKANCHOR_aq 2420 0 R /__WKANCHOR_ba 2443 0 R /__WKANCHOR_e2 2618 0 R /__WKANCHOR_as 2421 0 R /__WKANCHOR_bc 2446 0 R /__WKANCHOR_e4 2619 0 R /__WKANCHOR_au 2422 0 R /__WKANCHOR_be 2456 0 R /__WKANCHOR_e6 2633 0 R /__WKANCHOR_aw 2423 0 R /__WKANCHOR_bg 2458 0 R /__WKANCHOR_e8 2635 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_director_caveats 3931 0 R /__WKANCHOR_ay 2424 0 R /__WKANCHOR_bi 2461 0 R /__WKANCHOR_bk 2455 0 R /__WKANCHOR_bm 2469 0 R /__WKANCHOR_bo 2470 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_extern_template 2406 0 R /__WKANCHOR_f0 2730 0 R /__WKANCHOR_bq 2471 0 R /__WKANCHOR_ca 2504 0 R /__WKANCHOR_f2 2732 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_examples 5194 0 R /__WKANCHOR_bs 2486 0 R /__WKANCHOR_cc 2505 0 R /__WKANCHOR_f4 2733 0 R /__WKANCHOR_bu 2488 0 R /__WKANCHOR_ce 2506 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn30 2207 0 R /__WKANCHOR_f6 2740 0 R /__WKANCHOR_bw 2490 0 R /__WKANCHOR_cg 2507 0 R /__WKANCHOR_f8 2756 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn33 2290 0 R /__WKANCHOR_by 2492 0 R /__WKANCHOR_ci 2508 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn35 2316 0 R /__WKANCHOR_ck 2509 0 R /__WKANCHOR_cm 2512 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn38 2050 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn39 2051 0 R /__WKANCHOR_co 2524 0 R /__WKANCHOR_g0 2809 0 R /__WKANCHOR_cq 2525 0 R /__WKANCHOR_da 2550 0 R /__WKANCHOR_g2 2810 0 R /__WKANCHOR_cs 2551 0 R /__WKANCHOR_dc 2552 0 R /__WKANCHOR_g4 2812 0 R /__WKANCHOR_cu 2553 0 R /__WKANCHOR_de 2554 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn40 2057 0 R /__WKANCHOR_g6 2814 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn41 2065 0 R /__WKANCHOR_cw 2557 0 R /__WKANCHOR_dg 2577 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn42 2350 0 R /__WKANCHOR_g8 2848 0 R /__WKANCHOR_cy 2535 0 R /__WKANCHOR_di 2578 0 R /__WKANCHOR_dk 2582 0 R /__WKANCHOR_dm 2574 0 R /__WKANCHOR_do 2575 0 R /__WKANCHOR_h0 2941 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_interfaces 4747 0 R /__WKANCHOR_dq 2605 0 R /__WKANCHOR_ea 2628 0 R /__WKANCHOR_h2 2952 0 R /__WKANCHOR_ds 2606 0 R /__WKANCHOR_ec 2629 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23troubleshooting_ifndef 3516 0 R /__WKANCHOR_h4 2953 0 R /__WKANCHOR_du 2607 0 R /__WKANCHOR_ee 2665 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn10 2078 0 R /__WKANCHOR_h6 2960 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn11 2089 0 R /__WKANCHOR_dw 2608 0 R /__WKANCHOR_eg 2672 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn12 2090 0 R /__WKANCHOR_h8 2968 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_suppression 3536 0 R /__WKANCHOR_dy 2620 0 R /__WKANCHOR_ei 2679 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_commandline 5288 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn15 2102 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Introduction_build_system 1524 0 R /__WKANCHOR_ek 2692 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23D_splitproxy 16 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn16 2103 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn17 2113 0 R /__WKANCHOR_em 2693 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn18 2114 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn19 2123 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping_enums 7213 0 R /__WKANCHOR_eo 2688 0 R /__WKANCHOR_a0 2325 0 R /__WKANCHOR_a2 2326 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_building_windows 4524 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Introduction_nn10 1515 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Introduction_nn11 1516 0 R /__WKANCHOR_a4 2335 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn2 1702 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Introduction_nn12 1546 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn20 2124 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn3 1747 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Introduction_nn13 1547 0 R /__WKANCHOR_a6 2338 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn21 2130 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn5 1762 0 R /__WKANCHOR_a8 2339 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn6 1763 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn24 2148 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn7 1756 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn25 2160 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn8 1758 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn9 1771 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn27 2189 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn28 2190 0 R /__WKANCHOR_b0 2431 0 R /__WKANCHOR_b2 2433 0 R /__WKANCHOR_b4 2434 0 R /__WKANCHOR_b6 2444 0 R /__WKANCHOR_b8 2447 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_Deleting_a_typemap 6885 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus17_u8_char_literals 2544 0 R /__WKANCHOR_c0 2481 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_smart_pointers_shared_ptr 4635 0 R /__WKANCHOR_c2 2482 0 R /__WKANCHOR_c4 2484 0 R /__WKANCHOR_c6 2510 0 R /__WKANCHOR_c8 2514 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_code_templates 5223 0 R /__WKANCHOR_d0 2555 0 R /__WKANCHOR_aa 2347 0 R /__WKANCHOR_d2 2534 0 R /__WKANCHOR_ac 2349 0 R /__WKANCHOR_d4 2536 0 R /__WKANCHOR_ae 2351 0 R /__WKANCHOR_d6 2538 0 R /__WKANCHOR_ag 2353 0 R /__WKANCHOR_d8 2540 0 R /__WKANCHOR_ai 2355 0 R /__WKANCHOR_ak 2407 0 R /__WKANCHOR_am 2409 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Android_example_class 3756 0 R /__WKANCHOR_ao 2410 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_performance 5104 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23D_exceptions 4108 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_experimental_status 8006 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_double_angle_brackets 2442 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_heap_allocations 4882 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_directors_faq 5085 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_implicit_namespace_packages 6481 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_directors_performance 4773 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_builtin_overloads 6247 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping_structs 7225 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus14_standard_library_changes 2537 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping_constants_and_enums 7203 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_perl 1592 0 R /#82P#17#b7#60#b6Z!#e9#7e#f6#07c#e5#01#20#12L#1d#d4 6492 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_simple_example 5192 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23D_operator_overloading 4106 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_directors_example 4775 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_odds_ends 5097 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_exception_typemap 4995 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_running_swig 4497 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_unrestricted_unions 2462 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_examples_cygwin 1615 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_emitter 5231 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_explicit_overrides_final 2432 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23D_directors 4105 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_smart_pointers_shared_ptr 6207 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_special_variables_and_macros 3037 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_nn10 2689 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_nn11 2690 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_nn12 2701 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Doxygen_javadoc_tags 3472 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_nn16 2753 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_nn17 2757 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings 3537 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_executable 1542 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_jsc_exceptions 5240 0 R /#1e#17#8eg#18#87#14#a2#83#f2#06#95#27#9a#f5#cd#d6R#af#8e 7224 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23D_typemaps 4048 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_class_extension 4819 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_thread_performance 6566 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_hash_tables 2515 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_writing_typemaps 5443 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn53 6357 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn54 6358 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_fragment_type_specialization 3147 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn55 6374 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn56 6375 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Sections_language_modules 1333 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn57 6376 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn58 6386 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn59 6387 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_tcl 1594 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn60 6393 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn61 6400 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn62 6410 0 R /__WKANCHOR_19q 5867 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn63 6411 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn64 6419 0 R /__WKANCHOR_19s 5870 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn65 6428 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn66 6430 0 R /__WKANCHOR_19u 5871 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn67 6443 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn68 6445 0 R /__WKANCHOR_19w 5862 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn69 6446 0 R /__WKANCHOR_19y 5863 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn70 6455 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn71 6457 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn72 6458 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn74 6517 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn75 6518 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn76 6531 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn77 6532 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_overview 4127 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_adding_equals_method 5047 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_template_directive 2208 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_optimal 3104 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_enum_classes 4727 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_ret_typemap 6946 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_custom_module_import 6505 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Doxygen_unsupported_tags 3483 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_directorin_typemap 6949 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_template_classes 2216 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping_cpp_stl 7275 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_template_scoping 2240 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn2 7771 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn3 7772 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn4 7774 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_shared_ptr_inheritance 2741 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn5 7775 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn6 7826 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn7 7827 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn8 7828 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn9 7847 0 R /__WKANCHOR_170 5606 0 R /__WKANCHOR_13q 5335 0 R /__WKANCHOR_14a 5392 0 R /__WKANCHOR_172 5607 0 R /__WKANCHOR_13s 5343 0 R /__WKANCHOR_14c 5393 0 R /__WKANCHOR_174 5608 0 R /__WKANCHOR_13u 5344 0 R /__WKANCHOR_14e 5394 0 R /__WKANCHOR_176 5672 0 R /__WKANCHOR_13w 5352 0 R /__WKANCHOR_14g 5411 0 R /__WKANCHOR_178 5673 0 R /__WKANCHOR_13y 5361 0 R /__WKANCHOR_14i 5412 0 R /__WKANCHOR_14k 5413 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_null_pointer_constant 2436 0 R /__WKANCHOR_14m 5421 0 R /__WKANCHOR_14o 5422 0 R /__WKANCHOR_180 5726 0 R /__WKANCHOR_14q 5423 0 R /__WKANCHOR_15a 5457 0 R /__WKANCHOR_182 5736 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_basic_tour 4171 0 R /__WKANCHOR_14s 5433 0 R /__WKANCHOR_15c 5458 0 R /__WKANCHOR_184 5737 0 R /__WKANCHOR_14u 5434 0 R /__WKANCHOR_15e 5472 0 R /__WKANCHOR_186 5738 0 R /__WKANCHOR_14w 5447 0 R /__WKANCHOR_15g 5483 0 R /__WKANCHOR_188 5739 0 R /__WKANCHOR_14y 5448 0 R /__WKANCHOR_15i 5484 0 R /__WKANCHOR_15k 5486 0 R /__WKANCHOR_15m 5480 0 R /__WKANCHOR_15o 5519 0 R /__WKANCHOR_150 5442 0 R /__WKANCHOR_11q 5106 0 R /__WKANCHOR_12a 5172 0 R /__WKANCHOR_152 5444 0 R /__WKANCHOR_11s 5108 0 R /__WKANCHOR_12c 5174 0 R /__WKANCHOR_154 5459 0 R /__WKANCHOR_11u 5110 0 R /__WKANCHOR_12e 5176 0 R /__WKANCHOR_156 5460 0 R /__WKANCHOR_11w 5127 0 R /__WKANCHOR_12g 5178 0 R /__WKANCHOR_158 5462 0 R /__WKANCHOR_11y 5129 0 R /__WKANCHOR_12i 5191 0 R /__WKANCHOR_12k 5193 0 R /__WKANCHOR_12m 5195 0 R /__WKANCHOR_12o 5204 0 R /__WKANCHOR_160 5538 0 R /__WKANCHOR_12q 5214 0 R /__WKANCHOR_13a 5290 0 R /__WKANCHOR_162 5539 0 R /__WKANCHOR_12s 5215 0 R /__WKANCHOR_13c 5311 0 R /__WKANCHOR_164 5540 0 R /__WKANCHOR_12u 5224 0 R /__WKANCHOR_13e 5321 0 R /__WKANCHOR_166 5548 0 R /__WKANCHOR_12w 5230 0 R /__WKANCHOR_13g 5322 0 R /__WKANCHOR_168 5559 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Preface_license 1420 0 R /__WKANCHOR_12y 5238 0 R /__WKANCHOR_13i 5324 0 R /__WKANCHOR_13k 5325 0 R /__WKANCHOR_13m 5326 0 R /__WKANCHOR_13o 5334 0 R /__WKANCHOR_17q 5701 0 R /__WKANCHOR_18a 5746 0 R /__WKANCHOR_17s 5704 0 R /__WKANCHOR_18c 5754 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_imclass 4651 0 R /__WKANCHOR_17u 5707 0 R /__WKANCHOR_18e 5762 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_directors 5851 0 R /__WKANCHOR_17w 5719 0 R /__WKANCHOR_18g 5763 0 R /__WKANCHOR_17y 5720 0 R /__WKANCHOR_18i 5772 0 R /__WKANCHOR_18k 5783 0 R /__WKANCHOR_18m 5784 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn10 6121 0 R /__WKANCHOR_18o 5785 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn11 6129 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn12 6130 0 R /__WKANCHOR_18q 5779 0 R /__WKANCHOR_19a 5830 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn13 6144 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn14 6146 0 R /__WKANCHOR_18s 5792 0 R /__WKANCHOR_19c 5832 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn15 6137 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn16 6139 0 R /__WKANCHOR_18u 5794 0 R /__WKANCHOR_19e 5840 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn17 6153 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn18 6155 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_rename_ignore 1849 0 R /__WKANCHOR_18w 5802 0 R /__WKANCHOR_19g 5843 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn19 6164 0 R /__WKANCHOR_18y 5804 0 R /__WKANCHOR_19i 5844 0 R /__WKANCHOR_19k 5854 0 R /__WKANCHOR_19m 5855 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn20 6172 0 R /__WKANCHOR_19o 5856 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn21 6179 0 R /__WKANCHOR_190 5817 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn22 6181 0 R /__WKANCHOR_15q 5518 0 R /__WKANCHOR_16a 5554 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn23 6187 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23D_dpcall 24 0 R /__WKANCHOR_192 5812 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn24 6195 0 R /__WKANCHOR_15s 5520 0 R /__WKANCHOR_16c 5555 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn25 6196 0 R /__WKANCHOR_194 5813 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn26 6205 0 R /__WKANCHOR_15u 5521 0 R /__WKANCHOR_16e 5565 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn27 6208 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_helper_functions 4822 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn10 2931 0 R /__WKANCHOR_196 5814 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn28 6220 0 R /__WKANCHOR_15w 5523 0 R /__WKANCHOR_16g 5566 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn29 6221 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn12 2933 0 R /__WKANCHOR_198 5824 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn13 2942 0 R /__WKANCHOR_15y 5526 0 R /__WKANCHOR_16i 5576 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn14 2944 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn15 2945 0 R /__WKANCHOR_16k 5577 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn17 2951 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CCache 3658 0 R /__WKANCHOR_16m 5579 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn30 6255 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn19 2967 0 R /__WKANCHOR_16o 5580 0 R /__WKANCHOR_yq 4755 0 R /__WKANCHOR_za 4818 0 R /__WKANCHOR_16q 5597 0 R /__WKANCHOR_17a 5674 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn33 6265 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_globalin_typemap 6951 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn34 6273 0 R /__WKANCHOR_ys 4757 0 R /__WKANCHOR_zc 4820 0 R /__WKANCHOR_16s 5588 0 R /__WKANCHOR_17c 5667 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn35 6274 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn36 6276 0 R /__WKANCHOR_yu 4759 0 R /__WKANCHOR_ze 4821 0 R /__WKANCHOR_16u 5591 0 R /__WKANCHOR_17e 5681 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn37 6282 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn38 6283 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn21 2994 0 R /__WKANCHOR_yw 4769 0 R /__WKANCHOR_zg 4830 0 R /__WKANCHOR_16w 5595 0 R /__WKANCHOR_17g 5690 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn39 6284 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn22 2995 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn23 3004 0 R /__WKANCHOR_yy 4771 0 R /__WKANCHOR_zi 4838 0 R /__WKANCHOR_16y 5596 0 R /__WKANCHOR_17i 5691 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn25 3038 0 R /__WKANCHOR_zk 4851 0 R /__WKANCHOR_17k 5692 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_void_pointers 3858 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn26 3040 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn27 3031 0 R /__WKANCHOR_zm 4852 0 R /__WKANCHOR_17m 5708 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn28 3049 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn40 6289 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn29 3050 0 R /__WKANCHOR_zo 4853 0 R /__WKANCHOR_17o 5709 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn41 6290 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn42 6297 0 R /__WKANCHOR_zq 4862 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn43 6310 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23D_pragmas 4079 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn44 6311 0 R /__WKANCHOR_zs 4863 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn45 6330 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn46 6331 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_multi_argument_typemaps 3114 0 R /__WKANCHOR_zu 4873 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn47 6340 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn30 3052 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn48 6346 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn31 3054 0 R /__WKANCHOR_zw 4879 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn49 6347 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn32 3055 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn33 3057 0 R /__WKANCHOR_zy 4880 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn34 3073 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_new_char_literals 2459 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn35 3075 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn36 3076 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn37 3078 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn39 3086 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Doxygen_debugging_commands 3514 0 R /__WKANCHOR_100 4890 0 R /__WKANCHOR_102 4892 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_binary_char 4881 0 R /__WKANCHOR_104 4901 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn40 3089 0 R /__WKANCHOR_106 4902 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn41 3097 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_enumerations 4562 0 R /__WKANCHOR_108 4903 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn43 3106 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn45 3158 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn47 3197 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn48 3198 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_debugging_search 2985 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn51 3211 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn52 3212 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23D_code_injection_typemaps 4045 0 R /__WKANCHOR_y0 4665 0 R /__WKANCHOR_uq 4312 0 R /__WKANCHOR_va 4328 0 R /__WKANCHOR_y2 4679 0 R /__WKANCHOR_us 4313 0 R /__WKANCHOR_vc 4332 0 R /__WKANCHOR_y4 4676 0 R /__WKANCHOR_uu 4304 0 R /__WKANCHOR_ve 4345 0 R /__WKANCHOR_y6 4687 0 R /__WKANCHOR_uw 4305 0 R /__WKANCHOR_vg 4348 0 R /__WKANCHOR_y8 4698 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_automatic_specialization 3145 0 R /__WKANCHOR_uy 4306 0 R /__WKANCHOR_vi 4349 0 R /__WKANCHOR_vk 4350 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping 7178 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps 2815 0 R /__WKANCHOR_vm 4357 0 R /__WKANCHOR_vo 4359 0 R /__WKANCHOR_z0 4772 0 R /__WKANCHOR_130 5237 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_core_language_changes 2354 0 R /__WKANCHOR_vq 4367 0 R /__WKANCHOR_wa 4527 0 R /__WKANCHOR_10a 4913 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23D_class_code_typemaps 17 0 R /__WKANCHOR_z2 4774 0 R /__WKANCHOR_132 5247 0 R /__WKANCHOR_vs 4387 0 R /__WKANCHOR_wc 4528 0 R /__WKANCHOR_10c 4927 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Preprocessor 2579 0 R /__WKANCHOR_z4 4776 0 R /__WKANCHOR_134 5294 0 R /__WKANCHOR_vu 4489 0 R /__WKANCHOR_we 4523 0 R /__WKANCHOR_10e 4928 0 R /__WKANCHOR_z6 4782 0 R /__WKANCHOR_136 5295 0 R /__WKANCHOR_vw 4490 0 R /__WKANCHOR_wg 4538 0 R /__WKANCHOR_10g 4957 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_cygwin_mingw 1593 0 R /__WKANCHOR_z8 4811 0 R /__WKANCHOR_138 5289 0 R /__WKANCHOR_vy 4493 0 R /__WKANCHOR_wi 4539 0 R /__WKANCHOR_10i 4959 0 R /__WKANCHOR_wk 4543 0 R /__WKANCHOR_10k 4974 0 R /__WKANCHOR_wm 4544 0 R /__WKANCHOR_10m 4984 0 R /__WKANCHOR_wo 4551 0 R /__WKANCHOR_10o 4985 0 R /__WKANCHOR_140 5360 0 R /__WKANCHOR_wq 4561 0 R /__WKANCHOR_xa 4613 0 R /__WKANCHOR_10q 4996 0 R /__WKANCHOR_11a 5063 0 R /__WKANCHOR_142 5370 0 R /__WKANCHOR_ws 4563 0 R /__WKANCHOR_xc 4614 0 R /__WKANCHOR_10s 5005 0 R /__WKANCHOR_11c 5073 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_nn10 3577 0 R /__WKANCHOR_144 5371 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_nn11 3592 0 R /__WKANCHOR_wu 4564 0 R /__WKANCHOR_xe 4616 0 R /__WKANCHOR_10u 5011 0 R /__WKANCHOR_11e 5086 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_nn12 3593 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows 1540 0 R /__WKANCHOR_146 5385 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_nn13 3594 0 R /__WKANCHOR_ww 4571 0 R /__WKANCHOR_xg 4622 0 R /__WKANCHOR_10w 5021 0 R /__WKANCHOR_11g 5098 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_nn14 3606 0 R /__WKANCHOR_148 5382 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_nn15 3608 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_custom_application_exception 3906 0 R /__WKANCHOR_wy 4573 0 R /__WKANCHOR_xi 4623 0 R /__WKANCHOR_10y 5027 0 R /__WKANCHOR_11i 5093 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_nn16 3609 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_nn17 3610 0 R /__WKANCHOR_xk 4636 0 R /__WKANCHOR_11k 5094 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_class_example 5205 0 R /__WKANCHOR_xm 4637 0 R /__WKANCHOR_11m 5107 0 R /__WKANCHOR_xo 4638 0 R /__WKANCHOR_11o 5109 0 R /__WKANCHOR_110 5035 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Doxygen_tests 3533 0 R /__WKANCHOR_xq 4640 0 R /__WKANCHOR_ya 4707 0 R /__WKANCHOR_112 5048 0 R /__WKANCHOR_xs 4652 0 R /__WKANCHOR_yc 4718 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_emitter_states 5239 0 R /__WKANCHOR_114 5049 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_memberin_typemap 6922 0 R /__WKANCHOR_xu 4653 0 R /__WKANCHOR_ye 4719 0 R /__WKANCHOR_116 5050 0 R /__WKANCHOR_xw 4661 0 R /__WKANCHOR_yg 4726 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_jvm64 4906 0 R /__WKANCHOR_118 5065 0 R /__WKANCHOR_xy 4663 0 R /__WKANCHOR_yi 4728 0 R /__WKANCHOR_yk 4738 0 R /__WKANCHOR_ym 4739 0 R /__WKANCHOR_yo 4748 0 R /__WKANCHOR_u0 4223 0 R /__WKANCHOR_120 5123 0 R /__WKANCHOR_qq 3898 0 R /__WKANCHOR_ra 3952 0 R /__WKANCHOR_u2 4224 0 R /__WKANCHOR_122 5126 0 R /__WKANCHOR_qs 3899 0 R /__WKANCHOR_rc 3959 0 R /__WKANCHOR_u4 4225 0 R /__WKANCHOR_124 5161 0 R /__WKANCHOR_qu 3907 0 R /__WKANCHOR_re 3974 0 R /__WKANCHOR_u6 4239 0 R /__WKANCHOR_126 5163 0 R /__WKANCHOR_qw 3916 0 R /__WKANCHOR_rg 3984 0 R /__WKANCHOR_u8 4236 0 R /__WKANCHOR_128 5164 0 R /__WKANCHOR_qy 3914 0 R /__WKANCHOR_ri 3982 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_templates 4639 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_modulepackage 6456 0 R /__WKANCHOR_rk 3992 0 R /__WKANCHOR_rm 3993 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_aspects 2918 0 R /__WKANCHOR_ro 4003 0 R /__WKANCHOR_v0 4321 0 R /__WKANCHOR_1g0 6479 0 R /__WKANCHOR_rq 4004 0 R /__WKANCHOR_sa 4063 0 R /__WKANCHOR_1cq 6209 0 R /__WKANCHOR_1da 6254 0 R /__WKANCHOR_v2 4322 0 R /__WKANCHOR_1g2 6491 0 R /__WKANCHOR_rs 4005 0 R /__WKANCHOR_sc 4080 0 R /__WKANCHOR_1cs 6210 0 R /__WKANCHOR_1dc 6263 0 R /__WKANCHOR_v4 4325 0 R /__WKANCHOR_1g4 6493 0 R /__WKANCHOR_ru 4008 0 R /__WKANCHOR_se 4081 0 R /__WKANCHOR_1cu 6211 0 R /__WKANCHOR_1de 6264 0 R /__WKANCHOR_v6 4329 0 R /__WKANCHOR_1g6 6494 0 R /__WKANCHOR_rw 4052 0 R /__WKANCHOR_sg 4093 0 R /__WKANCHOR_1cw 6212 0 R /__WKANCHOR_1dg 6272 0 R /__WKANCHOR_v8 4333 0 R /__WKANCHOR_1g8 6495 0 R /__WKANCHOR_ry 4040 0 R /__WKANCHOR_si 4094 0 R /__WKANCHOR_1cy 6226 0 R /__WKANCHOR_1di 6275 0 R /__WKANCHOR_sk 4095 0 R /__WKANCHOR_1dk 6271 0 R /__WKANCHOR_sm 4096 0 R /__WKANCHOR_1dm 6285 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_shared_ptr_basics 2729 0 R /__WKANCHOR_so 4099 0 R /__WKANCHOR_1do 6286 0 R /__WKANCHOR_w0 4495 0 R /__WKANCHOR_1h0 6557 0 R /__WKANCHOR_sq 4100 0 R /__WKANCHOR_ta 4178 0 R /__WKANCHOR_1dq 6287 0 R /__WKANCHOR_1ea 6339 0 R /__WKANCHOR_w2 4496 0 R /__WKANCHOR_1h2 6558 0 R /__WKANCHOR_ss 4101 0 R /__WKANCHOR_tc 4181 0 R /__WKANCHOR_1ds 6288 0 R /__WKANCHOR_1ec 6348 0 R /__WKANCHOR_w4 4511 0 R /__WKANCHOR_1h4 6584 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_arginit_typemap 6907 0 R /__WKANCHOR_su 4102 0 R /__WKANCHOR_te 4184 0 R /__WKANCHOR_1du 6291 0 R /__WKANCHOR_1ee 6349 0 R /__WKANCHOR_w6 4512 0 R /__WKANCHOR_1h6 6586 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_osx 5177 0 R /__WKANCHOR_sw 4104 0 R /__WKANCHOR_tg 4185 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nspace 2272 0 R /__WKANCHOR_1dw 6298 0 R /__WKANCHOR_1eg 6359 0 R /__WKANCHOR_w8 4529 0 R /__WKANCHOR_1h8 6589 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_matching_template_comparison 2979 0 R /__WKANCHOR_sy 4129 0 R /__WKANCHOR_ti 4186 0 R /__WKANCHOR_1dy 6312 0 R /__WKANCHOR_1ei 6360 0 R /__WKANCHOR_tk 4172 0 R /#ba#b15#c7#7c#f6#ad#e8#a4#03#8fp#a7#ea#b2#b0#3b#0f#99#87 3870 0 R /__WKANCHOR_1ek 6362 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_exception_specifications 2281 0 R /__WKANCHOR_tm 4194 0 R /__WKANCHOR_1em 6371 0 R /__WKANCHOR_to 4203 0 R /__WKANCHOR_1eo 6373 0 R /__WKANCHOR_x0 4574 0 R /__WKANCHOR_1e0 6309 0 R /__WKANCHOR_tq 4204 0 R /__WKANCHOR_ua 4248 0 R /__WKANCHOR_1aq 5950 0 R /__WKANCHOR_1ba 5976 0 R /__WKANCHOR_x2 4592 0 R /__WKANCHOR_1e2 6318 0 R /__WKANCHOR_ts 4207 0 R /__WKANCHOR_uc 4258 0 R /__WKANCHOR_1as 5951 0 R /__WKANCHOR_1bc 5978 0 R /__WKANCHOR_x4 4593 0 R /__WKANCHOR_1e4 6319 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Sections_Sections 1330 0 R /__WKANCHOR_tu 4208 0 R /__WKANCHOR_ue 4259 0 R /__WKANCHOR_1au 5952 0 R /__WKANCHOR_1be 6096 0 R /__WKANCHOR_x6 4601 0 R /__WKANCHOR_1e6 6328 0 R /__WKANCHOR_tw 4210 0 R /__WKANCHOR_ug 4274 0 R /__WKANCHOR_1aw 5962 0 R /__WKANCHOR_1bg 6097 0 R /__WKANCHOR_x8 4615 0 R /__WKANCHOR_1e8 6329 0 R /__WKANCHOR_ty 4211 0 R /__WKANCHOR_ui 4275 0 R /__WKANCHOR_1ay 5963 0 R /__WKANCHOR_1bi 6098 0 R /__WKANCHOR_uk 4266 0 R /__WKANCHOR_1bk 6099 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11 2352 0 R /__WKANCHOR_um 4268 0 R /__WKANCHOR_1bm 6108 0 R /__WKANCHOR_uo 4269 0 R /__WKANCHOR_1bo 6109 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus14 2548 0 R /__WKANCHOR_q0 3786 0 R /__WKANCHOR_1f0 6408 0 R /__WKANCHOR_mq 3515 0 R /__WKANCHOR_na 3563 0 R /__WKANCHOR_1bq 6118 0 R /__WKANCHOR_1ca 6156 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Introduction 1447 0 R /__WKANCHOR_q2 3787 0 R /__WKANCHOR_1f2 6409 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus17 2549 0 R /__WKANCHOR_ms 3517 0 R /__WKANCHOR_nc 3564 0 R /__WKANCHOR_1bs 6120 0 R /__WKANCHOR_1cc 6165 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_void_pointers 5051 0 R /__WKANCHOR_q4 3788 0 R /__WKANCHOR_1f4 6417 0 R /__WKANCHOR_mu 3518 0 R /__WKANCHOR_ne 3578 0 R /__WKANCHOR_1bu 6127 0 R /__WKANCHOR_1ce 6171 0 R /__WKANCHOR_q6 3790 0 R /__WKANCHOR_1f6 6418 0 R /__WKANCHOR_mw 3520 0 R /__WKANCHOR_ng 3579 0 R /__WKANCHOR_1bw 6128 0 R /__WKANCHOR_1cg 6178 0 R /__WKANCHOR_q8 3793 0 R /__WKANCHOR_1f8 6429 0 R /__WKANCHOR_my 3522 0 R /__WKANCHOR_ni 3580 0 R /__WKANCHOR_1by 6142 0 R /__WKANCHOR_1ci 6180 0 R /__WKANCHOR_nk 3582 0 R /__WKANCHOR_1ck 6188 0 R /__WKANCHOR_nm 3571 0 R /__WKANCHOR_1cm 6197 0 R /__WKANCHOR_no 3572 0 R /__WKANCHOR_1co 6194 0 R /__WKANCHOR_r0 3924 0 R /__WKANCHOR_1k0 6894 0 R /__WKANCHOR_nq 3589 0 R /__WKANCHOR_oa 3618 0 R /__WKANCHOR_1gq 6548 0 R /__WKANCHOR_1ha 6580 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_directors_overhead 4770 0 R /__WKANCHOR_r2 3930 0 R /__WKANCHOR_1k2 6895 0 R /__WKANCHOR_ns 3590 0 R /__WKANCHOR_oc 3637 0 R /__WKANCHOR_1gs 6549 0 R /__WKANCHOR_1hc 6582 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_shared_ptr_templates 2759 0 R /__WKANCHOR_r4 3940 0 R /__WKANCHOR_1k4 6908 0 R /__WKANCHOR_nu 3591 0 R /__WKANCHOR_oe 3639 0 R /__WKANCHOR_1gu 6559 0 R /__WKANCHOR_1he 6637 0 R /__WKANCHOR_r6 3941 0 R /__WKANCHOR_1k6 6909 0 R /__WKANCHOR_nw 3605 0 R /__WKANCHOR_og 3640 0 R /__WKANCHOR_1gw 6562 0 R /__WKANCHOR_1hg 6640 0 R /__WKANCHOR_r8 3943 0 R /__WKANCHOR_1k8 6910 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_smart_pointers 2294 0 R /__WKANCHOR_ny 3607 0 R /__WKANCHOR_oi 3641 0 R /__WKANCHOR_1gy 6565 0 R /__WKANCHOR_1hi 6643 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_source_code 5213 0 R /__WKANCHOR_ok 3642 0 R /__WKANCHOR_1hk 6644 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_template_functions 2214 0 R /__WKANCHOR_om 3651 0 R /__WKANCHOR_1hm 6715 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_initializer_lists 2408 0 R /__WKANCHOR_oo 3654 0 R /__WKANCHOR_1ho 6708 0 R /__WKANCHOR_s0 4043 0 R /__WKANCHOR_1l0 6940 0 R /__WKANCHOR_oq 3655 0 R /__WKANCHOR_pa 3703 0 R /__WKANCHOR_1hq 6709 0 R /__WKANCHOR_1ia 6746 0 R /__WKANCHOR_s2 4046 0 R /__WKANCHOR_1l2 6941 0 R /__WKANCHOR_os 3656 0 R /__WKANCHOR_pc 3704 0 R /__WKANCHOR_1hs 6710 0 R /__WKANCHOR_1ic 6756 0 R /__WKANCHOR_s4 4047 0 R /__WKANCHOR_1l4 6961 0 R /__WKANCHOR_ou 3657 0 R /__WKANCHOR_pe 3705 0 R /__WKANCHOR_1hu 6723 0 R /__WKANCHOR_1ie 6764 0 R /__WKANCHOR_s6 4049 0 R /__WKANCHOR_1l6 6964 0 R /__WKANCHOR_ow 3659 0 R /__WKANCHOR_pg 3706 0 R /__WKANCHOR_1hw 6726 0 R /__WKANCHOR_1ig 6773 0 R /__WKANCHOR_s8 4050 0 R /__WKANCHOR_1l8 6967 0 R /__WKANCHOR_oy 3660 0 R /__WKANCHOR_pi 3707 0 R /__WKANCHOR_1hy 6729 0 R /__WKANCHOR_1ii 6774 0 R /__WKANCHOR_pk 3709 0 R /__WKANCHOR_1ik 6784 0 R /__WKANCHOR_pm 3711 0 R /__WKANCHOR_1im 6785 0 R /__WKANCHOR_po 3727 0 R /__WKANCHOR_1io 6794 0 R /__WKANCHOR_t0 4122 0 R /__WKANCHOR_1i0 6722 0 R /__WKANCHOR_pq 3729 0 R /__WKANCHOR_qa 3833 0 R /__WKANCHOR_1eq 6372 0 R /__WKANCHOR_1fa 6427 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua 5246 0 R /__WKANCHOR_t2 4125 0 R /__WKANCHOR_1i2 6735 0 R /__WKANCHOR_ps 3730 0 R /__WKANCHOR_qc 3855 0 R /__WKANCHOR_1es 6384 0 R /__WKANCHOR_1fc 6437 0 R /__WKANCHOR_t4 4126 0 R /__WKANCHOR_1i4 6736 0 R /__WKANCHOR_pu 3732 0 R /__WKANCHOR_qe 3856 0 R /__WKANCHOR_1eu 6385 0 R /__WKANCHOR_1fe 6438 0 R /__WKANCHOR_t6 4179 0 R /__WKANCHOR_1i6 6737 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_typemaps 7281 0 R /__WKANCHOR_pw 3757 0 R /__WKANCHOR_qg 3857 0 R /__WKANCHOR_1ew 6394 0 R /__WKANCHOR_1fg 6439 0 R /__WKANCHOR_t8 4182 0 R /__WKANCHOR_1i8 6747 0 R /__WKANCHOR_py 3791 0 R /__WKANCHOR_qi 3871 0 R /__WKANCHOR_1ey 6401 0 R /__WKANCHOR_1fi 6440 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization 3207 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn10 5541 0 R /__WKANCHOR_qk 3872 0 R /__WKANCHOR_1fk 6441 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn11 5536 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn12 5537 0 R /__WKANCHOR_qm 3881 0 R /__WKANCHOR_1fm 6459 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn13 5547 0 R /__WKANCHOR_qo 3889 0 R /__WKANCHOR_1fo 6460 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn15 5556 0 R /__WKANCHOR_m0 3457 0 R /__WKANCHOR_1j0 6812 0 R /__WKANCHOR_iq 3068 0 R /__WKANCHOR_ja 3146 0 R /__WKANCHOR_1fq 6453 0 R /__WKANCHOR_1ga 6504 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn17 5557 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_template_class_inheritance 2219 0 R /__WKANCHOR_m2 3458 0 R /__WKANCHOR_1j2 6801 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn18 5558 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_directors_typemaps 4975 0 R /__WKANCHOR_is 3087 0 R /__WKANCHOR_jc 3155 0 R /__WKANCHOR_1fs 6454 0 R /__WKANCHOR_1gc 6512 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn19 5567 0 R /__WKANCHOR_m4 3459 0 R /__WKANCHOR_1j4 6820 0 R /__WKANCHOR_iu 3088 0 R /__WKANCHOR_je 3156 0 R /__WKANCHOR_1fu 6469 0 R /__WKANCHOR_1ge 6514 0 R /__WKANCHOR_m6 3460 0 R /__WKANCHOR_1j6 6821 0 R /__WKANCHOR_iw 3096 0 R /__WKANCHOR_jg 3164 0 R /__WKANCHOR_1fw 6471 0 R /__WKANCHOR_1gg 6515 0 R /__WKANCHOR_m8 3463 0 R /__WKANCHOR_1j8 6835 0 R /__WKANCHOR_iy 3105 0 R /__WKANCHOR_ji 3173 0 R /__WKANCHOR_1fy 6480 0 R /__WKANCHOR_1gi 6516 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn20 5568 0 R /__WKANCHOR_jk 3186 0 R /__WKANCHOR_1gk 6530 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn21 5581 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn22 5575 0 R /__WKANCHOR_jm 3196 0 R /__WKANCHOR_1gm 6533 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn23 5589 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn24 5590 0 R /__WKANCHOR_jo 3199 0 R /__WKANCHOR_1go 6540 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn25 5592 0 R /__WKANCHOR_n0 3528 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn26 5594 0 R /__WKANCHOR_jq 3206 0 R /__WKANCHOR_ka 3263 0 R /__WKANCHOR_n2 3530 0 R /__WKANCHOR_js 3208 0 R /__WKANCHOR_kc 3264 0 R /__WKANCHOR_n4 3532 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn2 7365 0 R /__WKANCHOR_ju 3209 0 R /__WKANCHOR_ke 3272 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn3 7366 0 R /__WKANCHOR_n6 3534 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn4 7367 0 R /__WKANCHOR_jw 3210 0 R /__WKANCHOR_kg 3281 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn5 7368 0 R /__WKANCHOR_n8 3535 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn6 7406 0 R /__WKANCHOR_jy 3237 0 R /__WKANCHOR_ki 3282 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn7 7407 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Library 2630 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn8 7418 0 R /__WKANCHOR_kk 3294 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn9 7420 0 R /__WKANCHOR_km 3296 0 R /__WKANCHOR_ko 3310 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn10 7844 0 R /__WKANCHOR_o0 3611 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn11 7853 0 R /__WKANCHOR_kq 3303 0 R /__WKANCHOR_la 3359 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn12 7854 0 R /__WKANCHOR_o2 3601 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn13 7862 0 R /__WKANCHOR_ks 3304 0 R /__WKANCHOR_lc 3368 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn14 7863 0 R /__WKANCHOR_o4 3602 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn15 7864 0 R /__WKANCHOR_ku 3305 0 R /__WKANCHOR_le 3382 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn16 7876 0 R /__WKANCHOR_o6 3603 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn17 7877 0 R /__WKANCHOR_kw 3321 0 R /__WKANCHOR_lg 3390 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn18 7878 0 R /__WKANCHOR_o8 3620 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn19 7886 0 R /__WKANCHOR_ky 3329 0 R /__WKANCHOR_li 3391 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Arguments_nn10 2807 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Arguments_nn11 2808 0 R /__WKANCHOR_lk 3392 0 R /__WKANCHOR_lm 3410 0 R /__WKANCHOR_lo 3412 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn20 7885 0 R /__WKANCHOR_p0 3689 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn21 7893 0 R /__WKANCHOR_lq 3449 0 R /__WKANCHOR_ma 3473 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn22 7895 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_varin_typemap 6925 0 R /__WKANCHOR_p2 3686 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn23 7902 0 R /__WKANCHOR_ls 3442 0 R /__WKANCHOR_mc 3482 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn24 7903 0 R /__WKANCHOR_p4 3708 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn30 7730 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn25 7904 0 R /__WKANCHOR_lu 3443 0 R /__WKANCHOR_me 3484 0 R /E#0a#ca#b5#19#21#f4#5d#2bo#21#2co#cd#b7#f8#e4#21Ec 3897 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn31 7746 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn26 7914 0 R /__WKANCHOR_p6 3710 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn32 7747 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn27 7923 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_starting_out 7934 0 R /__WKANCHOR_lw 3445 0 R /__WKANCHOR_mg 3485 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn33 7748 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn28 7924 0 R /__WKANCHOR_p8 3712 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn29 7925 0 R /__WKANCHOR_ly 3446 0 R /__WKANCHOR_mi 3487 0 R /__WKANCHOR_mk 3502 0 R /__WKANCHOR_mm 3503 0 R /__WKANCHOR_mo 3521 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn30 7938 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn2 5291 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn31 7931 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn3 5292 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn32 7932 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn4 5293 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn5 5312 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_ownership 3266 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn34 7945 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn6 5327 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn35 7946 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn7 5328 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn36 7955 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn8 5319 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn37 7956 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn9 5320 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn38 7963 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_typesafe_enums_classes 4729 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_shared_ptr_overloading 2754 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_struct_pointer_pointer 5046 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn40 7982 0 R /__WKANCHOR_1c0 6141 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn41 7983 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn42 7976 0 R /__WKANCHOR_1c2 6143 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn43 8001 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus17_core_language_changes 2543 0 R /__WKANCHOR_1c4 6145 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn10 7674 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn11 7688 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn46 8022 0 R /__WKANCHOR_1c6 6138 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn12 7689 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn13 7690 0 R /__WKANCHOR_1c8 6154 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn14 7691 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn15 7692 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn16 7693 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn17 7699 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn18 7700 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_enum_underlying_type 4006 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn19 7709 0 R /__WKANCHOR_1d0 6222 0 R /__WKANCHOR_1aa 5922 0 R /__WKANCHOR_1d2 6223 0 R /__WKANCHOR_1ac 5924 0 R /__WKANCHOR_1d4 6225 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn20 7712 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_features_example 3308 0 R /__WKANCHOR_1ae 5925 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn21 7713 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_target_language_callbacks 2336 0 R /__WKANCHOR_1d6 6238 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn22 7715 0 R /__WKANCHOR_1ag 5918 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn23 7716 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_inheritance 4610 0 R /__WKANCHOR_1d8 6246 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn24 7731 0 R /__WKANCHOR_1ai 5932 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn25 7733 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn26 7734 0 R /__WKANCHOR_1ak 5939 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn27 7736 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn28 7723 0 R /__WKANCHOR_1am 5940 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn29 7725 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Modules_nn1 3617 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Modules_nn2 3633 0 R /__WKANCHOR_1ao 5941 0 R /__WKANCHOR_1a0 5881 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Modules_nn4 3634 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Modules_nn5 3635 0 R /__WKANCHOR_1a2 5882 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Modules_nn6 3636 0 R /__WKANCHOR_1a4 5885 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_special_macro_descriptor 3019 0 R /__WKANCHOR_1a6 5886 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d4.0.1#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_package_search 6490 0 R /__WKANCHOR_1a8 5877 0 R >> endobj 8040 0 obj <> endobj 8041 0 obj <> endobj 8083 0 obj <> endobj 8084 0 obj <> endobj 8085 0 obj <> endobj 8086 0 obj <> endobj 8082 0 obj <> endobj 8042 0 obj <> endobj 8087 0 obj <> endobj 8088 0 obj <> endobj 8089 0 obj <> endobj 8090 0 obj <> endobj 8091 0 obj <> endobj 8092 0 obj <> endobj 8093 0 obj <> endobj 8094 0 obj <> endobj 8095 0 obj <> endobj 8096 0 obj <> endobj 8097 0 obj <> endobj 8099 0 obj <> endobj 8100 0 obj <> endobj 8101 0 obj <> endobj 8102 0 obj <> endobj 8103 0 obj <> endobj 8098 0 obj <> endobj 8043 0 obj <> endobj 8104 0 obj <> endobj 8105 0 obj <> endobj 8113 0 obj <> endobj 8114 0 obj <> endobj 8106 0 obj <> endobj 8115 0 obj <> endobj 8116 0 obj <> endobj 8117 0 obj <> endobj 8118 0 obj <> endobj 8119 0 obj <> endobj 8107 0 obj <> endobj 8108 0 obj <> endobj 8109 0 obj <> endobj 8110 0 obj <> endobj 8111 0 obj <> endobj 8112 0 obj <> endobj 8044 0 obj <> endobj 8124 0 obj <> endobj 8120 0 obj <> endobj 8127 0 obj <> endobj 8128 0 obj <> endobj 8129 0 obj <> endobj 8130 0 obj <> endobj 8131 0 obj <> endobj 8132 0 obj <> endobj 8133 0 obj <> endobj 8125 0 obj <> endobj 8126 0 obj <> endobj 8121 0 obj <> endobj 8136 0 obj <> endobj 8137 0 obj <> endobj 8138 0 obj <> endobj 8134 0 obj <> endobj 8135 0 obj <> endobj 8122 0 obj <> endobj 8123 0 obj <> endobj 8045 0 obj <> endobj 8139 0 obj <> endobj 8142 0 obj <> endobj 8143 0 obj <> endobj 8144 0 obj <> endobj 8145 0 obj <> endobj 8146 0 obj <> endobj 8140 0 obj <> endobj 8147 0 obj <> endobj 8148 0 obj <> endobj 8149 0 obj <> endobj 8141 0 obj <> endobj 8046 0 obj <> endobj 8157 0 obj <> endobj 8158 0 obj <> endobj 8159 0 obj <> endobj 8160 0 obj <> endobj 8161 0 obj <> endobj 8162 0 obj <> endobj 8150 0 obj <> endobj 8163 0 obj <> endobj 8164 0 obj <> endobj 8165 0 obj <> endobj 8166 0 obj <> endobj 8167 0 obj <> endobj 8151 0 obj <> endobj 8168 0 obj <> endobj 8169 0 obj <> endobj 8170 0 obj <> endobj 8171 0 obj <> endobj 8172 0 obj <> endobj 8152 0 obj <> endobj 8173 0 obj <> endobj 8174 0 obj <> endobj 8175 0 obj <> endobj 8176 0 obj <> endobj 8177 0 obj <> endobj 8178 0 obj <> endobj 8182 0 obj <> endobj 8183 0 obj <> endobj 8184 0 obj <> endobj 8185 0 obj <> endobj 8179 0 obj <> endobj 8180 0 obj <> endobj 8181 0 obj <> endobj 8153 0 obj <> endobj 8186 0 obj <> endobj 8187 0 obj <> endobj 8188 0 obj <> endobj 8189 0 obj <> endobj 8190 0 obj <> endobj 8191 0 obj <> endobj 8192 0 obj <> endobj 8193 0 obj <> endobj 8154 0 obj <> endobj 8194 0 obj <> endobj 8195 0 obj <> endobj 8196 0 obj <> endobj 8197 0 obj <> endobj 8155 0 obj <> endobj 8198 0 obj <> endobj 8199 0 obj <> endobj 8200 0 obj <> endobj 8201 0 obj <> endobj 8202 0 obj <> endobj 8156 0 obj <> endobj 8047 0 obj <> endobj 8203 0 obj <> endobj 8204 0 obj <> endobj 8205 0 obj <> endobj 8206 0 obj <> endobj 8233 0 obj <> endobj 8234 0 obj <> endobj 8235 0 obj <> endobj 8207 0 obj <> endobj 8236 0 obj <> endobj 8237 0 obj <> endobj 8238 0 obj <> endobj 8239 0 obj <> endobj 8240 0 obj <> endobj 8241 0 obj <> endobj 8242 0 obj <> endobj 8208 0 obj <> endobj 8209 0 obj <> endobj 8210 0 obj <> endobj 8211 0 obj <> endobj 8212 0 obj <> endobj 8213 0 obj <> endobj 8214 0 obj <> endobj 8215 0 obj <> endobj 8216 0 obj <> endobj 8243 0 obj <> endobj 8244 0 obj <> endobj 8245 0 obj <> endobj 8246 0 obj <> endobj 8217 0 obj <> endobj 8218 0 obj <> endobj 8219 0 obj <> endobj 8247 0 obj <> endobj 8248 0 obj <> endobj 8249 0 obj <> endobj 8250 0 obj <> endobj 8251 0 obj <> endobj 8252 0 obj <> endobj 8253 0 obj <> endobj 8254 0 obj <> endobj 8220 0 obj <> endobj 8255 0 obj <> endobj 8221 0 obj <> endobj 8222 0 obj <> endobj 8223 0 obj <> endobj 8224 0 obj <> endobj 8225 0 obj <> endobj 8226 0 obj <\(\)) /Parent 8048 0 R /Dest /__WKANCHOR_9u /Count 0 /Next 8227 0 R /Prev 8225 0 R >> endobj 8227 0 obj <> endobj 8228 0 obj <> endobj 8229 0 obj <> endobj 8230 0 obj <> endobj 8256 0 obj <> endobj 8257 0 obj <> endobj 8231 0 obj <> endobj 8232 0 obj <> endobj 8048 0 obj <> endobj 8258 0 obj <> endobj 8261 0 obj <> endobj 8262 0 obj <> endobj 8263 0 obj <> endobj 8264 0 obj <> endobj 8265 0 obj <> endobj 8266 0 obj <> endobj 8267 0 obj <> endobj 8268 0 obj <> endobj 8269 0 obj <> endobj 8270 0 obj <> endobj 8271 0 obj <> endobj 8272 0 obj <> endobj 8273 0 obj <> endobj 8274 0 obj <> endobj 8275 0 obj <> endobj 8276 0 obj <> endobj 8277 0 obj <> endobj 8278 0 obj <> endobj 8279 0 obj <> endobj 8280 0 obj <> endobj 8281 0 obj <> endobj 8282 0 obj <> endobj 8283 0 obj <> endobj 8284 0 obj <> endobj 8285 0 obj <> endobj 8286 0 obj <> endobj 8287 0 obj <> endobj 8288 0 obj <> endobj 8289 0 obj <> endobj 8290 0 obj <> endobj 8259 0 obj <> endobj 8291 0 obj <> endobj 8292 0 obj <> endobj 8293 0 obj <> endobj 8294 0 obj <> endobj 8295 0 obj <> endobj 8296 0 obj <> endobj 8297 0 obj <> endobj 8298 0 obj <> endobj 8299 0 obj <> endobj 8300 0 obj <> endobj 8260 0 obj <> endobj 8049 0 obj <> endobj 8301 0 obj <> endobj 8304 0 obj <> endobj 8302 0 obj <> endobj 8303 0 obj <> endobj 8050 0 obj <> endobj 8305 0 obj <> endobj 8308 0 obj <> endobj 8309 0 obj <> endobj 8310 0 obj <> endobj 8306 0 obj <> endobj 8307 0 obj <> endobj 8051 0 obj <> endobj 8311 0 obj <> endobj 8312 0 obj <> endobj 8313 0 obj <> endobj 8314 0 obj <> endobj 8315 0 obj <> endobj 8316 0 obj <> endobj 8321 0 obj <> endobj 8322 0 obj <> endobj 8317 0 obj <> endobj 8318 0 obj <> endobj 8319 0 obj <> endobj 8320 0 obj <> endobj 8052 0 obj <> endobj 8323 0 obj <> endobj 8328 0 obj <> endobj 8329 0 obj <> endobj 8330 0 obj <> endobj 8331 0 obj <> endobj 8324 0 obj <> endobj 8332 0 obj <> endobj 8333 0 obj <> endobj 8334 0 obj <> endobj 8335 0 obj <> endobj 8325 0 obj <> endobj 8336 0 obj <> endobj 8337 0 obj <> endobj 8338 0 obj <> endobj 8341 0 obj <> endobj 8342 0 obj <> endobj 8343 0 obj <> endobj 8344 0 obj <> endobj 8345 0 obj <> endobj 8339 0 obj <> endobj 8340 0 obj <> endobj 8326 0 obj <> endobj 8346 0 obj <> endobj 8327 0 obj <> endobj 8053 0 obj <> endobj 8349 0 obj <> endobj 8350 0 obj <> endobj 8351 0 obj <> endobj 8352 0 obj <> endobj 8353 0 obj <> endobj 8347 0 obj <> endobj 8354 0 obj <> endobj 8355 0 obj <> endobj 8356 0 obj <> endobj 8348 0 obj <> endobj 8054 0 obj <> endobj 8374 0 obj <> endobj 8375 0 obj <> endobj 8376 0 obj <> endobj 8377 0 obj <> endobj 8378 0 obj <> endobj 8379 0 obj <> endobj 8380 0 obj <> endobj 8381 0 obj <> endobj 8357 0 obj <> endobj 8382 0 obj <> endobj 8383 0 obj <> endobj 8384 0 obj <> endobj 8385 0 obj <> endobj 8386 0 obj <> endobj 8358 0 obj <> endobj 8387 0 obj <> endobj 8388 0 obj <> endobj 8389 0 obj <> endobj 8390 0 obj <> endobj 8391 0 obj <> endobj 8392 0 obj <> endobj 8359 0 obj <> endobj 8393 0 obj <> endobj 8394 0 obj <> endobj 8395 0 obj <> endobj 8399 0 obj <> endobj 8400 0 obj <> endobj 8396 0 obj <> endobj 8397 0 obj <> endobj 8398 0 obj <> endobj 8360 0 obj <> endobj 8401 0 obj <> endobj 8402 0 obj <> endobj 8403 0 obj <> endobj 8404 0 obj <> endobj 8405 0 obj <> endobj 8406 0 obj <> endobj 8407 0 obj <> endobj 8408 0 obj <> endobj 8409 0 obj <> endobj 8410 0 obj <> endobj 8411 0 obj <> endobj 8412 0 obj <> endobj 8413 0 obj <> endobj 8414 0 obj <> endobj 8361 0 obj <> endobj 8415 0 obj <> endobj 8416 0 obj <> endobj 8362 0 obj <> endobj 8363 0 obj <> endobj 8364 0 obj <> endobj 8365 0 obj <> endobj 8366 0 obj <> endobj 8417 0 obj <> endobj 8418 0 obj <> endobj 8367 0 obj <> endobj 8419 0 obj <> endobj 8420 0 obj <> endobj 8368 0 obj <> endobj 8421 0 obj <> endobj 8369 0 obj <> endobj 8370 0 obj <> endobj 8371 0 obj <> endobj 8372 0 obj <> endobj 8373 0 obj <> endobj 8055 0 obj <> endobj 8425 0 obj <> endobj 8426 0 obj <> endobj 8427 0 obj <> endobj 8428 0 obj <> endobj 8429 0 obj <> endobj 8430 0 obj <> endobj 8431 0 obj <> endobj 8422 0 obj <> endobj 8423 0 obj <> endobj 8432 0 obj <> endobj 8433 0 obj <> endobj 8434 0 obj <> endobj 8435 0 obj <> endobj 8436 0 obj <> endobj 8424 0 obj <> endobj 8056 0 obj <> endobj 8437 0 obj <> endobj 8438 0 obj <> endobj 8439 0 obj <> endobj 8440 0 obj <> endobj 8057 0 obj <> endobj 8441 0 obj <> endobj 8442 0 obj <> endobj 8443 0 obj <> endobj 8444 0 obj <> endobj 8445 0 obj <> endobj 8446 0 obj <> endobj 8447 0 obj <> endobj 8448 0 obj <> endobj 8449 0 obj <> endobj 8058 0 obj <> endobj 8450 0 obj <> endobj 8457 0 obj <> endobj 8460 0 obj <> endobj 8461 0 obj <) /Parent 8458 0 R /Dest /__WKANCHOR_lw /Count 0 /Next 8462 0 R /Prev 8460 0 R >> endobj 8462 0 obj <) /Parent 8458 0 R /Dest /__WKANCHOR_ly /Count 0 /Next 8463 0 R /Prev 8461 0 R >> endobj 8463 0 obj <> endobj 8464 0 obj <> endobj 8458 0 obj <> endobj 8459 0 obj <> endobj 8451 0 obj <> endobj 8465 0 obj <> endobj 8466 0 obj <> endobj 8467 0 obj <> endobj 8468 0 obj <> endobj 8452 0 obj <> endobj 8469 0 obj <> endobj 8470 0 obj <> endobj 8471 0 obj <> endobj 8472 0 obj <> endobj 8453 0 obj <> endobj 8473 0 obj <> endobj 8454 0 obj <> endobj 8474 0 obj <> endobj 8475 0 obj <> endobj 8476 0 obj <> endobj 8455 0 obj <> endobj 8456 0 obj <> endobj 8059 0 obj <> endobj 8477 0 obj <> endobj 8478 0 obj <> endobj 8479 0 obj <> endobj 8480 0 obj <> endobj 8481 0 obj <> endobj 8482 0 obj <> endobj 8483 0 obj <> endobj 8484 0 obj <> endobj 8487 0 obj <> endobj 8488 0 obj <> endobj 8489 0 obj <> endobj 8490 0 obj <> endobj 8491 0 obj <> endobj 8492 0 obj <> endobj 8493 0 obj <> endobj 8494 0 obj <> endobj 8485 0 obj <> endobj 8486 0 obj <> endobj 8060 0 obj <> endobj 8495 0 obj <> endobj 8496 0 obj <> endobj 8497 0 obj <> endobj 8498 0 obj <> endobj 8499 0 obj <> endobj 8500 0 obj <> endobj 8501 0 obj <> endobj 8061 0 obj <> endobj 8502 0 obj <> endobj 8503 0 obj <> endobj 8504 0 obj <> endobj 8505 0 obj <> endobj 8506 0 obj <> endobj 8507 0 obj <> endobj 8508 0 obj <> endobj 8509 0 obj <> endobj 8510 0 obj <> endobj 8511 0 obj <> endobj 8512 0 obj <> endobj 8513 0 obj <> endobj 8514 0 obj <> endobj 8515 0 obj <> endobj 8516 0 obj <> endobj 8517 0 obj <> endobj 8518 0 obj <> endobj 8062 0 obj <> endobj 8519 0 obj <> endobj 8522 0 obj <> endobj 8523 0 obj <> endobj 8524 0 obj <> endobj 8525 0 obj <> endobj 8520 0 obj <> endobj 8521 0 obj <> endobj 8063 0 obj <> endobj 8534 0 obj <> endobj 8535 0 obj <> endobj 8526 0 obj <> endobj 8527 0 obj <> endobj 8528 0 obj <> endobj 8536 0 obj <> endobj 8537 0 obj <> endobj 8538 0 obj <> endobj 8529 0 obj <> endobj 8539 0 obj <> endobj 8540 0 obj <> endobj 8541 0 obj <> endobj 8542 0 obj <> endobj 8530 0 obj <> endobj 8543 0 obj <> endobj 8544 0 obj <> endobj 8545 0 obj <> endobj 8531 0 obj <> endobj 8532 0 obj <> endobj 8546 0 obj <> endobj 8547 0 obj <> endobj 8548 0 obj <> endobj 8549 0 obj <> endobj 8550 0 obj <> endobj 8551 0 obj <> endobj 8552 0 obj <> endobj 8553 0 obj <> endobj 8554 0 obj <> endobj 8533 0 obj <> endobj 8064 0 obj <> endobj 8555 0 obj <> endobj 8556 0 obj <> endobj 8565 0 obj < D name comparison) /Parent 8557 0 R /Dest /__WKANCHOR_ry /Count 0 /Next 8566 0 R >> endobj 8566 0 obj <> endobj 8567 0 obj <> endobj 8568 0 obj <> endobj 8569 0 obj <> endobj 8570 0 obj <> endobj 8571 0 obj <> endobj 8557 0 obj <> endobj 8558 0 obj <> endobj 8559 0 obj <> endobj 8560 0 obj <> endobj 8561 0 obj <> endobj 8572 0 obj <> endobj 8573 0 obj <> endobj 8574 0 obj <> endobj 8575 0 obj <> endobj 8562 0 obj <> endobj 8563 0 obj <> endobj 8564 0 obj <> endobj 8065 0 obj <> endobj 8576 0 obj <> endobj 8577 0 obj <> endobj 8580 0 obj <> endobj 8581 0 obj <> endobj 8578 0 obj <> endobj 8582 0 obj <> endobj 8583 0 obj <> endobj 8584 0 obj <> endobj 8585 0 obj <> endobj 8593 0 obj <> endobj 8594 0 obj <> endobj 8586 0 obj <> endobj 8587 0 obj <> endobj 8595 0 obj <> endobj 8596 0 obj <> endobj 8597 0 obj <> endobj 8598 0 obj <> endobj 8599 0 obj <> endobj 8600 0 obj <> endobj 8601 0 obj <> endobj 8602 0 obj <> endobj 8588 0 obj <> endobj 8589 0 obj <> endobj 8590 0 obj <> endobj 8591 0 obj <> endobj 8592 0 obj <> endobj 8579 0 obj <> endobj 8066 0 obj <> endobj 8603 0 obj <> endobj 8604 0 obj <> endobj 8605 0 obj <> endobj 8615 0 obj <> endobj 8616 0 obj <> endobj 8617 0 obj <> endobj 8618 0 obj <> endobj 8619 0 obj <> endobj 8606 0 obj <> endobj 8607 0 obj <> endobj 8608 0 obj <> endobj 8620 0 obj <> endobj 8621 0 obj <> endobj 8609 0 obj <> endobj 8610 0 obj <> endobj 8611 0 obj <> endobj 8612 0 obj <> endobj 8613 0 obj <> endobj 8622 0 obj <> endobj 8623 0 obj <> endobj 8614 0 obj <> endobj 8067 0 obj <> endobj 8624 0 obj <> endobj 8637 0 obj <> endobj 8638 0 obj <> endobj 8639 0 obj <> endobj 8640 0 obj <> endobj 8641 0 obj <> endobj 8642 0 obj <> endobj 8643 0 obj <> endobj 8645 0 obj <> endobj 8646 0 obj <> endobj 8644 0 obj <> endobj 8625 0 obj <> endobj 8647 0 obj <> endobj 8648 0 obj <> endobj 8649 0 obj <> endobj 8650 0 obj <> endobj 8662 0 obj <> endobj 8663 0 obj <> endobj 8664 0 obj <> endobj 8665 0 obj <> endobj 8666 0 obj <> endobj 8651 0 obj <> endobj 8652 0 obj <> endobj 8653 0 obj <> endobj 8654 0 obj <> endobj 8655 0 obj <> endobj 8667 0 obj <> endobj 8656 0 obj <> endobj 8657 0 obj <> endobj 8658 0 obj <> endobj 8659 0 obj <> endobj 8660 0 obj <> endobj 8668 0 obj <> endobj 8669 0 obj <> endobj 8661 0 obj <> endobj 8626 0 obj <> endobj 8676 0 obj <> endobj 8670 0 obj <> endobj 8677 0 obj <> endobj 8671 0 obj <> endobj 8678 0 obj <> endobj 8679 0 obj <> endobj 8680 0 obj <> endobj 8681 0 obj <> endobj 8682 0 obj <> endobj 8672 0 obj <> endobj 8673 0 obj <> endobj 8683 0 obj <> endobj 8684 0 obj <> endobj 8685 0 obj <> endobj 8674 0 obj <> endobj 8675 0 obj <> endobj 8627 0 obj <> endobj 8686 0 obj <> endobj 8687 0 obj <> endobj 8688 0 obj <> endobj 8689 0 obj <> endobj 8690 0 obj <> endobj 8691 0 obj <> endobj 8693 0 obj <> endobj 8692 0 obj <> endobj 8628 0 obj <> endobj 8629 0 obj <> endobj 8694 0 obj <> endobj 8695 0 obj <> endobj 8696 0 obj <> endobj 8697 0 obj <> endobj 8698 0 obj <> endobj 8630 0 obj <> endobj 8699 0 obj <> endobj 8700 0 obj <> endobj 8701 0 obj <> endobj 8702 0 obj <> endobj 8703 0 obj <> endobj 8704 0 obj <> endobj 8631 0 obj <> endobj 8705 0 obj <> endobj 8706 0 obj <> endobj 8707 0 obj <> endobj 8708 0 obj <> endobj 8709 0 obj <> endobj 8710 0 obj <> endobj 8711 0 obj <> endobj 8712 0 obj <> endobj 8713 0 obj <> endobj 8714 0 obj <> endobj 8632 0 obj <> endobj 8715 0 obj <> endobj 8716 0 obj <> endobj 8717 0 obj <> endobj 8718 0 obj <> endobj 8719 0 obj <> endobj 8720 0 obj <> endobj 8721 0 obj <> endobj 8722 0 obj <> endobj 8723 0 obj <> endobj 8724 0 obj <> endobj 8725 0 obj <> endobj 8726 0 obj <> endobj 8727 0 obj <> endobj 8633 0 obj <> endobj 8634 0 obj <> endobj 8728 0 obj <> endobj 8729 0 obj <> endobj 8730 0 obj <> endobj 8731 0 obj <> endobj 8732 0 obj <> endobj 8635 0 obj <> endobj 8636 0 obj <> endobj 8068 0 obj <> endobj 8733 0 obj <> endobj 8738 0 obj <> endobj 8739 0 obj <> endobj 8740 0 obj <> endobj 8734 0 obj <> endobj 8744 0 obj <> endobj 8741 0 obj <> endobj 8745 0 obj <> endobj 8746 0 obj <> endobj 8742 0 obj <> endobj 8743 0 obj <> endobj 8735 0 obj <> endobj 8747 0 obj <> endobj 8748 0 obj <> endobj 8736 0 obj <> endobj 8749 0 obj <> endobj 8750 0 obj <> endobj 8751 0 obj <> endobj 8752 0 obj <> endobj 8753 0 obj <> endobj 8737 0 obj <> endobj 8069 0 obj <> endobj 8754 0 obj <> endobj 8761 0 obj <> endobj 8762 0 obj <> endobj 8763 0 obj <> endobj 8764 0 obj <> endobj 8755 0 obj <> endobj 8765 0 obj <> endobj 8766 0 obj <> endobj 8767 0 obj <> endobj 8782 0 obj <> endobj 8768 0 obj <> endobj 8769 0 obj <> endobj 8770 0 obj <> endobj 8771 0 obj <> endobj 8772 0 obj <> endobj 8773 0 obj <> endobj 8774 0 obj <> endobj 8775 0 obj <> endobj 8776 0 obj <> endobj 8777 0 obj <> endobj 8778 0 obj <> endobj 8779 0 obj <> endobj 8780 0 obj <> endobj 8783 0 obj <> endobj 8784 0 obj <> endobj 8785 0 obj <> endobj 8781 0 obj <> endobj 8756 0 obj <> endobj 8786 0 obj <> endobj 8787 0 obj <> endobj 8788 0 obj <> endobj 8789 0 obj <> endobj 8757 0 obj <> endobj 8790 0 obj <> endobj 8791 0 obj <> endobj 8758 0 obj <> endobj 8792 0 obj <> endobj 8793 0 obj <> endobj 8759 0 obj <> endobj 8794 0 obj <> endobj 8795 0 obj <> endobj 8796 0 obj <> endobj 8760 0 obj <> endobj 8070 0 obj <> endobj 8797 0 obj <> endobj 8800 0 obj <> endobj 8801 0 obj <> endobj 8802 0 obj <> endobj 8798 0 obj <> endobj 8803 0 obj <> endobj 8804 0 obj <> endobj 8805 0 obj <> endobj 8806 0 obj <> endobj 8807 0 obj <> endobj 8808 0 obj <> endobj 8809 0 obj <> endobj 8810 0 obj <> endobj 8811 0 obj <> endobj 8812 0 obj <> endobj 8813 0 obj <> endobj 8820 0 obj <> endobj 8821 0 obj <> endobj 8814 0 obj <> endobj 8815 0 obj <> endobj 8816 0 obj <> endobj 8817 0 obj <> endobj 8818 0 obj <> endobj 8819 0 obj <> endobj 8799 0 obj <> endobj 8071 0 obj <> endobj 8822 0 obj <> endobj 8833 0 obj <> endobj 8834 0 obj <> endobj 8835 0 obj <> endobj 8836 0 obj <> endobj 8837 0 obj <> endobj 8838 0 obj <> endobj 8839 0 obj <> endobj 8823 0 obj <> endobj 8840 0 obj <> endobj 8841 0 obj <> endobj 8824 0 obj <> endobj 8842 0 obj <> endobj 8843 0 obj <> endobj 8844 0 obj <> endobj 8845 0 obj <> endobj 8846 0 obj <> endobj 8847 0 obj <> endobj 8848 0 obj <> endobj 8849 0 obj <> endobj 8850 0 obj <> endobj 8851 0 obj <> endobj 8825 0 obj <> endobj 8826 0 obj <> endobj 8827 0 obj <> endobj 8852 0 obj <> endobj 8853 0 obj <> endobj 8854 0 obj <> endobj 8855 0 obj <> endobj 8828 0 obj <> endobj 8856 0 obj <> endobj 8857 0 obj <> endobj 8858 0 obj <> endobj 8859 0 obj <> endobj 8860 0 obj <> endobj 8861 0 obj <> endobj 8829 0 obj <> endobj 8862 0 obj <> endobj 8863 0 obj <> endobj 8864 0 obj <> endobj 8865 0 obj <> endobj 8866 0 obj <> endobj 8867 0 obj <> endobj 8868 0 obj <> endobj 8830 0 obj <> endobj 8831 0 obj <> endobj 8869 0 obj <> endobj 8870 0 obj <> endobj 8871 0 obj <> endobj 8872 0 obj <> endobj 8873 0 obj <> endobj 8874 0 obj <> endobj 8832 0 obj <> endobj 8072 0 obj <> endobj 8878 0 obj <> endobj 8879 0 obj <> endobj 8875 0 obj <> endobj 8880 0 obj <> endobj 8881 0 obj <> endobj 8882 0 obj <> endobj 8883 0 obj <> endobj 8884 0 obj <> endobj 8887 0 obj <> endobj 8888 0 obj <> endobj 8889 0 obj <> endobj 8890 0 obj <> endobj 8891 0 obj <> endobj 8885 0 obj <> endobj 8886 0 obj <> endobj 8876 0 obj <> endobj 8892 0 obj <> endobj 8893 0 obj <> endobj 8894 0 obj <> endobj 8895 0 obj <> endobj 8896 0 obj <> endobj 8897 0 obj <> endobj 8898 0 obj <> endobj 8877 0 obj <> endobj 8073 0 obj <> endobj 8899 0 obj <> endobj 8912 0 obj <> endobj 8913 0 obj <> endobj 8914 0 obj <> endobj 8915 0 obj <> endobj 8916 0 obj <> endobj 8917 0 obj <> endobj 8918 0 obj <> endobj 8919 0 obj <> endobj 8920 0 obj <> endobj 8900 0 obj <> endobj 8921 0 obj <> endobj 8922 0 obj <> endobj 8923 0 obj <> endobj 8924 0 obj <> endobj 8925 0 obj <> endobj 8926 0 obj <> endobj 8927 0 obj <> endobj 8928 0 obj <> endobj 8929 0 obj <> endobj 8930 0 obj <> endobj 8931 0 obj <> endobj 8932 0 obj <> endobj 8933 0 obj <> endobj 8936 0 obj <> endobj 8937 0 obj <> endobj 8934 0 obj <> endobj 8935 0 obj <> endobj 8901 0 obj <> endobj 8938 0 obj <> endobj 8941 0 obj <> endobj 8942 0 obj <> endobj 8939 0 obj <> endobj 8940 0 obj <> endobj 8902 0 obj <> endobj 8943 0 obj <> endobj 8944 0 obj <> endobj 8945 0 obj <> endobj 8946 0 obj <> endobj 8947 0 obj <> endobj 8948 0 obj <> endobj 8949 0 obj <> endobj 8903 0 obj <> endobj 8950 0 obj <> endobj 8951 0 obj <> endobj 8952 0 obj <> endobj 8953 0 obj <> endobj 8955 0 obj <> endobj 8954 0 obj <> endobj 8904 0 obj <> endobj 8956 0 obj <> endobj 8957 0 obj <> endobj 8958 0 obj <> endobj 8959 0 obj <> endobj 8960 0 obj <> endobj 8905 0 obj <> endobj 8961 0 obj <> endobj 8962 0 obj <> endobj 8963 0 obj <> endobj 8964 0 obj <> endobj 8906 0 obj <> endobj 8965 0 obj <> endobj 8966 0 obj <> endobj 8967 0 obj <> endobj 8968 0 obj <> endobj 8969 0 obj <> endobj 8970 0 obj <> endobj 8971 0 obj <> endobj 8907 0 obj <> endobj 8972 0 obj <> endobj 8975 0 obj <> endobj 8976 0 obj <> endobj 8977 0 obj <> endobj 8978 0 obj <> endobj 8979 0 obj <> endobj 8973 0 obj <> endobj 8974 0 obj <> endobj 8908 0 obj <> endobj 8980 0 obj <> endobj 8981 0 obj <> endobj 8982 0 obj <> endobj 8983 0 obj <> endobj 8984 0 obj <> endobj 8986 0 obj <> endobj 8987 0 obj <> endobj 8988 0 obj <> endobj 8989 0 obj <> endobj 8990 0 obj <> endobj 8985 0 obj <> endobj 8909 0 obj <> endobj 8991 0 obj <> endobj 8992 0 obj <> endobj 8993 0 obj <> endobj 8994 0 obj <> endobj 8995 0 obj <> endobj 8910 0 obj <> endobj 8996 0 obj <> endobj 8997 0 obj <> endobj 8911 0 obj <> endobj 8074 0 obj <> endobj 8998 0 obj <> endobj 8999 0 obj <> endobj 9000 0 obj <> endobj 9001 0 obj <> endobj 9002 0 obj <> endobj 9003 0 obj <> endobj 9004 0 obj <> endobj 8075 0 obj <> endobj 9015 0 obj <> endobj 9016 0 obj <> endobj 9017 0 obj <> endobj 9018 0 obj <> endobj 9019 0 obj <> endobj 9020 0 obj <> endobj 9005 0 obj <> endobj 9021 0 obj <> endobj 9006 0 obj <> endobj 9022 0 obj <> endobj 9023 0 obj <> endobj 9024 0 obj <> endobj 9025 0 obj <> endobj 9026 0 obj <> endobj 9027 0 obj <> endobj 9028 0 obj <> endobj 9029 0 obj <> endobj 9030 0 obj <> endobj 9031 0 obj <> endobj 9032 0 obj <> endobj 9033 0 obj <> endobj 9034 0 obj <> endobj 9035 0 obj <> endobj 9036 0 obj <> endobj 9039 0 obj <> endobj 9040 0 obj <> endobj 9037 0 obj <> endobj 9041 0 obj <> endobj 9038 0 obj <> endobj 9007 0 obj <> endobj 9042 0 obj <> endobj 9043 0 obj <> endobj 9044 0 obj <> endobj 9045 0 obj <> endobj 9008 0 obj <> endobj 9009 0 obj <> endobj 9046 0 obj <> endobj 9047 0 obj <> endobj 9048 0 obj <> endobj 9049 0 obj <> endobj 9010 0 obj <> endobj 9050 0 obj <> endobj 9051 0 obj <> endobj 9052 0 obj <> endobj 9053 0 obj <> endobj 9054 0 obj <> endobj 9063 0 obj <> endobj 9064 0 obj <> endobj 9065 0 obj <> endobj 9066 0 obj <> endobj 9067 0 obj <> endobj 9068 0 obj <> endobj 9069 0 obj <> endobj 9070 0 obj <> endobj 9071 0 obj <> endobj 9072 0 obj <> endobj 9073 0 obj <> endobj 9074 0 obj <> endobj 9075 0 obj <> endobj 9076 0 obj <> endobj 9077 0 obj <> endobj 9078 0 obj <> endobj 9079 0 obj <> endobj 9080 0 obj <> endobj 9055 0 obj <> endobj 9056 0 obj <> endobj 9081 0 obj <> endobj 9082 0 obj <> endobj 9083 0 obj <> endobj 9084 0 obj <> endobj 9085 0 obj <> endobj 9057 0 obj <> endobj 9058 0 obj <> endobj 9059 0 obj <> endobj 9060 0 obj <> endobj 9086 0 obj <> endobj 9061 0 obj <> endobj 9062 0 obj <> endobj 9011 0 obj <> endobj 9087 0 obj <> endobj 9090 0 obj <> endobj 9091 0 obj <> endobj 9092 0 obj <> endobj 9093 0 obj <> endobj 9094 0 obj <> endobj 9088 0 obj <> endobj 9089 0 obj <> endobj 9012 0 obj <> endobj 9095 0 obj <> endobj 9096 0 obj <> endobj 9097 0 obj <> endobj 9013 0 obj <> endobj 9098 0 obj <> endobj 9099 0 obj <> endobj 9100 0 obj <> endobj 9101 0 obj <> endobj 9102 0 obj <> endobj 9103 0 obj <> endobj 9014 0 obj <> endobj 8076 0 obj <> endobj 9104 0 obj <> endobj 9112 0 obj <> endobj 9113 0 obj <> endobj 9114 0 obj <> endobj 9115 0 obj <> endobj 9116 0 obj <> endobj 9105 0 obj <> endobj 9117 0 obj <> endobj 9118 0 obj <> endobj 9133 0 obj <> endobj 9134 0 obj <> endobj 9119 0 obj <> endobj 9120 0 obj <> endobj 9135 0 obj <> endobj 9136 0 obj <> endobj 9121 0 obj <> endobj 9137 0 obj <> endobj 9138 0 obj <> endobj 9122 0 obj <> endobj 9123 0 obj <> endobj 9124 0 obj <> endobj 9125 0 obj <> endobj 9126 0 obj <> endobj 9127 0 obj <> endobj 9128 0 obj <> endobj 9129 0 obj <> endobj 9130 0 obj <> endobj 9131 0 obj <> endobj 9132 0 obj <> endobj 9106 0 obj <> endobj 9139 0 obj <> endobj 9140 0 obj <> endobj 9141 0 obj <> endobj 9142 0 obj <> endobj 9143 0 obj <> endobj 9107 0 obj <> endobj 9108 0 obj <> endobj 9144 0 obj <> endobj 9145 0 obj <> endobj 9109 0 obj <> endobj 9146 0 obj <> endobj 9147 0 obj <> endobj 9110 0 obj <> endobj 9111 0 obj <> endobj 8077 0 obj <> endobj 9158 0 obj <> endobj 9159 0 obj <> endobj 9160 0 obj <> endobj 9161 0 obj <> endobj 9162 0 obj <> endobj 9163 0 obj <> endobj 9164 0 obj <> endobj 9165 0 obj <> endobj 9148 0 obj <> endobj 9166 0 obj <> endobj 9167 0 obj <> endobj 9149 0 obj <> endobj 9168 0 obj <> endobj 9169 0 obj <> endobj 9170 0 obj <> endobj 9171 0 obj <> endobj 9172 0 obj <> endobj 9173 0 obj <> endobj 9174 0 obj <> endobj 9175 0 obj <> endobj 9176 0 obj <> endobj 9177 0 obj <> endobj 9178 0 obj <> endobj 9179 0 obj <> endobj 9180 0 obj <> endobj 9181 0 obj <> endobj 9150 0 obj <> endobj 9182 0 obj <> endobj 9183 0 obj <> endobj 9151 0 obj <> endobj 9152 0 obj <> endobj 9153 0 obj <> endobj 9184 0 obj <> endobj 9185 0 obj <> endobj 9186 0 obj <> endobj 9187 0 obj <> endobj 9188 0 obj <> endobj 9189 0 obj <> endobj 9190 0 obj <> endobj 9191 0 obj <> endobj 9154 0 obj <> endobj 9155 0 obj <> endobj 9192 0 obj <> endobj 9156 0 obj <> endobj 9157 0 obj <> endobj 8078 0 obj <> endobj 9193 0 obj <> endobj 9194 0 obj <> endobj 9195 0 obj <> endobj 8079 0 obj <> endobj 9199 0 obj <> endobj 9200 0 obj <> endobj 9201 0 obj <> endobj 9202 0 obj <> endobj 9203 0 obj <> endobj 9196 0 obj <> endobj 9204 0 obj <> endobj 9210 0 obj <> endobj 9205 0 obj <> endobj 9211 0 obj <> endobj 9212 0 obj <> endobj 9213 0 obj <> endobj 9214 0 obj <> endobj 9206 0 obj <> endobj 9215 0 obj <> endobj 9216 0 obj <> endobj 9217 0 obj <> endobj 9218 0 obj <> endobj 9207 0 obj <> endobj 9219 0 obj <> endobj 9220 0 obj <> endobj 9221 0 obj <> endobj 9222 0 obj <> endobj 9223 0 obj <> endobj 9224 0 obj <> endobj 9225 0 obj <> endobj 9226 0 obj <> endobj 9208 0 obj <> endobj 9209 0 obj <> endobj 9197 0 obj <> endobj 9227 0 obj <> endobj 9198 0 obj <> endobj 8080 0 obj <> endobj 9228 0 obj <> endobj 9229 0 obj <> endobj 9230 0 obj <> endobj 9241 0 obj <> endobj 9242 0 obj <> endobj 9243 0 obj <> endobj 9244 0 obj <> endobj 9245 0 obj <> endobj 9246 0 obj <> endobj 9247 0 obj <> endobj 9248 0 obj <> endobj 9231 0 obj <> endobj 9249 0 obj <> endobj 9250 0 obj <> endobj 9251 0 obj <> endobj 9252 0 obj <> endobj 9253 0 obj <> endobj 9254 0 obj <> endobj 9232 0 obj <> endobj 9233 0 obj <> endobj 9234 0 obj <> endobj 9255 0 obj <> endobj 9256 0 obj <> endobj 9257 0 obj <> endobj 9258 0 obj <> endobj 9259 0 obj <> endobj 9260 0 obj <> endobj 9235 0 obj <> endobj 9236 0 obj <> endobj 9261 0 obj <> endobj 9262 0 obj <> endobj 9263 0 obj <> endobj 9264 0 obj <> endobj 9265 0 obj <> endobj 9266 0 obj <> endobj 9267 0 obj <> endobj 9268 0 obj <> endobj 9269 0 obj <> endobj 9270 0 obj <> endobj 9271 0 obj <> endobj 9277 0 obj <> endobj 9272 0 obj <> endobj 9273 0 obj <> endobj 9274 0 obj <> endobj 9278 0 obj <> endobj 9279 0 obj <> endobj 9275 0 obj <> endobj 9276 0 obj <> endobj 9237 0 obj <> endobj 9238 0 obj <> endobj 9239 0 obj <> endobj 9240 0 obj <> endobj 8081 0 obj <> endobj 8039 0 obj <> endobj 9280 0 obj << /Type /Catalog /Pages 2 0 R /Outlines 8039 0 R /PageMode /UseOutlines /Dests 8038 0 R >> endobj 8035 0 obj << /Type /Page /Parent 2 0 R /Contents 9281 0 R /Resources 9283 0 R /Annots 9284 0 R /MediaBox [0 0 595 842] >> endobj 9283 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1409 1409 0 R /F8 8 0 R /F9 9 0 R >> /XObject << >> >> endobj 9284 0 obj [ ] endobj 9281 0 obj << /Length 9282 0 R /Filter /FlateDecode >> stream xœí]KÛ6¾ûWè\ ZI‰PØG¶@Y ‡¢‡"iZMÐmýû•-ÊÞ•ôQÒ”äZ³H¼1­á<È™o†_}ÿî×â÷Š«ÛwïÝëí»(M%º?ÅþçÍó7¤-Ýï…±Uñþóî©xÚ=ìÚŸvÝïnlû·ÅíßOÅÏ¿´o~pÚàóÎi_ÿ<¼6†ÚßÄñuÿþ»Ÿ¾)¾ì)öÝ9f^þÿ¶µnkÙ˜éúi׋I‡ŸÞÙ]u X×Kcd£eAZ邬ÐÅß¿í>¶œÈ‹²‘TÕ¶–­Œ¥ªû/·K#»>EA²iµ^{ìžCÂW‚ªhÄ;ÎC+…TM>âql¬HÈx6>Qac2&"ñ=ç‘l ‰G²±¬u§¨ÊDÐÔ‘z 3(ÑI8­”ÞÆˆx$ka"Îã#õfÐ6¢“8pk#â‘l\ÕMD©Ç0C­#:‰ç±lŒˆG²q"úê#õf06¢“8pËW#â‘llM?hå¨êD>ñ&¦‘œ×JoeH=Ž™ÛààìÐTáuu¢ÁšZÙ£?pZ)ÎÈx$˪Š’OÔc˜A©xкã2aDN$÷èë:Xx˜‰|ªêKnÎãNùâ~°Œj†¬hy‡¨Ñ[ØÏ}¢h©ìÑëáh‰]9.¶-°NÛS:Õ<Žb8ÂbjX@1CÑ=Ávì"]Ð_ÊšÖ Â@Þ,pÖ¡PUA#=<óE|¥«f~Œe(˜l²Fù«kÇøææL|TQŸ%cä¦é"À‹ªGŒ9;:êžØ³Jv*}œ× °ãØ$ÕƒS ÌÝE [0²`,¯elóÿ½~-æ·nel“±Í¶±M-)c›Œm.ÛÔ¦žE0œ‚‹2¸3·TÛ:Îk¼• "ŒS0²ðÔm«)ÛÄôú¦žßB‘±ÍycÉYÂ`Ø'ÕÆÏBŒb,®ñ6Ÿ´G`âG>K}‚ë\ý„t¬ÚDüq„ݬ?&ÚjÁVèäG¢=i>vò¸hÀØ×ƒdÌ Ùˆù‡Êqt×ti•µÎ©1v|{lŠƒ ƸFðzýñ–øüæÔ3 w!7²žgœ}‚ýf½ƒ_‰Æ[Òy¦çÏè(œ ñ÷Mµ0Î\ÚÜdÍ3†/÷Ì@Ξ~Ì5ggxбãI!9é:£¼ÎÙW¨ð9%|ŠS€ºöœ7ÀžB'ô\KŠlyi嬗V. !lôta¢¥"-¶T0[µ/pyîJHtï¹0'6^˜Ã;·KÔÓ_"1dÖ¥8«8ë/oB“ŽGYºR¤¦\Š<«– %Î{¼}U¥HM J‘Û~ÛôÙ;_*š/_Ùîå+š”csQ#5’úšmÎÚTE )ŽÌl²¨á9˜ å™å-~QCž.—»ø¢Æ6/+¹ƒý@IÝ’©bÆè¬b\:ã*Ê^IªñYE†¯v P`1¶äSRѤµ³àl›P"§Éº¦o¬]x?¬vp"¶ÀV×Xø†Dœ°rRæt;#´Z²œÖöx>_˜WÍžØÛOö5>ïè¾Q­êã­k‰JÔ„m&íWÍ‚ÔâBôq*úÕmGH™Wèj>bähvæÑ ûÄ (+ÙaÚ¯&šqF(g±0§ëùKêXçC t*èýè—vî)ðE.Aõæ™3x”3N=ãéǼ1.™ñøAœWCoÇÙløÎæ W!°Æ^ÜÇzc\’À‰¡žñ†#ç¼ ˜ÃW x}Yà3€ 8ó Êuâ’ñóåJê—fjƒòܒͪerÏõœ"”Ð3™tu¼vדç]/Ï+S}{à£V›AÚï¾ð‡Dß´à™ÀßR—¼9-œ¯÷c•"–—<×Ê3ÌÏÚ½€ë&øò×¹= I2ˆšò…§ç” ¼þ_ž÷°Åó cÐC _íÊØFìÁzŒªg¥ž£NŃ€Vÿ÷xeìhˆ:Gctøc¿™¤s¤'6¯Q‹c³.]ñ&žÁý8à9AMºgt .þœh¡~°ŒCI‡ÁLÙØ®ä?Õä÷ƒåq ™ñmŸ°…­€y«!7HR·¢3¥ƒnZHZÁµC¨SöVÁÖ‡ÐàW²Œ~‡^¦F2–À@  v=£j×AŸ)íB”ÇÃ[ªlÂÈ~;®êó¹ñg¼-’“<0Ë®ùš<¼WÔBŒ ïèå|ÿ@`uq2 ©G™¾ž_ƒŒÅÀ‰!T×ëgã {¸èê¯Ü2Ò2•è>é°Š <[8Ž‚14o¬Çƒ [n¹{ÃÃŽÏCÍÍþqQÆAªJÑ Bí5¤æ웎-³›¼#†ÀŠÔ06Hj© >°ÔÙuŸ£ëöÌPÆ N}ÎãÃq ¾œëá =Ô‚z]Sb|çøEâbåºU0$‡!2ü(‡iÎ!©K;\–* ǵ$´[VK‹0ã.0°õ@'iñý¸t ‹Á¸\> endobj 9286 0 obj << /Length1 11660 /Length 9289 0 R /Filter /FlateDecode >> stream xœy \SWÚ÷yî½I‘Å"¢’!R6!„@ÙÔ" »JÑB‚I\pGÛRj-jÕ©µÚuZ§µj¶¯ÕÖj}µ©N_§õµµ‹kk§í×v¦%‡÷97µ}ûõûý>.79ûyÖÿ󜄲šð„TT§¦ÃßOþ[Àw~»£§íùÑ'r°|ñN›ÕÒÚ¶rz!1Ø–iÆ€«Xߌõ ¶.ï’{Þ§ÆúB`¾ÃÕb±ÌšLˆv4öïï²,é&MdÖOb]ã´tY7äxÎb×±ƒðÂyî5"#DöˆÌ€+Dû¿ùÓ¤ ãF(Žý HÐP%Y2„«hñ%iÕ…DC4Cƒ²÷è,0(&ÃþùÞ8ÿ!‚YÖËv#I„#§pít¬óDAˆR®U†kÃO ÖÛËøS²Þë«dÆjáK$gèšL.ÛJ{ˆPȵ}¼>.RiÐãõ¿xŒ¦Ì8:R-ÊN£ŽÀâÍG&ß¶~@¿Û¶=Æ­­ÙFˆ0¥à?ËËO3Äê”%Èï^£§—ÔS‹VÒp\–i÷_g× ÑѰõÝ.çüùÇR¤^ËÕëÇDÅÇ©UšqIwä˜ï<ÜÞ UÕ¯é礦ìÊŠÕ3!IŸš>µéçQ¬CN£PDZ>^/WÈy-h•êLS¦R«ŒTšLJ­<†>ù†nôèÐÐôIºO¦ŒŽÚ3ö«Ò£ŒÏA"Ÿ:°óîÂ’Áe½ƒîï_½’»äUK?ô~·¡`H?~ìåI (É~Ð3!²ž”ßA”ŸŽ¸HS¦É¨5jÑ 2<ŒIL)Ê+V!WÉÕ‘|¼ÇáÈ¡»¸¶û_þOúìW¾ Mð]ý.©iÞÊÓXà|tã±s¾ëÞ)oÆîƃ€n¬êÈ2­\ùõ·kÖ⾕°kàÖ3Š”F­ª’ €m?þHP1h 6¤5ˆ(‘@¤Vkm¸AñHž\Z~7ýÑ·Š«ók4 d<]H_…G!†^„˜÷øA×ingf~þ¨¬Êx\‡»!m˜ûu …4ú.Û«rèk!¹%zÃ)äzÍÄ”iHWGB†h8( …Üo-†tÖ'Ä@Ïòi43:;ö\÷zèUeDBbEÝI£" bTÒ³*’#”ÜQºýÀ«À|â±™e/¿B·s8RSRÒ:ÇÞìt¦¤¦Or:¨Ùä9˜¨ývŒ @Ɖ]8ÛY¶ ¶îÑñ -ÿyŒž]´øÜéë¯/èæÞ9÷äÓµu²^Øÿ2Ý©g –®]ãçïšðPŽüEûùÓÆ«Õ¿´N£DÎ ‚ðlÜD)ذa|`=—Ÿ¿„A~Þbà¹ñôçÍ[·nȶn† ›è÷GëëéÆWîšLÂl“I;˜Ò‡]-V& N&J’«úéž{ûú~>¼r¹–~ô:¹RqÓ¯ý^m„þõ³Áé8ýe\|uù„øúјŠß9år©”i11c&*#"Õã;Ó AòÅs6´LLP©aBlnA–QQW»ýÙÙ œ`² 8ªBvTÏ‚VëAº¨Q«“?¬äà0¬g¸@N6j„ܙqñtù¥ÌOP4»d'¥x‡xÈpo¢PÄQ‚ïÝwoð‚ùÆ &?”›€óc£VÅËè‡4[xEØq£EØqå ®×‡²ÀõƉ~¿×Å2®°hEwQnAŠAÅÄ) @G×[ÞêšdN ô[ú 4 ¾ak£ešº=æÜ³û<§¥?<´%=mž.orXãvá mÞ÷_¢?˜ÝÐ4ÿ¥æÍQáW"î"?²“×3XFnö¨ý\  °èŒÆ¥òG´ø~±sgyùc-wLœ>vü~ùàÝüòà *-°—ÇŽ›V{ØÁ¾– †£Ä J2zÁAÚaÒÇúYä£a„  úñ'ÏÓçüó~¨ýiÇ£ùtP;¿yÍÛí¶ÎŽ÷FZN¶XÞ|æÂœC[¬GJ;J–¯øæÇU«q¿i(Ûôn.—$k’‚ƒ1ãölCtÅmû?AV­¹taábýOFÃêE™™‰ÉíßVU'&-Yôñ‘Å Çý{dJj›5-]׸ªÅ’gŽ‹…Ü sJK¶Ä•ÇhÆ+0hÆ«Rî˜X?Z¸óÎÇLÕÆ@Ô˜ÜÔèqác¢ÇÅé͹Hk¯”W¡0®ËŒqh2ª^¸‹î Aáiþè{Ÿ|v£òôp ÃÑ!¢^äÃQ(œy¿,CË … o²Çû&"r=¾þûèYz¾ Ù=…Sùcý抋€gá¹O© &çJÈÂQ”Y4³„_ ³CIëh!·e¢6&9±0S[”a7çð¹ yæÔQsÇ»SSÔ‘¡_‡ÖÖ=ãû®Œî#hQûñŒCq=|Äån€:Âïëâ£U•šÚZ·oÎ5˜›’6’~6zYÏûW–ö€^Ÿ7yú%¥Y9Ñ܃ǖx=+–”—ßy`Rúü°c¶vh·j­¨,,6çš²²ÍS®2‰U³X4ìg …1é`”œ¤}ƒ^ŒMb¨EšÔb$äËdè_ôõv4FgçÛžšªŽc±ê²9ǽcÒ'ÎÉy!“sŽlÙ„z Þ¼&¥5í‡u74Ö>N·w^ÓÜ»Ñ Í&ÝÔ¡/…”ÁŸ;ˆç‡5&kô.É4o‰iS1q¨˜5&¬Yûí•{ú"a|ôÉÖl G…Å÷47.™œ7)½±!ä W#{WŸþxår(«ØøÄìzè;ápØÛOD½“žfkJOƒËéiõéiË#^¶µ·X÷Þ][-DÔÍf2ª¡3…9¨û‰„¹¾\ÊÏMŒ$£É/.æ¬H’ùŒí€%ÁbæαøÎÕœX²4¢BÓÓ*ffrÜ]C‡™³žúºQ&d$‡5kCÁœ×u.tçši9̼ómA\=Eúm F«Ôª´¼èH‚yÝ?¼¿jõxˆŠÌ2ÕÙY‚eÎéX4~“ÆWøö©Û¶½½t œ¹p÷½0¿éõ܉ PT¸ÒY4u.uš>:–¯Äc¢ˆ3¸ë(2^” ;·ù³]sÕH)5Å&fÂÊøaä騰aˆøò¹{óœ©E}ÏÏi }¹“Ñ}PµÜl̳>£÷CïƒS§À¦#v;¢PܽKªjÆF`dÿ濾‰ô©¤ÄzßþÔÆtÔÎ äŸyÎx’"ùÎmY†Q%’¿È¤ÄB%¥ BÂÊ•Ÿþûž{¡¿op¿½-‰þ÷‚)É•m¯;»èUS–¥É”•cž×”™§.­Z û^€XräpEåãÖA·û³ —ôœY\¶kY^1«¨uRGžf /’,6êX„GÍ©¸·.Ñ0p 6qÙÔ_€‡©íŽo@ G‰Ò”0aFËÎJx~4j…¨y5u“ó'ÄýRSêë>÷ñG…'·®_ÿàÀÖ‡ŸÝûÌS»ÿ3¯2½LAid 4´(\)ºÉ¥¼Š¦YAL„„~XSÉEgVf°07œP è“?|¿ö^(/_ë.)…e=?[ÖÅ¥ÞûÊËèë)©¯À«sS“µ·efAf¦Ë™Óú]Npvï»k®Z=»Þ»ÛÚji~É[×)¨æÀ¿ZSS޾ƒ|tù6Œ¶çX‘•Íü¬£²þ¦&¹_¢ Ë ä·b2ÓäpHiÕÃ}ýƒí‰ _¿° ŸÓ×Ö·ìrö®º6¸b=›ÓÔ”:N®™;Kû¬,!î¡Ýçï¼# `õÊ>]±öîÛ¾¦¢ ÁsÑÂ’RÜ £u‚ 1e´ˆ|F¿_eš@„Ä&bˆ¶–e$ç$è51zZ Ïé'G<ñ´¦~n­‡· B™”Ø!¤R™ó¼¯aèÆúÓ•ŒkD|ÙF1Äc¾–×2ÈPˆ—¼^èZỺÃ4ñUÉGŒ Ý[Ö%‚>Ì.„]‘RR©¶Ü'ÝÈòpµ,ÿ¿õ‘¾Gè‡mø6úM|ïri×WáŒ*4›W¿@}%£ UU&ñATÎ%¾Åízç/¾ÆSÒêîÊÆbΧ×VÁ>î´/•~(„ ;hÙß Y/Ã¥¤dš?oÑ2–˜´ðà?•žñýª2°S¼¬wpñìë^âû¥|ShÅh̤}ó¬rÛI†]lÀÓÃ'ú…tˆ‰ß<|H©âšü˜×e'i§³ø©Ás‘Y” "Fõ¡ê€7 Rz }zõsHÃï¸.áR¹t'4û~öýÍÏ·\‹¼ŒfRe>Ä)xÏ‹@«T«‘±pY4p¥±ôï´3˜^‡uƒ‘“ò‡~¾nìø±ŸÐ:¿áGÁâ/g >‡,_+{ýŸã¿¿a%Œºrñòå‹é5úÕÅ‹W˜gà C¨’y0îâ¹U¥Òñ:¥_̆Ä×Àkñ5`lÓ*ùõÅgÿUõh%=U¹­bûk%ï~S³­ 5Ö<ísMc ßD_ÚB× ön²ÍÐKW±w3} Ê÷1C×ø«’4oFÑtQ–þ 5.ø£…‹ã!.<=­®>5™^åòñL1¯éL¢Ó`Ì1»¸ËWó>YºŒ­€ÔwH§ÑB„sî#º®€„×C³5ã߆xÁì{ÊðÖD[;7ŸeZ¨Ñˈáì¶UºE> ß÷Ü<ìa<½\_ÿä“Ð?zýµCP å‡Ñ÷Žc˜Ü¹ºŽœptpo}ò̳ ³áø›P Uo>r”¶Ï.Ÿ}‰!~íḛ́ùíD¯ñqþ .Ì¢¯Òg‰Ž öß5µ¢$7õÑ{aͲ‚)œÚ÷¥¬×áüë–G¬oú¯@çg±‰:ËÅùÏj0@辡—dÿ¼>b±ä~Ä2ø1E|û…šÁ÷¸ï|a|â Ýy…®g§âjÌÅX&ªfÖ¡ôçœÃ)§6sQ- ñHÌO$»ÆéxûëF9¦˜!rú¥Œk¢>ÌÙ¹kæœnÌ4»&çrcaÄ–‡Ž¥d›ÂëoD›Ûßf {ØnKЇósŒÌ²" Wnþ !t'>oô² ŸL g¸4Ä×ϸGi|ïkõE#åMh]¨ÙXvÎ5ë?Ì xn¿ó`gQv¨º“•iuý§Ì˜níHN„ì{[aq0½ýÀº‹×úû|ÓA+pÍe3kMéié¹m•¥Óͦ’ƒƒ«%ø¯în€Ç¡ßß!F2Nüñ .øË¾GF!rÍâ\£@.äíœ?x“̃[Wð1R ÄeFœà?ñ‹"àóé9FLÜêÀÈMõæ¦òù¾Ý\ óàã8ò3!Hºasð=z4Üw0†~î c7$Œ.9×ÇG‹'W&µB­Ð+ô&½IÍàÚ×Eר´åàáëEߎ:+¸lÇóÎô .{/ï¸ P5ÜÐŒ²ml”tû«7ªÓ¥‹E…|nsÑZl˜5m»‘ù÷œÀ‚&¦EXt£dCÙLvËLÁ>H#Á„Ä1 騥æo°/jLö«æø¸^ÐNí™ÛXQRW3Çqä(R{uøWÐada\¾õ¹ƒÿ9ÐÀsüÙë«DÑéâ×À ÿ ¾8²ù£1†mC˜Ù†¾•_•mDŒ q$“”ÜÊæYÊÃRwСóðÒaX7œ ”ݼûuƒüêœ9{^l˜]W{èÏuµ7 þÆ?|zкaC-ÌiÜ»—u–Œ×L¯¯MLÙtM †²zŒ´XׯÀ¾s/¸|r©Ûís‹?ßl„ï‚O.uwÁ`ÌcE…P\¼ã‰)S‹ å´;°ZX¼cga&ÅbV¼³âSDNˆÉh3áuü”Á#¿â2AñÚCÅÛ -­ã¾G]&úÏšÆpÆ»0bìÍ4`“á VÍbžÉ â’û*f™²õdfBeùýÇÍú„윹MxNÐ7šÑ@*gÀ4w¶‰?&˜Mn˜¶±¼ìp†ÑFß›W\¬Ô…ÅwÑ÷:Óð£"© ~*Ôþˆz3‡f騑œÝLÊ‘vW³¡×%f7&è³Mó³s@ŸÐ˜}¼¿²²2—.Å **ûŽ…Ç–NHž[R¤”Å…H¶3—•o¤d™…cœ9ÇI¬¯¨–ÏϺ&ë“õ#¹dZ6£á¦E¨ü·",²¨ñËiR‰I²^Ìœaø7Ÿµˆ0FöÓÔ°UÌ™5kߌfË+»š-ú‰%ÓžoÞÔn:]¼¼ö®)Ƭ;ëkJžÿ¯««Vó#!N?eæÄ„L[jÒ˜ÑUÏÚ_€‚) ¦ài¨÷ÞN[õÖÞíu5P1ë¾ò¼üŒÌŠ}ïø[É—‡f„¿£4¦œÞÎ~Gö„ ‰I%õIš]lòàÃŽÎÚÖ’›;ZÍÎÖü¾èþ£ciïGÑ ¤ÙøÎüƒú ]’ ÷ Õ0ÿQ ‡GÛ®——£¦<˜mlDMù1FŒn<½´^±ððõQŸQ8Ê$2Š·®áQI¿Â‘õoÈ~>üó:&ïè!›P'ûŽdÉì^JÄi•Nü2N´µ[¿E²ó™Ñ òߊW”áj6#Aü™ –~~ Ïêz–~ÓuvIOe¶©ƒž¬ªNN¯û£®5³ë33béÏ¡‰É#ÆnÙ4cºoÿA?Ö3FŠàù}¥Ù°w·b^㛩 2ŒAÐ@œ!­¢lÁçÜ{¯lB|ñ´5úúI)ÁôqnÒ¤»æqkB7&§Œˆ²ÁoÒ´1ÊXº1d8 ¼4ÏnåœB•ï Ë Á÷ ·Žë»ÇGñ´ÐË­òí|ï—^¬ €ªNàßà 8¦Bßzˆ¾vÇåa¼Ûå?+hµÃ a×-Üu_ÿ/Ÿœ×æÿrõÔ EŠcˆ¼WÅHæá·ãï[ A>0EÛ{3pT1žU]U Q„q$¾%£¿µÍ Íý'û¡ý×#f*Ö¡nÑ.ýáÅdZN ƒŽ ­Z­X'®tû_>%«#9Šõ„ã²I¿<›ÔpÏ‘JÁCb°¾¿gá7‘½Eú…Ëb{%~¯RŒ#}R¹ÇGa9Ç `]-¶aÛu8¯û¦áÛ‹ûôóþy¥8†µ§²oyöÐu6ß~lË÷ò;…ݤ¿ð-çxHöÄ~BªØx\3¿°/Dþœ8oû—áÞmørX×1^ð `¼±¹H[£…íߣ𻉵cY‡sŽ#r.{èãëGá*éB~ ŒìÓ⛈ãçðï0^†®á$ƒh‘6F÷e’‡mÇPÆ*²ì"/“ÿC(èñp¸Ÿ§á.„3sk¹CÜ?øQü~=ÿ8™ÿNˆÊ…§…CÂ2•¬FöÙçr³Ü*ÿ£ü%ù·Š ÅJÅVÅ¡€¨€Ö€Í‡Þø*F–¶n Üx.iƒf­Útf„lDĈÄí#îqrÄ—Á\ðè`Sðœ`OpðFŽ7rþȧB”! !Æi!sCÞ ¹JBÕ¡&ÉÞÈtv''Õ~ý7œ7ÛëÈ© $â¤2GÈ—Ê<K¥²@"0ùË2‚¤T–%— •d)oÊ$‚ÿ@*¢®GHå °Ë¿‘Ê#ÈØ€MR9˜¤Ž”Ê#‰1p—T!c‚"ÐgÉn‘*VäE&•9F©Ì“ (’Ê™[¤²ŒŒ…÷¥²œÄs •äG.O*‰ü©HÆòÿÊAÜß…1RyÉ hÊÁ¤1`¯TI:s¥rÉü”;iÇ׋ïRb%­Dƒ¯ë,µé&=Ä-޲a«†LÄÖüN'“H¾D{>íÄó5¤ËnœÅ>-âº.â$)$HìùýÕÒ±T%Q1Mœ„¥é8¿…ÝlÙÛí^ûRk«¦ÕâµhZ\Ý=n{»Í«™Ø’ IŸ”6ISêrµ;¬šB—»Ûå¶xí.gJPᯇ¥kªp‰io’fº³×-C‚šqÛÛ Öj¬9‰»íÍVÿbšj‹¦âI¦ºøY€ƒZpº›Ø"’ŒïÿcÑO‹ÕÙjuk’5ÿkýߟª¹µÿ¯fjüôÔ‰S=7'¦£ì&á“‚%Rgu{Øøô”I“RÒ{¯á’k'¶Q²£ß¦Ó.ÒÈÌÇ+ö0¡tá·›tb›‹´ý®’58Î*š¤{¬b­U\•­]‹#ªÅQ•âL&t¯¸›SUó;VàŽm8¿E4Ïá‘-âÚÌÌý+»°l“Ô× ê)hç óæaFx›ÌíEãu[Z­]w§ÆÕöKÃÒ¸­ív×êÆF»SS›R¢©´x­N¯ÆâlÕÔÜœXÑÖfo±Š-V·×‚ƒ]^ÚFÇB·ÝÓjoa»yR~ËÒ~ÛÛnY×mž@PrLb‹D9̇³ºÇ?¥Úk]dÕÌ´x½V<x$áû[ ¥ kLa‹Q\L86±l•Þ*.ǼÛ)ÍlF×üîÆi®E2'>.ëç†ÍI’Œ¢Müôˆû:q –‡]Â#ÊÃ.×íThDµZD#ñfözű-ØîÀ§GBº.”£×f Ë‹Èh»É;Ž×ÆŠæwK~“n“|N#¶vcÙ%Ò>,½dQsŒ~«H+YD¤mÆq?6Ñp-¢ÙY%3ôŠÔK©UâŠQØ-¶$“bÑd¾Z%IÖ#.—ýæŠ~iÝî6Ñ͉r»µ¶S¤¶UlsÝ”,åvòsìñ¿ó¦VÚDkôK¯U\-ùÿ"ß6Q6^iW—HQ+>~=û-Ê…sŠZó»ºßÖ½ÿKrQ¾.i^7ö°½ü´tù]wªÅƒ®ˆŽ[à¶w¹’4‹mö›f±Å£iµzìíNìlîÑüÒ4ØkAWw:]‹ÐY“ЭÛÜVÍîl×xêz¬n{›´„Æk³x0tY½n{‹ÅáèÁ8ÕÕS›10-¶{mlw‹ã¹?ˆmÉ{W·ÛµH$/ÙÓâ¶Z¸¥ÕÒlwؽ¸†Íâ¶´ –  Ø[<"V Dhº-Îäâ…nW·‰¬/-»5ÉòãŒÇåXdõˆ£Vk«‡áT+²èÀI¸±Ãåêd¬´¹ÜH^«×–|½m.§§º4–ÖVäåjYØÅ QÅ;Lœ¥Åí¾n‡Å‹«t1¤²‰>ÞMÌ$ŸÅâ“"zúíøÕ"¡WŠd©8Ñëí6§¦.^¼8Å"X bX •úÿ¿,3‘nјo(·hlÍ.4—ßÝÚÛÓm•ŒÄíI±y»þðçßv'Þ†ÌÃ^T¡­L CÝ’ï—HV¯ùÕ ç~»ÓÀ4tf¼ ETgº¬ž^¦©èF3)Ai¤Išáøž–’ökqùÈŽu¯È¸GôŸQXíØ_”•Ý¡½ÛëIñØ).w{jEIKuÿ6¡”_ endstream endobj 9289 0 obj 8091 endobj 9287 0 obj << /Type /Font /Subtype /CIDFontType2 /BaseFont /LiberationSans-Bold /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> /FontDescriptor 9285 0 R /CIDToGIDMap /Identity /W [0 [744 662 936 276 772 330 552 276 552 276 716 606 552 606 882 552 606 330 552 276 606 606 276 330 716 552 552 662 386 552 606 552 606 772 606 606 552 716 552 579 552 552 552 552 716 716 496 606 662 606 552 826 552 716 330 330 552 552 552 772 716 276 662 606 662 606 716 662 330 386 276 276 330 236 882 579 386 386 716 470 552 330 330 552 716 579 606 330 ] ] >> endobj 9288 0 obj << /Length 973 >> stream /CIDInit /ProcSet findresource begin 12 dict begin begincmap /CIDSystemInfo << /Registry (Adobe) /Ordering (UCS) /Supplement 0 >> def /CMapName /Adobe-Identity-UCS def /CMapType 2 def 1 begincodespacerange <0000> endcodespacerange 2 beginbfrange <0000> <0000> <0000> <0001> <0057> [<0053> <0057> <0049> <0047> <002D> <0034> <002E> <0030> <0020> <0044> <006F> <0063> <0075> <006D> <0065> <006E> <0074> <0061> <0069> <0054> <0062> <006C> <0066> <0043> <0073> <0031> <0050> <0072> <0032> <0064> <0033> <0067> <0077> <0070> <004C> <0035> <0042> <0036> <002B> <0037> <0038> <0039> <0079> <0041> <0048> <007A> <0046> <0056> <0068> <0078> <004D> <006B> <0055> <0028> <0029> <0023> <004A> <0076> <004F> <0052> <002F> <0045> <0071> <0058> <003F> <004E> <0059> <003A> <002A> <006A> <002C> <0021> <0027> <0025> <003E> <007B> <007D> <0026> <0022> <005F> <005B> <005D> <0024> <004B> <003C> <005A> <003B> ] endbfrange endcmap CMapName currentdict /CMap defineresource pop end end endstream endobj 8 0 obj << /Type /Font /Subtype /Type0 /BaseFont /LiberationSans-Bold /Encoding /Identity-H /DescendantFonts [9287 0 R] /ToUnicode 9288 0 R>> endobj 9290 0 obj << /Type /FontDescriptor /FontName /QITNAA+Courier10PitchBT-Bold /Flags 4 /FontBBox [-44 -309 664 875 ] /ItalicAngle 0 /Ascent 875 /Descent -309 /CapHeight 875 /StemV 93 /FontFile2 9291 0 R >> endobj 9291 0 obj << /Length1 14436 /Length 9294 0 R /Filter /FlateDecode >> stream xœ…{ |õµÿœ™ÙG’Íc³¯$›d³Ùìnv“}ÎîN6ûJ€„¼$ä™ $¼DÄiÊÃr©Š‚Ö*©^)¥j¹h«­µ”r•ú·Ôzý{Õ öÚrmë_½\K&÷üf&ö>³;ó›Ùùßùó=ßs~?( (JEÕP4åÚÔ¯‹ž‰cËÝÅ}°byO_ï…†Š -Á¶È lPogíxý¼.[1|ûÿòï§x}’¢ ohuo£‹û>>Zˆ÷Ÿî¹s ÕE-ÄëßàuÉHÏðòâö[ñú¯øü: ¨ïN|ÄòÌ)쟲|$‡‡GØáøÇ#|8d+U9lJ¥Ai4‘FƒR©*•žs–*MØÌE {æwZÿÏ»Y¾¿kF_M1´wLëj˜ætz¡=V¾û¾WÎÀ3ÇæÜÑì€Ù­Û‚:“Én‰x€¶Â}.Àá–×–g«5ÚR«; PQUáñŒö*à‘Ýwî2i´¦r«»*<9eTÕîŒð¨<˜8;ñ±BÉ¢Po ÃA#¼.H¤9l6Îh r #ŠªÄ?ùïoôxSþ½lCάTmsÆfUz( µÉ?§j†Õi-«Õ9å–—Y«œ£J_HýWMbH¶5½qZÍìl8'Œòo„ÞÈóIŸ/9 ‚6mY™eFa;\‚aéÎøXÄ à ãœ?5!°MŠnJGùPz¥Q”$ “Y@ñ”J•iä9­Í¡4)¼ÕHîªlZ‡þ鿀Ã4¥¥™å®`AÚo…·j‰šµoÑkSôádmmòm(fwúÍj€tk,èI:´ZW‹ðs_2 …ð%“Msɤèu& åªFØû™çQ®ih¥ÄB(—h=Ê¥ÐN*gß¡"ŠE1ÑZP‘F¹tŠúFË #¢ÁŽ„Õšè:6[¢§©E=>ƒ¾ã+ŸÝZW»é©åÍ»g€9Ö5£c¨˜¯†ƒOlÿÉ —ʦ/ªâ—L·ا/á«M/û¿ô‰2¡ 9hÆwhF±ÐÌfA÷¿¡]bž£ZdYm¢9Û”ªPXÆwáZT¦A)ËŠ¢jQȈIk4ݪ!LØ­f4ÛÔˆÛz[Õö&‹sgU:Uª4E'„«.`h.¥:˜ P}”'W*uµxõ4N¥šž?oÛBx¼> (e¥8b~¬B­£½âŒuΛpßøY÷­¯q&Xa»Ç榒¥°iQٲђ9Q¡L†¨ë=ˆ¹ŠÅ"ÒÚ>Ó®­¡]m=Gˆ¸õÙ“ÑGjÃjuŒ8*ú×)‚À~D`[ªÍO0ùäTz nÛWJ¿ýfC9 ueq5Æ©d‚£wG»êŽº®h¬«În¯ëÂ速1QXIiDö`’$Ç ‚°¦«k Mw´z»ÖëX°|~GK½‚xÌœÑ>…U´¾)ã’¢'žØl!¤âMR '±Ð¤4Ù¤h'†È¨hÐÓoKA.ÇY´/ ‚0z×ßBãg¤§ üT3t •ôåf< ³!è®­.Ÿ7Ök.#"±º·Æw*(a‰@"0vÊI‘ƒ}óï>}~¾ž}3§ˆaAQ^wqqIawGv'Žl?z–õ¡•ÙÓF€rÚnçéØ3Ý:·7\’œEÃH|pYWŠÌç‰ü-r0÷Iù.Ìø:G¾â i0GÚ"ßAh¼E8G™^A™rØïQi$"MåŽkZgö«A·MÕ=*}Óí5 ìñèQÔ0û¸ØÁ¸QêÂ1Âþ„ºLù°Ÿócl¾â1ʈ– WmX©-"à ºI“`*uåÚüÆñ‚ÞæÖ—ø5ì |†¼2•xîïfÞ•ï(Ðó ¦O|ÂnBnÇJêùœV¶{~²Qt¥HVÉ\ÉnÏ\A%þ„¨oD­†¢ÐtçüT˜ù%lR¥Ã¡Ã»üEÅ¢s ©Þ%ìG4~áýHG´hí¼9Ùpâµ×Z y’놄ñg ãŽr’È{sèQ\ÏšDOeÇ uï¯îÞòëû››ïÿõ–»µ·uüƒxO£ÃÞØ“ˆ÷Ô;Êë—ÁëÇ·7] < ÷œø¾³¹?QÝ×XŽ4öUÇû[œ¨Œ=cˆ$öhC"4â4:EŸâ$P”"ND 9Z" 4ª¦ %¹Áj}¯õPø4†2]©\GÂÍåšÄZ¥²ˆ›QÞQjÅ:HÕ~Q“X£~Zñ44´JÑxH(„ai¸Ä0€5ÔV]¼vHxÿZ›¬«û‘ 8‰¤ÀnÐÎØœvØ$jÀÜ ?Â:éÇwDw·ö½»®nóÑeÝ…â“©[¥J/° gD7)›$šþ¶” i²©ñ ?*óÞô<½eÆÌéõ2³”Í"Ò‰+[íõ=±)×SoÙŸÀŽ¡Ô²vIÌÑŠ±]†d¢Dýu!GUuà VãÛvð‡fëK˜1¤©ÓUC‰šË’Á¥•ðõööjHW%R—¥‘¼ ìØ wÃaQº@´JrhŒ!¶ÐÜê€õ«…÷®µ¢†BKà< ?' \³ 2àXe\ #á‰×Ë´È©u8$‡£~ ÕõÂ’\@^ÿ'1l!Ð[ãÎ2*‘!eu†Lt¤â9™Z|N»~5±øL‰äæŠpÙŸ+®Ø î&ÞîÈÑgCÿÜ£´0K¼¹ZXøxˆ âŵÌìÆ\ T7¤:@RƒÕÿYöä—žW§‰š0éھ΃H DbLSC-sHtÞùðôdV6>ÿ jq q -”YOò"ÛÔ`º"‹ àló!¢ R“õ*•*IŠcPJñ™i6ÄÔ±1ÂÒjd#´ð=ðݱéÌàCÝËŸmõ¨ ßì,ÌÓgEN}0ˆä&§ÏÙ õj7«@ÙÿÛ s¿ÕŽ+á}%÷‚ÑîÖ›-pâž-ÂFW“ÝÊ÷àÄ{,òÕ¢°r‚8éD2q“ FJÅHÖ%ŽHœ×qbDzK_wxÙž…K®®t[3Ú9díçI9 œf øcÁY\@_gdqs*ñƒºV?»)kècž±ž†M·¡KÙª›œåAsY@[«?^’Ã*9e%ÉJ`´®ÆêÎå¥x+é+oàKªV=´dô Žã0¯³¡ p¼D OäÊV¥J…@%C Ç„G Ë9™W¨‚áñD\‹Éa‡ÓÏ\ɽbÉF}Ûχ®:˜•1*È<>;¡`s1£¾p“J/% ®Bn@-ÝdÅD7å SŠ$Œëå_j‚‡Ð»ˆ³¥+‡5!,k_v2Hh¿“%6ˆÍY ÕêaR©C¡Z–?CóU‡üÉÃUÔ¢— Õ!€'¿lJûŸ`8Ή¹m5f*/*q.e°ýÜ0Jõ‡H„¾å¢ÿ'¿1Lj­Ùï*u™šè“•™ëb,Ï^ ô<;¢jŠD{ŒªšØ7…¦MTˆðö[Ø·äg?ØZ'qôæ{}…–E–.*ï‘jêºøEØð}3¶<=ÐŒPŸ¶Z§Æpï»eôj¢°;Ùý„÷Ùµ„º’œ[+AÖ*á†U+‚}šü„Zú… Êï'¹XŒƒ>à­: 3«Þ(@ƒ?ó '¡Êç ÿÊÅIÁºâ}¶ˆýTÄô°e¬"[G:Æ_C¦I3Í’2YypÞKÉñµyùÇW]«möôÝ0ºÖ×Ñ*Èwûà•lì}å?-ZÂ8ÿˆã‡3 ŹBaÓ4ȳ}×ÀÐíZƒ@ç´µ]x·ûÑõ8"‘—îºÊK§`>&&jð—åºËŒ¹šñ“&¿Uï¶é¡P k ù¯™½Èa˜UP–W$Üo#Žyb±Ž²â[§Ú‚Œ³:¹LF°ͱõw4 wüxõÚ¶×ÕmaýÀ›mÉÀà(ÀÝÖ…Ï|ùØ¡/žY°ð™/}ìËg²­päÉ•#‡¼ÿÎùÿ ZNaÛØWÅ*¡ãëÊ<699—k÷À££o<Ôq¸åû{^>ƒô±wW÷}ìþæ…§–,yêÂØ.”lÑS±÷¹ˆqo!Æ¥Q)’I"±%½:M:dn«BðsŠ1Ï)URe^|-›&Ô3Âé£Ýís£®/ÕZSiÁh²vC–öÉÌ|ýºðûß \M‚¨ñ/Â#+¢eìë,§ƒyzs»__ ;³ó²UaÃ@[–å|bÝ£G‹ó<ºZP“ª5Õ€Òw¡ô 9üI2§X¢Ã˜cÕrzƒ])LÈ}©Ao°i­R$"e<æË+¯'|X™–® EI†ÃÙ_<Áw| Êë¯8oÒ$FœJö‰PL¨Š#9ßáX5¡"-mOÎá%Ò~  P¦j?à\DZ2ÓoâL×ÞÒþ ‡%€VY¥Œž3ˆ+bœ½f‘Ñ"‹üÝ#s;¾³£e׺6£ICâ¢óC¤¸v]Ë¡gàðÃ|k´,Kãõ&<¨Q·ÔuÕXÝ¡Rxë ÚjžgZÅuÆJÑÐ%œb˜­T&ñZ¸V¯@°Ò1$„˜0[ç!"§é°Fºå"F ¹}É^„§Ò–Œ´-ê rs>µÒ¯ÍX1¿½¹¨¨YÐŒ_ÎÌ*È4³PJ7åf¤iÀ„½Š5ì5›*BÑ‹Ý^í—¹N 8`îèîœgzé² `MWçjÚ[½þYíÇÝu­³ê*ÄÞàÕ)]“ZÌ~a„9Äž¦ ñÙ*­Íщå$^ZÏáC¹¼Ø³Òµ¥åÂ…–-.C!æâ1>ƒY-•Q ÙÓ]„c³…î¥oÌô.Þôåö‡A76«»@GjâÀ CL û!è>¹ÚF4ƒ4Ë&‰‚¢ÀŠò-­}Ôº¥Üh†X°°}FmöÆÌÂ0,]…ÐíPÜÙEºâîy‘».o›óí7¾ÙÚc2š±Ÿ¥8[õ°1 Éïo˜Oq>l×OØn9 úGÌ~ô4-e#Ù'!;„æ‘8m@Ùå–¶¨Ä¸?i6ÒðÞç±Ð:ØŸ4˜bÏ/àý[aR…üׯR {­ÅpS ñ˜…ÔVv#»’Ê'J¤Å”Ai4<í¬g|=Zfº,®+ù¼^S„A;´b"çÊö”yQw:a—+spza†¹¤ßêÒ‹™¢°QÌGHÁLÊœ’«"TŒa)¢R¡P|" E’ä<|Wë/ë³@™ÆU‰c¹L$’<ÿü)³ðÁKÑ*~°{ë¾ýÛïð Þ±½¾¸è%I ô %1ü÷èKô‹/ýü$À¿CFži&è^:Êf³%[!§xC©E1T=Ú9‘Ɇ–^EQÖ Q® 2} !Ó…eÁmZ-Óo¥ÞT6û¶¹³è—C÷6B6V¥§«ÂÈÆþûHO÷Úµ;´ÃÐP°9%EÞ±Ùƒ{Ëg=öðSôuüëܕشÆ*ZPB1ïÂ`&ên=Ê9Šrª(—Lz¥Í¦û¶(–ÐD‹‡÷^‚;7ì}ZèJ¿@¶¬åOÿ÷e€ËÌKð`Ë:ÿ&«~ý—?{þ'hQspæÖ"‹à Ë!a9ë•Àä³^cXfY8…g¡p»¸Æ¡¬I%R÷B¦Z½=ÿBU–°R(ºy^ø*™€Á4´§¿¼3µvÿ%|~­J+œ‚zX}µf Tµ²=LÖ¾­‚¢×s$¾èÉ b;3 §dO…Xg!ùxXö7$©Éåƒ7UÈÄ|Ñ@:­ÖW:®<éôê•\ÌÏê7d­!"%ôŸÎêõŒ5H–‘Y*ì~sf¦Ùoγl<á@NÚÙqc #ˆª#õYœ·é$*…§xÚÔ<Ü*/÷i­Ú©xOZðr²*4¿^sA±Š‘¡"l?YK«Ò`fºrDþÄJUº:me\vÖµš~ÿã«:¥ÈNá›JÄe)us:JÌ"KÐC¦QsѦætršØé¦^Xoñ´‘Š’A^楪sîÖ¡ÚšU­­«jj‡ZÝð/03‘jhH%f¡Q:m¡Ý={hÚ”G‡g»_0ÀR˜™C?ž‹ r©93›b½ÍÎòÆÞ¸¸îîÆÞhUmmUdÐ3ÂW>#çáZ¦‡ââsËcÑeM书eQH¨‹r,.%dªŠs‹ì Äyü-ZšU‘C‹ë¥SJ¿hqd?…J%‰Î:%/…µ’ØûXÝ–ðå¨¨È ±Ö+Ϫ„@%ªÌ»dÏ0×8 h‡…=ÌJ´±• D"µRýHÜ ¢Esý8KØ->h±C™ExÝáv {œÎ² `ßÅ/ÆEóW«‹Ë3š ÝÉÁ\Â,ï)qH/Ò¯¿:ÉôH¥•+ß%5•ë®èó|ÀRr©Ö_;Gy}ÂúËIy¥b º•\µÁ÷kúˆðºÕVVúÀ¥e6+pedÒØ'ÀUætþÝøUV¬Øgv_9Š:f˜C”›TÒ®¦ÃJ‰³ñÆpØ äå&«ÎHæ‰N­‚Kðn~>Äã'Ê|¦4PY“}À æ¼üMôÍS•‰*­<‚9\âÙ†´µÄLø>2Gͽ˜îš8÷~’0§u(Éoà–‘‘• •îÚ"¾Aç$I8×&…Jbü¼‘çMâOª’N»¨Y'&‘Ì‘+漂æ|(ú*;=#CY”VÈ:•–úÂ4Mήݙ™Œ.»ÞBgŸM Ú3ôiÌùÕ€>¤Õht¬Rød=޹½D•£Œÿ[Nfº i/˜>ýÔ¨Êà šÌœßT+sðsÝ×aä_Äþ‚š-픓LGÞ'‘‹.ÒÖ±ž¬rHÛ&eÓd9^y/ë „Õ#Ð4kÿ¬Oþž;9{S› Ì¡fÃ`‰:Ûà(‰zY°{]¾ìÚm3ž¾kZÅmߘ?wë<œêEýcåÙF“½0É2œ,©Ì-2Àk§ü¡#+ÏpGœy5q}iA6¦QVõJÃh3At`ï¼YC³"S‘÷54Ból³ŸR±&¹´Aª!O°12¥¤}uWi©Ž§ÄJÅED±¾\JöÕqÆIº:¹¯NÞ>B÷ýX•©·š}&kn³,M=„aáo¢±ÛÖœ”?X“y—½ %äõ3± ÚC§ë¬>Ÿ3‹>1~Ì\–‡Ä•Õ–3k'ƒV4ã/Àñ ×æÐM‰N†¯+÷—jYRZ&Õº{„5L¿¸ÇŽ»õ;ÐJî ˜×Ø&÷®‰ÏÒ>È0®@žjrŸT›Ç¿”3…ÖL{C¬f¨ÂËŒÕs>üð»íþaz&×èÇOÌZÓl- A#bÅé9'í6›`Ñ3ª¾®"$1ïX b)©¤V©ÓD6R!³îcýU^oUÿ1ø ø±À… ‘’€ýÕ€ L¸9Ã!5 »¤š xÈ/-I‰yŸä‘)¥I“XTIÙ/1 Ú%Í[ºB€‚ò€±¨$›L “É6ÚÒ¢B¿3ÚH¨kKs ª?슅B1WØœ±h¬cs» <ø«t¥*Ïw÷¶¬oókÒýs6´ö–'ÜùJ6Ck1—“%–y£m;¹F®H¡û‚a¥²8Ø@FcÇÑœ–F“«i×<Õ íõ»Nt }S–1€~»´yËÒp8ÏéÏ+°jÑ¢<í55í-(µ¥æâ@Yn8¼tKs)¤„+£¡P´2\F¿µ³mtF_yqi¶Z‘–ï¬võ¶n˜ãO×øÛÖ·ôºãîV™®µæUxÀÕ¾¹c,Ð,V*ÃA_X­(â‰uŸcYÅFäÛ3ÉŠ‡nH˜‰S‘/ŽCf&ùyÝÔSR÷´ñÒ—.$-«˜«§´3}³æ+ÓŽÚÚQÍêÚÚ]…Ë^É6›*Ýeư­‘eSÖ*òÕk¯³¼L£Ò M_¼ÈX„Nº©.Bc³p7øý°KØÊ².9ƒæ&ú"ù€G g%:j¹ÐyõœøÂRäv{¤µw˜\_™š²ˆ[¼I)åò"ÉSª€Ÿœ›”ûÓ¼•o}ŽŸ•¤x»’ÀËsÖüÍOº¬È’¿ÀLo½&S¸<ÓÞ\UYž¨yd+“ZE¬œtb1±VÒ†›ø&Ùˆvmw¢¦Ž:O=–X5COÏ£ãÏ÷¤6]1ðÔ+¶â[³g¹‹fÏ+¯AQ`ºsAG1ýê˧µ E¦«ÂY ƒ¯ ŸÝýûškíZtp=¢OLØím½k¼ÍœSU :ˆÕšøÖ©ÐPYâ¾Wi‹«S–E'{+± 6÷†µc†â9íóÐú:Ü ¼Eá:y(µ8ZݽŒ?ßKŒûèÀЧîHT|«½u'³Â7{>À]Ë—Ý`‰wß~åL¶ŠÍtºÜ6Xñ Ð=ó­ó´$×ZºäІTLÚA½Ž=+î²Äø©¸aïöÔ½ÓS«é8ýZæ»­é#r¨÷cTË[§Ž·oÙ;=ãî£}³÷Fþó†MÖ'¦lá“·:@yÃô˜¹ùhÏÐñmuà©þ cöºîX´›, :ëºÅ ~!/Ó?¢ß릷¨šÒM ©FºÝwëª(ÑÁŸ'>c¾d/Rq~²Øs¡“‘(|]î"å²ÑMÝÏ òg-]¼`Åâ¥ý­Õ| Ï¿ˆ9åÀ¾ÅswVÓSd·¨™+_9·ÀŸåvø ÒöYcÓÔ×ϧéà‹•{=­Þ·Í¾§sLƒÍgÞÊùAã¬Ð“]/ógâ®2“Áî&¼žœø„ñˆÒ“Õ­©Òë¤}K“piÐÃa0ÏY´˜”ä—,LºÀïr'Ô§R3öÛSuK[ÓôRæÞñÖŠ +=¦PD§L*ˆ¦8á§òJÚ¬[­¤)Tb}r£‡\vš²î'—ùë¶NÕ+nÂß—#G=¾¶Í_ÖØ9xêáDÊ=ˆ”&´-¸[IÎk$v G¤e/9• d#‡¸MdDÆ/j²£ú—ר¤5°*á8mÊÈ&;ŽÇ·»ýF%¤ÃªxˆaN_ù[®'¿" …Ðdk[bÚLzN À¦3 |ÎO•ÊõŸ!î5اP¦zbüÚ[Ô&«¤ž–`ï*ÃE™ ƨɔÃÏWÂÙ›J W‹Ç¤¨ÐémŒL9y…nÛ( >·gçÎØÛvMÆšDÍøp3g…³à»UqáÅE®ù –ú¼5GŠJô›Qðs~Šüß"<.ö~<Ø•ÿ‚¢ÔÔgÇw*”ŠÇð9åÕFü ³J8Kå(ÄK…R|ÓÔ¿…ì›…Çãì›gñû(õrÛ!<ÚñX„Çù{•øìgøÍ²oi?ƒ×oá÷&<~†Çy'õ‡¥þÁ'ëáMéYQ¾íÒÀ.ÑU§,ïã²®ð]p¿/Éï"rï!ýŠš^F½Xÿî‡i½”þýÓÆ¼ÌZØjv7ZìßvÅÅ£Š÷•œr¯ò‚ŠWíPWGÕƒêKi³Ó¾“ö_éÖôµéÓ›aÉèÌø‰F¯¹CóCÍÅÌüÌY™ë2ŸÍü K—ÕŸu*[‘Ý™} ûBŽ7çžœŸi3µÚŸæN˽=÷Pî¿å~®‹êÐgé×éi06>4¶Ÿ2©MKLÏæeåùòöæý"?ž_þ_EKYH- “–tÓŸ‚š†lØ4> /FontDescriptor 9290 0 R /CIDToGIDMap /Identity /DW 597 >> endobj 9293 0 obj << /Length 980 >> stream /CIDInit /ProcSet findresource begin 12 dict begin begincmap /CIDSystemInfo << /Registry (Adobe) /Ordering (UCS) /Supplement 0 >> def /CMapName /Adobe-Identity-UCS def /CMapType 2 def 1 begincodespacerange <0000> endcodespacerange 2 beginbfrange <0000> <0000> <0000> <0001> <0058> [<0073> <0077> <0069> <0067> <0020> <002D> <0074> <0063> <006C> <0065> <0078> <0061> <006D> <0070> <002E> <0066> <005F> <0072> <0049> <002F> <0075> <006F> <006E> <0064> <0068> <0034> <0079> <0032> <0033> <0037> <0024> <004D> <0076> <0062> <002B> <0035> <005C> <0030> <0043> <004F> <0052> <0045> <0047> <003B> <003A> <0028> <0029> <002C> <0022> <003C> <003E> <004A> <0041> <0056> <004E> <004C> <0055> <0044> <0042> <0050> <0059> <0054> <0048> <0025> <0031> <005B> <003D> <005D> <007A> <002A> <0053> <0057> <006A> <0046> <007B> <007D> <0023> <006B> <0058> <0036> <0039> <0071> <0027> <003F> <0021> <0051> <005A> <004B> ] endbfrange endcmap CMapName currentdict /CMap defineresource pop end end endstream endobj 1499 0 obj << /Type /Font /Subtype /Type0 /BaseFont /Courier10PitchBT-Bold /Encoding /Identity-H /DescendantFonts [9292 0 R] /ToUnicode 9293 0 R>> endobj 9295 0 obj << /Type /FontDescriptor /FontName /QNTNAA+Courier10PitchBT-Italic /Flags 4 /FontBBox [-91 -299 663 858 ] /ItalicAngle 0 /Ascent 858 /Descent -299 /CapHeight 858 /StemV 81 /FontFile2 9296 0 R >> endobj 9296 0 obj << /Length1 6044 /Length 9299 0 R /Filter /FlateDecode >> stream xœ•X TWv~wF?„ Hšèw4’! B$!0à`ìüƒ18&` Øcˆãú/”¤1ÁŽc×óc“ÄÎfsÒ4MÝ­“õi7NÒ´ñiZ×õf³©›nÓf³ÙÍ&›îfÓžÆ ½o$ÀΞ=mÅyš÷žÞÌÜwïw¿û=Bôd)aHYÿ྾6ýÞ31¯ØÚÝ»åÕå¿ÂþÛ8À‰¬§Ø¯ ±àx†Fï½Ìù6޽8>58¼¥»ãr×Q¿Šãæ¡î{w‘b²–Nƒc÷Îî¡­.KÙC8Æõpò: jÖ0a’OˆIàd¹2Zé—^o¶˜¹_²œÏXXh½ùSŸÑÊÃTô±¬Ñ å}6—Ç»É1M»f3qâÝ:üà=ÇÇE*b²ß/ÄÔ«Gÿb‘T”c´ù Yï3;=%ÒL ó†TàqzJ™÷&KQÅnÎÏVŽs—£Ä-Ð’_ì²{ÀŠæ’±ÙYö§ZÁÏCCEA§ã99 :^' ø*‘ÙÿKÆjU^) Tÿ쟕O6“bnt“œÔl1 r¡Ä—„¯¿‚Ö*€Õq‚~žý\SÆ~‡TzB„'Å$Ÿvgö„»Á}p<§ŸŸJoQgÑaÕÓIÑãVªëØM7àÛ»wdÁã§7œJ‰N¾¶õîøyòG‡ö¾~¤)°jèŽÞËëò ÛâÕfç4m;T·¦-|ב]Ì4ësIºGi•³ÐmŠq¯@—ÉÝ›R=¾Î»\Vû"þRŽv­4ÕW%Dê#avVĽÄÓ>òûé.ô2öD §ÎÑê´³p—ªÁ¯Ó/LûEöe4Ý[ßUýÇO™Y(2†êÚ)¹ƒIAv@²v±î®¡xs @îæªÀénû$|áõVn\êCƒW ÕÕ3{3®†GâÝM‰;êĈҞ´;Ðÿ‡•aÍ´9ŸÔàСœåV‡ªÈ’<Ôõèn™C‹MÕ|N¯÷ß.ÆŒWnX*B¼÷@îƒÑ®ÃŸš#w޵Ê<Å2 ~ÿOï´¼Tƒ¶&_0i²ƒ§·l¿t¼UîhÞü$¡zmYçcÃÕ‡ö´ØQ=sÿžgúÊ ŸaÂB¥Ÿ§ºØrXpØ›ZO¾9ÒþÐærh ~߇™0…™àÀAL=¢_µ -ãæp$k|åR.@ÀÏÝüq‘·À-Ì噥 àÎó1f»Ýâsa$—yì®â|å%å‚©Äጹø¦Sá/µNÆ7aÐæ€/˜dA΄”ãñe•~šz=Æž7ËŒcâE5&i>(' ­¯/d;+ZjñÕKŠËáþ©ÑSëËó?‡)TÍ|9ó‡™ð1;ðkeøw"Gƒ ¾ ŒeYÇýkj1Ì À8Ž eYÚM¤~K†RVYn>’ÔDæØÓ Ï)ïª){eR¹®šx3XLâ>!æ+¡ÄÁ‹{’ùȨË˽V)®¹^°¤¹Jtä/iN NšÑ³kQ~R†^è‹2©p Täùýˆ4긺Íló†vçCbèñÍû¯?Ýž97Ðþ½»öƒÃ&¶no9v*¯òôï.{` àYÐòe%wŠl|âíݛߙ„H¤¡‚³£81¡æp¿&hµ½éÙÏ4YšKéèQSdNNsä<äeJÄ~5”Q•;õ¢‡.„}ëŒG:w±®@ò­¸{ï 9káà ŽýÊD¹ 8î°DúÌ{Ê@¢tl  ‘«XÝ.ÉQŸ*\OÀZ¡è£/AßëDž²ÆìŸ({4?`Ï ãÆFbј”‰›)ƒ°Š¨_³.ý‹YŽ0ÉÓrT+_©a‹¿þÕUL«ü}$Ö0ð8¨V~E!´ü#C« é¨%”—™–*X• 7?K˜Ù‡Ñ‚ öYLd4()ͧ˜8¹"“UÔ!2†Ò¿@gN¿Ä~Éþ©ÕŽCõàÑÖ}“7ÿ}ã–Ûýöé6¤Îþãë_{†²ÙóÔàÔòÕSÞº@Q–d‚OŒÔÀ£wŸIüÆ*æùÌ_%·[³o‡D­=ÞºZì6ЬÊʲ:ÒÐTjYíg¯îÛ|²?º~}¯!Û ÷už«¦·3¾í[÷ÔL€ó³¢Ìo$F•ùyá…2n[ÇÆí ³}cG‹íV÷t·¬îa˜•õ¨M~ŽÌqâ£Õæsp®èETŠàn“(|ÅožÀœ¦’¨öý8­ãR0ËXqnÏœB9Úvù|¬³Þ ªŠ©éÝÉÁ“¬þõÖDýáò'ïlFyòÎ=í'Pžë7%ºÎîN [G6Ÿ©AL#>huô¥õœ›«‡&n+óu’† %s\•lÿE+_üˆ¾À8Ñåáá{U´"¾¦Æfóóà‚–ÛHJù¹®2yiAÊ!:² ÑLkÎe}ˆx½ÔËè=}™Nõšž‹ ãGQÅ™"´¢¡º¼ô/(ª´èˆrgÃh¯R§ê´‰7÷uÒªûY(œzÿò'ýðÊŸ]€Wá¬õ™ù<€%¾*¸¹ S¥¤XfY»éüIµÙEB´YšsôD)›p×éÃ=0YÌôÕ²új.Í8ô@¢6-Ãt™ÔW-Ät¿q-¥ †,oYË^lëH‚„ •x>á­®gmÅ.Gžr±>{ÕyÌi‡O¸AÓ‚T%¤&Ùñ™ç£X{uy®"æî›‡çÌIr:¶ 0s’y7X*¹,ó» ¬t}ø.ڤ疖ÈH²¨Ê8´Dâ6pKxT Î4Ï{“ÁÁ„qŠ©EËX|ËÍ«ÑPV›¶Þ)欂¢Ë¯u"‹2¦`8õ]Y¹škpX‚‡U(SFc9½½9«vj MhÉZb£•(­œÒzJæÝ„¢iy´ii4Ó ×@Ö[ :‚ùÖ’0õÃ#R±Íy{°)Ze˜ýž¤T=ÍôõêñPV)ELc¾ylürœ/ké7ˆx¶‡]£ÿðëÀ[ Xø™©þebžˆ·\%î¨×„.,˜™ÞñÔöèÂqþ•KìÑÃb£ [få7‘@Jg?ÒòìYR‰ «¦j’-ÍsÌŠ!}&­(vhTn=;H°ú—ÍSÂ}ž'†,wì³Ù˜K_ÐÛ­\si—»BÆŸØúè9ê† w4³É[j3xCð…"V³’¹”♤; ïU¡”S\Ì…¤C¯+¯²"fĽú/žb¥d4 Êó ú£±ƒ½˜c¹ÙWìÎìD!Ÿué\LH¯ÏÎ ‡™s}挖(õdEnÏ’F—õk®}¶X­͵<Ü*õÀ4óE6®¹˜þ7ÒíÓ39]‹«MHùægöa|6ñ¢›ŸÄ{Øå]ÔªC­U}Ò­Ÿæb0Ý^ÇÖˆm/¶al"¶ÃØöa{Û¶ lÓšk³/c;ŽíŽÛ°™±íÇ6žYCï}[[¶Í5xמyv6ö/âõ¶MØtØÂ¸FÀùëÛ\¤üù걄¼Ïø™Ì«,Ë.c§5VÍ&Í+Ú2í˜ö]±n\wCoÓïÕŸÔšU’5˜õŽ!ßPk8fø(ÛíSwì#k0#æ<ùÍ–Ô–€Æ€}ú¿ÝtˆGé>ƒûa¦¯Áù3})i ÃdÙGöm¤Ÿ Q\QŽê2Nʰ×MFÔïø=†ß»ð»‡ âÚ\»•ôâü^|²{=ø7Ú³ Ÿ2‚m®è&C8·ïÝ‚¹ìÆ¿:¼¯ oQG[ñº¯÷¨ÏM¯¥Öí$}¸²gwâÚmøÄAü•þ2¦>ƒÞCm¦ö¶¨ïÞ‚O]ƒóý¸b×ïù_Wßþ;ýuá·z²Ž„p£ê›·áùT@Ø5 endstream endobj 9299 0 obj 4210 endobj 9297 0 obj << /Type /Font /Subtype /CIDFontType2 /BaseFont /Courier10PitchBT-Italic /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> /FontDescriptor 9295 0 R /CIDToGIDMap /Identity /DW 597 >> endobj 9298 0 obj << /Length 616 >> stream /CIDInit /ProcSet findresource begin 12 dict begin begincmap /CIDSystemInfo << /Registry (Adobe) /Ordering (UCS) /Supplement 0 >> def /CMapName /Adobe-Identity-UCS def /CMapType 2 def 1 begincodespacerange <0000> endcodespacerange 2 beginbfrange <0000> <0000> <0000> <0001> <0024> [<0020> <002D> <003C> <006C> <0061> <006E> <0067> <003E> <0066> <0069> <0065> <0074> <0079> <0070> <006D> <0072> <0078> <0073> <007A> <0063> <0068> <0075> <006B> <006F> <0064> <002E> <0062> <0076> <0050> <004D> <0054> <0049> <006A> <0077> <002C> <005F> ] endbfrange endcmap CMapName currentdict /CMap defineresource pop end end endstream endobj 1699 0 obj << /Type /Font /Subtype /Type0 /BaseFont /Courier10PitchBT-Italic /Encoding /Identity-H /DescendantFonts [9297 0 R] /ToUnicode 9298 0 R>> endobj 9300 0 obj << /Type /FontDescriptor /FontName /QSTNAA+LiberationSans-Italic /Flags 4 /FontBBox [-664.062500 -303.222656 1360.83984 1014.16015 ] /ItalicAngle 0 /Ascent 905.273437 /Descent -211.914062 /CapHeight 905.273437 /StemV 73.2421875 /FontFile2 9301 0 R >> endobj 9301 0 obj << /Length1 10188 /Length 9304 0 R /Filter /FlateDecode >> stream xœY |SUÖ¿÷½—¤ %](Ý^Ú´ÐtIÚJ÷…îû-4mÓ&&!I)…Ò…¥²«PP°,‚0X,ã (.€Â¨8êøñùéèŒËÈè|#Î(4¯ß¹//¥:Œ3¿÷{Íy÷ÝåÜsþçÎ} ŒrCýˆF¨´2F…޽ù´lƒ»©ÝØÝöÑûWÞù&BþH¯Ó¶¶5ä Ï(Q ÷©$~Íš ϳõöUq¢©×á9!ÌÍ-Ú/NÿáS„ôð~g‡v•• :xƒgÖ¤íÐý>êo' DÈó)D3ñƒH„hŸH‚qÿ»ˆ~µQ3ÜD”§˜¡(Êb>AãehÕ8Ì"ƒÅeTf!ŒØñ1Ñ»\-VKRñ™&„/|ü„˜$ÑY EAõhÓÆŒ 1BÒ샱Ïzú³±cô"jÁ5|x·“{h/¨NfÅß‹®«¨±Ë0;Ê},ºz;QH9~“Q2%(倦¡ŠpF.–ˆåD ×$†iÂáòP‰X¢HÔ$ª}ý|}¼%´ØÇ[ã«‘ˆihç/?±Ÿ¯Z¥.ú`ãœ(,WÕÕ÷n«­ÇxpýRŠã–t¥¤Î:µÂü∮EZàY ›–õô¥UYÙaá>~«b‹µ%%j•—‡"¬8½/N]U¹þÙ¦%"Z¼8jš Ù™¸´ìþŒn06¢c7‹%gèÞAs•)EÑ1s"²³ŠaÏ¡`+_¦…€Q¥dd´\š¨Q{ƒ¤&Šªü|ý`/ÔµÞøLo“6dåè1©÷ˆ‡§„®¨®°æcŸ>jc]ê1ܤ=â8LW.Ùì™™aSÎÅù›3Z6° ÃÕ2ZXI‰²N`bÞŒ‚!ãy»$ªÉ‚üÊj ˜P"ÆÞ~¾ÐZâ#“ÖíÜÉÄ#¡—w””°¡TZt\RJÑÞÆ¥8<,#}ICwU…?%™1Cô¤4ø±ØžµÜþ„ø¶åõµªØô ó¢ä”ˆÈÀ ®vlÎ\üT½Báã£kùÕ†G÷µéT±óç/š›ã^±cìµï–-§ƒW§f`\V²yÓîžÜœ°ð’²uÐO‘¥IÀ8 k ë³}{±›öqK®ÁγƿfT°s ƒ¼Ú+ÄŠð„‰íJ(ç®|îÂ#‘QEDæ[^[a¥ssÖöì„~è@M=NM^a>¹¦¤H& ¬ý>Èý„¨ ¬<³%7G˜–aY³0wnމöYºäè/oX ,Öx¹#Ý^¡2-µ-RQY¾¦»Â'¯àÈÑž”T@$p)õgЉÁ“®(Ä€M|æ¹Ñç™õˆŸ¯",5¥9_=K&“K¥ï΢Ÿ˧ŸY¿Ú2O8e³˜Â!²íz˜Ù€ß¦z( ár©F&1„à[!øíC‡“óÄ…‰.Îsî÷gPà+8ˆ¼¼Û“êñÇaŠêÎêÚ€•O»È0¿ ¿­;wá}¥†Á‚<Ÿ¾3®^5+©Õ=ª‚HEKË!Çã.‚´*•8)ŲN­hRè¤m>äxŒxïnF’€‘ŠÁc8$t4”+¹>ú®ˆ=qâö'LÒ×aW¢ñ¯é÷™B”àäø¢Q@?øÔy÷«Y? yuºØuÑ[{Ö~uªM±‹ÍÍéܬ®VíOÏɱÝö;ÜuÄ/9µmmF6öñŽT<З‘>{6N9 ™kARï¼zE$IL)s#â###ãó,+÷/•‡bEdîÜÀ _?edÄÍ<ÁÔ·ÞðÎ'°¯†0‘ÓòÔo£¢ U5A¦ÑÃþ3FäLFFz•RELÅæcŽ«têëGñT˜«2sðOÁ°d.`':³4áZ`;|°wÆÓ½MM,$0o鈧»]UQeÛ_èÓÇ$9ÖÔ§üª©éqjÉØÉ¥›<²3#ís•¶¤é¨íÄAÑñà ÒÀZT#wq‘DžèZšìÃïÞô¥@6'zŠJBh·é3ðIfúÔéßVºû2ʺ' 1%.Æ!lžCOËÎ*`þÂÕÇ4m½7 a” ¨øŠg!¦ÒøQ2±³`²¬$|"اã÷®U ¯æž{©]qAÞª•O=Ñ¢õ<-NL\Ü[Rá½úó8î6u¼véä“•åÕ5»üµ ñYÙ»†vp߃}Æ…ZâK¨»$hD-£åÀý„ù°Œf }›.ûÏæj¦ùùsOQ÷µáa®U4p»ùßYs£§©HÐ8 xê2Ì2æÀ0 ±*¦o8þâ'=;‚½~Gùú{Ÿ=Á}Ë<ÿdÓX¹hàNƹ¥ô‘Û}ÄKdüF?…gÆÏ×Ëé%¦e*Á)äÔ—xÞÓgÚõ/½r‹CØ+¾²{¨¼´·ïÓ¿‰ð‘£ÜÇ7OŸnÕÁÜ3KŠv=tñÆên Ùîì1ÐæIvˆå«¥d“ÔÅw¸ —ðMî‡s/ã%¿åæbü"—MEQӏŸ¨ã–ã:ñ†F7Ãè)0ZΧH?Ð&¸óÞo^йy2³”±¸ÿUÀbzŽ-!¡±žº(ìhìè>4ËeW™ }û:q%|Ç宸€½¨Ö÷úûŒÆwñÎr¸çqÕ:*ßñŒh ­íعs ãõ e³%9Ùñ¯Ûø×¢ë¢=HáÌV¤>™œ¤&Ae¢H•ôzìÝßlÔô/>ÿù‡{†âFg·ë~në¶ÂBl2^êïkÁå/VÕH n<ýýå×MÆE G4–Ì̺úC]¿l³ä?»4-F°¾”×€¿Q|Ä*Â¥<`ýøhòñvUHÄôöyìxÙòç_øšûãþ/7œ{ñóË[·ç,_öæ«Û¶M¢=ûp?pß]|ͰØ}¿yã’ɸ×ÕŸ>}öSmõ©ß2›Ã\ þ;ϸRqùšf‚S˲Q™ãÒ¼|?5›ìõÅè_Øœ\ÂÄ?j¦mr›3§9z'ý@f¶ÀsŒŸ}žTIË'Uژ̊ûîÒg'ªì§áR( ¤&Ò“ÊlÑU®W× ˜¼…ýG@•;Br –AºÃ2É?êsÇþôô™ŽYT‡ÿf:|ëæ±ÿÚJ´ZÊÕѵ •'yðš.•SÒéÒat­ãü[§>À{öà ˜›rÌãÖp`~ÛpãêðõÞ€çp¿ç–qÛ¸kÜÕ¤¦„Jõ+çILÑa§.pd{‹>¹ÍVQgè*ÐX‡ù‰ü$4­Ð„iD´š ÁnJîóçºö wã¾TbÏ)›˜Eíòoçajåý?¸“r …q·q!º< >چʃ€ëК®Yus^agÈdÜíM½7Ž/-,"œR Â`Eg–däx•‹ˆ¸·Ó·n÷]¹ó–ÁûT˜—œ!¡OÙÜWæÞ¸! ¡vD";Ý®á‰ãîÖñ<â駯bÃÿ8¾Áeøï=Ü èêØòó8‡‹q< £Û bIûð¼A #Lèƒ_êë%6õN˜8xæLî×o7œ‰”ãê—£Ä,Þøkêù›Eš$‡PŠìõóÔcE)]sB@¿{ò šÊ¤"M˜š–I‚qûÛÜÃrÜ}ì® ÞËD<ú§;3Éù˜àŒ©†&8KüéÅ×FbáôKÊ?oבW`œ©ÉÎ*Ì/)Ê[˜g–Àœ’¶ÌTV6’°vÍ‹gm(5Úô×v-jPRõ5ä''©bc”J¥Z•º X›š uÒʰ'×a¬m^ÞÔ\W¿®±¨8w/áÇé°“éh&’ƒ¢2røž.rÁÅ2–±^ña2šçžýe`eîíÕ«¸“›‹‹†‡¹¯'q.Ä-Ü-îlm?¶\oÖ––q;!T× qŸ&ù•Wv¾oYAÏÁÔ ˜Ët˜ òX6_ƒ –Ê¡<:øïåxÆî’ÖàÝ:4Êè˜|¬yɽd 2/µ—̇:· °|>N5qUøÄN|‚«Ú)p}>Ÿ½ÀטlAL¶€‘’]ð<_õÅý÷ã‡÷£Õ-¶OÄëqoiÙ^îhÛ®?ûQO¯ã†hÀ±kV¦§ß>äj©O{€]˜°'Q`+~Øÿ+îÂWþ\­¤sàÇíÄõгIè©Qc¹F†Ÿðÿg|åæ¶sµbÛÀ<‡< z6ð¹ž¯Ü éЋn¿Å3ƒÁÌŸî0&=“ÆoŠÒ5çùÃY“ªœIËu%ÁË\IFÁL®JÉþ)ýíM[BO46þ憮ãÀ …¹#OVÕ̉Â>‚%77ÈOʪkäîdzü$z¥¦*F‰÷ {××þ&l iÎLß”! ‰‹VÇæ.l>kh/*~HmPÅaüuJXx`p´&N½0Ïð[’ˆ?ñm|´KI¤Ã}'ò•Hnü¡—¿õÖØî·ÞBÎZE<V˜ÉŸ$4@är:\ÁKIdB|Ê0ó—ÑÙA ŽÿîyNêîã{ ˜›ç$þz*#î[úгös‹ÇŠèÑÀ±ä¾þ130hŒâØ{ô?i„Ûa-Ð4ìuá;êr0&ľãMãbúöxÏ• 2ŸC̾ÛEE0ò=°÷;.¦æ‹5¦·qý¯bû¾#Ê£ç;–P‡Ç. {]þ¤²‘òµ-#U—£Ïû.¦íÔ¸ýyîj»Ãè:AU‘z ßú›DŸÏ$ÿòß(øŒ¹ö`k›ÿqßù!#=d?÷Q0þÃËQ+¬Þ§e+SRqAîc´rx,ü““KƒS5à*þ†3þÁcÇêèàà±O—ÒëÁÃ\ò>ÎgXÈLnÑ0*€çHJÁ;ƒ8ÿAœÁ ¢ÞsïÃÅI\ãÇ;^+õ•$¨ñ¦g §2Ócƒƒð«Wè>7-9œ­Ól.,Æ?L·Ž=Ä}»eL‰vŽ'~M´5 )Q6ªqæü°‰“ó”™à´€ÄuÜñžøT‡ÿÓžø‰£Ìá_Ýù]OvV@€f^nAÝÚ¬ìe}ízœ='*„õñýUó4ÁÁÝôáÛG40¥´l÷rkgEDeÅ#»ØQ!lFö2cÑŒ³³6lh:‹¹ªÿ¨0ÂAÈ|¼Ï•“O~Â%Ÿœ ã'}•Pç^íê fcT RôǪ¦>5Uš?hˆ‰öó…¢Î¶mqCØÑ´Í›^U¼¢íiÕ 7g-ŒS‡…‡ækæg•¦$ÅF'ωPÇ¥kS’ævG\\Úx{”àÿ7è×ñËμÃ×$µÛÓž…¦HNL€¨l톳ª e:uæëg‰É÷Vºš~¥%åùÛUlk„¤I½t¾Ó†‹»pGrÒŽ~xßÖ‰ýº!N…ׯ;³±(ãô̾Á‚œ¬Õ ÃÕ5ù‡•ˆv/nÜ·]ÛìË„•t¼Ó½Z×úô}»‚ +.ÐÿZ×êØ“·pP;/1+»WŸ”¼WTîY‘škª‡Ìiü—´u¸ŽÑÑ7>ŽÃp¯£? ¢?£ë††844DúÁ¹¹_Ô À ùÈHf"ß•Ôp›F£ÕÐ.“ÒJ0Ãý©ÎTÃí®2U]ùCÉžQoªÃËëLuï:ÒË𲺓{ÀÈéñ#ä6âF§ÄéÜxùºÆÕBv/FÁ(þŸ¿®ñ°_6þóïk^ÓÅ'ýæ|3ZÍ2eÿî[BFºgɇwñ3;ÿÅG6Dþ¯îoî„Ç.½/ù{ò??ÿGN=ÀW¡Ÿx¢ÆHR¹”åÑ?ÞÏ·ò3Mþ—G:SóÁê'Ðz| ÉІ;n†´Áo¼odÐø6Æ6~ žsÈ m9Ô2ˆGP(?ŒÏd\ ÜAðœ%ªTt ¥‘ÆŸ‚6‹ð¼B<™ñ¥ñ~-4~ Æ6‰jÐijd|>5|g„ù( îb¸Ë`l(Œkƒþ  Ç-è›íå ã:§<þ!ܵÌgèYxN"ï@·4è÷8™û=A;¤¿d;: :è m¯$í„~ñýè øM$s¯‚ìS°“7Tÿ;Ð+X‰Óá¨óþŒZ@õRר۴ÝHÛè+ô·Ìl¦—e>`þ! 刚D»DïŠ}Å)b‹x“ø˜øEñ‡â/%PI'J2%ZÉVÉã’¿ºÅº¥ºÕ¸õ»ívq»à>Ó]é¾ÄÝì¾Æ}—ûSî¿wÿÎCáaôö”y=W{~âykŠrJ¿Ó¯(Õ’ŠBxúù¿`lšh¯A§£ûp˜ SHŒ³²îdùâ+‚,BÓ0'Èbä6uÊ´šÎd7äMÿYÝÑ4&H=°AâÒͺ=.ÈSP´{ˆ OE îÏ ò44Ë#4Á œÑ ^+"cØ‹H)4'2âq 3ªHA¡@ü‰ ‹Ñjª KÐ-ªTÝPý’ »£@z\=¨ëL” {¢ynËy jp{Y§¢eî%‚< Å»ÿ²ªµÃm‡{5Ò¡VÄ­…g-H-ÈŒ,¨Yù^zheQ´F¯ Å¢8¸Y” ½ÌðÞãY”²F‘¿Z~^32Á™Íƒó˳©@ª´ÈãGG”ã[È©/ÛÐn°€¿ÙV­]˶˜-ÝVC»ÞÎF´D²ªØ¸X6×ln7êØ,³Õb¶jí³)Ú#ëçÝTlL‘§µG±ù¦˜·j†e'+Ì¢Jx2!¼64뜓±•Z4äóæ1BÏx°køÍ€®-0‰ ´'S±«Ù7u†­EgjÕYY%ûO«üòPö§Zül4ëÒª†ŸÀ61\vŒ…+šüLÎj##Tѱ±Ñª{¯èZOù¯Ö#Ë)]ËÝ[g¯/”C Ô¿V´Ų́íÝÎB?R¼ÑñO­ü¬dîjèQÉ÷*ãGØùÕL|¯ª{¬X +¶ñûÐMêÙÂÏMöèœÙ ²^på2ÔÉÃÖ=É8×Þl–“lo°±ZÖnÕ¶ê:´Ö嬹í§Pc­ºvƒÍ®³B£ÁÄVGWF³eZ»Îdgµ¦V¶jb`i[›¡EÇ7¶è¬v-t6Ûõ€“eVƒ­ÕÐBV³Eß u÷Ž¿»H›,G,¶’·C1ß<ÛœC*íº•:¶Xk·ël¤s&t° Æw:6ƒ7J<‡u¹ˆqô¼¬åÞÊOGâÝ$Œl`qaV«Àc‚Ë }»!c¢P´ñmüº&XƒÙ6Þ\“µ`y·jy8Ùoí|ßàF^CÂ}`GçªÍ»uñ\©ŸØ;ô—…òð»k '¤Û„ÈcùV Èf^w—õ”¼çˆþ:^+"iyîm†F~§z¸Zv:†v^[—•Z…] -|‹²'¿¦…Ÿ—¬P L]tÏÖš6ÄF^_Û¤¹M¼¶­|›y²¤—QXɹc#Ÿ–Ox¥G£Óz­ülÊaß6Þ6vaU3¯Q+\N?;e†±¼×œ¡îĺýŸ,§åíkÆYà YË©K‡3t3µ6EÜ «¡ÃÅvé -z¶Kkc[u6C» ^6w³? Þj!ÔM&óJ£•º(ë6«Î¦7˜ÚYa_›Îjh¦`íz­C‡În5´hÆnÈ\Ú ©ªË`דյƑh§Àm@̬¡Ãb5¯äÕSÚZ¬: ÖѶj› FƒæÐk­Úà C‹ç  Ö¢5)s:­f‹”¬Í-ºÛÔròŒÍl\©³ñ½M:]«ðT+lу`a£Ù¼œl¥ÍlõZízå$}ÛÌ&; 5³ÚÖVØ3ÊÜÒÙA XÅîRNÛb5Ã;‹Qk‡Y:Séù· $WEó‘>™¿ZöŠðívKRLLWWW´V ±à°hP*æÿ?-ˆ…ód‚²ò° sv\~qi{·E'€Äj‹ÖÛ;ŒÎôç\ÖÅ““˜ÙE•ÚŠø4db¡€zög3žûyãHÒ}x;yV'¾¬Ì/bK-“…à#Vèź²|\tÜÏÍåd <ÛùÛøø‰æÕïKA³¢ 3 »-Úf0F›­í1¥ áÝÿÀ¯øm endstream endobj 9304 0 obj 6885 endobj 9302 0 obj << /Type /Font /Subtype /CIDFontType2 /BaseFont /LiberationSans-Italic /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> /FontDescriptor 9300 0 R /CIDToGIDMap /Identity /W [0 [744 276 579 220 552 552 552 579 552 276 496 552 552 552 276 330 826 220 496 330 552 552 496 662 716 716 496 496 716 716 772 220 552 496 330 662 330 276 386 276 276 276 496 716 552 552 662 276 579 662 276 276 606 662 276 826 552 552 662 716 496 662 936 772 716 882 552 189 552 579 552 552 ] ] >> endobj 9303 0 obj << /Length 861 >> stream /CIDInit /ProcSet findresource begin 12 dict begin begincmap /CIDSystemInfo << /Registry (Adobe) /Ordering (UCS) /Supplement 0 >> def /CMapName /Adobe-Identity-UCS def /CMapType 2 def 1 begincodespacerange <0000> endcodespacerange 2 beginbfrange <0000> <0000> <0000> <0001> <0047> [<0020> <003C> <006C> <0061> <006E> <0067> <003E> <006F> <0074> <0079> <0070> <0065> <0064> <0066> <002D> <006D> <0069> <0073> <0072> <0075> <0062> <0063> <0041> <004E> <0044> <0078> <0076> <0052> <0043> <004F> <006A> <0068> <007A> <0028> <0056> <0029> <002F> <002A> <002C> <0021> <002E> <006B> <0077> <0031> <0032> <0042> <0049> <002B> <0050> <005B> <005D> <0054> <0053> <003A> <004D> <004C> <005F> <0059> <0048> <004A> <0045> <0057> <0047> <0055> <0025> <003F> <0027> <0038> <003D> <0023> <0071> ] endbfrange endcmap CMapName currentdict /CMap defineresource pop end end endstream endobj 1700 0 obj << /Type /Font /Subtype /Type0 /BaseFont /LiberationSans-Italic /Encoding /Identity-H /DescendantFonts [9302 0 R] /ToUnicode 9303 0 R>> endobj 9305 0 obj << /Type /FontDescriptor /FontName /QXTNAA+LiberationSans /Flags 4 /FontBBox [-543.945312 -303.222656 1301.75781 979.980468 ] /ItalicAngle 0 /Ascent 905.273437 /Descent -211.914062 /CapHeight 905.273437 /StemV 73.2421875 /FontFile2 9306 0 R >> endobj 9306 0 obj << /Length1 12500 /Length 9309 0 R /Filter /FlateDecode >> stream xœz|G÷¾Ý•dc[زiɽ[– îÆ½wSeK¶…‹Œ$0v(nôBÇ´J8B1%B ¤P’Kî’Âå(—v$—€µþÞì®ÁÉåòý¾OËZ³³ofÞ¼ù¿ÿ{3‚Š¢l¨Š¡¨üâÐpjÿ;DZfÞ3ëÛjï:f7`ùE©¶Ô뵺ںL Eyô`]d=V8¬°™€ÏgðÙ«¾É2oÛžéø|“¢ §ÑX£=ráä|¥Ã÷¯7içµPuT#Eyûá³²YÛ¤ÿǃ¥·ñ9ƒ¢†­¤öiXGI(J²M¢ÆÆßÌ{T-=ÂFB“²4ù°7)»jÞö¢Â› K*N¡)å@¿ä:WjY<›IÁ¹ÏÿCQlŒ¤“ŒFQ4uûÇg†’Q”³J®r–«äWXýÃí9ÌIçƒEÍC7ö6Ô´»ì/’MTê!•IU,åêæªvŠÔDøú ½4>Q‘Þán®n2òˆ² |øÍÅþ›·rw­Ö¢—ÆêúNÕêÆ+££ó f,­S«Vý]Ç"õeYù¶C•žI‰“cc4jo7,~}V@wGL$%<‘à>Æe„›—WhP|\Áñj-dfUµ¨Ã¢&“‚ÆŽ tt”»¸uˆŽÁ¹—ãŒF²y”+5ç„:ªÃ£"£Üho_¹Y¹‚ÌÇÓC&•KnÎÆ9éi£wVsÏþ0áÂùwàÆËŽK»sr¥ðŸÓ:}hHf07k×À°Ç¿`=?rÅ¡‚¼òÊ-h¿ò{ÌÛ8šJË•Œ…ÆñÍuˆÅÀ95eÅ̤DÇŠ–Ùùzî¼yónîontÉ!:Ú°61‰öø{]=h"í{§M[·\@Ž¡´l³C•&`ú qüÀ÷t€$ˆR žpÜS£ŽR+Ô O¹0Y: rÚßôhæ½ùæèQ ^©6#¢ßïþñÇnkiÞx¥…6ZŽÚN’\ñ¡Q+¹Z¾¼¯¯O¢<|øÁM6æáE”*EKºã܆Sî(Oˤ¾R_g'†€ ¨ öeÝaþ‚oÿÕÖpë?sçœMNíÝ99ÒÓ6îIO£Çq_¯\°~ÈéPX¶‚ûòó:ÔÕúѬÆú:œÓ2Dÿ·‚Urw`rO|P 0SGFEªqd…œ‰V(BB+º³²û¤‡hÀ‹™T\Ð~¬¸ˆ>2+.fÌ(€ŠªÖÕLñÙ‰«Û÷ü–ЊÊËÖP)zà.s‚ͦbÈzá2áŒ|yÄã$4d\ìQö¨G`ljºýìÌ ³åÝw›U»\33:–%%@`°¶³71ÙÛ ¡þc õîO;%¦4µÇÄÂÈ‘¡![Ö$Æûx¹8Cà¶¢bHM^=¾ÜÏ?  $Áßo´‡Ÿ¯÷Ĩ‚ y9°Ò%Ã×¼}²BÝÇ)Þ^ã”^>HW¨¹-EÉ– OEy2¼OP;»º¡eœÉ7ª jÉ7_ß2zĈ¯9í%k°ÏHåøŸOþ¥²#wÛKÌ¢â-yyý:IgçÁcMÝL}ÿSÛàiÊJg^$#Å?óyö Ôˆ‹³çc`}íÀ]Énä _Ä =„ ˆ'ÉDGÓ¨4*¹T´¬O¼t rגּàDœ¡¡÷§ŽÎåËþ½bÞÜln ]:{Ï3goìÞS\F_‚ò3§!¿à¹ÈÖ‰QOmä~â~Ú¶= ƒÛÍ6OJ€Êòûˆfu÷$m¨ñ6Ô™ÆA•΃þ†Ëæ4D-fä®n€åK¿ßM½å;v¾ûá¶ÞÂb8qRnnÙœ~<¼¡™}°i ÷ëïÝ Þy'§Ï¨¬Ø·÷K(<÷ TTŽ{")‘ÐI/Ct*ˆ=À¨à§®¯‘’81ªÎÓÇ+nvL,oZñ’×JµÚnŸÝÌê­—Ñ›"'ëѪöÔ({¨423‹h¢}}¼±HÌ)Ñ—–mï½lýÞ‡Ú ¯ƒ5Or?p?@̶Ö9 ôµ÷>S^.é„c}Üq®X¦¦t."z.F.ºËÆðÖ‘óxåQKèâæ‰üøöM¥‘CŒÂ%4¤²+›÷"š&¾°xÞ‹…ÅlŒµ¨1&nÔèÊŠ]´¹ÿ¹³¨¢û˜‚ÙÁ¡•—é÷D‹H=Ñ"jÑ_‰ÜþÈ[…©áߊöb¨À £%9^tà˜ììÆ'2&»3Q…ù³÷ædÂ1”hML¦ìˆ‹«¨Ü5Ô›ÍÁÁa᳚&L@7ÛÊ‹”Wî¶®&ÌV†œeFÍ©IhoœiTZ5Џ6™»Ìw„Š'«R_‚òÆ—·~”†¬‹Û`ç3ˆcÓþ¡f^{äD»3Á°øú:…"v”GÚd}P¨Dš6eZeMnNH ¼Ñ‘˜âá9!Ä¥¬tóÁª*)Û ~þUrðš6ã.¤ÀÏlZä QÏ^®YTW\ÉÒ#G……V†N Ú÷påȸ¹Ô*˜0®ÊÃ×ÓUdA×Çvuø—`¼¦"s懥¶OzMʰ¡ù—t5g'Å÷4ÄÅS¦¦l[œ0‰ö°¾}Ææi®R"Ý%q®vÖ…†Àâ¥Üg_TkƒC¦ÏÜú¡N_£¥øpùãÄh*€D;BpSûŠÀB†>¨£ /*i»:£`M{qQ8M÷I3Œ¬ÇÅ-Ýš†ŸÍËcãÔ¯X£h ‡hÛേ·4ޱ1Ðòµ¶ 7?Ôëtz‚8ô6½G"p’Jqðý¦¤óá˜^^O®ŒùYÝ—Š%yÌ §+5ž”$av5‚Љ‡`Ã(~ýi¯£øã#âãô`tDEÕÜ7§Î}ÍUSYq( Fòé‹^Þ‰)E+bcÖ•&'{yqåé:FgãÇ©ÐôtÃX·bY„F;.+Ó&êÙþ7¸‰ÌÅž™Ó#Â@§ÿü3œ\xØŒi¼¤´Èêòˆ(ÌH<Á×׸‹ÈŠP‚Z.)³ ÷á6,áÖNT1졇Ðêì2B*3ÊZ~b÷®ëÓõ'2¯j6ží/AfMIç[\¨`Þã¹{Ú%žø¼ýVôI.?ˆíÊáøÃH½J¡ïƒlpÿz&¼ÿ*³YÒÙËÅmã½(í†qú2 J«55ÿQq7¸OÎC'÷ä%pû·¸'a œáRé Ú›û¬÷­ï“UÄlƒùÛÛ‘ÆÇ®¨(g5­ÿ+×úê·Ã'zúþ|é'Ñÿõ9séó(‹Ë:¢v(¯Æ°"Ñx%{¡Ž;¹û¡|+÷Õ¡[GnEÙÓ8ÀBê~†˜Ñœ¾ðÉ'$b`ö1HmdÔ£ë1! æ.‚çã¥RÔ©³2 ò’ü}!%µÍ’™=ü”ó‚'Î`1yûff¿kAëÒŸ/šSU‘•?)aRZJ¹9)&%¶È"dkO=;#+7m«»%¹8aÞà†KÊ8\´¾ö,))ž·pÅ”¿þÊÜDÙjþ‚[-ìù²'8-Ü¢¢jmõSÅ…É©]­™YöÇÉ4®·ÎÉÎ]»£²BH¸«gž•?HMéÁIô&%šZRp.ñ͇1ßÖêž_ZRæÎލ¨DO E{Fñ+âL¢Œ§\¥Atªdó ™LÅÌ>d­§Ÿ½È­cFÎmŽt‚!{ V1'úsÖ0­²Pgë½,‚ˆ¢{¬;öç!ÎÖƒŸí#.!½z:#&~–¬{Ï’;o´µ?}o]qQQÉʬø„„B•µ{Ìœ#×<ïÜ\ÔQVúŒâ=L¶ö¡EÑ?oå’ª ­â0{‡ÃΘ¾*2 „€ÌIE2{§«çs®ú]x¯»ëUî·º!ùû›s[Áú‰¤Óh¼ rë@¢ WÎ|цçG‰”¤üÞCH†xq™ƒó`è“ < __9ÖÉVsˆýW™TQ¼7ÿ_Öhwÿ_~¨«Õ×à $È¢ýˆ.„…³‡¯†PA.r!¸øØ"=—æz°Zοú5k#óñf'ÿënfjtlZW>l©~ d5ÖCÎ.Fãð7è£/>WRæ@æ:±6±6±FÓ£¨J¦ã,6ðÈteƒ\=xtÉŽèYr_>à°æ¥me%ÿ™Õæs³M°`þ;ím¯çåwugeggw䦦øzÓ7¸.`>¸}Ì ëÖÁ°ªÈ‰Ý]}Ú±ðÈ‘çŸ5ÔUTnÞ^Qå呜(F#I="È‘Ì^ƒ¡ˆ=0>|ˆÑWqë¹ÌsôæuwN™¶ÖýE%;¸X¸²¹¸ˆÎ´ž”tÎjxe笆±Ö=Ì=ܸZAˆÒT®²'ÎÜ‘? szÈ(Œ“@IÎÈ¿Q$xÎ_ðïûmí­s~m{rrúÓÒ³ +cÏ®¬Lú5n×Ë/#-ë`Ö‰ã'OqÛ`n?—.åÞá> Ç;k×àZîĺ?Îg”°û";M²K\Và=™”þä¹Î®Éé窵/Ÿm0¼’‘Õ½Ä%!a^릳íù=Ô×¾ÉèúŸüËü‰Éã!Ø[ ÈWCòN¶‚«ä ®Ó#9ùuX ®sãèat½u ý)½Ïúío­¶º‹íÙ>l/ÌYT úÝW¸±ìöÖÃ1ì­^~Q‚R¾h« %B>Èÿñ’8>J=†$¸§S°¾®n~þÓ 2=<áyPŒPŽ÷õñ÷óõïî2ròW®**~jTwçGŸw,²®»ÀÚäÄÄ…©Sb51Uרýý”ãÝǺõôŒ3%'ONo³£a–¡áaü[oíX´A?'´£" €J`ÑÇ—]»Çºðé‹tÂßéHëÛÑúhÇãîc —Ó‘Óö‡±Å]\¼—VNìA Ü££…Ý€‚ô²}'gp‘Ü| Äw:ªMgw[‹¶â÷[ô®§¸ 8ø¤gr%px=æJÖ‰%ÃÉÚˆ~Õ‘ó$’CŸÑì³/hôWà~-ãB%ÓËïH¦À»t>ÝBtpÆõ˜÷áÝÝ»ÉL1f³I2Á,C²?ÌñÆÈŒ·ÊYÍ[õ*g¦#XîVEs·±¤¹ä­/òúaDes4T4W\·&À¬a=Eg0ÑV-½ ¥Uô1Ú*Fqo7‰›Œa|£¼£$ŒÞ›`î/µnêm=Ëý3†Ù/c«êz2d=@eü’¹¤üÑVWqï)œäŽNråBî§qny_\ܼ¼°øT÷±Âánæ•¶+¥^^õì>Ôá÷:qׄi…·BdO t:»ø>1½â“ƒ “3—-$;©…\½G!œþaz+ _S«Î9SV 奯9[UE»€ê·.¿wû.w—»óÏÛ×/s ¾ì±Ÿ@¡ÂG¼sÉ ‘`/§«¦ž>rº¢¼¼òe¾'î³[ß¼ýþ킸ÝþçûWný“û’`¸ž¹Já”<Ñdv«§°êôàiÁ“øÎ–¬ÙÑ"ŽPÇŒèÿös›½e½¿Óúnlq¹¨ÌûÒ$«‘!]0†GR“çÏ$ äÝ›¸C¹¡/Àç·gàQ Ò‚›X!ý °hGo~Anö½¹9c·3ÛvôëïÊÍüÂ;ñEÎAöxûN™êëþ>S+üýàá÷àíS5+Àßoj9ÖûÈl™Ýrã«ÙF“Å:›ÿõfuËì[æXÌŸ~6ÛØï}¬(ò Žÿ¥¨¸¤èíþ|Qa~á±çð©m¡§¶±ì!JJQQ (ôLUÿ~æ«m[ÁÍÛ¸éWPʃ+§—áª\€?$AŸß0ËI\T+øT‹ìò¹€¥VÐБ’ÙÔD~žHMî^š0ÕÛ"4‘¾ÞS¸òÜœU`°ÄFK1±Ñs`֪ܜNˆˆläzg¤¤)h×”T-·½A3Q(h±TЙäLòÁdPЇì}ű݃úàŽxznÓ5•呾þUq=˜¥i"Zfc⟒¶¨‡ûLÔ4€^›–¢ Ó’«A×9¹«¸M–˜Xf‘$:ÖÂm^™“GДŽ,R²œò§bpW'!EÑÞ>1á&¤xü¯=ÂQâàòcâ D rHÿh—õìѶì™3 á& B5räÔ)7O›S¦~i<Ñûd↳'‡Näê L]ª OêJ˜¤Ÿu±í^^ÎÒÉ“í¡#Ùó¾ö%Pl™TV’¾©¸('·»uÊÔª«W÷ýøë§Õ _êÆ¶§‡«5U¦®?ßààÈþÆÛ7õo¶cRæ>†ü6Æ\¤;ä½ozÖ—S\›è>\º-œ¦`Nöø"þLå¦áÚµþ×®á®à ÎÀ®àîdÁdzÏr†®.’»˜Ø"É=*”Š¥R‘Y¼xNu“‹?%òg²Øß£ßÆäƒ¿¬ð¹¾'rrbDò/ä,-åÊ&U·öhJš_À˜ÝrmþéÚÚ€#.“â-Çr³ƒGºâ&ÿÆ|Ø £F‡…¯^•›m £G…‡¹~ŒÂ¥Þ­qq¶ð} —GhFµ­²Ü¶»Û6;w—jº&b—èáW¸O§·{š™èï>Ú‡ ²‰©¥×ÄùùňºÏQdIÂ`Fò8ëf‹¬WNáêÀÖƒ4^«¬_ã>*ž>oííÿŠú­7:£+ñƯЫèØ+ðô6LòžÜJä’Áö ¦R n`Ù½w¢ï~ÇÜÁËײe½+î'ó%l²h躒Ղº #_¿xV3÷,"9PSi?¶€ñÅÈ*œ’ ,ÐBÔ#~Åä¤edetV`nhÜ¢NŠïÜeŠŽ¥ýÁÍut08»†¬-îlï$Ÿº1ÀÙ…hÁÇþtÏá7ÑDN”#Ê…k½BH¹F÷"ˆ~›‹Hˆ 7s†°}0™Å¥GH¾&ç¾È]jgôq'®ý= ®îÜ.8êLn>ΠÌí%®CÏö}ú_G›6q?ù¥&×FÅM+Ý2³fÒ¥5ë²sá?p=÷šÇ¢¨‰à°Ä ÊJß´ZõôîÿçIMé ‚Mgî z®#Þ:\twæ+¦bÃŽÚ°Øa=rŸ?ÚHa´BD)ÖÃæÛ·¹rÙœÎ_Ww'ŒöDZ޹Üéöm4Yy§ÔÜùËJ² {¸¯eÍ(SFÍÌbù}uÔ£ß~"¢„£ u”šÁ]pò­ñüÙU`≸›Ø\8¶´¢dðøqÈ.IÖ«¯_XÉH“µ5-;KË“-æ5K}{->P˜Ÿ–âë 9¹O®íÇ—_&¿óämÜpñÉöD­?xèÈ/ž˜>÷TŸ‚ó÷/¯ (xBˆn¾¡Îß•þ÷Ë›¶CP`åä'&Å×êOì]³º¸àønNº¯b¤¥¶·=ulÕŠìL€Y o½óëùõó ÀÇ»¼¥<8fN?öü7àö[‹ª¦>³ÿ‹Ú„Id4uµ¥¤êwNA Ÿäò`š€Fgôé“û¹<ÙÂ_ºð½‡Á]ñ\!#pÆ­ÏÕ§¡å0Ñ{è6ëRú¦UÉc.°&:‡ô"ÇÕfMpaùrROîÒ_¾øv†cÜOä?¤üþƒù\žl 2'qĶ‘ÅsyTŠ]Ç@Ç%[Â÷4ô£Eá+’2jk¦Êq£PNGSãᵟËð^†uѲՔ-ÖŸ•FSuøMI.Qõô!j~D™ÅR,óíÍTØŽÔ—aýAìköûqÃ[†õ½ØÇiü®Ãz[üÎÃ;ï"^Nh_ciQ¾eÝñy Þ2žäҀ˕bŸ+ø1Iòm¦fŠúà÷N|Â~…·™*Á2KôfS:"ƒºOÁz[l§ÄwÁŒ;Rñ¥«(s ß-ÂÛ–RõØþ ÌÊÄvzú0åAn”Ï ?âí„søûqåuA”OÂú—°<•ï ÇľfñsÁ±ñy=ÞN6ã©=´ u’y²Ãö䣠RÇ©oÁ ñQ«á=ž¤ñ:@¿M?d&0 ˜OY/ÖÀÎcÿ*±•($A’‰NÒ.Y,ySò™4XZ*]#í“þ*K–uÊ6Ë^‘}oãdãgSdÓgó³íÛrÛe¶µ“ØM²«·[f·ÝîÎ0§aã†E+6cØ–ag†]ö“½Â>À>ÏÞdßa¿i¸tø¨áS‡ït°wP9¨Ž:\qøÂáG{ÇXÇ2G½ã\Ç‹Ž;Þsäœv8rzÕé2,-Õ@øV@Þ}ÆAó£úrê± ”#ø‰eš’A†Xf¨Ñ0ˆWe^ËʾËRÊ+–eT;£Ë6” sQ,ÛR̯bÙ ÒOÅò0j¬M‡X¶§BlŠåá”Æv“Xv FÛѨ °M©#¼V¤ 8±L£>Å2CE@XfQfX–Pcá=±,Å2'–eÔ}:P,ÛP~L¯X¶¥Æ2Ÿˆe;ú}vp¬aÔD›ÉbÙžšj³C,§fÙˆe*Âö2æNªo Þí˜;è0Êép},x+©ÊHµPm”‰—ªÇZ%凵þøŽÑ0 o%•ŽRFþÿ£éñ)Ë&lEþjù~T3‚oìøwÞ_8–ŠD=2øöAXÊÄjÈKª¡Î`1´ëuJÖ¢UÖ[ÚL†ºz‹Ò¯Æ_>!l‚2Ýh¬kÔ+SŒ¦£Ik1›C”v)¿— WaZK2³¹;ÎAªqÜ¡:+©b|j¦Ðór Õz¡7e±¶+ˆŽuÔœ³ÛPEúº9Z,$¡t ¾kÆÞ”¸cWþßzO2×è›uz“2Xù_ý¿*VÆËšI†£Ù&à‚%ªLo2Ñð BÂÿ¸ó?èúÏ41 ¨’‹…C¦ÝÄ¥ëŒTíŸ.¨åô<ÍøFÏ?éø^Iߥ(QÌKð-‰Y-ühͼTÉŒ˜#ÖbûŒƒ’5|ßÔBÏF,׋ 4 —ÑÄk ãÛ ÎÍL7ľ³R«´˜´:}“ÖÔ 4ÖþCJ“¾Î`¶èMXihV–†‡( ´}³E©mÖ)K5̯­5ÔèùʽɢEa£¥WÖ“Á¬3ÔÑÌ!„¥?ö­Çø‚z ‰¼ÅæòvÈåÅɳYhRlÑÏÕ+sµ‹ÞL„“QÀ,_XØ$Þ(MøD¬ÍEŒSÏ—µü¢ëøîˆ'7‹-«Ñ·•:°Rl«ÁÓŒ—e…Ù6A"(jù¿f~ÜfC‰e™J^S¢]íï´Pò˪åA"³ ßZxÙ¬oÄ«Mäµ&´£0jµÈ\­<Ö?š;Ê«ݺ֤7ךë”fäA¥Yo2ÔŠ](-õZ !†&½Åd¨Ñ66¶aLjjÁ¦Õ„Z –z2º¶ñPˆ ²F-r°ÒÐÔb2ÎåÕ 6טôúfG«ÓV ì£^kÒÖ — ¡jÌ”¿jDö ñŠ -––˜ÐÐÖÖÖ­Hb5Èa!¨Tèÿ·"-<˜‡”‰‡鳉ü×ù?ÚÒÖ¢Ab2‡Ô[š…ð' ;È“s†0ó chËáÃP‹èû“EÔ+×á¹ßë0T0ŒÔ‡€wÏêd-‹3s”ù-“ɸFJQ H9ÐÃBÂ~o. ølá'næý'„7V¾ÏGÍr™Ahh±˜C̆Æ£©.42¾û?À‰› endstream endobj 9309 0 obj 8774 endobj 9307 0 obj << /Type /Font /Subtype /CIDFontType2 /BaseFont /LiberationSans /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> /FontDescriptor 9305 0 R /CIDToGIDMap /Identity /W [0 [744 662 552 496 276 220 552 552 496 936 276 772 276 716 330 716 552 826 552 552 552 552 552 826 220 662 496 496 552 276 552 662 552 552 552 662 552 552 772 496 276 552 552 716 716 552 662 496 552 496 552 716 552 716 662 606 552 662 276 579 716 330 552 496 662 386 220 276 330 330 189 606 882 579 331 331 662 352 276 552 552 662 579 606 276 579 276 276 330 772 579 276 276 1007 258 465 552 ] ] >> endobj 9308 0 obj << /Length 1036 >> stream /CIDInit /ProcSet findresource begin 12 dict begin begincmap /CIDSystemInfo << /Registry (Adobe) /Ordering (UCS) /Supplement 0 >> def /CMapName /Adobe-Identity-UCS def /CMapType 2 def 1 begincodespacerange <0000> endcodespacerange 2 beginbfrange <0000> <0000> <0000> <0001> <0060> [<0053> <0065> <0063> <0074> <0069> <006F> <006E> <0073> <0057> <0049> <0047> <0020> <0043> <0072> <0044> <0075> <006D> <0061> <0070> <0064> <004C> <0067> <004D> <006C> <0045> <0078> <0076> <0031> <002E> <0032> <0056> <0033> <0034> <0035> <0050> <0071> <0036> <004F> <007A> <0066> <0068> <0037> <0048> <0077> <0038> <0042> <006B> <0062> <0079> <0039> <0052> <0030> <0055> <0058> <0054> <003F> <0041> <002F> <002B> <004E> <002D> <0023> <004A> <0059> <002A> <006A> <002C> <0028> <0029> <0027> <0046> <0025> <003E> <007B> <007D> <0026> <0022> <003A> <005F> <0024> <004B> <003C> <005A> <0021> <007E> <003B> <005C> <0060> <0051> <003D> <005B> <005D> <0040> <007C> <005E> <2013> ] endbfrange endcmap CMapName currentdict /CMap defineresource pop end end endstream endobj 9 0 obj << /Type /Font /Subtype /Type0 /BaseFont /LiberationSans /Encoding /Identity-H /DescendantFonts [9307 0 R] /ToUnicode 9308 0 R>> endobj 9310 0 obj << /Type /FontDescriptor /FontName /QCUNAA+Courier10PitchBT-BoldItalic /Flags 4 /FontBBox [-78 -309 664 875 ] /ItalicAngle 0 /Ascent 875 /Descent -309 /CapHeight 875 /StemV 93 /FontFile2 9311 0 R >> endobj 9311 0 obj << /Length1 2468 /Length 9314 0 R /Filter /FlateDecode >> stream xœ…VkpW¾gwµëWüˆ¬•E¶õ\=mÉ’w+ǵ »–•*JZ»ŽäÖ•,YQmÙŽåGB[§®Ë£iÁ1ͣĥ?h~0™2L ôW~4L§ÐL À¦Í0~00 $gW2qËvæÞ½ç»ç{¾sΊ!„#„"ÞìÜ™™è¿|‘ga?>™I¦§U#7Q!˜xªFú#”/£l9™_>(‚埡ìž[˜NV‡jþ‚òŸQÖå“§I=y”*åöùd>ÓvÇ7€²…X'PÚ*•˜múmrœ5m2³¬¦Yòw‰’MP‹¢ÄóZ–£Y Ë+`à³àÌfXÎfÃóœ¤Hf–kæý_›Q©†ÂÓ=HÄš"½ zž­ak$ñ‡eÈ„ÐCIçP+­kÈŽ¯U óRðûß8Vê§Å6îMÀ`ÿOŒNR`mkwÞûGS½Vó¿`]G Æm“Ó§¤C€Î²lCPg=^Œ÷héc ¯ bU‹Ýò-XŽÅk•¯ÙÌÉ€^ËˈäÇ [YV`¥ÊZúíX|÷Íßÿà1KôÑx׃C°o~aé‡gCç_þÂÕÚÕ5qŠW"_ö¿›k=Ë·a­ÇùÌ&P³‰¨ÁÚÐ'Z<€/¾yìÙ¯tf€ç·`~`Œ5Eº‘¥ú2ÑOÁŠ>`€MÈŠ–D!`3˼¡¤U±eZ$-Ëjw‰³Ñ—ßöyðuŸ¿ šgǧÀïÿ RàèúAñ“ÃÔì«— Q½•ô»ºÄëÃëöÝ;5kn¼¢1Ô \ÖëÃýn;û§±¡ž¼¬1Ôol¨Ð¾BN‡ìçdé·ŒDß Qô“çËq Ø0¬8lÝ%¨<¯ìHå<1aÚ˜•³|eS+s œL'_ê¡>rñXú[‹½àˆ­u‡†X¸?c®Vë,z£“5ÒN¡ÅY·óÕ©W³Ý`Ž,Å´6á|rpiÌwwÚÄ.ˆmÝX{|;+ŒŒ„8Æ©p{÷ë“Ô`{v™u ßA¥k•{•†—[2:VnÝR¹zÎåî U|ÞÓßEøÒ`/¶ˆ>`ÃpâSL´l¤Àš)\ÞªÁ˜kÕWF#è³>Å1C#©Ê>ß÷h° ø€A_|kßj³ sèPïã)x±—cÕZõ»:‹+½s‘"1Ì‚Iú*Q+~gö’]¡ÛÊï ¿ ‡?Ö·úfnýÖÎ €•ïd×?|}‚ò¹#þ¶;:Ó;½îc9Øœº>öÍ›«‰‹ù€¯Ýü´vDŸ›òÃZnäé'°µËÕ Œ‹½ïUO5ôþ¿äó’ ÛXÍ@Øÿ‚x†ž-¾GUŠÈl+–ö>µÌˆPÚÂ÷( Ç$Žte ãÞ“8ЏŽ)'ÖÉ/A€×áSÊK­S¿¦ýtA±ZKÁHízûùGE M€©Æõ5å5v”Êk ¿ô¿ª¬Ä?®¬Y"KBd,’3d‰äH–œ$˨áà /®’¤ Ìó8¯à¼ˆsŠÌ¡nu3$øZX"³¸J¡vô'‡V 8–P#Iòˆ…ñì4éÀU;9Œççð}ÿ Š”Áwß«ŠÝ²®ìÝ<™AÍ4¢ó¨›C‹s¸+ï¬(6ä3²Ï²¿1å·§Ñêqij¨1‡úKÿWû³ûòîý½AüŸäÁym¥ñ&ËŠ9Ü#ÿÒíP endstream endobj 9314 0 obj 1820 endobj 9312 0 obj << /Type /Font /Subtype /CIDFontType2 /BaseFont /Courier10PitchBT-BoldItalic /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> /FontDescriptor 9310 0 R /CIDToGIDMap /Identity /DW 597 >> endobj 9313 0 obj << /Length 434 >> stream /CIDInit /ProcSet findresource begin 12 dict begin begincmap /CIDSystemInfo << /Registry (Adobe) /Ordering (UCS) /Supplement 0 >> def /CMapName /Adobe-Identity-UCS def /CMapType 2 def 1 begincodespacerange <0000> endcodespacerange 2 beginbfrange <0000> <0000> <0000> <0001> <000A> [<006D> <0061> <0078> <0073> <0069> <007A> <0065> <0070> <006E> <006F> ] endbfrange endcmap CMapName currentdict /CMap defineresource pop end end endstream endobj 2700 0 obj << /Type /Font /Subtype /Type0 /BaseFont /Courier10PitchBT-BoldItalic /Encoding /Identity-H /DescendantFonts [9312 0 R] /ToUnicode 9313 0 R>> endobj 9315 0 obj << /Type /FontDescriptor /FontName /QHUNAA+DejaVuSans /Flags 4 /FontBBox [-1020.50781 -462.890625 1793.45703 1232.42187 ] /ItalicAngle 0 /Ascent 928.222656 /Descent -235.839843 /CapHeight 928.222656 /StemV 43.9453125 /FontFile2 9316 0 R >> endobj 9316 0 obj << /Length1 16132 /Length 9319 0 R /Filter /FlateDecode >> stream xœí;[h$Ùu·õ˜™ÜYïZ›Í:$ع۶ñ Ô´–™d4›°¥VIjO«[î.ivö'[êºÝ]3ÝUªj=üµHL!_ÎBì/„üåwãŸØ!f€7£œsî­WwK«‘4@ºGê[·ÎûuOõ°cìûÍ3Öl/ß~pkÿìü!üìöGÝßa•{°þ1üü^_:®û­Ú±Ò®ßêÃÆõã—þ®¿ ×_éãÃWcþoàúŸàú¥AÐq˜ÁÞƒë —¡s8bWØu¸þ®…ï å¯[ßëOûÍk¬´ðréÙ"c‹wÿ v¿¤>çÿuç^elîú•ùùk ss ÿÁüãï³ÿ9æ_ùàæ/mw-—½ËÄññ•׿Vúó«ÃÒ>`¥ã3|ͱîão/t¿ Z^eì—ÞXúêKotاÑü¯~úï¿}õåŸþWxå&+•@šÅW?f¿üï”®~méËKW¿6ëýÒ·ò½O?~¼øÉÏßYøè“C„>þ@ÿ+B/~¹ôö–î,½ý…ùß¾÷“ë¥?8üdᣟ¿Àð*©Ÿ¿úà/üö+ïü7~ê’ÿX*yÎÕáã/2ö ;þðøÃÅWˆRþ5¿ð/¬{åïKßÁ¸þ%°{• æý_)ýVºÿ§¥Ûz]b×K?Òë9¶Pú™^ϳës¯ëõ¬Wôz‘½4÷^_a|îwõú[šû;½¾Î¾8ŸÈð¹WÿâÆûzý2ûõ»{zýyvýîßêõ[¸ûÀ±´€žx“¸ãºÄ^/ý³^ϱk¥ÿÔëyØ¬× ìõ¹²^/²_ž[×ë+ìµ¹¡^_cå¹?Òëëleî#½þÜWW濤×/³þÊOõúóìõ»¢×KìÚÝûlÄŽXÈ<Öc}3Án°» Ÿ·Ù›ð¾«=€l`bÁOÈ$sØü#Xù_•Éð¬•ÒŠèJ§œ}øí$?×·R®6pÚ^Çh”Ü'㸫‡€·ËÆÑX‡¨IÂpH#T|ø=˜= ëœü¸;t3V FG¡×ëÇâF禸ýæ›wÄÞ‘Xõâ(¥34DÍïT„9ˆBE¢%#îK·Â§PßBTÛÙ> üžXuú' ®É‡ÎîXtúŽß“‘pB)<_ŒÆ{¯#Ü`èx>HVT±M F°­ÛŽ« LÀÁ" å,0»díloƒÍﰷᆠ#/ðÅíÊ·‹¤&ÍâÕ%jʧ±Ž¸„o7ðÁD1Xœ‘ßcðÚ [†·«iì àð‚'%Ñ Éç +‡õãx´²¼ìÑýq% ÆaGvƒ°'+¾„Ûë9 ’Iât:ðƤؕA;XŒÔˉ?¤´wަO˜Ü‘^1Å:Z-$ ̤º?aÉI=²üòë$m8¼gé®bÀUÞjÓ™ÎÙ­ ¼ù™ªÇå׬ÙþÎtöà§UL;…C²õ#Ø ÀŸ% j¶Mô†D-Ë&dêÓ=©õê_{ÝÐ~WÞRÜTŒ©x7H®€¼ïþHg¬âÕXǘ§£À!ÊÒ\ÓŒIŠÉxêÆ¡¢žP@h%»ŠeI ¯b¯œ‹’2yq]úŒH®à8Z?NYЕ˜î$öéÂj 3éF*cÆ«ÊCüªèGŽ™MpgDYã‡a'Ò¸¤AL±¶wcº«xðS8:›; Ù˜¨(›P ô©*ÅÚ2CÚËk”è¢RI;&9ïàzHþT¾æ¹ ¶q‚Fªç2UA”U>(Úž¶jÑû§kXNI;J#:&¹²¨Ë4: { ÏÄ!Ɇ.Uu_k(s]ú< úDK<ˆÑS0‰ÿ0Žº²%êo—$ö´¤+”¶–ΊU†ÌùZ”Y`ºøëlˆ °I®dË×€<ž ’œSm.Æš²†:KœSüÐ)(´ï‡ô™Õ³ø"¦“OVGkT)Xê4\´É‘>[w´y—dtu$ (NÃtGIŠ6us>ÏG]r‚:t"zT3tÅS\’ýåç¬Ñ+œ«ŠSRCŠ» IûDŸ©S"%×dæÎ.A‘Ϥ=fÉfhÏ;¡šóÔ;!ÕY‡êJF7Ù‰ÒˆLòeòôºÎIÒ"át@Z¹„_žq–S½'18ÜKNÛr.ÊTÎÔ'Η=Ê÷ 'ëXçA'ûp×›a1ÉÉξÎä¼ÕéåPE•)FÞïJæd‡ÏÌ”>UxAŸ‘–QR$'I­›U»]: |ò{Þ^³¬Ês–Ëûð¼¹QÕLÎê,Û’LÂÎaö¡Æ(RQD?‚ß=í1ubTñ´ª>ÍJu²V{:Gb}vSKm2‹ø4Y®O®lvúÈÝ«Áž€>®wváj v×È/&ÝÁûeÊÆû°FŠM¶C´üFÚ`i ºÆ«{ßZˆk±÷ˆ‡ÔÚ YÖH{ vëðii8ĨÂÎ\ãzƒaªø5˦ÜA<”EIjÃ~Ƶ(U8&’mÁU èoê»&Ю=”ß þ× -§²\‹¨£2Ò¬‚DuºÂÝøÜ¸6ÙÓ$•´ Òaî+],’@yBIT…Ïmà —MV@N¶†4ȨÏá#×{¥$kj/ã:£RѶTr ýwSÎmÒ¿oAúÛ°c“oL ŸÐMbgƒ( Üœ¬±Cú™d‡&qX%8´"Ú³žF\+ç•*Ù ý†’¯'“,Òž©IB-ïYÑÁS¤ŸE–ªtìh|-ÝQñX#]«ÚÖŠ¦Š{õœu«¤#zöÀÕÒ1e’íŠZ Ÿî“ü™Ê¦þ]ÍÙ,ó~C{7‘Ç&Îö «Ü§\´Ê$_·ÓY§üÝҒ烙ՀŸÍT²¢}“¤¶Â&§ hƒ^Nr—lÍ™šá!ONõ*™q=ÿ©ÓeϬ_¤y/̃&;¯§7â3çAâσø™æAÅN¾““)›u$g› Îš°ðç6WSs%þÿs¥Ü\)›0üßœ+ñ ûüæJ|ÆÓÚ‹0Wâ3çJ™FÏf®ÄO™<›¹gO:WÊþêt™s¥,ߊs¥“Nß“§Kêù\u/Út‰³âtiötãÙL—ø)Ö9 ¾ØS&N16ÝÍ<û)§L|bÊ”=ë>Ë)ÿÌ)“xfS&þS&ñÔ¦Lœl° T¿NÒ*k›pÿÙÍŽøLŸ?¯ÙŸš‰ç6;â'ÎŽ²ÐÓŸñ'˜F÷éÎŽ’Êzò‰2=ñáç˜øä§4—9ñášøL?³oâÃsŸÓæ—1¡‰§è¿Ë²I'>xUal¾ …_UÃ/»¥ß7")Åž7+â _l«ˆÁѨ o8 ÂXº¢Ca†r_ ,áA_¤«/ÒåÙpžqß•¡#”hé·ñø­S_|ú{{gþÊŸ˜àìEÜqè¸rè„DФÂù¶ ‡^D_šó"Ñ—¡^½ÐñAutµ ,ö¤!â@8þ‘É0„`/‹y`Gt@hq_&vêt‚áÀ îu°²ô#°^™LR¾ Ä\áDQÐñàÇÝ 3J?vb”§ë ÀI7"!ˆvÐÀüå›$I(GaàŽ;’ȸ(æíc‰2ð‚nî Æ.JràÅý`ƒ0CO3B¡2%Gêb(QkNõy.¡ˆ$ø =U«?Á…²#4tÌ•éˆÑAk ÝЇ>0”„è" ÷ÊNŒ;¨_7@°¡BÀw=Ô#ZáÜrÎ^°/IE$@~ƒ"µ‹^e î‰¨ï |Oj«%NAÏÀ‡¸Å0åLµE|4’]U”PÅ»Cç²Ð]¯ëa 9ƒB@Ôq]Ò\™Ô A®ñÀ 92reäõ|£§r0B‰#‘'šä„$90 ƒ9ƒÙ4N"GF ÄóGÂË…9GuB‰_Ë'X\DhHôK’bN†„t„n$Êi–‘wrƒ—1mËd2ðL]çËž„LBªcðÚd?ðRÁäa #œÑÒËÙH¼¡tʸà™SúN,úN¥_° F]Ý®û®8•“pJÃÓ¼Ìjr:ɬ+ àÈé$®Ú£%KYtê¨ê–ØxªôRù€è†“H•^w_BŒ°”!°˜xe:Ã@y"rÀ °0‹ j¥3´(³P<9 G¡(¡C1ÎvCï›úõ1EˆLä’%(£œRÞ¾U6ijŒ$ñünµêd¾N¼’´ ±èq7ˆyö*‚sê¸.Ü:õ¿<\NÄU$ÎÓñ¬çìƒøt¤‹|‡(EÉ™1£AÍ~‘^I$½1z%®üðÔz%®öB½¿Ä^‰g½’8g¯Ä }Á9z%~R¯$ÎÞ+ñ\¯”OßB»ç9‰Ëj—¸n—Ä…Ú%^—ž/»eâ~ .Ü2ñKm™¸n™Äù[&>Ù2‰ó´L|fË$ž¤eâ¶¹»õõ&Šmnž«;â™æéŽxÒ‰‹tG<߉suG|fw$.Òa°%m|ø‰x‚ƇŸÞøˆ34>œŸbïðÙ MœÀ¿KM¯ÀGå"ÿgp™ævàg™fg.ýU¯B_Á^ñ¯…§ÿÃåï‘·ìA±:¬Œú£e]1Ïó9ÿ b±• endstream endobj 9319 0 obj 4256 endobj 9317 0 obj << /Type /Font /Subtype /CIDFontType2 /BaseFont /DejaVuSans /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> /FontDescriptor 9315 0 R /CIDToGIDMap /Identity /W [0 [595 831 831 ] ] >> endobj 9318 0 obj << /Length 378 >> stream /CIDInit /ProcSet findresource begin 12 dict begin begincmap /CIDSystemInfo << /Registry (Adobe) /Ordering (UCS) /Supplement 0 >> def /CMapName /Adobe-Identity-UCS def /CMapType 2 def 1 begincodespacerange <0000> endcodespacerange 2 beginbfrange <0000> <0000> <0000> <0001> <0002> [<2191> <2193> ] endbfrange endcmap CMapName currentdict /CMap defineresource pop end end endstream endobj 4039 0 obj << /Type /Font /Subtype /Type0 /BaseFont /DejaVuSans /Encoding /Identity-H /DescendantFonts [9317 0 R] /ToUnicode 9318 0 R>> endobj 9320 0 obj << /Type /FontDescriptor /FontName /QMUNAA+Courier10PitchBT-Roman /Flags 4 /FontBBox [-44 -299 663 858 ] /ItalicAngle 0 /Ascent 858 /Descent -299 /CapHeight 858 /StemV 81 /FontFile2 9321 0 R >> endobj 9321 0 obj << /Length1 16812 /Length 9324 0 R /Filter /FlateDecode >> stream xœ¥{ xå™ÿ¼3#ɲeɺ%ëK²,ë¶âC¾ÄŽÄv“ÃÎi'19'˜@C &¤!„”(„4M)„”f)–mYŽÒôø³”MY¶KYÊB¡KZJiéA©=Þ÷›‘xžÿöYçù¢™oF3ß÷~ïñû½ï' (ŠRPõMUnÙ>¹ù›ÿd;ö\GQ5ÿ5²ixã†_µ¿CQµ«±/=‚‡Øj<ÿž{GÆö\ó«}u9<’¢àKÛwlþð›tœ¢rxý_Ɔ¯ÙIm£ÖPT½ÏÝWmrž©<ƒçUxÿ ¨M³{½ÌAá32Þ/7œ)Júy¹B›L§Ó™¸É¬õð¹YnÊpñ ^ñðZ?þñrr‹?ÀËxÉdþ ¸ ® z (ì$tÖHçU•ëwBiq:à@a7TV˜ [9Ùºôö6‡ýîˆÄŒ–£à¶Ó®pÀ §3«ê8¸æaÈ»èv/ú¦®ŠBS\ЙÚÄÛpðÔªÙß²›ÙïP <áRi–Ù`4’)àhZÊlÊÄÓ™t:å÷äøÇ{pØ-gÂY0“Â>pÅ{èíÐYº¸´ÿ¿[N¯Ëd hsuÕ4vy î\•ÌÆÚ›zËŠ_„Ò ?£š’Ö½áàób^{.èòµl¨…¥ÐæóP¸–MÂNvŠ9Eé©ZŠò‘÷¦DišðÏLÆZ“)']D–¹"•äq 8öx"/oi%ôÉöñ¾òò¾ñöÖñ¾ €h߸pSÝ#Û‡Øß °øàC럽%{O^¨4™•…¹E€‹ðÝp°óxEßݽQ¼Ô»»©}ÏŠ°°޵w4ì}`óèù­G†ƒ­8¡¿}à µi8v¸öL„9@Qf;ŽW$JYp ÷Ãèભ4½uÕà(,8¾¿g`ÝòîašÞÿ¹à×ìÒì1V.»›ÒR” òR€\!ŠÑJ€°ÝYf˜¹%p:Ël²Å:½ÃÝ‘Ÿ1é]0.÷ìog_c_fî£Rx¢7¡ò¥3zYfž“Õ”a<óÈ C.£B+8ñŠx{†šR…˹²¢7#ApÛ…+ƒ™œ#xözu°œ/S|˜w5,ŠD„;‚•ï…Ëu0-d£!—Ÿþ-pe¯#qÑÀÌœ…Ó‘0Ç ô´+rÝ\ÆÁLo§[)d ý(Ó+$z…JŽhø·fÿ›µ2OPh›( 41¢/D™çô‰'*T'ˆê3¯â¢² øDÚdD{üIËäæG¡ÃÝzöК/nHà ?X¼gYÙ²®Dçd6è·ë¼®&£Ó¬/, æúÒko_{åÅf×.úº«G¾R¦Ñ–XL8§öáÊ„»ÇžUš+ƒµµÅCQ $âA¥)RéÔ(³Å[jÝÙ%-ýÐÖù]z€P-ã,zœå²!Ô­ Ê‚8-7‘Ðr£ä|pာ!™lÒ/.£\N_pÚ…×z`ÅóÂK½=LA¨ ü>¥#u|™Q®09>lT¥…^¢µ}æ@ ñ)¼‡Öh(´'þ”C£áp‡Ð6¡mƨ2‚8Ÿh|Æyɉ2Í x†Âˆ}’/ $aÞ†ùy»f¥².ÛsW5»{Í©ÉæÜÄ©µë×vW”ûbÛwùQ6haiãöî0@y÷X}ÓXw(Ô=–¢_Å‘¶Ûw4LœÚøµ½9hj›\º{ j #®x–vd÷Ñ¿@Áæ·v†BK·Ö×v‡ˆ¯Yz2Î<о&€jã_ y#û ÿÃŽÃâÃÏí|öH{û‘g'÷>wxñÌŸ»oX¯¹¡»ë†µ €ÄÚàÅ-Ü´ ã¦GF¶~ûƶ¶¿ýA|ÍÎŽkS©µ:º¬Ž£®Žáªîb£"D¢ù÷$Lé9߻л%´ü‚•¦åëÿa…=Z0j\V-Œ¬½æ_Wg~¹ /á›é]Fß&.õQ8µk@oÑ‚¦Ôc¨j£abâ\°5àùÅÆqŽãÚÌ ”„Ö`N€¥À€•&j¤=-p´þyG+†¼tåc0ŠáÃH<•ÿzš\0™˜Wz'[¡²J©„¾µÍÇz"_¨^`¬Î/wã€+Í& Ð …åþЏÁœYí`ô±­1ò†Þ6)èˆÙíAÀ…ó‡¢û÷‡Êy«4“ÁŒB_§¾ZÔ9C~éþÓ× :Á]7@Öý0®ûa”y9µ¥n6%¤áòZ2•9 …p£Á(š‘u½ˆÞ(ª/.M—Šé,,ÎÞד­K<ùLÿáõ ŸÓ^×Þ—Þ½óÚ=»¾ùD¦îÙüÏK¡jøÚæÁ­pöÌØÚÆöÇþØy°–Å­eå®vîbXWôÆ{›®žÄ08µo¯õÁÊæ¾QW…z ×%‡8£”¬Ë¼¥ã@9Ñä!í~ÓÛC¿  mÿÈažèЏÆË¦æ zËÔí³?e3ìj©èW¥éÒ¾€?“×v³I2‚L2E\`ÃÃó0›Éj/pxÙ`4‹šë}h²@øêé_¯cC®çZZ§u9½PÓfW)ï„–ëkÖŸ™h¨¼óG_Z»B»o;áÖ”h9gÅtYyÀËó|bÃá^°Å Î=Y *j,>ŸLv1Pª³Ý†ÓÉn¼±£kç5Vƒfhi´gt7ÙRa„ÃÊ¢wÓhŽ^ØÙYö‡ì×ÈŠƒó’NµC[‚¸-½x€sÖ£k#q†#¸»Ä˜HL6o? GcÂS&n©\~7­)í´˜åϾ*/µ´J˜[åò.Î$üs<Š‘÷¾õÏ+­ŽˆÛ"б¹¼A\|¯«¦KKm ³ÐÎôXôó.4»¼ö ×5ý=Xª7“妞Å1—°g(®¯½mÀC"µ<Õ$#Œ•ÀEClv÷[oå²¼jæ«®ˆSƒ¢©ÿ¯ÿªÏ"ØÑÛéuÒ•=ÊLѶhÈÔvkÔFOï‡Òòv`4ŽÒòR|gëì›ì öyªß¹ÐQ'ò*!b‚TÚŸ÷ & <©¹À B ÞÍû«×žšÈe¶Ü¾jõaŸB¥µ[B0»¬Nrñáæ?ýòŠ÷½~øÆ{–Z … yO =>À¢v»®{l÷Ä`e—Ž/ÕPÑSµ2¥µZœ.€¡‡Þžºí¯¯ŸCSd5©T`‡¯Ñém ªå7òó ¥#nçâ&iŒ(©€è_9Ñ®ó’DSJèµ ÑÍx­6Ï»ü½Æ·låò® F·Ý?ÿ¡¼TŽ(ÇñÅÐö—¿î½àÖ#?}wÙþ>„9ô[âvTîÞz[ ëÔ—¤¡­Ô®a¥­·›Ûé3°†V­‚™ßÀ=ÆòîÚ}Íz@Ï4‚ži5za%E˜;2.>¡2spH\)°9nÞÝT3²“PÀÇ–/ÝöZÖ|Gð®#*ôÐ°ß ^›Ý ÖãFðØ²¬õÎÆÆc…S¯7;mu¼êNuúYŽƒ<è߇Füîà 8Ýàr Kó‡µxÔЈW½®FúÆÅ½÷ý÷ɪ<«R+s¡¿¡|(tbD2~Ñ}æ­ƒŒ˜G©›Qúè\<ãgN OÂj j…p™ÐÆ] ›ý<òÿ±±w^¦ÙÓHR—?p®zéÛ0£7ø¼H;mÛÖÓFðyRñ¯}‹÷A[;Ì܇¾yÓìË3'e”ÐH© ËGë#"ãIùÙ‹‹-#{Q‡k+4‚I×i.µ™:ËÈ 4³²ÏaœDD¬{†Ø,ˆ.] ˆò ¸sÔP!7MÂN¥Öì)Íx‘ËãºYøa*ôÚ)áqáá«£‘ʤp± Æê¦—Û‚$ e˜ó¨Qmô"0}73¼?‚ãi »P3jÐ^Eí®•˜†!Íz“)ÕÐ(1"$ï'Z§8„„‘EŸ‡¦Ú«@ÅÃᛸxyÄö|‘Ñ]¶£%’Ðè~¬ Ú¨Iò+†vÔ ƒ8Ä@yQé¢E¨´e-Г¬L¦›_ÀÑ#/… иSeÂë—«­!iéÜ÷ïY2UéðhåЄá{·ËßNÛI²ƒ9 ÿoÃf‚7;1¦NaLÕŠ‘\NBêÏ`ôÈò©uqxú¡î©¡$@rh ~=Ç01yáxWÏñ {'~p¼gäö?¶÷Ò_?ßûØþ¼ý…·¼ àªßþ‘w|à\SÏìûì­¸¦ÍD– ;‚w¤@FL‘Ïþù‰£!böJo)e±`€6©5VÃ^(é hç‹W•F½H¥µA©2˜]æµ½õF€e…Jô†ôbÿ±½ÜŽl7¡KebÓÛŒ–" K|ÌïÀBE°U k›þ5³ÙhQË@ïÈ» â#Y½ÔËáL&©£ìv-åÈGG"8ðçy¦`»gX_,PŒ±Îoš~§Ô«ssá ýìL}0̹Kü¥´Î`·} Æ ñ6ÝU¦Î êC§*&‘¦ØÍÌFb=Z±Q‚Lâ"…é,s  nú`Å¿à¦cíX =‹;:ã“^š}ƒ¥ej|Ž ½Ü|æJ $â‚ëM:=MóšÑéè‘«NŒ¡­;qÕêc‹X½óš¾a箃,¸•çþrú+:·jÕ¹?}åô_έdOƒð7Af„¿‚Ðs€ŒXq/ÚÏa椸â3Ÿ÷ö&) –ñGÀŠ»|>YGûÆeGh”‘¸f@G5]Uþ(•ø—†*øY¹p\šâQ8…éTìj•òÅŸ!O$^l\„ºJ¡€:á)UÁNðq K¤ PýóŸÁïFÓ í圠ÑÓ.?ð¾6xùehóñÎPÐ Â ÂcЈK œŸ ¾B¦ÅLË (7N/£•¢°è;ÅD‡HÝ< ™´ü0ùÔÞW=t7踤ç´Y§·?kôz4l,2•©mæöv³M-c9yy!æà‰Üžœ}ƒùתQÔ¯+—D‘òF«c-Y<³dÄŠ|úè²£@vËFHßܽôÆõiŸÝ”jZYî¬r½¦;˜tƒ>-ÜŒNgÛdí†e5F.X³íÖåb"Ðx¿0Ú8qš¿?[kur® 2 w¶»²sSq¬¨´”s*™~rUzÕF4DÃ~§·)åªÞv|åäƒ8›—á^f½(á<9“Ò Œzrs¹BAb¨LüŸ$|3éÿtÀø×ˆÜŸ>ƒ¥Çb›ðQ‰R©’Ùä˜žÒØê-ruñ_**Q˜­ÅOÅ%·Ê‹”Êf\r¹V¥ÒÊå›ã2ÐbŒQh幟«Õ…ú(:¡>2CIT_¨Vÿ<'3ÈÌ:­œ¬@Ýìëìm諪Ñê´¢0Yígø)­IJ0‰yi‰oø‘Áσ³'kÇO­‡oK¾ÉjúEU ­´Åj‡á-K–îçuº"Ú¢o¨ÑFr/:£ÏD*V7sÛ¶öÔÐð.Ý5ç“Ê0óã<Æœ½fm;íG¹Õ¡±LÈE˜ôzÄÅQæ11§J—Ÿä ®Ä¼ó0]±RIIÈŒ‰ cìê½·kì/Y|Ë?í|ð¦. ËèM–göÕtn0_s°{àHÔt/¦w|'W À„B°xê‘-[½±=ÚÙës¢¡hƒ.Ÿ¯rðºÎökVÆaŲP@Êù/v²Ç˜û¨ <¸˜µóÏÛz|.˜{D†¿\²Pxh­NVöü%ŽP=Û 3 ¿>Ôëj²Ñ¨p©Òu°ãþW‘ò–Eà…º¦Á0K±jW°¡°‹žy• Š 9 •œÅ„ç -ä„6*UÇì{ìŽ*Ir„TæóK%œÈH*Ï(ˆ}ñ~ µÙä~Ø ÿ]$åU‰ÎñÀ»`ÑÝ$¡„ˆ›@åW–Óà †È’µ±‰«a¼!“¹9 #¡N8ݘk.ƒv/GŸ7y-j„~„ Uƒõhf×ñ„16AG †Ò‹Ø))æÉFÓ™Z½ ¬¦éçMâÆJ[uf³n+Š—¡.¢¿§Ð‡8©JªóI5¸Â¯È.À„Q3sÔÊœw+pzóhvÛ]«OlÇȰ}ãÐ&ÈŽ<>R_®®?•ìGæüº-[?…|n03¶Þ ô;³8úPä¾M½G6¦Ó¯Øz*\qÇÆŽ†3èʇoXòýïWöÔâW=µ=‘ä û7ÍœMöc½¶/9vpõ}D?F&­ÆxâÅxÄ5no4$Éàļ•!ù ‘„ Dõ ¹ÔÒíÈä_Ÿù>çßM¯ÉÖ@‹È1ŽÒÖ¾šžë¦¶ÄÌW†>þ€ä¯“â;åè‹{©Úy&yEZЬ…_ádˆ/“¥´Ôe¹Í¥îEìk¿­ ,(Aœœ´ôÏv.ñíÛŒŠb­Í¡ymζV9ÝÜ,—ý°gô|rEÖ °c8Ú×R©Ti]ö@¸¢ÌÈk¼å*pZYUÿ¡5•éGë-½U­}4T´.kqÀ·¿,^N×#—·ÝÓ©>u`Ó½¾jƒ'˜õ·õƒÖîÕª|> ºÏ‘ʘÍ6NñVaaÐ×ÿ._¶½~÷½{eïAæ%±Ä”QGâÏ!#f4Ò"ÑÀ+fÙ|eq.¯Aj8{xt‚K!Xäà€pèxzØor:€.á÷ýÐ ¼á°?ÓZ.É£Í5°ìŸ¬¨– OYÒ¼¼^Ÿî9IÈiy‘ÝÖ„(%RúúE1¯(¥7(°…Û!RNPïo„ÌIÙå!žÑ§MI Ѽ9í‚öˆsƒé“µ æ¤Ó>ójÉik¼pH¬ ô†}1Ûqî?ËtEÂﱌ!7–‰eŒCôY“Ŕptéøo¾€Èeצø)ö~wÀqeU¨¯ÍÎ2ï ½b”äˆgD+õ(¸9%‘ñùÀ’Ï Íå†$$@R*úK&[ˆÐïn,2û×?D Õ[o]1òd½¹Àì³zLÚ"Ïx}e÷"lí®SÙeY;$ótB0°wÝWï¼gÕÒ©MH­;jÍ~[* :»[]ž¾~e:7yðÄêDw.m†ˆ+¿O¸šI°D<,Cå´Y®“Ê·’¤¤3 0•´ï\ °rpo{ .™>ŽUBÒôr¥3—›£w¿mÆ0[¦<:—·E…eP“+.žÏ[à70 ´!EÝÄ®kÔ-³¿e§Ðý"²“]bíÔ<Ç–H~9•W–¼þè?«”½9;½TÊ:tÉËž0é7ýtÓ74Üs·}–”°#}ãmR²¬¢wœQÁ»Á|í é‘ÅÖsÚo<·aÃC õ˜ÉFVN´µìéCÉÇú÷4uLôEPºÅÈ žGé¶ 8ÁÌsy,faÕ‹Y?WÖ{ò0›cÝñ<‰ Ù_zëkêTð~ªr$UPàЩlAX±Tºt?VU„BQõ÷Í&c…[™kkEJ£³$"À¹(OÃ{ônŸ ¼®2;LïvòܘÕ3Ï…ð“ ѹéûq–v7sØË\^pùˆ_ Íþ'{ñCPÊUˆÎc.UÁsÒȱãJ€s Ú´ñx©·Ô¨‚ÅJeut /tSÛnõoÓ:=¢›Já]D7ŒZ,DC¡‘³JÕFÄ5¤r 3“ô¡ydCjÿ;„§™ Xû' eA¥ZψÜÔŒ=˜“œ"åëí4½}Õàh×$«Ñ4*•Èi%h‹_r›é”´g~.ðEj•žµ°ˆÿi«V©(3οgö-¶—}NÌÇ~¢»qä ’øs!íŠtJž–¹ÿØ-Ÿ»xOoß½?Ù¿îìŠ :ŸKíŒGk&3}Ç·VWm¹} ÖßUÊ µ‡™ÚauòìÁ:Ö=ôË©#o}2&n‘Ç…Sã³­ÈM~cÇÄ×5Bi¤ÎÃ'y-”•û÷X}Öb’•¯p óûUOÆŸždÒTÌÆ¼{÷£qK1-žÈqüò­ýÈÍ}™Û€´ŸÛ|  =š+»$âv UvÄ¡X&×÷£½A %¶ªª¶@ ÓjªtÐ2•ÓáEFšØtׯ\ß@™NYÀ»ý~¹ÒX1ОÃNÄÊÝW‘L®pDråëZÇ–WëJ2Ëv´“º u”`×"ê£ôó+a ¬,¤óqåáÒ@i‘Êæ·26³ÏàôòþLý=tÿàqz*èWUzc©Îh7h …£ªbÎåé¡z´e.»DÉùHN‹Y™a>"¡ÌˆX$#ÆTQd)Idsã#r¥å ´UW·Ô 0Eüæ [ +×M6X̱%ñ€ÇåŒvV9­MŸÛÀQv&O™Aδ®kß±,S¢«^>Öº®¼±Â.—É4ŽRô•‰wmʵT•¨vn¾@©+èËa'J/ìu;‹d¬ÒÉ‘Y›‰B'ɰ#7ˆ<4o%¢‘üá ílW*% /÷k+˜¶ PaU•Š–P£+4 !P2ê%ômû>© ™c;Õ«°tçuê³úŒóY£Ìüù$¬)’µ”>?!èÜÿRhéö²—­{´¾a[wèÒ§»à×3ëõ·U¥¡Okñ K±fæÜªî®U4½ª«{ÕÃUKñ,]K[ÌÌ›Õë;ÊÊ:ÖWg×w§t¬ŸþÂ.ŒUx”¥}Ÿ•ΫKE §Îâù#M+hzESóŠÍ3a験­E_–%qjJ…ÄSç\QRENÊ\tèÉ»}¿ŸIxÍrOÿ×óþà£? ±6(v'øVSÚàR2‘Ù'a€ðƒ'Bì;ÿøø?ÜçÐ0[ˆãæ=̼ûk²ŠzlV`~/+¤âýqsñ#•V`®h…¼.K‰0—£6JY(=R¤=©j­®×i—)eÈÆõê"¥ZpmÖ¨´Æ"aPm¶[áå=/‚®/ 7õ"΂“ Z v€"µ’þ("/¡µ†™¤1̵¸g=|Ø/Ñøñ¯³ï1ﳿ#è YM&%æ³D:$ú!¯A+3¥ô>X¯§!3³­VQÈ€ËË{qÒÂ>9„Ú”š[™ryR@W jT¨‚6Y9,æñOx¢>"R•dŒ¬I1/'ʼn´Ÿx:úS²šçÏ&i³‰~°¿ô©äªFT”%ýÇ/=4X;þ• Ël©BS½¥ód?W»,V¹¢–OuwE¼ió±›q€ÌÆHn¿ ¼÷›ÿíÄÒšw¯¸ëê:´‚mÙu-¤:Ú¾©¶n¸Å ŽÍ8Öf_3ˆZqe~·ˆ¸«Bä úËŒÀCÝ?”Ÿ“¾nYŦÕ¸V Wöå¼&û…“)2ö¶Þ;~û’ôúñÓC}G6¥«GwwdFª×µøàêÍu5ãt°c³ðø+;‹€%C§G~Æo~þå»DÕí¼{ðªc5MÄ÷žŽ"ž?Cv*Ê.;¹Q›¯á)½ø¬ÝK’ãÂï=>¤~Œ>àµ$s¹vTr¿íãN/ç²¹¤êÎ.|b¹¨åZ©^àŸÛ°`¼rþAJé øxsæ½³®ˆCƒÐµØ#Ôº"ÎbÈ4\}B·W ³óçK‡p‡ð1ºRøÄŸ:äUWÎ ´¼äÝÅ7æçˆ§ô¡³NÞí•‹ø[—ðG—›w²ßœçuÊŽ“Ê7gw¸ÛÕÒßfîÀçi)’$wЬ©A*ûò=É©ç‘8Vg3!í¨¸Á¢gdªðŒ~ ì–+W*äÂm©OöºavšÝ'îþ¨DJâyfNÇ=sJ”k4¡RiŠ~/V›”§j«þú€KÖÐ-Ë—¿}Ë~~Ïò¹Ôæô~G ã(3%xí½÷^½:Ù%ö*û5ôéd4ÌooÎ׆|†3‹)_¸¹:RSÅ|ÍY¯×ËÂÃŪD9N7 {—-›î‡éá5Õi(vF\PR ' ”¤!~ékæéìºg_euÄe µ è€÷ߟ«[“í_Næb”ÔÉ¥8ƒ™÷iÝÌûR¦Q`OทL„˜F2‹•M©ž%Êt¾ÄI¦”1e@;Oò‚ž£š—wzÃɫۯ¯=¬)ry†šéH¼X“Û:¼1 7¤t³ð*®½N£Ö™M¹XR8×P+—e ô' U: ‹FŠ&wN[,%€lâ;Ÿï.†½86à}40Â(ÜŽr±>êç%.*%R]>«‹zªû³wLçscó¡faBz>ä(2WòÕ¼C¢GºoN¥†oê^zÓp 3üùKËVAج®ÈuÇK»—…½)7МIãæ¼FGvQ­«kå677ù£ãètzïx~÷ø…;–¥7ݺ«vÿcãïÏIõʉÇö×îèZiqT€ÑŽáÈhÓë\ž"pTQµýÍ8Ê@ßWß¾uê—­XûЛ7ïüÞÉídE»Èþ{\ÑÙÌS!gM~u ²Bµ-`ùÙÉé#aHn?³ƒ>°p#\~—=+;!î²Ï·ùê²™¹^ÉíAåÌþ ÑéW6-—Þ$Ûª³‘`¨×‘<ÀùÙK ϾC‰¨ra@/=RÚÂB çaCÿF€ý+×·ðöyà uéLíáÖUmÍ4=ÀŸÙç …<ôa™lQ#@ã"Žu#µõè©)§•ž¨åĪ$½*î6‘6 øY‡p'<Þ€p—'‚oÑçABºG\N? “â/‚ÓãKwíó{¸¾iЦØNú=Š#œêS^ä '"—OÅJ©ÖòÄæ‘-©ô†n²¿Kδ“[F7'ª6u‡éŵ’¹—òg¬ÊVMƒÙn´ð¥HèbU$Æ|<ûæ”`LÌkäëù©ô•¾i¾ ›þ¤«c ~%ðâ– ¬92A׵鶎ƒ›²A$ÔJÄãÞD£wÑ`ÎÆÝ½>^É ¯ì߸$C4[ÍûÊ<=Ü’þ­K¬I¢w⣶õáˆ3äW*õú"WfI$»$.µ4+úV45†añô×é×E¼p-ðdï6Át{Îa¢9:z8ê¤ôààázYA"Q nâI"—˜e'ñûõ$¯•g§sÁT¡q·m¾@ ¢­äaN<ž!?ܯˆYÉç!'œ„ý»#ádºÔ> ”ÕT%ÉN(äýô¡õæ*B-ÓþP*!×¼÷Ë’â0B‘ŽéV« 1šóxühá7 ÃÂWp­åð{xO  °Ûë§…g ¿·D*®f°“=Μ¢‚âjòùâEjŸûô/Ȇ£ÏØ_Èìú`))4~·;5š Šêªºï^‡ŸÙøÛ›&ܸõ[¹™£á¾ñöñç>}ã-­ã}‘YJ*:ú=¬ZüÁÀð€ÖçG7?°·¡£j.ÿÒ§ew_ExÅm(¶ÉÉ©b±æB’ i“ ã+x…­á(V³…)0##¬–©Ùb#Kô÷ÙÌ‹²*Kv_ˆ‹•ß*@~‰"m©ö´âÖ"mŸ7"8 (=>È¡ÿˆ29(‹Çg/± ;D)El"—‹õzÌù×$BŽD fDü2ïb¤„ÌeHb¾,Mú;¡îP×b =ϸ4C/™Ei‰µ6fóÚ’ê\.­Q÷QY¼.íLU”é¬> Ù€­*Ž­,_4ÜQ¦º:!Ò·»ùÔËehI]Íe»– «”9úGGäñ À×÷% 7Õª¨°Øimu¡Þ7&ÓãÁÎk†[÷T¢î°Ì]¨#”EªÊxyFP ¢m¢ÐzMzá’\îÖkT`sQ‰ÎwÊz ‹Á"œ.*)´–B˜„_A©µ°¤HÚ¡2˼¾TòI†Br ½ˆŒä3 ²/R*¢¡€³3ß‹%#ô¿—V#z÷Ù\Y¡¥{¼°oæ{Šóûø0³Ÿi« U‚ËQ­!VÛ#î_3ƒéh 9O­Ô0!”‹Û¯R •›}“=F}ŒQÏJù¯Œ{2ñxîç,ÜÂ3x ºjk»izYumÜKN²fº‡œLÿºk¤³šî±j’Ý5‹–á‹Èñ¢¸ëÓ'H?¥_ôÈ\b0MöÈþoÕÃÃÜMr³‘[xö¿ûÅO—p 4§’ 4ÝO&ô @S2Õ„¼ q™î÷s 6•jæL¬™¦å¦Ç(aqg8ú#%²ÁÜß¿7< 7û¤ïq+óß»W¼àZ]¨B¥a¸«dþž½ãwÐ÷¥þ‰5³jY5Ú àlD)÷!ÌRWý˜$¹2‰›Íy`ÌOýÿB6…-P8^—M÷Ö¸À_bµ—9ËÊÇë³ÉÞEnðél6¿Ãý÷óQæ};‚o>–ÐyAo3â´\,¥Gaz´ð‰Ù ìföw$"#b: Mh‘Ç%ò!S„ÈiDzùOЧšZ-@ å»}°ä™2¾eby‡.ágÂEᥚÝg6—hÍ` 7‚­,®e¯ÿÛM./9nb¯GY ÐÏ?ºüæa²û‚øê ÷ú‘ušš?QTõÉ?i‡1Æ äóøfPx… ËÄSq/╛؋h¨½^¤±5³á~ü¼Ä^œ}?ü(¶³Øa[m í0¶§°ÇÆb{[kþyýØFòÏÜ*=—ú¶§ñ¹/ãg ¶ZlØxl“ùû_ÂÖ‹ï•ãç“ØÈ½9lë±Uc[Œí$¶‹Ø~œoäùïañÂ)läúÚüXÔØÂØ·?{ðÓ'õ“O±ï¥üË?ó<¶¡|ÿ ÒóÈ{Åç’ñnÌÏ}q~ìKó};$™Áùüù¶ñüø97‘ËìEÚ€ŸOà9›Ÿc./בü³'Ä•YC= …ˆu®‚Çà't–¾–~‹ñ2#Ì/Ø$;Äþ‡,.Û.û©ì§ò°|Rþ3E½âLAQAOÁö‚Pš”ýÊï*?(4v>Yø›¢åE«dª•ª3ª?ï+þ–:­>®~GÓ¤¹FsN#”¬*ùž¶@Û¨=£+Ðåtgt?Ô/×ß®Ë`2l3Ûvµ½Æ~Èþ‚£Êñdº;EÛD­¦dsù©?ÕH|«Äã')* ”ϤcšRSÿ‘?f±ÿWùc9UrŒ+;¨Ô$µ›¥¶P#Ô¼#†ž,‹¾ÙM SãâÿWãÿøÿNü=µïÇ{7!ssSûð »©mx´ŸãÆñŒâSƱíÆ;†©1ìëÀïnÀ8ïÆ øýíøyùãâÙ&üÜ„Ÿ{ÅçJ÷’Ñ]MmÆ;7bïÕxï(>q;^%W&Ägï1“ñöˆïÞ€O]Žý[ðŽíxÿîÿïÝW^'W/_k¤z©>oÎ%ñ?&½H6 endstream endobj 9324 0 obj 11692 endobj 9322 0 obj << /Type /Font /Subtype /CIDFontType2 /BaseFont /Courier10PitchBT-Roman /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> /FontDescriptor 9320 0 R /CIDToGIDMap /Identity /DW 597 >> endobj 9323 0 obj << /Length 1064 >> stream /CIDInit /ProcSet findresource begin 12 dict begin begincmap /CIDSystemInfo << /Registry (Adobe) /Ordering (UCS) /Supplement 0 >> def /CMapName /Adobe-Identity-UCS def /CMapType 2 def 1 begincodespacerange <0000> endcodespacerange 2 beginbfrange <0000> <0000> <0000> <0001> <0064> [<0068> <0074> <0070> <003A> <002F> <0077> <002E> <0073> <0069> <0067> <006F> <0072> <006D> <0061> <006C> <0053> <0057> <0049> <0047> <0020> <0042> <0065> <0064> <006E> <0045> <0023> <0066> <005F> <0056> <0052> <004F> <004E> <003E> <003D> <0030> <0078> <0031> <0033> <002A> <0055> <0063> <0079> <0075> <002D> <0038> <007A> <0024> <006B> <006A> <0032> <0028> <0029> <0046> <0062> <004D> <0076> <003B> <0043> <007B> <003C> <007D> <002C> <0025> <0050> <0034> <0037> <0035> <0054> <0036> <0039> <005B> <004C> <005D> <0022> <0044> <0041> <004B> <0051> <0059> <0048> <004A> <005C> <0021> <002B> <007E> <003F> <0027> <0058> <0071> <0060> <0040> <007C> <0026> <005E> <005A> <2026> <00F6> <00E9> <00C3> <00B6> ] endbfrange endcmap CMapName currentdict /CMap defineresource pop end end endstream endobj 1409 0 obj << /Type /Font /Subtype /Type0 /BaseFont /Courier10PitchBT-Roman /Encoding /Identity-H /DescendantFonts [9322 0 R] /ToUnicode 9323 0 R>> endobj 2 0 obj << /Type /Pages /Kids [ 5 0 R 107 0 R 212 0 R 310 0 R 412 0 R 509 0 R 608 0 R 713 0 R 815 0 R 918 0 R 1023 0 R 1126 0 R 1229 0 R 1329 0 R 1408 0 R 1445 0 R 1470 0 R 1498 0 R 1514 0 R 1538 0 R 1584 0 R 1613 0 R 1636 0 R 1657 0 R 1668 0 R 1698 0 R 1745 0 R 1755 0 R 1770 0 R 1779 0 R 1789 0 R 1804 0 R 1817 0 R 1828 0 R 1839 0 R 1846 0 R 1860 0 R 1868 0 R 1881 0 R 1890 0 R 1899 0 R 1911 0 R 1918 0 R 1923 0 R 1930 0 R 1944 0 R 1954 0 R 1971 0 R 2041 0 R 2056 0 R 2063 0 R 2077 0 R 2087 0 R 2100 0 R 2111 0 R 2120 0 R 2129 0 R 2137 0 R 2147 0 R 2159 0 R 2167 0 R 2174 0 R 2180 0 R 2186 0 R 2195 0 R 2204 0 R 2213 0 R 2224 0 R 2231 0 R 2238 0 R 2245 0 R 2252 0 R 2260 0 R 2266 0 R 2271 0 R 2279 0 R 2288 0 R 2302 0 R 2307 0 R 2315 0 R 2323 0 R 2333 0 R 2346 0 R 2404 0 R 2415 0 R 2430 0 R 2441 0 R 2454 0 R 2468 0 R 2479 0 R 2499 0 R 2523 0 R 2533 0 R 2572 0 R 2600 0 R 2613 0 R 2627 0 R 2664 0 R 2671 0 R 2678 0 R 2685 0 R 2699 0 R 2707 0 R 2712 0 R 2721 0 R 2728 0 R 2739 0 R 2747 0 R 2766 0 R 2787 0 R 2796 0 R 2805 0 R 2844 0 R 2894 0 R 2903 0 R 2912 0 R 2927 0 R 2939 0 R 2950 0 R 2959 0 R 2966 0 R 2975 0 R 2984 0 R 2992 0 R 3002 0 R 3009 0 R 3016 0 R 3030 0 R 3047 0 R 3066 0 R 3085 0 R 3095 0 R 3102 0 R 3112 0 R 3120 0 R 3126 0 R 3136 0 R 3143 0 R 3154 0 R 3163 0 R 3171 0 R 3179 0 R 3184 0 R 3195 0 R 3205 0 R 3233 0 R 3243 0 R 3254 0 R 3262 0 R 3271 0 R 3280 0 R 3292 0 R 3302 0 R 3320 0 R 3327 0 R 3349 0 R 3358 0 R 3367 0 R 3375 0 R 3380 0 R 3387 0 R 3408 0 R 3439 0 R 3456 0 R 3471 0 R 3479 0 R 3493 0 R 3499 0 R 3510 0 R 3527 0 R 3560 0 R 3570 0 R 3588 0 R 3599 0 R 3616 0 R 3632 0 R 3649 0 R 3685 0 R 3694 0 R 3725 0 R 3747 0 R 3753 0 R 3763 0 R 3769 0 R 3774 0 R 3779 0 R 3832 0 R 3842 0 R 3853 0 R 3868 0 R 3879 0 R 3888 0 R 3895 0 R 3905 0 R 3912 0 R 3922 0 R 3929 0 R 3937 0 R 3950 0 R 3958 0 R 3967 0 R 3972 0 R 3980 0 R 3990 0 R 4000 0 R 4038 0 R 4062 0 R 4078 0 R 4090 0 R 4121 0 R 4170 0 R 4192 0 R 4201 0 R 4220 0 R 4235 0 R 4247 0 R 4255 0 R 4265 0 R 4303 0 R 4319 0 R 4343 0 R 4356 0 R 4365 0 R 4385 0 R 4488 0 R 4508 0 R 4521 0 R 4536 0 R 4549 0 R 4558 0 R 4570 0 R 4590 0 R 4599 0 R 4608 0 R 4621 0 R 4632 0 R 4649 0 R 4660 0 R 4675 0 R 4686 0 R 4696 0 R 4706 0 R 4715 0 R 4725 0 R 4736 0 R 4746 0 R 4754 0 R 4766 0 R 4781 0 R 4791 0 R 4799 0 R 4805 0 R 4810 0 R 4817 0 R 4828 0 R 4837 0 R 4847 0 R 4861 0 R 4871 0 R 4878 0 R 4888 0 R 4900 0 R 4911 0 R 4924 0 R 4947 0 R 4956 0 R 4967 0 R 4973 0 R 4983 0 R 4994 0 R 5003 0 R 5010 0 R 5019 0 R 5026 0 R 5033 0 R 5040 0 R 5045 0 R 5056 0 R 5061 0 R 5071 0 R 5079 0 R 5084 0 R 5092 0 R 5103 0 R 5121 0 R 5158 0 R 5171 0 R 5189 0 R 5203 0 R 5212 0 R 5222 0 R 5229 0 R 5236 0 R 5245 0 R 5287 0 R 5310 0 R 5318 0 R 5333 0 R 5342 0 R 5351 0 R 5358 0 R 5367 0 R 5376 0 R 5381 0 R 5391 0 R 5402 0 R 5407 0 R 5420 0 R 5431 0 R 5441 0 R 5456 0 R 5471 0 R 5478 0 R 5517 0 R 5535 0 R 5546 0 R 5553 0 R 5564 0 R 5573 0 R 5587 0 R 5602 0 R 5666 0 R 5680 0 R 5687 0 R 5699 0 R 5716 0 R 5725 0 R 5732 0 R 5745 0 R 5752 0 R 5759 0 R 5770 0 R 5777 0 R 5791 0 R 5800 0 R 5809 0 R 5822 0 R 5829 0 R 5838 0 R 5850 0 R 5861 0 R 5876 0 R 5917 0 R 5931 0 R 5938 0 R 5949 0 R 5960 0 R 5971 0 R 5988 0 R 6092 0 R 6107 0 R 6117 0 R 6126 0 R 6136 0 R 6152 0 R 6163 0 R 6170 0 R 6177 0 R 6186 0 R 6193 0 R 6204 0 R 6219 0 R 6236 0 R 6245 0 R 6253 0 R 6261 0 R 6270 0 R 6281 0 R 6296 0 R 6303 0 R 6308 0 R 6317 0 R 6327 0 R 6338 0 R 6345 0 R 6356 0 R 6370 0 R 6383 0 R 6392 0 R 6399 0 R 6407 0 R 6416 0 R 6426 0 R 6436 0 R 6452 0 R 6468 0 R 6477 0 R 6488 0 R 6503 0 R 6511 0 R 6529 0 R 6539 0 R 6547 0 R 6556 0 R 6579 0 R 6636 0 R 6707 0 R 6721 0 R 6734 0 R 6745 0 R 6755 0 R 6762 0 R 6770 0 R 6781 0 R 6790 0 R 6800 0 R 6819 0 R 6829 0 R 6842 0 R 6852 0 R 6860 0 R 6873 0 R 6880 0 R 6891 0 R 6902 0 R 6920 0 R 6939 0 R 6957 0 R 6972 0 R 6983 0 R 6990 0 R 6997 0 R 7006 0 R 7024 0 R 7042 0 R 7049 0 R 7061 0 R 7069 0 R 7074 0 R 7084 0 R 7092 0 R 7097 0 R 7153 0 R 7171 0 R 7191 0 R 7200 0 R 7210 0 R 7219 0 R 7234 0 R 7242 0 R 7254 0 R 7263 0 R 7273 0 R 7289 0 R 7299 0 R 7306 0 R 7314 0 R 7327 0 R 7362 0 R 7403 0 R 7412 0 R 7429 0 R 7442 0 R 7453 0 R 7460 0 R 7465 0 R 7476 0 R 7483 0 R 7492 0 R 7502 0 R 7515 0 R 7522 0 R 7529 0 R 7537 0 R 7547 0 R 7557 0 R 7566 0 R 7575 0 R 7584 0 R 7591 0 R 7608 0 R 7637 0 R 7666 0 R 7681 0 R 7698 0 R 7707 0 R 7722 0 R 7741 0 R 7768 0 R 7822 0 R 7833 0 R 7838 0 R 7843 0 R 7852 0 R 7861 0 R 7872 0 R 7883 0 R 7892 0 R 7901 0 R 7912 0 R 7919 0 R 7930 0 R 7943 0 R 7952 0 R 7961 0 R 7968 0 R 7975 0 R 7990 0 R 7998 0 R 8017 0 R 8030 0 R 8035 0 R ] /Count 502 /ProcSet [/PDF /Text /ImageB /ImageC] >> endobj xref 0 9325 0000000000 65535 f 0000000009 00000 n 0004566934 00000 n 0000000207 00000 n 0000000302 00000 n 0000026184 00000 n 0000000339 00000 n 0000005552 00000 n 0004507869 00000 n 0004544786 00000 n 0000005572 00000 n 0000005624 00000 n 0000005669 00000 n 0000005721 00000 n 0000005766 00000 n 0000005811 00000 n 0000005856 00000 n 0000005901 00000 n 0000005946 00000 n 0000005991 00000 n 0000006036 00000 n 0000006081 00000 n 0000006126 00000 n 0000006171 00000 n 0000006216 00000 n 0000006261 00000 n 0000006306 00000 n 0000006549 00000 n 0000006806 00000 n 0000007064 00000 n 0000007324 00000 n 0000007598 00000 n 0000007763 00000 n 0000008029 00000 n 0000008285 00000 n 0000008538 00000 n 0000008798 00000 n 0000009062 00000 n 0000009315 00000 n 0000009575 00000 n 0000009828 00000 n 0000010081 00000 n 0000010334 00000 n 0000010597 00000 n 0000010858 00000 n 0000011112 00000 n 0000011374 00000 n 0000011651 00000 n 0000011918 00000 n 0000012177 00000 n 0000012434 00000 n 0000012692 00000 n 0000012953 00000 n 0000013218 00000 n 0000013476 00000 n 0000013754 00000 n 0000014025 00000 n 0000014292 00000 n 0000014550 00000 n 0000014801 00000 n 0000015066 00000 n 0000015331 00000 n 0000015582 00000 n 0000015840 00000 n 0000016099 00000 n 0000016351 00000 n 0000016625 00000 n 0000016877 00000 n 0000017143 00000 n 0000017399 00000 n 0000017661 00000 n 0000017921 00000 n 0000018172 00000 n 0000018428 00000 n 0000018691 00000 n 0000018945 00000 n 0000019206 00000 n 0000019469 00000 n 0000019722 00000 n 0000019980 00000 n 0000020234 00000 n 0000020492 00000 n 0000020761 00000 n 0000021019 00000 n 0000021286 00000 n 0000021549 00000 n 0000021820 00000 n 0000022092 00000 n 0000022356 00000 n 0000022607 00000 n 0000022869 00000 n 0000023117 00000 n 0000023379 00000 n 0000023634 00000 n 0000023889 00000 n 0000024151 00000 n 0000024406 00000 n 0000024661 00000 n 0000024924 00000 n 0000025173 00000 n 0000025436 00000 n 0000025690 00000 n 0000025933 00000 n 0000027059 00000 n 0000034323 00000 n 0000026308 00000 n 0000026496 00000 n 0000060027 00000 n 0000034345 00000 n 0000034599 00000 n 0000034850 00000 n 0000035101 00000 n 0000035345 00000 n 0000035603 00000 n 0000035854 00000 n 0000036113 00000 n 0000036365 00000 n 0000036617 00000 n 0000036876 00000 n 0000037121 00000 n 0000037373 00000 n 0000037632 00000 n 0000037884 00000 n 0000038143 00000 n 0000038402 00000 n 0000038654 00000 n 0000038913 00000 n 0000039165 00000 n 0000039417 00000 n 0000039676 00000 n 0000039928 00000 n 0000040187 00000 n 0000040460 00000 n 0000040721 00000 n 0000040980 00000 n 0000041238 00000 n 0000041503 00000 n 0000041773 00000 n 0000042033 00000 n 0000042285 00000 n 0000042537 00000 n 0000042789 00000 n 0000043048 00000 n 0000043293 00000 n 0000043563 00000 n 0000043822 00000 n 0000044093 00000 n 0000044355 00000 n 0000044614 00000 n 0000044866 00000 n 0000045118 00000 n 0000045370 00000 n 0000045622 00000 n 0000045874 00000 n 0000046119 00000 n 0000046378 00000 n 0000046630 00000 n 0000046882 00000 n 0000047141 00000 n 0000047386 00000 n 0000047637 00000 n 0000047899 00000 n 0000048154 00000 n 0000048409 00000 n 0000048664 00000 n 0000048913 00000 n 0000049176 00000 n 0000049425 00000 n 0000049681 00000 n 0000049943 00000 n 0000050191 00000 n 0000050446 00000 n 0000050708 00000 n 0000050964 00000 n 0000051227 00000 n 0000051483 00000 n 0000051746 00000 n 0000052009 00000 n 0000052265 00000 n 0000052528 00000 n 0000052791 00000 n 0000053047 00000 n 0000053310 00000 n 0000053559 00000 n 0000053823 00000 n 0000054100 00000 n 0000054356 00000 n 0000054612 00000 n 0000054787 00000 n 0000055043 00000 n 0000055306 00000 n 0000055573 00000 n 0000055829 00000 n 0000056099 00000 n 0000056369 00000 n 0000056644 00000 n 0000056922 00000 n 0000057197 00000 n 0000057464 00000 n 0000057732 00000 n 0000057997 00000 n 0000058266 00000 n 0000058524 00000 n 0000058705 00000 n 0000058988 00000 n 0000059246 00000 n 0000059509 00000 n 0000059767 00000 n 0000061151 00000 n 0000071209 00000 n 0000060153 00000 n 0000060330 00000 n 0000094786 00000 n 0000071231 00000 n 0000071487 00000 n 0000071760 00000 n 0000072017 00000 n 0000072294 00000 n 0000072473 00000 n 0000072644 00000 n 0000072907 00000 n 0000073160 00000 n 0000073427 00000 n 0000073703 00000 n 0000073881 00000 n 0000074055 00000 n 0000074332 00000 n 0000074604 00000 n 0000074888 00000 n 0000075164 00000 n 0000075439 00000 n 0000075624 00000 n 0000075904 00000 n 0000076082 00000 n 0000076368 00000 n 0000076644 00000 n 0000076816 00000 n 0000077099 00000 n 0000077270 00000 n 0000077547 00000 n 0000077821 00000 n 0000078094 00000 n 0000078373 00000 n 0000078647 00000 n 0000078930 00000 n 0000079212 00000 n 0000079484 00000 n 0000079757 00000 n 0000080022 00000 n 0000080283 00000 n 0000080553 00000 n 0000080817 00000 n 0000081082 00000 n 0000081351 00000 n 0000081623 00000 n 0000081898 00000 n 0000082164 00000 n 0000082423 00000 n 0000082704 00000 n 0000082876 00000 n 0000083053 00000 n 0000083325 00000 n 0000083499 00000 n 0000083686 00000 n 0000083856 00000 n 0000084102 00000 n 0000084376 00000 n 0000084645 00000 n 0000084915 00000 n 0000085194 00000 n 0000085440 00000 n 0000085714 00000 n 0000085983 00000 n 0000086255 00000 n 0000086533 00000 n 0000086707 00000 n 0000086986 00000 n 0000087240 00000 n 0000087499 00000 n 0000087758 00000 n 0000088028 00000 n 0000088287 00000 n 0000088553 00000 n 0000088812 00000 n 0000089085 00000 n 0000089351 00000 n 0000089603 00000 n 0000089884 00000 n 0000090137 00000 n 0000090399 00000 n 0000090656 00000 n 0000090903 00000 n 0000091164 00000 n 0000091425 00000 n 0000091676 00000 n 0000091937 00000 n 0000092191 00000 n 0000092445 00000 n 0000092706 00000 n 0000092954 00000 n 0000093216 00000 n 0000093478 00000 n 0000093743 00000 n 0000094004 00000 n 0000094264 00000 n 0000094521 00000 n 0000095854 00000 n 0000105816 00000 n 0000094912 00000 n 0000095089 00000 n 0000131137 00000 n 0000105838 00000 n 0000106106 00000 n 0000106379 00000 n 0000106652 00000 n 0000106923 00000 n 0000107201 00000 n 0000107457 00000 n 0000107719 00000 n 0000107974 00000 n 0000108226 00000 n 0000108489 00000 n 0000108738 00000 n 0000108994 00000 n 0000109250 00000 n 0000109499 00000 n 0000109762 00000 n 0000110025 00000 n 0000110281 00000 n 0000110545 00000 n 0000110795 00000 n 0000111038 00000 n 0000111300 00000 n 0000111548 00000 n 0000111810 00000 n 0000112072 00000 n 0000112320 00000 n 0000112582 00000 n 0000112837 00000 n 0000113096 00000 n 0000113358 00000 n 0000113614 00000 n 0000113881 00000 n 0000114144 00000 n 0000114400 00000 n 0000114663 00000 n 0000114919 00000 n 0000115187 00000 n 0000115450 00000 n 0000115720 00000 n 0000115983 00000 n 0000116157 00000 n 0000116437 00000 n 0000116712 00000 n 0000116968 00000 n 0000117217 00000 n 0000117480 00000 n 0000117749 00000 n 0000118031 00000 n 0000118314 00000 n 0000118580 00000 n 0000118866 00000 n 0000119146 00000 n 0000119402 00000 n 0000119665 00000 n 0000119914 00000 n 0000120177 00000 n 0000120440 00000 n 0000120689 00000 n 0000120952 00000 n 0000121208 00000 n 0000121464 00000 n 0000121720 00000 n 0000121975 00000 n 0000122231 00000 n 0000122494 00000 n 0000122750 00000 n 0000123016 00000 n 0000123272 00000 n 0000123528 00000 n 0000123784 00000 n 0000124040 00000 n 0000124306 00000 n 0000124588 00000 n 0000124848 00000 n 0000125116 00000 n 0000125396 00000 n 0000125665 00000 n 0000125944 00000 n 0000126200 00000 n 0000126485 00000 n 0000126748 00000 n 0000127010 00000 n 0000127273 00000 n 0000127529 00000 n 0000127785 00000 n 0000128041 00000 n 0000128297 00000 n 0000128570 00000 n 0000128837 00000 n 0000129097 00000 n 0000129364 00000 n 0000129625 00000 n 0000129878 00000 n 0000130059 00000 n 0000130318 00000 n 0000130591 00000 n 0000130863 00000 n 0000132237 00000 n 0000142012 00000 n 0000131263 00000 n 0000131440 00000 n 0000166003 00000 n 0000142034 00000 n 0000142297 00000 n 0000142578 00000 n 0000142849 00000 n 0000143122 00000 n 0000143380 00000 n 0000143635 00000 n 0000143897 00000 n 0000144159 00000 n 0000144406 00000 n 0000144656 00000 n 0000144910 00000 n 0000145164 00000 n 0000145425 00000 n 0000145679 00000 n 0000145940 00000 n 0000146201 00000 n 0000146455 00000 n 0000146716 00000 n 0000146971 00000 n 0000147221 00000 n 0000147492 00000 n 0000147759 00000 n 0000148029 00000 n 0000148295 00000 n 0000148557 00000 n 0000148820 00000 n 0000149077 00000 n 0000149343 00000 n 0000149607 00000 n 0000149876 00000 n 0000150144 00000 n 0000150415 00000 n 0000150678 00000 n 0000150952 00000 n 0000151218 00000 n 0000151477 00000 n 0000151755 00000 n 0000152016 00000 n 0000152297 00000 n 0000152577 00000 n 0000152843 00000 n 0000153108 00000 n 0000153376 00000 n 0000153644 00000 n 0000153913 00000 n 0000154169 00000 n 0000154438 00000 n 0000154696 00000 n 0000154951 00000 n 0000155221 00000 n 0000155469 00000 n 0000155717 00000 n 0000155992 00000 n 0000156247 00000 n 0000156509 00000 n 0000156764 00000 n 0000157019 00000 n 0000157282 00000 n 0000157538 00000 n 0000157794 00000 n 0000158050 00000 n 0000158306 00000 n 0000158572 00000 n 0000158835 00000 n 0000159091 00000 n 0000159354 00000 n 0000159604 00000 n 0000159867 00000 n 0000160128 00000 n 0000160382 00000 n 0000160657 00000 n 0000160918 00000 n 0000161165 00000 n 0000161426 00000 n 0000161675 00000 n 0000161928 00000 n 0000162181 00000 n 0000162434 00000 n 0000162694 00000 n 0000162954 00000 n 0000163200 00000 n 0000163453 00000 n 0000163706 00000 n 0000163960 00000 n 0000164221 00000 n 0000164468 00000 n 0000164722 00000 n 0000164983 00000 n 0000165236 00000 n 0000165497 00000 n 0000165750 00000 n 0000167063 00000 n 0000176026 00000 n 0000166129 00000 n 0000166306 00000 n 0000200275 00000 n 0000176048 00000 n 0000176298 00000 n 0000176564 00000 n 0000176823 00000 n 0000177081 00000 n 0000177353 00000 n 0000177617 00000 n 0000177889 00000 n 0000178150 00000 n 0000178399 00000 n 0000178668 00000 n 0000178842 00000 n 0000179096 00000 n 0000179369 00000 n 0000179632 00000 n 0000179895 00000 n 0000180164 00000 n 0000180337 00000 n 0000180601 00000 n 0000180861 00000 n 0000181022 00000 n 0000181203 00000 n 0000181383 00000 n 0000181668 00000 n 0000181934 00000 n 0000182201 00000 n 0000182482 00000 n 0000182748 00000 n 0000183014 00000 n 0000183287 00000 n 0000183463 00000 n 0000183745 00000 n 0000184018 00000 n 0000184283 00000 n 0000184563 00000 n 0000184821 00000 n 0000185089 00000 n 0000185367 00000 n 0000185637 00000 n 0000185888 00000 n 0000186152 00000 n 0000186420 00000 n 0000186680 00000 n 0000186948 00000 n 0000187211 00000 n 0000187493 00000 n 0000187771 00000 n 0000188041 00000 n 0000188316 00000 n 0000188578 00000 n 0000188838 00000 n 0000189090 00000 n 0000189345 00000 n 0000189606 00000 n 0000189865 00000 n 0000190123 00000 n 0000190397 00000 n 0000190662 00000 n 0000190924 00000 n 0000191185 00000 n 0000191446 00000 n 0000191698 00000 n 0000191952 00000 n 0000192213 00000 n 0000192478 00000 n 0000192735 00000 n 0000192995 00000 n 0000193251 00000 n 0000193504 00000 n 0000193755 00000 n 0000194010 00000 n 0000194268 00000 n 0000194528 00000 n 0000194786 00000 n 0000195056 00000 n 0000195304 00000 n 0000195566 00000 n 0000195837 00000 n 0000196098 00000 n 0000196369 00000 n 0000196641 00000 n 0000196908 00000 n 0000197178 00000 n 0000197435 00000 n 0000197704 00000 n 0000197980 00000 n 0000198242 00000 n 0000198517 00000 n 0000198778 00000 n 0000199018 00000 n 0000199277 00000 n 0000199521 00000 n 0000199772 00000 n 0000200031 00000 n 0000201351 00000 n 0000210719 00000 n 0000200401 00000 n 0000200578 00000 n 0000237083 00000 n 0000210741 00000 n 0000210986 00000 n 0000211245 00000 n 0000211497 00000 n 0000211749 00000 n 0000212009 00000 n 0000212262 00000 n 0000212515 00000 n 0000212775 00000 n 0000213028 00000 n 0000213288 00000 n 0000213534 00000 n 0000213787 00000 n 0000214047 00000 n 0000214300 00000 n 0000214560 00000 n 0000214813 00000 n 0000215060 00000 n 0000215323 00000 n 0000215584 00000 n 0000215844 00000 n 0000216110 00000 n 0000216379 00000 n 0000216644 00000 n 0000216904 00000 n 0000217176 00000 n 0000217455 00000 n 0000217712 00000 n 0000217973 00000 n 0000218226 00000 n 0000218484 00000 n 0000218762 00000 n 0000219019 00000 n 0000219283 00000 n 0000219547 00000 n 0000219807 00000 n 0000220070 00000 n 0000220332 00000 n 0000220592 00000 n 0000220863 00000 n 0000221130 00000 n 0000221386 00000 n 0000221651 00000 n 0000221906 00000 n 0000222165 00000 n 0000222433 00000 n 0000222694 00000 n 0000222969 00000 n 0000223241 00000 n 0000223499 00000 n 0000223763 00000 n 0000224018 00000 n 0000224291 00000 n 0000224568 00000 n 0000224831 00000 n 0000225086 00000 n 0000225356 00000 n 0000225616 00000 n 0000225884 00000 n 0000226145 00000 n 0000226410 00000 n 0000226679 00000 n 0000226943 00000 n 0000227196 00000 n 0000227472 00000 n 0000227740 00000 n 0000228007 00000 n 0000228277 00000 n 0000228545 00000 n 0000228817 00000 n 0000229075 00000 n 0000229339 00000 n 0000229612 00000 n 0000229877 00000 n 0000230150 00000 n 0000230415 00000 n 0000230682 00000 n 0000230958 00000 n 0000231231 00000 n 0000231517 00000 n 0000231784 00000 n 0000232052 00000 n 0000232323 00000 n 0000232586 00000 n 0000232836 00000 n 0000233109 00000 n 0000233363 00000 n 0000233633 00000 n 0000233911 00000 n 0000234174 00000 n 0000234437 00000 n 0000234696 00000 n 0000234955 00000 n 0000235219 00000 n 0000235475 00000 n 0000235761 00000 n 0000236046 00000 n 0000236291 00000 n 0000236554 00000 n 0000236818 00000 n 0000238207 00000 n 0000247917 00000 n 0000237209 00000 n 0000237386 00000 n 0000273121 00000 n 0000247939 00000 n 0000248197 00000 n 0000248474 00000 n 0000248735 00000 n 0000248994 00000 n 0000249265 00000 n 0000249533 00000 n 0000249798 00000 n 0000250074 00000 n 0000250351 00000 n 0000250620 00000 n 0000250892 00000 n 0000251156 00000 n 0000251424 00000 n 0000251678 00000 n 0000251955 00000 n 0000252138 00000 n 0000252411 00000 n 0000252682 00000 n 0000252943 00000 n 0000253200 00000 n 0000253464 00000 n 0000253732 00000 n 0000254010 00000 n 0000254276 00000 n 0000254533 00000 n 0000254796 00000 n 0000255041 00000 n 0000255303 00000 n 0000255577 00000 n 0000255843 00000 n 0000256126 00000 n 0000256399 00000 n 0000256664 00000 n 0000256940 00000 n 0000257209 00000 n 0000257478 00000 n 0000257742 00000 n 0000257999 00000 n 0000258272 00000 n 0000258541 00000 n 0000258809 00000 n 0000259083 00000 n 0000259351 00000 n 0000259609 00000 n 0000259877 00000 n 0000260138 00000 n 0000260413 00000 n 0000260688 00000 n 0000260934 00000 n 0000261191 00000 n 0000261441 00000 n 0000261692 00000 n 0000261949 00000 n 0000262192 00000 n 0000262442 00000 n 0000262699 00000 n 0000262942 00000 n 0000263192 00000 n 0000263443 00000 n 0000263694 00000 n 0000263945 00000 n 0000264196 00000 n 0000264460 00000 n 0000264718 00000 n 0000264969 00000 n 0000265227 00000 n 0000265478 00000 n 0000265729 00000 n 0000265987 00000 n 0000266238 00000 n 0000266496 00000 n 0000266747 00000 n 0000266998 00000 n 0000267262 00000 n 0000267513 00000 n 0000267764 00000 n 0000268022 00000 n 0000268273 00000 n 0000268524 00000 n 0000268782 00000 n 0000269043 00000 n 0000269323 00000 n 0000269586 00000 n 0000269840 00000 n 0000270091 00000 n 0000270335 00000 n 0000270586 00000 n 0000270844 00000 n 0000271095 00000 n 0000271346 00000 n 0000271597 00000 n 0000271848 00000 n 0000272104 00000 n 0000272356 00000 n 0000272616 00000 n 0000272876 00000 n 0000274221 00000 n 0000284058 00000 n 0000273247 00000 n 0000273424 00000 n 0000309048 00000 n 0000284080 00000 n 0000284326 00000 n 0000284586 00000 n 0000284832 00000 n 0000285078 00000 n 0000285339 00000 n 0000285593 00000 n 0000285854 00000 n 0000286115 00000 n 0000286369 00000 n 0000286623 00000 n 0000286877 00000 n 0000287131 00000 n 0000287392 00000 n 0000287639 00000 n 0000287921 00000 n 0000288200 00000 n 0000288454 00000 n 0000288708 00000 n 0000288955 00000 n 0000289209 00000 n 0000289470 00000 n 0000289710 00000 n 0000289969 00000 n 0000290228 00000 n 0000290480 00000 n 0000290732 00000 n 0000290984 00000 n 0000291236 00000 n 0000291495 00000 n 0000291747 00000 n 0000292007 00000 n 0000292267 00000 n 0000292513 00000 n 0000292773 00000 n 0000293026 00000 n 0000293272 00000 n 0000293532 00000 n 0000293785 00000 n 0000294045 00000 n 0000294305 00000 n 0000294558 00000 n 0000294811 00000 n 0000295057 00000 n 0000295310 00000 n 0000295563 00000 n 0000295816 00000 n 0000296076 00000 n 0000296336 00000 n 0000296589 00000 n 0000296849 00000 n 0000297102 00000 n 0000297355 00000 n 0000297615 00000 n 0000297861 00000 n 0000298121 00000 n 0000298381 00000 n 0000298634 00000 n 0000298894 00000 n 0000299147 00000 n 0000299393 00000 n 0000299646 00000 n 0000299899 00000 n 0000300159 00000 n 0000300412 00000 n 0000300665 00000 n 0000300925 00000 n 0000301178 00000 n 0000301424 00000 n 0000301682 00000 n 0000301935 00000 n 0000302195 00000 n 0000302448 00000 n 0000302701 00000 n 0000302954 00000 n 0000303200 00000 n 0000303446 00000 n 0000303703 00000 n 0000303955 00000 n 0000304214 00000 n 0000304471 00000 n 0000304723 00000 n 0000304975 00000 n 0000305220 00000 n 0000305472 00000 n 0000305731 00000 n 0000305983 00000 n 0000306244 00000 n 0000306505 00000 n 0000306752 00000 n 0000307013 00000 n 0000307267 00000 n 0000307519 00000 n 0000307776 00000 n 0000308027 00000 n 0000308286 00000 n 0000308538 00000 n 0000308789 00000 n 0000310156 00000 n 0000319434 00000 n 0000309174 00000 n 0000309351 00000 n 0000345078 00000 n 0000319456 00000 n 0000319708 00000 n 0000319960 00000 n 0000320209 00000 n 0000320462 00000 n 0000320722 00000 n 0000320975 00000 n 0000321235 00000 n 0000321495 00000 n 0000321748 00000 n 0000322001 00000 n 0000322255 00000 n 0000322509 00000 n 0000322763 00000 n 0000323024 00000 n 0000323285 00000 n 0000323539 00000 n 0000323786 00000 n 0000324047 00000 n 0000324301 00000 n 0000324555 00000 n 0000324816 00000 n 0000325070 00000 n 0000325331 00000 n 0000325592 00000 n 0000325846 00000 n 0000326107 00000 n 0000326361 00000 n 0000326615 00000 n 0000326869 00000 n 0000327144 00000 n 0000327423 00000 n 0000327685 00000 n 0000327939 00000 n 0000328200 00000 n 0000328463 00000 n 0000328732 00000 n 0000329006 00000 n 0000329260 00000 n 0000329526 00000 n 0000329787 00000 n 0000330041 00000 n 0000330295 00000 n 0000330549 00000 n 0000330803 00000 n 0000331064 00000 n 0000331311 00000 n 0000331572 00000 n 0000331833 00000 n 0000332087 00000 n 0000332348 00000 n 0000332595 00000 n 0000332857 00000 n 0000333116 00000 n 0000333370 00000 n 0000333631 00000 n 0000333892 00000 n 0000334139 00000 n 0000334400 00000 n 0000334662 00000 n 0000334916 00000 n 0000335170 00000 n 0000335424 00000 n 0000335685 00000 n 0000335939 00000 n 0000336193 00000 n 0000336447 00000 n 0000336701 00000 n 0000336955 00000 n 0000337209 00000 n 0000337463 00000 n 0000337724 00000 n 0000337901 00000 n 0000338155 00000 n 0000338416 00000 n 0000338670 00000 n 0000338924 00000 n 0000339185 00000 n 0000339443 00000 n 0000339708 00000 n 0000339969 00000 n 0000340223 00000 n 0000340485 00000 n 0000340749 00000 n 0000341013 00000 n 0000341280 00000 n 0000341545 00000 n 0000341823 00000 n 0000342095 00000 n 0000342270 00000 n 0000342450 00000 n 0000342729 00000 n 0000343000 00000 n 0000343279 00000 n 0000343544 00000 n 0000343799 00000 n 0000344054 00000 n 0000344301 00000 n 0000344556 00000 n 0000344815 00000 n 0000346226 00000 n 0000355972 00000 n 0000345207 00000 n 0000345385 00000 n 0000381319 00000 n 0000355995 00000 n 0000356255 00000 n 0000356531 00000 n 0000356776 00000 n 0000357025 00000 n 0000357281 00000 n 0000357530 00000 n 0000357786 00000 n 0000358059 00000 n 0000358308 00000 n 0000358564 00000 n 0000358804 00000 n 0000359056 00000 n 0000359315 00000 n 0000359567 00000 n 0000359819 00000 n 0000360071 00000 n 0000360323 00000 n 0000360582 00000 n 0000360827 00000 n 0000361073 00000 n 0000361333 00000 n 0000361579 00000 n 0000361832 00000 n 0000362092 00000 n 0000362345 00000 n 0000362605 00000 n 0000362858 00000 n 0000363111 00000 n 0000363371 00000 n 0000363624 00000 n 0000363884 00000 n 0000364144 00000 n 0000364397 00000 n 0000364652 00000 n 0000364915 00000 n 0000365175 00000 n 0000365428 00000 n 0000365702 00000 n 0000365980 00000 n 0000366240 00000 n 0000366493 00000 n 0000366753 00000 n 0000367006 00000 n 0000367252 00000 n 0000367512 00000 n 0000367765 00000 n 0000368025 00000 n 0000368285 00000 n 0000368538 00000 n 0000368800 00000 n 0000369046 00000 n 0000369299 00000 n 0000369559 00000 n 0000369805 00000 n 0000370074 00000 n 0000370347 00000 n 0000370614 00000 n 0000370891 00000 n 0000371144 00000 n 0000371403 00000 n 0000371676 00000 n 0000371936 00000 n 0000372207 00000 n 0000372478 00000 n 0000372733 00000 n 0000373004 00000 n 0000373262 00000 n 0000373526 00000 n 0000373798 00000 n 0000374060 00000 n 0000374331 00000 n 0000374601 00000 n 0000374868 00000 n 0000375136 00000 n 0000375407 00000 n 0000375667 00000 n 0000375939 00000 n 0000376192 00000 n 0000376452 00000 n 0000376712 00000 n 0000376965 00000 n 0000377225 00000 n 0000377471 00000 n 0000377724 00000 n 0000377977 00000 n 0000378223 00000 n 0000378483 00000 n 0000378736 00000 n 0000378989 00000 n 0000379249 00000 n 0000379502 00000 n 0000379755 00000 n 0000380015 00000 n 0000380267 00000 n 0000380531 00000 n 0000380795 00000 n 0000381059 00000 n 0000382531 00000 n 0000390470 00000 n 0000381449 00000 n 0000381627 00000 n 0000415696 00000 n 0000390493 00000 n 0000390746 00000 n 0000390999 00000 n 0000391268 00000 n 0000391514 00000 n 0000391774 00000 n 0000392027 00000 n 0000392287 00000 n 0000392547 00000 n 0000392800 00000 n 0000393060 00000 n 0000393313 00000 n 0000393566 00000 n 0000393815 00000 n 0000394079 00000 n 0000394349 00000 n 0000394637 00000 n 0000394909 00000 n 0000395187 00000 n 0000395463 00000 n 0000395727 00000 n 0000395993 00000 n 0000396261 00000 n 0000396532 00000 n 0000396801 00000 n 0000397056 00000 n 0000397311 00000 n 0000397587 00000 n 0000397859 00000 n 0000398135 00000 n 0000398400 00000 n 0000398675 00000 n 0000398863 00000 n 0000399044 00000 n 0000399318 00000 n 0000399589 00000 n 0000399864 00000 n 0000400146 00000 n 0000400312 00000 n 0000400592 00000 n 0000400872 00000 n 0000401146 00000 n 0000401427 00000 n 0000401694 00000 n 0000401953 00000 n 0000402235 00000 n 0000402501 00000 n 0000402784 00000 n 0000403052 00000 n 0000403308 00000 n 0000403587 00000 n 0000403852 00000 n 0000404132 00000 n 0000404417 00000 n 0000404685 00000 n 0000404858 00000 n 0000405037 00000 n 0000405296 00000 n 0000405542 00000 n 0000405793 00000 n 0000406044 00000 n 0000406295 00000 n 0000406546 00000 n 0000406797 00000 n 0000407055 00000 n 0000407306 00000 n 0000407564 00000 n 0000407816 00000 n 0000408068 00000 n 0000408320 00000 n 0000408572 00000 n 0000408831 00000 n 0000409083 00000 n 0000409328 00000 n 0000409587 00000 n 0000409839 00000 n 0000410091 00000 n 0000410350 00000 n 0000410602 00000 n 0000410861 00000 n 0000411120 00000 n 0000411372 00000 n 0000411631 00000 n 0000411883 00000 n 0000412135 00000 n 0000412387 00000 n 0000412639 00000 n 0000412898 00000 n 0000413157 00000 n 0000413409 00000 n 0000413668 00000 n 0000413920 00000 n 0000414165 00000 n 0000414424 00000 n 0000414675 00000 n 0000414927 00000 n 0000415186 00000 n 0000415437 00000 n 0000416908 00000 n 0000426326 00000 n 0000415826 00000 n 0000416004 00000 n 0000450990 00000 n 0000426349 00000 n 0000426601 00000 n 0000426860 00000 n 0000427112 00000 n 0000427364 00000 n 0000427616 00000 n 0000427868 00000 n 0000428131 00000 n 0000428390 00000 n 0000428656 00000 n 0000428912 00000 n 0000429165 00000 n 0000429418 00000 n 0000429678 00000 n 0000429924 00000 n 0000430177 00000 n 0000430437 00000 n 0000430683 00000 n 0000430943 00000 n 0000431197 00000 n 0000431451 00000 n 0000431712 00000 n 0000431959 00000 n 0000432220 00000 n 0000432474 00000 n 0000432728 00000 n 0000432989 00000 n 0000433243 00000 n 0000433497 00000 n 0000433758 00000 n 0000434012 00000 n 0000434266 00000 n 0000434527 00000 n 0000434781 00000 n 0000435042 00000 n 0000435296 00000 n 0000435543 00000 n 0000435804 00000 n 0000436058 00000 n 0000436319 00000 n 0000436580 00000 n 0000436834 00000 n 0000437095 00000 n 0000437348 00000 n 0000437605 00000 n 0000437869 00000 n 0000438126 00000 n 0000438390 00000 n 0000438654 00000 n 0000438911 00000 n 0000439175 00000 n 0000439432 00000 n 0000439690 00000 n 0000439955 00000 n 0000440213 00000 n 0000440478 00000 n 0000440743 00000 n 0000441001 00000 n 0000441266 00000 n 0000441524 00000 n 0000441782 00000 n 0000442047 00000 n 0000442298 00000 n 0000442563 00000 n 0000442821 00000 n 0000443079 00000 n 0000443344 00000 n 0000443602 00000 n 0000443860 00000 n 0000444125 00000 n 0000444383 00000 n 0000444641 00000 n 0000444906 00000 n 0000445164 00000 n 0000445429 00000 n 0000445695 00000 n 0000445953 00000 n 0000446218 00000 n 0000446469 00000 n 0000446734 00000 n 0000446992 00000 n 0000447265 00000 n 0000447530 00000 n 0000447788 00000 n 0000448039 00000 n 0000448310 00000 n 0000448575 00000 n 0000448840 00000 n 0000449124 00000 n 0000449386 00000 n 0000449663 00000 n 0000449929 00000 n 0000450196 00000 n 0000450467 00000 n 0000450717 00000 n 0000452175 00000 n 0000460934 00000 n 0000451120 00000 n 0000451298 00000 n 0000476053 00000 n 0000460957 00000 n 0000461012 00000 n 0000461067 00000 n 0000461115 00000 n 0000461170 00000 n 0000461225 00000 n 0000461280 00000 n 0000461335 00000 n 0000461390 00000 n 0000461438 00000 n 0000461486 00000 n 0000461541 00000 n 0000461596 00000 n 0000461651 00000 n 0000461699 00000 n 0000461754 00000 n 0000461802 00000 n 0000461857 00000 n 0000461905 00000 n 0000462156 00000 n 0000462411 00000 n 0000462655 00000 n 0000462908 00000 n 0000463163 00000 n 0000463407 00000 n 0000463669 00000 n 0000463931 00000 n 0000464186 00000 n 0000464442 00000 n 0000464693 00000 n 0000464939 00000 n 0000465198 00000 n 0000465455 00000 n 0000465706 00000 n 0000465964 00000 n 0000466215 00000 n 0000466474 00000 n 0000466725 00000 n 0000466975 00000 n 0000467226 00000 n 0000467475 00000 n 0000467719 00000 n 0000467965 00000 n 0000468221 00000 n 0000468469 00000 n 0000468723 00000 n 0000468969 00000 n 0000469211 00000 n 0000469467 00000 n 0000469721 00000 n 0000469971 00000 n 0000470215 00000 n 0000470463 00000 n 0000470705 00000 n 0000470959 00000 n 0000471218 00000 n 0000471474 00000 n 0000471734 00000 n 0000471988 00000 n 0000472235 00000 n 0000472486 00000 n 0000472740 00000 n 0000472987 00000 n 0000473234 00000 n 0000473488 00000 n 0000473735 00000 n 0000473999 00000 n 0000474247 00000 n 0000474495 00000 n 0000474758 00000 n 0000475015 00000 n 0000475276 00000 n 0000475543 00000 n 0000475794 00000 n 0000476887 00000 n 0000484803 00000 n 0000476183 00000 n 0000476361 00000 n 0000487832 00000 n 0004566779 00000 n 0000484826 00000 n 0000484881 00000 n 0000484929 00000 n 0000484984 00000 n 0000485039 00000 n 0000485094 00000 n 0000485149 00000 n 0000485197 00000 n 0000485245 00000 n 0000485300 00000 n 0000485355 00000 n 0000485403 00000 n 0000485458 00000 n 0000485513 00000 n 0000485561 00000 n 0000485616 00000 n 0000485671 00000 n 0000485726 00000 n 0000485781 00000 n 0000485836 00000 n 0000485891 00000 n 0000485946 00000 n 0000486001 00000 n 0000486273 00000 n 0000486531 00000 n 0000486717 00000 n 0000486892 00000 n 0000487077 00000 n 0000487261 00000 n 0000487455 00000 n 0000487647 00000 n 0000488259 00000 n 0000496340 00000 n 0000487962 00000 n 0000488156 00000 n 0000499222 00000 n 0000496363 00000 n 0000496418 00000 n 0000496473 00000 n 0000496528 00000 n 0000496583 00000 n 0000496638 00000 n 0000496693 00000 n 0000496748 00000 n 0000496803 00000 n 0000496858 00000 n 0000496913 00000 n 0000497164 00000 n 0000497423 00000 n 0000497674 00000 n 0000497938 00000 n 0000498203 00000 n 0000498390 00000 n 0000498579 00000 n 0000498747 00000 n 0000498931 00000 n 0000499658 00000 n 0000508765 00000 n 0000499352 00000 n 0000499546 00000 n 0000512651 00000 n 0000508788 00000 n 0000508843 00000 n 0000508898 00000 n 0000508953 00000 n 0000509001 00000 n 0000509049 00000 n 0000509096 00000 n 0000509151 00000 n 0000509206 00000 n 0000509253 00000 n 0000509308 00000 n 0000509576 00000 n 0000509835 00000 n 0000510087 00000 n 0000510339 00000 n 0000510598 00000 n 0000510850 00000 n 0000511109 00000 n 0000511362 00000 n 0000511615 00000 n 0000511883 00000 n 0000512136 00000 n 0000512382 00000 n 0000513114 00000 n 0000523955 00000 n 0000512781 00000 n 0000512975 00000 n 0000524949 00000 n 0004519315 00000 n 0000523979 00000 n 0000524034 00000 n 0000524082 00000 n 0000524137 00000 n 0000524192 00000 n 0000524247 00000 n 0000524302 00000 n 0000524357 00000 n 0000524412 00000 n 0000524676 00000 n 0000525329 00000 n 0000530828 00000 n 0000525079 00000 n 0000525289 00000 n 0000533368 00000 n 0000530851 00000 n 0000530906 00000 n 0000530961 00000 n 0000531016 00000 n 0000531071 00000 n 0000531126 00000 n 0000531181 00000 n 0000531236 00000 n 0000531291 00000 n 0000531339 00000 n 0000531394 00000 n 0000531656 00000 n 0000531918 00000 n 0000532180 00000 n 0000532373 00000 n 0000532552 00000 n 0000532744 00000 n 0000532980 00000 n 0000533188 00000 n 0000533811 00000 n 0000541452 00000 n 0000533498 00000 n 0000533708 00000 n 0000548272 00000 n 0000541475 00000 n 0000541530 00000 n 0000541585 00000 n 0000541640 00000 n 0000541695 00000 n 0000541750 00000 n 0000541805 00000 n 0000541853 00000 n 0000541901 00000 n 0000541956 00000 n 0000542004 00000 n 0000542059 00000 n 0000542114 00000 n 0000542162 00000 n 0000542217 00000 n 0000542272 00000 n 0000542327 00000 n 0000542382 00000 n 0000542437 00000 n 0000542700 00000 n 0000542954 00000 n 0000543206 00000 n 0000543470 00000 n 0000543721 00000 n 0000543977 00000 n 0000544233 00000 n 0000544484 00000 n 0000544739 00000 n 0000544985 00000 n 0000545234 00000 n 0000545500 00000 n 0000545749 00000 n 0000546008 00000 n 0000546270 00000 n 0000546521 00000 n 0000546794 00000 n 0000547053 00000 n 0000547311 00000 n 0000547564 00000 n 0000547816 00000 n 0000548090 00000 n 0000548841 00000 n 0000558255 00000 n 0000548402 00000 n 0000548612 00000 n 0000560352 00000 n 0000558278 00000 n 0000558333 00000 n 0000558388 00000 n 0000558436 00000 n 0000558491 00000 n 0000558546 00000 n 0000558601 00000 n 0000558656 00000 n 0000558711 00000 n 0000558766 00000 n 0000558821 00000 n 0000558876 00000 n 0000558931 00000 n 0000558986 00000 n 0000559041 00000 n 0000559096 00000 n 0000559151 00000 n 0000559206 00000 n 0000559254 00000 n 0000559438 00000 n 0000559614 00000 n 0000559783 00000 n 0000559967 00000 n 0000560158 00000 n 0000560768 00000 n 0000567625 00000 n 0000560482 00000 n 0000560692 00000 n 0000569988 00000 n 0000567648 00000 n 0000567703 00000 n 0000567758 00000 n 0000567813 00000 n 0000567868 00000 n 0000567923 00000 n 0000567978 00000 n 0000568033 00000 n 0000568081 00000 n 0000568136 00000 n 0000568191 00000 n 0000568440 00000 n 0000568681 00000 n 0000568930 00000 n 0000569178 00000 n 0000569419 00000 n 0000569610 00000 n 0000569813 00000 n 0000570406 00000 n 0000577356 00000 n 0000570118 00000 n 0000570312 00000 n 0000581131 00000 n 0000577379 00000 n 0000579171 00000 n 0000579194 00000 n 0000579249 00000 n 0000579304 00000 n 0000579359 00000 n 0000579414 00000 n 0000579469 00000 n 0000579524 00000 n 0000579579 00000 n 0000579634 00000 n 0000579876 00000 n 0000580132 00000 n 0000580381 00000 n 0000580631 00000 n 0000580888 00000 n 0000581548 00000 n 0000588326 00000 n 0000581261 00000 n 0000581472 00000 n 0000588679 00000 n 0000588349 00000 n 0000588404 00000 n 0000588459 00000 n 0000588514 00000 n 0000588569 00000 n 0000588624 00000 n 0000589025 00000 n 0000593802 00000 n 0000588809 00000 n 0000589003 00000 n 0000598085 00000 n 0000593825 00000 n 0000593880 00000 n 0000593935 00000 n 0000593990 00000 n 0000594045 00000 n 0000594100 00000 n 0000594155 00000 n 0000594210 00000 n 0000594265 00000 n 0000594320 00000 n 0000594375 00000 n 0000594619 00000 n 0000594870 00000 n 0000595117 00000 n 0000595368 00000 n 0000595619 00000 n 0000595863 00000 n 0000596114 00000 n 0000596358 00000 n 0000596603 00000 n 0000596855 00000 n 0000597092 00000 n 0000597344 00000 n 0000597596 00000 n 0000597833 00000 n 0000598566 00000 n 0000606217 00000 n 0000598215 00000 n 0000598409 00000 n 0000615870 00000 n 0004524910 00000 n 0004533773 00000 n 0000606240 00000 n 0000606295 00000 n 0000606350 00000 n 0000606588 00000 n 0000606840 00000 n 0000607085 00000 n 0000607330 00000 n 0000607582 00000 n 0000607827 00000 n 0000608079 00000 n 0000608331 00000 n 0000608569 00000 n 0000608821 00000 n 0000609080 00000 n 0000609334 00000 n 0000609587 00000 n 0000609846 00000 n 0000610112 00000 n 0000610376 00000 n 0000610629 00000 n 0000610881 00000 n 0000611126 00000 n 0000611371 00000 n 0000611623 00000 n 0000611868 00000 n 0000612138 00000 n 0000612383 00000 n 0000612640 00000 n 0000612902 00000 n 0000613147 00000 n 0000613392 00000 n 0000613644 00000 n 0000613889 00000 n 0000614141 00000 n 0000614393 00000 n 0000614638 00000 n 0000614883 00000 n 0000615128 00000 n 0000615373 00000 n 0000615625 00000 n 0000616590 00000 n 0000624090 00000 n 0000616000 00000 n 0000616226 00000 n 0000624574 00000 n 0000624113 00000 n 0000624160 00000 n 0000624215 00000 n 0000624270 00000 n 0000624317 00000 n 0000624961 00000 n 0000632358 00000 n 0000624704 00000 n 0000624930 00000 n 0000633337 00000 n 0000632381 00000 n 0000632436 00000 n 0000632491 00000 n 0000632546 00000 n 0000632601 00000 n 0000632656 00000 n 0000632711 00000 n 0000632766 00000 n 0000632821 00000 n 0000633070 00000 n 0000633701 00000 n 0000641488 00000 n 0000633467 00000 n 0000633661 00000 n 0000641710 00000 n 0000641511 00000 n 0000641566 00000 n 0000641614 00000 n 0000641662 00000 n 0000642072 00000 n 0000648629 00000 n 0000641840 00000 n 0000642050 00000 n 0000649117 00000 n 0000648652 00000 n 0000648707 00000 n 0000648762 00000 n 0000648817 00000 n 0000648872 00000 n 0000649472 00000 n 0000656940 00000 n 0000649247 00000 n 0000649441 00000 n 0000657885 00000 n 0000656963 00000 n 0000657011 00000 n 0000657066 00000 n 0000657114 00000 n 0000657169 00000 n 0000657224 00000 n 0000657272 00000 n 0000657327 00000 n 0000657375 00000 n 0000657626 00000 n 0000658249 00000 n 0000665872 00000 n 0000658015 00000 n 0000658209 00000 n 0000666335 00000 n 0000665895 00000 n 0000665950 00000 n 0000666005 00000 n 0000666060 00000 n 0000666115 00000 n 0000666170 00000 n 0000666225 00000 n 0000666280 00000 n 0000666681 00000 n 0000674539 00000 n 0000666465 00000 n 0000666659 00000 n 0000674878 00000 n 0000674562 00000 n 0000674610 00000 n 0000674665 00000 n 0000674720 00000 n 0000674768 00000 n 0000674823 00000 n 0000675224 00000 n 0000680394 00000 n 0000675008 00000 n 0000675202 00000 n 0000680719 00000 n 0000680417 00000 n 0000680465 00000 n 0000680513 00000 n 0000680568 00000 n 0000680616 00000 n 0000680664 00000 n 0000681081 00000 n 0000686620 00000 n 0000680849 00000 n 0000681059 00000 n 0000686753 00000 n 0000686643 00000 n 0000686698 00000 n 0000687099 00000 n 0000691852 00000 n 0000686883 00000 n 0000687077 00000 n 0000692871 00000 n 0000691875 00000 n 0000691923 00000 n 0000691978 00000 n 0000692026 00000 n 0000692081 00000 n 0000692136 00000 n 0000692191 00000 n 0000692457 00000 n 0000692709 00000 n 0000693244 00000 n 0000700113 00000 n 0000693001 00000 n 0000693195 00000 n 0000700429 00000 n 0000700136 00000 n 0000700191 00000 n 0000700246 00000 n 0000700800 00000 n 0000712883 00000 n 0000700559 00000 n 0000700769 00000 n 0000713677 00000 n 0000712907 00000 n 0000712962 00000 n 0000713017 00000 n 0000713072 00000 n 0000713127 00000 n 0000713182 00000 n 0000713237 00000 n 0000713413 00000 n 0000714041 00000 n 0000720530 00000 n 0000713807 00000 n 0000714001 00000 n 0000721178 00000 n 0000720553 00000 n 0000720600 00000 n 0000720655 00000 n 0000720907 00000 n 0000721542 00000 n 0000726673 00000 n 0000721308 00000 n 0000721502 00000 n 0000726902 00000 n 0000726696 00000 n 0000726751 00000 n 0000726799 00000 n 0000726854 00000 n 0000727248 00000 n 0000731304 00000 n 0000727032 00000 n 0000727226 00000 n 0000731914 00000 n 0000731327 00000 n 0000731382 00000 n 0000731430 00000 n 0000731485 00000 n 0000731540 00000 n 0000731595 00000 n 0000731643 00000 n 0000732285 00000 n 0000737975 00000 n 0000732044 00000 n 0000732254 00000 n 0000738108 00000 n 0000737998 00000 n 0000738053 00000 n 0000738454 00000 n 0000744003 00000 n 0000738238 00000 n 0000738432 00000 n 0000744026 00000 n 0000744362 00000 n 0000747953 00000 n 0000744156 00000 n 0000744340 00000 n 0000748072 00000 n 0000747976 00000 n 0000748024 00000 n 0000748418 00000 n 0000752398 00000 n 0000748202 00000 n 0000748396 00000 n 0000753128 00000 n 0000752421 00000 n 0000752476 00000 n 0000752531 00000 n 0000752586 00000 n 0000752641 00000 n 0000752696 00000 n 0000752751 00000 n 0000752799 00000 n 0000752854 00000 n 0000753483 00000 n 0000760523 00000 n 0000753258 00000 n 0000753452 00000 n 0000761004 00000 n 0000760546 00000 n 0000760601 00000 n 0000760656 00000 n 0000760704 00000 n 0000760752 00000 n 0000761359 00000 n 0000765610 00000 n 0000761134 00000 n 0000761328 00000 n 0000766539 00000 n 0000765633 00000 n 0000765688 00000 n 0000765736 00000 n 0000765791 00000 n 0000765839 00000 n 0000765894 00000 n 0000765949 00000 n 0000766004 00000 n 0000766052 00000 n 0000766107 00000 n 0000766162 00000 n 0000766347 00000 n 0000766903 00000 n 0000774410 00000 n 0000766669 00000 n 0000766863 00000 n 0000789445 00000 n 0000774433 00000 n 0000774481 00000 n 0000774529 00000 n 0000774584 00000 n 0000774639 00000 n 0000774694 00000 n 0000774742 00000 n 0000774997 00000 n 0000775245 00000 n 0000775500 00000 n 0000775755 00000 n 0000776004 00000 n 0000776260 00000 n 0000776509 00000 n 0000776758 00000 n 0000777006 00000 n 0000777254 00000 n 0000777509 00000 n 0000777764 00000 n 0000778006 00000 n 0000778262 00000 n 0000778511 00000 n 0000778767 00000 n 0000779015 00000 n 0000779257 00000 n 0000779513 00000 n 0000779769 00000 n 0000780011 00000 n 0000780267 00000 n 0000780509 00000 n 0000780766 00000 n 0000781029 00000 n 0000781278 00000 n 0000781534 00000 n 0000781702 00000 n 0000781951 00000 n 0000782207 00000 n 0000782460 00000 n 0000782709 00000 n 0000782979 00000 n 0000783242 00000 n 0000783510 00000 n 0000783788 00000 n 0000784056 00000 n 0000784323 00000 n 0000784584 00000 n 0000784842 00000 n 0000785104 00000 n 0000785348 00000 n 0000785522 00000 n 0000785798 00000 n 0000786050 00000 n 0000786306 00000 n 0000786558 00000 n 0000786812 00000 n 0000787068 00000 n 0000787327 00000 n 0000787584 00000 n 0000787861 00000 n 0000788019 00000 n 0000788197 00000 n 0000788439 00000 n 0000788694 00000 n 0000788949 00000 n 0000789204 00000 n 0000790322 00000 n 0000801195 00000 n 0000789575 00000 n 0000789769 00000 n 0000801762 00000 n 0000801219 00000 n 0000801274 00000 n 0000801329 00000 n 0000801384 00000 n 0000801439 00000 n 0000801494 00000 n 0000801542 00000 n 0000801597 00000 n 0000801652 00000 n 0000801707 00000 n 0000802108 00000 n 0000810054 00000 n 0000801892 00000 n 0000802086 00000 n 0000810187 00000 n 0000810077 00000 n 0000810132 00000 n 0000810549 00000 n 0000815632 00000 n 0000810317 00000 n 0000810527 00000 n 0000816344 00000 n 0000815655 00000 n 0000815710 00000 n 0000815758 00000 n 0000815813 00000 n 0000815868 00000 n 0000815923 00000 n 0000815978 00000 n 0000816026 00000 n 0000816074 00000 n 0000816699 00000 n 0000823052 00000 n 0000816474 00000 n 0000816668 00000 n 0000823531 00000 n 0000823075 00000 n 0000823130 00000 n 0000823178 00000 n 0000823233 00000 n 0000823281 00000 n 0000823886 00000 n 0000829519 00000 n 0000823661 00000 n 0000823855 00000 n 0000830386 00000 n 0000829542 00000 n 0000829597 00000 n 0000829652 00000 n 0000829707 00000 n 0000829762 00000 n 0000829817 00000 n 0000829872 00000 n 0000830129 00000 n 0000830766 00000 n 0000835706 00000 n 0000830516 00000 n 0000830726 00000 n 0000836491 00000 n 0000835729 00000 n 0000835784 00000 n 0000835839 00000 n 0000835894 00000 n 0000835949 00000 n 0000836213 00000 n 0000836871 00000 n 0000843921 00000 n 0000836621 00000 n 0000836831 00000 n 0000844164 00000 n 0000843944 00000 n 0000843999 00000 n 0000844054 00000 n 0000844109 00000 n 0000844510 00000 n 0000847956 00000 n 0000844294 00000 n 0000844488 00000 n 0000848199 00000 n 0000847979 00000 n 0000848034 00000 n 0000848089 00000 n 0000848144 00000 n 0000848545 00000 n 0000854631 00000 n 0000848329 00000 n 0000848523 00000 n 0000855035 00000 n 0000854654 00000 n 0000854709 00000 n 0000854764 00000 n 0000855406 00000 n 0000861881 00000 n 0000855165 00000 n 0000855375 00000 n 0000862739 00000 n 0000861904 00000 n 0000861952 00000 n 0000862007 00000 n 0000862277 00000 n 0000862563 00000 n 0000863128 00000 n 0000868842 00000 n 0000862869 00000 n 0000863079 00000 n 0000869895 00000 n 0000868865 00000 n 0000868920 00000 n 0000868975 00000 n 0000869030 00000 n 0000869085 00000 n 0000869349 00000 n 0000869627 00000 n 0000870268 00000 n 0000876377 00000 n 0000870025 00000 n 0000870219 00000 n 0000876681 00000 n 0000876400 00000 n 0000876448 00000 n 0000876496 00000 n 0000877036 00000 n 0000882971 00000 n 0000876811 00000 n 0000877005 00000 n 0000883104 00000 n 0000882994 00000 n 0000883049 00000 n 0000883450 00000 n 0000887637 00000 n 0000883234 00000 n 0000883428 00000 n 0000887845 00000 n 0000887660 00000 n 0000888200 00000 n 0000893976 00000 n 0000887975 00000 n 0000888169 00000 n 0000894271 00000 n 0000893999 00000 n 0000894626 00000 n 0000899363 00000 n 0000894401 00000 n 0000894595 00000 n 0000899599 00000 n 0000899386 00000 n 0000899441 00000 n 0000899496 00000 n 0000899551 00000 n 0000899961 00000 n 0000905319 00000 n 0000899729 00000 n 0000899939 00000 n 0000905899 00000 n 0000905342 00000 n 0000905390 00000 n 0000905445 00000 n 0000905627 00000 n 0000906279 00000 n 0000912748 00000 n 0000906029 00000 n 0000906239 00000 n 0000912984 00000 n 0000912771 00000 n 0000912826 00000 n 0000912881 00000 n 0000912929 00000 n 0000913346 00000 n 0000918445 00000 n 0000913114 00000 n 0000913324 00000 n 0000918770 00000 n 0000918468 00000 n 0000918516 00000 n 0000918564 00000 n 0000918619 00000 n 0000918674 00000 n 0000918722 00000 n 0000919116 00000 n 0000923995 00000 n 0000918900 00000 n 0000919094 00000 n 0000924128 00000 n 0000924018 00000 n 0000924073 00000 n 0000924490 00000 n 0000929198 00000 n 0000924258 00000 n 0000924468 00000 n 0000929331 00000 n 0000929221 00000 n 0000929276 00000 n 0000929677 00000 n 0000933497 00000 n 0000929461 00000 n 0000929655 00000 n 0000933630 00000 n 0000933520 00000 n 0000933575 00000 n 0000933976 00000 n 0000937715 00000 n 0000933760 00000 n 0000933954 00000 n 0000937834 00000 n 0000937738 00000 n 0000937786 00000 n 0000938196 00000 n 0000942179 00000 n 0000937964 00000 n 0000938174 00000 n 0000942564 00000 n 0000942202 00000 n 0000942250 00000 n 0000942305 00000 n 0000942919 00000 n 0000948594 00000 n 0000942694 00000 n 0000942888 00000 n 0000948876 00000 n 0000948617 00000 n 0000949221 00000 n 0000954083 00000 n 0000949006 00000 n 0000949190 00000 n 0000954106 00000 n 0000954468 00000 n 0000959391 00000 n 0000954236 00000 n 0000954446 00000 n 0000959783 00000 n 0000959414 00000 n 0000959469 00000 n 0000959524 00000 n 0000960154 00000 n 0000965153 00000 n 0000959913 00000 n 0000960123 00000 n 0000965389 00000 n 0000965176 00000 n 0000965231 00000 n 0000965286 00000 n 0000965334 00000 n 0000965735 00000 n 0000970504 00000 n 0000965519 00000 n 0000965713 00000 n 0000971651 00000 n 0000970527 00000 n 0000970575 00000 n 0000970630 00000 n 0000970678 00000 n 0000970733 00000 n 0000970788 00000 n 0000970836 00000 n 0000971110 00000 n 0000971384 00000 n 0000972040 00000 n 0000978310 00000 n 0000971781 00000 n 0000971991 00000 n 0000978333 00000 n 0000978679 00000 n 0000983471 00000 n 0000978463 00000 n 0000978657 00000 n 0000983877 00000 n 0000983494 00000 n 0000983549 00000 n 0000983604 00000 n 0000984248 00000 n 0000988255 00000 n 0000984007 00000 n 0000984217 00000 n 0000988641 00000 n 0000988278 00000 n 0000988333 00000 n 0000988381 00000 n 0000988996 00000 n 0000994176 00000 n 0000988771 00000 n 0000988965 00000 n 0000994588 00000 n 0000994199 00000 n 0000994254 00000 n 0000994302 00000 n 0000994357 00000 n 0000994412 00000 n 0000994943 00000 n 0001000870 00000 n 0000994718 00000 n 0000994912 00000 n 0001001729 00000 n 0001000893 00000 n 0001000948 00000 n 0001001003 00000 n 0001001051 00000 n 0001001106 00000 n 0001001161 00000 n 0001001216 00000 n 0001001476 00000 n 0001002093 00000 n 0001008867 00000 n 0001001859 00000 n 0001002053 00000 n 0001019814 00000 n 0001008890 00000 n 0001008938 00000 n 0001008993 00000 n 0001009048 00000 n 0001009103 00000 n 0001009158 00000 n 0001009213 00000 n 0001009261 00000 n 0001009316 00000 n 0001009371 00000 n 0001009426 00000 n 0001009693 00000 n 0001009962 00000 n 0001010126 00000 n 0001010293 00000 n 0001010556 00000 n 0001010821 00000 n 0001011098 00000 n 0001011360 00000 n 0001011635 00000 n 0001011813 00000 n 0001012086 00000 n 0001012264 00000 n 0001012529 00000 n 0001012791 00000 n 0001012963 00000 n 0001013232 00000 n 0001013410 00000 n 0001013680 00000 n 0001013940 00000 n 0001014213 00000 n 0001014471 00000 n 0001014738 00000 n 0001015014 00000 n 0001015282 00000 n 0001015554 00000 n 0001015827 00000 n 0001016092 00000 n 0001016353 00000 n 0001016609 00000 n 0001016866 00000 n 0001017131 00000 n 0001017386 00000 n 0001017658 00000 n 0001017933 00000 n 0001018192 00000 n 0001018458 00000 n 0001018718 00000 n 0001018883 00000 n 0001019046 00000 n 0001019311 00000 n 0001019478 00000 n 0001019651 00000 n 0001020547 00000 n 0001029047 00000 n 0001019944 00000 n 0001020138 00000 n 0001029400 00000 n 0001029070 00000 n 0001029125 00000 n 0001029180 00000 n 0001029235 00000 n 0001029290 00000 n 0001029345 00000 n 0001029746 00000 n 0001034685 00000 n 0001029530 00000 n 0001029724 00000 n 0001035258 00000 n 0001034708 00000 n 0001034763 00000 n 0001034818 00000 n 0001034873 00000 n 0001034928 00000 n 0001034983 00000 n 0001035038 00000 n 0001035093 00000 n 0001035148 00000 n 0001035203 00000 n 0001035604 00000 n 0001040452 00000 n 0001035388 00000 n 0001035582 00000 n 0001040791 00000 n 0001040475 00000 n 0001040523 00000 n 0001040578 00000 n 0001040633 00000 n 0001040688 00000 n 0001040736 00000 n 0001041137 00000 n 0001044879 00000 n 0001040921 00000 n 0001041115 00000 n 0001045314 00000 n 0001044902 00000 n 0001044957 00000 n 0001045005 00000 n 0001045053 00000 n 0001045101 00000 n 0001045156 00000 n 0001045211 00000 n 0001045266 00000 n 0001045660 00000 n 0001050020 00000 n 0001045444 00000 n 0001045638 00000 n 0001050712 00000 n 0001050043 00000 n 0001050098 00000 n 0001050146 00000 n 0001050194 00000 n 0001050242 00000 n 0001050297 00000 n 0001050352 00000 n 0001050407 00000 n 0001050455 00000 n 0001051067 00000 n 0001055912 00000 n 0001050842 00000 n 0001051036 00000 n 0001056265 00000 n 0001055935 00000 n 0001055990 00000 n 0001056045 00000 n 0001056100 00000 n 0001056155 00000 n 0001056210 00000 n 0001056611 00000 n 0001061959 00000 n 0001056395 00000 n 0001056589 00000 n 0001062987 00000 n 0001061982 00000 n 0001062037 00000 n 0001062085 00000 n 0001062140 00000 n 0001062195 00000 n 0001062250 00000 n 0001062305 00000 n 0001062353 00000 n 0001062401 00000 n 0001062456 00000 n 0001062511 00000 n 0001062566 00000 n 0001062621 00000 n 0001062676 00000 n 0001062724 00000 n 0001063358 00000 n 0001068568 00000 n 0001063117 00000 n 0001063327 00000 n 0001069826 00000 n 0001068591 00000 n 0001068646 00000 n 0001068701 00000 n 0001068756 00000 n 0001068804 00000 n 0001068859 00000 n 0001068907 00000 n 0001068962 00000 n 0001069010 00000 n 0001069065 00000 n 0001069120 00000 n 0001069175 00000 n 0001069230 00000 n 0001069285 00000 n 0001069340 00000 n 0001069395 00000 n 0001069443 00000 n 0001069498 00000 n 0001069553 00000 n 0001070181 00000 n 0001075825 00000 n 0001069956 00000 n 0001070150 00000 n 0001076328 00000 n 0001075848 00000 n 0001075903 00000 n 0001075958 00000 n 0001076013 00000 n 0001076068 00000 n 0001076683 00000 n 0001082240 00000 n 0001076458 00000 n 0001076652 00000 n 0001086116 00000 n 0001082263 00000 n 0001082311 00000 n 0001082366 00000 n 0001082421 00000 n 0001082476 00000 n 0001082531 00000 n 0001082586 00000 n 0001082634 00000 n 0001082689 00000 n 0001082744 00000 n 0001082799 00000 n 0001082854 00000 n 0001082909 00000 n 0001082964 00000 n 0001083012 00000 n 0001083067 00000 n 0001083115 00000 n 0001083170 00000 n 0001083225 00000 n 0001083280 00000 n 0001083328 00000 n 0001083383 00000 n 0001083438 00000 n 0001083493 00000 n 0001083548 00000 n 0001083815 00000 n 0001084077 00000 n 0001084347 00000 n 0001084612 00000 n 0001084872 00000 n 0001085134 00000 n 0001085406 00000 n 0001085670 00000 n 0001085844 00000 n 0001086552 00000 n 0001091010 00000 n 0001086246 00000 n 0001086440 00000 n 0001094888 00000 n 0001091033 00000 n 0001091088 00000 n 0001091143 00000 n 0001091191 00000 n 0001091239 00000 n 0001091287 00000 n 0001091342 00000 n 0001091390 00000 n 0001091445 00000 n 0001091500 00000 n 0001091555 00000 n 0001091807 00000 n 0001092059 00000 n 0001092329 00000 n 0001092581 00000 n 0001092840 00000 n 0001093099 00000 n 0001093358 00000 n 0001093617 00000 n 0001093862 00000 n 0001094129 00000 n 0001094382 00000 n 0001094637 00000 n 0001095351 00000 n 0001102469 00000 n 0001095018 00000 n 0001095212 00000 n 0001102925 00000 n 0001102492 00000 n 0001102547 00000 n 0001102602 00000 n 0001102657 00000 n 0001102712 00000 n 0001102767 00000 n 0001102822 00000 n 0001102870 00000 n 0001103271 00000 n 0001108490 00000 n 0001103055 00000 n 0001103249 00000 n 0001109184 00000 n 0001108513 00000 n 0001108561 00000 n 0001108616 00000 n 0001108671 00000 n 0001108726 00000 n 0001108781 00000 n 0001108836 00000 n 0001108884 00000 n 0001108932 00000 n 0001109539 00000 n 0001113864 00000 n 0001109314 00000 n 0001109508 00000 n 0001120446 00000 n 0001113887 00000 n 0001113942 00000 n 0001113997 00000 n 0001114045 00000 n 0001114100 00000 n 0001114155 00000 n 0001114203 00000 n 0001114258 00000 n 0001114313 00000 n 0001114553 00000 n 0001114800 00000 n 0001115047 00000 n 0001115298 00000 n 0001115552 00000 n 0001115799 00000 n 0001116046 00000 n 0001116300 00000 n 0001116548 00000 n 0001116803 00000 n 0001117058 00000 n 0001117310 00000 n 0001117571 00000 n 0001117825 00000 n 0001118083 00000 n 0001118348 00000 n 0001118610 00000 n 0001118884 00000 n 0001119158 00000 n 0001119423 00000 n 0001119695 00000 n 0001119951 00000 n 0001120191 00000 n 0001121024 00000 n 0001128685 00000 n 0001120576 00000 n 0001120786 00000 n 0001128818 00000 n 0001128708 00000 n 0001128763 00000 n 0001129180 00000 n 0001134418 00000 n 0001128948 00000 n 0001129158 00000 n 0001134551 00000 n 0001134441 00000 n 0001134496 00000 n 0001134929 00000 n 0001140254 00000 n 0001134681 00000 n 0001134907 00000 n 0001140387 00000 n 0001140277 00000 n 0001140332 00000 n 0001140765 00000 n 0001145184 00000 n 0001140517 00000 n 0001140743 00000 n 0001145893 00000 n 0001145207 00000 n 0001145256 00000 n 0001145305 00000 n 0001145361 00000 n 0001145417 00000 n 0001145473 00000 n 0001145529 00000 n 0001145585 00000 n 0001145634 00000 n 0001146280 00000 n 0001151783 00000 n 0001146023 00000 n 0001146249 00000 n 0001151904 00000 n 0004547807 00000 n 0001151806 00000 n 0001151855 00000 n 0001152298 00000 n 0001157693 00000 n 0001152034 00000 n 0001152276 00000 n 0001157716 00000 n 0001158094 00000 n 0001162868 00000 n 0001157846 00000 n 0001158072 00000 n 0001163115 00000 n 0001162891 00000 n 0001162947 00000 n 0001163003 00000 n 0001163059 00000 n 0001163461 00000 n 0001172001 00000 n 0001163245 00000 n 0001163439 00000 n 0001172136 00000 n 0001172024 00000 n 0001172080 00000 n 0001172482 00000 n 0001177680 00000 n 0001172266 00000 n 0001172460 00000 n 0001178025 00000 n 0001177703 00000 n 0001177752 00000 n 0001177808 00000 n 0001177864 00000 n 0001177920 00000 n 0001177969 00000 n 0001178371 00000 n 0001183726 00000 n 0001178155 00000 n 0001178349 00000 n 0001184107 00000 n 0001183749 00000 n 0001183798 00000 n 0001183847 00000 n 0001184462 00000 n 0001189898 00000 n 0001184237 00000 n 0001184431 00000 n 0001191106 00000 n 0001189921 00000 n 0001189977 00000 n 0001190033 00000 n 0001190082 00000 n 0001190138 00000 n 0001190194 00000 n 0001190250 00000 n 0001190306 00000 n 0001190362 00000 n 0001190418 00000 n 0001190474 00000 n 0001190530 00000 n 0001190579 00000 n 0001190843 00000 n 0001191486 00000 n 0001196248 00000 n 0001191236 00000 n 0001191446 00000 n 0001199113 00000 n 0001196271 00000 n 0001196327 00000 n 0001196383 00000 n 0001196439 00000 n 0001196495 00000 n 0001196544 00000 n 0001196600 00000 n 0001196856 00000 n 0001197112 00000 n 0001197354 00000 n 0001197610 00000 n 0001197859 00000 n 0001198108 00000 n 0001198357 00000 n 0001198606 00000 n 0001198863 00000 n 0001199549 00000 n 0001205489 00000 n 0001199243 00000 n 0001199437 00000 n 0001205722 00000 n 0001205512 00000 n 0001205568 00000 n 0001205617 00000 n 0001205673 00000 n 0001206068 00000 n 0001209633 00000 n 0001205852 00000 n 0001206046 00000 n 0001209880 00000 n 0001209656 00000 n 0001209712 00000 n 0001209768 00000 n 0001209824 00000 n 0001210226 00000 n 0001214361 00000 n 0001210010 00000 n 0001210204 00000 n 0001220918 00000 n 0001214384 00000 n 0001214440 00000 n 0001214496 00000 n 0001214552 00000 n 0001214608 00000 n 0001214664 00000 n 0001214720 00000 n 0001214776 00000 n 0001214832 00000 n 0001214881 00000 n 0001214930 00000 n 0001215178 00000 n 0001215426 00000 n 0001215681 00000 n 0001215922 00000 n 0001216177 00000 n 0001216432 00000 n 0001216680 00000 n 0001216939 00000 n 0001217187 00000 n 0001217436 00000 n 0001217689 00000 n 0001217938 00000 n 0001218187 00000 n 0001218436 00000 n 0001218685 00000 n 0001218946 00000 n 0001219195 00000 n 0001219458 00000 n 0001219707 00000 n 0001219873 00000 n 0001220146 00000 n 0001220414 00000 n 0001220662 00000 n 0001221480 00000 n 0001227786 00000 n 0001221048 00000 n 0001221242 00000 n 0001238565 00000 n 0001227809 00000 n 0001227865 00000 n 0001227921 00000 n 0001227977 00000 n 0001228033 00000 n 0001228282 00000 n 0001228544 00000 n 0001228805 00000 n 0001229068 00000 n 0001229342 00000 n 0001229607 00000 n 0001229887 00000 n 0001230143 00000 n 0001230385 00000 n 0001230641 00000 n 0001230890 00000 n 0001231132 00000 n 0001231388 00000 n 0001231637 00000 n 0001231893 00000 n 0001232149 00000 n 0001232398 00000 n 0001232653 00000 n 0001232902 00000 n 0001233151 00000 n 0001233400 00000 n 0001233659 00000 n 0001233915 00000 n 0001234171 00000 n 0001234420 00000 n 0001234669 00000 n 0001234921 00000 n 0001235189 00000 n 0001235449 00000 n 0001235703 00000 n 0001235983 00000 n 0001236259 00000 n 0001236517 00000 n 0001236773 00000 n 0001237044 00000 n 0001237293 00000 n 0001237562 00000 n 0001237811 00000 n 0001238067 00000 n 0001238323 00000 n 0001239312 00000 n 0001247300 00000 n 0001238695 00000 n 0001238921 00000 n 0001247533 00000 n 0001247323 00000 n 0001247379 00000 n 0001247435 00000 n 0001247484 00000 n 0001247895 00000 n 0001253369 00000 n 0001247663 00000 n 0001247873 00000 n 0001253616 00000 n 0001253392 00000 n 0001253448 00000 n 0001253504 00000 n 0001253560 00000 n 0001253994 00000 n 0001259738 00000 n 0001253746 00000 n 0001253972 00000 n 0001261028 00000 n 0001259761 00000 n 0001259817 00000 n 0001259873 00000 n 0001259929 00000 n 0001259978 00000 n 0001260034 00000 n 0001260083 00000 n 0001260340 00000 n 0001260590 00000 n 0001260803 00000 n 0001261442 00000 n 0001268203 00000 n 0001261158 00000 n 0001261384 00000 n 0001268829 00000 n 0001268226 00000 n 0001268282 00000 n 0001268338 00000 n 0001268394 00000 n 0001268450 00000 n 0001268506 00000 n 0001268562 00000 n 0001269216 00000 n 0001274397 00000 n 0001268959 00000 n 0001269185 00000 n 0001274756 00000 n 0001274420 00000 n 0001274476 00000 n 0001274532 00000 n 0001274588 00000 n 0001274644 00000 n 0001274700 00000 n 0001275102 00000 n 0001279198 00000 n 0001274886 00000 n 0001275080 00000 n 0001279445 00000 n 0001279221 00000 n 0001279277 00000 n 0001279333 00000 n 0001279389 00000 n 0001279791 00000 n 0001284853 00000 n 0001279575 00000 n 0001279769 00000 n 0001284974 00000 n 0001284876 00000 n 0001284925 00000 n 0001285320 00000 n 0001289123 00000 n 0001285104 00000 n 0001285298 00000 n 0001289772 00000 n 0001289146 00000 n 0001289202 00000 n 0001289258 00000 n 0001289504 00000 n 0001290136 00000 n 0001297602 00000 n 0001289902 00000 n 0001290096 00000 n 0001297849 00000 n 0001297625 00000 n 0001297681 00000 n 0001297737 00000 n 0001297793 00000 n 0001298195 00000 n 0001302784 00000 n 0001297979 00000 n 0001298173 00000 n 0001303162 00000 n 0001302807 00000 n 0001302856 00000 n 0001302905 00000 n 0001303517 00000 n 0001309016 00000 n 0001303292 00000 n 0001303486 00000 n 0001309438 00000 n 0001309039 00000 n 0001309095 00000 n 0001309151 00000 n 0001309207 00000 n 0001309263 00000 n 0001309793 00000 n 0001314810 00000 n 0001309568 00000 n 0001309762 00000 n 0001314945 00000 n 0001314833 00000 n 0001314889 00000 n 0001315307 00000 n 0001319947 00000 n 0001315075 00000 n 0001315285 00000 n 0001320068 00000 n 0001319970 00000 n 0001320019 00000 n 0001320446 00000 n 0001327769 00000 n 0001320198 00000 n 0001320424 00000 n 0001328915 00000 n 0001327792 00000 n 0001327841 00000 n 0001327890 00000 n 0001327939 00000 n 0001327988 00000 n 0001328044 00000 n 0001328100 00000 n 0001328379 00000 n 0001328647 00000 n 0001329288 00000 n 0001335166 00000 n 0001329045 00000 n 0001329239 00000 n 0001336224 00000 n 0001335189 00000 n 0001335238 00000 n 0001335294 00000 n 0001335343 00000 n 0001335392 00000 n 0001335448 00000 n 0001335497 00000 n 0001335546 00000 n 0001335595 00000 n 0001335651 00000 n 0001335700 00000 n 0001335976 00000 n 0001336604 00000 n 0001341874 00000 n 0001336354 00000 n 0001336564 00000 n 0001343062 00000 n 0001341897 00000 n 0001341953 00000 n 0001342009 00000 n 0001342065 00000 n 0001342121 00000 n 0001342177 00000 n 0001342226 00000 n 0001342282 00000 n 0001342331 00000 n 0001342387 00000 n 0001342443 00000 n 0001342499 00000 n 0001342555 00000 n 0001342808 00000 n 0001343442 00000 n 0001348497 00000 n 0001343192 00000 n 0001343402 00000 n 0001349677 00000 n 0001348520 00000 n 0001348569 00000 n 0001348625 00000 n 0001348681 00000 n 0001348730 00000 n 0001348786 00000 n 0001348842 00000 n 0001348898 00000 n 0001348954 00000 n 0001349003 00000 n 0001349059 00000 n 0001349115 00000 n 0001349164 00000 n 0001349424 00000 n 0001350057 00000 n 0001355805 00000 n 0001349807 00000 n 0001350017 00000 n 0001356319 00000 n 0001355828 00000 n 0001355884 00000 n 0001355933 00000 n 0001355989 00000 n 0001356045 00000 n 0001356674 00000 n 0001361094 00000 n 0001356449 00000 n 0001356643 00000 n 0001361215 00000 n 0001361117 00000 n 0001361166 00000 n 0001361561 00000 n 0001366425 00000 n 0001361345 00000 n 0001361539 00000 n 0001366950 00000 n 0001366448 00000 n 0001366504 00000 n 0001366553 00000 n 0001366609 00000 n 0001366665 00000 n 0001367321 00000 n 0001373338 00000 n 0001367080 00000 n 0001367290 00000 n 0001373733 00000 n 0001373361 00000 n 0001373410 00000 n 0001373466 00000 n 0001374104 00000 n 0001379889 00000 n 0001373863 00000 n 0001374073 00000 n 0001380176 00000 n 0001379912 00000 n 0001380521 00000 n 0001385439 00000 n 0001380306 00000 n 0001380490 00000 n 0001385935 00000 n 0001385462 00000 n 0001385518 00000 n 0001385574 00000 n 0001385630 00000 n 0001385679 00000 n 0001386290 00000 n 0001391693 00000 n 0001386065 00000 n 0001386259 00000 n 0001392250 00000 n 0001391716 00000 n 0001391976 00000 n 0001392604 00000 n 0001397385 00000 n 0001392380 00000 n 0001392564 00000 n 0001398138 00000 n 0001397408 00000 n 0001397464 00000 n 0001397513 00000 n 0001397562 00000 n 0001397618 00000 n 0001397871 00000 n 0001398518 00000 n 0001402808 00000 n 0001398268 00000 n 0001398478 00000 n 0001403048 00000 n 0001402831 00000 n 0001402887 00000 n 0001402943 00000 n 0001402992 00000 n 0001403394 00000 n 0001410398 00000 n 0001403178 00000 n 0001403372 00000 n 0001410809 00000 n 0001410421 00000 n 0001410477 00000 n 0001410533 00000 n 0001411164 00000 n 0001419494 00000 n 0001410939 00000 n 0001411133 00000 n 0001419874 00000 n 0001419517 00000 n 0001419566 00000 n 0001419622 00000 n 0001420229 00000 n 0001424669 00000 n 0001420004 00000 n 0001420198 00000 n 0001424692 00000 n 0001425028 00000 n 0001428824 00000 n 0001424822 00000 n 0001425006 00000 n 0001430017 00000 n 0001428847 00000 n 0001428903 00000 n 0001428959 00000 n 0001429218 00000 n 0001429489 00000 n 0001429760 00000 n 0001430399 00000 n 0001438478 00000 n 0001430147 00000 n 0001430341 00000 n 0001438970 00000 n 0001438501 00000 n 0001438557 00000 n 0001438606 00000 n 0001438655 00000 n 0001438711 00000 n 0001439325 00000 n 0001445384 00000 n 0001439100 00000 n 0001439294 00000 n 0001449680 00000 n 0001445407 00000 n 0001445456 00000 n 0001445512 00000 n 0001445568 00000 n 0001445624 00000 n 0001445680 00000 n 0001445736 00000 n 0001445792 00000 n 0001445841 00000 n 0001446100 00000 n 0001446360 00000 n 0001446613 00000 n 0001446859 00000 n 0001447127 00000 n 0001447380 00000 n 0001447554 00000 n 0001447807 00000 n 0001448066 00000 n 0001448331 00000 n 0001448599 00000 n 0001448862 00000 n 0001449136 00000 n 0001449407 00000 n 0001450161 00000 n 0001457333 00000 n 0001449810 00000 n 0001450004 00000 n 0001457748 00000 n 0001457356 00000 n 0001457412 00000 n 0001457468 00000 n 0001457524 00000 n 0001457580 00000 n 0001458103 00000 n 0001462651 00000 n 0001457878 00000 n 0001458072 00000 n 0001462982 00000 n 0001462674 00000 n 0001462723 00000 n 0001462772 00000 n 0001462828 00000 n 0001462877 00000 n 0001462926 00000 n 0001463328 00000 n 0001468127 00000 n 0001463112 00000 n 0001463306 00000 n 0001468438 00000 n 0001468150 00000 n 0001468206 00000 n 0001468262 00000 n 0001468793 00000 n 0001473899 00000 n 0001468568 00000 n 0001468762 00000 n 0001474139 00000 n 0001473922 00000 n 0001473978 00000 n 0001474034 00000 n 0001474090 00000 n 0001474485 00000 n 0001479594 00000 n 0001474269 00000 n 0001474463 00000 n 0001480153 00000 n 0001479617 00000 n 0001479673 00000 n 0001479722 00000 n 0001479984 00000 n 0001480533 00000 n 0001485728 00000 n 0001480283 00000 n 0001480493 00000 n 0001486784 00000 n 0001485751 00000 n 0001485807 00000 n 0001485856 00000 n 0001485905 00000 n 0001485961 00000 n 0001486228 00000 n 0001486510 00000 n 0001487157 00000 n 0001492316 00000 n 0001486914 00000 n 0001487108 00000 n 0001492807 00000 n 0001492339 00000 n 0001492388 00000 n 0001492444 00000 n 0001492500 00000 n 0001492549 00000 n 0001493162 00000 n 0001498107 00000 n 0001492937 00000 n 0001493131 00000 n 0001499813 00000 n 0001498130 00000 n 0001498179 00000 n 0001498235 00000 n 0001498284 00000 n 0001498340 00000 n 0001498396 00000 n 0001498452 00000 n 0001498501 00000 n 0001498557 00000 n 0001498814 00000 n 0001499062 00000 n 0001499310 00000 n 0001499565 00000 n 0001500204 00000 n 0001506292 00000 n 0001499943 00000 n 0001500137 00000 n 0001506420 00000 n 0001506315 00000 n 0001506371 00000 n 0001506766 00000 n 0001510525 00000 n 0001506550 00000 n 0001506744 00000 n 0001513212 00000 n 0001510548 00000 n 0001510597 00000 n 0001510653 00000 n 0001510709 00000 n 0001510765 00000 n 0001510814 00000 n 0001510870 00000 n 0001510926 00000 n 0001510975 00000 n 0001511222 00000 n 0001511469 00000 n 0001511723 00000 n 0001511970 00000 n 0001512217 00000 n 0001512471 00000 n 0001512718 00000 n 0001512964 00000 n 0001513639 00000 n 0001519800 00000 n 0001513342 00000 n 0001513536 00000 n 0001520047 00000 n 0001519823 00000 n 0001519879 00000 n 0001519935 00000 n 0001519991 00000 n 0001520409 00000 n 0001526701 00000 n 0001520177 00000 n 0001520387 00000 n 0001527358 00000 n 0001526724 00000 n 0001526780 00000 n 0001526829 00000 n 0001527094 00000 n 0001527722 00000 n 0001534543 00000 n 0001527488 00000 n 0001527682 00000 n 0001534853 00000 n 0001534566 00000 n 0001534615 00000 n 0001534671 00000 n 0001535224 00000 n 0001541000 00000 n 0001534983 00000 n 0001535193 00000 n 0001541023 00000 n 0001541359 00000 n 0001545281 00000 n 0001541153 00000 n 0001541337 00000 n 0001545409 00000 n 0001545304 00000 n 0001545353 00000 n 0001545755 00000 n 0001550509 00000 n 0001545539 00000 n 0001545733 00000 n 0001553434 00000 n 0001550532 00000 n 0001550588 00000 n 0001550644 00000 n 0001550693 00000 n 0001550749 00000 n 0001550805 00000 n 0001550861 00000 n 0001551118 00000 n 0001551385 00000 n 0001551641 00000 n 0001551900 00000 n 0001552156 00000 n 0001552405 00000 n 0001552656 00000 n 0001552908 00000 n 0001553165 00000 n 0001553870 00000 n 0001561424 00000 n 0001553564 00000 n 0001553758 00000 n 0001567069 00000 n 0001561447 00000 n 0001561503 00000 n 0001561552 00000 n 0001561608 00000 n 0001561664 00000 n 0001561911 00000 n 0001562175 00000 n 0001562431 00000 n 0001562691 00000 n 0001562957 00000 n 0001563202 00000 n 0001563473 00000 n 0001563734 00000 n 0001564001 00000 n 0001564274 00000 n 0001564533 00000 n 0001564791 00000 n 0001565059 00000 n 0001565313 00000 n 0001565582 00000 n 0001565838 00000 n 0001566100 00000 n 0001566285 00000 n 0001566500 00000 n 0001566685 00000 n 0001566870 00000 n 0001567629 00000 n 0001573978 00000 n 0001567199 00000 n 0001567409 00000 n 0001574997 00000 n 0001574001 00000 n 0001574050 00000 n 0001574106 00000 n 0001574162 00000 n 0001574218 00000 n 0001574274 00000 n 0001574330 00000 n 0001574379 00000 n 0001574435 00000 n 0001574484 00000 n 0001574533 00000 n 0001574806 00000 n 0001575361 00000 n 0001581389 00000 n 0001575127 00000 n 0001575321 00000 n 0001581972 00000 n 0001581412 00000 n 0001581468 00000 n 0001581524 00000 n 0001581580 00000 n 0001581636 00000 n 0001581692 00000 n 0001581748 00000 n 0001581804 00000 n 0001581860 00000 n 0001581916 00000 n 0001582318 00000 n 0001586488 00000 n 0001582102 00000 n 0001582296 00000 n 0001586896 00000 n 0001586511 00000 n 0001586567 00000 n 0001586623 00000 n 0001587267 00000 n 0001591399 00000 n 0001587026 00000 n 0001587236 00000 n 0001592093 00000 n 0001591422 00000 n 0001591478 00000 n 0001591534 00000 n 0001591590 00000 n 0001591646 00000 n 0001591702 00000 n 0001591758 00000 n 0001591807 00000 n 0001591863 00000 n 0001592464 00000 n 0001597442 00000 n 0001592223 00000 n 0001592433 00000 n 0001597643 00000 n 0001597465 00000 n 0001597998 00000 n 0001602176 00000 n 0001597773 00000 n 0001597967 00000 n 0001602823 00000 n 0001602199 00000 n 0001602255 00000 n 0001602304 00000 n 0001602353 00000 n 0001602409 00000 n 0001602628 00000 n 0001603203 00000 n 0001608061 00000 n 0001602953 00000 n 0001603163 00000 n 0001608742 00000 n 0001608084 00000 n 0001608140 00000 n 0001608196 00000 n 0001608252 00000 n 0001608308 00000 n 0001608364 00000 n 0001608413 00000 n 0001608462 00000 n 0001608518 00000 n 0001608574 00000 n 0001608630 00000 n 0001608686 00000 n 0001609088 00000 n 0001614331 00000 n 0001608872 00000 n 0001609066 00000 n 0001619431 00000 n 0001614354 00000 n 0001614410 00000 n 0001614466 00000 n 0001614522 00000 n 0001614578 00000 n 0001614634 00000 n 0001614690 00000 n 0001614739 00000 n 0001614795 00000 n 0001614843 00000 n 0001614899 00000 n 0001615154 00000 n 0001615410 00000 n 0001615665 00000 n 0001615913 00000 n 0001616167 00000 n 0001616422 00000 n 0001616670 00000 n 0001616918 00000 n 0001617173 00000 n 0001617422 00000 n 0001617671 00000 n 0001617927 00000 n 0001618176 00000 n 0001618432 00000 n 0001618684 00000 n 0001618926 00000 n 0001619182 00000 n 0001619955 00000 n 0001627783 00000 n 0001619561 00000 n 0001619771 00000 n 0001628289 00000 n 0001627806 00000 n 0001627862 00000 n 0001627918 00000 n 0001627967 00000 n 0001628023 00000 n 0001628660 00000 n 0001633571 00000 n 0001628419 00000 n 0001628629 00000 n 0001634508 00000 n 0001633594 00000 n 0001633650 00000 n 0001633706 00000 n 0001633762 00000 n 0001633818 00000 n 0001633874 00000 n 0001633923 00000 n 0001633979 00000 n 0001634028 00000 n 0001634084 00000 n 0001634140 00000 n 0001634196 00000 n 0001634245 00000 n 0001634863 00000 n 0001641131 00000 n 0001634638 00000 n 0001634832 00000 n 0001641462 00000 n 0001641154 00000 n 0001641203 00000 n 0001641259 00000 n 0001641308 00000 n 0001641357 00000 n 0001641413 00000 n 0001641824 00000 n 0001651172 00000 n 0001641592 00000 n 0001641802 00000 n 0001651832 00000 n 0001651195 00000 n 0001651251 00000 n 0001651307 00000 n 0001651356 00000 n 0001651412 00000 n 0001651468 00000 n 0001651517 00000 n 0001651566 00000 n 0001651622 00000 n 0001651671 00000 n 0001651727 00000 n 0001651783 00000 n 0001652178 00000 n 0001663373 00000 n 0001651962 00000 n 0001652156 00000 n 0001665394 00000 n 0001663397 00000 n 0001663453 00000 n 0001663509 00000 n 0001663565 00000 n 0001663614 00000 n 0001663877 00000 n 0001664124 00000 n 0001664378 00000 n 0001664646 00000 n 0001664893 00000 n 0001665147 00000 n 0001665803 00000 n 0001672365 00000 n 0001665524 00000 n 0001665718 00000 n 0001673458 00000 n 0001672388 00000 n 0001672437 00000 n 0001672493 00000 n 0001672549 00000 n 0001672605 00000 n 0001672661 00000 n 0001672717 00000 n 0001672766 00000 n 0001672815 00000 n 0001672871 00000 n 0001672927 00000 n 0001673200 00000 n 0001673822 00000 n 0001683567 00000 n 0001673588 00000 n 0001673782 00000 n 0001688550 00000 n 0001683590 00000 n 0001683646 00000 n 0001683695 00000 n 0001683751 00000 n 0001683807 00000 n 0001683856 00000 n 0001683912 00000 n 0001683961 00000 n 0001684010 00000 n 0001684059 00000 n 0001684115 00000 n 0001684171 00000 n 0001684227 00000 n 0001684276 00000 n 0001684332 00000 n 0001684578 00000 n 0001684824 00000 n 0001685077 00000 n 0001685323 00000 n 0001685568 00000 n 0001685821 00000 n 0001686060 00000 n 0001686313 00000 n 0001686560 00000 n 0001686807 00000 n 0001687054 00000 n 0001687294 00000 n 0001687548 00000 n 0001687802 00000 n 0001688049 00000 n 0001688303 00000 n 0001689049 00000 n 0001694878 00000 n 0001688680 00000 n 0001688874 00000 n 0001695118 00000 n 0001694901 00000 n 0001694957 00000 n 0001695006 00000 n 0001695062 00000 n 0001695464 00000 n 0001703835 00000 n 0001695248 00000 n 0001695442 00000 n 0001706288 00000 n 0001703858 00000 n 0001703914 00000 n 0001703970 00000 n 0001704026 00000 n 0001704082 00000 n 0001704138 00000 n 0001704194 00000 n 0001704250 00000 n 0001704306 00000 n 0001704355 00000 n 0001704411 00000 n 0001704467 00000 n 0001704523 00000 n 0001704579 00000 n 0001704628 00000 n 0001704684 00000 n 0001704740 00000 n 0001704789 00000 n 0001704845 00000 n 0001704894 00000 n 0001704950 00000 n 0001705201 00000 n 0001705460 00000 n 0001705725 00000 n 0001705917 00000 n 0001706096 00000 n 0001706672 00000 n 0001715569 00000 n 0001706418 00000 n 0001706596 00000 n 0001718164 00000 n 0001715592 00000 n 0001715648 00000 n 0001715704 00000 n 0001715753 00000 n 0001715809 00000 n 0001715865 00000 n 0001715914 00000 n 0001715970 00000 n 0001716026 00000 n 0001716277 00000 n 0001716541 00000 n 0001716792 00000 n 0001717039 00000 n 0001717279 00000 n 0001717552 00000 n 0001717742 00000 n 0001717932 00000 n 0001718591 00000 n 0001724219 00000 n 0001718294 00000 n 0001718488 00000 n 0001724462 00000 n 0001724242 00000 n 0001724823 00000 n 0001729276 00000 n 0001724592 00000 n 0001724792 00000 n 0001737572 00000 n 0001729299 00000 n 0001737264 00000 n 0001737287 00000 n 0001737335 00000 n 0001737383 00000 n 0001737944 00000 n 0001742070 00000 n 0001737702 00000 n 0001737913 00000 n 0001742359 00000 n 0001742093 00000 n 0001742704 00000 n 0001746117 00000 n 0001742489 00000 n 0001742673 00000 n 0001746140 00000 n 0001746476 00000 n 0001750746 00000 n 0001746270 00000 n 0001746454 00000 n 0001750769 00000 n 0001751105 00000 n 0001754547 00000 n 0001750899 00000 n 0001751083 00000 n 0001778004 00000 n 0001754570 00000 n 0001769306 00000 n 0001769330 00000 n 0001769386 00000 n 0001769442 00000 n 0001769491 00000 n 0001769547 00000 n 0001769603 00000 n 0001769652 00000 n 0001769708 00000 n 0001769764 00000 n 0001769820 00000 n 0001769876 00000 n 0001769932 00000 n 0001769988 00000 n 0001770243 00000 n 0001770403 00000 n 0001770664 00000 n 0001770923 00000 n 0001771186 00000 n 0001771442 00000 n 0001771704 00000 n 0001771884 00000 n 0001772141 00000 n 0001772394 00000 n 0001772562 00000 n 0001772722 00000 n 0001772902 00000 n 0001773173 00000 n 0001773417 00000 n 0001773677 00000 n 0001773937 00000 n 0001774196 00000 n 0001774462 00000 n 0001774721 00000 n 0001774897 00000 n 0001775165 00000 n 0001775424 00000 n 0001775689 00000 n 0001775955 00000 n 0001776213 00000 n 0001776481 00000 n 0001776745 00000 n 0001777008 00000 n 0001777219 00000 n 0001777421 00000 n 0001777615 00000 n 0001777797 00000 n 0001778673 00000 n 0001787154 00000 n 0001778134 00000 n 0001778345 00000 n 0001788043 00000 n 0001787177 00000 n 0001787226 00000 n 0001787282 00000 n 0001787523 00000 n 0001787782 00000 n 0001788416 00000 n 0001796321 00000 n 0001788173 00000 n 0001788367 00000 n 0001797975 00000 n 0001796344 00000 n 0001796620 00000 n 0001796894 00000 n 0001797160 00000 n 0001797434 00000 n 0001797709 00000 n 0001798365 00000 n 0001805371 00000 n 0001798105 00000 n 0001798289 00000 n 0001806595 00000 n 0001805394 00000 n 0001805450 00000 n 0001805499 00000 n 0001805555 00000 n 0001805611 00000 n 0001805667 00000 n 0001805723 00000 n 0001805983 00000 n 0001806249 00000 n 0001806426 00000 n 0001806993 00000 n 0001814862 00000 n 0001806725 00000 n 0001806935 00000 n 0001815584 00000 n 0001814885 00000 n 0001814941 00000 n 0001814990 00000 n 0001815039 00000 n 0001815095 00000 n 0001815338 00000 n 0001815948 00000 n 0001822506 00000 n 0001815714 00000 n 0001815908 00000 n 0001823178 00000 n 0001822529 00000 n 0001822585 00000 n 0001822634 00000 n 0001822918 00000 n 0001823542 00000 n 0001830528 00000 n 0001823308 00000 n 0001823502 00000 n 0001830649 00000 n 0001830551 00000 n 0001830600 00000 n 0001830995 00000 n 0001835731 00000 n 0001830779 00000 n 0001830973 00000 n 0001836231 00000 n 0001835754 00000 n 0001835810 00000 n 0001835859 00000 n 0001835908 00000 n 0001835964 00000 n 0001836586 00000 n 0001841546 00000 n 0001836361 00000 n 0001836555 00000 n 0001841681 00000 n 0001841569 00000 n 0001841625 00000 n 0001842027 00000 n 0001848271 00000 n 0001841811 00000 n 0001842005 00000 n 0001848755 00000 n 0001848294 00000 n 0001848343 00000 n 0001848392 00000 n 0001848448 00000 n 0001848504 00000 n 0001849110 00000 n 0001853427 00000 n 0001848885 00000 n 0001849079 00000 n 0001853562 00000 n 0001853450 00000 n 0001853506 00000 n 0001853908 00000 n 0001857885 00000 n 0001853692 00000 n 0001853886 00000 n 0001858286 00000 n 0001857908 00000 n 0001857964 00000 n 0001858020 00000 n 0001858641 00000 n 0001864845 00000 n 0001858416 00000 n 0001858610 00000 n 0001865714 00000 n 0001864868 00000 n 0001864924 00000 n 0001864973 00000 n 0001865029 00000 n 0001865085 00000 n 0001865141 00000 n 0001865197 00000 n 0001865448 00000 n 0001866078 00000 n 0001872903 00000 n 0001865844 00000 n 0001866038 00000 n 0001873312 00000 n 0001872926 00000 n 0001872982 00000 n 0001873038 00000 n 0001873667 00000 n 0001878233 00000 n 0001873442 00000 n 0001873636 00000 n 0001878903 00000 n 0001878256 00000 n 0001878312 00000 n 0001878368 00000 n 0001878638 00000 n 0001879267 00000 n 0001884779 00000 n 0001879033 00000 n 0001879227 00000 n 0001884802 00000 n 0001885138 00000 n 0001891274 00000 n 0001884932 00000 n 0001885116 00000 n 0001891659 00000 n 0001891297 00000 n 0001891346 00000 n 0001891395 00000 n 0001892014 00000 n 0001897070 00000 n 0001891789 00000 n 0001891983 00000 n 0001897591 00000 n 0001897093 00000 n 0001897149 00000 n 0001897205 00000 n 0001897261 00000 n 0001897317 00000 n 0001897946 00000 n 0001903952 00000 n 0001897721 00000 n 0001897915 00000 n 0001904466 00000 n 0001903975 00000 n 0001904031 00000 n 0001904087 00000 n 0001904143 00000 n 0001904199 00000 n 0001904821 00000 n 0001909506 00000 n 0001904596 00000 n 0001904790 00000 n 0001916226 00000 n 0001909529 00000 n 0001909585 00000 n 0001909634 00000 n 0001909690 00000 n 0001909746 00000 n 0001909795 00000 n 0001909851 00000 n 0001909907 00000 n 0001909963 00000 n 0001910220 00000 n 0001910488 00000 n 0001910734 00000 n 0001911002 00000 n 0001911258 00000 n 0001911526 00000 n 0001911804 00000 n 0001912053 00000 n 0001912321 00000 n 0001912576 00000 n 0001912822 00000 n 0001913066 00000 n 0001913314 00000 n 0001913553 00000 n 0001913812 00000 n 0001914056 00000 n 0001914323 00000 n 0001914588 00000 n 0001914836 00000 n 0001915097 00000 n 0001915344 00000 n 0001915594 00000 n 0001915842 00000 n 0001916020 00000 n 0001916813 00000 n 0001924388 00000 n 0001916356 00000 n 0001916566 00000 n 0001926211 00000 n 0004553264 00000 n 0001924411 00000 n 0001924467 00000 n 0001924523 00000 n 0001924579 00000 n 0001924635 00000 n 0001924691 00000 n 0001924747 00000 n 0001924803 00000 n 0001924859 00000 n 0001924908 00000 n 0001924964 00000 n 0001925020 00000 n 0001925076 00000 n 0001925132 00000 n 0001925188 00000 n 0001925433 00000 n 0001925707 00000 n 0001925959 00000 n 0001926625 00000 n 0001933818 00000 n 0001926341 00000 n 0001926567 00000 n 0001936264 00000 n 0001933841 00000 n 0001933897 00000 n 0001933953 00000 n 0001934212 00000 n 0001934475 00000 n 0001934741 00000 n 0001934983 00000 n 0001935233 00000 n 0001935486 00000 n 0001935746 00000 n 0001936007 00000 n 0001936691 00000 n 0001942922 00000 n 0001936394 00000 n 0001936588 00000 n 0001943940 00000 n 0001942945 00000 n 0001943001 00000 n 0001943050 00000 n 0001943106 00000 n 0001943162 00000 n 0001943428 00000 n 0001943677 00000 n 0001944329 00000 n 0001949832 00000 n 0001944070 00000 n 0001944280 00000 n 0001952877 00000 n 0001949855 00000 n 0001949911 00000 n 0001949967 00000 n 0001950023 00000 n 0001950072 00000 n 0001950128 00000 n 0001950184 00000 n 0001950240 00000 n 0001950296 00000 n 0001950352 00000 n 0001950408 00000 n 0001950464 00000 n 0001950520 00000 n 0001950576 00000 n 0001950632 00000 n 0001950688 00000 n 0001950744 00000 n 0001950800 00000 n 0001950849 00000 n 0001951117 00000 n 0001951382 00000 n 0001951642 00000 n 0001951901 00000 n 0001952170 00000 n 0001952437 00000 n 0001952657 00000 n 0001953311 00000 n 0001964035 00000 n 0001953007 00000 n 0001953217 00000 n 0001973243 00000 n 0001964059 00000 n 0001964115 00000 n 0001964171 00000 n 0001964227 00000 n 0001964283 00000 n 0001964339 00000 n 0001964395 00000 n 0001964451 00000 n 0001964507 00000 n 0001964754 00000 n 0001965008 00000 n 0001965259 00000 n 0001965509 00000 n 0001965762 00000 n 0001966011 00000 n 0001966264 00000 n 0001966515 00000 n 0001966756 00000 n 0001967014 00000 n 0001967260 00000 n 0001967505 00000 n 0001967769 00000 n 0001968017 00000 n 0001968279 00000 n 0001968551 00000 n 0001968799 00000 n 0001969064 00000 n 0001969323 00000 n 0001969584 00000 n 0001969848 00000 n 0001970106 00000 n 0001970376 00000 n 0001970638 00000 n 0001970886 00000 n 0001971154 00000 n 0001971401 00000 n 0001971663 00000 n 0001971936 00000 n 0001972110 00000 n 0001972293 00000 n 0001972479 00000 n 0001972661 00000 n 0001972846 00000 n 0001973054 00000 n 0001973929 00000 n 0001981242 00000 n 0001973373 00000 n 0001973583 00000 n 0001982421 00000 n 0001981265 00000 n 0001981321 00000 n 0001981377 00000 n 0001981433 00000 n 0001981489 00000 n 0001981545 00000 n 0001981601 00000 n 0001981650 00000 n 0001981706 00000 n 0001981762 00000 n 0001981818 00000 n 0001981874 00000 n 0001981930 00000 n 0001981986 00000 n 0001982035 00000 n 0001982091 00000 n 0001982147 00000 n 0001982776 00000 n 0001991728 00000 n 0001982551 00000 n 0001982745 00000 n 0001992272 00000 n 0001991751 00000 n 0001991807 00000 n 0001991863 00000 n 0001992065 00000 n 0001992636 00000 n 0001998823 00000 n 0001992402 00000 n 0001992596 00000 n 0002000040 00000 n 0001998846 00000 n 0001998902 00000 n 0001998958 00000 n 0001999014 00000 n 0001999070 00000 n 0001999126 00000 n 0001999182 00000 n 0001999238 00000 n 0001999294 00000 n 0001999343 00000 n 0001999399 00000 n 0001999448 00000 n 0001999504 00000 n 0001999767 00000 n 0002000404 00000 n 0002005627 00000 n 0002000170 00000 n 0002000364 00000 n 0002007062 00000 n 0002005650 00000 n 0002005706 00000 n 0002005762 00000 n 0002005818 00000 n 0002005874 00000 n 0002005930 00000 n 0002005986 00000 n 0002006257 00000 n 0002006527 00000 n 0002006797 00000 n 0002007444 00000 n 0002014027 00000 n 0002007192 00000 n 0002007386 00000 n 0002015062 00000 n 0002014050 00000 n 0002014106 00000 n 0002014162 00000 n 0002014218 00000 n 0002014274 00000 n 0002014544 00000 n 0002014810 00000 n 0002015435 00000 n 0002020783 00000 n 0002015192 00000 n 0002015386 00000 n 0002021142 00000 n 0002020806 00000 n 0002020862 00000 n 0002020918 00000 n 0002021497 00000 n 0002027809 00000 n 0002021272 00000 n 0002021466 00000 n 0002028318 00000 n 0002027832 00000 n 0002027888 00000 n 0002027937 00000 n 0002027986 00000 n 0002028042 00000 n 0002028673 00000 n 0002033194 00000 n 0002028448 00000 n 0002028642 00000 n 0002039483 00000 n 0002033217 00000 n 0002033273 00000 n 0002033329 00000 n 0002033385 00000 n 0002033441 00000 n 0002033497 00000 n 0002033546 00000 n 0002033602 00000 n 0002033658 00000 n 0002033714 00000 n 0002033770 00000 n 0002034015 00000 n 0002034285 00000 n 0002034530 00000 n 0002034782 00000 n 0002035027 00000 n 0002035271 00000 n 0002035523 00000 n 0002035768 00000 n 0002036020 00000 n 0002036258 00000 n 0002036503 00000 n 0002036756 00000 n 0002037002 00000 n 0002037255 00000 n 0002037508 00000 n 0002037747 00000 n 0002038000 00000 n 0002038239 00000 n 0002038485 00000 n 0002038738 00000 n 0002038984 00000 n 0002039230 00000 n 0002040036 00000 n 0002049223 00000 n 0002039613 00000 n 0002039807 00000 n 0002049988 00000 n 0002049246 00000 n 0002049295 00000 n 0002049344 00000 n 0002049393 00000 n 0002049449 00000 n 0002049505 00000 n 0002049554 00000 n 0002049603 00000 n 0002049652 00000 n 0002049708 00000 n 0002049764 00000 n 0002050359 00000 n 0002058812 00000 n 0002050118 00000 n 0002050328 00000 n 0002060853 00000 n 0002058835 00000 n 0002058891 00000 n 0002058940 00000 n 0002058996 00000 n 0002059045 00000 n 0002059101 00000 n 0002059157 00000 n 0002059206 00000 n 0002059255 00000 n 0002059311 00000 n 0002059367 00000 n 0002059423 00000 n 0002059479 00000 n 0002059535 00000 n 0002059591 00000 n 0002059850 00000 n 0002060123 00000 n 0002060390 00000 n 0002060611 00000 n 0002061276 00000 n 0002070208 00000 n 0002060983 00000 n 0002061209 00000 n 0002070665 00000 n 0002070231 00000 n 0002070287 00000 n 0002070336 00000 n 0002070385 00000 n 0002070441 00000 n 0002070497 00000 n 0002070553 00000 n 0002070609 00000 n 0002071043 00000 n 0002077574 00000 n 0002070795 00000 n 0002071021 00000 n 0002077821 00000 n 0002077597 00000 n 0002077653 00000 n 0002077709 00000 n 0002077765 00000 n 0002078199 00000 n 0002083832 00000 n 0002077951 00000 n 0002078177 00000 n 0002087299 00000 n 0002083855 00000 n 0002083904 00000 n 0002083953 00000 n 0002084202 00000 n 0002084456 00000 n 0002084716 00000 n 0002084961 00000 n 0002085230 00000 n 0002085495 00000 n 0002085748 00000 n 0002086020 00000 n 0002086284 00000 n 0002086540 00000 n 0002086795 00000 n 0002087041 00000 n 0002087794 00000 n 0002095717 00000 n 0002087429 00000 n 0002087655 00000 n 0002120714 00000 n 0002095740 00000 n 0002095796 00000 n 0002095852 00000 n 0002096116 00000 n 0002096373 00000 n 0002096630 00000 n 0002096873 00000 n 0002097133 00000 n 0002097383 00000 n 0002097646 00000 n 0002097907 00000 n 0002098165 00000 n 0002098426 00000 n 0002098675 00000 n 0002098919 00000 n 0002099174 00000 n 0002099419 00000 n 0002099687 00000 n 0002099942 00000 n 0002100203 00000 n 0002100468 00000 n 0002100719 00000 n 0002100969 00000 n 0002101231 00000 n 0002101498 00000 n 0002101769 00000 n 0002102032 00000 n 0002102280 00000 n 0002102544 00000 n 0002102797 00000 n 0002103059 00000 n 0002103320 00000 n 0002103579 00000 n 0002103849 00000 n 0002104107 00000 n 0002104354 00000 n 0002104617 00000 n 0002104878 00000 n 0002105131 00000 n 0002105402 00000 n 0002105664 00000 n 0002105937 00000 n 0002106195 00000 n 0002106445 00000 n 0002106711 00000 n 0002106962 00000 n 0002107221 00000 n 0002107486 00000 n 0002107739 00000 n 0002108008 00000 n 0002108274 00000 n 0002108547 00000 n 0002108807 00000 n 0002109068 00000 n 0002109325 00000 n 0002109588 00000 n 0002109838 00000 n 0002110104 00000 n 0002110365 00000 n 0002110621 00000 n 0002110885 00000 n 0002111141 00000 n 0002111390 00000 n 0002111656 00000 n 0002111908 00000 n 0002112172 00000 n 0002112428 00000 n 0002112700 00000 n 0002112978 00000 n 0002113224 00000 n 0002113480 00000 n 0002113752 00000 n 0002114004 00000 n 0002114269 00000 n 0002114539 00000 n 0002114793 00000 n 0002115059 00000 n 0002115316 00000 n 0002115577 00000 n 0002115842 00000 n 0002116104 00000 n 0002116374 00000 n 0002116643 00000 n 0002116915 00000 n 0002117179 00000 n 0002117440 00000 n 0002117687 00000 n 0002117957 00000 n 0002118126 00000 n 0002118392 00000 n 0002118656 00000 n 0002118910 00000 n 0002119167 00000 n 0002119424 00000 n 0002119678 00000 n 0002119949 00000 n 0002120201 00000 n 0002120458 00000 n 0002121908 00000 n 0002131500 00000 n 0002120844 00000 n 0002121022 00000 n 0002133361 00000 n 0002131523 00000 n 0002131579 00000 n 0002131635 00000 n 0002131691 00000 n 0002131747 00000 n 0002131803 00000 n 0002131859 00000 n 0002131915 00000 n 0002131971 00000 n 0002132027 00000 n 0002132083 00000 n 0002132338 00000 n 0002132597 00000 n 0002132841 00000 n 0002133096 00000 n 0002133752 00000 n 0002142198 00000 n 0002133491 00000 n 0002133685 00000 n 0002143368 00000 n 0002142221 00000 n 0002142277 00000 n 0002142333 00000 n 0002142389 00000 n 0002142445 00000 n 0002142704 00000 n 0002142984 00000 n 0002143172 00000 n 0002143766 00000 n 0002151637 00000 n 0002143498 00000 n 0002143708 00000 n 0002152641 00000 n 0002151660 00000 n 0002151709 00000 n 0002151765 00000 n 0002151821 00000 n 0002151877 00000 n 0002151933 00000 n 0002151989 00000 n 0002152045 00000 n 0002152094 00000 n 0002152361 00000 n 0002153005 00000 n 0002161030 00000 n 0002152771 00000 n 0002152965 00000 n 0002161487 00000 n 0002161053 00000 n 0002161102 00000 n 0002161158 00000 n 0002161207 00000 n 0002161263 00000 n 0002161319 00000 n 0002161375 00000 n 0002161431 00000 n 0002161849 00000 n 0002168681 00000 n 0002161617 00000 n 0002161827 00000 n 0002169349 00000 n 0002168704 00000 n 0002168760 00000 n 0002168816 00000 n 0002169083 00000 n 0002169713 00000 n 0002175505 00000 n 0002169479 00000 n 0002169673 00000 n 0002176128 00000 n 0002175528 00000 n 0002175577 00000 n 0002175633 00000 n 0002175689 00000 n 0002175745 00000 n 0002175794 00000 n 0002175850 00000 n 0002176483 00000 n 0002183076 00000 n 0002176258 00000 n 0002176452 00000 n 0002185712 00000 n 0002183099 00000 n 0002183148 00000 n 0002183197 00000 n 0002183253 00000 n 0002183309 00000 n 0002183365 00000 n 0002183421 00000 n 0002183690 00000 n 0002183948 00000 n 0002184217 00000 n 0002184482 00000 n 0002184753 00000 n 0002184975 00000 n 0002185213 00000 n 0002185452 00000 n 0002186155 00000 n 0002194388 00000 n 0002185842 00000 n 0002186052 00000 n 0002194635 00000 n 0002194411 00000 n 0002194467 00000 n 0002194523 00000 n 0002194579 00000 n 0002194997 00000 n 0002201250 00000 n 0002194765 00000 n 0002194975 00000 n 0002201915 00000 n 0002201273 00000 n 0002201329 00000 n 0002201385 00000 n 0002201649 00000 n 0002202279 00000 n 0002206382 00000 n 0002202045 00000 n 0002202239 00000 n 0002206839 00000 n 0002206405 00000 n 0002206461 00000 n 0002206510 00000 n 0002206566 00000 n 0002206622 00000 n 0002206678 00000 n 0002206734 00000 n 0002206783 00000 n 0002207185 00000 n 0002212150 00000 n 0002206969 00000 n 0002207163 00000 n 0002212924 00000 n 0002212173 00000 n 0002212229 00000 n 0002212285 00000 n 0002212341 00000 n 0002212397 00000 n 0002212666 00000 n 0002213288 00000 n 0002217556 00000 n 0002213054 00000 n 0002213248 00000 n 0002219059 00000 n 0002217579 00000 n 0002217635 00000 n 0002217691 00000 n 0002217747 00000 n 0002217803 00000 n 0002217859 00000 n 0002217915 00000 n 0002217971 00000 n 0002218027 00000 n 0002218286 00000 n 0002218541 00000 n 0002218793 00000 n 0002219441 00000 n 0002225334 00000 n 0002219189 00000 n 0002219383 00000 n 0002226073 00000 n 0002225357 00000 n 0002225413 00000 n 0002225469 00000 n 0002225525 00000 n 0002225581 00000 n 0002225821 00000 n 0002226437 00000 n 0002231549 00000 n 0002226203 00000 n 0002226397 00000 n 0002232940 00000 n 0002231572 00000 n 0002231628 00000 n 0002231684 00000 n 0002231733 00000 n 0002231782 00000 n 0002231838 00000 n 0002231894 00000 n 0002232156 00000 n 0002232432 00000 n 0002232693 00000 n 0002233322 00000 n 0002241505 00000 n 0002233070 00000 n 0002233264 00000 n 0002242222 00000 n 0002241528 00000 n 0002241584 00000 n 0002241640 00000 n 0002241696 00000 n 0002241752 00000 n 0002242016 00000 n 0002242586 00000 n 0002247539 00000 n 0002242352 00000 n 0002242546 00000 n 0002248382 00000 n 0002247562 00000 n 0002247618 00000 n 0002247674 00000 n 0002247924 00000 n 0002248205 00000 n 0002248755 00000 n 0002253990 00000 n 0002248512 00000 n 0002248706 00000 n 0002254808 00000 n 0002254013 00000 n 0002254069 00000 n 0002254125 00000 n 0002254390 00000 n 0002254603 00000 n 0002255197 00000 n 0002261375 00000 n 0002254938 00000 n 0002255148 00000 n 0002261953 00000 n 0002261398 00000 n 0002261454 00000 n 0002261510 00000 n 0002261760 00000 n 0002262317 00000 n 0002268169 00000 n 0002262083 00000 n 0002262277 00000 n 0002268652 00000 n 0002268192 00000 n 0002268241 00000 n 0002268297 00000 n 0002268353 00000 n 0002268402 00000 n 0002269007 00000 n 0002275048 00000 n 0002268782 00000 n 0002268976 00000 n 0002275792 00000 n 0002275071 00000 n 0002275127 00000 n 0002275183 00000 n 0002275232 00000 n 0002275281 00000 n 0002275531 00000 n 0002276156 00000 n 0002281124 00000 n 0002275922 00000 n 0002276116 00000 n 0002281640 00000 n 0002281147 00000 n 0002281203 00000 n 0002281259 00000 n 0002281315 00000 n 0002281371 00000 n 0002281995 00000 n 0002287087 00000 n 0002281770 00000 n 0002281964 00000 n 0002287474 00000 n 0002287110 00000 n 0002287159 00000 n 0002287208 00000 n 0002287829 00000 n 0002295282 00000 n 0002287604 00000 n 0002287798 00000 n 0002295882 00000 n 0002295305 00000 n 0002295354 00000 n 0002295403 00000 n 0002295452 00000 n 0002295508 00000 n 0002295564 00000 n 0002295620 00000 n 0002296237 00000 n 0002302476 00000 n 0002296012 00000 n 0002296206 00000 n 0002303059 00000 n 0002302499 00000 n 0002302555 00000 n 0002302611 00000 n 0002302667 00000 n 0002302723 00000 n 0002302779 00000 n 0002302835 00000 n 0002302891 00000 n 0002302947 00000 n 0002303003 00000 n 0002303405 00000 n 0002311189 00000 n 0002303189 00000 n 0002303383 00000 n 0002312110 00000 n 0002311212 00000 n 0002311268 00000 n 0002311324 00000 n 0002311598 00000 n 0002311851 00000 n 0002312483 00000 n 0002319965 00000 n 0002312240 00000 n 0002312434 00000 n 0002320761 00000 n 0002319988 00000 n 0002320254 00000 n 0002320504 00000 n 0002321150 00000 n 0002328409 00000 n 0002320891 00000 n 0002321101 00000 n 0002328699 00000 n 0002328432 00000 n 0002329044 00000 n 0002334040 00000 n 0002328829 00000 n 0002329013 00000 n 0002334063 00000 n 0002334399 00000 n 0002339105 00000 n 0002334193 00000 n 0002334377 00000 n 0002339233 00000 n 0002339128 00000 n 0002339177 00000 n 0002339579 00000 n 0002344877 00000 n 0002339363 00000 n 0002339557 00000 n 0002345215 00000 n 0002344900 00000 n 0002344956 00000 n 0002345012 00000 n 0002345061 00000 n 0002345117 00000 n 0002345166 00000 n 0002345561 00000 n 0002350318 00000 n 0002345345 00000 n 0002345539 00000 n 0002350987 00000 n 0002350341 00000 n 0002350397 00000 n 0002350453 00000 n 0002350706 00000 n 0002351351 00000 n 0002355543 00000 n 0002351117 00000 n 0002351311 00000 n 0002356500 00000 n 0002355566 00000 n 0002355622 00000 n 0002355678 00000 n 0002355952 00000 n 0002356218 00000 n 0002356873 00000 n 0002362052 00000 n 0002356630 00000 n 0002356824 00000 n 0002363192 00000 n 0002362075 00000 n 0002362131 00000 n 0002362180 00000 n 0002362236 00000 n 0002362292 00000 n 0002362348 00000 n 0002362404 00000 n 0002362675 00000 n 0002362933 00000 n 0002363565 00000 n 0002368188 00000 n 0002363322 00000 n 0002363516 00000 n 0002368671 00000 n 0002368211 00000 n 0002368267 00000 n 0002368323 00000 n 0002368379 00000 n 0002368435 00000 n 0002369026 00000 n 0002373307 00000 n 0002368801 00000 n 0002368995 00000 n 0002373428 00000 n 0002373330 00000 n 0002373379 00000 n 0002373774 00000 n 0002378788 00000 n 0002373558 00000 n 0002373752 00000 n 0002379277 00000 n 0002378811 00000 n 0002378860 00000 n 0002378916 00000 n 0002378965 00000 n 0002379021 00000 n 0002379632 00000 n 0002385512 00000 n 0002379407 00000 n 0002379601 00000 n 0002386384 00000 n 0002385535 00000 n 0002385584 00000 n 0002385640 00000 n 0002385689 00000 n 0002385738 00000 n 0002385982 00000 n 0002386187 00000 n 0002386757 00000 n 0002394782 00000 n 0002386514 00000 n 0002386708 00000 n 0002395141 00000 n 0002394805 00000 n 0002394861 00000 n 0002394917 00000 n 0002394973 00000 n 0002395029 00000 n 0002395085 00000 n 0002395487 00000 n 0002401913 00000 n 0002395271 00000 n 0002395465 00000 n 0002403617 00000 n 0002401936 00000 n 0002401992 00000 n 0002402048 00000 n 0002402315 00000 n 0002402589 00000 n 0002402849 00000 n 0002403116 00000 n 0002403395 00000 n 0002404017 00000 n 0002412943 00000 n 0002403747 00000 n 0002403941 00000 n 0002416876 00000 n 0002412966 00000 n 0002413022 00000 n 0002413071 00000 n 0002413127 00000 n 0002413176 00000 n 0002413442 00000 n 0002413722 00000 n 0002414001 00000 n 0002414254 00000 n 0002414506 00000 n 0002414779 00000 n 0002415049 00000 n 0002415303 00000 n 0002415557 00000 n 0002415808 00000 n 0002416067 00000 n 0002416344 00000 n 0002416610 00000 n 0002417380 00000 n 0002430068 00000 n 0002417006 00000 n 0002417232 00000 n 0002431141 00000 n 0002430092 00000 n 0002430359 00000 n 0002430624 00000 n 0002430882 00000 n 0002431545 00000 n 0002436946 00000 n 0002431271 00000 n 0002431487 00000 n 0002437695 00000 n 0002436969 00000 n 0002437018 00000 n 0002437074 00000 n 0002437130 00000 n 0002437179 00000 n 0002437444 00000 n 0002438059 00000 n 0002445369 00000 n 0002437825 00000 n 0002438019 00000 n 0002445658 00000 n 0002445392 00000 n 0002446029 00000 n 0002451313 00000 n 0002445788 00000 n 0002445998 00000 n 0002452222 00000 n 0002451336 00000 n 0002451392 00000 n 0002451448 00000 n 0002451706 00000 n 0002451972 00000 n 0002452595 00000 n 0002459948 00000 n 0002452352 00000 n 0002452546 00000 n 0002460730 00000 n 0002459971 00000 n 0002460027 00000 n 0002460083 00000 n 0002460132 00000 n 0002460188 00000 n 0002460462 00000 n 0002461110 00000 n 0002467068 00000 n 0002460860 00000 n 0002461070 00000 n 0002467712 00000 n 0002467091 00000 n 0002467147 00000 n 0002467203 00000 n 0002467469 00000 n 0002468076 00000 n 0002473534 00000 n 0002467842 00000 n 0002468036 00000 n 0002473669 00000 n 0002473557 00000 n 0002473613 00000 n 0002474015 00000 n 0002478937 00000 n 0002473799 00000 n 0002473993 00000 n 0002479589 00000 n 0002478960 00000 n 0002479009 00000 n 0002479058 00000 n 0002479315 00000 n 0002479953 00000 n 0002485022 00000 n 0002479719 00000 n 0002479913 00000 n 0002485157 00000 n 0002485045 00000 n 0002485101 00000 n 0002485503 00000 n 0002490086 00000 n 0002485287 00000 n 0002485481 00000 n 0002490221 00000 n 0002490109 00000 n 0002490165 00000 n 0002490567 00000 n 0002496127 00000 n 0002490351 00000 n 0002490545 00000 n 0002496248 00000 n 0002496150 00000 n 0002496199 00000 n 0002496594 00000 n 0002500563 00000 n 0002496378 00000 n 0002496572 00000 n 0002500586 00000 n 0002500922 00000 n 0002505694 00000 n 0002500716 00000 n 0002500900 00000 n 0002506025 00000 n 0002505717 00000 n 0002505766 00000 n 0002505815 00000 n 0002505864 00000 n 0002505920 00000 n 0002505969 00000 n 0002506371 00000 n 0002512332 00000 n 0002506155 00000 n 0002506349 00000 n 0002512355 00000 n 0002512691 00000 n 0002518241 00000 n 0002512485 00000 n 0002512669 00000 n 0002518746 00000 n 0002518264 00000 n 0002518313 00000 n 0002518369 00000 n 0002518425 00000 n 0002518474 00000 n 0002519101 00000 n 0002524300 00000 n 0002518876 00000 n 0002519070 00000 n 0002524712 00000 n 0002524323 00000 n 0002524379 00000 n 0002524435 00000 n 0002525067 00000 n 0002529760 00000 n 0002524842 00000 n 0002525036 00000 n 0002529783 00000 n 0002530119 00000 n 0002534585 00000 n 0002529913 00000 n 0002530097 00000 n 0002534974 00000 n 0002534608 00000 n 0002534664 00000 n 0002534713 00000 n 0002535345 00000 n 0002543384 00000 n 0002535104 00000 n 0002535314 00000 n 0002543708 00000 n 0002543407 00000 n 0002543456 00000 n 0002543505 00000 n 0002543554 00000 n 0002543603 00000 n 0002543659 00000 n 0002544070 00000 n 0002549236 00000 n 0002543838 00000 n 0002544048 00000 n 0002550457 00000 n 0002549259 00000 n 0002549308 00000 n 0002549364 00000 n 0002549420 00000 n 0002549469 00000 n 0002549525 00000 n 0002549574 00000 n 0002549622 00000 n 0002549671 00000 n 0002549719 00000 n 0002549768 00000 n 0002549943 00000 n 0002550203 00000 n 0002550830 00000 n 0002558565 00000 n 0002550587 00000 n 0002550781 00000 n 0002564957 00000 n 0002558588 00000 n 0002558637 00000 n 0002558693 00000 n 0002558749 00000 n 0002558805 00000 n 0002558861 00000 n 0002558917 00000 n 0002558973 00000 n 0002559022 00000 n 0002559282 00000 n 0002559548 00000 n 0002559810 00000 n 0002560069 00000 n 0002560334 00000 n 0002560596 00000 n 0002560866 00000 n 0002561135 00000 n 0002561379 00000 n 0002561630 00000 n 0002561896 00000 n 0002562151 00000 n 0002562412 00000 n 0002562665 00000 n 0002562933 00000 n 0002563198 00000 n 0002563459 00000 n 0002563720 00000 n 0002563981 00000 n 0002564242 00000 n 0002564416 00000 n 0002564587 00000 n 0002564761 00000 n 0002565535 00000 n 0002572704 00000 n 0002565087 00000 n 0002565297 00000 n 0002573481 00000 n 0002572727 00000 n 0002572783 00000 n 0002572832 00000 n 0002572888 00000 n 0002572944 00000 n 0002573000 00000 n 0002573056 00000 n 0002573268 00000 n 0002573845 00000 n 0002579157 00000 n 0002573611 00000 n 0002573805 00000 n 0002580723 00000 n 0002579180 00000 n 0002579236 00000 n 0002579292 00000 n 0002579348 00000 n 0002579404 00000 n 0002579453 00000 n 0002579502 00000 n 0002579558 00000 n 0002579614 00000 n 0002579877 00000 n 0002580137 00000 n 0002580319 00000 n 0002580509 00000 n 0002581130 00000 n 0002586085 00000 n 0002580853 00000 n 0002581063 00000 n 0002587039 00000 n 0002586108 00000 n 0002586164 00000 n 0002586220 00000 n 0002586276 00000 n 0002586332 00000 n 0002586388 00000 n 0002586444 00000 n 0002586638 00000 n 0002586829 00000 n 0002587412 00000 n 0002591474 00000 n 0002587169 00000 n 0002587363 00000 n 0002591980 00000 n 0002591497 00000 n 0002591553 00000 n 0002591609 00000 n 0002591803 00000 n 0002592344 00000 n 0002596361 00000 n 0002592110 00000 n 0002592304 00000 n 0002596862 00000 n 0002596384 00000 n 0002596440 00000 n 0002596496 00000 n 0002596552 00000 n 0002596608 00000 n 0002597217 00000 n 0002601486 00000 n 0002596992 00000 n 0002597186 00000 n 0002601607 00000 n 0002601509 00000 n 0002601558 00000 n 0002601969 00000 n 0002604685 00000 n 0002601737 00000 n 0002601947 00000 n 0002604820 00000 n 0002604708 00000 n 0002604764 00000 n 0002605182 00000 n 0002608750 00000 n 0002604950 00000 n 0002605160 00000 n 0002608997 00000 n 0002608773 00000 n 0002608829 00000 n 0002608885 00000 n 0002608941 00000 n 0002609343 00000 n 0002613257 00000 n 0002609127 00000 n 0002609321 00000 n 0002622075 00000 n 0002613280 00000 n 0002613329 00000 n 0002613378 00000 n 0002613621 00000 n 0002613864 00000 n 0002614122 00000 n 0002614365 00000 n 0002614615 00000 n 0002614865 00000 n 0002615108 00000 n 0002615358 00000 n 0002615601 00000 n 0002615845 00000 n 0002616096 00000 n 0002616341 00000 n 0002616592 00000 n 0002616842 00000 n 0002617086 00000 n 0002617330 00000 n 0002617567 00000 n 0002617811 00000 n 0002618062 00000 n 0002618306 00000 n 0002618557 00000 n 0002618808 00000 n 0002619052 00000 n 0002619296 00000 n 0002619546 00000 n 0002619791 00000 n 0002620043 00000 n 0002620288 00000 n 0002620539 00000 n 0002620790 00000 n 0002621033 00000 n 0002621294 00000 n 0002621559 00000 n 0002621814 00000 n 0002622736 00000 n 0002628414 00000 n 0002622205 00000 n 0002622399 00000 n 0002631171 00000 n 0002628437 00000 n 0002628493 00000 n 0002628549 00000 n 0002628598 00000 n 0002628654 00000 n 0002628710 00000 n 0002628759 00000 n 0002628815 00000 n 0002628871 00000 n 0002629115 00000 n 0002629366 00000 n 0002629610 00000 n 0002629847 00000 n 0002630091 00000 n 0002630335 00000 n 0002630586 00000 n 0002630837 00000 n 0002631003 00000 n 0002631623 00000 n 0002639087 00000 n 0002631301 00000 n 0002631511 00000 n 0002639430 00000 n 0002639110 00000 n 0002639166 00000 n 0002639222 00000 n 0002639785 00000 n 0002645258 00000 n 0002639560 00000 n 0002639754 00000 n 0002645820 00000 n 0002645281 00000 n 0002645337 00000 n 0002645393 00000 n 0002645442 00000 n 0002645491 00000 n 0002645547 00000 n 0002645603 00000 n 0002645659 00000 n 0002645715 00000 n 0002645764 00000 n 0002646166 00000 n 0002651114 00000 n 0002645950 00000 n 0002646144 00000 n 0002651345 00000 n 0002651137 00000 n 0002651193 00000 n 0002651241 00000 n 0002651297 00000 n 0002651691 00000 n 0002656916 00000 n 0002651475 00000 n 0002651669 00000 n 0002657149 00000 n 0002656939 00000 n 0002656988 00000 n 0002657044 00000 n 0002657100 00000 n 0002657495 00000 n 0002662683 00000 n 0002657279 00000 n 0002657473 00000 n 0002662818 00000 n 0002662706 00000 n 0002662762 00000 n 0002663164 00000 n 0002667807 00000 n 0002662948 00000 n 0002663142 00000 n 0002668054 00000 n 0002667830 00000 n 0002667886 00000 n 0002667942 00000 n 0002667998 00000 n 0002668400 00000 n 0002672912 00000 n 0002668184 00000 n 0002668378 00000 n 0002673159 00000 n 0002672935 00000 n 0002672991 00000 n 0002673047 00000 n 0002673103 00000 n 0002673505 00000 n 0002678010 00000 n 0002673289 00000 n 0002673483 00000 n 0002678033 00000 n 0002678369 00000 n 0002684118 00000 n 0002678163 00000 n 0002678347 00000 n 0002684611 00000 n 0002684141 00000 n 0002684190 00000 n 0002684239 00000 n 0002684288 00000 n 0002684337 00000 n 0002684966 00000 n 0002690454 00000 n 0002684741 00000 n 0002684935 00000 n 0002690785 00000 n 0002690477 00000 n 0002690526 00000 n 0002690575 00000 n 0002690631 00000 n 0002690680 00000 n 0002690729 00000 n 0002691131 00000 n 0002695312 00000 n 0002690915 00000 n 0002691109 00000 n 0002695335 00000 n 0002695671 00000 n 0002700417 00000 n 0002695465 00000 n 0002695649 00000 n 0002701275 00000 n 0002700440 00000 n 0002700496 00000 n 0002700545 00000 n 0002700594 00000 n 0002700643 00000 n 0002700699 00000 n 0002700748 00000 n 0002701008 00000 n 0002701639 00000 n 0002706162 00000 n 0002701405 00000 n 0002701599 00000 n 0002706521 00000 n 0002706185 00000 n 0002706241 00000 n 0002706297 00000 n 0002706353 00000 n 0002706409 00000 n 0002706465 00000 n 0002706883 00000 n 0002712261 00000 n 0002706651 00000 n 0002706861 00000 n 0002712753 00000 n 0002712284 00000 n 0002712340 00000 n 0002712389 00000 n 0002712445 00000 n 0002712494 00000 n 0002713108 00000 n 0002718665 00000 n 0002712883 00000 n 0002713077 00000 n 0002719605 00000 n 0002718688 00000 n 0002718744 00000 n 0002718800 00000 n 0002718849 00000 n 0002718898 00000 n 0002718947 00000 n 0002718996 00000 n 0002719052 00000 n 0002719108 00000 n 0002719353 00000 n 0002719969 00000 n 0002727513 00000 n 0002719735 00000 n 0002719929 00000 n 0002728054 00000 n 0002727536 00000 n 0002727592 00000 n 0002727648 00000 n 0002727704 00000 n 0002727753 00000 n 0002727802 00000 n 0002727851 00000 n 0002727900 00000 n 0002727949 00000 n 0002727998 00000 n 0002728432 00000 n 0002734947 00000 n 0002728184 00000 n 0002728410 00000 n 0002735082 00000 n 0002734970 00000 n 0002735026 00000 n 0002735428 00000 n 0002741058 00000 n 0002735212 00000 n 0002735406 00000 n 0002747977 00000 n 0002741081 00000 n 0002741137 00000 n 0002741193 00000 n 0002741249 00000 n 0002741305 00000 n 0002741361 00000 n 0002741417 00000 n 0002741473 00000 n 0002741529 00000 n 0002741775 00000 n 0002742028 00000 n 0002742267 00000 n 0002742520 00000 n 0002742773 00000 n 0002743019 00000 n 0002743272 00000 n 0002743518 00000 n 0002743765 00000 n 0002744019 00000 n 0002744266 00000 n 0002744520 00000 n 0002744767 00000 n 0002745014 00000 n 0002745268 00000 n 0002745515 00000 n 0002745762 00000 n 0002746016 00000 n 0002746285 00000 n 0002746558 00000 n 0002746805 00000 n 0002747052 00000 n 0002747306 00000 n 0002747553 00000 n 0002747800 00000 n 0002748557 00000 n 0002756460 00000 n 0002748107 00000 n 0002748301 00000 n 0002757389 00000 n 0002756483 00000 n 0002756532 00000 n 0002756588 00000 n 0002756644 00000 n 0002756700 00000 n 0002756756 00000 n 0002756812 00000 n 0002756861 00000 n 0002756917 00000 n 0002756973 00000 n 0002757022 00000 n 0002757078 00000 n 0002757134 00000 n 0002757776 00000 n 0002763434 00000 n 0002757519 00000 n 0002757745 00000 n 0002763793 00000 n 0002763457 00000 n 0002763513 00000 n 0002763569 00000 n 0002763625 00000 n 0002763681 00000 n 0002763737 00000 n 0002764139 00000 n 0002768736 00000 n 0002763923 00000 n 0002764117 00000 n 0002768871 00000 n 0002768759 00000 n 0002768815 00000 n 0002769217 00000 n 0002774020 00000 n 0002769001 00000 n 0002769195 00000 n 0002774365 00000 n 0002774043 00000 n 0002774092 00000 n 0002774148 00000 n 0002774204 00000 n 0002774253 00000 n 0002774309 00000 n 0002774711 00000 n 0002779383 00000 n 0002774495 00000 n 0002774689 00000 n 0002779630 00000 n 0002779406 00000 n 0002779462 00000 n 0002779518 00000 n 0002779574 00000 n 0002779976 00000 n 0002784561 00000 n 0002779760 00000 n 0002779954 00000 n 0002785298 00000 n 0002784584 00000 n 0002784640 00000 n 0002784696 00000 n 0002784752 00000 n 0002784808 00000 n 0002784864 00000 n 0002784920 00000 n 0002784976 00000 n 0002785032 00000 n 0002785653 00000 n 0002789677 00000 n 0002785428 00000 n 0002785622 00000 n 0002790246 00000 n 0002789700 00000 n 0002789756 00000 n 0002789805 00000 n 0002789861 00000 n 0002789917 00000 n 0002789973 00000 n 0002790029 00000 n 0002790085 00000 n 0002790141 00000 n 0002790197 00000 n 0002790592 00000 n 0002796081 00000 n 0002790376 00000 n 0002790570 00000 n 0002809580 00000 n 0002796104 00000 n 0002796153 00000 n 0002796209 00000 n 0002796265 00000 n 0002796321 00000 n 0002796377 00000 n 0002796433 00000 n 0002796685 00000 n 0002796930 00000 n 0002797182 00000 n 0002797434 00000 n 0002797679 00000 n 0002797924 00000 n 0002798169 00000 n 0002798414 00000 n 0002798660 00000 n 0002798906 00000 n 0002799159 00000 n 0002799405 00000 n 0002799651 00000 n 0002799904 00000 n 0002800150 00000 n 0002800389 00000 n 0002800642 00000 n 0002800881 00000 n 0002801134 00000 n 0002801387 00000 n 0002801633 00000 n 0002801886 00000 n 0002802132 00000 n 0002802371 00000 n 0002802624 00000 n 0002802870 00000 n 0002803123 00000 n 0002803376 00000 n 0002803622 00000 n 0002803868 00000 n 0002804114 00000 n 0002804360 00000 n 0002804613 00000 n 0002804859 00000 n 0002805112 00000 n 0002805358 00000 n 0002805604 00000 n 0002805857 00000 n 0002806103 00000 n 0002806349 00000 n 0002806602 00000 n 0002806848 00000 n 0002807101 00000 n 0002807354 00000 n 0002807600 00000 n 0002807846 00000 n 0002808090 00000 n 0002808336 00000 n 0002808582 00000 n 0002808828 00000 n 0002809081 00000 n 0002809334 00000 n 0002810403 00000 n 0002818515 00000 n 0002809710 00000 n 0002809904 00000 n 0002819154 00000 n 0002818538 00000 n 0002818587 00000 n 0002818643 00000 n 0002818699 00000 n 0002818755 00000 n 0002818804 00000 n 0002818860 00000 n 0002818916 00000 n 0002818972 00000 n 0002819509 00000 n 0002825729 00000 n 0002819284 00000 n 0002819478 00000 n 0002825850 00000 n 0002825752 00000 n 0002825801 00000 n 0002826212 00000 n 0002832722 00000 n 0002825980 00000 n 0002826190 00000 n 0002833266 00000 n 0002832745 00000 n 0002832801 00000 n 0002832857 00000 n 0002832913 00000 n 0002832969 00000 n 0002833025 00000 n 0002833081 00000 n 0002833637 00000 n 0002844014 00000 n 0002833396 00000 n 0002833606 00000 n 0002845081 00000 n 0002844038 00000 n 0002844087 00000 n 0002844143 00000 n 0002844199 00000 n 0002844255 00000 n 0002844311 00000 n 0002844367 00000 n 0002844416 00000 n 0002844465 00000 n 0002844514 00000 n 0002844563 00000 n 0002844807 00000 n 0002845445 00000 n 0002849576 00000 n 0002845211 00000 n 0002845405 00000 n 0002849823 00000 n 0002849599 00000 n 0002849655 00000 n 0002849711 00000 n 0002849767 00000 n 0002850169 00000 n 0002855209 00000 n 0002849953 00000 n 0002850147 00000 n 0002855344 00000 n 0002855232 00000 n 0002855288 00000 n 0002855690 00000 n 0002859421 00000 n 0002855474 00000 n 0002855668 00000 n 0002859878 00000 n 0002859444 00000 n 0002859500 00000 n 0002859556 00000 n 0002859612 00000 n 0002859661 00000 n 0002859717 00000 n 0002859773 00000 n 0002859829 00000 n 0002860224 00000 n 0002865457 00000 n 0002860008 00000 n 0002860202 00000 n 0002865592 00000 n 0002865480 00000 n 0002865536 00000 n 0002865938 00000 n 0002870374 00000 n 0002865722 00000 n 0002865916 00000 n 0002870502 00000 n 0002870397 00000 n 0002870446 00000 n 0002870848 00000 n 0002874582 00000 n 0002870632 00000 n 0002870826 00000 n 0002875331 00000 n 0002874605 00000 n 0002874661 00000 n 0002874710 00000 n 0002874766 00000 n 0002874815 00000 n 0002875072 00000 n 0002875711 00000 n 0002880356 00000 n 0002875461 00000 n 0002875671 00000 n 0002880491 00000 n 0002880379 00000 n 0002880435 00000 n 0002880837 00000 n 0002885039 00000 n 0002880621 00000 n 0002880815 00000 n 0002885762 00000 n 0002885062 00000 n 0002885118 00000 n 0002885174 00000 n 0002885230 00000 n 0002885279 00000 n 0002885335 00000 n 0002885391 00000 n 0002885447 00000 n 0002885503 00000 n 0002886117 00000 n 0002890838 00000 n 0002885892 00000 n 0002886086 00000 n 0002891071 00000 n 0002890861 00000 n 0002890910 00000 n 0002890959 00000 n 0002891015 00000 n 0002891417 00000 n 0002895798 00000 n 0002891201 00000 n 0002891395 00000 n 0002896031 00000 n 0002895821 00000 n 0002895877 00000 n 0002895933 00000 n 0002895982 00000 n 0002896377 00000 n 0002900980 00000 n 0002896161 00000 n 0002896355 00000 n 0002901451 00000 n 0002901003 00000 n 0002901059 00000 n 0002901115 00000 n 0002901171 00000 n 0002901227 00000 n 0002901283 00000 n 0002901339 00000 n 0002901395 00000 n 0002901797 00000 n 0002907461 00000 n 0002901581 00000 n 0002901775 00000 n 0002907596 00000 n 0002907484 00000 n 0002907540 00000 n 0002907942 00000 n 0002911687 00000 n 0002907726 00000 n 0002907920 00000 n 0002911934 00000 n 0002911710 00000 n 0002911766 00000 n 0002911822 00000 n 0002911878 00000 n 0002912280 00000 n 0002918173 00000 n 0002912064 00000 n 0002912258 00000 n 0002918749 00000 n 0002918196 00000 n 0002918245 00000 n 0002918294 00000 n 0002918343 00000 n 0002918399 00000 n 0002918448 00000 n 0002918497 00000 n 0002919104 00000 n 0002923954 00000 n 0002918879 00000 n 0002919073 00000 n 0002924313 00000 n 0002923977 00000 n 0002924033 00000 n 0002924089 00000 n 0002924145 00000 n 0002924201 00000 n 0002924257 00000 n 0002924659 00000 n 0002930107 00000 n 0002924443 00000 n 0002924637 00000 n 0002930690 00000 n 0002930130 00000 n 0002930186 00000 n 0002930242 00000 n 0002930298 00000 n 0002930354 00000 n 0002930410 00000 n 0002930466 00000 n 0002930522 00000 n 0002930578 00000 n 0002930634 00000 n 0002931052 00000 n 0002941424 00000 n 0002930820 00000 n 0002931030 00000 n 0002948349 00000 n 0002941448 00000 n 0002941496 00000 n 0002941552 00000 n 0002941600 00000 n 0002941649 00000 n 0002941705 00000 n 0002941761 00000 n 0002941817 00000 n 0002941873 00000 n 0002941922 00000 n 0002941971 00000 n 0002942214 00000 n 0002942466 00000 n 0002942704 00000 n 0002942947 00000 n 0002943192 00000 n 0002943437 00000 n 0002943689 00000 n 0002943941 00000 n 0002944179 00000 n 0002944431 00000 n 0002944679 00000 n 0002944920 00000 n 0002945175 00000 n 0002945416 00000 n 0002945671 00000 n 0002945923 00000 n 0002946159 00000 n 0002946411 00000 n 0002946649 00000 n 0002946894 00000 n 0002947146 00000 n 0002947391 00000 n 0002947643 00000 n 0002947895 00000 n 0002948141 00000 n 0002948929 00000 n 0002957626 00000 n 0002948479 00000 n 0002948673 00000 n 0002958347 00000 n 0002957649 00000 n 0002957705 00000 n 0002957761 00000 n 0002957810 00000 n 0002957859 00000 n 0002957915 00000 n 0002957971 00000 n 0002958020 00000 n 0002958069 00000 n 0002958702 00000 n 0002963121 00000 n 0002958477 00000 n 0002958671 00000 n 0002963242 00000 n 0002963144 00000 n 0002963193 00000 n 0002963588 00000 n 0002968193 00000 n 0002963372 00000 n 0002963566 00000 n 0002968510 00000 n 0002968216 00000 n 0002968265 00000 n 0002968314 00000 n 0002968363 00000 n 0002968412 00000 n 0002968461 00000 n 0002968856 00000 n 0002972726 00000 n 0002968640 00000 n 0002968834 00000 n 0002973057 00000 n 0002972749 00000 n 0002972798 00000 n 0002972854 00000 n 0002972903 00000 n 0002972952 00000 n 0002973008 00000 n 0002973403 00000 n 0002977479 00000 n 0002973187 00000 n 0002973381 00000 n 0002977838 00000 n 0002977502 00000 n 0002977558 00000 n 0002977614 00000 n 0002977670 00000 n 0002977726 00000 n 0002977782 00000 n 0002978184 00000 n 0002985819 00000 n 0002977968 00000 n 0002978162 00000 n 0002986486 00000 n 0002985842 00000 n 0002985898 00000 n 0002985954 00000 n 0002986010 00000 n 0002986059 00000 n 0002986108 00000 n 0002986164 00000 n 0002986220 00000 n 0002986269 00000 n 0002986325 00000 n 0002986381 00000 n 0002986437 00000 n 0002986848 00000 n 0002995312 00000 n 0002986616 00000 n 0002986826 00000 n 0003020043 00000 n 0002995335 00000 n 0002995581 00000 n 0002995834 00000 n 0002996080 00000 n 0002996326 00000 n 0002996579 00000 n 0002996818 00000 n 0002997071 00000 n 0002997325 00000 n 0002997565 00000 n 0002997812 00000 n 0002998066 00000 n 0002998313 00000 n 0002998567 00000 n 0002998814 00000 n 0002999068 00000 n 0002999322 00000 n 0002999569 00000 n 0002999816 00000 n 0003000063 00000 n 0003000303 00000 n 0003000550 00000 n 0003000797 00000 n 0003001051 00000 n 0003001305 00000 n 0003001552 00000 n 0003001806 00000 n 0003002075 00000 n 0003002341 00000 n 0003002596 00000 n 0003002843 00000 n 0003003097 00000 n 0003003353 00000 n 0003003616 00000 n 0003003884 00000 n 0003004131 00000 n 0003004376 00000 n 0003004630 00000 n 0003004870 00000 n 0003005124 00000 n 0003005378 00000 n 0003005625 00000 n 0003005879 00000 n 0003006126 00000 n 0003006373 00000 n 0003006627 00000 n 0003006874 00000 n 0003007128 00000 n 0003007382 00000 n 0003007630 00000 n 0003007890 00000 n 0003008137 00000 n 0003008377 00000 n 0003008631 00000 n 0003008878 00000 n 0003009132 00000 n 0003009394 00000 n 0003009641 00000 n 0003009895 00000 n 0003010142 00000 n 0003010389 00000 n 0003010643 00000 n 0003010890 00000 n 0003011144 00000 n 0003011391 00000 n 0003011631 00000 n 0003011878 00000 n 0003012125 00000 n 0003012372 00000 n 0003012542 00000 n 0003012789 00000 n 0003013036 00000 n 0003013290 00000 n 0003013538 00000 n 0003013793 00000 n 0003014045 00000 n 0003014297 00000 n 0003014552 00000 n 0003014799 00000 n 0003015053 00000 n 0003015316 00000 n 0003015572 00000 n 0003015824 00000 n 0003016074 00000 n 0003016337 00000 n 0003016601 00000 n 0003016769 00000 n 0003016942 00000 n 0003017214 00000 n 0003017478 00000 n 0003017750 00000 n 0003018007 00000 n 0003018254 00000 n 0003018508 00000 n 0003018755 00000 n 0003019009 00000 n 0003019268 00000 n 0003019524 00000 n 0003019783 00000 n 0003021264 00000 n 0003030517 00000 n 0003020173 00000 n 0003020351 00000 n 0003031426 00000 n 0003030540 00000 n 0003030596 00000 n 0003030652 00000 n 0003030708 00000 n 0003030764 00000 n 0003030813 00000 n 0003030869 00000 n 0003030925 00000 n 0003030981 00000 n 0003031222 00000 n 0003031790 00000 n 0003037696 00000 n 0003031556 00000 n 0003031750 00000 n 0003038132 00000 n 0003037719 00000 n 0003037775 00000 n 0003037831 00000 n 0003037887 00000 n 0003037943 00000 n 0003038487 00000 n 0003046814 00000 n 0003038262 00000 n 0003038456 00000 n 0003047047 00000 n 0003046837 00000 n 0003046886 00000 n 0003046935 00000 n 0003046991 00000 n 0003047409 00000 n 0003054312 00000 n 0003047177 00000 n 0003047387 00000 n 0003054749 00000 n 0003054335 00000 n 0003054391 00000 n 0003054440 00000 n 0003054496 00000 n 0003054545 00000 n 0003055104 00000 n 0003065028 00000 n 0003054879 00000 n 0003055073 00000 n 0003065786 00000 n 0003065051 00000 n 0003065107 00000 n 0003065163 00000 n 0003065219 00000 n 0003065275 00000 n 0003065331 00000 n 0003065387 00000 n 0003065443 00000 n 0003065492 00000 n 0003065548 00000 n 0003065604 00000 n 0003066141 00000 n 0003072718 00000 n 0003065916 00000 n 0003066110 00000 n 0003073466 00000 n 0003072741 00000 n 0003072790 00000 n 0003072839 00000 n 0003072895 00000 n 0003072951 00000 n 0003073218 00000 n 0003073830 00000 n 0003079450 00000 n 0003073596 00000 n 0003073790 00000 n 0003079585 00000 n 0003079473 00000 n 0003079529 00000 n 0003079931 00000 n 0003085039 00000 n 0003079715 00000 n 0003079909 00000 n 0003085158 00000 n 0003085062 00000 n 0003085110 00000 n 0003085504 00000 n 0003090501 00000 n 0003085288 00000 n 0003085482 00000 n 0003090748 00000 n 0003090524 00000 n 0003090580 00000 n 0003090636 00000 n 0003090692 00000 n 0003091094 00000 n 0003094986 00000 n 0003090878 00000 n 0003091072 00000 n 0003095107 00000 n 0003095009 00000 n 0003095058 00000 n 0003095453 00000 n 0003099833 00000 n 0003095237 00000 n 0003095431 00000 n 0003100496 00000 n 0003099856 00000 n 0003099912 00000 n 0003099968 00000 n 0003100024 00000 n 0003100080 00000 n 0003100270 00000 n 0003100860 00000 n 0003105285 00000 n 0003100626 00000 n 0003100820 00000 n 0003106274 00000 n 0003105308 00000 n 0003105364 00000 n 0003105420 00000 n 0003105476 00000 n 0003105532 00000 n 0003105588 00000 n 0003105644 00000 n 0003105700 00000 n 0003105756 00000 n 0003106008 00000 n 0003106638 00000 n 0003111105 00000 n 0003106404 00000 n 0003106598 00000 n 0003112580 00000 n 0003111128 00000 n 0003111184 00000 n 0003111240 00000 n 0003111289 00000 n 0003111345 00000 n 0003111401 00000 n 0003111457 00000 n 0003111506 00000 n 0003111555 00000 n 0003111824 00000 n 0003112088 00000 n 0003112328 00000 n 0003112962 00000 n 0003119045 00000 n 0003112710 00000 n 0003112904 00000 n 0003119647 00000 n 0003119068 00000 n 0003119124 00000 n 0003119180 00000 n 0003119442 00000 n 0003120011 00000 n 0003125401 00000 n 0003119777 00000 n 0003119971 00000 n 0003125743 00000 n 0003125424 00000 n 0003125480 00000 n 0003125536 00000 n 0003126098 00000 n 0003131592 00000 n 0003125873 00000 n 0003126067 00000 n 0003131983 00000 n 0003131615 00000 n 0003131671 00000 n 0003131727 00000 n 0003132338 00000 n 0003137185 00000 n 0003132113 00000 n 0003132307 00000 n 0003137432 00000 n 0003137208 00000 n 0003137264 00000 n 0003137320 00000 n 0003137376 00000 n 0003137778 00000 n 0003143407 00000 n 0003137562 00000 n 0003137756 00000 n 0003143752 00000 n 0003143430 00000 n 0003143486 00000 n 0003143542 00000 n 0003143598 00000 n 0003143647 00000 n 0003143696 00000 n 0003144114 00000 n 0003152288 00000 n 0003143882 00000 n 0003144092 00000 n 0003152850 00000 n 0003152311 00000 n 0003152360 00000 n 0003152416 00000 n 0003152472 00000 n 0003152521 00000 n 0003152577 00000 n 0003152633 00000 n 0003152682 00000 n 0003152738 00000 n 0003152794 00000 n 0003153196 00000 n 0003160372 00000 n 0003152980 00000 n 0003153174 00000 n 0003160507 00000 n 0003160395 00000 n 0003160451 00000 n 0003160853 00000 n 0003166509 00000 n 0003160637 00000 n 0003160831 00000 n 0003166532 00000 n 0003166868 00000 n 0003171017 00000 n 0003166662 00000 n 0003166846 00000 n 0003171250 00000 n 0003171040 00000 n 0003171089 00000 n 0003171145 00000 n 0003171194 00000 n 0003171596 00000 n 0003175605 00000 n 0003171380 00000 n 0003171574 00000 n 0003176103 00000 n 0003175628 00000 n 0003175684 00000 n 0003175740 00000 n 0003175796 00000 n 0003175852 00000 n 0003176458 00000 n 0003180945 00000 n 0003176233 00000 n 0003176427 00000 n 0003181711 00000 n 0003180968 00000 n 0003181017 00000 n 0003181073 00000 n 0003181129 00000 n 0003181185 00000 n 0003181447 00000 n 0003182075 00000 n 0003187303 00000 n 0003181841 00000 n 0003182035 00000 n 0003187438 00000 n 0003187326 00000 n 0003187382 00000 n 0003187784 00000 n 0003191724 00000 n 0003187568 00000 n 0003187762 00000 n 0003192437 00000 n 0003191747 00000 n 0003191796 00000 n 0003191852 00000 n 0003191901 00000 n 0003191957 00000 n 0003192200 00000 n 0003192801 00000 n 0003198069 00000 n 0003192567 00000 n 0003192761 00000 n 0003199195 00000 n 0003198092 00000 n 0003198148 00000 n 0003198204 00000 n 0003198253 00000 n 0003198309 00000 n 0003198358 00000 n 0003198414 00000 n 0003198672 00000 n 0003198950 00000 n 0003199568 00000 n 0003205210 00000 n 0003199325 00000 n 0003199519 00000 n 0003206066 00000 n 0003205233 00000 n 0003205289 00000 n 0003205345 00000 n 0003205394 00000 n 0003205450 00000 n 0003205499 00000 n 0003205555 00000 n 0003205807 00000 n 0003206430 00000 n 0003211780 00000 n 0003206196 00000 n 0003206390 00000 n 0003212020 00000 n 0003211803 00000 n 0003211859 00000 n 0003211915 00000 n 0003211964 00000 n 0003212366 00000 n 0003216245 00000 n 0003212150 00000 n 0003212344 00000 n 0003216380 00000 n 0003216268 00000 n 0003216324 00000 n 0003216726 00000 n 0003220845 00000 n 0003216510 00000 n 0003216704 00000 n 0003221251 00000 n 0003220868 00000 n 0003220924 00000 n 0003220980 00000 n 0003221606 00000 n 0003226712 00000 n 0003221381 00000 n 0003221575 00000 n 0003226945 00000 n 0003226735 00000 n 0003226784 00000 n 0003226840 00000 n 0003226889 00000 n 0003227291 00000 n 0003231535 00000 n 0003227075 00000 n 0003227269 00000 n 0003232048 00000 n 0003231558 00000 n 0003231614 00000 n 0003231670 00000 n 0003231726 00000 n 0003231782 00000 n 0003232403 00000 n 0003238169 00000 n 0003232178 00000 n 0003232372 00000 n 0003238671 00000 n 0003238192 00000 n 0003238248 00000 n 0003238304 00000 n 0003238360 00000 n 0003238416 00000 n 0003239026 00000 n 0003245329 00000 n 0003238801 00000 n 0003238995 00000 n 0003246123 00000 n 0003245352 00000 n 0003245408 00000 n 0003245464 00000 n 0003245520 00000 n 0003245576 00000 n 0003245625 00000 n 0003245681 00000 n 0003245737 00000 n 0003245786 00000 n 0003245842 00000 n 0003245898 00000 n 0003246510 00000 n 0003251802 00000 n 0003246253 00000 n 0003246479 00000 n 0003252999 00000 n 0003251825 00000 n 0003251881 00000 n 0003251937 00000 n 0003251986 00000 n 0003252042 00000 n 0003252098 00000 n 0003252154 00000 n 0003252203 00000 n 0003252259 00000 n 0003252530 00000 n 0003252795 00000 n 0003253372 00000 n 0003260118 00000 n 0003253129 00000 n 0003253323 00000 n 0003260351 00000 n 0003260141 00000 n 0003260190 00000 n 0003260246 00000 n 0003260302 00000 n 0003260697 00000 n 0003265359 00000 n 0003260481 00000 n 0003260675 00000 n 0003266000 00000 n 0003265382 00000 n 0003265438 00000 n 0003265494 00000 n 0003265550 00000 n 0003265606 00000 n 0003265803 00000 n 0003266364 00000 n 0003272253 00000 n 0003266130 00000 n 0003266324 00000 n 0003273168 00000 n 0003272276 00000 n 0003272332 00000 n 0003272388 00000 n 0003272444 00000 n 0003272500 00000 n 0003272556 00000 n 0003272612 00000 n 0003272668 00000 n 0003272724 00000 n 0003272971 00000 n 0003273532 00000 n 0003278430 00000 n 0003273298 00000 n 0003273492 00000 n 0003278837 00000 n 0003278453 00000 n 0003278509 00000 n 0003278565 00000 n 0003279192 00000 n 0003284794 00000 n 0003278967 00000 n 0003279161 00000 n 0003286450 00000 n 0003284817 00000 n 0003284873 00000 n 0003284929 00000 n 0003284985 00000 n 0003285041 00000 n 0003285097 00000 n 0003285153 00000 n 0003285209 00000 n 0003285265 00000 n 0003285526 00000 n 0003285780 00000 n 0003285991 00000 n 0003286253 00000 n 0003286841 00000 n 0003294684 00000 n 0003286580 00000 n 0003286774 00000 n 0003295121 00000 n 0003294707 00000 n 0003294763 00000 n 0003294819 00000 n 0003294875 00000 n 0003294931 00000 n 0003295476 00000 n 0003300661 00000 n 0003295251 00000 n 0003295445 00000 n 0003300993 00000 n 0003300684 00000 n 0003300740 00000 n 0003300796 00000 n 0003301348 00000 n 0003306886 00000 n 0003301123 00000 n 0003301317 00000 n 0003307133 00000 n 0003306909 00000 n 0003306965 00000 n 0003307021 00000 n 0003307077 00000 n 0003307479 00000 n 0003311983 00000 n 0003307263 00000 n 0003307457 00000 n 0003314451 00000 n 0003312006 00000 n 0003312062 00000 n 0003312111 00000 n 0003312160 00000 n 0003312216 00000 n 0003312272 00000 n 0003312328 00000 n 0003312384 00000 n 0003312440 00000 n 0003312496 00000 n 0003312545 00000 n 0003312793 00000 n 0003313041 00000 n 0003313282 00000 n 0003313530 00000 n 0003313781 00000 n 0003314022 00000 n 0003314270 00000 n 0003314869 00000 n 0003321475 00000 n 0003314581 00000 n 0003314775 00000 n 0003332491 00000 n 0003321498 00000 n 0003321554 00000 n 0003321610 00000 n 0003321666 00000 n 0003321722 00000 n 0003321778 00000 n 0003321827 00000 n 0003321883 00000 n 0003321939 00000 n 0003321995 00000 n 0003322051 00000 n 0003322302 00000 n 0003322553 00000 n 0003322797 00000 n 0003323048 00000 n 0003323292 00000 n 0003323529 00000 n 0003323780 00000 n 0003324024 00000 n 0003324276 00000 n 0003324528 00000 n 0003324773 00000 n 0003325025 00000 n 0003325270 00000 n 0003325508 00000 n 0003325760 00000 n 0003325998 00000 n 0003326250 00000 n 0003326495 00000 n 0003326740 00000 n 0003326985 00000 n 0003327230 00000 n 0003327475 00000 n 0003327729 00000 n 0003327977 00000 n 0003328236 00000 n 0003328488 00000 n 0003328755 00000 n 0003329026 00000 n 0003329271 00000 n 0003329510 00000 n 0003329762 00000 n 0003330007 00000 n 0003330259 00000 n 0003330511 00000 n 0003330756 00000 n 0003331001 00000 n 0003331245 00000 n 0003331489 00000 n 0003331743 00000 n 0003331987 00000 n 0003332239 00000 n 0003333215 00000 n 0003341047 00000 n 0003332621 00000 n 0003332815 00000 n 0003356188 00000 n 0003341070 00000 n 0003341126 00000 n 0003341175 00000 n 0003341231 00000 n 0003341287 00000 n 0003341343 00000 n 0003341399 00000 n 0003341455 00000 n 0003341511 00000 n 0003341756 00000 n 0003342017 00000 n 0003342268 00000 n 0003342520 00000 n 0003342789 00000 n 0003343034 00000 n 0003343286 00000 n 0003343552 00000 n 0003343805 00000 n 0003344062 00000 n 0003344319 00000 n 0003344574 00000 n 0003344838 00000 n 0003345096 00000 n 0003345360 00000 n 0003345625 00000 n 0003345880 00000 n 0003346137 00000 n 0003346393 00000 n 0003346653 00000 n 0003346921 00000 n 0003347185 00000 n 0003347445 00000 n 0003347703 00000 n 0003347948 00000 n 0003348200 00000 n 0003348446 00000 n 0003348692 00000 n 0003348945 00000 n 0003349191 00000 n 0003349444 00000 n 0003349696 00000 n 0003349941 00000 n 0003350193 00000 n 0003350438 00000 n 0003350677 00000 n 0003350929 00000 n 0003351174 00000 n 0003351419 00000 n 0003351671 00000 n 0003351917 00000 n 0003352174 00000 n 0003352424 00000 n 0003352682 00000 n 0003352935 00000 n 0003353180 00000 n 0003353432 00000 n 0003353700 00000 n 0003353945 00000 n 0003354197 00000 n 0003354442 00000 n 0003354687 00000 n 0003354939 00000 n 0003355184 00000 n 0003355436 00000 n 0003355688 00000 n 0003355933 00000 n 0003357056 00000 n 0003363965 00000 n 0003356318 00000 n 0003356512 00000 n 0003364625 00000 n 0003363988 00000 n 0003364044 00000 n 0003364100 00000 n 0003364156 00000 n 0003364212 00000 n 0003364268 00000 n 0003364324 00000 n 0003364380 00000 n 0003364436 00000 n 0003364996 00000 n 0003371869 00000 n 0003364755 00000 n 0003364965 00000 n 0003372326 00000 n 0003371892 00000 n 0003371948 00000 n 0003372004 00000 n 0003372060 00000 n 0003372116 00000 n 0003372172 00000 n 0003372221 00000 n 0003372277 00000 n 0003372688 00000 n 0003379992 00000 n 0003372456 00000 n 0003372666 00000 n 0003380351 00000 n 0003380015 00000 n 0003380071 00000 n 0003380127 00000 n 0003380183 00000 n 0003380239 00000 n 0003380295 00000 n 0003380729 00000 n 0003384866 00000 n 0003380481 00000 n 0003380707 00000 n 0003385385 00000 n 0003384889 00000 n 0003384945 00000 n 0003385001 00000 n 0003385057 00000 n 0003385113 00000 n 0003385772 00000 n 0003390383 00000 n 0003385515 00000 n 0003385741 00000 n 0003390518 00000 n 0003390406 00000 n 0003390462 00000 n 0003390896 00000 n 0003395818 00000 n 0003390648 00000 n 0003390874 00000 n 0003396142 00000 n 0003395841 00000 n 0003395897 00000 n 0003395953 00000 n 0003396513 00000 n 0003400913 00000 n 0003396272 00000 n 0003396482 00000 n 0003401666 00000 n 0003400936 00000 n 0003400992 00000 n 0003401041 00000 n 0003401097 00000 n 0003401146 00000 n 0003401390 00000 n 0003402046 00000 n 0003406561 00000 n 0003401796 00000 n 0003402006 00000 n 0003406808 00000 n 0003406584 00000 n 0003406640 00000 n 0003406696 00000 n 0003406752 00000 n 0003407170 00000 n 0003411394 00000 n 0003406938 00000 n 0003407148 00000 n 0003411865 00000 n 0003411417 00000 n 0003411466 00000 n 0003411515 00000 n 0003411564 00000 n 0003411613 00000 n 0003412236 00000 n 0003417907 00000 n 0003411995 00000 n 0003412205 00000 n 0003419117 00000 n 0003417930 00000 n 0003417986 00000 n 0003418042 00000 n 0003418098 00000 n 0003418154 00000 n 0003418210 00000 n 0003418266 00000 n 0003418322 00000 n 0003418378 00000 n 0003418434 00000 n 0003418490 00000 n 0003418538 00000 n 0003418594 00000 n 0003418860 00000 n 0003419497 00000 n 0003425144 00000 n 0003419247 00000 n 0003419457 00000 n 0003425648 00000 n 0003425167 00000 n 0003425223 00000 n 0003425279 00000 n 0003425335 00000 n 0003425391 00000 n 0003426035 00000 n 0003432010 00000 n 0003425778 00000 n 0003426004 00000 n 0003432862 00000 n 0003432033 00000 n 0003432089 00000 n 0003432145 00000 n 0003432194 00000 n 0003432250 00000 n 0003432299 00000 n 0003432348 00000 n 0003432605 00000 n 0003433258 00000 n 0003437842 00000 n 0003432992 00000 n 0003433218 00000 n 0003438353 00000 n 0003437865 00000 n 0003437921 00000 n 0003437977 00000 n 0003438033 00000 n 0003438089 00000 n 0003438708 00000 n 0003442593 00000 n 0003438483 00000 n 0003438677 00000 n 0003442971 00000 n 0003442616 00000 n 0003442672 00000 n 0003442728 00000 n 0003443326 00000 n 0003447623 00000 n 0003443101 00000 n 0003443295 00000 n 0003448479 00000 n 0003447646 00000 n 0003447695 00000 n 0003447744 00000 n 0003447800 00000 n 0003447856 00000 n 0003447912 00000 n 0003447968 00000 n 0003448228 00000 n 0003448843 00000 n 0003455911 00000 n 0003448609 00000 n 0003448803 00000 n 0003456032 00000 n 0003455934 00000 n 0003455983 00000 n 0003456394 00000 n 0003461456 00000 n 0003456162 00000 n 0003456372 00000 n 0003461815 00000 n 0003461479 00000 n 0003461535 00000 n 0003461591 00000 n 0003461647 00000 n 0003461703 00000 n 0003461759 00000 n 0003462161 00000 n 0003465877 00000 n 0003461945 00000 n 0003462139 00000 n 0003466236 00000 n 0003465900 00000 n 0003465956 00000 n 0003466012 00000 n 0003466068 00000 n 0003466124 00000 n 0003466180 00000 n 0003466582 00000 n 0003471464 00000 n 0003466366 00000 n 0003466560 00000 n 0003472371 00000 n 0003471487 00000 n 0003471543 00000 n 0003471599 00000 n 0003471655 00000 n 0003471704 00000 n 0003471760 00000 n 0003471809 00000 n 0003471858 00000 n 0003471914 00000 n 0003471963 00000 n 0003472012 00000 n 0003472061 00000 n 0003472117 00000 n 0003472742 00000 n 0003478796 00000 n 0003472501 00000 n 0003472711 00000 n 0003480024 00000 n 0003478819 00000 n 0003478875 00000 n 0003478931 00000 n 0003478987 00000 n 0003479043 00000 n 0003479099 00000 n 0003479155 00000 n 0003479211 00000 n 0003479267 00000 n 0003479323 00000 n 0003479379 00000 n 0003479435 00000 n 0003479491 00000 n 0003479758 00000 n 0003480404 00000 n 0003485956 00000 n 0003480154 00000 n 0003480364 00000 n 0003486868 00000 n 0003485979 00000 n 0003486035 00000 n 0003486084 00000 n 0003486133 00000 n 0003486182 00000 n 0003486231 00000 n 0003486287 00000 n 0003486343 00000 n 0003486399 00000 n 0003486448 00000 n 0003486497 00000 n 0003486553 00000 n 0003486609 00000 n 0003487223 00000 n 0003494221 00000 n 0003486998 00000 n 0003487192 00000 n 0003494804 00000 n 0003494244 00000 n 0003494300 00000 n 0003494356 00000 n 0003494412 00000 n 0003494468 00000 n 0003494524 00000 n 0003494580 00000 n 0003494636 00000 n 0003494692 00000 n 0003494748 00000 n 0003495182 00000 n 0003502680 00000 n 0003494934 00000 n 0003495160 00000 n 0003503011 00000 n 0003502703 00000 n 0003502752 00000 n 0003502801 00000 n 0003502857 00000 n 0003502906 00000 n 0003502955 00000 n 0003503373 00000 n 0003509153 00000 n 0003503141 00000 n 0003503351 00000 n 0003509288 00000 n 0003509176 00000 n 0003509232 00000 n 0003509666 00000 n 0003515812 00000 n 0003509418 00000 n 0003509644 00000 n 0003515947 00000 n 0003515835 00000 n 0003515891 00000 n 0003516325 00000 n 0003520990 00000 n 0003516077 00000 n 0003516303 00000 n 0003521209 00000 n 0003521013 00000 n 0003521062 00000 n 0003521111 00000 n 0003521160 00000 n 0003521587 00000 n 0003527779 00000 n 0003521339 00000 n 0003521565 00000 n 0003528713 00000 n 0003527802 00000 n 0003527850 00000 n 0003527906 00000 n 0003527962 00000 n 0003528018 00000 n 0003528074 00000 n 0003528130 00000 n 0003528178 00000 n 0003528234 00000 n 0003528290 00000 n 0003528346 00000 n 0003528402 00000 n 0003528458 00000 n 0003529084 00000 n 0003535053 00000 n 0003528843 00000 n 0003529053 00000 n 0003535971 00000 n 0003535076 00000 n 0003535132 00000 n 0003535188 00000 n 0003535237 00000 n 0003535293 00000 n 0003535349 00000 n 0003535398 00000 n 0003535447 00000 n 0003535503 00000 n 0003535559 00000 n 0003535615 00000 n 0003535664 00000 n 0003535720 00000 n 0003536342 00000 n 0003545492 00000 n 0003536101 00000 n 0003536311 00000 n 0003545627 00000 n 0003545515 00000 n 0003545571 00000 n 0003546005 00000 n 0003550690 00000 n 0003545757 00000 n 0003545983 00000 n 0003551299 00000 n 0003550713 00000 n 0003550762 00000 n 0003550818 00000 n 0003550874 00000 n 0003550930 00000 n 0003550986 00000 n 0003551042 00000 n 0003551670 00000 n 0003558027 00000 n 0003551429 00000 n 0003551639 00000 n 0003558421 00000 n 0003558050 00000 n 0003558106 00000 n 0003558162 00000 n 0003558792 00000 n 0003562899 00000 n 0003558551 00000 n 0003558761 00000 n 0003562922 00000 n 0003563274 00000 n 0003567369 00000 n 0003563052 00000 n 0003563252 00000 n 0003568263 00000 n 0003567392 00000 n 0003567448 00000 n 0003567504 00000 n 0003567754 00000 n 0003568006 00000 n 0003568652 00000 n 0003574121 00000 n 0003568393 00000 n 0003568603 00000 n 0003574506 00000 n 0003574144 00000 n 0003574193 00000 n 0003574242 00000 n 0003574877 00000 n 0003580357 00000 n 0003574636 00000 n 0003574846 00000 n 0003580380 00000 n 0003580732 00000 n 0003584612 00000 n 0003580510 00000 n 0003580710 00000 n 0003596339 00000 n 0003584635 00000 n 0003584691 00000 n 0003584747 00000 n 0003584803 00000 n 0003584852 00000 n 0003584908 00000 n 0003584964 00000 n 0003585227 00000 n 0003585482 00000 n 0003585762 00000 n 0003586040 00000 n 0003586310 00000 n 0003586585 00000 n 0003586848 00000 n 0003587099 00000 n 0003587366 00000 n 0003587629 00000 n 0003587897 00000 n 0003588145 00000 n 0003588393 00000 n 0003588668 00000 n 0003588939 00000 n 0003589194 00000 n 0003589459 00000 n 0003589719 00000 n 0003589900 00000 n 0003590081 00000 n 0003590333 00000 n 0003590603 00000 n 0003590863 00000 n 0003591130 00000 n 0003591302 00000 n 0003591567 00000 n 0003591839 00000 n 0003592112 00000 n 0003592378 00000 n 0003592644 00000 n 0003592888 00000 n 0003593155 00000 n 0003593420 00000 n 0003593695 00000 n 0003593962 00000 n 0003594224 00000 n 0003594488 00000 n 0003594752 00000 n 0003595024 00000 n 0003595294 00000 n 0003595561 00000 n 0003595726 00000 n 0003595904 00000 n 0003596169 00000 n 0003597090 00000 n 0003605620 00000 n 0003596469 00000 n 0003596663 00000 n 0003606970 00000 n 0003605643 00000 n 0003605699 00000 n 0003605748 00000 n 0003605797 00000 n 0003605853 00000 n 0003605909 00000 n 0003605965 00000 n 0003606014 00000 n 0003606070 00000 n 0003606126 00000 n 0003606182 00000 n 0003606441 00000 n 0003606699 00000 n 0003607343 00000 n 0003612078 00000 n 0003607100 00000 n 0003607294 00000 n 0003613525 00000 n 0003612101 00000 n 0003612157 00000 n 0003612213 00000 n 0003612262 00000 n 0003612318 00000 n 0003612374 00000 n 0003612423 00000 n 0003612479 00000 n 0003612535 00000 n 0003612584 00000 n 0003612633 00000 n 0003612689 00000 n 0003612745 00000 n 0003612998 00000 n 0003613259 00000 n 0003613898 00000 n 0003619316 00000 n 0003613655 00000 n 0003613849 00000 n 0003619563 00000 n 0003619339 00000 n 0003619395 00000 n 0003619451 00000 n 0003619507 00000 n 0003619909 00000 n 0003623190 00000 n 0003619693 00000 n 0003619887 00000 n 0003623689 00000 n 0003623213 00000 n 0003623262 00000 n 0003623318 00000 n 0003623374 00000 n 0003623423 00000 n 0003624044 00000 n 0003626926 00000 n 0003623819 00000 n 0003624013 00000 n 0003627159 00000 n 0003626949 00000 n 0003627005 00000 n 0003627061 00000 n 0003627110 00000 n 0003627505 00000 n 0003629879 00000 n 0003627289 00000 n 0003627483 00000 n 0003631138 00000 n 0003629902 00000 n 0003629951 00000 n 0003630007 00000 n 0003630063 00000 n 0003630119 00000 n 0003630168 00000 n 0003630224 00000 n 0003630496 00000 n 0003630710 00000 n 0003630918 00000 n 0003631520 00000 n 0003636575 00000 n 0003631268 00000 n 0003631462 00000 n 0003636985 00000 n 0003636598 00000 n 0003636654 00000 n 0003636710 00000 n 0003637340 00000 n 0003640822 00000 n 0003637115 00000 n 0003637309 00000 n 0003641835 00000 n 0003640845 00000 n 0003640901 00000 n 0003640957 00000 n 0003641013 00000 n 0003641069 00000 n 0003641344 00000 n 0003641622 00000 n 0003642208 00000 n 0003646307 00000 n 0003641965 00000 n 0003642159 00000 n 0003646554 00000 n 0003646330 00000 n 0003646386 00000 n 0003646442 00000 n 0003646498 00000 n 0003646900 00000 n 0003650385 00000 n 0003646684 00000 n 0003646878 00000 n 0003650882 00000 n 0003650408 00000 n 0003650464 00000 n 0003650513 00000 n 0003650569 00000 n 0003650618 00000 n 0003651237 00000 n 0003654540 00000 n 0003651012 00000 n 0003651206 00000 n 0003655770 00000 n 0003654563 00000 n 0003654612 00000 n 0003654668 00000 n 0003654724 00000 n 0003654780 00000 n 0003654836 00000 n 0003654885 00000 n 0003654934 00000 n 0003654990 00000 n 0003655241 00000 n 0003655500 00000 n 0003656143 00000 n 0003660659 00000 n 0003655900 00000 n 0003656094 00000 n 0003661188 00000 n 0003660682 00000 n 0003660738 00000 n 0003660794 00000 n 0003660850 00000 n 0003660906 00000 n 0003661543 00000 n 0003667807 00000 n 0003661318 00000 n 0003661512 00000 n 0003667942 00000 n 0003667830 00000 n 0003667886 00000 n 0003668288 00000 n 0003672449 00000 n 0003668072 00000 n 0003668266 00000 n 0003672842 00000 n 0003672472 00000 n 0003672521 00000 n 0003672570 00000 n 0003673197 00000 n 0003677408 00000 n 0003672972 00000 n 0003673166 00000 n 0003677851 00000 n 0003677431 00000 n 0003677487 00000 n 0003677536 00000 n 0003677592 00000 n 0003677648 00000 n 0003677697 00000 n 0003677746 00000 n 0003677795 00000 n 0003678213 00000 n 0003682660 00000 n 0003677981 00000 n 0003678191 00000 n 0003688068 00000 n 0003682683 00000 n 0003682739 00000 n 0003682788 00000 n 0003682844 00000 n 0003682900 00000 n 0003682956 00000 n 0003683012 00000 n 0003683061 00000 n 0003683117 00000 n 0003683166 00000 n 0003683222 00000 n 0003683465 00000 n 0003683715 00000 n 0003683965 00000 n 0003684201 00000 n 0003684451 00000 n 0003684694 00000 n 0003684930 00000 n 0003685180 00000 n 0003685417 00000 n 0003685668 00000 n 0003685919 00000 n 0003686163 00000 n 0003686414 00000 n 0003686657 00000 n 0003686900 00000 n 0003687151 00000 n 0003687394 00000 n 0003687645 00000 n 0003687863 00000 n 0003688610 00000 n 0003696233 00000 n 0003688198 00000 n 0003688408 00000 n 0003703508 00000 n 0003696256 00000 n 0003696312 00000 n 0003696368 00000 n 0003696417 00000 n 0003696466 00000 n 0003696522 00000 n 0003696578 00000 n 0003696634 00000 n 0003696683 00000 n 0003696920 00000 n 0003697171 00000 n 0003697408 00000 n 0003697645 00000 n 0003697896 00000 n 0003698140 00000 n 0003698391 00000 n 0003698642 00000 n 0003698886 00000 n 0003699130 00000 n 0003699374 00000 n 0003699618 00000 n 0003699862 00000 n 0003700106 00000 n 0003700357 00000 n 0003700608 00000 n 0003700852 00000 n 0003701103 00000 n 0003701347 00000 n 0003701591 00000 n 0003701835 00000 n 0003702079 00000 n 0003702330 00000 n 0003702581 00000 n 0003702825 00000 n 0003703076 00000 n 0003703312 00000 n 0003704106 00000 n 0003711457 00000 n 0003703638 00000 n 0003703832 00000 n 0003711704 00000 n 0003711480 00000 n 0003711536 00000 n 0003711592 00000 n 0003711648 00000 n 0003712050 00000 n 0003718541 00000 n 0003711834 00000 n 0003712028 00000 n 0003719236 00000 n 0003718564 00000 n 0003718620 00000 n 0003718676 00000 n 0003718732 00000 n 0003718788 00000 n 0003718844 00000 n 0003718900 00000 n 0003718956 00000 n 0003719012 00000 n 0003719068 00000 n 0003719124 00000 n 0003719180 00000 n 0003719582 00000 n 0003728415 00000 n 0003719366 00000 n 0003719560 00000 n 0003728879 00000 n 0003728438 00000 n 0003728494 00000 n 0003728550 00000 n 0003728606 00000 n 0003728662 00000 n 0003728718 00000 n 0003728767 00000 n 0003728823 00000 n 0003729225 00000 n 0003734285 00000 n 0003729009 00000 n 0003729203 00000 n 0003735033 00000 n 0003734308 00000 n 0003734364 00000 n 0003734413 00000 n 0003734469 00000 n 0003734518 00000 n 0003734792 00000 n 0003735397 00000 n 0003740323 00000 n 0003735163 00000 n 0003735357 00000 n 0003740458 00000 n 0003740346 00000 n 0003740402 00000 n 0003740804 00000 n 0003746143 00000 n 0003740588 00000 n 0003740782 00000 n 0003746166 00000 n 0003746502 00000 n 0003750639 00000 n 0003746296 00000 n 0003746480 00000 n 0003750998 00000 n 0003750662 00000 n 0003750718 00000 n 0003750774 00000 n 0003750830 00000 n 0003750886 00000 n 0003750942 00000 n 0003751344 00000 n 0003754760 00000 n 0003751128 00000 n 0003751322 00000 n 0003754895 00000 n 0003754783 00000 n 0003754839 00000 n 0003755241 00000 n 0003759237 00000 n 0003755025 00000 n 0003755219 00000 n 0003759470 00000 n 0003759260 00000 n 0003759309 00000 n 0003759365 00000 n 0003759414 00000 n 0003759816 00000 n 0003764159 00000 n 0003759600 00000 n 0003759794 00000 n 0003764665 00000 n 0003764182 00000 n 0003764238 00000 n 0003764294 00000 n 0003764350 00000 n 0003764406 00000 n 0003765020 00000 n 0003769161 00000 n 0003764795 00000 n 0003764989 00000 n 0003770005 00000 n 0003769184 00000 n 0003769240 00000 n 0003769296 00000 n 0003769345 00000 n 0003769394 00000 n 0003769450 00000 n 0003769499 00000 n 0003769746 00000 n 0003770369 00000 n 0003774788 00000 n 0003770135 00000 n 0003770329 00000 n 0003774916 00000 n 0003774811 00000 n 0003774860 00000 n 0003775262 00000 n 0003779219 00000 n 0003775046 00000 n 0003775240 00000 n 0003779354 00000 n 0003779242 00000 n 0003779298 00000 n 0003779700 00000 n 0003783430 00000 n 0003779484 00000 n 0003779678 00000 n 0003783822 00000 n 0003783453 00000 n 0003783509 00000 n 0003783565 00000 n 0003784177 00000 n 0003787858 00000 n 0003783952 00000 n 0003784146 00000 n 0003788357 00000 n 0003787881 00000 n 0003787937 00000 n 0003787993 00000 n 0003788049 00000 n 0003788105 00000 n 0003788712 00000 n 0003793785 00000 n 0003788487 00000 n 0003788681 00000 n 0003794291 00000 n 0003793808 00000 n 0003793864 00000 n 0003793920 00000 n 0003793976 00000 n 0003794032 00000 n 0003794646 00000 n 0003798666 00000 n 0003794421 00000 n 0003794615 00000 n 0003798913 00000 n 0003798689 00000 n 0003798745 00000 n 0003798801 00000 n 0003798857 00000 n 0003799259 00000 n 0003802989 00000 n 0003799043 00000 n 0003799237 00000 n 0003803222 00000 n 0003803012 00000 n 0003803061 00000 n 0003803110 00000 n 0003803166 00000 n 0003803568 00000 n 0003808132 00000 n 0003803352 00000 n 0003803546 00000 n 0003808372 00000 n 0003808155 00000 n 0003808211 00000 n 0003808267 00000 n 0003808316 00000 n 0003808718 00000 n 0003813264 00000 n 0003808502 00000 n 0003808696 00000 n 0003813399 00000 n 0003813287 00000 n 0003813343 00000 n 0003813745 00000 n 0003818434 00000 n 0003813529 00000 n 0003813723 00000 n 0003819849 00000 n 0003818457 00000 n 0003818513 00000 n 0003818569 00000 n 0003818625 00000 n 0003818681 00000 n 0003818730 00000 n 0003818786 00000 n 0003818835 00000 n 0003818891 00000 n 0003819139 00000 n 0003819390 00000 n 0003819648 00000 n 0003820231 00000 n 0003825197 00000 n 0003819979 00000 n 0003820173 00000 n 0003830297 00000 n 0003825220 00000 n 0003825276 00000 n 0003825332 00000 n 0003825388 00000 n 0003825444 00000 n 0003825696 00000 n 0003825941 00000 n 0003826186 00000 n 0003826431 00000 n 0003826676 00000 n 0003826928 00000 n 0003827166 00000 n 0003827411 00000 n 0003827664 00000 n 0003827911 00000 n 0003828164 00000 n 0003828411 00000 n 0003828658 00000 n 0003828912 00000 n 0003829158 00000 n 0003829411 00000 n 0003829658 00000 n 0003829904 00000 n 0003830105 00000 n 0003830823 00000 n 0003837393 00000 n 0003830427 00000 n 0003830621 00000 n 0003841699 00000 n 0003837416 00000 n 0003837465 00000 n 0003837521 00000 n 0003837577 00000 n 0003837633 00000 n 0003837689 00000 n 0003837745 00000 n 0003837801 00000 n 0003837857 00000 n 0003838097 00000 n 0003838351 00000 n 0003838597 00000 n 0003838837 00000 n 0003839091 00000 n 0003839338 00000 n 0003839592 00000 n 0003839846 00000 n 0003840093 00000 n 0003840347 00000 n 0003840594 00000 n 0003840840 00000 n 0003841093 00000 n 0003841332 00000 n 0003841505 00000 n 0003842205 00000 n 0003851367 00000 n 0003841829 00000 n 0003842039 00000 n 0003851950 00000 n 0003851390 00000 n 0003851446 00000 n 0003851502 00000 n 0003851558 00000 n 0003851614 00000 n 0003851670 00000 n 0003851726 00000 n 0003851782 00000 n 0003851838 00000 n 0003851894 00000 n 0003852296 00000 n 0003861685 00000 n 0003852080 00000 n 0003852274 00000 n 0003862352 00000 n 0003861708 00000 n 0003861764 00000 n 0003861813 00000 n 0003861869 00000 n 0003861925 00000 n 0003861981 00000 n 0003862030 00000 n 0003862086 00000 n 0003862135 00000 n 0003862191 00000 n 0003862247 00000 n 0003862296 00000 n 0003862698 00000 n 0003867567 00000 n 0003862482 00000 n 0003862676 00000 n 0003867814 00000 n 0003867590 00000 n 0003867646 00000 n 0003867702 00000 n 0003867758 00000 n 0003868176 00000 n 0003873991 00000 n 0003867944 00000 n 0003868154 00000 n 0003874532 00000 n 0003874014 00000 n 0003874063 00000 n 0003874112 00000 n 0003874168 00000 n 0003874217 00000 n 0003874273 00000 n 0003874322 00000 n 0003874371 00000 n 0003874427 00000 n 0003874476 00000 n 0003874878 00000 n 0003879065 00000 n 0003874662 00000 n 0003874856 00000 n 0003879842 00000 n 0003879088 00000 n 0003879144 00000 n 0003879200 00000 n 0003879256 00000 n 0003879304 00000 n 0003879360 00000 n 0003879416 00000 n 0003879472 00000 n 0003879520 00000 n 0003879576 00000 n 0003879625 00000 n 0003879681 00000 n 0003879737 00000 n 0003879793 00000 n 0003880188 00000 n 0003888032 00000 n 0003879972 00000 n 0003880166 00000 n 0003891966 00000 n 0003888055 00000 n 0003888111 00000 n 0003888167 00000 n 0003888216 00000 n 0003888272 00000 n 0003888328 00000 n 0003888384 00000 n 0003888440 00000 n 0003888496 00000 n 0003888756 00000 n 0003889007 00000 n 0003889263 00000 n 0003889512 00000 n 0003889761 00000 n 0003890017 00000 n 0003890266 00000 n 0003890522 00000 n 0003890778 00000 n 0003891026 00000 n 0003891276 00000 n 0003891518 00000 n 0003891760 00000 n 0003892438 00000 n 0003899056 00000 n 0003892096 00000 n 0003892290 00000 n 0003909965 00000 n 0003899079 00000 n 0003899135 00000 n 0003899191 00000 n 0003899247 00000 n 0003899296 00000 n 0003899352 00000 n 0003899401 00000 n 0003899457 00000 n 0003899506 00000 n 0003899756 00000 n 0003900006 00000 n 0003900256 00000 n 0003900506 00000 n 0003900755 00000 n 0003900998 00000 n 0003901255 00000 n 0003901512 00000 n 0003901762 00000 n 0003902012 00000 n 0003902262 00000 n 0003902512 00000 n 0003902769 00000 n 0003903019 00000 n 0003903276 00000 n 0003903533 00000 n 0003903783 00000 n 0003904040 00000 n 0003904290 00000 n 0003904540 00000 n 0003904798 00000 n 0003905048 00000 n 0003905305 00000 n 0003905562 00000 n 0003905812 00000 n 0003906069 00000 n 0003906334 00000 n 0003906584 00000 n 0003906834 00000 n 0003907084 00000 n 0003907347 00000 n 0003907619 00000 n 0003907869 00000 n 0003908145 00000 n 0003908406 00000 n 0003908662 00000 n 0003908935 00000 n 0003909194 00000 n 0003909457 00000 n 0003909707 00000 n 0003910696 00000 n 0003921180 00000 n 0003910095 00000 n 0003910305 00000 n 0003921526 00000 n 0003921204 00000 n 0003921253 00000 n 0003921309 00000 n 0003921365 00000 n 0003921414 00000 n 0003921470 00000 n 0003921904 00000 n 0003929663 00000 n 0003921656 00000 n 0003921882 00000 n 0003929686 00000 n 0003930038 00000 n 0003934632 00000 n 0003929816 00000 n 0003930016 00000 n 0003934655 00000 n 0003934991 00000 n 0003937812 00000 n 0003934785 00000 n 0003934969 00000 n 0003938045 00000 n 0003937835 00000 n 0003937884 00000 n 0003937940 00000 n 0003937989 00000 n 0003938391 00000 n 0003943159 00000 n 0003938175 00000 n 0003938369 00000 n 0003943406 00000 n 0003943182 00000 n 0003943238 00000 n 0003943294 00000 n 0003943350 00000 n 0003943752 00000 n 0003949126 00000 n 0003943536 00000 n 0003943730 00000 n 0003949464 00000 n 0003949149 00000 n 0003949205 00000 n 0003949261 00000 n 0003949310 00000 n 0003949359 00000 n 0003949415 00000 n 0003949826 00000 n 0003955284 00000 n 0003949594 00000 n 0003949804 00000 n 0003955643 00000 n 0003955307 00000 n 0003955363 00000 n 0003955419 00000 n 0003955475 00000 n 0003955531 00000 n 0003955587 00000 n 0003956005 00000 n 0003960681 00000 n 0003955773 00000 n 0003955983 00000 n 0003960928 00000 n 0003960704 00000 n 0003960760 00000 n 0003960816 00000 n 0003960872 00000 n 0003961290 00000 n 0003966449 00000 n 0003961058 00000 n 0003961268 00000 n 0003966689 00000 n 0003966472 00000 n 0003966528 00000 n 0003966584 00000 n 0003966633 00000 n 0003967051 00000 n 0003971656 00000 n 0003966819 00000 n 0003967029 00000 n 0003971992 00000 n 0003971679 00000 n 0003971728 00000 n 0003971784 00000 n 0003971832 00000 n 0003971888 00000 n 0003971944 00000 n 0003972370 00000 n 0003979232 00000 n 0003972122 00000 n 0003972348 00000 n 0003979367 00000 n 0003979255 00000 n 0003979311 00000 n 0003979729 00000 n 0003983738 00000 n 0003979497 00000 n 0003979707 00000 n 0003984069 00000 n 0003983761 00000 n 0003983817 00000 n 0003983866 00000 n 0003983915 00000 n 0003983971 00000 n 0003984020 00000 n 0003984431 00000 n 0003990062 00000 n 0003984199 00000 n 0003984409 00000 n 0003990519 00000 n 0003990085 00000 n 0003990141 00000 n 0003990197 00000 n 0003990253 00000 n 0003990302 00000 n 0003990358 00000 n 0003990414 00000 n 0003990463 00000 n 0003990881 00000 n 0003996484 00000 n 0003990649 00000 n 0003990859 00000 n 0003996731 00000 n 0003996507 00000 n 0003996563 00000 n 0003996619 00000 n 0003996675 00000 n 0003997109 00000 n 0004003326 00000 n 0003996861 00000 n 0003997087 00000 n 0004003573 00000 n 0004003349 00000 n 0004003405 00000 n 0004003461 00000 n 0004003517 00000 n 0004003919 00000 n 0004009369 00000 n 0004003703 00000 n 0004003897 00000 n 0004009504 00000 n 0004009392 00000 n 0004009448 00000 n 0004009850 00000 n 0004014481 00000 n 0004009634 00000 n 0004009828 00000 n 0004014616 00000 n 0004014504 00000 n 0004014560 00000 n 0004014962 00000 n 0004020263 00000 n 0004014746 00000 n 0004014940 00000 n 0004021192 00000 n 0004020286 00000 n 0004020335 00000 n 0004020391 00000 n 0004020447 00000 n 0004020503 00000 n 0004020552 00000 n 0004020608 00000 n 0004020664 00000 n 0004020720 00000 n 0004021000 00000 n 0004021572 00000 n 0004030579 00000 n 0004021322 00000 n 0004021532 00000 n 0004030987 00000 n 0004030602 00000 n 0004030658 00000 n 0004030714 00000 n 0004031358 00000 n 0004037210 00000 n 0004031117 00000 n 0004031327 00000 n 0004038742 00000 n 0004037233 00000 n 0004037289 00000 n 0004037345 00000 n 0004037401 00000 n 0004037457 00000 n 0004037513 00000 n 0004037569 00000 n 0004037625 00000 n 0004037681 00000 n 0004037737 00000 n 0004037793 00000 n 0004038041 00000 n 0004038293 00000 n 0004038566 00000 n 0004039140 00000 n 0004049061 00000 n 0004038872 00000 n 0004039082 00000 n 0004049941 00000 n 0004049084 00000 n 0004049133 00000 n 0004049182 00000 n 0004049238 00000 n 0004049294 00000 n 0004049343 00000 n 0004049392 00000 n 0004049664 00000 n 0004050305 00000 n 0004058884 00000 n 0004050071 00000 n 0004050265 00000 n 0004058907 00000 n 0004059253 00000 n 0004062394 00000 n 0004059037 00000 n 0004059231 00000 n 0004494662 00000 n 0004062417 00000 n 0004062466 00000 n 0004062522 00000 n 0004494483 00000 n 0004272145 00000 n 0004272293 00000 n 0004273294 00000 n 0004276233 00000 n 0004279135 00000 n 0004282731 00000 n 0004284910 00000 n 0004294653 00000 n 0004304908 00000 n 0004313079 00000 n 0004313919 00000 n 0004315143 00000 n 0004317483 00000 n 0004321813 00000 n 0004323774 00000 n 0004335801 00000 n 0004338800 00000 n 0004339681 00000 n 0004341352 00000 n 0004346357 00000 n 0004349751 00000 n 0004351150 00000 n 0004354039 00000 n 0004355403 00000 n 0004361443 00000 n 0004365278 00000 n 0004370221 00000 n 0004373959 00000 n 0004395055 00000 n 0004398693 00000 n 0004406506 00000 n 0004411014 00000 n 0004420698 00000 n 0004425160 00000 n 0004443526 00000 n 0004444823 00000 n 0004462483 00000 n 0004470069 00000 n 0004478238 00000 n 0004478915 00000 n 0004484942 00000 n 0004494258 00000 n 0004273156 00000 n 0004272448 00000 n 0004272598 00000 n 0004272799 00000 n 0004273006 00000 n 0004273494 00000 n 0004273630 00000 n 0004273785 00000 n 0004273938 00000 n 0004274095 00000 n 0004274250 00000 n 0004274433 00000 n 0004274624 00000 n 0004274799 00000 n 0004274955 00000 n 0004275101 00000 n 0004276059 00000 n 0004275255 00000 n 0004275414 00000 n 0004275584 00000 n 0004275774 00000 n 0004275924 00000 n 0004276407 00000 n 0004276546 00000 n 0004277006 00000 n 0004278021 00000 n 0004278214 00000 n 0004278410 00000 n 0004278604 00000 n 0004278810 00000 n 0004278990 00000 n 0004276702 00000 n 0004276851 00000 n 0004277203 00000 n 0004277358 00000 n 0004277524 00000 n 0004277704 00000 n 0004277886 00000 n 0004279456 00000 n 0004281119 00000 n 0004282315 00000 n 0004282528 00000 n 0004279320 00000 n 0004280630 00000 n 0004280890 00000 n 0004279650 00000 n 0004279775 00000 n 0004279921 00000 n 0004280067 00000 n 0004280217 00000 n 0004280361 00000 n 0004280501 00000 n 0004281902 00000 n 0004282110 00000 n 0004281326 00000 n 0004281523 00000 n 0004281721 00000 n 0004282944 00000 n 0004283915 00000 n 0004284686 00000 n 0004283125 00000 n 0004283276 00000 n 0004283442 00000 n 0004283594 00000 n 0004283772 00000 n 0004284160 00000 n 0004284349 00000 n 0004284541 00000 n 0004286035 00000 n 0004287033 00000 n 0004288106 00000 n 0004290788 00000 n 0004292471 00000 n 0004293338 00000 n 0004294445 00000 n 0004285109 00000 n 0004285250 00000 n 0004285406 00000 n 0004285556 00000 n 0004285718 00000 n 0004285882 00000 n 0004286207 00000 n 0004286362 00000 n 0004286528 00000 n 0004286680 00000 n 0004286862 00000 n 0004287258 00000 n 0004287405 00000 n 0004287599 00000 n 0004287803 00000 n 0004287975 00000 n 0004288327 00000 n 0004288498 00000 n 0004288662 00000 n 0004288856 00000 n 0004289024 00000 n 0004289170 00000 n 0004290178 00000 n 0004290415 00000 n 0004290601 00000 n 0004289360 00000 n 0004289559 00000 n 0004289747 00000 n 0004289945 00000 n 0004290993 00000 n 0004291154 00000 n 0004291352 00000 n 0004291512 00000 n 0004291690 00000 n 0004291884 00000 n 0004292096 00000 n 0004292264 00000 n 0004292678 00000 n 0004292831 00000 n 0004293007 00000 n 0004293179 00000 n 0004293531 00000 n 0004293708 00000 n 0004293888 00000 n 0004294088 00000 n 0004294282 00000 n 0004294836 00000 n 0004294997 00000 n 0004295143 00000 n 0004295317 00000 n 0004296055 00000 n 0004297530 00000 n 0004297733 00000 n 0004297883 00000 n 0004298051 00000 n 0004298195 00000 n 0004298373 00000 n 0004298553 00000 n 0004298707 00000 n 0004298981 00000 n 0004299873 00000 n 0004300104 00000 n 0004300276 00000 n 0004301822 00000 n 0004302175 00000 n 0004302362 00000 n 0004302570 00000 n 0004302750 00000 n 0004302946 00000 n 0004303116 00000 n 0004303312 00000 n 0004303542 00000 n 0004303742 00000 n 0004303902 00000 n 0004304498 00000 n 0004304729 00000 n 0004295519 00000 n 0004295694 00000 n 0004295888 00000 n 0004296246 00000 n 0004296419 00000 n 0004296681 00000 n 0004296895 00000 n 0004297063 00000 n 0004297229 00000 n 0004297391 00000 n 0004299147 00000 n 0004299322 00000 n 0004299506 00000 n 0004299708 00000 n 0004300438 00000 n 0004300603 00000 n 0004300775 00000 n 0004300963 00000 n 0004301141 00000 n 0004301323 00000 n 0004301491 00000 n 0004301669 00000 n 0004302007 00000 n 0004304106 00000 n 0004304289 00000 n 0004305093 00000 n 0004310822 00000 n 0004312883 00000 n 0004305230 00000 n 0004305417 00000 n 0004305615 00000 n 0004305779 00000 n 0004305947 00000 n 0004306125 00000 n 0004306287 00000 n 0004306461 00000 n 0004306659 00000 n 0004306843 00000 n 0004307041 00000 n 0004307233 00000 n 0004307411 00000 n 0004307601 00000 n 0004307779 00000 n 0004307973 00000 n 0004308169 00000 n 0004308343 00000 n 0004308515 00000 n 0004308695 00000 n 0004308869 00000 n 0004309047 00000 n 0004309223 00000 n 0004309463 00000 n 0004309635 00000 n 0004309805 00000 n 0004310079 00000 n 0004310289 00000 n 0004310493 00000 n 0004310649 00000 n 0004311029 00000 n 0004311186 00000 n 0004311342 00000 n 0004311498 00000 n 0004311670 00000 n 0004311864 00000 n 0004312064 00000 n 0004312232 00000 n 0004312448 00000 n 0004312644 00000 n 0004313268 00000 n 0004313551 00000 n 0004313758 00000 n 0004313405 00000 n 0004314108 00000 n 0004314775 00000 n 0004314982 00000 n 0004314245 00000 n 0004314418 00000 n 0004314600 00000 n 0004315332 00000 n 0004315475 00000 n 0004315631 00000 n 0004315809 00000 n 0004315971 00000 n 0004316125 00000 n 0004316707 00000 n 0004316930 00000 n 0004317112 00000 n 0004317298 00000 n 0004316301 00000 n 0004316516 00000 n 0004317672 00000 n 0004318459 00000 n 0004319348 00000 n 0004321308 00000 n 0004321629 00000 n 0004317879 00000 n 0004318018 00000 n 0004318172 00000 n 0004318326 00000 n 0004318668 00000 n 0004318833 00000 n 0004319007 00000 n 0004319211 00000 n 0004319549 00000 n 0004319690 00000 n 0004319848 00000 n 0004320926 00000 n 0004321145 00000 n 0004320012 00000 n 0004320169 00000 n 0004320361 00000 n 0004320567 00000 n 0004320755 00000 n 0004321505 00000 n 0004322824 00000 n 0004323552 00000 n 0004322000 00000 n 0004322143 00000 n 0004322311 00000 n 0004322481 00000 n 0004322663 00000 n 0004323018 00000 n 0004323187 00000 n 0004323359 00000 n 0004325397 00000 n 0004326391 00000 n 0004327734 00000 n 0004329442 00000 n 0004331973 00000 n 0004332536 00000 n 0004332745 00000 n 0004332953 00000 n 0004333179 00000 n 0004333357 00000 n 0004333913 00000 n 0004334396 00000 n 0004334849 00000 n 0004335066 00000 n 0004335256 00000 n 0004335448 00000 n 0004335618 00000 n 0004323971 00000 n 0004324120 00000 n 0004324272 00000 n 0004324440 00000 n 0004324608 00000 n 0004324806 00000 n 0004325008 00000 n 0004325230 00000 n 0004325571 00000 n 0004325726 00000 n 0004325888 00000 n 0004326058 00000 n 0004326230 00000 n 0004326602 00000 n 0004326761 00000 n 0004326951 00000 n 0004327147 00000 n 0004327331 00000 n 0004327547 00000 n 0004327945 00000 n 0004328074 00000 n 0004328268 00000 n 0004328780 00000 n 0004328997 00000 n 0004329213 00000 n 0004328438 00000 n 0004328597 00000 n 0004329651 00000 n 0004329794 00000 n 0004329968 00000 n 0004330130 00000 n 0004330300 00000 n 0004330470 00000 n 0004330636 00000 n 0004330804 00000 n 0004330974 00000 n 0004331144 00000 n 0004331308 00000 n 0004331482 00000 n 0004331650 00000 n 0004331820 00000 n 0004332184 00000 n 0004332341 00000 n 0004333523 00000 n 0004333700 00000 n 0004334116 00000 n 0004334265 00000 n 0004334615 00000 n 0004337336 00000 n 0004337554 00000 n 0004338580 00000 n 0004335980 00000 n 0004336157 00000 n 0004336361 00000 n 0004336543 00000 n 0004336743 00000 n 0004336953 00000 n 0004337153 00000 n 0004337748 00000 n 0004337903 00000 n 0004338065 00000 n 0004338235 00000 n 0004338431 00000 n 0004339007 00000 n 0004339168 00000 n 0004339342 00000 n 0004339556 00000 n 0004339862 00000 n 0004340001 00000 n 0004340155 00000 n 0004340333 00000 n 0004340535 00000 n 0004340707 00000 n 0004340895 00000 n 0004341065 00000 n 0004341217 00000 n 0004341565 00000 n 0004343241 00000 n 0004344054 00000 n 0004344887 00000 n 0004345260 00000 n 0004345977 00000 n 0004346186 00000 n 0004341736 00000 n 0004342817 00000 n 0004343060 00000 n 0004341911 00000 n 0004342072 00000 n 0004342268 00000 n 0004342466 00000 n 0004342652 00000 n 0004343432 00000 n 0004343577 00000 n 0004343737 00000 n 0004343905 00000 n 0004344257 00000 n 0004344402 00000 n 0004344570 00000 n 0004344738 00000 n 0004345086 00000 n 0004345457 00000 n 0004345626 00000 n 0004345848 00000 n 0004346576 00000 n 0004346715 00000 n 0004346901 00000 n 0004347079 00000 n 0004347261 00000 n 0004347425 00000 n 0004347577 00000 n 0004347745 00000 n 0004349405 00000 n 0004349620 00000 n 0004347919 00000 n 0004348098 00000 n 0004348280 00000 n 0004348462 00000 n 0004348656 00000 n 0004348844 00000 n 0004349034 00000 n 0004349240 00000 n 0004349946 00000 n 0004350101 00000 n 0004350245 00000 n 0004350419 00000 n 0004350611 00000 n 0004350823 00000 n 0004350975 00000 n 0004351353 00000 n 0004351476 00000 n 0004351624 00000 n 0004351778 00000 n 0004351940 00000 n 0004352086 00000 n 0004352242 00000 n 0004352400 00000 n 0004352574 00000 n 0004352748 00000 n 0004352916 00000 n 0004353074 00000 n 0004353256 00000 n 0004353420 00000 n 0004353568 00000 n 0004353762 00000 n 0004353910 00000 n 0004354298 00000 n 0004355075 00000 n 0004355274 00000 n 0004354429 00000 n 0004354590 00000 n 0004354758 00000 n 0004354928 00000 n 0004355938 00000 n 0004356112 00000 n 0004356304 00000 n 0004357052 00000 n 0004358083 00000 n 0004358764 00000 n 0004358955 00000 n 0004361255 00000 n 0004355598 00000 n 0004355757 00000 n 0004356462 00000 n 0004356631 00000 n 0004356877 00000 n 0004357237 00000 n 0004357440 00000 n 0004357650 00000 n 0004357888 00000 n 0004358276 00000 n 0004358429 00000 n 0004358613 00000 n 0004359119 00000 n 0004359364 00000 n 0004359606 00000 n 0004359872 00000 n 0004360122 00000 n 0004360418 00000 n 0004360638 00000 n 0004360856 00000 n 0004361086 00000 n 0004361628 00000 n 0004361767 00000 n 0004363215 00000 n 0004363398 00000 n 0004363558 00000 n 0004363704 00000 n 0004363860 00000 n 0004364724 00000 n 0004364919 00000 n 0004365087 00000 n 0004361945 00000 n 0004362112 00000 n 0004362288 00000 n 0004362488 00000 n 0004362696 00000 n 0004362868 00000 n 0004363050 00000 n 0004364014 00000 n 0004364205 00000 n 0004364385 00000 n 0004364561 00000 n 0004365461 00000 n 0004365592 00000 n 0004366086 00000 n 0004370011 00000 n 0004365740 00000 n 0004365921 00000 n 0004366293 00000 n 0004366442 00000 n 0004366594 00000 n 0004366754 00000 n 0004367258 00000 n 0004367449 00000 n 0004369099 00000 n 0004369308 00000 n 0004369512 00000 n 0004369680 00000 n 0004369868 00000 n 0004366920 00000 n 0004367095 00000 n 0004367609 00000 n 0004367764 00000 n 0004367950 00000 n 0004368142 00000 n 0004368330 00000 n 0004368504 00000 n 0004368688 00000 n 0004368914 00000 n 0004370406 00000 n 0004370569 00000 n 0004370739 00000 n 0004371767 00000 n 0004371948 00000 n 0004372116 00000 n 0004372548 00000 n 0004372785 00000 n 0004372959 00000 n 0004373127 00000 n 0004373307 00000 n 0004373769 00000 n 0004370903 00000 n 0004371050 00000 n 0004371216 00000 n 0004371406 00000 n 0004371616 00000 n 0004372264 00000 n 0004372393 00000 n 0004373487 00000 n 0004373634 00000 n 0004374150 00000 n 0004376102 00000 n 0004380258 00000 n 0004383531 00000 n 0004385235 00000 n 0004385488 00000 n 0004386666 00000 n 0004388089 00000 n 0004390196 00000 n 0004393415 00000 n 0004393617 00000 n 0004394715 00000 n 0004394911 00000 n 0004374281 00000 n 0004374424 00000 n 0004374620 00000 n 0004374816 00000 n 0004375004 00000 n 0004375174 00000 n 0004375358 00000 n 0004375910 00000 n 0004375580 00000 n 0004375765 00000 n 0004376295 00000 n 0004376502 00000 n 0004376656 00000 n 0004376824 00000 n 0004377794 00000 n 0004377989 00000 n 0004378141 00000 n 0004378297 00000 n 0004378455 00000 n 0004378755 00000 n 0004379020 00000 n 0004379206 00000 n 0004379386 00000 n 0004379552 00000 n 0004380066 00000 n 0004376978 00000 n 0004377131 00000 n 0004377299 00000 n 0004377473 00000 n 0004377647 00000 n 0004378621 00000 n 0004379716 00000 n 0004379897 00000 n 0004380659 00000 n 0004381029 00000 n 0004382290 00000 n 0004382497 00000 n 0004383197 00000 n 0004383392 00000 n 0004380485 00000 n 0004380865 00000 n 0004381242 00000 n 0004381399 00000 n 0004381561 00000 n 0004381773 00000 n 0004382075 00000 n 0004382673 00000 n 0004382838 00000 n 0004383026 00000 n 0004383788 00000 n 0004383943 00000 n 0004384111 00000 n 0004384293 00000 n 0004384477 00000 n 0004384663 00000 n 0004385021 00000 n 0004384853 00000 n 0004385674 00000 n 0004385837 00000 n 0004386029 00000 n 0004386227 00000 n 0004386469 00000 n 0004386891 00000 n 0004387144 00000 n 0004387310 00000 n 0004387514 00000 n 0004387686 00000 n 0004387866 00000 n 0004388294 00000 n 0004388476 00000 n 0004388693 00000 n 0004388868 00000 n 0004389041 00000 n 0004389270 00000 n 0004389453 00000 n 0004389634 00000 n 0004389849 00000 n 0004390022 00000 n 0004390390 00000 n 0004390610 00000 n 0004390861 00000 n 0004391112 00000 n 0004391331 00000 n 0004391560 00000 n 0004391767 00000 n 0004392004 00000 n 0004392229 00000 n 0004392452 00000 n 0004392643 00000 n 0004392910 00000 n 0004393157 00000 n 0004393804 00000 n 0004393958 00000 n 0004394181 00000 n 0004394376 00000 n 0004394575 00000 n 0004395244 00000 n 0004395853 00000 n 0004397061 00000 n 0004397513 00000 n 0004398514 00000 n 0004395376 00000 n 0004395520 00000 n 0004395709 00000 n 0004396184 00000 n 0004396663 00000 n 0004396865 00000 n 0004396047 00000 n 0004396393 00000 n 0004396533 00000 n 0004397251 00000 n 0004397383 00000 n 0004397697 00000 n 0004397839 00000 n 0004398004 00000 n 0004398155 00000 n 0004398320 00000 n 0004398895 00000 n 0004399773 00000 n 0004403570 00000 n 0004404490 00000 n 0004404990 00000 n 0004405546 00000 n 0004406303 00000 n 0004399037 00000 n 0004399219 00000 n 0004399430 00000 n 0004399619 00000 n 0004399965 00000 n 0004400099 00000 n 0004400254 00000 n 0004400606 00000 n 0004400816 00000 n 0004400969 00000 n 0004401126 00000 n 0004401285 00000 n 0004401452 00000 n 0004401669 00000 n 0004401856 00000 n 0004402021 00000 n 0004402216 00000 n 0004402423 00000 n 0004402588 00000 n 0004402763 00000 n 0004403393 00000 n 0004400423 00000 n 0004402930 00000 n 0004403092 00000 n 0004403245 00000 n 0004403798 00000 n 0004403954 00000 n 0004404119 00000 n 0004404294 00000 n 0004404674 00000 n 0004404838 00000 n 0004405190 00000 n 0004405374 00000 n 0004405774 00000 n 0004405966 00000 n 0004406149 00000 n 0004406694 00000 n 0004407339 00000 n 0004410803 00000 n 0004406836 00000 n 0004406996 00000 n 0004407185 00000 n 0004407531 00000 n 0004407665 00000 n 0004407820 00000 n 0004407989 00000 n 0004408164 00000 n 0004408317 00000 n 0004408506 00000 n 0004408673 00000 n 0004408858 00000 n 0004409021 00000 n 0004409216 00000 n 0004409733 00000 n 0004409943 00000 n 0004410164 00000 n 0004410317 00000 n 0004410490 00000 n 0004410651 00000 n 0004409381 00000 n 0004409563 00000 n 0004411208 00000 n 0004412701 00000 n 0004413245 00000 n 0004415117 00000 n 0004415331 00000 n 0004415518 00000 n 0004416343 00000 n 0004417703 00000 n 0004419076 00000 n 0004419270 00000 n 0004420491 00000 n 0004411340 00000 n 0004411520 00000 n 0004411709 00000 n 0004411926 00000 n 0004412129 00000 n 0004412298 00000 n 0004412521 00000 n 0004412895 00000 n 0004413083 00000 n 0004413489 00000 n 0004413627 00000 n 0004413796 00000 n 0004413951 00000 n 0004414104 00000 n 0004414261 00000 n 0004414420 00000 n 0004414615 00000 n 0004414800 00000 n 0004414955 00000 n 0004415687 00000 n 0004415855 00000 n 0004416020 00000 n 0004416191 00000 n 0004416577 00000 n 0004416771 00000 n 0004416934 00000 n 0004417133 00000 n 0004417336 00000 n 0004417551 00000 n 0004417903 00000 n 0004418049 00000 n 0004418242 00000 n 0004418411 00000 n 0004418576 00000 n 0004418743 00000 n 0004418902 00000 n 0004419459 00000 n 0004419617 00000 n 0004419788 00000 n 0004419991 00000 n 0004420168 00000 n 0004420353 00000 n 0004421228 00000 n 0004423566 00000 n 0004424955 00000 n 0004420890 00000 n 0004421068 00000 n 0004421429 00000 n 0004421567 00000 n 0004421736 00000 n 0004421891 00000 n 0004422050 00000 n 0004423146 00000 n 0004423370 00000 n 0004422233 00000 n 0004422385 00000 n 0004422582 00000 n 0004422769 00000 n 0004422956 00000 n 0004423772 00000 n 0004423928 00000 n 0004424097 00000 n 0004424298 00000 n 0004424473 00000 n 0004424656 00000 n 0004424809 00000 n 0004425348 00000 n 0004427129 00000 n 0004430235 00000 n 0004431315 00000 n 0004432756 00000 n 0004434057 00000 n 0004435118 00000 n 0004435984 00000 n 0004437623 00000 n 0004439304 00000 n 0004441666 00000 n 0004442729 00000 n 0004443297 00000 n 0004425480 00000 n 0004425624 00000 n 0004425791 00000 n 0004425990 00000 n 0004426155 00000 n 0004426326 00000 n 0004426521 00000 n 0004426718 00000 n 0004426935 00000 n 0004427323 00000 n 0004427457 00000 n 0004427612 00000 n 0004427781 00000 n 0004427956 00000 n 0004428109 00000 n 0004428266 00000 n 0004428425 00000 n 0004428592 00000 n 0004428809 00000 n 0004428996 00000 n 0004429161 00000 n 0004429328 00000 n 0004429845 00000 n 0004430055 00000 n 0004429493 00000 n 0004429675 00000 n 0004430463 00000 n 0004430961 00000 n 0004431161 00000 n 0004430609 00000 n 0004430755 00000 n 0004431573 00000 n 0004431729 00000 n 0004431898 00000 n 0004432099 00000 n 0004432274 00000 n 0004432457 00000 n 0004432610 00000 n 0004432978 00000 n 0004433142 00000 n 0004433337 00000 n 0004433530 00000 n 0004433862 00000 n 0004433735 00000 n 0004434283 00000 n 0004434457 00000 n 0004434624 00000 n 0004434797 00000 n 0004434964 00000 n 0004435324 00000 n 0004435480 00000 n 0004435647 00000 n 0004435818 00000 n 0004436168 00000 n 0004436358 00000 n 0004436593 00000 n 0004436798 00000 n 0004437013 00000 n 0004437208 00000 n 0004437377 00000 n 0004437823 00000 n 0004438924 00000 n 0004439138 00000 n 0004437977 00000 n 0004438153 00000 n 0004438346 00000 n 0004438539 00000 n 0004438732 00000 n 0004439510 00000 n 0004439684 00000 n 0004439881 00000 n 0004440090 00000 n 0004440281 00000 n 0004441471 00000 n 0004440474 00000 n 0004440664 00000 n 0004440853 00000 n 0004441064 00000 n 0004441291 00000 n 0004441866 00000 n 0004442026 00000 n 0004442197 00000 n 0004442378 00000 n 0004442575 00000 n 0004442931 00000 n 0004443129 00000 n 0004443720 00000 n 0004443844 00000 n 0004444009 00000 n 0004444194 00000 n 0004444355 00000 n 0004444528 00000 n 0004444683 00000 n 0004446051 00000 n 0004446399 00000 n 0004450061 00000 n 0004450921 00000 n 0004451101 00000 n 0004451972 00000 n 0004458676 00000 n 0004460325 00000 n 0004461054 00000 n 0004462296 00000 n 0004445007 00000 n 0004445151 00000 n 0004445348 00000 n 0004445537 00000 n 0004445708 00000 n 0004445873 00000 n 0004446228 00000 n 0004446655 00000 n 0004446789 00000 n 0004446944 00000 n 0004447113 00000 n 0004447268 00000 n 0004447421 00000 n 0004447578 00000 n 0004447737 00000 n 0004447904 00000 n 0004448089 00000 n 0004448254 00000 n 0004448421 00000 n 0004448586 00000 n 0004448797 00000 n 0004448968 00000 n 0004449493 00000 n 0004449850 00000 n 0004449141 00000 n 0004449323 00000 n 0004449703 00000 n 0004450279 00000 n 0004450431 00000 n 0004450602 00000 n 0004450763 00000 n 0004451288 00000 n 0004451468 00000 n 0004451645 00000 n 0004451818 00000 n 0004452176 00000 n 0004452332 00000 n 0004452495 00000 n 0004452666 00000 n 0004452839 00000 n 0004456128 00000 n 0004456326 00000 n 0004457346 00000 n 0004457550 00000 n 0004457719 00000 n 0004457930 00000 n 0004458282 00000 n 0004458488 00000 n 0004453018 00000 n 0004453166 00000 n 0004453345 00000 n 0004453512 00000 n 0004453687 00000 n 0004453862 00000 n 0004454033 00000 n 0004454206 00000 n 0004454381 00000 n 0004454556 00000 n 0004454735 00000 n 0004454908 00000 n 0004455083 00000 n 0004455258 00000 n 0004455437 00000 n 0004455618 00000 n 0004455805 00000 n 0004455970 00000 n 0004456497 00000 n 0004456675 00000 n 0004456870 00000 n 0004457043 00000 n 0004457204 00000 n 0004458129 00000 n 0004458860 00000 n 0004459949 00000 n 0004460161 00000 n 0004459012 00000 n 0004459186 00000 n 0004459377 00000 n 0004459568 00000 n 0004459759 00000 n 0004460529 00000 n 0004460689 00000 n 0004460886 00000 n 0004461252 00000 n 0004461438 00000 n 0004461609 00000 n 0004461778 00000 n 0004461945 00000 n 0004462112 00000 n 0004462673 00000 n 0004463668 00000 n 0004467527 00000 n 0004468540 00000 n 0004468762 00000 n 0004469231 00000 n 0004469721 00000 n 0004469923 00000 n 0004462815 00000 n 0004462977 00000 n 0004463152 00000 n 0004463325 00000 n 0004463494 00000 n 0004463860 00000 n 0004463996 00000 n 0004464485 00000 n 0004464675 00000 n 0004465134 00000 n 0004465668 00000 n 0004465856 00000 n 0004466013 00000 n 0004466172 00000 n 0004466339 00000 n 0004466508 00000 n 0004466727 00000 n 0004466892 00000 n 0004467057 00000 n 0004467224 00000 n 0004467391 00000 n 0004464155 00000 n 0004464311 00000 n 0004464844 00000 n 0004464986 00000 n 0004465358 00000 n 0004465516 00000 n 0004467755 00000 n 0004467937 00000 n 0004468086 00000 n 0004468261 00000 n 0004468414 00000 n 0004468937 00000 n 0004469087 00000 n 0004469427 00000 n 0004469575 00000 n 0004471697 00000 n 0004472204 00000 n 0004474792 00000 n 0004475320 00000 n 0004475572 00000 n 0004475759 00000 n 0004477308 00000 n 0004477492 00000 n 0004477836 00000 n 0004478096 00000 n 0004470263 00000 n 0004470443 00000 n 0004470632 00000 n 0004470797 00000 n 0004470968 00000 n 0004471163 00000 n 0004471360 00000 n 0004471545 00000 n 0004471874 00000 n 0004472062 00000 n 0004472464 00000 n 0004472598 00000 n 0004472753 00000 n 0004472922 00000 n 0004473097 00000 n 0004473250 00000 n 0004473407 00000 n 0004473566 00000 n 0004473733 00000 n 0004473950 00000 n 0004474137 00000 n 0004474302 00000 n 0004474469 00000 n 0004474634 00000 n 0004475020 00000 n 0004475166 00000 n 0004475928 00000 n 0004476084 00000 n 0004476245 00000 n 0004476416 00000 n 0004476621 00000 n 0004476816 00000 n 0004476985 00000 n 0004477156 00000 n 0004477707 00000 n 0004478426 00000 n 0004478594 00000 n 0004478755 00000 n 0004479992 00000 n 0004484382 00000 n 0004484747 00000 n 0004479127 00000 n 0004479271 00000 n 0004479444 00000 n 0004479615 00000 n 0004479786 00000 n 0004480169 00000 n 0004480476 00000 n 0004481440 00000 n 0004482316 00000 n 0004484038 00000 n 0004484242 00000 n 0004480329 00000 n 0004480658 00000 n 0004480842 00000 n 0004481039 00000 n 0004481210 00000 n 0004481624 00000 n 0004481806 00000 n 0004481981 00000 n 0004482164 00000 n 0004482510 00000 n 0004482676 00000 n 0004482871 00000 n 0004483056 00000 n 0004483247 00000 n 0004483514 00000 n 0004483691 00000 n 0004483870 00000 n 0004484612 00000 n 0004485134 00000 n 0004485274 00000 n 0004485433 00000 n 0004486884 00000 n 0004488008 00000 n 0004488226 00000 n 0004488437 00000 n 0004489598 00000 n 0004489788 00000 n 0004493504 00000 n 0004493724 00000 n 0004493893 00000 n 0004494078 00000 n 0004485596 00000 n 0004485742 00000 n 0004485893 00000 n 0004486052 00000 n 0004486229 00000 n 0004486392 00000 n 0004486573 00000 n 0004486740 00000 n 0004487082 00000 n 0004487216 00000 n 0004487365 00000 n 0004487512 00000 n 0004487683 00000 n 0004487882 00000 n 0004488616 00000 n 0004488784 00000 n 0004488955 00000 n 0004489112 00000 n 0004489295 00000 n 0004489446 00000 n 0004489941 00000 n 0004490093 00000 n 0004490256 00000 n 0004490435 00000 n 0004490636 00000 n 0004490835 00000 n 0004491036 00000 n 0004491225 00000 n 0004491402 00000 n 0004491571 00000 n 0004491756 00000 n 0004492078 00000 n 0004492338 00000 n 0004492505 00000 n 0004493018 00000 n 0004493238 00000 n 0004491923 00000 n 0004492692 00000 n 0004492852 00000 n 0004494552 00000 n 0004495008 00000 n 0004497761 00000 n 0004494792 00000 n 0004494986 00000 n 0004497784 00000 n 0004498057 00000 n 0004506267 00000 n 0004506842 00000 n 0004506244 00000 n 0004508018 00000 n 0004508235 00000 n 0004518059 00000 n 0004518281 00000 n 0004518036 00000 n 0004519469 00000 n 0004519688 00000 n 0004524016 00000 n 0004524240 00000 n 0004523993 00000 n 0004525066 00000 n 0004525341 00000 n 0004532345 00000 n 0004532858 00000 n 0004532322 00000 n 0004533927 00000 n 0004534195 00000 n 0004543088 00000 n 0004543695 00000 n 0004543065 00000 n 0004544930 00000 n 0004545153 00000 n 0004547091 00000 n 0004547319 00000 n 0004547068 00000 n 0004547967 00000 n 0004548231 00000 n 0004552606 00000 n 0004552832 00000 n 0004552583 00000 n 0004553407 00000 n 0004553625 00000 n 0004565437 00000 n 0004565660 00000 n 0004565413 00000 n trailer << /Size 9325 /Info 1 0 R /Root 9280 0 R >> startxref 4571534 %%EOF swig-4.0.1/Doc/Manual/Preprocessor.html0000644000175000017500000003244513527234052017654 0ustar williamwilliam SWIG Preprocessor

    SWIG includes its own enhanced version of the C preprocessor. The preprocessor supports the standard preprocessor directives and macro expansion rules. However, a number of modifications and enhancements have been made. This chapter describes some of these modifications.

    10.1 File inclusion

    To include another file into a SWIG interface, use the %include directive like this:

    %include "pointer.i"
    

    Unlike, #include, %include includes each file once (and will not reload the file on subsequent %include declarations). Therefore, it is not necessary to use include-guards in SWIG interfaces.

    By default, the #include is ignored unless you run SWIG with the -includeall option. The reason for ignoring traditional includes is that you often don't want SWIG to try and wrap everything included in standard header system headers and auxiliary files.

    10.2 File imports

    SWIG provides another file inclusion directive with the %import directive. For example:

    %import "foo.i"
    

    The purpose of %import is to collect certain information from another SWIG interface file or a header file without actually generating any wrapper code. Such information generally includes type declarations (e.g., typedef) as well as C++ classes that might be used as base-classes for class declarations in the interface. The use of %import is also important when SWIG is used to generate extensions as a collection of related modules. This is an advanced topic and is described in later in the Working with Modules chapter.

    The -importall directive tells SWIG to follow all #include statements as imports. This might be useful if you want to extract type definitions from system header files without generating any wrappers.

    10.3 Conditional Compilation

    SWIG fully supports the use of #if, #ifdef, #ifndef, #else, #endif to conditionally include parts of an interface. The following symbols are predefined by SWIG when it is parsing the interface:

    SWIG                            Always defined when SWIG is processing a file
    SWIGIMPORTED                    Defined when SWIG is importing a file with %import
    SWIG_VERSION                    Hexadecimal (binary-coded decimal) number containing SWIG version,
                                    such as 0x010311 (corresponding to SWIG-1.3.11).
    
    SWIGCSHARP                      Defined when using C#
    SWIGGUILE                       Defined when using Guile
    SWIGJAVA                        Defined when using Java
    SWIGJAVASCRIPT                  Defined when using Javascript
    SWIG_JAVASCRIPT_JSC             Defined when using Javascript for JavascriptCore
    SWIG_JAVASCRIPT_V8              Defined when using Javascript for v8 or node.js 
    SWIGLUA                         Defined when using Lua
    SWIGMZSCHEME                    Defined when using Mzscheme
    SWIGOCAML                       Defined when using OCaml
    SWIGOCTAVE                      Defined when using Octave
    SWIGPERL                        Defined when using Perl
    SWIGPHP                         Defined when using PHP (any version)
    SWIGPHP7                        Defined when using PHP7
    SWIGPYTHON                      Defined when using Python
    SWIGR                           Defined when using R
    SWIGRUBY                        Defined when using Ruby
    SWIGSCILAB                      Defined when using Scilab
    SWIGTCL                         Defined when using Tcl
    SWIGXML                         Defined when using XML
    

    In addition, SWIG defines the following set of standard C/C++ macros:

    __LINE__                        Current line number
    __FILE__                        Current file name
    __STDC__                        Defined to indicate ISO C
    __cplusplus                     Defined when -c++ option used
    

    Interface files can look at these symbols as necessary to change the way in which an interface is generated or to mix SWIG directives with C code. These symbols are also defined within the C code generated by SWIG (except for the symbol `SWIG' which is only defined within the SWIG compiler).

    10.4 Macro Expansion

    Traditional preprocessor macros can be used in SWIG interfaces. Be aware that the #define statement is also used to try and detect constants. Therefore, if you have something like this in your file,

    #ifndef _FOO_H 1
    #define _FOO_H 1
    ...
    #endif
    

    you may get some extra constants such as _FOO_H showing up in the scripting interface.

    More complex macros can be defined in the standard way. For example:

    #define EXTERN extern
    #ifdef __STDC__
    #define ISOC_(args)   (args)
    #else
    #define ISOC_(args) ()
    #endif
    

    The following operators can appear in macro definitions:

    • #x
      Converts macro argument x to a string surrounded by double quotes ("x").
    • x ## y
      Concatenates x and y together to form xy.
    • `x`
      If x is a string surrounded by double quotes, do nothing. Otherwise, turn into a string like #x. This is a non-standard SWIG extension.

    10.5 SWIG Macros

    SWIG provides an enhanced macro capability with the %define and %enddef directives. For example:

    %define ARRAYHELPER(type, name)
    %inline %{
    type *new_ ## name (int nitems) {
      return (type *) malloc(sizeof(type)*nitems);
    }
    void delete_ ## name(type *t) {
      free(t);
    }
    type name ## _get(type *t, int index) {
      return t[index];
    }
    void name ## _set(type *t, int index, type val) {
      t[index] = val;
    }
    %}
    %enddef
    
    ARRAYHELPER(int, IntArray)
    ARRAYHELPER(double, DoubleArray)
    

    The primary purpose of %define is to define large macros of code. Unlike normal C preprocessor macros, it is not necessary to terminate each line with a continuation character (\)--the macro definition extends to the first occurrence of %enddef. Furthermore, when such macros are expanded, they are reparsed through the C preprocessor. Thus, SWIG macros can contain all other preprocessor directives except for nested %define statements.

    The SWIG macro capability is a very quick and easy way to generate large amounts of code. In fact, many of SWIG's advanced features and libraries are built using this mechanism (such as C++ template support).

    10.6 C99 and GNU Extensions

    SWIG-1.3.12 and newer releases support variadic preprocessor macros. For example:

    #define DEBUGF(fmt, ...)   fprintf(stderr, fmt, __VA_ARGS__)
    

    When used, any extra arguments to ... are placed into the special variable __VA_ARGS__. This also works with special SWIG macros defined using %define.

    SWIG allows a variable number of arguments to be empty. However, this often results in an extra comma (, ) and syntax error in the resulting expansion. For example:

    DEBUGF("hello");   --> fprintf(stderr, "hello", );
    

    To get rid of the extra comma, use ## like this:

    #define DEBUGF(fmt, ...)   fprintf(stderr, fmt, ##__VA_ARGS__)
    

    SWIG also supports GNU-style variadic macros. For example:

    #define DEBUGF(fmt, args...)  fprintf(stdout, fmt, args)
    

    Comment: It's not entirely clear how variadic macros might be useful to interface building. However, they are used internally to implement a number of SWIG directives and are provided to make SWIG more compatible with C99 code.

    10.7 Preprocessing and delimiters

    The preprocessor handles { }, " " and %{ %} delimiters differently.

    10.7.1 Preprocessing and %{ ... %} & " ... " delimiters

    The SWIG preprocessor does not process any text enclosed in a code block %{ ... %}. Therefore, if you write code like this,

    %{
    #ifdef NEED_BLAH
    int blah() {
      ...
    }
    #endif
    %}
    

    the contents of the %{ ... %} block are copied without modification to the output (including all preprocessor directives).

    10.7.2 Preprocessing and { ... } delimiters

    SWIG always runs the preprocessor on text appearing inside { ... }. However, sometimes it is desirable to make a preprocessor directive pass through to the output file. For example:

    %extend Foo {
      void bar() {
        #ifdef DEBUG
          printf("I'm in bar\n");
        #endif
      }
    }
    

    By default, SWIG will interpret the #ifdef DEBUG statement. However, if you really wanted that code to actually go into the wrapper file, prefix the preprocessor directives with % like this:

    %extend Foo {
      void bar() {
        %#ifdef DEBUG
          printf("I'm in bar\n");
        %#endif
      }
    }
    

    SWIG will strip the extra % and leave the preprocessor directive in the code.

    10.8 Preprocessor and Typemaps

    Typemaps support a special attribute called noblock where the { ... } delimiters can be used, but the delimiters are not actually generated into the code. The effect is then similar to using "" or %{ %} delimiters but the code is run through the preprocessor. For example:

    #define SWIG_macro(CAST) (CAST)$input
    %typemap(in) Int {$1= SWIG_macro(int);}
    

    might generate

      {
        arg1=(int)jarg1;
      }
    

    whereas

    #define SWIG_macro(CAST) (CAST)$input
    %typemap(in, noblock=1) Int {$1= SWIG_macro(int);}
    

    might generate

      arg1=(int)jarg1;
    

    and

    #define SWIG_macro(CAST) (CAST)$input
    %typemap(in) Int %{$1=SWIG_macro(int);%}
    

    would generate

      arg1=SWIG_macro(int);
    

    10.9 Viewing preprocessor output

    Like many compilers, SWIG supports a -E command line option to display the output from the preprocessor. When the -E option is used, SWIG will not generate any wrappers. Instead the results after the preprocessor has run are displayed. This might be useful as an aid to debugging and viewing the results of macro expansions.

    10.10 The #error and #warning directives

    SWIG supports the commonly used #warning and #error preprocessor directives. The #warning directive will cause SWIG to issue a warning then continue processing. The #error directive will cause SWIG to exit with a fatal error. Example usage:

    #error "This is a fatal error message"
    #warning "This is a warning message"
    

    The #error behaviour can be made to work like #warning if the -cpperraswarn commandline option is used. Alternatively, the #pragma directive can be used to the same effect, for example:

      /* Modified behaviour: #error does not cause SWIG to exit with error */
      #pragma SWIG cpperraswarn=1
      /* Normal behaviour: #error does cause SWIG to exit with error */
      #pragma SWIG cpperraswarn=0
    
    swig-4.0.1/Doc/Manual/R.html0000644000175000017500000001604013527234053015361 0ustar williamwilliam SWIG and R

    33 SWIG and R

    R is a GPL'ed open source statistical and plotting environment. Information about R can be found at www.r-project.org.

    The R bindings are under active development. They have been used to compile and run an R interface to QuantLib running on Mandriva Linux with gcc. The R bindings also work on Microsoft Windows using Visual C++.

    33.1 Bugs

    Currently the following features are not implemented or broken:

    • Garbage collection of created objects
    • C Array wrappings

    33.2 Using R and SWIG

    To use R and SWIG in C mode, execute the following commands where example.c is the name of the file with the functions in them

    swig -r example.i
    R CMD SHLIB example_wrap.c example.c
    

    The corresponding options for C++ mode are

    swig -c++ -r -o example_wrap.cpp example.i
    R CMD SHLIB example_wrap.cpp example.cpp
    

    Note that R is sensitive to the names of the files. The name of the wrapper file must be the name of the library unless you use the -o option to R when building the library, for example:

    swig -c++ -r -o example_wrap.cpp example.i
    R CMD SHLIB -o example.so example_wrap.cpp example.cpp
    

    R is also sensitive to the name of the file extension in C and C++ mode. In C++ mode, the file extension must be .cpp rather than .cxx for the R compile command to recognize it. If your C++ code is in a file using something other than a .cpp extension, then it may still work using PKG_LIBS:

    swig -c++ -r -o example_wrap.cpp example.i
    PKG_LIBS="example.cxx" R CMD SHLIB -o example example_wrap.cpp
    

    The commands produces two files. A dynamic shared object file called example.so, or example.dll, and an R wrapper file called example.R. To load these files, start up R and type in the following commands

    dyn.load(paste("example", .Platform$dynlib.ext, sep=""))
    source("example.R")
    cacheMetaData(1)
    

    The cacheMetaData(1) will cause R to refresh its object tables. Without it, inheritance of wrapped objects may fail. These two files can be loaded in any order.

    If you are compiling code yourself (not using R itself), there are a few things to watch out for:

    • The output shared library name (to the left of the file extension) MUST match the module name, or alternatively, you can also set the -package NAME command line argument. See swig -r -help for more information
    • If you do not set the output file name appropriately, you might see errors like
      > fact(4)
      Error in .Call("R_swig_fact", s_arg1, as.logical(.copy), PACKAGE = "example") :
        "R_swig_fact" not available for .Call() for package "example"
      
    • Make sure the architecture of the shared library(x64 for instance), matches the architecture of the R program you want to load your shared library into

    33.3 Precompiling large R files

    In cases where the R file is large, one make save a lot of loading time by precompiling the R wrapper. This can be done by creating the file makeRData.R which contains the following

    source('BigFile.R')
    save(list=ls(all=TRUE), file="BigFile.RData", compress=TRUE)
    q(save="no")
    

    This will generate a compiled R file called BigFile.RData that will save a large amount of loading time.

    33.4 General policy

    The general policy of the module is to treat the C/C++ as a basic wrapping over the underlying functions and rely on the R type system to provide R syntax.

    33.5 Language conventions

    getitem and setitem use C++ conventions (i.e. zero based indices). [<- and [ are overloaded to allow for R syntax (one based indices and slices)

    33.6 C++ classes

    C++ objects are implemented as external pointer objects with the class being the mangled name of the class. The C++ classes are encapsulated as an SEXP with an external pointer type. The class is the mangled name of the class. The nice thing about R is that is allows you to keep track of the pointer object which removes the necessity for a lot of the proxy class baggage you see in other languages.

    33.7 Enumerations

    R doesn't have a native enumeration type. Enumerations are represented as character strings in R, with calls to R functions that convert back and forth between integers.

    The details of enumeration names and contents are stored in hidden R environments, which are named according the the enumeration name - for example, an enumeration colour:

    enum colour { red=-1, blue, green = 10 };
    

    will be initialized by the following call in R:

    defineEnumeration("_colour",
     .values=c("red" = .Call('R_swig_colour_red_get',FALSE, PACKAGE='enum_thorough'),
    "blue" = .Call('R_swig_colour_blue_get',FALSE, PACKAGE='enum_thorough'),
    "green" = .Call('R_swig_colour_green_get',FALSE, PACKAGE='enum_thorough')))
    

    which will create an environment named .__E___colour. The enumeration values are initialised via calls to C/C++ code, allowing complex values for enumerations to be used. Calls to the C/C++ code require the compiled library to be loaded, so a delayedAssign is employed within defineEnumeration in order to allow the code to be easily used in R packages.

    The user typically does not need to access the enumeration lookup functions or know the name of the enumeration type used by R. Attributes containing the type information are attached by swig to functions requiring enumeration arguments or returning enumeration values, and those attributes are used to identify and access the appropriate environments and thus translate between characters and integers.

    The relevant functions, for debugging purposes, are enumToInteger and enumFromInteger.

    Anonymous enumerations are ignored by the binding generation process, leaving no way of accessing the value of anonymous enumerations from R code.

    swig-4.0.1/Doc/Manual/Java.html0000644000175000017500000111757013527234052016053 0ustar williamwilliam SWIG and Java

    26 SWIG and Java

    This chapter describes SWIG's support of Java. It covers most SWIG features, but certain low-level details are covered in less depth than in earlier chapters.

    26.1 Overview

    The 100% Pure Java effort is a commendable concept, however in the real world programmers often either need to re-use their existing code or in some situations want to take advantage of Java but are forced into using some native (C/C++) code. The Java extension to SWIG makes it very easy to plumb in existing C/C++ code for access from Java, as SWIG writes the Java Native Interface (JNI) code for you. It is different to using the 'javah' tool as SWIG will wrap existing C/C++ code, whereas javah takes 'native' Java function declarations and creates C/C++ function prototypes. SWIG wraps C/C++ code using Java proxy classes and is very useful if you want to have access to large amounts of C/C++ code from Java. If only one or two JNI functions are needed then using SWIG may be overkill. SWIG enables a Java program to easily call into C/C++ code from Java. Historically, SWIG was not able to generate any code to call into Java code from C++. However, SWIG now supports full cross language polymorphism and code is generated to call up from C++ to Java when wrapping C++ virtual methods via the director feature.

    Java is one of the few non-scripting language modules in SWIG. As SWIG utilizes the type safety that the Java language offers, it takes a somewhat different approach to that used for scripting languages. In particular runtime type checking and the runtime library are not used by Java. This should be borne in mind when reading the rest of the SWIG documentation. This chapter on Java is relatively self contained and will provide you with nearly everything you need for using SWIG and Java. However, the "SWIG Basics" chapter will be a useful read in conjunction with this one.

    This chapter starts with a few practicalities on running SWIG and compiling the generated code. If you are looking for the minimum amount to read, have a look at the sections up to and including the tour of basic C/C++ wrapping section which explains how to call the various C/C++ code constructs from Java. Following this section are details of the C/C++ code and Java classes that SWIG generates. Due to the complexities of C and C++ there are different ways in which C/C++ code could be wrapped and called from Java. SWIG is a powerful tool and the rest of the chapter details how the default code wrapping can be tailored. Various customisation tips and techniques using SWIG directives are covered. The latter sections cover the advanced techniques of using typemaps for complete control of the wrapping process.

    26.2 Preliminaries

    SWIG 1.1 works with JDKs from JDK 1.1 to JDK1.4 (Java 2 SDK1.4) and should also work with any later versions. Given the choice, you should probably use the latest version of Sun's JDK. The SWIG Java module is known to work using Sun's JVM on Solaris, Linux and the various flavours of Microsoft Windows including Cygwin. The Kaffe JVM is known to give a few problems and at the time of writing was not a fully fledged JVM with full JNI support. The generated code is also known to work on vxWorks using WindRiver's PJava 3.1. The best way to determine whether your combination of operating system and JDK will work is to test the examples and test-suite that comes with SWIG. Run make -k check from the SWIG root directory after installing SWIG on Unix systems.

    The Java module requires your system to support shared libraries and dynamic loading. This is the commonly used method to load JNI code so your system will more than likely support this.

    Android uses Java JNI and also works with SWIG. Please read the Android chapter in conjunction with this one if you are targeting Android.

    26.2.1 Running SWIG

    Suppose that you defined a SWIG module such as the following:

    /* File: example.i */
    %module test
    %{
    #include "stuff.h"
    %}
    int fact(int n);
    

    To build a Java module, run SWIG using the -java option :

    %swig -java example.i
    

    If building C++, add the -c++ option:

    $ swig -c++ -java example.i
    

    This creates two different files; a C/C++ source file example_wrap.c or example_wrap.cxx and numerous Java files. The generated C/C++ source file contains the JNI wrapper code that needs to be compiled and linked with the rest of your C/C++ application.

    The name of the wrapper file is derived from the name of the input file. For example, if the input file is example.i, the name of the wrapper file is example_wrap.c. To change this, you can use the -o option. It is also possible to change the output directory that the Java files are generated into using -outdir.

    The module name, specified with %module, determines the name of various generated classes as discussed later. Note that the module name does not define a Java package and by default, the generated Java classes do not have a Java package. The -package option described below can specify a Java package name to use.

    The following sections have further practical examples and details on how you might go about compiling and using the generated files.

    26.2.2 Additional Commandline Options

    The following table lists the additional commandline options available for the Java module. They can also be seen by using:

    swig -java -help 
    
    Java specific options
    -nopgcpp suppress the premature garbage collection prevention parameter
    -noproxy generate the low-level functional interface instead of proxy classes
    -package <name> set name of the Java package to <name>

    Their use will become clearer by the time you have finished reading this section on SWIG and Java.

    26.2.3 Getting the right header files

    In order to compile the C/C++ wrappers, the compiler needs the jni.h and jni_md.h header files which are part of the JDK. They are usually in directories like this:

    /usr/java/include
    /usr/java/include/<operating_system>
    

    The exact location may vary on your machine, but the above locations are typical.

    26.2.4 Compiling a dynamic module

    The JNI code exists in a dynamic module or shared library (DLL on Windows) and gets loaded by the JVM. Assuming you have code you need to link to in a file called example.c, in order to build a shared library file, you need to compile your module in a manner similar to the following (shown for Solaris):

    $ swig -java example.i
    $ gcc -fPIC -c example_wrap.c -I/usr/java/include -I/usr/java/include/solaris
    $ gcc -fPIC -c example.c
    $ ld -G example_wrap.o example.o -o libexample.so
    

    The exact commands for doing this vary from platform to platform. However, SWIG tries to guess the right options when it is installed. Therefore, you may want to start with one of the examples in the Examples/java directory. If that doesn't work, you will need to read the man-pages for your compiler and linker to get the right set of options. You might also check the SWIG Wiki for additional information.

    Important
    If you are going to use optimisations turned on with gcc (for example -O2), ensure you also compile with -fno-strict-aliasing. The GCC optimisations have become more aggressive from gcc-4.0 onwards and will result in code that fails with strict aliasing optimisations turned on. See the C/C++ to Java typemaps section for more details.

    The name of the shared library output file is important. If the name of your SWIG module is "example", the name of the corresponding shared library file should be "libexample.so" (or equivalent depending on your machine, see Dynamic linking problems for more information). The name of the module is specified using the %module directive or -module command line option.

    26.2.5 Using your module

    To load your shared native library module in Java, simply use Java's System.loadLibrary method in a Java class:

    // runme.java
    
    public class runme {
      static {
        System.loadLibrary("example");
      }
    
      public static void main(String argv[]) {
        System.out.println(example.fact(4));
      }
    }
    

    Compile all the Java files and run:

    $ javac *.java
    $ java runme
    24
    $
    

    If it doesn't work have a look at the following section which discusses problems loading the shared library.

    26.2.6 Dynamic linking problems

    As shown in the previous section the code to load a native library (shared library) is System.loadLibrary("name"). This can fail with an UnsatisfiedLinkError exception and can be due to a number of reasons.

    You may get an exception similar to this:

    $ java runme
    Exception in thread "main" java.lang.UnsatisfiedLinkError: no example in java.library.path
            at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1312)
            at java.lang.Runtime.loadLibrary0(Runtime.java:749)
            at java.lang.System.loadLibrary(System.java:820)
            at runme.<clinit>(runme.java:5)
    

    The most common cause for this is an incorrect naming of the native library for the name passed to the loadLibrary function. The string passed to the loadLibrary function must not include the file extension name in the string, that is .dll or .so. The string must be name and not libname for all platforms. On Windows the native library must then be called name.dll and on most Unix systems it must be called libname.so.

    Another common reason for the native library not loading is because it is not in your path. On Windows make sure the path environment variable contains the path to the native library. On Unix make sure that your LD_LIBRARY_PATH contains the path to the native library. Adding paths to LD_LIBRARY_PATH can slow down other programs on your system so you may want to consider alternative approaches. For example you could recompile your native library with extra path information using -rpath if you're using GNU, see the GNU linker documentation (ld man page). You could use a command such as ldconfig (Linux) or crle (Solaris) to add additional search paths to the default system configuration (this requires root access and you will need to read the man pages).

    The native library will also not load if there are any unresolved symbols in the compiled C/C++ code. The following exception is indicative of this:

    $ java runme
    Exception in thread "main" java.lang.UnsatisfiedLinkError: libexample.so: undefined
    symbol: fact
            at java.lang.ClassLoader$NativeLibrary.load(Native Method)
            at java.lang.ClassLoader.loadLibrary0(ClassLoader.java, Compiled Code)
            at java.lang.ClassLoader.loadLibrary(ClassLoader.java, Compiled Code)
            at java.lang.Runtime.loadLibrary0(Runtime.java, Compiled Code)
            at java.lang.System.loadLibrary(System.java, Compiled Code)
            at runme.<clinit>(runme.java:5)
    $
    

    This error usually indicates that you forgot to include some object files or libraries in the linking of the native library file. Make sure you compile both the SWIG wrapper file and the code you are wrapping into the native library file. If you forget to compile and link in the SWIG wrapper file into your native library file, you will get a message similar to the following:

    $ java runme
    Exception in thread "main" java.lang.UnsatisfiedLinkError: exampleJNI.gcd(II)I
            at exampleJNI.gcd(Native Method)
            at example.gcd(example.java:12)
            at runme.main(runme.java:18)
    

    where gcd is the missing JNI function that SWIG generated into the wrapper file. Also make sure you pass all of the required libraries to the linker. The java -verbose:jni commandline option is also a great way to get more information on unresolved symbols. One last piece of advice is to beware of the common faux pas of having more than one native library version in your path.

    In summary, ensure that you are using the correct C/C++ compiler and linker combination and options for successful native library loading. If you are using the examples that ship with SWIG, then the Examples/Makefile must have these set up correctly for your system. The SWIG installation package makes a best attempt at getting these correct but does not get it right 100% of the time. The SWIG Wiki also has some settings for commonly used compiler and operating system combinations. The following section also contains some C++ specific linking problems and solutions.

    26.2.7 Compilation problems and compiling with C++

    On most machines, shared library files should be linked using the C++ compiler. For example:

    % swig -c++ -java example.i
    % g++ -c -fpic example.cxx
    % g++ -c -fpic example_wrap.cxx -I/usr/java/j2sdk1.4.1/include -I/usr/java/j2sdk1.4.1/include/linux
    % g++ -shared example.o example_wrap.o -o libexample.so
    

    In addition to this, you may need to include additional library files to make it work. For example, if you are using the Sun C++ compiler on Solaris, you often need to add an extra library -lCrun like this:

    % swig -c++ -java example.i
    % CC -c example.cxx
    % CC -c example_wrap.cxx -I/usr/java/include -I/usr/java/include/solaris
    % CC -G example.o example_wrap.o -L/opt/SUNWspro/lib -o libexample.so -lCrun
    

    If you aren't entirely sure about the linking for C++, you might look at an existing C++ program. On many Unix machines, the ldd command will list library dependencies. This should give you some clues about what you might have to include when you link your shared library. For example:

    $ ldd swig
            libstdc++-libc6.1-1.so.2 => /usr/lib/libstdc++-libc6.1-1.so.2 (0x40019000)
            libm.so.6 => /lib/libm.so.6 (0x4005b000)
            libc.so.6 => /lib/libc.so.6 (0x40077000)
            /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
    $
    

    Finally make sure the version of JDK header files matches the version of Java that you are running as incompatibilities could lead to compilation problems or unpredictable behaviour.

    26.2.8 Building on Windows

    Building on Windows is roughly similar to the process used with Unix. You will want to produce a DLL that can be loaded by the Java Virtual Machine. This section covers the process of using SWIG with Microsoft Visual C++ 6 although the procedure may be similar with other compilers. In order for everything to work, you will need to have a JDK installed on your machine in order to read the JNI header files.

    26.2.8.1 Running SWIG from Visual Studio

    If you are developing your application within Microsoft Visual studio, SWIG can be invoked as a custom build option. The Examples\java directory has a few Windows Examples containing Visual Studio project (.dsp) files. The process to re-create the project files for a C project are roughly:

    • Open up a new workspace and use the AppWizard to select a DLL project.
    • Add both the SWIG interface file (the .i file), any supporting C files, and the name of the wrapper file that will be created by SWIG (ie. example_wrap.c). Don't worry if the wrapper file doesn't exist yet--Visual Studio will keep a reference to it.
    • Select the SWIG interface file and go to the settings menu. Under settings, select the "Custom Build" option.
    • Enter "SWIG" in the description field.
    • Enter "swig -java -o $(ProjDir)\$(InputName)_wrap.c $(InputPath)" in the "Build command(s) field"
    • Enter "$(ProjDir)\$(InputName)_wrap.c" in the "Output files(s) field".
    • Next, select the settings for the entire project and go to C/C++ tab and select the Preprocessor category. Add the include directories to the JNI header files under "Additional include directories", eg "C:\jdk1.3\include, C:\jdk1.3\include\win32".
    • Next, select the settings for the entire project and go to Link tab and select the General category. Set the name of the output file to match the name of your Java module (ie. example.dll).
    • Next, select the example.c and example_wrap.c files and go to the C/C++ tab and select the Precompiled Headers tab in the project settings. Disabling precompiled headers for these files will overcome any precompiled header errors while building.
    • Finally, add the java compilation as a post build rule in the Post-build step tab in project settings, eg, "c:\jdk1.3\bin\javac *.java"
    • Build your project.

    Note: If using C++, choose a C++ suffix for the wrapper file, for example example_wrap.cxx. Use _wrap.cxx instead of _wrap.c in the instructions above and add -c++ when invoking swig.

    Now, assuming all went well, SWIG will be automatically invoked when you build your project. When doing a build, any changes made to the interface file will result in SWIG being automatically invoked to produce a new version of the wrapper file.

    The Java classes that SWIG output should also be compiled into .class files. To run the native code in the DLL (example.dll), make sure that it is in your path then run your Java program which uses it, as described in the previous section. If the library fails to load have a look at Dynamic linking problems.

    26.2.8.2 Using NMAKE

    Alternatively, a Makefile for use by NMAKE can be written. Make sure the environment variables for MSVC++ are available and the MSVC++ tools are in your path. Now, just write a short Makefile like this :

    # Makefile for using SWIG and Java for C code
    
    SRCS          = example.c
    IFILE         = example
    INTERFACE     = $(IFILE).i
    WRAPFILE      = $(IFILE)_wrap.c
    
    # Location of the Visual C++ tools (32 bit assumed)
    
    TOOLS         = c:\msdev
    TARGET        = example.dll
    CC            = $(TOOLS)\bin\cl.exe
    LINK          = $(TOOLS)\bin\link.exe
    INCLUDE32     = -I$(TOOLS)\include
    MACHINE       = IX86
    
    # C Library needed to build a DLL
    
    DLLIBC        = msvcrt.lib oldnames.lib  
    
    # Windows libraries that are apparently needed
    WINLIB        = kernel32.lib advapi32.lib user32.lib gdi32.lib comdlg32.lib winspool.lib
    
    # Libraries common to all DLLs
    LIBS          = $(DLLIBC) $(WINLIB) 
    
    # Linker options
    LOPT      = -debug:full -debugtype:cv /NODEFAULTLIB /RELEASE /NOLOGO \
                 /MACHINE:$(MACHINE) -entry:_DllMainCRTStartup@12 -dll
    
    # C compiler flags
    
    CFLAGS        = /Z7 /Od /c /nologo
    JAVA_INCLUDE    = -ID:\jdk1.3\include -ID:\jdk1.3\include\win32
    
    java::
            swig -java -o $(WRAPFILE) $(INTERFACE)
            $(CC) $(CFLAGS) $(JAVA_INCLUDE) $(SRCS) $(WRAPFILE)
            set LIB=$(TOOLS)\lib
            $(LINK) $(LOPT) -out:example.dll $(LIBS) example.obj example_wrap.obj
            javac *.java
    

    To build the DLL and compile the java code, run NMAKE (you may need to run vcvars32 first). This is a pretty simplistic Makefile, but hopefully its enough to get you started. Of course you may want to make changes for it to work for C++ by adding in the -c++ command line option for swig and replacing .c with .cxx.

    26.3 A tour of basic C/C++ wrapping

    By default, SWIG attempts to build a natural Java interface to your C/C++ code. Functions are wrapped as functions, classes are wrapped as classes, variables are wrapped with JavaBean type getters and setters and so forth. This section briefly covers the essential aspects of this wrapping.

    26.3.1 Modules, packages and generated Java classes

    The SWIG %module directive specifies the name of the Java module. When you specify `%module example', the module name determines the name of some of the generated files in the module. The generated code consists of a module class file example.java, an intermediary JNI class file, exampleJNI.java as well as numerous other Java proxy class files. Each proxy class is named after the structs, unions and classes you are wrapping. You may also get a constants interface file if you are wrapping any unnamed enumerations or constants, for example exampleConstants.java. When choosing a module name, make sure you don't use the same name as one of the generated proxy class files nor a Java keyword. Sometimes a C/C++ type cannot be wrapped by a proxy class, for example a pointer to a primitive type. In these situations a type wrapper class is generated. Wrapping an enum generates an enum class, either a proper Java enum or a Java class that simulates the enums pattern. Details of all these generated classes will unfold as you read this section.

    The JNI (C/C++) code is generated into a file which also contains the module name, for example example_wrap.cxx or example_wrap.c. These C or C++ files complete the contents of the module.

    The generated Java classes can be placed into a Java package by using the -package commandline option. This is often combined with the -outdir to specify a package directory for generating the Java files.

    swig -java -package com.bloggs.swig -outdir com/bloggs/swig example.i
    

    SWIG won't create the directory, so make sure it exists beforehand.

    26.3.2 Functions

    There is no such thing as a global Java function so global C functions are wrapped as static methods in the module class. For example,

    %module example
    int fact(int n);
    
    

    creates a static function that works exactly like you think it might:

    public class example {
      public static int fact(int n) {
        // makes call using JNI to the C function
      }
    }
    

    The Java class example is the module class. The function can be used as follows from Java:

    System.out.println(example.fact(4));
    

    26.3.3 Global variables

    C/C++ global variables are fully supported by SWIG. Java does not allow the overriding of the dot operator so all variables are accessed through getters and setters. Again because there is no such thing as a Java global variable, access to C/C++ global variables is done through static getter and setter functions in the module class.

    // SWIG interface file with global variables
    %module example
    ...
    %inline %{
    extern int My_variable;
    extern double density;
    %}
    ...
    

    Now in Java :

    // Print out value of a C global variable
    System.out.println("My_variable = " + example.getMy_variable());
    // Set the value of a C global variable
    example.setDensity(0.8442);
    

    The value returned by the getter will always be up to date even if the value is changed in C. Note that the getters and setters produced follow the JavaBean property design pattern. That is the first letter of the variable name is capitalized and preceded with set or get. If you have the misfortune of wrapping two variables that differ only in the capitalization of their first letters, use %rename to change one of the variable names. For example:

    %rename Clash RenamedClash;
    float Clash;
    int clash;
    

    If a variable is declared as const, it is wrapped as a read-only variable. That is only a getter is produced.

    To make ordinary variables read-only, you can use the %immutable directive. For example:

    %{
    extern char *path;
    %}
    %immutable;
    extern char *path;
    %mutable;
    

    The %immutable directive stays in effect until it is explicitly disabled or cleared using %mutable. See the Creating read-only variables section for further details.

    If you just want to make a specific variable immutable, supply a declaration name. For example:

    %{
    extern char *path;
    %}
    %immutable path;
    ...
    extern char *path;      // Read-only (due to %immutable)
    

    26.3.4 Constants

    C/C++ constants are wrapped as Java static final variables. To create a constant, use #define or the %constant directive. For example:

    #define PI 3.14159
    #define VERSION "1.0"
    %constant int FOO = 42;
    %constant const char *path = "/usr/local";
    

    By default the generated static final variables are initialized by making a JNI call to get their value. The constants are generated into the constants interface and look like this:

    public interface exampleConstants {
      public final static double PI = exampleJNI.PI_get();
      public final static String VERSION = exampleJNI.VERSION_get();
      public final static int FOO = exampleJNI.FOO_get();
      public final static String path = exampleJNI.path_get();
    }
    

    Note that SWIG has inferred the C type and used an appropriate Java type that will fit the range of all possible values for the C type. By default SWIG generates runtime constants. They are not compiler constants that can, for example, be used in a switch statement. This can be changed by using the %javaconst(flag) directive. It works like all the other %feature directives. The default is %javaconst(0). It is possible to initialize all wrapped constants from pure Java code by placing a %javaconst(1) before SWIG parses the constants. Putting it at the top of your interface file would ensure this. Here is an example:

    %javaconst(1);
    %javaconst(0) BIG;
    %javaconst(0) LARGE;
    
    #define EXPRESSION (0x100+5)
    #define BIG 1000LL
    #define LARGE 2000ULL
    

    generates:

    public interface exampleConstants {
      public final static int EXPRESSION = (0x100+5);
      public final static long BIG = exampleJNI.BIG_get();
      public final static java.math.BigInteger LARGE = exampleJNI.LARGE_get();
    }
    

    Note that SWIG has inferred the C long long type from BIG and used an appropriate Java type (long) as a Java long is the smallest sized Java type that will take all possible values for a C long long. Similarly for LARGE.

    Be careful using the %javaconst(1) directive as not all C code will compile as Java code. For example neither the 1000LL value for BIG nor 2000ULL for LARGE above would generate valid Java code. The example demonstrates how you can target particular constants (BIG and LARGE) with %javaconst. SWIG doesn't use %javaconst(1) as the default as it tries to generate code that will always compile. However, using a %javaconst(1) at the top of your interface file is strongly recommended as the preferred compile time constants will be generated and most C constants will compile as Java code and in any case the odd constant that doesn't can be fixed using %javaconst(0).

    There is an alternative directive which can be used for these rare constant values that won't compile as Java code. This is the %javaconstvalue(value) directive, where value is a Java code replacement for the C constant and can be either a string or a number. This is useful if you do not want to use either the parsed C value nor a JNI call, such as when the C parsed value will not compile as Java code and a compile time constant is required. The same example demonstrates this:

    %javaconst(1);
    %javaconstvalue("new java.math.BigInteger(\"2000\")") LARGE;
    %javaconstvalue(1000) BIG;
    
    #define EXPRESSION (0x100+5)
    #define BIG 1000LL
    #define LARGE 2000ULL
    

    Note the string quotes for "2000" are escaped. The following is then generated:

    public interface exampleConstants {
      public final static int EXPRESSION = (0x100+5);
      public final static long BIG = 1000;
      public final static java.math.BigInteger LARGE = new java.math.BigInteger("2000");
    }
    

    Note: declarations declared as const are wrapped as read-only variables and will be accessed using a getter as described in the previous section. They are not wrapped as constants. The exception to this rule are static const integral values defined within a class/struct, where they are wrapped as constants, eg:.

    struct Maths {
      static const int FIVE = 5;
    };
    

    Compatibility Note: In SWIG-1.3.19 and earlier releases, the constants were generated into the module class and the constants interface didn't exist. Backwards compatibility is maintained as the module class implements the constants interface (even though some consider this type of interface implementation to be bad practice):

    public class example implements exampleConstants {
    }
    

    You thus have the choice of accessing these constants from either the module class or the constants interface, for example, example.EXPRESSION or exampleConstants.EXPRESSION. Or if you decide this practice isn't so bad and your own class implements exampleConstants, you can of course just use EXPRESSION.

    26.3.5 Enumerations

    SWIG handles both named and unnamed (anonymous) enumerations. There is a choice of approaches to wrapping named C/C++ enums. This is due to historical reasons as SWIG's initial support for enums was limited and Java did not originally have support for enums. Each approach has advantages and disadvantages and it is important for the user to decide which is the most appropriate solution. There are four approaches of which the first is the default approach based on the so called Java typesafe enum pattern. The second generates proper Java enums. The final two approaches use simple integers for each enum item. Before looking at the various approaches for wrapping named C/C++ enums, anonymous enums are considered.

    26.3.5.1 Anonymous enums

    There is no name for anonymous enums and so they are handled like constants. For example:

    enum { ALE, LAGER=10, STOUT, PILSNER, PILZ=PILSNER };
    

    is wrapped into the constants interface, in a similar manner as constants (see previous section):

    public interface exampleConstants {
      public final static int ALE = exampleJNI.ALE_get();
      public final static int LAGER = exampleJNI.LAGER_get();
      public final static int STOUT = exampleJNI.STOUT_get();
      public final static int PILSNER = exampleJNI.PILSNER_get();
      public final static int PILZ = exampleJNI.PILZ_get();
    }
    

    The %javaconst(flag) and %javaconstvalue(value) directive introduced in the previous section on constants can also be used with enums. As is the case for constants, the default is %javaconst(0) as not all C values will compile as Java code. However, it is strongly recommended to add in a %javaconst(1) directive at the top of your interface file as it is only on very rare occasions that this will produce code that won't compile under Java. Using %javaconst(1) will ensure compile time constants are generated, thereby allowing the enum values to be used in Java switch statements. Example usage:

    %javaconst(1);
    %javaconst(0) PILSNER;
    enum { ALE, LAGER=10, STOUT, PILSNER, PILZ=PILSNER };
    

    generates:

    public interface exampleConstants {
      public final static int ALE = 0;
      public final static int LAGER = 10;
      public final static int STOUT = LAGER + 1;
      public final static int PILSNER = exampleJNI.PILSNER_get();
      public final static int PILZ = PILSNER;
    }
    

    As in the case of constants, you can access them through either the module class or the constants interface, for example, example.ALE or exampleConstants.ALE.

    26.3.5.2 Typesafe enums

    This is the default approach to wrapping named enums. The typesafe enum pattern is a relatively well known construct to work around the lack of enums in versions of Java prior to JDK 1.5. It basically defines a class for the enumeration and permits a limited number of final static instances of the class. Each instance equates to an enum item within the enumeration. The implementation is in the "enumtypesafe.swg" file. Let's look at an example:

    %include "enumtypesafe.swg" // optional as typesafe enums are the default
    enum Beverage { ALE, LAGER=10, STOUT, PILSNER, PILZ=PILSNER };
    

    will generate:

    public final class Beverage {
      public final static Beverage ALE = new Beverage("ALE");
      public final static Beverage LAGER = new Beverage("LAGER", exampleJNI.LAGER_get());
      public final static Beverage STOUT = new Beverage("STOUT");
      public final static Beverage PILSNER = new Beverage("PILSNER");
      public final static Beverage PILZ = new Beverage("PILZ", exampleJNI.PILZ_get());
      [... additional support methods omitted for brevity ...]
    }
    

    See Typesafe enum classes to see the omitted support methods. Note that the enum item with an initializer (LAGER) is initialized with the enum value obtained via a JNI call. However, as with anonymous enums and constants, use of the %javaconst directive is strongly recommended to change this behaviour:

    %include "enumtypesafe.swg" // optional as typesafe enums are the default
    %javaconst(1);
    enum Beverage { ALE, LAGER=10, STOUT, PILSNER, PILZ=PILSNER };
    

    will generate:

    public final class Beverage {
      public final static Beverage ALE = new Beverage("ALE");
      public final static Beverage LAGER = new Beverage("LAGER", 10);
      public final static Beverage STOUT = new Beverage("STOUT");
      public final static Beverage PILSNER = new Beverage("PILSNER");
      public final static Beverage PILZ = new Beverage("PILZ", PILSNER);
      [... additional support methods omitted for brevity ...]
    }
    

    The generated code is easier to read and more efficient as a true constant is used instead of a JNI call. As is the case for constants, the default is %javaconst(0) as not all C values will compile as Java code. However, it is recommended to add in a %javaconst(1) directive at the top of your interface file as it is only on very rare occasions that this will produce code that won't compile under Java. The %javaconstvalue(value) directive can also be used for typesafe enums. Note that global enums are generated into a Java class within whatever package you are using. C++ enums defined within a C++ class are generated into a static final inner Java class within the Java proxy class.

    Typesafe enums have their advantages over using plain integers in that they can be used in a typesafe manner. However, there are limitations. For example, they cannot be used in switch statements and serialization is an issue. Please look at the following references for further information: Replace Enums with Classes in Effective Java Programming on the Sun website, Create enumerated constants in Java JavaWorld article, Java Tip 133: More on typesafe enums and Java Tip 122: Beware of Java typesafe enumerations JavaWorld tips.

    Note that the syntax required for using typesafe enums is the same as that for proper Java enums. This is useful during the period that a project has to support legacy versions of Java. When upgrading to JDK 1.5 or later, proper Java enums could be used instead, without users having to change their code. The following section details proper Java enum generation.

    26.3.5.3 Proper Java enums

    Proper Java enums were only introduced in JDK 1.5 so this approach is only compatible with more recent versions of Java. Java enums have been designed to overcome all the limitations of both typesafe and type unsafe enums and should be the choice solution, provided older versions of Java do not have to be supported. In this approach, each named C/C++ enum is wrapped by a Java enum. Java enums, by default, do not support enums with initializers. Java enums are in many respects similar to Java classes in that they can be customised with additional methods. SWIG takes advantage of this feature to facilitate wrapping C/C++ enums that have initializers. In order to wrap all possible C/C++ enums using proper Java enums, the "enums.swg" file must be used. Let's take a look at an example.

    %include "enums.swg"
    %javaconst(1);
    enum Beverage { ALE, LAGER=10, STOUT, PILSNER, PILZ=PILSNER };
    

    will generate:

    public enum Beverage {
      ALE,
      LAGER(10),
      STOUT,
      PILSNER,
      PILZ(PILSNER);
      [... additional support methods omitted for brevity ...]
    }
    

    See Proper Java enum classes to see the omitted support methods. The generated Java enum has numerous additional methods to support enums with initializers, such as LAGER above. Note that as with the typesafe enum pattern, enum items with initializers are by default initialized with the enum value obtained via a JNI call. However, this is not the case above as we have used the recommended %javaconst(1) to avoid the JNI call. The %javaconstvalue(value) directive covered in the Constants section can also be used for proper Java enums.

    The additional support methods need not be generated if none of the enum items have initializers and this is covered later in the Simpler Java enums for enums without initializers section.

    26.3.5.4 Type unsafe enums

    In this approach each enum item in a named enumeration is wrapped as a static final integer in a class named after the C/C++ enum name. This is a commonly used pattern in Java to simulate C/C++ enums, but it is not typesafe. However, the main advantage over the typesafe enum pattern is enum items can be used in switch statements. In order to use this approach, the "enumtypeunsafe.swg" file must be used. Let's take a look at an example.

    %include "enumtypeunsafe.swg"
    %javaconst(1);
    enum Beverage { ALE, LAGER=10, STOUT, PILSNER, PILZ=PILSNER };
    

    will generate:

    public final class Beverage {
      public final static int ALE = 0;
      public final static int LAGER = 10;
      public final static int STOUT = LAGER + 1;
      public final static int PILSNER = STOUT + 1;
      public final static int PILZ = PILSNER;
    }
    

    As is the case previously, the default is %javaconst(0) as not all C/C++ values will compile as Java code. However, again it is recommended to add in a %javaconst(1) directive. and the %javaconstvalue(value) directive covered in the Constants section can also be used for type unsafe enums. Note that global enums are generated into a Java class within whatever package you are using. C++ enums defined within a C++ class are generated into a static final inner Java class within the Java proxy class.

    Note that unlike typesafe enums, this approach requires users to mostly use different syntax compared with proper Java enums. Thus the upgrade path to proper enums provided in JDK 1.5 is more painful.

    26.3.5.5 Simple enums

    This approach is similar to the type unsafe approach. Each enum item is also wrapped as a static final integer. However, these integers are not generated into a class named after the C/C++ enum. Instead, global enums are generated into the constants interface. Also, enums defined in a C++ class have their enum items generated directly into the Java proxy class rather than an inner class within the Java proxy class. In fact, this approach is effectively wrapping the enums as if they were anonymous enums and the resulting code is as per anonymous enums. The implementation is in the "enumsimple.swg" file.

    Compatibility Note: SWIG-1.3.21 and earlier versions wrapped all enums using this approach. The type unsafe approach is preferable to this one and this simple approach is only included for backwards compatibility with these earlier versions of SWIG.

    26.3.6 Pointers

    C/C++ pointers are fully supported by SWIG. Furthermore, SWIG has no problem working with incomplete type information. Here is a rather simple interface:

    %module example
    
    FILE *fopen(const char *filename, const char *mode);
    int fputs(const char *, FILE *);
    int fclose(FILE *);
    

    When wrapped, you will be able to use the functions in a natural way from Java. For example:

    SWIGTYPE_p_FILE f = example.fopen("junk", "w");
    example.fputs("Hello World\n", f);
    example.fclose(f);
    

    C pointers in the Java module are stored in a Java long and cross the JNI boundary held within this 64 bit number. Many other SWIG language modules use an encoding of the pointer in a string. These scripting languages use the SWIG runtime type checker for dynamic type checking as they do not support static type checking by a compiler. In order to implement static type checking of pointers within Java, they are wrapped by a simple Java class. In the example above the FILE * pointer is wrapped with a type wrapper class called SWIGTYPE_p_FILE.

    Once obtained, a type wrapper object can be freely passed around to different C functions that expect to receive an object of that type. The only thing you can't do is dereference the pointer from Java. Of course, that isn't much of a concern in this example.

    As much as you might be inclined to modify a pointer value directly from Java, don't. The value is not necessarily the same as the logical memory address of the underlying object. The value will vary depending on the native byte-ordering of the platform (i.e., big-endian vs. little-endian). Most JVMs are 32 bit applications so any JNI code must also be compiled as 32 bit. The net result is pointers in JNI code are also 32 bits and are stored in the high order 4 bytes on big-endian machines and in the low order 4 bytes on little-endian machines. By design it is also not possible to manually cast a pointer to a new type by using Java casts as it is particularly dangerous especially when casting C++ objects. If you need to cast a pointer or change its value, consider writing some helper functions instead. For example:

    %inline %{
    /* C-style cast */
    Bar *FooToBar(Foo *f) {
      return (Bar *) f;
    }
    
    /* C++-style cast */
    Foo *BarToFoo(Bar *b) {
      return dynamic_cast<Foo*>(b);
    }
    
    Foo *IncrFoo(Foo *f, int i) {
      return f+i;
    }
    %}
    

    Also, if working with C++, you should always try to use the new C++ style casts. For example, in the above code, the C-style cast may return a bogus result whereas as the C++-style cast will return a NULL pointer if the conversion can't be performed.

    26.3.7 Structures

    If you wrap a C structure, it is wrapped by a Java class with getters and setters for access to the member variables. For example,

    struct Vector {
      double x, y, z;
    };
    
    

    is used as follows:

    Vector v = new Vector();
    v.setX(3.5);
    v.setY(7.2);
    double x = v.getX();
    double y = v.getY();
    

    The variable setters and getters are also based on the JavaBean design pattern already covered under the Global variables section. Similar access is provided for unions and the public data members of C++ classes.

    This object is actually an instance of a Java class that has been wrapped around a pointer to the C structure. This instance doesn't actually do anything--it just serves as a proxy. The pointer to the C object is held in the Java proxy class in much the same way as pointers are held by type wrapper classes. Further details about Java proxy classes are covered a little later.

    const members of a structure are read-only. Data members can also be forced to be read-only using the %immutable directive. For example:

    struct Foo {
      ...
      %immutable;
      int x;        /* Read-only members */
      char *name;
      %mutable;
      ...
    };
    

    When char * members of a structure are wrapped, the contents are assumed to be dynamically allocated using malloc or new (depending on whether or not SWIG is run with the -c++ option). When the structure member is set, the old contents will be released and a new value created. If this is not the behavior you want, you will have to use a typemap (described later).

    If a structure contains arrays, access to those arrays is managed through pointers. For example, consider this:

    struct Bar {
      int  x[16];
    };
    

    If accessed in Java, you will see behavior like this:

    Bar b = new Bar();
    SWIGTYPE_p_int x = b.getX();
    

    This pointer can be passed around to functions that expect to receive an int * (just like C). You can also set the value of an array member using another pointer. For example:

    Bar b = new Bar();
    SWIGTYPE_p_int x = b.getX();
    Bar c = new Bar();
    c.setX(x);                    // Copy contents of b.x to c.x
    

    For array assignment (setters not getters), SWIG copies the entire contents of the array starting with the data pointed to by b.x. In this example, 16 integers would be copied. Like C, SWIG makes no assumptions about bounds checking---if you pass a bad pointer, you may get a segmentation fault or access violation. The default wrapping makes it hard to set or get just one element of the array and so array access from Java is somewhat limited. This can be changed easily though by using the approach outlined later in the Wrapping C arrays with Java arrays and Unbounded C Arrays sections.

    When a member of a structure is itself a structure, it is handled as a pointer. For example, suppose you have two structures like this:

    struct Foo {
      int a;
    };
    
    struct Bar {
      Foo f;
    };
    

    Now, suppose that you access the f member of Bar like this:

    Bar b = new Bar();
    Foo x = b.getF();
    

    In this case, x is a pointer that points to the Foo that is inside b. This is the same value as generated by this C code:

    Bar b;
    Foo *x = &b->f;       /* Points inside b */
    

    Because the pointer points inside the structure, you can modify the contents and everything works just like you would expect. For example:

    Bar b = new Bar();
    b.getF().setA(3);   // Modify b.f.a
    Foo x = b.getF();                   
    x.setA(3);          // Modify x.a - this is the same as b.f.a
    

    26.3.8 C++ classes

    C++ classes are wrapped by Java classes as well. For example, if you have this class,

    class List {
    public:
      List();
      ~List();
      int  search(char *item);
      void insert(char *item);
      void remove(char *item);
      char *get(int n);
      int  length;
    };
    

    you can use it in Java like this:

    List l = new List();
    l.insert("Ale");
    l.insert("Stout");
    l.insert("Lager");
    String item = l.get(2);
    int length = l.getLength();
    

    Class data members are accessed in the same manner as C structures.

    Static class members are unsurprisingly wrapped as static members of the Java class:

    class Spam {
    public:
      static void foo();
      static int bar;
    };
    

    The static members work like any other Java static member:

    Spam.foo();
    int bar = Spam.getBar();
    

    26.3.9 C++ inheritance

    SWIG is fully aware of issues related to C++ inheritance. Therefore, if you have classes like this

    class Foo {
    ...
    };
    
    class Bar : public Foo {
    ...
    };
    

    those classes are wrapped into a hierarchy of Java classes that reflect the same inheritance structure:

    Bar b = new Bar();
    Class c = b.getClass();
    System.out.println(c.getSuperclass().getName());
    

    will of course display:

    Foo
    

    Furthermore, if you have functions like this

    void spam(Foo *f);
    

    then the Java function spam() accepts instances of Foo or instances of any other proxy classes derived from Foo.

    Note that Java does not support multiple inheritance so any multiple inheritance in the C++ code is not going to work. A warning is given when multiple inheritance is detected and only the first base class is used.

    26.3.10 Pointers, references, arrays and pass by value

    In C++, there are many different ways a function might receive and manipulate objects. For example:

    void spam1(Foo *x);      // Pass by pointer
    void spam2(Foo &x);      // Pass by reference
    void spam3(Foo x);       // Pass by value
    void spam4(Foo x[]);     // Array of objects
    

    In Java, there is no detailed distinction like this--specifically, there are only instances of classes. There are no pointers nor references. Because of this, SWIG unifies all of these types together in the wrapper code. For instance, if you actually had the above functions, it is perfectly legal to do this from Java:

    Foo f = new Foo();  // Create a Foo
    example.spam1(f);   // Ok. Pointer
    example.spam2(f);   // Ok. Reference
    example.spam3(f);   // Ok. Value.
    example.spam4(f);   // Ok. Array (1 element)
    

    Similar behavior occurs for return values. For example, if you had functions like this,

    Foo *spam5();
    Foo &spam6();
    Foo  spam7();
    

    then all three functions will return a pointer to some Foo object. Since the third function (spam7) returns a value, newly allocated memory is used to hold the result and a pointer is returned (Java will release this memory when the returned object's finalizer is run by the garbage collector).

    26.3.10.1 Null pointers

    Working with null pointers is easy. A Java null can be used whenever a method expects a proxy class or typewrapper class. However, it is not possible to pass null to C/C++ functions that take parameters by value or by reference. If you try you will get a NullPointerException.

    example.spam1(null);   // Pointer - ok
    example.spam2(null);   // Reference - NullPointerException
    example.spam3(null);   // Value - NullPointerException
    example.spam4(null);   // Array - ok
    

    For spam1 and spam4 above the Java null gets translated into a NULL pointer for passing to the C/C++ function. The converse also occurs, that is, NULL pointers are translated into null Java objects when returned from a C/C++ function.

    26.3.11 C++ overloaded functions

    C++ overloaded functions, methods, and constructors are mostly supported by SWIG. For example, if you have two functions like this:

    %module example
    
    void foo(int);
    void foo(char *c);
    

    You can use them in Java in a straightforward manner:

    example.foo(3);           // foo(int)
    example.foo("Hello");     // foo(char *c)
    

    Similarly, if you have a class like this,

    class Foo {
    public:
      Foo();
      Foo(const Foo &);
      ...
    };
    

    you can write Java code like this:

    Foo f = new Foo();        // Create a Foo
    Foo g = new Foo(f);       // Copy f
    

    Overloading support is not quite as flexible as in C++. Sometimes there are methods that SWIG cannot disambiguate as there can be more than one C++ type mapping onto a single Java type. For example:

    void spam(int);
    void spam(unsigned short);
    

    Here both int and unsigned short map onto a Java int. Here is another example:

    void foo(Bar *b);
    void foo(Bar &b);
    

    If declarations such as these appear, you will get a warning message like this:

    example.i:12: Warning 515: Overloaded method spam(unsigned short) ignored.
    Method spam(int) at example.i:11 used.
    

    To fix this, you either need to either rename or ignore one of the methods. For example:

    %rename(spam_ushort) spam(unsigned short);
    ...
    void spam(int);    
    void spam(unsigned short);   // Now renamed to spam_ushort
    

    or

    %ignore spam(unsigned short);
    ...
    void spam(int);    
    void spam(unsigned short);   // Ignored
    

    26.3.12 C++ default arguments

    Any function with a default argument is wrapped by generating an additional function for each argument that is defaulted. For example, if we have the following C++:

    %module example
    
    void defaults(double d=10.0, int i=0);
    

    The following methods are generated in the Java module class:

    public class example {
      public static void defaults(double d, int i) { ... }
      public static void defaults(double d) { ... }
      public static void defaults() { ... }
    }
    

    It is as if SWIG had parsed three separate overloaded methods. The same approach is taken for static methods, constructors and member methods.

    Compatibility note: Versions of SWIG prior to SWIG-1.3.23 wrapped these with a single wrapper method and so the default values could not be taken advantage of from Java. Further details on default arguments and how to restore this approach are given in the more general Default arguments section.

    26.3.13 C++ namespaces

    SWIG is aware of named C++ namespaces and they can be mapped to Java packages, however, the default wrapping flattens the namespaces, effectively ignoring them. So by default, the namespace names do not appear in the module nor do namespaces result in a module that is broken up into submodules or packages. For example, if you have a file like this,

    %module example
    
    namespace foo {
      int fact(int n);
      struct Vector {
        double x, y, z;
      };
    };
    

    it works in Java as follows:

    int f = example.fact(3);
    Vector v = new Vector();
    v.setX(3.4);
    double y = v.getY();
    

    If your program has more than one namespace, name conflicts (if any) can be resolved using %rename For example:

    %rename(Bar_spam) Bar::spam;
    
    namespace Foo {
      int spam();
    }
    
    namespace Bar {
      int spam();
    }
    

    If you have more than one namespace and you want to keep their symbols separate, consider wrapping them as separate SWIG modules. Each SWIG module can be placed into a separate package.

    The default behaviour described above can be improved via the nspace feature. Note that it only works for classes, structs, unions and enums declared within a named C++ namespace. When the nspace feature is used, the C++ namespaces are converted into Java packages of the same name. Proxy classes are thus declared within a package and this proxy makes numerous calls to the JNI intermediary class which is declared in the unnamed package by default. As Java does not support types declared in a named package accessing types declared in an unnamed package, the -package commandline option described earlier generally should be used to provide a parent package. So if SWIG is run using the -package com.myco option, a wrapped class, MyWorld::Material::Color, can then be accessed as com.myco.MyWorld.Material.Color. If you don't specify a package, you will get the following warning:

    example.i:16: Warning 826: The nspace feature is used on 'MyWorld::Material::Color' without -package. The generated code 
    may not compile as Java does not support types declared in a named package accessing types declared in an unnamed package.
    

    If it is undesirable to have a single top level package, the nspace feature may be used without the -package commandline option (and the resulting warning ignored) if all of the types exposed using SWIG are placed in a package using the nspace feature and the 'jniclasspackage' pragma is used to specify a package for the JNI intermediary class.

    If the resulting use of the nspace feature and hence packages results in a proxy class in one package deriving or using a proxy class from another package, you will need to open up the visibility for the pointer constructor and getCPtr method from the default 'protected' to 'public' with the SWIG_JAVABODY_PROXY macro. See Java code typemaps.

    26.3.14 C++ templates

    C++ templates don't present a huge problem for SWIG. However, in order to create wrappers, you have to tell SWIG to create wrappers for a particular template instantiation. To do this, you use the %template directive. For example:

    %module example
    %{
    #include <utility>
    %}
    
    template<class T1, class T2>
    struct pair {
      typedef T1 first_type;
      typedef T2 second_type;
      T1 first;
      T2 second;
      pair();
      pair(const T1&, const T2&);
      ~pair();
    };
    
    %template(pairii) pair<int, int>;
    

    In Java:

    pairii p = new pairii(3, 4);
    int first = p.getFirst();
    int second = p.getSecond();
    

    Obviously, there is more to template wrapping than shown in this example. More details can be found in the SWIG and C++ chapter.

    26.3.15 C++ Smart Pointers

    26.3.15.1 The shared_ptr Smart Pointer

    The C++11 standard provides std::shared_ptr which was derived from the Boost implementation, boost::shared_ptr. Both of these are available for Java in the SWIG library and usage is outlined in the shared_ptr smart pointer library section.

    26.3.15.2 Generic Smart Pointers

    In certain C++ programs, it is common to use classes that have been wrapped by so-called "smart pointers." Generally, this involves the use of a template class that implements operator->() like this:

    template<class T> class SmartPtr {
      ...
      T *operator->();
      ...
    }
    

    Then, if you have a class like this,

    class Foo {
    public:
      int x;
      int bar();
    };
    

    A smart pointer would be used in C++ as follows:

    SmartPtr<Foo> p = CreateFoo();   // Created somehow (not shown)
    ...
    p->x = 3;                        // Foo::x
    int y = p->bar();                // Foo::bar
    

    To wrap this in Java, simply tell SWIG about the SmartPtr class and the low-level Foo object. Make sure you instantiate SmartPtr using %template if necessary. For example:

    %module example
    ...
    %template(SmartPtrFoo) SmartPtr<Foo>;
    ...
    

    Now, in Java, everything should just "work":

    SmartPtrFoo p = example.CreateFoo(); // Create a smart-pointer somehow
    p.setX(3);                           // Foo::x
    int y = p.bar();                     // Foo::bar
    

    If you ever need to access the underlying pointer returned by operator->() itself, simply use the __deref__() method. For example:

    Foo f = p.__deref__();               // Returns underlying Foo *
    

    26.4 Further details on the generated Java classes

    In the previous section, a high-level view of Java wrapping was presented. A key component of this wrapping is that structures and classes are wrapped by Java proxy classes and type wrapper classes are used in situations where no proxies are generated. This provides a very natural, type safe Java interface to the C/C++ code and fits in with the Java programming paradigm. However, a number of low-level details were omitted. This section provides a brief overview of how the proxy classes work and then covers the type wrapper classes. Finally enum classes are covered. First, the crucial intermediary JNI class is considered.

    26.4.1 The intermediary JNI class

    In the "SWIG basics" and "SWIG and C++" chapters, details of low-level structure and class wrapping are described. To summarize those chapters, if you have a global function and class like this

    class Foo {
    public:
      int x;
      int spam(int num, Foo* foo);
    };
    void egg(Foo* chips);
    

    then SWIG transforms the class into a set of low-level procedural wrappers. These procedural wrappers essentially perform the equivalent of this C++ code:

    Foo *new_Foo() {
      return new Foo();
    }
    void delete_Foo(Foo *f) {
      delete f;
    }
    int Foo_x_get(Foo *f) {
      return f->x;
    }
    void Foo_x_set(Foo *f, int value) {
      f->x = value;
    }
    int Foo_spam(Foo *f, int num, Foo* foo) {
      return f->spam(num, foo);
    }
    

    These procedural function names don't actually exist, but their functionality appears inside the generated JNI functions. The JNI functions have to follow a particular naming convention so the function names are actually:

    SWIGEXPORT jlong JNICALL Java_exampleJNI_new_1Foo(JNIEnv *jenv, jclass jcls);
    SWIGEXPORT void JNICALL Java_exampleJNI_delete_1Foo(JNIEnv *jenv, jclass jcls,
                                                        jlong jarg1);
    SWIGEXPORT void JNICALL Java_exampleJNI_Foo_1x_1set(JNIEnv *jenv, jclass jcls,
                                                        jlong jarg1, jobject jarg1_, jint jarg2);
    SWIGEXPORT jint JNICALL Java_exampleJNI_Foo_1x_1get(JNIEnv *jenv, jclass jcls,
                                                        jlong jarg1, jobject jarg1_);
    SWIGEXPORT jint JNICALL Java_exampleJNI_Foo_1spam(JNIEnv *jenv, jclass jcls,
                                                      jlong jarg1, jobject jarg1_, jint jarg2,
                                                      jlong jarg3, jobject jarg3_);
    SWIGEXPORT void JNICALL Java_exampleJNI_egg(JNIEnv *jenv, jclass jcls,
                                                jlong jarg1, jobject jarg1_);
    

    For every JNI C function there has to be a static native Java function. These appear in the intermediary JNI class:

    class exampleJNI {
      public final static native long new_Foo();
      public final static native void delete_Foo(long jarg1);
      public final static native void Foo_x_set(long jarg1, Foo jarg1_, int jarg2);
      public final static native int Foo_x_get(long jarg1, Foo jarg1_);
      public final static native int Foo_spam(long jarg1, Foo jarg1_, int jarg2,
                                              long jarg3, Foo jarg3_);
      public final static native void egg(long jarg1, Foo jarg1_);
    }
    

    This class contains the complete Java - C/C++ interface so all function calls go via this class. As this class acts as a go-between for all JNI calls to C/C++ code from the Java proxy classes, type wrapper classes and module class, it is known as the intermediary JNI class.

    You may notice that SWIG uses a Java long wherever a pointer or class object needs to be marshalled across the Java-C/C++ boundary. This approach leads to minimal JNI code which makes for better performance as JNI code involves a lot of string manipulation. SWIG favours generating Java code over JNI code as Java code is compiled into byte code and avoids the costly string operations needed in JNI code. This approach has a downside though as the proxy class might get collected before the native method has completed. You might notice above that there is an additional parameters with a underscore postfix, eg jarg1_. These are added in order to prevent premature garbage collection when marshalling proxy classes.

    The functions in the intermediary JNI class cannot be accessed outside of its package. Access to them is gained through the module class for globals otherwise the appropriate proxy class.

    The name of the intermediary JNI class can be changed from its default, that is, the module name with JNI appended after it. The module directive attribute jniclassname is used to achieve this:

    %module (jniclassname="name") modulename
    

    If name is the same as modulename then the module class name gets changed from modulename to modulenameModule.

    26.4.1.1 The intermediary JNI class pragmas

    The intermediary JNI class can be tailored through the use of pragmas, but is not commonly done. The pragmas for this class are:

    Pragma Description
    jniclassbase Base class for the intermediary JNI class
    jniclasspackage Package in which to place the intermediary JNI class
    jniclassclassmodifiers Class modifiers and class type for the intermediary JNI class
    jniclasscode Java code is copied verbatim into the intermediary JNI class
    jniclassimports Java code, usually one or more import statements, placed before the intermediary JNI class definition
    jniclassinterfaces Comma separated interface classes for the intermediary JNI class

    The pragma code appears in the generated intermediary JNI class where you would expect:

    [ jniclassimports pragma ]
    [ jniclassclassmodifiers pragma ] jniclassname extends [ jniclassbase pragma ]
                                              implements [ jniclassinterfaces pragma ] {
    [ jniclasscode pragma ]
    ... SWIG generated native methods ...
    }
    

    The jniclasscode pragma is quite useful for adding in a static block for loading the shared library / dynamic link library and demonstrates how pragmas work:

    %pragma(java) jniclasscode=%{
      static {
        try {
          System.loadLibrary("example");
        } catch (UnsatisfiedLinkError e) {
          System.err.println("Native code library failed to load. \n" + e);
          System.exit(1);
        }
      }
    %}
    

    Pragmas will take either "" or %{ %} as delimiters. For example, let's change the intermediary JNI class access to just the default package-private access.

    %pragma(java) jniclassclassmodifiers="class"
    

    All the methods in the intermediary JNI class will then not be callable outside of the package as the method modifiers have been changed from public access to default access. This is useful if you want to prevent users calling these low level functions.

    26.4.2 The Java module class

    All global functions and variable getters/setters appear in the module class. For our example, there is just one function:

    public class example {
      public static void egg(Foo chips) {
        exampleJNI.egg(Foo.getCPtr(chips), chips);
      }
    }
    

    The module class is necessary as there is no such thing as a global in Java so all the C globals are put into this class. They are generated as static functions and so must be accessed as such by using the module name in the static function call:

    example.egg(new Foo());
    

    The primary reason for having the module class wrapping the calls in the intermediary JNI class is to implement static type checking. In this case only a Foo can be passed to the egg function, whereas any long can be passed to the egg function in the intermediary JNI class.

    26.4.2.1 The Java module class pragmas

    The module class can be tailored through the use of pragmas, in the same manner as the intermediary JNI class. The pragmas are similarly named and are used in the same way. The complete list follows:

    Pragma Description
    modulebase Base class for the module class
    moduleclassmodifiers Class modifiers and class type for the module class
    modulecode Java code is copied verbatim into the module class
    moduleimports Java code, usually one or more import statements, placed before the module class definition
    moduleinterfaces Comma separated interface classes for the module class

    The pragma code appears in the generated module class like this:

    [ moduleimports pragma ]
    [ modulemodifiers pragma ] modulename extends [ modulebase pragma ]
                                          implements [ moduleinterfaces pragma ] {
    [ modulecode pragma ]
    ... SWIG generated wrapper functions ...
    }
    

    See The intermediary JNI class pragmas section for further details on using pragmas.

    26.4.3 Java proxy classes

    A Java proxy class is generated for each structure, union or C++ class that is wrapped. Proxy classes have also been called peer classes. The default proxy class for our previous example looks like this:

    public class Foo {
      private transient long swigCPtr;
      protected transient boolean swigCMemOwn;
    
      protected Foo(long cPtr, boolean cMemoryOwn) {
        swigCMemOwn = cMemoryOwn;
        swigCPtr = cPtr;
      }
    
      protected static long getCPtr(Foo obj) {
        return (obj == null) ? 0 : obj.swigCPtr;
      }
    
      protected void finalize() {
        delete();
      }
    
      public synchronized void delete() {
        if(swigCPtr != 0 && swigCMemOwn) {
          swigCMemOwn = false;
          exampleJNI.delete_Foo(swigCPtr);
        }
        swigCPtr = 0;
      }
    
      public void setX(int value) {
        exampleJNI.Foo_x_set(swigCPtr, this, value);
      }
    
      public int getX() {
        return exampleJNI.Foo_x_get(swigCPtr, this);
      }
    
      public int spam(int num, Foo foo) {
        return exampleJNI.Foo_spam(swigCPtr, this, num, Foo.getCPtr(foo), foo);
      }
    
      public Foo() {
        this(exampleJNI.new_Foo(), true);
      }
    
    }
    

    This class merely holds a pointer to the underlying C++ object (swigCPtr). It also contains all the methods in the C++ class it is proxying plus getters and setters for public member variables. These functions call the native methods in the intermediary JNI class. The advantage of having this extra layer is the type safety that the proxy class functions offer. It adds static type checking which leads to fewer surprises at runtime. For example, you can see that if you attempt to use the spam() function it will only compile when the parameters passed are an int and a Foo. From a user's point of view, it makes the class work as if it were a Java class:

    Foo f = new Foo();
    f.setX(3);
    int y = f.spam(5, new Foo());
    

    26.4.3.1 Memory management

    Each proxy class has an ownership flag swigCMemOwn. The value of this flag determines who is responsible for deleting the underlying C++ object. If set to true, the proxy class's finalizer will destroy the C++ object when the proxy class is garbage collected. If set to false, then the destruction of the proxy class has no effect on the C++ object.

    When an object is created by a constructor or returned by value, Java automatically takes ownership of the result. On the other hand, when pointers or references are returned to Java, there is often no way to know where they came from. Therefore, the ownership is set to false. For example:

    class Foo {
    public:
      Foo();
      Foo bar1();
      Foo &bar2();
      Foo *bar2();
    };
    

    In Java:

    Foo f = new Foo();   //  f.swigCMemOwn = true
    Foo f1 = f.bar1();   // f1.swigCMemOwn = true
    Foo f2 = f.bar2();   // f2.swigCMemOwn = false
    Foo f3 = f.bar3();   // f3.swigCMemOwn = false
    

    This behavior for pointers and references is especially important for classes that act as containers. For example, if a method returns a pointer to an object that is contained inside another object, you definitely don't want Java to assume ownership and destroy it!

    For the most part, memory management issues remain hidden. However, there are situations where you might have to manually change the ownership of an object. For instance, consider code like this:

    class Obj {};
    class Node {
      Obj *value;
    public:
      void set_value(Obj *v) { value = v; }
    };
    

    Now, consider the following Java code:

    Node n = new Node();    // Create a node
    {
      Obj o = new Obj();    // Create an object
      n.set_value(o);       // Set value
    }                       // o goes out of scope
    

    In this case, the Node n is holding a reference to o internally. However, SWIG has no way to know that this has occurred. The Java proxy class still thinks that it has ownership of o. As o has gone out of scope, it could be garbage collected in which case the C++ destructor will be invoked and n will then be holding a stale-pointer to o. If you're lucky, you will only get a segmentation fault.

    To work around this, the ownership flag of o needs changing to false. The ownership flag is a private member variable of the proxy class so this is not possible without some customization of the proxy class. This can be achieved by using a typemap to customise the proxy class with pure Java code as detailed later in the section on Java typemaps.

    Sometimes a function will create memory and return a pointer to a newly allocated object. SWIG has no way of knowing this so by default the proxy class does not manage the returned object. However, you can tell the proxy class to manage the memory if you specify the %newobject directive. Consider:

    class Obj {...};
    class Factory {
    public:
      static Obj *createObj() { return new Obj(); }
    };
    

    If we call the factory function, then we have to manually delete the memory:

    Obj obj = Factory.createObj();   // obj.swigCMemOwn = false
    ...
    obj.delete();
    

    Now add in the %newobject directive:

    %newobject Factory::createObj();
    
    class Obj {...};
    class Factory {
    public:
      static Obj *createObj() { return new Obj(); }
    };
    

    A call to delete() is no longer necessary as the garbage collector will make the C++ destructor call because swigCMemOwn is now true.

    Obj obj = Factory.createObj();   // obj.swigCMemOwn = true;
    ...
    

    Some memory management issues are quite tricky to fix and may only be noticeable after using for a long time. One such issue is premature garbage collection of an object created from Java and resultant usage from C++ code. The section on typemap examples cover two such scenarios, Memory management for objects passed to the C++ layer and Memory management when returning references to member variables

    26.4.3.2 Inheritance

    Java proxy classes will mirror C++ inheritance chains. For example, given the base class Base and its derived class Derived:

    class Base {
    public:
      virtual double foo();
    };
    
    class Derived : public Base {
    public:
      virtual double foo();
    };
    

    The base class is generated much like any other proxy class seen so far:

    public class Base {
      private transient long swigCPtr;
      protected transient boolean swigCMemOwn;
    
      protected Base(long cPtr, boolean cMemoryOwn) {
        swigCMemOwn = cMemoryOwn;
        swigCPtr = cPtr;
      }
    
      protected static long getCPtr(Base obj) {
        return (obj == null) ? 0 : obj.swigCPtr;
      }
    
      protected void finalize() {
        delete();
      }
    
      public synchronized void delete() {
        if(swigCPtr != 0 && swigCMemOwn) {
          swigCMemOwn = false;
          exampleJNI.delete_Base(swigCPtr);
        }
        swigCPtr = 0;
      }
    
      public double foo() {
        return exampleJNI.Base_foo(swigCPtr, this);
      }
    
      public Base() {
        this(exampleJNI.new_Base(), true);
      }
    
    }
    

    The Derived class extends Base mirroring the C++ class inheritance hierarchy.

    public class Derived extends Base {
      private transient long swigCPtr;
    
      protected Derived(long cPtr, boolean cMemoryOwn) {
        super(exampleJNI.SWIGDerivedUpcast(cPtr), cMemoryOwn);
        swigCPtr = cPtr;
      }
    
      protected static long getCPtr(Derived obj) {
        return (obj == null) ? 0 : obj.swigCPtr;
      }
    
      protected void finalize() {
        delete();
      }
    
      public synchronized void delete() {
        if(swigCPtr != 0 && swigCMemOwn) {
          swigCMemOwn = false;
          exampleJNI.delete_Derived(swigCPtr);
        }
        swigCPtr = 0;
        super.delete();
      }
    
      public double foo() {
        return exampleJNI.Derived_foo(swigCPtr, this);
      }
    
      public Derived() {
        this(exampleJNI.new_Derived(), true);
      }
    
    }
    

    Note the memory ownership is controlled by the base class. However each class in the inheritance hierarchy has its own pointer value which is obtained during construction. The SWIGDerivedUpcast() call converts the pointer from a Derived * to a Base *. This is a necessity as C++ compilers are free to implement pointers in the inheritance hierarchy with different values.

    It is of course possible to extend Base using your own Java classes. If Derived is provided by the C++ code, you could for example add in a pure Java class Extended derived from Base. There is a caveat and that is any C++ code will not know about your pure Java class Extended so this type of derivation is restricted. However, true cross language polymorphism can be achieved using the directors feature.

    26.4.3.3 Proxy classes and garbage collection

    By default each proxy class has a delete() and a finalize() method. The finalize() method calls delete() which frees any malloc'd memory for wrapped C structs or calls the C++ class destructors. The idea is for delete() to be called when you have finished with the C/C++ object. Ideally you need not call delete(), but rather leave it to the garbage collector to call it from the finalizer. When a program exits, the garbage collector does not guarantee to call all finalizers. An insight into the reasoning behind this can be obtained from Hans Boehm's Destructors, Finalizers, and Synchronization paper. Depending on what the finalizers do and which operating system you use, this may or may not be a problem.

    If the delete() call into JNI code is just for memory handling, there is not a problem when run on most operating systems, for example Windows and Unix. Say your JNI code creates memory on the heap which your finalizers should clean up, the finalizers may or may not be called before the program exits. In Windows and Unix all memory that a process uses is returned to the system on exit, so this isn't a problem. This is not the case in some operating systems like vxWorks. If however, your finalizer calls into JNI code invoking the C++ destructor which in turn releases a TCP/IP socket for example, there is no guarantee that it will be released. Note that with long running programs the garbage collector will eventually run, thereby calling any unreferenced object's finalizers.

    Some not so ideal solutions are:

    1. Call the System.runFinalizersOnExit(true) or Runtime.getRuntime().runFinalizersOnExit(true) to ensure the finalizers are called before the program exits. The catch is that this is a deprecated function call as the documentation says:

      This method is inherently unsafe. It may result in finalizers being called on live objects while other threads are concurrently manipulating those objects, resulting in erratic behavior or deadlock.

      In many cases you will be lucky and find that it works, but it is not to be advocated. Have a look at Java web site and search for runFinalizersOnExit.

    2. From jdk1.3 onwards a new function, addShutdownHook(), was introduced which is guaranteed to be called when your program exits. You can encourage the garbage collector to call the finalizers, for example, add this static block to the class that has the main() function:

        static {
          Runtime.getRuntime().addShutdownHook( 
            new Thread() {
              public void run() { System.gc(); System.runFinalization(); }
            }
          );
        }
      

      Although this usually works, the documentation doesn't guarantee that runFinalization() will actually call the finalizers. As the shutdown hook is guaranteed you could also make a JNI call to clean up any resources that are being tracked by the C/C++ code.

    3. Call the delete() function manually which will immediately invoke the C++ destructor. As a suggestion it may be a good idea to set the object to null so that should the object be inadvertently used again a Java null pointer exception is thrown, the alternative would crash the JVM by using a null C pointer. For example given a SWIG generated class A:

      A myA = new A();
      // use myA ...
      myA.delete();
      // any use of myA here would crash the JVM 
      myA=null;
      // any use of myA here would cause a Java null pointer exception to be thrown
      

      The SWIG generated code ensures that the memory is not deleted twice, in the event the finalizers get called in addition to the manual delete() call.

    4. Write your own object manager in Java. You could derive all SWIG classes from a single base class which could track which objects have had their finalizers run, then call the rest of them on program termination. The section on Java typemaps details how to specify a pure Java base class.

    See the How to Handle Java Finalization's Memory-Retention Issues article for alternative approaches to managing memory by avoiding finalizers altogether.

    26.4.3.4 The premature garbage collection prevention parameter for proxy class marshalling

    As covered earlier, the C/C++ struct/class pointer is stored in the proxy class as a Java long and when needed is passed into the native method where it is cast into the appropriate type. This approach provides very fast marshalling but could be susceptible to premature garbage collection. Consider the following C++ code:

    class Wibble {
    };
    void wobble(Wibble &w);
    

    The module class contains the Java wrapper for the global wobble method:

    public class example {
      ...
      public static void wobble(Wibble w) {
        exampleJNI.wobble(Wibble.getCPtr(w), w);
      }
    }
    

    where example is the name of the module. All native methods go through the intermediary class which has the native method declared as such:

    public class exampleJNI {
      ...
      public final static native void wobble(long jarg1, Wibble jarg1_);
    }
    

    The second parameter, jarg1_, is the premature garbage collection prevention parameter and is added to the native method parameter list whenever a C/C++ struct or class is marshalled as a Java long. In order to understand why, consider the alternative where the intermediary class method is declared without the additional parameter:

    public class exampleJNI {
      ...
      public final static native void wobble(long jarg1);
    }
    

    and the following simple call to wobble:

    {
      Wibble w = new Wibble();
      example.wobble(w);
    }
    

    The hotspot compiler effectively sees something like:

    {
      Wibble w = new Wibble();
      long w_ptr = Wibble.getCPtr(w);
      // w is no longer reachable
      exampleJNI.wobble(w_ptr);
    }
    

    The Wibble object is no longer reachable after the point shown as in this bit of code, the Wibble object is not referenced again after this point. This means that it is a candidate for garbage collection. Should wobble be a long running method, it is quite likely that the finalizer for the Wibble instance will be called. This in turn will call its underlying C++ destructor which is obviously disastrous while the method wobble is running using this object. Even if wobble is not a long running method, it is possible for the Wibble instance to be finalized. By passing the Wibble instance into the native method, it will not be finalized as the JVM guarantees not to finalize any objects until the native method returns. Effectively, the code then becomes

    {
      Wibble w = new Wibble();
      long w_ptr = Wibble.getCPtr(w);
      exampleJNI.wobble(w_ptr, w);
      // w is no longer reachable
    }
    

    and therefore there is no possibility of premature garbage collection. In practice, this premature garbage collection was only ever observed in Sun's server JVM from jdk-1.3 onwards and in Sun's client JVM from jdk-1.6 onwards.

    The premature garbage collection prevention parameter for proxy classes is generated by default whenever proxy classes are passed by value, reference or with a pointer. The implementation for this extra parameter generation requires the "jtype" typemap to contain long and the "jstype" typemap to contain the name of a proxy class.

    The additional parameter does impose a slight performance overhead and the parameter generation can be suppressed globally with the -nopgcpp commandline option. More selective suppression is possible with the 'nopgcpp' attribute in the "jtype" Java typemap. The attribute is a flag and so should be set to "1" to enable the suppression, or it can be omitted or set to "0" to disable. For example:

    %typemap(jtype, nopgcpp="1") Wibble & "long"
    

    Compatibility note: The generation of this additional parameter did not occur in versions prior to SWIG-1.3.30.

    26.4.3.5 Single threaded applications and thread safety

    Single threaded Java applications using JNI need to consider thread safety. The same applies for the C# module where the .NET wrappers use PInvoke. Consider the C++ class:

    class Test {
      string str;
    public:
      Test() : str("initial") {}
    };
    

    and the Java proxy class generated by SWIG:

    public class Test {
      private transient long swigCPtr;
      protected transient boolean swigCMemOwn;
    
      protected Test(long cPtr, boolean cMemoryOwn) {
        swigCMemOwn = cMemoryOwn;
        swigCPtr = cPtr;
      }
    
      protected static long getCPtr(Test obj) {
        return (obj == null) ? 0 : obj.swigCPtr;
      }
    
      protected void finalize() {
        delete();
      }
    
      // Call C++ destructor
      public synchronized void delete() {
        if(swigCPtr != 0 && swigCMemOwn) {
          swigCMemOwn = false;
          exampleJNI.delete_Test(swigCPtr);
        }
        swigCPtr = 0;
      }
    
      // Call C++ constructor
      public Test() {
        this(exampleJNI.new_Test(), true);
      }
    
    }
    

    It has two methods that call JNI methods, namely, exampleJNI.new_Test() for the C++ constructor and exampleJNI.delete_Test() for the C++ destructor. If the garbage collector collects an instance of this class, ie delete() is not explicitly called, then the C++ destructor will be run in a different thread to the main thread. This is because when an object is marked for garbage collection, any objects with finalizers are added to a finalization queue and the objects in the finalization queue have their finalize() methods run in a separate finalization thread. Therefore, if the C memory allocator is not thread safe, then the heap will get corrupted sooner or later, when a concurrent C++ delete and new are executed. It is thus essential, even in single threaded usage, to link to the C multi-thread runtime libraries, for example, use the /MD option for Visual C++ on Windows. Alternatively, lock all access to C++ functions that have heap allocation/deallocation.

    Note that some of the STL in Visual C++ 6 is not thread safe, so although code might be linked to the multithread runtime libraries, undefined behaviour might still occur in a single threaded Java program. Similarly some older versions of Sun Studio have bugs in the multi-threaded implementation of the std::string class and so will lead to undefined behaviour in these supposedly single threaded Java applications.

    The following innocuous Java usage of Test is an example that will crash very quickly on a multiprocessor machine if the JNI compiled code is linked against the single thread C runtime libraries.

    for (int i=0; i<100000; i++) {
      System.out.println("Iteration " + i);
      for (int k=0; k<10; k++) {
        Test test = new Test();
      }
      System.gc();
    }
    

    26.4.4 Type wrapper classes

    The generated type wrapper class, for say an int *, looks like this:

    public class SWIGTYPE_p_int {
      private transient long swigCPtr;
    
      protected SWIGTYPE_p_int(long cPtr, boolean bFutureUse) {
        swigCPtr = cPtr;
      }
    
      protected SWIGTYPE_p_int() {
        swigCPtr = 0;
      }
    
      protected static long getCPtr(SWIGTYPE_p_int obj) {
        return obj.swigCPtr;
      }
    }
    

    The methods do not have public access, so by default it is impossible to do anything with objects of this class other than pass them around. The methods in the class are part of the inner workings of SWIG. If you need to mess around with pointers you will have to use some typemaps specific to the Java module to achieve this. The section on Java typemaps details how to modify the generated code.

    Note that if you use a pointer or reference to a proxy class in a function then no type wrapper class is generated because the proxy class can be used as the function parameter. If however, you need anything more complicated like a pointer to a pointer to a proxy class then a typewrapper class is generated for your use.

    Note that SWIG generates a type wrapper class and not a proxy class when it has not parsed the definition of a type that gets used. For example, say SWIG has not parsed the definition of class Snazzy because it is in a header file that you may have forgotten to use the %include directive on. Should SWIG parse Snazzy * being used in a function parameter, it will then generates a type wrapper class around a Snazzy pointer. Also recall from earlier that SWIG will use a pointer when a class is passed by value or by reference:

    void spam(Snazzy *x, Snazzy &y, Snazzy z);
    

    Should SWIG not know anything about Snazzy then a SWIGTYPE_p_Snazzy must be used for all 3 parameters in the spam function. The Java function generated is:

    public static void spam(SWIGTYPE_p_Snazzy x, SWIGTYPE_p_Snazzy y, SWIGTYPE_p_Snazzy z) {
     ...
    }
    

    Note that typedefs are tracked by SWIG and the typedef name is used to construct the type wrapper class name. For example, consider the case where Snazzy is a typedef to an int which SWIG does parse:

    typedef int Snazzy;
    void spam(Snazzy *x, Snazzy &y, Snazzy z);
    

    Because the typedefs have been tracked the Java function generated is:

    public static void spam(SWIGTYPE_p_int x, SWIGTYPE_p_int y, int z) { ... }
    

    26.4.5 Enum classes

    SWIG can generate three types of enum classes. The Enumerations section discussed these but omitted all the details. The following sub-sections detail the various types of enum classes that can be generated.

    26.4.5.1 Typesafe enum classes

    The following example demonstrates the typesafe enum classes which SWIG generates:

    %include "enumtypesafe.swg"
    %javaconst(1);
    enum Beverage { ALE, LAGER=10, STOUT, PILSNER, PILZ=PILSNER };
    

    The following is the code that SWIG generates:

    public final class Beverage {
      public final static Beverage ALE = new Beverage("ALE");
      public final static Beverage LAGER = new Beverage("LAGER", 10);
      public final static Beverage STOUT = new Beverage("STOUT");
      public final static Beverage PILSNER = new Beverage("PILSNER");
      public final static Beverage PILZ = new Beverage("PILZ", PILSNER);
    
      public final int swigValue() {
        return swigValue;
      }
    
      public String toString() {
        return swigName;
      }
    
      public static Beverage swigToEnum(int swigValue) {
        if (swigValue < swigValues.length && swigValue >= 0 &&
            swigValues[swigValue].swigValue == swigValue)
          return swigValues[swigValue];
        for (int i = 0; i < swigValues.length; i++)
          if (swigValues[i].swigValue == swigValue)
            return swigValues[i];
        throw new IllegalArgumentException("No enum " + Beverage.class + " with value " +
                                                                             swigValue);
      }
    
      private Beverage(String swigName) {
        this.swigName = swigName;
        this.swigValue = swigNext++;
      }
    
      private Beverage(String swigName, int swigValue) {
        this.swigName = swigName;
        this.swigValue = swigValue;
        swigNext = swigValue+1;
      }
    
      private Beverage(String swigName, Beverage swigEnum) {
        this.swigName = swigName;
        this.swigValue = swigEnum.swigValue;
        swigNext = this.swigValue+1;
      }
    
      private static Beverage[] swigValues = { ALE, LAGER, STOUT, PILSNER, PILZ };
      private static int swigNext = 0;
      private final int swigValue;
      private final String swigName;
    }
    

    As can be seen, there are a fair number of support methods for the typesafe enum pattern. The typesafe enum pattern involves creating a fixed number of static instances of the enum class. The constructors are private to enforce this. Three constructors are available - two for C/C++ enums with an initializer and one for those without an initializer. Note that the two enums with initializers, LAGER and PILZ, each call one the two different initializer constructors. In order to use one of these typesafe enums, the swigToEnum static method must be called to return a reference to one of the static instances. The JNI layer returns the enum value from the C/C++ world as an integer and this method is used to find the appropriate Java enum static instance. The swigValue method is used for marshalling in the other direction. The toString method is overridden so that the enum name is available.

    26.4.5.2 Proper Java enum classes

    The following example demonstrates the Java enums approach:

    %include "enums.swg"
    %javaconst(1);
    enum Beverage { ALE, LAGER=10, STOUT, PILSNER, PILZ=PILSNER };
    

    SWIG will generate the following Java enum:

    public enum Beverage {
      ALE,
      LAGER(10),
      STOUT,
      PILSNER,
      PILZ(PILSNER);
    
      public final int swigValue() {
        return swigValue;
      }
    
      public static Beverage swigToEnum(int swigValue) {
        Beverage[] swigValues = Beverage.class.getEnumConstants();
        if (swigValue < swigValues.length && swigValue >= 0 &&
            swigValues[swigValue].swigValue == swigValue)
          return swigValues[swigValue];
        for (Beverage swigEnum : swigValues)
          if (swigEnum.swigValue == swigValue)
            return swigEnum;
        throw new IllegalArgumentException("No enum " + Beverage.class +
                                           " with value " + swigValue);
      }
    
      private Beverage() {
        this.swigValue = SwigNext.next++;
      }
    
      private Beverage(int swigValue) {
        this.swigValue = swigValue;
        SwigNext.next = swigValue+1;
      }
    
      private Beverage(Beverage swigEnum) {
        this.swigValue = swigEnum.swigValue;
        SwigNext.next = this.swigValue+1;
      }
    
      private final int swigValue;
    
      private static class SwigNext {
        private static int next = 0;
      }
    }
    

    The enum items appear first. Like the typesafe enum pattern, the constructors are private. The constructors are required to handle C/C++ enums with initializers. The next variable is in the SwigNext inner class rather than in the enum class as static primitive variables cannot be modified from within enum constructors. Marshalling between Java enums and the C/C++ enum integer value is handled via the swigToEnum and swigValue methods. All the constructors and methods in the Java enum are required just to handle C/C++ enums with initializers. These needn't be generated if the enum being wrapped does not have any initializers and the Simpler Java enums for enums without initializers section describes how typemaps can be used to achieve this.

    26.4.5.3 Type unsafe enum classes

    The following example demonstrates type unsafe enums:

    %include "enumtypeunsafe.swg"
    %javaconst(1);
    enum Beverage { ALE, LAGER=10, STOUT, PILSNER, PILZ=PILSNER };
    

    SWIG will generate the following simple class:

    public final class Beverage {
      public final static int ALE = 0;
      public final static int LAGER = 10;
      public final static int STOUT = LAGER + 1;
      public final static int PILSNER = STOUT + 1;
      public final static int PILZ = PILSNER;
    }
    

    26.4.6 Interfaces

    By default SWIG wraps all C++ classes as Java classes. As Java only supports derivation from a single base class, SWIG has to ignore all bases except the first when a C++ class inherits from more than one base class. However, there is a family of SWIG macros that change the default wrapping and allows a C++ class to be wrapped as a Java interface instead of a Java class. These macros provide a way to support some sort of multiple inheritance as there is no limit to the number of interfaces that a Java class can inherit from.

    When a C++ class is wrapped as a Java interface, a Java proxy class is still needed. The swiginterface.i library file provides three macros for marking a C++ class to be wrapped as a Java interface. There is more than one macro in order to provide a choice for choosing the Java interface and Java proxy names.

    Interface Macro Name Description
    %interface(CTYPE) For C++ class CTYPE, proxy class name is unchanged without any suffix added, interface name has SwigInterface added as a suffix.
    %interface_impl(CTYPE) For C++ class CTYPE, proxy class name has SwigImpl added as a suffix, interface name has no added suffix.
    %interface_custom("PROXY", "INTERFACE", CTYPE) For C++ class CTYPE, proxy class name is given by the string PROXY, interface name is given by the string INTERFACE. The PROXY and INTERFACE names can use the string formatting functions used in %rename.

    The table below has a few examples showing the resulting proxy and interface names for a C++ class called Base.

    Example Usage Proxy Class Name Interface Class Name
    %interface(Base) Base BaseSwigInterface
    %interface_impl(Base) BaseSwigImpl Base
    %interface_custom("BaseProxy", "IBase", Base) BaseProxy IBase
    %interface_custom("%sProxy", "IBase", Base) BaseProxy IBase
    %interface_custom("%sProxy", "%sInterface", Base) BaseProxy BaseProxyInterface
    %interface_custom("%sProxy", "%(rstrip:[Proxy])sInterface", Base) BaseProxy BaseInterface

    The 2nd last example shows the names used in the string formatting functions. The input for PROXY that "%s" expands to is the proxy name, that is, Base. The input for INTERFACE that "%s" expands to is the proxy name, that is, BaseProxy.

    The last example shows rstrip and in this case strips the Proxy suffix and then adds on Interface.

    Consider the following C++ code:

    namespace Space {
      struct Base1 {
        virtual void Method1();
      };
      struct Base2 {
        virtual void Method2();
      };
      struct Derived : Base1, Base2 {
      };
      void UseBases(const Base1 &b1, const Base2 &b2);
    }
    

    By default all classes are wrapped and are available in Java, but, Derived has all bases ignored except the first. SWIG generates a warning for the above code:

    example.i:10: Warning 813: Warning for Derived, base Base2 ignored. 
    Multiple inheritance is not supported in Java.
    

    If we decide to wrap the two base classes as interfaces and add the following before SWIG parses the above example code:

    %include <swiginterface.i>
    %interface_impl(Space::Base1);
    %interface_impl(Space::Base2);
    

    then two interface files are generated, Base1.java and Base2.java in addition to proxy class files, Base1SwigImpl.java and Base2SwigImpl.java. The contents of interface file Base1.java for Base1 is shown below:

    public interface Base1 {
      long Base1_GetInterfaceCPtr();
      void Method1();
    }
    

    The proxy class in Base1SwigImpl.java for Base1 is as it would have been if %interface was not used, except the name has changed to Base1SwigImpl and it implements the appropriate base:

    public class Base1SwigImpl implements Base1 {
    ...
      public long Base1_GetInterfaceCPtr() {
        return exampleJNI.Base1SwigImpl_Base1_GetInterfaceCPtr(swigCPtr);
      }
    
      public void Method1() {
        exampleJNI.Base1SwigImpl_Method1(swigCPtr, this);
      }
    ...
    }
    

    In fact any class deriving from Base will now implement the interface instead of deriving from it (or ignoring the base in the case of multiple base classes). Hence the Derived proxy class will now implement both bases:

    public class Derived implements Base1, Base2 {
    ...
      public long Base1_GetInterfaceCPtr() {
        return exampleJNI.Derived_Base1_GetInterfaceCPtr(swigCPtr);
      }
    
      public long Base2_GetInterfaceCPtr() {
        return exampleJNI.Derived_Base2_GetInterfaceCPtr(swigCPtr);
      }
    
      public void Method1() {
        exampleJNI.Derived_Method1(swigCPtr, this);
      }
    
      public void Method2() {
        exampleJNI.Derived_Method2(swigCPtr, this);
      }
    ...
    }
    

    Wherever a class marked as an interface is used, such as the UseBases method in the example, the interface name is used as the type in the Java layer:

      public static void UseBases(Base1 b1, Base2 b2) {
        exampleJNI.UseBases(b1.Base1_GetInterfaceCPtr(), b1, b2.Base2_GetInterfaceCPtr(), b2);
      }
    

    Note that each Java interface has a method added to obtain the correct C++ pointer for passing to the native function - Base1_GetInterfaceCPtr for Base1. This method is similar to the getCPtr method in the proxy classes. In fact, as shown above in the Derived class, the proxy classes implement this generated interface by calling a native method (Derived_Base1_GetInterfaceCPtr) which calls an appropriate C++ cast of the pointer up the inheritance chain.

    The interface macros are implemented using the interface feature and typemaps. For example:

    %define %interface(CTYPE...)
    %feature("interface", name="%sSwigInterface") CTYPE;
    INTERFACE_TYPEMAPS(CTYPE)
    %enddef
    

    The feature accepts one attribute called name, which is the name of the Java interface mentioned earlier. The INTERFACE_TYPEMAPS macro implements the typemaps and can be viewed in the swiginterface.i file and contain the usual Java typemaps for generating code plus the javainterfacecode typemap which is only used when a class is marked with the interface feature. See Java code typemaps for details.

    26.5 Cross language polymorphism using directors

    Proxy classes provide a natural, object-oriented way to wrap C++ classes. as described earlier, each proxy instance has an associated C++ instance, and method calls from Java to the proxy are passed to the C++ instance transparently via C wrapper functions.

    This arrangement is asymmetric in the sense that no corresponding mechanism exists to pass method calls down the inheritance chain from C++ to Java. In particular, if a C++ class has been extended in Java (by deriving from the proxy class), these classes will not be visible from C++ code. Virtual method calls from C++ are thus not able to access the lowest implementation in the inheritance chain.

    SWIG can address this problem and make the relationship between C++ classes and proxy classes more symmetric. To achieve this goal, new classes called directors are introduced at the bottom of the C++ inheritance chain. The job of the directors is to route method calls correctly, either to C++ implementations higher in the inheritance chain or to Java implementations lower in the inheritance chain. The upshot is that C++ classes can be extended in Java and from C++ these extensions look exactly like native C++ classes. Neither C++ code nor Java code needs to know where a particular method is implemented: the combination of proxy classes, director classes, and C wrapper functions transparently takes care of all the cross-language method routing.

    26.5.1 Enabling directors

    The director feature is disabled by default. To use directors you must make two changes to the interface file. First, add the "directors" option to the %module directive, like this:

    %module(directors="1") modulename
    

    Without this option no director code will be generated. Second, you must use the %feature("director") directive to tell SWIG which classes and methods should get directors. The %feature directive can be applied globally, to specific classes, and to specific methods, like this:

    // generate directors for all classes that have virtual methods
    %feature("director");         
    
    // generate directors for the virtual methods in class Foo
    %feature("director") Foo;      
    

    You can use the %feature("nodirector") directive to turn off directors for specific classes or methods. So for example,

    %feature("director") Foo;
    %feature("nodirector") Foo::bar;
    

    will generate directors for the virtual methods of class Foo except bar().

    Directors can also be generated implicitly through inheritance. In the following, class Bar will get a director class that handles the methods one() and two() (but not three()):

    %feature("director") Foo;
    class Foo {
    public:
      virtual void one();
      virtual void two();
    };
    
    class Bar: public Foo {
    public:
      virtual void three();
    };
    

    26.5.2 Director classes

    For each class that has directors enabled, SWIG generates a new class that derives from both the class in question and a special Swig::Director class. These new classes, referred to as director classes, can be loosely thought of as the C++ equivalent of the Java proxy classes. The director classes store a pointer to their underlying Java proxy classes.

    For simplicity let's ignore the Swig::Director class and refer to the original C++ class as the director's base class. By default, a director class extends all virtual methods in the inheritance chain of its base class (see the preceding section for how to modify this behavior). Virtual methods that have a final specifier are unsurprisingly excluded. Thus the virtual method calls, whether they originate in C++ or in Java via proxy classes, eventually end up in at the implementation in the director class. The job of the director methods is to route these method calls to the appropriate place in the inheritance chain. By "appropriate place" we mean the method that would have been called if the C++ base class and its Java derived classes were seamlessly integrated. That seamless integration is exactly what the director classes provide, transparently skipping over all the messy JNI glue code that binds the two languages together.

    In reality, the "appropriate place" is one of only two possibilities: C++ or Java. Once this decision is made, the rest is fairly easy. If the correct implementation is in C++, then the lowest implementation of the method in the C++ inheritance chain is called explicitly. If the correct implementation is in Java, the Java API is used to call the method of the underlying Java object (after which the usual virtual method resolution in Java automatically finds the right implementation).

    26.5.3 Overhead and code bloat

    Enabling directors for a class will generate a new director method for every virtual method in the class' inheritance chain. This alone can generate a lot of code bloat for large hierarchies. Method arguments that require complex conversions to and from Java types can result in large director methods. For this reason it is recommended that directors are selectively enabled only for specific classes that are likely to be extended in Java and used in C++.

    Although directors make it natural to mix native C++ objects with Java objects (as director objects), one should be aware of the obvious fact that method calls to Java objects from C++ will be much slower than calls to C++ objects. Additionally, compared to classes that do not use directors, the call routing in the director methods adds a small overhead. This situation can be optimized by selectively enabling director methods (using the %feature directive) for only those methods that are likely to be extended in Java.

    26.5.4 Simple directors example

    Consider the following SWIG interface file:

    %module(directors="1") example;
    
    %feature("director") DirectorBase;
    
    class DirectorBase {
    public:
      virtual ~DirectorBase() {}
      virtual void upcall_method() {}
    };
    
    void callup(DirectorBase *director) {
      director->upcall_method();
    }
    

    The following DirectorDerived Java class is derived from the Java proxy class DirectorBase and overrides upcall_method(). When C++ code invokes upcall_method(), the SWIG-generated C++ code redirects the call via JNI to the Java DirectorDerived subclass. Naturally, the SWIG generated C++ code and the generated Java intermediary class marshal and convert arguments between C++ and Java when needed.

    class DirectorDerived extends DirectorBase {
      @Override
      public void upcall_method() {
        System.out.println("DirectorDerived.upcall_method() invoked.");
      }
    }
    

    Running the following Java code

    DirectorDerived director = new DirectorDerived();
    example.callup(director);
    

    will result in the following being output:

    DirectorDerived.upcall_method() invoked.
    

    26.5.5 Director threading issues

    Depending on your operating system and version of Java and how you are using threads, you might find the JVM hangs on exit. There are a couple of solutions to try out. The preferred solution requires jdk-1.4 and later and uses AttachCurrentThreadAsDaemon instead of AttachCurrentThread whenever a call into the JVM is required. This can be enabled by defining the SWIG_JAVA_ATTACH_CURRENT_THREAD_AS_DAEMON macro when compiling the C++ wrapper code. For older JVMs define SWIG_JAVA_NO_DETACH_CURRENT_THREAD instead, to avoid the DetachCurrentThread call but this will result in a memory leak instead. For further details inspect the source code in the java/director.swg library file.

    Macros can be defined on the commandline when compiling your C++ code, or alternatively added to the C++ wrapper file as shown below:

    %insert("runtime") %{
    #define SWIG_JAVA_NO_DETACH_CURRENT_THREAD
    %}
    

    26.5.6 Director performance tuning

    When a new instance of a director (or subclass) is created in Java, the C++ side of the director performs a runtime check per director method to determine if that particular method is overridden in Java or if it should invoke the C++ base implementation directly. Although this makes initialization slightly more expensive, it is generally a good overall tradeoff.

    However, if all director methods are expected to usually be overridden by Java subclasses, then initialization can be made faster by avoiding these checks via the assumeoverride attribute. For example:

    %feature("director", assumeoverride=1) Foo;
    

    The disadvantage is that invocation of director methods from C++ when Java doesn't actually override the method will require an additional call up into Java and back to C++. As such, this option is only useful when overrides are extremely common and instantiation is frequent enough that its performance is critical.

    26.5.7 Java exceptions from directors

    With directors routing method calls to Java, and proxies routing them to C++, the handling of exceptions is an important concern. The default behavior for Java exceptions thrown in a director method overridden in Java is to store the thrown Java exception into a SWIG defined Swig::DirectorException C++ class exception in the C++ layer and then throw this C++ exception.

    Of course, should this exception be thrown, your C++ code must catch it and handle it before returning back to Java. The default generated code does not attempt to handle the C++ exception, but there is a simple way to make this all work by catching the C++ exception and extracting the original Java exception by using %catches for Swig::DirectorException. Consider the example shown earlier with a modification to the upcall_method Java method to throw a Java exception:

    class DirectorDerived extends DirectorBase {
      @Override
      public void upcall_method() {
        System.out.println("DirectorDerived.upcall_method() invoked.");
        throw new RuntimeException("There was a problem!");
      }
    }
    

    Now, by default, the JVM will abort when example.callup(director) is called as the C++ Swig::DirectorException (storing the Java exception) is thrown and not handled by the callup method. Needless to say this is not very user friendly and so the recommendation is to add the following simple %catches directive before SWIG parses the callup function:

    %catches(Swig::DirectorException) callup;
    

    Or target all wrapped methods using:

    %catches(Swig::DirectorException);
    

    This tells SWIG to generate a C++ catch handler using some code from the throws typemap for Swig::DirectorException that SWIG supplies by default, see Exception handling with %catches. This typemap code is written to simply catch the C++ Swig::DirectorException class and immediately return to Java throwing the original Java exception that it has stored. The net result is a stack trace containing the original Java exception including the location that the exception was thrown from.

    DirectorDerived.upcall_method() invoked.
    Exception in thread "main" java.lang.RuntimeException: There was a problem!
        at DirectorDerived.upcall_method(runme.java:4)
        at exampleJNI.SwigDirector_DirectorBase_upcall_method(exampleJNI.java:20)
        at exampleJNI.callup(Native Method)
        at example.callup(example.java:12)
        at runme.main(runme.java:21)
    

    More on the Swig::DirectorException class can be found in the next section which details how to customize the handling of director exceptions.

    26.5.7.1 Customizing director exceptions

    This section is for advanced customization of director exceptions. The recommendation for most users is to use the simple %catches directive described above as it should be sufficient for most users needs.

    The conversion of Java exceptions into C++ exceptions can be customized in two different ways using the director:except feature. In the first approach, a code block is attached to each director method to handle the mapping of Java exceptions into C++ exceptions. The code block is generated just after the call up from the C++ director method into the overloaded method in Java. Its primary function is to check if a Java exception has been thrown and then handle it in C++. The example below converts a java.lang.IndexOutOfBoundsException into a C++ std::out_of_range exception and converts a user's Java MyJavaException into a C++ MyCppException exception. If the Java exception doesn't match either of these, a fallback std::runtime_error C++ exception is thrown.

    %feature("director:except") MyClass::dirmethod(int x) {
      jthrowable $error = jenv->ExceptionOccurred();
      if ($error) {
        if (Swig::ExceptionMatches(jenv, $error, "java/lang/IndexOutOfBoundsException"))
          throw std::out_of_range(Swig::JavaExceptionMessage(jenv, $error).message());
        if (Swig::ExceptionMatches(jenv, $error, "$packagepath/MyJavaException"))
          throw MyCppException(Swig::JavaExceptionMessage(jenv, $error).message());
        throw std::runtime_error("Unexpected exception thrown in MyClass::dirmethod");
      }
    }
    
    class MyClass {
    public:
      /** Throws either a std::out_of_range or MyCppException on error */
      virtual void dirmethod(int x);
      virtual ~MyClass();
    };
    

    A few special variables are expanded within the director:except feature.

    • The special variable $error is expanded into a unique variable name (swigerror) and should be used for the assignment of the jthrowable exception that occurred.
    • The special variable $packagepath is replaced by the outer package provided for SWIG generation by the -package option.
    • The special variable $directorthrowshandlers is not shown above, but is replaced by applicable "directorthrows" typemap contents (covered later in this section).
    • The special variable $null is not shown above, but is replaced by a suitable default constructed object for returning from the director method (or nothing if the director method has a void return).

    Utility functions/classes in director.swg are provided to aid the exception conversion as follows:

    namespace Swig {
    
      // Helper method to determine if a Java throwable matches a particular Java class type
      // Note side effect of clearing any pending exceptions
      bool ExceptionMatches(JNIEnv *jenv, jthrowable throwable, const char *classname);
    
      // Helper class to extract the exception message from a Java throwable
      class JavaExceptionMessage {
      public:
        JavaExceptionMessage(JNIEnv *jenv, jthrowable throwable);
    
        // Return a C string of the exception message in the jthrowable passed in the constructor
        // If no message is available, null_string is return instead
        const char *message(const char *null_string = 
                            "Could not get exception message in JavaExceptionMessage") const;
      };
    
      // C++ Exception class for handling Java exceptions thrown during a director method Java upcall
      class DirectorException : public std::exception {
      public:
    
        // Construct exception from a Java throwable
        DirectorException(JNIEnv *jenv, jthrowable throwable);
    
        // More general constructor for handling as a java.lang.RuntimeException
        DirectorException(const char *msg);
    
        // Return exception message extracted from the Java throwable
        const char *what() const throw();
    
        // Reconstruct and raise/throw the Java Exception that caused the DirectorException
        // Note that any error in the JNI exception handling results in a Java RuntimeException
        void throwException(JNIEnv *jenv) const;
    
        // Create and throw the DirectorException
        static void raise(JNIEnv *jenv, jthrowable throwable) {
          throw DirectorException(jenv, throwable);
        }
      };
    
    }
    

    The utility function Swig::ExceptionMatches and class Swig::JavaExceptionMessage are provided to simplify writing code for wrappers that use the director:except feature. The function Swig::ExceptionMatches matches the type of the jthrowable thrown against a fully qualified JNI style class name, such as "java/lang/IOError". If the throwable class is the same type, or derives from the given type, Swig::ExceptionMatches will return true. Care must be taken to provide the correct fully qualified name, since for wrapped exceptions the generated proxy class will have an additional package qualification, depending on the '-package' argument and use of the nspace feature. The utility class Swig::JavaExceptionMessage is a holder providing access to the message from the thrown Java exception. The message() method returns the exception message as a const char *, which is only valid during the lifetime of the holder. Any code using this message needs to copy it, for example into a std::string or a newly constructed C++ exception.

    Using the first approach above to write handlers for a large number of methods will require repetitive duplication of the director:except feature code for each director method. To mitigate this, a second approach is provided via typemaps in a fashion analogous to the "throws" typemap. The "throws" typemap provides a way to map all the C++ exceptions listed in a method's defined exceptions (either from a C++ exception specification or a %catches feature) into Java exceptions. The "directorthrows" typemap provides the inverse mapping and should contain code to convert a suitably matching Java exception into a C++ exception. Only use this typemap if you wish to write custom conversions of Java exceptions into C++ exceptions and apply them to many different methods. The default handling which uses the Swig::DirectorException class should otherwise meet your needs.

    The example below converts a Java java.lang.IndexOutOfBoundsException exception to the typemap's type, that is a std::out_of_range C++ exception:

    %typemap(directorthrows) std::out_of_range %{
      if (Swig::ExceptionMatches(jenv, $error, "java/lang/IndexOutOfBoundsException")) {
        throw std::out_of_range(Swig::JavaExceptionMessage(jenv, $error).message());
      }
    %}
    

    The "directorthrows" typemap is then used in conjunction with the director:except feature if the $directorthrowshandlers special variable is used in the code block. Consider the following, which also happens to be the default:

    %feature("director:except") %{
      jthrowable $error = jenv->ExceptionOccurred();
      if ($error) {
        $directorthrowshandlers
        Swig::DirectorException::raise(jenv, $error);
      }
    %}
    

    where Swig::DirectorException::raise is the helper method to throw a C++ Swig::DirectorException, see above. The code generated from the director:except feature has the $directorthrowshandlers special variable replaced with the code in the relevant "directorthrows" typemaps, for each and every exception defined for the method. The relevant exceptions can be defined either with a C++ exception specification or %catches as described for the "throws" typemap.

    Let's try and put all this together by considering the following director method:

    struct X {
      virtual void doSomething(int index) throw (std::out_of_range);
      ...
    };
    
    OR
    
    %catches(std::out_of_range) X::doSomething;
    struct X {
      virtual void doSomething(int index);
      ...
    };
    

    When combined with the default director:except feature and the "directorthrows" typemap above, the resulting code generated in the director method after calling up to Java will be:

    jthrowable swigerror = jenv->ExceptionOccurred();
    if (swigerror) {
      if (Swig::ExceptionMatches(jenv, swigerror, "java/lang/IndexOutOfBoundsException")) {
        throw std::out_of_range(Swig::JavaExceptionMessage(jenv, swigerror).message());
      }
      Swig::DirectorException::raise(jenv, swigerror);
    }
    

    Note: Beware of using exception specifications as the SWIG director methods will be generated with the same exception specifications and if the director method throws an exception that is not specified in the exception specifications list it is likely to terminate your program. See the C++ standard for more details. Using the %catches feature instead to define the handled exceptions does not suffer this potential fate.

    Because the default code generation maps any unhandled Java exceptions to Swig::DirectorException, any director methods that have exception specifications may cause program termination as this exception class won't be in the exception specifications list. You can avoid throwing Swig::DirectorException by changing the default handling for all methods by adding a director:except feature without any method name. For example, you can just ignore them:

    %feature("director:except") %{
      jthrowable $error = jenv->ExceptionOccurred();
      if ($error) {
        $directorthrowshandlers
        jenv->ExceptionClear();
        return $null; // exception is ignored
      }
    %}
    

    Alternatively an exception compatible with the existing director method exception specifications can be thrown. Assuming that all methods allow std::runtime_error to be thrown, the return $null line above could be changed to:

      throw std::runtime_error(Swig::JavaExceptionMessage(jenv, $error).message());
    

    In more complex situations, a separate director:except feature may need to be attached to specific methods by providing a method name to the director:except feature.

    This is all no doubt quite hard to follow without seeing a full example and some code. Below is a complete example demonstrating the use of most of the exception customizations one can use, that is, "directorthrows" and "throws" typemaps, %exception and %catches. See the Exception handling with %exception and %javaexception section for more on converting C++ exceptions to Java exceptions. The example also has a user defined C++ exception class called MyNS::MyException and this is wrapped as a Java exception. The director class being wrapped is MyClass and the director method is called MyClass::dirmethod. A number of std::cout calls have been added to help understand code flow. You can copy the code below into an interface file and run SWIG on it and examine the generated code.

    %module(directors="1") example
    
    %{
      #include <stdexcept>
      #include <iostream>
    %}
    
    // Generic catch handler for all wrapped methods
    %exception %{
      try {
        $action
      } catch (const std::exception &e) {
        std::cout << "Generic std::exception catch handler" << std::endl;
        jclass clazz = jenv->FindClass("java/lang/RuntimeException");
        jenv->ThrowNew(clazz, e.what()); 
        return $null;
      }
    %}
    
    // Expose C++ exception as a Java Exception by changing the Java base class and providing a getMessage()
    %typemap(javabase) MyNS::MyException "java.lang.RuntimeException";
    %rename(getMessage) MyNS::MyException::whatsup;
    
    %inline %{
    namespace MyNS {
      class MyException {
        std::string msg;
      public:
        MyException(const char *msg) : msg(msg) {}
        const char * whatsup() const { return msg.c_str(); }
      };
    }
    %}
    
    %typemap(directorthrows) MyNS::MyException %{
      if (Swig::ExceptionMatches(jenv, $error, "$packagepath/MyException")) {
        std::cout << "$1_type exception matched (directorthrows typemap)" << std::endl;
        throw $1_type(Swig::JavaExceptionMessage(jenv, $error).message());
      }
    %}
    
    %typemap(throws) MyNS::MyException %{
      std::cout << "$1_type caught (throws typemap)" << std::endl;
      jclass excep = jenv->FindClass("MyException");
      if (excep) {
        std::cout << "$1_type class found (throws typemap)" << std::endl;
        jenv->ThrowNew(excep, $1.whatsup());
      }
      return $null;
    %}
    
    // These are the exceptions that the director method MyClass::dirmethod will have catch handlers for.
    // Note that this is also a virtual method / director method and the C++ exceptions listed can be
    // thrown after converting them from Java exceptions.
    %catches(MyNS::MyException, Swig::DirectorException) MyClass::dirmethod;
    
    // These are the exceptions that call_dirmethod C++ wrapper will have catch handlers for.
    // Note that this is not a virtual method, hence not a director method.
    %catches(MyNS::MyException, Swig::DirectorException) call_dirmethod;
    
    %feature("director") MyClass;
    
    %feature("director:except") MyClass::dirmethod(int x) {
      jthrowable $error = jenv->ExceptionOccurred();
      if ($error) {
        std::cout << "Upcall finished, an exception was thrown in Java" << std::endl;
        $directorthrowshandlers
        std::cout << "Upcall finished, no exception conversion, throwing DirectorException" << std::endl;
        Swig::DirectorException::raise(jenv, $error);
      }
    }
    
    %inline %{
    class MyClass {
    public:
      /** Throws either a std::out_of_range or MyException on error */
      virtual void dirmethod(int x) {
        if (x <= 0)
          throw std::out_of_range("MyClass::dirmethod index is out of range");
        else if (x == 1)
          throw MyNS::MyException("MyClass::dirmethod some problem!");
      }
      virtual ~MyClass() {}
      static void call_dirmethod(MyClass& c, int x) {
        return c.dirmethod(x);
      }
    };
    %}
    

    The generated code for the call_dirmethod wrapper contains the various exception handlers. The outer exception handler is from the %exception directive and the others are from the "throws" typemaps.

    SWIGEXPORT void JNICALL Java_exampleJNI_MyClass_1call_1dirmethod(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jint jarg2) {
      ...
      try {
        try {
          MyClass::call_dirmethod(*arg1,arg2);
        } catch(MyNS::MyException &_e) {
          std::cout << "MyNS::MyException caught (throws typemap)" << std::endl;
          jclass excep = jenv->FindClass("MyException");
          if (excep) {
            std::cout << "MyNS::MyException class found (throws typemap)" << std::endl;
            jenv->ThrowNew(excep, (&_e)->whatsup());
          }
          return ;
          
        } catch(Swig::DirectorException &_e) {
          (&_e)->throwException(jenv);
          return ; 
        }
      } catch (const std::exception &e) {
        std::cout << "Generic std::exception catch handler" << std::endl;
        jclass clazz = jenv->FindClass("java/lang/RuntimeException");
        jenv->ThrowNew(clazz, e.what()); 
        return ;
      }
    

    The director method calling up to Java contains the exception handling code from the "directorthrows" typemaps and director:except feature.

    void SwigDirector_MyClass::dirmethod(int x) {
          ... [call up to Java using CallStaticVoidMethod]
          jthrowable swigerror = jenv->ExceptionOccurred();
          if (swigerror) {
            std::cout << "Upcall finished, an exception was thrown in Java" << std::endl;
            
            if (Swig::ExceptionMatches(jenv, swigerror, "MyException")) {
              std::cout << "MyNS::MyException exception matched (directorthrows typemap)" << std::endl;
              throw MyNS::MyException(Swig::JavaExceptionMessage(jenv, swigerror).message());
            }
            
            std::cout << "Upcall finished, no exception conversion, throwing DirectorException" << std::endl;
            Swig::DirectorException::raise(jenv, swigerror);
          }
    

    Let's use the following Java class to override the director method.

    class DerivedClass extends MyClass {
      @Override
      public void dirmethod(int x) {
        if (x < 0)
          throw new IndexOutOfBoundsException("Index is negative");
        else if (x == 0)
          throw new MyException("MyException: bad dirmethod");
      }
    }
    public class runme {
      public static void main(String argv[]) {
        System.loadLibrary("example");
        ... code snippets shown below ...
      }
    }
    

    Consider the output using the Java code in the four slightly different scenarios below.

    1. Non-director C++ class is used, thus, no upcall to a Java director method is made. A std::out_of_range exception is thrown, which is derived from std::exception, and hence caught by the generic exception handler in the call_dirmethod wrapper. The Java code snippet and resulting output is:

    MyClass.call_dirmethod(new MyClass(), 0);
    
    Generic std::exception catch handler
    Exception in thread "main" java.lang.RuntimeException: MyClass::dirmethod index is out of range
            at exampleJNI.MyClass_call_dirmethod(Native Method)
            at MyClass.call_dirmethod(MyClass.java:57)
            at runme.main(runme.java:14)
    

    2. Non-director C++ class again but this time the MyNS::MyException class is thrown and caught:

    MyClass.call_dirmethod(new MyClass(), 1);
    
    MyNS::MyException caught (throws typemap)
    MyNS::MyException class found (throws typemap)
    Exception in thread "main" MyException: MyClass::dirmethod some problem!
            at exampleJNI.MyClass_call_dirmethod(Native Method)
            at MyClass.call_dirmethod(MyClass.java:57)
            at runme.main(runme.java:15)
    

    3. The DerivedClass director class is used so the upcall to Java occurs, but it throws a Java MyException, which gets converted into a C++ MyNS::MyException, then caught and converted back into a Java MyException:

    MyClass.call_dirmethod(new DerivedClass(), 0);
    
    Upcall finished, an exception was thrown in Java
    MyNS::MyException exception matched (directorthrows typemap)
    MyNS::MyException caught (throws typemap)
    MyNS::MyException class found (throws typemap)
    Exception in thread "main" MyException: MyException: bad dirmethod
            at exampleJNI.MyClass_call_dirmethod(Native Method)
            at MyClass.call_dirmethod(MyClass.java:57)
            at runme.main(runme.java:16)
    

    4. The director class is used again, but this time the director method throws a Java IndexOutOfBoundsException exception which is converted into a C++ Swig::DirectorException, thrown and caught again. This time the original Java exception is extracted from the Swig::DirectorException and rethrown. Note that this approach keeps the stack trace information of the original exception, so it has the exact location of where the IndexOutOfBoundsException exception was thrown. This is arguably an improvement over the approach above that converts from a Java excepton to C++ exception and then back to a new Java exception, losing the location of the original exception.

    MyClass.call_dirmethod(new DerivedClass(), -1);
    
    Upcall finished, an exception was thrown in Java
    Upcall finished, no exception conversion, throwing DirectorException
    Exception in thread "main" java.lang.IndexOutOfBoundsException: Index is negative
            at DerivedClass.dirmethod(runme.java:5)
            at exampleJNI.SwigDirector_MyClass_dirmethod(exampleJNI.java:23)
            at exampleJNI.MyClass_call_dirmethod(Native Method)
            at MyClass.call_dirmethod(MyClass.java:57)
            at runme.main(runme.java:17)
    

    26.6 Accessing protected members

    When using directors, the protected virtual methods are also wrapped. These methods are wrapped with a protected Java proxy method, so the only way that Java code can access these is from within a Java class derived from the director class.

    Members which are protected and non-virtual can also be accessed when using the 'allprotected' mode. The allprotected mode requires directors and is turned on by setting the allprotected option in addition to the directors option in the %module directive, like this:

    %module(directors="1", allprotected="1") modulename
    

    Protected member variables and methods (both static and non-static) will then be wrapped with protected access in the Java proxy class.

    Note: Neither the directors option nor the allprotected mode support types defined with protected scope. This includes any enums or typedefs declared in the protected section of the C++ class.

    The following simple example is a class with numerous protected members, including the constructor and destructor:

    %module(directors="1", allprotected="1") example
    
    %feature("director") ProtectedBase;
    
    // Ignore use of unsupported types (those defined in the protected section)
    %ignore ProtectedBase::typedefs;
    
    %inline %{
    
    class ProtectedBase {
    protected:
      ProtectedBase() {}
      virtual ~ProtectedBase() {}
      virtual void virtualMethod() const {}
      void nonStaticMethod(double d) const {}
      static void staticMethod(int i) {}
      int instanceMemberVariable;
      static int staticMemberVariable;
    
      // unsupported: types defined with protected access and the methods/variables which use them
      typedef int IntegerType;
      IntegerType typedefs(IntegerType it) { return it; }
    };
    int ProtectedBase::staticMemberVariable = 10;
    
    %}
    
    

    Note that the IntegerType has protected scope and the members which use this type must be ignored as they cannot be wrapped.

    The proxy methods are protected, so the only way the protected members can be accessed is within a class that derives from the director class, such as the following:

    class MyProtectedBase extends ProtectedBase
    {
      public MyProtectedBase() {
      }
    
      public void accessProtected() {
        virtualMethod();
        nonStaticMethod(1.2);
        staticMethod(99);
    
        setInstanceMemberVariable(5);
        int i = getInstanceMemberVariable();
    
        setStaticMemberVariable(10);
        i = getStaticMemberVariable();
      }
    }
    

    26.7 Common customization features

    An earlier section presented the absolute basics of C/C++ wrapping. If you do nothing but feed SWIG a header file, you will get an interface that mimics the behavior described. However, sometimes this isn't enough to produce a nice module. Certain types of functionality might be missing or the interface to certain functions might be awkward. This section describes some common SWIG features that are used to improve the interface to existing C/C++ code.

    26.7.1 C/C++ helper functions

    Sometimes when you create a module, it is missing certain bits of functionality. For example, if you had a function like this

    typedef struct Image {...};
    void set_transform(Image *im, double m[4][4]);
    

    it would be accessible from Java, but there may be no easy way to call it. The problem here is that a type wrapper class is generated for the two dimensional array parameter so there is no easy way to construct and manipulate a suitable double [4][4] value. To fix this, you can write some extra C helper functions. Just use the %inline directive. For example:

    %inline %{
    /* Note: double[4][4] is equivalent to a pointer to an array double (*)[4] */
    double (*new_mat44())[4] {
      return (double (*)[4]) malloc(16*sizeof(double));
    }
    void free_mat44(double (*x)[4]) {
      free(x);
    }
    void mat44_set(double x[4][4], int i, int j, double v) {
      x[i][j] = v;
    }
    double mat44_get(double x[4][4], int i, int j) {
      return x[i][j];
    }
    %}
    

    From Java, you could then write code like this:

    Image im = new Image();
    SWIGTYPE_p_a_4__double a = example.new_mat44();
    example.mat44_set(a, 0, 0, 1.0);
    example.mat44_set(a, 1, 1, 1.0);
    example.mat44_set(a, 2, 2, 1.0);
    ...
    example.set_transform(im, a);
    example.free_mat44(a);
    

    Admittedly, this is not the most elegant looking approach. However, it works and it wasn't too hard to implement. It is possible to improve on this using Java code, typemaps, and other customization features as covered in later sections, but sometimes helper functions are a quick and easy solution to difficult cases.

    26.7.2 Class extension with %extend

    One of the more interesting features of SWIG is that it can extend structures and classes with new methods or constructors. Here is a simple example:

    %module example
    %{
    #include "someheader.h"
    %}
    
    struct Vector {
      double x, y, z;
    };
    
    %extend Vector {
      char *toString() {
        static char tmp[1024];
        sprintf(tmp, "Vector(%g, %g, %g)", $self->x, $self->y, $self->z);
        return tmp;
      }
      Vector(double x, double y, double z) {
        Vector *v = (Vector *) malloc(sizeof(Vector));
        v->x = x;
        v->y = y;
        v->z = z;
        return v;
      }
    };
    

    Now, in Java

    Vector v = new Vector(2, 3, 4);
    System.out.println(v);
    

    will display

    Vector(2, 3, 4)
    

    %extend works with both C and C++ code. It does not modify the underlying object in any way---the extensions only show up in the Java interface.

    26.7.3 Class extension with %proxycode

    The previous section described how to extend a wrapped class with C or C++ code. This section describes how to extend a wrapped class with Java code instead of C/C++ code. The %proxycode directive is used and is just a macro for %insert("proxycode"). The Code insertion block section describes the %insert directive. The section of code for insertion is "proxycode", that is, the Java proxy class. This directive must hence only be used within the scope of a class, otherwise it is silently ignored. There are two common ways to get the scope correct.

    The first is to use %proxycode inside a class that SWIG parses, for example a toString() method can be added to a C++ class using pure Java code. A C++ header file can mix C++ and Java code inside the C++ class as follows:

    // flag.h header file
    class Flag {
      bool flag;
    public:
      Flag(bool flag) : flag(flag) {}
      bool FetchFlag() { return flag; }
    #if defined(SWIG)
    %proxycode %{
      public String toString() {
        boolean flag = FetchFlag();
        return Boolean.toString(flag);
      }
    %}
    #endif
    };
    

    and wrapped using:

    %{
    #include "flag.h"
    %}
    %include "flag.h"
    

    The second is to use %proxycode within %extend as everything within a %extend block is effectively within the scope of the class, for example:

    // flag.h header file
    class Flag {
      bool flag;
    public:
      Flag(bool flag) : flag(flag) {}
      bool FetchFlag() { return flag; }
    };
    

    and wrapped using:

    %{
    #include "flag.h"
    %}
    %include "flag.h"
    
    %extend Flag {
    #if defined(SWIG)
    %proxycode %{
      public String toString() {
        boolean flag = FetchFlag();
        return Boolean.toString(flag);
      }
    %}
    #endif
    }
    

    There is some very limited support of typemaps within a %proxycode block. A useful trick is to obtain the Java type for a given C/C++ type using the $typemap special macro. The following C++ template demonstrates this:

    %inline %{
    template<typename T> struct Value {
      T value;
      Value(const T& val) : value(val) {}
    };
    %}
    
    %extend Value {
    %proxycode %{
      public String toString() {
        // Note template type expansion is supported, so T is expanded to 'unsigned int' in this example
        // and $typemap(jstype, unsigned int) in turn is expanded to 'long'
        $typemap(jstype, T) val = getValue();
        return "$javaclassname value: " + val + " Java type: $typemap(jstype, T) JNI type: $typemap(jni, T)";
      }
    %}
    }
    %template(ValueUnsignedInt) Value<unsigned int>;
    

    The generated Java contains the expanded special variable and macro resulting in Java proxy code:

    public class ValueUnsignedInt {
      ...
      public String toString() {
        long val = getValue();
        return "ValueUnsignedInt value: " + val + " Java type: long JNI type: jlong";
      }
    
    }
    

    26.7.4 Exception handling with %exception and %javaexception

    If a C or C++ function throws an error, you may want to convert that error into a Java exception. To do this, you can use the %exception directive. The %exception directive simply lets you rewrite part of the generated wrapper code to include an error check. It is detailed in full in the Exception handling with %exception section.

    In C, a function often indicates an error by returning a status code (a negative number or a NULL pointer perhaps). Here is a simple example of how you might handle that:

    %exception malloc {
      $action
      if (!result) {
        jclass clazz = (*jenv)->FindClass(jenv, "java/lang/OutOfMemoryError");
        (*jenv)->ThrowNew(jenv, clazz, "Not enough memory");
        return $null;
      }
    }
    void *malloc(size_t nbytes);
    

    In Java,

    SWIGTYPE_p_void a = example.malloc(2000000000);
    

    will produce a familiar looking Java exception:

    Exception in thread "main" java.lang.OutOfMemoryError: Not enough memory
            at exampleJNI.malloc(Native Method)
            at example.malloc(example.java:16)
            at runme.main(runme.java:112)
    

    If a library provides some kind of general error handling framework, you can also use that. For example:

    %exception malloc {
      $action
      if (err_occurred()) {
        jclass clazz = (*jenv)->FindClass(jenv, "java/lang/OutOfMemoryError");
        (*jenv)->ThrowNew(jenv, clazz, "Not enough memory");
        return $null;
      }
    }
    void *malloc(size_t nbytes);
    

    If no declaration name is given to %exception, it is applied to all wrapper functions. The $action is a SWIG special variable and is replaced by the C/C++ function call being wrapped. The return $null; handles all native method return types, namely those that have a void return and those that do not. This is useful for typemaps that will be used in native method returning all return types. See the section on Java special variables for further explanation.

    C++ exceptions are also easy to handle. We can catch the C++ exception and rethrow it as a Java exception like this:

    %exception getitem {
      try {
        $action
      } catch (std::out_of_range &e) {
        jclass clazz = jenv->FindClass("java/lang/Exception");
        jenv->ThrowNew(clazz, "Range error");
        return $null;
      }
    }
    
    class FooClass {
      public:
        FooClass *getitem(int index);      // Might throw std::out_of_range exception
        ...
    };
    

    In the example above, java.lang.Exception is a checked exception class and so ought to be declared in the throws clause of getitem. Classes can be specified for adding to the throws clause using %javaexception(classes) instead of %exception, where classes is a string containing one or more comma separated Java classes. The %clearjavaexception feature is the equivalent to %clearexception and clears previously declared exception handlers. The %nojavaexception feature is the equivalent to %noexception and disables the exception handler. See Clearing features for the difference on disabling and clearing features.

    %javaexception("java.lang.Exception") getitem {
      try {
        $action
      } catch (std::out_of_range &e) {
        jclass clazz = jenv->FindClass("java/lang/Exception");
        jenv->ThrowNew(clazz, "Range error");
        return $null;
      }
    }
    
    class FooClass {
    public:
      FooClass *getitem(int index);      // Might throw std::out_of_range exception
      ...
    };
    

    The generated proxy method now generates a throws clause containing java.lang.Exception:

    public class FooClass {
      ...
      public FooClass getitem(int index) throws java.lang.Exception { ... }
      ...
    }
    

    The examples above first use the C JNI calling syntax then the C++ JNI calling syntax. The C++ calling syntax will not compile as C and also vice versa. It is however possible to write JNI calls which will compile under both C and C++ and is covered in the Typemaps for both C and C++ compilation section.

    The language-independent exception.i library file can also be used to raise exceptions. See the SWIG Library chapter. The typemap example Handling C++ exception specifications as Java exceptions provides further exception handling capabilities.

    26.7.5 Method access with %javamethodmodifiers

    A Java feature called %javamethodmodifiers can be used to change the method modifiers from the default public. It applies to both module class methods and proxy class methods. For example:

    %javamethodmodifiers protect_me() "protected";
    void protect_me();
    

    Will produce the method in the module class with protected access.

    protected static void protect_me() {
      exampleJNI.protect_me();
    }
    

    26.8 Tips and techniques

    Although SWIG is largely automatic, there are certain types of wrapping problems that require additional user input. Examples include dealing with output parameters, strings and arrays. This chapter discusses the common techniques for solving these problems.

    26.8.1 Input and output parameters using primitive pointers and references

    A common problem in some C programs is handling parameters passed as simple pointers or references. For example:

    void add(int x, int y, int *result) {
      *result = x + y;
    }
    

    or perhaps

    int sub(int *x, int *y) {
      return *x-*y;
    }
    

    The typemaps.i library file will help in these situations. For example:

    %module example
    %include "typemaps.i"
    
    void add(int, int, int *OUTPUT);
    int  sub(int *INPUT, int *INPUT);
    

    In Java, this allows you to pass simple values. For example:

    int result = example.sub(7, 4);
    System.out.println("7 - 4 = " + result);
    int[] sum = {0};
    example.add(3, 4, sum);
    System.out.println("3 + 4 = " + sum[0]);
    

    Which will display:

    7 - 4 = 3
    3 + 4 = 7
    

    Notice how the INPUT parameters allow integer values to be passed instead of pointers and how the OUTPUT parameter will return the result in the first element of the integer array.

    If you don't want to use the names INPUT or OUTPUT, use the %apply directive. For example:

    %module example
    %include "typemaps.i"
    
    %apply int *OUTPUT { int *result };
    %apply int *INPUT  { int *x, int *y};
    
    void add(int x, int y, int *result);
    int  sub(int *x, int *y);
    

    If a function mutates one of its parameters like this,

    void negate(int *x) {
      *x = -(*x);
    }
    

    you can use INOUT like this:

    %include "typemaps.i"
    ...
    void negate(int *INOUT);
    

    In Java, the input parameter is the first element in a 1 element array and is replaced by the output of the function. For example:

    int[] neg = {3};
    example.negate(neg);
    System.out.println("Negative of 3 = " + neg[0]);
    

    And no prizes for guessing the output:

    Negative of 3 = -3
    

    These typemaps can also be applied to C++ references. The above examples would work the same if they had been defined using references instead of pointers. For example, the Java code to use the negate function would be the same if it were defined either as it is above:

    void negate(int *INOUT);
    

    or using a reference:

    void negate(int &INOUT);
    

    Note: Since most Java primitive types are immutable and are passed by value, it is not possible to perform in-place modification of a type passed as a parameter.

    Be aware that the primary purpose of the typemaps.i file is to support primitive datatypes. Writing a function like this

    void foo(Bar *OUTPUT);
    

    will not have the intended effect since typemaps.i does not define an OUTPUT rule for Bar.

    26.8.2 Simple pointers

    If you must work with simple pointers such as int * or double * another approach to using typemaps.i is to use the cpointer.i pointer library file. For example:

    %module example
    %include "cpointer.i"
    
    %inline %{
    extern void add(int x, int y, int *result);
    %}
    
    %pointer_functions(int, intp);
    

    The %pointer_functions(type, name) macro generates five helper functions that can be used to create, destroy, copy, assign, and dereference a pointer. In this case, the functions are as follows:

    int  *new_intp();
    int  *copy_intp(int *x);
    void  delete_intp(int *x);
    void  intp_assign(int *x, int value);
    int   intp_value(int *x);
    

    In Java, you would use the functions like this:

    SWIGTYPE_p_int intPtr = example.new_intp();
    example.add(3, 4, intPtr);
    int result = example.intp_value(intPtr);
    System.out.println("3 + 4 = " + result);
    

    If you replace %pointer_functions(int, intp) by %pointer_class(int, intp), the interface is more class-like.

    intp intPtr = new intp();
    example.add(3, 4, intPtr.cast());
    int result = intPtr.value();
    System.out.println("3 + 4 = " + result);
    

    See the SWIG Library chapter for further details.

    26.8.3 Wrapping C arrays with Java arrays

    SWIG can wrap arrays in a more natural Java manner than the default by using the arrays_java.i library file. Let's consider an example:

    %include "arrays_java.i";
    int array[4];
    void populate(int x[]) {
      int i;
      for (i=0; i<4; i++)
        x[i] = 100 + i;
    }
    

    These one dimensional arrays can then be used as if they were Java arrays:

    int[] array = new int[4];
    example.populate(array);
    
    System.out.print("array: ");
    for (int i=0; i<array.length; i++)
      System.out.print(array[i] + " ");
    
    example.setArray(array);
    
    int[] global_array = example.getArray();
    
    System.out.print("\nglobal_array: ");
    for (int i=0; i<array.length; i++)
      System.out.print(global_array[i] + " ");
    

    Java arrays are always passed by reference, so any changes a function makes to the array will be seen by the calling function. Here is the output after running this code:

    array: 100 101 102 103
    global_array: 100 101 102 103
    

    Note that for assigning array variables the length of the C variable is used, so it is possible to use a Java array that is bigger than the C code will cope with. Only the number of elements in the C array will be used. However, if the Java array is not large enough then you are likely to get a segmentation fault or access violation, just like you would in C. When arrays are used in functions like populate, the size of the C array passed to the function is determined by the size of the Java array.

    Please be aware that the typemaps in this library are not efficient as all the elements are copied from the Java array to a C array whenever the array is passed to and from JNI code. There is an alternative approach using the SWIG array library and this is covered in the next section.

    26.8.4 Unbounded C Arrays

    Sometimes a C function expects an array to be passed as a pointer. For example,

    int sumitems(int *first, int nitems) {
      int i, sum = 0;
      for (i = 0; i < nitems; i++) {
        sum += first[i];
      }
      return sum;
    }
    

    One of the ways to wrap this is to apply the Java array typemaps that come in the arrays_java.i library file:

    %include "arrays_java.i"
    %apply int[] {int *};
    

    The ANY size will ensure the typemap is applied to arrays of all sizes. You could narrow the typemap matching rules by specifying a particular array size. Now you can use a pure Java array and pass it to the C code:

    int[] array = new int[10000000];          // Array of 10-million integers
    for (int i=0; i<array.length; i++) {      // Set some values
      array[i] = i;
    }
    int sum = example.sumitems(array, 10000);
    System.out.println("Sum = " + sum);
    

    and the sum would be displayed:

    Sum = 49995000
    

    This approach is probably the most natural way to use arrays. However, it suffers from performance problems when using large arrays as a lot of copying of the elements occurs in transferring the array from the Java world to the C++ world. An alternative approach to using Java arrays for C arrays is to use an alternative SWIG library file carrays.i. This approach can be more efficient for large arrays as the array is accessed one element at a time. For example:

    %include "carrays.i"
    %array_functions(int, intArray);
    

    The %array_functions(type, name) macro generates four helper functions that can be used to create and destroy arrays and operate on elements. In this case, the functions are as follows:

    int *new_intArray(int nelements);
    void delete_intArray(int *x);
    int intArray_getitem(int *x, int index);
    void intArray_setitem(int *x, int index, int value);
    

    In Java, you would use the functions like this:

    SWIGTYPE_p_int array = example.new_intArray(10000000);  // Array of 10-million integers
    for (int i=0; i<10000; i++) {                           // Set some values
      example.intArray_setitem(array, i, i);
    }
    int sum = example.sumitems(array, 10000);
    System.out.println("Sum = " + sum);
    

    If you replace %array_functions(int, intp) by %array_class(int, intp), the interface is more class-like and a couple more helper functions are available for casting between the array and the type wrapper class.

    %include "carrays.i"
    %array_class(int, intArray);
    

    The %array_class(type, name) macro creates wrappers for an unbounded array object that can be passed around as a simple pointer like int * or double *. For instance, you will be able to do this in Java:

    intArray array = new intArray(10000000);  // Array of 10-million integers
    for (int i=0; i<10000; i++) {             // Set some values
      array.setitem(i, i);
    }
    int sum = example.sumitems(array.cast(), 10000);
    System.out.println("Sum = " + sum);
    

    The array "object" created by %array_class() does not encapsulate pointers inside a special array object. In fact, there is no bounds checking or safety of any kind (just like in C). Because of this, the arrays created by this library are extremely low-level indeed. You can't iterate over them nor can you even query their length. In fact, any valid memory address can be accessed if you want (negative indices, indices beyond the end of the array, etc.). Needless to say, this approach is not going to suit all applications. On the other hand, this low-level approach is extremely efficient and well suited for applications in which you need to create buffers, package binary data, etc.

    26.8.5 Binary data vs Strings

    By default SWIG handles char * as a string but there is a handy multi-argument typemap available as mentioned in Passing binary data. The following simple example demonstrates using a byte array instead of passing the default string type and length to the wrapped function.

    %apply (char *STRING, size_t LENGTH) { (const char data[], size_t len) }
    %inline %{
    void binaryChar1(const char data[], size_t len) {
      printf("len: %d data: ", len);
      for (size_t i=0; i<len; ++i)
        printf("%x ", data[i]);
      printf("\n");
    }
    %}
    

    Calling from Java requires just the byte array to be passed in as the multi-argument typemap being applied reduces the number of arguments in the target language to one, from the original two:

    byte[] data = "hi\0jk".getBytes();
    example.binaryChar1(data);     
    

    resulting in the output

    $ java runme
    len: 5 data: 68 69 0 6a 6b
    

    26.8.6 Overriding new and delete to allocate from Java heap

    Unlike some languages supported by SWIG, Java has a true garbage collection subsystem. Other languages will free SWIG wrapped objects when their reference count reaches zero. Java only schedules these objects for finalization, which may not occur for some time. Because SWIG objects are allocated on the C heap, Java users may find the JVM memory use quickly exceeds the assigned limits, as memory fills with unfinalized proxy objects. Forcing garbage collection is clearly an undesirable solution.

    An elegant fix for C++ users is to override new and delete using the following code (here shown included in a SWIG interface file)

    /* File: java_heap.i */
    %module test
    %{
    #include <stdexcept>
    #include "jni.h"
    
    /**
     *  A stash area embedded in each allocation to hold java handles
     */
    struct Jalloc {
      jbyteArray jba;
      jobject ref;
    };
    
    static JavaVM *cached_jvm = 0;
    
    JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *jvm, void *reserved) {
      cached_jvm = jvm;
      return JNI_VERSION_1_2;
    }
    
    static JNIEnv * JNU_GetEnv() {
      JNIEnv *env;
      jint rc = cached_jvm->GetEnv((void **)&env, JNI_VERSION_1_2);
      if (rc == JNI_EDETACHED)
        throw std::runtime_error("current thread not attached");
      if (rc == JNI_EVERSION)
        throw std::runtime_error("jni version not supported");
      return env;
    }
    
    void * operator new(size_t t) {
      if (cached_jvm != 0) {
        JNIEnv *env = JNU_GetEnv();
        jbyteArray jba = env->NewByteArray((int) t + sizeof(Jalloc));
        if (env->ExceptionOccurred())
          throw bad_alloc();
        void *jbuffer = static_cast<void *>(env->GetByteArrayElements(jba, 0));
        if (env->ExceptionOccurred())
          throw bad_alloc();
        Jalloc *pJalloc = static_cast<Jalloc *>(jbuffer);
        pJalloc->jba = jba;
        /* Assign a global reference so byte array will persist until delete'ed */
        pJalloc->ref = env->NewGlobalRef(jba);
        if (env->ExceptionOccurred())
          throw bad_alloc();
        return static_cast<void *>(static_cast<char *>(jbuffer) + sizeof(Jalloc));
      }
      else { /* JNI_OnLoad not called, use malloc and mark as special */
        Jalloc *pJalloc = static_cast<Jalloc *>(malloc((int) t + sizeof(Jalloc)));
        if (!pJalloc)
          throw bad_alloc();
        pJalloc->ref = 0;
        return static_cast<void *>(
          static_cast<char *>(static_cast<void *>(pJalloc)) + sizeof(Jalloc));
      }
    }
    
    void operator delete(void *v) {
      if (v != 0) {
        void *buffer = static_cast<void *>( static_cast<char *>(v) - sizeof(Jalloc));
        Jalloc *pJalloc = static_cast<Jalloc *>(buffer);
        if (pJalloc->ref) {
          JNIEnv *env = JNU_GetEnv();
          env->DeleteGlobalRef(pJalloc->ref);
          env->ReleaseByteArrayElements(pJalloc->jba, static_cast<jbyte *>(buffer), 0);
        }
        else {
          free(buffer);
        }
      }
    }
    %}
    ...
    

    This code caches the Java environment during initialization, and when new is called, a Java ByteArray is allocated to provide the SWIG objects with space in the Java heap. This has the combined effect of re-asserting the Java virtual machine's limit on memory allocation, and puts additional pressure on the garbage collection system to run more frequently. This code is made slightly more complicated because allowances must be made if new is called before the JNI_OnLoad is executed. This can happen during static class initialization, for example.

    Unfortunately, because most Java implementations call malloc and free, this solution will not work for C wrapped structures. However, you are free to make functions that allocate and free memory from the Java heap using this model and use these functions in place of malloc and free in your own code.

    26.9 Java typemaps

    This section describes how you can modify SWIG's default wrapping behavior for various C/C++ datatypes using the %typemap directive. You are advised to be familiar with the material in the "Typemaps" chapter. While not absolutely essential knowledge, this section assumes some familiarity with the Java Native Interface (JNI). JNI documentation can be consulted either online at the Java web site or from a good JNI book. The following two books are recommended:

    • Title: 'Essential JNI: Java Native Interface.' Author: Rob Gordon. Publisher: Prentice Hall. ISBN: 0-13-679895-0.
    • Title: 'The Java Native Interface: Programmer's Guide and Specification.' Author: Sheng Liang. Publisher: Addison-Wesley. ISBN: 0-201-32577-2. Also available online at the Sun Developer Network.

    Before proceeding, it should be stressed that typemaps are not a required part of using SWIG---the default wrapping behavior is enough in most cases. Typemaps are only used if you want to change some aspect of the generated code.

    26.9.1 Default primitive type mappings

    The following table lists the default type mapping from Java to C/C++.

    C/C++ type Java type JNI type
    bool
    const bool &
    boolean jboolean
    char
    const char &
    char jchar
    signed char
    const signed char &
    byte jbyte
    unsigned char
    const unsigned char &
    short jshort
    short
    const short &
    short jshort
    unsigned short
    const unsigned short &
    int jint
    int
    const int &
    int jint
    unsigned int
    const unsigned int &
    long jlong
    long
    const long &
    int jint
    unsigned long
    const unsigned long &
    long jlong
    long long
    const long long &
    long jlong
    unsigned long long
    const unsigned long long &
    java.math.BigInteger jobject
    float
    const float &
    float jfloat
    double
    const double &
    double jdouble
    char *
    char []
    String jstring

    Note that SWIG wraps the C char type as a character. Pointers and arrays of this type are wrapped as strings. The signed char type can be used if you want to treat char as a signed number rather than a character. Also note that all const references to primitive types are treated as if they are passed by value.

    Given the following C function:

    void func(unsigned short a, char *b, const long &c, unsigned long long d);
    

    The module class method would be:

    public static void func(int a, String b, int c, java.math.BigInteger d) {...}
    

    The intermediary JNI class would use the same types:

    public final static native void func(int jarg1, String jarg2, int jarg3,
                                         java.math.BigInteger jarg4);
    

    and the JNI function would look like this:

    SWIGEXPORT void JNICALL Java_exampleJNI_func(JNIEnv *jenv, jclass jcls,
                    jint jarg1, jstring jarg2, jint jarg3, jobject jarg4) {...}
    

    The mappings for C int and C long are appropriate for 32 bit applications which are used in the 32 bit JVMs. There is no perfect mapping between Java and C as Java doesn't support all the unsigned C data types. However, the mappings allow the full range of values for each C type from Java.

    26.9.2 Default typemaps for non-primitive types

    The previous section covered the primitive type mappings. Non-primitive types such as classes and structs are mapped using pointers on the C/C++ side and storing the pointer into a Java long variable which is held by the proxy class or type wrapper class. This applies whether the type is marshalled as a pointer, by reference or by value. It also applies for any unknown/incomplete types which use type wrapper classes.

    So in summary, the C/C++ pointer to non-primitive types is cast into the 64 bit Java long type and therefore the JNI type is a jlong. The Java type is either the proxy class or type wrapper class.

    26.9.3 Sixty four bit JVMs

    If you are using a 64 bit JVM you may have to override the C long, but probably not C int default mappings. Mappings will be system dependent, for example long will need remapping on Unix LP64 systems (long, pointer 64 bits, int 32 bits), but not on Microsoft 64 bit Windows which will be using a P64 IL32 (pointer 64 bits and int, long 32 bits) model. This may be automated in a future version of SWIG. Note that the Java write once run anywhere philosophy holds true for all pure Java code when moving to a 64 bit JVM. Unfortunately it won't of course hold true for JNI code.

    26.9.4 What is a typemap?

    A typemap is nothing more than a code generation rule that is attached to a specific C datatype. For example, to convert integers from Java to C, you might define a typemap like this:

    %module example
    
    %typemap(in) int {
      $1 = $input;
      printf("Received an integer : %d\n",  $1);
    }
    %inline %{
    extern int fact(int nonnegative);
    %}
    

    Typemaps are always associated with some specific aspect of code generation. In this case, the "in" method refers to the conversion of input arguments to C/C++. The datatype int is the datatype to which the typemap will be applied. The supplied C code is used to convert values. In this code a number of special variables prefaced by a $ are used. The $1 variable is a placeholder for a local variable of type int. The $input variable contains the Java data, the JNI jint in this case.

    When this example is compiled into a Java module, it can be used as follows:

    System.out.println(example.fact(6));
    

    and the output will be:

    Received an integer : 6
    720
    

    In this example, the typemap is applied to all occurrences of the int datatype. You can refine this by supplying an optional parameter name. For example:

    %module example
    
    %typemap(in) int nonnegative {
      $1 = $input;
      printf("Received an integer : %d\n",  $1);
    }
    
    %inline %{
    extern int fact(int nonnegative);
    %}
    

    In this case, the typemap code is only attached to arguments that exactly match int nonnegative.

    The application of a typemap to specific datatypes and argument names involves more than simple text-matching--typemaps are fully integrated into the SWIG C++ type-system. When you define a typemap for int, that typemap applies to int and qualified variations such as const int. In addition, the typemap system follows typedef declarations. For example:

    %typemap(in) int nonnegative {
      $1 = $input;
      printf("Received an integer : %d\n",  $1);
    }
    %inline %{
    typedef int Integer;
    extern int fact(Integer nonnegative);    // Above typemap is applied
    %}
    

    However, the matching of typedef only occurs in one direction. If you defined a typemap for Integer, it is not applied to arguments of type int.

    Typemaps can also be defined for groups of consecutive arguments. For example:

    %typemap(in) (char *str, int len) {
    ...
    };
    
    int count(char c, char *str, int len);
    

    When a multi-argument typemap is defined, the arguments are always handled as a single Java parameter. This allows the function to be used like this (notice how the length parameter is omitted):

    int c = example.count('e', "Hello World");
    

    26.9.5 Typemaps for mapping C/C++ types to Java types

    The typemaps available to the Java module include the common typemaps listed in the main typemaps section. There are a number of additional typemaps which are necessary for using SWIG with Java. The most important of these implement the mapping of C/C++ types to Java types:


     
    Typemap Description
    jni JNI C types. These provide the default mapping of types from C/C++ to JNI for use in the JNI (C/C++) code.
    jtype Java intermediary types. These provide the default mapping of types from C/C++ to Java for use in the native functions in the intermediary JNI class. The type must be the equivalent Java type for the JNI C type specified in the "jni" typemap.
    jstype Java types. These provide the default mapping of types from C/C++ to Java for use in the Java module class, proxy classes and type wrapper classes.
    javain Conversion from jstype to jtype. These are Java code typemaps which transform the type used in the Java module class, proxy classes and type wrapper classes (as specified in the "jstype" typemap) to the type used in the Java intermediary JNI class (as specified in the "jtype" typemap). In other words the typemap provides the conversion to the native method call parameter types.
    javaout Conversion from jtype to jstype. These are Java code typemaps which transform the type used in the Java intermediary JNI class (as specified in the "jtype" typemap) to the Java type used in the Java module class, proxy classes and type wrapper classes (as specified in the "jstype" typemap). In other words the typemap provides the conversion from the native method call return type.
    jboxtype Java boxed type. These are Java code typemaps to provide the Java boxed type, such as, Integer for C type int. As autoboxing is only relevant to the Java primitive types, these are only provided for the C types that map to Java primitive types. This typemap is usually only used by C++ STL container wrappers that are wrapped by Java generic types as the boxed type must be used instead of the unboxed/primitive type when declaring a Java generic type.
    javadirectorin Conversion from jtype to jstype for director methods. These are Java code typemaps which transform the type used in the Java intermediary JNI class (as specified in the "jtype" typemap) to the Java type used in the Java module class, proxy classes and type wrapper classes (as specified in the "jstype" typemap). This typemap provides the conversion for the parameters in the director methods when calling up from C++ to Java. See Director typemaps.
    javadirectorout Conversion from jstype to jtype for director methods. These are Java code typemaps which transform the type used in the Java module class, proxy classes and type wrapper classes (as specified in the "jstype" typemap) to the type used in the Java intermediary JNI class (as specified in the "jtype" typemap). This typemap provides the conversion for the return type in the director methods when returning from the C++ to Java upcall. See Director typemaps.
    directorin Conversion from C++ type to jni type for director methods. These are C++ typemaps which convert the parameters used in the C++ director method to the appropriate JNI intermediary type. The conversion is done in JNI code prior to calling the Java function from the JNI code. See Director typemaps.
    directorout Conversion from jni type to C++ type for director methods. These are C++ typemaps which convert the JNI return type used in the C++ director method to the appropriate C++ return type. The conversion is done in JNI code after calling the Java function from the JNI code. See Director typemaps.

    If you are writing your own typemaps to handle a particular type, you will normally have to write a collection of them. The default typemaps are in "java.swg" and so might be a good place for finding typemaps to base any new ones on.

    The "jni", "jtype" and "jstype" typemaps are usually defined together to handle the Java to C/C++ type mapping. An "in" typemap should be accompanied by a "javain" typemap and likewise an "out" typemap by a "javaout" typemap. If an "in" typemap is written, a "freearg" and "argout" typemap may also need to be written as some types have a default "freearg" and/or "argout" typemap which may need overriding. The "freearg" typemap sometimes releases memory allocated by the "in" typemap. The "argout" typemap sometimes sets values in function parameters which are passed by reference in Java.

    Note that the "in" typemap marshals the JNI type held in the "jni" typemap to the real C/C++ type and for the opposite direction, the "out" typemap marshals the real C/C++ type to the JNI type held in the "jni" typemap. For non-primitive types the "in" and "out" typemaps are responsible for casting between the C/C++ pointer and the 64 bit jlong type. There is no portable way to cast a pointer into a 64 bit integer type and the approach taken by SWIG is mostly portable, but breaks C/C++ aliasing rules. In summary, these rules state that a pointer to any type must never be dereferenced by a pointer to any other incompatible type. The following code snippet might aid in understand aliasing rules better:

    short a;
    short* pa = 0;
    int i = 0x1234;
    
    a = (short)i;    /* okay */
    a = *(short*)&i; /* breaks aliasing rules */
    

    An email posting, Aliasing, pointer casts and gcc 3.3 elaborates further on the subject. In SWIG, the "in" and "out" typemaps for pointers are typically

    %typemap(in) struct Foo * %{
      $1 = *(struct Foo **)&$input; /* cast jlong into C ptr */
    %}
    %typemap(out) struct Bar * %{
      *(struct Bar **)&$result = $1; /* cast C ptr into jlong */
    %}
    struct Bar {...};
    struct Foo {...};
    struct Bar * FooBar(struct Foo *f);
    

    resulting in the following code which breaks the aliasing rules:

    SWIGEXPORT jlong JNICALL Java_exampleJNI_FooBar(JNIEnv *jenv, jclass jcls,
                                                    jlong jarg1, jobject jarg1_) {
      jlong jresult = 0 ;
      struct Foo *arg1 = (struct Foo *) 0 ;
      struct Bar *result = 0 ;
      
      (void)jenv;
      (void)jcls;
      (void)jarg1_;
      arg1 = *(struct Foo **)&jarg1; 
      result = (struct Bar *)FooBar(arg1);
      *(struct Bar **)&jresult = result; 
      return jresult;
    }
    

    If you are using gcc as your C compiler, you might get a "dereferencing type-punned pointer will break strict-aliasing rules" warning about this. Please see Compiling a dynamic module to avoid runtime problems with these strict aliasing rules.

    The default code generated by SWIG for the Java module comes from the typemaps in the "java.swg" library file which implements the Default primitive type mappings and Default typemaps for non-primitive types covered earlier. There are other type mapping typemaps in the Java library. These are listed below:


     
    C Type Typemap File Kind Java Type Function
    primitive pointers and references INPUT typemaps.i input Java basic types Allows values to be used for C functions taking pointers for data input.
    primitive pointers and references OUTPUT typemaps.i output Java basic type arrays Allows values held within an array to be used for C functions taking pointers for data output.
    primitive pointers and references INOUT typemaps.i input
    output
    Java basic type arrays Allows values held within an array to be used for C functions taking pointers for data input and output.
    string
    wstring
    [unnamed] std_string.i input
    output
    String Use for std::string mapping to Java String.
    arrays of primitive types [unnamed] arrays_java.i input
    output
    arrays of primitive Java types Use for mapping C arrays to Java arrays.
    arrays of classes/structs/unions JAVA_ARRAYSOFCLASSES macro arrays_java.i input
    output
    arrays of proxy classes Use for mapping C arrays to Java arrays.
    arrays of enums ARRAYSOFENUMS arrays_java.i input
    output
    int[] Use for mapping C arrays to Java arrays (typeunsafe and simple enum wrapping approaches only).
    char * BYTE various.i input byte[] Java byte array is converted to char array
    char ** STRING_ARRAY various.i input
    output
    String[] Use for mapping NULL terminated arrays of C strings to Java String arrays
    unsigned char * NIOBUFFER various.i input
    output
    java.nio.Buffer Use for mapping directly allocated buffers to c/c++. useful with directors and long lived memory objects

    26.9.6 Java typemap attributes

    There are a few additional typemap attributes that the Java module supports.

    The first of these is the 'throws' attribute. The throws attribute is optional and specified after the typemap name and contains one or more comma separated classes for adding to the throws clause for any methods that use that typemap. It is analogous to the %javaexception feature's throws attribute.

    %typemap(typemapname, throws="ExceptionClass1, ExceptionClass2") type { ... }
    

    The attribute is necessary for supporting Java checked exceptions and can be added to just about any typemap. The list of typemaps include all the C/C++ (JNI) typemaps in the "Typemaps" chapter and the Java specific typemaps listed in the previous section, barring the "jni", "jtype" and "jstype" typemaps as they could never contain code to throw an exception.

    The throws clause is generated for the proxy method as well as the JNI method in the JNI intermediary class. If a method uses more than one typemap and each of those typemaps have classes specified in the throws clause, the union of the exception classes is added to the throws clause ensuring there are no duplicate classes. See the NaN exception example for further usage.

    The "jtype" typemap has the optional 'nopgcpp' attribute which can be used to suppress the generation of the premature garbage collection prevention parameter.

    The "javain" typemap has the optional 'pre', 'post' and 'pgcppname' attributes. These are used for generating code before and after the JNI call in the proxy class or module class. The 'pre' attribute contains code that is generated before the JNI call and the 'post' attribute contains code generated after the JNI call. The 'pgcppname' attribute is used to change the premature garbage collection prevention parameter name passed to the JNI function. This is sometimes needed when the 'pre' typemap creates a temporary variable which is then passed to the JNI function.

    Note that when the 'pre' or 'post' attributes are specified and the associated type is used in a constructor, a constructor helper function is generated. This is necessary as the Java proxy constructor wrapper makes a call to a support constructor using a this call. In Java the this call must be the first statement in the constructor body. The constructor body thus calls the helper function and the helper function instead makes the JNI call, ensuring the 'pre' code is called before the JNI call is made. There is a Date marshalling example showing 'pre', 'post' and 'pgcppname' attributes in action.

    26.9.7 Java special variables

    The standard SWIG special variables are available for use within typemaps as described in the Typemaps documentation, for example $1, $input, $result etc.

    The Java module uses a few additional special variables:

    $javaclassname
    This special variable works like the other special variables and $javaclassname is similar to $1_type. It expands to the class name for use in Java given a pointer. SWIG wraps unions, structs and classes using pointers and in this case it expands to the Java proxy class name. For example, $javaclassname is replaced by the proxy classname Foo when wrapping a Foo * and $&javaclassname expands to the proxy classname when wrapping the C/C++ type Foo and $*javaclassname expands to the proxy classname when wrapping Foo *&. If the type does not have an associated proxy class, it expands to the type wrapper class name, for example, SWIGTYPE_p_unsigned_short is generated when wrapping unsigned short *. The class name is fully qualified with the package name when using the nspace feature.

    $javaclazzname
    This special variable works like $javaclassname, but expands the fully qualified C++ class into the package name, if used by the nspace feature, and the proxy class name, mangled for use as a function name. For example, Namespace1::Namespace2::Klass is expanded into Namespace1_Namespace2_Klass_. This special variable is usually used for making calls to a function in the intermediary JNI class, as they are mangled with this prefix.

    $null
    Used in input typemaps to return early from JNI functions that have either void or a non-void return type. Example:

    %typemap(check) int * %{ 
      if (error) {
        SWIG_JavaThrowException(jenv, SWIG_JavaIndexOutOfBoundsException, "Array element error");
        return $null;
      }
    %}
    

    If the typemap gets put into a function with void as return, $null will expand to nothing:

    SWIGEXPORT void JNICALL Java_jnifn(...) {
      if (error) {
        SWIG_JavaThrowException(jenv, SWIG_JavaIndexOutOfBoundsException, "Array element error");
        return ;
      }
      ...
    }
    

    otherwise $null expands to NULL

    SWIGEXPORT jobject JNICALL Java_jnifn(...) {
      if (error) {
        SWIG_JavaThrowException(jenv, SWIG_JavaIndexOutOfBoundsException, "Array element error");
        return NULL;
      }
      ...
    }
    

    $javainput, $jnicall and $owner
    The $javainput special variable is used in "javain" typemaps and $jnicall and $owner are used in "javaout" typemaps. $jnicall is analogous to $action in %exception. It is replaced by the call to the native method in the intermediary JNI class. $owner is replaced by either true if %newobject has been used, otherwise false. $javainput is analogous to the $input special variable. It is replaced by the parameter name.

    Here is an example:

    %typemap(javain) Class "Class.getCPtr($javainput)"
    %typemap(javain) unsigned short "$javainput"
    %typemap(javaout) Class * {
        return new Class($jnicall, $owner);
      }
    
    %inline %{
      class Class {...};
      Class * bar(Class cls, unsigned short ush) { return new Class(); };
    %}
    

    The generated proxy code is then:

    public static Class bar(Class cls, int ush) {
      return new Class(exampleJNI.bar(Class.getCPtr(cls), cls, ush), false);
    }
    

    Here $javainput has been replaced by cls and ush. $jnicall has been replaced by the native method call, exampleJNI.bar(...) and $owner has been replaced by false. If %newobject is used by adding the following at the beginning of our example:

    %newobject bar(Class cls, unsigned short ush);
    

    The generated code constructs the return type using true indicating the proxy class Class is responsible for destroying the C++ memory allocated for it in bar:

    public static Class bar(Class cls, int ush) {
      return new Class(exampleJNI.bar(Class.getCPtr(cls), cls, ush), true);
    }
    

    $static
    This special variable expands to either static or nothing depending on whether the class is an inner Java class or not. It is used in the "javaclassmodifiers" typemap so that global classes can be wrapped as Java proxy classes and nested C++ classes/enums can be wrapped with the Java equivalent, that is, static inner proxy classes.

    $error, $jniinput, $javacall and $packagepath
    These special variables are used in the directors typemaps. See Director specific typemaps for details.

    $module
    This special variable expands to the module name, as specified by %module or the -module commandline option.

    $imclassname
    This special variable expands to the intermediary class name. Usually this is the same as '$moduleJNI', unless the jniclassname attribute is specified in the %module directive.

    $javainterfacename
    This special variable is only expanded when the interface feature is applied to a class. It works much like $javaclassname, but instead of expanding to the proxy classname, it expands to the value in the name attribute in the interface feature. For example:

    %feature("interface", name="MyInterface") MyClass;
    %typemap(jstype) MyClass  "$&javainterfacename"
    %typemap(jstype) MyClass * "$javainterfacename"
    

    will result in the jstype typemap expanding to MyInterface for both MyClass and MyClass *. The interface name is fully qualified with the package name when using the nspace feature.

    $interfacename
    This special variable is only expanded when the interface feature is applied to a class. It expands to just the interface name and is thus different to $javainterfacename in that it is not fully qualified with the package name when using the nspace feature.

    26.9.8 Typemaps for both C and C++ compilation

    JNI calls must be written differently depending on whether the code is being compiled as C or C++. For example C compilation requires the pointer to a function pointer struct member syntax like

    const jclass clazz = (*jenv)->FindClass(jenv, "java/lang/String");
    

    whereas C++ code compilation of the same function call is a member function call using a class pointer like

    const jclass clazz = jenv->FindClass("java/lang/String");
    

    To enable typemaps to be used for either C or C++ compilation, a set of JCALLx macros have been defined in Lib/java/javahead.swg, where x is the number of arguments in the C++ version of the JNI call. The above JNI calls would be written in a typemap like this

    const jclass clazz = JCALL1(FindClass, jenv, "java/lang/String");
    

    Note that the SWIG preprocessor expands these into the appropriate C or C++ JNI calling convention. The C calling convention is emitted by default and the C++ calling convention is emitted when using the -c++ SWIG commandline option. If you do not intend your code to be targeting both C and C++ then your typemaps can use the appropriate JNI calling convention and need not use the JCALLx macros.

    26.9.9 Java code typemaps

    Most of SWIG's typemaps are used for the generation of C/C++ code. The typemaps in this section are used solely for the generation of Java code. Elements of proxy classes and type wrapper classes come from the following typemaps (the defaults).

    %typemap(javabase)

    base (extends) for Java class: empty default
    Note that this typemap accepts a replace attribute as an optional flag. When set to "1", it will replace/override any C++ base classes that might have been parsed. If this flag is not specified and there are C++ base classes, then a multiple inheritance warning is issued and the code in the typemap is ignored. The typemap also accepts a notderived attribute as an optional flag. When set to "1", it will not apply to classes that are derived from a C++ base. When used with the SWIGTYPE type, it is useful for giving a common base for all proxy classes, that is, providing a base class that sits in between all proxy classes and the Java base class Object for example: %typemap(javabase, notderived="1") SWIGTYPE "CommonBase".

    %typemap(javabody)

    the essential support body for proxy classes (proxy base classes only), typewrapper classes and enum classes. Default contains extra constructors, memory ownership control member variables (swigCMemOwn, swigCPtr), the getCPtr method etc.

    %typemap(javabody_derived)

    the essential support body for proxy classes (derived classes only). Same as "javabody" typemap, but only used for proxy derived classes.

    %typemap(javaclassmodifiers)

    class modifiers for the Java class: default is "public class"

    %typemap(javacode)

    Java code is copied verbatim to the Java class: empty default As there can only be one "javacode" typemap per class, also consider using the %proxycode directive which can be used multiple times per class and offers nearly identical functionality.

    %typemap(javadestruct, methodname="delete", methodmodifiers="public synchronized", parameters="")

    destructor wrapper - the delete() method (proxy classes only), used for all proxy classes except those which have a base class : default calls C++ destructor (or frees C memory) and resets swigCPtr and swigCMemOwn flags

    Note that the delete() method name is configurable and is specified by the methodname attribute. The method modifiers are also configurable via the methodmodifiers attribute. If a %javamethodmodifiers is attached to the class' destructor, it will be used in preference to the methodmodifiers typemap attribute for the class. The delete method's parameters declaration can be provided in the optional parameters typemap attribute.

    %typemap(javadestruct_derived, methodname="delete", methodmodifiers="public synchronized", parameters="")

    destructor wrapper - the delete() method (proxy classes only), same as "javadestruct" but only used for derived proxy classes : default calls C++ destructor (or frees C memory) and resets swigCPtr and swigCMemOwn flags

    Note that the delete() method name is configurable and is specified by the methodname attribute. The method modifiers are also configurable via the methodmodifiers attribute. If a %javamethodmodifiers is attached to the class' destructor, it will be used in preference to the methodmodifiers typemap attribute for the class. The delete method's parameters declaration can be provided in the optional parameters typemap attribute.

    %typemap(javaimports)

    import statements for Java class: empty default

    %typemap(javainterfaces)

    interfaces (implements) for Java class: empty default

    %typemap(javafinalize)

    the finalize() method (proxy classes only): default calls the delete() method

    Note that the default javafinalize typemap must contain the full implementation of the finalize method. Any customization to this typemap must still declare a java finalize method with the correct signature. Note also that the name of the generated "delete" method may be affected by javadestruct and javadestruct_derived typemaps. Below shows an example modifying the finalizer, assuming the delete method has been renamed to swig_delete.

    %typemap(javafinalize) SWIGTYPE %{
      protected void finalize() {
        swig_delete();  // renamed to prevent conflict with existing delete method
      }
    ]%
    

    %typemap(javainterfacecode, declaration="...", cptrmethod="...")

    The code in this typemap is added to the body of a Java proxy class but only when a class is marked with the interface feature. The typemap is used in the proxy class marked with the interface feature as well as all proxy classes derived from the marked C++ class, as they are all generated as implementing the Java interface. The default typemap used in the %interface family of macros mentioned in the Java interfaces section, where CTYPE is the C++ class macro argument, is as follows:

    %typemap(javainterfacecode,
             declaration="  long $interfacename_GetInterfaceCPtr();\n",
             cptrmethod="$interfacename_GetInterfaceCPtr") CTYPE %{
      public long $interfacename_GetInterfaceCPtr() {
        return $imclassname.$javaclazzname$interfacename_GetInterfaceCPtr(swigCPtr);
      }
    %}
    

    The special variable $interfacename is expanded into the name specified in the interface feature.

    Compatibility Note: In SWIG-1.3.21 and earlier releases, typemaps called "javagetcptr" and "javaptrconstructormodifiers" were available. These are deprecated and the "javabody" typemap can be used instead. The javainterfacecode typemap and interface feature was introduced in SWIG-3.0.9.

    In summary the contents of the typemaps make up a proxy class like this:

    [ javaimports typemap ]
    [ javaclassmodifiers typemap ] javaclassname extends [ javabase typemap ]
                                                 implements [ javainterfaces typemap ] {
    [ javabody or javabody_derived typemap ]
    [ javafinalize typemap ]
    public synchronized void delete() [ javadestruct OR javadestruct_derived typemap ]
    [ javacode typemap ]
    [ javainterfacecode typemap]
    ... proxy functions ...
    }
    

    Note the delete() methodname and method modifiers are configurable, see "javadestruct" and "javadestruct_derived" typemaps above.

    The javainterfacecode typemap is only used when bases are marked by the interface feature and the implements list will also then be expanded to include these Java interfaces.

    The type wrapper class is similar in construction:

    [ javaimports typemap ]
    [ javaclassmodifiers typemap ] javaclassname extends [ javabase typemap ]
                                                 implements [ javainterfaces typemap ] {
    [ javabody typemap ]
    [ javacode typemap ]
    }
    

    The enum class is also similar in construction:

    [ javaimports typemap ]
    [ javaclassmodifiers typemap ] javaclassname extends [ javabase typemap ]
                                                 implements [ javainterfaces typemap ] {
    ... Enum values ...
    [ javabody typemap ]
    [ javacode typemap ]
    }
    

    The "javaimports" typemap is ignored if the enum class is wrapped by an inner Java class, that is when wrapping an enum declared within a C++ class.

    The Java interface turned on by the interface feature is fairly simple:

    [ javaimports typemap ]
    public interface [ javainterfacename ] {
    [ javainterfacecode:cptrmethod typemap attribute ]
    ... interface declarations ...
    }
    

    where javainterfacename is the name attribute in the interface feature.

    The defaults can be overridden to tailor the generated classes. Here is an example which will change the getCPtr method and constructor from the default public access to protected access. If the classes in one package are not using the classes in another package, then these methods need not be public and removing access to these low level implementation details, is a good thing. If you are invoking SWIG more than once and generating the wrapped classes into different packages in each invocation, then you cannot do this as you will then have different packages.

    %typemap(javabody) SWIGTYPE %{
      private transient long swigCPtr;
      protected transient boolean swigCMemOwn;
    
      protected $javaclassname(long cPtr, boolean cMemoryOwn) {
        swigCMemOwn = cMemoryOwn;
        swigCPtr = cPtr;
      }
    
      protected static long getCPtr($javaclassname obj) {
        return (obj == null) ? 0 : obj.swigCPtr;
      }
    %}
    

    The typemap code is the same that is in "java.swg", barring the last two method modifiers. Note that SWIGTYPE will target all proxy classes, but not the type wrapper classes. Also the above typemap is only used for proxy classes that are potential base classes. To target proxy classes that are derived from a wrapped class as well, the "javabody_derived" typemap should also be overridden.

    For the typemap to be used in all type wrapper classes, all the different types that type wrapper classes could be used for should be targeted:

    %typemap(javabody) SWIGTYPE *, SWIGTYPE &, SWIGTYPE [], SWIGTYPE (CLASS::*) %{
      private transient long swigCPtr;
    
      protected $javaclassname(long cPtr, boolean bFutureUse) {
        swigCPtr = cPtr;
      }
    
      protected $javaclassname() {
        swigCPtr = 0;
      }
    
      protected static long getCPtr($javaclassname obj) {
        return (obj == null) ? 0 : obj.swigCPtr;
      }
    %}
    

    Again this is the same that is in "java.swg", barring the method modifier for getCPtr.

    When using multiple modules or the nspace feature it is common to invoke SWIG with a different -package command line option for each module. However, by default the generated code may not compile if generated classes in one package use generated classes in another package. The visibility of the getCPtr() and pointer constructor generated from the javabody typemaps needs changing. The default visibility is protected but it needs to be public for access from a different package. Just changing 'protected' to 'public' in the typemap achieves this. Two macros are available in java.swg to make this easier and using them is the preferred approach over simply copying the typemaps and modifying as this is forward compatible with any changes in the javabody typemap in future versions of SWIG. The macros are for the proxy and typewrapper classes and can respectively be used to to make the method and constructor public:

      SWIG_JAVABODY_PROXY(public, public, SWIGTYPE)
      SWIG_JAVABODY_TYPEWRAPPER(public, public, public, SWIGTYPE)
    

    26.9.10 Director specific typemaps

    The Java directors feature requires the "javadirectorin", "javadirectorout", "directorin" and the "directorout" typemaps in order to work properly. The "javapackage" typemap is an optional typemap used to identify the Java package path for individual SWIG generated proxy classes used in director methods.

    %typemap(directorin)

    The "directorin" typemap is used for converting arguments in the C++ director class to the appropriate JNI type before the upcall to Java. This typemap also specifies the JNI field descriptor for the type in the "descriptor" attribute. For example, integers are converted as follows:

    %typemap(directorin, descriptor="I") int "$input = (jint) $1;"
    

    $input is the SWIG name of the JNI temporary variable passed to Java in the upcall. The descriptor="I" will put an I into the JNI field descriptor that identifies the Java method that will be called from C++. For more about JNI field descriptors and their importance, refer to the JNI documentation mentioned earlier. A typemap for C character strings is:

    %typemap(directorin, descriptor="Ljava/lang/String;", noblock=1) char * {
      $input = 0;
      if ($1) {
        $input = JCALL1(NewStringUTF, jenv, (const char *)$1);
        if (!$input) return $null;
      }
      Swig::LocalRefGuard $1_refguard(jenv, $input);
    }
    

    The Swig::LocalRefGuard class should be used in directorin typemaps for newly allocated objects. It is used to control local reference counts ensuring the count is decremented after the call up into Java has completed. Its destructor simply calls jenv->DeleteLocalRef(obj) on the obj passed in during construction.

    User-defined types have the default "descriptor" attribute "L$packagepath/$javaclassname;" where $packagepath is the package name passed from the SWIG command line and $javaclassname is the Java proxy class' name. If the -package commandline option is not used to specify the package, then '$packagepath/' will be removed from the resulting output JNI field descriptor. Do not forget the terminating ';' for JNI field descriptors starting with 'L'. If the ';' is left out, Java will generate a "method not found" runtime error. Note that the $packagepath substitution always uses the path separator '/' when expanded. The $javaclassname expansion can be confusing as it is normally expanded using the '.' separator. However, $javaclassname is expanded using the path separator '/' in typemap's "descriptor" attribute as well as in the "directorthrows" typemap.

    %typemap(directorout)

    The "directorout" typemap is used for converting the JNI return type in the C++ director class to the appropriate C++ type after the upcall to Java. For example, integers are converted as follows:

    %typemap(directorout) int %{ $result = (int)$input; %}
    

    $input is the SWIG name of the JNI temporary variable returned from Java after the upcall. $result is the resulting output. A typemap for C character strings is:

    %typemap(directorout) char * {
      $1 = 0;
      if ($input) {
        $result = (char *)jenv->GetStringUTFChars($input, 0);
        if (!$1) return $null;
      }
    }
    

    %typemap(javadirectorin)

    Conversion from jtype to jstype for director methods. These are Java code typemaps which transform the type used in the Java intermediary JNI class (as specified in the "jtype" typemap) to the Java type used in the Java module class, proxy classes and type wrapper classes (as specified in the "jstype" typemap). This typemap provides the conversion for the parameters in the director methods when calling up from C++ to Java.

    For primitive types, this typemap is usually specified as:

    %typemap(javadirectorin) int "$jniinput"
    

    The $jniinput special variable is analogous to $javainput special variable. It is replaced by the input parameter name.

    %typemap(javadirectorout)

    Conversion from jstype to jtype for director methods. These are Java code typemaps which transform the type used in the Java module class, proxy classes and type wrapper classes (as specified in the "jstype" typemap) to the type used in the Java intermediary JNI class (as specified in the "jtype" typemap). This typemap provides the conversion for the return type in the director methods when returning from the C++ to Java upcall.

    For primitive types, this typemap is usually specified as:

    %typemap(javadirectorout) int "$javacall"
    

    The $javacall special variable is analogous to the $jnicall special variable. It is replaced by the call to the target Java method. The target method is the method in the Java proxy class which overrides the virtual C++ method in the C++ base class.

    %typemap(directorthrows)

    Conversion of Java exceptions to C++ exceptions in director method's exception handling. This typemap is expected to test the $error special variable for a matching Java exception and if successful convert and throw it into a C++ exception given by the typemap's type. The $error special variable is of type jthrowable and is substituted with a unique variable name in the generated code.

    The example below converts a Java java.lang.IndexOutOfBoundsException exception to the typemap's type, that is std::out_of_range:

    %typemap(directorthrows) std::out_of_range %{
      if (Swig::ExceptionMatches(jenv, $error, "java/lang/IndexOutOfBoundsException")) {
        throw std::out_of_range(Swig::JavaExceptionMessage(jenv, $error).message());
      }
    %}
    

    The utility function Swig::ExceptionMatches and class Swig::JavaExceptionMessage are helpers available when using directors and are described in the Java Exceptions from Directors section.

    %typemap(javapackage)

    The "javapackage" typemap is optional; it serves to identify a class's Java package. This typemap should be used in conjunction with classes that are defined outside of the current SWIG interface file. The typemap is only used if the type is used in a director method, that is, in a virtual method in a director class. For example:

    // class Foo is handled in a different interface file:
    %import "Foo.i"
    
    %feature("director") Example;
    
    %inline {
      class Bar { };
    
      class Example {
      public:
        virtual ~Example();
        virtual void ping(Foo *arg1, Bar *arg2);
      };
    }
    

    Assume that the Foo class is part of the Java package com.wombat.foo but the above interface file is part of the Java package com.wombat.example. Without the "javapackage" typemap, SWIG will assume that the Foo class belongs to com.wombat.example class. The corrected interface file looks like:

    // class Foo is handled in a different interface file:
    %import "Foo.i"
    %typemap("javapackage") Foo, Foo *, Foo & "com.wombat.foo";
    %feature("director") Example;
    
    %inline {
      class Bar { };
    
      class Example {
      public:
        virtual ~Example();
        virtual void ping(Foo *arg1, Bar *arg2);
      };
    }
    

    SWIG looks up the package based on the actual type (plain Foo, Foo pointer and Foo reference), so it is important to associate all three types with the desired package. Practically speaking, you should create a separate SWIG interface file, which is %import-ed into each SWIG interface file, when you have multiple Java packages. Note the helper macros below, OTHER_PACKAGE_SPEC and ANOTHER_PACKAGE_SPEC, which reduce the amount of extra typing. "TYPE..." is useful when passing templated types to the macro, since multiargument template types appear to the SWIG preprocessor as multiple macro arguments.

    %typemap("javapackage") SWIGTYPE, SWIGTYPE *, SWIGTYPE &
                                                "package.for.most.classes";
    
    %define OTHER_PACKAGE_SPEC(TYPE...)
    %typemap("javapackage") TYPE, TYPE *, TYPE & "package.for.other.classes";
    %enddef
    
    %define ANOTHER_PACKAGE_SPEC(TYPE...)
    %typemap("javapackage") TYPE, TYPE *, TYPE & "package.for.another.set";
    %enddef
    
    OTHER_PACKAGE_SPEC(Package_2_class_one)
    ANOTHER_PACKAGE_SPEC(Package_3_class_two)
    /* etc */
    

    The basic strategy here is to provide a default package typemap for the majority of the classes, only providing "javapackage" typemaps for the exceptions.

    26.10 Typemap Examples

    This section includes a few examples of typemaps. For more examples, you might look at the files "java.swg" and "typemaps.i" in the SWIG library.

    26.10.1 Simpler Java enums for enums without initializers

    The default Proper Java enums approach to wrapping enums is somewhat verbose. This is to handle all possible C/C++ enums, in particular enums with initializers. The generated code can be simplified if the enum being wrapped does not have any initializers.

    The following shows how to remove the support methods that are generated by default and instead use the methods in the Java enum base class java.lang.Enum and java.lang.Class for marshalling enums between C/C++ and Java. The type used for the typemaps below is enum SWIGTYPE which is the default type used for all enums. The "enums.swg" file should be examined in order to see the original overridden versions of the typemaps.

    %include "enums.swg"
    
    %typemap(javain) enum SWIGTYPE "$javainput.ordinal()"
    %typemap(javaout) enum SWIGTYPE {
        return $javaclassname.class.getEnumConstants()[$jnicall];
      }
    %typemap(javabody) enum SWIGTYPE ""
    
    %inline %{
      enum HairType { blonde, ginger, brunette };
      void setHair(HairType h);
      HairType getHair();
    %}
    

    SWIG will generate the following Java enum, which is somewhat simpler than the default:

    public enum HairType {
      blonde,
      ginger,
      brunette;
    }
    

    and the two Java proxy methods will be:

    public static void setHair(HairType h) {
      exampleJNI.setHair(h.ordinal());
    }
    
    public static HairType getHair() {
      return HairType.class.getEnumConstants()[exampleJNI.getHair()];
    }
    

    For marshalling Java enums to C/C++ enums, the ordinal method is used to convert the Java enum into an integer value for passing to the JNI layer, see the "javain" typemap. For marshalling C/C++ enums to Java enums, the C/C++ enum value is cast to an integer in the C/C++ typemaps (not shown). This integer value is then used to index into the array of enum constants that the Java language provides. See the getEnumConstants method in the "javaout" typemap.

    These typemaps can often be used as the default for wrapping enums as in many cases there won't be any enum initializers. In fact a good strategy is to always use these typemaps and to specifically handle enums with initializers using %apply. This would be done by using the original versions of these typemaps in "enums.swg" under another typemap name for applying using %apply.

    26.10.2 Handling C++ exception specifications as Java exceptions

    This example demonstrates various ways in which C++ exceptions can be tailored and converted into Java exceptions. Let's consider a simple file class SimpleFile and an exception class FileException which it may throw on error:

    %include "std_string.i" // for std::string typemaps
    #include <string>
    
    class FileException {
      std::string message;
    public:
      FileException(const std::string& msg) : message(msg) {}
      std::string what() {
        return message;
      }
    };
    
    class SimpleFile {
      std::string filename;
    public:
      SimpleFile(const std::string& filename) : filename(filename) {}
      void open() throw(FileException) {
      ...
      }
    };
    

    As the open method has a C++ exception specification, SWIG will parse this and know that the method can throw an exception. The "throws" typemap is then used when SWIG encounters an exception specification. The default generic "throws" typemap looks like this:

    %typemap(throws) SWIGTYPE, SWIGTYPE &, SWIGTYPE *, SWIGTYPE [ANY] %{
      SWIG_JavaThrowException(jenv, SWIG_JavaRuntimeException,
                              "C++ $1_type exception thrown");
      return $null;
    %}
    

    Basically SWIG will generate a C++ try catch block and the body of the "throws" typemap constitutes the catch block. The above typemap calls a SWIG supplied method which throws a java.lang.RuntimeException. This exception class is a runtime exception and therefore not a checked exception. If, however, we wanted to throw a checked exception, say java.io.IOException, then we could use the following typemap:

    %typemap(throws, throws="java.io.IOException") FileException {
      jclass excep = jenv->FindClass("java/io/IOException");
      if (excep)
        jenv->ThrowNew(excep, $1.what().c_str());
      return $null;
    }
    

    Note that this typemap uses the 'throws' typemap attribute to ensure a throws clause is generated. The generated proxy method then specifies the checked exception by containing java.io.IOException in the throws clause:

    public class SimpleFile {
      ...
      public void open() throws java.io.IOException { ... }
    }
    

    Lastly, if you don't want to map your C++ exception into one of the standard Java exceptions, the C++ class can be wrapped and turned into a custom Java exception class. If we go back to our example, the first thing we must do is get SWIG to wrap FileException and ensure that it derives from java.lang.Exception. Additionally, we might want to override the java.lang.Exception.getMessage() method. The typemaps to use then are as follows:

    %typemap(javabase) FileException "java.lang.Exception";
    %typemap(javacode) FileException %{
      public String getMessage() {
        return what();
      }
    %}
    

    This generates:

    public class FileException extends java.lang.Exception {
      ...
      public String getMessage() {
        return what();
      }
    
      public FileException(String msg) { ... }
    
      public String what() {
        return exampleJNI.FileException_what(swigCPtr, this);
      }
    }
    

    We could alternatively have used %rename to rename what() into getMessage().

    26.10.3 NaN Exception - exception handling for a particular type

    A Java exception can be thrown from any Java or JNI code. Therefore, as most typemaps contain either Java or JNI code, just about any typemap could throw an exception. The following example demonstrates exception handling on a type by type basis by checking for 'Not a number' (NaN) whenever a parameter of type float is wrapped.

    Consider the following C++ code:

    bool calculate(float first, float second);
    

    To validate every float being passed to C++, we could precede the code being wrapped by the following typemap which throws a runtime exception whenever the float is 'Not a Number':

    %module example
    %typemap(javain) float "$module.CheckForNaN($javainput)"
    %pragma(java) modulecode=%{
      /** Simply returns the input value unless it is not a number,
          whereupon an exception is thrown. */
      static protected float CheckForNaN(float num) {
        if (Float.isNaN(num))
          throw new RuntimeException("Not a number");
        return num;
      }
    %}
    

    Note that the CheckForNaN support method has been added to the module class using the modulecode pragma. The following shows the generated code of interest:

    public class example {
      ...
    
      /** Simply returns the input value unless it is not a number,
          whereupon an exception is thrown. */
      static protected float CheckForNaN(float num) {
        if (Float.isNaN(num))
          throw new RuntimeException("Not a number");
        return num;
      }
    
      public static boolean calculate(float first, float second) {
        return exampleJNI.calculate(example.CheckForNaN(first), example.CheckForNaN(second));
      }
    }
    

    Note that the "javain" typemap is used for every occurrence of a float being used as an input. Of course, we could have targeted the typemap at a particular parameter by using float first, say, instead of just float.

    The exception checking could alternatively have been placed into the 'pre' attribute that the "javain" typemap supports. The "javain" typemap above could be replaced with the following:

    %typemap(javain, pre="    $module.CheckForNaN($javainput);") float "$javainput"
    

    which would modify the calculate function to instead be generated as:

    public class example {
      ...
      public static boolean calculate(float first, float second) {
        example.CheckForNaN(first);
        example.CheckForNaN(second);
        {
          return exampleJNI.calculate(first, second);
        }
      }
    }
    

    See the Date marshalling example for an example using further "javain" typemap attributes.

    If we decide that what we actually want is a checked exception instead of a runtime exception, we can change this easily enough. The proxy method that uses float as an input, must then add the exception class to the throws clause. SWIG can handle this as it supports the 'throws' typemap attribute for specifying classes for the throws clause. Thus we can modify the pragma and the typemap for the throws clause:

    %typemap(javain, throws="java.lang.Exception") float "$module.CheckForNaN($javainput)"
    %pragma(java) modulecode=%{
      /** Simply returns the input value unless it is not a number,
          whereupon an exception is thrown. */
      static protected float CheckForNaN(float num) throws java.lang.Exception {
        if (Float.isNaN(num))
          throw new RuntimeException("Not a number");
        return num;
      }
    %}
    

    The calculate method now has a throws clause and even though the typemap is used twice for both float first and float second, the throws clause contains a single instance of java.lang.Exception:

    public class example {
      ...
    
      /** Simply returns the input value unless it is not a number,
          whereupon an exception is thrown. */
      static protected float CheckForNaN(float num) throws java.lang.Exception {
        if (Float.isNaN(num))
          throw new RuntimeException("Not a number");
        return num;
      }
    
      public static boolean calculate(float first, float second) throws java.lang.Exception {
        return exampleJNI.calculate(example.CheckForNaN(first), example.CheckForNaN(second));
      }
    }
    

    If we were a martyr to the JNI cause, we could replace the succinct code within the "javain" typemap with a few pages of JNI code. If we had, we would have put it in the "in" typemap which, like all JNI and Java typemaps, also supports the 'throws' attribute.

    26.10.4 Converting Java String arrays to char **

    A common problem in many C programs is the processing of command line arguments, which are usually passed in an array of NULL terminated strings. The following SWIG interface file allows a Java String array to be used as a char ** object.

    %module example
    
    /* This tells SWIG to treat char ** as a special case when used as a parameter
       in a function call */
    %typemap(in) char ** (jint size) {
      int i = 0;
      size = (*jenv)->GetArrayLength(jenv, $input);
      $1 = (char **) malloc((size+1)*sizeof(char *));
      /* make a copy of each string */
      for (i = 0; i<size; i++) {
        jstring j_string = (jstring)(*jenv)->GetObjectArrayElement(jenv, $input, i);
        const char * c_string = (*jenv)->GetStringUTFChars(jenv, j_string, 0);
        $1[i] = malloc((strlen(c_string)+1)*sizeof(char));
        strcpy($1[i], c_string);
        (*jenv)->ReleaseStringUTFChars(jenv, j_string, c_string);
        (*jenv)->DeleteLocalRef(jenv, j_string);
      }
      $1[i] = 0;
    }
    
    /* This cleans up the memory we malloc'd before the function call */
    %typemap(freearg) char ** {
      int i;
      for (i=0; i<size$argnum-1; i++)
        free($1[i]);
      free($1);
    }
    
    /* This allows a C function to return a char ** as a Java String array */
    %typemap(out) char ** {
      int i;
      int len=0;
      jstring temp_string;
      const jclass clazz = (*jenv)->FindClass(jenv, "java/lang/String");
    
      while ($1[len]) len++;
      jresult = (*jenv)->NewObjectArray(jenv, len, clazz, NULL);
      /* exception checking omitted */
    
      for (i=0; i<len; i++) {
        temp_string = (*jenv)->NewStringUTF(jenv, *result++);
        (*jenv)->SetObjectArrayElement(jenv, jresult, i, temp_string);
        (*jenv)->DeleteLocalRef(jenv, temp_string);
      }
    }
    
    /* These 3 typemaps tell SWIG what JNI and Java types to use */
    %typemap(jni) char ** "jobjectArray"
    %typemap(jtype) char ** "String[]"
    %typemap(jstype) char ** "String[]"
    
    /* These 2 typemaps handle the conversion of the jtype to jstype typemap type
       and vice versa */
    %typemap(javain) char ** "$javainput"
    %typemap(javaout) char ** {
        return $jnicall;
      }
    
    /* Now a few test functions */
    %inline %{
    
    int print_args(char **argv) {
      int i = 0;
      while (argv[i]) {
        printf("argv[%d] = %s\n", i, argv[i]);
        i++;
      }
      return i;
    }
    
    char **get_args() {
      static char *values[] = { "Dave", "Mike", "Susan", "John", "Michelle", 0};
      return &values[0];
    }
    
    %}
    

    Note that the 'C' JNI calling convention is used. Checking for any thrown exceptions after JNI function calls has been omitted. When this module is compiled, our wrapped C functions can be used by the following Java program:

    // File runme.java
    
    public class runme {
    
      static {
        try {
          System.loadLibrary("example");
        } catch (UnsatisfiedLinkError e) {
          System.err.println("Native code library failed to load. " + e);
          System.exit(1);
        }
      }
    
      public static void main(String argv[]) {
        String animals[] = {"Cat", "Dog", "Cow", "Goat"};
        example.print_args(animals);
        String args[] = example.get_args();
        for (int i=0; i<args.length; i++)
          System.out.println(i + ":" + args[i]);
      }
    }
    

    When compiled and run we get:

    $ java runme
    argv[0] = Cat
    argv[1] = Dog
    argv[2] = Cow
    argv[3] = Goat
    0:Dave
    1:Mike
    2:Susan
    3:John
    4:Michelle
    

    In the example, a few different typemaps are used. The "in" typemap is used to receive an input argument and convert it to a C array. Since dynamic memory allocation is used to allocate memory for the array, the "freearg" typemap is used to later release this memory after the execution of the C function. The "out" typemap is used for function return values. Lastly the "jni", "jtype" and "jstype" typemaps are also required to specify what Java types to use.

    26.10.5 Expanding a Java object to multiple arguments

    Suppose that you had a collection of C functions with arguments such as the following:

    int foo(int argc, char **argv);
    

    In the previous example, a typemap was written to pass a Java String array as the char **argv. This allows the function to be used from Java as follows:

    example.foo(4, new String[]{"red", "green", "blue", "white"});
    

    Although this works, it's a little awkward to specify the argument count. To fix this, a multi-argument typemap can be defined. This is not very difficult--you only have to make slight modifications to the previous example's typemaps:

    %typemap(in) (int argc, char **argv) {
      int i = 0;
      $1 = (*jenv)->GetArrayLength(jenv, $input);
      $2 = (char **) malloc(($1+1)*sizeof(char *));
      /* make a copy of each string */
      for (i = 0; i<$1; i++) {
        jstring j_string = (jstring)(*jenv)->GetObjectArrayElement(jenv, $input, i);
        const char * c_string = (*jenv)->GetStringUTFChars(jenv, j_string, 0);
        $2[i] = malloc((strlen(c_string)+1)*sizeof(char));
        strcpy($2[i], c_string);
        (*jenv)->ReleaseStringUTFChars(jenv, j_string, c_string);
        (*jenv)->DeleteLocalRef(jenv, j_string);
      }
      $2[i] = 0;
    }
    
    %typemap(freearg) (int argc, char **argv) {
      int i;
      for (i=0; i<$1-1; i++)
        free($2[i]);
      free($2);
    }
    
    %typemap(jni) (int argc, char **argv) "jobjectArray"
    %typemap(jtype) (int argc, char **argv) "String[]"
    %typemap(jstype) (int argc, char **argv) "String[]"
    
    %typemap(javain) (int argc, char **argv) "$javainput"
    

    When writing a multiple-argument typemap, each of the types is referenced by a variable such as $1 or $2. The typemap code simply fills in the appropriate values from the supplied Java parameter.

    With the above typemap in place, you will find it no longer necessary to supply the argument count. This is automatically set by the typemap code. For example:

    example.foo(new String[]{"red", "green", "blue", "white"});
    

    26.10.6 Using typemaps to return arguments

    A common problem in some C programs is that values may be returned in function parameters rather than in the return value of a function. The typemaps.i file defines INPUT, OUTPUT and INOUT typemaps which can be used to solve some instances of this problem. This library file uses an array as a means of moving data to and from Java when wrapping a C function that takes non const pointers or non const references as parameters.

    Now we are going to outline an alternative approach to using arrays for C pointers. The INOUT typemap uses a double[] array for receiving and returning the double* parameters. In this approach we are able to use a Java class myDouble instead of double[] arrays where the C pointer double* is required.

    Here is our example function:

    /* Returns a status value and two values in out1 and out2 */
    int spam(double a, double b, double *out1, double *out2);
    

    If we define a structure MyDouble containing a double member variable and use some typemaps we can solve this problem. For example we could put the following through SWIG:

    %module example
    
    /* Define a new structure to use instead of double * */
    %inline %{
    typedef struct {
      double value;
    } MyDouble;
    %}
    
    
    %{
    /* Returns a status value and two values in out1 and out2 */
    int spam(double a, double b, double *out1, double *out2) {
      int status = 1;
      *out1 = a*10.0;
      *out2 = b*100.0;
      return status;
    }
    %}
    
    /* 
    This typemap will make any double * function parameters with name OUTVALUE take an
    argument of MyDouble instead of double *. This will 
    allow the calling function to read the double * value after returning from the function.
    */
    %typemap(in) double *OUTVALUE {
      jclass clazz = jenv->FindClass("MyDouble");
      jfieldID fid = jenv->GetFieldID(clazz, "swigCPtr", "J");
      jlong cPtr = jenv->GetLongField($input, fid);
      MyDouble *pMyDouble = NULL;
      *(MyDouble **)&pMyDouble = *(MyDouble **)&cPtr;
      $1 = &pMyDouble->value;
    }
    
    %typemap(jtype) double *OUTVALUE "MyDouble"
    %typemap(jstype) double *OUTVALUE "MyDouble"
    %typemap(jni) double *OUTVALUE "jobject"
    
    %typemap(javain) double *OUTVALUE "$javainput"
    
    /* Now we apply the typemap to the named variables */
    %apply double *OUTVALUE { double *out1, double *out2 };
    int spam(double a, double b, double *out1, double *out2);
    

    Note that the C++ JNI calling convention has been used this time and so must be compiled as C++ and the -c++ commandline must be passed to SWIG. JNI error checking has been omitted for clarity.

    What the typemaps do are make the named double* function parameters use our new MyDouble wrapper structure. The "in" typemap takes this structure, gets the C++ pointer to it, takes the double value member variable and passes it to the C++ spam function. In Java, when the function returns, we use the SWIG created getValue() function to get the output value. The following Java program demonstrates this:

    // File: runme.java
    
    public class runme {
    
      static {
        try {
          System.loadLibrary("example");
        } catch (UnsatisfiedLinkError e) {
          System.err.println("Native code library failed to load. " + e);
          System.exit(1);
        }
      }
    
      public static void main(String argv[]) {
        MyDouble out1 = new MyDouble();
        MyDouble out2 = new MyDouble();
        int ret = example.spam(1.2, 3.4, out1, out2);
        System.out.println(ret + "  " + out1.getValue() + "  " + out2.getValue());
      }
    }
    

    When compiled and run we get:

    $ java runme
    1 12.0  340.0
    

    26.10.7 Adding Java downcasts to polymorphic return types

    SWIG support for polymorphism works in that the appropriate virtual function is called. However, the default generated code does not allow for downcasting. Let's examine this with the following code:

    %include "std_string.i"
    
    #include <iostream>
    using namespace std;
    class Vehicle {
    public:
      virtual void start() = 0;
    ...
    };
    
    class Ambulance : public Vehicle {
      string vol;
    public:
      Ambulance(string volume) : vol(volume) {}
      virtual void start() {
        cout << "Ambulance started" << endl;
      }
      void sound_siren() {
        cout << vol << " siren sounded!" << endl;
      }
    ...
    };
    
    Vehicle *vehicle_factory() {
      return new Ambulance("Very loud");
    }
    

    If we execute the following Java code:

    Vehicle vehicle = example.vehicle_factory();
    vehicle.start();
    
    Ambulance ambulance = (Ambulance)vehicle;
    ambulance.sound_siren();
    

    We get:

    Ambulance started
    java.lang.ClassCastException
            at runme.main(runme.java:16)
    

    Even though we know from examination of the C++ code that vehicle_factory returns an object of type Ambulance, we are not able to use this knowledge to perform the downcast in Java. This occurs because the runtime type information is not completely passed from C++ to Java when returning the type from vehicle_factory(). Usually this is not a problem as virtual functions do work by default, such as in the case of start(). There are a few solutions to getting downcasts to work.

    The first is not to use a Java cast but a call to C++ to make the cast. Add this to your code:

    %exception Ambulance::dynamic_cast(Vehicle *vehicle) {
      $action
        if (!result) {
          jclass excep = jenv->FindClass("java/lang/ClassCastException");
          if (excep) {
            jenv->ThrowNew(excep, "dynamic_cast exception");
          }
        }
    }
    %extend Ambulance {
      static Ambulance *dynamic_cast(Vehicle *vehicle) {
        return dynamic_cast<Ambulance *>(vehicle);
      }
    };
    

    It would then be used from Java like this

    Ambulance ambulance = Ambulance.dynamic_cast(vehicle);
    ambulance.sound_siren();
    

    Should vehicle not be of type ambulance then a Java ClassCastException is thrown. The next solution is a purer solution in that Java downcasts can be performed on the types. Add the following before the definition of vehicle_factory:

    %typemap(out) Vehicle * {
      Ambulance *downcast = dynamic_cast<Ambulance *>($1);
      *(Ambulance **)&$result = downcast;
    }
    
    %typemap(javaout) Vehicle * {
        return new Ambulance($jnicall, $owner);
      }
    

    Here we are using our knowledge that vehicle_factory always returns type Ambulance so that the Java proxy is created as a type Ambulance. If vehicle_factory can manufacture any type of Vehicle and we want to be able to downcast using Java casts for any of these types, then a different approach is needed. Consider expanding our example with a new Vehicle type and a more flexible factory function:

    class FireEngine : public Vehicle {
    public:
      FireEngine() {}
      virtual void start() {
        cout << "FireEngine started" << endl;
      }
      void roll_out_hose() {
        cout << "Hose rolled out" << endl;
      }
      ...
    };
    Vehicle *vehicle_factory(int vehicle_number) {
      if (vehicle_number == 0)
        return new Ambulance("Very loud");
      else
        return new FireEngine();
    }
    

    To be able to downcast with this sort of Java code:

    FireEngine fireengine = (FireEngine)example.vehicle_factory(1);
    fireengine.roll_out_hose();
    Ambulance ambulance = (Ambulance)example.vehicle_factory(0);
    ambulance.sound_siren();
    

    the following typemaps targeted at the vehicle_factory function will achieve this. Note that in this case, the Java class is constructed using JNI code rather than passing a pointer across the JNI boundary in a Java long for construction in Java code.

    %typemap(jni) Vehicle *vehicle_factory "jobject"
    %typemap(jtype) Vehicle *vehicle_factory "Vehicle"
    %typemap(jstype) Vehicle *vehicle_factory "Vehicle"
    %typemap(javaout) Vehicle *vehicle_factory {
        return $jnicall;
      }
    
    %typemap(out) Vehicle *vehicle_factory {
      Ambulance *ambulance = dynamic_cast<Ambulance *>($1);
      FireEngine *fireengine = dynamic_cast<FireEngine *>($1);
      if (ambulance) {
        // call the Ambulance(long cPtr, boolean cMemoryOwn) constructor
        jclass clazz = jenv->FindClass("Ambulance");
        if (clazz) {
          jmethodID mid = jenv->GetMethodID(clazz, "<init>", "(JZ)V");
          if (mid) {
            jlong cptr = 0;
            *(Ambulance **)&cptr = ambulance;
            $result = jenv->NewObject(clazz, mid, cptr, false);
          }
        }
      } else if (fireengine) {
        // call the FireEngine(long cPtr, boolean cMemoryOwn) constructor
        jclass clazz = jenv->FindClass("FireEngine");
        if (clazz) {
          jmethodID mid = jenv->GetMethodID(clazz, "<init>", "(JZ)V");
          if (mid) {
            jlong cptr = 0;
            *(FireEngine **)&cptr = fireengine;
            $result = jenv->NewObject(clazz, mid, cptr, false);
          }
        }
      }
      else {
        cout << "Unexpected type " << endl;
      }
    
      if (!$result)
        cout << "Failed to create new java object" << endl;
    }
    

    Better error handling would need to be added into this code. There are other solutions to this problem, but this last example demonstrates some more involved JNI code. SWIG usually generates code which constructs the proxy classes using Java code as it is easier to handle error conditions and is faster. Note that the JNI code above uses a number of string lookups to call a constructor, whereas this would not occur using byte compiled Java code.

    26.10.8 Adding an equals method to the Java classes

    When a pointer is returned from a JNI function, it is wrapped using a new Java proxy class or type wrapper class. Even when the pointers are the same, it will not be possible to know that the two Java classes containing those pointers are actually the same object. It is common in Java to use the equals() method to check whether two objects are equivalent. The equals() method is usually accompanied by a hashCode() method in order to fulfill the requirement that the hash code is equal for equal objects. Pure Java code methods like these can be easily added:

    %typemap(javacode) SWIGTYPE %{
      public boolean equals(Object obj) {
        boolean equal = false;
        if (obj instanceof $javaclassname)
          equal = ((($javaclassname)obj).swigCPtr == this.swigCPtr);
        return equal;
      }
      public int hashCode() {
        return (int)getPointer();
      }
    %}
    
    class Foo { };
    Foo* returnFoo(Foo *foo) { return foo; }
    

    The following would display false without the javacode typemap above. With the typemap defining the equals method the result is true.

    Foo foo1 = new Foo();
    Foo foo2 = example.returnFoo(foo1);
    System.out.println("foo1? " + foo1.equals(foo2));
    

    26.10.9 Void pointers and a common Java base class

    One might wonder why the common code that SWIG emits for the proxy and type wrapper classes is not pushed into a base class. The reason is that although swigCPtr could be put into a common base class for all classes wrapping C structures, it would not work for C++ classes involved in an inheritance chain. Each class derived from a base needs a separate swigCPtr because C++ compilers sometimes use a different pointer value when casting a derived class to a base. Additionally as Java only supports single inheritance, it would not be possible to derive wrapped classes from your own pure Java classes if the base class has been 'used up' by SWIG. However, you may want to move some of the common code into a base class. Here is an example which uses a common base class for all proxy classes and type wrapper classes:

    %typemap(javabase) SWIGTYPE, SWIGTYPE *, SWIGTYPE &, SWIGTYPE [], 
                                                             SWIGTYPE (CLASS::*) "SWIG"
    
    %typemap(javacode) SWIGTYPE, SWIGTYPE *, SWIGTYPE &, SWIGTYPE [], 
                                                             SWIGTYPE (CLASS::*) %{
      protected long getPointer() {
        return swigCPtr;
      }
    %}
    

    Define new base class called SWIG:

    public abstract class SWIG {
      protected abstract long getPointer();
    
      public boolean equals(Object obj) {
        boolean equal = false;
        if (obj instanceof SWIG)
          equal = (((SWIG)obj).getPointer() == this.getPointer());
        return equal;
      }
      
      SWIGTYPE_p_void getVoidPointer() {
        return new SWIGTYPE_p_void(getPointer(), false);
      }
    }
    

    This example contains some useful functionality which you may want in your code.

    • It has an equals() method. Unlike the previous example, the method code isn't replicated in all classes.
    • It also has a function which effectively implements a cast from the type of the proxy/type wrapper class to a void pointer. This is necessary for passing a proxy class or a type wrapper class to a function that takes a void pointer.

    26.10.10 Struct pointer to pointer

    Pointers to pointers are often used as output parameters in C factory type functions. These are a bit more tricky to handle. Consider the following situation where a Butler can be hired and fired:

    typedef struct {
      int hoursAvailable;
      char *greeting;
    } Butler;
    
    // Note: HireButler will allocate the memory 
    // The caller must free the memory by calling FireButler()!!
    extern int HireButler(Butler **ppButler);
    extern void FireButler(Butler *pButler);
    

    C code implementation:

    int HireButler(Butler **ppButler) {
      Butler *pButler = (Butler *)malloc(sizeof(Butler));
      pButler->hoursAvailable = 24;
      pButler->greeting = (char *)malloc(32);
      strcpy(pButler->greeting, "At your service Sir");
      *ppButler = pButler;
      return 1;
    }
    void FireButler(Butler *pButler) {
      free(pButler->greeting);
      free(pButler);
    }
    

    Let's take two approaches to wrapping this code. The first is to provide a functional interface, much like the original C interface. The following Java code shows how we intend the code to be used:

    Butler jeeves = new Butler();
    example.HireButler(jeeves);
    System.out.println("Greeting:     " + jeeves.getGreeting());
    System.out.println("Availability: " + jeeves.getHoursAvailable() + " hours per day");
    example.FireButler(jeeves);
    

    Resulting in the following output when run:

    Greeting:     At your service Sir
    Availability: 24 hours per day
    

    Note the usage is very much like it would be used if we were writing C code, that is, explicit memory management is needed. No C memory is allocated in the construction of the Butler proxy class and the proxy class will not destroy the underlying C memory when it is collected. A number of typemaps and features are needed to implement this approach. The following interface file code should be placed before SWIG parses the above C code.

    %module example
    
    // Do not generate the default proxy constructor or destructor
    %nodefaultctor Butler;
    %nodefaultdtor Butler;
    
    // Add in pure Java code proxy constructor
    %typemap(javacode) Butler %{
      /** This constructor creates the proxy which initially does not create nor own any C memory */
      public Butler() {
        this(0, false);
      }
    %}
    
    // Type typemaps for marshalling Butler **
    %typemap(jni) Butler ** "jobject"
    %typemap(jtype) Butler ** "Butler"
    %typemap(jstype) Butler ** "Butler"
    
    // Typemaps for Butler ** as a parameter output type
    %typemap(in) Butler ** (Butler *ppButler = 0) %{
      $1 = &ppButler;
    %}
    %typemap(argout) Butler ** {
      // Give Java proxy the C pointer (of newly created object)
      jclass clazz = (*jenv)->FindClass(jenv, "Butler");
      jfieldID fid = (*jenv)->GetFieldID(jenv, clazz, "swigCPtr", "J");
      jlong cPtr = 0;
      *(Butler **)&cPtr = *$1;
      (*jenv)->SetLongField(jenv, $input, fid, cPtr);
    }
    %typemap(javain) Butler ** "$javainput"
    

    Note that the JNI code sets the proxy's swigCPtr member variable to point to the newly created object. The swigCMemOwn remains unchanged (at false), so that the proxy does not own the memory.

    Note: The old %nodefault directive disabled the default constructor and destructor at the same time. This is unsafe in most of the cases, and you can use the explicit %nodefaultctor and %nodefaultdtor directives to achieve the same result if needed.

    The second approach offers a more object oriented interface to the Java user. We do this by making the Java proxy class's constructor call the HireButler() method to create the underlying C object. Additionally we get the proxy to take ownership of the memory so that the finalizer will call the FireButler() function. The proxy class will thus take ownership of the memory and clean it up when no longer needed. We will also prevent the user from being able to explicitly call the HireButler() and FireButler() functions. Usage from Java will simply be:

    Butler jeeves = new Butler();
    System.out.println("Greeting:     " + jeeves.getGreeting());
    System.out.println("Availability: " + jeeves.getHoursAvailable() + " hours per day");
    

    Note that the Butler class is used just like any other Java class and no extra coding by the user needs to be written to clear up the underlying C memory as the finalizer will be called by the garbage collector which in turn will call the FireButler() function. To implement this, we use the above interface file code but remove the javacode typemap and add the following:

    // Don't expose the memory allocation/de-allocation functions
    %ignore FireButler(Butler *pButler);
    %ignore HireButler(Butler **ppButler);
    
    // Add in a custom proxy constructor and destructor
    %extend Butler {
      Butler() {
        Butler *pButler = 0;
        HireButler(&pButler);
        return pButler;
      }
      ~Butler() {
        FireButler($self);
      }
    }
    

    Note that the code in %extend is using a C++ type constructor and destructor, yet the generated code will still compile as C code, see Adding member functions to C structures. The C functional interface has been completely morphed into an object-oriented interface and the Butler class would behave much like any pure Java class and feel more natural to Java users.

    26.10.11 Memory management when returning references to member variables

    This example shows how to prevent premature garbage collection of objects when the underlying C++ class returns a pointer or reference to a member variable.

    Consider the following C++ code:

    struct Wheel {
      int size;
      Wheel(int sz = 0) : size(sz) {}
    };
    
    class Bike {
      Wheel wheel;
    public:
      Bike(int val) : wheel(val) {}
      Wheel& getWheel() { return wheel; }
    };
    

    and the following usage from Java after running the code through SWIG:

    Wheel wheel = new Bike(10).getWheel();
    System.out.println("wheel size: " + wheel.getSize());
    // Simulate a garbage collection
    System.gc();
    System.runFinalization();
    System.out.println("wheel size: " + wheel.getSize());
    

    Don't be surprised that if the resulting output gives strange results such as...

    wheel size: 10
    wheel size: 135019664
    

    What has happened here is the garbage collector has collected the Bike instance as it doesn't think it is needed any more. The proxy instance, wheel, contains a reference to memory that was deleted when the Bike instance was collected. In order to prevent the garbage collector from collecting the Bike instance a reference to the Bike must be added to the wheel instance. You can do this by adding the reference when the getWheel() method is called using the following typemaps.

    %typemap(javacode) Wheel %{
      // Ensure that the GC doesn't collect any Bike instance set from Java
      private Bike bikeReference;
      protected void addReference(Bike bike) {
        bikeReference = bike;
      }
    %}
    
    // Add a Java reference to prevent premature garbage collection and resulting use
    // of dangling C++ pointer. Intended for methods that return pointers or
    // references to a member variable.
    %typemap(javaout) Wheel& getWheel {
      long cPtr = $jnicall;
      $javaclassname ret = null;
      if (cPtr != 0) {
        ret = new $javaclassname(cPtr, $owner);
        ret.addReference(this);
      }
      return ret;
      }
    

    The code in the first typemap gets added to the Wheel proxy class. The code in the second typemap constitutes the bulk of the code in the generated getWheel() function:

    public class Wheel {
      ...
      // Ensure that the GC doesn't collect any bike set from Java 
      private Bike bikeReference;
      protected void addReference(Bike bike) {
        bikeReference = bike;
      }
    }
    
    public class Bike {
      ...
      public Wheel getWheel() {
        long cPtr = exampleJNI.Bike_getWheel(swigCPtr, this);
        Wheel ret = null;
        if (cPtr != 0) {
          ret = new Wheel(cPtr, false);
          ret.addReference(this);
        }
        return ret;
      }
    }
    

    Note the addReference call.

    26.10.12 Memory management for objects passed to the C++ layer

    Managing memory can be tricky when using C++ and Java proxy classes. The previous example shows one such case and this example looks at memory management for a class passed to a C++ method which expects the object to remain in scope after the function has returned. Consider the following two C++ classes:

    struct Element {
      int value;
      Element(int val) : value(val) {}
    };
    class Container {
      Element* element;
    public:
      Container() : element(0) {}
      void setElement(Element* e) { element = e; }
      Element* getElement() { return element; }
    };
    

    and usage from C++

    Container container;
    Element element(20);
    container.setElement(&element);
    cout << "element.value: " << container.getElement()->value << endl;
    

    and more or less equivalent usage from Java

    Container container = new Container();
    container.setElement(new Element(20));
    System.out.println("element value: " + container.getElement().getValue());
    

    The C++ code will always print out 20, but the value printed out may not be this in the Java equivalent code. In order to understand why, consider a garbage collection occurring...

    Container container = new Container();
    container.setElement(new Element(20));
    // Simulate a garbage collection
    System.gc();
    System.runFinalization();
    System.out.println("element value: " + container.getElement().getValue());
    

    The temporary element created with new Element(20) could get garbage collected which ultimately means the container variable is holding a dangling pointer, thereby printing out any old random value instead of the expected value of 20. One solution is to add in the appropriate references in the Java layer...

    public class Container {
    
      ...
    
      // Ensure that the GC doesn't collect any Element set from Java
      // as the underlying C++ class stores a shallow copy
      private Element elementReference;
    
      public void setElement(Element e) {
        exampleJNI.Container_setElement(swigCPtr, this, Element.getCPtr(e), e);
        elementReference = e;
      }
    }
    

    The following typemaps can be used to generate this code:

    %typemap(javacode) Container %{
      // Ensure that the GC doesn't collect any element set from Java
      // as the underlying C++ class stores a shallow copy
      private Element elementReference;
    %}
    
    %typemap(javain, 
             post="      elementReference = $javainput;"
             ) Element *e "Element.getCPtr($javainput)"
    

    The 'javacode' typemap simply adds in the specified code into the Java proxy class. The 'javain' typemap matches the input parameter type and name for the setElement method and the 'post' typemap attribute allows adding code after the JNI call. The 'post' code is generated into a finally block after the JNI call so the resulting code isn't quite as mentioned earlier, setElement is actually:

      public void setElement(Element e) {
        try {
          exampleJNI.Container_setElement(swigCPtr, this, Element.getCPtr(e), e);
        } finally {
          elementReference = e;
        }
      }
    

    26.10.13 Date marshalling using the javain typemap and associated attributes

    The NaN Exception example is a simple example of the "javain" typemap and its 'pre' attribute. This example demonstrates how a C++ date class, say CDate, can be mapped onto the standard Java date class, java.util.GregorianCalendar by using the 'pre', 'post' and 'pgcppname' attributes of the "javain" typemap. The idea is that the GregorianCalendar is used wherever the C++ API uses a CDate. Let's assume the code being wrapped is as follows:

    class CDate {
    public:
      CDate(int year, int month, int day);
      int getYear();
      int getMonth();
      int getDay();
      ...
    };
    struct Action {
      static int doSomething(const CDate &dateIn, CDate &dateOut);
      Action(const CDate &date, CDate &dateOut);
    };
    

    Note that dateIn is const and therefore read only and dateOut is a non-const output type.

    First let's look at the code that is generated by default, where the Java proxy class CDate is used in the proxy interface:

    public class Action {
      ...
      public static int doSomething(CDate dateIn, CDate dateOut) {
        return exampleJNI.Action_doSomething(CDate.getCPtr(dateIn), dateIn, 
                                             CDate.getCPtr(dateOut), dateOut);
      }
    
      public Action(CDate date, CDate dateOut) {
        this(exampleJNI.new_Action(CDate.getCPtr(date), date, 
                                   CDate.getCPtr(dateOut), dateOut), true);
      }
    }
    

    The CDate & and const CDate & Java code is generated from the following two default typemaps:

    %typemap(jstype) SWIGTYPE & "$javaclassname"
    %typemap(javain) SWIGTYPE & "$javaclassname.getCPtr($javainput)"
    

    where '$javaclassname' is translated into the proxy class name, CDate and '$javainput' is translated into the name of the parameter, eg dateIn. From Java, the intention is then to call into a modified API with something like:

    java.util.GregorianCalendar calendarIn = 
      new java.util.GregorianCalendar(2011, java.util.Calendar.APRIL, 13, 0, 0, 0);
    java.util.GregorianCalendar calendarOut = new java.util.GregorianCalendar();
    
    // Note in calls below, calendarIn remains unchanged and calendarOut 
    // is set to a new value by the C++ call
    Action.doSomething(calendarIn, calendarOut);
    Action action = new Action(calendarIn, calendarOut);
    

    To achieve this mapping, we need to alter the default code generation slightly so that at the Java layer, a GregorianCalendar is converted into a CDate. The JNI intermediary layer will still take a pointer to the underlying CDate class. The typemaps to achieve this are shown below.

    %typemap(jstype) const CDate& "java.util.GregorianCalendar"
    %typemap(javain, 
             pre="    CDate temp$javainput = new CDate($javainput.get(java.util.Calendar.YEAR), "
                 "$javainput.get(java.util.Calendar.MONTH), $javainput.get(java.util.Calendar.DATE));", 
             pgcppname="temp$javainput") const CDate &
             "$javaclassname.getCPtr(temp$javainput)"
    
    %typemap(jstype) CDate& "java.util.Calendar"
    %typemap(javain, 
             pre="    CDate temp$javainput = new CDate($javainput.get(java.util.Calendar.YEAR), "
                 "$javainput.get(java.util.Calendar.MONTH), $javainput.get(java.util.Calendar.DATE));", 
             post="      $javainput.set(temp$javainput.getYear(), temp$javainput.getMonth(), "
                  "temp$javainput.getDay(), 0, 0, 0);", 
             pgcppname="temp$javainput") CDate &
             "$javaclassname.getCPtr(temp$javainput)"
    

    The resulting generated proxy code in the Action class follows:

    public class Action {
      ...
      public static int doSomething(java.util.GregorianCalendar dateIn, 
                                    java.util.Calendar dateOut) {
        CDate tempdateIn = new CDate(dateIn.get(java.util.Calendar.YEAR), 
                                     dateIn.get(java.util.Calendar.MONTH), 
                                     dateIn.get(java.util.Calendar.DATE));
        CDate tempdateOut = new CDate(dateOut.get(java.util.Calendar.YEAR), 
                                      dateOut.get(java.util.Calendar.MONTH), 
                                      dateOut.get(java.util.Calendar.DATE));
        try {
          return exampleJNI.Action_doSomething(CDate.getCPtr(tempdateIn), tempdateIn, 
                                               CDate.getCPtr(tempdateOut), tempdateOut);
        } finally {
          dateOut.set(tempdateOut.getYear(), tempdateOut.getMonth(), tempdateOut.getDay(), 0, 0, 0);
        }
      }
    
      static private long SwigConstructAction(java.util.GregorianCalendar date, 
                                              java.util.Calendar dateOut) {
        CDate tempdate = new CDate(date.get(java.util.Calendar.YEAR), 
                                   date.get(java.util.Calendar.MONTH), 
                                   date.get(java.util.Calendar.DATE));
        CDate tempdateOut = new CDate(dateOut.get(java.util.Calendar.YEAR), 
                                      dateOut.get(java.util.Calendar.MONTH), 
                                      dateOut.get(java.util.Calendar.DATE));
        try {
          return exampleJNI.new_Action(CDate.getCPtr(tempdate), tempdate, 
                                       CDate.getCPtr(tempdateOut), tempdateOut);
        } finally {
          dateOut.set(tempdateOut.getYear(), tempdateOut.getMonth(), tempdateOut.getDay(), 0, 0, 0);
        }
      }
    
      public Action(java.util.GregorianCalendar date, java.util.Calendar dateOut) {
        this(Action.SwigConstructAction(date, dateOut), true);
      }
    }
    

    A few things to note:

    • The "javatype" typemap has changed the parameter type to java.util.GregorianCalendar or java.util.Calendar instead of the default generated CDate proxy.
    • The code in the 'pre' attribute appears before the JNI call (exampleJNI.new_Action / exampleJNI.Action_doSomething).
    • The code in the 'post' attribute appears after the JNI call.
    • A try .. finally block is generated with the JNI call in the try block and 'post' code in the finally block. The alternative of just using a temporary variable for the return value from the JNI call and the 'post' code being generated before the return statement is not possible given that the JNI call is in one line and comes from the "javaout" typemap.
    • The temporary variables in the "javain" typemaps are called temp$javain, where "$javain" is replaced with the parameter name. "$javain" is used to mangle the variable name so that more than one CDate & type can be used as a parameter in a method, otherwise two or more local variables with the same name would be generated.
    • The use of the "javain" typemap causes a constructor helper function (SwigConstructAction) to be generated. This allows Java code to be called before the JNI call and is required as the Java compiler won't compile code inserted before the 'this' call.
    • The 'pgcppname' attribute is used to modify the object being passed as the premature garbage collection prevention parameter (the 2nd and 4th parameters in the JNI calls).

    26.11 Living with Java Directors

    This section is intended to address frequently asked questions and frequently encountered problems when using Java directors.

    1. When my program starts up, it complains that method_foo cannot be found in a Java method called swig_module_init. How do I fix this?

      Open up the C++ wrapper source code file and look for "method_foo" (include the double quotes, they are important!) Look at the JNI field descriptor and make sure that each class that occurs in the descriptor has the correct package name in front of it. If the package name is incorrect, put a "javapackage" typemap in your SWIG interface file.

    2. I'm compiling my code and I'm using templates. I provided a javapackage typemap, but SWIG doesn't generate the right JNI field descriptor.

      Use the template's renamed name as the argument to the "javapackage" typemap:

      %typemap(javapackage)  std::vector<int>  "your.package.here"
      %template(VectorOfInt) std::vector<int>;
      
    3. When I pass class pointers or references through a C++ upcall and I try to type cast them, Java complains with a ClassCastException. What am I doing wrong?

      Normally, a non-director generated Java proxy class creates temporary Java objects as follows:

      public static void MyClass_method_upcall(MyClass self, long jarg1)
      {
        Foo darg1 = new Foo(jarg1, false);
      
        self.method_upcall(darg1);
      }
      

      Unfortunately, this loses the Java type information that is part of the underlying Foo director proxy class's Java object pointer causing the type cast to fail. The SWIG Java module's director code attempts to correct the problem, but only for director-enabled classes, since the director class retains a global reference to its Java object. Thus, for director-enabled classes and only for director-enabled classes, the generated proxy Java code looks something like:

      public static void MyClass_method_upcall(MyClass self, long jarg1,
                                               Foo jarg1_object)
      {
        Foo darg1 = (jarg1_object != null ? jarg1_object : new Foo(jarg1, false));
      
        self.method_upcall(darg1);
      }
      

      When you import a SWIG interface file containing class definitions, the classes you want to be director-enabled must be have the feature("director") enabled for type symmetry to work. This applies even when the class being wrapped isn't a director-enabled class but takes parameters that are director-enabled classes.

      The current "type symmetry" design will work for simple C++ inheritance, but will most likely fail for anything more complicated such as tree or diamond C++ inheritance hierarchies. Those who are interested in challenging problems are more than welcome to hack the Java::Java_director_declaration method in Source/Modules/java.cxx.

      If all else fails, you can use the downcastXXXXX() method to attempt to recover the director class's Java object pointer. For the Java Foo proxy class, the Foo director class's java object pointer can be accessed through the javaObjectFoo() method. The generated method's signature is:

        public static Foo javaObjectFoo(Foo obj);
      

      From your code, this method is invoked as follows:

      public class MyClassDerived {
        public void method_upcall(Foo foo_object)
        {
          FooDerived    derived = (foo_object != null ?
                       (FooDerived) Foo.downcastFoo(foo_object) : null);
          /* rest of your code here */
        }
      }
      

      An good approach for managing downcasting is placing a static method in each derived class that performs the downcast from the superclass, e.g.,

      public class FooDerived extends Foo {
        /* ... */
        public static FooDerived downcastFooDerived(Foo foo_object)
        {
          try {
            return foo_object != null ? (FooDerived) Foo.downcastFoo(foo_object);
          }
      
          catch (ClassCastException exc) {
            // Wasn't a FooDerived object, some other subclass of Foo
            return null;
          }
        }
      }
      

      Then change the code in MyClassDerived as follows:

      public class MyClassDerived extends MyClass {
        /* ... */
        public void method_upcall(Foo foo_object)
        {
          FooDerived    derived = FooDerived.downcastFooDerived(foo_object);
          /* rest of your code here */
        }
      }
      
    4. Why isn't the proxy class declared abstract? Why aren't the director upcall methods in the proxy class declared abstract?

      Declaring the proxy class and its methods abstract would break the JNI argument marshalling and SWIG's downcall functionality (going from Java to C++.) Create an abstract Java subclass that inherits from the director-enabled class instead. Using the previous Foo class example:

      public abstract class UserVisibleFoo extends Foo {
        /** Make sure user overrides this method, it's where the upcall
         * happens.
         */
        public abstract void method_upcall(Foo foo_object);
      
        /// Downcast from Foo to UserVisibleFoo
        public static UserVisibleFoo downcastUserVisibleFoo(Foo foo_object)
        {
          try {
            return foo_object != null ? (FooDerived) Foo.downcastFoo(foo_object) : null;
          } catch (ClassCastException exc) {
            // Wasn't a FooDerived object, some other subclass of Foo
            return null;
          }
        }
      }
      

      This doesn't prevent the user from creating subclasses derived from Foo, however, UserVisibleFoo provides the safety net that reminds the user to override the method_upcall() method.

    26.12 Odds and ends

    26.12.1 JavaDoc comments

    The SWIG documentation system is currently deprecated. When it is resurrected JavaDoc comments will be fully supported. If you can't wait for the full documentation system a couple of workarounds are available. The %javamethodmodifiers feature can be used for adding proxy class method comments and module class method comments. The "javaimports" typemap can be hijacked for adding in proxy class JavaDoc comments. The jniclassimports or jniclassclassmodifiers pragmas can also be used for adding intermediary JNI class comments and likewise the moduleimports or moduleclassmodifiers pragmas for the module class. Here is an example adding in a proxy class and method comment:

    %javamethodmodifiers Barmy::lose_marbles() "
      /**
        * Calling this method will make you mad.
        * Use with <b>utmost</b> caution. 
        */
      public";
    
    %typemap(javaimports) Barmy "
    /** The crazy class. Use as a last resort. */"
    
    class Barmy {
    public:
      void lose_marbles() {}
    };
    

    Note the "public" added at the end of the %javamethodmodifiers as this is the default for this feature. The generated proxy class with JavaDoc comments is then as follows:

    /** The crazy class. Use as a last resort. */
    public class Barmy {
    ...
      /**
        * Calling this method will make you mad.
        * Use with <b>utmost</b> caution. 
        */
      public void lose_marbles() {
        ...
      }
    ...
    }
    

    26.12.2 Functional interface without proxy classes

    It is possible to run SWIG in a mode that does not produce proxy classes by using the -noproxy commandline option. The interface is rather primitive when wrapping structures or classes and is accessed through function calls to the module class. All the functions in the module class are wrapped by functions with identical names as those in the intermediary JNI class.

    Consider the example we looked at when examining proxy classes:

    class Foo {
    public:
      int x;
      int spam(int num, Foo* foo);
    };
    

    When using -noproxy, type wrapper classes are generated instead of proxy classes. Access to all the functions and variables is through a C like set of functions where the first parameter passed is the pointer to the class, that is an instance of a type wrapper class. Here is what the module class looks like:

    public class example {
      public static void Foo_x_get(SWIGTYPE_p_Foo self, int x) {...}
      public static int Foo_x_get(SWIGTYPE_p_Foo self) {...}
      public static int Foo_spam(SWIGTYPE_p_Foo self, int num, SWIGTYPE_p_Foo foo) {...}
      public static SWIGTYPE_p_Foo new_Foo() {...}
      public static void delete_Foo(SWIGTYPE_p_Foo self) {...}
    }
    

    This approach is not nearly as natural as using proxy classes as the functions need to be used like this:

    SWIGTYPE_p_Foo foo = example.new_Foo();
    example.Foo_x_set(foo, 10);
    int var = example.Foo_x_get(foo);
    example.Foo_spam(foo, 20, foo);
    example.delete_Foo(foo);
    

    Unlike proxy classes, there is no attempt at tracking memory. All destructors have to be called manually for example the delete_Foo(foo) call above.

    26.12.3 Using your own JNI functions

    You may have some hand written JNI functions that you want to use in addition to the SWIG generated JNI functions. Adding these to your SWIG generated package is possible using the %native directive. If you don't want SWIG to wrap your JNI function then of course you can simply use the %ignore directive. However, if you want SWIG to generate just the Java code for a JNI function then use the %native directive. The C types for the parameters and return type must be specified in place of the JNI types and the function name must be the native method name. For example:

    %native (HandRolled) void HandRolled(int, char *);
    %{
    JNIEXPORT void JNICALL Java_packageName_moduleName_HandRolled(JNIEnv *, jclass,
                                                                  jlong, jstring);
    %}
    

    No C JNI function will be generated and the Java_packageName_moduleName_HandRolled function will be accessible using the SWIG generated Java native method call in the intermediary JNI class which will look like this:

      public final static native void HandRolled(int jarg1, String jarg2);
    

    and as usual this function is wrapped by another which for a global C function would appear in the module class:

      public static void HandRolled(int arg0, String arg1) {
        exampleJNI.HandRolled(arg0, arg1);
      }
    

    The packageName and moduleName must of course be correct else you will get linker errors when the JVM dynamically loads the JNI function. You may have to add in some "jtype", "jstype", "javain" and "javaout" typemaps when wrapping some JNI types. Here the default typemaps work for int and char *.

    In summary the %native directive is telling SWIG to generate the Java code to access the JNI C code, but not the JNI C function itself. This directive is only really useful if you want to mix your own hand crafted JNI code and the SWIG generated code into one Java class or package.

    26.12.4 Performance concerns and hints

    If you're directly manipulating huge arrays of complex objects from Java, performance may suffer greatly when using the array functions in arrays_java.i. Try and minimise the expensive JNI calls to C/C++ functions, perhaps by using temporary Java variables instead of accessing the information directly from the C/C++ object.

    Java classes without any finalizers generally speed up code execution as there is less for the garbage collector to do. Finalizer generation can be stopped by using an empty javafinalize typemap:

    %typemap(javafinalize) SWIGTYPE ""
    

    However, you will have to be careful about memory management and make sure that you code in a call to the delete() member function. This method normally calls the C++ destructor or free() for C code.

    26.12.5 Debugging

    The generated code can be debugged using both a Java debugger and a C++ debugger using the usual debugging techniques. Breakpoints can be set in either Java or C++ code and so both can be debugged simultaneously. Most debuggers do not understand both Java and C++, with one noteable exception of Sun Studio, where it is possible to step from Java code into a JNI method within one environment.

    Alternatively, debugging can involve placing debug printout statements in the JNI layer using the %exception directive. See the special variables for %exception section. Many of the default typemaps can also be overridden and modified for adding in extra logging/debug display information.

    The -Xcheck:jni and -Xcheck:nabounds Java executable options are useful for debugging to make sure the JNI code is behaving. The -verbose:jni and -verbose:gc are also useful options for monitoring code behaviour.

    26.13 Java Examples

    The directory Examples/java has a number of further examples. Take a look at these if you want to see some of the techniques described in action. The Examples/index.html file in the parent directory contains the SWIG Examples Documentation and is a useful starting point. If your SWIG installation went well Unix users should be able to type make in each example directory, then java main to see them running. For the benefit of Windows users, there are also Visual C++ project files in a couple of the Windows Examples. There are also many regression tests in the Examples/test-suite directory. Many of these have runtime tests in the java subdirectory.

    swig-4.0.1/Doc/Manual/Scilab.html0000644000175000017500000015045513527234053016366 0ustar williamwilliam SWIG and Scilab

    35 SWIG and Scilab

    Scilab is a scientific software package for numerical computations providing a powerful open computing environment for engineering and scientific applications that is mostly compatible with MATLAB. More information can be found at www.scilab.org.

    This chapter explains how to use SWIG for Scilab. After this introduction, you should be able to generate with SWIG a Scilab external module from a C/C++ library.

    35.1 Preliminaries

    SWIG for Scilab supports Linux. Other operating systems haven't been tested.

    Scilab is supported from version 5.3.3 onwards. The forthcoming version 6, as of January 2015, is also supported.

    SWIG for Scilab supports C language. C++ is partially supported. See A basic tour of C/C++ wrapping for further details.

    35.2 Running SWIG

    Let's see how to use SWIG for Scilab on a small example.
    In this example we bind from C a function and a global variable into Scilab. The SWIG interface (stored in a file named example.i), is the following:

    %module example
    
    %inline %{
    double Foo = 3.0;
    
    int fact(int n) {
      if (n < 0) {
        return 0;
      }
      else if (n == 0) {
        return 1;
      }
      else {
        return n * fact(n-1);
      }
    }
    %}
    

    Note: a code in an %inline section is both parsed and wrapped by SWIG, and inserted as is in the wrapper source file.

    35.2.1 Generating the module

    The module is generated using the swig executable and its -scilab option.

    $ swig -scilab example.i
    

    This command generates two files:

    • example_wrap.c: a C source file containing the wrapping code and also here the wrapped code (the fact() and Foo definitions)
    • loader.sce: a Scilab script used to load the module into Scilab

    Note: if the following error is returned:

    :1: Error: Unable to find 'swig.swg'
    :3: Error: Unable to find 'scilab.swg'
    

    it may be because the SWIG library is not found. Check the SWIG_LIB environment variable or your SWIG installation.

    Note: SWIG for Scilab can work in two modes related to the way the module is built, see the Building modes section for details. This example uses the builder mode.

    The swig executable has several other command line options you can use. See Scilab command line options for further details.

    35.2.2 Building the module

    To be loaded in Scilab, the wrapper has to be built into a dynamic module (or shared library).

    The commands to compile and link the wrapper (with gcc) into the shared library libexample.so are:

    $ gcc -fPIC -c -I/usr/local/include/scilab example_wrap.c
    $ gcc -shared example_wrap.o -o libexample.so
    

    Note: we supposed in this example that the path to the Scilab include directory is /usr/local/include/scilab (which is the case in a Debian environment), this should be changed for another environment.

    35.2.3 Loading the module

    Loading a module is done by running the loader script in Scilab:

    --> exec loader.sce
    

    Scilab should output the following messages:

    Shared archive loaded.
    Link done.
    

    which means that Scilab has successfully loaded the shared library. The module functions and other symbols are now available in Scilab.

    35.2.4 Using the module

    In Scilab, the function fact() is simply called as following:

    --> fact(5)
    ans  =
    
        120.
    

    For the Foo global variable, the accessors need to be used:

    --> Foo_get
    ans  =
    
        3.
    
    --> Foo_set(4);
    
    --> Foo_get
    ans  =
    
        4.
    

    Note: for conciseness, we assume in the subsequent Scilab code examples that the modules have been beforehand built and loaded in Scilab.

    35.2.5 Scilab command line options

    The following table lists the Scilab specific command line options in addition to the generic SWIG options:

    -builder Generate the Scilab builder script
    -buildercflags <cflags> Add <cflags> to the builder compiler flags
    -builderldflags <ldflags> Add <ldlags> to the builder linker flags
    -buildersources <files> Add the (comma separated) files <files> to the builder sources
    -builderverbositylevel <level> Set the build verbosity level to <level> (default 0: off, 2: high)
    -builderflagscript <file> Use the Scilab script <file> to configure the compiler and linker flags
    -gatewayxml <gateway_id> Generate the gateway XML with the given <gateway_id>
    -targetversion Generate for Scilab target (major) version

    These options can be displayed with:

    $ swig -scilab -help
    

    35.3 A basic tour of C/C++ wrapping

    35.3.1 Overview

    SWIG for Scilab provides only a low-level C interface for Scilab (see Scripting Languages for the general approach to wrapping). This means that functions, structs, classes, variables, etc... are interfaced through C functions. These C functions are mapped as Scilab functions. There are a few exceptions, such as constants and enumerations, which can be wrapped directly as Scilab variables.

    35.3.2 Identifiers

    In Scilab 5.x, identifier names are composed of 24 characters maximum (this limitation disappears from Scilab 6.0 onwards).
    By default, variable, member, and function names longer than 24 characters are truncated, and a warning is produced for each truncation.

    This can cause ambiguities, especially when wrapping structs/classes, for which the wrapped function name is composed of the struct/class name and field names. In these cases, the %rename directive can be used to choose a different Scilab name.

    Note: truncations can be disabled by specifying the target version 6 of Scilab in the targetversion argument (i.e. -targetversion 6).

    35.3.3 Functions

    Functions are wrapped as new Scilab built-in functions. For example:

    %module example
    
    %inline %{
    int fact(int n) {
      if (n > 1)
        return n * fact(n - 1);
      else
        return 1;
    }
    %}
    

    creates a built-in function fact(n) in Scilab:

    --> fact(4)
    ans  =
    
        24.
    

    35.3.3.1 Argument passing

    In the above example, the function parameter is a primitive type and is marshalled by value. So this function is wrapped without any additional customization. Argument values are converted between C types and Scilab types through type mappings. There are several default type mappings for primitive and complex types, described later in the Scilab typemaps section.

    When a parameter is not passed by value, such as a pointer or reference, SWIG does not know if it is an input, output (or both) parameter. The INPUT, OUTPUT, INOUT typemaps defined in the typemaps.i library can be used to specify this.

    Let's see this on two simple functions: sub() which has an output parameter, and inc(), which as input/output parameter:

    %module example
    
    %include <typemaps.i>
    
    extern void sub(int *INPUT, int *INPUT, int *OUTPUT);
    extern void inc(int *INOUT, int *INPUT);
    
    %{
    void sub(int *x, int *y, int *result) {
      *result = *x - *y;
    }
    void inc(int *x, int *delta) {
      *x = *x + *delta;
    }
    %}
    

    In Scilab, parameters are passed by value. The output (and inout) parameters are returned as the result of the functions:

    --> sub(5, 3)
     ans  =
    
        2.
    
    --> inc(4, 3)
     ans  =
    
        7.
    

    35.3.3.2 Multiple output arguments

    A C function can have several output parameters. They can all be returned as results of the wrapped function as Scilab supports multiple return values from a function when using the typemaps.i library. If the C function itself returns a result, this is returned first before the parameter outputs.

    The example below shows this for a C function returning 2 values and a result:

    %module example
    
    %include <typemaps.i>
    
    int divide(int n, int d, int *OUTPUT, int *OUTPUT);
    
    %{
      int divide(int n, int d, int q*, int *r) {
        if (d != 0) {
          *q = n / d;
          *r = n % d;
          return 1;
        } else {
          return 0;
        }
      }
    %}
    

    --> [ret, q, r] = divide(20, 6)
     r  =
    
        2.
     q  =
    
        3.
     ret  =
    
        1.
    

    35.3.4 Global variables

    Global variables are manipulated through generated accessor functions. For example, for a given Foo global variable, SWIG actually generates two functions: Foo_get() to get the value of Foo, and Foo_set() to set the value. These functions are used as following:

    --> exec loader.sce;
    --> c = Foo_get();
    
    --> Foo_set(4);
    
    --> c
    c =
    
        3.
    
    --> Foo_get()
    ans  =
    
        4.
    

    It works for variables of primitive type, but also for non-primitive types: arrays, and structs/classes which are described later. For now, an example with two global primitive arrays x and y is shown:

    %module example
    
    %inline %{
    int x[10];
    double y[7];
    
    void initArrays()
    {
      int i;
      for (i = 0; i < 10; i++)
        x[i] = 1;
      for (i = 0; i < 7; i++)
        y[i] = 1.0f;
    }
    %}
    

    It works the same:

    --> exec loader.sce
    
    --> initArrays();
    --> x_get()
     ans  =
    
        1.    1.    1.    1.    1.    1.    1.    1.    1.    1.
    
    --> y_set([0:6] / 10);
    --> y_get()
     ans  =
    
        0.    0.1    0.2    0.3    0.4    0.5    0.6
    

    35.3.5 Constants and enumerations

    35.3.5.1 Constants

    There is not any constant in Scilab. By default, C/C++ constants are wrapped as getter functions. For example, for the following constants:

    %module example
    #define    ICONST      42
    #define    FCONST      2.1828
    #define    CCONST      'x'
    #define    CCONST2     '\n'
    #define    SCONST      "Hello World"
    #define    SCONST2     "\"Hello World\""
    

    the following getter functions are generated:

    --> exec loader.sce;
    --> ICONST_get();
     ans  =
    
        42.
    
    --> FCONST_get();
     ans  =
    
        2.1828
    
    --> CCONST_get();
     ans  =
    
        x
    
    --> CCONST2_get();
     ans  =
    
    --> SCONST_get();
     ans  =
    
        Hello World
    
    --> SCONST2_get();
     ans  =
    
        "Hello World"
    
    --> EXPR_get();
     ans  =
    
        48.5484
    
    --> iconst_get();
     ans  =
    
        37.
    
    --> fconst_get();
     ans  =
    
        3.14
    

    There is another mode in which constants are wrapped as Scilab variables. The variables are easier to use than functions, but the drawback is that variables are not constant and so can be modified.

    This mode can be enabled/disabled at any time in the interface file with %scilabconst(), which works like all the other %feature directives. Use the argument value "1" to enable and "0" to disable this mode. For example in this mode the previous constants:

    %module example
    
    %scilabconst(1);
    #define    ICONST      42
    #define    FCONST      2.1828
    #define    CCONST      'x'
    #define    CCONST2     '\n'
    #define    SCONST      "Hello World"
    #define    SCONST2     "\"Hello World\""
    

    are mapped to Scilab variables, with the same name:

    --> exec loader.sce;
    --> ICONST
     ans  =
    
        42
    
    --> FCONST
     ans  =
    
        2.1828
    
    --> CCONST
     ans  =
    
        x
    
    --> CCONST2
     ans  =
    
    --> SCONST
     ans  =
    
        Hello World
    
    --> SCONST2
     ans  =
    
        "Hello World"
    
    --> EXPR
     ans  =
    
        48.5484
    
    --> iconst
     ans  =
    
        37
    
    --> fconst
     ans  =
    
        3.14
    

    35.3.5.2 Enumerations

    The wrapping of enums is the same as for constants. By default, enums are wrapped as getter functions. For example, with the following enumeration:

    %module example
    typedef enum { RED, BLUE, GREEN } color;
    

    a getter function will be generated for each value of the enumeration:

    --> exec loader.sce;
    --> RED_get()
     ans  =
    
        0.
    
    --> BLUE_get()
     ans  =
    
        1.
    
    --> GREEN_get()
     ans  =
    
        2.
    

    The %scilabconst() feature is also available for enumerations:

    %module example
    %scilabconst(1) color;
    typedef enum { RED, BLUE, GREEN } color;
    

    --> exec loader.sce;
    --> RED
     ans  =
    
        0.
    
    --> BLUE
     ans  =
    
        1.
    
    --> GREEN
     ans  =
    
        2.
    
    

    35.3.6 Pointers

    Pointers are supported by SWIG. A pointer can be returned from a wrapped C/C++ function, stored in a Scilab variable, and used in input argument of another C/C++ function.

    Also, thanks to the SWIG runtime which stores information about types, pointer types are tracked between exchanges Scilab and the native code. Indeed pointer types are stored alongside the pointer address. A pointer is mapped to a Scilab structure (tlist), which contains as fields the pointer address and the pointer type (in fact a pointer to the type information structure in the SWIG runtime).
    Why a native pointer is not mapped to a Scilab pointer (type name: "pointer", type ID: 128) ? The big advantage of mapping to a tlist is that it exposes a new type for the pointer in Scilab, type which can be acessed in Scilab with the typeof function, and manipulated using the overloading mechanism.

    Notes:

    • type tracking needs the SWIG runtime to be first initialized with the appropriate function (see the Module initialization section).
    • for any reason, if a wrapped pointer type is unknown (or if the SWIG runtime is not initialized), SWIG maps it to a Scilab pointer. Also, a Scilab pointer is always accepted as a pointer argument of a wrapped function. The drawaback is that pointer type is lost.

    Following is an example of the wrapping of the C FILE* pointer:

    %module example
    
    %{
    #include <stdio.h>
    %}
    
    FILE *fopen(const char *filename, const char *mode);
    int fputs(const char *, FILE *);
    int fclose(FILE *);
    

    These functions can be used the same way as in C from Scilab:

    --> example_Init();
    
    --> f = fopen("junk", "w");
    --> typeof(f)
     ans  =
    
      _p_FILE
    
    --> fputs("Hello World", f);
    --> fclose(f);
    

    Note: the type name _p_FILE which means "pointer to FILE".

    The user of a pointer is responsible for freeing it or, like in the example, closing any resources associated with it (just as is required in a C program).

    35.3.6.1 Utility functions

    As a scripting language, Scilab does not provide functions to manipulate pointers. However, in some cases it can be useful, such as for testing or debugging.

    SWIG comes with two pointer utility functions:

    • SWIG_this(): returns the address value of a pointer
    • SWIG_ptr(): creates a pointer from an address value

    Note: a pointer created by SWIG_ptr() does not have any type and is mapped as a Scilab pointer.

    Following we use the utility functions on the previous example:

    --> f = fopen("junk", "w");
    --> fputs("Hello", f);
    --> addr = SWIG_this(f)
     ans  =
    
        8219088.
    
    --> p = SWIG_ptr(addr);
    --> typeof(p)
    ans  =
    
      pointer
    
    --> fputs(" World", p);
    --> fclose(f);
    

    35.3.6.2 Null pointers:

    Using the previous SWIG_this() and SWIG_ptr(), it is possible to create and check null pointers:

    --> p = SWIG_ptr(0);
    --> SWIG_this(p) == 0
     ans  =
    
        T
    

    35.3.7 Structures

    Structs exist in Scilab, but C structs are not (at least in this version of SWIG) mapped to Scilab structs. A C structure is wrapped through low-level accessor functions, i.e. functions that give access to the member variables of this structure. In Scilab, a structure is manipulated through a pointer which is passed as an argument to the accessor functions.

    Let's see it on an example of a struct with two members:

    %module example
    
    %inline %{
    
    typedef struct {
      int x;
      int arr[4];
    } Foo;
    
    %}
    

    Several functions are generated:

    • a constructor function new_Foo() which returns a pointer to a newly created struct Foo.
    • two member getter functions Foo_x_get(), Foo_arr_get(), to get the values of x and y for the struct pointer (provided as the first parameter to these functions)
    • two member setter functions Foo_x_set(), Foo_arr_set(), to set the values of x and y for the struct pointer (provided as the first parameter to these functions).
    • a destructor function delete_Foo() to release the struct pointer.

    Usage example:

    --> f = new_Foo();
    --> Foo_x_set(f, 100);
    --> Foo_x_get(f)
    ans  =
    
        100.
    
    --> Foo_arr_set(f, [0:3]);
    --> Foo_arr_get(f)
    ans  =
    
        0.    1.    2.    3.
    
    --> delete_Foo(f);
    

    Members of a structure that are also structures are also accepted and wrapped as a pointer:

    %module example
    
    %inline %{
    
    typedef struct {
      int x;
    } Bar;
    
    typedef struct {
      Bar b;
    } Foo;
    
    %}
    

    --> b = new_Bar();
    --> Bar_x_set(b, 20.);
    
    --> f = new_Foo();
    --> Foo_b_set(f, b);
    
    --> b2 = Foo_b_get(f);
    --> Bar_x_get(b2);
    ans  =
    
        20.
    

    Note: the pointer to the struct works as described in Pointers. For example, the type of the struct pointer can be get with typeof, as following:

    --> example_Init();
    --> b = new_Bar();
    --> typeof(b)
     ans  =
    
        _p_Bar
    --> delete_Bar(b);
    

    35.3.8 C++ classes

    Classes do not exist in Scilab. The classes are wrapped the same way as structs. Low-level accessor functions are generated for class members. Also, constructor and destructor functions are generated to create and destroy an instance of the class.

    For example, the following class:

    %module example
    
    %inline %{
    
    class Point {
    public:
      int x, y;
      Point(int _x, int _y) : x(_x), y(_y) {}
      double distance(const Point& rhs) {
        return sqrt(pow(x-rhs.x, 2) + pow(y-rhs.y, 2));
      }
      void set(int _x, int _y) {
        x=_x;
        y=_y;
      }
    };
    
    %}
    

    can be used in Scilab like this:

    --> p1 = Point_new(3, 5);
    --> p2 = Point_new(1, 2);
    --> p1.distance(p2)
    ans  =
    
        3.6056
    
    --> delete_Point(p1);
    --> delete_Point(p2);
    

    Note: like structs, class pointers are mapped as described in Pointers. Let's give an example which shows that each class pointer type is a new type in Scilab that can be used for example (through overloading) to implement a custom print for the Point class:

    --> function %_p_Point_p(p)
    -->     mprintf('[%d, %d]\n', Point_x_get(p), Point_y_get(p));
    --> endfunction
    
    --> example_Init();
    --> p = new_Point(1, 2)
     p  =
    
    [1, 2]
    
    --> delete_Point(p);
    

    35.3.9 C++ inheritance

    Inheritance is supported. SWIG knows the inheritance relationship between classes.

    A function is only generated for the class in which it is actually declared. But if one of its parameters is a class, any instance of a derived class is accepted as the argument.

    This mechanism also applies for accessor functions: they are generated only in the class in which they are defined. But any instance of a derived class can be used as the argument to these accessor functions.

    For example, let's take a base class Shape and two derived classes Circle and Square:

    %module example
    
    %inline %{
    
    class Shape {
    public:
      double x, y;
      void set_location(double _x, double _y) { x = _x; y = _y; }
      virtual double get_perimeter() { return 0; };
    };
    
    class Circle : public Shape {
    public:
      int radius;
      Circle(int _radius): radius(_radius) {};
      virtual double get_perimeter() { return 6.28 * radius; }
    };
    
    class Square : public Shape {
    public:
      int size;
      Square(int _size): size(_size) {};
      virtual double get_perimeter() { return 4 * size; }
    };
    
    %}
    

    To set the location of the Circle, we have to use the function set_location() of the parent Shape. But we can use either use the get_perimeter() function of the parent class or the derived class:

    --> c = new_Circle(3);
    
    --> Shape_set_location(c, 2, 3);
    --> Shape_x_get(c)
     ans  =
    
        2.
    
    --> Circle_get_perimeter(c)
     ans  =
    
        18.84
    
    --> Shape_get_perimeter(c)
     ans  =
    
        18.84
    

    35.3.10 C++ overloading

    As explained in Overloaded functions and methods SWIG provides support for overloaded functions and constructors.

    As SWIG knows pointer types, the overloading works also with pointer types, here is an example with a function magnify overloaded for the previous classes Shape and Circle:

    %module example
    
    void magnify(Square *square, double factor) {
      square->size *= factor;
    };
    
    void magnify(Circle *circle, double factor) {
      square->radius *= factor;
    };
    
    --> example_Init();
    --> c = new_Circle(3);
    --> s = new_Square(2);
    
    --> magnify(c, 10);
    --> Circle_get_radius(c)
     ans  =
    
       30;
    --> magnify(s, 10);
    --> Square_get_size(s)
     ans  =
    
       20;
    

    35.3.11 Pointers, references, values, and arrays

    In C++ objects can be passed by value, pointer, reference, or by an array:

    %module example
    
    %{
    #include <sciprint.h>
    %}
    
    %inline %{
    
    class Foo {
    public:
      Foo(int _x) : x(_x) {}
      int x;
    };
    
    void spam1(Foo *f)  { sciprint("%d\n", f->x); }   // Pass by pointer
    void spam2(Foo &f)  { sciprint("%d\n", f.x); }    // Pass by reference
    void spam3(Foo f)   { sciprint("%d\n", f.x); }    // Pass by value
    void spam4(Foo f[]) { sciprint("%d\n", f[0].x); } // Array of objects
    
    %}
    

    In SWIG, there is no real distinction between these. So in Scilab, it is perfectly legal to do this:

    --> f = new_Foo()
    --> spam1(f)
    3
    --> spam2(f)
    3
    --> spam3(f)
    3
    --> spam4(f)
    3
    

    Similar behaviour occurs for return values. For example, if you had functions like this:

    Foo *spam5();
    Foo &spam6();
    Foo  spam7();
    

    All these functions will return a pointer to an instance of Foo. As the function spam7 returns a value, new instance of Foo has to be allocated, and a pointer on this instance is returned.

    35.3.12 C++ templates

    As in other languages, function and class templates are supported in SWIG Scilab.

    You have to tell SWIG to create wrappers for a particular template instantiation. The %template directive is used for this purpose. For example:

    %module example
    
    template<class T1, class T2, class T3>
    struct triplet {
      T1 first;
      T2 second;
      T3 third;
      triplet(const T1& a, const T2& b, const T3& c) {
        third = a; second = b; third = c;
      }
    };
    
    %template(IntTriplet) triplet<int, int, int>;
    

    Then in Scilab:

    --> t = new_IntTriplet(3, 4, 1);
    
    --> IntTriplet_first_get(t)
     ans  =
    
        3.
    
    --> IntTriplet_second_get(t)
     ans  =
    
        4.
    
    --> IntTriplet_third_get(t)
     ans  =
    
        1.
    
    --> delete_IntTriplet(t);
    

    More details on template support can be found in the templates documentation.

    35.3.13 C++ operators

    C++ operators are partially supported. Operator overloading exists in Scilab, but a C++ operator is not (in this version) wrapped by SWIG as a Scilab operator, but as a function. It is not automatic, you have to rename each operator (with the instruction %rename) with the suitable wrapper name.

    Let's see it with an example of class with two operators + and double():

    %module example
    
    %rename(plus) operator +;
    %rename(toDouble) operator double();
    
    %inline %{
    
    class Complex {
    public:
      Complex(double re, double im) : real(re), imag(im) {};
    
      Complex operator+(const Complex& other) {
        double result_real = real + other.real;
        double result_imaginary = imag + other.imag;
        return Complex(result_real, result_imaginary);
      }
      operator double() { return real; }
    private:
      double real;
      double imag;
    };
    
    %}
    

    --> c1 = new_Complex(3, 7);
    
    --> c2 = Complex_plus(c, new_Complex(1, 1));
    
    --> Complex_toDouble(c2)
     ans  =
    
        4.
    

    35.3.14 C++ namespaces

    SWIG is aware of C++ namespaces, but does not use it for wrappers. The module is not broken into submodules, nor do namespace appear in functions names. All the namespaces are all flattened in the module. For example with one namespace Foo:

    %module example
    
    %inline %{
    
    namespace foo {
      int fact(int n) {
        if (n > 1)
          return n * fact(n-1);
        else
          return 1;
      }
    
      struct Vector {
        double x, y, z;
      };
    };
    
    %}
    
    

    In Scilab, there is no need to the specify the Foo namespace:

    --> fact(3)
     ans  =
    
       6.
    
    --> v = new_Vector();
    --> Vector_x_set(v, 3.4);
    --> Vector_y_get(v)
     ans  =
    
       0.
    

    If your program has more than one namespace, name conflicts can be resolved using %rename. For example:

    %rename(Bar_spam) Bar::spam;
    
    namespace Foo {
      int spam();
    }
    
    namespace Bar {
      int spam();
    }
    

    Note: the nspace feature is not supported.

    35.3.15 C++ exceptions

    Scilab does not natively support exceptions, but has errors. When an exception is thrown, SWIG catches it, and sets a Scilab error. An error message is displayed in Scilab. For example:

    %module example
    
    %inline %{
    void throw_exception() throw(char const *) {
      throw "Bye world !";
    }
    %}
    

    -->throw_exception()
      !--error 999
    SWIG/Scilab: Exception (char const *) occurred: Bye world !
    

    Scilab has a try-catch mechanism (and a similar instruction execstr()) to handle exceptions. It can be used with the lasterror() function as following:

    --> execstr('throw_exception()', 'errcatch');
     ans  =
    
        999.
    
    --> lasterror()
     ans  =
    
        SWIG/Scilab: Exception (char const *) occurred: Bye world !
    

    If the function has a throw exception specification, SWIG can automatically map the exception type and set an appropriate Scilab error message. It works for a few primitive types, and also for STL exceptions (the library std_except.i has to be included to get the STL exception support):

    %module example
    
    %include <std_except.i>
    
    %inline %{
    void throw_int() throw(int) {
      throw 12;
    }
    
    void throw_stl_invalid_arg(int i) throw(std::invalid_argument) {
      if (i < 0)
        throw std::invalid_argument("argument is negative.");
    }
    %}
    

    --> throw_int();
                !--error 999
    SWIG/Scilab: Exception (int) occurred: 12
    
    -->throw_stl_invalid_arg(-1);
                              !--error 999
    SWIG/Scilab: ValueError: argument is negative.
    

    More complex or custom exception types require specific exception typemaps to be implemented in order to specifically handle a thrown type. See the SWIG C++ documentation for more details.

    35.3.16 C++ STL

    The Standard Template Library (STL) is partially supported. See STL for more details.

    35.4 Type mappings and libraries

    35.4.1 Default primitive type mappings

    The following table provides the equivalent Scilab type for C/C++ primitive types.

    C/C++ type Scilab type
    boolboolean
    charstring
    signed chardouble or int8
    unsigned chardouble or uint8
    shortdouble or int16
    unsigned shortdouble or uint16
    intdouble or int32
    unsigned intdouble or uint32
    longdouble or int32
    unsigned longdouble or uint32
    signed long longnot supported in Scilab 5.x
    unsigned long longnot supported in Scilab 5.x
    floatdouble
    doubledouble
    char * or char[]string

    Notes:

    • In Scilab the double type is far more used than any integer type. This is why integer values (int32, uint32, ...) are automatically converted to Scilab double values when marshalled from C into Scilab. Additionally on input to a C function, Scilab double values are converted into the related integer type.
    • When an integer is expected, if the input is a double, the value must be an integer, i.e. it must not have any decimal part, otherwise a SWIG value error occurs.
    • In SWIG for Scilab 5.x, the long long type is not supported, since Scilab 5.x does not have a 64-bit integer type. The default behaviour is for SWIG to generate code that will give a runtime error if long long type arguments are used from Scilab.

    35.4.2 Arrays

    Typemaps are available by default for arrays. Primitive type arrays are automatically converted to/from Scilab matrices. Typemaps are also provided to handle members of a struct or class that are arrays.

    In input, the matrix is usually one-dimensional (it can be either a row or column vector). But it can also be a two-dimensional matrix. Warning: in Scilab, the values are column-major ordered, unlike in C, which is row-major ordered.

    The type mappings used for arrays is the same for primitive types, described earlier. This means that, if needed, a Scilab double vector is converted in input into the related C integer array and this C integer array is automatically converted on output into a Scilab double vector. Note that unlike scalars, no control is done for arrays when a double is converted into an integer.

    The following example illustrates all this:

    %module example
    
    %#include <stdio.h>
    
    %inline %{
    
    void printArray(int values[], int len) {
      int i = 0;
      for (i = 0; i < len; i++) {
        printf("%s %d %s", i==0?"[":"", values[i], i==len-1?"]\n":"");
      }
    }
    %}
    

    --> printArray([0 1 2 3], 4)
    [ 0  1  2  3 ]
    
    --> printArray([0.2; -1.8; 2; 3.7], 4)
    [ 0  -1  2  3 ]
    
    --> printArray([0 1; 2 3], 4)
    [ 0  2  1  3 ]
    
    --> printArray([0; 1; 2; 3], 4)
    [ 0  1  2  3 ]
    

    35.4.3 Pointer-to-pointers

    There are no specific typemaps for pointer-to-pointers, they are mapped as pointers in Scilab.

    Pointer-to-pointers are sometimes used to implement matrices in C. The following is an example of this:

    %module example
    %inline %{
    
    // Returns the matrix [1 2; 3 4];
    double **create_matrix() {
      double **M;
      int i;
      M = (double **) malloc(2 * sizeof(double *));
      for (i = 0; i < 2; i++) {
        M[i] = (double *) malloc(2 * sizeof(double));
        M[i][0] = 2 * i + 1;
        M[i][1] = 2 * i + 2;
      }
      return M;
    }
    
    // Gets the item M(i, j) value
    double get_matrix(double **M, int i, int j) {
      return M[i][j];
    }
    
    // Sets the item M(i, j) value to be val
    void set_matrix(double **M, int i, int j, double val) {
      M[i][j] = val;
    }
    
    // Prints a matrix (2, 2) to console
    void print_matrix(double **M, int nbRows, int nbCols) {
      int i, j;
      for (i = 0; i < 2; i++) {
        for (j = 0; j < 2; j++) {
          printf("%3g ", M[i][j]);
        }
        printf("\n");
      }
    }
    
    %}
    

    These functions are used like this in Scilab:

    --> m = create_matrix();
    
    --> print_matrix(m);
       1.   2.
       3.   4.
    
    --> set_matrix(m, 1, 1, 5.);
    
    --> get_matrix(m, 1, 1)
     ans  =
    
        5.
    

    35.4.4 Matrices

    The matrix.i library provides a set of typemaps which can be useful when working with one-dimensional and two-dimensional matrices.

    In order to use this library, just include it in the interface file:

      %include <matrix.i>
    

    Several typemaps are available for the common Scilab matrix types:

    • double
    • int
    • char *
    • bool

    For example: for a matrix of int, we have the typemaps, for input:

    • (int *IN, int IN_ROWCOUNT, int IN_COLCOUNT)
    • (int IN_ROWCOUNT, int IN_COLCOUNT, int *IN)
    • (int *IN, int IN_SIZE)
    • (int IN_SIZE, int *IN)

    and output:

    • (int **OUT, int *OUT_ROWCOUNT, int *OUT_COLCOUNT)
    • (int *OUT_ROWCOUNT, int *OUT_COLCOUNT, int **OUT)
    • (int **OUT, int *OUT_SIZE)
    • (int *OUT_SIZE, int **OUT)

    They marshall a Scilab matrix type into the appropriate 2 or 3 C parameters. The following is an example using the typemaps in this library:

    %module example
    
    %include <matrix.i>
    
    %apply (int *IN, int IN_ROWCOUNT, int IN_COLCOUNT) { (int *matrix, int matrixNbRow, int matrixNbCol) };
    %apply (int **OUT, int *OUT_ROWCOUNT, int *OUT_COLCOUNT) { (int **outMatrix, int *outMatrixNbRow, int *outMatrixNbCol) };
    
    %inline %{
    
    void absolute(int *matrix, int matrixNbRow, int matrixNbCol,
      int **outMatrix, int *outMatrixNbRow, int *outMatrixNbCol) {
      int i, j;
      *outMatrixNbRow = matrixNbRow;
      *outMatrixNbCol = matrixNbCol;
      *outMatrix = malloc(matrixNbRow * matrixNbCol * sizeof(int));
      for (i=0; i < matrixNbRow * matrixNbCol; i++) {
        (*outMatrix)[i] = matrix[i] > 0 ? matrix[i]:-matrix[i];
      }
    }
    
    %}
    

    --> absolute([-0 1 -2; 3 4 -5])
     ans  =
    
        0.    1.    2.
        3.    4.    5.
    

    The remarks made earlier for arrays also apply here:

    • The values of matrices in Scilab are column-major orderered,
    • There is no control while converting double values to integers, double values are truncated without any checking or warning.

    35.4.5 STL

    The STL library wraps some containers defined in the STL (Standard Template Library), so that they can be manipulated in Scilab. This library also provides the appropriate typemaps to use the containers in functions and variables.

    The list of wrapped sequence containers are:

    • std::vector
    • std::list
    • std::deque

    And associative containers are:

    • std::set
    • std::multiset

    Typemaps are available for the following container types:

    • double
    • float
    • int
    • string
    • bool
    • pointer

    Containers of other item types are not supported. Using them does not break compilation, but provokes a runtime error. Containers of enum are not supported yet.

    In order to use the STL, the library must first be included in the SWIG interface file:

    %include <stl.i>
    

    Then for each container used, the appropriate template must be instantiated, in the std namespace:

    namespace std {
        %template(IntVector)    vector<int>;
        %template(DoubleVector) vector<double>;
    }
    

    Additionally, the module initialization function has to be executed first in Scilab, so that all the types are known to Scilab. See the Module initialization section for more details.

    Because in Scilab matrices exist for basic types only, a sequence container of pointers is mapped to a Scilab list. For other item types (double, int, string...) the sequence container is mapped to a Scilab matrix.

    The first example below shows how to create a vector (of int) in Scilab, add some values to the vector and pass it as an argument of a function. It also shows, thanks to the typemaps, that we can also pass a Scilab matrix of values directly into the function:

    %module example
    
    %include <stl.i>
    
    namespace std {
      %template(IntVector) vector<int>;
    }
    
    %{
    #include <numeric>
    %}
    
    %inline %{
    
    double average(std::vector<int> v) {
      return std::accumulate(v.begin(), v.end(), 0.0) / v.size();
    }
    
    %}
    

    --> example_Init();
    
    --> v = new_IntVector();
    
    --> for i = 1:4
    -->     IntVector_push_back(v, i);
    --> end;
    
    --> average(v)
     ans  =
    
        2.5
    
    --> average([0 1 2 3])
     ans  =
    
        2.5
    
    --> delete_IntVector();
    

    In the second example, a set of struct (Person) is wrapped. A function performs a search in this set, and returns a subset. As one can see, the result in Scilab is a list of pointers:

    %module example
    
    %include <stl.i>
    
    %{
    #include <string>
    %}
    
    %inline %{
    
    struct Person {
      Person(std::string _name, int _age) : name(_name), age(_age) {};
      std::string name;
      int age;
    };
    typedef Person * PersonPtr;
    
    %}
    
    namespace std {
      %template(PersonPtrSet) set<PersonPtr>;
    }
    
    %inline %{
    
    std::set<PersonPtr> findPersonsByAge(std::set<PersonPtr> persons, int minAge, int maxAge) {
      std::set<PersonPtr> foundPersons;
      for (std::set<PersonPtr>::iterator it = persons.begin(); it != persons.end(); it++) {
        if (((*it)->age >= minAge) && ((*it)->age <= maxAge)) {
          foundPersons.insert(*it);
        }
      }
      return foundPersons;
    }
    
    %}
    

    --> example_Init();
    
    --> joe = new_Person("Joe", 25);
    --> susan = new_Person("Susan", 32);
    --> bill = new_Person("Bill", 50);
    
    --> p = new_PersonPtrSet();
    --> PersonPtrSet_insert(p, susan);
    --> PersonPtrSet_insert(p, joe);
    --> PersonPtrSet_insert(p, bill);
    
    --> l = findPersonsByAge(p, 20, 40);
    
    --> size(l)
     ans  =
    
        2.
    
    --> Person_name_get(l(1))
    ans  =
    
        Susan
    
    --> Person_name_get(l(2))
     ans  =
    
        Joe
    
    --> delete_PersonPtrSet(p);
    

    35.5 Module initialization

    The wrapped module contains an initialization function to:

    • initialize the SWIG runtime, needed for pointer type tracking or when working with the STL
    • initialize the module constants and enumerations declared with %scilabconst()

    This initialization function should be executed at the start of a script, before the wrapped library has to be used.

    The function has the name of the module suffixed by _Init. For example, to initialize the module example:

    --> example_Init();
    

    35.6 Building modes

    The mechanism to load an external module in Scilab is called Dynamic Link and works with dynamic modules (or shared libraries, .so files).

    To produce a dynamic module, when generating the wrapper, there are two possibilities, or build modes:

    • the nobuilder mode, this is the default mode in SWIG. The user is responsible of the build.
    • the builder mode. In this mode, Scilab is responsible of building.

    35.6.1 No-builder mode

    In this mode, used by default, SWIG generates the wrapper sources, which have to be manually compiled and linked. A loader script loader.sce is also produced, this one is executed further in Scilab to load the module.

    This mode is the best option to use when you have to integrate the module build into a larger build process.

    35.6.2 Builder mode

    In this mode, in addition to the wrapper sources, SWIG produces a builder Scilab script (builder.sce), which is executed in Scilab to build the module. In a few words, the Scilab ilib_build() command is used, which produces the shared library file, and the loader script loader.sce (and also a cleaner script cleaner.sce).

    An advantage of this mode is that it hides all the complexity of the build and other platform issues. Also it allows the module to conform to a Scilab external module convention which is that an external module should be simply built by calling a builder script.

    The builder mode is activated with the -builder SWIG option. In this mode, the following SWIG options may be used to setup the build:

    • -buildersources: to add sources to the build (several files must be separated by a comma)
    • -buildercflags: to add flags to the builder compiler flags, for example to set library dependencies include paths
    • -builderldflags: to add flags to the linker flags, for example to set library dependency names and paths

    Let's give an example how to build a module example, composed of two sources, and using a library dependency:

    • the sources are baa1.c and baa2.c (and are stored in the current directory)
    • the library is libfoo in /opt/foo (headers stored in /opt/foo/include, and shared library in /opt/foo/lib)

    The command is:

    $ swig -scilab -builder -buildercflags -I/opt/foo/include -builderldflags "-L/opt/foo/lib -lfoo" -buildersources baa1.cxx, baa2.cxx example.i
    

    35.7 Generated scripts

    In this part we give some details about the generated Scilab scripts.

    35.7.1 Builder script

    builder.sce is the name of the builder script generated by SWIG in builder mode. It contains code like this:

    ilib_name = "examplelib";
    files = ["example_wrap.c"];
    libs = [];
    table = ["fact", "_wrap_fact";"Foo_set", "_wrap_Foo_set";"Foo_get", "_wrap_Foo_get";];
    ilib_build(ilib_name, table, files, libs);
    

    ilib_build(lib_name, table, files, libs) is used to create shared libraries, and to generate a loader file used to dynamically load the shared library into Scilab.

    • ilib_name: a character string, the generic name of the library without path and extension.
    • files: string matrix containing objects files needed for shared library creation.
    • libs: string matrix containing extra libraries needed for shared library creation.
    • table: two column string matrix containing a table of pairs of 'scilab function name', 'C function name'.

    35.7.2 Loader script

    The loader script is used to load in Scilab all the module functions. When loaded, these functions can be used as other Scilab functions.

    The loader script loader.sce contains code similar to:

    // ------------------------------------------------------
    // generated by builder.sce: Please do not edit this file
    // ------------------------------------------------------
    
    libexamplelib_path = get_file_path('loader.sce');
    list_functions = [             'fact';
                'Foo_set';
                'Foo_get';
    ];
    addinter(libexamplelib_path+'/libexamplelib.so', 'libexamplelib', list_functions);
    // remove temp. variables on stack
    clear libexamplelib_path;
    clear list_functions;
    clear get_file_path;
    // ------------------------------------------------------
    

    addinter(files, spname, fcts) performs dynamic linking of a compiled C interface function.

    • files: a character string or a vector of character strings defining the object files (containing the C interface functions) to link with.
    • spname: a character string. Name of interface routine entry point.
    • fcts: vector of character strings. The name of new Scilab function.

    35.8 Other resources

    • Example use cases can be found in the Examples/scilab directory.
    • The test suite in the Examples/test-suite/scilab can be another source of useful use cases.
    • The Scilab API is used in the generated code and is a useful reference when examining the output.
    • This guide describes the Scilab external modules structure and files, in particular the files that are generated by SWIG for Scilab.
    swig-4.0.1/Doc/Manual/style.css0000644000175000017500000000275213527063513016152 0ustar williamwilliamdiv.sectiontoc { border-style: dotted; border-width: 2px; padding: 2pt; } h2 { padding: 3px; color: #000000; border-bottom: 2px solid #dddddd; } h3, h4 { margin-left: 1em; } p,li,table,dl { margin-left: 2em; margin-right: 2em; } div.indent { margin-left: 4em; margin-right: 4em; } div.code { border-style: solid; border-width: 1px; padding: 2pt; margin-left: 4em; margin-right: 4em; background-color: #F0FFFF; font-family: "Courier New", Courier, "Courier 10 Pitch", monospace; } div.targetlang { border-style: solid; border-width: 1px; padding: 2pt; margin-left: 4em; margin-right: 4em; background-color: #d7f6bb; font-family: "Courier New", Courier, "Courier 10 Pitch", monospace; } div.shell { border-style: solid; border-width: 1px; padding: 2pt; margin-left: 4em; margin-right: 4em; background-color: #DCDCDC; font-family: "Courier New", Courier, "Courier 10 Pitch", monospace; } div.diagram { border-style: solid; border-width: 1px; padding: 2pt; margin-left: 4em; margin-right: 4em; background-color: #FFEBCD; font-family: "Courier New", Courier, "Courier 10 Pitch", monospace; } ul li p { margin-left: 0; margin-right: 0; } ol li p { margin-left: 0; margin-right: 0; } dl dd p { margin-left: 0; margin-right: 0; } div.indent p { margin-left: 0; margin-right: 0; } pre, code, tt { font-family: "Courier New", Courier, "Courier 10 Pitch", monospace; } body { font-family: serif; } swig-4.0.1/Doc/Manual/Go.html0000644000175000017500000013242213527234052015527 0ustar williamwilliam SWIG and Go

    24 SWIG and Go

    This chapter describes SWIG's support of Go. For more information on the Go programming language see golang.org.

    24.1 Overview

    Go does not support direct calling of functions written in C/C++. The cgo program may be used to generate wrappers to call C code from Go, but there is no convenient way to call C++ code. SWIG fills this gap.

    There are (at least) two different Go compilers. The first is the gc compiler of the Go distribution, normally invoked via the go tool. The second Go compiler is the gccgo compiler, which is a frontend to the GCC compiler suite. The interface to C/C++ code is completely different for the two Go compilers. SWIG supports both Go compilers, selected by the -gccgo command line option.

    Go is a type-safe compiled language and the wrapper code generated by SWIG is type-safe as well. In case of type issues the build will fail and hence SWIG's runtime library and runtime type checking are not used.

    24.2 Examples

    Working examples can be found in the SWIG source tree .

    Please note that the examples in the SWIG source tree use makefiles with the .i SWIG interface file extension for backwards compatibility with Go 1.

    24.3 Running SWIG with Go

    Most Go programs are built using the go tool. Since Go 1.1 the go tool has support for SWIG. To use it, give your SWIG interface file the extension .swig (for C code) or .swigcxx (for C++ code). Put that file in a GOPATH/src directory as usual for Go sources. Put other C/C++ code in the same directory with extensions of .c and .cxx. The go build and go install commands will automatically run SWIG for you and compile the generated wrapper code. To check the SWIG command line options the go tool uses run go build -x. To access the automatically generated files run go build -work. You'll find the files under the temporary WORK directory.

    To manually generate and compile C/C++ wrapper code for Go, use the -go option with SWIG. By default SWIG will generate code for the Go compiler of the Go distribution. To generate code for gccgo, you should also use the -gccgo option.

    By default SWIG will generate files that can be used directly by go build. This requires Go 1.2 or later. Put your SWIG interface file in a directory under GOPATH/src, and give it a name that does not end in the .swig or .swigcxx extension. Typically the SWIG interface file extension is .i in this case.

    % swig -go example.i
    % go install
    

    You will now have a Go package that you can import from other Go packages as usual.

    SWIG can be used without cgo, via the -no-cgo option, but more steps are required. This only works with Go versions before 1.5. When using Go version 1.2 or later, or when using gccgo, the code generated by SWIG can be linked directly into the Go program. A typical command sequence when using the Go compiler of the Go distribution would look like this:

    % swig -go -no-cgo example.i
    % gcc -c code.c    # The C library being wrapped.
    % gcc -c example_wrap.c
    % go tool 6g example.go
    % go tool 6c example_gc.c
    % go tool pack grc example.a example.6 example_gc.6 code.o example_wrap.o
    % go tool 6g main.go
    % go tool 6l main.6
    

    You can also put the wrapped code into a shared library, and when using the Go versions before 1.2 this is the only supported option. A typical command sequence for this approach would look like this:

    % swig -go -no-cgo -use-shlib example.i
    % gcc -c -fpic example.c
    % gcc -c -fpic example_wrap.c
    % gcc -shared example.o example_wrap.o -o example.so
    % go tool 6g example.go
    % go tool 6c example_gc.c
    % go tool pack grc example.a example.6 example_gc.6
    % go tool 6g main.go  # your code, not generated by SWIG
    % go tool 6l main.6
    

    24.3.1 Go-specific Commandline Options

    These are the command line options for SWIG's Go module. They can also be seen by using:

    swig -go -help
    
    Go-specific options
    -cgo Generate files to be used as input for the Go cgo tool. This is the default.
    -no-cgo Generate files that can be used directly, rather than via the Go cgo tool. This option does not work with Go 1.5 or later. It is required for versions of Go before 1.2.
    -intgosize <s> Set the size for the Go type int. This controls the size that the C/C++ code expects to see. The <s> argument should be 32 or 64. This option is currently required during the transition from Go 1.0 to Go 1.1, as the size of int on 64-bit x86 systems changes between those releases (from 32 bits to 64 bits). In the future the option may become optional, and SWIG will assume that the size of int is the size of a C pointer.
    -gccgo Generate code for gccgo. The default is to generate code for the Go compiler of the Go distribution.
    -package <name> Set the name of the Go package to <name>. The default package name is the SWIG module name.
    -use-shlib Tell SWIG to emit code that uses a shared library. This is only meaningful for the Go compiler of the Go distribution, which needs to know at compile time whether a shared library will be used.
    -soname <name> Set the runtime name of the shared library that the dynamic linker should include at runtime. The default is the package name with ".so" appended. This is only used when generating code for the Go compiler of the Go distribution; when using gccgo, the equivalent name will be taken from the -soname option passed to the linker. Using this option implies the -use-shlib option.
    -go-pkgpath <pkgpath> When generating code for gccgo, set the pkgpath to use. This corresponds to the -fgo-pkgpath option to gccgo.
    -go-prefix <prefix> When generating code for gccgo, set the prefix to use. This corresponds to the -fgo-prefix option to gccgo. If -go-pkgpath is used, -go-prefix will be ignored.
    -import-prefix <prefix> A prefix to add when turning a %import prefix in the SWIG interface file into an import statement in the Go file. For example, with -import-prefix mymodule, a SWIG interface file %import mypackage will become a Go import statement import "mymodule/mypackage".

    24.3.2 Generated Wrapper Files

    There are two different approaches to generating wrapper files, controlled by SWIG's -no-cgo option. The -no-cgo option only works with version of Go before 1.5. It is required when using versions of Go before 1.2.

    With or without the -no-cgo option, SWIG will generate the following files when generating wrapper code:

    • MODULE.go will contain the Go functions that your Go code will call. These functions will be wrappers for the C++ functions defined by your module. This file should, of course, be compiled with the Go compiler.
    • MODULE_wrap.c or MODULE_wrap.cxx will contain C/C++ functions will be invoked by the Go wrapper code. This file should be compiled with the usual C or C++ compiler.
    • MODULE_wrap.h will be generated if you use the directors feature. It provides a definition of the generated C++ director classes. It is generally not necessary to use this file, but in some special cases it may be helpful to include it in your code, compiled with the usual C or C++ compiler.

    When the -no-cgo option is used, and the -gccgo option is not used, SWIG will also generate an additional file:

    • MODULE_gc.c will contain C code which should be compiled with the C compiler distributed as part of the gc compiler. It should then be combined with the compiled MODULE.go using go tool pack.

    24.4 A tour of basic C/C++ wrapping

    By default, SWIG attempts to build a natural Go interface to your C/C++ code. However, the languages are somewhat different, so some modifications have to occur. This section briefly covers the essential aspects of this wrapping.

    24.4.1 Go Package Name

    All Go source code lives in a package. The name of this package will default to the name of the module from SWIG's %module directive. You may override this by using SWIG's -package command line option.

    24.4.2 Go Names

    In Go, a function is only visible outside the current package if the first letter of the name is uppercase. This is quite different from C/C++. Because of this, C/C++ names are modified when generating the Go interface: the first letter is forced to be uppercase if it is not already. This affects the names of functions, methods, variables, constants, enums, and classes.

    C/C++ variables are wrapped with setter and getter functions in Go. First the first letter of the variable name will be forced to uppercase, and then Get or Set will be prepended. For example, if the C/C++ variable is called var, then SWIG will define the functions GetVar and SetVar. If a variable is declared as const, or if SWIG's %immutable directive is used for the variable, then only the getter will be defined.

    C++ classes will be discussed further below. Here we'll note that the first letter of the class name will be forced to uppercase to give the name of a type in Go. A constructor will be named New followed by that name, and the destructor will be named Delete followed by that name.

    24.4.3 Go Constants

    C/C++ constants created via #define or the %constant directive become Go constants, declared with a const declaration.

    24.4.4 Go Enumerations

    C/C++ enumeration types will cause SWIG to define an integer type with the name of the enumeration (with first letter forced to uppercase as usual). The values of the enumeration will become variables in Go; code should avoid modifying those variables.

    24.4.5 Go Classes

    Go has interfaces, methods and inheritance, but it does not have classes in the same sense as C++. This sections describes how SWIG represents C++ classes represented in Go.

    For a C++ class ClassName, SWIG will define two types in Go: an underlying type, which will just hold a pointer to the C++ type, and an interface type. The interface type will be named ClassName. SWIG will define a function NewClassName which will take any constructor arguments and return a value of the interface type ClassName. SWIG will also define a destructor DeleteClassName.

    SWIG will represent any methods of the C++ class as methods on the underlying type, and also as methods of the interface type. Thus C++ methods may be invoked directly using the usual val.MethodName syntax. Public members of the C++ class will be given getter and setter functions defined as methods of the class.

    SWIG will represent static methods of C++ classes as ordinary Go functions. SWIG will use names like ClassNameMethodName. SWIG will give static members getter and setter functions with names like GetClassName_VarName.

    Given a value of the interface type, Go code can retrieve the pointer to the C++ type by calling the Swigcptr method. This will return a value of type SwigcptrClassName, which is just a name for uintptr. A Go type conversion can be used to convert this value to a different C++ type, but note that this conversion will not be type checked and is essentially equivalent to reinterpret_cast. This should only be used for very special cases, such as where C++ would use a dynamic_cast.

    Note that C++ pointers to compound objects are represented in go as objects themselves, not as go pointers. So, for example, if you wrap the following function:

    class MyClass {
      int MyMethod();
      static MyClass *MyFactoryFunction();
    };
    
    

    You will get go code that looks like this:

    type MyClass interface {
      Swigcptr() uintptr
      SwigIsMyClass()
      MyMethod() int
    }
    
    func MyClassMyFactoryFunction() MyClass {
      // swig magic here
    }
    

    Note that the factory function does not return a go pointer; it actually returns a go interface. If the returned pointer can be null, you can check for this by calling the Swigcptr() method.

    24.4.5.1 Go Class Memory Management

    Calling NewClassName for a C++ class ClassName will allocate memory using the C++ memory allocator. This memory will not be automatically freed by Go's garbage collector as the object ownership is not tracked. When you are done with the C++ object you must free it using DeleteClassName.

    The most Go idiomatic way to manage the memory for some C++ class is to call NewClassName followed by a defer of the DeleteClassName call. Using defer ensures that the memory of the C++ object is freed as soon as the function containing the defer statement returns. Furthermore defer works great for short-lived objects and fits nicely C++'s RAII idiom. Example:

    func UseClassName(...) ... {
      o := NewClassName(...)
      defer DeleteClassName(o)
      // Use the ClassName object
      return ...
    }
    

    With increasing complexity, especially complex C++ object hierarchies, the correct placement of defer statements becomes harder and harder as C++ objects need to be freed in the correct order. This problem can be eased by keeping a C++ object function local so that it is only available to the function that creates a C++ object and functions called by this function. Example:

    func WithClassName(constructor args, f func(ClassName, ...interface{}) error, data ...interface{}) error {
      o := NewClassName(constructor args)
      defer DeleteClassName(o)
      return f(o, data...)
    }
    
    func UseClassName(o ClassName, data ...interface{}) (err error) {
      // Use the ClassName object and additional data and return error.
    }
    
    func main() {
      WithClassName(constructor args, UseClassName, additional data)
    }
    

    Using defer has limitations though, especially when it comes to long-lived C++ objects whose lifetimes are hard to predict. For such C++ objects a common technique is to store the C++ object into a Go object, and to use the Go function runtime.SetFinalizer to add a finalizer which frees the C++ object when the Go object is freed. It is strongly recommended to read the runtime.SetFinalizer documentation before using this technique to understand the runtime.SetFinalizer limitations.

    Common pitfalls with runtime.SetFinalizer are:

    • If a hierarchy of C++ objects will be automatically freed by Go finalizers then the Go objects that store the C++ objects need to replicate the hierarchy of the C++ objects to prevent that C++ objects are freed prematurely while other C++ objects still rely on them.
    • The usage of Go finalizers is problematic with C++'s RAII idiom as it isn't predictable when the finalizer will run and this might require a Close or Delete method to be added the Go object that stores a C++ object to mitigate.
    • The Go finalizer function typically runs in a different OS thread which can be problematic with C++ code that uses thread-local storage.

    runtime.SetFinalizer Example:

    import (
      "runtime"
      "wrap" // SWIG generated wrapper code
    )
    
    type GoClassName struct {
      wcn wrap.ClassName
    }
    
    func NewGoClassName() *GoClassName {
      o := &GoClassName{wcn: wrap.NewClassName()}
      runtime.SetFinalizer(o, deleteGoClassName)
      return o
    }
    
    func deleteGoClassName(o *GoClassName) {
      // Runs typically in a different OS thread!
      wrap.DeleteClassName(o.wcn)
      o.wcn = nil
    }
    
    func (o *GoClassName) Close() {
      // If the C++ object has a Close method.
      o.wcn.Close()
    
      // If the GoClassName object is no longer in an usable state.
      runtime.SetFinalizer(o, nil) // Remove finalizer.
      deleteGoClassName() // Free the C++ object.
    }
    

    24.4.5.2 Go Class Inheritance

    C++ class inheritance is automatically represented in Go due to its use of interfaces. The interface for a child class will be a superset of the interface of its parent class. Thus a value of the child class type in Go may be passed to a function which expects the parent class. Doing the reverse will require an explicit type assertion, which will be checked dynamically.

    24.4.6 Go Templates

    In order to use C++ templates in Go, you must tell SWIG to create wrappers for a particular template instantiation. To do this, use the %template directive.

    24.4.7 Go Director Classes

    SWIG's director feature permits a Go type to act as the subclass of a C++ class. This is complicated by the fact that C++ and Go define inheritance differently. SWIG normally represents the C++ class inheritance automatically in Go via interfaces but with a Go type representing a subclass of a C++ class some manual work is necessary.

    This subchapter gives a step by step guide how to properly subclass a C++ class with a Go type. In general it is strongly recommended to follow this guide completely to avoid common pitfalls with directors in Go.

    24.4.7.1 Example C++ code

    The step by step guide is based on two example C++ classes. FooBarAbstract is an abstract C++ class and the FooBarCpp class inherits from it. This guide explains how to implement a FooBarGo class similar to the FooBarCpp class.

    FooBarAbstract abstract C++ class:

    class FooBarAbstract
    {
    public:
      FooBarAbstract() {};
      virtual ~FooBarAbstract() {};
    
      std::string FooBar() {
        return this->Foo() + ", " + this->Bar();
      };
    
    protected:
      virtual std::string Foo() {
        return "Foo";
      };
    
      virtual std::string Bar() = 0;
    };
    

    FooBarCpp C++ class:

    class FooBarCpp : public FooBarAbstract
    {
    protected:
      virtual std::string Foo() {
        return "C++ " + FooBarAbstract::Foo();
      }
    
      virtual std::string Bar() {
        return "C++ Bar";
      }
    };
    

    Returned string by the FooBarCpp::FooBar method is:

    C++ Foo, C++ Bar
    

    The complete example, including the FooBarGoo class implementation, can be found in the end of the guide.

    24.4.7.2 Enable director feature

    The director feature is disabled by default. To use directors you must make two changes to the interface file. First, add the "directors" option to the %module directive, like this:

    %module(directors="1") modulename
    

    Second, you must use the %feature("director") directive to tell SWIG which classes should get directors. In the example the FooBarAbstract class needs the director feature enabled so that the FooBarGo class can inherit from it, like this:

    %feature("director") FooBarAbstract;
    

    For a more detailed documentation of the director feature and how to enable or disable it for specific classes and virtual methods see SWIG's Java documentation on directors.

    24.4.7.3 Constructor and destructor

    SWIG creates an additional set of constructor and destructor functions once the director feature has been enabled for a C++ class. NewDirectorClassName allows overriding virtual methods on the new object instance and DeleteDirectorClassName needs to be used to free a director object instance created with NewDirectorClassName. More on overriding virtual methods follows later in this guide under overriding virtual methods.

    The default constructor and destructor functions NewClassName and DeleteClassName can still be used as before so that existing code doesn't break just because the director feature has been enabled for a C++ class. The behavior is undefined if the default and director constructor and destructor functions get mixed and so great care needs to be taken that only one of the constructor and destructor function pairs is used for any object instance. Both constructor functions, the default and the director one, return the same interface type. This makes it potentially hard to know which destructor function, the default or the director one, needs to be called to delete an object instance.

    In theory the DirectorInterface method could be used to determine if an object instance was created via NewDirectorClassName:

    if o.DirectorInterface() != nil {
      DeleteDirectorClassName(o)
    } else {
      DeleteClassName(o)
    }
    

    In practice it is strongly recommended to embed a director object instance in a Go struct so that a director object instance will be represented as a distinct Go type that subclasses a C++ class. For this Go type custom constructor and destructor functions take care of the director constructor and destructor function calls and the resulting Go class will appear to the user as any other SWIG wrapped C++ class. More on properly subclassing a C++ class follows later in this guide under subclass via embedding.

    24.4.7.4 Override virtual methods

    In order to override virtual methods on a C++ class with Go methods the NewDirectorClassName constructor functions receives a DirectorInterface argument. The methods in the DirectorInterface are a subset of the public and protected virtual methods of the C++ class. Virtual methods that have a final specifier are unsurprisingly excluded. If the DirectorInterface contains a method with a matching signature to a virtual method of the C++ class then the virtual C++ method will be overwritten with the Go method. As Go doesn't support protected methods all overridden protected virtual C++ methods will be public in Go.

    As an example see part of the FooBarGo class:

    type overwrittenMethodsOnFooBarAbstract struct {
      fb FooBarAbstract
    }
    
    func (om *overwrittenMethodsOnFooBarAbstract) Foo() string {
      ...
    }
    
    func (om *overwrittenMethodsOnFooBarAbstract) Bar() string {
      ...
    }
    
    func NewFooBarGo() FooBarGo {
      om := &overwrittenMethodsOnFooBarAbstract{}
      fb := NewDirectorFooBarAbstract(om)
      om.fb = fb
      ...
    }
    

    The complete example, including the FooBarGoo class implementation, can be found in the end of the guide. In this part of the example the virtual methods FooBarAbstract::Foo and FooBarAbstract::Bar have been overwritten with Go methods similarly to how the FooBarAbstract virtual methods are overwritten by the FooBarCpp class.

    The DirectorInterface in the example is implemented by the overwrittenMethodsOnFooBarAbstract Go struct type. A pointer to a overwrittenMethodsOnFooBarAbstract struct instance will be given to the NewDirectorFooBarAbstract constructor function. The constructor return value implements the FooBarAbstract interface. overwrittenMethodsOnFooBarAbstract could in theory be any Go type but in practice a struct is used as it typically contains at least a value of the C++ class interface so that the overwritten methods can use the rest of the C++ class. If the FooBarGo class would receive additional constructor arguments then these would also typically be stored in the overwrittenMethodsOnFooBarAbstract struct so that they can be used by the Go methods.

    24.4.7.5 Call base methods

    Often a virtual method will be overwritten to extend the original behavior of the method in the base class. This is also the case for the FooBarCpp::Foo method of the example code:

    virtual std::string Foo() {
      return "C++ " + FooBarAbstract::Foo();
    }
    

    To use base methods the DirectorClassNameMethodName wrapper functions are automatically generated by SWIG for public and protected virtual methods. The FooBarGo.Foo implementation in the example looks like this:

    func (om *overwrittenMethodsOnFooBarAbstract) Foo() string {
      return "Go " + DirectorFooBarAbstractFoo(om.fb)
    }
    

    The complete example, including the FooBarGoo class implementation, can be found in the end of the guide.

    24.4.7.6 Subclass via embedding

    As previously mentioned in this guide the default and director constructor functions return the same interface type. To properly subclass a C++ class with a Go type the director object instance returned by the NewDirectorClassName constructor function should be embedded into a Go struct so that it represents a distinct but compatible type in Go's type system. This Go struct should be private and the constructor and destructor functions should instead work with a public interface type so that the Go class that subclasses a C++ class can be used as a compatible drop in.

    The subclassing part of the FooBarGo class for an example looks like this:

    type FooBarGo interface {
      FooBarAbstract
      deleteFooBarAbstract()
      IsFooBarGo()
    }
    
    type fooBarGo struct {
      FooBarAbstract
    }
    
    func (fbgs *fooBarGo) deleteFooBarAbstract() {
      DeleteDirectorFooBarAbstract(fbgs.FooBarAbstract)
    }
    
    func (fbgs *fooBarGo) IsFooBarGo() {}
    
    func NewFooBarGo() FooBarGo {
      om := &overwrittenMethodsOnFooBarAbstract{}
      fb := NewDirectorFooBarAbstract(om)
      om.fb = fb
    
      return &fooBarGo{FooBarAbstract: fb}
    }
    
    func DeleteFooBarGo(fbg FooBarGo) {
      fbg.deleteFooBarAbstract()
    }
    

    The complete example, including the FooBarGoo class implementation, can be found in the end of the guide. In this part of the example the private fooBarGo struct embeds FooBarAbstract which lets the fooBarGo Go type "inherit" all the methods of the FooBarAbstract C++ class by means of embedding. The public FooBarGo interface type includes the FooBarAbstract interface and hence FooBarGo can be used as a drop in replacement for FooBarAbstract while the reverse isn't possible and would raise a compile time error. Furthermore the constructor and destructor functions NewFooBarGo and DeleteFooBarGo take care of all the director specifics and to the user the class appears as any other SWIG wrapped C++ class.

    24.4.7.7 Memory management with runtime.SetFinalizer

    In general all guidelines for C++ class memory management apply as well to director classes. One often overlooked limitation with runtime.SetFinalizer is that a finalizer doesn't run in case of a cycle and director classes typically have a cycle. The cycle in the FooBarGo class is here:

    type overwrittenMethodsOnFooBarAbstract struct {
      fb FooBarAbstract
    }
    
    func NewFooBarGo() FooBarGo {
      om := &overwrittenMethodsOnFooBarAbstract{}
      fb := NewDirectorFooBarAbstract(om) // fb.v = om
      om.fb = fb // Backlink causes cycle as fb.v = om!
      ...
    }
    

    In order to be able to use runtime.SetFinalizer nevertheless the finalizer needs to be set on something that isn't in a cycle and that references the director object instance. In the FooBarGo class example the FooBarAbstract director instance can be automatically deleted by setting the finalizer on fooBarGo:

    type fooBarGo struct {
      FooBarAbstract
    }
    
    type overwrittenMethodsOnFooBarAbstract struct {
      fb FooBarAbstract
    }
    
    func NewFooBarGo() FooBarGo {
      om := &overwrittenMethodsOnFooBarAbstract{}
      fb := NewDirectorFooBarAbstract(om)
      om.fb = fb // Backlink causes cycle as fb.v = om!
    
      fbgs := &fooBarGo{FooBarAbstract: fb}
      runtime.SetFinalizer(fbgs, FooBarGo.deleteFooBarAbstract)
      return fbgs
    }
    

    Furthermore if runtime.SetFinalizer is in use either the DeleteClassName destructor function needs to be removed or the fooBarGo struct needs additional data to prevent double deletion. Please read the C++ class memory management subchapter before using runtime.SetFinalizer to know all of its gotchas.

    24.4.7.8 Complete FooBarGo example class

    The complete and annotated FooBarGo class looks like this:

    // FooBarGo is a superset of FooBarAbstract and hence FooBarGo can be used as a
    // drop in replacement for FooBarAbstract but the reverse causes a compile time
    // error.
    type FooBarGo interface {
      FooBarAbstract
      deleteFooBarAbstract()
      IsFooBarGo()
    }
    
    // Via embedding fooBarGo "inherits" all methods of FooBarAbstract.
    type fooBarGo struct {
      FooBarAbstract
    }
    
    func (fbgs *fooBarGo) deleteFooBarAbstract() {
      DeleteDirectorFooBarAbstract(fbgs.FooBarAbstract)
    }
    
    // The IsFooBarGo method ensures that FooBarGo is a superset of FooBarAbstract.
    // This is also how the class hierarchy gets represented by the SWIG generated
    // wrapper code.  For an instance FooBarCpp has the IsFooBarAbstract and
    // IsFooBarCpp methods.
    func (fbgs *fooBarGo) IsFooBarGo() {}
    
    // Go type that defines the DirectorInterface. It contains the Foo and Bar
    // methods that overwrite the respective virtual C++ methods on FooBarAbstract.
    type overwrittenMethodsOnFooBarAbstract struct {
      // Backlink to FooBarAbstract so that the rest of the class can be used by
      // the overridden methods.
      fb FooBarAbstract
    
      // If additional constructor arguments have been given they are typically
      // stored here so that the overridden methods can use them.
    }
    
    func (om *overwrittenMethodsOnFooBarAbstract) Foo() string {
      // DirectorFooBarAbstractFoo calls the base method FooBarAbstract::Foo.
      return "Go " + DirectorFooBarAbstractFoo(om.fb)
    }
    
    func (om *overwrittenMethodsOnFooBarAbstract) Bar() string {
      return "Go Bar"
    }
    
    func NewFooBarGo() FooBarGo {
      // Instantiate FooBarAbstract with selected methods overridden.  The methods
      // that will be overwritten are defined on
      // overwrittenMethodsOnFooBarAbstract and have a compatible signature to the
      // respective virtual C++ methods. Furthermore additional constructor
      // arguments will be typically stored in the
      // overwrittenMethodsOnFooBarAbstract struct.
      om := &overwrittenMethodsOnFooBarAbstract{}
      fb := NewDirectorFooBarAbstract(om)
      om.fb = fb // Backlink causes cycle as fb.v = om!
    
      fbgs := &fooBarGo{FooBarAbstract: fb}
      // The memory of the FooBarAbstract director object instance can be
      // automatically freed once the FooBarGo instance is garbage collected by
      // uncommenting the following line.  Please make sure to understand the
      // runtime.SetFinalizer specific gotchas before doing this.  Furthermore
      // DeleteFooBarGo should be deleted if a finalizer is in use or the fooBarGo
      // struct needs additional data to prevent double deletion.
      // runtime.SetFinalizer(fbgs, FooBarGo.deleteFooBarAbstract)
      return fbgs
    }
    
    // Recommended to be removed if runtime.SetFinalizer is in use.
    func DeleteFooBarGo(fbg FooBarGo) {
      fbg.deleteFooBarAbstract()
    }
    

    Returned string by the FooBarGo.FooBar method is:

    Go Foo, Go Bar
    

    For comparison the FooBarCpp class looks like this:

    class FooBarCpp : public FooBarAbstract
    {
    protected:
      virtual std::string Foo() {
        return "C++ " + FooBarAbstract::Foo();
      }
    
      virtual std::string Bar() {
        return "C++ Bar";
      }
    };
    

    For comparison the returned string by the FooBarCpp::FooBar method is:

    C++ Foo, C++ Bar
    

    The complete source of this example can be found under SWIG/Examples/go/director/.

    24.4.8 Default Go primitive type mappings

    The following table lists the default type mapping from C/C++ to Go. This table will tell you which Go type to expect for a function which uses a given C/C++ type.

    C/C++ type Go type
    bool bool
    char byte
    signed char int8
    unsigned char byte
    short int16
    unsigned short uint16
    int int
    unsigned int uint
    long int64
    unsigned long uint64
    long long int64
    unsigned long long uint64
    float float32
    double float64
    char *
    char []
    string

    Note that SWIG wraps the C char type as a character. Pointers and arrays of this type are wrapped as strings. The signed char type can be used if you want to treat char as a signed number rather than a character. Also note that all const references to primitive types are treated as if they are passed by value.

    These type mappings are defined by the "gotype" typemap. You may change that typemap, or add new values, to control how C/C++ types are mapped into Go types.

    24.4.9 Output arguments

    Because of limitations in the way output arguments are processed in swig, a function with output arguments will not have multiple return values. Instead, you must pass a pointer into the C++ function to tell it where to store the output value. In go, you supply a slice in the place of the output argument.

    For example, suppose you were trying to wrap the modf() function in the C math library which splits x into integral and fractional parts (and returns the integer part in one of its parameters):

    double modf(double x, double *ip);
    

    You could wrap it with SWIG as follows:

    %include <typemaps.i>
    double modf(double x, double *OUTPUT);
    

    or you can use the %apply directive:

    %include <typemaps.i>
    %apply double *OUTPUT { double *ip };
    double modf(double x, double *ip);
    

    In Go you would use it like this:

    ptr := []float64{0.0}
    fraction := modulename.Modf(5.0, ptr)
    

    Since this is ugly, you may want to wrap the swig-generated API with some additional functions written in go that hide the ugly details.

    There are no char *OUTPUT typemaps. However you can apply the signed char * typemaps instead:

    %include <typemaps.i>
    %apply signed char *OUTPUT {char *output};
    void f(char *output);
    

    24.4.10 Adding additional go code

    Often the APIs generated by swig are not very natural in go, especially if there are output arguments. You can insert additional go wrapping code to add new APIs with %insert(go_wrapper), like this:

    %include <typemaps.i>
    // Change name of what swig generates to Wrapped_modf.  This function will
    // have the following signature in go:
    //   func Wrapped_modf(float64, []float64) float64
    %rename(wrapped_modf) modf(double x, double *ip);
    
    %apply double *OUTPUT { double *ip };
    double modf(double x, double *ip);
    
    %insert(go_wrapper) %{
    
    // The improved go interface to this function, which has two return values,
    // in the more natural go idiom:
    func Modf(x float64) (fracPart float64, intPart float64) {
      ip := []float64{0.0}
      fracPart = Wrapped_modf(x, ip)
      intPart = ip[0]
      return
    }
    
    %}
    

    For classes, since swig generates an interface, you can add additional methods by defining another interface that includes the swig-generated interface. For example,

    %rename(Wrapped_MyClass) MyClass;
    %rename(Wrapped_GetAValue) MyClass::GetAValue(int *x);
    %apply int *OUTPUT { int *x };
    
    class MyClass {
     public:
      MyClass();
      int AFineMethod(const char *arg); // Swig's wrapping is fine for this one.
      bool GetAValue(int *x);
    };
    
    %insert(go_wrapper) %{
    
    type MyClass interface {
      Wrapped_MyClass
      GetAValue() (int, bool)
    }
    
    func (arg SwigcptrWrapped_MyClass) GetAValue() (int, bool) {
      ip := []int{0}
      ok := arg.Wrapped_GetAValue(ip)
      return ip[0], ok
    }
    
    %}
    

    Of course, if you have to rewrite most of the methods, instead of just a few, then you might as well define your own struct that includes the swig-wrapped object, instead of adding methods to the swig-generated object.

    If you need to import other go packages, you can do this with %go_import. For example,

    %go_import("fmt", _ "unusedPackage", rp "renamed/package")
    
    %insert(go_wrapper) %{
    
    func foo() {
      fmt.Println("Some string:", rp.GetString())
    }
    
    // Importing the same package twice is permitted,
    // Go code will be generated with only the first instance of the import.
    %go_import("fmt")
    
    %insert(go_wrapper) %{
    
    func bar() {
      fmt.Println("Hello world!")
    }
    
    %}
    

    24.4.11 Go typemaps

    You can use the %typemap directive to modify SWIG's default wrapping behavior for specific C/C++ types. You need to be familiar with the material in the general "Typemaps" chapter. That chapter explains how to define a typemap. This section describes some specific typemaps used for Go.

    In general type conversion code may be written either in C/C++ or in Go. The choice to make normally depends on where memory should be allocated. To allocate memory controlled by the Go garbage collector, write Go code. To allocate memory in the C/C++ heap, write C code.

    Typemap Description
    gotype The Go type to use for a C++ type. This type will appear in the generated Go wrapper function. If this is not defined SWIG will use a default as described above.
    imtype An intermediate Go type used by the "goin", "goout", "godirectorin", and "godirectorout" typemaps. If this typemap is not defined for a C/C++ type, the gotype typemape will be used. This is useful when gotype is best converted to C/C++ using Go code.
    goin Go code to convert from gotype to imtype when calling a C/C++ function. SWIG will then internally convert imtype to a C/C++ type and pass it down. If this is not defined, or is the empty string, no conversion is done.
    in C/C++ code to convert the internally generated C/C++ type, based on imtype, into the C/C++ type that a function call expects. If this is not defined the value will simply be cast to the desired type.
    out C/C++ code to convert the C/C++ type that a function call returns into the internally generated C/C++ type, based on imtype, that will be returned to Go. If this is not defined the value will simply be cast to the desired type.
    goout Go code to convert a value returned from a C/C++ function from imtype to gotype. If this is not defined, or is the empty string, no conversion is done.
    argout C/C++ code to adjust an argument value when returning from a function. This is called after the real C/C++ function has run. This uses the internally generated C/C++ type, based on imtype. This is only useful for a pointer type of some sort. If this is not defined nothing will be done.
    goargout Go code to adjust an argument value when returning from a function. This is called after the real C/C++ function has run. The value will be in imtype. This is only useful for a pointer type of some sort. If this is not defined, or is the empty string, nothing will be done.
    directorin C/C++ code to convert the C/C++ type used to call a director method into the internally generated C/C++ type, based on imtype, that will be passed to Go. If this is not defined the value will simply be cast to the desired type.
    godirectorin Go code to convert a value used to call a director method from imtype to gotype. If this is not defined, or is the empty string, no conversion is done.
    godirectorout Go code to convert a value returned from a director method from gotype to imtype. If this is not defined, or is the empty string, no conversion is done.
    directorout C/C++ code to convert a value returned from a director method from the internally generated C/C++ type, based on imtype, into the type that the method should return If this is not defined the value will simply be cast to the desired type.
    swig-4.0.1/Doc/Manual/swightml.book0000644000175000017500000000241413527234053017004 0ustar williamwilliam#HTMLDOC 1.8.24 -t html -f SWIGDocumentation.html --book --toclevels 4 --no-numbered --toctitle "Table of Contents" --title --titleimage swig16.png --linkcolor #0000ff --linkstyle underline --size Universal --left 0.50in --right 0.50in --top 0.50in --bottom 0.50in --header .t. --footer h.1 --nup 1 --tocheader .t. --tocfooter ..i --portrait --color --no-pscommands --no-xrxcomments --compression=1 --jpeg=0 --fontsize 10.0 --fontspacing 1.2 --headingfont Helvetica --bodyfont Times --headfootsize 10.0 --headfootfont Helvetica --charset iso-8859-1 --links --no-embedfonts --pagemode outline --pagelayout single --firstpage c1 --pageeffect none --pageduration 10 --effectduration 1.0 --no-encryption --permissions all --owner-password "" --user-password "" --browserwidth 680 Sections.html Preface.html Introduction.html Windows.html Scripting.html SWIG.html SWIGPlus.html CPlusPlus11.html CPlusPlus14.html CPlusPlus17.html Preprocessor.html Library.html Arguments.html Typemaps.html Customization.html Contract.html Varargs.html Doxygen.html Warnings.html Modules.html CCache.html Android.html CSharp.html D.html Go.html Guile.html Java.html Javascript.html Lua.html Octave.html Perl5.html Php.html Python.html R.html Ruby.html Scilab.html Tcl.html Mzscheme.html Ocaml.html Extending.html swig-4.0.1/Doc/Manual/README0000644000175000017500000000152213527063513015152 0ustar williamwilliamThis directory contains the HTML for the SWIG users manual. All of this HTML is hand-written. However, section numbering, indices, and the table of contents are generated automatically by the 'maketoc.py' script. The Makefile has further information on how the various alternative forms of the documentation are generated from the hand-written HTML. There are 4 types of boxes that code or whatever can be inside: -
    ...
    This is for text that shows the output of running commands on the shell. -
    ...
    This is for either C, C++, or SWIG code -
    ...
    This is for code in a target scripting language -
    ...
    This is for text that is not code or a shell The general format is
    whatever here
    
    swig-4.0.1/Doc/Manual/D.html0000644000175000017500000007456613527234052015363 0ustar williamwilliam SWIG and D

    23 SWIG and D

    23.1 Introduction

    From the D Programming Language web site: D is a systems programming language. Its focus is on combining the power and high performance of C and C++ with the programmer productivity of modern languages like Ruby and Python. [...] The D language is statically typed and compiles directly to machine code. As such, it is not very surprising that D is able to directly interface with C libraries. Why would a SWIG module for D be needed then in the first place?

    Well, besides the obvious downside that the C header files have to be manually converted to D modules for this to work, there is one major inconvenience with this approach: D code usually is on a higher abstraction level than C, and many of the features that make D interesting are simply not available when dealing with C libraries, requiring you e.g. to manually convert strings between pointers to \0-terminated char arrays and D char arrays, making the algorithms from the D2 standard library unusable with C arrays and data structures, and so on.

    While these issues can be worked around relatively easy by hand-coding a thin wrapper layer around the C library in question, there is another issue where writing wrapper code per hand is not feasible: C++ libraries. D did not support interfacing to C++ in version 1 at all, and even if extern(C++) has been added to D2, the support is still very limited, and a custom wrapper layer is still required in many cases.

    To help addressing these issues, the SWIG C# module has been forked to support D. Is has evolved quite a lot since then, but there are still many similarities, so if you do not find what you are looking for on this page, it might be worth having a look at the chapter on C# (and also on Java, since the C# module was in turn forked from it).

    23.2 Command line invocation

    To activate the D module, pass the -d option to SWIG at the command line. The same standard command line options as with any other language module are available, plus the following D specific ones:

    -d2

    By default, SWIG generates code for D1/Tango. Use the -d2 flag to target D2/Phobos instead.

    -splitproxy

    By default, SWIG generates two D modules: the proxy module, named like the source module (either specified via the %module directive or via the module command line option), which contains all the proxy classes, functions, enums, etc., and the intermediary module (named like the proxy module, but suffixed with _im), which contains all the extern(C) function declarations and other private parts only used internally by the proxy module.

    If the split proxy mode is enabled by passing this option at the command line, all proxy classes and enums are emitted to their own D module instead. The main proxy module only contains free functions and constants in this case.

    -package <pkg>

    By default, the proxy D modules and the intermediary D module are written to the root package. Using this option, you can specify another target package instead.

    -wrapperlibrary <wl>

    The code SWIG generates to dynamically load the C/C++ wrapper layer looks for a library called $module_wrap by default. With this option, you can override the name of the file the wrapper code loads at runtime (the lib prefix and the suffix for shared libraries are appended automatically, depending on the OS).

    This might especially be useful if you want to invoke SWIG several times on separate modules, but compile the resulting code into a single shared library.

    23.3 Typemaps

    23.3.1 C# <-> D name comparison

    If you already know the SWIG C# module, you might find the following name comparison table useful:

     ctype                  <->  ctype
     imtype                 <->  imtype
     cstype                 <->  dtype
     csin                   <->  din
     csout                  <->  dout
     csdirectorin           <->  ddirectorin
     csdirectorout          <->  ddirectorout
     csinterfaces           <->  dinterfaces
     csinterfaces_derived   <->  dinterfaces_derived
     csbase                 <->  dbase
     csclassmodifiers       <->  dclassmodifiers
     cscode                 <->  dcode
     csimports              <->  dimports
     csbody                 <->  dbody
     csfinalize             <->  ddestructor
     csdisposing            <->  ddispose
     csdisposing_derived    <->  ddispose_derived
    

    23.3.2 ctype, imtype, dtype

    Mapping of types between the C/C++ library, the C/C++ library wrapper exposing the C functions, the D wrapper module importing these functions and the D proxy code.

    The ctype typemap is used to determine the types to use in the C wrapper functions. The types from the imtype typemap are used in the extern(C) declarations of these functions in the intermediary D module. The dtype typemap contains the D types used in the D proxy module/class.

    23.3.3 in, out, directorin, directorout

    Used for converting between the types for C/C++ and D when generating the code for the wrapper functions (on the C++ side).

    The code from the in typemap is used to convert arguments to the C wrapper function to the type used in the wrapped code (ctype->original C++ type), the out typemap is utilized to convert values from the wrapped code to wrapper function return types (original C++ type->ctype).

    The directorin typemap is used to convert parameters to the type used in the D director callback function, its return value is processed by directorout (see below).

    23.3.4 din, dout, ddirectorin, ddirectorout

    Typemaps for code generation in D proxy and type wrapper classes.

    The din typemap is used for converting function parameter types from the type used in the proxy module or class to the type used in the intermediary D module (the $dinput macro is replaced). To inject further parameter processing code before or after the call to the intermediary layer, the pre, post and terminator attributes can be used (please refer to the C# date marshalling example for more information on these).

    The dout typemap is used for converting function return values from the return type used in the intermediary D module to the type returned by the proxy function. The $excode special variable in dout typemaps is replaced by the excode typemap attribute code if the method can throw any exceptions from unmanaged code, otherwise by nothing (the $imcall and $owner macros are replaced).

    The code from the ddirectorin and ddirectorout typemaps is used for conversion in director callback functions. Arguments are converted to the type used in the proxy class method they are calling by using the code from ddirectorin, the proxy class method return value is converted to the type the C++ code expects via the ddirectorout typemap (the $dcall and $winput macros are replaced).

    The full chain of type conversions when a director callback is invoked looks like this:

          type              CPPClass::method(type a)
            ↑                       ↓
       <directorout>          <directorin>
            ↑                       ↓
          ctype             methodCallback(ctype a)           C++
     :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
          imtype            methodCallback(imtype a)           D
            ↑                       ↓
      <ddirectorout>          <ddirectorin>
            ↑                       ↓
          dtype             DClass.method(dtype a)

    23.3.5 typecheck typemaps

    Because, unlike many scripting languages supported by SWIG, D does not need any dynamic dispatch helper to access an overloaded function, the purpose of these is merely to issue a warning for overloaded C++ functions that cannot be overloaded in D (as more than one C++ type maps to a single D type).

    23.3.6 Code injection typemaps

    These typemaps are used for generating the skeleton of proxy classes for C++ types.

    By overriding dbase, dinterfaces or dinterfaces_derived, the inheritance chain of the generated proxy class for a type can be modified. dclassmodifiers allows you to add any custom modifiers around the class keyword.

    Using dcode and dimports, you can specify additional D code which will be emitted into the class body respectively the imports section of the D module the class is written to.

    dconstructor, ddestructor, ddispose and ddispose_derived are used to generate the class constructor, destructor and dispose() method, respectively. The auxiliary code for handling the pointer to the C++ object is stored in dbody and dbody_derived. You can override them for specific types.

    Code can also be injected into the D proxy class using %proxycode.

    23.3.7 Special variable macros

    The standard SWIG special variables are available for use within typemaps as described in the Typemaps documentation, for example $1, $input, $result etc.

    When generating D wrappers, a few additional macros are available:

    $dclassname (C#: $csclassname)

    This special variable works similar to $n_type in that it returns the name of a type - it expands to the D proxy class name of the type being wrapped. If the type does not have an associated proxy class, it expands to the type wrapper class name, for example, SWIGTYPE_p_p_SomeCppClass is generated when wrapping SomeCppClass **.

    There are two other variants available, $&dclassname and $*dclassname. The former adds a level of indirection, while the latter removes one. For instance, when wrapping Foo **, $*dclassname would be replaced by the proxy class name corresponding to Foo *.

    $dclazzname (C#: $csclazzname)

    This special variable expands the fully qualified C++ class into the package name, if used by the nspace feature, and the proxy class name, mangled for use as a function name. For example, Namespace1::Namespace2::Klass is expanded into Namespace1_Namespace2_Klass_.

    This special variable might be useful for calling certain functions in the wrapper layer (e.g. upcast wrappers) which are mangled like this.

    $null

    In code inserted into the generated C/C++ wrapper functions, this variable is replaced by either 0 or nothing at all, depending on whether the function has a return value or not. It can be used to bail out early e.g. in case of errors (return $null;).

    $dinput (C#: $csinput)

    This variable is used in din typemaps and is replaced by the expression which is to be passed to C/C++.

    For example, this input

    %typemap(din) SomeClass * "SomeClass.getCPointer($dinput)"
    
    %inline %{
      class SomeClass {};
      void foo(SomeClass *arg);
    %}

    leads to the following D proxy code being generated:

    void foo(SomeClass arg) {
      example_im.foo(SomeClass.getCPointer(arg));
    }
    $imcall and $owner (C#: $imcall)

    These variables are used in dout typemaps. $imcall contains the call to the intermediary module which provides the value to be used, and $owner signals if the caller is responsible for managing the object lifetime (that is, if the called method is a constructor or has been marked via %newobject).

    Consider the following example:

    %typemap(dout) SomeClass * {
      return new SomeClass($imcall, $owner);
    }
    
    %inline %{
      class SomeClass;
      SomeClass *foo();
    
      %newobject bar();
      SomeClass *bar();
    %}
    

    The code generated for foo() and bar() looks like this:

    SomeClass foo() {
      return new SomeClass(example_im.foo(), false);
    }
    
    SomeClass bar() {
      return new SomeClass(example_im.bar(), true);
    }
    
    $dcall and $winput (C#: $cscall, $iminput)

    These variables are used in the director-specific typemaps ddirectorin and ddirectorout. They are more or less the reverse of the $imcall and $dinput macros: $dcall contains the invocation of the D proxy method of which the return value is to be passed back to C++, $winput contains the parameter value from C++.

    $excode

    This variable is used in dout and dconstructor typemaps and is filled with the contents of the excode typemap attribute if an exception could be thrown from the C++ side. See the C# documentation for details.

    $dbaseclass

    Currently for internal use only, it contains the D name of the C++ base class (if any) inside proxy classes.

    $directorconnect

    This macro is only valid inside the dconstructor typemap and contains the value of the dconstructor typemap attribute if the currently wrapped class has directors enabled.

    This is how the default dconstructor typemap looks like (you usually do not want to specify a custom one):

    %typemap(dconstructor, excode=SWIGEXCODE,
             directorconnect="\n  swigDirectorConnect();") SWIGTYPE {
      this($imcall, true);$excode$directorconnect
    }
    
    $importtype(SomeDType)

    This macro is used in the dimports typemap if a dependency on another D type generated by SWIG is added by a custom typemap.

    Consider the following code snippet:

    %typemap(dinterfaces) SomeClass "AnInterface, AnotherInterface";
    

    This causes SWIG to add AnInterface and AnotherInterface to the base class list of SomeClass:

    class SomeClass : AnInterface, AnotherInterface {
      ...
    }
    

    For this to work, AnInterface and AnotherInterface have to be in scope. If SWIG is not in split proxy mode, this is already the case, but if it is, they have to be added to the import list via the dimports typemap. Additionally, the import statement depends on the package SWIG is configured to emit the modules to.

    The $importtype macro helps you to elegantly solve this problem:

    %typemap(dimports) RemoteMpe %{
    $importtype(AnInterface)
    $importtype(AnotherInterface)
    %}
    

    If SWIG is in split proxy mode, it expands to an import statement for the specified type, to nothing if not.

    $module

    Expands to the name of the main proxy D module.

    $imdmodule

    Contains the fully qualified name of the intermediary D module.

    23.4 D and %feature

    The D module defines a number of directives which modify the SWIG features set globally or for a specific declaration:

    %dmanifestconst and %dconstvalue(value)

    Out of the box, SWIG generates accessor methods for C #defines and C++ constants. The %dmanifestconst directive enables wrapping these constants as D manifest constants (const in D1, enum in D2).

    For this to work, the C/C++ code for the constant value must directly compile as D code, though. If this is not the case, you can manually override the expression written to the D proxy module using the %dconstvalue directive, passing the new value as parameter.

    For enums, again %dconstvalue can be used to override the value of an enum item if the initializer should not compile in D.

    %dmethodmodifiers

    This directive can be used to override the modifiers for a proxy function. For instance, you could make a public C++ member function private in D like this:

    %dmethodmodifiers A::foo "private";
    
    %inline %{
    struct A {
      void foo();
    };
    %}
    

    23.5 Pragmas

    There are a few SWIG pragmas specific to the D module, which you can use to influence the D code SWIG generates:

    %pragma(d) imdmodulecode

    The passed text (D code) is copied verbatim to the intermediary D module. For example, it can be (and is, internally) used to emit additional private helper code for the use by proxy typemaps.

    %pragma(d) imdmoduleimports

    Additional code to be emitted to the imports section of the intermediary D module (the $importtype macro can be used here). You probably want to use this in conjunction with the imdmodulecode pragma.

    %pragma(d) proxydmodulecode

    Just like proxydmodulecode, the argument is copied to the proxy D module (if SWIG is in split proxy mode and/or the nspace feature is used, it is emitted to the main proxy D module only).

    %pragma(d) globalproxyimports

    The D module currently does not support specifying dependencies on external modules (e.g. from the standard library) for the D typemaps. To add the import statements to the proxy modules (resp. to all proxy modules if in split proxy mode), you can use the globalproxyimports directive.

    For example:

    %typemap(din) char[] "($dinput ? tango.stdc.stringz.toStringz($dinput) : null)"
    %pragma(d) globalproxyimports = "static import tango.stdc.stringz;";
    
    %pragma(d) wrapperloadercode

    The D code for loading the wrapper library (it is copied to the intermediary D module). The $wrapperloaderbindcode variable is replaced by the list of commands for binding the functions from the wrapper library to the symbols in the intermediary D module.

    Each time this pragma is specified, the previous value is overwritten.

    %pragma(d) wrapperloaderbindcommand

    The D command to use for binding the wrapper functions from the C/C++ library to the symbols in the intermediary D module. The $function variable contains the name of the D function in the wrap module, the $symbol variable is replaced by the name of the symbol in the library.

    Each time this pragma is specified, the previous value is overwritten.

    23.6 D Exceptions

    Out of the box, C++ exceptions are fundamentally incompatible to their equivalent in the D world and cannot simply be propagated to a calling D method. There is, however, an easy way to solve this problem: Just catch the exception in the C/C++ wrapper layer, pass the contents to D, and make the wrapper code rethrow the exception in the D world.

    The implementation details of this are a bit crude, but the SWIG D module automatically takes care of this, as long as it is able to detect that an exception could potentially be thrown (e.g. because the C++ method has a throw(...) exception specification).

    As this feature is implemented in exactly the same way it is for C#, please see the C# documentation for a more detailed explanation.

    23.7 D Directors

    When the directors feature is activated, SWIG generates extra code on both the C++ and the D side to enable cross-language polymorphism. Essentially, this means that if you subclass a proxy class in D, C++ code can access any overridden virtual methods just as if you created a derived class in C++.

    There is no D specific documentation yet, but the way the feature is implemented is very similar to how it is done in Java and C#.

    23.8 Other features

    23.8.1 Extended namespace support (nspace)

    By default, SWIG flattens all C++ namespaces into a single target language namespace, but as for Java and C#, the nspace feature is supported for D. If it is active, C++ namespaces are mapped to D packages/modules. Note, however, that like for the other languages, free variables and functions are not supported yet; currently, they are all allows written to the main proxy D module.

    23.8.2 Native pointer support

    Contrary to many of the scripting languages supported by SWIG, D fully supports C-style pointers. The D module thus includes a custom mechanism to wrap C pointers directly as D pointers where applicable, that is, if the type that is pointed to is represented the same in C and D (on the bit-level), dubbed a primitive type below.

    Central to this custom pointer handling scheme are two typemap attributes: the cprimitive attribute on the dtype typemap and the nativepointer attribute on all the typemaps which influence the D side of the code (dtype, din, dout, ...). When a D typemap is looked up, the following happens behind the scenes:

    First, the matching typemap is determined by the usual typemap lookup rules. Then, it is checked if the result has the nativepointer attribute set. If it is present, it means that its value should replace the typemap value if and only if the actual type the typemap is looked up for is a primitive type, a pointer to a primitive type (through an arbitrary level of indirections), or a function pointer with only primitive types in its signature.

    To determine if a type should be considered primitive, the cprimitive attribute on its dtype attribute is used. For example, the dtype typemap for float has cprimitive="1", so the code from the nativepointer attribute is taken into account e.g. for float ** or the function pointer float (*)(float *).

    23.8.3 Operator overloading

    The D module comes with basic operator overloading support for both D1 and D2. There are, however, a few limitations arising from conceptual differences between C++ and D:

    The first key difference is that C++ supports free functions as operators (along with argument-dependent lookup), while D requires operators to be member functions of the class they are operating on. SWIG can only automatically generate wrapping code for member function operators; if you want to use operators defined as free functions in D, you need to handle them manually.

    Another set of differences between C++ and D concerns individual operators. For example, there are quite a few operators which are overloadable in C++, but not in D, for example && and ||, but also !, and prefix increment/decrement operators in D1 resp. their postfix pendants in D2.

    There are also some cases where the operators can be translated to D, but the differences in the implementation details are big enough that a rather involved scheme would be required for automatic wrapping them, which has not been implemented yet. This affects, for example, the array subscript operator, [], in combination with assignments - while operator [] in C++ simply returns a reference which is then written to, D resorts to a separate opIndexAssign method -, or implicit casting (which was introduced in D2 via alias this). Despite the lack of automatic support, manually handling these cases should be perfectly possible.

    23.8.4 Running the test-suite

    As with any other language, the SWIG test-suite can be built for D using the *-d-test-suite targets of the top-level Makefile. By default, D1 is targeted, to build it with D2, use the optional D_VERSION variable, e.g. make check-d-test-suite D_VERSION=2.

    Note: If you want to use GDC on Linux or another platform which requires you to link libdl for dynamically loading the shared library, you might have to add -ldl manually to the d_compile target in Examples/Makefile, because GDC does not currently honor the pragma(lib, ...) statement.

    23.9 D Typemap examples

    There are no D-specific typemap examples yet. However, with the above name comparison table, you should be able to get an idea what can be done by looking at the corresponding C# section.

    23.10 Work in progress and planned features

    There are a couple of features which are not implemented yet, but would be very useful and might be added in the near future:

    • Static linking: Currently, the C wrapper code is compiled into a dynamic library, out of which the symbol addresses are looked up at runtime by the D part. If statically linking the different languages into one binary was supported, a tool-chain capable of performing IPO at link time could inline the wrapping code, effectively reducing the overhead for simple calls to zero.
    • C array handling: Many data structures in some C/C++ libraries contain array containing of a pointer to the first element and the element count. Currently, one must manually writing wrapper code to be able to access these from D. It should be possible to add a set of SWIG macros to semi-automatically generate conversion code.

    Some generated code might also be a bit rough around the edges, particularly in the following areas:

    • Memory management: Although the currently generated wrapper code works fine with regard to the GC for the test-suite, there might be issues coming up in real-world multi-threaded usage.
    • D2 support: Originally, the module has been developed for the use with D1, D2/Phobos support has been added in later. The basic features should work equally well for both, but there could be issues concerning const-correctness etc.
    swig-4.0.1/Doc/Manual/Extending.html0000644000175000017500000036236113527234053017117 0ustar williamwilliam Extending SWIG to support new languages

    39 Extending SWIG to support new languages

    39.1 Introduction

    This chapter describes SWIG's internal organization and the process by which new target languages can be developed. First, a brief word of warning---SWIG is continually evolving. The information in this chapter is mostly up to date, but changes are ongoing. Expect a few inconsistencies.

    Also, this chapter is not meant to be a hand-holding tutorial. As a starting point, you should probably look at one of SWIG's existing modules.

    39.2 Prerequisites

    In order to extend SWIG, it is useful to have the following background:

    • An understanding of the C API for the target language.
    • A good grasp of the C++ type system.
    • An understanding of typemaps and some of SWIG's advanced features.
    • Some familiarity with writing C++ (language modules are currently written in C++).

    Since SWIG is essentially a specialized C++ compiler, it may be useful to have some prior experience with compiler design (perhaps even a compilers course) to better understand certain parts of the system. A number of books will also be useful. For example, "The C Programming Language" by Kernighan and Ritchie (a.k.a, "K&R") and the C++ standard, "ISO/IEC 14882 Programming Languages - C++" will be of great use.

    Also, it is useful to keep in mind that SWIG primarily operates as an extension of the C++ type system. At first glance, this might not be obvious, but almost all SWIG directives as well as the low-level generation of wrapper code are driven by C++ datatypes.

    39.3 The Big Picture

    SWIG is a special purpose compiler that parses C++ declarations to generate wrapper code. To make this conversion possible, SWIG makes three fundamental extensions to the C++ language:

    • Typemaps. Typemaps are used to define the conversion/marshalling behavior of specific C++ datatypes. All type conversion in SWIG is based on typemaps. Furthermore, the association of typemaps to datatypes utilizes an advanced pattern matching mechanism that is fully integrated with the C++ type system.
    • Declaration Annotation. To customize wrapper code generation, most declarations can be annotated with special features. For example, you can make a variable read-only, you can ignore a declaration, you can rename a member function, you can add exception handling, and so forth. Virtually all of these customizations are built on top of a low-level declaration annotator that can attach arbitrary attributes to any declaration. Code generation modules can look for these attributes to guide the wrapping process.
    • Class extension. SWIG allows classes and structures to be extended with new methods and attributes (the %extend directive). This has the effect of altering the API in the target language and can be used to generate OO interfaces to C libraries.

    It is important to emphasize that virtually all SWIG features reduce to one of these three fundamental concepts. The type system and pattern matching rules also play a critical role in making the system work. For example, both typemaps and declaration annotation are based on pattern matching and interact heavily with the underlying type system.

    39.4 Execution Model

    When you run SWIG on an interface, processing is handled in stages by a series of system components:

    • An integrated C preprocessor reads a collection of configuration files and the specified interface file into memory. The preprocessor performs the usual functions including macro expansion and file inclusion. However, the preprocessor also performs some transformations of the interface. For instance, #define statements are sometimes transformed into %constant declarations. In addition, information related to file/line number tracking is inserted.
    • A C/C++ parser reads the preprocessed input and generates a full parse tree of all of the SWIG directives and C declarations found. The parser is responsible for many aspects of the system including renaming, declaration annotation, and template expansion. However, the parser does not produce any output nor does it interact with the target language module as it runs. SWIG is not a one-pass compiler.
    • A type-checking pass is made. This adjusts all of the C++ typenames to properly handle namespaces, typedefs, nested classes, and other issues related to type scoping.
    • A semantic pass is made on the parse tree to collect information related to properties of the C++ interface. For example, this pass would determine whether or not a class allows a default constructor.
    • A code generation pass is made using a specific target language module. This phase is responsible for generating the actual wrapper code. All of SWIG's user-defined modules are invoked during this latter stage of compilation.

    The next few sections briefly describe some of these stages.

    39.4.1 Preprocessing

    The preprocessor plays a critical role in the SWIG implementation. This is because a lot of SWIG's processing and internal configuration is managed not by code written in C, but by configuration files in the SWIG library. In fact, when you run SWIG, parsing starts with a small interface file like this (note: this explains the cryptic error messages that new users sometimes get when SWIG is misconfigured or installed incorrectly):

    %include "swig.swg"             // Global SWIG configuration
    %include "langconfig.swg"       // Language specific configuration
    %include "yourinterface.i"      // Your interface file
    

    The swig.swg file contains global configuration information. In addition, this file defines many of SWIG's standard directives as macros. For instance, part of of swig.swg looks like this:

    ...
    /* Code insertion directives such as %wrapper %{ ... %} */
    
    #define %begin       %insert("begin")
    #define %runtime     %insert("runtime")
    #define %header      %insert("header")
    #define %wrapper     %insert("wrapper")
    #define %init        %insert("init")
    
    /* Access control directives */
    
    #define %immutable   %feature("immutable", "1")
    #define %mutable     %feature("immutable")
    
    /* Directives for callback functions */
    
    #define %callback(x) %feature("callback") `x`;
    #define %nocallback  %feature("callback");
    
    /* %ignore directive */
    
    #define %ignore         %rename($ignore)
    #define %ignorewarn(x)  %rename("$ignore:" x)
    ...
    

    The fact that most of the standard SWIG directives are macros is intended to simplify the implementation of the internals. For instance, rather than having to support dozens of special directives, it is easier to have a few basic primitives such as %feature or %insert.

    The langconfig.swg file is supplied by the target language. This file contains language-specific configuration information. More often than not, this file provides run-time wrapper support code (e.g., the type-checker) as well as a collection of typemaps that define the default wrapping behavior. Note: the name of this file depends on the target language and is usually something like python.swg or perl5.swg.

    As a debugging aid, the text that SWIG feeds to its C++ parser can be obtained by running swig -E interface.i. This output probably isn't too useful in general, but it will show how macros have been expanded as well as everything else that goes into the low-level construction of the wrapper code.

    39.4.2 Parsing

    The current C++ parser handles a subset of C++. Most incompatibilities with C are due to subtle aspects of how SWIG parses declarations. Specifically, SWIG expects all C/C++ declarations to follow this general form:

    storage type declarator initializer;
    

    storage is a keyword such as extern, static, typedef, or virtual. type is a primitive datatype such as int or void. type may be optionally qualified with a qualifier such as const or volatile. declarator is a name with additional type-construction modifiers attached to it (pointers, arrays, references, functions, etc.). Examples of declarators include *x, **x, x[20], and (*x)(int, double). The initializer may be a value assigned using = or body of code enclosed in braces { ... }.

    This declaration format covers most common C++ declarations. However, the C++ standard is somewhat more flexible in the placement of the parts. For example, it is technically legal, although uncommon to write something like int typedef const a in your program. SWIG simply doesn't bother to deal with this case.

    The other significant difference between C++ and SWIG is in the treatment of typenames. In C++, if you have a declaration like this,

    int blah(Foo *x, Bar *y);
    

    it won't parse correctly unless Foo and Bar have been previously defined as types either using a class definition or a typedef. The reasons for this are subtle, but this treatment of typenames is normally integrated at the level of the C tokenizer---when a typename appears, a different token is returned to the parser instead of an identifier.

    SWIG does not operate in this manner--any legal identifier can be used as a type name. The reason for this is primarily motivated by the use of SWIG with partially defined data. Specifically, SWIG is supposed to be easy to use on interfaces with missing type information.

    Because of the different treatment of typenames, the most serious limitation of the SWIG parser is that it can't process type declarations where an extra (and unnecessary) grouping operator is used. For example:

    int (x);         /* A variable x */
    int (y)(int);    /* A function y */
    

    The placing of extra parentheses in type declarations like this is already recognized by the C++ community as a potential source of strange programming errors. For example, Scott Meyers "Effective STL" discusses this problem in a section on avoiding C++'s "most vexing parse."

    The parser is also unable to handle declarations with no return type or bare argument names. For example, in an old C program, you might see things like this:

    foo(a, b) {
    ...
    }
    

    In this case, the return type as well as the types of the arguments are taken by the C compiler to be an int. However, SWIG interprets the above code as an abstract declarator for a function returning a foo and taking types a and b as arguments).

    39.4.3 Parse Trees

    The SWIG parser produces a complete parse tree of the input file before any wrapper code is actually generated. Each item in the tree is known as a "Node". Each node is identified by a symbolic tag. Furthermore, a node may have an arbitrary number of children. The parse tree structure and tag names of an interface can be displayed using swig -debug-tags. For example:

    $ swig -c++ -python -debug-tags example.i
     . top (example.i:1)
     . top . include (example.i:1)
     . top . include . typemap (/r0/beazley/Projects/lib/swig1.3/swig.swg:71)
     . top . include . typemap . typemapitem (/r0/beazley/Projects/lib/swig1.3/swig.swg:71)
     . top . include . typemap (/r0/beazley/Projects/lib/swig1.3/swig.swg:83)
     . top . include . typemap . typemapitem (/r0/beazley/Projects/lib/swig1.3/swig.swg:83)
     . top . include (example.i:4)
     . top . include . insert (/r0/beazley/Projects/lib/swig1.3/python/python.swg:7)
     . top . include . insert (/r0/beazley/Projects/lib/swig1.3/python/python.swg:8)
     . top . include . typemap (/r0/beazley/Projects/lib/swig1.3/python/python.swg:19)
    ...
     . top . include (example.i:6)
     . top . include . module (example.i:2)
     . top . include . insert (example.i:6)
     . top . include . include (example.i:9)
     . top . include . include . class (example.h:3)
     . top . include . include . class . access (example.h:4)
     . top . include . include . class . constructor (example.h:7)
     . top . include . include . class . destructor (example.h:10)
     . top . include . include . class . cdecl (example.h:11)
     . top . include . include . class . cdecl (example.h:11)
     . top . include . include . class . cdecl (example.h:12)
     . top . include . include . class . cdecl (example.h:13)
     . top . include . include . class . cdecl (example.h:14)
     . top . include . include . class . cdecl (example.h:15)
     . top . include . include . class (example.h:18)
     . top . include . include . class . access (example.h:19)
     . top . include . include . class . cdecl (example.h:20)
     . top . include . include . class . access (example.h:21)
     . top . include . include . class . constructor (example.h:22)
     . top . include . include . class . cdecl (example.h:23)
     . top . include . include . class . cdecl (example.h:24)
     . top . include . include . class (example.h:27)
     . top . include . include . class . access (example.h:28)
     . top . include . include . class . cdecl (example.h:29)
     . top . include . include . class . access (example.h:30)
     . top . include . include . class . constructor (example.h:31)
     . top . include . include . class . cdecl (example.h:32)
     . top . include . include . class . cdecl (example.h:33)
    

    Even for the most simple interface, the parse tree structure is larger than you might expect. For example, in the above output, a substantial number of nodes are actually generated by the python.swg configuration file which defines typemaps and other directives. The contents of the user-supplied input file don't appear until the end of the output.

    The contents of each parse tree node consist of a collection of attribute/value pairs. Internally, the nodes are simply represented by hash tables. A display of the entire parse-tree structure can be obtained using swig -debug-top <n>, where n is the stage being processed. There are a number of other parse tree display options, for example, swig -debug-module <n> will avoid displaying system parse information and only display the parse tree pertaining to the user's module at stage n of processing.

    $ swig -c++ -python -debug-module 4 example.i
          +++ include ----------------------------------------
          | name         - "example.i"
    
                +++ module ----------------------------------------
                | name         - "example"
                |
                +++ insert ----------------------------------------
                | code         - "\n#include \"example.h\"\n"
                |
                +++ include ----------------------------------------
                | name         - "example.h"
    
                      +++ class ----------------------------------------
                      | abstract     - "1"
                      | sym:name     - "Shape"
                      | name         - "Shape"
                      | kind         - "class"
                      | symtab       - 0x40194140
                      | sym:symtab   - 0x40191078
    
                            +++ access ----------------------------------------
                            | kind         - "public"
                            |
                            +++ constructor ----------------------------------------
                            | sym:name     - "Shape"
                            | name         - "Shape"
                            | decl         - "f()."
                            | code         - "{\n    nshapes++;\n  }"
                            | sym:symtab   - 0x40194140
                            |
                            +++ destructor ----------------------------------------
                            | sym:name     - "~Shape"
                            | name         - "~Shape"
                            | storage      - "virtual"
                            | code         - "{\n    nshapes--;\n  }"
                            | sym:symtab   - 0x40194140
                            |
                            +++ cdecl ----------------------------------------
                            | sym:name     - "x"
                            | name         - "x"
                            | decl         - ""
                            | type         - "double"
                            | sym:symtab   - 0x40194140
                            |
                            +++ cdecl ----------------------------------------
                            | sym:name     - "y"
                            | name         - "y"
                            | decl         - ""
                            | type         - "double"
                            | sym:symtab   - 0x40194140
                            |
                            +++ cdecl ----------------------------------------
                            | sym:name     - "move"
                            | name         - "move"
                            | decl         - "f(double, double)."
                            | parms        - double, double
                            | type         - "void"
                            | sym:symtab   - 0x40194140
                            |
                            +++ cdecl ----------------------------------------
                            | sym:name     - "area"
                            | name         - "area"
                            | decl         - "f(void)."
                            | parms        - void
                            | storage      - "virtual"
                            | value        - "0"
                            | type         - "double"
                            | sym:symtab   - 0x40194140
                            |
                            +++ cdecl ----------------------------------------
                            | sym:name     - "perimeter"
                            | name         - "perimeter"
                            | decl         - "f(void)."
                            | parms        - void
                            | storage      - "virtual"
                            | value        - "0"
                            | type         - "double"
                            | sym:symtab   - 0x40194140
                            |
                            +++ cdecl ----------------------------------------
                            | sym:name     - "nshapes"
                            | name         - "nshapes"
                            | decl         - ""
                            | storage      - "static"
                            | type         - "int"
                            | sym:symtab   - 0x40194140
                            |
                      +++ class ----------------------------------------
                      | sym:name     - "Circle"
                      | name         - "Circle"
                      | kind         - "class"
                      | bases        - 0x40194510
                      | symtab       - 0x40194538
                      | sym:symtab   - 0x40191078
    
                            +++ access ----------------------------------------
                            | kind         - "private"
                            |
                            +++ cdecl ----------------------------------------
                            | name         - "radius"
                            | decl         - ""
                            | type         - "double"
                            |
                            +++ access ----------------------------------------
                            | kind         - "public"
                            |
                            +++ constructor ----------------------------------------
                            | sym:name     - "Circle"
                            | name         - "Circle"
                            | parms        - double
                            | decl         - "f(double)."
                            | code         - "{ }"
                            | sym:symtab   - 0x40194538
                            |
                            +++ cdecl ----------------------------------------
                            | sym:name     - "area"
                            | name         - "area"
                            | decl         - "f(void)."
                            | parms        - void
                            | storage      - "virtual"
                            | type         - "double"
                            | sym:symtab   - 0x40194538
                            |
                            +++ cdecl ----------------------------------------
                            | sym:name     - "perimeter"
                            | name         - "perimeter"
                            | decl         - "f(void)."
                            | parms        - void
                            | storage      - "virtual"
                            | type         - "double"
                            | sym:symtab   - 0x40194538
                            |
                      +++ class ----------------------------------------
                      | sym:name     - "Square"
                      | name         - "Square"
                      | kind         - "class"
                      | bases        - 0x40194760
                      | symtab       - 0x40194788
                      | sym:symtab   - 0x40191078
    
                            +++ access ----------------------------------------
                            | kind         - "private"
                            |
                            +++ cdecl ----------------------------------------
                            | name         - "width"
                            | decl         - ""
                            | type         - "double"
                            |
                            +++ access ----------------------------------------
                            | kind         - "public"
                            |
                            +++ constructor ----------------------------------------
                            | sym:name     - "Square"
                            | name         - "Square"
                            | parms        - double
                            | decl         - "f(double)."
                            | code         - "{ }"
                            | sym:symtab   - 0x40194788
                            |
                            +++ cdecl ----------------------------------------
                            | sym:name     - "area"
                            | name         - "area"
                            | decl         - "f(void)."
                            | parms        - void
                            | storage      - "virtual"
                            | type         - "double"
                            | sym:symtab   - 0x40194788
                            |
                            +++ cdecl ----------------------------------------
                            | sym:name     - "perimeter"
                            | name         - "perimeter"
                            | decl         - "f(void)."
                            | parms        - void
                            | storage      - "virtual"
                            | type         - "double"
                            | sym:symtab   - 0x40194788
    

    39.4.4 Attribute namespaces

    Attributes of parse tree nodes are often prepended with a namespace qualifier. For example, the attributes sym:name and sym:symtab are attributes related to symbol table management and are prefixed with sym:. As a general rule, only those attributes which are directly related to the raw declaration appear without a prefix (type, name, declarator, etc.).

    Target language modules may add additional attributes to nodes to assist the generation of wrapper code. The convention for doing this is to place these attributes in a namespace that matches the name of the target language. For example, python:foo or perl:foo.

    39.4.5 Symbol Tables

    During parsing, all symbols are managed in the space of the target language. The sym:name attribute of each node contains the symbol name selected by the parser. Normally, sym:name and name are the same. However, the %rename directive can be used to change the value of sym:name. You can see the effect of %rename by trying it on a simple interface and dumping the parse tree. For example:

    %rename(foo_i) foo(int);
    %rename(foo_d) foo(double);
    
    void foo(int);
    void foo(double);
    void foo(Bar *b);
    

    There are various debug- options that can be useful for debugging and analysing the parse tree. For example, the debug-top <n> or debug-module <n> options will dump the entire/top of the parse tree or the module subtree at one of the four n stages of processing. The parse tree can be viewed after the final stage of processing by running SWIG:

    $ swig -debug-top 4 example.i
    ...
                +++ cdecl ----------------------------------------
                | sym:name     - "foo_i"
                | name         - "foo"
                | decl         - "f(int)."
                | parms        - int
                | type         - "void"
                | sym:symtab   - 0x40165078
                |
                +++ cdecl ----------------------------------------
                | sym:name     - "foo_d"
                | name         - "foo"
                | decl         - "f(double)."
                | parms        - double
                | type         - "void"
                | sym:symtab   - 0x40165078
                |
                +++ cdecl ----------------------------------------
                | sym:name     - "foo"
                | name         - "foo"
                | decl         - "f(p.Bar)."
                | parms        - Bar *
                | type         - "void"
                | sym:symtab   - 0x40165078
    

    All symbol-related conflicts and complaints about overloading are based on sym:name values. For instance, the following example uses %rename in reverse to generate a name clash.

    %rename(foo) foo_i(int);
    %rename(foo) foo_d(double);
    
    void foo_i(int);
    void foo_d(double);
    void foo(Bar *b);
    

    When you run SWIG on this you now get:

    $ ./swig example.i
    example.i:6. Overloaded declaration ignored.  foo_d(double )
    example.i:5. Previous declaration is foo_i(int )
    example.i:7. Overloaded declaration ignored.  foo(Bar *)
    example.i:5. Previous declaration is foo_i(int )
    

    39.4.6 The %feature directive

    A number of SWIG directives such as %exception are implemented using the low-level %feature directive. For example:

    %feature("except") getitem(int) {
      try {
         $action
      } catch (badindex) {
         ...
      }
    }
    
    ...
    class Foo {
    public:
      Object *getitem(int index) throws(badindex);
      ...
    };
    

    The behavior of %feature is very easy to describe--it simply attaches a new attribute to any parse tree node that matches the given prototype. When a feature is added, it shows up as an attribute in the feature: namespace. You can see this when running with the -debug-top 4 option. For example:

     +++ cdecl ----------------------------------------
     | sym:name     - "getitem"
     | name         - "getitem"
     | decl         - "f(int).p."
     | parms        - int
     | type         - "Object"
     | feature:except - "{\n    try {\n       $action\n    } catc..."
     | sym:symtab   - 0x40168ac8
     |
    

    Feature names are completely arbitrary and a target language module can be programmed to respond to any feature name that it wants to recognize. The data stored in a feature attribute is usually just a raw unparsed string. For example, the exception code above is simply stored without any modifications.

    39.4.7 Code Generation

    Language modules work by defining handler functions that know how to respond to different types of parse-tree nodes. These handlers simply look at the attributes of each node in order to produce low-level code.

    In reality, the generation of code is somewhat more subtle than simply invoking handler functions. This is because parse-tree nodes might be transformed. For example, suppose you are wrapping a class like this:

    class Foo {
    public:
      virtual int *bar(int x);
    };
    

    When the parser constructs a node for the member bar, it creates a raw "cdecl" node with the following attributes:

    nodeType    : cdecl
    name        : bar
    type        : int
    decl        : f(int).p
    parms       : int x
    storage     : virtual
    sym:name    : bar
    

    To produce wrapper code, this "cdecl" node undergoes a number of transformations. First, the node is recognized as a function declaration. This adjusts some of the type information--specifically, the declarator is joined with the base datatype to produce this:

    nodeType    : cdecl
    name        : bar
    type        : p.int        <-- Notice change in return type
    decl        : f(int).p
    parms       : int x
    storage     : virtual
    sym:name    : bar
    

    Next, the context of the node indicates that the node is really a member function. This produces a transformation to a low-level accessor function like this:

    nodeType    : cdecl
    name        : bar
    type        : int.p
    decl        : f(int).p
    parms       : Foo *self, int x            <-- Added parameter
    storage     : virtual
    wrap:action : result = (arg1)->bar(arg2)  <-- Action code added
    sym:name    : Foo_bar                     <-- Symbol name changed
    

    In this transformation, notice how an additional parameter was added to the parameter list and how the symbol name of the node has suddenly changed into an accessor using the naming scheme described in the "SWIG Basics" chapter. A small fragment of "action" code has also been generated--notice how the wrap:action attribute defines the access to the underlying method. The data in this transformed node is then used to generate a wrapper.

    Language modules work by registering handler functions for dealing with various types of nodes at different stages of transformation. This is done by inheriting from a special Language class and defining a collection of virtual methods. For example, the Python module defines a class as follows:

    class PYTHON : public Language {
    protected:
    public :
      virtual void main(int, char *argv[]);
      virtual int  top(Node *);
      virtual int  functionWrapper(Node *);
      virtual int  constantWrapper(Node *);
      virtual int  variableWrapper(Node *);
      virtual int  nativeWrapper(Node *);
      virtual int  membervariableHandler(Node *);
      virtual int  memberconstantHandler(Node *);
      virtual int  memberfunctionHandler(Node *);
      virtual int  constructorHandler(Node *);
      virtual int  destructorHandler(Node *);
      virtual int  classHandler(Node *);
      virtual int  classforwardDeclaration(Node *);
      virtual int  insertDirective(Node *);
      virtual int  importDirective(Node *);
    };
    

    The role of these functions is described shortly.

    39.4.8 SWIG and XML

    Much of SWIG's current parser design was originally motivated by interest in using XML to represent SWIG parse trees. Although XML is not currently used in any direct manner, the parse tree structure, use of node tags, attributes, and attribute namespaces are all influenced by aspects of XML parsing. Therefore, in trying to understand SWIG's internal data structures, it may be useful to keep XML in the back of your mind as a model.

    39.5 Primitive Data Structures

    Most of SWIG is constructed using three basic data structures: strings, hashes, and lists. These data structures are dynamic in same way as similar structures found in many scripting languages. For instance, you can have containers (lists and hash tables) of mixed types and certain operations are polymorphic.

    This section briefly describes the basic structures so that later sections of this chapter make more sense.

    When describing the low-level API, the following type name conventions are used:

    • String. A string object.
    • Hash. A hash object.
    • List. A list object.
    • String_or_char. A string object or a char *.
    • Object_or_char. An object or a char *.
    • Object. Any object (string, hash, list, etc.)

    In most cases, other typenames in the source are aliases for one of these primitive types. Specifically:

    typedef String SwigType;
    typedef Hash   Parm;
    typedef Hash   ParmList;
    typedef Hash   Node;
    typedef Hash   Symtab;
    typedef Hash   Typetab;
    

    39.5.1 Strings

    String *NewString(const String_or_char *val)

    Creates a new string with initial value val. val may be a char * or another String object. If you want to create an empty string, use "" for val.

    String *NewStringf(const char *fmt, ...)

    Creates a new string whose initial value is set according to a C printf style format string in fmt. Additional arguments follow depending on fmt.

    String *Copy(String *s)

    Make a copy of the string s.

    void Delete(String *s)

    Deletes s.

    int Len(const String_or_char *s)

    Returns the length of the string.

    char *Char(const String_or_char *s)

    Returns a pointer to the first character in a string.

    void Append(String *s, const String_or_char *t)

    Appends t to the end of string s.

    void Insert(String *s, int pos, const String_or_char *t)

    Inserts t into s at position pos. The contents of s are shifted accordingly. The special value DOH_END can be used for pos to indicate insertion at the end of the string (appending).

    int Strcmp(const String_or_char *s, const String_or_char *t)

    Compare strings s and t. Same as the C strcmp() function.

    int Strncmp(const String_or_char *s, const String_or_char *t, int len)

    Compare the first len characters of strings s and t. Same as the C strncmp() function.

    char *Strstr(const String_or_char *s, const String_or_char *pat)

    Returns a pointer to the first occurrence of pat in s. Same as the C strstr() function.

    char *Strchr(const String_or_char *s, char ch)

    Returns a pointer to the first occurrence of character ch in s. Same as the C strchr() function.

    void Chop(String *s)

    Chops trailing whitespace off the end of s.

    int Replace(String *s, const String_or_char *pat, const String_or_char *rep, int flags)

    Replaces the pattern pat with rep in string s. flags is a combination of the following flags:

    DOH_REPLACE_ANY       - Replace all occurrences
    DOH_REPLACE_ID        - Valid C identifiers only
    DOH_REPLACE_NOQUOTE   - Don't replace in quoted strings
    DOH_REPLACE_FIRST     - Replace first occurrence only.
    

    Returns the number of replacements made (if any).

    39.5.2 Hashes

    Hash *NewHash()

    Creates a new empty hash table.

    Hash *Copy(Hash *h)

    Make a shallow copy of the hash h.

    void Delete(Hash *h)

    Deletes h.

    int Len(Hash *h)

    Returns the number of items in h.

    Object *Getattr(Hash *h, const String_or_char *key)

    Gets an object from h. key may be a string or a simple char * string. Returns NULL if not found.

    int Setattr(Hash *h, const String_or_char *key, const Object_or_char *val)

    Stores val in h. key may be a string or a simple char *. If val is not a standard object (String, Hash, or List) it is assumed to be a char * in which case it is used to construct a String that is stored in the hash. If val is NULL, the object is deleted. Increases the reference count of val. Returns 1 if this operation replaced an existing hash entry, 0 otherwise.

    int Delattr(Hash *h, const String_or_char *key)

    Deletes the hash item referenced by key. Decreases the reference count on the corresponding object (if any). Returns 1 if an object was removed, 0 otherwise.

    List *Keys(Hash *h)

    Returns the list of hash table keys.

    39.5.3 Lists

    List *NewList()

    Creates a new empty list.

    List *Copy(List *x)

    Make a shallow copy of the List x.

    void Delete(List *x)

    Deletes x.

    int Len(List *x)

    Returns the number of items in x.

    Object *Getitem(List *x, int n)

    Returns an object from x with index n. If n is beyond the end of the list, the last item is returned. If n is negative, the first item is returned.

    int *Setitem(List *x, int n, const Object_or_char *val)

    Stores val in x. If val is not a standard object (String, Hash, or List) it is assumed to be a char * in which case it is used to construct a String that is stored in the list. n must be in range. Otherwise, an assertion will be raised.

    int *Delitem(List *x, int n)

    Deletes item n from the list, shifting items down if necessary. To delete the last item in the list, use the special value DOH_END for n.

    void Append(List *x, const Object_or_char *t)

    Appends t to the end of x. If t is not a standard object, it is assumed to be a char * and is used to create a String object.

    void Insert(String *s, int pos, const Object_or_char *t)

    Inserts t into s at position pos. The contents of s are shifted accordingly. The special value DOH_END can be used for pos to indicate insertion at the end of the list (appending). If t is not a standard object, it is assumed to be a char * and is used to create a String object.

    39.5.4 Common operations

    The following operations are applicable to all datatypes.

    Object *Copy(Object *x)

    Make a copy of the object x.

    void Delete(Object *x)

    Deletes x.

    void Setfile(Object *x, String_or_char *f)

    Sets the filename associated with x. Used to track objects and report errors.

    String *Getfile(Object *x)

    Gets the filename associated with x.

    void Setline(Object *x, int n)

    Sets the line number associated with x. Used to track objects and report errors.

    int Getline(Object *x)

    Gets the line number associated with x.

    39.5.5 Iterating over Lists and Hashes

    To iterate over the elements of a list or a hash table, the following functions are used:

    Iterator First(Object *x)

    Returns an iterator object that points to the first item in a list or hash table. The item attribute of the Iterator object is a pointer to the item. For hash tables, the key attribute of the Iterator object additionally points to the corresponding Hash table key. The item and key attributes are NULL if the object contains no items or if there are no more items.

    Iterator Next(Iterator i)

    Returns an iterator that points to the next item in a list or hash table. Here are two examples of iteration:

    List *l = (some list);
    Iterator i;
    
    for (i = First(l); i.item; i = Next(i)) {
      Printf(stdout, "%s\n", i.item);
    }
    
    Hash *h = (some hash);
    Iterator j;
    
    for (j = First(j); j.item; j= Next(j)) {
      Printf(stdout, "%s : %s\n", j.key, j.item);
    }
    

    39.5.6 I/O

    Special I/O functions are used for all internal I/O. These operations work on C FILE * objects, String objects, and special File objects (which are merely a wrapper around FILE *).

    int Printf(String_or_FILE *f, const char *fmt, ...)

    Formatted I/O. Same as the C fprintf() function except that output can also be directed to a string object. Note: the %s format specifier works with both strings and char *. All other format operators have the same meaning.

    int Printv(String_or_FILE *f, String_or_char *arg1, ..., NULL)

    Prints a variable number of strings arguments to the output. The last argument to this function must be NULL. The other arguments can either be char * or string objects.

    int Putc(int ch, String_or_FILE *f)

    Same as the C fputc() function.

    int Write(String_or_FILE *f, void *buf, int len)

    Same as the C write() function.

    int Read(String_or_FILE *f, void *buf, int maxlen)

    Same as the C read() function.

    int Getc(String_or_FILE *f)

    Same as the C fgetc() function.

    int Ungetc(int ch, String_or_FILE *f)

    Same as the C ungetc() function.

    int Seek(String_or_FILE *f, int offset, int whence)

    Same as the C seek() function. offset is the number of bytes. whence is one of SEEK_SET, SEEK_CUR, or SEEK_END..

    long Tell(String_or_FILE *f)

    Same as the C tell() function.

    File *NewFile(const char *filename, const char *mode, List *newfiles)

    Create a File object using the fopen() library call. This file differs from FILE * in that it can be placed in the standard SWIG containers (lists, hashes, etc.). The filename is added to the newfiles list if newfiles is non-zero and the file was created successfully.

    File *NewFileFromFile(FILE *f)

    Create a File object wrapper around an existing FILE * object.

    There's no explicit function to close a file, just call Delete(f) - this decreases the reference count, and the file will be closed when the reference count reaches zero.

    The use of the above I/O functions and strings play a critical role in SWIG. It is common to see small code fragments of code generated using code like this:

    /* Print into a string */
    String *s = NewString("");
    Printf(s, "Hello\n");
    for (i = 0; i < 10; i++) {
      Printf(s, "%d\n", i);
    }
    ...
    /* Print string into a file */
    Printf(f, "%s\n", s);
    

    Similarly, the preprocessor and parser all operate on string-files.

    39.6 Navigating and manipulating parse trees

    Parse trees are built as collections of hash tables. Each node is a hash table in which arbitrary attributes can be stored. Certain attributes in the hash table provide links to other parse tree nodes. The following macros can be used to move around the parse tree.

    String *nodeType(Node *n)

    Returns the node type tag as a string. The returned string indicates the type of parse tree node.

    Node *nextSibling(Node *n)

    Returns the next node in the parse tree. For example, the next C declaration.

    Node *previousSibling(Node *n)

    Returns the previous node in the parse tree. For example, the previous C declaration.

    Node *firstChild(Node *n)

    Returns the first child node. For example, if n was a C++ class node, this would return the node for the first class member.

    Node *lastChild(Node *n)

    Returns the last child node. You might use this if you wanted to append a new node to the children of a class.

    Node *parentNode(Node *n)

    Returns the parent of node n. Use this to move up the pass tree.

    The following macros can be used to change all of the above attributes. Normally, these functions are only used by the parser. Changing them without knowing what you are doing is likely to be dangerous.

    void set_nodeType(Node *n, const String_or_char)

    Change the node type. tree node.

    void set_nextSibling(Node *n, Node *s)

    Set the next sibling.

    void set_previousSibling(Node *n, Node *s)

    Set the previous sibling.

    void set_firstChild(Node *n, Node *c)

    Set the first child node.

    void set_lastChild(Node *n, Node *c)

    Set the last child node.

    void set_parentNode(Node *n, Node *p)

    Set the parent node.

    The following utility functions are used to alter the parse tree (at your own risk)

    void appendChild(Node *parent, Node *child)

    Append a child to parent. The appended node becomes the last child.

    void deleteNode(Node *node)

    Deletes a node from the parse tree. Deletion reconnects siblings and properly updates the parent so that sibling nodes are unaffected.

    39.7 Working with attributes

    Since parse tree nodes are just hash tables, attributes are accessed using the Getattr(), Setattr(), and Delattr() operations. For example:

    int functionHandler(Node *n) {
      String *name    = Getattr(n, "name");
      String *symname = Getattr(n, "sym:name");
      SwigType *type  = Getattr(n, "type");
      ...
    }
    

    New attributes can be freely attached to a node as needed. However, when new attributes are attached during code generation, they should be prepended with a namespace prefix. For example:

    ...
    Setattr(n, "python:docstring", doc);     /* Store docstring */
    ...
    

    A quick way to check the value of an attribute is to use the checkAttribute() function like this:

    if (checkAttribute(n, "storage", "virtual")) {
      /* n is virtual */
      ...
    }
    

    Changing the values of existing attributes is allowed and is sometimes done to implement node transformations. However, if a function/method modifies a node, it is required to restore modified attributes to their original values. To simplify the task of saving/restoring attributes, the following functions are used:

    int Swig_save(const char *ns, Node *n, const char *name1, const char *name2, ..., NIL)

    Saves a copy of attributes name1, name2, etc. from node n. Copies of the attributes are actually resaved in the node in a different namespace which is set by the ns argument. For example, if you call Swig_save("foo", n, "type", NIL), then the "type" attribute will be copied and saved as "foo:type". The namespace name itself is stored in the "view" attribute of the node. If necessary, this can be examined to find out where previous values of attributes might have been saved.

    int Swig_restore(Node *n)

    Restores the attributes saved by the previous call to Swig_save(). Those attributes that were supplied to Swig_save() will be restored to their original values.

    The Swig_save() and Swig_restore() functions must always be used as a pair. That is, every call to Swig_save() must have a matching call to Swig_restore(). Calls can be nested if necessary. Here is an example that shows how the functions might be used:

    int variableHandler(Node *n) {
      Swig_save("variableHandler", n, "type", "sym:name", NIL);
      String *symname = Getattr(n, "sym:name");
      SwigType *type  = Getattr(n, "type");
      ...
      Append(symname, "_global");        // Change symbol name
      SwigType_add_pointer(type);        // Add pointer
      ...
      generate wrappers
      ...
      Swig_restore(n);                  // Restore original values
      return SWIG_OK;
    }
    

    int Swig_require(const char *ns, Node *n, const char *name1, const char *name2, ..., NIL)

    This is an enhanced version of Swig_save() that adds error checking. If an attribute name is not present in n, a failed assertion results and SWIG terminates with a fatal error. Optionally, if an attribute name is specified as "*name", a copy of the attribute is saved as with Swig_save(). If an attribute is specified as "?name", the attribute is optional. Swig_restore() must always be called after using this function.

    39.8 Type system

    SWIG implements the complete C++ type system including typedef, inheritance, pointers, references, and pointers to members. A detailed discussion of type theory is impossible here. However, let's cover the highlights.

    39.8.1 String encoding of types

    All types in SWIG consist of a base datatype and a collection of type operators that are applied to the base. A base datatype is almost always some kind of primitive type such as int or double. The operators consist of things like pointers, references, arrays, and so forth. Internally, types are represented as strings that are constructed in a very precise manner. Here are some examples:

    C datatype                     SWIG encoding (strings)
    -----------------------------  --------------------------
    int                            "int"
    int *                          "p.int"
    const int *                    "p.q(const).int"
    int (*x)(int, double)          "p.f(int, double).int"
    int [20][30]                   "a(20).a(30).int"
    int (F::*)(int)                "m(F).f(int).int"
    vector<int> *                  "p.vector<(int)>"
    

    Reading the SWIG encoding is often easier than figuring out the C code---just read it from left to right. For a type of "p.f(int, double).int" is a "pointer to a function(int, double) that returns int".

    The following operator encodings are used in type strings:

    Operator              Meaning
    -------------------   -------------------------------
    p.                    Pointer to
    a(n).                 Array of dimension n
    r.                    C++ reference
    m(class).             Member pointer to class
    f(args).              Function.
    q(qlist).             Qualifiers
    

    In addition, type names may be parameterized by templates. This is represented by enclosing the template parameters in <( ... )>. Variable length arguments are represented by the special base type of v(...).

    If you want to experiment with type encodings, the raw type strings can be inserted into an interface file using backticks `` wherever a type is expected. For instance, here is an extremely perverted example:

    `p.a(10).p.f(int, p.f(int).int)` foo(int, int (*x)(int));
    

    This corresponds to the immediately obvious C declaration:

    (*(*foo(int, int (*)(int)))[10])(int, int (*)(int));
    

    Aside from the potential use of this declaration on a C programming quiz, it motivates the use of the special SWIG encoding of types. The SWIG encoding is much easier to work with because types can be easily examined, modified, and constructed using simple string operations (comparison, substrings, concatenation, etc.). For example, in the parser, a declaration like this

    int *a[30];
    

    is processed in a few pieces. In this case, you have the base type "int" and the declarator of type "a(30).p.". To make the final type, the two parts are just joined together using string concatenation.

    39.8.2 Type construction

    The following functions are used to construct types. You should use these functions instead of trying to build the type strings yourself.

    void SwigType_add_pointer(SwigType *ty)

    Adds a pointer to ty.

    void SwigType_del_pointer(SwigType *ty)

    Removes a single pointer from ty.

    void SwigType_add_reference(SwigType *ty)

    Adds a reference to ty.

    void SwigType_add_array(SwigType *ty, const String_or_char *size)

    Adds an array with dimension dim to ty.

    void SwigType_del_array(SwigType *ty)

    Removes a single array dimension from ty.

    int SwigType_array_ndim(SwigType *ty)

    Returns number of array dimensions of ty.

    String* SwigType_array_getdim(SwigType *ty, int n)

    Returns nth array dimension of ty.

    void SwigType_array_setdim(SwigType *ty, int n, const String_or_char *rep)

    Sets nth array dimensions of ty to rep.

    void SwigType_add_qualifier(SwigType *ty, const String_or_char *q)

    Adds a type qualifier q to ty. q is typically "const" or "volatile".

    void SwigType_add_memberpointer(SwigType *ty, const String_or_char *cls)

    Adds a pointer to a member of class cls to ty.

    void SwigType_add_function(SwigType *ty, ParmList *p)

    Adds a function to ty. p is a linked-list of parameter nodes as generated by the parser. See the section on parameter lists for details about the representation.

    void SwigType_add_template(SwigType *ty, ParmList *p)

    Adds a template to ty. p is a linked-list of parameter nodes as generated by the parser. See the section on parameter lists for details about the representation.

    SwigType *SwigType_pop(SwigType *ty)

    Removes the last type constructor from ty and returns it. ty is modified.

    void SwigType_push(SwigType *ty, SwigType *op)

    Pushes the type operators in op onto type ty. The opposite of SwigType_pop().

    SwigType *SwigType_pop_arrays(SwigType *ty)

    Removes all leading array operators from ty and returns them. ty is modified. For example, if ty is "a(20).a(10).p.int", then this function would return "a(20).a(10)." and modify ty so that it has the value "p.int".

    SwigType *SwigType_pop_function(SwigType *ty)

    Removes a function operator from ty including any qualification. ty is modified. For example, if ty is "f(int).int", then this function would return "f(int)." and modify ty so that it has the value "int".

    SwigType *SwigType_base(SwigType *ty)

    Returns the base type of a type. For example, if ty is "p.a(20).int", this function would return "int". ty is unmodified.

    SwigType *SwigType_prefix(SwigType *ty)

    Returns the prefix of a type. For example, if ty is "p.a(20).int", this function would return "p.a(20).". ty is unmodified.

    39.8.3 Type tests

    The following functions can be used to test properties of a datatype.

    int SwigType_ispointer(SwigType *ty)

    Checks if ty is a standard pointer.

    int SwigType_ismemberpointer(SwigType *ty)

    Checks if ty is a member pointer.

    int SwigType_isreference(SwigType *ty)

    Checks if ty is a C++ reference.

    int SwigType_isarray(SwigType *ty)

    Checks if ty is an array.

    int SwigType_isfunction(SwigType *ty)

    Checks if ty is a function.

    int SwigType_isqualifier(SwigType *ty)

    Checks if ty is a qualifier.

    int SwigType_issimple(SwigType *ty)

    Checks if ty is a simple type. No operators applied.

    int SwigType_isconst(SwigType *ty)

    Checks if ty is a const type.

    int SwigType_isvarargs(SwigType *ty)

    Checks if ty is a varargs type.

    int SwigType_istemplate(SwigType *ty)

    Checks if ty is a templatized type.

    39.8.4 Typedef and inheritance

    The behavior of typedef declaration is to introduce a type alias. For instance, typedef int Integer makes the identifier Integer an alias for int. The treatment of typedef in SWIG is somewhat complicated due to the pattern matching rules that get applied in typemaps and the fact that SWIG prefers to generate wrapper code that closely matches the input to simplify debugging (a user will see the typedef names used in their program instead of the low-level primitive C datatypes).

    To handle typedef, SWIG builds a collection of trees containing typedef relations. For example,

    typedef int Integer;
    typedef Integer *IntegerPtr;
    typedef int Number;
    typedef int Size;
    

    produces two trees like this:

                     int               p.Integer
                   ^  ^  ^                 ^
                  /   |   \                |
                 /    |    \               |
            Integer  Size   Number    IntegerPtr
    

    To resolve a single typedef relationship, the following function is used:

    SwigType *SwigType_typedef_resolve(SwigType *ty)

    Checks if ty can be reduced to a new type via typedef. If so, returns the new type. If not, returns NULL.

    Typedefs are only resolved in simple typenames that appear in a type. For example, the type base name and in function parameters. When resolving types, the process starts in the leaf nodes and moves up the tree towards the root. Here are a few examples that show how it works:

    Original type            After typedef_resolve()
    ------------------------ -----------------------
    Integer                  int
    a(30).Integer            int
    p.IntegerPtr             p.p.Integer
    p.p.Integer              p.p.int
    

    For complicated types, the process can be quite involved. Here is the reduction of a function pointer:

    p.f(Integer, p.IntegerPtr, Size).Integer          : Start
    p.f(Integer, p.IntegerPtr, Size).int
    p.f(int, p.IntegerPtr, Size).int
    p.f(int, p.p.Integer, Size).int
    p.f(int, p.p.int, Size).int
    p.f(int, p.p.int, int).int                        : End
    

    Two types are equivalent if their full type reductions are the same. The following function will fully reduce a datatype:

    SwigType *SwigType_typedef_resolve_all(SwigType *ty)

    Fully reduces ty according to typedef rules. Resulting datatype will consist only of primitive typenames.

    39.8.5 Lvalues

    When generating wrapper code, it is necessary to emit datatypes that can be used on the left-hand side of an assignment operator (an lvalue). However, not all C datatypes can be used in this way---especially arrays and const-qualified types. To generate a type that can be used as an lvalue, use the following function:

    SwigType *SwigType_ltype(SwigType *ty)

    Converts type ty to a type that can be used as an lvalue in assignment. The resulting type is stripped of qualifiers and arrays are converted to a pointers.

    The creation of lvalues is fully aware of typedef and other aspects of the type system. Therefore, the creation of an lvalue may result in unexpected results. Here are a few examples:

    typedef double Matrix4[4][4];
    Matrix4 x;    // type = 'Matrix4', ltype='p.a(4).double'
    
    typedef const char * Literal;
    Literal y;    // type = 'Literal', ltype='p.char'
    

    39.8.6 Output functions

    The following functions produce strings that are suitable for output.

    String *SwigType_str(SwigType *ty, const String_or_char *id = 0)

    Generates a C string for a datatype. id is an optional declarator. For example, if ty is "p.f(int).int" and id is "foo", then this function produces "int (*foo)(int)". This function is used to convert string-encoded types back into a form that is valid C syntax.

    String *SwigType_lstr(SwigType *ty, const String_or_char *id = 0)

    This is the same as SwigType_str() except that the result is generated from the type's lvalue (as generated from SwigType_ltype).

    String *SwigType_lcaststr(SwigType *ty, const String_or_char *id = 0)

    Generates a casting operation that converts from type ty to its lvalue. id is an optional name to include in the cast. For example, if ty is "q(const).p.char" and id is "foo", this function produces the string "(char *) foo".

    String *SwigType_rcaststr(SwigType *ty, const String_or_char *id = 0)

    Generates a casting operation that converts from a type's lvalue to a type equivalent to ty. id is an optional name to include in the cast. For example, if ty is "q(const).p.char" and id is "foo", this function produces the string "(const char *) foo".

    String *SwigType_manglestr(SwigType *ty)

    Generates a mangled string encoding of type ty. The mangled string only contains characters that are part of a valid C identifier. The resulting string is used in various parts of SWIG, but is most commonly associated with type-descriptor objects that appear in wrappers (e.g., SWIGTYPE_p_double).

    39.9 Parameters

    Several type-related functions involve parameter lists. These include functions and templates. Parameter list are represented as a list of nodes with the following attributes:

    "type"        -  Parameter type  (required)
    "name"        -  Parameter name  (optional)
    "value"       -  Initializer     (optional)
    

    Typically parameters are denoted in the source by using a typename of Parm * or ParmList *. To walk a parameter list, simply use code like this:

    Parm *parms;
    Parm *p;
    for (p = parms; p; p = nextSibling(p)) {
      SwigType *type  = Getattr(p, "type");
      String   *name  = Getattr(p, "name");
      String   *value = Getattr(p, "value");
      ...
    }
    

    Note: this code is exactly the same as what you would use to walk parse tree nodes.

    An empty list of parameters is denoted by a NULL pointer.

    Since parameter lists are fairly common, the following utility functions are provided to manipulate them:

    Parm *CopyParm(Parm *p);

    Copies a single parameter.

    ParmList *CopyParmList(ParmList *p);

    Copies an entire list of parameters.

    int ParmList_len(ParmList *p);

    Returns the number of parameters in a parameter list.

    String *ParmList_str(ParmList *p);

    Converts a parameter list into a C string. For example, produces a string like "(int *p, int n, double x);".

    String *ParmList_protostr(ParmList *p);

    The same as ParmList_str() except that parameter names are not included. Used to emit prototypes.

    int ParmList_numrequired(ParmList *p);

    Returns the number of required (non-optional) arguments in p.

    39.10 Writing a Language Module

    One of the easiest routes to supporting a new language module is to copy an already supported language module implementation and modify it. Be sure to choose a language that is similar in nature to the new language. All language modules follow a similar structure and this section briefly outlines the steps needed to create a bare-bones language module from scratch. Since the code is relatively easy to read, this section describes the creation of a minimal Python module. You should be able to extrapolate this to other languages.

    39.10.1 Execution model

    Code generation modules are defined by inheriting from the Language class, currently defined in the Source/Modules directory of SWIG. Starting from the parsing of command line options, all aspects of code generation are controlled by different methods of the Language that must be defined by your module.

    39.10.2 Starting out

    To define a new language module, first create a minimal implementation using this example as a guide:

    #include "swigmod.h"
    
    class PYTHON : public Language {
    public:
    
      virtual void main(int argc, char *argv[]) {
        printf("I'm the Python module.\n");
      }
    
      virtual int top(Node *n) {
        printf("Generating code.\n");
        return SWIG_OK;
      }
    
    };
    
    extern "C" Language *
    swig_python(void) {
      return new PYTHON();
    }
    

    The "swigmod.h" header file contains, among other things, the declaration of the Language base class and so you should include it at the top of your language module's source file. Similarly, the "swigconfig.h" header file contains some other useful definitions that you may need. Note that you should not include any header files that are installed with the target language. That is to say, the implementation of the SWIG Python module shouldn't have any dependencies on the Python header files. The wrapper code generated by SWIG will almost always depend on some language-specific C/C++ header files, but SWIG itself does not.

    Give your language class a reasonable name, usually the same as the target language. By convention, these class names are all uppercase (e.g. "PYTHON" for the Python language module) but this is not a requirement. This class will ultimately consist of a number of overrides of the virtual functions declared in the Language base class, in addition to any language-specific member functions and data you need. For now, just use the dummy implementations shown above.

    The language module ends with a factory function, swig_python(), that simply returns a new instance of the language class. As shown, it should be declared with the extern "C" storage qualifier so that it can be called from C code. It should also return a pointer to the base class (Language) so that only the interface (and not the implementation) of your language module is exposed to the rest of SWIG.

    Save the code for your language module in a file named "python.cxx" and place this file in the Source/Modules directory of the SWIG distribution. To ensure that your module is compiled into SWIG along with the other language modules, modify the file Source/Makefile.am to include the additional source files. In addition, modify the file Source/Modules/swigmain.cxx with an additional command line option that activates the module. Read the source---it's straightforward.

    Next, at the top level of the SWIG distribution, re-run the autogen.sh script to regenerate the various build files:

    $ ./autogen.sh
    

    Next re-run configure to regenerate all of the Makefiles:

    $ ./configure
    

    Finally, rebuild SWIG with your module added:

    $ make
    

    Once it finishes compiling, try running SWIG with the command-line option that activates your module. For example, swig -python foo.i. The messages from your new module should appear.

    39.10.3 Command line options

    When SWIG starts, the command line options are passed to your language module. This occurs before any other processing occurs (preprocessing, parsing, etc.). To capture the command line options, simply use code similar to this:

    void Language::main(int argc, char *argv[]) {
      for (int i = 1; i < argc; i++) {
        if (argv[i]) {
          if (strcmp(argv[i], "-interface") == 0) {
            if (argv[i+1]) {
              interface = NewString(argv[i+1]);
              Swig_mark_arg(i);
              Swig_mark_arg(i+1);
              i++;
            } else {
              Swig_arg_error();
            }
          } else if (strcmp(argv[i], "-globals") == 0) {
            if (argv[i+1]) {
              global_name = NewString(argv[i+1]);
              Swig_mark_arg(i);
              Swig_mark_arg(i+1);
              i++;
            } else {
              Swig_arg_error();
            }
          } else if ((strcmp(argv[i], "-proxy") == 0)) {
            proxy_flag = 1;
            Swig_mark_arg(i);
          } else if (strcmp(argv[i], "-keyword") == 0) {
            use_kw = 1;
            Swig_mark_arg(i);
          } else if (strcmp(argv[i], "-help") == 0) {
            fputs(usage, stderr);
          }
          ...
        }
      }
    }
    

    The exact set of options depends on what you want to do in your module. Generally, you would use the options to change code generation modes or to print diagnostic information.

    If a module recognizes an option, it should always call Swig_mark_arg() to mark the option as valid. If you forget to do this, SWIG will terminate with an unrecognized command line option error.

    39.10.4 Configuration and preprocessing

    In addition to looking at command line options, the main() method is responsible for some initial configuration of the SWIG library and preprocessor. To do this, insert some code like this:

    void main(int argc, char *argv[]) {
      ... command line options ...
    
      /* Set language-specific subdirectory in SWIG library */
      SWIG_library_directory("python");
    
      /* Set language-specific preprocessing symbol */
      Preprocessor_define("SWIGPYTHON 1", 0);
    
      /* Set language-specific configuration file */
      SWIG_config_file("python.swg");
    
      /* Set typemap language (historical) */
      SWIG_typemap_lang("python");
    }
    

    The above code does several things--it registers the name of the language module with the core, it supplies some preprocessor macro definitions for use in input files (so that they can determine the target language), and it registers a start-up file. In this case, the file python.swg will be parsed before any part of the user-supplied input file.

    Before proceeding any further, create a directory for your module in the SWIG library (The Lib directory). Now, create a configuration file in the directory. For example, python.swg.

    Just to review, your language module should now consist of two files-- an implementation file python.cxx and a configuration file python.swg.

    39.10.5 Entry point to code generation

    SWIG is a multi-pass compiler. Once the main() method has been invoked, the language module does not execute again until preprocessing, parsing, and a variety of semantic analysis passes have been performed. When the core is ready to start generating wrappers, it invokes the top() method of your language class. The argument to top is a single parse tree node that corresponds to the top of the entire parse tree.

    To get the code generation process started, the top() procedure needs to do several things:

    • Initialize the wrapper code output.
    • Set the module name.
    • Emit common initialization code.
    • Emit code for all of the child nodes.
    • Finalize the wrapper module and cleanup.

    An outline of top() might be as follows:

    int Python::top(Node *n) {
    
      /* Get the module name */
      String *module = Getattr(n, "name");
    
      /* Get the output file name */
      String *outfile = Getattr(n, "outfile");
    
      /* Initialize I/O (see next section) */
      ...
    
      /* Output module initialization code */
      ...
    
      /* Emit code for children */
      Language::top(n);
    
      ...
      /* Cleanup files */
      ...
    
      return SWIG_OK;
    }
    

    39.10.6 Module I/O and wrapper skeleton

    Within SWIG wrappers, there are five main sections. These are (in order)

    • begin: This section is a placeholder for users to put code at the beginning of the C/C++ wrapper file.
    • runtime: This section has most of the common SWIG runtime code.
    • header: This section holds declarations and inclusions from the .i file.
    • wrapper: This section holds all the wrapper code.
    • init: This section holds the module initialisation function (the entry point for the interpreter).

    Different parts of the SWIG code will fill different sections, then upon completion of the wrappering all the sections will be saved to the wrapper file.

    To perform this will require several additions to the code in various places, such as:

    class PYTHON : public Language {
    protected:
      /* General DOH objects used for holding the strings */
      File *f_begin;
      File *f_runtime;
      File *f_header;
      File *f_wrappers;
      File *f_init;
    
    public:
      ...
    
    };
    
    int Python::top(Node *n) {
    
      ...
    
      /* Initialize I/O */
      f_begin = NewFile(outfile, "w", SWIG_output_files());
      if (!f_begin) {
        FileErrorDisplay(outfile);
        SWIG_exit(EXIT_FAILURE);
      }
      f_runtime = NewString("");
      f_init = NewString("");
      f_header = NewString("");
      f_wrappers = NewString("");
    
      /* Register file targets with the SWIG file handler */
      Swig_register_filebyname("begin", f_begin);
      Swig_register_filebyname("header", f_header);
      Swig_register_filebyname("wrapper", f_wrappers);
      Swig_register_filebyname("runtime", f_runtime);
      Swig_register_filebyname("init", f_init);
    
      /* Output module initialization code */
      Swig_banner(f_begin);
      ...
    
      /* Emit code for children */
      Language::top(n);
    
      ...
      /* Write all to the file */
      Dump(f_runtime, f_begin);
      Dump(f_header, f_begin);
      Dump(f_wrappers, f_begin);
      Wrapper_pretty_print(f_init, f_begin);
    
      /* Cleanup files */
      Delete(f_runtime);
      Delete(f_header);
      Delete(f_wrappers);
      Delete(f_init);
      Delete(f_begin);
    
      return SWIG_OK;
    }
    

    Using this to process a file will generate a wrapper file, however the wrapper will only consist of the common SWIG code as well as any inline code which was written in the .i file. It does not contain any wrappers for any of the functions or classes.

    The code to generate the wrappers are the various member functions, which currently have not been touched. We will look at functionWrapper() as this is the most commonly used function. In fact many of the other wrapper routines will call this to do their work.

    A simple modification to write some basic details to the wrapper looks like this:

    int Python::functionWrapper(Node *n) {
      /* Get some useful attributes of this function */
      String   *name   = Getattr(n, "sym:name");
      SwigType *type   = Getattr(n, "type");
      ParmList *parms  = Getattr(n, "parms");
      String   *parmstr= ParmList_str_defaultargs(parms); // to string
      String   *func   = SwigType_str(type, NewStringf("%s(%s)", name, parmstr));
      String   *action = Getattr(n, "wrap:action");
    
      Printf(f_wrappers, "functionWrapper   : %s\n", func);
      Printf(f_wrappers, "           action : %s\n", action);
      return SWIG_OK;
    }
    

    This will now produce some useful information within your wrapper file.

    functionWrapper   : void delete_Shape(Shape *self)
               action : delete arg1;
    
    functionWrapper   : void Shape_x_set(Shape *self, double x)
               action : if (arg1) (arg1)->x = arg2;
    
    functionWrapper   : double Shape_x_get(Shape *self)
               action : result = (double) ((arg1)->x);
    
    functionWrapper   : void Shape_y_set(Shape *self, double y)
               action : if (arg1) (arg1)->y = arg2;
    ...
    

    39.10.7 Low-level code generators

    As ingenious as SWIG is, and despite all its capabilities and the power of its parser, the Low-level code generation takes a lot of work to write properly. Mainly because every language insists on its own manner of interfacing to C/C++. To write the code generators you will need a good understanding of how to manually write an interface to your chosen language, so make sure you have your documentation handy.

    At this point it is also probably a good idea to take a very simple file (just one function), and try letting SWIG generate wrappers for many different languages. Take a look at all of the wrappers generated, and decide which one looks closest to the language you are trying to wrap. This may help you to decide which code to look at.

    In general most language wrappers look a little like this:

    /* wrapper for TYPE3 some_function(TYPE1, TYPE2); */
    RETURN_TYPE _wrap_some_function(ARGS){
      TYPE1 arg1;
      TYPE2 arg2;
      TYPE3 result;
    
      if(ARG1 is not of TYPE1) goto fail;
      arg1=(convert ARG1);
      if(ARG2 is not of TYPE2) goto fail;
      arg2=(convert ARG2);
    
      result=some_function(arg1, arg2);
    
      convert 'result' to whatever the language wants;
    
      do any tidy up;
    
      return ALL_OK;
    
      fail:
      do any tidy up;
      return ERROR;
    }
    

    Yes, it is rather vague and not very clear. But each language works differently so this will have to do for now.

    Tackling this problem will be done in two stages:

    • The skeleton: the function wrapper, and call, but without the conversion
    • The conversion: converting the arguments to-from what the language wants

    The first step will be done in the code, the second will be done in typemaps.

    Our first step will be to write the code for functionWrapper(). What is shown below is NOT the solution, merely a step in the right direction. There are a lot of issues to address.

    • Variable length and default parameters
    • Typechecking and number of argument checks
    • Overloaded functions
    • Inout and Output only arguments
    virtual int functionWrapper(Node *n) {
      /* get useful attributes */
      String   *name   = Getattr(n, "sym:name");
      SwigType *type   = Getattr(n, "type");
      ParmList *parms  = Getattr(n, "parms");
      ...
    
      /* create the wrapper object */
      Wrapper *wrapper = NewWrapper();
    
      /* create the functions wrappered name */
      String *wname = Swig_name_wrapper(iname);
    
      /* deal with overloading */
      ....
    
      /* write the wrapper function definition */
      Printv(wrapper->def, "RETURN_TYPE ", wname, "(ARGS) {", NIL);
    
      /* if any additional local variable needed, add them now */
      ...
    
      /* write the list of locals/arguments required */
      emit_args(type, parms, wrapper);
    
      /* check arguments */
      ...
    
      /* write typemaps(in) */
      ....
    
      /* write constraints */
      ....
    
      /* Emit the function call */
      emit_action(n, wrapper);
    
      /* return value if necessary  */
      ....
    
      /* write typemaps(out) */
      ....
    
      /* add cleanup code */
      ....
    
      /* Close the function(ok) */
      Printv(wrapper->code, "return ALL_OK;\n", NIL);
    
      /* add the failure cleanup code */
      ...
    
      /* Close the function(error) */
      Printv(wrapper->code, "return ERROR;\n", "}\n", NIL);
    
      /* final substitutions if applicable */
      ...
    
      /* Dump the function out */
      Wrapper_print(wrapper, f_wrappers);
    
      /* tidy up */
      Delete(wname);
      DelWrapper(wrapper);
    
      return SWIG_OK;
    }
    

    Executing this code will produce wrappers which have our basic skeleton but without the typemaps, there is still work to do.

    39.10.8 Configuration files

    At the time of this writing, SWIG supports nearly twenty languages, which means that for continued sanity in maintaining the configuration files, the language modules need to follow some conventions. These are outlined here along with the admission that, yes it is ok to violate these conventions in minor ways, as long as you know where to apply the proper kludge to keep the overall system regular and running. Engineering is the art of compromise, see...

    Much of the maintenance regularity depends on choosing a suitable nickname for your language module (and then using it in a controlled way). Nicknames should be all lower case letters with an optional numeric suffix (no underscores, no dashes, no spaces). Some examples are: foo, bar, qux99.

    The numeric suffix variant, as in the last example, is somewhat tricky to work with because sometimes people expect to refer to the language without this number but sometimes that number is extremely relevant (especially when it corresponds to language implementation versions with incompatible interfaces). New language modules that unavoidably require a numeric suffix in their nickname should include that number in all uses, or be prepared to kludge.

    The nickname is used in four places:

    usagetransform
    "skip" tag(none)
    Examples/ subdir name(none)
    Examples/test-suite/ subdir name(none)

    As you can see, most usages are direct.

    configure.ac
    This file is processed by

    autoconf to generate the configure script. This is where you need to add shell script fragments and autoconf macros to detect the presence of whatever development support your language module requires, typically directories where headers and libraries can be found, and/or utility programs useful for integrating the generated wrapper code.

    Use the AC_ARG_WITH, AC_MSG_CHECKING, AC_SUBST macros and so forth (see other languages for examples). Avoid using the [ and ] character in shell script fragments. The variable names passed to AC_SUBST should begin with the nickname, entirely upcased.

    At the end of the new section is the place to put the aforementioned nickname kludges (should they be needed). See Perl5 for examples of what to do. [If this is still unclear after you've read the code, ping me and I'll expand on this further. --ttn]

    Makefile.in

    Some of the variables AC_SUBSTituted are essential to the support of your language module. Fashion these into a shell script "test" clause and assign that to a skip tag using "-z" and "-o":

    skip-qux99 = [ -z "@QUX99INCLUDE@" -o -z "@QUX99LIBS" ]

    This means if those vars should ever be empty, qux99 support should be considered absent and so it would be a good idea to skip actions that might rely on it.

    Here is where you may also define an alias (but then you'll need to kludge --- don't do this):

    skip-qux = $(skip-qux99)

    Lastly, you need to modify each of check-aliveness, check-examples, check-test-suite and lib-languages (var). Use the nickname for these, not the alias. Note that you can do this even before you have any tests or examples set up; the Makefile rules do some sanity checking and skip around these kinds of problems.

    Examples/Makefile.in
    Nothing special here; see comments at the top of this file and look to the existing languages for examples.
    Examples/qux99/check.list
    Do cp ../python/check.list . and modify to taste. One subdir per line.
    Lib/qux99/extra-install.list
    If you add your language to the top-level Makefile.in var lib-languages, then make install will install all *.i and *.swg files from the language-specific subdirectory of Lib. Use (optional) file extra-install.list in that directory to name additional files to install (see ruby for example).
    Source/Modules/Makefile.am
    Add appropriate files to this Automake file. That's it!

    When you have modified these files, please make sure that the new language module is completely ignored if it is not installed and detected on a box, that is, make check-examples and make check-test-suite politely displays the ignoring language message.

    39.10.9 Runtime support

    Discuss the kinds of functions typically needed for SWIG runtime support (e.g. SWIG_ConvertPtr() and SWIG_NewPointerObj()) and the names of the SWIG files that implement those functions.

    39.10.10 Standard library files

    The standard library files that most languages supply keeps growing as SWIG matures. The following are the minimum that are usually supported:

    • typemaps.i
    • std_string.i
    • std_vector.i
    • stl.i

    Please copy these and modify for any new language.

    39.10.11 User examples

    Each of the language modules provides one or more examples. These examples are used to demonstrate different features of the language module to SWIG end-users, but you'll find that they're useful during development and testing of your language module as well. You can use examples from the existing SWIG language modules for inspiration.

    Each example is self-contained and consists of (at least) a Makefile, a SWIG interface file for the example module, and a 'runme' script that demonstrates the functionality for that module. All of these files are stored in the same subdirectory under the Examples/[lang] directory. There are two classic examples which should be the first to convert to a new language module. These are the "simple" C example and the "class" C++ example. These can be found, for example for Python, in Examples/python/simple and Examples/python/class.

    By default, all of the examples are built and run when the user types make check. To ensure that your examples are automatically run during this process, see the section on configuration files.

    39.10.12 Test driven development and the test-suite

    A test driven development approach is central to the improvement and development of SWIG. Most modifications to SWIG are accompanied by additional regression tests and checking all tests to ensure that no regressions have been introduced.

    The regression testing is carried out by the SWIG test-suite. The test-suite consists of numerous testcase interface files in the Examples/test-suite directory as well as target language specific runtime tests in the Examples/test-suite/[lang] directory. When a testcase is run, it will execute the following steps for each testcase:

    1. Execute SWIG passing it the testcase interface file.
    2. Compile the resulting generated C/C++ code with either the C or C++ compiler into object files.
    3. Link the object files into a dynamic library (dll/shared object).
    4. Compile any generated and any runtime test target language code with the target language compiler, if the target language supports compilation. This step thus does not apply to the interpreted languages.
    5. Execute a runtime test if one exists.

    For example, the ret_by_value testcase consists of two components. The first component is the Examples/test-suite/ret_by_value.i interface file. The name of the SWIG module must always be the name of the testcase, so the ret_by_value.i interface file thus begins with:

    %module ret_by_value
    

    The testcase code will then follow the module declaration, usually within a %inline %{ ... %} section for the majority of the tests.

    The second component is the optional runtime tests. Any runtime tests are named using the following convention: [testcase]_runme.[ext], where [testcase] is the testcase name and [ext] is the normal extension for the target language file. In this case, the Java and Python target languages implement a runtime test, so their files are respectively, Examples/test-suite/java/ret_by_value_runme.java and Examples/test-suite/python/ret_by_value_runme.py.

    The goal of the test-suite is to test as much as possible in a silent manner. This way any SWIG or compiler errors or warnings are easily visible. Should there be any warnings, changes must be made to either fix them (preferably) or suppress them. Compilation or runtime errors result in a testcase failure and will be immediately visible. It is therefore essential that the runtime tests are written in a manner that displays nothing to stdout/stderr on success but error/exception out with an error message on stderr on failure.

    39.10.12.1 Running the test-suite

    In order for the test-suite to work for a particular target language, the language must be correctly detected and configured during the configure stage so that the correct Makefiles are generated. Most development occurs on Linux, so usually it is a matter of installing the development packages for the target language and simply configuring as outlined earlier.

    If when running the test-suite commands that follow, you get a message that the test was skipped, it indicates that the configure stage is missing information in order to compile and run everything for that language.

    The test-suite can be run in a number of ways. The first group of commands are for running multiple testcases in one run and should be executed in the top level directory. To run the entire test-suite (can take a long time):

    make -k check-test-suite
    

    To run the test-suite just for target language [lang], replace [lang] with one of csharp, java, perl5, python, ruby, tcl etc:

    make check-[lang]-test-suite
    

    Note that if a runtime test is available, a message "(with run test)" is displayed when run. For example:

    $ make check-python-test-suite
    checking python test-suite
    checking python testcase argcargvtest (with run test)
    checking python testcase python_autodoc
    checking python testcase python_append (with run test)
    checking python testcase callback (with run test)
    

    The files generated on a previous run can be deleted using the clean targets, either the whole test-suite or for a particular language:

    make clean-test-suite
    make clean-[lang]-test-suite
    

    The test-suite can be run in a partialcheck mode where just SWIG is executed, that is, the compile, link and running of the testcases is not performed. Note that the partialcheck does not require the target language to be correctly configured and detected and unlike the other test-suite make targets, is never skipped. Once again, either all the languages can be executed or just a chosen language:

    make partialcheck-test-suite
    make partialcheck-[lang]-test-suite
    

    If your computer has more than one CPU, you are strongly advised to use parallel make to speed up the execution speed. This can be done with any of the make targets that execute more than one testcase. For example, a dual core processor can efficiently use 2 parallel jobs:

    make -j2 check-test-suite
    make -j2 check-python-test-suite
    make -j2 partialcheck-java-test-suite
    

    The second group of commands are for running individual testcases and should be executed in the appropriate target language directory, Examples/test-suite/[lang]. Testcases can contain either C or C++ code and when one is written, a decision must be made as to which of these input languages is to be used. Replace [testcase] in the commands below with the name of the testcase.

    For a C language testcase, add the testcase under the C_TEST_CASES list in Examples/test-suite/common.mk and execute individually as:

    make -s [testcase].ctest
    

    For a C++ language testcase, add the testcase under the CPP_TEST_CASES list in Examples/test-suite/common.mk and execute individually as:

    make -s [testcase].cpptest
    

    A third category of tests are C++ language testcases testing multiple modules (the %import directive). These require more than one shared library (dll/shared object) to be built and so are separated out from the normal C++ testcases. Add the testcase under the MULTI_CPP_TEST_CASES list in Examples/test-suite/common.mk and execute individually as:

    make -s [testcase].multicpptest
    

    To delete the generated files, execute:

    make -s [testcase].clean
    

    If you would like to see the exact commands being executed, drop the -s option:

    make [testcase].ctest
    make [testcase].cpptest
    make [testcase].multicpptest
    

    Some real examples of each:

    make -s ret_by_value.clean
    make -s ret_by_value.ctest
    make -s bools.cpptest
    make -s imports.multicpptest
    

    Advanced usage of the test-suite facilitates running tools on some of the five stages. The make variables SWIGTOOL and RUNTOOL are used to specify a tool to respectively, invoke SWIG and the execution of the runtime test. You are advised to view the Examples/test-suite/common.mk file for details but for a short summary, the classic usage is to use Valgrind for memory checking. For example, checking for memory leaks when running the runtime test in the target language interpreter:

    make ret_by_value.ctest RUNTOOL="valgrind --leak-check=full"
    

    This will probably make more sense if you look at the output of the above as it will show the exact commands being executed. SWIG can be analyzed for bad memory accesses using:

    make ret_by_value.ctest SWIGTOOL="valgrind --tool=memcheck --trace-children=yes"
    

    A debugger can also be invoked easily on an individual test, for example gdb:

    make ret_by_value.ctest RUNTOOL="gdb --args"
    

    SWIG reads the SWIG_FEATURES environment variable to obtain options in addition to those passed on the command line. This is particularly useful as the entire test-suite or a particular testcase can be run customized by using additional arguments, for example the -O optimization flag can be added in, as shown below for the bash shell:

    env SWIG_FEATURES=-O make check-python-test-suite
    

    The syntax for setting environment variables varies from one shell to the next, but it also works as shown in the example below, where some typemap debugging is added in:

    make ret_by_value.ctest SWIG_FEATURES="-debug-tmsearch"
    

    There is also a special 'errors' test-suite which is a set of regression tests checking SWIG warning and error messages. It can be run in the same way as the other language test-suites, replacing [lang] with errors, such as make check-errors-test-suite. The test cases used and the way it works is described in Examples/test-suite/errors/Makefile.in.

    39.10.13 Documentation

    Don't forget to write end-user documentation for your language module. Currently, each language module has a dedicated chapter You shouldn't rehash things that are already covered in sufficient detail in the SWIG Basics and SWIG and C++ chapters. There is no fixed format for what, exactly, you should document about your language module, but you'll obviously want to cover issues that are unique to your language.

    Some topics that you'll want to be sure to address include:

    • Command line options unique to your language module.
    • Non-obvious mappings between C/C++ and target language concepts. For example, if your target language provides a single floating point type, it should be no big surprise to find that C/C++ float and double types are mapped to it. On the other hand, if your target language doesn't provide support for "classes" or something similar, you'd want to discuss how C++ classes are handled.
    • How to compile the SWIG-generated wrapper code into shared libraries that can actually be used. For some languages, there are well-defined procedures for doing this, but for others it's an ad hoc process. Provide as much detail as appropriate, and links to other resources if available.

    39.10.14 Coding style guidelines

    The coding guidelines for the C/C++ source code are pretty much K&R C style. The style can be inferred from the existing code base and is largely dictated by the indent code beautifier tool set to K&R style. The code can formatted using the make targets in the Source directory. Below is an example of how to format the emit.cxx file:

    $ cd Source
    $ make beautify-file INDENTFILE=Modules/emit.cxx
    

    Of particular note is indentation is set to 2 spaces and a tab is used instead of 8 spaces. The generated C/C++ code should also follow this style as close as possible. However, tabs should be avoided as unlike the SWIG developers, users will never have consistent tab settings.

    39.10.15 Target language status

    Target languages are given a status of either 'Supported' or 'Experimental' depending on their maturity as broadly outlined in the Target language introduction. This section provides more details on how this status is given.

    39.10.15.1 Supported status

    A target language is given the 'Supported' status when

    • It is in a mature, well functioning state.
    • It has its own comprehensive chapter in the documentation. The level of documentation should be comprehensive and match the standard of the other mature modules. Python and Java are good references.
    • It passes all of the main SWIG test-suite. The main test-suite is defined by the tests in the C_TEST_CASES, CPP_TEST_CASES and MULTI_CPP_TEST_CASES lists in Examples/test-suite/common.mk. The tests in CPP11_TEST_CASES will also be required in the near future.
    • The test-suite must also include at least twenty wide-ranging runtime tests. The most mature languages have a few hundred runtime tests. Note that porting runtime tests from another language module is a quick and easy way to achieve this.
    • It supports the vast majority of SWIG features. Some more advanced features, such as, directors, full nested class support and target language namespaces (nspace) may be unimplemented. A few support libraries may be missing, for example, a small number of STL libraries.
    • It provides strong backwards compatibility between releases. Each point release must aim to be fully backwards compatible. A point release version is the 3rd version digit, so each of the x.y.* versions should be backwards compatible. Backwards compatibility breakages can occur in a new major or minor version if absolutely necessary and if documented. A major or minor version is the first or second digit in the three digit version.
    • Fixing unintended regressions in the Supported languages will be given higher priority over experimental languages by the core SWIG developers.
    • Examples must be available and run successfully.
    • The examples and test-suite must be fully functioning on the Travis Continuous Integration platform.

    39.10.15.2 Experimental status

    A target language is given the 'Experimental' status when

    • It is of sub-standard quality, failing to meet the above 'Supported' status.
    • It is somewhere between the mid to mature stage of development.
    • It is in need of help to finish development.

    Some minimum requirements and notes about languages with the 'Experimental' status:

    • Will at least implement basic functionality - support wrapping C functions and simple C++ classes and templates.
    • Have its own documentation chapter containing a reasonable level of detail. The documentation must provide enough basic functionality for a user to get started.
    • Have fully functional examples of basic functionality (the simple and class examples).
    • The test-suite must be implemented and include a few runtime tests for both C and C++ test cases.
    • Failing tests must be put into one of the FAILING_CPP_TESTS or FAILING_C_TESTS lists in the test-suite. This will ensure the test-suite can be superficially made to pass by ignoring failing tests. The number of tests in these lists should be no greater than half of the number of tests in the full test-suite.
    • The examples and test-suite must also be fully functioning on the Travis Continuous Integration platform. However, experimental languages will be set as 'allow_failures'. This means that pull requests and normal development commits will not break the entire Travis build should an experimental language fail.
    • Any new failed tests will be fixed on a 'best effort' basis by core developers with no promises made.
    • If a language module has an official maintainer, then the maintainer will be requested to focus on fixing test-suite regressions and commit to migrating the module to become a 'Supported' module.
    • If a module does not have an official maintainer, then, as maintenance will be on a 'best efforts' basis by the core maintainers, no guarantees will be provided from one release to the next and regressions may creep in.
    • Experimental target languages will have a (suppressible) warning explaining the Experimental sub-standard status and encourage users to help improve it.
    • No backwards compatibility is guaranteed as the module is effectively 'in development'. If a language module has an official maintainer, then a backwards compatibility guarantee may be provided at the maintainer's discretion and should be documented as such.

    39.10.16 Prerequisites for adding a new language module to the SWIG distribution

    New target language modules can be included in SWIG and contributions are encouraged for popular languages. In order to be considered for inclusion, a language must at a minimum fit the 'Experimental' status described above.

    Below are some practical steps that should help meet these requirements.

    1. The "simple" example needs to be working to demonstrate basic C code wrappers. Port the example from another language, such as from Examples/python/simple.
    2. The "class" example needs to be working to demonstrate basic C++ code wrappers. Port the example from another language, such as from Examples/python/class.
    3. Modify configure.ac, Makefile.in and Examples/Makefile.in to run these examples. Please make sure that if the new language is not installed properly on a box, make -k check should still work by skipping the tests and examples for the new language module.
    4. Copying an existing language module and adapting the source for it is likely to be the most efficient approach to fully developing a new module as a number of corner cases are covered in the existing implementations. The most advanced scripting languages are Python and Ruby. The most advanced compiled target languages are Java and C#.
    5. Get the test-suite running for the new language (make check-[lang]-test-suite). While the test-suite tests many corner cases, we'd expect the majority of it to work without much effort once the generated code is compiling correctly for basic functionality as most of the corner cases are covered in the SWIG core. Aim to first get one C and one C++ runtime test running in the test-suite. Adding further runtime tests should be a lot easier afterwards by porting existing runtime tests from another language module.
    6. The structure and contents of the html documentation chapter can be copied and adapted from one of the other language modules.
    7. Source code can be formatted correctly using the info in the coding style guidelines section.
    8. When ready, post a patch on Github, join the swig-devel mailing list and email the SWIG developers with a demonstration of commitment to maintaining the language module, certainly in the short term and ideally long term.

    Once accepted into the official Git repository, development efforts should concentrate on getting the entire test-suite to work in order to migrate the language module to the 'Supported' status. Runtime tests should be added for existing testcases and new test cases can be added should there be an area not already covered by the existing tests.

    39.11 Debugging Options

    There are various command line options which can aid debugging a SWIG interface as well as debugging the development of a language module. These are as follows:

    -debug-classes    - Display information about the classes found in the interface
    -debug-module <n> - Display module parse tree at stages 1-4, <n> is a csv list of stages
    -debug-symtabs    - Display symbol tables information
    -debug-symbols    - Display target language symbols in the symbol tables
    -debug-csymbols   - Display C symbols in the symbol tables
    -debug-lsymbols   - Display target language layer symbols
    -debug-tags       - Display information about the tags found in the interface
    -debug-template   - Display information for debugging templates
    -debug-top <n>    - Display entire parse tree at stages 1-4, <n> is a csv list of stages
    -debug-typedef    - Display information about the types and typedefs in the interface
    -debug-typemap    - Display information for debugging typemaps
    -debug-tmsearch   - Display typemap search debugging information
    -debug-tmused     - Display typemaps used debugging information
    

    The complete list of command line options for SWIG are available by running swig -help.

    39.12 Guide to parse tree nodes

    This section describes the different parse tree nodes and their attributes.

    cdecl

    Describes general C declarations including variables, functions, and typedefs. A declaration is parsed as "storage T D" where storage is a storage class, T is a base type, and D is a declarator.

    "name"          - Declarator name
    "type"          - Base type T
    "decl"          - Declarator type (abstract)
    "storage"       - Storage class (static, extern, typedef, etc.)
    "parms"         - Function parameters (if a function)
    "code"          - Function body code (if supplied)
    "value"         - Default value (if supplied)
    

    constructor

    C++ constructor declaration.

    "name"          - Name of constructor
    "parms"         - Parameters
    "decl"          - Declarator (function with parameters)
    "code"          - Function body code (if any)
    "feature:new"   - Set to indicate return of new object.
    

    destructor

    C++ destructor declaration.

    "name"          - Name of destructor
    "code"          - Function body code (if any)
    "storage"       - Storage class (set if virtual)
    "value"         - Default value (set if pure virtual).
    

    access

    C++ access change.

    "kind"          - public, protected, private
    

    constant

    Constant created by %constant or #define.

    "name"          - Name of constant.
    "type"          - Base type.
    "value"         - Value.
    "storage"       - Set to %constant
    "feature:immutable" - Set to indicate read-only
    

    class

    C++ class definition or C structure definition.

    "name"          - Name of the class.
    "kind"          - Class kind ("struct", "union", "class")
    "symtab"        - Enclosing symbol table.
    "tdname"        - Typedef name. Use for typedef struct { ... } A.
    "abstract"      - Set if class has pure virtual methods.
    "baselist"      - List of base class names.
    "storage"       - Storage class (if any)
    "unnamed"       - Set if class is unnamed.
    

    enum

    Enumeration.

    "name"          - Name of the enum (if supplied).
    "storage"       - Storage class (if any)
    "tdname"        - Typedef name (typedef enum { ... } name).
    "unnamed"       - Set if enum is unnamed.
    

    enumitem

    Enumeration value.

    "name"          - Name of the enum value.
    "type"          - Type (integer or char)
    "value"         - Enum value (if given)
    "feature:immutable" - Set to indicate read-only
    

    namespace

    C++ namespace.

    "name"          - Name of the namespace.
    "symtab"        - Symbol table for enclosed scope.
    "unnamed"       - Set if unnamed namespace
    "alias"         - Alias name. Set for namespace A = B;
    

    using

    C++ using directive.

    "name"          - Name of the object being referred to.
    "uname"         - Qualified name actually given to using.
    "node"          - Node being referenced.
    "namespace"     - Namespace name being reference (using namespace name)
    

    classforward

    A forward C++ class declaration.

    "name"          - Name of the class.
    "kind"          - Class kind ("union", "struct", "class")
    

    insert

    Code insertion directive. For example, %{ ... %} or %insert(section).

    "code"          - Inserted code
    "section"       - Section name ("header", "wrapper", etc.)
    

    top

    Top of the parse tree.

    "module"        - Module name
    

    extend

    %extend directive.

    "name"          - Module name
    "symtab"        - Symbol table of enclosed scope.
    

    apply

    %apply pattern { patternlist }.

    "pattern"       - Source pattern.
    "symtab"        - Symbol table of enclosed scope.
    

    clear

    %clear patternlist;

    "firstChild"    - Patterns to clear
    

    include

    %include directive.

    "name"         - Filename
    "firstChild"   - Children
    

    import

    %import directive.

    "name"         - Filename
    "firstChild"   - Children
    

    module

    %module directive.

    "name"         - Name of the module
    

    typemap

    %typemap directive.

    "method"       - Typemap method name.
    "code"         - Typemap code.
    "kwargs"       - Keyword arguments (if any)
    "firstChild"   - Typemap patterns
    

    typemapcopy

    %typemap directive with copy.

    "method"       - Typemap method name.
    "pattern"      - Typemap source pattern.
    "firstChild"   - Typemap patterns
    

    typemapitem

    %typemap pattern. Used with %apply, %clear, %typemap.

    "pattern"      - Typemap pattern (a parameter list)
    "parms"        - Typemap parameters.
    

    types

    %types directive.

    "parms"        - List of parameter types.
    "convcode"     - Code which replaces the default casting / conversion code
    

    extern

    extern "X" { ... } declaration.

    "name"       - Name "C", "Fortran", etc.
    

    39.13 Further Development Information

    There is further documentation available on the internals of SWIG, API documentation and debugging information. This is shipped with SWIG in the Doc/Devel directory.

    swig-4.0.1/Doc/Manual/Doxygen.html0000644000175000017500000012165213527234052016602 0ustar williamwilliam SWIG and Doxygen Translation

    17 SWIG and Doxygen Translation

    This chapter describes SWIG's support for translating Doxygen comments found in interface and header files into a target language's normal documentation language. Currently only Javadoc and Pydoc is supported.

    17.1 Doxygen translation overview

    The Doxygen Translation module of SWIG adds an extra layer of functionality to SWIG, allowing automated translation of Doxygen formatted comments from input files into a documentation language more suited for the target language. Currently this module only translates into Javadoc and Pydoc for the SWIG Java and Python modules. Other extensions could be added at a later date. The Doxygen Translation module originally started as a Google Summer of Code proposal from Summer 2008.

    17.2 Preparations

    To make use of the comment translation system, your documentation comments must be in properly formatted Doxygen. Doxygen comments can be present in your main SWIG interface file or any header file that it imports. You are advised to be validate that your comments compile properly with Doxygen before you try to translate them. Doxygen itself is a more comprehensive tool and can provide you better feedback for correcting any syntax errors that may be present. Please look at Doxygen's Documenting the code for the full comment format specifications. However, SWIG's Doxygen parser will still report many errors and warnings found in comments (like unterminated strings or missing ending tags).

    Currently, the whole subset of Doxygen comment styles is supported (See Documenting the code). Here they are:

    /**
     * Javadoc style comment, multiline
     */
    /*!
     * QT-style comment, multiline
     */
    /**
     Any of the above, but without intermediate *'s
     */
    /// Single-line comment
    //! Another single-line comment
    

    Also any of the above with '<' added after comment-starting symbol, like /**<, /*!<, ///<, or //!< will be treated as a post-comment and will be assigned to the code before the comment. Any number of '*' or '/' within a Doxygen comment is considered to be a separator and is not included in the final comment, so you may safely use comments like /*********/ or //////////.

    Please note, as SWIG parses the input file by itself with strict grammar, there is only a limited support for various cases of comment placement in the file.

    Comments can be placed before C/C++ expressions on separate lines:

    /**
     * Some comment
     */
    void someOtherFunction();
    /**
     * Some comment
     */
    void someFunction();
    
    class Shape {
      /*
       * Calculate the area in cm^2
       */
      int getArea();
    }
    

    After C/C++ expressions at the end of the line:

    int someVariable = 9; ///< This is a var holding magic number 9
    void doNothing(); ///< This does nothing, nop
    

    and in some special cases, like function parameter comments:

    void someFunction(
             int a ///< Some parameter 
         );
    

    or enum element comments:

    enum E_NUMBERS
    {
        EN_ZERO, ///< The first enum item, gets zero as it's value
        EN_ONE, ///< The second, EN_ONE=1
        EN_THREE
    };
    

    Currently only comments directly before or after the code items are supported. Doxygen also supports comments containing structural commands, where the comments for a code item are not put directly before or after the code item. These structural commands are stripped out by SWIG and are not assigned to anything.

    17.2.1 Enabling Doxygen translation

    Doxygen comments translation is disabled by default and needs to be explicitly enabled using the command line -doxygen option for the languages that do support it (currently Java and Python).

    17.2.2 Doxygen-specific %feature directives

    Translation of Doxygen comments is influenced by the following %feature directives:

    17.2.2.1 doxygen:notranslate

    Turns off translation of Doxygen comments to the target language syntax: the original comment will be copied to the output unchanged. This is useful if you want to use Doxygen itself to generate documentation for the target language instead of the corresponding language tool (javadoc, sphinx, ...).

    17.2.2.2 doxygen:alias:<command-name>

    Specify an alias for a Doxygen command with the given name. This can be useful for custom Doxygen commands which can be defined using ALIASES option for Doxygen itself but which are unknown to SWIG. "command-name" is the name of the command in the Doxyfile, e.g. if it contains

    ALIASES = "sideeffect=\par Side Effects:\n"
    

    Then you could also specify the same expansion for SWIG with:

    %feature("doxygen:alias:sideeffect") "\par Side Effects:\n"
    

    Please note that command arguments are not currently supported with this feature.

    Notice that it is perfectly possible and potentially useful to define the alias expansion differently depending on the target language, e.g. with

    #ifdef SWIGJAVA
    %feature("doxygen:alias:not_for_java") "This functionality is not available for Java"
    #else
    %feature("doxygen:alias:not_for_java") ""
    #endif
    

    you could use @not_for_java in the documentation comments of all functions which can't, for whatever reason, be currently exposed in Java wrappers of the C++ API.

    17.2.2.3 doxygen:ignore:<command-name>

    This feature makes it possible to just ignore an unknown Doxygen command, instead of replacing it with the predefined text that doxygen:alias does. For example, you could use

    %feature("doxygen:ignore:transferfull") Fantastic();
    /**
        A fantastic function.
    
        @transferfull Command ignored, but anything here is still included.
     */
    int * Fantastic();
    

    if you use a custom Doxygen transferfull command to indicate that the return value ownership is transferred to the caller, as this information doesn't make much sense for the other languages without explicit ownership management.

    Doxygen syntax is rather rich and, in addition to simple commands such as @transferfull, it is also possible to define commands with arguments. As explained in Doxygen documentation, the arguments can have a range of a single word, everything until the end of line or everything until the end of the next paragraph. Currently, only the "end of line" case is supported using the range="line" argument of the feature directive:

    // Ignore occurrences of
    //
    //    @compileroptions Some special C++ compiler options.
    //
    // in Doxygen comments as C++ options are not interesting for the target language
    // developers.
    %feature("doxygen:ignore:compileroptions", range="line") Amazing();
    
    /**
        An amazing function.
    
        @compileroptions This function must be compiled with /EHa when using MSVC.
     */
    void Amazing();
    
    

    In addition, it is also possible to have custom pairs of begin/end tags, similarly to the standard Doxygen @code/@endcode, for example. Such tags can also be ignored using the special value of range starting with end to indicate that the range is an interval, for example:

    %feature("doxygen:ignore:forcpponly", range="end"); // same as "end:endforcpponly"
    /**
        An incredible function.
    
        @forcpponly
        This is C++-specific.
        @endforcpponly
     */
    void Incredible();
    

    would ignore everything between @forcpponly and @endforcpponly commands in Doxygen comments. By default, the name of the end command is the same as of the start one with "end" prefix, following Doxygen conventions, but this can be overridden by providing the end command name after the colon.

    This example shows how custom tags can be used to bracket anything specific to C++ and prevent it from appearing in the target language documentation. Conversely, another pair of custom tags could be used to put target language specific information in the C++ comments. In this case, only the custom tags themselves should be ignored, but their contents should be parsed as usual and contents="parse" can be used for this:

    %feature("doxygen:ignore:beginPythonOnly", range="end:endPythonOnly", contents="parse");
    /**
        A splendid function.
    
        @beginPythonOnly
        This is specific to @b Python.
        @endPythonOnly
     */
    void Splendid();
    
    

    Putting everything together, if these directives are in effect:

    %feature("doxygen:ignore:transferfull");
    %feature("doxygen:ignore:compileroptions", range="line");
    %feature("doxygen:ignore:forcpponly", range="end");
    %feature("doxygen:ignore:beginPythonOnly", range="end:endPythonOnly", contents="parse");
    

    then the following C++ Doxygen comment:

    /**
        A contrived example of ignoring too many commands in one comment.
    
        @forcpponly
        This is C++-specific.
        @endforcpponly
    
        @beginPythonOnly
        This is specific to @b Python.
        @endPythonOnly
    
        @transferfull Command ignored, but anything here is still included.
    
        @compileroptions This function must be compiled with /EHa when using MSVC.
     */
    int * Contrived();
    

    would be translated to this comment in Python:

    def func():
        r"""
        A contrived example of ignoring too many commands in one comment.
    
        This is specific to **Python**.
    
        Command ignored, but anything here is still included.
        """
        ...
    

    17.2.2.4 doxygen:nolinktranslate

    Turn off automatic link-objects translation. This is only applicable to Java at the moment.

    17.2.2.5 doxygen:nostripparams

    Turn off stripping of @param and @tparam Doxygen commands if the parameter is not found in the function signature. This is only applicable to Java at the moment.

    17.2.3 Additional command line options

    ALSO TO BE ADDED (Javadoc auto brief?)

    17.3 Doxygen to Javadoc

    If translation is enabled, Javadoc formatted comments should be automatically placed in the correct locations in the resulting module and proxy files.

    17.3.1 Basic example

    Here is an example segment from an included header file

    /*! This is describing class Shape
     \author Bob
     */
    
    class Shape {
    public:
      Shape() {
        nshapes++;
      }
      virtual ~Shape() {
        nshapes--;
      };
      double  x, y; /*!< Important Variables */
      void    move(double dx, double dy); /*!< Moves the Shape */
      virtual double area(void) = 0; /*!< \return the area */
      virtual double perimeter(void) = 0; /*!< \return the perimeter */
      static  int nshapes;
    };
    

    Simply running SWIG should result in the following code being present in Shapes.java

    
    /**
     * This is describing class Shape 
     * @author Bob 
     * 
     */
    
    public class Shape {
    
    ...
    
    /**
     * Important Variables 
     */
      public void setX(double value) {
        ShapesJNI.Shape_x_set(swigCPtr, this, value);
      }
    
    /**
     * Important Variables 
     */
      public double getX() {
        return ShapesJNI.Shape_x_get(swigCPtr, this);
      }
    
    /**
     * Moves the Shape 
     */
      public void move(double dx, double dy) {
        ShapesJNI.Shape_move(swigCPtr, this, dx, dy);
      }
    
    /**
     * @return the area 
     */
      public double area() {
        return ShapesJNI.Shape_area(swigCPtr, this);
      }
    
    /**
     * @return the perimeter 
     */
      public double perimeter() {
        return ShapesJNI.Shape_perimeter(swigCPtr, this);
      }
    }
    
    

    The code Java-wise should be identical to what would have been generated without the doxygen functionality enabled. When the Doxygen Translator module encounters a comment that contains nothing useful or a doxygen comment that it cannot parse, it will not affect the functionality of the SWIG generated code.

    The Javadoc translator will handle most of the tags conversions (see the table below). It will also automatically translate link-objects params, in \see and \link...\endlink commands. For example, 'someFunction(std::string)' will be converted to 'someFunction(String)'. If you don't want such behaviour, you could turn this off by using the 'doxygen:nolinktranslate' feature. Also all '\param' and '\tparam' commands are stripped out, if the specified parameter is not present in the function. Use 'doxygen:nostripparams' to avoid.

    Javadoc translator features summary (see %feature directives):

    17.3.2 Javadoc tags

    Here is the list of all Doxygen tags and the description of how they are translated to Javadoc

    Doxygen tags
    \a wrapped with <i> html tag
    \arg wrapped with <li> html tag
    \author translated to @author
    \authors translated to @author
    \b wrapped with <b> html tag
    \c wrapped with <code> html tag
    \cite wrapped with <i> html tag
    \code translated to {@code ...}
    \cond translated to 'Conditional comment: <condition>'
    \copyright replaced with 'Copyright:'
    \deprecated translated to @deprecated
    \e wrapped with <i> html tag
    \else replaced with '}Else:{'
    \elseif replaced with '}Else if: <condition>{'
    \em wrapped with <i> html tag
    \endcode see note for \code
    \endcond replaced with 'End of conditional comment.'
    \endif replaced with '}'
    \endlink see note for \link
    \endverbatim see note for \verbatim
    \exception translated to @exception
    \f$, \f[, \f], \f{, \f} LateX formulas are left unchanged
    \if replaced with 'If: <condition> {'
    \ifnot replaced with 'If not: <condition> {'
    \image translated to <img/> html tag only if target=HTML
    \li wrapped with <li> html tag
    \link translated to {@link ...}
    \n replaced with new line char
    \note replaced with 'Note:'
    \overload prints 'This is an overloaded ...' according to Doxygen docs
    \p wrapped with <code> html tag
    \par replaced with <p alt='title'>...</p>
    \param translated to @param
    \remark replaced with 'Remarks:'
    \remarks replaced with 'Remarks:'
    \result translated to @return
    \return translated to @return
    \returns translated to @return
    \sa translated to @see
    \see translated to @see
    \since translated to @since
    \throw translated to @throws
    \throws translated to @throws
    \todo replaced with 'TODO:'
    \tparam translated to @param
    \verbatim translated to {@literal ...}
    \version translated to @version
    \warning translated to 'Warning:'
    \$ prints $ char
    \@ prints @ char
    \\ prints \ char
    \& prints & char
    \~ prints ~ char
    \< prints < char
    \> prints > char
    \# prints # char
    \% prints % char
    \" prints " char
    \. prints . char
    \:: prints ::

    17.3.3 Unsupported tags

    Doxygen has a wealth of tags such as @latexonly that have no equivalent in Javadoc (all supported tags are listed in Javadoc documentation). As a result several tags have no translation or particular use, such as some linking and section tags. These are suppressed with their content just printed out (if the tag has any sense, typically text content). Here is the list of these tags:

    Unsupported Doxygen tags
    \addindex \addtogroup \anchor \attention
    \brief \bug \callgraph \callergraph
    \class \copybrief \copydetails \copydoc
    \date \def \defgroup \details
    \dir \dontinclude \dot \dotfile
    \enddot \endhtmlonly \endinternal \endlatexonly
    \endmanonly \endmsc \endrtfonly \endxmlonly
    \enum \example \extends
    \file \fn \headerfile \hideinitializer
    \htmlinclude \htmlonly \implements \include
    \includelineno \ingroup \internal \invariant
    \interface \latexonly \line \mainpage
    \manonly \memberof \msc \mscfile
    \name \namespace \nosubgrouping \package
    \page \paragraph \post \pre
    \private \privatesection \property \protected
    \protectedsection \protocol \public \publicsection
    \ref \related \relates \relatedalso
    \relatesalso \retval \rtfonly \section
    \short \showinitializer \skip \skipline
    \snippet \struct \subpage \subsection
    \subsubsection \tableofcontents \test \typedef
    \union \until \var \verbinclude
    \weakgroup \xmlonly \xrefitem \category

    If one of the following Doxygen tags appears as the first tag in a comment, the whole comment block is ignored:

    Ignored Doxygen tags
    \addtogroup \callgraph \callergraph \category
    \class \def \defgroup \dir
    \enum \example \file \fn
    \headerfile \hideinitializer \interface \internal
    \mainpage \name \namespace \nosubgrouping
    \overload \package \page \property
    \protocol \relates \relatesalso \showinitializer
    \struct \name \namespace \nosubgrouping
    \typedef \union \var \weakgroup

    17.3.4 Further details

    TO BE ADDED.

    17.4 Doxygen to Pydoc

    If translation is enabled, Pydoc formatted comments should be automatically placed in the correct locations in the resulting module and proxy files. The problem is that Pydoc has no tag mechanism like Doxygen or Javadoc, so most of Doxygen commands are translated by merely copying the appropriate command text.

    17.4.1 Basic example

    Here is an example segment from an included header file

    /*! This is describing class Shape
     \author Bob
     */
    
    class Shape {
    public:
      Shape() {
        nshapes++;
      }
      virtual ~Shape() {
        nshapes--;
      };
      double  x, y; /*!< Important Variables */
      void    move(double dx, double dy); /*!< Moves the Shape */
      virtual double area(void) = 0; /*!< \return the area */
      virtual double perimeter(void) = 0; /*!< \return the perimeter */
      static  int nshapes;
    };
    

    Simply running SWIG should result in the following code being present in Shapes.py

    
    ...
    
    class Shape(_object):
        """
        This is describing class Shape 
        Authors:
        Bob 
    
        """
        
        ...
        
        def move(self, *args):
            """
            Moves the Shape 
            """
            return _Shapes.Shape_move(self, *args)
    
        def area(self):
            """
            Return:
            the area 
            """
            return _Shapes.Shape_area(self)
    
        def perimeter(self):
            """
            Return:
            the perimeter 
            """
            return _Shapes.Shape_perimeter(self)
    

    If any parameters of a function or a method are documented in the Doxygen comment, their description is copied into the generated output using Sphinx documentation conventions. For example

    /**
        Set a breakpoint at the given location.
    
        @param filename The full path to the file.
        @param line_number The line number in the file.
     */
    bool SetBreakpoint(const char* filename, int line_number);
    

    would be translated to

    def SetBreakpoint(filename, line_number):
        r"""
        Set a breakpoint at the given location.
    
        :type filename: string
        :param filename: The full path to the file.
        :type line_number: int
        :param line_number: The line number in the file.
        """
    

    The types used for the parameter documentation come from the "doctype" typemap which is defined for all the primitive types and a few others (e.g. std::string and shared_ptr<T>) but for non-primitive types is taken to be just the C++ name of the type with namespace scope delimiters (::) replaced with a dot. To change this, you can define your own typemaps for the custom types, e.g:

    %typemap(doctype) MyDate "datetime.date";
    

    Currently Doxygen comments assigned to global variables and static member variables are not present in generated code, so they have no comment translated for them.

    Whitespace and tables Whitespace is preserved when translating comments, so it makes sense to have Doxygen comments formatted in a readable way. This includes tables, where tags <th>, <td> and </tr>are translated to '|'. The line after line with <th> tags contains dashes. If we take care about whitespace, comments in Python are much more readable. Example:

    /**
     * <table border = '1'>
     * <caption>Animals</caption>
     * <tr><th> Column 1 </th><th> Column 2 </th></tr>
     * <tr><td> cow      </td><td> dog      </td></tr>
     * <tr><td> cat      </td><td> mouse    </td></tr>
     * <tr><td> horse    </td><td> parrot   </td></tr>
     * </table>
     */
    

    translates to Python as:

      Animals
      | Column 1 | Column 2 |
      -----------------------
      | cow      | dog      |
      | cat      | mouse    |
      | horse    | parrot   |
    

    Overloaded functions Since all the overloaded functions in c++ are wrapped into one Python function, Pydoc translator will combine every comment of every overloaded function and put it into the comment for the one wrapper function.

    If you intend to use resulting generated Python file with the Doxygen docs generator, rather than Pydoc, you may want to turn off translation completely (doxygen:notranslate feature). Then SWIG will just copy the comments to the proxy file and reformat them if needed, but all the comment content will be left as is. As Doxygen doesn't support special commands in Python comments (see Doxygen docs), you may want to use some tool like doxypy (doxypy) to do the work.

    17.4.2 Pydoc translator

    Here is the list of all Doxygen tags and the description of how they are translated to Pydoc

    Doxygen tags
    \a wrapped with '_'
    \arg prepended with ' --'
    \author prints 'Author:'
    \authors prints 'Author:'
    \b wrapped with '__'
    \cite wrapped with single quotes
    \cond translated to 'Conditional comment: <condition>'
    \copyright prints 'Copyright:'
    \deprecated prints 'Deprecated:'
    \e wrapped with '_'
    \else replaced with '}Else:{'
    \elseif replaced with '}Else if: <condition>{'
    \em wrapped with '_'
    \endcond replaced with 'End of conditional comment.'
    \endif replaced with '}'
    \exception replaced with 'Throws:'
    \if replaced with 'If: <condition> {'
    \ifnot replaced with 'If not: <condition> {'
    \li prepended with ' --'
    \n replaced with new line char
    \note replaced with 'Note:'
    \overload prints 'This is an overloaded ...' according to Doxygen docs
    \par replaced with 'Title: ...'
    \param translated to 'Arguments:\n param(type) --description'
    \remark replaced with 'Remarks:'
    \remarks replaced with 'Remarks:'
    \result replaced with 'Result:'
    \return replaced with 'Result:'
    \returns replaced with 'Result:'
    \sa replaced with 'See also:'
    \see replaced with 'See also:'
    \since replaced with 'Since:'
    \throw replaced with 'Throws:'
    \throws replaced wih 'Throws:'
    \todo replaced with 'TODO:'
    \tparam translated to 'Arguments:\n param(type) --description'
    \version replaced with 'Version:'
    \warning translated to 'Warning:'
    \$ prints $ char
    \@ prints @ char
    \\ prints \ char
    \& prints & char
    \~ prints ~ char
    \< prints < char
    \> prints > char
    \# prints # char
    \% prints % char
    \" prints " char
    \. prints . character
    \:: prints ::

    17.4.3 Unsupported tags

    Doxygen has a wealth of tags such as @latexonly that have no equivalent in Pydoc. As a result several tags that have no translation (or particular use, such as some linking and section tags) are suppressed with their content just printed out (if it has any sense, typically text content). Here is the list of these tags:

    Unsupported Doxygen tags
    \addindex \addtogroup \anchor \attention
    \brief \bug \callgraph \callergraph
    \class \copybrief \copydetails \copydoc
    \date \def \defgroup \details
    \dir \dontinclude \dot \dotfile
    \code \endcode \endverbatim \endlink
    \enddot \endhtmlonly \endinternal \endlatexonly
    \endmanonly \endmsc \endrtfonly \endxmlonly
    \enum \example \extends \f$
    \f[ \f] \f{ \f}
    \file \fn \headerfile \hideinitializer
    \htmlinclude \htmlonly \implements \include
    \image \link \verbatim \p
    \includelineno \ingroup \internal \invariant
    \interface \latexonly \line \mainpage
    \manonly \memberof \msc \mscfile
    \name \namespace \nosubgrouping \package
    \page \paragraph \post \pre
    \private \privatesection \property \protected
    \protectedsection \protocol \public \publicsection
    \ref \related \relates \relatedalso
    \relatesalso \retval \rtfonly \section
    \short \showinitializer \skip \skipline
    \snippet \struct \subpage \subsection
    \subsubsection \tableofcontents \test \typedef
    \union \until \var \verbinclude
    \weakgroup \xmlonly \xrefitem \category
    \c

    17.4.4 Further details

    TO BE ADDED.

    17.5 Troubleshooting

    When running SWIG with command line option -doxygen, it may happen that SWIG will fail to parse the code, which is valid C++ code and is parsed without problems without the option. The problem is, that Doxygen comments are not tokens (the C/C++ compiler actually never sees them) and that they can appear anywhere in the code. That's why it is practically impossible to handle all corner cases with the parser. However, these problems can usually be avoided by minor changes in the code or comment. Known problems and solutions are shown in this section.

    Recommended approach is to first run SWIG without command line option -doxygen. When it successfully processes the code, include the option and fix problems with Doxygen comments.

    17.5.1 Problem with conditional compilation

    Inserting a conditional compilation preprocessor directive between a Doxygen comment and a commented item may break parsing:

    class A {
      /**
       * Some func.
       */
      #ifndef SWIG
      void myfunc()
      {
      }
      #endif
    };
    

    The solution is to move the directive above the comment:

    class A {
      #ifndef SWIG
      /**
       * Some func.
       */
      void myfunc()
      {
      }
      #endif
    };
    

    17.6 Developer information

    This section contains information for developers enhancing the Doxygen translator.

    17.6.1 Doxygen translator design

    If this functionality is turned on, SWIG places all comments found into the SWIG parse tree. Nodes contain an additional attribute called doxygen when a comment is present. Individual nodes containing Doxygen with Structural Indicators, such as @file, as their first command, are also present in the parse tree. These individual "blobs" of Doxygen such as :

    /*! This is describing function Foo
     \param x some random variable
     \author Bob
     \return Foo
     */
    

    are passed on individually to the Doxygen Translator module. This module builds its own private parse tree and hands it to a separate class for translation into the target documentation language. For example, JavaDocConverter is the Javadoc module class.

    17.6.2 Debugging the Doxygen parser and translator

    There are two handy command line options, that enable lots of detailed debug information printing.

      -debug-doxygen-parser     - Display Doxygen parser module debugging information
      -debug-doxygen-translator - Display Doxygen translator module debugging information
    

    17.6.3 Tests

    Doxygen tests have been added to the regular SWIG test-suite. There are a number of tests beginning doxygen_ in the Examples/test-suite sub-directory.

    Like any other SWIG test case, the tests are included in Examples/test-suite/common.mk and can be tested with commands like make check-test-suite or make check-python-test-suite. To run them individually, type make -s <testname>.cpptest in the language-specific sub-directory in Examples/test-suite directory. For example:

      Examples/test-suite/java $ make -s doxygen_parsing.cpptest
    

    If the test fails, both expected and translated comments are printed to std out, but also written to files expected.txt and got.txt. Since it is often difficult to find a single character difference in several lines of text, we can use some diff tool, for example:

      Examples/test-suite/java $ kdiff3 expected.txt got.txt
    

    Runtime tests in Java are implemented using Javadoc doclets. To make that work, you should have tools.jar from the JDK in your classpath. Or you should have JAVA_HOME environment variable defined and pointing to the JDK location.

    The Java's comment parsing code (the testing part) is located in commentParser.java. It checks the generated code. It is possible to run this file as a stand-alone program, with java commentParser <some java package>, and it will print the list of comments found in the specified directory (in the format it has used in the runtime tests). So, when you want to create a new Doxygen test case, just copy an existing one and replace the actual comment content (section of entries in form 'wantedComments.put(...)' with the output of the above command.

    Runtime tests in Python are just plain string comparisons of the __doc__ properties.

    17.7 Extending to other languages

    In general, an extension to another language requires a fairly deep understanding of the target language module, such as Modules/python.cxx for Python. Searching for "doxygen" in the java.cxx module can give you a good idea of the process for placing documentation comments into the correct areas. The basic gist is that anywhere a comment may reside on a node, there needs to be a catch for it in front of where that function, class, or other object is written out to a target language file. The other half of extension is building a target documentation language comment generator that handles one blob at a time. However, this is relatively simple and nowhere near as complex as the wrapper generating modules in SWIG. See Source/Doxygen/javadoc.cxx for a good example. The target language module passes the Doxygen Translator the blob to translate, and receives back the translated text.

    What is given to the Doxygen Translator

    /*! This is describing function Foo
     \param x some random variable
     \author Bob
     \return Foo
     */
    

    What is received back by java.cxx

    /** This is describing function Foo
     *
     * @param x some random variable
     * @author Bob
     * @return Foo
     */
    

    Development of the comment translator itself is simplified by the fact that the Doxygen Translator module can easily include a main function and thus be developed, compiled, and tested independently of SWIG.

    swig-4.0.1/Doc/Manual/android-simple.png0000644000175000017500000001726413527063513017721 0ustar williamwilliam‰PNG  IHDRÎv)r{IDATxœí”UU½Ço ©©é³Ÿýì­·ÞzÇwüð‡?¼þúë]Ô§>õ)µùý7>¨w¿üòËoºé¦t:ýàƒ®^½ú[ßúÖ7¿ùMIÔç?ÿù›o¾yîܹcÇŽÍ;rÄð“Ÿ0lð rGØ©NÞ 02Ž‹.ºhn€[n¹åÅ_üç?ÿù‹_üâöÛoFM:ÕåÒhpÙe—¹¨òòò7Þxã¯ýë»ï¾û—¿üå׿þµ”ÁÅ*eqqqìÙ¡÷!Ѽæšk¾öµ¯Iô~øay¾úÕ¯®\¹²¶¶öë_ÿú7¾ñÏ|æ3R’hÆ¢qE%M¾ás+î;ëŽû&訸ïlçYxß„›—ŸyÉôñg×¢ô£². ^_ÕÕ z_}õÕÁ¨É“'»\ãÇŸ5k–‹zÉã¹çž“æÈ³}ûöW_}ÕÅjà;ûì³;érCn¾ô¥/©WRwfjˆ~á…t¸sçΫ®º*6×–-[öíÛWUUež{î¹?þøþðÝ_ õ¹Ï¨Éᥗ^ZQQ!+@†Ciié%—\"W†Æµ×^k{F+Á¡\S&O™ûøûží·üùÄŠç<ŸyîîCw>:pê”)gÙ‡Œ™Of¢z«/¿ñÆe̼óÎ;ºÒ]…ŸwÞy.—ælúU«Ví‹cÍš56Rj{vèT}ôQ‰¬î…À†ÜvÛmo½õVccãOúS…k´æª¬¬´wð‹_ü¢ yöÙgß{ï=‰þÚµk—/_žû¤#FŒY¡û~×]w=ñį¿þúßÿþ÷_þò—O>ùä’%K®X‰{4ãy“λþ®1Ë·}¸z[BîkŽ™ué%Éä¬drvrÖœdòÒdòâ9³fNŸ9½èŒ"¥Ï[†Äqæ™gªk—¦>ýôÓê¶uÔ+H4ŠÉ°yûí·u!4&(z}—Ksp %%%jŒ®ò‹-¨Sq~õ%š@ŸvÚi±g‡ÎCÖ¶¤ݺurþóŸ»pÝq둱ºgÏyæÏŸ¯ýÝï~W~'Vuöºï_øÂl¬üšê^ËôÝïyO>ùdMùÔåÿñ”DmÛ¶M¢%÷•W^ùóŸÿ,C±Ã† å5bÄÉ¢÷ ªz&QõtŸª-‰O/ýÉiŸœ=köW¬yçÿÞÙ¹ó…ÊÊÏMŸ:}ÊESN;ÕˆSÇ(€¦#à4`©ºj§ì6Ín¥°¦OŸ®Jÿä'?QˆÒœ~úé­Õ5J×bµÇ† þ·Mÿûßÿ¾Í~ìã£|ît 7ÜpƒZ·5¨½“Éä—¿üe;J+Dcþ?þñ òë†J{ì1§ÿåÿñ,Wã€lãýž÷¬³Î’e¡þ^«Æù§L™"‰Ò$Xv„b‡L?|øÐqcO½å‘ƒïþŸßûTâž§þåž§so:éüIKÒé×_}m÷뻯H]9iây“&NRi#GÒ8)‰²}¦©jpœ1c†,6õ Ò{É®,Cpœ‡„Øå’Kî¾ûn…ÿà?pfzç× «ØÅ‹+¥¬Ø³Cg#kÛ*€ ‘aãn:c¨NB)ÅôkªúÈ#(Á½÷Þ«(« »víºÿþû52H$$ĹOªßÊ̲eËš››5åP‡¨ÙˆŒ*vðàÁÁôC‡ •VT®í·øÛN?‘Ho0ÇìkŽ¿éÆ›^ØþÂk¯¼¶mû¶]/¾¨š\TrÑØÓÆ=y¨ruŒH“ì,D›F¨t:-ãG  oݺUS7MÑÐÌ%Sï{ßûž:ŒçŸÞ ýo¼áüºè?ü°Ò(e¨ÁÐeD@]ò¢E‹48kœ×ýR袞yæ™ßÿþ÷êªëëë•K½Fo«wÞy§¬_¿^~W9Îxâ‰'Ú·ŸbÓ¦MÏ=÷ÜSO=%ÐDB]¡£½á¨Q#¦N›>;5¸ìþûÜc‰ÿ|,±øÛ‰’+Žqòˆ“‡Ÿ|ö¹g?ÞðdÍWª'Nœ4rÄÈ“†žtâ 'žÔ”[ uðwÙj2ߥåRwõ ÁZüñ.‹üj§¬Æ|ðg?û™ú_ýêWÎÿÒK/ÉpT¥Ìvjèl$pº/¿ür4J¢©(õúò«V'¥®:ô$CÝvMM<ÕÕÕJ¶qãFùeÇç8£dã„N°2£éŸ,u’%M!Ôo*P±AY 3z̸3ÆÏPù_ ‹þ;1ë¦)á ãYt¦ “aC‡§LÇ*,,ñ et±‡~¸j/#Rª)Wþ#Ž8ÂÅ*å!‡ÒI—zR€|ä#’Ýzý\¶l™:DM)e÷+ÄFÅ*€P͆fA¦—æ“ÇëÛWy+ÀÑq¨*z[oËĉïºë.Y~.D±cÇŽUÊ`®SN9EÃVl™A”æÔSO æ…ÞîµfºêccmT‡ÈCÇ(€l)Éú´ý¡4êÝ].‰õ9眳ß\– & z7îÑ£G“%Ž)S¦¨Cìå­‡ô"òV€€^ 4y+Àa½ˆ¼ vemíªZ\ÜÞá¶GªWV›ÌÞ!õ ÿ¨ZQ Ç¿çûóV€ê“Ó¹UË«ÒKÓUËZÜei£ ™iä*™Ñ7kÊY–öÝeUÁôÑÒ²¹¹Ï‚‹uójLN{È_¹¤²rQeùÂòÊ…•ò5ü-¯¦ñõd™¯!&AK¸ªZZeËÑáûU”Ó„@9¹ý¶|{È¿ßôøñç?x]²s%©ÍÛ›ß~ïm±cçI°t ½$mÜ¥ž,.1®Âeo)MÃÆ“Æ 7R¾$-åÑ¡Bö¾µWÇŽ—M!RM•Ù°¡Á/Е™Y²üpeaeõªê}ûö5nj4êä)¤IiÕ2³æ¸¸íU€ÀQ¿Öüé¡ik“d®isSyE¹‘¼…•ƳÐ<\ÉhÓ–&²lA™~ÚÃD-(¯[Sg Ùâ²Å"‘mÞÖœ‘xA¹óØ’Ûâ±çU”²¨(©™MïÒXÍ Užƒ#oÙÙ%pê°Kç”–Í/K]—Ú»w¯†‚²ËÔ—+J3c+”n¹õëë%ÓŠ²ÿ”·ÊS¿®Þ¦LÍK)£n[OãæF3>ìÝ«=oîQÞæ­Í©S¶äºµuŠRxåÒJUÉ(Àú†äܤ…›Äۛ̀#û*sv‹›ÿ°¼ÚZùÎ}û-cÿH¾ìÎ/3Ñ[o—Î-•ÈJ(5DHj•@ón#Óëê­¸K"¥ÐÔ‚”üJl Q·--ò`]½ ó_ÒWv™y¨«?êã¥3V…¤ Fз5KüŒKÓÆâÚР4¶äô"oˆÔ÷@vóVnêòKè%Uêò%vr%÷Ö(’ØI¦5>¨ó–\îÚ½K¹í­uÈSVaTE¢,¥óK]! Tˆ•{¥´¹$ÐÅïÙ³Gå”\X" Ç”° ÌŠ»,(JI” t;¯°ºaͰPýñàþ¼Àå´‡@òšœÜ±}Ǿ÷ö¥æ§di9ÞÖ¬~Z½µDVr)5p¢Y:¯T!J‰¦dW?•KÆŒ(åR¸¬—°¬­/™Z"m‘”Ë£~ÝW+ؽ+¨fv¬Z¹W¸õ„êÏq€ùKÓUK[ž½,M7mjÒ´U=´dZmºó¹¥Ö/¡—ŒÚXš`eZÂ* ±ÆIíªZ• ÑW®B¤ {vï1FÑÜT•gÊ[KÆz¤cVäñ ÂWɽòªLÙB.½¢lǯFš¹DMµ(‡êÿ÷ç?d–bì{ÍÞ{[‚[»ºÖôåóS;¶cF?ÍLÀ›†jÂêdº|a¹´Â΀nÔTK|m2‰xÝê:•à&ÁU-“Zé‰Q€Ý»ä±3oóòaI¥û÷°bíƒQ›^³e·ÅÊ•"ýø£þüG€àóø%iÍDÍÜ÷:s˜'ÞOç‰J¸Õ‹«c.™Q"¿(65Êcþ˜d-O<íRÿé§-Á{ j‹ÒØ¢\i¯¿7š6§ÔÔÁ‹²OE[ëИñŽwI» pøÒVxèz<¿ÐUlO|ÕU›ç¤ Êì«1‰¯Ñ“@ ¦k_Ôš«õ‘fù*Ê*R_UyýÒZêà¿ àày+€£ keNn(<6¥ÄÑØúÞ³|Y&ö•”a¿y£®rù¯½64˜ q‹ˆãâ¶ÝmÏÐîóU.ªtfŒŽÔu)¿ão—ìºÞÝõñÝ~5q?pnŒíÐÉ«[ãÐ>éOFžÊ¶?¸¸Q·KG\Üžævõ€‹Û£Ü¼|úè_<©89'Y:§´ó\¢=ÿÞèTúÔ¯zeµYë¶µ¹ikSç¹M››jWÕJÙº»Åª–WízŬ?3nç»}·ª&ÿuKÇ®—wííB¤ÝÝb€öOX{ßì:·»[ @BÙ*{:Ù}Ó,“îîPv1ÝÝb€¾Tîî׺»ÅöxÿеOi$¦î‰Mgùw3 †žD«ô¿²Ç=µì<¿t »[ ÀHçËæØñòŽNw=Mèîð¥çç&ú&† R8¨ÐìŠï×Óîn1@+æØî»ýêgý%SKjWÕºðŽqwîèî°BÙ¼½Yj]«òWy{5mn*šPdCRóRõëê›·6+’¿xR±”$˜7·ku »[ ÀHç¶æà!°ž¢ñE÷ÆMòسcܺú¦-M2“ä*$9#iT"³„¬Çvstw‹˜½ß¶íP§nÔsÍ`Ø©AÕŠ*…´*ÀÖf»e¢D_“¢y‚Ì$—w?î63tw‹H(ýË[|׎•Þ?tC œ“´ 0zÔè¶+€+ÙW0€žƒJ+[Œë+€ç/Tذ¡¡iSSÁQ6Jžº5uR £^³ôÊjù«–WÙ4A+³UPèQX¹4Çfß•XuMµú~ù%åR†â ÅÉÙIõ÷Ø4fÿÕÕÒ“‚‚…øž-M.$X²q·6uw‹˜ÿjYéÜÜÔ¸¹Ñz:ÉoÇîn1@óE£Ífû6}Xèî°Ý¿•ÎVIÝÔ þÍþ·Ãº»ÅZå~c—¸›»»Å¬ÞEÒïÝÝb€¾ôollØØÐé®§ÝÝb€þô—LÜÀï¡7v²Ÿz ëºbÜr4lhèîH/Mûo¬Ü“ÐÍî÷߈mijÏçœ:þýû×­©³«tÚ´¢³ÝîÖæúµõG±?.ô0 ’3’ö‘©ëRîÚ?ê… »»­kW×Ö­­+_PžèÛ1eŽ>utåBóÕ↠ukêt”W´µp—×Q4®¨uh{®ö•½YN_ó¼âIÅRfá`³£hFáËÚZ¸ËëÓ7Q»ª6ï´=Wûʇ^ƒ[—V:·TGÿýÓKÓå Ë­X$g˜ t7ݤb«WTW¯¬®]YÛ¯_?ý¬ZQ%uMµ~º2^2µ$á­± ^pT²ÛuóêzM5Õ•‹*ÍŒKÓG—×’šŸÒ¥Ø!ƒ‡ë#O°¡š(——+½,­:×­®2lˆMìÚ*8¬Œšï×TËüpHt¬4hXHx+…ê×Õ'<ù+WjÒ{â.IMÍK¹Ÿ1…{Ú¥XIçèQ£Ô„@ò§òÞ‚<¥ Ñ7Q¿¶Þz•ݨ¥gJ©œÂA­K*Â5 är*<½Ä, ¶1”8Ì@}êJ¿O•p¨§´Q2Z$¦Ë¯©–/%‘J(V}¹ü OC”×ýŒbæ«ë¤¶Sœ¢IHÑ„ˆ9Ðâ ‹u$= áš(׺zWBÙue}êéCmDtBKóƒYra‰™g¢Þ49;)²¢æÿ\S«¶põͲ4Vܰ(¬e ÊŠ'Dæ U}œ¨Ì”Q“`®©%f ®ÙÅ B@ œ8Щ_ŸqûeÈ\öýÌik?X+Å™:2WdB„~f-Ü›hJú•¾nm QÉÆâ œNÂ3jh& -‰eSW•Fkâr%ç$­u$ýBð¤W oŸ~D=Ð[É¡ Ï ²“NûhR?«Ãö©¡Ÿ9 —dÛÞ7u]J¢/ATmT® Øù«ÄÑžQÒL­‰Ëeû{)L6p)Íž§ž~F=Ð+ÐÔÓ.×±J41mcÆ6¦Ôd×Î_zb·C‰yÐÙ7|<’‹6§D çZz©A aCƒ{”.Yö³ªÖþ”†T.©,¯(W`(¥{:éVV–Î-µˆ@Ï¥jy•ÄÚ-ŒÉxìí­º‘ø*AÂS }4¥Yˆæ=ãwï¹Ì_;>xÉPèÑM(ò_-e*€ºy‰¾ºy÷þ(¸‚À¥,žT,¿:{öͱBR×¥l¬Ñ.z8~çëÖ%4 c^ f*@Æ ~/€v…O“r+ÜíXB]2”a­ñL –Ù@DÆT†™ªzÆ};–Ð$"K†-“`;if™ ôì“û† þî=ö…@—½íëŽòMÜ-ØE¡GŽláï‡ä³GFèt»­öCöå½}Iÿ>·½ˆYÒÒ×ÿ e÷ì¾û¯[[ç¯4ky,nÙïÕˆ¯yäŒCÕrÿï…q“²ÒöuGù&î&œˆôÐ?6A¶ðv#is²}ÝP«ýúõ³U’ Ù·õí&ª*PbíÄÑÿÃjߌ¿\çØs)÷Õˆ­yèŒFPì£LûÓÆF×ù8”2½4]¿¾^é º•B±¹B+‹r¯&RMT+ýTg¦kJìP.hÆ./Wë&g$]!ê Ír…•¥sKm§¢KŸ#*¾œU¶±î²8B«ž\'bJó¤Ó^UjZìé‚W2ØØ`2¹ºò**(—G¨’JúËhl×]ëmfŽ5]VF8š·ŸóRN¢ì_ÀMãÈq5²¥Œž±Ã*€äÌ ‘6ïm@hC6‰­Šî„.wp¥P|®Ì•E¹WéêÒ»\áEJÁm‚q™·U²oè”Ò¾wSU]mã£r–z±]õän˜êo‹µ’áÂCMËvºªÇn š‡vdÒe´;‹…@?ý“‰[ëlæ~×tÅÑ\½–}:œ5¨\V¸Cl¶«%TóNW€ÖMJn,S·]çãr¹•¤N¤\ÞØ\¡•E¹WÙaTꮢ \pú©K¦›¬’NjÛ¨yŽ’åˆÊ]޽,±'µBãn­[Bb×¶öy™MË}º­KD@eZ• )€±"âú×k½ÜÝϽ¤%·¸dºv¡#ÛÕ—©y§+@h†è:Ÿ v¬´ßóFsEWå^MdØI•¹4íUW¥¨d‹Ê]NhëŠ hP+U¡•T®i¹O—£u‰ˆ˜í½§®•¬#ÛqÚ¡#jpç^ëåî~Û jSJŽƒ!Ù®F0KlÍ»Z¢ë|Zé›Zx¹7Š®,Jä\M”cŸ‡?@·ØH±¶D; w9!ˆ®z &Viæ ™žn»ðPÓrŸ®õò¶Í²¸ÀZᱟå̽ÖË63fMW&Aq vêJl©ýoìmk©l5ïjHÄ­óññ.Š]J´q-¡\Ñ•E‰œ«‰rìó¬BëÞ½¡IpËCÀv(@îr¢›…V=ëŽJoýGC-áѦå8]èžHûU¹ª€?,¬©Ëèƒs®õrÍ µ.t¢8Úg:¬Å¯æÛ ëÈ6ȶµT¶šwŠ´ÕÃoUßÖ' öƒñÙ-ö;èã 4iÕè)7vKCèÙ¸…@Ù^ÚµÍ)íë=7= ]1ÐmD/¾Ì›,»  å‰˜#vÅ@·R€Ð‚“ض£î?´x&÷뀮&¨1/e²“B¢l/Ø#ôÎBÓbûH8ô&/Ç s€nÀÍÊ+Ê£ïÛcßÀ·iEÈÎA gòR€Ü#€#´œzí6rà$Þì}²Æÿ(˜]¨]1ÐdωL‚ç´Õþ±kBìBpkäw ­è*º~-P¶Ý]Ün6±i¢;ÌÈÜÖ7v'™þúÛ½rü±hºx-P"Ëî.ÁÝlbÓ„^¨÷2p®‹ÙIfEïÚ ]¼(·»Kt7›Pšè3ÁÄ:Eì®[ÿ€.^ d )@ìn6¡?\‡v˜1›²xªe¶Êü¿¶ÛIFu¥d*Ÿq@<]¼ÈÚO&~7›¸¿?w˜IÍKI²•Æý©?‘¹“Œ ôý}Ã+2|ºx-%(ܱ»Ù$²ÿÿ?´ÃŒp[n„v’‘æÖiÌdbèâµ@–XáÎ1äØaF:iwR‰î$ãO¼ÄŒOׯJ䯱;ÌØç›JcÕ#v'7iÇ zÁµ@9>‘ÔQŸ¾ò?0 g,ÁÈ› æxVÕ>ˆ~o {ÈxürSæç¢²}Ô©Ÿ jªo®Ï§tÙ ô¹¨¬Ÿ¸jÃgÅb?5Õ«¯ÚOp-PPBŸ‹ÊöQ§¶|V,öK;¬Ó„A¶ ü­¤,ujËgÅb@Û0€¶¯„?qՆϊÅ|j*si@·‘¯„>êÔÆÏŠ…>5Z=šÿ'ޝSé‹2ÃIEND®B`‚swig-4.0.1/Doc/Manual/Perl5.html0000644000175000017500000026160013527234052016152 0ustar williamwilliam SWIG and Perl5

    30 SWIG and Perl5

    Caution: This chapter is under repair!

    This chapter describes SWIG's support of Perl5. Although the Perl5 module is one of the earliest SWIG modules, it has continued to evolve and has been improved greatly with the help of SWIG users. For the best results, it is recommended that SWIG be used with Perl 5.8 or later. We're no longer testing regularly with older versions, but Perl 5.6 seems to mostly work, while older versions don't.

    30.1 Overview

    To build Perl extension modules, SWIG uses a layered approach. At the lowest level, simple procedural wrappers are generated for functions, classes, methods, and other declarations in the input file. Then, for structures and classes, an optional collection of Perl proxy classes can be generated in order to provide a more natural object oriented Perl interface. These proxy classes simply build upon the low-level interface.

    In describing the Perl interface, this chapter begins by covering the essentials. First, the problem of configuration, compiling, and installing Perl modules is discussed. Next, the low-level procedural interface is presented. Finally, proxy classes are described. Advanced customization features, typemaps, and other options are found near the end of the chapter.

    30.2 Preliminaries

    To build a Perl5 module, run SWIG using the -perl or -perl5 option as follows:

    swig -perl example.i
    
    

    This produces two files. The first file, example_wrap.c contains all of the C code needed to build a Perl5 module. The second file, example.pm contains supporting Perl code needed to properly load the module.

    To build the module, you will need to compile the file example_wrap.c and link it with the rest of your program.

    30.2.1 Getting the right header files

    In order to compile, SWIG extensions need the following Perl5 header files:

    #include "Extern.h"
    #include "perl.h"
    #include "XSUB.h"
    

    These are typically located in a directory like this

    /usr/lib/perl/5.14/CORE
    

    The SWIG configuration script automatically tries to locate this directory so that it can compile examples. However, if you need to find out where the directory is located, an easy way to find out is to ask Perl itself:

    $ perl -e 'use Config; print "$Config{archlib}\n";'
    /usr/lib/perl/5.14
    

    30.2.2 Compiling a dynamic module

    The preferred approach to building an extension module is to compile it into a shared object file or DLL. Assuming you have code you need to link to in a file called example.c, you will need to compile your program using commands like this (shown for Linux):

    $ swig -perl example.i
    $ gcc -fPIC example.c
    $ gcc -fPIC -c example_wrap.c -I/usr/lib/perl/5.14/CORE -Dbool=char
    $ gcc -shared example.o example_wrap.o -o example.so
    

    The exact compiler options vary from platform to platform. SWIG tries to guess the right options when it is installed. Therefore, you may want to start with one of the examples in the SWIG/Examples/perl5 directory. If that doesn't work, you will need to read the man-pages for your compiler and linker to get the right set of options. You might also check the SWIG Wiki for additional information.

    When linking the module, the name of the shared object file must match the module name used in the SWIG interface file. If you used `%module example', then the target should be named `example.so', `example.sl', or the appropriate dynamic module name on your system.

    30.2.3 Building a dynamic module with MakeMaker

    It is also possible to use Perl to build dynamically loadable modules for you using the MakeMaker utility. To do this, write a Perl script such as the following:

    # File : Makefile.PL
    use ExtUtils::MakeMaker;
    WriteMakefile(
            `NAME'    => `example',                  # Name of package
            `LIBS'    => [`-lm'],                    # Name of custom libraries
            `OBJECT'  => `example.o example_wrap.o'  # Object files
    );
    
    

    Now, to build a module, simply follow these steps:

    $ perl Makefile.PL
    $ make
    $ make install
    

    If you are planning to distribute a SWIG-generated module, this is the preferred approach to compilation. More information about MakeMaker can be found in "Programming Perl, 2nd ed." by Larry Wall, Tom Christiansen, and Randal Schwartz.

    30.2.4 Building a static version of Perl

    If you machine does not support dynamic loading or if you've tried to use it without success, you can build a new version of the Perl interpreter with your SWIG extensions added to it. To build a static extension, you first need to invoke SWIG as follows:

    $ swig -perl -static example.i
    

    By default SWIG includes code for dynamic loading, but the -static option takes it out.

    Next, you will need to supply a main() function that initializes your extension and starts the Perl interpreter. While, this may sound daunting, SWIG can do this for you automatically as follows:

    %module example
    
    %inline %{
    extern double My_variable;
    extern int fact(int);
    %}
    
    // Include code for rebuilding Perl
    %include <perlmain.i>
    

    The same thing can be accomplished by running SWIG as follows:

    $ swig -perl -static -lperlmain.i example.i
    

    The perlmain.i file inserts Perl's main() function into the wrapper code and automatically initializes the SWIG generated module. If you just want to make a quick a dirty module, this may be the easiest way. By default, the perlmain.i code does not initialize any other Perl extensions. If you need to use other packages, you will need to modify it appropriately. You can do this by just copying perlmain.i out of the SWIG library, placing it in your own directory, and modifying it to suit your purposes.

    To build your new Perl executable, follow the exact same procedure as for a dynamic module, but change the link line to something like this:

    $ gcc example.o example_wrap.o -L/usr/lib/perl/5.14/CORE \
            -lperl -lsocket -lnsl -lm -o myperl
    

    This will produce a new version of Perl called myperl. It should be functionality identical to Perl with your C/C++ extension added to it. Depending on your machine, you may need to link with additional libraries such as -lsocket, -lnsl, -ldl, etc.

    30.2.5 Using the module

    To use the module, simply use the Perl use statement. If all goes well, you will be able to do this:

    $ perl
    use example;
    print example::fact(4), "\n";
    24
    

    A common error received by first-time users is the following:

    use example;
    Can't locate example.pm in @INC (@INC contains: /etc/perl /usr/local/lib/perl/5.14.2 /usr/local/share/perl/5.14.2 /usr/lib/perl5 /usr/share/perl5 /usr/lib/perl/5.14 /usr/share/perl/5.14 /usr/local/lib/site_perl .) at - line 1.
    BEGIN failed--compilation aborted at - line 1.
    

    This error is almost caused when the name of the shared object file you created doesn't match the module name you specified with the %module directive.

    A somewhat related, but slightly different error is this:

    use example;
    Can't find 'boot_example' symbol in ./example.so
     at - line 1
    BEGIN failed--compilation aborted at - line 1.
    

    This error is generated because Perl can't locate the module bootstrap function in the SWIG extension module. This could be caused by a mismatch between the module name and the shared library name. However, another possible cause is forgetting to link the SWIG-generated wrapper code with the rest of your application when you linked the extension module.

    Another common error is the following:

    use example;
    Can't load './example.so' for module example: ./example.so: 
    undefined symbol: Foo at /usr/lib/perl/5.14/i386-linux/DynaLoader.pm line 169.
    
     at - line 1
    BEGIN failed--compilation aborted at - line 1.
    

    This error usually indicates that you forgot to include some object files or libraries in the linking of the shared library file. Make sure you compile both the SWIG wrapper file and your original program into a shared library file. Make sure you pass all of the required libraries to the linker.

    Sometimes unresolved symbols occur because a wrapper has been created for a function that doesn't actually exist in a library. This usually occurs when a header file includes a declaration for a function that was never actually implemented or it was removed from a library without updating the header file. To fix this, you can either edit the SWIG input file to remove the offending declaration or you can use the %ignore directive to ignore the declaration. Better yet, update the header file so that it doesn't have an undefined declaration.

    Finally, suppose that your extension module is linked with another library like this:

    $ gcc -shared example.o example_wrap.o -L/home/beazley/projects/lib -lfoo \
          -o example.so
    

    If the foo library is compiled as a shared library, you might get the following error when you try to use your module:

    use example;
    Can't load './example.so' for module example: libfoo.so: cannot open shared object file: 
    No such file or directory at /usr/lib/perl/5.14/i386-linux/DynaLoader.pm line 169.
    
     at - line 1
    BEGIN failed--compilation aborted at - line 1.
    >>>                 
    

    This error is generated because the dynamic linker can't locate the libfoo.so library. When shared libraries are loaded, the system normally only checks a few standard locations such as /usr/lib and /usr/local/lib. To get the loader to look in other locations, there are several things you can do. First, you can recompile your extension module with extra path information. For example, on Linux you can do this:

    $ gcc -shared example.o example_wrap.o -L/home/beazley/projects/lib -lfoo \
          -Xlinker -rpath /home/beazley/projects/lib \
          -o example.so
    

    Alternatively, you can set the LD_LIBRARY_PATH environment variable to include the directory with your shared libraries. If setting LD_LIBRARY_PATH, be aware that setting this variable can introduce a noticeable performance impact on all other applications that you run. To set it only for Perl, you might want to do this instead:

    $ env LD_LIBRARY_PATH=/home/beazley/projects/lib perl
    

    Finally, you can use a command such as ldconfig (Linux) or crle (Solaris) to add additional search paths to the default system configuration (this requires root access and you will need to read the man pages).

    30.2.6 Compilation problems and compiling with C++

    Compilation of C++ extensions has traditionally been a tricky problem. Since the Perl interpreter is written in C, you need to take steps to make sure C++ is properly initialized and that modules are compiled correctly.

    On most machines, C++ extension modules should be linked using the C++ compiler. For example:

    $ swig -c++ -perl example.i
    $ g++ -fPIC -c example.cxx
    $ g++ -fPIC -c example_wrap.cxx -I/usr/lib/perl/5.14/i386-linux/CORE
    $ g++ -shared example.o example_wrap.o -o example.so
    

    In addition to this, you may need to include additional library files to make it work. For example, if you are using the Sun C++ compiler on Solaris, you often need to add an extra library -lCrun like this:

    $ swig -c++ -perl example.i
    $ CC -Kpic -c example.cxx
    $ CC -Kpic -c example_wrap.cxx -I/usr/lib/perl/5.14/i386-linux/CORE
    $ CC -shared example.o example_wrap.o -o example.so -lCrun
    

    Of course, the names of the extra libraries are completely non-portable---you will probably need to do some experimentation.

    Another possible compile problem comes from recent versions of Perl (5.8.0) and the GNU tools. If you see errors having to do with _crypt_struct, that means _GNU_SOURCE is not defined and it needs to be. So you should compile the wrapper like:

    $ g++ -fPIC -c example_wrap.cxx -I/usr/lib/perl/5.8.0/CORE -D_GNU_SOURCE
    

    -D_GNU_SOURCE is also included in the Perl ccflags, which can be found by running

    $ perl -e 'use Config; print "$Config{ccflags}\n";'
    

    So you could also compile the wrapper like

    $ g++ -fPIC -c example_wrap.cxx -I/usr/lib/perl/5.8.0/CORE \
    `perl -MConfig -e 'print $Config{ccflags}'`
    

    Sometimes people have suggested that it is necessary to relink the Perl interpreter using the C++ compiler to make C++ extension modules work. In the experience of this author, this has never actually appeared to be necessary on most platforms. Relinking the interpreter with C++ really only includes the special run-time libraries described above---as long as you link your extension modules with these libraries, it should not be necessary to rebuild Perl.

    If you aren't entirely sure about the linking of a C++ extension, you might look at an existing C++ program. On many Unix machines, the ldd command will list library dependencies. This should give you some clues about what you might have to include when you link your extension module. For example, notice the first line of output here:

    $ ldd swig
            libstdc++-libc6.1-1.so.2 => /usr/lib/libstdc++-libc6.1-1.so.2 (0x40019000)
            libm.so.6 => /lib/libm.so.6 (0x4005b000)
            libc.so.6 => /lib/libc.so.6 (0x40077000)
            /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
    $
    

    If linking wasn't enough of a problem, another major complication of C++ is that it does not define any sort of standard for binary linking of libraries. This means that C++ code compiled by different compilers will not link together properly as libraries nor is the memory layout of classes and data structures implemented in any kind of portable manner. In a monolithic C++ program, this problem may be unnoticed. However, in Perl, it is possible for different extension modules to be compiled with different C++ compilers. As long as these modules are self-contained, this probably won't matter. However, if these modules start sharing data, you will need to take steps to avoid segmentation faults and other erratic program behavior. Also, be aware that certain C++ features, especially RTTI, can behave strangely when working with multiple modules.

    It should be noted that you may get a lot of error messages about the 'bool' datatype when compiling a C++ Perl module. If you experience this problem, you can try the following:

    • Use -DHAS_BOOL when compiling the SWIG wrapper code
    • Or use -Dbool=char when compiling.

    Finally, recent versions of Perl (5.8.0) have namespace conflict problems. Perl defines a bunch of short macros to make the Perl API function names shorter. For example, in /usr/lib/perl/5.8.0/CORE/embed.h there is a line:

    #define do_open Perl_do_open
    

    The problem is, in the <iostream> header from GNU libstdc++v3 there is a private function named do_open. If <iostream> is included after the perl headers, then the Perl macro causes the iostream do_open to be renamed, which causes compile errors. Hopefully in the future Perl will support a PERL_NO_SHORT_NAMES flag, but for now the only solution is to undef the macros that conflict. Lib/perl5/noembed.h in the SWIG source has a list of macros that are known to conflict with either standard headers or other headers. But if you get macro type conflicts from other macros not included in Lib/perl5/noembed.h while compiling the wrapper, you will have to find the macro that conflicts and add an #undef into the .i file. Please report any conflicting macros you find to swig-user mailing list.

    30.2.7 Compiling for 64-bit platforms

    On platforms that support 64-bit applications (Solaris, Irix, etc.), special care is required when building extension modules. On these machines, 64-bit applications are compiled and linked using a different set of compiler/linker options. In addition, it is not generally possible to mix 32-bit and 64-bit code together in the same application.

    To utilize 64-bits, the Perl executable will need to be recompiled as a 64-bit application. In addition, all libraries, wrapper code, and every other part of your application will need to be compiled for 64-bits. If you plan to use other third-party extension modules, they will also have to be recompiled as 64-bit extensions.

    If you are wrapping commercial software for which you have no source code, you will be forced to use the same linking standard as used by that software. This may prevent the use of 64-bit extensions. It may also introduce problems on platforms that support more than one linking standard (e.g., -o32 and -n32 on Irix).

    30.3 Building Perl Extensions under Windows

    Building a SWIG extension to Perl under Windows is roughly similar to the process used with Unix. Normally, you will want to produce a DLL that can be loaded into the Perl interpreter. This section assumes you are using SWIG with Microsoft Visual C++ although the procedure may be similar with other compilers.

    30.3.1 Running SWIG from Developer Studio

    If you are developing your application within Microsoft developer studio, SWIG can be invoked as a custom build option. The process roughly requires these steps:

    • Open up a new workspace and use the AppWizard to select a DLL project.
    • Add both the SWIG interface file (the .i file), any supporting C files, and the name of the wrapper file that will be created by SWIG (ie. example_wrap.c). Note: If using C++, choose a different suffix for the wrapper file such as example_wrap.cxx. Don't worry if the wrapper file doesn't exist yet--Developer studio will keep a reference to it around.
    • Select the SWIG interface file and go to the settings menu. Under settings, select the "Custom Build" option.
    • Enter "SWIG" in the description field.
    • Enter "swig -perl5 -o $(ProjDir)\$(InputName)_wrap.cxx $(InputPath)" in the "Build command(s) field"
    • Enter "$(ProjDir)\$(InputName)_wrap.cxx" in the "Output files(s) field".
    • Next, select the settings for the entire project and go to "C++:Preprocessor". Add the include directories for your Perl 5 installation under "Additional include directories".
    • Define the symbols WIN32 and MSWIN32 under preprocessor options. If using the ActiveWare port, also define the symbol PERL_OBJECT. Note that all extensions to the ActiveWare port must be compiled with the C++ compiler since Perl has been encapsulated in a C++ class.
    • Finally, select the settings for the entire project and go to "Link Options". Add the Perl library file to your link libraries. For example "perl.lib". Also, set the name of the output file to match the name of your Perl module (ie. example.dll).
    • Build your project.

    Now, assuming you made it this far, SWIG will be automatically invoked when you build your project. Any changes made to the interface file will result in SWIG being automatically invoked to produce a new version of the wrapper file. To run your new Perl extension, simply run Perl and use the use command as normal. For example:

    DOS > perl
    use example;
    $a = example::fact(4);
    print "$a\n";
    
    

    30.3.2 Using other compilers

    SWIG is known to work with Cygwin and may work with other compilers on Windows. For general hints and suggestions refer to the Windows chapter.

    30.4 The low-level interface

    At its core, the Perl module uses a simple low-level interface to C function, variables, constants, and classes. This low-level interface can be used to control your application. However, it is also used to construct more user-friendly proxy classes as described in the next section.

    30.4.1 Functions

    C functions are converted into new Perl built-in commands (or subroutines). For example:

    %module example
    int fact(int a);
    ...
    

    Now, in Perl:

    use example;
    $a = &example::fact(2);
    

    30.4.2 Global variables

    Global variables are handled using Perl's magic variable mechanism. SWIG generates a pair of functions that intercept read/write operations and attaches them to a Perl variable with the same name as the C global variable. Thus, an interface like this

    %module example;
    ...
    double Spam;
    ...
    

    is accessed as follows:

    use example;
    print $example::Spam, "\n";
    $example::Spam = $example::Spam + 4
    # ... etc ...
    
    

    If a variable is declared as const, it is wrapped as a read-only variable. Attempts to modify its value will result in an error.

    To make ordinary variables read-only, you can also use the %immutable directive. For example:

    %{
    extern char *path;
    %}
    %immutable;
    extern char *path;
    %mutable;
    

    The %immutable directive stays in effect until it is explicitly disabled or cleared using %mutable. See the Creating read-only variables section for further details.

    It is also possible to tag a specific variable as read-only like this:

    %{
    extern char *path;
    %}
    %immutable path; 
    ...
    ...
    extern char *path;       // Declared later in the input
    

    30.4.3 Constants

    By default, constants are wrapped as read-only Perl variables. For example:

    %module example
    
    #define FOO 42
    

    In Perl:

    use example;
    print $example::FOO, "\n";   # OK
    $example::FOO = 2;           # Error
    

    Alternatively, if you use swig's -const option, constants are wrapped such that the leading $ isn't required (by using a constant subroutine), which usually gives a more natural Perl interface, for example:

    use example;
    print example::FOO, "\n";
    

    30.4.4 Pointers

    SWIG represents pointers as blessed references. A blessed reference is the same as a Perl reference except that it has additional information attached to it indicating what kind of reference it is. That is, if you have a C declaration like this:

    Matrix *new_Matrix(int n, int m);
    

    The module returns a value generated as follows:

    $ptr = new_Matrix(int n, int m);     # Save pointer return result
    bless $ptr, "p_Matrix";              # Bless it as a pointer to Matrix
    

    SWIG uses the "blessing" to check the datatype of various pointers. In the event of a mismatch, an error or warning message is generated.

    To check to see if a value is the NULL pointer, use the defined() command:

    if (defined($ptr)) {
      print "Not a NULL pointer.";
    } else {
      print "Is a NULL pointer.";
    }
    
    

    To create a NULL pointer, you should pass the undef value to a function.

    The "value" of a Perl reference is not the same as the underlying C pointer that SWIG wrapper functions return. Suppose that $a and $b are two references that point to the same C object. In general, $a and $b will be different--since they are different references. Thus, it is a mistake to check the equality of $a and $b to check the equality of two C pointers. The correct method to check equality of C pointers is to dereference them as follows:

    if ($$a == $$b) {
      print "a and b point to the same thing in C";
    } else {
      print "a and b point to different objects.";
    }
    
    

    As much as you might be inclined to modify a pointer value directly from Perl, don't. Manipulating pointer values is architecture dependent and could cause your program to crash. Similarly, don't try to manually cast a pointer to a new type by reblessing a pointer. This may not work like you expect and it is particularly dangerous when casting C++ objects. If you need to cast a pointer or change its value, consider writing some helper functions instead. For example:

    %inline %{
    /* C-style cast */
    Bar *FooToBar(Foo *f) {
      return (Bar *) f;
    }
    
    /* C++-style cast */
    Foo *BarToFoo(Bar *b) {
      return dynamic_cast<Foo*>(b);
    }
    
    Foo *IncrFoo(Foo *f, int i) {
      return f+i;
    }
    %}
    

    Also, if working with C++, you should always try to use the new C++ style casts. For example, in the above code, the C-style cast may return a bogus result whereas as the C++-style cast will return NULL if the conversion can't be performed.

    Compatibility Note: In earlier versions, SWIG tried to preserve the same pointer naming conventions as XS and xsubpp. Given the advancement of the SWIG typesystem and the growing differences between SWIG and XS, this is no longer supported.

    30.4.5 Structures

    Access to the contents of a structure are provided through a set of low-level accessor functions as described in the "SWIG Basics" chapter. For example,

    struct Vector {
      double x, y, z;
    };
    

    gets mapped into the following collection of accessor functions:

    struct Vector *new_Vector();
    void           delete_Vector(Vector *v);
    double         Vector_x_get(Vector *obj)
    void           Vector_x_set(Vector *obj, double x)
    double         Vector_y_get(Vector *obj)
    void           Vector_y_set(Vector *obj, double y)
    double         Vector_z_get(Vector *obj)
    void           Vector_z_set(Vector *obj, double z)
    
    

    These functions are then used to access structure data from Perl as follows:

    $v = example::new_Vector();
    print example::Vector_x_get($v), "\n";   # Get x component
    example::Vector_x_set($v, 7.8);          # Change x component
    

    Similar access is provided for unions and the data members of C++ classes.

    const members of a structure are read-only. Data members can also be forced to be read-only using the %immutable directive. For example:

    struct Foo {
      ...
      %immutable;
      int x;        /* Read-only members */
      char *name;
      %mutable;
      ...
    };
    

    When char * members of a structure are wrapped, the contents are assumed to be dynamically allocated using malloc or new (depending on whether or not SWIG is run with the -c++ option). When the structure member is set, the old contents will be released and a new value created. If this is not the behavior you want, you will have to use a typemap (described later).

    Array members are normally wrapped as read-only. For example,

    struct Foo {
      int x[50];
    };
    

    produces a single accessor function like this:

    int *Foo_x_get(Foo *self) {
      return self->x;
    };
    

    If you want to set an array member, you will need to supply a "memberin" typemap described later in this chapter. As a special case, SWIG does generate code to set array members of type char (allowing you to store a Python string in the structure).

    When structure members are wrapped, they are handled as pointers. For example,

    struct Foo {
      ...
    };
    
    struct Bar {
      Foo f;
    };
    

    generates accessor functions such as this:

    Foo *Bar_f_get(Bar *b) {
      return &b->f;
    }
    
    void Bar_f_set(Bar *b, Foo *val) {
      b->f = *val;
    }
    

    30.4.6 C++ classes

    C++ classes are wrapped by building a set of low level accessor functions. Consider the following class:

    class List {
    public:
      List();
      ~List();
      int  search(char *item);
      void insert(char *item);
      void remove(char *item);
      char *get(int n);
      int  length;
    static void print(List *l);
    };
    

    When wrapped by SWIG, the following functions are created:

    List    *new_List();
    void     delete_List(List *l);
    int      List_search(List *l, char *item);
    void     List_insert(List *l, char *item);
    void     List_remove(List *l, char *item);
    char    *List_get(List *l, int n);
    int      List_length_get(List *l);
    void     List_length_set(List *l, int n);
    void     List_print(List *l);
    
    

    In Perl, these functions are used in a straightforward manner:

    use example;
    $l = example::new_List();
    example::List_insert($l, "Ale");
    example::List_insert($l, "Stout");
    example::List_insert($l, "Lager")
    example::List_print($l)
    Lager
    Stout
    Ale
    print example::List_length_get($l), "\n";
    3
    

    At this low level, C++ objects are really just typed pointers. Member functions are accessed by calling a C-like wrapper with an instance pointer as the first argument. Although this interface is fairly primitive, it provides direct access to C++ objects. A higher level interface using Perl proxy classes can be built using these low-level accessors. This is described shortly.

    30.4.7 C++ classes and type-checking

    The SWIG type-checker is fully aware of C++ inheritance. Therefore, if you have classes like this

    class Foo {
    ...
    };
    
    class Bar : public Foo {
    ...
    };
    

    and a function

    void spam(Foo *f);
    

    then the function spam() accepts Foo * or a pointer to any class derived from Foo. If necessary, the type-checker also adjusts the value of the pointer (as is necessary when multiple inheritance is used).

    30.4.8 C++ overloaded functions

    If you have a C++ program with overloaded functions or methods, you will need to disambiguate those methods using %rename. For example:

    /* Forward renaming declarations */
    %rename(foo_i) foo(int); 
    %rename(foo_d) foo(double);
    ...
    void foo(int);           // Becomes 'foo_i'
    void foo(char *c);       // Stays 'foo' (not renamed)
    
    class Spam {
    public:
      void foo(int);      // Becomes 'foo_i'
      void foo(double);   // Becomes 'foo_d'
      ...
    };
    

    Now, in Perl, the methods are accessed as follows:

    use example;
    example::foo_i(3);
    $s = example::new_Spam();
    example::Spam_foo_i($s, 3);
    example::Spam_foo_d($s, 3.14);
    

    Please refer to the "SWIG Basics" chapter for more information.

    30.4.9 Operators

    As of version 1.3.27 SWIG automatically renames the most common C++ operators, and maps them into the perl module with the proper 'use overload ...' so you don't need to do any work.

    The following C++ operators are currently supported by the Perl module:

    • operator++
    • operator--
    • operator+
    • operator-
    • operator*
    • operator/
    • operator==
    • operator!=
    • operator%
    • operator>
    • operator<
    • operator and
    • operator or

    30.4.10 Modules and packages

    When you create a SWIG extension, everything gets placed into a single Perl module. The name of the module is determined by the %module directive. To use the module, do the following:

    $ perl5
    use example;                      # load the example module
    print example::fact(4), "\n"      # Call a function in it
    24
    

    Usually, a module consists of a collection of code that is contained within a single file. A package, on the other hand, is the Perl equivalent of a namespace. A package is a lot like a module, except that it is independent of files. Any number of files may be part of the same package--or a package may be broken up into a collection of modules if you prefer to think about it in this way.

    SWIG installs its functions into a package with the same name as the module.

    Incompatible Change: previous versions of SWIG enabled you to change the name of the package by using the -package option, this feature has been removed in order to properly support modules that used nested namespaces, e.g. Foo::Bar::Baz. To give your module a nested namespace simply provide the fully qualified name in your %module directive:

    %module "Foo::Bar::Baz"
    

    NOTE: the double quotes are necessary.

    Using the package option of the %module directive allows you to specify what Perl namespace that the module will be living in when installed. This is useful in the situation where a module maintainer wants to split a large module into smaller pieces to make maintenance easier, but doesn't want to have that affect the module name used by applications. So for example, if I wanted to split XML::Xerces into XML::Xerces::SAX, etc. , but I wanted all the applications to be able to access the classes using the XML::Xerces namespace I could use:

    %module(package="XML::Xerces") "XML::Xerces::SAX
    

    And now all the applications could use the class XML::Xerces::SAXParser. Without the package directive splitting the module would force applications to use the class XML::Xerces::SAX::SAXParser. This could break compatibility for existing applications that are already using the class under the name XML::Xerces::SAXParser.

    30.5 Input and output parameters

    A common problem in some C programs is handling parameters passed as simple pointers. For example:

    void add(int x, int y, int *result) {
      *result = x + y;
    }
    

    or perhaps

    int sub(int *x, int *y) {
      return *x+*y;
    }
    

    The easiest way to handle these situations is to use the typemaps.i file. For example:

    %module example
    %include "typemaps.i"
    
    void add(int, int, int *OUTPUT);
    int  sub(int *INPUT, int *INPUT);
    

    In Perl, this allows you to pass simple values. For example:

    $a = example::add(3, 4);
    print "$a\n";
    7
    $b = example::sub(7, 4);
    print "$b\n";
    3
    

    Notice how the INPUT parameters allow integer values to be passed instead of pointers and how the OUTPUT parameter creates a return result.

    If you don't want to use the names INPUT or OUTPUT, use the %apply directive. For example:

    %module example
    %include "typemaps.i"
    
    %apply int *OUTPUT { int *result };
    %apply int *INPUT  { int *x, int *y};
    
    void add(int x, int y, int *result);
    int  sub(int *x, int *y);
    

    If a function mutates one of its parameters like this,

    void negate(int *x) {
      *x = -(*x);
    }
    

    you can use INOUT like this:

    %include "typemaps.i"
    ...
    void negate(int *INOUT);
    

    In Perl, a mutated parameter shows up as a return value. For example:

    $a = example::negate(3);
    print "$a\n";
    -3
    

    The most common use of these special typemap rules is to handle functions that return more than one value. For example, sometimes a function returns a result as well as a special error code:

    /* send message, return number of bytes sent, along with success code */
    int send_message(char *text, int len, int *success);
    

    To wrap such a function, simply use the OUTPUT rule above. For example:

    %module example
    %include "typemaps.i"
    %apply int *OUTPUT { int *success };
    ...
    int send_message(char *text, int *success);
    

    When used in Perl, the function will return multiple values.

    ($bytes, $success) = example::send_message("Hello World");
    

    Another common use of multiple return values are in query functions. For example:

    void get_dimensions(Matrix *m, int *rows, int *columns);
    

    To wrap this, you might use the following:

    %module example
    %include "typemaps.i"
    %apply int *OUTPUT { int *rows, int *columns };
    ...
    void get_dimensions(Matrix *m, int *rows, *columns);
    

    Now, in Perl:

    ($r, $c) = example::get_dimensions($m);
    

    In certain cases, it is possible to treat Perl references as C pointers. To do this, use the REFERENCE typemap. For example:

    %module example
    %include "typemaps.i"
    
    void add(int x, int y, int *REFERENCE);
    

    In Perl:

    use example;
    $c = 0.0;
    example::add(3, 4, \$c);
    print "$c\n";
    7
    

    Note: The REFERENCE feature is only currently supported for numeric types (integers and floating point).

    30.6 Exception handling

    The SWIG %exception directive can be used to create a user-definable exception handler for converting exceptions in your C/C++ program into Perl exceptions. The chapter on customization features contains more details, but suppose you have a C++ class like the following:

    class RangeError {};   // Used for an exception
    
    class DoubleArray {
      private:
        int n;
        double *ptr;
      public:
        // Create a new array of fixed size
        DoubleArray(int size) {
          ptr = new double[size];
          n = size;
        }
        // Destroy an array
        ~DoubleArray() {
          delete ptr;
        }
        // Return the length of the array
        int   length() {
          return n;
        }
    
        // Get an item from the array and perform bounds checking.
        double getitem(int i) {
          if ((i >= 0) && (i < n))
            return ptr[i];
          else
            throw RangeError();
        }
    
        // Set an item in the array and perform bounds checking.
        void setitem(int i, double val) {
          if ((i >= 0) && (i < n))
            ptr[i] = val;
          else
            throw RangeError();
        }
      };
    

    Since several methods in this class can throw an exception for an out-of-bounds access, you might want to catch this in the Perl extension by writing the following in an interface file:

    %exception {
      try {
        $action
      }
      catch (RangeError) {
        croak("Array index out-of-bounds");
      }
    }
    
    class DoubleArray {
    ...
    };
    

    The exception handling code is inserted directly into generated wrapper functions. The $action variable is replaced with the C/C++ code being executed by the wrapper. When an exception handler is defined, errors can be caught and used to gracefully generate a Perl error instead of forcing the entire program to terminate with an uncaught error.

    As shown, the exception handling code will be added to every wrapper function. Since this is somewhat inefficient. You might consider refining the exception handler to only apply to specific methods like this:

    %exception getitem {
      try {
        $action
      }
      catch (RangeError) {
        croak("Array index out-of-bounds");
      }
    }
    
    %exception setitem {
      try {
        $action
      }
      catch (RangeError) {
        croak("Array index out-of-bounds");
      }
    }
    

    In this case, the exception handler is only attached to methods and functions named getitem and setitem.

    If you had a lot of different methods, you can avoid extra typing by using a macro. For example:

    %define RANGE_ERROR
    {
      try {
        $action
      }
      catch (RangeError) {
        croak("Array index out-of-bounds");
      }
    }
    %enddef
    
    %exception getitem RANGE_ERROR;
    %exception setitem RANGE_ERROR;
    

    Since SWIG's exception handling is user-definable, you are not limited to C++ exception handling. See the chapter on "Customization features" for more examples.

    Compatibility note: In SWIG1.1, exceptions were defined using the older %except directive:

    %except(python) {
      try {
        $function
      }
      catch (RangeError) {
        croak("Array index out-of-bounds");
      }
    }
    

    This is still supported, but it is deprecated. The newer %exception directive provides the same functionality, but it has additional capabilities that make it more powerful.

    30.7 Remapping datatypes with typemaps

    This section describes how you can modify SWIG's default wrapping behavior for various C/C++ datatypes using the %typemap directive. This is an advanced topic that assumes familiarity with the Perl C API as well as the material in the "Typemaps" chapter.

    Before proceeding, it should be stressed that typemaps are not a required part of using SWIG---the default wrapping behavior is enough in most cases. Typemaps are only used if you want to change some aspect of the primitive C-Perl interface.

    30.7.1 A simple typemap example

    A typemap is nothing more than a code generation rule that is attached to a specific C datatype. For example, to convert integers from Perl to C, you might define a typemap like this:

    %module example
    
    %typemap(in) int {
      $1 = (int) SvIV($input);
      printf("Received an integer : %d\n", $1);
    }
    ...
    %inline %{
    extern int fact(int n);
    %}
    
    

    Typemaps are always associated with some specific aspect of code generation. In this case, the "in" method refers to the conversion of input arguments to C/C++. The datatype int is the datatype to which the typemap will be applied. The supplied C code is used to convert values. In this code a number of special variable prefaced by a $ are used. The $1 variable is placeholder for a local variable of type int. The $input variable is the input object (usually a SV *).

    When this example is used in Perl5, it will operate as follows:

    use example;
    $n = example::fact(6);
    print "$n\n";
    ...
    
    Output:
    Received an integer : 6
    720
    

    The application of a typemap to specific datatypes and argument names involves more than simple text-matching--typemaps are fully integrated into the SWIG type-system. When you define a typemap for int, that typemap applies to int and qualified variations such as const int. In addition, the typemap system follows typedef declarations. For example:

    %typemap(in) int n {
      $1 = (int) SvIV($input);
      printf("n = %d\n", $1);
    }
    %inline %{
    typedef int Integer;
    extern int fact(Integer n);    // Above typemap is applied
    %}
    

    It should be noted that the matching of typedef only occurs in one direction. If you defined a typemap for Integer, it is not applied to arguments of type int.

    Typemaps can also be defined for groups of consecutive arguments. For example:

    %typemap(in) (char *str, unsigned len) {
        $1 = SvPV($input, $2);
    };
    
    int count(char c, char *str, unsigned len);
    

    When a multi-argument typemap is defined, the arguments are always handled as a single Perl object. This allows the function to be used like this (notice how the length parameter is omitted):

    example::count("e", "Hello World");
    1
    >>>
    

    30.7.2 Perl5 typemaps

    The previous section illustrated an "in" typemap for converting Perl objects to C. A variety of different typemap methods are defined by the Perl module. For example, to convert a C integer back into a Perl object, you might define an "out" typemap like this:

    %typemap(out) int {
      $result = sv_newmortal();
      sv_setiv($result, (IV) $1);
      argvi++;
    }
    

    The following typemap methods are available:

    %typemap(in)

    Converts Perl5 object to input function arguments.

    %typemap(out)

    Converts function return value to a Perl5 value.

    %typemap(varin)

    Converts a Perl5 object to a global variable.

    %typemap(varout)

    Converts a global variable to a Perl5 object.

    %typemap(freearg)

    Cleans up a function argument after a function call

    %typemap(argout)

    Output argument handling

    %typemap(ret)

    Clean up return value from a function.

    %typemap(memberin)

    Setting of C++ member data (all languages).

    %typemap(memberout)

    Return of C++ member data (all languages).

    %typemap(check)

    Check value of input parameter.

    30.7.3 Typemap variables

    Within typemap code, a number of special variables prefaced with a $ may appear. A full list of variables can be found in the "Typemaps" chapter. This is a list of the most common variables:

    $1

    A C local variable corresponding to the actual type specified in the %typemap directive. For input values, this is a C local variable that's supposed to hold an argument value. For output values, this is the raw result that's supposed to be returned to Perl.

    $input

    A Perl object holding the value of an argument of variable value.

    $result

    A Perl object that holds the result to be returned to Perl.

    $1_name

    The parameter name that was matched.

    $1_type

    The actual C datatype matched by the typemap.

    $1_ltype

    An assignable version of the datatype matched by the typemap (a type that can appear on the left-hand-side of a C assignment operation). This type is stripped of qualifiers and may be an altered version of $1_type. All arguments and local variables in wrapper functions are declared using this type so that their values can be properly assigned.

    $symname

    The Perl name of the wrapper function being created.

    30.7.4 Useful functions

    When writing typemaps, it is necessary to work directly with Perl5 objects. This, unfortunately, can be a daunting task. Consult the "perlguts" man-page for all of the really ugly details. A short summary of commonly used functions is provided here for reference. It should be stressed that SWIG can be used quite effectively without knowing any of these details--especially now that there are typemap libraries that can already been written.

    Perl Integer Functions

    int   SvIV(SV *);
    void  sv_setiv(SV *sv, IV value);
    SV   *newSViv(IV value);
    int   SvIOK(SV *);
    

    Perl Floating Point Functions

    double SvNV(SV *);
    void   sv_setnv(SV *, double value);
    SV    *newSVnv(double value);
    int    SvNOK(SV *);
    

    Perl String Functions

    char     *SvPV(SV *, STRLEN len);
    void      sv_setpv(SV *, char *val);
    void      sv_setpvn(SV *, char *val, STRLEN len);
    SV       *newSVpv(char *value, STRLEN len);
    int       SvPOK(SV *);
    void      sv_catpv(SV *, char *);
    void      sv_catpvn(SV *, char *, STRLEN);
    

    Perl References

    void      sv_setref_pv(SV *, char *, void *ptr);
    int       sv_isobject(SV *);
    SV       *SvRV(SV *);
    int       sv_isa(SV *, char *0;
    

    30.8 Typemap Examples

    This section includes a few examples of typemaps. For more examples, you might look at the files "perl5.swg" and "typemaps.i" in the SWIG library.

    30.8.1 Converting a Perl5 array to a char **

    A common problem in many C programs is the processing of command line arguments, which are usually passed in an array of NULL terminated strings. The following SWIG interface file allows a Perl5 array reference to be used as a char ** datatype.

    %module argv
    
    // This tells SWIG to treat char ** as a special case
    %typemap(in) char ** {
      AV *tempav;
      I32 len;
      int i;
      SV  **tv;
      if (!SvROK($input))
        croak("Argument $argnum is not a reference.");
      if (SvTYPE(SvRV($input)) != SVt_PVAV)
        croak("Argument $argnum is not an array.");
      tempav = (AV*)SvRV($input);
      len = av_len(tempav);
      $1 = (char **) malloc((len+2)*sizeof(char *));
      for (i = 0; i <= len; i++) {
        tv = av_fetch(tempav, i, 0);
        $1[i] = (char *) SvPV(*tv, PL_na);
      }
      $1[i] = NULL;
    };
    
    // This cleans up the char ** array after the function call
    %typemap(freearg) char ** {
      free($1);
    }
    
    // Creates a new Perl array and places a NULL-terminated char ** into it
    %typemap(out) char ** {
      AV *myav;
      SV **svs;
      int i = 0, len = 0;
      /* Figure out how many elements we have */
      while ($1[len])
        len++;
      svs = (SV **) malloc(len*sizeof(SV *));
      for (i = 0; i < len ; i++) {
        svs[i] = sv_newmortal();
        sv_setpv((SV*)svs[i], $1[i]);
      };
      myav = av_make(len, svs);
      free(svs);
      $result = newRV_noinc((SV*)myav);
      sv_2mortal($result);
      argvi++;
    }
    
    // Now a few test functions
    %inline %{
      int print_args(char **argv) {
        int i = 0;
        while (argv[i]) {
          printf("argv[%d] = %s\n", i, argv[i]);
          i++;
        }
        return i;
      }
    
      // Returns a char ** list
      char **get_args() {
        static char *values[] = { "Dave", "Mike", "Susan", "John", "Michelle", 0};
        return &values[0];
      }
    %}
    
    

    When this module is compiled, the wrapped C functions can be used in a Perl script as follows:

    use argv;
    @a = ("Dave", "Mike", "John", "Mary");           # Create an array of strings
    argv::print_args(\@a);                           # Pass it to our C function
    $b = argv::get_args();                           # Get array of strings from C
    print @$b, "\n";                                 # Print it out
    

    30.8.2 Return values

    Return values are placed on the argument stack of each wrapper function. The current value of the argument stack pointer is contained in a variable argvi. Whenever a new output value is added, it is critical that this value be incremented. For multiple output values, the final value of argvi should be the total number of output values.

    The total number of return values should not exceed the number of input values unless you explicitly extend the argument stack. This can be done using the EXTEND() macro as in:

    %typemap(argout) int *OUTPUT {
      if (argvi >= items) {
        EXTEND(sp, 1);              /* Extend the stack by 1 object */
      }
      $result = sv_newmortal();
      sv_setiv($target, (IV) *($1));
      argvi++;
    }
    

    30.8.3 Returning values from arguments

    Sometimes it is desirable for a function to return a value in one of its arguments. This example describes the implementation of the OUTPUT typemap.

    %module return
    
    // This tells SWIG to treat an double * argument with name 'OutDouble' as
    // an output value.  
    
    %typemap(argout) double *OUTPUT {
      $result = sv_newmortal();
      sv_setnv($result, *$input);
      argvi++;                     /* Increment return count -- important! */
    }
    
    // We don't care what the input value is. Ignore, but set to a temporary variable
    
    %typemap(in, numinputs=0) double *OUTPUT(double junk) {
      $1 = &junk;
    }
    
    // Now a function to test it
    %{
    /* Returns the first two input arguments */
    int multout(double a, double b, double *out1, double *out2) {
      *out1 = a;
      *out2 = b;
      return 0;
    };
    %}
    
    // If we name both parameters OutDouble both will be output
    
    int multout(double a, double b, double *OUTPUT, double *OUTPUT);
    ...
    

    When this function is called, the output arguments are appended to the stack used to return results. This shows up an array in Perl. For example:

    @r = multout(7, 13);
    print "multout(7, 13) = @r\n";
    ($x, $y) = multout(7, 13);
    

    30.8.4 Accessing array structure members

    Consider the following data structure:

    #define SIZE  8
    typedef struct {
      int   values[SIZE];
      ...
    } Foo;
    
    

    By default, SWIG doesn't know how to the handle the values structure member it's an array, not a pointer. In this case, SWIG makes the array member read-only. Reading will simply return a pointer to the first item in the array. To make the member writable, a "memberin" typemap can be used.

    %typemap(memberin) int [SIZE] {
      int i;
      for (i = 0; i < SIZE; i++) {
        $1[i] = $input[i];
      }
    }
    
    

    Whenever a int [SIZE] member is encountered in a structure or class, this typemap provides a safe mechanism for setting its value.

    As in the previous example, the typemap can be generalized for any dimension. For example:

    %typemap(memberin) int [ANY] {
      int i;
      for (i = 0; i < $1_dim0; i++) {
        $1[i] = $input[i];
      }
    }
    

    When setting structure members, the input object is always assumed to be a C array of values that have already been converted from the target language. Because of this, the memberin typemap is almost always combined with the use of an "in" typemap. For example, the "in" typemap in the previous section would be used to convert an int[] array to C whereas the "memberin" typemap would be used to copy the converted array into a C data structure.

    30.8.5 Turning Perl references into C pointers

    A frequent confusion on the SWIG mailing list is errors caused by the mixing of Perl references and C pointers. For example, suppose you have a C function that modifies its arguments like this:

    void add(double a, double b, double *c) {
      *c = a + b;
    }
    

    A common misinterpretation of this function is the following Perl script:

    # Perl script
    $a = 3.5;
    $b = 7.5;
    $c = 0.0;          # Output value
    add($a, $b, \$c);    # Place result in c (Except that it doesn't work)
    

    To make this work with a reference, you can use a typemap such as this:

    %typemap(in) double * (double dvalue) {
      SV* tempsv;
      if (!SvROK($input)) {
        croak("expected a reference\n");
      }
      tempsv = SvRV($input);
      if ((!SvNOK(tempsv)) && (!SvIOK(tempsv))) {
        croak("expected a double reference\n");
      }
      dvalue = SvNV(tempsv);
      $1 = &dvalue;
    }
    
    %typemap(argout) double * {
      SV *tempsv;
      tempsv = SvRV($input);
      sv_setnv(tempsv, *$1);
    }
    

    Now, if you place this before the add function, you can do this:

    $a = 3.5;
    $b = 7.5;
    $c = 0.0;
    add($a, $b, \$c);            # Now it works!
    print "$c\n";
    
    

    30.8.6 Pointer handling

    Occasionally, it might be necessary to convert pointer values that have been stored using the SWIG typed-pointer representation. To convert a pointer from Perl to C, the following function is used:

    int SWIG_ConvertPtr(SV *obj, void **ptr, swig_type_info *ty, int flags)

    Converts a Perl object obj to a C pointer. The result of the conversion is placed into the pointer located at ptr. ty is a SWIG type descriptor structure. flags is used to handle error checking and other aspects of conversion. flags is currently undefined and reserved for future expansion. Returns 0 on success and -1 on error.

    void *SWIG_MakePtr(SV *obj, void *ptr, swig_type_info *ty, int flags)

    Creates a new Perl pointer object. obj is a Perl SV that has been initialized to hold the result, ptr is the pointer to convert, ty is the SWIG type descriptor structure that describes the type, and flags is a flag that controls properties of the conversion. flags is currently undefined and reserved.

    Both of these functions require the use of a special SWIG type-descriptor structure. This structure contains information about the mangled name of the datatype, type-equivalence information, as well as information about converting pointer values under C++ inheritance. For a type of Foo *, the type descriptor structure is usually accessed as follows:

    Foo *f;
    if (!SWIG_IsOK(SWIG_ConvertPtr($input, (void **) &f, SWIGTYPE_p_Foo, 0))) {
      SWIG_exception_fail(SWIG_TypeError, "in method '$symname', expecting type Foo");
    }
    
    SV *sv = sv_newmortal();
    SWIG_MakePtr(sv, f, SWIGTYPE_p_Foo, 0);
    

    In a typemap, the type descriptor should always be accessed using the special typemap variable $1_descriptor. For example:

    %typemap(in) Foo * {
      if (!SWIG_IsOK(SWIG_ConvertPtr($input, (void **) &$1, $1_descriptor, 0))) {
        SWIG_exception_fail(SWIG_TypeError, "in method '$symname', expecting type Foo");
      }
    }
    

    If necessary, the descriptor for any type can be obtained using the $descriptor() macro in a typemap. For example:

    %typemap(in) Foo * {
      if (!SWIG_IsOK(SWIG_ConvertPtr($input, (void **) &$1, $descriptor(Foo *), 0))) {
        SWIG_exception_fail(SWIG_TypeError, "in method '$symname', expecting type Foo");
      }
    }
    

    30.9 Proxy classes

    Out of date. Needs update.

    Using the low-level procedural interface, SWIG can also construct a high-level object oriented interface to C structures and C++ classes. This is done by constructing a Perl proxy class (also known as a shadow class) that provides an OO wrapper to the underlying code. This section describes the implementation details of the proxy interface.

    30.9.1 Preliminaries

    Proxy classes, are generated by default. If you want to turn them off, use the -noproxy command line option. For example:

    $ swig -c++ -perl -noproxy example.i
    

    When proxy classes are used, SWIG moves all of the low-level procedural wrappers to another package name. By default, this package is named 'modulec' where 'module' is the name of the module you provided with the %module directive. Then, in place of the original module, SWIG creates a collection of high-level Perl wrappers. In your scripts, you will use these high level wrappers. The wrappers, in turn, interact with the low-level procedural module.

    30.9.2 Structure and class wrappers

    Suppose you have the following SWIG interface file:

    %module example
    struct Vector {
      Vector(double x, double y, double z);
      ~Vector();
      double x, y, z;
    };
    
    

    When wrapped, SWIG creates the following set of low-level accessor functions as described in previous sections.

    Vector *new_Vector(double x, double y, double z);
    void    delete_Vector(Vector *v);
    double  Vector_x_get(Vector *v);
    double  Vector_x_set(Vector *v, double value);
    double  Vector_y_get(Vector *v);
    double  Vector_y_set(Vector *v, double value);
    double  Vector_z_get(Vector *v);
    double  Vector_z_set(Vector *v, double value);
    
    

    However, when proxy classes are enabled, these accessor functions are wrapped inside a Perl class like this:

    package example::Vector;
    @ISA = qw( example );
    %OWNER = ();
    %BLESSEDMEMBERS = ();
    
    sub new () {
      my $self = shift;
      my @args = @_;
      $self = vectorc::new_Vector(@args);
      return undef if (!defined($self));
      bless $self, "example::Vector";
      $OWNER{$self} = 1;
      my %retval;
      tie %retval, "example::Vector", $self;
      return bless \%retval, "Vector";
    }
    
    sub DESTROY {
      return unless $_[0]->isa('HASH');
      my $self = tied(%{$_[0]});
      delete $ITERATORS{$self};
      if (exists $OWNER{$self}) {
        examplec::delete_Vector($self));
        delete $OWNER{$self};
      }
    }
    
    sub FETCH {
      my ($self, $field) = @_;
      my $member_func = "vectorc::Vector_${field}_get";
      my $val = &$member_func($self);
      if (exists $BLESSEDMEMBERS{$field}) {
        return undef if (!defined($val));
        my %retval;
        tie %retval, $BLESSEDMEMBERS{$field}, $val;
        return bless \%retval, $BLESSEDMEMBERS{$field};
      }
      return $val;
    }
    
    sub STORE {
      my ($self, $field, $newval) = @_;
      my $member_func = "vectorc::Vector_${field}_set";
      if (exists $BLESSEDMEMBERS{$field}) {
        &$member_func($self, tied(%{$newval}));
      } else {
        &$member_func($self, $newval);
      }
    }
    

    Each structure or class is mapped into a Perl package of the same name. The C++ constructors and destructors are mapped into constructors and destructors for the package and are always named "new" and "DESTROY". The constructor always returns a tied hash table. This hash table is used to access the member variables of a structure in addition to being able to invoke member functions. The %OWNER and %BLESSEDMEMBERS hash tables are used internally and described shortly.

    To use our new proxy class we can simply do the following:

    # Perl code using Vector class
    $v = new Vector(2, 3, 4);
    $w = Vector->new(-1, -2, -3);
    
    # Assignment of a single member
    $v->{x} = 7.5;
    
    # Assignment of all members
    %$v = ( x=>3,
            y=>9,
            z=>-2);
    
    # Reading members
    $x = $v->{x};
    
    # Destruction
    $v->DESTROY();
    
    

    30.9.3 Object Ownership

    In order for proxy classes to work properly, it is necessary for Perl to manage some mechanism of object ownership. Here's the crux of the problem---suppose you had a function like this:

    Vector *Vector_get(Vector *v, int index) {
      return &v[i];
    }
    

    This function takes a Vector pointer and returns a pointer to another Vector. Such a function might be used to manage arrays or lists of vectors (in C). Now contrast this function with the constructor for a Vector object:

    Vector *new_Vector(double x, double y, double z) {
      Vector *v;
      v = new Vector(x, y, z);        // Call C++ constructor
      return v;
    }
    

    Both functions return a Vector, but the constructor is returning a brand-new Vector while the other function is returning a Vector that was already created (hopefully). In Perl, both vectors will be indistinguishable---clearly a problem considering that we would probably like the newly created Vector to be destroyed when we are done with it.

    To manage these problems, each class contains two methods that access an internal hash table called %OWNER. This hash keeps a list of all of the objects that Perl knows that it has created. This happens in two cases: (1) when the constructor has been called, and (2) when a function implicitly creates a new object (as is done when SWIG needs to return a complex datatype by value). When the destructor is invoked, the Perl proxy class module checks the %OWNER hash to see if Perl created the object. If so, the C/C++ destructor is invoked. If not, we simply destroy the Perl object and leave the underlying C object alone (under the assumption that someone else must have created it).

    This scheme works remarkably well in practice but it isn't foolproof. In fact, it will fail if you create a new C object in Perl, pass it on to a C function that remembers the object, and then destroy the corresponding Perl object (this situation turns out to come up frequently when constructing objects like linked lists and trees). When C takes possession of an object, you can change Perl's ownership by simply deleting the object from the %OWNER hash. This is done using the DISOWN method.

    # Perl code to change ownership of an object
    $v = new Vector(x, y, z);
    $v->DISOWN();     
    

    To acquire ownership of an object, the ACQUIRE method can be used.

    # Given Perl ownership of a file
    $u = Vector_get($v);
    $u->ACQUIRE();
    
    

    As always, a little care is in order. SWIG does not provide reference counting, garbage collection, or advanced features one might find in sophisticated languages.

    30.9.4 Nested Objects

    Suppose that we have a new object that looks like this:

    struct Particle {
      Vector r;
      Vector v;
      Vector f;
      int type;
    }
    
    

    In this case, the members of the structure are complex objects that have already been encapsulated in a Perl proxy class. To handle these correctly, we use the %BLESSEDMEMBERS hash which would look like this (along with some supporting code):

    package Particle;
    ...
    %BLESSEDMEMBERS = (
            r => `Vector',
            v => `Vector',
            f => `Vector',
    );
    
    

    When fetching members from the structure, %BLESSEDMEMBERS is checked. If the requested field is present, we create a tied-hash table and return it. If not, we just return the corresponding member unmodified.

    This implementation allows us to operate on nested structures as follows:

    # Perl access of nested structure
    $p = new Particle();
    $p->{f}->{x} = 0.0;
    %${$p->{v}} = ( x=>0, y=>0, z=>0);         
    

    30.9.5 Proxy Functions

    When functions take arguments involving a complex object, it is sometimes necessary to write a proxy function. For example:

    double dot_product(Vector *v1, Vector *v2);
    

    Since Vector is an object already wrapped into a proxy class, we need to modify this function to accept arguments that are given in the form of tied hash tables. This is done by creating a Perl function like this:

    sub dot_product {
      my @args = @_;
      $args[0] = tied(%{$args[0]});         # Get the real pointer values
      $args[1] = tied(%{$args[1]});
      my $result = vectorc::dot_product(@args);
      return $result;
    }
    

    This function replaces the original function, but operates in an identical manner.

    30.9.6 Inheritance

    Simple C++ inheritance is handled using the Perl @ISA array in each class package. For example, if you have the following interface file:

    // shapes.i
    // SWIG interface file for shapes class
    %module shapes
    %{
    #include "shapes.h"
    %}
    
    class Shape {
    public:
      virtual double area() = 0;
      virtual double perimeter() = 0;
      void    set_location(double x, double y);
    };
    class Circle : public Shape {
    public:
      Circle(double radius);
      ~Circle();
      double area();
      double perimeter();
    };
    class Square : public Shape {
    public:
      Square(double size);
      ~Square();
      double area();
      double perimeter();
    }
    
    

    The resulting, Perl wrapper class will create the following code:

    Package Shape;
    @ISA = (shapes);
    ...
    Package Circle;
    @ISA = (shapes Shape);
    ...
    Package Square;
    @ISA = (shapes Shape);
    
    

    The @ISA array determines where to look for methods of a particular class. In this case, both the Circle and Square classes inherit functions from Shape so we'll want to look in the Shape base class for them. All classes also inherit from the top-level module shapes. This is because certain common operations needed to implement proxy classes are implemented only once and reused in the wrapper code for various classes and structures.

    Since SWIG proxy classes are implemented in Perl, it is easy to subclass from any SWIG generated class. To do this, simply put the name of a SWIG class in the @ISA array for your new class. However, be forewarned that this is not a trivial problem. In particular, inheritance of data members is extremely tricky (and I'm not even sure if it really works).

    30.9.7 Modifying the proxy methods

    It is possible to override the SWIG generated proxy/shadow methods, using %feature("shadow"). It works like all the other %feature directives. Here is a simple example showing how to add some Perl debug code to the constructor:

    /* Let's make the constructor of the class Square more verbose */
    %feature("shadow") Square(double w)
    %{
      sub new {
        my $pkg = shift;
        my $self = examplec::new_Square(@_);
        print STDERR "Constructed an @{[ref($self)]}\n";
        bless $self, $pkg if defined($self);
      }
    %}
    
    class Square {
    public:
      Square(double w);
      ...
    };
    

    30.10 Adding additional Perl code

    If writing support code in C isn't enough, it is also possible to write code in Perl. This code gets inserted in to the .pm file created by SWIG. One use of Perl code might be to supply a high-level interface to certain functions. For example:

    void set_transform(Image *im, double x[4][4]);
    
    ...
    /* Rewrite the high level interface to set_transform */
    %perlcode %{
    sub set_transform
    {
      my ($im, $x) = @_;
      my $a = new_mat44();
      for (my $i = 0; $i < 4, $i++)
      {
        for (my $j = 0; $j < 4, $j++)
        {
          mat44_set($a, $i, $j, $x->[i][j])
        }
      }
      example.set_transform($im, $a);
      free_mat44($a);
    }
    %}
    

    In this example, set_transform() provides a high-level Perl interface built on top of low-level helper functions. For example, this code now seems to work:

    my $a =
      [[1, 0, 0, 0],
      [0, 1, 0, 0],
      [0, 0, 1, 0],
      [0, 0, 0, 1]];
    set_transform($im, $a);
    

    30.11 Cross language polymorphism

    Proxy classes provide a more natural, object-oriented way to access extension classes. As described above, each proxy instance has an associated C++ instance, and method calls to the proxy are passed to the C++ instance transparently via C wrapper functions.

    This arrangement is asymmetric in the sense that no corresponding mechanism exists to pass method calls down the inheritance chain from C++ to Perl. In particular, if a C++ class has been extended in Perl (by extending the proxy class), these extensions will not be visible from C++ code. Virtual method calls from C++ are thus not able access the lowest implementation in the inheritance chain.

    Changes have been made to SWIG to address this problem and make the relationship between C++ classes and proxy classes more symmetric. To achieve this goal, new classes called directors are introduced at the bottom of the C++ inheritance chain. The job of the directors is to route method calls correctly, either to C++ implementations higher in the inheritance chain or to Perl implementations lower in the inheritance chain. The upshot is that C++ classes can be extended in Perl and from C++ these extensions look exactly like native C++ classes. Neither C++ code nor Perl code needs to know where a particular method is implemented: the combination of proxy classes, director classes, and C wrapper functions takes care of all the cross-language method routing transparently.

    30.11.1 Enabling directors

    The director feature is disabled by default. To use directors you must make two changes to the interface file. First, add the "directors" option to the %module directive, like this:

    %module(directors="1") modulename
    

    Without this option no director code will be generated. Second, you must use the %feature("director") directive to tell SWIG which classes and methods should get directors. The %feature directive can be applied globally, to specific classes, and to specific methods, like this:

    // generate directors for all classes that have virtual methods
    %feature("director");         
    
    // generate directors for the virtual methods in class Foo
    %feature("director") Foo;      
    

    You can use the %feature("nodirector") directive to turn off directors for specific classes or methods. So for example,

    %feature("director") Foo;
    %feature("nodirector") Foo::bar;
    

    will generate directors for the virtual methods of class Foo except bar().

    Directors can also be generated implicitly through inheritance. In the following, class Bar will get a director class that handles the methods one() and two() (but not three()):

    %feature("director") Foo;
    class Foo {
    public:
      Foo(int foo);
      virtual void one();
      virtual void two();
    };
    
    class Bar: public Foo {
    public:
      virtual void three();
    };
    

    then at the Perl side you can define

    use mymodule;
    
    package MyFoo;
    use base 'mymodule::Foo';
    
    sub one {
      print "one from Perl\n";
    }
    

    30.11.2 Director classes

    For each class that has directors enabled, SWIG generates a new class that derives from both the class in question and a special Swig::Director class. These new classes, referred to as director classes, can be loosely thought of as the C++ equivalent of the Perl proxy classes. The director classes store a pointer to their underlying Perl object and handle various issues related to object ownership.

    For simplicity let's ignore the Swig::Director class and refer to the original C++ class as the director's base class. By default, a director class extends all virtual methods in the inheritance chain of its base class (see the preceding section for how to modify this behavior). Virtual methods that have a final specifier are unsurprisingly excluded. Thus the virtual method calls, whether they originate in C++ or in Perl via proxy classes, eventually end up in at the implementation in the director class. The job of the director methods is to route these method calls to the appropriate place in the inheritance chain. By "appropriate place" we mean the method that would have been called if the C++ base class and its extensions in Perl were seamlessly integrated. That seamless integration is exactly what the director classes provide, transparently skipping over all the messy extension API glue that binds the two languages together.

    In reality, the "appropriate place" is one of only two possibilities: C++ or Perl. Once this decision is made, the rest is fairly easy. If the correct implementation is in C++, then the lowest implementation of the method in the C++ inheritance chain is called explicitly. If the correct implementation is in Perl, the Perl API is used to call the method of the underlying Perl object (after which the usual virtual method resolution in Perl automatically finds the right implementation).

    Now how does the director decide which language should handle the method call? The basic rule is to handle the method in Perl, unless there's a good reason not to. The reason for this is simple: Perl has the most "extended" implementation of the method. This assertion is guaranteed, since at a minimum the Perl proxy class implements the method. If the method in question has been extended by a class derived from the proxy class, that extended implementation will execute exactly as it should. If not, the proxy class will route the method call into a C wrapper function, expecting that the method will be resolved in C++. The wrapper will call the virtual method of the C++ instance, and since the director extends this the call will end up right back in the director method. Now comes the "good reason not to" part. If the director method were to blindly call the Perl method again, it would get stuck in an infinite loop. We avoid this situation by adding special code to the C wrapper function that tells the director method to not do this. The C wrapper function compares the pointer to the Perl object that called the wrapper function to the pointer stored by the director. If these are the same, then the C wrapper function tells the director to resolve the method by calling up the C++ inheritance chain, preventing an infinite loop.

    One more point needs to be made about the relationship between director classes and proxy classes. When a proxy class instance is created in Perl, SWIG creates an instance of the original C++ class. This is exactly what happens without directors and is true even if directors are enabled for the particular class in question. When a class derived from a proxy class is created, however, SWIG then creates an instance of the corresponding C++ director class. The reason for this difference is that user-defined subclasses may override or extend methods of the original class, so the director class is needed to route calls to these methods correctly. For unmodified proxy classes, all methods are ultimately implemented in C++ so there is no need for the extra overhead involved with routing the calls through Perl.

    30.11.3 Ownership and object destruction

    Memory management issues are slightly more complicated with directors than for proxy classes alone. Perl instances hold a pointer to the associated C++ director object, and the director in turn holds a pointer back to a Perl object. By default, proxy classes own their C++ director object and take care of deleting it when they are garbage collected.

    This relationship can be reversed by calling the special DISOWN() method of the proxy class. After calling this method the director class increments the reference count of the Perl object. When the director class is deleted it decrements the reference count. Assuming no outstanding references to the Perl object remain, the Perl object will be destroyed at the same time. This is a good thing, since directors and proxies refer to each other and so must be created and destroyed together. Destroying one without destroying the other will likely cause your program to segfault.

    Also note that due to the proxy implementation, the DESTROY() method on directors can be called for several reasons, many of which have little to do with the teardown of an object instance. To help disambiguate this, a second argument is added to the DESTROY() call when a C++ director object is being released. So, to avoid running your clean-up code when an object is not really going away, or after it has already been reclaimed, it is suggested that custom destructors in Perl subclasses looks something like:

    sub DESTROY {
      my($self, $final) = @_;
      if($final) {
        # real teardown code
      }
      shift->SUPER::DESTROY(@_);
    }
    

    30.11.4 Exception unrolling

    With directors routing method calls to Perl, and proxies routing them to C++, the handling of exceptions is an important concern. By default, the directors ignore exceptions that occur during method calls that are resolved in Perl. To handle such exceptions correctly, it is necessary to temporarily translate them into C++ exceptions. This can be done with the %feature("director:except") directive. The following code should suffice in most cases:

    %feature("director:except") {
      if ($error != NULL) {
        throw Swig::DirectorMethodException();
      }
    }
    

    This code will check the Perl error state after each method call from a director into Perl, and throw a C++ exception if an error occurred. This exception can be caught in C++ to implement an error handler.

    It may be the case that a method call originates in Perl, travels up to C++ through a proxy class, and then back into Perl via a director method. If an exception occurs in Perl at this point, it would be nice for that exception to find its way back to the original caller. This can be done by combining a normal %exception directive with the director:except handler shown above. Here is an example of a suitable exception handler:

    %exception {
      try { $action }
      catch (Swig::DirectorException &e) { SWIG_fail; }
    }
    

    The class Swig::DirectorException used in this example is actually a base class of Swig::DirectorMethodException, so it will trap this exception. Because the Perl error state is still set when Swig::DirectorMethodException is thrown, Perl will register the exception as soon as the C wrapper function returns.

    30.11.5 Overhead and code bloat

    Enabling directors for a class will generate a new director method for every virtual method in the class' inheritance chain. This alone can generate a lot of code bloat for large hierarchies. Method arguments that require complex conversions to and from target language types can result in large director methods. For this reason it is recommended that you selectively enable directors only for specific classes that are likely to be extended in Perl and used in C++.

    Compared to classes that do not use directors, the call routing in the director methods does add some overhead. In particular, at least one dynamic cast and one extra function call occurs per method call from Perl. Relative to the speed of Perl execution this is probably completely negligible. For worst case routing, a method call that ultimately resolves in C++ may take one extra detour through Perl in order to ensure that the method does not have an extended Perl implementation. This could result in a noticeable overhead in some cases.

    Although directors make it natural to mix native C++ objects with Perl objects (as director objects) via a common base class pointer, one should be aware of the obvious fact that method calls to Perl objects will be much slower than calls to C++ objects. This situation can be optimized by selectively enabling director methods (using the %feature directive) for only those methods that are likely to be extended in Perl.

    30.11.6 Typemaps

    Typemaps for input and output of most of the basic types from director classes have been written. These are roughly the reverse of the usual input and output typemaps used by the wrapper code. The typemap operation names are 'directorin', 'directorout', and 'directorargout'. The director code does not currently use any of the other kinds of typemaps. It is not clear at this point which kinds are appropriate and need to be supported.

    swig-4.0.1/Doc/Manual/Contract.html0000644000175000017500000001462013527234052016736 0ustar williamwilliam Contract Checking

    15 Contracts

    A common problem that arises when wrapping C libraries is that of maintaining reliability and checking for errors. The fact of the matter is that many C programs are notorious for not providing error checks. Not only that, when you expose the internals of an application as a library, it often becomes possible to crash it simply by providing bad inputs or using it in a way that wasn't intended.

    This chapter describes SWIG's support for software contracts. In the context of SWIG, a contract can be viewed as a runtime constraint that is attached to a declaration. For example, you can easily attach argument checking rules, check the output values of a function and more. When one of the rules is violated by a script, a runtime exception is generated rather than having the program continue to execute.

    15.1 The %contract directive

    Contracts are added to a declaration using the %contract directive. Here is a simple example:

    %contract sqrt(double x) {
    require:
      x >= 0;
    ensure:
      sqrt >= 0;
    }
    
    ...
    double sqrt(double);
    

    In this case, a contract is being added to the sqrt() function. The %contract directive must always appear before the declaration in question. Within the contract there are two sections, both of which are optional. The require: section specifies conditions that must hold before the function is called. Typically, this is used to check argument values. The ensure: section specifies conditions that must hold after the function is called. This is often used to check return values or the state of the program. In both cases, the conditions that must hold must be specified as boolean expressions.

    In the above example, we're simply making sure that sqrt() returns a non-negative number (if it didn't, then it would be broken in some way).

    Once a contract has been specified, it modifies the behavior of the resulting module. For example:

    >>> example.sqrt(2)
    1.4142135623730951
    >>> example.sqrt(-2)
    Traceback (most recent call last):
      File "<stdin>", line 1, in ?
    RuntimeError: Contract violation: require: (arg1>=0)
    >>>
    

    15.2 %contract and classes

    The %contract directive can also be applied to class methods and constructors. For example:

    %contract Foo::bar(int x, int y) {
    require:
      x > 0;
    ensure:
      bar > 0;
    }
    
    %contract Foo::Foo(int a) {
    require:
      a > 0;
    }
    
    class Foo {
    public:
      Foo(int);
      int bar(int, int);
    };
    

    The way in which %contract is applied is exactly the same as the %feature directive. Thus, any contract that you specified for a base class will also be attached to inherited methods. For example:

    class Spam : public Foo {
    public:
      int bar(int, int);    // Gets contract defined for Foo::bar(int, int)
    };
    

    In addition to this, separate contracts can be applied to both the base class and a derived class. For example:

    %contract Foo::bar(int x, int) {
    require:
      x > 0;
    }
    
    %contract Spam::bar(int, int y) {
    require:
      y > 0;
    }
    
    class Foo {
    public:
      int bar(int, int);   // Gets Foo::bar contract.
    };
    
    class Spam : public Foo {
    public:
      int bar(int, int);   // Gets Foo::bar and Spam::bar contract
    };
    

    When more than one contract is applied, the conditions specified in a "require:" section are combined together using a logical-AND operation. In other words conditions specified for the base class and conditions specified for the derived class all must hold. In the above example, this means that both the arguments to Spam::bar must be positive.

    15.3 Constant aggregation and %aggregate_check

    Consider an interface file that contains the following code:

    #define  UP     1
    #define  DOWN   2
    #define  RIGHT  3
    #define  LEFT   4
    
    void move(SomeObject *, int direction, int distance);
    

    One thing you might want to do is impose a constraint on the direction parameter to make sure it's one of a few accepted values. To do that, SWIG provides an easy to use macro %aggregate_check() that works like this:

    %aggregate_check(int, check_direction, UP, DOWN, LEFT, RIGHT);
    

    This merely defines a utility function of the form

    int check_direction(int x);
    

    That checks the argument x to see if it is one of the values listed. This utility function can be used in contracts. For example:

    %aggregate_check(int, check_direction, UP, DOWN, RIGHT, LEFT);
    
    %contract move(SomeObject *, int direction, in) {
    require:
      check_direction(direction);
    }
    
    #define  UP     1
    #define  DOWN   2
    #define  RIGHT  3
    #define  LEFT   4
    
    void move(SomeObject *, int direction, int distance);
    

    Alternatively, it can be used in typemaps and other directives. For example:

    %aggregate_check(int, check_direction, UP, DOWN, RIGHT, LEFT);
    
    %typemap(check) int direction {
      if (!check_direction($1)) SWIG_exception(SWIG_ValueError, "Bad direction");
    }
    
    #define  UP     1
    #define  DOWN   2
    #define  RIGHT  3
    #define  LEFT   4
    
    void move(SomeObject *, int direction, int distance);
    

    Regrettably, there is no automatic way to perform similar checks with enums values. Maybe in a future release.

    15.4 Notes

    Contract support was implemented by Songyan (Tiger) Feng and first appeared in SWIG-1.3.20.

    swig-4.0.1/Doc/Manual/Warnings.html0000644000175000017500000005227713527234052016763 0ustar williamwilliam Warning Messages

    18 Warning Messages

    18.1 Introduction

    During compilation, SWIG may generate a variety of warning messages. For example:

    example.i:16: Warning 501: Overloaded declaration ignored.  bar(double)
    example.i:15: Warning 501: Previous declaration is bar(int)
    

    Typically, warning messages indicate non-fatal problems with the input where the generated wrapper code will probably compile, but it may not work like you expect.

    18.2 Warning message suppression

    All warning messages have a numeric code that is shown in the warning message itself. To suppress the printing of a warning message, a number of techniques can be used. First, you can run SWIG with the -w command line option. For example:

    % swig -python -w501 example.i
    % swig -python -w501,505,401 example.i
    

    Alternatively, warnings can be suppressed by inserting a special preprocessor pragma into the input file:

    %module example
    #pragma SWIG nowarn=501
    #pragma SWIG nowarn=501,505,401
    

    Finally, code-generation warnings can be disabled on a declaration by declaration basis using the %warnfilter directive. For example:

    %module example
    %warnfilter(501) foo;
    ...
    int foo(int);
    int foo(double);              // Silently ignored.
    

    The %warnfilter directive has the same semantics as other declaration modifiers like %rename, %ignore and %feature, see the %feature directive section. For example, if you wanted to suppress a warning for a method in a class hierarchy, you could do this:

    %warnfilter(501) Object::foo;
    class Object {
    public:
      int foo(int);
      int foo(double);      // Silently ignored
      ...
    };
    
    class Derived : public Object {
    public:
      int foo(int);
      int foo(double);      // Silently ignored
      ...
    };
    

    Warnings can be suppressed for an entire class by supplying a class name. For example:

    %warnfilter(501) Object;
    
    class Object {
    public:
      ...                      // All 501 warnings ignored in class
    };
    

    There is no option to suppress all SWIG warning messages. The warning messages are there for a reason---to tell you that something may be broken in your interface. Ignore the warning messages at your own peril.

    18.3 Enabling extra warnings

    Some warning messages are disabled by default and are generated only to provide additional diagnostics. These warnings can be turned on using the -Wextra option. For example:

    % swig -Wextra -python example.i
    

    To selectively turn on extra warning messages, you can use the directives and options in the previous section--simply add a "+" to all warning numbers. For example:

    % swig -w+309,+452 example.i
    

    or in your interface file use either

    #pragma SWIG nowarn=+309,+452
    

    or

    %warnfilter(+309,+452) foo;
    

    Note: selective enabling of warnings with %warnfilter overrides any global settings you might have made using -w or #pragma.

    You can of course also enable all warnings and suppress a select few, for example:

    % swig -Wextra -w309,452 example.i
    

    The warnings on the right take precedence over the warnings on the left, so in the above example -Wextra adds numerous warnings including 452, but then -w309,452 overrides this and so 452 is suppressesed.

    If you would like all warnings to appear, regardless of the warning filters used, then use the -Wall option. The -Wall option also turns on the extra warnings that -Wextra adds, however, it is subtely different. When -Wall is used, it also disables all other warning filters, that is, any warnings suppressed or added in %warnfilter, #pragma SWIG nowarn or the -w option.

    18.4 Issuing a warning message

    Warning messages can be issued from an interface file using a number of directives. The %warn directive is the most simple:

    %warn "900:This is your last warning!"
    

    All warning messages are optionally prefixed by the warning number to use. If you are generating your own warnings, make sure you don't use numbers defined in the table at the end of this section.

    The %ignorewarn directive is the same as %ignore except that it issues a warning message whenever a matching declaration is found. For example:

    %ignorewarn("362:operator= ignored") operator=;
    

    Warning messages can be associated with typemaps using the warning attribute of a typemap declaration. For example:

    %typemap(in, warning="901:You are really going to regret this usage of $1_type $1_name") blah * {
      ...
    }
    

    In this case, the warning message will be printed whenever the typemap is actually used and the special variables will be expanded as appropriate, for example:

    example.i:23: Warning 901: You are really going to regret this usage of blah * self
    example.i:24: Warning 901: You are really going to regret this usage of blah * stuff
    

    18.5 Symbolic symbols

    The swigwarn.swg file that is installed with SWIG contains symbol constants that could also be used in %warnfilter and #pragma SWIG nowarn. For example this file contains the following line:

    %define SWIGWARN_TYPE_UNDEFINED_CLASS 401 %enddef
    

    so SWIGWARN_TYPE_UNDEFINED_CLASS could be used instead of 401, for example:

    #pragma SWIG nowarn=SWIGWARN_TYPE_UNDEFINED_CLASS
    

    or

    %warnfilter(SWIGWARN_TYPE_UNDEFINED_CLASS) Foo;
    

    18.6 Commentary

    The ability to suppress warning messages is really only provided for advanced users and is not recommended in normal use. You are advised to modify your interface to fix the problems highlighted by the warnings wherever possible instead of suppressing warnings.

    Certain types of SWIG problems are errors. These usually arise due to parsing errors (bad syntax) or semantic problems for which there is no obvious recovery. There is no mechanism for suppressing error messages.

    18.7 Warnings as errors

    Warnings can be handled as errors by using the -Werror command line option. This will cause SWIG to exit with a non successful exit code if a warning is encountered.

    18.8 Message output format

    The output format for both warnings and errors can be selected for integration with your favourite IDE/editor. Editors and IDEs can usually parse error messages and if in the appropriate format will easily take you directly to the source of the error. The standard format is used by default except on Windows where the Microsoft format is used by default. These can be overridden using command line options, for example:

    $ swig -python -Fstandard example.i
    example.i:4: Syntax error in input(1).
    $ swig -python -Fmicrosoft example.i
    example.i(4) : Syntax error in input(1).
    

    18.9 Warning number reference

    18.9.1 Deprecated features (100-199)

    • 101. Deprecated %extern directive.
    • 102. Deprecated %val directive.
    • 103. Deprecated %out directive.
    • 104. Deprecated %disabledoc directive.
    • 105. Deprecated %enabledoc directive.
    • 106. Deprecated %doconly directive.
    • 107. Deprecated %style directive.
    • 108. Deprecated %localstyle directive.
    • 109. Deprecated %title directive.
    • 110. Deprecated %section directive.
    • 111. Deprecated %subsection directive.
    • 112. Deprecated %subsubsection directive.
    • 113. Deprecated %addmethods directive.
    • 114. Deprecated %readonly directive.
    • 115. Deprecated %readwrite directive.
    • 116. Deprecated %except directive.
    • 117. Deprecated %new directive.
    • 118. Deprecated %typemap(except).
    • 119. Deprecated %typemap(ignore).
    • 120. Deprecated command line option (-runtime, -noruntime).
    • 121. Deprecated %name directive.
    • 126. The 'nestedworkaround' feature is deprecated.

    18.9.2 Preprocessor (200-299)

    • 201. Unable to find filename.
    • 202. Could not evaluate expression expr.
    • 203. Both includeall and importall are defined: using includeall.
    • 204. CPP #warning, "warning".
    • 205. CPP #error, "error".
    • 206. Unexpected tokens after #directive directive.

    18.9.3 C/C++ Parser (300-399)

    • 301. class keyword used, but not in C++ mode.
    • 302. Identifier 'name' redefined (ignored).
    • 303. %extend defined for an undeclared class 'name'.
    • 304. Unsupported constant value (ignored).
    • 305. Bad constant value (ignored).
    • 306. 'identifier' is private in this context.
    • 307. Can't set default argument value (ignored)
    • 308. Namespace alias 'name' not allowed here. Assuming 'name'
    • 309. [private | protected] inheritance ignored.
    • 310. Template 'name' was already wrapped as 'name' (ignored)
    • 312. Unnamed nested class not currently supported (ignored).
    • 313. Unrecognized extern type "name" (ignored).
    • 314. 'identifier' is a lang keyword.
    • 315. Nothing known about 'identifier'.
    • 316. Repeated %module directive.
    • 317. Specialization of non-template 'name'.
    • 318. Instantiation of template 'name' is ambiguous, instantiation templ used, instantiation templ ignored.
    • 319. No access specifier given for base class name (ignored).
    • 320. Explicit template instantiation ignored.
    • 321. identifier conflicts with a built-in name.
    • 322. Redundant redeclaration of 'name'.
    • 323. Recursive scope inheritance of 'name'.
    • 324. Named nested template instantiations not supported. Processing as if no name was given to %template().
    • 325. Nested kind not currently supported (name ignored).
    • 326. Deprecated %extend name used - the kind name 'name' should be used instead of the typedef name 'name'.
    • 350. operator new ignored.
    • 351. operator delete ignored.
    • 352. operator+ ignored.
    • 353. operator- ignored.
    • 354. operator* ignored.
    • 355. operator/ ignored.
    • 356. operator% ignored.
    • 357. operator^ ignored.
    • 358. operator& ignored.
    • 359. operator| ignored.
    • 360. operator~ ignored.
    • 361. operator! ignored.
    • 362. operator= ignored.
    • 363. operator< ignored.
    • 364. operator> ignored.
    • 365. operator+= ignored.
    • 366. operator-= ignored.
    • 367. operator*= ignored.
    • 368. operator/= ignored.
    • 369. operator%= ignored.
    • 370. operator^= ignored.
    • 371. operator&= ignored.
    • 372. operator|= ignored.
    • 373. operator<< ignored.
    • 374. operator>>ignored.
    • 375. operator<<= ignored.
    • 376. operator>>= ignored.
    • 377. operator== ignored.
    • 378. operator!= ignored.
    • 379. operator<= ignored.
    • 380. operator>= ignored.
    • 381. operator&& ignored.
    • 382. operator|| ignored.
    • 383. operator++ ignored.
    • 384. operator-- ignored.
    • 385. operator, ignored.
    • 386. operator-<* ignored.
    • 387. operator-< ignored.
    • 388. operator() ignored.
    • 389. operator[] ignored.
    • 390. operator+ ignored (unary).
    • 391. operator- ignored (unary).
    • 392. operator* ignored (unary).
    • 393. operator& ignored (unary).
    • 394. operator new[] ignored.
    • 395. operator delete[] ignored.

    18.9.4 Types and typemaps (400-499)

    • 401. Nothing known about class 'name'. Ignored.
    • 402. Base class 'name' is incomplete.
    • 403. Class 'name' might be abstract.
    • 450. Deprecated typemap feature ($source/$target).
    • 451. Setting const char * variable may leak memory.
    • 452. Reserved
    • 453. Can't apply (pattern). No typemaps are defined.
    • 460. Unable to use type type as a function argument.
    • 461. Unable to use return type type in function name.
    • 462. Unable to set variable of type type.
    • 463. Unable to read variable of type type.
    • 464. Unsupported constant value.
    • 465. Unable to handle type type.
    • 466. Unsupported variable type type.
    • 467. Overloaded declaration not supported (incomplete type checking rule - no precedence level in typecheck typemap for 'type')
    • 468. No 'throw' typemap defined for exception type type
    • 469. No or improper directorin typemap defined for type
    • 470. Thread/reentrant unsafe wrapping, consider returning by value instead.
    • 471. Unable to use return type type in director method
    • 474. Method method usage of the optimal attribute ignored in the out typemap as the following cannot be used to generate optimal code: code
    • 475. Multiple calls to method might be generated due to optimal attribute usage in the out typemap.
    • 476. Initialization using std::initializer_list.
    • 477. No directorthrows typemap defined for type

    18.9.5 Code generation (500-559)

    • 501. Overloaded declaration ignored. decl. Previous declaration is decl.
    • 502. Overloaded constructor ignored. decl. Previous declaration is decl.
    • 503. Can't wrap 'identifier' unless renamed to a valid identifier.
    • 504. Function name must have a return type. Ignored.
    • 505. Variable length arguments discarded.
    • 506. Can't wrap varargs with keyword arguments enabled.
    • 507. Adding native function name not supported (ignored).
    • 508. Declaration of 'name' shadows declaration accessible via operator->(), previous declaration of'declaration'.
    • 509. Overloaded method declaration effectively ignored, as it is shadowed by declaration.
    • 510. Friend function 'name' ignored.
    • 511. Can't use keyword arguments with overloaded functions.
    • 512. Overloaded method declaration ignored, using non-const method declaration instead.
    • 513. Can't generate wrappers for unnamed struct/class.
    • 514.
    • 515.
    • 516. Overloaded method declaration ignored, using declaration instead.
    • 517.
    • 518. Portability warning: File file1 will be overwritten by file2 on case insensitive filesystems such as Windows' FAT32 and NTFS unless the class/module name is renamed.
    • 519. %template() contains no name. Template method ignored: declaration
    • 520. Base/Derived class 'classname1' of 'classname2' is not similarly marked as a smart pointer.
    • 521. Illegal destructor name name. Ignored.
    • 522. Use of an illegal constructor name 'name' in %extend is deprecated, the constructor name should be 'name'.
    • 523. Use of an illegal destructor name 'name' in %extend is deprecated, the destructor name should be 'name'.
    • 524. Experimental target language. Target language language specified by lang is an experimental language. Please read about SWIG experimental languages, htmllink.
    • 525. Destructor declaration is final, name cannot be a director class.

    18.9.6 Doxygen comments (560-599)

    • 560: Unknown Doxygen command: command.
    • 561: Unexpected end of Doxygen comment encountered.
    • 562: Expected Doxygen command: command
    • 563: Doxygen HTML error for tag tag: error text.
    • 564: Error parsing Doxygen command command: error text. Command ignored."

    18.9.7 Language module specific (700-899)

    • 801. Wrong name (corrected to 'name'). (Ruby).
    • 810. No jni typemap defined for type (Java).
    • 811. No jtype typemap defined for type (Java).
    • 812. No jstype typemap defined for type (Java).
    • 813. Warning for classname, base baseclass ignored. Multiple inheritance is not supported in Java. (Java).
    • 814.
    • 815. No javafinalize typemap defined for type (Java).
    • 816. No javabody typemap defined for type (Java).
    • 817. No javaout typemap defined for type (Java).
    • 818. No javain typemap defined for type (Java).
    • 819. No javadirectorin typemap defined for type (Java).
    • 820. No javadirectorout typemap defined for type (Java).
    • 821.
    • 822. Covariant return types not supported in Java. Proxy method will return basetype (Java).
    • 823. No javaconstruct typemap defined for type (Java).
    • 824. Missing JNI descriptor in directorin typemap defined for type (Java).
    • 825. "directorconnect" attribute missing in type "javaconstruct" typemap. (Java).
    • 826. The nspace feature is used on 'type' without -package. The generated code may not compile as Java does not support types declared in a named package accessing types declared in an unnamed package. (Java).
    • 830. No ctype typemap defined for type (C#).
    • 831. No cstype typemap defined for type (C#).
    • 832. No cswtype typemap defined for type (C#).
    • 833. Warning for classname, base baseclass ignored. Multiple inheritance is not supported in C#. (C#).
    • 834.
    • 835. No csfinalize typemap defined for type (C#).
    • 836. No csbody typemap defined for type (C#).
    • 837. No csout typemap defined for type (C#).
    • 838. No csin typemap defined for type (C#).
    • 839.
    • 840.
    • 841.
    • 842. Covariant return types not supported in C#. Proxy method will return basetype (C#).
    • 843. No csconstruct typemap defined for type (C#).
    • 844. C# exception may not be thrown - no $excode or excode attribute in typemap typemap. (C#).
    • 845. Unmanaged code contains a call to a SWIG_CSharpSetPendingException method and C# code does not handle pending exceptions via the canthrow attribute. (C#).
    • 870. Warning for classname: Base baseclass ignored. Multiple inheritance is not supported in PHP. (Php).
    • 871. Unrecognized pragma pragma. (Php).

    18.9.8 User defined (900-999)

    These numbers can be used by your own application.

    18.10 History

    The ability to control warning messages was first added to SWIG-1.3.12.

    swig-4.0.1/Doc/Manual/Customization.html0000644000175000017500000010036113527234052020027 0ustar williamwilliam Customization Features

    14 Customization Features

    In many cases, it is desirable to change the default wrapping of particular declarations in an interface. For example, you might want to provide hooks for catching C++ exceptions, add assertions, or provide hints to the underlying code generator. This chapter describes some of these customization techniques. First, a discussion of exception handling is presented. Then, a more general-purpose customization mechanism known as "features" is described.

    14.1 Exception handling with %exception

    The %exception directive allows you to define a general purpose exception handler. For example, you can specify the following:

    %exception {
      try {
        $action
      }
      catch (RangeError) {
        ... handle error ...
      }
    }
    

    How the exception is handled depends on the target language, for example, Python:

    %exception {
      try {
        $action
      }
      catch (RangeError) {
        PyErr_SetString(PyExc_IndexError, "index out-of-bounds");
        SWIG_fail;
      }
    }
    

    When defined, the code enclosed in braces is inserted directly into the low-level wrapper functions. The special variable $action is one of a few %exception special variables supported and gets replaced with the actual operation to be performed (a function call, method invocation, attribute access, etc.). An exception handler remains in effect until it is explicitly deleted. This is done by using either %exception or %noexception with no code. For example:

    %exception;   // Deletes any previously defined handler
    

    Compatibility note: Previous versions of SWIG used a special directive %except for exception handling. That directive is deprecated--%exception provides the same functionality, but is substantially more flexible.

    14.1.1 Handling exceptions in C code

    C has no formal exception handling mechanism so there are several approaches that might be used. A somewhat common technique is to simply set a special error code. For example:

    /* File : except.c */
    
    static char error_message[256];
    static int error_status = 0;
    
    void throw_exception(char *msg) {
      strncpy(error_message, msg, 256);
      error_status = 1;
    }
    
    void clear_exception() {
      error_status = 0;
    }
    char *check_exception() {
      if (error_status)
        return error_message;
      else
        return NULL;
    }
    
    

    To use these functions, functions simply call throw_exception() to indicate an error occurred. For example :

    double inv(double x) {
      if (x != 0)
        return 1.0/x;
      else {
        throw_exception("Division by zero");
        return 0;
      }
    }
    

    To catch the exception, you can write a simple exception handler such as the following (shown for Perl5) :

    %exception {
      char *err;
      clear_exception();
      $action
      if ((err = check_exception())) {
        croak(err);
      }
    }
    

    In this case, when an error occurs, it is translated into a Perl error. Each target language has its own approach to creating a runtime error/exception in and for Perl it is the croak method shown above.

    14.1.2 Exception handling with longjmp()

    Exception handling can also be added to C code using the <setjmp.h> library. Here is a minimalistic implementation that relies on the C preprocessor :

    /* File : except.c
       Just the declaration of a few global variables we're going to use */
    
    #include <setjmp.h>
    jmp_buf exception_buffer;
    int exception_status;
    
    /* File : except.h */
    #include <setjmp.h>
    extern jmp_buf exception_buffer;
    extern int exception_status;
    
    #define try if ((exception_status = setjmp(exception_buffer)) == 0)
    #define catch(val) else if (exception_status == val)
    #define throw(val) longjmp(exception_buffer, val)
    #define finally else
    
    /* Exception codes */
    
    #define RangeError     1
    #define DivisionByZero 2
    #define OutOfMemory    3
    
    

    Now, within a C program, you can do the following :

    double inv(double x) {
      if (x)
        return 1.0/x;
      else
        throw(DivisionByZero);
    }
    
    

    Finally, to create a SWIG exception handler, write the following :

    %{
    #include "except.h"
    %}
    
    %exception {
      try {
        $action
      } catch(RangeError) {
        croak("Range Error");
      } catch(DivisionByZero) {
        croak("Division by zero");
      } catch(OutOfMemory) {
        croak("Out of memory");
      } finally {
        croak("Unknown exception");
      }
    }
    

    Note: This implementation is only intended to illustrate the general idea. To make it work better, you'll need to modify it to handle nested try declarations.

    14.1.3 Handling C++ exceptions

    Handling C++ exceptions is also straightforward. For example:

    %exception {
      try {
        $action
      } catch(RangeError) {
        croak("Range Error");
      } catch(DivisionByZero) {
        croak("Division by zero");
      } catch(OutOfMemory) {
        croak("Out of memory");
      } catch(...) {
        croak("Unknown exception");
      }
    }
    
    

    The exception types need to be declared as classes elsewhere, possibly in a header file :

    class RangeError {};
    class DivisionByZero {};
    class OutOfMemory {};
    

    14.1.4 Exception handlers for variables

    By default all variables will ignore %exception, so it is effectively turned off for all variables wrappers. This applies to global variables, member variables and static member variables. The approach is certainly a logical one when wrapping variables in C. However, in C++, it is quite possible for an exception to be thrown while the variable is being assigned. To ensure %exception is used when wrapping variables, it needs to be 'turned on' using the %allowexception feature. Note that %allowexception is just a macro for %feature("allowexcept"), that is, it is a feature called "allowexcept". Any variable which has this feature attached to it, will then use the %exception feature, but of course, only if there is a %exception attached to the variable in the first place. The %allowexception feature works like any other feature and so can be used globally or for selective variables.

    %allowexception;                // turn on globally
    %allowexception Klass::MyVar;   // turn on for a specific variable
    
    %noallowexception Klass::MyVar; // turn off for a specific variable
    %noallowexception;              // turn off globally
    

    14.1.5 Defining different exception handlers

    By default, the %exception directive creates an exception handler that is used for all wrapper functions that follow it. Unless there is a well-defined (and simple) error handling mechanism in place, defining one universal exception handler may be unwieldy and result in excessive code bloat since the handler is inlined into each wrapper function.

    To fix this, you can be more selective about how you use the %exception directive. One approach is to only place it around critical pieces of code. For example:

    %exception {
      ... your exception handler ...
    }
    /* Define critical operations that can throw exceptions here */
    
    %exception;
    
    /* Define non-critical operations that don't throw exceptions */
    

    More precise control over exception handling can be obtained by attaching an exception handler to specific declaration name. For example:

    %exception allocate {
      try {
        $action
      }
      catch (MemoryError) {
        croak("Out of memory");
      }
    }
    

    In this case, the exception handler is only attached to declarations named "allocate". This would include both global and member functions. The names supplied to %exception follow the same rules as for %rename described in the section on Renaming and ambiguity resolution. For example, if you wanted to define an exception handler for a specific class, you might write this:

    %exception Object::allocate {
      try {
        $action
      }
      catch (MemoryError) {
        croak("Out of memory");
      }
    }
    

    When a class prefix is supplied, the exception handler is applied to the corresponding declaration in the specified class as well as for identically named functions appearing in derived classes.

    %exception can even be used to pinpoint a precise declaration when overloading is used. For example:

    %exception Object::allocate(int) {
      try {
        $action
      }
      catch (MemoryError) {
        croak("Out of memory");
      }
    }
    

    Attaching exceptions to specific declarations is a good way to reduce code bloat. It can also be a useful way to attach exceptions to specific parts of a header file. For example:

    %module example
    %{
    #include "someheader.h"
    %}
    
    // Define a few exception handlers for specific declarations
    %exception Object::allocate(int) {
      try {
        $action
      }
      catch (MemoryError) {
        croak("Out of memory");
      }
    }
    
    %exception Object::getitem {
      try {
        $action
      }
      catch (RangeError) {
        croak("Index out of range");
      }
    }
    ...
    // Read a raw header file
    %include "someheader.h"
    

    Compatibility note: The %exception directive replaces the functionality provided by the deprecated "except" typemap. The typemap would allow exceptions to be thrown in the target language based on the return type of a function and was intended to be a mechanism for pinpointing specific declarations. However, it never really worked that well and the new %exception directive is much better.

    14.1.6 Special variables for %exception

    The %exception directive supports a few special variables which are placeholders for code substitution. The following table shows the available special variables and details what the special variables are replaced with.

    $action The actual operation to be performed (a function call, method invocation, variable access, etc.)
    $name The C/C++ symbol name for the function.
    $symname The symbol name used internally by SWIG
    $overname The extra mangling used in the symbol name for overloaded method. Expands to nothing if the wrapped method is not overloaded.
    $wrapname The language specific wrapper name (usually a C function name exported from the shared object/dll)
    $decl The fully qualified C/C++ declaration of the method being wrapped without the return type
    $fulldecl The fully qualified C/C++ declaration of the method being wrapped including the return type
    $parentclassname The parent class name (if any) for a method.
    $parentclasssymname The target language parent class name (if any) for a method.

    The special variables are often used in situations where method calls are logged. Exactly which form of the method call needs logging is up to individual requirements, but the example code below shows all the possible expansions, plus how an exception message could be tailored to show the C++ method declaration:

    %exception Special::something {
      log("symname: $symname");
      log("overname: $overname");
      log("wrapname: $wrapname");
      log("decl: $decl");
      log("fulldecl: $fulldecl");
      try {
        $action
      } 
      catch (MemoryError) {
        croak("Out of memory in $decl");
      }
    }
    void log(const char *message);
    struct Special {
      void something(const char *c);
      void something(int i);
    };
    

    Below shows the expansions for the 1st of the overloaded something wrapper methods for Perl:

      log("symname: Special_something");
      log("overname: __SWIG_0");
      log("wrapname: _wrap_Special_something__SWIG_0");
      log("decl: Special::something(char const *)");
      log("fulldecl: void Special::something(char const *)");
      try {
        (arg1)->something((char const *)arg2);
      } 
      catch (MemoryError) {
        croak("Out of memory in Special::something(char const *)");
      }
    

    14.1.7 Using The SWIG exception library

    The exception.i library file provides support for creating language independent exceptions in your interfaces. To use it, simply put an "%include exception.i" in your interface file. This provides a function SWIG_exception() that can be used to raise common scripting language exceptions in a portable manner. For example :

    // Language independent exception handler
    %include exception.i       
    
    %exception {
      try {
        $action
      } catch(RangeError) {
        SWIG_exception(SWIG_ValueError, "Range Error");
      } catch(DivisionByZero) {
        SWIG_exception(SWIG_DivisionByZero, "Division by zero");
      } catch(OutOfMemory) {
        SWIG_exception(SWIG_MemoryError, "Out of memory");
      } catch(...) {
        SWIG_exception(SWIG_RuntimeError, "Unknown exception");
      }
    }
    
    

    As arguments, SWIG_exception() takes an error type code (an integer) and an error message string. The currently supported error types are :

    SWIG_UnknownError
    SWIG_IOError
    SWIG_RuntimeError
    SWIG_IndexError
    SWIG_TypeError
    SWIG_DivisionByZero
    SWIG_OverflowError
    SWIG_SyntaxError
    SWIG_ValueError
    SWIG_SystemError
    SWIG_AttributeError
    SWIG_MemoryError
    SWIG_NullReferenceError
    

    The SWIG_exception() function can also be used in typemaps.

    14.2 Object ownership and %newobject

    A common problem in some applications is managing proper ownership of objects. For example, consider a function like this:

    Foo *blah() {
      Foo *f = new Foo();
      return f;
    }
    

    If you wrap the function blah(), SWIG has no idea that the return value is a newly allocated object. As a result, the resulting extension module may produce a memory leak (SWIG is conservative and will never delete objects unless it knows for certain that the returned object was newly created).

    To fix this, you can provide an extra hint to the code generator using the %newobject directive. For example:

    %newobject blah;
    Foo *blah();
    

    %newobject works exactly like %rename and %exception. In other words, you can attach it to class members and parameterized declarations as before. For example:

    %newobject ::blah();                   // Only applies to global blah
    %newobject Object::blah(int, double);  // Only blah(int, double) in Object
    %newobject *::copy;                    // Copy method in all classes
    ...
    

    When %newobject is supplied, many language modules will arrange to take ownership of the return value. This allows the value to be automatically garbage-collected when it is no longer in use. However, this depends entirely on the target language (a language module may also choose to ignore the %newobject directive).

    Closely related to %newobject is a special typemap. The "newfree" typemap can be used to deallocate a newly allocated return value. It is only available on methods for which %newobject has been applied and is commonly used to clean-up string results. For example:

    %typemap(newfree) char * "free($1);";
    ...
    %newobject strdup;
    ...
    char *strdup(const char *s);
    

    In this case, the result of the function is a string in the target language. Since this string is a copy of the original result, the data returned by strdup() is no longer needed. The "newfree" typemap in the example simply releases this memory.

    As a complement to the %newobject, from SWIG 1.3.28, you can use the %delobject directive. For example, if you have two methods, one to create objects and one to destroy them, you can use:

    %newobject create_foo;
    %delobject destroy_foo;
    ...
    Foo *create_foo();
    void destroy_foo(Foo *foo);
    

    or in a member method as:

    %delobject Foo::destroy;
    
    class Foo {
    public:
      void destroy() { delete this;}
    
    private:
      ~Foo();
    };
    

    %delobject instructs SWIG that the first argument passed to the method will be destroyed, and therefore, the target language should not attempt to deallocate it twice. This is similar to use the DISOWN typemap in the first method argument, and in fact, it also depends on the target language on implementing the 'disown' mechanism properly.

    The use of %newobject is also integrated with reference counting and is covered in the C++ reference counted objects section.

    Compatibility note: Previous versions of SWIG had a special %new directive. However, unlike %newobject, it only applied to the next declaration. For example:

    %new char *strdup(const char *s);
    

    For now this is still supported but is deprecated.

    How to shoot yourself in the foot: The %newobject directive is not a declaration modifier like the old %new directive. Don't write code like this:

    %newobject
    char *strdup(const char *s);
    

    The results might not be what you expect.

    14.3 Features and the %feature directive

    Both %exception and %newobject are examples of a more general purpose customization mechanism known as "features." A feature is simply a user-definable property that is attached to specific declarations. Features are attached using the %feature directive. For example:

    %feature("except") Object::allocate {
      try {
        $action
      }
      catch (MemoryError) {
        croak("Out of memory");
      }
    }
    
    %feature("new", "1") *::copy;
    

    In fact, the %exception and %newobject directives are really nothing more than macros involving %feature:

    #define %exception %feature("except")
    #define %newobject %feature("new", "1")
    

    The name matching rules outlined in the Renaming and ambiguity resolution section applies to all %feature directives. In fact the %rename directive is just a special form of %feature. The matching rules mean that features are very flexible and can be applied with pinpoint accuracy to specific declarations if needed. Additionally, if no declaration name is given, a global feature is said to be defined. This feature is then attached to every declaration that follows. This is how global exception handlers are defined. For example:

    /* Define a global exception handler */
    %feature("except") {
      try {
        $action
      }
      ...
    }
    
    ... bunch of declarations ...
    

    The %feature directive can be used with different syntax. The following are all equivalent:

    %feature("except") Object::method { $action };
    %feature("except") Object::method %{ $action %};
    %feature("except") Object::method " $action ";
    %feature("except", "$action") Object::method;
    

    The syntax in the first variation will generate the { } delimiters used whereas the other variations will not.

    14.3.1 Feature attributes

    The %feature directive also accepts XML style attributes in the same way that typemaps do. Any number of attributes can be specified. The following is the generic syntax for features:

    %feature("name", "value", attribute1="AttributeValue1") symbol;
    %feature("name", attribute1="AttributeValue1") symbol {value};
    %feature("name", attribute1="AttributeValue1") symbol %{value%};
    %feature("name", attribute1="AttributeValue1") symbol "value";
    

    More than one attribute can be specified using a comma separated list. The Java module is an example that uses attributes in %feature("except"). The throws attribute specifies the name of a Java class to add to a proxy method's throws clause. In the following example, MyExceptionClass is the name of the Java class for adding to the throws clause.

    %feature("except", throws="MyExceptionClass") Object::method { 
      try {
        $action
      } catch (...) {
        ... code to throw a MyExceptionClass Java exception ...
      }
    };
    

    Further details can be obtained from the Java exception handling section.

    14.3.2 Feature flags

    Feature flags are used to enable or disable a particular feature. Feature flags are a common but simple usage of %feature and the feature value should be either 1 to enable or 0 to disable the feature.

    %feature("featurename")          // enables feature
    %feature("featurename", "1")     // enables feature
    %feature("featurename", "x")     // enables feature
    %feature("featurename", "0")     // disables feature
    %feature("featurename", "")      // clears feature
    

    Actually any value other than zero will enable the feature. Note that if the value is omitted completely, the default value becomes 1, thereby enabling the feature. A feature is cleared by specifying no value, see Clearing features. The %immutable directive described in the Creating read-only variables section, is just a macro for %feature("immutable"), and can be used to demonstrates feature flags:

                                    // features are disabled by default
    int red;                        // mutable
    
    %feature("immutable");          // global enable
    int orange;                     // immutable
    
    %feature("immutable", "0");     // global disable
    int yellow;                     // mutable
    
    %feature("immutable", "1");     // another form of global enable
    int green;                      // immutable
    
    %feature("immutable", "");      // clears the global feature
    int blue;                       // mutable
    

    Note that features are disabled by default and must be explicitly enabled either globally or by specifying a targeted declaration. The above intersperses SWIG directives with C code. Of course you can target features explicitly, so the above could also be rewritten as:

    %feature("immutable", "1") orange;
    %feature("immutable", "1") green;
    int red;                        // mutable
    int orange;                     // immutable
    int yellow;                     // mutable
    int green;                      // immutable
    int blue;                       // mutable
    

    The above approach allows for the C declarations to be separated from the SWIG directives for when the C declarations are parsed from a C header file. The logic above can of course be inverted and rewritten as:

    %feature("immutable", "1");
    %feature("immutable", "0") red;
    %feature("immutable", "0") yellow;
    %feature("immutable", "0") blue;
    int red;                        // mutable
    int orange;                     // immutable
    int yellow;                     // mutable
    int green;                      // immutable
    int blue;                       // mutable
    

    As hinted above for %immutable, most feature flags can also be specified via alternative syntax. The alternative syntax is just a macro in the swig.swg Library file. The following shows the alternative syntax for the imaginary featurename feature:

    %featurename       // equivalent to %feature("featurename", "1") ie enables feature
    %nofeaturename     // equivalent to %feature("featurename", "0") ie disables feature
    %clearfeaturename  // equivalent to %feature("featurename", "")  ie clears feature
    

    The concept of clearing features is discussed next.

    14.3.3 Clearing features

    A feature stays in effect until it is explicitly cleared. A feature is cleared by supplying a %feature directive with no value. For example %feature("name", ""). A cleared feature means that any feature exactly matching any previously defined feature is no longer used in the name matching rules. So if a feature is cleared, it might mean that another name matching rule will apply. To clarify, let's consider the except feature again (%exception):

    // Define global exception handler
    %feature("except") {
      try {
        $action
      } catch (...) {
        croak("Unknown C++ exception");
      }
    }
    
    // Define exception handler for all clone methods to log the method calls
    %feature("except") *::clone() {
      try {
        logger.info("$action");
        $action
      } catch (...) {
        croak("Unknown C++ exception");
      }
    }
    
    ... initial set of class declarations with clone methods ...
    
    // clear the previously defined feature
    %feature("except", "") *::clone();
    
    ... final set of class declarations with clone methods ...
    

    In the above scenario, the initial set of clone methods will log all method invocations from the target language. This specific feature is cleared for the final set of clone methods. However, these clone methods will still have an exception handler (without logging) as the next best feature match for them is the global exception handler.

    Note that clearing a feature is not always the same as disabling it. Clearing the feature above with %feature("except", "") *::clone() is not the same as specifying %feature("except", "0") *::clone(). The former will disable the feature for clone methods - the feature is still a better match than the global feature. If on the other hand, no global exception handler had been defined at all, then clearing the feature would be the same as disabling it as no other feature would have matched.

    Note that the feature must match exactly for it to be cleared by any previously defined feature. For example the following attempt to clear the initial feature will not work:

    %feature("except") clone() { logger.info("$action"); $action }
    %feature("except", "") *::clone();
    

    but this will:

    %feature("except") clone() { logger.info("$action"); $action }
    %feature("except", "") clone();
    

    SWIG provides macros for disabling and clearing features. Many of these can be found in the swig.swg library file. The typical pattern is to define three macros; one to define the feature itself, one to disable the feature and one to clear the feature. The three macros below show this for the "except" feature:

    #define %exception      %feature("except")
    #define %noexception    %feature("except", "0")
    #define %clearexception %feature("except", "")
    

    14.3.4 Features and default arguments

    SWIG treats methods with default arguments as separate overloaded methods as detailed in the default arguments section. Any %feature targeting a method with default arguments will apply to all the extra overloaded methods that SWIG generates if the default arguments are specified in the feature. If the default arguments are not specified in the feature, then the feature will match that exact wrapper method only and not the extra overloaded methods that SWIG generates. For example:

    %feature("except") hello(int i=0, double d=0.0) { ... }
    void hello(int i=0, double d=0.0);
    

    will apply the feature to all three wrapper methods, that is:

    void hello(int i, double d);
    void hello(int i);
    void hello();
    

    If the default arguments are not specified in the feature:

    %feature("except") hello(int i, double d) { ... }
    void hello(int i=0, double d=0.0);
    

    then the feature will only apply to this wrapper method:

    void hello(int i, double d);
    

    and not these wrapper methods:

    void hello(int i);
    void hello();
    

    If compactdefaultargs are being used, then the difference between specifying or not specifying default arguments in a feature is not applicable as just one wrapper is generated.

    Compatibility note: The different behaviour of features specified with or without default arguments was introduced in SWIG-1.3.23 when the approach to wrapping methods with default arguments was changed.

    14.3.5 Feature example

    As has been shown earlier, the intended use for the %feature directive is as a highly flexible customization mechanism that can be used to annotate declarations with additional information for use by specific target language modules. Another example is in the Python module. You might use %feature to rewrite proxy/shadow class code as follows:

    %module example
    %rename(bar_id) bar(int, double);
    
    // Rewrite bar() to allow some nice overloading
    
    %feature("shadow") Foo::bar(int) %{
    def bar(*args):
        if len(args) == 3:
            return apply(examplec.Foo_bar_id, args)
        return apply(examplec.Foo_bar, args)
    %}
        
    class Foo {
    public:
      int bar(int x);
      int bar(int x, double y);
    }
    

    Further details of %feature usage is described in the documentation for specific language modules.

    swig-4.0.1/Doc/Manual/Ruby.html0000644000175000017500000045711713527234053016117 0ustar williamwilliam SWIG and Ruby

    34 SWIG and Ruby

    This chapter describes SWIG's support of Ruby.

    34.1 Preliminaries

    SWIG 4.0 is known to work with Ruby versions 1.9 and later. Given the choice, you should use the latest stable version of Ruby. You should also determine if your system supports shared libraries and dynamic loading. SWIG will work with or without dynamic loading, but the compilation process will vary.

    This chapter covers most SWIG features, but in less depth than is found in earlier chapters. At the very least, make sure you also read the "SWIG Basics" chapter. It is also assumed that the reader has a basic understanding of Ruby.

    34.1.1 Running SWIG

    To build a Ruby module, run SWIG using the -ruby option:

    $ swig -ruby example.i
    

    If building a C++ extension, add the -c++ option:

    $ swig -c++ -ruby example.i
    

    This creates a file example_wrap.c (example_wrap.cxx if compiling a C++ extension) that contains all of the code needed to build a Ruby extension module. To finish building the module, you need to compile this file and link it with the rest of your program.

    34.1.2 Getting the right header files

    In order to compile the wrapper code, the compiler needs the ruby.h header file and its dependencies, notably ruby/config.h which is found in a different, architecture-dependent, directory. The best way to find the compiler options needed to compile the code is to ask Ruby itself:

    $ ruby -rrbconfig -e 'puts "-I#{RbConfig::CONFIG[%q{rubyhdrdir}]} -I#{RbConfig::CONFIG[%q{rubyarchhdrdir}]}"'
    -I/usr/include/ruby-2.1.0 -I/usr/include/x86_64-linux-gnu/ruby-2.1.0
    

    34.1.3 Compiling a dynamic module

    Ruby extension modules are typically compiled into shared libraries that the interpreter loads dynamically at runtime. Since the exact commands for doing this vary from platform to platform, your best bet is to follow the steps described in the README.EXT file from the Ruby distribution:

    1. Create a file called extconf.rb that looks like the following:

      require 'mkmf'
      create_makefile('example')
    2. Type the following to build the extension:

      $ ruby extconf.rb
      $ make
      $ make install
          

    Of course, there is the problem that mkmf does not work correctly on all platforms, e.g, HPUX. If you need to add your own make rules to the file that extconf.rb produces, you can add this:

    open("Makefile", "a") { |mf|
     puts <<EOM
     # Your make rules go here
     EOM
    }
    

    to the end of the extconf.rb file. If for some reason you don't want to use the standard approach, you'll need to determine the correct compiler and linker flags for your build platform. For example, assuming you have code you need to link to in a file called example.c, a typical sequence of commands for the Linux operating system would look something like this:

    $ swig -ruby example.i
    $ gcc -O2 -fPIC -c example.c
    $ gcc -O2 -fPIC -c example_wrap.c -I/usr/include/ruby-2.1.0
    $ gcc -shared example.o example_wrap.o -o example.so
    

    The -fPIC option tells GCC to generate position-independent code (PIC) which is required for most architectures (it's not vital on x86, but still a good idea as it allows code pages from the library to be shared between processes). Other compilers may need a different option specified instead of -fPIC.

    If in doubt, consult the manual pages for your compiler and linker to determine the correct set of options. You might also check the SWIG Wiki for additional information.

    34.1.4 Using your module

    Ruby module names must be capitalized, but the convention for Ruby feature names is to use lowercase names. So, for example, the Etc extension module is imported by requiring the etc feature:

    # The feature name begins with a lowercase letter...
    require 'etc'
    
    # ... but the module name begins with an uppercase letter
    puts "Your login name: #{Etc.getlogin}"
    

    To stay consistent with this practice, you should always specify a lowercase module name with SWIG's %module directive. SWIG will automatically correct the resulting Ruby module name for your extension. So for example, a SWIG interface file that begins with:

    %module example

    will result in an extension module using the feature name "example" and Ruby module name "Example".

    34.1.5 Static linking

    An alternative approach to dynamic linking is to rebuild the Ruby interpreter with your extension module added to it. In the past, this approach was sometimes necessary due to limitations in dynamic loading support on certain machines. However, the situation has improved greatly over the last few years and you should not consider this approach unless there is really no other option.

    The usual procedure for adding a new module to Ruby involves finding the Ruby source, adding an entry to the ext/Setup file, adding your directory to the list of extensions in the file, and finally rebuilding Ruby.

    34.1.6 Compilation of C++ extensions

    On most machines, C++ extension modules should be linked using the C++ compiler. For example:

    $ swig -c++ -ruby example.i
    $ g++ -fPIC -c example.cxx
    $ g++ -fPIC -c example_wrap.cxx -I/usr/include/ruby-2.1.0
    $ g++ -shared example.o example_wrap.o -o example.so
    

    If you've written an extconf.rb script to automatically generate a Makefile for your C++ extension module, keep in mind that (as of this writing) Ruby still uses gcc and not g++ as its linker. As a result, the required C++ runtime library support will not be automatically linked into your extension module and it may fail to load on some platforms. A workaround for this problem is use the mkmf module's append_library() method to add one of the C++ runtime libraries to the list of libraries linked into your extension, e.g.

    require 'mkmf'
    $libs = append_library($libs, "supc++")
    create_makefile('example')

    34.2 Building Ruby Extensions under Windows 95/NT

    Building a SWIG extension to Ruby under Windows 95/NT is roughly similar to the process used with Unix. Normally, you will want to produce a DLL that can be loaded into the Ruby interpreter. For all recent versions of Ruby, the procedure described above (i.e. using an extconf.rb script) will work with Windows as well; you should be able to build your code into a DLL by typing:

    C:\swigtest> ruby extconf.rb
    C:\swigtest> nmake
    C:\swigtest> nmake install
    

    The remainder of this section covers the process of compiling SWIG-generated Ruby extensions with Microsoft Visual C++ 6 (i.e. within the Developer Studio IDE, instead of using the command line tools). In order to build extensions, you may need to download the source distribution to the Ruby package, as you will need the Ruby header files.

    34.2.1 Running SWIG from Developer Studio

    If you are developing your application within Microsoft developer studio, SWIG can be invoked as a custom build option. The process roughly follows these steps :

    • Open up a new workspace and use the AppWizard to select a DLL project.
    • Add both the SWIG interface file (the .i file), any supporting C files, and the name of the wrapper file that will be created by SWIG (i.e. example_wrap.c). Note : If using C++, choose a different suffix for the wrapper file such as example_wrap.cxx. Don't worry if the wrapper file doesn't exist yet--Developer Studio will keep a reference to it around.
    • Select the SWIG interface file and go to the settings menu. Under settings, select the "Custom Build" option.
    • Enter "SWIG" in the description field.
    • Enter "swig -ruby -o $(ProjDir)\$(InputName)_wrap.c $(InputPath)" in the "Build command(s) field". You may have to include the path to swig.exe.
    • Enter "$(ProjDir)\$(InputName)_wrap.c" in the "Output files(s) field".
    • Next, select the settings for the entire project and go to the C/C++ tab and select the Preprocessor category. Add NT=1 to the Preprocessor definitions. This must be set else you will get compilation errors. Also add IMPORT to the preprocessor definitions, else you may get runtime errors. Also add the include directories for your Ruby installation under "Additional include directories".
    • Next, select the settings for the entire project and go to the Link tab and select the General category. Set the name of the output file to match the name of your Ruby module (i.e.. example.dll). Next add the Ruby library file to your link libraries under Object/Library modules. For example "mswin32-ruby16.lib. You also need to add the path to the library under the Input tab - Additional library path.
    • Build your project.

    Now, assuming all went well, SWIG will be automatically invoked when you build your project. Any changes made to the interface file will result in SWIG being automatically invoked to produce a new version of the wrapper file. To run your new Ruby extension, simply run Ruby and use the require command as normal. For example if you have this ruby file run.rb:

    # file: run.rb
    require 'Example'
    
    # Call a c function
    print "Foo = ", Example.Foo, "\n"

    Ensure the dll just built is in your path or current directory, then run the Ruby script from the DOS/Command prompt:

    C:\swigtest> ruby run.rb
    Foo = 3.0
    

    34.3 The Ruby-to-C/C++ Mapping

    This section describes the basics of how SWIG maps C or C++ declarations in your SWIG interface files to Ruby constructs.

    34.3.1 Modules

    The SWIG %module directive specifies the name of the Ruby module. If you specify:

    %module example

    then everything is wrapped into a Ruby module named Example that is nested directly under the global module. You can specify a more deeply nested module by specifying the fully-qualified module name in quotes, e.g.

    %module "foo::bar::spam"

    An alternate method of specifying a nested module name is to use the -prefix option on the SWIG command line. The prefix that you specify with this option will be prepended to the module name specified with the %module directive in your SWIG interface file. So for example, this declaration at the top of your SWIG interface file:

    %module "foo::bar::spam"

    will result in a nested module name of Foo::Bar::Spam, but you can achieve the same effect by specifying:

    %module spam

    and then running SWIG with the -prefix command line option:

    $ swig -ruby -prefix "foo::bar::" example.i
    

    Starting with SWIG 1.3.20, you can also choose to wrap everything into the global module by specifying the -globalmodule option on the SWIG command line, i.e.

    $ swig -ruby -globalmodule example.i
    

    Note that this does not relieve you of the requirement of specifying the SWIG module name with the %module directive (or the -module command-line option) as described earlier.

    When choosing a module name, do not use the same name as a built-in Ruby command or standard module name, as the results may be unpredictable. Similarly, if you're using the -globalmodule option to wrap everything into the global module, take care that the names of your constants, classes and methods don't conflict with any of Ruby's built-in names.

    34.3.2 Functions

    Global functions are wrapped as Ruby module methods. For example, given the SWIG interface file example.i:

    %module example
    
    int fact(int n);

    and C source file example.c:

    int fact(int n) {
      if (n == 0)
      return 1;
      return (n * fact(n-1));
    }

    SWIG will generate a method fact in the Example module that can be used like so:

    $ irb
    irb(main):001:0> require 'example'
    true
    irb(main):002:0> Example.fact(4)
    24

    34.3.3 Variable Linking

    C/C++ global variables are wrapped as a pair of singleton methods for the module: one to get the value of the global variable and one to set it. For example, the following SWIG interface file declares two global variables:

    // SWIG interface file with global variables
    %module example
    ...
    %inline %{
      extern int variable1;
      extern double Variable2;
    %}
    ...

    Now look at the Ruby interface:

    $ irb
    irb(main):001:0> require 'Example'
    true
    irb(main):002:0> Example.variable1 = 2
    2
    irb(main):003:0> Example.Variable2 = 4 * 10.3
    41.2
    irb(main):004:0> Example.Variable2
    41.2

    If you make an error in variable assignment, you will receive an error message. For example:

    irb(main):005:0> Example.Variable2 = "hello"
    TypeError: no implicit conversion to float from string
    from (irb):5:in `Variable2='
    from (irb):5

    If a variable is declared as const, it is wrapped as a read-only variable. Attempts to modify its value will result in an error.

    To make ordinary variables read-only, you can also use the %immutable directive. For example:

    %immutable;
    %inline %{
      extern char *path;
    %}
    %mutable;

    The %immutable directive stays in effect until it is explicitly disabled using %mutable.

    34.3.4 Constants

    C/C++ constants are wrapped as module constants initialized to the appropriate value. To create a constant, use #define or the %constant directive. For example:

    #define PI 3.14159
    #define VERSION "1.0"
    
    %constant int FOO = 42;
    %constant const char *path = "/usr/local";
    
    const int BAR = 32;

    Remember to use the :: operator in Ruby to get at these constant values, e.g.

    $ irb
    irb(main):001:0> require 'Example'
    true
    irb(main):002:0> Example::PI
    3.14159

    34.3.5 Pointers

    "Opaque" pointers to arbitrary C/C++ types (i.e. types that aren't explicitly declared in your SWIG interface file) are wrapped as data objects. So, for example, consider a SWIG interface file containing only the declarations:

    Foo *get_foo();
    void set_foo(Foo *foo);

    For this case, the get_foo() method returns an instance of an internally generated Ruby class:

    irb(main):001:0> foo = Example::get_foo()
    #<SWIG::TYPE_p_Foo:0x402b1654>

    A NULL pointer is always represented by the Ruby nil object.

    34.3.6 Structures

    C/C++ structs are wrapped as Ruby classes, with accessor methods (i.e. "getters" and "setters") for all of the struct members. For example, this struct declaration:

    struct Vector {
      double x, y;
    };

    gets wrapped as a Vector class, with Ruby instance methods x, x=, y and y=. These methods can be used to access structure data from Ruby as follows:

    $ irb
    irb(main):001:0> require 'Example'
    true
    irb(main):002:0> f = Example::Vector.new
    #<Example::Vector:0x4020b268>
    irb(main):003:0> f.x = 10
    nil
    irb(main):004:0> f.x
    10.0

    Similar access is provided for unions and the public data members of C++ classes.

    const members of a structure are read-only. Data members can also be forced to be read-only using the %immutable directive (in C++, private may also be used). For example:

    struct Foo {
      ...
      %immutable;
      int x; /* Read-only members */
      char *name;
      %mutable;
      ...
    };

    When char * members of a structure are wrapped, the contents are assumed to be dynamically allocated using malloc or new (depending on whether or not SWIG is run with the -c++ option). When the structure member is set, the old contents will be released and a new value created. If this is not the behavior you want, you will have to use a typemap (described shortly).

    Array members are normally wrapped as read-only. For example, this code:

    struct Foo {
      int x[50];
    };

    produces a single accessor function like this:

    int *Foo_x_get(Foo *self) {
      return self->x;
    };

    If you want to set an array member, you will need to supply a "memberin" typemap described in the section on typemaps. As a special case, SWIG does generate code to set array members of type char (allowing you to store a Ruby string in the structure).

    When structure members are wrapped, they are handled as pointers. For example,

    struct Foo {
      ...
    };
    
    struct Bar {
      Foo f;
    };

    generates accessor functions such as this:

    Foo *Bar_f_get(Bar *b) {
      return &b->f;
    }
    
    void Bar_f_set(Bar *b, Foo *val) {
      b->f = *val;
    }

    34.3.7 C++ classes

    Like structs, C++ classes are wrapped by creating a new Ruby class of the same name with accessor methods for the public class member data. Additionally, public member functions for the class are wrapped as Ruby instance methods, and public static member functions are wrapped as Ruby singleton methods. So, given the C++ class declaration:

    class List {
    public:
      List();
      ~List();
      int search(char *item);
      void insert(char *item);
      void remove(char *item);
      char *get(int n);
      int length;
      static void print(List *l);
    };

    SWIG would create a List class with:

    • instance methods search, insert, remove, and get;
    • instance methods length and length= (to get and set the value of the length data member); and,
    • a print singleton method for the class.

    In Ruby, these functions are used as follows:

    require 'Example'
    
    l = Example::List.new
    
    l.insert("Ale")
    l.insert("Stout")
    l.insert("Lager")
    Example.print(l)
    l.length()
    ----- produces the following output 
    Lager
    Stout
    Ale
    3

    34.3.8 C++ Inheritance

    The SWIG type-checker is fully aware of C++ inheritance. Therefore, if you have classes like this:

    class Parent {
      ...
    };
    
    class Child : public Parent {
      ...
    };

    those classes are wrapped into a hierarchy of Ruby classes that reflect the same inheritance structure. All of the usual Ruby utility methods work normally:

    irb(main):001:0> c = Child.new
    #<Bar:0x4016efd4>
    irb(main):002:0> c.instance_of? Child
    true
    irb(main):003:0> b.instance_of? Parent
    false
    irb(main):004:0> b.is_a? Child
    true
    irb(main):005:0> b.is_a? Parent
    true
    irb(main):006:0> Child < Parent
    true
    irb(main):007:0> Child > Parent
    false

    Furthermore, if you have a function like this:

    void spam(Parent *f);

    then the function spam() accepts Parent* or a pointer to any class derived from Parent.

    Until recently, the Ruby module for SWIG didn't support multiple inheritance, and this is still the default behavior. This doesn't mean that you can't wrap C++ classes which inherit from multiple base classes; it simply means that only the first base class listed in the class declaration is considered, and any additional base classes are ignored. As an example, consider a SWIG interface file with a declaration like this:

    class Derived : public Base1, public Base2
    {
      ...
    };

    For this case, the resulting Ruby class (Derived) will only consider Base1 as its superclass. It won't inherit any of Base2's member functions or data and it won't recognize Base2 as an "ancestor" of Derived (i.e. the is_a? relationship would fail). When SWIG processes this interface file, you'll see a warning message like:

    example.i:5: Warning 802: Warning for Derived: Base Base2 ignored.
    Multiple inheritance is not supported in Ruby.

    Starting with SWIG 1.3.20, the Ruby module for SWIG provides limited support for multiple inheritance. Because the approach for dealing with multiple inheritance introduces some limitations, this is an optional feature that you can activate with the -minherit command-line option:

    $ swig -c++ -ruby -minherit example.i
    

    Using our previous example, if your SWIG interface file contains a declaration like this:

    class Derived : public Base1, public Base2
    {
      ...
    };

    and you run SWIG with the -minherit command-line option, then you will end up with a Ruby class Derived that appears to "inherit" the member data and functions from both Base1 and Base2. What actually happens is that three different top-level classes are created, with Ruby's Object class as their superclass. Each of these classes defines a nested module named Impl, and it's in these nested Impl modules that the actual instance methods for the classes are defined, i.e.

    class Base1
      module Impl
      # Define Base1 methods here
      end
      include Impl
    end
    
    class Base2
      module Impl
      # Define Base2 methods here
      end
      include Impl
    end
    
    class Derived
      module Impl
      include Base1::Impl
      include Base2::Impl
      # Define Derived methods here
      end
      include Impl
    end

    Observe that after the nested Impl module for a class is defined, it is mixed-in to the class itself. Also observe that the Derived::Impl module first mixes-in its base classes' Impl modules, thus "inheriting" all of their behavior.

    The primary drawback is that, unlike the default mode of operation, neither Base1 nor Base2 is a true superclass of Derived anymore:

    obj = Derived.new
    obj.is_a? Base1 # this will return false...
    obj.is_a? Base2 # ... and so will this

    In most cases, this is not a serious problem since objects of type Derived will otherwise behave as though they inherit from both Base1 and Base2 (i.e. they exhibit "Duck Typing").

    34.3.9 C++ Overloaded Functions

    C++ overloaded functions, methods, and constructors are mostly supported by SWIG. For example, if you have two functions like this:

    void foo(int);
    void foo(char *c);

    You can use them in Ruby in a straightforward manner:

    irb(main):001:0> foo(3) # foo(int)
    irb(main):002:0> foo("Hello") # foo(char *c)

    Similarly, if you have a class like this,

    class Foo {
    public:
      Foo();
      Foo(const Foo &);
      ...
    };

    you can write Ruby code like this:

    irb(main):001:0> f = Foo.new # Create a Foo
    irb(main):002:0> g = Foo.new(f) # Copy f

    Overloading support is not quite as flexible as in C++. Sometimes there are methods that SWIG can't disambiguate. For example:

    void spam(int);
    void spam(short);

    or

    void foo(Bar *b);
    void foo(Bar &b);

    If declarations such as these appear, you will get a warning message like this:

    example.i:12: Warning 509: Overloaded method spam(short) effectively ignored,
    example.i:11: Warning 509: as it is shadowed by spam(int).
    

    To fix this, you either need to ignore or rename one of the methods. For example:

    %rename(spam_short) spam(short);
    ...
    void spam(int); 
    void spam(short); // Accessed as spam_short

    or

    %ignore spam(short);
    ...
    void spam(int); 
    void spam(short); // Ignored

    SWIG resolves overloaded functions and methods using a disambiguation scheme that ranks and sorts declarations according to a set of type-precedence rules. The order in which declarations appear in the input does not matter except in situations where ambiguity arises--in this case, the first declaration takes precedence.

    Please refer to the "SWIG and C++" chapter for more information about overloading.

    34.3.10 C++ Operators

    For the most part, overloaded operators are handled automatically by SWIG and do not require any special treatment on your part. So if your class declares an overloaded addition operator, e.g.

    class Complex {
      ...
      Complex operator+(Complex &);
      ...
    };

    the resulting Ruby class will also support the addition (+) method correctly.

    For cases where SWIG's built-in support is not sufficient, C++ operators can be wrapped using the %rename directive (available on SWIG 1.3.10 and later releases). All you need to do is give the operator the name of a valid Ruby identifier. For example:

    %rename(add_complex) operator+(Complex &, Complex &);
    ...
    Complex operator+(Complex &, Complex &);

    Now, in Ruby, you can do this:

    a = Example::Complex.new(2, 3)
    b = Example::Complex.new(4, -1)
    c = Example.add_complex(a, b)

    More details about wrapping C++ operators into Ruby operators is discussed in the section on operator overloading.

    34.3.11 C++ namespaces

    SWIG is aware of C++ namespaces, but namespace names do not appear in the module nor do namespaces result in a module that is broken up into submodules or packages. For example, if you have a file like this,

    %module example
    
    namespace foo {
      int fact(int n);
      struct Vector {
        double x, y, z;
      };
    };

    it works in Ruby as follows:

    irb(main):001:0> require 'example'
    true
    irb(main):002:0> Example.fact(3)
    6
    irb(main):003:0> v = Example::Vector.new
    #<Example::Vector:0x4016f4d4>
    irb(main):004:0> v.x = 3.4
    3.4
    irb(main):004:0> v.y
    0.0

    If your program has more than one namespace, name conflicts (if any) can be resolved using %rename For example:

    %rename(Bar_spam) Bar::spam;
    
    namespace Foo {
      int spam();
    }
    
    namespace Bar {
      int spam();
    }

    If you have more than one namespace and your want to keep their symbols separate, consider wrapping them as separate SWIG modules. For example, make the module name the same as the namespace and create extension modules for each namespace separately. If your program utilizes thousands of small deeply nested namespaces each with identical symbol names, well, then you get what you deserve.

    34.3.12 C++ templates

    C++ templates don't present a huge problem for SWIG. However, in order to create wrappers, you have to tell SWIG to create wrappers for a particular template instantiation. To do this, you use the %template directive. For example:

    %module example
    
    %{
    #include "pair.h"
    %}
    
    template<class T1, class T2>
    struct pair {
      typedef T1 first_type;
      typedef T2 second_type;
      T1 first;
      T2 second;
      pair();
      pair(const T1&, const T2&);
      ~pair();
    };
    
    %template(Pairii) pair<int, int>;

    In Ruby:

    irb(main):001:0> require 'example'
    true
    irb(main):002:0> p = Example::Pairii.new(3, 4)
    #<Example:Pairii:0x4016f4df>
    irb(main):003:0> p.first
    3
    irb(main):004:0> p.second
    4

    34.3.13 C++ Standard Template Library (STL)

    On a related note, the standard SWIG library contains a number of modules that provide typemaps for standard C++ library classes (such as std::pair, std::string and std::vector). These library modules don't provide wrappers around the templates themselves, but they do make it convenient for users of your extension module to pass Ruby objects (such as arrays and strings) to wrapped C++ code that expects instances of standard C++ templates. For example, suppose the C++ library you're wrapping has a function that expects a vector of floats:

    %module example
    
    float sum(const std::vector<float>& values);

    Rather than go through the hassle of writing an "in" typemap to convert an array of Ruby numbers into a std::vector<float>, you can just use the std_vector.i module from the standard SWIG library:

    %module example
    
    %include std_vector.i
    float sum(const std::vector<float>& values);

    Ruby's STL wrappings provide additional methods to make them behave more similarly to Ruby's native classes.

    Thus, you can do, for example:

    v = IntVector.new
    v << 2
    v << 3
    v << 4
    v.each { |x| puts x }
    
    => 2
    3
    4
    v.delete_if { |x| x == 3 }
    => [2, 4]

    The SWIG Ruby module provides also the ability for all the STL containers to carry around Ruby native objects (Fixnum, Classes, etc) making them act almost like Ruby's own Array, Hash, etc. To do that, you need to define a container that contains a swig::GC_VALUE, like:

    %module nativevector
    
    %{
    std::vector< swig::GC_VALUE > NativeVector;
    %}
    
    %template(NativeVector) std::vector< swig::GC_VALUE >;
    

    This vector can then contain any Ruby object, making them almost identical to Ruby's own Array class.

    require 'nativevector'
    include NativeVector
    
    v = NativeVector.new
    v << 1
    v << [1, 2]
    v << 'hello'
    
    class A; end
    
    v << A.new
    
    puts v
    => [1, [1, 2], 'hello', #<A:0x245325>]
    

    Obviously, there is a lot more to template wrapping than shown in these examples. More details can be found in the SWIG and C++ chapter.

    34.3.14 C++ STL Functors

    Some containers in the STL allow you to modify their default behavior by using so called functors or function objects. Functors are often just a very simple struct with operator() redefined or an actual C/C++ function. This allows you, for example, to always keep the sort order of a STL container to your liking.

    The Ruby STL mappings allows you to modify those containers that support functors using Ruby procs or methods, instead. Currently, this includes std::set, set::map, std::multiset and std::multimap.

    The functors in swig are called swig::UnaryFunction and swig::BinaryFunction. For C++ predicates (ie. functors that must return bool as a result) swig::UnaryPredicate and swig::BinaryPredicate are provided.

    As an example, if given this swig file:

    %module intset;
    
    %include <std_set.i>
    
    %template(IntSet) std::set< int, swig::BinaryPredicate >;
    

    You can then use the set from Ruby with or without a proc object as a predicate:

    require 'intset'
    include Intset
    
    # Default sorting behavior defined in C++
    a = IntSet.new
    a << 1
    a << 2
    a << 3
    a
    => [1, 2, 3]
    
    # Custom sorting behavior defined by a Ruby proc
    b = IntSet.new( proc { |a, b| a > b } )
    b << 1
    b << 2
    b << 3
    b
    =>  [3, 2, 1]
    

    34.3.15 C++ STL Iterators

    The STL is well known for the use of iterators. There are a number of iterators possible with different properties, but in general there are two main categories: const iterators and non-const iterators. The const iterators can access and not modify the values they point at, while the non-const iterators can both read and modify the values.

    The Ruby STL wrappings support both type of iterators by using a proxy class in-between. This proxy class is swig::Iterator or swig::ConstIterator. Derived from them are template classes that need to be initialized with the actual iterator for the container you are wrapping and often times with the beginning and ending points of the iteration range.

    The SWIG STL library already provides typemaps to all the standard containers to do this wrapping automatically for you, but if you have your own STL-like iterator, you will need to write your own typemap for them. For out typemaps, the special functions make_const_iterator and make_nonconst_iterator are provided.

    These can be used either like:

    make_const_iterator( iterator, rubyclass );
    make_const_iterator( iterator, iterator_begin, iterator_end, rubyclass );
    

    The iterators support a next() and previous() member function to just change the iterator without returning anything. previous() should obviously only be used for bidirectional iterators. You can also advance the iterator multiple steps by using standard math operations like +=.

    The value the iterator points at can be accessed with value() -- this is equivalent to dereferencing it with *i. For non-const iterators, a value=() function is also provided which allows you to change the value pointed by the iterator. This is equivalent to the C++ construct of dereferencing and assignment, like *i = something.

    Thus, given say a vector class of doubles defined as:

    %module doublevector
    
    %include std_vector.i
    
    %template(DoubleVector) std::vector<double>;
    

    Its iterator can then be used from Ruby like:

    require 'doublevector'
    include Doublevector
    
    v = DoubleVector.new
    v << 1
    v << 2
    v << 3
    
    #
    # an elaborate and less efficient way of doing v.map! { |x| x+2 }
    #
    i = v.begin
    e = v.end
    while i != e
      val = i.value
      val += 2
      i.value = val
      i.next
    end
    i
    >> [3, 4, 5 ]
    

    If you'd rather have STL classes without any iterators, you should define -DSWIG_NO_EXPORT_ITERATOR_METHODS when running swig.

    34.3.16 C++ Smart Pointers

    34.3.16.1 The shared_ptr Smart Pointer

    The C++11 standard provides std::shared_ptr which was derived from the Boost implementation, boost::shared_ptr. Both of these are available for Ruby in the SWIG library and usage is outlined in the shared_ptr smart pointer library section.

    34.3.16.2 Generic Smart Pointers

    In certain C++ programs, it is common to use classes that have been wrapped by so-called "smart pointers." Generally, this involves the use of a template class that implements operator->() like this:

    template<class T> class SmartPtr {
      ...
      T *operator->();
      ...
    }

    Then, if you have a class like this,

    class Foo {
    public:
      int x;
      int bar();
    };

    A smart pointer would be used in C++ as follows:

    SmartPtr<Foo> p = CreateFoo(); // Created somehow (not shown)
    ...
    p->x = 3; // Foo::x
    int y = p->bar(); // Foo::bar

    To wrap this in Ruby, simply tell SWIG about the SmartPtr class and the low-level Foo object. Make sure you instantiate SmartPtr using %template if necessary. For example:

    %module example
    ...
    %template(SmartPtrFoo) SmartPtr<Foo>;
    ...

    Now, in Ruby, everything should just "work":

    irb(main):001:0> p = Example::CreateFoo() # Create a smart-pointer somehow
    #<Example::SmartPtrFoo:0x4016f4df>
    irb(main):002:0> p.x = 3 # Foo::x
    3
    irb(main):003:0> p.bar() # Foo::bar

    If you ever need to access the underlying pointer returned by operator->() itself, simply use the __deref__() method. For example:

    irb(main):004:0> f = p.__deref__() # Returns underlying Foo *

    34.3.17 Cross-Language Polymorphism

    SWIG's Ruby module supports cross-language polymorphism (a.k.a. the "directors" feature) similar to that for SWIG's Python module. Rather than duplicate the information presented in the Python chapter, this section just notes the differences that you need to be aware of when using this feature with Ruby.

    34.3.17.1 Exception Unrolling

    Whenever a C++ director class routes one of its virtual member function calls to a Ruby instance method, there's always the possibility that an exception will be raised in the Ruby code. By default, those exceptions are ignored, which simply means that the exception will be exposed to the Ruby interpreter. If you would like to change this behavior, you can use the %feature("director:except") directive to indicate what action should be taken when a Ruby exception is raised. The following code should suffice in most cases:

    %feature("director:except") {
      throw Swig::DirectorMethodException($error);
    }

    When this feature is activated, the call to the Ruby instance method is "wrapped" using the rb_rescue2() function from Ruby's C API. If any Ruby exception is raised, it will be caught here and a C++ exception is raised in its place.

    34.4 Naming

    Ruby has several common naming conventions. Constants are generally in upper case, module and class names are in camel case and methods are in lower case with underscores. For example:

    • MATH::PI is a constant name
    • MyClass is a class name
    • my_method is a method name

    Prior to version 1.3.28, SWIG did not support these Ruby conventions. The only modifications it made to names was to capitalize the first letter of constants (which includes module and class names).

    SWIG 1.3.28 introduces the new -autorename command line parameter. When this parameter is specified, SWIG will automatically change constant, class and method names to conform with the standard Ruby naming conventions. For example:

    $ swig -ruby -autorename example.i
    

    To disable renaming use the -noautorename command line option.

    Since this change significantly changes the wrapper code generated by SWIG, it is turned off by default in SWIG 1.3.28. However, it is planned to become the default option in future releases.

    34.4.1 Defining Aliases

    It's a fairly common practice in the Ruby built-ins and standard library to provide aliases for method names. For example, Array#size is an alias for Array#length. If you would like to provide an alias for one of your class' instance methods, one approach is to use SWIG's %extend directive to add a new method of the aliased name that calls the original function. For example:

    class MyArray {
    public:
      // Construct an empty array
      MyArray();
    
      // Return the size of this array
      size_t length() const;
    };
    
    %extend MyArray {
      // MyArray#size is an alias for MyArray#length
      size_t size() const {
        return $self->length();
      }
    }
     

    A better solution is to use the %alias directive (unique to SWIG's Ruby module). The previous example could then be rewritten as:

    // MyArray#size is an alias for MyArray#length
    %alias MyArray::length "size";
    
    class MyArray {
    public:
      // Construct an empty array
      MyArray();
     
      // Return the size of this array
      size_t length() const;
    };

    Multiple aliases can be associated with a method by providing a comma-separated list of aliases to the %alias directive, e.g.

    %alias MyArray::length "amount, quantity, size";

    From an end-user's standpoint, there's no functional difference between these two approaches; i.e. they should get the same result from calling either MyArray#size or MyArray#length. However, when the %alias directive is used, SWIG doesn't need to generate all of the wrapper code that's usually associated with added methods like our MyArray::size() example.

    Note that the %alias directive is implemented using SWIG's "features" mechanism and so the same name matching rules used for other kinds of features apply (see the chapter on "Customization Features") for more details).

    34.4.2 Predicate Methods

    Ruby methods that return a boolean value and end in a question mark are known as predicate methods. Examples of predicate methods in standard Ruby classes include Array#empty? (which returns true for an array containing no elements) and Object#instance_of? (which returns true if the object is an instance of the specified class). For consistency with Ruby conventions, methods that return boolean values should be marked as predicate methods.

    One cumbersome solution to this problem is to rename the method (using SWIG's %rename directive) and provide a custom typemap that converts the function's actual return type to Ruby's true or false. For example:

    %rename("is_it_safe?") is_it_safe();
    
    %typemap(out) int is_it_safe "$result = ($1 != 0) ? Qtrue : Qfalse;";
    
    int is_it_safe();

    A better solution is to use the %predicate directive (unique to SWIG's Ruby module) to designate a method as a predicate method. For the previous example, this would look like:

    %predicate is_it_safe();
    
    int is_it_safe();

    This method would be invoked from Ruby code like this:

    irb(main):001:0> Example::is_it_safe?
    true

    The %predicate directive is implemented using SWIG's "features" mechanism and so the same name matching rules used for other kinds of features apply (see the chapter on "Customization Features") for more details).

    34.4.3 Bang Methods

    Ruby methods that modify an object in-place and end in an exclamation mark are known as bang methods. An example of a bang method is Array#sort! which changes the ordering of items in an array. Contrast this with Array#sort, which returns a copy of the array with the items sorted instead of modifying the original array. For consistency with Ruby conventions, methods that modify objects in place should be marked as bang methods.

    Bang methods can be marked using the %bang directive which is unique to the Ruby module and was introduced in SWIG 1.3.28. For example:

    %bang sort(int arr[]);
    
    int sort(int arr[]); 

    This method would be invoked from Ruby code like this:

    irb(main):001:0> Example::sort!(arr)

    The %bang directive is implemented using SWIG's "features" mechanism and so the same name matching rules used for other kinds of features apply (see the chapter on "Customization Features") for more details).

    34.4.4 Getters and Setters

    Often times a C++ library will expose properties through getter and setter methods. For example:

    class Foo {
      Foo() {}
      int getValue() { return value_; }
      void setValue(int value) { value_ = value; }
    
    private:
      int value_;
    };

    By default, SWIG will expose these methods to Ruby as get_value and set_value. However, it more natural for these methods to be exposed in Ruby as value and value=. That allows the methods to be used like this:

    irb(main):001:0> foo = Foo.new()
    irb(main):002:0> foo.value = 5
    irb(main):003:0> puts foo.value

    This can be done by using the %rename directive:

    %rename("value") Foo::getValue();
    %rename("value=") Foo::setValue(int value);

    34.5 Input and output parameters

    A common problem in some C programs is handling parameters passed as simple pointers. For example:

    void add(int x, int y, int *result) {
      *result = x + y;
    }

    or

    int sub(int *x, int *y) {
      return *x-*y;
    }

    The easiest way to handle these situations is to use the typemaps.i file. For example:

    %module Example
    %include "typemaps.i"
    
    void add(int, int, int *OUTPUT);
    int sub(int *INPUT, int *INPUT);

    In Ruby, this allows you to pass simple values. For example:

    a = Example.add(3, 4)
    puts a
    7
    b = Example.sub(7, 4)
    puts b
    3

    Notice how the INPUT parameters allow integer values to be passed instead of pointers and how the OUTPUT parameter creates a return result.

    If you don't want to use the names INPUT or OUTPUT, use the %apply directive. For example:

    %module Example
    %include "typemaps.i"
    
    %apply int *OUTPUT { int *result };
    %apply int *INPUT { int *x, int *y};
    
    void add(int x, int y, int *result);
    int sub(int *x, int *y);

    If a function mutates one of its parameters like this,

    void negate(int *x) {
     *x = -(*x);
    }

    you can use INOUT like this:

    %include "typemaps.i"
    ...
    void negate(int *INOUT);

    In Ruby, a mutated parameter shows up as a return value. For example:

    a = Example.negate(3)
    print a
    -3

    The most common use of these special typemap rules is to handle functions that return more than one value. For example, sometimes a function returns a result as well as a special error code:

    /* send message, return number of bytes sent, success code, and error_code */
    int send_message(char *text, int *success, int *error_code);

    To wrap such a function, simply use the OUTPUT rule above. For example:

    %module example
    %include "typemaps.i"
    ...
    int send_message(char *, int *OUTPUT, int *OUTPUT);

    When used in Ruby, the function will return an array of multiple values.

    bytes, success, error_code = send_message("Hello World")
    if not success
      print "error #{error_code} : in send_message"
    else
      print "Sent", bytes
    end

    Another way to access multiple return values is to use the %apply rule. In the following example, the parameters rows and columns are related to SWIG as OUTPUT values through the use of %apply

    %module Example
    %include "typemaps.i"
    %apply int *OUTPUT { int *rows, int *columns };
    ...
    void get_dimensions(Matrix *m, int *rows, int*columns);

    In Ruby:

    r, c = Example.get_dimensions(m)

    34.6 Exception handling

    34.6.1 Using the %exception directive

    The SWIG %exception directive can be used to define a user-definable exception handler that can convert C/C++ errors into Ruby exceptions. The chapter on Customization Features contains more details, but suppose you have a C++ class like the following :

    class DoubleArray {
    private:
      int n;
      double *ptr;
    public:
      // Create a new array of fixed size
      DoubleArray(int size) {
        ptr = new double[size];
        n = size;
      }
     
      // Destroy an array
      ~DoubleArray() {
        delete ptr;
      } 
     
      // Return the length of the array
      int length() {
        return n;
      }
     
      // Get an array item and perform bounds checking.
      double getitem(int i) {
        if ((i >= 0) && (i < n))
          return ptr[i];
        else
          throw RangeError();
      }
     
      // Set an array item and perform bounds checking.
      void setitem(int i, double val) {
        if ((i >= 0) && (i < n))
          ptr[i] = val;
        else {
          throw RangeError();
        }
      }
    };

    Since several methods in this class can throw an exception for an out-of-bounds access, you might want to catch this in the Ruby extension by writing the following in an interface file:

    %exception {
      try {
        $action
      }
      catch (const RangeError&) {
        static VALUE cpperror = rb_define_class("CPPError", rb_eStandardError);
        rb_raise(cpperror, "Range error.");
      }
    }
    
    class DoubleArray {
      ...
    };

    The exception handling code is inserted directly into generated wrapper functions. When an exception handler is defined, errors can be caught and used to gracefully raise a Ruby exception instead of forcing the entire program to terminate with an uncaught error.

    As shown, the exception handling code will be added to every wrapper function. Because this is somewhat inefficient, you might consider refining the exception handler to only apply to specific methods like this:

    %exception getitem {
      try {
        $action
      } catch (const RangeError&) {
        static VALUE cpperror = rb_define_class("CPPError", rb_eStandardError);
        rb_raise(cpperror, "Range error in getitem.");
      }
    }
     
    %exception setitem {
      try {
        $action
      } catch (const RangeError&) {
        static VALUE cpperror = rb_define_class("CPPError", rb_eStandardError);
        rb_raise(cpperror, "Range error in setitem.");
      }
    }

    In this case, the exception handler is only attached to methods and functions named getitem and setitem.

    Since SWIG's exception handling is user-definable, you are not limited to C++ exception handling. See the chapter on Customization Features for more examples.

    34.6.2 Handling Ruby Blocks

    One of the highlights of Ruby and most of its standard library is the use of blocks, which allow the easy creation of continuations and other niceties. Blocks in ruby are also often used to simplify the passing of many arguments to a class.

    In order to make your class constructor support blocks, you can take advantage of the %exception directive, which will get run after the C++ class' constructor was called.

    For example, this yields the class over after its construction:

    class Window
    {
    public:
      Window(int x, int y, int w, int h);
      // .... other methods here ....
    };
    
    // Add support for yielding self in the Class' constructor.
    %exception Window::Window {
      $action
      if (rb_block_given_p()) {
        rb_yield(self);
      }
    }

    Then, in ruby, it can be used like:

    Window.new(0, 0, 360, 480) { |w|
      w.color = Fltk::RED
      w.border = false
    }
    

    For other methods, you can usually use a dummy parameter with a special in typemap, like:

    //
    // original function was:
    //
    // void func(int x);
    
    %typemap(in, numinputs=0) int RUBY_YIELD_SELF {
      if ( !rb_block_given_p() )
        rb_raise("No block given");
      return rb_yield(self);
    }
    
    %extend {
      void func(int x, int RUBY_YIELD_SELF );
    }
    

    For more information on typemaps, see Typemaps.

    34.6.3 Raising exceptions

    There are three ways to raise exceptions from C++ code to Ruby.

    The first way is to use SWIG_exception(int code, const char *msg). The following table shows the mappings from SWIG error codes to Ruby exceptions:

    SWIG_MemoryError
    rb_eNoMemError
    SWIG_IOError
    rb_eIOError
    SWIG_RuntimeError
    rb_eRuntimeError
    SWIG_IndexError
    rb_eIndexError
    SWIG_TypeError
    rb_eTypeError
    SWIG_DivisionByZero
    rb_eZeroDivError
    SWIG_OverflowError
    rb_eRangeError
    SWIG_SyntaxError
    rb_eSyntaxError
    SWIG_ValueError
    rb_eArgError
    SWIG_SystemError
    rb_eFatal
    SWIG_AttributeError
    rb_eRuntimeError
    SWIG_NullReferenceError
    rb_eNullReferenceError*
    SWIG_ObjectPreviouslyDeletedError
    rb_eObjectPreviouslyDeleted*
    SWIG_UnknownError
    rb_eRuntimeError
    * These error classes are created by SWIG and are not built-in Ruby exception classes

    The second way to raise errors is to use SWIG_Raise(obj, type, desc). Obj is a C++ instance of an exception class, type is a string specifying the type of exception (for example, "MyError") and desc is the SWIG description of the exception class. For example:

    %raise(SWIG_NewPointerObj(e, SWIGTYPE_p_AssertionFailedException, 0), ":AssertionFailedException", SWIGTYPE_p_AssertionFailedException);
    

    This is useful when you want to pass the current exception object directly to Ruby, particularly when the object is an instance of class marked as an %exceptionclass (see the next section for more information).

    Last, you can raise an exception by directly calling Ruby's C api. This is done by invoking the rb_raise() function. The first argument passed to rb_raise() is the exception type. You can raise a custom exception type or one of the built-in Ruby exception types.

    34.6.4 Exception classes

    Starting with SWIG 1.3.28, the Ruby module supports the %exceptionclass directive, which is used to identify C++ classes that are used as exceptions. Classes that are marked with the %exceptionclass directive are exposed in Ruby as child classes of rb_eRuntimeError. This allows C++ exceptions to be directly mapped to Ruby exceptions, providing for a more natural integration between C++ code and Ruby code.

    %exceptionclass CustomError;
    
    %inline %{
      class CustomError { };
    
      class Foo { 
      public:
        void test() { throw CustomError; }
      };
    %}

    From Ruby you can now call this method like this:

    foo = Foo.new
    begin
      foo.test()
    rescue CustomError => e
      puts "Caught custom error"
    end 

    For another example look at swig/Examples/ruby/exception_class.

    34.7 Typemaps

    This section describes how you can modify SWIG's default wrapping behavior for various C/C++ datatypes using the %typemap directive. This is an advanced topic that assumes familiarity with the Ruby C API as well as the material in the "Typemaps" chapter.

    Before proceeding, it should be stressed that typemaps are not a required part of using SWIG---the default wrapping behavior is enough in most cases. Typemaps are only used if you want to change some aspect of the primitive C-Ruby interface.

    34.7.1 What is a typemap?

    A typemap is nothing more than a code generation rule that is attached to a specific C datatype. The general form of this declaration is as follows ( parts enclosed in [...] are optional ):

    %typemap( method [, modifiers...] ) typelist code;
    

    method is a simply a name that specifies what kind of typemap is being defined. It is usually a name like "in", "out", or "argout" (or its director variations). The purpose of these methods is described later.

    modifiers is an optional comma separated list of name="value" values. These are sometimes to attach extra information to a typemap and is often target-language dependent.

    typelist is a list of the C++ type patterns that the typemap will match. The general form of this list is as follows:

    typelist : typepattern [, typepattern, typepattern, ... ] ;
    
    typepattern : type [ (parms) ]
      | type name [ (parms) ]
      | ( typelist ) [ (parms) ]

    Each type pattern is either a simple type, a simple type and argument name, or a list of types in the case of multi-argument typemaps. In addition, each type pattern can be parameterized with a list of temporary variables (parms). The purpose of these variables will be explained shortly.

    code specifies the C code used in the typemap. It can take any one of the following forms:

    code : { ... }
      | " ... "
      | %{ ... %}

    For example, to convert integers from Ruby to C, you might define a typemap like this:

    %module example
    
    %typemap(in) int {
      $1 = (int) NUM2INT($input);
      printf("Received an integer : %d\n", $1);
    }
    
    %inline %{
      extern int fact(int n);
    %}

    Typemaps are always associated with some specific aspect of code generation. In this case, the "in" method refers to the conversion of input arguments to C/C++. The datatype int is the datatype to which the typemap will be applied. The supplied C code is used to convert values. In this code a number of special variables prefaced by a $ are used. The $1 variable is placeholder for a local variable of type int. The $input variable is the input Ruby object.

    When this example is compiled into a Ruby module, the following sample code:

    require 'example'
    
    puts Example.fact(6)

    prints the result:

    Received an integer : 6
    720
    

    In this example, the typemap is applied to all occurrences of the int datatype. You can refine this by supplying an optional parameter name. For example:

    %module example
    
    %typemap(in) int n {
      $1 = (int) NUM2INT($input);
      printf("n = %d\n", $1);
    }
    
    %inline %{
      extern int fact(int n);
    %}

    In this case, the typemap code is only attached to arguments that exactly match "int n".

    The application of a typemap to specific datatypes and argument names involves more than simple text-matching--typemaps are fully integrated into the SWIG type-system. When you define a typemap for int, that typemap applies to int and qualified variations such as const int. In addition, the typemap system follows typedef declarations. For example:

    %typemap(in) int n {
      $1 = (int) NUM2INT($input);
      printf("n = %d\n", $1);
    }
    
    typedef int Integer;
    extern int fact(Integer n); // Above typemap is applied

    However, the matching of typedef only occurs in one direction. If you defined a typemap for Integer, it is not applied to arguments of type int.

    Typemaps can also be defined for groups of consecutive arguments. For example:

    %typemap(in) (char *str, int len) {
      $1 = StringValuePtr($input);
      $2 = (int) RSTRING($input)->len;
    };
    
    int count(char c, char *str, int len);

    When a multi-argument typemap is defined, the arguments are always handled as a single Ruby object. This allows the function count to be used as follows (notice how the length parameter is omitted):

    puts Example.count('o', 'Hello World')
    2

    34.7.2 Typemap scope

    Once defined, a typemap remains in effect for all of the declarations that follow. A typemap may be redefined for different sections of an input file. For example:

    // typemap1
    %typemap(in) int {
      ...
    }
    
    int fact(int); // typemap1
    int gcd(int x, int y); // typemap1
    
    // typemap2
    %typemap(in) int {
      ...
    }
    
    int isprime(int); // typemap2

    One exception to the typemap scoping rules pertains to the %extend declaration. %extend is used to attach new declarations to a class or structure definition. Because of this, all of the declarations in an %extend block are subject to the typemap rules that are in effect at the point where the class itself is defined. For example:

    class Foo {
      ...
    };
    
    %typemap(in) int {
      ...
    }
    
    %extend Foo {
      int blah(int x); // typemap has no effect. Declaration is attached to Foo which 
      // appears before the %typemap declaration.
    };

    34.7.3 Copying a typemap

    A typemap is copied by using assignment. For example:

    %typemap(in) Integer = int;

    or this:

    %typemap(in) Integer, Number, int32_t = int;

    Types are often managed by a collection of different typemaps. For example:

    %typemap(in) int { ... }
    %typemap(out) int { ... }
    %typemap(varin) int { ... }
    %typemap(varout) int { ... }

    To copy all of these typemaps to a new type, use %apply. For example:

    %apply int { Integer }; // Copy all int typemaps to Integer
    %apply int { Integer, Number }; // Copy all int typemaps to both Integer and Number

    The patterns for %apply follow the same rules as for %typemap. For example:

    %apply int *output { Integer *output }; // Typemap with name
    %apply (char *buf, int len) { (char *buffer, int size) }; // Multiple arguments

    34.7.4 Deleting a typemap

    A typemap can be deleted by simply defining no code. For example:

    %typemap(in) int; // Clears typemap for int
    %typemap(in) int, long, short; // Clears typemap for int, long, short
    %typemap(in) int *output; 

    The %clear directive clears all typemaps for a given type. For example:

    %clear int; // Removes all types for int
    %clear int *output, long *output;

    Note: Since SWIG's default behavior is defined by typemaps, clearing a fundamental type like int will make that type unusable unless you also define a new set of typemaps immediately after the clear operation.

    34.7.5 Placement of typemaps

    Typemap declarations can be declared in the global scope, within a C++ namespace, and within a C++ class. For example:

    %typemap(in) int {
      ...
    }
    
    namespace std {
      class string;
      %typemap(in) string {
        ...
      }
    }
    
    class Bar {
    public:
      typedef const int & const_reference;
      %typemap(out) const_reference {
        ...
      }
    };

    When a typemap appears inside a namespace or class, it stays in effect until the end of the SWIG input (just like before). However, the typemap takes the local scope into account. Therefore, this code

    namespace std {
      class string;
      %typemap(in) string {
        ...
      }
    }

    is really defining a typemap for the type std::string. You could have code like this:

    namespace std {
      class string;
      %typemap(in) string { /* std::string */
      ...
      }
    }
    
    namespace Foo {
      class string;
      %typemap(in) string { /* Foo::string */
      ...
      }
    }

    In this case, there are two completely distinct typemaps that apply to two completely different types (std::string and Foo::string).

    It should be noted that for scoping to work, SWIG has to know that string is a typename defined within a particular namespace. In this example, this is done using the class declaration class string .

    34.7.6 Ruby typemaps

    The following list details all of the typemap methods that can be used by the Ruby module:

    34.7.6.1 "in" typemap

    Converts Ruby objects to input function arguments. For example:

    %typemap(in) int {
      $1 = NUM2INT($input);
    }

    The following special variables are available:

    $input Input object holding value to be converted.
    $symname Name of function/method being wrapped
    $1...n Argument being sent to the function
    $1_name Name of the argument (if provided)
    $1_type The actual C datatype matched by the typemap.
    $1_ltype The assignable version of the C datatype matched by the typemap.

    This is probably the most commonly redefined typemap because it can be used to implement customized conversions.

    In addition, the "in" typemap allows the number of converted arguments to be specified. For example:

    // Ignored argument.
    %typemap(in, numinputs=0) int *out (int temp) {
      $1 = &temp;
    }

    At this time, only zero or one arguments may be converted.

    34.7.6.2 "typecheck" typemap

    The "typecheck" typemap is used to support overloaded functions and methods. It merely checks an argument to see whether or not it matches a specific type. For example:

    %typemap(typecheck, precedence=SWIG_TYPECHECK_INTEGER) int {
      $1 = FIXNUM_P($input) ? 1 : 0;
    }

    For typechecking, the $1 variable is always a simple integer that is set to 1 or 0 depending on whether or not the input argument is the correct type.

    If you define new "in" typemaps and your program uses overloaded methods, you should also define a collection of "typecheck" typemaps. More details about this follow in a later section on "Typemaps and Overloading."

    34.7.6.3 "out" typemap

    Converts return value of a C function to a Ruby object.

    %typemap(out) int {
      $result = INT2NUM( $1 );
    }
    

    The following special variables are available.

    $result Result object returned to target language.
    $symname Name of function/method being wrapped
    $1...n Argument being wrapped
    $1_name Name of the argument (if provided)
    $1_type The actual C datatype matched by the typemap.
    $1_ltype The assignable version of the C datatype matched by the typemap.

    34.7.6.4 "arginit" typemap

    The "arginit" typemap is used to set the initial value of a function argument--before any conversion has occurred. This is not normally necessary, but might be useful in highly specialized applications. For example:

    // Set argument to NULL before any conversion occurs
    %typemap(arginit) int *data {
      $1 = NULL;
    }

    34.7.6.5 "default" typemap

    The "default" typemap is used to turn an argument into a default argument. For example:

    %typemap(default) int flags {
      $1 = DEFAULT_FLAGS;
    }
    ...
    int foo(int x, int y, int flags);

    The primary use of this typemap is to either change the wrapping of default arguments or specify a default argument in a language where they aren't supported (like C). Target languages that do not support optional arguments, such as Java and C#, effectively ignore the value specified by this typemap as all arguments must be given.

    Once a default typemap has been applied to an argument, all arguments that follow must have default values. See the Default/optional arguments section for further information on default argument wrapping.

    34.7.6.6 "check" typemap

    The "check" typemap is used to supply value checking code during argument conversion. The typemap is applied after arguments have been converted. For example:

    %typemap(check) int positive {
      if ($1 <= 0) {
        SWIG_exception(SWIG_ValueError, "Expected positive value.");
      }
    }

    34.7.6.7 "argout" typemap

    The "argout" typemap is used to return values from arguments. This is most commonly used to write wrappers for C/C++ functions that need to return multiple values. The "argout" typemap is almost always combined with an "in" typemap---possibly to ignore the input value. For example:

    /* Set the input argument to point to a temporary variable */
    %typemap(in, numinputs=0) int *out (int temp) {
      $1 = &temp;
    }
    
    %typemap(argout, fragment="output_helper") int *out {
      // Append output value $1 to $result (assuming a single integer in this case)
      $result = output_helper( $result, INT2NUM(*$1) );
    }

    The following special variables are available.

    $result Result object returned to target language.
    $input The original input object passed.
    $symname Name of function/method being wrapped.

    The code supplied to the "argout" typemap is always placed after the "out" typemap. If multiple return values are used, the extra return values are often appended to return value of the function.

    Output helper is a fragment that usually defines a macro to some function like SWIG_Ruby_AppendOutput.

    See the typemaps.i library for examples.

    34.7.6.8 "freearg" typemap

    The "freearg" typemap is used to cleanup argument data. It is only used when an argument might have allocated resources that need to be cleaned up when the wrapper function exits. The "freearg" typemap usually cleans up argument resources allocated by the "in" typemap. For example:

    // Get a list of integers
    %typemap(in) int *items {
      int nitems = Length($input); 
      $1 = (int *) malloc(sizeof(int)*nitems);
    }
    // Free the list 
    %typemap(freearg) int *items {
      free($1);
    }

    The "freearg" typemap inserted at the end of the wrapper function, just before control is returned back to the target language. This code is also placed into a special variable $cleanup that may be used in other typemaps whenever a wrapper function needs to abort prematurely.

    34.7.6.9 "newfree" typemap

    The "newfree" typemap is used in conjunction with the %newobject directive and is used to deallocate memory used by the return result of a function. For example:

    %typemap(newfree) string * {
      delete $1;
    }
    %typemap(out) string * {
      $result = PyString_FromString($1->c_str());
    }
    ...
    
    %newobject foo;
    ...
    string *foo();

    See Object ownership and %newobject for further details.

    34.7.6.10 "memberin" typemap

    The "memberin" typemap is used to copy data from an already converted input value into a structure member. It is typically used to handle array members and other special cases. For example:

    %typemap(memberin) int [4] {
      memmove($1, $input, 4*sizeof(int));
    }

    It is rarely necessary to write "memberin" typemaps---SWIG already provides a default implementation for arrays, strings, and other objects.

    34.7.6.11 "varin" typemap

    The "varin" typemap is used to convert objects in the target language to C for the purposes of assigning to a C/C++ global variable. This is implementation specific.

    34.7.6.12 "varout" typemap

    The "varout" typemap is used to convert a C/C++ object to an object in the target language when reading a C/C++ global variable. This is implementation specific.

    34.7.6.13 "throws" typemap

    The "throws" typemap is only used when SWIG parses a C++ method with an exception specification or has the %catches feature attached to the method. It provides a default mechanism for handling C++ methods that have declared the exceptions they will throw. The purpose of this typemap is to convert a C++ exception into an error or exception in the target language. It is slightly different to the other typemaps as it is based around the exception type rather than the type of a parameter or variable. For example:

    %typemap(throws) const char * %{
      rb_raise(rb_eRuntimeError, $1);
      SWIG_fail;
    %}
    void bar() throw (const char *);

    As can be seen from the generated code below, SWIG generates an exception handler with the catch block comprising the "throws" typemap content.

    ...
    try {
      bar();
    }
    catch(char const *_e) {
      rb_raise(rb_eRuntimeError, _e);
      SWIG_fail;
    }
    ...

    Note that if your methods do not have an exception specification yet they do throw exceptions, SWIG cannot know how to deal with them. For a neat way to handle these, see the Exception handling with %exception section.

    34.7.6.14 directorin typemap

    Converts C++ objects in director member functions to ruby objects. It is roughly the opposite of the "in" typemap, making its typemap rule often similar to the "out" typemap.

    %typemap(directorin) int {
      $result = INT2NUM($1);
    }
    

    The following special variables are available.

    $result Result object returned to target language.
    $symname Name of function/method being wrapped
    $1...n Argument being wrapped
    $1_name Name of the argument (if provided)
    $1_type The actual C datatype matched by the typemap.
    $1_ltype The assignable version of the C datatype matched by the typemap.
    this C++ this, referring to the class itself.

    34.7.6.15 directorout typemap

    Converts Ruby objects in director member functions to C++ objects. It is roughly the opposite of the "out" typemap, making its rule often similar to the "in" typemap.

    %typemap(directorout) int {
      $result = NUM2INT($1);
    }
    

    The following special variables are available:

    $input Ruby object being sent to the function
    $symname Name of function/method being wrapped
    $1...n Argument being sent to the function
    $1_name Name of the argument (if provided)
    $1_type The actual C datatype matched by the typemap.
    $1_ltype The assignable version of the C datatype matched by the typemap.
    this C++ this, referring to the class itself.

    Currently, the directorout nor the out typemap support the option numoutputs, but the Ruby module provides that functionality through a %feature directive. Thus, a function can be made to return "nothing" if you do:

    %feature("numoutputs", "0") MyClass::function;
    

    This feature can be useful if a function returns a status code, which you want to discard but still use the typemap to raise an exception.

    34.7.6.16 directorargout typemap

    Output argument processing in director member functions.

    %typemap(directorargout,
    fragment="output_helper") int {
      $result = output_helper( $result, NUM2INT($1) );
    }
    

    The following special variables are available:

    $result Result that the director function returns
    $input Ruby object being sent to the function
    $symname name of the function/method being wrapped
    $1...n Argument being sent to the function
    $1_name Name of the argument (if provided)
    $1_type The actual C datatype matched by the typemap
    $1_ltype The assignable version of the C datatype matched by the typemap
    this C++ this, referring to the instance of the class itself

    34.7.6.17 ret typemap

    Cleanup of function return values

    34.7.6.18 globalin typemap

    Setting of C global variables

    34.7.7 Typemap variables

    Within a typemap, a number of special variables prefaced with a $ may appear. A full list of variables can be found in the "Typemaps" chapter. This is a list of the most common variables:

    $1

    A C local variable corresponding to the actual type specified in the %typemap directive. For input values, this is a C local variable that is supposed to hold an argument value. For output values, this is the raw result that is supposed to be returned to Ruby.

    $input

    A VALUE holding a raw Ruby object with an argument or variable value.

    $result

    A VALUE that holds the result to be returned to Ruby.

    $1_name

    The parameter name that was matched.

    $1_type

    The actual C datatype matched by the typemap.

    $1_ltype

    An assignable version of the datatype matched by the typemap (a type that can appear on the left-hand-side of a C assignment operation). This type is stripped of qualifiers and may be an altered version of $1_type. All arguments and local variables in wrapper functions are declared using this type so that their values can be properly assigned.

    $symname

    The Ruby name of the wrapper function being created.

    34.7.8 Useful Functions

    When you write a typemap, you usually have to work directly with Ruby objects. The following functions may prove to be useful. (These functions plus many more can be found in Programming Ruby book, by David Thomas and Andrew Hunt.)

    In addition, we list equivalent functions that SWIG defines, which provide a language neutral conversion (these functions are defined for each swig language supported). If you are trying to create a swig file that will work under multiple languages, it is recommended you stick to the swig functions instead of the native Ruby functions. That should help you avoid having to rewrite a lot of typemaps across multiple languages.

    34.7.8.1 C Datatypes to Ruby Objects

    RUBY SWIG
    INT2NUM(long or int) SWIG_From_int(int x) int to Fixnum or Bignum
    INT2FIX(long or int) int to Fixnum (faster than INT2NUM)
    CHR2FIX(char) SWIG_From_char(char x) char to Fixnum
    rb_str_new2(char*) SWIG_FromCharPtrAndSize(char*, size_t) char* to String
    rb_float_new(double) SWIG_From_double(double),
    SWIG_From_float(float)
    float/double to Float

    34.7.8.2 Ruby Objects to C Datatypes

    Here, while the Ruby versions return the value directly, the SWIG versions do not, but return a status value to indicate success (SWIG_OK). While more awkward to use, this allows you to write typemaps that report more helpful error messages, like:

    %typemap(in) size_t (int ok)
      ok = SWIG_AsVal_size_t($input, &$1);
      if (!SWIG_IsOK(ok)) {
        SWIG_exception_fail(SWIG_ArgError(ok), Ruby_Format_TypeError( "$1_name", "$1_type", "$symname", $argnum, $input));
      }
    }
    
    int NUM2INT(Numeric) SWIG_AsVal_int(VALUE, int*)
    int FIX2INT(Numeric) SWIG_AsVal_int(VALUE, int*)
    unsigned int NUM2UINT(Numeric) SWIG_AsVal_unsigned_SS_int(VALUE, int*)
    unsigned int FIX2UINT(Numeric) SWIG_AsVal_unsigned_SS_int(VALUE, int*)
    long NUM2LONG(Numeric) SWIG_AsVal_long(VALUE, long*)
    long FIX2LONG(Numeric) SWIG_AsVal_long(VALUE, long*)
    unsigned long FIX2ULONG(Numeric) SWIG_AsVal_unsigned_SS_long(VALUE, unsigned long*)
    char NUM2CHR(Numeric or String) SWIG_AsVal_char(VALUE, int*)
    char * StringValuePtr(String) SWIG_AsCharPtrAndSize(VALUE, char*, size_t, int* alloc)
    char * rb_str2cstr(String, int*length)
    double NUM2DBL(Numeric) (double) SWIG_AsVal_int(VALUE) or similar

    34.7.8.3 Macros for VALUE

    RSTRING_LEN(str)

    length of the Ruby string

    RSTRING_PTR(str)

    pointer to string storage

    RARRAY_LEN(arr)

    length of the Ruby array

    RARRAY(arr)->capa

    capacity of the Ruby array

    RARRAY_PTR(arr)

    pointer to array storage

    34.7.8.4 Exceptions

    void rb_raise(VALUE exception, const char *fmt, ...)

    Raises an exception. The given format string fmt and remaining arguments are interpreted as with printf().

    void rb_fatal(const char *fmt, ...)

    Raises a fatal exception, terminating the process. No rescue blocks are called, but ensure blocks will be called. The given format string fmt and remaining arguments are interpreted as with printf().

    void rb_bug(const char *fmt, ...)

    Terminates the process immediately -- no handlers of any sort will be called. The given format string fmt and remaining arguments are interpreted as with printf(). You should call this function only if a fatal bug has been exposed.

    void rb_sys_fail(const char *msg)

    Raises a platform-specific exception corresponding to the last known system error, with the given string msg.

    VALUE rb_rescue(VALUE (*body)(VALUE), VALUE args, VALUE(*rescue)(VALUE, VALUE), VALUE rargs)

    Executes body with the given args. If a StandardError exception is raised, then execute rescue with the given rargs.

    VALUE rb_ensure(VALUE(*body)(VALUE), VALUE args, VALUE(*ensure)(VALUE), VALUE eargs)

    Executes body with the given args. Whether or not an exception is raised, execute ensure with the given rargs after body has completed.

    VALUE rb_protect(VALUE (*body)(VALUE), VALUE args, int *result)

    Executes body with the given args and returns nonzero in result if any exception was raised.

    void rb_notimplement()

    Raises a NotImpError exception to indicate that the enclosed function is not implemented yet, or not available on this platform.

    void rb_exit(int status)

    Exits Ruby with the given status. Raises a SystemExit exception and calls registered exit functions and finalizers.

    void rb_warn(const char *fmt, ...)

    Unconditionally issues a warning message to standard error. The given format string fmt and remaining arguments are interpreted as with printf().

    void rb_warning(const char *fmt, ...)

    Conditionally issues a warning message to standard error if Ruby was invoked with the -w flag. The given format string fmt and remaining arguments are interpreted as with printf().

    34.7.8.5 Iterators

    void rb_iter_break()

    Breaks out of the enclosing iterator block.

    VALUE rb_each(VALUE obj)

    Invokes the each method of the given obj.

    VALUE rb_yield(VALUE arg)

    Transfers execution to the iterator block in the current context, passing arg as an argument. Multiple values may be passed in an array.

    int rb_block_given_p()

    Returns true if yield would execute a block in the current context; that is, if a code block was passed to the current method and is available to be called.

    VALUE rb_iterate(VALUE (*method)(VALUE), VALUE args, VALUE (*block)(VALUE, VALUE), VALUE arg2)

    Invokes method with argument args and block block. A yield from that method will invoke block with the argument given to yield, and a second argument arg2.

    VALUE rb_catch(const char *tag, VALUE (*proc)(VALUE, VALUE), VALUE value)

    Equivalent to Ruby's catch.

    void rb_throw(const char *tag, VALUE value)

    Equivalent to Ruby's throw.

    34.7.9 Typemap Examples

    This section includes a few examples of typemaps. For more examples, you might look at the examples in the Example/ruby directory.

    34.7.10 Converting a Ruby array to a char **

    A common problem in many C programs is the processing of command line arguments, which are usually passed in an array of NULL terminated strings. The following SWIG interface file allows a Ruby Array instance to be used as a char ** object.

    %module argv
    
    // This tells SWIG to treat char ** as a special case
    %typemap(in) char ** {
      /* Get the length of the array */
      int size = RARRAY($input)->len; 
      int i;
      $1 = (char **) malloc((size+1)*sizeof(char *));
      /* Get the first element in memory */
      VALUE *ptr = RARRAY($input)->ptr; 
      for (i=0; i < size; i++, ptr++) {
        /* Convert Ruby Object String to char* */
        $1[i]= StringValuePtr(*ptr); 
      }
      $1[i]=NULL; /* End of list */
    }
    
    // This cleans up the char ** array created before 
    // the function call
    
    %typemap(freearg) char ** {
      free((char *) $1);
    }
    
    // Now a test function
    %inline %{
    int print_args(char **argv) {
      int i = 0;
      while (argv[i]) {
        printf("argv[%d] = %s\n", i, argv[i]);
        i++;
      }
      return i;
    }
    %}

    When this module is compiled, the wrapped C function now operates as follows :

    require 'Argv'
    Argv.print_args(["Dave", "Mike", "Mary", "Jane", "John"])
    argv[0] = Dave
    argv[1] = Mike
    argv[2] = Mary
    argv[3] = Jane
    argv[4] = John

    In the example, two different typemaps are used. The "in" typemap is used to receive an input argument and convert it to a C array. Since dynamic memory allocation is used to allocate memory for the array, the "freearg" typemap is used to later release this memory after the execution of the C function.

    34.7.11 Collecting arguments in a hash

    Ruby's solution to the "keyword arguments" capability of some other languages is to allow the programmer to pass in one or more key-value pairs as arguments to a function. All of those key-value pairs are collected in a single Hash argument that's presented to the function. If it makes sense, you might want to provide similar functionality for your Ruby interface. For example, suppose you'd like to wrap this C function that collects information about people's vital statistics:

    void setVitalStats(const char *person, int nattributes, const char **names, int *values);

    and you'd like to be able to call it from Ruby by passing in an arbitrary number of key-value pairs as inputs, e.g.

    setVitalStats("Fred", 
      'weight' => 270, 
      'age' => 42 
    )

    To make this work, you need to write a typemap that expects a Ruby Hash as its input and somehow extracts the last three arguments (nattributes, names and values) needed by your C function. Let's start with the basics:

    %typemap(in) (int nattributes, const char **names, const int *values)
      (VALUE keys_arr, int i, VALUE key, VALUE val) {
    }
     

    This %typemap directive tells SWIG that we want to match any function declaration that has the specified types and names of arguments somewhere in the argument list. The fact that we specified the argument names (nattributes, names and values) in our typemap is significant; this ensures that SWIG won't try to apply this typemap to other functions it sees that happen to have a similar declaration with different argument names. The arguments that appear in the second set of parentheses (keys_arr, i, key and val) define local variables that our typemap will need.

    Since we expect the input argument to be a Hash, let's next add a check for that:

    %typemap(in) (int nattributes, const char **names, const int *values)
      (VALUE keys_arr, int i, VALUE key, VALUE val) {
        Check_Type($input, T_HASH);
    }

    Check_Type() is just a macro (defined in the Ruby header files) that confirms that the input argument is of the correct type; if it isn't, an exception will be raised.

    The next task is to determine how many key-value pairs are present in the hash; we'll assign this number to the first typemap argument ($1). This is a little tricky since the Ruby/C API doesn't provide a public function for querying the size of a hash, but we can get around that by calling the hash's size method directly and converting its result to a C int value:

    %typemap(in) (int nattributes, const char **names, const int *values)
      (VALUE keys_arr, int i, VALUE key, VALUE val) {
        Check_Type($input, T_HASH);
        $1 = NUM2INT(rb_funcall($input, rb_intern("size"), 0, Qnil));
    }

    So now we know the number of attributes. Next we need to initialize the second and third typemap arguments (i.e. the two C arrays) to NULL and set the stage for extracting the keys and values from the hash:

    %typemap(in) (int nattributes, const char **names, const int *values)
      (VALUE keys_arr, int i, VALUE key, VALUE val) {
        Check_Type($input, T_HASH);
        $1 = NUM2INT(rb_funcall($input, rb_intern("size"), 0, Qnil));
        $2 = NULL;
        $3 = NULL;
        if ($1 > 0) {
          $2 = (char **) malloc($1*sizeof(char *));
          $3 = (int *) malloc($1*sizeof(int));
        }
    }

    There are a number of ways we could extract the keys and values from the input hash, but the simplest approach is to first call the hash's keys method (which returns a Ruby array of the keys) and then start looping over the elements in that array:

    %typemap(in) (int nattributes, const char **names, const int *values)
      (VALUE keys_arr, int i, VALUE key, VALUE val) {
        Check_Type($input, T_HASH);
        $1 = NUM2INT(rb_funcall($input, rb_intern("size"), 0, Qnil));
        $2 = NULL;
        $3 = NULL;
        if ($1 > 0) {
          $2 = (char **) malloc($1*sizeof(char *));
          $3 = (int *) malloc($1*sizeof(int));
          keys_arr = rb_funcall($input, rb_intern("keys"), 0, Qnil);
          for (i = 0; i < $1; i++) {
          }
        }
    }

    Recall that keys_arr and i are local variables for this typemap. For each element in the keys_arr array, we want to get the key itself, as well as the value corresponding to that key in the hash:

    %typemap(in) (int nattributes, const char **names, const int *values)
      (VALUE keys_arr, int i, VALUE key, VALUE val) {
        Check_Type($input, T_HASH);
        $1 = NUM2INT(rb_funcall($input, rb_intern("size"), 0, Qnil));
        $2 = NULL;
        $3 = NULL;
        if ($1 > 0) {
          $2 = (char **) malloc($1*sizeof(char *));
          $3 = (int *) malloc($1*sizeof(int));
          keys_arr = rb_funcall($input, rb_intern("keys"), 0, Qnil);
          for (i = 0; i < $1; i++) {
            key = rb_ary_entry(keys_arr, i);
            val = rb_hash_aref($input, key);
          }
        }
    }

    To be safe, we should again use the Check_Type() macro to confirm that the key is a String and the value is a Fixnum:

    %typemap(in) (int nattributes, const char **names, const int *values)
      (VALUE keys_arr, int i, VALUE key, VALUE val) {
        Check_Type($input, T_HASH);
        $1 = NUM2INT(rb_funcall($input, rb_intern("size"), 0, Qnil));
        $2 = NULL;
        $3 = NULL;
        if ($1 > 0) {
          $2 = (char **) malloc($1*sizeof(char *));
          $3 = (int *) malloc($1*sizeof(int));
          keys_arr = rb_funcall($input, rb_intern("keys"), 0, Qnil);
          for (i = 0; i < $1; i++) {
            key = rb_ary_entry(keys_arr, i);
            val = rb_hash_aref($input, key);
            Check_Type(key, T_STRING);
            Check_Type(val, T_FIXNUM);
          }
        }
    }

    Finally, we can convert these Ruby objects into their C equivalents and store them in our local C arrays:

    %typemap(in) (int nattributes, const char **names, const int *values)
      (VALUE keys_arr, int i, VALUE key, VALUE val) {
      Check_Type($input, T_HASH);
      $1 = NUM2INT(rb_funcall($input, rb_intern("size"), 0, Qnil));
      $2 = NULL;
      $3 = NULL;
      if ($1 > 0) {
        $2 = (char **) malloc($1*sizeof(char *));
        $3 = (int *) malloc($1*sizeof(int));
        keys_arr = rb_funcall($input, rb_intern("keys"), 0, Qnil);
        for (i = 0; i < $1; i++) {
          key = rb_ary_entry(keys_arr, i);
          val = rb_hash_aref($input, key);
          Check_Type(key, T_STRING);
          Check_Type(val, T_FIXNUM);
          $2[i] = StringValuePtr(key);
          $3[i] = NUM2INT(val);
        }
      }
    }

    We're not done yet. Since we used malloc() to dynamically allocate the memory used for the names and values arguments, we need to provide a corresponding "freearg" typemap to free that memory so that there is no memory leak. Fortunately, this typemap is a lot easier to write:

    %typemap(freearg) (int nattributes, const char **names, const int *values) {
      free((void *) $2);
      free((void *) $3);
    }

    All of the code for this example, as well as a sample Ruby program that uses the extension, can be found in the Examples/ruby/hashargs directory of the SWIG distribution.

    34.7.12 Pointer handling

    Occasionally, it might be necessary to convert pointer values that have been stored using the SWIG typed-pointer representation. Since there are several ways in which pointers can be represented, the following two functions are used to safely perform this conversion:

    int SWIG_ConvertPtr(VALUE obj, void **ptr, swig_type_info *ty, int flags)

    Converts a Ruby object obj to a C pointer whose address is ptr (i.e. ptr is a pointer to a pointer). The third argument, ty, is a pointer to a SWIG type descriptor structure. If ty is not NULL, that type information is used to validate type compatibility and other aspects of the type conversion. If flags is non-zero, any type errors encountered during this validation result in a Ruby TypeError exception being raised; if flags is zero, such type errors will cause SWIG_ConvertPtr() to return -1 but not raise an exception. If ty is NULL, no type-checking is performed.

    VALUE SWIG_NewPointerObj(void *ptr, swig_type_info *ty, int own)

    Creates a new Ruby pointer object. Here, ptr is the pointer to convert, ty is the SWIG type descriptor structure that describes the type, and own is a flag that indicates whether or not Ruby should take ownership of the pointer (i.e. whether Ruby should free this data when the corresponding Ruby instance is garbage-collected).

    Both of these functions require the use of a special SWIG type-descriptor structure. This structure contains information about the mangled name of the datatype, type-equivalence information, as well as information about converting pointer values under C++ inheritance. For a type of Foo *, the type descriptor structure is usually accessed as follows:

    Foo *foo;
    SWIG_ConvertPtr($input, (void **) &foo, SWIGTYPE_p_Foo, 1);
    
    VALUE obj;
    obj = SWIG_NewPointerObj(f, SWIGTYPE_p_Foo, 0);

    In a typemap, the type descriptor should always be accessed using the special typemap variable $1_descriptor. For example:

    %typemap(in) Foo * {
      SWIG_ConvertPtr($input, (void **) &$1, $1_descriptor, 1);
    }

    34.7.12.1 Ruby Datatype Wrapping

    VALUE Data_Wrap_Struct(VALUE class, void (*mark)(void *), void (*free)(void *), void *ptr)

    Given a pointer ptr to some C data, and the two garbage collection routines for this data (mark and free), return a VALUE for the Ruby object.

    VALUE Data_Make_Struct(VALUE class, c-type, void (*mark)(void *), void (*free)(void *), c-type *ptr)

    Allocates a new instance of a C data type c-type, assigns it to the pointer ptr, then wraps that pointer with Data_Wrap_Struct() as above.

    Data_Get_Struct(VALUE obj, c-type, c-type *ptr)

    Retrieves the original C pointer of type c-type from the data object obj and assigns that pointer to ptr.

    34.7.13 Example: STL Vector to Ruby Array

    Another use for macros and type maps is to create a Ruby array from a STL vector of pointers. In essence, copy of all the pointers in the vector into a Ruby array. The use of the macro is to make the typemap so generic that any vector with pointers can use the type map. The following is an example of how to construct this type of macro/typemap and should give insight into constructing similar typemaps for other STL structures:

    %define PTR_VECTOR_TO_RUBY_ARRAY(vectorclassname, classname)
    %typemap(out) vectorclassname &, const vectorclassname & {
      VALUE arr = rb_ary_new2($1->size());
      vectorclassname::iterator i = $1->begin(), iend = $1->end();
      for ( ; i!=iend; i++ )
        rb_ary_push(arr, Data_Wrap_Struct(c ## classname.klass, 0, 0, *i));
      $result = arr;
    }
    %typemap(out) vectorclassname, const vectorclassname {
      VALUE arr = rb_ary_new2($1.size());
      vectorclassname::iterator i = $1.begin(), iend = $1.end();
      for ( ; i!=iend; i++ )
        rb_ary_push(arr, Data_Wrap_Struct(c ## classname.klass, 0, 0, *i));
      $result = arr;
    }
    %enddef

    Note, that the "c ## classname.klass" is used in the preprocessor step to determine the actual object from the class name.

    To use the macro with a class Foo, the following is used:

    PTR_VECTOR_TO_RUBY_ARRAY(vector<foo *="">, Foo)

    It is also possible to create a STL vector of Ruby objects:

    %define RUBY_ARRAY_TO_PTR_VECTOR(vectorclassname, classname)
    %typemap(in) vectorclassname &, const vectorclassname & {
      Check_Type($input, T_ARRAY);
      vectorclassname *vec = new vectorclassname;
      int len = RARRAY($input)->len;
      for (int i=0; i!=len; i++) {
        VALUE inst = rb_ary_entry($input, i);
        //The following _should_ work but doesn't on HPUX
        // Check_Type(inst, T_DATA);
        classname *element = NULL;
        Data_Get_Struct(inst, classname, element);
        vec->push_back(element);
      }
      $1 = vec;
    }
    
    %typemap(freearg) vectorclassname &, const vectorclassname & {
      delete $1;
    }
    %enddef

    It is also possible to create a Ruby array from a vector of static data types:

    %define VECTOR_TO_RUBY_ARRAY(vectorclassname, classname)
    %typemap(out) vectorclassname &, const vectorclassname & {
      VALUE arr = rb_ary_new2($1->size()); 
      vectorclassname::iterator i = $1->begin(), iend = $1->end();
      for ( ; i!=iend; i++ )
        rb_ary_push(arr, Data_Wrap_Struct(c ## classname.klass, 0, 0, &(*i)));
      $result = arr;
    }
    %typemap(out) vectorclassname, const vectorclassname {
      VALUE arr = rb_ary_new2($1.size()); 
      vectorclassname::iterator i = $1.begin(), iend = $1.end();
      for ( ; i!=iend; i++ )
        rb_ary_push(arr, Data_Wrap_Struct(c ## classname.klass, 0, 0, &(*i)));
      $result = arr;
    }
    %enddef
    Note that this is mostly an example of typemaps. If you want to use the STL with ruby, you are advised to use the standard swig STL library, which does much more than this. Refer to the section called the C++ Standard Template Library.

    34.8 Docstring Features

    Using ri and rdoc web pages in Ruby libraries is a common practice. Given the way that SWIG generates the extensions by default, your users will normally not get any documentation for it, even if they run 'rdoc' on the resulting .c or .cxx file.

    The features described in this section make it easy for you to add rdoc strings to your modules, functions and methods that can then be read by Ruby's rdoc tool to generate html web pages, ri documentation, Windows chm file and an .xml description.

    rdoc can then be run from a console or shell window on a swig generated file.

    For example, to generate html web pages from a C++ file, you'd do:

    $ rdoc -E cxx=c -f html file_wrap.cxx
    

    To generate ri documentation from a c wrap file, you could do:

    $ rdoc -r file_wrap.c
    

    34.8.1 Module docstring

    Ruby allows a docstring at the beginning of the file before any other statements, and it is typically used to give a general description of the entire module. SWIG supports this by setting an option of the %module directive. For example:

    %module(docstring="This is the example module's docstring") example

    When you have more than just a line or so then you can retain the easy readability of the %module directive by using a macro. For example:

    %define DOCSTRING
    "The `XmlResource` class allows program resources defining menus, 
    layout of controls on a panel, etc. to be loaded from an XML file."
    %enddef
    
    %module(docstring=DOCSTRING) xrc

    34.8.2 %feature("autodoc")

    Since SWIG does know everything about the function it wraps, it is possible to generate an rdoc containing the parameter types, names and default values. Since Ruby ships with one of the best documentation systems of any language, it makes sense to take advantage of it.

    SWIG's Ruby module provides support for the "autodoc" feature, which when attached to a node in the parse tree will cause an rdoc comment to be generated in the wrapper file that includes the name of the function, parameter names, default values if any, and return type if any. There are also several options for autodoc controlled by the value given to the feature, described below.

    34.8.2.1 %feature("autodoc", "0")

    When the "0" option is given then the types of the parameters will not be included in the autodoc string. For example, given this function prototype:

    %feature("autodoc", "0");
    bool function_name(int x, int y, Foo* foo=NULL, Bar* bar=NULL);

    Then Ruby code like this will be generated:

    function_name(x, y, foo=nil, bar=nil) -> bool
      ...

    34.8.2.2 %feature("autodoc", "1")

    When the "1" option is used then the parameter types will be used in the rdoc string. In addition, an attempt is made to simplify the type name such that it makes more sense to the Ruby user. Pointer, reference and const info is removed, %rename's are evaluated, etc. (This is not always successful, but works most of the time. See the next section for what to do when it doesn't.) Given the example above, then turning on the parameter types with the "1" option will result in rdoc code like this:

    function_name(int x, int y, Foo foo=nil, Bar bar=nil) -> bool
      ...

    34.8.2.3 %feature("autodoc", "2")

    When the "2" option is used then the parameter types will not be used in the rdoc string. However, they will be listed in full after the function. Given the example above, then turning on the parameter types with the "2" option will result in Ruby code like this:

    34.8.2.4 %feature("autodoc", "3")

    When the "3" option is used then the function will be documented using a combination of "1" and "2" above. Given the example above, then turning on the parameter types with the "2" option will result in Ruby code like this:

    function_name(int x, int y, Foo foo=nil, Bar bar=nil) -> bool
    
    Parameters:
            x - int
            y - int
            foo - Foo
            bar - Bar

    34.8.2.5 %feature("autodoc", "docstring")

    Finally, there are times when the automatically generated autodoc string will make no sense for a Ruby programmer, particularly when a typemap is involved. So if you give an explicit value for the autodoc feature then that string will be used in place of the automatically generated string. For example:

    %feature("autodoc", "GetPosition() -> (x, y)") GetPosition;
    void GetPosition(int* OUTPUT, int* OUTPUT);

    34.8.3 %feature("docstring")

    In addition to the autodoc strings described above, you can also attach any arbitrary descriptive text to a node in the parse tree with the "docstring" feature. When the proxy module is generated then any docstring associated with classes, function or methods are output. If an item already has an autodoc string then it is combined with the docstring and they are output together.

    34.9 Advanced Topics

    34.9.1 Operator overloading

    SWIG allows operator overloading with, by using the %extend or %rename commands in SWIG and the following operator names (derived from Python):

    General
    __repr__ inspect
    __str__ to_s
    __cmp__ <=>
    __hash__ hash
    __nonzero__ nonzero?
    Callable
    __call__ call
    Collection
    __len__ length
    __getitem__ []
    __setitem__ []=
    Numeric
    __add__ +
    __sub__ -
    __mul__ *
    __div__ /
    __mod__ %
    __divmod__ divmod
    __pow__ **
    __lshift__ <<
    __rshift__ >>
    __and__ &
    __xor__ ^
    __or__ |
    __neg__ -@
    __pos__ +@
    __abs__ abs
    __invert__ ~
    __int__ to_i
    __float__ to_f
    __coerce__ coerce
    Additions in 1.3.13
    __lt__ <
    __le__ <=
    __eq__ ==
    __gt__ >
    __ge__ >=

    Note that although SWIG supports the __eq__ magic method name for defining an equivalence operator, there is no separate method for handling inequality since Ruby parses the expression a != b as !(a == b).

    34.9.2 Creating Multi-Module Packages

    The chapter on Working with Modules discusses the basics of creating multi-module extensions with SWIG, and in particular the considerations for sharing runtime type information among the different modules.

    As an example, consider one module's interface file (shape.i) that defines our base class:

    %module shape
    
    %{
    #include "Shape.h"
    %}
    
    class Shape {
    protected:
      double xpos;
      double ypos;
    protected:
      Shape(double x, double y);
    public:
      double getX() const;
      double getY() const;
    };

    We also have a separate interface file (circle.i) that defines a derived class:

    %module circle
    
    %{
    #include "Shape.h"
    #include "Circle.h"
    %}
    
    // Import the base class definition from Shape module
    %import shape.i
    
    class Circle : public Shape {
    protected:
      double radius;
    public:
      Circle(double x, double y, double r);
      double getRadius() const;
    };

    We'll start by building the Shape extension module:

    $ swig -c++ -ruby shape.i
    

    SWIG generates a wrapper file named shape_wrap.cxx. To compile this into a dynamically loadable extension for Ruby, prepare an extconf.rb script using this template:

    require 'mkmf'
    
    # Since the SWIG runtime support library for Ruby
    # depends on the Ruby library, make sure it's in the list
    # of libraries.
    $libs = append_library($libs, Config::CONFIG['RUBY_INSTALL_NAME'])
    
    # Create the makefile
    create_makefile('shape')

    Run this script to create a Makefile and then type make to build the shared library:

    $ ruby extconf.rb
    creating Makefile
    $ make
    g++ -fPIC -g -O2 -I. -I/usr/include/ruby-2.1.0 \
    -I. -c shape_wrap.cxx
    gcc -shared -L/usr/local/lib -o shape.so shape_wrap.o -L. \
    -lruby -lruby -lc

    Note that depending on your installation, the outputs may be slightly different; these outputs are those for a Linux-based development environment. The end result should be a shared library (here, shape.so) containing the extension module code. Now repeat this process in a separate directory for the Circle module:

    1. Run SWIG to generate the wrapper code (circle_wrap.cxx);
    2. Write an extconf.rb script that your end-users can use to create a platform-specific Makefile for the extension;
    3. Build the shared library for this extension by typing make.

    Once you've built both of these extension modules, you can test them interactively in IRB to confirm that the Shape and Circle modules are properly loaded and initialized:

    $ irb
    irb(main):001:0> require 'shape'
    true
    irb(main):002:0> require 'circle'
    true
    irb(main):003:0> c = Circle::Circle.new(5, 5, 20)
    #<Circle::Circle:0xa097208>
    irb(main):004:0> c.kind_of? Shape::Shape
    true
    irb(main):005:0> c.getX()
    5.0

    34.9.3 Specifying Mixin Modules

    The Ruby language doesn't support multiple inheritance, but it does allow you to mix one or more modules into a class using Ruby's include method. For example, if you have a Ruby class that defines an each instance method, e.g.

    class Set
      def initialize
      @members = []
      end
     
      def each
      @members.each { |m| yield m }
      end
    end

    then you can mix-in Ruby's Enumerable module to easily add a lot of functionality to your class:

    class Set
      include Enumerable
      def initialize
        @members = []
      end
      def each
        @members.each { |m| yield m }
      end
    end

    To get the same benefit for your SWIG-wrapped classes, you can use the %mixin directive to specify the names of one or more modules that should be mixed-in to a class. For the above example, the SWIG interface specification might look like this:

    %mixin Set "Enumerable";
    
    class Set {
    public:
      // Constructor
      Set();
     
      // Iterates through set members
      void each();
    };

    Multiple modules can be mixed into a class by providing a comma-separated list of module names to the %mixin directive, e.g.

    %mixin Set "Fee, Fi, Fo, Fum";

    Note that the %mixin directive is implemented using SWIG's "features" mechanism and so the same name matching rules used for other kinds of features apply (see the chapter on "Customization Features") for more details).

    34.10 Memory Management

    One of the most common issues in generating SWIG bindings for Ruby is proper memory management. The key to proper memory management is clearly defining whether a wrapper Ruby object owns the underlying C struct or C++ class. There are two possibilities:

    • The Ruby object is responsible for freeing the C struct or C++ object
    • The Ruby object should not free the C struct or C++ object because it will be freed by the underlying C or C++ code

    To complicate matters, object ownership may transfer from Ruby to C++ (or vice versa) depending on what function or methods are invoked. Clearly, developing a SWIG wrapper requires a thorough understanding of how the underlying library manages memory.

    34.10.1 Mark and Sweep Garbage Collector

    Ruby uses a mark and sweep garbage collector. When the garbage collector runs, it finds all the "root" objects, including local variables, global variables, global constants, hardware registers and the C stack. For each root object, the garbage collector sets its mark flag to true and calls rb_gc_mark on the object. The job of rb_gc_mark is to recursively mark all the objects that a Ruby object has a reference to (ignoring those objects that have already been marked). Those objects, in turn, may reference other objects. This process will continue until all active objects have been "marked." After the mark phase comes the sweep phase. In the sweep phase, all objects that have not been marked will be garbage collected.

    The Ruby C/API provides extension developers two hooks into the garbage collector - a "mark" function and a "sweep" function. By default these functions are set to NULL.

    If a C struct or C++ class references any other Ruby objects, then it must provide a "mark" function. The "mark" function should identify any referenced Ruby objects by calling the rb_gc_mark function for each one. Unsurprisingly, this function will be called by the Ruby garbage during the "mark" phase.

    During the sweep phase, Ruby destroys any unused objects. If any memory has been allocated in creating the underlying C struct or C++ struct, then a "free" function must be defined that deallocates this memory.

    34.10.2 Object Ownership

    As described above, memory management depends on clearly defining who is responsible for freeing the underlying C struct or C++ class. If the Ruby object is responsible for freeing the C++ object, then a "free" function must be registered for the object. If the Ruby object is not responsible for freeing the underlying memory, then a "free" function must not be registered for the object.

    For the most part, SWIG takes care of memory management issues. The rules it uses are:

    • When calling a C++ object's constructor from Ruby, SWIG will assign a "free" function thereby making the Ruby object responsible for freeing the C++ object
    • When calling a C++ member function that returns a pointer, SWIG will not assign a "free" function thereby making the underlying library responsible for freeing the object.

    To make this clearer, let's look at an example. Assume we have a Foo and a Bar class.

    /* File "RubyOwernshipExample.h" */
    
    class Foo
    {
    public:
      Foo() {}
      ~Foo() {}
    };
    
    class Bar
    {
      Foo *foo_;
    public:
      Bar(): foo_(new Foo) {}
      ~Bar() { delete foo_; }
      Foo* get_foo() { return foo_; }
      Foo* get_new_foo() { return new Foo; }
      void set_foo(Foo *foo) { delete foo_; foo_ = foo; }
    };

    First, consider this Ruby code:

    foo = Foo.new

    In this case, the Ruby code calls the underlying Foo C++ constructor, thus creating a new foo object. By default, SWIG will assign the new Ruby object a "free" function. When the Ruby object is garbage collected, the "free" function will be called. It in turn will call Foo's destructor.

    Next, consider this code:

    bar = Bar.new
    foo = bar.get_foo()

    In this case, the Ruby code calls a C++ member function, get_foo. By default, SWIG will not assign the Ruby object a "free" function. Thus, when the Ruby object is garbage collected the underlying C++ foo object is not affected.

    Unfortunately, the real world is not as simple as the examples above. For example:

    bar = Bar.new
    foo = bar.get_new_foo()

    In this case, the default SWIG behavior for calling member functions is incorrect. The Ruby object should assume ownership of the returned object. This can be done by using the %newobject directive. See Object ownership and %newobject for more information.

    The SWIG default mappings are also incorrect in this case:

    foo = Foo.new
    bar = Bar.new
    bar.set_foo(foo)

    Without modification, this code will cause a segmentation fault. When the Ruby foo object goes out of scope, it will free the underlying C++ foo object. However, when the Ruby bar object goes out of scope, it will call the C++ bar destructor which will also free the C++ foo object. The problem is that object ownership is transferred from the Ruby object to the C++ object when the set_foo method is called. This can be done by using the special DISOWN type map, which was added to the Ruby bindings in SWIG-1.3.26.

    Thus, a correct SWIG interface file correct mapping for these classes is:

    /* File RubyOwnershipExample.i */
    
    %module RubyOwnershipExample
    
    %{
    #include "RubyOwnershipExample.h"
    %}
    
    class Foo
    {
    public:
      Foo();
      ~Foo();
    };
    
    class Bar
    {
      Foo *foo_;
    public:
      Bar();
      ~Bar();
      Foo* get_foo();
    
      %newobject get_new_foo;
      Foo* get_new_foo();
    
      %apply SWIGTYPE *DISOWN {Foo *foo};
      void set_foo(Foo *foo);
      %clear Foo *foo;
    };
    

    This code can be seen in swig/examples/ruby/tracking.

    34.10.3 Object Tracking

    The remaining parts of this section will use the class library shown below to illustrate different memory management techniques. The class library models a zoo and the animals it contains.

    %module zoo
    
    %{
    #include <string>
    #include <vector>
    
    #include "zoo.h"
    %}
    
    class Animal
    {
    private:
      typedef std::vector<Animal*> AnimalsType;
      typedef AnimalsType::iterator IterType;
    protected:
      AnimalsType animals;
    protected:
      std::string name_;
    public:
      // Construct an animal with this name
      Animal(const char* name) : name_(name) {}
     
      // Return the animal's name
      const char* get_name() const { return name.c_str(); }
    };
    
    class Zoo
    {
    protected:
     std::vector<Animal *> animals;
     
    public:
      // Construct an empty zoo
      Zoo() {}
      
      /* Create a new animal. */
      static Animal* Zoo::create_animal(const char* name) {
        return new Animal(name);
      }
     
      // Add a new animal to the zoo
      void add_animal(Animal* animal) {
        animals.push_back(animal); 
      }
     
      Animal* remove_animal(size_t i) {
        Animal* result = this->animals[i];
        IterType iter = this->animals.begin();
        std::advance(iter, i);
        this->animals.erase(iter);
       
        return result;
      }
      
      // Return the number of animals in the zoo
      size_t get_num_animals() const {
        return animals.size(); 
      }
      
      // Return a pointer to the ith animal
      Animal* get_animal(size_t i) const {
        return animals[i]; 
      }
    };

    Let's say you SWIG this code and then run IRB:

    $ irb
    irb(main):001:0> require 'example'
    => true
    
    irb(main):002:0> tiger1 = Example::Animal.new("tiger1")
    => #<Example::Animal:0x2be3820>
    
    irb(main):004:0> tiger1.get_name()
    => "tiger1"
    
    irb(main):003:0> zoo = Example::Zoo.new()
    => #<Example::Zoo:0x2be0a60>
    
    irb(main):006:0> zoo.add_animal(tiger)
    => nil
    
    irb(main):007:0> zoo.get_num_animals()
    => 1
    
    irb(main):007:0> tiger2 = zoo.remove_animal(0)
    => #<Example::Animal:0x2bd4a18>
    
    irb(main):008:0> tiger2.get_name()
    => "tiger1"
    
    irb(main):009:0> tiger1.equal?(tiger2)
    => false
    

    Pay particular attention to the code tiger1.equal?(tiger2). Note that the two Ruby objects are not the same - but they reference the same underlying C++ object. This can cause problems. For example:

    irb(main):010:0> tiger1 = nil
    => nil
    
    irb(main):011:0> GC.start
    => nil
    
    irb(main):012:0> tiger2.get_name()
    (irb):12: [BUG] Segmentation fault
    

    After the garbage collector runs, as a result of our call to GC.start, callingtiger2.get_name() causes a segmentation fault. The problem is that when tiger1 is garbage collected, it frees the underlying C++ object. Thus, when tiger2 calls the get_name() method it invokes it on a destroyed object.

    This problem can be avoided if SWIG enforces a one-to-one mapping between Ruby objects and C++ classes. This can be done via the use of the %trackobjects functionality available in SWIG-1.3.26. and later.

    When the %trackobjects is turned on, SWIG automatically keeps track of mappings between C++ objects and Ruby objects. Note that enabling object tracking causes a slight performance degradation. Test results show this degradation to be about 3% to 5% when creating and destroying 100,000 animals in a row.

    Since %trackobjects is implemented as a %feature, it uses the same name matching rules as other kinds of features (see the chapter on "Customization Features") . Thus it can be applied on a class-by-class basis if needed. To fix the example above:

    %module example
    
    %{
    #include "example.h"
    %}
    
    /* Tell SWIG that create_animal creates a new object */
    %newobject Zoo::create_animal;
    
    /* Tell SWIG to keep track of mappings between C/C++ structs/classes. */
    %trackobjects;
    
    %include "example.h"

    When this code runs we see:

    $ irb
    irb(main):001:0> require 'example'
    => true
    
    irb(main):002:0> tiger1 = Example::Animal.new("tiger1")
    => #<Example::Animal:0x2be37d8>
    
    irb(main):003:0> zoo = Example::Zoo.new()
    => #<Example::Zoo:0x2be0a18>
    
    irb(main):004:0> zoo.add_animal(tiger1)
    => nil
    
    irb(main):006:0> tiger2 = zoo.remove_animal(0)
    => #<Example::Animal:0x2be37d8>
    
    irb(main):007:0> tiger1.equal?(tiger2)
    => true
    
    irb(main):008:0> tiger1 = nil
    => nil
    
    irb(main):009:0> GC.start
    => nil
    
    irb(main):010:0> tiger.get_name()
    => "tiger1"
    irb(main):011:0>

    For those who are interested, object tracking is implemented by storing Ruby objects in a hash table and keying them on C++ pointers. The underlying API is:

    static void SWIG_RubyAddTracking(void* ptr, VALUE object);
    static VALUE SWIG_RubyInstanceFor(void* ptr) ;
    static void SWIG_RubyRemoveTracking(void* ptr);
    static void SWIG_RubyUnlinkObjects(void* ptr);

    When an object is created, SWIG will automatically call the SWIG_RubyAddTracking method. Similarly, when an object is deleted, SWIG will call the SWIG_RubyRemoveTracking. When an object is returned to Ruby from C++, SWIG will use the SWIG_RubyInstanceFor method to ensure a one-to-one mapping from Ruby to C++ objects. Last, the RubyUnlinkObjects method unlinks a Ruby object from its underlying C++ object.

    In general, you will only need to use the SWIG_RubyInstanceFor, which is required for implementing mark functions as shown below. However, if you implement your own free functions (see below) you may also have to call the SWIG_RubyRemoveTracking and RubyUnlinkObjects methods.

    34.10.4 Mark Functions

    With a bit more testing, we see that our class library still has problems. For example:

    $ irb
    irb(main):001:0> require 'example'
    => true
    
    irb(main):002:0> tiger1 = Example::Animal.new("tiger1")
    => #<Example::Animal:0x2bea6a8>
    
    irb(main):003:0> zoo = Example::Zoo.new()
    => #<Example::Zoo:0x2be7960>
    
    irb(main):004:0> zoo.add_animal(tiger1)
    => nil
    
    irb(main):007:0> tiger1 = nil
    => nil
    
    irb(main):007:0> GC.start
    => nil
    
    irb(main):005:0> tiger2 = zoo.get_animal(0)
    (irb):12: [BUG] Segmentation fault

    The problem is that Ruby does not know that the zoo object contains a reference to a Ruby object. Thus, when Ruby garbage collects tiger1 it frees the underlying C++ object.

    This can be fixed by implementing a mark function as described above in the Mark and Sweep Garbage Collector section. You can specify a mark function by using the %markfunc directive. Since the %markfunc directive is implemented using SWIG's' "features" mechanism it uses the same name matching rules as other kinds of features (see the chapter on "Customization Features" for more details).

    A mark function takes a single argument, which is a pointer to the C++ object being marked; it should, in turn, call rb_gc_mark() for any instances that are reachable from the current object. The mark function for our Zoo class should therefore loop over all of the C++ animal objects in the zoo object, look up their Ruby object equivalent, and then call rb_gc_mark(). One possible implementation is:

    %module example
    
    %{
    #include "example.h"
    %}
    
    /* Keep track of mappings between C/C++ structs/classes
     and Ruby objects so we can implement a mark function. */
    %trackobjects;
    
    /* Specify the mark function */
    %markfunc Zoo "mark_Zoo";
    
    %include "example.h"
    
    %header %{
    
    static void mark_Zoo(void* ptr) {
      Zoo* zoo = (Zoo*) ptr;
     
      /* Loop over each object and tell the garbage collector
      that we are holding a reference to them. */
      int count = zoo->get_num_animals();
     
      for(int i = 0; i < count; ++i) {
        Animal* animal = zoo->get_animal(i);
        VALUE object = SWIG_RubyInstanceFor(animal);
     
        if (object != Qnil) {
          rb_gc_mark(object);
        }
      }
    }
    %}

    Note the mark function is dependent on the SWIG_RUBY_InstanceFor method, and thus requires that %trackobjects is enabled. For more information, please refer to the ruby_track_objects.i test case in the SWIG test suite.

    When this code is compiled we now see:

    $ irb
    irb(main):002:0> tiger1=Example::Animal.new("tiger1")
    => #<Example::Animal:0x2be3bf8>
    
    irb(main):003:0> Example::Zoo.new()
    => #<Example::Zoo:0x2be1780>
    
    irb(main):004:0> zoo = Example::Zoo.new()
    => #<Example::Zoo:0x2bde9c0>
    
    irb(main):005:0> zoo.add_animal(tiger1)
    => nil
    
    irb(main):009:0> tiger1 = nil
    => nil
    
    irb(main):010:0> GC.start
    => nil
    irb(main):014:0> tiger2 = zoo.get_animal(0)
    => #<Example::Animal:0x2be3bf8>
    
    irb(main):015:0> tiger2.get_name()
    => "tiger1"
    irb(main):016:0>

    This code can be seen in swig/examples/ruby/mark_function.

    34.10.5 Free Functions

    By default, SWIG creates a "free" function that is called when a Ruby object is garbage collected. The free function simply calls the C++ object's destructor.

    However, sometimes an appropriate destructor does not exist or special processing needs to be performed before the destructor is called. Therefore, SWIG allows you to manually specify a "free" function via the use of the %freefunc directive. The %freefunc directive is implemented using SWIG's' "features" mechanism and so the same name matching rules used for other kinds of features apply (see the chapter on "Customization Features") for more details).

    IMPORTANT ! - If you define your own free function, then you must ensure that you call the underlying C++ object's destructor. In addition, if object tracking is activated for the object's class, you must also call the SWIG_RubyRemoveTracking function (of course call this before you destroy the C++ object). Note that it is harmless to call this method if object tracking if off so it is advised to always call it.

    Note there is a subtle interaction between object ownership and free functions. A custom defined free function will only be called if the Ruby object owns the underlying C++ object. This also to Ruby objects which are created, but then transfer ownership to C++ objects via the use of the disown typemap described above.

    To show how to use the %freefunc directive, let's slightly change our example. Assume that the zoo object is responsible for freeing any animal that it contains. This means that the Zoo::add_animal function should be marked with a DISOWN typemap and the destructor should be updated as below:

    Zoo::~Zoo() {
      IterType iter = this->animals.begin();
      IterType end = this->animals.end();
     
      for(iter; iter != end; ++iter) {
        Animal* animal = *iter;
        delete animal;
      }
    }
    

    When we use these objects in IRB we see:

    $irb
    irb(main):002:0> require 'example'
    => true
    
    irb(main):003:0> zoo = Example::Zoo.new()
    => #<Example::Zoo:0x2be0fe8>
    
    irb(main):005:0> tiger1 = Example::Animal.new("tiger1")
    => #<Example::Animal:0x2bda760>
    
    irb(main):006:0> zoo.add_animal(tiger1)
    => nil
    
    irb(main):007:0> zoo = nil
    => nil
    
    irb(main):008:0> GC.start
    => nil
    
    irb(main):009:0> tiger1.get_name()
    (irb):12: [BUG] Segmentation fault
    

    The error happens because the C++ animal object is freed when the zoo object is freed. Although this error is unavoidable, we can at least prevent the segmentation fault. To do this requires enabling object tracking and implementing a custom free function that calls the SWIG_RubyUnlinkObjects function for each animal object that is destroyed. The SWIG_RubyUnlinkObjects function notifies SWIG that a Ruby object's underlying C++ object is no longer valid. Once notified, SWIG will intercept any calls from the existing Ruby object to the destroyed C++ object and raise an exception.

    %module example
    
    %{
    #include "example.h"
    %}
    
    /* Specify that ownership is transferred to the zoo when calling add_animal */
    %apply SWIGTYPE *DISOWN { Animal* animal };
    
    /* Track objects */
    %trackobjects;
    
    /* Specify the mark function */
    %freefunc Zoo "free_Zoo";
    
    %include "example.h"
    
    %header %{
      static void free_Zoo(void* ptr) {
        Zoo* zoo = (Zoo*) ptr;
    
        /* Loop over each animal */
        int count = zoo->get_num_animals();
    
        for(int i = 0; i < count; ++i) {
          /* Get an animal */
          Animal* animal = zoo->get_animal(i);
    
          /* Unlink the Ruby object from the C++ object */
          SWIG_RubyUnlinkObjects(animal);
    
          /* Now remove the tracking for this animal */
          SWIG_RubyRemoveTracking(animal);
        }
    
        /* Now call SWIG_RubyRemoveTracking for the zoo */
        SWIG_RubyRemoveTracking(ptr);
        /* Now free the zoo which will free the animals it contains */
        delete zoo;
      }
    %} 

    Now when we use these objects in IRB we see:

    $irb
    irb(main):002:0> require 'example'
    => true
    
    irb(main):003:0> zoo = Example::Zoo.new()
    => #<Example::Zoo:0x2be0fe8>
    
    irb(main):005:0> tiger1 = Example::Animal.new("tiger1")
    => #<Example::Animal:0x2bda760>
    
    irb(main):006:0> zoo.add_animal(tiger1)
    => nil
    
    irb(main):007:0> zoo = nil
    => nil
    
    irb(main):008:0> GC.start
    => nil
    
    irb(main):009:0> tiger1.get_name()
    RuntimeError: This Animal * already released
     from (irb):10:in `get_name'
     from (irb):10
    irb(main):011:0>

    Notice that SWIG can now detect the underlying C++ object has been freed, and thus raises a runtime exception.

    This code can be seen in swig/examples/ruby/free_function.

    34.10.6 Embedded Ruby and the C++ Stack

    As has been said, the Ruby GC runs and marks objects before its sweep phase. When the garbage collector is called, it will also try to mark any Ruby objects (VALUE) it finds in the machine registers and in the C++ stack.

    The stack is basically the history of the functions that have been called and also contains local variables, such as the ones you define whenever you do inside a function:

    VALUE obj;

    For ruby to determine where its stack space begins, during initialization a normal Ruby interpreter will call the ruby_init() function which in turn will call a function called Init_stack or similar. This function will store a pointer to the location where the stack points at that point in time.

    ruby_init() is presumed to always be called within the main() function of your program and whenever the GC is called, ruby will assume that the memory between the current location in memory and the pointer that was stored previously represents the stack, which may contain local (and temporary) VALUE ruby objects. Ruby will then be careful not to remove any of those objects in that location.

    So far so good. For a normal Ruby session, all the above is completely transparent and magic to the extensions developer.

    However, with an embedded Ruby, it may not always be possible to modify main() to make sure ruby_init() is called there. As such, ruby_init() will likely end up being called from within some other function. This can lead Ruby to measure incorrectly where the stack begins and can result in Ruby incorrectly collecting those temporary VALUE objects that are created once another function is called. The end result: random crashes and segmentation faults.

    This problem will often be seen in director functions that are used for callbacks, for example.

    To solve the problem, SWIG can now generate code with director functions containing the optional macros SWIG_INIT_STACK and SWIG_RELEASE_STACK. These macros will try to force Ruby to reinitialize the beginning of the stack the first time a director function is called. This will lead Ruby to measure and not collect any VALUE objects defined from that point on.

    To mark functions to either reset the ruby stack or not, you can use:

    %initstack Class::memberfunction;   // only re-init the stack in this director method
    %ignorestack Class::memberfunction; // do not re-init the stack in this director method
    %initstack Class;                   // init the stack on all the methods of this class
    %initstack;                         // all director functions will re-init the stack
    
    swig-4.0.1/Doc/Manual/Guile.html0000644000175000017500000007764413527234052016245 0ustar williamwilliam SWIG and Guile

    25 SWIG and Guile

    This section details guile-specific support in SWIG.

    25.1 Supported Guile Versions

    SWIG works with Guile versions 1.8.x and 2.0.x. Support for version 1.6.x has been dropped. The last version of SWIG that still works with Guile version 1.6.x is SWIG 2.0.9.

    Note that starting with guile 2.0, the guile sources can be compiled for improved performance. This is currently not tested with swig so your mileage may vary. To be safe set environment variable GUILE_AUTO_COMPILE to 0 when using swig generated guile code.

    25.2 Meaning of "Module"

    There are three different concepts of "module" involved, defined separately for SWIG, Guile, and Libtool. To avoid horrible confusion, we explicitly prefix the context, e.g., "guile-module".

    25.3 Old GH Guile API

    Guile 1.8 and older could be interfaced using two different api's, the SCM or the GH API. The GH interface to guile is deprecated. Read more about why in the Guile manual.

    Support for the guile GH wrapper code generation has been dropped from SWIG. The last version of SWIG that can still generate guile GH wrapper code is 2.0.9. Please use that version if you really need the GH wrapper code.

    25.4 Linkage

    Guile support is complicated by a lack of user community cohesiveness, which manifests in multiple shared-library usage conventions. A set of policies implementing a usage convention is called a linkage.

    25.4.1 Simple Linkage

    The default linkage is the simplest; nothing special is done. In this case the function SWIG_init() is exported. Simple linkage can be used in several ways:

    • Embedded Guile, no modules. You want to embed a Guile interpreter into your program; all bindings made by SWIG shall show up in the root module. Then call SWIG_init() in the inner_main() function. See the "simple" and "matrix" examples under Examples/guile.
    • Dynamic module mix-in. You want to create a Guile module using define-module, containing both Scheme code and bindings made by SWIG; you want to load the SWIG modules as shared libraries into Guile.

      (define-module (my module))
      (define my-so (dynamic-link "./libexample.so"))
      (dynamic-call "SWIG_init" my-so) ; make SWIG bindings
      ;; Scheme definitions can go here
      

      Newer Guile versions provide a shorthand for dynamic-link and dynamic-call:

      (load-extension "./libexample.so" "SWIG_init")
      

      A more portable approach would be to drop the shared library extension:

      (load-extension "./libexample" "SWIG_init")
      

      You need to explicitly export those bindings made by SWIG that you want to import into other modules:

      (export foo bar)
      

      In this example, the procedures foo and bar would be exported. Alternatively, you can export all bindings with the following module-system hack:

      (module-map (lambda (sym var)
                    (module-export! (current-module) (list sym)))
                  (current-module))
      

      SWIG can also generate this Scheme stub (from define-module up to export) semi-automagically if you pass it the command-line argument -scmstub. The code will be exported in a file called module.scm in the directory specified by -outdir or the current directory if -outdir is not specified. Since SWIG doesn't know how to load your extension module (with dynamic-link or load-extension), you need to supply this information by including a directive like this in the interface file:

      %scheme %{ (load-extension "./libexample.so" "SWIG_init") %}
      

      (The %scheme directive allows to insert arbitrary Scheme code into the generated file module.scm; it is placed between the define-module form and the export form.)

    If you want to include several SWIG modules, you would need to rename SWIG_init via a preprocessor define to avoid symbol clashes. For this case, however, passive linkage is available.

    25.4.2 Passive Linkage

    Passive linkage is just like simple linkage, but it generates an initialization function whose name is derived from the module and package name (see below).

    You should use passive linkage rather than simple linkage when you are using multiple modules.

    25.4.3 Native Guile Module Linkage

    SWIG can also generate wrapper code that does all the Guile module declarations on its own if you pass it the -Linkage module command-line option.

    The module name is set with the -package and -module command-line options. Suppose you want to define a module with name (my lib foo); then you would have to pass the options -package my/lib -module foo. Note that the last part of the name can also be set via the SWIG directive %module.

    You can use this linkage in several ways:

    • Embedded Guile with SWIG modules. You want to embed a Guile interpreter into your program; the SWIG bindings shall be put into different modules. Simply call the function scm_init_my_modules_foo_module in the inner_main() function.
    • Dynamic Guile modules. You want to load the SWIG modules as shared libraries into Guile; all bindings are automatically put in newly created Guile modules.
      (define my-so (dynamic-link "./libfoo"))
      ;; create new module and put bindings there:
      (dynamic-call "scm_init_my_modules_foo_module" my-so) 
      
      Newer Guile versions have a shorthand procedure for this:
      (load-extension "./libfoo.so" "scm_init_my_modules_foo_module")
      

    25.4.4 Old Auto-Loading Guile Module Linkage

    Guile used to support an autoloading facility for object-code modules. This support has been marked deprecated in version 1.4.1 and is going to disappear sooner or later. SWIG still supports building auto-loading modules if you pass it the -Linkage ltdlmod command-line option.

    Auto-loading worked like this: Suppose a module with name (my lib foo) is required and not loaded yet. Guile will then search all directories in its search path for a Scheme file my/modules/foo.scm or a shared library my/modules/libfoo.so (or my/modules/libfoo.la; see the GNU libtool documentation). If a shared library is found that contains the symbol scm_init_my_modules_foo_module, the library is loaded, and the function at that symbol is called with no arguments in order to initialize the module.

    When invoked with the -Linkage ltdlmod command-line option, SWIG generates an exported module initialization function with an appropriate name.

    25.4.5 Hobbit4D Linkage

    The only other linkage supported at this time creates shared object libraries suitable for use by hobbit's (hobbit4d link) guile module. This is called the "hobbit" linkage, and requires also using the "-package" command line option to set the part of the module name before the last symbol. For example, both command lines:

    swig -guile -package my/lib foo.i
    swig -guile -package my/lib -module foo foo.i
    

    would create module (my lib foo) (assuming in the first case foo.i declares the module to be "foo"). The installed files are my/lib/libfoo.so.X.Y.Z and friends. This scheme is still very experimental; the (hobbit4d link) conventions are not well understood.

    25.5 Underscore Folding

    Underscores are converted to dashes in identifiers. Guile support may grow an option to inhibit this folding in the future, but no one has complained so far.

    You can use the SWIG directives %name and %rename to specify the Guile name of the wrapped functions and variables (see CHANGES).

    25.6 Typemaps

    The Guile module handles all types via typemaps. This information is read from Lib/guile/typemaps.i. Some non-standard typemap substitutions are supported:

    • $descriptor expands to a type descriptor for use with the SWIG_NewPointerObj() and SWIG_ConvertPtr functions.
    • For pointer types, $*descriptor expands to a descriptor for the direct base type (i.e., one pointer is stripped), whereas $basedescriptor expands to a descriptor for the base type (i.e., all pointers are stripped).

    A function returning void (more precisely, a function whose out typemap returns SCM_UNSPECIFIED) is treated as returning no values. In argout typemaps, one can use the macro GUILE_APPEND_RESULT in order to append a value to the list of function return values.

    Multiple values can be passed up to Scheme in one of three ways:

    • Multiple values as lists. By default, if more than one value is to be returned, a list of the values is created and returned; to switch back to this behavior, use

      %values_as_list;
    • Multiple values as vectors. By issuing

      %values_as_vector;

      vectors instead of lists will be used.

    • Multiple values for multiple-value continuations. This is the most elegant way. By issuing

      %multiple_values;

      multiple values are passed to the multiple-value continuation, as created by call-with-values or the convenience macro receive. The latter is available if you issue (use-modules (srfi srfi-8)). Assuming that your divide function wants to return two values, a quotient and a remainder, you can write:

      (receive (quotient remainder)
          (divide 35 17)
        body...)
      

      In body, the first result of divide will be bound to the variable quotient, and the second result to remainder.

    See also the "multivalue" example.

    Constants are exported as a function that returns the value. The %feature("constasvar") can be applied to any constant, immutable variable, or enum. Instead of exporting the constant as a function that must be called, the constant will appear as a scheme variable. See Features and the %feature directive for info on how to apply the %feature.

    25.7 Representation of pointers as smobs

    For pointer types, SWIG uses Guile smobs. SWIG smobs print like this: #<swig struct xyzzy * 0x1234affe> Two of them are equal? if and only if they have the same type and value.

    To construct a Scheme object from a C pointer, the wrapper code calls the function SWIG_NewPointerObj(), passing a pointer to a struct representing the pointer type. The type index to store in the upper half of the CAR is read from this struct. To get the pointer represented by a smob, the wrapper code calls the function SWIG_ConvertPtr(), passing a pointer to a struct representing the expected pointer type. See also The run-time type checker. If the Scheme object passed was not a SWIG smob representing a compatible pointer, a wrong-type-arg exception is raised.

    25.7.1 Smobs

    In earlier versions of SWIG, C pointers were represented as Scheme strings containing a hexadecimal rendering of the pointer value and a mangled type name. As Guile allows registering user types, so-called "smobs" (small objects), a much cleaner representation has been implemented now. The details will be discussed in the following.

    The whole type system, when it is first initialized, creates two smobs named "swig" and "collected_swig". The swig smob is used for non-garbage collected smobs, while the collected_swig smob is used as described below. Each smob has the same format, which is a double cell created by SCM_NEWSMOB2() The first word of data is the pointer to the object and the second word of data is the swig_type_info * structure describing this type. If a generated GOOPS module has been loaded, smobs will be wrapped by the corresponding GOOPS class.

    25.7.2 Garbage Collection

    Garbage collection is a feature of Guile since version 1.6. As SWIG now requires Guile > 1.8, it is automatically included. Garbage collection works like this. Every swig_type_info structure stores in its clientdata field a pointer to the destructor for this type. The destructor is the generated wrapper around the delete function. So swig still exports a wrapper for the destructor, it just does not call scm_c_define_gsubr() for the wrapped delete function. So the only way to delete an object is from the garbage collector, since the delete function is not available to scripts. How swig determines if a type should be garbage collected is exactly like described in Object ownership and %newobject in the SWIG manual. All typemaps use an $owner var, and the guile module replaces $owner with 0 or 1 depending on feature:new.

    25.8 Native Guile pointers

    In addition to SWIG smob pointers, Guile's native pointer type are accepted as arguments to wrapped SWIG functions. This can be useful for passing pointers to bytevector data to wrapped functions.

    25.9 Exception Handling

    SWIG code calls scm_error on exception, using the following mapping:

          MAP(SWIG_MemoryError,     "swig-memory-error");
          MAP(SWIG_IOError,         "swig-io-error");
          MAP(SWIG_RuntimeError,    "swig-runtime-error");
          MAP(SWIG_IndexError,      "swig-index-error");
          MAP(SWIG_TypeError,       "swig-type-error");
          MAP(SWIG_DivisionByZero,  "swig-division-by-zero");
          MAP(SWIG_OverflowError,   "swig-overflow-error");
          MAP(SWIG_SyntaxError,     "swig-syntax-error");
          MAP(SWIG_ValueError,      "swig-value-error");
          MAP(SWIG_SystemError,     "swig-system-error");
    

    The default when not specified here is to use "swig-error". See Lib/exception.i for details.

    25.10 Procedure documentation

    If invoked with the command-line option -procdoc file, SWIG creates documentation strings for the generated wrapper functions, describing the procedure signature and return value, and writes them to file.

    SWIG can generate documentation strings in three formats, which are selected via the command-line option -procdocformat format:

    • guile-1.4 (default): Generates a format suitable for Guile 1.4.
    • plain: Generates a format suitable for Guile 1.4.1 and later.
    • texinfo: Generates texinfo source, which must be run through texinfo in order to get a format suitable for Guile 1.4.1 and later.

    You need to register the generated documentation file with Guile like this:

    (use-modules (ice-9 documentation))
    (set! documentation-files 
          (cons "file" documentation-files))
    

    Documentation strings can be configured using the Guile-specific typemap argument doc. See Lib/guile/typemaps.i for details.

    25.11 Procedures with setters

    For global variables, SWIG creates a single wrapper procedure (variable :optional value), which is used for both getting and setting the value. For struct members, SWIG creates two wrapper procedures (struct-member-get pointer) and (struct-member-set pointer value).

    If invoked with the command-line option -emit-setters (recommended), SWIG will additionally create procedures with setters. For global variables, the procedure-with-setter variable is created, so you can use (variable) to get the value and (set! (variable) value) to set it. For struct members, the procedure-with-setter struct-member is created, so you can use (struct-member pointer) to get the value and (set! (struct-member pointer) value) to set it.

    If invoked with the command-line option -only-setters, SWIG will only create procedures with setters, i.e., for struct members, the procedures (struct-member-get pointer) and (struct-member-set pointer value) are not generated.

    25.12 GOOPS Proxy Classes

    SWIG can also generate classes and generic functions for use with Guile's Object-Oriented Programming System (GOOPS). GOOPS is a sophisticated object system in the spirit of the Common Lisp Object System (CLOS).

    To enable GOOPS support, pass the -proxy argument to swig. This will export the GOOPS wrapper definitions into the module.scm file in the directory specified by -outdir or the current directory. GOOPS support requires either passive or module linkage.

    The generated file will contain definitions of GOOPS classes mimicking the C++ class hierarchy.

    Enabling GOOPS support implies -emit-setters.

    If -emit-slot-accessors is also passed as an argument, then the generated file will contain accessor methods for all the slots in the classes and for global variables. The input class

      class Foo {
        public:
          Foo(int i) : a(i) {}
          int a;
          int getMultBy(int i) { return a * i; }
          Foo getFooMultBy(int i) { return Foo(a * i); }
      }; 
      Foo getFooPlus(int i) { return Foo(a + i); }
    

    will produce (if -emit-slot-accessors is not passed as a parameter)

    (define-class <Foo> (<swig>)
      (a #:allocation #:swig-virtual 
         #:slot-ref primitive:Foo-a-get 
         #:slot-set! primitive:Foo-a-set)
      #:metaclass <swig-metaclass>
      #:new-function primitive:new-Foo
    )
    (define-method (getMultBy (swig_smob <Foo>) i)
      (primitive:Foo-getMultBy  (slot-ref swig_smob 'smob) i))
    (define-method (getFooMultBy (swig_smob <Foo>) i)
      (make <Foo> #:init-smob (primitive:Foo-getFooMultBy  (slot-ref swig_smob 'smob) i)))
    
    (define-method (getFooPlus i)
      (make <Foo> #:init-smob (primitive:getFooPlus i)))
    
    (export <Foo> getMultBy getFooMultBy getFooPlus )
    

    and will produce (if -emit-slot-accessors is passed as a parameter)

    (define-class <Foo> (<swig>)
      (a #:allocation #:swig-virtual 
         #:slot-ref primitive:Foo-a-get 
         #:slot-set! primitive:Foo-a-set 
         #:accessor a)
      #:metaclass <swig-metaclass>
      #:new-function primitive:new-Foo
    )
    (define-method (getMultBy (swig_smob <Foo>) i)
      (primitive:Foo-getMultBy  (slot-ref swig_smob 'smob) i))
    (define-method (getFooMultBy (swig_smob <Foo>) i)
      (make <Foo> #:init-smob (primitive:Foo-getFooMultBy  (slot-ref swig_smob 'smob) i)))
    
    (define-method (getFooPlus i)
      (make <Foo> #:init-smob (primitive:getFooPlus i)))
    
    (export <Foo> a getMultBy getFooMultBy getFooPlus )
    

    which can then be used by this code

    ;; not using getters and setters
    (define foo (make <Foo> #:args '(45)))
    (slot-ref foo 'a)
    (slot-set! foo 'a 3)
    (getMultBy foo 4)
    (define foo2 (getFooMultBy foo 7))
    (slot-ref foo 'a)
    (slot-ref (getFooPlus foo 4) 'a)
    
    ;; using getters and setters
    (define foo (make <Foo> #:args '(45)))
    (a foo)
    (set! (a foo) 5)
    (getMultBy foo 4)
    (a (getFooMultBy foo 7))
    

    Notice that constructor arguments are passed as a list after the #:args keyword. Hopefully in the future the following will be valid (make <Foo> #:a 5 #:b 4)

    Also note that the order the declarations occur in the .i file make a difference. For example,

    %module test
    
    %{ #include "foo.h" %}
    
    %inline %{
      int someFunc(Foo &a) {
        ...
      }
    %}
    
    %include "foo.h"
    

    This is a valid SWIG file it will work as you think it will for primitive support, but the generated GOOPS file will be broken. Since the someFunc definition is parsed by SWIG before all the declarations in foo.h, the generated GOOPS file will contain the definition of someFunc() before the definition of <Foo>. The generated GOOPS file would look like

    ;;...
    
    (define-method (someFunc (swig_smob <Foo>))
      (primitive:someFunc (slot-ref swig_smob 'smob)))
    
    ;;...
    
    (define-class <Foo> (<swig>)
      ;;...
    )
    
    ;;...
    

    Notice that <Foo> is used before it is defined. The fix is to just put the %import "foo.h" before the %inline block.

    25.12.1 Naming Issues

    As you can see in the example above, there are potential naming conflicts. The default exported accessor for the Foo::a variable is named a. The name of the wrapper global function is getFooPlus. If the -useclassprefix option is passed to swig, the name of all accessors and member functions will be prepended with the class name. So the accessor will be called Foo-a and the member functions will be called Foo-getMultBy. Also, if the -goopsprefix goops: argument is passed to swig, every identifier will be prefixed by goops:

    Two guile-modules are created by SWIG. The first module contains the primitive definitions of all the wrapped functions and variables, and is located either in the _wrap.cxx file (with -Linkage module) or in the scmstub file (if -Linkage passive -scmstub). The name of this guile-module is the swig-module name (given on the command line with the -module argument or with the %module directive) concatenated with the string "-primitive". For example, if %module Test is set in the swig interface file, the name of the guile-module in the scmstub or -Linkage module will be Test-primitive. Also, the scmstub file will be named Test-primitive.scm. The string "primitive" can be changed by the -primsuffix swig argument. So the same interface, with the -primsuffix base will produce a module called Test-base. The second generated guile-module contains all the GOOPS class definitions and is located in a file named module.scm in the directory specified with -outdir or the current directory. The name of this guile-module is the name of the swig-module (given on the command line or with the %module directive). In the previous example, the GOOPS definitions will be in a file named Test.scm.

    Because of the naming conflicts, you can't in general use both the -primitive and the GOOPS guile-modules at the same time. To do this, you need to rename the exported symbols from one or both guile-modules. For example,

    (use-modules ((Test-primitive) #:renamer (symbol-prefix-proc 'primitive:)))
    (use-modules ((Test) #:renamer (symbol-prefix-proc 'goops:)))
    

    25.12.2 Linking

    The guile-modules generated above all need to be linked together. GOOPS support requires either passive or module linkage. The exported GOOPS guile-module will be the name of the swig-module and should be located in a file called Module.scm. This should be installed on the autoload path for guile, so that (use-modules (Package Module)) will load everything needed. Thus, the top of the GOOPS guile-module will contain code to load everything needed by the interface (the shared library, the scmstub module, etc.). The %goops directive inserts arbitrary code into the generated GOOPS guile-module, and should be used to load the dependent libraries.

    This breaks up into three cases

    • Passive Linkage without -scmstub: Note that this linkage style has the potential for naming conflicts, since the primitive exported function and variable names are not wrapped in a guile-module and might conflict with names from the GOOPS guile-module (see above). Pass the -goopsprefix argument to solve this problem. If the -exportprimitive option is passed to SWIG the (export ...) code that would be exported into the scmstub file is exported at the bottom of the generated GOOPS guile-module. The %goops directive should contain code to load the shared library.
      %goops %{ (load-extension "./libfoo.so" "scm_init_my_modules_foo_module") %}
      

      Produces the following code at the top of the generated GOOPS guile-module (with the -package my/modules -module foo command line arguments)

      (define-module (my modules foo))
      
      ;; %goops directive goes here
      (load-extension "./libfoo.so" "scm_init_my_modules_foo_module") 
      
      (use-modules (oop goops) (Swig common))
      
    • Passive Linkage with -scmstub: Here, the name of the scmstub file should be Module-primitive.scm (with primitive replaced with whatever is given with the -primsuffix argument. The code to load the shared library should be located in the %scheme directive, which will then be added to the scmstub file. SWIG will automatically generate the line (use-modules (Package Module-primitive)) into the GOOPS guile-module. So if Module-primitive.scm is on the autoload path for guile, the %goops directive can be empty. Otherwise, the %goops directive should contain whatever code is needed to load the Module-primitive.scm file into guile.

      %scheme %{ (load-extension "./libfoo.so" "scm_init_my_modules_foo_module") %}
      // only include the following definition if (my modules foo) cannot
      // be loaded automatically
      %goops %{ 
        (primitive-load "/path/to/foo-primitive.scm") 
        (primitive-load "/path/to/Swig/common.scm")
      %}
      

      Produces the following code at the top of the generated GOOPS guile-module

      (define-module (my modules foo))
      
      ;; %goops directive goes here (if any)
      (primitive-load "/path/to/foo-primitive.scm")
      (primitive-load "/path/to/Swig/common.scm")
      
      (use-modules (oop goops) (Swig common))
      (use-modules ((my modules foo-primitive) :renamer (symbol-prefix-proc
                                                             'primitive:)))
      
      
    • Module Linkage: This is very similar to passive linkage with a scmstub file. SWIG will also automatically generate the line (use-modules (Package Module-primitive)) into the GOOPS guile-module. Again the %goops directive should contain whatever code is needed to get that module loaded into guile.

      %goops %{ (load-extension "./libfoo.so" "scm_init_my_modules_foo_module") %}
      

      Produces the following code at the top of the generated GOOPS guile-module

      (define-module (my modules foo))
      
      ;; %goops directive goes here (if any)
      (load-extension "./libfoo.so" "scm_init_my_modules_foo_module") 
      
      (use-modules (oop goops) (Swig common))
      (use-modules ((my modules foo-primitive) :renamer (symbol-prefix-proc
                                                               'primitive:)))
      
      

    (Swig common): The generated GOOPS guile-module also imports definitions from the (Swig common) guile-module. This module is included with SWIG and should be installed by SWIG into the autoload path for guile (based on the configure script and whatever arguments are passed). If it is not, then the %goops directive also needs to contain code to load the common.scm file into guile. Also note that if you are trying to install the generated wrappers on a computer without SWIG installed, you will need to include the common.swg file along with the install.

    Multiple Modules: Type dependencies between modules is supported. For example, if mod1 includes definitions of some classes, and mod2 includes some classes derived from classes in mod1, the generated GOOPS file for mod2 will declare the correct superclasses. The only problem is that since mod2 uses symbols from mod1, the mod2 GOOPS file must include a (use-modules (mod2)). Currently, SWIG does not automatically export this line; it must be included in the %goops directive of mod2. Maybe in the future SWIG can detect dependencies and export this line. (how do other language modules handle this problem?)

    swig-4.0.1/Doc/Devel/0000755000175000017500000000000013527063513014114 5ustar williamwilliamswig-4.0.1/Doc/Devel/index.html0000644000175000017500000000155413527063513016116 0ustar williamwilliam SWIG Documentation This directory contains SWIG documentation: The following documentation describe the internal APIs used by SWIG. These may be useful to module developers.
    Copyright (C) 1999-2007 SWIG Development Team. swig-4.0.1/Doc/Devel/file.html0000644000175000017500000001330213527063513015720 0ustar williamwilliam SWIG File Handling

    Introduction

    This document describes the functions related to file and filename handling in the SWIG core. These functions are defined in the header file Source/Swig/swigfile.h. This API is considered to be stable.

    File Search Path

    These functions manipulate the search path for locating files.

    List *Swig_add_directory(const String_or_char *dirname)

    Adds a new directory to the system search path. The directory is appended to the end of the search path. Returns a list containing the current system search path.

    void Swig_push_directory(const String_or_char *dirname)

    Pushes a temporary directory onto the search path. This directory is searched before directories added with Swig_add_directory() except when including a system file explicitly (either using #include <file> or calling Swig_include_sys()). This function is normally used by the preprocessor to add temporary directories when processing #include statements.

    void Swig_pop_directory()

    Pops off the last pushed directory with Swig_push_directory()

    int Swig_get_push_dir()

    Returns a flag that indicates whether directory pushing is enabled or not.

    void Swig_set_push_dir(int dopush)

    Enables or disables directory pushing. By default, it is turned on. However, the -I- command line option to SWIG disables it.

    List *Swig_search_path()

    Returns the current search path.

    File access functions

    FILE *Swig_open(const String_or_char *name)

    Opens a file, using the applicable search paths, and returns an open FILE * object if found. Returns NULL if the file is not found.

    String *Swig_read_file(FILE *f)

    Reads all of the data from an open file into a string which is returned.

    String *Swig_include(const String_or_char *name)

    Searches for an include file name and returns its contents as a string if found. Returns NULL if not found. All of the applicable search paths are searched when trying to locate the file.

    String *Swig_include_sys(const String_or_char *name)

    Searches for an include file name and returns its contents as a string if found. Returns NULL if not found. All of the applicable search paths are searched when trying to locate the file, but preference is given to system paths first. This mimics the behavior of #include <file> in the preprocessor.

    int Swig_insert_file(const String_or_char *name, File *outfile)

    Searches for a file name and dumps its contents to outfile if found. Returns 0 on success, -1 if the file couldn't be found.

    Query functions

    String *Swig_last_file()

    Returns the full pathname of the file last opened or included.

    Named files

    void *Swig_register_filebyname(const String_or_char *filename, File *outfile)

    Registers a file object outfile with a specific name filename. This function is used to implement the SWIG %insert directive and to manage different sections of the output file such as "runtime","header","wrapper","init", etc. Different language modules may add their own sections for generating Python code, Perl code, etc.

    File *Swig_filebyname(const String_or_char *filename)

    This looks up a file object previously registered using Swig_register_filebyname(). This is used to implement the %insert directive.

    Filename utilities

    char *Swig_file_suffix(const String_or_char *filename)

    Returns the suffix of a filename. For instance, if the filename is "foo.txt", it returns ".txt".

    char *Swig_file_basename(const String_or_char *filename)

    Returns the filename without the suffix attached to it. For instance, if the filename is "foo.txt", it returns "foo". The result is stored in a static variable. If you need to save it, make your own copy.

    char *Swig_file_filename(const String_or_char *filename)

    Returns the filename without any leading directories. For instance, if the filename is "/bar/spam/foo.txt", it returns "foo.txt". This function is aware of local naming conventions on the machine (e.g., forward versus back slashes on Unix and Windows). The result is stored in a static variable. If you need to save the value, make a copy.

    char *Swig_file_dirname(const String_or_char *filename)

    Returns the directory name (if any). For instance, if the filename is "/bar/spam/foo.txt", it returns "/bar/spam/". This function is aware of local naming conventions on the machine (e.g., forward versus back slashes on Unix and Windows). The result is stored in a static variable. If you need to save the value, make a copy.

    SWIG_FILE_DELIMITER

    This macro contains the file delimiter string for the local machine. On Unix it is "/", on Windows it is "\\".
    swig-4.0.1/Doc/Devel/engineering.html0000644000175000017500000003146713527063513017307 0ustar williamwilliam SWIG Engineering Manual

    SWIG Engineering Manual

    David Beazley

    (Note : This is a work in progress.)

    Table of Contents

    1. Introduction

    The purpose of this document is to describe various coding conventions and organizational aspects for SWIG developers. The idea for this document is largely borrowed from John Ousterhout's Tcl/Tk Engineering Manual. It is not my intent to overly managerial about matters--rather I'm hoping to make life a little less chaotic for everyone.

    First a little background: SWIG was started in 1995 as a one-person project and continued in this mode of operation until about 1998. Most of this development was driven by ideas submitted by early SWIG users as opposed to being motivated by a grand design. As a result, the code ended up being a pretty horrible C++ coding disaster. A mostly working disaster perhaps, but a disaster nonetheless.

    With that said, the primary goal of future SWIG development is to reengineer the original system, fix most of its inherent design flaws, and to produce what I hope will become a highly extensible and modular interface compiler framework. To this do this, there are a few critical areas of work. First, I want to restructure SWIG as a collection of loosely coupled modules written in either ANSI C or an scripting language. Second, I want the system to be minimalistic in its use of data structures and interconnections. The primary reason for this is that the fewer data structures there are, the less users will have to remember. This will also make the system more accessible to non-experts. Finally, I want to reevaluate the whole idea of a SWIG module is and expand the definition to include just about anything from parsers, preprocessors, optimizers, interface editors, and code generators.

    The rest of this document outlines a few general rules of how code should be developed within the SWIG project. These rules are primarily drawn from my own experience developing software and observing the practices of other successful projects.

    2. Programming Languages and Libraries

    All SWIG modules must be written in either ANSI C or one of the scripting languages for which SWIG can generate an interface (e.g., Perl, Python, or Tcl). C++ is currently being used to write SWIG modules, but it is only being utilized to avoid working with a lot of pointers to functions. Advanced C++ features like namespaces, templates, and overloading should not be used..

    Module writers should make every attempt to use only those functions described in the POSIX.1 standard. This includes most of the functions contained the Kernighan and Ritchie C programming book. Use of operating system dependent functionality such as socket libraries should always be included inside a conditional compilation block so that it can be omitted on problematic platforms. If you are unsure about a library call, check the man page or contact Dave.

    3. The Source Directory and Module Names

    All SWIG modules are contained within the "Source" directory. Within this directory, each module is placed into its own subdirectory. The name of this subdirectory should exactly match the name of the module. For example, if you are creating a module called "Tcl", all of your files should be placed in a directory "Tcl".

    When choosing a module name, please pick a name that is not currently in use. As a general convention, the first letter of a module name is capitalized such as "Perl". Alternatives such as "perl" or "PERL" should be avoided. In certain instances, the first two letters may be capitalized as in "CParse." The exact usage of this is somewhat inconsistent and isn't terribly important--just make sure the first letter is capitalized. Also, module names should not start with numbers, include underscores or any other special non-alphanumeric characters.

    5. File Structure

    Each file in a module should be given a filename that is all lowercase letters such as "parser.c", not "Parser.c" or "PARSER.c". Please note that filenames are case-insensitive on Windows so this convention will prevent you from inadvertently creating two files that differ in case-only.

    Each file should include a short abstract and license information like this:

    /* -----------------------------------------------------------------------------
     * This file is part of SWIG, which is licensed as a whole under version 3 
     * (or any later version) of the GNU General Public License. Some additional
     * terms also apply to certain portions of SWIG. The full details of the SWIG
     * license and copyrights can be found in the LICENSE and COPYRIGHT files
     * included with the SWIG source code as distributed by the SWIG developers
     * and at http://www.swig.org/legal.html.
     *
     * xxx.c
     *
     * This file defines ...
     * ----------------------------------------------------------------------------- */
    
    #include "swig.h"
    
    /* Declarations */
    typedef struct {
       int x, y;
    } Foo;
    
    ...
    
    /* Private Declarations (used only in this file) */
    static int  avariable;
    
    ...
    
    /* Functions */
    ... 
    
    

    As a general rule, files start to get unmanageable once they exceed about 2000 lines. Files larger than this should be broken up into multiple files. Similarly, you should avoid the temptation to create many small files as this increases compilation time and makes the directory structure too complicated.

    6. Bottom-Up Design

    Within each source file, the preferred organization is to use what is known as "bottom-up" design. Under this scheme, lower-level functions appear first and the highest level function appears last. The easy way to remember is that the "main" function of your module should always appear last in the source file. For example:
    /* Simple bottom-up program */
    #include <stdio.h>
    
    int foo(int x, int y) {
        /* Implement foo */
        ...
    }
    
    int bar() {
        ...
        foo(i,j);
        ...
    }
    
    ...
    int main(int argc, char **argv) {
        ...
        bar();   
        ...
    }
    
    This choice of design is somewhat arbitrary however it has a number of benefits particular to C. In particular, a bottom-up design generally eliminates the need to include forward references--resulting in cleaner code and fewer compilation errors.

    7. Functions

    All functions should have a function header that gives the function name and a short description like this:
    /* -------------------------------------------------------------------------
     * Swig_add_directory()
     *
     * Adds a directory to the SWIG search path.
     * ------------------------------------------------------------------------- */
    
    void 
    Swig_add_directory(DOH *dirname) {
    ...
    
    }
    
    In the function declaration, the return type and any specifiers (extern or static) should appear on a separate line followed by the function name and arguments as shown above. The left curly brace should appear on the same line as the function name.

    Function declarations should NOT use the pre-ANSI function declaration syntax. The ANSI standard has been around long enough for this to be a non-issue.

    8. Naming Conventions

    The following conventions are used to name various objects throughout SWIG.

    Functions

    Functions should consist of the module name and the function name separated by an underscore like this:
    Preprocessor_define()
    Swig_add_directory()
    
    In general, the module name should match the name of the module subdirectory and the function name should be in all lowercase with words separated by underscores.

    Structures and Types

    If your module defines new structures, the structure name should include the name of the module and the name of the structure appended together like this:
    typedef struct SwigScanner {
       ...
    } SwigScanner;
    
    typedef struct LParseType {
       ...
    } LParseType;
    
    In this case, both the name of the module and the type should be capitalized. Also, whenever possible, you should use the "typedef struct Name { ... } Name" form when defining new data structures.

    Global Variables

    Global variables should be avoided if at all possible. However, if you must use a global variable, please prepend the module name and use the same naming scheme as for functions.

    Constants

    Constants should be created using #define and should be in all caps like this:
    #define   SWIG_TOKEN_LPAREN  1
    
    Separate words in a constant should be separated by underscores as with functions.

    Structure members

    Structure members should be in all lower-case and follow the same word-separation convention as for function names. However, the module name does not have to be included. For example:
    typedef struct SwigScanner {
      DOH           *text;           /* Current token value */
      DOH           *scanobjs;       /* Objects being scanned */
      DOH           *str;            /* Current object being scanned */
      char          *idstart;        /* Optional identifier start characters */
      int            next_token;     /* Next token to be returned */
      int            start_line;     /* Starting line of certain declarations */
      int            yylen;          /* Length of text pushed into text */
      DOH           *file;           /* Current file name */
    } SwigScanner;
    

    Static Functions and Variables

    Static declarations are free to use any naming convention that is appropriate. However, most existing parts of SWIG use lower-case names and follow the same convention as described for functions.

    9. Visibility

    Modules should keep the following rules in mind when exposing their internals:
    • Only publicly accessible functions should be included in the module header file.
    • All non-static declarations must be prepended with some form of the module name to avoid potential linker namespace conflicts with other modules.
    • Modules should not expose global variables or use global variables in their public interface.
    • Similarly, modules should discourage the direct manipulation of data contained within data structures in favor of using function calls instead. For example, instead of providing a user with a structure like this:
      typedef struct Foo {
         int line;
      } Foo;
      
      It is better to hide the implementation of Foo and provide an function-call interface like this:
      typedef struct Foo Foo;
      extern int  Foo_getline(Foo *f);
      extern void Foo_setline(Foo *f, int line);
      
      Although this results in worse performance, there are many practical reasons for doing this. The most important reason is that it allows you to change the internal representation of Foo without breaking all of the other modules or having to recompile the entire universe after making your changes.

    10. Miscellaneous Coding Guidelines

    These are largely covered in the main documentation in the Extending.html file.

    11. Git Tagging Conventions

    Use git tag to declare some set of file revisions as related in some symbolic way. This eases reference, retrieval and manipulation of these files later. At the moment (2001/01/16 14:02:53), the conventions are very simple; let's hope they stay that way!

    There are two types of tags, internal (aka personal) and external. Internal tags are used by SWIG developers primarily, whereas external tags are used when communicating with people w/ anonymous git access.

    • Internal tags should start with the developer name and a hyphen.
    • External tags should start with "rel-".
    That's all there is to it. Some example tags:
    • ttn-pre-xml-patch
    • ttn-post-xml-patch
    • ttn-going-on-vacation-so-dutifully-tagging-now
    • rel-1.3.40
    • rel-2.0.9

    Copyright (C) 1999-2004 SWIG Development Team. swig-4.0.1/Doc/Devel/tree.html0000644000175000017500000002176213527063513015751 0ustar williamwilliam SWIG Parse Tree Handling

    SWIG Parse Tree Handling

    Introduction

    This document describes the functions related to the handling of parse trees in SWIG. The structure of SWIG parse trees has been influenced heavily by ideas from XML-DOM trees. In fact, the functions in the API and attribute names are nearly identical. The header file Source/swig/swigtree.h contains the functions and macros described in this document. This API is considered to be stable.

    Parse tree navigation

    The following macros are used to navigate the parse tree.

    nodeType(n)

    Returns the type of a node as a String object. The type is stored in the "nodeType" attribute of n.

    parentNode(n)

    Returns the parent of a node. This is found in the "parentNode" attribute of n.

    previousSibling(n)

    Returns the previous sibling of a node (if any). This is found in the "previousSibling" attribute of n.

    nextSibling(n)

    Returns the next sibling of a node (if any). This is found in the "nextSibling" attribute of n.

    firstChild(n)

    Returns the first child of a node (if any). This is found in the "firstChild" attribute of n.

    lastChild(n)

    Returns the last child of a node (if any). This is found in the "lastChild" attribute of n.

    Parse Tree Construction

    The following macros are used to construct parse trees.

    set_nodeType(n, val)

    Sets the nodeType attribute of n. val is a string containing the type.

    set_parentNode(n, parent)

    Sets the parent of node n.

    set_previousSibling(n, prev)

    Sets the previous sibling of node n.

    set_nextSibling(n, next)

    Sets the next sibling of node n.

    set_firstChild(n, chd)

    Sets the first child of node n.

    set_lastChild(n, chd)

    Sets the last child of node n.

    Tree Management Functions

    The following functions are used to help with the management and construction of parse trees.

    void appendChild(Node *node, Node *child)

    Adds a new child to node. This function takes care of adjusting the "firstChild" and "lastChild" attributes of node to appropriate values. After calling this function, the "lastChild" attribute will point to child.

    void prependChild(Node *node, Node *child)

    Prepends a new child to node. The new child is added so that it becomes the first child of node.

    void removeNode(Node *node)

    Removes a node from the parse tree. The removal process detaches a node from its parent by removing it from the parent's child list. Upon return, node will have no parent and no siblings. This function does NOT delete node or modify children of node. If desired, node could be reattached to a different part of the parse tree.

    Node *copyNode(Node *node)

    Copies a node, but only copies those attributes that are simple strings. Thus, the new node will not contain any references to other nodes, lists, hashes, or other complex data structures. This function may be useful if you want to copy the data contents of a node in the process of creating a new parse tree node.

    Attribute Checking

    The following utility is provided since this is an extremely common operation.

    int checkAttribute(Node *n, const String_or_char *name, const String_or_char *value)

    This function checks to see whether node n has a given attribute name and that the attribute has a given value. Returns 0 or 1.

    Node Transformation

    In the course of processing, SWIG often applies a transform to a node. This transformation process made modify many of the attributes--even changing the type of a node. The following functions are used to help manage this transformation process. In addition to provide sanity checks, they save the old contents of the node so that they can be restored later.

    void Swig_save(const char *namespace, Node *n, ...)

    This function takes a node and a list of attribute names and saves their contents in a specified namespace. For example, the call
    Swig_save("temp",n,"type","parms","name",NIL)
    
    takes the attributes "type","parms", and "name" and saves their contents under the attribute names "temp:type","temp:parms","temp:name". In addition, this function sets an attribute "view" to hold the name of the current namespace. In this example, the "view" attribute would be set to "temp". The attribute names specified are all optional. If one or more of the attributes don't exist, this function merely records that those attributes did not exist in the original node.

    void Swig_require(const char *namespace, Node *n, ...)

    This function is similar to Swig_save() except that adds additional attribute checking. There are different interpretations of the attribute names. A name of "attr" merely requests that the function check for the presence of an attribute. If the attribute is missing, SWIG will exit with a failed assertion. An attribute name of "?attr" specifies that the attribute "attr" is optional and that its old value must be saved (if any). An attribute name of "*attr" specifies that the attribute is required and that its value must be saved. The saving of attributes is performed in the same manner as with Swig_save(). Here is an example:
    Swig_require("temp",n,"type","*name","?parms",NIL);
    

    void Swig_restore(Node *n)

    This function restores a node to the state it was in prior to the last Swig_save() or Swig_require() call. This is used to undo node transformations.

    Debugging Functions

    The following functions can be used to help debug any SWIG DOH object.

    void Swig_print(DOH *object, int count = -1)
    Prints to stdout a string representation of any DOH type. The number of nested Hash types to expand is set by count (default is 1 if count<0). See Swig_set_max_hash_expand() to change default.
    
    
    void Swig_print_with_location(DOH *object, int count = -1)
    Prints to stdout a string representation of any DOH type, within [] brackets for Hash and List types, prefixed by line and file information. The number of nested Hash types to expand is set by count (default is 1 if count<0). See Swig_set_max_hash_expand() to change default.
    
    

    The following functions can be used to help debug SWIG parse trees.

    void Swig_print_tags(Node *node, String_or_char *prefix)

    Prints the tag-structure of the parse tree to standard output. node is the top-level parse tree node. prefix is a string prefix that's added to the start of each line. Normally, you would specify the empty string or NIL for prefix. This function is called by the -debug-tags option to SWIG.
    % swig -debug-tags -python example.i
     . top (:1)
     . top . include (/Users/beazley/Projects/share/swig/1.3.31/swig.swg:0)
     . top . include . include (/Users/beazley/Projects/share/swig/1.3.31/swigwarnings.swg:0)
     . top . include . include . include (/Users/beazley/Projects/share/swig/1.3.31/swigwarn.swg:0)
    ...
    ...
     . top . include (example.i:0)
     . top . include . module (example.i:2)
     . top . include . insert (example.i:7)
     . top . include . cdecl (example.i:5)
     . top . include . cdecl (example.i:6)
    
    Since many language modules include hundreds of typemaps and other information, the output of this can be significantly more complicated than you might expect.

    void Swig_print_node(Node *node)

    Prints the contents of a parse tree node, including all children, to standard output. The output includes all attributes and other details.

    void Swig_print_tree(Node *node)

    Prints the same output as Swig_print_node() except that it also processes all of the siblings of node. This can be used to dump the entire parse tree to standard output. The command line options -debug-module and -debug-top use this function to display the parse tree for a SWIG input file.
    swig-4.0.1/Doc/Devel/wrapobj.html0000644000175000017500000001663113527063513016455 0ustar williamwilliam Wrapper Objects

    Wrapper Objects

    David M. Beazley
    dave-swig@dabeaz.com
    January 15, 2007

    Introduction

    This document describes the functions related to management of wrapper objects. A wrapper object is a low-level data structure used to contain the C/C++ code that is emitted during the wrapping process. It contains not only the emitted code, but information about local variables. These objects are a critical component of almost all SWIG target language modules.

    The functions described here are declared in Source/Swig/swigwrap.h. This API is considered to be stable.

    Creating and Destroying Wrappers

    The following functions create and destroy wrapper objects.

    Wrapper *NewWrapper()

    Creates a new wrapper object.

    void DelWrapper(Wrapper *w)

    Destroys a wrapper object.

    Wrapper Objects

    The Wrapper object returned by NewWrapper() has three public attributes.
    typedef struct Wrapper {
        String *def;
        String *locals;
        String *code;
    } Wrapper;
    
    The def attribute is a string that holds the function definition line. This line declares the function name, return type, and parameters. Language modules create this declaration by simply printing the appropriate text into this attribute.

    The locals attribute is a string that holds the code related to any local variables declaration. Normally, language modules do not emit code to this string directly. They use Wrapper_add_local() or Wrapper_new_local() to do this.

    The code attribute is a string that holds code related to the body of the function. Almost all code emitted by SWIG language modules is printed into this attribute.

    Creating Local Variables

    Perhaps the most useful aspect of Wrapper objects is the management of local variables. When creating a wrapper, it is often necessary to emit local variables related to the API of the target language. In addition to this, typemaps and other aspects of SWIG rely upon their own local variables. The following functions are used to create local variables, but also provide support for renaming variables in order to avoid name clashes.

    int Wrapper_add_local(Wrapper *w, const String_or_char *name, const String_or_char *decl)

    Adds a new local variable to the wrapper object. name is the name of the local variable. decl is a string containing the actual variable declaration code. For example, if you wanted to declare a variable "int x = 42;", you would set name to "x" and decl to "int x = 42;". On success, the text in decl is added to the locals attribute of w and 0 is returned. -1 is returned if a variable with the given name has already been declared.

    int Wrapper_add_localv(Wrapper *w, const String_or_char *name, ...)

    The same as Wrapper_add_local() except that instead of passing a single string for the declaration, a NULL-terminated list of strings can be passed. These strings are joined together when producing the output. This convention turns out to be fairly useful since language modules often create their output into pieces.

    char * Wrapper_new_local(Wrapper *w, const String_or_char *name, const String_or_char *decl)

    The same as Wrapper_add_local() except that if a local variable with the given name already exists, this function picks a new name and adds the declaration using the new name. The actual name used for the variable is returned. This function is used when generating code originating from typemaps. For instance, if a typemap declares a local variable, that variable might have to be renamed if the same typemap is used more than once in the same function.

    char * Wrapper_new_localv(Wrapper *w, const String_or_char *name,...)

    The same as Wrapper_new_localv(), but accepts a NULL-terminated list of strings as code output.

    int Wrapper_check_local(Wrapper *w, const String_or_char *name)

    Checks to see if a local variable with name name has been declared. Returns 1 if the local is defined, 0 otherwise.

    Output

    void Wrapper_print(Wrapper *w, File *f)

    This function is used to format a wrapper function for output. The formatted wrapper function is emitted to f which may be any file-like object including a FILE * object or a String * object. When emitting the wrapper, the code printed to the wrapper object is automatically formatted. By default, the formatting is done according to a "pretty printing" style in which lines are split onto multiple lines and indented according to reasonable C formatting rules. This produces code that is moderately readable should you want to look at the wrapper code output. An alternative output mode is "compact printing" in which lines are collected and compacted. This may result in multiple C statements appearing on the same line. This mode is sometimes used when the size of a wrapper file is too large for certain compilers. For example, some compilers might impose a limit of 65536 lines per source file.

    void Wrapper_compact_print_mode_set(int flag)

    Sets the output mode of the Wrapper_print() function. If flag is set to 1, then wrapper code is formatted to be compact.

    void Wrapper_pretty_print(String *str, File *f)

    Utility function that reformats a string containing C/C++ code and outputs it to the file-like object f. The formatting process indents the code and structures it according to reasonable C formatting rules.

    void Wrapper_compact_print(String *str, File *f)

    Utility function that reformats a string containing C/C++ code and outputs it to the file-like object f. The formatting process tries to make the code as compact as possible, without going completely overboard. For example, multiple C statements may be combined onto a single line and braces may be aligned to not use up extra lines.

    An Example

    Here is a simple example of how these functions are used. Suppose you wanted to emit the following C function:
    void foo(int n) {
       int i;
       for (i = 0; i < n; i++) {
           printf("%d\n", i);
       }
    }
    
    Here is code that generates the above function:
    Wrapper *w = NewWrapper();
    Printf(w->def,"void foo(int n) {");
    Wrapper_add_local(w,"n","");         /* parameter n */
    Wrapper_add_local(w,"i", "int i;");  /* local i */
    Printv(w->code,"for (i = 0; i < n; i++) {",
                   "printf(\"%d\n",i);",
                   "}\n", NIL);
    Printf(w->code,"}\n");
    
    /* Emit wrapper code */
    Wrapper_print(w,outf);
    DelWrapper(w);
    
    Within different language modules, this process is obviously much more involved. However, this example shows the basic idea of how C/C++ code is prepared for output. swig-4.0.1/Doc/Devel/internals.html0000644000175000017500000011566013527063513017012 0ustar williamwilliam SWIG Internals

    SWIG Internals Manual

    (Note : This is a work in progress.)

    Table of Contents

    1. Introduction

    This document details SWIG internals: architecture and sometimes implementation. The first few sections concentrate on data structures, interfaces, conventions and code shared by all language targets. Subsequent sections focus on a particular language.

    The audience is assumed to be SWIG developers (who should also read the SWIG Engineering Manual before starting to code).

    1.1 Directory Guide

    Doc HTML documentation. If you find a documentation bug, please let us know.
    Examples This subdir tree contains examples of using SWIG w/ different scripting languages, including makefiles. Typically, there are the "simple" and "class" examples, w/ some languages offering additional examples. See the README more index.html file in each directory for more info. [FIXME: Ref SWIG user manual.]
    Lib These are the .i (interface) files that form the SWIG installed library. Language-specific files are in subdirectories (for example, guile/typemaps.i). Each language also has a .swg file implementing runtime type support for that language. The SWIG library is not versioned.
    Misc Currently this subdir only contains file fileheader. See the Engineering Manual for more info.
    Source The C and C++ source code for the swig executable is in this subdir tree.
    DOH C library providing memory allocation, file access and generic containers.
    Include Configuration .h files
    CParse Parser (lex / yacc) files and support
    Modules Language-specific callbacks that does actual code generation (each language has a .cxx and a .h file).
    Preprocessor SWIG-specialized C/C++ preprocessor.
    Swig This directory contains the ANSI C core of the system and contains generic functions related to types, file handling, scanning, and so forth.
    Tools The mkdist.py script and other tools. Win This improperly-named (spit spit) subdir only has README.txt.

    1.2 Overall Program Flow

    Here is the general control flow and where under subdir Source to look for code:
    • Modules/swigmain.cxx:main() is the program entry point. It parses the language-specifying command-line option (for example, -java), creating a new language-specific wrapping object (each language is a C++ class derived from base class Language). This object and the command-line is passed to SWIG_main(), whose return value is the program exit value.
    • Modules/main.cxx:SWIG_main() is the "real" main. It initializes the preprocessor and typemap machinery, defines some preprocessor symbols, locates the SWIG library, processes common command-line options, and then calls the language-specific command-line parser. From here there are three paths: "help", "checkout" and everything else.
      • In "help" mode, clean up open files and exit.
      • In "checkout" mode, copy specified files from the SWIG library to the current directory. Errors cause error messages but no non-local exits.
      • Otherwise, do wrapping: determine output file name(s), define some preprocessor symbols and run the preprocessor, initialize the interface-definition parser, set up the typemap for handling new return strings, and finally do the language-specific parse (by calling the language object's parse() method), which creates output files by side-effect.
      Afterwards, remove temporary files, and clean up. If the command-line included -freeze, go into an infinite loop; otherwise return the error count.
    • The language-specific parse() (and all other language-specific code) lives in Modules/foo.{h,cxx} for language Foo. Typically, FOO::parse() calls FOO::headers() and then the global function yyparse(), which uses the callbacks registered by SWIG_main() above.

    2. DOH

    DOH is a collection of low-level objects such as strings, lists, and hash tables upon which the rest of SWIG is built. The name 'DOH' unofficially stands for "Dave's Object Hack", but it's also a good expletive to use when things don't work (as in "SWIG core dumped---DOH!").

    2.1 Motivation and Background

    The development of DOH is influenced heavily by the problems encountered during earlier attempts to create a C++ based version of SWIG2.0. In each of these attempts (over a 3 year period), the resulting system always ended up growing into a colossal nightmare of large inheritance hierarchies and dozens of specialized classes for different types of objects (functions, variables, constants, etc.). The end result was that the system was tremendously complicated, difficult to understand, difficult to maintain, and fairly inflexible in the grand scheme of things.

    DOH takes a different approach to tackling the complexity problem. First, rather than going overboard with dozens of types and class definitions, DOH only defines a handful of simple yet very useful objects that are easy to remember. Second, DOH uses dynamic typing---one of the features that make scripting languages so useful and which make it possible to accomplish things with much less code. Finally, DOH utilizes a few coding tricks that allow it to perform a limited form of function overloading for certain C datatypes (more on that a little later).

    The key point to using DOH is that instead of thinking about code in terms of highly specialized C data structures, just about everything ends up being represented in terms of a just a few datatypes. For example, structures are replaced by DOH hash tables whereas arrays are replaced by DOH lists. At first, this is probably a little strange to most C/C++ programmers, but in the long run in makes the system extremely flexible and highly extensible. Also, in terms of coding, many of the newly DOH-based subsystems are less than half the size (in lines of code) of the earlier C++ implementation.

    2.2 Basic Types

    The following built-in types are currently provided by DOH:
    • String. A string of characters with automatic memory management and high-level operations such as string replacement. In addition, strings support file I/O operations that make it possible to use them just about anyplace a file can be used.

    • List. A list of arbitrary DOH objects (of possibly mixed types).

    • Hash. A hash table that maps a set of string keys to a set of arbitrary DOH objects. The DOH version of an associative array for all of you Perl fans.

    • File. A DOH wrapper around the C FILE * structure. This is provided since other objects sometimes want to behave like files (strings for instance).

    • Void. A DOH wrapper around an arbitrary C pointer. This can be used if you want to place arbitrary C data structures in DOH lists and hash tables.
    Due to dynamic typing, all of the objects in DOH are represented by pointers of type DOH *. Furthermore, all objects are completely opaque--that means that the only way to access the internals of an object is through a well-defined public API. For convenience, the following symbolic names are sometimes used to improve readability:
    • DOHString *. A String object.
    • DOHList *. A list object.
    • DOHHash *. A hash object.
    • DOHFile *. A file object.
    • DOHVoid *. A void object.
    • DOHString_or_char *. A DOH String object or a raw C "char *".
    It should be stressed that all of these names are merely symbolic aliases to the type DOH * and that no compile-time type checking is performed (of course, a runtime error may occur if you screw up).

    2.3 Creating, Copying, and Destroying Objects

    The following functions can be used to create new DOH objects
    • NewString(DOHString_or_char *value)
      Create a new string object with contents initially set to value. value can be either a C string or a DOH string object.

    • NewStringf(char *fmt, ...)
      Create a new string object with contents initially set to a formatted string. Think of this as being sprintf() combined with an object constructor.

    • NewList()
      Create a new list object that is initially empty.

    • NewHash()
      Create a new hash object that is initially empty.

    • NewFile(DOHString_or_char *filename, char *mode)
      Open a file and return a file object. This is a wrapper around the C fopen() library call.

    • NewFileFromFile(FILE *f)
      Create a new file object given an already opened FILE * object.

    • NewVoid(void *obj, void (*del)(void *))
      Create a new DOH object that is a wrapper around an arbitrary C pointer. del is an optional destructor function that will be called when the object is destroyed.
    Any object can be copied using the Copy() function. For example:
    DOH *a, *b, *c, *d;
    a = NewString("Hello World");
    b = NewList();
    c = Copy(a);         /* Copy the string a */
    d = Copy(b);         /* Copy the list b */
    
    Copies of lists and hash tables are shallow. That is, their contents are only copied by reference.

    Objects can be deleted using the Delete() function. For example:

    DOH *a = NewString("Hello World");
    ...
    Delete(a);              /* Destroy a */
    
    All objects are referenced counted and given a reference count of 1 when initially created. The Delete() function only destroys an object when the reference count reaches zero. When an object is placed in a list or hash table, its reference count is automatically increased. For example:
    DOH *a, *b;
    a = NewString("Hello World");
    b = NewList();
    Append(b,a);         /* Increases refcnt of a to 2 */
    Delete(a);           /* Decreases refcnt of a to 1 */
    Delete(b);           /* Destroys b, and destroys a */
    
    Should it ever be necessary to manually increase the reference count of an object, the DohIncref() function can be used:
    DOH *a = NewString("Hello");
    DohIncref(a);
    

    2.4 A Word About Mutability and Copying

    All DOH objects are mutable regardless of their current reference count. For example, if you create a string and then create a 1000 references to it (in lists and hash tables), changes to the string will be reflected in all of the references. Therefore, if you need to make any kind of local change, you should first make a copy using the Copy() function. Caveat: when copying lists and hash tables, elements are copied by reference.

    2.5 Strings

    The DOH String type is perhaps the most flexible object. First, it supports a variety of string-oriented operations. Second, it supports many of the same operations as lists. Finally, strings provide file I/O operations that allow them to be used interchangeably with DOH file objects. [ TODO ]

    2.6 Lists

    Example usage of lists:

    /* Create and populate */
    List *list = NewList();
    Append(list, NewString("listval1"));
    Append(list, NewString("listval2"));
    Append(list, NewString("listval3"));
    Append(list, NewString("listval4"));
    Append(list, NewString("listval5"));
    
    /* Size */
    Printf(stdout, "list len: %d\n", Len(list));
    
    /* Delete */
    Delitem(list, 3);
    
    /* Replace */
    Setitem(list, 0, NewString("newlistval1"));
    
    /* Get */
    String *item = Getitem(list,1);
    if (item)
      Printf(stdout, "get: %s\n", item);
    else
      Printf(stdout, "get: [non-existent]\n");
    
    /* Iterate through the container */
    int len = Len(list);
    for (int i=0; i<len; i++) {
      String *item = Getitem(list,i);
      Printf(stdout, "list item: %s\n", item);
    }
    

    SWIG File Handling

    David M. Beazley
    dave-swig@dabeaz.com
    December, 2006

    10 Preprocessing

    Resulting output:

    hash len: 5
    get: hashval2
    hash item: hashval5 [h5]
    hash item: hashval1 [h1]
    hash item: hashval2 [h2]
    hash item: hashval3 [h3]
    

    2.7 Hash tables

    Example usage of hash tables:

    /* Create and populate */
    Hash *hash = NewHash();
    Setattr(hash, "h1", NewString("hashval1"));
    Setattr(hash, "h2", NewString("hashval2"));
    Setattr(hash, "h3", NewString("hashval3"));
    Setattr(hash, "h4", NewString("hashval4"));
    Setattr(hash, "h5", NewString("hashval5"));
    
    /* Size */
    Printf(stdout, "hash len: %d\n", Len(hash));
    
    /* Delete */
    Delattr(hash, "h4");
    
    /* Get */
    String *item = Getattr(hash, "h2");
    if (item)
      Printf(stdout, "get: %s\n", item);
    else
      Printf(stdout, "get: [non-existent]\n");
    
    /* Iterate through the container */
    Iterator it;
    for (it = First(hash); it.key; it= Next(it))
      Printf(stdout, "hash item: %s [%s]\n", (it.item), (it.key));
    

    Resulting output:

    list len: 5
    get: listval2
    list item: newlistval1
    list item: listval2
    list item: listval3
    list item: listval5
    

    2.8 Files

    [ TODO ]

    2.9 Void objects

    [ TODO ]

    2.10 Utility functions

    [ TODO ]

    3. Types and Typemaps

    The representation and manipulation of types is currently in the process of being reorganized and (hopefully) simplified. The following list describes the current set of functions that are used to manipulate datatypes.

    • SwigType_str(SwigType *t, char *name).
      This function produces the exact string representation of the datatype t. name is an optional parameter that specifies a declaration name. This is used when dealing with more complicated datatypes such as arrays and pointers to functions where the output might look something like "int (*name)(int, double)".

    • SwigType_lstr(SwigType *t, char *name).
      This function produces a string representation of a datatype that can be safely be assigned a value (i.e., can be used as the "lvalue" of an expression). To do this, qualifiers such as "const", arrays, and references are stripped away or converted into pointers. For example:
      Original Datatype              lstr()
      ------------------             --------
      const char *a                  char *a
      double a[20]                   double *a
      double a[20][30]               double *a
      double &a                      double *a
      
      The intent of the lstr() function is to produce local variables inside wrapper functions--all of which must be reassignable types since they are the targets of conversions from a scripting representation.

    • SwigType_rcaststr(SwigType *t, char *name).
      This function produces a string that casts a type produced by the lstr() function to the type produced by the str() function. You might view it as the inverse of lstr(). This function only produces output when it needs to (when str() and lstr() produce different results). Furthermore, an optional name can be supplied when the cast is to be applied to a specific name. Examples:
      Original Datatype             rcaststr()
      ------------------            ---------
      char *a                       
      const char *a                 (const char *) name
      double a[20]                  (double *) name
      double a[20][30]              (double (*)[30]) name
      double &a                     (double &) *name
      

    • SwigType_lcaststr(SwigType *t, char *name).
      This function produces a string that casts a type produced by the str() function to the type produced by the lstr() function. This function only produces output when it needs to (when str() and lstr() produce different results). Furthermore, an optional name can be supplied when the cast is to be applied to a specific name.
      Original Datatype             lcaststr()
      ------------------            ---------
      char *a                       
      const char *a                 (char *) name
      double a[20]                  (double *) name
      double a[20][30]              (double *) name
      double &a                     (double *) &name
      

    • SwigType_manglestr(SwigType *t).
      Produces a type-string that is used to identify this datatype in the target scripting language. Usually this string looks something like "_p_p_double" although the target language may redefine the output for its own purposes. Normally this function strips all qualifiers, references, and arrays---producing a mangled version of the type produced by the lstr() function.
    The following example illustrates the intended use of the above functions when creating wrapper functions using shorthand pseudocode. Suppose you had a function like this:
    int foo(int a, double b[20][30], const char *c, double &d);
    
    Here's how a wrapper function would be generated using the type generation functions above:
    wrapper_foo() {
       lstr("int","result")
       lstr("int","arg0")
       lstr("double [20][30]", "arg1")
       lstr("const char *", "arg2")
       lstr("double &", "arg3")
       ...
       get arguments
       ...
       result = (lcaststr("int"))  foo(rcaststr("int","arg0"),
                                   rcaststr("double [20][30]","arg1"),
                                   rcaststr("const char *", "arg2"),
                                   rcaststr("double &", "arg3"))
       ...
    }
    
    Here's how it would look with the corresponding output filled in:
    wrapper_foo() {
       int      result;
       int      arg0;
       double  *arg1;
       char    *arg2;
       double  *arg3;
       ...
       get arguments
       ...
       result = (int) foo(arg0,
                          (double (*)[30]) arg1,
                          (const char *) arg2,
                          (double &) *arg3);
       ...
    }
    
    Notes:
    • For convenience, the string generation functions return a "char *" that points to statically allocated memory living inside the type library. Therefore, it is never necessary (and it's an error) to free the pointer returned by the functions. Also, if you need to save the result, you should make a copy of it. However, with that said, it is probably worth nothing that these functions do cache the last 8 results. Therefore, it's fairly safe to make a handful of repeated calls without making any copies.
    [TODO]

    4. Parsing

    [TODO]

    5. The C/C++ Wrapping Layer

    Added: Dave Beazley (July 22, 2000)

    When SWIG generates wrappers, it tries to provide a mostly seamless integration with the original code. However, there are a number of problematic features of C/C++ programs that complicate this interface.

    • Passing and returning structures by value. When used, SWIG converts all pass-by-value functions into wrappers that pass by reference. For example:
      double dot_product(Vector a, Vector b);
      
      gets turned into a wrapper like this:
      double wrap_dot_product(Vector *a, Vector *b) {
           return dot_product(*a,*b);
      }
      
      Functions that return by value require a memory allocation to store the result. For example:
      Vector cross_product(Vector *a, Vector *b);
      
      become
      Vector *wrap_cross_product(Vector *a, Vector *b) {
         Vector *result = (Vector *) malloc(sizeof(Vector));
         *result = cross_product(a,b);
         return result;
      }
      
      Note: If C++ is being wrapped, the default copy constructor is used instead of malloc() to create a copy of the return result.

    • C++ references. C++ references are handled exactly the same as pass/return by value except that a memory allocation is not made for functions that return a reference.

    • Qualifiers such as "const" and "volatile". SWIG strips all qualifiers from the interface presented to the target language. Besides, what in the heck is "const" in Perl anyways?

    • Instance Methods. Method invocations are handled as a function call in which a pointer to the object (the "this" pointer) appears as the first argument. For example, in the following class:
      class Foo {
      public:
          double bar(double);
      };
      
      The "bar" method is wrapped by a function like this:
      double Foo_bar(Foo *self, double arg0) {
         return self->bar(arg0);
      }
      

    • Structure/class data members. Data members are handled by creating a pair of wrapper functions that set and get the value respectively. For example:
      struct Foo {
          int x;
      };
      
      gets wrapped as follows:
      int Foo_x_get(Foo *self) {
          return self->x;
      }
      int Foo_x_set(Foo *self, int value) {
          return (self->x = value);
      }
      

    • Constructors. Constructors for C/C++ data structures are wrapped by a function like this:
      Foo *new_Foo() {
          return new Foo;
      }
      
      Note: For C, new objects are created using the calloc() function.

    • Destructors. Destructors for C/C++ data structures are wrapper like this:
      void delete_Foo(Foo *self) {
          delete self;
      }
      
      Note: For C, objects are destroyed using free().
    The creation of wrappers and various type transformations are handled by a collection of functions found in the file Source/Swig/cwrap.c.
    • char *Swig_clocal(DataType *t, char *name, char *value)
      This function creates a string containing the declaration of a local variable with type t, name name, and default value value. This local variable is stripped of all qualifiers and will be a pointer if the type is a reference or user defined type.

    • DataType *Swig_clocal_type(DataType *t)
      Returns a type object corresponding to the type string produced by the Swig_clocal() function.

    • char *Swig_clocal_deref(DataType *t, char *name)
      This function is the inverse of the clocal() function. Given a type and a name, it produces a string containing the code needed to cast/convert the type produced by Swig_clocal() back into its original type.

    • char *Swig_clocal_assign(DataType *t, char *name)
      Given a type and name, this produces a string containing the code (and an optional cast) needed to make an assignment from the real datatype to the local datatype produced by Swig_clocal(). Kind of the opposite of deref().

    • int Swig_cargs(Wrapper *w, ParmList *l)
      Given a wrapper function object and a list of parameters, this function declares a set of local variables for holding all of the parameter values (using Swig_clocal()). Returns the number of parameters. In addition, this function sets the local name of each parameter which can be retrieved using the Parm_Getlname() function.

    • void Swig_cresult(Wrapper *w, DataType *t, char *resultname, char *decl)
      Generates the code needed to set the result of a wrapper function and performs all of the needed memory allocations for ANSI C (if necessary). t is the type of the result, resultname is the name of the result variable, and decl is a string that contains the C code which produces the result.

    • void Swig_cppresult(Wrapper *w, DataType *t, char *resultname, char *decl)
      Generates the code needed to set the result of a wrapper function and performs all of the needed memory allocations for C++ (if necessary). t is the type of the result, resultname is the name of the result variable, and decl is a string that contains the C code which produces the result.

    • Wrapper *Swig_cfunction_wrapper(char *fname, DataType *rtype, ParmList *parms, char *code)
      Create a wrapper around a normal function declaration. fname is the name of the wrapper, rtype is the return type, parms are the function parameters, and code is a string containing the code in the function body.

    • Wrapper *Swig_cmethod_wrapper(char *classname, char *methodname, DataType *rtype, DataType *parms, char *code)

    • char *Swig_cfunction_call(char *name, ParmList *parms) This function produces a string containing the code needed to call a C function. The string that is produced contains all of the transformations needed to convert pass-by-value into pass-by-reference as well as handle C++ references. Produces a string like "name(arg0, arg1, ..., argn)".
    Here is a short example showing how these functions could be used. Suppose you had a C function like this:
    double dot_product(Vector a, Vector b);
    
    Here's how you might write a really simple wrapper function
    ParmList *l = ... parameter list of the function ...
    DataType *t = ... return type of the function ...
    char     *name = ... name of the function ...
    Wrapper *w = NewWrapper();
    Printf(w->def,"void wrap_%s() {\n", name);
    
    /* Declare all of the local variables */
    Swig_cargs(w, l);
    
    /* Convert all of the arguments */
    ...
    
    /* Make the function call and declare the result variable */
    Swig_cresult(w,t,"result",Swig_cfunction(name,l));
    
    /* Convert the result into whatever */
    ...
    
    Printf(w->code,"}\n");
    Wrapper_print(w,out);
    
    The output of this would appear as follows:
    void wrap_dot_product() {
        Vector *arg0;
        Vector *arg1;
        double  result;
    
        ...
        result = dot_product(*arg0, *arg1);
        ...
    }
    
    Notice that the Swig_cargs(), Swig_cresult(), and Swig_cfunction() functions have taken care of the type conversions for the Vector type automatically.

    Notes:

    • The intent of these functions is to provide consistent handling of function parameters and return values so that language module writers don't have to worry about it too much.

    • These functions may be superseded by features in the new typemap system which provide hooks for specifying local variable declarations and argument conversions.

    6. Symbol Naming Guidelines for Generated C/C++ Code

    The C++ standard (ISO/IEC 14882:1998(E)) states:
    
    17.4.3.1.2 Global names [lib.global.names]
    
    1 Certain sets of names and function signatures are always reserved to the implementation:
    
        * Each name that contains a double underscore (__) or begins with an underscore followed 
          by an upper case letter (2.11) is reserved to the implementation for any use.
        * Each name that begins with an underscore is reserved to the implementation for use as 
          a name in the global namespace.165)
    
        165) Such names are also reserved in namespace ::std (17.4.3.1). [back to text] 
    
    
    When generating code it is important not to generate symbols that might clash with the code being wrapped. It is tempting to flout the standard or just use a symbol which starts with a single underscore followed by a lowercase letter in order to avoid name clashes. However even these legal symbols can also clash with symbols being wrapped. The following guidelines should be used when generating code in order to meet the standard and make it highly unlikely that symbol clashes will occur:

    For C++ code that doesn't attempt to mangle a symbol being wrapped (for example SWIG convenience functions):

    • Put symbols in the Swig namespace, for example class Swig::Director. Qualify using the Swig namespace whenever the symbol is referenced, even within the Swig namespace, for example new Swig::Director() not new Director().
    • Use swig_ as a prefix for all member variables and member functions that are involved in an inheritance chain with wrapped classes, for example Swig::Director::swig_get_up() and bool Swig::Director::swig_up.
    • Alternatively class names can be prefixed with Swig in the global namespace for example template<class T> class SwigValueWrapper.

    For code compiled as C or C++ that doesn't attempt to mangle a symbol being wrapped (for example SWIG convenience functions):

    • Use SWIG_ as a prefix for structures for example SWIG_JavaExceptions_t.
    • Use SWIG_ as a prefix for global functions for example SWIG_TypeRegister.
    • Use SWIG_ as a prefix for macros for example #define SWIG_PY_INT 1
    For code compiled as C or C++ that attempts to mangle a wrapped symbol:
    • Use SWIGxxx or Swigxxx as a prefix where xxx is chosen which would make SWIGxxx/Swigxxx a unique symbol in the global namespace, for example class SwigDirectorFoo when wrapping class Foo. Don't use a trailing underscore for the prefix as this may generate a double underscore when wrapping a symbol which starts with a single underscore.
    In the past SWIG has generated many symbols which flout the standard especially double underscores. In fact they may not all be rooted out yet, so please fix them when you see them.

    7. Debugging SWIG

    The DOH types used in the SWIG source code are all typedefined to void. Consequently, it is impossible for debuggers to automatically extract any information about DOH objects. The easiest approach to debugging and viewing the contents of DOH objects is to make a call into one of the family of SWIG print functions from the debugger. The "Debugging Functions" section in SWIG Parse Tree Handling lists them. It is sometimes easier to debug by placing a few calls to these functions in code of interest and recompile, especially if your debugger cannot easily make calls into functions within a debugged binary.

    The SWIG distribution comes with some additional support for the gdb debugger in the Tools/swig.gdb file. Follow the instructions in this file for 'installing'. This support file provides an easy way to call into some of the family of SWIG print functions via additional user-defined gdb commands. Some usage of the swigprint and locswigprint user-defined commands are demonstrated below.

    More often than not, a parse tree node needs to be examined. The session below displays the node n in one of the Java language module wrapper functions. The swigprint method is used to show the symbol name (symname - a DOH String type) and the node (n - a DOH Hash type).

    Breakpoint 1, JAVA::functionWrapper (this=0x97ea5f0, n=0xb7d2afc8) at Modules/java.cxx:799
    799	    String *symname = Getattr(n, "sym:name");
    (gdb) next
    800	    SwigType *t = Getattr(n, "type");
    (gdb) swigprint symname
    Shape_x_set
    (gdb) swigprint n
    Hash(0xb7d2afc8) {
      'membervariableHandler:view' : variableHandler, 
      'feature:except' : 0, 
      'name' : x, 
      'ismember' : 1, 
      'sym:symtab' : Hash(0xb7d2aca8) {......}, 
      'nodeType' : cdecl, 
      'nextSibling' : Hash(0xb7d2af98) {.............}, 
      'kind' : variable, 
      'variableHandler:feature:immutable' : <Object 'VoidObj' at 0xb7cfa008>, 
      'sym:name' : Shape_x_set, 
      'view' : membervariableHandler, 
      'membervariableHandler:sym:name' : x, 
      'membervariableHandler:type' : double, 
      'membervariableHandler:parms' : <Object 'VoidObj' at 0xb7cfa008>, 
      'parentNode' : Hash(0xb7d2abc8) {..............................}, 
      'feature:java:enum' : typesafe, 
      'access' : public, 
      'parms' : Hash(0xb7cb9408) {......}, 
      'wrap:action' : if (arg1) (arg1)->x = arg2;, 
      'type' : void, 
      'memberset' : 1, 
      'sym:overname' : __SWIG_0, 
      'membervariableHandler:name' : x, 
    }
    

    Note that all the attributes in the Hash are shown, including the 'sym:name' attribute which was assigned to the symname variable.

    Hash types can be shown either expanded or collapsed. When a Hash is shown expanded, all the attributes are displayed along with their values, otherwise a '.' replaces each attribute when collapsed. Therefore a count of the dots provides the number of attributes within an unexpanded Hash. Below shows the 'parms' Hash being displayed with the default Hash expansion of 1, then with 2 provided as the second argument to swigprint to expand to two Hash levels in order to view the contents of the collapsed 'nextSibling' Hash.

    (gdb) swigprint 0xb7cb9408
    Hash(0xb7cb9408) {
      'name' : self, 
      'type' : p.Shape, 
      'self' : 1, 
      'nextSibling' : Hash(0xb7cb9498) {...}, 
      'hidden' : 1, 
      'nodeType' : parm, 
    }
    (gdb) swigprint 0xb7cb9408 2
    Hash(0xb7cb9408) {
      'name' : self, 
      'type' : p.Shape, 
      'self' : 1, 
      'nextSibling' : Hash(0xb7cb9498) {
        'name' : x, 
        'type' : double, 
        'nodeType' : parm, 
      }, 
      'hidden' : 1, 
      'nodeType' : parm, 
    }
    

    The same Hash can also be displayed with file and line location information via the locswigprint command.

    (gdb) locswigprint 0xb7cb9408
    example.h:11: [Hash(0xb7cb9408) {
    Hash(0xb7cb9408) {
      'name' : self, 
      'type' : p.Shape, 
      'self' : 1, 
      'nextSibling' : Hash(0xb7cb9498) {...}, 
      'hidden' : 1, 
      'nodeType' : parm, 
    }]
    

    Tip: Commands in gdb can be shortened with whatever makes them unique and can be command completed with the tab key. Thus swigprint can usually be shortened to sw and locswigprint to loc. The help for each command can also be obtained within the debugging session, for example, 'help swigprint'.

    The sub-section below gives pointers for debugging DOH objects using casts and provides an insight into why it can be hard to debug SWIG without the family of print functions.

    7.1 Debugging DOH Types The Hard Way

    The DOH types used in SWIG are all typedefined to void and hence the lack of type information for inspecting types within a debugger. Most debuggers will however be able to display useful variable information when an object is cast to the appropriate type. Getting at the underlying C string within DOH types is cumbersome, but possible with appropriate casts. The casts below can be used in a debugger windows, but be sure to compile with compiler optimisations turned off before attempting the casts else they are unlikely to work. Even displaying the underlying string in a String * doesn't work straight off in all debuggers due to the multiple definitions of String as a struct and a void.

    Below are a list of common SWIG types. With each is the cast that can be used in the debugger to extract the underlying type information and the underlying char * string.

    • String *s;
    • (struct String *)((DohBase *)s)->data
      The underlying char * string can be displayed with
      (*(struct String *)(((DohBase *)s)->data)).str

    • SwigType *t;
    • (struct String *)((DohBase *)t)->data
      The underlying char * string can be displayed with
      (*(struct String *)(((DohBase *)t)->data)).str

    • const_String_or_char_ptr sc;
    • Either
      (*(struct String *)(((DohBase *)sc)->data)).str
      or
      (char *)sc
      will work depending on whether the underlying type is really a String * or char *.

    7.2 Debugging DOH memory allocation problems

    The DOH objects are reference counted and use pools for memory allocation. The implementation is in memory.c. When there are memory corruption problems, various memory allocator tools are normally used to diagnose problems. These can be used on SWIG and can be very useful. However, they won't necessarily find use of stale DOH objects, that is, DOH objects that are used after they have been deleted. This is because the DOH memory allocator grabs a chunk of memory from the C memory allocator and manages the usage internally. Stale DOH object usage can be checked for by defining DOH_DEBUG_MEMORY_POOLS in memory.c. If an attempt to use an object is made after the reference count is zero, an assertion is triggered instead of quietly re-using the stale object...

    swig: DOH/memory.c:91: DohCheck: Assertion `!DOH_object_already_deleted' failed.
    

    This can be memory intensive as previously used memory in the pool is not re-used so is only recommended for diagnosing memory corruption problems.


    Copyright (C) 1999-2010 SWIG Development Team. swig-4.0.1/Doc/Devel/migrate.txt0000644000175000017500000001122713527063513016310 0ustar williamwilliamSWIG1.3 Migration Guide (The not entirely complete guide to updating language modules to work with SWIG1.3). Dave Beazley August 15, 2000 1. Introduction --------------- Virtually all of SWIG's internal data structures have now been rewritten. Take everything you thought you knew about SWIG1.1 and throw it out. 2. DataTypes ------------ The old 'DataType' data structure is gone. Therefore, direct manipulation of 'is_pointer', 'implicit_ptr', and 'arraystr' attributes no longer applies. Sorry. Datatypes are now represented by the type 'SwigType' which has no public attributes. Actually, if you look at it closely, 'SwigType' is really just an alias for 'void' and if you look at it even closer than that you will realize that it's nothing more than a string! The string encoding of types is described in more detail in the file Source/Swig/stype.c and is not so important here. What is important is the functions used to produce various types of output: SwigType_str(type,name = 0); This produces an exact C representation of the datatype with all qualifiers, arrays, references, and so forth. name is an optional name that is given if you wanted to associate the type with a parameter name or something. SwigType_lstr(type,name = 0); This function takes a type and produces a C string containing a type suitable for assignment (appearing as an lvalue in an expression). To do this, certain things such as 'const', arrays, and references are stripped away or converted into pointers. SwigType_ltype(type); Returns a SwigType object corresponding to the type created by SwigType_lstr(). SwigType_lcaststr(type,name); Produces a string casting a value 'name' from the real datatype to the assignable type created by SwigType_lstr(). SwigType_rcaststr(type,name) Produces a string that casts a value 'name' from the type created by SwigType_lstr() to the real datatype. SwigType_manglestr(type) Produces the 'mangled' version of a datatype. Getting the 'type' code. Most language modules still operate by looking at special integer type codes. This interface is a little ragged and will probably go away at some point. However, for now the following function can be used to get the type code: int SwigType_type(type) The codes are the same as the before, except that there are a few special codes: T_STRING - The 'char *' type and variations. T_POINTER - Any pointer type (not char * though) T_REFERENCE - Any C++ reference T_ARRAY - Any array T_FUNCTION - A function (this is usually an error). Because of the special codes, it is no longer necessary to have code like this: if ((t->is_pointer == 1) and (t->type == T_CHAR)) { ... get a string ... } Instead, just use the type code above like this: switch(SwigType_type(type)) { case T_STRING: ... get a string ... break; case T_POINTER: ... get a pointer ... break; } There are about 2-dozen type manipulation functions that could also be useful. See Source/Swig/swig.h and Source/Swig/stype.c. 3. Parameter Lists ------------------ The ParmList data structure is gone. In reality, parameter lists are nothing more than a linked list of parameters. The proper way to iterate over this list and get parameter values is as follows: ParmList *l; Parm *p; for (p = l; p; p = Getnext(p)) { SwigType *pt = Gettype(p); /* Get parameter type */ String *pn = Getname(p); /* Get parameter name */ String *value = Getvalue(p); /* Get parameter value */ ... do whatever ... } 4. Typemaps ----------- Typemaps more or less work. However, the interface has changed slightly. Instead of typemap_lookup("in","python",type,pname,"$source","$target",wrapper); the function is Swig_typemap_lookup("in",type,pname,"$source","$target",wrapper); There are a variety of other changes to typemaps (see CHANGES). 5. Use of new types ------------------- When possible, language modules should try to use the built in String, List, and Hash objects instead of C arrays or 'char *'. This will probably require a detailed pass through the code with an eye towards cleanup. 6. Miscellaneous ---------------- Language modules no longer need to concern themselves with formatting the wrapper code they produce (provided you are using the special Wrapper object). The function Wrapper_print() passes everything through a pretty-printer that automatically performs indentation and tries to clean things up. This especially works well when there are lots of typemaps. swig-4.0.1/Doc/Devel/scanner.html0000644000175000017500000002420113527063513016432 0ustar williamwilliam SWIG C Scanner

    SWIG C/C++ Scanning

    David M. Beazley
    dave-swig@dabeaz.com
    January 11, 2007

    Introduction

    This document describes functions that can be used to tokenize C/C++ input text. These functions are relatively low-level and are meant to be used in the implementation of scanners that can be plugged into yacc or used for other purposes. For instance, the preprocessor uses these functions to evaluate and test constant expressions.

    All of these functions are declared in Source/Swig/swigscan.h. This API is considered to be stable.

    Creation and Deletion of Scanners

    The following functions are used to create and destroy a scanner object. More than one scanner object can be created and used as necessary.

    Scanner *NewScanner()

    Creates a new scanner object. The scanner contains initially contains no text. To feed text to the scanner use Scanner_push().

    Scanner *DelScanner()

    Deletes a scanner object.

    Scanner Functions

    void Scanner_clear(Scanner *s)

    Clears all text from the scanner. This can be used to reset a scanner to its initial state, ready to receive new input text.

    void Scanner_push(Scanner *s, String *text)

    Pushes an input string into the scanner. Subsequent tokens will be returned from the new string. If the scanner is already processing a string, the pushed string takes precedence--in effect, interrupting the scanning of the previous string. This behavior is used to implement certain SWIG features such as the %inline directive. Once the pushed string has been completely scanned, the scanner will return to scanning the previous string (if any). The scanning of text relies upon the DOH file interface to strings (Getc(), Ungetc(), etc.). Prior to calling this function, the input string should be set so that its file pointer is in the location where you want scanning to begin. You may have to use Seek() to set the file pointer back to the beginning of a string prior to using this function.

    void Scanner_pushtoken(Scanner *s, int tokvalue, String_or_char *val)

    Pushes a token into the scanner. This exact token will be returned by the next call to Scanner_token(). tokvalue is the integer token value to return and val is the token text to return. This function is only used to handle very special parsing cases. For instance, if you need the scanner to return a fictitious token into order to enter a special parsing case.

    int Scanner_token(Scanner *s)

    Returns the next token. An integer token code is returned (see table below) on success. If no more input text is available 0 is returned. If a scanning error occurred, -1 is returned. In this case, error information can be obtained using Scanner_errinfo().

    String *Scanner_text(Scanner *s)

    Returns the scanned text corresponding to the last token returned by Scanner_token(). The returned string is only valid until the next call to Scanner_token(). If you need to save it, make a copy.

    void Scanner_skip_line(Scanner *s)

    Skips to the end of the current line. The text skipped can be obtained using Scanner_text() afterwards.

    void Scanner_skip_balanced(Scanner *s, int startchar, int endchar)

    Skips to the end of a block of text denoted by starting and ending characters. For example, { and }. The function is smart about how it skips text. String literals and comments are ignored. The function also is aware of nesting. The skipped text can be obtained using Scanner_text() afterwards. Returns 0 on success, -1 if no matching endchar could be found.

    void Scanner_set_location(Scanner *s, int startchar, int endchar)

    Changes the current filename and line number of the scanner.

    String *Scanner_file(Scanner *s)

    Gets the current filename associated with text in the scanner.

    int Scanner_line(Scanner *s)

    Gets the current line number associated with text in the scanner.

    int Scanner_start_line(Scanner *s)

    Gets the starting line number of the last token returned by the scanner.

    void Scanner_idstart(Scanner *s, char *idchar)

    Sets additional characters (other than the C default) that may be used to start C identifiers. idchar is a string containing the characters (e.g., "%@"). The purpose of this function is to up special keywords such as "%module" or "@directive" as simple identifiers.

    String *Scanner_errmsg(Scanner *s)

    Returns the error message associated with the last scanner error (if any). This will only return a meaningful result if Scanner_token() returned -1.

    int Scanner_errline(Scanner *s)

    Returns the line number associated with the last scanner error (if any). This will only return a meaningful result if Scanner_token() returned -1. The line number usually corresponds to the starting line number of a particular token (e.g., for unterminated strings, comments, etc.).

    int Scanner_isoperator(int tokval)

    A convenience function that returns 0 or 1 depending on whether tokval is a valid C/C++ operator (i.e., a candidate for operator overloading).

    void Scanner_freeze_line(int val)

    Freezes the current line number depending upon whether or not val is 1 or 0. When the line number is frozen, newline characters will not result in updates to the line number. This is sometimes useful in tracking line numbers through complicated macro expansions.

    Token Codes

    The following table shows token codes returned by the scanner. These are integer codes returned by the Scanner_token() function.
    Token code                   C Token
    -------------------------    -------------
    SWIG_TOKEN_LPAREN            (
    SWIG_TOKEN_RPAREN            )
    SWIG_TOKEN_SEMI              ; 
    SWIG_TOKEN_COMMA             , 
    SWIG_TOKEN_STAR              * 
    SWIG_TOKEN_TIMES             *
    SWIG_TOKEN_LBRACE            { 
    SWIG_TOKEN_RBRACE            } 
    SWIG_TOKEN_EQUAL             = 
    SWIG_TOKEN_EQUALTO           == 
    SWIG_TOKEN_NOTEQUAL          != 
    SWIG_TOKEN_PLUS              + 
    SWIG_TOKEN_MINUS             - 
    SWIG_TOKEN_AND               & 
    SWIG_TOKEN_LAND              && 
    SWIG_TOKEN_OR                | 
    SWIG_TOKEN_LOR               || 
    SWIG_TOKEN_XOR               ^ 
    SWIG_TOKEN_LESSTHAN          < 
    SWIG_TOKEN_GREATERTHAN       > 
    SWIG_TOKEN_LTEQUAL           <= 
    SWIG_TOKEN_GTEQUAL           >= 
    SWIG_TOKEN_NOT               ~ 
    SWIG_TOKEN_LNOT              ! 
    SWIG_TOKEN_LBRACKET          [ 
    SWIG_TOKEN_RBRACKET          ] 
    SWIG_TOKEN_SLASH             / 
    SWIG_TOKEN_DIVIDE            /
    SWIG_TOKEN_BACKSLASH         \ 
    SWIG_TOKEN_POUND             # 
    SWIG_TOKEN_PERCENT           % 
    SWIG_TOKEN_MODULO            %
    SWIG_TOKEN_COLON             : 
    SWIG_TOKEN_DCOLON            :: 
    SWIG_TOKEN_DCOLONSTAR        ::*
    SWIG_TOKEN_LSHIFT            << 
    SWIG_TOKEN_RSHIFT            >> 
    SWIG_TOKEN_QUESTION          ? 
    SWIG_TOKEN_PLUSPLUS          ++ 
    SWIG_TOKEN_MINUSMINUS        -- 
    SWIG_TOKEN_PLUSEQUAL         += 
    SWIG_TOKEN_MINUSEQUAL        -= 
    SWIG_TOKEN_TIMESEQUAL        *= 
    SWIG_TOKEN_DIVEQUAL          /= 
    SWIG_TOKEN_ANDEQUAL          &= 
    SWIG_TOKEN_OREQUAL           |= 
    SWIG_TOKEN_XOREQUAL          ^= 
    SWIG_TOKEN_LSEQUAL           <<= 
    SWIG_TOKEN_RSEQUAL           >>= 
    SWIG_TOKEN_MODEQUAL          %= 
    SWIG_TOKEN_ARROW             -> 
    SWIG_TOKEN_ARROWSTAR         ->* 
    SWIG_TOKEN_PERIOD            . 
    SWIG_TOKEN_AT                @ 
    SWIG_TOKEN_DOLLAR            $ 
    SWIG_TOKEN_ENDLINE           Literal newline
    SWIG_TOKEN_ID                identifier 
    SWIG_TOKEN_FLOAT             Floating point with F suffix (e.g., 3.1415F)
    SWIG_TOKEN_DOUBLE            Floating point (e.g., 3.1415 )
    SWIG_TOKEN_INT               Integer (e.g., 314)
    SWIG_TOKEN_UINT              Unsigned integer (e.g., 314U)
    SWIG_TOKEN_LONG              Long integer (e.g., 314L) 
    SWIG_TOKEN_ULONG             Unsigned long integer (e.g., 314UL)
    SWIG_TOKEN_LONGLONG          Long long integer (e.g., 314LL )
    SWIG_TOKEN_ULONGLONG         Unsigned long long integer (e.g., 314ULL) 
    SWIG_TOKEN_CHAR              Character literal in single quotes ('c')
    SWIG_TOKEN_STRING            String literal in double quotes ("str")
    SWIG_TOKEN_RSTRING           Reverse quote string (`str`)
    SWIG_TOKEN_CODEBLOCK         SWIG code literal block %{ ... %}
    SWIG_TOKEN_COMMENT           C or C++ comment  (// or /* ... */)
    SWIG_TOKEN_ILLEGAL           Illegal character
    
    Notes
    • When more than one token code exist for the same token text, those codes are identical (e.g., SWIG_TOKEN_STAR and SWIG_TOKEN_TIMES).

    • String literals are returned in their exact representation in which escape codes (if any) have been interpreted.

    • All C identifiers and keywords are simply returned as SWIG_TOKEN_ID. To check for specific keywords, you will need to add extra checking on the returned text.

    • C and C++ comments include the comment starting and ending text (e.g., "//", "/*").

    • The maximum token integer value is found in the constant SWIG_MAXTOKENS. This can be used if you wanted to create an array or table for the purposes of remapping tokens to a different set of codes. For instance, if you are using these functions to write a yacc-compatible lexer.
    swig-4.0.1/Doc/Devel/parm.html0000644000175000017500000000507613527063513015751 0ustar williamwilliam SWIG Parameter Handling

    SWIG Parameter Handling

    David M. Beazley
    dave-swig@dabeaz.com
    January 9, 2007

    Introduction

    This document describes the functions related to management of function parameters and parameter lists in the SWIG core. These functions are declared in Source/Swig/swigparm.h. This API is considered to be stable.

    Parameters

    The following utility functions are used to create and copy individual parameters. In their most basic form, a parameter merely contains a type, a name, and an optional default value.

    Parm *NewParm(SwigType *type, const String_or_char *name)

    Creates a new parameter object with type type and name name. The type is stored in the attribute "type" and the name is stored in the attribute "name".

    Parm *CopyParm(Parm *p)

    Copies a parameter object. All string attributes are copied in the process of making the copy. However, no complex attributes (lists, hashes, etc.) are copied.

    Parameter Lists

    ParmList *CopyParmList(ParmList *p)

    Creates a copy of a parameter list. A parameter list is merely a linked list of parameters created by NewParm().

    ParmList *CopyParmListMax(ParmList *p, int count)

    Copies at most count parameters from the parameter list p.

    int ParmList_len(ParmList *p)

    Returns the total number of parameters in a parameter list.

    int ParmList_numrequired(ParmList *p)

    Returns the number of required parameters in a parameter list. This pertains to invoking a function/method in C/C++.

    int ParmList_has_defaultargs(ParmList *p)

    Returns 1 if the parameter list has any default arguments. Otherwise returns 0.

    Code Generation Functions

    String *ParmList_str(ParmList *p)

    Creates a C prototype string of the parameters, but without any default values.

    String *ParmList_str_defaultargs(ParmList *p)

    Creates a C prototype string of the parameters and includes the default values (if any).

    String *ParmList_protostr(ParmList *p)

    Creates a C prototype string of the parameters.
    swig-4.0.1/Doc/Devel/runtime.txt0000644000175000017500000001745513527063513016354 0ustar williamwilliamThis file describes the necessary functions and interfaces a language module needs to implement to take advantage of the run time type system. I assume you have read the run-time section of the Typemaps chapter in the SWIG documentation. Last updated: February 23, 2005 The file we are concerned with here should be named langrun.swg. A good example of a simple file is the Lib/mzscheme/mzrun.swg file. First, a few requirements and notes: 1) Every function in this file should be declared static. 2) It should be inserted into the runtime section of the _wrap file from your config file. The Lib/swigrun.swg file should be included before this file. That is, you need to have %runtime "swigrun.swg" %runtime "langrun.swg" 3) You must also include the swiginit.swg file in the init section of the wrapper. That is, you should have %insert(init) "swiginit.swg" 4) From module.cxx, you need to call the SwigType_emit_type_table function, as well as register types with SwigType_remember or SwigType_remember_clientdata 5) By convention, all functions in this file are of the form SWIG_Language_Whatever, and #defines are used to rename SWIG API functions to these function names 6) You need to call void SWIG_InitializeModule(void *clientdata) from your init function. 7) You need to implement the runtimeCode() and defaultExternalRuntimeFilename() functions inside module.cxx. runtimeCode should return all the language specific runtime code as a string, and defaultExternalRuntimeFilename should return a string for the default name of the external runtime header. This is usually "swigpyrun.h", where "py" is replaced by the language name. These two functions are used by the -external-runtime argument. ------------------------------------------------------------------------------- Required Functions ------------------------------------------------------------------------------- swig_module_info *SWIG_GetModule(void *clientdata); void SWIG_SetModule(void *clientdata, swig_module_info *mod); The SetModule function should store the mod argument into some globally accessible variable in the target language. The action of these two functions is to provide a way for multiple modules to share information. The SetModule function should create a new global var named something like "swig_runtime_data_type_pointer" SWIG_RUNTIME_VERSION SWIG_TYPE_TABLE_NAME SWIG_RUNTIME_VERSION is currently defined as "2", and SWIG_TYPE_TABLE_NAME is defined by the -DSWIG_TYPE_TABLE=mytable option when compiling the wrapper. Alternatively, if the language supports modules, a module named "swig_runtime_data" SWIG_RUNTIME_VERSION can be created, and a global variable named "type_table" SWIG_TYPE_TABLE_NAME can be created inside it. The most common approach is to store the mod pointer in some global variable in the target language, but if the language provides an alternative place to store data then that is good too. The way the code is set up, SetModule should only be called when GetModule returns NULL, and if SetModule is called a second time, the behavior is undefined. Just make sure it doesn't crash in the random chance occurrence that SetModule is called twice. There are two options here. 1) The preferred approach is for GetModule and SetModule to not require a clientdata pointer. If you can at all avoid it, please do so. Here, you would write swig_module_info *SWIG_Language_GetModule(); void SWIG_Language_SetModule(swig_module_info *mod); and then add #define SWIG_GetModule(clientdata) SWIG_Language_GetModule() #define SWIG_SetModule(cd, ptr) SWIG_Language_SetModule(ptr) You would then call SWIG_InitializeModule(0) 2) If GetModule and SetModule need to take a custom pointer (most notably an environment pointer, see tcl or mzscheme), then you should write swig_module_info *SWIG_Language_GetModule(void *clientdata) void SWIG_Language_SetModule(void *clientdata, swig_module_info *mod); and also define #define SWIG_GetModule(cd) SWIG_Language_GetModule(cd) #define SWIG_SetModule(cd, ptr) SWIG_Language_SetModule(cd, ptr) #define SWIG_MODULE_CLIENTDATA_TYPE Whatever SWIG_MODULE_CLIENTDATA_TYPE should be defined to whatever the type of clientdata is. You would then call SWIG_InitializeModule(clientdata), and clientdata would get passed to GetModule and SetModule. clientdata will not be stored and will only be referenced during the InitializeModule call. After InitializeModule returns, clientdata does not need to be valid any more. This method is not preferred, because it makes external access to the type system more complicated. See the Modules chapter of the documentation, and read the "External access to the run-time" section. Then take a look at Lib/runtime.swg. Anybody that calls SWIG_TypeQuery needs to pass along the clientdata pointer, and that is the reason for defining SWIG_MODULE_CLIENTDATA_TYPE. ------------------------------------------------------------------------------- Standard Functions ------------------------------------------------------------------------------- These functions are not required and their API is not formalized, but almost all language modules implement them for consistency across languages. Throughout this discussion, I will use LangType to represent the underlying language type (Scheme_Object * in mzscheme, PyObject * in python, etc) LangObj SWIG_NewPointerObj(void *ptr, swig_type_info *type, int flags); Create and return a new pointer object that has both ptr and type. For almost all language modules, flags is used for ownership. If flags==1, then the created pointer should be registered to be garbage collected. int SWIG_ConvertPtr(LangType obj, void **result, swig_type_info *type, int flags); Convert a language wrapped pointer into a void *. The pointer is returned in result, and the function should return 0 on success, non-zero on error. A sample ConvertPtr is given here: swig_cast_info *cast; if () { cast = SWIG_TypeCheck(, type); cast = SWIG_TypeCheckStruct(, type); if (cast) { *result = SWIG_TypeCast(cast, ); return 0; } } return 1; Either TypeCheck or TypeCheckStruct can be called, depending on how the pointer is wrapped in langtype. If obj stores the void pointer and the type name, then the TypeCheck function should be used, while if obj stores the void pointer and a pointer to the swig_type_info structure, then the TypeCheckStruct function should be called. The TypeCheckStruct is slightly faster, since it does a pointer comparison instead of a strcmp. The flag argument to ConvertPtr is used in some languages for disowning a pointer. If the wrapped C function is taking ownership of the pointer (that means, the wrapped C function is responsible for deleting the object), then that pointer should be removed from the garbage collector. We do that in the ConvertPtr function. The pointer is still valid in the target language, but when the target language type is garbage collected, it will not call the associated destructor. Languages have a special typemap called DISOWN that can be applied which passes this argument. All the languages have the flags argument for consistency, and the flags argument can be ignored or used for some other purpose. void *SWIG_MustGetPtr(LangType obj, swig_type_info *type, int flags, int argnum, const char *func_name) { void *result; if (SWIG_ConvertPtr(s, &result, type, flags)) { generate runtime type error ("Error in func_name, expected a" + type->str ? type->str : "void *" + "at argument number" + argnum); } return result; } This function is optional, and the number and type of parameters can be different, but is useful for typemap purposes: %typemap(in) SWIGTYPE *, SWIGTYPE &, SWIGTYPE [] { $1 = ($1_ltype)SWIG_MustGetPtr($input, $descriptor, 0, $argnum, FUNC_NAME); } swig-4.0.1/Doc/Devel/plan-gsoc-2012.txt0000644000175000017500000002736313527063513017135 0ustar williamwilliam Project Plan ============ SWIG Code Comments Google Summer of Code 2012 This document describes goals for the Google Summer of Code 2012, SWIG code documentation project. Author: Marko Klopcic, Dmitry Kabak Introduction ============ The goal of this project is _not_ to translate _any_ possible Doxygen formatted comment to JavaDoc or PyDoc, but to make it possible to translate a subset of comment types in C/C++ code to JavaDoc and PyDoc. Covering all the Doxygen functionality would be to complex for the limited time. However, the code must be flexible so that implementing missing features would not require redesign of the comment handling code in SWIG. There will also be a possibility to add untranslated comments to Java and Python code (## comments, see Doxygen manual), if the user will prefer to use Doxygen on the generated code. Note: '-OK-' tick below means that the item is implemented, committed and working. Abbreviations: JD - JavaDoc PD - PyDoc Functionality ============= Types of comments ----------------- Note: See 'http://www.stack.nl/~dimitri/doxygen/docblocks.html' for the detailed description of Doxygen syntax and terms used in this section. 1. -OK- Only JavaDoc (/** */) and Qt (/*! */) styles of comment blocks will be supported by SWIG translator. 2. -OK- The following doc after members will be supported: int var; ///< Detailed description after the member //!< int var; //!< Brief description after the member int var; ///< Brief description after the member 3. -OK- Only comments before or after declaration/definition will be supported. Comments with structural commands will be ignored (warning will be written). (What about writing them to 'package.info.java' for JD?) Tags ---- This section contains all doxygen tags taken from http://www.stack.nl/~dimitri/doxygen/commands.html. If a tag is marked as 'ignored', then the tag is ignored, but the text is copied to the destination documentation. 'Not implemented' means that the tag with it's contents is stripped out of the output. Doxygen tags: All tags: -OK- \a - translated to in JD, surrounded with _ in PD \addindex - ignored \addtogroup - ignored \anchor - ignored, not supported by JD and PD \arg - equivalent to \li \attention - ignored \authors, \author - translated to @author in JD, 'Author:' in PD \b - in JD, surrounded with __ in PD \brief - ignored \bug - ignored \c - translated to in JD, ignored in PD \callgraph - ignored, not supported by JD and PD \callergraph - ignored, not supported by JD and PD \category - ignored, used only in Objective C \cite - translated to in JD, single quotes in PD \class - ignored (structural command) \code - translated to {@code ...} in JD, ignored in PD \cond - translated to 'Conditional comment: '. Later SWIG may support definitions of conditions in config file. \copybrief - ignored. Later SWIG may support this command by performing copy \copydetails - ignored. Later SWIG may support this command by performing copy \copydoc - ignored. Later SWIG may support this command by performing copy \copyright - replaced with text 'Copyright' in PD and PD \date - ignored \def - ignored (structural command) \defgroup - not supported \deprecated - translated to @deprecated in JD, 'Deprecated:' in PD \details - ignored \dir - not supported \dontinclude - not supported \dot - not supported. Later SWIG may call dot and produce the graph image to include in JD and PD \dotfile - see note for \dot \e - equivalent \a \else - see note for \cond \elseif - see note for \cond \em - equivalent to \a \endcode - see note for \code \endcond - translated to 'End of conditional comment: '. Later SWIG may support definitions of conditions in config file. \enddot - see note for \dot \endhtmlonly - ignored \endif - see note for \cond \endinternal - ignored \endlatexonly - ignored \endlink - see note for \link \endmanonly - ignored \endmsc - see note for \msc \endrtfonly - ignored \endverbatim - see note for \verbatim \endxmlonly - ignored \enum - ignored (structural command) \example - translated to 'Example:' in JD and PD \exception - equivalent to throws, but translates to @exception in JD \extends - not supported \f$ - ignored. Later swig may call LATeX to produce bitmaps with formulas to include in JD and PD \f[ - see note for \f$ \f] - see note for \f$ \f{ - see note for \f$ \f} - see note for \f$ \file - ignored (structural command) \fn - ignored (structural command) \headerfile - not supported \hideinitializer - not supported \htmlinclude - not supported \htmlonly - ignored \if - see note for \cond \ifnot - see note for \cond \image - translated to in JD only when target=HTML, translated to 'Image: filename(Title)' \implements - not supported \include - not supported \includelineno - not supported \ingroup - not supported. Later swig may print group names as plain text in comments like 'Code group: something' in both JD and PD \internal - ignored \invariant - ignored \interface - ignored (structural command) \latexonly - ignored \li - trabslated to
  • in JD, ignored in PD \line - not supported \link - translated to {@link ...} in JD, ignored in PD \mainpage - ignored \manonly - ignored \memberof - not supported \msc - not supported. Later SWIG may call dot and produce the graph image to include in JD and PD \mscfile - see note for \msc \n - prints the new line \name - ignored \namespace - included in package-info.java if nspace feature is enabled, otherwise ignored, ignored in PD \nosubgrouping - ignored \note - translated to 'Note:' in both JD and PD \overload - prints 'This is an overloaded member function, provided for convenience. It differs from the above function only in what argument(s) it accepts.' to the output in both JD and PD \p - equivalent to \c \package - is kept same in JD (it is already a JD tag), ignored in PD \page - ignored \par - translated to

    in JD, 'Title: ...' in PD \paragraph - ignored \param - translated to @param in JD, special formatting in PD \post - ignored \pre - ignored \private - ignored \privatesection - ignored \property - ignored \protected - ignored \protectedsection - ignored \protocol - ignored (Objective-C tag) \public - ignored \publicsection - ignored \ref - ignored, not supported by JD and PD \related - ignored \relates - ignored \relatedalso - ignored \relatesalso - ignored \remark - translated to 'Remarks:' in both JD and PD \remarks - equivalent to remark \result - translated to @return in JD, 'Return:' in PD \return - equivalent to result \returns - equivalent to result \retval - ignored \rtfonly - ignored \sa - translated to @see in JD, 'See also:' in PD \section - not supported \see - equivalent to \sa \short - equivalent to \brief \showinitializer - not supported \since - translated to @since in JD, 'Since:' in PD \skip - not supported \skipline - not supported \snippet - not supported \struct - ignored (structural command) \subpage - not supported \subsection - not supported \subsubsection - not supported \tableofcontents - not supported \test - ignored \throw - translated to @throws in JD, 'Throws:' in PD \throws - equivalent to \throw \todo - translated to 'TODO:' in both JD and PD \tparam - similar to \arg \typedef - ignored (structural command) \union - ignored (structural command) \until - not supported \var - ignored (structural command) \verbatim - translated to {@literal ...} in JD, ignored in PD \verbinclude - ignored \version - translated to @version in JD, 'Version:' in PD \warning - translated to 'Warning:' in both JD and PD \weakgroup - not supported \xmlonly - ignored \xrefitem - ignored \$ - this and all the others below: these commands insert single char, it is escaped as HTML char in JD, kept as-is in PD \@ \\ \& \~ \< \> \# \% \" \. \:: Optional functionality ====================== That section describes some complex cases where the current code does not behave really well. Like a short to-do list of special cases. -OK- When translating functions with default parameters in swig to java, it creates overloaded functions with all the parameters except the default ones. We need to copy the doxygen comment to such functions and correct the list of @param tags. -OK- In doxygen there is a special tags (and even a special option) to create links to some code members from the current comment. Sometimes it needs a type of parameters specified because of the overloaded functions. And the same linking tags are supported in JD, but it has a completely different typesystem, so we need to translate the types of function parameters in comments also. For example: {@link MyClass#doSomething(const std::string &)} does not make sense in Java, so the type should be converted. {@link MyClass#doSomething(String)} Tests ===== The following test cases will be implemented: -OK- Class comments. -OK- Struct comments. -OK- Enum comments. -OK- Function comments. -OK- Var comments. -OK- Class attributes, comment before and after declaration. -OK- Class methods, comment of parameters in function comment. -OK- Class methods, comment of parameters after parameter declaration. -OK- Struct attributes, comment before and after declaration. -OK- Struct methods, comment of parameters in function comment. -OK- Struct methods, comment of parameters after parameter declaration. -OK- Enum items JD and Qt style, comment before items -OK- Enum items JD and Qt style, comment after items -OK- Class comment, with all supported tags. -OK- Class comment, with all doxygen tags, including ignored ones. The list of all tests, in form of shell commands to make it simple to test project by copying the text below into terminal program. make doxygen_parsing.cpptest -s make doxygen_translate.cpptest -s make doxygen_translate_all_tags.cpptest -s make doxygen_basic_translate.cpptest -s make doxygen_basic_notranslate.cpptest -s make doxygen_translate_links.cpptest -s make doxygen_tricky_constructs.cpptest -s Refactoring =========== All the code in directory _Doxygen_ should be refactored: -OK- all methods should be class members -OK- most static methods should be normal members -OK- replace C arrays of strings and sequential searches with STL data structures and algorithms. -OK- use singletons instead of class instantiaion for each comment found. Documentation ============= SWIG documentation will contain: -OK- command line options -OK- list of implemented features (types and placements of comments) -OK- list of unimplemented features (types and placements of comments) -OK- list of tags and their translations (all Doxygen tags). -OK- some amount of debugging and development information swig-4.0.1/Doc/Devel/cmdopt.html0000644000175000017500000000433113527063513016271 0ustar williamwilliam SWIG Command Line Handling

    SWIG Command Line Handling

    David M. Beazley
    dave-swig@dabeaz.com
    December, 2006

    Introduction

    This document describes the functions related to the handling of command line options passed to SWIG. These functions are defined in the header file Source/Swig/swigopt.h. This API is considered to be stable.

    Initialization

    Upon SWIG startup, the following function is called:

    void Swig_init_args(int argc, char **argv_)

    Registers command line options with the SWIG core. This creates an internal array that is used by other functions to mark whether or not a particular command line option was used. This is ultimately used to issue error messages about unused or unknown command line options. This function is currently invoked in the SWIG main() function that is found in Source/Modules/swigmain.cxx.

    Argument Marking

    As command line options are processed by language modules, the following functions are used to mark the arguments as used:

    void Swig_mark_arg(int n)

    Mark argument number n as used.

    int Swig_check_marked(int n)

    Check to see if argument n has been marked. Returns 0 or 1.

    Argument Checking

    The following function is used to check all of the command line options after parsing. It looks at the marked list and issues an error message if any unconsumed arguments are found.

    void Swig_check_options()

    Checks all command line options to see if they have all been processed. If not, an error message is generated and execution terminates with a call to exit(). This function is currently invoked in Source/Modules/main.cxx just before SWIG starts any processing of input files.

    Utility Function

    void Swig_arg_error())

    A generic function that issues an error message about being unable to parse command line options. SWIG is terminated by a call to exit(). swig-4.0.1/Doc/README0000644000175000017500000000040013527063513013727 0ustar williamwilliamDoc/Manual - Latest version of the SWIG user manual Doc/Devel - Developer documentation concerning SWIG internals. (not necessarily up to date) Open the index.html file in each of these directories with a web browser. swig-4.0.1/configure.ac0000644000175000017500000025336413527063513014653 0ustar williamwilliamdnl Process this file with autoconf to produce a configure script. dnl The macros which aren't shipped with the autotools are stored in the dnl Tools/config directory in .m4 files. AC_INIT([swig],[4.0.1],[http://www.swig.org]) AC_PREREQ(2.60) AC_CONFIG_SRCDIR([Source/Swig/swig.h]) AC_CONFIG_AUX_DIR([Tools/config]) AC_CONFIG_HEADERS([Source/Include/swigconfig.h]) AC_CANONICAL_HOST AM_INIT_AUTOMAKE dnl Some extra defines for the config file AH_BOTTOM([ /* Deal with attempt by Microsoft to deprecate C standard runtime functions */ #if defined(_MSC_VER) # define _CRT_SECURE_NO_DEPRECATE #endif ]) dnl Check for programs that a user requires to build SWIG AC_PROG_CC AC_PROG_CXX AM_PROG_CC_C_O # Needed for subdir-objects in AUTOMAKE_OPTIONS AC_COMPILE_WARNINGS # Increase warning levels AC_DEFINE_UNQUOTED(SWIG_CXX, ["$CXX"], [Compiler that built SWIG]) AC_DEFINE_UNQUOTED(SWIG_PLATFORM, ["$host"], [Platform that SWIG is built for]) dnl Checks for header files. AC_HEADER_STDC dnl Look for popen AC_ARG_WITH(popen, AS_HELP_STRING([--without-popen], [Disable popen]), with_popen="$withval") if test x"${with_popen}" = xno ; then AC_MSG_NOTICE([Disabling popen]) else AC_CHECK_FUNC(popen, AC_DEFINE(HAVE_POPEN, 1, [Define if popen is available]), AC_MSG_NOTICE([Disabling popen])) fi dnl PCRE AC_ARG_WITH([pcre], [AS_HELP_STRING([--without-pcre], [Disable support for regular expressions using PCRE])], [], [with_pcre=yes]) AC_MSG_CHECKING([whether to enable PCRE support]) AC_MSG_RESULT([$with_pcre]) dnl To make configuring easier, check for a locally built PCRE using the Tools/pcre-build.sh script if test x"${with_pcre}" = xyes ; then AC_MSG_CHECKING([whether to use local PCRE]) local_pcre_config=no if test -z $PCRE_CONFIG; then if test -f `pwd`/pcre/pcre-swig-install/bin/pcre-config; then PCRE_CONFIG=`pwd`/pcre/pcre-swig-install/bin/pcre-config local_pcre_config=$PCRE_CONFIG fi fi AC_MSG_RESULT([$local_pcre_config]) fi AS_IF([test "x$with_pcre" != xno], [AX_PATH_GENERIC([pcre], [], dnl Minimal version of PCRE we need -- accept any [], dnl custom sed script for version parsing is not needed [AC_DEFINE([HAVE_PCRE], [1], [Define if you have PCRE library]) LIBS="$LIBS $PCRE_LIBS" CPPFLAGS="$CPPFLAGS $PCRE_CFLAGS" ], [AC_MSG_FAILURE([ Cannot find pcre-config script from PCRE (Perl Compatible Regular Expressions) library package. This dependency is needed for configure to complete, Either: - Install the PCRE developer package on your system (preferred approach). - Download the PCRE source tarball, build and install on your system as you would for any package built from source distribution. - Use the Tools/pcre-build.sh script to build PCRE just for SWIG to statically link against. Run 'Tools/pcre-build.sh --help' for instructions. (quite easy and does not require privileges to install PCRE on your system) - Use configure --without-pcre to disable regular expressions support in SWIG (not recommended).]) ]) ]) dnl CCache AC_ARG_ENABLE([ccache], AS_HELP_STRING([--disable-ccache], [disable building and installation of ccache-swig executable (default enabled)]), [enable_ccache=$enableval], [enable_ccache=yes]) AC_MSG_CHECKING([whether to enable ccache-swig]) AC_MSG_RESULT([$enable_ccache]) if test "$enable_ccache" = yes; then AC_CONFIG_SUBDIRS(CCache) ENABLE_CCACHE=1 fi AC_SUBST(ENABLE_CCACHE) echo "" echo "Checking packages required for SWIG developers." echo "Note : None of the following packages are required for users to compile and install SWIG from the distributed tarball" echo "" AC_PROG_YACC echo "" echo "Checking for installed target languages and other information in order to compile and run" echo "the examples and test-suite invoked by 'make check'." echo "Note : None of the following packages are required for users to compile and install SWIG from the distributed tarball" echo "" dnl Some test cases require Boost AX_BOOST_BASE(,,,) AC_SUBST(BOOST_CPPFLAGS) dnl How to specify include directories that may be system directories. # -I should not be used on system directories (GCC) if test "$GCC" = yes; then ISYSTEM="-isystem " else ISYSTEM="-I" fi AC_MSG_NOTICE(ISYSTEM: $ISYSTEM) dnl Info for building shared libraries ... in order to run the examples # SO is the extension of shared libraries (including the dot!) AC_MSG_CHECKING(SO) if test -z "$SO" then case $host in *-*-hp*) SO=.sl;; *-*-darwin*) SO=.bundle;; *-*-cygwin* | *-*-mingw*) SO=.dll;; *) SO=.so;; esac fi AC_MSG_RESULT($SO) # LDSHARED is the ld *command* used to create shared library # -- "ld" on SunOS 4.x.x, "ld -G" on SunOS 5.x, "ld -shared" on IRIX 5 # (Shared libraries in this instance are shared modules to be loaded into # Python, as opposed to building Python itself as a shared library.) AC_MSG_CHECKING(LDSHARED) if test -z "$LDSHARED" then case $host in *-*-aix*) LDSHARED="\$(srcdir)/ld_so_aix \$(CC)";; *-*-cygwin* | *-*-mingw*) if test "$GCC" = yes; then LDSHARED="$CC -shared" else if test "cl" = $CC ; then # Microsoft Visual C++ (MSVC) LDSHARED="$CC -nologo -LD" else # Unknown compiler try gcc approach LDSHARED="$CC -shared" fi fi ;; *-*-irix5*) LDSHARED="ld -shared";; *-*-irix6*) LDSHARED="ld ${SGI_ABI} -shared -all";; *-*-sunos4*) LDSHARED="ld";; *-*-solaris*) LDSHARED="ld -G";; *-*-hp*) LDSHARED="ld -b";; *-*-osf*) LDSHARED="ld -shared -expect_unresolved \"*\"";; *-sequent-sysv4) LDSHARED="ld -G";; *-*-next*) if test "$ns_dyld" then LDSHARED='$(CC) $(LDFLAGS) -bundle -prebind' else LDSHARED='$(CC) $(CFLAGS) -nostdlib -r' fi if test "$with_next_framework" ; then LDSHARED="$LDSHARED \$(LDLIBRARY)" fi ;; *-*-linux*) LDSHARED="$CC -shared";; *-*-dgux*) LDSHARED="ld -G";; *-*-freebsd3*) LDSHARED="$CC -shared";; *-*-freebsd* | *-*-openbsd*) LDSHARED="ld -Bshareable";; *-*-netbsd*) if [[ "`$CC -dM -E - &1 | grep -i clang >/dev/null && CLANGXX=yes case $host in *-*-darwin11* | *-*-darwin12* |*-*-darwin13* ) if test "$CLANGXX" = "yes"; then PLATCXXFLAGS="$PLATCXXFLAGS -stdlib=libc++" fi;; *) ;; esac # Set info about shared libraries. AC_SUBST(SO) AC_SUBST(LDSHARED) AC_SUBST(CCSHARED) AC_SUBST(CXXSHARED) AC_SUBST(TRYLINKINGWITHCXX) AC_SUBST(RPATH) AC_SUBST(PLATCFLAGS) AC_SUBST(PLATCXXFLAGS) AC_SUBST(HAVE_CXX11_COMPILER) AC_SUBST(LINKFORSHARED) # This variation is needed on OS-X because there is no (apparent) consistency in shared library naming. # Sometimes .bundle works, but sometimes .so is needed. It depends on the target language AC_SUBST(PYTHON_SO) case $host in *-*-mingw*) PYTHON_SO=.pyd;; *-*-darwin*) PYTHON_SO=.so;; *) PYTHON_SO=$SO;; esac AC_SUBST(TCL_SO) case $host in *-*-darwin*) TCL_SO=.dylib;; *) TCL_SO=$SO;; esac AC_SUBST(GUILE_SO) case $host in *-*-darwin*) GUILE_SO=.so;; *) GUILE_SO=$SO;; esac AC_SUBST(PHP_SO) case $host in *-*-darwin*) PHP_SO=.so;; *) PHP_SO=$SO;; esac AC_SUBST(MZSCHEME_SO) case $host in *) MZSCHEME_SO=.so;; esac AC_SUBST(LUA_SO) case $host in *-*-darwin*) LUA_SO=.so;; *) LUA_SO=$SO;; esac # Check for specific libraries. Used for SWIG examples AC_CHECK_LIB(dl, dlopen) # Dynamic linking for SunOS/Solaris and SYSV AC_CHECK_LIB(dld, shl_load) # Dynamic linking for HP-UX dnl The following three libraries (nsl,inet,socket) are needed on Sequent, dnl and must be checked for in this order since each library depends on the dnl preceding one. dnl dnl Most SVR4 platforms will need -lsocket and -lnsl. However on SGI IRIX 5, dnl these exist but are broken, so we use AC_SEARCH_LIBS which will only try dnl the library if the function isn't already available without it. AC_SEARCH_LIBS(t_open, nsl) # SVR4 AC_SEARCH_LIBS(gethostbyname, inet) # Sequent AC_SEARCH_LIBS(socket, socket) # SVR4 sockets AC_CHECK_LIB(swill, swill_init, [SWIGLIBS="-lswill $LIBS" SWILL="-DSWIG_SWILL"]) AC_SUBST(SWIGLIBS) AC_SUBST(SWILL) # check for --with-libm=... AC_SUBST(LIBM) LIBM=-lm AC_ARG_WITH(libm, [ --with-libm=STRING math library], [ if test "$withval" != yes then LIBM=$withval else AC_MSG_ERROR([proper usage is --with-libm=STRING]) fi]) AC_CHECK_LIB(ieee, main, [LIBM="-lieee $LIBM"]) AC_CHECK_LIB(crypt,crypt, [LIBCRYPT="-lcrypt"]) AC_SUBST(LIBCRYPT) # check for --with-libc=... AC_SUBST(LIBC) AC_ARG_WITH(libc, [ --with-libc=STRING C library], [ if test "$withval" != yes then LIBC=$withval else AC_MSG_ERROR([proper usage is --with-libc=STRING]) fi]) #-------------------------------------------------------------------- # Target languages #-------------------------------------------------------------------- AC_ARG_WITH(alllang, AS_HELP_STRING([--without-alllang], [Disable all languages]), with_alllang="$withval") if test "$with_alllang" = "no"; then alllang_default=no else alllang_default=yes fi AC_CHECK_PROGS(PKGCONFIG, [pkg-config]) #-------------------------------------------------------------------- # Look for Tcl #-------------------------------------------------------------------- TCLINCLUDE= TCLLIB= TCLPACKAGE= AC_ARG_WITH(tclconfig, AS_HELP_STRING([--without-tcl], [Disable Tcl]) AS_HELP_STRING([--with-tclconfig=path], [Set location of tclConfig.sh]), [with_tclconfig="$withval"], [with_tclconfig=]) AC_ARG_WITH(tcl, [ --with-tcl=path Set location of Tcl package],[ TCLPACKAGE="$withval"], [TCLPACKAGE="$alllang_default"]) AC_ARG_WITH(tclincl,[ --with-tclincl=path Set location of Tcl include directory],[ TCLINCLUDE="$ISYSTEM$withval"], [TCLINCLUDE=]) AC_ARG_WITH(tcllib,[ --with-tcllib=path Set location of Tcl library directory],[ TCLLIB="-L$withval"], [TCLLIB=]) # First, check for "--without-tcl" or "--with-tcl=no". if test x"${TCLPACKAGE}" = xno; then AC_MSG_NOTICE([Disabling Tcl]) else AC_MSG_CHECKING([for Tcl configuration]) # First check to see if --with-tclconfig was specified. if test x"${with_tclconfig}" != x ; then if test -f "${with_tclconfig}/tclConfig.sh" ; then TCLCONFIG=`(cd ${with_tclconfig}; pwd)` else AC_MSG_ERROR([${with_tcl} directory does not contain tclConfig.sh]) fi fi # check in a few common install locations dirs="/usr/lib*/ /usr/lib*/tcl*/ /usr/local/lib*/ /usr/local/lib*/tcl*/" case $host in *-*-darwin*) dirs="/System/Library/Frameworks/Tcl.framework/ $dirs" ;; *) ;; esac if test x"${TCLCONFIG}" = x ; then for d in $dirs ; do for i in `ls -d -r $d 2>/dev/null` ; do if test -f $i"tclConfig.sh" ; then TCLCONFIG=`(cd $i; pwd)` break fi done done fi if test x"${TCLCONFIG}" = x ; then AC_MSG_RESULT(no) else AC_MSG_RESULT(found $TCLCONFIG/tclConfig.sh) . $TCLCONFIG/tclConfig.sh if test -z "$TCLINCLUDE"; then TCLINCLUDE=`echo $TCL_INCLUDE_SPEC | sed "s/-I/$ISYSTEM/"` fi if test -z "$TCLLIB"; then TCLLIB=$TCL_LIB_SPEC fi fi if test -z "$TCLINCLUDE"; then if test "x$TCLPACKAGE" != xyes; then TCLINCLUDE="$ISYSTEM$TCLPACKAGE/include" fi fi if test -z "$TCLLIB"; then if test "x$TCLPACKAGE" != xyes; then TCLLIB="-L$TCLPACKAGE/lib -ltcl" fi fi AC_MSG_CHECKING(for Tcl header files) if test -z "$TCLINCLUDE"; then AC_TRY_CPP([#include ], , TCLINCLUDE="") if test -z "$TCLINCLUDE"; then dirs="/usr/local/include /usr/include /opt/local/include" for i in $dirs ; do if test -r $i/tcl.h; then AC_MSG_RESULT($i) TCLINCLUDE="$ISYSTEM$i" break fi done fi if test -z "$TCLINCLUDE"; then AC_MSG_RESULT(not found) fi else AC_MSG_RESULT($TCLINCLUDE) fi AC_MSG_CHECKING(for Tcl library) if test -z "$TCLLIB"; then dirs="/usr/local/lib /usr/lib /opt/local/lib" for i in $dirs ; do if test -r $i/libtcl.a; then AC_MSG_RESULT($i) TCLLIB="-L$i -ltcl" break fi done if test -z "$TCLLIB"; then AC_MSG_RESULT(not found) fi else AC_MSG_RESULT($TCLLIB) fi # Cygwin (Windows) needs the library for dynamic linking case $host in *-*-cygwin* | *-*-mingw*) TCLDYNAMICLINKING="$TCLLIB";; *)TCLDYNAMICLINKING="";; esac case $host in *-*-darwin*) TCLLDSHARED='$(CC) -dynamiclib -undefined suppress -flat_namespace' TCLCXXSHARED='$(CXX) -dynamiclib -undefined suppress -flat_namespace' ;; *) TCLLDSHARED='$(LDSHARED)' TCLCXXSHARED='$(CXXSHARED)' ;; esac fi AC_SUBST(TCLINCLUDE) AC_SUBST(TCLLIB) AC_SUBST(TCLDYNAMICLINKING) AC_SUBST(TCLLDSHARED) AC_SUBST(TCLCXXSHARED) #---------------------------------------------------------------- # Look for Python #---------------------------------------------------------------- PYINCLUDE= PYLIB= PYLINK= PYPACKAGE= AC_ARG_WITH(python, AS_HELP_STRING([--without-python], [Disable Python]) AS_HELP_STRING([--with-python=path], [Set location of Python executable]),[ PYBIN="$withval"], [PYBIN="$alllang_default"]) # First, check for "--without-python" or "--with-python=no". if test x"${PYBIN}" = xno; then AC_MSG_NOTICE([Disabling Python]) else # First figure out the name of the Python executable if test "x$PYBIN" = xyes; then AC_CHECK_PROGS(PYTHON, [python python2.7]) else PYTHON="$PYBIN" fi PYVER=0 if test -n "$PYTHON"; then AC_MSG_CHECKING([for $PYTHON major version number]) PYVER=`($PYTHON -c "import sys; sys.stdout.write(sys.version[[0]])") 2>/dev/null` AC_MSG_RESULT($PYVER) if test -z "$PYVER"; then PYVER=0 else AC_MSG_CHECKING(for Python os.name) PYOSNAME=`($PYTHON -c "import sys, os; sys.stdout.write(os.name)") 2>/dev/null` AC_MSG_RESULT($PYOSNAME) AC_MSG_CHECKING(for Python path separator) PYSEPARATOR=`($PYTHON -c "import sys, os; sys.stdout.write(os.sep)") 2>/dev/null` AC_MSG_RESULT($PYSEPARATOR) fi fi if test $PYVER -eq 1 -o $PYVER -eq 2; then AC_MSG_CHECKING(for Python prefix) PYPREFIX=`($PYTHON -c "import sys; sys.stdout.write(sys.prefix)") 2>/dev/null` AC_MSG_RESULT($PYPREFIX) AC_MSG_CHECKING(for Python exec-prefix) PYEPREFIX=`($PYTHON -c "import sys; sys.stdout.write(sys.exec_prefix)") 2>/dev/null` AC_MSG_RESULT($PYEPREFIX) if test x"$PYOSNAME" = x"nt" -a x"$PYSEPARATOR" = x"\\"; then # Windows installations are quite different to posix installations (MinGW path separator is a forward slash) PYPREFIX=`echo "$PYPREFIX" | sed -e 's,\\\\,/,g'` # Forward slashes are easier to use and even work on Windows most of the time PYTHON_SO=.pyd AC_MSG_CHECKING(for Python header files) if test -r $PYPREFIX/include/Python.h; then PYINCLUDE="-I$PYPREFIX/include" fi AC_MSG_RESULT($PYINCLUDE) AC_MSG_CHECKING(for Python library directory) if test -d $PYPREFIX/libs; then PYLIB=$PYPREFIX/libs PYLINKFILE=`ls $PYLIB/python*.lib | grep "python[[0-9]][[0-9]]\.lib"` if test -r "$PYLINKFILE"; then PYLINK=-l`basename $PYLINKFILE | sed -e 's/\.lib$//'` else PYLIB= fi fi else # Note: I could not think of a standard way to get the version string from different versions. # This trick pulls it out of the file location for a standard library file. AC_MSG_CHECKING(for Python version) # Need to do this hack since autoconf replaces __file__ with the name of the configure file filehack="file__" PYVERSION=`($PYTHON -c "import sys,string,operator,os.path; sys.stdout.write(operator.getitem(os.path.split(operator.getitem(os.path.split(string.__$filehack),0)),1))") 2>/dev/null` AC_MSG_RESULT($PYVERSION) # Find the directory for libraries this is necessary to deal with # platforms that can have apps built for multiple archs: e.g. x86_64 AC_MSG_CHECKING(for Python lib dir) PYLIBDIR=`($PYTHON -c "import sys; sys.stdout.write(sys.lib)") 2>/dev/null` if test -z "$PYLIBDIR"; then # Fedora patch Python to add sys.lib, for other distros we assume "lib". PYLIBDIR="lib" fi AC_MSG_RESULT($PYLIBDIR) # Set the include directory AC_MSG_CHECKING(for Python header files) if test -r $PYPREFIX/include/$PYVERSION/Python.h; then PYINCLUDE="-I$PYPREFIX/include/$PYVERSION -I$PYEPREFIX/$PYLIBDIR/$PYVERSION/config" fi if test -z "$PYINCLUDE"; then if test -r $PYPREFIX/include/Py/Python.h; then PYINCLUDE="-I$PYPREFIX/include/Py -I$PYEPREFIX/$PYLIBDIR/python/lib" fi fi AC_MSG_RESULT($PYINCLUDE) # Set the library directory blindly. This probably won't work with older versions AC_MSG_CHECKING(for Python library directory) dirs="$PYVERSION/config $PYVERSION/$PYLIBDIR python/$PYLIBDIR" for i in $dirs; do if test -d $PYEPREFIX/$PYLIBDIR/$i; then PYLIB="$PYEPREFIX/$PYLIBDIR/$i" break fi done PYLINK="-l$PYVERSION" fi if test -z "$PYLIB"; then AC_MSG_RESULT(Not found) else AC_MSG_RESULT($PYLIB) fi AC_MSG_CHECKING(for Python library) if test -z "$PYLINK"; then AC_MSG_RESULT(Not found) else AC_MSG_RESULT($PYLINK) fi fi # Cygwin (Windows) needs the library for dynamic linking case $host in *-*-cygwin* | *-*-mingw*) PYTHONDYNAMICLINKING="-L$PYLIB $PYLINK" DEFS="-DUSE_DL_IMPORT $DEFS" ;; *)PYTHONDYNAMICLINKING="";; esac fi AC_SUBST(PYINCLUDE) AC_SUBST(PYLIB) AC_SUBST(PYLINK) AC_SUBST(PYTHONDYNAMICLINKING) #---------------------------------------------------------------- # Look for Python 3.x #---------------------------------------------------------------- PY3INCLUDE= PY3LIB= PY3LINK= PY3PACKAGE= AC_ARG_WITH(python3, AS_HELP_STRING([--without-python3], [Disable Python 3.x support]) AS_HELP_STRING([--with-python3=path], [Set location of Python 3.x executable]),[ PY3BIN="$withval"], [PY3BIN="$alllang_default"]) # First, check for "--without-python3" or "--with-python3=no". if test x"${PY3BIN}" = xno; then AC_MSG_NOTICE([Disabling Python 3.x support]) else if test -z "$PYVER"; then PYVER=0 fi if test "x$PY3BIN" = xyes; then if test x"$PYOSNAME" = x"nt" -a x"$PYSEPARATOR" = x"\\" -a $PYVER -ge 3; then PYTHON3="$PYTHON" else for py_ver in 3 3.9 3.8 3.7 3.6 3.5 3.4 3.3 3.2 ""; do AC_CHECK_PROGS(PYTHON3, [python$py_ver]) if test -n "$PYTHON3"; then AC_CHECK_PROGS(PY3CONFIG, [$PYTHON3-config]) if test -n "$PY3CONFIG"; then break fi fi done fi else PYTHON3="$PY3BIN" AC_CHECK_PROGS(PY3CONFIG, [$PYTHON3-config]) fi if test -n "$PYTHON3"; then AC_MSG_CHECKING([for $PYTHON3 major version number]) PYVER=`($PYTHON3 -c "import sys; sys.stdout.write(sys.version[[0]])") 2>/dev/null` AC_MSG_RESULT($PYVER) if test -z "$PYVER"; then PYVER=0 fi fi if test $PYVER -ge 3; then AC_MSG_CHECKING(for Python 3.x os.name) PY3OSNAME=`($PYTHON3 -c "import sys, os; sys.stdout.write(os.name)") 2>/dev/null` AC_MSG_RESULT($PY3OSNAME) AC_MSG_CHECKING(for Python 3.x path separator) PYSEPARATOR=`($PYTHON3 -c "import sys, os; sys.stdout.write(os.sep)") 2>/dev/null` AC_MSG_RESULT($PYSEPARATOR) if test x"$PY3OSNAME" = x"nt" -a x"$PYSEPARATOR" = x"\\"; then # Windows installations are quite different to posix installations # There is no python-config to use AC_MSG_CHECKING(for Python 3.x prefix) PY3PREFIX=`($PYTHON3 -c "import sys; sys.stdout.write(sys.prefix)") 2>/dev/null` AC_MSG_RESULT($PY3PREFIX) PY3PREFIX=`echo "$PY3PREFIX" | sed -e 's,\\\\,/,g'` # Forward slashes are easier to use and even work on Windows most of the time PYTHON_SO=.pyd AC_MSG_CHECKING(for Python 3.x header files) if test -r $PY3PREFIX/include/Python.h; then PY3INCLUDE="-I$PY3PREFIX/include" fi AC_MSG_RESULT($PY3INCLUDE) AC_MSG_CHECKING(for Python 3.x library directory) if test -d $PY3PREFIX/libs; then PY3LIB=$PY3PREFIX/libs PY3LINKFILE=`ls $PY3LIB/python*.lib | grep "python[[0-9]][[0-9]]\.lib"` if test -r "$PY3LINKFILE"; then PY3LINK=-l`basename $PY3LINKFILE | sed -e 's/\.lib$//'` else PY3LIB= fi fi if test -z "$PY3LIB"; then AC_MSG_RESULT([Not found]) else AC_MSG_RESULT($PY3LIB) fi AC_MSG_CHECKING([for Python 3.x library]) if test -z "$PY3LINK"; then AC_MSG_RESULT(Not found) else AC_MSG_RESULT($PY3LINK) fi elif test -n "$PY3CONFIG"; then AC_MSG_CHECKING([for Python 3.x prefix]) PY3PREFIX=`($PY3CONFIG --prefix) 2>/dev/null` AC_MSG_RESULT($PY3PREFIX) AC_MSG_CHECKING(for Python 3.x exec-prefix) # Piped through xargs to strip trailing whitespace (bug in msys2 + mingw Python) PY3EPREFIX=`($PY3CONFIG --exec-prefix | xargs) 2>/dev/null` AC_MSG_RESULT($PY3EPREFIX) # Note: I could not think of a standard way to get the version string from different versions. # This trick pulls it out of the file location for a standard library file. AC_MSG_CHECKING([for Python 3.x version]) # Need to do this hack since autoconf replaces __file__ with the name of the configure file filehack="file__" PY3VERSION=`($PYTHON3 -c "import string,operator,os.path; print(operator.getitem(os.path.split(operator.getitem(os.path.split(string.__$filehack),0)),1))") 2>/dev/null` AC_MSG_RESULT($PY3VERSION) # Find the directory for libraries this is necessary to deal with # platforms that can have apps built for multiple archs: e.g. x86_64 AC_MSG_CHECKING([for Python 3.x lib dir]) PY3LIBDIR=`($PYTHON3 -c "import sys; print(sys.lib)") 2>/dev/null` if test -z "$PY3LIBDIR"; then # some dists don't have sys.lib so the best we can do is assume lib PY3LIBDIR="lib" fi AC_MSG_RESULT($PY3LIBDIR) # Set the include directory AC_MSG_CHECKING([for Python 3.x header files]) PY3INCLUDE=`($PY3CONFIG --includes) 2>/dev/null` AC_MSG_RESULT($PY3INCLUDE) # Set the library directory blindly. This probably won't work with older versions AC_MSG_CHECKING([for Python 3.x library directory]) dirs="$PY3VERSION/config $PY3VERSION/$PY3LIBDIR python/$PY3LIBDIR" for i in $dirs; do if test -d $PY3EPREFIX/$PY3LIBDIR/$i; then PY3LIB="$PY3EPREFIX/$PY3LIBDIR/$i" break fi done if test -z "$PY3LIB"; then AC_MSG_RESULT([Not found]) else AC_MSG_RESULT($PY3LIB) fi PY3LINK="-l$PY3VERSION" AC_MSG_CHECKING([for Python 3.x library]) if test -z "$PY3LINK"; then AC_MSG_RESULT(Not found) else AC_MSG_RESULT($PY3LINK) fi fi fi # Cygwin (Windows) needs the library for dynamic linking case $host in *-*-cygwin* | *-*-mingw*) PYTHON3DYNAMICLINKING="-L$PY3LIB $PY3LINK" DEFS="-DUSE_DL_IMPORT $DEFS" ;; *)PYTHON3DYNAMICLINKING="";; esac AC_SUBST(PY3INCLUDE) AC_SUBST(PY3LIB) AC_SUBST(PY3LINK) AC_SUBST(PYTHON3DYNAMICLINKING) fi if test -n "$PYINCLUDE" || test -n "$PY3INCLUDE" ; then AC_CHECK_PROGS(PYCODESTYLE, pycodestyle) if test -n "$PYCODESTYLE"; then AC_MSG_CHECKING(pycodestyle version) pycodestyle_version=`$PYCODESTYLE --version 2>/dev/null` AC_MSG_RESULT($pycodestyle_version) fi fi AC_ARG_WITH(2to3, AS_HELP_STRING([--with-2to3=path], [Set location of Python 2to3 tool]), [PY2TO3BIN="$withval"], [PY2TO3BIN="yes"]) if test -n "$PYTHON3"; then if test "x$PY2TO3BIN" = xyes; then py3to2=`echo $PYTHON3 | sed -e "s/python/2to3-/"` AC_CHECK_PROGS(PY2TO3, $py3to2 2to3) if test -z "$PY2TO3"; then # Windows distributions don't always have the 2to3 executable AC_MSG_CHECKING(for 2to3.py) py2to3script="$PY3PREFIX/Tools/scripts/2to3.py" if test -f "$py2to3script"; then AC_MSG_RESULT($py2to3script) PY2TO3="$PYTHON3 $py2to3script" else AC_MSG_RESULT(Not found) fi fi else PY2TO3="$PY2TO3BIN" fi if test -z "$PY2TO3"; then PYTHON3= fi fi #---------------------------------------------------------------- # Look for Perl5 #---------------------------------------------------------------- PERLBIN= AC_ARG_WITH(perl5, AS_HELP_STRING([--without-perl5], [Disable Perl5]) AS_HELP_STRING([--with-perl5=path], [Set location of Perl5 executable]),[ PERLBIN="$withval"], [PERLBIN="$alllang_default"]) # First, check for "--without-perl5" or "--with-perl5=no". if test x"${PERLBIN}" = xno; then AC_MSG_NOTICE([Disabling Perl5]) PERL= else # First figure out what the name of Perl5 is if test "x$PERLBIN" = xyes; then AC_CHECK_PROGS(PERL, perl perl5.6.1 perl5.6.0 perl5.004 perl5.003 perl5.002 perl5.001 perl5 perl) else PERL="$PERLBIN" fi # This could probably be simplified as for all platforms and all versions of Perl the following apparently should be run to get the compilation options: # perl -MExtUtils::Embed -e ccopts AC_MSG_CHECKING(for Perl5 header files) if test -n "$PERL"; then PERL5DIR=`($PERL -MConfig -le 'print $Config{archlibexp}') 2>/dev/null` if test -n "$PERL5DIR" ; then dirs="$PERL5DIR $PERL5DIR/CORE" PERL5EXT=none for i in $dirs; do if test -r $i/perl.h; then AC_MSG_RESULT($i) PERL5EXT="$i" break fi done if test "$PERL5EXT" = none; then PERL5EXT="$PERL5DIR/CORE" AC_MSG_RESULT(could not locate perl.h...using $PERL5EXT) fi AC_MSG_CHECKING(for Perl5 library) PERL5LIB=`($PERL -e 'use Config; $_=$Config{libperl}; s/^lib//; s/$Config{_a}$//; s/\.$Config{so}.*//; print $_, "\n"') 2>/dev/null` if test -z "$PERL5LIB" ; then AC_MSG_RESULT(not found) else AC_MSG_RESULT($PERL5LIB) fi AC_MSG_CHECKING(for Perl5 ccflags) PERL5CCFLAGS=`($PERL -e 'use Config; print $Config{ccflags}, "\n"' | sed "s/-Wdeclaration-after-statement//" | sed "s/-I/$ISYSTEM/") 2>/dev/null` if test -z "$PERL5CCFLAGS" ; then AC_MSG_RESULT(not found) else AC_MSG_RESULT($PERL5CCFLAGS) fi AC_MSG_CHECKING(for Perl5 ccdlflags) PERL5CCDLFLAGS=`($PERL -e 'use Config; print $Config{ccdlflags}, "\n"') 2>/dev/null` if test -z "$PERL5CCDLFLAGS" ; then AC_MSG_RESULT(not found) else AC_MSG_RESULT($PERL5CCDLFLAGS) fi AC_MSG_CHECKING(for Perl5 cccdlflags) PERL5CCCDLFLAGS=`($PERL -e 'use Config; print $Config{cccdlflags}, "\n"') 2>/dev/null` if test -z "$PERL5CCCDLFLAGS" ; then AC_MSG_RESULT(not found) else AC_MSG_RESULT($PERL5CCCDLFLAGS) fi AC_MSG_CHECKING(for Perl5 ldflags) PERL5LDFLAGS=`($PERL -e 'use Config; print $Config{ldflags}, "\n"') 2>/dev/null` if test -z "$PERL5LDFLAGS" ; then AC_MSG_RESULT(not found) else AC_MSG_RESULT($PERL5LDFLAGS) fi AC_MSG_CHECKING(for Perl5 Test::More module) # For test-suite PERL5TESTMORE=`($PERL -e 'use Test::More; print "good";') 2>/dev/null` if test -z "$PERL5TESTMORE" ; then AC_MSG_RESULT(not found) else AC_MSG_RESULT(found) fi else AC_MSG_RESULT(unable to determine perl5 configuration) PERL5EXT=$PERL5DIR fi else AC_MSG_RESULT(could not figure out how to run perl5) fi # Cygwin (Windows) needs the library for dynamic linking case $host in *-*-cygwin* | *-*-mingw*) PERL5DYNAMICLINKING="-L$PERL5EXT -l$PERL5LIB";; *)PERL5DYNAMICLINKING="";; esac fi AC_SUBST(PERL) AC_SUBST(PERL5EXT) AC_SUBST(PERL5DYNAMICLINKING) AC_SUBST(PERL5LIB) AC_SUBST(PERL5CCFLAGS) AC_SUBST(PERL5CCDLFLAGS) AC_SUBST(PERL5CCCDLFLAGS) AC_SUBST(PERL5LDFLAGS) #---------------------------------------------------------------- # Look for Octave #---------------------------------------------------------------- OCTAVEBIN= OCTAVE_SO=.oct AC_ARG_WITH(octave, AS_HELP_STRING([--without-octave], [Disable Octave]) AS_HELP_STRING([--with-octave=path], [Set location of Octave executable]),[OCTAVEBIN="$withval"], [OCTAVEBIN="$alllang_default"]) # Check for "--without-octave" or "--with-octave=no". if test x"${OCTAVEBIN}" = xno; then AC_MSG_NOTICE([Disabling Octave]) OCTAVE= # Check for Octave; prefer command-line program "octave-cli" to (in newer versions) GUI program "octave" elif test "x$OCTAVEBIN" = xyes; then AC_PATH_PROG(OCTAVE, [octave-cli octave]) else OCTAVE="$OCTAVEBIN" fi # Check if Octave works if test -n "$OCTAVE"; then AC_MSG_CHECKING([if ${OCTAVE} works]) AS_IF([test "x`${OCTAVE} --version 2>/dev/null | sed -n -e '1p' | sed -n -e '/Octave, version/p'`" != x],[ AC_MSG_RESULT([yes]) ],[ AC_MSG_NOTICE([no]) OCTAVE= ]) fi # Check for required Octave helper program "mkoctfile" if test -n "$OCTAVE"; then AC_MSG_CHECKING([for mkoctfile]) version_suffix=["`echo $OCTAVE | sed -e 's|.*\(-[0-9][0-9.]*\)$|\1|'`"] case $version_suffix in -*) ;; *) version_suffix="" ;; esac octave_directory=`dirname $OCTAVE` if test "$octave_directory" = "." ; then mkoctfile="mkoctfile${version_suffix}" else mkoctfile="${octave_directory}/mkoctfile${version_suffix}" fi AC_MSG_RESULT([${mkoctfile}]) AC_MSG_CHECKING([if ${mkoctfile} works]) AS_IF([test "x`${mkoctfile} --version 2>/dev/null | sed -n -e '1p' | sed -n -e '/mkoctfile, version/p'`" != x],[ AC_MSG_RESULT([yes]) ],[ AC_MSG_RESULT([no]) OCTAVE= ]) fi # Check for Octave preprocessor/compiler/linker flags if test -n "$OCTAVE"; then AC_MSG_CHECKING([for Octave preprocessor flags]) OCTAVE_CPPFLAGS= for var in CPPFLAGS INCFLAGS ALL_CXXFLAGS; do for flag in `env - ${mkoctfile} -p ${var}`; do case ${flag} in -D*|-I*) OCTAVE_CPPFLAGS="${OCTAVE_CPPFLAGS} ${flag}";; *) ;; esac done done AC_MSG_RESULT([$OCTAVE_CPPFLAGS]) AC_MSG_CHECKING([for Octave compiler flags]) OCTAVE_CXXFLAGS= for var in CXX ALL_CXXFLAGS; do for flag in `env - ${mkoctfile} -p ${var}`; do case ${flag} in -std=*|-g*|-W*) OCTAVE_CXXFLAGS="${OCTAVE_CXXFLAGS} ${flag}";; *) ;; esac done done save_CXXFLAGS="${CXXFLAGS}" CXXFLAGS="-Werror -O0" AC_COMPILE_IFELSE([ AC_LANG_PROGRAM([],[]) ],[ OCTAVE_CXXFLAGS="${OCTAVE_CXXFLAGS} -O0" ]) CXXFLAGS="${save_CXXFLAGS}" AC_MSG_RESULT([$OCTAVE_CXXFLAGS]) AC_MSG_CHECKING([for Octave linker flags]) OCTAVE_LDFLAGS= for var in OCTLIBDIR; do OCTAVE_LDFLAGS="${OCTAVE_LDFLAGS} "-L`env - ${mkoctfile} -p ${var}` done for var in RDYNAMIC_FLAG RLD_FLAG OCTAVE_LIBS LIBS; do OCTAVE_LDFLAGS="${OCTAVE_LDFLAGS} "`env - ${mkoctfile} -p ${var}` done AC_MSG_RESULT([$OCTAVE_LDFLAGS]) fi # Check for Octave options if test -n "$OCTAVE"; then for octave_opt in --no-window-system --silent --norc --no-history; do AC_MSG_CHECKING([if Octave option '${octave_opt}' is supported]) octave_out=`${OCTAVE} ${octave_opt} /dev/null 2>&1 | sed -n '1p' | sed -n '/unrecognized/p'` AS_IF([test "x${octave_out}" = x],[ AC_MSG_RESULT([yes]) OCTAVE="${OCTAVE} ${octave_opt}" ],[ AC_MSG_RESULT([no]) ]) done fi AC_SUBST(OCTAVE) AC_SUBST(OCTAVE_SO) AC_SUBST(OCTAVE_CPPFLAGS) AC_SUBST(OCTAVE_CXXFLAGS) AC_SUBST(OCTAVE_LDFLAGS) #---------------------------------------------------------------- # Look for Scilab #---------------------------------------------------------------- AC_ARG_WITH(scilab, AS_HELP_STRING([--without-scilab], [Disable Scilab]) AS_HELP_STRING([--with-scilab=path], [Set location of Scilab executable]),[SCILABBIN="$withval"], [SCILABBIN="$alllang_default"]) AC_ARG_WITH(scilab-inc, [ --with-scilab-inc=path Set location of Scilab include directory], [SCILABINCDIR="$withval"], [SCILABINCDIR=""]) # First, check for "--without-scilab" or "--with-scilab=no". if test x"${SCILABBIN}" = xno; then AC_MSG_NOTICE([Disabling Scilab]) SCILAB= else # Check for Scilab executable if test "x$SCILABBIN" = xyes; then AC_CHECK_PROGS(SCILAB, scilab) else AC_MSG_CHECKING(for scilab) if test -f "$SCILABBIN"; then AC_MSG_RESULT($SCILABBIN) SCILAB="$SCILABBIN" else AC_MSG_RESULT(not found) fi fi if test -n "$SCILAB"; then # Check for Scilab version (needs api_scilab so needs version 5.3.3 or higher) SCILAB_FULL_VERSION=`$SCILAB -version | head -1 | sed -e 's|Scilab version \"\(.*\)\"|\1|g'` AC_MSG_CHECKING(Scilab version is 5.3.3 or higher) SCILAB_MAJOR_VERSION=`echo $SCILAB_FULL_VERSION | cut -d. -f1` SCILAB_MINOR_VERSION=`echo $SCILAB_FULL_VERSION | cut -d. -f2` SCILAB_MAINTENANCE_VERSION=`echo $SCILAB_FULL_VERSION | cut -d. -f3` SCILAB_VERSION="$SCILAB_MAJOR_VERSION$SCILAB_MINOR_VERSION$SCILAB_MAINTENANCE_VERSION" if test $SCILAB_VERSION -ge 533; then AC_MSG_RESULT(yes) else AC_MSG_RESULT(no) SCILAB= fi if test -n "$SCILAB"; then # Set Scilab startup options depending on version AC_MSG_CHECKING(for Scilab startup options) SCILABOPT="-nwni -nb" if test $SCILAB_VERSION -ge 540; then SCILABOPT+=" -noatomsautoload" fi AC_MSG_RESULT($SCILABOPT) # Check for Scilab header files AC_MSG_CHECKING(for Scilab header files) if test "$SCILABINCDIR" != ""; then dirs="$SCILABINCDIR" elif test -n "$PKGCONFIG"; then dirs=`$PKGCONFIG scilab --cflags-only-I | sed -e 's/-I//g'` else dirs="" fi for i in $dirs; do if test -r $i/api_scilab.h; then AC_MSG_RESULT($i) SCILABINCLUDE="-I$i" break fi if test -r $i/scilab/api_scilab.h; then AC_MSG_RESULT($i/scilab) SCILABINCLUDE="-I$i/scilab" break fi done if test "$SCILABINCLUDE" = "" ; then AC_MSG_RESULT(not found) SCILAB= fi fi fi fi AC_SUBST(SCILAB) AC_SUBST(SCILABINCLUDE) AC_SUBST(SCILABOPT) #---------------------------------------------------------------- # Look for java #---------------------------------------------------------------- AC_ARG_WITH(java, AS_HELP_STRING([--without-java], [Disable Java]) AS_HELP_STRING([--with-java=path], [Set location of java executable]),[JAVABIN="$withval"], [JAVABIN="$alllang_default"]) AC_ARG_WITH(javac, [ --with-javac=path Set location of javac executable],[JAVACBIN="$withval"], [JAVACBIN=]) # First, check for "--without-java" or "--with-java=no". if test x"${JAVABIN}" = xno; then AC_MSG_NOTICE([Disabling Java]) JAVA= else dnl Detect everything we need for Java: java for running Java tests, javac for dnl compiling them and C headers for compiling C code. dnl dnl If JAVA_HOME is defined and contains everything needed, as it's supposed to, dnl just use it. Otherwise try to locate the necessary files in the path. case $host in *-*-cygwin*) dnl Ensure that JAVA_HOME is in the form we can use, it's typically set to Windows path by the installer. if test -n "$JAVA_HOME"; then JAVA_HOME=`cygpath --mixed "$JAVA_HOME"` fi dnl Java uses semicolons and not colons as separators in its classes search path under Windows. JAVA_CLASSPATH_SEP=";" ;; *-*-mingw*) if test -n "$JAVA_HOME"; then JAVA_HOME=`${srcdir}/Tools/convertpath -u "$JAVA_HOME"` fi JAVA_CLASSPATH_SEP=";" ;; *-*-darwin*) dnl Under OS X JAVA_HOME is not set by default, try to use the system default JRE. if test -z "$JAVA_HOME" -a -x /usr/libexec/java_home; then JAVA_HOME=`/usr/libexec/java_home` fi dnl The JAVA_HOME doesn't contain the JDK headers though, but they seem to dnl always be in the same location, according to Apple JNI documentation. JAVA_OSX_STD_INCDIR="/System/Library/Frameworks/JavaVM.framework/Headers" if test -r "$JAVA_OSX_STD_INCDIR/jni.h"; then JAVA_HOME_INCDIR=$JAVA_OSX_STD_INCDIR fi JAVA_CLASSPATH_SEP=":" ;; *) dnl Assume generic Unix. JAVA_CLASSPATH_SEP=":" ;; esac AC_MSG_CHECKING(for java JDK) if test -n "$JAVA_HOME"; then dnl Don't complain about missing executables/headers if they had been dnl explicitly overridden from the command line, but otherwise verify that we dnl have everything we need. java_home_ok=1 if test -z "$JAVABIN" -a ! -x "$JAVA_HOME/bin/java"; then AC_MSG_WARN([No java executable under JAVA_HOME.]) java_home_ok=0 fi if test -z "$JAVACBIN" -a ! -x "$JAVA_HOME/bin/javac"; then AC_MSG_WARN([No javac executable under JAVA_HOME.]) java_home_ok=0 fi dnl By default the headers are under JAVA_HOME/include, but OS X is special dnl and defines JAVA_HOME_INCDIR differently above. if test -z "$JAVA_HOME_INCDIR"; then JAVA_HOME_INCDIR="$JAVA_HOME/include" fi if test -z "$JAVAINCDIR" -a ! -r "$JAVA_HOME_INCDIR/jni.h"; then AC_MSG_WARN([No java headers under JAVA_HOME (does it point to a JDK and not just JRE?).]) java_home_ok=0 fi if test "$java_home_ok" = 1; then AC_MSG_RESULT([found (in $JAVA_HOME)]) else AC_MSG_RESULT(no) AC_MSG_WARN([JAVA_HOME ($JAVA_HOME) is defined but does not point to a complete JDK installation, ignoring it.]) JAVA_HOME= fi else AC_MSG_RESULT([no (JAVA_HOME is not defined)]) fi if test "x$JAVABIN" = xyes; then if test -n "$JAVA_HOME"; then JAVA="$JAVA_HOME/bin/java" else AC_CHECK_PROGS(JAVA, java kaffe guavac) fi else JAVA="$JAVABIN" fi if test -z "$JAVACBIN"; then if test -n "$JAVA_HOME"; then JAVAC="$JAVA_HOME/bin/javac" else AC_CHECK_PROGS(JAVAC, javac) fi else JAVAC="$JAVACBIN" fi AC_MSG_CHECKING(for java include file jni.h) AC_ARG_WITH(javaincl, [ --with-javaincl=path Set location of Java include directory], [JAVAINCDIR="$withval"], [JAVAINCDIR=]) JAVAINC="" if test -z "$JAVAINCDIR" ; then if test -n "$JAVA_HOME"; then JAVAINCDIR="$JAVA_HOME_INCDIR" JAVAINC=-I\"$JAVAINCDIR\" else JAVAINCDIR="/usr/j2sdk*/include /usr/local/j2sdk*/include /usr/jdk*/include /usr/local/jdk*/include /opt/j2sdk*/include /opt/jdk*/include /usr/java/include /usr/java/j2sdk*/include /usr/java/jdk*/include /usr/local/java/include /opt/java/include /usr/include/java /usr/local/include/java /usr/lib/java/include /usr/lib/jvm/java*/include /usr/lib64/jvm/java*/include /usr/include/kaffe /usr/local/include/kaffe /usr/include" # Add in default installation directory on Windows for Cygwin case $host in *-*-cygwin* | *-*-mingw*) JAVAINCDIR="c:/Program*Files*/Java/jdk*/include d:/Program*Files*/Java/jdk*/include c:/j2sdk*/include d:/j2sdk*/include c:/jdk*/include d:/jdk*/include $JAVAINCDIR";; *-*-darwin*) JAVAINCDIR="$JAVA_OSX_STD_INCDIR $JAVAINCDIR";; *);; esac for d in $JAVAINCDIR ; do if test -r "$d/jni.h" ; then JAVAINCDIR=$d JAVAINC=-I\"$d\" JAVA_HOME_MAYBE="`dirname $d`" break fi done fi else if test -r "$JAVAINCDIR/jni.h" ; then JAVAINC=-I\"$JAVAINCDIR\" fi fi if test "$JAVAINC" = "" ; then AC_MSG_RESULT(not found) else AC_MSG_RESULT($JAVAINC) # now look for /jni_md.h AC_MSG_CHECKING(for java include file jni_md.h) JAVAMDDIR=`find "$JAVAINCDIR" -follow -name jni_md.h -print` if test "$JAVAMDDIR" = "" ; then AC_MSG_RESULT(not found) else JAVAMDDIR=-I\"`dirname "$JAVAMDDIR" | tail -1`\" AC_MSG_RESULT($JAVAMDDIR) JAVAINC="${JAVAINC} ${JAVAMDDIR}" fi fi # Auto-detecting JAVA_HOME is not so easy, below will only work up to and including jdk8 if test -z "$JAVA_HOME" && test -n "$JAVA_HOME_MAYBE" ; then AC_MSG_CHECKING(for java jdk from jni include paths) if test -r "$JAVA_HOME_MAYBE/lib/tools.jar" ; then JAVA_HOME=$JAVA_HOME_MAYBE AC_MSG_RESULT([$JAVA_HOME]) else AC_MSG_RESULT(not found) fi fi # Javadoc support required for the Java test-suite is available by default in jdk9+ and in tools.jar in earlier jdk versions AC_MSG_CHECKING(for java tools.jar) if test -n "$JAVA_HOME" && test -r "$JAVA_HOME/lib/tools.jar" ; then JAVA_TOOLS_JAR="$JAVA_HOME/lib/tools.jar" AC_MSG_RESULT([$JAVA_TOOLS_JAR]) else AC_MSG_RESULT(not found) fi case $host in *-*-cygwin*) # TODO: Only use this flag if the compiler supports it, later versions of gcc no longer have it GCC_MNO_CYGWIN=" -mno-cygwin" ;; *) GCC_MNO_CYGWIN="" ;; esac # java.exe on Cygwin requires the Windows standard (Pascal) calling convention as it is a normal Windows executable and not a Cygwin built executable case $host in *-*-cygwin* | *-*-mingw*) if test "$GCC" = yes; then JAVADYNAMICLINKING="$GCC_MNO_CYGWIN -mthreads -Wl,--add-stdcall-alias" JAVACFLAGS="$GCC_MNO_CYGWIN -mthreads" else JAVADYNAMICLINKING="" JAVACFLAGS="" fi ;; *-*-darwin*) JAVADYNAMICLINKING="-dynamiclib -framework JavaVM" JAVACFLAGS="" ;; *) JAVADYNAMICLINKING="" JAVACFLAGS="" ;; esac # Java on Windows platforms including Cygwin doesn't use libname.dll, rather name.dll when loading dlls case $host in *-*-cygwin* | *-*-mingw*) JAVALIBRARYPREFIX="";; *)JAVALIBRARYPREFIX="lib";; esac # Java on Mac OS X tweaks case $host in *-*-darwin*) JAVASO=".jnilib" JAVALDSHARED='$(CC)' JAVACXXSHARED='$(CXX)' ;; *) JAVASO=$SO JAVALDSHARED='$(LDSHARED)' JAVACXXSHARED='$(CXXSHARED)' ;; esac fi # Quote for spaces in path to executables if test -n "$JAVA"; then JAVA=\"$JAVA\" fi if test -n "$JAVAC"; then JAVAC=\"$JAVAC\" fi # Turned off due to spurious warnings in later versions of openjdk-1.8 # JAVAFLAGS=-Xcheck:jni AC_SUBST(JAVA) AC_SUBST(JAVAC) AC_SUBST(JAVAINC) AC_SUBST(JAVA_CLASSPATH_SEP) AC_SUBST(JAVA_TOOLS_JAR) AC_SUBST(JAVADYNAMICLINKING) AC_SUBST(JAVALIBRARYPREFIX) AC_SUBST(JAVASO) AC_SUBST(JAVALDSHARED) AC_SUBST(JAVACXXSHARED) AC_SUBST(JAVAFLAGS) AC_SUBST(JAVACFLAGS) #---------------------------------------------------------------- # Look for Javascript #---------------------------------------------------------------- AC_ARG_WITH(javascript, AS_HELP_STRING([--without-javascript], [Disable Javascript]), [with_javascript="$withval"], [with_javascript="$alllang_default"]) # First, check for "--without-javascript" or "--with-javascript=no". if test x"${with_javascript}" = xno; then AC_MSG_NOTICE([Disabling Javascript]) JAVASCRIPT= else JAVASCRIPT=1 #---------------------------------------------------------------- # General Javascript settings shared by JSC and V8 #---------------------------------------------------------------- case $host in *-*-darwin*) JSSO=".dylib" # HACK: didn't manage to get dynamic module loading working with a g++ compiled interpreter JSINTERPRETERCXX='c++' JSINTERPRETERLINKFLAGS='-g -Wl,-search_paths_first -Wl,-headerpad_max_install_names' ;; *) JSSO=$SO JSINTERPRETERCXX='$(CXX)' JSINTERPRETERLINKFLAGS='-ldl' ;; esac #---------------------------------------------------------------- # Look for Node.js which is the default Javascript engine #---------------------------------------------------------------- AC_CHECK_PROGS(NODEJS, [nodejs node]) if test -n "$NODEJS"; then # node-gyp is needed to run the test-suite/examples AC_CHECK_PROGS(NODEGYP, node-gyp) if test -z "$NODEGYP"; then NODEJS= fi fi #---------------------------------------------------------------- # Look for JavascriptCore (Webkit) settings (JSCOREINCDIR, JSCOREDYNAMICLINKING) #---------------------------------------------------------------- # check for include files AC_MSG_CHECKING(for JavaScriptCore/JavaScript.h) AC_ARG_WITH(jscoreinc, [ --with-jscoreinc=path Set location of Javascript include directory], [JSCOREINCDIR="$withval"], [JSCOREINCDIR=]) JSCOREVERSION= if test -z "$JSCOREINCDIR"; then JSCOREINCDIR="/usr/include/ /usr/local/include/" # Add in default directory for JavaScriptCore headers for Linux and Mac OS X case $host in *-*-linux*) JSCOREINCDIR="/usr/include/webkit-1.0/ /usr/include/webkitgtk-1.0/ /usr/local/include/webkit-1.0/JavaScriptCore/ $JSCOREINCDIR" ;; *-*-darwin*) JSCOREINCDIR="/System/Library/Frameworks/JavaScriptCore.framework/Headers/ $JSCOREINCDIR" ;; *) ;; esac fi for d in $JSCOREINCDIR ; do if test -r "$d/JavaScriptCore/JavaScript.h" || test -r "$d/JavaScript.h" ; then AC_MSG_RESULT($d) JSCOREINCDIR=$d JSCOREINC=-I\"$d\" break fi done if test "$JSCOREINC" = "" ; then AC_MSG_RESULT(not found) fi # check for JavaScriptCore/Webkit libraries AC_ARG_WITH(jscorelib,[ --with-jscorelib=path Set location of the JavaScriptCore/Webkit library directory],[JSCORELIB="-L$withval"], [JSCORELIB=]) if test -z "$JSCORELIB" -a -n "$PKGCONFIG"; then AC_MSG_CHECKING(for JavaScriptCore/Webkit library) if pkg-config javascriptcoregtk-1.0; then JSCORELIB=`$PKGCONFIG --libs javascriptcoregtk-1.0` JSCOREVERSION=`$PKGCONFIG --modversion javascriptcoregtk-1.0` fi if test -z "$JSCORELIB"; then AC_MSG_RESULT(not found) JSCENABLED= else AC_MSG_RESULT([$JSCORELIB]) JSCOREDYNAMICLINKING="$JSCORELIB" JSCENABLED=1 fi fi #---------------------------------------------------------------- # Look for V8 settings (JSV8INCDIR, JSV8DYNAMICLINKING) #---------------------------------------------------------------- # check for include files AC_MSG_CHECKING(for V8 Javascript v8.h) AC_ARG_WITH(jsv8inc, [ --with-jsv8inc=path Set location of Javascript v8 include directory], [JSV8INCDIR="$withval"], [JSV8INCDIR=]) # if not include dir is specified we try to find if test -z "$JSV8INCDIR"; then # Add in default directory for JavaScriptCore headers for Linux and Mac OS X case $host in *-*-linux*) JSV8INCDIR="/usr/include /usr/local/include/ $JSV8INCDIR" ;; *-*-darwin*) JSV8INCDIR="$JSV8INCDIR" ;; *) ;; esac fi for d in $JSV8INCDIR ; do if test -r "$d/v8.h" ; then JSV8INCDIR=$d JSV8INC=-I\"$d\" break fi done if test "$JSV8INC" = "" ; then AC_MSG_RESULT(not found) else AC_MSG_RESULT($JSV8INCDIR) fi # check for V8 library AC_MSG_CHECKING(for V8 Javascript library) AC_ARG_WITH(jsv8lib,[ --with-jsv8lib=path Set location of V8 Javascript library directory],[JSV8LIBDIR="$withval"], [JSV8LIB=]) v8libdirs="$JSV8LIBDIR /usr/lib64/ /usr/local/lib64/ /usr/lib/ /usr/local/lib/" for d in $v8libdirs ; do if test -r $d/libv8$JSSO; then JSV8LIBDIR=$d JSV8LIB="-L$d -lv8" break fi done if test "$JSV8LIB" = "" ; then AC_MSG_RESULT(not found) JSV8ENABLED= else AC_MSG_RESULT($JSV8LIBDIR) JSV8ENABLED=1 fi # linking options case $host in *-*-darwin*) JSV8DYNAMICLINKING="$JSV8LIB" ;; *-*-linux*) JSV8DYNAMICLINKING="$JSV8LIB" ;; *) JSV8DYNAMICLINKING="" ;; esac fi AC_SUBST(JSINTERPRETERCXX) AC_SUBST(JSINTERPRETERLINKFLAGS) AC_SUBST(JSCOREINC) AC_SUBST(JSCOREDYNAMICLINKING) AC_SUBST(JSCOREVERSION) AC_SUBST(JSV8INC) AC_SUBST(JSV8DYNAMICLINKING) AC_SUBST(JSCENABLED) AC_SUBST(JSV8ENABLED) AC_SUBST(NODEJS) AC_SUBST(NODEGYP) #---------------------------------------------------------------- # Look for Android #---------------------------------------------------------------- AC_ARG_WITH(android, AS_HELP_STRING([--without-android], [Disable Android]) AS_HELP_STRING([--with-android=path], [Set location of android executable]),[ANDROIDBIN="$withval"], [ANDROIDBIN="$alllang_default"]) AC_ARG_WITH(adb, [ --with-adb=path Set location of adb executable - Android Debug Bridge],[ADBBIN="$withval"], [ADBBIN=]) AC_ARG_WITH(ant, [ --with-ant=path Set location of ant executable for Android],[ANTBIN="$withval"], [ANTBIN=]) AC_ARG_WITH(ndk-build, [ --with-ndk-build=path Set location of Android ndk-build executable],[NDKBUILDBIN="$withval"], [NDKBUILDBIN=]) # First, check for "--without-android" or "--with-android=no". if test x"${ANDROIDBIN}" = xno; then AC_MSG_NOTICE([Disabling Android]) ANDROID= else if test "x$ANDROIDBIN" = xyes; then AC_CHECK_PROGS(ANDROID, android) else ANDROID="$ANDROIDBIN" fi if test -z "$ADBBIN"; then AC_CHECK_PROGS(ADB, adb) else ADB="$ADBBIN" fi if test -z "$ANTBIN"; then AC_CHECK_PROGS(ANT, ant) else ANT="$ANTBIN" fi if test -z "$NDKBUILDBIN"; then AC_CHECK_PROGS(NDKBUILD, ndk-build) else NDKBUILD="$NDKBUILDBIN" fi fi AC_SUBST(ANDROID) AC_SUBST(ADB) AC_SUBST(ANT) AC_SUBST(NDKBUILD) #---------------------------------------------------------------- # Look for Guile #---------------------------------------------------------------- GUILE= GUILE_CFLAGS= GUILE_LIBS= AC_ARG_WITH(guile-config, AS_HELP_STRING([--without-guile], [Disable Guile]) AS_HELP_STRING([--with-guile-config=path], [Set location of guile-config]),[ GUILE_CONFIG="$withval"], [GUILE_CONFIG=]) AC_ARG_WITH(guile,[ --with-guile=path Set location of Guile executable],[ GUILE="$withval"], [GUILE="$alllang_default"]) AC_ARG_WITH(guile-cflags,[ --with-guile-cflags=cflags Set cflags required to compile against Guile],[ GUILE_CFLAGS="$withval"]) AC_ARG_WITH(guile-libs,[ --with-guile-libs=ldflags Set ldflags needed to link with Guile],[ GUILE_LIBS="$withval"]) # First, check for "--without-guile" or "--with-guile=no". if test x"${GUILE}" = xno; then AC_MSG_NOTICE([Disabling Guile]) else if test -z "$GUILE_CONFIG" ; then AC_PATH_PROG(GUILE_CONFIG, guile-config) fi if test -n "$GUILE_CONFIG" ; then if test x"$GUILE" = xyes; then AC_MSG_CHECKING([for guile executable]) # Try extracting it via guile-config first. If it's defined there it's the most reliable result GUILE="`$GUILE_CONFIG info guile 2>/dev/null`" if test -n "$GUILE"; then AC_MSG_RESULT([$GUILE]) else AC_MSG_RESULT([not found via guile-config - constructing path]) AC_MSG_CHECKING([for guile bindir]) guile_bindir="`$GUILE_CONFIG info bindir`" AC_MSG_RESULT([$guile_bindir]) GUILE="$guile_bindir/guile" fi if ! test -f "$GUILE" ; then GUILE= AC_PATH_PROG(GUILE, guile) fi if test -z "$GUILE" ; then AC_MSG_WARN([no suitable guile executable found. Disabling Guile]) fi fi if test -n "$GUILE" ; then AC_MSG_CHECKING([for guile version]) guile_version=`$GUILE -c '(display (effective-version))'` AC_MSG_RESULT([$guile_version]) AC_MSG_CHECKING([for guile version >= 1.8]) guile_good_version=`$GUILE -c '(if (>= (string->number (effective-version)) 1.8) (display "yes") (display "no"))'` AC_MSG_RESULT([$guile_good_version]) if test x"$guile_good_version" != xyes ; then AC_MSG_WARN([at least guile version 1.8 is required. Disabling Guile]) GUILE= fi fi if test -n "$GUILE" ; then # Test if guile-config and guile versions match. They should. gc_version="`$GUILE_CONFIG --version 2>&1 | sed '1 s/.* //;q'`" g_version="`$GUILE --version | sed '1 s/.* //;q'`" if test "$gc_version" != "$g_version"; then AC_MSG_WARN([different versions reported by $GUILE_CONFIG ($gc_version) and $GUILE ($g_version). Disabling Guile]) GUILE= fi fi if test -n "$GUILE" ; then if test -z "$GUILE_CFLAGS" ; then AC_MSG_CHECKING([for guile compile flags]) GUILE_CFLAGS="`$GUILE_CONFIG compile`" # Note that this can sometimes be empty AC_MSG_RESULT([$GUILE_CFLAGS]) fi if test -z "$GUILE_LIBS" ; then AC_MSG_CHECKING([for guile link flags]) GUILE_LIBS="`$GUILE_CONFIG link`" AC_MSG_RESULT([$GUILE_LIBS]) fi fi fi fi AC_SUBST(GUILE) AC_SUBST(GUILE_CFLAGS) AC_SUBST(GUILE_LIBS) #---------------------------------------------------------------- # Look for MzScheme #---------------------------------------------------------------- AC_ARG_WITH(mzscheme, AS_HELP_STRING([--without-mzscheme], [Disable MzScheme]) AS_HELP_STRING([--with-mzscheme=path], [Set location of MzScheme executable]),[ MZSCHEMEBIN="$withval"], [MZSCHEMEBIN="$alllang_default"]) AC_ARG_WITH(mzc, AS_HELP_STRING([--with-mzc=path], [Set location of MzScheme's mzc]), [ MZCBIN="$withval"], [MZCBIN=]) # First, check for "--without-mzscheme" or "--with-mzscheme=no". if test x"${MZSCHEMEBIN}" = xno; then AC_MSG_NOTICE([Disabling MzScheme]) MZC= else if test "x$MZSCHEMEBIN" = xyes; then AC_PATH_PROG(MZSCHEME, mzscheme) else MZSCHEME="$MZSCHEMEBIN" fi if test -z "$MZCBIN"; then AC_PATH_PROG(MZC, mzc) fi if test -n "$MZSCHEME"; then AC_MSG_CHECKING(for MzScheme dynext object) MZDYNOBJ=`$MZSCHEME --eval '(begin (require dynext/link) (with-handlers (((lambda args #t) (lambda args #f))) (for-each (lambda (x) (printf "~a" x)) (expand-for-link-variant (current-standard-link-libraries)))))' 2>/dev/null` if test -f "$MZDYNOBJ"; then : else # older versions (3.72 approx and earlier) MZDYNOBJ=`$MZSCHEME --mute-banner --version --eval '(begin (require (lib "link.ss" "dynext")) (with-handlers (((lambda args #t) (lambda args #f))) (for-each (lambda (x) (display x) (display " ")) ((current-make-standard-link-libraries)))) (with-handlers (((lambda args #t) (lambda args #f))) (for-each (lambda (x) (display x)) (expand-for-link-variant (current-standard-link-libraries)))))' 2>/dev/null` fi if test -f "$MZDYNOBJ"; then AC_MSG_RESULT($MZDYNOBJ) else AC_MSG_RESULT(not found) MZDYNOBJ="" fi fi fi AC_SUBST(MZDYNOBJ) #---------------------------------------------------------------- # Look for Ruby #---------------------------------------------------------------- RUBYBIN= AC_ARG_WITH(ruby, AS_HELP_STRING([--without-ruby], [Disable Ruby]) AS_HELP_STRING([--with-ruby=path], [Set location of Ruby executable]),[ RUBYBIN="$withval"], [RUBYBIN="$alllang_default"]) # First, check for "--without-ruby" or "--with-ruby=no". RUBYSO=$SO if test x"${RUBYBIN}" = xno; then AC_MSG_NOTICE([Disabling Ruby]) RUBY= else # First figure out what the name of Ruby is if test "x$RUBYBIN" = xyes; then AC_CHECK_PROGS(RUBY, ruby) else RUBY="$RUBYBIN" fi AC_MSG_CHECKING(for Ruby header files) if test -n "$RUBY"; then # Try Ruby1.9+ first RUBYDIR=`($RUBY -rrbconfig -e 'print RbConfig::CONFIG[["rubyhdrdir"]] || $rubyhdrdir') 2>/dev/null` RUBYARCHHDRDIR=`($RUBY -rrbconfig -e 'print RbConfig::CONFIG[["rubyarchhdrdir"]] || $rubyarchhdrdir') 2>/dev/null` if test x"$RUBYDIR" = x"" || test x"$RUBYDIR" = x"nil"; then RUBYDIR=`($RUBY -rrbconfig -e 'print RbConfig::CONFIG[["archdir"]] || $archdir') 2>/dev/null` else RUBYARCH=`($RUBY -rrbconfig -e 'print RbConfig::CONFIG[["arch"]] || $arch') 2>/dev/null` fi if test x"$RUBYDIR" != x""; then dirs="$RUBYDIR" RUBYINCLUDE= for i in $dirs; do if test -r $i/ruby.h; then if test x"$RUBYARCH" = x""; then RUBYINCLUDE="-I$i" elif test -n "$RUBYARCHHDRDIR"; then RUBYINCLUDE="-I$i -I$RUBYARCHHDRDIR" else RUBYINCLUDE="-I$i -I$i/$RUBYARCH" fi AC_MSG_RESULT($RUBYINCLUDE) break fi done if test x"$RUBYINCLUDE" = x""; then AC_MSG_RESULT(could not locate ruby.h) fi # Find library and path for linking. AC_MSG_CHECKING(for Ruby library) RUBYLIB="" rb_archlibdir=`($RUBY -rrbconfig -e 'print RbConfig::CONFIG[["archlibdir"]]') 2>/dev/null` rb_libdir=`($RUBY -rrbconfig -e 'print RbConfig::CONFIG[["libdir"]]') 2>/dev/null` rb_bindir=`($RUBY -rrbconfig -e 'print RbConfig::CONFIG[["bindir"]]') 2>/dev/null` dirs="$dirs $rb_archlibdir $rb_libdir $rb_bindir" rb_libruby=`($RUBY -rrbconfig -e 'print RbConfig::CONFIG[["LIBRUBY_A"]]') 2>/dev/null` RUBYLINK=`($RUBY -rrbconfig -e ' c = RbConfig::CONFIG if c.has_key? "LIBRUBYARG_STATIC" # 1.8.x if c[["LIBRUBY"]] == c[["LIBRUBY_A"]] link = c[["LIBRUBYARG_STATIC"]] else link = c[["LIBRUBYARG_SHARED"]] end else # 1.6.x link = "-l" + c[["RUBY_INSTALL_NAME"]] end # Get the target Ruby was built for target = c[["target"]] if target == "i386-pc-mswin32" # Need to change msvcrt-ruby*.lib to -lmsvcrt-ruby* ext = File.extname(link) # Get index that counts backwards from end of string index = -1 - ext.size # Strip off the extension link = link.slice(0..index) puts "-l#{link}" else puts link end') 2>/dev/null` if test "$rb_libruby" != ""; then for i in $dirs; do if (test -r $i/$rb_libruby;) then RUBYLIB="$i" break fi done fi if test "$RUBYLIB" = ""; then RUBYLIB="$RUBYDIR" AC_MSG_RESULT(not found... using $RUBYDIR) else AC_MSG_RESULT($RUBYLINK in $RUBYLIB) fi else AC_MSG_RESULT(unable to determine ruby configuration) fi case $host in *-*-mingw*) ;; # do nothing, the default windows libraries are already included *) RUBYLINK="$RUBYLINK `($RUBY -rrbconfig -e 'print RbConfig::CONFIG[["LIBS"]]') 2>/dev/null`";; esac RUBYCCDLFLAGS=`($RUBY -rrbconfig -e 'print RbConfig::CONFIG[["CCDLFLAGS"]]') 2>/dev/null` RUBYSO=.`($RUBY -rrbconfig -e 'print RbConfig::CONFIG[["DLEXT"]]') 2>/dev/null` else AC_MSG_RESULT(could not figure out how to run ruby) fi case $host in *-*-cygwin* | *-*-mingw*) RUBYDYNAMICLINKING="-L$RUBYLIB $RUBYLINK";; *) RUBYDYNAMICLINKING="";; esac fi AC_SUBST(RUBYINCLUDE) AC_SUBST(RUBYLIB) AC_SUBST(RUBYLINK) AC_SUBST(RUBYCCDLFLAGS) AC_SUBST(RUBYSO) AC_SUBST(RUBYDYNAMICLINKING) #------------------------------------------------------------------------- # Look for PHP7 #------------------------------------------------------------------------- PHPBIN= AC_ARG_WITH(php, AS_HELP_STRING([--without-php], [Disable PHP]) AS_HELP_STRING([--with-php=path], [Set location of PHP executable]),[ PHPBIN="$withval"], [PHPBIN="$alllang_default"]) # First, check for "--without-php" or "--with-php=no". if test x"${PHPBIN}" = xno; then AC_MSG_NOTICE([Disabling PHP]) PHP= else if test "x$PHPBIN" = xyes; then AC_CHECK_PROGS(PHP, [php7.3 php7.2 php7.1 php7.0 php]) else PHP=$PHPBIN fi if test -n "$PHP"; then AC_MSG_CHECKING(for PHP header files) dnl /usr/bin/php7.0 -> /usr/bin/php-config7.0 case $PHP in *7.*) PHPCONFIG=`echo "$PHP"|sed 's/7\...*$/-config&/'` ;; *) PHPCONFIG=$PHP-config ;; esac php_version=`$PHPCONFIG --version 2>/dev/null` case $php_version in 7.*) PHPINC=`$PHPCONFIG --includes 2>/dev/null` if test -n "$PHPINC"; then AC_MSG_RESULT($PHPINC) else AC_MSG_RESULT(not found) fi ;; "") AC_MSG_RESULT([could not find $PHPCONFIG or obtain PHP version from it]) ;; *) AC_MSG_RESULT([found PHP $php_version - not PHP 7]) ;; esac fi fi AC_SUBST(PHP) AC_SUBST(PHPINC) #---------------------------------------------------------------- # Look for OCaml #---------------------------------------------------------------- AC_ARG_WITH(ocaml, AS_HELP_STRING([--without-ocaml], [Disable OCaml]), [with_ocaml="$withval"], [with_ocaml="$alllang_default"]) AC_ARG_WITH(ocamlc,[ --with-ocamlc=path Set location of ocamlc executable],[ OCAMLC="$withval"], [OCAMLC=]) AC_ARG_WITH(ocamldlgen,[ --with-ocamldlgen=path Set location of ocamldlgen],[ OCAMLDLGEN="$withval" ], [OCAMLDLGEN=]) AC_ARG_WITH(ocamlfind,[ --with-ocamlfind=path Set location of ocamlfind],[OCAMLFIND="$withval"],[OCAMLFIND=]) AC_ARG_WITH(ocamlmktop,[ --with-ocamlmktop=path Set location of ocamlmktop executable],[ OCAMLMKTOP="$withval"], [OCAMLMKTOP=]) AC_ARG_WITH(camlp4,[ --with-camlp4=path Set location of camlp4 executable],[ CAMLP4="$withval"], [CAMLP4=]) # First, check for "--without-ocaml" or "--with-ocaml=no". if test x"${with_ocaml}" = xno; then AC_MSG_NOTICE([Disabling OCaml]) OCAMLC= else # OCaml compiler if test -z "$OCAMLC"; then AC_CHECK_PROGS(OCAMLC, ocamlc) fi # OCaml Pre-Processor-Pretty-Printer if test -z "$CAMLP4"; then AC_CHECK_PROGS(CAMLP4, camlp4) fi # OCaml DL load generator if test -z "$OCAMLDLGEN"; then AC_CHECK_PROGS(OCAMLDLGEN, ocamldlgen) fi # OCaml package tool if test -z "$OCAMLFIND"; then AC_CHECK_PROGS(OCAMLFIND, ocamlfind) fi # OCaml toplevel creator if test -z "$OCAMLMKTOP"; then AC_CHECK_PROGS(OCAMLMKTOP, ocamlmktop) fi fi AC_SUBST(OCAMLC) AC_SUBST(CAMLP4) AC_SUBST(OCAMLDLGEN) AC_SUBST(OCAMLFIND) AC_SUBST(OCAMLMKTOP) #---------------------------------------------------------------- # Look for C# #---------------------------------------------------------------- AC_ARG_WITH(csharp, AS_HELP_STRING([--without-csharp], [Disable CSharp]), [with_csharp="$withval"], [with_csharp="$alllang_default"]) AC_ARG_WITH(cil-interpreter, [ --with-cil-interpreter=path Set location of CIL interpreter for CSharp],[CSHARPBIN="$withval"], [CSHARPBIN=]) AC_ARG_WITH(csharp-compiler, [ --with-csharp-compiler=path Set location of CSharp compiler],[CSHARPCOMPILERBIN="$withval"], [CSHARPCOMPILERBIN=]) # First, check for "--without-csharp" or "--with-csharp=no". if test x"${with_csharp}" = xno; then AC_MSG_NOTICE([Disabling CSharp]) CSHARPCOMPILER= else if test -z "$CSHARPCOMPILERBIN" ; then case $host in *-*-cygwin* | *-*-mingw*) # prefer unified Mono mcs compiler (not to be confused with the ancient .NET 1 mcs) over older/alternative names. AC_CHECK_PROGS(CSHARPCOMPILER, csc mcs mono-csc gmcs cscc) if test -n "$CSHARPCOMPILER" && test "$CSHARPCOMPILER" = "csc" ; then AC_MSG_CHECKING(whether csc is the Microsoft CSharp compiler) csc 2>/dev/null | grep "C#" > /dev/null || CSHARPCOMPILER="" if test -z "$CSHARPCOMPILER" ; then AC_MSG_RESULT(no) AC_CHECK_PROGS(CSHARPCOMPILER, mcs mono-csc gmcs cscc) else AC_MSG_RESULT(yes) fi fi ;; *)AC_CHECK_PROGS(CSHARPCOMPILER, mono-csc gmcs mcs cscc);; esac else CSHARPCOMPILER="$CSHARPCOMPILERBIN" fi CSHARPCONVERTPATH="Tools/convertpath -u" if test -z "$CSHARPBIN" ; then CSHARPCILINTERPRETER="" CSHARPCILINTERPRETER_FLAGS="" if test "cscc" = "$CSHARPCOMPILER" ; then AC_CHECK_PROGS(CSHARPCILINTERPRETER, ilrun) else if test "mcs" = "$CSHARPCOMPILER"; then # Check that mcs is the C# compiler and not the Unix mcs utility by examining the output of 'mcs --version' # The Mono compiler should emit: Mono C# compiler version a.b.c.d csharp_version_raw=`(mcs --version) 2>/dev/null` csharp_version_searched=`(mcs --version | sed -e "/C#/b" -e "/Mono/b" -e d) 2>/dev/null` # return string if contains 'Mono' or 'C#' CSHARPCOMPILER="" if test -n "$csharp_version_raw" ; then if test "$csharp_version_raw" = "$csharp_version_searched" ; then CSHARPCOMPILER="mcs" fi fi if test "mcs" != "$CSHARPCOMPILER" ; then echo "mcs is not a working Mono C# compiler" fi fi if test "mcs" = "$CSHARPCOMPILER" || test "gmcs" = "$CSHARPCOMPILER" || test "mono-csc" = "$CSHARPCOMPILER"; then AC_CHECK_PROGS(CSHARPCILINTERPRETER, mono) # Mono JIT CSHARPCILINTERPRETER_FLAGS="--debug" else if test "csc" = "$CSHARPCOMPILER"; then CSHARPCONVERTPATH="Tools/convertpath -w" fi fi fi else CSHARPCILINTERPRETER="$CSHARPBIN" fi # Cygwin requires the Windows standard (Pascal) calling convention as it is a Windows executable and not a Cygwin built executable case $host in *-*-cygwin* | *-*-mingw*) if test "$GCC" = yes; then CSHARPDYNAMICLINKING="$GCC_MNO_CYGWIN -mthreads -Wl,--add-stdcall-alias" CSHARPCFLAGS="$GCC_MNO_CYGWIN -mthreads" else CSHARPDYNAMICLINKING="" CSHARPCFLAGS="" fi ;; *) CSHARPDYNAMICLINKING="" CSHARPCFLAGS="" ;; esac # CSharp on Windows platforms including Cygwin doesn't use libname.dll, rather name.dll when loading dlls case $host in *-*-cygwin* | *-*-mingw*) CSHARPLIBRARYPREFIX="";; *)CSHARPLIBRARYPREFIX="lib";; esac # C#/Mono on Mac OS X tweaks case $host in *-*-darwin*) CSHARPSO=".so" ;; *) CSHARPSO=$SO ;; esac fi AC_SUBST(CSHARPCILINTERPRETER_FLAGS) AC_SUBST(CSHARPCILINTERPRETER) AC_SUBST(CSHARPCONVERTPATH) AC_SUBST(CSHARPCOMPILER) AC_SUBST(CSHARPDYNAMICLINKING) AC_SUBST(CSHARPLIBRARYPREFIX) AC_SUBST(CSHARPCFLAGS) AC_SUBST(CSHARPSO) #---------------------------------------------------------------- # Look for Lua #---------------------------------------------------------------- LUABIN= LUAINCLUDE= LUALIB= LUADYNAMICLOADLIB= LUAFLAGS= LUALINK= # note: if LUABIN is empty then lua tests will not be done # LUABIN will be cleared if certain dependencies cannot be found AC_ARG_WITH(lua, AS_HELP_STRING([--without-lua], [Disable Lua]) AS_HELP_STRING([--with-lua=path], [Set location of Lua executable]),[ LUABIN="$withval"], [LUABIN="$alllang_default"]) AC_ARG_WITH(luaincl,[ --with-luaincl=path Set location of Lua include directory],[ LUAINCLUDE="$withval"], [LUAINCLUDE=]) AC_ARG_WITH(lualib,[ --with-lualib=path Set location of Lua library directory],[ LUALIB="$withval"], [LUALIB=]) # First, check for "--without-lua" or "--with-lua=no". if test x"${LUABIN}" = xno; then AC_MSG_NOTICE([Disabling Lua]) else # can we find lua? if test "x$LUABIN" = xyes; then # We look for a versioned Lua binary first, as there can be # multiple versions of Lua installed on some systems (like Debian). AC_PATH_PROGS(LUABIN, [lua5.4 lua5.3 lua5.2 lua5.1 lua]) fi # check version: we need Lua 5.x if test "$LUABIN"; then AC_MSG_CHECKING(Lua version) [LUA_VERSION=`$LUABIN -e 'print(string.match(_VERSION, "%d+[.]%d+"))'`] # For 5.0 and 5.1 header and libraries may be named using 50 or 51. LUA_VERSION_NO_DOTS= if test -n "$LUA_VERSION" ; then AC_MSG_RESULT([Lua $LUA_VERSION.x]) else AC_MSG_RESULT([failed]) fi case $LUA_VERSION in 5.0) LUA_VERSION_NO_DOTS=50 ;; 5.1) LUA_VERSION_NO_DOTS=51 ;; 5.*) ;; *) AC_MSG_WARN([Not Lua 5.x, SWIG does not support this version of Lua]) LUABIN="" ;; esac fi if test "$LUABIN"; then AC_MSG_CHECKING(whether Lua dynamic loading is enabled) # using Lua to check Lua # lua 5.0 & 5.1 have different fn names if test "$LUA_VERSION" = "5.0"; then LUADYNAMICLOADLIB=`$LUABIN -e '_,_,c=loadlib("no_such_lib","") if c~="absent" then print "1" end'` else LUADYNAMICLOADLIB=`$LUABIN -e '_,_,c=package.loadlib("no_such_lib","") if c~="absent" then print "1" end'` fi if test -z "$LUADYNAMICLOADLIB"; then AC_MSG_RESULT(no) else AC_MSG_RESULT(yes) fi # look for the header files & set LUAFLAGS accordingly # will clear LUABIN if not present if test -n "$LUAINCLUDE"; then AC_CHECK_FILE($LUAINCLUDE/lua.h,[LUAFLAGS="$ISYSTEM$LUAINCLUDE"],[LUABIN=]) else LUA_OK="1" CFLAGS_SAVED=$CFLAGS CFLAGS= # Use empty CFLAGS to avoid failure: "present but cannot be compiled" AC_CHECK_HEADER([lua.h],[LUAFLAGS=""],[LUA_OK=""]) CFLAGS=$CFLAGS_SAVED # if we didn't get it, going to have to look elsewhere (the hard way) if test -z "$LUA_OK"; then AC_MSG_CHECKING(for lua.h in other locations) # note: Debian/Ubuntu seem to like /usr/include/lua5.1/lua.h # The ordering of the include directories to search should match # the ordering of libraries to search in the library test below. inc=/usr/include incloc=/usr/local/include dirs="$inc/lua$LUA_VERSION" test -z "$LUA_VERSION_NO_DOTS" || dirs="$dirs $inc/lua$LUA_VERSION_NO_DOTS" dirs="$dirs $incloc/lua$LUA_VERSION" test -z "$LUA_VERSION_NO_DOTS" || dirs="$dirs $incloc/lua$LUA_VERSION_NO_DOTS" dirs="$dirs $incloc" for i in $dirs; do #echo "$i" if test -r $i/lua.h; then AC_MSG_RESULT($i/lua.h) LUAFLAGS="$ISYSTEM$i" break fi done if test -z "$LUAFLAGS"; then AC_MSG_RESULT(not found) LUABIN="" # clear the bin fi fi fi # look for the library files & set LUALINK accordingly # will clear LUABIN if not present lua_save_LIBS=$LIBS # the code seems to disrupt LIBS, so saving if test -n "$LUALIB"; then AC_CHECK_FILE($LUALIB/liblua.a,[LUALINK="-L$LUALIB -llua"],[LUABIN=]) else libs="lua lua$LUA_VERSION" test -z "$LUA_VERSION_NO_DOTS" || libs="$libs lua$LUA_VERSION_NO_DOTS" AC_SEARCH_LIBS(lua_close, [$libs], [LUALINK="-l$ac_lib"],[LUABIN=]) fi # adding lualib for lua 5.0 if test "$LUA_VERSION" = "5.0"; then LUALINK="$LUALINK -llualib" fi LIBS=$lua_save_LIBS # restore LIBS fi fi # if not disabled AC_SUBST(LUADYNAMICLINKING) AC_SUBST(LUAFLAGS) AC_SUBST(LUALINK) AC_SUBST(LUABIN) #---------------------------------------------------------------- # Look for GNU R #---------------------------------------------------------------- RBIN= AC_ARG_WITH(r, AS_HELP_STRING([--without-r], [Disable R]) AS_HELP_STRING([--with-r=path], [Set location of R executable (r)]),[ RBIN="$withval"], [RBIN="$alllang_default"]) # First, check for "--without-r" or "--with-r=no". if test x"${RBIN}" = xno; then AC_MSG_NOTICE([Disabling R]) RBIN= else # can we find R? if test "x$RBIN" = xyes; then AC_PATH_PROG(RBIN, R) fi fi AC_SUBST(RBIN) #---------------------------------------------------------------- # Look for Go compilers #---------------------------------------------------------------- AC_ARG_WITH(go, AS_HELP_STRING([--without-go], [Disable Go]) AS_HELP_STRING([--with-go=path], [Set location of Go compiler]),[GOBIN="$withval"], [GOBIN="$alllang_default"]) if test x"${GOBIN}" = xno; then AC_MSG_NOTICE([Disabling Go]) GO= GOGCC=false GCCGO= GOOPT= GCCGOOPT= GOVERSIONOPTION= else if test "x$GOBIN" = xyes; then AC_CHECK_PROGS(GO, go) else GO="$GOBIN" fi GOGCC=false GCCGO= GOOPT= GCCGOOPT= GOVERSIONOPTION= if test -n "$GO" ; then GOVERSIONOPTION=version go_version=$($GO $GOVERSIONOPTION | sed -e 's/go version //') AC_MSG_CHECKING([whether go version is too old]) case $go_version in go1.[012]*) AC_MSG_RESULT([yes - minimum version is 1.3]) GO= GOOPT="-intgosize 32" ;; *) AC_MSG_RESULT([no]) case "$(go env GOARCH)" in amd64 | arm64 | ppc64*) GOOPT="-intgosize 64" ;; *) GOOPT="-intgosize 32" ;; esac ;; esac fi AC_CHECK_PROGS(GCCGO, gccgo) if test -n "$GCCGO" ; then if $GCCGO --help 2>/dev/null | grep gccgo >/dev/null 2>&1 ; then AC_MSG_CHECKING([whether gccgo version is too old]) go_version=[`$GO $GOVERSIONOPTION | sed -n '1p' | sed -e 's/^.* \([0-9.]*\) *$/\1/' -e 's/[.]//g'`] if test "x$go_version" = x; then AC_MSG_RESULT([could not determine gccgo version]) GCCGO= elif test "$go_version" -lt 470; then AC_MSG_RESULT([yes - minimum version is 4.7.0]) GCCGO= else AC_MSG_RESULT([no]) if test "$go_version" -lt 480; then GCCGOOPT="-intgosize 32" else AC_CHECK_SIZEOF([void *], [4]) if test "$ac_cv_sizeof_void_p" = "8"; then GCCGOOPT="-intgosize 64" else GCCGOOPT="-intgosize 32" fi fi fi fi fi fi AC_SUBST(GOGCC) AC_SUBST(GCCGO) AC_SUBST(GO) AC_SUBST(GOC) AC_SUBST(GO1) AC_SUBST(GO12) AC_SUBST(GO13) AC_SUBST(GO15) AC_SUBST(GOOPT) AC_SUBST(GCCGOOPT) AC_SUBST(GOVERSIONOPTION) #---------------------------------------------------------------- # Look for D #---------------------------------------------------------------- AC_ARG_WITH(d, AS_HELP_STRING([--without-d], [Disable D]), [with_d="$withval"], [with_d="$alllang_default"]) AC_ARG_WITH(d1-compiler, [ --with-d1-compiler=path Set location of D1/Tango compiler (DMD compatible)],[D1COMPILERBIN="$withval"], [D1COMPILERBIN=]) AC_ARG_WITH(d2-compiler, [ --with-d2-compiler=path Set location of D2 compiler (DMD compatible)],[D2COMPILERBIN="$withval"], [D2COMPILERBIN=]) # First, check for "--without-d" or "--with-d=no". if test x"${with_d}" = xno; then AC_MSG_NOTICE([Disabling D]) D1COMPILER= D2COMPILER= else old_ac_ext=$ac_ext ac_ext=d if test -z "$D1COMPILERBIN" ; then AC_CHECK_PROGS(D1COMPILER, dmd ldmd gdmd) if test -n "$D1COMPILER" ; then AC_MSG_CHECKING(whether the D1/Tango compiler works) cat > conftest.$ac_ext <<_ACEOF import tango.io.Stdout; void main() { } _ACEOF rm -f conftest.$ac_objext AS_IF( [$D1COMPILER conftest.$ac_ext 2>&AS_MESSAGE_LOG_FD && test ! -s conftest.err && test -s conftest.$ac_objext], [AC_MSG_RESULT([yes])], [_AC_MSG_LOG_CONFTEST AC_MSG_RESULT([no]) D1COMPILER=] ) rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi else D1COMPILER="$D1COMPILERBIN" fi if test -z "$D2COMPILERBIN" ; then AC_CHECK_PROGS(D2COMPILER, dmd gdmd) if test -n "$D2COMPILER" ; then AC_MSG_CHECKING(whether the D2 compiler works) cat > conftest.$ac_ext <<_ACEOF import std.algorithm; void main() { } _ACEOF rm -f conftest.$ac_objext AS_IF( [$D2COMPILER conftest.$ac_ext 2>&AS_MESSAGE_LOG_FD && test ! -s conftest.err && test -s conftest.$ac_objext], [AC_MSG_RESULT([yes])], [_AC_MSG_LOG_CONFTEST AC_MSG_RESULT([no]) D2COMPILER=] ) rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi else D2COMPILER="$D2COMPILERBIN" fi ac_ext=$old_ac_ext fi if test -n "$D1COMPILER"; then DDEFAULTVERSION=1 elif test -n "$D2COMPILER"; then DDEFAULTVERSION=2 fi # Do not prefix library file names with "lib" on Windows. case $host in *-*-cygwin* | *-*-mingw*) DLIBPREFIX="";; *)DLIBPREFIX="lib";; esac AC_SUBST(D1COMPILER) AC_SUBST(D2COMPILER) AC_SUBST(DDEFAULTVERSION) AC_SUBST(DLIBPREFIX) #---------------------------------------------------------------- # Determine which languages to use for examples/test-suite #---------------------------------------------------------------- SKIP_TCL= if test -z "$TCLINCLUDE" || test -z "$TCLLIB" ; then SKIP_TCL="1" fi AC_SUBST(SKIP_TCL) SKIP_PERL5= if test -z "$PERL" || test -z "$PERL5EXT" || test -z "$PERL5TESTMORE"; then SKIP_PERL5="1" fi AC_SUBST(SKIP_PERL5) SKIP_OCTAVE= if test -z "$OCTAVE" ; then SKIP_OCTAVE="1" fi AC_SUBST(SKIP_OCTAVE) SKIP_PYTHON= if (test -z "$PYINCLUDE" || test -z "$PYLINK") && (test -z "$PY3INCLUDE" || test -z "$PY3LINK") ; then SKIP_PYTHON="1" fi AC_SUBST(SKIP_PYTHON) SKIP_PYTHON3= if test -z "$PY3INCLUDE" || test -z "$PY3LINK" ; then SKIP_PYTHON3="1" fi AC_SUBST(SKIP_PYTHON3) SKIP_JAVA= if test -z "$JAVA" || test -z "$JAVAC" || test -z "$JAVAINC" ; then SKIP_JAVA="1" fi AC_SUBST(SKIP_JAVA) SKIP_JAVASCRIPT= if test -z "$JAVASCRIPT" || ( test -z "$NODEJS" && test -z "$JSCENABLED" && test -z "$JSV8ENABLED" ) ; then SKIP_JAVASCRIPT="1" fi AC_SUBST(SKIP_JAVASCRIPT) SKIP_GUILE= if test -z "$GUILE" || test -z "$GUILE_LIBS" ; then SKIP_GUILE="1" fi AC_SUBST(SKIP_GUILE) SKIP_MZSCHEME= if test -z "$MZC" || test -z "$MZDYNOBJ" ; then SKIP_MZSCHEME="1" fi AC_SUBST(SKIP_MZSCHEME) SKIP_RUBY= if test -z "$RUBY" || test -z "$RUBYINCLUDE" || test -z "$RUBYLIB" ; then SKIP_RUBY="1" fi AC_SUBST(SKIP_RUBY) SKIP_PHP= if test -z "$PHP" || test -z "$PHPINC" ; then SKIP_PHP="1" fi AC_SUBST(SKIP_PHP) SKIP_OCAML= if test -z "$OCAMLC" || test -z "$CAMLP4" ; then SKIP_OCAML="1" fi AC_SUBST(SKIP_OCAML) SKIP_CSHARP= if test -z "$CSHARPCOMPILER" ; then SKIP_CSHARP="1" else if test "cscc" = "$CSHARPCOMPILER" && test -z "$CSHARPCILINTERPRETER" ; then SKIP_CSHARP="1" fi fi AC_SUBST(SKIP_CSHARP) SKIP_LUA= # we need LUABIN & dynamic loading if test -z "$LUABIN" || test -z "$LUADYNAMICLOADLIB"; then SKIP_LUA="1" fi AC_SUBST(SKIP_LUA) SKIP_R= if test -z "$RBIN" ; then SKIP_R="1" fi AC_SUBST(SKIP_R) SKIP_SCILAB= if test -z "$SCILAB"; then SKIP_SCILAB="1" fi AC_SUBST(SKIP_SCILAB) SKIP_GO= if test -z "$GO" ; then SKIP_GO="1" fi AC_SUBST(SKIP_GO) SKIP_D= if test -z "$DDEFAULTVERSION" ; then SKIP_D="1" fi AC_SUBST(SKIP_D) #---------------------------------------------------------------- # Additional language dependencies #---------------------------------------------------------------- SKIP_ANDROID= if test -z "$ANDROID" || test -z "$ADB" || test -z "$ANT" || test -z "$NDKBUILD" ; then SKIP_ANDROID="1" fi AC_SUBST(SKIP_ANDROID) #---------------------------------------------------------------- # Miscellaneous #---------------------------------------------------------------- ABS_SRCDIR=`(cd ${srcdir} && pwd)` dnl Under Cygwin, we may need native absolute path as it is used by SWIG, which dnl may be a native, and not a Cygwin, program (this is the case when it's dnl built using MinGW or cccl compiler in Cygwin environment). However it may, dnl although this is probably more rare, also be built as a Cygwin program. dnl Using "mixed" path like we do here allows the path to work in both cases. case $host in *-*-mingw* ) ABS_SRCDIR=`${srcdir}/Tools/convertpath -m $ABS_SRCDIR` ;; *-*-cygwin* ) ABS_SRCDIR=`cygpath --mixed $ABS_SRCDIR` ;; esac # Root directory ROOT_DIR=`pwd` case $host in *-*-cygwin*) # Translate path for native Windows compilers for use with 'make check' if (cygpath --mixed $ROOT_DIR) >/dev/null 2>/dev/null; then ROOT_DIR=`cygpath --mixed $ROOT_DIR` fi ;; esac case $host in *-*-cygwin* | *-*-mingw*) # Extra files generated by some Windows compilers EXTRA_CLEAN="*.stackdump *.exp *.lib *.pdb *.ilk" ;; esac AC_SUBST(ROOT_DIR) AC_SUBST(EXTRA_CLEAN) AC_SUBST(ac_aux_dir) # Configure SWIG_LIB path AC_ARG_WITH(swiglibdir,[ --with-swiglibdir=DIR Put SWIG system-independent libraries into DIR.], [swig_lib="$withval"], [swig_lib="${datadir}/swig/${PACKAGE_VERSION}"]) SWIG_LIB_INSTALL=${swig_lib} AC_SUBST(SWIG_LIB_INSTALL) AC_DEFINE_DIR(SWIG_LIB, swig_lib, [Directory for SWIG system-independent libraries]) case $build in # Windows does not understand unix directories. Convert into a windows directory with drive letter. *-*-mingw*) SWIG_LIB_WIN_UNIX=`${srcdir}/Tools/convertpath -m $SWIG_LIB`;; *-*-cygwin*) SWIG_LIB_WIN_UNIX=`cygpath --mixed "$SWIG_LIB"`;; *) SWIG_LIB_WIN_UNIX="";; esac AC_DEFINE_UNQUOTED(SWIG_LIB_WIN_UNIX, ["$SWIG_LIB_WIN_UNIX"], [Directory for SWIG system-independent libraries (Unix install on native Windows)]) SWIG_LIB_PREINST=$ABS_SRCDIR/Lib AC_SUBST(SWIG_LIB_PREINST) dnl For testing purposes, clear SWIG_LIB when building SWIG in the source dnl directory under Windows because it is supposed to work without SWIG_LIB dnl being set. Otherwise it always needs to be set. SWIG_LIB_SET="env SWIG_LIB=\$(SWIG_LIB_DIR)" if test "${srcdir}" = "."; then AC_EGREP_CPP([yes], [#ifdef _WIN32 yes #endif ], [SWIG_LIB_SET="env SWIG_LIB="], []) fi AC_SUBST(SWIG_LIB_SET) AC_CONFIG_FILES([ Makefile swig.spec Examples/Makefile Examples/d/example.mk Examples/xml/Makefile Examples/test-suite/errors/Makefile Examples/test-suite/csharp/Makefile Examples/test-suite/d/Makefile Examples/test-suite/guile/Makefile Examples/test-suite/java/Makefile Examples/test-suite/javascript/Makefile Examples/test-suite/mzscheme/Makefile Examples/test-suite/ocaml/Makefile Examples/test-suite/octave/Makefile Examples/test-suite/perl5/Makefile Examples/test-suite/php/Makefile Examples/test-suite/python/Makefile Examples/test-suite/ruby/Makefile Examples/test-suite/scilab/Makefile Examples/test-suite/tcl/Makefile Examples/test-suite/lua/Makefile Examples/test-suite/r/Makefile Examples/test-suite/go/Makefile Source/Makefile Tools/javascript/Makefile ]) AC_CONFIG_FILES([preinst-swig], [chmod +x preinst-swig]) AC_CONFIG_FILES([CCache/ccache_swig_config.h]) #-------------------------------------------------------------------- # Building Examples/ out of source directory #-------------------------------------------------------------------- # If building out of source tree, replicate Examples/ source tree in # build directory, and copy over Makefiles from source directory. # Prefix each Makefile with a header which sets SRCDIR to the relative # source directory, and provides a rule for updating the Makefile from # its original source. AC_CONFIG_COMMANDS([Examples],[ if test "x${srcdir}" != "x." ; then AC_MSG_NOTICE([generating Examples build tree]) for mkfile in `cd ${srcdir} && find Examples/ -type f -name Makefile`; do dir=`dirname ${mkfile}` d=${dir} reldir="" while test "x$d" != "x." ; do d=`dirname $d` reldir="${reldir}../" done relsrcdir=${reldir}${srcdir}/ AS_MKDIR_P([${dir}]) cat <${mkfile} # DO NOT EDIT: instead edit ${relsrcdir}${mkfile} # and run (cd ${reldir} && ./config.status) to regenerate TOP_BUILDDIR_TO_TOP_SRCDIR = ${srcdir}/ SRCDIR = ${relsrcdir}${dir}/ EOF cat ${srcdir}/${mkfile} >>${mkfile} done fi ]) #-------------------------------------------------------------------- AC_OUTPUT langs="" test -n "$SKIP_CSHARP" || langs="${langs}csharp " test -n "$SKIP_D" || langs="${langs}d " test -n "$SKIP_GO" || langs="${langs}go " test -n "$SKIP_GUILE" || langs="${langs}guile " test -n "$SKIP_JAVA" || langs="${langs}java " test -n "$SKIP_JAVASCRIPT" || langs="${langs}javascript " test -n "$SKIP_LUA" || langs="${langs}lua " test -n "$SKIP_MZSCHEME" || langs="${langs}mzscheme " test -n "$SKIP_OCAML" || langs="${langs}ocaml " test -n "$SKIP_OCTAVE" || langs="${langs}octave " test -n "$SKIP_PERL5" || langs="${langs}perl5 " test -n "$SKIP_PHP" || langs="${langs}php " test -n "$SKIP_PYTHON" || langs="${langs}python " test -n "$SKIP_R" || langs="${langs}r " test -n "$SKIP_RUBY" || langs="${langs}ruby " test -n "$SKIP_SCILAB" || langs="${langs}scilab " test -n "$SKIP_TCL" || langs="${langs}tcl " echo " The SWIG test-suite and examples are configured for the following languages: $langs " dnl configure.ac ends here swig-4.0.1/Win/0000755000175000017500000000000013527063513013105 5ustar williamwilliamswig-4.0.1/Win/README.txt0000644000175000017500000000023113527063513014577 0ustar williamwilliamPlease see the Doc/Manual/Windows.html file in the main manual for instructions for using and installing SWIG on Windows including running the examples. swig-4.0.1/TODO0000644000175000017500000002410313527063513013040 0ustar williamwilliamSWIG TO-DO ----------------------------------------------------------------------------- **** = High Priority *** = Implement if possible. ** = Will implement if time. * = Implement if bored (or deemed necessary). defer = Implement in next version CORE: **** Add support for nested classes. The type system should be defer ready to go. The primary obstacle lies in the target language modules (which were never programmed with nested classes in mind). There are also issues with nested C structures. For example: struct Foo { struct { int x,y; } z; }; This is one of the last remaining "hard" problems in the SWIG core, but it is important that we solve it. *** "Nested" typemaps. The basic idea is similar to allowing one to use $descriptor(T) for any T, rather than just $descriptor for the type currently being typemapped. In short (ha!), given a previously defined typemap: %typemap(in) Foo { // whatever it takes to initialize $1 from $input } it would be possible to inline its code inside another typemap. While the syntax is still to be defined, the use would be along the lines of: template class vector { %typemap(in) vector { ... for (int i=0; i $typemap(in, input=x) ( int FIRST = foo, double SECOND = bar ); The advantage of this syntax would be that the formal arguments (int FIRST, double SECOND) are close to the actual arguments (foo, bar). Comment by beazley $typemap(in, input=x) int = foo; is a little bit hard to parse in terms of variable substitution. I'm considering something like this: $typemap(in,1=int foo, input=x) Note: This is partially implemented in the new Unified Typemap Library(python,tcl,ruby and perl) via %fragments and the SWIG_From/SWIG_AsVal methdos. *** Implement $fail special variable substitution in wrappers. Used to properly transfer control out of a wrapper function while reclaiming resources. Note: Implemented in languages that uses the UTL via the 'SWIG_fail' macro. *** Rewrite declaration annotation to better unify %rename and related directives. Add a selector mechanism that allows specific parse tree nodes to be identified. For example: %feature("foo", nodetype="class") Foo { ... some code ... }; Consider use of wildcards. Namespace/nested scope support in %feature is currently weak. It works, but is fragile. Consider an implementation that is better integrated with symbol table management. Continue to consolidate SWIG directives to %feature. Note: Initial implementation in the %rename directive. *** Add more intelligent information related to object ownership. SWIG should be able to automatically strip ownership from objects when they are assigned to pointer variables and structure members as well as stored in a container (i.e., an array of pointers). [ Partially finished for Ruby/Perl/Tcl/Python. ] ** Restoration of the documentation system. [ Partially done for Python. ] ** Restoration of Objective-C support. ** Unification of symbol tables and type system scopes. In a sense they capture the same information so it is not necessary to have both. The existence of two symbol management systems is mostly historical. Build ----- Library ------- **** Add more support for the C++ standard library. std::complex and other core datatypes. Refine support for STL vector. Add more STL objects. [ Partially finished for Python. ] **** Continue to expand the set of recognized typemaps. Windows ------- All language modules -------------------- Python ------ *** Ability to wrap certain classes as Python built-in types. Perl ---- **** Rewrite runtime pointer type checking to better integrate shadow classes. Creation of shadow classes should be done in C instead of Perl. This will fix a number of problems related to typemaps and reduce the amount of Perl wrapper code. **** Create tests for existing support for operator overloading Tcl --- Ruby ---- **** The "Resource Management in Proxies" section of the "SWIG and C++" chapter discusses how proxies' ownership of their associated C++ object can change, and the use of the special disown() and acquire() methods to change this ownership status. Need to address this for Ruby as well. *** Add support for keyword arguments (by collecting them in a hash?). Java ---- C# -- PHP --- **** Look at moving to using the UTL. ** When returning wrapped objects via alternate constructors if that pointer value already exists "out there" as a resource we should use the same resource, we can't have multiple ref-counted resources mapping to the same object in case it gets twice destroyed. And check if ref count destroying is even working, see smart_pointer_rename * Work out how classes without even inherited constructors should interact with the php "new " notation. See: abstract_inherit_wrap.cpptest ** Look at pass by point and passby ref, Make sometype** to be auto allocated Make sometype& and sometype* to be autoallocated IF THEY ARE NOT ALREADY swigtype wrapped. * Review to see what else is missing! Guile ----- ** Maybe rename slot setters from CLASS-SLOT-set to CLASS-SLOT-set! to match Scheme convention for naming of mutators. ** Support keyword args. ** Director Support! ** Cleaner handling of multiple values. Use a typemap keyword argument "numoutputs" of "out" and "argout" to indicate how many values are returned. ** Make SWIG's types first-class by using a separate smob type for SWIG type descriptors; enable reflection on types. (Maybe GOOPS metaclasses?) ** Provide a clean way to construct type predicates. ** In GOOPS mode, maybe make overloaded functions methods. ** Increase the safety of destructor functions. John Lenz suggests: I think the best way of doing this would be to use %feature to mark which classes allow for "normal" smobs to be deleted explicitly. We separate pointers into two classes, those that can be deleted from scheme and those that can't. The pointers that can be deleted use the smob and those that can not be deleted use the smob. A user can specify which type of each object they want with %newobject and the CONSUMED typemap. By default, the exported destructor will only accept smobs, because by definition, collectable-swig smobs are those that can be deleted from scheme. This allows for the user to implement protection. In the interface file, the user has complete control over which objects can and can not be deleted, and can guarantee that objects that should not be deleted can not be deleted, and that objects that should eventually be deleted will be garbage collected. This protection can then be overridden with a %feature directive, something like %feature("guile_allow_destroy_all","1") Foo::~Foo; I don't know what word we want to use, guile_allow_destroy_all is kinda bad. This feature would then allow for a smob to be deleted by passing it to the destructor. This would allow users to maintain the protection on other classes, only manually overriding the protection on the classes that need it. Mzscheme -------- ** Port list-vector.i and pointer-in-out.i from Guile. ** Add shadow class support for the Swindle system. Ocaml ----- ** I've been working with my camlp4 module and type information from the compiler. When I'm done, the user will have access to type inference when writing code, when the inference is unambiguous. This allows the user to write x = _foo 1.0 instead of x = get_float (_foo (C_float 1.0)). It's not as easy as it sounds, because O'caml doesn't keep type information at run time, and doesn't really have a mechanism for doing what I need. However, it's possible to write a preprocessor that inserts correct type info at compile time. That having been said, the program must compile for type info to be available, so I need to attend to a lot of details; The program must compile both with and without type augmentation. Xml --- Documentation ------------- **** Extending SWIG (and internals). *** Perl, Python, Tcl modules. *** add section for Perl module support for operator overloading swig-4.0.1/configure0000755000175000017500000137064613527234050014274 0ustar williamwilliam#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.69 for swig 4.0.1. # # Report bugs to . # # # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 as_fn_exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test \$(( 1 + 1 )) = 2 || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org and $0: http://www.swig.org about your system, including any $0: error possibly output before this message. Then install $0: a modern shell, or manually run the script under such a $0: shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='swig' PACKAGE_TARNAME='swig' PACKAGE_VERSION='4.0.1' PACKAGE_STRING='swig 4.0.1' PACKAGE_BUGREPORT='http://www.swig.org' PACKAGE_URL='' ac_unique_file="Source/Swig/swig.h" enable_option_checking=no # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef STDC_HEADERS # include # include #else # ifdef HAVE_STDLIB_H # include # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include # endif # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" ac_subst_vars='am__EXEEXT_FALSE am__EXEEXT_TRUE LTLIBOBJS LIBOBJS SWIG_LIB_SET SWIG_LIB_PREINST SWIG_LIB SWIG_LIB_INSTALL ac_aux_dir EXTRA_CLEAN ROOT_DIR SKIP_ANDROID SKIP_D SKIP_GO SKIP_SCILAB SKIP_R SKIP_LUA SKIP_CSHARP SKIP_OCAML SKIP_PHP SKIP_RUBY SKIP_MZSCHEME SKIP_GUILE SKIP_JAVASCRIPT SKIP_JAVA SKIP_PYTHON3 SKIP_PYTHON SKIP_OCTAVE SKIP_PERL5 SKIP_TCL DLIBPREFIX DDEFAULTVERSION D2COMPILER D1COMPILER GOVERSIONOPTION GCCGOOPT GOOPT GO15 GO13 GO12 GO1 GOC GOGCC GCCGO GO RBIN LUALINK LUAFLAGS LUADYNAMICLINKING LUABIN CSHARPSO CSHARPCFLAGS CSHARPLIBRARYPREFIX CSHARPDYNAMICLINKING CSHARPCONVERTPATH CSHARPCILINTERPRETER_FLAGS CSHARPCILINTERPRETER CSHARPCOMPILER OCAMLMKTOP OCAMLFIND OCAMLDLGEN CAMLP4 OCAMLC PHPINC PHP RUBYDYNAMICLINKING RUBYSO RUBYCCDLFLAGS RUBYLINK RUBYLIB RUBYINCLUDE RUBY MZDYNOBJ MZC MZSCHEME GUILE_LIBS GUILE_CFLAGS GUILE GUILE_CONFIG NDKBUILD ANT ADB ANDROID JSV8ENABLED JSCENABLED JSV8DYNAMICLINKING JSV8INC JSCOREVERSION JSCOREDYNAMICLINKING JSCOREINC JSINTERPRETERLINKFLAGS JSINTERPRETERCXX NODEGYP NODEJS JAVACFLAGS JAVAFLAGS JAVACXXSHARED JAVALDSHARED JAVASO JAVALIBRARYPREFIX JAVADYNAMICLINKING JAVA_TOOLS_JAR JAVA_CLASSPATH_SEP JAVAINC JAVAC JAVA SCILABOPT SCILABINCLUDE SCILAB OCTAVE_LDFLAGS OCTAVE_CXXFLAGS OCTAVE_CPPFLAGS OCTAVE_SO OCTAVE PERL5LDFLAGS PERL5CCCDLFLAGS PERL5CCDLFLAGS PERL5CCFLAGS PERL5LIB PERL5DYNAMICLINKING PERL5EXT PERL PY2TO3 PYCODESTYLE PYTHON3DYNAMICLINKING PY3LINK PY3LIB PY3INCLUDE PY3CONFIG PYTHON3 PYTHONDYNAMICLINKING PYLINK PYLIB PYINCLUDE PYTHON TCLCXXSHARED TCLLDSHARED TCLDYNAMICLINKING TCLLIB TCLINCLUDE PKGCONFIG LIBC LIBCRYPT LIBM SWILL SWIGLIBS LUA_SO MZSCHEME_SO PHP_SO GUILE_SO TCL_SO PYTHON_SO LINKFORSHARED HAVE_CXX11_COMPILER PLATCXXFLAGS PLATCFLAGS RPATH TRYLINKINGWITHCXX CXXSHARED CCSHARED LDSHARED SO BOOST_LDFLAGS BOOST_CPPFLAGS YFLAGS YACC ENABLE_CCACHE subdirs PCRE_LIBS PCRE_CFLAGS PCRE_CONFIG SED EGREP GREP CPP am__fastdepCXX_FALSE am__fastdepCXX_TRUE CXXDEPMODE ac_ct_CXX CXXFLAGS CXX am__fastdepCC_FALSE am__fastdepCC_TRUE CCDEPMODE am__nodep AMDEPBACKSLASH AMDEP_FALSE AMDEP_TRUE am__quote am__include DEPDIR OBJEXT EXEEXT ac_ct_CC CPPFLAGS LDFLAGS CFLAGS CC AM_BACKSLASH AM_DEFAULT_VERBOSITY AM_DEFAULT_V AM_V am__untar am__tar AMTAR am__leading_dot SET_MAKE AWK mkdir_p MKDIR_P INSTALL_STRIP_PROGRAM STRIP install_sh MAKEINFO AUTOHEADER AUTOMAKE AUTOCONF ACLOCAL VERSION PACKAGE CYGPATH_W am__isrc INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM host_os host_vendor host_cpu host build_os build_vendor build_cpu build target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir runstatedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking enable_silent_rules enable_dependency_tracking with_maximum_compile_warnings with_popen with_pcre with_pcre_prefix with_pcre_exec_prefix enable_ccache with_boost with_boost_libdir enable_cpp11_testing with_libm with_libc with_alllang with_tclconfig with_tcl with_tclincl with_tcllib with_python with_python3 with_2to3 with_perl5 with_octave with_scilab with_scilab_inc with_java with_javac with_javaincl with_javascript with_jscoreinc with_jscorelib with_jsv8inc with_jsv8lib with_android with_adb with_ant with_ndk_build with_guile_config with_guile with_guile_cflags with_guile_libs with_mzscheme with_mzc with_ruby with_php with_ocaml with_ocamlc with_ocamldlgen with_ocamlfind with_ocamlmktop with_camlp4 with_csharp with_cil_interpreter with_csharp_compiler with_lua with_luaincl with_lualib with_r with_go with_d with_d1_compiler with_d2_compiler with_swiglibdir ' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS LIBS CPPFLAGS CXX CXXFLAGS CCC CPP PCRE_CONFIG PCRE_CFLAGS PCRE_LIBS YACC YFLAGS' ac_subdirs_all='CCache' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' runstatedir='${localstatedir}/run' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -runstatedir | --runstatedir | --runstatedi | --runstated \ | --runstate | --runstat | --runsta | --runst | --runs \ | --run | --ru | --r) ac_prev=runstatedir ;; -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \ | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \ | --run=* | --ru=* | --r=*) runstatedir=$ac_optarg ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir runstatedir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures swig 4.0.1 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --runstatedir=DIR modifiable per-process data [LOCALSTATEDIR/run] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/swig] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF Program names: --program-prefix=PREFIX prepend PREFIX to installed program names --program-suffix=SUFFIX append SUFFIX to installed program names --program-transform-name=PROGRAM run sed PROGRAM on installed program names System types: --build=BUILD configure for building on BUILD [guessed] --host=HOST cross-compile to build programs to run on HOST [BUILD] _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of swig 4.0.1:";; esac cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-silent-rules less verbose build output (undo: "make V=1") --disable-silent-rules verbose build output (undo: "make V=0") --enable-dependency-tracking do not reject slow dependency extractors --disable-dependency-tracking speeds up one-time build --disable-ccache disable building and installation of ccache-swig executable (default enabled) --enable-cpp11-testing enable C++11 testing if supported by compiler (default disabled) Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --without-maximum-compile-warnings Disable maximum warning verbosity --without-popen Disable popen --without-pcre Disable support for regular expressions using PCRE --with-pcre-prefix=PREFIX Prefix where pcre is installed (optional) --with-pcre-exec-prefix=EPREFIX Exec prefix where pcre is installed (optional) --with-boost[=ARG] use Boost library from a standard location (ARG=yes), from the specified location (ARG=), or disable it (ARG=no) [ARG=yes] --with-boost-libdir=LIB_DIR Force given directory for boost libraries. Note that this will override library path detection, so use this parameter only if default library detection fails and you know exactly where your boost libraries are located. --with-libm=STRING math library --with-libc=STRING C library --without-alllang Disable all languages --without-tcl Disable Tcl --with-tclconfig=path Set location of tclConfig.sh --with-tcl=path Set location of Tcl package --with-tclincl=path Set location of Tcl include directory --with-tcllib=path Set location of Tcl library directory --without-python Disable Python --with-python=path Set location of Python executable --without-python3 Disable Python 3.x support --with-python3=path Set location of Python 3.x executable --with-2to3=path Set location of Python 2to3 tool --without-perl5 Disable Perl5 --with-perl5=path Set location of Perl5 executable --without-octave Disable Octave --with-octave=path Set location of Octave executable --without-scilab Disable Scilab --with-scilab=path Set location of Scilab executable --with-scilab-inc=path Set location of Scilab include directory --without-java Disable Java --with-java=path Set location of java executable --with-javac=path Set location of javac executable --with-javaincl=path Set location of Java include directory --without-javascript Disable Javascript --with-jscoreinc=path Set location of Javascript include directory --with-jscorelib=path Set location of the JavaScriptCore/Webkit library directory --with-jsv8inc=path Set location of Javascript v8 include directory --with-jsv8lib=path Set location of V8 Javascript library directory --without-android Disable Android --with-android=path Set location of android executable --with-adb=path Set location of adb executable - Android Debug Bridge --with-ant=path Set location of ant executable for Android --with-ndk-build=path Set location of Android ndk-build executable --without-guile Disable Guile --with-guile-config=path Set location of guile-config --with-guile=path Set location of Guile executable --with-guile-cflags=cflags Set cflags required to compile against Guile --with-guile-libs=ldflags Set ldflags needed to link with Guile --without-mzscheme Disable MzScheme --with-mzscheme=path Set location of MzScheme executable --with-mzc=path Set location of MzScheme's mzc --without-ruby Disable Ruby --with-ruby=path Set location of Ruby executable --without-php Disable PHP --with-php=path Set location of PHP executable --without-ocaml Disable OCaml --with-ocamlc=path Set location of ocamlc executable --with-ocamldlgen=path Set location of ocamldlgen --with-ocamlfind=path Set location of ocamlfind --with-ocamlmktop=path Set location of ocamlmktop executable --with-camlp4=path Set location of camlp4 executable --without-csharp Disable CSharp --with-cil-interpreter=path Set location of CIL interpreter for CSharp --with-csharp-compiler=path Set location of CSharp compiler --without-lua Disable Lua --with-lua=path Set location of Lua executable --with-luaincl=path Set location of Lua include directory --with-lualib=path Set location of Lua library directory --without-r Disable R --with-r=path Set location of R executable (r) --without-go Disable Go --with-go=path Set location of Go compiler --without-d Disable D --with-d1-compiler=path Set location of D1/Tango compiler (DMD compatible) --with-d2-compiler=path Set location of D2 compiler (DMD compatible) --with-swiglibdir=DIR Put SWIG system-independent libraries into DIR. Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CXX C++ compiler command CXXFLAGS C++ compiler flags CPP C preprocessor PCRE_CONFIG config script used for pcre PCRE_CFLAGS CFLAGS used for pcre PCRE_LIBS LIBS used for pcre YACC The `Yet Another Compiler Compiler' implementation to use. Defaults to the first program found out of: `bison -y', `byacc', `yacc'. YFLAGS The list of arguments that will be passed by default to $YACC. This script will default YFLAGS to the empty string to avoid a default value of `-d' given by some make applications. Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to . _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF swig configure 4.0.1 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## # ac_fn_c_try_compile LINENO # -------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_compile # ac_fn_cxx_try_compile LINENO # ---------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_compile # ac_fn_c_try_cpp LINENO # ---------------------- # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_cpp # ac_fn_c_try_run LINENO # ---------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes # that executables *can* be run. ac_fn_c_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_run # ac_fn_c_try_link LINENO # ----------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_link # ac_fn_c_check_func LINENO FUNC VAR # ---------------------------------- # Tests whether FUNC exists, setting the cache variable VAR accordingly ac_fn_c_check_func () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case declares $2. For example, HP-UX 11i declares gettimeofday. */ #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $2 (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $2 /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $2 (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$2 || defined __stub___$2 choke me #endif int main () { return $2 (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_func # ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists, giving a warning if it cannot be compiled using # the include files in INCLUDES and setting the cache variable VAR # accordingly. ac_fn_c_check_header_mongrel () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if eval \${$3+:} false; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 $as_echo_n "checking $2 usability... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_header_compiler=yes else ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 $as_echo_n "checking $2 presence... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <$2> _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : ac_header_preproc=yes else ac_header_preproc=no fi rm -f conftest.err conftest.i conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( yes:no: ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; no:yes:* ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ( $as_echo "## ---------------------------------- ## ## Report this to http://www.swig.org ## ## ---------------------------------- ##" ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_mongrel # ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists and can be compiled using the include files in # INCLUDES, setting the cache variable VAR accordingly. ac_fn_c_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_compile # ac_fn_c_compute_int LINENO EXPR VAR INCLUDES # -------------------------------------------- # Tries to find the compile-time value of EXPR in a program that includes # INCLUDES, setting VAR accordingly. Returns whether the value could be # computed ac_fn_c_compute_int () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if test "$cross_compiling" = yes; then # Depending upon the size, compute the lo and hi bounds. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { static int test_array [1 - 2 * !(($2) >= 0)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_lo=0 ac_mid=0 while :; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { static int test_array [1 - 2 * !(($2) <= $ac_mid)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_hi=$ac_mid; break else as_fn_arith $ac_mid + 1 && ac_lo=$as_val if test $ac_lo -le $ac_mid; then ac_lo= ac_hi= break fi as_fn_arith 2 '*' $ac_mid + 1 && ac_mid=$as_val fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { static int test_array [1 - 2 * !(($2) < 0)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_hi=-1 ac_mid=-1 while :; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { static int test_array [1 - 2 * !(($2) >= $ac_mid)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_lo=$ac_mid; break else as_fn_arith '(' $ac_mid ')' - 1 && ac_hi=$as_val if test $ac_mid -le $ac_hi; then ac_lo= ac_hi= break fi as_fn_arith 2 '*' $ac_mid && ac_mid=$as_val fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done else ac_lo= ac_hi= fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext # Binary search between lo and hi bounds. while test "x$ac_lo" != "x$ac_hi"; do as_fn_arith '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo && ac_mid=$as_val cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { static int test_array [1 - 2 * !(($2) <= $ac_mid)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_hi=$ac_mid else as_fn_arith '(' $ac_mid ')' + 1 && ac_lo=$as_val fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done case $ac_lo in #(( ?*) eval "$3=\$ac_lo"; ac_retval=0 ;; '') ac_retval=1 ;; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 static long int longval () { return $2; } static unsigned long int ulongval () { return $2; } #include #include int main () { FILE *f = fopen ("conftest.val", "w"); if (! f) return 1; if (($2) < 0) { long int i = longval (); if (i != ($2)) return 1; fprintf (f, "%ld", i); } else { unsigned long int i = ulongval (); if (i != ($2)) return 1; fprintf (f, "%lu", i); } /* Do not output a trailing newline, as this causes \r\n confusion on some platforms. */ return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : echo >>conftest.val; read $3 config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by swig $as_me 4.0.1, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in #(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_aux_dir= for ac_dir in Tools/config "$srcdir"/Tools/config; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then as_fn_error $? "cannot find install-sh, install.sh, or shtool in Tools/config \"$srcdir\"/Tools/config" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. ac_config_headers="$ac_config_headers Source/Include/swigconfig.h" # Make sure we can run config.sub. $SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 $as_echo_n "checking build system type... " >&6; } if ${ac_cv_build+:} false; then : $as_echo_n "(cached) " >&6 else ac_build_alias=$build_alias test "x$ac_build_alias" = x && ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` test "x$ac_build_alias" = x && as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 $as_echo "$ac_cv_build" >&6; } case $ac_cv_build in *-*-*) ;; *) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; esac build=$ac_cv_build ac_save_IFS=$IFS; IFS='-' set x $ac_cv_build shift build_cpu=$1 build_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: build_os=$* IFS=$ac_save_IFS case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 $as_echo_n "checking host system type... " >&6; } if ${ac_cv_host+:} false; then : $as_echo_n "(cached) " >&6 else if test "x$host_alias" = x; then ac_cv_host=$ac_cv_build else ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 $as_echo "$ac_cv_host" >&6; } case $ac_cv_host in *-*-*) ;; *) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; esac host=$ac_cv_host ac_save_IFS=$IFS; IFS='-' set x $ac_cv_host shift host_cpu=$1 host_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: host_os=$* IFS=$ac_save_IFS case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac am__api_version='1.15' # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 $as_echo_n "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then if ${ac_cv_path_install+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in #(( ./ | .// | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else rm -rf conftest.one conftest.two conftest.dir echo one > conftest.one echo two > conftest.two mkdir conftest.dir if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && test -s conftest.one && test -s conftest.two && test -s conftest.dir/conftest.one && test -s conftest.dir/conftest.two then ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi fi done done ;; esac done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 $as_echo "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 $as_echo_n "checking whether build environment is sane... " >&6; } # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[\\\"\#\$\&\'\`$am_lf]*) as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; esac case $srcdir in *[\\\"\#\$\&\'\`$am_lf\ \ ]*) as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;; esac # Do 'set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( am_has_slept=no for am_try in 1 2; do echo "timestamp, slept: $am_has_slept" > conftest.file set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$*" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi if test "$*" != "X $srcdir/configure conftest.file" \ && test "$*" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". as_fn_error $? "ls -t appears to fail. Make sure there is not a broken alias in your environment" "$LINENO" 5 fi if test "$2" = conftest.file || test $am_try -eq 2; then break fi # Just in case. sleep 1 am_has_slept=yes done test "$2" = conftest.file ) then # Ok. : else as_fn_error $? "newly created file is older than distributed files! Check your system clock" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } # If we didn't sleep, we still need to ensure time stamps of config.status and # generated files are strictly newer. am_sleep_pid= if grep 'slept: no' conftest.file >/dev/null 2>&1; then ( sleep 1 ) & am_sleep_pid=$! fi rm -f conftest.file test "$program_prefix" != NONE && program_transform_name="s&^&$program_prefix&;$program_transform_name" # Use a double $ so make ignores it. test "$program_suffix" != NONE && program_transform_name="s&\$&$program_suffix&;$program_transform_name" # Double any \ or $. # By default was `s,x,x', remove it if useless. ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` # Expand $ac_aux_dir to an absolute path. am_aux_dir=`cd "$ac_aux_dir" && pwd` if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --is-lightweight"; then am_missing_run="$MISSING " else am_missing_run= { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5 $as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;} fi if test x"${install_sh+set}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi # Installed binaries are usually stripped using 'strip' when the user # run "make install-strip". However 'strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the 'STRIP' environment variable to overrule this program. if test "$cross_compiling" != no; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 $as_echo_n "checking for a thread-safe mkdir -p... " >&6; } if test -z "$MKDIR_P"; then if ${ac_cv_path_mkdir+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in mkdir gmkdir; do for ac_exec_ext in '' $ac_executable_extensions; do as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( 'mkdir (GNU coreutils) '* | \ 'mkdir (coreutils) '* | \ 'mkdir (fileutils) '4.1*) ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext break 3;; esac done done done IFS=$as_save_IFS fi test -d ./--version && rmdir ./--version if test "${ac_cv_path_mkdir+set}" = set; then MKDIR_P="$ac_cv_path_mkdir -p" else # As a last resort, use the slow shell script. Don't cache a # value for MKDIR_P within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. MKDIR_P="$ac_install_sh -d" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 $as_echo "$MKDIR_P" >&6; } for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AWK+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AWK="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 $as_echo "$AWK" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AWK" && break done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null # Check whether --enable-silent-rules was given. if test "${enable_silent_rules+set}" = set; then : enableval=$enable_silent_rules; fi case $enable_silent_rules in # ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=1;; esac am_make=${MAKE-make} { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 $as_echo_n "checking whether $am_make supports nested variables... " >&6; } if ${am_cv_make_support_nested_variables+:} false; then : $as_echo_n "(cached) " >&6 else if $as_echo 'TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 $as_echo "$am_cv_make_support_nested_variables" >&6; } if test $am_cv_make_support_nested_variables = yes; then AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AM_BACKSLASH='\' if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." am__isrc=' -I$(srcdir)' # test to see if srcdir already configured if test -f $srcdir/config.status; then as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi # Define the identity of the package. PACKAGE='swig' VERSION='4.0.1' cat >>confdefs.h <<_ACEOF #define PACKAGE "$PACKAGE" _ACEOF cat >>confdefs.h <<_ACEOF #define VERSION "$VERSION" _ACEOF # Some tools Automake needs. ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} # For better backward compatibility. To be removed once Automake 1.9.x # dies out for good. For more background, see: # # mkdir_p='$(MKDIR_P)' # We need awk for the "check" target (and possibly the TAP driver). The # system "awk" is bad on some platforms. # Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AMTAR='$${TAR-tar}' # We'll loop over all known methods to create a tar archive until one works. _am_tools='gnutar pax cpio none' am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' # POSIX will say in a future version that running "rm -f" with no argument # is OK; and we want to be able to make that assumption in our Makefile # recipes. So use an aggressive probe to check that the usage we want is # actually supported "in the wild" to an acceptable degree. # See automake bug#10828. # To make any issue more visible, cause the running configure to be aborted # by default if the 'rm' program in use doesn't match our expectations; the # user can still override this though. if rm -f && rm -fr && rm -rf; then : OK; else cat >&2 <<'END' Oops! Your 'rm' program seems unable to run without file operands specified on the command line, even when the '-f' option is present. This is contrary to the behaviour of most rm programs out there, and not conforming with the upcoming POSIX standard: Please tell bug-automake@gnu.org about your system, including the value of your $PATH and any error possibly output before this message. This can help us improve future automake versions. END if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then echo 'Configuration will proceed anyway, since you have set the' >&2 echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 echo >&2 else cat >&2 <<'END' Aborting the configuration process, to ensure you take notice of the issue. You can download and install GNU coreutils to get an 'rm' implementation that behaves properly: . If you want to complete the configuration process using your problematic 'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM to "yes", and re-run configure. END as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5 fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 $as_echo_n "checking whether the C compiler works... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi if test -z "$ac_file"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C compiler cannot create executables See \`config.log' for more details" "$LINENO" 5; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 $as_echo_n "checking for C compiler default output file name... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5; } fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if ${ac_cv_objext+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5 $as_echo_n "checking whether $CC understands -c and -o together... " >&6; } if ${am_cv_prog_cc_c_o+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF # Make sure it works both with $CC and with simple cc. # Following AC_PROG_CC_C_O, we do the test twice because some # compilers refuse to overwrite an existing .o file with -o, # though they will create one. am_cv_prog_cc_c_o=yes for am_i in 1 2; do if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5 ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } \ && test -f conftest2.$ac_objext; then : OK else am_cv_prog_cc_c_o=no break fi done rm -f core conftest* unset am_i fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 $as_echo "$am_cv_prog_cc_c_o" >&6; } if test "$am_cv_prog_cc_c_o" != yes; then # Losing compiler, so override with the script. # FIXME: It is wrong to rewrite CC. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__CC in this case, # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" CC="$am_aux_dir/compile $CC" fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu DEPDIR="${am__leading_dot}deps" ac_config_commands="$ac_config_commands depfiles" am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5 $as_echo_n "checking for style of include used by $am_make... " >&6; } am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from 'make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5 $as_echo "$_am_result" >&6; } rm -f confinc confmf # Check whether --enable-dependency-tracking was given. if test "${enable_dependency_tracking+set}" = set; then : enableval=$enable_dependency_tracking; fi if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi if test "x$enable_dependency_tracking" != xno; then AMDEP_TRUE= AMDEP_FALSE='#' else AMDEP_TRUE='#' AMDEP_FALSE= fi depcc="$CC" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CC_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CC_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CC_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CC_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 $as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then am__fastdepCC_TRUE= am__fastdepCC_FALSE='#' else am__fastdepCC_TRUE='#' am__fastdepCC_FALSE= fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test -z "$CXX"; then if test -n "$CCC"; then CXX=$CCC else if test -n "$ac_tool_prefix"; then for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CXX"; then ac_cv_prog_CXX="$CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CXX=$ac_cv_prog_CXX if test -n "$CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 $as_echo "$CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CXX" && break done fi if test -z "$CXX"; then ac_ct_CXX=$CXX for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CXX"; then ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CXX="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CXX=$ac_cv_prog_ac_ct_CXX if test -n "$ac_ct_CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 $as_echo "$ac_ct_CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CXX" && break done if test "x$ac_ct_CXX" = x; then CXX="g++" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CXX=$ac_ct_CXX fi fi fi fi # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 $as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } if ${ac_cv_cxx_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_cxx_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 $as_echo "$ac_cv_cxx_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GXX=yes else GXX= fi ac_test_CXXFLAGS=${CXXFLAGS+set} ac_save_CXXFLAGS=$CXXFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 $as_echo_n "checking whether $CXX accepts -g... " >&6; } if ${ac_cv_prog_cxx_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_cxx_werror_flag=$ac_cxx_werror_flag ac_cxx_werror_flag=yes ac_cv_prog_cxx_g=no CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes else CXXFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : else ac_cxx_werror_flag=$ac_save_cxx_werror_flag CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cxx_werror_flag=$ac_save_cxx_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 $as_echo "$ac_cv_prog_cxx_g" >&6; } if test "$ac_test_CXXFLAGS" = set; then CXXFLAGS=$ac_save_CXXFLAGS elif test $ac_cv_prog_cxx_g = yes; then if test "$GXX" = yes; then CXXFLAGS="-g -O2" else CXXFLAGS="-g" fi else if test "$GXX" = yes; then CXXFLAGS="-O2" else CXXFLAGS= fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu depcc="$CXX" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CXX_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CXX_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CXX_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CXX_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5 $as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; } CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then am__fastdepCXX_TRUE= am__fastdepCXX_FALSE='#' else am__fastdepCXX_TRUE='#' am__fastdepCXX_FALSE= fi # Needed for subdir-objects in AUTOMAKE_OPTIONS { $as_echo "$as_me:${as_lineno-$LINENO}: checking maximum warning verbosity option" >&5 $as_echo_n "checking maximum warning verbosity option... " >&6; } # Check whether --with-maximum-compile-warnings was given. if test "${with_maximum_compile_warnings+set}" = set; then : withval=$with_maximum_compile_warnings; ac_compile_warnings_on="$withval" else ac_compile_warnings_on="" fi if test x"$ac_compile_warnings_on" = xno then ac_compile_warnings_msg=no else if test -n "$CXX" then if test "$GXX" = "yes" then ac_compile_warnings_opt='-Wall -W -ansi -pedantic' fi CXXFLAGS="$CXXFLAGS $ac_compile_warnings_opt" ac_compile_warnings_msg="$ac_compile_warnings_opt for C++" fi if test -n "$CC" then if test "$GCC" = "yes" then ac_compile_warnings_opt='-Wall -W -ansi -pedantic' fi CFLAGS="$CFLAGS $ac_compile_warnings_opt" ac_compile_warnings_msg="$ac_compile_warnings_msg $ac_compile_warnings_opt for C" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_compile_warnings_msg" >&5 $as_echo "$ac_compile_warnings_msg" >&6; } unset ac_compile_warnings_msg unset ac_compile_warnings_opt # Increase warning levels cat >>confdefs.h <<_ACEOF #define SWIG_CXX "$CXX" _ACEOF cat >>confdefs.h <<_ACEOF #define SWIG_PLATFORM "$host" _ACEOF ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 $as_echo_n "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if ${ac_cv_prog_CPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 $as_echo "$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } if ${ac_cv_path_GREP+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_GREP" || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } if ${ac_cv_path_EGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_EGREP" || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi # Check whether --with-popen was given. if test "${with_popen+set}" = set; then : withval=$with_popen; with_popen="$withval" fi if test x"${with_popen}" = xno ; then { $as_echo "$as_me:${as_lineno-$LINENO}: Disabling popen" >&5 $as_echo "$as_me: Disabling popen" >&6;} else ac_fn_c_check_func "$LINENO" "popen" "ac_cv_func_popen" if test "x$ac_cv_func_popen" = xyes; then : $as_echo "#define HAVE_POPEN 1" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: Disabling popen" >&5 $as_echo "$as_me: Disabling popen" >&6;} fi fi # Check whether --with-pcre was given. if test "${with_pcre+set}" = set; then : withval=$with_pcre; else with_pcre=yes fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable PCRE support" >&5 $as_echo_n "checking whether to enable PCRE support... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_pcre" >&5 $as_echo "$with_pcre" >&6; } if test x"${with_pcre}" = xyes ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to use local PCRE" >&5 $as_echo_n "checking whether to use local PCRE... " >&6; } local_pcre_config=no if test -z $PCRE_CONFIG; then if test -f `pwd`/pcre/pcre-swig-install/bin/pcre-config; then PCRE_CONFIG=`pwd`/pcre/pcre-swig-install/bin/pcre-config local_pcre_config=$PCRE_CONFIG fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $local_pcre_config" >&5 $as_echo "$local_pcre_config" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 $as_echo_n "checking for a sed that does not truncate output... " >&6; } if ${ac_cv_path_SED+:} false; then : $as_echo_n "(cached) " >&6 else ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ for ac_i in 1 2 3 4 5 6 7; do ac_script="$ac_script$as_nl$ac_script" done echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed { ac_script=; unset ac_script;} if test -z "$SED"; then ac_path_SED_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in sed gsed; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_SED="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_SED" || continue # Check for GNU ac_path_SED and select it if it is found. # Check for GNU $ac_path_SED case `"$ac_path_SED" --version 2>&1` in *GNU*) ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo '' >> "conftest.nl" "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_SED_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_SED="$ac_path_SED" ac_path_SED_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_SED_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_SED"; then as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5 fi else ac_cv_path_SED=$SED fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 $as_echo "$ac_cv_path_SED" >&6; } SED="$ac_cv_path_SED" rm -f conftest.sed if test "x$with_pcre" != xno; then : # Check whether --with-pcre-prefix was given. if test "${with_pcre_prefix+set}" = set; then : withval=$with_pcre_prefix; pcre_config_prefix="$withval" else pcre_config_prefix="" fi # Check whether --with-pcre-exec-prefix was given. if test "${with_pcre_exec_prefix+set}" = set; then : withval=$with_pcre_exec_prefix; pcre_config_exec_prefix="$withval" else pcre_config_exec_prefix="" fi if test x"$PCRE_CFLAGS" != x -o x"$PCRE_LIBS" != x; then : : $as_echo "#define HAVE_PCRE 1" >>confdefs.h LIBS="$LIBS $PCRE_LIBS" CPPFLAGS="$CPPFLAGS $PCRE_CFLAGS" else if test x$pcre_config_exec_prefix != x; then : pcre_config_args="$pcre_config_args --exec-prefix=$pcre_config_exec_prefix" if test x${PCRE_CONFIG+set} != xset; then : PCRE_CONFIG=$pcre_config_exec_prefix/bin/pcre-config fi fi if test x$pcre_config_prefix != x; then : pcre_config_args="$pcre_config_args --prefix=$pcre_config_prefix" if test x${PCRE_CONFIG+set} != xset; then : PCRE_CONFIG=$pcre_config_prefix/bin/pcre-config fi fi for ac_prog in pcre-config do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_PCRE_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $PCRE_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_PCRE_CONFIG="$PCRE_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_PCRE_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi PCRE_CONFIG=$ac_cv_path_PCRE_CONFIG if test -n "$PCRE_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PCRE_CONFIG" >&5 $as_echo "$PCRE_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$PCRE_CONFIG" && break done test -n "$PCRE_CONFIG" || PCRE_CONFIG="no" if test "$PCRE_CONFIG" = "no"; then : : { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? " Cannot find pcre-config script from PCRE (Perl Compatible Regular Expressions) library package. This dependency is needed for configure to complete, Either: - Install the PCRE developer package on your system (preferred approach). - Download the PCRE source tarball, build and install on your system as you would for any package built from source distribution. - Use the Tools/pcre-build.sh script to build PCRE just for SWIG to statically link against. Run 'Tools/pcre-build.sh --help' for instructions. (quite easy and does not require privileges to install PCRE on your system) - Use configure --without-pcre to disable regular expressions support in SWIG (not recommended). See \`config.log' for more details" "$LINENO" 5; } else if test x"" = x; then : PCRE_CFLAGS="`$PCRE_CONFIG $pcre_config_args --cflags`" else PCRE_CFLAGS="`$PCRE_CONFIG $pcre_config_args `" fi if test x"" = x; then : PCRE_LIBS="`$PCRE_CONFIG $pcre_config_args --libs`" else PCRE_LIBS="`$PCRE_CONFIG $pcre_config_args `" fi if test x"" != x; then : if test x" " != x; then : pcre_version="`$PCRE_CONFIG $pcre_config_args --version | $SED -e `" else pcre_version="`$PCRE_CONFIG $pcre_config_args --version | $SED -e 's/^\ *\(.*\)\ *$/\1/'`" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pcre ($pcre_version) >= " >&5 $as_echo_n "checking for pcre ($pcre_version) >= ... " >&6; } # Used to indicate true or false condition ax_compare_version=false # Convert the two version strings to be compared into a format that # allows a simple string comparison. The end result is that a version # string of the form 1.12.5-r617 will be converted to the form # 0001001200050617. In other words, each number is zero padded to four # digits, and non digits are removed. ax_compare_version_A=`echo "$pcre_version" | sed -e 's/\([0-9]*\)/Z\1Z/g' \ -e 's/Z\([0-9]\)Z/Z0\1Z/g' \ -e 's/Z\([0-9][0-9]\)Z/Z0\1Z/g' \ -e 's/Z\([0-9][0-9][0-9]\)Z/Z0\1Z/g' \ -e 's/[^0-9]//g'` ax_compare_version_B=`echo "" | sed -e 's/\([0-9]*\)/Z\1Z/g' \ -e 's/Z\([0-9]\)Z/Z0\1Z/g' \ -e 's/Z\([0-9][0-9]\)Z/Z0\1Z/g' \ -e 's/Z\([0-9][0-9][0-9]\)Z/Z0\1Z/g' \ -e 's/[^0-9]//g'` ax_compare_version=`echo "x$ax_compare_version_A x$ax_compare_version_B" | sed 's/^ *//' | sort -r | sed "s/x${ax_compare_version_A}/true/;s/x${ax_compare_version_B}/false/;1q"` if test "$ax_compare_version" = "true" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } : $as_echo "#define HAVE_PCRE 1" >>confdefs.h LIBS="$LIBS $PCRE_LIBS" CPPFLAGS="$CPPFLAGS $PCRE_CFLAGS" else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? " Cannot find pcre-config script from PCRE (Perl Compatible Regular Expressions) library package. This dependency is needed for configure to complete, Either: - Install the PCRE developer package on your system (preferred approach). - Download the PCRE source tarball, build and install on your system as you would for any package built from source distribution. - Use the Tools/pcre-build.sh script to build PCRE just for SWIG to statically link against. Run 'Tools/pcre-build.sh --help' for instructions. (quite easy and does not require privileges to install PCRE on your system) - Use configure --without-pcre to disable regular expressions support in SWIG (not recommended). See \`config.log' for more details" "$LINENO" 5; } fi else : $as_echo "#define HAVE_PCRE 1" >>confdefs.h LIBS="$LIBS $PCRE_LIBS" CPPFLAGS="$CPPFLAGS $PCRE_CFLAGS" fi fi fi fi # Check whether --enable-ccache was given. if test "${enable_ccache+set}" = set; then : enableval=$enable_ccache; enable_ccache=$enableval else enable_ccache=yes fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable ccache-swig" >&5 $as_echo_n "checking whether to enable ccache-swig... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_ccache" >&5 $as_echo "$enable_ccache" >&6; } if test "$enable_ccache" = yes; then subdirs="$subdirs CCache" ENABLE_CCACHE=1 fi echo "" echo "Checking packages required for SWIG developers." echo "Note : None of the following packages are required for users to compile and install SWIG from the distributed tarball" echo "" for ac_prog in 'bison -y' byacc do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_YACC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$YACC"; then ac_cv_prog_YACC="$YACC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_YACC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi YACC=$ac_cv_prog_YACC if test -n "$YACC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $YACC" >&5 $as_echo "$YACC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$YACC" && break done test -n "$YACC" || YACC="yacc" echo "" echo "Checking for installed target languages and other information in order to compile and run" echo "the examples and test-suite invoked by 'make check'." echo "Note : None of the following packages are required for users to compile and install SWIG from the distributed tarball" echo "" # Check whether --with-boost was given. if test "${with_boost+set}" = set; then : withval=$with_boost; case $withval in #( no) : want_boost="no";_AX_BOOST_BASE_boost_path="" ;; #( yes) : want_boost="yes";_AX_BOOST_BASE_boost_path="" ;; #( *) : want_boost="yes";_AX_BOOST_BASE_boost_path="$withval" ;; esac else want_boost="yes" fi # Check whether --with-boost-libdir was given. if test "${with_boost_libdir+set}" = set; then : withval=$with_boost_libdir; if test -d "$withval"; then : _AX_BOOST_BASE_boost_lib_path="$withval" else as_fn_error $? "--with-boost-libdir expected directory name" "$LINENO" 5 fi else _AX_BOOST_BASE_boost_lib_path="" fi BOOST_LDFLAGS="" BOOST_CPPFLAGS="" if test "x$want_boost" = "xyes"; then : if test "x" = "x"; then : _AX_BOOST_BASE_TONUMERICVERSION_req="1.20.0" else _AX_BOOST_BASE_TONUMERICVERSION_req="" fi _AX_BOOST_BASE_TONUMERICVERSION_req_shorten=`expr $_AX_BOOST_BASE_TONUMERICVERSION_req : '\([0-9]*\.[0-9]*\)'` _AX_BOOST_BASE_TONUMERICVERSION_req_major=`expr $_AX_BOOST_BASE_TONUMERICVERSION_req : '\([0-9]*\)'` if test "x$_AX_BOOST_BASE_TONUMERICVERSION_req_major" = "x"; then : as_fn_error $? "You should at least specify libboost major version" "$LINENO" 5 fi _AX_BOOST_BASE_TONUMERICVERSION_req_minor=`expr $_AX_BOOST_BASE_TONUMERICVERSION_req : '[0-9]*\.\([0-9]*\)'` if test "x$_AX_BOOST_BASE_TONUMERICVERSION_req_minor" = "x"; then : _AX_BOOST_BASE_TONUMERICVERSION_req_minor="0" fi _AX_BOOST_BASE_TONUMERICVERSION_req_sub_minor=`expr $_AX_BOOST_BASE_TONUMERICVERSION_req : '[0-9]*\.[0-9]*\.\([0-9]*\)'` if test "X$_AX_BOOST_BASE_TONUMERICVERSION_req_sub_minor" = "X"; then : _AX_BOOST_BASE_TONUMERICVERSION_req_sub_minor="0" fi _AX_BOOST_BASE_TONUMERICVERSION_RET=`expr $_AX_BOOST_BASE_TONUMERICVERSION_req_major \* 100000 \+ $_AX_BOOST_BASE_TONUMERICVERSION_req_minor \* 100 \+ $_AX_BOOST_BASE_TONUMERICVERSION_req_sub_minor` WANT_BOOST_VERSION=$_AX_BOOST_BASE_TONUMERICVERSION_RET succeeded=no case ${host_cpu} in #( x86_64) : libsubdirs="lib64 libx32 lib lib64" ;; #( ppc64|powerpc64|s390x|sparc64|aarch64|ppc64le|powerpc64le|riscv64) : libsubdirs="lib64 lib lib64" ;; #( *) : libsubdirs="lib" ;; esac case ${host_cpu} in #( i?86) : multiarch_libsubdir="lib/i386-${host_os}" ;; #( *) : multiarch_libsubdir="lib/${host_cpu}-${host_os}" ;; esac if test "x$_AX_BOOST_BASE_boost_path" != "x"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for boostlib >= ($WANT_BOOST_VERSION) includes in \"$_AX_BOOST_BASE_boost_path/include\"" >&5 $as_echo_n "checking for boostlib >= ($WANT_BOOST_VERSION) includes in \"$_AX_BOOST_BASE_boost_path/include\"... " >&6; } if test -d "$_AX_BOOST_BASE_boost_path/include" && test -r "$_AX_BOOST_BASE_boost_path/include"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } BOOST_CPPFLAGS="-I$_AX_BOOST_BASE_boost_path/include" for _AX_BOOST_BASE_boost_path_tmp in $multiarch_libsubdir $libsubdirs; do { $as_echo "$as_me:${as_lineno-$LINENO}: checking for boostlib >= ($WANT_BOOST_VERSION) lib path in \"$_AX_BOOST_BASE_boost_path/$_AX_BOOST_BASE_boost_path_tmp\"" >&5 $as_echo_n "checking for boostlib >= ($WANT_BOOST_VERSION) lib path in \"$_AX_BOOST_BASE_boost_path/$_AX_BOOST_BASE_boost_path_tmp\"... " >&6; } if test -d "$_AX_BOOST_BASE_boost_path/$_AX_BOOST_BASE_boost_path_tmp" && test -r "$_AX_BOOST_BASE_boost_path/$_AX_BOOST_BASE_boost_path_tmp" ; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } BOOST_LDFLAGS="-L$_AX_BOOST_BASE_boost_path/$_AX_BOOST_BASE_boost_path_tmp"; break; else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi done else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi else if test X"$cross_compiling" = Xyes; then search_libsubdirs=$multiarch_libsubdir else search_libsubdirs="$multiarch_libsubdir $libsubdirs" fi for _AX_BOOST_BASE_boost_path_tmp in /usr /usr/local /opt /opt/local ; do if test -d "$_AX_BOOST_BASE_boost_path_tmp/include/boost" && test -r "$_AX_BOOST_BASE_boost_path_tmp/include/boost" ; then for libsubdir in $search_libsubdirs ; do if ls "$_AX_BOOST_BASE_boost_path_tmp/$libsubdir/libboost_"* >/dev/null 2>&1 ; then break; fi done BOOST_LDFLAGS="-L$_AX_BOOST_BASE_boost_path_tmp/$libsubdir" BOOST_CPPFLAGS="-I$_AX_BOOST_BASE_boost_path_tmp/include" break; fi done fi if test "x$_AX_BOOST_BASE_boost_lib_path" != "x"; then : BOOST_LDFLAGS="-L$_AX_BOOST_BASE_boost_lib_path" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for boostlib >= ($WANT_BOOST_VERSION)" >&5 $as_echo_n "checking for boostlib >= ($WANT_BOOST_VERSION)... " >&6; } CPPFLAGS_SAVED="$CPPFLAGS" CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS" export CPPFLAGS LDFLAGS_SAVED="$LDFLAGS" LDFLAGS="$LDFLAGS $BOOST_LDFLAGS" export LDFLAGS ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { (void) ((void)sizeof(char[1 - 2*!!((BOOST_VERSION) < ($WANT_BOOST_VERSION))])); ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } succeeded=yes found_system=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test "x$succeeded" != "xyes" ; then CPPFLAGS="$CPPFLAGS_SAVED" LDFLAGS="$LDFLAGS_SAVED" BOOST_CPPFLAGS= if test -z "$_AX_BOOST_BASE_boost_lib_path" ; then BOOST_LDFLAGS= fi _version=0 if test -n "$_AX_BOOST_BASE_boost_path" ; then if test -d "$_AX_BOOST_BASE_boost_path" && test -r "$_AX_BOOST_BASE_boost_path"; then for i in `ls -d $_AX_BOOST_BASE_boost_path/include/boost-* 2>/dev/null`; do _version_tmp=`echo $i | sed "s#$_AX_BOOST_BASE_boost_path##" | sed 's/\/include\/boost-//' | sed 's/_/./'` V_CHECK=`expr $_version_tmp \> $_version` if test "x$V_CHECK" = "x1" ; then _version=$_version_tmp fi VERSION_UNDERSCORE=`echo $_version | sed 's/\./_/'` BOOST_CPPFLAGS="-I$_AX_BOOST_BASE_boost_path/include/boost-$VERSION_UNDERSCORE" done if test -z "$BOOST_CPPFLAGS"; then if test -d "$_AX_BOOST_BASE_boost_path/boost" && test -r "$_AX_BOOST_BASE_boost_path/boost"; then BOOST_CPPFLAGS="-I$_AX_BOOST_BASE_boost_path" fi fi if test -n "$BOOST_CPPFLAGS" && test -z "$BOOST_LDFLAGS"; then for libsubdir in $libsubdirs ; do if ls "$_AX_BOOST_BASE_boost_path/$libsubdir/libboost_"* >/dev/null 2>&1 ; then break; fi done BOOST_LDFLAGS="-L$_AX_BOOST_BASE_boost_path/$libsubdir" fi fi else if test "x$cross_compiling" != "xyes" ; then for _AX_BOOST_BASE_boost_path in /usr /usr/local /opt /opt/local ; do if test -d "$_AX_BOOST_BASE_boost_path" && test -r "$_AX_BOOST_BASE_boost_path" ; then for i in `ls -d $_AX_BOOST_BASE_boost_path/include/boost-* 2>/dev/null`; do _version_tmp=`echo $i | sed "s#$_AX_BOOST_BASE_boost_path##" | sed 's/\/include\/boost-//' | sed 's/_/./'` V_CHECK=`expr $_version_tmp \> $_version` if test "x$V_CHECK" = "x1" ; then _version=$_version_tmp best_path=$_AX_BOOST_BASE_boost_path fi done fi done VERSION_UNDERSCORE=`echo $_version | sed 's/\./_/'` BOOST_CPPFLAGS="-I$best_path/include/boost-$VERSION_UNDERSCORE" if test -z "$_AX_BOOST_BASE_boost_lib_path" ; then for libsubdir in $libsubdirs ; do if ls "$best_path/$libsubdir/libboost_"* >/dev/null 2>&1 ; then break; fi done BOOST_LDFLAGS="-L$best_path/$libsubdir" fi fi if test -n "$BOOST_ROOT" ; then for libsubdir in $libsubdirs ; do if ls "$BOOST_ROOT/stage/$libsubdir/libboost_"* >/dev/null 2>&1 ; then break; fi done if test -d "$BOOST_ROOT" && test -r "$BOOST_ROOT" && test -d "$BOOST_ROOT/stage/$libsubdir" && test -r "$BOOST_ROOT/stage/$libsubdir"; then version_dir=`expr //$BOOST_ROOT : '.*/\(.*\)'` stage_version=`echo $version_dir | sed 's/boost_//' | sed 's/_/./g'` stage_version_shorten=`expr $stage_version : '\([0-9]*\.[0-9]*\)'` V_CHECK=`expr $stage_version_shorten \>\= $_version` if test "x$V_CHECK" = "x1" && test -z "$_AX_BOOST_BASE_boost_lib_path" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: We will use a staged boost library from $BOOST_ROOT" >&5 $as_echo "$as_me: We will use a staged boost library from $BOOST_ROOT" >&6;} BOOST_CPPFLAGS="-I$BOOST_ROOT" BOOST_LDFLAGS="-L$BOOST_ROOT/stage/$libsubdir" fi fi fi fi CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS" export CPPFLAGS LDFLAGS="$LDFLAGS $BOOST_LDFLAGS" export LDFLAGS ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { (void) ((void)sizeof(char[1 - 2*!!((BOOST_VERSION) < ($WANT_BOOST_VERSION))])); ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } succeeded=yes found_system=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu fi if test "x$succeeded" != "xyes" ; then if test "x$_version" = "x0" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: We could not detect the boost libraries (version or higher). If you have a staged boost library (still not installed) please specify \$BOOST_ROOT in your environment and do not give a PATH to --with-boost option. If you are sure you have boost installed, then check your version number looking in . See http://randspringer.de/boost for more documentation." >&5 $as_echo "$as_me: We could not detect the boost libraries (version or higher). If you have a staged boost library (still not installed) please specify \$BOOST_ROOT in your environment and do not give a PATH to --with-boost option. If you are sure you have boost installed, then check your version number looking in . See http://randspringer.de/boost for more documentation." >&6;} else { $as_echo "$as_me:${as_lineno-$LINENO}: Your boost libraries seems to old (version $_version)." >&5 $as_echo "$as_me: Your boost libraries seems to old (version $_version)." >&6;} fi # execute ACTION-IF-NOT-FOUND (if present): : else $as_echo "#define HAVE_BOOST /**/" >>confdefs.h # execute ACTION-IF-FOUND (if present): : fi CPPFLAGS="$CPPFLAGS_SAVED" LDFLAGS="$LDFLAGS_SAVED" fi # -I should not be used on system directories (GCC) if test "$GCC" = yes; then ISYSTEM="-isystem " else ISYSTEM="-I" fi { $as_echo "$as_me:${as_lineno-$LINENO}: ISYSTEM: $ISYSTEM" >&5 $as_echo "$as_me: ISYSTEM: $ISYSTEM" >&6;} # SO is the extension of shared libraries (including the dot!) { $as_echo "$as_me:${as_lineno-$LINENO}: checking SO" >&5 $as_echo_n "checking SO... " >&6; } if test -z "$SO" then case $host in *-*-hp*) SO=.sl;; *-*-darwin*) SO=.bundle;; *-*-cygwin* | *-*-mingw*) SO=.dll;; *) SO=.so;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $SO" >&5 $as_echo "$SO" >&6; } # LDSHARED is the ld *command* used to create shared library # -- "ld" on SunOS 4.x.x, "ld -G" on SunOS 5.x, "ld -shared" on IRIX 5 # (Shared libraries in this instance are shared modules to be loaded into # Python, as opposed to building Python itself as a shared library.) { $as_echo "$as_me:${as_lineno-$LINENO}: checking LDSHARED" >&5 $as_echo_n "checking LDSHARED... " >&6; } if test -z "$LDSHARED" then case $host in *-*-aix*) LDSHARED="\$(srcdir)/ld_so_aix \$(CC)";; *-*-cygwin* | *-*-mingw*) if test "$GCC" = yes; then LDSHARED="$CC -shared" else if test "cl" = $CC ; then # Microsoft Visual C++ (MSVC) LDSHARED="$CC -nologo -LD" else # Unknown compiler try gcc approach LDSHARED="$CC -shared" fi fi ;; *-*-irix5*) LDSHARED="ld -shared";; *-*-irix6*) LDSHARED="ld ${SGI_ABI} -shared -all";; *-*-sunos4*) LDSHARED="ld";; *-*-solaris*) LDSHARED="ld -G";; *-*-hp*) LDSHARED="ld -b";; *-*-osf*) LDSHARED="ld -shared -expect_unresolved \"*\"";; *-sequent-sysv4) LDSHARED="ld -G";; *-*-next*) if test "$ns_dyld" then LDSHARED='$(CC) $(LDFLAGS) -bundle -prebind' else LDSHARED='$(CC) $(CFLAGS) -nostdlib -r' fi if test "$with_next_framework" ; then LDSHARED="$LDSHARED \$(LDLIBRARY)" fi ;; *-*-linux*) LDSHARED="$CC -shared";; *-*-dgux*) LDSHARED="ld -G";; *-*-freebsd3*) LDSHARED="$CC -shared";; *-*-freebsd* | *-*-openbsd*) LDSHARED="ld -Bshareable";; *-*-netbsd*) if [ "`$CC -dM -E - &5 $as_echo "$LDSHARED" >&6; } # CXXSHARED is the ld *command* used to create C++ shared library # -- "ld" on SunOS 4.x.x, "ld -G" on SunOS 5.x, "ld -shared" on IRIX 5 # (Shared libraries in this instance are shared modules to be loaded into # Python, as opposed to building Python itself as a shared library.) { $as_echo "$as_me:${as_lineno-$LINENO}: checking CXXSHARED" >&5 $as_echo_n "checking CXXSHARED... " >&6; } if test -z "$CXXSHARED" then CXXSHARED="$LDSHARED" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXXSHARED" >&5 $as_echo "$CXXSHARED" >&6; } # { $as_echo "$as_me:${as_lineno-$LINENO}: checking TRYLINKINGWITHCXX" >&5 $as_echo_n "checking TRYLINKINGWITHCXX... " >&6; } if test -z "$TRYLINKINGWITHCXX" then case $host in *-*-solaris*) if test "$GCC" = yes then TRYLINKINGWITHCXX="CXXSHARED= $CXX -Wl,-G" else TRYLINKINGWITHCXX="CXXSHARED= $CXX -G -L/opt/SUNWspro/lib -lCrun -lCstd" fi;; *-*-hp*) TRYLINKINGWITHCXX="CXXSHARED= $CXX +z ";; *-*-darwin*) TRYLINKINGWITHCXX="CXXSHARED= $CXX -bundle -undefined suppress -flat_namespace";; *-*-cygwin* | *-*-mingw*) if test "$GCC" = yes; then TRYLINKINGWITHCXX="CXXSHARED= $CXX -shared " else if test "cl" = $CXX ; then # Microsoft Visual C++ (MSVC) TRYLINKINGWITHCXX="CXXSHARED= $CXX -nologo -LD" else TRYLINKINGWITHCXX="#unknown Windows compiler" fi fi ;; *) TRYLINKINGWITHCXX="CXXSHARED= $CXX -shared ";; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $TRYLINKINGWITHCXX" >&5 $as_echo "$TRYLINKINGWITHCXX" >&6; } # CCSHARED are the C *flags* used to create objects to go into a shared # library (module) -- this is only needed for a few systems { $as_echo "$as_me:${as_lineno-$LINENO}: checking CCSHARED" >&5 $as_echo_n "checking CCSHARED... " >&6; } if test -z "$CCSHARED" then case $host in *-*-hp*) if test "$GCC" = yes then CCSHARED="-fpic" else CCSHARED="+z" fi;; s390x*-*-*) CCSHARED="-fpic" ;; s390*-*-*) CCSHARED="-fPIC" ;; *-*-linux*) CCSHARED="-fpic";; *-*-freebsd* | *-*-openbsd*) CCSHARED="-fpic";; *-*-netbsd*) CCSHARED="-fPIC";; *-sco-sysv*) CCSHARED="-KPIC -dy -Bdynamic";; *-*-irix6*) case $CC in *gcc*) CCSHARED="-shared";; *) CCSHARED="";; esac;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CCSHARED" >&5 $as_echo "$CCSHARED" >&6; } # RPATH is the path used to look for shared library files. { $as_echo "$as_me:${as_lineno-$LINENO}: checking RPATH" >&5 $as_echo_n "checking RPATH... " >&6; } if test -z "$RPATH" then case $host in *-*-solaris*) RPATH='-R. -R$(exec_prefix)/lib';; *-*-irix*) RPATH='-rpath .:$(exec_prefix)/lib';; *-*-linux*) RPATH='-Xlinker -rpath $(exec_prefix)/lib -Xlinker -rpath .';; *) RPATH='';; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RPATH" >&5 $as_echo "$RPATH" >&6; } # LINKFORSHARED are the flags passed to the $(CC) command that links # a few executables -- this is only needed for a few systems { $as_echo "$as_me:${as_lineno-$LINENO}: checking LINKFORSHARED" >&5 $as_echo_n "checking LINKFORSHARED... " >&6; } if test -z "$LINKFORSHARED" then case $host in *-*-aix*) LINKFORSHARED='-Wl,-bE:$(srcdir)/python.exp -lld';; *-*-hp*) LINKFORSHARED="-Wl,-E -Wl,+s -Wl,+b\$(BINLIBDEST)/lib-dynload";; *-*-linux*) LINKFORSHARED="-Xlinker -export-dynamic";; *-*-next*) LINKFORSHARED="-u libsys_s";; *-sco-sysv*) LINKFORSHARED="-Bdynamic -dy -Wl,-Bexport";; *-*-irix6*) LINKFORSHARED="-all";; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LINKFORSHARED" >&5 $as_echo "$LINKFORSHARED" >&6; } # Optional CFLAGS used to silence/enhance compiler warnings on some platforms. { $as_echo "$as_me:${as_lineno-$LINENO}: checking PLATCFLAGS" >&5 $as_echo_n "checking PLATCFLAGS... " >&6; } case $host in *-*-solaris*) if test "$GCC" = yes then PLATCFLAGS= else PLATCFLAGS= # else PLATCFLAGS="-errtags=yes" # Need more work as C examples use ld for linking fi;; *) PLATCFLAGS= esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PLATCFLAGS" >&5 $as_echo "$PLATCFLAGS" >&6; } # Add switch if necessary to enable C++11 support - just for tests # Check whether --enable-cpp11-testing was given. if test "${enable_cpp11_testing+set}" = set; then : enableval=$enable_cpp11_testing; enable_cpp11_testing=$enableval else enable_cpp11_testing=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable C++11 testing" >&5 $as_echo_n "checking whether to enable C++11 testing... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_cpp11_testing" >&5 $as_echo "$enable_cpp11_testing" >&6; } PLATCXXFLAGS="$PLATCFLAGS" if test x"$enable_cpp11_testing" = xyes; then ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu CXXFLAGS_SAVED=$CXXFLAGS CXXFLAGS= ac_success=no CXX11FLAGS= { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX supports C++11 features by default" >&5 $as_echo_n "checking whether $CXX supports C++11 features by default... " >&6; } if ${ax_cv_cxx_compile_cxx11+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ template struct check { static_assert(sizeof(int) <= sizeof(T), "not big enough"); }; typedef check> right_angle_brackets; int a; decltype(a) b; typedef check check_type; check_type c; check_type&& cr = static_cast(c); _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ax_cv_cxx_compile_cxx11=yes else ax_cv_cxx_compile_cxx11=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_cxx_compile_cxx11" >&5 $as_echo "$ax_cv_cxx_compile_cxx11" >&6; } if test x$ax_cv_cxx_compile_cxx11 = xyes; then ac_success=yes fi if test x$ac_success = xno; then for switch in -std=c++11 -std=c++0x; do cachevar=`$as_echo "ax_cv_cxx_compile_cxx11_$switch" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX supports C++11 features with $switch" >&5 $as_echo_n "checking whether $CXX supports C++11 features with $switch... " >&6; } if eval \${$cachevar+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_CXXFLAGS="$CXXFLAGS" CXXFLAGS="$CXXFLAGS $switch" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ template struct check { static_assert(sizeof(int) <= sizeof(T), "not big enough"); }; typedef check> right_angle_brackets; int a; decltype(a) b; typedef check check_type; check_type c; check_type&& cr = static_cast(c); _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : eval $cachevar=yes else eval $cachevar=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CXXFLAGS="$ac_save_CXXFLAGS" fi eval ac_res=\$$cachevar { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test x\$$cachevar = xyes; then CXXFLAGS="$CXXFLAGS $switch" CXX11FLAGS=$switch ac_success=yes break fi done fi if test x$ac_success = xno; then if test xnostop != xnostop; then as_fn_error $? "*** A compiler with support for C++11 language features is required." "$LINENO" 5 fi else HAVE_CXX11_COMPILER=yes fi CXXFLAGS=$CXXFLAGS_SAVED ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test x"$CXX11FLAGS" != x; then PLATCXXFLAGS="$CXX11FLAGS $PLATCXXFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++11 enabled compiler" >&5 $as_echo_n "checking for C++11 enabled compiler... " >&6; } if test x"$HAVE_CXX11_COMPILER" = x; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: $HAVE_CXX11_COMPILER" >&5 $as_echo "$HAVE_CXX11_COMPILER" >&6; } fi fi # On darwin 10.7,10.8,10.9 using clang++, need to ensure using # libc++ for tests and examples to run under mono. May affect # other language targets as well - problem is a Mac OS X incompatibility # between libraries depending on libstdc++ and libc++. CLANGXX= $CXX -v 2>&1 | grep -i clang >/dev/null && CLANGXX=yes case $host in *-*-darwin11* | *-*-darwin12* |*-*-darwin13* ) if test "$CLANGXX" = "yes"; then PLATCXXFLAGS="$PLATCXXFLAGS -stdlib=libc++" fi;; *) ;; esac # Set info about shared libraries. # This variation is needed on OS-X because there is no (apparent) consistency in shared library naming. # Sometimes .bundle works, but sometimes .so is needed. It depends on the target language case $host in *-*-mingw*) PYTHON_SO=.pyd;; *-*-darwin*) PYTHON_SO=.so;; *) PYTHON_SO=$SO;; esac case $host in *-*-darwin*) TCL_SO=.dylib;; *) TCL_SO=$SO;; esac case $host in *-*-darwin*) GUILE_SO=.so;; *) GUILE_SO=$SO;; esac case $host in *-*-darwin*) PHP_SO=.so;; *) PHP_SO=$SO;; esac case $host in *) MZSCHEME_SO=.so;; esac case $host in *-*-darwin*) LUA_SO=.so;; *) LUA_SO=$SO;; esac # Check for specific libraries. Used for SWIG examples { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 $as_echo_n "checking for dlopen in -ldl... " >&6; } if ${ac_cv_lib_dl_dlopen+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dl_dlopen=yes else ac_cv_lib_dl_dlopen=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 $as_echo "$ac_cv_lib_dl_dlopen" >&6; } if test "x$ac_cv_lib_dl_dlopen" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBDL 1 _ACEOF LIBS="-ldl $LIBS" fi # Dynamic linking for SunOS/Solaris and SYSV { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 $as_echo_n "checking for shl_load in -ldld... " >&6; } if ${ac_cv_lib_dld_shl_load+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char shl_load (); int main () { return shl_load (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dld_shl_load=yes else ac_cv_lib_dld_shl_load=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 $as_echo "$ac_cv_lib_dld_shl_load" >&6; } if test "x$ac_cv_lib_dld_shl_load" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBDLD 1 _ACEOF LIBS="-ldld $LIBS" fi # Dynamic linking for HP-UX { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing t_open" >&5 $as_echo_n "checking for library containing t_open... " >&6; } if ${ac_cv_search_t_open+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char t_open (); int main () { return t_open (); ; return 0; } _ACEOF for ac_lib in '' nsl; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_t_open=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_t_open+:} false; then : break fi done if ${ac_cv_search_t_open+:} false; then : else ac_cv_search_t_open=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_t_open" >&5 $as_echo "$ac_cv_search_t_open" >&6; } ac_res=$ac_cv_search_t_open if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi # SVR4 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing gethostbyname" >&5 $as_echo_n "checking for library containing gethostbyname... " >&6; } if ${ac_cv_search_gethostbyname+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char gethostbyname (); int main () { return gethostbyname (); ; return 0; } _ACEOF for ac_lib in '' inet; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_gethostbyname=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_gethostbyname+:} false; then : break fi done if ${ac_cv_search_gethostbyname+:} false; then : else ac_cv_search_gethostbyname=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_gethostbyname" >&5 $as_echo "$ac_cv_search_gethostbyname" >&6; } ac_res=$ac_cv_search_gethostbyname if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi # Sequent { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing socket" >&5 $as_echo_n "checking for library containing socket... " >&6; } if ${ac_cv_search_socket+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char socket (); int main () { return socket (); ; return 0; } _ACEOF for ac_lib in '' socket; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_socket=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_socket+:} false; then : break fi done if ${ac_cv_search_socket+:} false; then : else ac_cv_search_socket=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_socket" >&5 $as_echo "$ac_cv_search_socket" >&6; } ac_res=$ac_cv_search_socket if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi # SVR4 sockets { $as_echo "$as_me:${as_lineno-$LINENO}: checking for swill_init in -lswill" >&5 $as_echo_n "checking for swill_init in -lswill... " >&6; } if ${ac_cv_lib_swill_swill_init+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lswill $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char swill_init (); int main () { return swill_init (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_swill_swill_init=yes else ac_cv_lib_swill_swill_init=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_swill_swill_init" >&5 $as_echo "$ac_cv_lib_swill_swill_init" >&6; } if test "x$ac_cv_lib_swill_swill_init" = xyes; then : SWIGLIBS="-lswill $LIBS" SWILL="-DSWIG_SWILL" fi # check for --with-libm=... LIBM=-lm # Check whether --with-libm was given. if test "${with_libm+set}" = set; then : withval=$with_libm; if test "$withval" != yes then LIBM=$withval else as_fn_error $? "proper usage is --with-libm=STRING" "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lieee" >&5 $as_echo_n "checking for main in -lieee... " >&6; } if ${ac_cv_lib_ieee_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lieee $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_ieee_main=yes else ac_cv_lib_ieee_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ieee_main" >&5 $as_echo "$ac_cv_lib_ieee_main" >&6; } if test "x$ac_cv_lib_ieee_main" = xyes; then : LIBM="-lieee $LIBM" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for crypt in -lcrypt" >&5 $as_echo_n "checking for crypt in -lcrypt... " >&6; } if ${ac_cv_lib_crypt_crypt+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lcrypt $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char crypt (); int main () { return crypt (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_crypt_crypt=yes else ac_cv_lib_crypt_crypt=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_crypt_crypt" >&5 $as_echo "$ac_cv_lib_crypt_crypt" >&6; } if test "x$ac_cv_lib_crypt_crypt" = xyes; then : LIBCRYPT="-lcrypt" fi # check for --with-libc=... # Check whether --with-libc was given. if test "${with_libc+set}" = set; then : withval=$with_libc; if test "$withval" != yes then LIBC=$withval else as_fn_error $? "proper usage is --with-libc=STRING" "$LINENO" 5 fi fi #-------------------------------------------------------------------- # Target languages #-------------------------------------------------------------------- # Check whether --with-alllang was given. if test "${with_alllang+set}" = set; then : withval=$with_alllang; with_alllang="$withval" fi if test "$with_alllang" = "no"; then alllang_default=no else alllang_default=yes fi for ac_prog in pkg-config do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_PKGCONFIG+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$PKGCONFIG"; then ac_cv_prog_PKGCONFIG="$PKGCONFIG" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_PKGCONFIG="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi PKGCONFIG=$ac_cv_prog_PKGCONFIG if test -n "$PKGCONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKGCONFIG" >&5 $as_echo "$PKGCONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$PKGCONFIG" && break done #-------------------------------------------------------------------- # Look for Tcl #-------------------------------------------------------------------- TCLINCLUDE= TCLLIB= TCLPACKAGE= # Check whether --with-tclconfig was given. if test "${with_tclconfig+set}" = set; then : withval=$with_tclconfig; with_tclconfig="$withval" else with_tclconfig= fi # Check whether --with-tcl was given. if test "${with_tcl+set}" = set; then : withval=$with_tcl; TCLPACKAGE="$withval" else TCLPACKAGE="$alllang_default" fi # Check whether --with-tclincl was given. if test "${with_tclincl+set}" = set; then : withval=$with_tclincl; TCLINCLUDE="$ISYSTEM$withval" else TCLINCLUDE= fi # Check whether --with-tcllib was given. if test "${with_tcllib+set}" = set; then : withval=$with_tcllib; TCLLIB="-L$withval" else TCLLIB= fi # First, check for "--without-tcl" or "--with-tcl=no". if test x"${TCLPACKAGE}" = xno; then { $as_echo "$as_me:${as_lineno-$LINENO}: Disabling Tcl" >&5 $as_echo "$as_me: Disabling Tcl" >&6;} else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Tcl configuration" >&5 $as_echo_n "checking for Tcl configuration... " >&6; } # First check to see if --with-tclconfig was specified. if test x"${with_tclconfig}" != x ; then if test -f "${with_tclconfig}/tclConfig.sh" ; then TCLCONFIG=`(cd ${with_tclconfig}; pwd)` else as_fn_error $? "${with_tcl} directory does not contain tclConfig.sh" "$LINENO" 5 fi fi # check in a few common install locations dirs="/usr/lib*/ /usr/lib*/tcl*/ /usr/local/lib*/ /usr/local/lib*/tcl*/" case $host in *-*-darwin*) dirs="/System/Library/Frameworks/Tcl.framework/ $dirs" ;; *) ;; esac if test x"${TCLCONFIG}" = x ; then for d in $dirs ; do for i in `ls -d -r $d 2>/dev/null` ; do if test -f $i"tclConfig.sh" ; then TCLCONFIG=`(cd $i; pwd)` break fi done done fi if test x"${TCLCONFIG}" = x ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: found $TCLCONFIG/tclConfig.sh" >&5 $as_echo "found $TCLCONFIG/tclConfig.sh" >&6; } . $TCLCONFIG/tclConfig.sh if test -z "$TCLINCLUDE"; then TCLINCLUDE=`echo $TCL_INCLUDE_SPEC | sed "s/-I/$ISYSTEM/"` fi if test -z "$TCLLIB"; then TCLLIB=$TCL_LIB_SPEC fi fi if test -z "$TCLINCLUDE"; then if test "x$TCLPACKAGE" != xyes; then TCLINCLUDE="$ISYSTEM$TCLPACKAGE/include" fi fi if test -z "$TCLLIB"; then if test "x$TCLPACKAGE" != xyes; then TCLLIB="-L$TCLPACKAGE/lib -ltcl" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Tcl header files" >&5 $as_echo_n "checking for Tcl header files... " >&6; } if test -z "$TCLINCLUDE"; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else TCLINCLUDE="" fi rm -f conftest.err conftest.i conftest.$ac_ext if test -z "$TCLINCLUDE"; then dirs="/usr/local/include /usr/include /opt/local/include" for i in $dirs ; do if test -r $i/tcl.h; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $i" >&5 $as_echo "$i" >&6; } TCLINCLUDE="$ISYSTEM$i" break fi done fi if test -z "$TCLINCLUDE"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 $as_echo "not found" >&6; } fi else { $as_echo "$as_me:${as_lineno-$LINENO}: result: $TCLINCLUDE" >&5 $as_echo "$TCLINCLUDE" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Tcl library" >&5 $as_echo_n "checking for Tcl library... " >&6; } if test -z "$TCLLIB"; then dirs="/usr/local/lib /usr/lib /opt/local/lib" for i in $dirs ; do if test -r $i/libtcl.a; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $i" >&5 $as_echo "$i" >&6; } TCLLIB="-L$i -ltcl" break fi done if test -z "$TCLLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 $as_echo "not found" >&6; } fi else { $as_echo "$as_me:${as_lineno-$LINENO}: result: $TCLLIB" >&5 $as_echo "$TCLLIB" >&6; } fi # Cygwin (Windows) needs the library for dynamic linking case $host in *-*-cygwin* | *-*-mingw*) TCLDYNAMICLINKING="$TCLLIB";; *)TCLDYNAMICLINKING="";; esac case $host in *-*-darwin*) TCLLDSHARED='$(CC) -dynamiclib -undefined suppress -flat_namespace' TCLCXXSHARED='$(CXX) -dynamiclib -undefined suppress -flat_namespace' ;; *) TCLLDSHARED='$(LDSHARED)' TCLCXXSHARED='$(CXXSHARED)' ;; esac fi #---------------------------------------------------------------- # Look for Python #---------------------------------------------------------------- PYINCLUDE= PYLIB= PYLINK= PYPACKAGE= # Check whether --with-python was given. if test "${with_python+set}" = set; then : withval=$with_python; PYBIN="$withval" else PYBIN="$alllang_default" fi # First, check for "--without-python" or "--with-python=no". if test x"${PYBIN}" = xno; then { $as_echo "$as_me:${as_lineno-$LINENO}: Disabling Python" >&5 $as_echo "$as_me: Disabling Python" >&6;} else # First figure out the name of the Python executable if test "x$PYBIN" = xyes; then for ac_prog in python python2.7 do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_PYTHON+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$PYTHON"; then ac_cv_prog_PYTHON="$PYTHON" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_PYTHON="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi PYTHON=$ac_cv_prog_PYTHON if test -n "$PYTHON"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PYTHON" >&5 $as_echo "$PYTHON" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$PYTHON" && break done else PYTHON="$PYBIN" fi PYVER=0 if test -n "$PYTHON"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $PYTHON major version number" >&5 $as_echo_n "checking for $PYTHON major version number... " >&6; } PYVER=`($PYTHON -c "import sys; sys.stdout.write(sys.version[0])") 2>/dev/null` { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PYVER" >&5 $as_echo "$PYVER" >&6; } if test -z "$PYVER"; then PYVER=0 else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Python os.name" >&5 $as_echo_n "checking for Python os.name... " >&6; } PYOSNAME=`($PYTHON -c "import sys, os; sys.stdout.write(os.name)") 2>/dev/null` { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PYOSNAME" >&5 $as_echo "$PYOSNAME" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Python path separator" >&5 $as_echo_n "checking for Python path separator... " >&6; } PYSEPARATOR=`($PYTHON -c "import sys, os; sys.stdout.write(os.sep)") 2>/dev/null` { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PYSEPARATOR" >&5 $as_echo "$PYSEPARATOR" >&6; } fi fi if test $PYVER -eq 1 -o $PYVER -eq 2; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Python prefix" >&5 $as_echo_n "checking for Python prefix... " >&6; } PYPREFIX=`($PYTHON -c "import sys; sys.stdout.write(sys.prefix)") 2>/dev/null` { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PYPREFIX" >&5 $as_echo "$PYPREFIX" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Python exec-prefix" >&5 $as_echo_n "checking for Python exec-prefix... " >&6; } PYEPREFIX=`($PYTHON -c "import sys; sys.stdout.write(sys.exec_prefix)") 2>/dev/null` { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PYEPREFIX" >&5 $as_echo "$PYEPREFIX" >&6; } if test x"$PYOSNAME" = x"nt" -a x"$PYSEPARATOR" = x"\\"; then # Windows installations are quite different to posix installations (MinGW path separator is a forward slash) PYPREFIX=`echo "$PYPREFIX" | sed -e 's,\\\\,/,g'` # Forward slashes are easier to use and even work on Windows most of the time PYTHON_SO=.pyd { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Python header files" >&5 $as_echo_n "checking for Python header files... " >&6; } if test -r $PYPREFIX/include/Python.h; then PYINCLUDE="-I$PYPREFIX/include" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PYINCLUDE" >&5 $as_echo "$PYINCLUDE" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Python library directory" >&5 $as_echo_n "checking for Python library directory... " >&6; } if test -d $PYPREFIX/libs; then PYLIB=$PYPREFIX/libs PYLINKFILE=`ls $PYLIB/python*.lib | grep "python[0-9][0-9]\.lib"` if test -r "$PYLINKFILE"; then PYLINK=-l`basename $PYLINKFILE | sed -e 's/\.lib$//'` else PYLIB= fi fi else # Note: I could not think of a standard way to get the version string from different versions. # This trick pulls it out of the file location for a standard library file. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Python version" >&5 $as_echo_n "checking for Python version... " >&6; } # Need to do this hack since autoconf replaces __file__ with the name of the configure file filehack="file__" PYVERSION=`($PYTHON -c "import sys,string,operator,os.path; sys.stdout.write(operator.getitem(os.path.split(operator.getitem(os.path.split(string.__$filehack),0)),1))") 2>/dev/null` { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PYVERSION" >&5 $as_echo "$PYVERSION" >&6; } # Find the directory for libraries this is necessary to deal with # platforms that can have apps built for multiple archs: e.g. x86_64 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Python lib dir" >&5 $as_echo_n "checking for Python lib dir... " >&6; } PYLIBDIR=`($PYTHON -c "import sys; sys.stdout.write(sys.lib)") 2>/dev/null` if test -z "$PYLIBDIR"; then # Fedora patch Python to add sys.lib, for other distros we assume "lib". PYLIBDIR="lib" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PYLIBDIR" >&5 $as_echo "$PYLIBDIR" >&6; } # Set the include directory { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Python header files" >&5 $as_echo_n "checking for Python header files... " >&6; } if test -r $PYPREFIX/include/$PYVERSION/Python.h; then PYINCLUDE="-I$PYPREFIX/include/$PYVERSION -I$PYEPREFIX/$PYLIBDIR/$PYVERSION/config" fi if test -z "$PYINCLUDE"; then if test -r $PYPREFIX/include/Py/Python.h; then PYINCLUDE="-I$PYPREFIX/include/Py -I$PYEPREFIX/$PYLIBDIR/python/lib" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PYINCLUDE" >&5 $as_echo "$PYINCLUDE" >&6; } # Set the library directory blindly. This probably won't work with older versions { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Python library directory" >&5 $as_echo_n "checking for Python library directory... " >&6; } dirs="$PYVERSION/config $PYVERSION/$PYLIBDIR python/$PYLIBDIR" for i in $dirs; do if test -d $PYEPREFIX/$PYLIBDIR/$i; then PYLIB="$PYEPREFIX/$PYLIBDIR/$i" break fi done PYLINK="-l$PYVERSION" fi if test -z "$PYLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: Not found" >&5 $as_echo "Not found" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PYLIB" >&5 $as_echo "$PYLIB" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Python library" >&5 $as_echo_n "checking for Python library... " >&6; } if test -z "$PYLINK"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: Not found" >&5 $as_echo "Not found" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PYLINK" >&5 $as_echo "$PYLINK" >&6; } fi fi # Cygwin (Windows) needs the library for dynamic linking case $host in *-*-cygwin* | *-*-mingw*) PYTHONDYNAMICLINKING="-L$PYLIB $PYLINK" DEFS="-DUSE_DL_IMPORT $DEFS" ;; *)PYTHONDYNAMICLINKING="";; esac fi #---------------------------------------------------------------- # Look for Python 3.x #---------------------------------------------------------------- PY3INCLUDE= PY3LIB= PY3LINK= PY3PACKAGE= # Check whether --with-python3 was given. if test "${with_python3+set}" = set; then : withval=$with_python3; PY3BIN="$withval" else PY3BIN="$alllang_default" fi # First, check for "--without-python3" or "--with-python3=no". if test x"${PY3BIN}" = xno; then { $as_echo "$as_me:${as_lineno-$LINENO}: Disabling Python 3.x support" >&5 $as_echo "$as_me: Disabling Python 3.x support" >&6;} else if test -z "$PYVER"; then PYVER=0 fi if test "x$PY3BIN" = xyes; then if test x"$PYOSNAME" = x"nt" -a x"$PYSEPARATOR" = x"\\" -a $PYVER -ge 3; then PYTHON3="$PYTHON" else for py_ver in 3 3.9 3.8 3.7 3.6 3.5 3.4 3.3 3.2 ""; do for ac_prog in python$py_ver do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_PYTHON3+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$PYTHON3"; then ac_cv_prog_PYTHON3="$PYTHON3" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_PYTHON3="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi PYTHON3=$ac_cv_prog_PYTHON3 if test -n "$PYTHON3"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PYTHON3" >&5 $as_echo "$PYTHON3" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$PYTHON3" && break done if test -n "$PYTHON3"; then for ac_prog in $PYTHON3-config do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_PY3CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$PY3CONFIG"; then ac_cv_prog_PY3CONFIG="$PY3CONFIG" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_PY3CONFIG="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi PY3CONFIG=$ac_cv_prog_PY3CONFIG if test -n "$PY3CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PY3CONFIG" >&5 $as_echo "$PY3CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$PY3CONFIG" && break done if test -n "$PY3CONFIG"; then break fi fi done fi else PYTHON3="$PY3BIN" for ac_prog in $PYTHON3-config do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_PY3CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$PY3CONFIG"; then ac_cv_prog_PY3CONFIG="$PY3CONFIG" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_PY3CONFIG="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi PY3CONFIG=$ac_cv_prog_PY3CONFIG if test -n "$PY3CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PY3CONFIG" >&5 $as_echo "$PY3CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$PY3CONFIG" && break done fi if test -n "$PYTHON3"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $PYTHON3 major version number" >&5 $as_echo_n "checking for $PYTHON3 major version number... " >&6; } PYVER=`($PYTHON3 -c "import sys; sys.stdout.write(sys.version[0])") 2>/dev/null` { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PYVER" >&5 $as_echo "$PYVER" >&6; } if test -z "$PYVER"; then PYVER=0 fi fi if test $PYVER -ge 3; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Python 3.x os.name" >&5 $as_echo_n "checking for Python 3.x os.name... " >&6; } PY3OSNAME=`($PYTHON3 -c "import sys, os; sys.stdout.write(os.name)") 2>/dev/null` { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PY3OSNAME" >&5 $as_echo "$PY3OSNAME" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Python 3.x path separator" >&5 $as_echo_n "checking for Python 3.x path separator... " >&6; } PYSEPARATOR=`($PYTHON3 -c "import sys, os; sys.stdout.write(os.sep)") 2>/dev/null` { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PYSEPARATOR" >&5 $as_echo "$PYSEPARATOR" >&6; } if test x"$PY3OSNAME" = x"nt" -a x"$PYSEPARATOR" = x"\\"; then # Windows installations are quite different to posix installations # There is no python-config to use { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Python 3.x prefix" >&5 $as_echo_n "checking for Python 3.x prefix... " >&6; } PY3PREFIX=`($PYTHON3 -c "import sys; sys.stdout.write(sys.prefix)") 2>/dev/null` { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PY3PREFIX" >&5 $as_echo "$PY3PREFIX" >&6; } PY3PREFIX=`echo "$PY3PREFIX" | sed -e 's,\\\\,/,g'` # Forward slashes are easier to use and even work on Windows most of the time PYTHON_SO=.pyd { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Python 3.x header files" >&5 $as_echo_n "checking for Python 3.x header files... " >&6; } if test -r $PY3PREFIX/include/Python.h; then PY3INCLUDE="-I$PY3PREFIX/include" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PY3INCLUDE" >&5 $as_echo "$PY3INCLUDE" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Python 3.x library directory" >&5 $as_echo_n "checking for Python 3.x library directory... " >&6; } if test -d $PY3PREFIX/libs; then PY3LIB=$PY3PREFIX/libs PY3LINKFILE=`ls $PY3LIB/python*.lib | grep "python[0-9][0-9]\.lib"` if test -r "$PY3LINKFILE"; then PY3LINK=-l`basename $PY3LINKFILE | sed -e 's/\.lib$//'` else PY3LIB= fi fi if test -z "$PY3LIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: Not found" >&5 $as_echo "Not found" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PY3LIB" >&5 $as_echo "$PY3LIB" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Python 3.x library" >&5 $as_echo_n "checking for Python 3.x library... " >&6; } if test -z "$PY3LINK"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: Not found" >&5 $as_echo "Not found" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PY3LINK" >&5 $as_echo "$PY3LINK" >&6; } fi elif test -n "$PY3CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Python 3.x prefix" >&5 $as_echo_n "checking for Python 3.x prefix... " >&6; } PY3PREFIX=`($PY3CONFIG --prefix) 2>/dev/null` { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PY3PREFIX" >&5 $as_echo "$PY3PREFIX" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Python 3.x exec-prefix" >&5 $as_echo_n "checking for Python 3.x exec-prefix... " >&6; } # Piped through xargs to strip trailing whitespace (bug in msys2 + mingw Python) PY3EPREFIX=`($PY3CONFIG --exec-prefix | xargs) 2>/dev/null` { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PY3EPREFIX" >&5 $as_echo "$PY3EPREFIX" >&6; } # Note: I could not think of a standard way to get the version string from different versions. # This trick pulls it out of the file location for a standard library file. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Python 3.x version" >&5 $as_echo_n "checking for Python 3.x version... " >&6; } # Need to do this hack since autoconf replaces __file__ with the name of the configure file filehack="file__" PY3VERSION=`($PYTHON3 -c "import string,operator,os.path; print(operator.getitem(os.path.split(operator.getitem(os.path.split(string.__$filehack),0)),1))") 2>/dev/null` { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PY3VERSION" >&5 $as_echo "$PY3VERSION" >&6; } # Find the directory for libraries this is necessary to deal with # platforms that can have apps built for multiple archs: e.g. x86_64 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Python 3.x lib dir" >&5 $as_echo_n "checking for Python 3.x lib dir... " >&6; } PY3LIBDIR=`($PYTHON3 -c "import sys; print(sys.lib)") 2>/dev/null` if test -z "$PY3LIBDIR"; then # some dists don't have sys.lib so the best we can do is assume lib PY3LIBDIR="lib" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PY3LIBDIR" >&5 $as_echo "$PY3LIBDIR" >&6; } # Set the include directory { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Python 3.x header files" >&5 $as_echo_n "checking for Python 3.x header files... " >&6; } PY3INCLUDE=`($PY3CONFIG --includes) 2>/dev/null` { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PY3INCLUDE" >&5 $as_echo "$PY3INCLUDE" >&6; } # Set the library directory blindly. This probably won't work with older versions { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Python 3.x library directory" >&5 $as_echo_n "checking for Python 3.x library directory... " >&6; } dirs="$PY3VERSION/config $PY3VERSION/$PY3LIBDIR python/$PY3LIBDIR" for i in $dirs; do if test -d $PY3EPREFIX/$PY3LIBDIR/$i; then PY3LIB="$PY3EPREFIX/$PY3LIBDIR/$i" break fi done if test -z "$PY3LIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: Not found" >&5 $as_echo "Not found" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PY3LIB" >&5 $as_echo "$PY3LIB" >&6; } fi PY3LINK="-l$PY3VERSION" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Python 3.x library" >&5 $as_echo_n "checking for Python 3.x library... " >&6; } if test -z "$PY3LINK"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: Not found" >&5 $as_echo "Not found" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PY3LINK" >&5 $as_echo "$PY3LINK" >&6; } fi fi fi # Cygwin (Windows) needs the library for dynamic linking case $host in *-*-cygwin* | *-*-mingw*) PYTHON3DYNAMICLINKING="-L$PY3LIB $PY3LINK" DEFS="-DUSE_DL_IMPORT $DEFS" ;; *)PYTHON3DYNAMICLINKING="";; esac fi if test -n "$PYINCLUDE" || test -n "$PY3INCLUDE" ; then for ac_prog in pycodestyle do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_PYCODESTYLE+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$PYCODESTYLE"; then ac_cv_prog_PYCODESTYLE="$PYCODESTYLE" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_PYCODESTYLE="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi PYCODESTYLE=$ac_cv_prog_PYCODESTYLE if test -n "$PYCODESTYLE"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PYCODESTYLE" >&5 $as_echo "$PYCODESTYLE" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$PYCODESTYLE" && break done if test -n "$PYCODESTYLE"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking pycodestyle version" >&5 $as_echo_n "checking pycodestyle version... " >&6; } pycodestyle_version=`$PYCODESTYLE --version 2>/dev/null` { $as_echo "$as_me:${as_lineno-$LINENO}: result: $pycodestyle_version" >&5 $as_echo "$pycodestyle_version" >&6; } fi fi # Check whether --with-2to3 was given. if test "${with_2to3+set}" = set; then : withval=$with_2to3; PY2TO3BIN="$withval" else PY2TO3BIN="yes" fi if test -n "$PYTHON3"; then if test "x$PY2TO3BIN" = xyes; then py3to2=`echo $PYTHON3 | sed -e "s/python/2to3-/"` for ac_prog in $py3to2 2to3 do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_PY2TO3+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$PY2TO3"; then ac_cv_prog_PY2TO3="$PY2TO3" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_PY2TO3="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi PY2TO3=$ac_cv_prog_PY2TO3 if test -n "$PY2TO3"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PY2TO3" >&5 $as_echo "$PY2TO3" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$PY2TO3" && break done if test -z "$PY2TO3"; then # Windows distributions don't always have the 2to3 executable { $as_echo "$as_me:${as_lineno-$LINENO}: checking for 2to3.py" >&5 $as_echo_n "checking for 2to3.py... " >&6; } py2to3script="$PY3PREFIX/Tools/scripts/2to3.py" if test -f "$py2to3script"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $py2to3script" >&5 $as_echo "$py2to3script" >&6; } PY2TO3="$PYTHON3 $py2to3script" else { $as_echo "$as_me:${as_lineno-$LINENO}: result: Not found" >&5 $as_echo "Not found" >&6; } fi fi else PY2TO3="$PY2TO3BIN" fi if test -z "$PY2TO3"; then PYTHON3= fi fi #---------------------------------------------------------------- # Look for Perl5 #---------------------------------------------------------------- PERLBIN= # Check whether --with-perl5 was given. if test "${with_perl5+set}" = set; then : withval=$with_perl5; PERLBIN="$withval" else PERLBIN="$alllang_default" fi # First, check for "--without-perl5" or "--with-perl5=no". if test x"${PERLBIN}" = xno; then { $as_echo "$as_me:${as_lineno-$LINENO}: Disabling Perl5" >&5 $as_echo "$as_me: Disabling Perl5" >&6;} PERL= else # First figure out what the name of Perl5 is if test "x$PERLBIN" = xyes; then for ac_prog in perl perl5.6.1 perl5.6.0 perl5.004 perl5.003 perl5.002 perl5.001 perl5 perl do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_PERL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$PERL"; then ac_cv_prog_PERL="$PERL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_PERL="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi PERL=$ac_cv_prog_PERL if test -n "$PERL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PERL" >&5 $as_echo "$PERL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$PERL" && break done else PERL="$PERLBIN" fi # This could probably be simplified as for all platforms and all versions of Perl the following apparently should be run to get the compilation options: # perl -MExtUtils::Embed -e ccopts { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Perl5 header files" >&5 $as_echo_n "checking for Perl5 header files... " >&6; } if test -n "$PERL"; then PERL5DIR=`($PERL -MConfig -le 'print $Config{archlibexp}') 2>/dev/null` if test -n "$PERL5DIR" ; then dirs="$PERL5DIR $PERL5DIR/CORE" PERL5EXT=none for i in $dirs; do if test -r $i/perl.h; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $i" >&5 $as_echo "$i" >&6; } PERL5EXT="$i" break fi done if test "$PERL5EXT" = none; then PERL5EXT="$PERL5DIR/CORE" { $as_echo "$as_me:${as_lineno-$LINENO}: result: could not locate perl.h...using $PERL5EXT" >&5 $as_echo "could not locate perl.h...using $PERL5EXT" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Perl5 library" >&5 $as_echo_n "checking for Perl5 library... " >&6; } PERL5LIB=`($PERL -e 'use Config; $_=$Config{libperl}; s/^lib//; s/$Config{_a}$//; s/\.$Config{so}.*//; print $_, "\n"') 2>/dev/null` if test -z "$PERL5LIB" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 $as_echo "not found" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PERL5LIB" >&5 $as_echo "$PERL5LIB" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Perl5 ccflags" >&5 $as_echo_n "checking for Perl5 ccflags... " >&6; } PERL5CCFLAGS=`($PERL -e 'use Config; print $Config{ccflags}, "\n"' | sed "s/-Wdeclaration-after-statement//" | sed "s/-I/$ISYSTEM/") 2>/dev/null` if test -z "$PERL5CCFLAGS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 $as_echo "not found" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PERL5CCFLAGS" >&5 $as_echo "$PERL5CCFLAGS" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Perl5 ccdlflags" >&5 $as_echo_n "checking for Perl5 ccdlflags... " >&6; } PERL5CCDLFLAGS=`($PERL -e 'use Config; print $Config{ccdlflags}, "\n"') 2>/dev/null` if test -z "$PERL5CCDLFLAGS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 $as_echo "not found" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PERL5CCDLFLAGS" >&5 $as_echo "$PERL5CCDLFLAGS" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Perl5 cccdlflags" >&5 $as_echo_n "checking for Perl5 cccdlflags... " >&6; } PERL5CCCDLFLAGS=`($PERL -e 'use Config; print $Config{cccdlflags}, "\n"') 2>/dev/null` if test -z "$PERL5CCCDLFLAGS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 $as_echo "not found" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PERL5CCCDLFLAGS" >&5 $as_echo "$PERL5CCCDLFLAGS" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Perl5 ldflags" >&5 $as_echo_n "checking for Perl5 ldflags... " >&6; } PERL5LDFLAGS=`($PERL -e 'use Config; print $Config{ldflags}, "\n"') 2>/dev/null` if test -z "$PERL5LDFLAGS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 $as_echo "not found" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PERL5LDFLAGS" >&5 $as_echo "$PERL5LDFLAGS" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Perl5 Test::More module" >&5 $as_echo_n "checking for Perl5 Test::More module... " >&6; } # For test-suite PERL5TESTMORE=`($PERL -e 'use Test::More; print "good";') 2>/dev/null` if test -z "$PERL5TESTMORE" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 $as_echo "not found" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: found" >&5 $as_echo "found" >&6; } fi else { $as_echo "$as_me:${as_lineno-$LINENO}: result: unable to determine perl5 configuration" >&5 $as_echo "unable to determine perl5 configuration" >&6; } PERL5EXT=$PERL5DIR fi else { $as_echo "$as_me:${as_lineno-$LINENO}: result: could not figure out how to run perl5" >&5 $as_echo "could not figure out how to run perl5" >&6; } fi # Cygwin (Windows) needs the library for dynamic linking case $host in *-*-cygwin* | *-*-mingw*) PERL5DYNAMICLINKING="-L$PERL5EXT -l$PERL5LIB";; *)PERL5DYNAMICLINKING="";; esac fi #---------------------------------------------------------------- # Look for Octave #---------------------------------------------------------------- OCTAVEBIN= OCTAVE_SO=.oct # Check whether --with-octave was given. if test "${with_octave+set}" = set; then : withval=$with_octave; OCTAVEBIN="$withval" else OCTAVEBIN="$alllang_default" fi # Check for "--without-octave" or "--with-octave=no". if test x"${OCTAVEBIN}" = xno; then { $as_echo "$as_me:${as_lineno-$LINENO}: Disabling Octave" >&5 $as_echo "$as_me: Disabling Octave" >&6;} OCTAVE= # Check for Octave; prefer command-line program "octave-cli" to (in newer versions) GUI program "octave" elif test "x$OCTAVEBIN" = xyes; then # Extract the first word of "octave-cli octave", so it can be a program name with args. set dummy octave-cli octave; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_OCTAVE+:} false; then : $as_echo_n "(cached) " >&6 else case $OCTAVE in [\\/]* | ?:[\\/]*) ac_cv_path_OCTAVE="$OCTAVE" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_OCTAVE="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi OCTAVE=$ac_cv_path_OCTAVE if test -n "$OCTAVE"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OCTAVE" >&5 $as_echo "$OCTAVE" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi else OCTAVE="$OCTAVEBIN" fi # Check if Octave works if test -n "$OCTAVE"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking if ${OCTAVE} works" >&5 $as_echo_n "checking if ${OCTAVE} works... " >&6; } if test "x`${OCTAVE} --version 2>/dev/null | sed -n -e '1p' | sed -n -e '/Octave, version/p'`" != x; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: no" >&5 $as_echo "$as_me: no" >&6;} OCTAVE= fi fi # Check for required Octave helper program "mkoctfile" if test -n "$OCTAVE"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for mkoctfile" >&5 $as_echo_n "checking for mkoctfile... " >&6; } version_suffix="`echo $OCTAVE | sed -e 's|.*\(-[0-9][0-9.]*\)$|\1|'`" case $version_suffix in -*) ;; *) version_suffix="" ;; esac octave_directory=`dirname $OCTAVE` if test "$octave_directory" = "." ; then mkoctfile="mkoctfile${version_suffix}" else mkoctfile="${octave_directory}/mkoctfile${version_suffix}" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${mkoctfile}" >&5 $as_echo "${mkoctfile}" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking if ${mkoctfile} works" >&5 $as_echo_n "checking if ${mkoctfile} works... " >&6; } if test "x`${mkoctfile} --version 2>/dev/null | sed -n -e '1p' | sed -n -e '/mkoctfile, version/p'`" != x; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } OCTAVE= fi fi # Check for Octave preprocessor/compiler/linker flags if test -n "$OCTAVE"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Octave preprocessor flags" >&5 $as_echo_n "checking for Octave preprocessor flags... " >&6; } OCTAVE_CPPFLAGS= for var in CPPFLAGS INCFLAGS ALL_CXXFLAGS; do for flag in `env - ${mkoctfile} -p ${var}`; do case ${flag} in -D*|-I*) OCTAVE_CPPFLAGS="${OCTAVE_CPPFLAGS} ${flag}";; *) ;; esac done done { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OCTAVE_CPPFLAGS" >&5 $as_echo "$OCTAVE_CPPFLAGS" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Octave compiler flags" >&5 $as_echo_n "checking for Octave compiler flags... " >&6; } OCTAVE_CXXFLAGS= for var in CXX ALL_CXXFLAGS; do for flag in `env - ${mkoctfile} -p ${var}`; do case ${flag} in -std=*|-g*|-W*) OCTAVE_CXXFLAGS="${OCTAVE_CXXFLAGS} ${flag}";; *) ;; esac done done save_CXXFLAGS="${CXXFLAGS}" CXXFLAGS="-Werror -O0" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : OCTAVE_CXXFLAGS="${OCTAVE_CXXFLAGS} -O0" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CXXFLAGS="${save_CXXFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OCTAVE_CXXFLAGS" >&5 $as_echo "$OCTAVE_CXXFLAGS" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Octave linker flags" >&5 $as_echo_n "checking for Octave linker flags... " >&6; } OCTAVE_LDFLAGS= for var in OCTLIBDIR; do OCTAVE_LDFLAGS="${OCTAVE_LDFLAGS} "-L`env - ${mkoctfile} -p ${var}` done for var in RDYNAMIC_FLAG RLD_FLAG OCTAVE_LIBS LIBS; do OCTAVE_LDFLAGS="${OCTAVE_LDFLAGS} "`env - ${mkoctfile} -p ${var}` done { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OCTAVE_LDFLAGS" >&5 $as_echo "$OCTAVE_LDFLAGS" >&6; } fi # Check for Octave options if test -n "$OCTAVE"; then for octave_opt in --no-window-system --silent --norc --no-history; do { $as_echo "$as_me:${as_lineno-$LINENO}: checking if Octave option '${octave_opt}' is supported" >&5 $as_echo_n "checking if Octave option '${octave_opt}' is supported... " >&6; } octave_out=`${OCTAVE} ${octave_opt} /dev/null 2>&1 | sed -n '1p' | sed -n '/unrecognized/p'` if test "x${octave_out}" = x; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } OCTAVE="${OCTAVE} ${octave_opt}" else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi done fi #---------------------------------------------------------------- # Look for Scilab #---------------------------------------------------------------- # Check whether --with-scilab was given. if test "${with_scilab+set}" = set; then : withval=$with_scilab; SCILABBIN="$withval" else SCILABBIN="$alllang_default" fi # Check whether --with-scilab-inc was given. if test "${with_scilab_inc+set}" = set; then : withval=$with_scilab_inc; SCILABINCDIR="$withval" else SCILABINCDIR="" fi # First, check for "--without-scilab" or "--with-scilab=no". if test x"${SCILABBIN}" = xno; then { $as_echo "$as_me:${as_lineno-$LINENO}: Disabling Scilab" >&5 $as_echo "$as_me: Disabling Scilab" >&6;} SCILAB= else # Check for Scilab executable if test "x$SCILABBIN" = xyes; then for ac_prog in scilab do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_SCILAB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$SCILAB"; then ac_cv_prog_SCILAB="$SCILAB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_SCILAB="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi SCILAB=$ac_cv_prog_SCILAB if test -n "$SCILAB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $SCILAB" >&5 $as_echo "$SCILAB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$SCILAB" && break done else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for scilab" >&5 $as_echo_n "checking for scilab... " >&6; } if test -f "$SCILABBIN"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $SCILABBIN" >&5 $as_echo "$SCILABBIN" >&6; } SCILAB="$SCILABBIN" else { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 $as_echo "not found" >&6; } fi fi if test -n "$SCILAB"; then # Check for Scilab version (needs api_scilab so needs version 5.3.3 or higher) SCILAB_FULL_VERSION=`$SCILAB -version | head -1 | sed -e 's|Scilab version \"\(.*\)\"|\1|g'` { $as_echo "$as_me:${as_lineno-$LINENO}: checking Scilab version is 5.3.3 or higher" >&5 $as_echo_n "checking Scilab version is 5.3.3 or higher... " >&6; } SCILAB_MAJOR_VERSION=`echo $SCILAB_FULL_VERSION | cut -d. -f1` SCILAB_MINOR_VERSION=`echo $SCILAB_FULL_VERSION | cut -d. -f2` SCILAB_MAINTENANCE_VERSION=`echo $SCILAB_FULL_VERSION | cut -d. -f3` SCILAB_VERSION="$SCILAB_MAJOR_VERSION$SCILAB_MINOR_VERSION$SCILAB_MAINTENANCE_VERSION" if test $SCILAB_VERSION -ge 533; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } SCILAB= fi if test -n "$SCILAB"; then # Set Scilab startup options depending on version { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Scilab startup options" >&5 $as_echo_n "checking for Scilab startup options... " >&6; } SCILABOPT="-nwni -nb" if test $SCILAB_VERSION -ge 540; then SCILABOPT+=" -noatomsautoload" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $SCILABOPT" >&5 $as_echo "$SCILABOPT" >&6; } # Check for Scilab header files { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Scilab header files" >&5 $as_echo_n "checking for Scilab header files... " >&6; } if test "$SCILABINCDIR" != ""; then dirs="$SCILABINCDIR" elif test -n "$PKGCONFIG"; then dirs=`$PKGCONFIG scilab --cflags-only-I | sed -e 's/-I//g'` else dirs="" fi for i in $dirs; do if test -r $i/api_scilab.h; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $i" >&5 $as_echo "$i" >&6; } SCILABINCLUDE="-I$i" break fi if test -r $i/scilab/api_scilab.h; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $i/scilab" >&5 $as_echo "$i/scilab" >&6; } SCILABINCLUDE="-I$i/scilab" break fi done if test "$SCILABINCLUDE" = "" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 $as_echo "not found" >&6; } SCILAB= fi fi fi fi #---------------------------------------------------------------- # Look for java #---------------------------------------------------------------- # Check whether --with-java was given. if test "${with_java+set}" = set; then : withval=$with_java; JAVABIN="$withval" else JAVABIN="$alllang_default" fi # Check whether --with-javac was given. if test "${with_javac+set}" = set; then : withval=$with_javac; JAVACBIN="$withval" else JAVACBIN= fi # First, check for "--without-java" or "--with-java=no". if test x"${JAVABIN}" = xno; then { $as_echo "$as_me:${as_lineno-$LINENO}: Disabling Java" >&5 $as_echo "$as_me: Disabling Java" >&6;} JAVA= else case $host in *-*-cygwin*) if test -n "$JAVA_HOME"; then JAVA_HOME=`cygpath --mixed "$JAVA_HOME"` fi JAVA_CLASSPATH_SEP=";" ;; *-*-mingw*) if test -n "$JAVA_HOME"; then JAVA_HOME=`${srcdir}/Tools/convertpath -u "$JAVA_HOME"` fi JAVA_CLASSPATH_SEP=";" ;; *-*-darwin*) if test -z "$JAVA_HOME" -a -x /usr/libexec/java_home; then JAVA_HOME=`/usr/libexec/java_home` fi JAVA_OSX_STD_INCDIR="/System/Library/Frameworks/JavaVM.framework/Headers" if test -r "$JAVA_OSX_STD_INCDIR/jni.h"; then JAVA_HOME_INCDIR=$JAVA_OSX_STD_INCDIR fi JAVA_CLASSPATH_SEP=":" ;; *) JAVA_CLASSPATH_SEP=":" ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for java JDK" >&5 $as_echo_n "checking for java JDK... " >&6; } if test -n "$JAVA_HOME"; then java_home_ok=1 if test -z "$JAVABIN" -a ! -x "$JAVA_HOME/bin/java"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: No java executable under JAVA_HOME." >&5 $as_echo "$as_me: WARNING: No java executable under JAVA_HOME." >&2;} java_home_ok=0 fi if test -z "$JAVACBIN" -a ! -x "$JAVA_HOME/bin/javac"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: No javac executable under JAVA_HOME." >&5 $as_echo "$as_me: WARNING: No javac executable under JAVA_HOME." >&2;} java_home_ok=0 fi if test -z "$JAVA_HOME_INCDIR"; then JAVA_HOME_INCDIR="$JAVA_HOME/include" fi if test -z "$JAVAINCDIR" -a ! -r "$JAVA_HOME_INCDIR/jni.h"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: No java headers under JAVA_HOME (does it point to a JDK and not just JRE?)." >&5 $as_echo "$as_me: WARNING: No java headers under JAVA_HOME (does it point to a JDK and not just JRE?)." >&2;} java_home_ok=0 fi if test "$java_home_ok" = 1; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: found (in $JAVA_HOME)" >&5 $as_echo "found (in $JAVA_HOME)" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: JAVA_HOME ($JAVA_HOME) is defined but does not point to a complete JDK installation, ignoring it." >&5 $as_echo "$as_me: WARNING: JAVA_HOME ($JAVA_HOME) is defined but does not point to a complete JDK installation, ignoring it." >&2;} JAVA_HOME= fi else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no (JAVA_HOME is not defined)" >&5 $as_echo "no (JAVA_HOME is not defined)" >&6; } fi if test "x$JAVABIN" = xyes; then if test -n "$JAVA_HOME"; then JAVA="$JAVA_HOME/bin/java" else for ac_prog in java kaffe guavac do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_JAVA+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$JAVA"; then ac_cv_prog_JAVA="$JAVA" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_JAVA="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi JAVA=$ac_cv_prog_JAVA if test -n "$JAVA"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $JAVA" >&5 $as_echo "$JAVA" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$JAVA" && break done fi else JAVA="$JAVABIN" fi if test -z "$JAVACBIN"; then if test -n "$JAVA_HOME"; then JAVAC="$JAVA_HOME/bin/javac" else for ac_prog in javac do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_JAVAC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$JAVAC"; then ac_cv_prog_JAVAC="$JAVAC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_JAVAC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi JAVAC=$ac_cv_prog_JAVAC if test -n "$JAVAC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $JAVAC" >&5 $as_echo "$JAVAC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$JAVAC" && break done fi else JAVAC="$JAVACBIN" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for java include file jni.h" >&5 $as_echo_n "checking for java include file jni.h... " >&6; } # Check whether --with-javaincl was given. if test "${with_javaincl+set}" = set; then : withval=$with_javaincl; JAVAINCDIR="$withval" else JAVAINCDIR= fi JAVAINC="" if test -z "$JAVAINCDIR" ; then if test -n "$JAVA_HOME"; then JAVAINCDIR="$JAVA_HOME_INCDIR" JAVAINC=-I\"$JAVAINCDIR\" else JAVAINCDIR="/usr/j2sdk*/include /usr/local/j2sdk*/include /usr/jdk*/include /usr/local/jdk*/include /opt/j2sdk*/include /opt/jdk*/include /usr/java/include /usr/java/j2sdk*/include /usr/java/jdk*/include /usr/local/java/include /opt/java/include /usr/include/java /usr/local/include/java /usr/lib/java/include /usr/lib/jvm/java*/include /usr/lib64/jvm/java*/include /usr/include/kaffe /usr/local/include/kaffe /usr/include" # Add in default installation directory on Windows for Cygwin case $host in *-*-cygwin* | *-*-mingw*) JAVAINCDIR="c:/Program*Files*/Java/jdk*/include d:/Program*Files*/Java/jdk*/include c:/j2sdk*/include d:/j2sdk*/include c:/jdk*/include d:/jdk*/include $JAVAINCDIR";; *-*-darwin*) JAVAINCDIR="$JAVA_OSX_STD_INCDIR $JAVAINCDIR";; *);; esac for d in $JAVAINCDIR ; do if test -r "$d/jni.h" ; then JAVAINCDIR=$d JAVAINC=-I\"$d\" JAVA_HOME_MAYBE="`dirname $d`" break fi done fi else if test -r "$JAVAINCDIR/jni.h" ; then JAVAINC=-I\"$JAVAINCDIR\" fi fi if test "$JAVAINC" = "" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 $as_echo "not found" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: $JAVAINC" >&5 $as_echo "$JAVAINC" >&6; } # now look for /jni_md.h { $as_echo "$as_me:${as_lineno-$LINENO}: checking for java include file jni_md.h" >&5 $as_echo_n "checking for java include file jni_md.h... " >&6; } JAVAMDDIR=`find "$JAVAINCDIR" -follow -name jni_md.h -print` if test "$JAVAMDDIR" = "" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 $as_echo "not found" >&6; } else JAVAMDDIR=-I\"`dirname "$JAVAMDDIR" | tail -1`\" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $JAVAMDDIR" >&5 $as_echo "$JAVAMDDIR" >&6; } JAVAINC="${JAVAINC} ${JAVAMDDIR}" fi fi # Auto-detecting JAVA_HOME is not so easy, below will only work up to and including jdk8 if test -z "$JAVA_HOME" && test -n "$JAVA_HOME_MAYBE" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for java jdk from jni include paths" >&5 $as_echo_n "checking for java jdk from jni include paths... " >&6; } if test -r "$JAVA_HOME_MAYBE/lib/tools.jar" ; then JAVA_HOME=$JAVA_HOME_MAYBE { $as_echo "$as_me:${as_lineno-$LINENO}: result: $JAVA_HOME" >&5 $as_echo "$JAVA_HOME" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 $as_echo "not found" >&6; } fi fi # Javadoc support required for the Java test-suite is available by default in jdk9+ and in tools.jar in earlier jdk versions { $as_echo "$as_me:${as_lineno-$LINENO}: checking for java tools.jar" >&5 $as_echo_n "checking for java tools.jar... " >&6; } if test -n "$JAVA_HOME" && test -r "$JAVA_HOME/lib/tools.jar" ; then JAVA_TOOLS_JAR="$JAVA_HOME/lib/tools.jar" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $JAVA_TOOLS_JAR" >&5 $as_echo "$JAVA_TOOLS_JAR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 $as_echo "not found" >&6; } fi case $host in *-*-cygwin*) # TODO: Only use this flag if the compiler supports it, later versions of gcc no longer have it GCC_MNO_CYGWIN=" -mno-cygwin" ;; *) GCC_MNO_CYGWIN="" ;; esac # java.exe on Cygwin requires the Windows standard (Pascal) calling convention as it is a normal Windows executable and not a Cygwin built executable case $host in *-*-cygwin* | *-*-mingw*) if test "$GCC" = yes; then JAVADYNAMICLINKING="$GCC_MNO_CYGWIN -mthreads -Wl,--add-stdcall-alias" JAVACFLAGS="$GCC_MNO_CYGWIN -mthreads" else JAVADYNAMICLINKING="" JAVACFLAGS="" fi ;; *-*-darwin*) JAVADYNAMICLINKING="-dynamiclib -framework JavaVM" JAVACFLAGS="" ;; *) JAVADYNAMICLINKING="" JAVACFLAGS="" ;; esac # Java on Windows platforms including Cygwin doesn't use libname.dll, rather name.dll when loading dlls case $host in *-*-cygwin* | *-*-mingw*) JAVALIBRARYPREFIX="";; *)JAVALIBRARYPREFIX="lib";; esac # Java on Mac OS X tweaks case $host in *-*-darwin*) JAVASO=".jnilib" JAVALDSHARED='$(CC)' JAVACXXSHARED='$(CXX)' ;; *) JAVASO=$SO JAVALDSHARED='$(LDSHARED)' JAVACXXSHARED='$(CXXSHARED)' ;; esac fi # Quote for spaces in path to executables if test -n "$JAVA"; then JAVA=\"$JAVA\" fi if test -n "$JAVAC"; then JAVAC=\"$JAVAC\" fi # Turned off due to spurious warnings in later versions of openjdk-1.8 # JAVAFLAGS=-Xcheck:jni #---------------------------------------------------------------- # Look for Javascript #---------------------------------------------------------------- # Check whether --with-javascript was given. if test "${with_javascript+set}" = set; then : withval=$with_javascript; with_javascript="$withval" else with_javascript="$alllang_default" fi # First, check for "--without-javascript" or "--with-javascript=no". if test x"${with_javascript}" = xno; then { $as_echo "$as_me:${as_lineno-$LINENO}: Disabling Javascript" >&5 $as_echo "$as_me: Disabling Javascript" >&6;} JAVASCRIPT= else JAVASCRIPT=1 #---------------------------------------------------------------- # General Javascript settings shared by JSC and V8 #---------------------------------------------------------------- case $host in *-*-darwin*) JSSO=".dylib" # HACK: didn't manage to get dynamic module loading working with a g++ compiled interpreter JSINTERPRETERCXX='c++' JSINTERPRETERLINKFLAGS='-g -Wl,-search_paths_first -Wl,-headerpad_max_install_names' ;; *) JSSO=$SO JSINTERPRETERCXX='$(CXX)' JSINTERPRETERLINKFLAGS='-ldl' ;; esac #---------------------------------------------------------------- # Look for Node.js which is the default Javascript engine #---------------------------------------------------------------- for ac_prog in nodejs node do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_NODEJS+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$NODEJS"; then ac_cv_prog_NODEJS="$NODEJS" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_NODEJS="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi NODEJS=$ac_cv_prog_NODEJS if test -n "$NODEJS"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NODEJS" >&5 $as_echo "$NODEJS" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$NODEJS" && break done if test -n "$NODEJS"; then # node-gyp is needed to run the test-suite/examples for ac_prog in node-gyp do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_NODEGYP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$NODEGYP"; then ac_cv_prog_NODEGYP="$NODEGYP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_NODEGYP="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi NODEGYP=$ac_cv_prog_NODEGYP if test -n "$NODEGYP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NODEGYP" >&5 $as_echo "$NODEGYP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$NODEGYP" && break done if test -z "$NODEGYP"; then NODEJS= fi fi #---------------------------------------------------------------- # Look for JavascriptCore (Webkit) settings (JSCOREINCDIR, JSCOREDYNAMICLINKING) #---------------------------------------------------------------- # check for include files { $as_echo "$as_me:${as_lineno-$LINENO}: checking for JavaScriptCore/JavaScript.h" >&5 $as_echo_n "checking for JavaScriptCore/JavaScript.h... " >&6; } # Check whether --with-jscoreinc was given. if test "${with_jscoreinc+set}" = set; then : withval=$with_jscoreinc; JSCOREINCDIR="$withval" else JSCOREINCDIR= fi JSCOREVERSION= if test -z "$JSCOREINCDIR"; then JSCOREINCDIR="/usr/include/ /usr/local/include/" # Add in default directory for JavaScriptCore headers for Linux and Mac OS X case $host in *-*-linux*) JSCOREINCDIR="/usr/include/webkit-1.0/ /usr/include/webkitgtk-1.0/ /usr/local/include/webkit-1.0/JavaScriptCore/ $JSCOREINCDIR" ;; *-*-darwin*) JSCOREINCDIR="/System/Library/Frameworks/JavaScriptCore.framework/Headers/ $JSCOREINCDIR" ;; *) ;; esac fi for d in $JSCOREINCDIR ; do if test -r "$d/JavaScriptCore/JavaScript.h" || test -r "$d/JavaScript.h" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5 $as_echo "$d" >&6; } JSCOREINCDIR=$d JSCOREINC=-I\"$d\" break fi done if test "$JSCOREINC" = "" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 $as_echo "not found" >&6; } fi # check for JavaScriptCore/Webkit libraries # Check whether --with-jscorelib was given. if test "${with_jscorelib+set}" = set; then : withval=$with_jscorelib; JSCORELIB="-L$withval" else JSCORELIB= fi if test -z "$JSCORELIB" -a -n "$PKGCONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for JavaScriptCore/Webkit library" >&5 $as_echo_n "checking for JavaScriptCore/Webkit library... " >&6; } if pkg-config javascriptcoregtk-1.0; then JSCORELIB=`$PKGCONFIG --libs javascriptcoregtk-1.0` JSCOREVERSION=`$PKGCONFIG --modversion javascriptcoregtk-1.0` fi if test -z "$JSCORELIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 $as_echo "not found" >&6; } JSCENABLED= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: $JSCORELIB" >&5 $as_echo "$JSCORELIB" >&6; } JSCOREDYNAMICLINKING="$JSCORELIB" JSCENABLED=1 fi fi #---------------------------------------------------------------- # Look for V8 settings (JSV8INCDIR, JSV8DYNAMICLINKING) #---------------------------------------------------------------- # check for include files { $as_echo "$as_me:${as_lineno-$LINENO}: checking for V8 Javascript v8.h" >&5 $as_echo_n "checking for V8 Javascript v8.h... " >&6; } # Check whether --with-jsv8inc was given. if test "${with_jsv8inc+set}" = set; then : withval=$with_jsv8inc; JSV8INCDIR="$withval" else JSV8INCDIR= fi # if not include dir is specified we try to find if test -z "$JSV8INCDIR"; then # Add in default directory for JavaScriptCore headers for Linux and Mac OS X case $host in *-*-linux*) JSV8INCDIR="/usr/include /usr/local/include/ $JSV8INCDIR" ;; *-*-darwin*) JSV8INCDIR="$JSV8INCDIR" ;; *) ;; esac fi for d in $JSV8INCDIR ; do if test -r "$d/v8.h" ; then JSV8INCDIR=$d JSV8INC=-I\"$d\" break fi done if test "$JSV8INC" = "" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 $as_echo "not found" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: $JSV8INCDIR" >&5 $as_echo "$JSV8INCDIR" >&6; } fi # check for V8 library { $as_echo "$as_me:${as_lineno-$LINENO}: checking for V8 Javascript library" >&5 $as_echo_n "checking for V8 Javascript library... " >&6; } # Check whether --with-jsv8lib was given. if test "${with_jsv8lib+set}" = set; then : withval=$with_jsv8lib; JSV8LIBDIR="$withval" else JSV8LIB= fi v8libdirs="$JSV8LIBDIR /usr/lib64/ /usr/local/lib64/ /usr/lib/ /usr/local/lib/" for d in $v8libdirs ; do if test -r $d/libv8$JSSO; then JSV8LIBDIR=$d JSV8LIB="-L$d -lv8" break fi done if test "$JSV8LIB" = "" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 $as_echo "not found" >&6; } JSV8ENABLED= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: $JSV8LIBDIR" >&5 $as_echo "$JSV8LIBDIR" >&6; } JSV8ENABLED=1 fi # linking options case $host in *-*-darwin*) JSV8DYNAMICLINKING="$JSV8LIB" ;; *-*-linux*) JSV8DYNAMICLINKING="$JSV8LIB" ;; *) JSV8DYNAMICLINKING="" ;; esac fi #---------------------------------------------------------------- # Look for Android #---------------------------------------------------------------- # Check whether --with-android was given. if test "${with_android+set}" = set; then : withval=$with_android; ANDROIDBIN="$withval" else ANDROIDBIN="$alllang_default" fi # Check whether --with-adb was given. if test "${with_adb+set}" = set; then : withval=$with_adb; ADBBIN="$withval" else ADBBIN= fi # Check whether --with-ant was given. if test "${with_ant+set}" = set; then : withval=$with_ant; ANTBIN="$withval" else ANTBIN= fi # Check whether --with-ndk-build was given. if test "${with_ndk_build+set}" = set; then : withval=$with_ndk_build; NDKBUILDBIN="$withval" else NDKBUILDBIN= fi # First, check for "--without-android" or "--with-android=no". if test x"${ANDROIDBIN}" = xno; then { $as_echo "$as_me:${as_lineno-$LINENO}: Disabling Android" >&5 $as_echo "$as_me: Disabling Android" >&6;} ANDROID= else if test "x$ANDROIDBIN" = xyes; then for ac_prog in android do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ANDROID+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ANDROID"; then ac_cv_prog_ANDROID="$ANDROID" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ANDROID="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ANDROID=$ac_cv_prog_ANDROID if test -n "$ANDROID"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ANDROID" >&5 $as_echo "$ANDROID" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ANDROID" && break done else ANDROID="$ANDROIDBIN" fi if test -z "$ADBBIN"; then for ac_prog in adb do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ADB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ADB"; then ac_cv_prog_ADB="$ADB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ADB="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ADB=$ac_cv_prog_ADB if test -n "$ADB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ADB" >&5 $as_echo "$ADB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ADB" && break done else ADB="$ADBBIN" fi if test -z "$ANTBIN"; then for ac_prog in ant do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ANT+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ANT"; then ac_cv_prog_ANT="$ANT" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ANT="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ANT=$ac_cv_prog_ANT if test -n "$ANT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ANT" >&5 $as_echo "$ANT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ANT" && break done else ANT="$ANTBIN" fi if test -z "$NDKBUILDBIN"; then for ac_prog in ndk-build do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_NDKBUILD+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$NDKBUILD"; then ac_cv_prog_NDKBUILD="$NDKBUILD" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_NDKBUILD="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi NDKBUILD=$ac_cv_prog_NDKBUILD if test -n "$NDKBUILD"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NDKBUILD" >&5 $as_echo "$NDKBUILD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$NDKBUILD" && break done else NDKBUILD="$NDKBUILDBIN" fi fi #---------------------------------------------------------------- # Look for Guile #---------------------------------------------------------------- GUILE= GUILE_CFLAGS= GUILE_LIBS= # Check whether --with-guile-config was given. if test "${with_guile_config+set}" = set; then : withval=$with_guile_config; GUILE_CONFIG="$withval" else GUILE_CONFIG= fi # Check whether --with-guile was given. if test "${with_guile+set}" = set; then : withval=$with_guile; GUILE="$withval" else GUILE="$alllang_default" fi # Check whether --with-guile-cflags was given. if test "${with_guile_cflags+set}" = set; then : withval=$with_guile_cflags; GUILE_CFLAGS="$withval" fi # Check whether --with-guile-libs was given. if test "${with_guile_libs+set}" = set; then : withval=$with_guile_libs; GUILE_LIBS="$withval" fi # First, check for "--without-guile" or "--with-guile=no". if test x"${GUILE}" = xno; then { $as_echo "$as_me:${as_lineno-$LINENO}: Disabling Guile" >&5 $as_echo "$as_me: Disabling Guile" >&6;} else if test -z "$GUILE_CONFIG" ; then # Extract the first word of "guile-config", so it can be a program name with args. set dummy guile-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_GUILE_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $GUILE_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_GUILE_CONFIG="$GUILE_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_GUILE_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi GUILE_CONFIG=$ac_cv_path_GUILE_CONFIG if test -n "$GUILE_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GUILE_CONFIG" >&5 $as_echo "$GUILE_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -n "$GUILE_CONFIG" ; then if test x"$GUILE" = xyes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for guile executable" >&5 $as_echo_n "checking for guile executable... " >&6; } # Try extracting it via guile-config first. If it's defined there it's the most reliable result GUILE="`$GUILE_CONFIG info guile 2>/dev/null`" if test -n "$GUILE"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GUILE" >&5 $as_echo "$GUILE" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found via guile-config - constructing path" >&5 $as_echo "not found via guile-config - constructing path" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for guile bindir" >&5 $as_echo_n "checking for guile bindir... " >&6; } guile_bindir="`$GUILE_CONFIG info bindir`" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $guile_bindir" >&5 $as_echo "$guile_bindir" >&6; } GUILE="$guile_bindir/guile" fi if ! test -f "$GUILE" ; then GUILE= # Extract the first word of "guile", so it can be a program name with args. set dummy guile; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_GUILE+:} false; then : $as_echo_n "(cached) " >&6 else case $GUILE in [\\/]* | ?:[\\/]*) ac_cv_path_GUILE="$GUILE" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_GUILE="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi GUILE=$ac_cv_path_GUILE if test -n "$GUILE"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GUILE" >&5 $as_echo "$GUILE" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$GUILE" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: no suitable guile executable found. Disabling Guile" >&5 $as_echo "$as_me: WARNING: no suitable guile executable found. Disabling Guile" >&2;} fi fi if test -n "$GUILE" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for guile version" >&5 $as_echo_n "checking for guile version... " >&6; } guile_version=`$GUILE -c '(display (effective-version))'` { $as_echo "$as_me:${as_lineno-$LINENO}: result: $guile_version" >&5 $as_echo "$guile_version" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for guile version >= 1.8" >&5 $as_echo_n "checking for guile version >= 1.8... " >&6; } guile_good_version=`$GUILE -c '(if (>= (string->number (effective-version)) 1.8) (display "yes") (display "no"))'` { $as_echo "$as_me:${as_lineno-$LINENO}: result: $guile_good_version" >&5 $as_echo "$guile_good_version" >&6; } if test x"$guile_good_version" != xyes ; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: at least guile version 1.8 is required. Disabling Guile" >&5 $as_echo "$as_me: WARNING: at least guile version 1.8 is required. Disabling Guile" >&2;} GUILE= fi fi if test -n "$GUILE" ; then # Test if guile-config and guile versions match. They should. gc_version="`$GUILE_CONFIG --version 2>&1 | sed '1 s/.* //;q'`" g_version="`$GUILE --version | sed '1 s/.* //;q'`" if test "$gc_version" != "$g_version"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: different versions reported by $GUILE_CONFIG ($gc_version) and $GUILE ($g_version). Disabling Guile" >&5 $as_echo "$as_me: WARNING: different versions reported by $GUILE_CONFIG ($gc_version) and $GUILE ($g_version). Disabling Guile" >&2;} GUILE= fi fi if test -n "$GUILE" ; then if test -z "$GUILE_CFLAGS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for guile compile flags" >&5 $as_echo_n "checking for guile compile flags... " >&6; } GUILE_CFLAGS="`$GUILE_CONFIG compile`" # Note that this can sometimes be empty { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GUILE_CFLAGS" >&5 $as_echo "$GUILE_CFLAGS" >&6; } fi if test -z "$GUILE_LIBS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for guile link flags" >&5 $as_echo_n "checking for guile link flags... " >&6; } GUILE_LIBS="`$GUILE_CONFIG link`" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GUILE_LIBS" >&5 $as_echo "$GUILE_LIBS" >&6; } fi fi fi fi #---------------------------------------------------------------- # Look for MzScheme #---------------------------------------------------------------- # Check whether --with-mzscheme was given. if test "${with_mzscheme+set}" = set; then : withval=$with_mzscheme; MZSCHEMEBIN="$withval" else MZSCHEMEBIN="$alllang_default" fi # Check whether --with-mzc was given. if test "${with_mzc+set}" = set; then : withval=$with_mzc; MZCBIN="$withval" else MZCBIN= fi # First, check for "--without-mzscheme" or "--with-mzscheme=no". if test x"${MZSCHEMEBIN}" = xno; then { $as_echo "$as_me:${as_lineno-$LINENO}: Disabling MzScheme" >&5 $as_echo "$as_me: Disabling MzScheme" >&6;} MZC= else if test "x$MZSCHEMEBIN" = xyes; then # Extract the first word of "mzscheme", so it can be a program name with args. set dummy mzscheme; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_MZSCHEME+:} false; then : $as_echo_n "(cached) " >&6 else case $MZSCHEME in [\\/]* | ?:[\\/]*) ac_cv_path_MZSCHEME="$MZSCHEME" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_MZSCHEME="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi MZSCHEME=$ac_cv_path_MZSCHEME if test -n "$MZSCHEME"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MZSCHEME" >&5 $as_echo "$MZSCHEME" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi else MZSCHEME="$MZSCHEMEBIN" fi if test -z "$MZCBIN"; then # Extract the first word of "mzc", so it can be a program name with args. set dummy mzc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_MZC+:} false; then : $as_echo_n "(cached) " >&6 else case $MZC in [\\/]* | ?:[\\/]*) ac_cv_path_MZC="$MZC" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_MZC="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi MZC=$ac_cv_path_MZC if test -n "$MZC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MZC" >&5 $as_echo "$MZC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -n "$MZSCHEME"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for MzScheme dynext object" >&5 $as_echo_n "checking for MzScheme dynext object... " >&6; } MZDYNOBJ=`$MZSCHEME --eval '(begin (require dynext/link) (with-handlers (((lambda args #t) (lambda args #f))) (for-each (lambda (x) (printf "~a" x)) (expand-for-link-variant (current-standard-link-libraries)))))' 2>/dev/null` if test -f "$MZDYNOBJ"; then : else # older versions (3.72 approx and earlier) MZDYNOBJ=`$MZSCHEME --mute-banner --version --eval '(begin (require (lib "link.ss" "dynext")) (with-handlers (((lambda args #t) (lambda args #f))) (for-each (lambda (x) (display x) (display " ")) ((current-make-standard-link-libraries)))) (with-handlers (((lambda args #t) (lambda args #f))) (for-each (lambda (x) (display x)) (expand-for-link-variant (current-standard-link-libraries)))))' 2>/dev/null` fi if test -f "$MZDYNOBJ"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MZDYNOBJ" >&5 $as_echo "$MZDYNOBJ" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 $as_echo "not found" >&6; } MZDYNOBJ="" fi fi fi #---------------------------------------------------------------- # Look for Ruby #---------------------------------------------------------------- RUBYBIN= # Check whether --with-ruby was given. if test "${with_ruby+set}" = set; then : withval=$with_ruby; RUBYBIN="$withval" else RUBYBIN="$alllang_default" fi # First, check for "--without-ruby" or "--with-ruby=no". RUBYSO=$SO if test x"${RUBYBIN}" = xno; then { $as_echo "$as_me:${as_lineno-$LINENO}: Disabling Ruby" >&5 $as_echo "$as_me: Disabling Ruby" >&6;} RUBY= else # First figure out what the name of Ruby is if test "x$RUBYBIN" = xyes; then for ac_prog in ruby do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_RUBY+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$RUBY"; then ac_cv_prog_RUBY="$RUBY" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_RUBY="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi RUBY=$ac_cv_prog_RUBY if test -n "$RUBY"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RUBY" >&5 $as_echo "$RUBY" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$RUBY" && break done else RUBY="$RUBYBIN" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Ruby header files" >&5 $as_echo_n "checking for Ruby header files... " >&6; } if test -n "$RUBY"; then # Try Ruby1.9+ first RUBYDIR=`($RUBY -rrbconfig -e 'print RbConfig::CONFIG["rubyhdrdir"] || $rubyhdrdir') 2>/dev/null` RUBYARCHHDRDIR=`($RUBY -rrbconfig -e 'print RbConfig::CONFIG["rubyarchhdrdir"] || $rubyarchhdrdir') 2>/dev/null` if test x"$RUBYDIR" = x"" || test x"$RUBYDIR" = x"nil"; then RUBYDIR=`($RUBY -rrbconfig -e 'print RbConfig::CONFIG["archdir"] || $archdir') 2>/dev/null` else RUBYARCH=`($RUBY -rrbconfig -e 'print RbConfig::CONFIG["arch"] || $arch') 2>/dev/null` fi if test x"$RUBYDIR" != x""; then dirs="$RUBYDIR" RUBYINCLUDE= for i in $dirs; do if test -r $i/ruby.h; then if test x"$RUBYARCH" = x""; then RUBYINCLUDE="-I$i" elif test -n "$RUBYARCHHDRDIR"; then RUBYINCLUDE="-I$i -I$RUBYARCHHDRDIR" else RUBYINCLUDE="-I$i -I$i/$RUBYARCH" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RUBYINCLUDE" >&5 $as_echo "$RUBYINCLUDE" >&6; } break fi done if test x"$RUBYINCLUDE" = x""; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: could not locate ruby.h" >&5 $as_echo "could not locate ruby.h" >&6; } fi # Find library and path for linking. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Ruby library" >&5 $as_echo_n "checking for Ruby library... " >&6; } RUBYLIB="" rb_archlibdir=`($RUBY -rrbconfig -e 'print RbConfig::CONFIG["archlibdir"]') 2>/dev/null` rb_libdir=`($RUBY -rrbconfig -e 'print RbConfig::CONFIG["libdir"]') 2>/dev/null` rb_bindir=`($RUBY -rrbconfig -e 'print RbConfig::CONFIG["bindir"]') 2>/dev/null` dirs="$dirs $rb_archlibdir $rb_libdir $rb_bindir" rb_libruby=`($RUBY -rrbconfig -e 'print RbConfig::CONFIG["LIBRUBY_A"]') 2>/dev/null` RUBYLINK=`($RUBY -rrbconfig -e ' c = RbConfig::CONFIG if c.has_key? "LIBRUBYARG_STATIC" # 1.8.x if c["LIBRUBY"] == c["LIBRUBY_A"] link = c["LIBRUBYARG_STATIC"] else link = c["LIBRUBYARG_SHARED"] end else # 1.6.x link = "-l" + c["RUBY_INSTALL_NAME"] end # Get the target Ruby was built for target = c["target"] if target == "i386-pc-mswin32" # Need to change msvcrt-ruby*.lib to -lmsvcrt-ruby* ext = File.extname(link) # Get index that counts backwards from end of string index = -1 - ext.size # Strip off the extension link = link.slice(0..index) puts "-l#{link}" else puts link end') 2>/dev/null` if test "$rb_libruby" != ""; then for i in $dirs; do if (test -r $i/$rb_libruby;) then RUBYLIB="$i" break fi done fi if test "$RUBYLIB" = ""; then RUBYLIB="$RUBYDIR" { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found... using $RUBYDIR" >&5 $as_echo "not found... using $RUBYDIR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RUBYLINK in $RUBYLIB" >&5 $as_echo "$RUBYLINK in $RUBYLIB" >&6; } fi else { $as_echo "$as_me:${as_lineno-$LINENO}: result: unable to determine ruby configuration" >&5 $as_echo "unable to determine ruby configuration" >&6; } fi case $host in *-*-mingw*) ;; # do nothing, the default windows libraries are already included *) RUBYLINK="$RUBYLINK `($RUBY -rrbconfig -e 'print RbConfig::CONFIG["LIBS"]') 2>/dev/null`";; esac RUBYCCDLFLAGS=`($RUBY -rrbconfig -e 'print RbConfig::CONFIG["CCDLFLAGS"]') 2>/dev/null` RUBYSO=.`($RUBY -rrbconfig -e 'print RbConfig::CONFIG["DLEXT"]') 2>/dev/null` else { $as_echo "$as_me:${as_lineno-$LINENO}: result: could not figure out how to run ruby" >&5 $as_echo "could not figure out how to run ruby" >&6; } fi case $host in *-*-cygwin* | *-*-mingw*) RUBYDYNAMICLINKING="-L$RUBYLIB $RUBYLINK";; *) RUBYDYNAMICLINKING="";; esac fi #------------------------------------------------------------------------- # Look for PHP7 #------------------------------------------------------------------------- PHPBIN= # Check whether --with-php was given. if test "${with_php+set}" = set; then : withval=$with_php; PHPBIN="$withval" else PHPBIN="$alllang_default" fi # First, check for "--without-php" or "--with-php=no". if test x"${PHPBIN}" = xno; then { $as_echo "$as_me:${as_lineno-$LINENO}: Disabling PHP" >&5 $as_echo "$as_me: Disabling PHP" >&6;} PHP= else if test "x$PHPBIN" = xyes; then for ac_prog in php7.3 php7.2 php7.1 php7.0 php do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_PHP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$PHP"; then ac_cv_prog_PHP="$PHP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_PHP="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi PHP=$ac_cv_prog_PHP if test -n "$PHP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PHP" >&5 $as_echo "$PHP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$PHP" && break done else PHP=$PHPBIN fi if test -n "$PHP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for PHP header files" >&5 $as_echo_n "checking for PHP header files... " >&6; } case $PHP in *7.*) PHPCONFIG=`echo "$PHP"|sed 's/7\...*$/-config&/'` ;; *) PHPCONFIG=$PHP-config ;; esac php_version=`$PHPCONFIG --version 2>/dev/null` case $php_version in 7.*) PHPINC=`$PHPCONFIG --includes 2>/dev/null` if test -n "$PHPINC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PHPINC" >&5 $as_echo "$PHPINC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 $as_echo "not found" >&6; } fi ;; "") { $as_echo "$as_me:${as_lineno-$LINENO}: result: could not find $PHPCONFIG or obtain PHP version from it" >&5 $as_echo "could not find $PHPCONFIG or obtain PHP version from it" >&6; } ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: found PHP $php_version - not PHP 7" >&5 $as_echo "found PHP $php_version - not PHP 7" >&6; } ;; esac fi fi #---------------------------------------------------------------- # Look for OCaml #---------------------------------------------------------------- # Check whether --with-ocaml was given. if test "${with_ocaml+set}" = set; then : withval=$with_ocaml; with_ocaml="$withval" else with_ocaml="$alllang_default" fi # Check whether --with-ocamlc was given. if test "${with_ocamlc+set}" = set; then : withval=$with_ocamlc; OCAMLC="$withval" else OCAMLC= fi # Check whether --with-ocamldlgen was given. if test "${with_ocamldlgen+set}" = set; then : withval=$with_ocamldlgen; OCAMLDLGEN="$withval" else OCAMLDLGEN= fi # Check whether --with-ocamlfind was given. if test "${with_ocamlfind+set}" = set; then : withval=$with_ocamlfind; OCAMLFIND="$withval" else OCAMLFIND= fi # Check whether --with-ocamlmktop was given. if test "${with_ocamlmktop+set}" = set; then : withval=$with_ocamlmktop; OCAMLMKTOP="$withval" else OCAMLMKTOP= fi # Check whether --with-camlp4 was given. if test "${with_camlp4+set}" = set; then : withval=$with_camlp4; CAMLP4="$withval" else CAMLP4= fi # First, check for "--without-ocaml" or "--with-ocaml=no". if test x"${with_ocaml}" = xno; then { $as_echo "$as_me:${as_lineno-$LINENO}: Disabling OCaml" >&5 $as_echo "$as_me: Disabling OCaml" >&6;} OCAMLC= else # OCaml compiler if test -z "$OCAMLC"; then for ac_prog in ocamlc do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OCAMLC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OCAMLC"; then ac_cv_prog_OCAMLC="$OCAMLC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OCAMLC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OCAMLC=$ac_cv_prog_OCAMLC if test -n "$OCAMLC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OCAMLC" >&5 $as_echo "$OCAMLC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$OCAMLC" && break done fi # OCaml Pre-Processor-Pretty-Printer if test -z "$CAMLP4"; then for ac_prog in camlp4 do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CAMLP4+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CAMLP4"; then ac_cv_prog_CAMLP4="$CAMLP4" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CAMLP4="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CAMLP4=$ac_cv_prog_CAMLP4 if test -n "$CAMLP4"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CAMLP4" >&5 $as_echo "$CAMLP4" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CAMLP4" && break done fi # OCaml DL load generator if test -z "$OCAMLDLGEN"; then for ac_prog in ocamldlgen do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OCAMLDLGEN+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OCAMLDLGEN"; then ac_cv_prog_OCAMLDLGEN="$OCAMLDLGEN" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OCAMLDLGEN="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OCAMLDLGEN=$ac_cv_prog_OCAMLDLGEN if test -n "$OCAMLDLGEN"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OCAMLDLGEN" >&5 $as_echo "$OCAMLDLGEN" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$OCAMLDLGEN" && break done fi # OCaml package tool if test -z "$OCAMLFIND"; then for ac_prog in ocamlfind do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OCAMLFIND+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OCAMLFIND"; then ac_cv_prog_OCAMLFIND="$OCAMLFIND" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OCAMLFIND="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OCAMLFIND=$ac_cv_prog_OCAMLFIND if test -n "$OCAMLFIND"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OCAMLFIND" >&5 $as_echo "$OCAMLFIND" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$OCAMLFIND" && break done fi # OCaml toplevel creator if test -z "$OCAMLMKTOP"; then for ac_prog in ocamlmktop do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OCAMLMKTOP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OCAMLMKTOP"; then ac_cv_prog_OCAMLMKTOP="$OCAMLMKTOP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OCAMLMKTOP="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OCAMLMKTOP=$ac_cv_prog_OCAMLMKTOP if test -n "$OCAMLMKTOP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OCAMLMKTOP" >&5 $as_echo "$OCAMLMKTOP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$OCAMLMKTOP" && break done fi fi #---------------------------------------------------------------- # Look for C# #---------------------------------------------------------------- # Check whether --with-csharp was given. if test "${with_csharp+set}" = set; then : withval=$with_csharp; with_csharp="$withval" else with_csharp="$alllang_default" fi # Check whether --with-cil-interpreter was given. if test "${with_cil_interpreter+set}" = set; then : withval=$with_cil_interpreter; CSHARPBIN="$withval" else CSHARPBIN= fi # Check whether --with-csharp-compiler was given. if test "${with_csharp_compiler+set}" = set; then : withval=$with_csharp_compiler; CSHARPCOMPILERBIN="$withval" else CSHARPCOMPILERBIN= fi # First, check for "--without-csharp" or "--with-csharp=no". if test x"${with_csharp}" = xno; then { $as_echo "$as_me:${as_lineno-$LINENO}: Disabling CSharp" >&5 $as_echo "$as_me: Disabling CSharp" >&6;} CSHARPCOMPILER= else if test -z "$CSHARPCOMPILERBIN" ; then case $host in *-*-cygwin* | *-*-mingw*) # prefer unified Mono mcs compiler (not to be confused with the ancient .NET 1 mcs) over older/alternative names. for ac_prog in csc mcs mono-csc gmcs cscc do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CSHARPCOMPILER+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CSHARPCOMPILER"; then ac_cv_prog_CSHARPCOMPILER="$CSHARPCOMPILER" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CSHARPCOMPILER="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CSHARPCOMPILER=$ac_cv_prog_CSHARPCOMPILER if test -n "$CSHARPCOMPILER"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CSHARPCOMPILER" >&5 $as_echo "$CSHARPCOMPILER" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CSHARPCOMPILER" && break done if test -n "$CSHARPCOMPILER" && test "$CSHARPCOMPILER" = "csc" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether csc is the Microsoft CSharp compiler" >&5 $as_echo_n "checking whether csc is the Microsoft CSharp compiler... " >&6; } csc 2>/dev/null | grep "C#" > /dev/null || CSHARPCOMPILER="" if test -z "$CSHARPCOMPILER" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } for ac_prog in mcs mono-csc gmcs cscc do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CSHARPCOMPILER+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CSHARPCOMPILER"; then ac_cv_prog_CSHARPCOMPILER="$CSHARPCOMPILER" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CSHARPCOMPILER="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CSHARPCOMPILER=$ac_cv_prog_CSHARPCOMPILER if test -n "$CSHARPCOMPILER"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CSHARPCOMPILER" >&5 $as_echo "$CSHARPCOMPILER" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CSHARPCOMPILER" && break done else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi fi ;; *)for ac_prog in mono-csc gmcs mcs cscc do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CSHARPCOMPILER+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CSHARPCOMPILER"; then ac_cv_prog_CSHARPCOMPILER="$CSHARPCOMPILER" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CSHARPCOMPILER="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CSHARPCOMPILER=$ac_cv_prog_CSHARPCOMPILER if test -n "$CSHARPCOMPILER"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CSHARPCOMPILER" >&5 $as_echo "$CSHARPCOMPILER" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CSHARPCOMPILER" && break done ;; esac else CSHARPCOMPILER="$CSHARPCOMPILERBIN" fi CSHARPCONVERTPATH="Tools/convertpath -u" if test -z "$CSHARPBIN" ; then CSHARPCILINTERPRETER="" CSHARPCILINTERPRETER_FLAGS="" if test "cscc" = "$CSHARPCOMPILER" ; then for ac_prog in ilrun do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CSHARPCILINTERPRETER+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CSHARPCILINTERPRETER"; then ac_cv_prog_CSHARPCILINTERPRETER="$CSHARPCILINTERPRETER" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CSHARPCILINTERPRETER="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CSHARPCILINTERPRETER=$ac_cv_prog_CSHARPCILINTERPRETER if test -n "$CSHARPCILINTERPRETER"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CSHARPCILINTERPRETER" >&5 $as_echo "$CSHARPCILINTERPRETER" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CSHARPCILINTERPRETER" && break done else if test "mcs" = "$CSHARPCOMPILER"; then # Check that mcs is the C# compiler and not the Unix mcs utility by examining the output of 'mcs --version' # The Mono compiler should emit: Mono C# compiler version a.b.c.d csharp_version_raw=`(mcs --version) 2>/dev/null` csharp_version_searched=`(mcs --version | sed -e "/C#/b" -e "/Mono/b" -e d) 2>/dev/null` # return string if contains 'Mono' or 'C#' CSHARPCOMPILER="" if test -n "$csharp_version_raw" ; then if test "$csharp_version_raw" = "$csharp_version_searched" ; then CSHARPCOMPILER="mcs" fi fi if test "mcs" != "$CSHARPCOMPILER" ; then echo "mcs is not a working Mono C# compiler" fi fi if test "mcs" = "$CSHARPCOMPILER" || test "gmcs" = "$CSHARPCOMPILER" || test "mono-csc" = "$CSHARPCOMPILER"; then for ac_prog in mono do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CSHARPCILINTERPRETER+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CSHARPCILINTERPRETER"; then ac_cv_prog_CSHARPCILINTERPRETER="$CSHARPCILINTERPRETER" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CSHARPCILINTERPRETER="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CSHARPCILINTERPRETER=$ac_cv_prog_CSHARPCILINTERPRETER if test -n "$CSHARPCILINTERPRETER"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CSHARPCILINTERPRETER" >&5 $as_echo "$CSHARPCILINTERPRETER" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CSHARPCILINTERPRETER" && break done # Mono JIT CSHARPCILINTERPRETER_FLAGS="--debug" else if test "csc" = "$CSHARPCOMPILER"; then CSHARPCONVERTPATH="Tools/convertpath -w" fi fi fi else CSHARPCILINTERPRETER="$CSHARPBIN" fi # Cygwin requires the Windows standard (Pascal) calling convention as it is a Windows executable and not a Cygwin built executable case $host in *-*-cygwin* | *-*-mingw*) if test "$GCC" = yes; then CSHARPDYNAMICLINKING="$GCC_MNO_CYGWIN -mthreads -Wl,--add-stdcall-alias" CSHARPCFLAGS="$GCC_MNO_CYGWIN -mthreads" else CSHARPDYNAMICLINKING="" CSHARPCFLAGS="" fi ;; *) CSHARPDYNAMICLINKING="" CSHARPCFLAGS="" ;; esac # CSharp on Windows platforms including Cygwin doesn't use libname.dll, rather name.dll when loading dlls case $host in *-*-cygwin* | *-*-mingw*) CSHARPLIBRARYPREFIX="";; *)CSHARPLIBRARYPREFIX="lib";; esac # C#/Mono on Mac OS X tweaks case $host in *-*-darwin*) CSHARPSO=".so" ;; *) CSHARPSO=$SO ;; esac fi #---------------------------------------------------------------- # Look for Lua #---------------------------------------------------------------- LUABIN= LUAINCLUDE= LUALIB= LUADYNAMICLOADLIB= LUAFLAGS= LUALINK= # note: if LUABIN is empty then lua tests will not be done # LUABIN will be cleared if certain dependencies cannot be found # Check whether --with-lua was given. if test "${with_lua+set}" = set; then : withval=$with_lua; LUABIN="$withval" else LUABIN="$alllang_default" fi # Check whether --with-luaincl was given. if test "${with_luaincl+set}" = set; then : withval=$with_luaincl; LUAINCLUDE="$withval" else LUAINCLUDE= fi # Check whether --with-lualib was given. if test "${with_lualib+set}" = set; then : withval=$with_lualib; LUALIB="$withval" else LUALIB= fi # First, check for "--without-lua" or "--with-lua=no". if test x"${LUABIN}" = xno; then { $as_echo "$as_me:${as_lineno-$LINENO}: Disabling Lua" >&5 $as_echo "$as_me: Disabling Lua" >&6;} else # can we find lua? if test "x$LUABIN" = xyes; then # We look for a versioned Lua binary first, as there can be # multiple versions of Lua installed on some systems (like Debian). for ac_prog in lua5.4 lua5.3 lua5.2 lua5.1 lua do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_LUABIN+:} false; then : $as_echo_n "(cached) " >&6 else case $LUABIN in [\\/]* | ?:[\\/]*) ac_cv_path_LUABIN="$LUABIN" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_LUABIN="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi LUABIN=$ac_cv_path_LUABIN if test -n "$LUABIN"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LUABIN" >&5 $as_echo "$LUABIN" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$LUABIN" && break done fi # check version: we need Lua 5.x if test "$LUABIN"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking Lua version" >&5 $as_echo_n "checking Lua version... " >&6; } LUA_VERSION=`$LUABIN -e 'print(string.match(_VERSION, "%d+[.]%d+"))'` # For 5.0 and 5.1 header and libraries may be named using 50 or 51. LUA_VERSION_NO_DOTS= if test -n "$LUA_VERSION" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: Lua $LUA_VERSION.x" >&5 $as_echo "Lua $LUA_VERSION.x" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5 $as_echo "failed" >&6; } fi case $LUA_VERSION in 5.0) LUA_VERSION_NO_DOTS=50 ;; 5.1) LUA_VERSION_NO_DOTS=51 ;; 5.*) ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Not Lua 5.x, SWIG does not support this version of Lua" >&5 $as_echo "$as_me: WARNING: Not Lua 5.x, SWIG does not support this version of Lua" >&2;} LUABIN="" ;; esac fi if test "$LUABIN"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether Lua dynamic loading is enabled" >&5 $as_echo_n "checking whether Lua dynamic loading is enabled... " >&6; } # using Lua to check Lua # lua 5.0 & 5.1 have different fn names if test "$LUA_VERSION" = "5.0"; then LUADYNAMICLOADLIB=`$LUABIN -e '_,_,c=loadlib("no_such_lib","") if c~="absent" then print "1" end'` else LUADYNAMICLOADLIB=`$LUABIN -e '_,_,c=package.loadlib("no_such_lib","") if c~="absent" then print "1" end'` fi if test -z "$LUADYNAMICLOADLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi # look for the header files & set LUAFLAGS accordingly # will clear LUABIN if not present if test -n "$LUAINCLUDE"; then as_ac_File=`$as_echo "ac_cv_file_$LUAINCLUDE/lua.h" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LUAINCLUDE/lua.h" >&5 $as_echo_n "checking for $LUAINCLUDE/lua.h... " >&6; } if eval \${$as_ac_File+:} false; then : $as_echo_n "(cached) " >&6 else test "$cross_compiling" = yes && as_fn_error $? "cannot check for file existence when cross compiling" "$LINENO" 5 if test -r "$LUAINCLUDE/lua.h"; then eval "$as_ac_File=yes" else eval "$as_ac_File=no" fi fi eval ac_res=\$$as_ac_File { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_File"\" = x"yes"; then : LUAFLAGS="$ISYSTEM$LUAINCLUDE" else LUABIN= fi else LUA_OK="1" CFLAGS_SAVED=$CFLAGS CFLAGS= # Use empty CFLAGS to avoid failure: "present but cannot be compiled" # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done ac_fn_c_check_header_mongrel "$LINENO" "lua.h" "ac_cv_header_lua_h" "$ac_includes_default" if test "x$ac_cv_header_lua_h" = xyes; then : LUAFLAGS="" else LUA_OK="" fi CFLAGS=$CFLAGS_SAVED # if we didn't get it, going to have to look elsewhere (the hard way) if test -z "$LUA_OK"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for lua.h in other locations" >&5 $as_echo_n "checking for lua.h in other locations... " >&6; } # note: Debian/Ubuntu seem to like /usr/include/lua5.1/lua.h # The ordering of the include directories to search should match # the ordering of libraries to search in the library test below. inc=/usr/include incloc=/usr/local/include dirs="$inc/lua$LUA_VERSION" test -z "$LUA_VERSION_NO_DOTS" || dirs="$dirs $inc/lua$LUA_VERSION_NO_DOTS" dirs="$dirs $incloc/lua$LUA_VERSION" test -z "$LUA_VERSION_NO_DOTS" || dirs="$dirs $incloc/lua$LUA_VERSION_NO_DOTS" dirs="$dirs $incloc" for i in $dirs; do #echo "$i" if test -r $i/lua.h; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $i/lua.h" >&5 $as_echo "$i/lua.h" >&6; } LUAFLAGS="$ISYSTEM$i" break fi done if test -z "$LUAFLAGS"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 $as_echo "not found" >&6; } LUABIN="" # clear the bin fi fi fi # look for the library files & set LUALINK accordingly # will clear LUABIN if not present lua_save_LIBS=$LIBS # the code seems to disrupt LIBS, so saving if test -n "$LUALIB"; then as_ac_File=`$as_echo "ac_cv_file_$LUALIB/liblua.a" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LUALIB/liblua.a" >&5 $as_echo_n "checking for $LUALIB/liblua.a... " >&6; } if eval \${$as_ac_File+:} false; then : $as_echo_n "(cached) " >&6 else test "$cross_compiling" = yes && as_fn_error $? "cannot check for file existence when cross compiling" "$LINENO" 5 if test -r "$LUALIB/liblua.a"; then eval "$as_ac_File=yes" else eval "$as_ac_File=no" fi fi eval ac_res=\$$as_ac_File { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_File"\" = x"yes"; then : LUALINK="-L$LUALIB -llua" else LUABIN= fi else libs="lua lua$LUA_VERSION" test -z "$LUA_VERSION_NO_DOTS" || libs="$libs lua$LUA_VERSION_NO_DOTS" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing lua_close" >&5 $as_echo_n "checking for library containing lua_close... " >&6; } if ${ac_cv_search_lua_close+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char lua_close (); int main () { return lua_close (); ; return 0; } _ACEOF for ac_lib in '' $libs; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_lua_close=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_lua_close+:} false; then : break fi done if ${ac_cv_search_lua_close+:} false; then : else ac_cv_search_lua_close=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_lua_close" >&5 $as_echo "$ac_cv_search_lua_close" >&6; } ac_res=$ac_cv_search_lua_close if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" LUALINK="-l$ac_lib" else LUABIN= fi fi # adding lualib for lua 5.0 if test "$LUA_VERSION" = "5.0"; then LUALINK="$LUALINK -llualib" fi LIBS=$lua_save_LIBS # restore LIBS fi fi # if not disabled #---------------------------------------------------------------- # Look for GNU R #---------------------------------------------------------------- RBIN= # Check whether --with-r was given. if test "${with_r+set}" = set; then : withval=$with_r; RBIN="$withval" else RBIN="$alllang_default" fi # First, check for "--without-r" or "--with-r=no". if test x"${RBIN}" = xno; then { $as_echo "$as_me:${as_lineno-$LINENO}: Disabling R" >&5 $as_echo "$as_me: Disabling R" >&6;} RBIN= else # can we find R? if test "x$RBIN" = xyes; then # Extract the first word of "R", so it can be a program name with args. set dummy R; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_RBIN+:} false; then : $as_echo_n "(cached) " >&6 else case $RBIN in [\\/]* | ?:[\\/]*) ac_cv_path_RBIN="$RBIN" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_RBIN="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi RBIN=$ac_cv_path_RBIN if test -n "$RBIN"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RBIN" >&5 $as_echo "$RBIN" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi #---------------------------------------------------------------- # Look for Go compilers #---------------------------------------------------------------- # Check whether --with-go was given. if test "${with_go+set}" = set; then : withval=$with_go; GOBIN="$withval" else GOBIN="$alllang_default" fi if test x"${GOBIN}" = xno; then { $as_echo "$as_me:${as_lineno-$LINENO}: Disabling Go" >&5 $as_echo "$as_me: Disabling Go" >&6;} GO= GOGCC=false GCCGO= GOOPT= GCCGOOPT= GOVERSIONOPTION= else if test "x$GOBIN" = xyes; then for ac_prog in go do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_GO+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$GO"; then ac_cv_prog_GO="$GO" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_GO="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi GO=$ac_cv_prog_GO if test -n "$GO"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GO" >&5 $as_echo "$GO" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$GO" && break done else GO="$GOBIN" fi GOGCC=false GCCGO= GOOPT= GCCGOOPT= GOVERSIONOPTION= if test -n "$GO" ; then GOVERSIONOPTION=version go_version=$($GO $GOVERSIONOPTION | sed -e 's/go version //') { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether go version is too old" >&5 $as_echo_n "checking whether go version is too old... " >&6; } case $go_version in go1.012*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes - minimum version is 1.3" >&5 $as_echo "yes - minimum version is 1.3" >&6; } GO= GOOPT="-intgosize 32" ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } case "$(go env GOARCH)" in amd64 | arm64 | ppc64*) GOOPT="-intgosize 64" ;; *) GOOPT="-intgosize 32" ;; esac ;; esac fi for ac_prog in gccgo do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_GCCGO+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$GCCGO"; then ac_cv_prog_GCCGO="$GCCGO" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_GCCGO="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi GCCGO=$ac_cv_prog_GCCGO if test -n "$GCCGO"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GCCGO" >&5 $as_echo "$GCCGO" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$GCCGO" && break done if test -n "$GCCGO" ; then if $GCCGO --help 2>/dev/null | grep gccgo >/dev/null 2>&1 ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether gccgo version is too old" >&5 $as_echo_n "checking whether gccgo version is too old... " >&6; } go_version=`$GO $GOVERSIONOPTION | sed -n '1p' | sed -e 's/^.* \([0-9.]*\) *$/\1/' -e 's/[.]//g'` if test "x$go_version" = x; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: could not determine gccgo version" >&5 $as_echo "could not determine gccgo version" >&6; } GCCGO= elif test "$go_version" -lt 470; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes - minimum version is 4.7.0" >&5 $as_echo "yes - minimum version is 4.7.0" >&6; } GCCGO= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if test "$go_version" -lt 480; then GCCGOOPT="-intgosize 32" else # The cast to long int works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of void *" >&5 $as_echo_n "checking size of void *... " >&6; } if ${ac_cv_sizeof_void_p+:} false; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (void *))" "ac_cv_sizeof_void_p" "$ac_includes_default"; then : else if test "$ac_cv_type_void_p" = yes; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute sizeof (void *) See \`config.log' for more details" "$LINENO" 5; } else ac_cv_sizeof_void_p=0 fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_void_p" >&5 $as_echo "$ac_cv_sizeof_void_p" >&6; } cat >>confdefs.h <<_ACEOF #define SIZEOF_VOID_P $ac_cv_sizeof_void_p _ACEOF if test "$ac_cv_sizeof_void_p" = "8"; then GCCGOOPT="-intgosize 64" else GCCGOOPT="-intgosize 32" fi fi fi fi fi fi #---------------------------------------------------------------- # Look for D #---------------------------------------------------------------- # Check whether --with-d was given. if test "${with_d+set}" = set; then : withval=$with_d; with_d="$withval" else with_d="$alllang_default" fi # Check whether --with-d1-compiler was given. if test "${with_d1_compiler+set}" = set; then : withval=$with_d1_compiler; D1COMPILERBIN="$withval" else D1COMPILERBIN= fi # Check whether --with-d2-compiler was given. if test "${with_d2_compiler+set}" = set; then : withval=$with_d2_compiler; D2COMPILERBIN="$withval" else D2COMPILERBIN= fi # First, check for "--without-d" or "--with-d=no". if test x"${with_d}" = xno; then { $as_echo "$as_me:${as_lineno-$LINENO}: Disabling D" >&5 $as_echo "$as_me: Disabling D" >&6;} D1COMPILER= D2COMPILER= else old_ac_ext=$ac_ext ac_ext=d if test -z "$D1COMPILERBIN" ; then for ac_prog in dmd ldmd gdmd do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_D1COMPILER+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$D1COMPILER"; then ac_cv_prog_D1COMPILER="$D1COMPILER" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_D1COMPILER="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi D1COMPILER=$ac_cv_prog_D1COMPILER if test -n "$D1COMPILER"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $D1COMPILER" >&5 $as_echo "$D1COMPILER" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$D1COMPILER" && break done if test -n "$D1COMPILER" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the D1/Tango compiler works" >&5 $as_echo_n "checking whether the D1/Tango compiler works... " >&6; } cat > conftest.$ac_ext <<_ACEOF import tango.io.Stdout; void main() { } _ACEOF rm -f conftest.$ac_objext if $D1COMPILER conftest.$ac_ext 2>&5 && test ! -s conftest.err && test -s conftest.$ac_objext; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } D1COMPILER= fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi else D1COMPILER="$D1COMPILERBIN" fi if test -z "$D2COMPILERBIN" ; then for ac_prog in dmd gdmd do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_D2COMPILER+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$D2COMPILER"; then ac_cv_prog_D2COMPILER="$D2COMPILER" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_D2COMPILER="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi D2COMPILER=$ac_cv_prog_D2COMPILER if test -n "$D2COMPILER"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $D2COMPILER" >&5 $as_echo "$D2COMPILER" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$D2COMPILER" && break done if test -n "$D2COMPILER" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the D2 compiler works" >&5 $as_echo_n "checking whether the D2 compiler works... " >&6; } cat > conftest.$ac_ext <<_ACEOF import std.algorithm; void main() { } _ACEOF rm -f conftest.$ac_objext if $D2COMPILER conftest.$ac_ext 2>&5 && test ! -s conftest.err && test -s conftest.$ac_objext; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } D2COMPILER= fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi else D2COMPILER="$D2COMPILERBIN" fi ac_ext=$old_ac_ext fi if test -n "$D1COMPILER"; then DDEFAULTVERSION=1 elif test -n "$D2COMPILER"; then DDEFAULTVERSION=2 fi # Do not prefix library file names with "lib" on Windows. case $host in *-*-cygwin* | *-*-mingw*) DLIBPREFIX="";; *)DLIBPREFIX="lib";; esac #---------------------------------------------------------------- # Determine which languages to use for examples/test-suite #---------------------------------------------------------------- SKIP_TCL= if test -z "$TCLINCLUDE" || test -z "$TCLLIB" ; then SKIP_TCL="1" fi SKIP_PERL5= if test -z "$PERL" || test -z "$PERL5EXT" || test -z "$PERL5TESTMORE"; then SKIP_PERL5="1" fi SKIP_OCTAVE= if test -z "$OCTAVE" ; then SKIP_OCTAVE="1" fi SKIP_PYTHON= if (test -z "$PYINCLUDE" || test -z "$PYLINK") && (test -z "$PY3INCLUDE" || test -z "$PY3LINK") ; then SKIP_PYTHON="1" fi SKIP_PYTHON3= if test -z "$PY3INCLUDE" || test -z "$PY3LINK" ; then SKIP_PYTHON3="1" fi SKIP_JAVA= if test -z "$JAVA" || test -z "$JAVAC" || test -z "$JAVAINC" ; then SKIP_JAVA="1" fi SKIP_JAVASCRIPT= if test -z "$JAVASCRIPT" || ( test -z "$NODEJS" && test -z "$JSCENABLED" && test -z "$JSV8ENABLED" ) ; then SKIP_JAVASCRIPT="1" fi SKIP_GUILE= if test -z "$GUILE" || test -z "$GUILE_LIBS" ; then SKIP_GUILE="1" fi SKIP_MZSCHEME= if test -z "$MZC" || test -z "$MZDYNOBJ" ; then SKIP_MZSCHEME="1" fi SKIP_RUBY= if test -z "$RUBY" || test -z "$RUBYINCLUDE" || test -z "$RUBYLIB" ; then SKIP_RUBY="1" fi SKIP_PHP= if test -z "$PHP" || test -z "$PHPINC" ; then SKIP_PHP="1" fi SKIP_OCAML= if test -z "$OCAMLC" || test -z "$CAMLP4" ; then SKIP_OCAML="1" fi SKIP_CSHARP= if test -z "$CSHARPCOMPILER" ; then SKIP_CSHARP="1" else if test "cscc" = "$CSHARPCOMPILER" && test -z "$CSHARPCILINTERPRETER" ; then SKIP_CSHARP="1" fi fi SKIP_LUA= # we need LUABIN & dynamic loading if test -z "$LUABIN" || test -z "$LUADYNAMICLOADLIB"; then SKIP_LUA="1" fi SKIP_R= if test -z "$RBIN" ; then SKIP_R="1" fi SKIP_SCILAB= if test -z "$SCILAB"; then SKIP_SCILAB="1" fi SKIP_GO= if test -z "$GO" ; then SKIP_GO="1" fi SKIP_D= if test -z "$DDEFAULTVERSION" ; then SKIP_D="1" fi #---------------------------------------------------------------- # Additional language dependencies #---------------------------------------------------------------- SKIP_ANDROID= if test -z "$ANDROID" || test -z "$ADB" || test -z "$ANT" || test -z "$NDKBUILD" ; then SKIP_ANDROID="1" fi #---------------------------------------------------------------- # Miscellaneous #---------------------------------------------------------------- ABS_SRCDIR=`(cd ${srcdir} && pwd)` case $host in *-*-mingw* ) ABS_SRCDIR=`${srcdir}/Tools/convertpath -m $ABS_SRCDIR` ;; *-*-cygwin* ) ABS_SRCDIR=`cygpath --mixed $ABS_SRCDIR` ;; esac # Root directory ROOT_DIR=`pwd` case $host in *-*-cygwin*) # Translate path for native Windows compilers for use with 'make check' if (cygpath --mixed $ROOT_DIR) >/dev/null 2>/dev/null; then ROOT_DIR=`cygpath --mixed $ROOT_DIR` fi ;; esac case $host in *-*-cygwin* | *-*-mingw*) # Extra files generated by some Windows compilers EXTRA_CLEAN="*.stackdump *.exp *.lib *.pdb *.ilk" ;; esac # Configure SWIG_LIB path # Check whether --with-swiglibdir was given. if test "${with_swiglibdir+set}" = set; then : withval=$with_swiglibdir; swig_lib="$withval" else swig_lib="${datadir}/swig/${PACKAGE_VERSION}" fi SWIG_LIB_INSTALL=${swig_lib} prefix_NONE= exec_prefix_NONE= test "x$prefix" = xNONE && prefix_NONE=yes && prefix=$ac_default_prefix test "x$exec_prefix" = xNONE && exec_prefix_NONE=yes && exec_prefix=$prefix eval ac_define_dir="\"$swig_lib\"" eval ac_define_dir="\"$ac_define_dir\"" SWIG_LIB="$ac_define_dir" cat >>confdefs.h <<_ACEOF #define SWIG_LIB "$ac_define_dir" _ACEOF test "$prefix_NONE" && prefix=NONE test "$exec_prefix_NONE" && exec_prefix=NONE case $build in # Windows does not understand unix directories. Convert into a windows directory with drive letter. *-*-mingw*) SWIG_LIB_WIN_UNIX=`${srcdir}/Tools/convertpath -m $SWIG_LIB`;; *-*-cygwin*) SWIG_LIB_WIN_UNIX=`cygpath --mixed "$SWIG_LIB"`;; *) SWIG_LIB_WIN_UNIX="";; esac cat >>confdefs.h <<_ACEOF #define SWIG_LIB_WIN_UNIX "$SWIG_LIB_WIN_UNIX" _ACEOF SWIG_LIB_PREINST=$ABS_SRCDIR/Lib SWIG_LIB_SET="env SWIG_LIB=\$(SWIG_LIB_DIR)" if test "${srcdir}" = "."; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef _WIN32 yes #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "yes" >/dev/null 2>&1; then : SWIG_LIB_SET="env SWIG_LIB=" fi rm -f conftest* fi ac_config_files="$ac_config_files Makefile swig.spec Examples/Makefile Examples/d/example.mk Examples/xml/Makefile Examples/test-suite/errors/Makefile Examples/test-suite/csharp/Makefile Examples/test-suite/d/Makefile Examples/test-suite/guile/Makefile Examples/test-suite/java/Makefile Examples/test-suite/javascript/Makefile Examples/test-suite/mzscheme/Makefile Examples/test-suite/ocaml/Makefile Examples/test-suite/octave/Makefile Examples/test-suite/perl5/Makefile Examples/test-suite/php/Makefile Examples/test-suite/python/Makefile Examples/test-suite/ruby/Makefile Examples/test-suite/scilab/Makefile Examples/test-suite/tcl/Makefile Examples/test-suite/lua/Makefile Examples/test-suite/r/Makefile Examples/test-suite/go/Makefile Source/Makefile Tools/javascript/Makefile" ac_config_files="$ac_config_files preinst-swig" ac_config_files="$ac_config_files CCache/ccache_swig_config.h" #-------------------------------------------------------------------- # Building Examples/ out of source directory #-------------------------------------------------------------------- # If building out of source tree, replicate Examples/ source tree in # build directory, and copy over Makefiles from source directory. # Prefix each Makefile with a header which sets SRCDIR to the relative # source directory, and provides a rule for updating the Makefile from # its original source. ac_config_commands="$ac_config_commands Examples" #-------------------------------------------------------------------- cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs { $as_echo "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5 $as_echo_n "checking that generated files are newer than configure... " >&6; } if test -n "$am_sleep_pid"; then # Hide warnings about reused PIDs. wait $am_sleep_pid 2>/dev/null fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5 $as_echo "done" >&6; } if test -n "$EXEEXT"; then am__EXEEXT_TRUE= am__EXEEXT_FALSE='#' else am__EXEEXT_TRUE='#' am__EXEEXT_FALSE= fi if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then as_fn_error $? "conditional \"AMDEP\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCXX\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by swig $as_me 4.0.1, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac case $ac_config_headers in *" "*) set x $ac_config_headers; shift; ac_config_headers=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" config_headers="$ac_config_headers" config_commands="$ac_config_commands" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE --header=FILE[:TEMPLATE] instantiate the configuration header FILE Configuration files: $config_files Configuration headers: $config_headers Configuration commands: $config_commands Report bugs to ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ swig config.status 4.0.1 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" Copyright (C) 2012 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' MKDIR_P='$MKDIR_P' AWK='$AWK' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append CONFIG_HEADERS " '$ac_optarg'" ac_need_defaults=false;; --he | --h) # Conflict between --help and --header as_fn_error $? "ambiguous option: \`$1' Try \`$0 --help' for more information.";; --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # # INIT-COMMANDS # AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "Source/Include/swigconfig.h") CONFIG_HEADERS="$CONFIG_HEADERS Source/Include/swigconfig.h" ;; "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "swig.spec") CONFIG_FILES="$CONFIG_FILES swig.spec" ;; "Examples/Makefile") CONFIG_FILES="$CONFIG_FILES Examples/Makefile" ;; "Examples/d/example.mk") CONFIG_FILES="$CONFIG_FILES Examples/d/example.mk" ;; "Examples/xml/Makefile") CONFIG_FILES="$CONFIG_FILES Examples/xml/Makefile" ;; "Examples/test-suite/errors/Makefile") CONFIG_FILES="$CONFIG_FILES Examples/test-suite/errors/Makefile" ;; "Examples/test-suite/csharp/Makefile") CONFIG_FILES="$CONFIG_FILES Examples/test-suite/csharp/Makefile" ;; "Examples/test-suite/d/Makefile") CONFIG_FILES="$CONFIG_FILES Examples/test-suite/d/Makefile" ;; "Examples/test-suite/guile/Makefile") CONFIG_FILES="$CONFIG_FILES Examples/test-suite/guile/Makefile" ;; "Examples/test-suite/java/Makefile") CONFIG_FILES="$CONFIG_FILES Examples/test-suite/java/Makefile" ;; "Examples/test-suite/javascript/Makefile") CONFIG_FILES="$CONFIG_FILES Examples/test-suite/javascript/Makefile" ;; "Examples/test-suite/mzscheme/Makefile") CONFIG_FILES="$CONFIG_FILES Examples/test-suite/mzscheme/Makefile" ;; "Examples/test-suite/ocaml/Makefile") CONFIG_FILES="$CONFIG_FILES Examples/test-suite/ocaml/Makefile" ;; "Examples/test-suite/octave/Makefile") CONFIG_FILES="$CONFIG_FILES Examples/test-suite/octave/Makefile" ;; "Examples/test-suite/perl5/Makefile") CONFIG_FILES="$CONFIG_FILES Examples/test-suite/perl5/Makefile" ;; "Examples/test-suite/php/Makefile") CONFIG_FILES="$CONFIG_FILES Examples/test-suite/php/Makefile" ;; "Examples/test-suite/python/Makefile") CONFIG_FILES="$CONFIG_FILES Examples/test-suite/python/Makefile" ;; "Examples/test-suite/ruby/Makefile") CONFIG_FILES="$CONFIG_FILES Examples/test-suite/ruby/Makefile" ;; "Examples/test-suite/scilab/Makefile") CONFIG_FILES="$CONFIG_FILES Examples/test-suite/scilab/Makefile" ;; "Examples/test-suite/tcl/Makefile") CONFIG_FILES="$CONFIG_FILES Examples/test-suite/tcl/Makefile" ;; "Examples/test-suite/lua/Makefile") CONFIG_FILES="$CONFIG_FILES Examples/test-suite/lua/Makefile" ;; "Examples/test-suite/r/Makefile") CONFIG_FILES="$CONFIG_FILES Examples/test-suite/r/Makefile" ;; "Examples/test-suite/go/Makefile") CONFIG_FILES="$CONFIG_FILES Examples/test-suite/go/Makefile" ;; "Source/Makefile") CONFIG_FILES="$CONFIG_FILES Source/Makefile" ;; "Tools/javascript/Makefile") CONFIG_FILES="$CONFIG_FILES Tools/javascript/Makefile" ;; "preinst-swig") CONFIG_FILES="$CONFIG_FILES preinst-swig" ;; "CCache/ccache_swig_config.h") CONFIG_FILES="$CONFIG_FILES CCache/ccache_swig_config.h" ;; "Examples") CONFIG_COMMANDS="$CONFIG_COMMANDS Examples" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" # Set up the scripts for CONFIG_HEADERS section. # No need to generate them if there are no CONFIG_HEADERS. # This happens for instance with `./config.status Makefile'. if test -n "$CONFIG_HEADERS"; then cat >"$ac_tmp/defines.awk" <<\_ACAWK || BEGIN { _ACEOF # Transform confdefs.h into an awk script `defines.awk', embedded as # here-document in config.status, that substitutes the proper values into # config.h.in to produce config.h. # Create a delimiter string that does not exist in confdefs.h, to ease # handling of long lines. ac_delim='%!_!# ' for ac_last_try in false false :; do ac_tt=`sed -n "/$ac_delim/p" confdefs.h` if test -z "$ac_tt"; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done # For the awk script, D is an array of macro values keyed by name, # likewise P contains macro parameters if any. Preserve backslash # newline sequences. ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* sed -n ' s/.\{148\}/&'"$ac_delim"'/g t rset :rset s/^[ ]*#[ ]*define[ ][ ]*/ / t def d :def s/\\$// t bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3"/p s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p d :bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3\\\\\\n"\\/p t cont s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p t cont d :cont n s/.\{148\}/&'"$ac_delim"'/g t clear :clear s/\\$// t bsnlc s/["\\]/\\&/g; s/^/"/; s/$/"/p d :bsnlc s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p b cont ' >$CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 for (key in D) D_is_set[key] = 1 FS = "" } /^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { line = \$ 0 split(line, arg, " ") if (arg[1] == "#") { defundef = arg[2] mac1 = arg[3] } else { defundef = substr(arg[1], 2) mac1 = arg[2] } split(mac1, mac2, "(") #) macro = mac2[1] prefix = substr(line, 1, index(line, defundef) - 1) if (D_is_set[macro]) { # Preserve the white space surrounding the "#". print prefix "define", macro P[macro] D[macro] next } else { # Replace #undef with comments. This is necessary, for example, # in the case of _POSIX_SOURCE, which is predefined and required # on some systems where configure will not decide to define it. if (defundef == "undef") { print "/*", prefix defundef, macro, "*/" next } } } { print } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 fi # test -n "$CONFIG_HEADERS" eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS" shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac ac_MKDIR_P=$MKDIR_P case $MKDIR_P in [\\/$]* | ?:[\\/]* ) ;; */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t s&@MKDIR_P@&$ac_MKDIR_P&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; :H) # # CONFIG_HEADER # if test x"$ac_file" != x-; then { $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" } >"$ac_tmp/config.h" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 $as_echo "$as_me: $ac_file is unchanged" >&6;} else rm -f "$ac_file" mv "$ac_tmp/config.h" "$ac_file" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 fi else $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ || as_fn_error $? "could not create -" "$LINENO" 5 fi # Compute "$ac_file"'s index in $config_headers. _am_arg="$ac_file" _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" || $as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$_am_arg" : 'X\(//\)[^/]' \| \ X"$_am_arg" : 'X\(//\)$' \| \ X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$_am_arg" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'`/stamp-h$_am_stamp_count ;; :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 $as_echo "$as_me: executing $ac_file commands" >&6;} ;; esac case $ac_file$ac_mode in "depfiles":C) test x"$AMDEP_TRUE" != x"" || { # Older Autoconf quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named 'Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`$as_dirname -- "$mf" || $as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$mf" : 'X\(//\)[^/]' \| \ X"$mf" : 'X\(//\)$' \| \ X"$mf" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$mf" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running 'make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "$am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`$as_dirname -- "$file" || $as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$file" : 'X\(//\)[^/]' \| \ X"$file" : 'X\(//\)$' \| \ X"$file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir=$dirpart/$fdir; as_fn_mkdir_p # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ;; "preinst-swig":F) chmod +x preinst-swig ;; "Examples":C) if test "x${srcdir}" != "x." ; then { $as_echo "$as_me:${as_lineno-$LINENO}: generating Examples build tree" >&5 $as_echo "$as_me: generating Examples build tree" >&6;} for mkfile in `cd ${srcdir} && find Examples/ -type f -name Makefile`; do dir=`dirname ${mkfile}` d=${dir} reldir="" while test "x$d" != "x." ; do d=`dirname $d` reldir="${reldir}../" done relsrcdir=${reldir}${srcdir}/ as_dir=${dir}; as_fn_mkdir_p cat <${mkfile} # DO NOT EDIT: instead edit ${relsrcdir}${mkfile} # and run (cd ${reldir} && ./config.status) to regenerate TOP_BUILDDIR_TO_TOP_SRCDIR = ${srcdir}/ SRCDIR = ${relsrcdir}${dir}/ EOF cat ${srcdir}/${mkfile} >>${mkfile} done fi ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi # # CONFIG_SUBDIRS section. # if test "$no_recursion" != yes; then # Remove --cache-file, --srcdir, and --disable-option-checking arguments # so they do not pile up. ac_sub_configure_args= ac_prev= eval "set x $ac_configure_args" shift for ac_arg do if test -n "$ac_prev"; then ac_prev= continue fi case $ac_arg in -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* \ | --c=*) ;; --config-cache | -C) ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) ;; --disable-option-checking) ;; *) case $ac_arg in *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append ac_sub_configure_args " '$ac_arg'" ;; esac done # Always prepend --prefix to ensure using the same prefix # in subdir configurations. ac_arg="--prefix=$prefix" case $ac_arg in *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac ac_sub_configure_args="'$ac_arg' $ac_sub_configure_args" # Pass --silent if test "$silent" = yes; then ac_sub_configure_args="--silent $ac_sub_configure_args" fi # Always prepend --disable-option-checking to silence warnings, since # different subdirs can have different --enable and --with options. ac_sub_configure_args="--disable-option-checking $ac_sub_configure_args" ac_popdir=`pwd` for ac_dir in : $subdirs; do test "x$ac_dir" = x: && continue # Do not complain, so a configure script can configure whichever # parts of a large source tree are present. test -d "$srcdir/$ac_dir" || continue ac_msg="=== configuring in $ac_dir (`pwd`/$ac_dir)" $as_echo "$as_me:${as_lineno-$LINENO}: $ac_msg" >&5 $as_echo "$ac_msg" >&6 as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" # Check for guested configure; otherwise get Cygnus style configure. if test -f "$ac_srcdir/configure.gnu"; then ac_sub_configure=$ac_srcdir/configure.gnu elif test -f "$ac_srcdir/configure"; then ac_sub_configure=$ac_srcdir/configure elif test -f "$ac_srcdir/configure.in"; then # This should be Cygnus configure. ac_sub_configure=$ac_aux_dir/configure else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: no configuration information is in $ac_dir" >&5 $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2;} ac_sub_configure= fi # The recursion is here. if test -n "$ac_sub_configure"; then # Make the cache file name correct relative to the subdirectory. case $cache_file in [\\/]* | ?:[\\/]* ) ac_sub_cache_file=$cache_file ;; *) # Relative name. ac_sub_cache_file=$ac_top_build_prefix$cache_file ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: running $SHELL $ac_sub_configure $ac_sub_configure_args --cache-file=$ac_sub_cache_file --srcdir=$ac_srcdir" >&5 $as_echo "$as_me: running $SHELL $ac_sub_configure $ac_sub_configure_args --cache-file=$ac_sub_cache_file --srcdir=$ac_srcdir" >&6;} # The eval makes quoting arguments work. eval "\$SHELL \"\$ac_sub_configure\" $ac_sub_configure_args \ --cache-file=\"\$ac_sub_cache_file\" --srcdir=\"\$ac_srcdir\"" || as_fn_error $? "$ac_sub_configure failed for $ac_dir" "$LINENO" 5 fi cd "$ac_popdir" done fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi langs="" test -n "$SKIP_CSHARP" || langs="${langs}csharp " test -n "$SKIP_D" || langs="${langs}d " test -n "$SKIP_GO" || langs="${langs}go " test -n "$SKIP_GUILE" || langs="${langs}guile " test -n "$SKIP_JAVA" || langs="${langs}java " test -n "$SKIP_JAVASCRIPT" || langs="${langs}javascript " test -n "$SKIP_LUA" || langs="${langs}lua " test -n "$SKIP_MZSCHEME" || langs="${langs}mzscheme " test -n "$SKIP_OCAML" || langs="${langs}ocaml " test -n "$SKIP_OCTAVE" || langs="${langs}octave " test -n "$SKIP_PERL5" || langs="${langs}perl5 " test -n "$SKIP_PHP" || langs="${langs}php " test -n "$SKIP_PYTHON" || langs="${langs}python " test -n "$SKIP_R" || langs="${langs}r " test -n "$SKIP_RUBY" || langs="${langs}ruby " test -n "$SKIP_SCILAB" || langs="${langs}scilab " test -n "$SKIP_TCL" || langs="${langs}tcl " echo " The SWIG test-suite and examples are configured for the following languages: $langs " swig-4.0.1/RELEASENOTES0000644000175000017500000004634513527063513014200 0ustar williamwilliamThis file contains a brief overview of the changes made in each release. A detailed description of changes are available in the CHANGES.current and CHANGES files. Release Notes ============= Detailed release notes are available with the release and are also published on the SWIG web site at http://swig.org/release.html. SWIG-4.0.1 summary: - SWIG now cleans up on error by removing all generated files. - Add Python 3.8 support. - Python Sphinx compatibility added for Doxygen comments. - Some minor regressions introduced in 4.0.0 were fixed. - Fix some C++17 compatibility problems in Python and Ruby generated code. - Minor improvements/fixes for C#, Java, Javascript, Lua, MzScheme, Ocaml, Octave and Python. SWIG-4.0.0 summary: - Support for Doxygen documentation comments which are parsed and converted into JavaDoc or PyDoc comments. - STL wrappers improved for C#, Java and Ruby. - C++11 STL containers added for Java, Python and Ruby. - Improved support for parsing C++11 and C++14 code. - Various fixes for shared_ptr. - Various C preprocessor corner case fixes. - Corner case fixes for member function pointers. - Python module overhaul by simplifying the generated code and turning most optimizations on by default. - %template improvements wrt scoping to align with C++ explicit template instantiations. - Added support for a command-line options file (sometimes called a response file). - Numerous enhancements and fixes for all supported target languages. - SWIG now classifies the status of target languages into either 'Experimental' or 'Supported' to indicate the expected maturity level. - Support for CFFI, Allegrocl, Chicken, CLISP, S-EXP, UFFI, Pike, Modula3 has been removed. - Octave 4.4-5.1 support added. - PHP5 support removed, PHP7 is now the supported PHP version. - Minimum Python version required is now 2.7, 3.2-3.7 are the only other versions supported. - Added support for Javascript NodeJS versions 2-10. - OCaml support is much improved and updated, minimum OCaml version required is now 3.12.0. SWIG-3.0.12 summary: - Add support for Octave-4.2. - Enhance %extend to support template functions. - Language specific enhancements and fixes for C#, D, Guile, Java, PHP7. SWIG-3.0.11 summary: - PHP 7 support added. - C++11 alias templates and type aliasing support added. - Minor fixes and enhancements for C# Go Guile Java Javascript Octave PHP Python R Ruby Scilab XML. SWIG-3.0.10 summary: - Regression fixes for smart pointers and importing Python modules. SWIG-3.0.9 summary: - Add support for Python's implicit namespace packages. - Fixes to support Go 1.6. - C++11 std::array support added for Java. - Improved C++ multiple inheritance support for Java/C# wrappers. - Various other minor fixes and improvements for C#, D, Go, Java, Javascript, Lua, Python, R, Ruby, Scilab. SWIG-3.0.8 summary: - pdf documentation enhancements. - Various Python 3.5 issues fixed. - std::array support added for Ruby and Python. - shared_ptr support added for Ruby. - Minor improvements for CFFI, Go, Java, Perl, Python, Ruby. SWIG-3.0.7 summary: - Add support for Octave-4.0.0. - Remove potential Android security exploit in generated Java classes. - Minor new features and bug fixes. SWIG-3.0.6 summary: - Stability and regression fixes. - Fixed parsing of C++ corner cases. - Language improvements and bug fixes for C#, Go, Java, Lua, Python, R. SWIG-3.0.5 summary: - Added support for Scilab. - Important Python regression fix when wrapping C++ default arguments. - Minor improvements for C#, Go, Octave, PHP and Python. SWIG-3.0.4 summary: - Python regression fix when wrapping C++ default arguments. - Improved error messages. SWIG-3.0.3 summary: - Add support for C++11 strongly typed enumerations. - Numerous bug fixes and minor enhancements for C#, D, Go, Java, Javascript, PHP, Perl and Python wrappers. SWIG-3.0.2 summary: - Bug fix during install and a couple of other minor changes. SWIG-3.0.1 summary: - Javascript module added. This supports JavascriptCore (Safari/Webkit), v8 (Chromium) and node.js currently. - A few notable regressions introduced in 3.0.0 have been fixed - in Lua, nested classes and parsing of operator <<. - The usual round of bug fixes and minor improvements for: C#, GCJ, Go, Java, Lua, PHP and Python. SWIG-3.0.0 summary: - This is a major new release focusing primarily on C++ improvements. - C++11 support added. Please see documentation for details of supported features: http://www.swig.org/Doc3.0/CPlusPlus11.html - Nested class support added. This has been taken full advantage of in Java and C#. Other languages can use the nested classes, but require further work for a more natural integration into the target language. We urge folk knowledgeable in the other target languages to step forward and help with this effort. - Lua: improved metatables and support for %nspace. - Go 1.3 support added. - Python import improvements including relative imports. - Python 3.3 support completed. - Perl director support added. - C# .NET 2 support is now the minimum. Generated using statements are replaced by fully qualified names. - Bug fixes and improvements to the following languages: C#, Go, Guile, Java, Lua, Perl, PHP, Python, Octave, R, Ruby, Tcl - Various other bug fixes and improvements affecting all languages. - Note that this release contains some backwards incompatible changes in some languages. - Full detailed release notes are in the changes file. SWIG-2.0.12 summary: - This is a maintenance release backporting some fixes from the pending 3.0.0 release. - Octave 3.8 support added. - C++11 support for new versions of erase/insert in the STL containers. - Compilation fixes on some systems for the generated Lua, PHP, Python and R wrappers. SWIG-2.0.11 summary: - Minor bug fixes and enhancements mostly in Python, but also C#, Lua, Ocaml, Octave, Perl, PHP, Python, R, Ruby, Tcl. SWIG-2.0.10 summary: - Ruby 1.9 support is now complete. - Add support for Guile 2.0 and Guile 1.6 support (GH interface) has been dropped. - Various small language neutral improvements and fixes. - Various bug fixes and minor improvements specific to C#, CFFI, D, Java, Octave, PHP, Python, - Minor bug fix in ccache-swig. - Development has moved to Github with Travis continuous integration testing - patches using https://github.com/swig/swig are welcome. SWIG-2.0.9 summary: - Improved typemap matching. - Ruby 1.9 support is much improved. - Various bug fixes and minor improvements in C#, CFFI, Go, Java, Modula3, Octave, Perl, Python, R, Ruby, Tcl and in ccache-swig. SWIG-2.0.8 summary: - Fix a couple of regressions introduced in 2.0.5 and 2.0.7. - Improved using declarations and using directives support. - Minor fixes/enhancements for C#, Java, Octave, Perl and Python. SWIG-2.0.7 summary: - Important regression fixes since 2.0.5 for typemaps in general and in Python. - Fixes and enhancements for Go, Java, Octave and PHP. SWIG-2.0.6 summary: - Regression fix for Python STL wrappers on some systems. SWIG-2.0.5 summary: - Official Android support added including documentation and examples. - Improvements involving templates: 1) Various fixes with templates and typedef types. 2) Some template lookup problems fixed. 3) Templated type fixes to use correct typemaps. - Autodoc documentation generation improvements. - Python STL container wrappers improvements including addition of stepped slicing. - Approximately 70 fixes and minor enhancements for the following target languages: AllegroCL, C#, D, Go, Java, Lua, Ocaml, Octave, Perl, PHP, Python, R, Ruby, Tcl, Xml. SWIG-2.0.4 summary: - This is mainly a Python oriented release including support for Python built-in types for superior performance with the new -builtin option. The -builtin option is especially suitable for performance-critical libraries and applications that call wrapped methods repeatedly. See the python-specific chapter of the SWIG manual for more info. - Python 3.2 support has also been added and various Python bugs have been fixed. - Octave 3.4 support has also been added. - There are also the usual minor generic improvements, as well as bug fixes and enhancements for D, Guile, Lua, Octave, Perl and Tcl. SWIG-2.0.3 summary: - A bug fix release including a couple of fixes for regressions in the 2.0 series. SWIG-2.0.2 summary: - Support for the D language has been added. - Various bug fixes and minor enhancements. - Bug fixes particular to the Clisp, C#, Go, MzScheme, Ocaml, PHP, R, Ruby target languages. SWIG-2.0.1 summary: - Support for the Go language has been added. - New regular expression (regex) encoder for renaming symbols based on the Perl Compatible Regular Expressions (PCRE) library. - Numerous fixes in reporting file and line numbers in error and warning messages. - Various bug fixes and improvements in the C#, Lua, Perl, PHP, Ruby and Python language modules. SWIG-2.0.0 summary: - License changes, see LICENSE file and http://www.swig.org/legal.html. - Much better nested class/struct support. - Much improved template partial specialization and explicit specialization handling. - Namespace support improved with the 'nspace' feature where namespaces can be automatically translated into Java packages or C# namespaces. - Improved typemap and symbol table debugging. - Numerous subtle typemap matching rule changes when using the default (SWIGTYPE) type. These now work much like C++ class template partial specialization matching. - Other small enhancements for typemaps. Typemap fragments are also now official and documented. - Warning and error display refinements. - Wrapping of shared_ptr is improved and documented now. - Numerous C++ unary scope operator (::) fixes. - Better support for boolean expressions. - Various bug fixes and improvements in the Allegrocl, C#, Java, Lua, Octave, PHP, Python, R, Ruby and XML modules. SWIG-1.3.40 summary: - SWIG now supports directors for PHP. - PHP support improved in general. - Octave 3.2 support added. - Various bug fixes/enhancements for Allegrocl, C#, Java, Octave, Perl, Python, Ruby and Tcl. - Other generic fixes and minor new features. SWIG-1.3.39 summary: - Some new small feature enhancements. - Improved C# std::vector wrappers. - Bug fixes: mainly Python, but also Perl, MzScheme, CFFI, Allegrocl and Ruby SWIG-1.3.38 summary: - Output directory regression fix and other minor bug fixes SWIG-1.3.37 summary: - Python 3 support added - SWIG now ships with a version of ccache that can be used with SWIG. This enables the files generated by SWIG to be cached so that repeated use of SWIG on unchanged input files speeds up builds quite considerably. - PHP 4 support removed and PHP support improved in general - Improved C# array support - Numerous Allegro CL improvements - Bug fixes/enhancements for Python, PHP, Java, C#, Chicken, Allegro CL, CFFI, Ruby, Tcl, Perl, R, Lua. - Other minor generic bug fixes and enhancements SWIG-1.3.36 summary: - Enhancement to directors to wrap all protected members - Optimisation feature for objects returned by value - A few bugs fixes in the PHP, Java, Ruby, R, C#, Python, Lua and Perl modules - Other minor generic bug fixes SWIG-1.3.35 summary: - Octave language module added - Bug fixes in Python, Lua, Java, C#, Perl modules - A few other generic bugs and runtime assertions fixed SWIG-1.3.34 summary: - shared_ptr support for Python - Support for latest R - version 2.6 - Various minor improvements/bug fixes for R, Lua, Python, Java, C# - A few other generic bug fixes, mainly for templates and using statements SWIG-1.3.33 summary: - Fix regression for Perl where C++ wrappers would not compile - Fix regression parsing macros SWIG-1.3.32 summary: - shared_ptr support for Java and C# - Enhanced STL support for Ruby - Windows support for R - Fixed long-standing memory leak in PHP Module - Numerous fixes and minor enhancements for Allegrocl, C#, cffi, Chicken, Guile, Java, Lua, Ocaml, Perl, PHP, Python, Ruby, Tcl. - Improved warning support SWIG-1.3.31 summary: - Python modern classes regression fix SWIG-1.3.30 summary: - Python-2.5 support - New language module: R - Director support added for C# - Numerous director fixes and improvements - Improved mingw/msys support - Better constants support in Guile and chicken modules - Support for generating PHP5 class wrappers - Important Java premature garbage collection fix - Minor improvements/fixes in cffi, php, allegrocl, perl, chicken, lua, ruby, ocaml, python, java, c# and guile language modules - Many many other bug fixes SWIG-1.3.29 summary: - Numerous important bug fixes - Few minor new features - Some performance improvements in generated code for Python SWIG-1.3.28 summary: - More powerful renaming (%rename) capability. - More user friendly warning handling. - Add finer control for default constructors and destructors. We discourage the use of the 'nodefault' option, which disables both constructors and destructors, leading to possible memory leaks. Use instead 'nodefaultctor' and/or 'nodefaultdtor'. - Automatic copy constructor wrapper generation via the 'copyctor' option/feature. - Better handling of Windows extensions and types. - Better runtime error reporting. - Add the %catches directive to catch and dispatch exceptions. - Add the %naturalvar directive for more 'natural' variable wrapping. - Better default handling of std::string variables using the %naturalvar directive. - Add the %allowexcept and %exceptionvar directives to handle exceptions when accessing a variable. - Add the %delobject directive to mark methods that act like destructors. - Add the -fastdispatch option to enable smaller and faster overload dispatch mechanism. - Template support for %rename, %feature and %typemap improved. - Add/doc more debug options, such as -dump_module, -debug_typemaps, etc. - Unified typemap library (UTL) potentially providing core typemaps for all scripting languages based on the recently evolving Python typemaps. - New language module: Common Lisp with CFFI. - Python, Ruby, Perl and Tcl use the new UTL, many old reported and hidden errors with typemaps are now fixed. - Initial Java support for languages using the UTL via GCJ, you can now use Java libraries in your favorite script language using gcj + swig. - Tcl support for std::wstring. - PHP4 module update, many error fixes and actively maintained again. - Allegrocl support for C++, also enhanced C support. - Ruby support for bang methods. - Ruby support for user classes as native exceptions. - Perl improved dispatching in overloaded functions via the new cast and rank mechanism. - Perl improved backward compatibility, 5.004 and later tested and working. - Python improved backward compatibility, 1.5.2 and later tested and working. - Python can use the same cast/rank mechanism via the -castmode option. - Python implicit conversion mechanism similar to C++, via the %implicitconv directive (replaces and improves the implicit.i library). - Python threading support added. - Python STL support improved, iterators are supported and STL containers can use now the native PyObject type. - Python many performance options and improvements, try the -O option to test all of them. Python runtime benchmarks show up to 20 times better performance compared to 1.3.27 and older versions. - Python support for 'multi-inheritance' on the python side. - Python simplified proxy classes, now swig doesn't need to generate the additional 'ClassPtr' classes. - Python extended support for smart pointers. - Python better support for static member variables. - Python backward compatibility improved, many projects that used to work only with swig-1.3.21 to swig-1.3.24 are working again with swig-1.3.28 - Python test-suite is now 'valgrinded' before release, and swig also reports memory leaks due to missing destructors. - Minor bug fixes and improvements to the Lua, Ruby, Java, C#, Python, Guile, Chicken, Tcl and Perl modules. SWIG-1.3.27 summary: - Fix bug in anonymous typedef structures which was leading to strange behaviour SWIG-1.3.26 summary: - New language modules: Lua, CLISP and Common Lisp with UFFI. - Big overhaul to the PHP module. - Change to the way 'extern' is handled. - Minor bug fixes specific to C#, Java, Modula3, Ocaml, Allegro CL, XML, Lisp s-expressions, Tcl, Ruby and Python modules. - Other minor improvements and bug fixes. SWIG-1.3.25 summary: - Improved runtime type system. Speed of module loading improved in modules with lots of types. SWIG_RUNTIME_VERSION has been increased from 1 to 2, but the API is exactly the same; only internal changes were made. - The languages that use the runtime type system now support external access to the runtime type system. - Various improvements with typemaps and template handling. - Fewer warnings in generated code. - Improved colour documentation. - Many C# module improvements (exception handling, prevention of early garbage collection, C# attributes support added, more flexible type marshalling/asymmetric types.) - Minor improvements and bug fixes specific to the C#, Java, TCL, Guile, Chicken, MzScheme, Perl, Php, Python, Ruby and Ocaml modules). - Various other bug fixes and memory leak fixes. SWIG-1.3.24 summary: - Improved enum handling - More runtime library options - More bugs fixes for templates and template default arguments, directors and other areas. - Better smart pointer support, including data members, static members and %extend. SWIG-1.3.23 summary: - Improved support for callbacks - Python docstring support and better error handling - C++ default argument support for Java and C# added. - Improved c++ default argument support for the scripting languages plus option to use original (compact) default arguments. - %feature and %ignore/%rename bug fixes and mods - they might need default arguments specified to maintain compatible behaviour when using the new default arguments wrapping. - Runtime library changes: Runtime code can now exist in more than one module and so need not be compiled into just one module - Further improved support for templates and namespaces - Overloaded templated function support added - More powerful default typemaps (mixed default typemaps) - Some important %extend and director code bug fixes - Guile now defaults to using SCM API. The old interface can be obtained by the -gh option. - Various minor improvements and bug fixes for C#, Chicken, Guile, Java, MzScheme, Perl, Python and Ruby - Improved dependencies generation for constructing Makefiles. SWIG-1.3.22 summary: - Improved exception handling and translation of C errors or C++ exceptions into target language exceptions. - Improved enum support, mapping to built-in Java 1.5 enums and C# enums or the typesafe enum pattern for these two languages. - Python - much better STL support and support for std::wstring, wchar_t and FILE *. - Initial support for Modula3 and Allegro CL. - 64 bit TCL support. - Java and C#'s proxy classes are now nearly 100% generated from typemaps and/or features for finer control on the generated code. - SWIG runtime library support deprecation. - Improved documentation. SWIG now additionally provides documentation in the form of a single HTML page as well as a pdf document. - Enhanced C++ friend declaration support. - Better support for reference counted classes. - Various %fragment improvements. - RPM fixes. - Various minor improvements and bug fixes for C#, Chicken, Guile, Java, MzScheme, Perl, Php, Python, Ruby and XML. swig-4.0.1/Lib/0000755000175000017500000000000013527234052013054 5ustar williamwilliamswig-4.0.1/Lib/windows.i0000644000175000017500000001012513527063513014721 0ustar williamwilliam/* ----------------------------------------------------------------------------- * windows.i * * SWIG library file to support types found in windows.h as well as Microsoft * integral type extensions. The types are set for 32 bit Windows. * ----------------------------------------------------------------------------- */ // Support for non ISO (Windows) integral types %apply unsigned char { unsigned __int8 }; %apply const unsigned char& { const unsigned __int8& }; %apply signed char { __int8 }; %apply const signed char& { const __int8& }; %apply unsigned short { unsigned __int16 }; %apply const unsigned short& { const unsigned __int16& }; %apply short { __int16 }; %apply const short& { const __int16& }; %apply unsigned int { unsigned __int32 }; %apply const unsigned int& { const unsigned __int32& }; %apply int { __int32 }; %apply const int& { const __int32& }; %apply unsigned long long { unsigned __int64 }; %apply const unsigned long long& { const unsigned __int64& }; %apply long long { __int64 }; %apply const long long& { const __int64& }; // Workaround Microsoft calling conventions #define __cdecl #define __fastcall #define __far #define __forceinline #define __fortran #define __inline #define __pascal #define __stdcall #define __syscall #define _cdecl #define _fastcall #define _inline #define _pascal #define _stdcall #define WINAPI #define __declspec(WINDOWS_EXTENDED_ATTRIBUTE) #define __w64 // Types from windef.h typedef unsigned long ULONG; typedef ULONG *PULONG; typedef unsigned short USHORT; typedef USHORT *PUSHORT; typedef unsigned char UCHAR; typedef UCHAR *PUCHAR; typedef char *PSZ; typedef unsigned long DWORD; typedef int BOOL; typedef unsigned char BYTE; typedef unsigned short WORD; typedef float FLOAT; typedef FLOAT *PFLOAT; typedef BOOL *PBOOL; typedef BOOL *LPBOOL; typedef BYTE *PBYTE; typedef BYTE *LPBYTE; typedef int *PINT; typedef int *LPINT; typedef WORD *PWORD; typedef WORD *LPWORD; typedef long *LPLONG; typedef DWORD *PDWORD; typedef DWORD *LPDWORD; typedef void *LPVOID; typedef const void *LPCVOID; typedef int INT; typedef unsigned int UINT; typedef unsigned int *PUINT; // Types from basetsd.h typedef signed char INT8, *PINT8; typedef signed short INT16, *PINT16; typedef signed int INT32, *PINT32; typedef signed __int64 INT64, *PINT64; typedef unsigned char UINT8, *PUINT8; typedef unsigned short UINT16, *PUINT16; typedef unsigned int UINT32, *PUINT32; typedef unsigned __int64 UINT64, *PUINT64; typedef signed int LONG32, *PLONG32; typedef unsigned int ULONG32, *PULONG32; typedef unsigned int DWORD32, *PDWORD32; typedef __w64 int INT_PTR, *PINT_PTR; typedef __w64 unsigned int UINT_PTR, *PUINT_PTR; typedef __w64 long LONG_PTR, *PLONG_PTR; typedef __w64 unsigned long ULONG_PTR, *PULONG_PTR; typedef unsigned short UHALF_PTR, *PUHALF_PTR; typedef short HALF_PTR, *PHALF_PTR; typedef __w64 long SHANDLE_PTR; typedef __w64 unsigned long HANDLE_PTR; typedef ULONG_PTR SIZE_T, *PSIZE_T; typedef LONG_PTR SSIZE_T, *PSSIZE_T; typedef ULONG_PTR DWORD_PTR, *PDWORD_PTR; typedef __int64 LONG64, *PLONG64; typedef unsigned __int64 ULONG64, *PULONG64; typedef unsigned __int64 DWORD64, *PDWORD64; // Types from winnt.h typedef void *PVOID; typedef void *PVOID64; #ifndef VOID #define VOID void #endif typedef char CHAR; typedef short SHORT; typedef long LONG; typedef CHAR *PCHAR; typedef CHAR *LPCH, *PCH; typedef const CHAR *LPCCH, *PCCH; typedef CHAR *NPSTR; typedef CHAR *LPSTR, *PSTR; typedef const CHAR *LPCSTR, *PCSTR; typedef char TCHAR, *PTCHAR; typedef unsigned char TBYTE , *PTBYTE ; typedef LPSTR LPTCH, PTCH; typedef LPSTR PTSTR, LPTSTR, PUTSTR, LPUTSTR; typedef LPCSTR PCTSTR, LPCTSTR, PCUTSTR, LPCUTSTR; typedef SHORT *PSHORT; typedef LONG *PLONG; typedef void *HANDLE; typedef HANDLE *PHANDLE; typedef BYTE FCHAR; typedef WORD FSHORT; typedef DWORD FLONG; typedef LONG HRESULT; typedef char CCHAR; typedef DWORD LCID; typedef PDWORD PLCID; typedef WORD LANGID; typedef __int64 LONGLONG; typedef unsigned __int64 ULONGLONG; typedef LONGLONG *PLONGLONG; typedef ULONGLONG *PULONGLONG; typedef ULONGLONG DWORDLONG; typedef DWORDLONG *PDWORDLONG; typedef BYTE BOOLEAN; typedef BOOLEAN *PBOOLEAN; swig-4.0.1/Lib/pike/0000755000175000017500000000000013527063513014006 5ustar williamwilliamswig-4.0.1/Lib/pike/pikekw.swg0000644000175000017500000000152113527063513016021 0ustar williamwilliam#ifndef PIKE_PIKEKW_SWG_ #define PIKE_PIKEKW_SWG_ /* Warnings for Pike keywords */ #define PIKEKW(x) %namewarn("314: '" #x "' is a pike keyword") #x /* from http://www.http://docs.linux.cz/pike/tutorial_C.html */ PIKEKW(array); PIKEKW(break); PIKEKW(case); PIKEKW(catch); PIKEKW(continue); PIKEKW(default); PIKEKW(do); PIKEKW(else); PIKEKW(float); PIKEKW(for); PIKEKW(foreach); PIKEKW(function); PIKEKW(gauge); PIKEKW(if); PIKEKW(inherit); PIKEKW(inline); PIKEKW(int); PIKEKW(lambda); PIKEKW(mapping); PIKEKW(mixed); PIKEKW(multiset); PIKEKW(nomask); PIKEKW(object); PIKEKW(predef); PIKEKW(private); PIKEKW(program); PIKEKW(protected); PIKEKW(public); PIKEKW(return); PIKEKW(sscanf); PIKEKW(static); PIKEKW(string); PIKEKW(switch); PIKEKW(typeof); PIKEKW(varargs); PIKEKW(void); PIKEKW(while); #undef PIKEKW #endif //PIKE_PIKEKW_SWG_ swig-4.0.1/Lib/pike/pike.swg0000644000175000017500000002271713527063513015471 0ustar williamwilliam/* ----------------------------------------------------------------------------- * pike.swg * * Pike configuration module. * ----------------------------------------------------------------------------- */ %insert(runtime) "swigrun.swg"; // Common C API type-checking code %insert(runtime) "pikerun.swg"; // Pike run-time code %insert(runtime) %{ #ifdef __cplusplus extern "C" { #endif #include #include #include #ifdef __cplusplus } #endif %} /* ----------------------------------------------------------------------------- * standard typemaps * ----------------------------------------------------------------------------- */ /* --- Input arguments --- */ /* Primitive datatypes. */ %typemap(in, pikedesc="tInt") int, unsigned int, short, unsigned short, long, unsigned long, char, signed char, unsigned char, bool, enum SWIGTYPE, long long, unsigned long long { if ($input.type != T_INT) Pike_error("Bad argument: Expected an integer.\n"); $1 = ($1_ltype) $input.u.integer; } %typemap(in, pikedesc="tFloat") float, double { if ($input.type != T_FLOAT) Pike_error("Bad argument: Expected a float.\n"); $1 = ($1_ltype) $input.u.float_number; } %typemap(in, pikedesc="tStr") char *, char [ANY] { if ($input.type != T_STRING) Pike_error("Bad argument: Expected a string.\n"); $1 = ($1_ltype) STR0($input.u.string); } /* Pointers, references and arrays */ %typemap(in) SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE [] "SWIG_ConvertPtr($input.u.object, (void **) &$1, $1_descriptor, 1);" /* Void pointer. Accepts any kind of pointer */ %typemap(in) void * "/* FIXME */"; /* Object passed by value. Convert to a pointer */ %typemap(in) SWIGTYPE ($&1_ltype argp) "/* FIXME */"; /* Pointer to a class member */ %typemap(in) SWIGTYPE (CLASS::*) "/* FIXME */"; /* Const primitive references. Passed by value */ %typemap(in, pikedesc="tInt") const int & (int temp), const short & (short temp), const long & (long temp), const unsigned int & (unsigned int temp), const unsigned short & (unsigned short temp), const unsigned long & (unsigned long temp), const char & (char temp), const signed char & (signed char temp), const unsigned char & (unsigned char temp), const bool & (bool temp), const long long & ($*1_ltype temp), const unsigned long long & ($*1_ltype temp), const enum SWIGTYPE & ($*1_ltype temp), const enum SWIGTYPE && ($*1_ltype temp) { if ($input.type != T_INT) Pike_error("Bad argument: Expected an integer.\n"); temp = ($*1_ltype) $input.u.integer; $1 = &temp; } %typemap(in, pikedesc="tFloat") const float & (float temp), const double & (double temp) { if ($input.type != T_FLOAT) Pike_error("Bad argument: Expected a float.\n"); temp = ($*1_ltype) $input.u.float_number; $1 = &temp; } /* ----------------------------------------------------------------------------- * Output Typemaps * ----------------------------------------------------------------------------- */ %typemap(out, pikedesc="tInt") int, unsigned int, short, unsigned short, long, unsigned long, char, signed char, unsigned char, bool, enum SWIGTYPE "push_int($1);"; %typemap(out, pikedesc="tInt") long long "push_int64($1);"; %typemap(out, pikedesc="tInt") unsigned long long "push_int64($1);"; %typemap(out, pikedesc="tFloat") float, double "push_float($1);"; %typemap(out, pikedesc="tStr") char * "push_text($1);"; /* Pointers, references, and arrays */ %typemap(out, pikedesc="tObj") SWIGTYPE*, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE [] "push_object(SWIG_NewPointerObj((void *) $1, $1_descriptor, $owner));"; /* Void return value; don't push anything */ %typemap(out, pikedesc="tVoid") void ""; /* Dynamic casts */ %typemap(out) SWIGTYPE *DYNAMIC, SWIGTYPE &DYNAMIC "/* FIXME */"; /* Member pointer */ %typemap(out) SWIGTYPE (CLASS::*) "/* FIXME */"; /* Special typemap for character array return values */ %typemap(out, pikedesc="tStr") char [ANY], const char [ANY] "push_text($1);"; /* Primitive types--return by value */ %typemap(out, pikedesc="tObj") SWIGTYPE #ifdef __cplusplus { $&1_ltype resultptr; resultptr = new $1_ltype((const $1_ltype &) $1); push_object(SWIG_NewPointerObj((void *) resultptr, $&1_descriptor, 1)); } #else { $&1_ltype resultptr; resultptr = ($&1_ltype) malloc(sizeof($1_type)); memmove(resultptr, &$1, sizeof($1_type)); push_object(SWIG_NewPointerObj((void *) resultptr, $&1_descriptor, 1)); } #endif /* References to primitive types. Return by value */ %typemap(out, pikedesc="tInt") const int &, const unsigned int &, const short &, const unsigned short &, const long &, const unsigned long &, const char &, const signed char &, const unsigned char &, const bool &, const long long &, const unsigned long long &, const enum SWIGTYPE & ($*1_ltype temp), const enum SWIGTYPE && ($*1_ltype temp) "push_int(*($1));"; %typemap(out, pikedesc="tFloat") const float &, const double & "push_float(*($1));"; /************************ Constant Typemaps *****************************/ %typemap(constant) int, unsigned int, short, unsigned short, long, unsigned long, signed char, unsigned char, bool, enum SWIGTYPE, long long, unsigned long long "add_integer_constant(\"$symname\", $1, 0);"; %typemap(constant) char "add_integer_constant(\"$symname\", '$1', 0);"; %typemap(constant) long long, unsigned long long "add_integer_constant(\"$symname\", $1, 0);"; %typemap(constant) float, double "add_float_constant(\"$symname\", $1, 0);"; %typemap(constant) char * "add_string_constant(\"$symname\", \"$1\", 0);"; /* ------------------------------------------------------------ * String & length * ------------------------------------------------------------ */ %typemap(in) (char *STRING, int LENGTH), (char *STRING, size_t LENGTH) { if ($input.type != T_STRING) Pike_error("Bad argument: Expected a string.\n"); $1 = ($1_ltype) STR0($input.u.string); $2 = ($2_ltype) $input.u.string->length; } /* ------------------------------------------------------------ * ANSI C typemaps * ------------------------------------------------------------ */ %typemap(in, pikedesc="tInt") size_t { if ($input.type != T_INT) Pike_error("Bad argument: Expected an integer.\n"); $1 = ($1_ltype) $input.u.integer; } %typemap(out) size_t = long; /* ------------------------------------------------------------ * Typechecking rules * ------------------------------------------------------------ */ %typecheck(SWIG_TYPECHECK_INTEGER) int, short, long, unsigned int, unsigned short, unsigned long, signed char, unsigned char, long long, unsigned long long, const int &, const short &, const long &, const unsigned int &, const unsigned short &, const unsigned long &, const long long &, const unsigned long long &, enum SWIGTYPE, enum SWIGTYPE &, SWIGTYPE &&, bool, const bool & { $1 = ($input.type == T_INT) ? 1 : 0; } %typecheck(SWIG_TYPECHECK_DOUBLE) float, double, const float &, const double & { $1 = (($input.type == T_FLOAT) || ($input.type == T_INT)) ? 1 : 0; } %typecheck(SWIG_TYPECHECK_CHAR) char { $1 = ($input.type == T_INT) ? 1 : 0; } %typecheck(SWIG_TYPECHECK_STRING) char * { $1 = ($input.type == T_STRING) ? 1 : 0; } %typecheck(SWIG_TYPECHECK_POINTER) SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE [] { void *ptr; if (SWIG_ConvertPtr($input.u.object, (void **) &ptr, $1_descriptor, 0) == -1) { $1 = 0; } else { $1 = 1; } } %typecheck(SWIG_TYPECHECK_POINTER) SWIGTYPE { void *ptr; if (SWIG_ConvertPtr($input.u.object, (void **) &ptr, $&1_descriptor, 0) == -1) { $1 = 0; } else { $1 = 1; } } %typecheck(SWIG_TYPECHECK_VOIDPTR) void * { void *ptr; if (SWIG_ConvertPtr($input.u.object, (void **) &ptr, 0, 0) == -1) { $1 = 0; } else { $1 = 1; } } /* Array reference typemaps */ %apply SWIGTYPE & { SWIGTYPE ((&)[ANY]) } %apply SWIGTYPE && { SWIGTYPE ((&&)[ANY]) } /* const pointers */ %apply SWIGTYPE * { SWIGTYPE *const } %apply SWIGTYPE (CLASS::*) { SWIGTYPE (CLASS::*const) } %apply SWIGTYPE & { SWIGTYPE (CLASS::*const&) } /* ------------------------------------------------------------ * Overloaded operator support * ------------------------------------------------------------ */ #ifdef __cplusplus %rename("`+") *::operator+; %rename("`-") *::operator-; %rename("`*") *::operator*; %rename("`/") *::operator/; %rename("`%") *::operator%; %rename("`<<") *::operator<<; %rename("`>>") *::operator>>; %rename("`&") *::operator&; %rename("`|") *::operator|; %rename("`^") *::operator^; %rename("`~") *::operator~; %rename("`<") *::operator<; %rename("`>") *::operator>; %rename("`==") *::operator==; /* Special cases */ %rename("`()") *::operator(); #endif /* ------------------------------------------------------------ * The start of the Pike initialization function * ------------------------------------------------------------ */ %init "swiginit.swg" %init %{ #ifdef __cplusplus extern "C" #endif PIKE_MODULE_EXIT {} #ifdef __cplusplus extern "C" #endif PIKE_MODULE_INIT { struct program *pr; SWIG_InitializeModule(0); %} /* pike keywords */ %include swig-4.0.1/Lib/pike/pikerun.swg0000644000175000017500000000403713527063513016211 0ustar williamwilliam/* ----------------------------------------------------------------------------- * pikerun.swg * * This file contains the runtime support for Pike modules * and includes code for managing global variables and pointer * type checking. * ----------------------------------------------------------------------------- */ #ifdef __cplusplus extern "C" { #endif #include "pike/object.h" #include "pike/program.h" #ifdef __cplusplus } #endif #include /* Stores information about a wrapped object */ typedef struct swig_object_wrapper { void *self; swig_type_info *type; } swig_object_wrapper; #ifdef THIS #undef THIS #endif #define THIS (((swig_object_wrapper *) Pike_fp->current_storage)->self) #define SWIG_ConvertPtr SWIG_Pike_ConvertPtr #define SWIG_NewPointerObj SWIG_Pike_NewPointerObj #define SWIG_GetModule(clientdata) SWIG_Pike_GetModule(clientdata) #define SWIG_SetModule(clientdata, pointer) SWIG_Pike_SetModule(pointer) /* These need to be filled in before type sharing between modules will work */ static swig_module_info *SWIG_Pike_GetModule(void *SWIGUNUSEDPARM(clientdata)) { return 0; } static void SWIG_Pike_SetModule(swig_module_info *pointer) { } /* Convert a pointer value */ static int SWIG_Pike_ConvertPtr(struct object *obj, void **ptr, swig_type_info *ty, int flags) { struct program *pr; swig_cast_info *tc; swig_object_wrapper *obj_wrapper; if (ty) { pr = (struct program *) ty->clientdata; obj_wrapper = (swig_object_wrapper *) get_storage(obj, pr); if (obj_wrapper && obj_wrapper->type) { tc = SWIG_TypeCheckStruct(obj_wrapper->type, ty); if (tc) { int newmemory = 0; *ptr = SWIG_TypeCast(tc, obj_wrapper->self, &newmemory); assert(!newmemory); /* newmemory handling not yet implemented */ return 0; } } } return -1; } /* Create a new pointer object */ static struct object * SWIG_Pike_NewPointerObj(void *ptr, swig_type_info *type, int own) { return 0; } swig-4.0.1/Lib/pike/std_string.i0000644000175000017500000000310713527063513016341 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_string.i * * SWIG typemaps for std::string * ----------------------------------------------------------------------------- */ %{ #include %} namespace std { %naturalvar string; class string; /* Overloading check */ %typemap(typecheck) string = char *; %typemap(typecheck) const string & = char *; %typemap(in, pikedesc="tStr") string { if ($input.type != T_STRING) Pike_error("Bad argument: Expected a string.\n"); $1.assign(STR0($input.u.string)); } %typemap(in, pikedesc="tStr") const string & ($*1_ltype temp) { if ($input.type != T_STRING) Pike_error("Bad argument: Expected a string.\n"); temp.assign(STR0($input.u.string)); $1 = &temp; } %typemap(out, pikedesc="tStr") string "push_text($1.c_str());"; %typemap(out, pikedesc="tStr") const string & "push_text($1->c_str());"; %typemap(directorin) string, const string &, string & "$1.c_str()"; %typemap(directorin) string *, const string * "$1->c_str()"; %typemap(directorout) string { if ($input.type == T_STRING) $result.assign(STR0($input.u.string)); else throw Swig::DirectorTypeMismatchException("string expected"); } %typemap(directorout) const string & ($*1_ltype temp) { if ($input.type == T_STRING) { temp.assign(STR0($input.u.string)); $result = &temp; } else { throw Swig::DirectorTypeMismatchException("string expected"); } } } swig-4.0.1/Lib/swiglabels.swg0000644000175000017500000000733013527063513015737 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This section contains generic SWIG labels for method/variable * declarations/attributes, and other compiler dependent labels. * ----------------------------------------------------------------------------- */ /* template workaround for compilers that cannot correctly implement the C++ standard */ #ifndef SWIGTEMPLATEDISAMBIGUATOR # if defined(__SUNPRO_CC) && (__SUNPRO_CC <= 0x560) # define SWIGTEMPLATEDISAMBIGUATOR template # elif defined(__HP_aCC) /* Needed even with `aCC -AA' when `aCC -V' reports HP ANSI C++ B3910B A.03.55 */ /* If we find a maximum version that requires this, the test would be __HP_aCC <= 35500 for A.03.55 */ # define SWIGTEMPLATEDISAMBIGUATOR template # else # define SWIGTEMPLATEDISAMBIGUATOR # endif #endif /* inline attribute */ #ifndef SWIGINLINE # if defined(__cplusplus) || (defined(__GNUC__) && !defined(__STRICT_ANSI__)) # define SWIGINLINE inline # else # define SWIGINLINE # endif #endif /* attribute recognised by some compilers to avoid 'unused' warnings */ #ifndef SWIGUNUSED # if defined(__GNUC__) # if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)) # define SWIGUNUSED __attribute__ ((__unused__)) # else # define SWIGUNUSED # endif # elif defined(__ICC) # define SWIGUNUSED __attribute__ ((__unused__)) # else # define SWIGUNUSED # endif #endif #ifndef SWIG_MSC_UNSUPPRESS_4505 # if defined(_MSC_VER) # pragma warning(disable : 4505) /* unreferenced local function has been removed */ # endif #endif #ifndef SWIGUNUSEDPARM # ifdef __cplusplus # define SWIGUNUSEDPARM(p) # else # define SWIGUNUSEDPARM(p) p SWIGUNUSED # endif #endif /* internal SWIG method */ #ifndef SWIGINTERN # define SWIGINTERN static SWIGUNUSED #endif /* internal inline SWIG method */ #ifndef SWIGINTERNINLINE # define SWIGINTERNINLINE SWIGINTERN SWIGINLINE #endif /* exporting methods */ #if defined(__GNUC__) # if (__GNUC__ >= 4) || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) # ifndef GCC_HASCLASSVISIBILITY # define GCC_HASCLASSVISIBILITY # endif # endif #endif #ifndef SWIGEXPORT # if defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__) # if defined(STATIC_LINKED) # define SWIGEXPORT # else # define SWIGEXPORT __declspec(dllexport) # endif # else # if defined(__GNUC__) && defined(GCC_HASCLASSVISIBILITY) # define SWIGEXPORT __attribute__ ((visibility("default"))) # else # define SWIGEXPORT # endif # endif #endif /* calling conventions for Windows */ #ifndef SWIGSTDCALL # if defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__) # define SWIGSTDCALL __stdcall # else # define SWIGSTDCALL # endif #endif /* Deal with Microsoft's attempt at deprecating C standard runtime functions */ #if !defined(SWIG_NO_CRT_SECURE_NO_DEPRECATE) && defined(_MSC_VER) && !defined(_CRT_SECURE_NO_DEPRECATE) # define _CRT_SECURE_NO_DEPRECATE #endif /* Deal with Microsoft's attempt at deprecating methods in the standard C++ library */ #if !defined(SWIG_NO_SCL_SECURE_NO_DEPRECATE) && defined(_MSC_VER) && !defined(_SCL_SECURE_NO_DEPRECATE) # define _SCL_SECURE_NO_DEPRECATE #endif /* Deal with Apple's deprecated 'AssertMacros.h' from Carbon-framework */ #if defined(__APPLE__) && !defined(__ASSERT_MACROS_DEFINE_VERSIONS_WITHOUT_UNDERSCORES) # define __ASSERT_MACROS_DEFINE_VERSIONS_WITHOUT_UNDERSCORES 0 #endif /* Intel's compiler complains if a variable which was never initialised is * cast to void, which is a common idiom which we use to indicate that we * are aware a variable isn't used. So we just silence that warning. * See: https://github.com/swig/swig/issues/192 for more discussion. */ #ifdef __INTEL_COMPILER # pragma warning disable 592 #endif swig-4.0.1/Lib/php/0000755000175000017500000000000013527063513013645 5ustar williamwilliamswig-4.0.1/Lib/php/std_deque.i0000644000175000017500000000003413527063513015771 0ustar williamwilliam%include swig-4.0.1/Lib/php/phpkw.swg0000644000175000017500000005303313527063513015524 0ustar williamwilliam/* ----------------------------------------------------------------------------- * phpkw.swg * ----------------------------------------------------------------------------- */ /* Keyword (case insensitive) */ #define PHPKW(x) %keywordwarn("'" `x` "' is a PHP keyword, renaming to 'c_" `x` "'",sourcefmt="%(lower)s",rename="c_%s") `x` /* Class (case insensitive) */ #define PHPCN(x) %keywordwarn("'" `x` "' is a PHP reserved class name, renaming to 'c_" `x` "'",%$isclass,sourcefmt="%(lower)s",rename="c_%s") `x` /* Constant (case insensitive) */ #define PHPBN1a(x) %namewarn(%warningmsg(SWIGWARN_PARSE_BUILTIN_NAME, "enum conflicts with a built-in constant '"`x`"' in PHP"),%$isenumitem,sourcefmt="%(lower)s") `x` #define PHPBN1b(x) %namewarn(%warningmsg(SWIGWARN_PARSE_BUILTIN_NAME, "constant conflicts with a built-in constant '"`x`"' in PHP"),%$isconstant,sourcefmt="%(lower)s") `x` %define PHPBN1(X) PHPBN1a(X); PHPBN1b(X) %enddef /* Constant (case sensitive) */ #define PHPBN2a(x) %namewarn(%warningmsg(SWIGWARN_PARSE_BUILTIN_NAME, "enum conflicts with a built-in constant '"`x`"' in PHP"),%$isenumitem) `x` #define PHPBN2b(x) %namewarn(%warningmsg(SWIGWARN_PARSE_BUILTIN_NAME, "constant conflicts with a built-in constant '"`x`"' in PHP"),%$isconstant) `x` %define PHPBN2(X) PHPBN2a(X); PHPBN2b(X) %enddef #define PHPFN(x) %keywordwarn("'" `x` "' is a PHP built-in function, renaming to 'c_" `x` "'",sourcefmt="%(lower)s",%$isfunction,%$not %$ismember,rename="c_%s") `x` /* From: http://php.net/manual/en/reserved.keywords.php * "You cannot use any of the following words as constants, class names, * function or method names. Using them as variable names is generally OK, but * could lead to confusion." */ /* Check is case insensitive - these *MUST* be listed in lower case here */ PHPKW(abstract); PHPKW(and); PHPKW(as); PHPKW(break); PHPKW(callable); PHPKW(case); PHPKW(catch); PHPKW(class); PHPKW(clone); PHPKW(const); PHPKW(continue); PHPKW(declare); PHPKW(default); PHPKW(do); PHPKW(else); PHPKW(elseif); PHPKW(enddeclare); PHPKW(endfor); PHPKW(endforeach); PHPKW(endif); PHPKW(endswitch); PHPKW(endwhile); PHPKW(extends); PHPKW(final); PHPKW(finally); PHPKW(for); PHPKW(foreach); PHPKW(function); PHPKW(global); PHPKW(goto); PHPKW(if); PHPKW(implements); PHPKW(instanceof); PHPKW(insteadof); PHPKW(interface); PHPKW(namespace); PHPKW(new); PHPKW(or); PHPKW(private); PHPKW(protected); PHPKW(public); PHPKW(static); PHPKW(switch); PHPKW(throw); PHPKW(trait); PHPKW(try); PHPKW(use); PHPKW(var); PHPKW(while); PHPKW(xor); PHPKW(yield); // Compile-time "magic" constants // From: http://php.net/manual/en/reserved.keywords.php // also at: http://php.net/manual/en/language.constants.predefined.php /* These *MUST* be listed in lower case here */ PHPKW(__class__); PHPKW(__dir__); PHPKW(__file__); PHPKW(__function__); PHPKW(__line__); PHPKW(__method__); PHPKW(__namespace__); PHPKW(__trait__); /* We classify these as built-in names since they conflict, but PHP still runs */ /* Predefined case-insensitive constants */ /* These *MUST* be listed in lower case here */ PHPBN1(null); PHPBN1(true); PHPBN1(false); /* "Core Predefined Constants" from http://php.net/manual/en/reserved.constants.php */ /* These are case sensitive */ PHPBN2(PHP_VERSION); PHPBN2(PHP_MAJOR_VERSION); PHPBN2(PHP_MINOR_VERSION); PHPBN2(PHP_RELEASE_VERSION); PHPBN2(PHP_VERSION_ID); PHPBN2(PHP_EXTRA_VERSION); PHPBN2(PHP_ZTS); PHPBN2(PHP_DEBUG); PHPBN2(PHP_MAXPATHLEN); PHPBN2(PHP_OS); PHPBN2(PHP_SAPI); PHPBN2(PHP_EOL); PHPBN2(PHP_INT_MAX); PHPBN2(PHP_INT_SIZE); PHPBN2(DEFAULT_INCLUDE_PATH); PHPBN2(PEAR_INSTALL_DIR); PHPBN2(PEAR_EXTENSION_DIR); PHPBN2(PHP_EXTENSION_DIR); PHPBN2(PHP_PREFIX); PHPBN2(PHP_BINDIR); PHPBN2(PHP_BINARY); PHPBN2(PHP_MANDIR); PHPBN2(PHP_LIBDIR); PHPBN2(PHP_DATADIR); PHPBN2(PHP_SYSCONFDIR); PHPBN2(PHP_LOCALSTATEDIR); PHPBN2(PHP_CONFIG_FILE_PATH); PHPBN2(PHP_CONFIG_FILE_SCAN_DIR); PHPBN2(PHP_SHLIB_SUFFIX); PHPBN2(E_ERROR); PHPBN2(E_WARNING); PHPBN2(E_PARSE); PHPBN2(E_NOTICE); PHPBN2(E_CORE_ERROR); PHPBN2(E_CORE_WARNING); PHPBN2(E_COMPILE_ERROR); PHPBN2(E_COMPILE_WARNING); PHPBN2(E_USER_ERROR); PHPBN2(E_USER_WARNING); PHPBN2(E_USER_NOTICE); PHPBN2(E_DEPRECATED); PHPBN2(E_USER_DEPRECATED); PHPBN2(E_ALL); PHPBN2(E_STRICT); PHPBN2(__COMPILER_HALT_OFFSET__); // TRUE, FALSE, NULL are listed on the same page, but are actually // case-insensitive, whereas all the other constants listed there seem to be // case-sensitive, so we handle TRUE, FALSE, NULL in PHPBN1. PHPBN2(PHP_OUTPUT_HANDLER_START); PHPBN2(PHP_OUTPUT_HANDLER_CONT); PHPBN2(PHP_OUTPUT_HANDLER_END); /* These don't actually seem to be set (tested on Linux, I guess they're * Windows only?) */ PHPBN2(PHP_WINDOWS_NT_DOMAIN_CONTROLLER); PHPBN2(PHP_WINDOWS_NT_SERVER); PHPBN2(PHP_WINDOWS_NT_WORKSTATION); PHPBN2(PHP_WINDOWS_VERSION_BUILD); PHPBN2(PHP_WINDOWS_VERSION_MAJOR); PHPBN2(PHP_WINDOWS_VERSION_MINOR); PHPBN2(PHP_WINDOWS_VERSION_PLATFORM); PHPBN2(PHP_WINDOWS_VERSION_PRODUCTTYPE); PHPBN2(PHP_WINDOWS_VERSION_SP_MAJOR); PHPBN2(PHP_WINDOWS_VERSION_SP_MINOR); PHPBN2(PHP_WINDOWS_VERSION_SUITEMASK); /* "Standard Predefined Constants" from http://php.net/manual/en/reserved.constants.php */ PHPBN2(EXTR_OVERWRITE); PHPBN2(EXTR_SKIP); PHPBN2(EXTR_PREFIX_SAME); PHPBN2(EXTR_PREFIX_ALL); PHPBN2(EXTR_PREFIX_INVALID); PHPBN2(EXTR_PREFIX_IF_EXISTS); PHPBN2(EXTR_IF_EXISTS); PHPBN2(SORT_ASC); PHPBN2(SORT_DESC); PHPBN2(SORT_REGULAR); PHPBN2(SORT_NUMERIC); PHPBN2(SORT_STRING); PHPBN2(CASE_LOWER); PHPBN2(CASE_UPPER); PHPBN2(COUNT_NORMAL); PHPBN2(COUNT_RECURSIVE); PHPBN2(ASSERT_ACTIVE); PHPBN2(ASSERT_CALLBACK); PHPBN2(ASSERT_BAIL); PHPBN2(ASSERT_WARNING); PHPBN2(ASSERT_QUIET_EVAL); PHPBN2(CONNECTION_ABORTED); PHPBN2(CONNECTION_NORMAL); PHPBN2(CONNECTION_TIMEOUT); PHPBN2(INI_USER); PHPBN2(INI_PERDIR); PHPBN2(INI_SYSTEM); PHPBN2(INI_ALL); PHPBN2(INI_SCANNER_NORMAL); PHPBN2(INI_SCANNER_RAW); PHPBN2(M_E); PHPBN2(M_LOG2E); PHPBN2(M_LOG10E); PHPBN2(M_LN2); PHPBN2(M_LN10); PHPBN2(M_PI); PHPBN2(M_PI_2); PHPBN2(M_PI_4); PHPBN2(M_1_PI); PHPBN2(M_2_PI); PHPBN2(M_2_SQRTPI); PHPBN2(M_SQRT2); PHPBN2(M_SQRT1_2); PHPBN2(M_EULER); PHPBN2(M_LNPI); PHPBN2(M_SQRT3); PHPBN2(M_SQRTPI); PHPBN2(CRYPT_SALT_LENGTH); PHPBN2(CRYPT_STD_DES); PHPBN2(CRYPT_EXT_DES); PHPBN2(CRYPT_MD5); PHPBN2(CRYPT_BLOWFISH); PHPBN2(DIRECTORY_SEPARATOR); PHPBN2(SEEK_SET); PHPBN2(SEEK_CUR); PHPBN2(SEEK_END); PHPBN2(LOCK_SH); PHPBN2(LOCK_EX); PHPBN2(LOCK_UN); PHPBN2(LOCK_NB); PHPBN2(HTML_SPECIALCHARS); PHPBN2(HTML_ENTITIES); PHPBN2(ENT_COMPAT); PHPBN2(ENT_QUOTES); PHPBN2(ENT_NOQUOTES); PHPBN2(INFO_GENERAL); PHPBN2(INFO_CREDITS); PHPBN2(INFO_CONFIGURATION); PHPBN2(INFO_MODULES); PHPBN2(INFO_ENVIRONMENT); PHPBN2(INFO_VARIABLES); PHPBN2(INFO_LICENSE); PHPBN2(INFO_ALL); PHPBN2(CREDITS_GROUP); PHPBN2(CREDITS_GENERAL); PHPBN2(CREDITS_SAPI); PHPBN2(CREDITS_MODULES); PHPBN2(CREDITS_DOCS); PHPBN2(CREDITS_FULLPAGE); PHPBN2(CREDITS_QA); PHPBN2(CREDITS_ALL); PHPBN2(STR_PAD_LEFT); PHPBN2(STR_PAD_RIGHT); PHPBN2(STR_PAD_BOTH); PHPBN2(PATHINFO_DIRNAME); PHPBN2(PATHINFO_BASENAME); PHPBN2(PATHINFO_EXTENSION); PHPBN2(PATHINFO_FILENAME); PHPBN2(PATH_SEPARATOR); PHPBN2(CHAR_MAX); PHPBN2(LC_CTYPE); PHPBN2(LC_NUMERIC); PHPBN2(LC_TIME); PHPBN2(LC_COLLATE); PHPBN2(LC_MONETARY); PHPBN2(LC_ALL); PHPBN2(LC_MESSAGES); PHPBN2(ABDAY_1); PHPBN2(ABDAY_2); PHPBN2(ABDAY_3); PHPBN2(ABDAY_4); PHPBN2(ABDAY_5); PHPBN2(ABDAY_6); PHPBN2(ABDAY_7); PHPBN2(DAY_1); PHPBN2(DAY_2); PHPBN2(DAY_3); PHPBN2(DAY_4); PHPBN2(DAY_5); PHPBN2(DAY_6); PHPBN2(DAY_7); PHPBN2(ABMON_1); PHPBN2(ABMON_2); PHPBN2(ABMON_3); PHPBN2(ABMON_4); PHPBN2(ABMON_5); PHPBN2(ABMON_6); PHPBN2(ABMON_7); PHPBN2(ABMON_8); PHPBN2(ABMON_9); PHPBN2(ABMON_10); PHPBN2(ABMON_11); PHPBN2(ABMON_12); PHPBN2(MON_1); PHPBN2(MON_2); PHPBN2(MON_3); PHPBN2(MON_4); PHPBN2(MON_5); PHPBN2(MON_6); PHPBN2(MON_7); PHPBN2(MON_8); PHPBN2(MON_9); PHPBN2(MON_10); PHPBN2(MON_11); PHPBN2(MON_12); PHPBN2(AM_STR); PHPBN2(PM_STR); PHPBN2(D_T_FMT); PHPBN2(D_FMT); PHPBN2(T_FMT); PHPBN2(T_FMT_AMPM); PHPBN2(ERA); PHPBN2(ERA_YEAR); PHPBN2(ERA_D_T_FMT); PHPBN2(ERA_D_FMT); PHPBN2(ERA_T_FMT); PHPBN2(ALT_DIGITS); PHPBN2(INT_CURR_SYMBOL); PHPBN2(CURRENCY_SYMBOL); PHPBN2(CRNCYSTR); PHPBN2(MON_DECIMAL_POINT); PHPBN2(MON_THOUSANDS_SEP); PHPBN2(MON_GROUPING); PHPBN2(POSITIVE_SIGN); PHPBN2(NEGATIVE_SIGN); PHPBN2(INT_FRAC_DIGITS); PHPBN2(FRAC_DIGITS); PHPBN2(P_CS_PRECEDES); PHPBN2(P_SEP_BY_SPACE); PHPBN2(N_CS_PRECEDES); PHPBN2(N_SEP_BY_SPACE); PHPBN2(P_SIGN_POSN); PHPBN2(N_SIGN_POSN); PHPBN2(DECIMAL_POINT); PHPBN2(RADIXCHAR); PHPBN2(THOUSANDS_SEP); PHPBN2(THOUSEP); PHPBN2(GROUPING); PHPBN2(YESEXPR); PHPBN2(NOEXPR); PHPBN2(YESSTR); PHPBN2(NOSTR); PHPBN2(CODESET); PHPBN2(LOG_EMERG); PHPBN2(LOG_ALERT); PHPBN2(LOG_CRIT); PHPBN2(LOG_ERR); PHPBN2(LOG_WARNING); PHPBN2(LOG_NOTICE); PHPBN2(LOG_INFO); PHPBN2(LOG_DEBUG); PHPBN2(LOG_KERN); PHPBN2(LOG_USER); PHPBN2(LOG_MAIL); PHPBN2(LOG_DAEMON); PHPBN2(LOG_AUTH); PHPBN2(LOG_SYSLOG); PHPBN2(LOG_LPR); PHPBN2(LOG_NEWS); PHPBN2(LOG_UUCP); PHPBN2(LOG_CRON); PHPBN2(LOG_AUTHPRIV); PHPBN2(LOG_LOCAL0); PHPBN2(LOG_LOCAL1); PHPBN2(LOG_LOCAL2); PHPBN2(LOG_LOCAL3); PHPBN2(LOG_LOCAL4); PHPBN2(LOG_LOCAL5); PHPBN2(LOG_LOCAL6); PHPBN2(LOG_LOCAL7); PHPBN2(LOG_PID); PHPBN2(LOG_CONS); PHPBN2(LOG_ODELAY); PHPBN2(LOG_NDELAY); PHPBN2(LOG_NOWAIT); PHPBN2(LOG_PERROR); PHPBN2(PREG_BACKTRACK_LIMIT_ERROR); PHPBN2(PREG_BAD_UTF8_ERROR); PHPBN2(PREG_INTERNAL_ERROR); PHPBN2(PREG_NO_ERROR); PHPBN2(PREG_RECURSION_LIMIT_ERROR); PHPBN2(UPLOAD_ERR_EXTENSION); PHPBN2(STREAM_SHUT_RD); PHPBN2(STREAM_SHUT_WR); PHPBN2(STREAM_SHUT_RDWR); PHPBN2(CURLE_FILESIZE_EXCEEDED); PHPBN2(CURLE_FTP_SSL_FAILED); PHPBN2(CURLE_LDAP_INVALID_URL); PHPBN2(CURLFTPAUTH_DEFAULT); PHPBN2(CURLFTPAUTH_SSL); PHPBN2(CURLFTPAUTH_TLS); PHPBN2(CURLFTPSSL_ALL); PHPBN2(CURLFTPSSL_CONTROL); PHPBN2(CURLFTPSSL_NONE); PHPBN2(CURLFTPSSL_TRY); PHPBN2(CURLOPT_FTP_SSL); PHPBN2(CURLOPT_FTPSSLAUTH); PHPBN2(CURLOPT_TCP_NODELAY); PHPBN2(CURLOPT_TIMEOUT_MS); PHPBN2(CURLOPT_CONNECTTIMEOUT_MS); PHPBN2(GMP_VERSION); PHPBN2(SWFTEXTFIELD_USEFONT); PHPBN2(SWFTEXTFIELD_AUTOSIZE); PHPBN2(SWF_SOUND_NOT_COMPRESSED); PHPBN2(SWF_SOUND_ADPCM_COMPRESSED); PHPBN2(SWF_SOUND_MP3_COMPRESSED); PHPBN2(SWF_SOUND_NOT_COMPRESSED_LE); PHPBN2(SWF_SOUND_NELLY_COMPRESSED); PHPBN2(SWF_SOUND_5KHZ); PHPBN2(SWF_SOUND_11KHZ); PHPBN2(SWF_SOUND_22KHZ); PHPBN2(SWF_SOUND_44KHZ); PHPBN2(SWF_SOUND_8BITS); PHPBN2(SWF_SOUND_16BITS); PHPBN2(SWF_SOUND_MONO); PHPBN2(SWF_SOUND_STEREO); PHPBN2(OPENSSL_VERSION_NUMBER); PHPBN2(SNMP_OID_OUTPUT_FULL); PHPBN2(SNMP_OID_OUTPUT_NUMERIC); PHPBN2(MSG_EAGAIN); PHPBN2(MSG_ENOMSG); PHPBN2(CURLOPT_PROGRESSFUNCTION); PHPBN2(IMG_FILTER_PIXELATE); PHPBN2(JSON_ERROR_CTRL_CHAR); PHPBN2(JSON_ERROR_DEPTH); PHPBN2(JSON_ERROR_NONE); PHPBN2(JSON_ERROR_STATE_MISMATCH); PHPBN2(JSON_ERROR_SYNTAX); PHPBN2(JSON_FORCE_OBJECT); PHPBN2(JSON_HEX_TAG); PHPBN2(JSON_HEX_AMP); PHPBN2(JSON_HEX_APOS); PHPBN2(JSON_HEX_QUOT); PHPBN2(LDAP_OPT_NETWORK_TIMEOUT); PHPBN2(LIBXML_LOADED_VERSION); PHPBN2(PREG_BAD_UTF8_OFFSET_ERROR); PHPBN2(BUS_ADRALN); PHPBN2(BUS_ADRERR); PHPBN2(BUS_OBJERR); PHPBN2(CLD_CONTIUNED); PHPBN2(CLD_DUMPED); PHPBN2(CLD_EXITED); PHPBN2(CLD_KILLED); PHPBN2(CLD_STOPPED); PHPBN2(CLD_TRAPPED); PHPBN2(FPE_FLTDIV); PHPBN2(FPE_FLTINV); PHPBN2(FPE_FLTOVF); PHPBN2(FPE_FLTRES); PHPBN2(FPE_FLTSUB); PHPBN2(FPE_FLTUND); PHPBN2(FPE_INTDIV); PHPBN2(FPE_INTOVF); PHPBN2(ILL_BADSTK); PHPBN2(ILL_COPROC); PHPBN2(ILL_ILLADR); PHPBN2(ILL_ILLOPC); PHPBN2(ILL_ILLOPN); PHPBN2(ILL_ILLTRP); PHPBN2(ILL_PRVOPC); PHPBN2(ILL_PRVREG); PHPBN2(POLL_ERR); PHPBN2(POLL_HUP); PHPBN2(POLL_IN); PHPBN2(POLL_MSG); PHPBN2(POLL_OUT); PHPBN2(POLL_PRI); PHPBN2(SEGV_ACCERR); PHPBN2(SEGV_MAPERR); PHPBN2(SI_ASYNCIO); PHPBN2(SI_KERNEL); PHPBN2(SI_MESGQ); PHPBN2(SI_NOINFO); PHPBN2(SI_QUEUE); PHPBN2(SI_SIGIO); PHPBN2(SI_TIMER); PHPBN2(SI_TKILL); PHPBN2(SI_USER); PHPBN2(SIG_BLOCK); PHPBN2(SIG_SETMASK); PHPBN2(SIG_UNBLOCK); PHPBN2(TRAP_BRKPT); PHPBN2(TRAP_TRACE); PHPBN2(ENT_DISALLOWED); PHPBN2(ENT_HTML401); PHPBN2(ENT_HTML5); PHPBN2(ENT_SUBSTITUTE); PHPBN2(ENT_XML1); PHPBN2(ENT_XHTML); PHPBN2(IPPROTO_IP); PHPBN2(IPPROTO_IPV6); PHPBN2(IPV6_MULTICAST_HOPS); PHPBN2(IPV6_MULTICAST_IF); PHPBN2(IPV6_MULTICAST_LOOP); PHPBN2(IP_MULTICAST_IF); PHPBN2(IP_MULTICAST_LOOP); PHPBN2(IP_MULTICAST_TTL); PHPBN2(MCAST_JOIN_GROUP); PHPBN2(MCAST_LEAVE_GROUP); PHPBN2(MCAST_BLOCK_SOURCE); PHPBN2(MCAST_UNBLOCK_SOURCE); PHPBN2(MCAST_JOIN_SOURCE_GROUP); PHPBN2(MCAST_LEAVE_SOURCE_GROUP); PHPBN2(CURLOPT_MAX_RECV_SPEED_LARGE); PHPBN2(CURLOPT_MAX_SEND_SPEED_LARGE); PHPBN2(LIBXML_HTML_NODEFDTD); PHPBN2(LIBXML_HTML_NOIMPLIED); PHPBN2(LIBXML_PEDANTIC); PHPBN2(OPENSSL_CIPHER_AES_128_CBC); PHPBN2(OPENSSL_CIPHER_AES_192_CBC); PHPBN2(OPENSSL_CIPHER_AES_256_CBC); PHPBN2(OPENSSL_RAW_DATA); PHPBN2(OPENSSL_ZERO_PADDING); PHPBN2(PHP_OUTPUT_HANDLER_CLEAN); PHPBN2(PHP_OUTPUT_HANDLER_CLEANABLE); PHPBN2(PHP_OUTPUT_HANDLER_DISABLED); PHPBN2(PHP_OUTPUT_HANDLER_FINAL); PHPBN2(PHP_OUTPUT_HANDLER_FLUSH); PHPBN2(PHP_OUTPUT_HANDLER_FLUSHABLE); PHPBN2(PHP_OUTPUT_HANDLER_REMOVABLE); PHPBN2(PHP_OUTPUT_HANDLER_STARTED); PHPBN2(PHP_OUTPUT_HANDLER_STDFLAGS); PHPBN2(PHP_OUTPUT_HANDLER_WRITE); PHPBN2(PHP_SESSION_ACTIVE); PHPBN2(PHP_SESSION_DISABLED); PHPBN2(PHP_SESSION_NONE); PHPBN2(STREAM_META_ACCESS); PHPBN2(STREAM_META_GROUP); PHPBN2(STREAM_META_GROUP_NAME); PHPBN2(STREAM_META_OWNER); PHPBN2(STREAM_META_OWNER_NAME); PHPBN2(STREAM_META_TOUCH); PHPBN2(ZLIB_ENCODING_DEFLATE); PHPBN2(ZLIB_ENCODING_GZIP); PHPBN2(ZLIB_ENCODING_RAW); PHPBN2(U_IDNA_DOMAIN_NAME_TOO_LONG_ERROR); PHPBN2(IDNA_CHECK_BIDI); PHPBN2(IDNA_CHECK_CONTEXTJ); PHPBN2(IDNA_NONTRANSITIONAL_TO_ASCII); PHPBN2(IDNA_NONTRANSITIONAL_TO_UNICODE); PHPBN2(INTL_IDNA_VARIANT_2003); PHPBN2(INTL_IDNA_VARIANT_UTS46); PHPBN2(IDNA_ERROR_EMPTY_LABEL); PHPBN2(IDNA_ERROR_LABEL_TOO_LONG); PHPBN2(IDNA_ERROR_DOMAIN_NAME_TOO_LONG); PHPBN2(IDNA_ERROR_LEADING_HYPHEN); PHPBN2(IDNA_ERROR_TRAILING_HYPHEN); PHPBN2(IDNA_ERROR_HYPHEN_3_4); PHPBN2(IDNA_ERROR_LEADING_COMBINING_MARK); PHPBN2(IDNA_ERROR_DISALLOWED); PHPBN2(IDNA_ERROR_PUNYCODE); PHPBN2(IDNA_ERROR_LABEL_HAS_DOT); PHPBN2(IDNA_ERROR_INVALID_ACE_LABEL); PHPBN2(IDNA_ERROR_BIDI); PHPBN2(IDNA_ERROR_CONTEXTJ); PHPBN2(JSON_PRETTY_PRINT); PHPBN2(JSON_UNESCAPED_SLASHES); PHPBN2(JSON_NUMERIC_CHECK); PHPBN2(JSON_UNESCAPED_UNICODE); PHPBN2(JSON_BIGINT_AS_STRING); PHPBN2(IMG_AFFINE_TRANSLATE); PHPBN2(IMG_AFFINE_SCALE); PHPBN2(IMG_AFFINE_ROTATE); PHPBN2(IMG_AFFINE_SHEAR_HORIZONTAL); PHPBN2(IMG_AFFINE_SHEAR_VERTICAL); PHPBN2(IMG_CROP_DEFAULT); PHPBN2(IMG_CROP_TRANSPARENT); PHPBN2(IMG_CROP_BLACK); PHPBN2(IMG_CROP_WHITE); PHPBN2(IMG_CROP_SIDES); PHPBN2(IMG_FLIP_BOTH); PHPBN2(IMG_FLIP_HORIZONTAL); PHPBN2(IMG_FLIP_VERTICAL); PHPBN2(IMG_BELL); PHPBN2(IMG_BESSEL); PHPBN2(IMG_BICUBIC); PHPBN2(IMG_BICUBIC_FIXED); PHPBN2(IMG_BLACKMAN); PHPBN2(IMG_BOX); PHPBN2(IMG_BSPLINE); PHPBN2(IMG_CATMULLROM); PHPBN2(IMG_GAUSSIAN); PHPBN2(IMG_GENERALIZED_CUBIC); PHPBN2(IMG_HERMITE); PHPBN2(IMG_HAMMING); PHPBN2(IMG_HANNING); PHPBN2(IMG_MITCHELL); PHPBN2(IMG_POWER); PHPBN2(IMG_QUADRATIC); PHPBN2(IMG_SINC); PHPBN2(IMG_NEAREST_NEIGHBOUR); PHPBN2(IMG_WEIGHTED4); PHPBN2(IMG_TRIANGLE); PHPBN2(JSON_ERROR_RECURSION); PHPBN2(JSON_ERROR_INF_OR_NAN); PHPBN2(JSON_ERROR_UNSUPPORTED_TYPE); PHPBN2(MYSQLI_SERVER_PUBLIC_KEY); PHPBN2(LDAP_ESCAPE_DN); PHPBN2(LDAP_ESCAPE_FILTER); PHPBN2(OPENSSL_DEFAULT_STREAM_CIPHERS); PHPBN2(STREAM_CRYPTO_METHOD_ANY_CLIENT); PHPBN2(STREAM_CRYPTO_METHOD_ANY_SERVER); PHPBN2(STREAM_CRYPTO_METHOD_TLSv1_0_CLIENT); PHPBN2(STREAM_CRYPTO_METHOD_TLSv1_0_SERVER); PHPBN2(STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT); PHPBN2(STREAM_CRYPTO_METHOD_TLSv1_1_SERVER); PHPBN2(STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT); PHPBN2(STREAM_CRYPTO_METHOD_TLSv1_2_SERVER); PHPBN2(PGSQL_CONNECT_ASYNC); PHPBN2(PGSQL_CONNECTION_AUTH_OK); PHPBN2(PGSQL_CONNECTION_AWAITING_RESPONSE); PHPBN2(PGSQL_CONNECTION_MADE); PHPBN2(PGSQL_CONNECTION_SETENV); PHPBN2(PGSQL_CONNECTION_SSL_STARTUP); PHPBN2(PGSQL_CONNECTION_STARTED); PHPBN2(PGSQL_DML_ESCAPE); PHPBN2(PGSQL_POLLING_ACTIVE); PHPBN2(PGSQL_POLLING_FAILED); PHPBN2(PGSQL_POLLING_OK); PHPBN2(PGSQL_POLLING_READING); PHPBN2(PGSQL_POLLING_WRITING); /* Class names reserved by PHP (case insensitive) */ PHPCN(directory); PHPCN(stdclass); PHPCN(__php_incomplete_class); /* Added in PHP5. */ PHPCN(exception); PHPCN(errorexception); PHPCN(php_user_filter); PHPCN(closure); PHPCN(generator); PHPCN(self); PHPCN(static); PHPCN(parent); /* http://php.net/manual/en/migration70.incompatible.php#migration70.incompatible.other.classes */ PHPCN(bool); // As of PHP 7.0 PHPCN(int); // As of PHP 7.0 PHPCN(float); // As of PHP 7.0 PHPCN(string); // As of PHP 7.0 PHPCN(NULL); // As of PHP 7.0 PHPCN(TRUE); // As of PHP 7.0 PHPCN(FALSE); // As of PHP 7.0 PHPCN(resource); // As of PHP 7.0 (currently works but reserved) PHPCN(object); // As of PHP 7.0 (currently works but reserved) PHPCN(mixed); // As of PHP 7.0 (currently works but reserved) PHPCN(numeric); // As of PHP 7.0 (currently works but reserved) /* http://php.net/manual/en/migration71.incompatible.php#migration71.incompatible.invalid-class-names */ PHPCN(iterable); // As of PHP 7.1 PHPCN(void); // As of PHP 7.1 /* From extensions (which of these are actually predefined depends which * extensions are loaded by default). */ PHPCN(xmlwriter); PHPCN(libxmlerror); PHPCN(simplexmlelement); PHPCN(soapclient); PHPCN(soapvar); PHPCN(soapserver); PHPCN(soapfault); PHPCN(soapparam); PHPCN(soapheader); PHPCN(recursiveiteratoriterator); PHPCN(filteriterator); PHPCN(recursivefilteriterator); PHPCN(parentiterator); PHPCN(limititerator); PHPCN(cachingiterator); PHPCN(recursivecachingiterator); PHPCN(iteratoriterator); PHPCN(norewinditerator); PHPCN(appenditerator); PHPCN(infiniteiterator); PHPCN(emptyiterator); PHPCN(arrayobject); PHPCN(arrayiterator); PHPCN(recursivearrayiterator); PHPCN(splfileinfo); PHPCN(directoryiterator); PHPCN(recursivedirectoryiterator); PHPCN(splfileobject); PHPCN(spltempfileobject); PHPCN(simplexmliterator); PHPCN(logicexception); PHPCN(badfunctioncallexception); PHPCN(badmethodcallexception); PHPCN(domainexception); PHPCN(invalidargumentexception); PHPCN(lengthexception); PHPCN(outofrangeexception); PHPCN(runtimeexception); PHPCN(outofboundsexception); PHPCN(overflowexception); PHPCN(rangeexception); PHPCN(underflowexception); PHPCN(unexpectedvalueexception); PHPCN(splobjectstorage); PHPCN(reflectionexception); PHPCN(reflection); PHPCN(reflectionfunction); PHPCN(reflectionparameter); PHPCN(reflectionmethod); PHPCN(reflectionclass); PHPCN(reflectionobject); PHPCN(reflectionproperty); PHPCN(reflectionextension); PHPCN(domexception); PHPCN(domstringlist); PHPCN(domnamelist); PHPCN(domimplementationlist); PHPCN(domimplementationsource); PHPCN(domimplementation); PHPCN(domnode); PHPCN(domnamespacenode); PHPCN(domdocumentfragment); PHPCN(domdocument); PHPCN(domnodelist); PHPCN(domnamednodemap); PHPCN(domcharacterdata); PHPCN(domattr); PHPCN(domelement); PHPCN(domtext); PHPCN(domcomment); PHPCN(domtypeinfo); PHPCN(domuserdatahandler); PHPCN(domdomerror); PHPCN(domerrorhandler); PHPCN(domlocator); PHPCN(domconfiguration); PHPCN(domcdatasection); PHPCN(domdocumenttype); PHPCN(domnotation); PHPCN(domentity); PHPCN(domentityreference); PHPCN(domprocessinginstruction); PHPCN(domstringextend); PHPCN(domxpath); PHPCN(xmlreader); PHPCN(sqlitedatabase); PHPCN(sqliteresult); PHPCN(sqliteunbuffered); PHPCN(sqliteexception); PHPCN(datetime); /* Built-in PHP functions (incomplete). */ /* Includes Array Functions - http://php.net/manual/en/ref.array.php */ /* Check is case insensitive - these *MUST* be listed in lower case here */ PHPFN(__halt_compiler); PHPFN(acos); PHPFN(array); PHPFN(array_change_key_case); PHPFN(array_chunk); PHPFN(array_column); PHPFN(array_combine); PHPFN(array_count_values); PHPFN(array_diff); PHPFN(array_diff_assoc); PHPFN(array_diff_key); PHPFN(array_diff_uassoc); PHPFN(array_diff_ukey); PHPFN(array_fill); PHPFN(array_fill_keys); PHPFN(array_filter); PHPFN(array_flip); PHPFN(array_intersect); PHPFN(array_intersect_assoc); PHPFN(array_intersect_key); PHPFN(array_intersect_uassoc); PHPFN(array_intersect_ukey); PHPFN(array_key_exists); PHPFN(array_keys); PHPFN(array_map); PHPFN(array_merge); PHPFN(array_merge_recursive); PHPFN(array_multisort); PHPFN(array_pad); PHPFN(array_pop); PHPFN(array_product); PHPFN(array_push); PHPFN(array_rand); PHPFN(array_reduce); PHPFN(array_replace); PHPFN(array_replace_recursive); PHPFN(array_reverse); PHPFN(array_search); PHPFN(array_shift); PHPFN(array_slice); PHPFN(array_splice); PHPFN(array_sum); PHPFN(array_udiff); PHPFN(array_udiff_assoc); PHPFN(array_udiff_uassoc); PHPFN(array_uintersect); PHPFN(array_uintersect_assoc); PHPFN(array_uintersect_uassoc); PHPFN(array_unique); PHPFN(array_unshift); PHPFN(array_values); PHPFN(array_walk); PHPFN(array_walk_recursive); PHPFN(arsort); PHPFN(asin); PHPFN(asort); PHPFN(atan); PHPFN(atan2); PHPFN(ceil); PHPFN(compact); PHPFN(cos); PHPFN(cosh); PHPFN(count); PHPFN(current); PHPFN(die); // "Language construct" PHPFN(each); PHPFN(echo); // "Language construct" PHPFN(empty); PHPFN(end); PHPFN(eval); // "Language construct" PHPFN(exit); // "Language construct" PHPFN(exp); PHPFN(extract); PHPFN(floor); PHPFN(fmod); PHPFN(in_array); PHPFN(include); // "Language construct" PHPFN(include_once); // "Language construct" PHPFN(isset); // "Language construct" PHPFN(key); PHPFN(key_exists); PHPFN(krsort); PHPFN(ksort); PHPFN(list); // "Language construct" PHPFN(log); PHPFN(log10); PHPFN(max); PHPFN(min); PHPFN(natcasesort); PHPFN(natsort); PHPFN(next); PHPFN(pos); PHPFN(pow); PHPFN(prev); PHPFN(print); // "Language construct" PHPFN(range); PHPFN(reset); PHPFN(rsort); PHPFN(require); // "Language construct" PHPFN(require_once); // "Language construct" PHPFN(return); // "Language construct" PHPFN(shuffle); PHPFN(sin); PHPFN(sinh); PHPFN(sizeof); PHPFN(sort); PHPFN(sqrt); PHPFN(tan); PHPFN(tanh); PHPFN(uasort); PHPFN(uksort); PHPFN(unset); // "Language construct" PHPFN(usort); #undef PHPKW #undef PHPBN1a #undef PHPBN1b #undef PHPBN1 #undef PHPBN2a #undef PHPBN2b #undef PHPBN2 #undef PHPCN #undef PHPFN swig-4.0.1/Lib/php/director.swg0000644000175000017500000000776713527063513016223 0ustar williamwilliam/* ----------------------------------------------------------------------------- * director.swg * * This file contains support for director classes so that PHP proxy * methods can be called from C++. * ----------------------------------------------------------------------------- */ #ifndef SWIG_DIRECTOR_PHP_HEADER_ #define SWIG_DIRECTOR_PHP_HEADER_ #include #include #include namespace Swig { /* memory handler */ struct GCItem { virtual ~GCItem() { } virtual int get_own() const { return 0; } }; struct GCItem_var { GCItem_var(GCItem *item = 0) : _item(item) { } GCItem_var& operator=(GCItem *item) { GCItem *tmp = _item; _item = item; delete tmp; return *this; } ~GCItem_var() { delete _item; } GCItem * operator->() const { return _item; } private: GCItem *_item; }; struct GCItem_Object : GCItem { GCItem_Object(int own) : _own(own) { } virtual ~GCItem_Object() { } int get_own() const { return _own; } private: int _own; }; template struct GCItem_T : GCItem { GCItem_T(Type *ptr) : _ptr(ptr) { } virtual ~GCItem_T() { delete _ptr; } private: Type *_ptr; }; class Director { protected: // "mutable" so we can get a non-const pointer to it in const methods. mutable zval swig_self; typedef std::map swig_ownership_map; mutable swig_ownership_map swig_owner; public: Director(zval *self) { ZVAL_COPY_VALUE(&swig_self, self); } static bool swig_is_overridden_method(const char *cname, const char *lc_fname) { bool result = false; zend_string * cname_str = zend_string_init(cname, strlen(cname), 0); zend_class_entry *ce = zend_lookup_class(cname_str); if (ce) { zval * mptr = zend_hash_str_find(&ce->function_table, lc_fname, strlen(lc_fname)); if (mptr) { // common.scope points to zend_class_entry for the declaring class, // and there's only one of those per class, so we can just use a // pointer compare here. result = Z_FUNC_P(mptr)->common.scope != ce; } } zend_string_release(cname_str); return result; } template void swig_acquire_ownership(Type *vptr) const { if (vptr) { swig_owner[vptr] = new GCItem_T(vptr); } } }; /* base class for director exceptions */ class DirectorException : public std::exception { protected: std::string swig_msg; public: DirectorException(int code, const char *hdr, const char *msg) : swig_msg(hdr) { if (msg && msg[0]) { swig_msg += " "; swig_msg += msg; } SWIG_ErrorCode() = code; SWIG_ErrorMsg() = swig_msg.c_str(); } virtual ~DirectorException() throw() { } const char *what() const throw() { return swig_msg.c_str(); } static void raise(int code, const char *hdr, const char *msg) { throw DirectorException(code, hdr, msg); } }; /* attempt to call a pure virtual method via a director method */ class DirectorPureVirtualException : public DirectorException { public: DirectorPureVirtualException(const char *msg) : DirectorException(E_ERROR, "SWIG director pure virtual method called", msg) { } static void raise(const char *msg) { throw DirectorPureVirtualException(msg); } }; /* any php exception that occurs during a director method call */ class DirectorMethodException : public DirectorException { public: DirectorMethodException() : DirectorException(E_ERROR, "SWIG director method error", NULL) { } DirectorMethodException(const char *msg) : DirectorException(E_ERROR, "SWIG director method error", msg) { } static void raise(const char *msg) { throw DirectorMethodException(msg); } }; } #endif swig-4.0.1/Lib/php/php.swg0000644000175000017500000003313713527063513015165 0ustar williamwilliam/* ----------------------------------------------------------------------------- * php.swg * * PHP configuration file * ----------------------------------------------------------------------------- */ %runtime "swigrun.swg" // Common C API type-checking code %runtime "swigerrors.swg" // SWIG errors %runtime "phprun.swg" // PHP runtime functions %include // PHP initialization routine. %include // Global variables. %include // use %init %{ "/*code goes here*/ " %} // or %minit %{ "/* code goes here*/ " %} to // insert code in the PHP_MINIT_FUNCTION #define %minit %insert("init") // use %rinit %{ "/* code goes here*/ " %} to // insert code in the PHP_RINIT_FUNCTION #define %rinit %insert("rinit") // use %shutdown %{ " /*code goes here*/ " %} to // insert code in the PHP_MSHUTDOWN_FUNCTION #define %shutdown %insert("shutdown") #define %mshutdown %insert("shutdown") // use %rshutdown %{ " /*code goes here*/" %} to // insert code in the PHP_RSHUTDOWN_FUNCTION #define %rshutdown %insert("rshutdown") /* Typemaps for input parameters by value */ %include %pass_by_val(bool,CONVERT_BOOL_IN); %pass_by_val(size_t, CONVERT_INT_IN); %pass_by_val(enum SWIGTYPE, CONVERT_INT_IN); %pass_by_val(signed int, CONVERT_INT_IN); %pass_by_val(int,CONVERT_INT_IN); %pass_by_val(unsigned int,CONVERT_INT_IN); %pass_by_val(signed short, CONVERT_INT_IN); %pass_by_val(short,CONVERT_INT_IN); %pass_by_val(unsigned short, CONVERT_INT_IN); %pass_by_val(signed long, CONVERT_INT_IN); %pass_by_val(long, CONVERT_INT_IN); %pass_by_val(unsigned long, CONVERT_INT_IN); %pass_by_val(signed long long, CONVERT_LONG_LONG_IN); %pass_by_val(long long, CONVERT_LONG_LONG_IN); %pass_by_val(unsigned long long, CONVERT_UNSIGNED_LONG_LONG_IN); %pass_by_val(signed char, CONVERT_INT_IN); %pass_by_val(char, CONVERT_CHAR_IN); %pass_by_val(unsigned char, CONVERT_INT_IN); %pass_by_val(float, CONVERT_FLOAT_IN); %pass_by_val(double, CONVERT_FLOAT_IN); %pass_by_val(char *, CONVERT_STRING_IN); %typemap(in) char *& = const char *&; %typemap(directorout) char *& = const char *&; // char array can be in/out, though the passed string may not be big enough... // so we have to size it %typemap(in) char[ANY] %{ convert_to_string(&$input); $1 = ($1_ltype) Z_STRVAL($input); %} %typemap(in) (char *STRING, int LENGTH), (char *STRING, size_t LENGTH) %{ convert_to_string(&$input); $1 = ($1_ltype) Z_STRVAL($input); $2 = ($2_ltype) Z_STRLEN($input); %} /* Object passed by value. Convert to a pointer */ %typemap(in) SWIGTYPE ($&1_ltype tmp) %{ if (SWIG_ConvertPtr(&$input, (void **) &tmp, $&1_descriptor, 0) < 0 || tmp == NULL) { SWIG_PHP_Error(E_ERROR, "Type error in argument $argnum of $symname. Expected $&1_descriptor"); } $1 = *tmp; %} %typemap(directorout) SWIGTYPE ($&1_ltype tmp) %{ /* If exit was via exception, PHP NULL is returned so skip the conversion. */ if (!EG(exception)) { if (SWIG_ConvertPtr($input, (void **) &tmp, $&1_descriptor, 0) < 0 || tmp == NULL) SWIG_PHP_Error(E_ERROR, "Type error in argument $argnum of $symname. Expected $&1_descriptor"); $result = *tmp; } %} %typemap(in) SWIGTYPE *, SWIGTYPE [] %{ if (SWIG_ConvertPtr(&$input, (void **) &$1, $1_descriptor, 0) < 0) { SWIG_PHP_Error(E_ERROR, "Type error in argument $argnum of $symname. Expected $1_descriptor"); } %} %typemap(in) SWIGTYPE & %{ if (SWIG_ConvertPtr(&$input, (void **) &$1, $1_descriptor, 0) < 0 || $1 == NULL) { SWIG_PHP_Error(E_ERROR, "Type error in argument $argnum of $symname. Expected $1_descriptor"); } %} %typemap(in) SWIGTYPE && %{ if (SWIG_ConvertPtr(&$input, (void **) &$1, $1_descriptor, 0) < 0 || $1 == NULL) { SWIG_PHP_Error(E_ERROR, "Type error in argument $argnum of $symname. Expected $1_descriptor"); } %} %typemap(in) SWIGTYPE *const& ($*ltype temp) %{ if (SWIG_ConvertPtr(&$input, (void **) &temp, $*1_descriptor, 0) < 0) { SWIG_PHP_Error(E_ERROR, "Type error in argument $argnum of $symname. Expected $*1_descriptor"); } $1 = ($1_ltype)&temp; %} %typemap(in) SWIGTYPE *DISOWN %{ if (SWIG_ConvertPtr(&$input, (void **) &$1, $1_descriptor, SWIG_POINTER_DISOWN ) < 0) { SWIG_PHP_Error(E_ERROR, "Type error in argument $argnum of $symname. Expected $1_descriptor"); } %} %typemap(argout) SWIGTYPE *, SWIGTYPE [], SWIGTYPE &, SWIGTYPE &&; %typemap(in) void * %{ if (SWIG_ConvertPtr(&$input, (void **) &$1, 0, 0) < 0) { /* Allow NULL from php for void* */ if (Z_ISNULL($input)) $1=0; else SWIG_PHP_Error(E_ERROR, "Type error in argument $argnum of $symname. Expected $1_descriptor"); } %} /* Special case when void* is passed by reference so it can be made to point to opaque api structs */ %typemap(in) void ** ($*1_ltype ptr, int force), void *& ($*1_ltype ptr, int force) { /* If they pass NULL by reference, make it into a void* This bit should go in arginit if arginit support init-ing scripting args */ if (SWIG_ConvertPtr(&$input, (void **) &$1, $1_descriptor, 0) < 0) { /* So... we didn't get a ref or ptr, but we'll accept NULL by reference */ if (!(Z_ISREF($input) && Z_ISNULL_P(Z_REFVAL($input)))) { /* wasn't a pre/ref/thing, OR anything like an int thing */ SWIG_PHP_Error(E_ERROR, "Type error in argument $arg of $symname."); } } force=0; if (arg1==NULL) { #ifdef __cplusplus ptr=new $*1_ltype(); #else ptr=($*1_ltype) calloc(1,sizeof($*1_ltype)); #endif $1=&ptr; /* have to passback arg$arg too */ force=1; } } %typemap(argout) void **, void *& %{ if (force$argnum) { SWIG_SetPointerZval(&$input, (void*) ptr$argnum, $*1_descriptor, 1); } %} /* Typemap for output values */ %typemap(out) int, unsigned int, short, unsigned short, long, unsigned long, signed char, unsigned char, bool, size_t %{ RETVAL_LONG($1); %} %typemap(out) enum SWIGTYPE %{ RETVAL_LONG((long)$1); %} %typemap(out) long long %{ if ((long long)LONG_MIN <= $1 && $1 <= (long long)LONG_MAX) { RETVAL_LONG((long)($1)); } else { char temp[256]; sprintf(temp, "%lld", (long long)$1); RETVAL_STRING(temp); } %} %typemap(out) unsigned long long %{ if ($1 <= (unsigned long long)LONG_MAX) { RETVAL_LONG((long)($1)); } else { char temp[256]; sprintf(temp, "%llu", (unsigned long long)$1); RETVAL_STRING(temp); } %} %typemap(out) const int &, const unsigned int &, const short &, const unsigned short &, const long &, const unsigned long &, const signed char &, const unsigned char &, const bool &, const size_t & %{ RETVAL_LONG(*$1); %} %typemap(out) const enum SWIGTYPE & %{ RETVAL_LONG((long)*$1); %} %typemap(out) const enum SWIGTYPE && %{ RETVAL_LONG((long)*$1); %} %typemap(out) const long long & %{ if ((long long)LONG_MIN <= *$1 && *$1 <= (long long)LONG_MAX) { RETVAL_LONG((long)(*$1)); } else { char temp[256]; sprintf(temp, "%lld", (long long)(*$1)); RETVAL_STRING(temp); } %} %typemap(out) const unsigned long long & %{ if (*$1 <= (unsigned long long)LONG_MAX) { RETVAL_LONG((long)(*$1)); } else { char temp[256]; sprintf(temp, "%llu", (unsigned long long)(*$1)); RETVAL_STRING(temp); } %} %typemap(directorin) int, unsigned int, short, unsigned short, long, unsigned long, signed char, unsigned char, size_t, enum SWIGTYPE %{ ZVAL_LONG($input,$1); %} %typemap(directorin) enum SWIGTYPE %{ ZVAL_LONG($input, (long)$1_name); %} %typemap(directorin) char *, char [] %{ if(!$1) { ZVAL_NULL($input); } else { ZVAL_STRING($input, (const char*)$1); } %} %typemap(out) bool %{ RETVAL_BOOL(($1) ? 1 : 0); %} %typemap(out) const bool & %{ RETVAL_BOOL((*$1) ? 1 : 0); %} %typemap(directorin) bool %{ ZVAL_BOOL($input, ($1) ? 1 : 0); %} %typemap(out) float, double %{ RETVAL_DOUBLE($1); %} %typemap(out) const float &, const double & %{ RETVAL_DOUBLE(*$1); %} %typemap(directorin) float, double %{ ZVAL_DOUBLE($input, $1); %} %typemap(out) char %{ RETVAL_STRINGL(&$1, 1); %} %typemap(out) const char & %{ RETVAL_STRINGL(&*$1, 1); %} %typemap(out) char *, char [] %{ if (!$1) { RETVAL_NULL(); } else { RETVAL_STRING((const char *)$1); } %} %typemap(out) char *& %{ if (!*$1) { RETVAL_NULL(); } else { RETVAL_STRING((const char *)*$1); } %} %typemap(out) SWIGTYPE *, SWIGTYPE [], SWIGTYPE &, SWIGTYPE && %{ SWIG_SetPointerZval(return_value, (void *)$1, $1_descriptor, $owner); %} %typemap(out) SWIGTYPE *const& %{ SWIG_SetPointerZval(return_value, (void *)*$1, $*1_descriptor, $owner); %} %typemap(directorin) SWIGTYPE *, SWIGTYPE [], SWIGTYPE &, SWIGTYPE && %{ SWIG_SetPointerZval($input, (void *)&$1, $1_descriptor, ($owner)|2); %} %typemap(out, fragment="swig_php_init_member_ptr") SWIGTYPE (CLASS::*) { void * p = emalloc(sizeof($1)); memcpy(p, &$1, sizeof($1)); RETVAL_RES(zend_register_resource(p, swig_member_ptr)); } %typemap(in, fragment="swig_php_init_member_ptr") SWIGTYPE (CLASS::*) { void * p = (void*)zend_fetch_resource_ex(&$input, SWIG_MEMBER_PTR, swig_member_ptr); memcpy(&$1, p, sizeof($1)); } %typemap(out) SWIGTYPE *DYNAMIC, SWIGTYPE &DYNAMIC { swig_type_info *ty = SWIG_TypeDynamicCast($1_descriptor, (void **) &$1); SWIG_SetPointerZval(return_value, (void *)$1, ty, $owner); } %typemap(out) SWIGTYPE #ifdef __cplusplus { $&1_ltype resultobj = new $1_ltype((const $1_ltype &) $1); SWIG_SetPointerZval(return_value, (void *)resultobj, $&1_descriptor, 1); } #else { $&1_ltype resultobj = ($&1_ltype) emalloc(sizeof($1_type)); memcpy(resultobj, &$1, sizeof($1_type)); SWIG_SetPointerZval(return_value, (void *)resultobj, $&1_descriptor, 1); } #endif %typemap(directorin) SWIGTYPE %{ SWIG_SetPointerZval($input, SWIG_as_voidptr(new $1_ltype((const $1_ltype &)$1)), $&1_descriptor, 1|2); %} %typemap(out) void ""; %typemap(out) char [ANY] { int len = 0; while (len < $1_dim0 && $1[len]) ++len; RETVAL_STRINGL($1, len); } // This typecheck does hard checking for proper argument type. If you want // an argument to be converted from a different PHP type, you must convert // it yourself before passing it (e.g. (string)4.7 or (int)"6"). %define %php_typecheck(_type,_prec,is) %typemap(typecheck,precedence=_prec) _type, const _type & " $1 = (Z_TYPE($input) == is);" %enddef // Like %php_typecheck but allows either of two values. %define %php_typecheck2(_type,_prec,is1,is2) %typemap(typecheck,precedence=_prec) _type, const _type & " $1 = (Z_TYPE($input) == is1 || Z_TYPE($input) == is2);" %enddef %php_typecheck(int,SWIG_TYPECHECK_INTEGER,IS_LONG) %php_typecheck(unsigned int,SWIG_TYPECHECK_UINT32,IS_LONG) %php_typecheck(short,SWIG_TYPECHECK_INT16,IS_LONG) %php_typecheck(unsigned short,SWIG_TYPECHECK_UINT16,IS_LONG) %php_typecheck(long,SWIG_TYPECHECK_INT32,IS_LONG) %php_typecheck(unsigned long,SWIG_TYPECHECK_UINT32,IS_LONG) %php_typecheck(long long,SWIG_TYPECHECK_INT64,IS_LONG) %php_typecheck(unsigned long long,SWIG_TYPECHECK_UINT64,IS_LONG) %php_typecheck(signed char,SWIG_TYPECHECK_INT8,IS_LONG) %php_typecheck(unsigned char,SWIG_TYPECHECK_UINT8,IS_LONG) %php_typecheck(size_t,SWIG_TYPECHECK_SIZE,IS_LONG) %php_typecheck(enum SWIGTYPE,SWIG_TYPECHECK_INTEGER,IS_LONG) %php_typecheck2(bool,SWIG_TYPECHECK_BOOL,IS_TRUE,IS_FALSE) %php_typecheck(float,SWIG_TYPECHECK_FLOAT,IS_DOUBLE) %php_typecheck(double,SWIG_TYPECHECK_DOUBLE,IS_DOUBLE) %php_typecheck(char,SWIG_TYPECHECK_CHAR,IS_STRING) %typemap(typecheck,precedence=SWIG_TYPECHECK_STRING) char *, char *&, char [] " $1 = (Z_TYPE($input) == IS_STRING); " %typecheck(SWIG_TYPECHECK_POINTER) SWIGTYPE { void *tmp; $1 = (SWIG_ConvertPtr(&$input, (void **)&tmp, $&1_descriptor, SWIG_POINTER_NO_NULL) >= 0); } %typecheck(SWIG_TYPECHECK_POINTER) SWIGTYPE *, SWIGTYPE [], SWIGTYPE *const& { void *tmp; $1 = (SWIG_ConvertPtr(&$input, (void**)&tmp, $1_descriptor, 0) >= 0); } %typecheck(SWIG_TYPECHECK_POINTER) SWIGTYPE &, SWIGTYPE && { void *tmp; $1 = (SWIG_ConvertPtr(&$input, (void**)&tmp, $1_descriptor, SWIG_POINTER_NO_NULL) >= 0); } %typecheck(SWIG_TYPECHECK_POINTER) SWIGTYPE *const& { void *tmp; $1 = (SWIG_ConvertPtr(&$input, (void**)&tmp, $*1_descriptor, 0) >= 0); } %typecheck(SWIG_TYPECHECK_VOIDPTR) void * { void *tmp; $1 = (SWIG_ConvertPtr(&$input, (void**)&tmp, 0, 0) >= 0); } /* Exception handling */ %typemap(throws) int, long, short, unsigned int, unsigned long, unsigned short %{ zend_throw_exception(NULL, "C++ $1_type exception thrown", $1); return; %} %typemap(throws) SWIGTYPE, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE *, SWIGTYPE [], SWIGTYPE [ANY] %{ (void)$1; zend_throw_exception(NULL, "C++ $1_type exception thrown", 0); return; %} %typemap(throws) char * %{ zend_throw_exception(NULL, $1, 0); return; %} /* Array reference typemaps */ %apply SWIGTYPE & { SWIGTYPE ((&)[ANY]) } %apply SWIGTYPE && { SWIGTYPE ((&&)[ANY]) } /* const pointers */ %apply SWIGTYPE * { SWIGTYPE *const } %apply SWIGTYPE (CLASS::*) { SWIGTYPE (CLASS::*const) } %apply SWIGTYPE & { SWIGTYPE (CLASS::*const&) } /* php keywords */ %include swig-4.0.1/Lib/php/phppointers.i0000644000175000017500000000275713527063513016405 0ustar williamwilliam%define %pass_by_ref( TYPE, CONVERT_IN, CONVERT_OUT ) %typemap(in, byref=1) TYPE *REF ($*1_ltype tmp), TYPE &REF ($*1_ltype tmp) %{ /* First Check for SWIG wrapped type */ if (Z_ISNULL($input)) { $1 = 0; } else if (Z_ISREF($input)) { /* Not swig wrapped type, so we check if it's a PHP reference type */ CONVERT_IN(tmp, $*1_ltype, $input); $1 = &tmp; } else { SWIG_PHP_Error(E_ERROR, SWIG_PHP_Arg_Error_Msg($argnum, Expected a reference)); } %} %typemap(argout) TYPE *REF, TYPE &REF %{ if (Z_ISREF($input)) { CONVERT_OUT(Z_REFVAL($input), tmp$argnum); } %} %enddef %pass_by_ref( size_t, CONVERT_INT_IN, ZVAL_LONG ); %pass_by_ref( signed int, CONVERT_INT_IN, ZVAL_LONG ); %pass_by_ref( int, CONVERT_INT_IN, ZVAL_LONG ); %pass_by_ref( unsigned int, CONVERT_INT_IN, ZVAL_LONG ); %pass_by_ref( signed short, CONVERT_INT_IN, ZVAL_LONG ); %pass_by_ref( short, CONVERT_INT_IN, ZVAL_LONG ); %pass_by_ref( unsigned short, CONVERT_INT_IN, ZVAL_LONG ); %pass_by_ref( signed long, CONVERT_INT_IN, ZVAL_LONG ); %pass_by_ref( long, CONVERT_INT_IN, ZVAL_LONG ); %pass_by_ref( unsigned long, CONVERT_INT_IN, ZVAL_LONG ); %pass_by_ref( signed char, CONVERT_INT_IN, ZVAL_LONG ); %pass_by_ref( char, CONVERT_CHAR_IN, ZVAL_STRING ); %pass_by_ref( unsigned char, CONVERT_INT_IN, ZVAL_LONG ); %pass_by_ref( float, CONVERT_FLOAT_IN, ZVAL_DOUBLE ); %pass_by_ref( double, CONVERT_FLOAT_IN, ZVAL_DOUBLE ); %pass_by_ref( char *, CONVERT_CHAR_IN, ZVAL_STRING ); swig-4.0.1/Lib/php/std_vector.i0000644000175000017500000000604613527063513016201 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_vector.i * ----------------------------------------------------------------------------- */ %include %{ #include #include %} namespace std { template class vector { public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef T value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; vector(); vector(size_type n); vector(const vector& other); size_type size() const; size_type capacity() const; void reserve(size_type n); void clear(); %rename(push) push_back; void push_back(const value_type& x); %extend { bool is_empty() const { return $self->empty(); } T pop() throw (std::out_of_range) { if (self->size() == 0) throw std::out_of_range("pop from empty vector"); T x = self->back(); self->pop_back(); return x; } const_reference get(int i) throw (std::out_of_range) { int size = int(self->size()); if (i>=0 && isize()); if (i>=0 && i class vector { public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef bool value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef bool const_reference; vector(); vector(size_type n); vector(const vector& other); size_type size() const; size_type capacity() const; void reserve(size_type n); void clear(); %rename(push) push_back; void push_back(const value_type& x); %extend { bool is_empty() const { return $self->empty(); } bool pop() throw (std::out_of_range) { if (self->size() == 0) throw std::out_of_range("pop from empty vector"); bool x = self->back(); self->pop_back(); return x; } bool get(int i) throw (std::out_of_range) { int size = int(self->size()); if (i>=0 && isize()); if (i>=0 && ivalue.lval = (long)$1; } } //SAMFIX need to cast zval->type, what if zend-hash_find fails? etc? %typemap(varout) bool { zval *z_var = zend_hash_str_find(&EG(symbol_table), "$1", sizeof("$1") - 1); if ($1 != ($1_ltype)Z_LVAL_P(z_var)) { z_var->value.lval = (long)$1; } } %typemap(varout) double, float { zval *z_var = zend_hash_str_find(&EG(symbol_table), "$1", sizeof("$1") - 1); if ($1 != ($1_ltype)Z_DVAL_P(z_var)) { z_var->value.dval = (double)$1; } } %typemap(varout) char { zval *z_var = zend_hash_str_find(&EG(symbol_table), "$1", sizeof("$1") - 1); char c = $1; if ($1 != Z_STRVAL_P(z_val)[0]) { ZVAL_STRING(z_var, &c); } } %typemap(varout) char * { zval *z_var = zend_hash_str_find(&EG(symbol_table), "$1", sizeof("$1") - 1); const char *s1 = Z_STRVAL_P(z_var); if ((s1 == NULL) || ($1 == NULL) || strcmp(s1, $1)) { if (s1) efree(s1); if ($1) { (z_var)->value.str.val = estrdup($1); (z_var)->value.str.len = strlen($1) + 1; } else { (z_var)->value.str.val = 0; (z_var)->value.str.len = 0; } } } %typemap(varout) SWIGTYPE { zval *z_var = zend_hash_str_find(&EG(symbol_table), "$1", sizeof("$1") - 1); SWIG_SetPointerZval(z_var, (void*)&$1, $&1_descriptor, 0); } %typemap(varout) SWIGTYPE [] { if($1) { zval *z_var = zend_hash_str_find(&EG(symbol_table), "$1", sizeof("$1") - 1); SWIG_SetPointerZval(z_var, (void*)$1, $1_descriptor, 0); } } %typemap(varout) char [ANY] { zval *z_var = zend_hash_str_find(&EG(symbol_table), "$1", sizeof("$1") - 1); const char *s1 = Z_STRVAL_P(z_var); deliberate error cos this code looks bogus to me if ((s1 == NULL) || strcmp(s1, $1)) { if ($1) { (z_var)->value.str.val = estrdup($1); (z_var)->value.str.len = strlen($1) + 1; } else { (z_var)->value.str.val = 0; (z_var)->value.str.len = 0; } } } %typemap(varout) SWIGTYPE *, SWIGTYPE &, SWIGTYPE && { zval *z_var = zend_hash_str_find(&EG(symbol_table), "$1", sizeof("$1") - 1); SWIG_SetPointerZval(z_var, (void*)$1, $1_descriptor, 0); } %typemap(varout, fragment="swig_php_init_member_ptr") SWIGTYPE (CLASS::*) { zval resource; void * p = emalloc(sizeof($1)); memcpy(p, &$1, sizeof($1)); ZVAL_RES(&resource, zend_register_resource(p, swig_member_ptr)); zend_hash_str_add(&EG(symbol_table), "$1", sizeof("$1") - 1, &resource); } swig-4.0.1/Lib/php/utils.i0000644000175000017500000000454513527063513015167 0ustar williamwilliam %define CONVERT_BOOL_IN(lvar,t,invar) lvar = (t) zval_is_true(&invar); %enddef %define CONVERT_INT_IN(lvar,t,invar) lvar = (t) zval_get_long(&invar); %enddef %define CONVERT_LONG_LONG_IN(lvar,t,invar) switch (Z_TYPE(invar)) { case IS_DOUBLE: lvar = (t) Z_DVAL(invar); break; case IS_STRING: { char * endptr; errno = 0; lvar = (t) strtoll(Z_STRVAL(invar), &endptr, 10); if (*endptr && !errno) break; /* FALL THRU */ } default: lvar = (t) zval_get_long(&invar); } %enddef %define CONVERT_UNSIGNED_LONG_LONG_IN(lvar,t,invar) switch (Z_TYPE(invar)) { case IS_DOUBLE: lvar = (t) Z_DVAL(invar); break; case IS_STRING: { char * endptr; errno = 0; lvar = (t) strtoull(Z_STRVAL(invar), &endptr, 10); if (*endptr && !errno) break; /* FALL THRU */ } default: lvar = (t) zval_get_long(&invar); } %enddef %define CONVERT_INT_OUT(lvar,invar) lvar = (t) zval_get_long(&invar); %enddef %define CONVERT_FLOAT_IN(lvar,t,invar) lvar = (t) zval_get_double(&invar); %enddef %define CONVERT_CHAR_IN(lvar,t,invar) convert_to_string(&invar); lvar = (t) Z_STRVAL(invar)[0]; %enddef %define CONVERT_STRING_IN(lvar,t,invar) if (Z_ISNULL(invar)) { lvar = (t) 0; } else { convert_to_string(&invar); lvar = (t) Z_STRVAL(invar); } %enddef %define %pass_by_val( TYPE, CONVERT_IN ) %typemap(in) TYPE %{ CONVERT_IN($1,$1_ltype,$input); %} %typemap(in) const TYPE & ($*1_ltype temp) %{ CONVERT_IN(temp,$*1_ltype,$input); $1 = &temp; %} %typemap(directorout) TYPE %{ if (!EG(exception)) { CONVERT_IN($result, $1_ltype, *$input); } %} %typemap(directorout) const TYPE & ($*1_ltype temp) %{ if (!EG(exception)) { CONVERT_IN(temp, $*1_ltype, *$input); } $result = &temp; %} %enddef %fragment("t_output_helper","header") %{ static void t_output_helper(zval *target, zval *o) { zval tmp; if (Z_TYPE_P(target) == IS_ARRAY) { /* it's already an array, just append */ add_next_index_zval(target, o); return; } if (Z_TYPE_P(target) == IS_NULL) { /* NULL isn't refcounted */ ZVAL_COPY_VALUE(target, o); return; } ZVAL_DUP(&tmp, target); array_init(target); add_next_index_zval(target, &tmp); add_next_index_zval(target, o); } %} swig-4.0.1/Lib/php/phprun.swg0000644000175000017500000002013713527063513015706 0ustar williamwilliam/* ----------------------------------------------------------------------------- * phprun.swg * * PHP runtime library * ----------------------------------------------------------------------------- */ #ifdef __cplusplus extern "C" { #endif #include "zend.h" #include "zend_API.h" #include "zend_exceptions.h" #include "php.h" #if PHP_MAJOR_VERSION != 7 # error These bindings need PHP7 - to generate PHP5 bindings use: SWIG < 4.0.0 and swig -php5 #endif #include "ext/standard/php_string.h" #include /* for abort(), used in generated code. */ /* This indirection is to work around const correctness issues in older PHP. * FIXME: Remove for PHP7? Or might user code be using it? */ #define SWIG_ZEND_NAMED_FE(ZN, N, A) ZEND_NAMED_FE(ZN, N, A) #define SWIG_BOOL_CONSTANT(N, V) REGISTER_BOOL_CONSTANT(#N, V, CONST_CS | CONST_PERSISTENT) #define SWIG_LONG_CONSTANT(N, V) REGISTER_LONG_CONSTANT(#N, V, CONST_CS | CONST_PERSISTENT) #define SWIG_DOUBLE_CONSTANT(N, V) REGISTER_DOUBLE_CONSTANT(#N, V, CONST_CS | CONST_PERSISTENT) #define SWIG_STRING_CONSTANT(N, V) REGISTER_STRING_CONSTANT(#N, (char*)V, CONST_CS | CONST_PERSISTENT) #define SWIG_CHAR_CONSTANT(N, V) do {\ char swig_char = (V);\ REGISTER_STRINGL_CONSTANT(#N, &swig_char, 1, CONST_CS | CONST_PERSISTENT);\ } while (0) /* ZEND_CONSTANT_SET_FLAGS is new in PHP 7.3. */ #ifdef ZEND_CONSTANT_SET_FLAGS # define SWIG_ZEND_CONSTANT_SET_FLAGS ZEND_CONSTANT_SET_FLAGS #else # define SWIG_ZEND_CONSTANT_SET_FLAGS(C, F, N) do { (C)->flags = (F); (C)->module_number = (N); } while (0) #endif #ifdef __cplusplus } #endif #define SWIG_fail goto fail static const char *default_error_msg = "Unknown error occurred"; static int default_error_code = E_ERROR; #define SWIG_PHP_Arg_Error_Msg(argnum,extramsg) "Error in argument " #argnum " "#extramsg #define SWIG_PHP_Error(code,msg) do { SWIG_ErrorCode() = code; SWIG_ErrorMsg() = msg; SWIG_fail; } while (0) #define SWIG_contract_assert(expr,msg) \ if (!(expr) ) { zend_printf("Contract Assert Failed %s\n",msg ); } else /* Standard SWIG API */ #define SWIG_GetModule(clientdata) SWIG_Php_GetModule() #define SWIG_SetModule(clientdata, pointer) SWIG_Php_SetModule(pointer, *(int*)clientdata) /* used to wrap returned objects in so we know whether they are newobject and need freeing, or not */ typedef struct { void * ptr; int newobject; } swig_object_wrapper; #define SWIG_as_voidptr(a) const_cast< void * >(static_cast< const void * >(a)) static void SWIG_SetPointerZval(zval *z, void *ptr, swig_type_info *type, int newobject) { /* * First test for Null pointers. Return those as PHP native NULL */ if (!ptr ) { ZVAL_NULL(z); return; } if (type->clientdata) { swig_object_wrapper *value; if (! (*(int *)(type->clientdata))) zend_error(E_ERROR, "Type: %s failed to register with zend",type->name); value=(swig_object_wrapper *)emalloc(sizeof(swig_object_wrapper)); value->ptr=ptr; value->newobject=(newobject & 1); if ((newobject & 2) == 0) { /* Just register the pointer as a resource. */ ZVAL_RES(z, zend_register_resource(value, *(int *)(type->clientdata))); } else { /* * Wrap the resource in an object, the resource will be accessible * via the "_cPtr" member. This is currently only used by * directorin typemaps. */ zval resource; zend_class_entry *ce = NULL; const char *type_name = type->name+3; /* +3 so: _p_Foo -> Foo */ size_t type_name_len; const char * p; HashTable * ht; /* Namespace__Foo -> Foo */ /* FIXME: ugly and goes wrong for classes with __ in their names. */ while ((p = strstr(type_name, "__")) != NULL) { type_name = p + 2; } type_name_len = strlen(type_name); ZVAL_RES(&resource, zend_register_resource(value, *(int *)(type->clientdata))); if (SWIG_PREFIX_LEN > 0) { zend_string * classname = zend_string_alloc(SWIG_PREFIX_LEN + type_name_len, 0); memcpy(classname->val, SWIG_PREFIX, SWIG_PREFIX_LEN); memcpy(classname->val + SWIG_PREFIX_LEN, type_name, type_name_len); ce = zend_lookup_class(classname); zend_string_release(classname); } else { zend_string * classname = zend_string_init(type_name, type_name_len, 0); ce = zend_lookup_class(classname); zend_string_release(classname); } if (ce == NULL) { /* class does not exist */ ce = zend_standard_class_def; } ALLOC_HASHTABLE(ht); zend_hash_init(ht, 1, NULL, NULL, 0); zend_hash_str_update(ht, "_cPtr", sizeof("_cPtr") - 1, &resource); object_and_properties_init(z, ce, ht); } return; } zend_error(E_ERROR, "Type: %s not registered with zend",type->name); } /* This pointer conversion routine takes the native pointer p (along with its type name) and converts it by calling appropriate casting functions according to ty. The resultant pointer is returned, or NULL is returned if the pointer can't be cast. Sadly PHP has no API to find a type name from a type id, only from an instance of a resource of the type id, so we have to pass type_name as well. The two functions which might call this are: SWIG_ConvertResourcePtr which gets the type name from the resource and the registered zend destructors for which we have one per type each with the type name hard wired in. */ static void * SWIG_ConvertResourceData(void * p, const char *type_name, swig_type_info *ty) { swig_cast_info *tc; void *result = 0; if (!ty) { /* They don't care about the target type, so just pass on the pointer! */ return p; } if (! type_name) { /* can't convert p to ptr type ty if we don't know what type p is */ return NULL; } /* convert and cast p from type_name to ptr as ty. */ tc = SWIG_TypeCheck(type_name, ty); if (tc) { int newmemory = 0; result = SWIG_TypeCast(tc, p, &newmemory); assert(!newmemory); /* newmemory handling not yet implemented */ } return result; } /* This function returns a pointer of type ty by extracting the pointer and type info from the resource in z. z must be a resource. If it fails, NULL is returned. It uses SWIG_ConvertResourceData to do the real work. */ static void * SWIG_ConvertResourcePtr(zval *z, swig_type_info *ty, int flags) { swig_object_wrapper *value; void *p; const char *type_name; if (Z_RES_TYPE_P(z) == -1) return NULL; value = (swig_object_wrapper *) Z_RES_VAL_P(z); if (flags & SWIG_POINTER_DISOWN) { value->newobject = 0; } p = value->ptr; type_name=zend_rsrc_list_get_rsrc_type(Z_RES_P(z)); return SWIG_ConvertResourceData(p, type_name, ty); } /* We allow passing of a RESOURCE pointing to the object or an OBJECT whose _cPtr is a resource pointing to the object */ static int SWIG_ConvertPtr(zval *z, void **ptr, swig_type_info *ty, int flags) { if (z == NULL) { *ptr = 0; return 0; } switch (Z_TYPE_P(z)) { case IS_OBJECT: { HashTable * ht = Z_OBJ_HT_P(z)->get_properties(z); if (ht) { zval * _cPtr = zend_hash_str_find(ht, "_cPtr", sizeof("_cPtr") - 1); if (_cPtr) { if (Z_TYPE_P(_cPtr) == IS_INDIRECT) { _cPtr = Z_INDIRECT_P(_cPtr); } if (Z_TYPE_P(_cPtr) == IS_RESOURCE) { *ptr = SWIG_ConvertResourcePtr(_cPtr, ty, flags); return (*ptr == NULL ? -1 : 0); } } } break; } case IS_RESOURCE: *ptr = SWIG_ConvertResourcePtr(z, ty, flags); return (*ptr == NULL ? -1 : 0); case IS_NULL: *ptr = 0; return (flags & SWIG_POINTER_NO_NULL) ? SWIG_NullReferenceError : SWIG_OK; } return -1; } static const char const_name[] = "swig_runtime_data_type_pointer"; static swig_module_info *SWIG_Php_GetModule() { zval *pointer = zend_get_constant_str(const_name, sizeof(const_name) - 1); if (pointer) { if (Z_TYPE_P(pointer) == IS_LONG) { return (swig_module_info *) pointer->value.lval; } } return NULL; } static void SWIG_Php_SetModule(swig_module_info *pointer, int module_number) { REGISTER_LONG_CONSTANT(const_name, (long) pointer, CONST_CS | CONST_PERSISTENT); } swig-4.0.1/Lib/php/std_common.i0000644000175000017500000000044213527063513016161 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_common.i * * SWIG typemaps for STL - common utilities * ----------------------------------------------------------------------------- */ %include %apply size_t { std::size_t }; swig-4.0.1/Lib/php/typemaps.i0000644000175000017500000002321713527063513015666 0ustar williamwilliam/* ----------------------------------------------------------------------------- * typemaps.i. * * SWIG Typemap library for PHP. * * This library provides standard typemaps for modifying SWIG's behavior. * With enough entries in this file, I hope that very few people actually * ever need to write a typemap. * * Define macros to define the following typemaps: * * TYPE *INPUT. Argument is passed in as native variable by value. * TYPE *OUTPUT. Argument is returned as an array from the function call. * TYPE *INOUT. Argument is passed in by value, and out as part of returned list * TYPE *REFERENCE. Argument is passed in as native variable with value * semantics. Variable value is changed with result. * Use like this: * int foo(int *REFERENCE); * * $a = 0; * $rc = foo($a); * * Even though $a looks like it's passed by value, * its value can be changed by foo(). * ----------------------------------------------------------------------------- */ %define BOOL_TYPEMAP(TYPE) %typemap(in) TYPE *INPUT(TYPE temp), TYPE &INPUT(TYPE temp) %{ convert_to_boolean(&$input); temp = (Z_TYPE($input) == IS_TRUE); $1 = &temp; %} %typemap(argout) TYPE *INPUT, TYPE &INPUT ""; %typemap(in,numinputs=0) TYPE *OUTPUT(TYPE temp), TYPE &OUTPUT(TYPE temp) "$1 = &temp;"; %typemap(argout,fragment="t_output_helper") TYPE *OUTPUT, TYPE &OUTPUT { zval o; ZVAL_BOOL(&o, temp$argnum); t_output_helper($result, &o); } %typemap(in) TYPE *REFERENCE (TYPE lvalue), TYPE &REFERENCE (TYPE lvalue) %{ convert_to_boolean($input); lvalue = (Z_TYPE_P($input) == IS_TRUE); $1 = &lvalue; %} %typemap(argout) TYPE *REFERENCE, TYPE &REFERENCE %{ ZVAL_BOOL(&$arg, lvalue$argnum ? true : false); %} %enddef %define DOUBLE_TYPEMAP(TYPE) %typemap(in) TYPE *INPUT(TYPE temp), TYPE &INPUT(TYPE temp) %{ temp = (TYPE) zval_get_double(&$input); $1 = &temp; %} %typemap(argout) TYPE *INPUT, TYPE &INPUT ""; %typemap(in,numinputs=0) TYPE *OUTPUT(TYPE temp), TYPE &OUTPUT(TYPE temp) "$1 = &temp;"; %typemap(argout,fragment="t_output_helper") TYPE *OUTPUT, TYPE &OUTPUT { zval o; ZVAL_DOUBLE(&o, temp$argnum); t_output_helper($result, &o); } %typemap(in) TYPE *REFERENCE (TYPE dvalue), TYPE &REFERENCE (TYPE dvalue) %{ dvalue = (TYPE) zval_get_double(&$input); $1 = &dvalue; %} %typemap(argout) TYPE *REFERENCE, TYPE &REFERENCE %{ ZVAL_DOUBLE(&$arg, (double)(lvalue$argnum)); %} %enddef %define INT_TYPEMAP(TYPE) %typemap(in) TYPE *INPUT(TYPE temp), TYPE &INPUT(TYPE temp) %{ temp = (TYPE) zval_get_long(&$input); $1 = &temp; %} %typemap(argout) TYPE *INPUT, TYPE &INPUT ""; %typemap(in,numinputs=0) TYPE *OUTPUT(TYPE temp), TYPE &OUTPUT(TYPE temp) "$1 = &temp;"; %typemap(argout,fragment="t_output_helper") TYPE *OUTPUT, TYPE &OUTPUT { zval o; ZVAL_LONG(&o, temp$argnum); t_output_helper($result, &o); } %typemap(in) TYPE *REFERENCE (TYPE lvalue), TYPE &REFERENCE (TYPE lvalue) %{ lvalue = (TYPE) zval_get_long(&$input); $1 = &lvalue; %} %typemap(argout) TYPE *REFERENCE, TYPE &REFERENCE %{ ZVAL_LONG(&$arg, (long)(lvalue$argnum)); %} %enddef BOOL_TYPEMAP(bool); DOUBLE_TYPEMAP(float); DOUBLE_TYPEMAP(double); INT_TYPEMAP(int); INT_TYPEMAP(short); INT_TYPEMAP(long); INT_TYPEMAP(unsigned int); INT_TYPEMAP(unsigned short); INT_TYPEMAP(unsigned long); INT_TYPEMAP(unsigned char); INT_TYPEMAP(signed char); INT_TYPEMAP(long long); %typemap(argout,fragment="t_output_helper") long long *OUTPUT { zval o; if ((long long)LONG_MIN <= temp$argnum && temp$argnum <= (long long)LONG_MAX) { ZVAL_LONG(&o, (long)temp$argnum); } else { char temp[256]; sprintf(temp, "%lld", (long long)temp$argnum); ZVAL_STRING(&o, temp); } t_output_helper($result, &o); } %typemap(in) TYPE *REFERENCE (long long lvalue) %{ CONVERT_LONG_LONG_IN(lvalue, long long, $input) $1 = &lvalue; %} %typemap(argout) long long *REFERENCE %{ if ((long long)LONG_MIN <= lvalue$argnum && lvalue$argnum <= (long long)LONG_MAX) { ZVAL_LONG(&$arg, (long)temp$argnum); } else { char temp[256]; sprintf(temp, "%lld", (long long)lvalue$argnum); ZVAL_STRING(&$arg, temp); } %} %typemap(argout) long long &OUTPUT %{ if ((long long)LONG_MIN <= *arg$argnum && *arg$argnum <= (long long)LONG_MAX) { ZVAL_LONG($result, (long)(*arg$argnum)); } else { char temp[256]; sprintf(temp, "%lld", (long long)(*arg$argnum)); ZVAL_STRING($result, temp); } %} INT_TYPEMAP(unsigned long long); %typemap(argout,fragment="t_output_helper") unsigned long long *OUTPUT { zval o; if (temp$argnum <= (unsigned long long)LONG_MAX) { ZVAL_LONG(&o, temp$argnum); } else { char temp[256]; sprintf(temp, "%llu", (unsigned long long)temp$argnum); ZVAL_STRING(&o, temp); } t_output_helper($result, &o); } %typemap(in) TYPE *REFERENCE (unsigned long long lvalue) %{ CONVERT_UNSIGNED_LONG_LONG_IN(lvalue, unsigned long long, $input) $1 = &lvalue; %} %typemap(argout) unsigned long long *REFERENCE %{ if (lvalue$argnum <= (unsigned long long)LONG_MAX) { ZVAL_LONG($arg, (long)(lvalue$argnum)); } else { char temp[256]; sprintf(temp, "%llu", (unsigned long long)lvalue$argnum); ZVAL_STRING((*$arg), temp); } %} %typemap(argout) unsigned long long &OUTPUT %{ if (*arg$argnum <= (unsigned long long)LONG_MAX) { ZVAL_LONG($result, (long)(*arg$argnum)); } else { char temp[256]; sprintf(temp, "%llu", (unsigned long long)(*arg$argnum)); ZVAL_STRING($result, temp); } %} %typemap(in) bool *INOUT = bool *INPUT; %typemap(in) float *INOUT = float *INPUT; %typemap(in) double *INOUT = double *INPUT; %typemap(in) int *INOUT = int *INPUT; %typemap(in) short *INOUT = short *INPUT; %typemap(in) long *INOUT = long *INPUT; %typemap(in) long long *INOUT = long long *INPUT; %typemap(in) unsigned *INOUT = unsigned *INPUT; %typemap(in) unsigned short *INOUT = unsigned short *INPUT; %typemap(in) unsigned long *INOUT = unsigned long *INPUT; %typemap(in) unsigned char *INOUT = unsigned char *INPUT; %typemap(in) unsigned long long *INOUT = unsigned long long *INPUT; %typemap(in) signed char *INOUT = signed char *INPUT; %typemap(in) bool &INOUT = bool *INPUT; %typemap(in) float &INOUT = float *INPUT; %typemap(in) double &INOUT = double *INPUT; %typemap(in) int &INOUT = int *INPUT; %typemap(in) short &INOUT = short *INPUT; %typemap(in) long &INOUT = long *INPUT; %typemap(in) long long &INOUT = long long *INPUT; %typemap(in) long long &INPUT = long long *INPUT; %typemap(in) unsigned &INOUT = unsigned *INPUT; %typemap(in) unsigned short &INOUT = unsigned short *INPUT; %typemap(in) unsigned long &INOUT = unsigned long *INPUT; %typemap(in) unsigned char &INOUT = unsigned char *INPUT; %typemap(in) unsigned long long &INOUT = unsigned long long *INPUT; %typemap(in) unsigned long long &INPUT = unsigned long long *INPUT; %typemap(in) signed char &INOUT = signed char *INPUT; %typemap(argout) bool *INOUT = bool *OUTPUT; %typemap(argout) float *INOUT = float *OUTPUT; %typemap(argout) double *INOUT= double *OUTPUT; %typemap(argout) int *INOUT = int *OUTPUT; %typemap(argout) short *INOUT = short *OUTPUT; %typemap(argout) long *INOUT= long *OUTPUT; %typemap(argout) long long *INOUT= long long *OUTPUT; %typemap(argout) unsigned short *INOUT= unsigned short *OUTPUT; %typemap(argout) unsigned long *INOUT = unsigned long *OUTPUT; %typemap(argout) unsigned char *INOUT = unsigned char *OUTPUT; %typemap(argout) unsigned long long *INOUT = unsigned long long *OUTPUT; %typemap(argout) signed char *INOUT = signed char *OUTPUT; %typemap(argout) bool &INOUT = bool *OUTPUT; %typemap(argout) float &INOUT = float *OUTPUT; %typemap(argout) double &INOUT= double *OUTPUT; %typemap(argout) int &INOUT = int *OUTPUT; %typemap(argout) short &INOUT = short *OUTPUT; %typemap(argout) long &INOUT= long *OUTPUT; %typemap(argout) long long &INOUT= long long *OUTPUT; %typemap(argout) unsigned short &INOUT= unsigned short *OUTPUT; %typemap(argout) unsigned long &INOUT = unsigned long *OUTPUT; %typemap(argout) unsigned char &INOUT = unsigned char *OUTPUT; %typemap(argout) unsigned long long &INOUT = unsigned long long *OUTPUT; %typemap(argout) signed char &INOUT = signed char *OUTPUT; %typemap(in) char INPUT[ANY] ( char temp[$1_dim0] ) %{ convert_to_string(&$input); strncpy(temp, Z_STRVAL($input), $1_dim0); $1 = temp; %} %typemap(in,numinputs=0) char OUTPUT[ANY] ( char temp[$1_dim0] ) "$1 = temp;"; %typemap(argout,fragment="t_output_helper") char OUTPUT[ANY] { zval o; ZVAL_STRINGL(&o, temp$argnum, $1_dim0); t_output_helper($result, &o); } %typemap(in,numinputs=0) void **OUTPUT (int force), void *&OUTPUT (int force) %{ /* If they pass NULL by reference, make it into a void* This bit should go in arginit if arginit support init-ing scripting args */ if (SWIG_ConvertPtr(&$input, (void **) &$1, $1_descriptor, 0) < 0) { /* So... we didn't get a ref or ptr, but we'll accept NULL by reference */ if (!(Z_ISREF($input) && Z_ISNULL_P(Z_REFVAL($input)))) { /* wasn't a pre/ref/thing, OR anything like an int thing */ SWIG_PHP_Error(E_ERROR, "Type error in argument $arg of $symname."); } } force=0; if (arg1==NULL) { #ifdef __cplusplus ptr=new $*1_ltype(); #else ptr=($*1_ltype) calloc(1,sizeof($*1_ltype)); #endif $1=&ptr; /* have to passback arg$arg too */ force=1; } %} %typemap(argout) void **OUTPUT, void *&OUTPUT %{ if (force$argnum) { /* pass back arg$argnum through params ($arg) if we can */ if (!Z_ISREF($arg)) { SWIG_PHP_Error(E_WARNING, "Parameter $argnum of $symname wasn't passed by reference"); } else { SWIG_SetPointerZval(*$arg, (void *) ptr$argnum, $*1_descriptor, 1); } } %} swig-4.0.1/Lib/php/std_pair.i0000644000175000017500000000140513527063513015624 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_pair.i * * SWIG typemaps for std::pair * ----------------------------------------------------------------------------- */ %include %include // ------------------------------------------------------------------------ // std::pair // ------------------------------------------------------------------------ %{ #include %} namespace std { template struct pair { typedef T first_type; typedef U second_type; pair(); pair(T first, U second); pair(const pair& other); template pair(const pair &other); T first; U second; }; // add specializations here } swig-4.0.1/Lib/php/stl.i0000644000175000017500000000044313527063513014622 0ustar williamwilliam/* ----------------------------------------------------------------------------- * stl.i * ----------------------------------------------------------------------------- */ %include %include %include %include %include swig-4.0.1/Lib/php/const.i0000644000175000017500000000262213527063513015147 0ustar williamwilliam/* ----------------------------------------------------------------------------- * const.i * * Typemaps for constants * ----------------------------------------------------------------------------- */ %typemap(consttab) int, unsigned int, short, unsigned short, long, unsigned long, unsigned char, signed char, enum SWIGTYPE "SWIG_LONG_CONSTANT($symname, ($1_type)$value);"; %typemap(consttab) bool "SWIG_BOOL_CONSTANT($symname, ($1_type)$value);"; %typemap(consttab) float, double "SWIG_DOUBLE_CONSTANT($symname, $value);"; %typemap(consttab) char "SWIG_CHAR_CONSTANT($symname, $value);"; %typemap(consttab) char *, const char *, char [], const char [] "SWIG_STRING_CONSTANT($symname, $value);"; %typemap(consttab) SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE [] { zend_constant c; SWIG_SetPointerZval(&c.value, (void*)$value, $1_descriptor, 0); zval_copy_ctor(&c.value); c.name = zend_string_init("$symname", sizeof("$symname") - 1, 0); SWIG_ZEND_CONSTANT_SET_FLAGS(&c, CONST_CS, module_number); zend_register_constant(&c); } /* Handled as a global variable. */ %typemap(consttab) SWIGTYPE (CLASS::*) ""; swig-4.0.1/Lib/php/std_string.i0000644000175000017500000000515513527063513016205 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_string.i * * SWIG typemaps for std::string types * ----------------------------------------------------------------------------- */ // ------------------------------------------------------------------------ // std::string is typemapped by value // This can prevent exporting methods which return a string // in order for the user to modify it. // However, I think I'll wait until someone asks for it... // ------------------------------------------------------------------------ %include %{ #include %} namespace std { %naturalvar string; class string; %typemap(typecheck,precedence=SWIG_TYPECHECK_STRING) string, const string& %{ $1 = (Z_TYPE($input) == IS_STRING) ? 1 : 0; %} %typemap(in) string %{ convert_to_string(&$input); $1.assign(Z_STRVAL($input), Z_STRLEN($input)); %} %typemap(directorout) string %{ if (!EG(exception)) { convert_to_string($input); $result.assign(Z_STRVAL_P($input), Z_STRLEN_P($input)); } %} %typemap(out) string %{ ZVAL_STRINGL($result, $1.data(), $1.size()); %} %typemap(directorin) string, const string& %{ ZVAL_STRINGL($input, $1.data(), $1.size()); %} %typemap(out) const string & %{ ZVAL_STRINGL($result, $1->data(), $1->size()); %} %typemap(throws) string, const string& %{ zend_throw_exception(NULL, $1.c_str(), 0); return; %} %typemap(in) const string & ($*1_ltype temp) %{ convert_to_string(&$input); temp.assign(Z_STRVAL($input), Z_STRLEN($input)); $1 = &temp; %} /* These next two handle a function which takes a non-const reference to * a std::string and modifies the string. */ %typemap(in,byref=1) string & ($*1_ltype temp) %{ { zval * p = Z_ISREF($input) ? Z_REFVAL($input) : &$input; convert_to_string(p); temp.assign(Z_STRVAL_P(p), Z_STRLEN_P(p)); $1 = &temp; } %} %typemap(directorout) string & ($*1_ltype *temp) %{ if (!EG(exception)) { convert_to_string($input); temp = new $*1_ltype(Z_STRVAL_P($input), Z_STRLEN_P($input)); swig_acquire_ownership(temp); $result = temp; } %} %typemap(argout) string & %{ if (Z_ISREF($input)) { ZVAL_STRINGL(Z_REFVAL($input), $1->data(), $1->size()); } %} /* SWIG will apply the non-const typemap above to const string& without * this more specific typemap. */ %typemap(argout) const string & ""; } swig-4.0.1/Lib/php/std_map.i0000644000175000017500000000515213527063513015451 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_map.i * * SWIG typemaps for std::map * ----------------------------------------------------------------------------- */ %include // ------------------------------------------------------------------------ // std::map // ------------------------------------------------------------------------ %{ #include #include #include %} // exported class namespace std { template > class map { // add typemaps here public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef K key_type; typedef T mapped_type; typedef std::pair< const K, T > value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; map(); map(const map& other); unsigned int size() const; void clear(); %extend { const T& get(const K& key) throw (std::out_of_range) { std::map< K, T, C >::iterator i = self->find(key); if (i != self->end()) return i->second; else throw std::out_of_range("key not found"); } void set(const K& key, const T& x) { (*self)[key] = x; } void del(const K& key) throw (std::out_of_range) { std::map< K, T, C >::iterator i = self->find(key); if (i != self->end()) self->erase(i); else throw std::out_of_range("key not found"); } bool has_key(const K& key) { std::map< K, T, C >::iterator i = self->find(key); return i != self->end(); } bool is_empty() const { return self->empty(); } } }; // Legacy macros (deprecated) %define specialize_std_map_on_key(K,CHECK,CONVERT_FROM,CONVERT_TO) #warning "specialize_std_map_on_key ignored - macro is deprecated and no longer necessary" %enddef %define specialize_std_map_on_value(T,CHECK,CONVERT_FROM,CONVERT_TO) #warning "specialize_std_map_on_value ignored - macro is deprecated and no longer necessary" %enddef %define specialize_std_map_on_both(K,CHECK_K,CONVERT_K_FROM,CONVERT_K_TO, T,CHECK_T,CONVERT_T_FROM,CONVERT_T_TO) #warning "specialize_std_map_on_both ignored - macro is deprecated and no longer necessary" %enddef } swig-4.0.1/Lib/php/phpinit.swg0000644000175000017500000000126713527063513016050 0ustar williamwilliam /* ------------------------------------------------------------ * The start of the PHP initialization function * ------------------------------------------------------------ */ %insert(init) "swiginit.swg" %init %{ SWIG_php_minit { SWIG_InitializeModule((void*)&module_number); %} %fragment("swig_php_init_member_ptr2", "header") %{ #define SWIG_MEMBER_PTR "CLASS::*" static void swig_member_ptr_dtor(zend_resource *res) { efree(res->ptr); } static int swig_member_ptr = 0; %} %fragment("swig_php_init_member_ptr", "init", fragment="swig_php_init_member_ptr2") %{ swig_member_ptr = zend_register_list_destructors_ex(swig_member_ptr_dtor, NULL, SWIG_MEMBER_PTR, module_number); %} swig-4.0.1/Lib/php/factory.i0000644000175000017500000000604513527063513015473 0ustar williamwilliam/* Implement a more natural wrap for factory methods, for example, if you have: ---- geometry.h -------- struct Geometry { enum GeomType{ POINT, CIRCLE }; virtual ~Geometry() {} virtual int draw() = 0; // // Factory method for all the Geometry objects // static Geometry *create(GeomType i); }; struct Point : Geometry { int draw() { return 1; } double width() { return 1.0; } }; struct Circle : Geometry { int draw() { return 2; } double radius() { return 1.5; } }; // // Factory method for all the Geometry objects // Geometry *Geometry::create(GeomType type) { switch (type) { case POINT: return new Point(); case CIRCLE: return new Circle(); default: return 0; } } ---- geometry.h -------- You can use the %factory with the Geometry::create method as follows: %newobject Geometry::create; %factory(Geometry *Geometry::create, Point, Circle); %include "geometry.h" and Geometry::create will return a 'Point' or 'Circle' instance instead of the plain 'Geometry' type. For example, in python: circle = Geometry.create(Geometry.CIRCLE) r = circle.radius() where circle is a Circle proxy instance. NOTES: remember to fully qualify all the type names and don't use %factory inside a namespace declaration, ie, instead of namespace Foo { %factory(Geometry *Geometry::create, Point, Circle); } use %factory(Foo::Geometry *Foo::Geometry::create, Foo::Point, Foo::Circle); */ /* for loop for macro with one argument */ %define %_formacro_1(macro, arg1,...)macro(arg1) #if #__VA_ARGS__ != "__fordone__" %_formacro_1(macro, __VA_ARGS__) #endif %enddef /* for loop for macro with one argument */ %define %formacro_1(macro,...)%_formacro_1(macro,__VA_ARGS__,__fordone__)%enddef %define %formacro(macro,...)%_formacro_1(macro,__VA_ARGS__,__fordone__)%enddef /* for loop for macro with two arguments */ %define %_formacro_2(macro, arg1, arg2, ...)macro(arg1, arg2) #if #__VA_ARGS__ != "__fordone__" %_formacro_2(macro, __VA_ARGS__) #endif %enddef /* for loop for macro with two arguments */ %define %formacro_2(macro,...)%_formacro_2(macro, __VA_ARGS__, __fordone__)%enddef %define %_factory_dispatch(Type) if (!dcast) { Type *dobj = dynamic_cast($1); if (dobj) { dcast = 1; SWIG_SetPointerZval(return_value, SWIG_as_voidptr(dobj),$descriptor(Type *), $owner); } }%enddef %define %factory(Method,Types...) %typemap(out) Method { int dcast = 0; %formacro(%_factory_dispatch, Types) if (!dcast) { SWIG_SetPointerZval(return_value, SWIG_as_voidptr($1),$descriptor, $owner); } }%enddef swig-4.0.1/Lib/cpointer.i0000644000175000017500000000673713527063513015070 0ustar williamwilliam/* ----------------------------------------------------------------------------- * cpointer.i * * SWIG library file containing macros that can be used to manipulate simple * pointer objects. * ----------------------------------------------------------------------------- */ /* ----------------------------------------------------------------------------- * %pointer_class(type,name) * * Places a simple proxy around a simple type like 'int', 'float', or whatever. * The proxy provides this interface: * * class type { * public: * type(); * ~type(); * type value(); * void assign(type value); * }; * * Example: * * %pointer_class(int, intp); * * int add(int *x, int *y) { return *x + *y; } * * In python (with proxies) * * >>> a = intp() * >>> a.assign(10) * >>> a.value() * 10 * >>> b = intp() * >>> b.assign(20) * >>> print add(a,b) * 30 * * As a general rule, this macro should not be used on class/structures that * are already defined in the interface. * ----------------------------------------------------------------------------- */ %define %pointer_class(TYPE, NAME) %{ typedef TYPE NAME; %} typedef struct { } NAME; %extend NAME { #ifdef __cplusplus NAME() { return new TYPE(); } ~NAME() { if ($self) delete $self; } #else NAME() { return (TYPE *) calloc(1,sizeof(TYPE)); } ~NAME() { if ($self) free($self); } #endif } %extend NAME { void assign(TYPE value) { *$self = value; } TYPE value() { return *$self; } TYPE * cast() { return $self; } static NAME * frompointer(TYPE *t) { return (NAME *) t; } } %types(NAME = TYPE); %enddef /* ----------------------------------------------------------------------------- * %pointer_functions(type,name) * * Create functions for allocating/deallocating pointers. This can be used * if you don't want to create a proxy class or if the pointer is complex. * * %pointer_functions(int, intp) * * int add(int *x, int *y) { return *x + *y; } * * In python (with proxies) * * >>> a = copy_intp(10) * >>> intp_value(a) * 10 * >>> b = new_intp() * >>> intp_assign(b,20) * >>> print add(a,b) * 30 * >>> delete_intp(a) * >>> delete_intp(b) * * ----------------------------------------------------------------------------- */ %define %pointer_functions(TYPE,NAME) %{ static TYPE *new_##NAME() { %} #ifdef __cplusplus %{ return new TYPE(); %} #else %{ return (TYPE *) calloc(1,sizeof(TYPE)); %} #endif %{} static TYPE *copy_##NAME(TYPE value) { %} #ifdef __cplusplus %{ return new TYPE(value); %} #else %{ TYPE *obj = (TYPE *) calloc(1,sizeof(TYPE)); *obj = value; return obj; %} #endif %{} static void delete_##NAME(TYPE *obj) { %} #ifdef __cplusplus %{ if (obj) delete obj; %} #else %{ if (obj) free(obj); %} #endif %{} static void NAME ##_assign(TYPE *obj, TYPE value) { *obj = value; } static TYPE NAME ##_value(TYPE *obj) { return *obj; } %} TYPE *new_##NAME(); TYPE *copy_##NAME(TYPE value); void delete_##NAME(TYPE *obj); void NAME##_assign(TYPE *obj, TYPE value); TYPE NAME##_value(TYPE *obj); %enddef /* ----------------------------------------------------------------------------- * %pointer_cast(type1,type2,name) * * Generates a pointer casting function. * ----------------------------------------------------------------------------- */ %define %pointer_cast(TYPE1,TYPE2,NAME) %inline %{ TYPE2 NAME(TYPE1 x) { return (TYPE2) x; } %} %enddef swig-4.0.1/Lib/wchar.i0000644000175000017500000000046513527063513014341 0ustar williamwilliam/* ----------------------------------------------------------------------------- * wchar.i * ----------------------------------------------------------------------------- */ /* wchar_t not supported, unless otherwise specified in the target language. */ #if defined(SWIG_WCHAR) #undef SWIG_WCHAR #endif swig-4.0.1/Lib/clisp/0000755000175000017500000000000013527063513014170 5ustar williamwilliamswig-4.0.1/Lib/clisp/clisp.swg0000644000175000017500000000163713527063513016033 0ustar williamwilliam/* ----------------------------------------------------------------------------- * clisp.swg * ----------------------------------------------------------------------------- */ /* Define a C preprocessor symbol that can be used in interface files to distinguish between the SWIG language modules. */ #define SWIG_CLISP /* Typespecs for basic types. */ %typemap(in) void "NIL"; %typemap(in) char "character"; %typemap(in) char * "ffi:c-string"; %typemap(in) unsigned char "ffi:uchar"; %typemap(in) signed char "ffi:char"; %typemap(in) short "ffi:short"; %typemap(in) signed short "ffi:short"; %typemap(in) unsigned short "ffi:ushort"; %typemap(in) int "ffi:int"; %typemap(in) signed int "ffi:int"; %typemap(in) unsigned int "ffi:uint"; %typemap(in) long "ffi:long"; %typemap(in) signed long "ffi:long"; %typemap(in) unsigned long "ffi:ulong"; %typemap(in) float "SINGLE-FLOAT"; %typemap(in) double "DOUBLE-FLOAT"; swig-4.0.1/Lib/tcl/0000755000175000017500000000000013527063513013640 5ustar williamwilliamswig-4.0.1/Lib/tcl/std_deque.i0000644000175000017500000000003413527063513015764 0ustar williamwilliam%include swig-4.0.1/Lib/tcl/tclresult.i0000644000175000017500000000125413527063513016035 0ustar williamwilliam/* ----------------------------------------------------------------------------- * tclresult.i * ----------------------------------------------------------------------------- */ /* int Tcl_Result Makes the integer return code of a function the return value of a SWIG generated wrapper function. For example : int foo() { ... do stuff ... return TCL_OK; } could be wrapped as follows : %include typemaps.i %apply int Tcl_Result { int foo }; int foo(); */ // If return code is a Tcl_Result, simply pass it on %typemap(out) int Tcl_Result { return $1; } swig-4.0.1/Lib/tcl/cpointer.i0000644000175000017500000000004113527063513015630 0ustar williamwilliam%include swig-4.0.1/Lib/tcl/tcl8.swg0000644000175000017500000000273413527063513015242 0ustar williamwilliam/* ----------------------------------------------------------------------------- * tcl8.swg * * Tcl configuration module. * ----------------------------------------------------------------------------- */ /* ------------------------------------------------------------ * Inner macros * ------------------------------------------------------------ */ %include /* ------------------------------------------------------------ * The runtime part * ------------------------------------------------------------ */ %include /* ------------------------------------------------------------ * Special user directives * ------------------------------------------------------------ */ %include /* ------------------------------------------------------------ * Typemap specializations * ------------------------------------------------------------ */ %include /* ------------------------------------------------------------ * Overloaded operator support * ------------------------------------------------------------ */ %include /* ------------------------------------------------------------ * Warnings for Tcl keywords * ------------------------------------------------------------ */ %include /* ------------------------------------------------------------ * The Tcl initialization function * ------------------------------------------------------------ */ %include swig-4.0.1/Lib/tcl/tclmacros.swg0000644000175000017500000000004613527063513016351 0ustar williamwilliam%include swig-4.0.1/Lib/tcl/tclprimtypes.swg0000644000175000017500000001327213527063513017126 0ustar williamwilliam/* ------------------------------------------------------------ * Primitive Types * ------------------------------------------------------------ */ /* boolean */ %fragment(SWIG_From_frag(bool),"header") { %define_as(SWIG_From_dec(bool), Tcl_NewBooleanObj) } %fragment(SWIG_AsVal_frag(bool),"header") { SWIGINTERN int SWIG_AsVal_dec(bool)(Tcl_Obj *obj, bool *val) { int v; if (Tcl_GetBooleanFromObj(0, obj, &v) == TCL_OK) { if (val) *val = v ? true : false; return SWIG_OK; } return SWIG_TypeError; } } /* long */ %fragment(SWIG_From_frag(long),"header", fragment="") { SWIGINTERNINLINE Tcl_Obj* SWIG_From_dec(long)(long value) { if (((long) INT_MIN <= value) && (value <= (long) INT_MAX)) { return Tcl_NewIntObj(%numeric_cast(value,int)); } else { return Tcl_NewLongObj(value); } } } %fragment(SWIG_AsVal_frag(long),"header") { SWIGINTERN int SWIG_AsVal_dec(long)(Tcl_Obj *obj, long* val) { long v; if (Tcl_GetLongFromObj(0,obj, &v) == TCL_OK) { if (val) *val = (long) v; return SWIG_OK; } return SWIG_TypeError; } } /* unsigned long */ %fragment(SWIG_From_frag(unsigned long),"header", fragment=SWIG_From_frag(long), fragment="") { SWIGINTERNINLINE Tcl_Obj* SWIG_From_dec(unsigned long)(unsigned long value) { if (value < (unsigned long) LONG_MAX) { return SWIG_From(long)(%numeric_cast(value, long)); } else { char temp[256]; sprintf(temp, "%lu", value); return Tcl_NewStringObj(temp,-1); } } } %fragment(SWIG_AsVal_frag(unsigned long),"header", fragment="") { SWIGINTERN int SWIG_AsVal_dec(unsigned long)(Tcl_Obj *obj, unsigned long *val) { long v; if (Tcl_GetLongFromObj(0,obj, &v) == TCL_OK) { if (v >= 0) { if (val) *val = (unsigned long) v; return SWIG_OK; } /* If v is negative, then this could be a negative number, or an unsigned value which doesn't fit in a signed long, so try to get it as a string so we can distinguish these cases. */ } { int len = 0; const char *nptr = Tcl_GetStringFromObj(obj, &len); if (nptr && len > 0) { char *endptr; unsigned long v; if (*nptr == '-') return SWIG_OverflowError; errno = 0; v = strtoul(nptr, &endptr,0); if (nptr[0] == '\0' || *endptr != '\0') return SWIG_TypeError; if (v == ULONG_MAX && errno == ERANGE) { errno = 0; return SWIG_OverflowError; } else { if (*endptr == '\0') { if (val) *val = v; return SWIG_OK; } } } } return SWIG_TypeError; } } /* long long */ %fragment(SWIG_From_frag(long long),"header", fragment=SWIG_From_frag(long), fragment="SWIG_LongLongAvailable", fragment="") { %#ifdef SWIG_LONG_LONG_AVAILABLE SWIGINTERNINLINE Tcl_Obj* SWIG_From_dec(long long)(long long value) { if (((long long) LONG_MIN <= value) && (value <= (long long) LONG_MAX)) { return SWIG_From(long)(%numeric_cast(value,long)); } else { char temp[256]; sprintf(temp, "%lld", value); return Tcl_NewStringObj(temp,-1); } } %#endif } %fragment(SWIG_AsVal_frag(long long),"header", fragment="SWIG_LongLongAvailable", fragment="") { %#ifdef SWIG_LONG_LONG_AVAILABLE SWIGINTERN int SWIG_AsVal_dec(long long)(Tcl_Obj *obj, long long *val) { long v; if (Tcl_GetLongFromObj(0,obj, &v) == TCL_OK) { if (val) *val = v; return SWIG_OK; } else { int len = 0; const char *nptr = Tcl_GetStringFromObj(obj, &len); if (nptr && len > 0) { char *endptr; long long v; errno = 0; v = strtoll(nptr, &endptr,0); if (nptr[0] == '\0' || *endptr != '\0') return SWIG_TypeError; if ((v == LLONG_MAX || v == LLONG_MIN) && errno == ERANGE) { errno = 0; return SWIG_OverflowError; } else { if (*endptr == '\0') { if (val) *val = v; return SWIG_OK; } } } } return SWIG_TypeError; } %#endif } /* unsigned long long */ %fragment(SWIG_From_frag(unsigned long long),"header", fragment=SWIG_From_frag(long long), fragment="SWIG_LongLongAvailable", fragment="") { %#ifdef SWIG_LONG_LONG_AVAILABLE SWIGINTERNINLINE Tcl_Obj* SWIG_From_dec(unsigned long long)(unsigned long long value) { if (value < (unsigned long long) LONG_MAX) { return SWIG_From(long long)(%numeric_cast(value, long long)); } else { char temp[256]; sprintf(temp, "%llu", value); return Tcl_NewStringObj(temp,-1); } } %#endif } %fragment(SWIG_AsVal_frag(unsigned long long),"header", fragment=SWIG_AsVal_frag(unsigned long), fragment="SWIG_LongLongAvailable", fragment="") { %#ifdef SWIG_LONG_LONG_AVAILABLE SWIGINTERN int SWIG_AsVal_dec(unsigned long long)(Tcl_Obj *obj, unsigned long long *val) { long v; if (Tcl_GetLongFromObj(0,obj, &v) == TCL_OK) { if (val) *val = (unsigned long) v; return SWIG_OK; } else { int len = 0; const char *nptr = Tcl_GetStringFromObj(obj, &len); if (nptr && len > 0) { char *endptr; unsigned long long v; if (*nptr == '-') return SWIG_OverflowError; errno = 0; v = strtoull(nptr, &endptr,0); if (nptr[0] == '\0' || *endptr != '\0') return SWIG_TypeError; if (v == ULLONG_MAX && errno == ERANGE) { errno = 0; return SWIG_OverflowError; } else { if (*endptr == '\0') { if (val) *val = v; return SWIG_OK; } } } } return SWIG_TypeError; } %#endif } /* double */ %fragment(SWIG_From_frag(double),"header") { %define_as(SWIG_From(double), Tcl_NewDoubleObj) } %fragment(SWIG_AsVal_frag(double),"header") { SWIGINTERN int SWIG_AsVal_dec(double)(Tcl_Obj *obj, double *val) { double v; if (Tcl_GetDoubleFromObj(0, obj, &v) == TCL_OK) { if (val) *val = v; return SWIG_OK; } return SWIG_TypeError; } } swig-4.0.1/Lib/tcl/std_vector.i0000644000175000017500000003750413527063513016177 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_vector.i * ----------------------------------------------------------------------------- */ %include // ------------------------------------------------------------------------ // std::vector // // The aim of all that follows would be to integrate std::vector with // Tcl as much as possible, namely, to allow the user to pass and // be returned Tcl lists. // const declarations are used to guess the intent of the function being // exported; therefore, the following rationale is applied: // // -- f(std::vector< T >), f(const std::vector< T >&), f(const std::vector< T >*): // the parameter being read-only, either a Tcl list or a // previously wrapped std::vector< T > can be passed. // -- f(std::vector< T >&), f(std::vector< T >*): // the parameter must be modified; therefore, only a wrapped std::vector // can be passed. // -- std::vector< T > f(): // the vector is returned by copy; therefore, a Tcl list of T:s // is returned which is most easily used in other Tcl functions procs // -- std::vector< T >& f(), std::vector< T >* f(), const std::vector< T >& f(), // const std::vector< T >* f(): // the vector is returned by reference; therefore, a wrapped std::vector // is returned // ------------------------------------------------------------------------ %fragment(""); %fragment(""); %fragment(""); %{ #include Tcl_Obj* SwigString_FromString(const std::string &s) { return Tcl_NewStringObj(s.data(), (int)s.length()); } int Tcl_GetBoolFromObj(Tcl_Interp *interp, Tcl_Obj *o, bool *val) { int v; int res = Tcl_GetBooleanFromObj(interp, o, &v); if (res == TCL_OK) { *val = v ? true : false; } return res; } int SwigString_AsString(Tcl_Interp *interp, Tcl_Obj *o, std::string *val) { int len; const char* temp = Tcl_GetStringFromObj(o, &len); if (temp == NULL) return TCL_ERROR; val->assign(temp, len); return TCL_OK; } // behaviour of this is such as the real Tcl_GetIntFromObj template int SwigInt_As(Tcl_Interp *interp, Tcl_Obj *o, Type *val) { int temp_val, return_val; return_val = Tcl_GetIntFromObj(interp, o, &temp_val); *val = (Type) temp_val; return return_val; } // behaviour of this is such as the real Tcl_GetDoubleFromObj template int SwigDouble_As(Tcl_Interp *interp, Tcl_Obj *o, Type *val) { int return_val; double temp_val; return_val = Tcl_GetDoubleFromObj(interp, o, &temp_val); *val = (Type) temp_val; return return_val; } %} // exported class namespace std { template class vector { %typemap(in) vector< T > (std::vector< T > *v) { Tcl_Obj **listobjv; int nitems; int i; T* temp; if (SWIG_ConvertPtr($input, (void **) &v, \ $&1_descriptor, 0) == 0){ $1 = *v; } else { // It isn't a vector< T > so it should be a list of T's if(Tcl_ListObjGetElements(interp, $input, \ &nitems, &listobjv) == TCL_ERROR) return TCL_ERROR; $1 = std::vector< T >(); for (i = 0; i < nitems; i++) { if ((SWIG_ConvertPtr(listobjv[i],(void **) &temp, $descriptor(T *),0)) != 0) { char message[] = "list of " #T " expected"; Tcl_SetResult(interp, message, TCL_VOLATILE); return TCL_ERROR; } $1.push_back(*temp); } } } %typemap(in) const vector< T >* (std::vector< T > *v, std::vector< T > w), const vector< T >& (std::vector< T > *v, std::vector< T > w) { Tcl_Obj **listobjv; int nitems; int i; T* temp; if(SWIG_ConvertPtr($input, (void **) &v, \ $&1_descriptor, 0) == 0) { $1 = v; } else { // It isn't a vector< T > so it should be a list of T's if(Tcl_ListObjGetElements(interp, $input, &nitems, &listobjv) == TCL_ERROR) return TCL_ERROR; w = std::vector< T >(); for (i = 0; i < nitems; i++) { if ((SWIG_ConvertPtr(listobjv[i],(void **) &temp, $descriptor(T *),0)) != 0) { char message[] = "list of " #T " expected"; Tcl_SetResult(interp, message, TCL_VOLATILE); return TCL_ERROR; } w.push_back(*temp); } $1 = &w; } } %typemap(out) vector< T > { for (unsigned int i=0; i<$1.size(); i++) { T* ptr = new T((($1_type &)$1)[i]); Tcl_ListObjAppendElement(interp, $result, \ SWIG_NewInstanceObj(ptr, $descriptor(T *), 0)); } } %typecheck(SWIG_TYPECHECK_VECTOR) vector< T > { Tcl_Obj **listobjv; int nitems; T* temp; std::vector< T > *v; if(SWIG_ConvertPtr($input, (void **) &v, \ $&1_descriptor, 0) == 0) { /* wrapped vector */ $1 = 1; } else { // It isn't a vector< T > so it should be a list of T's if(Tcl_ListObjGetElements(interp, $input, &nitems, &listobjv) == TCL_ERROR) $1 = 0; else if (nitems == 0) $1 = 1; //check the first value to see if it is of correct type else if ((SWIG_ConvertPtr(listobjv[0], (void **) &temp, $descriptor(T *),0)) != 0) $1 = 0; else $1 = 1; } } %typecheck(SWIG_TYPECHECK_VECTOR) const vector< T >&, const vector< T >* { Tcl_Obj **listobjv; int nitems; T* temp; std::vector< T > *v; if(SWIG_ConvertPtr($input, (void **) &v, \ $1_descriptor, 0) == 0){ /* wrapped vector */ $1 = 1; } else { // It isn't a vector< T > so it should be a list of T's if(Tcl_ListObjGetElements(interp, $input, &nitems, &listobjv) == TCL_ERROR) $1 = 0; else if (nitems == 0) $1 = 1; //check the first value to see if it is of correct type else if ((SWIG_ConvertPtr(listobjv[0], (void **) &temp, $descriptor(T *),0)) != 0) $1 = 0; else $1 = 1; } } public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef T value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; vector(unsigned int size = 0); vector(unsigned int size, const T& value); vector(const vector& other); unsigned int size() const; bool empty() const; void clear(); %rename(push) push_back; void push_back(const T& x); %extend { T pop() throw (std::out_of_range) { if (self->size() == 0) throw std::out_of_range("pop from empty vector"); T x = self->back(); self->pop_back(); return x; } T& get(int i) throw (std::out_of_range) { int size = int(self->size()); if (i<0) i += size; if (i>=0 && isize()); if (i<0) i+= size; if (i>=0 && i class vector< T > { %typemap(in) vector< T > (std::vector< T > *v){ Tcl_Obj **listobjv; int nitems; int i; T temp; if(SWIG_ConvertPtr($input, (void **) &v, \ $&1_descriptor, 0) == 0) { $1 = *v; } else { // It isn't a vector< T > so it should be a list of T's if(Tcl_ListObjGetElements(interp, $input, &nitems, &listobjv) == TCL_ERROR) return TCL_ERROR; $1 = std::vector< T >(); for (i = 0; i < nitems; i++) { if (CONVERT_FROM(interp, listobjv[i], &temp) == TCL_ERROR) return TCL_ERROR; $1.push_back(temp); } } } %typemap(in) const vector< T >& (std::vector< T > *v,std::vector< T > w), const vector< T >* (std::vector< T > *v,std::vector< T > w) { Tcl_Obj **listobjv; int nitems; int i; T temp; if(SWIG_ConvertPtr($input, (void **) &v, \ $1_descriptor, 0) == 0) { $1 = v; } else { // It isn't a vector< T > so it should be a list of T's if(Tcl_ListObjGetElements(interp, $input, &nitems, &listobjv) == TCL_ERROR) return TCL_ERROR; w = std::vector< T >(); for (i = 0; i < nitems; i++) { if (CONVERT_FROM(interp, listobjv[i], &temp) == TCL_ERROR) return TCL_ERROR; w.push_back(temp); } $1 = &w; } } %typemap(out) vector< T > { for (unsigned int i=0; i<$1.size(); i++) { Tcl_ListObjAppendElement(interp, $result, \ CONVERT_TO((($1_type &)$1)[i])); } } %typecheck(SWIG_TYPECHECK_VECTOR) vector< T > { Tcl_Obj **listobjv; int nitems; T temp; std::vector< T > *v; if(SWIG_ConvertPtr($input, (void **) &v, \ $&1_descriptor, 0) == 0){ /* wrapped vector */ $1 = 1; } else { // It isn't a vector< T > so it should be a list of T's if(Tcl_ListObjGetElements(interp, $input, &nitems, &listobjv) == TCL_ERROR) $1 = 0; else if (nitems == 0) $1 = 1; //check the first value to see if it is of correct type if (CONVERT_FROM(interp, listobjv[0], &temp) == TCL_ERROR) $1 = 0; else $1 = 1; } } %typecheck(SWIG_TYPECHECK_VECTOR) const vector< T >&, const vector< T >*{ Tcl_Obj **listobjv; int nitems; T temp; std::vector< T > *v; if(SWIG_ConvertPtr($input, (void **) &v, \ $1_descriptor, 0) == 0){ /* wrapped vector */ $1 = 1; } else { // It isn't a vector< T > so it should be a list of T's if(Tcl_ListObjGetElements(interp, $input, &nitems, &listobjv) == TCL_ERROR) $1 = 0; else if (nitems == 0) $1 = 1; //check the first value to see if it is of correct type if (CONVERT_FROM(interp, listobjv[0], &temp) == TCL_ERROR) $1 = 0; else $1 = 1; } } public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef T value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; vector(unsigned int size = 0); vector(unsigned int size, const T& value); vector(const vector& other); unsigned int size() const; bool empty() const; void clear(); %rename(push) push_back; void push_back(T x); %extend { T pop() throw (std::out_of_range) { if (self->size() == 0) throw std::out_of_range("pop from empty vector"); T x = self->back(); self->pop_back(); return x; } T get(int i) throw (std::out_of_range) { int size = int(self->size()); if (i<0) i += size; if (i>=0 && isize()); if (i<0) i+= size; if (i>=0 && i,Tcl_NewIntObj); specialize_std_vector(int, Tcl_GetIntFromObj,Tcl_NewIntObj); specialize_std_vector(short, SwigInt_As, Tcl_NewIntObj); specialize_std_vector(long, SwigInt_As, Tcl_NewIntObj); specialize_std_vector(unsigned char, SwigInt_As, Tcl_NewIntObj); specialize_std_vector(unsigned int, SwigInt_As, Tcl_NewIntObj); specialize_std_vector(unsigned short, SwigInt_As, Tcl_NewIntObj); specialize_std_vector(unsigned long, SwigInt_As, Tcl_NewIntObj); specialize_std_vector(double, Tcl_GetDoubleFromObj, Tcl_NewDoubleObj); specialize_std_vector(float, SwigDouble_As, Tcl_NewDoubleObj); specialize_std_vector(std::string, SwigString_AsString, SwigString_FromString); } swig-4.0.1/Lib/tcl/Makefile.in0000644000175000017500000000704713527063513015715 0ustar williamwilliam# --------------------------------------------------------------- # SWIG Tcl Makefile # # This file can be used to build various Tcl extensions with SWIG. # By default this file is set up for dynamic loading, but it can # be easily customized for static extensions by modifying various # portions of the file. # # SRCS = C source files # CXXSRCS = C++ source files # OBJCSRCS = Objective-C source files # OBJS = Additional .o files (compiled previously) # INTERFACE = SWIG interface file # TARGET = Name of target module or executable # # Many portions of this file were created by the SWIG configure # script and should already reflect your machine. However, you # may need to modify the Makefile to reflect your specific # application. #---------------------------------------------------------------- SRCS = CXXSRCS = OBJCSRCS = OBJS = INTERFACE = WRAPFILE = $(INTERFACE:.i=_wrap.c) WRAPOBJ = $(INTERFACE:.i=_wrap.o) TARGET = module@SO@ # Use this kind of target for dynamic loading #TARGET = my_tclsh # Use this target for static linking prefix = @prefix@ exec_prefix = @exec_prefix@ CC = @CC@ CXX = @CXX@ OBJC = @CC@ -Wno-import # -Wno-import needed for gcc CFLAGS = INCLUDES = LIBS = # SWIG Options # SWIG = location of the SWIG executable # SWIGOPT = SWIG compiler options # SWIGCC = Compiler used to compile the wrapper file SWIG = $(exec_prefix)/bin/swig SWIGOPT = -tcl # use -tcl8 for Tcl 8.0 SWIGCC = $(CC) # SWIG Library files. Uncomment if rebuilding tclsh #SWIGLIBS = -ltclsh.i # Rules for creating .o files from source. COBJS = $(SRCS:.c=.o) CXXOBJS = $(CXXSRCS:.cxx=.o) OBJCOBJS = $(OBJCSRCS:.m=.o) ALLOBJS = $(COBJS) $(CXXOBJS) $(OBJCOBJS) $(OBJS) # Command that will be used to build the final extension. BUILD = $(SWIGCC) # Uncomment the following if you are using dynamic loading CCSHARED = @CCSHARED@ BUILD = @LDSHARED@ # Uncomment the following if you are using dynamic loading with C++ and # need to provide additional link libraries (this is not always required). #DLL_LIBS = -L/usr/local/lib/gcc-lib/sparc-sun-solaris2.5.1/2.7.2 \ -L/usr/local/lib -lg++ -lstdc++ -lgcc # Tcl installation (where is Tcl located) TCL_INCLUDE = @TCLINCLUDE@ TCL_LIB = @TCLLIB@ # Build libraries (needed for static builds) LIBM = @LIBM@ LIBC = @LIBC@ SYSLIBS = $(LIBM) $(LIBC) @LIBS@ # Build options (uncomment only one of these) BUILD_LIBS = $(LIBS) # Dynamic loading #BUILD_LIBS = $(TCL_LIB) -ltcl $(LIBS) $(SYSLIBS) # tclsh # Compilation rules for non-SWIG components .SUFFIXES: .c .cxx .m .c.o: $(CC) $(CCSHARED) $(CFLAGS) $(INCLUDES) -c $< .cxx.o: $(CXX) $(CCSHARED) $(CXXFLAGS) $(INCLUDES) -c $< .m.o: $(OBJC) $(CCSHARED) $(CFLAGS) $(INCLUDES) -c $< # ---------------------------------------------------------------------- # Rules for building the extension # ---------------------------------------------------------------------- all: $(TARGET) # Convert the wrapper file into an object file $(WRAPOBJ) : $(WRAPFILE) $(SWIGCC) -c $(CCSHARED) $(CFLAGS) $(WRAPFILE) $(INCLUDES) $(TCL_INCLUDE) $(WRAPFILE) : $(INTERFACE) $(SWIG) $(SWIGOPT) -o $(WRAPFILE) $(SWIGLIBS) $(INTERFACE) $(TARGET): $(WRAPOBJ) $(ALLOBJS) $(BUILD) $(WRAPOBJ) $(ALLOBJS) $(BUILD_LIBS) -o $(TARGET) clean: rm -f $(COBJS) $(CXXOBJS) $(OBJCOBJS) $(WRAPOBJ) $(WRAPFILE) $(TARGET) swig-4.0.1/Lib/tcl/cwstring.i0000644000175000017500000000007413527063513015653 0ustar williamwilliam%include %include swig-4.0.1/Lib/tcl/std_wstring.i0000644000175000017500000000007713527063513016365 0ustar williamwilliam%include %include swig-4.0.1/Lib/tcl/tclruntime.swg0000644000175000017500000000074413527063513016555 0ustar williamwilliam/* tcl.h has to appear first */ %insert(runtime) %{ #include #include #include #include #include #include %} %insert(runtime) "swigrun.swg"; /* Common C API type-checking code */ %insert(runtime) "swigerrors.swg" /* SWIG errors */ %insert(runtime) "tclerrors.swg"; /* Tcl Errors */ %insert(runtime) "tclapi.swg"; /* Tcl API */ %insert(runtime) "tclrun.swg"; /* Tcl run-time code */ swig-4.0.1/Lib/tcl/attribute.i0000644000175000017500000000004213527063513016011 0ustar williamwilliam%include swig-4.0.1/Lib/tcl/cmalloc.i0000644000175000017500000000004013527063513015416 0ustar williamwilliam%include swig-4.0.1/Lib/tcl/tclstrings.swg0000644000175000017500000000143113527063513016555 0ustar williamwilliam/* ------------------------------------------------------------ * utility methods for char strings * ------------------------------------------------------------ */ %fragment("SWIG_AsCharPtrAndSize","header") { SWIGINTERN int SWIG_AsCharPtrAndSize(Tcl_Obj *obj, char** cptr, size_t* psize, int *alloc) { int len = 0; char *cstr = Tcl_GetStringFromObj(obj, &len); if (cstr) { if (cptr) *cptr = cstr; if (psize) *psize = len + 1; if (alloc) *alloc = SWIG_OLDOBJ; return SWIG_OK; } return SWIG_TypeError; } } %fragment("SWIG_FromCharPtrAndSize","header", fragment="") { SWIGINTERNINLINE Tcl_Obj * SWIG_FromCharPtrAndSize(const char* carray, size_t size) { return (size < INT_MAX) ? Tcl_NewStringObj(carray, %numeric_cast(size,int)) : NULL; } } swig-4.0.1/Lib/tcl/tclkw.swg0000644000175000017500000000036713527063513015514 0ustar williamwilliam#ifndef TCL_TCLKW_SWG_ #define TCL_TCLKW_SWG_ // Some special reserved words in classes %keywordwarn("cget is a tcl reserved method name") *::cget; %keywordwarn("configure is a tcl reserved method name") *::configure; #endif //_TCL_TCLKW_SWG_ swig-4.0.1/Lib/tcl/tclsh.i0000644000175000017500000000351713527063513015135 0ustar williamwilliam/* ----------------------------------------------------------------------------- * tclsh.i * * SWIG File for building new tclsh program * ----------------------------------------------------------------------------- */ #ifdef AUTODOC %subsection "tclsh.i" %text %{ This module provides the Tcl_AppInit() function needed to build a new version of the tclsh executable. This file should not be used when using dynamic loading. To make an interface file work with both static and dynamic loading, put something like this in your interface file : #ifdef STATIC %include #endif %} #endif %{ /* A TCL_AppInit() function that lets you build a new copy * of tclsh. * * The macro SWIG_init contains the name of the initialization * function in the wrapper file. */ #ifndef SWIG_RcFileName char *SWIG_RcFileName = "~/.myapprc"; #endif #ifdef MAC_TCL extern int MacintoshInit _ANSI_ARGS_((void)); #endif int Tcl_AppInit(Tcl_Interp *interp){ if (Tcl_Init(interp) == TCL_ERROR) return TCL_ERROR; /* Now initialize our functions */ if (SWIG_init(interp) == TCL_ERROR) return TCL_ERROR; #if TCL_MAJOR_VERSION > 7 || TCL_MAJOR_VERSION == 7 && TCL_MINOR_VERSION >= 5 Tcl_SetVar(interp, (char *) "tcl_rcFileName",SWIG_RcFileName,TCL_GLOBAL_ONLY); #else tcl_RcFileName = SWIG_RcFileName; #endif #ifdef SWIG_RcRsrcName Tcl_SetVar(interp, (char *) "tcl_rcRsrcName",SWIG_RcRsrcName,TCL_GLOBAL); #endif return TCL_OK; } #if TCL_MAJOR_VERSION > 7 || TCL_MAJOR_VERSION == 7 && TCL_MINOR_VERSION >= 4 int main(int argc, char **argv) { #ifdef MAC_TCL char *newArgv[2]; if (MacintoshInit() != TCL_OK) { Tcl_Exit(1); } argc = 1; newArgv[0] = "tclsh"; newArgv[1] = NULL; argv = newArgv; #endif Tcl_Main(argc, argv, Tcl_AppInit); return(0); } #else extern int main(); #endif %} swig-4.0.1/Lib/tcl/tclfragments.swg0000644000175000017500000000105313527063513017052 0ustar williamwilliam/* Create a file with this name, 'tclfragments.swg', in your working directory and add all the %fragments you want to take precedence over the ones defined by default by swig. For example, if you add: %fragment(SWIG_AsVal_frag(int),"header") { SWIGINTERNINLINE int SWIG_AsVal_dec(int)(TclObject *obj, int *val) { ; } } this will replace the code used to retrieve an integer value for all the typemaps that need it, including: int, std::vector, std::list >, etc. */ swig-4.0.1/Lib/tcl/std_common.i0000644000175000017500000000072313527063513016156 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_common.i * * SWIG typemaps for STL - common utilities * ----------------------------------------------------------------------------- */ %include %types(std::size_t); %apply size_t { std::size_t }; %apply const unsigned long& { const std::size_t& }; %types(std::ptrdiff_t); %apply long { std::ptrdiff_t }; %apply const long& { const std::ptrdiff_t& }; swig-4.0.1/Lib/tcl/std_except.i0000644000175000017500000000004313527063513016151 0ustar williamwilliam%include swig-4.0.1/Lib/tcl/tclrun.swg0000644000175000017500000005337713527063513015710 0ustar williamwilliam/* ----------------------------------------------------------------------------- * tclrun.swg * * This file contains the runtime support for Tcl modules and includes * code for managing global variables and pointer type checking. * ----------------------------------------------------------------------------- */ /* Common SWIG API */ /* for raw pointers */ #define SWIG_ConvertPtr(oc, ptr, ty, flags) SWIG_Tcl_ConvertPtr(interp, oc, ptr, ty, flags) #define SWIG_NewPointerObj(ptr, type, flags) SWIG_Tcl_NewPointerObj(ptr, type, flags) /* for raw packed data */ #define SWIG_ConvertPacked(obj, ptr, sz, ty) SWIG_Tcl_ConvertPacked(interp, obj, ptr, sz, ty) #define SWIG_NewPackedObj(ptr, sz, type) SWIG_Tcl_NewPackedObj(ptr, sz, type) /* for class or struct pointers */ #define SWIG_ConvertInstance(obj, pptr, type, flags) SWIG_Tcl_ConvertPtr(interp, obj, pptr, type, flags) #define SWIG_NewInstanceObj(thisvalue, type, flags) SWIG_Tcl_NewInstanceObj(interp, thisvalue, type, flags) /* for C or C++ function pointers */ #define SWIG_ConvertFunctionPtr(obj, pptr, type) SWIG_Tcl_ConvertPtr(interp, obj, pptr, type, 0) #define SWIG_NewFunctionPtrObj(ptr, type) SWIG_Tcl_NewPointerObj(ptr, type, 0) /* for C++ member pointers, ie, member methods */ #define SWIG_ConvertMember(obj, ptr, sz, ty) SWIG_Tcl_ConvertPacked(interp,obj, ptr, sz, ty) #define SWIG_NewMemberObj(ptr, sz, type) SWIG_Tcl_NewPackedObj(ptr, sz, type) /* Runtime API */ #define SWIG_GetModule(clientdata) SWIG_Tcl_GetModule((Tcl_Interp *) (clientdata)) #define SWIG_SetModule(clientdata, pointer) SWIG_Tcl_SetModule((Tcl_Interp *) (clientdata), pointer) /* Error manipulation */ #define SWIG_ErrorType(code) SWIG_Tcl_ErrorType(code) #define SWIG_Error(code, msg) SWIG_Tcl_SetErrorMsg(interp, SWIG_Tcl_ErrorType(code), msg) #define SWIG_fail goto fail /* Tcl-specific SWIG API */ #define SWIG_Acquire(ptr) SWIG_Tcl_Acquire(ptr) #define SWIG_MethodCommand SWIG_Tcl_MethodCommand #define SWIG_Disown(ptr) SWIG_Tcl_Disown(ptr) #define SWIG_ConvertPtrFromString(c, ptr, ty, flags) SWIG_Tcl_ConvertPtrFromString(interp, c, ptr, ty, flags) #define SWIG_MakePtr(c, ptr, ty, flags) SWIG_Tcl_MakePtr(c, ptr, ty, flags) #define SWIG_PointerTypeFromString(c) SWIG_Tcl_PointerTypeFromString(c) #define SWIG_GetArgs SWIG_Tcl_GetArgs #define SWIG_GetConstantObj(key) SWIG_Tcl_GetConstantObj(key) #define SWIG_ObjectConstructor SWIG_Tcl_ObjectConstructor #define SWIG_Thisown(ptr) SWIG_Tcl_Thisown(ptr) #define SWIG_ObjectDelete SWIG_Tcl_ObjectDelete #define SWIG_TCL_DECL_ARGS_2(arg1, arg2) (Tcl_Interp *interp SWIGUNUSED, arg1, arg2) #define SWIG_TCL_CALL_ARGS_2(arg1, arg2) (interp, arg1, arg2) /* ----------------------------------------------------------------------------- * pointers/data manipulation * ----------------------------------------------------------------------------- */ /* For backward compatibility only */ #define SWIG_POINTER_EXCEPTION 0 #define SWIG_GetConstant SWIG_GetConstantObj #define SWIG_Tcl_GetConstant SWIG_Tcl_GetConstantObj #if TCL_MAJOR_VERSION >= 8 && TCL_MINOR_VERSION >= 5 #define SWIG_TCL_HASHTABLE_INIT {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} #else #define SWIG_TCL_HASHTABLE_INIT {0} #endif #include "assert.h" #ifdef __cplusplus extern "C" { #endif /* Object support */ SWIGRUNTIME Tcl_HashTable* SWIG_Tcl_ObjectTable(void) { static Tcl_HashTable swigobjectTable; static int swigobjectTableinit = 0; if (!swigobjectTableinit) { Tcl_InitHashTable(&swigobjectTable, TCL_ONE_WORD_KEYS); swigobjectTableinit = 1; } return &swigobjectTable; } /* Acquire ownership of a pointer */ SWIGRUNTIME void SWIG_Tcl_Acquire(void *ptr) { int newobj; Tcl_CreateHashEntry(SWIG_Tcl_ObjectTable(), (char *) ptr, &newobj); } SWIGRUNTIME int SWIG_Tcl_Thisown(void *ptr) { if (Tcl_FindHashEntry(SWIG_Tcl_ObjectTable(), (char *) ptr)) { return 1; } return 0; } /* Disown a pointer. Returns 1 if we owned it to begin with */ SWIGRUNTIME int SWIG_Tcl_Disown(void *ptr) { Tcl_HashEntry *entryPtr = Tcl_FindHashEntry(SWIG_Tcl_ObjectTable(), (char *) ptr); if (entryPtr) { Tcl_DeleteHashEntry(entryPtr); return 1; } return 0; } /* Convert a pointer value */ SWIGRUNTIME int SWIG_Tcl_ConvertPtrFromString(Tcl_Interp *interp, const char *c, void **ptr, swig_type_info *ty, int flags) { swig_cast_info *tc; /* Pointer values must start with leading underscore */ while (*c != '_') { *ptr = (void *) 0; if (strcmp(c,"NULL") == 0) return (flags & SWIG_POINTER_NO_NULL) ? SWIG_NullReferenceError : SWIG_OK; /* Empty string: not a pointer */ if (*c == 0) return SWIG_ERROR; /* Hmmm. It could be an object name. */ /* Check if this is a command at all. Prevents cget -this */ /* from being called when c is not a command, firing the unknown proc */ if (Tcl_VarEval(interp,"info commands ", c, (char *) NULL) == TCL_OK) { Tcl_Obj *result = Tcl_GetObjResult(interp); if (*(Tcl_GetStringFromObj(result, NULL)) == 0) { /* It's not a command, so it can't be a pointer */ Tcl_ResetResult(interp); return SWIG_ERROR; } } else { /* This will only fail if the argument is multiple words. */ /* Multiple words are also not commands. */ Tcl_ResetResult(interp); return SWIG_ERROR; } /* Check if this is really a SWIG pointer */ if (Tcl_VarEval(interp,c," cget -this", (char *) NULL) != TCL_OK) { Tcl_ResetResult(interp); return SWIG_ERROR; } c = Tcl_GetStringFromObj(Tcl_GetObjResult(interp), NULL); } c++; c = SWIG_UnpackData(c,ptr,sizeof(void *)); if (ty) { tc = c ? SWIG_TypeCheck(c,ty) : 0; if (!tc) { return SWIG_ERROR; } if (flags & SWIG_POINTER_DISOWN) { SWIG_Disown((void *) *ptr); } { int newmemory = 0; *ptr = SWIG_TypeCast(tc,(void *) *ptr,&newmemory); assert(!newmemory); /* newmemory handling not yet implemented */ } } return SWIG_OK; } /* Convert a pointer value */ SWIGRUNTIMEINLINE int SWIG_Tcl_ConvertPtr(Tcl_Interp *interp, Tcl_Obj *oc, void **ptr, swig_type_info *ty, int flags) { return SWIG_Tcl_ConvertPtrFromString(interp, Tcl_GetStringFromObj(oc,NULL), ptr, ty, flags); } /* Convert a pointer value */ SWIGRUNTIME char * SWIG_Tcl_PointerTypeFromString(char *c) { char d; /* Pointer values must start with leading underscore. NULL has no type */ if (*c != '_') { return 0; } c++; /* Extract hex value from pointer */ while ((d = *c)) { if (!(((d >= '0') && (d <= '9')) || ((d >= 'a') && (d <= 'f')))) break; c++; } return c; } /* Convert a packed pointer value */ SWIGRUNTIME int SWIG_Tcl_ConvertPacked(Tcl_Interp *SWIGUNUSEDPARM(interp) , Tcl_Obj *obj, void *ptr, int sz, swig_type_info *ty) { swig_cast_info *tc; const char *c; if (!obj) goto type_error; c = Tcl_GetStringFromObj(obj,NULL); /* Pointer values must start with leading underscore */ if (*c != '_') goto type_error; c++; c = SWIG_UnpackData(c,ptr,sz); if (ty) { tc = SWIG_TypeCheck(c,ty); if (!tc) goto type_error; } return SWIG_OK; type_error: return SWIG_ERROR; } /* Take a pointer and convert it to a string */ SWIGRUNTIME void SWIG_Tcl_MakePtr(char *c, void *ptr, swig_type_info *ty, int SWIGUNUSEDPARM(flags)) { if (ptr) { *(c++) = '_'; c = SWIG_PackData(c,&ptr,sizeof(void *)); strcpy(c,ty->name); } else { strcpy(c,"NULL"); } } /* Create a new pointer object */ SWIGRUNTIMEINLINE Tcl_Obj * SWIG_Tcl_NewPointerObj(void *ptr, swig_type_info *type, int flags) { Tcl_Obj *robj; char result[SWIG_BUFFER_SIZE]; SWIG_MakePtr(result,ptr,type,flags); robj = Tcl_NewStringObj(result,-1); return robj; } SWIGRUNTIME Tcl_Obj * SWIG_Tcl_NewPackedObj(void *ptr, int sz, swig_type_info *type) { char result[1024]; char *r = result; if ((2*sz + 1 + strlen(type->name)) > 1000) return 0; *(r++) = '_'; r = SWIG_PackData(r,ptr,sz); strcpy(r,type->name); return Tcl_NewStringObj(result,-1); } /* -----------------------------------------------------------------------------* * Get type list * -----------------------------------------------------------------------------*/ SWIGRUNTIME swig_module_info * SWIG_Tcl_GetModule(Tcl_Interp *interp) { const char *data; swig_module_info *ret = 0; /* first check if pointer already created */ data = Tcl_GetVar(interp, (char *)"swig_runtime_data_type_pointer" SWIG_RUNTIME_VERSION SWIG_TYPE_TABLE_NAME, TCL_GLOBAL_ONLY); if (data) { SWIG_UnpackData(data, &ret, sizeof(swig_type_info **)); } return ret; } SWIGRUNTIME void SWIG_Tcl_SetModule(Tcl_Interp *interp, swig_module_info *module) { char buf[SWIG_BUFFER_SIZE]; char *data; /* create a new pointer */ data = SWIG_PackData(buf, &module, sizeof(swig_type_info **)); *data = 0; Tcl_SetVar(interp, (char *)"swig_runtime_data_type_pointer" SWIG_RUNTIME_VERSION SWIG_TYPE_TABLE_NAME, buf, TCL_GLOBAL_ONLY); } /* -----------------------------------------------------------------------------* * Object auxiliaries * -----------------------------------------------------------------------------*/ SWIGRUNTIME void SWIG_Tcl_ObjectDelete(ClientData clientData) { swig_instance *si = (swig_instance *) clientData; if (!si) return; if (si->destroy && SWIG_Disown(si->thisvalue)) { if (si->classptr->destructor) { (si->classptr->destructor)(si->thisvalue); } } Tcl_DecrRefCount(si->thisptr); free(si); } /* Function to invoke object methods given an instance */ SWIGRUNTIME int SWIG_Tcl_MethodCommand(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST _objv[]) { char *method, *attrname; swig_instance *inst = (swig_instance *) clientData; swig_method *meth; swig_attribute *attr; Tcl_Obj *oldarg; Tcl_Obj **objv; int rcode; swig_class *cls; swig_class *cls_stack[64]; int cls_stack_bi[64]; int cls_stack_top = 0; int numconf = 2; int bi; objv = (Tcl_Obj **) _objv; if (objc < 2) { Tcl_SetResult(interp, (char *) "wrong # args.", TCL_STATIC); return TCL_ERROR; } method = Tcl_GetStringFromObj(objv[1],NULL); if (strcmp(method,"-acquire") == 0) { inst->destroy = 1; SWIG_Acquire(inst->thisvalue); return TCL_OK; } if (strcmp(method,"-disown") == 0) { if (inst->destroy) { SWIG_Disown(inst->thisvalue); } inst->destroy = 0; return TCL_OK; } if (strcmp(method,"-delete") == 0) { Tcl_DeleteCommandFromToken(interp,inst->cmdtok); return TCL_OK; } cls_stack[cls_stack_top] = inst->classptr; cls_stack_bi[cls_stack_top] = -1; while (1) { Tcl_HashEntry* hashentry; bi = cls_stack_bi[cls_stack_top]; cls = cls_stack[cls_stack_top]; if (bi != -1) { if (!cls->bases[bi] && cls->base_names[bi]) { /* lookup and cache the base class */ swig_type_info *info = SWIG_TypeQueryModule(cls->module, cls->module, cls->base_names[bi]); if (info) cls->bases[bi] = (swig_class *) info->clientdata; } cls = cls->bases[bi]; if (cls) { cls_stack_bi[cls_stack_top]++; cls_stack_top++; cls_stack[cls_stack_top] = cls; cls_stack_bi[cls_stack_top] = -1; continue; } } if (!cls) { cls_stack_top--; if (cls_stack_top < 0) break; else continue; } cls_stack_bi[cls_stack_top]++; hashentry = Tcl_FindHashEntry(&(cls->hashtable), method); if (hashentry) { ClientData cd = Tcl_GetHashValue(hashentry); swig_wrapper method_wrapper = (swig_wrapper)cd; oldarg = objv[1]; objv[1] = inst->thisptr; Tcl_IncrRefCount(inst->thisptr); rcode = (method_wrapper)(clientData,interp,objc,objv); objv[1] = oldarg; Tcl_DecrRefCount(inst->thisptr); return rcode; } /* Check class methods for a match */ if (strcmp(method,"cget") == 0) { if (objc < 3) { Tcl_SetResult(interp, (char *) "wrong # args.", TCL_STATIC); return TCL_ERROR; } attrname = Tcl_GetStringFromObj(objv[2],NULL); attr = cls->attributes; while (attr && attr->name) { if ((strcmp(attr->name, attrname) == 0) && (attr->getmethod)) { oldarg = objv[1]; objv[1] = inst->thisptr; Tcl_IncrRefCount(inst->thisptr); rcode = (*attr->getmethod)(clientData,interp,2, objv); objv[1] = oldarg; Tcl_DecrRefCount(inst->thisptr); return rcode; } attr++; } if (strcmp(attrname, "-this") == 0) { Tcl_SetObjResult(interp, Tcl_DuplicateObj(inst->thisptr)); return TCL_OK; } if (strcmp(attrname, "-thisown") == 0) { if (SWIG_Thisown(inst->thisvalue)) { Tcl_SetResult(interp,(char*)"1",TCL_STATIC); } else { Tcl_SetResult(interp,(char*)"0",TCL_STATIC); } return TCL_OK; } } else if (strcmp(method, "configure") == 0) { int i; if (objc < 4) { Tcl_SetResult(interp, (char *) "wrong # args.", TCL_STATIC); return TCL_ERROR; } i = 2; while (i < objc) { attrname = Tcl_GetStringFromObj(objv[i],NULL); attr = cls->attributes; while (attr && attr->name) { if ((strcmp(attr->name, attrname) == 0) && (attr->setmethod)) { oldarg = objv[i]; objv[i] = inst->thisptr; Tcl_IncrRefCount(inst->thisptr); rcode = (*attr->setmethod)(clientData,interp,3, &objv[i-1]); objv[i] = oldarg; Tcl_DecrRefCount(inst->thisptr); if (rcode != TCL_OK) return rcode; numconf += 2; } attr++; } i+=2; } } } if (strcmp(method,"configure") == 0) { if (numconf >= objc) { return TCL_OK; } else { Tcl_SetResult(interp,(char *) "Invalid attribute name.", TCL_STATIC); return TCL_ERROR; } } if (strcmp(method,"cget") == 0) { Tcl_SetResult(interp,(char *) "Invalid attribute name.", TCL_STATIC); return TCL_ERROR; } Tcl_SetResult(interp, (char *) "Invalid method. Must be one of: configure cget -acquire -disown -delete", TCL_STATIC); cls = inst->classptr; bi = 0; while (cls) { meth = cls->methods; while (meth && meth->name) { char *cr = (char *) Tcl_GetStringResult(interp); size_t meth_len = strlen(meth->name); char* where = strchr(cr,':'); while(where) { where = strstr(where, meth->name); if(where) { if(where[-1] == ' ' && (where[meth_len] == ' ' || where[meth_len]==0)) { break; } else { where++; } } } if (!where) Tcl_AppendElement(interp, (char *) meth->name); meth++; } cls = inst->classptr->bases[bi++]; } return TCL_ERROR; } /* This function takes the current result and turns it into an object command */ SWIGRUNTIME Tcl_Obj * SWIG_Tcl_NewInstanceObj(Tcl_Interp *interp, void *thisvalue, swig_type_info *type, int flags) { Tcl_Obj *robj = SWIG_NewPointerObj(thisvalue, type,0); /* Check to see if this pointer belongs to a class or not */ if (thisvalue && (type->clientdata) && (interp)) { Tcl_CmdInfo ci; char *name; name = Tcl_GetStringFromObj(robj,NULL); if (!Tcl_GetCommandInfo(interp,name, &ci) || (flags)) { swig_instance *newinst = (swig_instance *) malloc(sizeof(swig_instance)); newinst->thisptr = Tcl_DuplicateObj(robj); Tcl_IncrRefCount(newinst->thisptr); newinst->thisvalue = thisvalue; newinst->classptr = (swig_class *) type->clientdata; newinst->destroy = flags; newinst->cmdtok = Tcl_CreateObjCommand(interp, Tcl_GetStringFromObj(robj,NULL), (swig_wrapper_func) SWIG_MethodCommand, (ClientData) newinst, (swig_delete_func) SWIG_ObjectDelete); if (flags) { SWIG_Acquire(thisvalue); } } } return robj; } /* Function to create objects */ SWIGRUNTIME int SWIG_Tcl_ObjectConstructor(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { Tcl_Obj *newObj = 0; void *thisvalue = 0; swig_instance *newinst = 0; swig_class *classptr = (swig_class *) clientData; swig_wrapper cons = 0; char *name = 0; int firstarg = 0; int thisarg = 0; int destroy = 1; if (!classptr) { Tcl_SetResult(interp, (char *) "swig: internal runtime error. No class object defined.", TCL_STATIC); return TCL_ERROR; } cons = classptr->constructor; if (objc > 1) { char *s = Tcl_GetStringFromObj(objv[1],NULL); if (strcmp(s,"-this") == 0) { thisarg = 2; cons = 0; } else if (strcmp(s,"-args") == 0) { firstarg = 1; } else if (objc == 2) { firstarg = 1; name = s; } else if (objc >= 3) { char *s1; name = s; s1 = Tcl_GetStringFromObj(objv[2],NULL); if (strcmp(s1,"-this") == 0) { thisarg = 3; cons = 0; } else { firstarg = 1; } } } if (cons) { int result; result = (*cons)(0, interp, objc-firstarg, &objv[firstarg]); if (result != TCL_OK) { return result; } newObj = Tcl_DuplicateObj(Tcl_GetObjResult(interp)); if (!name) name = Tcl_GetStringFromObj(newObj,NULL); } else if (thisarg > 0) { if (thisarg < objc) { destroy = 0; newObj = Tcl_DuplicateObj(objv[thisarg]); if (!name) name = Tcl_GetStringFromObj(newObj,NULL); } else { Tcl_SetResult(interp, (char *) "wrong # args.", TCL_STATIC); return TCL_ERROR; } } else { Tcl_SetResult(interp, (char *) "No constructor available.", TCL_STATIC); return TCL_ERROR; } if (SWIG_Tcl_ConvertPtr(interp,newObj, (void **) &thisvalue, *(classptr->type), 0) != SWIG_OK) { Tcl_DecrRefCount(newObj); return TCL_ERROR; } newinst = (swig_instance *) malloc(sizeof(swig_instance)); newinst->thisptr = newObj; Tcl_IncrRefCount(newObj); newinst->thisvalue = thisvalue; newinst->classptr = classptr; newinst->destroy = destroy; if (destroy) { SWIG_Acquire(thisvalue); } newinst->cmdtok = Tcl_CreateObjCommand(interp,name, (swig_wrapper) SWIG_MethodCommand, (ClientData) newinst, (swig_delete_func) SWIG_ObjectDelete); return TCL_OK; } /* -----------------------------------------------------------------------------* * Get arguments * -----------------------------------------------------------------------------*/ SWIGRUNTIME int SWIG_Tcl_GetArgs(Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[], const char *fmt, ...) { int argno = 0, opt = 0; long tempi; double tempd; const char *c; va_list ap; void *vptr; Tcl_Obj *obj = 0; swig_type_info *ty; va_start(ap,fmt); for (c = fmt; (*c && (*c != ':') && (*c != ';')); c++,argno++) { if (*c == '|') { opt = 1; c++; } if (argno >= (objc-1)) { if (!opt) { Tcl_SetResult(interp, (char *) "Wrong number of arguments ", TCL_STATIC); goto argerror; } else { va_end(ap); return TCL_OK; } } vptr = va_arg(ap,void *); if (vptr) { if (isupper(*c)) { obj = SWIG_Tcl_GetConstantObj(Tcl_GetStringFromObj(objv[argno+1],0)); if (!obj) obj = objv[argno+1]; } else { obj = objv[argno+1]; } switch(*c) { case 'i': case 'I': case 'l': case 'L': case 'h': case 'H': case 'b': case 'B': if (Tcl_GetLongFromObj(interp,obj,&tempi) != TCL_OK) goto argerror; if ((*c == 'i') || (*c == 'I')) *((int *)vptr) = (int)tempi; else if ((*c == 'l') || (*c == 'L')) *((long *)vptr) = (long)tempi; else if ((*c == 'h') || (*c == 'H')) *((short*)vptr) = (short)tempi; else if ((*c == 'b') || (*c == 'B')) *((unsigned char *)vptr) = (unsigned char)tempi; break; case 'f': case 'F': case 'd': case 'D': if (Tcl_GetDoubleFromObj(interp,obj,&tempd) != TCL_OK) goto argerror; if ((*c == 'f') || (*c == 'F')) *((float *) vptr) = (float)tempd; else if ((*c == 'd') || (*c == 'D')) *((double*) vptr) = tempd; break; case 's': case 'S': if (*(c+1) == '#') { int *vlptr = (int *) va_arg(ap, void *); *((char **) vptr) = Tcl_GetStringFromObj(obj, vlptr); c++; } else { *((char **)vptr) = Tcl_GetStringFromObj(obj,NULL); } break; case 'c': case 'C': *((char *)vptr) = *(Tcl_GetStringFromObj(obj,NULL)); break; case 'p': case 'P': ty = (swig_type_info *) va_arg(ap, void *); if (SWIG_Tcl_ConvertPtr(interp, obj, (void **) vptr, ty, 0) != SWIG_OK) goto argerror; break; case 'o': case 'O': *((Tcl_Obj **)vptr) = objv[argno+1]; break; default: break; } } } if ((*c != ';') && ((objc-1) > argno)) { Tcl_SetResult(interp, (char *) "Wrong # args.", TCL_STATIC); goto argerror; } va_end(ap); return TCL_OK; argerror: { char temp[32]; sprintf(temp,"%d", argno+1); c = strchr(fmt,':'); if (!c) c = strchr(fmt,';'); if (!c) c = (char *)""; Tcl_AppendResult(interp,c," argument ", temp, NULL); va_end(ap); return TCL_ERROR; } } #ifdef __cplusplus } #endif swig-4.0.1/Lib/tcl/tclopers.swg0000644000175000017500000000275013527063513016221 0ustar williamwilliam/* ----------------------------------------------------------------------------- * tclopers.swg * * C++ overloaded operators. * * These declarations define how SWIG is going to rename C++ * overloaded operators in Tcl. Since Tcl allows identifiers * to be essentially any valid string, we'll just use the * normal operator names. * ----------------------------------------------------------------------------- */ #ifdef __cplusplus %rename("+") *::operator+; //%rename("u+") *::operator+(); // Unary + //%rename("u+") *::operator+() const; // Unary + %rename("-") *::operator-; //%rename("u-") *::operator-(); // Unary - //%rename("u-") *::operator-() const; // Unary - %rename("*") *::operator*; %rename("/") *::operator/; %rename("<<") *::operator<<; %rename(">>") *::operator>>; %rename("&") *::operator&; %rename("|") *::operator|; %rename("^") *::operator^; %rename("%") *::operator%; %rename("=") *::operator=; /* Ignored operators */ %ignoreoperator(NOTEQUAL) operator!=; %ignoreoperator(PLUSEQ) operator+=; %ignoreoperator(MINUSEQ) operator-=; %ignoreoperator(MULEQ) operator*=; %ignoreoperator(DIVEQ) operator/=; %ignoreoperator(MODEQ) operator%=; %ignoreoperator(LSHIFTEQ) operator<<=; %ignoreoperator(RSHIFTEQ) operator>>=; %ignoreoperator(ANDEQ) operator&=; %ignoreoperator(OREQ) operator|=; %ignoreoperator(XOREQ) operator^=; #endif swig-4.0.1/Lib/tcl/tclinterp.i0000644000175000017500000000115113527063513016014 0ustar williamwilliam/* ----------------------------------------------------------------------------- * tclinterp.i * * Tcl_Interp *interp * * Passes the current Tcl_Interp value directly to a C function. * This can be used to work with existing wrapper functions or * if you just need the interp value for some reason. When used, * the 'interp' parameter becomes hidden in the Tcl interface--that * is, you don't specify it explicitly. SWIG fills in its value * automatically. * ----------------------------------------------------------------------------- */ %typemap(in,numinputs=0) Tcl_Interp *interp { $1 = interp; } swig-4.0.1/Lib/tcl/mactkinit.c0000644000175000017500000001237113527063513015773 0ustar williamwilliam/* ----------------------------------------------------------------------------- * mactkinit.c * * This is a support file needed to build a new version of Wish. * Normally, this capability is found in TkAppInit.c, but this creates * tons of namespace problems for many applications. * ----------------------------------------------------------------------------- */ #include #include #include #include #include #include #include "tk.h" #include "tkInt.h" #include "tkMacInt.h" typedef int (*TclMacConvertEventPtr) _ANSI_ARGS_((EventRecord *eventPtr)); Tcl_Interp *gStdoutInterp = NULL; void TclMacSetEventProc _ANSI_ARGS_((TclMacConvertEventPtr procPtr)); int TkMacConvertEvent _ANSI_ARGS_((EventRecord *eventPtr)); /* * Prototypes for functions the ANSI library needs to link against. */ short InstallConsole _ANSI_ARGS_((short fd)); void RemoveConsole _ANSI_ARGS_((void)); long WriteCharsToConsole _ANSI_ARGS_((char *buff, long n)); long ReadCharsFromConsole _ANSI_ARGS_((char *buff, long n)); char * __ttyname _ANSI_ARGS_((long fildes)); short SIOUXHandleOneEvent _ANSI_ARGS_((EventRecord *event)); /* * Forward declarations for procedures defined later in this file: */ /* *---------------------------------------------------------------------- * * MacintoshInit -- * * This procedure calls Mac specific initialization calls. Most of * these calls must be made as soon as possible in the startup * process. * * Results: * Returns TCL_OK if everything went fine. If it didn't the * application should probably fail. * * Side effects: * Inits the application. * *---------------------------------------------------------------------- */ int MacintoshInit() { int i; long result, mask = 0x0700; /* mask = system 7.x */ /* * Tk needs us to set the qd pointer it uses. This is needed * so Tk doesn't have to assume the availiblity of the qd global * variable. Which in turn allows Tk to be used in code resources. */ tcl_macQdPtr = &qd; InitGraf(&tcl_macQdPtr->thePort); InitFonts(); InitWindows(); InitMenus(); InitDialogs((long) NULL); InitCursor(); /* * Make sure we are running on system 7 or higher */ if ((NGetTrapAddress(_Gestalt, ToolTrap) == NGetTrapAddress(_Unimplemented, ToolTrap)) || (((Gestalt(gestaltSystemVersion, &result) != noErr) || (mask != (result & mask))))) { panic("Tcl/Tk requires System 7 or higher."); } /* * Make sure we have color quick draw * (this means we can't run on 68000 macs) */ if (((Gestalt(gestaltQuickdrawVersion, &result) != noErr) || (result < gestalt32BitQD13))) { panic("Tk requires Color QuickDraw."); } FlushEvents(everyEvent, 0); SetEventMask(everyEvent); /* * Set up stack & heap sizes */ /* TODO: stack size size = StackSpace(); SetAppLimit(GetAppLimit() - 8192); */ MaxApplZone(); for (i = 0; i < 4; i++) { (void) MoreMasters(); } TclMacSetEventProc(TkMacConvertEvent); TkConsoleCreate(); return TCL_OK; } /* *---------------------------------------------------------------------- * * SetupMainInterp -- * * This procedure calls initialization routines require a Tcl * interp as an argument. This call effectively makes the passed * iterpreter the "main" interpreter for the application. * * Results: * Returns TCL_OK if everything went fine. If it didn't the * application should probably fail. * * Side effects: * More initialization. * *---------------------------------------------------------------------- */ int SetupMainInterp( Tcl_Interp *interp) { /* * Initialize the console only if we are running as an interactive * application. */ TkMacInitAppleEvents(interp); TkMacInitMenus(interp); if (strcmp(Tcl_GetVar(interp, "tcl_interactive", TCL_GLOBAL_ONLY), "1") == 0) { if (TkConsoleInit(interp) == TCL_ERROR) { goto error; } } /* * Attach the global interpreter to tk's expected global console */ gStdoutInterp = interp; return TCL_OK; error: panic(interp->result); return TCL_ERROR; } /* *---------------------------------------------------------------------- * * InstallConsole, RemoveConsole, etc. -- * * The following functions provide the UI for the console package. * Users wishing to replace SIOUX with their own console package * need only provide the four functions below in a library. * * Results: * See SIOUX documentation for details. * * Side effects: * See SIOUX documentation for details. * *---------------------------------------------------------------------- */ short InstallConsole(short fd) { #pragma unused (fd) return 0; } void RemoveConsole(void) { } long WriteCharsToConsole(char *buffer, long n) { TkConsolePrint(gStdoutInterp, TCL_STDOUT, buffer, n); return n; } long ReadCharsFromConsole(char *buffer, long n) { return 0; } extern char * __ttyname(long fildes) { static char *devicename = "null device"; if (fildes >= 0 && fildes <= 2) { return (devicename); } return (0L); } short SIOUXHandleOneEvent(EventRecord *event) { return 0; } swig-4.0.1/Lib/tcl/typemaps.i0000644000175000017500000003727213527063513015667 0ustar williamwilliam/* ----------------------------------------------------------------------------- * typemaps.i * * SWIG typemap library for Tcl8. This file contains various sorts * of typemaps for modifying SWIG's code generation. * ----------------------------------------------------------------------------- */ #if !defined(SWIG_USE_OLD_TYPEMAPS) %include #else /* The SWIG typemap library provides a language independent mechanism for supporting output arguments, input values, and other C function calling mechanisms. The primary use of the library is to provide a better interface to certain C function--especially those involving pointers. */ // INPUT typemaps. // These remap a C pointer to be an "INPUT" value which is passed by value // instead of reference. /* The following methods can be applied to turn a pointer into a simple "input" value. That is, instead of passing a pointer to an object, you would use a real value instead. int *INPUT short *INPUT long *INPUT long long *INPUT unsigned int *INPUT unsigned short *INPUT unsigned long *INPUT unsigned long long *INPUT unsigned char *INPUT bool *INPUT float *INPUT double *INPUT To use these, suppose you had a C function like this : double fadd(double *a, double *b) { return *a+*b; } You could wrap it with SWIG as follows : %include typemaps.i double fadd(double *INPUT, double *INPUT); or you can use the %apply directive : %include typemaps.i %apply double *INPUT { double *a, double *b }; double fadd(double *a, double *b); */ %typemap(in) double *INPUT(double temp), double &INPUT(double temp) { if (Tcl_GetDoubleFromObj(interp,$input,&temp) == TCL_ERROR) { SWIG_fail; } $1 = &temp; } %typemap(in) float *INPUT(double dvalue, float temp), float &INPUT(double dvalue, float temp) { if (Tcl_GetDoubleFromObj(interp,$input,&dvalue) == TCL_ERROR) { SWIG_fail; } temp = (float) dvalue; $1 = &temp; } %typemap(in) int *INPUT(int temp), int &INPUT(int temp) { if (Tcl_GetIntFromObj(interp,$input,&temp) == TCL_ERROR) { SWIG_fail; } $1 = &temp; } %typemap(in) short *INPUT(int ivalue, short temp), short &INPUT(int ivalue, short temp) { if (Tcl_GetIntFromObj(interp,$input,&ivalue) == TCL_ERROR) { SWIG_fail; } temp = (short) ivalue; $1 = &temp; } %typemap(in) long *INPUT(int ivalue, long temp), long &INPUT(int ivalue, long temp) { if (Tcl_GetIntFromObj(interp,$input,&ivalue) == TCL_ERROR) { SWIG_fail; } temp = (long) ivalue; $1 = &temp; } %typemap(in) unsigned int *INPUT(int ivalue, unsigned int temp), unsigned int &INPUT(int ivalue, unsigned int temp) { if (Tcl_GetIntFromObj(interp,$input,&ivalue) == TCL_ERROR) { SWIG_fail; } temp = (unsigned int) ivalue; $1 = &temp; } %typemap(in) unsigned short *INPUT(int ivalue, unsigned short temp), unsigned short &INPUT(int ivalue, unsigned short temp) { if (Tcl_GetIntFromObj(interp,$input,&ivalue) == TCL_ERROR) { SWIG_fail; } temp = (unsigned short) ivalue; $1 = &temp; } %typemap(in) unsigned long *INPUT(int ivalue, unsigned long temp), unsigned long &INPUT(int ivalue, unsigned long temp) { if (Tcl_GetIntFromObj(interp,$input,&ivalue) == TCL_ERROR) { SWIG_fail; } temp = (unsigned long) ivalue; $1 = &temp; } %typemap(in) unsigned char *INPUT(int ivalue, unsigned char temp), unsigned char &INPUT(int ivalue, unsigned char temp) { if (Tcl_GetIntFromObj(interp,$input,&ivalue) == TCL_ERROR) { SWIG_fail; } temp = (unsigned char) ivalue; $1 = &temp; } %typemap(in) signed char *INPUT(int ivalue, signed char temp), signed char &INPUT(int ivalue, signed char temp) { if (Tcl_GetIntFromObj(interp,$input,&ivalue) == TCL_ERROR) { SWIG_fail; } temp = (signed char) ivalue; $1 = &temp; } %typemap(in) bool *INPUT(int ivalue, bool temp), bool &INPUT(int ivalue, bool temp) { if (Tcl_GetIntFromObj(interp,$input,&ivalue) == TCL_ERROR) { SWIG_fail; } temp = ivalue ? true : false; $1 = &temp; } %typemap(in) long long *INPUT($*1_ltype temp), long long &INPUT($*1_ltype temp) { temp = ($*1_ltype) strtoll(Tcl_GetStringFromObj($input,NULL),0,0); $1 = &temp; } %typemap(in) unsigned long long *INPUT($*1_ltype temp), unsigned long long &INPUT($*1_ltype temp) { temp = ($*1_ltype) strtoull(Tcl_GetStringFromObj($input,NULL),0,0); $1 = &temp; } // OUTPUT typemaps. These typemaps are used for parameters that // are output only. The output value is appended to the result as // a list element. /* The following methods can be applied to turn a pointer into an "output" value. When calling a function, no input value would be given for a parameter, but an output value would be returned. In the case of multiple output values, they are returned in the form of a Tcl list. int *OUTPUT short *OUTPUT long *OUTPUT long long *OUTPUT unsigned int *OUTPUT unsigned short *OUTPUT unsigned long *OUTPUT unsigned long long *OUTPUT unsigned char *OUTPUT bool *OUTPUT float *OUTPUT double *OUTPUT For example, suppose you were trying to wrap the modf() function in the C math library which splits x into integral and fractional parts (and returns the integer part in one of its parameters).K: double modf(double x, double *ip); You could wrap it with SWIG as follows : %include typemaps.i double modf(double x, double *OUTPUT); or you can use the %apply directive : %include typemaps.i %apply double *OUTPUT { double *ip }; double modf(double x, double *ip); The Tcl output of the function would be a list containing both output values. */ %typemap(in,numinputs=0) int *OUTPUT(int temp), short *OUTPUT(short temp), long *OUTPUT(long temp), unsigned int *OUTPUT(unsigned int temp), unsigned short *OUTPUT(unsigned short temp), unsigned long *OUTPUT(unsigned long temp), unsigned char *OUTPUT(unsigned char temp), signed char *OUTPUT(signed char temp), bool *OUTPUT(bool temp), float *OUTPUT(float temp), double *OUTPUT(double temp), long long *OUTPUT($*1_ltype temp), unsigned long long *OUTPUT($*1_ltype temp), int &OUTPUT(int temp), short &OUTPUT(short temp), long &OUTPUT(long temp), unsigned int &OUTPUT(unsigned int temp), unsigned short &OUTPUT(unsigned short temp), unsigned long &OUTPUT(unsigned long temp), signed char &OUTPUT(signed char temp), bool &OUTPUT(bool temp), unsigned char &OUTPUT(unsigned char temp), float &OUTPUT(float temp), double &OUTPUT(double temp), long long &OUTPUT($*1_ltype temp), unsigned long long &OUTPUT($*1_ltype temp) "$1 = &temp;"; %typemap(argout) int *OUTPUT, int &OUTPUT, short *OUTPUT, short &OUTPUT, long *OUTPUT, long &OUTPUT, unsigned int *OUTPUT, unsigned int &OUTPUT, unsigned short *OUTPUT, unsigned short &OUTPUT, unsigned long *OUTPUT, unsigned long &OUTPUT, unsigned char *OUTPUT, unsigned char &OUTPUT, signed char *OUTPUT, signed char &OUTPUT, bool *OUTPUT, bool &OUTPUT { Tcl_Obj *o; o = Tcl_NewIntObj((int) *($1)); Tcl_ListObjAppendElement(interp,Tcl_GetObjResult(interp),o); } %typemap(argout) float *OUTPUT, float &OUTPUT, double *OUTPUT, double &OUTPUT { Tcl_Obj *o; o = Tcl_NewDoubleObj((double) *($1)); Tcl_ListObjAppendElement(interp,Tcl_GetObjResult(interp),o); } %typemap(argout) long long *OUTPUT, long long &OUTPUT { char temp[256]; Tcl_Obj *o; sprintf(temp,"%lld",(long long)*($1)); o = Tcl_NewStringObj(temp,-1); Tcl_ListObjAppendElement(interp,Tcl_GetObjResult(interp),o); } %typemap(argout) unsigned long long *OUTPUT, unsigned long long &OUTPUT { char temp[256]; Tcl_Obj *o; sprintf(temp,"%llu",(unsigned long long)*($1)); o = Tcl_NewStringObj(temp,-1); Tcl_ListObjAppendElement(interp,Tcl_GetObjResult(interp),o); } // INOUT // Mappings for an argument that is both an input and output // parameter /* The following methods can be applied to make a function parameter both an input and output value. This combines the behavior of both the "INPUT" and "OUTPUT" methods described earlier. Output values are returned in the form of a Tcl list. int *INOUT short *INOUT long *INOUT long long *INOUT unsigned int *INOUT unsigned short *INOUT unsigned long *INOUT unsigned long long *INOUT unsigned char *INOUT bool *INOUT float *INOUT double *INOUT For example, suppose you were trying to wrap the following function : void neg(double *x) { *x = -(*x); } You could wrap it with SWIG as follows : %include typemaps.i void neg(double *INOUT); or you can use the %apply directive : %include typemaps.i %apply double *INOUT { double *x }; void neg(double *x); Unlike C, this mapping does not directly modify the input value (since this makes no sense in Tcl). Rather, the modified input value shows up as the return value of the function. Thus, to apply this function to a Tcl variable you might do this : set x [neg $x] */ %typemap(in) int *INOUT = int *INPUT; %typemap(in) short *INOUT = short *INPUT; %typemap(in) long *INOUT = long *INPUT; %typemap(in) unsigned int *INOUT = unsigned int *INPUT; %typemap(in) unsigned short *INOUT = unsigned short *INPUT; %typemap(in) unsigned long *INOUT = unsigned long *INPUT; %typemap(in) unsigned char *INOUT = unsigned char *INPUT; %typemap(in) signed char *INOUT = signed char *INPUT; %typemap(in) bool *INOUT = bool *INPUT; %typemap(in) float *INOUT = float *INPUT; %typemap(in) double *INOUT = double *INPUT; %typemap(in) long long *INOUT = long long *INPUT; %typemap(in) unsigned long long *INOUT = unsigned long long *INPUT; %typemap(in) int &INOUT = int &INPUT; %typemap(in) short &INOUT = short &INPUT; %typemap(in) long &INOUT = long &INPUT; %typemap(in) unsigned int &INOUT = unsigned int &INPUT; %typemap(in) unsigned short &INOUT = unsigned short &INPUT; %typemap(in) unsigned long &INOUT = unsigned long &INPUT; %typemap(in) unsigned char &INOUT = unsigned char &INPUT; %typemap(in) signed char &INOUT = signed char &INPUT; %typemap(in) bool &INOUT = bool &INPUT; %typemap(in) float &INOUT = float &INPUT; %typemap(in) double &INOUT = double &INPUT; %typemap(in) long long &INOUT = long long &INPUT; %typemap(in) unsigned long long &INOUT = unsigned long long &INPUT; %typemap(argout) int *INOUT = int *OUTPUT; %typemap(argout) short *INOUT = short *OUTPUT; %typemap(argout) long *INOUT = long *OUTPUT; %typemap(argout) unsigned int *INOUT = unsigned int *OUTPUT; %typemap(argout) unsigned short *INOUT = unsigned short *OUTPUT; %typemap(argout) unsigned long *INOUT = unsigned long *OUTPUT; %typemap(argout) unsigned char *INOUT = unsigned char *OUTPUT; %typemap(argout) signed char *INOUT = signed char *OUTPUT; %typemap(argout) bool *INOUT = bool *OUTPUT; %typemap(argout) float *INOUT = float *OUTPUT; %typemap(argout) double *INOUT = double *OUTPUT; %typemap(argout) long long *INOUT = long long *OUTPUT; %typemap(argout) unsigned long long *INOUT = unsigned long long *OUTPUT; %typemap(argout) int &INOUT = int &OUTPUT; %typemap(argout) short &INOUT = short &OUTPUT; %typemap(argout) long &INOUT = long &OUTPUT; %typemap(argout) unsigned int &INOUT = unsigned int &OUTPUT; %typemap(argout) unsigned short &INOUT = unsigned short &OUTPUT; %typemap(argout) unsigned long &INOUT = unsigned long &OUTPUT; %typemap(argout) unsigned char &INOUT = unsigned char &OUTPUT; %typemap(argout) signed char &INOUT = signed char &OUTPUT; %typemap(argout) bool &INOUT = bool &OUTPUT; %typemap(argout) float &INOUT = float &OUTPUT; %typemap(argout) double &INOUT = double &OUTPUT; %typemap(argout) long long &INOUT = long long &OUTPUT; %typemap(argout) unsigned long long &INOUT = unsigned long long &OUTPUT; /* Overloading information */ %typemap(typecheck) double *INPUT = double; %typemap(typecheck) bool *INPUT = bool; %typemap(typecheck) signed char *INPUT = signed char; %typemap(typecheck) unsigned char *INPUT = unsigned char; %typemap(typecheck) unsigned long *INPUT = unsigned long; %typemap(typecheck) unsigned short *INPUT = unsigned short; %typemap(typecheck) unsigned int *INPUT = unsigned int; %typemap(typecheck) long *INPUT = long; %typemap(typecheck) short *INPUT = short; %typemap(typecheck) int *INPUT = int; %typemap(typecheck) float *INPUT = float; %typemap(typecheck) long long *INPUT = long long; %typemap(typecheck) unsigned long long *INPUT = unsigned long long; %typemap(typecheck) double &INPUT = double; %typemap(typecheck) bool &INPUT = bool; %typemap(typecheck) signed char &INPUT = signed char; %typemap(typecheck) unsigned char &INPUT = unsigned char; %typemap(typecheck) unsigned long &INPUT = unsigned long; %typemap(typecheck) unsigned short &INPUT = unsigned short; %typemap(typecheck) unsigned int &INPUT = unsigned int; %typemap(typecheck) long &INPUT = long; %typemap(typecheck) short &INPUT = short; %typemap(typecheck) int &INPUT = int; %typemap(typecheck) float &INPUT = float; %typemap(typecheck) long long &INPUT = long long; %typemap(typecheck) unsigned long long &INPUT = unsigned long long; %typemap(typecheck) double *INOUT = double; %typemap(typecheck) bool *INOUT = bool; %typemap(typecheck) signed char *INOUT = signed char; %typemap(typecheck) unsigned char *INOUT = unsigned char; %typemap(typecheck) unsigned long *INOUT = unsigned long; %typemap(typecheck) unsigned short *INOUT = unsigned short; %typemap(typecheck) unsigned int *INOUT = unsigned int; %typemap(typecheck) long *INOUT = long; %typemap(typecheck) short *INOUT = short; %typemap(typecheck) int *INOUT = int; %typemap(typecheck) float *INOUT = float; %typemap(typecheck) long long *INOUT = long long; %typemap(typecheck) unsigned long long *INOUT = unsigned long long; %typemap(typecheck) double &INOUT = double; %typemap(typecheck) bool &INOUT = bool; %typemap(typecheck) signed char &INOUT = signed char; %typemap(typecheck) unsigned char &INOUT = unsigned char; %typemap(typecheck) unsigned long &INOUT = unsigned long; %typemap(typecheck) unsigned short &INOUT = unsigned short; %typemap(typecheck) unsigned int &INOUT = unsigned int; %typemap(typecheck) long &INOUT = long; %typemap(typecheck) short &INOUT = short; %typemap(typecheck) int &INOUT = int; %typemap(typecheck) float &INOUT = float; %typemap(typecheck) long long &INOUT = long long; %typemap(typecheck) unsigned long long &INOUT = unsigned long long; #endif // -------------------------------------------------------------------- // Special types // -------------------------------------------------------------------- %include %include swig-4.0.1/Lib/tcl/tclinit.swg0000644000175000017500000000774313527063513016043 0ustar williamwilliam/* ------------------------------------------------------------ * The start of the Tcl initialization function * ------------------------------------------------------------ */ %insert(init) "swiginit.swg" /* This initialization code exports the module initialization function */ %header %{ #ifdef __cplusplus extern "C" { #endif #ifdef MAC_TCL #pragma export on #endif SWIGEXPORT int SWIG_init(Tcl_Interp *); #ifdef MAC_TCL #pragma export off #endif #ifdef __cplusplus } #endif /* Compatibility version for TCL stubs */ #ifndef SWIG_TCL_STUBS_VERSION #define SWIG_TCL_STUBS_VERSION "8.1" #endif %} %init %{ #ifdef __cplusplus extern "C" { #endif /* ----------------------------------------------------------------------------- * constants/methods manipulation * ----------------------------------------------------------------------------- */ /* Install Constants */ SWIGINTERN void SWIG_Tcl_InstallConstants(Tcl_Interp *interp, swig_const_info constants[]) { size_t i; Tcl_Obj *obj; if (!swigconstTableinit) { Tcl_InitHashTable(&swigconstTable, TCL_STRING_KEYS); swigconstTableinit = 1; } for (i = 0; constants[i].type; i++) { switch(constants[i].type) { case SWIG_TCL_POINTER: obj = SWIG_NewPointerObj(constants[i].pvalue, *(constants[i]).ptype,0); break; case SWIG_TCL_BINARY: obj = SWIG_NewPackedObj(constants[i].pvalue, constants[i].lvalue, *(constants[i].ptype)); break; default: obj = 0; break; } if (obj) { SWIG_Tcl_SetConstantObj(interp, constants[i].name, obj); } } } /* Create fast method lookup tables */ SWIGINTERN void SWIG_Tcl_InstallMethodLookupTables(void) { size_t i; for (i = 0; i < swig_module.size; ++i) { swig_type_info *type = swig_module.type_initial[i]; if (type->clientdata) { swig_class* klass = (swig_class*) type->clientdata; swig_method* meth; Tcl_InitHashTable(&(klass->hashtable), TCL_STRING_KEYS); for (meth = klass->methods; meth && meth->name; ++meth) { int newEntry; Tcl_HashEntry* hashentry = Tcl_CreateHashEntry(&(klass->hashtable), meth->name, &newEntry); Tcl_SetHashValue(hashentry, (ClientData)meth->method); } } } } #ifdef __cplusplus } #endif /* -----------------------------------------------------------------------------* * Partial Init method * -----------------------------------------------------------------------------*/ SWIGEXPORT int SWIG_init(Tcl_Interp *interp) { size_t i; if (interp == 0) return TCL_ERROR; #ifdef USE_TCL_STUBS /* (char*) cast is required to avoid compiler warning/error for Tcl < 8.4. */ if (Tcl_InitStubs(interp, (char*)SWIG_TCL_STUBS_VERSION, 0) == NULL) { return TCL_ERROR; } #endif #ifdef USE_TK_STUBS /* (char*) cast is required to avoid compiler warning/error. */ if (Tk_InitStubs(interp, (char*)SWIG_TCL_STUBS_VERSION, 0) == NULL) { return TCL_ERROR; } #endif Tcl_PkgProvide(interp, (char*)SWIG_name, (char*)SWIG_version); #ifdef SWIG_namespace Tcl_Eval(interp, "namespace eval " SWIG_namespace " { }"); #endif SWIG_InitializeModule((void *) interp); SWIG_PropagateClientData(); for (i = 0; swig_commands[i].name; i++) { Tcl_CreateObjCommand(interp, (char *) swig_commands[i].name, (swig_wrapper_func) swig_commands[i].wrapper, swig_commands[i].clientdata, NULL); } for (i = 0; swig_variables[i].name; i++) { Tcl_SetVar(interp, (char *) swig_variables[i].name, (char *) "", TCL_GLOBAL_ONLY); Tcl_TraceVar(interp, (char *) swig_variables[i].name, TCL_TRACE_READS | TCL_GLOBAL_ONLY, (Tcl_VarTraceProc *) swig_variables[i].get, (ClientData) swig_variables[i].addr); Tcl_TraceVar(interp, (char *) swig_variables[i].name, TCL_TRACE_WRITES | TCL_GLOBAL_ONLY, (Tcl_VarTraceProc *) swig_variables[i].set, (ClientData) swig_variables[i].addr); } SWIG_Tcl_InstallConstants(interp, swig_constants); SWIG_Tcl_InstallMethodLookupTables(); %} /* Note: the initialization function is closed after all code is generated */ swig-4.0.1/Lib/tcl/tclapi.swg0000644000175000017500000000604213527063513015640 0ustar williamwilliam/* ----------------------------------------------------------------------------- * SWIG API. Portion that goes into the runtime * ----------------------------------------------------------------------------- */ #ifdef __cplusplus extern "C" { #endif /* ----------------------------------------------------------------------------- * Constant declarations * ----------------------------------------------------------------------------- */ /* Constant Types */ #define SWIG_TCL_POINTER 4 #define SWIG_TCL_BINARY 5 /* Constant information structure */ typedef struct swig_const_info { int type; const char *name; long lvalue; double dvalue; void *pvalue; swig_type_info **ptype; } swig_const_info; typedef int (*swig_wrapper)(ClientData, Tcl_Interp *, int, Tcl_Obj *CONST []); typedef int (*swig_wrapper_func)(ClientData, Tcl_Interp *, int, Tcl_Obj *CONST []); typedef char *(*swig_variable_func)(ClientData, Tcl_Interp *, char *, char *, int); typedef void (*swig_delete_func)(ClientData); typedef struct swig_method { const char *name; swig_wrapper method; } swig_method; typedef struct swig_attribute { const char *name; swig_wrapper getmethod; swig_wrapper setmethod; } swig_attribute; typedef struct swig_class { const char *name; swig_type_info **type; swig_wrapper constructor; void (*destructor)(void *); swig_method *methods; swig_attribute *attributes; struct swig_class **bases; const char **base_names; swig_module_info *module; Tcl_HashTable hashtable; } swig_class; typedef struct swig_instance { Tcl_Obj *thisptr; void *thisvalue; swig_class *classptr; int destroy; Tcl_Command cmdtok; } swig_instance; /* Structure for command table */ typedef struct { const char *name; int (*wrapper)(ClientData, Tcl_Interp *, int, Tcl_Obj *CONST []); ClientData clientdata; } swig_command_info; /* Structure for variable linking table */ typedef struct { const char *name; void *addr; char * (*get)(ClientData, Tcl_Interp *, char *, char *, int); char * (*set)(ClientData, Tcl_Interp *, char *, char *, int); } swig_var_info; /* -----------------------------------------------------------------------------* * Install a constant object * -----------------------------------------------------------------------------*/ static Tcl_HashTable swigconstTable; static int swigconstTableinit = 0; SWIGINTERN void SWIG_Tcl_SetConstantObj(Tcl_Interp *interp, const char* name, Tcl_Obj *obj) { int newobj; Tcl_ObjSetVar2(interp,Tcl_NewStringObj(name,-1), NULL, obj, TCL_GLOBAL_ONLY); Tcl_SetHashValue(Tcl_CreateHashEntry(&swigconstTable, name, &newobj), (ClientData) obj); } SWIGINTERN Tcl_Obj * SWIG_Tcl_GetConstantObj(const char *key) { Tcl_HashEntry *entryPtr; if (!swigconstTableinit) return 0; entryPtr = Tcl_FindHashEntry(&swigconstTable, key); if (entryPtr) { return (Tcl_Obj *) Tcl_GetHashValue(entryPtr); } return 0; } #ifdef __cplusplus } #endif swig-4.0.1/Lib/tcl/carrays.i0000644000175000017500000000004313527063513015453 0ustar williamwilliam%include swig-4.0.1/Lib/tcl/std_pair.i0000644000175000017500000000140013527063513015612 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_pair.i * * Typemaps for std::pair * ----------------------------------------------------------------------------- */ %include %include // ------------------------------------------------------------------------ // std::pair // ------------------------------------------------------------------------ %{ #include %} namespace std { template struct pair { typedef T first_type; typedef U second_type; pair(); pair(T first, U second); pair(const pair& other); template pair(const pair &other); T first; U second; }; // add specializations here } swig-4.0.1/Lib/tcl/tcltypemaps.swg0000644000175000017500000000543713527063513016740 0ustar williamwilliam/* ------------------------------------------------------------ * Typemap specializations for Tcl * ------------------------------------------------------------ */ /* ------------------------------------------------------------ * Fragment section * ------------------------------------------------------------ */ /* In Tcl we need to pass the interp value, so we define the decl/call macros as needed. */ #define SWIG_AS_DECL_ARGS SWIG_TCL_DECL_ARGS_2 #define SWIG_AS_CALL_ARGS SWIG_TCL_CALL_ARGS_2 /* Include fundamental fragment definitions */ %include /* Look for user fragments file. */ %include /* Tcl fragments for primitive types */ %include /* Tcl fragments for char* strings */ %include /* ------------------------------------------------------------ * Unified typemap section * ------------------------------------------------------------ */ /* No director support in Tcl */ #ifdef SWIG_DIRECTOR_TYPEMAPS #undef SWIG_DIRECTOR_TYPEMAPS #endif /* Tcl types */ #define SWIG_Object Tcl_Obj * /* Overload of the output/constant/exception handling */ /* output */ #define %set_output(obj) Tcl_SetObjResult(interp,obj) /* append output */ #define %append_output(obj) Tcl_ListObjAppendElement(interp,Tcl_GetObjResult(interp),obj) /* set constant */ #define SWIG_SetConstant(name, obj) SWIG_Tcl_SetConstantObj(interp, name, obj) /* raise */ #define SWIG_Raise(obj,type,desc) SWIG_Tcl_SetErrorObj(interp,type,obj) /* Include the unified typemap library */ %include /* ------------------------------------------------------------ * Tcl extra typemaps / typemap overrides * ------------------------------------------------------------ */ #if 1 // Old 1.3.25 typemaps needed to avoid premature object deletion %typemap(out,noblock=1) SWIGTYPE *INSTANCE, SWIGTYPE &INSTANCE, SWIGTYPE &&INSTANCE, SWIGTYPE INSTANCE[] { Tcl_SetObjResult(interp, SWIG_NewInstanceObj( %as_voidptr($1), $1_descriptor,0)); } %typemap(out) SWIGTYPE *DYNAMIC, SWIGTYPE &DYNAMIC { swig_type_info *ty = SWIG_TypeDynamicCast($1_descriptor,%as_voidptrptr(&$1)); Tcl_SetObjResult(interp,SWIG_NewInstanceObj(%as_voidptr($1), ty,0)); } #endif %typemap(throws,noblock=1) SWIGTYPE CLASS { SWIG_set_result(SWIG_NewInstanceObj(%as_voidptr(SWIG_new_copy($1, $1_ltype)), $&1_descriptor, 1)); SWIG_fail; } %typemap(out) SWIGTYPE = SWIGTYPE INSTANCE; %typemap(out) SWIGTYPE * = SWIGTYPE *INSTANCE; %typemap(out) SWIGTYPE *const = SWIGTYPE *; %typemap(out) SWIGTYPE & = SWIGTYPE &INSTANCE; %typemap(out) SWIGTYPE && = SWIGTYPE &&INSTANCE; %typemap(out) SWIGTYPE [] = SWIGTYPE INSTANCE[]; %typemap(varout) SWIGTYPE = SWIGTYPE INSTANCE; swig-4.0.1/Lib/tcl/tclerrors.swg0000644000175000017500000000323713527063513016406 0ustar williamwilliam/* ----------------------------------------------------------------------------- * error manipulation * ----------------------------------------------------------------------------- */ SWIGINTERN const char* SWIG_Tcl_ErrorType(int code) { const char* type = 0; switch(code) { case SWIG_MemoryError: type = "MemoryError"; break; case SWIG_IOError: type = "IOError"; break; case SWIG_RuntimeError: type = "RuntimeError"; break; case SWIG_IndexError: type = "IndexError"; break; case SWIG_TypeError: type = "TypeError"; break; case SWIG_DivisionByZero: type = "ZeroDivisionError"; break; case SWIG_OverflowError: type = "OverflowError"; break; case SWIG_SyntaxError: type = "SyntaxError"; break; case SWIG_ValueError: type = "ValueError"; break; case SWIG_SystemError: type = "SystemError"; break; case SWIG_AttributeError: type = "AttributeError"; break; default: type = "RuntimeError"; } return type; } SWIGINTERN void SWIG_Tcl_SetErrorObj(Tcl_Interp *interp, const char *ctype, Tcl_Obj *obj) { Tcl_ResetResult(interp); Tcl_SetObjResult(interp, obj); Tcl_SetErrorCode(interp, "SWIG", ctype, NULL); } SWIGINTERN void SWIG_Tcl_SetErrorMsg(Tcl_Interp *interp, const char *ctype, const char *mesg) { Tcl_ResetResult(interp); Tcl_SetErrorCode(interp, "SWIG", ctype, NULL); Tcl_AppendResult(interp, ctype, " ", mesg, NULL); /* Tcl_AddErrorInfo(interp, ctype); Tcl_AddErrorInfo(interp, " "); Tcl_AddErrorInfo(interp, mesg); */ } SWIGINTERNINLINE void SWIG_Tcl_AddErrorMsg(Tcl_Interp *interp, const char* mesg) { Tcl_AddErrorInfo(interp, mesg); } swig-4.0.1/Lib/tcl/wish.i0000644000175000017500000000655413527063513014776 0ustar williamwilliam/* ----------------------------------------------------------------------------- * wish.i * * SWIG File for making wish * ----------------------------------------------------------------------------- */ #ifdef AUTODOC %subsection "wish.i" %text %{ This module provides the Tk_AppInit() function needed to build a new version of the wish executable. Like tclsh.i, this file should not be used with dynamic loading. To make an interface file work with both static and dynamic loading, put something like this in your interface file : #ifdef STATIC %include #endif A startup file may be specified by defining the symbol SWIG_RcFileName as follows (this should be included in a code-block) : #define SWIG_RcFileName "~/.mywishrc" %} #endif %{ /* Initialization code for wish */ #include #ifndef SWIG_RcFileName char *SWIG_RcFileName = "~/.wishrc"; #endif #ifdef MAC_TCL extern int MacintoshInit _ANSI_ARGS_((void)); extern int SetupMainInterp _ANSI_ARGS_((Tcl_Interp *interp)); #endif /* *---------------------------------------------------------------------- * * Tcl_AppInit -- * * This procedure performs application-specific initialization. * Most applications, especially those that incorporate additional * packages, will have their own version of this procedure. * * Results: * Returns a standard Tcl completion code, and leaves an error * message in interp->result if an error occurs. * * Side effects: * Depends on the startup script. * *---------------------------------------------------------------------- */ int Tcl_AppInit(Tcl_Interp *interp) { #ifndef MAC_TCL Tk_Window main; main = Tk_MainWindow(interp); #endif /* * Call the init procedures for included packages. Each call should * look like this: * * if (Mod_Init(interp) == TCL_ERROR) { * return TCL_ERROR; * } * * where "Mod" is the name of the module. */ if (Tcl_Init(interp) == TCL_ERROR) { return TCL_ERROR; } if (Tk_Init(interp) == TCL_ERROR) { return TCL_ERROR; } /* * Call Tcl_CreateCommand for application-specific commands, if * they weren't already created by the init procedures called above. */ if (SWIG_init(interp) == TCL_ERROR) { return TCL_ERROR; } #ifdef MAC_TCL SetupMainInterp(interp); #endif /* * Specify a user-specific startup file to invoke if the application * is run interactively. Typically the startup file is "~/.apprc" * where "app" is the name of the application. If this line is deleted * then no user-specific startup file will be run under any conditions. */ #if TCL_MAJOR_VERSION >= 8 || TCL_MAJOR_VERSION == 7 && TCL_MINOR_VERSION >= 5 Tcl_SetVar(interp, (char *) "tcl_rcFileName",SWIG_RcFileName,TCL_GLOBAL_ONLY); #else tcl_RcFileName = SWIG_RcFileName; #endif /* For Macintosh might also want this */ #ifdef MAC_TCL #ifdef SWIG_RcRsrcName Tcl_SetVar(interp, (char *) "tcl_rcRsrcName",SWIG_RcRsrcName,TCL_GLOBAL_ONLY); #endif #endif return TCL_OK; } #if TK_MAJOR_VERSION >= 4 int main(int argc, char **argv) { #ifdef MAC_TCL char *newArgv[2]; if (MacintoshInit() != TCL_OK) { Tcl_Exit(1); } argc = 1; newArgv[0] = "Wish"; newArgv[1] = NULL; argv = newArgv; #endif Tk_Main(argc, argv, Tcl_AppInit); return(0); } #else extern int main(); #endif %} swig-4.0.1/Lib/tcl/stl.i0000644000175000017500000000044313527063513014615 0ustar williamwilliam/* ----------------------------------------------------------------------------- * stl.i * ----------------------------------------------------------------------------- */ %include %include %include %include %include swig-4.0.1/Lib/tcl/tcluserdir.swg0000644000175000017500000000030313527063513016536 0ustar williamwilliam/* ----------------------------------------------------------------------------- * Special user directives * ----------------------------------------------------------------------------- */ swig-4.0.1/Lib/tcl/exception.i0000644000175000017500000000022113527063513016003 0ustar williamwilliam%include %insert("runtime") { %define_as(SWIG_exception(code, msg), %block(%error(code, msg); return TCL_ERROR;)) } swig-4.0.1/Lib/tcl/tclwstrings.swg0000644000175000017500000000345413527063513016753 0ustar williamwilliam/* ----------------------------------------------------------------------------- * tclwstrings.wg * * Utility methods for wchar strings * ----------------------------------------------------------------------------- */ %{ #include %} %fragment("SWIG_AsWCharPtrAndSize","header") { SWIGINTERN int SWIG_AsWCharPtrAndSize(Tcl_Obj *obj, wchar_t** cptr, size_t* psize, int *alloc) { int len = 0; Tcl_UniChar *ustr = Tcl_GetUnicodeFromObj(obj, &len); if (ustr) { if (cptr) { Tcl_Encoding encoding = NULL; char *src = (char *) ustr; int srcLen = (len)*sizeof(Tcl_UniChar); int dstLen = sizeof(wchar_t)*(len + 1); char *dst = %new_array(dstLen, char); int flags = 0; Tcl_EncodingState *statePtr = 0; int srcRead = 0; int dstWrote = 0; int dstChars = 0; Tcl_UtfToExternal(0, encoding, src, srcLen, flags, statePtr, dst, dstLen, &srcRead, &dstWrote, &dstChars); if (alloc) *alloc = SWIG_NEWOBJ; } if (psize) *psize = len + 1; return SWIG_OK; } return SWIG_TypeError; } } %fragment("SWIG_FromWCharPtrAndSize","header") { SWIGINTERNINLINE Tcl_Obj * SWIG_FromWCharPtrAndSize(const wchar_t* carray, size_t size) { Tcl_Obj *res = NULL; if (size < INT_MAX) { Tcl_Encoding encoding = NULL; char *src = (char *) carray; int srcLen = (int)(size*sizeof(wchar_t)); int dstLen = (int)(size*sizeof(Tcl_UniChar)); char *dst = %new_array(dstLen, char); int flags = 0; Tcl_EncodingState *statePtr = 0; int srcRead = 0; int dstWrote = 0; int dstChars = 0; Tcl_ExternalToUtf(0, encoding, src, srcLen, flags, statePtr, dst, dstLen, &srcRead, &dstWrote, &dstChars); res = Tcl_NewUnicodeObj((Tcl_UniChar*)dst, (int)size); %delete_array(dst); } return res; } } swig-4.0.1/Lib/tcl/cdata.i0000644000175000017500000000003613527063513015065 0ustar williamwilliam%include swig-4.0.1/Lib/tcl/std_string.i0000644000175000017500000000004413527063513016170 0ustar williamwilliam%include swig-4.0.1/Lib/tcl/std_map.i0000644000175000017500000000464213527063513015447 0ustar williamwilliam// // SWIG typemaps for std::map // // Common implementation %include // ------------------------------------------------------------------------ // std::map // ------------------------------------------------------------------------ %{ #include %} %fragment(""); %fragment(""); // exported class namespace std { template > class map { // add typemaps here public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef K key_type; typedef T mapped_type; typedef std::pair< const K, T > value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; map(); map(const map& other); unsigned int size() const; bool empty() const; void clear(); %extend { const T& get(const K& key) throw (std::out_of_range) { std::map< K, T, C >::iterator i = self->find(key); if (i != self->end()) return i->second; else throw std::out_of_range("key not found"); } void set(const K& key, const T& x) { (*self)[key] = x; } void del(const K& key) throw (std::out_of_range) { std::map< K, T, C >::iterator i = self->find(key); if (i != self->end()) self->erase(i); else throw std::out_of_range("key not found"); } bool has_key(const K& key) { std::map< K, T, C >::iterator i = self->find(key); return i != self->end(); } } }; // Legacy macros (deprecated) %define specialize_std_map_on_key(K,CHECK,CONVERT_FROM,CONVERT_TO) #warning "specialize_std_map_on_key ignored - macro is deprecated and no longer necessary" %enddef %define specialize_std_map_on_value(T,CHECK,CONVERT_FROM,CONVERT_TO) #warning "specialize_std_map_on_value ignored - macro is deprecated and no longer necessary" %enddef %define specialize_std_map_on_both(K,CHECK_K,CONVERT_K_FROM,CONVERT_K_TO, T,CHECK_T,CONVERT_T_FROM,CONVERT_T_TO) #warning "specialize_std_map_on_both ignored - macro is deprecated and no longer necessary" %enddef } swig-4.0.1/Lib/tcl/cstring.i0000644000175000017500000000004013527063513015455 0ustar williamwilliam%include swig-4.0.1/Lib/tcl/factory.i0000644000175000017500000000004013527063513015453 0ustar williamwilliam%include swig-4.0.1/Lib/pointer.i0000644000175000017500000000044613527063513014714 0ustar williamwilliam/* ----------------------------------------------------------------------------- * pointer.i * ----------------------------------------------------------------------------- */ %echo "pointer.i is deprecated. Use cpointer.i instead." %echo "See http://www.swig.org/Doc3.0/Library.html" swig-4.0.1/Lib/go/0000755000175000017500000000000013527063513013463 5ustar williamwilliamswig-4.0.1/Lib/go/std_deque.i0000644000175000017500000000003413527063513015607 0ustar williamwilliam%include swig-4.0.1/Lib/go/gostring.swg0000644000175000017500000000152313527063513016042 0ustar williamwilliam/* ------------------------------------------------------------ * gostring.swg * * Support for returning strings from C to Go. * ------------------------------------------------------------ */ // C/C++ code to convert a memory buffer into a Go string allocated in // C/C++ memory. %fragment("AllocateString", "runtime") %{ static _gostring_ Swig_AllocateString(const char *p, size_t l) { _gostring_ ret; ret.p = (char*)malloc(l); memcpy(ret.p, p, l); ret.n = l; return ret; } %} // Go code to convert a string allocated in C++ memory to one // allocated in Go memory. %fragment("CopyString", "go_runtime") %{ type swig_gostring struct { p uintptr; n int } func swigCopyString(s string) string { p := *(*swig_gostring)(unsafe.Pointer(&s)) r := string((*[0x7fffffff]byte)(unsafe.Pointer(p.p))[:p.n]) Swig_free(p.p) return r } %} swig-4.0.1/Lib/go/director.swg0000644000175000017500000000274713527063513016032 0ustar williamwilliam/* ----------------------------------------------------------------------------- * director.swg * * This file contains support for director classes so that Go proxy * methods can be called from C++. * ----------------------------------------------------------------------------- */ #include #include namespace Swig { class DirectorException : public std::exception { }; } /* Handle memory management for directors. */ namespace { struct GCItem { virtual ~GCItem() {} }; struct GCItem_var { GCItem_var(GCItem *item = 0) : _item(item) { } GCItem_var& operator=(GCItem *item) { GCItem *tmp = _item; _item = item; delete tmp; return *this; } ~GCItem_var() { delete _item; } GCItem* operator->() { return _item; } private: GCItem *_item; }; template struct GCItem_T : GCItem { GCItem_T(Type *ptr) : _ptr(ptr) { } virtual ~GCItem_T() { delete _ptr; } private: Type *_ptr; }; } class Swig_memory { public: template void swig_acquire_pointer(Type* vptr) { if (vptr) { swig_owner[vptr] = new GCItem_T(vptr); } } private: typedef std::map swig_ownership_map; swig_ownership_map swig_owner; }; template static void swig_acquire_pointer(Swig_memory** pmem, Type* ptr) { if (!pmem) { *pmem = new Swig_memory; } (*pmem)->swig_acquire_pointer(ptr); } swig-4.0.1/Lib/go/std_vector.i0000644000175000017500000000552513527063513016020 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_vector.i * ----------------------------------------------------------------------------- */ %{ #include #include %} namespace std { template class vector { public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef T value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; vector(); vector(size_type n); vector(const vector& other); size_type size() const; size_type capacity() const; void reserve(size_type n); %rename(isEmpty) empty; bool empty() const; void clear(); %rename(add) push_back; void push_back(const value_type& x); %extend { const_reference get(int i) throw (std::out_of_range) { int size = int(self->size()); if (i>=0 && isize()); if (i>=0 && i class vector { public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef bool value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef bool const_reference; vector(); vector(size_type n); vector(const vector& other); size_type size() const; size_type capacity() const; void reserve(size_type n); %rename(isEmpty) empty; bool empty() const; void clear(); %rename(add) push_back; void push_back(const value_type& x); %extend { bool get(int i) throw (std::out_of_range) { int size = int(self->size()); if (i>=0 && isize()); if (i>=0 && i /* Code insertion directives */ #define %go_import(...) %insert(go_imports) %{__VA_ARGS__%} /* Basic types */ %typemap(gotype) bool, const bool & "bool" %typemap(gotype) char, const char & "byte" %typemap(gotype) signed char, const signed char & "int8" %typemap(gotype) unsigned char, const unsigned char & "byte" %typemap(gotype) short, const short & "int16" %typemap(gotype) unsigned short, const unsigned short & "uint16" %typemap(gotype) int, const int & "int" %typemap(gotype) unsigned int, const unsigned int & "uint" %typemap(gotype) long, const long & "int64" %typemap(gotype) unsigned long, const unsigned long & "uint64" %typemap(gotype) long long, const long long & "int64" %typemap(gotype) unsigned long long, const unsigned long long & "uint64" %typemap(gotype) float, const float & "float32" %typemap(gotype) double, const double & "float64" %typemap(in) bool, char, signed char, unsigned char, short, unsigned short, int, unsigned int, long, unsigned long, long long, unsigned long long, float, double %{ $1 = ($1_ltype)$input; %} %typemap(in) const bool &, const char &, const signed char &, const unsigned char &, const short &, const unsigned short &, const int &, const unsigned int &, const long long &, const unsigned long long &, const float &, const double & %{ $1 = ($1_ltype)&$input; %} %typemap(in) const long & ($*1_ltype temp), const unsigned long & ($*1_ltype temp) %{ temp = ($*1_ltype)$input; $1 = ($1_ltype)&temp; %} %typemap(out) bool, char, signed char, unsigned char, short, unsigned short, int, unsigned int, long, unsigned long, long long, unsigned long long, float, double %{ $result = $1; %} %typemap(goout) bool, char, signed char, unsigned char, short, unsigned short, int, unsigned int, long, unsigned long, long long, unsigned long long, float, double "" %typemap(out) const bool &, const char &, const signed char &, const unsigned char &, const short &, const unsigned short &, const int &, const unsigned int &, const long &, const unsigned long &, const long long &, const unsigned long long &, const float &, const double & %{ $result = ($*1_ltype)*$1; %} %typemap(goout) const bool &, const char &, const signed char &, const unsigned char &, const short &, const unsigned short &, const int &, const unsigned int &, const long &, const unsigned long &, const long long &, const unsigned long long &, const float &, const double & "" %typemap(out) void "" %typemap(goout) void "" %typemap(directorin) bool, char, signed char, unsigned char, short, unsigned short, int, unsigned int, long, unsigned long, long long, unsigned long long, float, double %{ $input = ($1_ltype)$1; %} %typemap(godirectorin) bool, char, signed char, unsigned char, short, unsigned short, int, unsigned int, long, unsigned long, long long, unsigned long long, float, double "" %typemap(directorin) const bool &, const char &, const signed char &, const unsigned char &, const short &, const unsigned short &, const int &, const unsigned int &, const long &, const unsigned long &, const long long &, const unsigned long long &, const float &, const double & %{ $input = ($*1_ltype)$1; %} %typemap(godirectorin) const bool &, const char &, const signed char &, const unsigned char &, const short &, const unsigned short &, const int &, const unsigned int &, const long &, const unsigned long &, const long long &, const unsigned long long &, const float &, const double & "" %typemap(directorout) bool, char, signed char, unsigned char, short, unsigned short, int, unsigned int, long, unsigned long, long long, unsigned long long, float, double %{ $result = ($1_ltype)$input; %} %typemap(directorout,warning=SWIGWARN_TYPEMAP_DIRECTOROUT_PTR_MSG) const bool &, const char &, const signed char &, const unsigned char &, const short &, const unsigned short &, const int &, const unsigned int &, const long &, const unsigned long &, const long long &, const unsigned long long &, const float &, const double & %{ $result = new $*1_ltype($input); swig_acquire_pointer(&swig_mem, $result); %} /* The size_t type. */ %typemap(gotype) size_t, const size_t & %{int64%} %typemap(in) size_t %{ $1 = (size_t)$input; %} %typemap(in) const size_t & %{ $1 = ($1_ltype)&$input; %} %typemap(out) size_t %{ $result = $1; %} %typemap(goout) size_t "" %typemap(out) const size_t & %{ $result = ($*1_ltype)*$1; %} %typemap(goout) const size_t & "" %typemap(directorin) size_t %{ $input = (size_t)$1; %} %typemap(godirectorin) size_t "" %typemap(directorin) const size_t & %{ $input = ($*1_ltype)$1; %} %typemap(godirectorin) const size_t & "" %typemap(directorout) size_t %{ $result = ($1_ltype)$input; %} %typemap(directorout,warning=SWIGWARN_TYPEMAP_DIRECTOROUT_PTR_MSG) const size_t & %{ $result = new $*1_ltype($input); swig_acquire_pointer(&swig_mem, $result); %} /* Member pointers. */ %typemap(gotype) SWIGTYPE (CLASS::*) %{$gotypename%} %typemap(in) SWIGTYPE (CLASS::*) %{ $1 = *($&1_ltype)$input; %} %typemap(out) SWIGTYPE (CLASS::*) %{ struct swig_out_type { intgo size; void* val; } *swig_out; swig_out = (struct swig_out_type*)malloc(sizeof(*swig_out)); if (swig_out) { swig_out->size = sizeof($1_ltype); swig_out->val = malloc(swig_out->size); if (swig_out->val) { *($&1_ltype)(swig_out->val) = $1; } } $result = swig_out; %} %typemap(goout) SWIGTYPE (CLASS::*) %{ { type swig_out_type struct { size int; val uintptr } p := (*swig_out_type)(unsafe.Pointer($1)) if p == nil || p.val == 0 { $result = nil } else { m := make([]byte, p.size) a := (*[1024]byte)(unsafe.Pointer(p.val))[:p.size] copy(m, a) Swig_free(p.val) Swig_free(uintptr(unsafe.Pointer(p))) $result = &m[0] } } %} %typemap(directorin) SWIGTYPE (CLASS::*) %{ $input = *($&1_ltype)$1; %} %typemap(godirectorin) SWIGTYPE (CLASS::*) "" %typemap(directorout) SWIGTYPE (CLASS::*) %{ $result = new $1_ltype($input); swig_acquire_pointer(&swig_mem, $result); %} /* Pointers. */ /* We can't translate pointers using a typemap, so that is handled in the C++ code. */ %typemap(gotype) SWIGTYPE * %{$gotypename%} %typemap(in) SWIGTYPE * %{ $1 = *($&1_ltype)&$input; %} %typemap(out) SWIGTYPE * %{ *($&1_ltype)&$result = ($1_ltype)$1; %} %typemap(goout) SWIGTYPE * "" %typemap(directorin) SWIGTYPE * %{ *($&1_ltype)&$input = ($1_ltype)$1; %} %typemap(godirectorin) SWIGTYPE * "" %typemap(directorout) SWIGTYPE * %{ $result = *($&1_ltype)&$input; %} /* Pointer references. */ %typemap(gotype) SWIGTYPE *const& %{$gotypename%} %typemap(in) SWIGTYPE *const& ($*1_ltype temp = 0) %{ temp = *($1_ltype)&$input; $1 = ($1_ltype)&temp; %} %typemap(out) SWIGTYPE *const& %{ *($1_ltype)&$result = *$1; %} %typemap(goout) SWIGTYPE *const& "" /* References. */ /* Converting a C++ reference to Go has to be handled in the C++ code. */ %typemap(gotype) SWIGTYPE & %{$gotypename%} %typemap(in) SWIGTYPE & %{ $1 = *($&1_ltype)&$input; %} %typemap(out) SWIGTYPE & %{ *($&1_ltype)&$result = $1; %} %typemap(goout) SWIGTYPE & "" %typemap(directorin) SWIGTYPE & %{ $input = ($1_ltype)&$1; %} %typemap(godirectorin) SWIGTYPE & "" %typemap(directorout) SWIGTYPE & %{ *($&1_ltype)&$result = $input; %} %typemap(directorout, warning=SWIGWARN_TYPEMAP_DIRECTOROUT_PTR_MSG) SWIGTYPE *const& %{ static $*1_ltype swig_temp; swig_temp = *($1_ltype)&$input; $result = &swig_temp; %} %typemap(gotype) SWIGTYPE && %{$gotypename%} %typemap(in) SWIGTYPE && %{ $1 = *($&1_ltype)&$input; %} %typemap(out) SWIGTYPE && %{ *($&1_ltype)&$result = $1; %} %typemap(goout) SWIGTYPE && "" %typemap(directorin) SWIGTYPE && %{ $input = ($1_ltype)&$1_name; %} %typemap(godirectorin) SWIGTYPE && "" %typemap(directorout) SWIGTYPE && %{ *($&1_ltype)&$result = $input; %} /* C arrays turn into Go pointers. If we know the length we can use a slice. */ %typemap(gotype) SWIGTYPE [] %{$gotypename%} %typemap(in) SWIGTYPE [] %{ $1 = *($&1_ltype)&$input; %} %typemap(out) SWIGTYPE [] %{ *($&1_ltype)&$result = $1; %} %typemap(goout) SWIGTYPE [] "" %typemap(directorin) SWIGTYPE [] %{ $input = *($1_ltype)&$1; %} %typemap(godirectorin) SWIGTYPE [] "" %typemap(directorout) SWIGTYPE [] %{ *($&1_ltype)&$result = $input; %} /* Strings. */ %typemap(gotype) char *, char *&, char[ANY], char[] "string" /* Needed to avoid confusion with the way the go module handles references. */ %typemap(gotype) char&, unsigned char& "*byte" %typemap(gotype) signed char& "*int8" %typemap(in) char *, char[ANY], char[] %{ $1 = ($1_ltype)malloc($input.n + 1); memcpy($1, $input.p, $input.n); $1[$input.n] = '\0'; %} %typemap(in) char *& (char *temp) %{ temp = (char *)malloc($input.n + 1); memcpy(temp, $input.p, $input.n); temp[$input.n] = '\0'; $1 = ($1_ltype)&temp; %} %typemap(freearg) char *, char *&, char[ANY], char[] %{ free($1); %} %typemap(out,fragment="AllocateString") char *, char *&, char[ANY], char[] %{ $result = Swig_AllocateString((char*)$1, $1 ? strlen((char*)$1) : 0); %} %typemap(goout,fragment="CopyString") char *, char *&, char[ANY], char[] %{ $result = swigCopyString($1) %} %typemap(directorin,fragment="AllocateString") char *, char *&, char[ANY], char[] %{ $input = Swig_AllocateString((char*)$1, $1 ? strlen((char*)$1) : 0); %} %typemap(godirectorin,fragment="CopyString") char *, char *&, char[ANY], char[] %{ $result = swigCopyString($input) %} %typemap(godirectorout) char *, char *&, char[ANY], char[] %{ { p := Swig_malloc(len($input) + 1) s := (*[1<<30]byte)(unsafe.Pointer(p))[:len($input) + 1] copy(s, $input) s[len($input)] = 0 $result = *(*string)(unsafe.Pointer(&s)) } %} %typemap(directorout, warning=SWIGWARN_TYPEMAP_DIRECTOROUT_PTR_MSG) char *, char *&, char[ANY], char[] %{ $result = ($1_ltype)$input.p; %} /* String & length */ %typemap(gotype) (char *STRING, size_t LENGTH) "string" %typemap(in) (char *STRING, size_t LENGTH) %{ $1 = ($1_ltype)$input.p; $2 = ($2_ltype)$input.n; %} %typemap(out,fragment="AllocateString") (char *STRING, size_t LENGTH) %{ $result = Swig_AllocateString((char*)$1, (size_t)$2); %} %typemap(goout,fragment="CopyString") (char *STRING, size_t LENGTH) %{ $result = swigCopyString($1) %} %typemap(directorin,fragment="AllocateString") (char *STRING, size_t LENGTH) %{ $input = Swig_AllocateString((char*)$1, $2); %} %typemap(godirectorin,fragment="CopyString") (char *STRING, size_t LENGTH) %{ $result = swigCopyString($input) %} %typemap(directorout) (char *STRING, size_t LENGTH) %{ $1 = ($1_ltype)$input.p; $2 = ($2_ltype)$input.n; %} /* Enums. We can't do the right thing for enums in typemap(gotype) so we deliberately don't define them. The right thing would be to capitalize the name. This is instead done in go.cxx. */ %typemap(gotype) enum SWIGTYPE %{$gotypename%} %typemap(in) enum SWIGTYPE %{ $1 = ($1_ltype)$input; %} %typemap(out) enum SWIGTYPE %{ $result = (intgo)$1; %} %typemap(goout) enum SWIGTYPE "" %typemap(directorin) enum SWIGTYPE %{ $input = (intgo)$1; %} %typemap(godirectorin) enum SWIGTYPE "" %typemap(directorout) enum SWIGTYPE %{ $result = ($1_ltype)$input; %} %typemap(directorin) enum SWIGTYPE & (intgo e) %{ e = (intgo)$1; $input = ($1_ltype)&e; %} %typemap(godirectorin) enum SWIGTYPE & "" %typemap(directorout) enum SWIGTYPE & %{ $*1_ltype f = ($*1_ltype)*$input; $result = ($1_ltype)&f; %} /* Arbitrary type. This is a type passed by value in the C/C++ code. We convert it to a pointer for the Go code. Note that all basic types are explicitly handled above. */ %typemap(gotype) SWIGTYPE %{$gotypename%} %typemap(in) SWIGTYPE ($&1_type argp) %{ argp = ($&1_ltype)$input; if (argp == NULL) { _swig_gopanic("Attempt to dereference null $1_type"); } $1 = ($1_ltype)*argp; %} %typemap(out) SWIGTYPE #ifdef __cplusplus %{ *($&1_ltype*)&$result = new $1_ltype($1); %} #else { $&1_ltype $1ptr = ($&1_ltype)malloc(sizeof($1_ltype)); memmove($1ptr, &$1, sizeof($1_type)); *($&1_ltype*)&$result = $1ptr; } #endif %typemap(goout) SWIGTYPE "" %typemap(directorin) SWIGTYPE %{ $input = new $1_ltype((const $1_ltype &)$1); %} %typemap(godirectorin) SWIGTYPE "" %typemap(directorout) SWIGTYPE %{ $result = *($&1_ltype)$input; %} /* Exception handling */ %typemap(throws) char * %{ _swig_gopanic($1); %} %typemap(throws) SWIGTYPE, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE *, SWIGTYPE [], SWIGTYPE [ANY] %{ (void)$1; _swig_gopanic("C++ $1_type exception thrown"); %} /* Typecheck typemaps. The purpose of these is merely to issue a warning for overloaded C++ functions that cannot be overloaded in Go as more than one C++ type maps to a single Go type. */ %typecheck(SWIG_TYPECHECK_BOOL) /* Go bool */ bool, const bool & "" %typecheck(SWIG_TYPECHECK_CHAR) /* Go byte */ char, const char &, unsigned char, const unsigned char & "" %typecheck(SWIG_TYPECHECK_INT8) /* Go int8 */ signed char, const signed char & "" %typecheck(SWIG_TYPECHECK_INT16) /* Go int16 */ short, const short & "" %typecheck(SWIG_TYPECHECK_INT16) /* Go uint16 */ unsigned short, const unsigned short & "" %typecheck(SWIG_TYPECHECK_INT32) /* Go int */ int, const int & "" %typecheck(SWIG_TYPECHECK_INT32) /* Go uint */ unsigned int, const unsigned int & "" %typecheck(SWIG_TYPECHECK_INT64) /* Go int64 */ long, const long &, long long, const long long & "" %typecheck(SWIG_TYPECHECK_INT64) /* Go uint64 */ unsigned long, const unsigned long &, unsigned long long, const unsigned long long & "" %typecheck(SWIG_TYPECHECK_FLOAT) /* Go float32 */ float, const float & "" %typecheck(SWIG_TYPECHECK_DOUBLE) /* Go float64 */ double, const double & "" %typecheck(SWIG_TYPECHECK_STRING) /* Go string */ char *, char *&, char[ANY], char [], signed char *, signed char *&, signed char[ANY], signed char [], unsigned char *, unsigned char *&, unsigned char[ANY], unsigned char [] "" %typecheck(SWIG_TYPECHECK_POINTER) SWIGTYPE, SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE *const&, SWIGTYPE [], SWIGTYPE (CLASS::*) "" %apply SWIGTYPE * { SWIGTYPE *const } %apply SWIGTYPE (CLASS::*) { SWIGTYPE (CLASS::*const) } %apply SWIGTYPE & { SWIGTYPE (CLASS::*const&) } /* Go keywords. */ %include %include swig-4.0.1/Lib/go/std_common.i0000644000175000017500000000014513527063513015777 0ustar williamwilliam%include %apply size_t { std::size_t }; %apply const size_t& { const std::size_t& }; swig-4.0.1/Lib/go/std_except.i0000644000175000017500000000241113527063513015775 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_except.i * * Typemaps used by the STL wrappers that throw exceptions. * These typemaps are used when methods are declared with an STL exception specification, such as * size_t at() const throw (std::out_of_range); * ----------------------------------------------------------------------------- */ %{ #include #include %} namespace std { %ignore exception; struct exception {}; } %typemap(throws) std::bad_cast %{_swig_gopanic($1.what());%} %typemap(throws) std::bad_exception %{_swig_gopanic($1.what());%} %typemap(throws) std::domain_error %{_swig_gopanic($1.what());%} %typemap(throws) std::exception %{_swig_gopanic($1.what());%} %typemap(throws) std::invalid_argument %{_swig_gopanic($1.what());%} %typemap(throws) std::length_error %{_swig_gopanic($1.what());%} %typemap(throws) std::logic_error %{_swig_gopanic($1.what());%} %typemap(throws) std::out_of_range %{_swig_gopanic($1.what());%} %typemap(throws) std::overflow_error %{_swig_gopanic($1.what());%} %typemap(throws) std::range_error %{_swig_gopanic($1.what());%} %typemap(throws) std::runtime_error %{_swig_gopanic($1.what());%} %typemap(throws) std::underflow_error %{_swig_gopanic($1.what());%} swig-4.0.1/Lib/go/typemaps.i0000644000175000017500000002333513527063513015505 0ustar williamwilliam/* ----------------------------------------------------------------------------- * typemaps.i * * Pointer and reference handling typemap library * * These mappings provide support for input/output arguments and common * uses for C/C++ pointers and C++ references. * ----------------------------------------------------------------------------- */ /* INPUT typemaps -------------- These typemaps remap a C pointer or C++ reference to be an "INPUT" value which is passed by value instead of reference. The following typemaps can be applied to turn a pointer or reference into a simple input value. That is, instead of passing a pointer or reference to an object, you would use a real value instead. bool *INPUT, bool &INPUT signed char *INPUT, signed char &INPUT unsigned char *INPUT, unsigned char &INPUT short *INPUT, short &INPUT unsigned short *INPUT, unsigned short &INPUT int *INPUT, int &INPUT unsigned int *INPUT, unsigned int &INPUT long *INPUT, long &INPUT unsigned long *INPUT, unsigned long &INPUT long long *INPUT, long long &INPUT unsigned long long *INPUT, unsigned long long &INPUT float *INPUT, float &INPUT double *INPUT, double &INPUT To use these, suppose you had a C function like this : double fadd(double *a, double *b) { return *a+*b; } You could wrap it with SWIG as follows : %include double fadd(double *INPUT, double *INPUT); or you can use the %apply directive : %include %apply double *INPUT { double *a, double *b }; double fadd(double *a, double *b); In Go you could then use it like this: answer := modulename.Fadd(10.0, 20.0) There are no char *INPUT typemaps, however you can apply the signed char * typemaps instead: %include %apply signed char *INPUT {char *input}; void f(char *input); */ %define INPUT_TYPEMAP(TYPE, GOTYPE) %typemap(gotype) TYPE *INPUT, TYPE &INPUT "GOTYPE" %typemap(in) TYPE *INPUT, TYPE &INPUT %{ $1 = ($1_ltype)&$input; %} %typemap(out) TYPE *INPUT, TYPE &INPUT "" %typemap(goout) TYPE *INPUT, TYPE &INPUT "" %typemap(freearg) TYPE *INPUT, TYPE &INPUT "" %typemap(argout) TYPE *INPUT, TYPE &INPUT "" // %typemap(typecheck) TYPE *INPUT = TYPE; // %typemap(typecheck) TYPE &INPUT = TYPE; %enddef INPUT_TYPEMAP(bool, bool); INPUT_TYPEMAP(signed char, int8); INPUT_TYPEMAP(char, byte); INPUT_TYPEMAP(unsigned char, byte); INPUT_TYPEMAP(short, int16); INPUT_TYPEMAP(unsigned short, uint16); INPUT_TYPEMAP(int, int); INPUT_TYPEMAP(unsigned int, uint); INPUT_TYPEMAP(long, int64); INPUT_TYPEMAP(unsigned long, uint64); INPUT_TYPEMAP(long long, int64); INPUT_TYPEMAP(unsigned long long, uint64); INPUT_TYPEMAP(float, float32); INPUT_TYPEMAP(double, float64); #undef INPUT_TYPEMAP // OUTPUT typemaps. These typemaps are used for parameters that // are output only. An array replaces the c pointer or reference parameter. // The output value is returned in this array passed in. /* OUTPUT typemaps --------------- The following typemaps can be applied to turn a pointer or reference into an "output" value. When calling a function, no input value would be given for a parameter, but an output value would be returned. This works by a Go slice being passed as a parameter where a c pointer or reference is required. As with any Go function, the array is passed by reference so that any modifications to the array will be picked up in the calling function. Note that the array passed in MUST have at least one element, but as the c function does not require any input, the value can be set to anything. bool *OUTPUT, bool &OUTPUT signed char *OUTPUT, signed char &OUTPUT unsigned char *OUTPUT, unsigned char &OUTPUT short *OUTPUT, short &OUTPUT unsigned short *OUTPUT, unsigned short &OUTPUT int *OUTPUT, int &OUTPUT unsigned int *OUTPUT, unsigned int &OUTPUT long *OUTPUT, long &OUTPUT unsigned long *OUTPUT, unsigned long &OUTPUT long long *OUTPUT, long long &OUTPUT unsigned long long *OUTPUT, unsigned long long &OUTPUT float *OUTPUT, float &OUTPUT double *OUTPUT, double &OUTPUT For example, suppose you were trying to wrap the modf() function in the C math library which splits x into integral and fractional parts (and returns the integer part in one of its parameters): double modf(double x, double *ip); You could wrap it with SWIG as follows : %include double modf(double x, double *OUTPUT); or you can use the %apply directive : %include %apply double *OUTPUT { double *ip }; double modf(double x, double *ip); The Go output of the function would be the function return value and the value in the single element array. In Go you would use it like this: ptr := []float64{0.0} fraction := modulename.Modf(5.0,ptr) There are no char *OUTPUT typemaps, however you can apply the signed char * typemaps instead: %include %apply signed char *OUTPUT {char *output}; void f(char *output); */ %define OUTPUT_TYPEMAP(TYPE, GOTYPE) %typemap(gotype) TYPE *OUTPUT, TYPE &OUTPUT %{[]GOTYPE%} %typemap(in) TYPE *OUTPUT($*1_ltype temp), TYPE &OUTPUT($*1_ltype temp) { if ($input.len == 0) { _swig_gopanic("array must contain at least 1 element"); } $1 = &temp; } %typemap(out) TYPE *OUTPUT, TYPE &OUTPUT "" %typemap(goout) TYPE *INPUT, TYPE &INPUT "" %typemap(freearg) TYPE *OUTPUT, TYPE &OUTPUT "" %typemap(argout) TYPE *OUTPUT, TYPE &OUTPUT { TYPE* a = (TYPE *) $input.array; a[0] = temp$argnum; } %enddef OUTPUT_TYPEMAP(bool, bool); OUTPUT_TYPEMAP(signed char, int8); OUTPUT_TYPEMAP(char, byte); OUTPUT_TYPEMAP(unsigned char, byte); OUTPUT_TYPEMAP(short, int16); OUTPUT_TYPEMAP(unsigned short, uint16); OUTPUT_TYPEMAP(int, int); OUTPUT_TYPEMAP(unsigned int, uint); OUTPUT_TYPEMAP(long, int64); OUTPUT_TYPEMAP(unsigned long, uint64); OUTPUT_TYPEMAP(long long, int64); OUTPUT_TYPEMAP(unsigned long long, uint64); OUTPUT_TYPEMAP(float, float32); OUTPUT_TYPEMAP(double, float64); #undef OUTPUT_TYPEMAP /* INOUT typemaps -------------- Mappings for a parameter that is both an input and an output parameter The following typemaps can be applied to make a function parameter both an input and output value. This combines the behavior of both the "INPUT" and "OUTPUT" typemaps described earlier. Output values are returned as an element in a Go slice. bool *INOUT, bool &INOUT signed char *INOUT, signed char &INOUT unsigned char *INOUT, unsigned char &INOUT short *INOUT, short &INOUT unsigned short *INOUT, unsigned short &INOUT int *INOUT, int &INOUT unsigned int *INOUT, unsigned int &INOUT long *INOUT, long &INOUT unsigned long *INOUT, unsigned long &INOUT long long *INOUT, long long &INOUT unsigned long long *INOUT, unsigned long long &INOUT float *INOUT, float &INOUT double *INOUT, double &INOUT For example, suppose you were trying to wrap the following function : void neg(double *x) { *x = -(*x); } You could wrap it with SWIG as follows : %include void neg(double *INOUT); or you can use the %apply directive : %include %apply double *INOUT { double *x }; void neg(double *x); This works similarly to C in that the mapping directly modifies the input value - the input must be an array with a minimum of one element. The element in the array is the input and the output is the element in the array. x := []float64{5.0} Neg(x); The implementation of the OUTPUT and INOUT typemaps is different to other languages in that other languages will return the output value as part of the function return value. This difference is due to Go being a typed language. There are no char *INOUT typemaps, however you can apply the signed char * typemaps instead: %include %apply signed char *INOUT {char *inout}; void f(char *inout); */ %define INOUT_TYPEMAP(TYPE, GOTYPE) %typemap(gotype) TYPE *INOUT, TYPE &INOUT %{[]GOTYPE%} %typemap(in) TYPE *INOUT, TYPE &INOUT { if ($input.len == 0) { _swig_gopanic("array must contain at least 1 element"); } $1 = ($1_ltype) $input.array; } %typemap(out) TYPE *INOUT, TYPE &INOUT "" %typemap(goout) TYPE *INOUT, TYPE &INOUT "" %typemap(freearg) TYPE *INOUT, TYPE &INOUT "" %typemap(argout) TYPE *INOUT, TYPE &INOUT "" %enddef INOUT_TYPEMAP(bool, bool); INOUT_TYPEMAP(signed char, int8); INOUT_TYPEMAP(char, byte); INOUT_TYPEMAP(unsigned char, byte); INOUT_TYPEMAP(short, int16); INOUT_TYPEMAP(unsigned short, uint16); INOUT_TYPEMAP(int, int); INOUT_TYPEMAP(unsigned int, uint); INOUT_TYPEMAP(long, int64); INOUT_TYPEMAP(unsigned long, uint64); INOUT_TYPEMAP(long long, int64); INOUT_TYPEMAP(unsigned long long, uint64); INOUT_TYPEMAP(float, float32); INOUT_TYPEMAP(double, float64); #undef INOUT_TYPEMAP swig-4.0.1/Lib/go/std_pair.i0000644000175000017500000000140513527063513015442 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_pair.i * * SWIG typemaps for std::pair * ----------------------------------------------------------------------------- */ %include %include // ------------------------------------------------------------------------ // std::pair // ------------------------------------------------------------------------ %{ #include %} namespace std { template struct pair { typedef T first_type; typedef U second_type; pair(); pair(T first, U second); pair(const pair& other); template pair(const pair &other); T first; U second; }; // add specializations here } swig-4.0.1/Lib/go/stl.i0000644000175000017500000000044313527063513014440 0ustar williamwilliam/* ----------------------------------------------------------------------------- * stl.i * ----------------------------------------------------------------------------- */ %include %include %include %include %include swig-4.0.1/Lib/go/goruntime.swg0000644000175000017500000002114413527063513016220 0ustar williamwilliam/* ------------------------------------------------------------ * goruntime.swg * * Go runtime code for the various generated files. * ------------------------------------------------------------ */ %inline %{ static void Swig_free(void* p) { free(p); } static void* Swig_malloc(int c) { return malloc(c); } %} %insert(runtime) %{ #include #include #include #include #include %} #if SWIGGO_CGO %insert(cgo_comment_typedefs) %{ #include %} #endif #if SWIGGO_INTGO_SIZE == 32 %insert(runtime) %{ typedef int intgo; typedef unsigned int uintgo; %} #if SWIGGO_CGO %insert(cgo_comment_typedefs) %{ typedef int intgo; typedef unsigned int uintgo; %} #endif #elif SWIGGO_INTGO_SIZE == 64 %insert(runtime) %{ typedef long long intgo; typedef unsigned long long uintgo; %} #if SWIGGO_CGO %insert(cgo_comment_typedefs) %{ typedef long long intgo; typedef unsigned long long uintgo; %} #endif #else %insert(runtime) %{ typedef ptrdiff_t intgo; typedef size_t uintgo; %} #if SWIGGO_CGO %insert(cgo_comment_typedefs) %{ typedef ptrdiff_t intgo; typedef size_t uintgo; %} #endif #endif #ifndef SWIGGO_GCCGO // Set the host compiler struct attribute that will be // used to match gc's struct layout. For example, on 386 Windows, // gcc wants to 8-align int64s, but gc does not. // Use __gcc_struct__ to work around http://gcc.gnu.org/PR52991 on x86, // and https://golang.org/issue/5603. // See: https://github.com/golang/go/blob/fcbf04f9b93b4cd8addd05c2ed784118eb50a46c/src/cmd/cgo/out.go#L663 %insert(runtime) %{ # if !defined(__clang__) && (defined(__i386__) || defined(__x86_64__)) # define SWIGSTRUCTPACKED __attribute__((__packed__, __gcc_struct__)) # else # define SWIGSTRUCTPACKED __attribute__((__packed__)) # endif %} #else # define SWIGSTRUCTPACKED #endif %insert(runtime) %{ typedef struct { char *p; intgo n; } _gostring_; typedef struct { void* array; intgo len; intgo cap; } _goslice_; %} #ifdef SWIGGO_CGO %insert(cgo_comment_typedefs) %{ typedef struct { char *p; intgo n; } _gostring_; typedef struct { void* array; intgo len; intgo cap; } _goslice_; %} #endif #ifndef SWIGGO_GCCGO /* Boilerplate for C/C++ code when using 6g/8g. This code is compiled with gcc. */ %insert(runtime) %{ #define swiggo_size_assert_eq(x, y, name) typedef char name[(x-y)*(x-y)*-2+1]; #define swiggo_size_assert(t, n) swiggo_size_assert_eq(sizeof(t), n, swiggo_sizeof_##t##_is_not_##n) swiggo_size_assert(char, 1) swiggo_size_assert(short, 2) swiggo_size_assert(int, 4) typedef long long swiggo_long_long; swiggo_size_assert(swiggo_long_long, 8) swiggo_size_assert(float, 4) swiggo_size_assert(double, 8) #ifdef __cplusplus extern "C" { #endif extern void crosscall2(void (*fn)(void *, int), void *, int); extern char* _cgo_topofstack(void) __attribute__ ((weak)); extern void _cgo_allocate(void *, int); extern void _cgo_panic(void *, int); #ifdef __cplusplus } #endif static char *_swig_topofstack() { if (_cgo_topofstack) { return _cgo_topofstack(); } else { return 0; } } static void _swig_gopanic(const char *p) { struct { const char *p; } SWIGSTRUCTPACKED a; a.p = p; crosscall2(_cgo_panic, &a, (int) sizeof a); } %} #if !SWIGGO_CGO /* This is here for backward compatibility, but it will not work with Go 1.5 or later. Do not use it in new code. */ %insert(runtime) %{ static void *_swig_goallocate(size_t len) { struct { size_t len; void *ret; } SWIGSTRUCTPACKED a; a.len = len; crosscall2(_cgo_allocate, &a, (int) sizeof a); return a.ret; } %} #endif #if !SWIGGO_CGO /* Boilerplate for C code when using 6g/8g. This code is compiled with 6c/8c. */ %insert(gc_header) %{ #include "runtime.h" #include "cgocall.h" #pragma dataflag 16 static void *cgocall = runtime·cgocall; #pragma dataflag 16 void *·_cgo_runtime_cgocall = &cgocall; %} #endif #else /* Boilerplate for C/C++ code when using gccgo. */ %insert(runtime) %{ #define SWIGGO_GCCGO #ifdef __cplusplus extern "C" { #endif extern void *_cgo_allocate(size_t); extern void _cgo_panic(const char *); #ifdef __cplusplus } #endif #define _swig_goallocate _cgo_allocate #define _swig_gopanic _cgo_panic %} #if !SWIGGO_CGO %insert(runtime) %{ /* Implementations of SwigCgocall and friends for different versions of gccgo. The Go code will call these functions using C names with a prefix of the module name. The implementations here call the routine in libgo. The routines to call vary depending on the gccgo version. We assume that the version of gcc used to compile this file is the same as the version of gccgo. */ #ifdef __cplusplus extern "C" { #endif #define SWIG_GCC_VERSION \ (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) #if SWIG_GCC_VERSION < 40700 #define SwigDoCgocall() #define SwigDoCgocallDone() #define SwigDoCgocallBack() #define SwigDoCgocallBackDone() #elif SWIG_GCC_VERSION == 40700 void SwigDoCgocall(void) __asm__("libgo_syscall.syscall.Entersyscall"); void SwigDoCgocallDone(void) __asm__("libgo_syscall.syscall.Exitsyscall"); void SwigDoCgocallBack(void) __asm__("libgo_syscall.syscall.Exitsyscall"); void SwigDoCgocallBackDone(void) __asm__("libgo_syscall.syscall.Entersyscall"); #else void SwigDoCgocall(void) __asm__("syscall.Cgocall"); void SwigDoCgocallDone(void) __asm__("syscall.CgocallDone"); void SwigDoCgocallBack(void) __asm__("syscall.CgocallBack"); void SwigDoCgocallBackDone(void) __asm__("syscall.CgocallBackDone"); #endif #define SWIGSTRINGIFY2(s) #s #define SWIGSTRINGIFY(s) SWIGSTRINGIFY2(s) void SwigCgocall() __asm__(SWIGSTRINGIFY(SWIGGO_PREFIX) ".SwigCgocall"); void SwigCgocall() { SwigDoCgocall(); } void SwigCgocallDone() __asm__(SWIGSTRINGIFY(SWIGGO_PREFIX) ".SwigCgocallDone"); void SwigCgocallDone() { SwigDoCgocallDone(); } void SwigCgocallBack() __asm__(SWIGSTRINGIFY(SWIGGO_PREFIX) ".SwigCgocallBack"); void SwigCgocallBack() { SwigDoCgocallBack(); } void SwigCgocallBackDone() __asm__(SWIGSTRINGIFY(SWIGGO_PREFIX) ".SwigCgocallBackDone"); void SwigCgocallBackDone() { SwigDoCgocallBackDone(); } #undef SWIGSTRINGIFY #undef SWIGSTRINGIFY2 #ifdef __cplusplus } #endif %} #endif #endif #if !SWIGGO_CGO %insert(runtime) %{ /* This is here for backward compatibility, but it will not work with Go 1.5 or later. Do not use it in new code. */ static _gostring_ _swig_makegostring(const char *p, size_t l) { _gostring_ ret; ret.p = (char*)_swig_goallocate(l + 1); memcpy(ret.p, p, l); ret.n = l; return ret; } %} #endif %insert(runtime) %{ #define SWIG_contract_assert(expr, msg) \ if (!(expr)) { _swig_gopanic(msg); } else %} #ifndef SWIGGO_GCCGO %go_import("unsafe", _ "runtime/cgo") #if !SWIGGO_CGO %insert(go_header) %{ var _cgo_runtime_cgocall func(unsafe.Pointer, uintptr) %} #endif #else %go_import("syscall", "unsafe") %insert(go_header) %{ type _ syscall.Sockaddr %} #endif %insert(go_header) %{ type _ unsafe.Pointer %} /* Swig_always_false is used to conditionally assign parameters to Swig_escape_val so that the compiler thinks that they escape. We only assign them if Swig_always_false is true, which it never is. We export the variable so that the compiler doesn't realize that it is never set. */ %insert(go_header) %{ var Swig_escape_always_false bool var Swig_escape_val interface{} %} /* Function pointers are translated by the code in go.cxx into _swig_fnptr. Member pointers are translated to _swig_memberptr. */ %insert(go_header) %{ type _swig_fnptr *byte type _swig_memberptr *byte %} /* For directors we need C++ to track a Go pointer. Since we can't pass a Go pointer into C++, we use a map to track the pointers on the Go side. */ %go_import("sync") %insert(go_header) %{ type _ sync.Mutex %} %insert(go_director) %{ var swigDirectorTrack struct { sync.Mutex m map[int]interface{} c int } func swigDirectorAdd(v interface{}) int { swigDirectorTrack.Lock() defer swigDirectorTrack.Unlock() if swigDirectorTrack.m == nil { swigDirectorTrack.m = make(map[int]interface{}) } swigDirectorTrack.c++ ret := swigDirectorTrack.c swigDirectorTrack.m[ret] = v return ret } func swigDirectorLookup(c int) interface{} { swigDirectorTrack.Lock() defer swigDirectorTrack.Unlock() ret := swigDirectorTrack.m[c] if ret == nil { panic("C++ director pointer not found (possible use-after-free)") } return ret } func swigDirectorDelete(c int) { swigDirectorTrack.Lock() defer swigDirectorTrack.Unlock() if swigDirectorTrack.m[c] == nil { if c > swigDirectorTrack.c { panic("C++ director pointer invalid (possible memory corruption") } else { panic("C++ director pointer not found (possible use-after-free)") } } delete(swigDirectorTrack.m, c) } %} swig-4.0.1/Lib/go/exception.i0000644000175000017500000000025513527063513015635 0ustar williamwilliam%typemap(throws,noblock=1) (...) { SWIG_exception(SWIG_RuntimeError,"unknown exception"); } %insert("runtime") %{ #define SWIG_exception(code, msg) _swig_gopanic(msg) %} swig-4.0.1/Lib/go/std_list.i0000644000175000017500000000164013527063513015463 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_list.i * ----------------------------------------------------------------------------- */ %{ #include #include %} namespace std { template class list { public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef T value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; list(); list(const list& other); size_type size() const; bool empty() const; %rename(isEmpty) empty; void clear(); void push_front(const value_type& x); void pop_front(); void push_back(const value_type& x); void pop_back(); void remove(value_type x); void reverse(); void unique(); void sort(); void merge(list& x); }; } swig-4.0.1/Lib/go/cdata.i0000644000175000017500000000444013527063513014713 0ustar williamwilliam/* ----------------------------------------------------------------------------- * cdata.i * * SWIG library file containing macros for manipulating raw C data as strings. * ----------------------------------------------------------------------------- */ %{ typedef struct SWIGCDATA { char *data; intgo len; } SWIGCDATA; %} %fragment("cdata", "header") %{ struct swigcdata { intgo size; void *data; }; %} %typemap(gotype) SWIGCDATA "[]byte" %typemap(imtype) SWIGCDATA "uint64" %typemap(out, fragment="cdata") SWIGCDATA(struct swigcdata *swig_out) %{ swig_out = (struct swigcdata *)malloc(sizeof(*swig_out)); if (swig_out) { swig_out->size = $1.len; swig_out->data = malloc(swig_out->size); if (swig_out->data) { memcpy(swig_out->data, $1.data, swig_out->size); } } $result = *(long long *)(void **)&swig_out; %} %typemap(goout) SWIGCDATA %{ { type swigcdata struct { size int; data uintptr } p := (*swigcdata)(unsafe.Pointer(uintptr($1))) if p == nil || p.data == 0 { $result = nil } else { b := make([]byte, p.size) a := (*[0x7fffffff]byte)(unsafe.Pointer(p.data))[:p.size] copy(b, a) Swig_free(p.data) Swig_free(uintptr(unsafe.Pointer(p))) $result = b } } %} /* ----------------------------------------------------------------------------- * %cdata(TYPE [, NAME]) * * Convert raw C data to a binary string. * ----------------------------------------------------------------------------- */ %define %cdata(TYPE,NAME...) %insert("header") { #if #NAME == "" static SWIGCDATA cdata_##TYPE(TYPE *ptr, int nelements) { #else static SWIGCDATA cdata_##NAME(TYPE *ptr, int nelements) { #endif SWIGCDATA d; d.data = (char *) ptr; #if #TYPE != "void" d.len = nelements*sizeof(TYPE); #else d.len = nelements; #endif return d; } } %typemap(default) int nelements "$1 = 1;" #if #NAME == "" SWIGCDATA cdata_##TYPE(TYPE *ptr, int nelements); #else SWIGCDATA cdata_##NAME(TYPE *ptr, int nelements); #endif %enddef %typemap(default) int nelements; %rename(cdata) ::cdata_void(void *ptr, int nelements); %cdata(void); /* Memory move function. Due to multi-argument typemaps this appears to be wrapped as void memmove(void *data, const char *s); */ void memmove(void *data, char *indata, int inlen); swig-4.0.1/Lib/go/std_string.i0000644000175000017500000000433413527063513016021 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_string.i * * Typemaps for std::string and const std::string& * These are mapped to a Go string and are passed around by value. * * To use non-const std::string references use the following %apply. Note * that they are passed by value. * %apply const std::string & {std::string &}; * ----------------------------------------------------------------------------- */ %{ #include %} namespace std { %naturalvar string; class string; %typemap(gotype) string, const string & "string" %typemap(in) string %{ $1.assign($input.p, $input.n); %} %typemap(godirectorout) string %{ { p := Swig_malloc(len($input)) s := (*[1<<30]byte)(unsafe.Pointer(p))[:len($input)] copy(s, $input) $result = *(*string)(unsafe.Pointer(&s)) } %} %typemap(directorout) string %{ $result.assign($input.p, $input.n); free($input.p); %} %typemap(out,fragment="AllocateString") string %{ $result = Swig_AllocateString($1.data(), $1.length()); %} %typemap(goout,fragment="CopyString") string %{ $result = swigCopyString($1) %} %typemap(directorin,fragment="AllocateString") string %{ $input = Swig_AllocateString($1.data(), $1.length()); %} %typemap(godirectorin,fragment="CopyString") string %{ $result = swigCopyString($input) %} %typemap(in) const string & %{ $*1_ltype $1_str($input.p, $input.n); $1 = &$1_str; %} %typemap(godirectorout) const string & %{ { p := Swig_malloc(len($input)) s := (*[1<<30]byte)(unsafe.Pointer(p))[:len($input)] copy(s, $input) $result = *(*string)(unsafe.Pointer(&s)) } %} %typemap(directorout,warning=SWIGWARN_TYPEMAP_THREAD_UNSAFE_MSG) const string & %{ static $*1_ltype $1_str; $1_str.assign($input.p, $input.n); free($input.p); $result = &$1_str; %} %typemap(out,fragment="AllocateString") const string & %{ $result = Swig_AllocateString((*$1).data(), (*$1).length()); %} %typemap(goout,fragment="CopyString") const string & %{ $result = swigCopyString($1) %} %typemap(directorin,fragment="AllocateString") const string & %{ $input = Swig_AllocateString($1.data(), $1.length()); %} %typemap(godirectorin,fragment="CopyString") const string & %{ $result = swigCopyString($input) %} } swig-4.0.1/Lib/go/std_map.i0000644000175000017500000000374713527063513015277 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_map.i * * SWIG typemaps for std::map * ----------------------------------------------------------------------------- */ %include // ------------------------------------------------------------------------ // std::map // ------------------------------------------------------------------------ %{ #include #include #include %} // exported class namespace std { template > class map { // add typemaps here public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef K key_type; typedef T mapped_type; typedef std::pair< const K, T > value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; map(); map(const map& other); unsigned int size() const; bool empty() const; void clear(); %extend { const T& get(const K& key) throw (std::out_of_range) { std::map< K, T, C >::iterator i = self->find(key); if (i != self->end()) return i->second; else throw std::out_of_range("key not found"); } void set(const K& key, const T& x) { (*self)[key] = x; } void del(const K& key) throw (std::out_of_range) { std::map< K, T, C >::iterator i = self->find(key); if (i != self->end()) self->erase(i); else throw std::out_of_range("key not found"); } bool has_key(const K& key) { std::map< K, T, C >::iterator i = self->find(key); return i != self->end(); } } }; } swig-4.0.1/Lib/typemaps/0000755000175000017500000000000013527063513014720 5ustar williamwilliamswig-4.0.1/Lib/typemaps/swigtypemaps.swg0000644000175000017500000001157413527063513020206 0ustar williamwilliam/* ----------------------------------------------------------------------------- * swigtypemaps.swg * * Unified Typemap Library frontend * ----------------------------------------------------------------------------- */ /* This file provides the frontend to the Unified Typemap Library. When using this library in a SWIG target language, you need to define a minimum set of fragments, specialize a couple of macros, and then include this file. Typically you will create a 'mytypemaps.swg' file in each target language, where you will have the following sections: === mytypemaps.swg === // Fragment section %include // Unified typemap section %include // Local typemap section === mytypemaps.swg === While we add more docs, please take a look at the following cases to see how you specialized the unified typemap library for a new target language: Lib/python/pytypemaps.swg Lib/tcl/tcltypemaps.swg Lib/ruby/rubytypemaps.swg Lib/perl5/perltypemaps.swg */ #define SWIGUTL SWIGUTL /* ----------------------------------------------------------------------------- * Language specialization section. * * Tune these macros for each language as needed. * ----------------------------------------------------------------------------- */ /* The SWIG target language object must be provided. For example in python you define: #define SWIG_Object PyObject * */ #if !defined(SWIG_Object) #error "SWIG_Object must be defined as the SWIG target language object" #endif /*==== flags for new/convert methods ====*/ #ifndef %convertptr_flags %define %convertptr_flags 0 %enddef #endif #ifndef %newpointer_flags %define %newpointer_flags 0 %enddef #endif #ifndef %newinstance_flags %define %newinstance_flags 0 %enddef #endif /*==== set output ====*/ #ifndef %set_output /* simple set output operation */ #define %set_output(obj) $result = obj #endif /*==== set variable output ====*/ #ifndef %set_varoutput /* simple set varoutput operation */ #define %set_varoutput(obj) $result = obj #endif /*==== append output ====*/ #ifndef %append_output #if defined(SWIG_AppendOutput) /* simple append operation */ #define %append_output(obj) $result = SWIG_AppendOutput($result,obj) #else #error "Language must define SWIG_AppendOutput or %append_output" #endif #endif /*==== set constant ====*/ #ifndef %set_constant #if defined(SWIG_SetConstant) /* simple set constant operation */ #define %set_constant(name,value) SWIG_SetConstant(name,value) #else #error "Language must define SWIG_SetConstant or %set_constant" #endif #endif /*==== raise an exception ====*/ #ifndef %raise #if defined(SWIG_Raise) /* simple raise operation */ #define %raise(obj, type, desc) SWIG_Raise(obj, type, desc); SWIG_fail #else #error "Language must define SWIG_Raise or %raise" #endif #endif /*==== director output exception ====*/ #if defined(SWIG_DIRECTOR_TYPEMAPS) #ifndef SWIG_DirOutFail #define SWIG_DirOutFail(code, msg) Swig::DirectorTypeMismatchException::raise(SWIG_ErrorType(code), msg) #endif #endif /* ----------------------------------------------------------------------------- * Language independent definitions * ----------------------------------------------------------------------------- */ #define %error_block(Block...) %block(Block) #define %default_code(code) SWIG_ArgError(code) #define %argument_fail(code, type, name, argn) SWIG_exception_fail(%default_code(code), %argfail_fmt(type, name, argn)) #define %argument_nullref(type, name, argn) SWIG_exception_fail(SWIG_ValueError, %argnullref_fmt(type, name, argn)) #define %variable_fail(code, type, name) SWIG_exception_fail(%default_code(code), %varfail_fmt(type, name)) #define %variable_nullref(type, name) SWIG_exception_fail(SWIG_ValueError, %varnullref_fmt(type, name)) #if defined(SWIG_DIRECTOR_TYPEMAPS) #define %dirout_fail(code, type) SWIG_DirOutFail(%default_code(code), %outfail_fmt(type)) #define %dirout_nullref(type) SWIG_DirOutFail(SWIG_ValueError, %outnullref_fmt(type)) #endif /* ----------------------------------------------------------------------------- * All the typemaps * ----------------------------------------------------------------------------- */ %include %include %include %include %include %include %include %include %include %include %include %include swig-4.0.1/Lib/typemaps/cstring.swg0000644000175000017500000000024713527063513017116 0ustar williamwilliam%include %typemaps_cstring(%cstring, char, SWIG_AsCharPtr, SWIG_AsCharPtrAndSize, SWIG_FromCharPtr, SWIG_FromCharPtrAndSize); swig-4.0.1/Lib/typemaps/primtypes.swg0000644000175000017500000002377013527063513017507 0ustar williamwilliam/* ------------------------------------------------------------ * Primitive type fragments and macros * ------------------------------------------------------------ */ /* This file provide fragments and macros for the C/C++ primitive types. The file defines default fragments for the following types: bool signed char unsigned char signed wchar_t // in C++ unsigned wchar_t // in C++ short unsigned short int unsigned int float size_t ptrdiff_t which can always be redefined in the swig target language if needed. The fragments for the following types, however, always need to be defined in the target language: long unsigned long long long unsigned long long double If they are not provided, an #error directive will appear in the wrapped code. -------------------------------------------------------------------- This file provides the macro %typemaps_primitive(CheckCode, Type) which generates the typemaps for a primitive type with a given checkcode. It is assumed that the primitive type is 'normalized' and the corresponding SWIG_AsVal(Type) and SWIG_From(Type) methods are provided via fragments. The following auxiliary macros (explained with bash pseudo code) are also defined: %apply_ctypes(Macro) for i in C Type do Macro($i) done %apply_cpptypes(Macro) for i in C++ Type do Macro($i) done %apply_ctypes_2(Macro2) for i in C Type do for j in C Type do Macro_2($i, $j) done done %apply_cpptypes_2(Macro2) for i in C++ Type do for j in C++ Type do Macro_2($i, $j) done done %apply_checkctypes(Macro2) for i in Check Type do Macro2(%checkcode($i), $i) done */ /* ------------------------------------------------------------ * Primitive type fragments * ------------------------------------------------------------ */ /* boolean */ %fragment(SWIG_From_frag(bool),"header",fragment=SWIG_From_frag(long)) { SWIGINTERN SWIG_Object SWIG_From_dec(bool)(bool value) { return SWIG_From(long)(value ? 1 : 0); } } %fragment(SWIG_AsVal_frag(bool),"header",fragment=SWIG_AsVal_frag(long)) { SWIGINTERN int SWIG_AsVal_dec(bool)(SWIG_Object obj, bool *val) { long v; int res = SWIG_AsVal(long)(obj, val ? &v : 0); if (SWIG_IsOK(res)) { if (val) *val = v ? true : false; return res; } return SWIG_TypeError; } } /* signed/unsigned char */ %numeric_slong(signed char, "", SCHAR_MIN, SCHAR_MAX) %numeric_ulong(unsigned char, "", UCHAR_MAX) /* short/unsigned short */ %numeric_slong(short, "", SHRT_MIN, SHRT_MAX) %numeric_ulong(unsigned short, "", USHRT_MAX) /* int/unsigned int */ %numeric_slong(int, "", INT_MIN, INT_MAX) %numeric_ulong(unsigned int, "", UINT_MAX) /* signed/unsigned wchar_t */ #ifdef __cplusplus %numeric_slong(signed wchar_t, "", WCHAR_MIN, WCHAR_MAX) %numeric_ulong(unsigned wchar_t, "", UWCHAR_MAX) #endif /* float */ %numeric_float(float, "SWIG_Float_Overflow_Check", SWIG_Float_Overflow_Check(v)) /* long/unsigned long */ %ensure_type_fragments(long) %ensure_type_fragments(unsigned long) /* long long/unsigned long long */ %fragment("SWIG_LongLongAvailable","header", fragment="") %{ #if defined(LLONG_MAX) && !defined(SWIG_LONG_LONG_AVAILABLE) # define SWIG_LONG_LONG_AVAILABLE #endif %} %ensure_type_fragments(long long) %ensure_type_fragments(unsigned long long) /* double */ %ensure_type_fragments(double) /* size_t */ %fragment(SWIG_From_frag(size_t),"header",fragment=SWIG_From_frag(unsigned long),fragment=SWIG_From_frag(unsigned long long)) { SWIGINTERNINLINE SWIG_Object SWIG_From_dec(size_t)(size_t value) { %#ifdef SWIG_LONG_LONG_AVAILABLE if (sizeof(size_t) <= sizeof(unsigned long)) { %#endif return SWIG_From(unsigned long)(%numeric_cast(value, unsigned long)); %#ifdef SWIG_LONG_LONG_AVAILABLE } else { /* assume sizeof(size_t) <= sizeof(unsigned long long) */ return SWIG_From(unsigned long long)(%numeric_cast(value, unsigned long long)); } %#endif } } %fragment(SWIG_AsVal_frag(size_t),"header",fragment=SWIG_AsVal_frag(unsigned long),fragment=SWIG_AsVal_frag(unsigned long long)) { SWIGINTERNINLINE int SWIG_AsVal_dec(size_t)(SWIG_Object obj, size_t *val) { int res = SWIG_TypeError; %#ifdef SWIG_LONG_LONG_AVAILABLE if (sizeof(size_t) <= sizeof(unsigned long)) { %#endif unsigned long v; res = SWIG_AsVal(unsigned long)(obj, val ? &v : 0); if (SWIG_IsOK(res) && val) *val = %numeric_cast(v, size_t); %#ifdef SWIG_LONG_LONG_AVAILABLE } else if (sizeof(size_t) <= sizeof(unsigned long long)) { unsigned long long v; res = SWIG_AsVal(unsigned long long)(obj, val ? &v : 0); if (SWIG_IsOK(res) && val) *val = %numeric_cast(v, size_t); } %#endif return res; } } /* ptrdiff_t */ %fragment(SWIG_From_frag(ptrdiff_t),"header",fragment=SWIG_From_frag(long),fragment=SWIG_From_frag(long long)) { SWIGINTERNINLINE SWIG_Object SWIG_From_dec(ptrdiff_t)(ptrdiff_t value) { %#ifdef SWIG_LONG_LONG_AVAILABLE if (sizeof(ptrdiff_t) <= sizeof(long)) { %#endif return SWIG_From(long)(%numeric_cast(value, long)); %#ifdef SWIG_LONG_LONG_AVAILABLE } else { /* assume sizeof(ptrdiff_t) <= sizeof(long long) */ return SWIG_From(long long)(%numeric_cast(value, long long)); } %#endif } } %fragment(SWIG_AsVal_frag(ptrdiff_t),"header",fragment=SWIG_AsVal_frag(long),fragment=SWIG_AsVal_frag(long long)) { SWIGINTERNINLINE int SWIG_AsVal_dec(ptrdiff_t)(SWIG_Object obj, ptrdiff_t *val) { int res = SWIG_TypeError; %#ifdef SWIG_LONG_LONG_AVAILABLE if (sizeof(ptrdiff_t) <= sizeof(long)) { %#endif long v; res = SWIG_AsVal(long)(obj, val ? &v : 0); if (SWIG_IsOK(res) && val) *val = %numeric_cast(v, ptrdiff_t); %#ifdef SWIG_LONG_LONG_AVAILABLE } else if (sizeof(ptrdiff_t) <= sizeof(long long)) { long long v; res = SWIG_AsVal(long long)(obj, val ? &v : 0); if (SWIG_IsOK(res) && val) *val = %numeric_cast(v, ptrdiff_t); } %#endif return res; } } %fragment("SWIG_CanCastAsInteger","header", fragment=SWIG_AsVal_frag(double), fragment="", fragment="") { SWIGINTERNINLINE int SWIG_CanCastAsInteger(double *d, double min, double max) { double x = *d; if ((min <= x && x <= max)) { double fx = floor(x); double cx = ceil(x); double rd = ((x - fx) < 0.5) ? fx : cx; /* simple rint */ if ((errno == EDOM) || (errno == ERANGE)) { errno = 0; } else { double summ, reps, diff; if (rd < x) { diff = x - rd; } else if (rd > x) { diff = rd - x; } else { return 1; } summ = rd + x; reps = diff/summ; if (reps < 8*DBL_EPSILON) { *d = rd; return 1; } } } return 0; } } /* ------------------------------------------------------------ * Generate the typemaps for primitive type * ------------------------------------------------------------ */ #define %typemaps_primitive(Code, Type) %typemaps_asvalfromn(%arg(Code), Type) /* ------------------------------------------------------------ * Primitive Type Macros * ------------------------------------------------------------ */ /* useful macros to derive typemap declarations from primitive types */ %define _apply_macro(macro, arg2, arg1...) #if #arg1 != "" macro(%arg(arg1),arg2); #else macro(arg2); #endif %enddef /* Apply macro to the C-types */ %define %apply_ctypes(Macro, Arg2...) _apply_macro(Macro, bool , Arg2); _apply_macro(Macro, signed char , Arg2); _apply_macro(Macro, unsigned char , Arg2); _apply_macro(Macro, short , Arg2); _apply_macro(Macro, unsigned short , Arg2); _apply_macro(Macro, int , Arg2); _apply_macro(Macro, unsigned int , Arg2); _apply_macro(Macro, long , Arg2); _apply_macro(Macro, unsigned long , Arg2); _apply_macro(Macro, long long , Arg2); _apply_macro(Macro, unsigned long long , Arg2); _apply_macro(Macro, float , Arg2); _apply_macro(Macro, double , Arg2); _apply_macro(Macro, char , Arg2); _apply_macro(Macro, wchar_t , Arg2); _apply_macro(Macro, size_t , Arg2); _apply_macro(Macro, ptrdiff_t , Arg2); %enddef /* apply the Macro2(Type1, Type2) to all C types */ #define %apply_ctypes_2(Macro2) %apply_ctypes(%apply_ctypes, Macro2) /* apply the Macro(Type) to all C++ types */ %define %apply_cpptypes(Macro, Arg2...) %apply_ctypes(Macro, Arg2) _apply_macro(Macro, std::size_t, Arg2); _apply_macro(Macro, std::ptrdiff_t, Arg2); _apply_macro(Macro, std::string, Arg2); _apply_macro(Macro, std::wstring, Arg2); _apply_macro(Macro, std::complex, Arg2); _apply_macro(Macro, std::complex, Arg2); %enddef /* apply the Macro2(Type1, Type2) to all C++ types */ #define %apply_cpptypes_2(Macro2) %apply_cpptypes(%apply_cpptypes, Macro2) /* apply the Macro2(CheckCode,Type) to all Checked Types */ %define %apply_checkctypes(Macro2) Macro2(%checkcode(BOOL), bool); Macro2(%checkcode(INT8), signed char); Macro2(%checkcode(UINT8), unsigned char); Macro2(%checkcode(INT16), short); Macro2(%checkcode(UINT16), unsigned short); Macro2(%checkcode(INT32), int); Macro2(%checkcode(UINT32), unsigned int); Macro2(%checkcode(INT64), long); Macro2(%checkcode(UINT64), unsigned long); Macro2(%checkcode(INT128), long long); Macro2(%checkcode(UINT128), unsigned long long); Macro2(%checkcode(FLOAT), float); Macro2(%checkcode(DOUBLE), double); Macro2(%checkcode(CHAR), char); Macro2(%checkcode(UNICHAR), wchar_t); Macro2(%checkcode(SIZE), size_t); Macro2(%checkcode(PTRDIFF), ptrdiff_t); %enddef /* ------------------------------------------------------------ * Generate the typemaps for all the primitive types with checkcode * ------------------------------------------------------------ */ %apply_checkctypes(%typemaps_primitive); swig-4.0.1/Lib/typemaps/carrays.swg0000644000175000017500000000517613527063513017117 0ustar williamwilliam/* ----------------------------------------------------------------------------- * carrays.swg * * This library file contains macros that can be used to manipulate simple * pointers as arrays. * ----------------------------------------------------------------------------- */ /* ----------------------------------------------------------------------------- * %array_functions(TYPE,NAME) * * Generates functions for creating and accessing elements of a C array * (as pointers). Creates the following functions: * * TYPE *new_NAME(int nelements) * void delete_NAME(TYPE *); * TYPE NAME_getitem(TYPE *, int index); * void NAME_setitem(TYPE *, int index, TYPE value); * * ----------------------------------------------------------------------------- */ %define %array_functions(TYPE,NAME) %{ static TYPE *new_##NAME(size_t nelements) { return %new_array(nelements, TYPE); } static void delete_##NAME(TYPE *ary) { %delete_array(ary); } static TYPE NAME##_getitem(TYPE *ary, size_t index) { return ary[index]; } static void NAME##_setitem(TYPE *ary, size_t index, TYPE value) { ary[index] = value; } %} TYPE *new_##NAME(size_t nelements); void delete_##NAME(TYPE *ary); TYPE NAME##_getitem(TYPE *ary, size_t index); void NAME##_setitem(TYPE *ary, size_t index, TYPE value); %enddef /* ----------------------------------------------------------------------------- * %array_class(TYPE,NAME) * * Generates a class wrapper around a C array. The class has the following * interface: * * struct NAME { * NAME(int nelements); * ~NAME(); * TYPE getitem(int index); * void setitem(int index, TYPE value); * TYPE * cast(); * static NAME *frompointer(TYPE *t); * } * * Use * * %array_class_wrap(TYPE,NAME,GET,SET) * * if you want different names for the get/set methods. * ----------------------------------------------------------------------------- */ %define %array_class_wrap(TYPE,NAME,getitem,setitem) %{ typedef TYPE NAME; %} typedef struct { } NAME; %extend NAME { NAME(size_t nelements) { return %new_array(nelements, TYPE); } ~NAME() { %delete_array(self); } TYPE getitem(size_t index) { return self[index]; } void setitem(size_t index, TYPE value) { self[index] = value; } TYPE * cast() { return self; } static NAME *frompointer(TYPE *t) { return %static_cast(t, NAME *); } }; %types(NAME = TYPE); %enddef #ifndef %array_class %define %array_class(TYPE,NAME) %array_class_wrap(TYPE,NAME,getitem,setitem) %enddef #endif swig-4.0.1/Lib/typemaps/std_strings.swg0000644000175000017500000000366513527063513020017 0ustar williamwilliam /* defining the String asptr/from methods */ %define %std_string_asptr(String, Char, SWIG_AsCharPtrAndSize, Frag) %fragment(SWIG_AsPtr_frag(String),"header",fragment=Frag) { SWIGINTERN int SWIG_AsPtr_dec(String)(SWIG_Object obj, String **val) { Char* buf = 0 ; size_t size = 0; int alloc = SWIG_OLDOBJ; if (SWIG_IsOK((SWIG_AsCharPtrAndSize(obj, &buf, &size, &alloc)))) { if (buf) { if (val) *val = new String(buf, size - 1); if (alloc == SWIG_NEWOBJ) %delete_array(buf); return SWIG_NEWOBJ; } else { if (val) *val = 0; return SWIG_OLDOBJ; } } else { static int init = 0; static swig_type_info* descriptor = 0; if (!init) { descriptor = SWIG_TypeQuery(#String " *"); init = 1; } if (descriptor) { String *vptr; int res = SWIG_ConvertPtr(obj, (void**)&vptr, descriptor, 0); if (SWIG_IsOK(res) && val) *val = vptr; return res; } } return SWIG_ERROR; } } %enddef %define %std_string_from(String, SWIG_FromCharPtrAndSize, Frag) %fragment(SWIG_From_frag(String),"header",fragment=Frag) { SWIGINTERNINLINE SWIG_Object SWIG_From_dec(String)(const String& s) { return SWIG_FromCharPtrAndSize(s.data(), s.size()); } } %enddef %define %std_string_asval(String) %fragment(SWIG_AsVal_frag(String),"header", fragment=SWIG_AsPtr_frag(String)) { SWIGINTERN int SWIG_AsVal_dec(String)(SWIG_Object obj, String *val) { String* v = (String *) 0; int res = SWIG_AsPtr(String)(obj, &v); if (!SWIG_IsOK(res)) return res; if (v) { if (val) *val = *v; if (SWIG_IsNewObj(res)) { %delete(v); res = SWIG_DelNewMask(res); } return res; } return SWIG_ERROR; } } %enddef %define %typemaps_std_string(String, Char, AsPtrMethod, FromMethod, CheckCode) %std_string_asptr(String, Char, AsPtrMethod, #AsPtrMethod) %std_string_asval(String) %std_string_from(String, FromMethod, #FromMethod) %typemaps_asptrfromn(%arg(CheckCode), String); %enddef swig-4.0.1/Lib/typemaps/cwstring.swg0000644000175000017500000000031713527063513017303 0ustar williamwilliam%include %include %typemaps_cstring(%cwstring, wchar_t, SWIG_AsWCharPtr, SWIG_AsWCharPtrAndSize, SWIG_FromWCharPtr, SWIG_FromWCharPtrAndSize); swig-4.0.1/Lib/typemaps/factory.swg0000644000175000017500000000461113527063513017113 0ustar williamwilliam/* Implement a more natural wrap for factory methods, for example, if you have: ---- geometry.h -------- struct Geometry { enum GeomType{ POINT, CIRCLE }; virtual ~Geometry() {} virtual int draw() = 0; // // Factory method for all the Geometry objects // static Geometry *create(GeomType i); }; struct Point : Geometry { int draw() { return 1; } double width() { return 1.0; } }; struct Circle : Geometry { int draw() { return 2; } double radius() { return 1.5; } }; // // Factory method for all the Geometry objects // Geometry *Geometry::create(GeomType type) { switch (type) { case POINT: return new Point(); case CIRCLE: return new Circle(); default: return 0; } } ---- geometry.h -------- You can use the %factory with the Geometry::create method as follows: %newobject Geometry::create; %factory(Geometry *Geometry::create, Point, Circle); %include "geometry.h" and Geometry::create will return a 'Point' or 'Circle' instance instead of the plain 'Geometry' type. For example, in python: circle = Geometry.create(Geometry.CIRCLE) r = circle.radius() where circle is a Circle proxy instance. NOTES: remember to fully qualify all the type names and don't use %factory inside a namespace declaration, ie, instead of namespace Foo { %factory(Geometry *Geometry::create, Point, Circle); } use %factory(Foo::Geometry *Foo::Geometry::create, Foo::Point, Foo::Circle); */ %define %_factory_dispatch(Type) if (!dcast) { Type *dobj = dynamic_cast($1); if (dobj) { dcast = 1; %set_output(SWIG_NewPointerObj(%as_voidptr(dobj),$descriptor(Type *), $owner | %newpointer_flags)); } }%enddef %define %factory(Method,Types...) %typemap(out) Method { int dcast = 0; %formacro(%_factory_dispatch, Types) if (!dcast) { %set_output(SWIG_NewPointerObj(%as_voidptr($1),$descriptor, $owner | %newpointer_flags)); } }%enddef swig-4.0.1/Lib/typemaps/ptrtypes.swg0000644000175000017500000001470013527063513017336 0ustar williamwilliam/* ----------------------------------------------------------------------------- * ptrtypes.swg * * Value typemaps (Type, const Type&) for "Ptr" types, such as swig * wrapped classes, that define the AsPtr/From methods * * To apply them, just use one of the following macros: * * %typemaps_asptr(CheckCode, AsPtrMeth, AsPtrFrag, Type) * %typemaps_asptrfrom(CheckCode, AsPtrMeth, FromMeth, AsPtrFrag, FromFrag, Type) * * or the simpler and normalize form: * * %typemaps_asptrfromn(CheckCode, Type) * * Also, you can use the individual typemap definitions: * * %ptr_in_typemap(asptr_meth,frag,Type) * %ptr_varin_typemap(asptr_meth,frag,Type) * %ptr_typecheck_typemap(check,asptr_meth,frag,Type) * %ptr_directorout_typemap(asptr_meth,frag,Type) * ----------------------------------------------------------------------------- */ %include /* in */ %define %ptr_in_typemap(asptr_meth,frag,Type...) %typemap(in,fragment=frag) Type { Type *ptr = (Type *)0; int res = asptr_meth($input, &ptr); if (!SWIG_IsOK(res) || !ptr) { %argument_fail((ptr ? res : SWIG_TypeError), "$type", $symname, $argnum); } $1 = *ptr; if (SWIG_IsNewObj(res)) %delete(ptr); } %typemap(freearg) Type ""; %typemap(in,fragment=frag) const Type & (int res = SWIG_OLDOBJ) { Type *ptr = (Type *)0; res = asptr_meth($input, &ptr); if (!SWIG_IsOK(res)) { %argument_fail(res,"$type",$symname, $argnum); } if (!ptr) { %argument_nullref("$type",$symname, $argnum); } $1 = ptr; } %typemap(freearg,noblock=1) const Type & { if (SWIG_IsNewObj(res$argnum)) %delete($1); } %enddef /* varin */ %define %ptr_varin_typemap(asptr_meth,frag,Type...) %typemap(varin,fragment=frag) Type { Type *ptr = (Type *)0; int res = asptr_meth($input, &ptr); if (!SWIG_IsOK(res) || !ptr) { %variable_fail((ptr ? res : SWIG_TypeError), "$type", "$name"); } $1 = *ptr; if (SWIG_IsNewObj(res)) %delete(ptr); } %enddef #if defined(SWIG_DIRECTOR_TYPEMAPS) /* directorout */ %define %ptr_directorout_typemap(asptr_meth,frag,Type...) %typemap(directorargout,noblock=1,fragment=frag) Type *DIRECTOROUT ($*ltype temp, int swig_ores) { Type *swig_optr = 0; swig_ores = $result ? asptr_meth($result, &swig_optr) : 0; if (!SWIG_IsOK(swig_ores) || !swig_optr) { %dirout_fail((swig_optr ? swig_ores : SWIG_TypeError),"$type"); } temp = *swig_optr; $1 = &temp; if (SWIG_IsNewObj(swig_ores)) %delete(swig_optr); } %typemap(directorout,noblock=1,fragment=frag) Type { Type *swig_optr = 0; int swig_ores = asptr_meth($input, &swig_optr); if (!SWIG_IsOK(swig_ores) || !swig_optr) { %dirout_fail((swig_optr ? swig_ores : SWIG_TypeError),"$type"); } $result = *swig_optr; if (SWIG_IsNewObj(swig_ores)) %delete(swig_optr); } %typemap(directorout,noblock=1,fragment=frag,warning=SWIGWARN_TYPEMAP_DIRECTOROUT_PTR_MSG) Type* { Type *swig_optr = 0; int swig_ores = asptr_meth($input, &swig_optr); if (!SWIG_IsOK(swig_ores)) { %dirout_fail(swig_ores,"$type"); } $result = swig_optr; if (SWIG_IsNewObj(swig_ores)) { swig_acquire_ownership(swig_optr); } } %typemap(directorfree,noblock=1) Type* { if (director) { director->swig_release_ownership(%as_voidptr($input)); } } %typemap(directorout,noblock=1,fragment=frag,warning=SWIGWARN_TYPEMAP_DIRECTOROUT_PTR_MSG) Type& { Type *swig_optr = 0; int swig_ores = asptr_meth($input, &swig_optr); if (!SWIG_IsOK(swig_ores)) { %dirout_fail(swig_ores,"$type"); } else { if (!swig_optr) { %dirout_nullref("$type"); } } $result = swig_optr; if (SWIG_IsNewObj(swig_ores)) { swig_acquire_ownership(swig_optr); } } %typemap(directorfree,noblock=1) Type& { if (director) { director->swig_release_ownership(%as_voidptr($input)); } } %typemap(directorout,fragment=frag) Type &DIRECTOROUT = Type %enddef #else #define %ptr_directorout_typemap(asptr_meth,frag,Type...) #endif /* SWIG_DIRECTOR_TYPEMAPS */ /* typecheck */ %define %ptr_typecheck_typemap(check,asptr_meth,frag,Type...) %typemap(typecheck,noblock=1,precedence=check,fragment=frag) Type * { int res = asptr_meth($input, (Type**)(0)); $1 = SWIG_CheckState(res); } %typemap(typecheck,noblock=1,precedence=check,fragment=frag) Type, const Type& { int res = asptr_meth($input, (Type**)(0)); $1 = SWIG_CheckState(res); } %enddef /*--------------------------------------------------------------------- * typemap definition for types with asptr method *---------------------------------------------------------------------*/ %define %typemaps_asptr(CheckCode, AsPtrMeth, AsPtrFrag, Type...) %fragment(SWIG_AsVal_frag(Type),"header",fragment=SWIG_AsPtr_frag(Type)) { SWIGINTERNINLINE int SWIG_AsVal(Type)(SWIG_Object obj, Type *val) { Type *v = (Type *)0; int res = SWIG_AsPtr(Type)(obj, &v); if (!SWIG_IsOK(res)) return res; if (v) { if (val) *val = *v; if (SWIG_IsNewObj(res)) { %delete(v); res = SWIG_DelNewMask(res); } return res; } return SWIG_ERROR; } } %ptr_in_typemap(%arg(AsPtrMeth), %arg(AsPtrFrag), Type); %ptr_varin_typemap(%arg(AsPtrMeth), %arg(AsPtrFrag), Type); %ptr_directorout_typemap(%arg(AsPtrMeth), %arg(AsPtrFrag), Type); %ptr_typecheck_typemap(%arg(CheckCode), %arg(AsPtrMeth),%arg(AsPtrFrag), Type); %ptr_input_typemap(%arg(CheckCode),%arg(AsPtrMeth),%arg(AsPtrFrag),Type); %enddef /*--------------------------------------------------------------------- * typemap definition for types with asptr/from methods *---------------------------------------------------------------------*/ %define %typemaps_asptrfrom(CheckCode, AsPtrMeth, FromMeth, AsPtrFrag, FromFrag, Type...) %typemaps_asptr(%arg(CheckCode), %arg(AsPtrMeth), %arg(AsPtrFrag), Type) %typemaps_from(%arg(FromMeth), %arg(FromFrag), Type); %value_output_typemap(%arg(FromMeth), %arg(FromFrag), Type); %ptr_inout_typemap(Type); %enddef /*--------------------------------------------------------------------- * typemap definition for types with for 'normalized' asptr/from methods *---------------------------------------------------------------------*/ %define %typemaps_asptrfromn(CheckCode, Type...) %typemaps_asptrfrom(%arg(CheckCode), %arg(SWIG_AsPtr(Type)), %arg(SWIG_From(Type)), %arg(SWIG_AsPtr_frag(Type)), %arg(SWIG_From_frag(Type)), Type); %enddef swig-4.0.1/Lib/typemaps/cpointer.swg0000644000175000017500000000627513527063513017277 0ustar williamwilliam/* ----------------------------------------------------------------------------- * cpointer.swg * * This library file contains macros that can be used to manipulate simple * pointer objects. * * ----------------------------------------------------------------------------- */ /* ----------------------------------------------------------------------------- * %pointer_class(type,name) * * Places a simple proxy around a simple type like 'int', 'float', or whatever. * The proxy provides this interface: * * class type { * public: * type(); * ~type(); * type value(); * void assign(type value); * }; * * Example: * * %pointer_class(int, intp); * * int add(int *x, int *y) { return *x + *y; } * * In python (with proxies) * * >>> a = intp() * >>> a.assign(10) * >>> a.value() * 10 * >>> b = intp() * >>> b.assign(20) * >>> print add(a,b) * 30 * * As a general rule, this macro should not be used on class/structures that * are already defined in the interface. * ----------------------------------------------------------------------------- */ %define %pointer_class(TYPE, NAME) %{ typedef TYPE NAME; %} typedef struct { } NAME; %extend NAME { NAME() { return %new_instance(TYPE); } ~NAME() { if ($self) %delete($self); } } %extend NAME { void assign(TYPE value) { *$self = value; } TYPE value() { return *$self; } TYPE * cast() { return $self; } static NAME * frompointer(TYPE *t) { return (NAME *) t; } } %types(NAME = TYPE); %enddef /* ----------------------------------------------------------------------------- * %pointer_functions(type,name) * * Create functions for allocating/deallocating pointers. This can be used * if you don't want to create a proxy class or if the pointer is complex. * * %pointer_functions(int, intp) * * int add(int *x, int *y) { return *x + *y; } * * In python (with proxies) * * >>> a = copy_intp(10) * >>> intp_value(a) * 10 * >>> b = new_intp() * >>> intp_assign(b,20) * >>> print add(a,b) * 30 * >>> delete_intp(a) * >>> delete_intp(b) * * ----------------------------------------------------------------------------- */ %define %pointer_functions(TYPE,NAME) %{ static TYPE *new_##NAME() { return %new_instance(TYPE); } static TYPE *copy_##NAME(TYPE value) { return %new_copy(value, TYPE); } static void delete_##NAME(TYPE *obj) { if (obj) %delete(obj); } static void NAME ##_assign(TYPE *obj, TYPE value) { *obj = value; } static TYPE NAME ##_value(TYPE *obj) { return *obj; } %} TYPE *new_##NAME(); TYPE *copy_##NAME(TYPE value); void delete_##NAME(TYPE *obj); void NAME##_assign(TYPE *obj, TYPE value); TYPE NAME##_value(TYPE *obj); %enddef /* ----------------------------------------------------------------------------- * %pointer_cast(type1,type2,name) * * Generates a pointer casting function. * ----------------------------------------------------------------------------- */ %define %pointer_cast(TYPE1,TYPE2,NAME) %inline %{ TYPE2 NAME(TYPE1 x) { return %static_cast(x, TYPE2); } %} %enddef swig-4.0.1/Lib/typemaps/void.swg0000644000175000017500000000403013527063513016400 0ustar williamwilliam/* ------------------------------------------------------------ * Void * - Accepts any kind of pointer * ------------------------------------------------------------ */ /* in */ %typemap(in,noblock=1) void * (int res) { res = SWIG_ConvertPtr($input,%as_voidptrptr(&$1), 0, $disown); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } } %typemap(freearg) void * ""; %typemap(in,noblock=1) void * const& ($*ltype temp = 0, int res) { res = SWIG_ConvertPtr($input, %as_voidptrptr(&temp), 0, $disown); if (!SWIG_IsOK(res)) { %argument_fail(res, "Stype", $symname, $argnum); } $1 = &temp; } %typemap(freearg) void * const& ""; /* out */ #if defined(VOID_Object) %typemap(out,noblock=1) void { $result = VOID_Object; } #else %typemap(out,noblock=1) void {} #endif /* varin */ %typemap(varin) void * { void *temp = 0; int res = SWIG_ConvertPtr($input, &temp, 0, SWIG_POINTER_DISOWN); if (!SWIG_IsOK(res)) { %variable_fail(res, "$type", "$name"); } $1 = ($1_ltype) temp; } /* typecheck */ %typecheck(SWIG_TYPECHECK_VOIDPTR, noblock=1) void * { void *ptr = 0; int res = SWIG_ConvertPtr($input, &ptr, 0, 0); $1 = SWIG_CheckState(res); } #if defined(SWIG_DIRECTOR_TYPEMAPS) /* directorin */ %typemap(directorin,noblock=1) void *, void const*, void *const, void const *const, void const *&, void *const &, void const *const & { $input = SWIG_NewPointerObj(%as_voidptr($1), $descriptor, %newpointer_flags); } /* directorout */ %typemap(directorout,noblock=1) void * (void *argp, int res) { res = SWIG_ConvertPtr($input, &argp, 0, 0); if (!SWIG_IsOK(res)) { %dirout_fail(res,"$type"); } $result = %reinterpret_cast(argp, $ltype); } %typemap(directorout,noblock=1,warning=SWIGWARN_TYPEMAP_DIRECTOROUT_PTR_MSG) void * const& (void *argp, int res) { res = SWIG_ConvertPtr($input, &argp, 0, $disown); if (!SWIG_IsOK(res)) { %dirout_fail(res,"$type"); } static $*ltype temp = %reinterpret_cast(argp, $*ltype); $result = &temp; } #endif /* SWIG_DIRECTOR_TYPEMAPS */ swig-4.0.1/Lib/typemaps/cmalloc.swg0000644000175000017500000000460613527063513017062 0ustar williamwilliam/* ----------------------------------------------------------------------------- * cmalloc.swg * * This library file contains macros that can be used to create objects using * the C malloc function. * ----------------------------------------------------------------------------- */ %{ #include %} /* %malloc(TYPE [, NAME = TYPE]) %calloc(TYPE [, NAME = TYPE]) %realloc(TYPE [, NAME = TYPE]) %free(TYPE [, NAME = TYPE]) %allocators(TYPE [,NAME = TYPE]) Creates functions for allocating/reallocating memory. TYPE *malloc_NAME(size_t nbytes = sizeof(TYPE); TYPE *calloc_NAME(size_t nobj=1, size_t size=sizeof(TYPE)); TYPE *realloc_NAME(TYPE *ptr, size_t nbytes); void free_NAME(TYPE *ptr); */ %define %malloc(TYPE,NAME...) #if #NAME != "" %rename(malloc_##NAME) ::malloc(size_t nbytes); #else %rename(malloc_##TYPE) ::malloc(size_t nbytes); #endif #if #TYPE != "void" %typemap(default) size_t nbytes "$1 = (size_t) sizeof(TYPE);" #endif TYPE *malloc(size_t nbytes); %typemap(default) size_t nbytes; %enddef %define %calloc(TYPE,NAME...) #if #NAME != "" %rename(calloc_##NAME) ::calloc(size_t nobj, size_t sz); #else %rename(calloc_##TYPE) ::calloc(size_t nobj, size_t sz); #endif #if #TYPE != "void" %typemap(default) size_t sz "$1 = (size_t) sizeof(TYPE);" #else %typemap(default) size_t sz "$1 = 1;" #endif %typemap(default) size_t nobj "$1 = 1;" TYPE *calloc(size_t nobj, size_t sz); %typemap(default) size_t sz; %typemap(default) size_t nobj; %enddef %define %realloc(TYPE,NAME...) %insert("header") { #if #NAME != "" TYPE *realloc_##NAME(TYPE *ptr, size_t nitems) #else TYPE *realloc_##TYPE(TYPE *ptr, size_t nitems) #endif { #if #TYPE != "void" return (TYPE *) realloc(ptr, nitems*sizeof(TYPE)); #else return (TYPE *) realloc(ptr, nitems); #endif } } #if #NAME != "" TYPE *realloc_##NAME(TYPE *ptr, size_t nitems); #else TYPE *realloc_##TYPE(TYPE *ptr, size_t nitems); #endif %enddef %define %free(TYPE,NAME...) #if #NAME != "" %rename(free_##NAME) ::free(TYPE *ptr); #else %rename(free_##TYPE) ::free(TYPE *ptr); #endif void free(TYPE *ptr); %enddef %define %sizeof(TYPE,NAME...) #if #NAME != "" %constant size_t sizeof_##NAME = sizeof(TYPE); #else %constant size_t sizeof_##TYPE = sizeof(TYPE); #endif %enddef %define %allocators(TYPE,NAME...) %malloc(TYPE,NAME) %calloc(TYPE,NAME) %realloc(TYPE,NAME) %free(TYPE,NAME) #if #TYPE != "void" %sizeof(TYPE,NAME) #endif %enddef swig-4.0.1/Lib/typemaps/swigmacros.swg0000644000175000017500000001727013527063513017627 0ustar williamwilliam/* ----------------------------------------------------------------------------- * SWIG API. Portion only visible from SWIG * ----------------------------------------------------------------------------- */ /* This file implements the internal macros of the 'SWIG API', which are useful to implement all the SWIG target languages. Basic preprocessor macros: -------------------------- %arg(Arg) Safe argument wrap %str(Arg) Stringify the argument %begin_block Begin an execution block %end_block End an execution block %block(Block) Execute Block as an execution block %define_as(Def, Val) Define 'Def' as 'Val', expanding Def and Val first %ifcplusplus(V1, V2) if C++ Mode; then V1; else V2; fi Casting Operations: ------------------- SWIG provides the following casting macros, which implement the corresponding C++ casting operations: %const_cast(a, Type) const_cast(a) %static_cast(a, Type) static_cast(a) %reinterpret_cast(a, Type) reinterpret_cast(a) %numeric_cast(a, Type) static_cast(a) %as_voidptr(a) const_cast(static_cast(a)) %as_voidptrptr(a) reinterpret_cast(a) or their C unsafe versions. In C++ we use the safe version unless SWIG_NO_CPLUSPLUS_CAST is defined Memory allocation: ------------------ These allocation/freeing macros are safe to use in C or C++ and dispatch the proper new/delete/delete[] or free/malloc calls as needed. %new_instance(Type) Allocate a new instance of given Type %new_copy(value,Type) Allocate and initialize a new instance with 'value' %new_array(size,Type) Allocate a new array with given size and Type and zero initialize %new_copy_array(cptr,size,Type) Allocate and initialize a new array from 'cptr' %delete(cptr) Delete an instance %delete_array(cptr) Delete an array Auxiliary loop macros: ---------------------- %formacro(Macro, Args...) or %formacro_1(Macro, Args...) for i in Args do Macro($i) done %formacro_2(Macro2, Args...) for i,j in Args do Macro2($i, $j) done Flags and conditional macros: ----------------------------- %mark_flag(flag) flag := True %evalif(flag,expr) if flag; then expr fi %evalif_2(flag1 flag2,expr) if flag1 and flag2; then expr fi */ /* ----------------------------------------------------------------------------- * Basic preprocessor macros * ----------------------------------------------------------------------------- */ #define %arg(Arg...) Arg #define %str(Arg) `Arg` #ifndef %begin_block # define %begin_block do { #endif #ifndef %end_block # define %end_block } while(0) #endif #define %block(Block...) %begin_block Block; %end_block /* define a new macro */ %define %define_as(Def, Val...)%#define Def Val %enddef /* include C++ or else value */ %define %ifcplusplus(cppval, nocppval) #ifdef __cplusplus cppval #else nocppval #endif %enddef /* insert the SWIGVERSION in the interface and the wrapper code */ #if SWIG_VERSION %insert("header") { %define_as(SWIGVERSION, SWIG_VERSION) %#define SWIG_VERSION SWIGVERSION } #endif /* ----------------------------------------------------------------------------- * Casting operators * ----------------------------------------------------------------------------- */ #if defined(__cplusplus) && !defined(SWIG_NO_CPLUSPLUS_CAST) # define %const_cast(a,Type...) const_cast< Type >(a) # define %static_cast(a,Type...) static_cast< Type >(a) # define %reinterpret_cast(a,Type...) reinterpret_cast< Type >(a) # define %numeric_cast(a,Type...) static_cast< Type >(a) #else /* C case */ # define %const_cast(a,Type...) (Type)(a) # define %static_cast(a,Type...) (Type)(a) # define %reinterpret_cast(a,Type...) (Type)(a) # define %numeric_cast(a,Type...) (Type)(a) #endif /* __cplusplus */ #define %as_voidptr(a) SWIG_as_voidptr(a) #define %as_voidptrptr(a) SWIG_as_voidptrptr(a) %insert("header") { %define_as(SWIG_as_voidptr(a), %const_cast(%static_cast(a,const void *), void *)) %define_as(SWIG_as_voidptrptr(a), ((void)%as_voidptr(*a),%reinterpret_cast(a, void**))) } /* ----------------------------------------------------------------------------- * Allocating/freeing elements * ----------------------------------------------------------------------------- */ #if defined(__cplusplus) # define %new_instance(Type...) (new Type()) # define %new_copy(val,Type...) (new Type(%static_cast(val, const Type&))) # define %new_array(size,Type...) (new Type[size]()) # define %new_copy_array(ptr,size,Type...) %reinterpret_cast(memcpy(new Type[size], ptr, sizeof(Type)*(size)), Type*) # define %delete(cptr) delete cptr # define %delete_array(cptr) delete[] cptr #else /* C case */ # define %new_instance(Type...) (Type *)calloc(1,sizeof(Type)) # define %new_copy(val,Type...) (Type *)memcpy(%new_instance(Type),&val,sizeof(Type)) # define %new_array(size,Type...) (Type *)calloc(size, sizeof(Type)) # define %new_copy_array(ptr,size,Type...) (Type *)memcpy(malloc((size)*sizeof(Type)), ptr, sizeof(Type)*(size)) # define %delete(cptr) free((char*)cptr) # define %delete_array(cptr) free((char*)cptr) #endif /* __cplusplus */ /* ----------------------------------------------------------------------------- * SWIG names and mangling * ----------------------------------------------------------------------------- */ #define %mangle(Type...) #@Type #define %descriptor(Type...) SWIGTYPE_ ## #@Type #define %string_name(Name) "SWIG_" %str(Name) #define %symbol_name(Name, Type...) SWIG_ ## Name ## _ #@Type #define %checkcode(Code) SWIG_TYPECHECK_ ## Code /* ----------------------------------------------------------------------------- * Auxiliary loop macros * ----------------------------------------------------------------------------- */ /* for loop for macro with one argument */ %define %_formacro_1(macro, arg1,...)macro(arg1) #if #__VA_ARGS__ != "__fordone__" %_formacro_1(macro, __VA_ARGS__) #endif %enddef /* for loop for macro with one argument */ %define %formacro_1(macro,...)%_formacro_1(macro,__VA_ARGS__,__fordone__)%enddef %define %formacro(macro,...)%_formacro_1(macro,__VA_ARGS__,__fordone__)%enddef /* for loop for macro with two arguments */ %define %_formacro_2(macro, arg1, arg2, ...)macro(arg1, arg2) #if #__VA_ARGS__ != "__fordone__" %_formacro_2(macro, __VA_ARGS__) #endif %enddef /* for loop for macro with two arguments */ %define %formacro_2(macro,...)%_formacro_2(macro, __VA_ARGS__, __fordone__)%enddef /* ----------------------------------------------------------------------------- * SWIG flags * ----------------------------------------------------------------------------- */ /* mark a flag, ie, define a macro name but ignore it in the interface. the flag can be later used with %evalif */ %define %mark_flag(x) %define x 1 %enddef %enddef /* %evalif and %evalif_2 are use to evaluate or process an expression if the given predicate is 'true' (1). */ %define %_evalif(_x,_expr) #if _x == 1 _expr #endif %enddef %define %_evalif_2(_x,_y,_expr) #if _x == 1 && _y == 1 _expr #endif %enddef %define %evalif(_x,_expr...) %_evalif(%arg(_x),%arg(_expr)) %enddef %define %evalif_2(_x,_y,_expr...) %_evalif_2(%arg(_x),%arg(_y),%arg(_expr)) %enddef swig-4.0.1/Lib/typemaps/std_wstring.swg0000644000175000017500000000062013527063513020007 0ustar williamwilliam%include #ifndef SWIG_STD_BASIC_STRING #define SWIG_STD_WSTRING %include %{ #include %} %fragment(""); namespace std { %naturalvar wstring; class wstring; } %typemaps_std_string(std::wstring, wchar_t, SWIG_AsWCharPtrAndSize, SWIG_FromWCharPtrAndSize, %checkcode(STDUNISTRING)); #else %include #endif swig-4.0.1/Lib/typemaps/enumint.swg0000644000175000017500000000236413527063513017126 0ustar williamwilliam/* ------------------------------------------------------------ * Enums mapped as integer values * ------------------------------------------------------------ */ %apply int { enum SWIGTYPE }; %apply const int& { const enum SWIGTYPE & }; %apply const int& { const enum SWIGTYPE && }; %typemap(in,fragment=SWIG_AsVal_frag(int),noblock=1) const enum SWIGTYPE & (int val, int ecode, $basetype temp) { ecode = SWIG_AsVal(int)($input, &val); if (!SWIG_IsOK(ecode)) { %argument_fail(ecode, "$type", $symname, $argnum); } else { temp = %static_cast(val,$basetype); $1 = &temp; } } %typemap(in,fragment=SWIG_AsVal_frag(int),noblock=1) const enum SWIGTYPE && (int val, int ecode, $basetype temp) { ecode = SWIG_AsVal(int)($input, &val); if (!SWIG_IsOK(ecode)) { %argument_fail(ecode, "$type", $symname, $argnum); } else { temp = %static_cast(val,$basetype); $1 = &temp; } } %typemap(varin,fragment=SWIG_AsVal_frag(int),noblock=1) enum SWIGTYPE { if (sizeof(int) != sizeof($1)) { %variable_fail(SWIG_AttributeError,"$type", "arch, read-only $name"); } else { int ecode = SWIG_AsVal(int)($input, %reinterpret_cast(&$1,int*)); if (!SWIG_IsOK(ecode)) { %variable_fail(ecode, "$type", "$name"); } } } swig-4.0.1/Lib/typemaps/strings.swg0000644000175000017500000004456613527063513017152 0ustar williamwilliam// // Use the macro SWIG_PRESERVE_CARRAY_SIZE if you prefer to preserve // the size of char arrays, ie // ------------------------------------------ // C Side => Language Side // ------------------------------------------ // char name[5] = "hola" => 'hola\0' // // the default behaviour is // // char name[5] = "hola" => 'hola' // // //#define SWIG_PRESERVE_CARRAY_SIZE /* ------------------------------------------------------------ * String typemaps for type Char (char or wchar_t) * ------------------------------------------------------------ */ %define %_typemap_string(StringCode, Char, SWIG_AsCharPtrAndSize, SWIG_FromCharPtrAndSize, SWIG_CharPtrLen, SWIG_CharBufLen, SWIG_AsCharPtr, SWIG_FromCharPtr, SWIG_AsCharArray, SWIG_NewCopyCharArray, SWIG_DeleteCharArray) /* in */ %typemap(in,noblock=1,fragment=#SWIG_AsCharPtr) Char * (int res, Char *buf = 0, int alloc = 0), const Char * (int res, Char *buf = 0, int alloc = 0) { res = SWIG_AsCharPtr($input, &buf, &alloc); if (!SWIG_IsOK(res)) { %argument_fail(res,"$type",$symname, $argnum); } $1 = %reinterpret_cast(buf, $1_ltype); } %typemap(freearg,noblock=1,match="in") Char *, const Char * { if (alloc$argnum == SWIG_NEWOBJ) SWIG_DeleteCharArray(buf$argnum); } %typemap(in,noblock=1,fragment=#SWIG_AsCharPtr) Char const*& (int res, Char *buf = 0, int alloc = 0) { res = SWIG_AsCharPtr($input, &buf, &alloc); if (!SWIG_IsOK(res)) { %argument_fail(res,"$type",$symname, $argnum); } $1 = &buf; } %typemap(freearg, noblock=1,match="in") Char const*& { if (alloc$argnum == SWIG_NEWOBJ) SWIG_DeleteCharArray(buf$argnum); } /* out */ %typemap(out,noblock=1,fragment=#SWIG_FromCharPtr) Char *, const Char * { %set_output(SWIG_FromCharPtr((const Char *)$1)); } %typemap(out,noblock=1,fragment=#SWIG_FromCharPtr) Char const*& { %set_output(SWIG_FromCharPtr(*$1)); } %typemap(newfree,noblock=1) Char * { SWIG_DeleteCharArray($1); } /* varin */ %typemap(varin,fragment=#SWIG_AsCharPtrAndSize) Char * { Char *cptr = 0; size_t csize = 0; int alloc = SWIG_NEWOBJ; int res = SWIG_AsCharPtrAndSize($input, &cptr, &csize, &alloc); if (!SWIG_IsOK(res)) { %variable_fail(res,"$type","$name"); } if ($1) SWIG_DeleteCharArray($1); if (alloc == SWIG_NEWOBJ) { $1 = cptr; } else { $1 = csize ? ($1_type)SWIG_NewCopyCharArray(cptr, csize, Char) : 0; } } %typemap(varin,fragment=#SWIG_AsCharPtrAndSize,warning=SWIGWARN_TYPEMAP_CHARLEAK_MSG) const Char * { Char *cptr = 0; size_t csize = 0; int alloc = SWIG_NEWOBJ; int res = SWIG_AsCharPtrAndSize($input, &cptr, &csize, &alloc); if (!SWIG_IsOK(res)) { %variable_fail(res, "$type", "$name"); } if (alloc == SWIG_NEWOBJ) { $1 = cptr; } else { $1 = csize ? ($1_type)SWIG_NewCopyCharArray(cptr, csize, Char) : 0; } } /* varout */ %typemap(varout,noblock=1,fragment=#SWIG_FromCharPtr) Char *, const Char * { %set_varoutput(SWIG_FromCharPtr($1)); } /* memberin */ %typemap(memberin,noblock=1) Char * { if ($1) SWIG_DeleteCharArray($1); if ($input) { size_t size = SWIG_CharPtrLen(%reinterpret_cast($input, const Char *)) + 1; $1 = ($1_type)SWIG_NewCopyCharArray(%reinterpret_cast($input, const Char *), size, Char); } else { $1 = 0; } } %typemap(memberin,noblock=1,warning=SWIGWARN_TYPEMAP_CHARLEAK_MSG) const Char * { if ($input) { size_t size = SWIG_CharPtrLen(%reinterpret_cast(%reinterpret_cast($input, const Char *), const Char *)) + 1; $1 = ($1_type)SWIG_NewCopyCharArray($input, size, Char); } else { $1 = 0; } } /* globalin */ %typemap(globalin,noblock=1) Char * { if ($1) SWIG_DeleteCharArray($1); if ($input) { size_t size = SWIG_CharPtrLen(%reinterpret_cast(%reinterpret_cast($input, const Char *), const Char *)) + 1; $1 = ($1_type)SWIG_NewCopyCharArray($input, size, Char); } else { $1 = 0; } } %typemap(globalin,noblock=1,warning=SWIGWARN_TYPEMAP_CHARLEAK_MSG) const Char * { if ($input) { size_t size = SWIG_CharPtrLen($input) + 1; $1 = ($1_type)SWIG_NewCopyCharArray($input, size, Char); } else { $1 = 0; } } /* constant */ %typemap(constcode,noblock=1,fragment=#SWIG_FromCharPtr) Char *, Char const*, Char * const, Char const* const { %set_constant("$symname", SWIG_FromCharPtr($value)); } #if defined(SWIG_DIRECTOR_TYPEMAPS) /* directorin */ %typemap(directorin,noblock=1,fragment=#SWIG_FromCharPtr) Char *, Char const*, Char *const, Char const *const, Char const *&, Char *const &, Char const *const & { $input = SWIG_FromCharPtr((const Char *)$1); } /* directorout */ %typemap(directorout,noblock=1,fragment=#SWIG_AsCharPtr,warning=SWIGWARN_TYPEMAP_DIRECTOROUT_PTR_MSG) Char * (int res, Char *buf = 0, int alloc = SWIG_NEWOBJ) { res = SWIG_AsCharPtr($input, &buf, &alloc); if (!SWIG_IsOK(res)) { %dirout_fail(res, "$type"); } if (alloc == SWIG_NEWOBJ) { swig_acquire_ownership_array(buf); } $result = %reinterpret_cast(buf, $1_ltype); } %typemap(directorfree,noblock=1) Char * { if (director) { director->swig_release_ownership(%as_voidptr($input)); } } %typemap(directorout,noblock=1,fragment=#SWIG_AsCharPtr,warning=SWIGWARN_TYPEMAP_DIRECTOROUT_PTR_MSG) Char *const& (int res, Char *buf = 0, int alloc = SWIG_NEWOBJ), Char const*const& (int res, Char *buf = 0, int alloc = SWIG_NEWOBJ) { res = SWIG_AsCharPtr($input, &buf, &alloc); if (!SWIG_IsOK(res)) { %dirout_fail(res, "$type"); } static $*1_ltype tmp = buf; $result = &tmp; if (alloc == SWIG_NEWOBJ) { swig_acquire_ownership_array(buf); } } %typemap(directorfree,noblock=1) Char * const&, Char const* const& { if (director) { director->swig_release_ownership(%as_voidptr(*$input)); } } #endif /* SWIG_DIRECTOR_TYPEMAPS */ /* typecheck */ %typemap(typecheck,noblock=1,precedence=StringCode, fragment=#SWIG_AsCharPtr) Char *, const Char *, Char const*& { int res = SWIG_AsCharPtr($input, 0, 0); $1 = SWIG_CheckState(res); } /* throws */ %typemap(throws,noblock=1,fragment=#SWIG_FromCharPtr) Char * { %raise(SWIG_FromCharPtr($1), "$type", 0); } /* ------------------------------------------------------------ * Unknown size const Character array Char[ANY] handling * ------------------------------------------------------------ */ %apply Char * { Char [] }; %apply const Char * { const Char [] }; %typemap(varin,noblock=1,warning="462:Unable to set variable of type Char []") Char [] { %variable_fail(SWIG_AttributeError, "$type", "read-only $name"); } /* ------------------------------------------------------------ * Fixed size Character array Char[ANY] handling * ------------------------------------------------------------ */ /* memberin and globalin typemaps */ %typemap(memberin,noblock=1) Char [ANY] { if ($input) memcpy($1,$input,$1_dim0*sizeof(Char)); else memset($1,0,$1_dim0*sizeof(Char)); } %typemap(globalin,noblock=1) Char [ANY] { if ($input) memcpy($1,$input,$1_dim0*sizeof(Char)); else memset($1,0,$1_dim0*sizeof(Char)); } /* in */ %typemap(in,noblock=1,fragment=#SWIG_AsCharArray) Char [ANY] (Char temp[$1_dim0], int res), const Char [ANY](Char temp[$1_dim0], int res) { res = SWIG_AsCharArray($input, temp, $1_dim0); if (!SWIG_IsOK(res)) { %argument_fail(res,"$type",$symname, $argnum); } $1 = %reinterpret_cast(temp, $1_ltype); } %typemap(freearg) Char [ANY], const Char [ANY] ""; %typemap(in,noblock=1,fragment=#SWIG_AsCharArray) const Char (&)[ANY] (Char temp[$1_dim0], int res) { res = SWIG_AsCharArray($input, temp, $1_dim0); if (!SWIG_IsOK(res)) { %argument_fail(res,"$type",$symname, $argnum); } $1 = &temp; } %typemap(freearg) const Char (&)[ANY] ""; %typemap(out,fragment=#SWIG_FromCharPtrAndSize,fragment=#SWIG_CharBufLen) Char [ANY], const Char[ANY] { %#ifndef SWIG_PRESERVE_CARRAY_SIZE size_t size = SWIG_CharBufLen($1, $1_dim0); %#else size_t size = $1_dim0; %#endif %set_output(SWIG_FromCharPtrAndSize($1, size)); } /* varin */ %typemap(varin,fragment=#SWIG_AsCharArray) Char [ANY] { int res = SWIG_AsCharArray($input, $1, $1_dim0); if (!SWIG_IsOK(res)) { %variable_fail(res, "$type", "$name"); } } /* varout */ %typemap(varout,fragment=#SWIG_CharBufLen) Char [ANY], const Char [ANY] { %#ifndef SWIG_PRESERVE_CARRAY_SIZE size_t size = SWIG_CharBufLen($1, $1_dim0); %#else size_t size = $1_dim0; %#endif %set_varoutput(SWIG_FromCharPtrAndSize($1, size)); } /* constant */ %typemap(constcode,fragment=#SWIG_CharBufLen) Char [ANY], const Char [ANY] { %#ifndef SWIG_PRESERVE_CARRAY_SIZE size_t size = SWIG_CharBufLen($1, $1_dim0); %#else size_t size = $value_dim0; %#endif %set_constant("$symname", SWIG_FromCharPtrAndSize($value,size)); } #if defined(SWIG_DIRECTOR_TYPEMAPS) /* directorin */ %typemap(directorin,fragment=#SWIG_CharBufLen) Char [ANY], const Char [ANY] { %#ifndef SWIG_PRESERVE_CARRAY_SIZE size_t size = SWIG_CharBufLen($1, $1_dim0); %#else size_t size = $1_dim0; %#endif $input = SWIG_FromCharPtrAndSize($1, size); } /* directorout */ %typemap(directorout,noblock=1,fragment=#SWIG_AsCharArray) Char [ANY] (Char temp[$result_dim0]), const Char [ANY] (Char temp[$result_dim0], int res) { res = SWIG_AsCharArray($input, temp, $result_dim0); if (!SWIG_IsOK(res)) { %dirout_fail(res, "$type"); } $result = temp; } #endif /* SWIG_DIRECTOR_TYPEMAPS */ /* typecheck */ %typemap(typecheck,noblock=1,precedence=StringCode, fragment=#SWIG_AsCharArray) Char [ANY], const Char[ANY] { int res = SWIG_AsCharArray($input, (Char *)0, $1_dim0); $1 = SWIG_CheckState(res); } /* throws */ %typemap(throws,fragment=#SWIG_CharBufLen) Char [ANY], const Char[ANY] { %#ifndef SWIG_PRESERVE_CARRAY_SIZE size_t size = SWIG_CharBufLen($1, $1_dim0); %#else size_t size = $1_dim0; %#endif %raise(SWIG_FromCharPtrAndSize($1, size), "$type", 0); } /* ------------------------------------------------------------------- * --- Really fix size Char arrays, including '\0'chars at the end --- * ------------------------------------------------------------------- */ %typemap(varout,noblock=1,fragment=#SWIG_FromCharPtrAndSize) Char FIXSIZE[ANY], const Char FIXSIZE[ANY] { %set_varoutput(SWIG_FromCharPtrAndSize($1, $1_dim0)); } %typemap(out,noblock=1,fragment=#SWIG_FromCharPtrAndSize) Char FIXSIZE[ANY], const Char FIXSIZE[ANY] { %set_output(SWIG_FromCharPtrAndSize($1, $1_dim0)); } #if defined(SWIG_DIRECTOR_TYPEMAPS) %typemap(directorin,noblock=1,fragment=#SWIG_FromCharPtrAndSize) Char FIXSIZE[ANY], const Char FIXSIZE[ANY] { $input = SWIG_FromCharPtrAndSize($1, $1_dim0); } #endif /* SWIG_DIRECTOR_TYPEMAPS */ %typemap(throws,noblock=1,fragment=#SWIG_FromCharPtrAndSize) Char FIXSIZE[ANY], const Char FIXSIZE[ANY] { %raise(SWIG_FromCharPtrAndSize($1, $1_dim0), "$type", 0); } /* ------------------------------------------------------------ * --- String & length --- * ------------------------------------------------------------ */ /* Here len doesn't include the '0' terminator */ %typemap(in,noblock=1,fragment=#SWIG_AsCharPtrAndSize) (Char *STRING, size_t LENGTH) (int res, Char *buf = 0, size_t size = 0, int alloc = 0), (const Char *STRING, size_t LENGTH) (int res, Char *buf = 0, size_t size = 0, int alloc = 0) { res = SWIG_AsCharPtrAndSize($input, &buf, &size, &alloc); if (!SWIG_IsOK(res)) { %argument_fail(res,"$type",$symname, $argnum); } $1 = %reinterpret_cast(buf, $1_ltype); $2 = %numeric_cast(size - 1, $2_ltype); } %typemap(freearg,noblock=1,match="in") (Char *STRING, size_t LENGTH) { if (alloc$argnum == SWIG_NEWOBJ) SWIG_DeleteCharArray(buf$argnum); } /* old 'int' form */ %typemap(in) (Char *STRING, int LENGTH) = (Char *STRING, size_t LENGTH); %typemap(freearg) (Char *STRING, int LENGTH) = (Char *STRING, size_t LENGTH); /* Here size includes the '0' terminator */ %typemap(in,noblock=1,fragment=#SWIG_AsCharPtrAndSize) (Char *STRING, size_t SIZE) (int res, Char *buf = 0, size_t size = 0, int alloc = 0), (const Char *STRING, size_t SIZE) (int res, Char *buf = 0, size_t size = 0, int alloc = 0) { res = SWIG_AsCharPtrAndSize($input, &buf, &size, &alloc); if (!SWIG_IsOK(res)) { %argument_fail(res,"$type",$symname, $argnum); } $1 = %reinterpret_cast(buf, $1_ltype); $2 = %numeric_cast(size, $2_ltype); } %typemap(freearg,noblock=1,match="in") (Char *STRING, size_t SIZE) { if (alloc$argnum == SWIG_NEWOBJ) SWIG_DeleteCharArray(buf$argnum); } /* old 'int' form */ %typemap(in) (Char *STRING, int SIZE) = (Char *STRING, size_t SIZE); %typemap(freearg) (Char *STRING, int SIZE) = (Char *STRING, size_t SIZE); /* reverse order versions */ /* Here len doesn't include the '0' terminator */ %typemap(in,noblock=1,fragment=#SWIG_AsCharPtrAndSize) (size_t LENGTH, Char *STRING) (int res, Char *buf = 0, size_t size = 0, int alloc = 0), (size_t LENGTH, const Char *STRING) (int res, Char *buf = 0, size_t size = 0, int alloc = 0) { res = SWIG_AsCharPtrAndSize($input, &buf, &size, &alloc); if (!SWIG_IsOK(res)) { %argument_fail(res,"$type",$symname, $argnum); } $2 = %reinterpret_cast(buf, $2_ltype) ; $1 = %numeric_cast(size - 1, $1_ltype) ; } %typemap(freearg, noblock=1, match="in") (size_t LENGTH, Char *STRING) { if (alloc$argnum == SWIG_NEWOBJ) SWIG_DeleteCharArray(buf$argnum); } /* old 'int' form */ %typemap(in) (int LENGTH, Char *STRING) = (size_t LENGTH, Char *STRING); %typemap(freearg) (int LENGTH, Char *STRING) = (size_t LENGTH, Char *STRING); /* Here size includes the '0' terminator */ %typemap(in,noblock=1,fragment=#SWIG_AsCharPtrAndSize) (size_t SIZE, Char *STRING) (int res, Char *buf = 0, size_t size = 0, int alloc = 0), (size_t SIZE, const Char *STRING) (int res, Char *buf = 0, size_t size = 0, int alloc = 0) { res = SWIG_AsCharPtrAndSize($input, &buf, &size, &alloc); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type",$symname, $argnum); } $2 = %reinterpret_cast(buf, $2_ltype) ; $1 = %numeric_cast(size, $1_ltype) ; } %typemap(freearg, noblock=1, match="in") (size_t SIZE, Char *STRING) { if (alloc$argnum == SWIG_NEWOBJ) SWIG_DeleteCharArray(buf$argnum); } /* old 'int' form */ %typemap(in) (int SIZE, Char *STRING) = (size_t SIZE, Char *STRING); %typemap(freearg) (int SIZE, Char *STRING) = (size_t SIZE, Char *STRING); %enddef /* ------------------------------------------------------------ * --- String fragment methods --- * ------------------------------------------------------------ */ #ifndef %_typemap2_string %define %_typemap2_string(StringCode, CharCode, Char, CharName, SWIG_AsCharPtrAndSize, SWIG_FromCharPtrAndSize, SWIG_CharPtrLen, SWIG_CharBufLen, SWIG_NewCopyCharArray, SWIG_DeleteCharArray, FragLimits, CHAR_MIN, CHAR_MAX) %fragment("SWIG_From"#CharName"Ptr","header",fragment=#SWIG_FromCharPtrAndSize) { SWIGINTERNINLINE SWIG_Object SWIG_From##CharName##Ptr(const Char *cptr) { return SWIG_FromCharPtrAndSize(cptr, (cptr ? SWIG_CharPtrLen(cptr) : 0)); } } %fragment("SWIG_From"#CharName"Array","header",fragment=#SWIG_FromCharPtrAndSize) { SWIGINTERNINLINE SWIG_Object SWIG_From##CharName##Array(const Char *cptr, size_t size) { return SWIG_FromCharPtrAndSize(cptr, size); } } %fragment("SWIG_As" #CharName "Ptr","header",fragment=#SWIG_AsCharPtrAndSize) { %define_as(SWIG_As##CharName##Ptr(obj, val, alloc), SWIG_AsCharPtrAndSize(obj, val, NULL, alloc)) } %fragment("SWIG_As" #CharName "Array","header",fragment=#SWIG_AsCharPtrAndSize) { SWIGINTERN int SWIG_As##CharName##Array(SWIG_Object obj, Char *val, size_t size) { Char* cptr = 0; size_t csize = 0; int alloc = SWIG_OLDOBJ; int res = SWIG_AsCharPtrAndSize(obj, &cptr, &csize, &alloc); if (SWIG_IsOK(res)) { /* special case of single char conversion when we don't need space for NUL */ if (size == 1 && csize == 2 && cptr && !cptr[1]) --csize; if (csize <= size) { if (val) { if (csize) memcpy(val, cptr, csize*sizeof(Char)); if (csize < size) memset(val + csize, 0, (size - csize)*sizeof(Char)); } if (alloc == SWIG_NEWOBJ) { SWIG_DeleteCharArray(cptr); res = SWIG_DelNewMask(res); } return res; } if (alloc == SWIG_NEWOBJ) SWIG_DeleteCharArray(cptr); } return SWIG_TypeError; } } /* Char */ %fragment(SWIG_From_frag(Char),"header",fragment=#SWIG_FromCharPtrAndSize) { SWIGINTERNINLINE SWIG_Object SWIG_From_dec(Char)(Char c) { return SWIG_FromCharPtrAndSize(&c,1); } } %fragment(SWIG_AsVal_frag(Char),"header", fragment="SWIG_As"#CharName"Array", fragment=FragLimits, fragment=SWIG_AsVal_frag(long)) { SWIGINTERN int SWIG_AsVal_dec(Char)(SWIG_Object obj, Char *val) { int res = SWIG_As##CharName##Array(obj, val, 1); if (!SWIG_IsOK(res)) { long v; res = SWIG_AddCast(SWIG_AsVal(long)(obj, &v)); if (SWIG_IsOK(res)) { if ((CHAR_MIN <= v) && (v <= CHAR_MAX)) { if (val) *val = %numeric_cast(v, Char); } else { res = SWIG_OverflowError; } } } return res; } } %_typemap_string(StringCode, Char, SWIG_AsCharPtrAndSize, SWIG_FromCharPtrAndSize, SWIG_CharPtrLen, SWIG_CharBufLen, SWIG_As##CharName##Ptr, SWIG_From##CharName##Ptr, SWIG_As##CharName##Array, SWIG_NewCopyCharArray, SWIG_DeleteCharArray) %enddef #endif /* ------------------------------------------------------------ * String typemaps and fragments, with default allocators * ------------------------------------------------------------ */ %define %typemaps_string(StringCode, CharCode, Char, CharName, SWIG_AsCharPtrAndSize, SWIG_FromCharPtrAndSize, SWIG_CharPtrLen, SWIG_CharBufLen, FragLimits, CHAR_MIN, CHAR_MAX) %_typemap2_string(StringCode, CharCode, Char, CharName, SWIG_AsCharPtrAndSize, SWIG_FromCharPtrAndSize, SWIG_CharPtrLen, SWIG_CharBufLen, %new_copy_array, %delete_array, FragLimits, CHAR_MIN, CHAR_MAX) %enddef /* ------------------------------------------------------------ * String typemaps and fragments, with custom allocators * ------------------------------------------------------------ */ %define %typemaps_string_alloc(StringCode, CharCode, Char, CharName, SWIG_AsCharPtrAndSize, SWIG_FromCharPtrAndSize, SWIG_CharPtrLen, SWIG_CharBufLen, SWIG_NewCopyCharArray, SWIG_DeleteCharArray, FragLimits, CHAR_MIN, CHAR_MAX) %_typemap2_string(StringCode, CharCode, Char, CharName, SWIG_AsCharPtrAndSize, SWIG_FromCharPtrAndSize, SWIG_CharPtrLen, SWIG_CharBufLen, SWIG_NewCopyCharArray, SWIG_DeleteCharArray, FragLimits, CHAR_MIN, CHAR_MAX) %enddef swig-4.0.1/Lib/typemaps/valtypes.swg0000644000175000017500000001574313527063513017323 0ustar williamwilliam/*--------------------------------------------------------------------- * Value typemaps (Type, const Type&) for value types, such as * fundamental types (int, double), that define the AsVal/From * methods. * * To apply them, just use one of the following macros: * * %typemaps_from(FromMeth, FromFrag, Type) * %typemaps_asval(CheckCode, AsValMeth, AsValFrag, Type) * %typemaps_asvalfrom(CheckCode, AsValMeth, FromMeth, AsValFrag, FromFrag, Type) * * or the simpler and normalize form: * * %typemaps_asvalfromn(CheckCode, Type) * * Also, you can use the individual typemap definitions: * * %value_in_typemap(asval_meth,frag,Type) * %value_varin_typemap(asval_meth,frag,Type) * %value_typecheck_typemap(checkcode,asval_meth,frag,Type) * %value_directorout_typemap(asval_meth,frag,Type) * * %value_out_typemap(from_meth,frag,Type) * %value_varout_typemap(from_meth,frag,Type) * %value_constcode_typemap(from_meth,frag,Type) * %value_directorin_typemap(from_meth,frag,Type) * %value_throws_typemap(from_meth,frag,Type) * *---------------------------------------------------------------------*/ /* in */ %define %value_in_typemap(asval_meth,frag,Type...) %typemap(in,noblock=1,fragment=frag) Type (Type val, int ecode = 0) { ecode = asval_meth($input, &val); if (!SWIG_IsOK(ecode)) { %argument_fail(ecode, "$ltype", $symname, $argnum); } $1 = %static_cast(val,$ltype); } %typemap(freearg) Type ""; %typemap(in,noblock=1,fragment=frag) const Type & ($*ltype temp, Type val, int ecode = 0) { ecode = asval_meth($input, &val); if (!SWIG_IsOK(ecode)) { %argument_fail(ecode, "$*ltype", $symname, $argnum); } temp = %static_cast(val, $*ltype); $1 = &temp; } %typemap(freearg) const Type& ""; %enddef /* out */ %define %value_out_typemap(from_meth,frag,Type...) %typemap(out,noblock=1,fragment=frag) Type, const Type { %set_output(from_meth(%static_cast($1,Type))); } %typemap(out,noblock=1,fragment=frag) const Type& { %set_output(from_meth(%static_cast(*$1,Type))); } %enddef /* varin */ %define %value_varin_typemap(asval_meth,frag,Type...) %typemap(varin,fragment=frag) Type { Type val; int res = asval_meth($input, &val); if (!SWIG_IsOK(res)) { %variable_fail(res, "$type", "$name"); } $1 = %static_cast(val,$ltype); } %enddef /* varout */ %define %value_varout_typemap(from_meth,frag,Type...) %typemap(varout,noblock=1,fragment=frag) Type, const Type& { %set_varoutput(from_meth(%static_cast($1,Type))); } %enddef /* constant installation code */ %define %value_constcode_typemap(from_meth,frag,Type...) %typemap(constcode,noblock=1,fragment=frag) Type { %set_constant("$symname", from_meth(%static_cast($value,Type))); } %enddef #if defined(SWIG_DIRECTOR_TYPEMAPS) /* directorin */ %define %value_directorin_typemap(from_meth,frag,Type...) %typemap(directorin,noblock=1,fragment=frag) Type *DIRECTORIN { $input = from_meth(%static_cast(*$1,Type)); } %typemap(directorin,noblock=1,fragment=frag) Type, const Type& { $input = from_meth(%static_cast($1,Type)); } %enddef /* directorout */ %define %value_directorout_typemap(asval_meth,frag,Type...) %typemap(directorargout,noblock=1,fragment=frag) Type *DIRECTOROUT(Type swig_val, int swig_res) { swig_res = asval_meth($result, &swig_val); if (!SWIG_IsOK(swig_res)) { %dirout_fail(swig_res, "$type"); } *$1 = swig_val; } %typemap(directorout,noblock=1,fragment=frag) Type { Type swig_val; int swig_res = asval_meth($input, &swig_val); if (!SWIG_IsOK(swig_res)) { %dirout_fail(swig_res, "$type"); } $result = %static_cast(swig_val,$type); } %typemap(directorout,noblock=1,fragment=frag,warning=SWIGWARN_TYPEMAP_DIRECTOROUT_PTR_MSG) const Type& { Type swig_val; int swig_res = asval_meth($input, &swig_val); if (!SWIG_IsOK(swig_res)) { %dirout_fail(swig_res, "$type"); } $basetype *temp = new $basetype(($basetype)swig_val); swig_acquire_ownership(temp); $result = temp; } %typemap(directorfree,noblock=1) const Type & { if (director) { director->swig_release_ownership(%as_voidptr($input)); } } %typemap(directorout,fragment=frag) Type &DIRECTOROUT = Type %enddef #else #define %value_directorin_typemap(from_meth,frag,Type...) #define %value_directorout_typemap(asval_meth,frag,Type...) #endif /* SWIG_DIRECTOR_TYPEMAPS */ /* throws */ %define %value_throws_typemap(from_meth,frag,Type...) %typemap(throws,noblock=1,fragment=frag) Type { %raise(from_meth(%static_cast($1,Type)), "$type", 0); } %enddef /* typecheck */ %define %value_typecheck_typemap(check,asval_meth,frag,Type...) %typemap(typecheck,precedence=check,fragment=frag) Type, const Type& { int res = asval_meth($input, NULL); $1 = SWIG_CheckState(res); } %enddef /*--------------------------------------------------------------------- * typemap definition for types with AsVal methods *---------------------------------------------------------------------*/ %define %typemaps_asval(CheckCode, AsValMeth, AsValFrag, Type...) %value_in_typemap(%arg(AsValMeth), %arg(AsValFrag), Type); %value_varin_typemap(%arg(AsValMeth), %arg(AsValFrag), Type); %value_directorout_typemap(%arg(AsValMeth), %arg(AsValFrag), Type); %value_typecheck_typemap(%arg(CheckCode), %arg(AsValMeth), %arg(AsValFrag), Type); %value_input_typemap(%arg(CheckCode), %arg(AsValMeth), %arg(AsValFrag), Type); %enddef /*--------------------------------------------------------------------- * typemap definition for types with from method *---------------------------------------------------------------------*/ %define %typemaps_from(FromMeth, FromFrag, Type...) %value_out_typemap(%arg(FromMeth), %arg(FromFrag), Type); %value_varout_typemap(%arg(FromMeth), %arg(FromFrag), Type); %value_constcode_typemap(%arg(FromMeth), %arg(FromFrag), Type); %value_directorin_typemap(%arg(FromMeth), %arg(FromFrag), Type); %value_throws_typemap(%arg(FromMeth), %arg(FromFrag), Type); %value_output_typemap(%arg(FromMeth), %arg(FromFrag), Type); %enddef /*--------------------------------------------------------------------- * typemap definition for types with alval/from method *---------------------------------------------------------------------*/ %define %typemaps_asvalfrom(CheckCode, AsValMeth, FromMeth, AsValFrag, FromFrag, Type...) %typemaps_asval(%arg(CheckCode), %arg(AsValMeth), %arg(AsValFrag), Type); %typemaps_from(%arg(FromMeth), %arg(FromFrag), Type); %value_inout_typemap(Type); %enddef /*--------------------------------------------------------------------- * typemap definition for types with for 'normalized' asval/from methods *---------------------------------------------------------------------*/ %define %typemaps_asvalfromn(CheckCode, Type...) %typemaps_asvalfrom(%arg(CheckCode), SWIG_AsVal(Type), SWIG_From(Type), %arg(SWIG_AsVal_frag(Type)), %arg(SWIG_From_frag(Type)), Type); %enddef swig-4.0.1/Lib/typemaps/misctypes.swg0000644000175000017500000000072313527063513017464 0ustar williamwilliam /* ------------------------------------------------------------ * --- ANSI/Posix C/C++ types --- * ------------------------------------------------------------ */ #ifdef __cplusplus %apply size_t { std::size_t }; %apply const size_t& { const std::size_t& }; %apply ptrdiff_t { std::ptrdiff_t }; %apply const ptrdiff_t& { const std::ptrdiff_t& }; #ifndef SWIG_INOUT_NODEF %apply size_t& { std::size_t& }; %apply ptrdiff_t& { std::ptrdiff_t& }; #endif #endif swig-4.0.1/Lib/typemaps/string.swg0000644000175000017500000000141113527063513016745 0ustar williamwilliam%ensure_fragment(SWIG_AsCharPtrAndSize) %ensure_fragment(SWIG_FromCharPtrAndSize) %types(char *); %fragment("SWIG_pchar_descriptor","header") { SWIGINTERN swig_type_info* SWIG_pchar_descriptor(void) { static int init = 0; static swig_type_info* info = 0; if (!init) { info = SWIG_TypeQuery("_p_char"); init = 1; } return info; } } %fragment("SWIG_strnlen","header",fragment="SWIG_FromCharPtrAndSize") { SWIGINTERN size_t SWIG_strnlen(const char* s, size_t maxlen) { const char *p; for (p = s; maxlen-- && *p; p++) ; return p - s; } } %include %typemaps_string(%checkcode(STRING), %checkcode(CHAR), char, Char, SWIG_AsCharPtrAndSize, SWIG_FromCharPtrAndSize, strlen, SWIG_strnlen, "", CHAR_MIN, CHAR_MAX) swig-4.0.1/Lib/typemaps/std_except.swg0000644000175000017500000000233413527063513017606 0ustar williamwilliam%include /* Mark all of std exception classes as "exception classes" via the "exceptionclass" feature. If needed, you can disable it by using %noexceptionclass. */ %define %std_exception_map(Exception, Code) %exceptionclass Exception; #if !defined(SWIG_STD_EXCEPTIONS_AS_CLASSES) %typemap(throws,noblock=1) Exception { SWIG_exception_fail(Code, $1.what()); } %ignore Exception; struct Exception { }; #endif %enddef namespace std { %std_exception_map(bad_cast, SWIG_TypeError); %std_exception_map(bad_exception, SWIG_SystemError); %std_exception_map(domain_error, SWIG_ValueError); %std_exception_map(exception, SWIG_SystemError); %std_exception_map(invalid_argument, SWIG_ValueError); %std_exception_map(length_error, SWIG_IndexError); %std_exception_map(logic_error, SWIG_RuntimeError); %std_exception_map(out_of_range, SWIG_IndexError); %std_exception_map(overflow_error, SWIG_OverflowError); %std_exception_map(range_error, SWIG_OverflowError); %std_exception_map(runtime_error, SWIG_RuntimeError); %std_exception_map(underflow_error, SWIG_OverflowError); } %include swig-4.0.1/Lib/typemaps/implicit.swg0000644000175000017500000001156213527063513017261 0ustar williamwilliam/* The %implicit macro allows a SwigType (Class) to be accepted as an input parameter and use its implicit constructors when needed. For example: %implicit(A, int, double, B); %inline { struct B { }; struct A { int ii; A(int i) { ii = 1; } A(double d) { ii = 2; } A(const B& b) { ii = 3; } }; int get(A a) { return a.ii; } } Here, you can call 'get' as get(1) ==> get(A(1)) get(2.0) ==> get(A(2.0)) get(B()) ==> get(A(B())) and swig will construct an 'A' temporal variable using the corresponding implicit constructor. The plain implicit macro takes care of simple type list. If it doesn't work because you are passing template types with commas, then use the %implicit_{1,2,3} versions and/or the %arg macro. */ %define %implicit_type(Type...) %traits_swigtype(Type); %enddef %define %implicit_frag(Type...) ,fragment=SWIG_Traits_frag(Type) %enddef %define %implicit_code(Type...) { Type _v; int res = swig::asval(obj, &_v); if (SWIG_IsOK(res)) { if (val) *val = new value_type(static_cast(_v)); return SWIG_AddNewMask(res); } } %enddef /* implicit */ %define %implicit(Type, ...) %formacro_1(%implicit_type,__VA_ARGS__); %fragment(SWIG_Traits_frag(Type),"header", fragment="StdTraits" %formacro_1(%implicit_frag,__VA_ARGS__)) %{ namespace swig { template <> struct traits { typedef pointer_category category; static const char* type_name() { return "Type"; } }; template <> struct traits_asptr< Type > { typedef Type value_type; static int asptr(SWIG_Object obj, value_type **val) { Type *vptr; static swig_type_info* descriptor = SWIG_TypeQuery("Type *"); int res = descriptor ? SWIG_ConvertPtr(obj, (void **)&vptr, descriptor, 0) : SWIG_ERROR; if (SWIG_IsOK(res)) { if (val) *val = vptr; return res; } else { %formacro_1(%implicit_code,__VA_ARGS__) } return SWIG_TypeError; } }; } %} %typemap_traits_ptr(%checkcode(POINTER),Type); %enddef /* implicit_1 */ %define %implicit_1(Type, Imp1) %traits_swigtype(Imp1); %fragment(SWIG_Traits_frag(Type),"header", fragment="StdTraits", fragment=SWIG_Traits_frag(Imp1)) %{ namespace swig { template <> struct traits< Type > { typedef pointer_category category; static const char* type_name() { return "Type"; } }; template <> struct traits_asptr< Type > { typedef Type value_type; static int asptr(SWIG_Object obj, value_type **val) { Type *vptr; static swig_type_info* descriptor = SWIG_TypeQuery("Type *"); int res = descriptor ? SWIG_ConvertPtr(obj, (void **)&vptr, descriptor, 0) : SWIG_ERROR; if (SWIG_IsOK(res)) { if (val) *val = vptr; return res; } else { %implicit_code(Imp1); } return SWIG_TypeError; } }; } %} %typemap_traits_ptr(%checkcode(POINTER),Type); %enddef /* implicit_2 */ %define %implicit_2(Type, Imp1, Imp2) %traits_swigtype(Imp1); %traits_swigtype(Imp2); %fragment(SWIG_Traits_frag(Type),"header", fragment="StdTraits", fragment=SWIG_Traits_frag(Imp1), fragment=SWIG_Traits_frag(Imp2)) %{ namespace swig { template <> struct traits< Type > { typedef pointer_category category; static const char* type_name() { return "Type"; } }; template <> struct traits_asptr< Type > { typedef Type value_type; static int asptr(SWIG_Object obj, value_type **val) { Type *vptr; static swig_type_info* descriptor = SWIG_TypeQuery("Type *"); int res = descriptor ? SWIG_ConvertPtr(obj, (void **)&vptr, descriptor, 0) : SWIG_ERROR; if (SWIG_IsOK(res)) { if (val) *val = vptr; return SWIG_OLDOBJ; } else { %implicit_code(Imp1); %implicit_code(Imp2); } return SWIG_TypeError; } }; } %} %typemap_traits_ptr(%checkcode(POINTER),Type); %enddef /* implicit_3 */ %define %implicit_3(Type, Imp1, Imp2, Imp3) %traits_swigtype(Imp1); %traits_swigtype(Imp2); %traits_swigtype(Imp3); %fragment(SWIG_Traits_frag(Type),"header", fragment="StdTraits", fragment=SWIG_Traits_frag(Imp1), fragment=SWIG_Traits_frag(Imp2), fragment=SWIG_Traits_frag(Imp3)) %{ namespace swig { template <> struct traits< Type > { typedef pointer_category category; static const char* type_name() { return "Type"; } }; template <> struct traits_asptr< Type > { typedef Type value_type; static int asptr(SWIG_Object obj, value_type **val) { Type *vptr; static swig_type_info* descriptor = SWIG_TypeQuery("Type *"); int res = descriptor ? SWIG_ConvertPtr(obj, (void **)&vptr, descriptor, 0) : SWIG_ERROR; if (SWIG_IsOK(res)) { if (val) *val = vptr; return res; } else { %implicit_code(Imp1); %implicit_code(Imp2); %implicit_code(Imp3); } return SWIG_TypeError; } }; } %} %typemap_traits_ptr(%checkcode(POINTER),Type); %enddef swig-4.0.1/Lib/typemaps/swigobject.swg0000644000175000017500000000157613527063513017613 0ustar williamwilliam/* ------------------------------------------------------------ * Language Object * - Just pass straight through unmodified * ------------------------------------------------------------ */ %typemap(in) SWIG_Object "$1 = $input;"; %typemap(in,noblock=1) SWIG_Object const & ($*ltype temp) { temp = %static_cast($input, $*ltype); $1 = &temp; } %typemap(out,noblock=1) SWIG_Object { %set_output($1); } %typemap(out,noblock=1) SWIG_Object const & { %set_output(*$1); } %typecheck(SWIG_TYPECHECK_SWIGOBJECT) SWIG_Object "$1 = ($input != 0);"; %typemap(throws,noblock=1) SWIG_Object { %raise($1, "$type", 0); } %typemap(constcode,noblock=1) SWIG_Object { %set_constant("$symname", $value); } #if defined(SWIG_DIRECTOR_TYPEMAPS) %typemap(directorin) SWIG_Object "$input = $1;"; %typemap(directorout) SWIG_Object "$result = $input;"; #endif /* SWIG_DIRECTOR_TYPEMAPS */ swig-4.0.1/Lib/typemaps/cdata.swg0000644000175000017500000000352013527063513016516 0ustar williamwilliam/* ----------------------------------------------------------------------------- * cdata.swg * * This library file contains macros for manipulating raw C data as strings. * ----------------------------------------------------------------------------- */ %{ typedef struct SWIGCDATA { char *data; size_t len; } SWIGCDATA; %} /* ----------------------------------------------------------------------------- * Typemaps for returning binary data * ----------------------------------------------------------------------------- */ %typemap(out,noblock=1,fragment="SWIG_FromCharPtrAndSize") SWIGCDATA { %set_output(SWIG_FromCharPtrAndSize($1.data,$1.len)); } %typemap(in) (const void *indata, size_t inlen) = (char *STRING, size_t SIZE); /* ----------------------------------------------------------------------------- * %cdata(TYPE [, NAME]) * * Convert raw C data to a binary string. * ----------------------------------------------------------------------------- */ %define %cdata(TYPE,NAME...) %insert("header") { #ifdef __cplusplus extern "C" { #endif #if #NAME == "" static SWIGCDATA cdata_##TYPE(TYPE *ptr, size_t nelements) #else static SWIGCDATA cdata_##NAME(TYPE *ptr, size_t nelements) #endif { SWIGCDATA d; d.data = (char *) ptr; #if #TYPE != "void" d.len = nelements*sizeof(TYPE); #else d.len = nelements; #endif return d; } #ifdef __cplusplus } #endif } #ifdef __cplusplus extern "C" #endif #if #NAME == "" SWIGCDATA cdata_##TYPE(TYPE *ptr, size_t nelements = 1); #else SWIGCDATA cdata_##NAME(TYPE *ptr, size_t nelements = 1); #endif %enddef %rename(cdata) ::cdata_void(void *ptr, size_t nelements = 1); %cdata(void); /* Memory move function. Due to multi-argument typemaps this appears to be wrapped as void memmove(void *data, const char *s); */ void memmove(void *data, const void *indata, size_t inlen); swig-4.0.1/Lib/typemaps/inoutlist.swg0000644000175000017500000002241113527063513017474 0ustar williamwilliam/* ------------------------------------------------------------ * * Define the IN/OUTPUT typemaps assuming the output parameters are * returned in a list, i.e., they are not directly modified. * * The user should provide the %append_output(result, obj) method, * via a macro, which append a particular object to the result. * * * In Tcl, for example, the file is used as: * * #define %append_output(obj) Tcl_ListObjAppendElement(interp,Tcl_GetObjResult(interp),obj); * %include * * while in Python it is used as: * * #define %append_output(obj) $result = SWIG_Python_AppendResult($result, obj) * %include * * where the method SWIG_Python_AppendResult is defined inside the * %append_output fragment. * * If you forget to define %append_output, this file will generate * an error. * * ------------------------------------------------------------ */ // // Uncomment the following definition if you don't want the in/out // typemaps by default, ie, you prefer to use typemaps.i. // //#define SWIG_INOUT_NODEF // // Use the following definition to enable the INPUT parameters to // accept both 'by value' and 'pointer' objects. // #define SWIG_INPUT_ACCEPT_PTRS // ------------------------------------------------------------------------ // Pointer handling // // These mappings provide support for input/output arguments and common // uses for C/C++ pointers. // ------------------------------------------------------------------------ // INPUT typemaps. // These remap a C pointer to be an "INPUT" value which is passed by value // instead of reference. /* The following methods can be applied to turn a pointer into a simple "input" value. That is, instead of passing a pointer to an object, you would use a real value instead. To use these, suppose you had a C function like this : double fadd(double *a, double *b) { return *a+*b; } You could wrap it with SWIG as follows : double fadd(double *INPUT, double *INPUT); or you can use the %apply directive : %apply double *INPUT { double *a, double *b }; double fadd(double *a, double *b); */ #if defined(SWIG_INPUT_ACCEPT_PTRS) #define %check_input_ptr(input,arg,desc,disown) (SWIG_IsOK((res = SWIG_ConvertPtr(input,%as_voidptrptr(arg),desc,disown)))) #else #define %check_input_ptr(input,arg,desc,disown) (SWIG_IsOK((res = SWIG_ERROR))) #endif %define %_value_input_typemap(code, asval_meth, asval_frag, Type) %typemap(in,noblock=1,fragment=asval_frag) Type *INPUT ($*ltype temp, int res = 0) { if (!%check_input_ptr($input,&$1,$descriptor,$disown)) { Type val; int ecode = asval_meth($input, &val); if (!SWIG_IsOK(ecode)) { %argument_fail(ecode, "$*ltype",$symname, $argnum); } temp = %static_cast(val, $*ltype); $1 = &temp; res = SWIG_AddTmpMask(ecode); } } %typemap(in,noblock=1,fragment=asval_frag) Type &INPUT($*ltype temp, int res = 0) { if (!%check_input_ptr($input,&$1,$descriptor,$disown)) { Type val; int ecode = asval_meth($input, &val); if (!SWIG_IsOK(ecode)) { %argument_fail(ecode, "$*ltype",$symname, $argnum); } temp = %static_cast(val, $*ltype); $1 = &temp; res = SWIG_AddTmpMask(ecode); } } %typemap(freearg,noblock=1,match="in") Type *INPUT, Type &INPUT { if (SWIG_IsNewObj(res$argnum)) %delete($1); } %typemap(typecheck,noblock=1,precedence=code,fragment=asval_frag) Type *INPUT, Type &INPUT { void *ptr = 0; int res = asval_meth($input, 0); $1 = SWIG_CheckState(res); if (!$1) { $1 = %check_input_ptr($input,&ptr,$1_descriptor,0); } } %enddef %define %_ptr_input_typemap(code,asptr_meth,asptr_frag,Type) %typemap(in,noblock=1,fragment=asptr_frag) Type *INPUT(int res = 0) { res = asptr_meth($input, &$1); if (!SWIG_IsOK(res)) { %argument_fail(res,"$type",$symname, $argnum); } res = SWIG_AddTmpMask(res); } %typemap(in,noblock=1,fragment=asptr_frag) Type &INPUT(int res = 0) { res = asptr_meth($input, &$1); if (!SWIG_IsOK(res)) { %argument_fail(res,"$type",$symname, $argnum); } if (!$1) { %argument_nullref("$type",$symname, $argnum); } res = SWIG_AddTmpMask(res); } %typemap(freearg,noblock=1,match="in") Type *INPUT, Type &INPUT { if (SWIG_IsNewObj(res$argnum)) %delete($1); } %typemap(typecheck,noblock=1,precedence=code,fragment=asptr_frag) Type *INPUT, Type &INPUT { int res = asptr_meth($input, (Type**)0); $1 = SWIG_CheckState(res); } %enddef // OUTPUT typemaps. These typemaps are used for parameters that // are output only. The output value is appended to the result as // a list element. /* The following methods can be applied to turn a pointer into an "output" value. When calling a function, no input value would be given for a parameter, but an output value would be returned. In the case of multiple output values, they are returned in the form of a list. For example, suppose you were trying to wrap the modf() function in the C math library which splits x into integral and fractional parts (and returns the integer part in one of its parameters): double modf(double x, double *ip); You could wrap it with SWIG as follows : double modf(double x, double *OUTPUT); or you can use the %apply directive : %apply double *OUTPUT { double *ip }; double modf(double x, double *ip); The output of the function would be a list containing both output values. */ %define %_value_output_typemap(from_meth, from_frag, Type) %typemap(in,numinputs=0,noblock=1) Type *OUTPUT ($*1_ltype temp, int res = SWIG_TMPOBJ), Type &OUTPUT ($*1_ltype temp, int res = SWIG_TMPOBJ) { $1 = &temp; } %typemap(argout,noblock=1,fragment=from_frag) Type *OUTPUT, Type &OUTPUT { if (SWIG_IsTmpObj(res$argnum)) { %append_output(from_meth((*$1))); } else { int new_flags = SWIG_IsNewObj(res$argnum) ? (SWIG_POINTER_OWN | %newpointer_flags) : %newpointer_flags; %append_output(SWIG_NewPointerObj((void*)($1), $1_descriptor, new_flags)); } } %enddef // INOUT // Mappings for an argument that is both an input and output // parameter /* The following methods can be applied to make a function parameter both an input and output value. This combines the behavior of both the "INPUT" and "OUTPUT" methods described earlier. Output values are returned in the form of a list. For example, suppose you were trying to wrap the following function : void neg(double *x) { *x = -(*x); } You could wrap it with SWIG as follows : void neg(double *INOUT); or you can use the %apply directive : %apply double *INOUT { double *x }; void neg(double *x); Unlike C, this mapping does not directly modify the input value. Rather, the modified input value shows up as the return value of the function. Thus, to apply this function to a variable you might do this : x = neg(x) Note : previous versions of SWIG used the symbol 'BOTH' to mark input/output arguments. This is still supported, but will be slowly phased out in future releases. */ %define %_value_inout_typemap(Type) %typemap(in) Type *INOUT = Type *INPUT; %typemap(in) Type &INOUT = Type &INPUT; %typemap(typecheck) Type *INOUT = Type *INPUT; %typemap(typecheck) Type &INOUT = Type &INPUT; %typemap(argout) Type *INOUT = Type *OUTPUT; %typemap(argout) Type &INOUT = Type &OUTPUT; %enddef %define %_ptr_inout_typemap(Type) %_value_inout_typemap(%arg(Type)) %typemap(typecheck) Type *INOUT = Type *INPUT; %typemap(typecheck) Type &INOUT = Type &INPUT; %typemap(freearg) Type *INOUT = Type *INPUT; %typemap(freearg) Type &INOUT = Type &INPUT; %enddef #ifndef SWIG_INOUT_NODEF %define %value_input_typemap(code,asval_meth, asval_frag, Type...) %_value_input_typemap(%arg(code),%arg(asval_meth),%arg(asval_frag),%arg(Type)) %enddef %define %ptr_input_typemap(code,asval_meth,asval_frag,Type...) %_ptr_input_typemap(%arg(code),%arg(asval_meth),%arg(asval_frag),%arg(Type)) %enddef %define %value_output_typemap(from_meth,from_frag,Type...) %_value_output_typemap(%arg(from_meth),%arg(from_frag),%arg(Type)) %enddef #define %value_inout_typemap(Type...) %_value_inout_typemap(%arg(Type)) #define %ptr_inout_typemap(Type...) %_ptr_inout_typemap(%arg(Type)) #else /* You need to include typemaps.i */ #define %value_output_typemap(Type...) #define %value_input_typemap(Type...) #define %value_inout_typemap(Type...) #define %ptr_input_typemap(Type...) #define %ptr_inout_typemap(Type...) #endif /* SWIG_INOUT_DEFAULT */ /*---------------------------------------------------------------------- Front ends. use the following macros to define your own IN/OUTPUT/INOUT typemaps ------------------------------------------------------------------------*/ %define %typemaps_inout(Code, AsValMeth, FromMeth, AsValFrag, FromFrag, Type...) %_value_input_typemap(%arg(Code), %arg(AsValMeth), %arg(AsValFrag), %arg(Type)); %_value_output_typemap(%arg(FromMeth), %arg(FromFrag), %arg(Type)); %_value_inout_typemap(%arg(Type)); %enddef %define %typemaps_inoutn(Code,Type...) %typemaps_inout(%arg(Code), %arg(SWIG_AsVal(Type)), %arg(SWIG_From(Type)), %arg(SWIG_AsVal_frag(Type)), %arg(SWIG_From_frag(Type)), %arg(Type)); %enddef swig-4.0.1/Lib/typemaps/swigtype.swg0000644000175000017500000005646413527063513017334 0ustar williamwilliam/* ----------------------------------------------------------------------------- * --- Input arguments --- * ----------------------------------------------------------------------------- */ /* Pointers and arrays */ %typemap(in, noblock=1) SWIGTYPE *(void *argp = 0, int res = 0) { res = SWIG_ConvertPtr($input, &argp,$descriptor, $disown | %convertptr_flags); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } $1 = %reinterpret_cast(argp, $ltype); } %typemap(freearg) SWIGTYPE * ""; %typemap(in, noblock=1) SWIGTYPE [] (void *argp = 0, int res = 0) { res = SWIG_ConvertPtr($input, &argp,$descriptor, $disown | %convertptr_flags); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } $1 = %reinterpret_cast(argp, $ltype); } %typemap(freearg) SWIGTYPE [] ""; %typemap(in, noblock=1) SWIGTYPE *const& (void *argp = 0, int res = 0, $*1_ltype temp) { res = SWIG_ConvertPtr($input, &argp, $*descriptor, $disown | %convertptr_flags); if (!SWIG_IsOK(res)) { %argument_fail(res, "$*ltype", $symname, $argnum); } temp = %reinterpret_cast(argp, $*ltype); $1 = %reinterpret_cast(&temp, $1_ltype); } %typemap(freearg) SWIGTYPE *const& ""; /* Reference */ %typemap(in, noblock=1) SWIGTYPE & (void *argp = 0, int res = 0) { res = SWIG_ConvertPtr($input, &argp, $descriptor, %convertptr_flags); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } if (!argp) { %argument_nullref("$type", $symname, $argnum); } $1 = %reinterpret_cast(argp, $ltype); } %typemap(freearg) SWIGTYPE & ""; #if defined(__cplusplus) && defined(%implicitconv_flag) %typemap(in,noblock=1,implicitconv=1) const SWIGTYPE & (void *argp = 0, int res = 0) { res = SWIG_ConvertPtr($input, &argp, $descriptor, %convertptr_flags | %implicitconv_flag); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } if (!argp) { %argument_nullref("$type", $symname, $argnum); } $1 = %reinterpret_cast(argp, $ltype); } %typemap(freearg,noblock=1,match="in",implicitconv=1) const SWIGTYPE & { if (SWIG_IsNewObj(res$argnum)) %delete($1); } #else %typemap(in,noblock=1) const SWIGTYPE & (void *argp, int res = 0) { res = SWIG_ConvertPtr($input, &argp, $descriptor, %convertptr_flags); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } if (!argp) { %argument_nullref("$type", $symname, $argnum); } $1 = %reinterpret_cast(argp, $ltype); } #endif /* Rvalue reference */ %typemap(in, noblock=1) SWIGTYPE && (void *argp = 0, int res = 0) { res = SWIG_ConvertPtr($input, &argp, $descriptor, %convertptr_flags); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } if (!argp) { %argument_nullref("$type", $symname, $argnum); } $1 = %reinterpret_cast(argp, $ltype); } %typemap(freearg) SWIGTYPE && ""; #if defined(__cplusplus) && defined(%implicitconv_flag) %typemap(in,noblock=1,implicitconv=1) const SWIGTYPE && (void *argp = 0, int res = 0) { res = SWIG_ConvertPtr($input, &argp, $descriptor, %convertptr_flags | %implicitconv_flag); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } if (!argp) { %argument_nullref("$type", $symname, $argnum); } $1 = %reinterpret_cast(argp, $ltype); } %typemap(freearg,noblock=1,match="in",implicitconv=1) const SWIGTYPE && { if (SWIG_IsNewObj(res$argnum)) %delete($1); } #else %typemap(in,noblock=1) const SWIGTYPE && (void *argp, int res = 0) { res = SWIG_ConvertPtr($input, &argp, $descriptor, %convertptr_flags); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } if (!argp) { %argument_nullref("$type", $symname, $argnum); } $1 = %reinterpret_cast(argp, $ltype); } #endif /* By value */ #if defined(__cplusplus) && defined(%implicitconv_flag) %typemap(in,implicitconv=1) SWIGTYPE (void *argp, int res = 0) { res = SWIG_ConvertPtr($input, &argp, $&descriptor, %convertptr_flags | %implicitconv_flag); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } if (!argp) { %argument_nullref("$type", $symname, $argnum); } else { $<ype temp = %reinterpret_cast(argp, $<ype); $1 = *temp; if (SWIG_IsNewObj(res)) %delete(temp); } } #else %typemap(in) SWIGTYPE (void *argp, int res = 0) { res = SWIG_ConvertPtr($input, &argp, $&descriptor, %convertptr_flags); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } if (!argp) { %argument_nullref("$type", $symname, $argnum); } else { $1 = *(%reinterpret_cast(argp, $<ype)); } } #endif /* ----------------------------------------------------------------------------- * --- Output arguments --- * ----------------------------------------------------------------------------- */ /* Pointers, references */ %typemap(out,noblock=1) SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE[] { %set_output(SWIG_NewPointerObj(%as_voidptr($1), $descriptor, $owner | %newpointer_flags)); } %typemap(out, noblock=1) SWIGTYPE *const& { %set_output(SWIG_NewPointerObj(%as_voidptr(*$1), $*descriptor, $owner | %newpointer_flags)); } /* Return by value */ %typemap(out, noblock=1) SWIGTYPE { %set_output(SWIG_NewPointerObj(%new_copy($1, $ltype), $&descriptor, SWIG_POINTER_OWN | %newpointer_flags)); } /* ----------------------------------------------------------------------------- * --- Variable input --- * ----------------------------------------------------------------------------- */ /* memberin/globalin/varin, for fix arrays. */ %typemap(memberin) SWIGTYPE [ANY] { if ($input) { size_t ii = 0; for (; ii < (size_t)$1_dim0; ++ii) *($1_basetype *)&$1[ii] = *(($1_basetype *)$input + ii); } else { %variable_nullref("$type","$name"); } } %typemap(globalin) SWIGTYPE [ANY] { if ($input) { size_t ii = 0; for (; ii < (size_t)$1_dim0; ++ii) *($1_basetype *)&$1[ii] = *(($1_basetype *)$input + ii); } else { %variable_nullref("$type","$name"); } } %typemap(varin) SWIGTYPE [ANY] { $basetype *inp = 0; int res = SWIG_ConvertPtr($input, %as_voidptrptr(&inp), $descriptor, %convertptr_flags); if (!SWIG_IsOK(res)) { %variable_fail(res, "$type", "$name"); } else if (inp) { size_t ii = 0; for (; ii < (size_t)$1_dim0; ++ii) *($1_basetype *)&$1[ii] = *(($1_basetype *)inp + ii); } else { %variable_nullref("$type", "$name"); } } /* memberin/globalin/varin, for fix double arrays. */ %typemap(memberin) SWIGTYPE [ANY][ANY] { if ($input) { size_t ii = 0; for (; ii < (size_t)$1_dim0; ++ii) { if ($input[ii]) { size_t jj = 0; for (; jj < (size_t)$1_dim1; ++jj) $1[ii][jj] = $input[ii][jj]; } else { %variable_nullref("$type","$name"); } } } else { %variable_nullref("$type","$name"); } } %typemap(globalin) SWIGTYPE [ANY][ANY] { if ($input) { size_t ii = 0; for (; ii < (size_t)$1_dim0; ++ii) { if ($input[ii]) { size_t jj = 0; for (; jj < (size_t)$1_dim1; ++jj) $1[ii][jj] = $input[ii][jj]; } else { %variable_nullref("$type","$name"); } } } else { %variable_nullref("$type","$name"); } } %typemap(varin) SWIGTYPE [ANY][ANY] { $basetype (*inp)[$1_dim1] = 0; int res = SWIG_ConvertPtr($input, %as_voidptrptr(&inp), $descriptor, %convertptr_flags); if (!SWIG_IsOK(res)) { %variable_fail(res, "$type", "$name"); } else if (inp) { size_t ii = 0; for (; ii < (size_t)$1_dim0; ++ii) { if (inp[ii]) { size_t jj = 0; for (; jj < (size_t)$1_dim1; ++jj) $1[ii][jj] = inp[ii][jj]; } else { %variable_nullref("$type", "$name"); } } } else { %variable_nullref("$type", "$name"); } } /* Pointers, references, and variable size arrays */ %typemap(varin,warning=SWIGWARN_TYPEMAP_SWIGTYPELEAK_MSG) SWIGTYPE * { void *argp = 0; int res = SWIG_ConvertPtr($input, &argp, $descriptor, %convertptr_flags); if (!SWIG_IsOK(res)) { %variable_fail(res, "$type", "$name"); } $1 = %reinterpret_cast(argp, $ltype); } %typemap(varin,noblock=1,warning="462:Unable to set dimensionless array variable") SWIGTYPE [] { %variable_fail(SWIG_AttributeError, "$type", "read-only $name"); } %typemap(varin,warning=SWIGWARN_TYPEMAP_SWIGTYPELEAK_MSG) SWIGTYPE & { void *argp = 0; int res = SWIG_ConvertPtr($input, &argp, $descriptor, %convertptr_flags); if (!SWIG_IsOK(res)) { %variable_fail(res, "$type", "$name"); } if (!argp) { %variable_nullref("$type", "$name"); } $1 = *(%reinterpret_cast(argp, $ltype)); } %typemap(varin,warning=SWIGWARN_TYPEMAP_SWIGTYPELEAK_MSG) SWIGTYPE && { void *argp = 0; int res = SWIG_ConvertPtr($input, &argp, $descriptor, %convertptr_flags); if (!SWIG_IsOK(res)) { %variable_fail(res, "$type", "$name"); } if (!argp) { %variable_nullref("$type", "$name"); } $1 = *(%reinterpret_cast(argp, $ltype)); } #if defined(__cplusplus) && defined(%implicitconv_flag) %typemap(varin,implicitconv=1) SWIGTYPE { void *argp = 0; int res = SWIG_ConvertPtr($input, &argp, $&descriptor, %convertptr_flags | %implicitconv_flag); if (!SWIG_IsOK(res)) { %variable_fail(res, "$type", "$name"); } if (!argp) { %variable_nullref("$type", "$name"); } else { $&type temp; temp = %reinterpret_cast(argp, $&type); $1 = *temp; if (SWIG_IsNewObj(res)) %delete(temp); } } #else %typemap(varin) SWIGTYPE { void *argp = 0; int res = SWIG_ConvertPtr($input, &argp, $&descriptor, %convertptr_flags); if (!SWIG_IsOK(res)) { %variable_fail(res, "$type", "$name"); } if (!argp) { %variable_nullref("$type", "$name"); } else { $1 = *(%reinterpret_cast(argp, $&type)); } } #endif /* ----------------------------------------------------------------------------- * --- Variable output --- * ----------------------------------------------------------------------------- */ /* Pointers and arrays */ %typemap(varout, noblock=1) SWIGTYPE * { %set_varoutput(SWIG_NewPointerObj(%as_voidptr($1), $descriptor, %newpointer_flags)); } %typemap(varout, noblock=1) SWIGTYPE [] { %set_varoutput(SWIG_NewPointerObj(%as_voidptr($1), $descriptor, %newpointer_flags)); } /* References */ %typemap(varout, noblock=1) SWIGTYPE & { %set_varoutput(SWIG_NewPointerObj(%as_voidptr(&$1), $descriptor, %newpointer_flags)); } %typemap(varout, noblock=1) SWIGTYPE && { %set_varoutput(SWIG_NewPointerObj(%as_voidptr(&$1), $descriptor, %newpointer_flags)); } /* Value */ %typemap(varout, noblock=1) SWIGTYPE { %set_varoutput(SWIG_NewPointerObj(%as_voidptr(&$1), $&descriptor, %newpointer_flags)); } /* ------------------------------------------------------------ * --- Typechecking rules --- * ------------------------------------------------------------ */ %typemap(typecheck,precedence=SWIG_TYPECHECK_POINTER,noblock=1) SWIGTYPE * { void *vptr = 0; int res = SWIG_ConvertPtr($input, &vptr, $descriptor, 0); $1 = SWIG_CheckState(res); } %typemap(typecheck,precedence=SWIG_TYPECHECK_POINTER,noblock=1) SWIGTYPE *const& { void *vptr = 0; int res = SWIG_ConvertPtr($input, &vptr, $*descriptor, 0); $1 = SWIG_CheckState(res); } %typemap(typecheck,precedence=SWIG_TYPECHECK_POINTER,noblock=1) SWIGTYPE & { void *vptr = 0; int res = SWIG_ConvertPtr($input, &vptr, $descriptor, SWIG_POINTER_NO_NULL); $1 = SWIG_CheckState(res); } %typemap(typecheck,precedence=SWIG_TYPECHECK_POINTER,noblock=1) SWIGTYPE && { void *vptr = 0; int res = SWIG_ConvertPtr($input, &vptr, $descriptor, SWIG_POINTER_NO_NULL); $1 = SWIG_CheckState(res); } #if defined(__cplusplus) && defined(%implicitconv_flag) %typemap(typecheck,precedence=SWIG_TYPECHECK_POINTER,noblock=1,implicitconv=1) const SWIGTYPE & { int res = SWIG_ConvertPtr($input, 0, $descriptor, SWIG_POINTER_NO_NULL | %implicitconv_flag); $1 = SWIG_CheckState(res); } %typemap(typecheck,precedence=SWIG_TYPECHECK_POINTER,noblock=1,implicitconv=1) const SWIGTYPE && { int res = SWIG_ConvertPtr($input, 0, $descriptor, SWIG_POINTER_NO_NULL | %implicitconv_flag); $1 = SWIG_CheckState(res); } %typemap(typecheck,precedence=SWIG_TYPECHECK_POINTER,noblock=1,implicitconv=1) SWIGTYPE { int res = SWIG_ConvertPtr($input, 0, $&descriptor, SWIG_POINTER_NO_NULL | %implicitconv_flag); $1 = SWIG_CheckState(res); } #else %typemap(typecheck,precedence=SWIG_TYPECHECK_POINTER,noblock=1) const SWIGTYPE & { void *vptr = 0; int res = SWIG_ConvertPtr($input, &vptr, $descriptor, SWIG_POINTER_NO_NULL); $1 = SWIG_CheckState(res); } %typemap(typecheck,precedence=SWIG_TYPECHECK_POINTER,noblock=1) const SWIGTYPE && { void *vptr = 0; int res = SWIG_ConvertPtr($input, &vptr, $descriptor, SWIG_POINTER_NO_NULL); $1 = SWIG_CheckState(res); } %typemap(typecheck,precedence=SWIG_TYPECHECK_POINTER,noblock=1) SWIGTYPE { void *vptr = 0; int res = SWIG_ConvertPtr($input, &vptr, $&descriptor, SWIG_POINTER_NO_NULL); $1 = SWIG_CheckState(res); } #endif /* ----------------------------------------------------------------------------- * --- Director typemaps --- * * ----------------------------------------------------------------------------- */ #if defined(SWIG_DIRECTOR_TYPEMAPS) /* directorin */ %typemap(directorin,noblock=1) SWIGTYPE { $input = SWIG_NewPointerObj(%as_voidptr(new $1_ltype((const $1_ltype &)$1)), $&descriptor, SWIG_POINTER_OWN | %newpointer_flags); } %typemap(directorin,noblock=1) SWIGTYPE * { $input = SWIG_NewPointerObj(%as_voidptr($1), $descriptor, %newpointer_flags); } %typemap(directorin,noblock=1) SWIGTYPE *const& { $input = SWIG_NewPointerObj(%as_voidptr($1), $*descriptor, %newpointer_flags); } %typemap(directorin,noblock=1) SWIGTYPE & { $input = SWIG_NewPointerObj(%as_voidptr(&$1), $descriptor, %newpointer_flags); } %typemap(directorin,noblock=1) SWIGTYPE && { $input = SWIG_NewPointerObj(%as_voidptr(&$1_name), $descriptor, %newpointer_flags); } /* directorout */ #if defined(__cplusplus) && defined(%implicitconv_flag) %typemap(directorout,noblock=1,implicitconv=1) SWIGTYPE (void * swig_argp, int swig_res = 0) { swig_res = SWIG_ConvertPtr($input,&swig_argp,$&descriptor, %convertptr_flags | %implicitconv_flag); if (!SWIG_IsOK(swig_res)) { %dirout_fail(swig_res,"$type"); } $result = *(%reinterpret_cast(swig_argp, $<ype)); if (SWIG_IsNewObj(swig_res)) %delete(%reinterpret_cast(swig_argp, $<ype)); } #else %typemap(directorout,noblock=1) SWIGTYPE (void * swig_argp, int swig_res = 0) { swig_res = SWIG_ConvertPtr($input,&swig_argp,$&descriptor, %convertptr_flags); if (!SWIG_IsOK(swig_res)) { %dirout_fail(swig_res,"$type"); } $result = *(%reinterpret_cast(swig_argp, $<ype)); } #endif %typemap(directorout,noblock=1,warning=SWIGWARN_TYPEMAP_DIRECTOROUT_PTR_MSG) SWIGTYPE *(void *swig_argp, int swig_res, swig_owntype own) { swig_res = SWIG_ConvertPtrAndOwn($input, &swig_argp, $descriptor, %convertptr_flags | SWIG_POINTER_DISOWN, &own); if (!SWIG_IsOK(swig_res)) { %dirout_fail(swig_res,"$type"); } $result = %reinterpret_cast(swig_argp, $ltype); swig_acquire_ownership_obj(%as_voidptr($result), own /* & TODO: SWIG_POINTER_OWN */); } %typemap(directorfree,noblock=1,match="directorout") SWIGTYPE * { if (director) { SWIG_AcquirePtr($result, director->swig_release_ownership(%as_voidptr($input))); } } %typemap(directorout,noblock=1,warning=SWIGWARN_TYPEMAP_DIRECTOROUT_PTR_MSG) SWIGTYPE *const&(void *swig_argp, int swig_res, swig_owntype own) { swig_res = SWIG_ConvertPtrAndOwn($input, &swig_argp, $*descriptor, %convertptr_flags | SWIG_POINTER_DISOWN, &own); if (!SWIG_IsOK(swig_res)) { %dirout_fail(swig_res,"$type"); } $1_ltype swig_temp = new $*1_ltype(($*1_ltype)swig_argp); swig_acquire_ownership(swig_temp); $result = swig_temp; } %typemap(directorfree,noblock=1,match="directorout") SWIGTYPE *const& { if (director) { SWIG_AcquirePtr($result, director->swig_release_ownership(%as_voidptr(*$input))); } } %typemap(directorout,noblock=1,warning=SWIGWARN_TYPEMAP_DIRECTOROUT_PTR_MSG) SWIGTYPE &(void *swig_argp, int swig_res, swig_owntype own) { swig_res = SWIG_ConvertPtrAndOwn($input, &swig_argp, $descriptor, %convertptr_flags | SWIG_POINTER_DISOWN, &own); if (!SWIG_IsOK(swig_res)) { %dirout_fail(swig_res,"$type"); } if (!swig_argp) { %dirout_nullref("$type"); } $result = %reinterpret_cast(swig_argp, $ltype); swig_acquire_ownership_obj(%as_voidptr($result), own /* & TODO: SWIG_POINTER_OWN */); } %typemap(directorfree,noblock=1,match="directorout") SWIGTYPE & { if (director) { SWIG_AcquirePtr($result, director->swig_release_ownership(%as_voidptr($input))); } } %typemap(directorout,noblock=1,warning=SWIGWARN_TYPEMAP_DIRECTOROUT_PTR_MSG) SWIGTYPE &&(void *swig_argp, int swig_res, swig_owntype own) { swig_res = SWIG_ConvertPtrAndOwn($input, &swig_argp, $descriptor, %convertptr_flags | SWIG_POINTER_DISOWN, &own); if (!SWIG_IsOK(swig_res)) { %dirout_fail(swig_res,"$type"); } if (!swig_argp) { %dirout_nullref("$type"); } $result = %reinterpret_cast(swig_argp, $ltype); swig_acquire_ownership_obj(%as_voidptr($result), own /* & TODO: SWIG_POINTER_OWN */); } %typemap(directorfree,noblock=1,match="directorout") SWIGTYPE && { if (director) { SWIG_AcquirePtr($result, director->swig_release_ownership(%as_voidptr($input))); } } #endif /* SWIG_DIRECTOR_TYPEMAPS */ /* ------------------------------------------------------------ * --- Constants --- * ------------------------------------------------------------ */ %typemap(constcode,noblock=1) SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE [] { %set_constant("$symname", SWIG_NewPointerObj(%as_voidptr($value),$descriptor,%newpointer_flags)); } %typemap(constcode,noblock=1) SWIGTYPE { %set_constant("$symname", SWIG_NewPointerObj(%as_voidptr(&$value),$&descriptor,%newpointer_flags)); } /* ------------------------------------------------------------ * --- Exception handling --- * ------------------------------------------------------------ */ %typemap(throws,noblock=1) SWIGTYPE { %raise(SWIG_NewPointerObj(%new_copy($1, $ltype),$&descriptor,SWIG_POINTER_OWN), "$type", $&descriptor); } %typemap(throws,noblock=1) SWIGTYPE * { %raise(SWIG_NewPointerObj(%as_voidptr($1),$descriptor,0), "$type", $descriptor); } %typemap(throws,noblock=1) SWIGTYPE [ANY] { %raise(SWIG_NewPointerObj(%as_voidptr($1),$descriptor,0), "$type", $descriptor); } %typemap(throws,noblock=1) SWIGTYPE & { %raise(SWIG_NewPointerObj(%as_voidptr(&$1),$descriptor,0), "$type", $descriptor); } %typemap(throws,noblock=1) SWIGTYPE && { %raise(SWIG_NewPointerObj(%as_voidptr(&$1),$descriptor,0), "$type", $descriptor); } %typemap(throws,noblock=1) (...) { SWIG_exception_fail(SWIG_RuntimeError,"unknown exception"); } /* ------------------------------------------------------------ * --- CLASS::* typemaps --- * ------------------------------------------------------------ */ %typemap(in) SWIGTYPE (CLASS::*) { int res = SWIG_ConvertMember($input, %as_voidptr(&$1), sizeof($type),$descriptor); if (!SWIG_IsOK(res)) { %argument_fail(res,"$type",$symname, $argnum); } } %typemap(out,noblock=1) SWIGTYPE (CLASS::*) { %set_output(SWIG_NewMemberObj(%as_voidptr(&$1), sizeof($type), $descriptor)); } %typemap(varin) SWIGTYPE (CLASS::*) { int res = SWIG_ConvertMember($input,%as_voidptr(&$1), sizeof($type), $descriptor); if (!SWIG_IsOK(res)) { %variable_fail(res, "$type", "$name"); } } %typemap(varout,noblock=1) SWIGTYPE (CLASS::*) { %set_varoutput(SWIG_NewMemberObj(%as_voidptr(&$1), sizeof($type), $descriptor)); } %typemap(constcode,noblock=1) SWIGTYPE (CLASS::*) { %set_constant("$symname", SWIG_NewMemberObj(%as_voidptr(&$value), sizeof($type), $descriptor)); } #if defined(SWIG_DIRECTOR_TYPEMAPS) /* directorin */ %typemap(directorin,noblock=1) SWIGTYPE (CLASS::*) { $input = SWIG_NewMemberObj(%as_voidptr(&$1), sizeof($type), $descriptor); } /* directorout */ %typemap(directorout) SWIGTYPE (CLASS::*) { int swig_res = SWIG_ConvertMember($input,%as_voidptr(&$result), sizeof($type), $descriptor); if (!SWIG_IsOK(swig_res)) { %dirout_fail(swig_res,"$type"); } } #endif %apply SWIGTYPE (CLASS::*) { SWIGTYPE (CLASS::*const) } %apply SWIGTYPE & { SWIGTYPE (CLASS::*const&) } /* ------------------------------------------------------------ * --- function ptr typemaps --- * ------------------------------------------------------------ */ /* ISO C++ doesn't allow direct casting of a function ptr to a object ptr. So, maybe the ptr sizes are not the same, and we need to take some providences. */ %typemap(in) SWIGTYPE ((*)(ANY)) { int res = SWIG_ConvertFunctionPtr($input, (void**)(&$1), $descriptor); if (!SWIG_IsOK(res)) { %argument_fail(res,"$type",$symname, $argnum); } } %typecheck(SWIG_TYPECHECK_POINTER,noblock=1) SWIGTYPE ((*)(ANY)) { void *ptr = 0; int res = SWIG_ConvertFunctionPtr($input, &ptr, $descriptor); $1 = SWIG_CheckState(res); } %typemap(out, noblock=1) SWIGTYPE ((*)(ANY)) { %set_output(SWIG_NewFunctionPtrObj((void *)($1), $descriptor)); } %typemap(varin) SWIGTYPE ((*)(ANY)) { int res = SWIG_ConvertFunctionPtr($input, (void**)(&$1), $descriptor); if (!SWIG_IsOK(res)) { %variable_fail(res, "$type", "$name"); } } %typemap(varout,noblock=1) SWIGTYPE ((*)(ANY)) { %set_varoutput(SWIG_NewFunctionPtrObj((void *)($1), $descriptor)); } %typemap(constcode, noblock=1) SWIGTYPE ((*)(ANY)){ %set_constant("$symname", SWIG_NewFunctionPtrObj((void *)$value, $descriptor)); } %typemap(constcode) SWIGTYPE ((* const)(ANY)) = SWIGTYPE ((*)(ANY)); #if defined(SWIG_DIRECTOR_TYPEMAPS) /* directorin */ %typemap(directorin,noblock=1) SWIGTYPE ((*)(ANY)) { $input = SWIG_NewFunctionPtrObj((void*)($1), $descriptor); } /* directorout */ %typemap(directorout) SWIGTYPE ((*)(ANY)) { int swig_res = SWIG_ConvertFunctionPtr($input,(void**)(&$result),$descriptor); if (!SWIG_IsOK(swig_res)) { %dirout_fail(swig_res,"$type"); } } #endif %apply SWIGTYPE ((*)(ANY)) { SWIGTYPE ((* const)(ANY)) } %apply SWIGTYPE * { SWIGTYPE *const } /* ------------------------------------------------------------ * --- Special typemaps --- * ------------------------------------------------------------ */ /* DISOWN typemap */ %typemap(in, noblock=1) SWIGTYPE *DISOWN (int res = 0) { res = SWIG_ConvertPtr($input, %as_voidptrptr(&$1), $descriptor, SWIG_POINTER_DISOWN | %convertptr_flags); if (!SWIG_IsOK(res)) { %argument_fail(res,"$type", $symname, $argnum); } } %typemap(varin) SWIGTYPE *DISOWN { void *temp = 0; int res = SWIG_ConvertPtr($input, &temp, $descriptor, SWIG_POINTER_DISOWN | %convertptr_flags); if (!SWIG_IsOK(res)) { %variable_fail(res, "$type", "$name"); } $1 = ($ltype) temp; } /* DYNAMIC typemap */ %typemap(out,noblock=1) SWIGTYPE *DYNAMIC, SWIGTYPE &DYNAMIC { %set_output(SWIG_NewPointerObj(%as_voidptr($1), SWIG_TypeDynamicCast($descriptor, %as_voidptrptr(&$1)), $owner | %newpointer_flags)); } /* INSTANCE typemap */ %typemap(out,noblock=1) SWIGTYPE INSTANCE { %set_output(SWIG_NewInstanceObj(%new_copy($1, $1_ltype), $&1_descriptor, SWIG_POINTER_OWN | %newinstance_flags)); } %typemap(out,noblock=1) SWIGTYPE *INSTANCE, SWIGTYPE &INSTANCE, SWIGTYPE INSTANCE[] { %set_output(SWIG_NewInstanceObj(%as_voidptr($1), $1_descriptor, $owner | %newinstance_flags)); } %typemap(varout,noblock=1) SWIGTYPE *INSTANCE, SWIGTYPE INSTANCE[] { %set_varoutput(SWIG_NewInstanceObj(%as_voidptr($1), $1_descriptor, %newinstance_flags)); } %typemap(varout,noblock=1) SWIGTYPE &INSTANCE { %set_varoutput(SWIG_NewInstanceObj(%as_voidptr($1), $1_descriptor, %newinstance_flags)); } %typemap(varout,noblock=1) SWIGTYPE INSTANCE { %set_varoutput(SWIG_NewInstanceObj(%as_voidptr(&$1), $&1_descriptor, %newinstance_flags)); } swig-4.0.1/Lib/typemaps/attribute.swg0000644000175000017500000002301613527063513017447 0ustar williamwilliam/* ----------------------------------------------------------------------------- * attribute.swg * * Attribute implementation * ----------------------------------------------------------------------------- */ /* The following macros convert a pair of set/get methods into a "native" attribute. Use %attribute when you have a pair of get/set methods to a primitive type like in: %attribute(A, int, a, get_a, set_a); struct A { int get_a() const; void set_a(int aa); }; If you don't provide a 'set' method, a 'read-only' attribute is generated, ie, like in: %attribute(A, int, c, get_c); Use %attributeref when you have const/non-const reference access methods for primitive types or class/structs, like in: %attributeref(A, int, b); struct A { const int& b() const; int& b(); }; %attributeref(B, int, c); struct B { int& c(); }; You can also use %attributeref(Class, AttributeType, AttributeName, AccessorMethod) if the internal C++ reference methods have a different name from the attribute you want, so %attributeref(B, int, d, c); is the same as the last example, but instead of the attribute 'c' being called 'c', it is called 'd'. Now you can use the attributes like so: x = A() x.a = 3 # calls A::set_a print x.a # calls A::get_a x.b = 3 # calls A::b() print x.b # calls A::b() const Use %attribute2 instead of %attribute to indicate that reference-pointer translation is required. You use %attribute2 instead of %attribute in cases like this: %attribute2(MyClass, MyFoo, Foo, GetFoo, SetFoo); %inline %{ struct MyFoo { int x; }; class MyClass { MyFoo foo; public: MyFoo& GetFoo() { return foo; } void SetFoo(const MyFoo& other) { foo = other; } }; %} Here, the data type of the property is a wrapped type (MyFoo) and on the C++ side it is passed by reference. The problem is that the SWIG wrapper will pass around a pointer (MyFoo *) which is not compatible with the reference type of the accessors (MyFoo &). Therefore, if you use %attribute, you'll get an error from your C/C++ compiler. %attribute2 translates between a pointer and a reference to eliminate the error. In case you're confused, let's make it simple: just use %attribute at first, but if the C/C++ compiler gives an error while compiling the wrapper, try %attribute2 instead. NOTE: remember that if the type contains commas, such as 'std::pair', you need to use the macro like: %attributeref(A, %arg(std::pair), pval); where %arg() 'normalizes' the type to be understood as a single argument, otherwise the macro will get confused by the comma. The %attributeval is the same as %attribute, but should be used when the type is a class/struct (ie a non-primitive type) and when the get and set methods return/pass by value. The following is very similar to the above example, but note that the access is by value rather than reference. %attributeval(MyClassVal, MyFoo, ReadWriteFoo, GetFoo, SetFoo); %attributeval(MyClassVal, MyFoo, ReadOnlyFoo, GetFoo); %inline %{ class MyClassVal { MyFoo foo; public: MyFoo GetFoo() { return foo; } void SetFoo(MyFoo other) { foo = other; } }; %} The %attributestring is the same as %attributeval, but should be used for string class types, which are unusual as they are a class on the C++ side, but normally an immutable/primitive type in the target language. Example usage for std::string: %include %attributestring(MyStringyClass, std::string, ReadWriteString, GetString, SetString); %attributestring(MyStringyClass, std::string, ReadOnlyString, GetString); %inline %{ class MyStringyClass { std::string str; public: MyStringyClass(const std::string &val) : str(val) {} std::string GetString() { return str; } void SetString(std::string other) { str = other; } }; %} The %attributestring also works for class types that have %naturalvar turned on and so is also useful for shared_ptr which has %naturalvar turned on in %shared_ptr. */ // // Define SWIG_ATTRIBUTE_TEMPLATE if you want to use templates instead of macros for the C++ get and set wrapper methods // Does not always generate compilable code, use at your peril! // //#define SWIG_ATTRIBUTE_TEMPLATE %define %attribute_custom(Class, AttributeType, AttributeName, GetMethod, SetMethod, GetMethodCall, SetMethodCall) %ignore Class::GetMethod(); %ignore Class::GetMethod() const; #if #SetMethod != #AttributeName %ignore Class::SetMethod; #endif %extend Class { AttributeType AttributeName; } #if defined(__cplusplus) && defined(SWIG_ATTRIBUTE_TEMPLATE) %{ template < class C > inline AttributeType %mangle(Class) ##_## AttributeName ## _get(const C* self_) { return GetMethodCall; } template < class C > inline AttributeType %mangle(Class) ##_## AttributeName ## _get(C* self_) { return GetMethodCall; } template < class C > inline void %mangle(Class) ##_## AttributeName ## _set(C* self_, AttributeType val_) { SetMethodCall; } %} #else %{ #define %mangle(Class) ##_## AttributeName ## _get(self_) GetMethodCall #define %mangle(Class) ##_## AttributeName ## _set(self_, val_) SetMethodCall %} #endif %enddef %define %attribute_readonly(Class, AttributeType, AttributeName, GetMethod, GetMethodCall) %ignore Class::GetMethod(); %ignore Class::GetMethod() const; %immutable Class::AttributeName; %extend Class { AttributeType AttributeName; } #if defined(__cplusplus) && defined(SWIG_ATTRIBUTE_TEMPLATE) %{ template < class C > inline AttributeType %mangle(Class) ##_## AttributeName ## _get(const C* self_) { return GetMethodCall; } template < class C > inline AttributeType %mangle(Class) ##_## AttributeName ## _get(C* self_) { return GetMethodCall; } %} #else %{ #define %mangle(Class) ##_## AttributeName ## _get(self_) GetMethodCall %} #endif %enddef // User macros %define %attribute(Class, AttributeType, AttributeName, GetMethod, SetMethod...) #if #SetMethod != "" %attribute_custom(%arg(Class), %arg(AttributeType), AttributeName, GetMethod, SetMethod, self_->GetMethod(), self_->SetMethod(val_)) #else %attribute_readonly(%arg(Class), %arg(AttributeType), AttributeName, GetMethod, self_->GetMethod()) #endif %enddef %define %attribute2(Class, AttributeType, AttributeName, GetMethod, SetMethod...) #if #SetMethod != "" %attribute_custom(%arg(Class), %arg(AttributeType), AttributeName, GetMethod, SetMethod, &self_->GetMethod(), self_->SetMethod(*val_)) #else %attribute_readonly(%arg(Class), %arg(AttributeType), AttributeName, GetMethod, &self_->GetMethod()) #endif %enddef %define %attributeref(Class, AttributeType, AttributeName, AccessorMethod...) #if #AccessorMethod != "" %attribute_custom(%arg(Class), %arg(AttributeType), AttributeName, AccessorMethod, AccessorMethod, self_->AccessorMethod(), self_->AccessorMethod() = val_) #else %attribute_custom(%arg(Class), %arg(AttributeType), AttributeName, AttributeName, AttributeName, self_->AttributeName(), self_->AttributeName() = val_) #endif %enddef %define %attribute2ref(Class, AttributeType, AttributeName, AccessorMethod...) #if #AccessorMethod != "" %attribute_custom(%arg(Class), %arg(AttributeType), AttributeName, AccessorMethod, AccessorMethod, &self_->AccessorMethod(), self_->AccessorMethod() = *val_) #else %attribute_custom(%arg(Class), %arg(AttributeType), AccessorName, AccessorName, AccessorName, &self_->AccessorName(), self_->AccessorName() = *val_) #endif %enddef // deprecated (same as %attributeref, but there is an argument order inconsistency) %define %attribute_ref(Class, AttributeType, AccessorMethod, AttributeName...) #if #AttributeName != "" %attribute_custom(%arg(Class), %arg(AttributeType), AttributeName, AccessorMethod, AccessorMethod, self_->AccessorMethod(), self_->AccessorMethod() = val_) #else %attribute_custom(%arg(Class), %arg(AttributeType), AccessorMethod, AccessorMethod, AccessorMethod, self_->AccessorMethod(), self_->AccessorMethod() = val_) #endif %enddef %define %attributeval(Class, AttributeType, AttributeName, GetMethod, SetMethod...) %{ #define %mangle(Class) ##_## AttributeName ## _get(self_) new AttributeType(self_->GetMethod()) %} #if #SetMethod != "" %{ #define %mangle(Class) ##_## AttributeName ## _set(self_, val_) self_->SetMethod(*val_) %} #if #SetMethod != #AttributeName %ignore Class::SetMethod; #endif #else %immutable Class::AttributeName; #endif %ignore Class::GetMethod(); %ignore Class::GetMethod() const; %newobject Class::AttributeName; %extend Class { AttributeType AttributeName; } %enddef %define %attributestring(Class, AttributeType, AttributeName, GetMethod, SetMethod...) %{ #define %mangle(Class) ##_## AttributeName ## _get(self_) *new AttributeType(self_->GetMethod()) %} #if #SetMethod != "" %{ #define %mangle(Class) ##_## AttributeName ## _set(self_, val_) self_->SetMethod(val_) %} #if #SetMethod != #AttributeName %ignore Class::SetMethod; #endif #else %immutable Class::AttributeName; #endif %ignore Class::GetMethod(); %ignore Class::GetMethod() const; %newobject Class::AttributeName; %typemap(newfree) const AttributeType &AttributeName "delete $1;" %extend Class { AttributeType AttributeName; } %enddef swig-4.0.1/Lib/typemaps/std_string.swg0000644000175000017500000000053313527063513017623 0ustar williamwilliam// // String // #ifndef SWIG_STD_BASIC_STRING #define SWIG_STD_STRING %include %fragment(""); namespace std { %naturalvar string; class string; } %typemaps_std_string(std::string, char, SWIG_AsCharPtrAndSize, SWIG_FromCharPtrAndSize, %checkcode(STDSTRING)); #else %include #endif swig-4.0.1/Lib/typemaps/typemaps.swg0000644000175000017500000001072413527063513017310 0ustar williamwilliam/* ----------------------------------------------------------------------------- * typemaps.swg * * Tcl Pointer handling * * These mappings provide support for input/output arguments and common * uses for C/C++ pointers. * ----------------------------------------------------------------------------- */ // INPUT typemaps. // These remap a C pointer to be an "INPUT" value which is passed by value // instead of reference. /* The following methods can be applied to turn a pointer into a simple "input" value. That is, instead of passing a pointer to an object, you would use a real value instead. int *INPUT short *INPUT long *INPUT long long *INPUT unsigned int *INPUT unsigned short *INPUT unsigned long *INPUT unsigned long long *INPUT unsigned char *INPUT bool *INPUT float *INPUT double *INPUT To use these, suppose you had a C function like this : double fadd(double *a, double *b) { return *a+*b; } You could wrap it with SWIG as follows : %include double fadd(double *INPUT, double *INPUT); or you can use the %apply directive : %include %apply double *INPUT { double *a, double *b }; double fadd(double *a, double *b); */ // OUTPUT typemaps. These typemaps are used for parameters that // are output only. The output value is appended to the result as // a list element. /* The following methods can be applied to turn a pointer into an "output" value. When calling a function, no input value would be given for a parameter, but an output value would be returned. In the case of multiple output values, they are returned in the form of a Tcl tuple. int *OUTPUT short *OUTPUT long *OUTPUT long long *OUTPUT unsigned int *OUTPUT unsigned short *OUTPUT unsigned long *OUTPUT unsigned long long *OUTPUT unsigned char *OUTPUT bool *OUTPUT float *OUTPUT double *OUTPUT For example, suppose you were trying to wrap the modf() function in the C math library which splits x into integral and fractional parts (and returns the integer part in one of its parameters).K: double modf(double x, double *ip); You could wrap it with SWIG as follows : %include double modf(double x, double *OUTPUT); or you can use the %apply directive : %include %apply double *OUTPUT { double *ip }; double modf(double x, double *ip); The Tcl output of the function would be a tuple containing both output values. */ // INOUT // Mappings for an argument that is both an input and output // parameter /* The following methods can be applied to make a function parameter both an input and output value. This combines the behavior of both the "INPUT" and "OUTPUT" methods described earlier. Output values are returned in the form of a Tcl tuple. int *INOUT short *INOUT long *INOUT long long *INOUT unsigned int *INOUT unsigned short *INOUT unsigned long *INOUT unsigned long long *INOUT unsigned char *INOUT bool *INOUT float *INOUT double *INOUT For example, suppose you were trying to wrap the following function : void neg(double *x) { *x = -(*x); } You could wrap it with SWIG as follows : %include void neg(double *INOUT); or you can use the %apply directive : %include %apply double *INOUT { double *x }; void neg(double *x); Unlike C, this mapping does not directly modify the input value (since this makes no sense in Tcl). Rather, the modified input value shows up as the return value of the function. Thus, to apply this function to a Tcl variable you might do this : x = neg(x) Note : previous versions of SWIG used the symbol 'BOTH' to mark input/output arguments. This is still supported, but will be slowly phased out in future releases. */ #if defined(SWIG_INOUT_NODEF) %apply_checkctypes(%typemaps_inoutn) %apply size_t& { std::size_t& }; %apply ptrdiff_t& { std::ptrdiff_t& }; #endif swig-4.0.1/Lib/typemaps/exception.swg0000644000175000017500000000522713527063513017446 0ustar williamwilliam/* ----------------------------------------------------------------------------- * exceptions.swg * * This SWIG library file provides language independent exception handling * ----------------------------------------------------------------------------- */ %include /* macros for error manipulation */ #define %nullref_fmt() "invalid null reference " #define %varfail_fmt(_type,_name) "in variable '"`_name`"' of type '"`_type`"'" #ifndef %argfail_fmt #define %argfail_fmt(_type,_name,_argn) "in method '" `_name` "', argument " `_argn`" of type '" `_type`"'" #endif #define %outfail_fmt(_type) "in output value of type '"_type"'" #ifndef %argnullref_fmt #define %argnullref_fmt(_type,_name,_argn) %nullref_fmt() %argfail_fmt(_type, _name, _argn) #endif #define %varnullref_fmt(_type,_name) %nullref_fmt() %varfail_fmt(_type, _name) #define %outnullref_fmt(_type) %nullref_fmt() %outfail_fmt(_type) /* setting an error */ #define %error(code,msg...) SWIG_Error(code, msg) #define %type_error(msg...) SWIG_Error(SWIG_TypeError, msg) %insert("runtime") { %define_as(SWIG_exception_fail(code, msg), %block(%error(code, msg); SWIG_fail)) %define_as(SWIG_contract_assert(expr, msg), if (!(expr)) { %error(SWIG_RuntimeError, msg); SWIG_fail; } else) } #ifdef __cplusplus /* You can use the SWIG_CATCH_STDEXCEPT macro with the %exception directive as follows: %exception { try { $action } catch (my_except& e) { ... } SWIG_CATCH_STDEXCEPT // catch std::exception catch (...) { SWIG_exception_fail(SWIG_UnknownError, "Unknown exception"); } } */ %fragment(""); %define SWIG_CATCH_STDEXCEPT /* catching std::exception */ catch (std::invalid_argument& e) { SWIG_exception_fail(SWIG_ValueError, e.what() ); } catch (std::domain_error& e) { SWIG_exception_fail(SWIG_ValueError, e.what() ); } catch (std::overflow_error& e) { SWIG_exception_fail(SWIG_OverflowError, e.what() ); } catch (std::out_of_range& e) { SWIG_exception_fail(SWIG_IndexError, e.what() ); } catch (std::length_error& e) { SWIG_exception_fail(SWIG_IndexError, e.what() ); } catch (std::runtime_error& e) { SWIG_exception_fail(SWIG_RuntimeError, e.what() ); } catch (std::exception& e) { SWIG_exception_fail(SWIG_SystemError, e.what() ); } %enddef %define SWIG_CATCH_UNKNOWN catch (std::exception& e) { SWIG_exception_fail(SWIG_SystemError, e.what() ); } catch (...) { SWIG_exception_fail(SWIG_UnknownError, "unknown exception"); } %enddef #endif /* __cplusplus */ swig-4.0.1/Lib/typemaps/README0000644000175000017500000000372513527063513015607 0ustar williamwilliamStill in development, but if you are interested into looking around, start with swigtypemaps.swg which is the head file. Also read the docs for %fragments in fragments.swg and follow the definitions in one of the supported languages: python, perl, ruby, tcl /* ----------------------------------------------------------------------------- * Internal typemap specializations * ----------------------------------------------------------------------------- */ carrays.swg Implement the carrays.i library cdata.swg Implement the cdata.i library cmalloc.swg Implement the cmalloc.i library cpointer.swg Implement the cpointer.i library cstring.swg Implement the cstring.i library typemaps for char * cwstring.swg Implement the cstring.i library typemaps for wchar_t * exception.swg Implement the exception.i library implicit.swg Allow the use of implicit C++ constructors string.swg Typemaps for char * string wstring.swg Typemaps for wchar_t * string std_string.swg Typemaps for std::string std_wstring.swg Typemaps for std::wstring swigtype.swg Typemaps for the SWIGTYPE type void.swg Typemaps for the 'void' type enumint.swg Typemaps for enums treated as 'int' swigobject.swg Typemaps for the SWIG_Object as in PyObject, Tcl_Obj, etc. misctypes.swg Typemaps for miscellaneos types (size_t, ptrdiff_t, etc) ptrtypes.swg Typemaps for types with a 'ptr' behavior valtypes.swg Typemaps for 'by value' types inoutlist.swg IN/OUTPUT/INOUT typemaps, where the OUTPUT values are returned in a list primtypes.swg Common macros to manage primitive types (short,int,double,etc) cstrings.swg Common macros to implemented the cstring/cwstring libraries std_strings.swg Common macros to implemented the std::string/std::wstring typemaps strings.swg Common macros and typemaps for string and wstring (char *, wchar_t *) swigmacros.swg Basic macros fragments.swg Macros for fragment manipulations typemaps.swg The old typemaps.i library, not needed anymore swig-4.0.1/Lib/typemaps/wstring.swg0000644000175000017500000000144513527063513017143 0ustar williamwilliam%ensure_fragment(SWIG_AsWCharPtrAndSize) %ensure_fragment(SWIG_FromWCharPtrAndSize) %types(wchar_t *); %fragment("SWIG_pwchar_descriptor","header") { SWIGINTERN swig_type_info* SWIG_pwchar_descriptor() { static int init = 0; static swig_type_info* info = 0; if (!init) { info = SWIG_TypeQuery("_p_wchar_t"); init = 1; } return info; } } %fragment("SWIG_wcsnlen","header",fragment="SWIG_FromWCharPtrAndSize") { SWIGINTERN size_t SWIG_wcsnlen(const wchar_t* s, size_t maxlen) { const wchar_t *p; for (p = s; maxlen-- && *p; p++) ; return p - s; } } %include %typemaps_string(%checkcode(UNISTRING), %checkcode(UNICHAR), wchar_t, WChar, SWIG_AsWCharPtrAndSize, SWIG_FromWCharPtrAndSize, wcslen, SWIG_wcsnlen, "", WCHAR_MIN, WCHAR_MAX) swig-4.0.1/Lib/typemaps/fragments.swg0000644000175000017500000001662513527063513017442 0ustar williamwilliam/* Fragments ========= See the "Typemap fragments" section in the documentation for understanding fragments. Below is some info on how fragments and automatic type specialization is used. Macros that make the automatic generation of typemaps easier are provided. Consider the following code: %fragment(SWIG_From_frag(bool), "header") { static PyObject* SWIG_From_dec(bool)(bool value) { PyObject *obj = value ? Py_True : Py_False; Py_INCREF(obj); return obj; } } %typemap(out, fragment=SWIG_From_frag(bool)) bool { $result = SWIG_From(bool)($1)); } Here the macros SWIG_From_frag => fragment SWIG_From_dec => declaration SWIG_From => call allow you to define/include a fragment, and declare and call the 'from-bool' method as needed. In the simpler case, these macros just return something like SWIG_From_frag(bool) => "SWIG_From_bool" SWIG_From_dec(bool) => SWIG_From_bool SWIG_From(bool) => SWIG_From_bool But they are specialized for the different languages requirements, such as perl or tcl that requires passing the interpreter pointer, and also they can manage C++ ugly types, for example: SWIG_From_frag(std::complex) => "SWIG_From_std_complex_Sl_double_Sg_" SWIG_From_dec(std::complex) => SWIG_From_std_complex_Sl_double_Sg_ SWIG_From(std::complex) => SWIG_From_std_complex_Sl_double_Sg_ Hence, to declare methods to use with typemaps, always use the SWIG_From* macros. In the same way, the SWIG_AsVal* and SWIG_AsPtr* set of macros are provided. */ /* ----------------------------------------------------------------------------- * Define the basic macros to 'normalize' the type fragments * ----------------------------------------------------------------------------- */ #ifndef SWIG_AS_DECL_ARGS #define SWIG_AS_DECL_ARGS #endif #ifndef SWIG_FROM_DECL_ARGS #define SWIG_FROM_DECL_ARGS #endif #ifndef SWIG_AS_CALL_ARGS #define SWIG_AS_CALL_ARGS #endif #ifndef SWIG_FROM_CALL_ARGS #define SWIG_FROM_CALL_ARGS #endif #define %fragment_name(Name, Type...) %string_name(Name) "_" {Type} #define SWIG_Traits_frag(Type...) %fragment_name(Traits, Type) #define SWIG_AsPtr_frag(Type...) %fragment_name(AsPtr, Type) #define SWIG_AsVal_frag(Type...) %fragment_name(AsVal, Type) #define SWIG_From_frag(Type...) %fragment_name(From, Type) #define SWIG_AsVal_name(Type...) %symbol_name(AsVal, Type) #define SWIG_AsPtr_name(Type...) %symbol_name(AsPtr, Type) #define SWIG_From_name(Type...) %symbol_name(From, Type) #define SWIG_AsVal_dec(Type...) SWIG_AsVal_name(Type) SWIG_AS_DECL_ARGS #define SWIG_AsPtr_dec(Type...) SWIG_AsPtr_name(Type) SWIG_AS_DECL_ARGS #define SWIG_From_dec(Type...) SWIG_From_name(Type) SWIG_FROM_DECL_ARGS #define SWIG_AsVal(Type...) SWIG_AsVal_name(Type) SWIG_AS_CALL_ARGS #define SWIG_AsPtr(Type...) SWIG_AsPtr_name(Type) SWIG_AS_CALL_ARGS #define SWIG_From(Type...) SWIG_From_name(Type) SWIG_FROM_CALL_ARGS /* ------------------------------------------------------------ * common fragments * ------------------------------------------------------------ */ %fragment("SWIG_isfinite","header",fragment=",") %{ /* Getting isfinite working pre C99 across multiple platforms is non-trivial. Users can provide SWIG_isfinite on older platforms. */ #ifndef SWIG_isfinite /* isfinite() is a macro for C99 */ # if defined(isfinite) # define SWIG_isfinite(X) (isfinite(X)) # elif defined(__cplusplus) && __cplusplus >= 201103L /* Use a template so that this works whether isfinite() is std::isfinite() or * in the global namespace. The reality seems to vary between compiler * versions. * * Make sure namespace std exists to avoid compiler warnings. * * extern "C++" is required as this fragment can end up inside an extern "C" { } block */ namespace std { } extern "C++" template inline int SWIG_isfinite_func(T x) { using namespace std; return isfinite(x); } # define SWIG_isfinite(X) (SWIG_isfinite_func(X)) # elif defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 2)) # define SWIG_isfinite(X) (__builtin_isfinite(X)) # elif defined(__clang__) && defined(__has_builtin) # if __has_builtin(__builtin_isfinite) # define SWIG_isfinite(X) (__builtin_isfinite(X)) # endif # elif defined(_MSC_VER) # define SWIG_isfinite(X) (_finite(X)) # elif defined(__sun) && defined(__SVR4) # include # define SWIG_isfinite(X) (finite(X)) # endif #endif %} %fragment("SWIG_Float_Overflow_Check","header",fragment=",SWIG_isfinite") %{ /* Accept infinite as a valid float value unless we are unable to check if a value is finite */ #ifdef SWIG_isfinite # define SWIG_Float_Overflow_Check(X) ((X < -FLT_MAX || X > FLT_MAX) && SWIG_isfinite(X)) #else # define SWIG_Float_Overflow_Check(X) ((X < -FLT_MAX || X > FLT_MAX)) #endif %} /* ----------------------------------------------------------------------------- * special macros for fragments * ----------------------------------------------------------------------------- */ /* Macros to derive numeric types */ %define %numeric_type_from(Type, Base) %fragment(SWIG_From_frag(Type),"header", fragment=SWIG_From_frag(Base)) { SWIGINTERNINLINE SWIG_Object SWIG_From_dec(Type)(Type value) { return SWIG_From(Base)(value); } } %enddef %define %numeric_type_asval(Type, Base, Frag, OverflowCond) %fragment(SWIG_AsVal_frag(Type),"header", fragment=Frag, fragment=SWIG_AsVal_frag(Base)) { SWIGINTERN int SWIG_AsVal_dec(Type)(SWIG_Object obj, Type *val) { Base v; int res = SWIG_AsVal(Base)(obj, &v); if (SWIG_IsOK(res)) { if (OverflowCond) { return SWIG_OverflowError; } else { if (val) *val = %numeric_cast(v, Type); } } return res; } } %enddef #define %numeric_signed_type_asval(Type, Base, Frag, Min, Max) \ %numeric_type_asval(Type, Base, Frag, (v < Min || v > Max)) #define %numeric_unsigned_type_asval(Type, Base, Frag, Max) \ %numeric_type_asval(Type, Base, Frag, (v > Max)) /* Macro for 'signed long' derived types */ %define %numeric_slong(Type, Frag, Min, Max) %numeric_type_from(Type, long) %numeric_signed_type_asval(Type, long, Frag , Min, Max) %enddef /* Macro for 'unsigned long' derived types */ %define %numeric_ulong(Type, Frag, Max) %numeric_type_from(Type, unsigned long) %numeric_unsigned_type_asval(Type, unsigned long, Frag, Max) %enddef /* Macro for floating point derived types (original macro) */ %define %numeric_double(Type, Frag, Min, Max) %numeric_type_from(Type, double) %numeric_signed_type_asval(Type, double, Frag , Min, Max) %enddef /* Macro for floating point derived types */ %define %numeric_float(Type, Frag, OverflowCond) %numeric_type_from(Type, double) %numeric_type_asval(Type, double, Frag, OverflowCond) %enddef /* Macros for missing fragments */ %define %ensure_fragment(Fragment) %fragment(`Fragment`,"header") { %#error "SWIG language implementation must provide the Fragment fragment" } %enddef %define %ensure_type_fragments(Type) %fragment(SWIG_From_frag(Type),"header") { %#error "SWIG language implementation must provide a SWIG_From_frag(Type) fragment" } %fragment(SWIG_AsVal_frag(Type),"header") { %#error "SWIG language implementation must provide a SWIG_AsVal_frag(Type) fragment" } %enddef swig-4.0.1/Lib/typemaps/cstrings.swg0000644000175000017500000002004213527063513017274 0ustar williamwilliam/* ----------------------------------------------------------------------------- * cstrings.swg * * This file provides typemaps and macros for dealing with various forms * of C character string handling. The primary use of this module * is in returning character data that has been allocated or changed in * some way. * ----------------------------------------------------------------------------- */ %define %typemaps_cstring(Name, Char, SWIG_AsCharPtr, SWIG_AsCharPtrAndSize, SWIG_FromCharPtr, SWIG_FromCharPtrAndSize) /* %cstring_input_binary(TYPEMAP, SIZE) * * Macro makes a function accept binary string data along with * a size. For example: * * %cstring_input_binary(Char *buff, int size); * void foo(Char *buff, int size) { * } * */ %define Name ## _input_binary(TYPEMAP, SIZE) %typemap(in,noblock=1,fragment=#SWIG_AsCharPtrAndSize) (TYPEMAP, SIZE) (int res, Char *buf = 0, size_t size = 0, int alloc = 0) { res = SWIG_AsCharPtrAndSize($input, &buf, &size, &alloc); if (!SWIG_IsOK(res)) { %argument_fail(res, "(TYPEMAP, SIZE)", $symname, $argnum); } $1 = ($1_ltype) buf; $2 = ($2_ltype) size - 1; } %typemap(freearg,noblock=1,match="in") (TYPEMAP, SIZE) { if (alloc$argnum == SWIG_NEWOBJ) %delete_array(buf$argnum); } %enddef /* * %cstring_bounded_output(TYPEMAP, MAX) * * This macro is used to return a NULL-terminated output string of * some maximum length. For example: * * %cstring_bounded_output(Char *outx, 512); * void foo(Char *outx) { * sprintf(outx,"blah blah\n"); * } * */ %define Name ## _bounded_output(TYPEMAP,MAX) %typemap(in,noblock=1,numinputs=0) TYPEMAP (Char temp[MAX+1]) { $1 = ($1_ltype) temp; } %typemap(freearg,match="in") TYPEMAP ""; %typemap(argout,noblock=1,fragment= #SWIG_FromCharPtr ) TYPEMAP { $1[MAX] = 0; %append_output(SWIG_FromCharPtr($1)); } %enddef /* * %cstring_chunk_output(TYPEMAP, SIZE) * * This macro is used to return a chunk of binary string data. * Embedded NULLs are okay. For example: * * %cstring_chunk_output(Char *outx, 512); * void foo(Char *outx) { * memmove(outx, somedata, 512); * } * */ %define Name ## _chunk_output(TYPEMAP,SIZE) %typemap(in,noblock=1,numinputs=0) TYPEMAP(Char temp[SIZE]) { $1 = ($1_ltype) temp; } %typemap(freearg,match="in") TYPEMAP ""; %typemap(argout,noblock=1,fragment= #SWIG_FromCharPtrAndSize) TYPEMAP { %append_output(SWIG_FromCharPtrAndSize($1,SIZE)); } %enddef /* * %cstring_bounded_mutable(TYPEMAP, SIZE) * * This macro is used to wrap a string that's going to mutate. * * %cstring_bounded_mutable(Char *in, 512); * void foo(in *x) { * while (*x) { * *x = toupper(*x); * x++; * } * } * */ %define Name ## _bounded_mutable(TYPEMAP,MAX) %typemap(in,noblock=1,fragment=#SWIG_AsCharPtrAndSize) TYPEMAP (int res,Char temp[MAX+1], Char *t = 0, size_t n = 0, int alloc = 0) { res = SWIG_AsCharPtrAndSize($input, &t, &n, &alloc); if (!SWIG_IsOK(res)) { %argument_fail(res, "TYPEMAP", $symname, $argnum); } if ( n > (size_t) MAX ) n = (size_t) MAX; memcpy(temp, t, sizeof(Char)*n); if (alloc == SWIG_NEWOBJ) %delete_array(t); temp[n - 1] = 0; $1 = ($1_ltype) temp; } %typemap(freearg,match="in") TYPEMAP ""; %typemap(argout,noblock=1,fragment=#SWIG_FromCharPtr) TYPEMAP { $1[MAX] = 0; %append_output(SWIG_FromCharPtr($1)); } %enddef /* * %cstring_mutable(TYPEMAP [, expansion]) * * This macro is used to wrap a string that will mutate in place. * It may change size up to a user-defined expansion. * * %cstring_mutable(Char *in); * void foo(in *x) { * while (*x) { * *x = toupper(*x); * x++; * } * } * */ %define Name ## _mutable(TYPEMAP,EXP...) %typemap(in,noblock=1,fragment=#SWIG_AsCharPtrAndSize) TYPEMAP (int res, Char *t = 0, size_t n = 0, int alloc = 0, size_t expansion = 0) { #if #EXP != "" expansion += EXP; #endif res = SWIG_AsCharPtrAndSize($input, &t, &n, &alloc); if (!SWIG_IsOK(res)) { %argument_fail(res, "TYPEMAP", $symname, $argnum); } $1 = %new_array(n+expansion, $*1_ltype); memcpy($1,t,sizeof(Char)*n); if (alloc == SWIG_NEWOBJ) %delete_array(t); $1[n-1] = 0; } %typemap(freearg,match="in") TYPEMAP ""; %typemap(argout,noblock=1,fragment=#SWIG_FromCharPtr) TYPEMAP { %append_output(SWIG_FromCharPtr($1)); %delete_array($1); } %enddef /* * %cstring_output_maxsize(TYPEMAP, SIZE) * * This macro returns data in a string of some user-defined size. * * %cstring_output_maxsize(Char *outx, int max) { * void foo(Char *outx, int max) { * sprintf(outx,"blah blah\n"); * } */ %define Name ## _output_maxsize(TYPEMAP, SIZE) %typemap(in,noblock=1,fragment=SWIG_AsVal_frag(size_t)) (TYPEMAP, SIZE) (int res, size_t size, Char *buff = 0) { res = SWIG_AsVal(size_t)($input, &size); if (!SWIG_IsOK(res)) { %argument_fail(res, "(TYPEMAP, SIZE)", $symname, $argnum); } buff= %new_array(size+1, Char); $2 = %numeric_cast(size, $2_ltype); $1 = %static_cast(buff, $1_ltype); } %typemap(freearg,noblock=1,match="in") (TYPEMAP,SIZE) { if (buff$argnum) %delete_array(buff$argnum); } %typemap(argout,noblock=1,fragment=#SWIG_FromCharPtr) (TYPEMAP,SIZE) { %append_output(SWIG_FromCharPtr($1)); } %enddef /* * %cstring_output_withsize(TYPEMAP, SIZE) * * This macro is used to return Character data along with a size * parameter. * * %cstring_output_withsize(Char *outx, int *max) { * void foo(Char *outx, int *max) { * sprintf(outx,"blah blah\n"); * *max = strlen(outx); * } */ %define Name ## _output_withsize(TYPEMAP, SIZE) %typemap(in,noblock=1,fragment=SWIG_AsVal_frag(size_t)) (TYPEMAP, SIZE) (int res, size_t n, Char *buff = 0, $*2_ltype size) { res = SWIG_AsVal(size_t)($input, &n); if (!SWIG_IsOK(res)) { %argument_fail(res, "(TYPEMAP, SIZE)", $symname, $argnum); } buff= %new_array(n+1, Char); $1 = %static_cast(buff, $1_ltype); size = %numeric_cast(n,$*2_ltype); $2 = &size; } %typemap(freearg,noblock=1,match="in")(TYPEMAP,SIZE) { if (buff$argnum) %delete_array(buff$argnum); } %typemap(argout,noblock=1,fragment=#SWIG_FromCharPtrAndSize) (TYPEMAP,SIZE) { %append_output(SWIG_FromCharPtrAndSize($1,*$2)); } %enddef /* * %cstring_output_allocate(TYPEMAP, RELEASE) * * This macro is used to return Character data that was * allocated with new or malloc. * * %cstring_output_allocate(Char **outx, free($1)); * void foo(Char **outx) { * *outx = (Char *) malloc(512); * sprintf(outx,"blah blah\n"); * } */ %define Name ## _output_allocate(TYPEMAP, RELEASE) %typemap(in,noblock=1,numinputs=0) TYPEMAP($*1_ltype temp = 0) { $1 = &temp; } %typemap(freearg,match="in") TYPEMAP ""; %typemap(argout,noblock=1,fragment=#SWIG_FromCharPtr) TYPEMAP { if (*$1) { %append_output(SWIG_FromCharPtr(*$1)); RELEASE; } } %enddef /* * %cstring_output_allocate_size(TYPEMAP, SIZE, RELEASE) * * This macro is used to return Character data that was * allocated with new or malloc. * * %cstring_output_allocate_size(Char **outx, int *sz, free($1)); * void foo(Char **outx, int *sz) { * *outx = (Char *) malloc(512); * sprintf(outx,"blah blah\n"); * *sz = strlen(outx); * } */ %define Name ## _output_allocate_size(TYPEMAP, SIZE, RELEASE) %typemap(in,noblock=1,numinputs=0) (TYPEMAP, SIZE) ($*1_ltype temp = 0, $*2_ltype tempn) { $1 = &temp; $2 = &tempn; } %typemap(freearg,match="in") (TYPEMAP,SIZE) ""; %typemap(argout,noblock=1,fragment=#SWIG_FromCharPtrAndSize)(TYPEMAP,SIZE) { if (*$1) { %append_output(SWIG_FromCharPtrAndSize(*$1,*$2)); RELEASE; } } %enddef %enddef swig-4.0.1/Lib/cwstring.i0000644000175000017500000000041113527063513015064 0ustar williamwilliam/* ----------------------------------------------------------------------------- * cwstring.i * ----------------------------------------------------------------------------- */ %echo "cwstring.i not implemented for this target" #define SWIG_CWSTRING_UNIMPL swig-4.0.1/Lib/constraints.i0000644000175000017500000001560713527063513015610 0ustar williamwilliam/* ----------------------------------------------------------------------------- * constraints.i * * SWIG constraints library. * * SWIG library file containing typemaps for implementing various kinds of * constraints. Depends upon the SWIG exception library for generating * errors in a language-independent manner. * ----------------------------------------------------------------------------- */ #ifdef AUTODOC %text %{ %include This library provides support for applying constraints to function arguments. Using a constraint, you can restrict arguments to be positive numbers, non-NULL pointers, and so on. The following constraints are available : Number POSITIVE - Positive number (not zero) Number NEGATIVE - Negative number (not zero) Number NONZERO - Nonzero number Number NONNEGATIVE - Positive number (including zero) Number NONPOSITIVE - Negative number (including zero) Pointer NONNULL - Non-NULL pointer Pointer ALIGN8 - 8-byte aligned pointer Pointer ALIGN4 - 4-byte aligned pointer Pointer ALIGN2 - 2-byte aligned pointer To use the constraints, you need to "apply" them to specific function arguments in your code. This is done using the %apply directive. For example : %apply Number NONNEGATIVE { double nonneg }; double sqrt(double nonneg); // Name of argument must match %apply Pointer NONNULL { void *ptr }; void *malloc(int POSITIVE); // May return a NULL pointer void free(void *ptr); // May not accept a NULL pointer Any function argument of the type you specify with the %apply directive will be checked with the appropriate constraint. Multiple types may be specified as follows : %apply Pointer NONNULL { void *, Vector *, List *, double *}; In this case, all of the types listed would be checked for non-NULL pointers. The common datatypes of int, short, long, unsigned int, unsigned long, unsigned short, unsigned char, signed char, float, and double can be checked without using the %apply directive by simply using the constraint name as the parameter name. For example : double sqrt(double NONNEGATIVE); double log(double POSITIVE); If you have used typedef to change type-names, you can also do this : %apply double { Real }; // Make everything defined for doubles // work for Reals. Real sqrt(Real NONNEGATIVE); Real log(Real POSITIVE); %} #endif %include #ifdef SWIGCSHARP // Required attribute for C# exception handling #define SWIGCSHARPCANTHROW , canthrow=1 #else #define SWIGCSHARPCANTHROW #endif // Positive numbers %typemap(check SWIGCSHARPCANTHROW) int POSITIVE, short POSITIVE, long POSITIVE, unsigned int POSITIVE, unsigned short POSITIVE, unsigned long POSITIVE, signed char POSITIVE, unsigned char POSITIVE, float POSITIVE, double POSITIVE, Number POSITIVE { if ($1 <= 0) { SWIG_exception(SWIG_ValueError,"Expected a positive value."); } } // Negative numbers %typemap(check SWIGCSHARPCANTHROW) int NEGATIVE, short NEGATIVE, long NEGATIVE, unsigned int NEGATIVE, unsigned short NEGATIVE, unsigned long NEGATIVE, signed char NEGATIVE, unsigned char NEGATIVE, float NEGATIVE, double NEGATIVE, Number NEGATIVE { if ($1 >= 0) { SWIG_exception(SWIG_ValueError,"Expected a negative value."); } } // Nonzero numbers %typemap(check SWIGCSHARPCANTHROW) int NONZERO, short NONZERO, long NONZERO, unsigned int NONZERO, unsigned short NONZERO, unsigned long NONZERO, signed char NONZERO, unsigned char NONZERO, float NONZERO, double NONZERO, Number NONZERO { if ($1 == 0) { SWIG_exception(SWIG_ValueError,"Expected a nonzero value."); } } // Nonnegative numbers %typemap(check SWIGCSHARPCANTHROW) int NONNEGATIVE, short NONNEGATIVE, long NONNEGATIVE, unsigned int NONNEGATIVE, unsigned short NONNEGATIVE, unsigned long NONNEGATIVE, signed char NONNEGATIVE, unsigned char NONNEGATIVE, float NONNEGATIVE, double NONNEGATIVE, Number NONNEGATIVE { if ($1 < 0) { SWIG_exception(SWIG_ValueError,"Expected a non-negative value."); } } // Nonpositive numbers %typemap(check SWIGCSHARPCANTHROW) int NONPOSITIVE, short NONPOSITIVE, long NONPOSITIVE, unsigned int NONPOSITIVE, unsigned short NONPOSITIVE, unsigned long NONPOSITIVE, signed char NONPOSITIVE, unsigned char NONPOSITIVE, float NONPOSITIVE, double NONPOSITIVE, Number NONPOSITIVE { if ($1 > 0) { SWIG_exception(SWIG_ValueError,"Expected a non-positive value."); } } // Non-NULL pointer %typemap(check SWIGCSHARPCANTHROW) void * NONNULL, Pointer NONNULL { if (!$1) { SWIG_exception(SWIG_ValueError,"Received a NULL pointer."); } } // Aligned pointers %typemap(check SWIGCSHARPCANTHROW) void * ALIGN8, Pointer ALIGN8 { unsigned long long tmp; tmp = (unsigned long long) $1; if (tmp & 7) { SWIG_exception(SWIG_ValueError,"Pointer must be 8-byte aligned."); } } %typemap(check SWIGCSHARPCANTHROW) void * ALIGN4, Pointer ALIGN4 { unsigned long long tmp; tmp = (unsigned long long) $1; if (tmp & 3) { SWIG_exception(SWIG_ValueError,"Pointer must be 4-byte aligned."); } } %typemap(check SWIGCSHARPCANTHROW) void * ALIGN2, Pointer ALIGN2 { unsigned long long tmp; tmp = (unsigned long long) $1; if (tmp & 1) { SWIG_exception(SWIG_ValueError,"Pointer must be 2-byte aligned."); } } swig-4.0.1/Lib/swigwarnings.swg0000644000175000017500000001566613527063513016340 0ustar williamwilliam/* Include the internal swig macro codes. These macros correspond to the one found in Source/Include/swigwarn.h plus the 'SWIG' prefix. For example, in the include file 'swigwarn.h' you will find #define WARN_TYPEMAP_CHARLEAK ... and in the 'swigwarn.swg' interface, you will see %define SWIGWARN_TYPEMAP_CHARLEAK ... This code can be used in warning filters as follows: %warnfilter(SWIGWARN_TYPEMAP_CHARLEAK); Warnings messages used in typemaps. Message names will be the same as those in Lib/swigwarn.swg but with the suffix _MSG. For example, for the code SWIGWARN_TYPEMAP_CHARLEAK, once you use %typemapmsg(CHARLEAK,); you use the message in your typemap as %typemap(varin,warning=SWIGWARN_TYPEMAP_CHARLEAK_MSG) char * while you suppress the warning using %warnfilter(SWIGWARN_TYPEMAP_CHARLEAK); as described above. */ /* ----------------------------------------------------------------------------- * SWIG warning codes * ----------------------------------------------------------------------------- */ %include /* ----------------------------------------------------------------------------- * Auxiliary macros * ----------------------------------------------------------------------------- */ /* Macro to define warning messages */ #define %_warningmsg(Val, Msg...) `Val`":"Msg #define %warningmsg(Val, Msg...) %_warningmsg(Val, Msg) /* ----------------------------------------------------------------------------- * Typemap related warning messages * ----------------------------------------------------------------------------- */ %define SWIGWARN_TYPEMAP_CHARLEAK_MSG "451:Setting a const char * variable may leak memory." %enddef %define SWIGWARN_TYPEMAP_SWIGTYPELEAK_MSG "454:Setting a pointer/reference variable may leak memory." %enddef %define SWIGWARN_TYPEMAP_THREAD_UNSAFE_MSG "470:Thread/reentrant unsafe wrapping, consider returning by value instead." %enddef %define SWIGWARN_TYPEMAP_DIRECTOROUT_PTR_MSG "473:Returning a pointer or reference in a director method is not recommended." %enddef %define SWIGWARN_TYPEMAP_INITIALIZER_LIST_MSG "476:Initialization using std::initializer_list." %enddef /* ----------------------------------------------------------------------------- * Operator related warning messages * ----------------------------------------------------------------------------- */ %define SWIGWARN_IGNORE_OPERATOR_NEW_MSG "350:operator new ignored" %enddef %define SWIGWARN_IGNORE_OPERATOR_DELETE_MSG "351:operator delete ignored" %enddef %define SWIGWARN_IGNORE_OPERATOR_PLUS_MSG "352:operator+ ignored" %enddef %define SWIGWARN_IGNORE_OPERATOR_MINUS_MSG "353:operator- ignored" %enddef %define SWIGWARN_IGNORE_OPERATOR_MUL_MSG "354:operator* ignored" %enddef %define SWIGWARN_IGNORE_OPERATOR_DIV_MSG "355:operator/ ignored" %enddef %define SWIGWARN_IGNORE_OPERATOR_MOD_MSG "356:operator% ignored" %enddef %define SWIGWARN_IGNORE_OPERATOR_XOR_MSG "357:operator^ ignored" %enddef %define SWIGWARN_IGNORE_OPERATOR_AND_MSG "358:operator& ignored" %enddef %define SWIGWARN_IGNORE_OPERATOR_OR_MSG "359:operator| ignored" %enddef %define SWIGWARN_IGNORE_OPERATOR_NOT_MSG "360:operator~ ignored" %enddef %define SWIGWARN_IGNORE_OPERATOR_LNOT_MSG "361:operator! ignored" %enddef %define SWIGWARN_IGNORE_OPERATOR_EQ_MSG "362:operator= ignored" %enddef %define SWIGWARN_IGNORE_OPERATOR_LT_MSG "363:operator< ignored" %enddef %define SWIGWARN_IGNORE_OPERATOR_GT_MSG "364:operator> ignored" %enddef %define SWIGWARN_IGNORE_OPERATOR_PLUSEQ_MSG "365:operator+= ignored" %enddef %define SWIGWARN_IGNORE_OPERATOR_MINUSEQ_MSG "366:operator-= ignored" %enddef %define SWIGWARN_IGNORE_OPERATOR_MULEQ_MSG "367:operator*= ignored" %enddef %define SWIGWARN_IGNORE_OPERATOR_DIVEQ_MSG "368:operator/= ignored" %enddef %define SWIGWARN_IGNORE_OPERATOR_MODEQ_MSG "369:operator%= ignored" %enddef %define SWIGWARN_IGNORE_OPERATOR_XOREQ_MSG "370:operator^= ignored" %enddef %define SWIGWARN_IGNORE_OPERATOR_ANDEQ_MSG "371:operator&= ignored" %enddef %define SWIGWARN_IGNORE_OPERATOR_OREQ_MSG "372:operator|= ignored" %enddef %define SWIGWARN_IGNORE_OPERATOR_LSHIFT_MSG "373:operator<< ignored" %enddef %define SWIGWARN_IGNORE_OPERATOR_RSHIFT_MSG "374:operator>> ignored" %enddef %define SWIGWARN_IGNORE_OPERATOR_LSHIFTEQ_MSG "375:operator<<= ignored" %enddef %define SWIGWARN_IGNORE_OPERATOR_RSHIFTEQ_MSG "376:operator>>= ignored" %enddef %define SWIGWARN_IGNORE_OPERATOR_EQUALTO_MSG "377:operator== ignored" %enddef %define SWIGWARN_IGNORE_OPERATOR_NOTEQUAL_MSG "378:operator!= ignored" %enddef %define SWIGWARN_IGNORE_OPERATOR_LTEQUAL_MSG "379:operator<= ignored" %enddef %define SWIGWARN_IGNORE_OPERATOR_GTEQUAL_MSG "380:operator>= ignored" %enddef %define SWIGWARN_IGNORE_OPERATOR_LAND_MSG "381:operator&& ignored" %enddef %define SWIGWARN_IGNORE_OPERATOR_LOR_MSG "382:operator|| ignored" %enddef %define SWIGWARN_IGNORE_OPERATOR_PLUSPLUS_MSG "383:operator++ ignored" %enddef %define SWIGWARN_IGNORE_OPERATOR_MINUSMINUS_MSG "384:operator-- ignored" %enddef %define SWIGWARN_IGNORE_OPERATOR_COMMA_MSG "385:operator-- ignored" %enddef %define SWIGWARN_IGNORE_OPERATOR_ARROWSTAR_MSG "386:operator->* ignored" %enddef %define SWIGWARN_IGNORE_OPERATOR_ARROW_MSG "387:operator-> ignored" %enddef %define SWIGWARN_IGNORE_OPERATOR_CALL_MSG "388:operator() ignored" %enddef %define SWIGWARN_IGNORE_OPERATOR_INDEX_MSG "389:operator[] ignored (consider using %%extend)" %enddef %define SWIGWARN_IGNORE_OPERATOR_UPLUS_MSG "390:operator+ ignored" %enddef %define SWIGWARN_IGNORE_OPERATOR_UMINUS_MSG "391:operator- ignored" %enddef %define SWIGWARN_IGNORE_OPERATOR_UMUL_MSG "392:operator* ignored" %enddef %define SWIGWARN_IGNORE_OPERATOR_UAND_MSG "393:operator& ignored" %enddef %define SWIGWARN_IGNORE_OPERATOR_NEWARR_MSG "394:operator new[] ignored" %enddef %define SWIGWARN_IGNORE_OPERATOR_DELARR_MSG "395:operator delete[] ignored" %enddef %define SWIGWARN_IGNORE_OPERATOR_REF_MSG "396:operator*() ignored" %enddef #define %ignoreoperator(Oper) %ignorewarn(SWIGWARN_IGNORE_OPERATOR_##Oper##_MSG) /* ----------------------------------------------------------------------------- * Macros for keyword and built-in names * ----------------------------------------------------------------------------- */ #define %keywordwarn(msg...) %namewarn(%warningmsg(SWIGWARN_PARSE_KEYWORD, msg)) #define %builtinwarn(msg...) %namewarn(%warningmsg(SWIGWARN_PARSE_BUILTIN_NAME, msg), %$isfunction) /* ----------------------------------------------------------------------------- * Warning filter feature * ----------------------------------------------------------------------------- */ #define %_warnfilter(filter...) %feature("warnfilter",`filter`) #define %warnfilter(filter...) %_warnfilter(filter) swig-4.0.1/Lib/allkw.swg0000644000175000017500000000131513527063513014712 0ustar williamwilliam#ifndef __Lib_allkw_swg__ #define __Lib_allkw_swg__ /* Include all the known keyword warnings. Very useful for adding test files to the test-suite, or checking if your own library is ok for all the swig supported languages. Use as swig -Wallkw ... If you add a new language, remember to create a separate languagekw.swg file, and add it here. */ %include %include %include %include %include %include %include %include %include %include %include %include #endif //__Lib_allkw_swg__ swig-4.0.1/Lib/runtime.swg0000644000175000017500000000232413527063513015264 0ustar williamwilliam/* -----------------------------------------------------------------------------* Standard SWIG API for use inside user code. Don't include this file directly, run the command swig -python -external-runtime Also, read the Modules chapter of the SWIG Manual. * -----------------------------------------------------------------------------*/ #ifdef SWIG_MODULE_CLIENTDATA_TYPE SWIGRUNTIMEINLINE swig_type_info * SWIG_TypeQuery(SWIG_MODULE_CLIENTDATA_TYPE clientdata, const char *name) { swig_module_info *module = SWIG_GetModule(clientdata); return SWIG_TypeQueryModule(module, module, name); } SWIGRUNTIMEINLINE swig_type_info * SWIG_MangledTypeQuery(SWIG_MODULE_CLIENTDATA_TYPE clientdata, const char *name) { swig_module_info *module = SWIG_GetModule(clientdata); return SWIG_MangledTypeQueryModule(module, module, name); } #else SWIGRUNTIMEINLINE swig_type_info * SWIG_TypeQuery(const char *name) { swig_module_info *module = SWIG_GetModule(NULL); return SWIG_TypeQueryModule(module, module, name); } SWIGRUNTIMEINLINE swig_type_info * SWIG_MangledTypeQuery(const char *name) { swig_module_info *module = SWIG_GetModule(NULL); return SWIG_MangledTypeQueryModule(module, module, name); } #endif swig-4.0.1/Lib/attribute.i0000644000175000017500000000076013527063513015236 0ustar williamwilliam/* ----------------------------------------------------------------------------- * attribute.i * * SWIG library file for implementing attributes. * ----------------------------------------------------------------------------- */ /* we use a simple exception warning here */ %{ #include %} #define %attribute_exception(code,msg) printf("%s\n",msg) #ifndef %arg #define %arg(x...) x #endif #ifndef %mangle #define %mangle(Type...) #@Type #endif %include swig-4.0.1/Lib/perl5/0000755000175000017500000000000013527063513014105 5ustar williamwilliamswig-4.0.1/Lib/perl5/std_deque.i0000644000175000017500000000003413527063513016231 0ustar williamwilliam%include swig-4.0.1/Lib/perl5/perl5.swg0000644000175000017500000000270413527063513015661 0ustar williamwilliam/* ------------------------------------------------------------ * perl.swg * * Perl configuration module. * ------------------------------------------------------------ */ /* ------------------------------------------------------------ * Inner macros * ------------------------------------------------------------ */ %include /* ------------------------------------------------------------ * The runtime part * ------------------------------------------------------------ */ %include /* ------------------------------------------------------------ * Special user directives * ------------------------------------------------------------ */ %include /* ------------------------------------------------------------ * Typemap specializations * ------------------------------------------------------------ */ %include /* ------------------------------------------------------------ * Overloaded operator support * ------------------------------------------------------------ */ %include /* ------------------------------------------------------------ * Warnings for Perl keywords * ------------------------------------------------------------ */ %include /* ------------------------------------------------------------ * The Perl initialization function * ------------------------------------------------------------ */ %include swig-4.0.1/Lib/perl5/director.swg0000644000175000017500000001613313527063513016446 0ustar williamwilliam/* ----------------------------------------------------------------------------- * director.swg * * This file contains support for director classes so that Perl proxy * methods can be called from C++. * ----------------------------------------------------------------------------- */ #ifndef SWIG_DIRECTOR_PERL_HEADER_ #define SWIG_DIRECTOR_PERL_HEADER_ #include #include #include #include #include /* Use -DSWIG_DIRECTOR_NORTTI if you prefer to avoid the use of the native C++ RTTI and dynamic_cast<>. But be aware that directors could stop working when using this option. */ #ifdef SWIG_DIRECTOR_NORTTI /* When we don't use the native C++ RTTI, we implement a minimal one only for Directors. */ # ifndef SWIG_DIRECTOR_RTDIR # define SWIG_DIRECTOR_RTDIR namespace Swig { class Director; SWIGINTERN std::map& get_rtdir_map() { static std::map rtdir_map; return rtdir_map; } SWIGINTERNINLINE void set_rtdir(void *vptr, Director *rtdir) { get_rtdir_map()[vptr] = rtdir; } SWIGINTERNINLINE Director *get_rtdir(void *vptr) { std::map::const_iterator pos = get_rtdir_map().find(vptr); Director *rtdir = (pos != get_rtdir_map().end()) ? pos->second : 0; return rtdir; } } # endif /* SWIG_DIRECTOR_RTDIR */ # define SWIG_DIRECTOR_CAST(ARG) Swig::get_rtdir(static_cast(ARG)) # define SWIG_DIRECTOR_RGTR(ARG1, ARG2) Swig::set_rtdir(static_cast(ARG1), ARG2) #else # define SWIG_DIRECTOR_CAST(ARG) dynamic_cast(ARG) # define SWIG_DIRECTOR_RGTR(ARG1, ARG2) #endif /* SWIG_DIRECTOR_NORTTI */ extern "C" { struct swig_type_info; } namespace Swig { /* memory handler */ struct GCItem { virtual ~GCItem() {} virtual int get_own() const { return 0; } }; struct GCItem_var { GCItem_var(GCItem *item = 0) : _item(item) { } GCItem_var& operator=(GCItem *item) { GCItem *tmp = _item; _item = item; delete tmp; return *this; } ~GCItem_var() { delete _item; } GCItem *operator->() const { return _item; } private: GCItem *_item; }; struct GCItem_Object : GCItem { GCItem_Object(int own) : _own(own) { } virtual ~GCItem_Object() { } int get_own() const { return _own; } private: int _own; }; template struct GCItem_T : GCItem { GCItem_T(Type *ptr) : _ptr(ptr) { } virtual ~GCItem_T() { delete _ptr; } private: Type *_ptr; }; template struct GCArray_T : GCItem { GCArray_T(Type *ptr) : _ptr(ptr) { } virtual ~GCArray_T() { delete[] _ptr; } private: Type *_ptr; }; /* base class for director exceptions */ class DirectorException : public std::exception { public: virtual SV *getNative() const = 0; }; /* exceptions emitted by Perl */ class DirectorMethodException : public DirectorException { protected: SV *err; public: DirectorMethodException(SV *sv = sv_mortalcopy(ERRSV)) : err(sv) { SvREFCNT_inc(err); } const char *what() const throw() { return SvPV_nolen(err); } SV *getNative() const { return sv_2mortal(newSVsv(err)); } static void raise(SV *sv) { throw DirectorMethodException(sv); } }; /* exceptions emitted by wrap code */ class DirectorWrapException : public DirectorException { protected: std::string msg; DirectorWrapException(const char *str) : msg(str) { } public: virtual ~DirectorWrapException() throw() { } const char *what() const throw() { return msg.c_str(); } virtual SV *getNative() const { return sv_2mortal(newSVpvn(msg.data(), msg.size())); } }; class DirectorTypeMismatchException : public DirectorWrapException { public: DirectorTypeMismatchException(const char *str) : DirectorWrapException(str) { } static void raise(const char *type, const char *msg) { std::string err = std::string(type); err += ": "; err += msg; throw DirectorTypeMismatchException(err.c_str()); } }; class DirectorPureVirtualException : public DirectorWrapException { public: DirectorPureVirtualException(const char *name) : DirectorWrapException("SWIG director pure virtual method called: ") { msg += name; } static void raise(const char *name) { throw DirectorPureVirtualException(name); } }; /* director base class */ class Director { private: /* pointer to the wrapped perl object */ SV *swig_self; /* class of wrapped perl object */ std::string swig_class; /* flag indicating whether the object is owned by perl or c++ */ mutable bool swig_disown_flag; /* decrement the reference count of the wrapped perl object */ void swig_decref() const { if (swig_disown_flag) { SvREFCNT_dec(swig_self); } } public: /* wrap a Perl object. */ Director(SV *pkg) : swig_disown_flag(false) { STRLEN len; char *str = SvPV(pkg, len); swig_class = std::string(str, len); swig_self = newRV_inc((SV *)newHV()); } /* discard our reference at destruction */ virtual ~Director() { swig_decref(); } /* return a pointer to the wrapped Perl object */ SV *swig_get_self() const { return swig_self; } const char *swig_get_class() const { return swig_class.c_str(); } /* acquire ownership of the wrapped Perl object (the sense of "disown" is from perl) */ void swig_disown() const { if (!swig_disown_flag) { swig_disown_flag=true; swig_incref(); } } /* increase the reference count of the wrapped Perl object */ void swig_incref() const { if (swig_disown_flag) { SvREFCNT_inc(swig_self); } } /* methods to implement pseudo protected director members */ virtual bool swig_get_inner(const char * /* swig_protected_method_name */) const { return true; } virtual void swig_set_inner(const char * /* swig_protected_method_name */, bool /* swig_val */) const { } /* ownership management */ private: typedef std::map swig_ownership_map; mutable swig_ownership_map swig_owner; public: template void swig_acquire_ownership_array(Type *vptr) const { if (vptr) { swig_owner[vptr] = new GCArray_T(vptr); } } template void swig_acquire_ownership(Type *vptr) const { if (vptr) { swig_owner[vptr] = new GCItem_T(vptr); } } void swig_acquire_ownership_obj(void *vptr, int own) const { if (vptr && own) { swig_owner[vptr] = new GCItem_Object(own); } } int swig_release_ownership(void *vptr) const { int own = 0; if (vptr) { swig_ownership_map::iterator iter = swig_owner.find(vptr); if (iter != swig_owner.end()) { own = iter->second->get_own(); swig_owner.erase(iter); } } return own; } }; } #endif swig-4.0.1/Lib/perl5/cpointer.i0000644000175000017500000000004113527063513016075 0ustar williamwilliam%include swig-4.0.1/Lib/perl5/perlruntime.swg0000644000175000017500000000050613527063513017176 0ustar williamwilliam %runtime "swigrun.swg" // Common C API type-checking code %runtime "swigerrors.swg" // SWIG errors %runtime "perlhead.swg" // Perl includes and fixes %runtime "perlerrors.swg" // Perl errors %runtime "perlrun.swg" // Perl runtime functions %runtime "noembed.h" // undefine Perl5 macros swig-4.0.1/Lib/perl5/perlprimtypes.swg0000644000175000017500000002023413527063513017547 0ustar williamwilliam/* ------------------------------------------------------------ * Primitive Types * ------------------------------------------------------------ */ /* bool */ %fragment(SWIG_From_frag(bool),"header") { SWIGINTERNINLINE SV * SWIG_From_dec(bool)(bool value) { return boolSV(value); } } %fragment(SWIG_AsVal_frag(bool),"header") { SWIGINTERN int SWIG_AsVal_dec(bool)(SV *obj, bool* val) { if (obj == &PL_sv_yes) { if (val) *val = true; return SWIG_OK; } else if (obj == &PL_sv_no) { if (val) *val = false; return SWIG_OK; } else { if (val) *val = SvTRUE(obj) ? true : false; return SWIG_AddCast(SWIG_OK); } } } /* long */ %fragment(SWIG_From_frag(long),"header") { SWIGINTERNINLINE SV * SWIG_From_dec(long)(long value) { SV *sv; if (IVSIZE >= sizeof(value) || (value >= IV_MIN && value <= IV_MAX)) sv = newSViv(value); else sv = newSVpvf("%ld", value); return sv_2mortal(sv); } } %fragment(SWIG_AsVal_frag(long),"header", fragment="", fragment="", fragment="SWIG_CanCastAsInteger") { SWIGINTERN int SWIG_AsVal_dec(long)(SV *obj, long* val) { if (SvUOK(obj)) { UV v = SvUV(obj); if (UVSIZE < sizeof(*val) || v <= LONG_MAX) { if (val) *val = v; return SWIG_OK; } return SWIG_OverflowError; } else if (SvIOK(obj)) { IV v = SvIV(obj); if (IVSIZE <= sizeof(*val) || (v >= LONG_MIN && v <= LONG_MAX)) { if(val) *val = v; return SWIG_OK; } return SWIG_OverflowError; } else { int dispatch = 0; const char *nptr = SvPV_nolen(obj); if (nptr) { char *endptr; long v; errno = 0; v = strtol(nptr, &endptr,0); if (errno == ERANGE) { errno = 0; return SWIG_OverflowError; } else { if (*endptr == '\0') { if (val) *val = v; return SWIG_Str2NumCast(SWIG_OK); } } } if (!dispatch) { double d; int res = SWIG_AddCast(SWIG_AsVal(double)(obj,&d)); if (SWIG_IsOK(res) && SWIG_CanCastAsInteger(&d, LONG_MIN, LONG_MAX)) { if (val) *val = (long)(d); return res; } } } return SWIG_TypeError; } } /* unsigned long */ %fragment(SWIG_From_frag(unsigned long),"header") { SWIGINTERNINLINE SV * SWIG_From_dec(unsigned long)(unsigned long value) { SV *sv; if (UVSIZE >= sizeof(value) || value <= UV_MAX) sv = newSVuv(value); else sv = newSVpvf("%lu", value); return sv_2mortal(sv); } } %fragment(SWIG_AsVal_frag(unsigned long),"header", fragment="", fragment="", fragment="SWIG_CanCastAsInteger") { SWIGINTERN int SWIG_AsVal_dec(unsigned long)(SV *obj, unsigned long *val) { if (SvUOK(obj)) { UV v = SvUV(obj); if (UVSIZE <= sizeof(*val) || v <= ULONG_MAX) { if (val) *val = v; return SWIG_OK; } return SWIG_OverflowError; } else if (SvIOK(obj)) { IV v = SvIV(obj); if (v >= 0 && (IVSIZE <= sizeof(*val) || v <= ULONG_MAX)) { if (val) *val = v; return SWIG_OK; } return SWIG_OverflowError; } else { int dispatch = 0; const char *nptr = SvPV_nolen(obj); if (nptr) { char *endptr; unsigned long v; errno = 0; v = strtoul(nptr, &endptr,0); if (errno == ERANGE) { errno = 0; return SWIG_OverflowError; } else { if (*endptr == '\0') { if (val) *val = v; return SWIG_Str2NumCast(SWIG_OK); } } } if (!dispatch) { double d; int res = SWIG_AddCast(SWIG_AsVal(double)(obj,&d)); if (SWIG_IsOK(res) && SWIG_CanCastAsInteger(&d, 0, ULONG_MAX)) { if (val) *val = (unsigned long)(d); return res; } } } return SWIG_TypeError; } } /* long long */ %fragment(SWIG_From_frag(long long),"header", fragment="SWIG_LongLongAvailable", fragment="") { %#ifdef SWIG_LONG_LONG_AVAILABLE SWIGINTERNINLINE SV * SWIG_From_dec(long long)(long long value) { SV *sv; if (IVSIZE >= sizeof(value) || (value >= IV_MIN && value <= IV_MAX)) sv = newSViv((IV)(value)); else { //sv = newSVpvf("%lld", value); doesn't work in non 64bit Perl char temp[256]; sprintf(temp, "%lld", value); sv = newSVpv(temp, 0); } return sv_2mortal(sv); } %#endif } %fragment(SWIG_AsVal_frag(long long),"header", fragment="SWIG_LongLongAvailable", fragment="", fragment="SWIG_CanCastAsInteger") { %#ifdef SWIG_LONG_LONG_AVAILABLE SWIGINTERN int SWIG_AsVal_dec(long long)(SV *obj, long long *val) { if (SvUOK(obj)) { UV v = SvUV(obj); /* pretty sure this could allow v == LLONG MAX */ if (UVSIZE < sizeof(*val) || v < LLONG_MAX) { if (val) *val = v; return SWIG_OK; } return SWIG_OverflowError; } else if (SvIOK(obj)) { IV v = SvIV(obj); if (IVSIZE <= sizeof(*val) || (v >= LLONG_MIN && v <= LLONG_MAX)) { if (val) *val = v; return SWIG_OK; } return SWIG_OverflowError; } else { int dispatch = 0; const char *nptr = SvPV_nolen(obj); if (nptr) { char *endptr; long long v; errno = 0; v = strtoll(nptr, &endptr,0); if (errno == ERANGE) { errno = 0; return SWIG_OverflowError; } else { if (*endptr == '\0') { if (val) *val = v; return SWIG_Str2NumCast(SWIG_OK); } } } if (!dispatch) { const double mant_max = 1LL << DBL_MANT_DIG; const double mant_min = -mant_max; double d; int res = SWIG_AddCast(SWIG_AsVal(double)(obj,&d)); if (SWIG_IsOK(res) && SWIG_CanCastAsInteger(&d, mant_min, mant_max)) { if (val) *val = (long long)(d); return res; } } } return SWIG_TypeError; } %#endif } /* unsigned long long */ %fragment(SWIG_From_frag(unsigned long long),"header", fragment="SWIG_LongLongAvailable", fragment="") { %#ifdef SWIG_LONG_LONG_AVAILABLE SWIGINTERNINLINE SV * SWIG_From_dec(unsigned long long)(unsigned long long value) { SV *sv; if (UVSIZE >= sizeof(value) || value <= UV_MAX) sv = newSVuv((UV)(value)); else { //sv = newSVpvf("%llu", value); doesn't work in non 64bit Perl char temp[256]; sprintf(temp, "%llu", value); sv = newSVpv(temp, 0); } return sv_2mortal(sv); } %#endif } %fragment(SWIG_AsVal_frag(unsigned long long),"header", fragment="SWIG_LongLongAvailable", fragment="", fragment="SWIG_CanCastAsInteger") { %#ifdef SWIG_LONG_LONG_AVAILABLE SWIGINTERN int SWIG_AsVal_dec(unsigned long long)(SV *obj, unsigned long long *val) { if (SvUOK(obj)) { /* pretty sure this should be conditional on * (UVSIZE <= sizeof(*val) || v <= ULLONG_MAX) */ if (val) *val = SvUV(obj); return SWIG_OK; } else if (SvIOK(obj)) { IV v = SvIV(obj); if (v >= 0 && (IVSIZE <= sizeof(*val) || v <= ULLONG_MAX)) { if (val) *val = v; return SWIG_OK; } else { return SWIG_OverflowError; } } else { int dispatch = 0; const char *nptr = SvPV_nolen(obj); if (nptr) { char *endptr; unsigned long long v; errno = 0; v = strtoull(nptr, &endptr,0); if (errno == ERANGE) { errno = 0; return SWIG_OverflowError; } else { if (*endptr == '\0') { if (val) *val = v; return SWIG_Str2NumCast(SWIG_OK); } } } if (!dispatch) { const double mant_max = 1LL << DBL_MANT_DIG; double d; int res = SWIG_AddCast(SWIG_AsVal(double)(obj,&d)); if (SWIG_IsOK(res) && SWIG_CanCastAsInteger(&d, 0, mant_max)) { if (val) *val = (unsigned long long)(d); return res; } } } return SWIG_TypeError; } %#endif } /* double */ %fragment(SWIG_From_frag(double),"header") { SWIGINTERNINLINE SV * SWIG_From_dec(double)(double value) { return sv_2mortal(newSVnv(value)); } } %fragment(SWIG_AsVal_frag(double),"header") { SWIGINTERN int SWIG_AsVal_dec(double)(SV *obj, double *val) { if (SvNIOK(obj)) { if (val) *val = SvNV(obj); return SWIG_OK; } else if (SvIOK(obj)) { if (val) *val = (double) SvIV(obj); return SWIG_AddCast(SWIG_OK); } else { const char *nptr = SvPV_nolen(obj); if (nptr) { char *endptr; double v; errno = 0; v = strtod(nptr, &endptr); if (errno == ERANGE) { errno = 0; return SWIG_OverflowError; } else { if (*endptr == '\0') { if (val) *val = v; return SWIG_Str2NumCast(SWIG_OK); } } } } return SWIG_TypeError; } } swig-4.0.1/Lib/perl5/std_vector.i0000644000175000017500000005550213527063513016442 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_vector.i * * SWIG typemaps for std::vector types * ----------------------------------------------------------------------------- */ %include // ------------------------------------------------------------------------ // std::vector // // The aim of all that follows would be to integrate std::vector with // Perl as much as possible, namely, to allow the user to pass and // be returned Perl arrays. // const declarations are used to guess the intent of the function being // exported; therefore, the following rationale is applied: // // -- f(std::vector), f(const std::vector&), f(const std::vector*): // the parameter being read-only, either a Perl sequence or a // previously wrapped std::vector can be passed. // -- f(std::vector&), f(std::vector*): // the parameter must be modified; therefore, only a wrapped std::vector // can be passed. // -- std::vector f(): // the vector is returned by copy; therefore, a Perl sequence of T:s // is returned which is most easily used in other Perl functions // -- std::vector& f(), std::vector* f(), const std::vector& f(), // const std::vector* f(): // the vector is returned by reference; therefore, a wrapped std::vector // is returned // ------------------------------------------------------------------------ %{ #include %} %fragment(""); %fragment(""); // exported class namespace std { template class vector { %typemap(in) vector (std::vector* v) { if (SWIG_ConvertPtr($input,(void **) &v, $&1_descriptor,1) != -1) { $1 = *v; } else if (SvROK($input)) { AV *av = (AV *)SvRV($input); if (SvTYPE(av) != SVt_PVAV) SWIG_croak("Type error in argument $argnum of $symname. " "Expected an array of " #T); SV **tv; I32 len = av_len(av) + 1; T* obj; for (int i=0; i& (std::vector temp, std::vector* v), const vector* (std::vector temp, std::vector* v) { if (SWIG_ConvertPtr($input,(void **) &v, $1_descriptor,1) != -1) { $1 = v; } else if (SvROK($input)) { AV *av = (AV *)SvRV($input); if (SvTYPE(av) != SVt_PVAV) SWIG_croak("Type error in argument $argnum of $symname. " "Expected an array of " #T); SV **tv; I32 len = av_len(av) + 1; T* obj; for (int i=0; i { size_t len = $1.size(); SV **svs = new SV*[len]; for (size_t i=0; i { { /* wrapped vector? */ std::vector< T >* v; if (SWIG_ConvertPtr($input,(void **) &v, $&1_descriptor,0) != -1) { $1 = 1; } else if (SvROK($input)) { /* native sequence? */ AV *av = (AV *)SvRV($input); if (SvTYPE(av) == SVt_PVAV) { I32 len = av_len(av) + 1; if (len == 0) { /* an empty sequence can be of any type */ $1 = 1; } else { /* check the first element only */ T* obj; SV **tv = av_fetch(av, 0, 0); if (SWIG_ConvertPtr(*tv, (void **)&obj, $descriptor(T *),0) != -1) $1 = 1; else $1 = 0; } } } else { $1 = 0; } } } %typecheck(SWIG_TYPECHECK_VECTOR) const vector&, const vector* { { /* wrapped vector? */ std::vector< T >* v; if (SWIG_ConvertPtr($input,(void **) &v, $1_descriptor,0) != -1) { $1 = 1; } else if (SvROK($input)) { /* native sequence? */ AV *av = (AV *)SvRV($input); if (SvTYPE(av) == SVt_PVAV) { I32 len = av_len(av) + 1; if (len == 0) { /* an empty sequence can be of any type */ $1 = 1; } else { /* check the first element only */ T* obj; SV **tv = av_fetch(av, 0, 0); if (SWIG_ConvertPtr(*tv, (void **)&obj, $descriptor(T *),0) != -1) $1 = 1; else $1 = 0; } } } else { $1 = 0; } } } public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef T value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; vector(unsigned int size = 0); vector(unsigned int size, const T& value); vector(const vector& other); unsigned int size() const; bool empty() const; void clear(); %rename(push) push_back; void push_back(const T& x); %extend { T pop() throw (std::out_of_range) { if (self->size() == 0) throw std::out_of_range("pop from empty vector"); T x = self->back(); self->pop_back(); return x; } T& get(int i) throw (std::out_of_range) { int size = int(self->size()); if (i>=0 && isize()); if (i>=0 && i class vector { %typemap(in) vector (std::vector* v) { int res = SWIG_ConvertPtr($input,(void **) &v, $&1_descriptor,0); if (SWIG_IsOK(res)){ $1 = *v; } else if (SvROK($input)) { AV *av = (AV *)SvRV($input); if (SvTYPE(av) != SVt_PVAV) SWIG_croak("Type error in argument $argnum of $symname. " "Expected an array of " #T); I32 len = av_len(av) + 1; for (int i=0; i& (std::vector temp,std::vector* v), const vector* (std::vector temp,std::vector* v) { int res = SWIG_ConvertPtr($input,(void **) &v, $1_descriptor,0); if (SWIG_IsOK(res)) { $1 = v; } else if (SvROK($input)) { AV *av = (AV *)SvRV($input); if (SvTYPE(av) != SVt_PVAV) SWIG_croak("Type error in argument $argnum of $symname. " "Expected an array of " #T); I32 len = av_len(av) + 1; for (int i=0; i { size_t len = $1.size(); SV **svs = new SV*[len]; for (size_t i=0; i { { /* wrapped vector? */ std::vector< T *>* v; int res = SWIG_ConvertPtr($input,(void **) &v, $&1_descriptor,0); if (SWIG_IsOK(res)) { $1 = 1; } else if (SvROK($input)) { /* native sequence? */ AV *av = (AV *)SvRV($input); if (SvTYPE(av) == SVt_PVAV) { I32 len = av_len(av) + 1; if (len == 0) { /* an empty sequence can be of any type */ $1 = 1; } else { /* check the first element only */ void *v; SV **tv = av_fetch(av, 0, 0); int res = SWIG_ConvertPtr(*tv, &v, $descriptor(T *),0); if (SWIG_IsOK(res)) $1 = 1; else $1 = 0; } } } else { $1 = 0; } } } %typecheck(SWIG_TYPECHECK_VECTOR) const vector&,const vector* { { /* wrapped vector? */ std::vector< T *> *v; int res = SWIG_ConvertPtr($input,%as_voidptrptr(&v), $1_descriptor,0); if (SWIG_IsOK(res)) { $1 = 1; } else if (SvROK($input)) { /* native sequence? */ AV *av = (AV *)SvRV($input); if (SvTYPE(av) == SVt_PVAV) { I32 len = av_len(av) + 1; if (len == 0) { /* an empty sequence can be of any type */ $1 = 1; } else { /* check the first element only */ void *v; SV **tv = av_fetch(av, 0, 0); int res = SWIG_ConvertPtr(*tv, &v, $descriptor(T *),0); if (SWIG_IsOK(res)) $1 = 1; else $1 = 0; } } } else { $1 = 0; } } } public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef T* value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; vector(unsigned int size = 0); vector(unsigned int size, T *value); vector(const vector& other); unsigned int size() const; bool empty() const; void clear(); %rename(push) push_back; void push_back(T *x); %extend { T *pop() throw (std::out_of_range) { if (self->size() == 0) throw std::out_of_range("pop from empty vector"); T *x = self->back(); self->pop_back(); return x; } T *get(int i) throw (std::out_of_range) { int size = int(self->size()); if (i>=0 && isize()); if (i>=0 && i class vector { %typemap(in) vector (std::vector* v) { if (SWIG_ConvertPtr($input,(void **) &v, $&1_descriptor,1) != -1){ $1 = *v; } else if (SvROK($input)) { AV *av = (AV *)SvRV($input); if (SvTYPE(av) != SVt_PVAV) SWIG_croak("Type error in argument $argnum of $symname. " "Expected an array of " #T); SV **tv; I32 len = av_len(av) + 1; for (int i=0; i& (std::vector temp, std::vector* v), const vector* (std::vector temp, std::vector* v) { if (SWIG_ConvertPtr($input,(void **) &v, $1_descriptor,1) != -1) { $1 = v; } else if (SvROK($input)) { AV *av = (AV *)SvRV($input); if (SvTYPE(av) != SVt_PVAV) SWIG_croak("Type error in argument $argnum of $symname. " "Expected an array of " #T); SV **tv; I32 len = av_len(av) + 1; for (int i=0; i { size_t len = $1.size(); SV **svs = new SV*[len]; for (size_t i=0; i { { /* wrapped vector? */ std::vector< T >* v; if (SWIG_ConvertPtr($input,(void **) &v, $&1_descriptor,0) != -1) { $1 = 1; } else if (SvROK($input)) { /* native sequence? */ AV *av = (AV *)SvRV($input); if (SvTYPE(av) == SVt_PVAV) { I32 len = av_len(av) + 1; if (len == 0) { /* an empty sequence can be of any type */ $1 = 1; } else { /* check the first element only */ SV **tv = av_fetch(av, 0, 0); if (CHECK_T(*tv)) $1 = 1; else $1 = 0; } } } else { $1 = 0; } } } %typecheck(SWIG_TYPECHECK_VECTOR) const vector&, const vector* { { /* wrapped vector? */ std::vector< T >* v; if (SWIG_ConvertPtr($input,(void **) &v, $1_descriptor,0) != -1) { $1 = 1; } else if (SvROK($input)) { /* native sequence? */ AV *av = (AV *)SvRV($input); if (SvTYPE(av) == SVt_PVAV) { I32 len = av_len(av) + 1; if (len == 0) { /* an empty sequence can be of any type */ $1 = 1; } else { /* check the first element only */ SV **tv = av_fetch(av, 0, 0); if (CHECK_T(*tv)) $1 = 1; else $1 = 0; } } } else { $1 = 0; } } } public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef T value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; vector(unsigned int size = 0); vector(unsigned int size, T value); vector(const vector& other); unsigned int size() const; bool empty() const; void clear(); %rename(push) push_back; void push_back(T x); %extend { T pop() throw (std::out_of_range) { if (self->size() == 0) throw std::out_of_range("pop from empty vector"); T x = self->back(); self->pop_back(); return x; } T get(int i) throw (std::out_of_range) { int size = int(self->size()); if (i>=0 && isize()); if (i>=0 && i SWIGRUNTIME const char * SWIG_Perl_TypeProxyName(const swig_type_info *type) { if (!type) return NULL; if (type->clientdata != NULL) { return (const char*) type->clientdata; } else { return type->name; } } /* Identical to SWIG_TypeCheck, except for strcmp comparison */ SWIGRUNTIME swig_cast_info * SWIG_TypeProxyCheck(const char *c, swig_type_info *ty) { if (ty) { swig_cast_info *iter = ty->cast; while (iter) { if (strcmp(SWIG_Perl_TypeProxyName(iter->type), c) == 0) { if (iter == ty->cast) return iter; /* Move iter to the top of the linked list */ iter->prev->next = iter->next; if (iter->next) iter->next->prev = iter->prev; iter->next = ty->cast; iter->prev = 0; if (ty->cast) ty->cast->prev = iter; ty->cast = iter; return iter; } iter = iter->next; } } return 0; } /* Acquire a pointer value */ SWIGRUNTIME int SWIG_Perl_AcquirePtr(SWIG_MAYBE_PERL_OBJECT SV *sv, int own) { /* TODO */ return 0; } /* Function for getting a pointer value */ SWIGRUNTIME int SWIG_Perl_ConvertPtrAndOwn(SWIG_MAYBE_PERL_OBJECT SV *sv, void **ptr, swig_type_info *_t, int flags, int *own) { swig_cast_info *tc; void *voidptr = (void *)0; SV *tsv = 0; if (own) *own = 0; /* If magical, apply more magic */ if (SvGMAGICAL(sv)) mg_get(sv); /* Check to see if this is an object */ if (sv_isobject(sv)) { IV tmp = 0; tsv = (SV*) SvRV(sv); if ((SvTYPE(tsv) == SVt_PVHV)) { MAGIC *mg; if (SvMAGICAL(tsv)) { mg = mg_find(tsv,'P'); if (mg) { sv = mg->mg_obj; if (sv_isobject(sv)) { tsv = (SV*)SvRV(sv); tmp = SvIV(tsv); } } } else { return SWIG_ERROR; } } else { tmp = SvIV(tsv); } voidptr = INT2PTR(void *,tmp); } else if (! SvOK(sv)) { /* Check for undef */ *(ptr) = (void *) 0; return (flags & SWIG_POINTER_NO_NULL) ? SWIG_NullReferenceError : SWIG_OK; } else if (SvTYPE(sv) == SVt_RV) { /* Check for NULL pointer */ if (!SvROK(sv)) { /* In Perl 5.12 and later, SVt_RV == SVt_IV, so sv could be a valid integer value. */ if (SvIOK(sv)) { return SWIG_ERROR; } else { /* NULL pointer (reference to undef). */ *(ptr) = (void *) 0; return SWIG_OK; } } else { return SWIG_ERROR; } } else { /* Don't know what it is */ return SWIG_ERROR; } if (_t) { /* Now see if the types match */ char *_c = HvNAME(SvSTASH(SvRV(sv))); tc = SWIG_TypeProxyCheck(_c,_t); #ifdef SWIG_DIRECTORS if (!tc && !sv_derived_from(sv,SWIG_Perl_TypeProxyName(_t))) { #else if (!tc) { #endif return SWIG_ERROR; } { int newmemory = 0; *ptr = SWIG_TypeCast(tc,voidptr,&newmemory); if (newmemory == SWIG_CAST_NEW_MEMORY) { assert(own); /* badly formed typemap which will lead to a memory leak - it must set and use own to delete *ptr */ if (own) *own = *own | SWIG_CAST_NEW_MEMORY; } } } else { *ptr = voidptr; } /* * DISOWN implementation: we need a perl guru to check this one. */ if (tsv && (flags & SWIG_POINTER_DISOWN)) { /* * almost copy paste code from below SWIG_POINTER_OWN setting */ SV *obj = sv; HV *stash = SvSTASH(SvRV(obj)); GV *gv = *(GV**)hv_fetch(stash, "OWNER", 5, TRUE); if (isGV(gv)) { HV *hv = GvHVn(gv); /* * To set ownership (see below), a newSViv(1) entry is added. * Hence, to remove ownership, we delete the entry. */ if (hv_exists_ent(hv, obj, 0)) { hv_delete_ent(hv, obj, 0, 0); } } } return SWIG_OK; } SWIGRUNTIME int SWIG_Perl_ConvertPtr(SWIG_MAYBE_PERL_OBJECT SV *sv, void **ptr, swig_type_info *_t, int flags) { return SWIG_Perl_ConvertPtrAndOwn(sv, ptr, _t, flags, 0); } SWIGRUNTIME void SWIG_Perl_MakePtr(SWIG_MAYBE_PERL_OBJECT SV *sv, void *ptr, swig_type_info *t, int flags) { if (ptr && (flags & (SWIG_SHADOW | SWIG_POINTER_OWN))) { SV *self; SV *obj=newSV(0); HV *hash=newHV(); HV *stash; sv_setref_pv(obj, SWIG_Perl_TypeProxyName(t), ptr); stash=SvSTASH(SvRV(obj)); if (flags & SWIG_POINTER_OWN) { HV *hv; GV *gv = *(GV**)hv_fetch(stash, "OWNER", 5, TRUE); if (!isGV(gv)) gv_init(gv, stash, "OWNER", 5, FALSE); hv=GvHVn(gv); hv_store_ent(hv, obj, newSViv(1), 0); } sv_magic((SV *)hash, (SV *)obj, 'P', Nullch, 0); SvREFCNT_dec(obj); self=newRV_noinc((SV *)hash); sv_setsv(sv, self); SvREFCNT_dec((SV *)self); sv_bless(sv, stash); } else { sv_setref_pv(sv, SWIG_Perl_TypeProxyName(t), ptr); } } SWIGRUNTIMEINLINE SV * SWIG_Perl_NewPointerObj(SWIG_MAYBE_PERL_OBJECT void *ptr, swig_type_info *t, int flags) { SV *result = sv_newmortal(); SWIG_MakePtr(result, ptr, t, flags); return result; } SWIGRUNTIME void SWIG_Perl_MakePackedObj(SWIG_MAYBE_PERL_OBJECT SV *sv, void *ptr, int sz, swig_type_info *type) { char result[1024]; char *r = result; if ((2*sz + 1 + strlen(SWIG_Perl_TypeProxyName(type))) > 1000) return; *(r++) = '_'; r = SWIG_PackData(r,ptr,sz); strcpy(r,SWIG_Perl_TypeProxyName(type)); sv_setpv(sv, result); } SWIGRUNTIME SV * SWIG_Perl_NewPackedObj(SWIG_MAYBE_PERL_OBJECT void *ptr, int sz, swig_type_info *type) { SV *result = sv_newmortal(); SWIG_Perl_MakePackedObj(result, ptr, sz, type); return result; } /* Convert a packed pointer value */ SWIGRUNTIME int SWIG_Perl_ConvertPacked(SWIG_MAYBE_PERL_OBJECT SV *obj, void *ptr, int sz, swig_type_info *ty) { swig_cast_info *tc; const char *c = 0; if ((!obj) || (!SvOK(obj))) return SWIG_ERROR; c = SvPV_nolen(obj); /* Pointer values must start with leading underscore */ if (*c != '_') return SWIG_ERROR; c++; c = SWIG_UnpackData(c,ptr,sz); if (ty) { tc = SWIG_TypeCheck(c,ty); if (!tc) return SWIG_ERROR; } return SWIG_OK; } /* Macros for low-level exception handling */ #define SWIG_croak(x) { SWIG_Error(SWIG_RuntimeError, x); SWIG_fail; } typedef XSPROTO(SwigPerlWrapper); typedef SwigPerlWrapper *SwigPerlWrapperPtr; /* Structure for command table */ typedef struct { const char *name; SwigPerlWrapperPtr wrapper; } swig_command_info; /* Information for constant table */ #define SWIG_INT 1 #define SWIG_FLOAT 2 #define SWIG_STRING 3 #define SWIG_POINTER 4 #define SWIG_BINARY 5 /* Constant information structure */ typedef struct swig_constant_info { int type; const char *name; long lvalue; double dvalue; void *pvalue; swig_type_info **ptype; } swig_constant_info; /* Structure for variable table */ typedef struct { const char *name; SwigMagicFunc set; SwigMagicFunc get; swig_type_info **type; } swig_variable_info; /* Magic variable code */ #ifndef PERL_OBJECT # ifdef __cplusplus # define swig_create_magic(s,a,b,c) _swig_create_magic(s,const_cast(a),b,c) # else # define swig_create_magic(s,a,b,c) _swig_create_magic(s,(char*)(a),b,c) # endif # ifndef MULTIPLICITY SWIGRUNTIME void _swig_create_magic(SV *sv, char *name, int (*set)(SV *, MAGIC *), int (*get)(SV *,MAGIC *)) # else SWIGRUNTIME void _swig_create_magic(SV *sv, char *name, int (*set)(struct interpreter*, SV *, MAGIC *), int (*get)(struct interpreter*, SV *,MAGIC *)) # endif #else # define swig_create_magic(s,a,b,c) _swig_create_magic(pPerl,s,a,b,c) SWIGRUNTIME void _swig_create_magic(CPerlObj *pPerl, SV *sv, const char *name, int (CPerlObj::*set)(SV *, MAGIC *), int (CPerlObj::*get)(SV *, MAGIC *)) #endif { MAGIC *mg; sv_magic(sv,sv,'U',name,strlen(name)); mg = mg_find(sv,'U'); mg->mg_virtual = (MGVTBL *) malloc(sizeof(MGVTBL)); mg->mg_virtual->svt_get = (SwigMagicFunc) get; mg->mg_virtual->svt_set = (SwigMagicFunc) set; mg->mg_virtual->svt_len = 0; mg->mg_virtual->svt_clear = 0; mg->mg_virtual->svt_free = 0; } SWIGRUNTIME swig_module_info * SWIG_Perl_GetModule(void *SWIGUNUSEDPARM(clientdata)) { static void *type_pointer = (void *)0; SV *pointer; /* first check if pointer already created */ if (!type_pointer) { pointer = get_sv("swig_runtime_data::type_pointer" SWIG_RUNTIME_VERSION SWIG_TYPE_TABLE_NAME, FALSE | GV_ADDMULTI); if (pointer && SvOK(pointer)) { type_pointer = INT2PTR(swig_type_info **, SvIV(pointer)); } } return (swig_module_info *) type_pointer; } SWIGRUNTIME void SWIG_Perl_SetModule(swig_module_info *module) { SV *pointer; /* create a new pointer */ pointer = get_sv("swig_runtime_data::type_pointer" SWIG_RUNTIME_VERSION SWIG_TYPE_TABLE_NAME, TRUE | GV_ADDMULTI); sv_setiv(pointer, PTR2IV(module)); } #ifdef __cplusplus } #endif swig-4.0.1/Lib/perl5/Makefile.in0000644000175000017500000000664413527063513016164 0ustar williamwilliam# --------------------------------------------------------------- # SWIG Perl5 Makefile # # This file can be used to build various Perl5 extensions with SWIG. # By default this file is set up for dynamic loading, but it can # be easily customized for static extensions by modifying various # portions of the file. # # SRCS = C source files # CXXSRCS = C++ source files # OBJCSRCS = Objective-C source files # OBJS = Additional .o files (compiled previously) # INTERFACE = SWIG interface file # TARGET = Name of target module or executable # # Many portions of this file were created by the SWIG configure # script and should already reflect your machine. #---------------------------------------------------------------- SRCS = CXXSRCS = OBJCSRCS = OBJS = INTERFACE = WRAPFILE = $(INTERFACE:.i=_wrap.c) WRAPOBJ = $(INTERFACE:.i=_wrap.o) TARGET = module@SO@ # Use this kind of target for dynamic loading #TARGET = myperl # Use this target for static linking prefix = @prefix@ exec_prefix = @exec_prefix@ CC = @CC@ CXX = @CXX@ OBJC = @CC@ -Wno-import # -Wno-import needed for gcc CFLAGS = INCLUDES = LIBS = # SWIG Options # SWIG = location of the SWIG executable # SWIGOPT = SWIG compiler options # SWIGCC = Compiler used to compile the wrapper file SWIG = $(exec_prefix)/bin/swig SWIGOPT = -perl5 SWIGCC = $(CC) # SWIG Library files. Uncomment this to statically rebuild Perl #SWIGLIBS = -static -lperlmain.i # Rules for creating .o files from source. COBJS = $(SRCS:.c=.o) CXXOBJS = $(CXXSRCS:.cxx=.o) OBJCOBJS = $(OBJCSRCS:.m=.o) ALLOBJS = $(COBJS) $(CXXOBJS) $(OBJCOBJS) $(OBJS) # Command that will be used to build the final extension. BUILD = $(SWIGCC) # Uncomment the following if you are using dynamic loading CCSHARED = @CCSHARED@ BUILD = @LDSHARED@ # Uncomment the following if you are using dynamic loading with C++ and # need to provide additional link libraries (this is not always required). #DLL_LIBS = -L/usr/local/lib/gcc-lib/sparc-sun-solaris2.5.1/2.7.2 \ -L/usr/local/lib -lg++ -lstdc++ -lgcc # Perl installation PERL_INCLUDE = -I@PERL5EXT@ PERL_LIB = -L@PERL5EXT@ -lperl PERL_FLAGS = -Dbool=char -Dexplicit= # Build libraries (needed for static builds) LIBM = @LIBM@ LIBC = @LIBC@ SYSLIBS = $(LIBM) $(LIBC) @LIBS@ # Build options BUILD_LIBS = $(LIBS) # Dynamic loading # Compilation rules for non-SWIG components .SUFFIXES: .c .cxx .m .c.o: $(CC) $(CCSHARED) $(CFLAGS) $(INCLUDES) -c $< .cxx.o: $(CXX) $(CCSHARED) $(CXXFLAGS) $(INCLUDES) -c $< .m.o: $(OBJC) $(CCSHARED) $(CFLAGS) $(INCLUDES) -c $< # ---------------------------------------------------------------------- # Rules for building the extension # ---------------------------------------------------------------------- all: $(TARGET) # Convert the wrapper file into an object file $(WRAPOBJ) : $(WRAPFILE) $(SWIGCC) -c $(CCSHARED) $(CFLAGS) $(INCLUDES) $(PERL_INCLUDE) $(PERL_FLAGS) $(WRAPFILE) $(WRAPFILE) : $(INTERFACE) $(SWIG) $(SWIGOPT) -o $(WRAPFILE) $(SWIGLIBS) $(INTERFACE) $(TARGET): $(WRAPOBJ) $(ALLOBJS) $(BUILD) $(WRAPOBJ) $(ALLOBJS) $(BUILD_LIBS) -o $(TARGET) clean: rm -f $(COBJS) $(CXXOBJS) $(OBJCOBJS) $(WRAPOBJ) $(WRAPFILE) $(TARGET) swig-4.0.1/Lib/perl5/Makefile.pl0000644000175000017500000000126013527063513016156 0ustar williamwilliam# File : Makefile.pl # MakeMaker file for a SWIG module. Use this file if you are # producing a module for general use or distribution. # # 1. Modify the file as appropriate. Replace $module with the # real name of your module and wrapper file. # 2. Run perl as 'perl Makefile.pl' # 3. Type 'make' to build your module # 4. Type 'make install' to install your module. # # See "Programming Perl", 2nd. Ed, for more gory details than # you ever wanted to know. use ExtUtils::MakeMaker; WriteMakefile( 'NAME' => '$module', # Name of your module 'LIBS' => [''], # Custom libraries (if any) 'OBJECT' => '$module_wrap.o' # Object files ); swig-4.0.1/Lib/perl5/perlmain.i0000644000175000017500000000370213527063513016070 0ustar williamwilliam/* ----------------------------------------------------------------------------- * perlmain.i * * Code to statically rebuild perl5. * ----------------------------------------------------------------------------- */ #ifdef AUTODOC %subsection "perlmain.i" %text %{ This module provides support for building a new version of the Perl executable. This will be necessary on systems that do not support shared libraries and may be necessary with C++ extensions. This module may only build a stripped down version of the Perl executable. Thus, it may be necessary (or desirable) to hand-edit this file for your particular application. To do this, simply copy this file from swig_lib/perl5/perlmain.i to your working directory and make the appropriate modifications. This library file works with Perl 5.003. It may work with earlier versions, but it hasn't been tested. As far as I know, this library is C++ safe. %} #endif %{ static void xs_init _((pTHX)); static PerlInterpreter *my_perl; int perl_eval(char *string) { char *argv[2]; argv[0] = string; argv[1] = (char *) 0; return perl_call_argv("eval",0,argv); } int main(int argc, char **argv, char **env) { int exitstatus; my_perl = perl_alloc(); if (!my_perl) exit(1); perl_construct( my_perl ); exitstatus = perl_parse( my_perl, xs_init, argc, argv, (char **) NULL ); if (exitstatus) exit( exitstatus ); /* Initialize all of the module variables */ exitstatus = perl_run( my_perl ); perl_destruct( my_perl ); perl_free( my_perl ); exit( exitstatus ); } /* Register any extra external extensions */ /* Do not delete this line--writemain depends on it */ /* EXTERN_C void boot_DynaLoader _((CV* cv)); */ static void xs_init(pTHX) { /* dXSUB_SYS; */ char *file = __FILE__; { /* newXS("DynaLoader::boot_DynaLoader", boot_DynaLoader, file); */ newXS(SWIG_name, SWIG_init, file); #ifdef SWIGMODINIT SWIGMODINIT #endif } } %} swig-4.0.1/Lib/perl5/perlhead.swg0000644000175000017500000000506613527063513016422 0ustar williamwilliam#ifdef __cplusplus /* Needed on some windows machines---since MS plays funny games with the header files under C++ */ #include #include extern "C" { #endif #include "EXTERN.h" #include "perl.h" #include "XSUB.h" /* Add in functionality missing in older versions of Perl. Much of this is based on Devel-PPPort on cpan. */ /* Add PERL_REVISION, PERL_VERSION, PERL_SUBVERSION if missing */ #ifndef PERL_REVISION # if !defined(__PATCHLEVEL_H_INCLUDED__) && !(defined(PATCHLEVEL) && defined(SUBVERSION)) # define PERL_PATCHLEVEL_H_IMPLICIT # include # endif # if !(defined(PERL_VERSION) || (defined(SUBVERSION) && defined(PATCHLEVEL))) # include # endif # ifndef PERL_REVISION # define PERL_REVISION (5) # define PERL_VERSION PATCHLEVEL # define PERL_SUBVERSION SUBVERSION # endif #endif #if defined(WIN32) && defined(PERL_OBJECT) && !defined(PerlIO_exportFILE) #define PerlIO_exportFILE(fh,fl) (FILE*)(fh) #endif #ifndef SvIOK_UV # define SvIOK_UV(sv) (SvIOK(sv) && (SvUVX(sv) == SvIVX(sv))) #endif #ifndef SvUOK # define SvUOK(sv) SvIOK_UV(sv) #endif #if ((PERL_VERSION < 4) || ((PERL_VERSION == 4) && (PERL_SUBVERSION <= 5))) # define PL_sv_undef sv_undef # define PL_na na # define PL_errgv errgv # define PL_sv_no sv_no # define PL_sv_yes sv_yes # define PL_markstack_ptr markstack_ptr #endif #ifndef IVSIZE # ifdef LONGSIZE # define IVSIZE LONGSIZE # else # define IVSIZE 4 /* A bold guess, but the best we can make. */ # endif #endif #ifndef INT2PTR # if (IVSIZE == PTRSIZE) && (UVSIZE == PTRSIZE) # define PTRV UV # define INT2PTR(any,d) (any)(d) # else # if PTRSIZE == LONGSIZE # define PTRV unsigned long # else # define PTRV unsigned # endif # define INT2PTR(any,d) (any)(PTRV)(d) # endif # define NUM2PTR(any,d) (any)(PTRV)(d) # define PTR2IV(p) INT2PTR(IV,p) # define PTR2UV(p) INT2PTR(UV,p) # define PTR2NV(p) NUM2PTR(NV,p) # if PTRSIZE == LONGSIZE # define PTR2ul(p) (unsigned long)(p) # else # define PTR2ul(p) INT2PTR(unsigned long,p) # endif #endif /* !INT2PTR */ #ifndef SvPV_nolen # define SvPV_nolen(x) SvPV(x,PL_na) #endif #ifndef get_sv # define get_sv perl_get_sv #endif #ifndef ERRSV # define ERRSV get_sv("@",FALSE) #endif #ifndef pTHX_ #define pTHX_ #endif #include #ifdef __cplusplus } #endif swig-4.0.1/Lib/perl5/perlfragments.swg0000644000175000017500000000105413527063513017500 0ustar williamwilliam/* Create a file with this name, 'perlfragments.swg', in your working directory and add all the %fragments you want to take precedence over the ones defined by default by swig. For example, if you add: %fragment(SWIG_AsVal_frag(int),"header") { SWIGINTERNINLINE int SWIG_AsVal(int)(PyObject *obj, int *val) { ; } } this will replace the code used to retrieve an integer value for all the typemaps that need it, including: int, std::vector, std::list >, etc. */ swig-4.0.1/Lib/perl5/perlstrings.swg0000644000175000017500000000262113527063513017204 0ustar williamwilliam/* ------------------------------------------------------------ * utility methods for char strings * ------------------------------------------------------------ */ %fragment("SWIG_AsCharPtrAndSize","header",fragment="SWIG_pchar_descriptor") { SWIGINTERN int SWIG_AsCharPtrAndSize(SV *obj, char** cptr, size_t* psize, int *alloc) { if (SvMAGICAL(obj)) { SV *tmp = sv_newmortal(); SvSetSV(tmp, obj); obj = tmp; } if (SvPOK(obj)) { STRLEN len = 0; char *cstr = SvPV(obj, len); size_t size = len + 1; if (cptr) { if (alloc) { if (*alloc == SWIG_NEWOBJ) { *cptr = %new_copy_array(cstr, size, char); } else { *cptr = cstr; *alloc = SWIG_OLDOBJ; } } } if (psize) *psize = size; return SWIG_OK; } else { swig_type_info* pchar_descriptor = SWIG_pchar_descriptor(); if (pchar_descriptor) { char* vptr = 0; if (SWIG_ConvertPtr(obj, (void**)&vptr, pchar_descriptor, 0) == SWIG_OK) { if (cptr) *cptr = vptr; if (psize) *psize = vptr ? (strlen(vptr) + 1) : 0; if (alloc) *alloc = SWIG_OLDOBJ; return SWIG_OK; } } } return SWIG_TypeError; } } %fragment("SWIG_FromCharPtrAndSize","header") { SWIGINTERNINLINE SV * SWIG_FromCharPtrAndSize(const char* carray, size_t size) { SV *obj = sv_newmortal(); if (carray) { sv_setpvn(obj, carray, size); } else { sv_setsv(obj, &PL_sv_undef); } return obj; } } swig-4.0.1/Lib/perl5/attribute.i0000644000175000017500000000004213527063513016256 0ustar williamwilliam%include swig-4.0.1/Lib/perl5/noembed.h0000644000175000017500000000311413527063513015666 0ustar williamwilliam/* Workaround perl5 global namespace pollution. Note that undefining library * functions like fopen will not solve the problem on all platforms as fopen * might be a macro on Windows but not necessarily on other operating systems. */ #ifdef do_open #undef do_open #endif #ifdef do_close #undef do_close #endif #ifdef do_exec #undef do_exec #endif #ifdef scalar #undef scalar #endif #ifdef list #undef list #endif #ifdef apply #undef apply #endif #ifdef convert #undef convert #endif #ifdef Error #undef Error #endif #ifdef form #undef form #endif #ifdef vform #undef vform #endif #ifdef LABEL #undef LABEL #endif #ifdef METHOD #undef METHOD #endif #ifdef Move #undef Move #endif #ifdef yylex #undef yylex #endif #ifdef yyparse #undef yyparse #endif #ifdef yyerror #undef yyerror #endif #ifdef invert #undef invert #endif #ifdef ref #undef ref #endif #ifdef read #undef read #endif #ifdef write #undef write #endif #ifdef eof #undef eof #endif #ifdef close #undef close #endif #ifdef rewind #undef rewind #endif #ifdef free #undef free #endif #ifdef malloc #undef malloc #endif #ifdef calloc #undef calloc #endif #ifdef Stat #undef Stat #endif #ifdef check #undef check #endif #ifdef seekdir #undef seekdir #endif #ifdef open #undef open #endif #ifdef readdir #undef readdir #endif #ifdef bind #undef bind #endif #ifdef access #undef access #endif #ifdef stat #undef stat #endif #ifdef seed #undef seed #endif #ifdef bool /* Leave if macro is from C99 stdbool.h */ #ifndef __bool_true_false_are_defined #undef bool #endif #endif swig-4.0.1/Lib/perl5/perlmacros.swg0000644000175000017500000000004413527063513016774 0ustar williamwilliam%include swig-4.0.1/Lib/perl5/cmalloc.i0000644000175000017500000000004013527063513015663 0ustar williamwilliam%include swig-4.0.1/Lib/perl5/extra-install.list0000644000175000017500000000006213527063513017567 0ustar williamwilliam# see top-level Makefile.in Makefile.pl noembed.h swig-4.0.1/Lib/perl5/std_common.i0000644000175000017500000000121613527063513016421 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_common.i * * SWIG typemaps for STL - common utilities * ----------------------------------------------------------------------------- */ %include %apply size_t { std::size_t }; %fragment(""); %{ SWIGINTERN double SwigSvToNumber(SV* sv) { return SvIOK(sv) ? double(SvIVX(sv)) : SvNVX(sv); } SWIGINTERN std::string SwigSvToString(SV* sv) { STRLEN len; char *ptr = SvPV(sv, len); return std::string(ptr, len); } SWIGINTERN void SwigSvFromString(SV* sv, const std::string& s) { sv_setpvn(sv,s.data(),s.size()); } %} swig-4.0.1/Lib/perl5/perlinit.swg0000644000175000017500000000376113527063513016464 0ustar williamwilliam /* Export the SWIG initialization function */ %header %{ #ifdef __cplusplus extern "C" #endif #ifndef PERL_OBJECT #ifndef MULTIPLICITY SWIGEXPORT void SWIG_init (CV* cv); #else SWIGEXPORT void SWIG_init (pTHXo_ CV* cv); #endif #else SWIGEXPORT void SWIG_init (CV *cv, CPerlObj *); #endif %} /* Module initialization function */ %insert(init) "swiginit.swg" %init %{ #if defined(__cplusplus) && ! defined(XSPROTO) extern "C" #endif XS(SWIG_init) { dXSARGS; int i; (void)items; SWIG_InitializeModule(0); /* Install commands */ for (i = 0; swig_commands[i].name; i++) { /* Casts only needed for Perl < 5.10. */ #ifdef __cplusplus newXS(const_cast(swig_commands[i].name), swig_commands[i].wrapper, const_cast(__FILE__)); #else newXS((char*)swig_commands[i].name, swig_commands[i].wrapper, (char*)__FILE__); #endif } /* Install variables */ for (i = 0; swig_variables[i].name; i++) { SV *sv; sv = get_sv(swig_variables[i].name, TRUE | 0x2 | GV_ADDMULTI); if (swig_variables[i].type) { SWIG_MakePtr(sv,(void *)1, *swig_variables[i].type,0); } else { sv_setiv(sv,(IV) 0); } swig_create_magic(sv, swig_variables[i].name, swig_variables[i].set, swig_variables[i].get); } /* Install constant */ for (i = 0; swig_constants[i].type; i++) { SV *sv; sv = get_sv(swig_constants[i].name, TRUE | 0x2 | GV_ADDMULTI); switch(swig_constants[i].type) { case SWIG_INT: sv_setiv(sv, (IV) swig_constants[i].lvalue); break; case SWIG_FLOAT: sv_setnv(sv, (double) swig_constants[i].dvalue); break; case SWIG_STRING: sv_setpv(sv, (const char *) swig_constants[i].pvalue); break; case SWIG_POINTER: SWIG_MakePtr(sv, swig_constants[i].pvalue, *(swig_constants[i].ptype),0); break; case SWIG_BINARY: SWIG_MakePackedObj(sv, swig_constants[i].pvalue, swig_constants[i].lvalue, *(swig_constants[i].ptype)); break; default: break; } SvREADONLY_on(sv); } %} swig-4.0.1/Lib/perl5/std_except.i0000644000175000017500000000004313527063513016416 0ustar williamwilliam%include swig-4.0.1/Lib/perl5/reference.i0000644000175000017500000001611713527063513016223 0ustar williamwilliam/* ----------------------------------------------------------------------------- * reference.i * * Accept Perl references as pointers * ----------------------------------------------------------------------------- */ /* The following methods make Perl references work like simple C pointers. References can only be used for simple input/output values, not C arrays however. It should also be noted that REFERENCES are specific to Perl and not supported in other scripting languages at this time. int *REFERENCE short *REFERENCE long *REFERENCE unsigned int *REFERENCE unsigned short *REFERENCE unsigned long *REFERENCE unsigned char *REFERENCE float *REFERENCE double *REFERENCE For example, suppose you were trying to wrap the following function : void neg(double *x) { *x = -(*x); } You could wrap it with SWIG as follows : %include reference.i void neg(double *REFERENCE); or you can use the %apply directive : %include reference.i %apply double *REFERENCE { double *x }; void neg(double *x); Unlike the INOUT mapping described in typemaps.i, this approach directly modifies the value of a Perl reference. Thus, you could use it as follows : $x = 3; neg(\$x); print "$x\n"; # Should print out -3. */ %typemap(in) double *REFERENCE (double dvalue), double &REFERENCE(double dvalue) { SV *tempsv; if (!SvROK($input)) { SWIG_croak("expected a reference"); } tempsv = SvRV($input); if ((!SvNOK(tempsv)) && (!SvIOK(tempsv))) { printf("Received %d\n", SvTYPE(tempsv)); SWIG_croak("Expected a double reference."); } dvalue = SvNV(tempsv); $1 = &dvalue; } %typemap(in) float *REFERENCE (float dvalue), float &REFERENCE(float dvalue) { SV *tempsv; if (!SvROK($input)) { SWIG_croak("expected a reference"); } tempsv = SvRV($input); if ((!SvNOK(tempsv)) && (!SvIOK(tempsv))) { SWIG_croak("expected a double reference"); } dvalue = (float) SvNV(tempsv); $1 = &dvalue; } %typemap(in) int *REFERENCE (int dvalue), int &REFERENCE (int dvalue) { SV *tempsv; if (!SvROK($input)) { SWIG_croak("expected a reference"); } tempsv = SvRV($input); if (!SvIOK(tempsv)) { SWIG_croak("expected an integer reference"); } dvalue = SvIV(tempsv); $1 = &dvalue; } %typemap(in) short *REFERENCE (short dvalue), short &REFERENCE(short dvalue) { SV *tempsv; if (!SvROK($input)) { SWIG_croak("expected a reference"); } tempsv = SvRV($input); if (!SvIOK(tempsv)) { SWIG_croak("expected an integer reference"); } dvalue = (short) SvIV(tempsv); $1 = &dvalue; } %typemap(in) long *REFERENCE (long dvalue), long &REFERENCE(long dvalue) { SV *tempsv; if (!SvROK($input)) { SWIG_croak("expected a reference"); } tempsv = SvRV($input); if (!SvIOK(tempsv)) { SWIG_croak("expected an integer reference"); } dvalue = (long) SvIV(tempsv); $1 = &dvalue; } %typemap(in) unsigned int *REFERENCE (unsigned int dvalue), unsigned int &REFERENCE(unsigned int dvalue) { SV *tempsv; if (!SvROK($input)) { SWIG_croak("expected a reference"); } tempsv = SvRV($input); if (!SvIOK(tempsv)) { SWIG_croak("expected an integer reference"); } dvalue = (unsigned int) SvUV(tempsv); $1 = &dvalue; } %typemap(in) unsigned short *REFERENCE (unsigned short dvalue), unsigned short &REFERENCE(unsigned short dvalue) { SV *tempsv; if (!SvROK($input)) { SWIG_croak("expected a reference"); } tempsv = SvRV($input); if (!SvIOK(tempsv)) { SWIG_croak("expected an integer reference"); } dvalue = (unsigned short) SvUV(tempsv); $1 = &dvalue; } %typemap(in) unsigned long *REFERENCE (unsigned long dvalue), unsigned long &REFERENCE(unsigned long dvalue) { SV *tempsv; if (!SvROK($input)) { SWIG_croak("expected a reference"); } tempsv = SvRV($input); if (!SvIOK(tempsv)) { SWIG_croak("expected an integer reference"); } dvalue = (unsigned long) SvUV(tempsv); $1 = &dvalue; } %typemap(in) unsigned char *REFERENCE (unsigned char dvalue), unsigned char &REFERENCE(unsigned char dvalue) { SV *tempsv; if (!SvROK($input)) { SWIG_croak("expected a reference"); } tempsv = SvRV($input); if (!SvIOK(tempsv)) { SWIG_croak("expected an integer reference"); } dvalue = (unsigned char) SvUV(tempsv); $1 = &dvalue; } %typemap(in) signed char *REFERENCE (signed char dvalue), signed char &REFERENCE(signed char dvalue) { SV *tempsv; if (!SvROK($input)) { SWIG_croak("expected a reference"); } tempsv = SvRV($input); if (!SvIOK(tempsv)) { SWIG_croak("expected an integer reference"); } dvalue = (signed char) SvIV(tempsv); $1 = &dvalue; } %typemap(in) bool *REFERENCE (bool dvalue), bool &REFERENCE(bool dvalue) { SV *tempsv; if (!SvROK($input)) { SWIG_croak("expected a reference"); } tempsv = SvRV($input); if (!SvIOK(tempsv)) { SWIG_croak("expected an integer reference"); } dvalue = SvIV(tempsv) ? true : false; $1 = &dvalue; } %typemap(typecheck) int *REFERENCE, int &REFERENCE, short *REFERENCE, short &REFERENCE, long *REFERENCE, long &REFERENCE, signed char *REFERENCE, signed char &REFERENCE, bool *REFERENCE, bool &REFERENCE { $1 = SvROK($input) && SvIOK(SvRV($input)); } %typemap(typecheck) double *REFERENCE, double &REFERENCE, float *REFERENCE, float &REFERENCE { $1 = SvROK($input); if($1) { SV *tmpsv = SvRV($input); $1 = SvNOK(tmpsv) || SvIOK(tmpsv); } } %typemap(typecheck) unsigned int *REFERENCE, unsigned int &REFERENCE, unsigned short *REFERENCE, unsigned short &REFERENCE, unsigned long *REFERENCE, unsigned long &REFERENCE, unsigned char *REFERENCE, unsigned char &REFERENCE { $1 = SvROK($input); if($1) { SV *tmpsv = SvRV($input); $1 = SvUOK(tmpsv) || SvIOK(tmpsv); } } %typemap(argout) double *REFERENCE, double &REFERENCE, float *REFERENCE, float &REFERENCE { SV *tempsv; tempsv = SvRV($arg); if (!$1) SWIG_croak("expected a reference"); sv_setnv(tempsv, (double) *$1); } %typemap(argout) int *REFERENCE, int &REFERENCE, short *REFERENCE, short &REFERENCE, long *REFERENCE, long &REFERENCE, signed char *REFERENCE, signed char &REFERENCE, bool *REFERENCE, bool &REFERENCE { SV *tempsv; tempsv = SvRV($input); if (!$1) SWIG_croak("expected a reference"); sv_setiv(tempsv, (IV) *$1); } %typemap(argout) unsigned int *REFERENCE, unsigned int &REFERENCE, unsigned short *REFERENCE, unsigned short &REFERENCE, unsigned long *REFERENCE, unsigned long &REFERENCE, unsigned char *REFERENCE, unsigned char &REFERENCE { SV *tempsv; tempsv = SvRV($input); if (!$1) SWIG_croak("expected a reference"); sv_setuv(tempsv, (UV) *$1); } swig-4.0.1/Lib/perl5/typemaps.i0000644000175000017500000003102213527063513016117 0ustar williamwilliam/* ----------------------------------------------------------------------------- * typemaps.i * * The SWIG typemap library provides a language independent mechanism for * supporting output arguments, input values, and other C function * calling mechanisms. The primary use of the library is to provide a * better interface to certain C function--especially those involving * pointers. * ----------------------------------------------------------------------------- */ #if !defined(SWIG_USE_OLD_TYPEMAPS) %include #else // INPUT typemaps. // These remap a C pointer to be an "INPUT" value which is passed by value // instead of reference. /* The following methods can be applied to turn a pointer into a simple "input" value. That is, instead of passing a pointer to an object, you would use a real value instead. int *INPUT short *INPUT long *INPUT long long *INPUT unsigned int *INPUT unsigned short *INPUT unsigned long *INPUT unsigned long long *INPUT unsigned char *INPUT bool *INPUT float *INPUT double *INPUT To use these, suppose you had a C function like this : double fadd(double *a, double *b) { return *a+*b; } You could wrap it with SWIG as follows : %include typemaps.i double fadd(double *INPUT, double *INPUT); or you can use the %apply directive : %include typemaps.i %apply double *INPUT { double *a, double *b }; double fadd(double *a, double *b); */ %define INPUT_TYPEMAP(type, converter) %typemap(in) type *INPUT(type temp), type &INPUT(type temp) { temp = (type) converter($input); $1 = &temp; } %typemap(typecheck) type *INPUT = type; %typemap(typecheck) type &INPUT = type; %enddef INPUT_TYPEMAP(float, SvNV); INPUT_TYPEMAP(double, SvNV); INPUT_TYPEMAP(int, SvIV); INPUT_TYPEMAP(long, SvIV); INPUT_TYPEMAP(short, SvIV); INPUT_TYPEMAP(signed char, SvIV); INPUT_TYPEMAP(unsigned int, SvUV); INPUT_TYPEMAP(unsigned long, SvUV); INPUT_TYPEMAP(unsigned short, SvUV); INPUT_TYPEMAP(unsigned char, SvUV); %typemap(in) bool *INPUT(bool temp), bool &INPUT(bool temp) { temp = SvIV($input) ? true : false; $1 = &temp; } %typemap(typecheck) bool *INPUT = bool; %typemap(typecheck) bool &INPUT = bool; %typemap(in) long long *INPUT($*1_ltype temp), long long &INPUT($*1_ltype temp) { temp = strtoll(SvPV_nolen($input), 0, 0); $1 = &temp; } %typemap(typecheck) long long *INPUT = long long; %typemap(typecheck) long long &INPUT = long long; %typemap(in) unsigned long long *INPUT($*1_ltype temp), unsigned long long &INPUT($*1_ltype temp) { temp = strtoull(SvPV_nolen($input), 0, 0); $1 = &temp; } %typemap(typecheck) unsigned long long *INPUT = unsigned long long; %typemap(typecheck) unsigned long long &INPUT = unsigned long long; #undef INPUT_TYPEMAP // OUTPUT typemaps. These typemaps are used for parameters that // are output only. The output value is appended to the result as // a list element. /* The following methods can be applied to turn a pointer into an "output" value. When calling a function, no input value would be given for a parameter, but an output value would be returned. In the case of multiple output values, functions will return a Perl array. int *OUTPUT short *OUTPUT long *OUTPUT long long *OUTPUT unsigned int *OUTPUT unsigned short *OUTPUT unsigned long *OUTPUT unsigned long long *OUTPUT unsigned char *OUTPUT bool *OUTPUT float *OUTPUT double *OUTPUT For example, suppose you were trying to wrap the modf() function in the C math library which splits x into integral and fractional parts (and returns the integer part in one of its parameters).: double modf(double x, double *ip); You could wrap it with SWIG as follows : %include typemaps.i double modf(double x, double *OUTPUT); or you can use the %apply directive : %include typemaps.i %apply double *OUTPUT { double *ip }; double modf(double x, double *ip); The Perl output of the function would be an array containing both output values. */ // Force the argument to be ignored. %typemap(in,numinputs=0) int *OUTPUT(int temp), int &OUTPUT(int temp), short *OUTPUT(short temp), short &OUTPUT(short temp), long *OUTPUT(long temp), long &OUTPUT(long temp), unsigned int *OUTPUT(unsigned int temp), unsigned int &OUTPUT(unsigned int temp), unsigned short *OUTPUT(unsigned short temp), unsigned short &OUTPUT(unsigned short temp), unsigned long *OUTPUT(unsigned long temp), unsigned long &OUTPUT(unsigned long temp), unsigned char *OUTPUT(unsigned char temp), unsigned char &OUTPUT(unsigned char temp), signed char *OUTPUT(signed char temp), signed char &OUTPUT(signed char temp), bool *OUTPUT(bool temp), bool &OUTPUT(bool temp), float *OUTPUT(float temp), float &OUTPUT(float temp), double *OUTPUT(double temp), double &OUTPUT(double temp), long long *OUTPUT($*1_ltype temp), long long &OUTPUT($*1_ltype temp), unsigned long long *OUTPUT($*1_ltype temp), unsigned long long &OUTPUT($*1_ltype temp) "$1 = &temp;"; %typemap(argout) int *OUTPUT, int &OUTPUT, short *OUTPUT, short &OUTPUT, long *OUTPUT, long &OUTPUT, signed char *OUTPUT, signed char &OUTPUT, bool *OUTPUT, bool &OUTPUT { if (argvi >= items) { EXTEND(sp, argvi+1); } $result = sv_newmortal(); sv_setiv($result,(IV) *($1)); argvi++; } %typemap(argout) unsigned int *OUTPUT, unsigned int &OUTPUT, unsigned short *OUTPUT, unsigned short &OUTPUT, unsigned long *OUTPUT, unsigned long &OUTPUT, unsigned char *OUTPUT, unsigned char &OUTPUT { if (argvi >= items) { EXTEND(sp, argvi+1); } $result = sv_newmortal(); sv_setuv($result,(UV) *($1)); argvi++; } %typemap(argout) float *OUTPUT, float &OUTPUT, double *OUTPUT, double &OUTPUT { if (argvi >= items) { EXTEND(sp, argvi+1); } $result = sv_newmortal(); sv_setnv($result,(double) *($1)); argvi++; } %typemap(argout) long long *OUTPUT, long long &OUTPUT { char temp[256]; if (argvi >= items) { EXTEND(sp, argvi+1); } sprintf(temp,"%lld", (long long)*($1)); $result = sv_newmortal(); sv_setpv($result,temp); argvi++; } %typemap(argout) unsigned long long *OUTPUT, unsigned long long &OUTPUT { char temp[256]; if (argvi >= items) { EXTEND(sp, argvi+1); } sprintf(temp,"%llu", (unsigned long long)*($1)); $result = sv_newmortal(); sv_setpv($result,temp); argvi++; } // INOUT // Mappings for an argument that is both an input and output // parameter /* The following methods can be applied to make a function parameter both an input and output value. This combines the behavior of both the "INPUT" and "OUTPUT" methods described earlier. Output values are returned in the form of a Perl array. int *INOUT short *INOUT long *INOUT long long *INOUT unsigned int *INOUT unsigned short *INOUT unsigned long *INOUT unsigned long long *INOUT unsigned char *INOUT bool *INOUT float *INOUT double *INOUT For example, suppose you were trying to wrap the following function : void neg(double *x) { *x = -(*x); } You could wrap it with SWIG as follows : %include typemaps.i void neg(double *INOUT); or you can use the %apply directive : %include typemaps.i %apply double *INOUT { double *x }; void neg(double *x); Unlike C, this mapping does not directly modify the input value. Rather, the modified input value shows up as the return value of the function. Thus, to apply this function to a Perl variable you might do this : $x = neg($x); */ %typemap(in) int *INOUT = int *INPUT; %typemap(in) short *INOUT = short *INPUT; %typemap(in) long *INOUT = long *INPUT; %typemap(in) unsigned *INOUT = unsigned *INPUT; %typemap(in) unsigned short *INOUT = unsigned short *INPUT; %typemap(in) unsigned long *INOUT = unsigned long *INPUT; %typemap(in) unsigned char *INOUT = unsigned char *INPUT; %typemap(in) signed char *INOUT = signed char *INPUT; %typemap(in) bool *INOUT = bool *INPUT; %typemap(in) float *INOUT = float *INPUT; %typemap(in) double *INOUT = double *INPUT; %typemap(in) long long *INOUT = long long *INPUT; %typemap(in) unsigned long long *INOUT = unsigned long long *INPUT; %typemap(in) int &INOUT = int &INPUT; %typemap(in) short &INOUT = short &INPUT; %typemap(in) long &INOUT = long &INPUT; %typemap(in) unsigned &INOUT = unsigned &INPUT; %typemap(in) unsigned short &INOUT = unsigned short &INPUT; %typemap(in) unsigned long &INOUT = unsigned long &INPUT; %typemap(in) unsigned char &INOUT = unsigned char &INPUT; %typemap(in) signed char &INOUT = signed char &INPUT; %typemap(in) bool &INOUT = bool &INPUT; %typemap(in) float &INOUT = float &INPUT; %typemap(in) double &INOUT = double &INPUT; %typemap(in) long long &INOUT = long long &INPUT; %typemap(in) unsigned long long &INOUT = unsigned long long &INPUT; %typemap(argout) int *INOUT = int *OUTPUT; %typemap(argout) short *INOUT = short *OUTPUT; %typemap(argout) long *INOUT = long *OUTPUT; %typemap(argout) unsigned *INOUT = unsigned *OUTPUT; %typemap(argout) unsigned short *INOUT = unsigned short *OUTPUT; %typemap(argout) unsigned long *INOUT = unsigned long *OUTPUT; %typemap(argout) unsigned char *INOUT = unsigned char *OUTPUT; %typemap(argout) signed char *INOUT = signed char *OUTPUT; %typemap(argout) bool *INOUT = bool *OUTPUT; %typemap(argout) float *INOUT = float *OUTPUT; %typemap(argout) double *INOUT = double *OUTPUT; %typemap(argout) long long *INOUT = long long *OUTPUT; %typemap(argout) unsigned long long *INOUT = unsigned long long *OUTPUT; %typemap(argout) int &INOUT = int &OUTPUT; %typemap(argout) short &INOUT = short &OUTPUT; %typemap(argout) long &INOUT = long &OUTPUT; %typemap(argout) unsigned &INOUT = unsigned &OUTPUT; %typemap(argout) unsigned short &INOUT = unsigned short &OUTPUT; %typemap(argout) unsigned long &INOUT = unsigned long &OUTPUT; %typemap(argout) unsigned char &INOUT = unsigned char &OUTPUT; %typemap(argout) signed char &INOUT = signed char &OUTPUT; %typemap(argout) bool &INOUT = bool &OUTPUT; %typemap(argout) float &INOUT = float &OUTPUT; %typemap(argout) double &INOUT = double &OUTPUT; %typemap(argout) long long &INOUT = long long &OUTPUT; %typemap(argout) unsigned long long &INOUT = unsigned long long &OUTPUT; /* Overloading information */ %typemap(typecheck) double *INOUT = double; %typemap(typecheck) bool *INOUT = bool; %typemap(typecheck) signed char *INOUT = signed char; %typemap(typecheck) unsigned char *INOUT = unsigned char; %typemap(typecheck) unsigned long *INOUT = unsigned long; %typemap(typecheck) unsigned short *INOUT = unsigned short; %typemap(typecheck) unsigned int *INOUT = unsigned int; %typemap(typecheck) long *INOUT = long; %typemap(typecheck) short *INOUT = short; %typemap(typecheck) int *INOUT = int; %typemap(typecheck) float *INOUT = float; %typemap(typecheck) long long *INOUT = long long; %typemap(typecheck) unsigned long long *INOUT = unsigned long long; %typemap(typecheck) double &INOUT = double; %typemap(typecheck) bool &INOUT = bool; %typemap(typecheck) signed char &INOUT = signed char; %typemap(typecheck) unsigned char &INOUT = unsigned char; %typemap(typecheck) unsigned long &INOUT = unsigned long; %typemap(typecheck) unsigned short &INOUT = unsigned short; %typemap(typecheck) unsigned int &INOUT = unsigned int; %typemap(typecheck) long &INOUT = long; %typemap(typecheck) short &INOUT = short; %typemap(typecheck) int &INOUT = int; %typemap(typecheck) float &INOUT = float; %typemap(typecheck) long long &INOUT = long long; %typemap(typecheck) unsigned long long &INOUT = unsigned long long; #endif // -------------------------------------------------------------------- // Special types // -------------------------------------------------------------------- %include swig-4.0.1/Lib/perl5/perluserdir.swg0000644000175000017500000000004413527063513017165 0ustar williamwilliam#define %perlcode %insert("perl") swig-4.0.1/Lib/perl5/carrays.i0000644000175000017500000000004113527063513015716 0ustar williamwilliam%include swig-4.0.1/Lib/perl5/std_pair.i0000644000175000017500000000140513527063513016064 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_pair.i * * SWIG typemaps for std::pair * ----------------------------------------------------------------------------- */ %include %include // ------------------------------------------------------------------------ // std::pair // ------------------------------------------------------------------------ %{ #include %} namespace std { template struct pair { typedef T first_type; typedef U second_type; pair(); pair(T first, U second); pair(const pair& other); template pair(const pair &other); T first; U second; }; // add specializations here } swig-4.0.1/Lib/perl5/stl.i0000644000175000017500000000044313527063513015062 0ustar williamwilliam/* ----------------------------------------------------------------------------- * stl.i * ----------------------------------------------------------------------------- */ %include %include %include %include %include swig-4.0.1/Lib/perl5/exception.i0000644000175000017500000000021213527063513016250 0ustar williamwilliam%include %insert("runtime") { %define_as(SWIG_exception(code, msg), %block(%error(code, msg); SWIG_fail; )) } swig-4.0.1/Lib/perl5/std_list.i0000644000175000017500000003435313527063513016114 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_list.i * * SWIG typemaps for std::list types * ----------------------------------------------------------------------------- */ %include %include // containers // ------------------------------------------------------------------------ // std::list // // The aim of all that follows would be to integrate std::list with // Perl as much as possible, namely, to allow the user to pass and // be returned Perl arrays. // const declarations are used to guess the intent of the function being // exported; therefore, the following rationale is applied: // // -- f(std::list), f(const std::list&), f(const std::list*): // the parameter being read-only, either a Perl sequence or a // previously wrapped std::list can be passed. // -- f(std::list&), f(std::list*): // the parameter must be modified; therefore, only a wrapped std::list // can be passed. // -- std::list f(): // the list is returned by copy; therefore, a Perl sequence of T:s // is returned which is most easily used in other Perl functions // -- std::list& f(), std::list* f(), const std::list& f(), // const std::list* f(): // the list is returned by reference; therefore, a wrapped std::list // is returned // ------------------------------------------------------------------------ %{ #include %} %fragment(""); %fragment(""); // exported class namespace std { template class list { %typemap(in) list (std::list* v) { if (SWIG_ConvertPtr($input,(void **) &v, $&1_descriptor,1) != -1) { $1 = *v; } else if (SvROK($input)) { AV *av = (AV *)SvRV($input); if (SvTYPE(av) != SVt_PVAV) SWIG_croak("Type error in argument $argnum of $symname. " "Expected an array of " #T); SV **tv; I32 len = av_len(av) + 1; T* obj; for (int i=0; i& (std::list temp, std::list* v), const list* (std::list temp, std::list* v) { if (SWIG_ConvertPtr($input,(void **) &v, $1_descriptor,1) != -1) { $1 = v; } else if (SvROK($input)) { AV *av = (AV *)SvRV($input); if (SvTYPE(av) != SVt_PVAV) SWIG_croak("Type error in argument $argnum of $symname. " "Expected an array of " #T); SV **tv; I32 len = av_len(av) + 1; T* obj; for (int i=0; i { std::list< T >::const_iterator i; unsigned int j; int len = $1.size(); SV **svs = new SV*[len]; for (i=$1.begin(), j=0; i!=$1.end(); i++, j++) { T* ptr = new T(*i); svs[j] = sv_newmortal(); SWIG_MakePtr(svs[j], (void*) ptr, $descriptor(T *), $shadow|$owner); } AV *myav = av_make(len, svs); delete[] svs; $result = newRV_noinc((SV*) myav); sv_2mortal($result); argvi++; } %typecheck(SWIG_TYPECHECK_LIST) list { { /* wrapped list? */ std::list< T >* v; if (SWIG_ConvertPtr($input,(void **) &v, $1_&descriptor,0) != -1) { $1 = 1; } else if (SvROK($input)) { /* native sequence? */ AV *av = (AV *)SvRV($input); if (SvTYPE(av) == SVt_PVAV) { SV **tv; I32 len = av_len(av) + 1; if (len == 0) { /* an empty sequence can be of any type */ $1 = 1; } else { /* check the first element only */ T* obj; tv = av_fetch(av, 0, 0); if (SWIG_ConvertPtr(*tv, (void **)&obj, $descriptor(T *),0) != -1) $1 = 1; else $1 = 0; } } } else { $1 = 0; } } } %typecheck(SWIG_TYPECHECK_LIST) const list&, const list* { { /* wrapped list? */ std::list< T >* v; if (SWIG_ConvertPtr($input,(void **) &v, $1_descriptor,0) != -1) { $1 = 1; } else if (SvROK($input)) { /* native sequence? */ AV *av = (AV *)SvRV($input); if (SvTYPE(av) == SVt_PVAV) { SV **tv; I32 len = av_len(av) + 1; if (len == 0) { /* an empty sequence can be of any type */ $1 = 1; } else { /* check the first element only */ T* obj; tv = av_fetch(av, 0, 0); if (SWIG_ConvertPtr(*tv, (void **)&obj, $descriptor(T *),0) != -1) $1 = 1; else $1 = 0; } } } else { $1 = 0; } } } public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef T value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; list(); list(const list& other); unsigned int size() const; bool empty() const; void clear(); %rename(push) push_back; void push_back(const T& x); }; // specializations for built-ins %define specialize_std_list(T,CHECK_T,TO_T,FROM_T) template<> class list { %typemap(in) list (std::list* v) { if (SWIG_ConvertPtr($input,(void **) &v, $&1_descriptor,1) != -1){ $1 = *v; } else if (SvROK($input)) { AV *av = (AV *)SvRV($input); if (SvTYPE(av) != SVt_PVAV) SWIG_croak("Type error in argument $argnum of $symname. " "Expected an array of " #T); SV **tv; I32 len = av_len(av) + 1; for (int i=0; i& (std::list temp, std::list* v), const list* (std::list temp, std::list* v) { if (SWIG_ConvertPtr($input,(void **) &v, $1_descriptor,1) != -1) { $1 = v; } else if (SvROK($input)) { AV *av = (AV *)SvRV($input); if (SvTYPE(av) != SVt_PVAV) SWIG_croak("Type error in argument $argnum of $symname. " "Expected an array of " #T); SV **tv; I32 len = av_len(av) + 1; T* obj; for (int i=0; i { std::list< T >::const_iterator i; unsigned int j; int len = $1.size(); SV **svs = new SV*[len]; for (i=$1.begin(), j=0; i!=$1.end(); i++, j++) { svs[j] = sv_newmortal(); FROM_T(svs[j], *i); } AV *myav = av_make(len, svs); delete[] svs; $result = newRV_noinc((SV*) myav); sv_2mortal($result); argvi++; } %typecheck(SWIG_TYPECHECK_LIST) list { { /* wrapped list? */ std::list< T >* v; if (SWIG_ConvertPtr($input,(void **) &v, $1_&descriptor,0) != -1) { $1 = 1; } else if (SvROK($input)) { /* native sequence? */ AV *av = (AV *)SvRV($input); if (SvTYPE(av) == SVt_PVAV) { SV **tv; I32 len = av_len(av) + 1; if (len == 0) { /* an empty sequence can be of any type */ $1 = 1; } else { /* check the first element only */ tv = av_fetch(av, 0, 0); if (CHECK_T(*tv)) $1 = 1; else $1 = 0; } } } else { $1 = 0; } } } %typecheck(SWIG_TYPECHECK_LIST) const list&, const list* { { /* wrapped list? */ std::list< T >* v; if (SWIG_ConvertPtr($input,(void **) &v, $1_descriptor,0) != -1) { $1 = 1; } else if (SvROK($input)) { /* native sequence? */ AV *av = (AV *)SvRV($input); if (SvTYPE(av) == SVt_PVAV) { SV **tv; I32 len = av_len(av) + 1; if (len == 0) { /* an empty sequence can be of any type */ $1 = 1; } else { /* check the first element only */ tv = av_fetch(av, 0, 0); if (CHECK_T(*tv)) $1 = 1; else $1 = 0; } } } else { $1 = 0; } } } public: typedef size_t size_type; typedef T value_type; typedef const value_type& const_reference; list(); list(const list& other); unsigned int size() const; bool empty() const; void clear(); %rename(push) push_back; void push_back(T x); }; %enddef specialize_std_list(bool,SvIOK,SvIVX,sv_setiv); specialize_std_list(char,SvIOK,SvIVX,sv_setiv); specialize_std_list(int,SvIOK,SvIVX,sv_setiv); specialize_std_list(short,SvIOK,SvIVX,sv_setiv); specialize_std_list(long,SvIOK,SvIVX,sv_setiv); specialize_std_list(unsigned char,SvIOK,SvIVX,sv_setiv); specialize_std_list(unsigned int,SvIOK,SvIVX,sv_setiv); specialize_std_list(unsigned short,SvIOK,SvIVX,sv_setiv); specialize_std_list(unsigned long,SvIOK,SvIVX,sv_setiv); specialize_std_list(float,SvNIOK,SwigSvToNumber,sv_setnv); specialize_std_list(double,SvNIOK,SwigSvToNumber,sv_setnv); specialize_std_list(std::string,SvPOK,SvPVX,SwigSvFromString); } swig-4.0.1/Lib/perl5/perltypemaps.swg0000644000175000017500000000577213527063513017367 0ustar williamwilliam/* ------------------------------------------------------------ * Typemap specializations for Perl * ------------------------------------------------------------ */ /* ------------------------------------------------------------ * Fragment section * ------------------------------------------------------------ */ /* in Perl we need to pass the CPerlObj value, sometimes, so, we define the decl/call macros as needed. */ #define SWIG_AS_DECL_ARGS SWIG_PERL_DECL_ARGS_2 #define SWIG_AS_CALL_ARGS SWIG_PERL_CALL_ARGS_2 #define SWIG_FROM_DECL_ARGS SWIG_PERL_DECL_ARGS_1 #define SWIG_FROM_CALL_ARGS SWIG_PERL_CALL_ARGS_1 /* Include fundamental fragment definitions */ %include /* Look for user fragments file. */ %include /* Perl fragments for primitive types */ %include /* Perl fragments for char* strings */ %include /* ------------------------------------------------------------ * Unified typemap section * ------------------------------------------------------------ */ /* director support in Perl is experimental */ #ifndef SWIG_DIRECTOR_TYPEMAPS #define SWIG_DIRECTOR_TYPEMAPS #endif /* Perl types */ #define SWIG_Object SV * #define VOID_Object &PL_sv_undef /* Perl $shadow flag */ #define %newpointer_flags $shadow #define %newinstance_flags $shadow /* Complete overload of the output/constant/exception macros */ /* output */ %define %set_output(obj) $result = obj; argvi++ %enddef /* append output */ %define %append_output(obj) if (argvi >= items) EXTEND(sp, argvi+1); %set_output(obj) %enddef /* variable output */ %define %set_varoutput(obj) sv_setsv($result,obj) %enddef /* constant */ %define %set_constant(name, obj) %begin_block SV *sv = get_sv((char*) SWIG_prefix name, TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, obj); SvREADONLY_on(sv); %end_block %enddef /* raise exception */ %define %raise(obj, type, desc) sv_setsv(get_sv("@", GV_ADD), obj); SWIG_fail %enddef /* For directors to raise/throw the original exception */ %typemap(throws) Swig::DirectorException %{ sv_setsv(ERRSV, $1.getNative()); SWIG_fail; %} /* Include the unified typemap library */ %include /* ------------------------------------------------------------ * Perl extra typemaps / typemap overrides * ------------------------------------------------------------ */ %typemap(varout,type="$1_descriptor") SWIGTYPE *, SWIGTYPE [] "sv_setiv(SvRV($result),PTR2IV($1));"; %typemap(varout,type="$1_descriptor") SWIGTYPE & "sv_setiv(SvRV($result),PTR2IV(&$1));"; %typemap(varout,type="$1_descriptor") SWIGTYPE && "sv_setiv(SvRV($result),PTR2IV(&$1));"; %typemap(varout,type="$&1_descriptor") SWIGTYPE "sv_setiv(SvRV($result), PTR2IV(&$1));"; %typemap(varout,type="$1_descriptor") SWIGTYPE (CLASS::*) { SWIG_MakePackedObj($result, (void *) &$1, sizeof($1_type), $1_descriptor); } %typemap(varout) SWIGTYPE *const = SWIGTYPE *; swig-4.0.1/Lib/perl5/perlerrors.swg0000644000175000017500000000154713527063513017035 0ustar williamwilliam/* ----------------------------------------------------------------------------- * error manipulation * ----------------------------------------------------------------------------- */ SWIGINTERN const char* SWIG_Perl_ErrorType(int code) { switch(code) { case SWIG_MemoryError: return "MemoryError"; case SWIG_IOError: return "IOError"; case SWIG_RuntimeError: return "RuntimeError"; case SWIG_IndexError: return "IndexError"; case SWIG_TypeError: return "TypeError"; case SWIG_DivisionByZero: return "ZeroDivisionError"; case SWIG_OverflowError: return "OverflowError"; case SWIG_SyntaxError: return "SyntaxError"; case SWIG_ValueError: return "ValueError"; case SWIG_SystemError: return "SystemError"; case SWIG_AttributeError: return "AttributeError"; default: return "RuntimeError"; } } swig-4.0.1/Lib/perl5/perlkw.swg0000644000175000017500000000743613527063513016145 0ustar williamwilliam/* Warnings for Perl keywords */ #define PERLKW(x) %keywordwarn("'" `x` "' is a perl keyword") `x` #define PERLBN(x) %builtinwarn("'" `x` "' conflicts with a built-in name in perl") "::" `x` /* From http://www.rocketaware.com/perl/perlfunc/ */ /* Functions for SCALARs or strings*/ PERLBN(chomp); PERLBN(chop); PERLBN(chr); PERLBN(crypt); PERLBN(hex); PERLBN(index); PERLBN(lc); PERLBN(lcfirst); PERLBN(length); PERLBN(oct); PERLBN(ord); PERLBN(pack); PERLBN(reverse); PERLBN(rindex); PERLBN(sprintf); PERLBN(substr); PERLBN(uc); PERLBN(ucfirst); /* Regular expressions and pattern matching */ PERLBN(m); PERLBN(pos); PERLBN(quotemeta); PERLBN(split); PERLBN(study); /* Numeric functions */ PERLBN(abs); PERLBN(atan2); PERLBN(cos); PERLBN(exp); PERLBN(hex); PERLBN(int); PERLBN(log); PERLBN(oct); PERLBN(rand); PERLBN(sin); PERLBN(sqrt); PERLBN(srand); /* Functions for real @ARRAYs*/ PERLBN(pop); PERLBN(push); PERLBN(shift); PERLBN(splice); PERLBN(unshift); /* Functions for list data*/ PERLBN(grep); PERLBN(join); PERLBN(map); PERLBN(qw); PERLBN(reverse); PERLBN(sort); PERLBN(unpack); /* Functions for real %HASHes*/ PERLBN(delete); PERLBN(each); PERLBN(exists); PERLBN(keys); PERLBN(values); /* Input and output functions*/ PERLBN(binmode); PERLBN(close); PERLBN(closedir); PERLBN(dbmclose); PERLBN(dbmopen); PERLBN(die); PERLBN(eof); PERLBN(fileno); PERLBN(flock); PERLBN(format); PERLBN(getc); PERLBN(print); PERLBN(printf); PERLBN(read); PERLBN(readdir); PERLBN(rewinddir); PERLBN(seek); PERLBN(seekdir); PERLBN(select); PERLBN(syscall); PERLBN(sysread); PERLBN(sysseek); PERLBN(syswrite); PERLBN(tell); PERLBN(telldir); PERLBN(truncate); PERLBN(warn); PERLBN(write); /* Functions for fixed length data or records*/ PERLBN(pack); PERLBN(read); PERLBN(syscall); PERLBN(sysread); PERLBN(syswrite); PERLBN(unpack); PERLBN(vec); /* Functions for filehandles, files, or directories */ PERLBN(chdir); PERLBN(chmod); PERLBN(chown); PERLBN(chroot); PERLBN(fcntl); PERLBN(glob); PERLBN(ioctl); PERLBN(link); PERLBN(lstat); PERLBN(mkdir); PERLBN(open); PERLBN(opendir); PERLBN(readlink); PERLBN(rename); PERLBN(rmdir); PERLBN(stat); PERLBN(symlink); PERLBN(umask); PERLBN(unlink); PERLBN(utime); /* Keywords related to the control flow of your perl program */ PERLKW(caller); PERLKW(continue); PERLKW(die); PERLKW(do); PERLKW(dump); PERLKW(eval); PERLKW(exit); PERLKW(goto); PERLKW(last); PERLKW(next); PERLKW(redo); PERLKW(return); PERLKW(sub); PERLKW(wantarray); /* Keywords related to scoping */ PERLKW(caller); PERLKW(import); PERLKW(local); PERLKW(my); PERLKW(package); PERLKW(use); /* Miscellaneous functions */ PERLBN("defined"); PERLBN(dump); PERLBN(eval); PERLBN(formline); PERLBN(local); PERLBN(my); PERLBN(reset); PERLBN(scalar); PERLBN(undef); PERLBN(wantarray); /* Functions for processes and process groups */ PERLBN(alarm); PERLBN(exec); PERLBN(fork); PERLBN(getpgrp); PERLBN(getppid); PERLBN(getpriority); PERLBN(kill); PERLBN(pipe); PERLBN(setpgrp); PERLBN(setpriority); PERLBN(sleep); PERLBN(system); PERLBN(times); PERLBN(wait); PERLBN(waitpid); /* Keywords related to perl modules */ PERLKW(do); PERLKW(import); PERLKW(no); PERLKW(package); PERLKW(require); PERLKW(use); /* Keywords related to classes and object-orientedness */ PERLKW(bless); PERLKW(dbmclose); PERLKW(dbmopen); PERLKW(package); PERLKW(ref); PERLKW(tie); PERLKW(tied); PERLKW(untie); PERLKW(use); /* Functions new in perl5 */ PERLBN(abs); PERLBN(bless); PERLBN(chomp); PERLBN(chr); PERLBN(exists); PERLBN(formline); PERLBN(glob); PERLBN(import); PERLBN(lc); PERLBN(lcfirst); PERLBN(map); PERLBN(my); PERLBN(no); PERLBN(prototype); PERLBN(qx); PERLBN(qw); PERLBN(readline); PERLBN(readpipe); PERLBN(ref); PERLBN(sub); PERLBN(sysopen); PERLBN(tie); PERLBN(tied); PERLBN(uc); PERLBN(ucfirst); PERLBN(untie); PERLBN(use); #undef PERLKW #undef PERLBN swig-4.0.1/Lib/perl5/cdata.i0000644000175000017500000000003613527063513015332 0ustar williamwilliam%include swig-4.0.1/Lib/perl5/std_string.i0000644000175000017500000000007613527063513016442 0ustar williamwilliam%include %include swig-4.0.1/Lib/perl5/std_map.i0000644000175000017500000000507013527063513015710 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_map.i * * SWIG typemaps for std::map * ----------------------------------------------------------------------------- */ %include // ------------------------------------------------------------------------ // std::map // ------------------------------------------------------------------------ %{ #include %} %fragment(""); %fragment(""); // exported class namespace std { template > class map { // add typemaps here public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef K key_type; typedef T mapped_type; typedef std::pair< const K, T > value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; map(); map(const map& other); unsigned int size() const; bool empty() const; void clear(); %extend { const T& get(const K& key) throw (std::out_of_range) { std::map< K, T, C >::iterator i = self->find(key); if (i != self->end()) return i->second; else throw std::out_of_range("key not found"); } void set(const K& key, const T& x) { (*self)[key] = x; } void del(const K& key) throw (std::out_of_range) { std::map< K, T, C >::iterator i = self->find(key); if (i != self->end()) self->erase(i); else throw std::out_of_range("key not found"); } bool has_key(const K& key) { std::map< K, T, C >::iterator i = self->find(key); return i != self->end(); } } }; // Legacy macros (deprecated) %define specialize_std_map_on_key(K,CHECK,CONVERT_FROM,CONVERT_TO) #warning "specialize_std_map_on_key ignored - macro is deprecated and no longer necessary" %enddef %define specialize_std_map_on_value(T,CHECK,CONVERT_FROM,CONVERT_TO) #warning "specialize_std_map_on_value ignored - macro is deprecated and no longer necessary" %enddef %define specialize_std_map_on_both(K,CHECK_K,CONVERT_K_FROM,CONVERT_K_TO, T,CHECK_T,CONVERT_T_FROM,CONVERT_T_TO) #warning "specialize_std_map_on_both ignored - macro is deprecated and no longer necessary" %enddef } swig-4.0.1/Lib/perl5/cstring.i0000644000175000017500000000004013527063513015722 0ustar williamwilliam%include swig-4.0.1/Lib/perl5/perlopers.swg0000644000175000017500000000352013527063513016642 0ustar williamwilliam/* ------------------------------------------------------------ * Overloaded operator support * ------------------------------------------------------------ */ #ifdef __cplusplus // These are auto-supported by the Perl-module %rename(__plusplus__) *::operator++; %rename(__minmin__) *::operator--; %rename(__add__) *::operator+; %rename(__sub__) *::operator-; %rename(__neg__) *::operator-(); %rename(__neg__) *::operator-() const; %rename(__mul__) *::operator*; %rename(__div__) *::operator/; %rename(__eq__) *::operator==; %rename(__ne__) *::operator!=; %rename(__mod__) *::operator%; %rename(__gt__) *::operator>; %rename(__lt__) *::operator<; %rename(__not__) *::operator!; %rename(__le__) *::operator<=; %rename(__ge__) *::operator>=; %rename(__and__) *::operator&; %rename(__or__) *::operator|; %rename(__iadd__) *::operator+=; %rename(__isub__) *::operator-=; // These are renamed, but no test exists in operator_overload_runme.pl %ignoreoperator(EQ) operator=; // These are renamed, but no 'use overload...' is added %rename(__lshift__) *::operator<<; %rename(__rshift__) *::operator>>; %rename(__xor__) *::operator^; %rename(__invert__) *::operator~; %rename(__call__) *::operator(); /* Ignored operators */ %ignoreoperator(LAND) operator&&; %ignoreoperator(LOR) operator||; %ignoreoperator(MULEQ) operator*=; %ignoreoperator(DIVEQ) operator/=; %ignoreoperator(MODEQ) operator%=; %ignoreoperator(LSHIFTEQ) operator<<=; %ignoreoperator(RSHIFTEQ) operator>>=; %ignoreoperator(ANDEQ) operator&=; %ignoreoperator(OREQ) operator|=; %ignoreoperator(XOREQ) operator^=; %ignoreoperator(ARROWSTAR) operator->*; %ignoreoperator(INDEX) operator[]; #endif /* __cplusplus */ swig-4.0.1/Lib/perl5/factory.i0000644000175000017500000000004013527063513015720 0ustar williamwilliam%include swig-4.0.1/Lib/math.i0000644000175000017500000000404613527063513014165 0ustar williamwilliam/* ----------------------------------------------------------------------------- * math.i * * SWIG library file for floating point operations. * ----------------------------------------------------------------------------- */ %module math %{ #include %} extern double cos(double x); /* Cosine of x */ extern double sin(double x); /* Sine of x */ extern double tan(double x); /* Tangent of x */ extern double acos(double x); /* Inverse cosine in range [-PI/2,PI/2], x in [-1,1]. */ extern double asin(double x); /* Inverse sine in range [0,PI], x in [-1,1]. */ extern double atan(double x); /* Inverse tangent in range [-PI/2,PI/2]. */ extern double atan2(double y, double x); /* Inverse tangent of y/x in range [-PI,PI]. */ extern double cosh(double x); /* Hyperbolic cosine of x */ extern double sinh(double x); /* Hyperbolic sine of x */ extern double tanh(double x); /* Hyperbolic tangent of x */ extern double exp(double x); /* Natural exponential function e^x */ extern double log(double x); /* Natural logarithm ln(x), x > 0 */ extern double log10(double x); /* Base 10 logarithm, x > 0 */ extern double pow(double x, double y); /* Power function x^y. */ extern double sqrt(double x); /* Square root. x >= 0 */ extern double fabs(double x); /* Absolute value of x */ extern double ceil(double x); /* Smallest integer not less than x, as a double */ extern double floor(double x); /* Largest integer not greater than x, as a double */ extern double fmod(double x, double y); /* Floating-point remainder of x/y, with the same sign as x. */ #define M_E 2.7182818284590452354 #define M_LOG2E 1.4426950408889634074 #define M_LOG10E 0.43429448190325182765 #define M_LN2 0.69314718055994530942 #define M_LN10 2.30258509299404568402 #define M_PI 3.14159265358979323846 #define M_PI_2 1.57079632679489661923 #define M_PI_4 0.78539816339744830962 #define M_1_PI 0.31830988618379067154 #define M_2_PI 0.63661977236758134308 #define M_2_SQRTPI 1.12837916709551257390 #define M_SQRT2 1.41421356237309504880 #define M_SQRT1_2 0.70710678118654752440 swig-4.0.1/Lib/cmalloc.i0000644000175000017500000000446213527063513014650 0ustar williamwilliam/* ----------------------------------------------------------------------------- * cmalloc.i * * SWIG library file containing macros that can be used to create objects using * the C malloc function. * ----------------------------------------------------------------------------- */ %{ #include %} /* %malloc(TYPE [, NAME = TYPE]) %calloc(TYPE [, NAME = TYPE]) %realloc(TYPE [, NAME = TYPE]) %free(TYPE [, NAME = TYPE]) %allocators(TYPE [,NAME = TYPE]) Creates functions for allocating/reallocating memory. TYPE *malloc_NAME(int nbytes = sizeof(TYPE); TYPE *calloc_NAME(int nobj=1, int size=sizeof(TYPE)); TYPE *realloc_NAME(TYPE *ptr, int nbytes); void free_NAME(TYPE *ptr); */ %define %malloc(TYPE,NAME...) #if #NAME != "" %rename(malloc_##NAME) ::malloc(int nbytes); #else %rename(malloc_##TYPE) ::malloc(int nbytes); #endif #if #TYPE != "void" %typemap(default) int nbytes "$1 = (int) sizeof(TYPE);" #endif TYPE *malloc(int nbytes); %typemap(default) int nbytes; %enddef %define %calloc(TYPE,NAME...) #if #NAME != "" %rename(calloc_##NAME) ::calloc(int nobj, int sz); #else %rename(calloc_##TYPE) ::calloc(int nobj, int sz); #endif #if #TYPE != "void" %typemap(default) int sz "$1 = (int) sizeof(TYPE);" #else %typemap(default) int sz "$1 = 1;" #endif %typemap(default) int nobj "$1 = 1;" TYPE *calloc(int nobj, int sz); %typemap(default) int sz; %typemap(default) int nobj; %enddef %define %realloc(TYPE,NAME...) %insert("header") { #if #NAME != "" TYPE *realloc_##NAME(TYPE *ptr, int nitems) #else TYPE *realloc_##TYPE(TYPE *ptr, int nitems) #endif { #if #TYPE != "void" return (TYPE *) realloc(ptr, nitems*sizeof(TYPE)); #else return (TYPE *) realloc(ptr, nitems); #endif } } #if #NAME != "" TYPE *realloc_##NAME(TYPE *ptr, int nitems); #else TYPE *realloc_##TYPE(TYPE *ptr, int nitems); #endif %enddef %define %free(TYPE,NAME...) #if #NAME != "" %rename(free_##NAME) ::free(TYPE *ptr); #else %rename(free_##TYPE) ::free(TYPE *ptr); #endif void free(TYPE *ptr); %enddef %define %sizeof(TYPE,NAME...) #if #NAME != "" %constant int sizeof_##NAME = sizeof(TYPE); #else %constant int sizeof_##TYPE = sizeof(TYPE); #endif %enddef %define %allocators(TYPE,NAME...) %malloc(TYPE,NAME) %calloc(TYPE,NAME) %realloc(TYPE,NAME) %free(TYPE,NAME) #if #TYPE != "void" %sizeof(TYPE,NAME) #endif %enddef swig-4.0.1/Lib/lua/0000755000175000017500000000000013527063513013637 5ustar williamwilliamswig-4.0.1/Lib/lua/std_deque.i0000644000175000017500000000003413527063513015763 0ustar williamwilliam%include swig-4.0.1/Lib/lua/luaruntime.swg0000644000175000017500000000600413527063513016546 0ustar williamwilliam/* ----------------------------------------------------------------------------- * luaruntime.swg * * all the runtime code for . * ----------------------------------------------------------------------------- */ %runtime "swigrun.swg" /* Common C API type-checking code */ %runtime "swigerrors.swg" /* SWIG errors */ %runtime "luarun.swg" /* Lua runtime stuff */ %insert(initbeforefunc) "swiginit.swg" %insert(initbeforefunc) %{ /* Forward declaration of where the user's %init{} gets inserted */ void SWIG_init_user(lua_State* L ); #ifdef __cplusplus extern "C" { #endif /* this is the initialization function added at the very end of the code the function is always called SWIG_init, but an earlier #define will rename it */ #if ((SWIG_LUA_TARGET == SWIG_LUA_FLAVOR_ELUA) || (SWIG_LUA_TARGET == SWIG_LUA_FLAVOR_ELUAC)) LUALIB_API int SWIG_init(lua_State* L) #else SWIGEXPORT int SWIG_init(lua_State* L) /* default Lua action */ #endif { #if (SWIG_LUA_TARGET != SWIG_LUA_FLAVOR_ELUAC) /* valid for both Lua and eLua */ int i; int globalRegister = 0; /* start with global table */ lua_pushglobaltable (L); /* SWIG's internal initialisation */ SWIG_InitializeModule((void*)L); SWIG_PropagateClientData(); #endif #if ((SWIG_LUA_TARGET != SWIG_LUA_FLAVOR_ELUA) && (SWIG_LUA_TARGET != SWIG_LUA_FLAVOR_ELUAC)) || defined(SWIG_LUA_ELUA_EMULATE) /* add a global fn */ SWIG_Lua_add_function(L,"swig_type",SWIG_Lua_type); SWIG_Lua_add_function(L,"swig_equals",SWIG_Lua_class_equal); #endif #if (SWIG_LUA_TARGET != SWIG_LUA_FLAVOR_ELUAC) /* set up base class pointers (the hierarchy) */ for (i = 0; swig_types[i]; i++){ if (swig_types[i]->clientdata){ SWIG_Lua_init_base_class(L,(swig_lua_class*)(swig_types[i]->clientdata)); } } #ifdef SWIG_LUA_MODULE_GLOBAL globalRegister = 1; #endif #if (SWIG_LUA_TARGET == SWIG_LUA_FLAVOR_LUA) SWIG_Lua_namespace_register(L,&swig_SwigModule, globalRegister); #endif #if (SWIG_LUA_TARGET == SWIG_LUA_FLAVOR_ELUA) || (SWIG_LUA_TARGET == SWIG_LUA_FLAVOR_ELUAC) for (i = 0; swig_types[i]; i++){ if (swig_types[i]->clientdata){ SWIG_Lua_elua_class_register_instance(L,(swig_lua_class*)(swig_types[i]->clientdata)); } } #endif #if defined(SWIG_LUA_ELUA_EMULATE) lua_newtable(L); SWIG_Lua_elua_emulate_register(L,swig_SwigModule.ns_methods); SWIG_Lua_elua_emulate_register_clear(L); if(globalRegister) { lua_pushstring(L,swig_SwigModule.name); lua_pushvalue(L,-2); lua_rawset(L,-4); } #endif #endif #if (SWIG_LUA_TARGET != SWIG_LUA_FLAVOR_ELUAC) /* invoke user-specific initialization */ SWIG_init_user(L); /* end module */ /* Note: We do not clean up the stack here (Lua will do this for us). At this point, we have the globals table and out module table on the stack. Returning one value makes the module table the result of the require command. */ return 1; #else return 0; #endif } #ifdef __cplusplus } #endif %} /* Note: the initialization function is closed after all code is generated */ swig-4.0.1/Lib/lua/wchar.i0000644000175000017500000000210613527063513015114 0ustar williamwilliam/* ----------------------------------------------------------------------------- * wchar.i * * Typemaps for the wchar_t type * These are mapped to a Lua string and are passed around by value. * ----------------------------------------------------------------------------- */ // note: only support for pointer right now, not fixed length strings // TODO: determine how long a const wchar_t* is so we can write wstr2str() // & do the output typemap %{ #include wchar_t* str2wstr(const char *str, int len) { wchar_t* p; if (str==0 || len<1) return 0; p=(wchar_t *)malloc((len+1)*sizeof(wchar_t)); if (p==0) return 0; if (mbstowcs(p, str, len)==(size_t)-1) { free(p); return 0; } p[len]=0; return p; } %} %typemap(in, checkfn="SWIG_lua_isnilstring", fragment="SWIG_lua_isnilstring") wchar_t * %{ $1 = str2wstr(lua_tostring( L, $input ),lua_rawlen( L, $input )); if ($1==0) {SWIG_Lua_pushferrstring(L,"Error in converting to wchar (arg %d)",$input);goto fail;} %} %typemap(freearg) wchar_t * %{ free($1); %} %typemap(typecheck) wchar_t * = char *; swig-4.0.1/Lib/lua/lua_fnptr.i0000644000175000017500000001020413527063513016000 0ustar williamwilliam/* ----------------------------------------------------------------------------- * lua_fnptr.i * * SWIG Library file containing the main typemap code to support Lua modules. * ----------------------------------------------------------------------------- */ /* ----------------------------------------------------------------------------- * Basic function pointer support * ----------------------------------------------------------------------------- */ /* The structure: SWIGLUA_FN provides a simple (local only) wrapping for a function. For example if you wanted to have a C/C++ function take a lua function as a parameter. You could declare it as: int my_func(int a, int b, SWIGLUA_FN fn); note: it should be passed by value, not byref or as a pointer. The SWIGLUA_FN holds a pointer to the lua_State, and the stack index where the function is held. The macro SWIGLUA_FN_GET() will put a copy of the lua function at the top of the stack. After that its fairly simple to write the rest of the code (assuming know how to use lua), just push the parameters, call the function and return the result. int my_func(int a, int b, SWIGLUA_FN fn) { SWIGLUA_FN_GET(fn); lua_pushnumber(fn.L,a); lua_pushnumber(fn.L,b); lua_call(fn.L,2,1); // 2 in, 1 out return luaL_checknumber(fn.L,-1); } SWIG will automatically performs the wrapping of the arguments in and out. However: if you wish to store the function between calls, look to the SWIGLUA_REF below. */ // this is for the C code only, we don't want SWIG to wrapper it for us. %{ typedef struct{ lua_State* L; /* the state */ int idx; /* the index on the stack */ }SWIGLUA_FN; #define SWIGLUA_FN_GET(fn) {lua_pushvalue(fn.L,fn.idx);} %} // the actual typemap %typemap(in,checkfn="lua_isfunction") SWIGLUA_FN %{ $1.L=L; $1.idx=$input; %} /* ----------------------------------------------------------------------------- * Storing lua object support * ----------------------------------------------------------------------------- */ /* The structure: SWIGLUA_REF provides a mechanism to store object (usually functions) between calls to the interpreter. For example if you wanted to have a C/C++ function take a lua function as a parameter. Then call it later, You could declare it as: SWIGLUA_REF myref; void set_func(SWIGLUA_REF ref); SWIGLUA_REF get_func(); void call_func(int val); note: it should be passed by value, not byref or as a pointer. The SWIGLUA_REF holds a pointer to the lua_State, and an integer reference to the object. Because it holds a permanent ref to an object, the SWIGLUA_REF must be handled with a bit more care. It should be initialised to {0,0}. The function swiglua_ref_set() should be used to set it. swiglua_ref_clear() should be used to clear it when not in use, and swiglua_ref_get() to get the data back. Note: the typemap does not check that the object is in fact a function, if you need that you must add it yourself. int my_func(int a, int b, SWIGLUA_FN fn) { SWIGLUA_FN_GET(fn); lua_pushnumber(fn.L,a); lua_pushnumber(fn.L,b); lua_call(fn.L,2,1); // 2 in, 1 out return luaL_checknumber(fn.L,-1); } SWIG will automatically performs the wrapping of the arguments in and out. However: if you wish to store the function between calls, look to the SWIGLUA_REF below. */ %{ typedef struct{ lua_State* L; /* the state */ int ref; /* a ref in the lua global index */ }SWIGLUA_REF; void swiglua_ref_clear(SWIGLUA_REF* pref){ if (pref->L!=0 && pref->ref!=LUA_NOREF && pref->ref!=LUA_REFNIL){ luaL_unref(pref->L,LUA_REGISTRYINDEX,pref->ref); } pref->L=0; pref->ref=0; } void swiglua_ref_set(SWIGLUA_REF* pref,lua_State* L,int idx){ pref->L=L; lua_pushvalue(L,idx); /* copy obj to top */ pref->ref=luaL_ref(L,LUA_REGISTRYINDEX); /* remove obj from top & put into registry */ } void swiglua_ref_get(SWIGLUA_REF* pref){ if (pref->L!=0) lua_rawgeti(pref->L,LUA_REGISTRYINDEX,pref->ref); } %} %typemap(in) SWIGLUA_REF %{ swiglua_ref_set(&$1,L,$input); %} %typemap(out) SWIGLUA_REF %{ if ($1.L!=0) {swiglua_ref_get(&$1);} else {lua_pushnil(L);} SWIG_arg++; %} swig-4.0.1/Lib/lua/std_vector.i0000644000175000017500000000645513527063513016177 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_vector.i * * std::vector typemaps for LUA * ----------------------------------------------------------------------------- */ %{ #include %} %include // the general exceptions /* A really cut down version of the vector class. Note: this does not match the true std::vector class but instead is an approximate, so that SWIG knows how to wrapper it. (Eg, all access is by value, not ref, as SWIG turns refs to pointers) And no support for iterators & insert/erase It would be useful to have a vector<->Lua table conversion routine */ namespace std { template class vector { public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef T value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; vector(); vector(unsigned int); vector(const vector& other); vector(unsigned int,T); unsigned int size() const; unsigned int max_size() const; bool empty() const; void clear(); void push_back(T val); void pop_back(); T front()const; // only read front & back T back()const; // not write to them // operator [] given later: %extend // this is a extra bit of SWIG code { // [] is replaced by __getitem__ & __setitem__ // simply throws a string, which causes a lua error T __getitem__(unsigned int idx) throw (std::out_of_range) { if (idx>=self->size()) throw std::out_of_range("in vector::__getitem__()"); return (*self)[idx]; } void __setitem__(unsigned int idx,T val) throw (std::out_of_range) { if (idx>=self->size()) throw std::out_of_range("in vector::__setitem__()"); (*self)[idx]=val; } }; }; } /* Vector<->LuaTable fns These look a bit like the array<->LuaTable fns but are templated, not %defined (you must have template support for STL) */ /* %{ // reads a table into a vector of numbers // lua numbers will be cast into the type required (rounding may occur) // return 0 if non numbers found in the table // returns new'ed ptr if ok template std::vector* SWIG_read_number_vector(lua_State* L,int index) { int i=0; std::vector* vec=new std::vector(); while(1) { lua_rawgeti(L,index,i+1); if (!lua_isnil(L,-1)) { lua_pop(L,1); break; // finished } if (!lua_isnumber(L,-1)) { lua_pop(L,1); delete vec; return 0; // error } vec->push_back((T)lua_tonumber(L,-1)); lua_pop(L,1); ++i; } return vec; // ok } // writes a vector of numbers out as a lua table template int SWIG_write_number_vector(lua_State* L,std::vector *vec) { lua_newtable(L); for(int i=0;isize();++i) { lua_pushnumber(L,(double)((*vec)[i])); lua_rawseti(L,-2,i+1);// -1 is the number, -2 is the table } } %} // then the typemaps %define SWIG_TYPEMAP_NUM_VECTOR(T) // in %typemap(in) std::vector *INPUT %{ $1 = SWIG_read_number_vector(L,$input); if (!$1) SWIG_fail;%} %typemap(freearg) std::vector *INPUT %{ delete $1;%} // out %typemap(argout) std::vector *OUTPUT %{ SWIG_write_number_vector(L,$1); SWIG_arg++; %} %enddef */ swig-4.0.1/Lib/lua/luarun.swg0000644000175000017500000020213113527063513015666 0ustar williamwilliam/* ----------------------------------------------------------------------------- * luarun.swg * * This file contains the runtime support for Lua modules * and includes code for managing global variables and pointer * type checking. * ----------------------------------------------------------------------------- */ #ifdef __cplusplus extern "C" { #endif #include "lua.h" #include "lauxlib.h" #include /* for malloc */ #include /* for a few sanity tests */ /* ----------------------------------------------------------------------------- * Lua flavors * ----------------------------------------------------------------------------- */ #define SWIG_LUA_FLAVOR_LUA 1 #define SWIG_LUA_FLAVOR_ELUA 2 #define SWIG_LUA_FLAVOR_ELUAC 3 #if !defined(SWIG_LUA_TARGET) # error SWIG_LUA_TARGET not defined #endif #if defined(SWIG_LUA_ELUA_EMULATE) struct swig_elua_entry; typedef struct swig_elua_key { int type; union { const char* strkey; lua_Number numkey; } key; } swig_elua_key; typedef struct swig_elua_val { int type; union { lua_Number number; const struct swig_elua_entry *table; const char *string; lua_CFunction function; struct { char member; long lvalue; void *pvalue; swig_type_info **ptype; } userdata; } value; } swig_elua_val; typedef struct swig_elua_entry { swig_elua_key key; swig_elua_val value; } swig_elua_entry; #define LSTRKEY(x) {LUA_TSTRING, {.strkey = x} } #define LNUMKEY(x) {LUA_TNUMBER, {.numkey = x} } #define LNILKEY {LUA_TNIL, {.strkey = 0} } #define LNUMVAL(x) {LUA_TNUMBER, {.number = x} } #define LFUNCVAL(x) {LUA_TFUNCTION, {.function = x} } #define LROVAL(x) {LUA_TTABLE, {.table = x} } #define LNILVAL {LUA_TNIL, {.string = 0} } #define LSTRVAL(x) {LUA_TSTRING, {.string = x} } #define LUA_REG_TYPE swig_elua_entry #define SWIG_LUA_ELUA_EMUL_METATABLE_KEY "__metatable" #define lua_pushrotable(L,p)\ lua_newtable(L);\ assert(p);\ SWIG_Lua_elua_emulate_register(L,(swig_elua_entry*)(p)); #define SWIG_LUA_CONSTTAB_POINTER(B,C,D)\ LSTRKEY(B), {LUA_TUSERDATA, { .userdata={0,0,(void*)(C),&D} } } #define SWIG_LUA_CONSTTAB_BINARY(B,S,C,D)\ LSTRKEY(B), {LUA_TUSERDATA, { .userdata={1,S,(void*)(C),&D} } } #endif #if (SWIG_LUA_TARGET == SWIG_LUA_FLAVOR_ELUA) || (SWIG_LUA_TARGET == SWIG_LUA_FLAVOR_ELUAC) # define SWIG_LUA_CONSTTAB_INT(B, C) LSTRKEY(B), LNUMVAL(C) # define SWIG_LUA_CONSTTAB_FLOAT(B, C) LSTRKEY(B), LNUMVAL(C) # define SWIG_LUA_CONSTTAB_STRING(B, C) LSTRKEY(B), LSTRVAL(C) # define SWIG_LUA_CONSTTAB_CHAR(B, C) LSTRKEY(B), LNUMVAL(C) /* Those two types of constants are not supported in elua */ #ifndef SWIG_LUA_CONSTTAB_POINTER #warning eLua does not support pointers as constants. By default, nil will be used as value #define SWIG_LUA_CONSTTAB_POINTER(B,C,D) LSTRKEY(B), LNILVAL #endif #ifndef SWIG_LUA_CONSTTAB_BINARY #warning eLua does not support pointers to member as constants. By default, nil will be used as value #define SWIG_LUA_CONSTTAB_BINARY(B, S, C, D) LSTRKEY(B), LNILVAL #endif #else /* SWIG_LUA_FLAVOR_LUA */ # define SWIG_LUA_CONSTTAB_INT(B, C) SWIG_LUA_INT, (char *)B, (long)C, 0, 0, 0 # define SWIG_LUA_CONSTTAB_FLOAT(B, C) SWIG_LUA_FLOAT, (char *)B, 0, (double)C, 0, 0 # define SWIG_LUA_CONSTTAB_STRING(B, C) SWIG_LUA_STRING, (char *)B, 0, 0, (void *)C, 0 # define SWIG_LUA_CONSTTAB_CHAR(B, C) SWIG_LUA_CHAR, (char *)B, (long)C, 0, 0, 0 # define SWIG_LUA_CONSTTAB_POINTER(B,C,D)\ SWIG_LUA_POINTER, (char *)B, 0, 0, (void *)C, &D # define SWIG_LUA_CONSTTAB_BINARY(B, S, C, D)\ SWIG_LUA_BINARY, (char *)B, S, 0, (void *)C, &D #endif #ifndef SWIG_LUA_ELUA_EMULATE #if (SWIG_LUA_TARGET == SWIG_LUA_FLAVOR_ELUA) || (SWIG_LUA_TARGET == SWIG_LUA_FLAVOR_ELUAC) # define LRO_STRVAL(v) {{.p = (char *) v}, LUA_TSTRING} # define LSTRVAL LRO_STRVAL #endif #endif /* SWIG_LUA_ELUA_EMULATE*/ #ifndef SWIG_LUA_ELUA_EMULATE #if (SWIG_LUA_TARGET == SWIG_LUA_FLAVOR_ELUA) || (SWIG_LUA_TARGET == SWIG_LUA_FLAVOR_ELUAC) #ifndef MIN_OPT_LEVEL #define MIN_OPT_LEVEL 2 #endif #include "lrodefs.h" #include "lrotable.h" #endif #endif /* SWIG_LUA_ELUA_EMULATE*/ /* ----------------------------------------------------------------------------- * compatibility defines * ----------------------------------------------------------------------------- */ /* History of Lua C API length functions: In Lua 5.0 (and before?) there was "lua_strlen". In Lua 5.1, this was renamed "lua_objlen", but a compatibility define of "lua_strlen" was added. In Lua 5.2, this function was again renamed, to "lua_rawlen" (to emphasize that it doesn't call the "__len" metamethod), and the compatibility define of lua_strlen was removed. All SWIG uses have been updated to "lua_rawlen", and we add our own defines of that here for older versions of Lua. */ #if !defined(LUA_VERSION_NUM) || LUA_VERSION_NUM < 501 # define lua_rawlen lua_strlen #elif LUA_VERSION_NUM == 501 # define lua_rawlen lua_objlen #endif /* lua_pushglobaltable is the recommended "future-proof" way to get the global table for Lua 5.2 and later. Here we define lua_pushglobaltable ourselves for Lua versions before 5.2. */ #if !defined(LUA_VERSION_NUM) || LUA_VERSION_NUM < 502 # define lua_pushglobaltable(L) lua_pushvalue(L, LUA_GLOBALSINDEX) #endif /* lua_absindex was introduced in Lua 5.2 */ #if !defined(LUA_VERSION_NUM) || LUA_VERSION_NUM < 502 # define lua_absindex(L,i) ((i)>0 || (i) <= LUA_REGISTRYINDEX ? (i) : lua_gettop(L) + (i) + 1) #endif /* lua_rawsetp was introduced in Lua 5.2 */ #if !defined(LUA_VERSION_NUM) || LUA_VERSION_NUM < 502 #define lua_rawsetp(L,index,ptr)\ lua_pushlightuserdata(L,(void*)(ptr));\ lua_insert(L,-2);\ lua_rawset(L,index); #define lua_rawgetp(L,index,ptr)\ lua_pushlightuserdata(L,(void*)(ptr));\ lua_rawget(L,index); #endif /* -------------------------------------------------------------------------- * Helper functions for error handling * -------------------------------------------------------------------------- */ /* Push the string STR on the Lua stack, like lua_pushstring, but prefixed with the location of the innermost Lua call-point (as formatted by luaL_where). */ SWIGRUNTIME void SWIG_Lua_pusherrstring (lua_State *L, const char *str) { luaL_where (L, 1); lua_pushstring (L, str); lua_concat (L, 2); } /* Push a formatted string generated from FMT and following args on the Lua stack, like lua_pushfstring, but prefixed with the location of the innermost Lua call-point (as formatted by luaL_where). */ SWIGRUNTIME void SWIG_Lua_pushferrstring (lua_State *L, const char *fmt, ...) { va_list argp; va_start(argp, fmt); luaL_where(L, 1); lua_pushvfstring(L, fmt, argp); va_end(argp); lua_concat(L, 2); } /* ----------------------------------------------------------------------------- * global swig types * ----------------------------------------------------------------------------- */ /* Constant table */ #define SWIG_LUA_INT 1 #define SWIG_LUA_FLOAT 2 #define SWIG_LUA_STRING 3 #define SWIG_LUA_POINTER 4 #define SWIG_LUA_BINARY 5 #define SWIG_LUA_CHAR 6 /* Structure for variable linking table */ typedef struct { const char *name; lua_CFunction get; lua_CFunction set; } swig_lua_var_info; #if (SWIG_LUA_TARGET == SWIG_LUA_FLAVOR_ELUA) || (SWIG_LUA_TARGET == SWIG_LUA_FLAVOR_ELUAC) typedef const LUA_REG_TYPE swig_lua_method; typedef const LUA_REG_TYPE swig_lua_const_info; #else /* Normal lua */ typedef luaL_Reg swig_lua_method; /* Constant information structure */ typedef struct { int type; char *name; long lvalue; double dvalue; void *pvalue; swig_type_info **ptype; } swig_lua_const_info; #endif typedef struct { const char *name; lua_CFunction getmethod; lua_CFunction setmethod; } swig_lua_attribute; struct swig_lua_class; /* Can be used to create namespaces. Currently used to wrap class static methods/variables/constants */ typedef struct swig_lua_namespace { const char *name; swig_lua_method *ns_methods; swig_lua_attribute *ns_attributes; swig_lua_const_info *ns_constants; struct swig_lua_class **ns_classes; struct swig_lua_namespace **ns_namespaces; } swig_lua_namespace; typedef struct swig_lua_class { const char *name; /* Name that this class has in Lua */ const char *fqname; /* Fully qualified name - Scope + class name */ swig_type_info **type; lua_CFunction constructor; void (*destructor)(void *); swig_lua_method *methods; swig_lua_attribute *attributes; swig_lua_namespace *cls_static; swig_lua_method *metatable; /* 0 for -eluac */ struct swig_lua_class **bases; const char **base_names; } swig_lua_class; /* this is the struct for wrapping all pointers in SwigLua */ typedef struct { swig_type_info *type; int own; /* 1 if owned & must be destroyed */ void *ptr; } swig_lua_userdata; /* this is the struct for wrapping arbitrary packed binary data (currently it is only used for member function pointers) the data ordering is similar to swig_lua_userdata, but it is currently not possible to tell the two structures apart within SWIG, other than by looking at the type */ typedef struct { swig_type_info *type; int own; /* 1 if owned & must be destroyed */ char data[1]; /* arbitrary amount of data */ } swig_lua_rawdata; /* Common SWIG API */ #define SWIG_NewPointerObj(L, ptr, type, owner) SWIG_Lua_NewPointerObj(L, (void *)ptr, type, owner) #define SWIG_ConvertPtr(L,idx, ptr, type, flags) SWIG_Lua_ConvertPtr(L,idx,ptr,type,flags) #define SWIG_MustGetPtr(L,idx, type,flags, argnum,fnname) SWIG_Lua_MustGetPtr(L,idx, type,flags, argnum,fnname) /* for C++ member pointers, ie, member methods */ #define SWIG_ConvertMember(L, idx, ptr, sz, ty) SWIG_Lua_ConvertPacked(L, idx, ptr, sz, ty) #define SWIG_NewMemberObj(L, ptr, sz, type) SWIG_Lua_NewPackedObj(L, ptr, sz, type) /* Runtime API */ #define SWIG_GetModule(clientdata) SWIG_Lua_GetModule((lua_State*)(clientdata)) #define SWIG_SetModule(clientdata, pointer) SWIG_Lua_SetModule((lua_State*) (clientdata), pointer) #define SWIG_MODULE_CLIENTDATA_TYPE lua_State* /* Contract support */ #define SWIG_contract_assert(expr, msg) \ if (!(expr)) { SWIG_Lua_pusherrstring(L, (char *) msg); goto fail; } else /* helper #defines */ #define SWIG_fail {goto fail;} #define SWIG_fail_arg(func_name,argnum,type) \ {SWIG_Lua_pushferrstring(L,"Error in %s (arg %d), expected '%s' got '%s'",\ func_name,argnum,type,SWIG_Lua_typename(L,argnum));\ goto fail;} #define SWIG_fail_ptr(func_name,argnum,type) \ SWIG_fail_arg(func_name,argnum,(type && type->str)?type->str:"void*") #define SWIG_check_num_args(func_name,a,b) \ if (lua_gettop(L)b) \ {SWIG_Lua_pushferrstring(L,"Error in %s expected %d..%d args, got %d",func_name,a,b,lua_gettop(L));\ goto fail;} #define SWIG_Lua_get_table(L,n) \ (lua_pushstring(L, n), lua_rawget(L,-2)) #define SWIG_Lua_add_function(L,n,f) \ (lua_pushstring(L, n), \ lua_pushcfunction(L, f), \ lua_rawset(L,-3)) #define SWIG_Lua_add_boolean(L,n,b) \ (lua_pushstring(L, n), \ lua_pushboolean(L, b), \ lua_rawset(L,-3)) /* special helper for allowing 'nil' for usertypes */ #define SWIG_isptrtype(L,I) (lua_isuserdata(L,I) || lua_isnil(L,I)) #ifdef __cplusplus /* Special helper for member function pointers it gets the address, casts it, then dereferences it */ /*#define SWIG_mem_fn_as_voidptr(a) (*((char**)&(a))) */ #endif /* storing/access of swig_module_info */ SWIGRUNTIME swig_module_info * SWIG_Lua_GetModule(lua_State *L) { swig_module_info *ret = 0; lua_pushstring(L,"swig_runtime_data_type_pointer" SWIG_RUNTIME_VERSION SWIG_TYPE_TABLE_NAME); lua_rawget(L,LUA_REGISTRYINDEX); if (lua_islightuserdata(L,-1)) ret=(swig_module_info*)lua_touserdata(L,-1); lua_pop(L,1); /* tidy */ return ret; } SWIGRUNTIME void SWIG_Lua_SetModule(lua_State *L, swig_module_info *module) { /* add this all into the Lua registry: */ lua_pushstring(L,"swig_runtime_data_type_pointer" SWIG_RUNTIME_VERSION SWIG_TYPE_TABLE_NAME); lua_pushlightuserdata(L,(void*)module); lua_rawset(L,LUA_REGISTRYINDEX); } /* ----------------------------------------------------------------------------- * global variable support code: modules * ----------------------------------------------------------------------------- */ /* this function is called when trying to set an immutable. default action is to print an error. This can removed with a compile flag SWIGLUA_IGNORE_SET_IMMUTABLE */ SWIGINTERN int SWIG_Lua_set_immutable(lua_State *L) { /* there should be 1 param passed in: the new value */ #ifndef SWIGLUA_IGNORE_SET_IMMUTABLE lua_pop(L,1); /* remove it */ luaL_error(L,"This variable is immutable"); #endif return 0; /* should not return anything */ } #ifdef SWIG_LUA_ELUA_EMULATE SWIGRUNTIME void SWIG_Lua_NewPointerObj(lua_State *L,void *ptr,swig_type_info *type, int own); SWIGRUNTIME void SWIG_Lua_NewPackedObj(lua_State *L,void *ptr,size_t size,swig_type_info *type); static int swig_lua_elua_emulate_unique_key; /* This function emulates eLua rotables behaviour. It loads a rotable definition into the usual lua table. */ SWIGINTERN void SWIG_Lua_elua_emulate_register(lua_State *L, const swig_elua_entry *table) { int i, table_parsed, parsed_tables_array, target_table; assert(lua_istable(L,-1)); target_table = lua_gettop(L); /* Get the registry where we put all parsed tables to avoid loops */ lua_rawgetp(L, LUA_REGISTRYINDEX, &swig_lua_elua_emulate_unique_key); if(lua_isnil(L,-1)) { lua_pop(L,1); lua_newtable(L); lua_pushvalue(L,-1); lua_rawsetp(L,LUA_REGISTRYINDEX,(void*)(&swig_lua_elua_emulate_unique_key)); } parsed_tables_array = lua_gettop(L); lua_pushvalue(L,target_table); lua_rawsetp(L, parsed_tables_array, table); table_parsed = 0; const int SWIGUNUSED pairs_start = lua_gettop(L); for(i = 0;table[i].key.type != LUA_TNIL || table[i].value.type != LUA_TNIL;i++) { const swig_elua_entry *entry = table + i; int is_metatable = 0; switch(entry->key.type) { case LUA_TSTRING: lua_pushstring(L,entry->key.key.strkey); if(strcmp(entry->key.key.strkey, SWIG_LUA_ELUA_EMUL_METATABLE_KEY) == 0) is_metatable = 1; break; case LUA_TNUMBER: lua_pushnumber(L,entry->key.key.numkey); break; case LUA_TNIL: lua_pushnil(L); break; default: assert(0); } switch(entry->value.type) { case LUA_TSTRING: lua_pushstring(L,entry->value.value.string); break; case LUA_TNUMBER: lua_pushnumber(L,entry->value.value.number); break; case LUA_TFUNCTION: lua_pushcfunction(L,entry->value.value.function); break; case LUA_TTABLE: lua_rawgetp(L,parsed_tables_array, entry->value.value.table); table_parsed = !lua_isnil(L,-1); if(!table_parsed) { lua_pop(L,1); /*remove nil */ lua_newtable(L); SWIG_Lua_elua_emulate_register(L,entry->value.value.table); } if(is_metatable) { assert(lua_istable(L,-1)); lua_pushvalue(L,-1); lua_setmetatable(L,target_table); } break; case LUA_TUSERDATA: if(entry->value.value.userdata.member) SWIG_NewMemberObj(L,entry->value.value.userdata.pvalue, entry->value.value.userdata.lvalue, *(entry->value.value.userdata.ptype)); else SWIG_NewPointerObj(L,entry->value.value.userdata.pvalue, *(entry->value.value.userdata.ptype),0); break; case LUA_TNIL: lua_pushnil(L); break; default: assert(0); } assert(lua_gettop(L) == pairs_start + 2); lua_rawset(L,target_table); } lua_pop(L,1); /* Removing parsed tables storage */ assert(lua_gettop(L) == target_table); } SWIGINTERN void SWIG_Lua_elua_emulate_register_clear(lua_State *L) { lua_pushnil(L); lua_rawsetp(L, LUA_REGISTRYINDEX, &swig_lua_elua_emulate_unique_key); } SWIGINTERN void SWIG_Lua_get_class_registry(lua_State *L); SWIGINTERN int SWIG_Lua_emulate_elua_getmetatable(lua_State *L) { SWIG_check_num_args("getmetatable(SWIG eLua emulation)", 1, 1); SWIG_Lua_get_class_registry(L); lua_getfield(L,-1,"lua_getmetatable"); lua_remove(L,-2); /* remove the registry*/ assert(!lua_isnil(L,-1)); lua_pushvalue(L,1); assert(lua_gettop(L) == 3); /* object | function | object again */ lua_call(L,1,1); if(!lua_isnil(L,-1)) /*There is an ordinary metatable */ return 1; /*if it is a table, then emulate elua behaviour - check for __metatable attribute of a table*/ assert(lua_gettop(L) == 2); if(lua_istable(L,-2)) { lua_pop(L,1); /*remove the nil*/ lua_getfield(L,-1, SWIG_LUA_ELUA_EMUL_METATABLE_KEY); } assert(lua_gettop(L) == 2); return 1; fail: lua_error(L); return 0; } SWIGINTERN void SWIG_Lua_emulate_elua_swap_getmetatable(lua_State *L) { SWIG_Lua_get_class_registry(L); lua_pushglobaltable(L); lua_pushstring(L,"lua_getmetatable"); lua_getfield(L,-2,"getmetatable"); assert(!lua_isnil(L,-1)); lua_rawset(L,-4); lua_pushstring(L, "getmetatable"); lua_pushcfunction(L, SWIG_Lua_emulate_elua_getmetatable); lua_rawset(L,-3); lua_pop(L,2); } /* END OF REMOVE */ #endif /* ----------------------------------------------------------------------------- * global variable support code: namespaces and modules (which are the same thing) * ----------------------------------------------------------------------------- */ SWIGINTERN int SWIG_Lua_namespace_get(lua_State *L) { /* there should be 2 params passed in (1) table (not the meta table) (2) string name of the attribute */ assert(lua_istable(L,-2)); /* just in case */ lua_getmetatable(L,-2); assert(lua_istable(L,-1)); SWIG_Lua_get_table(L,".get"); /* find the .get table */ assert(lua_istable(L,-1)); /* look for the key in the .get table */ lua_pushvalue(L,2); /* key */ lua_rawget(L,-2); lua_remove(L,-2); /* stack tidy, remove .get table */ if (lua_iscfunction(L,-1)) { /* found it so call the fn & return its value */ lua_call(L,0,1); /* 1 value in (userdata),1 out (result) */ lua_remove(L,-2); /* stack tidy, remove metatable */ return 1; } lua_pop(L,1); /* remove whatever was there */ /* ok, so try the .fn table */ SWIG_Lua_get_table(L,".fn"); /* find the .get table */ assert(lua_istable(L,-1)); /* just in case */ lua_pushvalue(L,2); /* key */ lua_rawget(L,-2); /* look for the fn */ lua_remove(L,-2); /* stack tidy, remove .fn table */ if (lua_isfunction(L,-1)) /* note: whether it's a C function or lua function */ { /* found it so return the fn & let lua call it */ lua_remove(L,-2); /* stack tidy, remove metatable */ return 1; } lua_pop(L,1); /* remove whatever was there */ return 0; } SWIGINTERN int SWIG_Lua_namespace_set(lua_State *L) { /* there should be 3 params passed in (1) table (not the meta table) (2) string name of the attribute (3) any for the new value */ assert(lua_istable(L,1)); lua_getmetatable(L,1); /* get the meta table */ assert(lua_istable(L,-1)); SWIG_Lua_get_table(L,".set"); /* find the .set table */ if (lua_istable(L,-1)) { /* look for the key in the .set table */ lua_pushvalue(L,2); /* key */ lua_rawget(L,-2); if (lua_iscfunction(L,-1)) { /* found it so call the fn & return its value */ lua_pushvalue(L,3); /* value */ lua_call(L,1,0); return 0; } lua_pop(L,1); /* remove the value */ } lua_pop(L,1); /* remove the value .set table */ lua_pop(L,1); /* remote metatable */ lua_rawset(L,-3); return 0; } #if (SWIG_LUA_TARGET == SWIG_LUA_FLAVOR_LUA) /* In elua this is useless */ SWIGINTERN void SWIG_Lua_InstallConstants(lua_State *L, swig_lua_const_info constants[]); /* forward declaration */ SWIGINTERN void SWIG_Lua_add_variable(lua_State *L,const char *name,lua_CFunction getFn,lua_CFunction setFn); /* forward declaration */ SWIGINTERN void SWIG_Lua_class_register(lua_State *L,swig_lua_class *clss); /* helper function - register namespace methods and attributes into namespace */ SWIGINTERN int SWIG_Lua_add_namespace_details(lua_State *L, swig_lua_namespace *ns) { int i; /* There must be namespace table (not metatable) at the top of the stack */ assert(lua_istable(L,-1)); SWIG_Lua_InstallConstants(L, ns->ns_constants); /* add methods to the namespace/module table */ for(i=0;ns->ns_methods[i].name;i++){ SWIG_Lua_add_function(L,ns->ns_methods[i].name,ns->ns_methods[i].func); } lua_getmetatable(L,-1); /* add fns */ for(i=0;ns->ns_attributes[i].name;i++){ SWIG_Lua_add_variable(L,ns->ns_attributes[i].name,ns->ns_attributes[i].getmethod,ns->ns_attributes[i].setmethod); } /* clear stack - remove metatble */ lua_pop(L,1); return 0; } /* Register all classes in the namespace */ SWIGINTERN void SWIG_Lua_add_namespace_classes(lua_State *L, swig_lua_namespace *ns) { swig_lua_class **classes; /* There must be a module/namespace table at the top of the stack */ assert(lua_istable(L,-1)); classes = ns->ns_classes; if( classes != 0 ) { while(*classes != 0) { SWIG_Lua_class_register(L, *classes); classes++; } } } /* Helper function. Creates namespace table and adds it to module table if 'reg' is true, then will register namespace table to parent one (must be on top of the stack when function is called). Function always returns newly registered table on top of the stack. */ SWIGINTERN void SWIG_Lua_namespace_register(lua_State *L, swig_lua_namespace *ns, int reg) { swig_lua_namespace **sub_namespace; /* 1 argument - table on the top of the stack */ const int SWIGUNUSED begin = lua_gettop(L); assert(lua_istable(L,-1)); /* just in case. This is supposed to be module table or parent namespace table */ lua_checkstack(L,5); lua_newtable(L); /* namespace itself */ lua_newtable(L); /* metatable for namespace */ /* add a table called ".get" */ lua_pushstring(L,".get"); lua_newtable(L); lua_rawset(L,-3); /* add a table called ".set" */ lua_pushstring(L,".set"); lua_newtable(L); lua_rawset(L,-3); /* add a table called ".fn" */ lua_pushstring(L,".fn"); lua_newtable(L); lua_rawset(L,-3); /* add accessor fns for using the .get,.set&.fn */ SWIG_Lua_add_function(L,"__index",SWIG_Lua_namespace_get); SWIG_Lua_add_function(L,"__newindex",SWIG_Lua_namespace_set); lua_setmetatable(L,-2); /* set metatable */ /* Register all functions, variables etc */ SWIG_Lua_add_namespace_details(L,ns); /* Register classes */ SWIG_Lua_add_namespace_classes(L,ns); sub_namespace = ns->ns_namespaces; if( sub_namespace != 0) { while(*sub_namespace != 0) { SWIG_Lua_namespace_register(L, *sub_namespace, 1); lua_pop(L,1); /* removing sub-namespace table */ sub_namespace++; } } if (reg) { lua_pushstring(L,ns->name); lua_pushvalue(L,-2); lua_rawset(L,-4); /* add namespace to module table */ } assert(lua_gettop(L) == begin+1); } #endif /* SWIG_LUA_TARGET == SWIG_LUA_FLAVOR_LUA */ /* ----------------------------------------------------------------------------- * global variable support code: classes * ----------------------------------------------------------------------------- */ SWIGINTERN void SWIG_Lua_get_class_metatable(lua_State *L,const char *cname); typedef int (*swig_lua_base_iterator_func)(lua_State*,swig_type_info*, int, int *ret); SWIGINTERN int SWIG_Lua_iterate_bases(lua_State *L, swig_type_info * SWIGUNUSED swig_type, int first_arg, swig_lua_base_iterator_func func, int *const ret) { /* first_arg - position of the object in stack. Everything that is above are arguments * and is passed to every evocation of the func */ int last_arg = lua_gettop(L);/* position of last argument */ int original_metatable = last_arg + 1; size_t bases_count; int result = SWIG_ERROR; int bases_table; (void)swig_type; lua_getmetatable(L,first_arg); /* initialise base search */ #if (SWIG_LUA_TARGET == SWIG_LUA_FLAVOR_LUA) SWIG_Lua_get_table(L,".bases"); assert(lua_istable(L,-1)); bases_count = lua_rawlen(L,-1); bases_table = lua_gettop(L); #else /* In elua .bases table doesn't exist. Use table from swig_lua_class */ (void)bases_table; assert(swig_type!=0); swig_module_info *module=SWIG_GetModule(L); swig_lua_class **bases= ((swig_lua_class*)(swig_type->clientdata))->bases; const char **base_names= ((swig_lua_class*)(swig_type->clientdata))->base_names; bases_count = 0; for(;base_names[bases_count]; bases_count++);/* get length of bases */ #endif if(ret) *ret = 0; if(bases_count>0) { int to_remove; size_t i; int j; int subcall_last_arg; int subcall_first_arg = lua_gettop(L) + 1;/* Here a copy of first_arg and arguments begin */ int valid = 1; swig_type_info *base_swig_type = 0; for(j=first_arg;j<=last_arg;j++) lua_pushvalue(L,j); subcall_last_arg = lua_gettop(L); /* Trick: temporarily replacing original metatable with metatable for base class and call getter */ for(i=0;ifqname); base_swig_type = SWIG_TypeQueryModule(module,module,base_names[i]); assert(base_swig_type != 0); } #endif if(!valid) continue; assert(lua_isuserdata(L, subcall_first_arg)); assert(lua_istable(L,-1)); lua_setmetatable(L,subcall_first_arg); /* Set new metatable */ assert(lua_gettop(L) == subcall_last_arg); result = func(L, base_swig_type,subcall_first_arg, ret); /* Forward call */ if(result != SWIG_ERROR) { break; } } /* Restore original metatable */ lua_pushvalue(L,original_metatable); lua_setmetatable(L,first_arg); /* Clear - remove everything between last_arg and subcall_last_arg including */ to_remove = subcall_last_arg - last_arg; for(j=0;jtype; result = SWIG_Lua_class_do_get(L,type,1,&ret); if(result == SWIG_OK) return ret; result = SWIG_Lua_class_do_get_item(L,type,1,&ret); if(result == SWIG_OK) return ret; return 0; } /* helper for the class.set method, performs the lookup of class attributes * It returns error code. Number of function return values is passed inside 'ret' */ SWIGINTERN int SWIG_Lua_class_do_set(lua_State *L, swig_type_info *type, int first_arg, int *ret) { /* there should be 3 params passed in (1) table (not the meta table) (2) string name of the attribute (3) any for the new value */ int bases_search_result; int substack_start = lua_gettop(L) - 3; lua_checkstack(L,5); assert(lua_isuserdata(L,substack_start+1)); /* just in case */ lua_getmetatable(L,substack_start+1); /* get the meta table */ assert(lua_istable(L,-1)); /* just in case */ if(ret) *ret = 0; /* it is setter - number of return values is always 0 */ SWIG_Lua_get_table(L,".set"); /* find the .set table */ if (lua_istable(L,-1)) { /* look for the key in the .set table */ lua_pushvalue(L,substack_start+2); /* key */ lua_rawget(L,-2); lua_remove(L,-2); /* tidy stack, remove .set table */ if (lua_iscfunction(L,-1)) { /* found it so call the fn & return its value */ lua_pushvalue(L,substack_start+1); /* userdata */ lua_pushvalue(L,substack_start+3); /* value */ lua_call(L,2,0); lua_remove(L,substack_start+4); /*remove metatable*/ return SWIG_OK; } lua_pop(L,1); /* remove the value */ } else { lua_pop(L,1); /* remove the answer for .set table request*/ } /* NEW: looks for the __setitem() fn this is a user provided set fn */ SWIG_Lua_get_table(L,"__setitem"); /* find the fn */ if (lua_iscfunction(L,-1)) /* if its there */ { /* found it so call the fn & return its value */ lua_pushvalue(L,substack_start+1); /* the userdata */ lua_pushvalue(L,substack_start+2); /* the parameter */ lua_pushvalue(L,substack_start+3); /* the value */ lua_call(L,3,0); /* 3 values in ,0 out */ lua_remove(L,-2); /* stack tidy, remove metatable */ return SWIG_OK; } lua_pop(L,1); /* remove value */ lua_pop(L,1); /* remove metatable */ /* Search among bases */ bases_search_result = SWIG_Lua_iterate_bases(L,type,first_arg,SWIG_Lua_class_do_set,ret); if(ret) assert(*ret == 0); assert(lua_gettop(L) == substack_start + 3); return bases_search_result; } /* This is the actual method exported to Lua. It calls SWIG_Lua_class_do_set and correctly * handles return values. */ SWIGINTERN int SWIG_Lua_class_set(lua_State *L) { /* There should be 3 params passed in (1) table (not the meta table) (2) string name of the attribute (3) any for the new value */ int ret = 0; int result; swig_lua_userdata *usr; swig_type_info *type; assert(lua_isuserdata(L,1)); usr=(swig_lua_userdata*)lua_touserdata(L,1); /* get data */ type = usr->type; result = SWIG_Lua_class_do_set(L,type,1,&ret); if(result != SWIG_OK) { SWIG_Lua_pushferrstring(L,"Assignment not possible. No setter/member with this name. For custom assignments implement __setitem method."); lua_error(L); } else { assert(ret==0); } return 0; } /* the class.destruct method called by the interpreter */ SWIGINTERN int SWIG_Lua_class_destruct(lua_State *L) { /* there should be 1 params passed in (1) userdata (not the meta table) */ swig_lua_userdata *usr; swig_lua_class *clss; assert(lua_isuserdata(L,-1)); /* just in case */ usr=(swig_lua_userdata*)lua_touserdata(L,-1); /* get it */ /* if must be destroyed & has a destructor */ if (usr->own) /* if must be destroyed */ { clss=(swig_lua_class*)usr->type->clientdata; /* get the class */ if (clss && clss->destructor) /* there is a destroy fn */ { clss->destructor(usr->ptr); /* bye bye */ } } return 0; } /* the class.__tostring method called by the interpreter and print */ SWIGINTERN int SWIG_Lua_class_tostring(lua_State *L) { /* there should be 1 param passed in (1) userdata (not the metatable) */ swig_lua_userdata* userData; assert(lua_isuserdata(L,1)); /* just in case */ userData = (swig_lua_userdata*)lua_touserdata(L,1); /* get the userdata address */ lua_pushfstring(L, "", userData->type->str, userData->ptr); return 1; } /* to manually disown some userdata */ SWIGINTERN int SWIG_Lua_class_disown(lua_State *L) { /* there should be 1 params passed in (1) userdata (not the meta table) */ swig_lua_userdata *usr; assert(lua_isuserdata(L,-1)); /* just in case */ usr=(swig_lua_userdata*)lua_touserdata(L,-1); /* get it */ usr->own = 0; /* clear our ownership */ return 0; } /* lua callable function to compare userdata's value the issue is that two userdata may point to the same thing but to lua, they are different objects */ SWIGRUNTIME int SWIG_Lua_class_equal(lua_State *L) { int result; swig_lua_userdata *usr1,*usr2; if (!lua_isuserdata(L,1) || !lua_isuserdata(L,2)) /* just in case */ return 0; /* nil reply */ usr1=(swig_lua_userdata*)lua_touserdata(L,1); /* get data */ usr2=(swig_lua_userdata*)lua_touserdata(L,2); /* get data */ /*result=(usr1->ptr==usr2->ptr && usr1->type==usr2->type); only works if type is the same*/ result=(usr1->ptr==usr2->ptr); lua_pushboolean(L,result); return 1; } /* populate table at the top of the stack with metamethods that ought to be inherited */ SWIGINTERN void SWIG_Lua_populate_inheritable_metamethods(lua_State *L) { SWIG_Lua_add_boolean(L, "__add", 1); SWIG_Lua_add_boolean(L, "__sub", 1); SWIG_Lua_add_boolean(L, "__mul", 1); SWIG_Lua_add_boolean(L, "__div", 1); SWIG_Lua_add_boolean(L, "__mod", 1); SWIG_Lua_add_boolean(L, "__pow", 1); SWIG_Lua_add_boolean(L, "__unm", 1); SWIG_Lua_add_boolean(L, "__len", 1 ); SWIG_Lua_add_boolean(L, "__concat", 1 ); SWIG_Lua_add_boolean(L, "__eq", 1); SWIG_Lua_add_boolean(L, "__lt", 1); SWIG_Lua_add_boolean(L, "__le", 1); SWIG_Lua_add_boolean(L, "__call", 1); SWIG_Lua_add_boolean(L, "__tostring", 1); SWIG_Lua_add_boolean(L, "__gc", 0); } /* creates the swig registry */ SWIGINTERN void SWIG_Lua_create_class_registry(lua_State *L) { /* create main SWIG registry table */ lua_pushstring(L,"SWIG"); lua_newtable(L); /* populate it with some predefined data */ /* .library table. Placeholder */ lua_pushstring(L,".library"); lua_newtable(L); { /* list of metamethods that class inherits from its bases */ lua_pushstring(L,"inheritable_metamethods"); lua_newtable(L); /* populate with list of metamethods */ SWIG_Lua_populate_inheritable_metamethods(L); lua_rawset(L,-3); } lua_rawset(L,-3); lua_rawset(L,LUA_REGISTRYINDEX); } /* gets the swig registry (or creates it) */ SWIGINTERN void SWIG_Lua_get_class_registry(lua_State *L) { /* add this all into the swig registry: */ lua_pushstring(L,"SWIG"); lua_rawget(L,LUA_REGISTRYINDEX); /* get the registry */ if (!lua_istable(L,-1)) /* not there */ { /* must be first time, so add it */ lua_pop(L,1); /* remove the result */ SWIG_Lua_create_class_registry(L); /* then get it */ lua_pushstring(L,"SWIG"); lua_rawget(L,LUA_REGISTRYINDEX); } } SWIGINTERN void SWIG_Lua_get_inheritable_metamethods(lua_State *L) { SWIG_Lua_get_class_registry(L); lua_pushstring(L, ".library"); lua_rawget(L,-2); assert( !lua_isnil(L,-1) ); lua_pushstring(L, "inheritable_metamethods"); lua_rawget(L,-2); /* Remove class registry and library table */ lua_remove(L,-2); lua_remove(L,-2); } /* Helper function to get the classes metatable from the register */ SWIGINTERN void SWIG_Lua_get_class_metatable(lua_State *L,const char *cname) { SWIG_Lua_get_class_registry(L); /* get the registry */ lua_pushstring(L,cname); /* get the name */ lua_rawget(L,-2); /* get it */ lua_remove(L,-2); /* tidy up (remove registry) */ } /* Set up the base classes pointers. Each class structure has a list of pointers to the base class structures. This function fills them. It cannot be done at compile time, as this will not work with hireachies spread over more than one swig file. Therefore it must be done at runtime, querying the SWIG type system. */ SWIGINTERN void SWIG_Lua_init_base_class(lua_State *L,swig_lua_class *clss) { int i=0; swig_module_info *module=SWIG_GetModule(L); for(i=0;clss->base_names[i];i++) { if (clss->bases[i]==0) /* not found yet */ { /* lookup and cache the base class */ swig_type_info *info = SWIG_TypeQueryModule(module,module,clss->base_names[i]); if (info) clss->bases[i] = (swig_lua_class *) info->clientdata; } } } #if defined(SWIG_LUA_SQUASH_BASES) && (SWIG_LUA_TARGET == SWIG_LUA_FLAVOR_LUA) /* Merges two tables */ SWIGINTERN void SWIG_Lua_merge_tables_by_index(lua_State *L, int target, int source) { /* iterating */ lua_pushnil(L); while (lua_next(L,source) != 0) { /* -1 - value, -2 - index */ /* have to copy to assign */ lua_pushvalue(L,-2); /* copy of index */ lua_pushvalue(L,-2); /* copy of value */ lua_rawset(L, target); lua_pop(L,1); /* only key is left */ } } /* Merges two tables with given name. original - index of target metatable, base - index of source metatable */ SWIGINTERN void SWIG_Lua_merge_tables(lua_State *L, const char* name, int original, int base) { /* push original[name], then base[name] */ lua_pushstring(L,name); lua_rawget(L,original); int original_table = lua_gettop(L); lua_pushstring(L,name); lua_rawget(L,base); int base_table = lua_gettop(L); SWIG_Lua_merge_tables_by_index(L, original_table, base_table); /* clearing stack */ lua_pop(L,2); } /* Function takes all symbols from base and adds it to derived class. It's just a helper. */ SWIGINTERN void SWIG_Lua_class_squash_base(lua_State *L, swig_lua_class *base_cls) { /* There is one parameter - original, i.e. 'derived' class metatable */ assert(lua_istable(L,-1)); int original = lua_gettop(L); SWIG_Lua_get_class_metatable(L,base_cls->fqname); int base = lua_gettop(L); SWIG_Lua_merge_tables(L, ".fn", original, base ); SWIG_Lua_merge_tables(L, ".set", original, base ); SWIG_Lua_merge_tables(L, ".get", original, base ); lua_pop(L,1); } /* Function squashes all symbols from 'clss' bases into itself */ SWIGINTERN void SWIG_Lua_class_squash_bases(lua_State *L, swig_lua_class *clss) { int i; SWIG_Lua_get_class_metatable(L,clss->fqname); for(i=0;clss->base_names[i];i++) { if (clss->bases[i]==0) /* Somehow it's not found. Skip it */ continue; /* Thing is: all bases are already registered. Thus they have already executed * this function. So we just need to squash them into us, because their bases * are already squashed into them. No need for recursion here! */ SWIG_Lua_class_squash_base(L, clss->bases[i]); } lua_pop(L,1); /*tidy stack*/ } #endif #if (SWIG_LUA_TARGET == SWIG_LUA_FLAVOR_LUA) /* In elua this is useless */ /* helper add a variable to a registered class */ SWIGINTERN void SWIG_Lua_add_variable(lua_State *L,const char *name,lua_CFunction getFn,lua_CFunction setFn) { assert(lua_istable(L,-1)); /* just in case */ SWIG_Lua_get_table(L,".get"); /* find the .get table */ assert(lua_istable(L,-1)); /* just in case */ SWIG_Lua_add_function(L,name,getFn); lua_pop(L,1); /* tidy stack (remove table) */ if (setFn) { SWIG_Lua_get_table(L,".set"); /* find the .set table */ assert(lua_istable(L,-1)); /* just in case */ SWIG_Lua_add_function(L,name,setFn); lua_pop(L,1); /* tidy stack (remove table) */ } } /* helper to recursively add class static details (static attributes, operations and constants) */ SWIGINTERN void SWIG_Lua_add_class_static_details(lua_State *L, swig_lua_class *clss) { int i = 0; /* The class namespace table must be on the top of the stack */ assert(lua_istable(L,-1)); /* call all the base classes first: we can then override these later: */ for(i=0;clss->bases[i];i++) { SWIG_Lua_add_class_static_details(L,clss->bases[i]); } SWIG_Lua_add_namespace_details(L, clss->cls_static); } SWIGINTERN void SWIG_Lua_add_class_user_metamethods(lua_State *L, swig_lua_class *clss); /* forward declaration */ /* helper to recursively add class details (attributes & operations) */ SWIGINTERN void SWIG_Lua_add_class_instance_details(lua_State *L, swig_lua_class *clss) { int i; size_t bases_count = 0; /* Add bases to .bases table */ SWIG_Lua_get_table(L,".bases"); assert(lua_istable(L,-1)); /* just in case */ for(i=0;clss->bases[i];i++) { SWIG_Lua_get_class_metatable(L,clss->bases[i]->fqname); /* Base class must be already registered */ assert(lua_istable(L,-1)); lua_rawseti(L,-2,i+1); /* In lua indexing starts from 1 */ bases_count++; } assert(lua_rawlen(L,-1) == bases_count); lua_pop(L,1); /* remove .bases table */ /* add attributes */ for(i=0;clss->attributes[i].name;i++){ SWIG_Lua_add_variable(L,clss->attributes[i].name,clss->attributes[i].getmethod,clss->attributes[i].setmethod); } /* add methods to the metatable */ SWIG_Lua_get_table(L,".fn"); /* find the .fn table */ assert(lua_istable(L,-1)); /* just in case */ for(i=0;clss->methods[i].name;i++){ SWIG_Lua_add_function(L,clss->methods[i].name,clss->methods[i].func); } lua_pop(L,1); /* tidy stack (remove table) */ /* add operator overloads This adds methods from metatable array to metatable. Can mess up garbage collectind if someone defines __gc method */ if(clss->metatable) { for(i=0;clss->metatable[i].name;i++) { SWIG_Lua_add_function(L,clss->metatable[i].name,clss->metatable[i].func); } } #if !defined(SWIG_LUA_SQUASH_BASES) /* Adding metamethods that are defined in base classes. If bases were squashed * then it is obviously unnecessary */ SWIG_Lua_add_class_user_metamethods(L, clss); #endif } /* Helpers to add user defined class metamedhods - __add, __sub etc. The helpers are needed for the following issue: Lua runtime checks for metamethod existence with rawget function ignoring our SWIG-provided __index and __newindex functions. Thus our inheritance-aware method search algorithm doesn't work in such case. (Not to say that Lua runtime queries metamethod directly in metatable and not in object). Current solution is this: if somewhere in hierarchy metamethod __x is defined, then all descendants are automatically given a special proxy __x that calls the real __x method. Obvious idea - to copy __x instead of creating __x-proxy is wrong because if someone changes __x in runtime, those changes must be reflected in all descendants. */ SWIGRUNTIME int SWIG_Lua_resolve_metamethod(lua_State *L); /*forward declaration*/ /* The real function that resolves a metamethod. * Function searches given class and all it's bases(recursively) for first instance of something that is * not equal to SWIG_Lua_resolve_metatmethod. (Almost always this 'something' is actual metamethod implementation * and it is a SWIG-generated C function.). It returns value on the top of the L and there is no garbage below the * answer. * Returns 1 if found, 0 otherwise. * clss is class which metatable we will search for method * metamethod_name_idx is index in L where metamethod name (as string) lies * skip_check allows to skip searching metamethod in givel clss and immideatelly go to searching in bases. skip_check * is not caried to subsequent recursive calls - false is always passed. It is set to true only at first call from * SWIG_Lua_resolve_metamethod * */ SWIGINTERN int SWIG_Lua_do_resolve_metamethod(lua_State *L, const swig_lua_class *clss, int metamethod_name_idx, int skip_check) { /* This function is called recursively */ int result = 0; int i = 0; if (!skip_check) { SWIG_Lua_get_class_metatable(L, clss->fqname); lua_pushvalue(L, metamethod_name_idx); lua_rawget(L,-2); /* If this is cfunction and it is equal to SWIG_Lua_resolve_metamethod then * this isn't the function we are looking for :) * lua_tocfunction will return NULL if not cfunction */ if (!lua_isnil(L,-1) && lua_tocfunction(L,-1) != SWIG_Lua_resolve_metamethod ) { lua_remove(L,-2); /* removing class metatable */ return 1; } lua_pop(L,2); /* remove class metatable and query result */ } /* Forwarding calls to bases */ for(i=0;clss->bases[i];i++) { result = SWIG_Lua_do_resolve_metamethod(L, clss->bases[i], metamethod_name_idx, 0); if (result) break; } return result; } /* The proxy function for metamethod. All parameters are passed as cclosure. Searches for actual method * and calls it */ SWIGRUNTIME int SWIG_Lua_resolve_metamethod(lua_State *L) { int numargs; int metamethod_name_idx; const swig_lua_class* clss; int result; lua_checkstack(L,5); numargs = lua_gettop(L); /* number of arguments to pass to actual metamethod */ /* Get upvalues from closure */ lua_pushvalue(L, lua_upvalueindex(1)); /*Get function name*/ metamethod_name_idx = lua_gettop(L); lua_pushvalue(L, lua_upvalueindex(2)); clss = (const swig_lua_class*)(lua_touserdata(L,-1)); lua_pop(L,1); /* remove lightuserdata with clss from stack */ /* Actual work */ result = SWIG_Lua_do_resolve_metamethod(L, clss, metamethod_name_idx, 1); if (!result) { SWIG_Lua_pushferrstring(L,"The metamethod proxy is set, but it failed to find actual metamethod. Memory corruption is most likely explanation."); lua_error(L); return 0; } lua_remove(L,-2); /* remove metamethod key */ lua_insert(L,1); /* move function to correct position */ lua_call(L, numargs, LUA_MULTRET); return lua_gettop(L); /* return all results */ } /* If given metamethod must be present in given class, then creates appropriate proxy * Returns 1 if successfully added, 0 if not added because no base class has it, -1 * if method is defined in the class metatable itself */ SWIGINTERN int SWIG_Lua_add_class_user_metamethod(lua_State *L, swig_lua_class *clss, const int metatable_index) { int key_index; int success = 0; int i = 0; /* metamethod name - on the top of the stack */ assert(lua_isstring(L,-1)); key_index = lua_gettop(L); /* Check whether method is already defined in metatable */ lua_pushvalue(L,key_index); /* copy of the key */ lua_gettable(L,metatable_index); if( !lua_isnil(L,-1) ) { lua_pop(L,1); return -1; } lua_pop(L,1); /* Iterating over immediate bases */ for(i=0;clss->bases[i];i++) { const swig_lua_class *base = clss->bases[i]; SWIG_Lua_get_class_metatable(L, base->fqname); lua_pushvalue(L, key_index); lua_rawget(L, -2); if( !lua_isnil(L,-1) ) { lua_pushvalue(L, key_index); /* Add proxy function */ lua_pushvalue(L, key_index); /* first closure value is function name */ lua_pushlightuserdata(L, clss); /* second closure value is swig_lua_class structure */ lua_pushcclosure(L, SWIG_Lua_resolve_metamethod, 2); lua_rawset(L, metatable_index); success = 1; } lua_pop(L,1); /* remove function or nil */ lua_pop(L,1); /* remove base class metatable */ if( success ) break; } return success; } SWIGINTERN void SWIG_Lua_add_class_user_metamethods(lua_State *L, swig_lua_class *clss) { int metatable_index; int metamethods_info_index; int tostring_undefined; int eq_undefined = 0; SWIG_Lua_get_class_metatable(L, clss->fqname); metatable_index = lua_gettop(L); SWIG_Lua_get_inheritable_metamethods(L); assert(lua_istable(L,-1)); metamethods_info_index = lua_gettop(L); lua_pushnil(L); /* first key */ while(lua_next(L, metamethods_info_index) != 0 ) { /* key at index -2, value at index -1 */ const int is_inheritable = lua_toboolean(L,-2); lua_pop(L,1); /* remove value - we don't need it anymore */ if(is_inheritable) { /* if metamethod is inheritable */ SWIG_Lua_add_class_user_metamethod(L,clss,metatable_index); } } lua_pop(L,1); /* remove inheritable metatmethods table */ /* Special handling for __tostring method */ lua_pushstring(L, "__tostring"); lua_pushvalue(L,-1); lua_rawget(L,metatable_index); tostring_undefined = lua_isnil(L,-1); lua_pop(L,1); if( tostring_undefined ) { lua_pushcfunction(L, SWIG_Lua_class_tostring); lua_rawset(L, metatable_index); } else { lua_pop(L,1); /* remove copy of the key */ } /* Special handling for __eq method */ lua_pushstring(L, "__eq"); lua_pushvalue(L,-1); lua_rawget(L,metatable_index); eq_undefined = lua_isnil(L,-1); lua_pop(L,1); if( eq_undefined ) { lua_pushcfunction(L, SWIG_Lua_class_equal); lua_rawset(L, metatable_index); } else { lua_pop(L,1); /* remove copy of the key */ } /* Warning: __index and __newindex are SWIG-defined. For user-defined operator[] * a __getitem/__setitem method should be defined */ lua_pop(L,1); /* pop class metatable */ } /* Register class static methods,attributes etc as well as constructor proxy */ SWIGINTERN void SWIG_Lua_class_register_static(lua_State *L, swig_lua_class *clss) { const int SWIGUNUSED begin = lua_gettop(L); lua_checkstack(L,5); /* just in case */ assert(lua_istable(L,-1)); /* just in case */ assert(strcmp(clss->name, clss->cls_static->name) == 0); /* in class those 2 must be equal */ SWIG_Lua_namespace_register(L,clss->cls_static, 1); assert(lua_istable(L,-1)); /* just in case */ /* add its constructor to module with the name of the class so you can do MyClass(...) as well as new_MyClass(...) BUT only if a constructor is defined (this overcomes the problem of pure virtual classes without constructors)*/ if (clss->constructor) { lua_getmetatable(L,-1); assert(lua_istable(L,-1)); /* just in case */ SWIG_Lua_add_function(L,"__call", clss->constructor); lua_pop(L,1); } assert(lua_istable(L,-1)); /* just in case */ SWIG_Lua_add_class_static_details(L, clss); /* clear stack */ lua_pop(L,1); assert( lua_gettop(L) == begin ); } /* Performs the instance (non-static) class registration process. Metatable for class is created * and added to the class registry. */ SWIGINTERN void SWIG_Lua_class_register_instance(lua_State *L,swig_lua_class *clss) { const int SWIGUNUSED begin = lua_gettop(L); int i; /* if name already there (class is already registered) then do nothing */ SWIG_Lua_get_class_registry(L); /* get the registry */ lua_pushstring(L,clss->fqname); /* get the name */ lua_rawget(L,-2); if(!lua_isnil(L,-1)) { lua_pop(L,2); assert(lua_gettop(L)==begin); return; } lua_pop(L,2); /* tidy stack */ /* Recursively initialize all bases */ for(i=0;clss->bases[i];i++) { SWIG_Lua_class_register_instance(L,clss->bases[i]); } /* Again, get registry and push name */ SWIG_Lua_get_class_registry(L); /* get the registry */ lua_pushstring(L,clss->fqname); /* get the name */ lua_newtable(L); /* create the metatable */ #if defined(SWIG_LUA_SQUASH_BASES) && (SWIG_LUA_TARGET == SWIG_LUA_FLAVOR_LUA) /* If squashing is requested, then merges all bases metatable into this one. * It would get us all special methods: __getitem, __add etc. * This would set .fn, .type, and other .xxx incorrectly, but we will overwrite it right away */ { int new_metatable_index = lua_absindex(L,-1); for(i=0;clss->bases[i];i++) { int base_metatable; SWIG_Lua_get_class_metatable(L,clss->bases[i]->fqname); base_metatable = lua_absindex(L,-1); SWIG_Lua_merge_tables_by_index(L,new_metatable_index, base_metatable); lua_pop(L,1); } } /* And now we will overwrite all incorrectly set data */ #endif /* add string of class name called ".type" */ lua_pushstring(L,".type"); lua_pushstring(L,clss->fqname); lua_rawset(L,-3); /* add a table called bases */ lua_pushstring(L,".bases"); lua_newtable(L); lua_rawset(L,-3); /* add a table called ".get" */ lua_pushstring(L,".get"); lua_newtable(L); lua_rawset(L,-3); /* add a table called ".set" */ lua_pushstring(L,".set"); lua_newtable(L); lua_rawset(L,-3); /* add a table called ".fn" */ lua_pushstring(L,".fn"); lua_newtable(L); /* add manual disown method */ SWIG_Lua_add_function(L,"__disown",SWIG_Lua_class_disown); lua_rawset(L,-3); /* add accessor fns for using the .get,.set&.fn */ SWIG_Lua_add_function(L,"__index",SWIG_Lua_class_get); SWIG_Lua_add_function(L,"__newindex",SWIG_Lua_class_set); SWIG_Lua_add_function(L,"__gc",SWIG_Lua_class_destruct); /* add it */ lua_rawset(L,-3); /* metatable into registry */ lua_pop(L,1); /* tidy stack (remove registry) */ assert(lua_gettop(L) == begin); #if defined(SWIG_LUA_SQUASH_BASES) && (SWIG_LUA_TARGET == SWIG_LUA_FLAVOR_LUA) /* Now merge all symbols from .fn, .set, .get etc from bases to our tables */ SWIG_Lua_class_squash_bases(L,clss); #endif SWIG_Lua_get_class_metatable(L,clss->fqname); SWIG_Lua_add_class_instance_details(L,clss); /* recursive adding of details (atts & ops) */ lua_pop(L,1); /* tidy stack (remove class metatable) */ assert( lua_gettop(L) == begin ); } SWIGINTERN void SWIG_Lua_class_register(lua_State *L,swig_lua_class *clss) { int SWIGUNUSED begin; assert(lua_istable(L,-1)); /* This is a table (module or namespace) where classes will be added */ SWIG_Lua_class_register_instance(L,clss); SWIG_Lua_class_register_static(L,clss); /* Add links from static part to instance part and vice versa */ /* [SWIG registry] [Module] * "MyClass" ----> [MyClass metatable] <===== "MyClass" -+> [static part] * ".get" ----> ... | | getmetatable()----| * ".set" ----> ... | | | * ".static" --------------)----------------/ [static part metatable] * | ".get" --> ... * | ".set" --> .... * |=============================== ".instance" */ begin = lua_gettop(L); lua_pushstring(L,clss->cls_static->name); lua_rawget(L,-2); /* get class static table */ assert(lua_istable(L,-1)); lua_getmetatable(L,-1); assert(lua_istable(L,-1)); /* get class static metatable */ lua_pushstring(L,".instance"); /* prepare key */ SWIG_Lua_get_class_metatable(L,clss->fqname); /* get class metatable */ assert(lua_istable(L,-1)); lua_pushstring(L,".static"); /* prepare key */ lua_pushvalue(L, -4); /* push static class TABLE */ assert(lua_istable(L,-1)); lua_rawset(L,-3); /* assign static class table(!NOT metatable) as ".static" member of class metatable */ lua_rawset(L,-3); /* assign class metatable as ".instance" member of class static METATABLE */ lua_pop(L,2); assert(lua_gettop(L) == begin); } #endif /* SWIG_LUA_TARGET == SWIG_LUA_FLAVOR_LUA */ #if (SWIG_LUA_TARGET == SWIG_LUA_FLAVOR_ELUA) || (SWIG_LUA_TARGET == SWIG_LUA_FLAVOR_ELUAC) SWIGINTERN void SWIG_Lua_elua_class_register_instance(lua_State *L, swig_lua_class *clss) { const int SWIGUNUSED begin = lua_gettop(L); int i; /* if name already there (class is already registered) then do nothing */ SWIG_Lua_get_class_registry(L); /* get the registry */ lua_pushstring(L,clss->fqname); /* get the name */ lua_rawget(L,-2); if(!lua_isnil(L,-1)) { lua_pop(L,2); assert(lua_gettop(L)==begin); return; } lua_pop(L,2); /* tidy stack */ /* Recursively initialize all bases */ for(i=0;clss->bases[i];i++) { SWIG_Lua_elua_class_register_instance(L,clss->bases[i]); } /* Again, get registry and push name */ SWIG_Lua_get_class_registry(L); /* get the registry */ lua_pushstring(L,clss->fqname); /* get the name */ assert(clss->metatable); lua_pushrotable(L, (void*)(clss->metatable)); /* create the metatable */ lua_rawset(L,-3); lua_pop(L,1); assert(lua_gettop(L) == begin); } #endif /* elua && eluac */ /* ----------------------------------------------------------------------------- * Class/structure conversion fns * ----------------------------------------------------------------------------- */ /* helper to add metatable to new lua object */ SWIGINTERN void SWIG_Lua_AddMetatable(lua_State *L,swig_type_info *type) { if (type->clientdata) /* there is clientdata: so add the metatable */ { SWIG_Lua_get_class_metatable(L,((swig_lua_class*)(type->clientdata))->fqname); if (lua_istable(L,-1)) { lua_setmetatable(L,-2); } else { lua_pop(L,1); } } } /* pushes a new object into the lua stack */ SWIGRUNTIME void SWIG_Lua_NewPointerObj(lua_State *L,void *ptr,swig_type_info *type, int own) { swig_lua_userdata *usr; if (!ptr){ lua_pushnil(L); return; } usr=(swig_lua_userdata*)lua_newuserdata(L,sizeof(swig_lua_userdata)); /* get data */ usr->ptr=ptr; /* set the ptr */ usr->type=type; usr->own=own; #if (SWIG_LUA_TARGET != SWIG_LUA_FLAVOR_ELUAC) SWIG_Lua_AddMetatable(L,type); /* add metatable */ #endif } /* takes a object from the lua stack & converts it into an object of the correct type (if possible) */ SWIGRUNTIME int SWIG_Lua_ConvertPtr(lua_State *L,int index,void **ptr,swig_type_info *type,int flags) { swig_lua_userdata *usr; swig_cast_info *cast; /* special case: lua nil => NULL pointer */ if (lua_isnil(L,index)) { *ptr=0; return (flags & SWIG_POINTER_NO_NULL) ? SWIG_NullReferenceError : SWIG_OK; } usr=(swig_lua_userdata*)lua_touserdata(L,index); /* get data */ if (usr) { if (flags & SWIG_POINTER_DISOWN) /* must disown the object */ { usr->own=0; } if (!type) /* special cast void*, no casting fn */ { *ptr=usr->ptr; return SWIG_OK; /* ok */ } cast=SWIG_TypeCheckStruct(usr->type,type); /* performs normal type checking */ if (cast) { int newmemory = 0; *ptr=SWIG_TypeCast(cast,usr->ptr,&newmemory); assert(!newmemory); /* newmemory handling not yet implemented */ return SWIG_OK; /* ok */ } } return SWIG_ERROR; /* error */ } SWIGRUNTIME void* SWIG_Lua_MustGetPtr(lua_State *L,int index,swig_type_info *type,int flags, int argnum,const char *func_name){ void *result; if (!SWIG_IsOK(SWIG_ConvertPtr(L,index,&result,type,flags))){ luaL_error (L,"Error in %s, expected a %s at argument number %d\n", func_name,(type && type->str)?type->str:"void*",argnum); } return result; } /* pushes a packed userdata. user for member fn pointers only */ SWIGRUNTIME void SWIG_Lua_NewPackedObj(lua_State *L,void *ptr,size_t size,swig_type_info *type) { swig_lua_rawdata *raw; assert(ptr); /* not acceptable to pass in a NULL value */ raw=(swig_lua_rawdata*)lua_newuserdata(L,sizeof(swig_lua_rawdata)-1+size); /* alloc data */ raw->type=type; raw->own=0; memcpy(raw->data,ptr,size); /* copy the data */ SWIG_Lua_AddMetatable(L,type); /* add metatable */ } /* converts a packed userdata. user for member fn pointers only */ SWIGRUNTIME int SWIG_Lua_ConvertPacked(lua_State *L,int index,void *ptr,size_t size,swig_type_info *type) { swig_lua_rawdata *raw; raw=(swig_lua_rawdata*)lua_touserdata(L,index); /* get data */ if (!raw) return SWIG_ERROR; /* error */ if (type==0 || type==raw->type) /* void* or identical type */ { memcpy(ptr,raw->data,size); /* copy it */ return SWIG_OK; /* ok */ } return SWIG_ERROR; /* error */ } /* a function to get the typestring of a piece of data */ SWIGRUNTIME const char *SWIG_Lua_typename(lua_State *L, int tp) { swig_lua_userdata *usr; if (lua_isuserdata(L,tp)) { usr=(swig_lua_userdata*)lua_touserdata(L,tp); /* get data */ if (usr && usr->type && usr->type->str) return usr->type->str; return "userdata (unknown type)"; } return lua_typename(L,lua_type(L,tp)); } /* lua callable function to get the userdata's type */ SWIGRUNTIME int SWIG_Lua_type(lua_State *L) { lua_pushstring(L,SWIG_Lua_typename(L,1)); return 1; } /* ----------------------------------------------------------------------------- * global variable support code: class/struct typemap functions * ----------------------------------------------------------------------------- */ #if ((SWIG_LUA_TARGET != SWIG_LUA_FLAVOR_ELUA) && (SWIG_LUA_TARGET != SWIG_LUA_FLAVOR_ELUAC)) /* Install Constants */ SWIGINTERN void SWIG_Lua_InstallConstants(lua_State *L, swig_lua_const_info constants[]) { int i; for (i = 0; constants[i].type; i++) { switch(constants[i].type) { case SWIG_LUA_INT: lua_pushstring(L,constants[i].name); lua_pushinteger(L,(lua_Integer)constants[i].lvalue); lua_rawset(L,-3); break; case SWIG_LUA_FLOAT: lua_pushstring(L,constants[i].name); lua_pushnumber(L,(lua_Number)constants[i].dvalue); lua_rawset(L,-3); break; case SWIG_LUA_CHAR: lua_pushstring(L,constants[i].name); { char c = (char)constants[i].lvalue; lua_pushlstring(L,&c,1); } lua_rawset(L,-3); break; case SWIG_LUA_STRING: lua_pushstring(L,constants[i].name); lua_pushstring(L,(char *) constants[i].pvalue); lua_rawset(L,-3); break; case SWIG_LUA_POINTER: lua_pushstring(L,constants[i].name); SWIG_NewPointerObj(L,constants[i].pvalue, *(constants[i]).ptype,0); lua_rawset(L,-3); break; case SWIG_LUA_BINARY: lua_pushstring(L,constants[i].name); SWIG_NewMemberObj(L,constants[i].pvalue,constants[i].lvalue,*(constants[i]).ptype); lua_rawset(L,-3); break; default: break; } } } #endif /* ----------------------------------------------------------------------------- * executing lua code from within the wrapper * ----------------------------------------------------------------------------- */ #ifndef SWIG_DOSTRING_FAIL /* Allows redefining of error function */ #define SWIG_DOSTRING_FAIL(S) fprintf(stderr,"%s\n",S) #endif /* Executes a C string in Lua which is a really simple way of calling lua from C Unfortunately lua keeps changing its APIs, so we need a conditional compile In lua 5.0.X it's lua_dostring() In lua 5.1.X it's luaL_dostring() */ SWIGINTERN int SWIG_Lua_dostring(lua_State *L, const char *str) { int ok,top; if (str==0 || str[0]==0) return 0; /* nothing to do */ top=lua_gettop(L); /* save stack */ #if (defined(LUA_VERSION_NUM) && (LUA_VERSION_NUM>=501)) ok=luaL_dostring(L,str); /* looks like this is lua 5.1.X or later, good */ #else ok=lua_dostring(L,str); /* might be lua 5.0.x, using lua_dostring */ #endif if (ok!=0) { SWIG_DOSTRING_FAIL(lua_tostring(L,-1)); } lua_settop(L,top); /* restore the stack */ return ok; } #ifdef __cplusplus } #endif /* ------------------------------ end luarun.swg ------------------------------ */ swig-4.0.1/Lib/lua/luakw.swg0000644000175000017500000000230413527063513015503 0ustar williamwilliam/* Warnings for Lua keywords, built-in names and bad names. */ #define LUAKW(x) %keywordwarn("'" `x` "' is a Lua keyword, renaming to 'c_" `x` "'", rename="c_%s") `x` #define LUABN(x) %namewarn(%warningmsg(SWIGWARN_PARSE_BUILTIN_NAME, "'" `x` "' conflicts with a basic function in Lua"), %$not %$ismember) `x` /* Warnings for Lua keywords http://www.lua.org/manual/5.2/manual.html#3.1 */ LUAKW(and); LUAKW(break); LUAKW(do); LUAKW(else); LUAKW(elseif); LUAKW(end); LUAKW(false); LUAKW(for); LUAKW(function); LUAKW(goto); LUAKW(if); LUAKW(in); LUAKW(local); LUAKW(nil); LUAKW(not); LUAKW(or); LUAKW(repeat); LUAKW(return); LUAKW(then); LUAKW(true); LUAKW(until); LUAKW(while); /* Basic functions http://www.lua.org/manual/5.2/manual.html#6.1 */ LUABN(assert); LUABN(collectgarbage); LUABN(dofile); LUABN(error); LUABN(_G); // Not actually a function LUABN(getmetatable); LUABN(ipairs); LUABN(load); LUABN(loadfile); LUABN(next); LUABN(pairs); LUABN(pcall); LUABN(print); LUABN(rawequal); LUABN(rawget); LUABN(rawlen); LUABN(rawset); LUABN(select); LUABN(setmetatable); LUABN(tonumber); LUABN(tostring); LUABN(type); LUABN(_VERSION); // Not actually a function LUABN(xpcall); #undef LUABN #undef LUAKW swig-4.0.1/Lib/lua/std_common.i0000644000175000017500000000014613527063513016154 0ustar williamwilliam%include %apply size_t { std::size_t }; %apply const size_t& { const std::size_t& }; swig-4.0.1/Lib/lua/std_except.i0000644000175000017500000000370013527063513016153 0ustar williamwilliam/* ----------------------------------------------------------------------------- * Typemaps used by the STL wrappers that throw exceptions. * These typemaps are used when methods are declared with an STL exception * specification, such as: * size_t at() const throw (std::out_of_range); * * std_except.i * ----------------------------------------------------------------------------- */ %{ #include #include %} %include namespace std { %ignore exception; // not sure if I should ignore this... class exception { public: exception() throw() { } virtual ~exception() throw(); virtual const char* what() const throw(); }; } // normally objects which are thrown are returned to the interpreter as errors // (which potentially may have problems if they are not copied) // therefore all classes based upon std::exception are converted to their strings & returned as errors %typemap(throws) std::bad_cast "SWIG_exception(SWIG_TypeError, $1.what());" %typemap(throws) std::bad_exception "SWIG_exception(SWIG_RuntimeError, $1.what());" %typemap(throws) std::domain_error "SWIG_exception(SWIG_ValueError, $1.what());" %typemap(throws) std::exception "SWIG_exception(SWIG_SystemError, $1.what());" %typemap(throws) std::invalid_argument "SWIG_exception(SWIG_ValueError, $1.what());" %typemap(throws) std::length_error "SWIG_exception(SWIG_IndexError, $1.what());" %typemap(throws) std::logic_error "SWIG_exception(SWIG_RuntimeError, $1.what());" %typemap(throws) std::out_of_range "SWIG_exception(SWIG_IndexError, $1.what());" %typemap(throws) std::overflow_error "SWIG_exception(SWIG_OverflowError, $1.what());" %typemap(throws) std::range_error "SWIG_exception(SWIG_IndexError, $1.what());" %typemap(throws) std::runtime_error "SWIG_exception(SWIG_RuntimeError, $1.what());" %typemap(throws) std::underflow_error "SWIG_exception(SWIG_RuntimeError, $1.what());" swig-4.0.1/Lib/lua/typemaps.i0000644000175000017500000004575413527063513015672 0ustar williamwilliam/* ----------------------------------------------------------------------------- * typemaps.swg * * SWIG Library file containing the main typemap code to support Lua modules. * ----------------------------------------------------------------------------- */ /* ----------------------------------------------------------------------------- * Basic inout typemaps * ----------------------------------------------------------------------------- */ /* These provide the basic ability for passing in & out of standard numeric data types (int,long,float,double, etc) The basic code looks like this: %typemap(in,checkfn="lua_isnumber") int *INPUT(int temp), int &INPUT(int temp) %{ temp = (int)lua_tonumber(L,$input); $1 = &temp; %} %typemap(in, numinputs=0) int *OUTPUT (int temp) %{ $1 = &temp; %} %typemap(argout) int *OUTPUT %{ lua_pushnumber(L, (double) *$1); SWIG_arg++;%} %typemap(in) int *INOUT = int *INPUT; %typemap(argout) int *INOUT = int *OUTPUT; However the code below is a mixture of #defines & such, so nowhere as easy to read To make you code work correctly its not just a matter of %including this file You also have to give SWIG the hints on which to use where eg extern int add_pointer(int* a1,int* a2); // a1 & a2 are pointer values to be added extern void swap(int* s1, int* s2); // does the swap You will need to either change the argument names extern int add_pointer(int* INPUT,int* INPUT); or provide a %apply statement %apply int* INOUT{ int *s1, int *s2 }; // if SWIG sees int* s1, int* s2, assume they are inout params */ %define SWIG_NUMBER_TYPEMAP(TYPE) %typemap(in,checkfn="lua_isnumber") TYPE *INPUT($*ltype temp), TYPE &INPUT($*ltype temp) %{ temp = ($*ltype)lua_tonumber(L,$input); $1 = &temp; %} %typemap(in, numinputs=0) TYPE *OUTPUT ($*ltype temp) %{ $1 = &temp; %} %typemap(argout) TYPE *OUTPUT %{ lua_pushnumber(L, (lua_Number) *$1); SWIG_arg++;%} %typemap(in) TYPE *INOUT = TYPE *INPUT; %typemap(argout) TYPE *INOUT = TYPE *OUTPUT; %typemap(in) TYPE &OUTPUT = TYPE *OUTPUT; %typemap(argout) TYPE &OUTPUT = TYPE *OUTPUT; %typemap(in) TYPE &INOUT = TYPE *INPUT; %typemap(argout) TYPE &INOUT = TYPE *OUTPUT; // const version (the $*ltype is the basic number without ptr or const's) %typemap(in,checkfn="lua_isnumber") const TYPE *INPUT($*ltype temp) %{ temp = ($*ltype)lua_tonumber(L,$input); $1 = &temp; %} %enddef // now the code SWIG_NUMBER_TYPEMAP(unsigned char); SWIG_NUMBER_TYPEMAP(signed char); SWIG_NUMBER_TYPEMAP(short); SWIG_NUMBER_TYPEMAP(unsigned short); SWIG_NUMBER_TYPEMAP(signed short); SWIG_NUMBER_TYPEMAP(int); SWIG_NUMBER_TYPEMAP(unsigned int); SWIG_NUMBER_TYPEMAP(signed int); SWIG_NUMBER_TYPEMAP(long); SWIG_NUMBER_TYPEMAP(unsigned long); SWIG_NUMBER_TYPEMAP(signed long); SWIG_NUMBER_TYPEMAP(float); SWIG_NUMBER_TYPEMAP(double); SWIG_NUMBER_TYPEMAP(enum SWIGTYPE); // also for long longs's SWIG_NUMBER_TYPEMAP(long long); SWIG_NUMBER_TYPEMAP(unsigned long long); SWIG_NUMBER_TYPEMAP(signed long long); // note we dont do char, as a char* is probably a string not a ptr to a single char // similar for booleans %typemap(in,checkfn="lua_isboolean") bool *INPUT(bool temp), bool &INPUT(bool temp) %{ temp = (lua_toboolean(L,$input)!=0); $1 = &temp; %} %typemap(in, numinputs=0) bool *OUTPUT (bool temp),bool &OUTPUT (bool temp) %{ $1 = &temp; %} %typemap(argout) bool *OUTPUT,bool &OUTPUT %{ lua_pushboolean(L, (int)((*$1)!=0)); SWIG_arg++;%} %typemap(in) bool *INOUT = bool *INPUT; %typemap(argout) bool *INOUT = bool *OUTPUT; %typemap(in) bool &INOUT = bool &INPUT; %typemap(argout) bool &INOUT = bool &OUTPUT; /* ----------------------------------------------------------------------------- * Basic Array typemaps * ----------------------------------------------------------------------------- */ /* I have no idea why this kind of code does not exist in SWIG as standard, but here is it. This code will convert to/from 1D numeric arrays. In order to reduce code bloat, there are a few macros and quite a few functions defined (unfortunately this makes it a lot less clear) assuming we have functions void process_array(int arr[3]); // nice fixed size array void process_var_array(float arr[],int len); // variable sized array void process_var_array_inout(double* arr,int len); // variable sized array // data passed in & out void process_enum_inout_array_var(enum Days *arrinout, int len); // using enums void return_array_5(int arrout[5]); // out array only in order to wrap them correctly requires a typemap // inform SWIG of the correct typemap // For fixed length, you must specify it as INPUT[ANY] %apply (int INPUT[ANY]) {(int arr[3])}; // variable length arrays are just the same %apply (float INPUT[],int) {(float arr[],int len)}; // it is also ok, to map the TYPE* instead of a TYPE[] %apply (double *INOUT,int) {(double arr*,int len)}; // for the enum's you must use enum SWIGTYPE %apply (enum SWIGTYPE *INOUT,int) {(enum Days *arrinout, int len)}; // fixed length out if also fine %apply (int OUTPUT[ANY]) {(int arrout[5])}; Generally, you could use %typemap(...)=... but the %apply is neater & easier a few things of note: * all Lua tables are indexed from 1, all C/C++ arrays are indexed from 0 therefore t={6,5,3} -- t[1]==6, t[2]==5, t[3]==3 when passed to process_array(int arr[3]) becomes arr[0]==6, arr[1]==5, arr[2]==3 * for OUTPUT arrays, no array need be passed in, the fn will return a Lua table so for the above mentioned return_array_5() would look like arr=return_array_5() -- no parameters passed in * for INOUT arrays, a table must be passed in, and a new table will be returned (this is consistent with the way that numbers are processed) if you want just use arr={...} arr=process_var_array_inout(arr) -- arr is replaced by the new version The following are not yet supported: * variable length output only array (inout works ok) * multidimensional arrays * arrays of objects/structs * arrays of pointers */ /* The internals of the array management stuff helper fns/macros SWIG_ALLOC_ARRAY(TYPE,LEN) // returns a typed array TYPE[LEN] SWIG_FREE_ARRAY(PTR) // delete the ptr (if not zero) // counts the specified table & gets the size // integer version int SWIG_itable_size(lua_State* L, int index); // other version int SWIG_table_size(lua_State* L, int index); SWIG_DECLARE_TYPEMAP_ARR_FN(NAME,TYPE) // this fn declares up 4 functions for helping to read/write tables // these can then be called by the macros ... // all assume the table is an integer indexes from 1 // but the C array is a indexed from 0 // created a fixed size array, reads the specified table // and then fills the array with numbers // returns ptr to the array if ok, or 0 for error // (also pushes a error message to the stack) TYPE* SWIG_get_NAME_num_array_fixed(lua_State* L, int index, int size); // as per SWIG_get_NAME_num_array_fixed() // but reads the entire table & creates an array of the correct size // (if the table is empty, it returns an error rather than a zero length array) TYPE* SWIG_get_NAME_num_array_var(lua_State* L, int index, int* size); // writes a table to Lua with all the specified numbers void SWIG_write_NAME_num_array(lua_State* L,TYPE *array,int size); // read the specified table, and fills the array with numbers // returns 1 of ok (only fails if it doesn't find numbers) // helper fn (called by SWIG_get_NAME_num_array_*() fns) int SWIG_read_NAME_num_array(lua_State* L,int index,TYPE *array,int size); */ /* Reported that you don't need to check for NULL for delete & free There probably is some compiler that its not true for, so the code is left here just in case. #ifdef __cplusplus #define SWIG_ALLOC_ARRAY(TYPE,LEN) new TYPE[LEN] #define SWIG_FREE_ARRAY(PTR) if(PTR){delete[] PTR;} #else #define SWIG_ALLOC_ARRAY(TYPE,LEN) (TYPE *)malloc(LEN*sizeof(TYPE)) #define SWIG_FREE_ARRAY(PTR) if(PTR){free(PTR);} #endif */ %{ #ifdef __cplusplus /* generic alloc/dealloc fns*/ #define SWIG_ALLOC_ARRAY(TYPE,LEN) new TYPE[LEN] #define SWIG_FREE_ARRAY(PTR) delete[] PTR #else #define SWIG_ALLOC_ARRAY(TYPE,LEN) (TYPE *)malloc(LEN*sizeof(TYPE)) #define SWIG_FREE_ARRAY(PTR) free(PTR) #endif /* counting the size of arrays:*/ SWIGINTERN int SWIG_itable_size(lua_State* L, int index) { int n=0; while(1){ lua_rawgeti(L,index,n+1); if (lua_isnil(L,-1))break; ++n; lua_pop(L,1); } lua_pop(L,1); return n; } SWIGINTERN int SWIG_table_size(lua_State* L, int index) { int n=0; lua_pushnil(L); /* first key*/ while (lua_next(L, index) != 0) { ++n; lua_pop(L, 1); /* removes `value'; keeps `key' for next iteration*/ } return n; } /* super macro to declare array typemap helper fns */ #define SWIG_DECLARE_TYPEMAP_ARR_FN(NAME,TYPE)\ SWIGINTERN int SWIG_read_##NAME##_num_array(lua_State* L,int index,TYPE *array,int size){\ int i;\ for (i = 0; i < size; i++) {\ lua_rawgeti(L,index,i+1);\ if (lua_isnumber(L,-1)){\ array[i] = (TYPE)lua_tonumber(L,-1);\ } else {\ lua_pop(L,1);\ return 0;\ }\ lua_pop(L,1);\ }\ return 1;\ }\ SWIGINTERN TYPE* SWIG_get_##NAME##_num_array_fixed(lua_State* L, int index, int size){\ TYPE *array;\ if (!lua_istable(L,index) || SWIG_itable_size(L,index) != size) {\ SWIG_Lua_pushferrstring(L,"expected a table of size %d",size);\ return 0;\ }\ array=SWIG_ALLOC_ARRAY(TYPE,size);\ if (!SWIG_read_##NAME##_num_array(L,index,array,size)){\ SWIG_Lua_pusherrstring(L,"table must contain numbers");\ SWIG_FREE_ARRAY(array);\ return 0;\ }\ return array;\ }\ SWIGINTERN TYPE* SWIG_get_##NAME##_num_array_var(lua_State* L, int index, int* size)\ {\ TYPE *array;\ if (!lua_istable(L,index)) {\ SWIG_Lua_pusherrstring(L,"expected a table");\ return 0;\ }\ *size=SWIG_itable_size(L,index);\ if (*size<1){\ SWIG_Lua_pusherrstring(L,"table appears to be empty");\ return 0;\ }\ array=SWIG_ALLOC_ARRAY(TYPE,*size);\ if (!SWIG_read_##NAME##_num_array(L,index,array,*size)){\ SWIG_Lua_pusherrstring(L,"table must contain numbers");\ SWIG_FREE_ARRAY(array);\ return 0;\ }\ return array;\ }\ SWIGINTERN void SWIG_write_##NAME##_num_array(lua_State* L,TYPE *array,int size){\ int i;\ lua_newtable(L);\ for (i = 0; i < size; i++){\ lua_pushnumber(L,(lua_Number)array[i]);\ lua_rawseti(L,-2,i+1);/* -1 is the number, -2 is the table*/ \ }\ } %} /* This is one giant macro to define the typemaps & the helpers for array handling */ %define SWIG_TYPEMAP_NUM_ARR(NAME,TYPE) %{SWIG_DECLARE_TYPEMAP_ARR_FN(NAME,TYPE)%} // fixed size array's %typemap(in) TYPE INPUT[ANY] %{ $1 = SWIG_get_##NAME##_num_array_fixed(L,$input,$1_dim0); if (!$1) SWIG_fail;%} %typemap(freearg) TYPE INPUT[ANY] %{ SWIG_FREE_ARRAY($1);%} // variable size array's %typemap(in) (TYPE *INPUT,int) %{ $1 = SWIG_get_##NAME##_num_array_var(L,$input,&$2); if (!$1) SWIG_fail;%} %typemap(freearg) (TYPE *INPUT,int) %{ SWIG_FREE_ARRAY($1);%} // out fixed arrays %typemap(in,numinputs=0) TYPE OUTPUT[ANY] %{ $1 = SWIG_ALLOC_ARRAY(TYPE,$1_dim0); %} %typemap(argout) TYPE OUTPUT[ANY] %{ SWIG_write_##NAME##_num_array(L,$1,$1_dim0); SWIG_arg++; %} %typemap(freearg) TYPE OUTPUT[ANY] %{ SWIG_FREE_ARRAY($1); %} // inout fixed arrays %typemap(in) TYPE INOUT[ANY]=TYPE INPUT[ANY]; %typemap(argout) TYPE INOUT[ANY]=TYPE OUTPUT[ANY]; %typemap(freearg) TYPE INOUT[ANY]=TYPE INPUT[ANY]; // inout variable arrays %typemap(in) (TYPE *INOUT,int)=(TYPE *INPUT,int); %typemap(argout) (TYPE *INOUT,int) %{ SWIG_write_##NAME##_num_array(L,$1,$2); SWIG_arg++; %} %typemap(freearg) (TYPE *INOUT,int)=(TYPE *INPUT,int); // TODO out variable arrays (is there a standard form for such things?) // referencing so that (int *INPUT,int) and (int INPUT[],int) are the same %typemap(in) (TYPE INPUT[],int)=(TYPE *INPUT,int); %typemap(freearg) (TYPE INPUT[],int)=(TYPE *INPUT,int); %enddef // the following line of code // declares the C helper fns for the array typemaps // as well as defining typemaps for // fixed len arrays in & out, & variable length arrays in SWIG_TYPEMAP_NUM_ARR(schar,signed char); SWIG_TYPEMAP_NUM_ARR(uchar,unsigned char); SWIG_TYPEMAP_NUM_ARR(int,int); SWIG_TYPEMAP_NUM_ARR(uint,unsigned int); SWIG_TYPEMAP_NUM_ARR(short,short); SWIG_TYPEMAP_NUM_ARR(ushort,unsigned short); SWIG_TYPEMAP_NUM_ARR(long,long); SWIG_TYPEMAP_NUM_ARR(ulong,unsigned long); SWIG_TYPEMAP_NUM_ARR(float,float); SWIG_TYPEMAP_NUM_ARR(double,double); // again enums are a problem so they need their own type // we use the int conversion routine & recast it %typemap(in) enum SWIGTYPE INPUT[ANY] %{ $1 = ($ltype)SWIG_get_int_num_array_fixed(L,$input,$1_dim0); if (!$1) SWIG_fail;%} %typemap(freearg) enum SWIGTYPE INPUT[ANY] %{ SWIG_FREE_ARRAY($1);%} // variable size arrays %typemap(in) (enum SWIGTYPE *INPUT,int) %{ $1 = ($ltype)SWIG_get_int_num_array_var(L,$input,&$2); if (!$1) SWIG_fail;%} %typemap(freearg) (enum SWIGTYPE *INPUT,int) %{ SWIG_FREE_ARRAY($1);%} // out fixed arrays %typemap(in,numinputs=0) enum SWIGTYPE OUTPUT[ANY] %{ $1 = SWIG_ALLOC_ARRAY(enum SWIGTYPE,$1_dim0); %} %typemap(argout) enum SWIGTYPE OUTPUT[ANY] %{ SWIG_write_int_num_array(L,(int*)$1,$1_dim0); SWIG_arg++; %} %typemap(freearg) enum SWIGTYPE OUTPUT[ANY] %{ SWIG_FREE_ARRAY($1); %} // inout fixed arrays %typemap(in) enum SWIGTYPE INOUT[ANY]=enum SWIGTYPE INPUT[ANY]; %typemap(argout) enum SWIGTYPE INOUT[ANY]=enum SWIGTYPE OUTPUT[ANY]; %typemap(freearg) enum SWIGTYPE INOUT[ANY]=enum SWIGTYPE INPUT[ANY]; // inout variable arrays %typemap(in) (enum SWIGTYPE *INOUT,int)=(enum SWIGTYPE *INPUT,int); %typemap(argout) (enum SWIGTYPE *INOUT,int) %{ SWIG_write_int_num_array(L,(int*)$1,$2); SWIG_arg++; %} %typemap(freearg) (enum SWIGTYPE *INOUT,int)=(enum SWIGTYPE *INPUT,int); /* Surprisingly pointer arrays are easier: this is because all ptr arrays become void** so only a few fns are needed & a few casts The function defined are // created a fixed size array, reads the specified table // and then fills the array with pointers (checking the type) // returns ptr to the array if ok, or 0 for error // (also pushes a error message to the stack) void** SWIG_get_ptr_array_fixed(lua_State* L, int index, int size,swig_type_info *type); // as per SWIG_get_ptr_array_fixed() // but reads the entire table & creates an array of the correct size // (if the table is empty, it returns an error rather than a zero length array) void** SWIG_get_ptr_array_var(lua_State* L, int index, int* size,swig_type_info *type); // writes a table to Lua with all the specified pointers // all pointers have the ownership value 'own' (normally 0) void SWIG_write_ptr_array(lua_State* L,void **array,int size,int own); // read the specified table, and fills the array with ptrs // returns 1 of ok (only fails if it doesn't find correct type of ptrs) // helper fn (called by SWIG_get_ptr_array_*() fns) int SWIG_read_ptr_array(lua_State* L,int index,void **array,int size,swig_type_info *type); The key thing to remember is that it is assumed that there is no modification of pointers ownership in the arrays eg A fn: void pointers_in(TYPE* arr[],int len); will make copies of the pointer into a temp array and then pass it into the fn Lua does not remember that this fn held the pointers, so it is not safe to keep these pointers until later eg A fn: void pointers_out(TYPE* arr[3]); will return a table containing three pointers however these pointers are NOT owned by Lua, merely borrowed so if the C/C++ frees then Lua is not aware */ %{ SWIGINTERN int SWIG_read_ptr_array(lua_State* L,int index,void **array,int size,swig_type_info *type){ int i; for (i = 0; i < size; i++) { lua_rawgeti(L,index,i+1); if (!lua_isuserdata(L,-1) || SWIG_ConvertPtr(L,-1,&array[i],type,0)==-1){ lua_pop(L,1); return 0; } lua_pop(L,1); } return 1; } SWIGINTERN void** SWIG_get_ptr_array_fixed(lua_State* L, int index, int size,swig_type_info *type){ void **array; if (!lua_istable(L,index) || SWIG_itable_size(L,index) != size) { SWIG_Lua_pushferrstring(L,"expected a table of size %d",size); return 0; } array=SWIG_ALLOC_ARRAY(void*,size); if (!SWIG_read_ptr_array(L,index,array,size,type)){ SWIG_Lua_pushferrstring(L,"table must contain pointers of type %s",type->name); SWIG_FREE_ARRAY(array); return 0; } return array; } SWIGINTERN void** SWIG_get_ptr_array_var(lua_State* L, int index, int* size,swig_type_info *type){ void **array; if (!lua_istable(L,index)) { SWIG_Lua_pusherrstring(L,"expected a table"); return 0; } *size=SWIG_itable_size(L,index); if (*size<1){ SWIG_Lua_pusherrstring(L,"table appears to be empty"); return 0; } array=SWIG_ALLOC_ARRAY(void*,*size); if (!SWIG_read_ptr_array(L,index,array,*size,type)){ SWIG_Lua_pushferrstring(L,"table must contain pointers of type %s",type->name); SWIG_FREE_ARRAY(array); return 0; } return array; } SWIGINTERN void SWIG_write_ptr_array(lua_State* L,void **array,int size,swig_type_info *type,int own){ int i; lua_newtable(L); for (i = 0; i < size; i++){ SWIG_NewPointerObj(L,array[i],type,own); lua_rawseti(L,-2,i+1);/* -1 is the number, -2 is the table*/ } } %} // fixed size array's %typemap(in) SWIGTYPE* INPUT[ANY] %{ $1 = ($ltype)SWIG_get_ptr_array_fixed(L,$input,$1_dim0,$*1_descriptor); if (!$1) SWIG_fail;%} %typemap(freearg) SWIGTYPE* INPUT[ANY] %{ SWIG_FREE_ARRAY($1);%} // variable size array's %typemap(in) (SWIGTYPE **INPUT,int) %{ $1 = ($ltype)SWIG_get_ptr_array_var(L,$input,&$2,$*1_descriptor); if (!$1) SWIG_fail;%} %typemap(freearg) (SWIGTYPE **INPUT,int) %{ SWIG_FREE_ARRAY($1);%} // out fixed arrays %typemap(in,numinputs=0) SWIGTYPE* OUTPUT[ANY] %{ $1 = SWIG_ALLOC_ARRAY($*1_type,$1_dim0); %} %typemap(argout) SWIGTYPE* OUTPUT[ANY] %{ SWIG_write_ptr_array(L,(void**)$1,$1_dim0,$*1_descriptor,0); SWIG_arg++; %} %typemap(freearg) SWIGTYPE* OUTPUT[ANY] %{ SWIG_FREE_ARRAY($1); %} // inout fixed arrays %typemap(in) SWIGTYPE* INOUT[ANY]=SWIGTYPE* INPUT[ANY]; %typemap(argout) SWIGTYPE* INOUT[ANY]=SWIGTYPE* OUTPUT[ANY]; %typemap(freearg) SWIGTYPE* INOUT[ANY]=SWIGTYPE* INPUT[ANY]; // inout variable arrays %typemap(in) (SWIGTYPE** INOUT,int)=(SWIGTYPE** INPUT,int); %typemap(argout) (SWIGTYPE** INOUT,int) %{ SWIG_write_ptr_array(L,(void**)$1,$2,$*1_descriptor,0); SWIG_arg++; %} %typemap(freearg) (SWIGTYPE**INOUT,int)=(SWIGTYPE**INPUT,int); /* ----------------------------------------------------------------------------- * Pointer-Pointer typemaps * ----------------------------------------------------------------------------- */ /* This code is to deal with the issue for pointer-pointer's In particular for factory methods. for example take the following code segment: struct iMath; // some structure int Create_Math(iMath** pptr); // its factory (assume it mallocs) to use it you might have the following C code: iMath* ptr; int ok; ok=Create_Math(&ptr); // do things with ptr //... free(ptr); With the following SWIG code %apply SWIGTYPE** OUTPUT{iMath **pptr }; You can get natural wrapping in Lua as follows: ok,ptr=Create_Math() -- ptr is a iMath* which is returned with the int ptr=nil -- the iMath* will be GC'ed as normal */ %typemap(in,numinputs=0) SWIGTYPE** OUTPUT ($*ltype temp) %{ temp = ($*ltype)0; $1 = &temp; %} %typemap(argout) SWIGTYPE** OUTPUT %{SWIG_NewPointerObj(L,*$1,$*descriptor,1); SWIG_arg++; %} swig-4.0.1/Lib/lua/carrays.i0000644000175000017500000000040013527063513015447 0ustar williamwilliam/* Small change to the standard carrays.i renaming the field to __getitem & __setitem for operator[] access */ %rename(__getitem) *::getitem; // the v=X[i] (get operator) %rename(__setitem) *::setitem; // the X[i]=v (set operator) %include <../carrays.i> swig-4.0.1/Lib/lua/_std_common.i0000644000175000017500000000477213527063513016324 0ustar williamwilliam/* ----------------------------------------------------------------------------- * _std_common.i * * std::helpers for LUA * ----------------------------------------------------------------------------- */ %include // the general exceptions /* The basic idea here, is instead of trying to feed SWIG all the horribly templated STL code, to give it a neatened version. These %defines cover some of the more common methods so the class declarations become just a set of %defines */ /* #define for basic container features note: I allow front(), back() & pop_back() to throw exceptions upon empty containers, rather than coredump (as we haven't defined the methods, we can use %extend to add with new features) */ %define %STD_CONTAINER_METHODS(CLASS,T) public: CLASS(); CLASS(const CLASS&); unsigned int size() const; unsigned int max_size() const; bool empty() const; void clear(); %extend { // the extra stuff which must be checked T front()const throw (std::out_of_range){ // only read front & back if (self->empty()) throw std::out_of_range("in "#CLASS"::front()"); return self->front(); } T back()const throw (std::out_of_range){ // not write to them if (self->empty()) throw std::out_of_range("in "#CLASS"::back()"); return self->back(); } } %enddef /* push/pop for front/back also note: front & back are read only methods, not used for writing */ %define %STD_FRONT_ACCESS_METHODS(CLASS,T) public: void push_front(const T& val); %extend { // must check this void pop_front() throw (std::out_of_range){ if (self->empty()) throw std::out_of_range("in "#CLASS"::pop_front()"); self->pop_back(); } } %enddef %define %STD_BACK_ACCESS_METHODS(CLASS,T) public: void push_back(const T& val); %extend { // must check this void pop_back() throw (std::out_of_range){ if (self->empty()) throw std::out_of_range("in "#CLASS"::pop_back()"); self->pop_back(); } } %enddef /* Random access methods */ %define %STD_RANDOM_ACCESS_METHODS(CLASS,T) %extend // this is a extra bit of SWIG code { // [] is replaced by __getitem__ & __setitem__ // simply throws a string, which causes a lua error T __getitem__(unsigned int idx) throw (std::out_of_range){ if (idx>=self->size()) throw std::out_of_range("in "#CLASS"::__getitem__()"); return (*self)[idx]; } void __setitem__(unsigned int idx,const T& val) throw (std::out_of_range){ if (idx>=self->size()) throw std::out_of_range("in "#CLASS"::__setitem__()"); (*self)[idx]=val; } }; %enddef swig-4.0.1/Lib/lua/std_pair.i0000644000175000017500000000104313527063513015614 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_pair.i * * std::pair typemaps for LUA * ----------------------------------------------------------------------------- */ %{ #include %} namespace std { template struct pair { typedef T first_type; typedef U second_type; pair(); pair(T first, U second); pair(const pair& other); T first; U second; }; template pair make_pair(const T& first, const U& second); } swig-4.0.1/Lib/lua/stl.i0000644000175000017500000000044313527063513014614 0ustar williamwilliam/* ----------------------------------------------------------------------------- * stl.i * ----------------------------------------------------------------------------- */ %include %include %include %include %include swig-4.0.1/Lib/lua/lua.swg0000644000175000017500000002133213527063513015143 0ustar williamwilliam/* ----------------------------------------------------------------------------- * lua.swg * * SWIG Configuration File for Lua. * This file is parsed by SWIG before reading any other interface file. * ----------------------------------------------------------------------------- */ /* ----------------------------------------------------------------------------- * includes * ----------------------------------------------------------------------------- */ %include /* The typemaps */ %include /* The runtime stuff */ %include /* Warnings for Lua keywords */ //%include /* ----------------------------------------------------------------------------- * constants typemaps * ----------------------------------------------------------------------------- */ // this basically adds to a table of constants %typemap(consttab) int, unsigned int, short, unsigned short, long, unsigned long, unsigned char, signed char, bool, enum SWIGTYPE {SWIG_LUA_CONSTTAB_INT("$symname", $value)} %typemap(consttab) float, double {SWIG_LUA_CONSTTAB_FLOAT("$symname", $value)} %typemap(consttab) long long, unsigned long long, signed long long {SWIG_LUA_CONSTTAB_FLOAT("$symname", $value)} %typemap(consttab) const long long&, const unsigned long long&, const signed long long& {SWIG_LUA_CONSTTAB_FLOAT("$symname", *$value)} %typemap(consttab) char *, const char *, char [], const char [] {SWIG_LUA_CONSTTAB_STRING("$symname", $value)} // note: char is treated as a separate special type // signed char & unsigned char are numbers %typemap(consttab) char {SWIG_LUA_CONSTTAB_CHAR("$symname", $value)} %typemap(consttab) long long, unsigned long long {SWIG_LUA_CONSTTAB_STRING("$symname", "$value")} %typemap(consttab) SWIGTYPE *, SWIGTYPE *const, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE [] { SWIG_LUA_CONSTTAB_POINTER("$symname",$value, $1_descriptor) } %typemap(consttab) SWIGTYPE { SWIG_LUA_CONSTTAB_POINTER("$symname",&$value, $&1_descriptor) } // member function pointers %typemap(consttab) SWIGTYPE (CLASS::*) { SWIG_LUA_CONSTTAB_BINARY("$symname", sizeof($type),&$value, $1_descriptor) } /* ----------------------------------------------------------------------------- * Overloaded operator support * ----------------------------------------------------------------------------- */ // lua calls the + operator '__add' // python likes to call it '__add__' // Assuming most SWIGers will probably use the __add__ if they extend their classes // we have two sets of renames // one to rename the operator+() to __add() // (this lets SWIG rename the operator overloads) // another is to rename __add__() to __add() // (this means that people who wrote SWIG code to do that add will also work) #ifdef __cplusplus // this is extra renaming for lua // not all operators are supported, so only those that are, are listed %rename(__add) *::operator+; %rename(__sub) *::operator-; %rename(__mul) *::operator*; %rename(__div) *::operator/; %rename(__unm) *::operator-(); %rename(__unm) *::operator-() const; %rename(__eq) *::operator==; %ignore *::operator!=; // note: Lua does not have a notequal operator // it just uses 'not (a==b)' %rename(__lt) *::operator<; %ignore *::operator>; // ditto less than vs greater than %rename(__le) *::operator<=; %ignore *::operator>=; // ditto less than vs greater than %ignore *::operator!; // does not support not %rename(__call) *::operator(); // the fn call operator // lua does not support overloading of: // logical/bitwise operators // assign operator // +=,-=,*=, etc // therefore ignoring them for now // it also doesn't support non class operators // eg friends or XX operator+(XX,XX) // also ignoring // note: some of these might be better to rename, but not doing that for now %ignore *::operator&&; %ignore operator&&; %ignore *::operator||; %ignore operator||; %ignore *::operator+=; %ignore *::operator-=; %ignore *::operator*=; %ignore *::operator/=; %ignore *::operator%=; %ignore *::operator++; %ignore *::operator--; %ignore *::operator=; // note: this might be better to rename to assign() or similar %ignore operator+; %ignore operator-; %ignore operator*; %ignore operator/; %ignore operator%; %ignore operator[]; %ignore operator>; %ignore operator>=; %ignore operator<; %ignore operator<=; %ignore operator==; %ignore operator!=; // renaming the python operators to be compatible with lua // this means that if a developer has written a fn __add__() // it will be used for the lua + %rename(__add) *::__add__; %rename(__sub) *::__sub__; %rename(__mul) *::__mul__; %rename(__div) *::__div__; %rename(__unm) *::__neg__; // lua calls unary minus,'unm' not 'neg' %rename(__tostring) *::__str__; // both map to __tostring %rename(__tostring) *::__repr__; // both map to __tostring %rename(__pow) *::__pow__; // lua power '^' operator %rename(__concat) *::__concat__; // lua concat '..' operator %rename(__eq) *::__eq__; %rename(__lt) *::__lt__; %rename(__le) *::__le__; %rename(__call) *::__call__; // the fn call operator() // the [] operator has two parts, the get & the set %rename(__getitem) *::__getitem__; // the v=X[i] (get operator) %rename(__setitem) *::__setitem__; // the X[i]=v (set operator) #endif /* ------------------------------------------------------------ * Exceptions * ------------------------------------------------------------ */ /* Confession: I don't really like C++ exceptions The python/lua ones are great, but C++ ones I don't like (mainly because I cannot get the stack trace out of it) Therefore I have not bothered to try doing much in this Therefore currently its just enough to get a few test cases running ok note: if you wish to throw anything related to std::exception use %include instead */ // number as number+error %typemap(throws) int,unsigned int,signed int, long,unsigned long,signed long, short,unsigned short,signed short, float,double, long long,unsigned long long, unsigned char, signed char, int&,unsigned int&,signed int&, long&,unsigned long&,signed long&, short&,unsigned short&,signed short&, float&,double&, long long&,unsigned long long&, unsigned char&, signed char& %{lua_pushnumber(L,(lua_Number)$1);SWIG_fail; %} %typemap(throws) bool,bool& %{lua_pushboolean(L,(int)($1==true));SWIG_fail; %} // enum as number+error %typemap(throws) enum SWIGTYPE %{lua_pushnumber(L,(lua_Number)(int)$1);SWIG_fail; %} // strings are just sent as errors %typemap(throws) char *, const char * %{lua_pushstring(L,$1);SWIG_fail;%} // char is changed to a string %typemap(throws) char %{lua_pushlstring(L,&$1,1);SWIG_fail;%} /* Throwing object is a serious problem: Assuming some code throws a 'FooBar' There are a few options: - return a pointer to it: but its unclear how long this will last for. - return a copy of it: but not all objects are copyable (see exception_partial_info in the test suite for a case where you cannot do this) - convert to a string & throw that it's not so useful, but it works (this is more lua like). The third option (though not nice) is used For a more useful solution: see std_except for more details */ // basic typemap for structs, classes, pointers & references // convert to string and error %typemap(throws) SWIGTYPE %{(void)$1; /* ignore it */ lua_pushfstring(L,"object exception:%s",SWIG_TypePrettyName($1_descriptor)); SWIG_fail;%} // code to make a copy of the object and return this // if you have a function which throws a FooBar & you want SWIG to return a copy of the object as its error // then use one of the below // %apply SWIGTYPE EXCEPTION_BY_VAL {FooBar}; // %apply SWIGTYPE& EXCEPTION_BY_VAL {FooBar&}; // note: need & twice %typemap(throws) SWIGTYPE EXCEPTION_BY_VAL %{SWIG_NewPointerObj(L,(void *)new $1_ltype(($1_ltype &) $1),$&1_descriptor,1); SWIG_fail;%} // similar for object reference // note: swig typemaps seem a little confused around here, therefore we use $basetype %typemap(throws) SWIGTYPE& EXCEPTION_BY_VAL %{SWIG_NewPointerObj(L,(void *)new $basetype($1),$1_descriptor,1); SWIG_fail;%} // note: no support for object pointers // its not clear how long the pointer is valid for, therefore not supporting it /* ----------------------------------------------------------------------------- * extras * ----------------------------------------------------------------------------- */ // this %define is to allow insertion of lua source code into the wrapper file #define %luacode %insert("luacode") /* ------------------------------ end lua.swg ------------------------------ */ swig-4.0.1/Lib/lua/std_string.i0000644000175000017500000000622413527063513016175 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_string.i * * std::string typemaps for LUA * ----------------------------------------------------------------------------- */ %{ #include %} /* Only std::string and const std::string& are typemapped they are converted to the Lua strings automatically std::string& and std::string* are not they must be explicitly managed (see below) eg. std::string test_value(std::string x) { return x; } can be used as s="hello world" s2=test_value(s) assert(s==s2) */ namespace std { %naturalvar string; /* Bug report #1526022: Lua strings and std::string can contain embedded zero bytes Therefore a standard out typemap should not be: lua_pushstring(L,$1.c_str()); but lua_pushlstring(L,$1.data(),$1.size()); Similarly for getting the string $1 = (char*)lua_tostring(L, $input); becomes $1.assign(lua_tostring(L,$input),lua_rawlen(L,$input)); Not using: lua_tolstring() as this is only found in Lua 5.1 & not 5.0.2 */ %typemap(in,checkfn="lua_isstring") string %{$1.assign(lua_tostring(L,$input),lua_rawlen(L,$input));%} %typemap(out) string %{ lua_pushlstring(L,$1.data(),$1.size()); SWIG_arg++;%} %typemap(in,checkfn="lua_isstring") const string& ($*1_ltype temp) %{temp.assign(lua_tostring(L,$input),lua_rawlen(L,$input)); $1=&temp;%} %typemap(out) const string& %{ lua_pushlstring(L,$1->data(),$1->size()); SWIG_arg++;%} // for throwing of any kind of string, string ref's and string pointers // we convert all to lua strings %typemap(throws) string, string&, const string& %{ lua_pushlstring(L,$1.data(),$1.size()); SWIG_fail;%} %typemap(throws) string*, const string* %{ lua_pushlstring(L,$1->data(),$1->size()); SWIG_fail;%} %typecheck(SWIG_TYPECHECK_STRING) string, const string& { $1 = lua_isstring(L,$input); } /* std::string& can be wrapped, but you must inform SWIG if it is in or out eg: void fn(std::string& str); Is this an in/out/inout value? Therefore you need the usual %apply (std::string& INOUT) {std::string& str}; or %apply std::string& INOUT {std::string& str}; typemaps to tell SWIG what to do. */ %typemap(in) string &INPUT=const string &; %typemap(in, numinputs=0) string &OUTPUT ($*1_ltype temp) %{ $1 = &temp; %} %typemap(argout) string &OUTPUT %{ lua_pushlstring(L,$1->data(),$1->size()); SWIG_arg++;%} %typemap(in) string &INOUT =const string &; %typemap(argout) string &INOUT = string &OUTPUT; /* A really cut down version of the string class This provides basic mapping of lua strings <-> std::string and little else (the std::string has a lot of unneeded functions anyway) note: no fn's taking the const string& as this is overloaded by the const char* version */ class string { public: string(); string(const char*); unsigned int size() const; unsigned int length() const; bool empty() const; // no support for operator[] const char* c_str()const; const char* data()const; // assign does not return a copy of this object // (no point in a scripting language) void assign(const char*); // no support for all the other features // it's probably better to do it in lua }; } swig-4.0.1/Lib/lua/luatypemaps.swg0000644000175000017500000003406013527063513016730 0ustar williamwilliam/* ----------------------------------------------------------------------------- * luatypemaps.swg * * basic typemaps for Lua. * ----------------------------------------------------------------------------- */ /* ----------------------------------------------------------------------------- * standard typemaps * ----------------------------------------------------------------------------- */ /* NEW LANGUAGE NOTE: the 'checkfn' param is something that I added for typemap(in) it is an optional fn call to check the type of the lua object the fn call must be of the form int checkfn(lua_State *L, int index); and return 1/0 depending upon if this is the correct type For the typemap(out), an additional SWIG_arg parameter must be incremented to reflect the number of values returned (normally SWIG_arg++; will do) */ // numbers %typemap(in,checkfn="lua_isnumber") int, short, long, signed char, float, double %{$1 = ($type)lua_tonumber(L, $input);%} // additional check for unsigned numbers, to not permit negative input %typemap(in,checkfn="lua_isnumber") unsigned int, unsigned short, unsigned long, unsigned char %{SWIG_contract_assert((lua_tonumber(L,$input)>=0),"number must not be negative") $1 = ($type)lua_tonumber(L, $input);%} %typemap(out) int,short,long, unsigned int,unsigned short,unsigned long, signed char,unsigned char, float,double %{ lua_pushnumber(L, (lua_Number) $1); SWIG_arg++;%} // we must also provide typemaps for primitives by const reference: // given a function: // int intbyref(const int& i); // SWIG assumes that this code will need a pointer to int to be passed in // (this might be ok for objects by const ref, but not for numeric primitives) // therefore we add a set of typemaps to fix this (for both in & out) %typemap(in,checkfn="lua_isnumber") const int&($basetype temp) %{ temp=($basetype)lua_tonumber(L,$input); $1=&temp;%} %typemap(in,checkfn="lua_isnumber") const unsigned int&($basetype temp) %{SWIG_contract_assert((lua_tonumber(L,$input)>=0),"number must not be negative") temp=($basetype)lua_tonumber(L,$input); $1=&temp;%} %typemap(out) const int&, const unsigned int& %{ lua_pushnumber(L, (lua_Number) *$1); SWIG_arg++;%} // for the other numbers we can just use an apply statement to cover them %apply const int & {const short&,const long&,const signed char&, const float&,const double&}; %apply const unsigned int & {const unsigned short&,const unsigned long&, const unsigned char&}; /* enums have to be handled slightly differently VC++ .net will not allow a cast from lua_Number(double) to enum directly. */ %typemap(in,checkfn="lua_isnumber") enum SWIGTYPE %{$1 = ($type)(int)lua_tonumber(L, $input);%} %typemap(out) enum SWIGTYPE %{ lua_pushnumber(L, (lua_Number)(int)($1)); SWIG_arg++;%} // and const refs %typemap(in,checkfn="lua_isnumber") const enum SWIGTYPE &($basetype temp) %{ temp=($basetype)(int)lua_tonumber(L,$input); $1=&temp;%} %typemap(in,checkfn="lua_isnumber") const enum SWIGTYPE &&($basetype temp) %{ temp=($basetype)(int)lua_tonumber(L,$input); $1=&temp;%} %typemap(out) const enum SWIGTYPE & %{ lua_pushnumber(L, (lua_Number) *$1); SWIG_arg++;%} %typemap(out) const enum SWIGTYPE && %{ lua_pushnumber(L, (lua_Number) *$1); SWIG_arg++;%} // boolean (which is a special type in lua) // note: lua_toboolean() returns 1 or 0 // note: 1 & 0 are not booleans in lua, only true & false %typemap(in,checkfn="lua_isboolean") bool %{$1 = (lua_toboolean(L, $input)!=0);%} %typemap(out) bool %{ lua_pushboolean(L,(int)($1!=0)); SWIG_arg++;%} // for const bool&, SWIG treats this as a const bool* so we must dereference it %typemap(in,checkfn="lua_isboolean") const bool& (bool temp) %{temp=(lua_toboolean(L, $input)!=0); $1=&temp;%} %typemap(out) const bool& %{ lua_pushboolean(L,(int)((*$1)!=0)); SWIG_arg++;%} // strings (char * and char[]) %fragment("SWIG_lua_isnilstring", "header") { SWIGINTERN int SWIG_lua_isnilstring(lua_State *L, int idx) { int ret = lua_isstring(L, idx); if (!ret) ret = lua_isnil(L, idx); return ret; } } %typemap(in,checkfn="SWIG_lua_isnilstring",fragment="SWIG_lua_isnilstring") const char *, char * %{$1 = ($ltype)lua_tostring(L, $input);%} %typemap(in,checkfn="SWIG_lua_isnilstring",fragment="SWIG_lua_isnilstring") const char[ANY], char[ANY] %{$1 = ($ltype)lua_tostring(L, $input);%} %typemap(out) const char *, char * %{ lua_pushstring(L,(const char *)$1); SWIG_arg++;%} %typemap(out) const char[ANY], char[ANY] %{ lua_pushstring(L,(const char *)$1); SWIG_arg++;%} // char's // currently treating chars as small strings, not as numbers // (however signed & unsigned char's are numbers...) %typemap(in,checkfn="SWIG_lua_isnilstring",fragment="SWIG_lua_isnilstring") char %{$1 = (lua_tostring(L, $input))[0];%} %typemap(out) char %{ lua_pushlstring(L, &$1, 1); SWIG_arg++;%} // by const ref %typemap(in,checkfn="SWIG_lua_isnilstring",fragment="SWIG_lua_isnilstring") const char& (char temp) %{temp = (lua_tostring(L, $input))[0]; $1=&temp;%} %typemap(out) const char& %{ lua_pushlstring(L, $1, 1); SWIG_arg++;%} // pointers and references // under SWIG rules, it is ok, to have a pass in a lua nil, // it should be converted to a SWIG NULL. // This will only be allowed for pointers & arrays, not refs or by value // the checkfn lua_isuserdata will only work for userdata // the checkfn SWIG_isptrtype will work for both userdata and nil %typemap(in,checkfn="SWIG_isptrtype") SWIGTYPE*,SWIGTYPE[] %{ if (!SWIG_IsOK(SWIG_ConvertPtr(L,$input,(void**)&$1,$descriptor,$disown))){ SWIG_fail_ptr("$symname",$argnum,$descriptor); } %} %typemap(in,checkfn="lua_isuserdata") SWIGTYPE& %{ if (!SWIG_IsOK(SWIG_ConvertPtr(L,$input,(void**)&$1,$descriptor,$disown))){ SWIG_fail_ptr("$symname",$argnum,$descriptor); } %} %typemap(in,checkfn="lua_isuserdata") SWIGTYPE&& %{ if (!SWIG_IsOK(SWIG_ConvertPtr(L,$input,(void**)&$1,$descriptor,$disown))){ SWIG_fail_ptr("$symname",$argnum,$descriptor); } %} // out is simple %typemap(out) SWIGTYPE*,SWIGTYPE& %{SWIG_NewPointerObj(L,$1,$descriptor,$owner); SWIG_arg++; %} %typemap(out) SWIGTYPE*,SWIGTYPE&& %{SWIG_NewPointerObj(L,$1,$descriptor,$owner); SWIG_arg++; %} // dynamic casts // this uses the SWIG_TypeDynamicCast() which relies on RTTI to find out what the pointer really is // the we return it as the correct type %typemap(out) SWIGTYPE *DYNAMIC, SWIGTYPE &DYNAMIC { swig_type_info *ty = SWIG_TypeDynamicCast($1_descriptor, (void **) &$1); SWIG_NewPointerObj(L,(void*)$1,ty,$owner); SWIG_arg++; } // passing objects by value // SWIG_ConvertPtr wants an object pointer (the $<ype argp) // then dereferences it to get the object %typemap(in,checkfn="lua_isuserdata") SWIGTYPE ($<ype argp) %{ if (!SWIG_IsOK(SWIG_ConvertPtr(L,$input,(void**)&argp,$&descriptor,0))){ SWIG_fail_ptr("$symname",$argnum,$&descriptor); } $1 = *argp; %} // Also needed for object ptrs by const ref // eg A* const& ref_pointer(A* const& a); // found in mixed_types.i %typemap(in,checkfn="SWIG_isptrtype") SWIGTYPE *const&($*ltype temp) %{temp=($*ltype)SWIG_MustGetPtr(L,$input,$*descriptor,0,$argnum,"$symname"); $1=($1_ltype)&temp;%} %typemap(out) SWIGTYPE *const& %{SWIG_NewPointerObj(L,*$1,$*descriptor,$owner); SWIG_arg++; %} // DISOWN-ing typemaps // if you have an object pointer which must be disowned, use this typemap // eg. for void destroy_foo(Foo* toDie); // use %apply SWIGTYPE* DISOWN {Foo* toDie}; // you could just use %delobject, but this is more flexible %typemap(in,checkfn="SWIG_isptrtype") SWIGTYPE* DISOWN,SWIGTYPE DISOWN[] %{ if (!SWIG_IsOK(SWIG_ConvertPtr(L,$input,(void**)&$1,$descriptor,SWIG_POINTER_DISOWN))){ SWIG_fail_ptr("$symname",$argnum,$descriptor); } %} // Primitive types--return by value // must make a new object, copy the data & return the new object // Note: the brackets are {...} and not %{..%}, because we want them to be included in the wrapper // this is because typemap(out) does not support local variables, like in typemap(in) does // and we need the $&1_ltype resultptr; to be declared #ifdef __cplusplus %typemap(out) SWIGTYPE { $&1_ltype resultptr = new $1_ltype((const $1_ltype &) $1); SWIG_NewPointerObj(L,(void *) resultptr,$&1_descriptor,1); SWIG_arg++; } #else %typemap(out) SWIGTYPE { $&1_ltype resultptr; resultptr = ($&1_ltype) malloc(sizeof($1_type)); memmove(resultptr, &$1, sizeof($1_type)); SWIG_NewPointerObj(L,(void *) resultptr,$&1_descriptor,1); SWIG_arg++; } #endif // member function pointer // a member fn ptr is not 4 bytes like a normal pointer, but 8 bytes (at least on mingw) // so the standard wrapping cannot be done // nor can you cast a member function pointer to a void* (obviously) // therefore a special wrapping functions SWIG_ConvertMember() & SWIG_NewMemberObj() were written %typemap(in,checkfn="lua_isuserdata") SWIGTYPE (CLASS::*) %{ if (!SWIG_IsOK(SWIG_ConvertMember(L,$input,(void*)(&$1),sizeof($type),$descriptor))) SWIG_fail_ptr("$symname",$argnum,$descriptor); %} %typemap(out) SWIGTYPE (CLASS::*) %{ SWIG_NewMemberObj(L,(void*)(&$1),sizeof($type),$descriptor); SWIG_arg++; %} // void (must be empty without the SWIG_arg++) %typemap(out) void ""; /* void* is a special case A function void fn(void*) should take any kind of pointer as a parameter (just like C/C++ does) but if its an output, then it should be wrapped like any other SWIG object (using default typemap) */ %typemap(in,checkfn="SWIG_isptrtype") void* %{$1=($1_ltype)SWIG_MustGetPtr(L,$input,0,0,$argnum,"$symname");%} /* long long is another special case: as lua only supports one numeric type (lua_Number), we will just cast it to that & accept the loss of precision. An alternative solution would be a long long struct or class with the relevant operators. */ %apply long {long long, signed long long, unsigned long long}; %apply const long& {const long long&, const signed long long&, const unsigned long long&}; /* It is possible to also pass a lua_State* into a function, so void fn(int a, float b, lua_State* s) is wrappable as > fn(1,4.3) -- note: the state is implicitly passed in */ %typemap(in, numinputs=0) lua_State* %{$1 = L;%} /* ----------------------------------------------------------------------------- * typecheck rules * ----------------------------------------------------------------------------- */ /* These are needed for the overloaded functions These define the detection routines which will spot what parameters match which function */ // unfortunately lua only considers one type of number // so all numbers (int,float,double) match // you could add an advanced fn to get type & check if its integral %typecheck(SWIG_TYPECHECK_INTEGER) int, short, long, unsigned int, unsigned short, unsigned long, signed char, unsigned char, long long, unsigned long long, signed long long, const int &, const short &, const long &, const unsigned int &, const unsigned short &, const unsigned long &, const signed char&, const unsigned char&, const long long &, const unsigned long long &, enum SWIGTYPE, const enum SWIGTYPE&, const enum SWIGTYPE &&, float, double, const float &, const double& { $1 = lua_isnumber(L,$input); } %typecheck(SWIG_TYPECHECK_BOOL) bool, const bool & { $1 = lua_isboolean(L,$input); } // special check for a char (string of length 1) %typecheck(SWIG_TYPECHECK_CHAR,fragment="SWIG_lua_isnilstring") char, const char& { $1 = SWIG_lua_isnilstring(L,$input) && (lua_rawlen(L,$input)==1); } %typecheck(SWIG_TYPECHECK_STRING,fragment="SWIG_lua_isnilstring") char *, char[] { $1 = SWIG_lua_isnilstring(L,$input); } %typecheck(SWIG_TYPECHECK_POINTER) SWIGTYPE *, SWIGTYPE [] { void *ptr; if (SWIG_isptrtype(L,$input)==0 || SWIG_ConvertPtr(L,$input, (void **) &ptr, $1_descriptor, 0)) { $1 = 0; } else { $1 = 1; } } %typecheck(SWIG_TYPECHECK_POINTER) SWIGTYPE & { void *ptr; if (lua_isuserdata(L,$input)==0 || SWIG_ConvertPtr(L,$input, (void **) &ptr, $1_descriptor, SWIG_POINTER_NO_NULL)) { $1 = 0; } else { $1 = 1; } } %typecheck(SWIG_TYPECHECK_POINTER) SWIGTYPE && { void *ptr; if (lua_isuserdata(L,$input)==0 || SWIG_ConvertPtr(L,$input, (void **) &ptr, $1_descriptor, SWIG_POINTER_NO_NULL)) { $1 = 0; } else { $1 = 1; } } %typecheck(SWIG_TYPECHECK_POINTER) SWIGTYPE { void *ptr; if (lua_isuserdata(L,$input)==0 || SWIG_ConvertPtr(L,$input, (void **) &ptr, $&1_descriptor, SWIG_POINTER_NO_NULL)) { $1 = 0; } else { $1 = 1; } } %typecheck(SWIG_TYPECHECK_VOIDPTR) void * { void *ptr; if (SWIG_isptrtype(L,$input)==0 || SWIG_ConvertPtr(L,$input, (void **) &ptr, 0, 0)) { $1 = 0; } else { $1 = 1; } } // Also needed for object pointers by const ref // eg const A* ref_pointer(A* const& a); // found in mixed_types.i %typecheck(SWIG_TYPECHECK_POINTER) SWIGTYPE *const& { void *ptr; if (SWIG_isptrtype(L,$input)==0 || SWIG_ConvertPtr(L,$input, (void **) &ptr, $*descriptor, 0)) { $1 = 0; } else { $1 = 1; } } /* ----------------------------------------------------------------------------- * Others * ----------------------------------------------------------------------------- */ // Array reference typemaps %apply SWIGTYPE & { SWIGTYPE ((&)[ANY]) } %apply SWIGTYPE && { SWIGTYPE ((&&)[ANY]) } /* const pointers */ %apply SWIGTYPE * { SWIGTYPE *const } %apply SWIGTYPE (CLASS::*) { SWIGTYPE (CLASS::*const) } %apply SWIGTYPE & { SWIGTYPE (CLASS::*const&) } // size_t (which is just a unsigned long) %apply unsigned long { size_t }; %apply const unsigned long & { const size_t & }; /* ----------------------------------------------------------------------------- * Specials * ----------------------------------------------------------------------------- */ // swig::LANGUAGE_OBJ was added to allow containers of native objects // however its rather difficult to do this in lua, as you cannot hold pointers // to native objects (they are held in the interpreter) // therefore for now: just ignoring this feature #ifdef __cplusplus %ignore swig::LANGUAGE_OBJ; //%inline %{ %{ namespace swig { typedef struct{} LANGUAGE_OBJ; } %} #endif // __cplusplus swig-4.0.1/Lib/lua/std_map.i0000644000175000017500000000374713527063513015453 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_map.i * * SWIG typemaps for std::map * ----------------------------------------------------------------------------- */ %include // ------------------------------------------------------------------------ // std::map // ------------------------------------------------------------------------ %{ #include #include #include %} // exported class namespace std { template > class map { // add typemaps here public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef K key_type; typedef T mapped_type; typedef std::pair< const K, T > value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; map(); map(const map& other); unsigned int size() const; bool empty() const; void clear(); %extend { const T& get(const K& key) throw (std::out_of_range) { std::map< K, T, C >::iterator i = self->find(key); if (i != self->end()) return i->second; else throw std::out_of_range("key not found"); } void set(const K& key, const T& x) { (*self)[key] = x; } void del(const K& key) throw (std::out_of_range) { std::map< K, T, C >::iterator i = self->find(key); if (i != self->end()) self->erase(i); else throw std::out_of_range("key not found"); } bool has_key(const K& key) { std::map< K, T, C >::iterator i = self->find(key); return i != self->end(); } } }; } swig-4.0.1/Lib/lua/factory.i0000644000175000017500000000100713527063513015456 0ustar williamwilliam/* A modification of factory.swg from the generic UTL library. */ %include %define %_factory_dispatch(Type) if (!dcast) { Type *dobj = dynamic_cast($1); if (dobj) { dcast = 1; SWIG_NewPointerObj(L, dobj, $descriptor(Type *), $owner); SWIG_arg++; } }%enddef %define %factory(Method,Types...) %typemap(out) Method { int dcast = 0; %formacro(%_factory_dispatch, Types) if (!dcast) { SWIG_NewPointerObj(L, $1, $descriptor, $owner); SWIG_arg++; } }%enddef swig-4.0.1/Lib/csharp/0000755000175000017500000000000013527063513014336 5ustar williamwilliamswig-4.0.1/Lib/csharp/std_complex.i0000644000175000017500000000525013527063513017033 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_complex.i * * Typemaps for handling std::complex and std::complex as a .NET * System.Numerics.Complex type. Requires .NET 4 minimum. * ----------------------------------------------------------------------------- */ %{ #include %} %fragment("SwigSystemNumericsComplex", "header") { extern "C" { // Identical to the layout of System.Numerics.Complex, but does assume that it is // LayoutKind.Sequential on the managed side struct SwigSystemNumericsComplex { double real; double imag; }; } SWIGINTERN SwigSystemNumericsComplex SwigCreateSystemNumericsComplex(double real, double imag) { SwigSystemNumericsComplex cpx; cpx.real = real; cpx.imag = imag; return cpx; } } namespace std { %naturalvar complex; template class complex { public: complex(T re = T(), T im = T()); }; } %define SWIG_COMPLEX_TYPEMAPS(T) %typemap(ctype, fragment="SwigSystemNumericsComplex") std::complex, const std::complex & "SwigSystemNumericsComplex" %typemap(imtype) std::complex, const std::complex & "System.Numerics.Complex" %typemap(cstype) std::complex, const std::complex & "System.Numerics.Complex" %typemap(in) std::complex %{$1 = std::complex< double >($input.real, $input.imag);%} %typemap(in) const std::complex &($*1_ltype temp) %{temp = std::complex< T >((T)$input.real, (T)$input.imag); $1 = &temp;%} %typemap(out, null="SwigCreateSystemNumericsComplex(0.0, 0.0)") std::complex %{$result = SwigCreateSystemNumericsComplex($1.real(), $1.imag());%} %typemap(out, null="SwigCreateSystemNumericsComplex(0.0, 0.0)") const std::complex & %{$result = SwigCreateSystemNumericsComplex($1->real(), $1->imag());%} %typemap(cstype) std::complex, const std::complex & "System.Numerics.Complex" %typemap(csin) std::complex, const std::complex & "$csinput" %typemap(csout, excode=SWIGEXCODE) std::complex, const std::complex & { System.Numerics.Complex ret = $imcall;$excode return ret; } %typemap(csvarin, excode=SWIGEXCODE2) const std::complex & %{ set { $imcall;$excode } %} %typemap(csvarout, excode=SWIGEXCODE2) const std::complex & %{ get { System.Numerics.Complex ret = $imcall;$excode return ret; } %} %template() std::complex; %enddef // By default, typemaps for both std::complex and std::complex // are defined, but one of them can be disabled by predefining the // corresponding symbol before including this file. #ifndef SWIG_NO_STD_COMPLEX_DOUBLE SWIG_COMPLEX_TYPEMAPS(double) #endif #ifndef SWIG_NO_STD_COMPLEX_FLOAT SWIG_COMPLEX_TYPEMAPS(float) #endif swig-4.0.1/Lib/csharp/std_deque.i0000644000175000017500000000003413527063513016462 0ustar williamwilliam%include swig-4.0.1/Lib/csharp/director.swg0000644000175000017500000000236013527063513016674 0ustar williamwilliam/* ----------------------------------------------------------------------------- * director.swg * * This file contains support for director classes so that C# proxy * methods can be called from C++. * ----------------------------------------------------------------------------- */ #if defined(DEBUG_DIRECTOR_OWNED) #include #endif #include #include namespace Swig { /* Director base class - not currently used in C# directors */ class Director { }; /* Base class for director exceptions */ class DirectorException : public std::exception { protected: std::string swig_msg; public: DirectorException(const char *msg) : swig_msg(msg) { } DirectorException(const std::string &msg) : swig_msg(msg) { } virtual ~DirectorException() throw() { } const char *what() const throw() { return swig_msg.c_str(); } }; /* Pure virtual method exception */ class DirectorPureVirtualException : public DirectorException { public: DirectorPureVirtualException(const char *msg) : DirectorException(std::string("Attempt to invoke pure virtual method ") + msg) { } static void raise(const char *msg) { throw DirectorPureVirtualException(msg); } }; } swig-4.0.1/Lib/csharp/wchar.i0000644000175000017500000000705113527063513015617 0ustar williamwilliam/* ----------------------------------------------------------------------------- * wchar.i * * Typemaps for the wchar_t type * These are mapped to a C# String and are passed around by value. * * Support code for wide strings can be turned off by defining SWIG_CSHARP_NO_WSTRING_HELPER * * ----------------------------------------------------------------------------- */ #if !defined(SWIG_CSHARP_NO_WSTRING_HELPER) #if !defined(SWIG_CSHARP_WSTRING_HELPER_) #define SWIG_CSHARP_WSTRING_HELPER_ %insert(runtime) %{ /* Callback for returning strings to C# without leaking memory */ typedef void * (SWIGSTDCALL* SWIG_CSharpWStringHelperCallback)(const wchar_t *); static SWIG_CSharpWStringHelperCallback SWIG_csharp_wstring_callback = NULL; %} %pragma(csharp) imclasscode=%{ protected class SWIGWStringHelper { [return: global::System.Runtime.InteropServices.MarshalAs(global::System.Runtime.InteropServices.UnmanagedType.LPWStr)] public delegate string SWIGWStringDelegate(global::System.IntPtr message); static SWIGWStringDelegate wstringDelegate = new SWIGWStringDelegate(CreateWString); [global::System.Runtime.InteropServices.DllImport("$dllimport", EntryPoint="SWIGRegisterWStringCallback_$module")] public static extern void SWIGRegisterWStringCallback_$module(SWIGWStringDelegate wstringDelegate); static string CreateWString([global::System.Runtime.InteropServices.MarshalAs(global::System.Runtime.InteropServices.UnmanagedType.LPWStr)]global::System.IntPtr cString) { return global::System.Runtime.InteropServices.Marshal.PtrToStringUni(cString); } static SWIGWStringHelper() { SWIGRegisterWStringCallback_$module(wstringDelegate); } } static protected SWIGWStringHelper swigWStringHelper = new SWIGWStringHelper(); %} %insert(runtime) %{ #ifdef __cplusplus extern "C" #endif SWIGEXPORT void SWIGSTDCALL SWIGRegisterWStringCallback_$module(SWIG_CSharpWStringHelperCallback callback) { SWIG_csharp_wstring_callback = callback; } %} #endif // SWIG_CSHARP_WSTRING_HELPER_ #endif // SWIG_CSHARP_NO_WSTRING_HELPER // wchar_t %typemap(ctype) wchar_t "wchar_t" %typemap(imtype) wchar_t "char" // Requires adding CharSet=CharSet.Unicode to the DllImport to correctly marshal Unicode characters %typemap(cstype) wchar_t "char" %typemap(csin) wchar_t "$csinput" %typemap(csout, excode=SWIGEXCODE) wchar_t { char ret = $imcall;$excode return ret; } %typemap(csvarin, excode=SWIGEXCODE2) wchar_t %{ set { $imcall;$excode } %} %typemap(csvarout, excode=SWIGEXCODE2) wchar_t %{ get { char ret = $imcall;$excode return ret; } %} %typemap(in) wchar_t %{ $1 = ($1_ltype)$input; %} %typemap(out) wchar_t %{ $result = (wchar_t)$1; %} %typemap(typecheck) wchar_t = char; // wchar_t * %typemap(ctype) wchar_t * "wchar_t *" %typemap(imtype, inattributes="[global::System.Runtime.InteropServices.MarshalAs(global::System.Runtime.InteropServices.UnmanagedType.LPWStr)]", out="global::System.IntPtr" ) wchar_t * "string" %typemap(cstype) wchar_t * "string" %typemap(csin) wchar_t * "$csinput" %typemap(csout, excode=SWIGEXCODE) wchar_t * { string ret = global::System.Runtime.InteropServices.Marshal.PtrToStringUni($imcall);$excode return ret; } %typemap(csvarin, excode=SWIGEXCODE2) wchar_t * %{ set { $imcall;$excode } %} %typemap(csvarout, excode=SWIGEXCODE2) wchar_t * %{ get { string ret = $imcall;$excode return ret; } %} %typemap(in) wchar_t * %{ $1 = ($1_ltype)$input; %} %typemap(out) wchar_t * %{ $result = (wchar_t *)$1; %} %typemap(typecheck) wchar_t * = char *; swig-4.0.1/Lib/csharp/std_shared_ptr.i0000644000175000017500000000010413527063513017510 0ustar williamwilliam#define SWIG_SHARED_PTR_NAMESPACE std %include swig-4.0.1/Lib/csharp/std_vector.i0000644000175000017500000003505213527063513016671 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_vector.i * * SWIG typemaps for std::vector * C# implementation * The C# wrapper is made to look and feel like a C# System.Collections.Generic.List<> collection. * * Note that IEnumerable<> is implemented in the proxy class which is useful for using LINQ with * C++ std::vector wrappers. The IList<> interface is also implemented to provide enhanced functionality * whenever we are confident that the required C++ operator== is available. This is the case for when * T is a primitive type or a pointer. If T does define an operator==, then use the SWIG_STD_VECTOR_ENHANCED * macro to obtain this enhanced functionality, for example: * * SWIG_STD_VECTOR_ENHANCED(SomeNamespace::Klass) * %template(VectKlass) std::vector; * ----------------------------------------------------------------------------- */ %include // MACRO for use within the std::vector class body %define SWIG_STD_VECTOR_MINIMUM_INTERNAL(CSINTERFACE, CONST_REFERENCE, CTYPE...) %typemap(csinterfaces) std::vector< CTYPE > "global::System.IDisposable, global::System.Collections.IEnumerable, global::System.Collections.Generic.CSINTERFACE<$typemap(cstype, CTYPE)>\n"; %proxycode %{ public $csclassname(global::System.Collections.IEnumerable c) : this() { if (c == null) throw new global::System.ArgumentNullException("c"); foreach ($typemap(cstype, CTYPE) element in c) { this.Add(element); } } public $csclassname(global::System.Collections.Generic.IEnumerable<$typemap(cstype, CTYPE)> c) : this() { if (c == null) throw new global::System.ArgumentNullException("c"); foreach ($typemap(cstype, CTYPE) element in c) { this.Add(element); } } public bool IsFixedSize { get { return false; } } public bool IsReadOnly { get { return false; } } public $typemap(cstype, CTYPE) this[int index] { get { return getitem(index); } set { setitem(index, value); } } public int Capacity { get { return (int)capacity(); } set { if (value < size()) throw new global::System.ArgumentOutOfRangeException("Capacity"); reserve(($typemap(cstype, size_t))value); } } public int Count { get { return (int)size(); } } public bool IsSynchronized { get { return false; } } public void CopyTo($typemap(cstype, CTYPE)[] array) { CopyTo(0, array, 0, this.Count); } public void CopyTo($typemap(cstype, CTYPE)[] array, int arrayIndex) { CopyTo(0, array, arrayIndex, this.Count); } public void CopyTo(int index, $typemap(cstype, CTYPE)[] array, int arrayIndex, int count) { if (array == null) throw new global::System.ArgumentNullException("array"); if (index < 0) throw new global::System.ArgumentOutOfRangeException("index", "Value is less than zero"); if (arrayIndex < 0) throw new global::System.ArgumentOutOfRangeException("arrayIndex", "Value is less than zero"); if (count < 0) throw new global::System.ArgumentOutOfRangeException("count", "Value is less than zero"); if (array.Rank > 1) throw new global::System.ArgumentException("Multi dimensional array.", "array"); if (index+count > this.Count || arrayIndex+count > array.Length) throw new global::System.ArgumentException("Number of elements to copy is too large."); for (int i=0; i global::System.Collections.Generic.IEnumerable<$typemap(cstype, CTYPE)>.GetEnumerator() { return new $csclassnameEnumerator(this); } global::System.Collections.IEnumerator global::System.Collections.IEnumerable.GetEnumerator() { return new $csclassnameEnumerator(this); } public $csclassnameEnumerator GetEnumerator() { return new $csclassnameEnumerator(this); } // Type-safe enumerator /// Note that the IEnumerator documentation requires an InvalidOperationException to be thrown /// whenever the collection is modified. This has been done for changes in the size of the /// collection but not when one of the elements of the collection is modified as it is a bit /// tricky to detect unmanaged code that modifies the collection under our feet. public sealed class $csclassnameEnumerator : global::System.Collections.IEnumerator , global::System.Collections.Generic.IEnumerator<$typemap(cstype, CTYPE)> { private $csclassname collectionRef; private int currentIndex; private object currentObject; private int currentSize; public $csclassnameEnumerator($csclassname collection) { collectionRef = collection; currentIndex = -1; currentObject = null; currentSize = collectionRef.Count; } // Type-safe iterator Current public $typemap(cstype, CTYPE) Current { get { if (currentIndex == -1) throw new global::System.InvalidOperationException("Enumeration not started."); if (currentIndex > currentSize - 1) throw new global::System.InvalidOperationException("Enumeration finished."); if (currentObject == null) throw new global::System.InvalidOperationException("Collection modified."); return ($typemap(cstype, CTYPE))currentObject; } } // Type-unsafe IEnumerator.Current object global::System.Collections.IEnumerator.Current { get { return Current; } } public bool MoveNext() { int size = collectionRef.Count; bool moveOkay = (currentIndex+1 < size) && (size == currentSize); if (moveOkay) { currentIndex++; currentObject = collectionRef[currentIndex]; } else { currentObject = null; } return moveOkay; } public void Reset() { currentIndex = -1; currentObject = null; if (collectionRef.Count != currentSize) { throw new global::System.InvalidOperationException("Collection modified."); } } public void Dispose() { currentIndex = -1; currentObject = null; } } %} public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef CTYPE value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef CONST_REFERENCE const_reference; %rename(Clear) clear; void clear(); %rename(Add) push_back; void push_back(CTYPE const& x); size_type size() const; size_type capacity() const; void reserve(size_type n); %newobject GetRange(int index, int count); %newobject Repeat(CTYPE const& value, int count); vector(); vector(const vector &other); %extend { vector(int capacity) throw (std::out_of_range) { std::vector< CTYPE >* pv = 0; if (capacity >= 0) { pv = new std::vector< CTYPE >(); pv->reserve(capacity); } else { throw std::out_of_range("capacity"); } return pv; } CTYPE getitemcopy(int index) throw (std::out_of_range) { if (index>=0 && index<(int)$self->size()) return (*$self)[index]; else throw std::out_of_range("index"); } CONST_REFERENCE getitem(int index) throw (std::out_of_range) { if (index>=0 && index<(int)$self->size()) return (*$self)[index]; else throw std::out_of_range("index"); } void setitem(int index, CTYPE const& val) throw (std::out_of_range) { if (index>=0 && index<(int)$self->size()) (*$self)[index] = val; else throw std::out_of_range("index"); } // Takes a deep copy of the elements unlike ArrayList.AddRange void AddRange(const std::vector< CTYPE >& values) { $self->insert($self->end(), values.begin(), values.end()); } // Takes a deep copy of the elements unlike ArrayList.GetRange std::vector< CTYPE > *GetRange(int index, int count) throw (std::out_of_range, std::invalid_argument) { if (index < 0) throw std::out_of_range("index"); if (count < 0) throw std::out_of_range("count"); if (index >= (int)$self->size()+1 || index+count > (int)$self->size()) throw std::invalid_argument("invalid range"); return new std::vector< CTYPE >($self->begin()+index, $self->begin()+index+count); } void Insert(int index, CTYPE const& x) throw (std::out_of_range) { if (index>=0 && index<(int)$self->size()+1) $self->insert($self->begin()+index, x); else throw std::out_of_range("index"); } // Takes a deep copy of the elements unlike ArrayList.InsertRange void InsertRange(int index, const std::vector< CTYPE >& values) throw (std::out_of_range) { if (index>=0 && index<(int)$self->size()+1) $self->insert($self->begin()+index, values.begin(), values.end()); else throw std::out_of_range("index"); } void RemoveAt(int index) throw (std::out_of_range) { if (index>=0 && index<(int)$self->size()) $self->erase($self->begin() + index); else throw std::out_of_range("index"); } void RemoveRange(int index, int count) throw (std::out_of_range, std::invalid_argument) { if (index < 0) throw std::out_of_range("index"); if (count < 0) throw std::out_of_range("count"); if (index >= (int)$self->size()+1 || index+count > (int)$self->size()) throw std::invalid_argument("invalid range"); $self->erase($self->begin()+index, $self->begin()+index+count); } static std::vector< CTYPE > *Repeat(CTYPE const& value, int count) throw (std::out_of_range) { if (count < 0) throw std::out_of_range("count"); return new std::vector< CTYPE >(count, value); } void Reverse() { std::reverse($self->begin(), $self->end()); } void Reverse(int index, int count) throw (std::out_of_range, std::invalid_argument) { if (index < 0) throw std::out_of_range("index"); if (count < 0) throw std::out_of_range("count"); if (index >= (int)$self->size()+1 || index+count > (int)$self->size()) throw std::invalid_argument("invalid range"); std::reverse($self->begin()+index, $self->begin()+index+count); } // Takes a deep copy of the elements unlike ArrayList.SetRange void SetRange(int index, const std::vector< CTYPE >& values) throw (std::out_of_range) { if (index < 0) throw std::out_of_range("index"); if (index+values.size() > $self->size()) throw std::out_of_range("index"); std::copy(values.begin(), values.end(), $self->begin()+index); } } %enddef // Extra methods added to the collection class if operator== is defined for the class being wrapped // The class will then implement IList<>, which adds extra functionality %define SWIG_STD_VECTOR_EXTRA_OP_EQUALS_EQUALS(CTYPE...) %extend { bool Contains(CTYPE const& value) { return std::find($self->begin(), $self->end(), value) != $self->end(); } int IndexOf(CTYPE const& value) { int index = -1; std::vector< CTYPE >::iterator it = std::find($self->begin(), $self->end(), value); if (it != $self->end()) index = (int)(it - $self->begin()); return index; } int LastIndexOf(CTYPE const& value) { int index = -1; std::vector< CTYPE >::reverse_iterator rit = std::find($self->rbegin(), $self->rend(), value); if (rit != $self->rend()) index = (int)($self->rend() - 1 - rit); return index; } bool Remove(CTYPE const& value) { std::vector< CTYPE >::iterator it = std::find($self->begin(), $self->end(), value); if (it != $self->end()) { $self->erase(it); return true; } return false; } } %enddef // Macros for std::vector class specializations/enhancements %define SWIG_STD_VECTOR_ENHANCED(CTYPE...) namespace std { template<> class vector< CTYPE > { SWIG_STD_VECTOR_MINIMUM_INTERNAL(IList, const value_type&, %arg(CTYPE)) SWIG_STD_VECTOR_EXTRA_OP_EQUALS_EQUALS(CTYPE) }; } %enddef // Legacy macros %define SWIG_STD_VECTOR_SPECIALIZE(CSTYPE, CTYPE...) #warning SWIG_STD_VECTOR_SPECIALIZE macro deprecated, please see csharp/std_vector.i and switch to SWIG_STD_VECTOR_ENHANCED SWIG_STD_VECTOR_ENHANCED(CTYPE) %enddef %define SWIG_STD_VECTOR_SPECIALIZE_MINIMUM(CSTYPE, CTYPE...) #warning SWIG_STD_VECTOR_SPECIALIZE_MINIMUM macro deprecated, it is no longer required %enddef %{ #include #include #include %} %csmethodmodifiers std::vector::getitemcopy "private" %csmethodmodifiers std::vector::getitem "private" %csmethodmodifiers std::vector::setitem "private" %csmethodmodifiers std::vector::size "private" %csmethodmodifiers std::vector::capacity "private" %csmethodmodifiers std::vector::reserve "private" namespace std { // primary (unspecialized) class template for std::vector // does not require operator== to be defined template class vector { SWIG_STD_VECTOR_MINIMUM_INTERNAL(IEnumerable, const value_type&, T) }; // specialization for pointers template class vector { SWIG_STD_VECTOR_MINIMUM_INTERNAL(IList, const value_type&, T *) SWIG_STD_VECTOR_EXTRA_OP_EQUALS_EQUALS(T *) }; // bool is specialized in the C++ standard - const_reference in particular template<> class vector { SWIG_STD_VECTOR_MINIMUM_INTERNAL(IList, bool, bool) SWIG_STD_VECTOR_EXTRA_OP_EQUALS_EQUALS(bool) }; } // template specializations for std::vector // these provide extra collections methods as operator== is defined SWIG_STD_VECTOR_ENHANCED(char) SWIG_STD_VECTOR_ENHANCED(signed char) SWIG_STD_VECTOR_ENHANCED(unsigned char) SWIG_STD_VECTOR_ENHANCED(short) SWIG_STD_VECTOR_ENHANCED(unsigned short) SWIG_STD_VECTOR_ENHANCED(int) SWIG_STD_VECTOR_ENHANCED(unsigned int) SWIG_STD_VECTOR_ENHANCED(long) SWIG_STD_VECTOR_ENHANCED(unsigned long) SWIG_STD_VECTOR_ENHANCED(long long) SWIG_STD_VECTOR_ENHANCED(unsigned long long) SWIG_STD_VECTOR_ENHANCED(float) SWIG_STD_VECTOR_ENHANCED(double) SWIG_STD_VECTOR_ENHANCED(std::string) // also requires a %include SWIG_STD_VECTOR_ENHANCED(std::wstring) // also requires a %include swig-4.0.1/Lib/csharp/csharpkw.swg0000644000175000017500000000350213527063513016702 0ustar williamwilliam#ifndef CSHARP_CSHARPKW_SWG_ #define CSHARP_CSHARPKW_SWG_ /* Warnings for C# keywords */ #define CSHARPKW(x) %keywordwarn("'" `x` "' is a C# keyword, renaming to '" `x` "_'",rename="%s_") `x` #define CSHARPCLASSKW(x) %keywordwarn("'" `x` "' is a special method name used in the C# wrapper classes, class renamed to '" `x` "_'",%$isclass,rename="%s_") `x` /* from http://www.jaggersoft.com/csharp_grammar.html#1.7%20Keywords */ CSHARPKW(abstract); CSHARPKW(as); CSHARPKW(base); CSHARPKW(bool); CSHARPKW(break); CSHARPKW(byte); CSHARPKW(case); CSHARPKW(catch); CSHARPKW(char); CSHARPKW(checked); CSHARPKW(class); CSHARPKW(const); CSHARPKW(continue); CSHARPKW(decimal); CSHARPKW(default); CSHARPKW(delegate); CSHARPKW(do); CSHARPKW(double); CSHARPKW(else); CSHARPKW(enum); CSHARPKW(event); CSHARPKW(explicit); CSHARPKW(extern); CSHARPKW(false); CSHARPKW(finally); CSHARPKW(fixed); CSHARPKW(float); CSHARPKW(for); CSHARPKW(foreach); CSHARPKW(goto); CSHARPKW(if); CSHARPKW(implicit); CSHARPKW(in); CSHARPKW(int); CSHARPKW(interface); CSHARPKW(internal); CSHARPKW(is); CSHARPKW(lock); CSHARPKW(long); CSHARPKW(namespace); CSHARPKW(new); CSHARPKW(null); CSHARPKW(object); CSHARPKW(operator); CSHARPKW(out); CSHARPKW(override); CSHARPKW(params); CSHARPKW(private); CSHARPKW(protected); CSHARPKW(public); CSHARPKW(readonly); CSHARPKW(ref); CSHARPKW(return); CSHARPKW(sbyte); CSHARPKW(sealed); CSHARPKW(short); CSHARPKW(sizeof); CSHARPKW(stackalloc); CSHARPKW(static); CSHARPKW(struct); CSHARPKW(string); CSHARPKW(switch); CSHARPKW(this); CSHARPKW(throw); CSHARPKW(true); CSHARPKW(try); CSHARPKW(typeof); CSHARPKW(uint); CSHARPKW(ulong); CSHARPKW(unchecked); CSHARPKW(unsafe); CSHARPKW(ushort); CSHARPKW(using); CSHARPKW(virtual); CSHARPKW(void); CSHARPKW(volatile); CSHARPKW(while); CSHARPCLASSKW(delete); #undef CSHARPKW #endif //CSHARP_CSHARPKW_SWG_ swig-4.0.1/Lib/csharp/std_set.i0000644000175000017500000002301713527063513016160 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_set.i * * SWIG typemaps for std::set. * * Note that ISet<> used here requires .NET 4 or later. * * The C# wrapper implements ISet<> interface and shares performance * characteristics of C# System.Collections.Generic.SortedSet<> class, but * doesn't provide quite all of its methods. * ----------------------------------------------------------------------------- */ %{ #include #include #include %} %csmethodmodifiers std::set::size "private" %csmethodmodifiers std::set::getitem "private" %csmethodmodifiers std::set::create_iterator_begin "private" %csmethodmodifiers std::set::get_next "private" %csmethodmodifiers std::set::destroy_iterator "private" namespace std { // TODO: Add support for comparator and allocator template parameters. template class set { %typemap(csinterfaces) std::set "global::System.IDisposable, global::System.Collections.Generic.ISet<$typemap(cstype, T)>\n"; %proxycode %{ void global::System.Collections.Generic.ICollection<$typemap(cstype, T)>.Add($typemap(cstype, T) item) { ((global::System.Collections.Generic.ISet<$typemap(cstype, T)>)this).Add(item); } public bool TryGetValue($typemap(cstype, T) equalValue, out $typemap(cstype, T) actualValue) { try { actualValue = getitem(equalValue); return true; } catch { actualValue = default($typemap(cstype, T)); return false; } } public int Count { get { return (int)size(); } } public bool IsReadOnly { get { return false; } } public void CopyTo($typemap(cstype, T)[] array) { CopyTo(array, 0); } public void CopyTo($typemap(cstype, T)[] array, int arrayIndex) { if (array == null) throw new global::System.ArgumentNullException("array"); if (arrayIndex < 0) throw new global::System.ArgumentOutOfRangeException("arrayIndex", "Value is less than zero"); if (array.Rank > 1) throw new global::System.ArgumentException("Multi dimensional array.", "array"); if (arrayIndex+this.Count > array.Length) throw new global::System.ArgumentException("Number of elements to copy is too large."); foreach ($typemap(cstype, T) item in this) { array.SetValue(item, arrayIndex++); } } public void ExceptWith(global::System.Collections.Generic.IEnumerable<$typemap(cstype, T)> other) { foreach ($typemap(cstype, T) item in other) { Remove(item); } } public void IntersectWith(global::System.Collections.Generic.IEnumerable<$typemap(cstype, T)> other) { $csclassname old = new $csclassname(this); Clear(); foreach ($typemap(cstype, T) item in other) { if (old.Contains(item)) Add(item); } } private static int count_enum(global::System.Collections.Generic.IEnumerable<$typemap(cstype, T)> other) { int count = 0; foreach ($typemap(cstype, T) item in other) { count++; } return count; } public bool IsProperSubsetOf(global::System.Collections.Generic.IEnumerable<$typemap(cstype, T)> other) { return IsSubsetOf(other) && Count < count_enum(other); } public bool IsProperSupersetOf(global::System.Collections.Generic.IEnumerable<$typemap(cstype, T)> other) { return IsSupersetOf(other) && Count > count_enum(other); } public bool IsSubsetOf(global::System.Collections.Generic.IEnumerable<$typemap(cstype, T)> other) { int countContained = 0; foreach ($typemap(cstype, T) item in other) { if (Contains(item)) countContained++; } return countContained == Count; } public bool IsSupersetOf(global::System.Collections.Generic.IEnumerable<$typemap(cstype, T)> other) { foreach ($typemap(cstype, T) item in other) { if (!Contains(item)) return false; } return true; } public bool Overlaps(global::System.Collections.Generic.IEnumerable<$typemap(cstype, T)> other) { foreach ($typemap(cstype, T) item in other) { if (Contains(item)) return true; } return false; } public bool SetEquals(global::System.Collections.Generic.IEnumerable<$typemap(cstype, T)> other) { return IsSupersetOf(other) && Count == count_enum(other); } public void SymmetricExceptWith(global::System.Collections.Generic.IEnumerable<$typemap(cstype, T)> other) { foreach ($typemap(cstype, T) item in other) { if (!Remove(item)) Add(item); } } public void UnionWith(global::System.Collections.Generic.IEnumerable<$typemap(cstype, T)> other) { foreach ($typemap(cstype, T) item in other) { Add(item); } } private global::System.Collections.Generic.ICollection<$typemap(cstype, T)> Items { get { global::System.Collections.Generic.ICollection<$typemap(cstype, T)> items = new global::System.Collections.Generic.List<$typemap(cstype, T)>(); int size = this.Count; if (size > 0) { global::System.IntPtr iter = create_iterator_begin(); for (int i = 0; i < size; i++) { items.Add(get_next(iter)); } destroy_iterator(iter); } return items; } } global::System.Collections.Generic.IEnumerator<$typemap(cstype, T)> global::System.Collections.Generic.IEnumerable<$typemap(cstype, T)>.GetEnumerator() { return new $csclassnameEnumerator(this); } global::System.Collections.IEnumerator global::System.Collections.IEnumerable.GetEnumerator() { return new $csclassnameEnumerator(this); } public $csclassnameEnumerator GetEnumerator() { return new $csclassnameEnumerator(this); } // Type-safe enumerator /// Note that the IEnumerator documentation requires an InvalidOperationException to be thrown /// whenever the collection is modified. This has been done for changes in the size of the /// collection but not when one of the elements of the collection is modified as it is a bit /// tricky to detect unmanaged code that modifies the collection under our feet. public sealed class $csclassnameEnumerator : global::System.Collections.IEnumerator, global::System.Collections.Generic.IEnumerator<$typemap(cstype, T)> { private $csclassname collectionRef; private global::System.Collections.Generic.IList<$typemap(cstype, T)> ItemsCollection; private int currentIndex; private object currentObject; private int currentSize; public $csclassnameEnumerator($csclassname collection) { collectionRef = collection; ItemsCollection = new global::System.Collections.Generic.List<$typemap(cstype, T)>(collection.Items); currentIndex = -1; currentObject = null; currentSize = collectionRef.Count; } // Type-safe iterator Current public $typemap(cstype, T) Current { get { if (currentIndex == -1) throw new global::System.InvalidOperationException("Enumeration not started."); if (currentIndex > currentSize - 1) throw new global::System.InvalidOperationException("Enumeration finished."); if (currentObject == null) throw new global::System.InvalidOperationException("Collection modified."); return ($typemap(cstype, T))currentObject; } } // Type-unsafe IEnumerator.Current object global::System.Collections.IEnumerator.Current { get { return Current; } } public bool MoveNext() { int size = collectionRef.Count; bool moveOkay = (currentIndex+1 < size) && (size == currentSize); if (moveOkay) { currentIndex++; currentObject = ItemsCollection[currentIndex]; } else { currentObject = null; } return moveOkay; } public void Reset() { currentIndex = -1; currentObject = null; if (collectionRef.Count != currentSize) { throw new global::System.InvalidOperationException("Collection modified."); } } public void Dispose() { currentIndex = -1; currentObject = null; } } %} public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef T key_type; typedef T value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; set(); set(const set& other); size_type size() const; bool empty() const; %rename(Clear) clear; void clear(); %extend { bool Add(const value_type& item) { return $self->insert(item).second; } bool Contains(const value_type& item) { return $self->count(item) != 0; } bool Remove(const value_type& item) { return $self->erase(item) != 0; } const value_type& getitem(const value_type& item) throw (std::out_of_range) { std::set::iterator iter = $self->find(item); if (iter == $self->end()) throw std::out_of_range("item not found"); return *iter; } // create_iterator_begin(), get_next() and destroy_iterator work together to provide a collection of items to C# %apply void *VOID_INT_PTR { std::set::iterator *create_iterator_begin } %apply void *VOID_INT_PTR { std::set::iterator *swigiterator } std::set::iterator *create_iterator_begin() { return new std::set::iterator($self->begin()); } const key_type& get_next(std::set::iterator *swigiterator) { std::set::iterator iter = *swigiterator; (*swigiterator)++; return *iter; } void destroy_iterator(std::set::iterator *swigiterator) { delete swigiterator; } } }; } swig-4.0.1/Lib/csharp/std_wstring.i0000644000175000017500000000760613527063513017070 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_wstring.i * * Typemaps for std::wstring and const std::wstring& * These are mapped to a C# String and are passed around by value. * * To use non-const std::wstring references use the following %apply. Note * that they are passed by value. * %apply const std::wstring & {std::wstring &}; * ----------------------------------------------------------------------------- */ %include %{ #include %} namespace std { %naturalvar wstring; class wstring; // wstring %typemap(ctype, out="void *") wstring "wchar_t *" %typemap(imtype, inattributes="[global::System.Runtime.InteropServices.MarshalAs(global::System.Runtime.InteropServices.UnmanagedType.LPWStr)]", outattributes="[return: global::System.Runtime.InteropServices.MarshalAs(global::System.Runtime.InteropServices.UnmanagedType.LPWStr)]" ) wstring "string" %typemap(cstype) wstring "string" %typemap(csdirectorin) wstring "$iminput" %typemap(csdirectorout) wstring "$cscall" %typemap(in, canthrow=1) wstring %{ if (!$input) { SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null wstring", 0); return $null; } $1.assign($input); %} %typemap(out) wstring %{ $result = SWIG_csharp_wstring_callback($1.c_str()); %} %typemap(directorout, canthrow=1) wstring %{ if (!$input) { SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null wstring", 0); return $null; } $result.assign($input); %} %typemap(directorin) wstring %{ $input = SWIG_csharp_wstring_callback($1.c_str()); %} %typemap(csin) wstring "$csinput" %typemap(csout, excode=SWIGEXCODE) wstring { string ret = $imcall;$excode return ret; } %typemap(typecheck) wstring = wchar_t *; %typemap(throws, canthrow=1) wstring %{ std::string message($1.begin(), $1.end()); SWIG_CSharpSetPendingException(SWIG_CSharpApplicationException, message.c_str()); return $null; %} // const wstring & %typemap(ctype, out="void *") const wstring & "wchar_t *" %typemap(imtype, inattributes="[global::System.Runtime.InteropServices.MarshalAs(global::System.Runtime.InteropServices.UnmanagedType.LPWStr)]", outattributes="[return: global::System.Runtime.InteropServices.MarshalAs(global::System.Runtime.InteropServices.UnmanagedType.LPWStr)]" ) const wstring & "string" %typemap(cstype) const wstring & "string" %typemap(csdirectorin) const wstring & "$iminput" %typemap(csdirectorout) const wstring & "$cscall" %typemap(in, canthrow=1) const wstring & %{ if (!$input) { SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null wstring", 0); return $null; } std::wstring $1_str($input); $1 = &$1_str; %} %typemap(out) const wstring & %{ $result = SWIG_csharp_wstring_callback($1->c_str()); %} %typemap(csin) const wstring & "$csinput" %typemap(csout, excode=SWIGEXCODE) const wstring & { string ret = $imcall;$excode return ret; } %typemap(directorout, canthrow=1, warning=SWIGWARN_TYPEMAP_THREAD_UNSAFE_MSG) const wstring & %{ if (!$input) { SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null wstring", 0); return $null; } /* possible thread/reentrant code problem */ static std::wstring $1_str; $1_str = $input; $result = &$1_str; %} %typemap(directorin) const wstring & %{ $input = SWIG_csharp_wstring_callback($1.c_str()); %} %typemap(csvarin, excode=SWIGEXCODE2) const wstring & %{ set { $imcall;$excode } %} %typemap(csvarout, excode=SWIGEXCODE2) const wstring & %{ get { string ret = $imcall;$excode return ret; } %} %typemap(typecheck) const wstring & = wchar_t *; %typemap(throws, canthrow=1) const wstring & %{ std::string message($1.begin(), $1.end()); SWIG_CSharpSetPendingException(SWIG_CSharpApplicationException, message.c_str()); return $null; %} } swig-4.0.1/Lib/csharp/boost_intrusive_ptr.i0000644000175000017500000005702513527063513020644 0ustar williamwilliam// Users can provide their own SWIG_INTRUSIVE_PTR_TYPEMAPS or SWIG_INTRUSIVE_PTR_TYPEMAPS_NO_WRAP macros before including this file to change the // visibility of the constructor and getCPtr method if desired to public if using multiple modules. #ifndef SWIG_INTRUSIVE_PTR_TYPEMAPS #define SWIG_INTRUSIVE_PTR_TYPEMAPS(CONST, TYPE...) SWIG_INTRUSIVE_PTR_TYPEMAPS_IMPLEMENTATION(internal, internal, CONST, TYPE) #endif #ifndef SWIG_INTRUSIVE_PTR_TYPEMAPS_NO_WRAP #define SWIG_INTRUSIVE_PTR_TYPEMAPS_NO_WRAP(CONST, TYPE...) SWIG_INTRUSIVE_PTR_TYPEMAPS_NO_WRAP_IMPLEMENTATION(internal, internal, CONST, TYPE) #endif %include // Language specific macro implementing all the customisations for handling the smart pointer %define SWIG_INTRUSIVE_PTR_TYPEMAPS_IMPLEMENTATION(PTRCTOR_VISIBILITY, CPTR_VISIBILITY, CONST, TYPE...) // %naturalvar is as documented for member variables %naturalvar TYPE; %naturalvar SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE >; // destructor wrapper customisation %feature("unref") TYPE "(void)arg1; delete smartarg1;" // Typemap customisations... %typemap(in, canthrow=1) CONST TYPE ($&1_type argp = 0) %{ // plain value argp = (*(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input) ? (*(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input)->get() : 0; if (!argp) { SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "Attempt to dereference null $1_type", 0); return $null; } $1 = *argp; %} %typemap(out, fragment="SWIG_intrusive_deleter") CONST TYPE %{ //plain value(out) $1_ltype* resultp = new $1_ltype(($1_ltype &)$1); intrusive_ptr_add_ref(resultp); *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(resultp, SWIG_intrusive_deleter< CONST TYPE >()); %} %typemap(in, canthrow=1) CONST TYPE * (SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0) %{ // plain pointer smartarg = *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input; $1 = (TYPE *)(smartarg ? smartarg->get() : 0); %} %typemap(out, fragment="SWIG_intrusive_deleter,SWIG_null_deleter") CONST TYPE * %{ //plain pointer(out) #if ($owner) if ($1) { intrusive_ptr_add_ref($1); *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1, SWIG_intrusive_deleter< CONST TYPE >()); } else { *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = 0; } #else *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1 SWIG_NO_NULL_DELETER_0) : 0; #endif %} %typemap(in, canthrow=1) CONST TYPE & %{ // plain reference $1 = ($1_ltype)((*(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input) ? (*(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input)->get() : 0); if(!$1) { SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "$1_type reference is null", 0); return $null; } %} %typemap(out, fragment="SWIG_intrusive_deleter,SWIG_null_deleter") CONST TYPE & %{ //plain reference(out) #if ($owner) if ($1) { intrusive_ptr_add_ref($1); *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1, SWIG_intrusive_deleter< CONST TYPE >()); } else { *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = 0; } #else *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1 SWIG_NO_NULL_DELETER_0) : 0; #endif %} %typemap(in) TYPE *CONST& ($*1_ltype temp = 0) %{ // plain pointer by reference temp = ($*1_ltype)((*(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input) ? (*(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input)->get() : 0); $1 = &temp; %} %typemap(out, fragment="SWIG_intrusive_deleter,SWIG_null_deleter") TYPE *CONST& %{ // plain pointer by reference(out) #if ($owner) if (*$1) { intrusive_ptr_add_ref(*$1); *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(*$1, SWIG_intrusive_deleter< CONST TYPE >()); } else { *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = 0; } #else *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(*$1 SWIG_NO_NULL_DELETER_0); #endif %} %typemap(in) SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > (SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * smartarg) %{ // intrusive_ptr by value smartarg = *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >**)&$input; if (smartarg) { $1 = SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE >(smartarg->get(), true); } %} %typemap(out, fragment="SWIG_intrusive_deleter") SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > %{ if ($1) { intrusive_ptr_add_ref($1.get()); *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1.get(), SWIG_intrusive_deleter< CONST TYPE >()); } else { *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = 0; } %} %typemap(in) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > swigSharedPtrUpcast ($&1_type smartarg) %{ // shared_ptr by value smartarg = *($&1_ltype*)&$input; if (smartarg) $1 = *smartarg; %} %typemap(out) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > ANY_TYPE_SWIGSharedPtrUpcast %{ *($&1_ltype*)&$result = $1 ? new $1_ltype($1) : 0; %} %typemap(in) SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > & ($*1_ltype tempnull, $*1_ltype temp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * smartarg) %{ // intrusive_ptr by reference if ( $input ) { smartarg = *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >**)&$input; temp = SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE >(smartarg->get(), true); $1 = &temp; } else { $1 = &tempnull; } %} %typemap(memberin) SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > & %{ delete &($1); if ($self) { SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > * temp = new SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE >(*$input); $1 = *temp; } %} %typemap(out, fragment="SWIG_intrusive_deleter") SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > & %{ if (*$1) { intrusive_ptr_add_ref($1->get()); *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1->get(), SWIG_intrusive_deleter< CONST TYPE >()); } else { *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = 0; } %} %typemap(in) SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > * ($*1_ltype tempnull, $*1_ltype temp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * smartarg) %{ // intrusive_ptr by pointer if ( $input ) { smartarg = *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >**)&$input; temp = SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE >(smartarg->get(), true); $1 = &temp; } else { $1 = &tempnull; } %} %typemap(memberin) SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > * %{ delete $1; if ($self) $1 = new SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE >(*$input); %} %typemap(out, fragment="SWIG_intrusive_deleter") SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > * %{ if ($1 && *$1) { intrusive_ptr_add_ref($1->get()); *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1->get(), SWIG_intrusive_deleter< CONST TYPE >()); } else { *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = 0; } if ($owner) delete $1; %} %typemap(in) SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > *& (SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > temp, $*1_ltype tempp = 0, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * smartarg) %{ // intrusive_ptr by pointer reference smartarg = *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >**)&$input; if ($input) { temp = SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE >(smartarg->get(), true); } tempp = &temp; $1 = &tempp; %} %typemap(memberin) SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > *& %{ if ($self) $1 = *$input; %} %typemap(out, fragment="SWIG_intrusive_deleter") SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > *& %{ if (*$1 && **$1) { intrusive_ptr_add_ref((*$1)->get()); *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >((*$1)->get(), SWIG_intrusive_deleter< CONST TYPE >()); } else { *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = 0; } %} // various missing typemaps - If ever used (unlikely) ensure compilation error rather than runtime bug %typemap(in) CONST TYPE[], CONST TYPE[ANY], CONST TYPE (CLASS::*) %{ #error "typemaps for $1_type not available" %} %typemap(out) CONST TYPE[], CONST TYPE[ANY], CONST TYPE (CLASS::*) %{ #error "typemaps for $1_type not available" %} %typemap (ctype) SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE >, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >, SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > &, SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > *, SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > *& "void *" %typemap (imtype, out="global::System.IntPtr") SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE >, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >, SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > &, SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > *, SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > *& "global::System.Runtime.InteropServices.HandleRef" %typemap (cstype) SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE >, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >, SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > &, SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > *, SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > *& "$typemap(cstype, TYPE)" %typemap(csin) SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE >, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >, SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > &, SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > *, SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > *& "$typemap(cstype, TYPE).getCPtr($csinput)" %typemap(csout, excode=SWIGEXCODE) SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > { global::System.IntPtr cPtr = $imcall; $typemap(cstype, TYPE) ret = (cPtr == global::System.IntPtr.Zero) ? null : new $typemap(cstype, TYPE)(cPtr, true);$excode return ret; } %typemap(csout, excode=SWIGEXCODE) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > { global::System.IntPtr cPtr = $imcall; $typemap(cstype, TYPE) ret = (cPtr == global::System.IntPtr.Zero) ? null : new $typemap(cstype, TYPE)(cPtr, true);$excode return ret; } %typemap(csout, excode=SWIGEXCODE) SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > & { global::System.IntPtr cPtr = $imcall; $typemap(cstype, TYPE) ret = (cPtr == global::System.IntPtr.Zero) ? null : new $typemap(cstype, TYPE)(cPtr, true);$excode return ret; } %typemap(csout, excode=SWIGEXCODE) SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > * { global::System.IntPtr cPtr = $imcall; $typemap(cstype, TYPE) ret = (cPtr == global::System.IntPtr.Zero) ? null : new $typemap(cstype, TYPE)(cPtr, true);$excode return ret; } %typemap(csout, excode=SWIGEXCODE) SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > *& { global::System.IntPtr cPtr = $imcall; $typemap(cstype, TYPE) ret = (cPtr == global::System.IntPtr.Zero) ? null : new $typemap(cstype, TYPE)(cPtr, true);$excode return ret; } %typemap(csvarout, excode=SWIGEXCODE2) SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > %{ get { $typemap(cstype, TYPE) ret = new $typemap(cstype, TYPE)($imcall, true);$excode return ret; } %} %typemap(csvarout, excode=SWIGEXCODE2) SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE >& %{ get { $typemap(cstype, TYPE) ret = new $typemap(cstype, TYPE)($imcall, true);$excode return ret; } %} %typemap(csvarout, excode=SWIGEXCODE2) SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE >* %{ get { $typemap(cstype, TYPE) ret = new $typemap(cstype, TYPE)($imcall, true);$excode return ret; } %} %typemap(csout, excode=SWIGEXCODE) CONST TYPE { $typemap(cstype, TYPE) ret = new $typemap(cstype, TYPE)($imcall, true);$excode return ret; } %typemap(csout, excode=SWIGEXCODE) CONST TYPE & { $typemap(cstype, TYPE) ret = new $typemap(cstype, TYPE)($imcall, true);$excode return ret; } %typemap(csout, excode=SWIGEXCODE) CONST TYPE * { global::System.IntPtr cPtr = $imcall; $typemap(cstype, TYPE) ret = (cPtr == global::System.IntPtr.Zero) ? null : new $typemap(cstype, TYPE)(cPtr, true);$excode return ret; } %typemap(csout, excode=SWIGEXCODE) TYPE *CONST& { global::System.IntPtr cPtr = $imcall; $typemap(cstype, TYPE) ret = (cPtr == global::System.IntPtr.Zero) ? null : new $typemap(cstype, TYPE)(cPtr, true);$excode return ret; } // Base proxy classes %typemap(csbody) TYPE %{ private global::System.Runtime.InteropServices.HandleRef swigCPtr; private bool swigCMemOwnBase; PTRCTOR_VISIBILITY $csclassname(global::System.IntPtr cPtr, bool cMemoryOwn) { swigCMemOwnBase = cMemoryOwn; swigCPtr = new global::System.Runtime.InteropServices.HandleRef(this, cPtr); } CPTR_VISIBILITY static global::System.Runtime.InteropServices.HandleRef getCPtr($csclassname obj) { return (obj == null) ? new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero) : obj.swigCPtr; } %} // Derived proxy classes %typemap(csbody_derived) TYPE %{ private global::System.Runtime.InteropServices.HandleRef swigCPtr; private bool swigCMemOwnDerived; PTRCTOR_VISIBILITY $csclassname(global::System.IntPtr cPtr, bool cMemoryOwn) : base($imclassname.$csclazznameSWIGSmartPtrUpcast(cPtr), true) { swigCMemOwnDerived = cMemoryOwn; swigCPtr = new global::System.Runtime.InteropServices.HandleRef(this, cPtr); } CPTR_VISIBILITY static global::System.Runtime.InteropServices.HandleRef getCPtr($csclassname obj) { return (obj == null) ? new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero) : obj.swigCPtr; } %} %typemap(csdisposing, methodname="Dispose", methodmodifiers="protected", parameters="bool disposing") TYPE { lock(this) { if (swigCPtr.Handle != global::System.IntPtr.Zero) { if (swigCMemOwnBase) { swigCMemOwnBase = false; $imcall; } swigCPtr = new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero); } } } %typemap(csdisposing_derived, methodname="Dispose", methodmodifiers="protected", parameters="bool disposing") TYPE { lock(this) { if (swigCPtr.Handle != global::System.IntPtr.Zero) { if (swigCMemOwnDerived) { swigCMemOwnDerived = false; $imcall; } swigCPtr = new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero); } base.Dispose(disposing); } } // CONST version needed ???? also for C# %typemap(imtype, nopgcpp="1") SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > swigSharedPtrUpcast "global::System.Runtime.InteropServices.HandleRef" %typemap(imtype, nopgcpp="1") SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > swigSharedPtrUpcast "global::System.Runtime.InteropServices.HandleRef" %template() SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >; %template() SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE >; %enddef ///////////////////////////////////////////////////////////////////// %include %define SWIG_INTRUSIVE_PTR_TYPEMAPS_NO_WRAP_IMPLEMENTATION(PTRCTOR_VISIBILITY, CPTR_VISIBILITY, CONST, TYPE...) %naturalvar TYPE; %naturalvar SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >; // destructor mods %feature("unref") TYPE "(void)arg1; delete smartarg1;" // plain value %typemap(in, canthrow=1) CONST TYPE ($&1_type argp = 0) %{ argp = (*(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input) ? (*(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input)->get() : 0; if (!argp) { SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "Attempt to dereference null $1_type", 0); return $null; } $1 = *argp; %} %typemap(out) CONST TYPE %{ *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(new $1_ltype(($1_ltype &)$1)); %} // plain pointer %typemap(in) CONST TYPE * (SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0) %{ smartarg = *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input; $1 = (TYPE *)(smartarg ? smartarg->get() : 0); %} %typemap(out, fragment="SWIG_null_deleter") CONST TYPE * %{ *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1 SWIG_NO_NULL_DELETER_$owner) : 0; %} // plain reference %typemap(in, canthrow=1) CONST TYPE & %{ $1 = ($1_ltype)((*(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input) ? (*(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input)->get() : 0); if (!$1) { SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "$1_type reference is null", 0); return $null; } %} %typemap(out, fragment="SWIG_null_deleter") CONST TYPE & %{ *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1 SWIG_NO_NULL_DELETER_$owner); %} // plain pointer by reference %typemap(in) TYPE *CONST& ($*1_ltype temp = 0) %{ temp = ($*1_ltype)((*(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input) ? (*(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input)->get() : 0); $1 = &temp; %} %typemap(out, fragment="SWIG_null_deleter") TYPE *CONST& %{ *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(*$1 SWIG_NO_NULL_DELETER_$owner); %} %typemap(in) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > swigSharedPtrUpcast ($&1_type smartarg) %{ // shared_ptr by value smartarg = *($&1_ltype*)&$input; if (smartarg) $1 = *smartarg; %} %typemap(out) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > ANY_TYPE_SWIGSharedPtrUpcast %{ *($&1_ltype*)&$result = $1 ? new $1_ltype($1) : 0; %} // various missing typemaps - If ever used (unlikely) ensure compilation error rather than runtime bug %typemap(in) CONST TYPE[], CONST TYPE[ANY], CONST TYPE (CLASS::*) %{ #error "typemaps for $1_type not available" %} %typemap(out) CONST TYPE[], CONST TYPE[ANY], CONST TYPE (CLASS::*) %{ #error "typemaps for $1_type not available" %} %typemap (ctype) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > "void *" %typemap (imtype) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > "void *" %typemap (cstype) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > "$typemap(cstype, TYPE)" %typemap (csin) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > "$typemap(cstype, TYPE).getCPtr($csinput)" %typemap(csout, excode=SWIGEXCODE) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > { global::System.IntPtr cPtr = $imcall; return (cPtr == global::System.IntPtr.Zero) ? null : new $typemap(cstype, TYPE)(cPtr, true); } %typemap(csout, excode=SWIGEXCODE) CONST TYPE { return new $typemap(cstype, TYPE)($imcall, true); } %typemap(csout, excode=SWIGEXCODE) CONST TYPE & { return new $typemap(cstype, TYPE)($imcall, true); } %typemap(csout, excode=SWIGEXCODE) CONST TYPE * { global::System.IntPtr cPtr = $imcall; return (cPtr == global::System.IntPtr.Zero) ? null : new $typemap(cstype, TYPE)(cPtr, true); } %typemap(csout, excode=SWIGEXCODE) TYPE *CONST& { global::System.IntPtr cPtr = $imcall; return (cPtr == global::System.IntPtr.Zero) ? null : new $typemap(cstype, TYPE)(cPtr, true); } // Base proxy classes %typemap(csbody) TYPE %{ private global::System.Runtime.InteropServices.HandleRef swigCPtr; private bool swigCMemOwnBase; PTRCTOR_VISIBILITY $csclassname(global::System.IntPtr cPtr, bool cMemoryOwn) { swigCMemOwnBase = cMemoryOwn; swigCPtr = new global::System.Runtime.InteropServices.HandleRef(this, cPtr); } CPTR_VISIBILITY static global::System.Runtime.InteropServices.HandleRef getCPtr($csclassname obj) { return (obj == null) ? new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero) : obj.swigCPtr; } %} // Derived proxy classes %typemap(csbody_derived) TYPE %{ private global::System.Runtime.InteropServices.HandleRef swigCPtr; private bool swigCMemOwnDerived; PTRCTOR_VISIBILITY $csclassname(global::System.IntPtr cPtr, bool cMemoryOwn) : base($imclassname.$csclazznameSWIGSmartPtrUpcast(cPtr), true) { swigCMemOwnDerived = cMemoryOwn; swigCPtr = new global::System.Runtime.InteropServices.HandleRef(this, cPtr); } CPTR_VISIBILITY static global::System.Runtime.InteropServices.HandleRef getCPtr($csclassname obj) { return (obj == null) ? new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero) : obj.swigCPtr; } %} %typemap(csdisposing, methodname="Dispose", methodmodifiers="protected", parameters="bool disposing") TYPE { lock(this) { if (swigCPtr.Handle != global::System.IntPtr.Zero) { if (swigCMemOwnBase) { swigCMemOwnBase = false; $imcall; } swigCPtr = new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero); } } } %typemap(csdisposing_derived, methodname="Dispose", methodmodifiers="protected", parameters="bool disposing") TYPE { lock(this) { if (swigCPtr.Handle != global::System.IntPtr.Zero) { if (swigCMemOwnDerived) { swigCMemOwnDerived = false; $imcall; } swigCPtr = new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero); } base.Dispose(disposing); } } // CONST version needed ???? also for C# %typemap(imtype, nopgcpp="1") SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > swigSharedPtrUpcast "global::System.Runtime.InteropServices.HandleRef" %typemap(imtype, nopgcpp="1") SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > swigSharedPtrUpcast "global::System.Runtime.InteropServices.HandleRef" // Typecheck typemaps %typemap(typecheck, precedence=SWIG_TYPECHECK_POINTER, equivalent="TYPE *") TYPE CONST, TYPE CONST &, TYPE CONST *, TYPE *CONST&, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > &, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& "" %template() SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >; %enddef swig-4.0.1/Lib/csharp/std_common.i0000644000175000017500000000014613527063513016653 0ustar williamwilliam%include %apply size_t { std::size_t }; %apply const size_t& { const std::size_t& }; swig-4.0.1/Lib/csharp/std_except.i0000644000175000017500000000436113527063513016656 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_except.i * * Typemaps used by the STL wrappers that throw exceptions. These typemaps are * used when methods are declared with an STL exception specification, such as * size_t at() const throw (std::out_of_range); * ----------------------------------------------------------------------------- */ %{ #include #include %} namespace std { %ignore exception; struct exception {}; } %typemap(throws, canthrow=1) std::bad_cast "SWIG_CSharpSetPendingException(SWIG_CSharpInvalidCastException, $1.what());\n return $null;" %typemap(throws, canthrow=1) std::bad_exception "SWIG_CSharpSetPendingException(SWIG_CSharpApplicationException, $1.what());\n return $null;" %typemap(throws, canthrow=1) std::domain_error "SWIG_CSharpSetPendingException(SWIG_CSharpApplicationException, $1.what());\n return $null;" %typemap(throws, canthrow=1) std::exception "SWIG_CSharpSetPendingException(SWIG_CSharpApplicationException, $1.what());\n return $null;" %typemap(throws, canthrow=1) std::invalid_argument "SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentException, $1.what(), \"\");\n return $null;" %typemap(throws, canthrow=1) std::length_error "SWIG_CSharpSetPendingException(SWIG_CSharpIndexOutOfRangeException, $1.what());\n return $null;" %typemap(throws, canthrow=1) std::logic_error "SWIG_CSharpSetPendingException(SWIG_CSharpApplicationException, $1.what());\n return $null;" %typemap(throws, canthrow=1) std::out_of_range "SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentOutOfRangeException, 0, $1.what());\n return $null;" %typemap(throws, canthrow=1) std::overflow_error "SWIG_CSharpSetPendingException(SWIG_CSharpOverflowException, $1.what());\n return $null;" %typemap(throws, canthrow=1) std::range_error "SWIG_CSharpSetPendingException(SWIG_CSharpIndexOutOfRangeException, $1.what());\n return $null;" %typemap(throws, canthrow=1) std::runtime_error "SWIG_CSharpSetPendingException(SWIG_CSharpApplicationException, $1.what());\n return $null;" %typemap(throws, canthrow=1) std::underflow_error "SWIG_CSharpSetPendingException(SWIG_CSharpOverflowException, $1.what());\n return $null;" swig-4.0.1/Lib/csharp/complex.i0000644000175000017500000000015513527063513016160 0ustar williamwilliam#ifdef __cplusplus %include #else #error C# module only supports complex in C++ mode. #endif swig-4.0.1/Lib/csharp/enumtypesafe.swg0000644000175000017500000001127613527063513017574 0ustar williamwilliam/* ----------------------------------------------------------------------------- * enumtypesafe.swg * * Include this file in order for C/C++ enums to be wrapped by the so called * typesafe enum pattern. Each enum has an equivalent C# class named after the * enum and each enum item is a static instance of this class. * ----------------------------------------------------------------------------- */ // const enum SWIGTYPE & typemaps %typemap(ctype) const enum SWIGTYPE & "int" %typemap(imtype) const enum SWIGTYPE & "int" %typemap(cstype) const enum SWIGTYPE & "$*csclassname" %typemap(in) const enum SWIGTYPE & ($*1_ltype temp) %{ temp = ($*1_ltype)$input; $1 = &temp; %} %typemap(out) const enum SWIGTYPE & %{ $result = (int)*$1; %} %typemap(directorout,warning=SWIGWARN_TYPEMAP_THREAD_UNSAFE_MSG) const enum SWIGTYPE & %{ static $*1_ltype temp = ($*1_ltype)$input; $result = &temp; %} %typemap(directorin) const enum SWIGTYPE & "$input = (int)$1;" %typemap(csdirectorin) const enum SWIGTYPE & "$*csclassname.swigToEnum($iminput)" %typemap(csdirectorout) const enum SWIGTYPE & "$cscall.swigValue" %typecheck(SWIG_TYPECHECK_POINTER) const enum SWIGTYPE & "" %typemap(throws, canthrow=1) const enum SWIGTYPE & %{ (void)$1; SWIG_CSharpSetPendingException(SWIG_CSharpApplicationException, "C++ $1_type exception thrown"); return $null; %} %typemap(csin) const enum SWIGTYPE & "$csinput.swigValue" %typemap(csout, excode=SWIGEXCODE) const enum SWIGTYPE & { $*csclassname ret = $*csclassname.swigToEnum($imcall);$excode return ret; } %typemap(csvarout, excode=SWIGEXCODE2) const enum SWIGTYPE & %{ get { $*csclassname ret = $*csclassname.swigToEnum($imcall);$excode return ret; } %} // enum SWIGTYPE typemaps %typemap(ctype) enum SWIGTYPE "int" %typemap(imtype) enum SWIGTYPE "int" %typemap(cstype) enum SWIGTYPE "$csclassname" %typemap(in) enum SWIGTYPE %{ $1 = ($1_ltype)$input; %} %typemap(out) enum SWIGTYPE %{ $result = (int)$1; %} %typemap(directorout) enum SWIGTYPE %{ $result = ($1_ltype)$input; %} %typemap(directorin) enum SWIGTYPE "$input = (int)$1;" %typemap(csdirectorin) enum SWIGTYPE "$csclassname.swigToEnum($iminput)" %typemap(csdirectorout) enum SWIGTYPE "$cscall.swigValue" %typecheck(SWIG_TYPECHECK_POINTER) enum SWIGTYPE "" %typemap(throws, canthrow=1) enum SWIGTYPE %{ (void)$1; SWIG_CSharpSetPendingException(SWIG_CSharpApplicationException, "C++ $1_type exception thrown"); return $null; %} %typemap(csin) enum SWIGTYPE "$csinput.swigValue" %typemap(csout, excode=SWIGEXCODE) enum SWIGTYPE { $csclassname ret = $csclassname.swigToEnum($imcall);$excode return ret; } %typemap(csvarout, excode=SWIGEXCODE2) enum SWIGTYPE %{ get { $csclassname ret = $csclassname.swigToEnum($imcall);$excode return ret; } %} %typemap(csbase) enum SWIGTYPE "" %typemap(csclassmodifiers) enum SWIGTYPE "public sealed class" %typemap(cscode) enum SWIGTYPE "" %typemap(csimports) enum SWIGTYPE "" %typemap(csinterfaces) enum SWIGTYPE "" /* * The swigToEnum method is used to find the C# enum from a C++ enum integer value. The default one here takes * advantage of the fact that most enums do not have initial values specified, so the lookup is fast. If initial * values are specified then a lengthy linear search through all possible enums might occur. Specific typemaps could be * written to possibly optimise this lookup by taking advantage of characteristics peculiar to the targeted enum. * The special variable, $enumvalues, is replaced with a comma separated list of all the enum values. */ %typemap(csbody) enum SWIGTYPE %{ public readonly int swigValue; public static $csclassname swigToEnum(int swigValue) { if (swigValue < swigValues.Length && swigValue >= 0 && swigValues[swigValue].swigValue == swigValue) return swigValues[swigValue]; for (int i = 0; i < swigValues.Length; i++) if (swigValues[i].swigValue == swigValue) return swigValues[i]; throw new global::System.ArgumentOutOfRangeException("No enum $csclassname with value " + swigValue); } public override string ToString() { return swigName; } private $csclassname(string swigName) { this.swigName = swigName; this.swigValue = swigNext++; } private $csclassname(string swigName, int swigValue) { this.swigName = swigName; this.swigValue = swigValue; swigNext = swigValue+1; } private $csclassname(string swigName, $csclassname swigEnum) { this.swigName = swigName; this.swigValue = swigEnum.swigValue; swigNext = this.swigValue+1; } private static $csclassname[] swigValues = { $enumvalues }; private static int swigNext = 0; private readonly string swigName; %} %csenum(typesafe); swig-4.0.1/Lib/csharp/typemaps.i0000644000175000017500000002472313527063513016362 0ustar williamwilliam/* ----------------------------------------------------------------------------- * typemaps.i * * Pointer and reference handling typemap library * * These mappings provide support for input/output arguments and common * uses for C/C++ pointers and C++ references. * ----------------------------------------------------------------------------- */ /* INPUT typemaps -------------- These typemaps are used for pointer/reference parameters that are input only and are mapped to a C# input parameter. The following typemaps can be applied to turn a pointer or reference into a simple input value. That is, instead of passing a pointer or reference to an object, you would use a real value instead. bool *INPUT, bool &INPUT signed char *INPUT, signed char &INPUT unsigned char *INPUT, unsigned char &INPUT short *INPUT, short &INPUT unsigned short *INPUT, unsigned short &INPUT int *INPUT, int &INPUT unsigned int *INPUT, unsigned int &INPUT long *INPUT, long &INPUT unsigned long *INPUT, unsigned long &INPUT long long *INPUT, long long &INPUT unsigned long long *INPUT, unsigned long long &INPUT float *INPUT, float &INPUT double *INPUT, double &INPUT To use these, suppose you had a C function like this : double fadd(double *a, double *b) { return *a+*b; } You could wrap it with SWIG as follows : %include double fadd(double *INPUT, double *INPUT); or you can use the %apply directive : %include %apply double *INPUT { double *a, double *b }; double fadd(double *a, double *b); In C# you could then use it like this: double answer = modulename.fadd(10.0, 20.0); */ %define INPUT_TYPEMAP(TYPE, CTYPE, CSTYPE) %typemap(ctype, out="void *") TYPE *INPUT, TYPE &INPUT "CTYPE" %typemap(imtype, out="global::System.IntPtr") TYPE *INPUT, TYPE &INPUT "CSTYPE" %typemap(cstype, out="$csclassname") TYPE *INPUT, TYPE &INPUT "CSTYPE" %typemap(csin) TYPE *INPUT, TYPE &INPUT "$csinput" %typemap(in) TYPE *INPUT, TYPE &INPUT %{ $1 = ($1_ltype)&$input; %} %typemap(typecheck) TYPE *INPUT = TYPE; %typemap(typecheck) TYPE &INPUT = TYPE; %enddef INPUT_TYPEMAP(bool, unsigned int, bool) //INPUT_TYPEMAP(char, char, char) INPUT_TYPEMAP(signed char, signed char, sbyte) INPUT_TYPEMAP(unsigned char, unsigned char, byte) INPUT_TYPEMAP(short, short, short) INPUT_TYPEMAP(unsigned short, unsigned short, ushort) INPUT_TYPEMAP(int, int, int) INPUT_TYPEMAP(unsigned int, unsigned int, uint) INPUT_TYPEMAP(long, long, int) INPUT_TYPEMAP(unsigned long, unsigned long, uint) INPUT_TYPEMAP(long long, long long, long) INPUT_TYPEMAP(unsigned long long, unsigned long long, ulong) INPUT_TYPEMAP(float, float, float) INPUT_TYPEMAP(double, double, double) #undef INPUT_TYPEMAP /* OUTPUT typemaps --------------- These typemaps are used for pointer/reference parameters that are output only and are mapped to a C# output parameter. The following typemaps can be applied to turn a pointer or reference into an "output" value. When calling a function, no input value would be given for a parameter, but an output value would be returned. In C#, the 'out' keyword is used when passing the parameter to a function that takes an output parameter. bool *OUTPUT, bool &OUTPUT signed char *OUTPUT, signed char &OUTPUT unsigned char *OUTPUT, unsigned char &OUTPUT short *OUTPUT, short &OUTPUT unsigned short *OUTPUT, unsigned short &OUTPUT int *OUTPUT, int &OUTPUT unsigned int *OUTPUT, unsigned int &OUTPUT long *OUTPUT, long &OUTPUT unsigned long *OUTPUT, unsigned long &OUTPUT long long *OUTPUT, long long &OUTPUT unsigned long long *OUTPUT, unsigned long long &OUTPUT float *OUTPUT, float &OUTPUT double *OUTPUT, double &OUTPUT For example, suppose you were trying to wrap the modf() function in the C math library which splits x into integral and fractional parts (and returns the integer part in one of its parameters): double modf(double x, double *ip); You could wrap it with SWIG as follows : %include double modf(double x, double *OUTPUT); or you can use the %apply directive : %include %apply double *OUTPUT { double *ip }; double modf(double x, double *ip); The C# output of the function would be the function return value and the value returned in the second output parameter. In C# you would use it like this: double dptr; double fraction = modulename.modf(5, out dptr); */ %define OUTPUT_TYPEMAP(TYPE, CTYPE, CSTYPE, TYPECHECKPRECEDENCE) %typemap(ctype, out="void *") TYPE *OUTPUT, TYPE &OUTPUT "CTYPE *" %typemap(imtype, out="global::System.IntPtr") TYPE *OUTPUT, TYPE &OUTPUT "out CSTYPE" %typemap(cstype, out="$csclassname") TYPE *OUTPUT, TYPE &OUTPUT "out CSTYPE" %typemap(csin) TYPE *OUTPUT, TYPE &OUTPUT "out $csinput" %typemap(in) TYPE *OUTPUT, TYPE &OUTPUT %{ $1 = ($1_ltype)$input; %} %typecheck(SWIG_TYPECHECK_##TYPECHECKPRECEDENCE) TYPE *OUTPUT, TYPE &OUTPUT "" %enddef OUTPUT_TYPEMAP(bool, unsigned int, bool, BOOL_PTR) //OUTPUT_TYPEMAP(char, char, char, CHAR_PTR) OUTPUT_TYPEMAP(signed char, signed char, sbyte, INT8_PTR) OUTPUT_TYPEMAP(unsigned char, unsigned char, byte, UINT8_PTR) OUTPUT_TYPEMAP(short, short, short, INT16_PTR) OUTPUT_TYPEMAP(unsigned short, unsigned short, ushort, UINT16_PTR) OUTPUT_TYPEMAP(int, int, int, INT32_PTR) OUTPUT_TYPEMAP(unsigned int, unsigned int, uint, UINT32_PTR) OUTPUT_TYPEMAP(long, long, int, INT32_PTR) OUTPUT_TYPEMAP(unsigned long, unsigned long, uint, UINT32_PTR) OUTPUT_TYPEMAP(long long, long long, long, INT64_PTR) OUTPUT_TYPEMAP(unsigned long long, unsigned long long, ulong, UINT64_PTR) OUTPUT_TYPEMAP(float, float, float, FLOAT_PTR) OUTPUT_TYPEMAP(double, double, double, DOUBLE_PTR) #undef OUTPUT_TYPEMAP %typemap(in) bool *OUTPUT, bool &OUTPUT %{ *$input = 0; $1 = ($1_ltype)$input; %} /* INOUT typemaps -------------- These typemaps are for pointer/reference parameters that are both input and output and are mapped to a C# reference parameter. The following typemaps can be applied to turn a pointer or reference into a reference parameters, that is the parameter is both an input and an output. In C#, the 'ref' keyword is used for reference parameters. bool *INOUT, bool &INOUT signed char *INOUT, signed char &INOUT unsigned char *INOUT, unsigned char &INOUT short *INOUT, short &INOUT unsigned short *INOUT, unsigned short &INOUT int *INOUT, int &INOUT unsigned int *INOUT, unsigned int &INOUT long *INOUT, long &INOUT unsigned long *INOUT, unsigned long &INOUT long long *INOUT, long long &INOUT unsigned long long *INOUT, unsigned long long &INOUT float *INOUT, float &INOUT double *INOUT, double &INOUT For example, suppose you were trying to wrap the following function : void neg(double *x) { *x = -(*x); } You could wrap it with SWIG as follows : %include void neg(double *INOUT); or you can use the %apply directive : %include %apply double *INOUT { double *x }; void neg(double *x); The C# output of the function would be the new value returned by the reference parameter. In C# you would use it like this: double x = 5.0; neg(ref x); The implementation of the OUTPUT and INOUT typemaps is different to the scripting languages in that the scripting languages will return the output value as part of the function return value. */ %define INOUT_TYPEMAP(TYPE, CTYPE, CSTYPE, TYPECHECKPRECEDENCE) %typemap(ctype, out="void *") TYPE *INOUT, TYPE &INOUT "CTYPE *" %typemap(imtype, out="global::System.IntPtr") TYPE *INOUT, TYPE &INOUT "ref CSTYPE" %typemap(cstype, out="$csclassname") TYPE *INOUT, TYPE &INOUT "ref CSTYPE" %typemap(csin) TYPE *INOUT, TYPE &INOUT "ref $csinput" %typemap(in) TYPE *INOUT, TYPE &INOUT %{ $1 = ($1_ltype)$input; %} %typecheck(SWIG_TYPECHECK_##TYPECHECKPRECEDENCE) TYPE *INOUT, TYPE &INOUT "" %enddef INOUT_TYPEMAP(bool, unsigned int, bool, BOOL_PTR) //INOUT_TYPEMAP(char, char, char, CHAR_PTR) INOUT_TYPEMAP(signed char, signed char, sbyte, INT8_PTR) INOUT_TYPEMAP(unsigned char, unsigned char, byte, UINT8_PTR) INOUT_TYPEMAP(short, short, short, INT16_PTR) INOUT_TYPEMAP(unsigned short, unsigned short, ushort, UINT16_PTR) INOUT_TYPEMAP(int, int, int, INT32_PTR) INOUT_TYPEMAP(unsigned int, unsigned int, uint, UINT32_PTR) INOUT_TYPEMAP(long, long, int, INT32_PTR) INOUT_TYPEMAP(unsigned long, unsigned long, uint, UINT32_PTR) INOUT_TYPEMAP(long long, long long, long, INT64_PTR) INOUT_TYPEMAP(unsigned long long, unsigned long long, ulong, UINT64_PTR) INOUT_TYPEMAP(float, float, float, FLOAT_PTR) INOUT_TYPEMAP(double, double, double, DOUBLE_PTR) #undef INOUT_TYPEMAP swig-4.0.1/Lib/csharp/std_array.i0000644000175000017500000001572613527063513016513 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_array.i * * SWIG typemaps for std::array * C# implementation * The C# wrapper is made to look and feel like a C# System.Collections.Generic.IReadOnlyList<> collection. * ----------------------------------------------------------------------------- */ %{ #include #include #include %} %include %define SWIG_STD_ARRAY_INTERNAL(T, N) %typemap(csinterfaces) std::array< T, N > "global::System.IDisposable, global::System.Collections.IEnumerable\n , global::System.Collections.Generic.IEnumerable<$typemap(cstype, T)>\n"; %proxycode %{ public $csclassname(global::System.Collections.ICollection c) : this() { if (c == null) throw new global::System.ArgumentNullException("c"); int end = global::System.Math.Min(this.Count, c.Count); int i = 0; foreach ($typemap(cstype, T) elem in c) { if (i >= end) break; this[i++] = elem; } } public int Count { get { return (int)size(); } } public $typemap(cstype, T) this[int index] { get { return getitem(index); } set { setitem(index, value); } } public bool IsEmpty { get { return empty(); } } public void CopyTo($typemap(cstype, T)[] array) { CopyTo(0, array, 0, this.Count); } public void CopyTo($typemap(cstype, T)[] array, int arrayIndex) { CopyTo(0, array, arrayIndex, this.Count); } public void CopyTo(int index, $typemap(cstype, T)[] array, int arrayIndex, int count) { if (array == null) throw new global::System.ArgumentNullException("array"); if (index < 0) throw new global::System.ArgumentOutOfRangeException("index", "Value is less than zero"); if (arrayIndex < 0) throw new global::System.ArgumentOutOfRangeException("arrayIndex", "Value is less than zero"); if (count < 0) throw new global::System.ArgumentOutOfRangeException("count", "Value is less than zero"); if (array.Rank > 1) throw new global::System.ArgumentException("Multi dimensional array.", "array"); if (index+count > this.Count || arrayIndex+count > array.Length) throw new global::System.ArgumentException("Number of elements to copy is too large."); for (int i=0; i global::System.Collections.Generic.IEnumerable<$typemap(cstype, T)>.GetEnumerator() { return new $csclassnameEnumerator(this); } global::System.Collections.IEnumerator global::System.Collections.IEnumerable.GetEnumerator() { return new $csclassnameEnumerator(this); } public $csclassnameEnumerator GetEnumerator() { return new $csclassnameEnumerator(this); } // Type-safe enumerator /// Note that the IEnumerator documentation requires an InvalidOperationException to be thrown /// whenever the collection is modified. This has been done for changes in the size of the /// collection but not when one of the elements of the collection is modified as it is a bit /// tricky to detect unmanaged code that modifies the collection under our feet. public sealed class $csclassnameEnumerator : global::System.Collections.IEnumerator , global::System.Collections.Generic.IEnumerator<$typemap(cstype, T)> { private $csclassname collectionRef; private int currentIndex; private object currentObject; private int currentSize; public $csclassnameEnumerator($csclassname collection) { collectionRef = collection; currentIndex = -1; currentObject = null; currentSize = collectionRef.Count; } // Type-safe iterator Current public $typemap(cstype, T) Current { get { if (currentIndex == -1) throw new global::System.InvalidOperationException("Enumeration not started."); if (currentIndex > currentSize - 1) throw new global::System.InvalidOperationException("Enumeration finished."); if (currentObject == null) throw new global::System.InvalidOperationException("Collection modified."); return ($typemap(cstype, T))currentObject; } } // Type-unsafe IEnumerator.Current object global::System.Collections.IEnumerator.Current { get { return Current; } } public bool MoveNext() { int size = collectionRef.Count; bool moveOkay = (currentIndex+1 < size) && (size == currentSize); if (moveOkay) { currentIndex++; currentObject = collectionRef[currentIndex]; } else { currentObject = null; } return moveOkay; } public void Reset() { currentIndex = -1; currentObject = null; if (collectionRef.Count != currentSize) { throw new global::System.InvalidOperationException("Collection modified."); } } public void Dispose() { currentIndex = -1; currentObject = null; } } %} public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef T value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; array(); array(const array &other); size_type size() const; bool empty() const; %rename(Fill) fill; void fill(const value_type& value); %rename(Swap) swap; void swap(array& other); %extend { T getitemcopy(int index) throw (std::out_of_range) { if (index>=0 && index<(int)$self->size()) return (*$self)[index]; else throw std::out_of_range("index"); } const_reference getitem(int index) throw (std::out_of_range) { if (index>=0 && index<(int)$self->size()) return (*$self)[index]; else throw std::out_of_range("index"); } void setitem(int index, const_reference val) throw (std::out_of_range) { if (index>=0 && index<(int)$self->size()) (*$self)[index] = val; else throw std::out_of_range("index"); } void Reverse() { std::reverse($self->begin(), $self->end()); } void Reverse(int index, int count) throw (std::out_of_range, std::invalid_argument) { if (index < 0) throw std::out_of_range("index"); if (count < 0) throw std::out_of_range("count"); if (index >= (int)$self->size()+1 || index+count > (int)$self->size()) throw std::invalid_argument("invalid range"); std::reverse($self->begin()+index, $self->begin()+index+count); } } %enddef %csmethodmodifiers std::array::empty "private" %csmethodmodifiers std::array::getitemcopy "private" %csmethodmodifiers std::array::getitem "private" %csmethodmodifiers std::array::setitem "private" %csmethodmodifiers std::array::size "private" namespace std { template class array { SWIG_STD_ARRAY_INTERNAL(T, N) }; } swig-4.0.1/Lib/csharp/arrays_csharp.i0000644000175000017500000001623613527063513017361 0ustar williamwilliam/* ----------------------------------------------------------------------------- * arrays_csharp.i * * This file contains a two approaches to marshaling arrays. The first uses * default p/invoke marshaling and the second uses pinning of the arrays. * * Default marshaling approach * ---------------------------- * Array typemaps using default p/invoke marshaling. The data is copied to a separately * allocated buffer when passing over the managed-native boundary. * * There are separate typemaps for in, out and inout arrays to enable avoiding * unnecessary copying. * * Example usage: * * %include "arrays_csharp.i" * %apply int INPUT[] { int* sourceArray } * %apply int OUTPUT[] { int* targetArray } * void myArrayCopy( int* sourceArray, int* targetArray, int nitems ); * * %apply int INOUT[] { int* array1, int *array2 } * void myArraySwap( int* array1, int* array2, int nitems ); * * If handling large arrays you should consider using the pinning array typemaps * described next. * * Pinning approach * ---------------- * Array typemaps using pinning. These typemaps pin the managed array given * as parameter and pass a pointer to it to the c/c++ side. This is very * efficient as no copying is done (unlike in the default array marshaling), * but it makes garbage collection more difficult. When considering using * these typemaps, think carefully whether you have callbacks that may cause * the control to re-enter the managed side from within the call (and produce * garbage for the gc) or whether other threads may produce enough garbage to * trigger gc while the call is being executed. In those cases it may be * wiser to use the default marshaling typemaps. * * Please note that when using fixed arrays, you have to mark your corresponding * module class method unsafe using * %csmethodmodifiers "public unsafe" * (the visibility of the method is up to you). * * Example usage: * * %include "arrays_csharp.i" * %apply int FIXED[] { int* sourceArray, int *targetArray } * %csmethodmodifiers myArrayCopy "public unsafe"; * void myArrayCopy( int *sourceArray, int* targetArray, int nitems ); * * ----------------------------------------------------------------------------- */ %define CSHARP_ARRAYS( CTYPE, CSTYPE ) // input only arrays %typemap(ctype) CTYPE INPUT[] "CTYPE*" %typemap(cstype) CTYPE INPUT[] "CSTYPE[]" %typemap(imtype, inattributes="[global::System.Runtime.InteropServices.In, global::System.Runtime.InteropServices.MarshalAs(global::System.Runtime.InteropServices.UnmanagedType.LPArray)]") CTYPE INPUT[] "CSTYPE[]" %typemap(csin) CTYPE INPUT[] "$csinput" %typemap(in) CTYPE INPUT[] "$1 = $input;" %typemap(freearg) CTYPE INPUT[] "" %typemap(argout) CTYPE INPUT[] "" // output only arrays %typemap(ctype) CTYPE OUTPUT[] "CTYPE*" %typemap(cstype) CTYPE OUTPUT[] "CSTYPE[]" %typemap(imtype, inattributes="[global::System.Runtime.InteropServices.Out, global::System.Runtime.InteropServices.MarshalAs(global::System.Runtime.InteropServices.UnmanagedType.LPArray)]") CTYPE OUTPUT[] "CSTYPE[]" %typemap(csin) CTYPE OUTPUT[] "$csinput" %typemap(in) CTYPE OUTPUT[] "$1 = $input;" %typemap(freearg) CTYPE OUTPUT[] "" %typemap(argout) CTYPE OUTPUT[] "" // inout arrays %typemap(ctype) CTYPE INOUT[] "CTYPE*" %typemap(cstype) CTYPE INOUT[] "CSTYPE[]" %typemap(imtype, inattributes="[global::System.Runtime.InteropServices.In, global::System.Runtime.InteropServices.Out, global::System.Runtime.InteropServices.MarshalAs(global::System.Runtime.InteropServices.UnmanagedType.LPArray)]") CTYPE INOUT[] "CSTYPE[]" %typemap(csin) CTYPE INOUT[] "$csinput" %typemap(in) CTYPE INOUT[] "$1 = $input;" %typemap(freearg) CTYPE INOUT[] "" %typemap(argout) CTYPE INOUT[] "" %enddef // CSHARP_ARRAYS CSHARP_ARRAYS(signed char, sbyte) CSHARP_ARRAYS(unsigned char, byte) CSHARP_ARRAYS(short, short) CSHARP_ARRAYS(unsigned short, ushort) CSHARP_ARRAYS(int, int) CSHARP_ARRAYS(unsigned int, uint) // FIXME - on Unix 64 bit, long is 8 bytes but is 4 bytes on Windows 64 bit. // How can this be handled sensibly? // See e.g. http://www.xml.com/ldd/chapter/book/ch10.html CSHARP_ARRAYS(long, int) CSHARP_ARRAYS(unsigned long, uint) CSHARP_ARRAYS(long long, long) CSHARP_ARRAYS(unsigned long long, ulong) CSHARP_ARRAYS(float, float) CSHARP_ARRAYS(double, double) // By default C# will marshal bools as 4 bytes // UnmanagedType.I1 will change this to 1 byte // FIXME - When running on mono ArraySubType appears to be ignored and bools will be marshalled as 4-byte // https://github.com/mono/mono/issues/15592 // input only arrays %typemap(ctype) bool INPUT[] "bool*" %typemap(cstype) bool INPUT[] "bool[]" %typemap(imtype, inattributes="[global::System.Runtime.InteropServices.In, global::System.Runtime.InteropServices.MarshalAs(global::System.Runtime.InteropServices.UnmanagedType.LPArray,ArraySubType=System.Runtime.InteropServices.UnmanagedType.I1)]") bool INPUT[] "bool[]" %typemap(csin) bool INPUT[] "$csinput" %typemap(in) bool INPUT[] %{ $1 = $input; %} %typemap(freearg) bool INPUT[] "" %typemap(argout) bool INPUT[] "" // output only arrays %typemap(ctype) bool OUTPUT[] "bool*" %typemap(cstype) bool OUTPUT[] "bool[]" %typemap(imtype, inattributes="[global::System.Runtime.InteropServices.Out, global::System.Runtime.InteropServices.MarshalAs(global::System.Runtime.InteropServices.UnmanagedType.LPArray,ArraySubType=System.Runtime.InteropServices.UnmanagedType.I1)]") bool OUTPUT[] "bool[]" %typemap(csin) bool OUTPUT[] "$csinput" %typemap(in) bool OUTPUT[] %{ $1 = $input; %} %typemap(freearg) bool OUTPUT[] "" %typemap(argout) bool OUTPUT[] "" // inout arrays %typemap(ctype) bool INOUT[] "bool*" %typemap(cstype) bool INOUT[] "bool[]" %typemap(imtype, inattributes="[global::System.Runtime.InteropServices.In, global::System.Runtime.InteropServices.Out, global::System.Runtime.InteropServices.MarshalAs(global::System.Runtime.InteropServices.UnmanagedType.LPArray,ArraySubType=System.Runtime.InteropServices.UnmanagedType.I1)]") bool INOUT[] "bool[]" %typemap(csin) bool INOUT[] "$csinput" %typemap(in) bool INOUT[] %{ $1 = $input; %} %typemap(freearg) bool INOUT[] "" %typemap(argout) bool INOUT[] "" %define CSHARP_ARRAYS_FIXED( CTYPE, CSTYPE ) %typemap(ctype) CTYPE FIXED[] "CTYPE*" %typemap(imtype) CTYPE FIXED[] "global::System.IntPtr" %typemap(cstype) CTYPE FIXED[] "CSTYPE[]" %typemap(csin, pre= " fixed ( CSTYPE* swig_ptrTo_$csinput = $csinput ) {", terminator=" }") CTYPE FIXED[] "(global::System.IntPtr)swig_ptrTo_$csinput" %typemap(in) CTYPE FIXED[] "$1 = $input;" %typemap(freearg) CTYPE FIXED[] "" %typemap(argout) CTYPE FIXED[] "" %enddef // CSHARP_ARRAYS_FIXED CSHARP_ARRAYS_FIXED(signed char, sbyte) CSHARP_ARRAYS_FIXED(unsigned char, byte) CSHARP_ARRAYS_FIXED(short, short) CSHARP_ARRAYS_FIXED(unsigned short, ushort) CSHARP_ARRAYS_FIXED(int, int) CSHARP_ARRAYS_FIXED(unsigned int, uint) CSHARP_ARRAYS_FIXED(long, int) CSHARP_ARRAYS_FIXED(unsigned long, uint) CSHARP_ARRAYS_FIXED(long long, long) CSHARP_ARRAYS_FIXED(unsigned long long, ulong) CSHARP_ARRAYS_FIXED(float, float) CSHARP_ARRAYS_FIXED(double, double) CSHARP_ARRAYS_FIXED(bool, bool) swig-4.0.1/Lib/csharp/swigtype_inout.i0000644000175000017500000000267613527063513017614 0ustar williamwilliam/* ----------------------------------------------------------------------------- * swigtype_inout.i * * Pointer pointer and pointer reference handling typemap library for non-primitive types * * These mappings provide support for input/output arguments and common * uses for C/C++ pointer references and pointer to pointers. * * These are named typemaps (OUTPUT) and can be used like any named typemap. * Alternatively they can be made the default by using %apply: * %apply SWIGTYPE *& OUTPUT { SWIGTYPE *& } * ----------------------------------------------------------------------------- */ /* * OUTPUT typemaps. Example usage wrapping: * * void f(XXX *& x) { x = new XXX(111); } * * would be: * * XXX x = null; * f(out x); * // use x * x.Dispose(); // manually clear memory or otherwise leave out and leave it to the garbage collector */ %typemap(ctype) SWIGTYPE *& OUTPUT "void **" %typemap(imtype, out="global::System.IntPtr") SWIGTYPE *& OUTPUT "out global::System.IntPtr" %typemap(cstype) SWIGTYPE *& OUTPUT "out $*csclassname" %typemap(csin, pre=" global::System.IntPtr cPtr_$csinput = global::System.IntPtr.Zero;", post=" $csinput = (cPtr_$csinput == global::System.IntPtr.Zero) ? null : new $*csclassname(cPtr_$csinput, true);", cshin="out $csinput") SWIGTYPE *& OUTPUT "out cPtr_$csinput" %typemap(in) SWIGTYPE *& OUTPUT %{ $1 = ($1_ltype)$input; %} %typemap(freearg) SWIGTYPE *& OUTPUT "" swig-4.0.1/Lib/csharp/csharp.swg0000644000175000017500000011752513527063513016353 0ustar williamwilliam/* ----------------------------------------------------------------------------- * csharp.swg * * C# typemaps * ----------------------------------------------------------------------------- */ %include /* The ctype, imtype and cstype typemaps work together and so there should be one of each. * The ctype typemap contains the PInvoke type used in the PInvoke (C/C++) code. * The imtype typemap contains the C# type used in the intermediary class. * The cstype typemap contains the C# type used in the C# proxy classes, type wrapper classes and module class. */ /* SWIG 3 no longer inserts using directives into generated C# code. For backwards compatibility, the SWIG2_CSHARP macro can be defined to have SWIG 3 generate using directives similar to those generated by SWIG 2. */ #ifdef SWIG2_CSHARP %typemap(csimports) SWIGTYPE, SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE [], SWIGTYPE (CLASS::*) "\nusing global::System;\nusing global::System.Runtime.InteropServices;\n" %pragma(csharp) moduleimports=%{ using global::System; using global::System.Runtime.InteropServices; %} %pragma(csharp) imclassimports=%{ using global::System; using global::System.Runtime.InteropServices; %} #endif /* Fragments */ %fragment("SWIG_PackData", "header") { /* Pack binary data into a string */ SWIGINTERN char * SWIG_PackData(char *c, void *ptr, size_t sz) { static const char hex[17] = "0123456789abcdef"; const unsigned char *u = (unsigned char *) ptr; const unsigned char *eu = u + sz; for (; u != eu; ++u) { unsigned char uu = *u; *(c++) = hex[(uu & 0xf0) >> 4]; *(c++) = hex[uu & 0xf]; } return c; } } %fragment("SWIG_UnPackData", "header") { /* Unpack binary data from a string */ SWIGINTERN const char * SWIG_UnpackData(const char *c, void *ptr, size_t sz) { unsigned char *u = (unsigned char *) ptr; const unsigned char *eu = u + sz; for (; u != eu; ++u) { char d = *(c++); unsigned char uu; if ((d >= '0') && (d <= '9')) uu = ((d - '0') << 4); else if ((d >= 'a') && (d <= 'f')) uu = ((d - ('a'-10)) << 4); else return (char *) 0; d = *(c++); if ((d >= '0') && (d <= '9')) uu |= (d - '0'); else if ((d >= 'a') && (d <= 'f')) uu |= (d - ('a'-10)); else return (char *) 0; *u = uu; } return c; } } /* Primitive types */ %typemap(ctype) bool, const bool & "unsigned int" %typemap(ctype) char, const char & "char" %typemap(ctype) signed char, const signed char & "signed char" %typemap(ctype) unsigned char, const unsigned char & "unsigned char" %typemap(ctype) short, const short & "short" %typemap(ctype) unsigned short, const unsigned short & "unsigned short" %typemap(ctype) int, const int & "int" %typemap(ctype) unsigned int, const unsigned int & "unsigned int" %typemap(ctype) long, const long & "long" %typemap(ctype) unsigned long, const unsigned long & "unsigned long" %typemap(ctype) long long, const long long & "long long" %typemap(ctype) unsigned long long, const unsigned long long & "unsigned long long" %typemap(ctype) float, const float & "float" %typemap(ctype) double, const double & "double" %typemap(ctype) void "void" %typemap(imtype) bool, const bool & "bool" %typemap(imtype) char, const char & "char" %typemap(imtype) signed char, const signed char & "sbyte" %typemap(imtype) unsigned char, const unsigned char & "byte" %typemap(imtype) short, const short & "short" %typemap(imtype) unsigned short, const unsigned short & "ushort" %typemap(imtype) int, const int & "int" %typemap(imtype) unsigned int, const unsigned int & "uint" %typemap(imtype) long, const long & "int" %typemap(imtype) unsigned long, const unsigned long & "uint" %typemap(imtype) long long, const long long & "long" %typemap(imtype) unsigned long long, const unsigned long long & "ulong" %typemap(imtype) float, const float & "float" %typemap(imtype) double, const double & "double" %typemap(imtype) void "void" %typemap(cstype) bool, const bool & "bool" %typemap(cstype) char, const char & "char" %typemap(cstype) signed char, const signed char & "sbyte" %typemap(cstype) unsigned char, const unsigned char & "byte" %typemap(cstype) short, const short & "short" %typemap(cstype) unsigned short, const unsigned short & "ushort" %typemap(cstype) int, const int & "int" %typemap(cstype) unsigned int, const unsigned int & "uint" %typemap(cstype) long, const long & "int" %typemap(cstype) unsigned long, const unsigned long & "uint" %typemap(cstype) long long, const long long & "long" %typemap(cstype) unsigned long long, const unsigned long long & "ulong" %typemap(cstype) float, const float & "float" %typemap(cstype) double, const double & "double" %typemap(cstype) void "void" %typemap(ctype) char *, char *&, char[ANY], char[] "char *" %typemap(imtype) char *, char *&, char[ANY], char[] "string" %typemap(cstype) char *, char *&, char[ANY], char[] "string" /* Non primitive types */ %typemap(ctype) SWIGTYPE "void *" %typemap(imtype, out="global::System.IntPtr") SWIGTYPE "global::System.Runtime.InteropServices.HandleRef" %typemap(cstype) SWIGTYPE "$&csclassname" %typemap(ctype) SWIGTYPE [] "void *" %typemap(imtype, out="global::System.IntPtr") SWIGTYPE [] "global::System.Runtime.InteropServices.HandleRef" %typemap(cstype) SWIGTYPE [] "$csclassname" %typemap(ctype) SWIGTYPE * "void *" %typemap(imtype, out="global::System.IntPtr") SWIGTYPE * "global::System.Runtime.InteropServices.HandleRef" %typemap(cstype) SWIGTYPE * "$csclassname" %typemap(ctype) SWIGTYPE & "void *" %typemap(imtype, out="global::System.IntPtr") SWIGTYPE & "global::System.Runtime.InteropServices.HandleRef" %typemap(cstype) SWIGTYPE & "$csclassname" %typemap(ctype) SWIGTYPE && "void *" %typemap(imtype, out="global::System.IntPtr") SWIGTYPE && "global::System.Runtime.InteropServices.HandleRef" %typemap(cstype) SWIGTYPE && "$csclassname" /* pointer to a class member */ %typemap(ctype) SWIGTYPE (CLASS::*) "char *" %typemap(imtype) SWIGTYPE (CLASS::*) "string" %typemap(cstype) SWIGTYPE (CLASS::*) "$csclassname" /* The following are the in and out typemaps. These are the PInvoke code generating typemaps for converting from C# to C and visa versa. */ /* primitive types */ %typemap(in) bool %{ $1 = $input ? true : false; %} %typemap(directorout) bool %{ $result = $input ? true : false; %} %typemap(csdirectorin) bool "$iminput" %typemap(csdirectorout) bool "$cscall" %typemap(in) char, signed char, unsigned char, short, unsigned short, int, unsigned int, long, unsigned long, long long, unsigned long long, float, double %{ $1 = ($1_ltype)$input; %} %typemap(directorout) char, signed char, unsigned char, short, unsigned short, int, unsigned int, long, unsigned long, long long, unsigned long long, float, double %{ $result = ($1_ltype)$input; %} %typemap(directorin) bool "$input = $1;" %typemap(directorin) char "$input = $1;" %typemap(directorin) signed char "$input = $1;" %typemap(directorin) unsigned char "$input = $1;" %typemap(directorin) short "$input = $1;" %typemap(directorin) unsigned short "$input = $1;" %typemap(directorin) int "$input = $1;" %typemap(directorin) unsigned int "$input = $1;" %typemap(directorin) long "$input = $1;" %typemap(directorin) unsigned long "$input = (unsigned long)$1;" %typemap(directorin) long long "$input = $1;" %typemap(directorin) unsigned long long "$input = $1;" %typemap(directorin) float "$input = $1;" %typemap(directorin) double "$input = $1;" %typemap(csdirectorin) char, signed char, unsigned char, short, unsigned short, int, unsigned int, long, unsigned long, long long, unsigned long long, float, double "$iminput" %typemap(csdirectorout) char, signed char, unsigned char, short, unsigned short, int, unsigned int, long, unsigned long, long long, unsigned long long, float, double "$cscall" %typemap(out) bool %{ $result = $1; %} %typemap(out) char %{ $result = $1; %} %typemap(out) signed char %{ $result = $1; %} %typemap(out) unsigned char %{ $result = $1; %} %typemap(out) short %{ $result = $1; %} %typemap(out) unsigned short %{ $result = $1; %} %typemap(out) int %{ $result = $1; %} %typemap(out) unsigned int %{ $result = $1; %} %typemap(out) long %{ $result = $1; %} %typemap(out) unsigned long %{ $result = (unsigned long)$1; %} %typemap(out) long long %{ $result = $1; %} %typemap(out) unsigned long long %{ $result = $1; %} %typemap(out) float %{ $result = $1; %} %typemap(out) double %{ $result = $1; %} /* char * - treat as String */ %typemap(in) char * %{ $1 = ($1_ltype)$input; %} %typemap(out) char * %{ $result = SWIG_csharp_string_callback((const char *)$1); %} %typemap(directorout, warning=SWIGWARN_TYPEMAP_DIRECTOROUT_PTR_MSG) char * %{ $result = ($1_ltype)$input; %} %typemap(directorin) char * %{ $input = SWIG_csharp_string_callback((const char *)$1); %} %typemap(csdirectorin) char * "$iminput" %typemap(csdirectorout) char * "$cscall" /* char *& - treat as String */ %typemap(in) char *& ($*1_ltype temp = 0) %{ temp = ($*1_ltype)$input; $1 = &temp; %} %typemap(out) char *& %{ if ($1) $result = SWIG_csharp_string_callback((const char *)*$1); %} %typemap(out, null="") void "" %typemap(csdirectorin) void "$iminput" %typemap(csdirectorout) void "$cscall" %typemap(directorin) void "" /* primitive types by const reference */ %typemap(in) const bool & ($*1_ltype temp) %{ temp = $input ? true : false; $1 = &temp; %} %typemap(directorout,warning=SWIGWARN_TYPEMAP_THREAD_UNSAFE_MSG) const bool & %{ static $*1_ltype temp; temp = $input ? true : false; $result = &temp; %} %typemap(csdirectorin) const bool & "$iminput" %typemap(csdirectorout) const bool & "$cscall" %typemap(in) const char & ($*1_ltype temp), const signed char & ($*1_ltype temp), const unsigned char & ($*1_ltype temp), const short & ($*1_ltype temp), const unsigned short & ($*1_ltype temp), const int & ($*1_ltype temp), const unsigned int & ($*1_ltype temp), const long & ($*1_ltype temp), const unsigned long & ($*1_ltype temp), const long long & ($*1_ltype temp), const unsigned long long & ($*1_ltype temp), const float & ($*1_ltype temp), const double & ($*1_ltype temp) %{ temp = ($*1_ltype)$input; $1 = &temp; %} %typemap(directorout,warning=SWIGWARN_TYPEMAP_THREAD_UNSAFE_MSG) const char &, const signed char &, const unsigned char &, const short &, const unsigned short &, const int &, const unsigned int &, const long &, const unsigned long &, const long long &, const unsigned long long &, const float &, const double & %{ static $*1_ltype temp; temp = ($*1_ltype)$input; $result = &temp; %} %typemap(directorin) const bool & "$input = $1;" %typemap(directorin) const char & "$input = $1;" %typemap(directorin) const signed char & "$input = $1;" %typemap(directorin) const unsigned char & "$input = $1;" %typemap(directorin) const short & "$input = $1;" %typemap(directorin) const unsigned short & "$input = $1;" %typemap(directorin) const int & "$input = $1;" %typemap(directorin) const unsigned int & "$input = $1;" %typemap(directorin) const long & "$input = $1;" %typemap(directorin) const unsigned long & "$input = $1;" %typemap(directorin) const long long & "$input = $1;" %typemap(directorin) const unsigned long long & "$input = $1;" %typemap(directorin) const float & "$input = $1;" %typemap(directorin) const double & "$input = $1;" %typemap(csdirectorin) const char & ($*1_ltype temp), const signed char & ($*1_ltype temp), const unsigned char & ($*1_ltype temp), const short & ($*1_ltype temp), const unsigned short & ($*1_ltype temp), const int & ($*1_ltype temp), const unsigned int & ($*1_ltype temp), const long & ($*1_ltype temp), const unsigned long & ($*1_ltype temp), const long long & ($*1_ltype temp), const unsigned long long & ($*1_ltype temp), const float & ($*1_ltype temp), const double & ($*1_ltype temp) "$iminput" %typemap(csdirectorout) const char & ($*1_ltype temp), const signed char & ($*1_ltype temp), const unsigned char & ($*1_ltype temp), const short & ($*1_ltype temp), const unsigned short & ($*1_ltype temp), const int & ($*1_ltype temp), const unsigned int & ($*1_ltype temp), const long & ($*1_ltype temp), const unsigned long & ($*1_ltype temp), const long long & ($*1_ltype temp), const unsigned long long & ($*1_ltype temp), const float & ($*1_ltype temp), const double & ($*1_ltype temp) "$cscall" %typemap(out) const bool & %{ $result = *$1; %} %typemap(out) const char & %{ $result = *$1; %} %typemap(out) const signed char & %{ $result = *$1; %} %typemap(out) const unsigned char & %{ $result = *$1; %} %typemap(out) const short & %{ $result = *$1; %} %typemap(out) const unsigned short & %{ $result = *$1; %} %typemap(out) const int & %{ $result = *$1; %} %typemap(out) const unsigned int & %{ $result = *$1; %} %typemap(out) const long & %{ $result = *$1; %} %typemap(out) const unsigned long & %{ $result = (unsigned long)*$1; %} %typemap(out) const long long & %{ $result = *$1; %} %typemap(out) const unsigned long long & %{ $result = *$1; %} %typemap(out) const float & %{ $result = *$1; %} %typemap(out) const double & %{ $result = *$1; %} /* Default handling. Object passed by value. Convert to a pointer */ %typemap(in, canthrow=1) SWIGTYPE ($&1_type argp) %{ argp = ($&1_ltype)$input; if (!argp) { SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "Attempt to dereference null $1_type", 0); return $null; } $1 = *argp; %} %typemap(directorout) SWIGTYPE %{ if (!$input) { SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "Unexpected null return for type $1_type", 0); return $null; } $result = *($&1_ltype)$input; %} %typemap(out) SWIGTYPE #ifdef __cplusplus %{ $result = new $1_ltype((const $1_ltype &)$1); %} #else { $&1_ltype $1ptr = ($&1_ltype) malloc(sizeof($1_ltype)); memmove($1ptr, &$1, sizeof($1_type)); $result = $1ptr; } #endif %typemap(directorin) SWIGTYPE %{ $input = (void *)new $1_ltype((const $1_ltype &)$1); %} %typemap(csdirectorin) SWIGTYPE "new $&csclassname($iminput, true)" %typemap(csdirectorout) SWIGTYPE "$&csclassname.getCPtr($cscall).Handle" /* Generic pointers and references */ %typemap(in) SWIGTYPE * %{ $1 = ($1_ltype)$input; %} %typemap(in, fragment="SWIG_UnPackData") SWIGTYPE (CLASS::*) %{ SWIG_UnpackData($input, (void *)&$1, sizeof($1)); %} %typemap(in, canthrow=1) SWIGTYPE & %{ $1 = ($1_ltype)$input; if (!$1) { SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "$1_type type is null", 0); return $null; } %} %typemap(in, canthrow=1) SWIGTYPE && %{ $1 = ($1_ltype)$input; if (!$1) { SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "$1_type type is null", 0); return $null; } %} %typemap(out) SWIGTYPE * %{ $result = (void *)$1; %} %typemap(out, fragment="SWIG_PackData") SWIGTYPE (CLASS::*) %{ char buf[128]; char *data = SWIG_PackData(buf, (void *)&$1, sizeof($1)); *data = '\0'; $result = SWIG_csharp_string_callback(buf); %} %typemap(out) SWIGTYPE & %{ $result = (void *)$1; %} %typemap(out) SWIGTYPE && %{ $result = (void *)$1; %} %typemap(directorout, warning=SWIGWARN_TYPEMAP_DIRECTOROUT_PTR_MSG) SWIGTYPE * %{ $result = ($1_ltype)$input; %} %typemap(directorout, warning=SWIGWARN_TYPEMAP_DIRECTOROUT_PTR_MSG) SWIGTYPE (CLASS::*) %{ $result = ($1_ltype)$input; %} %typemap(directorin) SWIGTYPE * %{ $input = (void *) $1; %} %typemap(directorin) SWIGTYPE (CLASS::*) %{ $input = (void *) $1; %} %typemap(directorout, warning=SWIGWARN_TYPEMAP_DIRECTOROUT_PTR_MSG) SWIGTYPE & %{ if (!$input) { SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "Unexpected null return for type $1_type", 0); return $null; } $result = ($1_ltype)$input; %} %typemap(directorout, warning=SWIGWARN_TYPEMAP_DIRECTOROUT_PTR_MSG) SWIGTYPE && %{ if (!$input) { SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "Unexpected null return for type $1_type", 0); return $null; } $result = ($1_ltype)$input; %} %typemap(directorin) SWIGTYPE & %{ $input = ($1_ltype) &$1; %} %typemap(directorin) SWIGTYPE && %{ $input = ($1_ltype) &$1; %} %typemap(csdirectorin) SWIGTYPE *, SWIGTYPE (CLASS::*) "($iminput == global::System.IntPtr.Zero) ? null : new $csclassname($iminput, false)" %typemap(csdirectorin) SWIGTYPE & "new $csclassname($iminput, false)" %typemap(csdirectorin) SWIGTYPE && "new $csclassname($iminput, false)" %typemap(csdirectorout) SWIGTYPE *, SWIGTYPE (CLASS::*), SWIGTYPE &, SWIGTYPE && "$csclassname.getCPtr($cscall).Handle" /* Default array handling */ %typemap(in) SWIGTYPE [] %{ $1 = ($1_ltype)$input; %} %typemap(out) SWIGTYPE [] %{ $result = $1; %} /* char arrays - treat as String */ %typemap(in) char[ANY], char[] %{ $1 = ($1_ltype)$input; %} %typemap(out) char[ANY], char[] %{ $result = SWIG_csharp_string_callback((const char *)$1); %} %typemap(directorout) char[ANY], char[] %{ $result = ($1_ltype)$input; %} %typemap(directorin) char[ANY], char[] %{ $input = SWIG_csharp_string_callback((const char *)$1); %} %typemap(csdirectorin) char[ANY], char[] "$iminput" %typemap(csdirectorout) char[ANY], char[] "$cscall" /* Typecheck typemaps - The purpose of these is merely to issue a warning for overloaded C++ functions * that cannot be overloaded in C# as more than one C++ type maps to a single C# type */ %typecheck(SWIG_TYPECHECK_BOOL) bool, const bool & "" %typecheck(SWIG_TYPECHECK_CHAR) char, const char & "" %typecheck(SWIG_TYPECHECK_INT8) signed char, const signed char & "" %typecheck(SWIG_TYPECHECK_UINT8) unsigned char, const unsigned char & "" %typecheck(SWIG_TYPECHECK_INT16) short, const short & "" %typecheck(SWIG_TYPECHECK_UINT16) unsigned short, const unsigned short & "" %typecheck(SWIG_TYPECHECK_INT32) int, long, const int &, const long & "" %typecheck(SWIG_TYPECHECK_UINT32) unsigned int, unsigned long, const unsigned int &, const unsigned long & "" %typecheck(SWIG_TYPECHECK_INT64) long long, const long long & "" %typecheck(SWIG_TYPECHECK_UINT64) unsigned long long, const unsigned long long & "" %typecheck(SWIG_TYPECHECK_FLOAT) float, const float & "" %typecheck(SWIG_TYPECHECK_DOUBLE) double, const double & "" %typecheck(SWIG_TYPECHECK_STRING) char *, char *&, char[ANY], char[] "" %typecheck(SWIG_TYPECHECK_POINTER) SWIGTYPE, SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE *const&, SWIGTYPE [], SWIGTYPE (CLASS::*) "" /* Exception handling */ %typemap(throws, canthrow=1) int, long, short, unsigned int, unsigned long, unsigned short %{ char error_msg[256]; sprintf(error_msg, "C++ $1_type exception thrown, value: %d", $1); SWIG_CSharpSetPendingException(SWIG_CSharpApplicationException, error_msg); return $null; %} %typemap(throws, canthrow=1) SWIGTYPE, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE *, SWIGTYPE [ANY] %{ (void)$1; SWIG_CSharpSetPendingException(SWIG_CSharpApplicationException, "C++ $1_type exception thrown"); return $null; %} %typemap(throws, canthrow=1) char * %{ SWIG_CSharpSetPendingException(SWIG_CSharpApplicationException, $1); return $null; %} /* Typemaps for code generation in proxy classes and C# type wrapper classes */ /* The csin typemap is used for converting function parameter types from the type * used in the proxy, module or type wrapper class to the type used in the PInvoke class. */ %typemap(csin) bool, const bool &, char, const char &, signed char, const signed char &, unsigned char, const unsigned char &, short, const short &, unsigned short, const unsigned short &, int, const int &, unsigned int, const unsigned int &, long, const long &, unsigned long, const unsigned long &, long long, const long long &, unsigned long long, const unsigned long long &, float, const float &, double, const double & "$csinput" %typemap(csin) char *, char *&, char[ANY], char[] "$csinput" %typemap(csin) SWIGTYPE "$&csclassname.getCPtr($csinput)" %typemap(csin) SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE [] "$csclassname.getCPtr($csinput)" %typemap(csin) SWIGTYPE (CLASS::*) "$csclassname.getCMemberPtr($csinput)" /* The csout typemap is used for converting function return types from the return type * used in the PInvoke class to the type returned by the proxy, module or type wrapper class. * The $excode special variable is replaced by the excode typemap attribute code if the * method can throw any exceptions from unmanaged code, otherwise replaced by nothing. */ // Macro used by the $excode special variable %define SWIGEXCODE "\n if ($imclassname.SWIGPendingException.Pending) throw $imclassname.SWIGPendingException.Retrieve();" %enddef %define SWIGEXCODE2 "\n if ($imclassname.SWIGPendingException.Pending) throw $imclassname.SWIGPendingException.Retrieve();" %enddef %typemap(csout, excode=SWIGEXCODE) bool, const bool & { bool ret = $imcall;$excode return ret; } %typemap(csout, excode=SWIGEXCODE) char, const char & { char ret = $imcall;$excode return ret; } %typemap(csout, excode=SWIGEXCODE) signed char, const signed char & { sbyte ret = $imcall;$excode return ret; } %typemap(csout, excode=SWIGEXCODE) unsigned char, const unsigned char & { byte ret = $imcall;$excode return ret; } %typemap(csout, excode=SWIGEXCODE) short, const short & { short ret = $imcall;$excode return ret; } %typemap(csout, excode=SWIGEXCODE) unsigned short, const unsigned short & { ushort ret = $imcall;$excode return ret; } %typemap(csout, excode=SWIGEXCODE) int, const int & { int ret = $imcall;$excode return ret; } %typemap(csout, excode=SWIGEXCODE) unsigned int, const unsigned int & { uint ret = $imcall;$excode return ret; } %typemap(csout, excode=SWIGEXCODE) long, const long & { int ret = $imcall;$excode return ret; } %typemap(csout, excode=SWIGEXCODE) unsigned long, const unsigned long & { uint ret = $imcall;$excode return ret; } %typemap(csout, excode=SWIGEXCODE) long long, const long long & { long ret = $imcall;$excode return ret; } %typemap(csout, excode=SWIGEXCODE) unsigned long long, const unsigned long long & { ulong ret = $imcall;$excode return ret; } %typemap(csout, excode=SWIGEXCODE) float, const float & { float ret = $imcall;$excode return ret; } %typemap(csout, excode=SWIGEXCODE) double, const double & { double ret = $imcall;$excode return ret; } %typemap(csout, excode=SWIGEXCODE) char *, char *&, char[ANY], char[] { string ret = $imcall;$excode return ret; } %typemap(csout, excode=SWIGEXCODE) void { $imcall;$excode } %typemap(csout, excode=SWIGEXCODE) SWIGTYPE { $&csclassname ret = new $&csclassname($imcall, true);$excode return ret; } %typemap(csout, excode=SWIGEXCODE) SWIGTYPE & { $csclassname ret = new $csclassname($imcall, $owner);$excode return ret; } %typemap(csout, excode=SWIGEXCODE) SWIGTYPE && { $csclassname ret = new $csclassname($imcall, $owner);$excode return ret; } %typemap(csout, excode=SWIGEXCODE) SWIGTYPE *, SWIGTYPE [] { global::System.IntPtr cPtr = $imcall; $csclassname ret = (cPtr == global::System.IntPtr.Zero) ? null : new $csclassname(cPtr, $owner);$excode return ret; } %typemap(csout, excode=SWIGEXCODE) SWIGTYPE (CLASS::*) { string cMemberPtr = $imcall; $csclassname ret = (cMemberPtr == null) ? null : new $csclassname(cMemberPtr, $owner);$excode return ret; } /* Properties */ %typemap(csvarin, excode=SWIGEXCODE2) SWIGTYPE, SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE [], SWIGTYPE (CLASS::*) %{ set { $imcall;$excode } %} %typemap(csvarin, excode=SWIGEXCODE2) char *, char *&, char[ANY], char[] %{ set { $imcall;$excode } %} %typemap(csvarout, excode=SWIGEXCODE2) bool, const bool & %{ get { bool ret = $imcall;$excode return ret; } %} %typemap(csvarout, excode=SWIGEXCODE2) char, const char & %{ get { char ret = $imcall;$excode return ret; } %} %typemap(csvarout, excode=SWIGEXCODE2) signed char, const signed char & %{ get { sbyte ret = $imcall;$excode return ret; } %} %typemap(csvarout, excode=SWIGEXCODE2) unsigned char, const unsigned char & %{ get { byte ret = $imcall;$excode return ret; } %} %typemap(csvarout, excode=SWIGEXCODE2) short, const short & %{ get { short ret = $imcall;$excode return ret; } %} %typemap(csvarout, excode=SWIGEXCODE2) unsigned short, const unsigned short & %{ get { ushort ret = $imcall;$excode return ret; } %} %typemap(csvarout, excode=SWIGEXCODE2) int, const int & %{ get { int ret = $imcall;$excode return ret; } %} %typemap(csvarout, excode=SWIGEXCODE2) unsigned int, const unsigned int & %{ get { uint ret = $imcall;$excode return ret; } %} %typemap(csvarout, excode=SWIGEXCODE2) long, const long & %{ get { int ret = $imcall;$excode return ret; } %} %typemap(csvarout, excode=SWIGEXCODE2) unsigned long, const unsigned long & %{ get { uint ret = $imcall;$excode return ret; } %} %typemap(csvarout, excode=SWIGEXCODE2) long long, const long long & %{ get { long ret = $imcall;$excode return ret; } %} %typemap(csvarout, excode=SWIGEXCODE2) unsigned long long, const unsigned long long & %{ get { ulong ret = $imcall;$excode return ret; } %} %typemap(csvarout, excode=SWIGEXCODE2) float, const float & %{ get { float ret = $imcall;$excode return ret; } %} %typemap(csvarout, excode=SWIGEXCODE2) double, const double & %{ get { double ret = $imcall;$excode return ret; } %} %typemap(csvarout, excode=SWIGEXCODE2) char *, char *&, char[ANY], char[] %{ get { string ret = $imcall;$excode return ret; } %} %typemap(csvarout, excode=SWIGEXCODE2) void %{ get { $imcall;$excode } %} %typemap(csvarout, excode=SWIGEXCODE2) SWIGTYPE %{ get { $&csclassname ret = new $&csclassname($imcall, true);$excode return ret; } %} %typemap(csvarout, excode=SWIGEXCODE2) SWIGTYPE & %{ get { $csclassname ret = new $csclassname($imcall, $owner);$excode return ret; } %} %typemap(csvarout, excode=SWIGEXCODE2) SWIGTYPE && %{ get { $csclassname ret = new $csclassname($imcall, $owner);$excode return ret; } %} %typemap(csvarout, excode=SWIGEXCODE2) SWIGTYPE *, SWIGTYPE [] %{ get { global::System.IntPtr cPtr = $imcall; $csclassname ret = (cPtr == global::System.IntPtr.Zero) ? null : new $csclassname(cPtr, $owner);$excode return ret; } %} %typemap(csvarout, excode=SWIGEXCODE2) SWIGTYPE (CLASS::*) %{ get { string cMemberPtr = $imcall; $csclassname ret = (cMemberPtr == null) ? null : new $csclassname(cMemberPtr, $owner);$excode return ret; } %} /* Pointer reference typemaps */ %typemap(ctype) SWIGTYPE *const& "void *" %typemap(imtype, out="global::System.IntPtr") SWIGTYPE *const& "global::System.Runtime.InteropServices.HandleRef" %typemap(cstype) SWIGTYPE *const& "$*csclassname" %typemap(csin) SWIGTYPE *const& "$*csclassname.getCPtr($csinput)" %typemap(csout, excode=SWIGEXCODE) SWIGTYPE *const& { global::System.IntPtr cPtr = $imcall; $*csclassname ret = (cPtr == global::System.IntPtr.Zero) ? null : new $*csclassname(cPtr, $owner);$excode return ret; } %typemap(csvarout, excode=SWIGEXCODE) SWIGTYPE *const& %{ get { global::System.IntPtr cPtr = $imcall; $*csclassname ret = (cPtr == global::System.IntPtr.Zero) ? null : new $*csclassname(cPtr, $owner);$excode return ret; } %} %typemap(in) SWIGTYPE *const& ($*1_ltype temp = 0) %{ temp = ($*1_ltype)$input; $1 = ($1_ltype)&temp; %} %typemap(out) SWIGTYPE *const& %{ $result = (void *)*$1; %} %typemap(directorin) SWIGTYPE *const& %{ $input = (void *) $1; %} %typemap(directorout, warning=SWIGWARN_TYPEMAP_THREAD_UNSAFE_MSG) SWIGTYPE *const& %{ static $*1_ltype swig_temp; swig_temp = ($*1_ltype)$input; $result = &swig_temp; %} %typemap(csdirectorin) SWIGTYPE *const& "($iminput == global::System.IntPtr.Zero) ? null : new $*csclassname($iminput, false)" %typemap(csdirectorout) SWIGTYPE *const& "$*csclassname.getCPtr($cscall).Handle" /* Marshal C/C++ pointer to global::System.IntPtr */ %typemap(ctype) void *VOID_INT_PTR "void *" %typemap(imtype) void *VOID_INT_PTR "global::System.IntPtr" %typemap(cstype) void *VOID_INT_PTR "global::System.IntPtr" %typemap(in) void *VOID_INT_PTR %{ $1 = ($1_ltype)$input; %} %typemap(out) void *VOID_INT_PTR %{ $result = (void *)$1; %} %typemap(csin) void *VOID_INT_PTR "$csinput" %typemap(csout, excode=SWIGEXCODE) void *VOID_INT_PTR { global::System.IntPtr ret = $imcall;$excode return ret; } %typemap(csdirectorin) void *VOID_INT_PTR "$iminput" %typemap(csdirectorout) void *VOID_INT_PTR "$cscall" /* Typemaps used for the generation of proxy and type wrapper class code */ %typemap(csbase) SWIGTYPE, SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE [], SWIGTYPE (CLASS::*) "" %typemap(csclassmodifiers) SWIGTYPE, SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE [], SWIGTYPE (CLASS::*) "public class" %typemap(cscode) SWIGTYPE, SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE [], SWIGTYPE (CLASS::*) "" %typemap(csinterfaces) SWIGTYPE "global::System.IDisposable" %typemap(csinterfaces) SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE [], SWIGTYPE (CLASS::*) "" %typemap(csinterfaces_derived) SWIGTYPE, SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE [], SWIGTYPE (CLASS::*) "" // csbody typemaps... these are in macros so that the visibility of the methods can be easily changed by users. %define SWIG_CSBODY_PROXY(PTRCTOR_VISIBILITY, CPTR_VISIBILITY, TYPE...) // Proxy classes (base classes, ie, not derived classes) %typemap(csbody) TYPE %{ private global::System.Runtime.InteropServices.HandleRef swigCPtr; protected bool swigCMemOwn; PTRCTOR_VISIBILITY $csclassname(global::System.IntPtr cPtr, bool cMemoryOwn) { swigCMemOwn = cMemoryOwn; swigCPtr = new global::System.Runtime.InteropServices.HandleRef(this, cPtr); } CPTR_VISIBILITY static global::System.Runtime.InteropServices.HandleRef getCPtr($csclassname obj) { return (obj == null) ? new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero) : obj.swigCPtr; } %} // Derived proxy classes %typemap(csbody_derived) TYPE %{ private global::System.Runtime.InteropServices.HandleRef swigCPtr; PTRCTOR_VISIBILITY $csclassname(global::System.IntPtr cPtr, bool cMemoryOwn) : base($imclassname.$csclazznameSWIGUpcast(cPtr), cMemoryOwn) { swigCPtr = new global::System.Runtime.InteropServices.HandleRef(this, cPtr); } CPTR_VISIBILITY static global::System.Runtime.InteropServices.HandleRef getCPtr($csclassname obj) { return (obj == null) ? new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero) : obj.swigCPtr; } %} %enddef %define SWIG_CSBODY_TYPEWRAPPER(PTRCTOR_VISIBILITY, DEFAULTCTOR_VISIBILITY, CPTR_VISIBILITY, TYPE...) // Typewrapper classes %typemap(csbody) TYPE *, TYPE &, TYPE &&, TYPE [] %{ private global::System.Runtime.InteropServices.HandleRef swigCPtr; PTRCTOR_VISIBILITY $csclassname(global::System.IntPtr cPtr, bool futureUse) { swigCPtr = new global::System.Runtime.InteropServices.HandleRef(this, cPtr); } DEFAULTCTOR_VISIBILITY $csclassname() { swigCPtr = new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero); } CPTR_VISIBILITY static global::System.Runtime.InteropServices.HandleRef getCPtr($csclassname obj) { return (obj == null) ? new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero) : obj.swigCPtr; } %} %typemap(csbody) TYPE (CLASS::*) %{ private string swigCMemberPtr; PTRCTOR_VISIBILITY $csclassname(string cMemberPtr, bool futureUse) { swigCMemberPtr = cMemberPtr; } DEFAULTCTOR_VISIBILITY $csclassname() { swigCMemberPtr = null; } CPTR_VISIBILITY static string getCMemberPtr($csclassname obj) { return obj.swigCMemberPtr; } %} %enddef /* Set the default csbody typemaps to use internal visibility. Use the macros to change to public if using multiple modules. */ SWIG_CSBODY_PROXY(internal, internal, SWIGTYPE) SWIG_CSBODY_TYPEWRAPPER(internal, protected, internal, SWIGTYPE) %typemap(csdispose) SWIGTYPE %{ ~$csclassname() { Dispose(false); } public void Dispose() { Dispose(true); global::System.GC.SuppressFinalize(this); } %} %typemap(csdispose_derived) SWIGTYPE "" %typemap(csconstruct, excode=SWIGEXCODE,directorconnect="\n SwigDirectorConnect();") SWIGTYPE %{: this($imcall, true) {$excode$directorconnect } %} %typemap(csdisposing, methodname="Dispose", methodmodifiers="protected", parameters="bool disposing") SWIGTYPE { lock(this) { if (swigCPtr.Handle != global::System.IntPtr.Zero) { if (swigCMemOwn) { swigCMemOwn = false; $imcall; } swigCPtr = new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero); } } } %typemap(csdisposing_derived, methodname="Dispose", methodmodifiers="protected", parameters="bool disposing") SWIGTYPE { lock(this) { if (swigCPtr.Handle != global::System.IntPtr.Zero) { if (swigCMemOwn) { swigCMemOwn = false; $imcall; } swigCPtr = new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero); } base.Dispose(disposing); } } %typemap(directordisconnect, methodname="swigDirectorDisconnect") SWIGTYPE %{ protected void $methodname() { swigCMemOwn = false; $imcall; } %} /* C# specific directives */ #define %csconst(flag) %feature("cs:const","flag") #define %csconstvalue(value) %feature("cs:constvalue",value) #define %csenum(wrapapproach) %feature("cs:enum","wrapapproach") #define %csmethodmodifiers %feature("cs:methodmodifiers") #define %csnothrowexception %feature("except") #define %csattributes %feature("cs:attributes") #define %proxycode %insert("proxycode") %pragma(csharp) imclassclassmodifiers="class" %pragma(csharp) moduleclassmodifiers="public class" /* Some ANSI C typemaps */ %apply unsigned long { size_t }; %apply const unsigned long & { const size_t & }; /* Array reference typemaps */ %apply SWIGTYPE & { SWIGTYPE ((&)[ANY]) } %apply SWIGTYPE && { SWIGTYPE ((&&)[ANY]) } /* const pointers */ %apply SWIGTYPE * { SWIGTYPE *const } %apply SWIGTYPE (CLASS::*) { SWIGTYPE (CLASS::*const) } %apply SWIGTYPE & { SWIGTYPE (CLASS::*const&) } /* csharp keywords */ %include // Default enum handling %include // For vararg handling in macros, from swigmacros.swg #define %arg(X...) X /* // Alternative char * typemaps. %pragma(csharp) imclasscode=%{ public class SWIGStringMarshal : global::System.IDisposable { public readonly global::System.Runtime.InteropServices.HandleRef swigCPtr; public SWIGStringMarshal(string str) { swigCPtr = new global::System.Runtime.InteropServices.HandleRef(this, global::System.Runtime.InteropServices.Marshal.StringToHGlobalAnsi(str)); } public virtual void Dispose() { global::System.Runtime.InteropServices.Marshal.FreeHGlobal(swigCPtr.Handle); global::System.GC.SuppressFinalize(this); } } %} %typemap(imtype, out="global::System.IntPtr") char *, char[ANY], char[] "global::System.Runtime.InteropServices.HandleRef" %typemap(out) char *, char[ANY], char[] %{ $result = $1; %} %typemap(csin) char *, char[ANY], char[] "new $imclassname.SWIGStringMarshal($csinput).swigCPtr" %typemap(csout, excode=SWIGEXCODE) char *, char[ANY], char[] { string ret = global::System.Runtime.InteropServices.Marshal.PtrToStringAnsi($imcall);$excode return ret; } %typemap(csvarin, excode=SWIGEXCODE2) char *, char[ANY], char[] %{ set { $imcall;$excode } %} %typemap(csvarout, excode=SWIGEXCODE2) char *, char[ANY], char[] %{ get { string ret = global::System.Runtime.InteropServices.Marshal.PtrToStringAnsi($imcall);$excode return ret; } %} */ swig-4.0.1/Lib/csharp/std_pair.i0000644000175000017500000000140513527063513016315 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_pair.i * * SWIG typemaps for std::pair * ----------------------------------------------------------------------------- */ %include %include // ------------------------------------------------------------------------ // std::pair // ------------------------------------------------------------------------ %{ #include %} namespace std { template struct pair { typedef T first_type; typedef U second_type; pair(); pair(T first, U second); pair(const pair& other); template pair(const pair &other); T first; U second; }; // add specializations here } swig-4.0.1/Lib/csharp/enumsimple.swg0000644000175000017500000000550513527063513017243 0ustar williamwilliam/* ----------------------------------------------------------------------------- * enumsimple.swg * * This file provides backwards compatible enum wrapping. SWIG versions 1.3.21 * and earlier wrapped global enums with constant integers in the module * class. Enums declared within a C++ class were wrapped by constant integers * in the C# proxy class. * ----------------------------------------------------------------------------- */ // const enum SWIGTYPE & typemaps %typemap(ctype) const enum SWIGTYPE & "int" %typemap(imtype) const enum SWIGTYPE & "int" %typemap(cstype) const enum SWIGTYPE & "int" %typemap(in) const enum SWIGTYPE & ($*1_ltype temp) %{ temp = ($*1_ltype)$input; $1 = &temp; %} %typemap(out) const enum SWIGTYPE & %{ $result = (int)*$1; %} %typemap(directorout,warning=SWIGWARN_TYPEMAP_THREAD_UNSAFE_MSG) const enum SWIGTYPE & %{ static $*1_ltype temp = ($*1_ltype)$input; $result = &temp; %} %typemap(directorin) const enum SWIGTYPE & "$input = (int)$1;" %typemap(csdirectorin) const enum SWIGTYPE & "$iminput" %typemap(csdirectorout) const enum SWIGTYPE & "$cscall" %typecheck(SWIG_TYPECHECK_INT32) const enum SWIGTYPE & "" %typemap(throws, canthrow=1) const enum SWIGTYPE & %{ (void)$1; SWIG_CSharpSetPendingException(SWIG_CSharpApplicationException, "C++ $1_type exception thrown"); return $null; %} %typemap(csin) const enum SWIGTYPE & "$csinput" %typemap(csout, excode=SWIGEXCODE) const enum SWIGTYPE & { int ret = $imcall;$excode return ret; } %typemap(csvarout, excode=SWIGEXCODE2) const enum SWIGTYPE & %{ get { int ret = $imcall;$excode return ret; } %} // enum SWIGTYPE typemaps %typemap(ctype) enum SWIGTYPE "int" %typemap(imtype) enum SWIGTYPE "int" %typemap(cstype) enum SWIGTYPE "int" %typemap(in) enum SWIGTYPE %{ $1 = ($1_ltype)$input; %} %typemap(out) enum SWIGTYPE %{ $result = (int)$1; %} %typemap(directorout) enum SWIGTYPE %{ $result = ($1_ltype)$input; %} %typemap(directorin) enum SWIGTYPE "$input = (int)$1;" %typemap(csdirectorin) enum SWIGTYPE "$iminput" %typemap(csdirectorout) enum SWIGTYPE "$cscall" %typecheck(SWIG_TYPECHECK_INT32) enum SWIGTYPE "" %typemap(throws, canthrow=1) enum SWIGTYPE %{ (void)$1; SWIG_CSharpSetPendingException(SWIG_CSharpApplicationException, "C++ $1_type exception thrown"); return $null; %} %typemap(csin) enum SWIGTYPE "$csinput" %typemap(csout, excode=SWIGEXCODE) enum SWIGTYPE { int ret = $imcall;$excode return ret; } %typemap(csvarout, excode=SWIGEXCODE2) enum SWIGTYPE %{ get { int ret = $imcall;$excode return ret; } %} %typemap(csbase) enum SWIGTYPE "" %typemap(csclassmodifiers) enum SWIGTYPE "" %typemap(cscode) enum SWIGTYPE "" %typemap(csimports) enum SWIGTYPE "" %typemap(csinterfaces) enum SWIGTYPE "" %typemap(csbody) enum SWIGTYPE "" %csenum(simple); swig-4.0.1/Lib/csharp/enums.swg0000644000175000017500000000557613527063513016224 0ustar williamwilliam/* ----------------------------------------------------------------------------- * enums.swg * * Include this file in order for C/C++ enums to be wrapped by proper C# enums. * Note that the PINVOKE layer handles the enum as an int. * ----------------------------------------------------------------------------- */ // const enum SWIGTYPE & typemaps %typemap(ctype) const enum SWIGTYPE & "int" %typemap(imtype) const enum SWIGTYPE & "int" %typemap(cstype) const enum SWIGTYPE & "$*csclassname" %typemap(in) const enum SWIGTYPE & ($*1_ltype temp) %{ temp = ($*1_ltype)$input; $1 = &temp; %} %typemap(out) const enum SWIGTYPE & %{ $result = (int)*$1; %} %typemap(directorout,warning=SWIGWARN_TYPEMAP_THREAD_UNSAFE_MSG) const enum SWIGTYPE & %{ static $*1_ltype temp = ($*1_ltype)$input; $result = &temp; %} %typemap(directorin) const enum SWIGTYPE & "$input = (int)$1;" %typemap(csdirectorin) const enum SWIGTYPE & "($*csclassname)$iminput" %typemap(csdirectorout) const enum SWIGTYPE & "(int)$cscall" %typecheck(SWIG_TYPECHECK_POINTER) const enum SWIGTYPE & "" %typemap(throws, canthrow=1) const enum SWIGTYPE & %{ (void)$1; SWIG_CSharpSetPendingException(SWIG_CSharpApplicationException, "C++ $1_type exception thrown"); return $null; %} %typemap(csin) const enum SWIGTYPE & "(int)$csinput" %typemap(csout, excode=SWIGEXCODE) const enum SWIGTYPE & { $*csclassname ret = ($*csclassname)$imcall;$excode return ret; } %typemap(csvarout, excode=SWIGEXCODE2) const enum SWIGTYPE & %{ get { $*csclassname ret = ($*csclassname)$imcall;$excode return ret; } %} // enum SWIGTYPE typemaps %typemap(ctype) enum SWIGTYPE "int" %typemap(imtype) enum SWIGTYPE "int" %typemap(cstype) enum SWIGTYPE "$csclassname" %typemap(in) enum SWIGTYPE %{ $1 = ($1_ltype)$input; %} %typemap(out) enum SWIGTYPE %{ $result = (int)$1; %} %typemap(directorout) enum SWIGTYPE %{ $result = ($1_ltype)$input; %} %typemap(directorin) enum SWIGTYPE "$input = (int)$1;" %typemap(csdirectorin) enum SWIGTYPE "($csclassname)$iminput" %typemap(csdirectorout) enum SWIGTYPE "(int)$cscall" %typecheck(SWIG_TYPECHECK_POINTER) enum SWIGTYPE "" %typemap(throws, canthrow=1) enum SWIGTYPE %{ (void)$1; SWIG_CSharpSetPendingException(SWIG_CSharpApplicationException, "C++ $1_type exception thrown"); return $null; %} %typemap(csin) enum SWIGTYPE "(int)$csinput" %typemap(csout, excode=SWIGEXCODE) enum SWIGTYPE { $csclassname ret = ($csclassname)$imcall;$excode return ret; } %typemap(csvarout, excode=SWIGEXCODE2) enum SWIGTYPE %{ get { $csclassname ret = ($csclassname)$imcall;$excode return ret; } %} %typemap(csbase) enum SWIGTYPE "" %typemap(csclassmodifiers) enum SWIGTYPE "public enum" %typemap(cscode) enum SWIGTYPE "" %typemap(csimports) enum SWIGTYPE "" %typemap(csinterfaces) enum SWIGTYPE "" %typemap(csbody) enum SWIGTYPE "" %csenum(proper); swig-4.0.1/Lib/csharp/std_auto_ptr.i0000644000175000017500000000164013527063513017220 0ustar williamwilliam/* The typemaps here allow to handle functions returning std::auto_ptr<>, which is the most common use of this type. If you have functions taking it as parameter, these typemaps can't be used for them and you need to do something else (e.g. use shared_ptr<> which SWIG supports fully). */ %define %auto_ptr(TYPE) %typemap (ctype) std::auto_ptr "void *" %typemap (imtype, out="System.IntPtr") std::auto_ptr "HandleRef" %typemap (cstype) std::auto_ptr "$typemap(cstype, TYPE)" %typemap (out) std::auto_ptr %{ $result = (void *)$1.release(); %} %typemap(csout, excode=SWIGEXCODE) std::auto_ptr { System.IntPtr cPtr = $imcall; $typemap(cstype, TYPE) ret = (cPtr == System.IntPtr.Zero) ? null : new $typemap(cstype, TYPE)(cPtr, true);$excode return ret; } %template() std::auto_ptr; %enddef namespace std { template class auto_ptr {}; } swig-4.0.1/Lib/csharp/stl.i0000644000175000017500000000044313527063513015313 0ustar williamwilliam/* ----------------------------------------------------------------------------- * stl.i * ----------------------------------------------------------------------------- */ %include %include %include %include %include swig-4.0.1/Lib/csharp/std_list.i0000644000175000017500000003653313527063513016347 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_list.i * * SWIG typemaps for std::list * C# implementation * The C# wrapper is made to look and feel like a C# System.Collections.Generic.LinkedList<> collection. * * Note that IEnumerable<> is implemented in the proxy class which is useful for using LINQ with * C++ std::list wrappers. The ICollection<> interface is also implemented to provide enhanced functionality * whenever we are confident that the required C++ operator== is available. This is the case for when * T is a primitive type or a pointer. If T does define an operator==, then use the SWIG_STD_LIST_ENHANCED * macro to obtain this enhanced functionality, for example: * * SWIG_STD_LIST_ENHANCED(SomeNamespace::Klass) * %template(ListKlass) std::list; * ----------------------------------------------------------------------------- */ %include // MACRO for use within the std::list class body %define SWIG_STD_LIST_MINIMUM_INTERNAL(CSINTERFACE, CTYPE...) %typemap(csinterfaces) std::list< CTYPE > "global::System.IDisposable, global::System.Collections.IEnumerable, global::System.Collections.Generic.CSINTERFACE<$typemap(cstype, CTYPE)>\n"; %apply void *VOID_INT_PTR { std::list< CTYPE >::iterator * }; %proxycode %{ public $csclassname(global::System.Collections.IEnumerable c) : this() { if (c == null) throw new global::System.ArgumentNullException("c"); foreach ($typemap(cstype, CTYPE) element in c) { this.AddLast(element); } } public bool IsReadOnly { get { return false; } } public int Count { get { return (int)size(); } } public $csclassnameNode First { get { if (Count == 0) return null; return new $csclassnameNode(getFirstIter(), this); } } public $csclassnameNode Last { get { if (Count == 0) return null; return new $csclassnameNode(getLastIter(), this); } } public $csclassnameNode AddFirst($typemap(cstype, CTYPE) value) { push_front(value); return new $csclassnameNode(getFirstIter(), this); } public void AddFirst($csclassnameNode newNode) { ValidateNewNode(newNode); if (!newNode.inlist) { push_front(newNode.csharpvalue); newNode.iter = getFirstIter(); newNode.inlist = true; } else { throw new global::System.InvalidOperationException("The " + newNode.GetType().Name + " node already belongs to a " + this.GetType().Name); } } public $csclassnameNode AddLast($typemap(cstype, CTYPE) value) { push_back(value); return new $csclassnameNode(getLastIter(), this); } public void AddLast($csclassnameNode newNode) { ValidateNewNode(newNode); if (!newNode.inlist) { push_back(newNode.csharpvalue); newNode.iter = getLastIter(); newNode.inlist = true; } else { throw new global::System.InvalidOperationException("The " + newNode.GetType().Name + " node already belongs to a " + this.GetType().Name); } } public $csclassnameNode AddBefore($csclassnameNode node, $typemap(cstype, CTYPE) value) { return new $csclassnameNode(insertNode(node.iter, value), this); } public void AddBefore($csclassnameNode node, $csclassnameNode newNode) { ValidateNode(node); ValidateNewNode(newNode); if (!newNode.inlist) { newNode.iter = insertNode(node.iter, newNode.csharpvalue); newNode.inlist = true; } else { throw new global::System.InvalidOperationException("The " + newNode.GetType().Name + " node already belongs to a " + this.GetType().Name); } } public $csclassnameNode AddAfter($csclassnameNode node, $typemap(cstype, CTYPE) value) { node = node.Next; return new $csclassnameNode(insertNode(node.iter, value), this); } public void AddAfter($csclassnameNode node, $csclassnameNode newNode) { ValidateNode(node); ValidateNewNode(newNode); if (!newNode.inlist) { if (node == this.Last) AddLast(newNode); else { node = node.Next; newNode.iter = insertNode(node.iter, newNode.csharpvalue); newNode.inlist = true; } } else { throw new global::System.InvalidOperationException("The " + newNode.GetType().Name + " node already belongs to a " + this.GetType().Name); } } public void Add($typemap(cstype, CTYPE) value) { AddLast(value); } public void Remove($csclassnameNode node) { ValidateNode(node); eraseIter(node.iter); } public void CopyTo($typemap(cstype, CTYPE)[] array, int index) { if (array == null) throw new global::System.ArgumentNullException("array"); if (index < 0 || index > array.Length) throw new global::System.ArgumentOutOfRangeException("index", "Value is less than zero"); if (array.Rank > 1) throw new global::System.ArgumentException("Multi dimensional array.", "array"); $csclassnameNode node = this.First; if (node != null) { do { array[index++] = node.Value; node = node.Next; } while (node != null); } } internal void ValidateNode($csclassnameNode node) { if (node == null) { throw new System.ArgumentNullException("node"); } if (!node.inlist || node.list != this) { throw new System.InvalidOperationException("node"); } } internal void ValidateNewNode($csclassnameNode node) { if (node == null) { throw new System.ArgumentNullException("node"); } } global::System.Collections.Generic.IEnumerator<$typemap(cstype, CTYPE)> global::System.Collections.Generic.IEnumerable<$typemap(cstype, CTYPE)>.GetEnumerator() { return new $csclassnameEnumerator(this); } global::System.Collections.IEnumerator global::System.Collections.IEnumerable.GetEnumerator() { return new $csclassnameEnumerator(this); } public $csclassnameEnumerator GetEnumerator() { return new $csclassnameEnumerator(this); } public sealed class $csclassnameEnumerator : global::System.Collections.IEnumerator, global::System.Collections.Generic.IEnumerator<$typemap(cstype, CTYPE)> { private $csclassname collectionRef; private $csclassnameNode currentNode; private int currentIndex; private object currentObject; private int currentSize; public $csclassnameEnumerator($csclassname collection) { collectionRef = collection; currentNode = collection.First; currentIndex = 0; currentObject = null; currentSize = collectionRef.Count; } // Type-safe iterator Current public $typemap(cstype, CTYPE) Current { get { if (currentIndex == -1) throw new global::System.InvalidOperationException("Enumeration not started."); if (currentIndex > currentSize) throw new global::System.InvalidOperationException("Enumeration finished."); if (currentObject == null) throw new global::System.InvalidOperationException("Collection modified."); return ($typemap(cstype, CTYPE))currentObject; } } // Type-unsafe IEnumerator.Current object global::System.Collections.IEnumerator.Current { get { return Current; } } public bool MoveNext() { if (currentNode == null) { currentIndex = collectionRef.Count + 1; return false; } ++currentIndex; currentObject = currentNode.Value; currentNode = currentNode.Next; return true; } public void Reset() { currentIndex = -1; currentObject = null; if (collectionRef.Count != currentSize) { throw new global::System.InvalidOperationException("Collection modified."); } } public void Dispose() { currentIndex = -1; currentObject = null; } } public sealed class $csclassnameNode { internal $csclassname list; internal System.IntPtr iter; internal $typemap(cstype, CTYPE) csharpvalue; internal bool inlist; public $csclassnameNode($typemap(cstype, CTYPE) value) { csharpvalue = value; inlist = false; } internal $csclassnameNode(System.IntPtr iter, $csclassname list) { this.list = list; this.iter = iter; inlist = true; } public $csclassname List { get { return this.list; } } public $csclassnameNode Next { get { if (list.getNextIter(iter) == System.IntPtr.Zero) return null; return new $csclassnameNode(list.getNextIter(iter), list); } } public $csclassnameNode Previous { get { if (list.getPrevIter(iter) == System.IntPtr.Zero) return null; return new $csclassnameNode(list.getPrevIter(iter), list); } } public $typemap(cstype, CTYPE) Value { get { return list.getItem(this.iter); } set { list.setItem(this.iter, value); } } public static bool operator==($csclassnameNode node1, $csclassnameNode node2) { if (object.ReferenceEquals(node1, null) && object.ReferenceEquals(node2, null)) return true; if (object.ReferenceEquals(node1, null) || object.ReferenceEquals(node2, null)) return false; return node1.Equals(node2); } public static bool operator!=($csclassnameNode node1, $csclassnameNode node2) { if (node1 == null && node2 == null) return false; if (node1 == null || node2 == null) return true; return !node1.Equals(node2); } public bool Equals($csclassnameNode node) { if (node == null) return false; if (!node.inlist || !this.inlist) return object.ReferenceEquals(this, node); return list.equals(this.iter, node.iter); } public override bool Equals(object node) { return Equals(($csclassnameNode)node); } public override int GetHashCode() { int hash = 13; if (inlist) { hash = (hash * 7) + this.list.GetHashCode(); hash = (hash * 7) + this.Value.GetHashCode(); hash = (hash * 7) + this.list.getNextIter(this.iter).GetHashCode(); hash = (hash * 7) + this.list.getPrevIter(this.iter).GetHashCode(); } else { hash = (hash * 7) + this.csharpvalue.GetHashCode(); } return hash; } public void Dispose() { list.deleteIter(this.iter); } } %} public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef CTYPE value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; class iterator; void push_front(CTYPE const& x); void push_back(CTYPE const& x); %rename(RemoveFirst) pop_front; void pop_front(); %rename(RemoveLast) pop_back; void pop_back(); size_type size() const; %rename(Clear) clear; void clear(); %extend { const_reference getItem(iterator *iter) { return **iter; } void setItem(iterator *iter, CTYPE const& val) { *(*iter) = val; } iterator *getFirstIter() { if ($self->size() == 0) return NULL; return new std::list< CTYPE >::iterator($self->begin()); } iterator *getLastIter() { if ($self->size() == 0) return NULL; return new std::list< CTYPE >::iterator(--$self->end()); } iterator *getNextIter(iterator *iter) { std::list< CTYPE >::iterator it = *iter; if (std::distance(it, --$self->end()) != 0) { std::list< CTYPE >::iterator* itnext = new std::list< CTYPE >::iterator(++it); return itnext; } return NULL; } iterator *getPrevIter(iterator *iter) { std::list< CTYPE >::iterator it = *iter; if (std::distance($self->begin(), it) != 0) { std::list< CTYPE >::iterator* itprev = new std::list< CTYPE >::iterator(--it); return itprev; } return NULL; } iterator *insertNode(iterator *iter, CTYPE const& value) { std::list< CTYPE >::iterator it = $self->insert(*iter, value); return new std::list< CTYPE >::iterator(it); } void eraseIter(iterator *iter) { std::list< CTYPE >::iterator it = *iter; $self->erase(it); } void deleteIter(iterator *iter) { delete iter; } bool equals(iterator *iter1, iterator *iter2) { if (iter1 == NULL && iter2 == NULL) return true; std::list< CTYPE >::iterator it1 = *iter1; std::list< CTYPE >::iterator it2 = *iter2; return it1 == it2; } } %enddef // Extra methods added to the collection class if operator== is defined for the class being wrapped // The class will then implement ICollection<>, which adds extra functionality %define SWIG_STD_LIST_EXTRA_OP_EQUALS_EQUALS(CTYPE...) %extend { bool Contains(CTYPE const& value) { return std::find($self->begin(), $self->end(), value) != $self->end(); } bool Remove(CTYPE const& value) { std::list< CTYPE >::iterator it = std::find($self->begin(), $self->end(), value); if (it != $self->end()) { $self->erase(it); return true; } return false; } iterator *find(CTYPE const& value) { if (std::find($self->begin(), $self->end(), value) != $self->end()) { return new std::list< CTYPE >::iterator(std::find($self->begin(), $self->end(), value)); } return NULL; } } %proxycode %{ public $csclassnameNode Find($typemap(cstype, CTYPE) value) { System.IntPtr tmp = find(value); if (tmp != System.IntPtr.Zero) { return new $csclassnameNode(tmp, this); } return null; } %} %enddef // Macros for std::list class specializations/enhancements %define SWIG_STD_LIST_ENHANCED(CTYPE...) namespace std { template<> class list< CTYPE > { SWIG_STD_LIST_MINIMUM_INTERNAL(ICollection, %arg(CTYPE)); SWIG_STD_LIST_EXTRA_OP_EQUALS_EQUALS(CTYPE) }; } %enddef %{ #include #include #include %} %csmethodmodifiers std::list::size "private" %csmethodmodifiers std::list::getItem "private" %csmethodmodifiers std::list::setItem "private" %csmethodmodifiers std::list::push_front "private" %csmethodmodifiers std::list::push_back "private" %csmethodmodifiers std::list::getFirstIter "private" %csmethodmodifiers std::list::getNextIter "private" %csmethodmodifiers std::list::getPrevIter "private" %csmethodmodifiers std::list::getLastIter "private" %csmethodmodifiers std::list::find "private" %csmethodmodifiers std::list::deleteIter "private" namespace std { // primary (unspecialized) class template for std::list // does not require operator== to be defined template class list { SWIG_STD_LIST_MINIMUM_INTERNAL(IEnumerable, T) }; // specialization for pointers template class list { SWIG_STD_LIST_MINIMUM_INTERNAL(ICollection, T *) SWIG_STD_LIST_EXTRA_OP_EQUALS_EQUALS(T *) }; } // template specializations for std::list // these provide extra collections methods as operator== is defined SWIG_STD_LIST_ENHANCED(char) SWIG_STD_LIST_ENHANCED(signed char) SWIG_STD_LIST_ENHANCED(unsigned char) SWIG_STD_LIST_ENHANCED(short) SWIG_STD_LIST_ENHANCED(unsigned short) SWIG_STD_LIST_ENHANCED(int) SWIG_STD_LIST_ENHANCED(unsigned int) SWIG_STD_LIST_ENHANCED(long) SWIG_STD_LIST_ENHANCED(unsigned long) SWIG_STD_LIST_ENHANCED(long long) SWIG_STD_LIST_ENHANCED(unsigned long long) SWIG_STD_LIST_ENHANCED(float) SWIG_STD_LIST_ENHANCED(double) SWIG_STD_LIST_ENHANCED(std::string) // also requires a %include SWIG_STD_LIST_ENHANCED(std::wstring) // also requires a %include swig-4.0.1/Lib/csharp/csharphead.swg0000644000175000017500000003776413527063513017203 0ustar williamwilliam/* ----------------------------------------------------------------------------- * csharphead.swg * * Support code for exceptions if the SWIG_CSHARP_NO_EXCEPTION_HELPER is not defined * Support code for strings if the SWIG_CSHARP_NO_STRING_HELPER is not defined * ----------------------------------------------------------------------------- */ %insert(runtime) %{ #include #include #include %} #if !defined(SWIG_CSHARP_NO_EXCEPTION_HELPER) %insert(runtime) %{ /* Support for throwing C# exceptions from C/C++. There are two types: * Exceptions that take a message and ArgumentExceptions that take a message and a parameter name. */ typedef enum { SWIG_CSharpApplicationException, SWIG_CSharpArithmeticException, SWIG_CSharpDivideByZeroException, SWIG_CSharpIndexOutOfRangeException, SWIG_CSharpInvalidCastException, SWIG_CSharpInvalidOperationException, SWIG_CSharpIOException, SWIG_CSharpNullReferenceException, SWIG_CSharpOutOfMemoryException, SWIG_CSharpOverflowException, SWIG_CSharpSystemException } SWIG_CSharpExceptionCodes; typedef enum { SWIG_CSharpArgumentException, SWIG_CSharpArgumentNullException, SWIG_CSharpArgumentOutOfRangeException } SWIG_CSharpExceptionArgumentCodes; typedef void (SWIGSTDCALL* SWIG_CSharpExceptionCallback_t)(const char *); typedef void (SWIGSTDCALL* SWIG_CSharpExceptionArgumentCallback_t)(const char *, const char *); typedef struct { SWIG_CSharpExceptionCodes code; SWIG_CSharpExceptionCallback_t callback; } SWIG_CSharpException_t; typedef struct { SWIG_CSharpExceptionArgumentCodes code; SWIG_CSharpExceptionArgumentCallback_t callback; } SWIG_CSharpExceptionArgument_t; static SWIG_CSharpException_t SWIG_csharp_exceptions[] = { { SWIG_CSharpApplicationException, NULL }, { SWIG_CSharpArithmeticException, NULL }, { SWIG_CSharpDivideByZeroException, NULL }, { SWIG_CSharpIndexOutOfRangeException, NULL }, { SWIG_CSharpInvalidCastException, NULL }, { SWIG_CSharpInvalidOperationException, NULL }, { SWIG_CSharpIOException, NULL }, { SWIG_CSharpNullReferenceException, NULL }, { SWIG_CSharpOutOfMemoryException, NULL }, { SWIG_CSharpOverflowException, NULL }, { SWIG_CSharpSystemException, NULL } }; static SWIG_CSharpExceptionArgument_t SWIG_csharp_exceptions_argument[] = { { SWIG_CSharpArgumentException, NULL }, { SWIG_CSharpArgumentNullException, NULL }, { SWIG_CSharpArgumentOutOfRangeException, NULL } }; static void SWIGUNUSED SWIG_CSharpSetPendingException(SWIG_CSharpExceptionCodes code, const char *msg) { SWIG_CSharpExceptionCallback_t callback = SWIG_csharp_exceptions[SWIG_CSharpApplicationException].callback; if ((size_t)code < sizeof(SWIG_csharp_exceptions)/sizeof(SWIG_CSharpException_t)) { callback = SWIG_csharp_exceptions[code].callback; } callback(msg); } static void SWIGUNUSED SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpExceptionArgumentCodes code, const char *msg, const char *param_name) { SWIG_CSharpExceptionArgumentCallback_t callback = SWIG_csharp_exceptions_argument[SWIG_CSharpArgumentException].callback; if ((size_t)code < sizeof(SWIG_csharp_exceptions_argument)/sizeof(SWIG_CSharpExceptionArgument_t)) { callback = SWIG_csharp_exceptions_argument[code].callback; } callback(msg, param_name); } %} %insert(runtime) %{ #ifdef __cplusplus extern "C" #endif SWIGEXPORT void SWIGSTDCALL SWIGRegisterExceptionCallbacks_$module( SWIG_CSharpExceptionCallback_t applicationCallback, SWIG_CSharpExceptionCallback_t arithmeticCallback, SWIG_CSharpExceptionCallback_t divideByZeroCallback, SWIG_CSharpExceptionCallback_t indexOutOfRangeCallback, SWIG_CSharpExceptionCallback_t invalidCastCallback, SWIG_CSharpExceptionCallback_t invalidOperationCallback, SWIG_CSharpExceptionCallback_t ioCallback, SWIG_CSharpExceptionCallback_t nullReferenceCallback, SWIG_CSharpExceptionCallback_t outOfMemoryCallback, SWIG_CSharpExceptionCallback_t overflowCallback, SWIG_CSharpExceptionCallback_t systemCallback) { SWIG_csharp_exceptions[SWIG_CSharpApplicationException].callback = applicationCallback; SWIG_csharp_exceptions[SWIG_CSharpArithmeticException].callback = arithmeticCallback; SWIG_csharp_exceptions[SWIG_CSharpDivideByZeroException].callback = divideByZeroCallback; SWIG_csharp_exceptions[SWIG_CSharpIndexOutOfRangeException].callback = indexOutOfRangeCallback; SWIG_csharp_exceptions[SWIG_CSharpInvalidCastException].callback = invalidCastCallback; SWIG_csharp_exceptions[SWIG_CSharpInvalidOperationException].callback = invalidOperationCallback; SWIG_csharp_exceptions[SWIG_CSharpIOException].callback = ioCallback; SWIG_csharp_exceptions[SWIG_CSharpNullReferenceException].callback = nullReferenceCallback; SWIG_csharp_exceptions[SWIG_CSharpOutOfMemoryException].callback = outOfMemoryCallback; SWIG_csharp_exceptions[SWIG_CSharpOverflowException].callback = overflowCallback; SWIG_csharp_exceptions[SWIG_CSharpSystemException].callback = systemCallback; } #ifdef __cplusplus extern "C" #endif SWIGEXPORT void SWIGSTDCALL SWIGRegisterExceptionArgumentCallbacks_$module( SWIG_CSharpExceptionArgumentCallback_t argumentCallback, SWIG_CSharpExceptionArgumentCallback_t argumentNullCallback, SWIG_CSharpExceptionArgumentCallback_t argumentOutOfRangeCallback) { SWIG_csharp_exceptions_argument[SWIG_CSharpArgumentException].callback = argumentCallback; SWIG_csharp_exceptions_argument[SWIG_CSharpArgumentNullException].callback = argumentNullCallback; SWIG_csharp_exceptions_argument[SWIG_CSharpArgumentOutOfRangeException].callback = argumentOutOfRangeCallback; } %} %pragma(csharp) imclasscode=%{ protected class SWIGExceptionHelper { public delegate void ExceptionDelegate(string message); public delegate void ExceptionArgumentDelegate(string message, string paramName); static ExceptionDelegate applicationDelegate = new ExceptionDelegate(SetPendingApplicationException); static ExceptionDelegate arithmeticDelegate = new ExceptionDelegate(SetPendingArithmeticException); static ExceptionDelegate divideByZeroDelegate = new ExceptionDelegate(SetPendingDivideByZeroException); static ExceptionDelegate indexOutOfRangeDelegate = new ExceptionDelegate(SetPendingIndexOutOfRangeException); static ExceptionDelegate invalidCastDelegate = new ExceptionDelegate(SetPendingInvalidCastException); static ExceptionDelegate invalidOperationDelegate = new ExceptionDelegate(SetPendingInvalidOperationException); static ExceptionDelegate ioDelegate = new ExceptionDelegate(SetPendingIOException); static ExceptionDelegate nullReferenceDelegate = new ExceptionDelegate(SetPendingNullReferenceException); static ExceptionDelegate outOfMemoryDelegate = new ExceptionDelegate(SetPendingOutOfMemoryException); static ExceptionDelegate overflowDelegate = new ExceptionDelegate(SetPendingOverflowException); static ExceptionDelegate systemDelegate = new ExceptionDelegate(SetPendingSystemException); static ExceptionArgumentDelegate argumentDelegate = new ExceptionArgumentDelegate(SetPendingArgumentException); static ExceptionArgumentDelegate argumentNullDelegate = new ExceptionArgumentDelegate(SetPendingArgumentNullException); static ExceptionArgumentDelegate argumentOutOfRangeDelegate = new ExceptionArgumentDelegate(SetPendingArgumentOutOfRangeException); [global::System.Runtime.InteropServices.DllImport("$dllimport", EntryPoint="SWIGRegisterExceptionCallbacks_$module")] public static extern void SWIGRegisterExceptionCallbacks_$module( ExceptionDelegate applicationDelegate, ExceptionDelegate arithmeticDelegate, ExceptionDelegate divideByZeroDelegate, ExceptionDelegate indexOutOfRangeDelegate, ExceptionDelegate invalidCastDelegate, ExceptionDelegate invalidOperationDelegate, ExceptionDelegate ioDelegate, ExceptionDelegate nullReferenceDelegate, ExceptionDelegate outOfMemoryDelegate, ExceptionDelegate overflowDelegate, ExceptionDelegate systemExceptionDelegate); [global::System.Runtime.InteropServices.DllImport("$dllimport", EntryPoint="SWIGRegisterExceptionArgumentCallbacks_$module")] public static extern void SWIGRegisterExceptionCallbacksArgument_$module( ExceptionArgumentDelegate argumentDelegate, ExceptionArgumentDelegate argumentNullDelegate, ExceptionArgumentDelegate argumentOutOfRangeDelegate); static void SetPendingApplicationException(string message) { SWIGPendingException.Set(new global::System.ApplicationException(message, SWIGPendingException.Retrieve())); } static void SetPendingArithmeticException(string message) { SWIGPendingException.Set(new global::System.ArithmeticException(message, SWIGPendingException.Retrieve())); } static void SetPendingDivideByZeroException(string message) { SWIGPendingException.Set(new global::System.DivideByZeroException(message, SWIGPendingException.Retrieve())); } static void SetPendingIndexOutOfRangeException(string message) { SWIGPendingException.Set(new global::System.IndexOutOfRangeException(message, SWIGPendingException.Retrieve())); } static void SetPendingInvalidCastException(string message) { SWIGPendingException.Set(new global::System.InvalidCastException(message, SWIGPendingException.Retrieve())); } static void SetPendingInvalidOperationException(string message) { SWIGPendingException.Set(new global::System.InvalidOperationException(message, SWIGPendingException.Retrieve())); } static void SetPendingIOException(string message) { SWIGPendingException.Set(new global::System.IO.IOException(message, SWIGPendingException.Retrieve())); } static void SetPendingNullReferenceException(string message) { SWIGPendingException.Set(new global::System.NullReferenceException(message, SWIGPendingException.Retrieve())); } static void SetPendingOutOfMemoryException(string message) { SWIGPendingException.Set(new global::System.OutOfMemoryException(message, SWIGPendingException.Retrieve())); } static void SetPendingOverflowException(string message) { SWIGPendingException.Set(new global::System.OverflowException(message, SWIGPendingException.Retrieve())); } static void SetPendingSystemException(string message) { SWIGPendingException.Set(new global::System.SystemException(message, SWIGPendingException.Retrieve())); } static void SetPendingArgumentException(string message, string paramName) { SWIGPendingException.Set(new global::System.ArgumentException(message, paramName, SWIGPendingException.Retrieve())); } static void SetPendingArgumentNullException(string message, string paramName) { global::System.Exception e = SWIGPendingException.Retrieve(); if (e != null) message = message + " Inner Exception: " + e.Message; SWIGPendingException.Set(new global::System.ArgumentNullException(paramName, message)); } static void SetPendingArgumentOutOfRangeException(string message, string paramName) { global::System.Exception e = SWIGPendingException.Retrieve(); if (e != null) message = message + " Inner Exception: " + e.Message; SWIGPendingException.Set(new global::System.ArgumentOutOfRangeException(paramName, message)); } static SWIGExceptionHelper() { SWIGRegisterExceptionCallbacks_$module( applicationDelegate, arithmeticDelegate, divideByZeroDelegate, indexOutOfRangeDelegate, invalidCastDelegate, invalidOperationDelegate, ioDelegate, nullReferenceDelegate, outOfMemoryDelegate, overflowDelegate, systemDelegate); SWIGRegisterExceptionCallbacksArgument_$module( argumentDelegate, argumentNullDelegate, argumentOutOfRangeDelegate); } } protected static SWIGExceptionHelper swigExceptionHelper = new SWIGExceptionHelper(); public class SWIGPendingException { [global::System.ThreadStatic] private static global::System.Exception pendingException = null; private static int numExceptionsPending = 0; private static global::System.Object exceptionsLock = null; public static bool Pending { get { bool pending = false; if (numExceptionsPending > 0) if (pendingException != null) pending = true; return pending; } } public static void Set(global::System.Exception e) { if (pendingException != null) throw new global::System.ApplicationException("FATAL: An earlier pending exception from unmanaged code was missed and thus not thrown (" + pendingException.ToString() + ")", e); pendingException = e; lock(exceptionsLock) { numExceptionsPending++; } } public static global::System.Exception Retrieve() { global::System.Exception e = null; if (numExceptionsPending > 0) { if (pendingException != null) { e = pendingException; pendingException = null; lock(exceptionsLock) { numExceptionsPending--; } } } return e; } static SWIGPendingException() { exceptionsLock = new global::System.Object(); } } %} #endif // SWIG_CSHARP_NO_EXCEPTION_HELPER #if !defined(SWIG_CSHARP_NO_STRING_HELPER) %insert(runtime) %{ /* Callback for returning strings to C# without leaking memory */ typedef char * (SWIGSTDCALL* SWIG_CSharpStringHelperCallback)(const char *); static SWIG_CSharpStringHelperCallback SWIG_csharp_string_callback = NULL; %} %pragma(csharp) imclasscode=%{ protected class SWIGStringHelper { public delegate string SWIGStringDelegate(string message); static SWIGStringDelegate stringDelegate = new SWIGStringDelegate(CreateString); [global::System.Runtime.InteropServices.DllImport("$dllimport", EntryPoint="SWIGRegisterStringCallback_$module")] public static extern void SWIGRegisterStringCallback_$module(SWIGStringDelegate stringDelegate); static string CreateString(string cString) { return cString; } static SWIGStringHelper() { SWIGRegisterStringCallback_$module(stringDelegate); } } static protected SWIGStringHelper swigStringHelper = new SWIGStringHelper(); %} %insert(runtime) %{ #ifdef __cplusplus extern "C" #endif SWIGEXPORT void SWIGSTDCALL SWIGRegisterStringCallback_$module(SWIG_CSharpStringHelperCallback callback) { SWIG_csharp_string_callback = callback; } %} #endif // SWIG_CSHARP_NO_STRING_HELPER #if !defined(SWIG_CSHARP_NO_IMCLASS_STATIC_CONSTRUCTOR) // Ensure the class is not marked beforefieldinit %pragma(csharp) imclasscode=%{ static $imclassname() { } %} #endif %insert(runtime) %{ /* Contract support */ #define SWIG_contract_assert(nullreturn, expr, msg) if (!(expr)) {SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentOutOfRangeException, msg, ""); return nullreturn; } else %} swig-4.0.1/Lib/csharp/std_string.i0000644000175000017500000000614713527063513016700 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_string.i * * Typemaps for std::string and const std::string& * These are mapped to a C# String and are passed around by value. * * To use non-const std::string references use the following %apply. Note * that they are passed by value. * %apply const std::string & {std::string &}; * ----------------------------------------------------------------------------- */ %{ #include %} namespace std { %naturalvar string; class string; // string %typemap(ctype) string "char *" %typemap(imtype) string "string" %typemap(cstype) string "string" %typemap(csdirectorin) string "$iminput" %typemap(csdirectorout) string "$cscall" %typemap(in, canthrow=1) string %{ if (!$input) { SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); return $null; } $1.assign($input); %} %typemap(out) string %{ $result = SWIG_csharp_string_callback($1.c_str()); %} %typemap(directorout, canthrow=1) string %{ if (!$input) { SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); return $null; } $result.assign($input); %} %typemap(directorin) string %{ $input = SWIG_csharp_string_callback($1.c_str()); %} %typemap(csin) string "$csinput" %typemap(csout, excode=SWIGEXCODE) string { string ret = $imcall;$excode return ret; } %typemap(typecheck) string = char *; %typemap(throws, canthrow=1) string %{ SWIG_CSharpSetPendingException(SWIG_CSharpApplicationException, $1.c_str()); return $null; %} // const string & %typemap(ctype) const string & "char *" %typemap(imtype) const string & "string" %typemap(cstype) const string & "string" %typemap(csdirectorin) const string & "$iminput" %typemap(csdirectorout) const string & "$cscall" %typemap(in, canthrow=1) const string & %{ if (!$input) { SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); return $null; } $*1_ltype $1_str($input); $1 = &$1_str; %} %typemap(out) const string & %{ $result = SWIG_csharp_string_callback($1->c_str()); %} %typemap(csin) const string & "$csinput" %typemap(csout, excode=SWIGEXCODE) const string & { string ret = $imcall;$excode return ret; } %typemap(directorout, canthrow=1, warning=SWIGWARN_TYPEMAP_THREAD_UNSAFE_MSG) const string & %{ if (!$input) { SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); return $null; } /* possible thread/reentrant code problem */ static $*1_ltype $1_str; $1_str = $input; $result = &$1_str; %} %typemap(directorin) const string & %{ $input = SWIG_csharp_string_callback($1.c_str()); %} %typemap(csvarin, excode=SWIGEXCODE2) const string & %{ set { $imcall;$excode } %} %typemap(csvarout, excode=SWIGEXCODE2) const string & %{ get { string ret = $imcall;$excode return ret; } %} %typemap(typecheck) const string & = char *; %typemap(throws, canthrow=1) const string & %{ SWIG_CSharpSetPendingException(SWIG_CSharpApplicationException, $1.c_str()); return $null; %} } swig-4.0.1/Lib/csharp/std_map.i0000644000175000017500000002551213527063513016144 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_map.i * * SWIG typemaps for std::map< K, T, C > * * The C# wrapper is made to look and feel like a C# System.Collections.Generic.IDictionary<>. * * Using this wrapper is fairly simple. For example, to create a map from integers to doubles use: * * %include * %template(MapIntDouble) std::map * * Notes: * 1) IEnumerable<> is implemented in the proxy class which is useful for using LINQ with * C++ std::map wrappers. * * Warning: heavy macro usage in this file. Use swig -E to get a sane view on the real file contents! * ----------------------------------------------------------------------------- */ %{ #include #include #include %} /* K is the C++ key type, T is the C++ value type */ %define SWIG_STD_MAP_INTERNAL(K, T, C) %typemap(csinterfaces) std::map< K, T, C > "global::System.IDisposable \n , global::System.Collections.Generic.IDictionary<$typemap(cstype, K), $typemap(cstype, T)>\n"; %proxycode %{ public $typemap(cstype, T) this[$typemap(cstype, K) key] { get { return getitem(key); } set { setitem(key, value); } } public bool TryGetValue($typemap(cstype, K) key, out $typemap(cstype, T) value) { if (this.ContainsKey(key)) { value = this[key]; return true; } value = default($typemap(cstype, T)); return false; } public int Count { get { return (int)size(); } } public bool IsReadOnly { get { return false; } } public global::System.Collections.Generic.ICollection<$typemap(cstype, K)> Keys { get { global::System.Collections.Generic.ICollection<$typemap(cstype, K)> keys = new global::System.Collections.Generic.List<$typemap(cstype, K)>(); int size = this.Count; if (size > 0) { global::System.IntPtr iter = create_iterator_begin(); for (int i = 0; i < size; i++) { keys.Add(get_next_key(iter)); } destroy_iterator(iter); } return keys; } } public global::System.Collections.Generic.ICollection<$typemap(cstype, T)> Values { get { global::System.Collections.Generic.ICollection<$typemap(cstype, T)> vals = new global::System.Collections.Generic.List<$typemap(cstype, T)>(); foreach (global::System.Collections.Generic.KeyValuePair<$typemap(cstype, K), $typemap(cstype, T)> pair in this) { vals.Add(pair.Value); } return vals; } } public void Add(global::System.Collections.Generic.KeyValuePair<$typemap(cstype, K), $typemap(cstype, T)> item) { Add(item.Key, item.Value); } public bool Remove(global::System.Collections.Generic.KeyValuePair<$typemap(cstype, K), $typemap(cstype, T)> item) { if (Contains(item)) { return Remove(item.Key); } else { return false; } } public bool Contains(global::System.Collections.Generic.KeyValuePair<$typemap(cstype, K), $typemap(cstype, T)> item) { if (this[item.Key] == item.Value) { return true; } else { return false; } } public void CopyTo(global::System.Collections.Generic.KeyValuePair<$typemap(cstype, K), $typemap(cstype, T)>[] array) { CopyTo(array, 0); } public void CopyTo(global::System.Collections.Generic.KeyValuePair<$typemap(cstype, K), $typemap(cstype, T)>[] array, int arrayIndex) { if (array == null) throw new global::System.ArgumentNullException("array"); if (arrayIndex < 0) throw new global::System.ArgumentOutOfRangeException("arrayIndex", "Value is less than zero"); if (array.Rank > 1) throw new global::System.ArgumentException("Multi dimensional array.", "array"); if (arrayIndex+this.Count > array.Length) throw new global::System.ArgumentException("Number of elements to copy is too large."); global::System.Collections.Generic.IList<$typemap(cstype, K)> keyList = new global::System.Collections.Generic.List<$typemap(cstype, K)>(this.Keys); for (int i = 0; i < keyList.Count; i++) { $typemap(cstype, K) currentKey = keyList[i]; array.SetValue(new global::System.Collections.Generic.KeyValuePair<$typemap(cstype, K), $typemap(cstype, T)>(currentKey, this[currentKey]), arrayIndex+i); } } global::System.Collections.Generic.IEnumerator> global::System.Collections.Generic.IEnumerable>.GetEnumerator() { return new $csclassnameEnumerator(this); } global::System.Collections.IEnumerator global::System.Collections.IEnumerable.GetEnumerator() { return new $csclassnameEnumerator(this); } public $csclassnameEnumerator GetEnumerator() { return new $csclassnameEnumerator(this); } // Type-safe enumerator /// Note that the IEnumerator documentation requires an InvalidOperationException to be thrown /// whenever the collection is modified. This has been done for changes in the size of the /// collection but not when one of the elements of the collection is modified as it is a bit /// tricky to detect unmanaged code that modifies the collection under our feet. public sealed class $csclassnameEnumerator : global::System.Collections.IEnumerator, global::System.Collections.Generic.IEnumerator> { private $csclassname collectionRef; private global::System.Collections.Generic.IList<$typemap(cstype, K)> keyCollection; private int currentIndex; private object currentObject; private int currentSize; public $csclassnameEnumerator($csclassname collection) { collectionRef = collection; keyCollection = new global::System.Collections.Generic.List<$typemap(cstype, K)>(collection.Keys); currentIndex = -1; currentObject = null; currentSize = collectionRef.Count; } // Type-safe iterator Current public global::System.Collections.Generic.KeyValuePair<$typemap(cstype, K), $typemap(cstype, T)> Current { get { if (currentIndex == -1) throw new global::System.InvalidOperationException("Enumeration not started."); if (currentIndex > currentSize - 1) throw new global::System.InvalidOperationException("Enumeration finished."); if (currentObject == null) throw new global::System.InvalidOperationException("Collection modified."); return (global::System.Collections.Generic.KeyValuePair<$typemap(cstype, K), $typemap(cstype, T)>)currentObject; } } // Type-unsafe IEnumerator.Current object global::System.Collections.IEnumerator.Current { get { return Current; } } public bool MoveNext() { int size = collectionRef.Count; bool moveOkay = (currentIndex+1 < size) && (size == currentSize); if (moveOkay) { currentIndex++; $typemap(cstype, K) currentKey = keyCollection[currentIndex]; currentObject = new global::System.Collections.Generic.KeyValuePair<$typemap(cstype, K), $typemap(cstype, T)>(currentKey, collectionRef[currentKey]); } else { currentObject = null; } return moveOkay; } public void Reset() { currentIndex = -1; currentObject = null; if (collectionRef.Count != currentSize) { throw new global::System.InvalidOperationException("Collection modified."); } } public void Dispose() { currentIndex = -1; currentObject = null; } } %} public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef K key_type; typedef T mapped_type; typedef std::pair< const K, T > value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; map(); map(const map& other); size_type size() const; bool empty() const; %rename(Clear) clear; void clear(); %extend { const mapped_type& getitem(const key_type& key) throw (std::out_of_range) { std::map< K, T, C >::iterator iter = $self->find(key); if (iter != $self->end()) return iter->second; else throw std::out_of_range("key not found"); } void setitem(const key_type& key, const mapped_type& x) { (*$self)[key] = x; } bool ContainsKey(const key_type& key) { std::map< K, T, C >::iterator iter = $self->find(key); return iter != $self->end(); } void Add(const key_type& key, const mapped_type& value) throw (std::out_of_range) { std::map< K, T, C >::iterator iter = $self->find(key); if (iter != $self->end()) throw std::out_of_range("key already exists"); $self->insert(std::pair< K, T >(key, value)); } bool Remove(const key_type& key) { std::map< K, T, C >::iterator iter = $self->find(key); if (iter != $self->end()) { $self->erase(iter); return true; } return false; } // create_iterator_begin(), get_next_key() and destroy_iterator work together to provide a collection of keys to C# %apply void *VOID_INT_PTR { std::map< K, T, C >::iterator *create_iterator_begin } %apply void *VOID_INT_PTR { std::map< K, T, C >::iterator *swigiterator } std::map< K, T, C >::iterator *create_iterator_begin() { return new std::map< K, T, C >::iterator($self->begin()); } const key_type& get_next_key(std::map< K, T, C >::iterator *swigiterator) { std::map< K, T, C >::iterator iter = *swigiterator; (*swigiterator)++; return (*iter).first; } void destroy_iterator(std::map< K, T, C >::iterator *swigiterator) { delete swigiterator; } } %enddef %csmethodmodifiers std::map::size "private" %csmethodmodifiers std::map::getitem "private" %csmethodmodifiers std::map::setitem "private" %csmethodmodifiers std::map::create_iterator_begin "private" %csmethodmodifiers std::map::get_next_key "private" %csmethodmodifiers std::map::destroy_iterator "private" // Default implementation namespace std { template > class map { SWIG_STD_MAP_INTERNAL(K, T, C) }; } // Legacy macros (deprecated) %define specialize_std_map_on_key(K,CHECK,CONVERT_FROM,CONVERT_TO) #warning "specialize_std_map_on_key ignored - macro is deprecated and no longer necessary" %enddef %define specialize_std_map_on_value(T,CHECK,CONVERT_FROM,CONVERT_TO) #warning "specialize_std_map_on_value ignored - macro is deprecated and no longer necessary" %enddef %define specialize_std_map_on_both(K,CHECK_K,CONVERT_K_FROM,CONVERT_K_TO, T,CHECK_T,CONVERT_T_FROM,CONVERT_T_TO) #warning "specialize_std_map_on_both ignored - macro is deprecated and no longer necessary" %enddef swig-4.0.1/Lib/csharp/swiginterface.i0000644000175000017500000000606513527063513017351 0ustar williamwilliam/* ----------------------------------------------------------------------------- * swiginterface.i * * SWIG interface feature and typemaps implementation providing: * %interface * %interface_impl * %interface_custom * ----------------------------------------------------------------------------- */ %define INTERFACE_TYPEMAPS(CTYPE...) %typemap(cstype) CTYPE "$&csinterfacename" %typemap(cstype) CTYPE *, CTYPE [], CTYPE & "$csinterfacename" %typemap(cstype) CTYPE *const& "$*csinterfacename" %typemap(csin) CTYPE, CTYPE & "$csinput.GetInterfaceCPtr()" %typemap(csin) CTYPE *, CTYPE *const&, CTYPE [] "$csinput == null ? new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero) : $csinput.GetInterfaceCPtr()" %typemap(csout, excode=SWIGEXCODE) CTYPE { $&csclassname ret = new $&csclassname($imcall, true);$excode return ($&csinterfacename)ret; } %typemap(csout, excode=SWIGEXCODE) CTYPE & { $csclassname ret = new $csclassname($imcall, $owner);$excode return ($csinterfacename)ret; } %typemap(csout, excode=SWIGEXCODE) CTYPE *, CTYPE [] { global::System.IntPtr cPtr = $imcall; $csclassname ret = (cPtr == global::System.IntPtr.Zero) ? null : new $csclassname(cPtr, $owner);$excode return ($csinterfacename)ret; } %typemap(csout, excode=SWIGEXCODE) CTYPE *const& { global::System.IntPtr cPtr = $imcall; $*csclassname ret = (cPtr == global::System.IntPtr.Zero) ? null : new $*csclassname(cPtr, $owner);$excode return ($*csinterfacename)ret; } %typemap(csdirectorin) CTYPE "($&csinterfacename)new $&csclassname($iminput, true)" %typemap(csdirectorin) CTYPE & "($csinterfacename)new $csclassname($iminput, false)" %typemap(csdirectorin) CTYPE *, CTYPE [] "($iminput == global::System.IntPtr.Zero) ? null : ($csinterfacename)new $csclassname($iminput, false)" %typemap(csdirectorin) CTYPE *const& "($iminput == global::System.IntPtr.Zero) ? null : ($*csinterfacename)new $*csclassname($iminput, false)" %typemap(csdirectorout) CTYPE, CTYPE *, CTYPE *const&, CTYPE [], CTYPE & "$cscall.GetInterfaceCPtr()" %typemap(csinterfacecode, declaration=" [System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)]\n global::System.Runtime.InteropServices.HandleRef GetInterfaceCPtr();\n", cptrmethod="$interfacename_GetInterfaceCPtr") CTYPE %{ [System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)] global::System.Runtime.InteropServices.HandleRef $interfacename.GetInterfaceCPtr() { return new global::System.Runtime.InteropServices.HandleRef(this, $imclassname.$csclazzname$interfacename_GetInterfaceCPtr(swigCPtr.Handle)); } %} %enddef %define %interface(CTYPE...) %feature("interface", name="%sSwigInterface") CTYPE; INTERFACE_TYPEMAPS(CTYPE) %enddef %define %interface_impl(CTYPE...) %rename("%sSwigImpl") CTYPE; %feature("interface", name="%(rstrip:[SwigImpl])s") CTYPE; INTERFACE_TYPEMAPS(CTYPE) %enddef %define %interface_custom(PROXY, INTERFACE, CTYPE...) %rename(PROXY) CTYPE; %feature("interface", name=INTERFACE) CTYPE; INTERFACE_TYPEMAPS(CTYPE) %enddef swig-4.0.1/Lib/csharp/boost_shared_ptr.i0000644000175000017500000003513513527063513020060 0ustar williamwilliam// Users can provide their own SWIG_SHARED_PTR_TYPEMAPS macro before including this file to change the // visibility of the constructor and getCPtr method if desired to public if using multiple modules. #ifndef SWIG_SHARED_PTR_TYPEMAPS #define SWIG_SHARED_PTR_TYPEMAPS(CONST, TYPE...) SWIG_SHARED_PTR_TYPEMAPS_IMPLEMENTATION(internal, internal, CONST, TYPE) #endif %include // Language specific macro implementing all the customisations for handling the smart pointer %define SWIG_SHARED_PTR_TYPEMAPS_IMPLEMENTATION(PTRCTOR_VISIBILITY, CPTR_VISIBILITY, CONST, TYPE...) // %naturalvar is as documented for member variables %naturalvar TYPE; %naturalvar SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >; // destructor mods %feature("unref") TYPE //"if (debug_shared) { cout << \"deleting use_count: \" << (*smartarg1).use_count() << \" [\" << (boost::get_deleter(*smartarg1) ? std::string(\"CANNOT BE DETERMINED SAFELY\") : ( (*smartarg1).get() ? (*smartarg1)->getValue() : std::string(\"NULL PTR\") )) << \"]\" << endl << flush; }\n" "(void)arg1; delete smartarg1;" // Typemap customisations... // plain value %typemap(in, canthrow=1) CONST TYPE ($&1_type argp = 0) %{ argp = ((SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *)$input) ? ((SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *)$input)->get() : 0; if (!argp) { SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "Attempt to dereference null $1_type", 0); return $null; } $1 = *argp; %} %typemap(out) CONST TYPE %{ $result = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(new $1_ltype(($1_ltype &)$1)); %} %typemap(directorin) CONST TYPE %{ $input = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > (new $1_ltype((const $1_ltype &)$1)); %} %typemap(directorout) CONST TYPE %{ if (!$input) { SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "Attempt to dereference null $1_type", 0); return $null; } SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = (SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *)$input; $result = *smartarg->get(); %} // plain pointer %typemap(in, canthrow=1) CONST TYPE * (SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0) %{ smartarg = (SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *)$input; $1 = (TYPE *)(smartarg ? smartarg->get() : 0); %} %typemap(out, fragment="SWIG_null_deleter") CONST TYPE * %{ $result = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1 SWIG_NO_NULL_DELETER_$owner) : 0; %} %typemap(directorin) CONST TYPE * %{ $input = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1 SWIG_NO_NULL_DELETER_0) : 0; %} %typemap(directorout) CONST TYPE * %{ #error "typemaps for $1_type not available" %} // plain reference %typemap(in, canthrow=1) CONST TYPE & %{ $1 = ($1_ltype)(((SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *)$input) ? ((SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *)$input)->get() : 0); if (!$1) { SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "$1_type reference is null", 0); return $null; } %} %typemap(out, fragment="SWIG_null_deleter") CONST TYPE & %{ $result = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1 SWIG_NO_NULL_DELETER_$owner); %} %typemap(directorin) CONST TYPE & %{ $input = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > (&$1 SWIG_NO_NULL_DELETER_0); %} %typemap(directorout) CONST TYPE & %{ #error "typemaps for $1_type not available" %} // plain pointer by reference %typemap(in) TYPE *CONST& ($*1_ltype temp = 0) %{ temp = (TYPE *)(((SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *)$input) ? ((SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *)$input)->get() : 0); $1 = &temp; %} %typemap(out, fragment="SWIG_null_deleter") TYPE *CONST& %{ $result = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(*$1 SWIG_NO_NULL_DELETER_$owner); %} %typemap(directorin) TYPE *CONST& %{ $input = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1 SWIG_NO_NULL_DELETER_0) : 0; %} %typemap(directorout) TYPE *CONST& %{ #error "typemaps for $1_type not available" %} // shared_ptr by value %typemap(in) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > %{ if ($input) $1 = *($&1_ltype)$input; %} %typemap(out) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > %{ $result = $1 ? new $1_ltype($1) : 0; %} %typemap(directorin) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > %{ $input = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1) : 0; %} %typemap(directorout) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > %{ if ($input) { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = (SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *)$input; $result = *smartarg; } %} // shared_ptr by reference %typemap(in, canthrow=1) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > & ($*1_ltype tempnull) %{ $1 = $input ? ($1_ltype)$input : &tempnull; %} %typemap(out) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > & %{ $result = *$1 ? new $*1_ltype(*$1) : 0; %} %typemap(directorin) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > & %{ $input = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1) : 0; %} %typemap(directorout) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > & %{ #error "typemaps for $1_type not available" %} // shared_ptr by pointer %typemap(in) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * ($*1_ltype tempnull) %{ $1 = $input ? ($1_ltype)$input : &tempnull; %} %typemap(out, fragment="SWIG_null_deleter") SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * %{ $result = ($1 && *$1) ? new $*1_ltype(*($1_ltype)$1) : 0; if ($owner) delete $1; %} %typemap(directorin) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * %{ $input = ($1 && *$1) ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(*$1) : 0; %} %typemap(directorout) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * %{ #error "typemaps for $1_type not available" %} // shared_ptr by pointer reference %typemap(in) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& (SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > tempnull, $*1_ltype temp = 0) %{ temp = $input ? *($1_ltype)&$input : &tempnull; $1 = &temp; %} %typemap(out) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& %{ *($1_ltype)&$result = (*$1 && **$1) ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(**$1) : 0; %} %typemap(directorin) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& %{ $input = ($1 && *$1) ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(*$1) : 0; %} %typemap(directorout) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& %{ #error "typemaps for $1_type not available" %} // various missing typemaps - If ever used (unlikely) ensure compilation error rather than runtime bug %typemap(in) CONST TYPE[], CONST TYPE[ANY], CONST TYPE (CLASS::*) %{ #error "typemaps for $1_type not available" %} %typemap(out) CONST TYPE[], CONST TYPE[ANY], CONST TYPE (CLASS::*) %{ #error "typemaps for $1_type not available" %} %typemap (ctype) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > &, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& "void *" %typemap (imtype, out="global::System.IntPtr") SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > &, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& "global::System.Runtime.InteropServices.HandleRef" %typemap (cstype) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > &, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& "$typemap(cstype, TYPE)" %typemap(csin) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > &, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& "$typemap(cstype, TYPE).getCPtr($csinput)" %typemap(csout, excode=SWIGEXCODE) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > { global::System.IntPtr cPtr = $imcall; $typemap(cstype, TYPE) ret = (cPtr == global::System.IntPtr.Zero) ? null : new $typemap(cstype, TYPE)(cPtr, true);$excode return ret; } %typemap(csout, excode=SWIGEXCODE) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > & { global::System.IntPtr cPtr = $imcall; $typemap(cstype, TYPE) ret = (cPtr == global::System.IntPtr.Zero) ? null : new $typemap(cstype, TYPE)(cPtr, true);$excode return ret; } %typemap(csout, excode=SWIGEXCODE) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * { global::System.IntPtr cPtr = $imcall; $typemap(cstype, TYPE) ret = (cPtr == global::System.IntPtr.Zero) ? null : new $typemap(cstype, TYPE)(cPtr, true);$excode return ret; } %typemap(csout, excode=SWIGEXCODE) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& { global::System.IntPtr cPtr = $imcall; $typemap(cstype, TYPE) ret = (cPtr == global::System.IntPtr.Zero) ? null : new $typemap(cstype, TYPE)(cPtr, true);$excode return ret; } %typemap(csout, excode=SWIGEXCODE) CONST TYPE { $typemap(cstype, TYPE) ret = new $typemap(cstype, TYPE)($imcall, true);$excode return ret; } %typemap(csout, excode=SWIGEXCODE) CONST TYPE & { $typemap(cstype, TYPE) ret = new $typemap(cstype, TYPE)($imcall, true);$excode return ret; } %typemap(csout, excode=SWIGEXCODE) CONST TYPE * { global::System.IntPtr cPtr = $imcall; $typemap(cstype, TYPE) ret = (cPtr == global::System.IntPtr.Zero) ? null : new $typemap(cstype, TYPE)(cPtr, true);$excode return ret; } %typemap(csout, excode=SWIGEXCODE) TYPE *CONST& { global::System.IntPtr cPtr = $imcall; $typemap(cstype, TYPE) ret = (cPtr == global::System.IntPtr.Zero) ? null : new $typemap(cstype, TYPE)(cPtr, true);$excode return ret; } %typemap(csvarout, excode=SWIGEXCODE2) CONST TYPE & %{ get { $csclassname ret = new $csclassname($imcall, true);$excode return ret; } %} %typemap(csvarout, excode=SWIGEXCODE2) CONST TYPE * %{ get { global::System.IntPtr cPtr = $imcall; $csclassname ret = (cPtr == global::System.IntPtr.Zero) ? null : new $csclassname(cPtr, true);$excode return ret; } %} %typemap(csvarout, excode=SWIGEXCODE2) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > & %{ get { global::System.IntPtr cPtr = $imcall; $typemap(cstype, TYPE) ret = (cPtr == global::System.IntPtr.Zero) ? null : new $typemap(cstype, TYPE)(cPtr, true);$excode return ret; } %} %typemap(csvarout, excode=SWIGEXCODE2) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * %{ get { global::System.IntPtr cPtr = $imcall; $typemap(cstype, TYPE) ret = (cPtr == global::System.IntPtr.Zero) ? null : new $typemap(cstype, TYPE)(cPtr, true);$excode return ret; } %} %typemap(csdirectorout) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > "$typemap(cstype, TYPE).getCPtr($cscall).Handle" %typemap(csdirectorin) CONST TYPE, CONST TYPE *, CONST TYPE &, TYPE *CONST& "($iminput == global::System.IntPtr.Zero) ? null : new $typemap(cstype, TYPE)($iminput, true)" %typemap(csdirectorin) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > &, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& "($iminput == global::System.IntPtr.Zero) ? null : new $typemap(cstype, TYPE)($iminput, true)" // Proxy classes (base classes, ie, not derived classes) %typemap(csbody) TYPE %{ private global::System.Runtime.InteropServices.HandleRef swigCPtr; private bool swigCMemOwnBase; PTRCTOR_VISIBILITY $csclassname(global::System.IntPtr cPtr, bool cMemoryOwn) { swigCMemOwnBase = cMemoryOwn; swigCPtr = new global::System.Runtime.InteropServices.HandleRef(this, cPtr); } CPTR_VISIBILITY static global::System.Runtime.InteropServices.HandleRef getCPtr($csclassname obj) { return (obj == null) ? new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero) : obj.swigCPtr; } %} // Derived proxy classes %typemap(csbody_derived) TYPE %{ private global::System.Runtime.InteropServices.HandleRef swigCPtr; private bool swigCMemOwnDerived; PTRCTOR_VISIBILITY $csclassname(global::System.IntPtr cPtr, bool cMemoryOwn) : base($imclassname.$csclazznameSWIGSmartPtrUpcast(cPtr), true) { swigCMemOwnDerived = cMemoryOwn; swigCPtr = new global::System.Runtime.InteropServices.HandleRef(this, cPtr); } CPTR_VISIBILITY static global::System.Runtime.InteropServices.HandleRef getCPtr($csclassname obj) { return (obj == null) ? new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero) : obj.swigCPtr; } %} %typemap(csdisposing, methodname="Dispose", methodmodifiers="protected", parameters="bool disposing") TYPE { lock(this) { if (swigCPtr.Handle != global::System.IntPtr.Zero) { if (swigCMemOwnBase) { swigCMemOwnBase = false; $imcall; } swigCPtr = new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero); } } } %typemap(csdisposing_derived, methodname="Dispose", methodmodifiers="protected", parameters="bool disposing") TYPE { lock(this) { if (swigCPtr.Handle != global::System.IntPtr.Zero) { if (swigCMemOwnDerived) { swigCMemOwnDerived = false; $imcall; } swigCPtr = new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero); } base.Dispose(disposing); } } // Typecheck typemaps %typemap(typecheck, precedence=SWIG_TYPECHECK_POINTER, equivalent="TYPE *") TYPE CONST, TYPE CONST &, TYPE CONST *, TYPE *CONST&, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > &, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& "" %template() SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >; %enddef swig-4.0.1/Lib/linkruntime.c0000644000175000017500000000100013527063513015552 0ustar williamwilliam#ifndef SWIGEXPORT # if defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__) # if defined(STATIC_LINKED) # define SWIGEXPORT # else # define SWIGEXPORT __declspec(dllexport) # endif # else # if defined(__GNUC__) && defined(GCC_HASCLASSVISIBILITY) # define SWIGEXPORT __attribute__ ((visibility("default"))) # else # define SWIGEXPORT # endif # endif #endif static void *ptr = 0; SWIGEXPORT void * SWIG_ReturnGlobalTypeList(void *t) { if (!ptr && !t) ptr = t; return ptr; } swig-4.0.1/Lib/guile/0000755000175000017500000000000013527063513014163 5ustar williamwilliamswig-4.0.1/Lib/guile/std_deque.i0000644000175000017500000000003413527063513016307 0ustar williamwilliam%include swig-4.0.1/Lib/guile/common.scm0000644000175000017500000000452013527063513016160 0ustar williamwilliam;;;************************************************************************ ;;;*common.scm ;;;* ;;;* This file contains generic SWIG GOOPS classes for generated ;;;* GOOPS file support ;;;************************************************************************ (define-module (Swig swigrun)) (define-module (Swig common) #:use-module (oop goops) #:use-module (Swig swigrun)) (define-class () (new-function #:init-value #f)) (define-method (initialize (class ) initargs) (slot-set! class 'new-function (get-keyword #:new-function initargs #f)) (next-method)) (define-class () (swig-smob #:init-value #f) #:metaclass ) (define-method (initialize (obj ) initargs) (next-method) (slot-set! obj 'swig-smob (let ((arg (get-keyword #:init-smob initargs #f))) (if arg arg (let ((ret (apply (slot-ref (class-of obj) 'new-function) (get-keyword #:args initargs '())))) ;; if the class is registered with runtime environment, ;; new-Function will return a goops class. In that case, extract the smob ;; from that goops class and set it as the current smob. (if (slot-exists? ret 'swig-smob) (slot-ref ret 'swig-smob) ret)))))) (define (display-address o file) (display (number->string (object-address o) 16) file)) (define (display-pointer-address o file) ;; Don't fail if the function SWIG-PointerAddress is not present. (let ((address (false-if-exception (SWIG-PointerAddress o)))) (if address (begin (display " @ " file) (display (number->string address 16) file))))) (define-method (write (o ) file) ;; We display _two_ addresses to show the object's identity: ;; * first the address of the GOOPS proxy object, ;; * second the pointer address. ;; The reason is that proxy objects are created and discarded on the ;; fly, so different proxy objects for the same C object will appear. (let ((class (class-of o))) (if (slot-bound? class 'name) (begin (display "#<" file) (display (class-name class) file) (display #\space file) (display-address o file) (display-pointer-address o file) (display ">" file)) (next-method)))) (export ) ;;; common.scm ends here swig-4.0.1/Lib/guile/std_vector.i0000644000175000017500000004176413527063513016525 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_vector.i * * SWIG typemaps for std::vector * ----------------------------------------------------------------------------- */ %include // ------------------------------------------------------------------------ // std::vector // // The aim of all that follows would be to integrate std::vector with // Guile as much as possible, namely, to allow the user to pass and // be returned Guile vectors or lists. // const declarations are used to guess the intent of the function being // exported; therefore, the following rationale is applied: // // -- f(std::vector), f(const std::vector&), f(const std::vector*): // the parameter being read-only, either a Guile sequence or a // previously wrapped std::vector can be passed. // -- f(std::vector&), f(std::vector*): // the parameter must be modified; therefore, only a wrapped std::vector // can be passed. // -- std::vector f(): // the vector is returned by copy; therefore, a Guile vector of T:s // is returned which is most easily used in other Guile functions // -- std::vector& f(), std::vector* f(), const std::vector& f(), // const std::vector* f(): // the vector is returned by reference; therefore, a wrapped std::vector // is returned // ------------------------------------------------------------------------ %{ #include #include #include %} // exported class namespace std { template class vector { %typemap(in) vector { if (scm_is_vector($input)) { unsigned long size = scm_c_vector_length($input); $1 = std::vector< T >(size); for (unsigned long i=0; i(); } else if (scm_is_pair($input)) { SCM head, tail; $1 = std::vector< T >(); tail = $input; while (!scm_is_null(tail)) { head = SCM_CAR(tail); tail = SCM_CDR(tail); $1.push_back(*((T*)SWIG_MustGetPtr(head, $descriptor(T *), $argnum, 0))); } } else { $1 = *(($&1_type) SWIG_MustGetPtr($input,$&1_descriptor,$argnum, 0)); } } %typemap(in) const vector& (std::vector temp), const vector* (std::vector temp) { if (scm_is_vector($input)) { unsigned long size = scm_c_vector_length($input); temp = std::vector< T >(size); $1 = &temp; for (unsigned long i=0; i(); $1 = &temp; } else if (scm_is_pair($input)) { temp = std::vector< T >(); $1 = &temp; SCM head, tail; tail = $input; while (!scm_is_null(tail)) { head = SCM_CAR(tail); tail = SCM_CDR(tail); temp.push_back(*((T*) SWIG_MustGetPtr(head, $descriptor(T *), $argnum, 0))); } } else { $1 = ($1_ltype) SWIG_MustGetPtr($input,$1_descriptor,$argnum, 0); } } %typemap(out) vector { $result = scm_make_vector(scm_from_long($1.size()),SCM_UNSPECIFIED); for (unsigned int i=0; i<$1.size(); i++) { T* x = new T((($1_type &)$1)[i]); scm_vector_set_x($result,scm_from_long(i), SWIG_NewPointerObj(x, $descriptor(T *), 1)); } } %typecheck(SWIG_TYPECHECK_VECTOR) vector { /* native sequence? */ if (scm_is_vector($input)) { unsigned int size = scm_c_vector_length($input); if (size == 0) { /* an empty sequence can be of any type */ $1 = 1; } else { /* check the first element only */ SCM o = scm_vector_ref($input,scm_from_ulong(0)); T* x; if (SWIG_ConvertPtr(o,(void**) &x, $descriptor(T *), 0) != -1) $1 = 1; else $1 = 0; } } else if (scm_is_null($input)) { /* again, an empty sequence can be of any type */ $1 = 1; } else if (scm_is_pair($input)) { /* check the first element only */ T* x; SCM head = SCM_CAR($input); if (SWIG_ConvertPtr(head,(void**) &x, $descriptor(T *), 0) != -1) $1 = 1; else $1 = 0; } else { /* wrapped vector? */ std::vector< T >* v; if (SWIG_ConvertPtr($input,(void **) &v, $&1_descriptor, 0) != -1) $1 = 1; else $1 = 0; } } %typecheck(SWIG_TYPECHECK_VECTOR) const vector&, const vector* { /* native sequence? */ if (scm_is_vector($input)) { unsigned int size = scm_c_vector_length($input); if (size == 0) { /* an empty sequence can be of any type */ $1 = 1; } else { /* check the first element only */ T* x; SCM o = scm_vector_ref($input,scm_from_ulong(0)); if (SWIG_ConvertPtr(o,(void**) &x, $descriptor(T *), 0) != -1) $1 = 1; else $1 = 0; } } else if (scm_is_null($input)) { /* again, an empty sequence can be of any type */ $1 = 1; } else if (scm_is_pair($input)) { /* check the first element only */ T* x; SCM head = SCM_CAR($input); if (SWIG_ConvertPtr(head,(void**) &x, $descriptor(T *), 0) != -1) $1 = 1; else $1 = 0; } else { /* wrapped vector? */ std::vector< T >* v; if (SWIG_ConvertPtr($input,(void **) &v, $1_descriptor, 0) != -1) $1 = 1; else $1 = 0; } } public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef T value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; vector(unsigned int size = 0); vector(unsigned int size, const T& value); vector(const vector& other); %rename(length) size; unsigned int size() const; %rename("empty?") empty; bool empty() const; %rename("clear!") clear; void clear(); %rename("set!") set; %rename("pop!") pop; %rename("push!") push_back; void push_back(const T& x); %extend { T pop() throw (std::out_of_range) { if (self->size() == 0) throw std::out_of_range("pop from empty vector"); T x = self->back(); self->pop_back(); return x; } const T& ref(int i) throw (std::out_of_range) { int size = int(self->size()); if (i>=0 && isize()); if (i>=0 && i class vector { %typemap(in) vector { if (scm_is_vector($input)) { unsigned long size = scm_c_vector_length($input); $1 = std::vector< T >(size); for (unsigned long i=0; i(); } else if (scm_is_pair($input)) { SCM v = scm_vector($input); unsigned long size = scm_c_vector_length(v); $1 = std::vector< T >(size); for (unsigned long i=0; i& (std::vector temp), const vector* (std::vector temp) { if (scm_is_vector($input)) { unsigned long size = scm_c_vector_length($input); temp = std::vector< T >(size); $1 = &temp; for (unsigned long i=0; i(); $1 = &temp; } else if (scm_is_pair($input)) { SCM v = scm_vector($input); unsigned long size = scm_c_vector_length(v); temp = std::vector< T >(size); $1 = &temp; for (unsigned long i=0; i { $result = scm_make_vector(scm_from_long($1.size()),SCM_UNSPECIFIED); for (unsigned int i=0; i<$1.size(); i++) { SCM x = CONVERT_TO((($1_type &)$1)[i]); scm_vector_set_x($result,scm_from_long(i),x); } } %typecheck(SWIG_TYPECHECK_VECTOR) vector { /* native sequence? */ if (scm_is_vector($input)) { unsigned int size = scm_c_vector_length($input); if (size == 0) { /* an empty sequence can be of any type */ $1 = 1; } else { /* check the first element only */ SCM o = scm_vector_ref($input,scm_from_ulong(0)); $1 = CHECK(o) ? 1 : 0; } } else if (scm_is_null($input)) { /* again, an empty sequence can be of any type */ $1 = 1; } else if (scm_is_pair($input)) { /* check the first element only */ SCM head = SCM_CAR($input); $1 = CHECK(head) ? 1 : 0; } else { /* wrapped vector? */ std::vector< T >* v; $1 = (SWIG_ConvertPtr($input,(void **) &v, $&1_descriptor, 0) != -1) ? 1 : 0; } } %typecheck(SWIG_TYPECHECK_VECTOR) const vector&, const vector* { /* native sequence? */ if (scm_is_vector($input)) { unsigned int size = scm_c_vector_length($input); if (size == 0) { /* an empty sequence can be of any type */ $1 = 1; } else { /* check the first element only */ SCM o = scm_vector_ref($input,scm_from_ulong(0)); $1 = CHECK(o) ? 1 : 0; } } else if (scm_is_null($input)) { /* again, an empty sequence can be of any type */ $1 = 1; } else if (scm_is_pair($input)) { /* check the first element only */ SCM head = SCM_CAR($input); $1 = CHECK(head) ? 1 : 0; } else { /* wrapped vector? */ std::vector< T >* v; $1 = (SWIG_ConvertPtr($input,(void **) &v, $1_descriptor, 0) != -1) ? 1 : 0; } } public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef T value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; vector(unsigned int size = 0); vector(unsigned int size, const T& value); vector(const vector& other); %rename(length) size; unsigned int size() const; %rename("empty?") empty; bool empty() const; %rename("clear!") clear; void clear(); %rename("set!") set; %rename("pop!") pop; %rename("push!") push_back; void push_back(T x); %extend { T pop() throw (std::out_of_range) { if (self->size() == 0) throw std::out_of_range("pop from empty vector"); T x = self->back(); self->pop_back(); return x; } T ref(int i) throw (std::out_of_range) { int size = int(self->size()); if (i>=0 && isize()); if (i>=0 && i #include #include #include #include #ifdef __cplusplus extern "C" { #endif /* In the code below, use guile 2.0 compatible functions where possible. Functions that don't exist in older versions will be mapped to a deprecated equivalent for those versions only */ #if defined (SCM_MAJOR_VERSION) && (SCM_MAJOR_VERSION < 2) static SCM scm_module_variable (SCM module, SCM sym) { return scm_sym2var (sym, scm_module_lookup_closure (module), SCM_BOOL_F); } #define scm_to_utf8_string scm_to_locale_string #define scm_from_utf8_string scm_from_locale_string #endif #if SCM_MAJOR_VERSION >= 2 /* scm_c_define_gsubr takes a different parameter type depending on the guile version */ typedef scm_t_subr swig_guile_proc; #else typedef SCM (*swig_guile_proc)(); #endif typedef SCM (*guile_destructor)(SCM); typedef struct swig_guile_clientdata { guile_destructor destroy; SCM goops_class; } swig_guile_clientdata; #define SWIG_scm2str(s) \ SWIG_Guile_scm2newstr(s, NULL) #define SWIG_str02scm(str) \ str ? scm_from_utf8_string(str) : SCM_BOOL_F # define SWIG_malloc(size) \ scm_malloc(size) # define SWIG_free(mem) \ free(mem) #define SWIG_ConvertPtr(s, result, type, flags) \ SWIG_Guile_ConvertPtr(s, result, type, flags) #define SWIG_MustGetPtr(s, type, argnum, flags) \ SWIG_Guile_MustGetPtr(s, type, argnum, flags, FUNC_NAME) #define SWIG_NewPointerObj(ptr, type, owner) \ SWIG_Guile_NewPointerObj((void*)ptr, type, owner) #define SWIG_PointerAddress(object) \ SWIG_Guile_PointerAddress(object) #define SWIG_PointerType(object) \ SWIG_Guile_PointerType(object) #define SWIG_IsPointerOfType(object, type) \ SWIG_Guile_IsPointerOfType(object, type) #define SWIG_IsPointer(object) \ SWIG_Guile_IsPointer(object) #define SWIG_contract_assert(expr, msg) \ if (!(expr)) \ scm_error(scm_from_locale_symbol("swig-contract-assertion-failed"), \ (char *) FUNC_NAME, (char *) msg, \ SCM_EOL, SCM_BOOL_F); else /* for C++ member pointers, ie, member methods */ #define SWIG_ConvertMember(obj, ptr, sz, ty) \ SWIG_Guile_ConvertMember(obj, ptr, sz, ty, FUNC_NAME) #define SWIG_NewMemberObj(ptr, sz, type) \ SWIG_Guile_NewMemberObj(ptr, sz, type, FUNC_NAME) /* Runtime API */ static swig_module_info *SWIG_Guile_GetModule(void *SWIGUNUSEDPARM(clientdata)); #define SWIG_GetModule(clientdata) SWIG_Guile_GetModule(clientdata) #define SWIG_SetModule(clientdata, pointer) SWIG_Guile_SetModule(pointer) SWIGINTERN char * SWIG_Guile_scm2newstr(SCM str, size_t *len) { #define FUNC_NAME "SWIG_Guile_scm2newstr" char *ret; SCM_ASSERT (scm_is_string(str), str, 1, FUNC_NAME); ret = scm_to_utf8_string(str); if (!ret) return NULL; if (len) *len = strlen(ret) - 1; return ret; #undef FUNC_NAME } static int swig_initialized = 0; static scm_t_bits swig_tag = 0; static scm_t_bits swig_collectable_tag = 0; static scm_t_bits swig_finalized_tag = 0; static scm_t_bits swig_destroyed_tag = 0; static scm_t_bits swig_member_function_tag = 0; static SCM swig_make_func = SCM_EOL; static SCM swig_keyword = SCM_EOL; static SCM swig_symbol = SCM_EOL; #define SWIG_Guile_GetSmob(x) \ ( !scm_is_null(x) && SCM_INSTANCEP(x) && scm_is_true(scm_slot_exists_p(x, swig_symbol)) \ ? scm_slot_ref(x, swig_symbol) : (x) ) SWIGINTERN SCM SWIG_Guile_NewPointerObj(void *ptr, swig_type_info *type, int owner) { if (ptr == NULL) return SCM_EOL; else { SCM smob; swig_guile_clientdata *cdata = (swig_guile_clientdata *) type->clientdata; if (owner) SCM_NEWSMOB2(smob, swig_collectable_tag, ptr, (void *) type); else SCM_NEWSMOB2(smob, swig_tag, ptr, (void *) type); if (!cdata || SCM_NULLP(cdata->goops_class) || swig_make_func == SCM_EOL ) { return smob; } else { /* the scm_make() C function only handles the creation of gf, methods and classes (no instances) the (make ...) function is later redefined in goops.scm. So we need to call that Scheme function. */ return scm_apply(swig_make_func, scm_list_3(cdata->goops_class, swig_keyword, smob), SCM_EOL); } } } SWIGINTERN unsigned long SWIG_Guile_PointerAddress(SCM object) { SCM smob = SWIG_Guile_GetSmob(object); if (SCM_NULLP(smob)) return 0; else if (SCM_SMOB_PREDICATE(swig_tag, smob) || SCM_SMOB_PREDICATE(swig_collectable_tag, smob) || SCM_SMOB_PREDICATE(swig_destroyed_tag, smob)) { return (unsigned long) (void *) SCM_CELL_WORD_1(smob); } else scm_wrong_type_arg("SWIG-Guile-PointerAddress", 1, object); } SWIGINTERN swig_type_info * SWIG_Guile_PointerType(SCM object) { SCM smob = SWIG_Guile_GetSmob(object); if (SCM_NULLP(smob)) return NULL; else if (SCM_SMOB_PREDICATE(swig_tag, smob) || SCM_SMOB_PREDICATE(swig_collectable_tag, smob) || SCM_SMOB_PREDICATE(swig_destroyed_tag, smob)) { return (swig_type_info *) SCM_CELL_WORD_2(smob); } else scm_wrong_type_arg("SWIG-Guile-PointerType", 1, object); } SWIGINTERN int SWIG_Guile_IsValidSmob(SCM smob) { /* We do not accept smobs representing destroyed pointers, but we have to allow finalized smobs because Guile >= 2.0.12 sets all smob instances to the 'finalized' type before calling their 'free' function. This change was introduced to Guile in commit 8dff3af087c6eaa83ae0d72aa8b22aef5c65d65d */ return SCM_SMOB_PREDICATE(swig_tag, smob) || SCM_SMOB_PREDICATE(swig_collectable_tag, smob) || SCM_SMOB_PREDICATE(swig_finalized_tag, smob); } SWIGINTERN int SWIG_Guile_ConvertPtr(SCM s, void **result, swig_type_info *type, int flags) { swig_cast_info *cast; swig_type_info *from; SCM smob = SWIG_Guile_GetSmob(s); if (SCM_NULLP(smob)) { *result = NULL; return (flags & SWIG_POINTER_NO_NULL) ? SWIG_NullReferenceError : SWIG_OK; #if SCM_MAJOR_VERSION >= 2 } else if (SCM_POINTER_P(s)) { *result = SCM_POINTER_VALUE(s); return SWIG_OK; #endif /* if SCM_MAJOR_VERSION >= 2 */ } else if (SWIG_Guile_IsValidSmob(smob)) { from = (swig_type_info *) SCM_CELL_WORD_2(smob); if (!from) return SWIG_ERROR; if (type) { cast = SWIG_TypeCheckStruct(from, type); if (cast) { int newmemory = 0; *result = SWIG_TypeCast(cast, (void *) SCM_CELL_WORD_1(smob), &newmemory); assert(!newmemory); /* newmemory handling not yet implemented */ return SWIG_OK; } else { return SWIG_ERROR; } } else { *result = (void *) SCM_CELL_WORD_1(smob); return SWIG_OK; } } return SWIG_ERROR; } SWIGINTERNINLINE void * SWIG_Guile_MustGetPtr (SCM s, swig_type_info *type, int argnum, int flags, const char *func_name) { void *result; int res = SWIG_Guile_ConvertPtr(s, &result, type, flags); if (!SWIG_IsOK(res)) { /* type mismatch */ scm_wrong_type_arg((char *) func_name, argnum, s); } return result; } SWIGINTERNINLINE int SWIG_Guile_IsPointerOfType (SCM s, swig_type_info *type) { void *result; if (SWIG_Guile_ConvertPtr(s, &result, type, 0)) { /* type mismatch */ return 0; } else return 1; } SWIGINTERNINLINE int SWIG_Guile_IsPointer (SCM s) { /* module might not be initialized yet, so initialize it */ SWIG_GetModule(0); return SWIG_Guile_IsPointerOfType (s, NULL); } /* Mark a pointer object non-collectable */ SWIGINTERN void SWIG_Guile_MarkPointerNoncollectable(SCM s) { SCM smob = SWIG_Guile_GetSmob(s); if (!SCM_NULLP(smob)) { if (SWIG_Guile_IsValidSmob(smob)) { SCM_SET_CELL_TYPE(smob, swig_tag); } else scm_wrong_type_arg(NULL, 0, s); } } /* Mark a pointer object destroyed */ SWIGINTERN void SWIG_Guile_MarkPointerDestroyed(SCM s) { SCM smob = SWIG_Guile_GetSmob(s); if (!SCM_NULLP(smob)) { if (SWIG_Guile_IsValidSmob(smob)) { SCM_SET_CELL_TYPE(smob, swig_destroyed_tag); } else scm_wrong_type_arg(NULL, 0, s); } } /* Member functions */ SWIGINTERN SCM SWIG_Guile_NewMemberObj(void *ptr, size_t sz, swig_type_info *type, const char *func_name) { SCM smob; void *copy = malloc(sz); memcpy(copy, ptr, sz); SCM_NEWSMOB2(smob, swig_member_function_tag, copy, (void *) type); return smob; } SWIGINTERN int SWIG_Guile_ConvertMember(SCM smob, void *ptr, size_t sz, swig_type_info *type, const char *func_name) { swig_cast_info *cast; swig_type_info *from; if (SCM_SMOB_PREDICATE(swig_member_function_tag, smob)) { from = (swig_type_info *) SCM_CELL_WORD_2(smob); if (!from) return SWIG_ERROR; if (type) { cast = SWIG_TypeCheckStruct(from, type); if (!cast) return SWIG_ERROR; } memcpy(ptr, (void *) SCM_CELL_WORD_1(smob), sz); return SWIG_OK; } return SWIG_ERROR; } /* Init */ SWIGINTERN int print_swig_aux (SCM swig_smob, SCM port, scm_print_state *pstate, const char *attribute) { swig_type_info *type; type = (swig_type_info *) SCM_CELL_WORD_2(swig_smob); if (type) { scm_puts((char *) "#<", port); scm_puts((char *) attribute, port); scm_puts((char *) "swig-pointer ", port); scm_puts((char *) SWIG_TypePrettyName(type), port); scm_puts((char *) " ", port); scm_intprint((long) SCM_CELL_WORD_1(swig_smob), 16, port); scm_puts((char *) ">", port); /* non-zero means success */ return 1; } else { return 0; } } SWIGINTERN int print_swig (SCM swig_smob, SCM port, scm_print_state *pstate) { return print_swig_aux(swig_smob, port, pstate, ""); } SWIGINTERN int print_collectable_swig (SCM swig_smob, SCM port, scm_print_state *pstate) { return print_swig_aux(swig_smob, port, pstate, "collectable-"); } SWIGINTERN int print_destroyed_swig (SCM swig_smob, SCM port, scm_print_state *pstate) { return print_swig_aux(swig_smob, port, pstate, "destroyed-"); } SWIGINTERN int print_member_function_swig (SCM swig_smob, SCM port, scm_print_state *pstate) { swig_type_info *type; type = (swig_type_info *) SCM_CELL_WORD_2(swig_smob); if (type) { scm_puts((char *) "#<", port); scm_puts((char *) "swig-member-function-pointer ", port); scm_puts((char *) SWIG_TypePrettyName(type), port); scm_puts((char *) " >", port); /* non-zero means success */ return 1; } else { return 0; } } SWIGINTERN SCM equalp_swig (SCM A, SCM B) { if (SCM_CELL_WORD_0(A) == SCM_CELL_WORD_0(B) && SCM_CELL_WORD_1(A) == SCM_CELL_WORD_1(B) && SCM_CELL_WORD_2(A) == SCM_CELL_WORD_2(B)) return SCM_BOOL_T; else return SCM_BOOL_F; } SWIGINTERN size_t free_swig(SCM A) { swig_type_info *type = (swig_type_info *) SCM_CELL_WORD_2(A); if (type) { if (type->clientdata && ((swig_guile_clientdata *)type->clientdata)->destroy) ((swig_guile_clientdata *)type->clientdata)->destroy(A); } return 0; } SWIGINTERN size_t free_swig_member_function(SCM A) { free((swig_type_info *) SCM_CELL_WORD_1(A)); return 0; } SWIGINTERN int ensure_smob_tag(SCM swig_module, scm_t_bits *tag_variable, const char *smob_name, const char *scheme_variable_name) { SCM variable = scm_module_variable(swig_module, scm_from_locale_symbol(scheme_variable_name)); if (scm_is_false(variable)) { *tag_variable = scm_make_smob_type((char*)scheme_variable_name, 0); scm_c_module_define(swig_module, scheme_variable_name, scm_from_ulong(*tag_variable)); return 1; } else { *tag_variable = scm_to_ulong(SCM_VARIABLE_REF(variable)); return 0; } } SWIGINTERN SCM SWIG_Guile_Init () { static SCM swig_module; if (swig_initialized) return swig_module; swig_initialized = 1; swig_module = scm_c_resolve_module("Swig swigrun"); if (ensure_smob_tag(swig_module, &swig_tag, "swig-pointer", "swig-pointer-tag")) { scm_set_smob_print(swig_tag, print_swig); scm_set_smob_equalp(swig_tag, equalp_swig); } if (ensure_smob_tag(swig_module, &swig_collectable_tag, "collectable-swig-pointer", "collectable-swig-pointer-tag")) { scm_set_smob_print(swig_collectable_tag, print_collectable_swig); scm_set_smob_equalp(swig_collectable_tag, equalp_swig); scm_set_smob_free(swig_collectable_tag, free_swig); /* For Guile >= 2.0.12. See libguile/smob.c:clear_smobnum */ swig_finalized_tag = swig_collectable_tag & ~0xff00; } if (ensure_smob_tag(swig_module, &swig_destroyed_tag, "destroyed-swig-pointer", "destroyed-swig-pointer-tag")) { scm_set_smob_print(swig_destroyed_tag, print_destroyed_swig); scm_set_smob_equalp(swig_destroyed_tag, equalp_swig); } if (ensure_smob_tag(swig_module, &swig_member_function_tag, "swig-member-function-pointer", "swig-member-function-pointer-tag")) { scm_set_smob_print(swig_member_function_tag, print_member_function_swig); scm_set_smob_free(swig_member_function_tag, free_swig_member_function); } swig_make_func = scm_permanent_object( scm_variable_ref(scm_c_module_lookup(scm_c_resolve_module("oop goops"), "make"))); swig_keyword = scm_permanent_object(scm_from_locale_keyword((char*) "init-smob")); swig_symbol = scm_permanent_object(scm_from_locale_symbol("swig-smob")); #ifdef SWIG_INIT_RUNTIME_MODULE SWIG_INIT_RUNTIME_MODULE #endif return swig_module; } SWIGINTERN swig_module_info * SWIG_Guile_GetModule(void *SWIGUNUSEDPARM(clientdata)) { SCM module = SWIG_Guile_Init(); SCM variable = scm_module_variable(module, scm_from_locale_symbol("swig-type-list-address" SWIG_RUNTIME_VERSION SWIG_TYPE_TABLE_NAME)); if (scm_is_false(variable)) { return NULL; } else { return (swig_module_info *) scm_to_ulong(SCM_VARIABLE_REF(variable)); } } SWIGINTERN void SWIG_Guile_SetModule(swig_module_info *swig_module) { SCM module = SWIG_Guile_Init(); scm_module_define(module, scm_from_locale_symbol("swig-type-list-address" SWIG_RUNTIME_VERSION SWIG_TYPE_TABLE_NAME), scm_from_ulong((unsigned long) swig_module)); } SWIGINTERN int SWIG_Guile_GetArgs (SCM *dest, SCM rest, int reqargs, int optargs, const char *procname) { int i; int num_args_passed = 0; for (i = 0; i 0) { $1_ltype i; $2 = (C_TYPE *) SWIG_malloc(sizeof(C_TYPE) * $1); for (i = 0; i<$1; i++) { SCM swig_scm_value = scm_vector_ref($input, scm_from_long(i)); $2[i] = SCM_TO_C_EXPR; } } else $2 = NULL; } %typemap(in, doc="$NAME is a list of " #SCM_TYPE " values") (int LISTLENINPUT, C_TYPE *LISTINPUT), (size_t LISTLENINPUT, C_TYPE *LISTINPUT) { SCM_VALIDATE_LIST($argnum, $input); $1 = scm_to_ulong(scm_length($input)); if ($1 > 0) { $1_ltype i; SCM rest; $2 = (C_TYPE *) SWIG_malloc(sizeof(C_TYPE) * $1); for (i = 0, rest = $input; i<$1; i++, rest = SCM_CDR(rest)) { SCM swig_scm_value = SCM_CAR(rest); $2[i] = SCM_TO_C_EXPR; } } else $2 = NULL; } /* Do not check for NULL pointers (override checks). */ %typemap(check) (int VECTORLENINPUT, C_TYPE *VECTORINPUT), (size_t VECTORLENINPUT, C_TYPE *VECTORINPUT), (int LISTLENINPUT, C_TYPE *LISTINPUT), (size_t LISTLENINPUT, C_TYPE *LISTINPUT) "/* no check for NULL pointer */"; /* Discard the temporary array after the call. */ %typemap(freearg) (int VECTORLENINPUT, C_TYPE *VECTORINPUT), (size_t VECTORLENINPUT, C_TYPE *VECTORINPUT), (int LISTLENINPUT, C_TYPE *LISTINPUT), (size_t LISTLENINPUT, C_TYPE *LISTINPUT) {if ($2!=NULL) SWIG_free($2);} %enddef /* output */ %define TYPEMAP_LIST_VECTOR_OUTPUT_WITH_EXPR(C_TYPE, C_TO_SCM_EXPR, SCM_TYPE) /* First we make temporary variables ARRAYLENTEMP and ARRAYTEMP, whose addresses we pass to the C function. We ignore both arguments for Scheme. */ %typemap(in,numinputs=0) (int *VECTORLENOUTPUT, C_TYPE **VECTOROUTPUT) (int arraylentemp, C_TYPE *arraytemp), (int *LISTLENOUTPUT, C_TYPE **LISTOUTPUT) (int arraylentemp, C_TYPE *arraytemp), (size_t *VECTORLENOUTPUT, C_TYPE **VECTOROUTPUT) (size_t arraylentemp, C_TYPE *arraytemp), (size_t *LISTLENOUTPUT, C_TYPE **LISTOUTPUT) (size_t arraylentemp, C_TYPE *arraytemp) %{ $1 = &arraylentemp; $2 = &arraytemp; %} /* In the ARGOUT typemaps, we convert the array into a vector or a list and append it to the results. */ %typemap(argout, doc="$NAME (a vector of " #SCM_TYPE " values)") (int *VECTORLENOUTPUT, C_TYPE **VECTOROUTPUT), (size_t *VECTORLENOUTPUT, C_TYPE **VECTOROUTPUT) { $*1_ltype i; SCM res = scm_make_vector(scm_from_long(*$1), SCM_BOOL_F); for (i = 0; i<*$1; i++) { C_TYPE swig_c_value = (*$2)[i]; SCM elt = C_TO_SCM_EXPR; scm_vector_set_x(res, scm_from_long(i), elt); } SWIG_APPEND_VALUE(res); } %typemap(argout, doc="$NAME (a list of " #SCM_TYPE " values)") (int *LISTLENOUTPUT, C_TYPE **LISTOUTPUT), (size_t *LISTLENOUTPUT, C_TYPE **LISTOUTPUT) { int i; SCM res = SCM_EOL; for (i = ((int)(*$1)) - 1; i>=0; i--) { C_TYPE swig_c_value = (*$2)[i]; SCM elt = C_TO_SCM_EXPR; res = scm_cons(elt, res); } SWIG_APPEND_VALUE(res); } /* In the FREEARG typemaps, get rid of the C vector. (This can be overridden if you want to keep the C vector.) */ %typemap(freearg) (int *VECTORLENOUTPUT, C_TYPE **VECTOROUTPUT), (size_t *VECTORLENOUTPUT, C_TYPE **VECTOROUTPUT), (int *LISTLENOUTPUT, C_TYPE **LISTOUTPUT), (size_t *LISTLENOUTPUT, C_TYPE **LISTOUTPUT) { if ((*$2)!=NULL) free(*$2); } %enddef %define TYPEMAP_LIST_VECTOR_INPUT_OUTPUT_WITH_EXPR(C_TYPE, SCM_TO_C_EXPR, C_TO_SCM_EXPR, SCM_TYPE) TYPEMAP_LIST_VECTOR_INPUT_WITH_EXPR(C_TYPE, SCM_TO_C_EXPR, SCM_TYPE) TYPEMAP_LIST_VECTOR_OUTPUT_WITH_EXPR(C_TYPE, C_TO_SCM_EXPR, SCM_TYPE) %enddef %define TYPEMAP_LIST_VECTOR_INPUT(C_TYPE, SCM_TO_C, SCM_TYPE) TYPEMAP_LIST_VECTOR_INPUT_WITH_EXPR (C_TYPE, SCM_TO_C(swig_scm_value), SCM_TYPE) %enddef %define TYPEMAP_LIST_VECTOR_OUTPUT(C_TYPE, C_TO_SCM, SCM_TYPE) TYPEMAP_LIST_VECTOR_OUTPUT_WITH_EXPR (C_TYPE, C_TO_SCM(swig_c_value), SCM_TYPE) %enddef %define TYPEMAP_LIST_VECTOR_INPUT_OUTPUT(C_TYPE, SCM_TO_C, C_TO_SCM, SCM_TYPE) TYPEMAP_LIST_VECTOR_INPUT_OUTPUT_WITH_EXPR (C_TYPE, SCM_TO_C(swig_scm_value), C_TO_SCM(swig_c_value), SCM_TYPE) %enddef /* We use the macro to define typemaps for some standard types. */ TYPEMAP_LIST_VECTOR_INPUT_OUTPUT(bool, scm_is_true, scm_from_bool, boolean); TYPEMAP_LIST_VECTOR_INPUT_OUTPUT(char, SCM_CHAR, SCM_MAKE_CHAR, char); TYPEMAP_LIST_VECTOR_INPUT_OUTPUT(unsigned char, SCM_CHAR, SCM_MAKE_CHAR, char); TYPEMAP_LIST_VECTOR_INPUT_OUTPUT(int, scm_to_int, scm_from_long, integer); TYPEMAP_LIST_VECTOR_INPUT_OUTPUT(short, scm_to_int, scm_from_long, integer); TYPEMAP_LIST_VECTOR_INPUT_OUTPUT(long, scm_to_long, scm_from_long, integer); TYPEMAP_LIST_VECTOR_INPUT_OUTPUT(ptrdiff_t, scm_to_long, scm_from_long, integer); TYPEMAP_LIST_VECTOR_INPUT_OUTPUT(unsigned int, scm_to_ulong, scm_from_ulong, integer); TYPEMAP_LIST_VECTOR_INPUT_OUTPUT(unsigned short, scm_to_ulong, scm_from_ulong, integer); TYPEMAP_LIST_VECTOR_INPUT_OUTPUT(unsigned long, scm_to_ulong, scm_from_ulong, integer); TYPEMAP_LIST_VECTOR_INPUT_OUTPUT(size_t, scm_to_ulong, scm_from_ulong, integer); TYPEMAP_LIST_VECTOR_INPUT_OUTPUT(float, scm_to_double, scm_from_double, real); TYPEMAP_LIST_VECTOR_INPUT_OUTPUT(double, scm_to_double, scm_from_double, real); TYPEMAP_LIST_VECTOR_INPUT_OUTPUT(char *, SWIG_scm2str, SWIG_str02scm, string); TYPEMAP_LIST_VECTOR_INPUT_OUTPUT(const char *, SWIG_scm2str, SWIG_str02scm, string); /* For the char *, free all strings after converting */ %typemap(freearg) (int *VECTORLENOUTPUT, char ***VECTOROUTPUT), (size_t *VECTORLENOUTPUT, char ***VECTOROUTPUT), (int *LISTLENOUTPUT, char ***LISTOUTPUT), (size_t *LISTLENOUTPUT, char ***LISTOUTPUT), (int *VECTORLENOUTPUT, const char ***VECTOROUTPUT), (size_t *VECTORLENOUTPUT, const char ***VECTOROUTPUT), (int *LISTLENOUTPUT, const char ***LISTOUTPUT), (size_t *LISTLENOUTPUT, const char ***LISTOUTPUT) { if ((*$2)!=NULL) { int i; for (i = 0; i < *$1; i++) { if ((*$2)[i] != NULL) free((*$2)[i]); } free(*$2); } } %typemap(freearg) (int VECTORLENINPUT, char **VECTORINPUT), (size_t VECTORLENINPUT, char **VECTORINPUT), (int LISTLENINPUT, char **LISTINPUT), (size_t LISTLENINPUT, char **LISTINPUT), (int VECTORLENINPUT, const char **VECTORINPUT), (size_t VECTORLENINPUT, const char **VECTORINPUT), (int LISTLENINPUT, const char **LISTINPUT), (size_t LISTLENINPUT, const char **LISTINPUT) { if (($2)!=NULL) { int i; for (i = 0; i< $1; i++) if (($2)[i] != NULL) free(($2)[i]); free($2); } } /* Following is a macro that emits typemaps that are much more flexible. (They are also messier.) It supports multiple parallel lists and vectors (sharing one length argument each). TYPEMAP_PARALLEL_LIST_VECTOR_INPUT_OUTPUT(C_TYPE, SCM_TO_C, C_TO_SCM, SCM_TYPE) Supported calling conventions: func(int PARALLEL_VECTORLENINPUT, [const] C_TYPE *PARALLEL_VECTORINPUT, ...) or func([const] C_TYPE *PARALLEL_VECTORINPUT, ..., int PARALLEL_VECTORLENINPUT) func(int PARALLEL_LISTLENINPUT, [const] C_TYPE *PARALLEL_LISTINPUT, ...) or func([const] C_TYPE *PARALLEL_LISTINPUT, ..., int PARALLEL_LISTLENINPUT) func(int *PARALLEL_VECTORLENOUTPUT, C_TYPE **PARALLEL_VECTOROUTPUT, ...) or func(C_TYPE **PARALLEL_VECTOROUTPUT, int *PARALLEL_VECTORLENOUTPUT, ...) func(int *PARALLEL_LISTLENOUTPUT, C_TYPE **PARALLEL_LISTOUTPUT) or func(C_TYPE **PARALLEL_LISTOUTPUT, int *PARALLEL_LISTLENOUTPUT) It is also allowed to use "size_t PARALLEL_LISTLENINPUT" rather than "int PARALLEL_LISTLENINPUT". */ %define TYPEMAP_PARALLEL_LIST_VECTOR_INPUT_WITH_EXPR(C_TYPE, SCM_TO_C_EXPR, SCM_TYPE) /* input */ /* Passing data is a little complicated here; just remember: IGNORE typemaps come first, then IN, then CHECK. But if IGNORE is given, IN won't be used for this type. We need to "ignore" one of the parameters because there shall be only one argument on the Scheme side. Here we only initialize the array length to 0 but save its address for a later change. */ %typemap(in,numinputs=0) int PARALLEL_VECTORLENINPUT (int *_global_vector_length), size_t PARALLEL_VECTORLENINPUT (size_t *_global_vector_length) { $1 = 0; _global_vector_length = &$1; } %typemap(in,numinputs=0) int PARALLEL_LISTLENINPUT (int *_global_list_length), size_t PARALLEL_LISTLENINPUT (size_t *_global_list_length) { $1 = 0; _global_list_length = &$1; } /* All the work is done in IN. */ %typemap(in, doc="$NAME is a vector of " #SCM_TYPE " values") C_TYPE *PARALLEL_VECTORINPUT, const C_TYPE *PARALLEL_VECTORINPUT { SCM_VALIDATE_VECTOR($argnum, $input); *_global_vector_length = scm_c_vector_length($input); if (*_global_vector_length > 0) { int i; $1 = (C_TYPE *) SWIG_malloc(sizeof(C_TYPE) * (*_global_vector_length)); for (i = 0; i<*_global_vector_length; i++) { SCM swig_scm_value = scm_vector_ref($input, scm_from_long(i)); $1[i] = SCM_TO_C_EXPR; } } else $1 = NULL; } %typemap(in, doc="$NAME is a list of " #SCM_TYPE " values") C_TYPE *PARALLEL_LISTINPUT, const C_TYPE *PARALLEL_LISTINPUT { SCM_VALIDATE_LIST($argnum, $input); *_global_list_length = scm_to_ulong(scm_length($input)); if (*_global_list_length > 0) { int i; SCM rest; $1 = (C_TYPE *) SWIG_malloc(sizeof(C_TYPE) * (*_global_list_length)); for (i = 0, rest = $input; i<*_global_list_length; i++, rest = SCM_CDR(rest)) { SCM swig_scm_value = SCM_CAR(rest); $1[i] = SCM_TO_C_EXPR; } } else $1 = NULL; } /* Don't check for NULL pointers (override checks). */ %typemap(check) C_TYPE *PARALLEL_VECTORINPUT, const C_TYPE *PARALLEL_VECTORINPUT, C_TYPE *PARALLEL_LISTINPUT, const C_TYPE *PARALLEL_LISTINPUT "/* no check for NULL pointer */"; /* Discard the temporary array after the call. */ %typemap(freearg) C_TYPE *PARALLEL_VECTORINPUT, const C_TYPE *PARALLEL_VECTORINPUT, C_TYPE *PARALLEL_LISTINPUT, const C_TYPE *PARALLEL_LISTINPUT {if ($1!=NULL) SWIG_free($1);} %enddef %define TYPEMAP_PARALLEL_LIST_VECTOR_OUTPUT_WITH_EXPR(C_TYPE, C_TO_SCM_EXPR, SCM_TYPE) /* output */ /* First we make a temporary variable ARRAYLENTEMP, use its address as the ...LENOUTPUT argument for the C function and "ignore" the ...LENOUTPUT argument for Scheme. */ %typemap(in,numinputs=0) int *PARALLEL_VECTORLENOUTPUT (int _global_arraylentemp), size_t *PARALLEL_VECTORLENOUTPUT (size_t _global_arraylentemp), int *PARALLEL_LISTLENOUTPUT (int _global_arraylentemp), size_t *PARALLEL_LISTLENOUTPUT (size_t _global_arraylentemp) "$1 = &_global_arraylentemp;"; /* We also need to ignore the ...OUTPUT argument. */ %typemap(in,numinputs=0) C_TYPE **PARALLEL_VECTOROUTPUT (C_TYPE *arraytemp), C_TYPE **PARALLEL_LISTOUTPUT (C_TYPE *arraytemp) "$1 = &arraytemp;"; /* In the ARGOUT typemaps, we convert the array into a vector or a list and append it to the results. */ %typemap(argout, doc="$NAME (a vector of " #SCM_TYPE " values)") C_TYPE **PARALLEL_VECTOROUTPUT { int i; SCM res = scm_make_vector(scm_from_long(_global_arraylentemp), SCM_BOOL_F); for (i = 0; i<_global_arraylentemp; i++) { C_TYPE swig_c_value = (*$1)[i]; SCM elt = C_TO_SCM_EXPR; scm_vector_set_x(res, scm_from_long(i), elt); } SWIG_APPEND_VALUE(res); } %typemap(argout, doc="$NAME (a list of " #SCM_TYPE " values)") C_TYPE **PARALLEL_LISTOUTPUT { int i; SCM res = SCM_EOL; if (_global_arraylentemp > 0) { for (i = _global_arraylentemp - 1; i>=0; i--) { C_TYPE swig_c_value = (*$1)[i]; SCM elt = C_TO_SCM_EXPR; res = scm_cons(elt, res); } } SWIG_APPEND_VALUE(res); } /* In the FREEARG typemaps, get rid of the C vector. (This can be overridden if you want to keep the C vector.) */ %typemap(freearg) C_TYPE **PARALLEL_VECTOROUTPUT, C_TYPE **PARALLEL_LISTOUTPUT { if ((*$1)!=NULL) free(*$1); } %enddef %define TYPEMAP_PARALLEL_LIST_VECTOR_INPUT_OUTPUT_WITH_EXPR(C_TYPE, SCM_TO_C_EXPR, C_TO_SCM_EXPR, SCM_TYPE) TYPEMAP_PARALLEL_LIST_VECTOR_INPUT_WITH_EXPR(C_TYPE, SCM_TO_C_EXPR, SCM_TYPE) TYPEMAP_PARALLEL_LIST_VECTOR_OUTPUT_WITH_EXPR(C_TYPE, C_TO_SCM_EXPR, SCM_TYPE) %enddef %define TYPEMAP_PARALLEL_LIST_VECTOR_INPUT(C_TYPE, SCM_TO_C, SCM_TYPE) TYPEMAP_PARALLEL_LIST_VECTOR_INPUT_WITH_EXPR (C_TYPE, SCM_TO_C(swig_scm_value), SCM_TYPE) %enddef %define TYPEMAP_PARALLEL_LIST_VECTOR_OUTPUT(C_TYPE, C_TO_SCM, SCM_TYPE) TYPEMAP_PARALLEL_LIST_VECTOR_OUTPUT_WITH_EXPR (C_TYPE, C_TO_SCM(swig_c_value), SCM_TYPE) %enddef %define TYPEMAP_PARALLEL_LIST_VECTOR_INPUT_OUTPUT(C_TYPE, SCM_TO_C, C_TO_SCM, SCM_TYPE) TYPEMAP_PARALLEL_LIST_VECTOR_INPUT_OUTPUT_WITH_EXPR (C_TYPE, SCM_TO_C(swig_scm_value), C_TO_SCM(swig_c_value), SCM_TYPE) %enddef /* We use the macro to define typemaps for some standard types. */ TYPEMAP_PARALLEL_LIST_VECTOR_INPUT_OUTPUT(bool, scm_is_true, scm_from_bool, boolean); TYPEMAP_PARALLEL_LIST_VECTOR_INPUT_OUTPUT(char, SCM_CHAR, SCM_MAKE_CHAR, char); TYPEMAP_PARALLEL_LIST_VECTOR_INPUT_OUTPUT(unsigned char, SCM_CHAR, SCM_MAKE_CHAR, char); TYPEMAP_PARALLEL_LIST_VECTOR_INPUT_OUTPUT(int, scm_to_int, scm_from_long, integer); TYPEMAP_PARALLEL_LIST_VECTOR_INPUT_OUTPUT(short, scm_to_int, scm_from_long, integer); TYPEMAP_PARALLEL_LIST_VECTOR_INPUT_OUTPUT(long, scm_to_long, scm_from_long, integer); TYPEMAP_PARALLEL_LIST_VECTOR_INPUT_OUTPUT(ptrdiff_t, scm_to_long, scm_from_long, integer); TYPEMAP_PARALLEL_LIST_VECTOR_INPUT_OUTPUT(unsigned int, scm_to_ulong, scm_from_ulong, integer); TYPEMAP_PARALLEL_LIST_VECTOR_INPUT_OUTPUT(unsigned short, scm_to_ulong, scm_from_ulong, integer); TYPEMAP_PARALLEL_LIST_VECTOR_INPUT_OUTPUT(unsigned long, scm_to_ulong, scm_from_ulong, integer); TYPEMAP_PARALLEL_LIST_VECTOR_INPUT_OUTPUT(size_t, scm_to_ulong, scm_from_ulong, integer); TYPEMAP_PARALLEL_LIST_VECTOR_INPUT_OUTPUT(float, scm_to_double, scm_from_double, real); TYPEMAP_PARALLEL_LIST_VECTOR_INPUT_OUTPUT(double, scm_to_double, scm_from_double, real); TYPEMAP_PARALLEL_LIST_VECTOR_INPUT_OUTPUT(char *, SWIG_scm2str, SWIG_str02scm, string); TYPEMAP_PARALLEL_LIST_VECTOR_INPUT_OUTPUT(const char *, SWIG_scm2str, SWIG_str02scm, string); %typemap(freearg) char **PARALLEL_LISTINPUT, char **PARALLEL_VECTORINPUT, const char **PARALLEL_LISTINPUT, const char **PARALLEL_VECTORINPUT { if (($1)!=NULL) { int i; for (i = 0; i<*_global_list_length; i++) if (($1)[i] != NULL) SWIG_free(($1)[i]); SWIG_free($1); } } %typemap(freearg) char ***PARALLEL_LISTOUTPUT, char ***PARALLEL_VECTOROUTPUT, const char ***PARALLEL_LISTOUTPUT, const char ***PARALLEL_VECTOROUTPUT { if ((*$1)!=NULL) { int i; for (i = 0; i<_global_arraylentemp; i++) if ((*$1)[i] != NULL) free((*$1)[i]); free(*$1); } } swig-4.0.1/Lib/guile/guile.i0000644000175000017500000000206413527063513015444 0ustar williamwilliam/* ----------------------------------------------------------------------------- * guile.i * * SWIG Configuration File for Guile. * ----------------------------------------------------------------------------- */ /* Macro for inserting Scheme code into the stub */ #define %scheme %insert("scheme") #define %goops %insert("goops") /* Return-styles */ %pragma(guile) return_nothing_doc = "Returns unspecified." %pragma(guile) return_one_doc = "Returns $values." %define %values_as_list %pragma(guile) beforereturn = "" %pragma(guile) return_multi_doc = "Returns a list of $num_values values: $values." %enddef %values_as_list /* the default style */ %define %values_as_vector %pragma(guile) beforereturn = "GUILE_MAYBE_VECTOR" %pragma(guile) return_multi_doc = "Returns a vector of $num_values values: $values." %enddef %define %multiple_values %pragma(guile) beforereturn = "GUILE_MAYBE_VALUES" %pragma(guile) return_multi_doc = "Returns $num_values values: $values." %enddef #define GUILE_APPEND_RESULT SWIG_APPEND_VALUE %include swig-4.0.1/Lib/guile/Makefile0000644000175000017500000000003513527063513015621 0ustar williamwilliam co: co RCS/*.i* RCS/*.swg* swig-4.0.1/Lib/guile/extra-install.list0000644000175000017500000000004713527063513017650 0ustar williamwilliam# see top-level Makefile.in common.scm swig-4.0.1/Lib/guile/std_common.i0000644000175000017500000000111413527063513016474 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_common.i * * SWIG typemaps for STL - common utilities * ----------------------------------------------------------------------------- */ %include %apply size_t { std::size_t }; #define SWIG_bool2scm(b) scm_from_bool(b ? 1 : 0) #define SWIG_string2scm(s) SWIG_str02scm(s.c_str()) %{ #include SWIGINTERNINLINE std::string SWIG_scm2string(SCM x) { char* temp; temp = SWIG_scm2str(x); std::string s(temp); if (temp) SWIG_free(temp); return s; } %} swig-4.0.1/Lib/guile/guile_scm.swg0000644000175000017500000000235713527063513016663 0ustar williamwilliam/* ----------------------------------------------------------------------------- * guile_scm.swg * * This SWIG interface file is processed if the Guile module is run * with SCM_ flavor. * ----------------------------------------------------------------------------- */ #define SWIGGUILE_SCM %runtime "swigrun.swg" // Common C API type-checking code %runtime "swigerrors.swg" // SWIG errors %runtime "guile_scm_run.swg" %include %runtime %{ #define GUILE_MAYBE_VALUES \ if (gswig_list_p) gswig_result = scm_values(gswig_result); #define GUILE_MAYBE_VECTOR \ if (gswig_list_p) gswig_result = scm_vector(gswig_result); #define SWIG_APPEND_VALUE(object) \ if (gswig_result == SCM_UNSPECIFIED) \ gswig_result = object; \ else { \ if (!gswig_list_p) { \ gswig_list_p = 1; \ gswig_result = scm_list_n(gswig_result, object, SCM_UNDEFINED); \ } \ else \ gswig_result = scm_append(scm_list_n(gswig_result, scm_list_n(object, SCM_UNDEFINED), SCM_UNDEFINED)); \ } %} %insert(init) "swiginit.swg" %init %{ SWIG_GUILE_INIT_STATIC void SWIG_init(void) { SWIG_InitializeModule(0); SWIG_PropagateClientData(); %} swig-4.0.1/Lib/guile/swigrun.i0000644000175000017500000000170513527063513016036 0ustar williamwilliam/* -*- mode: c -*- */ %module swigrun #ifdef SWIGGUILE_SCM /* Hook the runtime module initialization into the shared initialization function SWIG_Guile_Init. */ %runtime %{ /* Hook the runtime module initialization into the shared initialization function SWIG_Guile_Init. */ #include #ifdef __cplusplus extern "C" #endif SCM scm_init_Swig_swigrun_module (void); #define SWIG_INIT_RUNTIME_MODULE scm_init_Swig_swigrun_module(); %} /* The runtime type system from common.swg */ typedef struct swig_type_info swig_type_info; const char * SWIG_TypeName(const swig_type_info *type); const char * SWIG_TypePrettyName(const swig_type_info *type); swig_type_info * SWIG_TypeQuery(const char *); /* Language-specific stuff */ %apply bool { int }; int SWIG_IsPointer(SCM object); int SWIG_IsPointerOfType(SCM object, swig_type_info *type); unsigned long SWIG_PointerAddress(SCM object); swig_type_info * SWIG_PointerType(SCM object); #endif swig-4.0.1/Lib/guile/std_except.i0000644000175000017500000000031213527063513016473 0ustar williamwilliam// TODO: STL exception handling // Note that the generic std_except.i file did not work %{ #include #include %} namespace std { %ignore exception; struct exception { }; } swig-4.0.1/Lib/guile/guilemain.i0000644000175000017500000000161213527063513016307 0ustar williamwilliam/* ----------------------------------------------------------------------------- * guilemain.i * * The main functions for a user augmented guile * version that can handle wrapped calls as generated by SWIG * ----------------------------------------------------------------------------- */ %{ #include #ifdef __cplusplus extern "C" { #endif static void inner_main(void *closure, int argc, char **argv) { #ifdef SWIGINIT SWIGINIT #else SWIG_init(); /* SWIG init function */ #endif scm_shell(argc, argv); /* scheme interpreter */ /* never reached: scm_shell will perform an exit */ } #ifdef __cplusplus } #endif int main(int argc, char **argv) { /* put any default initialisation code here: e.g. exit handlers */ scm_boot_guile(argc, argv, inner_main, 0); /* make a stack entry for the garbage collector */ return 0; /* never reached, but avoids a warning */ } %} swig-4.0.1/Lib/guile/typemaps.i0000644000175000017500000003727513527063513016215 0ustar williamwilliam/* ----------------------------------------------------------------------------- * typemaps.i * * Guile-specific typemaps * ----------------------------------------------------------------------------- */ /* Pointers */ %typemap(in) SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE [] { $1 = ($1_ltype)SWIG_MustGetPtr($input, $descriptor, $argnum, 0); } %typemap(freearg) SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE [] ""; %typemap(in) void * { $1 = ($1_ltype)SWIG_MustGetPtr($input, NULL, $argnum, 0); } %typemap(freearg) void * ""; %typemap(varin) SWIGTYPE * { $1 = ($1_ltype)SWIG_MustGetPtr($input, $descriptor, 1, 0); } %typemap(varin) SWIGTYPE & { $1 = *(($1_ltype)SWIG_MustGetPtr($input, $descriptor, 1, 0)); } %typemap(varin) SWIGTYPE && { $1 = *(($1_ltype)SWIG_MustGetPtr($input, $descriptor, 1, 0)); } %typemap(varin) SWIGTYPE [] { scm_wrong_type_arg((char *) FUNC_NAME, 1, $input); } %typemap(varin) SWIGTYPE [ANY] { void *temp; int ii; $1_basetype *b = 0; temp = SWIG_MustGetPtr($input, $1_descriptor, 1, 0); b = ($1_basetype *) $1; for (ii = 0; ii < $1_size; ii++) b[ii] = *(($1_basetype *) temp + ii); } %typemap(varin) void * { $1 = SWIG_MustGetPtr($input, NULL, 1, 0); } %typemap(out) SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE [] { $result = SWIG_NewPointerObj ($1, $descriptor, $owner); } %typemap(out) SWIGTYPE *DYNAMIC, SWIGTYPE &DYNAMIC { swig_type_info *ty = SWIG_TypeDynamicCast($1_descriptor,(void **) &$1); $result = SWIG_NewPointerObj ($1, ty, $owner); } %typemap(varout) SWIGTYPE *, SWIGTYPE [] { $result = SWIG_NewPointerObj ($1, $descriptor, 0); } %typemap(varout) SWIGTYPE & { $result = SWIG_NewPointerObj((void *) &$1, $1_descriptor, 0); } %typemap(varout) SWIGTYPE && { $result = SWIG_NewPointerObj((void *) &$1, $1_descriptor, 0); } %typemap(throws) SWIGTYPE { $<ype temp = new $ltype($1); scm_throw(scm_from_locale_symbol((char *) "swig-exception"), scm_list_n(SWIG_NewPointerObj(temp, $&descriptor, 1), SCM_UNDEFINED)); } %typemap(throws) SWIGTYPE & { scm_throw(scm_from_locale_symbol((char *) "swig-exception"), scm_list_n(SWIG_NewPointerObj(&$1, $descriptor, 1), SCM_UNDEFINED)); } %typemap(throws) SWIGTYPE && { scm_throw(gh_symbol2scm((char *) "swig-exception"), gh_list(SWIG_NewPointerObj(&$1, $descriptor, 1), SCM_UNDEFINED)); } %typemap(throws) SWIGTYPE * { scm_throw(scm_from_locale_symbol((char *) "swig-exception"), scm_list_n(SWIG_NewPointerObj($1, $descriptor, 1), SCM_UNDEFINED)); } %typemap(throws) SWIGTYPE [] { scm_throw(scm_from_locale_symbol((char *) "swig-exception"), scm_list_n(SWIG_NewPointerObj($1, $descriptor, 1), SCM_UNDEFINED)); } /* Change of object ownership, and interaction of destructor-like functions and the garbage-collector */ %typemap(in, doc="$NAME is of type <$type> and gets destroyed by the function") SWIGTYPE *DESTROYED { $1 = ($1_ltype)SWIG_MustGetPtr($input, $descriptor, $argnum, 0); } %typemap(freearg) SWIGTYPE *DESTROYED { SWIG_Guile_MarkPointerDestroyed($input); } %typemap(in, doc="$NAME is of type <$type> and is consumed by the function") SWIGTYPE *CONSUMED { $1 = ($1_ltype)SWIG_MustGetPtr($input, $descriptor, $argnum, 0); SWIG_Guile_MarkPointerNoncollectable($input); } /* Pass-by-value */ %typemap(in) SWIGTYPE($&1_ltype argp) { argp = ($&1_ltype)SWIG_MustGetPtr($input, $&1_descriptor, $argnum, 0); $1 = *argp; } %typemap(varin) SWIGTYPE { $&1_ltype argp; argp = ($&1_ltype)SWIG_MustGetPtr($input, $&1_descriptor, 1, 0); $1 = *argp; } %typemap(out) SWIGTYPE #ifdef __cplusplus { $&1_ltype resultptr; resultptr = new $1_ltype((const $1_ltype &) $1); $result = SWIG_NewPointerObj (resultptr, $&1_descriptor, 1); } #else { $&1_ltype resultptr; resultptr = ($&1_ltype) malloc(sizeof($1_type)); memmove(resultptr, &$1, sizeof($1_type)); $result = SWIG_NewPointerObj(resultptr, $&1_descriptor, 1); } #endif %typemap(varout) SWIGTYPE #ifdef __cplusplus { $&1_ltype resultptr; resultptr = new $1_ltype((const $1_ltype&) $1); $result = SWIG_NewPointerObj (resultptr, $&1_descriptor, 0); } #else { $&1_ltype resultptr; resultptr = ($&1_ltype) malloc(sizeof($1_type)); memmove(resultptr, &$1, sizeof($1_type)); $result = SWIG_NewPointerObj(resultptr, $&1_descriptor, 0); } #endif /* Enums */ %typemap(in) enum SWIGTYPE { $1 = ($1_type) scm_to_int($input); } /* The complicated construction below needed to deal with anonymous enums, which cannot be cast to. */ %typemap(varin) enum SWIGTYPE { if (sizeof(int) != sizeof($1)) { scm_error(scm_from_locale_symbol("swig-error"), (char *) FUNC_NAME, (char *) "enum variable '$name' cannot be set", SCM_EOL, SCM_BOOL_F); } * (int *) &($1) = scm_to_int($input); } %typemap(out) enum SWIGTYPE { $result = scm_from_long((int)$1); } %typemap(varout) enum SWIGTYPE { $result = scm_from_long((int)$1); } %typemap(throws) enum SWIGTYPE { scm_throw(scm_from_locale_symbol((char *) "swig-exception"), scm_list_n(scm_from_long((int)$1), SCM_UNDEFINED)); } /* The SIMPLE_MAP_WITH_EXPR macro below defines the whole set of typemaps needed for simple types. -- SCM_TO_C_EXPR is a C expression that translates the Scheme value "swig_scm_value" to a C value. -- C_TO_SCM_EXPR is a C expression that translates the C value "swig_c_value" to a Scheme value. */ %define SIMPLE_MAP_WITH_EXPR(C_NAME, SCM_TO_C_EXPR, C_TO_SCM_EXPR, SCM_NAME) %typemap (in, doc="$NAME is of type <" #SCM_NAME ">") C_NAME { SCM swig_scm_value = $input; $1 = SCM_TO_C_EXPR; } %typemap (varin, doc="NEW-VALUE is of type <" #SCM_NAME ">") C_NAME { SCM swig_scm_value = $input; $1 = SCM_TO_C_EXPR; } %typemap (out, doc="<" #SCM_NAME ">") C_NAME { C_NAME swig_c_value = $1; $result = C_TO_SCM_EXPR; } %typemap (varout, doc="<" #SCM_NAME ">") C_NAME { C_NAME swig_c_value = $1; $result = C_TO_SCM_EXPR; } /* INPUT and OUTPUT */ %typemap (in, doc="$NAME is of type <" #SCM_NAME ">)") C_NAME *INPUT(C_NAME temp) { SCM swig_scm_value = $input; temp = (C_NAME) SCM_TO_C_EXPR; $1 = &temp; } %typemap (in,numinputs=0) C_NAME *OUTPUT (C_NAME temp) {$1 = &temp;} %typemap (argout,doc="$name (of type <" #SCM_NAME ">)") C_NAME *OUTPUT { C_NAME swig_c_value = *$1; SWIG_APPEND_VALUE(C_TO_SCM_EXPR); } %typemap (in) C_NAME *BOTH = C_NAME *INPUT; %typemap (argout) C_NAME *BOTH = C_NAME *OUTPUT; %typemap (in) C_NAME *INOUT = C_NAME *INPUT; %typemap (argout) C_NAME *INOUT = C_NAME *OUTPUT; /* Const primitive references. Passed by value */ %typemap(in, doc="$NAME is of type <" #SCM_NAME ">") const C_NAME & (C_NAME temp) { SCM swig_scm_value = $input; temp = SCM_TO_C_EXPR; $1 = &temp; } %typemap(out, doc="<" #SCM_NAME ">") const C_NAME & { C_NAME swig_c_value = *$1; $result = C_TO_SCM_EXPR; } /* Throw typemap */ %typemap(throws) C_NAME { C_NAME swig_c_value = $1; scm_throw(scm_from_locale_symbol((char *) "swig-exception"), scm_list_n(C_TO_SCM_EXPR, SCM_UNDEFINED)); } %enddef /* The SIMPLE_MAP macro below defines the whole set of typemaps needed for simple types. It generates slightly simpler code than the macro above, but it is only suitable for very simple conversion expressions. */ %define SIMPLE_MAP(C_NAME, SCM_TO_C, C_TO_SCM, SCM_NAME) %typemap (in, doc="$NAME is of type <" #SCM_NAME ">") C_NAME {$1 = ($1_ltype) SCM_TO_C($input);} %typemap (varin, doc="NEW-VALUE is of type <" #SCM_NAME ">") C_NAME {$1 = ($1_ltype) SCM_TO_C($input);} %typemap (out, doc="<" #SCM_NAME ">") C_NAME {$result = C_TO_SCM($1);} %typemap (varout, doc="<" #SCM_NAME ">") C_NAME {$result = C_TO_SCM($1);} /* INPUT and OUTPUT */ %typemap (in, doc="$NAME is of type <" #SCM_NAME ">)") C_NAME *INPUT(C_NAME temp), C_NAME &INPUT(C_NAME temp) { temp = (C_NAME) SCM_TO_C($input); $1 = &temp; } %typemap (in,numinputs=0) C_NAME *OUTPUT (C_NAME temp), C_NAME &OUTPUT(C_NAME temp) {$1 = &temp;} %typemap (argout,doc="$name (of type <" #SCM_NAME ">)") C_NAME *OUTPUT, C_NAME &OUTPUT {SWIG_APPEND_VALUE(C_TO_SCM(*$1));} %typemap (in) C_NAME *BOTH = C_NAME *INPUT; %typemap (argout) C_NAME *BOTH = C_NAME *OUTPUT; %typemap (in) C_NAME *INOUT = C_NAME *INPUT; %typemap (argout) C_NAME *INOUT = C_NAME *OUTPUT; %typemap (in) C_NAME &INOUT = C_NAME &INPUT; %typemap (argout) C_NAME &INOUT = C_NAME &OUTPUT; /* Const primitive references. Passed by value */ %typemap(in, doc="$NAME is of type <" #SCM_NAME ">") const C_NAME & (C_NAME temp) { temp = SCM_TO_C($input); $1 = ($1_ltype) &temp; } %typemap(out, doc="<" #SCM_NAME ">") const C_NAME & { $result = C_TO_SCM(*$1); } /* Throw typemap */ %typemap(throws) C_NAME { scm_throw(scm_from_locale_symbol((char *) "swig-exception"), scm_list_n(C_TO_SCM($1), SCM_UNDEFINED)); } %enddef SIMPLE_MAP(bool, scm_is_true, scm_from_bool, boolean); SIMPLE_MAP(char, SCM_CHAR, SCM_MAKE_CHAR, char); SIMPLE_MAP(unsigned char, SCM_CHAR, SCM_MAKE_CHAR, char); SIMPLE_MAP(signed char, SCM_CHAR, SCM_MAKE_CHAR, char); SIMPLE_MAP(int, scm_to_int, scm_from_long, integer); SIMPLE_MAP(short, scm_to_short, scm_from_long, integer); SIMPLE_MAP(long, scm_to_long, scm_from_long, integer); SIMPLE_MAP(ptrdiff_t, scm_to_long, scm_from_long, integer); SIMPLE_MAP(unsigned int, scm_to_uint, scm_from_ulong, integer); SIMPLE_MAP(unsigned short, scm_to_ushort, scm_from_ulong, integer); SIMPLE_MAP(unsigned long, scm_to_ulong, scm_from_ulong, integer); SIMPLE_MAP(size_t, scm_to_ulong, scm_from_ulong, integer); SIMPLE_MAP(float, scm_to_double, scm_from_double, real); SIMPLE_MAP(double, scm_to_double, scm_from_double, real); // SIMPLE_MAP(char *, SWIG_scm2str, SWIG_str02scm, string); // SIMPLE_MAP(const char *, SWIG_scm2str, SWIG_str02scm, string); /* Define long long typemaps -- uses functions that are only defined in recent versions of Guile, availability also depends on Guile's configuration. */ SIMPLE_MAP(long long, scm_to_long_long, scm_from_long_long, integer); SIMPLE_MAP(unsigned long long, scm_to_ulong_long, scm_from_ulong_long, integer); /* Strings */ %typemap (in, doc="$NAME is a string") char *(int must_free = 0) { $1 = ($1_ltype)SWIG_scm2str($input); must_free = 1; } %typemap (varin, doc="NEW-VALUE is a string") char * {$1 = ($1_ltype)SWIG_scm2str($input);} %typemap (out, doc="") char * {$result = SWIG_str02scm((const char *)$1);} %typemap (varout, doc="") char * {$result = SWIG_str02scm($1);} %typemap (in, doc="$NAME is a string") char **INPUT(char * temp, int must_free = 0) { temp = (char *) SWIG_scm2str($input); $1 = &temp; must_free = 1; } %typemap (in,numinputs=0) char **OUTPUT (char * temp) {$1 = &temp;} %typemap (argout,doc="$NAME (a string)") char **OUTPUT {SWIG_APPEND_VALUE(SWIG_str02scm(*$1));} %typemap (in) char **BOTH = char **INPUT; %typemap (argout) char **BOTH = char **OUTPUT; %typemap (in) char **INOUT = char **INPUT; %typemap (argout) char **INOUT = char **OUTPUT; /* SWIG_scm2str makes a malloc'ed copy of the string, so get rid of it after the function call. */ %typemap (freearg) char * "if (must_free$argnum && $1) SWIG_free($1);"; %typemap (freearg) char **INPUT, char **BOTH "if (must_free$argnum && (*$1)) SWIG_free(*$1);" %typemap (freearg) char **OUTPUT "SWIG_free(*$1);" /* But this shall not apply if we try to pass a single char by reference. */ %typemap (freearg) char *OUTPUT, char *BOTH ""; /* If we set a string variable, delete the old result first, unless const. */ %typemap (varin) char * { if ($1) free($1); $1 = ($1_ltype) SWIG_scm2str($input); } %typemap (varin) const char * { $1 = ($1_ltype) SWIG_scm2str($input); } %typemap(throws) char * { scm_throw(scm_from_locale_symbol((char *) "swig-exception"), scm_list_n(SWIG_str02scm($1), SCM_UNDEFINED)); } /* Void */ %typemap (out,doc="") void "gswig_result = SCM_UNSPECIFIED;"; /* SCM is passed through */ typedef unsigned long SCM; %typemap (in) SCM "$1=$input;"; %typemap (out) SCM "$result=$1;"; %typecheck(SWIG_TYPECHECK_POINTER) SCM "$1=1;"; /* ------------------------------------------------------------ * String & length * ------------------------------------------------------------ */ %typemap(in) (char *STRING, int LENGTH), (char *STRING, size_t LENGTH) { size_t temp; $1 = ($1_ltype) SWIG_Guile_scm2newstr($input, &temp); $2 = ($2_ltype) temp; } /* ------------------------------------------------------------ * CLASS::* (member function pointer) typemaps * taken from typemaps/swigtype.swg * ------------------------------------------------------------ */ #define %set_output(obj) $result = obj #define %set_varoutput(obj) $result = obj #define %argument_fail(code, type, name, argn) scm_wrong_type_arg((char *) FUNC_NAME, argn, $input); #define %as_voidptr(ptr) (void*)(ptr) %typemap(in) SWIGTYPE (CLASS::*) { int res = SWIG_ConvertMember($input, %as_voidptr(&$1), sizeof($type),$descriptor); if (!SWIG_IsOK(res)) { %argument_fail(res,"$type",$symname, $argnum); } } %typemap(out,noblock=1) SWIGTYPE (CLASS::*) { %set_output(SWIG_NewMemberObj(%as_voidptr(&$1), sizeof($type), $descriptor)); } %typemap(varin) SWIGTYPE (CLASS::*) { int res = SWIG_ConvertMember($input,%as_voidptr(&$1), sizeof($type), $descriptor); if (!SWIG_IsOK(res)) { scm_wrong_type_arg((char *) FUNC_NAME, 1, $input); } } %typemap(varout,noblock=1) SWIGTYPE (CLASS::*) { %set_varoutput(SWIG_NewMemberObj(%as_voidptr(&$1), sizeof($type), $descriptor)); } /* ------------------------------------------------------------ * Typechecking rules * ------------------------------------------------------------ */ /* adapted from python.swg */ %typecheck(SWIG_TYPECHECK_INTEGER) int, short, long, unsigned int, unsigned short, unsigned long, signed char, unsigned char, long long, unsigned long long, size_t, ptrdiff_t, std::size_t, std::ptrdiff_t, const int &, const short &, const long &, const unsigned int &, const unsigned short &, const unsigned long &, const long long &, const unsigned long long &, const size_t &, const ptrdiff_t &, const std::size_t &, const std::ptrdiff_t &, enum SWIGTYPE { $1 = scm_is_true(scm_integer_p($input)) && scm_is_true(scm_exact_p($input))? 1 : 0; } %typecheck(SWIG_TYPECHECK_BOOL) bool, bool&, const bool& { $1 = SCM_BOOLP($input) ? 1 : 0; } %typecheck(SWIG_TYPECHECK_DOUBLE) float, double, const float &, const double & { $1 = scm_is_true(scm_real_p($input)) ? 1 : 0; } %typecheck(SWIG_TYPECHECK_CHAR) char { $1 = SCM_CHARP($input) ? 1 : 0; } %typecheck(SWIG_TYPECHECK_STRING) char * { $1 = scm_is_string($input) ? 1 : 0; } %typecheck(SWIG_TYPECHECK_POINTER) SWIGTYPE *, SWIGTYPE [] { void *ptr; int res = SWIG_ConvertPtr($input, &ptr, $1_descriptor, 0); $1 = SWIG_CheckState(res); } %typecheck(SWIG_TYPECHECK_POINTER) SWIGTYPE &, SWIGTYPE && { void *ptr; int res = SWIG_ConvertPtr($input, &ptr, $1_descriptor, SWIG_POINTER_NO_NULL); $1 = SWIG_CheckState(res); } %typecheck(SWIG_TYPECHECK_POINTER) SWIGTYPE { void *ptr; int res = SWIG_ConvertPtr($input, &ptr, $&descriptor, SWIG_POINTER_NO_NULL); $1 = SWIG_CheckState(res); } %typecheck(SWIG_TYPECHECK_VOIDPTR) void * { void *ptr; int res = SWIG_ConvertPtr($input, &ptr, 0, 0); $1 = SWIG_CheckState(res); } /* Array reference typemaps */ %apply SWIGTYPE & { SWIGTYPE ((&)[ANY]) } %apply SWIGTYPE && { SWIGTYPE ((&&)[ANY]) } /* const pointers */ %apply SWIGTYPE * { SWIGTYPE *const } %apply SWIGTYPE (CLASS::*) { SWIGTYPE (CLASS::*const) } %apply SWIGTYPE & { SWIGTYPE (CLASS::*const&) } /* typemaps.i ends here */ swig-4.0.1/Lib/guile/ports.i0000644000175000017500000000247013527063513015507 0ustar williamwilliam/* ----------------------------------------------------------------------------- * ports.i * * Guile typemaps for handling ports * ----------------------------------------------------------------------------- */ %{ #ifndef _POSIX_SOURCE /* This is needed on Solaris for fdopen(). */ # define _POSIX_SOURCE 199506L #endif #include #include #include %} /* This typemap for FILE * accepts (1) FILE * pointer objects, (2) Scheme file ports. In this case, it creates a temporary C stream which reads or writes from a dup'ed file descriptor. */ %typemap(in, doc="$NAME is a file port or a FILE * pointer") FILE * { if (SWIG_ConvertPtr($input, (void**) &($1), $1_descriptor, 0) != 0) { if (!(SCM_FPORTP($input))) { scm_wrong_type_arg("$symname", $argnum, $input); } else { int fd; if (SCM_OUTPUT_PORT_P($input)) { scm_force_output($input); } fd=dup(SCM_FPORT_FDES($input)); if (fd==-1) { scm_misc_error("$symname", strerror(errno), SCM_EOL); } $1=fdopen(fd, SCM_OUTPUT_PORT_P($input) ? (SCM_INPUT_PORT_P($input) ? "r+" : "w") : "r"); if ($1==NULL) { scm_misc_error("$symname", strerror(errno), SCM_EOL); } } } } %typemap(freearg) FILE* { if ($1) { fclose($1); } } swig-4.0.1/Lib/guile/std_pair.i0000644000175000017500000011767013527063513016156 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_pair.i * * SWIG typemaps for std::pair * ----------------------------------------------------------------------------- */ %include %include // ------------------------------------------------------------------------ // std::pair // // See std_vector.i for the rationale of typemap application // ------------------------------------------------------------------------ %{ #include %} // exported class namespace std { template struct pair { %typemap(in) pair %{ if (scm_is_pair($input)) { T* x; U* y; SCM first, second; first = SCM_CAR($input); second = SCM_CDR($input); x = (T*) SWIG_MustGetPtr(first,$descriptor(T *),$argnum, 0); y = (U*) SWIG_MustGetPtr(second,$descriptor(U *),$argnum, 0); $1 = std::make_pair(*x,*y); } else { $1 = *(($&1_type) SWIG_MustGetPtr($input,$&1_descriptor,$argnum, 0)); } %} %typemap(in) const pair& (std::pair *temp = 0), const pair* (std::pair *temp = 0) %{ if (scm_is_pair($input)) { T* x; U* y; SCM first, second; first = SCM_CAR($input); second = SCM_CDR($input); x = (T*) SWIG_MustGetPtr(first,$descriptor(T *),$argnum, 0); y = (U*) SWIG_MustGetPtr(second,$descriptor(U *),$argnum, 0); temp = new std::pair< T, U >(*x,*y); $1 = temp; } else { $1 = ($1_ltype) SWIG_MustGetPtr($input,$1_descriptor,$argnum, 0); } %} %typemap(freearg) const pair&, const pair* %{ delete temp$argnum; %} %typemap(out) pair { T* x = new T($1.first); U* y = new U($1.second); SCM first = SWIG_NewPointerObj(x,$descriptor(T *), 1); SCM second = SWIG_NewPointerObj(y,$descriptor(U *), 1); $result = scm_cons(first,second); } %typecheck(SWIG_TYPECHECK_PAIR) pair { /* native pair? */ if (scm_is_pair($input)) { T* x; U* y; SCM first = SCM_CAR($input); SCM second = SCM_CDR($input); if (SWIG_ConvertPtr(first,(void**) &x, $descriptor(T *), 0) == 0 && SWIG_ConvertPtr(second,(void**) &y, $descriptor(U *), 0) == 0) { $1 = 1; } else { $1 = 0; } } else { /* wrapped pair? */ std::pair< T, U >* m; if (SWIG_ConvertPtr($input,(void **) &m, $&1_descriptor, 0) == 0) $1 = 1; else $1 = 0; } } %typecheck(SWIG_TYPECHECK_PAIR) const pair&, const pair* { /* native pair? */ if (scm_is_pair($input)) { T* x; U* y; SCM first = SCM_CAR($input); SCM second = SCM_CDR($input); if (SWIG_ConvertPtr(first,(void**) &x, $descriptor(T *), 0) == 0 && SWIG_ConvertPtr(second,(void**) &y, $descriptor(U *), 0) == 0) { $1 = 1; } else { $1 = 0; } } else { /* wrapped pair? */ std::pair< T, U >* m; if (SWIG_ConvertPtr($input,(void **) &m, $1_descriptor, 0) == 0) $1 = 1; else $1 = 0; } } typedef T first_type; typedef U second_type; pair(); pair(T first, U second); pair(const pair& other); template pair(const pair &other); T first; U second; }; // specializations for built-ins %define specialize_std_pair_on_first(T,CHECK,CONVERT_FROM,CONVERT_TO) template struct pair { %typemap(in) pair %{ if (scm_is_pair($input)) { U* y; SCM first, second; first = SCM_CAR($input); second = SCM_CDR($input); if (!CHECK(first)) SWIG_exception(SWIG_TypeError, "pair<" #T "," #U "> expected"); y = (U*) SWIG_MustGetPtr(second,$descriptor(U *),$argnum, 0); $1 = std::make_pair(CONVERT_FROM(first),*y); } else { $1 = *(($&1_type) SWIG_MustGetPtr($input,$&1_descriptor,$argnum, 0)); } %} %typemap(in) const pair& (std::pair *temp = 0), const pair* (std::pair *temp = 0) %{ if (scm_is_pair($input)) { U* y; SCM first, second; first = SCM_CAR($input); second = SCM_CDR($input); if (!CHECK(first)) SWIG_exception(SWIG_TypeError, "pair<" #T "," #U "> expected"); y = (U*) SWIG_MustGetPtr(second,$descriptor(U *),$argnum, 0); temp = new std::pair< T, U >(CONVERT_FROM(first),*y); $1 = temp; } else { $1 = ($1_ltype) SWIG_MustGetPtr($input,$1_descriptor,$argnum, 0); } %} %typemap(freearg) const pair&, const pair* %{ delete temp$argnum; %} %typemap(out) pair { U* y = new U($1.second); SCM second = SWIG_NewPointerObj(y,$descriptor(U *), 1); $result = scm_cons(CONVERT_TO($1.first),second); } %typecheck(SWIG_TYPECHECK_PAIR) pair { /* native pair? */ if (scm_is_pair($input)) { U* y; SCM first = SCM_CAR($input); SCM second = SCM_CDR($input); if (CHECK(first) && SWIG_ConvertPtr(second,(void**) &y, $descriptor(U *), 0) == 0) { $1 = 1; } else { $1 = 0; } } else { /* wrapped pair? */ std::pair< T, U >* m; if (SWIG_ConvertPtr($input,(void **) &m, $&1_descriptor, 0) == 0) $1 = 1; else $1 = 0; } } %typecheck(SWIG_TYPECHECK_PAIR) const pair&, const pair* { /* native pair? */ if (scm_is_pair($input)) { U* y; SCM first = SCM_CAR($input); SCM second = SCM_CDR($input); if (CHECK(first) && SWIG_ConvertPtr(second,(void**) &y, $descriptor(U *), 0) == 0) { $1 = 1; } else { $1 = 0; } } else { /* wrapped pair? */ std::pair< T, U >* m; if (SWIG_ConvertPtr($input,(void **) &m, $1_descriptor, 0) == 0) $1 = 1; else $1 = 0; } } pair(); pair(T first, U second); pair(const pair& other); template pair(const pair &other); T first; U second; }; %enddef %define specialize_std_pair_on_second(U,CHECK,CONVERT_FROM,CONVERT_TO) template struct pair { %typemap(in) pair %{ if (scm_is_pair($input)) { T* x; SCM first, second; first = SCM_CAR($input); second = SCM_CDR($input); x = (T*) SWIG_MustGetPtr(first,$descriptor(T *),$argnum, 0); if (!CHECK(second)) SWIG_exception(SWIG_TypeError, "pair<" #T "," #U "> expected"); $1 = std::make_pair(*x,CONVERT_FROM(second)); } else { $1 = *(($&1_type) SWIG_MustGetPtr($input,$&1_descriptor,$argnum, 0)); } %} %typemap(in) const pair& (std::pair *temp = 0), const pair* (std::pair *temp = 0) %{ if (scm_is_pair($input)) { T* x; SCM first, second; first = SCM_CAR($input); second = SCM_CDR($input); x = (T*) SWIG_MustGetPtr(first,$descriptor(T *),$argnum, 0); if (!CHECK(second)) SWIG_exception(SWIG_TypeError, "pair<" #T "," #U "> expected"); temp = new std::pair< T, U >(*x,CONVERT_FROM(second)); $1 = temp; } else { $1 = ($1_ltype) SWIG_MustGetPtr($input,$1_descriptor,$argnum, 0); } %} %typemap(freearg) const pair&, const pair* %{ delete temp$argnum; %} %typemap(out) pair { T* x = new T($1.first); SCM first = SWIG_NewPointerObj(x,$descriptor(T *), 1); $result = scm_cons(first,CONVERT_TO($1.second)); } %typecheck(SWIG_TYPECHECK_PAIR) pair { /* native pair? */ if (scm_is_pair($input)) { T* x; SCM first = SCM_CAR($input); SCM second = SCM_CDR($input); if (SWIG_ConvertPtr(first,(void**) &x, $descriptor(T *), 0) == 0 && CHECK(second)) { $1 = 1; } else { $1 = 0; } } else { /* wrapped pair? */ std::pair< T, U >* m; if (SWIG_ConvertPtr($input,(void **) &m, $&1_descriptor, 0) == 0) $1 = 1; else $1 = 0; } } %typecheck(SWIG_TYPECHECK_PAIR) const pair&, const pair* { /* native pair? */ if (scm_is_pair($input)) { T* x; SCM first = SCM_CAR($input); SCM second = SCM_CDR($input); if (SWIG_ConvertPtr(first,(void**) &x, $descriptor(T *), 0) == 0 && CHECK(second)) { $1 = 1; } else { $1 = 0; } } else { /* wrapped pair? */ std::pair< T, U >* m; if (SWIG_ConvertPtr($input,(void **) &m, $1_descriptor, 0) == 0) $1 = 1; else $1 = 0; } } pair(); pair(T first, U second); pair(const pair& other); template pair(const pair &other); T first; U second; }; %enddef %define specialize_std_pair_on_both(T,CHECK_T,CONVERT_T_FROM,CONVERT_T_TO, U,CHECK_U,CONVERT_U_FROM,CONVERT_U_TO) template<> struct pair { %typemap(in) pair %{ if (scm_is_pair($input)) { SCM first, second; first = SCM_CAR($input); second = SCM_CDR($input); if (!CHECK_T(first) || !CHECK_U(second)) SWIG_exception(SWIG_TypeError, "pair<" #T "," #U "> expected"); $1 = std::make_pair(CONVERT_T_FROM(first), CONVERT_U_FROM(second)); } else { $1 = *(($&1_type) SWIG_MustGetPtr($input,$&1_descriptor,$argnum, 0)); } %} %typemap(in) const pair& (std::pair *temp = 0), const pair* (std::pair *temp = 0) %{ if (scm_is_pair($input)) { SCM first, second; first = SCM_CAR($input); second = SCM_CDR($input); if (!CHECK_T(first) || !CHECK_U(second)) SWIG_exception(SWIG_TypeError, "pair<" #T "," #U "> expected"); temp = new std::pair< T, U >(CONVERT_T_FROM(first), CONVERT_U_FROM(second)); $1 = temp; } else { $1 = ($1_ltype) SWIG_MustGetPtr($input,$1_descriptor,$argnum, 0); } %} %typemap(freearg) const pair&, const pair* %{ delete temp$argnum; %} %typemap(out) pair { $result = scm_cons(CONVERT_T_TO($1.first), CONVERT_U_TO($1.second)); } %typecheck(SWIG_TYPECHECK_PAIR) pair { /* native pair? */ if (scm_is_pair($input)) { SCM first = SCM_CAR($input); SCM second = SCM_CDR($input); if (CHECK_T(first) && CHECK_U(second)) { $1 = 1; } else { $1 = 0; } } else { /* wrapped pair? */ std::pair< T, U >* m; if (SWIG_ConvertPtr($input,(void **) &m, $&1_descriptor, 0) == 0) $1 = 1; else $1 = 0; } } %typecheck(SWIG_TYPECHECK_PAIR) const pair&, const pair* { /* native pair? */ if (scm_is_pair($input)) { SCM first = SCM_CAR($input); SCM second = SCM_CDR($input); if (CHECK_T(first) && CHECK_U(second)) { $1 = 1; } else { $1 = 0; } } else { /* wrapped pair? */ std::pair< T, U >* m; if (SWIG_ConvertPtr($input,(void **) &m, $1_descriptor, 0) == 0) $1 = 1; else $1 = 0; } } pair(); pair(T first, U second); pair(const pair& other); template pair(const pair &other); T first; U second; }; %enddef specialize_std_pair_on_first(bool,scm_is_bool, scm_is_true,SWIG_bool2scm); specialize_std_pair_on_first(int,scm_is_number, scm_to_long,scm_from_long); specialize_std_pair_on_first(short,scm_is_number, scm_to_long,scm_from_long); specialize_std_pair_on_first(long,scm_is_number, scm_to_long,scm_from_long); specialize_std_pair_on_first(unsigned int,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_pair_on_first(unsigned short,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_pair_on_first(unsigned long,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_pair_on_first(double,scm_is_number, scm_to_double,scm_from_double); specialize_std_pair_on_first(float,scm_is_number, scm_to_double,scm_from_double); specialize_std_pair_on_first(std::string,scm_is_string, SWIG_scm2string,SWIG_string2scm); specialize_std_pair_on_second(bool,scm_is_bool, scm_is_true,SWIG_bool2scm); specialize_std_pair_on_second(int,scm_is_number, scm_to_long,scm_from_long); specialize_std_pair_on_second(short,scm_is_number, scm_to_long,scm_from_long); specialize_std_pair_on_second(long,scm_is_number, scm_to_long,scm_from_long); specialize_std_pair_on_second(unsigned int,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_pair_on_second(unsigned short,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_pair_on_second(unsigned long,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_pair_on_second(double,scm_is_number, scm_to_double,scm_from_double); specialize_std_pair_on_second(float,scm_is_number, scm_to_double,scm_from_double); specialize_std_pair_on_second(std::string,scm_is_string, SWIG_scm2string,SWIG_string2scm); specialize_std_pair_on_both(bool,scm_is_bool, scm_is_true,SWIG_bool2scm, bool,scm_is_bool, scm_is_true,SWIG_bool2scm); specialize_std_pair_on_both(bool,scm_is_bool, scm_is_true,SWIG_bool2scm, int,scm_is_number, scm_to_long,scm_from_long); specialize_std_pair_on_both(bool,scm_is_bool, scm_is_true,SWIG_bool2scm, short,scm_is_number, scm_to_long,scm_from_long); specialize_std_pair_on_both(bool,scm_is_bool, scm_is_true,SWIG_bool2scm, long,scm_is_number, scm_to_long,scm_from_long); specialize_std_pair_on_both(bool,scm_is_bool, scm_is_true,SWIG_bool2scm, unsigned int,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_pair_on_both(bool,scm_is_bool, scm_is_true,SWIG_bool2scm, unsigned short,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_pair_on_both(bool,scm_is_bool, scm_is_true,SWIG_bool2scm, unsigned long,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_pair_on_both(bool,scm_is_bool, scm_is_true,SWIG_bool2scm, double,scm_is_number, scm_to_double,scm_from_double); specialize_std_pair_on_both(bool,scm_is_bool, scm_is_true,SWIG_bool2scm, float,scm_is_number, scm_to_double,scm_from_double); specialize_std_pair_on_both(bool,scm_is_bool, scm_is_true,SWIG_bool2scm, std::string,scm_is_string, SWIG_scm2string,SWIG_string2scm); specialize_std_pair_on_both(int,scm_is_number, scm_to_long,scm_from_long, bool,scm_is_bool, scm_is_true,SWIG_bool2scm); specialize_std_pair_on_both(int,scm_is_number, scm_to_long,scm_from_long, int,scm_is_number, scm_to_long,scm_from_long); specialize_std_pair_on_both(int,scm_is_number, scm_to_long,scm_from_long, short,scm_is_number, scm_to_long,scm_from_long); specialize_std_pair_on_both(int,scm_is_number, scm_to_long,scm_from_long, long,scm_is_number, scm_to_long,scm_from_long); specialize_std_pair_on_both(int,scm_is_number, scm_to_long,scm_from_long, unsigned int,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_pair_on_both(int,scm_is_number, scm_to_long,scm_from_long, unsigned short,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_pair_on_both(int,scm_is_number, scm_to_long,scm_from_long, unsigned long,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_pair_on_both(int,scm_is_number, scm_to_long,scm_from_long, double,scm_is_number, scm_to_double,scm_from_double); specialize_std_pair_on_both(int,scm_is_number, scm_to_long,scm_from_long, float,scm_is_number, scm_to_double,scm_from_double); specialize_std_pair_on_both(int,scm_is_number, scm_to_long,scm_from_long, std::string,scm_is_string, SWIG_scm2string,SWIG_string2scm); specialize_std_pair_on_both(short,scm_is_number, scm_to_long,scm_from_long, bool,scm_is_bool, scm_is_true,SWIG_bool2scm); specialize_std_pair_on_both(short,scm_is_number, scm_to_long,scm_from_long, int,scm_is_number, scm_to_long,scm_from_long); specialize_std_pair_on_both(short,scm_is_number, scm_to_long,scm_from_long, short,scm_is_number, scm_to_long,scm_from_long); specialize_std_pair_on_both(short,scm_is_number, scm_to_long,scm_from_long, long,scm_is_number, scm_to_long,scm_from_long); specialize_std_pair_on_both(short,scm_is_number, scm_to_long,scm_from_long, unsigned int,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_pair_on_both(short,scm_is_number, scm_to_long,scm_from_long, unsigned short,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_pair_on_both(short,scm_is_number, scm_to_long,scm_from_long, unsigned long,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_pair_on_both(short,scm_is_number, scm_to_long,scm_from_long, double,scm_is_number, scm_to_double,scm_from_double); specialize_std_pair_on_both(short,scm_is_number, scm_to_long,scm_from_long, float,scm_is_number, scm_to_double,scm_from_double); specialize_std_pair_on_both(short,scm_is_number, scm_to_long,scm_from_long, std::string,scm_is_string, SWIG_scm2string,SWIG_string2scm); specialize_std_pair_on_both(long,scm_is_number, scm_to_long,scm_from_long, bool,scm_is_bool, scm_is_true,SWIG_bool2scm); specialize_std_pair_on_both(long,scm_is_number, scm_to_long,scm_from_long, int,scm_is_number, scm_to_long,scm_from_long); specialize_std_pair_on_both(long,scm_is_number, scm_to_long,scm_from_long, short,scm_is_number, scm_to_long,scm_from_long); specialize_std_pair_on_both(long,scm_is_number, scm_to_long,scm_from_long, long,scm_is_number, scm_to_long,scm_from_long); specialize_std_pair_on_both(long,scm_is_number, scm_to_long,scm_from_long, unsigned int,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_pair_on_both(long,scm_is_number, scm_to_long,scm_from_long, unsigned short,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_pair_on_both(long,scm_is_number, scm_to_long,scm_from_long, unsigned long,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_pair_on_both(long,scm_is_number, scm_to_long,scm_from_long, double,scm_is_number, scm_to_double,scm_from_double); specialize_std_pair_on_both(long,scm_is_number, scm_to_long,scm_from_long, float,scm_is_number, scm_to_double,scm_from_double); specialize_std_pair_on_both(long,scm_is_number, scm_to_long,scm_from_long, std::string,scm_is_string, SWIG_scm2string,SWIG_string2scm); specialize_std_pair_on_both(unsigned int,scm_is_number, scm_to_ulong,scm_from_ulong, bool,scm_is_bool, scm_is_true,SWIG_bool2scm); specialize_std_pair_on_both(unsigned int,scm_is_number, scm_to_ulong,scm_from_ulong, int,scm_is_number, scm_to_long,scm_from_long); specialize_std_pair_on_both(unsigned int,scm_is_number, scm_to_ulong,scm_from_ulong, short,scm_is_number, scm_to_long,scm_from_long); specialize_std_pair_on_both(unsigned int,scm_is_number, scm_to_ulong,scm_from_ulong, long,scm_is_number, scm_to_long,scm_from_long); specialize_std_pair_on_both(unsigned int,scm_is_number, scm_to_ulong,scm_from_ulong, unsigned int,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_pair_on_both(unsigned int,scm_is_number, scm_to_ulong,scm_from_ulong, unsigned short,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_pair_on_both(unsigned int,scm_is_number, scm_to_ulong,scm_from_ulong, unsigned long,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_pair_on_both(unsigned int,scm_is_number, scm_to_ulong,scm_from_ulong, double,scm_is_number, scm_to_double,scm_from_double); specialize_std_pair_on_both(unsigned int,scm_is_number, scm_to_ulong,scm_from_ulong, float,scm_is_number, scm_to_double,scm_from_double); specialize_std_pair_on_both(unsigned int,scm_is_number, scm_to_ulong,scm_from_ulong, std::string,scm_is_string, SWIG_scm2string,SWIG_string2scm); specialize_std_pair_on_both(unsigned short,scm_is_number, scm_to_ulong,scm_from_ulong, bool,scm_is_bool, scm_is_true,SWIG_bool2scm); specialize_std_pair_on_both(unsigned short,scm_is_number, scm_to_ulong,scm_from_ulong, int,scm_is_number, scm_to_long,scm_from_long); specialize_std_pair_on_both(unsigned short,scm_is_number, scm_to_ulong,scm_from_ulong, short,scm_is_number, scm_to_long,scm_from_long); specialize_std_pair_on_both(unsigned short,scm_is_number, scm_to_ulong,scm_from_ulong, long,scm_is_number, scm_to_long,scm_from_long); specialize_std_pair_on_both(unsigned short,scm_is_number, scm_to_ulong,scm_from_ulong, unsigned int,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_pair_on_both(unsigned short,scm_is_number, scm_to_ulong,scm_from_ulong, unsigned short,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_pair_on_both(unsigned short,scm_is_number, scm_to_ulong,scm_from_ulong, unsigned long,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_pair_on_both(unsigned short,scm_is_number, scm_to_ulong,scm_from_ulong, double,scm_is_number, scm_to_double,scm_from_double); specialize_std_pair_on_both(unsigned short,scm_is_number, scm_to_ulong,scm_from_ulong, float,scm_is_number, scm_to_double,scm_from_double); specialize_std_pair_on_both(unsigned short,scm_is_number, scm_to_ulong,scm_from_ulong, std::string,scm_is_string, SWIG_scm2string,SWIG_string2scm); specialize_std_pair_on_both(unsigned long,scm_is_number, scm_to_ulong,scm_from_ulong, bool,scm_is_bool, scm_is_true,SWIG_bool2scm); specialize_std_pair_on_both(unsigned long,scm_is_number, scm_to_ulong,scm_from_ulong, int,scm_is_number, scm_to_long,scm_from_long); specialize_std_pair_on_both(unsigned long,scm_is_number, scm_to_ulong,scm_from_ulong, short,scm_is_number, scm_to_long,scm_from_long); specialize_std_pair_on_both(unsigned long,scm_is_number, scm_to_ulong,scm_from_ulong, long,scm_is_number, scm_to_long,scm_from_long); specialize_std_pair_on_both(unsigned long,scm_is_number, scm_to_ulong,scm_from_ulong, unsigned int,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_pair_on_both(unsigned long,scm_is_number, scm_to_ulong,scm_from_ulong, unsigned short,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_pair_on_both(unsigned long,scm_is_number, scm_to_ulong,scm_from_ulong, unsigned long,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_pair_on_both(unsigned long,scm_is_number, scm_to_ulong,scm_from_ulong, double,scm_is_number, scm_to_double,scm_from_double); specialize_std_pair_on_both(unsigned long,scm_is_number, scm_to_ulong,scm_from_ulong, float,scm_is_number, scm_to_double,scm_from_double); specialize_std_pair_on_both(unsigned long,scm_is_number, scm_to_ulong,scm_from_ulong, std::string,scm_is_string, SWIG_scm2string,SWIG_string2scm); specialize_std_pair_on_both(double,scm_is_number, scm_to_double,scm_from_double, bool,scm_is_bool, scm_is_true,SWIG_bool2scm); specialize_std_pair_on_both(double,scm_is_number, scm_to_double,scm_from_double, int,scm_is_number, scm_to_long,scm_from_long); specialize_std_pair_on_both(double,scm_is_number, scm_to_double,scm_from_double, short,scm_is_number, scm_to_long,scm_from_long); specialize_std_pair_on_both(double,scm_is_number, scm_to_double,scm_from_double, long,scm_is_number, scm_to_long,scm_from_long); specialize_std_pair_on_both(double,scm_is_number, scm_to_double,scm_from_double, unsigned int,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_pair_on_both(double,scm_is_number, scm_to_double,scm_from_double, unsigned short,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_pair_on_both(double,scm_is_number, scm_to_double,scm_from_double, unsigned long,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_pair_on_both(double,scm_is_number, scm_to_double,scm_from_double, double,scm_is_number, scm_to_double,scm_from_double); specialize_std_pair_on_both(double,scm_is_number, scm_to_double,scm_from_double, float,scm_is_number, scm_to_double,scm_from_double); specialize_std_pair_on_both(double,scm_is_number, scm_to_double,scm_from_double, std::string,scm_is_string, SWIG_scm2string,SWIG_string2scm); specialize_std_pair_on_both(float,scm_is_number, scm_to_double,scm_from_double, bool,scm_is_bool, scm_is_true,SWIG_bool2scm); specialize_std_pair_on_both(float,scm_is_number, scm_to_double,scm_from_double, int,scm_is_number, scm_to_long,scm_from_long); specialize_std_pair_on_both(float,scm_is_number, scm_to_double,scm_from_double, short,scm_is_number, scm_to_long,scm_from_long); specialize_std_pair_on_both(float,scm_is_number, scm_to_double,scm_from_double, long,scm_is_number, scm_to_long,scm_from_long); specialize_std_pair_on_both(float,scm_is_number, scm_to_double,scm_from_double, unsigned int,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_pair_on_both(float,scm_is_number, scm_to_double,scm_from_double, unsigned short,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_pair_on_both(float,scm_is_number, scm_to_double,scm_from_double, unsigned long,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_pair_on_both(float,scm_is_number, scm_to_double,scm_from_double, double,scm_is_number, scm_to_double,scm_from_double); specialize_std_pair_on_both(float,scm_is_number, scm_to_double,scm_from_double, float,scm_is_number, scm_to_double,scm_from_double); specialize_std_pair_on_both(float,scm_is_number, scm_to_double,scm_from_double, std::string,scm_is_string, SWIG_scm2string,SWIG_string2scm); specialize_std_pair_on_both(std::string,scm_is_string, SWIG_scm2string,SWIG_string2scm, bool,scm_is_bool, scm_is_true,SWIG_bool2scm); specialize_std_pair_on_both(std::string,scm_is_string, SWIG_scm2string,SWIG_string2scm, int,scm_is_number, scm_to_long,scm_from_long); specialize_std_pair_on_both(std::string,scm_is_string, SWIG_scm2string,SWIG_string2scm, short,scm_is_number, scm_to_long,scm_from_long); specialize_std_pair_on_both(std::string,scm_is_string, SWIG_scm2string,SWIG_string2scm, long,scm_is_number, scm_to_long,scm_from_long); specialize_std_pair_on_both(std::string,scm_is_string, SWIG_scm2string,SWIG_string2scm, unsigned int,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_pair_on_both(std::string,scm_is_string, SWIG_scm2string,SWIG_string2scm, unsigned short,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_pair_on_both(std::string,scm_is_string, SWIG_scm2string,SWIG_string2scm, unsigned long,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_pair_on_both(std::string,scm_is_string, SWIG_scm2string,SWIG_string2scm, double,scm_is_number, scm_to_double,scm_from_double); specialize_std_pair_on_both(std::string,scm_is_string, SWIG_scm2string,SWIG_string2scm, float,scm_is_number, scm_to_double,scm_from_double); specialize_std_pair_on_both(std::string,scm_is_string, SWIG_scm2string,SWIG_string2scm, std::string,scm_is_string, SWIG_scm2string,SWIG_string2scm); } swig-4.0.1/Lib/guile/stl.i0000644000175000017500000000044313527063513015140 0ustar williamwilliam/* ----------------------------------------------------------------------------- * stl.i * ----------------------------------------------------------------------------- */ %include %include %include %include %include swig-4.0.1/Lib/guile/cplusplus.i0000644000175000017500000000136313527063513016372 0ustar williamwilliam/* ----------------------------------------------------------------------------- * cplusplus.i * * SWIG typemaps for C++ * ----------------------------------------------------------------------------- */ %typemap(guile,out) string, std::string { $result = SWIG_str02scm(const_cast($1.c_str())); } %typemap(guile,in) string, std::string { $1 = SWIG_scm2str($input); } %typemap(guile,out) complex, complex, std::complex { $result = scm_make_rectangular( scm_from_double ($1.real ()), scm_from_double ($1.imag ()) ); } %typemap(guile,in) complex, complex, std::complex { $1 = std::complex( scm_to_double (scm_real_part ($input)), scm_to_double (scm_imag_part ($input)) ); } swig-4.0.1/Lib/guile/pointer-in-out.i0000644000175000017500000000637513527063513017241 0ustar williamwilliam/* ----------------------------------------------------------------------------- * pointer-in-out.i * * Guile typemaps for passing pointers indirectly * ----------------------------------------------------------------------------- */ /* Here is a macro that will define typemaps for passing C pointers indirectly. TYPEMAP_POINTER_INPUT_OUTPUT(PTRTYPE, SCM_TYPE) Supported calling conventions (in this example, PTRTYPE is int *): func(int **INPUT) Scheme wrapper will take one argument, a wrapped C pointer. The address of a variable containing this pointer will be passed to the function. func(int **INPUT_CONSUMED) Likewise, but mark the pointer object as not garbage collectable. func(int **INPUT_DESTROYED) Likewise, but mark the pointer object as destroyed. func(int **OUTPUT) Scheme wrapper will take no arguments. The address of an int * variable will be passed to the function. The function is expected to modify the variable; its value is wrapped and becomes an extra return value. (See the documentation on how to deal with multiple values.) func(int **OUTPUT_NONCOLLECTABLE) Likewise, but make the pointer object not garbage collectable. func(int **BOTH) func(int **INOUT) This annotation combines INPUT and OUTPUT. */ %define TYPEMAP_POINTER_INPUT_OUTPUT(PTRTYPE, SCM_TYPE) %typemap(in, doc="$NAME is of type <" #SCM_TYPE ">") PTRTYPE *INPUT(PTRTYPE temp) { if (SWIG_ConvertPtr($input, (void **) &temp, $*descriptor, 0)) { scm_wrong_type_arg(FUNC_NAME, $argnum, $input); } $1 = &temp; } %typemap(in, doc="$NAME is of type <" #SCM_TYPE "> and is consumed by the function") PTRTYPE *INPUT_CONSUMED(PTRTYPE temp) { if (SWIG_ConvertPtr($input, (void **) &temp, $*descriptor, 0)) { scm_wrong_type_arg(FUNC_NAME, $argnum, $input); } SWIG_Guile_MarkPointerNoncollectable($input); $1 = &temp; } %typemap(in, doc="$NAME is of type <" #SCM_TYPE "> and is consumed by the function") PTRTYPE *INPUT_DESTROYED(PTRTYPE temp) { if (SWIG_ConvertPtr($input, (void **) &temp, $*descriptor, 0)) { scm_wrong_type_arg(FUNC_NAME, $argnum, $input); } SWIG_Guile_MarkPointerDestroyed($input); $1 = &temp; } %typemap(in, numinputs=0) PTRTYPE *OUTPUT(PTRTYPE temp), PTRTYPE *OUTPUT_NONCOLLECTABLE(PTRTYPE temp) "$1 = &temp;"; %typemap(argout, doc="<" #SCM_TYPE ">") PTRTYPE *OUTPUT "SWIG_APPEND_VALUE(SWIG_NewPointerObj(*$1, $*descriptor, 1));"; %typemap(argout, doc="<" #SCM_TYPE ">") PTRTYPE *OUTPUT_NONCOLLECTABLE "SWIG_APPEND_VALUE(SWIG_NewPointerObj(*$1, $*descriptor, 0));"; %typemap(in) PTRTYPE *BOTH = PTRTYPE *INPUT; %typemap(argout) PTRTYPE *BOTH = PTRTYPE *OUTPUT; %typemap(in) PTRTYPE *INOUT = PTRTYPE *INPUT; %typemap(argout) PTRTYPE *INOUT = PTRTYPE *OUTPUT; /* As a special convenience measure, also attach docs involving SCM_TYPE to the standard pointer typemaps */ %typemap(in, doc="$NAME is of type <" #SCM_TYPE ">") PTRTYPE { if (SWIG_ConvertPtr($input, (void **) &$1, $descriptor, 0)) scm_wrong_type_arg(FUNC_NAME, $argnum, $input); } %typemap(out, doc="<" #SCM_TYPE ">") PTRTYPE { $result = SWIG_NewPointerObj ($1, $descriptor, $owner); } %enddef swig-4.0.1/Lib/guile/std_string.i0000644000175000017500000000444113527063513016520 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_string.i * * SWIG typemaps for std::string * ----------------------------------------------------------------------------- */ // ------------------------------------------------------------------------ // std::string is typemapped by value // This can prevent exporting methods which return a string // in order for the user to modify it. // However, I think I'll wait until someone asks for it... // ------------------------------------------------------------------------ %include %{ #include %} namespace std { %naturalvar string; class string; %typemap(typecheck) string = char *; %typemap(typecheck) const string & = char *; %typemap(in) string (char * tempptr) { if (scm_is_string($input)) { tempptr = SWIG_scm2str($input); $1.assign(tempptr); if (tempptr) SWIG_free(tempptr); } else { SWIG_exception(SWIG_TypeError, "string expected"); } } %typemap(in) const string & ($*1_ltype temp, char *tempptr) { if (scm_is_string($input)) { tempptr = SWIG_scm2str($input); temp.assign(tempptr); if (tempptr) SWIG_free(tempptr); $1 = &temp; } else { SWIG_exception(SWIG_TypeError, "string expected"); } } %typemap(in) string * (char *tempptr) { if (scm_is_string($input)) { tempptr = SWIG_scm2str($input); $1 = new $*1_ltype(tempptr); if (tempptr) SWIG_free(tempptr); } else { SWIG_exception(SWIG_TypeError, "string expected"); } } %typemap(out) string { $result = SWIG_str02scm($1.c_str()); } %typemap(out) const string & { $result = SWIG_str02scm($1->c_str()); } %typemap(out) string * { $result = SWIG_str02scm($1->c_str()); } %typemap(varin) string { if (scm_is_string($input)) { char *tempptr = SWIG_scm2str($input); $1.assign(tempptr); if (tempptr) SWIG_free(tempptr); } else { SWIG_exception(SWIG_TypeError, "string expected"); } } %typemap(varout) string { $result = SWIG_str02scm($1.c_str()); } } swig-4.0.1/Lib/guile/std_map.i0000644000175000017500000017104613527063513015775 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_map.i * * SWIG typemaps for std::map * ----------------------------------------------------------------------------- */ %include // ------------------------------------------------------------------------ // std::map // // The aim of all that follows would be to integrate std::map with // Guile as much as possible, namely, to allow the user to pass and // be returned Scheme association lists. // const declarations are used to guess the intent of the function being // exported; therefore, the following rationale is applied: // // -- f(std::map), f(const std::map&), f(const std::map*): // the parameter being read-only, either a Scheme alist or a // previously wrapped std::map can be passed. // -- f(std::map&), f(std::map*): // the parameter must be modified; therefore, only a wrapped std::map // can be passed. // -- std::map f(): // the map is returned by copy; therefore, a Scheme alist // is returned which is most easily used in other Scheme functions // -- std::map& f(), std::map* f(), const std::map& f(), // const std::map* f(): // the map is returned by reference; therefore, a wrapped std::map // is returned // ------------------------------------------------------------------------ %{ #include #include #include %} // exported class namespace std { template > class map { %typemap(in) map< K, T, C > { if (scm_is_null($input)) { $1 = std::map< K, T, C >(); } else if (scm_is_pair($input)) { $1 = std::map< K, T, C >(); SCM alist = $input; while (!scm_is_null(alist)) { K* k; T* x; SCM entry, key, val; entry = SCM_CAR(alist); if (!scm_is_pair(entry)) SWIG_exception(SWIG_TypeError,"alist expected"); key = SCM_CAR(entry); val = SCM_CDR(entry); k = (K*) SWIG_MustGetPtr(key,$descriptor(K *),$argnum, 0); if (SWIG_ConvertPtr(val,(void**) &x, $descriptor(T *), 0) != 0) { if (!scm_is_pair(val)) SWIG_exception(SWIG_TypeError,"alist expected"); val = SCM_CAR(val); x = (T*) SWIG_MustGetPtr(val,$descriptor(T *),$argnum, 0); } (($1_type &)$1)[*k] = *x; alist = SCM_CDR(alist); } } else { $1 = *(($&1_type) SWIG_MustGetPtr($input,$&1_descriptor,$argnum, 0)); } } %typemap(in) const map< K, T, C >& (std::map< K, T, C > temp), const map< K, T, C >* (std::map< K, T, C > temp) { if (scm_is_null($input)) { temp = std::map< K, T, C >(); $1 = &temp; } else if (scm_is_pair($input)) { temp = std::map< K, T, C >(); $1 = &temp; SCM alist = $input; while (!scm_is_null(alist)) { K* k; T* x; SCM entry, key, val; entry = SCM_CAR(alist); if (!scm_is_pair(entry)) SWIG_exception(SWIG_TypeError,"alist expected"); key = SCM_CAR(entry); val = SCM_CDR(entry); k = (K*) SWIG_MustGetPtr(key,$descriptor(K *),$argnum, 0); if (SWIG_ConvertPtr(val,(void**) &x, $descriptor(T *), 0) != 0) { if (!scm_is_pair(val)) SWIG_exception(SWIG_TypeError,"alist expected"); val = SCM_CAR(val); x = (T*) SWIG_MustGetPtr(val,$descriptor(T *),$argnum, 0); } temp[*k] = *x; alist = SCM_CDR(alist); } } else { $1 = ($1_ltype) SWIG_MustGetPtr($input,$1_descriptor,$argnum, 0); } } %typemap(out) map< K, T, C > { SCM alist = SCM_EOL; for (std::map< K, T, C >::reverse_iterator i=$1.rbegin(); i!=$1.rend(); ++i) { K* key = new K(i->first); T* val = new T(i->second); SCM k = SWIG_NewPointerObj(key,$descriptor(K *), 1); SCM x = SWIG_NewPointerObj(val,$descriptor(T *), 1); SCM entry = scm_cons(k,x); alist = scm_cons(entry,alist); } $result = alist; } %typecheck(SWIG_TYPECHECK_MAP) map< K, T, C > { /* native sequence? */ if (scm_is_null($input)) { /* an empty sequence can be of any type */ $1 = 1; } else if (scm_is_pair($input)) { /* check the first element only */ K* k; T* x; SCM head = SCM_CAR($input); if (scm_is_pair(head)) { SCM key = SCM_CAR(head); SCM val = SCM_CDR(head); if (SWIG_ConvertPtr(key,(void**) &k, $descriptor(K *), 0) != 0) { $1 = 0; } else { if (SWIG_ConvertPtr(val,(void**) &x, $descriptor(T *), 0) == 0) { $1 = 1; } else if (scm_is_pair(val)) { val = SCM_CAR(val); if (SWIG_ConvertPtr(val,(void**) &x, $descriptor(T *), 0) == 0) $1 = 1; else $1 = 0; } else { $1 = 0; } } } else { $1 = 0; } } else { /* wrapped map? */ std::map< K, T, C >* m; if (SWIG_ConvertPtr($input,(void **) &m, $&1_descriptor, 0) == 0) $1 = 1; else $1 = 0; } } %typecheck(SWIG_TYPECHECK_MAP) const map< K, T, C >&, const map< K, T, C >* { /* native sequence? */ if (scm_is_null($input)) { /* an empty sequence can be of any type */ $1 = 1; } else if (scm_is_pair($input)) { /* check the first element only */ K* k; T* x; SCM head = SCM_CAR($input); if (scm_is_pair(head)) { SCM key = SCM_CAR(head); SCM val = SCM_CDR(head); if (SWIG_ConvertPtr(key,(void**) &k, $descriptor(K *), 0) != 0) { $1 = 0; } else { if (SWIG_ConvertPtr(val,(void**) &x, $descriptor(T *), 0) == 0) { $1 = 1; } else if (scm_is_pair(val)) { val = SCM_CAR(val); if (SWIG_ConvertPtr(val,(void**) &x, $descriptor(T *), 0) == 0) $1 = 1; else $1 = 0; } else { $1 = 0; } } } else { $1 = 0; } } else { /* wrapped map? */ std::map< K, T, C >* m; if (SWIG_ConvertPtr($input,(void **) &m, $1_descriptor, 0) == 0) $1 = 1; else $1 = 0; } } %rename("length") size; %rename("null?") empty; %rename("clear!") clear; %rename("ref") __getitem__; %rename("set!") __setitem__; %rename("delete!") __delitem__; %rename("has-key?") has_key; public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef K key_type; typedef T mapped_type; typedef std::pair< const K, T > value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; map(); map(const map& other); unsigned int size() const; bool empty() const; void clear(); %extend { const T& __getitem__(const K& key) throw (std::out_of_range) { std::map< K, T, C >::iterator i = self->find(key); if (i != self->end()) return i->second; else throw std::out_of_range("key not found"); } void __setitem__(const K& key, const T& x) { (*self)[key] = x; } void __delitem__(const K& key) throw (std::out_of_range) { std::map< K, T, C >::iterator i = self->find(key); if (i != self->end()) self->erase(i); else throw std::out_of_range("key not found"); } bool has_key(const K& key) { std::map< K, T, C >::iterator i = self->find(key); return i != self->end(); } SCM keys() { SCM result = SCM_EOL; for (std::map< K, T, C >::reverse_iterator i=self->rbegin(); i!=self->rend(); ++i) { K* key = new K(i->first); SCM k = SWIG_NewPointerObj(key,$descriptor(K *), 1); result = scm_cons(k,result); } return result; } } }; // specializations for built-ins %define specialize_std_map_on_key(K,CHECK,CONVERT_FROM,CONVERT_TO) template class map< K, T, C > { %typemap(in) map< K, T, C > { if (scm_is_null($input)) { $1 = std::map< K, T, C >(); } else if (scm_is_pair($input)) { $1 = std::map< K, T, C >(); SCM alist = $input; while (!scm_is_null(alist)) { T* x; SCM entry, key, val; entry = SCM_CAR(alist); if (!scm_is_pair(entry)) SWIG_exception(SWIG_TypeError,"alist expected"); key = SCM_CAR(entry); val = SCM_CDR(entry); if (!CHECK(key)) SWIG_exception(SWIG_TypeError, "map<" #K "," #T "," #C "> expected"); if (SWIG_ConvertPtr(val,(void**) &x, $descriptor(T *), 0) != 0) { if (!scm_is_pair(val)) SWIG_exception(SWIG_TypeError,"alist expected"); val = SCM_CAR(val); x = (T*) SWIG_MustGetPtr(val,$descriptor(T *),$argnum, 0); } (($1_type &)$1)[CONVERT_FROM(key)] = *x; alist = SCM_CDR(alist); } } else { $1 = *(($&1_type) SWIG_MustGetPtr($input,$&1_descriptor,$argnum, 0)); } } %typemap(in) const map< K, T, C >& (std::map< K, T, C > temp), const map< K, T, C >* (std::map< K, T, C > temp) { if (scm_is_null($input)) { temp = std::map< K, T, C >(); $1 = &temp; } else if (scm_is_pair($input)) { temp = std::map< K, T, C >(); $1 = &temp; SCM alist = $input; while (!scm_is_null(alist)) { T* x; SCM entry, key, val; entry = SCM_CAR(alist); if (!scm_is_pair(entry)) SWIG_exception(SWIG_TypeError,"alist expected"); key = SCM_CAR(entry); val = SCM_CDR(entry); if (!CHECK(key)) SWIG_exception(SWIG_TypeError, "map<" #K "," #T "," #C "> expected"); if (SWIG_ConvertPtr(val,(void**) &x, $descriptor(T *), 0) != 0) { if (!scm_is_pair(val)) SWIG_exception(SWIG_TypeError,"alist expected"); val = SCM_CAR(val); x = (T*) SWIG_MustGetPtr(val,$descriptor(T *),$argnum, 0); } temp[CONVERT_FROM(key)] = *x; alist = SCM_CDR(alist); } } else { $1 = ($1_ltype) SWIG_MustGetPtr($input,$1_descriptor,$argnum, 0); } } %typemap(out) map< K, T, C > { SCM alist = SCM_EOL; for (std::map< K, T, C >::reverse_iterator i=$1.rbegin(); i!=$1.rend(); ++i) { T* val = new T(i->second); SCM k = CONVERT_TO(i->first); SCM x = SWIG_NewPointerObj(val,$descriptor(T *), 1); SCM entry = scm_cons(k,x); alist = scm_cons(entry,alist); } $result = alist; } %typecheck(SWIG_TYPECHECK_MAP) map< K, T, C > { // native sequence? if (scm_is_null($input)) { /* an empty sequence can be of any type */ $1 = 1; } else if (scm_is_pair($input)) { // check the first element only T* x; SCM head = SCM_CAR($input); if (scm_is_pair(head)) { SCM key = SCM_CAR(head); SCM val = SCM_CDR(head); if (!CHECK(key)) { $1 = 0; } else { if (SWIG_ConvertPtr(val,(void**) &x, $descriptor(T *), 0) == 0) { $1 = 1; } else if (scm_is_pair(val)) { val = SCM_CAR(val); if (SWIG_ConvertPtr(val,(void**) &x, $descriptor(T *), 0) == 0) $1 = 1; else $1 = 0; } else { $1 = 0; } } } else { $1 = 0; } } else { // wrapped map? std::map< K, T, C >* m; if (SWIG_ConvertPtr($input,(void **) &m, $&1_descriptor, 0) == 0) $1 = 1; else $1 = 0; } } %typecheck(SWIG_TYPECHECK_MAP) const map< K, T, C >&, const map< K, T, C >* { // native sequence? if (scm_is_null($input)) { /* an empty sequence can be of any type */ $1 = 1; } else if (scm_is_pair($input)) { // check the first element only T* x; SCM head = SCM_CAR($input); if (scm_is_pair(head)) { SCM key = SCM_CAR(head); SCM val = SCM_CDR(head); if (!CHECK(key)) { $1 = 0; } else { if (SWIG_ConvertPtr(val,(void**) &x, $descriptor(T *), 0) == 0) { $1 = 1; } else if (scm_is_pair(val)) { val = SCM_CAR(val); if (SWIG_ConvertPtr(val,(void**) &x, $descriptor(T *), 0) == 0) $1 = 1; else $1 = 0; } else { $1 = 0; } } } else { $1 = 0; } } else { // wrapped map? std::map< K, T, C >* m; if (SWIG_ConvertPtr($input,(void **) &m, $1_descriptor, 0) == 0) $1 = 1; else $1 = 0; } } %rename("length") size; %rename("null?") empty; %rename("clear!") clear; %rename("ref") __getitem__; %rename("set!") __setitem__; %rename("delete!") __delitem__; %rename("has-key?") has_key; public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef K key_type; typedef T mapped_type; typedef std::pair< const K, T > value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; map(); map(const map& other); unsigned int size() const; bool empty() const; void clear(); %extend { T& __getitem__(K key) throw (std::out_of_range) { std::map< K, T, C >::iterator i = self->find(key); if (i != self->end()) return i->second; else throw std::out_of_range("key not found"); } void __setitem__(K key, const T& x) { (*self)[key] = x; } void __delitem__(K key) throw (std::out_of_range) { std::map< K, T, C >::iterator i = self->find(key); if (i != self->end()) self->erase(i); else throw std::out_of_range("key not found"); } bool has_key(K key) { std::map< K, T, C >::iterator i = self->find(key); return i != self->end(); } SCM keys() { SCM result = SCM_EOL; for (std::map< K, T, C >::reverse_iterator i=self->rbegin(); i!=self->rend(); ++i) { SCM k = CONVERT_TO(i->first); result = scm_cons(k,result); } return result; } } }; %enddef %define specialize_std_map_on_value(T,CHECK,CONVERT_FROM,CONVERT_TO) template class map< K, T, C > { %typemap(in) map< K, T, C > { if (scm_is_null($input)) { $1 = std::map< K, T, C >(); } else if (scm_is_pair($input)) { $1 = std::map< K, T, C >(); SCM alist = $input; while (!scm_is_null(alist)) { K* k; SCM entry, key, val; entry = SCM_CAR(alist); if (!scm_is_pair(entry)) SWIG_exception(SWIG_TypeError,"alist expected"); key = SCM_CAR(entry); val = SCM_CDR(entry); k = (K*) SWIG_MustGetPtr(key,$descriptor(K *),$argnum, 0); if (!CHECK(val)) { if (!scm_is_pair(val)) SWIG_exception(SWIG_TypeError,"alist expected"); val = SCM_CAR(val); if (!CHECK(val)) SWIG_exception(SWIG_TypeError, "map<" #K "," #T "," #C "> expected"); } (($1_type &)$1)[*k] = CONVERT_FROM(val); alist = SCM_CDR(alist); } } else { $1 = *(($&1_type) SWIG_MustGetPtr($input,$&1_descriptor,$argnum, 0)); } } %typemap(in) const map< K, T, C >& (std::map< K, T, C > temp), const map< K, T, C >* (std::map< K, T, C > temp) { if (scm_is_null($input)) { temp = std::map< K, T, C >(); $1 = &temp; } else if (scm_is_pair($input)) { temp = std::map< K, T, C >(); $1 = &temp; SCM alist = $input; while (!scm_is_null(alist)) { K* k; SCM entry, key, val; entry = SCM_CAR(alist); if (!scm_is_pair(entry)) SWIG_exception(SWIG_TypeError,"alist expected"); key = SCM_CAR(entry); val = SCM_CDR(entry); k = (K*) SWIG_MustGetPtr(key,$descriptor(K *),$argnum, 0); if (!CHECK(val)) { if (!scm_is_pair(val)) SWIG_exception(SWIG_TypeError,"alist expected"); val = SCM_CAR(val); if (!CHECK(val)) SWIG_exception(SWIG_TypeError, "map<" #K "," #T "," #C "> expected"); } temp[*k] = CONVERT_FROM(val); alist = SCM_CDR(alist); } } else { $1 = ($1_ltype) SWIG_MustGetPtr($input,$1_descriptor,$argnum, 0); } } %typemap(out) map< K, T, C > { SCM alist = SCM_EOL; for (std::map< K, T, C >::reverse_iterator i=$1.rbegin(); i!=$1.rend(); ++i) { K* key = new K(i->first); SCM k = SWIG_NewPointerObj(key,$descriptor(K *), 1); SCM x = CONVERT_TO(i->second); SCM entry = scm_cons(k,x); alist = scm_cons(entry,alist); } $result = alist; } %typecheck(SWIG_TYPECHECK_MAP) map< K, T, C > { // native sequence? if (scm_is_null($input)) { /* an empty sequence can be of any type */ $1 = 1; } else if (scm_is_pair($input)) { // check the first element only K* k; SCM head = SCM_CAR($input); if (scm_is_pair(head)) { SCM val = SCM_CDR(head); if (SWIG_ConvertPtr(val,(void **) &k, $descriptor(K *), 0) != 0) { $1 = 0; } else { if (CHECK(val)) { $1 = 1; } else if (scm_is_pair(val)) { val = SCM_CAR(val); if (CHECK(val)) $1 = 1; else $1 = 0; } else { $1 = 0; } } } else { $1 = 0; } } else { // wrapped map? std::map< K, T, C >* m; if (SWIG_ConvertPtr($input,(void **) &m, $&1_descriptor, 0) == 0) $1 = 1; else $1 = 0; } } %typecheck(SWIG_TYPECHECK_MAP) const map< K, T, C >&, const map< K, T, C >* { // native sequence? if (scm_is_null($input)) { /* an empty sequence can be of any type */ $1 = 1; } else if (scm_is_pair($input)) { // check the first element only K* k; SCM head = SCM_CAR($input); if (scm_is_pair(head)) { SCM val = SCM_CDR(head); if (SWIG_ConvertPtr(val,(void **) &k, $descriptor(K *), 0) != 0) { $1 = 0; } else { if (CHECK(val)) { $1 = 1; } else if (scm_is_pair(val)) { val = SCM_CAR(val); if (CHECK(val)) $1 = 1; else $1 = 0; } else { $1 = 0; } } } else { $1 = 0; } } else { // wrapped map? std::map< K, T, C >* m; if (SWIG_ConvertPtr($input,(void **) &m, $1_descriptor, 0) == 0) $1 = 1; else $1 = 0; } } %rename("length") size; %rename("null?") empty; %rename("clear!") clear; %rename("ref") __getitem__; %rename("set!") __setitem__; %rename("delete!") __delitem__; %rename("has-key?") has_key; public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef K key_type; typedef T mapped_type; typedef std::pair< const K, T > value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; map(); map(const map& other); unsigned int size() const; bool empty() const; void clear(); %extend { T __getitem__(const K& key) throw (std::out_of_range) { std::map< K, T, C >::iterator i = self->find(key); if (i != self->end()) return i->second; else throw std::out_of_range("key not found"); } void __setitem__(const K& key, T x) { (*self)[key] = x; } void __delitem__(const K& key) throw (std::out_of_range) { std::map< K, T, C >::iterator i = self->find(key); if (i != self->end()) self->erase(i); else throw std::out_of_range("key not found"); } bool has_key(const K& key) { std::map< K, T, C >::iterator i = self->find(key); return i != self->end(); } SCM keys() { SCM result = SCM_EOL; for (std::map< K, T, C >::reverse_iterator i=self->rbegin(); i!=self->rend(); ++i) { K* key = new K(i->first); SCM k = SWIG_NewPointerObj(key,$descriptor(K *), 1); result = scm_cons(k,result); } return result; } } }; %enddef %define specialize_std_map_on_both(K,CHECK_K,CONVERT_K_FROM,CONVERT_K_TO, T,CHECK_T,CONVERT_T_FROM,CONVERT_T_TO) template<> class map< K, T, C > { %typemap(in) map< K, T, C > { if (scm_is_null($input)) { $1 = std::map< K, T, C >(); } else if (scm_is_pair($input)) { $1 = std::map< K, T, C >(); SCM alist = $input; while (!scm_is_null(alist)) { SCM entry, key, val; entry = SCM_CAR(alist); if (!scm_is_pair(entry)) SWIG_exception(SWIG_TypeError,"alist expected"); key = SCM_CAR(entry); val = SCM_CDR(entry); if (!CHECK_K(key)) SWIG_exception(SWIG_TypeError, "map<" #K "," #T "," #C "> expected"); if (!CHECK_T(val)) { if (!scm_is_pair(val)) SWIG_exception(SWIG_TypeError,"alist expected"); val = SCM_CAR(val); if (!CHECK_T(val)) SWIG_exception(SWIG_TypeError, "map<" #K "," #T "," #C "> expected"); } (($1_type &)$1)[CONVERT_K_FROM(key)] = CONVERT_T_FROM(val); alist = SCM_CDR(alist); } } else { $1 = *(($&1_type) SWIG_MustGetPtr($input,$&1_descriptor,$argnum, 0)); } } %typemap(in) const map< K, T, C >& (std::map< K, T, C > temp), const map< K, T, C >* (std::map< K, T, C > temp) { if (scm_is_null($input)) { temp = std::map< K, T, C >(); $1 = &temp; } else if (scm_is_pair($input)) { temp = std::map< K, T, C >(); $1 = &temp; SCM alist = $input; while (!scm_is_null(alist)) { SCM entry, key, val; entry = SCM_CAR(alist); if (!scm_is_pair(entry)) SWIG_exception(SWIG_TypeError,"alist expected"); key = SCM_CAR(entry); val = SCM_CDR(entry); if (!CHECK_K(key)) SWIG_exception(SWIG_TypeError, "map<" #K "," #T "," #C "> expected"); if (!CHECK_T(val)) { if (!scm_is_pair(val)) SWIG_exception(SWIG_TypeError,"alist expected"); val = SCM_CAR(val); if (!CHECK_T(val)) SWIG_exception(SWIG_TypeError, "map<" #K "," #T "," #C "> expected"); } temp[CONVERT_K_FROM(key)] = CONVERT_T_FROM(val); alist = SCM_CDR(alist); } } else { $1 = ($1_ltype) SWIG_MustGetPtr($input,$1_descriptor,$argnum, 0); } } %typemap(out) map< K, T, C > { SCM alist = SCM_EOL; for (std::map< K, T, C >::reverse_iterator i=$1.rbegin(); i!=$1.rend(); ++i) { SCM k = CONVERT_K_TO(i->first); SCM x = CONVERT_T_TO(i->second); SCM entry = scm_cons(k,x); alist = scm_cons(entry,alist); } $result = alist; } %typecheck(SWIG_TYPECHECK_MAP) map< K, T, C > { // native sequence? if (scm_is_null($input)) { /* an empty sequence can be of any type */ $1 = 1; } else if (scm_is_pair($input)) { // check the first element only SCM head = SCM_CAR($input); if (scm_is_pair(head)) { SCM key = SCM_CAR(head); SCM val = SCM_CDR(head); if (!CHECK_K(key)) { $1 = 0; } else { if (CHECK_T(val)) { $1 = 1; } else if (scm_is_pair(val)) { val = SCM_CAR(val); if (CHECK_T(val)) $1 = 1; else $1 = 0; } else { $1 = 0; } } } else { $1 = 0; } } else { // wrapped map? std::map< K, T, C >* m; if (SWIG_ConvertPtr($input,(void **) &m, $&1_descriptor, 0) == 0) $1 = 1; else $1 = 0; } } %typecheck(SWIG_TYPECHECK_MAP) const map< K, T, C >&, const map< K, T, C >* { // native sequence? if (scm_is_null($input)) { /* an empty sequence can be of any type */ $1 = 1; } else if (scm_is_pair($input)) { // check the first element only SCM head = SCM_CAR($input); if (scm_is_pair(head)) { SCM key = SCM_CAR(head); SCM val = SCM_CDR(head); if (!CHECK_K(key)) { $1 = 0; } else { if (CHECK_T(val)) { $1 = 1; } else if (scm_is_pair(val)) { val = SCM_CAR(val); if (CHECK_T(val)) $1 = 1; else $1 = 0; } else { $1 = 0; } } } else { $1 = 0; } } else { // wrapped map? std::map< K, T, C >* m; if (SWIG_ConvertPtr($input,(void **) &m, $1_descriptor, 0) == 0) $1 = 1; else $1 = 0; } } %rename("length") size; %rename("null?") empty; %rename("clear!") clear; %rename("ref") __getitem__; %rename("set!") __setitem__; %rename("delete!") __delitem__; %rename("has-key?") has_key; public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef K key_type; typedef T mapped_type; typedef std::pair< const K, T > value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; map(); map(const map& other); unsigned int size() const; bool empty() const; void clear(); %extend { T __getitem__(K key) throw (std::out_of_range) { std::map< K, T, C >::iterator i = self->find(key); if (i != self->end()) return i->second; else throw std::out_of_range("key not found"); } void __setitem__(K key, T x) { (*self)[key] = x; } void __delitem__(K key) throw (std::out_of_range) { std::map< K, T, C >::iterator i = self->find(key); if (i != self->end()) self->erase(i); else throw std::out_of_range("key not found"); } bool has_key(K key) { std::map< K, T, C >::iterator i = self->find(key); return i != self->end(); } SCM keys() { SCM result = SCM_EOL; for (std::map< K, T, C >::reverse_iterator i=self->rbegin(); i!=self->rend(); ++i) { SCM k = CONVERT_K_TO(i->first); result = scm_cons(k,result); } return result; } } }; %enddef specialize_std_map_on_key(bool,scm_is_bool, scm_is_true,SWIG_bool2scm); specialize_std_map_on_key(int,scm_is_number, scm_to_long,scm_from_long); specialize_std_map_on_key(short,scm_is_number, scm_to_long,scm_from_long); specialize_std_map_on_key(long,scm_is_number, scm_to_long,scm_from_long); specialize_std_map_on_key(unsigned int,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_map_on_key(unsigned short,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_map_on_key(unsigned long,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_map_on_key(double,scm_is_number, scm_to_double,scm_from_double); specialize_std_map_on_key(float,scm_is_number, scm_to_double,scm_from_double); specialize_std_map_on_key(std::string,scm_is_string, SWIG_scm2string,SWIG_string2scm); specialize_std_map_on_value(bool,scm_is_bool, scm_is_true,SWIG_bool2scm); specialize_std_map_on_value(int,scm_is_number, scm_to_long,scm_from_long); specialize_std_map_on_value(short,scm_is_number, scm_to_long,scm_from_long); specialize_std_map_on_value(long,scm_is_number, scm_to_long,scm_from_long); specialize_std_map_on_value(unsigned int,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_map_on_value(unsigned short,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_map_on_value(unsigned long,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_map_on_value(double,scm_is_number, scm_to_double,scm_from_double); specialize_std_map_on_value(float,scm_is_number, scm_to_double,scm_from_double); specialize_std_map_on_value(std::string,scm_is_string, SWIG_scm2string,SWIG_string2scm); specialize_std_map_on_both(bool,scm_is_bool, scm_is_true,SWIG_bool2scm, bool,scm_is_bool, scm_is_true,SWIG_bool2scm); specialize_std_map_on_both(bool,scm_is_bool, scm_is_true,SWIG_bool2scm, int,scm_is_number, scm_to_long,scm_from_long); specialize_std_map_on_both(bool,scm_is_bool, scm_is_true,SWIG_bool2scm, short,scm_is_number, scm_to_long,scm_from_long); specialize_std_map_on_both(bool,scm_is_bool, scm_is_true,SWIG_bool2scm, long,scm_is_number, scm_to_long,scm_from_long); specialize_std_map_on_both(bool,scm_is_bool, scm_is_true,SWIG_bool2scm, unsigned int,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_map_on_both(bool,scm_is_bool, scm_is_true,SWIG_bool2scm, unsigned short,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_map_on_both(bool,scm_is_bool, scm_is_true,SWIG_bool2scm, unsigned long,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_map_on_both(bool,scm_is_bool, scm_is_true,SWIG_bool2scm, double,scm_is_number, scm_to_double,scm_from_double); specialize_std_map_on_both(bool,scm_is_bool, scm_is_true,SWIG_bool2scm, float,scm_is_number, scm_to_double,scm_from_double); specialize_std_map_on_both(bool,scm_is_bool, scm_is_true,SWIG_bool2scm, std::string,scm_is_string, SWIG_scm2string,SWIG_string2scm); specialize_std_map_on_both(int,scm_is_number, scm_to_long,scm_from_long, bool,scm_is_bool, scm_is_true,SWIG_bool2scm); specialize_std_map_on_both(int,scm_is_number, scm_to_long,scm_from_long, int,scm_is_number, scm_to_long,scm_from_long); specialize_std_map_on_both(int,scm_is_number, scm_to_long,scm_from_long, short,scm_is_number, scm_to_long,scm_from_long); specialize_std_map_on_both(int,scm_is_number, scm_to_long,scm_from_long, long,scm_is_number, scm_to_long,scm_from_long); specialize_std_map_on_both(int,scm_is_number, scm_to_long,scm_from_long, unsigned int,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_map_on_both(int,scm_is_number, scm_to_long,scm_from_long, unsigned short,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_map_on_both(int,scm_is_number, scm_to_long,scm_from_long, unsigned long,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_map_on_both(int,scm_is_number, scm_to_long,scm_from_long, double,scm_is_number, scm_to_double,scm_from_double); specialize_std_map_on_both(int,scm_is_number, scm_to_long,scm_from_long, float,scm_is_number, scm_to_double,scm_from_double); specialize_std_map_on_both(int,scm_is_number, scm_to_long,scm_from_long, std::string,scm_is_string, SWIG_scm2string,SWIG_string2scm); specialize_std_map_on_both(short,scm_is_number, scm_to_long,scm_from_long, bool,scm_is_bool, scm_is_true,SWIG_bool2scm); specialize_std_map_on_both(short,scm_is_number, scm_to_long,scm_from_long, int,scm_is_number, scm_to_long,scm_from_long); specialize_std_map_on_both(short,scm_is_number, scm_to_long,scm_from_long, short,scm_is_number, scm_to_long,scm_from_long); specialize_std_map_on_both(short,scm_is_number, scm_to_long,scm_from_long, long,scm_is_number, scm_to_long,scm_from_long); specialize_std_map_on_both(short,scm_is_number, scm_to_long,scm_from_long, unsigned int,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_map_on_both(short,scm_is_number, scm_to_long,scm_from_long, unsigned short,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_map_on_both(short,scm_is_number, scm_to_long,scm_from_long, unsigned long,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_map_on_both(short,scm_is_number, scm_to_long,scm_from_long, double,scm_is_number, scm_to_double,scm_from_double); specialize_std_map_on_both(short,scm_is_number, scm_to_long,scm_from_long, float,scm_is_number, scm_to_double,scm_from_double); specialize_std_map_on_both(short,scm_is_number, scm_to_long,scm_from_long, std::string,scm_is_string, SWIG_scm2string,SWIG_string2scm); specialize_std_map_on_both(long,scm_is_number, scm_to_long,scm_from_long, bool,scm_is_bool, scm_is_true,SWIG_bool2scm); specialize_std_map_on_both(long,scm_is_number, scm_to_long,scm_from_long, int,scm_is_number, scm_to_long,scm_from_long); specialize_std_map_on_both(long,scm_is_number, scm_to_long,scm_from_long, short,scm_is_number, scm_to_long,scm_from_long); specialize_std_map_on_both(long,scm_is_number, scm_to_long,scm_from_long, long,scm_is_number, scm_to_long,scm_from_long); specialize_std_map_on_both(long,scm_is_number, scm_to_long,scm_from_long, unsigned int,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_map_on_both(long,scm_is_number, scm_to_long,scm_from_long, unsigned short,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_map_on_both(long,scm_is_number, scm_to_long,scm_from_long, unsigned long,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_map_on_both(long,scm_is_number, scm_to_long,scm_from_long, double,scm_is_number, scm_to_double,scm_from_double); specialize_std_map_on_both(long,scm_is_number, scm_to_long,scm_from_long, float,scm_is_number, scm_to_double,scm_from_double); specialize_std_map_on_both(long,scm_is_number, scm_to_long,scm_from_long, std::string,scm_is_string, SWIG_scm2string,SWIG_string2scm); specialize_std_map_on_both(unsigned int,scm_is_number, scm_to_ulong,scm_from_ulong, bool,scm_is_bool, scm_is_true,SWIG_bool2scm); specialize_std_map_on_both(unsigned int,scm_is_number, scm_to_ulong,scm_from_ulong, int,scm_is_number, scm_to_long,scm_from_long); specialize_std_map_on_both(unsigned int,scm_is_number, scm_to_ulong,scm_from_ulong, short,scm_is_number, scm_to_long,scm_from_long); specialize_std_map_on_both(unsigned int,scm_is_number, scm_to_ulong,scm_from_ulong, long,scm_is_number, scm_to_long,scm_from_long); specialize_std_map_on_both(unsigned int,scm_is_number, scm_to_ulong,scm_from_ulong, unsigned int,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_map_on_both(unsigned int,scm_is_number, scm_to_ulong,scm_from_ulong, unsigned short,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_map_on_both(unsigned int,scm_is_number, scm_to_ulong,scm_from_ulong, unsigned long,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_map_on_both(unsigned int,scm_is_number, scm_to_ulong,scm_from_ulong, double,scm_is_number, scm_to_double,scm_from_double); specialize_std_map_on_both(unsigned int,scm_is_number, scm_to_ulong,scm_from_ulong, float,scm_is_number, scm_to_double,scm_from_double); specialize_std_map_on_both(unsigned int,scm_is_number, scm_to_ulong,scm_from_ulong, std::string,scm_is_string, SWIG_scm2string,SWIG_string2scm); specialize_std_map_on_both(unsigned short,scm_is_number, scm_to_ulong,scm_from_ulong, bool,scm_is_bool, scm_is_true,SWIG_bool2scm); specialize_std_map_on_both(unsigned short,scm_is_number, scm_to_ulong,scm_from_ulong, int,scm_is_number, scm_to_long,scm_from_long); specialize_std_map_on_both(unsigned short,scm_is_number, scm_to_ulong,scm_from_ulong, short,scm_is_number, scm_to_long,scm_from_long); specialize_std_map_on_both(unsigned short,scm_is_number, scm_to_ulong,scm_from_ulong, long,scm_is_number, scm_to_long,scm_from_long); specialize_std_map_on_both(unsigned short,scm_is_number, scm_to_ulong,scm_from_ulong, unsigned int,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_map_on_both(unsigned short,scm_is_number, scm_to_ulong,scm_from_ulong, unsigned short,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_map_on_both(unsigned short,scm_is_number, scm_to_ulong,scm_from_ulong, unsigned long,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_map_on_both(unsigned short,scm_is_number, scm_to_ulong,scm_from_ulong, double,scm_is_number, scm_to_double,scm_from_double); specialize_std_map_on_both(unsigned short,scm_is_number, scm_to_ulong,scm_from_ulong, float,scm_is_number, scm_to_double,scm_from_double); specialize_std_map_on_both(unsigned short,scm_is_number, scm_to_ulong,scm_from_ulong, std::string,scm_is_string, SWIG_scm2string,SWIG_string2scm); specialize_std_map_on_both(unsigned long,scm_is_number, scm_to_ulong,scm_from_ulong, bool,scm_is_bool, scm_is_true,SWIG_bool2scm); specialize_std_map_on_both(unsigned long,scm_is_number, scm_to_ulong,scm_from_ulong, int,scm_is_number, scm_to_long,scm_from_long); specialize_std_map_on_both(unsigned long,scm_is_number, scm_to_ulong,scm_from_ulong, short,scm_is_number, scm_to_long,scm_from_long); specialize_std_map_on_both(unsigned long,scm_is_number, scm_to_ulong,scm_from_ulong, long,scm_is_number, scm_to_long,scm_from_long); specialize_std_map_on_both(unsigned long,scm_is_number, scm_to_ulong,scm_from_ulong, unsigned int,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_map_on_both(unsigned long,scm_is_number, scm_to_ulong,scm_from_ulong, unsigned short,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_map_on_both(unsigned long,scm_is_number, scm_to_ulong,scm_from_ulong, unsigned long,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_map_on_both(unsigned long,scm_is_number, scm_to_ulong,scm_from_ulong, double,scm_is_number, scm_to_double,scm_from_double); specialize_std_map_on_both(unsigned long,scm_is_number, scm_to_ulong,scm_from_ulong, float,scm_is_number, scm_to_double,scm_from_double); specialize_std_map_on_both(unsigned long,scm_is_number, scm_to_ulong,scm_from_ulong, std::string,scm_is_string, SWIG_scm2string,SWIG_string2scm); specialize_std_map_on_both(double,scm_is_number, scm_to_double,scm_from_double, bool,scm_is_bool, scm_is_true,SWIG_bool2scm); specialize_std_map_on_both(double,scm_is_number, scm_to_double,scm_from_double, int,scm_is_number, scm_to_long,scm_from_long); specialize_std_map_on_both(double,scm_is_number, scm_to_double,scm_from_double, short,scm_is_number, scm_to_long,scm_from_long); specialize_std_map_on_both(double,scm_is_number, scm_to_double,scm_from_double, long,scm_is_number, scm_to_long,scm_from_long); specialize_std_map_on_both(double,scm_is_number, scm_to_double,scm_from_double, unsigned int,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_map_on_both(double,scm_is_number, scm_to_double,scm_from_double, unsigned short,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_map_on_both(double,scm_is_number, scm_to_double,scm_from_double, unsigned long,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_map_on_both(double,scm_is_number, scm_to_double,scm_from_double, double,scm_is_number, scm_to_double,scm_from_double); specialize_std_map_on_both(double,scm_is_number, scm_to_double,scm_from_double, float,scm_is_number, scm_to_double,scm_from_double); specialize_std_map_on_both(double,scm_is_number, scm_to_double,scm_from_double, std::string,scm_is_string, SWIG_scm2string,SWIG_string2scm); specialize_std_map_on_both(float,scm_is_number, scm_to_double,scm_from_double, bool,scm_is_bool, scm_is_true,SWIG_bool2scm); specialize_std_map_on_both(float,scm_is_number, scm_to_double,scm_from_double, int,scm_is_number, scm_to_long,scm_from_long); specialize_std_map_on_both(float,scm_is_number, scm_to_double,scm_from_double, short,scm_is_number, scm_to_long,scm_from_long); specialize_std_map_on_both(float,scm_is_number, scm_to_double,scm_from_double, long,scm_is_number, scm_to_long,scm_from_long); specialize_std_map_on_both(float,scm_is_number, scm_to_double,scm_from_double, unsigned int,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_map_on_both(float,scm_is_number, scm_to_double,scm_from_double, unsigned short,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_map_on_both(float,scm_is_number, scm_to_double,scm_from_double, unsigned long,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_map_on_both(float,scm_is_number, scm_to_double,scm_from_double, double,scm_is_number, scm_to_double,scm_from_double); specialize_std_map_on_both(float,scm_is_number, scm_to_double,scm_from_double, float,scm_is_number, scm_to_double,scm_from_double); specialize_std_map_on_both(float,scm_is_number, scm_to_double,scm_from_double, std::string,scm_is_string, SWIG_scm2string,SWIG_string2scm); specialize_std_map_on_both(std::string,scm_is_string, SWIG_scm2string,SWIG_string2scm, bool,scm_is_bool, scm_is_true,SWIG_bool2scm); specialize_std_map_on_both(std::string,scm_is_string, SWIG_scm2string,SWIG_string2scm, int,scm_is_number, scm_to_long,scm_from_long); specialize_std_map_on_both(std::string,scm_is_string, SWIG_scm2string,SWIG_string2scm, short,scm_is_number, scm_to_long,scm_from_long); specialize_std_map_on_both(std::string,scm_is_string, SWIG_scm2string,SWIG_string2scm, long,scm_is_number, scm_to_long,scm_from_long); specialize_std_map_on_both(std::string,scm_is_string, SWIG_scm2string,SWIG_string2scm, unsigned int,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_map_on_both(std::string,scm_is_string, SWIG_scm2string,SWIG_string2scm, unsigned short,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_map_on_both(std::string,scm_is_string, SWIG_scm2string,SWIG_string2scm, unsigned long,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_map_on_both(std::string,scm_is_string, SWIG_scm2string,SWIG_string2scm, double,scm_is_number, scm_to_double,scm_from_double); specialize_std_map_on_both(std::string,scm_is_string, SWIG_scm2string,SWIG_string2scm, float,scm_is_number, scm_to_double,scm_from_double); specialize_std_map_on_both(std::string,scm_is_string, SWIG_scm2string,SWIG_string2scm, std::string,scm_is_string, SWIG_scm2string,SWIG_string2scm); } swig-4.0.1/Lib/guile/interpreter.i0000644000175000017500000000261513527063513016704 0ustar williamwilliam/* ----------------------------------------------------------------------------- * interpreter.i * * SWIG file for a simple Guile interpreter * ----------------------------------------------------------------------------- */ %{ #include GSCM_status guile_init(); int main(int argc, char **argv) { GSCM_status status; GSCM_top_level toplev; char *eval_answer; char input_str[16384]; int done; /* start a scheme interpreter */ status = gscm_run_scm(argc, argv, 0, stdout, stderr, guile_init, 0, "#t"); if (status != GSCM_OK) { fputs(gscm_error_msg(status), stderr); fputc('\n', stderr); printf("Error in startup.\n"); exit(1); } /* create the top level environment */ status = gscm_create_top_level(&toplev); if (status != GSCM_OK) { fputs(gscm_error_msg(status), stderr); fputc('\n', stderr); exit(1); } /* now sit in a scheme eval loop: I input the expressions, have guile * evaluate them, and then get another expression. */ done = 0; fprintf(stdout,"Guile > "); while (!done) { if (fgets(input_str,16384,stdin) == NULL) { exit(1); } else { if (strncmp(input_str,"quit",4) == 0) exit(1); status = gscm_eval_str(&eval_answer, toplev, input_str); fprintf(stdout,"%s\n", eval_answer); fprintf(stdout,"Guile > "); } } /* now clean up and quit */ gscm_destroy_top_level(toplev); } %} swig-4.0.1/Lib/director_common.swg0000644000175000017500000000100013527063513016752 0ustar williamwilliam/* ----------------------------------------------------------------------------- * director_common.swg * * This file contains support for director classes which is common between * languages. * ----------------------------------------------------------------------------- */ /* Use -DSWIG_DIRECTOR_STATIC if you prefer to avoid the use of the 'Swig' namespace. This could be useful for multi-modules projects. */ #ifdef SWIG_DIRECTOR_STATIC /* Force anonymous (static) namespace */ #define Swig #endif swig-4.0.1/Lib/swigfragments.swg0000644000175000017500000000402013527063513016454 0ustar williamwilliam/* ----------------------------------------------------------------------------- * swigfragments.swg * * Common fragments * ----------------------------------------------------------------------------- */ /* ----------------------------------------------------------------------------- * Fragments for C header files * ----------------------------------------------------------------------------- */ %fragment("", "header") %{ #include %} /* Default compiler options for gcc allow long_long but not LLONG_MAX. * Define SWIG_NO_LLONG_MAX if this added limits support is not wanted. */ %fragment("", "header") %{ #include #if !defined(SWIG_NO_LLONG_MAX) # if !defined(LLONG_MAX) && defined(__GNUC__) && defined (__LONG_LONG_MAX__) # define LLONG_MAX __LONG_LONG_MAX__ # define LLONG_MIN (-LLONG_MAX - 1LL) # define ULLONG_MAX (LLONG_MAX * 2ULL + 1ULL) # endif #endif %} %fragment("", "header") %{ #include %} %fragment("", "header") %{ #include %} %fragment("", "header") %{ #include #if (defined(_MSC_VER) && (_MSC_VER < 1900)) || defined(__BORLANDC__) || defined(_WATCOM) # ifndef snprintf # define snprintf _snprintf # endif #endif %} %fragment("", "header") %{ #include #ifdef _MSC_VER # ifndef strtoull # define strtoull _strtoui64 # endif # ifndef strtoll # define strtoll _strtoi64 # endif #endif %} %fragment("", "header") %{ #include #include #ifndef WCHAR_MIN # define WCHAR_MIN 0 #endif #ifndef WCHAR_MAX # define WCHAR_MAX 65535 #endif %} /* ----------------------------------------------------------------------------- * Fragments for C++ header files * ----------------------------------------------------------------------------- */ %fragment("", "header") %{ #include %} %fragment("", "header") %{ #include %} %fragment("", "header") %{ #include %} %fragment("", "header") %{ #include %} swig-4.0.1/Lib/swigrun.i0000644000175000017500000000040013527063513014720 0ustar williamwilliam/* ----------------------------------------------------------------------------- * swigrun.i * * Empty module (for now). Placeholder for runtime libs * ----------------------------------------------------------------------------- */ %module swigrun swig-4.0.1/Lib/shared_ptr.i0000644000175000017500000000505613527063513015371 0ustar williamwilliam// This is a helper file for shared_ptr and should not be included directly. // The main implementation detail in using this smart pointer of a type is to customise the code generated // to use a pointer to the smart pointer of the type, rather than the usual pointer to the underlying type. // So for some type T, shared_ptr * is used rather than T *. // Another key part of the implementation is the smartptr feature: // %feature("smartptr") T { shared_ptr } // This feature marks the class T as having a smartptr to it (the shared_ptr type). This is then used to // support smart pointers and inheritance. Say class D derives from base B, then shared_ptr is marked // with a fake inheritance from shared_ptr in the type system if the "smartptr" feature is used on both // B and D. This is to emulate the conversion of shared_ptr to shared_ptr in the target language. // shared_ptr namespaces could be boost or std or std::tr1 // For example for std::tr1, use: // #define SWIG_SHARED_PTR_NAMESPACE std // #define SWIG_SHARED_PTR_SUBNAMESPACE tr1 #if !defined(SWIG_SHARED_PTR_NAMESPACE) # define SWIG_SHARED_PTR_NAMESPACE boost #endif #if defined(SWIG_SHARED_PTR_SUBNAMESPACE) # define SWIG_SHARED_PTR_QNAMESPACE SWIG_SHARED_PTR_NAMESPACE::SWIG_SHARED_PTR_SUBNAMESPACE #else # define SWIG_SHARED_PTR_QNAMESPACE SWIG_SHARED_PTR_NAMESPACE #endif namespace SWIG_SHARED_PTR_NAMESPACE { #if defined(SWIG_SHARED_PTR_SUBNAMESPACE) namespace SWIG_SHARED_PTR_SUBNAMESPACE { #endif template class shared_ptr { }; #if defined(SWIG_SHARED_PTR_SUBNAMESPACE) } #endif } %fragment("SWIG_null_deleter", "header") { struct SWIG_null_deleter { void operator() (void const *) const { } }; %#define SWIG_NO_NULL_DELETER_0 , SWIG_null_deleter() %#define SWIG_NO_NULL_DELETER_1 %#define SWIG_NO_NULL_DELETER_SWIG_POINTER_NEW %#define SWIG_NO_NULL_DELETER_SWIG_POINTER_OWN } // Main user macro for defining shared_ptr typemaps for both const and non-const pointer types %define %shared_ptr(TYPE...) %feature("smartptr", noblock=1) TYPE { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > } SWIG_SHARED_PTR_TYPEMAPS(, TYPE) SWIG_SHARED_PTR_TYPEMAPS(const, TYPE) %enddef // Legacy macros %define SWIG_SHARED_PTR(PROXYCLASS, TYPE...) #warning "SWIG_SHARED_PTR(PROXYCLASS, TYPE) is deprecated. Please use %shared_ptr(TYPE) instead." %shared_ptr(TYPE) %enddef %define SWIG_SHARED_PTR_DERIVED(PROXYCLASS, BASECLASSTYPE, TYPE...) #warning "SWIG_SHARED_PTR_DERIVED(PROXYCLASS, BASECLASSTYPE, TYPE) is deprecated. Please use %shared_ptr(TYPE) instead." %shared_ptr(TYPE) %enddef swig-4.0.1/Lib/swig.swg0000644000175000017500000006046413527063513014563 0ustar williamwilliam/* ----------------------------------------------------------------------------- * swig.swg * * Common macro definitions for various SWIG directives. This file is always * included at the top of each input file. * ----------------------------------------------------------------------------- */ /* ----------------------------------------------------------------------------- * User Directives * ----------------------------------------------------------------------------- */ /* Deprecated SWIG-1.1 directives */ #define %disabledoc %warn "104:%disabledoc is deprecated" #define %enabledoc %warn "105:%enabledoc is deprecated" #define %doconly %warn "106:%doconly is deprecated" #define %style %warn "107:%style is deprecated" /##/ #define %localstyle %warn "108:%localstyle is deprecated" /##/ #define %title %warn "109:%title is deprecated" /##/ #define %section %warn "110:%section is deprecated" /##/ #define %subsection %warn "111:%subsection is deprecated" /##/ #define %subsubsection %warn "112:%subsubsection is deprecated" /##/ #define %new %warn "117:%new is deprecated. Use %newobject" #define %text %insert("null") /* Code insertion directives such as %wrapper %{ ... %} */ #define %begin %insert("begin") #define %runtime %insert("runtime") #define %header %insert("header") #define %wrapper %insert("wrapper") #define %init %insert("init") /* Class extension */ #define %addmethods %warn "113:%addmethods is now %extend" %extend /* %ignore directive */ #define %ignore %rename($ignore) #define %ignorewarn(x) %rename("$ignore:" x) /* Access control directives */ #define %readonly %warn "114:%readonly is deprecated. Use %immutable; " %feature("immutable"); #define %readwrite %warn "115:%readwrite is deprecated. Use %mutable; " %feature("immutable",""); #define %immutable %feature("immutable") #define %noimmutable %feature("immutable","0") #define %clearimmutable %feature("immutable","") #define %mutable %clearimmutable /* Generation of default constructors/destructors (old form, don't use) */ #define %nodefault %feature("nodefault","1") #define %default %feature("nodefault","0") #define %clearnodefault %feature("nodefault","") #define %makedefault %clearnodefault /* Disable the generation of implicit default constructor */ #define %nodefaultctor %feature("nodefaultctor","1") #define %defaultctor %feature("nodefaultctor","0") #define %clearnodefaultctor %feature("nodefaultctor","") /* Disable the generation of implicit default destructor (dangerous) */ #define %nodefaultdtor %feature("nodefaultdtor","1") #define %defaultdtor %feature("nodefaultdtor","0") #define %clearnodefaultdtor %feature("nodefaultdtor","") /* Enable the generation of copy constructor */ #define %copyctor %feature("copyctor","1") #define %nocopyctor %feature("copyctor","0") #define %clearcopyctor %feature("copyctor","") /* Force the old nodefault behavior, ie disable both constructor and destructor */ #define %oldnodefault %feature("oldnodefault","1") #define %nooldnodefault %feature("oldnodefault","0") #define %clearoldnodefault %feature("oldnodefault","") /* the %exception directive */ #if defined(SWIGCSHARP) || defined(SWIGD) #define %exception %feature("except", canthrow=1) #else #define %exception %feature("except") #endif #define %noexception %feature("except","0") #define %clearexception %feature("except","") /* the %allowexception directive allows the %exception feature to be applied to set/get variable methods */ #define %allowexception %feature("allowexcept") #define %noallowexception %feature("allowexcept","0") #define %clearallowexception %feature("allowexcept","") /* the %exceptionvar directive, as %exception but it is only applied to set/get variable methods. You don't need to use the %allowexception directive when using %exceptionvar. */ #if defined(SWIGCSHARP) || defined(SWIGD) #define %exceptionvar %feature("exceptvar", canthrow=1) #else #define %exceptionvar %feature("exceptvar") #endif #define %noexceptionvar %feature("exceptvar","0") #define %clearexceptionvar %feature("exceptvar","") /* the %catches directive */ #define %catches(tlist...) %feature("catches","("`tlist`")") #define %clearcatches %feature("catches","") /* the %exceptionclass directive */ #define %exceptionclass %feature("exceptionclass") #define %noexceptionclass %feature("exceptionclass","0") #define %clearexceptionclass %feature("exceptionclass","") /* the %newobject directive */ #define %newobject %feature("new") #define %nonewobject %feature("new","0") #define %clearnewobject %feature("new","") /* the %delobject directive */ #define %delobject %feature("del") #define %nodelobject %feature("del","0") #define %cleardelobject %feature("del","") /* the %refobject/%unrefobject directives */ #define %refobject %feature("ref") #define %norefobject %feature("ref","0") #define %clearrefobject %feature("ref","") #define %unrefobject %feature("unref") #define %nounrefobject %feature("unref","0") #define %clearunrefobject %feature("unref","") /* Directives for callback functions (experimental) */ #define %callback(x) %feature("callback",`x`) #define %nocallback %feature("callback","0") #define %clearcallback %feature("callback","") /* the %nestedworkaround directive (deprecated) */ #define %nestedworkaround %feature("nestedworkaround") #define %nonestedworkaround %feature("nestedworkaround","0") #define %clearnestedworkaround %feature("nestedworkaround","") /* the %flatnested directive */ #define %flatnested %feature("flatnested") #define %noflatnested %feature("flatnested","0") #define %clearflatnested %feature("flatnested","") /* the %fastdispatch directive */ #define %fastdispatch %feature("fastdispatch") #define %nofastdispatch %feature("fastdispatch","0") #define %clearfastdispatch %feature("fastdispatch","") /* directors directives */ #define %director %feature("director") #define %nodirector %feature("director","0") #define %cleardirector %feature("director","") /* naturalvar directives */ #define %naturalvar %feature("naturalvar") #define %nonaturalvar %feature("naturalvar","0") #define %clearnaturalvar %feature("naturalvar","") /* nspace directives */ #define %nspace %feature("nspace") #define %nonspace %feature("nspace","0") #define %clearnspace %feature("nspace","") /* valuewrapper directives */ #define %valuewrapper %feature("valuewrapper") #define %clearvaluewrapper %feature("valuewrapper","") #define %novaluewrapper %feature("novaluewrapper") #define %clearnovaluewrapper %feature("novaluewrapper","") /* Contract support - Experimental and undocumented */ #define %contract %feature("contract") #define %nocontract %feature("contract","0") #define %clearcontract %feature("contract","") /* Macro for setting a dynamic cast function */ %define DYNAMIC_CAST(mangle,func) %init %{ mangle->dcast = (swig_dycast_func) func; %} %enddef /* aggregation support */ /* This macro performs constant aggregation. Basically the idea of constant aggregation is that you can group a collection of constants together. For example, suppose you have some code like this: #define UP 1 #define DOWN 2 #define LEFT 3 #define RIGHT 4 Now, suppose you had a function like this: int move(int direction) In this case, you might want to restrict the direction argument to one of the supplied constant names. To do this, you could write some typemap code by hand. Alternatively, you can use the %aggregate_check macro defined here to create a simple check function for you. Here is an example: %aggregate_check(int, check_direction, UP, DOWN, LEFT, RIGHT); Now, using a typemap %typemap(check) int direction { if (!check_direction($1)) SWIG_exception(SWIG_ValueError,"Bad direction."); } or a contract (better) %contract move(int x) { require: check_direction(x); } */ %define %aggregate_check(TYPE, NAME, FIRST, ...) %wrapper %{ static int NAME(TYPE x) { static TYPE values[] = { FIRST, ##__VA_ARGS__ }; static int size = sizeof(values); int i,j; for (i = 0, j = 0; i < size; i+=sizeof(TYPE),j++) { if (x == values[j]) return 1; } return 0; } %} %enddef /* ----------------------------------------------------------------------------- * %rename predicates * ----------------------------------------------------------------------------- */ /* Predicates to be used with %rename, for example: - to rename all the functions: %rename("%(utitle)s", %$isfunction) ""; - to rename only the member methods: %rename("m_%(utitle)s", %$isfunction, %$ismember) ""; - to rename only the global functions: %rename("m_%(utitle)s", %$isfunction, %$not %$ismember) ""; or %rename("g_%(utitle)s", %$isfunction, %$isglobal) ""; - to ignore the enumitems in a given class: %rename("$ignore", %$isenumitem, %$classname="MyClass") ""; we use the prefix '%$' to avoid clashes with other swig macros/directives. */ %define %$not "not" %enddef %define %$isenum "match"="enum" %enddef %define %$isenumitem "match"="enumitem" %enddef %define %$isaccess "match"="access" %enddef %define %$isclass "match"="class","notmatch$template$templatetype"="class" %enddef %define %$isextend "match"="extend" %enddef %define %$isconstructor "match"="constructor" %enddef %define %$isdestructor "match"="destructor" %enddef %define %$isnamespace "match"="namespace" %enddef %define %$istemplate "match"="template" %enddef %define %$isconstant "match"="constant" %enddef /* %constant definition */ %define %$isunion "match$kind"="union" %enddef %define %$isfunction "match$kind"="function" %enddef %define %$isvariable "match$kind"="variable" %enddef %define %$isimmutable "match$feature:immutable"="1" %enddef %define %$hasconsttype "match$hasconsttype"="1" %enddef %define %$hasvalue "match$hasvalue"="1" %enddef %define %$isextension "match$isextension"="1" %enddef %define %$isstatic "match$storage"="static" %enddef %define %$isfriend "match$storage"="friend" %enddef %define %$istypedef "match$storage"="typedef" %enddef %define %$isvirtual "match$storage"="virtual" %enddef %define %$isexplicit "match$storage"="explicit" %enddef %define %$isextern "match$storage"="extern" %enddef %define %$ismember "match$ismember"="1" %enddef %define %$isglobal %$not %$ismember %enddef %define %$isextendmember "match$isextendmember"="1" %enddef %define %$innamespace "match$parentNode$nodeType"="namespace" %enddef %define %$ispublic "match$access"="public" %enddef %define %$isprotected "match$access"="protected" %enddef %define %$isprivate "match$access"="private" %enddef %define %$ismemberget "match$memberget"="1" %enddef %define %$ismemberset "match$memberset"="1" %enddef %define %$classname %$ismember,"match$parentNode$name" %enddef %define %$isnested "match$nested"="1" %enddef /* ----------------------------------------------------------------------------- * Common includes for warning labels, macros, fragments etc * ----------------------------------------------------------------------------- */ %include %include /* ----------------------------------------------------------------------------- * Overloading support * ----------------------------------------------------------------------------- */ /* * Function/method overloading support. This is done through typemaps, * but also involves a precedence level. */ /* Macro for overload resolution */ %define %typecheck(_x...) %typemap(typecheck, precedence=_x) %enddef /* Macros for precedence levels */ %define SWIG_TYPECHECK_POINTER 0 %enddef %define SWIG_TYPECHECK_ITERATOR 5 %enddef %define SWIG_TYPECHECK_VOIDPTR 10 %enddef %define SWIG_TYPECHECK_BOOL 15 %enddef %define SWIG_TYPECHECK_UINT8 20 %enddef %define SWIG_TYPECHECK_INT8 25 %enddef %define SWIG_TYPECHECK_UINT16 30 %enddef %define SWIG_TYPECHECK_INT16 35 %enddef %define SWIG_TYPECHECK_UINT32 40 %enddef %define SWIG_TYPECHECK_INT32 45 %enddef %define SWIG_TYPECHECK_SIZE 47 %enddef %define SWIG_TYPECHECK_PTRDIFF 48 %enddef %define SWIG_TYPECHECK_UINT64 50 %enddef %define SWIG_TYPECHECK_INT64 55 %enddef %define SWIG_TYPECHECK_UINT128 60 %enddef %define SWIG_TYPECHECK_INT128 65 %enddef %define SWIG_TYPECHECK_INTEGER 70 %enddef %define SWIG_TYPECHECK_FLOAT 80 %enddef %define SWIG_TYPECHECK_DOUBLE 90 %enddef %define SWIG_TYPECHECK_CPLXFLT 95 %enddef %define SWIG_TYPECHECK_CPLXDBL 100 %enddef %define SWIG_TYPECHECK_COMPLEX 105 %enddef %define SWIG_TYPECHECK_UNICHAR 110 %enddef %define SWIG_TYPECHECK_STDUNISTRING 115 %enddef %define SWIG_TYPECHECK_UNISTRING 120 %enddef %define SWIG_TYPECHECK_CHAR 130 %enddef %define SWIG_TYPECHECK_STDSTRING 135 %enddef %define SWIG_TYPECHECK_STRING 140 %enddef %define SWIG_TYPECHECK_PAIR 150 %enddef %define SWIG_TYPECHECK_STDARRAY 155 %enddef %define SWIG_TYPECHECK_VECTOR 160 %enddef %define SWIG_TYPECHECK_DEQUE 170 %enddef %define SWIG_TYPECHECK_LIST 180 %enddef %define SWIG_TYPECHECK_SET 190 %enddef %define SWIG_TYPECHECK_MULTISET 200 %enddef %define SWIG_TYPECHECK_MAP 210 %enddef %define SWIG_TYPECHECK_MULTIMAP 220 %enddef %define SWIG_TYPECHECK_STACK 230 %enddef %define SWIG_TYPECHECK_QUEUE 240 %enddef %define SWIG_TYPECHECK_BOOL_ARRAY 1015 %enddef %define SWIG_TYPECHECK_INT8_ARRAY 1025 %enddef %define SWIG_TYPECHECK_INT16_ARRAY 1035 %enddef %define SWIG_TYPECHECK_INT32_ARRAY 1045 %enddef %define SWIG_TYPECHECK_INT64_ARRAY 1055 %enddef %define SWIG_TYPECHECK_INT128_ARRAY 1065 %enddef %define SWIG_TYPECHECK_FLOAT_ARRAY 1080 %enddef %define SWIG_TYPECHECK_DOUBLE_ARRAY 1090 %enddef %define SWIG_TYPECHECK_CHAR_ARRAY 1130 %enddef %define SWIG_TYPECHECK_STRING_ARRAY 1140 %enddef %define SWIG_TYPECHECK_OBJECT_ARRAY 1150 %enddef %define SWIG_TYPECHECK_BOOL_PTR 2015 %enddef %define SWIG_TYPECHECK_UINT8_PTR 2020 %enddef %define SWIG_TYPECHECK_INT8_PTR 2025 %enddef %define SWIG_TYPECHECK_UINT16_PTR 2030 %enddef %define SWIG_TYPECHECK_INT16_PTR 2035 %enddef %define SWIG_TYPECHECK_UINT32_PTR 2040 %enddef %define SWIG_TYPECHECK_INT32_PTR 2045 %enddef %define SWIG_TYPECHECK_UINT64_PTR 2050 %enddef %define SWIG_TYPECHECK_INT64_PTR 2055 %enddef %define SWIG_TYPECHECK_FLOAT_PTR 2080 %enddef %define SWIG_TYPECHECK_DOUBLE_PTR 2090 %enddef %define SWIG_TYPECHECK_CHAR_PTR 2130 %enddef %define SWIG_TYPECHECK_SWIGOBJECT 5000 %enddef /* ----------------------------------------------------------------------------- * Default handling of certain overloaded operators * ----------------------------------------------------------------------------- */ #ifdef __cplusplus %ignoreoperator(NEW) operator new; %ignoreoperator(DELETE) operator delete; %ignoreoperator(NEWARR) operator new[]; %ignoreoperator(DELARR) operator delete[]; /* add C++ operator aliases */ %rename("operator &&") operator and; // `and' `&&' %rename("operator ||") operator or; // `or' `||' %rename("operator !") operator not; // `not' `!' %rename("operator &=") operator and_eq; // `and_eq' `&=' %rename("operator &") operator bitand; // `bitand' `&' %rename("operator |") operator bitor; // `bitor' `|' %rename("operator ~") operator compl; // `compl' `~' %rename("operator !=") operator not_eq; // `not_eq' `!=' %rename("operator |=") operator or_eq; // `or_eq' `|=' %rename("operator ^") operator xor; // `xor' `^' %rename("operator ^=") operator xor_eq; // `xor_eq' `^=' /* Smart pointer handling */ %rename(__deref__) *::operator->; %rename(__ref__) *::operator*(); %rename(__ref__) *::operator*() const; /* Define std namespace */ namespace std { /* Warn about std::initializer_list usage. The constructor/method where used should probably be ignored. See docs. */ template class initializer_list {}; %typemap(in, warning=SWIGWARN_TYPEMAP_INITIALIZER_LIST_MSG) initializer_list "" %typemap(typecheck, precedence=SWIG_TYPECHECK_POINTER) initializer_list "" } #endif /* ----------------------------------------------------------------------------- * Default char * and C array typemaps * ----------------------------------------------------------------------------- */ /* Set up the typemap for handling new return strings */ #ifdef __cplusplus %typemap(newfree) char * "delete [] $1;"; #else %typemap(newfree) char * "free($1);"; #endif /* Default typemap for handling char * members */ #ifdef __cplusplus %typemap(memberin) char * { delete [] $1; if ($input) { $1 = ($1_type) (new char[strlen((const char *)$input)+1]); strcpy((char *)$1, (const char *)$input); } else { $1 = 0; } } %typemap(memberin,warning=SWIGWARN_TYPEMAP_CHARLEAK_MSG) const char * { if ($input) { $1 = ($1_type) (new char[strlen((const char *)$input)+1]); strcpy((char *)$1, (const char *)$input); } else { $1 = 0; } } %typemap(globalin) char * { delete [] $1; if ($input) { $1 = ($1_type) (new char[strlen((const char *)$input)+1]); strcpy((char *)$1, (const char *)$input); } else { $1 = 0; } } %typemap(globalin,warning=SWIGWARN_TYPEMAP_CHARLEAK_MSG) const char * { if ($input) { $1 = ($1_type) (new char[strlen((const char *)$input)+1]); strcpy((char *)$1, (const char *)$input); } else { $1 = 0; } } #else %typemap(memberin) char * { free($1); if ($input) { $1 = ($1_type) malloc(strlen((const char *)$input)+1); strcpy((char *)$1, (const char *)$input); } else { $1 = 0; } } %typemap(memberin,warning=SWIGWARN_TYPEMAP_CHARLEAK_MSG) const char * { if ($input) { $1 = ($1_type) malloc(strlen((const char *)$input)+1); strcpy((char *)$1, (const char *)$input); } else { $1 = 0; } } %typemap(globalin) char * { free($1); if ($input) { $1 = ($1_type) malloc(strlen((const char *)$input)+1); strcpy((char *)$1, (const char *)$input); } else { $1 = 0; } } %typemap(globalin,warning=SWIGWARN_TYPEMAP_CHARLEAK_MSG) const char * { if ($input) { $1 = ($1_type) malloc(strlen((const char *)$input)+1); strcpy((char *)$1, (const char *)$input); } else { $1 = 0; } } #endif /* Character array handling */ %typemap(memberin) char [ANY] { if($input) { strncpy((char*)$1, (const char *)$input, $1_dim0-1); $1[$1_dim0-1] = 0; } else { $1[0] = 0; } } %typemap(globalin) char [ANY] { if($input) { strncpy((char*)$1, (const char *)$input, $1_dim0-1); $1[$1_dim0-1] = 0; } else { $1[0] = 0; } } %typemap(memberin) char [] { if ($input) strcpy((char *)$1, (const char *)$input); else $1[0] = 0; } %typemap(globalin) char [] { if ($input) strcpy((char *)$1, (const char *)$input); else $1[0] = 0; } /* memberin/globalin typemap for arrays. */ %typemap(memberin) SWIGTYPE [ANY] { size_t ii; $1_basetype *b = ($1_basetype *) $1; for (ii = 0; ii < (size_t)$1_size; ii++) b[ii] = *(($1_basetype *) $input + ii); } %typemap(globalin) SWIGTYPE [ANY] { size_t ii; $1_basetype *b = ($1_basetype *) $1; for (ii = 0; ii < (size_t)$1_size; ii++) b[ii] = *(($1_basetype *) $input + ii); } /* memberin/globalin typemap for double arrays. */ %typemap(memberin) SWIGTYPE [ANY][ANY] { $basetype (*inp)[$1_dim1] = ($basetype (*)[$1_dim1])($input); $basetype (*dest)[$1_dim1] = ($basetype (*)[$1_dim1])($1); size_t ii = 0; for (; ii < $1_dim0; ++ii) { $basetype *ip = inp[ii]; $basetype *dp = dest[ii]; size_t jj = 0; for (; jj < $1_dim1; ++jj) dp[jj] = ip[jj]; } } %typemap(globalin) SWIGTYPE [ANY][ANY] { $basetype (*inp)[$1_dim1] = ($basetype (*)[$1_dim1])($input); $basetype (*dest)[$1_dim1] = ($basetype (*)[$1_dim1])($1); size_t ii = 0; for (; ii < $1_dim0; ++ii) { $basetype *ip = inp[ii]; $basetype *dp = dest[ii]; size_t jj = 0; for (; jj < $1_dim1; ++jj) dp[jj] = ip[jj]; } } /* ----------------------------------------------------------------------------- * Runtime code * ----------------------------------------------------------------------------- */ /* The SwigValueWrapper class */ /* * This template wrapper is used to handle C++ objects that are passed or * returned by value. This is necessary to handle objects that define * no default-constructor (making it difficult for SWIG to properly declare * local variables). * * The wrapper is used as follows. First consider a function like this: * * Vector cross_product(Vector a, Vector b) * * Now, if Vector is defined as a C++ class with no default constructor, * code is generated as follows: * * Vector *wrap_cross_product(Vector *inarg1, Vector *inarg2) { * SwigValueWrapper arg1; * SwigValueWrapper arg2; * SwigValueWrapper result; * * arg1 = *inarg1; * arg2 = *inarg2; * ... * result = cross_product(arg1,arg2); * ... * return new Vector(result); * } * * In the wrappers, the template SwigValueWrapper simply provides a thin * layer around a Vector *. However, it does this in a way that allows * the object to be bound after the variable declaration (which is not possible * with the bare object when it lacks a default constructor). * * An observant reader will notice that the code after the variable declarations * is *identical* to the code used for classes that do define default constructors. * Thus, this neat trick allows us to fix this special case without having to * make massive changes to typemaps and other parts of the SWIG code generator. * * Note: this code is not included when SWIG runs in C-mode, when classes * define default constructors, or when pointers and references are used. * SWIG tries to avoid doing this except in very special circumstances. * * Note: This solution suffers from making a large number of copies * of the underlying object. However, this is needed in the interest of * safety and in order to cover all of the possible ways in which a value * might be assigned. For example: * * arg1 = *inarg1; // Assignment from a pointer * arg1 = Vector(1,2,3); // Assignment from a value * * The class offers a strong guarantee of exception safety. * With regards to the implementation, the private SwigMovePointer nested class is * a simple smart pointer with move semantics, much like std::auto_ptr. * * This wrapping technique was suggested by William Fulton and is henceforth * known as the "Fulton Transform" :-). */ #ifdef __cplusplus %insert("runtime") %{ #ifdef __cplusplus /* SwigValueWrapper is described in swig.swg */ template class SwigValueWrapper { struct SwigMovePointer { T *ptr; SwigMovePointer(T *p) : ptr(p) { } ~SwigMovePointer() { delete ptr; } SwigMovePointer& operator=(SwigMovePointer& rhs) { T* oldptr = ptr; ptr = 0; delete oldptr; ptr = rhs.ptr; rhs.ptr = 0; return *this; } } pointer; SwigValueWrapper& operator=(const SwigValueWrapper& rhs); SwigValueWrapper(const SwigValueWrapper& rhs); public: SwigValueWrapper() : pointer(0) { } SwigValueWrapper& operator=(const T& t) { SwigMovePointer tmp(new T(t)); pointer = tmp; return *this; } operator T&() const { return *pointer.ptr; } T *operator&() { return pointer.ptr; } };%} /* * SwigValueInit() is a generic initialisation solution as the following approach: * * T c_result = T(); * * doesn't compile for all types for example: * * unsigned int c_result = unsigned int(); */ %insert("runtime") %{ template T SwigValueInit() { return T(); } #endif %} #endif /* The swiglabels */ %insert("runtime") "swiglabels.swg" swig-4.0.1/Lib/std_except.i0000644000175000017500000000406313527063513015375 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_except.i * * SWIG library file with typemaps to handle and throw STD exceptions in a * language and STL independent way, i.e., the target language doesn't * require to support STL but only the 'exception.i' mechanism. * * These typemaps are used when methods are declared with an STD * exception specification, such as * * size_t at() const throw (std::out_of_range); * * The typemaps here are based on the language independent * 'exception.i' library. If that is working in your target language, * this file will work. * * If the target language doesn't implement a robust 'exception.i' * mechanism, or you prefer other ways to map the STD exceptions, write * a new std_except.i file in the target library directory. * ----------------------------------------------------------------------------- */ #if defined(SWIGJAVA) || defined(SWIGCSHARP) || defined(SWIGGUILE) || defined(SWIGUTL) || defined(SWIGD) || defined(SWIGOCAML) #error "This version of std_except.i should not be used" #endif %{ #include #include %} %include %define %std_exception_map(Exception, Code) %typemap(throws,noblock=1) Exception { SWIG_exception(Code, $1.what()); } %ignore Exception; struct Exception { }; %enddef namespace std { %std_exception_map(bad_cast, SWIG_TypeError); %std_exception_map(bad_exception, SWIG_SystemError); %std_exception_map(domain_error, SWIG_ValueError); %std_exception_map(exception, SWIG_SystemError); %std_exception_map(invalid_argument, SWIG_ValueError); %std_exception_map(length_error, SWIG_IndexError); %std_exception_map(logic_error, SWIG_RuntimeError); %std_exception_map(out_of_range, SWIG_IndexError); %std_exception_map(overflow_error, SWIG_OverflowError); %std_exception_map(range_error, SWIG_OverflowError); %std_exception_map(runtime_error, SWIG_RuntimeError); %std_exception_map(underflow_error, SWIG_OverflowError); } swig-4.0.1/Lib/swigwarn.swg0000644000175000017500000003517513527234052015452 0ustar williamwilliam/* SWIG warning codes - generated from swigwarn.h - do not edit */ %define SWIGWARN_NONE 0 %enddef /* -- Deprecated features -- */ %define SWIGWARN_DEPRECATED_EXTERN 101 %enddef %define SWIGWARN_DEPRECATED_VAL 102 %enddef %define SWIGWARN_DEPRECATED_OUT 103 %enddef %define SWIGWARN_DEPRECATED_DISABLEDOC 104 %enddef %define SWIGWARN_DEPRECATED_ENABLEDOC 105 %enddef %define SWIGWARN_DEPRECATED_DOCONLY 106 %enddef %define SWIGWARN_DEPRECATED_STYLE 107 %enddef %define SWIGWARN_DEPRECATED_LOCALSTYLE 108 %enddef %define SWIGWARN_DEPRECATED_TITLE 109 %enddef %define SWIGWARN_DEPRECATED_SECTION 110 %enddef %define SWIGWARN_DEPRECATED_SUBSECTION 111 %enddef %define SWIGWARN_DEPRECATED_SUBSUBSECTION 112 %enddef %define SWIGWARN_DEPRECATED_ADDMETHODS 113 %enddef %define SWIGWARN_DEPRECATED_READONLY 114 %enddef %define SWIGWARN_DEPRECATED_READWRITE 115 %enddef %define SWIGWARN_DEPRECATED_EXCEPT 116 %enddef %define SWIGWARN_DEPRECATED_NEW 117 %enddef %define SWIGWARN_DEPRECATED_EXCEPT_TM 118 %enddef %define SWIGWARN_DEPRECATED_IGNORE_TM 119 %enddef %define SWIGWARN_DEPRECATED_OPTC 120 %enddef %define SWIGWARN_DEPRECATED_NAME 121 %enddef %define SWIGWARN_DEPRECATED_NOEXTERN 122 %enddef %define SWIGWARN_DEPRECATED_NODEFAULT 123 %enddef %define SWIGWARN_DEPRECATED_TYPEMAP_LANG 124 %enddef %define SWIGWARN_DEPRECATED_INPUT_FILE 125 %enddef %define SWIGWARN_DEPRECATED_NESTED_WORKAROUND 126 %enddef /* -- Preprocessor -- */ %define SWIGWARN_PP_MISSING_FILE 201 %enddef %define SWIGWARN_PP_EVALUATION 202 %enddef %define SWIGWARN_PP_INCLUDEALL_IMPORTALL 203 %enddef %define SWIGWARN_PP_CPP_WARNING 204 %enddef %define SWIGWARN_PP_CPP_ERROR 205 %enddef %define SWIGWARN_PP_UNEXPECTED_TOKENS 206 %enddef /* -- C/C++ Parser -- */ %define SWIGWARN_PARSE_CLASS_KEYWORD 301 %enddef %define SWIGWARN_PARSE_REDEFINED 302 %enddef %define SWIGWARN_PARSE_EXTEND_UNDEF 303 %enddef %define SWIGWARN_PARSE_UNSUPPORTED_VALUE 304 %enddef %define SWIGWARN_PARSE_BAD_VALUE 305 %enddef %define SWIGWARN_PARSE_PRIVATE 306 %enddef %define SWIGWARN_PARSE_BAD_DEFAULT 307 %enddef %define SWIGWARN_PARSE_NAMESPACE_ALIAS 308 %enddef %define SWIGWARN_PARSE_PRIVATE_INHERIT 309 %enddef %define SWIGWARN_PARSE_TEMPLATE_REPEAT 310 %enddef %define SWIGWARN_PARSE_TEMPLATE_PARTIAL 311 %enddef %define SWIGWARN_PARSE_UNNAMED_NESTED_CLASS 312 %enddef %define SWIGWARN_PARSE_UNDEFINED_EXTERN 313 %enddef %define SWIGWARN_PARSE_KEYWORD 314 %enddef %define SWIGWARN_PARSE_USING_UNDEF 315 %enddef %define SWIGWARN_PARSE_MODULE_REPEAT 316 %enddef %define SWIGWARN_PARSE_TEMPLATE_SP_UNDEF 317 %enddef %define SWIGWARN_PARSE_TEMPLATE_AMBIG 318 %enddef %define SWIGWARN_PARSE_NO_ACCESS 319 %enddef %define SWIGWARN_PARSE_EXPLICIT_TEMPLATE 320 %enddef %define SWIGWARN_PARSE_BUILTIN_NAME 321 %enddef %define SWIGWARN_PARSE_REDUNDANT 322 %enddef %define SWIGWARN_PARSE_REC_INHERITANCE 323 %enddef %define SWIGWARN_PARSE_NESTED_TEMPLATE 324 %enddef %define SWIGWARN_PARSE_NAMED_NESTED_CLASS 325 %enddef %define SWIGWARN_PARSE_EXTEND_NAME 326 %enddef %define SWIGWARN_CPP11_LAMBDA 340 %enddef %define SWIGWARN_CPP11_ALIAS_DECLARATION 341 %enddef /* redundant now */ %define SWIGWARN_CPP11_ALIAS_TEMPLATE 342 %enddef /* redundant now */ %define SWIGWARN_CPP11_VARIADIC_TEMPLATE 343 %enddef %define SWIGWARN_IGNORE_OPERATOR_NEW 350 %enddef /* new */ %define SWIGWARN_IGNORE_OPERATOR_DELETE 351 %enddef /* delete */ %define SWIGWARN_IGNORE_OPERATOR_PLUS 352 %enddef /* + */ %define SWIGWARN_IGNORE_OPERATOR_MINUS 353 %enddef /* - */ %define SWIGWARN_IGNORE_OPERATOR_MUL 354 %enddef /* * */ %define SWIGWARN_IGNORE_OPERATOR_DIV 355 %enddef /* / */ %define SWIGWARN_IGNORE_OPERATOR_MOD 356 %enddef /* % */ %define SWIGWARN_IGNORE_OPERATOR_XOR 357 %enddef /* ^ */ %define SWIGWARN_IGNORE_OPERATOR_AND 358 %enddef /* & */ %define SWIGWARN_IGNORE_OPERATOR_OR 359 %enddef /* | */ %define SWIGWARN_IGNORE_OPERATOR_NOT 360 %enddef /* ~ */ %define SWIGWARN_IGNORE_OPERATOR_LNOT 361 %enddef /* ! */ %define SWIGWARN_IGNORE_OPERATOR_EQ 362 %enddef /* = */ %define SWIGWARN_IGNORE_OPERATOR_LT 363 %enddef /* < */ %define SWIGWARN_IGNORE_OPERATOR_GT 364 %enddef /* > */ %define SWIGWARN_IGNORE_OPERATOR_PLUSEQ 365 %enddef /* += */ %define SWIGWARN_IGNORE_OPERATOR_MINUSEQ 366 %enddef /* -= */ %define SWIGWARN_IGNORE_OPERATOR_MULEQ 367 %enddef /* *= */ %define SWIGWARN_IGNORE_OPERATOR_DIVEQ 368 %enddef /* /= */ %define SWIGWARN_IGNORE_OPERATOR_MODEQ 369 %enddef /* %= */ %define SWIGWARN_IGNORE_OPERATOR_XOREQ 370 %enddef /* ^= */ %define SWIGWARN_IGNORE_OPERATOR_ANDEQ 371 %enddef /* &= */ %define SWIGWARN_IGNORE_OPERATOR_OREQ 372 %enddef /* |= */ %define SWIGWARN_IGNORE_OPERATOR_LSHIFT 373 %enddef /* << */ %define SWIGWARN_IGNORE_OPERATOR_RSHIFT 374 %enddef /* >> */ %define SWIGWARN_IGNORE_OPERATOR_LSHIFTEQ 375 %enddef /* <<= */ %define SWIGWARN_IGNORE_OPERATOR_RSHIFTEQ 376 %enddef /* >>= */ %define SWIGWARN_IGNORE_OPERATOR_EQUALTO 377 %enddef /* == */ %define SWIGWARN_IGNORE_OPERATOR_NOTEQUAL 378 %enddef /* != */ %define SWIGWARN_IGNORE_OPERATOR_LTEQUAL 379 %enddef /* <= */ %define SWIGWARN_IGNORE_OPERATOR_GTEQUAL 380 %enddef /* >= */ %define SWIGWARN_IGNORE_OPERATOR_LAND 381 %enddef /* && */ %define SWIGWARN_IGNORE_OPERATOR_LOR 382 %enddef /* || */ %define SWIGWARN_IGNORE_OPERATOR_PLUSPLUS 383 %enddef /* ++ */ %define SWIGWARN_IGNORE_OPERATOR_MINUSMINUS 384 %enddef /* -- */ %define SWIGWARN_IGNORE_OPERATOR_COMMA 385 %enddef /* , */ %define SWIGWARN_IGNORE_OPERATOR_ARROWSTAR 386 %enddef /* ->* */ %define SWIGWARN_IGNORE_OPERATOR_ARROW 387 %enddef /* -> */ %define SWIGWARN_IGNORE_OPERATOR_CALL 388 %enddef /* () */ %define SWIGWARN_IGNORE_OPERATOR_INDEX 389 %enddef /* [] */ %define SWIGWARN_IGNORE_OPERATOR_UPLUS 390 %enddef /* + */ %define SWIGWARN_IGNORE_OPERATOR_UMINUS 391 %enddef /* - */ %define SWIGWARN_IGNORE_OPERATOR_UMUL 392 %enddef /* * */ %define SWIGWARN_IGNORE_OPERATOR_UAND 393 %enddef /* & */ %define SWIGWARN_IGNORE_OPERATOR_NEWARR 394 %enddef /* new [] */ %define SWIGWARN_IGNORE_OPERATOR_DELARR 395 %enddef /* delete [] */ %define SWIGWARN_IGNORE_OPERATOR_REF 396 %enddef /* operator *() */ /* 394-399 are reserved */ /* -- Type system and typemaps -- */ %define SWIGWARN_TYPE_UNDEFINED_CLASS 401 %enddef %define SWIGWARN_TYPE_INCOMPLETE 402 %enddef %define SWIGWARN_TYPE_ABSTRACT 403 %enddef %define SWIGWARN_TYPE_REDEFINED 404 %enddef %define SWIGWARN_TYPE_RVALUE_REF_QUALIFIER_IGNORED 405 %enddef %define SWIGWARN_TYPEMAP_SOURCETARGET 450 %enddef %define SWIGWARN_TYPEMAP_CHARLEAK 451 %enddef %define SWIGWARN_TYPEMAP_SWIGTYPE 452 %enddef %define SWIGWARN_TYPEMAP_APPLY_UNDEF 453 %enddef %define SWIGWARN_TYPEMAP_SWIGTYPELEAK 454 %enddef %define SWIGWARN_TYPEMAP_IN_UNDEF 460 %enddef %define SWIGWARN_TYPEMAP_OUT_UNDEF 461 %enddef %define SWIGWARN_TYPEMAP_VARIN_UNDEF 462 %enddef %define SWIGWARN_TYPEMAP_VAROUT_UNDEF 463 %enddef %define SWIGWARN_TYPEMAP_CONST_UNDEF 464 %enddef %define SWIGWARN_TYPEMAP_UNDEF 465 %enddef %define SWIGWARN_TYPEMAP_VAR_UNDEF 466 %enddef %define SWIGWARN_TYPEMAP_TYPECHECK 467 %enddef %define SWIGWARN_TYPEMAP_THROW 468 %enddef %define SWIGWARN_TYPEMAP_DIRECTORIN_UNDEF 469 %enddef %define SWIGWARN_TYPEMAP_THREAD_UNSAFE 470 %enddef /* mostly used in directorout typemaps */ %define SWIGWARN_TYPEMAP_DIRECTOROUT_UNDEF 471 %enddef %define SWIGWARN_TYPEMAP_TYPECHECK_UNDEF 472 %enddef %define SWIGWARN_TYPEMAP_DIRECTOROUT_PTR 473 %enddef %define SWIGWARN_TYPEMAP_OUT_OPTIMAL_IGNORED 474 %enddef %define SWIGWARN_TYPEMAP_OUT_OPTIMAL_MULTIPLE 475 %enddef %define SWIGWARN_TYPEMAP_INITIALIZER_LIST 476 %enddef %define SWIGWARN_TYPEMAP_DIRECTORTHROWS_UNDEF 477 %enddef /* -- Fragments -- */ %define SWIGWARN_FRAGMENT_NOT_FOUND 490 %enddef /* -- General code generation -- */ %define SWIGWARN_LANG_OVERLOAD_DECL 501 %enddef %define SWIGWARN_LANG_OVERLOAD_CONSTRUCT 502 %enddef %define SWIGWARN_LANG_IDENTIFIER 503 %enddef %define SWIGWARN_LANG_RETURN_TYPE 504 %enddef %define SWIGWARN_LANG_VARARGS 505 %enddef %define SWIGWARN_LANG_VARARGS_KEYWORD 506 %enddef %define SWIGWARN_LANG_NATIVE_UNIMPL 507 %enddef %define SWIGWARN_LANG_DEREF_SHADOW 508 %enddef %define SWIGWARN_LANG_OVERLOAD_SHADOW 509 %enddef %define SWIGWARN_LANG_FRIEND_IGNORE 510 %enddef %define SWIGWARN_LANG_OVERLOAD_KEYWORD 511 %enddef %define SWIGWARN_LANG_OVERLOAD_CONST 512 %enddef %define SWIGWARN_LANG_CLASS_UNNAMED 513 %enddef %define SWIGWARN_LANG_DIRECTOR_VDESTRUCT 514 %enddef %define SWIGWARN_LANG_DISCARD_CONST 515 %enddef %define SWIGWARN_LANG_OVERLOAD_IGNORED 516 %enddef %define SWIGWARN_LANG_DIRECTOR_ABSTRACT 517 %enddef %define SWIGWARN_LANG_PORTABILITY_FILENAME 518 %enddef %define SWIGWARN_LANG_TEMPLATE_METHOD_IGNORE 519 %enddef %define SWIGWARN_LANG_SMARTPTR_MISSING 520 %enddef %define SWIGWARN_LANG_ILLEGAL_DESTRUCTOR 521 %enddef %define SWIGWARN_LANG_EXTEND_CONSTRUCTOR 522 %enddef %define SWIGWARN_LANG_EXTEND_DESTRUCTOR 523 %enddef %define SWIGWARN_LANG_EXPERIMENTAL 524 %enddef %define SWIGWARN_LANG_DIRECTOR_FINAL 525 %enddef /* -- Doxygen comments -- */ %define SWIGWARN_DOXYGEN_UNKNOWN_COMMAND 560 %enddef %define SWIGWARN_DOXYGEN_UNEXPECTED_END_OF_COMMENT 561 %enddef %define SWIGWARN_DOXYGEN_COMMAND_EXPECTED 562 %enddef %define SWIGWARN_DOXYGEN_HTML_ERROR 563 %enddef %define SWIGWARN_DOXYGEN_COMMAND_ERROR 564 %enddef %define SWIGWARN_DOXYGEN_UNKNOWN_CHARACTER 565 %enddef %define SWIGWARN_DOXYGEN_UNEXPECTED_ITERATOR_VALUE 566 %enddef /* -- Reserved (600-799) -- */ /* -- Language module specific warnings (700 - 899) -- */ %define SWIGWARN_D_TYPEMAP_CTYPE_UNDEF 700 %enddef %define SWIGWARN_D_TYPEMAP_IMTYPE_UNDEF 701 %enddef %define SWIGWARN_D_TYPEMAP_DTYPE_UNDEF 702 %enddef %define SWIGWARN_D_MULTIPLE_INHERITANCE 703 %enddef %define SWIGWARN_D_TYPEMAP_CLASSMOD_UNDEF 704 %enddef %define SWIGWARN_D_TYPEMAP_DBODY_UNDEF 705 %enddef %define SWIGWARN_D_TYPEMAP_DOUT_UNDEF 706 %enddef %define SWIGWARN_D_TYPEMAP_DIN_UNDEF 707 %enddef %define SWIGWARN_D_TYPEMAP_DDIRECTORIN_UNDEF 708 %enddef %define SWIGWARN_D_TYPEMAP_DCONSTRUCTOR_UNDEF 709 %enddef %define SWIGWARN_D_EXCODE_MISSING 710 %enddef %define SWIGWARN_D_CANTHROW_MISSING 711 %enddef %define SWIGWARN_D_NO_DIRECTORCONNECT_ATTR 712 %enddef %define SWIGWARN_D_NAME_COLLISION 713 %enddef /* please leave 700-719 free for D */ %define SWIGWARN_SCILAB_TRUNCATED_NAME 720 %enddef /* please leave 720-739 free for Scilab */ %define SWIGWARN_PYTHON_INDENT_MISMATCH 740 %enddef /* please leave 740-759 free for Python */ %define SWIGWARN_RUBY_WRONG_NAME 801 %enddef %define SWIGWARN_RUBY_MULTIPLE_INHERITANCE 802 %enddef /* please leave 800-809 free for Ruby */ %define SWIGWARN_JAVA_TYPEMAP_JNI_UNDEF 810 %enddef %define SWIGWARN_JAVA_TYPEMAP_JTYPE_UNDEF 811 %enddef %define SWIGWARN_JAVA_TYPEMAP_JSTYPE_UNDEF 812 %enddef %define SWIGWARN_JAVA_MULTIPLE_INHERITANCE 813 %enddef %define SWIGWARN_JAVA_TYPEMAP_GETCPTR_UNDEF 814 %enddef %define SWIGWARN_JAVA_TYPEMAP_CLASSMOD_UNDEF 815 %enddef %define SWIGWARN_JAVA_TYPEMAP_JAVABODY_UNDEF 816 %enddef %define SWIGWARN_JAVA_TYPEMAP_JAVAOUT_UNDEF 817 %enddef %define SWIGWARN_JAVA_TYPEMAP_JAVAIN_UNDEF 818 %enddef %define SWIGWARN_JAVA_TYPEMAP_JAVADIRECTORIN_UNDEF 819 %enddef %define SWIGWARN_JAVA_TYPEMAP_JAVADIRECTOROUT_UNDEF 820 %enddef %define SWIGWARN_JAVA_TYPEMAP_INTERFACECODE_UNDEF 821 %enddef %define SWIGWARN_JAVA_COVARIANT_RET 822 %enddef %define SWIGWARN_JAVA_TYPEMAP_JAVACONSTRUCT_UNDEF 823 %enddef %define SWIGWARN_JAVA_TYPEMAP_DIRECTORIN_NODESC 824 %enddef %define SWIGWARN_JAVA_NO_DIRECTORCONNECT_ATTR 825 %enddef %define SWIGWARN_JAVA_NSPACE_WITHOUT_PACKAGE 826 %enddef /* please leave 810-829 free for Java */ %define SWIGWARN_CSHARP_TYPEMAP_CTYPE_UNDEF 830 %enddef %define SWIGWARN_CSHARP_TYPEMAP_CSTYPE_UNDEF 831 %enddef %define SWIGWARN_CSHARP_TYPEMAP_CSWTYPE_UNDEF 832 %enddef %define SWIGWARN_CSHARP_MULTIPLE_INHERITANCE 833 %enddef %define SWIGWARN_CSHARP_TYPEMAP_GETCPTR_UNDEF 834 %enddef %define SWIGWARN_CSHARP_TYPEMAP_CLASSMOD_UNDEF 835 %enddef %define SWIGWARN_CSHARP_TYPEMAP_CSBODY_UNDEF 836 %enddef %define SWIGWARN_CSHARP_TYPEMAP_CSOUT_UNDEF 837 %enddef %define SWIGWARN_CSHARP_TYPEMAP_CSIN_UNDEF 838 %enddef %define SWIGWARN_CSHARP_TYPEMAP_CSDIRECTORIN_UNDEF 839 %enddef %define SWIGWARN_CSHARP_TYPEMAP_CSDIRECTOROUT_UNDEF 840 %enddef %define SWIGWARN_CSHARP_TYPEMAP_INTERFACECODE_UNDEF 841 %enddef %define SWIGWARN_CSHARP_COVARIANT_RET 842 %enddef %define SWIGWARN_CSHARP_TYPEMAP_CSCONSTRUCT_UNDEF 843 %enddef %define SWIGWARN_CSHARP_EXCODE 844 %enddef %define SWIGWARN_CSHARP_CANTHROW 845 %enddef %define SWIGWARN_CSHARP_NO_DIRECTORCONNECT_ATTR 846 %enddef /* please leave 830-849 free for C# */ %define SWIGWARN_MODULA3_TYPEMAP_TYPE_UNDEF 850 %enddef %define SWIGWARN_MODULA3_TYPEMAP_GETCPTR_UNDEF 851 %enddef %define SWIGWARN_MODULA3_TYPEMAP_CLASSMOD_UNDEF 852 %enddef %define SWIGWARN_MODULA3_TYPEMAP_PTRCONSTMOD_UNDEF 853 %enddef %define SWIGWARN_MODULA3_TYPEMAP_MULTIPLE_RETURN 854 %enddef %define SWIGWARN_MODULA3_MULTIPLE_INHERITANCE 855 %enddef %define SWIGWARN_MODULA3_TYPECONSTRUCTOR_UNKNOWN 856 %enddef %define SWIGWARN_MODULA3_UNKNOWN_PRAGMA 857 %enddef %define SWIGWARN_MODULA3_BAD_ENUMERATION 858 %enddef %define SWIGWARN_MODULA3_DOUBLE_ID 859 %enddef %define SWIGWARN_MODULA3_BAD_IMPORT 860 %enddef /* please leave 850-869 free for Modula 3 */ %define SWIGWARN_PHP_MULTIPLE_INHERITANCE 870 %enddef %define SWIGWARN_PHP_UNKNOWN_PRAGMA 871 %enddef %define SWIGWARN_PHP_PUBLIC_BASE 872 %enddef /* please leave 870-889 free for PHP */ %define SWIGWARN_GO_NAME_CONFLICT 890 %enddef /* please leave 890-899 free for Go */ /* -- User defined warnings (900 - 999) -- */ swig-4.0.1/Lib/modula3/0000755000175000017500000000000013527063513014422 5ustar williamwilliamswig-4.0.1/Lib/modula3/modula3.swg0000644000175000017500000010601513527063513016513 0ustar williamwilliam/* ----------------------------------------------------------------------------- * modula3.swg * * Modula3 typemaps * ----------------------------------------------------------------------------- */ %include /* The ctype, m3rawtype and m3wraptype typemaps work together and so there should be one of each. * The ctype typemap contains the C type used in the signature of C wrappers for C++ functions. * The m3rawtype typemap contains the M3 type used in the raw interface. * The m3rawintype typemap contains the M3 type used as function argument. * The m3rawrettype typemap contains the M3 type used as return value. * The m3wraptype typemap contains the M3 type used in the M3 type wrapper classes and module class. */ /* Primitive types */ %typemap(ctype) bool, const bool & "bool" %typemap(ctype) char, const char & "char" %typemap(ctype) signed char, const signed char & "signed char" %typemap(ctype) unsigned char, const unsigned char & "unsigned short" %typemap(ctype) short, const short & "short" %typemap(ctype) unsigned short, const unsigned short & "unsigned short" %typemap(ctype) int, const int & "int" %typemap(ctype) unsigned int, const unsigned int & "unsigned int" %typemap(ctype) long, const long & "long" %typemap(ctype) unsigned long, const unsigned long & "unsigned long" %typemap(ctype) long long, const long long & "long long" %typemap(ctype) unsigned long long, const unsigned long long & "unsigned long long" %typemap(ctype) float, const float & "float" %typemap(ctype) double, const double & "double" %typemap(ctype) char * "char *" %typemap(ctype) void "void" %typemap(m3rawtype) bool, const bool & "BOOLEAN" %typemap(m3rawtype) char, const char & "C.char" %typemap(m3rawtype) signed char, const signed char & "C.signed_char" %typemap(m3rawtype) unsigned char, const unsigned char & "C.unsigned_char" %typemap(m3rawtype) short, const short & "C.short" %typemap(m3rawtype) unsigned short, const unsigned short & "C.unsigned_short" %typemap(m3rawtype) int, const int & "C.int" %typemap(m3rawtype) unsigned int, const unsigned int & "C.unsigned_int" %typemap(m3rawtype) long, const long & "C.long" %typemap(m3rawtype) unsigned long, const unsigned long & "C.unsigned_long" %typemap(m3rawtype) long long, const long long & "C.long_long" %typemap(m3rawtype) unsigned long long, const unsigned long long & "C.unsigned_long_long" %typemap(m3rawtype) float, const float & "C.float" %typemap(m3rawtype) double, const double & "C.double" %typemap(m3rawtype) long double, const long double & "C.long_double" %typemap(m3rawtype) char * "C.char_star" %typemap(m3rawtype) void "" %typemap(m3rawtype) FILE "Cstdio.FILE"; %typemap(m3rawtype) FILE * "Cstdio.FILE_star"; %typemap(m3rawintype) bool *, bool &, bool "BOOLEAN" %typemap(m3rawintype) char *, char &, char "C.char" %typemap(m3rawintype) signed char *, signed char &, signed char "C.signed_char" %typemap(m3rawintype) unsigned char *, unsigned char &, unsigned char "C.unsigned_char" %typemap(m3rawintype) short *, short &, short "C.short" %typemap(m3rawintype) unsigned short *, unsigned short &, unsigned short "C.unsigned_short" %typemap(m3rawintype) int *, int &, int "C.int" %typemap(m3rawintype) unsigned int *, unsigned int &, unsigned int "C.unsigned_int" %typemap(m3rawintype) long *, long &, long "C.long" %typemap(m3rawintype) unsigned long *, unsigned long &, unsigned long "C.unsigned_long" %typemap(m3rawintype) long long *, long long &, long long "C.long_long" %typemap(m3rawintype) unsigned long long *, unsigned long long &, unsigned long long "C.unsigned_long_long" %typemap(m3rawintype) float *, float &, float "C.float" %typemap(m3rawintype) double *, double &, double "C.double" %typemap(m3rawintype) long double *, long double &, long double "C.long_double" %typemap(m3rawintype) char * "C.char_star" %typemap(m3rawintype) void "" %typemap(m3rawintype) void * "ADDRESS" %typemap(m3rawintype) FILE "Cstdio.FILE"; %typemap(m3rawintype) FILE * "Cstdio.FILE_star"; %typemap(m3rawinmode) char *, void *, FILE * "" %typemap(m3rawrettype) bool, const bool & "BOOLEAN" %typemap(m3rawrettype) char, const char & "C.char" %typemap(m3rawrettype) signed char, const signed char & "C.signed_char" %typemap(m3rawrettype) unsigned char, const unsigned char & "C.unsigned_char" %typemap(m3rawrettype) short, const short & "C.short" %typemap(m3rawrettype) unsigned short, const unsigned short & "C.unsigned_short" %typemap(m3rawrettype) int, const int & "C.int" %typemap(m3rawrettype) unsigned int, const unsigned int & "C.unsigned_int" %typemap(m3rawrettype) long, const long & "C.long" %typemap(m3rawrettype) unsigned long, const unsigned long & "C.unsigned_long" %typemap(m3rawrettype) long long, const long long & "C.long_long" %typemap(m3rawrettype) unsigned long long, const unsigned long long & "C.unsigned_long_long" %typemap(m3rawrettype) float, const float & "C.float" %typemap(m3rawrettype) double, const double & "C.double" %typemap(m3rawrettype) long double, const long double & "C.long_double" %typemap(m3rawrettype) char * "C.char_star" %typemap(m3rawrettype) void "" %typemap(m3rawrettype) void * "ADDRESS" %typemap(m3rawrettype) FILE "Cstdio.FILE"; %typemap(m3rawrettype) FILE * "Cstdio.FILE_star"; %typemap("m3rawtype:import") char, const char &, signed char, const signed char &, unsigned char, const unsigned char &, short, const short &, unsigned short, const unsigned short &, int, const int &, unsigned int, const unsigned int &, long, const long &, unsigned long, const unsigned long &, long long, const long long &, unsigned long long, const unsigned long long &, float, const float &, double, const double &, long double, const long double &, char * "Ctypes AS C" %typemap("m3rawintype:import") char, const char &, signed char, const signed char &, unsigned char, const unsigned char &, short, const short &, unsigned short, const unsigned short &, int, const int &, unsigned int, const unsigned int &, long, const long &, unsigned long, const unsigned long &, long long, const long long &, unsigned long long, const unsigned long long &, float, const float &, double, const double &, long double, const long double &, char * "Ctypes AS C" %typemap("m3rawrettype:import") char, const char &, signed char, const signed char &, unsigned char, const unsigned char &, short, const short &, unsigned short, const unsigned short &, int, const int &, unsigned int, const unsigned int &, long, const long &, unsigned long, const unsigned long &, long long, const long long &, unsigned long long, const unsigned long long &, float, const float &, double, const double &, long double, const long double &, char * "Ctypes AS C" %typemap("m3rawtype:import") FILE, FILE * "Cstdio"; %typemap("m3rawintype:import") FILE, FILE * "Cstdio"; %typemap("m3rawrettype:import") FILE, FILE * "Cstdio"; %typemap(m3wraptype) bool, const bool & "BOOLEAN" %typemap(m3wraptype) char, const char & "CHAR" %typemap(m3wraptype) signed char, const signed char & "CHAR" %typemap(m3wraptype) unsigned char, const unsigned char & "CHAR" %typemap(m3wraptype) short, const short & "Integer16.T" %typemap(m3wraptype) unsigned short, const unsigned short & "Cardinal16.T" %typemap(m3wraptype) int, const int & "INTEGER" %typemap(m3wraptype) unsigned int, const unsigned int & "CARDINAL" %typemap(m3wraptype) long, const long & "Integer32.T" %typemap(m3wraptype) unsigned long, const unsigned long & "Cardinal32.T" %typemap(m3wraptype) long long, const long long & "Integer64.T" %typemap(m3wraptype) unsigned long long, const unsigned long long & "Cardinal64.T" %typemap(m3wraptype) float, const float & "REAL" %typemap(m3wraptype) double, const double & "LONGREAL" %typemap(m3wraptype) long double, const long double & "EXTENDED" %typemap(m3wraptype) char * "TEXT" %typemap(m3wraptype) void "" %typemap(m3wraptype) FILE "Cstdio.FILE"; %typemap(m3wraptype) FILE * "Cstdio.FILE_star"; %typemap(m3wrapintype) bool, const bool *, const bool & "BOOLEAN" %typemap(m3wrapintype) char, const char *, const char & "CHAR" %typemap(m3wrapintype) signed char, const signed char *, const signed char & "CHAR" %typemap(m3wrapintype) unsigned char, const unsigned char *, const unsigned char & "CHAR" %typemap(m3wrapintype) short, const short *, const short & "INTEGER" %typemap(m3wrapintype) unsigned short, const unsigned short *, const unsigned short & "CARDINAL" %typemap(m3wrapintype) int, const int *, const int & "INTEGER" %typemap(m3wrapintype) unsigned int, const unsigned int *, const unsigned int & "CARDINAL" %typemap(m3wrapintype) long, const long *, const long & "INTEGER" %typemap(m3wrapintype) unsigned long, const unsigned long *, const unsigned long & "CARDINAL" %typemap(m3wrapintype) long long, const long long *, const long long & "INTEGER" %typemap(m3wrapintype) unsigned long long, const unsigned long long *, const unsigned long long & "CARDINAL" %typemap(m3wrapintype) float, const float *, const float & "REAL" %typemap(m3wrapintype) double, const double *, const double & "LONGREAL" %typemap(m3wrapintype) long double, const long double *, const long double & "EXTENDED" %typemap(m3wrapintype) const char *, const char [] "TEXT" %typemap(m3wrapintype,numinputs=0) void "" %typemap(m3wrapintype) FILE "Cstdio.FILE"; %typemap(m3wrapintype) FILE * "Cstdio.FILE_star"; %typemap(m3wrapouttype) bool, bool *, bool & "BOOLEAN" %typemap(m3wrapouttype) char, char *, char & "CHAR" %typemap(m3wrapouttype) signed char, signed char *, signed char & "CHAR" %typemap(m3wrapouttype) unsigned char, unsigned char *, unsigned char & "CHAR" %typemap(m3wrapouttype) short, short *, short & "INTEGER" %typemap(m3wrapouttype) unsigned short, unsigned short *, unsigned short & "CARDINAL" %typemap(m3wrapouttype) int, int *, int & "INTEGER" %typemap(m3wrapouttype) unsigned int, unsigned int *, unsigned int & "CARDINAL" %typemap(m3wrapouttype) long, long *, long & "INTEGER" %typemap(m3wrapouttype) unsigned long, unsigned long *, unsigned long & "CARDINAL" %typemap(m3wrapouttype) long long, long long *, long long & "INTEGER" %typemap(m3wrapouttype) unsigned long long, unsigned long long *, unsigned long long & "CARDINAL" %typemap(m3wrapouttype) float, float *, float & "REAL" %typemap(m3wrapouttype) double, double *, double & "LONGREAL" %typemap(m3wrapouttype) long double, long double *, long double & "EXTENDED" %typemap(m3wrapouttype) char *, char [] "TEXT" %typemap(m3wrapouttype,numinputs=0) void "" %typemap(m3wraprettype) bool, const bool & "BOOLEAN" %typemap(m3wraprettype) char, const char & "CHAR" %typemap(m3wraprettype) signed char, const signed char & "CHAR" %typemap(m3wraprettype) unsigned char, const unsigned char & "CHAR" %typemap(m3wraprettype) short, const short & "INTEGER" %typemap(m3wraprettype) unsigned short, const unsigned short & "CARDINAL" %typemap(m3wraprettype) int, const int & "INTEGER" %typemap(m3wraprettype) unsigned int, const unsigned int & "CARDINAL" %typemap(m3wraprettype) long, const long & "INTEGER" %typemap(m3wraprettype) unsigned long, const unsigned long & "CARDINAL" %typemap(m3wraprettype) long long, const long long & "INTEGER" %typemap(m3wraprettype) unsigned long long, const unsigned long long & "CARDINAL" %typemap(m3wraprettype) float, const float & "REAL" %typemap(m3wraprettype) double, const double & "LONGREAL" %typemap(m3wraprettype) long double, const long double & "EXTENDED" %typemap(m3wraprettype) char * "TEXT" %typemap(m3wraprettype) void "" %typemap(m3wraprettype) FILE "Cstdio.FILE"; %typemap(m3wraprettype) FILE * "Cstdio.FILE_star"; %typemap(ctype) char[ANY] "char *" %typemap(m3rawtype) char[ANY] "C.char_star" %typemap(m3rawintype) char[ANY] "C.char_star" %typemap(m3rawrettype) char[ANY] "C.char_star" %typemap(m3wraptype) char[ANY] "TEXT" %typemap(m3wrapintype) char[ANY] "TEXT" %typemap(m3wrapouttype) char[ANY] "TEXT" %typemap(m3wraprettype) char[ANY] "TEXT" %typemap(m3wrapinmode) const char * %{%} %typemap(m3wrapargvar) const char * %{$1 : C.char_star;%} %typemap(m3wrapinconv) const char * %{$1 := M3toC.SharedTtoS($1_name);%} %typemap(m3wrapfreearg) const char * %{M3toC.FreeSharedS($1_name,$1);%} %typemap(m3wrapargraw) const char * %{$1%} %typemap("m3wrapargvar:import") const char * "Ctypes AS C" %typemap("m3wrapinconv:import") const char * "M3toC" %typemap("m3wrapfreearg:import") const char * "M3toC" %typemap(m3wrapretvar) char * %{result : C.char_star;%} %typemap(m3wrapretraw) char * %{result%} %typemap(m3wrapretconv) char * %{M3toC.CopyStoT(result)%} %typemap("m3wrapretvar:import") char * "Ctypes AS C" %typemap("m3wrapretconv:import") char * "M3toC" %typemap(m3wrapinmode) FILE * %{%} %typemap("m3wraptype:import") FILE, FILE * "Cstdio"; %typemap("m3wrapintype:import") FILE, FILE * "Cstdio"; %typemap("m3wraprettype:import") FILE, FILE * "Cstdio"; /* Composed types */ %typemap(ctype) SWIGTYPE "$1_type" %typemap(m3rawtype) SWIGTYPE "$1_basetype" %typemap(m3rawrettype) SWIGTYPE "UNTRACED REF $1_basetype" %typemap(m3wraptype) SWIGTYPE "$1_basetype" %typemap(m3wrapintype) SWIGTYPE "$1_basetype" %typemap(m3wrapouttype) SWIGTYPE "$1_basetype" %typemap(m3wraprettype) SWIGTYPE "$1_basetype" %typemap(ctype) SWIGTYPE [] "$1_type" %typemap(m3rawtype) const SWIGTYPE [] "UNTRACED REF ARRAY INTEGER OF $1_basetype" %typemap(m3rawtype) SWIGTYPE [] "UNTRACED REF ARRAY INTEGER OF $1_basetype" %typemap(m3rawintype) const SWIGTYPE [] "(*ARRAY OF*) $1_basetype" %typemap(m3rawinmode) const SWIGTYPE [] "READONLY" %typemap(m3rawintype) SWIGTYPE [] "(*ARRAY OF*) $1_basetype" %typemap(m3rawinmode) SWIGTYPE [] "VAR" %typemap(m3rawrettype) const SWIGTYPE [] "UNTRACED REF ARRAY INTEGER OF $1_basetype" %typemap(m3rawrettype) SWIGTYPE [] "UNTRACED REF ARRAY INTEGER OF $1_basetype" %typemap(m3wraptype) SWIGTYPE [] "$1_basetype" %typemap(m3wrapintype) const SWIGTYPE [] "ARRAY OF $1_basetype" %typemap(m3wrapinmode) const SWIGTYPE [] "READONLY" %typemap(m3wrapintype) SWIGTYPE [] "ARRAY OF $1_basetype" %typemap(m3wrapinmode) SWIGTYPE [] "VAR" %typemap(m3wrapouttype) SWIGTYPE [] "ARRAY OF $1_basetype" %typemap(m3wraprettype) SWIGTYPE [] "REF ARRAY OF $1_basetype" %typemap(ctype) SWIGTYPE * "$1_type" %typemap(m3rawtype) const SWIGTYPE * "UNTRACED REF $1_basetype" %typemap(m3rawtype) SWIGTYPE * "UNTRACED REF $1_basetype" %typemap(m3rawintype) const SWIGTYPE * "$1_basetype" %typemap(m3rawinmode) const SWIGTYPE * "READONLY" %typemap(m3rawintype) SWIGTYPE * "$1_basetype" %typemap(m3rawinmode) SWIGTYPE * "VAR" %typemap(m3rawrettype) const SWIGTYPE * "UNTRACED REF $1_basetype" %typemap(m3rawrettype) SWIGTYPE * "UNTRACED REF $1_basetype" %typemap(m3wraptype) SWIGTYPE * "$1_basetype" %typemap(m3wrapintype) const SWIGTYPE * "$1_basetype" %typemap(m3wrapinmode) const SWIGTYPE * "READONLY" %typemap(m3wrapintype) SWIGTYPE * "$1_basetype" %typemap(m3wrapinmode) SWIGTYPE * "VAR" %typemap(m3wrapouttype) SWIGTYPE * "$1_basetype" %typemap(m3wraprettype) SWIGTYPE * "UNTRACED REF $1_basetype" %typemap(ctype) SWIGTYPE & "$1_type" %typemap(m3rawtype) const SWIGTYPE & "UNTRACED REF $1_basetype" %typemap(m3rawtype) SWIGTYPE & "UNTRACED REF $1_basetype" %typemap(m3rawintype) const SWIGTYPE & "$1_basetype" %typemap(m3rawinmode) const SWIGTYPE & "READONLY" %typemap(m3rawintype) SWIGTYPE & "$1_basetype" %typemap(m3rawinmode) SWIGTYPE & "VAR" %typemap(m3rawrettype) const SWIGTYPE & "UNTRACED REF $1_basetype" %typemap(m3rawrettype) SWIGTYPE & "UNTRACED REF $1_basetype" %typemap(m3wraptype) SWIGTYPE & "$1_basetype" %typemap(m3wrapintype) const SWIGTYPE & "$1_basetype" %typemap(m3wrapinmode) const SWIGTYPE & "READONLY" %typemap(m3wrapintype) SWIGTYPE & "$1_basetype" %typemap(m3wrapinmode) SWIGTYPE & "VAR" %typemap(m3wrapouttype) SWIGTYPE & "$1_basetype" %typemap(m3wraprettype) SWIGTYPE & "UNTRACED REF $1_basetype" %typemap(ctype) SWIGTYPE && "$1_type" %typemap(m3rawtype) const SWIGTYPE && "UNTRACED REF $1_basetype" %typemap(m3rawtype) SWIGTYPE && "UNTRACED REF $1_basetype" %typemap(m3rawintype) const SWIGTYPE && "$1_basetype" %typemap(m3rawinmode) const SWIGTYPE && "READONLY" %typemap(m3rawintype) SWIGTYPE && "$1_basetype" %typemap(m3rawinmode) SWIGTYPE && "VAR" %typemap(m3rawrettype) const SWIGTYPE && "UNTRACED REF $1_basetype" %typemap(m3rawrettype) SWIGTYPE && "UNTRACED REF $1_basetype" %typemap(m3wraptype) SWIGTYPE && "$1_basetype" %typemap(m3wrapintype) const SWIGTYPE && "$1_basetype" %typemap(m3wrapinmode) const SWIGTYPE && "READONLY" %typemap(m3wrapintype) SWIGTYPE && "$1_basetype" %typemap(m3wrapinmode) SWIGTYPE && "VAR" %typemap(m3wrapouttype) SWIGTYPE && "$1_basetype" %typemap(m3wraprettype) SWIGTYPE && "UNTRACED REF $1_basetype" %typemap(ctype) enum SWIGTYPE "$1_type" %typemap(m3rawtype) enum SWIGTYPE "C.int" %typemap(m3rawintype) enum SWIGTYPE "C.int (* $1_type *)" %typemap(m3rawrettype) enum SWIGTYPE "C.int" %typemap(m3wraptype) enum SWIGTYPE "$*1_type" %typemap(m3wrapintype) enum SWIGTYPE "$1_type" %typemap(m3wrapouttype) enum SWIGTYPE "$1_type" %typemap(m3wraprettype) enum SWIGTYPE "$*1_type" /* pointer to a class member */ %typemap(ctype) SWIGTYPE (CLASS::*) "$1_type" %typemap(m3rawtype) SWIGTYPE (CLASS::*) "REFANY" %typemap(m3wraptype) SWIGTYPE (CLASS::*) "$1_basetype" /* The following are the in, out, freearg, argout typemaps. These are the PInvoke code generating typemaps for converting from C# to C and visa versa. */ /* primitive types */ %typemap(in) bool %{ $1 = $input ? true : false; %} %typemap(in) char, signed char, unsigned char, short, unsigned short, int, unsigned int, long, unsigned long, long long, unsigned long long, float, double, enum SWIGTYPE %{ $1 = ($1_ltype)$input; %} %typemap(out) bool %{ $result = $1; %} %typemap(out) char %{ $result = $1; %} %typemap(out) signed char %{ $result = $1; %} %typemap(out) unsigned char %{ $result = $1; %} %typemap(out) short %{ $result = $1; %} %typemap(out) unsigned short %{ $result = $1; %} %typemap(out) int %{ $result = $1; %} %typemap(out) unsigned int %{ $result = $1; %} %typemap(out) long %{ $result = $1; %} %typemap(out) unsigned long %{ $result = $1; %} %typemap(out) long long %{ $result = $1; %} %typemap(out) unsigned long long %{ $result = $1; %} %typemap(out) float %{ $result = $1; %} %typemap(out) double %{ $result = $1; %} %typemap(out) enum SWIGTYPE %{ $result = $1; %} /* char * - treat as String */ %typemap(in) char * { $1 = $input; } //%typemap(freearg) char * { if ($1) JCALL2(ReleaseStringUTFChars, jenv, $input, $1); } //%typemap(out) char * { if($1) $result = JCALL1(NewStringUTF, jenv, $1); } %typemap(out) void "" /* primitive types by const reference */ %typemap(in) const bool & (bool temp) %{ temp = $input ? true : false; $1 = &temp; %} %typemap(in) const char & (char temp), const signed char & (signed char temp), const unsigned char & (unsigned char temp), const short & (short temp), const unsigned short & (unsigned short temp), const int & (int temp), const unsigned int & (unsigned int temp), const long & (long temp), const unsigned long & (unsigned long temp), const long long & ($*1_ltype temp), const unsigned long long & ($*1_ltype temp), const float & (float temp), const double & (double temp) %{ temp = ($*1_ltype)$input; $1 = &temp; %} %typemap(out) const bool & %{ $result = *$1; %} %typemap(out) const char & %{ $result = *$1; %} %typemap(out) const signed char & %{ $result = *$1; %} %typemap(out) const unsigned char & %{ $result = *$1; %} %typemap(out) const short & %{ $result = *$1; %} %typemap(out) const unsigned short & %{ $result = *$1; %} %typemap(out) const int & %{ $result = *$1; %} %typemap(out) const unsigned int & %{ $result = *$1; %} %typemap(out) const long & %{ $result = *$1; %} %typemap(out) const unsigned long & %{ $result = *$1; %} %typemap(out) const long long & %{ $result = *$1; %} %typemap(out) const unsigned long long & %{ $result = *$1; %} %typemap(out) const float & %{ $result = *$1; %} %typemap(out) const double & %{ $result = *$1; %} /* Default handling. Object passed by value. Convert to a pointer */ %typemap(in) SWIGTYPE ($&1_type argp) %{ argp = *($&1_ltype*)&$input; if (!argp) { // SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "Attempt to dereference null $1_type"); RETURN $null; } $1 = *argp; %} %typemap(out) SWIGTYPE #ifdef __cplusplus %{*($&1_ltype*)&$result = new $1_ltype((const $1_ltype &)$1); %} #else { $&1_ltype $1ptr = ($&1_ltype) malloc(sizeof($1_ltype)); memmove($1ptr, &$1, sizeof($1_type)); *($&1_ltype*)&$result = $1ptr; } #endif /* Generic pointers and references */ %typemap(in) SWIGTYPE *, SWIGTYPE (CLASS::*) %{ $1 = *($&1_ltype)&$input; %} %typemap(in) SWIGTYPE & %{ $1 = *($&1_ltype)&$input; if(!$1) { //SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "$1_type reference is null"); RETURN $null; } %} %typemap(in) SWIGTYPE && %{ $1 = *($&1_ltype)&$input; if(!$1) { //SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "$1_type reference is null"); RETURN $null; } %} %typemap(out) SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE (CLASS::*) %{ *($&1_ltype)&$result = $1; %} /* Default array handling */ %typemap(in) SWIGTYPE [] %{ $1 = *($&1_ltype)&$input; %} %typemap(out) SWIGTYPE [] %{ *($&1_ltype)&$result = $1; %} /* char[ANY] - treat as String */ %typemap(in) char[ANY] { $1 = $input; } %typemap(argout) char[ANY] "" %typemap(freearg) char[ANY] ""//{ if ($1) JCALL2(ReleaseStringUTFChars, jenv, $input, $1); } %typemap(out) char[ANY] { if($1) $result = $1; } /* Typecheck typemaps - The purpose of these is merely to issue a warning for overloaded C++ functions * that cannot be overloaded in C# as more than one C++ type maps to a single C# type */ %typecheck(SWIG_TYPECHECK_BOOL) /* Java boolean */ bool, const bool & "" %typecheck(SWIG_TYPECHECK_CHAR) /* Java char */ char, const char & "" %typecheck(SWIG_TYPECHECK_INT8) /* Java byte */ signed char, const signed char & "" %typecheck(SWIG_TYPECHECK_INT16) /* Java short */ unsigned char, short, const unsigned char &, const short & "" %typecheck(SWIG_TYPECHECK_INT32) /* Java int */ unsigned short, int, long, const unsigned short &, const int &, const long &, enum SWIGTYPE "" %typecheck(SWIG_TYPECHECK_INT64) /* Java long */ unsigned int, unsigned long, long long, const unsigned int &, const unsigned long &, const long long & "" %typecheck(SWIG_TYPECHECK_INT128) /* Java BigInteger */ unsigned long long "" %typecheck(SWIG_TYPECHECK_FLOAT) /* Java float */ float, const float & "" %typecheck(SWIG_TYPECHECK_DOUBLE) /* Java double */ double, const double & "" %typecheck(SWIG_TYPECHECK_STRING) /* Java String */ char *, char[ANY] "" %typecheck(SWIG_TYPECHECK_POINTER) /* Default */ SWIGTYPE, SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE [], SWIGTYPE (CLASS::*) "" /* Exception handling */ %typemap(throws) int, long, short, unsigned int, unsigned long, unsigned short { char error_msg[256]; sprintf(error_msg, "C++ $1_type exception thrown, value: %d", $1); SWIG_JavaThrowException(jenv, SWIG_JavaRuntimeException, error_msg); RETURN $null; } %typemap(throws) SWIGTYPE { (void)$1; SWIG_JavaThrowException(jenv, SWIG_JavaRuntimeException, "C++ $1_type exception thrown"); RETURN $null; } %typemap(throws) char * { SWIG_JavaThrowException(jenv, SWIG_JavaRuntimeException, $1); RETURN $null; } /* Typemaps for code generation in proxy classes and C# type wrapper classes */ /* The in typemap is used for converting function parameter types from the type * used in the proxy, module or type wrapper class to the type used in the PInvoke class. */ %typemap(m3in) bool, const bool &, char, const char &, signed char, const signed char &, unsigned char, const unsigned char &, short, const short &, unsigned short, const unsigned short &, int, const int &, unsigned int, const unsigned int &, long, const long &, unsigned long, const unsigned long &, long long, const long long &, unsigned long long, const unsigned long long &, float, const float &, double, const double &, char *, char[ANY], enum SWIGTYPE "$input" %typemap(m3in) SWIGTYPE "$&*1_type.getCPtr($input)" %typemap(m3in) SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE [], SWIGTYPE (CLASS::*) "$1_basetype.getCPtr($input)" /* The m3out typemap is used for converting function return types from the return type * used in the PInvoke class to the type returned by the proxy, module or type wrapper class. */ %typemap(m3out) bool, const bool &, char, const char &, signed char, const signed char &, unsigned char, const unsigned char &, short, const short &, unsigned short, const unsigned short &, int, const int &, unsigned int, const unsigned int &, long, const long &, unsigned long, const unsigned long &, long long, const long long &, unsigned long long, const unsigned long long &, float, const float &, double, const double &, char *, char[ANY], enum SWIGTYPE %{$imcall%} %typemap(m3out) void %{$imcall%} %typemap(m3out) SWIGTYPE %{ RETURN NEW(REF $1_basetype, $imcall); %} %typemap(m3out) SWIGTYPE & %{ RETURN NEW($1_basetype, $imcall, $owner); %} %typemap(m3out) SWIGTYPE && %{ RETURN NEW($1_basetype, $imcall, $owner); %} %typemap(m3out) SWIGTYPE *, SWIGTYPE [], SWIGTYPE (CLASS::*) %{ cPtr := $imcall; RETURN (cPtr = IntPtr.Zero) ? null : NEW($1_basetype, cPtr, $owner); %} /* Properties */ %typemap(m3varin) SWIGTYPE, SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE [], SWIGTYPE (CLASS::*) %{ PROCEDURE Set$var (value: $vartype) = BEGIN $imcall; END Set$var; %} %typemap(m3varout) bool, const bool &, char, const char &, signed char, const signed char &, unsigned char, const unsigned char &, short, const short &, unsigned short, const unsigned short &, int, const int &, unsigned int, const unsigned int &, long, const long &, unsigned long, const unsigned long &, long long, const long long &, unsigned long long, const unsigned long long &, float, const float &, double, const double &, char *, char[ANY], enum SWIGTYPE %{ PROCEDURE Get$var (): $vartype = BEGIN RETURN $imcall; END Get$var; %} %typemap(m3varout) void %{ get { $imcall; } %} %typemap(m3varout) SWIGTYPE %{ get { RETURN new $&*1_mangle($imcall, true); } %} %typemap(m3varout) SWIGTYPE & %{ get { RETURN new $1_basetype($imcall, $owner); } %} %typemap(m3varout) SWIGTYPE && %{ get { RETURN new $1_basetype($imcall, $owner); } %} %typemap(m3varout) SWIGTYPE *, SWIGTYPE [], SWIGTYPE (CLASS::*) %{ get { IntPtr cPtr = $imcall; RETURN (cPtr == IntPtr.Zero) ? null : new $1_basetype(cPtr, $owner); } %} /* Typemaps used for the generation of proxy and type wrapper class code */ %typemap(m3base) SWIGTYPE, SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE [], SWIGTYPE (CLASS::*) "" %typemap(m3classmodifiers) SWIGTYPE, SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE [], SWIGTYPE (CLASS::*) "public" %typemap(m3code) SWIGTYPE, SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE [], SWIGTYPE (CLASS::*) "" %typemap(m3imports) SWIGTYPE, SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE [], SWIGTYPE (CLASS::*) "using System;" %typemap(m3interfaces) SWIGTYPE "IDisposable" %typemap(m3interfaces_derived) SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE [], SWIGTYPE (CLASS::*) "" %typemap(m3ptrconstructormodifiers) SWIGTYPE, SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE [], SWIGTYPE (CLASS::*) "internal" %typemap(m3finalize) SWIGTYPE %{ ~$1_basetype() { Dispose(); } %} %typemap(m3destruct, methodname="Dispose") SWIGTYPE { if(swigCPtr != IntPtr.Zero && swigCMemOwn) { $imcall; swigCMemOwn = false; } swigCPtr = IntPtr.Zero; GC.SuppressFinalize(this); } %typemap(m3destruct_derived, methodname="Dispose") SWIGTYPE { if(swigCPtr != IntPtr.Zero && swigCMemOwn) { $imcall; swigCMemOwn = false; } swigCPtr = IntPtr.Zero; GC.SuppressFinalize(this); base.Dispose(); } %typemap(m3getcptr) SWIGTYPE, SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE [], SWIGTYPE (CLASS::*) %{ internal static IntPtr getCPtr($1_basetype obj) { RETURN (obj == null) ? IntPtr.Zero : obj.swigCPtr; } %} /* M3 specific directives */ #define %m3multiretval %feature("modula3:multiretval") #define %constnumeric(num) %feature("constnumeric","num") %pragma(modula3) moduleimports=%{ IMPORT BlaBla; %} %pragma(modula3) imclassimports=%{ FROM BlaBla IMPORT Bla; %} /* Some ANSI C typemaps */ %apply unsigned long { size_t }; /* Array reference typemaps */ %apply SWIGTYPE & { SWIGTYPE ((&)[ANY]) } %apply SWIGTYPE && { SWIGTYPE ((&&)[ANY]) } /* const pointers */ %apply SWIGTYPE * { SWIGTYPE *const } %apply SWIGTYPE (CLASS::*) { SWIGTYPE (CLASS::*const) } %apply SWIGTYPE & { SWIGTYPE (CLASS::*const&) } swig-4.0.1/Lib/modula3/modula3head.swg0000644000175000017500000000374613527063513017344 0ustar williamwilliam/* ----------------------------------------------------------------------------- * modula3head.swg * * Modula3 support code * ----------------------------------------------------------------------------- */ %insert(runtime) %{ #include #include #include %} #if 0 %insert(runtime) %{ /* Support for throwing Modula3 exceptions */ typedef enum { SWIG_JavaOutOfMemoryError = 1, SWIG_JavaIOException, SWIG_JavaRuntimeException, SWIG_JavaIndexOutOfBoundsException, SWIG_JavaArithmeticException, SWIG_JavaIllegalArgumentException, SWIG_JavaNullPointerException, SWIG_JavaUnknownError } SWIG_JavaExceptionCodes; typedef struct { SWIG_JavaExceptionCodes code; const char *java_exception; } SWIG_JavaExceptions_t; #if defined(SWIG_NOINCLUDE) void SWIG_JavaThrowException(JNIEnv *jenv, SWIG_JavaExceptionCodes code, const char *msg); #else %} %insert(runtime) { void SWIG_JavaThrowException(JNIEnv *jenv, SWIG_JavaExceptionCodes code, const char *msg) { jclass excep; static const SWIG_JavaExceptions_t java_exceptions[] = { { SWIG_JavaOutOfMemoryError, "java/lang/OutOfMemoryError" }, { SWIG_JavaIOException, "java/io/IOException" }, { SWIG_JavaRuntimeException, "java/lang/RuntimeException" }, { SWIG_JavaIndexOutOfBoundsException, "java/lang/IndexOutOfBoundsException" }, { SWIG_JavaArithmeticException, "java/lang/ArithmeticException" }, { SWIG_JavaIllegalArgumentException, "java/lang/IllegalArgumentException" }, { SWIG_JavaNullPointerException, "java/lang/NullPointerException" }, { SWIG_JavaUnknownError, "java/lang/UnknownError" }, { (SWIG_JavaExceptionCodes)0, "java/lang/UnknownError" } }; const SWIG_JavaExceptions_t *except_ptr = java_exceptions; while (except_ptr->code != code && except_ptr->code) except_ptr++; JCALL0(ExceptionClear, jenv); excep = JCALL1(FindClass, jenv, except_ptr->java_exception); if (excep) JCALL2(ThrowNew, jenv, excep, msg); } } %insert(runtime) %{ #endif %} #endif swig-4.0.1/Lib/modula3/typemaps.i0000644000175000017500000001032113527063513016433 0ustar williamwilliam/* ----------------------------------------------------------------------------- * typemaps.i * * Pointer and reference handling typemap library * * These mappings provide support for input/output arguments and common * uses for C/C++ pointers and C++ references. * ----------------------------------------------------------------------------- */ /* These typemaps will eventually probably maybe make their way into named typemaps * OUTPUT * and OUTPUT & as they currently break functions that return a pointer or * reference. */ %typemap(ctype) bool *, bool & "bool *" %typemap(ctype) char & "char *" %typemap(ctype) signed char *, signed char & "signed char *" %typemap(ctype) unsigned char *, unsigned char & "unsigned short *" %typemap(ctype) short *, short & "short *" %typemap(ctype) unsigned short *, unsigned short & "unsigned short *" %typemap(ctype) int *, int & "int *" %typemap(ctype) unsigned int *, unsigned int & "unsigned int *" %typemap(ctype) long *, long & "long *" %typemap(ctype) unsigned long *, unsigned long & "unsigned long *" %typemap(ctype) long long *, long long & "long long *" %typemap(ctype) unsigned long long *, unsigned long long & "unsigned long long *" %typemap(ctype) float *, float & "float *" %typemap(ctype) double *, double & "double *" %typemap(imtype) bool *, bool & "ref bool" %typemap(imtype) char & "ref char" %typemap(imtype) signed char *, signed char & "ref sbyte" %typemap(imtype) unsigned char *, unsigned char & "ref byte" %typemap(imtype) short *, short & "ref short" %typemap(imtype) unsigned short *, unsigned short & "ref ushort" %typemap(imtype) int *, int & "ref int" %typemap(imtype) unsigned int *, unsigned int & "ref uint" %typemap(imtype) long *, long & "ref int" %typemap(imtype) unsigned long *, unsigned long & "ref uint" %typemap(imtype) long long *, long long & "ref long" %typemap(imtype) unsigned long long *, unsigned long long & "ref ulong" %typemap(imtype) float *, float & "ref float" %typemap(imtype) double *, double & "ref double" %typemap(cstype) bool *, bool & "ref bool" %typemap(cstype) char & "ref char" %typemap(cstype) signed char *, signed char & "ref sbyte" %typemap(cstype) unsigned char *, unsigned char & "ref byte" %typemap(cstype) short *, short & "ref short" %typemap(cstype) unsigned short *, unsigned short & "ref ushort" %typemap(cstype) int *, int & "ref int" %typemap(cstype) unsigned int *, unsigned int & "ref uint" %typemap(cstype) long *, long & "ref int" %typemap(cstype) unsigned long *, unsigned long & "ref uint" %typemap(cstype) long long *, long long & "ref long" %typemap(cstype) unsigned long long *, unsigned long long & "ref ulong" %typemap(cstype) float *, float & "ref float" %typemap(cstype) double *, double & "ref double" %typemap(csin) bool *, bool &, char &, signed char *, signed char &, unsigned char *, unsigned char &, short *, short &, unsigned short *, unsigned short &, int *, int &, unsigned int *, unsigned int &, long *, long &, unsigned long *, unsigned long &, long long *, long long &, unsigned long long *, unsigned long long &, float *, float &, double *, double & "ref $csinput" swig-4.0.1/Lib/std/0000755000175000017500000000000013527063513013650 5ustar williamwilliamswig-4.0.1/Lib/std/std_wiostream.i0000644000175000017500000000014413527063513016705 0ustar williamwilliam/* Provide 'std_iostream.i' with wchar support. */ %include %include swig-4.0.1/Lib/std/std_deque.i0000644000175000017500000000664613527063513016013 0ustar williamwilliam// // std::deque %include // Deque %define %std_deque_methods(deque...) %std_sequence_methods(deque) void pop_front(); void push_front(const value_type& x); %enddef %define %std_deque_methods_val(deque...) %std_sequence_methods_val(deque) void pop_front(); void push_front(value_type x); %enddef // ------------------------------------------------------------------------ // std::deque // // const declarations are used to guess the intent of the function being // exported; therefore, the following rationale is applied: // // -- f(std::deque), f(const std::deque&): // the parameter being read-only, either a sequence or a // previously wrapped std::deque can be passed. // -- f(std::deque&), f(std::deque*): // the parameter may be modified; therefore, only a wrapped std::deque // can be passed. // -- std::deque f(), const std::deque& f(): // the deque is returned by copy; therefore, a sequence of T:s // is returned which is most easily used in other functions // -- std::deque& f(), std::deque* f(): // the deque is returned by reference; therefore, a wrapped std::deque // is returned // -- const std::deque* f(), f(const std::deque*): // for consistency, they expect and return a plain deque pointer. // ------------------------------------------------------------------------ %{ #include %} // exported classes namespace std { template > class deque { public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef _Tp value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; typedef _Alloc allocator_type; %traits_swigtype(_Tp); %fragment(SWIG_Traits_frag(std::deque< _Tp, _Alloc >), "header", fragment=SWIG_Traits_frag(_Tp), fragment="StdDequeTraits") { namespace swig { template <> struct traits > { typedef pointer_category category; static const char* type_name() { return "std::deque<" #_Tp " >"; } }; } } %typemap_traits_ptr(SWIG_TYPECHECK_DEQUE, std::deque< _Tp, _Alloc >); #ifdef %swig_deque_methods // Add swig/language extra methods %swig_deque_methods(std::deque< _Tp, _Alloc >); #endif %std_deque_methods(deque); }; template class deque< _Tp*, _Alloc > { public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef _Tp* value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type reference; typedef value_type const_reference; typedef _Alloc allocator_type; %traits_swigtype(_Tp); %fragment(SWIG_Traits_frag(std::deque< _Tp*, _Alloc >), "header", fragment=SWIG_Traits_frag(_Tp), fragment="StdDequeTraits") { namespace swig { template <> struct traits > { typedef value_category category; static const char* type_name() { return "std::deque<" #_Tp " * >"; } }; } } %typemap_traits_ptr(SWIG_TYPECHECK_DEQUE, std::deque< _Tp*, _Alloc >); #ifdef %swig_deque_methods_val // Add swig/language extra methods %swig_deque_methods_val(std::deque< _Tp*, _Alloc >); #endif %std_deque_methods_val(deque); }; } swig-4.0.1/Lib/std/std_multiset.i0000644000175000017500000000476013527063513016551 0ustar williamwilliam// // std::multiset // %include // Multiset %define %std_multiset_methods(multiset...) %std_set_methods_common(multiset); %enddef // ------------------------------------------------------------------------ // std::multiset // // const declarations are used to guess the intent of the function being // exported; therefore, the following rationale is applied: // // -- f(std::multiset), f(const std::multiset&): // the parameter being read-only, either a sequence or a // previously wrapped std::multiset can be passed. // -- f(std::multiset&), f(std::multiset*): // the parameter may be modified; therefore, only a wrapped std::multiset // can be passed. // -- std::multiset f(), const std::multiset& f(): // the set is returned by copy; therefore, a sequence of T:s // is returned which is most easily used in other functions // -- std::multiset& f(), std::multiset* f(): // the set is returned by reference; therefore, a wrapped std::multiset // is returned // -- const std::multiset* f(), f(const std::multiset*): // for consistency, they expect and return a plain set pointer. // ------------------------------------------------------------------------ // exported classes namespace std { //multiset template , class _Alloc = allocator< _Key > > class multiset { public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef _Key value_type; typedef _Key key_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; typedef _Alloc allocator_type; %traits_swigtype(_Key); %fragment(SWIG_Traits_frag(std::multiset< _Key, _Compare, _Alloc >), "header", fragment=SWIG_Traits_frag(_Key), fragment="StdMultisetTraits") { namespace swig { template <> struct traits > { typedef pointer_category category; static const char* type_name() { return "std::multiset<" #_Key "," #_Compare "," #_Alloc " >"; } }; } } %typemap_traits_ptr(SWIG_TYPECHECK_MULTISET, std::multiset< _Key, _Compare, _Alloc >); multiset(const _Compare& other); #ifdef %swig_multiset_methods // Add swig/language extra methods %swig_multiset_methods(std::multiset< _Key, _Compare, _Alloc >); #endif %std_multiset_methods(multiset); }; } swig-4.0.1/Lib/std/std_multimap.i0000644000175000017500000000627513527063513016536 0ustar williamwilliam// // std::multimap // %include %define %std_multimap_methods(mmap...) %std_map_methods_common(mmap); #ifdef SWIG_EXPORT_ITERATOR_METHODS std::pair equal_range(const key_type& x); std::pair equal_range(const key_type& x) const; #endif %enddef // ------------------------------------------------------------------------ // std::multimap // // const declarations are used to guess the intent of the function being // exported; therefore, the following rationale is applied: // // -- f(std::multimap), f(const std::multimap&): // the parameter being read-only, either a sequence or a // previously wrapped std::multimap can be passed. // -- f(std::multimap&), f(std::multimap*): // the parameter may be modified; therefore, only a wrapped std::multimap // can be passed. // -- std::multimap f(), const std::multimap& f(): // the map is returned by copy; therefore, a sequence of T:s // is returned which is most easily used in other functions // -- std::multimap& f(), std::multimap* f(): // the map is returned by reference; therefore, a wrapped std::multimap // is returned // -- const std::multimap* f(), f(const std::multimap*): // for consistency, they expect and return a plain map pointer. // ------------------------------------------------------------------------ // exported class namespace std { template, class _Alloc = allocator > > class multimap { public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef _Key key_type; typedef _Tp mapped_type; typedef std::pair< const _Key, _Tp > value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; typedef _Alloc allocator_type; %traits_swigtype(_Key); %traits_swigtype(_Tp); %fragment(SWIG_Traits_frag(std::pair< _Key, _Tp >), "header", fragment=SWIG_Traits_frag(_Key), fragment=SWIG_Traits_frag(_Tp), fragment="StdPairTraits") { namespace swig { template <> struct traits > { typedef pointer_category category; static const char* type_name() { return "std::pair<" #_Key "," #_Tp " >"; } }; } } %fragment(SWIG_Traits_frag(std::multimap< _Key, _Tp, _Compare, _Alloc >), "header", fragment=SWIG_Traits_frag(std::pair< _Key, _Tp >), fragment="StdMultimapTraits") { namespace swig { template <> struct traits > { typedef pointer_category category; static const char* type_name() { return "std::multimap<" #_Key "," #_Tp "," #_Compare "," #_Alloc " >"; } }; } } %typemap_traits_ptr(SWIG_TYPECHECK_MULTIMAP, std::multimap< _Key, _Tp, _Compare, _Alloc >); multimap(const _Compare& other); #ifdef %swig_multimap_methods // Add swig/language extra methods %swig_multimap_methods(std::multimap< _Key, _Tp, _Compare, _Alloc >); #endif %std_multimap_methods(multimap); }; } swig-4.0.1/Lib/std/std_unordered_multiset.i0000644000175000017500000000572013527063513020615 0ustar williamwilliam// // std::unordered_multiset // %include // Unordered Multiset %define %std_unordered_multiset_methods(unordered_multiset...) %std_unordered_set_methods_common(unordered_multiset); %enddef // ------------------------------------------------------------------------ // std::unordered_multiset // // const declarations are used to guess the intent of the function being // exported; therefore, the following rationale is applied: // // -- f(std::unordered_multiset), f(const std::unordered_multiset&): // the parameter being read-only, either a sequence or a // previously wrapped std::unordered_multiset can be passed. // -- f(std::unordered_multiset&), f(std::unordered_multiset*): // the parameter may be modified; therefore, only a wrapped std::unordered_multiset // can be passed. // -- std::unordered_multiset f(), const std::unordered_multiset& f(): // the set is returned by copy; therefore, a sequence of Key:s // is returned which is most easily used in other functions // -- std::unordered_multiset& f(), std::unordered_multiset* f(): // the set is returned by reference; therefore, a wrapped std::unordered_multiset // is returned // -- const std::unordered_multiset* f(), f(const std::unordered_multiset*): // for consistency, they expect and return a plain set pointer. // ------------------------------------------------------------------------ // exported classes namespace std { //unordered_multiset template , class _Compare = std::equal_to< _Key >, class _Alloc = allocator< _Key > > class unordered_multiset { public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef _Key value_type; typedef _Key key_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; typedef _Hash hasher; typedef _Compare key_equal; typedef _Alloc allocator_type; %traits_swigtype(_Key); %fragment(SWIG_Traits_frag(std::unordered_multiset< _Key, _Hash, _Compare, _Alloc >), "header", fragment=SWIG_Traits_frag(_Key), fragment="StdUnorderedMultisetTraits") { namespace swig { template <> struct traits > { typedef pointer_category category; static const char* type_name() { return "std::unordered_multiset<" #_Key "," #_Hash "," #_Compare "," #_Alloc " >"; } }; } } %typemap_traits_ptr(SWIG_TYPECHECK_MULTISET, std::unordered_multiset< _Key, _Hash, _Compare, _Alloc >); #ifdef %swig_unordered_multiset_methods // Add swig/language extra methods %swig_unordered_multiset_methods(std::unordered_multiset< _Key, _Hash, _Compare, _Alloc >); #endif %std_unordered_multiset_methods(unordered_multiset); }; } swig-4.0.1/Lib/std/std_vector.i0000644000175000017500000001404413527063513016201 0ustar williamwilliam// // std::vector // %include // Vector %define %std_vector_methods(vector...) %std_sequence_methods(vector) void reserve(size_type n); size_type capacity() const; %enddef %define %std_vector_methods_val(vector...) %std_sequence_methods_val(vector) void reserve(size_type n); size_type capacity() const; %enddef // ------------------------------------------------------------------------ // std::vector // // The aim of all that follows would be to integrate std::vector with // as much as possible, namely, to allow the user to pass and // be returned tuples or lists. // const declarations are used to guess the intent of the function being // exported; therefore, the following rationale is applied: // // -- f(std::vector), f(const std::vector&): // the parameter being read-only, either a sequence or a // previously wrapped std::vector can be passed. // -- f(std::vector&), f(std::vector*): // the parameter may be modified; therefore, only a wrapped std::vector // can be passed. // -- std::vector f(), const std::vector& f(): // the vector is returned by copy; therefore, a sequence of T:s // is returned which is most easily used in other functions // -- std::vector& f(), std::vector* f(): // the vector is returned by reference; therefore, a wrapped std::vector // is returned // -- const std::vector* f(), f(const std::vector*): // for consistency, they expect and return a plain vector pointer. // ------------------------------------------------------------------------ %{ #include %} // exported classes namespace std { template > class vector { public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef _Tp value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; typedef _Alloc allocator_type; %traits_swigtype(_Tp); %traits_enum(_Tp); %fragment(SWIG_Traits_frag(std::vector< _Tp, _Alloc >), "header", fragment=SWIG_Traits_frag(_Tp), fragment="StdVectorTraits") { namespace swig { template <> struct traits > { typedef pointer_category category; static const char* type_name() { return "std::vector<" #_Tp "," #_Alloc " >"; } }; } } %typemap_traits_ptr(SWIG_TYPECHECK_VECTOR, std::vector< _Tp, _Alloc >); #ifdef %swig_vector_methods // Add swig/language extra methods %swig_vector_methods(std::vector< _Tp, _Alloc >); #endif %std_vector_methods(vector); }; // *** // This specialization should disappear or get simplified when // a 'const SWIGTYPE*&' can be defined // *** template class vector< _Tp*, _Alloc > { public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef _Tp* value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; typedef _Alloc allocator_type; %traits_swigtype(_Tp); %fragment(SWIG_Traits_frag(std::vector< _Tp*, _Alloc >), "header", fragment=SWIG_Traits_frag(_Tp), fragment="StdVectorTraits") { namespace swig { template <> struct traits > { typedef value_category category; static const char* type_name() { return "std::vector<" #_Tp " *," #_Alloc " >"; } }; } } %typemap_traits_ptr(SWIG_TYPECHECK_VECTOR, std::vector< _Tp*, _Alloc >); #ifdef %swig_vector_methods_val // Add swig/language extra methods %swig_vector_methods_val(std::vector< _Tp*, _Alloc >); #endif %std_vector_methods_val(vector); }; // *** // const pointer specialization // *** template class vector< _Tp const *, _Alloc > { public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef _Tp const * value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; typedef _Alloc allocator_type; %traits_swigtype(_Tp); %fragment(SWIG_Traits_frag(std::vector< _Tp const*, _Alloc >), "header", fragment=SWIG_Traits_frag(_Tp), fragment="StdVectorTraits") { namespace swig { template <> struct traits > { typedef value_category category; static const char* type_name() { return "std::vector<" #_Tp " const*," #_Alloc " >"; } }; } } %typemap_traits_ptr(SWIG_TYPECHECK_VECTOR, std::vector< _Tp const*, _Alloc >); #ifdef %swig_vector_methods_val // Add swig/language extra methods %swig_vector_methods_val(std::vector< _Tp const*, _Alloc >); #endif %std_vector_methods_val(vector); }; // *** // bool specialization // *** template class vector { public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef bool value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef bool const_reference; typedef _Alloc allocator_type; %traits_swigtype(bool); %fragment(SWIG_Traits_frag(std::vector), "header", fragment=SWIG_Traits_frag(bool), fragment="StdVectorTraits") { namespace swig { template <> struct traits > { typedef value_category category; static const char* type_name() { return "std::vector"; } }; } } %typemap_traits_ptr(SWIG_TYPECHECK_VECTOR, std::vector); #ifdef %swig_vector_methods_val // Add swig/language extra methods %swig_vector_methods_val(std::vector); #endif %std_vector_methods_val(vector); #if defined(SWIG_STD_MODERN_STL) && !defined(SWIG_STD_NOMODERN_STL) void flip(); #endif }; } swig-4.0.1/Lib/std/std_carray.swg0000644000175000017500000000262413527063513016531 0ustar williamwilliam%{ #include %} // // std::carray - is really an extension to the 'std' namespace. // // A simple fix C array wrapper, more or less as presented in // // "The C++ Standarf Library", by Nicolai M. Josuttis // // which is also derived from the example in // // "The C++ Programming Language", by Bjarne Stroustup. // %inline %{ namespace std { template class carray { public: typedef _Type value_type; typedef size_t size_type; typedef _Type * iterator; typedef const _Type * const_iterator; carray() { } carray(const carray& other) { std::copy(other.v, other.v + size(), v); } template carray(_Iterator first, _Iterator last) { assign(first, last); } iterator begin() { return v; } iterator end() { return v + _Size; } const_iterator begin() const { return v; } const_iterator end() const { return v + _Size; } _Type& operator[](size_t i) { return v[i]; } const _Type& operator[](size_t i) const { return v[i]; } static size_t size() { return _Size; } template void assign(_Iterator first, _Iterator last) { if (std::distance(first,last) == size()) { std::copy(first, last, v); } else { throw std::length_error("bad range length"); } } private: _Type v[_Size]; }; } %} swig-4.0.1/Lib/std/std_alloc.i0000644000175000017500000000375313527063513015776 0ustar williamwilliamnamespace std { /** * @brief The "standard" allocator, as per [20.4]. * * The private _Alloc is "SGI" style. (See comments at the top * of stl_alloc.h.) * * The underlying allocator behaves as follows. * - __default_alloc_template is used via two typedefs * - "__single_client_alloc" typedef does no locking for threads * - "__alloc" typedef is threadsafe via the locks * - __new_alloc is used for memory requests * * (See @link Allocators allocators info @endlink for more.) */ template class allocator { public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef _Tp* pointer; typedef const _Tp* const_pointer; typedef _Tp& reference; typedef const _Tp& const_reference; typedef _Tp value_type; template struct rebind; allocator() throw(); allocator(const allocator& other) throw(); template allocator(const allocator<_Tp1>& other) throw(); ~allocator() throw(); pointer address(reference __x) const; const_pointer address(const_reference __x) const; // NB: __n is permitted to be 0. The C++ standard says nothing // about what the return value is when __n == 0. _Tp* allocate(size_type __n, const void* = 0); // __p is not permitted to be a null pointer. void deallocate(pointer __p, size_type __n); size_type max_size() const throw(); void construct(pointer __p, const _Tp& __val); void destroy(pointer __p); }; template<> class allocator { public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef void* pointer; typedef const void* const_pointer; typedef void value_type; template struct rebind; }; } // namespace std swig-4.0.1/Lib/std/std_set.i0000644000175000017500000000645213527063513015476 0ustar williamwilliam// // std::set // %include %include // Set %define %std_set_methods_common(set...) set(); set(const set& other); bool empty() const; size_type size() const; void clear(); void swap(set& v); size_type erase(const key_type& x); size_type count(const key_type& x) const; #ifdef SWIG_EXPORT_ITERATOR_METHODS class iterator; class reverse_iterator; iterator begin(); iterator end(); reverse_iterator rbegin(); reverse_iterator rend(); %extend { // %extend wrapper used for differing definitions of these methods introduced in C++11 void erase(iterator pos) { $self->erase(pos); } void erase(iterator first, iterator last) { $self->erase(first, last); } } iterator find(const key_type& x); iterator lower_bound(const key_type& x); iterator upper_bound(const key_type& x); std::pair equal_range(const key_type& x); #endif %enddef %define %std_set_methods(set...) %std_set_methods_common(set); #ifdef SWIG_EXPORT_ITERATOR_METHODS std::pair insert(const value_type& __x); #endif %enddef // ------------------------------------------------------------------------ // std::set // // const declarations are used to guess the intent of the function being // exported; therefore, the following rationale is applied: // // -- f(std::set), f(const std::set&): // the parameter being read-only, either a sequence or a // previously wrapped std::set can be passed. // -- f(std::set&), f(std::set*): // the parameter may be modified; therefore, only a wrapped std::set // can be passed. // -- std::set f(), const std::set& f(): // the set is returned by copy; therefore, a sequence of T:s // is returned which is most easily used in other functions // -- std::set& f(), std::set* f(): // the set is returned by reference; therefore, a wrapped std::set // is returned // -- const std::set* f(), f(const std::set*): // for consistency, they expect and return a plain set pointer. // ------------------------------------------------------------------------ %{ #include %} // exported classes namespace std { template , class _Alloc = allocator< _Key > > class set { public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef _Key value_type; typedef _Key key_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; typedef _Alloc allocator_type; %traits_swigtype(_Key); %fragment(SWIG_Traits_frag(std::set< _Key, _Compare, _Alloc >), "header", fragment=SWIG_Traits_frag(_Key), fragment="StdSetTraits") { namespace swig { template <> struct traits > { typedef pointer_category category; static const char* type_name() { return "std::set<" #_Key "," #_Compare "," #_Alloc " >"; } }; } } %typemap_traits_ptr(SWIG_TYPECHECK_SET, std::set< _Key, _Compare, _Alloc >); set(const _Compare& other); #ifdef %swig_set_methods // Add swig/language extra methods %swig_set_methods(std::set< _Key, _Compare, _Alloc >); #endif %std_set_methods(set); }; } swig-4.0.1/Lib/std/std_container.i0000644000175000017500000001031713527063513016660 0ustar williamwilliam%include %include %include %{ #include %} // Common non-resizable container methods %define %std_container_methods_non_resizable(container...) container(); container(const container& other); bool empty() const; size_type size() const; void swap(container& v); %enddef %define %std_container_methods_forward_iterators(container...) #ifdef SWIG_EXPORT_ITERATOR_METHODS class iterator; class const_iterator; iterator begin(); iterator end(); #endif %enddef %define %std_container_methods_reverse_iterators(container...) #ifdef SWIG_EXPORT_ITERATOR_METHODS class reverse_iterator; class const_reverse_iterator; reverse_iterator rbegin(); reverse_iterator rend(); #endif %enddef // Common container methods %define %std_container_methods(container...) %std_container_methods_non_resizable(%arg(container)) %std_container_methods_forward_iterators(%arg(container)) %std_container_methods_reverse_iterators(%arg(container)) void clear(); allocator_type get_allocator() const; %enddef %define %std_container_methods_without_reverse_iterators(container...) %std_container_methods_non_resizable(%arg(container)) %std_container_methods_forward_iterators(%arg(container)) void clear(); allocator_type get_allocator() const; %enddef // Common sequence %define %std_sequence_methods_common(sequence) %std_container_methods(%arg(sequence)); sequence(size_type size); void pop_back(); void resize(size_type new_size); #ifdef SWIG_EXPORT_ITERATOR_METHODS %extend { // %extend wrapper used for differing definitions of these methods introduced in C++11 iterator erase(iterator pos) { return $self->erase(pos); } iterator erase(iterator first, iterator last) { return $self->erase(first, last); } } #endif %enddef %define %std_sequence_methods_non_resizable(sequence) %std_container_methods_non_resizable(%arg(sequence)) %std_container_methods_forward_iterators(%arg(container)) %std_container_methods_reverse_iterators(%arg(container)) const value_type& front() const; const value_type& back() const; %enddef %define %std_sequence_methods(sequence) %std_sequence_methods_common(%arg(sequence)); sequence(size_type size, const value_type& value); void push_back(const value_type& x); const value_type& front() const; const value_type& back() const; void assign(size_type n, const value_type& x); void resize(size_type new_size, const value_type& x); #ifdef SWIG_EXPORT_ITERATOR_METHODS %extend { // %extend wrapper used for differing definitions of these methods introduced in C++11 iterator insert(iterator pos, const value_type& x) { return $self->insert(pos, x); } void insert(iterator pos, size_type n, const value_type& x) { $self->insert(pos, n, x); } } #endif %enddef %define %std_sequence_methods_non_resizable_val(sequence...) %std_container_methods_non_resizable(%arg(sequence)) %std_container_methods_forward_iterators(%arg(container)) %std_container_methods_reverse_iterators(%arg(container)) value_type front() const; value_type back() const; #endif %enddef %define %std_sequence_methods_val(sequence...) %std_sequence_methods_common(%arg(sequence)); sequence(size_type size, value_type value); void push_back(value_type x); value_type front() const; value_type back() const; void assign(size_type n, value_type x); void resize(size_type new_size, value_type x); #ifdef SWIG_EXPORT_ITERATOR_METHODS %extend { // %extend wrapper used for differing definitions of these methods introduced in C++11 iterator insert(iterator pos, value_type x) { return $self->insert(pos, x); } void insert(iterator pos, size_type n, value_type x) { $self->insert(pos, n, x); } } #endif %enddef // // Ignore member methods for Type with no default constructor // %define %std_nodefconst_type(Type...) %feature("ignore") std::vector< Type >::vector(size_type size); %feature("ignore") std::vector< Type >::resize(size_type size); %feature("ignore") std::deque< Type >::deque(size_type size); %feature("ignore") std::deque< Type >::resize(size_type size); %feature("ignore") std::list< Type >::list(size_type size); %feature("ignore") std::list< Type >::resize(size_type size); %enddef swig-4.0.1/Lib/std/std_wstring.i0000644000175000017500000000037113527063513016372 0ustar williamwilliam%include %include /* wide strings */ namespace std { %std_comp_methods(basic_string); %naturalvar wstring; typedef basic_string wstring; } %template(wstring) std::basic_string; swig-4.0.1/Lib/std/std_unordered_map.i0000644000175000017500000000775313527063513017534 0ustar williamwilliam// // std::unordered_map // %include %include %define %std_unordered_map_methods_common(unordered_map...) %std_container_methods_without_reverse_iterators(unordered_map); size_type erase(const key_type& x); size_type count(const key_type& x) const; #ifdef SWIG_EXPORT_ITERATOR_METHODS %extend { // %extend wrapper used for differing definitions of these methods introduced in C++11 void erase(iterator position) { $self->erase(position); } void erase(iterator first, iterator last) { $self->erase(first, last); } } iterator find(const key_type& x); #endif %enddef %define %std_unordered_map_methods(unordered_map...) %std_unordered_map_methods_common(unordered_map); #ifdef SWIG_EXPORT_ITERATOR_METHODS // iterator insert(const value_type& x); #endif %enddef // ------------------------------------------------------------------------ // std::unordered_map // // const declarations are used to guess the intent of the function being // exported; therefore, the following rationale is applied: // // -- f(std::unordered_map), f(const std::unordered_map&): // the parameter being read-only, either a sequence or a // previously wrapped std::unordered_map can be passed. // -- f(std::unordered_map&), f(std::unordered_map*): // the parameter may be modified; therefore, only a wrapped std::unordered_map // can be passed. // -- std::unordered_map f(), const std::unordered_map& f(): // the unordered_map is returned by copy; therefore, a sequence of T:s // is returned which is most easily used in other functions // -- std::unordered_map& f(), std::unordered_map* f(): // the unordered_map is returned by reference; therefore, a wrapped std::unordered_map // is returned // -- const std::unordered_map* f(), f(const std::unordered_map*): // for consistency, they expect and return a plain unordered_map pointer. // ------------------------------------------------------------------------ %{ #include %} %fragment(""); %fragment(""); // exported class namespace std { template, class _Pred = std::equal_to< _Key >, class _Alloc = allocator > > class unordered_map { public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef _Key key_type; typedef _Tp mapped_type; typedef std::pair< const _Key, _Tp > value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; typedef _Hash hasher; typedef _Compare key_equal; typedef _Alloc allocator_type; %traits_swigtype(_Key); %traits_swigtype(_Tp); %fragment(SWIG_Traits_frag(std::pair< _Key, _Tp >), "header", fragment=SWIG_Traits_frag(_Key), fragment=SWIG_Traits_frag(_Tp), fragment="StdPairTraits") { namespace swig { template <> struct traits > { typedef pointer_category category; static const char* type_name() { return "std::pair<" #_Key "," #_Tp " >"; } }; } } %fragment(SWIG_Traits_frag(std::unordered_map< _Key, _Tp, _Hash, _Pred, _Alloc >), "header", fragment=SWIG_Traits_frag(std::pair< _Key, _Tp >), fragment="StdUnorderedMapTraits") { namespace swig { template <> struct traits > { typedef pointer_category category; static const char* type_name() { return "std::unordered_map<" #_Key "," #_Tp "," #_Hash "," #_Pred "," #_Alloc " >"; } }; } } %typemap_traits_ptr(SWIG_TYPECHECK_MAP, std::unordered_map< _Key, _Tp, _Hash, _Pred, _Alloc >); #ifdef %swig_unordered_map_methods // Add swig/language extra methods %swig_unordered_map_methods(std::unordered_map< _Key, _Tp, _Hash, _Pred, _Alloc >); #endif %std_unordered_map_methods(unordered_map); }; } swig-4.0.1/Lib/std/std_sstream.i0000644000175000017500000001231313527063513016352 0ustar williamwilliam/* For wchar support, you need to include the wchar.i file before this file, ie: %include %include or equivalently, just include %include */ %include %include %include %include #if defined(SWIG_WCHAR) %include #endif %include %include %{ #include %} namespace std { template, typename _Alloc = allocator<_CharT> > class basic_stringbuf : public basic_streambuf<_CharT, _Traits> { public: // Types: typedef _CharT char_type; typedef _Traits traits_type; // 251. basic_stringbuf missing allocator_type typedef _Alloc allocator_type; typedef typename traits_type::int_type int_type; typedef typename traits_type::pos_type pos_type; typedef typename traits_type::off_type off_type; public: // Constructors: explicit basic_stringbuf(ios_base::openmode __mode = ios_base::in | ios_base::out); explicit basic_stringbuf(const basic_string<_CharT, _Traits, _Alloc>& __str, ios_base::openmode __mode = ios_base::in | ios_base::out); // Get and set: basic_string<_CharT, _Traits, _Alloc> str() const; void str(const basic_string<_CharT, _Traits, _Alloc>& __s); }; // 27.7.2 Template class basic_istringstream template, typename _Alloc = allocator<_CharT> > class basic_istringstream : public basic_istream<_CharT, _Traits> { public: // Types: typedef _CharT char_type; typedef _Traits traits_type; // 251. basic_stringbuf missing allocator_type typedef _Alloc allocator_type; typedef typename traits_type::int_type int_type; typedef typename traits_type::pos_type pos_type; typedef typename traits_type::off_type off_type; public: // Constructors: explicit basic_istringstream(ios_base::openmode __mode = ios_base::in); explicit basic_istringstream(const basic_string<_CharT, _Traits, _Alloc>& __str, ios_base::openmode __mode = ios_base::in); ~basic_istringstream(); // Members: basic_stringbuf<_CharT, _Traits, _Alloc>* rdbuf() const; basic_string<_CharT, _Traits, _Alloc> str() const; void str(const basic_string<_CharT, _Traits, _Alloc>& __s); }; // 27.7.3 Template class basic_ostringstream template, typename _Alloc = allocator<_CharT> > class basic_ostringstream : public basic_ostream<_CharT, _Traits> { public: // Types: typedef _CharT char_type; typedef _Traits traits_type; // 251. basic_stringbuf missing allocator_type typedef _Alloc allocator_type; typedef typename traits_type::int_type int_type; typedef typename traits_type::pos_type pos_type; typedef typename traits_type::off_type off_type; public: // Constructors/destructor: explicit basic_ostringstream(ios_base::openmode __mode = ios_base::out); explicit basic_ostringstream(const basic_string<_CharT, _Traits, _Alloc>& __str, ios_base::openmode __mode = ios_base::out); ~basic_ostringstream(); // Members: basic_stringbuf<_CharT, _Traits, _Alloc>* rdbuf() const; basic_string<_CharT, _Traits, _Alloc> str() const; #if 0 void str(const basic_string<_CharT, _Traits, _Alloc>& __s); #endif }; // 27.7.4 Template class basic_stringstream template, typename _Alloc = allocator<_CharT> > class basic_stringstream : public basic_iostream<_CharT, _Traits> { public: // Types: typedef _CharT char_type; typedef _Traits traits_type; // 251. basic_stringbuf missing allocator_type typedef _Alloc allocator_type; typedef typename traits_type::int_type int_type; typedef typename traits_type::pos_type pos_type; typedef typename traits_type::off_type off_type; public: // Constructors/destructors explicit basic_stringstream(ios_base::openmode __m = ios_base::out | ios_base::in); explicit basic_stringstream(const basic_string<_CharT, _Traits, _Alloc>& __str, ios_base::openmode __m = ios_base::out | ios_base::in); ~basic_stringstream(); // Members: basic_stringbuf<_CharT, _Traits, _Alloc>* rdbuf() const; basic_string<_CharT, _Traits, _Alloc> str() const; void str(const basic_string<_CharT, _Traits, _Alloc>& __s); }; } // namespace std namespace std { %template(istringstream) basic_istringstream; %template(ostringstream) basic_ostringstream; %template(stringstream) basic_stringstream; #if defined(SWIG_WCHAR) %template(wistringstream) basic_istringstream; %template(wostringstream) basic_ostringstream; %template(wstringstream) basic_stringstream; #endif } swig-4.0.1/Lib/std/std_unordered_multimap.i0000644000175000017500000000623113527063513020575 0ustar williamwilliam// // std::unordered_multimap // %include %define %std_unordered_multimap_methods(mmap...) %std_unordered_map_methods_common(mmap); #ifdef SWIG_EXPORT_ITERATOR_METHODS std::pair equal_range(const key_type& x); std::pair equal_range(const key_type& x) const; #endif %enddef // ------------------------------------------------------------------------ // std::unordered_multimap // // const declarations are used to guess the intent of the function being // exported; therefore, the following rationale is applied: // // -- f(std::unordered_multimap), f(const std::unordered_multimap&): // the parameter being read-only, either a sequence or a // previously wrapped std::unordered_multimap can be passed. // -- f(std::unordered_multimap&), f(std::unordered_multimap*): // the parameter may be modified; therefore, only a wrapped std::unordered_multimap // can be passed. // -- std::unordered_multimap f(), const std::unordered_multimap& f(): // the map is returned by copy; therefore, a sequence of T:s // is returned which is most easily used in other functions // -- std::unordered_multimap& f(), std::unordered_multimap* f(): // the map is returned by reference; therefore, a wrapped std::unordered_multimap // is returned // -- const std::unordered_multimap* f(), f(const std::unordered_multimap*): // for consistency, they expect and return a plain map pointer. // ------------------------------------------------------------------------ // exported class namespace std { template, class _Pred = std::equal_to< _Key >, class _Alloc = allocator > > class unordered_multimap { public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef _Key key_type; typedef _Tp mapped_type; typedef std::pair< const _Key, _Tp > value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; typedef _Hash hasher; typedef _Compare key_equal; typedef _Alloc allocator_type; %traits_swigtype(_Key); %traits_swigtype(_Tp); %fragment(SWIG_Traits_frag(std::unordered_multimap< _Key, _Tp, _Hash, _Pred, _Alloc >), "header", fragment=SWIG_Traits_frag(std::pair< _Key, _Tp >), fragment="StdUnorderedMultimapTraits") { namespace swig { template <> struct traits > { typedef pointer_category category; static const char* type_name() { return "std::unordered_multimap<" #_Key "," #_Tp "," #_Hash "," #_Pred "," #_Alloc " >"; } }; } } %typemap_traits_ptr(SWIG_TYPECHECK_MULTIMAP, std::unordered_multimap< _Key, _Tp, _Hash, _Pred, _Alloc >); #ifdef %swig_unordered_multimap_methods // Add swig/language extra methods %swig_unordered_multimap_methods(std::unordered_multimap< _Key, _Tp, _Hash, _Pred, _Alloc >); #endif %std_unordered_multimap_methods(unordered_multimap); }; } swig-4.0.1/Lib/std/std_unordered_set.i0000644000175000017500000000726713527063513017552 0ustar williamwilliam// // std::unordered_set // %include %include // Unordered Set %define %std_unordered_set_methods_common(unordered_set...) unordered_set(); unordered_set(const unordered_set& other); bool empty() const; size_type size() const; void clear(); void swap(unordered_set& v); size_type erase(const key_type& x); size_type count(const key_type& x) const; #ifdef SWIG_EXPORT_ITERATOR_METHODS class iterator; iterator begin(); iterator end(); %extend { // %extend wrapper used for differing definitions of these methods introduced in C++11 void erase(iterator pos) { $self->erase(pos); } void erase(iterator first, iterator last) { $self->erase(first, last); } } iterator find(const key_type& x); std::pair equal_range(const key_type& x); #endif %enddef %define %std_unordered_set_methods(unordered_set...) %std_unordered_set_methods_common(unordered_set); #ifdef SWIG_EXPORT_ITERATOR_METHODS std::pair insert(const value_type& __x); #endif %enddef // ------------------------------------------------------------------------ // std::unordered_set // // const declarations are used to guess the intent of the function being // exported; therefore, the following rationale is applied: // // -- f(std::unordered_set), f(const std::unordered_set&): // the parameter being read-only, either a sequence or a // previously wrapped std::unordered_set can be passed. // -- f(std::unordered_set&), f(std::unordered_set*): // the parameter may be modified; therefore, only a wrapped std::unordered_set // can be passed. // -- std::unordered_set f(), const std::unordered_set& f(): // the unordered_set is returned by copy; therefore, a sequence of Key:s // is returned which is most easily used in other functions // -- std::unordered_set& f(), std::unordered_set* f(): // the unordered_set is returned by reference; therefore, a wrapped std::unordered_set // is returned // -- const std::unordered_set* f(), f(const std::unordered_set*): // for consistency, they expect and return a plain unordered_set pointer. // ------------------------------------------------------------------------ %{ #include %} // exported classes namespace std { template , class _Compare = std::equal_to< _Key >, class _Alloc = allocator< _Key > > class unordered_set { public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef _Key value_type; typedef _Key key_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; typedef _Hash hasher; typedef _Compare key_equal; typedef _Alloc allocator_type; %traits_swigtype(_Key); %fragment(SWIG_Traits_frag(std::unordered_set< _Key, _Hash, _Compare, _Alloc >), "header", fragment=SWIG_Traits_frag(_Key), fragment="StdUnorderedSetTraits") { namespace swig { template <> struct traits > { typedef pointer_category category; static const char* type_name() { return "std::unordered_set<" #_Key "," #_Hash "," #_Compare "," #_Alloc " >"; } }; } } %typemap_traits_ptr(SWIG_TYPECHECK_SET, std::unordered_set< _Key, _Hash, _Compare, _Alloc >); #ifdef %swig_unordered_set_methods // Add swig/language extra methods %swig_unordered_set_methods(std::unordered_set< _Key, _Hash, _Compare, _Alloc >); #endif %std_unordered_set_methods(unordered_set); }; } swig-4.0.1/Lib/std/std_basic_string.i0000644000175000017500000001454413527063513017353 0ustar williamwilliam%include %include %include %include %fragment(""); namespace std { %naturalvar basic_string; } namespace std { template , typename _Alloc = allocator<_CharT> > class basic_string { #if !defined(SWIG_STD_MODERN_STL) || defined(SWIG_STD_NOMODERN_STL) %ignore push_back; %ignore clear; %ignore compare; %ignore append; #endif public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef _CharT value_type; typedef value_type reference; typedef value_type const_reference; typedef _Alloc allocator_type; static const size_type npos; #ifdef SWIG_EXPORT_ITERATOR_METHODS class iterator; class reverse_iterator; class const_iterator; class const_reverse_iterator; #endif %traits_swigtype(_CharT); %fragment(SWIG_Traits_frag(_CharT)); basic_string(const _CharT* __s, size_type __n); // Capacity: size_type length() const; size_type max_size() const; size_type capacity() const; void reserve(size_type __res_arg = 0); // Modifiers: basic_string& append(const basic_string& __str); basic_string& append(const basic_string& __str, size_type __pos, size_type __n); basic_string& append(const _CharT* __s, size_type __n); basic_string& append(size_type __n, _CharT __c); basic_string& assign(const basic_string& __str); basic_string& assign(const basic_string& __str, size_type __pos, size_type __n); basic_string& assign(const _CharT* __s, size_type __n); basic_string& insert(size_type __pos1, const basic_string& __str); basic_string& insert(size_type __pos1, const basic_string& __str, size_type __pos2, size_type __n); basic_string& insert(size_type __pos, const _CharT* __s, size_type __n); basic_string& insert(size_type __pos, size_type __n, _CharT __c); basic_string& erase(size_type __pos = 0, size_type __n = npos); basic_string& replace(size_type __pos, size_type __n, const basic_string& __str); basic_string& replace(size_type __pos1, size_type __n1, const basic_string& __str, size_type __pos2, size_type __n2); basic_string& replace(size_type __pos, size_type __n1, const _CharT* __s, size_type __n2); basic_string& replace(size_type __pos, size_type __n1, size_type __n2, _CharT __c); size_type copy(_CharT* __s, size_type __n, size_type __pos = 0) const; // String operations: const _CharT* c_str() const; size_type find(const _CharT* __s, size_type __pos, size_type __n) const; size_type find(const basic_string& __str, size_type __pos = 0) const; size_type find(_CharT __c, size_type __pos = 0) const; size_type rfind(const basic_string& __str, size_type __pos = npos) const; size_type rfind(const _CharT* __s, size_type __pos, size_type __n) const; size_type rfind(_CharT __c, size_type __pos = npos) const; size_type find_first_of(const basic_string& __str, size_type __pos = 0) const; size_type find_first_of(const _CharT* __s, size_type __pos, size_type __n) const; size_type find_first_of(_CharT __c, size_type __pos = 0) const; size_type find_last_of(const basic_string& __str, size_type __pos = npos) const; size_type find_last_of(const _CharT* __s, size_type __pos, size_type __n) const; size_type find_last_of(_CharT __c, size_type __pos = npos) const; size_type find_first_not_of(const basic_string& __str, size_type __pos = 0) const; size_type find_first_not_of(const _CharT* __s, size_type __pos, size_type __n) const; size_type find_first_not_of(_CharT __c, size_type __pos = 0) const; size_type find_last_not_of(const basic_string& __str, size_type __pos = npos) const; size_type find_last_not_of(const _CharT* __s, size_type __pos, size_type __n) const; size_type find_last_not_of(_CharT __c, size_type __pos = npos) const; basic_string substr(size_type __pos = 0, size_type __n = npos) const; int compare(const basic_string& __str) const; int compare(size_type __pos, size_type __n, const basic_string& __str) const; int compare(size_type __pos1, size_type __n1, const basic_string& __str, size_type __pos2, size_type __n2) const; %ignore pop_back(); %ignore front() const; %ignore back() const; %ignore basic_string(size_type n); %std_sequence_methods_val(basic_string); %ignore pop(); #ifdef %swig_basic_string // Add swig/language extra methods %swig_basic_string(std::basic_string< _CharT, _Traits, _Alloc >); #endif #ifdef SWIG_EXPORT_ITERATOR_METHODS class iterator; class reverse_iterator; class const_iterator; class const_reverse_iterator; void insert(iterator __p, size_type __n, _CharT __c); basic_string& replace(iterator __i1, iterator __i2, const basic_string& __str); basic_string& replace(iterator __i1, iterator __i2, const _CharT* __s, size_type __n); basic_string& replace(iterator __i1, iterator __i2, size_type __n, _CharT __c); basic_string& replace(iterator __i1, iterator __i2, const _CharT* __k1, const _CharT* __k2); basic_string& replace(iterator __i1, iterator __i2, const_iterator __k1, const_iterator __k2); #endif basic_string& operator +=(const basic_string& v); %newobject __add__; %newobject __radd__; %extend { std::basic_string< _CharT,_Traits,_Alloc >* __add__(const basic_string& v) { std::basic_string< _CharT,_Traits,_Alloc >* res = new std::basic_string< _CharT,_Traits,_Alloc >(*self); *res += v; return res; } std::basic_string< _CharT,_Traits,_Alloc >* __radd__(const basic_string& v) { std::basic_string< _CharT,_Traits,_Alloc >* res = new std::basic_string< _CharT,_Traits,_Alloc >(v); *res += *self; return res; } std::basic_string< _CharT,_Traits,_Alloc > __str__() { return *self; } std::basic_ostream<_CharT, std::char_traits<_CharT> >& __rlshift__(std::basic_ostream<_CharT, std::char_traits<_CharT> >& out) { out << *self; return out; } } }; } swig-4.0.1/Lib/std/std_stack.i0000644000175000017500000000662713527063513016014 0ustar williamwilliam/** * @file std_stack.i * @date Sun May 6 01:48:07 2007 * * @brief A wrapping of std::stack for Ruby. * * */ %include // Stack %define %std_stack_methods(stack...) stack(); stack(const _Sequence& other); bool empty() const; size_type size() const; const value_type& top() const; void pop(); void push(const value_type& value); %enddef %define %std_stack_methods_val(stack...) %std_stack_methods(stack) %enddef // ------------------------------------------------------------------------ // std::stack // // const declarations are used to guess the intent of the function being // exported; therefore, the following rationale is applied: // // -- f(std::stack), f(const std::stack&): // the parameter being read-only, either a sequence or a // previously wrapped std::stack can be passed. // -- f(std::stack&), f(std::stack*): // the parameter may be modified; therefore, only a wrapped std::stack // can be passed. // -- std::stack f(), const std::stack& f(): // the stack is returned by copy; therefore, a sequence of T:s // is returned which is most easily used in other functions // -- std::stack& f(), std::stack* f(): // the stack is returned by reference; therefore, a wrapped std::stack // is returned // -- const std::stack* f(), f(const std::stack*): // for consistency, they expect and return a plain stack pointer. // ------------------------------------------------------------------------ %{ #include %} // exported classes namespace std { template > class stack { public: typedef size_t size_type; typedef _Tp value_type; typedef value_type& reference; typedef const value_type& const_reference; typedef _Sequence container_type; %traits_swigtype(_Tp); %fragment(SWIG_Traits_frag(std::stack< _Tp, _Sequence >), "header", fragment=SWIG_Traits_frag(_Tp), fragment="StdStackTraits") { namespace swig { template <> struct traits > { typedef pointer_category category; static const char* type_name() { return "std::stack<" #_Tp "," #_Sequence " >"; } }; } } %typemap_traits_ptr(SWIG_TYPECHECK_STACK, std::stack< _Tp, _Sequence >); #ifdef %swig_stack_methods // Add swig/language extra methods %swig_stack_methods(std::stack< _Tp, _Sequence >); #endif %std_stack_methods(stack); }; template class stack< _Tp*, _Sequence > { public: typedef size_t size_type; typedef _Sequence::value_type value_type; typedef value_type reference; typedef value_type const_reference; typedef _Sequence container_type; %traits_swigtype(_Tp); %fragment(SWIG_Traits_frag(std::stack< _Tp*, _Sequence >), "header", fragment=SWIG_Traits_frag(_Tp), fragment="StdStackTraits") { namespace swig { template <> struct traits > { typedef value_category category; static const char* type_name() { return "std::stack<" #_Tp "," #_Sequence " * >"; } }; } } %typemap_traits_ptr(SWIG_TYPECHECK_STACK, std::stack< _Tp*, _Sequence >); #ifdef %swig_stack_methods_val // Add swig/language extra methods %swig_stack_methods_val(std::stack< _Tp*, _Sequence >); #endif %std_stack_methods_val(stack); }; } swig-4.0.1/Lib/std/std_streambuf.i0000644000175000017500000000332313527063513016665 0ustar williamwilliam%include %{ #ifndef SWIG_STD_NOMODERN_STL #include #else #include #endif %} namespace std { template > class basic_streambuf { public: // Types: typedef _CharT char_type; typedef _Traits traits_type; typedef typename traits_type::int_type int_type; typedef typename traits_type::pos_type pos_type; typedef typename traits_type::off_type off_type; public: virtual ~basic_streambuf(); // Locales: locale pubimbue(const locale &__loc); locale getloc() const; // Buffer and positioning: basic_streambuf<_CharT, _Traits>* pubsetbuf(char_type* __s, streamsize __n); pos_type pubseekoff(off_type __off, ios_base::seekdir __way, ios_base::openmode __mode = std::ios_base::in | std::ios_base::out); pos_type pubseekpos(pos_type __sp, ios_base::openmode __mode = std::ios_base::in | std::ios_base::out); int pubsync() ; // Get and put areas: // Get area: streamsize in_avail(); int_type snextc(); int_type sbumpc(); int_type sgetc(); streamsize sgetn(char_type* __s, streamsize __n); // Putback: int_type sputbackc(char_type __c); int_type sungetc(); // Put area: int_type sputc(char_type __c); streamsize sputn(const char_type* __s, streamsize __n); protected: basic_streambuf(); private: basic_streambuf(const basic_streambuf& other); }; } namespace std { %template(streambuf) basic_streambuf; #if defined(SWIG_WCHAR) %template(wstreambuf) basic_streambuf; #endif } swig-4.0.1/Lib/std/std_common.i0000644000175000017500000001242113527063513016164 0ustar williamwilliam%include // // Use the following macro with modern STL implementations // //#define SWIG_STD_MODERN_STL // // Use this to deactivate the previous definition, when using gcc-2.95 // or similar old compilers. // //#define SWIG_STD_NOMODERN_STL // Here, we identify compilers we know have problems with STL. %{ #if defined(__GNUC__) # if __GNUC__ == 2 && __GNUC_MINOR <= 96 # define SWIG_STD_NOMODERN_STL # endif #endif %} // // Common code for supporting the C++ std namespace // %fragment(""); %fragment(""); %fragment(""); %fragment("StdIteratorTraits","header",fragment="") %{ #if defined(__SUNPRO_CC) && defined(_RWSTD_VER) # if !defined(SWIG_NO_STD_NOITERATOR_TRAITS_STL) # define SWIG_STD_NOITERATOR_TRAITS_STL # endif #endif #if !defined(SWIG_STD_NOITERATOR_TRAITS_STL) #include #else namespace std { template struct iterator_traits { typedef ptrdiff_t difference_type; typedef typename Iterator::value_type value_type; }; template struct iterator_traits<__reverse_bi_iterator > { typedef Distance difference_type; typedef T value_type; }; template struct iterator_traits { typedef T value_type; typedef ptrdiff_t difference_type; }; template inline typename iterator_traits<_InputIterator>::difference_type distance(_InputIterator __first, _InputIterator __last) { typename iterator_traits<_InputIterator>::difference_type __n = 0; while (__first != __last) { ++__first; ++__n; } return __n; } } #endif %} %fragment("StdTraitsCommon","header",fragment="") %{ namespace swig { template struct noconst_traits { typedef Type noconst_type; }; template struct noconst_traits { typedef Type noconst_type; }; /* type categories */ struct pointer_category { }; struct value_category { }; /* General traits that provides type_name and type_info */ template struct traits { }; template inline const char* type_name() { return traits::noconst_type >::type_name(); } template struct traits_info { static swig_type_info *type_query(std::string name) { name += " *"; return SWIG_TypeQuery(name.c_str()); } static swig_type_info *type_info() { static swig_type_info *info = type_query(type_name()); return info; } }; /* Partial specialization for pointers (traits_info) */ template struct traits_info { static swig_type_info *type_query(std::string name) { name += " *"; return SWIG_TypeQuery(name.c_str()); } static swig_type_info *type_info() { static swig_type_info *info = type_query(type_name()); return info; } }; template inline swig_type_info *type_info() { return traits_info::type_info(); } /* Partial specialization for pointers (traits) */ template struct traits { typedef pointer_category category; static std::string make_ptr_name(const char* name) { std::string ptrname = name; ptrname += " *"; return ptrname; } static const char* type_name() { static std::string name = make_ptr_name(swig::type_name()); return name.c_str(); } }; template struct traits_as { }; template struct traits_check { }; } %} /* Generate the traits for a swigtype */ %define %traits_swigtype(Type...) %fragment(SWIG_Traits_frag(Type),"header",fragment="StdTraits") { namespace swig { template <> struct traits< Type > { typedef pointer_category category; static const char* type_name() { return #Type; } }; } } %enddef /* Generate the typemaps for a class that has 'value' traits */ %define %typemap_traits(Code,Type...) %typemaps_asvalfrom(%arg(Code), %arg(swig::asval< Type >), %arg(swig::from), %arg(SWIG_Traits_frag(Type)), %arg(SWIG_Traits_frag(Type)), Type); %enddef /* Generate the typemaps for a class that behaves more like a 'pointer' or plain wrapped Swigtype. */ %define %typemap_traits_ptr(Code,Type...) %typemaps_asptrfrom(%arg(Code), %arg(swig::asptr), %arg(swig::from), %arg(SWIG_Traits_frag(Type)), %arg(SWIG_Traits_frag(Type)), Type); %enddef /* Equality methods */ %define %std_equal_methods(Type...) %extend Type { bool operator == (const Type& v) { return *self == v; } bool operator != (const Type& v) { return *self != v; } } %enddef /* Order methods */ %define %std_order_methods(Type...) %extend Type { bool operator > (const Type& v) { return *self > v; } bool operator < (const Type& v) { return *self < v; } bool operator >= (const Type& v) { return *self >= v; } bool operator <= (const Type& v) { return *self <= v; } } %enddef /* Comparison methods */ %define %std_comp_methods(Type...) %std_equal_methods(Type ) %std_order_methods(Type ) %enddef swig-4.0.1/Lib/std/std_wstreambuf.i0000644000175000017500000000014613527063513017054 0ustar williamwilliam/* Provide 'std_streambuf.i' with wchar support. */ %include %include swig-4.0.1/Lib/std/std_wsstream.i0000644000175000017500000000014213527063513016536 0ustar williamwilliam/* Provide 'std_sstream.i' with wchar support. */ %include %include swig-4.0.1/Lib/std/std_except.i0000644000175000017500000000224713527063513016171 0ustar williamwilliam#if defined(SWIGJAVA) || defined(SWIGCSHARP) #error "do not use this version of std_except.i" #endif %{ #include #include %} #if defined(SWIG_STD_EXCEPTIONS_AS_CLASSES) namespace std { struct exception { virtual ~exception() throw(); virtual const char* what() const throw(); }; struct bad_cast : exception { }; struct bad_exception : exception { }; struct logic_error : exception { logic_error(const string& msg); }; struct domain_error : logic_error { domain_error(const string& msg); }; struct invalid_argument : logic_error { invalid_argument(const string& msg); }; struct length_error : logic_error { length_error(const string& msg); }; struct out_of_range : logic_error { out_of_range(const string& msg); }; struct runtime_error : exception { runtime_error(const string& msg); }; struct range_error : runtime_error { range_error(const string& msg); }; struct overflow_error : runtime_error { overflow_error(const string& msg); }; struct underflow_error : runtime_error { underflow_error(const string& msg); }; } #endif swig-4.0.1/Lib/std/std_queue.i0000644000175000017500000000666113527063513016031 0ustar williamwilliam/** * @file std_queue.i * @date Sun May 6 01:48:07 2007 * * @brief A wrapping of std::queue for Ruby. * * */ %include // Queue %define %std_queue_methods(queue...) queue(); queue(const _Sequence& other); bool empty() const; size_type size() const; const value_type& front() const; const value_type& back() const; void pop(); void push(const value_type& value); %enddef %define %std_queue_methods_val(queue...) %std_queue_methods(queue) %enddef // ------------------------------------------------------------------------ // std::queue // // const declarations are used to guess the intent of the function being // exported; therefore, the following rationale is applied: // // -- f(std::queue), f(const std::queue&): // the parameter being read-only, either a sequence or a // previously wrapped std::queue can be passed. // -- f(std::queue&), f(std::queue*): // the parameter may be modified; therefore, only a wrapped std::queue // can be passed. // -- std::queue f(), const std::queue& f(): // the queue is returned by copy; therefore, a sequence of T:s // is returned which is most easily used in other functions // -- std::queue& f(), std::queue* f(): // the queue is returned by reference; therefore, a wrapped std::queue // is returned // -- const std::queue* f(), f(const std::queue*): // for consistency, they expect and return a plain queue pointer. // ------------------------------------------------------------------------ %{ #include %} // exported classes namespace std { template > class queue { public: typedef size_t size_type; typedef _Tp value_type; typedef value_type& reference; typedef const value_type& const_reference; typedef _Sequence container_type; %traits_swigtype(_Tp); %fragment(SWIG_Traits_frag(std::queue< _Tp, _Sequence >), "header", fragment=SWIG_Traits_frag(_Tp), fragment="StdQueueTraits") { namespace swig { template <> struct traits > { typedef pointer_category category; static const char* type_name() { return "std::queue<" #_Tp "," #_Sequence " >"; } }; } } %typemap_traits_ptr(SWIG_TYPECHECK_QUEUE, std::queue< _Tp, _Sequence >); #ifdef %swig_queue_methods // Add swig/language extra methods %swig_queue_methods(std::queue< _Tp, _Sequence >); #endif %std_queue_methods(queue); }; template class queue< _Tp*, _Sequence > { public: typedef size_t size_type; typedef _Tp value_type; typedef value_type& reference; typedef const value_type& const_reference; typedef _Sequence container_type; %traits_swigtype(_Tp); %fragment(SWIG_Traits_frag(std::queue< _Tp*, _Sequence >), "header", fragment=SWIG_Traits_frag(_Tp), fragment="StdQueueTraits") { namespace swig { template <> struct traits > { typedef value_category category; static const char* type_name() { return "std::queue<" #_Tp "," #_Sequence " * >"; } }; } } %typemap_traits_ptr(SWIG_TYPECHECK_QUEUE, std::queue< _Tp*, _Sequence >); #ifdef %swig_queue_methods_val // Add swig/language extra methods %swig_queue_methods_val(std::queue< _Tp*, _Sequence >); #endif %std_queue_methods_val(queue); }; } swig-4.0.1/Lib/std/std_array.i0000644000175000017500000000504613527063513016017 0ustar williamwilliam// // std::array // %include %define %std_array_methods(array...) %std_sequence_methods_non_resizable(array) void fill(const value_type& u); %enddef %define %std_array_methods_val(array...) %std_sequence_methods_non_resizable_val(array) void fill(const value_type& u); %enddef // ------------------------------------------------------------------------ // std::array // // The aim of all that follows would be to integrate std::array with // as much as possible, namely, to allow the user to pass and // be returned tuples or lists. // const declarations are used to guess the intent of the function being // exported; therefore, the following rationale is applied: // // -- f(std::array), f(const std::array&): // the parameter being read-only, either a sequence or a // previously wrapped std::array can be passed. // -- f(std::array&), f(std::array*): // the parameter may be modified; therefore, only a wrapped std::array // can be passed. // -- std::array f(), const std::array& f(): // the array is returned by copy; therefore, a sequence of T:s // is returned which is most easily used in other functions // -- std::array& f(), std::array* f(): // the array is returned by reference; therefore, a wrapped std::array // is returned // -- const std::array* f(), f(const std::array*): // for consistency, they expect and return a plain array pointer. // ------------------------------------------------------------------------ // exported classes namespace std { template class array { public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef _Tp value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; %traits_swigtype(_Tp); %traits_enum(_Tp); %fragment(SWIG_Traits_frag(std::array< _Tp, _Nm >), "header", fragment=SWIG_Traits_frag(_Tp), fragment="StdArrayTraits") { namespace swig { template <> struct traits > { typedef pointer_category category; static const char* type_name() { return "std::array<" #_Tp "," #_Nm " >"; } }; } } %typemap_traits_ptr(SWIG_TYPECHECK_STDARRAY, std::array< _Tp, _Nm >); #ifdef %swig_array_methods // Add swig/language extra methods %swig_array_methods(std::array< _Tp, _Nm >); #endif %std_array_methods(array); }; } swig-4.0.1/Lib/std/std_pair.i0000644000175000017500000000723513527063513015636 0ustar williamwilliam%include %{ #include %} namespace std { template struct pair { typedef T first_type; typedef U second_type; %traits_swigtype(T); %traits_swigtype(U); %fragment(SWIG_Traits_frag(std::pair< T, U >), "header", fragment=SWIG_Traits_frag(T), fragment=SWIG_Traits_frag(U), fragment="StdPairTraits") { namespace swig { template <> struct traits > { typedef pointer_category category; static const char* type_name() { return "std::pair<" #T "," #U " >"; } }; } } #ifndef SWIG_STD_PAIR_ASVAL %typemap_traits_ptr(SWIG_TYPECHECK_PAIR, std::pair< T, U >); #else %typemap_traits(SWIG_TYPECHECK_PAIR, std::pair< T, U >); #endif pair(); pair(T first, U second); pair(const pair& other); template pair(const pair< U1, U2 > &other); T first; U second; #ifdef %swig_pair_methods // Add swig/language extra methods %swig_pair_methods(std::pair< T, U >) #endif }; // *** // The following specializations should disappear or get // simplified when a 'const SWIGTYPE*&' can be defined // *** template struct pair< T, U* > { typedef T first_type; typedef U* second_type; %traits_swigtype(T); %traits_swigtype(U); %fragment(SWIG_Traits_frag(std::pair< T, U* >), "header", fragment=SWIG_Traits_frag(T), fragment=SWIG_Traits_frag(U), fragment="StdPairTraits") { namespace swig { template <> struct traits > { typedef pointer_category category; static const char* type_name() { return "std::pair<" #T "," #U " * >"; } }; } } %typemap_traits_ptr(SWIG_TYPECHECK_PAIR, std::pair< T, U* >); pair(); pair(T first, U* second); pair(const pair& other); T first; U* second; #ifdef %swig_pair_methods // Add swig/language extra methods %swig_pair_methods(std::pair< T, U* >) #endif }; template struct pair< T*, U > { typedef T* first_type; typedef U second_type; %traits_swigtype(T); %traits_swigtype(U); %fragment(SWIG_Traits_frag(std::pair< T*, U >), "header", fragment=SWIG_Traits_frag(T), fragment=SWIG_Traits_frag(U), fragment="StdPairTraits") { namespace swig { template <> struct traits > { typedef pointer_category category; static const char* type_name() { return "std::pair<" #T " *," #U " >"; } }; } } %typemap_traits_ptr(SWIG_TYPECHECK_PAIR, std::pair< T*, U >); pair(); pair(T* first, U second); pair(const pair& other); T* first; U second; #ifdef %swig_pair_methods // Add swig/language extra methods %swig_pair_methods(std::pair< T*, U >) #endif }; template struct pair< T*, U* > { typedef T* first_type; typedef U* second_type; %traits_swigtype(T); %traits_swigtype(U); %fragment(SWIG_Traits_frag(std::pair< T*, U* >), "header", fragment=SWIG_Traits_frag(T), fragment=SWIG_Traits_frag(U), fragment="StdPairTraits") { namespace swig { template <> struct traits > { typedef pointer_category category; static const char* type_name() { return "std::pair<" #T " *," #U " * >"; } }; } } %typemap_traits(SWIG_TYPECHECK_PAIR, std::pair< T*, U* >); pair(); pair(T* first, U* second); pair(const pair& other); T* first; U* second; #ifdef %swig_pair_methods // Add swig/language extra methods %swig_pair_methods(std::pair< T*, U* >) #endif }; } swig-4.0.1/Lib/std/_std_deque.i0000644000175000017500000001052513527063513016141 0ustar williamwilliam/* ----------------------------------------------------------------------------- * _std_deque.i * * This file contains a generic definition of std::deque along with * some helper functions. Specific language modules should include * this file to generate wrappers. * ----------------------------------------------------------------------------- */ %include %{ #include #include %} /* This macro defines all of the standard methods for a deque. This is defined as a macro to simplify the task of specialization. For example, template<> class deque { public: %std_deque_methods(int); }; */ %define %std_deque_methods_noempty(T...) typedef size_t size_type; typedef ptrdiff_t difference_type; typedef T value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; deque(); deque(unsigned int size, const T& value=T()); deque(const deque< T > &); ~deque(); void assign(unsigned int n, const T& value); void swap(deque< T > &x); unsigned int size() const; unsigned int max_size() const; void resize(unsigned int n, T c = T()); const_reference front(); const_reference back(); void push_front(const T& x); void push_back(const T& x); void pop_front(); void pop_back(); void clear(); /* Some useful extensions */ %extend { const_reference getitem(int i) throw (std::out_of_range) { int size = int(self->size()); if (i<0) i += size; if (i>=0 && isize()); if (i<0) i+= size; if (i>=0 && isize()); if (i<0) i+= size; if (i>=0 && ierase(self->begin()+i); } else { throw std::out_of_range("deque index out of range"); } } std::deque< T > getslice(int i, int j) { int size = int(self->size()); if (i<0) i = size+i; if (j<0) j = size+j; if (i<0) i = 0; if (j>size) j = size; std::deque< T > tmp(j-i); std::copy(self->begin()+i,self->begin()+j,tmp.begin()); return tmp; } void setslice(int i, int j, const std::deque< T >& v) { int size = int(self->size()); if (i<0) i = size+i; if (j<0) j = size+j; if (i<0) i = 0; if (j>size) j = size; if (int(v.size()) == j-i) { std::copy(v.begin(),v.end(),self->begin()+i); } else { self->erase(self->begin()+i,self->begin()+j); if (i+1 <= size) self->insert(self->begin()+i+1,v.begin(),v.end()); else self->insert(self->end(),v.begin(),v.end()); } } void delslice(int i, int j) { int size = int(self->size()); if (i<0) i = size+i; if (j<0) j = size+j; if (i<0) i = 0; if (j>size) j = size; self->erase(self->begin()+i,self->begin()+j); } }; %enddef #ifdef SWIGPHP %define %std_deque_methods(T...) %extend { bool is_empty() const { return self->empty(); } }; %std_deque_methods_noempty(T) %enddef #else %define %std_deque_methods(T...) bool empty() const; %std_deque_methods_noempty(T) %enddef #endif namespace std { template class deque { public: %std_deque_methods(T); }; } swig-4.0.1/Lib/std/std_wios.i0000644000175000017500000000013213527063513015651 0ustar williamwilliam/* Provide 'std_ios.i' with wchar support. */ %include %include swig-4.0.1/Lib/std/std_char_traits.i0000644000175000017500000000616613527063513017210 0ustar williamwilliam%include #if defined(SWIG_WCHAR) %include #endif namespace std { /// 21.1.2 Basis for explicit _Traits specialization /// NB: That for any given actual character type this definition is /// probably wrong. template struct char_traits { }; /// 21.1.4 char_traits specializations template<> struct char_traits { typedef char char_type; typedef int int_type; typedef streampos pos_type; typedef streamoff off_type; typedef mbstate_t state_type; static void assign(char_type& __c1, const char_type& __c2); static bool eq(const char_type& __c1, const char_type& __c2); static bool lt(const char_type& __c1, const char_type& __c2); static int compare(const char_type* __s1, const char_type* __s2, size_t __n); static size_t length(const char_type* __s); static const char_type* find(const char_type* __s, size_t __n, const char_type& __a); static char_type* move(char_type* __s1, const char_type* __s2, size_t __n); static char_type* copy(char_type* __s1, const char_type* __s2, size_t __n); static char_type* assign(char_type* __s, size_t __n, char_type __a); static char_type to_char_type(const int_type& __c); // To keep both the byte 0xff and the eof symbol 0xffffffff // from ending up as 0xffffffff. static int_type to_int_type(const char_type& __c); static bool eq_int_type(const int_type& __c1, const int_type& __c2); static int_type eof() ; static int_type not_eof(const int_type& __c); }; #if defined(SWIG_WCHAR) template<> struct char_traits { typedef wchar_t char_type; typedef wint_t int_type; typedef streamoff off_type; typedef wstreampos pos_type; typedef mbstate_t state_type; static void assign(char_type& __c1, const char_type& __c2); static bool eq(const char_type& __c1, const char_type& __c2); static bool lt(const char_type& __c1, const char_type& __c2); static int compare(const char_type* __s1, const char_type* __s2, size_t __n); static size_t length(const char_type* __s); static const char_type* find(const char_type* __s, size_t __n, const char_type& __a); static char_type* move(char_type* __s1, const char_type* __s2, int_type __n); static char_type* copy(char_type* __s1, const char_type* __s2, size_t __n); static char_type* assign(char_type* __s, size_t __n, char_type __a); static char_type to_char_type(const int_type& __c) ; static int_type to_int_type(const char_type& __c) ; static bool eq_int_type(const int_type& __c1, const int_type& __c2); static int_type eof() ; static int_type not_eof(const int_type& __c); }; #endif } namespace std { #ifndef SWIG_STL_WRAP_TRAITS %template() char_traits; #if defined(SWIG_WCHAR) %template() char_traits; #endif #else %template(char_traits_c) char_traits; #if defined(SWIG_WCHAR) %template(char_traits_w) char_traits; #endif #endif } swig-4.0.1/Lib/std/README0000644000175000017500000000117213527063513014531 0ustar williamwilliam/* ----------------------------------------------------------------------------- * C++ STD + STL * ----------------------------------------------------------------------------- */ std_common.i general common code std_container.i general container code std_basic_string.i basic string std_char_traits.i char traits std_complex.i complex std_deque.i deque std_except.i exceptions std_ios.i ios std_iostream.i istream/ostream std_list.i list std_map.i map std_multimap.i multimap std_multiset.i multiset std_pair.i pair std_set.i set std_streambuf.i streambuf std_vector.i vector std_vectora.i vector + allocator swig-4.0.1/Lib/std/std_list.i0000644000175000017500000000745613527063513015663 0ustar williamwilliam// // std::list // %include // List %define %std_list_methods(list...) %std_sequence_methods(list) void pop_front(); void push_front(const value_type& x); void reverse(); %enddef %define %std_list_methods_val(list...) %std_sequence_methods_val(list) void pop_front(); void push_front(value_type x); void remove(value_type x); void unique(); void reverse(); void sort(); void merge(list& x); %enddef // ------------------------------------------------------------------------ // std::list // // const declarations are used to guess the intent of the function being // exported; therefore, the following rationale is applied: // // -- f(std::list), f(const std::list&): // the parameter being read-only, either a sequence or a // previously wrapped std::list can be passed. // -- f(std::list&), f(std::list*): // the parameter may be modified; therefore, only a wrapped std::list // can be passed. // -- std::list f(), const std::list& f(): // the list is returned by copy; therefore, a sequence of T:s // is returned which is most easily used in other functions // -- std::list& f(), std::list* f(): // the list is returned by reference; therefore, a wrapped std::list // is returned // -- const std::list* f(), f(const std::list*): // for consistency, they expect and return a plain list pointer. // ------------------------------------------------------------------------ %{ #include %} // exported classes namespace std { template > class list { public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef _Tp value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; typedef _Alloc allocator_type; %traits_swigtype(_Tp); %fragment(SWIG_Traits_frag(std::list< _Tp, _Alloc >), "header", fragment=SWIG_Traits_frag(_Tp), fragment="StdListTraits") { namespace swig { template <> struct traits > { typedef pointer_category category; static const char* type_name() { return "std::list<" #_Tp ", " #_Alloc " >"; } }; } } %typemap_traits_ptr(SWIG_TYPECHECK_LIST, std::list< _Tp, _Alloc >); #ifdef %swig_list_methods // Add swig/language extra methods %swig_list_methods(std::list< _Tp, _Alloc >); #endif %std_list_methods(list); }; template class list< _Tp*, _Alloc> { public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef _Tp* value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; typedef _Alloc allocator_type; %traits_swigtype(_Tp); %fragment(SWIG_Traits_frag(std::list< _Tp*, _Alloc >), "header", fragment=SWIG_Traits_frag(_Tp), fragment="StdListTraits") { namespace swig { template <> struct traits > { typedef value_category category; static const char* type_name() { return "std::list<" #_Tp " *," #_Alloc " >"; } }; } } %typemap_traits_ptr(SWIG_TYPECHECK_LIST, std::list< _Tp*, _Alloc >); #ifdef %swig_list_methods_val // Add swig/language extra methods %swig_list_methods_val(std::list< _Tp*, _Alloc >); #endif %std_list_methods_val(list); }; } %define %std_extequal_list(...) %extend std::list< __VA_ARGS__ > { void remove(const value_type& x) { self->remove(x); } void merge(std::list< __VA_ARGS__ >& x){ self->merge(x); } void unique() { self->unique(); } void sort() { self->sort(); } } %enddef swig-4.0.1/Lib/std/std_iostream.i0000644000175000017500000002124713527063513016525 0ustar williamwilliam/* For wchar support, you need to include the wchar.i file before this file, ie: %include %include or equivalently, just include %include */ %include %include %include #if defined(SWIG_WCHAR) %include #endif %{ #include %} namespace std { // 27.6.2.1 Template class basic_ostream template > class basic_ostream : virtual public basic_ios<_CharT, _Traits> { public: // Types (inherited from basic_ios (27.4.4)): typedef _CharT char_type; typedef typename _Traits::int_type int_type; typedef typename _Traits::pos_type pos_type; typedef typename _Traits::off_type off_type; typedef _Traits traits_type; // 27.6.2.2 Constructor/destructor: explicit basic_ostream(basic_streambuf<_CharT, _Traits>* __sb); virtual ~basic_ostream(); // 27.6.2.5 Formatted output: // 27.6.2.5.3 basic_ostream::operator<< basic_ostream<_CharT, _Traits>& operator<<(basic_ostream<_CharT, _Traits>& (*__pf)(basic_ostream<_CharT, _Traits>&)); basic_ostream<_CharT, _Traits>& operator<<(basic_ios<_CharT, _Traits>& (*__pf)(basic_ios<_CharT, _Traits>&)); basic_ostream<_CharT, _Traits>& operator<<(ios_base& (*__pf) (ios_base&)); // 27.6.2.5.2 Arithmetic Inserters basic_ostream<_CharT, _Traits>& operator<<(long __n); basic_ostream<_CharT, _Traits>& operator<<(unsigned long __n); basic_ostream<_CharT, _Traits>& operator<<(bool __n); basic_ostream<_CharT, _Traits>& operator<<(short __n); basic_ostream<_CharT, _Traits>& operator<<(unsigned short __n); basic_ostream<_CharT, _Traits>& operator<<(int __n); basic_ostream<_CharT, _Traits>& operator<<(unsigned int __n); basic_ostream<_CharT, _Traits>& operator<<(long long __n); basic_ostream<_CharT, _Traits>& operator<<(unsigned long long __n); basic_ostream<_CharT, _Traits>& operator<<(double __f); basic_ostream<_CharT, _Traits>& operator<<(float __f); basic_ostream<_CharT, _Traits>& operator<<(long double __f); basic_ostream<_CharT, _Traits>& operator<<(const void* __p); basic_ostream<_CharT, _Traits>& operator<<(basic_streambuf<_CharT, _Traits>* __sb); %extend { std::basic_ostream<_CharT, _Traits >& operator<<(const std::basic_string<_CharT,_Traits, std::allocator<_CharT> >& s) { *self << s; return *self; } } // Unformatted output: basic_ostream<_CharT, _Traits>& put(char_type __c); basic_ostream<_CharT, _Traits>& write(const char_type* __s, streamsize __n); basic_ostream<_CharT, _Traits>& flush(); // Seeks: pos_type tellp(); basic_ostream<_CharT, _Traits>& seekp(pos_type); basic_ostream<_CharT, _Traits>& seekp(off_type, ios_base::seekdir); }; // 27.6.1.1 Template class basic_istream template > class basic_istream : virtual public basic_ios<_CharT, _Traits> { public: // Types (inherited from basic_ios (27.4.4)): typedef _CharT char_type; typedef typename _Traits::int_type int_type; typedef typename _Traits::pos_type pos_type; typedef typename _Traits::off_type off_type; typedef _Traits traits_type; public: // 27.6.1.1.1 Constructor/destructor: explicit basic_istream(basic_streambuf<_CharT, _Traits>* __sb); virtual ~basic_istream(); // 27.6.1.2.3 basic_istream::operator>> basic_istream<_CharT, _Traits>& operator>>(basic_istream<_CharT, _Traits>& (*__pf)(basic_istream<_CharT, _Traits>&)); basic_istream<_CharT, _Traits>& operator>>(basic_ios<_CharT, _Traits>& (*__pf)(basic_ios<_CharT, _Traits>&)); basic_istream<_CharT, _Traits>& operator>>(ios_base& (*__pf)(ios_base&)); // 27.6.1.2.2 Arithmetic Extractors basic_istream<_CharT, _Traits>& operator>>(bool& __n); basic_istream<_CharT, _Traits>& operator>>(short& __n); basic_istream<_CharT, _Traits>& operator>>(unsigned short& __n); basic_istream<_CharT, _Traits>& operator>>(int& __n); basic_istream<_CharT, _Traits>& operator>>(unsigned int& __n); basic_istream<_CharT, _Traits>& operator>>(long& __n); basic_istream<_CharT, _Traits>& operator>>(unsigned long& __n); basic_istream<_CharT, _Traits>& operator>>(long long& __n); basic_istream<_CharT, _Traits>& operator>>(unsigned long long& __n); basic_istream<_CharT, _Traits>& operator>>(float& __f); basic_istream<_CharT, _Traits>& operator>>(double& __f); basic_istream<_CharT, _Traits>& operator>>(long double& __f); basic_istream<_CharT, _Traits>& operator>>(void*& __p); basic_istream<_CharT, _Traits>& operator>>(basic_streambuf<_CharT, _Traits>* __sb); // 27.6.1.3 Unformatted input: inline streamsize gcount(void) const; int_type get(void); basic_istream<_CharT, _Traits>& get(char_type& __c); basic_istream<_CharT, _Traits>& get(char_type* __s, streamsize __n, char_type __delim); inline basic_istream<_CharT, _Traits>& get(char_type* __s, streamsize __n); basic_istream<_CharT, _Traits>& get(basic_streambuf<_CharT, _Traits>& __sb, char_type __delim); inline basic_istream<_CharT, _Traits>& get(basic_streambuf<_CharT, _Traits>& __sb); basic_istream<_CharT, _Traits>& getline(char_type* __s, streamsize __n, char_type __delim); inline basic_istream<_CharT, _Traits>& getline(char_type* __s, streamsize __n); basic_istream<_CharT, _Traits>& ignore(streamsize __n = 1, int_type __delim = _Traits::eof()); int_type peek(void); basic_istream<_CharT, _Traits>& read(char_type* __s, streamsize __n); streamsize readsome(char_type* __s, streamsize __n); basic_istream<_CharT, _Traits>& putback(char_type __c); basic_istream<_CharT, _Traits>& unget(void); int sync(void); pos_type tellg(void); basic_istream<_CharT, _Traits>& seekg(pos_type); basic_istream<_CharT, _Traits>& seekg(off_type, ios_base::seekdir); }; // 27.6.1.5 Template class basic_iostream template > class basic_iostream : public basic_istream<_CharT, _Traits>, public basic_ostream<_CharT, _Traits> { public: typedef _CharT char_type; typedef typename _Traits::int_type int_type; typedef typename _Traits::pos_type pos_type; typedef typename _Traits::off_type off_type; typedef _Traits traits_type; explicit basic_iostream(basic_streambuf<_CharT, _Traits>* __sb); virtual ~basic_iostream(); }; typedef basic_ostream ostream ; typedef basic_istream istream; typedef basic_iostream iostream; extern istream cin; extern ostream cout; extern ostream cerr; extern ostream clog; #if defined(SWIG_WCHAR) typedef basic_ostream wostream; typedef basic_istream wistream; typedef basic_iostream wiostream; extern wistream wcin; extern wostream wcout; extern wostream wcerr; extern wostream wclog; #endif template > std::basic_ostream<_CharT, _Traits>& endl(std::basic_ostream<_CharT, _Traits>& value); template > std::basic_ostream<_CharT, _Traits>& ends(std::basic_ostream<_CharT, _Traits>& value); template > std::basic_ostream<_CharT, _Traits>& flush(std::basic_ostream<_CharT, _Traits>& value); } namespace std { %template(ostream) basic_ostream; %template(istream) basic_istream; %template(iostream) basic_iostream; %template(endl) endl >; %template(ends) ends >; %template(flush) flush >; #if defined(SWIG_WCHAR) %template(wostream) basic_ostream; %template(wistream) basic_istream; %template(wiostream) basic_iostream; %template(wendl) endl >; %template(wends) ends >; %template(wflush) flush >; #endif } swig-4.0.1/Lib/std/std_vectora.i0000644000175000017500000000022313527063513016334 0ustar williamwilliam// // We keep this file only for backward compatibility, since std_vector.i // now uses the std::allocator parameter. // %include swig-4.0.1/Lib/std/std_string.i0000644000175000017500000000033313527063513016201 0ustar williamwilliam%include /* plain strings */ namespace std { %std_comp_methods(basic_string); %naturalvar string; typedef basic_string string; } %template(string) std::basic_string; swig-4.0.1/Lib/std/std_ios.i0000644000175000017500000001216613527063513015474 0ustar williamwilliam%include %include %include %{ #ifndef SWIG_STD_NOMODERN_STL # include #else # include #endif %} namespace std { template > class basic_streambuf; template > class basic_istream; template > class basic_ostream; // 27.4.2 Class ios_base typedef size_t streamsize; class locale; class ios_base { public: #ifdef SWIG_NESTED_CLASSES // 27.4.2.1.1 Class ios_base::failure class failure : public exception { public: explicit failure(const string& __str) throw(); }; #endif // 27.4.2.1.2 Type ios_base::fmtflags typedef int fmtflags; // 27.4.2.1.2 Type fmtflags static const fmtflags boolalpha ; static const fmtflags dec ; static const fmtflags fixed ; static const fmtflags hex ; static const fmtflags internal ; static const fmtflags left ; static const fmtflags oct ; static const fmtflags right ; static const fmtflags scientific ; static const fmtflags showbase ; static const fmtflags showpoint ; static const fmtflags showpos ; static const fmtflags skipws ; static const fmtflags unitbuf ; static const fmtflags uppercase ; static const fmtflags adjustfield ; static const fmtflags basefield ; static const fmtflags floatfield ; // 27.4.2.1.3 Type ios_base::iostate typedef int iostate; static const iostate badbit ; static const iostate eofbit ; static const iostate failbit ; static const iostate goodbit ; // 27.4.2.1.4 Type openmode typedef int openmode; static const openmode app ; static const openmode ate ; static const openmode binary ; static const openmode in ; static const openmode out ; static const openmode trunc ; // 27.4.2.1.5 Type seekdir typedef int seekdir; static const seekdir beg ; static const seekdir cur ; static const seekdir end ; // Callbacks; enum event { erase_event, imbue_event, copyfmt_event }; typedef void (*event_callback) (event, ios_base&, int); void register_callback(event_callback __fn, int __index); // Fmtflags state: inline fmtflags flags() const ; inline fmtflags flags(fmtflags __fmtfl); inline fmtflags setf(fmtflags __fmtfl); inline fmtflags setf(fmtflags __fmtfl, fmtflags __mask); inline void unsetf(fmtflags __mask) ; inline streamsize precision() const ; inline streamsize precision(streamsize __prec); inline streamsize width() const ; inline streamsize width(streamsize __wide); static bool sync_with_stdio(bool __sync = true); // Locales: locale imbue(const locale& __loc); inline locale getloc() const { return _M_ios_locale; } // Storage: static int xalloc() throw(); inline long& iword(int __ix); inline void*& pword(int __ix); // Destructor ~ios_base(); protected: ios_base(); //50. Copy constructor and assignment operator of ios_base private: ios_base(const ios_base& other); ios_base& operator=(const ios_base& other); }; template > class basic_ios : public ios_base { public: // Types: typedef _CharT char_type; typedef typename _Traits::int_type int_type; typedef typename _Traits::pos_type pos_type; typedef typename _Traits::off_type off_type; typedef _Traits traits_type; public: iostate rdstate() const; void clear(iostate __state = goodbit); void setstate(iostate __state); bool good() const; bool eof() const; bool fail() const; bool bad() const; iostate exceptions() const; void exceptions(iostate __except); // Constructor/destructor: explicit basic_ios(basic_streambuf<_CharT, _Traits>* __sb) : ios_base(); virtual ~basic_ios() ; // Members: basic_ostream<_CharT, _Traits>* tie() const; basic_ostream<_CharT, _Traits>* tie(basic_ostream<_CharT, _Traits>* __tiestr); basic_streambuf<_CharT, _Traits>* rdbuf() const; basic_streambuf<_CharT, _Traits>* rdbuf(basic_streambuf<_CharT, _Traits>* __sb); basic_ios& copyfmt(const basic_ios& __rhs); char_type fill() const; char_type fill(char_type __ch); // Locales: locale imbue(const locale& __loc); char narrow(char_type __c, char __dfault) const; char_type widen(char __c) const; protected: // 27.4.5.1 basic_ios constructors basic_ios(); private: basic_ios(const basic_ios& other); basic_ios& operator=(const basic_ios& other); }; } namespace std { typedef basic_ios ios; %template(ios) basic_ios; #if defined(SWIG_WCHAR) typedef basic_ios wios; %template(wios) basic_ios; #endif } swig-4.0.1/Lib/std/std_map.i0000644000175000017500000000714313527063513015456 0ustar williamwilliam// // std::map // %include %include %define %std_map_methods_common(map...) %std_container_methods(map); size_type erase(const key_type& x); size_type count(const key_type& x) const; #ifdef SWIG_EXPORT_ITERATOR_METHODS %extend { // %extend wrapper used for differing definitions of these methods introduced in C++11 void erase(iterator position) { $self->erase(position); } void erase(iterator first, iterator last) { $self->erase(first, last); } } iterator find(const key_type& x); iterator lower_bound(const key_type& x); iterator upper_bound(const key_type& x); #endif %enddef %define %std_map_methods(map...) %std_map_methods_common(map); #ifdef SWIG_EXPORT_ITERATOR_METHODS // iterator insert(const value_type& x); #endif %enddef // ------------------------------------------------------------------------ // std::map // // const declarations are used to guess the intent of the function being // exported; therefore, the following rationale is applied: // // -- f(std::map), f(const std::map&): // the parameter being read-only, either a sequence or a // previously wrapped std::map can be passed. // -- f(std::map&), f(std::map*): // the parameter may be modified; therefore, only a wrapped std::map // can be passed. // -- std::map f(), const std::map& f(): // the map is returned by copy; therefore, a sequence of T:s // is returned which is most easily used in other functions // -- std::map& f(), std::map* f(): // the map is returned by reference; therefore, a wrapped std::map // is returned // -- const std::map* f(), f(const std::map*): // for consistency, they expect and return a plain map pointer. // ------------------------------------------------------------------------ %{ #include %} %fragment(""); %fragment(""); // exported class namespace std { template, class _Alloc = allocator > > class map { public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef _Key key_type; typedef _Tp mapped_type; typedef std::pair< const _Key, _Tp > value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; typedef _Alloc allocator_type; %traits_swigtype(_Key); %traits_swigtype(_Tp); %fragment(SWIG_Traits_frag(std::pair< _Key, _Tp >), "header", fragment=SWIG_Traits_frag(_Key), fragment=SWIG_Traits_frag(_Tp), fragment="StdPairTraits") { namespace swig { template <> struct traits > { typedef pointer_category category; static const char* type_name() { return "std::pair<" #_Key "," #_Tp " >"; } }; } } %fragment(SWIG_Traits_frag(std::map< _Key, _Tp, _Compare, _Alloc >), "header", fragment=SWIG_Traits_frag(std::pair< _Key, _Tp >), fragment="StdMapTraits") { namespace swig { template <> struct traits > { typedef pointer_category category; static const char* type_name() { return "std::map<" #_Key "," #_Tp "," #_Compare "," #_Alloc " >"; } }; } } %typemap_traits_ptr(SWIG_TYPECHECK_MAP, std::map< _Key, _Tp, _Compare, _Alloc >); map(const _Compare& other); #ifdef %swig_map_methods // Add swig/language extra methods %swig_map_methods(std::map< _Key, _Tp, _Compare, _Alloc >); #endif %std_map_methods(map); }; } swig-4.0.1/Lib/uffi/0000755000175000017500000000000013527063513014007 5ustar williamwilliamswig-4.0.1/Lib/uffi/uffi.swg0000644000175000017500000000621613527063513015467 0ustar williamwilliam/* Define a C preprocessor symbol that can be used in interface files to distinguish between the SWIG language modules. */ #define SWIG_UFFI /* Typespecs for basic types. */ %typemap(ffitype) char ":char"; %typemap(ffitype) unsigned char ":unsigned-char"; %typemap(ffitype) signed char ":char"; %typemap(ffitype) short ":short"; %typemap(ffitype) signed short ":short"; %typemap(ffitype) unsigned short ":unsigned-short"; %typemap(ffitype) int ":int"; %typemap(ffitype) signed int ":int"; %typemap(ffitype) unsigned int ":unsigned-int"; %typemap(ffitype) long ":long"; %typemap(ffitype) signed long ":long"; %typemap(ffitype) unsigned long ":unsigned-long"; %typemap(ffitype) float ":float"; %typemap(ffitype) double ":double"; %typemap(ffitype) char * ":cstring"; %typemap(ffitype) void * ":pointer-void"; %typemap(ffitype) void ":void"; // FIXME: This is guesswork typedef long size_t; %wrapper %{ (eval-when (compile eval) ;;; You can define your own identifier converter if you want. ;;; Use the -identifier-converter command line argument to ;;; specify its name. (defun identifier-convert-null (id &key type) (declare (ignore type)) (read-from-string id)) (defun identifier-convert-lispify (cname &key type) (assert (stringp cname)) (if (eq type :constant) (setf cname (format nil "*~A*" cname))) (setf cname (replace-regexp cname "_" "-")) (let ((lastcase :other) newcase char res) (dotimes (n (length cname)) (setf char (schar cname n)) (if* (alpha-char-p char) then (setf newcase (if (upper-case-p char) :upper :lower)) (when (or (and (eq lastcase :upper) (eq newcase :lower)) (and (eq lastcase :lower) (eq newcase :upper))) ;; case change... add a dash (push #\- res) (setf newcase :other)) (push (char-downcase char) res) (setf lastcase newcase) else (push char res) (setf lastcase :other))) (read-from-string (coerce (nreverse res) 'string)))) (defun identifier-convert-low-level (cname &key type) (assert (stringp cname)) (if (eq type :constant) (setf cname (format nil "+~A+" cname))) (setf cname (substitute #\- #\_ cname)) (if (eq type :operator) (setf cname (format nil "%~A" cname))) (if (eq type :constant-function) nil) (read-from-string cname)) (defmacro swig-defconstant (string value &key (export T)) (let ((symbol (funcall *swig-identifier-converter* string :type :constant))) `(eval-when (compile load eval) (uffi:def-constant ,symbol ,value ,export)))) (defmacro swig-defun (name &rest rest) (let ((symbol (funcall *swig-identifier-converter* name :type :operator))) `(eval-when (compile load eval) (uffi:def-function (,name ,symbol) ,@rest) (export (quote ,symbol))))) (defmacro swig-def-struct (name &rest fields) "Declare a struct object" (let ((symbol (funcall *swig-identifier-converter* name :type :type))) `(eval-when (compile load eval) (uffi:def-struct ,symbol ,@fields) (export (quote ,symbol))))) ) ;; eval-when %} swig-4.0.1/Lib/cffi/0000755000175000017500000000000013527063513013765 5ustar williamwilliamswig-4.0.1/Lib/cffi/cffi.swg0000644000175000017500000002323413527063513015422 0ustar williamwilliam/* Define a C preprocessor symbol that can be used in interface files to distinguish between the SWIG language modules. */ #define SWIG_CFFI /* Typespecs for basic types. */ %typemap(cin) void ":void"; %typemap(cin) char ":char"; %typemap(cin) char * ":string"; %typemap(cin) unsigned char ":unsigned-char"; %typemap(cin) signed char ":char"; %typemap(cin) short ":short"; %typemap(cin) signed short ":short"; %typemap(cin) unsigned short ":unsigned-short"; %typemap(cin) int ":int"; %typemap(cin) signed int ":int"; %typemap(cin) unsigned int ":unsigned-int"; %typemap(cin) long ":long"; %typemap(cin) signed long ":long"; %typemap(cin) unsigned long ":unsigned-long"; %typemap(cin) long long ":long-long"; %typemap(cin) signed long long ":long-long"; %typemap(cin) unsigned long long ":unsigned-long-long"; %typemap(cin) float ":float"; %typemap(cin) double ":double"; %typemap(cin) SWIGTYPE ":pointer"; %typemap(cout) void ":void"; %typemap(cout) char ":char"; %typemap(cout) char * ":string"; %typemap(cout) unsigned char ":unsigned-char"; %typemap(cout) signed char ":char"; %typemap(cout) short ":short"; %typemap(cout) signed short ":short"; %typemap(cout) unsigned short ":unsigned-short"; %typemap(cout) int ":int"; %typemap(cout) signed int ":int"; %typemap(cout) unsigned int ":unsigned-int"; %typemap(cout) long ":long"; %typemap(cout) signed long ":long"; %typemap(cout) unsigned long ":unsigned-long"; %typemap(cout) long long ":long-long"; %typemap(cout) signed long long ":long-long"; %typemap(cout) unsigned long long ":unsigned-long-long"; %typemap(cout) float ":float"; %typemap(cout) double ":double"; %typemap(cout) SWIGTYPE ":pointer"; %typemap(ctype) bool "int"; %typemap(ctype) char, unsigned char, signed char, short, signed short, unsigned short, int, signed int, unsigned int, long, signed long, unsigned long, float, double, long double, char *, void *, void, enum SWIGTYPE, SWIGTYPE *, SWIGTYPE[ANY], SWIGTYPE &, SWIGTYPE && "$1_ltype"; %typemap(ctype) SWIGTYPE "$&1_type"; %typemap(in) bool "$1 = (bool)$input;"; %typemap(in) char, unsigned char, signed char, short, signed short, unsigned short, int, signed int, unsigned int, long, signed long, unsigned long, float, double, long double, char *, void *, void, enum SWIGTYPE, SWIGTYPE *, SWIGTYPE[ANY], SWIGTYPE &, SWIGTYPE && "$1 = $input;"; %typemap(in) SWIGTYPE "$1 = *$input;"; %typemap(out) void ""; %typemap(out) bool "$result = (int)$1;"; %typemap(out) char, unsigned char, signed char, short, signed short, unsigned short, int, signed int, unsigned int, long, signed long, unsigned long, float, double, long double, char *, void *, enum SWIGTYPE, SWIGTYPE *, SWIGTYPE[ANY], SWIGTYPE &, SWIGTYPE && "$result = $1;"; #ifdef __cplusplus %typemap(out) SWIGTYPE "$result = new $1_type($1);"; #else %typemap(out) SWIGTYPE { $result = ($&1_ltype) malloc(sizeof($1_type)); memmove($result, &$1, sizeof($1_type)); } #endif %typecheck(SWIG_TYPECHECK_BOOL) bool { $1 = 1; }; %typecheck(SWIG_TYPECHECK_CHAR) char { $1 = 1; }; %typecheck(SWIG_TYPECHECK_FLOAT) float { $1 = 1; }; %typecheck(SWIG_TYPECHECK_DOUBLE) double { $1 = 1; }; %typecheck(SWIG_TYPECHECK_STRING) char * { $1 = 1; }; %typecheck(SWIG_TYPECHECK_INTEGER) unsigned char, signed char, short, signed short, unsigned short, int, signed int, unsigned int, long, signed long, unsigned long, enum SWIGTYPE { $1 = 1; }; %typecheck(SWIG_TYPECHECK_POINTER) SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE[ANY], SWIGTYPE { $1 = 1; }; /* This maps C/C++ types to Lisp classes for overload dispatch */ %typemap(lisptype) bool "cl:boolean"; %typemap(lisptype) char "cl:character"; %typemap(lisptype) unsigned char "cl:integer"; %typemap(lisptype) signed char "cl:integer"; %typemap(lispclass) bool "t"; %typemap(lispclass) char "cl:character"; %typemap(lispclass) unsigned char, signed char, short, signed short, unsigned short, int, signed int, unsigned int, long, signed long, unsigned long, enum SWIGTYPE "cl:integer"; /* CLOS methods can't be specialized on single-float or double-float */ %typemap(lispclass) float "cl:number"; %typemap(lispclass) double "cl:number"; %typemap(lispclass) char * "cl:string"; /* Array reference typemaps */ %apply SWIGTYPE & { SWIGTYPE ((&)[ANY]) } %apply SWIGTYPE && { SWIGTYPE ((&&)[ANY]) } /* const pointers */ %apply SWIGTYPE * { SWIGTYPE *const } %apply SWIGTYPE (CLASS::*) { SWIGTYPE (CLASS::*const) } %apply SWIGTYPE & { SWIGTYPE (CLASS::*const&) } %{ #ifdef __cplusplus # define EXTERN extern "C" #else # define EXTERN extern #endif #define EXPORT EXTERN SWIGEXPORT #include %} %insert("swiglisp") %{ ;;;SWIG wrapper code starts here (cl:defmacro defanonenum (cl:&body enums) "Converts anonymous enums to defconstants." `(cl:progn ,@(cl:loop for value in enums for index = 0 then (cl:1+ index) when (cl:listp value) do (cl:setf index (cl:second value) value (cl:first value)) collect `(cl:defconstant ,value ,index)))) (cl:eval-when (:compile-toplevel :load-toplevel) (cl:unless (cl:fboundp 'swig-lispify) (cl:defun swig-lispify (name flag cl:&optional (package cl:*package*)) (cl:labels ((helper (lst last rest cl:&aux (c (cl:car lst))) (cl:cond ((cl:null lst) rest) ((cl:upper-case-p c) (helper (cl:cdr lst) 'upper (cl:case last ((lower digit) (cl:list* c #\- rest)) (cl:t (cl:cons c rest))))) ((cl:lower-case-p c) (helper (cl:cdr lst) 'lower (cl:cons (cl:char-upcase c) rest))) ((cl:digit-char-p c) (helper (cl:cdr lst) 'digit (cl:case last ((upper lower) (cl:list* c #\- rest)) (cl:t (cl:cons c rest))))) ((cl:char-equal c #\_) (helper (cl:cdr lst) '_ (cl:cons #\- rest))) (cl:t (cl:error "Invalid character: ~A" c))))) (cl:let ((fix (cl:case flag ((constant enumvalue) "+") (variable "*") (cl:t "")))) (cl:intern (cl:concatenate 'cl:string fix (cl:nreverse (helper (cl:concatenate 'cl:list name) cl:nil cl:nil)) fix) package)))))) ;;;SWIG wrapper code ends here %} #ifdef __cplusplus %typemap(out) SWIGTYPE "$result = new $1_type($1);"; #else %typemap(out) SWIGTYPE { $result = ($&1_ltype) malloc(sizeof($1_type)); memmove($result, &$1, sizeof($1_type)); } #endif ////////////////////////////////////////////////////////////// /* name conversion for overloaded operators. */ #ifdef __cplusplus %rename(__add__) *::operator+; %rename(__pos__) *::operator+(); %rename(__pos__) *::operator+() const; %rename(__sub__) *::operator-; %rename(__neg__) *::operator-() const; %rename(__neg__) *::operator-(); %rename(__mul__) *::operator*; %rename(__deref__) *::operator*(); %rename(__deref__) *::operator*() const; %rename(__div__) *::operator/; %rename(__mod__) *::operator%; %rename(__logxor__) *::operator^; %rename(__logand__) *::operator&; %rename(__logior__) *::operator|; %rename(__lognot__) *::operator~(); %rename(__lognot__) *::operator~() const; %rename(__not__) *::operator!(); %rename(__not__) *::operator!() const; %rename(__assign__) *::operator=; %rename(__add_assign__) *::operator+=; %rename(__sub_assign__) *::operator-=; %rename(__mul_assign__) *::operator*=; %rename(__div_assign__) *::operator/=; %rename(__mod_assign__) *::operator%=; %rename(__logxor_assign__) *::operator^=; %rename(__logand_assign__) *::operator&=; %rename(__logior_assign__) *::operator|=; %rename(__lshift__) *::operator<<; %rename(__lshift_assign__) *::operator<<=; %rename(__rshift__) *::operator>>; %rename(__rshift_assign__) *::operator>>=; %rename(__eq__) *::operator==; %rename(__ne__) *::operator!=; %rename(__lt__) *::operator<; %rename(__gt__) *::operator>; %rename(__lte__) *::operator<=; %rename(__gte__) *::operator>=; %rename(__and__) *::operator&&; %rename(__or__) *::operator||; %rename(__preincr__) *::operator++(); %rename(__postincr__) *::operator++(int); %rename(__predecr__) *::operator--(); %rename(__postdecr__) *::operator--(int); %rename(__comma__) *::operator,(); %rename(__comma__) *::operator,() const; %rename(__member_ref__) *::operator->; %rename(__member_func_ref__) *::operator->*; %rename(__funcall__) *::operator(); %rename(__aref__) *::operator[]; #endif %{ #ifdef __cplusplus # define EXTERN extern "C" #else # define EXTERN extern #endif #define EXPORT EXTERN SWIGEXPORT #include #include %} swig-4.0.1/Lib/r/0000755000175000017500000000000013527063513013317 5ustar williamwilliamswig-4.0.1/Lib/r/std_deque.i0000644000175000017500000000003113527063513015440 0ustar williamwilliam%includeswig-4.0.1/Lib/r/rtype.swg0000644000175000017500000002026313527063513015207 0ustar williamwilliam /* These map the primitive C types to the appropriate R type for use in class representations. */ %typemap("rtype") int, int *, int & "integer"; %typemap("rtype") long, long *, long & "integer"; %typemap("rtype") float, float*, float & "numeric"; %typemap("rtype") double, double*, double & "numeric"; %typemap("rtype") char *, char ** "character"; %typemap("rtype") char "character"; %typemap("rtype") string, string *, string & "character"; %typemap("rtype") std::string, std::string *, std::string & "character"; %typemap("rtype") bool, bool * "logical"; %typemap("rtype") enum SWIGTYPE "character"; %typemap("rtype") enum SWIGTYPE * "character"; %typemap("rtype") enum SWIGTYPE *const "character"; %typemap("rtype") enum SWIGTYPE & "character"; %typemap("rtype") const enum SWIGTYPE & "character"; %typemap("rtype") enum SWIGTYPE && "character"; %typemap("rtype") SWIGTYPE * "$R_class"; %typemap("rtype") SWIGTYPE *const "$R_class"; %typemap("rtype") SWIGTYPE & "$R_class"; %typemap("rtype") SWIGTYPE && "$R_class"; %typemap("rtype") SWIGTYPE "$&R_class"; %typemap("rtypecheck") int, int &, long, long & %{ (is.integer($arg) || is.numeric($arg)) && length($arg) == 1 %} %typemap("rtypecheck") int *, long * %{ is.integer($arg) || is.numeric($arg) %} %typemap("rtypecheck") float, double %{ is.numeric($arg) && length($arg) == 1 %} %typemap("rtypecheck") float *, double * %{ is.numeric($arg) %} %typemap("rtypecheck") bool, bool & %{ is.logical($arg) && length($arg) == 1 %} %typemap("rtypecheck") bool * %{ is.logical($arg) %} /* Set up type checks to insure overloading precedence. We would like non pointer items to shadow pointer items, so that they get called if length = 1 */ %typecheck(SWIG_TYPECHECK_BOOL) bool {} %typecheck(SWIG_TYPECHECK_UINT32) unsigned int {} %typecheck(SWIG_TYPECHECK_INTEGER) int {} %typecheck(SWIG_TYPECHECK_FLOAT) float {} %typecheck(SWIG_TYPECHECK_DOUBLE) double {} %typecheck(SWIG_TYPECHECK_BOOL_PTR) bool * {} %typecheck(SWIG_TYPECHECK_INT32_PTR) int * {} %typecheck(SWIG_TYPECHECK_FLOAT_PTR) float * {} %typecheck(SWIG_TYPECHECK_DOUBLE_PTR) double * {} %typecheck(SWIG_TYPECHECK_CHAR_PTR) char * {} %typecheck(SWIG_TYPECHECK_INT32_ARRAY) int[ANY] {} %typecheck(SWIG_TYPECHECK_FLOAT_ARRAY) float[ANY] {} %typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY) double [ANY] {} /* Have to be careful that as(x, "numeric") is different from as.numeric(x). The latter makes a REALSXP, whereas the former leaves an INTSXP as an INTSXP. */ /* Force coercion of integer, since by default R sets all constants to numeric, which means that you can't directly call a function with an integer using an R numercal literal */ %typemap(scoercein) int, int *, int & %{ $input = as.integer($input); %} %typemap(scoercein) long, long *, long & %{ $input = as.integer($input); %} %typemap(scoercein) float, float*, float &, double, double *, double & %{ %} %typemap(scoercein) char, char *, char & %{ $input = as($input, "character"); %} %typemap(scoercein) string, string *, string & %{ $input = as($input, "character"); %} %typemap(scoercein) std::string, std::string *, std::string & %{ $input = as($input, "character"); %} %typemap(scoercein) enum SWIGTYPE %{ $input = enumToInteger($input, "$R_class"); %} %typemap(scoercein) enum SWIGTYPE & %{ $input = enumToInteger($input, "$*R_class"); %} %typemap(scoercein) enum SWIGTYPE * %{ $input = enumToInteger($input, "$R_class"); %} %typemap(scoercein) enum SWIGTYPE *const %{ $input = enumToInteger($input, "$R_class"); %} %typemap(scoercein) SWIGTYPE, SWIGTYPE *, SWIGTYPE *const, SWIGTYPE &, SWIGTYPE && %{ if (inherits($input, "ExternalReference")) $input = slot($input,"ref") %} /* %typemap(scoercein) SWIGTYPE *, SWIGTYPE *const %{ $input = coerceIfNotSubclass($input, "$R_class") %} %typemap(scoercein) SWIGTYPE & %{ $input = coerceIfNotSubclass($input, "$R_class") %} %typemap(scoercein) SWIGTYPE && %{ $input = coerceIfNotSubclass($input, "$R_class") %} %typemap(scoercein) SWIGTYPE %{ $input = coerceIfNotSubclass($input, "$&R_class") %} */ %typemap(scoercein) SWIGTYPE[ANY] %{ if(is.list($input)) assert(all(sapply($input, class) == "$R_class")); %} /* **************************************************************** */ %typemap(scoercein) bool, bool *, bool & "$input = as.logical($input);"; %typemap(scoercein) int, int *, int &, long, long *, long & "$input = as.integer($input);"; %typemap(scoercein) char *, string, std::string, string &, std::string & %{ $input = as($input, "character"); %} %typemap(scoerceout) enum SWIGTYPE %{ $result = enumFromInteger($result, "$R_class"); %} %typemap(scoerceout) enum SWIGTYPE & %{ $result = enumFromInteger($result, "$*R_class"); %} %typemap(scoerceout) enum SWIGTYPE && %{ $result = enumFromInteger($result, "$R_class"); %} %typemap(scoerceout) enum SWIGTYPE * %{ $result = enumToInteger($result, "$R_class"); %} %typemap(scoerceout) enum SWIGTYPE *const %{ $result = enumToInteger($result, "$R_class"); %} %typemap(scoerceout) SEXP %{ %} %typemap(scoerceout) SWIGTYPE %{ $result <- if (is.null($result)) $result else new("$&R_class", ref=$result); %} %typemap(scoerceout) SWIGTYPE & %{ $result <- if (is.null($result)) $result else new("$R_class", ref=$result); %} %typemap(scoerceout) SWIGTYPE && %{ $result <- if (is.null($result)) $result else new("$R_class", ref=$result); %} %typemap(scoerceout) SWIGTYPE * %{ $result <- if (is.null($result)) $result else new("$R_class", ref=$result); %} %typemap(scoerceout) SWIGTYPE *const %{ $result <- if (is.null($result)) $result else new("$R_class", ref=$result); %} /* Override the SWIGTYPE * above. */ %typemap(scoerceout) char, char *, char &, float, double, float*, double*, float &, double &, int, int &, long, long &, bool, bool &, string, std::string, string &, std::string &, void, signed int, signed int &, unsigned int, unsigned int &, short, short &, unsigned short, unsigned short &, long long, signed long long, signed long long &, unsigned long long, unsigned long long &, signed long, signed long &, unsigned long, unsigned long &, signed char, signed char &, unsigned char, unsigned char & %{ %} %apply int {size_t, std::size_t, ptrdiff_t, std::ptrdiff_t, signed int, unsigned int, short, unsigned short, signed char, unsigned char} %apply int* {size_t[], std::size_t[], ptrdiff_t[], std::ptrdiff_t[], signed int[], unsigned int[], short[], unsigned short[], signed char[], unsigned char[]} %apply int* {size_t[ANY], std::size_t[ANY], ptrdiff_t[ANY], std::ptrdiff_t[ANY], signed int[ANY], unsigned int[ANY], short[ANY], unsigned short[ANY], signed char[ANY], unsigned char[ANY]} %apply int* {size_t*, std::size_t*, ptrdiff_t*, std::ptrdiff_t*, signed int*, unsigned int*, short*, unsigned short*, signed char*, unsigned char*} %apply long { long long, signed long long, unsigned long long, signed long, unsigned long} %apply long* { long long*, signed long long*, unsigned long long*, signed long*, unsigned long*, long long[], signed long long[], unsigned long long[], signed long[], unsigned long[], long long[ANY], signed long long[ANY], unsigned long long[ANY], signed long[ANY], unsigned long[ANY]} %apply float* { float[], float[ANY] } %apply double * { double[], double[ANY] } %apply bool* { bool[], bool[ANY] } #if 0 Just examining the values for a SWIGTYPE. %typemap(scoerceout) SWIGTYPE %{ name = $1_name type = $1_type ltype = $1_ltype mangle = $1_mangle descriptor = $1_descriptor pointer type = $*1_type pointer ltype = $*1_ltype pointer descriptor = $*1_descriptor basetype = $*_basetype %} #endif swig-4.0.1/Lib/r/srun.swg0000644000175000017500000000750513527063513015037 0ustar williamwilliam# srun.swg # # # This is the basic code that is needed at run time within R to # provide and define the relevant classes. It is included # automatically in the generated code by copying the contents of # srun.swg into the newly created binding code. # This could be provided as a separate run-time library but this # approach allows the code to be included directly into the # generated bindings and so removes the need to have and install an # additional library. We may however end up with multiple copies of # this and some confusion at run-time as to which class to use. This # is an issue when we use NAMESPACES as we may need to export certain # classes. ###################################################################### if(length(getClassDef("RSWIGStruct")) == 0) setClass("RSWIGStruct", representation("VIRTUAL")) if(length(getClassDef("ExternalReference")) == 0) # Should be virtual but this means it loses its slots currently #representation("VIRTUAL") setClass("ExternalReference", representation( ref = "externalptr")) if(length(getClassDef("NativeRoutinePointer")) == 0) setClass("NativeRoutinePointer", representation(parameterTypes = "character", returnType = "character", "VIRTUAL"), contains = "ExternalReference") if(length(getClassDef("CRoutinePointer")) == 0) setClass("CRoutinePointer", contains = "NativeRoutinePointer") if(length(getClassDef("EnumerationValue")) == 0) setClass("EnumerationValue", contains = "integer") if(!isGeneric("copyToR")) setGeneric("copyToR", function(value, obj = new(gsub("Ref$", "", class(value)))) standardGeneric("copyToR" )) setGeneric("delete", function(obj) standardGeneric("delete")) SWIG_createNewRef = function(className, ..., append = TRUE) { f = get(paste("new", className, sep = "_"), mode = "function") f(...) } if(!isGeneric("copyToC")) setGeneric("copyToC", function(value, obj = SWIG_createNewRef(class(value))) standardGeneric("copyToC" )) # defineEnumeration = function(name, .values, where = topenv(parent.frame()), suffix = "Value") { # Mirror the class definitions via the E analogous to .__C__ defName = paste(".__E__", name, sep = "") delayedAssign(defName, .values, assign.env = where) if(nchar(suffix)) name = paste(name, suffix, sep = "") setClass(name, contains = "EnumerationValue", where = where) } enumToInteger <- function(name,type) { if (is.character(name)) { ans <- as.integer(get(paste(".__E__", type, sep = ""))[name]) if (is.na(ans)) {warning("enum not found ", name, " ", type)} ans } } enumFromInteger = function(i,type) { itemlist <- get(paste(".__E__", type, sep="")) names(itemlist)[match(i, itemlist)] } coerceIfNotSubclass = function(obj, type) { if(!is(obj, type)) {as(obj, type)} else obj } setClass("SWIGArray", representation(dims = "integer"), contains = "ExternalReference") setMethod("length", "SWIGArray", function(x) x@dims[1]) defineEnumeration("SCopyReferences", .values = c( "FALSE" = 0, "TRUE" = 1, "DEEP" = 2)) assert = function(condition, message = "") { if(!condition) stop(message) TRUE } if(FALSE) { print.SWIGFunction = function(x, ...) { } } ####################################################################### R_SWIG_getCallbackFunctionStack = function() { # No PACKAGE argument as we don't know what the DLL is. .Call("R_SWIG_debug_getCallbackFunctionData") } R_SWIG_addCallbackFunctionStack = function(fun, userData = NULL) { # No PACKAGE argument as we don't know what the DLL is. .Call("R_SWIG_R_pushCallbackFunctionData", fun, userData) } ####################################################################### swig-4.0.1/Lib/r/std_shared_ptr.i0000644000175000017500000000010413527063513016471 0ustar williamwilliam#define SWIG_SHARED_PTR_NAMESPACE std %include swig-4.0.1/Lib/r/std_vector.i0000644000175000017500000011365013527063513015653 0ustar williamwilliam// R specific swig components /* Vectors */ %fragment("StdVectorTraits","header",fragment="StdSequenceTraits") %{ namespace swig { // vectors of doubles template <> struct traits_from_ptr > { static SEXP from (std::vector *val, int owner = 0) { SEXP result; PROTECT(result = Rf_allocVector(REALSXP, val->size())); for (unsigned pos = 0; pos < val->size(); pos++) { NUMERIC_POINTER(result)[pos] = ((*val)[pos]); } UNPROTECT(1); return(result); } }; // vectors of floats template <> struct traits_from_ptr > { static SEXP from (std::vector *val, int owner = 0) { SEXP result; PROTECT(result = Rf_allocVector(REALSXP, val->size())); for (unsigned pos = 0; pos < val->size(); pos++) { NUMERIC_POINTER(result)[pos] = ((*val)[pos]); } UNPROTECT(1); return(result); } }; // vectors of unsigned 8bit int template <> struct traits_from_ptr > { static SEXP from (std::vector *val, int owner = 0) { SEXP result; PROTECT(result = Rf_allocVector(INTSXP, val->size())); for (unsigned pos = 0; pos < val->size(); pos++) { INTEGER_POINTER(result)[pos] = ((*val)[pos]); } UNPROTECT(1); return(result); } }; // vectors of 8bit int template <> struct traits_from_ptr > { static SEXP from (std::vector *val, int owner = 0) { SEXP result; PROTECT(result = Rf_allocVector(INTSXP, val->size())); for (unsigned pos = 0; pos < val->size(); pos++) { INTEGER_POINTER(result)[pos] = ((*val)[pos]); } UNPROTECT(1); return(result); } }; // vectors of unsigned 16bit int template <> struct traits_from_ptr > { static SEXP from (std::vector *val, int owner = 0) { SEXP result; PROTECT(result = Rf_allocVector(INTSXP, val->size())); for (unsigned pos = 0; pos < val->size(); pos++) { INTEGER_POINTER(result)[pos] = ((*val)[pos]); } UNPROTECT(1); return(result); } }; // vectors of 16bit int template <> struct traits_from_ptr > { static SEXP from (std::vector *val, int owner = 0) { SEXP result; PROTECT(result = Rf_allocVector(INTSXP, val->size())); for (unsigned pos = 0; pos < val->size(); pos++) { INTEGER_POINTER(result)[pos] = ((*val)[pos]); } UNPROTECT(1); return(result); } }; // vectors of 32 bit unsigned int template <> struct traits_from_ptr > { static SEXP from (std::vector *val, int owner = 0) { SEXP result; PROTECT(result = Rf_allocVector(INTSXP, val->size())); for (unsigned pos = 0; pos < val->size(); pos++) { INTEGER_POINTER(result)[pos] = ((*val)[pos]); } UNPROTECT(1); return(result); } }; // vectors of 32bit int template <> struct traits_from_ptr > { static SEXP from (std::vector *val, int owner = 0) { SEXP result; PROTECT(result = Rf_allocVector(INTSXP, val->size())); for (unsigned pos = 0; pos < val->size(); pos++) { INTEGER_POINTER(result)[pos] = ((*val)[pos]); } UNPROTECT(1); return(result); } }; // vectors of 64 bit unsigned int #if defined(SWIGWORDSIZE64) template <> struct traits_from_ptr > { static SEXP from (std::vector *val, int owner = 0) { SEXP result; PROTECT(result = Rf_allocVector(INTSXP, val->size())); for (unsigned pos = 0; pos < val->size(); pos++) { INTEGER_POINTER(result)[pos] = ((*val)[pos]); } UNPROTECT(1); return(result); } }; // vectors of 64 bit int template <> struct traits_from_ptr > { static SEXP from (std::vector *val, int owner = 0) { SEXP result; PROTECT(result = Rf_allocVector(INTSXP, val->size())); for (unsigned pos = 0; pos < val->size(); pos++) { INTEGER_POINTER(result)[pos] = ((*val)[pos]); } UNPROTECT(1); return(result); } }; #else template <> struct traits_from_ptr > { static SEXP from (std::vector *val, int owner = 0) { SEXP result; PROTECT(result = Rf_allocVector(INTSXP, val->size())); for (unsigned pos = 0; pos < val->size(); pos++) { INTEGER_POINTER(result)[pos] = ((*val)[pos]); } UNPROTECT(1); return(result); } }; // vectors of 64 bit int template <> struct traits_from_ptr > { static SEXP from (std::vector *val, int owner = 0) { SEXP result; PROTECT(result = Rf_allocVector(INTSXP, val->size())); for (unsigned pos = 0; pos < val->size(); pos++) { INTEGER_POINTER(result)[pos] = ((*val)[pos]); } UNPROTECT(1); return(result); } }; #endif // vectors of bool template <> struct traits_from_ptr > { static SEXP from (std::vector *val, int owner = 0) { SEXP result; PROTECT(result = Rf_allocVector(LGLSXP, val->size())); for (unsigned pos = 0; pos < val->size(); pos++) { LOGICAL_POINTER(result)[pos] = ((*val)[pos]); } UNPROTECT(1); return(result); } }; // vectors of strings template <> struct traits_from_ptr > > { static SEXP from (std::vector > *val, int owner = 0) { SEXP result; PROTECT(result = Rf_allocVector(STRSXP, val->size())); for (unsigned pos = 0; pos < val->size(); pos++) { CHARACTER_POINTER(result)[pos] = Rf_mkChar(((*val)[pos]).c_str()); } UNPROTECT(1); return(result); } }; // catch all that does everything with vectors template struct traits_from_ptr< std::vector< T > > { static SEXP from (std::vector< T > *val, int owner = 0) { return SWIG_R_NewPointerObj(val, type_info< std::vector< T > >(), owner); } }; ///////////////////////////////////////////////// template <> struct traits_asptr < std::vector > { static int asptr(SEXP obj, std::vector **val) { std::vector *p; // not sure how to check the size of the SEXP obj is correct unsigned int sexpsz = Rf_length(obj); p = new std::vector(sexpsz); double *S = NUMERIC_POINTER(obj); for (unsigned pos = 0; pos < p->size(); pos++) { (*p)[pos] = static_cast(S[pos]); } int res = SWIG_OK; if (SWIG_IsOK(res)) { if (val) *val = p; } return res; } }; template <> struct traits_asptr < std::vector > { static int asptr(SEXP obj, std::vector **val) { std::vector *p; // not sure how to check the size of the SEXP obj is correct unsigned int sexpsz = Rf_length(obj); p = new std::vector(sexpsz); double *S = NUMERIC_POINTER(obj); for (unsigned pos = 0; pos < p->size(); pos++) { (*p)[pos] = static_cast(S[pos]); } int res = SWIG_OK; if (SWIG_IsOK(res)) { if (val) *val = p; } return res; } }; // 8 bit integer types template <> struct traits_asptr < std::vector > { static int asptr(SEXP obj, std::vector **val) { std::vector *p; unsigned int sexpsz = Rf_length(obj); p = new std::vector(sexpsz); SEXP coerced; PROTECT(coerced = Rf_coerceVector(obj, INTSXP)); int *S = INTEGER_POINTER(coerced); for (unsigned pos = 0; pos < p->size(); pos++) { (*p)[pos] = static_cast(S[pos]); } int res = SWIG_OK; if (SWIG_IsOK(res)) { if (val) *val = p; } UNPROTECT(1); return res; } }; template <> struct traits_asptr < std::vector > { static int asptr(SEXP obj, std::vector **val) { std::vector *p; // not sure how to check the size of the SEXP obj is correct int sexpsz = Rf_length(obj); p = new std::vector(sexpsz); SEXP coerced; PROTECT(coerced = Rf_coerceVector(obj, INTSXP)); int *S = INTEGER_POINTER(coerced); for (unsigned pos = 0; pos < p->size(); pos++) { (*p)[pos] = static_cast(S[pos]); } int res = SWIG_OK; if (SWIG_IsOK(res)) { if (val) *val = p; } UNPROTECT(1); return res; } }; // 16 bit integer types template <> struct traits_asptr < std::vector > { static int asptr(SEXP obj, std::vector **val) { std::vector *p; unsigned int sexpsz = Rf_length(obj); p = new std::vector(sexpsz); SEXP coerced; PROTECT(coerced = Rf_coerceVector(obj, INTSXP)); int *S = INTEGER_POINTER(coerced); for (unsigned pos = 0; pos < p->size(); pos++) { (*p)[pos] = static_cast(S[pos]); } int res = SWIG_OK; if (SWIG_IsOK(res)) { if (val) *val = p; } UNPROTECT(1); return res; } }; template <> struct traits_asptr < std::vector > { static int asptr(SEXP obj, std::vector **val) { std::vector *p; // not sure how to check the size of the SEXP obj is correct int sexpsz = Rf_length(obj); p = new std::vector(sexpsz); SEXP coerced; PROTECT(coerced = Rf_coerceVector(obj, INTSXP)); int *S = INTEGER_POINTER(coerced); for (unsigned pos = 0; pos < p->size(); pos++) { (*p)[pos] = static_cast(S[pos]); } int res = SWIG_OK; if (SWIG_IsOK(res)) { if (val) *val = p; } UNPROTECT(1); return res; } }; // 32 bit integer types template <> struct traits_asptr < std::vector > { static int asptr(SEXP obj, std::vector **val) { std::vector *p; unsigned int sexpsz = Rf_length(obj); p = new std::vector(sexpsz); SEXP coerced; PROTECT(coerced = Rf_coerceVector(obj, INTSXP)); int *S = INTEGER_POINTER(coerced); for (unsigned pos = 0; pos < p->size(); pos++) { (*p)[pos] = static_cast(S[pos]); } int res = SWIG_OK; if (SWIG_IsOK(res)) { if (val) *val = p; } UNPROTECT(1); return res; } }; template <> struct traits_asptr < std::vector > { static int asptr(SEXP obj, std::vector **val) { std::vector *p; // not sure how to check the size of the SEXP obj is correct int sexpsz = Rf_length(obj); p = new std::vector(sexpsz); SEXP coerced; PROTECT(coerced = Rf_coerceVector(obj, INTSXP)); int *S = INTEGER_POINTER(coerced); for (unsigned pos = 0; pos < p->size(); pos++) { (*p)[pos] = static_cast(S[pos]); } int res = SWIG_OK; if (SWIG_IsOK(res)) { if (val) *val = p; } UNPROTECT(1); return res; } }; #if defined(SWIGWORDSIZE64) // 64 bit integer types template <> struct traits_asptr < std::vector > { static int asptr(SEXP obj, std::vector **val) { std::vector *p; unsigned int sexpsz = Rf_length(obj); p = new std::vector(sexpsz); SEXP coerced; PROTECT(coerced = Rf_coerceVector(obj, INTSXP)); int *S = INTEGER_POINTER(coerced); for (unsigned pos = 0; pos < p->size(); pos++) { (*p)[pos] = static_cast(S[pos]); } int res = SWIG_OK; if (SWIG_IsOK(res)) { if (val) *val = p; } UNPROTECT(1); return res; } }; template <> struct traits_asptr < std::vector > { static int asptr(SEXP obj, std::vector **val) { std::vector *p; // not sure how to check the size of the SEXP obj is correct int sexpsz = Rf_length(obj); p = new std::vector(sexpsz); SEXP coerced; PROTECT(coerced = Rf_coerceVector(obj, INTSXP)); int *S = INTEGER_POINTER(coerced); for (unsigned pos = 0; pos < p->size(); pos++) { (*p)[pos] = static_cast(S[pos]); } int res = SWIG_OK; if (SWIG_IsOK(res)) { if (val) *val = p; } UNPROTECT(1); return res; } }; #else // 64 bit integer types template <> struct traits_asptr < std::vector > { static int asptr(SEXP obj, std::vector **val) { std::vector *p; unsigned int sexpsz = Rf_length(obj); p = new std::vector(sexpsz); SEXP coerced; PROTECT(coerced = Rf_coerceVector(obj, INTSXP)); int *S = INTEGER_POINTER(coerced); for (unsigned pos = 0; pos < p->size(); pos++) { (*p)[pos] = static_cast(S[pos]); } int res = SWIG_OK; if (SWIG_IsOK(res)) { if (val) *val = p; } UNPROTECT(1); return res; } }; template <> struct traits_asptr < std::vector > { static int asptr(SEXP obj, std::vector **val) { std::vector *p; // not sure how to check the size of the SEXP obj is correct int sexpsz = Rf_length(obj); p = new std::vector(sexpsz); SEXP coerced; PROTECT(coerced = Rf_coerceVector(obj, INTSXP)); int *S = INTEGER_POINTER(coerced); for (unsigned pos = 0; pos < p->size(); pos++) { (*p)[pos] = static_cast(S[pos]); } int res = SWIG_OK; if (SWIG_IsOK(res)) { if (val) *val = p; } UNPROTECT(1); return res; } }; #endif template <> struct traits_asptr < std::vector > { static int asptr(SEXP obj, std::vector **val) { std::vector *p; // not sure how to check the size of the SEXP obj is correct int sexpsz = Rf_length(obj); p = new std::vector(sexpsz); SEXP coerced; PROTECT(coerced = Rf_coerceVector(obj, LGLSXP)); int *S = LOGICAL_POINTER(coerced); for (unsigned pos = 0; pos < p->size(); pos++) { (*p)[pos] = static_cast(S[pos]); } int res = SWIG_OK; if (SWIG_IsOK(res)) { if (val) *val = p; } UNPROTECT(1); return res; } }; template <> struct traits_asptr < std::vector > > { static int asptr(SEXP obj, std::vector > **val) { std::vector > *p; // R character vectors are STRSXP containing CHARSXP // access a CHARSXP using STRING_ELT int sexpsz = Rf_length(obj); p = new std::vector >(sexpsz); SEXP coerced; PROTECT(coerced = Rf_coerceVector(obj, STRSXP)); //SEXP *S = CHARACTER_POINTER(coerced); for (unsigned pos = 0; pos < p->size(); pos++) { const char * thecstring = CHAR(STRING_ELT(coerced, pos)); (*p)[pos] = std::basic_string(thecstring); } int res = SWIG_OK; if (SWIG_IsOK(res)) { if (val) *val = p; } UNPROTECT(1); return res; } }; // catchall for R to vector conversion template struct traits_asptr < std::vector > { static int asptr(SEXP obj, std::vector **val) { std::vector *p; int res = SWIG_R_ConvertPtr(obj, (void**)&p, type_info< std::vector >(), 0); if (SWIG_IsOK(res)) { if (val) *val = p; } return res; } }; // now for vectors of vectors. These will be represented as lists of vectors on the // catch all that does everything with vectors template <> struct traits_from_ptr > > { static SEXP from (std::vector< std::vector > *val, int owner = 0) { SEXP result; // allocate the R list PROTECT(result = Rf_allocVector(VECSXP, val->size())); for (unsigned pos = 0; pos < val->size(); pos++) { // allocate the R vector SET_VECTOR_ELT(result, pos, Rf_allocVector(INTSXP, val->at(pos).size())); // Fill the R vector for (unsigned vpos = 0; vpos < val->at(pos).size(); ++vpos) { INTEGER_POINTER(VECTOR_ELT(result, pos))[vpos] = static_cast(val->at(pos).at(vpos)); } } UNPROTECT(1); return(result); } }; template <> struct traits_from_ptr > > { static SEXP from (std::vector< std::vector > *val, int owner = 0) { SEXP result; // allocate the R list PROTECT(result = Rf_allocVector(VECSXP, val->size())); for (unsigned pos = 0; pos < val->size(); pos++) { // allocate the R vector SET_VECTOR_ELT(result, pos, Rf_allocVector(INTSXP, val->at(pos).size())); // Fill the R vector for (unsigned vpos = 0; vpos < val->at(pos).size(); ++vpos) { INTEGER_POINTER(VECTOR_ELT(result, pos))[vpos] = static_cast(val->at(pos).at(vpos)); } } UNPROTECT(1); return(result); } }; template <> struct traits_from_ptr > > { static SEXP from (std::vector< std::vector > *val, int owner = 0) { SEXP result; // allocate the R list PROTECT(result = Rf_allocVector(VECSXP, val->size())); for (unsigned pos = 0; pos < val->size(); pos++) { // allocate the R vector SET_VECTOR_ELT(result, pos, Rf_allocVector(REALSXP, val->at(pos).size())); // Fill the R vector for (unsigned vpos = 0; vpos < val->at(pos).size(); ++vpos) { NUMERIC_POINTER(VECTOR_ELT(result, pos))[vpos] = static_cast(val->at(pos).at(vpos)); } } UNPROTECT(1); return(result); } }; template <> struct traits_from_ptr > > { static SEXP from (std::vector< std::vector > *val, int owner = 0) { SEXP result; // allocate the R list PROTECT(result = Rf_allocVector(VECSXP, val->size())); for (unsigned pos = 0; pos < val->size(); pos++) { // allocate the R vector SET_VECTOR_ELT(result, pos, Rf_allocVector(REALSXP, val->at(pos).size())); // Fill the R vector for (unsigned vpos = 0; vpos < val->at(pos).size(); ++vpos) { NUMERIC_POINTER(VECTOR_ELT(result, pos))[vpos] = static_cast(val->at(pos).at(vpos)); } } UNPROTECT(1); return(result); } }; template <> struct traits_from_ptr > > { static SEXP from (std::vector< std::vector > *val, int owner = 0) { SEXP result; // allocate the R list PROTECT(result = Rf_allocVector(VECSXP, val->size())); for (unsigned pos = 0; pos < val->size(); pos++) { // allocate the R vector SET_VECTOR_ELT(result, pos, Rf_allocVector(LGLSXP, val->at(pos).size())); // Fill the R vector for (unsigned vpos = 0; vpos < val->at(pos).size(); ++vpos) { LOGICAL_POINTER(VECTOR_ELT(result, pos))[vpos] = (val->at(pos).at(vpos)); } } UNPROTECT(1); return(result); } }; template struct traits_from_ptr< std::vector < std::vector< T > > > { static SEXP from (std::vector < std::vector< T > > *val, int owner = 0) { return SWIG_R_NewPointerObj(val, type_info< std::vector < std::vector< T > > >(), owner); } }; ///////////////////////////////////////////////////////////////// // R side template <> struct traits_asptr < std::vector< std::vector > > { static int asptr(SEXP obj, std::vector< std::vector > **val) { std::vector > *p; // this is the length of the list unsigned int sexpsz = Rf_length(obj); p = new std::vector< std::vector > (sexpsz); for (unsigned listpos = 0; listpos < sexpsz; ++listpos) { unsigned vecsize = Rf_length(VECTOR_ELT(obj, listpos)); for (unsigned vpos = 0; vpos < vecsize; ++vpos) { (*p)[listpos].push_back(static_cast(INTEGER_POINTER(VECTOR_ELT(obj, listpos))[vpos])); } } int res = SWIG_OK; if (SWIG_IsOK(res)) { if (val) *val = p; } return res; } }; template <> struct traits_asptr < std::vector< std::vector< int> > > { static int asptr(SEXP obj, std::vector< std::vector< int> > **val) { std::vector > *p; // this is the length of the list unsigned int sexpsz = Rf_length(obj); p = new std::vector< std::vector< int> > (sexpsz); for (unsigned listpos = 0; listpos < sexpsz; ++listpos) { unsigned vecsize = Rf_length(VECTOR_ELT(obj, listpos)); for (unsigned vpos = 0; vpos < vecsize; ++vpos) { (*p)[listpos].push_back(static_cast(INTEGER_POINTER(VECTOR_ELT(obj, listpos))[vpos])); } } int res = SWIG_OK; if (SWIG_IsOK(res)) { if (val) *val = p; } return res; } }; template <> struct traits_asptr < std::vector< std::vector< float> > > { static int asptr(SEXP obj, std::vector< std::vector< float> > **val) { std::vector > *p; // this is the length of the list unsigned int sexpsz = Rf_length(obj); p = new std::vector< std::vector< float> > (sexpsz); for (unsigned listpos = 0; listpos < sexpsz; ++listpos) { unsigned vecsize = Rf_length(VECTOR_ELT(obj, listpos)); for (unsigned vpos = 0; vpos < vecsize; ++vpos) { (*p)[listpos].push_back(static_cast(NUMERIC_POINTER(VECTOR_ELT(obj, listpos))[vpos])); } } int res = SWIG_OK; if (SWIG_IsOK(res)) { if (val) *val = p; } return res; } }; template <> struct traits_asptr < std::vector< std::vector< double> > > { static int asptr(SEXP obj, std::vector< std::vector< double> > **val) { std::vector > *p; // this is the length of the list unsigned int sexpsz = Rf_length(obj); p = new std::vector< std::vector< double> > (sexpsz); for (unsigned listpos = 0; listpos < sexpsz; ++listpos) { unsigned vecsize = Rf_length(VECTOR_ELT(obj, listpos)); for (unsigned vpos = 0; vpos < vecsize; ++vpos) { (*p)[listpos].push_back(static_cast(NUMERIC_POINTER(VECTOR_ELT(obj, listpos))[vpos])); } } int res = SWIG_OK; if (SWIG_IsOK(res)) { if (val) *val = p; } return res; } }; template <> struct traits_asptr < std::vector< std::vector< bool > > > { static int asptr(SEXP obj, std::vector< std::vector< bool> > **val) { std::vector > *p; // this is the length of the list unsigned int sexpsz = Rf_length(obj); p = new std::vector< std::vector< bool > > (sexpsz); for (unsigned listpos = 0; listpos < sexpsz; ++listpos) { unsigned vecsize = Rf_length(VECTOR_ELT(obj, listpos)); for (unsigned vpos = 0; vpos < vecsize; ++vpos) { (*p)[listpos].push_back(static_cast(LOGICAL_POINTER(VECTOR_ELT(obj, listpos))[vpos])); } } int res = SWIG_OK; if (SWIG_IsOK(res)) { if (val) *val = p; } return res; } }; // catchall template struct traits_asptr < std::vector< std::vector > > { static int asptr(SEXP obj, std::vector< std::vector > **val) { std::vector< std::vector > *p; Rprintf("vector of vectors - unsupported content\n"); int res = SWIG_R_ConvertPtr(obj, (void**)&p, type_info< std::vector< std::vector > > (), 0); if (SWIG_IsOK(res)) { if (val) *val = p; } return res; } }; } %} #define %swig_vector_methods(Type...) %swig_sequence_methods(Type) #define %swig_vector_methods_val(Type...) %swig_sequence_methods_val(Type); %define %traits_type_name(Type...) %fragment(SWIG_Traits_frag(Type), "header", fragment="StdTraits",fragment="StdVectorTraits") { namespace swig { template <> struct traits< Type > { typedef pointer_category category; static const char* type_name() { return #Type; } }; } } %enddef %include %typemap_traits_ptr(SWIG_TYPECHECK_VECTOR, std::vector) %traits_type_name(std::vector) %typemap("rtypecheck") std::vector, std::vector *, std::vector & %{ is.numeric($arg) %} %typemap("rtype") std::vector "numeric" %typemap("scoercein") std::vector, std::vector *, std::vector & "$input = as.numeric($input);"; %typemap_traits_ptr(SWIG_TYPECHECK_VECTOR, std::vector) %traits_type_name(std::vector) // reuse these for float %typemap("rtype") std::vector, std::vector *, std::vector & = std::vector; %typemap("rtypecheck") std::vector, std::vector *, std::vector & = std::vector; %typemap("scoercein") std::vector, std::vector *, std::vector & = std::vector; %typemap_traits_ptr(SWIG_TYPECHECK_VECTOR, std::vector); %traits_type_name(std::vector); %typemap("rtypecheck") std::vector, std::vector *, std::vector & %{ is.logical($arg) %} %typemap("rtype") std::vector "logical" %typemap("scoercein") std::vector , std::vector & "$input = as.logical($input);"; %typemap_traits_ptr(SWIG_TYPECHECK_VECTOR, std::vector); %traits_type_name(std::vector); %typemap("rtypecheck") std::vector, std::vector *, std::vector & %{ is.integer($arg) || is.numeric($arg) %} %typemap("rtype") std::vector "integer" %typemap("scoercein") std::vector , std::vector *, std::vector & "$input = as.integer($input);"; // strings %typemap("rtype") std::vector< std::basic_string >, std::vector< std::basic_string > *, std::vector< std::basic_string > & "character" %typemap("rtypecheck") std::vector< std::basic_string >, std::vector< std::basic_string > *, std::vector< std::basic_string > & %{ is.character($arg) %} %typemap("scoercein") std::vector< std::basic_string >, std::vector< std::basic_string > *, std::vector< std::basic_string > & "$input = as.character($input);"; %typemap("scoerceout") std::vector< std::basic_string >, std::vector< std::basic_string > *, std::vector< std::basic_string > & %{ %} %apply std::vector< std::basic_string > { std::vector< std::string> }; // all the related integer vectors // signed %typemap_traits_ptr(SWIG_TYPECHECK_VECTOR, std::vector); %traits_type_name(std::vector); %typemap_traits_ptr(SWIG_TYPECHECK_VECTOR, std::vector); %traits_type_name(std::vector); #if defined(SWIGWORDSIZE64) %typemap_traits_ptr(SWIG_TYPECHECK_VECTOR, std::vector); %traits_type_name(std::vector); #else %typemap_traits_ptr(SWIG_TYPECHECK_VECTOR, std::vector); %traits_type_name(std::vector); #endif // unsigned %typemap_traits_ptr(SWIG_TYPECHECK_VECTOR, std::vector); %traits_type_name(std::vector); %typemap_traits_ptr(SWIG_TYPECHECK_VECTOR, std::vector); %traits_type_name(std::vector); %typemap_traits_ptr(SWIG_TYPECHECK_VECTOR, std::vector); %traits_type_name(std::vector); #if defined(SWIGWORDSIZE64) %typemap_traits_ptr(SWIG_TYPECHECK_VECTOR, std::vector); %traits_type_name(std::vector); #else %typemap_traits_ptr(SWIG_TYPECHECK_VECTOR, std::vector); %traits_type_name(std::vector); #endif // These R side typemaps are common for integer types // but we can't use %apply as it will copy the C side ones too // Also note that we don't seem to be able to use types like // int_least8_t here. %typemap("rtype") std::vector, std::vector *, std::vector & = std::vector; %typemap("rtype") std::vector, std::vector *, std::vector & = std::vector; %typemap("rtype") std::vector, std::vector *, std::vector & = std::vector; %typemap("rtype") std::vector, std::vector *, std::vector & = std::vector; #if defined(SWIGWORDSIZE64) %typemap("rtype") std::vector, std::vector *, std::vector & = std::vector; %typemap("rtype") std::vector, std::vector *, std::vector & = std::vector; #else %typemap("rtype") std::vector, std::vector *, std::vector & = std::vector; %typemap("rtype") std::vector, std::vector *, std::vector & = std::vector; #endif %typemap("scoercein") std::vector, std::vector *, std::vector & = std::vector; %typemap("scoercein") std::vector, std::vector *, std::vector & = std::vector; %typemap("scoercein") std::vector, std::vector *, std::vector & = std::vector; %typemap("scoercein") std::vector, std::vector *, std::vector & = std::vector; #if defined(SWIGWORDSIZE64) %typemap("scoercein") std::vector, std::vector *, std::vector & = std::vector; %typemap("scoercein") std::vector, std::vector *, std::vector & = std::vector; #else %typemap("scoercein") std::vector, std::vector *, std::vector & = std::vector; %typemap("scoercein") std::vector, std::vector *, std::vector & = std::vector; #endif %typemap("rtypecheck") std::vector, std::vector *, std::vector & = std::vector; %typemap("rtypecheck") std::vector, std::vector *, std::vector & = std::vector; %typemap("rtypecheck") std::vector, std::vector *, std::vector & = std::vector; %typemap("rtypecheck") std::vector, std::vector *, std::vector & = std::vector; #if defined(SWIGWORDSIZE64) %typemap("rtypecheck") std::vector, std::vector *, std::vector & = std::vector; %typemap("rtypecheck") std::vector, std::vector *, std::vector & = std::vector; #else %typemap("rtypecheck") std::vector, std::vector *, std::vector & = std::vector; %typemap("rtypecheck") std::vector, std::vector *, std::vector & = std::vector; #endif /////////////////////////////////////////////////////////////// %typemap_traits_ptr(SWIG_TYPECHECK_VECTOR, std::vector >); %traits_type_name(std::vector< std::vector >); %typemap("rtypecheck") std::vector >, std::vector > *, std::vector > & %{ is.list($arg) && all(sapply($arg , is.integer) || sapply($arg, is.numeric)) %} %typemap("rtype") std::vector >, std::vector > *, std::vector > & "list" %typemap("scoercein") std::vector< std::vector >, std::vector > *, std::vector > & "$input = lapply($input, as.integer);"; %typemap_traits_ptr(SWIG_TYPECHECK_VECTOR, std::vector >); %traits_type_name(std::vector< std::vector >); %typemap("rtypecheck") std::vector >, std::vector > *, std::vector > & %{ is.list($arg) && all(sapply($arg , is.integer) || sapply($arg, is.numeric)) %} %typemap("rtype") std::vector >, std::vector > *, std::vector > & "list" %typemap("scoercein") std::vector< std::vector >, std::vector > *, std::vector > & "$input = lapply($input, as.integer);"; %typemap_traits_ptr(SWIG_TYPECHECK_VECTOR, std::vector >); %traits_type_name(std::vector< std::vector >); %typemap("rtypecheck") std::vector >, std::vector > *, std::vector > & %{ is.list($arg) && all(sapply($arg , is.integer) || sapply($arg, is.numeric)) %} %typemap("rtype") std::vector >, std::vector > *, std::vector > "list" %typemap("scoercein") std::vector< std::vector >, std::vector > *, std::vector > & "$input = lapply($input, as.numeric);"; %typemap_traits_ptr(SWIG_TYPECHECK_VECTOR, std::vector >); %traits_type_name(std::vector< std::vector >); %typemap("rtypecheck") std::vector >, std::vector > *, std::vector > & %{ is.list($arg) && all(sapply($arg , is.integer) || sapply($arg, is.numeric)) %} %typemap("rtype") std::vector >, std::vector > *, std::vector > & "list" %typemap("scoercein") std::vector< std::vector >, std::vector > *, std::vector > & "$input = lapply($input, as.numeric);"; %typemap_traits_ptr(SWIG_TYPECHECK_VECTOR, std::vector >); %traits_type_name(std::vector< std::vector >); %typemap("rtypecheck") std::vector >, std::vector > *, std::vector > & %{ is.list($arg) && all(sapply($arg , is.integer) || sapply($arg, is.numeric)) %} %typemap("rtype") std::vector >, std::vector > *, std::vector > & "list" %typemap("scoercein") std::vector< std::vector >, std::vector > *, std::vector > & "$input = lapply($input, as.logical);"; // we don't want these to be given R classes as they // have already been turned into R vectors. %typemap(scoerceout) std::vector, std::vector*, std::vector&, std::vector , std::vector*, std::vector , std::vector, std::vector*, std::vector&, std::vector, std::vector*, std::vector&, std::vector, std::vector*, std::vector&, std::vector, std::vector*, std::vector&, std::vector, std::vector*, std::vector&, std::vector, std::vector*, std::vector&, std::vector, std::vector*, std::vector&, // vectors of vectors std::vector< std::vector >, std::vector< std::vector >*, std::vector< std::vector >&, std::vector< std::vector >, std::vector< std::vector >*, std::vector< std::vector >&, std::vector< std::vector >, std::vector< std::vector >*, std::vector< std::vector >&, std::vector< std::vector >, std::vector< std::vector >*, std::vector< std::vector >&, std::vector< std::vector >, std::vector< std::vector >*, std::vector< std::vector >& %{ %} #if defined(SWIGWORDSIZE64) %typemap(scoerceout) std::vector, std::vector*, std::vector&, std::vector, std::vector*, std::vector& %{ %} #else %typemap(scoerceout) std::vector, std::vector*, std::vector&, std::vector, std::vector*, std::vector& %{ %} #endif swig-4.0.1/Lib/r/std_alloc.i0000644000175000017500000000003213527063513015430 0ustar williamwilliam%include swig-4.0.1/Lib/r/std_container.i0000644000175000017500000000007113527063513016323 0ustar williamwilliam%include %include swig-4.0.1/Lib/r/ropers.swg0000644000175000017500000000165313527063513015360 0ustar williamwilliam#ifdef __cplusplus %rename(Equal) operator =; %rename(PlusEqual) operator +=; %rename(MinusEqual) operator -=; %rename(MultiplyEqual) operator *=; %rename(DivideEqual) operator /=; %rename(PercentEqual) operator %=; %rename(Plus) operator +; %rename(Minus) operator -; %rename(Multiply) operator *; %rename(Divide) operator /; %rename(Percent) operator %; %rename(Not) operator !; %rename(IndexIntoConst) operator[](unsigned idx) const; %rename(IndexInto) operator[](unsigned idx); %rename(Functor) operator (); %rename(EqualEqual) operator ==; %rename(NotEqual) operator !=; %rename(LessThan) operator <; %rename(LessThanEqual) operator <=; %rename(GreaterThan) operator >; %rename(GreaterThanEqual) operator >=; %rename(And) operator &&; %rename(Or) operator ||; %rename(PlusPlusPrefix) operator++(); %rename(PlusPlusPostfix) operator++(int); %rename(MinusMinusPrefix) operator--(); %rename(MinusMinusPostfix) operator--(int); #endif swig-4.0.1/Lib/r/std_common.i0000644000175000017500000000433613527063513015641 0ustar williamwilliam%include /* Generate the traits for a 'primitive' type, such as 'double', for which the SWIG_AsVal and SWIG_From methods are already defined. */ %define %traits_ptypen(Type...) %fragment(SWIG_Traits_frag(Type),"header", fragment=SWIG_AsVal_frag(Type), fragment=SWIG_From_frag(Type), fragment="StdTraits") { namespace swig { template <> struct traits< Type > { typedef value_category category; static const char* type_name() { return #Type; } }; template <> struct traits_asval< Type > { typedef Type value_type; static int asval(SEXP obj, value_type *val) { return SWIG_AsVal(Type)(obj, val); } }; template <> struct traits_from< Type > { typedef Type value_type; static SEXP from(const value_type& val) { return SWIG_From(Type)(val); } }; } } %enddef /* Traits for enums. This is bit of a sneaky trick needed because a generic template specialization of enums is not possible (unless using template meta-programming which SWIG doesn't support because of the explicit instantiations required using %template). The STL containers define the 'front' method and the typemap below is used whenever the front method is wrapped returning an enum. This typemap simply picks up the standard enum typemap, but additionally drags in a fragment containing the traits_asval and traits_from required in the generated code for enums. */ %define %traits_enum(Type...) %fragment("SWIG_Traits_enum_"{Type},"header", fragment=SWIG_AsVal_frag(int), fragment=SWIG_From_frag(int), fragment="StdTraits") { namespace swig { template <> struct traits_asval< Type > { typedef Type value_type; static int asval(SEXP obj, value_type *val) { return SWIG_AsVal(int)(obj, (int *)val); } }; template <> struct traits_from< Type > { typedef Type value_type; static SEXP from(const value_type& val) { return SWIG_From(int)((int)val); } }; } } %typemap(out, fragment="SWIG_Traits_enum_"{Type}) const enum SWIGTYPE& front %{$typemap(out, const enum SWIGTYPE&)%} %enddef %include // // Generates the traits for all the known primitive // C++ types (int, double, ...) // %apply_cpptypes(%traits_ptypen); swig-4.0.1/Lib/r/std_except.i0000644000175000017500000000004313527063513015630 0ustar williamwilliam%include swig-4.0.1/Lib/r/typemaps.i0000644000175000017500000000004113527063513015326 0ustar williamwilliam%include swig-4.0.1/Lib/r/rkw.swg0000644000175000017500000000125213527063513014644 0ustar williamwilliam/* Warnings for R keywords, built-in names and bad names. */ #define RKW(x) %keywordwarn("'" `x` "' is a R keyword, renaming to '_" `x`"'", rename="_%s") `x` #define RSWIGKW(x) %keywordwarn("'" `x` "' is a SWIG R reserved parameter name, renaming to '_" `x`"'", rename="_%s") `x` /* Warnings for R reserved words taken from http://cran.r-project.org/doc/manuals/R-lang.html#Reserved-words */ RKW(if); RKW(else); RKW(repeat); RKW(while); RKW(function); RKW(for); RKW(in); RKW(next); RKW(break); RKW(TRUE); RKW(FALSE); RKW(NULL); RKW(Inf); RKW(NaN); RKW(NA); RKW(NA_integer_); RKW(NA_real_); RKW(NA_complex_); RKW(NA_character_); RSWIGKW(self); #undef RKW #undef RSWIGKW swig-4.0.1/Lib/r/rfragments.swg0000644000175000017500000001160313527063513016212 0ustar williamwilliam#define SWIG_Error(code, msg) Rf_warning(msg); return Rf_ScalarLogical(NA_LOGICAL) #define SWIG_fail return Rf_ScalarLogical(NA_LOGICAL) /* for raw pointers */ #define SWIG_ConvertPtr(oc, ptr, ty, flags) SWIG_R_ConvertPtr(oc, ptr, ty, flags) #define SWIG_ConvertFunctionPtr(oc, ptr, ty) SWIG_R_ConvertPtr(oc, ptr, ty, 0) #define SWIG_NewPointerObj(ptr, ty, flags) SWIG_R_NewPointerObj(ptr, ty, flags) #define SWIG_NewFunctionPtrObj(ptr, ty) SWIG_R_NewPointerObj(ptr, ty, 0) /* for raw packed data */ #define SWIG_ConvertPacked(obj, ptr, sz, ty) SWIG_R_ConvertPacked(obj, ptr, sz, ty) #define SWIG_NewPackedObj(ptr, sz, ty) SWIG_R_NewPackedObj(ptr, sz, ty) /* for class or struct pointers */ #define SWIG_ConvertInstance(obj, pptr, ty, flags) SWIG_ConvertPtr(obj, pptr, ty, flags) #define SWIG_NewInstanceObj(ptr, ty, flags) SWIG_NewPointerObj(ptr, ty, flags) /* for C++ member pointers, ie, member methods */ #define SWIG_ConvertMember(obj, ptr, sz, ty) SWIG_R_ConvertPacked(obj, ptr, sz, ty) #define SWIG_NewMemberObj(ptr, sz, ty) SWIG_R_NewPackedObj(ptr, sz, ty) /* Runtime API */ #define SWIG_GetModule(clientdata) SWIG_R_GetModule() #define SWIG_SetModule(clientdata, pointer) SWIG_R_SetModule(pointer) %fragment(SWIG_From_frag(long),"header") { SWIGINTERNINLINE SEXP SWIG_From_dec(long)(long value) { return Rf_ScalarInteger((int)value); } } %fragment(SWIG_AsVal_frag(long),"header") { SWIGINTERNINLINE int SWIG_AsVal_dec(long)(SEXP obj, long *val) { if (val) *val = Rf_asInteger(obj); return SWIG_OK; } } %fragment(SWIG_From_frag(long long),"header", fragment="SWIG_LongLongAvailable") { %#ifdef SWIG_LONG_LONG_AVAILABLE SWIGINTERNINLINE SEXP SWIG_From_dec(long long)(long long value) { return Rf_ScalarInteger((int)value); } %#endif } %fragment(SWIG_AsVal_frag(long long),"header", fragment="SWIG_LongLongAvailable") { %#ifdef SWIG_LONG_LONG_AVAILABLE SWIGINTERNINLINE int SWIG_AsVal_dec(long long)(SEXP obj, long long *val) { if (val) *val = Rf_asInteger(obj); return SWIG_OK; } %#endif } %fragment(SWIG_From_frag(unsigned long),"header") { SWIGINTERNINLINE SEXP SWIG_From_dec(unsigned long)(unsigned long value) { return Rf_ScalarInteger((int)value); } } %fragment(SWIG_AsVal_frag(unsigned long),"header") { SWIGINTERNINLINE int SWIG_AsVal_dec(unsigned long)(SEXP obj, unsigned long *val) { if (val) *val = Rf_asInteger(obj); return SWIG_OK; } } %fragment(SWIG_From_frag(unsigned long long),"header", fragment="SWIG_LongLongAvailable") { %#ifdef SWIG_LONG_LONG_AVAILABLE SWIGINTERNINLINE SEXP SWIG_From_dec(unsigned long long)(unsigned long long value) { return Rf_ScalarInteger((int)value); } %#endif } %fragment(SWIG_AsVal_frag(unsigned long long),"header", fragment="SWIG_LongLongAvailable") { %#ifdef SWIG_LONG_LONG_AVAILABLE SWIGINTERNINLINE int SWIG_AsVal_dec(unsigned long long)(SEXP obj, unsigned long long *val) { if (val) *val = Rf_asInteger(obj); return SWIG_OK; } %#endif } %fragment(SWIG_From_frag(double),"header") { SWIGINTERNINLINE SEXP SWIG_From_dec(double)(double value) { return Rf_ScalarReal(value); } } %fragment(SWIG_AsVal_frag(double),"header") { SWIGINTERNINLINE int SWIG_AsVal_dec(double)(SEXP obj, double *val) { if (val) *val = Rf_asReal(obj); return SWIG_OK; } } %fragment("SWIG_AsCharPtrAndSize", "header") { SWIGINTERN int SWIG_AsCharPtrAndSize(SEXP obj, char** cptr, size_t* psize, int *alloc) { if (cptr && Rf_isString(obj)) { char *cstr = %const_cast(CHAR(STRING_ELT(obj, 0)), char *); int len = strlen(cstr); if (alloc) { if (*alloc == SWIG_NEWOBJ) { *cptr = %new_copy_array(cstr, len + 1, char); *alloc = SWIG_NEWOBJ; } else { *cptr = cstr; } } else { *cptr = %reinterpret_cast(malloc(len + 1), char *); *cptr = strcpy(*cptr, cstr); } if (psize) *psize = len + 1; return SWIG_OK; } return SWIG_TypeError; } } %fragment("SWIG_strdup","header") { SWIGINTERN char * SWIG_strdup(const char *str) { char *newstr = %reinterpret_cast(malloc(strlen(str) + 1), char *); return strcpy(newstr, str); } } //# This is modified from the R header files %fragment("SWIG_FromCharPtrAndSize","header") { SWIGINTERN SEXP SWIG_FromCharPtrAndSize(const char* carray, size_t size) { SEXP t, c; if (!carray) return R_NilValue; /* See R internals document 1.10. MkCharLen was introduced in 2.7.0. Use that instead of hand creating vector. Starting in 2.8.0 creating strings via vectors was deprecated in order to allow for use of CHARSXP caches. */ Rf_protect(t = Rf_allocVector(STRSXP, 1)); %#if R_VERSION >= R_Version(2,7,0) c = Rf_mkCharLen(carray, size); %#else c = Rf_allocVector(CHARSXP, size); strncpy((char *)CHAR(c), carray, size); %#endif SET_STRING_ELT(t, 0, c); Rf_unprotect(1); return t; } } swig-4.0.1/Lib/r/std_pair.i0000644000175000017500000000010413527063513015271 0ustar williamwilliam%fragment("StdPairTraits","header") %{ %} %include swig-4.0.1/Lib/r/rrun.swg0000644000175000017500000002165213527063513015035 0ustar williamwilliam /* Remove global namespace pollution */ #if !defined(SWIG_NO_R_NO_REMAP) # define R_NO_REMAP #endif #if !defined(SWIG_NO_STRICT_R_HEADERS) # define STRICT_R_HEADERS #endif #include #include #ifdef __cplusplus #include extern "C" { #endif /* for raw pointer */ #define SWIG_ConvertPtr(obj, pptr, type, flags) SWIG_R_ConvertPtr(obj, pptr, type, flags) #define SWIG_ConvertPtrAndOwn(obj,pptr,type,flags,own) SWIG_R_ConvertPtr(obj, pptr, type, flags) #define SWIG_NewPointerObj(ptr, type, flags) SWIG_R_NewPointerObj(ptr, type, flags) #include #include #include #if R_VERSION >= R_Version(2,6,0) #define VMAXTYPE void * #else #define VMAXTYPE char * #endif /* This is mainly a way to avoid having lots of local variables that may conflict with those in the routine. Change name to R_SWIG_Callb.... */ typedef struct RCallbackFunctionData { SEXP fun; SEXP userData; SEXP expr; SEXP retValue; int errorOccurred; SEXP el; /* Temporary pointer used in the construction of the expression to call the R function. */ struct RCallbackFunctionData *previous; /* Stack */ } RCallbackFunctionData; static RCallbackFunctionData *callbackFunctionDataStack; SWIGRUNTIME SEXP R_SWIG_debug_getCallbackFunctionData() { int n, i; SEXP ans; RCallbackFunctionData *p = callbackFunctionDataStack; n = 0; while(p) { n++; p = p->previous; } Rf_protect(ans = Rf_allocVector(VECSXP, n)); for(p = callbackFunctionDataStack, i = 0; i < n; p = p->previous, i++) SET_VECTOR_ELT(ans, i, p->fun); Rf_unprotect(1); return(ans); } SWIGRUNTIME RCallbackFunctionData * R_SWIG_pushCallbackFunctionData(SEXP fun, SEXP userData) { RCallbackFunctionData *el; el = (RCallbackFunctionData *) calloc(1, sizeof(RCallbackFunctionData)); el->fun = fun; el->userData = userData; el->previous = callbackFunctionDataStack; callbackFunctionDataStack = el; return(el); } SWIGRUNTIME SEXP R_SWIG_R_pushCallbackFunctionData(SEXP fun, SEXP userData) { R_SWIG_pushCallbackFunctionData(fun, userData); return R_NilValue; } SWIGRUNTIME RCallbackFunctionData * R_SWIG_getCallbackFunctionData() { if(!callbackFunctionDataStack) { Rf_error("Supposedly impossible error occurred in the SWIG callback mechanism." " No callback function data set."); } return callbackFunctionDataStack; } SWIGRUNTIME void R_SWIG_popCallbackFunctionData(int doFree) { RCallbackFunctionData *el = NULL; if(!callbackFunctionDataStack) return ; /* Error !!! */ el = callbackFunctionDataStack ; callbackFunctionDataStack = callbackFunctionDataStack->previous; if(doFree) free(el); } /* Interface to S function is(obj, type) which is to be used to determine if an external pointer inherits from the right class. Ideally, we would like to be able to do this without an explicit call to the is() function. When the S4 class system uses its own SEXP types, then we will hopefully be able to do this in the C code. Should we make the expression static and preserve it to avoid the overhead of allocating each time. */ SWIGRUNTIME int R_SWIG_checkInherits(SEXP obj, SEXP tag, const char *type) { SEXP e, val; int check_err = 0; Rf_protect(e = Rf_allocVector(LANGSXP, 3)); SETCAR(e, Rf_install("extends")); SETCAR(CDR(e), Rf_mkString(CHAR(PRINTNAME(tag)))); SETCAR(CDR(CDR(e)), Rf_mkString(type)); val = R_tryEval(e, R_GlobalEnv, &check_err); Rf_unprotect(1); if(check_err) return(0); return(LOGICAL(val)[0]); } SWIGRUNTIME void * R_SWIG_resolveExternalRef(SEXP arg, const char * const type, const char * const argName, Rboolean nullOk) { void *ptr; SEXP orig = arg; if(TYPEOF(arg) != EXTPTRSXP) arg = GET_SLOT(arg, Rf_mkString("ref")); if(TYPEOF(arg) != EXTPTRSXP) { Rf_error("argument %s must be an external pointer (from an ExternalReference)", argName); } ptr = R_ExternalPtrAddr(arg); if(ptr == NULL && nullOk == (Rboolean) FALSE) { Rf_error("the external pointer (of type %s) for argument %s has value NULL", argName, type); } if(type[0] && R_ExternalPtrTag(arg) != Rf_install(type) && strcmp(type, "voidRef") && !R_SWIG_checkInherits(orig, R_ExternalPtrTag(arg), type)) { Rf_error("the external pointer for argument %s has tag %s, not the expected value %s", argName, CHAR(PRINTNAME(R_ExternalPtrTag(arg))), type); } return(ptr); } SWIGRUNTIME void R_SWIG_ReferenceFinalizer(SEXP el) { void *ptr = R_SWIG_resolveExternalRef(el, "", "", (Rboolean) 1); fprintf(stderr, "In R_SWIG_ReferenceFinalizer for %p\n", ptr); Rf_PrintValue(el); if(ptr) { if(TYPEOF(el) != EXTPTRSXP) el = GET_SLOT(el, Rf_mkString("ref")); if(TYPEOF(el) == EXTPTRSXP) R_ClearExternalPtr(el); free(ptr); } return; } SWIGRUNTIME SEXP SWIG_MakePtr(void *ptr, const char *typeName, int flags) { SEXP external, r_obj; Rf_protect(external = R_MakeExternalPtr(ptr, Rf_install(typeName), R_NilValue)); Rf_protect(r_obj = NEW_OBJECT(MAKE_CLASS((char *) typeName))); if (flags & SWIG_POINTER_OWN) R_RegisterCFinalizer(external, R_SWIG_ReferenceFinalizer); r_obj = SET_SLOT(r_obj, Rf_mkString((char *) "ref"), external); SET_S4_OBJECT(r_obj); Rf_unprotect(2); return(r_obj); } SWIGRUNTIME SEXP R_SWIG_create_SWIG_R_Array(const char *typeName, SEXP ref, int len) { SEXP arr; /*XXX remove the char * cast when we can. MAKE_CLASS should be declared appropriately. */ Rf_protect(arr = NEW_OBJECT(MAKE_CLASS((char *) typeName))); Rf_protect(arr = R_do_slot_assign(arr, Rf_mkString("ref"), ref)); Rf_protect(arr = R_do_slot_assign(arr, Rf_mkString("dims"), Rf_ScalarInteger(len))); Rf_unprotect(3); SET_S4_OBJECT(arr); return arr; } #define ADD_OUTPUT_ARG(result, pos, value, name) r_ans = AddOutputArgToReturn(pos, value, name, OutputValues); SWIGRUNTIME SEXP AddOutputArgToReturn(int pos, SEXP value, const char *name, SEXP output) { SET_VECTOR_ELT(output, pos, value); return(output); } /* Create a new pointer object */ SWIGRUNTIMEINLINE SEXP SWIG_R_NewPointerObj(void *ptr, swig_type_info *type, int flags) { SEXP rptr; if (!ptr) { return R_NilValue; } rptr = R_MakeExternalPtr(ptr, R_MakeExternalPtr(type, R_NilValue, R_NilValue), R_NilValue); SET_S4_OBJECT(rptr); return rptr; } /* Convert a pointer value */ SWIGRUNTIMEINLINE int SWIG_R_ConvertPtr(SEXP obj, void **ptr, swig_type_info *ty, int flags) { void *vptr; if (!obj) return SWIG_ERROR; if (obj == R_NilValue) { if (ptr) *ptr = NULL; return (flags & SWIG_POINTER_NO_NULL) ? SWIG_NullReferenceError : SWIG_OK; } vptr = R_ExternalPtrAddr(obj); if (ty) { swig_type_info *to = (swig_type_info*) R_ExternalPtrAddr(R_ExternalPtrTag(obj)); if (to == ty) { if (ptr) *ptr = vptr; } else { swig_cast_info *tc = SWIG_TypeCheck(to->name,ty); int newmemory = 0; if (ptr) *ptr = SWIG_TypeCast(tc,vptr,&newmemory); assert(!newmemory); /* newmemory handling not yet implemented */ } } else { if (ptr) *ptr = vptr; } return SWIG_OK; } SWIGRUNTIME swig_module_info * SWIG_GetModule(void *SWIGUNUSEDPARM(clientdata)) { static void *type_pointer = (void *)0; return (swig_module_info *) type_pointer; } SWIGRUNTIME void SWIG_SetModule(void *v, swig_module_info *swig_module) { } typedef struct { void *pack; swig_type_info *ty; size_t size; } RSwigPacked; /* Create a new packed object */ SWIGRUNTIMEINLINE SEXP RSwigPacked_New(void *ptr, size_t sz, swig_type_info *ty) { SEXP rptr; RSwigPacked *sobj = (RSwigPacked*) malloc(sizeof(RSwigPacked)); if (sobj) { void *pack = malloc(sz); if (pack) { memcpy(pack, ptr, sz); sobj->pack = pack; sobj->ty = ty; sobj->size = sz; } else { sobj = 0; } } rptr = R_MakeExternalPtr(sobj, R_NilValue, R_NilValue); return rptr; } SWIGRUNTIME swig_type_info * RSwigPacked_UnpackData(SEXP obj, void *ptr, size_t size) { RSwigPacked *sobj = (RSwigPacked *)R_ExternalPtrAddr(obj); if (sobj->size != size) return 0; memcpy(ptr, sobj->pack, size); return sobj->ty; } SWIGRUNTIMEINLINE SEXP SWIG_R_NewPackedObj(void *ptr, size_t sz, swig_type_info *type) { return ptr ? RSwigPacked_New((void *) ptr, sz, type) : R_NilValue; } /* Convert a packed pointer value */ SWIGRUNTIME int SWIG_R_ConvertPacked(SEXP obj, void *ptr, size_t sz, swig_type_info *ty) { swig_type_info *to = RSwigPacked_UnpackData(obj, ptr, sz); if (!to) return SWIG_ERROR; if (ty) { if (to != ty) { /* check type cast? */ swig_cast_info *tc = SWIG_TypeCheck(to->name,ty); if (!tc) return SWIG_ERROR; } } return SWIG_OK; } #ifdef __cplusplus #define SWIG_exception_noreturn(code, msg) do { throw std::runtime_error(msg); } while(0) #else #define SWIG_exception_noreturn(code, msg) do { return result; } while(0) #endif #ifdef __cplusplus } #endif swig-4.0.1/Lib/r/stl.i0000644000175000017500000000041613527063513014274 0ustar williamwilliam/* ----------------------------------------------------------------------------- * stl.i * ----------------------------------------------------------------------------- */ %include %include %include %include swig-4.0.1/Lib/r/exception.i0000644000175000017500000000034113527063513015465 0ustar williamwilliam%include %insert("runtime") { %define_as(SWIG_exception(code, msg), %block(switch (code) {case SWIG_IndexError: return Rf_ScalarLogical(NA_LOGICAL); default: %error(code, msg); SWIG_fail;} )) } swig-4.0.1/Lib/r/std_list.i0000644000175000017500000000024713527063513015321 0ustar williamwilliam#define %swig_list_methods(Type...) %swig_sequence_methods(Type) #define %swig_list_methods_val(Type...) %swig_sequence_methods_val(Type); %include swig-4.0.1/Lib/r/rstdcommon.swg0000644000175000017500000001172313527063513016232 0ustar williamwilliam%fragment("StdTraits","header",fragment="StdTraitsCommon") { namespace swig { /* Traits that provides the from method */ template struct traits_from_ptr { static SWIG_Object from(Type *val, int owner = 0) { return SWIG_NewPointerObj(val, type_info(), owner); } }; template struct traits_from { static SWIG_Object from(const Type& val) { return traits_from_ptr::from(new Type(val), 1); } }; template struct traits_from { static SWIG_Object from(Type* val) { return traits_from_ptr::from(val, 0); } }; template inline SWIG_Object from(const Type& val) { return traits_from::from(val); } template inline SWIG_Object from_ptr(Type* val, int owner) { return traits_from_ptr::from(val, owner); } /* Traits that provides the asval/as/check method */ template struct traits_asptr { static int asptr(SWIG_Object obj, Type **val) { Type *p = 0; swig_type_info *descriptor = type_info(); int res = descriptor ? SWIG_ConvertPtr(obj, (void **)&p, descriptor, 0) : SWIG_ERROR; if (SWIG_IsOK(res)) { if (val) *val = p; } return res; } }; template inline int asptr(SWIG_Object obj, Type **vptr) { return traits_asptr::asptr(obj, vptr); } template struct traits_asval { static int asval(SWIG_Object obj, Type *val) { if (val) { Type *p = 0; int res = traits_asptr::asptr(obj, &p); if (!SWIG_IsOK(res)) return res; if (p) { typedef typename noconst_traits::noconst_type noconst_type; *(const_cast(val)) = *p; if (SWIG_IsNewObj(res)){ %delete(p); res = SWIG_DelNewMask(res); } return res; } else { return SWIG_ERROR; } } else { return traits_asptr::asptr(obj, (Type **)(0)); } } }; template struct traits_asval { static int asval(SWIG_Object obj, Type **val) { if (val) { typedef typename noconst_traits::noconst_type noconst_type; noconst_type *p = 0; int res = traits_asptr::asptr(obj, &p); if (SWIG_IsOK(res)) { *(const_cast(val)) = p; } return res; } else { return traits_asptr::asptr(obj, (Type **)(0)); } } }; template inline int asval(SWIG_Object obj, Type *val) { return traits_asval::asval(obj, val); } template struct traits_as { static Type as(SWIG_Object obj) { Type v; int res = asval(obj, &v); if (!obj || !SWIG_IsOK(res)) { throw std::invalid_argument("bad type"); } return v; } }; template struct traits_as { static Type as(SWIG_Object obj) { Type *v = 0; int res = (obj ? traits_asptr::asptr(obj, &v) : SWIG_ERROR); if (SWIG_IsOK(res) && v) { if (SWIG_IsNewObj(res)) { Type r(*v); %delete(v); return r; } else { return *v; } } else { throw std::invalid_argument("bad type"); } } }; template struct traits_as { static Type* as(SWIG_Object obj, bool throw_error) { Type *v = 0; int res = (obj ? traits_asptr::asptr(obj, &v) : SWIG_ERROR); if (SWIG_IsOK(res)) { return v; } else { if (throw_error) throw std::invalid_argument("bad type"); return 0; } } }; template inline Type as(SWIG_Object obj) { return traits_as::category>::as(obj); } template struct traits_check { static bool check(SWIG_Object obj) { int res = obj ? asval(obj, (Type *)(0)) : SWIG_ERROR; return SWIG_IsOK(res) ? true : false; } }; template struct traits_check { static bool check(SWIG_Object obj) { int res = obj ? asptr(obj, (Type **)(0)) : SWIG_ERROR; return SWIG_IsOK(res) ? true : false; } }; template inline bool check(SWIG_Object obj) { return traits_check::category>::check(obj); } } } %define %specialize_std_container(Type,Check,As,From) %{ namespace swig { template <> struct traits_asval { typedef Type value_type; static int asval(SWIG_Object obj, value_type *val) { if (Check(obj)) { if (val) *val = As(obj); return SWIG_OK; } return SWIG_ERROR; } }; template <> struct traits_from { typedef Type value_type; static SWIG_Object from(const value_type& val) { return From(val); } }; template <> struct traits_check { static int check(SWIG_Object obj) { int res = Check(obj); return obj && res ? res : 0; } }; } %} %enddef swig-4.0.1/Lib/r/r.swg0000644000175000017500000001442213527063513014305 0ustar williamwilliam/* */ %insert("header") "swiglabels.swg" %insert("init") "swiginit.swg" %insert("runtime") "swigrun.swg" %insert("runtime") "swigerrors.swg" %insert("runtime") "rrun.swg" %init %{ SWIGEXPORT void SWIG_init(void) { %} %include #define %Rruntime %insert("s") #define SWIG_Object SEXP #define VOID_Object R_NilValue #define %append_output(obj) SET_VECTOR_ELT($result, $n, obj) %define %set_constant(name, obj) %begin_block SEXP _obj = obj; assign(name, _obj); %end_block %enddef %define %raise(obj,type,desc) return R_NilValue; %enddef %insert("sinit") "srun.swg" %insert("sinitroutine") %{ SWIG_init(); SWIG_InitializeModule(0); %} %include %typemap(in) (double *x, int len) %{ $1 = REAL(x); $2 = Rf_length(x); %} /* XXX Need to worry about inheritance, e.g. if B extends A and we are looking for an A[], then B elements are okay. */ %typemap(scheck) SWIGTYPE[ANY] %{ # assert(length($input) > $1_dim0) assert(all(sapply($input, class) == "$R_class")); %} %typemap(out) void ""; %typemap(in) int *, int[ANY], signed int *, signed int[ANY], unsigned int *, unsigned int[ANY], short *, short[ANY], signed short *, signed short[ANY], unsigned short *, unsigned short[ANY], long *, long[ANY], signed long *, signed long[ANY], unsigned long *, unsigned long[ANY], long long *, long long[ANY], signed long long *, signed long long[ANY], unsigned long long *, unsigned long long[ANY] { { int _rswigi; int _rswiglen = LENGTH($input); $1 = %static_cast(calloc(sizeof($1_basetype), _rswiglen), $1_ltype); for (_rswigi=0; _rswigi< _rswiglen; _rswigi++) { $1[_rswigi] = INTEGER($input)[_rswigi]; } } } %typemap(in) float *, float[ANY], double *, double[ANY] { { int _rswigi; int _rswiglen = LENGTH($input); $1 = %static_cast(calloc(sizeof($1_basetype), _rswiglen), $1_ltype); for (_rswigi=0; _rswigi<_rswiglen; _rswigi++) { $1[_rswigi] = REAL($input)[_rswigi]; } } } %typemap(freearg,noblock=1) int *, int[ANY], signed int *, signed int[ANY], unsigned int *, unsigned int[ANY], short *, short[ANY], signed short *, signed short[ANY], unsigned short *, unsigned short[ANY], long *, long[ANY], signed long *, signed long[ANY], unsigned long *, unsigned long[ANY], long long *, long long[ANY], signed long long *, signed long long[ANY], unsigned long long *, unsigned long long[ANY], float *, float[ANY], double *, double[ANY] %{ free($1); %} %typemap(freearg, noblock=1) int *OUTPUT, signed int *OUTPUT, unsigned int *OUTPUT, short *OUTPUT, signed short *OUTPUT, unsigned short *OUTPUT, long *OUTPUT, signed long *OUTPUT, unsigned long *OUTPUT, long long *OUTPUT, signed long long *OUTPUT, unsigned long long *OUTPUT, float *OUTPUT, double *OUTPUT, char *OUTPUT, signed char *OUTPUT, unsigned char *OUTPUT {} /* Should we recycle to make the length correct. And warn if length() > the dimension. */ %typemap(scheck) SWIGTYPE [ANY] %{ # assert(length($input) >= $1_dim0) %} /* Handling vector case to avoid warnings, although we just use the first one. */ %typemap(scheck) unsigned int %{ assert(length($input) == 1 && $input >= 0, "All values must be non-negative"); %} %typemap(scheck) int, long %{ if(length($input) > 1) { warning("using only the first element of $input"); }; %} %include %include %include %include %include %typemap(in,noblock=1) enum SWIGTYPE[ANY] { $1 = %reinterpret_cast(INTEGER($input), $1_ltype); } %typemap(in,noblock=1,fragment="SWIG_strdup") char * { $1 = %reinterpret_cast(SWIG_strdup(CHAR(STRING_ELT($input, 0))), $1_ltype); } %typemap(freearg,noblock=1) char * { free($1); } %typemap(in,noblock=1,fragment="SWIG_strdup") char *[ANY] { $1 = %reinterpret_cast(SWIG_strdup(CHAR(STRING_ELT($input, 0))), $1_ltype); } %typemap(freearg,noblock=1) char *[ANY] { free($1); } %typemap(in,noblock=1,fragment="SWIG_strdup") char[ANY] { $1 = SWIG_strdup(CHAR(STRING_ELT($input, 0))); } %typemap(freearg,noblock=1) char[ANY] { free($1); } %typemap(in,noblock=1,fragment="SWIG_strdup") char[] { $1 = SWIG_strdup(CHAR(STRING_ELT($input, 0))); } %typemap(freearg,noblock=1) char[] { free($1); } %typemap(in) const enum SWIGTYPE & ($*1_ltype temp) %{ temp = ($*1_ltype)INTEGER($input)[0]; $1 = &temp; %} %typemap(out) const enum SWIGTYPE & %{ $result = Rf_ScalarInteger((int)*$1); %} %typemap(memberin) char[] %{ if ($input) strcpy($1, $input); else strcpy($1, ""); %} %typemap(globalin) char[] %{ if ($input) strcpy($1, $input); else strcpy($1, ""); %} %typemap(out,noblock=1) char * { $result = $1 ? Rf_mkString(%reinterpret_cast($1,char *)) : R_NilValue; } %typemap(in,noblock=1) char { $1 = %static_cast(CHAR(STRING_ELT($input, 0))[0],$1_ltype); } %typemap(out) char { char tmp[2] = "x"; tmp[0] = $1; $result = Rf_mkString(tmp); } %typemap(in,noblock=1) int, long { $1 = %static_cast(INTEGER($input)[0], $1_ltype); } %typemap(out,noblock=1) int, long "$result = Rf_ScalarInteger($1);"; %typemap(in,noblock=1) bool "$1 = LOGICAL($input)[0] ? true : false;"; %typemap(out,noblock=1) bool "$result = Rf_ScalarLogical($1);"; %typemap(in,noblock=1) float, double { $1 = %static_cast(REAL($input)[0], $1_ltype); } /* Why is this here ? */ /* %typemap(out,noblock=1) unsigned int * "$result = ScalarReal(*($1));"; */ %Rruntime %{ setMethod('[', "ExternalReference", function(x,i,j, ..., drop=TRUE) if (!is.null(x$"__getitem__")) sapply(i, function(n) x$"__getitem__"(i=as.integer(n-1)))) setMethod('[<-' , "ExternalReference", function(x,i,j, ..., value) if (!is.null(x$"__setitem__")) { sapply(1:length(i), function(n) x$"__setitem__"(i=as.integer(i[n]-1), x=value[n])) x }) setAs('ExternalReference', 'character', function(from) {if (!is.null(from$"__str__")) from$"__str__"()}) suppressMessages(suppressWarnings(setMethod('print', 'ExternalReference', function(x) {print(as(x, "character"))}))) %} swig-4.0.1/Lib/r/cdata.i0000644000175000017500000000003613527063513014544 0ustar williamwilliam%include swig-4.0.1/Lib/r/std_string.i0000644000175000017500000000004313527063513015646 0ustar williamwilliam%include swig-4.0.1/Lib/r/rcontainer.swg0000644000175000017500000001260013527063513016204 0ustar williamwilliam // // Common fragments // /**** The python container methods ****/ %fragment("StdSequenceTraits","header",fragment="") { %#include namespace swig { inline size_t check_index(ptrdiff_t i, size_t size, bool insert = false) { if ( i < 0 ) { if ((size_t) (-i) <= size) return (size_t) (i + size); } else if ( (size_t) i < size ) { return (size_t) i; } else if (insert && ((size_t) i == size)) { return size; } throw std::out_of_range("index out of range"); } inline size_t slice_index(ptrdiff_t i, size_t size) { if ( i < 0 ) { if ((size_t) (-i) <= size) { return (size_t) (i + size); } else { throw std::out_of_range("index out of range"); } } else { return ( (size_t) i < size ) ? ((size_t) i) : size; } } template inline typename Sequence::iterator getpos(Sequence* self, Difference i) { typename Sequence::iterator pos = self->begin(); std::advance(pos, check_index(i,self->size())); return pos; } template inline typename Sequence::const_iterator cgetpos(const Sequence* self, Difference i) { typename Sequence::const_iterator pos = self->begin(); std::advance(pos, check_index(i,self->size())); return pos; } template inline Sequence* getslice(const Sequence* self, Difference i, Difference j) { typename Sequence::size_type size = self->size(); typename Sequence::size_type ii = swig::check_index(i, size); typename Sequence::size_type jj = swig::slice_index(j, size); if (jj > ii) { typename Sequence::const_iterator vb = self->begin(); typename Sequence::const_iterator ve = self->begin(); std::advance(vb,ii); std::advance(ve,jj); return new Sequence(vb, ve); } else { return new Sequence(); } } template inline void setslice(Sequence* self, Difference i, Difference j, const InputSeq& v) { typename Sequence::size_type size = self->size(); typename Sequence::size_type ii = swig::check_index(i, size, true); typename Sequence::size_type jj = swig::slice_index(j, size); if (jj < ii) jj = ii; size_t ssize = jj - ii; if (ssize <= v.size()) { typename Sequence::iterator sb = self->begin(); typename InputSeq::const_iterator vmid = v.begin(); std::advance(sb,ii); std::advance(vmid, jj - ii); self->insert(std::copy(v.begin(), vmid, sb), vmid, v.end()); } else { typename Sequence::iterator sb = self->begin(); typename Sequence::iterator se = self->begin(); std::advance(sb,ii); std::advance(se,jj); self->erase(sb,se); self->insert(sb, v.begin(), v.end()); } } template inline void delslice(Sequence* self, Difference i, Difference j) { typename Sequence::size_type size = self->size(); typename Sequence::size_type ii = swig::check_index(i, size, true); typename Sequence::size_type jj = swig::slice_index(j, size); if (jj > ii) { typename Sequence::iterator sb = self->begin(); typename Sequence::iterator se = self->begin(); std::advance(sb,ii); std::advance(se,jj); self->erase(sb,se); } } } } %define %swig_container_methods(Container...) %newobject __getslice__; %extend { bool __nonzero__() const { return !(self->empty()); } size_type __len__() const { return self->size(); } } %enddef %define %swig_sequence_methods_common(Sequence...) // %swig_sequence_iterator(%arg(Sequence)) %swig_container_methods(%arg(Sequence)) %fragment("StdSequenceTraits"); %extend { value_type pop() throw (std::out_of_range) { if (self->size() == 0) throw std::out_of_range("pop from empty container"); Sequence::value_type x = self->back(); self->pop_back(); return x; } Sequence* __getslice__(difference_type i, difference_type j) throw (std::out_of_range) { return swig::getslice(self, i, j); } void __setslice__(difference_type i, difference_type j, const Sequence& v) throw (std::out_of_range, std::invalid_argument) { swig::setslice(self, i, j, v); } void __delslice__(difference_type i, difference_type j) throw (std::out_of_range) { swig::delslice(self, i, j); } void __delitem__(difference_type i) throw (std::out_of_range) { self->erase(swig::getpos(self,i)); } } %enddef %define %swig_sequence_methods(Sequence...) %swig_sequence_methods_common(%arg(Sequence)) %extend { const value_type& __getitem__(difference_type i) const throw (std::out_of_range) { return *(swig::cgetpos(self, i)); } void __setitem__(difference_type i, const value_type& x) throw (std::out_of_range) { *(swig::getpos(self,i)) = x; } void append(const value_type& x) { self->push_back(x); } } %enddef %define %swig_sequence_methods_val(Sequence...) %swig_sequence_methods_common(%arg(Sequence)) %extend { value_type __getitem__(difference_type i) throw (std::out_of_range) { return *(swig::cgetpos(self, i)); } void __setitem__(difference_type i, value_type x) throw (std::out_of_range) { *(swig::getpos(self,i)) = x; } void append(value_type x) { self->push_back(x); } } %enddef swig-4.0.1/Lib/r/std_map.i0000644000175000017500000000010313527063513015112 0ustar williamwilliam%fragment("StdMapTraits","header") %{ %} %include swig-4.0.1/Lib/r/boost_shared_ptr.i0000644000175000017500000005160213527063513017036 0ustar williamwilliam%include // Set SHARED_PTR_DISOWN to $disown if required, for example // #define SHARED_PTR_DISOWN $disown #if !defined(SHARED_PTR_DISOWN) #define SHARED_PTR_DISOWN 0 #endif // Language specific macro implementing all the customisations for handling the smart pointer %define SWIG_SHARED_PTR_TYPEMAPS(CONST, TYPE...) // %naturalvar is as documented for member variables %naturalvar TYPE; %naturalvar SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >; // destructor wrapper customisation %feature("unref") TYPE //"if (debug_shared) { cout << \"deleting use_count: \" << (*smartarg1).use_count() << \" [\" << (boost::get_deleter(*smartarg1) ? std::string(\"CANNOT BE DETERMINED SAFELY\") : ( (*smartarg1).get() ? (*smartarg1)->getValue() : std::string(\"NULL PTR\") )) << \"]\" << endl << flush; }\n" "(void)arg1; delete smartarg1;" // Typemap customisations... // plain value %typemap(in) CONST TYPE (void *argp, int res = 0) { int newmem = 0; res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } if (!argp) { %argument_nullref("$type", $symname, $argnum); } else { $1 = *(%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *)->get()); if (newmem & SWIG_CAST_NEW_MEMORY) delete %reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); } } %typemap(out) CONST TYPE { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(new $1_ltype(($1_ltype &)$1)); %set_output(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } %typemap(varin) CONST TYPE { void *argp = 0; int newmem = 0; int res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %variable_fail(res, "$type", "$name"); } if (!argp) { %variable_nullref("$type", "$name"); } else { $1 = *(%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *)->get()); if (newmem & SWIG_CAST_NEW_MEMORY) delete %reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); } } %typemap(varout) CONST TYPE { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(new $1_ltype(($1_ltype &)$1)); %set_varoutput(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } %typemap(directorin,noblock=1) CONST TYPE (SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0) %{ smartarg = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(new $1_ltype(($1_ltype &)$1)); $input = SWIG_NewPointerObj(%as_voidptr(smartarg), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN | %newpointer_flags); %} %typemap(directorout,noblock=1) CONST TYPE (void *swig_argp, int swig_res = 0) { int newmem = 0; swig_res = SWIG_ConvertPtrAndOwn($input, &swig_argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(swig_res)) { %dirout_fail(swig_res, "$type"); } if (!swig_argp) { %dirout_nullref("$type"); } else { $result = *(%reinterpret_cast(swig_argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *)->get()); if (newmem & SWIG_CAST_NEW_MEMORY) delete %reinterpret_cast(swig_argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); } } // plain pointer // Note: $disown not implemented by default as it will lead to a memory leak of the shared_ptr instance %typemap(in) CONST TYPE * (void *argp = 0, int res = 0, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > tempshared, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0) { int newmem = 0; res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SHARED_PTR_DISOWN | %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } if (newmem & SWIG_CAST_NEW_MEMORY) { tempshared = *%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); delete %reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); $1 = %const_cast(tempshared.get(), $1_ltype); } else { smartarg = %reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); $1 = %const_cast((smartarg ? smartarg->get() : 0), $1_ltype); } } %typemap(out, fragment="SWIG_null_deleter") CONST TYPE * { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1 SWIG_NO_NULL_DELETER_$owner) : 0; %set_output(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), $owner | SWIG_POINTER_OWN)); } %typemap(varin) CONST TYPE * { void *argp = 0; int newmem = 0; int res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %variable_fail(res, "$type", "$name"); } SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > tempshared; SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0; if (newmem & SWIG_CAST_NEW_MEMORY) { tempshared = *%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); delete %reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); $1 = %const_cast(tempshared.get(), $1_ltype); } else { smartarg = %reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); $1 = %const_cast((smartarg ? smartarg->get() : 0), $1_ltype); } } %typemap(varout, fragment="SWIG_null_deleter") CONST TYPE * { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1 SWIG_NO_NULL_DELETER_0) : 0; %set_varoutput(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } %typemap(directorin,noblock=1, fragment="SWIG_null_deleter") CONST TYPE * (SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0) %{ smartarg = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1 SWIG_NO_NULL_DELETER_0) : 0; $input = SWIG_NewPointerObj(%as_voidptr(smartarg), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN | %newpointer_flags); %} %typemap(directorout,noblock=1) CONST TYPE * %{ #error "directorout typemap for plain pointer not implemented" %} // plain reference %typemap(in) CONST TYPE & (void *argp = 0, int res = 0, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > tempshared) { int newmem = 0; res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } if (!argp) { %argument_nullref("$type", $symname, $argnum); } if (newmem & SWIG_CAST_NEW_MEMORY) { tempshared = *%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); delete %reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); $1 = %const_cast(tempshared.get(), $1_ltype); } else { $1 = %const_cast(%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *)->get(), $1_ltype); } } %typemap(out, fragment="SWIG_null_deleter") CONST TYPE & { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1 SWIG_NO_NULL_DELETER_$owner); %set_output(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } %typemap(varin) CONST TYPE & { void *argp = 0; int newmem = 0; int res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %variable_fail(res, "$type", "$name"); } SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > tempshared; if (!argp) { %variable_nullref("$type", "$name"); } if (newmem & SWIG_CAST_NEW_MEMORY) { tempshared = *%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); delete %reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); $1 = *%const_cast(tempshared.get(), $1_ltype); } else { $1 = *%const_cast(%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *)->get(), $1_ltype); } } %typemap(varout, fragment="SWIG_null_deleter") CONST TYPE & { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(&$1 SWIG_NO_NULL_DELETER_0); %set_varoutput(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } %typemap(directorin,noblock=1, fragment="SWIG_null_deleter") CONST TYPE & (SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0) %{ smartarg = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(&$1 SWIG_NO_NULL_DELETER_0); $input = SWIG_NewPointerObj(%as_voidptr(smartarg), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN | %newpointer_flags); %} %typemap(directorout,noblock=1) CONST TYPE & %{ #error "directorout typemap for plain reference not implemented" %} // plain pointer by reference // Note: $disown not implemented by default as it will lead to a memory leak of the shared_ptr instance %typemap(in) TYPE *CONST& (void *argp = 0, int res = 0, $*1_ltype temp = 0, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > tempshared) { int newmem = 0; res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SHARED_PTR_DISOWN | %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } if (newmem & SWIG_CAST_NEW_MEMORY) { tempshared = *%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); delete %reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); temp = %const_cast(tempshared.get(), $*1_ltype); } else { temp = %const_cast(%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *)->get(), $*1_ltype); } $1 = &temp; } %typemap(out, fragment="SWIG_null_deleter") TYPE *CONST& { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = *$1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(*$1 SWIG_NO_NULL_DELETER_$owner) : 0; %set_output(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } %typemap(varin) TYPE *CONST& %{ #error "varin typemap not implemented" %} %typemap(varout) TYPE *CONST& %{ #error "varout typemap not implemented" %} %typemap(directorin,noblock=1, fragment="SWIG_null_deleter") TYPE *CONST& (SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0) %{ smartarg = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1 SWIG_NO_NULL_DELETER_0) : 0; $input = SWIG_NewPointerObj(%as_voidptr(smartarg), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN | %newpointer_flags); %} %typemap(directorout,noblock=1) TYPE *CONST& %{ #error "directorout typemap for plain pointer by reference not implemented" %} // shared_ptr by value %typemap(in) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > (void *argp, int res = 0) { int newmem = 0; res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } if (argp) $1 = *(%reinterpret_cast(argp, $<ype)); if (newmem & SWIG_CAST_NEW_MEMORY) delete %reinterpret_cast(argp, $<ype); } %typemap(out) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1) : 0; %set_output(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } %typemap(varin) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > { int newmem = 0; void *argp = 0; int res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %variable_fail(res, "$type", "$name"); } $1 = argp ? *(%reinterpret_cast(argp, $<ype)) : SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE >(); if (newmem & SWIG_CAST_NEW_MEMORY) delete %reinterpret_cast(argp, $<ype); } %typemap(varout) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1) : 0; %set_varoutput(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } %typemap(directorin,noblock=1) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > (SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0) %{ smartarg = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1) : 0; $input = SWIG_NewPointerObj(%as_voidptr(smartarg), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN | %newpointer_flags); %} %typemap(directorout,noblock=1) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > (void *swig_argp, int swig_res = 0) { int newmem = 0; swig_res = SWIG_ConvertPtrAndOwn($input, &swig_argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(swig_res)) { %dirout_fail(swig_res, "$type"); } if (swig_argp) { $result = *(%reinterpret_cast(swig_argp, $<ype)); if (newmem & SWIG_CAST_NEW_MEMORY) delete %reinterpret_cast(swig_argp, $<ype); } } // shared_ptr by reference %typemap(in) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > & (void *argp, int res = 0, $*1_ltype tempshared) { int newmem = 0; res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } if (newmem & SWIG_CAST_NEW_MEMORY) { if (argp) tempshared = *%reinterpret_cast(argp, $ltype); delete %reinterpret_cast(argp, $ltype); $1 = &tempshared; } else { $1 = (argp) ? %reinterpret_cast(argp, $ltype) : &tempshared; } } %typemap(out) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > & { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = *$1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(*$1) : 0; %set_output(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } %typemap(varin) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > & %{ #error "varin typemap not implemented" %} %typemap(varout) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > & %{ #error "varout typemap not implemented" %} %typemap(directorin,noblock=1) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > & (SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0) %{ smartarg = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1) : 0; $input = SWIG_NewPointerObj(%as_voidptr(smartarg), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN | %newpointer_flags); %} %typemap(directorout,noblock=1) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > & %{ #error "directorout typemap for shared_ptr ref not implemented" %} // shared_ptr by pointer %typemap(in) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * (void *argp, int res = 0, $*1_ltype tempshared) { int newmem = 0; res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } if (newmem & SWIG_CAST_NEW_MEMORY) { if (argp) tempshared = *%reinterpret_cast(argp, $ltype); delete %reinterpret_cast(argp, $ltype); $1 = &tempshared; } else { $1 = (argp) ? %reinterpret_cast(argp, $ltype) : &tempshared; } } %typemap(out) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = ($1 && *$1) ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(*$1) : 0; %set_output(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); if ($owner) delete $1; } %typemap(varin) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * %{ #error "varin typemap not implemented" %} %typemap(varout) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * %{ #error "varout typemap not implemented" %} %typemap(directorin,noblock=1) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * (SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0) %{ smartarg = ($1 && *$1) ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(*$1) : 0; $input = SWIG_NewPointerObj(%as_voidptr(smartarg), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN | %newpointer_flags); %} %typemap(directorout,noblock=1) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * %{ #error "directorout typemap for pointer to shared_ptr not implemented" %} // shared_ptr by pointer reference %typemap(in) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& (void *argp, int res = 0, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > tempshared, $*1_ltype temp = 0) { int newmem = 0; res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } if (argp) tempshared = *%reinterpret_cast(argp, $*ltype); if (newmem & SWIG_CAST_NEW_MEMORY) delete %reinterpret_cast(argp, $*ltype); temp = &tempshared; $1 = &temp; } %typemap(out) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = (*$1 && **$1) ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(**$1) : 0; %set_output(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } %typemap(varin) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& %{ #error "varin typemap not implemented" %} %typemap(varout) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& %{ #error "varout typemap not implemented" %} %typemap(directorin,noblock=1) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& (SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0) %{ smartarg = ($1 && *$1) ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(*$1) : 0; $input = SWIG_NewPointerObj(%as_voidptr(smartarg), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN | %newpointer_flags); %} %typemap(directorout,noblock=1) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& %{ #error "directorout typemap for pointer ref to shared_ptr not implemented" %} // Typecheck typemaps // Note: SWIG_ConvertPtr with void ** parameter set to 0 instead of using SWIG_ConvertPtrAndOwn, so that the casting // function is not called thereby avoiding a possible smart pointer copy constructor call when casting up the inheritance chain. %typemap(typecheck, precedence=SWIG_TYPECHECK_POINTER, equivalent="TYPE *", noblock=1) TYPE CONST, TYPE CONST &, TYPE CONST *, TYPE *CONST&, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > &, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& { int res = SWIG_ConvertPtr($input, 0, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), 0); $1 = SWIG_CheckState(res); } // various missing typemaps - If ever used (unlikely) ensure compilation error rather than runtime bug %typemap(in) CONST TYPE[], CONST TYPE[ANY], CONST TYPE (CLASS::*) %{ #error "typemaps for $1_type not available" %} %typemap(out) CONST TYPE[], CONST TYPE[ANY], CONST TYPE (CLASS::*) %{ #error "typemaps for $1_type not available" %} %template() SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >; %enddef swig-4.0.1/Lib/chicken/0000755000175000017500000000000013527063513014462 5ustar williamwilliamswig-4.0.1/Lib/chicken/extra-install.list0000644000175000017500000000010213527063513020137 0ustar williamwilliamswigclosprefix.scm multi-generic.scm tinyclos-multi-generic.patch swig-4.0.1/Lib/chicken/multi-generic.scm0000644000175000017500000001361413527063513017737 0ustar williamwilliam;; This file is no longer necessary with Chicken versions above 1.92 ;; ;; This file overrides two functions inside TinyCLOS to provide support ;; for multi-argument generics. There are many ways of linking this file ;; into your code... all that needs to happen is this file must be ;; executed after loading TinyCLOS but before any SWIG modules are loaded ;; ;; something like the following ;; (require 'tinyclos) ;; (load "multi-generic") ;; (declare (uses swigmod)) ;; ;; An alternative to loading this scheme code directly is to add a ;; (declare (unit multi-generic)) to the top of this file, and then ;; compile this into the final executable or something. Or compile ;; this into an extension. ;; Lastly, to override TinyCLOS method creation, two functions are ;; overridden: see the end of this file for which two are overridden. ;; You might want to remove those two lines and then exert more control over ;; which functions are used when. ;; Comments, bugs, suggestions: send either to chicken-users@nongnu.org or to ;; Most code copied from TinyCLOS (define (make 'name "multi-generic" 'direct-supers (list ) 'direct-slots '())) (letrec ([applicable? (lambda (c arg) (memq c (class-cpl (class-of arg))))] [more-specific? (lambda (c1 c2 arg) (memq c2 (memq c1 (class-cpl (class-of arg)))))] [filter-in (lambda (f l) (if (null? l) '() (let ([h (##sys#slot l 0)] [r (##sys#slot l 1)] ) (if (f h) (cons h (filter-in f r)) (filter-in f r) ) ) ) )]) (add-method compute-apply-generic (make-method (list ) (lambda (call-next-method generic) (lambda args (let ([cam (let ([x (compute-apply-methods generic)] [y ((compute-methods generic) args)] ) (lambda (args) (x y args)) ) ] ) (cam args) ) ) ) ) ) (add-method compute-methods (make-method (list ) (lambda (call-next-method generic) (lambda (args) (let ([applicable (filter-in (lambda (method) (let check-applicable ([list1 (method-specializers method)] [list2 args]) (cond ((null? list1) #t) ((null? list2) #f) (else (and (applicable? (##sys#slot list1 0) (##sys#slot list2 0)) (check-applicable (##sys#slot list1 1) (##sys#slot list2 1))))))) (generic-methods generic) ) ] ) (if (or (null? applicable) (null? (##sys#slot applicable 1))) applicable (let ([cmms (compute-method-more-specific? generic)]) (sort applicable (lambda (m1 m2) (cmms m1 m2 args))) ) ) ) ) ) ) ) (add-method compute-method-more-specific? (make-method (list ) (lambda (call-next-method generic) (lambda (m1 m2 args) (let loop ((specls1 (method-specializers m1)) (specls2 (method-specializers m2)) (args args)) (cond-expand [unsafe (let ((c1 (##sys#slot specls1 0)) (c2 (##sys#slot specls2 0)) (arg (##sys#slot args 0))) (if (eq? c1 c2) (loop (##sys#slot specls1 1) (##sys#slot specls2 1) (##sys#slot args 1)) (more-specific? c1 c2 arg))) ] [else (cond ((and (null? specls1) (null? specls2)) (##sys#error "two methods are equally specific" generic)) ;((or (null? specls1) (null? specls2)) ; (##sys#error "two methods have different number of specializers" generic)) ((null? specls1) #f) ((null? specls2) #t) ((null? args) (##sys#error "fewer arguments than specializers" generic)) (else (let ((c1 (##sys#slot specls1 0)) (c2 (##sys#slot specls2 0)) (arg (##sys#slot args 0))) (if (eq? c1 c2) (loop (##sys#slot specls1 1) (##sys#slot specls2 1) (##sys#slot args 1)) (more-specific? c1 c2 arg)))) ) ] ) ) ) ) ) ) ) ;; end of letrec (define multi-add-method (lambda (generic method) (slot-set! generic 'methods (let filter-in-method ([methods (slot-ref generic 'methods)]) (if (null? methods) (list method) (let ([l1 (length (method-specializers method))] [l2 (length (method-specializers (##sys#slot methods 0)))]) (cond ((> l1 l2) (cons (##sys#slot methods 0) (filter-in-method (##sys#slot methods 1)))) ((< l1 l2) (cons method methods)) (else (let check-method ([ms1 (method-specializers method)] [ms2 (method-specializers (##sys#slot methods 0))]) (cond ((and (null? ms1) (null? ms2)) (cons method (##sys#slot methods 1))) ;; skip the method already in the generic ((eq? (##sys#slot ms1 0) (##sys#slot ms2 0)) (check-method (##sys#slot ms1 1) (##sys#slot ms2 1))) (else (cons (##sys#slot methods 0) (filter-in-method (##sys#slot methods 1)))))))))))) (##sys#setslot (##sys#slot generic (- (##sys#size generic) 2)) 1 (compute-apply-generic generic)) )) (define (multi-add-global-method val sym specializers proc) (let ((generic (if (procedure? val) val (make 'name (##sys#symbol->string sym))))) (multi-add-method generic (make-method specializers proc)) generic)) ;; Might want to remove these, or perhaps do something like ;; (define old-add-method ##tinyclos#add-method) ;; and then you can switch between creating multi-generics and TinyCLOS generics. (set! ##tinyclos#add-method multi-add-method) (set! ##tinyclos#add-global-method multi-add-global-method) swig-4.0.1/Lib/chicken/typemaps.i0000644000175000017500000002700313527063513016500 0ustar williamwilliam/* ----------------------------------------------------------------------------- * typemaps.i * * Pointer handling * * These mappings provide support for input/output arguments and * common uses for C/C++ pointers. INOUT mappings allow for C/C++ * pointer variables in addition to input/output arguments. * ----------------------------------------------------------------------------- */ // INPUT typemaps. // These remap a C pointer to be an "INPUT" value which is passed by value // instead of reference. /* The following methods can be applied to turn a pointer into a simple "input" value. That is, instead of passing a pointer to an object, you would use a real value instead. int *INPUT short *INPUT long *INPUT long long *INPUT unsigned int *INPUT unsigned short *INPUT unsigned long *INPUT unsigned long long *INPUT unsigned char *INPUT char *INPUT bool *INPUT float *INPUT double *INPUT To use these, suppose you had a C function like this : double fadd(double *a, double *b) { return *a+*b; } You could wrap it with SWIG as follows : %include double fadd(double *INPUT, double *INPUT); or you can use the %apply directive : %include %apply double *INPUT { double *a, double *b }; double fadd(double *a, double *b); */ // OUTPUT typemaps. These typemaps are used for parameters that // are output only. The output value is appended to the result as // a list element. /* The following methods can be applied to turn a pointer into an "output" value. When calling a function, no input value would be given for a parameter, but an output value would be returned. In the case of multiple output values, they are returned in the form of a Scheme list. int *OUTPUT short *OUTPUT long *OUTPUT long long *OUTPUT unsigned int *OUTPUT unsigned short *OUTPUT unsigned long *OUTPUT unsigned long long *OUTPUT unsigned char *OUTPUT char *OUTPUT bool *OUTPUT float *OUTPUT double *OUTPUT For example, suppose you were trying to wrap the modf() function in the C math library which splits x into integral and fractional parts (and returns the integer part in one of its parameters).K: double modf(double x, double *ip); You could wrap it with SWIG as follows : %include double modf(double x, double *OUTPUT); or you can use the %apply directive : %include %apply double *OUTPUT { double *ip }; double modf(double x, double *ip); */ //---------------------------------------------------------------------- // // T_OUTPUT typemap (and helper function) to return multiple argouts as // a tuple instead of a list. // //---------------------------------------------------------------------- // Simple types %define INOUT_TYPEMAP(type_, from_scheme, to_scheme, checker, convtype, storage_) %typemap(in) type_ *INPUT($*1_ltype temp), type_ &INPUT($*1_ltype temp) %{ if (!checker ($input)) { swig_barf (SWIG_BARF1_BAD_ARGUMENT_TYPE, "Argument #$argnum is not of type 'type_'"); } temp = ($*1_ltype) from_scheme ($input); $1 = &temp; %} %typemap(typecheck) type_ *INPUT = type_; %typemap(typecheck) type_ &INPUT = type_; %typemap(in, numinputs=0) type_ *OUTPUT($*1_ltype temp), type_ &OUTPUT($*1_ltype temp) " $1 = &temp;" #if "storage_" == "0" %typemap(argout) type_ *OUTPUT, type_ &OUTPUT %{ if ($1 == NULL) { swig_barf (SWIG_BARF1_ARGUMENT_NULL, "Argument #$argnum must be non-null"); } SWIG_APPEND_VALUE(to_scheme (convtype (*$1))); %} #else %typemap(argout) type_ *OUTPUT, type_ &OUTPUT %{ { C_word *known_space = C_alloc(storage_); if ($1 == NULL) { swig_barf (SWIG_BARF1_ARGUMENT_NULL, "Variable '$1' must be non-null"); } SWIG_APPEND_VALUE(to_scheme (&known_space, convtype (*$1))); } %} #endif %enddef INOUT_TYPEMAP(int, C_num_to_int, C_fix, C_swig_is_number, (int), 0); INOUT_TYPEMAP(enum SWIGTYPE, C_num_to_int, C_fix, C_swig_is_number, (int), 0); INOUT_TYPEMAP(short, C_num_to_int, C_fix, C_swig_is_number, (int), 0); INOUT_TYPEMAP(long, C_num_to_long, C_long_to_num, C_swig_is_long, (long), C_SIZEOF_FLONUM); INOUT_TYPEMAP(long long, C_num_to_long, C_long_to_num, C_swig_is_long, (long), C_SIZEOF_FLONUM); INOUT_TYPEMAP(unsigned int, C_num_to_unsigned_int, C_unsigned_int_to_num, C_swig_is_number, (int), C_SIZEOF_FLONUM); INOUT_TYPEMAP(unsigned short, C_num_to_unsigned_int, C_fix, C_swig_is_number, (unsigned int), 0); INOUT_TYPEMAP(unsigned long, C_num_to_unsigned_long, C_unsigned_long_to_num, C_swig_is_long, (unsigned long), C_SIZEOF_FLONUM); INOUT_TYPEMAP(unsigned long long, C_num_to_unsigned_long, C_unsigned_long_to_num, C_swig_is_long, (unsigned long), C_SIZEOF_FLONUM); INOUT_TYPEMAP(unsigned char, C_character_code, C_make_character, C_swig_is_char, (unsigned int), 0); INOUT_TYPEMAP(signed char, C_character_code, C_make_character, C_swig_is_char, (int), 0); INOUT_TYPEMAP(char, C_character_code, C_make_character, C_swig_is_char, (char), 0); INOUT_TYPEMAP(bool, C_truep, C_mk_bool, C_swig_is_bool, (bool), 0); INOUT_TYPEMAP(float, C_c_double, C_flonum, C_swig_is_number, (double), C_SIZEOF_FLONUM); INOUT_TYPEMAP(double, C_c_double, C_flonum, C_swig_is_number, (double), C_SIZEOF_FLONUM); // INOUT // Mappings for an argument that is both an input and output // parameter /* The following methods can be applied to make a function parameter both an input and output value. This combines the behavior of both the "INPUT" and "OUTPUT" methods described earlier. Output values are returned in the form of a CHICKEN tuple. int *INOUT short *INOUT long *INOUT long long *INOUT unsigned int *INOUT unsigned short *INOUT unsigned long *INOUT unsigned long long *INOUT unsigned char *INOUT char *INOUT bool *INOUT float *INOUT double *INOUT For example, suppose you were trying to wrap the following function : void neg(double *x) { *x = -(*x); } You could wrap it with SWIG as follows : %include void neg(double *INOUT); or you can use the %apply directive : %include %apply double *INOUT { double *x }; void neg(double *x); As well, you can wrap variables with : %include %apply double *INOUT { double *y }; extern double *y; Unlike C, this mapping does not directly modify the input value (since this makes no sense in CHICKEN). Rather, the modified input value shows up as the return value of the function. Thus, to apply this function to a CHICKEN variable you might do this : x = neg(x) Note : previous versions of SWIG used the symbol 'BOTH' to mark input/output arguments. This is still supported, but will be slowly phased out in future releases. */ %typemap(in) int *INOUT = int *INPUT; %typemap(in) enum SWIGTYPE *INOUT = enum SWIGTYPE *INPUT; %typemap(in) short *INOUT = short *INPUT; %typemap(in) long *INOUT = long *INPUT; %typemap(in) long long *INOUT = long long *INPUT; %typemap(in) unsigned *INOUT = unsigned *INPUT; %typemap(in) unsigned short *INOUT = unsigned short *INPUT; %typemap(in) unsigned long *INOUT = unsigned long *INPUT; %typemap(in) unsigned long long *INOUT = unsigned long long *INPUT; %typemap(in) unsigned char *INOUT = unsigned char *INPUT; %typemap(in) char *INOUT = char *INPUT; %typemap(in) bool *INOUT = bool *INPUT; %typemap(in) float *INOUT = float *INPUT; %typemap(in) double *INOUT = double *INPUT; %typemap(in) int &INOUT = int &INPUT; %typemap(in) enum SWIGTYPE &INOUT = enum SWIGTYPE &INPUT; %typemap(in) short &INOUT = short &INPUT; %typemap(in) long &INOUT = long &INPUT; %typemap(in) long long &INOUT = long long &INPUT; %typemap(in) unsigned &INOUT = unsigned &INPUT; %typemap(in) unsigned short &INOUT = unsigned short &INPUT; %typemap(in) unsigned long &INOUT = unsigned long &INPUT; %typemap(in) unsigned long long &INOUT = unsigned long long &INPUT; %typemap(in) unsigned char &INOUT = unsigned char &INPUT; %typemap(in) char &INOUT = char &INPUT; %typemap(in) bool &INOUT = bool &INPUT; %typemap(in) float &INOUT = float &INPUT; %typemap(in) double &INOUT = double &INPUT; %typemap(argout) int *INOUT = int *OUTPUT; %typemap(argout) enum SWIGTYPE *INOUT = enum SWIGTYPE *OUTPUT; %typemap(argout) short *INOUT = short *OUTPUT; %typemap(argout) long *INOUT = long *OUTPUT; %typemap(argout) long long *INOUT = long long *OUTPUT; %typemap(argout) unsigned *INOUT = unsigned *OUTPUT; %typemap(argout) unsigned short *INOUT = unsigned short *OUTPUT; %typemap(argout) unsigned long *INOUT = unsigned long *OUTPUT; %typemap(argout) unsigned long long *INOUT = unsigned long long *OUTPUT; %typemap(argout) unsigned char *INOUT = unsigned char *OUTPUT; %typemap(argout) bool *INOUT = bool *OUTPUT; %typemap(argout) float *INOUT = float *OUTPUT; %typemap(argout) double *INOUT = double *OUTPUT; %typemap(argout) int &INOUT = int &OUTPUT; %typemap(argout) enum SWIGTYPE &INOUT = enum SWIGTYPE &OUTPUT; %typemap(argout) short &INOUT = short &OUTPUT; %typemap(argout) long &INOUT = long &OUTPUT; %typemap(argout) long long &INOUT = long long &OUTPUT; %typemap(argout) unsigned &INOUT = unsigned &OUTPUT; %typemap(argout) unsigned short &INOUT = unsigned short &OUTPUT; %typemap(argout) unsigned long &INOUT = unsigned long &OUTPUT; %typemap(argout) unsigned long long &INOUT = unsigned long long &OUTPUT; %typemap(argout) unsigned char &INOUT = unsigned char &OUTPUT; %typemap(argout) char &INOUT = char &OUTPUT; %typemap(argout) bool &INOUT = bool &OUTPUT; %typemap(argout) float &INOUT = float &OUTPUT; %typemap(argout) double &INOUT = double &OUTPUT; /* Overloading information */ %typemap(typecheck) double *INOUT = double; %typemap(typecheck) bool *INOUT = bool; %typemap(typecheck) char *INOUT = char; %typemap(typecheck) signed char *INOUT = signed char; %typemap(typecheck) unsigned char *INOUT = unsigned char; %typemap(typecheck) unsigned long *INOUT = unsigned long; %typemap(typecheck) unsigned long long *INOUT = unsigned long long; %typemap(typecheck) unsigned short *INOUT = unsigned short; %typemap(typecheck) unsigned int *INOUT = unsigned int; %typemap(typecheck) long *INOUT = long; %typemap(typecheck) long long *INOUT = long long; %typemap(typecheck) short *INOUT = short; %typemap(typecheck) int *INOUT = int; %typemap(typecheck) enum SWIGTYPE *INOUT = enum SWIGTYPE; %typemap(typecheck) float *INOUT = float; %typemap(typecheck) double &INOUT = double; %typemap(typecheck) bool &INOUT = bool; %typemap(typecheck) char &INOUT = char; %typemap(typecheck) signed char &INOUT = signed char; %typemap(typecheck) unsigned char &INOUT = unsigned char; %typemap(typecheck) unsigned long &INOUT = unsigned long; %typemap(typecheck) unsigned long long &INOUT = unsigned long long; %typemap(typecheck) unsigned short &INOUT = unsigned short; %typemap(typecheck) unsigned int &INOUT = unsigned int; %typemap(typecheck) long &INOUT = long; %typemap(typecheck) long long &INOUT = long long; %typemap(typecheck) short &INOUT = short; %typemap(typecheck) int &INOUT = int; %typemap(typecheck) enum SWIGTYPE &INOUT = enum SWIGTYPE; %typemap(typecheck) float &INOUT = float; swig-4.0.1/Lib/chicken/chickenrun.swg0000644000175000017500000002563613527063513017351 0ustar williamwilliam/* ----------------------------------------------------------------------------- * chickenrun.swg * ----------------------------------------------------------------------------- */ #include #include #include #include #include #if (defined(_MSC_VER) && (_MSC_VER < 1900)) || defined(__BORLANDC__) || defined(_WATCOM) # ifndef snprintf # define snprintf _snprintf # endif #endif #ifdef __cplusplus extern "C" { #endif #define SWIG_malloc(size) \ malloc(size) #define SWIG_free(mem) \ free(mem) #define SWIG_MakeString(c) \ SWIG_Chicken_MakeString(c) #define SWIG_ConvertPtr(s, result, type, flags) \ SWIG_Chicken_ConvertPtr(s, result, type, flags) #define SWIG_MustGetPtr(s, type, argnum, flags) \ SWIG_Chicken_MustGetPtr(s, type, argnum, flags) #define SWIG_NewPointerObj(ptr, type, owner) \ SWIG_Chicken_NewPointerObj((void*)ptr, type, owner, &known_space) #define swig_barf SWIG_Chicken_Barf #define SWIG_ThrowException(val) SWIG_Chicken_ThrowException(val) #define SWIG_contract_assert(expr, message) if (!(expr)) { \ SWIG_Chicken_Barf(SWIG_BARF1_CONTRACT_ASSERT, C_text(message)); } else /* Runtime API */ #define SWIG_GetModule(clientdata) SWIG_Chicken_GetModule(clientdata) #define SWIG_SetModule(clientdata, pointer) SWIG_Chicken_SetModule(pointer) #define C_swig_is_bool(x) C_truep (C_booleanp (x)) #define C_swig_is_char(x) C_truep (C_charp (x)) #define C_swig_is_fixnum(x) C_truep (C_fixnump (x)) #define C_swig_is_flonum(x) (C_truep (C_blockp (x)) && C_truep (C_flonump (x))) #define C_swig_is_string(x) (C_truep (C_blockp (x)) && C_truep (C_stringp (x))) #define C_swig_is_vector(x) (C_truep (C_blockp (x)) && C_truep (C_vectorp (x))) #define C_swig_is_list(x) (C_truep (C_i_listp (x))) #define C_swig_is_pair(x) (C_truep (C_blockp(x)) && C_truep (C_pairp(x))) #define C_swig_is_ptr(x) (C_truep (C_blockp (x)) && C_truep (C_pointerp (x))) #define C_swig_is_swigpointer(x) (C_truep (C_blockp(x)) && C_truep (C_swigpointerp(x))) #define C_swig_is_closurep(x) (C_truep (C_blockp(x)) && C_truep(C_closurep(x))) #define C_swig_is_number(x) (C_swig_is_fixnum(x) || C_swig_is_flonum(x)) #define C_swig_is_long(x) C_swig_is_number(x) #define C_swig_sizeof_closure(num) (num+1) #define SWIG_Chicken_SetupArgout { \ C_word *a = C_alloc(C_swig_sizeof_closure(2)); \ C_word *closure = a; \ *(a++)=C_CLOSURE_TYPE|2; \ *(a++)=(C_word)SWIG_Chicken_ApplyResults; \ *(a++)=continuation; \ continuation=(C_word)closure; \ } #define SWIG_APPEND_VALUE(obj) { \ C_word val = (C_word)(obj); \ if (val != C_SCHEME_UNDEFINED) { \ C_word *a = C_alloc(C_swig_sizeof_closure(3)); \ C_word *closure = a; \ *(a++)=C_CLOSURE_TYPE|3; \ *(a++)=(C_word)SWIG_Chicken_MultiResultBuild; \ *(a++)=(C_word)continuation; \ *(a++)=val; \ continuation=(C_word)closure; \ } } #define SWIG_Chicken_FindCreateProxy(func,obj) \ if (C_swig_is_swigpointer(obj)) { \ swig_type_info *t = (swig_type_info *) C_block_item(obj, 1); \ if (t && t->clientdata && ((swig_chicken_clientdata *)t->clientdata)->gc_proxy_create) { \ func = CHICKEN_gc_root_ref( ((swig_chicken_clientdata *)t->clientdata)->gc_proxy_create); \ } else { \ func = C_SCHEME_FALSE; \ } \ } else { \ func = C_SCHEME_FALSE; \ } enum { SWIG_BARF1_BAD_ARGUMENT_TYPE /* 1 arg */, SWIG_BARF1_ARGUMENT_NULL /* 1 arg */, SWIG_BARF1_CONTRACT_ASSERT /* 1 arg */, }; typedef C_word (*swig_chicken_destructor)(C_word,C_word,C_word,C_word); typedef struct swig_chicken_clientdata { void *gc_proxy_create; swig_chicken_destructor destroy; } swig_chicken_clientdata; static char * SWIG_Chicken_MakeString(C_word str) { char *ret; size_t l; l = C_header_size(str); ret = (char *) SWIG_malloc( (l + 1) * sizeof(char)); if (!ret) return NULL; memcpy(ret, C_c_string(str), l); ret[l] = '\0'; return ret; } static C_word SWIG_Chicken_LookupSymbol(char *name, C_SYMBOL_TABLE *stable) { C_word *a = C_alloc(C_SIZEOF_STRING (strlen (name))); C_word n = C_string2(&a, name); C_word sym = C_find_symbol(n, stable); if (C_truep(sym)) { return C_symbol_value(sym); } else { return C_SCHEME_FALSE; } } /* Just a helper function. Do not export it */ static void SWIG_Chicken_Panic (C_char *) C_noret; static void SWIG_Chicken_Panic (C_char *msg) { C_word *a = C_alloc (C_SIZEOF_STRING (strlen (msg))); C_word scmmsg = C_string2 (&a, msg); C_halt (scmmsg); exit (5); /* should never get here */ } static void SWIG_Chicken_Barf(int code, C_char *msg, ...) C_noret; static void SWIG_Chicken_Barf(int code, C_char *msg, ...) { char *errorhook = C_text("\003syserror-hook"); C_word *a = C_alloc (C_SIZEOF_STRING (strlen (errorhook))); C_word err = C_intern2 (&a, errorhook); int c = -1; int i, barfval; va_list v; C_temporary_stack = C_temporary_stack_bottom; err = C_block_item(err, 0); if(C_immediatep (err)) SWIG_Chicken_Panic (C_text ("`##sys#error-hook' is not defined")); switch (code) { case SWIG_BARF1_BAD_ARGUMENT_TYPE: barfval = C_BAD_ARGUMENT_TYPE_ERROR; c = 1; break; case SWIG_BARF1_ARGUMENT_NULL: barfval = C_BAD_ARGUMENT_TYPE_ERROR; c = 1; break; case SWIG_BARF1_CONTRACT_ASSERT: barfval = C_BAD_ARGUMENT_TYPE_ERROR; c = 1; break; default: SWIG_Chicken_Panic (C_text (msg)); }; if(c > 0 && !C_immediatep (err)) { C_save (C_fix (barfval)); i = c; if (i) { C_word *b = C_alloc (C_SIZEOF_STRING (strlen (msg))); C_word scmmsg = C_string2 (&b, msg); C_save (scmmsg); i--; } va_start (v, msg); while(i--) C_save (va_arg (v, C_word)); va_end (v); C_do_apply (c + 1, err, C_SCHEME_UNDEFINED); /* <- no continuation is passed: '##sys#error-hook' may not return! */ } else if (msg) { SWIG_Chicken_Panic (msg); } else { SWIG_Chicken_Panic (C_text ("unspecified panic")); } } static void SWIG_Chicken_ThrowException(C_word value) C_noret; static void SWIG_Chicken_ThrowException(C_word value) { char *aborthook = C_text("\003sysabort"); C_word *a = C_alloc(C_SIZEOF_STRING(strlen(aborthook))); C_word abort = C_intern2(&a, aborthook); abort = C_block_item(abort, 0); if (C_immediatep(abort)) SWIG_Chicken_Panic(C_text("`##sys#abort' is not defined")); C_save(value); C_do_apply(1, abort, C_SCHEME_UNDEFINED); } static void SWIG_Chicken_Finalizer(C_word argc, C_word closure, C_word continuation, C_word s) { swig_type_info *type; swig_chicken_clientdata *cdata; if (argc == 3 && s != C_SCHEME_FALSE && C_swig_is_swigpointer(s)) { type = (swig_type_info *) C_block_item(s, 1); if (type) { cdata = (swig_chicken_clientdata *) type->clientdata; if (cdata && cdata->destroy) { /* this will not return, but will continue correctly */ cdata->destroy(3,closure,continuation,s); } } } C_kontinue(continuation, C_SCHEME_UNDEFINED); } static C_word finalizer_obj[2] = {(C_word) (C_CLOSURE_TYPE|1), (C_word) SWIG_Chicken_Finalizer}; static C_word SWIG_Chicken_NewPointerObj(void *ptr, swig_type_info *type, int owner, C_word **data) { swig_chicken_clientdata *cdata = (swig_chicken_clientdata *) type->clientdata; if (ptr == NULL) return C_SCHEME_FALSE; else { C_word cptr = C_swigmpointer(data, ptr, type); /* add finalizer to object */ #ifndef SWIG_CHICKEN_NO_COLLECTION if (owner) C_do_register_finalizer(cptr, (C_word) finalizer_obj); #endif return cptr; } } /* Return 0 if successful. */ static int SWIG_Chicken_ConvertPtr(C_word s, void **result, swig_type_info *type, int flags) { swig_cast_info *cast; swig_type_info *from; if (s == C_SCHEME_FALSE) { *result = NULL; return (flags & SWIG_POINTER_NO_NULL) ? SWIG_NullReferenceError : SWIG_OK; } else if (C_swig_is_swigpointer(s)) { /* try and convert type */ from = (swig_type_info *) C_block_item(s, 1); if (!from) return 1; if (type) { cast = SWIG_TypeCheckStruct(from, type); if (cast) { int newmemory = 0; *result = SWIG_TypeCast(cast, (void *) C_block_item(s, 0), &newmemory); assert(!newmemory); /* newmemory handling not yet implemented */ } else { return 1; } } else { *result = (void *) C_block_item(s, 0); } /* check if we are disowning this object */ if (flags & SWIG_POINTER_DISOWN) { C_do_unregister_finalizer(s); } } else { return 1; } return 0; } static SWIGINLINE void * SWIG_Chicken_MustGetPtr (C_word s, swig_type_info *type, int argnum, int flags) { void *result; char err_msg[256]; if (SWIG_Chicken_ConvertPtr(s, &result, type, flags)) { /* type mismatch */ snprintf(err_msg, sizeof(err_msg), "Type error in argument #%i: expected %s", argnum, (type->str ? type->str : type->name)); SWIG_Chicken_Barf(SWIG_BARF1_BAD_ARGUMENT_TYPE, err_msg); } return result; } static char *chicken_runtimevar_name = "type_pointer" SWIG_TYPE_TABLE_NAME; static swig_module_info * SWIG_Chicken_GetModule(void *SWIGUNUSEDPARM(clientdata)) { swig_module_info *ret = 0; C_word sym; /* lookup the type pointer... it is stored in its own symbol table */ C_SYMBOL_TABLE *stable = C_find_symbol_table("swig_runtime_data" SWIG_RUNTIME_VERSION); if (stable != NULL) { sym = SWIG_Chicken_LookupSymbol(chicken_runtimevar_name, stable); if (C_truep(sym) && C_swig_is_ptr(sym)) { ret = (swig_module_info *) C_block_item(sym, 0); } } return ret; } static void SWIG_Chicken_SetModule(swig_module_info *module) { C_word *a; C_SYMBOL_TABLE *stable; C_word sym; C_word pointer; static C_word *space = 0; /* type pointer is stored in its own symbol table */ stable = C_find_symbol_table("swig_runtime_data" SWIG_RUNTIME_VERSION); if (stable == NULL) { stable = C_new_symbol_table("swig_runtime_data" SWIG_RUNTIME_VERSION, 16); } if (!space) { space = (C_word *) C_malloc((C_SIZEOF_POINTER + C_SIZEOF_INTERNED_SYMBOL(C_strlen(chicken_runtimevar_name))) * sizeof(C_word)); } a = space; pointer = C_mpointer(&a, (void *) module); sym = C_intern_in(&a, C_strlen(chicken_runtimevar_name), chicken_runtimevar_name, stable); C_set_block_item(sym, 0, pointer); } static C_word SWIG_Chicken_MultiResultBuild(C_word num, C_word closure, C_word lst) { C_word cont = C_block_item(closure,1); C_word obj = C_block_item(closure,2); C_word func; SWIG_Chicken_FindCreateProxy(func,obj); if (C_swig_is_closurep(func)) { ((C_proc4)(void *)C_block_item(func, 0))(4,func,cont,obj,lst); } else { C_word *a = C_alloc(C_SIZEOF_PAIR); C_kontinue(cont,C_pair(&a,obj,lst)); } return C_SCHEME_UNDEFINED; /* never reached */ } static C_word SWIG_Chicken_ApplyResults(C_word num, C_word closure, C_word result) { C_apply_values(3,C_SCHEME_UNDEFINED,C_block_item(closure,1),result); return C_SCHEME_UNDEFINED; /* never reached */ } #ifdef __cplusplus } #endif swig-4.0.1/Lib/chicken/chickenkw.swg0000644000175000017500000000124613527063513017155 0ustar williamwilliam#ifndef CHICKEN_CHICKENKW_SWG_ #define CHICKEN_CHICKENKW_SWG_ /* Warnings for certain CHICKEN keywords. From Section 7.1.1 of Revised^5 Report on the Algorithmic Language Scheme */ #define CHICKENKW(x) %namewarn("314: '" #x "' is a R^5RS syntatic keyword") #x CHICKENKW(else); CHICKENKW(=>); CHICKENKW(define); CHICKENKW(unquote); CHICKENKW(unquote-splicing); CHICKENKW(quote); CHICKENKW(lambda); CHICKENKW(if); CHICKENKW(set!); CHICKENKW(begin); CHICKENKW(cond); CHICKENKW(and); CHICKENKW(or); CHICKENKW(case); CHICKENKW(let); CHICKENKW(let*); CHICKENKW(letrec); CHICKENKW(do); CHICKENKW(delay); CHICKENKW(quasiquote); #undef CHICKENKW #endif //CHICKEN_CHICKENKW_SWG_ swig-4.0.1/Lib/chicken/chicken.swg0000644000175000017500000005514613527063513016623 0ustar williamwilliam/* ----------------------------------------------------------------------------- * chicken.swg * * CHICKEN configuration module. * ----------------------------------------------------------------------------- */ /* chicken.h has to appear first. */ %insert(runtime) %{ #include #include %} %insert(runtime) "swigrun.swg" // Common C API type-checking code %insert(runtime) "swigerrors.swg" // SWIG errors %insert(runtime) "chickenrun.swg" // CHICKEN run-time code /* ----------------------------------------------------------------------------- * standard typemaps * ----------------------------------------------------------------------------- */ /* CHICKEN: C ---------- fixnum: int, short, unsigned int, unsigned short, unsigned char, signed char char: char bool: bool flonum: float, double, long, long long, unsigned long, unsigned long long */ /* --- Primitive types --- */ %define SIMPLE_TYPEMAP(type_, from_scheme, to_scheme, checker, convtype, storage_) %typemap(in) type_ %{ if (!checker ($input)) { swig_barf (SWIG_BARF1_BAD_ARGUMENT_TYPE, "Argument #$argnum is not of type 'type_'"); } $1 = ($1_ltype) from_scheme ($input); %} /* Const primitive references. Passed by value */ %typemap(in) const type_ & ($*1_ltype temp) %{ if (!checker ($input)) { swig_barf (SWIG_BARF1_BAD_ARGUMENT_TYPE, "Argument #$argnum is not of type 'type_'"); } temp = ($*1_ltype) from_scheme ($input); $1 = &temp; %} /* --- Variable input --- */ %typemap(varin) type_ %{ if (!checker ($input)) { swig_barf (SWIG_BARF1_BAD_ARGUMENT_TYPE, "Cannot use '$1_ltype' for variable '$name' of type 'type_'"); } $1 = ($1_ltype) from_scheme ($input); %} #if "storage_" == "0" %typemap(out) type_ %{ $result = to_scheme (convtype ($1)); %} /* References to primitive types. Return by value */ %typemap(out) const type_ & %{ $result = to_scheme (convtype (*$1)); %} /* --- Variable output --- */ %typemap(varout) type_ %{ $result = to_scheme (convtype ($varname)); %} %typemap(throws) type_ %{ SWIG_Chicken_ThrowException(to_scheme ( convtype ($1))); %} #else %typemap(out) type_ %{ { C_word *space = C_alloc(storage_); $result = to_scheme (&space, convtype ($1)); } %} /* References to primitive types. Return by value */ %typemap(out) const type_ & %{ { C_word *space = C_alloc(storage_); $result = to_scheme (&space, convtype (*$1)); } %} /* --- Variable output --- */ %typemap(varout) type_ %{ { C_word *space = C_alloc(storage_); $result = to_scheme (&space, convtype ($varname)); } %} %typemap(throws) type_ %{ { C_word *space = C_alloc(storage_); SWIG_Chicken_ThrowException(to_scheme (&space, convtype ($1))); } %} #endif /* --- Constants --- */ %typemap(constcode) type_ "static const $1_type $result = $value;" %enddef SIMPLE_TYPEMAP(int, C_num_to_int, C_fix, C_swig_is_number, (int), 0); //SIMPLE_TYPEMAP(enum SWIGTYPE, C_unfix, C_fix, C_swig_is_fixnum, (int), 0); SIMPLE_TYPEMAP(short, C_num_to_int, C_fix, C_swig_is_number, (int), 0); SIMPLE_TYPEMAP(long, C_num_to_long, C_long_to_num, C_swig_is_long, (long), C_SIZEOF_FLONUM); SIMPLE_TYPEMAP(long long, C_num_to_long, C_long_to_num, C_swig_is_long, (long), C_SIZEOF_FLONUM); SIMPLE_TYPEMAP(unsigned int, C_num_to_unsigned_int, C_unsigned_int_to_num, C_swig_is_number, (unsigned int), C_SIZEOF_FLONUM); SIMPLE_TYPEMAP(unsigned short, C_num_to_unsigned_int, C_fix, C_swig_is_number, (unsigned int), 0); SIMPLE_TYPEMAP(unsigned long, C_num_to_unsigned_long, C_unsigned_long_to_num, C_swig_is_long, (unsigned long), C_SIZEOF_FLONUM); SIMPLE_TYPEMAP(unsigned long long, C_num_to_unsigned_long, C_unsigned_long_to_num, C_swig_is_long, (unsigned long), C_SIZEOF_FLONUM); SIMPLE_TYPEMAP(unsigned char, C_character_code, C_make_character, C_swig_is_char, (unsigned int), 0); SIMPLE_TYPEMAP(signed char, C_character_code, C_make_character, C_swig_is_char, (int), 0); SIMPLE_TYPEMAP(char, C_character_code, C_make_character, C_swig_is_char, (char), 0); SIMPLE_TYPEMAP(bool, C_truep, C_mk_bool, C_swig_is_bool, (bool), 0); SIMPLE_TYPEMAP(float, C_c_double, C_flonum, C_swig_is_number, (double), C_SIZEOF_FLONUM); SIMPLE_TYPEMAP(double, C_c_double, C_flonum, C_swig_is_number, (double), C_SIZEOF_FLONUM); /* enum SWIGTYPE */ %apply int { enum SWIGTYPE }; %apply const int& { const enum SWIGTYPE& }; %apply const int& { const enum SWIGTYPE&& }; %typemap(varin) enum SWIGTYPE { if (!C_swig_is_fixnum($input) && sizeof(int) != sizeof($1)) { swig_barf(SWIG_BARF1_BAD_ARGUMENT_TYPE, "enum variable '$name' can not be set"); } *((int *)(void *)&$1) = C_unfix($input); } /* --- Input arguments --- */ /* Strings */ %typemap(in) char * { if ($input == C_SCHEME_FALSE) { $1 = NULL; } else { if (!C_swig_is_string ($input)) { swig_barf (SWIG_BARF1_BAD_ARGUMENT_TYPE, "Argument #$argnum is not of type 'char *'"); } $1 = ($ltype) SWIG_MakeString ($input); } } %typemap(freearg) char * "if ($1 != NULL) { free ($1); }" /* Pointers, references, and arrays */ %typemap(in,closcode="(slot-ref $input 'swig-this)") SWIGTYPE *, SWIGTYPE [], SWIGTYPE &, SWIGTYPE && { $1 = ($1_ltype)SWIG_MustGetPtr($input, $descriptor, $argnum, $disown); } %typemap(in,closcode="(slot-ref $input 'swig-this)") SWIGTYPE *DISOWN { $1 = ($1_ltype)SWIG_MustGetPtr($input, $descriptor, $argnum, SWIG_POINTER_DISOWN); } /* Void pointer. Accepts any kind of pointer */ %typemap(in) void * { $1 = ($1_ltype)SWIG_MustGetPtr($input, NULL, $argnum, 0); } %typemap(varin,closcode="(slot-ref $input 'swig-this)") SWIGTYPE * { $1 = ($1_ltype)SWIG_MustGetPtr($input, $descriptor, 1, SWIG_POINTER_DISOWN); } %typemap(varin,closcode="(slot-ref $input 'swig-this)") SWIGTYPE & { $1 = *(($1_ltype)SWIG_MustGetPtr($input, $descriptor, 1, 0)); } %typemap(varin,closcode="(slot-ref $input 'swig-this)") SWIGTYPE && { $1 = *(($1_ltype)SWIG_MustGetPtr($input, $descriptor, 1, 0)); } %typemap(varin) SWIGTYPE [] { SWIG_Chicken_Barf(SWIG_BARF1_BAD_ARGUMENT_TYPE, "Type error"); } %typemap(varin) SWIGTYPE [ANY] { void *temp; int ii; $1_basetype *b = 0; temp = SWIG_MustGetPtr($input, $1_descriptor, 1, 0); b = ($1_basetype *) $1; for (ii = 0; ii < $1_size; ii++) b[ii] = *(($1_basetype *) temp + ii); } %typemap(varin) void * { $1 = SWIG_MustGetPtr($input, NULL, 1, 0); } %typemap(out) SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE [] { C_word *known_space = C_alloc(C_SIZEOF_SWIG_POINTER); $result = SWIG_NewPointerObj($1, $descriptor, $owner); } %typemap(out) SWIGTYPE *DYNAMIC, SWIGTYPE &DYNAMIC { C_word *known_space = C_alloc(C_SIZEOF_SWIG_POINTER); swig_type_info *ty = SWIG_TypeDynamicCast($1_descriptor,(void **) &$1); $result = SWIG_NewPointerObj($1, ty, $owner); } %typemap(varout) SWIGTYPE *, SWIGTYPE [] { C_word *known_space = C_alloc(C_SIZEOF_SWIG_POINTER); $result = SWIG_NewPointerObj($varname, $descriptor, 0); } %typemap(varout) SWIGTYPE & { C_word *known_space = C_alloc(C_SIZEOF_SWIG_POINTER); $result = SWIG_NewPointerObj((void *) &$varname, $1_descriptor, 0); } %typemap(varout) SWIGTYPE && { C_word *known_space = C_alloc(C_SIZEOF_SWIG_POINTER); $result = SWIG_NewPointerObj((void *) &$varname, $1_descriptor, 0); } /* special typemaps for class pointers */ %typemap(in) SWIGTYPE (CLASS::*) { char err_msg[256]; if (C_swig_is_pair($input)) { /* try and convert pointer object */ void *result; if (!SWIG_ConvertPtr(C_block_item($input,1), &result, $descriptor, 0)) { C_word ptr = C_block_item($input,0); if (C_swig_is_string(ptr)) { SWIG_UnpackData(C_c_string(ptr), (void *) &$1, sizeof($type)); } else { snprintf(err_msg, sizeof(err_msg), "Type error in argument #%i: expected %s", $argnum, ($descriptor->str ? $descriptor->str : $descriptor->name)); SWIG_Chicken_Barf(SWIG_BARF1_BAD_ARGUMENT_TYPE, err_msg); } } else { snprintf(err_msg, sizeof(err_msg), "Type error in argument #%i: expected %s", $argnum, ($descriptor->str ? $descriptor->str : $descriptor->name)); SWIG_Chicken_Barf(SWIG_BARF1_BAD_ARGUMENT_TYPE, err_msg); } } else { snprintf(err_msg, sizeof(err_msg), "Type error in argument #%i: expected %s", $argnum, ($descriptor->str ? $descriptor->str : $descriptor->name)); SWIG_Chicken_Barf(SWIG_BARF1_BAD_ARGUMENT_TYPE, err_msg); } } %typemap(out) SWIGTYPE (CLASS::*) { size_t ptr_size = sizeof($type); C_word *known_space = C_alloc(C_SIZEOF_PAIR + C_SIZEOF_STRING(2*ptr_size) + C_SIZEOF_SWIG_POINTER); char *temp = (char *)malloc(2*ptr_size); C_word ptr = SWIG_NewPointerObj((void *) known_space, $descriptor, 0); SWIG_PackData(temp, (void *) &$1, ptr_size); $result = C_pair(&known_space, C_string(&known_space, 2*ptr_size, temp), ptr); free(temp); } %typemap(varin) SWIGTYPE (CLASS::*) { char err_msg[256]; if (C_swig_is_pair($input)) { /* try and convert pointer object */ void *result; if (!SWIG_ConvertPtr(C_block_item($input,1), &result, $descriptor, 0)) { C_word ptr = C_block_item($input,0); if (C_swig_is_string(ptr)) { SWIG_UnpackData(C_c_string(ptr), (void *) &$1, sizeof($type)); } else { snprintf(err_msg, sizeof(err_msg), "Type error in argument #%i: expected %s", 1, ($descriptor->str ? $descriptor->str : $descriptor->name)); SWIG_Chicken_Barf(SWIG_BARF1_BAD_ARGUMENT_TYPE, err_msg); } } else { snprintf(err_msg, sizeof(err_msg), "Type error in argument #%i: expected %s", 1, ($descriptor->str ? $descriptor->str : $descriptor->name)); SWIG_Chicken_Barf(SWIG_BARF1_BAD_ARGUMENT_TYPE, err_msg); } } else { snprintf(err_msg, sizeof(err_msg), "Type error in argument #%i: expected %s", 1, ($descriptor->str ? $descriptor->str : $descriptor->name)); SWIG_Chicken_Barf(SWIG_BARF1_BAD_ARGUMENT_TYPE, err_msg); } } %typemap(varout) SWIGTYPE (CLASS::*) { size_t ptr_size = sizeof($type); C_word *known_space = C_alloc(C_SIZEOF_PAIR + C_SIZEOF_STRING(2*ptr_size) + C_SIZEOF_SWIG_POINTER); char *temp = (char *)malloc(2*ptr_size); C_word ptr = SWIG_NewPointerObj((void *) known_space, $descriptor, 0); SWIG_PackData(temp, (void *) &$varname, ptr_size); $result = C_pair(&known_space, C_string(&known_space, 2*ptr_size, temp), ptr); free(temp); } /* Pass-by-value */ %typemap(in,closcode="(slot-ref $input 'swig-this)") SWIGTYPE($&1_ltype argp) { argp = ($&1_ltype)SWIG_MustGetPtr($input, $&1_descriptor, $argnum, 0); $1 = *argp; } %typemap(varin,closcode="(slot-ref $input 'swig-this)") SWIGTYPE { $&1_ltype argp; argp = ($&1_ltype)SWIG_MustGetPtr($input, $&1_descriptor, 1, 0); $1 = *argp; } %typemap(out) SWIGTYPE #ifdef __cplusplus { $&1_ltype resultptr; C_word *known_space = C_alloc(C_SIZEOF_SWIG_POINTER); resultptr = new $1_ltype((const $1_ltype &) $1); $result = SWIG_NewPointerObj(resultptr, $&1_descriptor, 1); } #else { $&1_ltype resultptr; C_word *known_space = C_alloc(C_SIZEOF_SWIG_POINTER); resultptr = ($&1_ltype) malloc(sizeof($1_type)); memmove(resultptr, &$1, sizeof($1_type)); $result = SWIG_NewPointerObj(resultptr, $&1_descriptor, 1); } #endif %typemap(varout) SWIGTYPE #ifdef __cplusplus { $&1_ltype resultptr; C_word *known_space = C_alloc(C_SIZEOF_SWIG_POINTER); resultptr = new $1_ltype((const $1_ltype&) $1); $result = SWIG_NewPointerObj(resultptr, $&1_descriptor, 0); } #else { $&1_ltype resultptr; C_word *known_space = C_alloc(C_SIZEOF_SWIG_POINTER); resultptr = ($&1_ltype) malloc(sizeof($1_type)); memmove(resultptr, &$1, sizeof($1_type)); $result = SWIG_NewPointerObj(resultptr, $&1_descriptor, 0); } #endif /* --- Output values --- */ /* Strings */ %typemap(out) char * { char *s = (char*) $1; if ($1 == NULL) { $result = C_SCHEME_FALSE; } else { int string_len = strlen ((char *) ($1)); C_word *string_space = C_alloc (C_SIZEOF_STRING (string_len)); $result = C_string (&string_space, string_len, s); } } %typemap(varout) char * { char *s = (char*) $varname; if ($varname == NULL) { $result = C_SCHEME_FALSE; } else { int string_len = strlen ($varname); C_word *string_space = C_alloc (C_SIZEOF_STRING (string_len)); $result = C_string (&string_space, string_len, s); } } %typemap(throws) char * { if ($1 == NULL) { SWIG_Chicken_ThrowException(C_SCHEME_FALSE); } else { int string_len = strlen($1); C_word *string_space = C_alloc(C_SIZEOF_STRING(string_len)); SWIG_Chicken_ThrowException(C_string(&string_space, string_len, (char *) $1)); } } /* Void */ %typemap(out) void %{ $result = C_SCHEME_UNDEFINED; %} /* Special typemap for character array return values */ %typemap(out) char [ANY], const char [ANY] %{ if ($1 == NULL) { $result = C_SCHEME_FALSE; } else { const int string_len = strlen ($1); C_word *string_space = C_alloc (C_SIZEOF_STRING (string_len)); $result = C_string (&string_space, string_len, $1); } %} /* Primitive types--return by value */ /* --- Variable input --- */ /* A string */ #ifdef __cplusplus %typemap(varin) char * { if ($input == C_SCHEME_FALSE) { $1 = NULL; } else if (!C_swig_is_string ($input)) { swig_barf (SWIG_BARF1_BAD_ARGUMENT_TYPE, "C variable '$name ($1_ltype)'"); } else { char *temp = C_c_string ($input); int len = C_header_size ($input); if ($1) delete [] $1; $1 = ($type) new char[len+1]; strncpy((char*)$1, temp, len); ((char*)$1) [len] = 0; } } %typemap(varin,warning="451:Setting const char * variable may leak memory") const char * { if ($input == C_SCHEME_FALSE) { $1 = NULL; } else if (!C_swig_is_string ($input)) { swig_barf (SWIG_BARF1_BAD_ARGUMENT_TYPE, "C variable '$name ($1_ltype)'"); } else { char *temp = C_c_string ($input); int len = C_header_size ($input); $1 = ($type) new char[len+1]; strncpy((char*)$1,temp,len); ((char*)$1) [len] = 0; } } #else %typemap(varin) char * { if ($input == C_SCHEME_FALSE) { $1 = NULL; } else if (!C_swig_is_string ($input)) { swig_barf (SWIG_BARF1_BAD_ARGUMENT_TYPE, "C variable '$name ($1_ltype)'"); } else { char *temp = C_c_string ($input); int len = C_header_size ($input); if ($1) free((char*) $1); $1 = ($type) malloc(len+1); strncpy((char*)$1,temp,len); ((char*)$1) [len] = 0; } } %typemap(varin,warning="451:Setting const char * variable may leak memory") const char * { if ($input == C_SCHEME_FALSE) { $1 = NULL; } else if (!C_swig_is_string ($input)) { swig_barf (SWIG_BARF1_BAD_ARGUMENT_TYPE, "C variable '$name ($1_ltype)'"); } else { char *temp = C_c_string ($input); int len = C_header_size ($input); $1 = ($type) malloc(len+1); strncpy((char*)$1,temp,len); ((char*)$1) [len] = 0; } } #endif %typemap(varin) char [] { swig_barf(SWIG_BARF1_BAD_ARGUMENT_TYPE, "C/C++ variable '$name' is read-only"); } /* Special case for string array variables */ %typemap(varin) char [ANY] { if ($input == C_SCHEME_FALSE) { memset($1,0,$1_dim0*sizeof(char)); } else if (!C_swig_is_string ($input)) { swig_barf (SWIG_BARF1_BAD_ARGUMENT_TYPE, "C variable '$name ($1_ltype)'"); } else { char *temp = C_c_string ($input); strncpy($1,temp,$1_dim0*sizeof(char)); } } /* --- Variable output --- */ /* Void */ %typemap(varout) void "$result = C_SCHEME_UNDEFINED;"; /* Special typemap for character array return values */ %typemap(varout) char [ANY], const char [ANY] %{ if ($varname == NULL) { $result = C_SCHEME_FALSE; } else { const int string_len = strlen ($varname); C_word *string_space = C_alloc (C_SIZEOF_STRING (string_len)); $result = C_string (&string_space, string_len, (char *) $varname); } %} /* --- Constants --- */ %typemap(constcode) char * "static const char *$result = $value;" %typemap(constcode) SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE [] "static const void *$result = (void*) $value;" /* ------------------------------------------------------------ * String & length * ------------------------------------------------------------ */ %typemap(in) (char *STRING, int LENGTH), (char *STRING, size_t LENGTH) { if ($input == C_SCHEME_FALSE) { swig_barf (SWIG_BARF1_BAD_ARGUMENT_TYPE, "Cannot use a null/#f string for a char*, int arguments"); } else if (C_swig_is_string ($input)) { $1 = ($1_ltype) C_c_string ($input); $2 = ($2_ltype) C_header_size ($input); } else { swig_barf (SWIG_BARF1_BAD_ARGUMENT_TYPE, "Argument #$argnum is not of type 'string'"); } } /* ------------------------------------------------------------ * CHICKEN types * ------------------------------------------------------------ */ %typemap(in) C_word "$1 = $input;"; %typemap(out) C_word "$result = $1;"; /* ------------------------------------------------------------ * Typechecking rules * ------------------------------------------------------------ */ %typecheck(SWIG_TYPECHECK_INTEGER) bool, const bool & { $1 = C_swig_is_bool ($input); } %typecheck(SWIG_TYPECHECK_INTEGER) int, short, unsigned int, unsigned short, signed char, unsigned char, const int &, const short &, const unsigned int &, const unsigned short &, enum SWIGTYPE { $1 = C_swig_is_fixnum ($input); } %typecheck(SWIG_TYPECHECK_INTEGER) long, unsigned long, long long, unsigned long long, const long &, const unsigned long &, const long long &, const unsigned long long & { $1 = (C_swig_is_bool ($input) || C_swig_is_fixnum ($input) || C_swig_is_flonum ($input)) ? 1 : 0; } %typecheck(SWIG_TYPECHECK_DOUBLE) float, double, const float &, const double & { $1 = C_swig_is_flonum ($input); } %typecheck(SWIG_TYPECHECK_CHAR) char { $1 = C_swig_is_string ($input); } %typecheck(SWIG_TYPECHECK_STRING) char * { $1 = C_swig_is_string ($input); } %typecheck(SWIG_TYPECHECK_POINTER) SWIGTYPE *, SWIGTYPE [] { void *ptr; $1 = !SWIG_ConvertPtr($input, &ptr, $1_descriptor, 0); } %typecheck(SWIG_TYPECHECK_VOIDPTR) void * { void *ptr; $1 = !SWIG_ConvertPtr($input, &ptr, 0, 0); } %typecheck(SWIG_TYPECHECK_POINTER) SWIGTYPE & { void *ptr = 0; if (SWIG_ConvertPtr($input, &ptr, $descriptor, SWIG_POINTER_NO_NULL)) { $1 = 0; } else { $1 = 1; } } %typecheck(SWIG_TYPECHECK_POINTER) SWIGTYPE && { void *ptr = 0; if (SWIG_ConvertPtr($input, &ptr, $descriptor, SWIG_POINTER_NO_NULL)) { $1 = 0; } else { $1 = 1; } } %typecheck(SWIG_TYPECHECK_POINTER) SWIGTYPE { void *ptr = 0; if (SWIG_ConvertPtr($input, &ptr, $&descriptor, SWIG_POINTER_NO_NULL)) { $1 = 0; } else { $1 = 1; } } /* ------------------------------------------------------------ * Exception handling * ------------------------------------------------------------ */ /* ------------------------------------------------------------ * --- Exception handling --- * ------------------------------------------------------------ */ %typemap(throws) SWIGTYPE { $<ype temp = new $ltype($1); C_word *known_space = C_alloc(C_SIZEOF_SWIG_POINTER); C_word ptr = SWIG_NewPointerObj(temp, $&descriptor,1); SWIG_Chicken_ThrowException(ptr); } %typemap(throws) SWIGTYPE * { C_word *known_space = C_alloc(C_SIZEOF_SWIG_POINTER); C_word ptr = SWIG_NewPointerObj((void *) $1, $descriptor, 0); SWIG_Chicken_ThrowException(ptr); } %typemap(throws) SWIGTYPE [ANY] { C_word *known_space = C_alloc(C_SIZEOF_SWIG_POINTER); C_word ptr = SWIG_NewPointerObj((void *) $1, $descriptor, 0); SWIG_Chicken_ThrowException(ptr); } %typemap(throws) SWIGTYPE & { C_word *known_space = C_alloc(C_SIZEOF_SWIG_POINTER); C_word ptr = SWIG_NewPointerObj((void *)&($1),$descriptor,0); SWIG_Chicken_ThrowException(ptr); } %typemap(throws) SWIGTYPE && { C_word *known_space = C_alloc(C_SIZEOF_SWIG_POINTER); C_word ptr = SWIG_NewPointerObj((void *)&($1),$descriptor,0); SWIG_Chicken_ThrowException(ptr); } /* ------------------------------------------------------------ * ANSI C typemaps * ------------------------------------------------------------ */ %apply unsigned long { size_t }; /* ------------------------------------------------------------ * Various * ------------------------------------------------------------ */ /* Array reference typemaps */ %apply SWIGTYPE & { SWIGTYPE ((&)[ANY]) } %apply SWIGTYPE && { SWIGTYPE ((&&)[ANY]) } /* const pointers */ %apply SWIGTYPE * { SWIGTYPE *const } %apply SWIGTYPE (CLASS::*) { SWIGTYPE (CLASS::*const) } %apply SWIGTYPE & { SWIGTYPE (CLASS::*const&) } /* ------------------------------------------------------------ * Overloaded operator support * ------------------------------------------------------------ */ #ifdef __cplusplus %rename(__add__) *::operator+; %rename(__pos__) *::operator+(); %rename(__pos__) *::operator+() const; %rename(__sub__) *::operator-; %rename(__neg__) *::operator-(); %rename(__neg__) *::operator-() const; %rename(__mul__) *::operator*; %rename(__div__) *::operator/; %rename(__mod__) *::operator%; %rename(__lshift__) *::operator<<; %rename(__rshift__) *::operator>>; %rename(__and__) *::operator&; %rename(__or__) *::operator|; %rename(__xor__) *::operator^; %rename(__invert__) *::operator~; %rename(__iadd__) *::operator+=; %rename(__isub__) *::operator-=; %rename(__imul__) *::operator*=; %rename(__idiv__) *::operator/=; %rename(__imod__) *::operator%=; %rename(__ilshift__) *::operator<<=; %rename(__irshift__) *::operator>>=; %rename(__iand__) *::operator&=; %rename(__ior__) *::operator|=; %rename(__ixor__) *::operator^=; %rename(__lt__) *::operator<; %rename(__le__) *::operator<=; %rename(__gt__) *::operator>; %rename(__ge__) *::operator>=; %rename(__eq__) *::operator==; %rename(__ne__) *::operator!=; /* Special cases */ %rename(__call__) *::operator(); #endif /* Warnings for certain CHICKEN keywords */ %include /* TinyCLOS <--> Low-level CHICKEN */ %typemap("clos_in") SIMPLE_CLOS_OBJECT * "(slot-ref $input (quote this))" %typemap("clos_out") SIMPLE_CLOS_OBJECT * "(make $class (quote this) $1)" %insert(header) %{ #ifdef __cplusplus extern "C" { #endif /* Chicken initialization function */ SWIGEXPORT void SWIG_init(C_word, C_word, C_word) C_noret; #ifdef __cplusplus } #endif %} %insert(closprefix) "swigclosprefix.scm" %insert(init) "swiginit.swg" %insert(init) %{ /* CHICKEN initialization function */ #ifdef __cplusplus extern "C" { #endif SWIGEXPORT void SWIG_init(C_word argc, C_word closure, C_word continuation) { int i; C_word sym; C_word tmp; C_word *a; C_word ret; C_word *return_vec; SWIG_InitializeModule(0); SWIG_PropagateClientData(); ret = C_SCHEME_TRUE; #if $veclength return_vec = C_alloc(C_SIZEOF_VECTOR($veclength)); ret = (C_word) return_vec; *(return_vec++) = C_VECTOR_TYPE | $veclength; #endif a = C_alloc(2*$nummethods$symsize); %} swig-4.0.1/Lib/chicken/tinyclos-multi-generic.patch0000644000175000017500000001311313527063513022110 0ustar williamwilliam# This patch is against chicken 1.92, but it should work just fine # with older versions of chicken. It adds support for mulit-argument # generics, that is, generics now correctly handle adding methods # with different lengths of specializer lists # This patch has been committed into the CHICKEN darcs repository, # so chicken versions above 1.92 work fine. # Comments, bugs, suggestions send to chicken-users@nongnu.org # Patch written by John Lenz --- tinyclos.scm.old 2005-04-05 01:13:56.000000000 -0500 +++ tinyclos.scm 2005-04-11 16:37:23.746181489 -0500 @@ -37,8 +37,10 @@ (include "parameters") +(cond-expand [(not chicken-compile-shared) (declare (unit tinyclos))] + [else] ) + (declare - (unit tinyclos) (uses extras) (usual-integrations) (fixnum) @@ -234,7 +236,10 @@ y = C_block_item(y, 1); } } - return(C_block_item(v, i + 1)); + if (x == C_SCHEME_END_OF_LIST && y == C_SCHEME_END_OF_LIST) + return(C_block_item(v, i + 1)); + else + goto mismatch; } else if(free_index == -1) free_index = i; mismatch: @@ -438,7 +443,7 @@ (define hash-arg-list (foreign-lambda* unsigned-int ((scheme-object args) (scheme-object svector)) " C_word tag, h, x; - int n, i, j; + int n, i, j, len = 0; for(i = 0; args != C_SCHEME_END_OF_LIST; args = C_block_item(args, 1)) { x = C_block_item(args, 0); if(C_immediatep(x)) { @@ -481,8 +486,9 @@ default: i += 255; } } + ++len; } - return(i & (C_METHOD_CACHE_SIZE - 1));") ) + return((i + len) & (C_METHOD_CACHE_SIZE - 1));") ) ; @@ -868,13 +874,27 @@ (##tinyclos#slot-set! generic 'methods - (cons method - (filter-in - (lambda (m) - (let ([ms1 (method-specializers m)] - [ms2 (method-specializers method)] ) - (not (every2 (lambda (x y) (eq? x y)) ms1 ms2) ) ) ) - (##tinyclos#slot-ref generic 'methods)))) + (let* ([ms1 (method-specializers method)] + [l1 (length ms1)] ) + (let filter-in-method ([methods (##tinyclos#slot-ref generic 'methods)]) + (if (null? methods) + (list method) + (let* ([mm (##sys#slot methods 0)] + [ms2 (method-specializers mm)] + [l2 (length ms2)]) + (cond ((> l1 l2) + (cons mm (filter-in-method (##sys#slot methods 1)))) + ((< l1 l2) + (cons method methods)) + (else + (let check-method ([ms1 ms1] + [ms2 ms2]) + (cond ((and (null? ms1) (null? ms2)) + (cons method (##sys#slot methods 1))) ;; skip the method already in the generic + ((eq? (##sys#slot ms1 0) (##sys#slot ms2 0)) + (check-method (##sys#slot ms1 1) (##sys#slot ms2 1))) + (else + (cons mm (filter-in-method (##sys#slot methods 1))))))))))))) (if (memq generic generic-invocation-generics) (set! method-cache-tag (vector)) (%entity-cache-set! generic #f) ) @@ -925,11 +945,13 @@ (memq (car args) generic-invocation-generics)) (let ([proc (method-procedure + ; select the first method of one argument (let lp ([lis (generic-methods generic)]) - (let ([tail (##sys#slot lis 1)]) - (if (null? tail) - (##sys#slot lis 0) - (lp tail)) ) ) ) ] ) + (if (null? lis) + (##sys#error "Unable to find original compute-apply-generic") + (if (= (length (method-specializers (##sys#slot lis 0))) 1) + (##sys#slot lis 0) + (lp (##sys#slot lis 1)))))) ] ) (lambda (args) (apply proc #f args)) ) (let ([x (compute-apply-methods generic)] [y ((compute-methods generic) args)] ) @@ -946,9 +968,13 @@ (lambda (args) (let ([applicable (filter-in (lambda (method) - (every2 applicable? - (method-specializers method) - args)) + (let check-applicable ([list1 (method-specializers method)] + [list2 args]) + (cond ((null? list1) #t) + ((null? list2) #f) + (else + (and (applicable? (##sys#slot list1 0) (##sys#slot list2 0)) + (check-applicable (##sys#slot list1 1) (##sys#slot list2 1))))))) (generic-methods generic) ) ] ) (if (or (null? applicable) (null? (##sys#slot applicable 1))) applicable @@ -975,8 +1001,10 @@ [else (cond ((and (null? specls1) (null? specls2)) (##sys#error "two methods are equally specific" generic)) - ((or (null? specls1) (null? specls2)) - (##sys#error "two methods have different number of specializers" generic)) + ;((or (null? specls1) (null? specls2)) + ; (##sys#error "two methods have different number of specializers" generic)) + ((null? specls1) #f) + ((null? specls2) #t) ((null? args) (##sys#error "fewer arguments than specializers" generic)) (else @@ -1210,7 +1238,7 @@ (define (make-primitive-class "structure")) (define (make-primitive-class "procedure" )) (define (make-primitive-class "end-of-file")) -(define (make-primitive-class "environment" )) ; (Benedikt insisted on this) +(define (make-primitive-class "environment" )) (define (make-primitive-class "hash-table" )) (define (make-primitive-class "promise" )) (define (make-primitive-class "queue" )) swig-4.0.1/Lib/chicken/std_string.i0000644000175000017500000000452713527063513017024 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_string.i * * SWIG typemaps for std::string * ----------------------------------------------------------------------------- */ %{ #include %} namespace std { %naturalvar string; %insert(closprefix) %{ (declare (hide )) %} %nodefault string; %rename("std-string") string; class string { public: ~string() {} }; %extend string { char *str; } %{ #define std_string_str_get(s) ((char *)((s)->c_str())) #define std_string_str_set(s,v) (s->assign((char *)(v))) %} %typemap(typecheck) string = char *; %typemap(typecheck) const string & = char *; %typemap(in) string (char * tempptr) { if ($input == C_SCHEME_FALSE) { $1.resize(0); } else { if (!C_swig_is_string ($input)) { swig_barf (SWIG_BARF1_BAD_ARGUMENT_TYPE, "Argument #$argnum is not a string"); } tempptr = SWIG_MakeString($input); $1.assign(tempptr); if (tempptr) SWIG_free(tempptr); } } %typemap(in) const string& ($*1_ltype temp, char *tempptr) { if ($input == C_SCHEME_FALSE) { temp.resize(0); $1 = &temp; } else { if (!C_swig_is_string ($input)) { swig_barf (SWIG_BARF1_BAD_ARGUMENT_TYPE, "Argument #$argnum is not a string"); } tempptr = SWIG_MakeString($input); temp.assign(tempptr); if (tempptr) SWIG_free(tempptr); $1 = &temp; } } %typemap(out) string { int size = $1.size(); C_word *space = C_alloc (C_SIZEOF_STRING (size)); $result = C_string (&space, size, (char *) $1.c_str()); } %typemap(out) const string& { int size = $1->size(); C_word *space = C_alloc (C_SIZEOF_STRING (size)); $result = C_string (&space, size, (char *) $1->c_str()); } %typemap(varin) string { if ($input == C_SCHEME_FALSE) { $1.resize(0); } else { char *tempptr; if (!C_swig_is_string ($input)) { swig_barf (SWIG_BARF1_BAD_ARGUMENT_TYPE, "Argument #$argnum is not a string"); } tempptr = SWIG_MakeString($input); $1.assign(tempptr); if (tempptr) SWIG_free(tempptr); } } %typemap(varout) string { int size = $1.size(); C_word *space = C_alloc (C_SIZEOF_STRING (size)); $result = C_string (&space, size, (char *) $1.c_str()); } } swig-4.0.1/Lib/chicken/swigclosprefix.scm0000644000175000017500000000221613527063513020237 0ustar williamwilliam(declare (hide swig-initialize)) (define (swig-initialize obj initargs create) (slot-set! obj 'swig-this (if (memq 'swig-this initargs) (cadr initargs) (let ((ret (apply create initargs))) (if (instance? ret) (slot-ref ret 'swig-this) ret))))) (define-class () (void)) (define-method (compute-getter-and-setter (class ) slot allocator) (if (not (memq ':swig-virtual slot)) (call-next-method) (let ((getter (let search-get ((lst slot)) (if (null? lst) #f (if (eq? (car lst) ':swig-get) (cadr lst) (search-get (cdr lst)))))) (setter (let search-set ((lst slot)) (if (null? lst) #f (if (eq? (car lst) ':swig-set) (cadr lst) (search-set (cdr lst))))))) (values (lambda (o) (getter (slot-ref o 'swig-this))) (lambda (o new) (setter (slot-ref o 'swig-this) new) new))))) swig-4.0.1/Lib/carrays.i0000644000175000017500000000512613527063513014700 0ustar williamwilliam/* ----------------------------------------------------------------------------- * carrays.i * * SWIG library file containing macros that can be used to manipulate simple * pointers as arrays. * ----------------------------------------------------------------------------- */ /* ----------------------------------------------------------------------------- * %array_functions(TYPE,NAME) * * Generates functions for creating and accessing elements of a C array * (as pointers). Creates the following functions: * * TYPE *new_NAME(int nelements) * void delete_NAME(TYPE *); * TYPE NAME_getitem(TYPE *, int index); * void NAME_setitem(TYPE *, int index, TYPE value); * * ----------------------------------------------------------------------------- */ %define %array_functions(TYPE,NAME) %{ static TYPE *new_##NAME(int nelements) { %} #ifdef __cplusplus %{ return new TYPE[nelements](); %} #else %{ return (TYPE *) calloc(nelements,sizeof(TYPE)); %} #endif %{} static void delete_##NAME(TYPE *ary) { %} #ifdef __cplusplus %{ delete [] ary; %} #else %{ free(ary); %} #endif %{} static TYPE NAME##_getitem(TYPE *ary, int index) { return ary[index]; } static void NAME##_setitem(TYPE *ary, int index, TYPE value) { ary[index] = value; } %} TYPE *new_##NAME(int nelements); void delete_##NAME(TYPE *ary); TYPE NAME##_getitem(TYPE *ary, int index); void NAME##_setitem(TYPE *ary, int index, TYPE value); %enddef /* ----------------------------------------------------------------------------- * %array_class(TYPE,NAME) * * Generates a class wrapper around a C array. The class has the following * interface: * * struct NAME { * NAME(int nelements); * ~NAME(); * TYPE getitem(int index); * void setitem(int index, TYPE value); * TYPE * cast(); * static NAME *frompointer(TYPE *t); * } * * ----------------------------------------------------------------------------- */ %define %array_class(TYPE,NAME) %{ typedef TYPE NAME; %} typedef struct { /* Put language specific enhancements here */ } NAME; %extend NAME { #ifdef __cplusplus NAME(int nelements) { return new TYPE[nelements](); } ~NAME() { delete [] self; } #else NAME(int nelements) { return (TYPE *) calloc(nelements,sizeof(TYPE)); } ~NAME() { free(self); } #endif TYPE getitem(int index) { return self[index]; } void setitem(int index, TYPE value) { self[index] = value; } TYPE * cast() { return self; } static NAME *frompointer(TYPE *t) { return (NAME *) t; } }; %types(NAME = TYPE); %enddef swig-4.0.1/Lib/swigarch.i0000644000175000017500000000305413527063513015041 0ustar williamwilliam/* ----------------------------------------------------------------------------- * swigarch.i * * SWIG library file for 32bit/64bit code specialization and checking. * * Use only in extreme cases, when no arch. independent code can be * generated * * To activate architecture specific code, use * * swig -DSWIGWORDSIZE32 * * or * * swig -DSWIGWORDSIZE64 * * Note that extra checking code will be added to the wrapped code, * which will prevent the compilation in a different architecture. * * If you don't specify the SWIGWORDSIZE (the default case), swig will * generate architecture independent and/or 32bits code, with no extra * checking code added. * ----------------------------------------------------------------------------- */ #if !defined(SWIGWORDSIZE32) && !defined(SWIGWORDSIZE64) # if (__WORDSIZE == 32) # define SWIGWORDSIZE32 # endif #endif #if !defined(SWIGWORDSIZE64) && !defined(SWIGWORDSIZE32) # if defined(__x86_64) || defined(__x86_64__) || (__WORDSIZE == 64) # define SWIGWORDSIZE64 # endif #endif #ifdef SWIGWORDSIZE32 %{ #define SWIGWORDSIZE32 #ifndef LONG_MAX #include #endif #if (__WORDSIZE == 64) || (LONG_MAX != INT_MAX) # error "SWIG wrapped code invalid in 64 bit architecture, regenerate code using -DSWIGWORDSIZE64" #endif %} #endif #ifdef SWIGWORDSIZE64 %{ #define SWIGWORDSIZE64 #ifndef LONG_MAX #include #endif #if (__WORDSIZE == 32) || (LONG_MAX == INT_MAX) # error "SWIG wrapped code invalid in 32 bit architecture, regenerate code using -DSWIGWORDSIZE32" #endif %} #endif swig-4.0.1/Lib/allegrocl/0000755000175000017500000000000013527063513015022 5ustar williamwilliamswig-4.0.1/Lib/allegrocl/allegrocl.swg0000644000175000017500000005765113527063513017526 0ustar williamwilliam/* Define a C preprocessor symbol that can be used in interface files to distinguish between the SWIG language modules. */ #define SWIG_ALLEGRO_CL #define %ffargs(...) %feature("ffargs", "1", ##__VA_ARGS__) %ffargs(strings_convert="t"); /* typemaps for argument and result type conversions. */ %typemap(lin,numinputs=1) SWIGTYPE "(cl::let (($out $in))\n $body)"; %typemap(lout) bool, char, unsigned char, signed char, short, signed short, unsigned short, int, signed int, unsigned int, long, signed long, unsigned long, float, double, long double, char *, void *, enum SWIGTYPE "(cl::setq ACL_ffresult $body)"; %typemap(lout) void "$body"; #ifdef __cplusplus %typemap(lout) SWIGTYPE[ANY], SWIGTYPE *, SWIGTYPE &, SWIGTYPE && %{ (cl:let* ((address $body) (new-inst (cl:make-instance '$lclass :foreign-address address))) (cl:when (cl:and $owner (cl:not (cl:zerop address))) (excl:schedule-finalization new-inst #'$ldestructor)) (cl:setq ACL_ffresult new-inst)) %} %typemap(lout) SWIGTYPE "(cl::let* ((address $body)\n (new-inst (cl::make-instance '$lclass :foreign-address address)))\n (cl::unless (cl::zerop address)\n (excl:schedule-finalization new-inst #'$ldestructor))\n (cl::setq ACL_ffresult new-inst))"; #else %typemap(lout) SWIGTYPE[ANY], SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE %{ (cl:let* ((address $body) (new-inst (cl:make-instance '$lclass :foreign-address address))) (cl:setq ACL_ffresult new-inst)) %} #endif %typemap(lisptype) bool, const bool "cl:boolean"; %typemap(lisptype) char, const char "cl:character"; %typemap(lisptype) unsigned char, const unsigned char "cl:integer"; %typemap(lisptype) signed char, const signed char "cl:integer"; %typemap(ffitype) bool, const bool ":int"; %typemap(ffitype) char, const char, signed char, const signed char ":char"; %typemap(ffitype) unsigned char, const unsigned char ":unsigned-char"; %typemap(ffitype) short, const short, signed short, const signed short ":short"; %typemap(ffitype) unsigned short, const unsigned short ":unsigned-short"; %typemap(ffitype) int, const int, signed int, const signed int ":int"; %typemap(ffitype) unsigned int, const unsigned int ":unsigned-int"; %typemap(ffitype) long, const long, signed long, const signed long ":long"; %typemap(ffitype) unsigned long, const unsigned long ":unsigned-long"; %typemap(ffitype) float, const float ":float"; %typemap(ffitype) double, const double ":double"; %typemap(ffitype) char *, const char *, signed char *, const signed char *, signed char &, const signed char & "(* :char)"; %typemap(ffitype) unsigned char *, const unsigned char *, unsigned char &, const unsigned char & "(* :unsigned-char)"; %typemap(ffitype) short *, const short *, short &, const short & "(* :short)"; %typemap(ffitype) unsigned short *, const unsigned short *, unsigned short &, const unsigned short & "(* :unsigned-short)"; %typemap(ffitype) int *, const int *, int &, const int & "(* :int)"; %typemap(ffitype) unsigned int *, const unsigned int *, unsigned int &, const unsigned int & "(* :unsigned-int)"; %typemap(ffitype) void * "(* :void)"; %typemap(ffitype) void ":void"; %typemap(ffitype) enum SWIGTYPE ":int"; %typemap(ffitype) SWIGTYPE & "(* :void)"; %typemap(ffitype) SWIGTYPE && "(* :void)"; /* const typemaps idea: marshall all primitive c types to their respective lisp types to maintain const corretness. For pointers/references, all bets are off if you try to modify them. idea: add a constant-p slot to the base foreign-pointer class. For constant pointer/references check this value when setting (around method?) and error if a setf operation is performed on the address of this object. */ /* %exception %{ try { $action } catch (...) { return $null; } %} */ // %typemap(throws) SWIGTYPE { // (void)$1; // SWIG_fail; // } %typemap(ctype) bool, const bool "int"; %typemap(ctype) char, unsigned char, signed char, short, signed short, unsigned short, int, signed int, unsigned int, long, signed long, unsigned long, float, double, long double, char *, void *, void, enum SWIGTYPE, SWIGTYPE *, SWIGTYPE[], SWIGTYPE[ANY], SWIGTYPE &, SWIGTYPE &&, const SWIGTYPE "$1_ltype"; %typemap(ctype) SWIGTYPE "$&1_type"; %typemap(in) bool "$1 = (bool)$input;"; %typemap(in) char, unsigned char, signed char, short, signed short, unsigned short, int, signed int, unsigned int, long, signed long, unsigned long, float, double, long double, char *, void *, void, enum SWIGTYPE, SWIGTYPE *, SWIGTYPE[], SWIGTYPE[ANY], SWIGTYPE &, SWIGTYPE && "$1 = $input;"; %typemap(in) SWIGTYPE "$1 = *$input;"; /* We don't need to do any actual C-side typechecking, but need to use the precedence values to choose which overloaded function interfaces to generate when conflicts arise. */ /* predefined precedence values Symbolic Name Precedence Value ------------------------------ ------------------ SWIG_TYPECHECK_POINTER 0 SWIG_TYPECHECK_VOIDPTR 10 SWIG_TYPECHECK_BOOL 15 SWIG_TYPECHECK_UINT8 20 SWIG_TYPECHECK_INT8 25 SWIG_TYPECHECK_UINT16 30 SWIG_TYPECHECK_INT16 35 SWIG_TYPECHECK_UINT32 40 SWIG_TYPECHECK_INT32 45 SWIG_TYPECHECK_UINT64 50 SWIG_TYPECHECK_INT64 55 SWIG_TYPECHECK_UINT128 60 SWIG_TYPECHECK_INT128 65 SWIG_TYPECHECK_INTEGER 70 SWIG_TYPECHECK_FLOAT 80 SWIG_TYPECHECK_DOUBLE 90 SWIG_TYPECHECK_COMPLEX 100 SWIG_TYPECHECK_UNICHAR 110 SWIG_TYPECHECK_UNISTRING 120 SWIG_TYPECHECK_CHAR 130 SWIG_TYPECHECK_STRING 140 SWIG_TYPECHECK_BOOL_ARRAY 1015 SWIG_TYPECHECK_INT8_ARRAY 1025 SWIG_TYPECHECK_INT16_ARRAY 1035 SWIG_TYPECHECK_INT32_ARRAY 1045 SWIG_TYPECHECK_INT64_ARRAY 1055 SWIG_TYPECHECK_INT128_ARRAY 1065 SWIG_TYPECHECK_FLOAT_ARRAY 1080 SWIG_TYPECHECK_DOUBLE_ARRAY 1090 SWIG_TYPECHECK_CHAR_ARRAY 1130 SWIG_TYPECHECK_STRING_ARRAY 1140 */ %typecheck(SWIG_TYPECHECK_BOOL) bool { $1 = 1; }; %typecheck(SWIG_TYPECHECK_CHAR) char { $1 = 1; }; %typecheck(SWIG_TYPECHECK_FLOAT) float { $1 = 1; }; %typecheck(SWIG_TYPECHECK_DOUBLE) double { $1 = 1; }; %typecheck(SWIG_TYPECHECK_STRING) char * { $1 = 1; }; %typecheck(SWIG_TYPECHECK_INTEGER) unsigned char, signed char, short, signed short, unsigned short, int, signed int, unsigned int, long, signed long, unsigned long, enum SWIGTYPE { $1 = 1; }; %typecheck(SWIG_TYPECHECK_POINTER) SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE[], SWIGTYPE[ANY], SWIGTYPE { $1 = 1; }; /* This maps C/C++ types to Lisp classes for overload dispatch */ %typemap(lispclass) bool "t"; %typemap(lispclass) char "cl:character"; %typemap(lispclass) unsigned char, signed char, short, signed short, unsigned short, int, signed int, unsigned int, long, signed long, unsigned long, enum SWIGTYPE "cl:integer"; %typemap(lispclass) float "cl:single-float"; %typemap(lispclass) double "cl:double-float"; %typemap(lispclass) char * "cl:string"; %typemap(out) void ""; %typemap(out) bool "$result = (int)$1;"; %typemap(out) char, unsigned char, signed char, short, signed short, unsigned short, int, signed int, unsigned int, long, signed long, unsigned long, float, double, long double, char *, void *, enum SWIGTYPE, SWIGTYPE *, SWIGTYPE[ANY], SWIGTYPE &, SWIGTYPE && "$result = $1;"; #ifdef __cplusplus %typemap(out) SWIGTYPE "$result = new $1_ltype($1);"; #else %typemap(out) SWIGTYPE { $result = ($&1_ltype) malloc(sizeof($1_type)); memmove($result, &$1, sizeof($1_type)); } #endif ////////////////////////////////////////////////////////////// // UCS-2 string conversion // should this be SWIG_TYPECHECK_CHAR? %typecheck(SWIG_TYPECHECK_UNICHAR) wchar_t { $1 = 1; }; %typemap(in) wchar_t "$1 = $input;"; %typemap(lin,numinputs=1) wchar_t "(cl::let (($out (cl:char-code $in)))\n $body)"; %typemap(lin,numinputs=1) wchar_t * "(excl:with-native-string ($out $in :external-format #+little-endian :fat-le #-little-endian :fat)\n $body)" %typemap(out) wchar_t "$result = $1;"; %typemap(lout) wchar_t "(cl::setq ACL_ffresult (cl::code-char $body))"; %typemap(lout) wchar_t * "(cl::setq ACL_ffresult (excl:native-to-string $body :external-format #+little-endian :fat-le #-little-endian :fat))"; %typemap(ffitype) wchar_t ":unsigned-short"; %typemap(lisptype) wchar_t ""; %typemap(ctype) wchar_t "wchar_t"; %typemap(lispclass) wchar_t "cl:character"; %typemap(lispclass) wchar_t * "cl:string"; ////////////////////////////////////////////////////////////// /* Array reference typemaps */ %apply SWIGTYPE & { SWIGTYPE ((&)[ANY]) } %apply SWIGTYPE && { SWIGTYPE ((&&)[ANY]) } /* const pointers */ %apply SWIGTYPE * { SWIGTYPE *const } %apply SWIGTYPE (CLASS::*) { SWIGTYPE (CLASS::*const) } %apply SWIGTYPE & { SWIGTYPE (CLASS::*const&) } /* name conversion for overloaded operators. */ #ifdef __cplusplus %rename(__add__) *::operator+; %rename(__pos__) *::operator+(); %rename(__pos__) *::operator+() const; %rename(__sub__) *::operator-; %rename(__neg__) *::operator-() const; %rename(__neg__) *::operator-(); %rename(__mul__) *::operator*; %rename(__deref__) *::operator*(); %rename(__deref__) *::operator*() const; %rename(__div__) *::operator/; %rename(__mod__) *::operator%; %rename(__logxor__) *::operator^; %rename(__logand__) *::operator&; %rename(__logior__) *::operator|; %rename(__lognot__) *::operator~(); %rename(__lognot__) *::operator~() const; %rename(__not__) *::operator!(); %rename(__not__) *::operator!() const; %rename(__assign__) *::operator=; %rename(__add_assign__) *::operator+=; %rename(__sub_assign__) *::operator-=; %rename(__mul_assign__) *::operator*=; %rename(__div_assign__) *::operator/=; %rename(__mod_assign__) *::operator%=; %rename(__logxor_assign__) *::operator^=; %rename(__logand_assign__) *::operator&=; %rename(__logior_assign__) *::operator|=; %rename(__lshift__) *::operator<<; %rename(__lshift_assign__) *::operator<<=; %rename(__rshift__) *::operator>>; %rename(__rshift_assign__) *::operator>>=; %rename(__eq__) *::operator==; %rename(__ne__) *::operator!=; %rename(__lt__) *::operator<; %rename(__gt__) *::operator>; %rename(__lte__) *::operator<=; %rename(__gte__) *::operator>=; %rename(__and__) *::operator&&; %rename(__or__) *::operator||; %rename(__preincr__) *::operator++(); %rename(__postincr__) *::operator++(int); %rename(__predecr__) *::operator--(); %rename(__postdecr__) *::operator--(int); %rename(__comma__) *::operator,(); %rename(__comma__) *::operator,() const; %rename(__member_ref__) *::operator->; %rename(__member_func_ref__) *::operator->*; %rename(__funcall__) *::operator(); %rename(__aref__) *::operator[]; %rename(__bool__) *::operator bool(); %rename(__bool__) *::operator bool() const; #endif %insert("lisphead") %{ (eval-when (:compile-toplevel :load-toplevel :execute) ;; avoid compiling ef-templates at runtime (excl:find-external-format :fat) (excl:find-external-format :fat-le) ;;; You can define your own identifier converter if you want. ;;; Use the -identifier-converter command line argument to ;;; specify its name. (eval-when (:compile-toplevel :load-toplevel :execute) (cl::defparameter *swig-export-list* nil)) (cl::defconstant *void* :..void..) ;; parsers to aid in finding SWIG definitions in files. (cl::defun scm-p1 (form) (let* ((info (cl::second form)) (id (car info)) (id-args (if (eq (cl::car form) 'swig-dispatcher) (cl::cdr info) (cl::cddr info)))) (cl::apply *swig-identifier-converter* id (cl::progn (cl::when (cl::eq (cl::car form) 'swig-dispatcher) (cl::remf id-args :arities)) id-args)))) (cl::defmacro defswig1 (name (&rest args) &body body) `(cl::progn (cl::defmacro ,name ,args ,@body) (excl::define-simple-parser ,name scm-p1)) ) (cl::defmacro defswig2 (name (&rest args) &body body) `(cl::progn (cl::defmacro ,name ,args ,@body) (excl::define-simple-parser ,name second))) (defun read-symbol-from-string (string) (cl::multiple-value-bind (result position) (cl::read-from-string string nil "eof" :preserve-whitespace t) (cl::if (cl::and (cl::symbolp result) (cl::eql position (cl::length string))) result (cl::multiple-value-bind (sym) (cl::intern string) sym)))) (cl::defun full-name (id type arity class) ; We need some kind of a hack here to handle template classes ; and other synonym types right. We need the original name. (let*( (sym (read-symbol-from-string (if (eq *swig-identifier-converter* 'identifier-convert-lispify) (string-lispify id) id))) (sym-class (find-class sym nil)) (id (cond ( (not sym-class) id ) ( (and sym-class (not (eq (class-name sym-class) sym))) (class-name sym-class) ) ( t id ))) ) (cl::case type (:getter (cl::format nil "~@[~A_~]~A" class id)) (:constructor (cl::format nil "new_~A~@[~A~]" id arity)) (:destructor (cl::format nil "delete_~A" id)) (:type (cl::format nil "ff_~A" id)) (:slot id) (:ff-operator (cl::format nil "ffi_~A" id)) (otherwise (cl::format nil "~@[~A_~]~A~@[~A~]" class id arity))))) (cl::defun identifier-convert-null (id &key type class arity) (cl::if (cl::eq type :setter) `(cl::setf ,(identifier-convert-null id :type :getter :class class :arity arity)) (read-symbol-from-string (full-name id type arity class)))) (cl::defun string-lispify (str) (cl::let ( (cname (excl::replace-regexp str "_" "-")) (lastcase :other) newcase char res ) (cl::dotimes (n (cl::length cname)) (cl::setf char (cl::schar cname n)) (excl::if* (cl::alpha-char-p char) then (cl::setf newcase (cl::if (cl::upper-case-p char) :upper :lower)) (cl::when (cl::and (cl::eq lastcase :lower) (cl::eq newcase :upper)) ;; case change... add a dash (cl::push #\- res) (cl::setf newcase :other)) (cl::push (cl::char-downcase char) res) (cl::setf lastcase newcase) else (cl::push char res) (cl::setf lastcase :other))) (cl::coerce (cl::nreverse res) 'string))) (cl::defun identifier-convert-lispify (cname &key type class arity) (cl::assert (cl::stringp cname)) (cl::when (cl::eq type :setter) (cl::return-from identifier-convert-lispify `(cl::setf ,(identifier-convert-lispify cname :type :getter :class class :arity arity)))) (cl::setq cname (full-name cname type arity class)) (cl::if (cl::eq type :constant) (cl::setf cname (cl::format nil "*~A*" cname))) (read-symbol-from-string (string-lispify cname))) (cl::defun id-convert-and-export (name &rest kwargs) (cl::multiple-value-bind (symbol package) (cl::apply *swig-identifier-converter* name kwargs) (cl::let ((args (cl::list (cl::if (cl::consp symbol) (cl::cadr symbol) symbol) (cl::or package cl::*package*)))) (cl::apply #'cl::export args) (cl::pushnew args *swig-export-list*)) symbol)) (cl::defmacro swig-insert-id (name namespace &key (type :type) class) `(cl::let ((cl::*package* (cl::find-package ,(package-name-for-namespace namespace)))) (id-convert-and-export ,name :type ,type :class ,class))) (defswig2 swig-defconstant (string value) (cl::let ((symbol (id-convert-and-export string :type :constant))) `(cl::eval-when (:compile-toplevel :load-toplevel :execute) (cl::defconstant ,symbol ,value)))) (cl::defun maybe-reorder-args (funcname arglist) ;; in the foreign setter function the new value will be the last argument ;; in Lisp it needs to be the first (cl::if (cl::consp funcname) (cl::append (cl::last arglist) (cl::butlast arglist)) arglist)) (cl::defun maybe-return-value (funcname arglist) ;; setf functions should return the new value (cl::when (cl::consp funcname) `(,(cl::if (cl::consp (cl::car arglist)) (cl::caar arglist) (cl::car arglist))))) (cl::defun swig-anyvarargs-p (arglist) (cl::member :SWIG__varargs_ arglist)) (defswig1 swig-defun ((name &optional (mangled-name name) &key (type :operator) class arity) arglist kwargs &body body) (cl::let* ((symbol (id-convert-and-export name :type type :arity arity :class class)) (mangle (excl::if* (cl::string-equal name mangled-name) then (id-convert-and-export (cl::cond ((cl::eq type :setter) (cl::format nil "~A-set" name)) ((cl::eq type :getter) (cl::format nil "~A-get" name)) (t name)) :type :ff-operator :arity arity :class class) else (cl::intern mangled-name))) (defun-args (maybe-reorder-args symbol (cl::mapcar #'cl::car (cl::and (cl::not (cl::equal arglist '(:void))) (cl::loop as i in arglist when (cl::eq (cl::car i) :p+) collect (cl::cdr i)))))) (ffargs (cl::if (cl::equal arglist '(:void)) arglist (cl::mapcar #'cl::cdr arglist))) ) (cl::when (swig-anyvarargs-p ffargs) (cl::setq ffargs '())) `(cl::eval-when (:compile-toplevel :load-toplevel :execute) (excl::compiler-let ((*record-xref-info* nil)) (ff:def-foreign-call (,mangle ,mangled-name) ,ffargs ,@kwargs)) (cl::macrolet ((swig-ff-call (&rest args) (cl::cons ',mangle args))) (cl::defun ,symbol ,defun-args ,@body ,@(maybe-return-value symbol defun-args)))))) (defswig1 swig-defmethod ((name &optional (mangled-name name) &key (type :operator) class arity) ffargs kwargs &body body) (cl::let* ((symbol (id-convert-and-export name :type type :arity arity :class class)) (mangle (cl::intern mangled-name)) (defmethod-args (maybe-reorder-args symbol (cl::unless (cl::equal ffargs '(:void)) (cl::loop for (lisparg name dispatch) in ffargs when (eq lisparg :p+) collect `(,name ,dispatch))))) (ffargs (cl::if (cl::equal ffargs '(:void)) ffargs (cl::loop for (nil name nil . ffi) in ffargs collect `(,name ,@ffi))))) `(cl::eval-when (:compile-toplevel :load-toplevel :execute) (excl::compiler-let ((*record-xref-info* nil)) (ff:def-foreign-call (,mangle ,mangled-name) ,ffargs ,@kwargs)) (cl::macrolet ((swig-ff-call (&rest args) (cl::cons ',mangle args))) (cl::defmethod ,symbol ,defmethod-args ,@body ,@(maybe-return-value symbol defmethod-args)))))) (defswig1 swig-dispatcher ((name &key (type :operator) class arities)) (cl::let ((symbol (id-convert-and-export name :type type :class class))) `(cl::eval-when (:compile-toplevel :load-toplevel :execute) (cl::defun ,symbol (&rest args) (cl::case (cl::length args) ,@(cl::loop for arity in arities for symbol-n = (id-convert-and-export name :type type :class class :arity arity) collect `(,arity (cl::apply #',symbol-n args))) (t (cl::error "No applicable wrapper-methods for foreign call ~a with args ~a of classes ~a" ',symbol args (cl::mapcar #'(cl::lambda (x) (cl::class-name (cl::class-of x))) args))) ))))) (defswig2 swig-def-foreign-stub (name) (cl::let ((lsymbol (id-convert-and-export name :type :class)) (symbol (id-convert-and-export name :type :type))) `(cl::eval-when (:compile-toplevel :load-toplevel :execute) (ff:def-foreign-type ,symbol (:class )) (cl::defclass ,lsymbol (ff:foreign-pointer) ())))) (defswig2 swig-def-foreign-class (name supers &rest rest) (cl::let ((lsymbol (id-convert-and-export name :type :class)) (symbol (id-convert-and-export name :type :type))) `(cl::eval-when (:compile-toplevel :load-toplevel :execute) (ff:def-foreign-type ,symbol ,@rest) (cl::defclass ,lsymbol ,supers ((foreign-type :initform ',symbol :initarg :foreign-type :accessor foreign-pointer-type)))))) (defswig2 swig-def-foreign-type (name &rest rest) (cl::let ((symbol (id-convert-and-export name :type :type))) `(cl::eval-when (:compile-toplevel :load-toplevel :execute) (ff:def-foreign-type ,symbol ,@rest)))) (defswig2 swig-def-synonym-type (synonym of ff-synonym) `(cl::eval-when (:compile-toplevel :load-toplevel :execute) (cl::setf (cl::find-class ',synonym) (cl::find-class ',of)) (ff:def-foreign-type ,ff-synonym (:struct )))) (cl::defun package-name-for-namespace (namespace) (excl::list-to-delimited-string (cl::cons *swig-module-name* (cl::mapcar #'(cl::lambda (name) (cl::string (cl::funcall *swig-identifier-converter* name :type :namespace))) namespace)) ".")) (cl::defmacro swig-defpackage (namespace) (cl::let* ((parent-namespaces (cl::maplist #'cl::reverse (cl::cdr (cl::reverse namespace)))) (parent-strings (cl::mapcar #'package-name-for-namespace parent-namespaces)) (string (package-name-for-namespace namespace))) `(cl::eval-when (:compile-toplevel :load-toplevel :execute) (cl::defpackage ,string (:use :swig :ff #+ignore '(:common-lisp :ff :excl) ,@parent-strings ,*swig-module-name*) (:import-from :cl :* :nil :t))))) (cl::defmacro swig-in-package (namespace) `(cl::eval-when (:compile-toplevel :load-toplevel :execute) (cl::in-package ,(package-name-for-namespace namespace)))) (defswig2 swig-defvar (name mangled-name &key type (ftype :unsigned-natural)) (cl::let ((symbol (id-convert-and-export name :type type))) `(cl::eval-when (:compile-toplevel :load-toplevel :execute) (ff:def-foreign-variable (,symbol ,mangled-name) :type ,ftype)))) ) ;; eval-when (cl::eval-when (:compile-toplevel :execute) (cl::flet ((starts-with-p (str prefix) (cl::and (cl::>= (cl::length str) (cl::length prefix)) (cl::string= str prefix :end1 (cl::length prefix))))) (cl::export (cl::loop for sym being each present-symbol of cl::*package* when (cl::or (starts-with-p (cl::symbol-name sym) (cl::symbol-name :swig-)) (starts-with-p (cl::symbol-name sym) (cl::symbol-name :identifier-convert-))) collect sym)))) %} typedef void *__SWIGACL_FwdReference; %{ #ifdef __cplusplus # define EXTERN extern "C" #else # define EXTERN extern #endif #define EXPORT EXTERN SWIGEXPORT typedef void *__SWIGACL_FwdReference; #include #include %} swig-4.0.1/Lib/allegrocl/typemaps.i0000644000175000017500000000012713527063513017036 0ustar williamwilliam/* Unused for Allegro CL module */ %include "inout_typemaps.i" %include "longlongs.i" swig-4.0.1/Lib/allegrocl/inout_typemaps.i0000644000175000017500000001053313527063513020256 0ustar williamwilliam/* inout_typemaps.i Support for INPUT, OUTPUT, and INOUT typemaps. OUTPUT variables are returned as multiple values. */ /* Note that this macro automatically adds a pointer to the type passed in. As a result, INOUT typemaps for char are for 'char *'. The definition of typemaps for 'char' takes advantage of this, believing that it's more likely to see an INOUT argument for strings, than a single char. */ %define INOUT_TYPEMAP(type_, OUTresult_, INbind_) // OUTPUT map. %typemap(lin,numinputs=0) type_ *OUTPUT, type_ &OUTPUT %{(cl::let (($out (ff:allocate-fobject '$*in_fftype :c))) $body OUTresult_ (ff:free-fobject $out)) %} // INPUT map. %typemap(in) type_ *INPUT, type_ &INPUT %{ $1 = &$input; %} %typemap(ctype) type_ *INPUT, type_ &INPUT "$*1_ltype"; // INOUT map. // careful here. the input string is converted to a C string // with length equal to the input string. This should be large // enough to contain whatever OUTPUT value will be stored in it. %typemap(lin,numinputs=1) type_ *INOUT, type_ &INOUT %{(cl::let (($out (ff:allocate-fobject '$*in_fftype :c))) INbind_ $body OUTresult_ (ff:free-fobject $out)) %} %enddef // $in, $out, $lclass, // $in_fftype, $*in_fftype INOUT_TYPEMAP(int, (cl::push (ff:fslot-value-typed (cl::quote $*in_fftype) :c $out) ACL_result), (cl::setf (ff:fslot-value-typed (cl::quote $*in_fftype) :c $out) $in)); INOUT_TYPEMAP(short, (cl::push (ff:fslot-value-typed (cl::quote $*in_fftype) :c $out) ACL_result), (cl::setf (ff:fslot-value-typed (cl::quote $*in_fftype) :c $out) $in)); INOUT_TYPEMAP(long, (cl::push (ff:fslot-value-typed (cl::quote $*in_fftype) :c $out) ACL_result), (cl::setf (ff:fslot-value-typed (cl::quote $*in_fftype) :c $out) $in)); INOUT_TYPEMAP(unsigned int, (cl::push (ff:fslot-value-typed (cl::quote $*in_fftype) :c $out) ACL_result), (cl::setf (ff:fslot-value-typed (cl::quote $*in_fftype) :c $out) $in)); INOUT_TYPEMAP(unsigned short, (cl::push (ff:fslot-value-typed (cl::quote $*in_fftype) :c $out) ACL_result), (cl::setf (ff:fslot-value-typed (cl::quote $*in_fftype) :c $out) $in)); INOUT_TYPEMAP(unsigned long, (cl::push (ff:fslot-value-typed (cl::quote $*in_fftype) :c $out) ACL_result), (cl::setf (ff:fslot-value-typed (cl::quote $*in_fftype) :c $out) $in)); // char * mapping for passing strings. didn't quite work // INOUT_TYPEMAP(char, // (cl::push (excl:native-to-string $out) ACL_result), // (cl::setf (ff:fslot-value-typed (cl::quote $in_fftype) :c $out) // (excl:string-to-native $in))) INOUT_TYPEMAP(float, (cl::push (ff:fslot-value-typed (cl::quote $*in_fftype) :c $out) ACL_result), (cl::setf (ff:fslot-value-typed (cl::quote $*in_fftype) :c $out) $in)); INOUT_TYPEMAP(double, (cl::push (ff:fslot-value-typed (cl::quote $*in_fftype) :c $out) ACL_result), (cl::setf (ff:fslot-value-typed (cl::quote $*in_fftype) :c $out) $in)); INOUT_TYPEMAP(bool, (cl::push (not (zerop (ff:fslot-value-typed (cl::quote $*in_fftype) :c $out))) ACL_result), (cl::setf (ff:fslot-value-typed (cl::quote $*in_fftype) :c $out) (if $in 1 0))); %typemap(lisptype) bool *INPUT, bool &INPUT "boolean"; // long long support not yet complete // INOUT_TYPEMAP(long long); // INOUT_TYPEMAP(unsigned long long); // char *OUTPUT map. // for this to work, swig needs to know how large an array to allocate. // you can fake this by // %typemap(ffitype) char *myarg "(:array :char 30)"; // %apply char *OUTPUT { char *myarg }; %typemap(lin,numinputs=0) char *OUTPUT, char &OUTPUT %{(cl::let (($out (ff:allocate-fobject '$*in_fftype :c))) $body (cl::push (excl:native-to-string $out) ACL_result) (ff:free-fobject $out)) %} // char *INPUT map. %typemap(in) char *INPUT, char &INPUT %{ $1 = &$input; %} %typemap(ctype) char *INPUT, char &INPUT "$*1_ltype"; // char *INOUT map. %typemap(lin,numinputs=1) char *INOUT, char &INOUT %{(cl::let (($out (excl:string-to-native $in))) $body (cl::push (excl:native-to-string $out) ACL_result) (ff:free-fobject $out)) %} // uncomment this if you want INOUT mappings for chars instead of strings. // INOUT_TYPEMAP(char, // (cl::push (code-char (ff:fslot-value-typed (cl::quote $*in_fftype) :c $out)) // ACL_result), // (cl::setf (ff:fslot-value-typed (cl::quote $*in_fftype) :c $out) $in)); swig-4.0.1/Lib/allegrocl/longlongs.i0000644000175000017500000000312513527063513017177 0ustar williamwilliam/* ----------------------------------------------------------------------------- * longlongs.i * * Typemap addition for support of 'long long' type and 'unsigned long long * Makes use of swig-def-foreign-class, so this header should be loaded * after allegrocl.swg and after any custom user identifier-conversion * functions have been defined. * ----------------------------------------------------------------------------- */ #ifdef Acl64Bit %typemap(ctype) long long, unsigned long long "$1_ltype"; %typemap(out) long long, unsigned long long "$result = $1;"; %typemap(ffitype) long long ":nat"; %typemap(ffitype) unsigned long long ":unsigned-nat"; %typemap(lout) long long, unsigned long long " #+64bit (cl::setq ACL_ffresult $body)"; #else %typemap(out) long long, unsigned long long "$result = &$1;"; %typemap(ffitype) long long "(:struct (l1 :long) (l2 :long))"; %typemap(ffitype) unsigned long long "(:struct (l1 :unsigned-long) (l2 :unsigned-long))"; %typemap(lout) long long " (cl::setq ACL_ffresult (make-instance '#.(swig-insert-id \"longlong\" () :type :class) :foreign-address $body))"; %typemap(lout) unsigned long long " (cl:setq ACL_ffresult (make-instance '#.(swig-insert-id \"ulonglong\" () :type :class) :foreign-address $body))"; #endif %typemap(in) long long, unsigned long long "$1 = $input;"; %insert("lisphead") %{ #-64bit (swig-def-foreign-class "longlong" (ff:foreign-pointer) (:struct (l1 :long) (l2 :long))) #-64bit (swig-def-foreign-class "ulonglong" (ff:foreign-pointer) (:struct (l1 :unsigned-long) (l2 :unsigned-long))) %} swig-4.0.1/Lib/allegrocl/std_list.i0000644000175000017500000001163613527063513017030 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_list.i * * SWIG typemaps for std::list types * * To use, add: * * %include "std_list.i" * * to your interface file. You will also need to include a template directive * for each instance of the list container you want to use in your application. * e.g. * * %template (intlist) std::list; * %template (floatlist) std::list; * ----------------------------------------------------------------------------- */ %module std_list %warnfilter(468) std::list; %{ #include #include %} namespace std{ template class list { public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef T value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; typedef T &iterator; typedef const T& const_iterator; list(); list(unsigned int size, const T& value = T()); list(const list& other); void assign(unsigned int n, const T& value); void swap(list &x); const_reference front(); const_reference back(); const_iterator begin(); const_iterator end(); void resize(unsigned int n, T c = T()); bool empty() const; void push_front(const T& INPUT); void push_back(const T& INPUT); void pop_front(); void pop_back(); void clear(); unsigned int size() const; unsigned int max_size() const; void resize(unsigned int n, const T& INPUT); void remove(const T& INPUT); void unique(); void reverse(); void sort(); %extend { %typemap(lout) T &__getitem__ "(cl::setq ACL_ffresult (ff:fslot-value-typed '$*out_fftype :c $body))"; %typemap(lout) T *__getitem__ "(cl::setq ACL_ffresult (make-instance '$lclass :foreign-address $body))"; const_reference __getitem__(int i) throw (std::out_of_range) { std::list::iterator first = self->begin(); int size = int(self->size()); if (i<0) i += size; if (i>=0 && i::iterator first = self->begin(); int size = int(self->size()); if (i<0) i += size; if (i>=0 && i::iterator first = self->begin(); int size = int(self->size()); if (i<0) i += size; if (i>=0 && ierase(first); } else throw std::out_of_range("list index out of range"); } std::list __getslice__(int i,int j) { std::list::iterator first = self->begin(); std::list::iterator end = self->end(); int size = int(self->size()); if (i<0) i += size; if (j<0) j += size; if (i<0) i = 0; if (j>size) j = size; if (i>=j) i=j; if (i>=0 && i=0) { for (int k=0;k tmp(j-i); if (j>i) std::copy(first,end,tmp.begin()); return tmp; } else throw std::out_of_range("list index out of range"); } void __delslice__(int i,int j) { std::list::iterator first = self->begin(); std::list::iterator end = self->end(); int size = int(self->size()); if (i<0) i += size; if (j<0) j += size; if (i<0) i = 0; if (j>size) j = size; for (int k=0;kerase(first,end); } void __setslice__(int i,int j, const std::list& v) { std::list::iterator first = self->begin(); std::list::iterator end = self->end(); int size = int(self->size()); if (i<0) i += size; if (j<0) j += size; if (i<0) i = 0; if (j>size) j = size; for (int k=0;kerase(first,end); if (i+1 <= int(self->size())) { first = self->begin(); for (int k=0;kinsert(first,v.begin(),v.end()); } else self->insert(self->end(),v.begin(),v.end()); } } unsigned int __len__() { return self->size(); } bool __nonzero__() { return !(self->empty()); } void append(const T& INPUT) { self->push_back(INPUT); } void pop() { self->pop_back(); } } }; } swig-4.0.1/Lib/allegrocl/std_string.i0000644000175000017500000001502213527063513017354 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_string.i * * SWIG typemaps for std::string * ----------------------------------------------------------------------------- */ // ------------------------------------------------------------------------ // std::string is typemapped by value // This can prevent exporting methods which return a string // in order for the user to modify it. // However, I think I'll wait until someone asks for it... // ------------------------------------------------------------------------ // %include %warnfilter(404) std::string; %warnfilter(404) std::wstring; %{ #include %} // %include // %naturalvar std::string; // %naturalvar std::wstring; namespace std { typedef unsigned long size_t; typedef signed long ptrdiff_t; template class basic_string { public: typedef charT *pointer; typedef charT &reference; typedef const charT &const_reference; typedef size_t size_type; typedef ptrdiff_t difference_type; basic_string(); basic_string( charT *str ); size_type size(); charT operator []( int pos ) const; charT *c_str() const; basic_string &operator = ( const basic_string &ws ); basic_string &operator = ( const charT *str ); basic_string &append( const basic_string &other ); basic_string &append( const charT *str ); void push_back( charT c ); void clear(); void reserve( size_type t ); void resize( size_type n, charT c = charT() ); int compare( const basic_string &other ) const; int compare( const charT *str ) const; basic_string &insert( size_type pos, const basic_string &str ); size_type find( const basic_string &other, int pos = 0 ) const; size_type find( charT c, int pos = 0 ) const; %extend { bool operator == ( const basic_string &other ) const { return self->compare( other ) == 0; } bool operator != ( const basic_string &other ) const { return self->compare( other ) != 0; } bool operator < ( const basic_string &other ) const { return self->compare( other ) == -1; } bool operator > ( const basic_string &other ) const { return self->compare( other ) == 1; } bool operator <= ( const basic_string &other ) const { return self->compare( other ) != 1; } bool operator >= ( const basic_string &other ) const { return self->compare( other ) != -1; } } }; %template(string) basic_string; %template(wstring) basic_string; %apply char * { string }; %apply wchar_t * { wstring }; typedef basic_string string; typedef basic_string wstring; // automatically convert constant std::strings to cl:strings %typemap(ctype) string "char *"; %typemap(in) string "$1.assign($input);"; %typemap(out) string "$result = (char *)(&$1)->c_str();"; %typemap(lisptype) string "cl:string"; %typemap(lout) string "(cl::setq ACL_ffresult $body)"; %typemap(ctype) const string *"char *"; %typemap(in) const string * "$1.assign($input);"; %typemap(out) const string * "$result = (char *)($1)->c_str();"; %typemap(lisptype) const string * "cl:string"; %typemap(lout) const string * "(cl::setq ACL_ffresult $body)"; %typemap(ctype) wstring "wchar_t *"; %typemap(in) wstring "$1.assign($input);"; %typemap(out) wstring "$result = (wchar_t *)(&$1)->c_str();"; %typemap(lisptype) wstring "cl:string"; %typemap(lout) wstring "(cl::setq ACL_ffresult (excl:native-to-string $body :external-format #+little-endian :fat-le #-little-endian :fat))"; %typemap(ctype) const wstring *"char *"; %typemap(in) const wstring * "$1.assign($input);"; %typemap(out) const wstring * "$result = (char *)($1)->c_str();"; %typemap(lisptype) const wstring * "cl:string"; %typemap(lout) const wstring * "(cl::setq ACL_ffresult $body)"; /* Overloading check */ // %typemap(in) string { // if (caml_ptr_check($input)) // $1.assign((char *)caml_ptr_val($input,0), // caml_string_len($input)); // else // SWIG_exception(SWIG_TypeError, "string expected"); // } // %typemap(in) const string & ($*1_ltype temp) { // if (caml_ptr_check($input)) { // temp.assign((char *)caml_ptr_val($input,0), // caml_string_len($input)); // $1 = &temp; // } else { // SWIG_exception(SWIG_TypeError, "string expected"); // } // } // %typemap(in) string & ($*1_ltype temp) { // if (caml_ptr_check($input)) { // temp.assign((char *)caml_ptr_val($input,0), // caml_string_len($input)); // $1 = &temp; // } else { // SWIG_exception(SWIG_TypeError, "string expected"); // } // } // %typemap(in) string * ($*1_ltype *temp) { // if (caml_ptr_check($input)) { // temp = new $*1_ltype((char *)caml_ptr_val($input,0), // caml_string_len($input)); // $1 = temp; // } else { // SWIG_exception(SWIG_TypeError, "string expected"); // } // } // %typemap(free) string * ($*1_ltype *temp) { // delete temp; // } // %typemap(argout) string & { // caml_list_append(swig_result,caml_val_string_len((*$1).c_str(), // (*$1).size())); // } // %typemap(directorout) string { // $result.assign((char *)caml_ptr_val($input,0), // caml_string_len($input)); // } // %typemap(out) string { // $result = caml_val_string_len($1.c_str(),$1.size()); // } // %typemap(out) string * { // $result = caml_val_string_len((*$1).c_str(),(*$1).size()); // } } // #ifdef ENABLE_CHARPTR_ARRAY // char **c_charptr_array( const std::vector &str_v ); // %{ // SWIGEXT char **c_charptr_array( const std::vector &str_v ) { // char **out = new char *[str_v.size() + 1]; // out[str_v.size()] = 0; // for( int i = 0; i < str_v.size(); i++ ) { // out[i] = (char *)str_v[i].c_str(); // } // return out; // } // %} // #endif // #ifdef ENABLE_STRING_VECTOR // %template (StringVector) std::vector; // %insert(ml) %{ // (* Some STL convenience items *) // let string_array_to_vector sa = // let nv = _new_StringVector C_void in // array_to_vector nv (fun x -> C_string x) sa ; nv // let c_string_array ar = // _c_charptr_array (string_array_to_vector ar) // %} // %insert(mli) %{ // val c_string_array: string array -> c_obj // %} // #endif swig-4.0.1/Lib/d/0000755000175000017500000000000013527063513013301 5ustar williamwilliamswig-4.0.1/Lib/d/std_deque.i0000644000175000017500000000003413527063513015425 0ustar williamwilliam%include swig-4.0.1/Lib/d/director.swg0000644000175000017500000000237113527063513015641 0ustar williamwilliam/* ----------------------------------------------------------------------------- * director.swg * * This file contains support for director classes so that D proxy * methods can be called from C++. * ----------------------------------------------------------------------------- */ #if defined(DEBUG_DIRECTOR_OWNED) #include #endif #include #include namespace Swig { // Director base class – not used in D directors. class Director { }; // Base class for director exceptions. class DirectorException : public std::exception { protected: std::string swig_msg; public: DirectorException(const std::string &msg) : swig_msg(msg) { } virtual ~DirectorException() throw() { } const char *what() const throw() { return swig_msg.c_str(); } }; // Exception which is thrown when attempting to call a pure virtual method // from D code through the director layer. class DirectorPureVirtualException : public DirectorException { public: DirectorPureVirtualException(const char *msg) : DirectorException(std::string("Attempted to invoke pure virtual method ") + msg) { } static void raise(const char *msg) { throw DirectorPureVirtualException(msg); } }; } swig-4.0.1/Lib/d/dstrings.swg0000644000175000017500000000501113527063513015655 0ustar williamwilliam/* ----------------------------------------------------------------------------- * dstrings.swg * * Typemaps for wrapping pointers to/arrays of C chars as D strings. * ----------------------------------------------------------------------------- */ %define SWIGD_STRING_TYPEMAPS(DW_STRING_TYPE, DP_STRING_TYPE, FROM_STRINGZ, TO_STRINGZ) %typemap(ctype) char *, char *&, char[ANY], char[] "char *" %typemap(imtype) char *, char *&, char[ANY], char[] #DW_STRING_TYPE %typemap(dtype) char *, char *&, char[ANY], char[] #DP_STRING_TYPE /* * char* typemaps. */ %typemap(in) char * %{ $1 = ($1_ltype)$input; %} %typemap(out) char * %{ $result = SWIG_d_string_callback((const char *)$1); %} %typemap(directorout, warning=SWIGWARN_TYPEMAP_DIRECTOROUT_PTR_MSG) char * %{ $result = ($1_ltype)$input; %} %typemap(directorin) char * %{ $input = SWIG_d_string_callback((const char *)$1); %} %typemap(ddirectorin) char * "FROM_STRINGZ($winput)" %typemap(ddirectorout) char * "TO_STRINGZ($dcall)" /* * char*& typemaps. */ %typemap(in) char *& ($*1_ltype temp = 0) %{ temp = ($*1_ltype)$input; $1 = &temp; %} %typemap(out) char *& %{ if ($1) $result = SWIG_d_string_callback((const char *)*$1); %} /* * char array typemaps. */ %typemap(in) char[ANY], char[] %{ $1 = ($1_ltype)$input; %} %typemap(out) char[ANY], char[] %{ $result = SWIG_d_string_callback((const char *)$1); %} %typemap(directorout) char[ANY], char[] %{ $result = ($1_ltype)$input; %} %typemap(directorin) char[ANY], char[] %{ $input = SWIG_d_string_callback((const char *)$1); %} %typemap(ddirectorin) char[ANY], char[] "$winput" %typemap(ddirectorout) char[ANY], char[] "$dcall" %typemap(din) char *, char *&, char[ANY], char[] "($dinput ? TO_STRINGZ($dinput) : null)" %typemap(dout, excode=SWIGEXCODE) char *, char *&, char[ANY], char[] { DP_STRING_TYPE ret = FROM_STRINGZ ## ($imcall);$excode return ret; } %typecheck(SWIG_TYPECHECK_STRING) char *, char *&, char[ANY], char[] "" %enddef // We need to have the \0-terminated string conversion functions available in // the D proxy modules. #if (SWIG_D_VERSION == 1) // Could be easily extended to support Phobos as well. SWIGD_STRING_TYPEMAPS(char*, char[], tango.stdc.stringz.fromStringz, tango.stdc.stringz.toStringz) %pragma(d) globalproxyimports = "static import tango.stdc.stringz;"; #else SWIGD_STRING_TYPEMAPS(const(char)*, string, std.conv.to!string, std.string.toStringz) %pragma(d) globalproxyimports = %{ static import std.conv; static import std.string; %} #endif #undef SWIGD_STRING_TYPEMAPS swig-4.0.1/Lib/d/cpointer.i0000644000175000017500000000663213527063513015305 0ustar williamwilliam/* ----------------------------------------------------------------------------- * cpointer.i * * D-specific version of ../cpointer.i. * ----------------------------------------------------------------------------- */ /* ----------------------------------------------------------------------------- * %pointer_class(type,name) * * Places a simple proxy around a simple type like 'int', 'float', or whatever. * The proxy provides this interface: * * class type { * public: * type(); * ~type(); * type value(); * void assign(type value); * }; * * Example: * * %pointer_class(int, intp); * * int add(int *x, int *y) { return *x + *y; } * * In python (with proxies) * * >>> a = intp() * >>> a.assign(10) * >>> a.value() * 10 * >>> b = intp() * >>> b.assign(20) * >>> print add(a,b) * 30 * * As a general rule, this macro should not be used on class/structures that * are already defined in the interface. * ----------------------------------------------------------------------------- */ %define %pointer_class(TYPE, NAME) %{ typedef TYPE NAME; %} typedef struct { } NAME; %extend NAME { #ifdef __cplusplus NAME() { return new TYPE(); } ~NAME() { if (self) delete self; } #else NAME() { return (TYPE *) calloc(1,sizeof(TYPE)); } ~NAME() { if (self) free(self); } #endif } %extend NAME { void assign(TYPE value) { *self = value; } TYPE value() { return *self; } TYPE * ptr() { return self; } static NAME * frompointer(TYPE *t) { return (NAME *) t; } } %types(NAME = TYPE); %enddef /* ----------------------------------------------------------------------------- * %pointer_functions(type,name) * * Create functions for allocating/deallocating pointers. This can be used * if you don't want to create a proxy class or if the pointer is complex. * * %pointer_functions(int, intp) * * int add(int *x, int *y) { return *x + *y; } * * In python (with proxies) * * >>> a = copy_intp(10) * >>> intp_value(a) * 10 * >>> b = new_intp() * >>> intp_assign(b,20) * >>> print add(a,b) * 30 * >>> delete_intp(a) * >>> delete_intp(b) * * ----------------------------------------------------------------------------- */ %define %pointer_functions(TYPE,NAME) %{ static TYPE *new_##NAME() { %} #ifdef __cplusplus %{ return new TYPE(); %} #else %{ return (TYPE *) calloc(1,sizeof(TYPE)); %} #endif %{} static TYPE *copy_##NAME(TYPE value) { %} #ifdef __cplusplus %{ return new TYPE(value); %} #else %{ TYPE *self = (TYPE *) calloc(1,sizeof(TYPE)); *self = value; return self; %} #endif %{} static void delete_##NAME(TYPE *self) { %} #ifdef __cplusplus %{ if (self) delete self; %} #else %{ if (self) free(self); %} #endif %{} static void NAME ##_assign(TYPE *self, TYPE value) { *self = value; } static TYPE NAME ##_value(TYPE *self) { return *self; } %} TYPE *new_##NAME(); TYPE *copy_##NAME(TYPE value); void delete_##NAME(TYPE *self); void NAME##_assign(TYPE *self, TYPE value); TYPE NAME##_value(TYPE *self); %enddef /* ----------------------------------------------------------------------------- * %pointer_cast(type1,type2,name) * * Generates a pointer casting function. * ----------------------------------------------------------------------------- */ %define %pointer_cast(TYPE1,TYPE2,NAME) %inline %{ TYPE2 NAME(TYPE1 x) { return (TYPE2) x; } %} %enddef swig-4.0.1/Lib/d/std_shared_ptr.i0000644000175000017500000000010413527063513016453 0ustar williamwilliam#define SWIG_SHARED_PTR_NAMESPACE std %include swig-4.0.1/Lib/d/dmemberfunctionpointers.swg0000644000175000017500000000533313527063513020774 0ustar williamwilliam/* ----------------------------------------------------------------------------- * dmemberfunctionpointers.swg * * Typemaps for member function pointers. * ----------------------------------------------------------------------------- */ %typemap(ctype) SWIGTYPE (CLASS::*) "char *" %typemap(imtype) SWIGTYPE (CLASS::*) "char*" %typemap(dtype) SWIGTYPE (CLASS::*) "$dclassname" %typecheck(SWIG_TYPECHECK_POINTER) SWIGTYPE (CLASS::*) "" /* * Conversion generation typemaps. */ %typemap(in, fragment="SWIG_UnPackData") SWIGTYPE (CLASS::*) %{ SWIG_UnpackData($input, (void *)&$1, sizeof($1)); %} %typemap(out, fragment="SWIG_PackData") SWIGTYPE (CLASS::*) %{ char buf[128]; char *data = SWIG_PackData(buf, (void *)&$1, sizeof($1)); *data = '\0'; $result = SWIG_d_string_callback(buf); %} %typemap(directorin) SWIGTYPE (CLASS::*) "$input = (void *) $1;" %typemap(directorout, warning=SWIGWARN_TYPEMAP_DIRECTOROUT_PTR_MSG) SWIGTYPE (CLASS::*) "$result = ($1_ltype)$input;" %typemap(ddirectorin) SWIGTYPE (CLASS::*) "($winput is null) ? null : new $dclassname($winput, false)" %typemap(ddirectorout) SWIGTYPE (CLASS::*) "$dclassname.swigGetCPtr($dcall)" %typemap(din) SWIGTYPE (CLASS::*) "$dclassname.swigGetCMemberPtr($dinput)" %typemap(dout, excode=SWIGEXCODE) SWIGTYPE (CLASS::*) { char* cMemberPtr = $imcall; $dclassname ret = (cMemberPtr is null) ? null : new $dclassname(cMemberPtr, $owner);$excode return ret; } %apply SWIGTYPE (CLASS::*) { SWIGTYPE (CLASS::*const) } %apply SWIGTYPE & { SWIGTYPE (CLASS::*const&) } /* * Helper functions to pack/unpack arbitrary binary data (member function * pointers in this case) into a string. */ %fragment("SWIG_PackData", "header") { /* Pack binary data into a string */ SWIGINTERN char * SWIG_PackData(char *c, void *ptr, size_t sz) { static const char hex[17] = "0123456789abcdef"; const unsigned char *u = (unsigned char *) ptr; const unsigned char *eu = u + sz; for (; u != eu; ++u) { unsigned char uu = *u; *(c++) = hex[(uu & 0xf0) >> 4]; *(c++) = hex[uu & 0xf]; } return c; } } %fragment("SWIG_UnPackData", "header") { /* Unpack binary data from a string */ SWIGINTERN const char * SWIG_UnpackData(const char *c, void *ptr, size_t sz) { unsigned char *u = (unsigned char *) ptr; const unsigned char *eu = u + sz; for (; u != eu; ++u) { char d = *(c++); unsigned char uu; if ((d >= '0') && (d <= '9')) uu = ((d - '0') << 4); else if ((d >= 'a') && (d <= 'f')) uu = ((d - ('a'-10)) << 4); else return (char *) 0; d = *(c++); if ((d >= '0') && (d <= '9')) uu |= (d - '0'); else if ((d >= 'a') && (d <= 'f')) uu |= (d - ('a'-10)); else return (char *) 0; *u = uu; } return c; } } swig-4.0.1/Lib/d/std_vector.i0000644000175000017500000004052513527063513015635 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_vector.i * * SWIG typemaps for std::vector, D implementation. * * The D wrapper is made to loosely resemble a tango.util.container.more.Vector * and to provide built-in array-like access. * * If T does define an operator==, then use the SWIG_STD_VECTOR_ENHANCED * macro to obtain enhanced functionality (none yet), for example: * * SWIG_STD_VECTOR_ENHANCED(SomeNamespace::Klass) * %template(VectKlass) std::vector; * * Warning: heavy macro usage in this file. Use swig -E to get a sane view on * the real file contents! * ----------------------------------------------------------------------------- */ // Warning: Use the typemaps here in the expectation that the macros they are in will change name. %include // MACRO for use within the std::vector class body %define SWIG_STD_VECTOR_MINIMUM_INTERNAL(CONST_REFERENCE, CTYPE...) #if (SWIG_D_VERSION == 1) %typemap(dimports) std::vector< CTYPE > "static import tango.core.Exception;" %proxycode %{ public this($typemap(dtype, CTYPE)[] values) { this(); append(values); } alias push_back add; alias push_back push; alias push_back opCatAssign; alias size length; alias opSlice slice; public $typemap(dtype, CTYPE) opIndexAssign($typemap(dtype, CTYPE) value, size_t index) { if (index >= size()) { throw new tango.core.Exception.NoSuchElementException("Tried to assign to element out of vector bounds."); } setElement(index, value); return value; } public $typemap(dtype, CTYPE) opIndex(size_t index) { if (index >= size()) { throw new tango.core.Exception.NoSuchElementException("Tried to read from element out of vector bounds."); } return getElement(index); } public void append($typemap(dtype, CTYPE)[] value...) { foreach (v; value) { add(v); } } public $typemap(dtype, CTYPE)[] opSlice() { $typemap(dtype, CTYPE)[] array = new $typemap(dtype, CTYPE)[size()]; foreach (i, ref value; array) { value = getElement(i); } return array; } public int opApply(int delegate(ref $typemap(dtype, CTYPE) value) dg) { int result; size_t currentSize = size(); for (size_t i = 0; i < currentSize; ++i) { auto value = getElement(i); result = dg(value); setElement(i, value); } return result; } public int opApply(int delegate(ref size_t index, ref $typemap(dtype, CTYPE) value) dg) { int result; size_t currentSize = size(); for (size_t i = 0; i < currentSize; ++i) { auto value = getElement(i); // Workaround for http://d.puremagic.com/issues/show_bug.cgi?id=2443. auto index = i; result = dg(index, value); setElement(i, value); } return result; } public void capacity(size_t value) { if (value < size()) { throw new tango.core.Exception.IllegalArgumentException("Tried to make the capacity of a vector smaller than its size."); } reserve(value); } %} public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef CTYPE value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef CONST_REFERENCE const_reference; void clear(); void push_back(CTYPE const& x); size_type size() const; size_type capacity() const; void reserve(size_type n) throw (std::length_error); vector(); vector(const vector &other); %extend { vector(size_type capacity) throw (std::length_error) { std::vector< CTYPE >* pv = 0; pv = new std::vector< CTYPE >(); // Might throw std::length_error. pv->reserve(capacity); return pv; } size_type unused() const { return $self->capacity() - $self->size(); } const_reference remove() throw (std::out_of_range) { if ($self->empty()) { throw std::out_of_range("Tried to remove last element from empty vector."); } std::vector< CTYPE >::const_reference value = $self->back(); $self->pop_back(); return value; } const_reference remove(size_type index) throw (std::out_of_range) { if (index >= $self->size()) { throw std::out_of_range("Tried to remove element with invalid index."); } std::vector< CTYPE >::iterator it = $self->begin() + index; std::vector< CTYPE >::const_reference value = *it; $self->erase(it); return value; } } // Wrappers for setting/getting items with the possibly thrown exception // specified (important for SWIG wrapper generation). %extend { const_reference getElement(size_type index) throw (std::out_of_range) { if ((index < 0) || ($self->size() <= index)) { throw std::out_of_range("Tried to get value of element with invalid index."); } return (*$self)[index]; } } // Use CTYPE const& instead of const_reference to work around SWIG code // generation issue when using const pointers as vector elements (like // std::vector< const int* >). %extend { void setElement(size_type index, CTYPE const& val) throw (std::out_of_range) { if ((index < 0) || ($self->size() <= index)) { throw std::out_of_range("Tried to set value of element with invalid index."); } (*$self)[index] = val; } } %dmethodmodifiers std::vector::getElement "private" %dmethodmodifiers std::vector::setElement "private" %dmethodmodifiers std::vector::reserve "private" #else %typemap(dimports) std::vector< CTYPE > %{ static import std.algorithm; static import std.exception; static import std.range; static import std.traits; %} %proxycode %{ alias size_t KeyType; alias $typemap(dtype, CTYPE) ValueType; this(ValueType[] values...) { this(); reserve(values.length); foreach (e; values) { this ~= e; } } struct Range { private $typemap(dtype, std::vector< CTYPE >) _outer; private size_t _a, _b; this($typemap(dtype, std::vector< CTYPE >) data, size_t a, size_t b) { _outer = data; _a = a; _b = b; } @property bool empty() const { assert((cast($typemap(dtype, std::vector< CTYPE >))_outer).length >= _b); return _a >= _b; } @property Range save() { return this; } @property ValueType front() { std.exception.enforce(!empty); return _outer[_a]; } @property void front(ValueType value) { std.exception.enforce(!empty); _outer[_a] = std.algorithm.move(value); } void popFront() { std.exception.enforce(!empty); ++_a; } void opIndexAssign(ValueType value, size_t i) { i += _a; std.exception.enforce(i < _b && _b <= _outer.length); _outer[i] = value; } void opIndexOpAssign(string op)(ValueType value, size_t i) { std.exception.enforce(_outer && _a + i < _b && _b <= _outer.length); auto element = _outer[i]; mixin("element "~op~"= value;"); _outer[i] = element; } } // TODO: dup? Range opSlice() { return Range(this, 0, length); } Range opSlice(size_t a, size_t b) { std.exception.enforce(a <= b && b <= length); return Range(this, a, b); } size_t opDollar() const { return length; } @property ValueType front() { std.exception.enforce(!empty); return getElement(0); } @property void front(ValueType value) { std.exception.enforce(!empty); setElement(0, value); } @property ValueType back() { std.exception.enforce(!empty); return getElement(length - 1); } @property void back(ValueType value) { std.exception.enforce(!empty); setElement(length - 1, value); } ValueType opIndex(size_t i) { return getElement(i); } void opIndexAssign(ValueType value, size_t i) { setElement(i, value); } void opIndexOpAssign(string op)(ValueType value, size_t i) { auto element = this[i]; mixin("element "~op~"= value;"); this[i] = element; } ValueType[] opBinary(string op, Stuff)(Stuff stuff) if (op == "~") { ValueType[] result; result ~= this[]; assert(result.length == length); result ~= stuff[]; return result; } void opOpAssign(string op, Stuff)(Stuff stuff) if (op == "~") { static if (is(typeof(insertBack(stuff)))) { insertBack(stuff); } else if (is(typeof(insertBack(stuff[])))) { insertBack(stuff[]); } else { static assert(false, "Cannot append " ~ Stuff.stringof ~ " to " ~ typeof(this).stringof); } } alias size length; alias remove removeAny; alias removeAny stableRemoveAny; size_t insertBack(Stuff)(Stuff stuff) if (std.traits.isImplicitlyConvertible!(Stuff, ValueType)){ push_back(stuff); return 1; } size_t insertBack(Stuff)(Stuff stuff) if (std.range.isInputRange!Stuff && std.traits.isImplicitlyConvertible!(std.range.ElementType!Stuff, ValueType)) { size_t itemCount; foreach(item; stuff) { insertBack(item); ++itemCount; } return itemCount; } alias insertBack insert; alias pop_back removeBack; alias pop_back stableRemoveBack; size_t insertBefore(Stuff)(Range r, Stuff stuff) if (std.traits.isImplicitlyConvertible!(Stuff, ValueType)) { std.exception.enforce(r._outer.swigCPtr == swigCPtr && r._a < length); insertAt(r._a, stuff); return 1; } size_t insertBefore(Stuff)(Range r, Stuff stuff) if (std.range.isInputRange!Stuff && std.traits.isImplicitlyConvertible!(ElementType!Stuff, ValueType)) { std.exception.enforce(r._outer.swigCPtr == swigCPtr && r._a <= length); size_t insertCount; foreach(i, item; stuff) { insertAt(r._a + i, item); ++insertCount; } return insertCount; } size_t insertAfter(Stuff)(Range r, Stuff stuff) { // TODO: optimize immutable offset = r._a + r.length; std.exception.enforce(offset <= length); auto result = insertBack(stuff); std.algorithm.bringToFront(this[offset .. length - result], this[length - result .. length]); return result; } size_t replace(Stuff)(Range r, Stuff stuff) if (std.range.isInputRange!Stuff && std.traits.isImplicitlyConvertible!(ElementType!Stuff, ValueType)) { immutable offset = r._a; std.exception.enforce(offset <= length); size_t result; for (; !stuff.empty; stuff.popFront()) { if (r.empty) { // append the rest return result + insertBack(stuff); } r.front = stuff.front; r.popFront(); ++result; } // Remove remaining stuff in r remove(r); return result; } size_t replace(Stuff)(Range r, Stuff stuff) if (std.traits.isImplicitlyConvertible!(Stuff, ValueType)) { if (r.empty) { insertBefore(r, stuff); } else { r.front = stuff; r.popFront(); remove(r); } return 1; } Range linearRemove(Range r) { std.exception.enforce(r._a <= r._b && r._b <= length); immutable tailLength = length - r._b; linearRemove(r._a, r._b); return this[length - tailLength .. length]; } alias remove stableLinearRemove; int opApply(int delegate(ref $typemap(dtype, CTYPE) value) dg) { int result; size_t currentSize = size(); for (size_t i = 0; i < currentSize; ++i) { auto value = getElement(i); result = dg(value); setElement(i, value); } return result; } int opApply(int delegate(ref size_t index, ref $typemap(dtype, CTYPE) value) dg) { int result; size_t currentSize = size(); for (size_t i = 0; i < currentSize; ++i) { auto value = getElement(i); // Workaround for http://d.puremagic.com/issues/show_bug.cgi?id=2443. auto index = i; result = dg(index, value); setElement(i, value); } return result; } %} public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef CTYPE value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef CONST_REFERENCE const_reference; bool empty() const; void clear(); void push_back(CTYPE const& x); void pop_back(); size_type size() const; size_type capacity() const; void reserve(size_type n) throw (std::length_error); vector(); vector(const vector &other); %extend { vector(size_type capacity) throw (std::length_error) { std::vector< CTYPE >* pv = 0; pv = new std::vector< CTYPE >(); // Might throw std::length_error. pv->reserve(capacity); return pv; } const_reference remove() throw (std::out_of_range) { if ($self->empty()) { throw std::out_of_range("Tried to remove last element from empty vector."); } std::vector< CTYPE >::const_reference value = $self->back(); $self->pop_back(); return value; } const_reference remove(size_type index) throw (std::out_of_range) { if (index >= $self->size()) { throw std::out_of_range("Tried to remove element with invalid index."); } std::vector< CTYPE >::iterator it = $self->begin() + index; std::vector< CTYPE >::const_reference value = *it; $self->erase(it); return value; } void removeBack(size_type how_many) throw (std::out_of_range) { std::vector< CTYPE >::iterator end = $self->end(); std::vector< CTYPE >::iterator start = end - how_many; $self->erase(start, end); } void linearRemove(size_type start_index, size_type end_index) throw (std::out_of_range) { std::vector< CTYPE >::iterator start = $self->begin() + start_index; std::vector< CTYPE >::iterator end = $self->begin() + end_index; $self->erase(start, end); } void insertAt(size_type index, CTYPE const& x) throw (std::out_of_range) { std::vector< CTYPE >::iterator it = $self->begin() + index; $self->insert(it, x); } } // Wrappers for setting/getting items with the possibly thrown exception // specified (important for SWIG wrapper generation). %extend { const_reference getElement(size_type index) throw (std::out_of_range) { if ((index < 0) || ($self->size() <= index)) { throw std::out_of_range("Tried to get value of element with invalid index."); } return (*$self)[index]; } } // Use CTYPE const& instead of const_reference to work around SWIG code // generation issue when using const pointers as vector elements (like // std::vector< const int* >). %extend { void setElement(size_type index, CTYPE const& val) throw (std::out_of_range) { if ((index < 0) || ($self->size() <= index)) { throw std::out_of_range("Tried to set value of element with invalid index."); } (*$self)[index] = val; } } %dmethodmodifiers std::vector::getElement "private" %dmethodmodifiers std::vector::setElement "private" #endif %enddef // Extra methods added to the collection class if operator== is defined for the class being wrapped // The class will then implement IList<>, which adds extra functionality %define SWIG_STD_VECTOR_EXTRA_OP_EQUALS_EQUALS(CTYPE...) %extend { } %enddef // For vararg handling in macros, from swigmacros.swg #define %arg(X...) X // Macros for std::vector class specializations/enhancements %define SWIG_STD_VECTOR_ENHANCED(CTYPE...) namespace std { template<> class vector { SWIG_STD_VECTOR_MINIMUM_INTERNAL(const value_type&, %arg(CTYPE)) SWIG_STD_VECTOR_EXTRA_OP_EQUALS_EQUALS(CTYPE) }; } %enddef %{ #include #include %} namespace std { // primary (unspecialized) class template for std::vector // does not require operator== to be defined template class vector { SWIG_STD_VECTOR_MINIMUM_INTERNAL(const value_type&, T) }; // specializations for pointers template class vector { SWIG_STD_VECTOR_MINIMUM_INTERNAL(const value_type&, T *) SWIG_STD_VECTOR_EXTRA_OP_EQUALS_EQUALS(T *) }; // bool is a bit different in the C++ standard - const_reference in particular template<> class vector { SWIG_STD_VECTOR_MINIMUM_INTERNAL(bool, bool) SWIG_STD_VECTOR_EXTRA_OP_EQUALS_EQUALS(bool) }; } // template specializations for std::vector // these provide extra collections methods as operator== is defined SWIG_STD_VECTOR_ENHANCED(char) SWIG_STD_VECTOR_ENHANCED(signed char) SWIG_STD_VECTOR_ENHANCED(unsigned char) SWIG_STD_VECTOR_ENHANCED(short) SWIG_STD_VECTOR_ENHANCED(unsigned short) SWIG_STD_VECTOR_ENHANCED(int) SWIG_STD_VECTOR_ENHANCED(unsigned int) SWIG_STD_VECTOR_ENHANCED(long) SWIG_STD_VECTOR_ENHANCED(unsigned long) SWIG_STD_VECTOR_ENHANCED(long long) SWIG_STD_VECTOR_ENHANCED(unsigned long long) SWIG_STD_VECTOR_ENHANCED(float) SWIG_STD_VECTOR_ENHANCED(double) SWIG_STD_VECTOR_ENHANCED(std::string) // also requires a %include swig-4.0.1/Lib/d/ddirectives.swg0000644000175000017500000000101313527063513016323 0ustar williamwilliam/* ----------------------------------------------------------------------------- * ddirectives.swg * * D-specifiv directives. * ----------------------------------------------------------------------------- */ #define %dmanifestconst %feature("d:manifestconst") #define %dconstvalue(value) %feature("d:constvalue",value) #define %dmethodmodifiers %feature("d:methodmodifiers") #define %dnothrowexception %feature("except") #define %proxycode %insert("proxycode") swig-4.0.1/Lib/d/doperators.swg0000644000175000017500000001767013527063513016220 0ustar williamwilliam/* ----------------------------------------------------------------------------- * doperators.swg * * Mapping of C++ operator overloading methods to D. * ----------------------------------------------------------------------------- */ #if (SWIG_D_VERSION == 1) %pragma(d) imdmodulecode=%{ template SwigOperatorDefinitions() { public override int opEquals(Object o) { if (auto rhs = cast(typeof(this))o) { if (swigCPtr == rhs.swigCPtr) return 1; static if (is(typeof(swigOpEquals(rhs)))) { return swigOpEquals(rhs) ? 1 : 0; } else { return 0; } } return super.opEquals(o); } %} // opEquals is emitted in pure C mode as well to define two proxy classes // pointing to the same struct as equal. #ifdef __cplusplus %rename(opPos) *::operator+(); %rename(opPos) *::operator+() const; %rename(opNeg) *::operator-(); %rename(opNeg) *::operator-() const; %rename(opCom) *::operator~(); %rename(opCom) *::operator~() const; %rename(opAdd) *::operator+; %rename(opAddAssign) *::operator+=; %rename(opSub) *::operator-; %rename(opSubAssign) *::operator-=; %rename(opMul) *::operator*; %rename(opMulAssign) *::operator*=; %rename(opDiv) *::operator/; %rename(opDivAssign) *::operator/=; %rename(opMod) *::operator%; %rename(opModAssign) *::operator%=; %rename(opAnd) *::operator&; %rename(opAndAssign) *::operator&=; %rename(opOr) *::operator|; %rename(opOrAssign) *::operator|=; %rename(opXor) *::operator^; %rename(opXorAssign) *::operator^=; %rename(opShl) *::operator<<; %rename(opShlAssign) *::operator<<=; %rename(opShr) *::operator>>; %rename(opShrAssign) *::operator>>=; %rename(opIndex) *::operator[](unsigned) const; // opIndexAssign is not currently generated, it needs more extensive support // mechanisms. %rename(opCall) *::operator(); // !a is not overrideable in D1. %ignoreoperator(LNOT) operator!; // opCmp is used in D. %rename(swigOpEquals) *::operator==; %rename(swigOpLt) *::operator<; %rename(swigOpLtEquals) *::operator<=; %rename(swigOpGt) *::operator>; %rename(swigOpGtEquals) *::operator>=; // a != b is rewritten as !a.opEquals(b) in D. %ignoreoperator(NOTEQUAL) operator!=; // The logic operators are not overrideable in D. %ignoreoperator(LAND) operator&&; %ignoreoperator(LOR) operator||; // ++/--a is rewritten as a +/-= 1 in D1,so ignore the prefix operators. %ignoreoperator(PLUSPLUS) *::operator++(); %ignoreoperator(MINUSMINUS) *::operator--(); %rename(swigOpInc) *::operator++(int); %rename(swigOpDec) *::operator--(int); // The C++ assignment operator does not translate well to D where the proxy // classes have reference semantics. %ignoreoperator(EQ) operator=; %pragma(d) imdmodulecode=%{ public override int opCmp(Object o) { static if (is(typeof(swigOpLt(typeof(this).init) && swigOpEquals(typeof(this).init)))) { if (auto rhs = cast(typeof(this))o) { if (swigOpLt(rhs)) { return -1; } else if (swigOpEquals(rhs)) { return 0; } else { return 1; } } } return super.opCmp(o); } public typeof(this) opPostInc(T = int)(T unused = 0) { static assert( is(typeof(swigOpInc(int.init))), "opPostInc called on " ~ typeof(this).stringof ~ ", but no postfix " ~ "increment operator exists in the corresponding C++ class." ); return swigOpInc(int.init); } public typeof(this) opPostDec(T = int)(T unused = 0) { static assert( is(typeof(swigOpDec(int.init))), "opPostInc called on " ~ typeof(this).stringof ~ ", but no postfix " ~ "decrement operator exists in the corresponding C++ class." ); return swigOpDec(int.init); } %} #endif %pragma(d) imdmodulecode=%{ } %} #else %pragma(d) imdmodulecode=%{ mixin template SwigOperatorDefinitions() { public override bool opEquals(Object o) { if (auto rhs = cast(typeof(this))o) { if (swigCPtr == rhs.swigCPtr) return true; static if (is(typeof(swigOpEquals(rhs)))) { return swigOpEquals(rhs); } else { return false; } } return super.opEquals(o); } %} // opEquals is emitted in pure C mode as well to define two proxy classes // pointing to the same struct as equal. #ifdef __cplusplus %rename(swigOpPos) *::operator+(); %rename(swigOpPos) *::operator+() const; %rename(swigOpNeg) *::operator-(); %rename(swigOpNeg) *::operator-() const; %rename(swigOpCom) *::operator~(); %rename(swigOpCom) *::operator~() const; %rename(swigOpInc) *::operator++(); %rename(swigOpDec) *::operator--(); %ignoreoperator(PLUSPLUS) *::operator++(int); %ignoreoperator(MINUSMINUS) *::operator--(int); // The postfix increment/decrement operators are ignored because they are // rewritten to (auto t = e, ++e, t) in D2. The unary * operator (used for // pointer dereferencing in C/C++) isn't mapped to opUnary("*") by default, // despite this would be possible in D2 – the difference in member access // semantics would only lead to confusion in most cases. %rename(swigOpAdd) *::operator+; %rename(swigOpSub) *::operator-; %rename(swigOpMul) *::operator*; %rename(swigOpDiv) *::operator/; %rename(swigOpMod) *::operator%; %rename(swigOpAnd) *::operator&; %rename(swigOpOr) *::operator|; %rename(swigOpXor) *::operator^; %rename(swigOpShl) *::operator<<; %rename(swigOpShr) *::operator>>; %rename(swigOpAddAssign) *::operator+=; %rename(swigOpSubAssign) *::operator-=; %rename(swigOpMulAssign) *::operator*=; %rename(swigOpDivAssign) *::operator/=; %rename(swigOpModAssign) *::operator%=; %rename(swigOpAndAssign) *::operator&=; %rename(swigOpOrAssign) *::operator|=; %rename(swigOpXorAssign) *::operator^=; %rename(swigOpShlAssign) *::operator<<=; %rename(swigOpShrAssign) *::operator>>=; %rename(opIndex) *::operator[]; // opIndexAssign is not currently generated, it needs more extensive support // mechanisms. %rename(opCall) *::operator(); %rename(swigOpEquals) *::operator==; %rename(swigOpLt) *::operator<; %rename(swigOpLtEquals) *::operator<=; %rename(swigOpGt) *::operator>; %rename(swigOpGtEquals) *::operator>=; // a != b is rewritten as !a.opEquals(b) in D. %ignoreoperator(NOTEQUAL) operator!=; // The logic operators are not overrideable in D. %ignoreoperator(LAND) operator&&; %ignoreoperator(LOR) operator||; // The C++ assignment operator does not translate well to D where the proxy // classes have reference semantics. %ignoreoperator(EQ) operator=; %pragma(d) imdmodulecode=%{ public override int opCmp(Object o) { static if (__traits(compiles, swigOpLt(typeof(this).init) && swigOpEquals(typeof(this).init))) { if (auto rhs = cast(typeof(this))o) { if (swigOpLt(rhs)) { return -1; } else if (swigOpEquals(rhs)) { return 0; } else { return 1; } } } return super.opCmp(o); } private template swigOpBinary(string operator, string name) { enum swigOpBinary = `public void opOpAssign(string op, T)(T rhs) if (op == "` ~ operator ~ `" && __traits(compiles, swigOp` ~ name ~ `Assign(rhs))) { swigOp` ~ name ~ `Assign(rhs);}` ~ `public auto opBinary(string op, T)(T rhs) if (op == "` ~ operator ~ `" && __traits(compiles, swigOp` ~ name ~ `(rhs))) { return swigOp` ~ name ~ `(rhs);}`; } mixin(swigOpBinary!("+", "Add")); mixin(swigOpBinary!("-", "Sub")); mixin(swigOpBinary!("*", "Mul")); mixin(swigOpBinary!("/", "Div")); mixin(swigOpBinary!("%", "Mod")); mixin(swigOpBinary!("&", "And")); mixin(swigOpBinary!("|", "Or")); mixin(swigOpBinary!("^", "Xor")); mixin(swigOpBinary!("<<", "Shl")); mixin(swigOpBinary!(">>", "Shr")); private template swigOpUnary(string operator, string name) { enum swigOpUnary = `public auto opUnary(string op)() if (op == "` ~ operator ~ `" && __traits(compiles, swigOp` ~ name ~ `())) { return swigOp` ~ name ~ `();}`; } mixin(swigOpUnary!("+", "Pos")); mixin(swigOpUnary!("-", "Neg")); mixin(swigOpUnary!("~", "Com")); mixin(swigOpUnary!("++", "Inc")); mixin(swigOpUnary!("--", "Dec")); %} #endif %pragma(d) imdmodulecode=%{ } %} #endif swig-4.0.1/Lib/d/dkw.swg0000644000175000017500000000456513527063513014622 0ustar williamwilliam#ifndef D_DKW_SWG_ #define D_DKW_SWG_ /* Warnings for D keywords */ #define DKEYWORD(x) %keywordwarn("'" `x` "' is a D keyword, renaming to '_" `x` "'",rename="_%s") `x` // Source: http://www.digitalmars.com/d/{1.0,2.0}/lex.html and DKEYWORD(Error); DKEYWORD(Exception); DKEYWORD(Object); DKEYWORD(__FILE__); DKEYWORD(__LINE__); DKEYWORD(__gshared); DKEYWORD(__thread); DKEYWORD(__traits); DKEYWORD(abstract); DKEYWORD(alias); DKEYWORD(align); DKEYWORD(asm); DKEYWORD(assert); DKEYWORD(auto); DKEYWORD(body); DKEYWORD(bool); DKEYWORD(break); DKEYWORD(byte); DKEYWORD(case); DKEYWORD(cast); DKEYWORD(catch); DKEYWORD(cdouble); DKEYWORD(cent); DKEYWORD(cfloat); DKEYWORD(char); DKEYWORD(class); DKEYWORD(const); DKEYWORD(continue); DKEYWORD(creal); DKEYWORD(dchar); DKEYWORD(debug); DKEYWORD(default); DKEYWORD(delegate); DKEYWORD(delete); DKEYWORD(deprecated); DKEYWORD(do); DKEYWORD(double); DKEYWORD(dstring); DKEYWORD(else); DKEYWORD(enum); DKEYWORD(export); DKEYWORD(extern); DKEYWORD(false); DKEYWORD(final); DKEYWORD(finally); DKEYWORD(float); DKEYWORD(for); DKEYWORD(foreach); DKEYWORD(foreach_reverse); DKEYWORD(function); DKEYWORD(goto); DKEYWORD(idouble); DKEYWORD(if); DKEYWORD(ifloat); DKEYWORD(immutable); DKEYWORD(import); DKEYWORD(in); DKEYWORD(inout); DKEYWORD(int); DKEYWORD(interface); DKEYWORD(invariant); DKEYWORD(ireal); DKEYWORD(is); DKEYWORD(lazy); DKEYWORD(long); DKEYWORD(macro); DKEYWORD(mixin); DKEYWORD(module); DKEYWORD(new); DKEYWORD(nothrow); DKEYWORD(null); DKEYWORD(out); DKEYWORD(override); DKEYWORD(package); DKEYWORD(pragma); DKEYWORD(private); DKEYWORD(protected); DKEYWORD(public); DKEYWORD(pure); DKEYWORD(real); DKEYWORD(ref); DKEYWORD(return); DKEYWORD(scope); DKEYWORD(shared); DKEYWORD(short); DKEYWORD(static); DKEYWORD(string); DKEYWORD(struct); DKEYWORD(super); DKEYWORD(switch); DKEYWORD(synchronized); DKEYWORD(template); DKEYWORD(this); DKEYWORD(throw); DKEYWORD(true); DKEYWORD(try); DKEYWORD(typedef); DKEYWORD(typeid); DKEYWORD(typeof); DKEYWORD(ubyte); DKEYWORD(ucent); DKEYWORD(uint); DKEYWORD(ulong); DKEYWORD(union); DKEYWORD(unittest); DKEYWORD(ushort); DKEYWORD(version); DKEYWORD(void); DKEYWORD(volatile); DKEYWORD(wchar); DKEYWORD(while); DKEYWORD(with); DKEYWORD(wstring); // Not really a keyword, but dispose() methods are generated in proxy classes // and it's a special method name for D1/Tango. DKEYWORD(dispose); #undef DKEYWORD #endif //D_DKW_SWG_ swig-4.0.1/Lib/d/std_common.i0000644000175000017500000000014613527063513015616 0ustar williamwilliam%include %apply size_t { std::size_t }; %apply const size_t& { const std::size_t& }; swig-4.0.1/Lib/d/dclassgen.swg0000644000175000017500000000710113527063513015765 0ustar williamwilliam/* ----------------------------------------------------------------------------- * dclassgen.swg * * Typemaps containing D code used when generating D proxy classes. * ----------------------------------------------------------------------------- */ %typemap(dbase) SWIGTYPE, SWIGTYPE *, SWIGTYPE &, SWIGTYPE [], SWIGTYPE (CLASS::*) "" %typemap(dclassmodifiers) SWIGTYPE, SWIGTYPE *, SWIGTYPE &, SWIGTYPE [], SWIGTYPE (CLASS::*) "class" %typemap(dcode) SWIGTYPE, SWIGTYPE *, SWIGTYPE &, SWIGTYPE [], SWIGTYPE (CLASS::*) "" %typemap(dimports) SWIGTYPE, SWIGTYPE *, SWIGTYPE &, SWIGTYPE [], SWIGTYPE (CLASS::*) "" %typemap(dinterfaces) SWIGTYPE, SWIGTYPE *, SWIGTYPE &, SWIGTYPE [], SWIGTYPE (CLASS::*) "" %typemap(dinterfaces_derived) SWIGTYPE, SWIGTYPE *, SWIGTYPE &, SWIGTYPE [], SWIGTYPE (CLASS::*) "" // See . %typemap(dclassmodifiers) enum SWIGTYPE "enum" %typemap(dcode) enum SWIGTYPE "" /* * Proxy classes. */ %typemap(dconstructor, excode=SWIGEXCODE,directorconnect="\n swigDirectorConnect();") SWIGTYPE { this($imcall, true);$excode$directorconnect } %typemap(ddestructor) SWIGTYPE %{ ~this() { dispose(); } %} // We do not use »override« attribute for generated dispose() methods to stay // somewhat compatible to Phobos and older Tango versions where Object.dispose() // does not exist. %typemap(ddispose, methodname="dispose", methodmodifiers="public", parameters="") SWIGTYPE { synchronized(this) { if (swigCPtr !is null) { if (swigCMemOwn) { swigCMemOwn = false; $imcall; } swigCPtr = null; } } } %typemap(ddispose_derived, methodname="dispose", methodmodifiers="public", parameters="") SWIGTYPE { synchronized(this) { if (swigCPtr !is null) { if (swigCMemOwn) { swigCMemOwn = false; $imcall; } swigCPtr = null; super.dispose(); } } } // Unfortunately, the »package« visibility attribute does not work in D when the // module in question is in the root package (happens if no -package is specified // at the SWIG command line), so we are stuck with public visibility for // swigGetCPtr(). %typemap(dbody) SWIGTYPE %{ private void* swigCPtr; protected bool swigCMemOwn; public this(void* cObject, bool ownCObject) { swigCPtr = cObject; swigCMemOwn = ownCObject; } public static void* swigGetCPtr(typeof(this) obj) { return (obj is null) ? null : obj.swigCPtr; } mixin $imdmodule.SwigOperatorDefinitions; %} %typemap(dbody_derived) SWIGTYPE %{ private void* swigCPtr; public this(void* cObject, bool ownCObject) { super($imdmodule.$dclazznameUpcast(cObject), ownCObject); swigCPtr = cObject; } public static void* swigGetCPtr(typeof(this) obj) { return (obj is null) ? null : obj.swigCPtr; } mixin $imdmodule.SwigOperatorDefinitions; %} /* * Type wrapper classes. */ %typemap(dbody) SWIGTYPE *, SWIGTYPE &, SWIGTYPE [] %{ private void* swigCPtr; public this(void* cObject, bool futureUse) { swigCPtr = cObject; } protected this() { swigCPtr = null; } public static void* swigGetCPtr(typeof(this) obj) { return (obj is null) ? null : obj.swigCPtr; } mixin $imdmodule.SwigOperatorDefinitions; %} /* * Member function pointer wrapper classes (see ). */ %typemap(dbody) SWIGTYPE (CLASS::*) %{ private char* swigCPtr; public this(char* cMemberPtr, bool futureUse) { swigCPtr = cMemberPtr; } protected this() { swigCPtr = null; } package static char* swigGetCMemberPtr(typeof(this) obj) { return (obj is null) ? null : obj.swigCPtr; } mixin $imdmodule.SwigOperatorDefinitions; %} swig-4.0.1/Lib/d/std_except.i0000644000175000017500000000377613527063513015632 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_except.i * * Typemaps used by the STL wrappers that throw exceptions. These typemaps are * used when methods are declared with an STL exception specification, such as * size_t at() const throw (std::out_of_range); * ----------------------------------------------------------------------------- */ %{ #include #include %} namespace std { %ignore exception; struct exception {}; } %typemap(throws, canthrow=1) std::bad_cast "SWIG_DSetPendingException(SWIG_DException, $1.what());\n return $null;" %typemap(throws, canthrow=1) std::bad_exception "SWIG_DSetPendingException(SWIG_DException, $1.what());\n return $null;" %typemap(throws, canthrow=1) std::domain_error "SWIG_DSetPendingException(SWIG_DException, $1.what());\n return $null;" %typemap(throws, canthrow=1) std::exception "SWIG_DSetPendingException(SWIG_DException, $1.what());\n return $null;" %typemap(throws, canthrow=1) std::invalid_argument "SWIG_DSetPendingException(SWIG_DIllegalArgumentException, $1.what());\n return $null;" %typemap(throws, canthrow=1) std::length_error "SWIG_DSetPendingException(SWIG_DNoSuchElementException, $1.what());\n return $null;" %typemap(throws, canthrow=1) std::logic_error "SWIG_DSetPendingException(SWIG_DException, $1.what());\n return $null;" %typemap(throws, canthrow=1) std::out_of_range "SWIG_DSetPendingException(SWIG_DNoSuchElementException, $1.what());\n return $null;" %typemap(throws, canthrow=1) std::overflow_error "SWIG_DSetPendingException(SWIG_DException, $1.what());\n return $null;" %typemap(throws, canthrow=1) std::range_error "SWIG_DSetPendingException(SWIG_DException, $1.what());\n return $null;" %typemap(throws, canthrow=1) std::runtime_error "SWIG_DSetPendingException(SWIG_DException, $1.what());\n return $null;" %typemap(throws, canthrow=1) std::underflow_error "SWIG_DSetPendingException(SWIG_DException, $1.what());\n return $null;" swig-4.0.1/Lib/d/dswigtype.swg0000644000175000017500000001314613527063513016047 0ustar williamwilliam/* ----------------------------------------------------------------------------- * dswigtype.swg * * Typemaps for non-primitive types (C/C++ classes and structs). * ----------------------------------------------------------------------------- */ %typemap(ctype) SWIGTYPE "void *" %typemap(imtype) SWIGTYPE "void*" %typemap(dtype) SWIGTYPE "$&dclassname" %typemap(ctype) SWIGTYPE [] "void *" %typemap(imtype) SWIGTYPE [] "void*" %typemap(dtype) SWIGTYPE [] "$dclassname" %typemap(ctype) SWIGTYPE * "void *" %typemap(imtype) SWIGTYPE * "void*" %typemap(dtype, nativepointer="$dtype") SWIGTYPE * "$dclassname" %typemap(ctype) SWIGTYPE & "void *" %typemap(imtype) SWIGTYPE & "void*" %typemap(dtype, nativepointer="$dtype") SWIGTYPE & "$dclassname" %typemap(ctype) SWIGTYPE *const& "void *" %typemap(imtype) SWIGTYPE *const& "void*" %typemap(dtype) SWIGTYPE *const& "$*dclassname" %typecheck(SWIG_TYPECHECK_POINTER) SWIGTYPE, SWIGTYPE *, SWIGTYPE &, SWIGTYPE [], SWIGTYPE *const& "" /* * By-value conversion typemaps (parameter is converted to a pointer). */ %typemap(in, canthrow=1) SWIGTYPE ($&1_type argp) %{ argp = ($&1_ltype)$input; if (!argp) { SWIG_DSetPendingException(SWIG_DIllegalArgumentException, "Attempt to dereference null $1_type"); return $null; } $1 = *argp; %} %typemap(out) SWIGTYPE #ifdef __cplusplus %{ $result = new $1_ltype((const $1_ltype &)$1); %} #else { $&1_ltype $1ptr = ($&1_ltype) malloc(sizeof($1_ltype)); memmove($1ptr, &$1, sizeof($1_type)); $result = $1ptr; } #endif %typemap(directorin) SWIGTYPE "$input = (void *)new $1_ltype((const $1_ltype &)$1);" %typemap(directorout) SWIGTYPE %{ if (!$input) { SWIG_DSetPendingException(SWIG_DIllegalArgumentException, "Unexpected null return for type $1_type"); return $null; } $result = *($&1_ltype)$input; %} %typemap(ddirectorin) SWIGTYPE "new $&dclassname($winput, true)" %typemap(ddirectorout) SWIGTYPE "$&dclassname.swigGetCPtr($dcall)" %typemap(din) SWIGTYPE "$&dclassname.swigGetCPtr($dinput)" %typemap(dout, excode=SWIGEXCODE) SWIGTYPE { $&dclassname ret = new $&dclassname($imcall, true);$excode return ret; } /* * Pointer conversion typemaps. */ %typemap(in) SWIGTYPE * "$1 = ($1_ltype)$input;" %typemap(out) SWIGTYPE * "$result = (void *)$1;" %typemap(directorin) SWIGTYPE * "$input = (void *) $1;" %typemap(directorout, warning=SWIGWARN_TYPEMAP_DIRECTOROUT_PTR_MSG) SWIGTYPE * "$result = ($1_ltype)$input;" %typemap(ddirectorin, nativepointer="cast($dtype)$winput" ) SWIGTYPE * "($winput is null) ? null : new $dclassname($winput, false)" %typemap(ddirectorout, nativepointer="cast(void*)$dcall" ) SWIGTYPE * "$dclassname.swigGetCPtr($dcall)" %typemap(din, nativepointer="cast(void*)$dinput" ) SWIGTYPE * "$dclassname.swigGetCPtr($dinput)" %typemap(dout, excode=SWIGEXCODE, nativepointer="{\n auto ret = cast($dtype)$imcall;$excode\n return ret;\n}" ) SWIGTYPE * { void* cPtr = $imcall; $dclassname ret = (cPtr is null) ? null : new $dclassname(cPtr, $owner);$excode return ret; } // Use the same typemaps for const pointers. %apply SWIGTYPE * { SWIGTYPE *const } /* * Reference conversion typemaps. */ %typemap(in, canthrow=1) SWIGTYPE & %{ $1 = ($1_ltype)$input; if (!$1) { SWIG_DSetPendingException(SWIG_DIllegalArgumentException, "$1_type type is null"); return $null; } %} %typemap(out) SWIGTYPE & "$result = (void *)$1;" %typemap(directorin) SWIGTYPE & "$input = ($1_ltype) &$1;" %typemap(directorout, warning=SWIGWARN_TYPEMAP_DIRECTOROUT_PTR_MSG) SWIGTYPE & %{ if (!$input) { SWIG_DSetPendingException(SWIG_DIllegalArgumentException, "Unexpected null return for type $1_type"); return $null; } $result = ($1_ltype)$input; %} %typemap(ddirectorin, nativepointer="cast($dtype)$winput" ) SWIGTYPE & "new $dclassname($winput, false)" %typemap(ddirectorout, nativepointer="cast(void*)$dcall" ) SWIGTYPE & "$dclassname.swigGetCPtr($dcall)" %typemap(din, nativepointer="cast(void*)$dinput" ) SWIGTYPE & "$dclassname.swigGetCPtr($dinput)" %typemap(dout, excode=SWIGEXCODE, nativepointer="{\n auto ret = cast($dtype)$imcall;$excode\n return ret;\n}") SWIGTYPE & { $dclassname ret = new $dclassname($imcall, $owner);$excode return ret; } /* * Array conversion typemaps. */ %typemap(in) SWIGTYPE [] %{ $1 = ($1_ltype)$input; %} %typemap(out) SWIGTYPE [] %{ $result = $1; %} %typemap(din) SWIGTYPE [] "$dclassname.swigGetCPtr($dinput)" %typemap(dout, excode=SWIGEXCODE) SWIGTYPE [] { void* cPtr = $imcall; $dclassname ret = (cPtr is null) ? null : new $dclassname(cPtr, $owner);$excode return ret; } // Treat references to arrays like references to a single element. %apply SWIGTYPE & { SWIGTYPE ((&)[ANY]) } /* * Pointer reference conversion typemaps. */ %typemap(in) SWIGTYPE *const& ($*1_ltype temp = 0) %{ temp = ($*1_ltype)$input; $1 = ($1_ltype)&temp; %} %typemap(out) SWIGTYPE *const& %{ $result = (void *)*$1; %} %typemap(din) SWIGTYPE *const& "$*dclassname.swigGetCPtr($dinput)" %typemap(dout, excode=SWIGEXCODE) SWIGTYPE *const& { void* cPtr = $imcall; $*dclassname ret = (cPtr is null) ? null : new $*dclassname(cPtr, $owner);$excode return ret; } %typemap(directorin) SWIGTYPE *const& "$input = (void *) $1;" %typemap(directorout, warning=SWIGWARN_TYPEMAP_DIRECTOROUT_PTR_MSG) SWIGTYPE *const& %{ static $*1_ltype swig_temp; swig_temp = ($*1_ltype)$input; $result = &swig_temp; %} %typemap(ddirectorin, nativepointer="cast($dtype)$winput" ) SWIGTYPE *const& "($winput is null) ? null : new $*dclassname($winput, false)" %typemap(ddirectorout, nativepointer="cast(void*)$dcall" ) SWIGTYPE *const& "$*dclassname.swigGetCPtr($dcall)" swig-4.0.1/Lib/d/typemaps.i0000644000175000017500000002547713527063513015334 0ustar williamwilliam/* ----------------------------------------------------------------------------- * typemaps.i * * Pointer and reference handling typemap library * * These mappings provide support for input/output arguments and common * uses for C/C++ pointers and C++ references. * ----------------------------------------------------------------------------- */ /* INPUT typemaps -------------- These typemaps are used for pointer/reference parameters that are input only and are mapped to a D input parameter. The following typemaps can be applied to turn a pointer or reference into a simple input value. That is, instead of passing a pointer or reference to an object, you would use a real value instead. bool *INPUT, bool &INPUT signed char *INPUT, signed char &INPUT unsigned char *INPUT, unsigned char &INPUT short *INPUT, short &INPUT unsigned short *INPUT, unsigned short &INPUT int *INPUT, int &INPUT unsigned int *INPUT, unsigned int &INPUT long *INPUT, long &INPUT unsigned long *INPUT, unsigned long &INPUT long long *INPUT, long long &INPUT unsigned long long *INPUT, unsigned long long &INPUT float *INPUT, float &INPUT double *INPUT, double &INPUT To use these, suppose you had a C function like this : double fadd(double *a, double *b) { return *a+*b; } You could wrap it with SWIG as follows : %include double fadd(double *INPUT, double *INPUT); or you can use the %apply directive : %include %apply double *INPUT { double *a, double *b }; double fadd(double *a, double *b); In D you could then use it like this: double answer = fadd(10.0, 20.0); */ %define INPUT_TYPEMAP(TYPE, CTYPE, DTYPE) %typemap(ctype, out="void *") TYPE *INPUT, TYPE &INPUT "CTYPE" %typemap(imtype, out="void*") TYPE *INPUT, TYPE &INPUT "DTYPE" %typemap(dtype, out="DTYPE*") TYPE *INPUT, TYPE &INPUT "DTYPE" %typemap(din) TYPE *INPUT, TYPE &INPUT "$dinput" %typemap(in) TYPE *INPUT, TYPE &INPUT %{ $1 = ($1_ltype)&$input; %} %typemap(typecheck) TYPE *INPUT = TYPE; %typemap(typecheck) TYPE &INPUT = TYPE; %enddef INPUT_TYPEMAP(bool, unsigned int, bool) //INPUT_TYPEMAP(char, char, char) // Why was this commented out? INPUT_TYPEMAP(signed char, signed char, byte) INPUT_TYPEMAP(unsigned char, unsigned char, ubyte) INPUT_TYPEMAP(short, short, short) INPUT_TYPEMAP(unsigned short, unsigned short, ushort) INPUT_TYPEMAP(int, int, int) INPUT_TYPEMAP(unsigned int, unsigned int, uint) INPUT_TYPEMAP(long, long, SWIG_LONG_DTYPE) INPUT_TYPEMAP(unsigned long, unsigned long, SWIG_ULONG_DTYPE) INPUT_TYPEMAP(long long, long long, long) INPUT_TYPEMAP(unsigned long long, unsigned long long, ulong) INPUT_TYPEMAP(float, float, float) INPUT_TYPEMAP(double, double, double) INPUT_TYPEMAP(enum SWIGTYPE, unsigned int, int) %typemap(dtype) enum SWIGTYPE *INPUT, enum SWIGTYPE &INPUT "$*dclassname" #undef INPUT_TYPEMAP /* OUTPUT typemaps --------------- These typemaps are used for pointer/reference parameters that are output only and are mapped to a D output parameter. The following typemaps can be applied to turn a pointer or reference into an "output" value. When calling a function, no input value would be given for a parameter, but an output value would be returned. In D, the 'out' keyword is used when passing the parameter to a function that takes an output parameter. bool *OUTPUT, bool &OUTPUT signed char *OUTPUT, signed char &OUTPUT unsigned char *OUTPUT, unsigned char &OUTPUT short *OUTPUT, short &OUTPUT unsigned short *OUTPUT, unsigned short &OUTPUT int *OUTPUT, int &OUTPUT unsigned int *OUTPUT, unsigned int &OUTPUT long *OUTPUT, long &OUTPUT unsigned long *OUTPUT, unsigned long &OUTPUT long long *OUTPUT, long long &OUTPUT unsigned long long *OUTPUT, unsigned long long &OUTPUT float *OUTPUT, float &OUTPUT double *OUTPUT, double &OUTPUT For example, suppose you were trying to wrap the modf() function in the C math library which splits x into integral and fractional parts (and returns the integer part in one of its parameters): double modf(double x, double *ip); You could wrap it with SWIG as follows : %include double modf(double x, double *OUTPUT); or you can use the %apply directive : %include %apply double *OUTPUT { double *ip }; double modf(double x, double *ip); The D output of the function would be the function return value and the value returned in the second output parameter. In D you would use it like this: double dptr; double fraction = modf(5, dptr); */ %define OUTPUT_TYPEMAP(TYPE, CTYPE, DTYPE, TYPECHECKPRECEDENCE) %typemap(ctype, out="void *") TYPE *OUTPUT, TYPE &OUTPUT "CTYPE *" %typemap(imtype, out="void*") TYPE *OUTPUT, TYPE &OUTPUT "out DTYPE" %typemap(dtype, out="DTYPE*") TYPE *OUTPUT, TYPE &OUTPUT "out DTYPE" %typemap(din) TYPE *OUTPUT, TYPE &OUTPUT "$dinput" %typemap(in) TYPE *OUTPUT, TYPE &OUTPUT %{ $1 = ($1_ltype)$input; %} %typecheck(SWIG_TYPECHECK_##TYPECHECKPRECEDENCE) TYPE *OUTPUT, TYPE &OUTPUT "" %enddef OUTPUT_TYPEMAP(bool, unsigned int, bool, BOOL_PTR) //OUTPUT_TYPEMAP(char, char, char, CHAR_PTR) // Why was this commented out? OUTPUT_TYPEMAP(signed char, signed char, byte, INT8_PTR) OUTPUT_TYPEMAP(unsigned char, unsigned char, ubyte, UINT8_PTR) OUTPUT_TYPEMAP(short, short, short, INT16_PTR) OUTPUT_TYPEMAP(unsigned short, unsigned short, ushort, UINT16_PTR) OUTPUT_TYPEMAP(int, int, int, INT32_PTR) OUTPUT_TYPEMAP(unsigned int, unsigned int, uint, UINT32_PTR) OUTPUT_TYPEMAP(long, long, SWIG_LONG_DTYPE,INT32_PTR) OUTPUT_TYPEMAP(unsigned long, unsigned long, SWIG_ULONG_DTYPE,UINT32_PTR) OUTPUT_TYPEMAP(long long, long long, long, INT64_PTR) OUTPUT_TYPEMAP(unsigned long long, unsigned long long, ulong, UINT64_PTR) OUTPUT_TYPEMAP(float, float, float, FLOAT_PTR) OUTPUT_TYPEMAP(double, double, double, DOUBLE_PTR) OUTPUT_TYPEMAP(enum SWIGTYPE, unsigned int, int, INT32_PTR) %typemap(dtype) enum SWIGTYPE *OUTPUT, enum SWIGTYPE &OUTPUT "out $*dclassname" #undef OUTPUT_TYPEMAP %typemap(in) bool *OUTPUT, bool &OUTPUT %{ *$input = 0; $1 = ($1_ltype)$input; %} /* INOUT typemaps -------------- These typemaps are for pointer/reference parameters that are both input and output and are mapped to a D reference parameter. The following typemaps can be applied to turn a pointer or reference into a reference parameters, that is the parameter is both an input and an output. In D, the 'ref' keyword is used for reference parameters. bool *INOUT, bool &INOUT signed char *INOUT, signed char &INOUT unsigned char *INOUT, unsigned char &INOUT short *INOUT, short &INOUT unsigned short *INOUT, unsigned short &INOUT int *INOUT, int &INOUT unsigned int *INOUT, unsigned int &INOUT long *INOUT, long &INOUT unsigned long *INOUT, unsigned long &INOUT long long *INOUT, long long &INOUT unsigned long long *INOUT, unsigned long long &INOUT float *INOUT, float &INOUT double *INOUT, double &INOUT For example, suppose you were trying to wrap the following function : void neg(double *x) { *x = -(*x); } You could wrap it with SWIG as follows : %include void neg(double *INOUT); or you can use the %apply directive : %include %apply double *INOUT { double *x }; void neg(double *x); The D output of the function would be the new value returned by the reference parameter. In D you would use it like this: double x = 5.0; neg(x); The implementation of the OUTPUT and INOUT typemaps is different to the scripting languages in that the scripting languages will return the output value as part of the function return value. */ %define INOUT_TYPEMAP(TYPE, CTYPE, DTYPE, TYPECHECKPRECEDENCE) %typemap(ctype, out="void *") TYPE *INOUT, TYPE &INOUT "CTYPE *" %typemap(imtype, out="void*") TYPE *INOUT, TYPE &INOUT "ref DTYPE" %typemap(dtype, out="DTYPE*") TYPE *INOUT, TYPE &INOUT "ref DTYPE" %typemap(din) TYPE *INOUT, TYPE &INOUT "$dinput" %typemap(in) TYPE *INOUT, TYPE &INOUT %{ $1 = ($1_ltype)$input; %} %typecheck(SWIG_TYPECHECK_##TYPECHECKPRECEDENCE) TYPE *INOUT, TYPE &INOUT "" %enddef INOUT_TYPEMAP(bool, unsigned int, bool, BOOL_PTR) //INOUT_TYPEMAP(char, char, char, CHAR_PTR) INOUT_TYPEMAP(signed char, signed char, byte, INT8_PTR) INOUT_TYPEMAP(unsigned char, unsigned char, ubyte, UINT8_PTR) INOUT_TYPEMAP(short, short, short, INT16_PTR) INOUT_TYPEMAP(unsigned short, unsigned short, ushort, UINT16_PTR) INOUT_TYPEMAP(int, int, int, INT32_PTR) INOUT_TYPEMAP(unsigned int, unsigned int, uint, UINT32_PTR) INOUT_TYPEMAP(long, long, SWIG_LONG_DTYPE,INT32_PTR) INOUT_TYPEMAP(unsigned long, unsigned long, SWIG_ULONG_DTYPE,UINT32_PTR) INOUT_TYPEMAP(long long, long long, long, INT64_PTR) INOUT_TYPEMAP(unsigned long long, unsigned long long, ulong, UINT64_PTR) INOUT_TYPEMAP(float, float, float, FLOAT_PTR) INOUT_TYPEMAP(double, double, double, DOUBLE_PTR) INOUT_TYPEMAP(enum SWIGTYPE, unsigned int, int, INT32_PTR) %typemap(dtype) enum SWIGTYPE *INOUT, enum SWIGTYPE &INOUT "ref $*dclassname" #undef INOUT_TYPEMAP swig-4.0.1/Lib/d/wrapperloader.swg0000644000175000017500000001732713527063513016704 0ustar williamwilliam/* ----------------------------------------------------------------------------- * wrapperloader.swg * * Support code for dynamically linking the C wrapper library from the D * wrapper module. * * The loading code was adapted from the Derelict project and is used with * permission from Michael Parker, the original author. * ----------------------------------------------------------------------------- */ %pragma(d) wrapperloadercode = %{ private { version(linux) { version = Nix; } else version(darwin) { version = Nix; } else version(OSX) { version = Nix; } else version(FreeBSD) { version = Nix; version = freebsd; } else version(freebsd) { version = Nix; } else version(Unix) { version = Nix; } else version(Posix) { version = Nix; } version(Tango) { static import tango.stdc.string; static import tango.stdc.stringz; version (PhobosCompatibility) { } else { alias char[] string; alias wchar[] wstring; alias dchar[] dstring; } } else { version(D_Version2) { static import std.conv; } static import std.string; static import std.c.string; } version(D_Version2) { mixin("alias const(char)* CCPTR;"); } else { alias char* CCPTR; } CCPTR swigToCString(string str) { version(Tango) { return tango.stdc.stringz.toStringz(str); } else { return std.string.toStringz(str); } } string swigToDString(CCPTR cstr) { version(Tango) { return tango.stdc.stringz.fromStringz(cstr); } else { version(D_Version2) { mixin("return std.conv.to!string(cstr);"); } else { return std.c.string.toString(cstr); } } } } class SwigSwigSharedLibLoadException : Exception { this(in string[] libNames, in string[] reasons) { string msg = "Failed to load one or more shared libraries:"; foreach(i, n; libNames) { msg ~= "\n\t" ~ n ~ " - "; if(i < reasons.length) msg ~= reasons[i]; else msg ~= "Unknown"; } super(msg); } } class SwigSymbolLoadException : Exception { this(string SwigSharedLibName, string symbolName) { super("Failed to load symbol " ~ symbolName ~ " from shared library " ~ SwigSharedLibName); _symbolName = symbolName; } string symbolName() { return _symbolName; } private: string _symbolName; } private { version(Nix) { version(freebsd) { // the dl* functions are in libc on FreeBSD } else { pragma(lib, "dl"); } version(Tango) { import tango.sys.Common; } else version(linux) { import std.c.linux.linux; } else { extern(C) { const RTLD_NOW = 2; void *dlopen(CCPTR file, int mode); int dlclose(void* handle); void *dlsym(void* handle, CCPTR name); CCPTR dlerror(); } } alias void* SwigSharedLibHandle; SwigSharedLibHandle swigLoadSharedLib(string libName) { return dlopen(swigToCString(libName), RTLD_NOW); } void swigUnloadSharedLib(SwigSharedLibHandle hlib) { dlclose(hlib); } void* swigGetSymbol(SwigSharedLibHandle hlib, string symbolName) { return dlsym(hlib, swigToCString(symbolName)); } string swigGetErrorStr() { CCPTR err = dlerror(); if (err is null) { return "Unknown Error"; } return swigToDString(err); } } else version(Windows) { alias ushort WORD; alias uint DWORD; alias CCPTR LPCSTR; alias void* HMODULE; alias void* HLOCAL; alias int function() FARPROC; struct VA_LIST {} extern (Windows) { HMODULE LoadLibraryA(LPCSTR); FARPROC GetProcAddress(HMODULE, LPCSTR); void FreeLibrary(HMODULE); DWORD GetLastError(); DWORD FormatMessageA(DWORD, in void*, DWORD, DWORD, LPCSTR, DWORD, VA_LIST*); HLOCAL LocalFree(HLOCAL); } DWORD MAKELANGID(WORD p, WORD s) { return (((cast(WORD)s) << 10) | cast(WORD)p); } enum { LANG_NEUTRAL = 0, SUBLANG_DEFAULT = 1, FORMAT_MESSAGE_ALLOCATE_BUFFER = 256, FORMAT_MESSAGE_IGNORE_INSERTS = 512, FORMAT_MESSAGE_FROM_SYSTEM = 4096 } alias HMODULE SwigSharedLibHandle; SwigSharedLibHandle swigLoadSharedLib(string libName) { return LoadLibraryA(swigToCString(libName)); } void swigUnloadSharedLib(SwigSharedLibHandle hlib) { FreeLibrary(hlib); } void* swigGetSymbol(SwigSharedLibHandle hlib, string symbolName) { return GetProcAddress(hlib, swigToCString(symbolName)); } string swigGetErrorStr() { DWORD errcode = GetLastError(); LPCSTR msgBuf; DWORD i = FormatMessageA( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, null, errcode, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), cast(LPCSTR)&msgBuf, 0, null); string text = swigToDString(msgBuf); LocalFree(cast(HLOCAL)msgBuf); if (i >= 2) { i -= 2; } return text[0 .. i]; } } else { static assert(0, "Operating system not supported by the wrapper loading code."); } final class SwigSharedLib { void load(string[] names) { if (_hlib !is null) return; string[] failedLibs; string[] reasons; foreach(n; names) { _hlib = swigLoadSharedLib(n); if (_hlib is null) { failedLibs ~= n; reasons ~= swigGetErrorStr(); continue; } _name = n; break; } if (_hlib is null) { throw new SwigSwigSharedLibLoadException(failedLibs, reasons); } } void* loadSymbol(string symbolName, bool doThrow = true) { void* sym = swigGetSymbol(_hlib, symbolName); if(doThrow && (sym is null)) { throw new SwigSymbolLoadException(_name, symbolName); } return sym; } void unload() { if(_hlib !is null) { swigUnloadSharedLib(_hlib); _hlib = null; } } private: string _name; SwigSharedLibHandle _hlib; } } static this() { string[] possibleFileNames; version (Posix) { version (OSX) { possibleFileNames ~= ["lib$wraplibrary.dylib", "lib$wraplibrary.bundle"]; } possibleFileNames ~= ["lib$wraplibrary.so"]; } else version (Windows) { possibleFileNames ~= ["$wraplibrary.dll", "lib$wraplibrary.so"]; } else { static assert(false, "Operating system not supported by the wrapper loading code."); } auto library = new SwigSharedLib; library.load(possibleFileNames); string bindCode(string functionPointer, string symbol) { return functionPointer ~ " = cast(typeof(" ~ functionPointer ~ "))library.loadSymbol(`" ~ symbol ~ "`);"; } //#if !defined(SWIG_D_NO_EXCEPTION_HELPER) mixin(bindCode("swigRegisterExceptionCallbacks$module", "SWIGRegisterExceptionCallbacks_$module")); //#endif // SWIG_D_NO_EXCEPTION_HELPER //#if !defined(SWIG_D_NO_STRING_HELPER) mixin(bindCode("swigRegisterStringCallback$module", "SWIGRegisterStringCallback_$module")); //#endif // SWIG_D_NO_STRING_HELPER $wrapperloaderbindcode } //#if !defined(SWIG_D_NO_EXCEPTION_HELPER) extern(C) void function( SwigExceptionCallback exceptionCallback, SwigExceptionCallback illegalArgumentCallback, SwigExceptionCallback illegalElementCallback, SwigExceptionCallback ioCallback, SwigExceptionCallback noSuchElementCallback) swigRegisterExceptionCallbacks$module; //#endif // SWIG_D_NO_EXCEPTION_HELPER //#if !defined(SWIG_D_NO_STRING_HELPER) extern(C) void function(SwigStringCallback callback) swigRegisterStringCallback$module; //#endif // SWIG_D_NO_STRING_HELPER %} %pragma(d) wrapperloaderbindcommand = %{ mixin(bindCode("$function", "$symbol"));%} swig-4.0.1/Lib/d/carrays.i0000644000175000017500000000502313527063513015117 0ustar williamwilliam/* ----------------------------------------------------------------------------- * carrays.i * * D-specific version of ../carrays.i. * ----------------------------------------------------------------------------- */ /* ----------------------------------------------------------------------------- * %array_functions(TYPE,NAME) * * Generates functions for creating and accessing elements of a C array * (as pointers). Creates the following functions: * * TYPE *new_NAME(int nelements) * void delete_NAME(TYPE *); * TYPE NAME_getitem(TYPE *, int index); * void NAME_setitem(TYPE *, int index, TYPE value); * * ----------------------------------------------------------------------------- */ %define %array_functions(TYPE,NAME) %{ static TYPE *new_##NAME(int nelements) { %} #ifdef __cplusplus %{ return new TYPE[nelements](); %} #else %{ return (TYPE *) calloc(nelements,sizeof(TYPE)); %} #endif %{} static void delete_##NAME(TYPE *ary) { %} #ifdef __cplusplus %{ delete [] ary; %} #else %{ free(ary); %} #endif %{} static TYPE NAME##_getitem(TYPE *ary, int index) { return ary[index]; } static void NAME##_setitem(TYPE *ary, int index, TYPE value) { ary[index] = value; } %} TYPE *new_##NAME(int nelements); void delete_##NAME(TYPE *ary); TYPE NAME##_getitem(TYPE *ary, int index); void NAME##_setitem(TYPE *ary, int index, TYPE value); %enddef /* ----------------------------------------------------------------------------- * %array_class(TYPE,NAME) * * Generates a class wrapper around a C array. The class has the following * interface: * * struct NAME { * NAME(int nelements); * ~NAME(); * TYPE getitem(int index); * void setitem(int index, TYPE value); * TYPE * ptr(); * static NAME *frompointer(TYPE *t); * } * * ----------------------------------------------------------------------------- */ %define %array_class(TYPE,NAME) %{ typedef TYPE NAME; %} typedef struct {} NAME; %extend NAME { #ifdef __cplusplus NAME(int nelements) { return new TYPE[nelements](); } ~NAME() { delete [] self; } #else NAME(int nelements) { return (TYPE *) calloc(nelements,sizeof(TYPE)); } ~NAME() { free(self); } #endif TYPE getitem(int index) { return self[index]; } void setitem(int index, TYPE value) { self[index] = value; } TYPE * ptr() { return self; } static NAME *frompointer(TYPE *t) { return (NAME *) t; } }; %types(NAME = TYPE); %enddef swig-4.0.1/Lib/d/std_pair.i0000644000175000017500000000140513527063513015260 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_pair.i * * SWIG typemaps for std::pair * ----------------------------------------------------------------------------- */ %include %include // ------------------------------------------------------------------------ // std::pair // ------------------------------------------------------------------------ %{ #include %} namespace std { template struct pair { typedef T first_type; typedef U second_type; pair(); pair(T first, U second); pair(const pair& other); template pair(const pair &other); T first; U second; }; // add specializations here } swig-4.0.1/Lib/d/dhead.swg0000644000175000017500000002064013527063513015072 0ustar williamwilliam/* ----------------------------------------------------------------------------- * dhead.swg * * Support code for exceptions if the SWIG_D_NO_EXCEPTION_HELPER is not defined * Support code for strings if the SWIG_D_NO_STRING_HELPER is not defined * * Support code for function pointers. ----------------------------------------------------------------------------- */ %insert(runtime) %{ #include #include #include /* Contract support. */ #define SWIG_contract_assert(nullreturn, expr, msg) if (!(expr)) {SWIG_DSetPendingException(SWIG_DException, msg); return nullreturn; } else %} /* * Exception support code. */ #if !defined(SWIG_D_NO_EXCEPTION_HELPER) %insert(runtime) %{ // Support for throwing D exceptions from C/C++. typedef enum { SWIG_DException = 0, SWIG_DIllegalArgumentException, SWIG_DIllegalElementException, SWIG_DIOException, SWIG_DNoSuchElementException } SWIG_DExceptionCodes; typedef void (* SWIG_DExceptionCallback_t)(const char *); typedef struct { SWIG_DExceptionCodes code; SWIG_DExceptionCallback_t callback; } SWIG_DException_t; static SWIG_DException_t SWIG_d_exceptions[] = { { SWIG_DException, NULL }, { SWIG_DIllegalArgumentException, NULL }, { SWIG_DIllegalElementException, NULL }, { SWIG_DIOException, NULL }, { SWIG_DNoSuchElementException, NULL } }; static void SWIGUNUSED SWIG_DSetPendingException(SWIG_DExceptionCodes code, const char *msg) { if ((size_t)code < sizeof(SWIG_d_exceptions)/sizeof(SWIG_DException_t)) { SWIG_d_exceptions[code].callback(msg); } else { SWIG_d_exceptions[SWIG_DException].callback(msg); } } #ifdef __cplusplus extern "C" #endif SWIGEXPORT void SWIGRegisterExceptionCallbacks_$module( SWIG_DExceptionCallback_t exceptionCallback, SWIG_DExceptionCallback_t illegalArgumentCallback, SWIG_DExceptionCallback_t illegalElementCallback, SWIG_DExceptionCallback_t ioCallback, SWIG_DExceptionCallback_t noSuchElementCallback) { SWIG_d_exceptions[SWIG_DException].callback = exceptionCallback; SWIG_d_exceptions[SWIG_DIllegalArgumentException].callback = illegalArgumentCallback; SWIG_d_exceptions[SWIG_DIllegalElementException].callback = illegalElementCallback; SWIG_d_exceptions[SWIG_DIOException].callback = ioCallback; SWIG_d_exceptions[SWIG_DNoSuchElementException].callback = noSuchElementCallback; } %} #if (SWIG_D_VERSION == 1) %pragma(d) imdmoduleimports=%{ // Exception throwing support currently requires Tango, but there is no reason // why it could not support Phobos. static import tango.core.Exception; static import tango.core.Thread; static import tango.stdc.stringz; %} %pragma(d) imdmodulecode=%{ private class SwigExceptionHelper { static this() { swigRegisterExceptionCallbacks$module( &setException, &setIllegalArgumentException, &setIllegalElementException, &setIOException, &setNoSuchElementException); } static void setException(char* message) { auto exception = new object.Exception(tango.stdc.stringz.fromStringz(message).dup); SwigPendingException.set(exception); } static void setIllegalArgumentException(char* message) { auto exception = new tango.core.Exception.IllegalArgumentException(tango.stdc.stringz.fromStringz(message).dup); SwigPendingException.set(exception); } static void setIllegalElementException(char* message) { auto exception = new tango.core.Exception.IllegalElementException(tango.stdc.stringz.fromStringz(message).dup); SwigPendingException.set(exception); } static void setIOException(char* message) { auto exception = new tango.core.Exception.IOException(tango.stdc.stringz.fromStringz(message).dup); SwigPendingException.set(exception); } static void setNoSuchElementException(char* message) { auto exception = new tango.core.Exception.NoSuchElementException(tango.stdc.stringz.fromStringz(message).dup); SwigPendingException.set(exception); } } package class SwigPendingException { public: static this() { m_sPendingException = new ThreadLocalData(null); } static bool isPending() { return m_sPendingException.val !is null; } static void set(object.Exception e) { auto pending = m_sPendingException.val; if (pending !is null) { e.next = pending; throw new object.Exception("FATAL: An earlier pending exception from C/C++ " ~ "code was missed and thus not thrown (" ~ pending.classinfo.name ~ ": " ~ pending.msg ~ ")!", e); } m_sPendingException.val = e; } static object.Exception retrieve() { auto e = m_sPendingException.val; m_sPendingException.val = null; return e; } private: // The reference to the pending exception (if any) is stored thread-local. alias tango.core.Thread.ThreadLocal!(object.Exception) ThreadLocalData; static ThreadLocalData m_sPendingException; } alias void function(char* message) SwigExceptionCallback; %} #else %pragma(d) imdmoduleimports=%{ static import std.conv; %} %pragma(d) imdmodulecode=%{ private class SwigExceptionHelper { static this() { // The D1/Tango version maps C++ exceptions to multiple exception types. swigRegisterExceptionCallbacks$module( &setException, &setException, &setException, &setException, &setException ); } static void setException(const char* message) { auto exception = new object.Exception(std.conv.to!string(message)); SwigPendingException.set(exception); } } package struct SwigPendingException { public: static this() { m_sPendingException = null; } static bool isPending() { return m_sPendingException !is null; } static void set(object.Exception e) { if (m_sPendingException !is null) { e.next = m_sPendingException; throw new object.Exception("FATAL: An earlier pending exception from C/C++ code " ~ "was missed and thus not thrown (" ~ m_sPendingException.classinfo.name ~ ": " ~ m_sPendingException.msg ~ ")!", e); } m_sPendingException = e; } static object.Exception retrieve() { auto e = m_sPendingException; m_sPendingException = null; return e; } private: // The reference to the pending exception (if any) is stored thread-local. static object.Exception m_sPendingException; } alias void function(const char* message) SwigExceptionCallback; %} #endif // Callback registering function in wrapperloader.swg. #endif // SWIG_D_NO_EXCEPTION_HELPER /* * String support code. */ #if !defined(SWIG_D_NO_STRING_HELPER) %insert(runtime) %{ // Callback for returning strings to D without leaking memory. typedef char * (* SWIG_DStringHelperCallback)(const char *); static SWIG_DStringHelperCallback SWIG_d_string_callback = NULL; #ifdef __cplusplus extern "C" #endif SWIGEXPORT void SWIGRegisterStringCallback_$module(SWIG_DStringHelperCallback callback) { SWIG_d_string_callback = callback; } %} #if (SWIG_D_VERSION == 1) %pragma(d) imdmoduleimports = "static import tango.stdc.stringz;"; %pragma(d) imdmodulecode = %{ private class SwigStringHelper { static this() { swigRegisterStringCallback$module(&createString); } static char* createString(char* cString) { // We are effectively dup'ing the string here. return tango.stdc.stringz.toStringz(tango.stdc.stringz.fromStringz(cString)); } } alias char* function(char* cString) SwigStringCallback; %} #else %pragma(d) imdmoduleimports = %{ static import std.conv; static import std.string; %} %pragma(d) imdmodulecode = %{ private class SwigStringHelper { static this() { swigRegisterStringCallback$module(&createString); } static const(char)* createString(const(char*) cString) { // We are effectively dup'ing the string here. // TODO: Is this also correct for D2/Phobos? return std.string.toStringz(std.conv.to!string(cString)); } } alias const(char)* function(const(char*) cString) SwigStringCallback; %} #endif // Callback registering function in wrapperloader.swg. #endif // SWIG_D_NO_STRING_HELPER /* * Function pointer support code. */ #if (SWIG_D_VERSION == 1) %pragma(d) imdmodulecode = %{ template SwigExternC(T) { static if (is(typeof(*(T.init)) R == return)) { static if (is(typeof(*(T.init)) P == function)) { alias extern(C) R function(P) SwigExternC; } } } %} #else %pragma(d) imdmodulecode = %{ template SwigExternC(T) if (is(typeof(*(T.init)) P == function)) { static if (is(typeof(*(T.init)) R == return)) { static if (is(typeof(*(T.init)) P == function)) { alias extern(C) R function(P) SwigExternC; } } } %} #endif swig-4.0.1/Lib/d/stl.i0000644000175000017500000000044313527063513014256 0ustar williamwilliam/* ----------------------------------------------------------------------------- * stl.i * ----------------------------------------------------------------------------- */ %include %include %include %include %include swig-4.0.1/Lib/d/dvoid.swg0000644000175000017500000000105713527063513015133 0ustar williamwilliam/* ----------------------------------------------------------------------------- * dvoid.swg * * Typemaps for handling void function return types and empty parameter lists. * ----------------------------------------------------------------------------- */ %typemap(ctype) void "void" %typemap(imtype) void "void" %typemap(dtype, cprimitive="1") void "void" %typemap(out, null="") void "" %typemap(ddirectorin) void "$winput" %typemap(ddirectorout) void "$dcall" %typemap(directorin) void "" %typemap(dout, excode=SWIGEXCODE) void { $imcall;$excode } swig-4.0.1/Lib/d/dexception.swg0000644000175000017500000000222613527063513016167 0ustar williamwilliam/* ----------------------------------------------------------------------------- * dexception.swg * * Typemaps used for propagating C++ exceptions to D. * ----------------------------------------------------------------------------- */ // Code which is inserted into the dout typemaps and class constructors via // excode if exceptions can be thrown. %define SWIGEXCODE "\n if ($imdmodule.SwigPendingException.isPending) throw $imdmodule.SwigPendingException.retrieve();" %enddef %typemap(throws, canthrow=1) int, long, short, unsigned int, unsigned long, unsigned short %{ char error_msg[256]; sprintf(error_msg, "C++ $1_type exception thrown, value: %d", $1); SWIG_DSetPendingException(SWIG_DException, error_msg); return $null; %} %typemap(throws, canthrow=1) SWIGTYPE, SWIGTYPE &, SWIGTYPE *, SWIGTYPE [ANY], enum SWIGTYPE, const enum SWIGTYPE & %{ (void)$1; SWIG_DSetPendingException(SWIG_DException, "C++ $1_type exception thrown"); return $null; %} %typemap(throws, canthrow=1) char * %{ SWIG_DSetPendingException(SWIG_DException, $1); return $null; %} swig-4.0.1/Lib/d/d.swg0000644000175000017500000000250513527063513014250 0ustar williamwilliam/* ----------------------------------------------------------------------------- * d.swg * * Main library file for the D language module. See the D chapter in the SWIG * manual for explanation on the typemaps, pragmas, etc. used. * ----------------------------------------------------------------------------- */ // Typemaps for exception handling. %include // Typemaps for primitive types. %include // Typemaps for non-primitive types (C/C++ classes and structs). %include // Typemaps for enumeration types. %include // Typemaps for member function pointers. %include // Typemaps for wrapping pointers to/arrays of C chars as D strings. %include // Typemaps for handling void function return types and empty parameter lists. %include // Typemaps containing D code used when generating D proxy classes. %include // Mapping of C++ operator overloading methods to D. %include // Helper code string and exception handling. %include // Wrapper loader code for dynamically linking the C wrapper library from the D // wrapper module. %include // List of all reserved D keywords. %include // D-specific directives. %include swig-4.0.1/Lib/d/std_string.i0000644000175000017500000000604513527063513015640 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_string.i * * Typemaps for std::string and const std::string& * These are mapped to a D char[] and are passed around by value. * * To use non-const std::string references, use the following %apply. Note * that they are passed by value. * %apply const std::string & {std::string &}; * ----------------------------------------------------------------------------- */ %{ #include %} namespace std { %naturalvar string; class string; %define SWIGD_STD_STRING_TYPEMAPS(DW_STRING_TYPE, DP_STRING_TYPE, FROM_STRINGZ, TO_STRINGZ) // string %typemap(ctype) string, const string & "char *" %typemap(imtype) string, const string & #DW_STRING_TYPE %typemap(dtype) string, const string & #DP_STRING_TYPE %typemap(in, canthrow=1) string, const string & %{ if (!$input) { SWIG_DSetPendingException(SWIG_DIllegalArgumentException, "null string"); return $null; } $1.assign($input); %} %typemap(in, canthrow=1) const string & %{ if (!$input) { SWIG_DSetPendingException(SWIG_DIllegalArgumentException, "null string"); return $null; } $*1_ltype $1_str($input); $1 = &$1_str; %} %typemap(out) string %{ $result = SWIG_d_string_callback($1.c_str()); %} %typemap(out) const string & %{ $result = SWIG_d_string_callback($1->c_str()); %} %typemap(din) string, const string & "($dinput ? TO_STRINGZ($dinput) : null)" %typemap(dout, excode=SWIGEXCODE) string, const string & { DP_STRING_TYPE ret = FROM_STRINGZ($imcall);$excode return ret; } %typemap(directorin) string, const string & %{ $input = SWIG_d_string_callback($1.c_str()); %} %typemap(directorout, canthrow=1) string %{ if (!$input) { SWIG_DSetPendingException(SWIG_DIllegalArgumentException, "null string"); return $null; } $result.assign($input); %} %typemap(directorout, canthrow=1, warning=SWIGWARN_TYPEMAP_THREAD_UNSAFE_MSG) const string & %{ if (!$input) { SWIG_DSetPendingException(SWIG_DIllegalArgumentException, "null string"); return $null; } /* possible thread/reentrant code problem */ static $*1_ltype $1_str; $1_str = $input; $result = &$1_str; %} %typemap(ddirectorin) string, const string & "FROM_STRINGZ($winput)" %typemap(ddirectorout) string, const string & "TO_STRINGZ($dcall)" %typemap(throws, canthrow=1) string, const string & %{ SWIG_DSetPendingException(SWIG_DException, $1.c_str()); return $null; %} %typemap(typecheck) string, const string & = char *; %enddef // We need to have the \0-terminated string conversion functions available in // the D proxy modules. #if (SWIG_D_VERSION == 1) // Could be easily extended to support Phobos as well. SWIGD_STD_STRING_TYPEMAPS(char*, char[], tango.stdc.stringz.fromStringz, tango.stdc.stringz.toStringz) %pragma(d) globalproxyimports = "static import tango.stdc.stringz;"; #else SWIGD_STD_STRING_TYPEMAPS(const(char)*, string, std.conv.to!string, std.string.toStringz) %pragma(d) globalproxyimports = %{ static import std.conv; static import std.string; %} #endif #undef SWIGD_STD_STRING_TYPEMAPS } // namespace std swig-4.0.1/Lib/d/dprimitives.swg0000644000175000017500000001077513527063513016374 0ustar williamwilliam/* ----------------------------------------------------------------------------- * dprimitves.swg * * Typemaps for primitive types. * ----------------------------------------------------------------------------- */ // C long/ulong width depends on the target arch, use stdlib aliases for them. #if (SWIG_D_VERSION == 1) %pragma(d) imdmoduleimports = "static import tango.stdc.config;" %pragma(d) globalproxyimports = "static import tango.stdc.config;" #define SWIG_LONG_DTYPE tango.stdc.config.c_long #define SWIG_ULONG_DTYPE tango.stdc.config.c_ulong #else %pragma(d) imdmoduleimports = "static import core.stdc.config;" %pragma(d) globalproxyimports = "static import core.stdc.config;" #define SWIG_LONG_DTYPE core.stdc.config.c_long #define SWIG_ULONG_DTYPE core.stdc.config.c_ulong #endif /* * The SWIG_D_PRIMITIVE macro is used to define the typemaps for the primitive * types, because are more or less the same for all of them. The few special * cases are handled below. */ %define SWIG_D_PRIMITIVE(TYPE, DTYPE) %typemap(ctype) TYPE, const TYPE & "TYPE" %typemap(imtype) TYPE, const TYPE & "DTYPE" %typemap(dtype, cprimitive="1") TYPE, const TYPE & "DTYPE" %typemap(in) TYPE "$1 = ($1_ltype)$input;" %typemap(out) TYPE "$result = $1;" %typemap(directorin) TYPE "$input = $1;" %typemap(directorout) TYPE "$result = ($1_ltype)$input;" %typemap(ddirectorin) TYPE "$winput" %typemap(ddirectorout) TYPE "$dcall" %typemap(in) const TYPE & ($*1_ltype temp) %{ temp = ($*1_ltype)$input; $1 = &temp; %} %typemap(out) const TYPE & "$result = *$1;" %typemap(directorin) const TYPE & "$input = $1;" %typemap(directorout,warning=SWIGWARN_TYPEMAP_THREAD_UNSAFE_MSG) const TYPE & %{ static $*1_ltype temp; temp = ($*1_ltype)$input; $result = &temp; %} %typemap(ddirectorin) const TYPE & "$winput" %typemap(ddirectorout) const TYPE & "$dcall" %typemap(din) TYPE, const TYPE & "$dinput" %typemap(dout, excode=SWIGEXCODE) TYPE, const TYPE & { auto ret = $imcall;$excode return ret; } %enddef SWIG_D_PRIMITIVE(bool, bool) SWIG_D_PRIMITIVE(char, char) SWIG_D_PRIMITIVE(signed char, byte) SWIG_D_PRIMITIVE(unsigned char, ubyte) SWIG_D_PRIMITIVE(short, short) SWIG_D_PRIMITIVE(unsigned short, ushort) SWIG_D_PRIMITIVE(int, int) SWIG_D_PRIMITIVE(unsigned int, uint) SWIG_D_PRIMITIVE(long, SWIG_LONG_DTYPE) SWIG_D_PRIMITIVE(unsigned long, SWIG_ULONG_DTYPE) SWIG_D_PRIMITIVE(size_t, size_t) SWIG_D_PRIMITIVE(long long, long) SWIG_D_PRIMITIVE(unsigned long long, ulong) SWIG_D_PRIMITIVE(float, float) SWIG_D_PRIMITIVE(double, double) // The C++ boolean type needs some special casing since it is not part of the // C standard and is thus represented as unsigned int in the C wrapper layer. %typemap(ctype) bool, const bool & "unsigned int" %typemap(imtype) bool, const bool & "uint" %typemap(in) bool "$1 = $input ? true : false;" %typemap(in) const bool & ($*1_ltype temp) %{ temp = $input ? true : false; $1 = &temp; %} %typemap(directorout) bool "$result = $input ? true : false;" %typemap(directorout,warning=SWIGWARN_TYPEMAP_THREAD_UNSAFE_MSG) const bool & %{ static $*1_ltype temp; temp = $input ? true : false; $result = &temp; %} %typemap(ddirectorin) bool "($winput ? true : false)" %typemap(dout, excode=SWIGEXCODE) bool, const bool & { bool ret = $imcall ? true : false;$excode return ret; } // Judging from the history of the C# module, the explicit casts are needed for // certain versions of VC++. %typemap(out) unsigned long "$result = (unsigned long)$1;" %typemap(out) const unsigned long & "$result = (unsigned long)*$1;" /* * Typecheck typemaps. */ %typecheck(SWIG_TYPECHECK_BOOL) bool, const bool & "" %typecheck(SWIG_TYPECHECK_CHAR) char, const char & "" %typecheck(SWIG_TYPECHECK_INT8) signed char, const signed char & "" %typecheck(SWIG_TYPECHECK_UINT8) unsigned char, const unsigned char & "" %typecheck(SWIG_TYPECHECK_INT16) short, const short & "" %typecheck(SWIG_TYPECHECK_UINT16) unsigned short, const unsigned short & "" %typecheck(SWIG_TYPECHECK_INT32) int, long, const int &, const long & "" %typecheck(SWIG_TYPECHECK_UINT32) unsigned int, unsigned long, const unsigned int &, const unsigned long & "" %typecheck(SWIG_TYPECHECK_INT64) long long, const long long & "" %typecheck(SWIG_TYPECHECK_UINT64) unsigned long long, const unsigned long long & "" %typecheck(SWIG_TYPECHECK_FLOAT) float, const float & "" %typecheck(SWIG_TYPECHECK_DOUBLE) double, const double & "" swig-4.0.1/Lib/d/denums.swg0000644000175000017500000000362113527063513015320 0ustar williamwilliam/* ----------------------------------------------------------------------------- * denums.swg * * Typemaps for enumerations. * ----------------------------------------------------------------------------- */ /* * Typemaps for enumeration types. */ %typemap(ctype) enum SWIGTYPE "int" %typemap(imtype) enum SWIGTYPE "int" %typemap(dtype, cprimitive="1") enum SWIGTYPE "$dclassname" %typecheck(SWIG_TYPECHECK_POINTER) enum SWIGTYPE "" %typemap(in) enum SWIGTYPE %{ $1 = ($1_ltype)$input; %} %typemap(out) enum SWIGTYPE %{ $result = (int)$1; %} %typemap(directorout) enum SWIGTYPE %{ $result = ($1_ltype)$input; %} %typemap(directorin) enum SWIGTYPE "$input = (int)$1;" %typemap(ddirectorin) enum SWIGTYPE "cast($dclassname)$winput" %typemap(ddirectorout) enum SWIGTYPE "cast(int)$dcall" %typemap(din) enum SWIGTYPE "cast(int)$dinput" %typemap(dout, excode=SWIGEXCODE) enum SWIGTYPE { $dclassname ret = cast($dclassname)$imcall;$excode return ret; } /* * Typemaps for (const) references to enumeration types. */ %typemap(ctype) const enum SWIGTYPE & "int" %typemap(imtype) const enum SWIGTYPE & "int" %typemap(dtype) const enum SWIGTYPE & "$*dclassname" %typecheck(SWIG_TYPECHECK_POINTER) const enum SWIGTYPE & "" %typemap(in) const enum SWIGTYPE & ($*1_ltype temp) %{ temp = ($*1_ltype)$input; $1 = &temp; %} %typemap(out) const enum SWIGTYPE & %{ $result = (int)*$1; %} %typemap(directorin) const enum SWIGTYPE & "$input = (int)$1;" %typemap(directorout,warning=SWIGWARN_TYPEMAP_THREAD_UNSAFE_MSG) const enum SWIGTYPE & %{ static $*1_ltype temp = ($*1_ltype)$input; $result = &temp; %} %typemap(ddirectorin) const enum SWIGTYPE & "cast($*dclassname)$winput" %typemap(ddirectorout) const enum SWIGTYPE & "cast(int)$dcall" %typemap(din) const enum SWIGTYPE & "cast(int)$dinput" %typemap(dout, excode=SWIGEXCODE) const enum SWIGTYPE & { $*dclassname ret = cast($*dclassname)$imcall;$excode return ret; } swig-4.0.1/Lib/d/std_map.i0000644000175000017500000000342213527063513015103 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_map.i * * SWIG typemaps for std::map * ----------------------------------------------------------------------------- */ %include // ------------------------------------------------------------------------ // std::map // ------------------------------------------------------------------------ %{ #include #include #include %} namespace std { template > class map { public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef K key_type; typedef T mapped_type; typedef std::pair< const K, T > value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; map(); map(const map& other); unsigned int size() const; bool empty() const; void clear(); %extend { const T& get(const K& key) throw (std::out_of_range) { std::map< K, T, C >::iterator i = self->find(key); if (i != self->end()) return i->second; else throw std::out_of_range("key not found"); } void set(const K& key, const T& x) { (*self)[key] = x; } void del(const K& key) throw (std::out_of_range) { std::map< K, T, C >::iterator i = self->find(key); if (i != self->end()) self->erase(i); else throw std::out_of_range("key not found"); } bool has_key(const K& key) { std::map< K, T, C >::iterator i = self->find(key); return i != self->end(); } } }; } swig-4.0.1/Lib/d/boost_shared_ptr.i0000644000175000017500000002720013527063513017015 0ustar williamwilliam%include // Language specific macro implementing all the customisations for handling the smart pointer %define SWIG_SHARED_PTR_TYPEMAPS(CONST, TYPE...) // %naturalvar is as documented for member variables %naturalvar TYPE; %naturalvar SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >; // destructor mods %feature("unref") TYPE //"if (debug_shared) { cout << \"deleting use_count: \" << (*smartarg1).use_count() << \" [\" << (boost::get_deleter(*smartarg1) ? std::string(\"CANNOT BE DETERMINED SAFELY\") : ((*smartarg1).get() ? (*smartarg1)->getValue() : std::string(\"NULL PTR\"))) << \"]\" << endl << flush; }\n" "(void)arg1; delete smartarg1;" // Typemap customisations... // plain value %typemap(in, canthrow=1) CONST TYPE ($&1_type argp = 0) %{ argp = ((SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *)$input) ? ((SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *)$input)->get() : 0; if (!argp) { SWIG_DSetPendingException(SWIG_DIllegalArgumentException, "Attempt to dereference null $1_type"); return $null; } $1 = *argp; %} %typemap(out) CONST TYPE %{ $result = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(new $1_ltype(($1_ltype &)$1)); %} %typemap(directorin) CONST TYPE %{ $input = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > (new $1_ltype((const $1_ltype &)$1)); %} %typemap(directorout) CONST TYPE %{ if (!$input) { SWIG_DSetPendingException(SWIG_DIllegalArgumentException, "Attempt to dereference null $1_type"); return $null; } SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = (SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *)$input; $result = *smartarg->get(); %} // plain pointer %typemap(in, canthrow=1) CONST TYPE * (SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0) %{ smartarg = (SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *)$input; $1 = (TYPE *)(smartarg ? smartarg->get() : 0); %} %typemap(out, fragment="SWIG_null_deleter") CONST TYPE * %{ $result = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1 SWIG_NO_NULL_DELETER_$owner) : 0; %} %typemap(directorin) CONST TYPE * %{ $input = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1 SWIG_NO_NULL_DELETER_0) : 0; %} %typemap(directorout) CONST TYPE * %{ #error "typemaps for $1_type not available" %} // plain reference %typemap(in, canthrow=1) CONST TYPE & %{ $1 = ($1_ltype)(((SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *)$input) ? ((SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *)$input)->get() : 0); if (!$1) { SWIG_DSetPendingException(SWIG_DIllegalArgumentException, "$1_type reference is null"); return $null; } %} %typemap(out, fragment="SWIG_null_deleter") CONST TYPE & %{ $result = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1 SWIG_NO_NULL_DELETER_$owner); %} %typemap(directorin) CONST TYPE & %{ $input = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > (&$1 SWIG_NO_NULL_DELETER_0); %} %typemap(directorout) CONST TYPE & %{ #error "typemaps for $1_type not available" %} // plain pointer by reference %typemap(in) TYPE *CONST& ($*1_ltype temp = 0) %{ temp = (TYPE *)(((SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *)$input) ? ((SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *)$input)->get() : 0); $1 = &temp; %} %typemap(out, fragment="SWIG_null_deleter") TYPE *CONST& %{ $result = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(*$1 SWIG_NO_NULL_DELETER_$owner); %} %typemap(directorin) TYPE *CONST& %{ $input = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1 SWIG_NO_NULL_DELETER_0) : 0; %} %typemap(directorout) TYPE *CONST& %{ #error "typemaps for $1_type not available" %} // shared_ptr by value %typemap(in) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > %{ if ($input) $1 = *($&1_ltype)$input; %} %typemap(out) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > %{ $result = $1 ? new $1_ltype($1) : 0; %} %typemap(directorin) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > %{ $input = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1) : 0; %} %typemap(directorout) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > %{ if ($input) { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = (SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *)$input; $result = *smartarg; } %} // shared_ptr by reference %typemap(in, canthrow=1) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > & ($*1_ltype tempnull) %{ $1 = $input ? ($1_ltype)$input : &tempnull; %} %typemap(out) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > & %{ $result = *$1 ? new $*1_ltype(*$1) : 0; %} %typemap(directorin) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > & %{ $input = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1) : 0; %} %typemap(directorout) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > & %{ #error "typemaps for $1_type not available" %} // shared_ptr by pointer %typemap(in) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * ($*1_ltype tempnull) %{ $1 = $input ? ($1_ltype)$input : &tempnull; %} %typemap(out, fragment="SWIG_null_deleter") SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * %{ $result = ($1 && *$1) ? new $*1_ltype(*($1_ltype)$1) : 0; if ($owner) delete $1; %} %typemap(directorin) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * %{ $input = ($1 && *$1) ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(*$1) : 0; %} %typemap(directorout) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * %{ #error "typemaps for $1_type not available" %} // shared_ptr by pointer reference %typemap(in) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& (SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > tempnull, $*1_ltype temp = 0) %{ temp = $input ? *($1_ltype)&$input : &tempnull; $1 = &temp; %} %typemap(out) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& %{ *($1_ltype)&$result = (*$1 && **$1) ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(**$1) : 0; %} %typemap(directorin) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& %{ $input = ($1 && *$1) ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(*$1) : 0; %} %typemap(directorout) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& %{ #error "typemaps for $1_type not available" %} // various missing typemaps - If ever used (unlikely) ensure compilation error rather than runtime bug %typemap(in) CONST TYPE[], CONST TYPE[ANY], CONST TYPE (CLASS::*) %{ #error "typemaps for $1_type not available" %} %typemap(out) CONST TYPE[], CONST TYPE[ANY], CONST TYPE (CLASS::*) %{ #error "typemaps for $1_type not available" %} %typemap (ctype) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > &, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& "void *" %typemap (imtype) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > &, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& "void*" %typemap (dtype) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > &, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& "$typemap(dtype, TYPE)" %typemap(din) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > &, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& "$typemap(dtype, TYPE).swigGetCPtr($dinput)" %typemap(ddirectorout) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > "$typemap(dtype, TYPE).swigGetCPtr($dcall)" %typemap(ddirectorin) CONST TYPE, CONST TYPE *, CONST TYPE &, TYPE *CONST& "($winput is null) ? null : new $typemap(dtype, TYPE)($winput, true)" %typemap(ddirectorin) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > &, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& "($winput is null) ? null : new $typemap(dtype, TYPE)($winput, true)" %typemap(dout, excode=SWIGEXCODE) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > { void* cPtr = $imcall; auto ret = (cPtr is null) ? null : new $typemap(dtype, TYPE)(cPtr, true);$excode return ret; } %typemap(dout, excode=SWIGEXCODE) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > & { void* cPtr = $imcall; auto ret = (cPtr is null) ? null : new $typemap(dtype, TYPE)(cPtr, true);$excode return ret; } %typemap(dout, excode=SWIGEXCODE) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * { void* cPtr = $imcall; auto ret = (cPtr is null) ? null : new $typemap(dtype, TYPE)(cPtr, true);$excode return ret; } %typemap(dout, excode=SWIGEXCODE) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& { void* cPtr = $imcall; auto ret = (cPtr is null) ? null : new $typemap(dtype, TYPE)(cPtr, true);$excode return ret; } %typemap(dout, excode=SWIGEXCODE) CONST TYPE { auto ret = new $typemap(dtype, TYPE)($imcall, true);$excode return ret; } %typemap(dout, excode=SWIGEXCODE) CONST TYPE & { auto ret = new $typemap(dtype, TYPE)($imcall, true);$excode return ret; } %typemap(dout, excode=SWIGEXCODE) CONST TYPE * { void* cPtr = $imcall; auto ret = (cPtr is null) ? null : new $typemap(dtype, TYPE)(cPtr, true);$excode return ret; } %typemap(dout, excode=SWIGEXCODE) TYPE *CONST& { void* cPtr = $imcall; auto ret = (cPtr is null) ? null : new $typemap(dtype, TYPE)(cPtr, true);$excode return ret; } // Proxy classes (base classes, ie, not derived classes) %typemap(dbody) SWIGTYPE %{ private void* swigCPtr; private bool swigCMemOwn; public this(void* cObject, bool ownCObject) { swigCPtr = cObject; swigCMemOwn = ownCObject; } public static void* swigGetCPtr(typeof(this) obj) { return (obj is null) ? null : obj.swigCPtr; } %} // Derived proxy classes %typemap(dbody_derived) SWIGTYPE %{ private void* swigCPtr; private bool swigCMemOwn; public this(void* cObject, bool ownCObject) { super($imdmodule.$dclazznameSmartPtrUpcast(cObject), ownCObject); swigCPtr = cObject; swigCMemOwn = ownCObject; } public static void* swigGetCPtr(typeof(this) obj) { return (obj is null) ? null : obj.swigCPtr; } %} %typemap(ddispose, methodname="dispose", methodmodifiers="public") TYPE { synchronized(this) { if (swigCPtr !is null) { if (swigCMemOwn) { swigCMemOwn = false; $imcall; } swigCPtr = null; } } } %typemap(ddispose_derived, methodname="dispose", methodmodifiers="public") TYPE { synchronized(this) { if (swigCPtr !is null) { if (swigCMemOwn) { swigCMemOwn = false; $imcall; } swigCPtr = null; super.dispose(); } } } // Typecheck typemaps %typemap(typecheck, precedence=SWIG_TYPECHECK_POINTER, equivalent="TYPE *") TYPE CONST, TYPE CONST &, TYPE CONST *, TYPE *CONST&, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > &, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& "" %template() SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >; %enddef swig-4.0.1/Lib/swigerrors.swg0000644000175000017500000000076313527063513016014 0ustar williamwilliam/* Errors in SWIG */ #define SWIG_UnknownError -1 #define SWIG_IOError -2 #define SWIG_RuntimeError -3 #define SWIG_IndexError -4 #define SWIG_TypeError -5 #define SWIG_DivisionByZero -6 #define SWIG_OverflowError -7 #define SWIG_SyntaxError -8 #define SWIG_ValueError -9 #define SWIG_SystemError -10 #define SWIG_AttributeError -11 #define SWIG_MemoryError -12 #define SWIG_NullReferenceError -13 swig-4.0.1/Lib/octave/0000755000175000017500000000000013527063513014337 5ustar williamwilliamswig-4.0.1/Lib/octave/octcontainer.swg0000644000175000017500000003755113527063513017564 0ustar williamwilliam/* ----------------------------------------------------------------------------- * octcontainer.swg * * Octave cell <-> C++ container wrapper * * This wrapper, and its iterator, allows a general use (and reuse) of * the mapping between C++ and Octave, thanks to the C++ templates. * * Of course, it needs the C++ compiler to support templates, but * since we will use this wrapper with the STL containers, that should * be the case. * ----------------------------------------------------------------------------- */ %{ #include #include %} #if !defined(SWIG_NO_EXPORT_ITERATOR_METHODS) # if !defined(SWIG_EXPORT_ITERATOR_METHODS) # define SWIG_EXPORT_ITERATOR_METHODS SWIG_EXPORT_ITERATOR_METHODS # endif #endif %include // The Octave C++ Wrap %fragment(""); %include %fragment(SWIG_Traits_frag(octave_value),"header",fragment="StdTraits") { namespace swig { template <> struct traits { typedef value_category category; static const char* type_name() { return "octave_value"; } }; template <> struct traits_from { typedef octave_value value_type; static octave_value from(const value_type& val) { return val; } }; template <> struct traits_check { static bool check(const octave_value&) { return true; } }; template <> struct traits_asval { typedef octave_value value_type; static int asval(const octave_value& obj, value_type *val) { if (val) *val = obj; return SWIG_OK; } }; } } %fragment("OctSequence_Base","header",fragment="") { %#include namespace std { template <> struct less { bool operator()(const octave_value& v, const octave_value& w) const { octave_value res = do_binary_op(octave_value::op_le,v,w); return res.is_true(); } }; } namespace swig { inline size_t check_index(ptrdiff_t i, size_t size, bool insert = false) { if ( i < 0 ) { if ((size_t) (-i) <= size) return (size_t) (i + size); } else if ( (size_t) i < size ) { return (size_t) i; } else if (insert && ((size_t) i == size)) { return size; } throw std::out_of_range("index out of range"); } inline size_t slice_index(ptrdiff_t i, size_t size) { if ( i < 0 ) { if ((size_t) (-i) <= size) { return (size_t) (i + size); } else { throw std::out_of_range("index out of range"); } } else { return ( (size_t) i < size ) ? ((size_t) i) : size; } } template inline typename Sequence::iterator getpos(Sequence* self, Difference i) { typename Sequence::iterator pos = self->begin(); std::advance(pos, check_index(i,self->size())); return pos; } template inline typename Sequence::const_iterator cgetpos(const Sequence* self, Difference i) { typename Sequence::const_iterator pos = self->begin(); std::advance(pos, check_index(i,self->size())); return pos; } template inline Sequence* getslice(const Sequence* self, Difference i, Difference j) { typename Sequence::size_type size = self->size(); typename Sequence::size_type ii = swig::check_index(i, size); typename Sequence::size_type jj = swig::slice_index(j, size); if (jj > ii) { typename Sequence::const_iterator vb = self->begin(); typename Sequence::const_iterator ve = self->begin(); std::advance(vb,ii); std::advance(ve,jj); return new Sequence(vb, ve); } else { return new Sequence(); } } template inline void setslice(Sequence* self, Difference i, Difference j, const InputSeq& v) { typename Sequence::size_type size = self->size(); typename Sequence::size_type ii = swig::check_index(i, size, true); typename Sequence::size_type jj = swig::slice_index(j, size); if (jj < ii) jj = ii; size_t ssize = jj - ii; if (ssize <= v.size()) { typename Sequence::iterator sb = self->begin(); typename InputSeq::const_iterator vmid = v.begin(); std::advance(sb,ii); std::advance(vmid, jj - ii); self->insert(std::copy(v.begin(), vmid, sb), vmid, v.end()); } else { typename Sequence::iterator sb = self->begin(); typename Sequence::iterator se = self->begin(); std::advance(sb,ii); std::advance(se,jj); self->erase(sb,se); self->insert(sb, v.begin(), v.end()); } } template inline void delslice(Sequence* self, Difference i, Difference j) { typename Sequence::size_type size = self->size(); typename Sequence::size_type ii = swig::check_index(i, size, true); typename Sequence::size_type jj = swig::slice_index(j, size); if (jj > ii) { typename Sequence::iterator sb = self->begin(); typename Sequence::iterator se = self->begin(); std::advance(sb,ii); std::advance(se,jj); self->erase(sb,se); } } } } %fragment("OctSequence_Cont","header", fragment="StdTraits", fragment="OctSequence_Base", fragment="OctSwigIterator_T") { namespace swig { template struct OctSequence_Ref // * octave can't support these, because of how assignment works { OctSequence_Ref(const octave_value& seq, int index) : _seq(seq), _index(index) { } operator T () const { // swig::SwigVar_PyObject item = OctSequence_GetItem(_seq, _index); octave_value item; // * todo try { return swig::as(item); } catch (const std::exception& e) { char msg[1024]; sprintf(msg, "in sequence element %d ", _index); if (!Octave_Error_Occurred()) { %type_error(swig::type_name()); } SWIG_Octave_AddErrorMsg(msg); SWIG_Octave_AddErrorMsg(e.what()); throw; } } OctSequence_Ref& operator=(const T& v) { // OctSequence_SetItem(_seq, _index, swig::from(v)); // * todo return *this; } private: octave_value _seq; int _index; }; template struct OctSequence_ArrowProxy { OctSequence_ArrowProxy(const T& x): m_value(x) {} const T* operator->() const { return &m_value; } operator const T*() const { return &m_value; } T m_value; }; template struct OctSequence_InputIterator { typedef OctSequence_InputIterator self; typedef std::random_access_iterator_tag iterator_category; typedef Reference reference; typedef T value_type; typedef T* pointer; typedef int difference_type; OctSequence_InputIterator() { } OctSequence_InputIterator(const octave_value& seq, int index) : _seq(seq), _index(index) { } reference operator*() const { return reference(_seq, _index); } OctSequence_ArrowProxy operator->() const { return OctSequence_ArrowProxy(operator*()); } bool operator==(const self& ri) const { return (_index == ri._index); } bool operator!=(const self& ri) const { return !(operator==(ri)); } self& operator ++ () { ++_index; return *this; } self& operator -- () { --_index; return *this; } self& operator += (difference_type n) { _index += n; return *this; } self operator +(difference_type n) const { return self(_seq, _index + n); } self& operator -= (difference_type n) { _index -= n; return *this; } self operator -(difference_type n) const { return self(_seq, _index - n); } difference_type operator - (const self& ri) const { return _index - ri._index; } bool operator < (const self& ri) const { return _index < ri._index; } reference operator[](difference_type n) const { return reference(_seq, _index + n); } private: octave_value _seq; difference_type _index; }; template struct OctSequence_Cont { typedef OctSequence_Ref reference; typedef const OctSequence_Ref const_reference; typedef T value_type; typedef T* pointer; typedef int difference_type; typedef int size_type; typedef const pointer const_pointer; typedef OctSequence_InputIterator iterator; typedef OctSequence_InputIterator const_iterator; OctSequence_Cont(const octave_value& seq) : _seq(seq) { // * assert that we have map type etc. /* if (!OctSequence_Check(seq)) { throw std::invalid_argument("a sequence is expected"); } _seq = seq; Py_INCREF(_seq); */ } ~OctSequence_Cont() { } size_type size() const { // return static_cast(OctSequence_Size(_seq)); return 0; // * todo } bool empty() const { return size() == 0; } iterator begin() { return iterator(_seq, 0); } const_iterator begin() const { return const_iterator(_seq, 0); } iterator end() { return iterator(_seq, size()); } const_iterator end() const { return const_iterator(_seq, size()); } reference operator[](difference_type n) { return reference(_seq, n); } const_reference operator[](difference_type n) const { return const_reference(_seq, n); } bool check() const { int s = size(); for (int i = 0; i < s; ++i) { // swig::SwigVar_PyObject item = OctSequence_GetItem(_seq, i); octave_value item; // * todo if (!swig::check(item)) return false; } return true; } private: octave_value _seq; }; } } %define %swig_sequence_iterator(Sequence...) #if defined(SWIG_EXPORT_ITERATOR_METHODS) class iterator; class reverse_iterator; class const_iterator; class const_reverse_iterator; %typemap(out,noblock=1,fragment="OctSequence_Cont") iterator, reverse_iterator, const_iterator, const_reverse_iterator { $result = SWIG_NewPointerObj(swig::make_output_iterator(%static_cast($1,const $type &)), swig::OctSwigIterator::descriptor(),SWIG_POINTER_OWN); } %typemap(out,fragment="OctSequence_Cont") std::pair, std::pair { octave_value_list tmpc; tmpc.append(SWIG_NewPointerObj(swig::make_output_iterator(%static_cast($1,const $type &).first), swig::OctSwigIterator::descriptor(),SWIG_POINTER_OWN)); tmpc.append(SWIG_NewPointerObj(swig::make_output_iterator(%static_cast($1,const $type &).second), swig::OctSwigIterator::descriptor(),SWIG_POINTER_OWN)); $result = Cell(tmpc); } %fragment("SwigPyPairBoolOutputIterator","header",fragment=SWIG_From_frag(bool),fragment="OctSequence_Cont") {} %typemap(out,fragment="OctPairBoolOutputIterator") std::pair, std::pair { octave_value_list tmpc; tmpc.append(SWIG_NewPointerObj(swig::make_output_iterator(%static_cast($1,const $type &).first), swig::OctSwigIterator::descriptor(),SWIG_POINTER_OWN)); tmpc.append(SWIG_From(bool)(%static_cast($1,const $type &).second)); $result = Cell(tmpc); } %typemap(in,noblock=1,fragment="OctSequence_Cont") iterator(swig::OctSwigIterator *iter = 0, int res), reverse_iterator(swig::OctSwigIterator *iter = 0, int res), const_iterator(swig::OctSwigIterator *iter = 0, int res), const_reverse_iterator(swig::OctSwigIterator *iter = 0, int res) { res = SWIG_ConvertPtr($input, %as_voidptrptr(&iter), swig::OctSwigIterator::descriptor(), 0); if (!SWIG_IsOK(res) || !iter) { %argument_fail(SWIG_TypeError, "$type", $symname, $argnum); } else { swig::OctSwigIterator_T<$type > *iter_t = dynamic_cast *>(iter); if (iter_t) { $1 = iter_t->get_current(); } else { %argument_fail(SWIG_TypeError, "$type", $symname, $argnum); } } } %typecheck(%checkcode(ITERATOR),noblock=1,fragment="OctSequence_Cont") iterator, reverse_iterator, const_iterator, const_reverse_iterator { swig::OctSwigIterator *iter = 0; int res = SWIG_ConvertPtr($input, %as_voidptrptr(&iter), swig::OctSwigIterator::descriptor(), 0); $1 = (SWIG_IsOK(res) && iter && (dynamic_cast *>(iter) != 0)); } %fragment("OctSequence_Cont"); #endif //SWIG_EXPORT_ITERATOR_METHODS %enddef // The octave container methods %define %swig_container_methods(Container...) %enddef %define %swig_sequence_methods_common(Sequence...) %swig_sequence_iterator(%arg(Sequence)) %swig_container_methods(%arg(Sequence)) %fragment("OctSequence_Base"); %extend { value_type pop() throw (std::out_of_range) { if (self->size() == 0) throw std::out_of_range("pop from empty container"); Sequence::value_type x = self->back(); self->pop_back(); return x; } value_type __paren__(difference_type i) throw (std::out_of_range) { return *(swig::cgetpos(self, i)); } void __paren_asgn__(difference_type i, value_type x) throw (std::out_of_range) { *(swig::getpos(self,i)) = x; } void append(value_type x) { self->push_back(x); } } %enddef %define %swig_sequence_methods(Sequence...) %swig_sequence_methods_common(%arg(Sequence)) %enddef %define %swig_sequence_methods_val(Sequence...) %swig_sequence_methods_common(%arg(Sequence)) %enddef // // Common fragments // %fragment("StdSequenceTraits","header", fragment="StdTraits", fragment="OctSequence_Cont") { namespace swig { template inline void assign(const OctSeq& octseq, Seq* seq) { %#ifdef SWIG_STD_NOASSIGN_STL typedef typename OctSeq::value_type value_type; typename OctSeq::const_iterator it = octseq.begin(); for (;it != octseq.end(); ++it) { seq->insert(seq->end(),(value_type)(*it)); } %#else seq->assign(octseq.begin(), octseq.end()); %#endif } template struct traits_asptr_stdseq { typedef Seq sequence; typedef T value_type; static int asptr(const octave_value& obj, sequence **seq) { if (!obj.is_defined() || Swig::swig_value_deref(obj)) { sequence *p; swig_type_info *descriptor = swig::type_info(); if (descriptor && SWIG_IsOK(SWIG_ConvertPtr(obj, (void **)&p, descriptor, 0))) { if (seq) *seq = p; return SWIG_OLDOBJ; } %#if SWIG_OCTAVE_PREREQ(4,4,0) } else if (obj.iscell()) { %#else } else if (obj.is_cell()) { %#endif try { OctSequence_Cont octseq(obj); if (seq) { sequence *pseq = new sequence(); assign(octseq, pseq); *seq = pseq; return SWIG_NEWOBJ; } else { return octseq.check() ? SWIG_OK : SWIG_ERROR; } } catch (std::exception& e) { if (seq&&!error_state) error("swig type error: %s",e.what()); return SWIG_ERROR; } } return SWIG_ERROR; } }; template struct traits_from_stdseq { typedef Seq sequence; typedef T value_type; typedef typename Seq::size_type size_type; typedef typename sequence::const_iterator const_iterator; static octave_value from(const sequence& seq) { #ifdef SWIG_OCTAVE_EXTRA_NATIVE_CONTAINERS swig_type_info *desc = swig::type_info(); if (desc && desc->clientdata) { return SWIG_NewPointerObj(new sequence(seq), desc, SWIG_POINTER_OWN); } #endif size_type size = seq.size(); if (size <= (size_type)INT_MAX) { Cell c(size,1); int i = 0; for (const_iterator it = seq.begin(); it != seq.end(); ++it, ++i) { c(i) = swig::from(*it); } return c; } else { error("swig overflow error: sequence size not valid in octave"); return octave_value(); } return octave_value(); } }; } } swig-4.0.1/Lib/octave/std_complex.i0000644000175000017500000000114313527063513017031 0ustar williamwilliam/* * STD C++ complex typemaps */ %include %{ #include %} namespace std { %naturalvar complex; template class complex; %template() complex; %template() complex; } /* defining the complex as/from converters */ %swig_cplxdbl_convn(std::complex, std::complex, std::real, std::imag) %swig_cplxflt_convn(std::complex, std::complex, std::real, std::imag) /* defining the typemaps */ %typemaps_primitive(%checkcode(CPLXDBL), std::complex); %typemaps_primitive(%checkcode(CPLXFLT), std::complex); swig-4.0.1/Lib/octave/std_deque.i0000644000175000017500000000124613527063513016471 0ustar williamwilliam// Deques %fragment("StdDequeTraits","header",fragment="StdSequenceTraits") %{ namespace swig { template struct traits_asptr > { static int asptr(octave_value obj, std::deque **vec) { return traits_asptr_stdseq >::asptr(obj, vec); } }; template struct traits_from > { static octave_value from(const std::deque& vec) { return traits_from_stdseq >::from(vec); } }; } %} #define %swig_deque_methods(Type...) %swig_sequence_methods(Type) #define %swig_deque_methods_val(Type...) %swig_sequence_methods_val(Type); %include swig-4.0.1/Lib/octave/octstdcommon.swg0000644000175000017500000001351413527063513017576 0ustar williamwilliam%fragment("StdTraits","header",fragment="StdTraitsCommon") { namespace swig { // Traits that provides the from method template struct traits_from_ptr { static octave_value from(Type *val, int owner = 0) { return SWIG_NewPointerObj(val, type_info(), owner); } }; template struct traits_from { static octave_value from(const Type& val) { return traits_from_ptr::from(new Type(val), 1); } }; template struct traits_from { static octave_value from(Type* val) { return traits_from_ptr::from(val, 0); } }; template struct traits_from { static octave_value from(const Type* val) { return traits_from_ptr::from(const_cast(val), 0); } }; template inline octave_value from(const Type& val) { return traits_from::from(val); } template inline octave_value from_ptr(Type* val, int owner) { return traits_from_ptr::from(val, owner); } // Traits that provides the asval/as/check method template struct traits_asptr { static int asptr(const octave_value& obj, Type **val) { Type *p = 0; swig_type_info *descriptor = type_info(); int res = descriptor ? SWIG_ConvertPtr(obj, (void **)&p, descriptor, 0) : SWIG_ERROR; if (SWIG_IsOK(res)) { if (val) *val = p; } return res; } }; template inline int asptr(const octave_value& obj, Type **vptr) { return traits_asptr::asptr(obj, vptr); } template struct traits_asval { static int asval(const octave_value& obj, Type *val) { if (val) { Type *p = 0; int res = traits_asptr::asptr(obj, &p); if (!SWIG_IsOK(res)) return res; if (p) { typedef typename noconst_traits::noconst_type noconst_type; *(const_cast(val)) = *p; if (SWIG_IsNewObj(res)){ %delete(p); res = SWIG_DelNewMask(res); } return res; } else { return SWIG_ERROR; } } else { return traits_asptr::asptr(obj, (Type **)(0)); } } }; template struct traits_asval { static int asval(const octave_value& obj, Type **val) { if (val) { typedef typename noconst_traits::noconst_type noconst_type; noconst_type *p = 0; int res = traits_asptr::asptr(obj, &p); if (SWIG_IsOK(res)) { *(const_cast(val)) = p; } return res; } else { return traits_asptr::asptr(obj, (Type **)(0)); } } }; template inline int asval(const octave_value& obj, Type *val) { return traits_asval::asval(obj, val); } template struct traits_as { static Type as(const octave_value& obj) { Type v; int res = asval(obj, &v); if (!obj.is_defined() || !SWIG_IsOK(res)) { if (!Octave_Error_Occurred()) { %type_error(swig::type_name()); } throw std::invalid_argument("bad type"); } return v; } }; template struct traits_as { static Type as(const octave_value& obj) { Type *v = 0; int res = traits_asptr::asptr(obj, &v); if (SWIG_IsOK(res) && v) { if (SWIG_IsNewObj(res)) { Type r(*v); %delete(v); return r; } else { return *v; } } else { if (!Octave_Error_Occurred()) { %type_error(swig::type_name()); } throw std::invalid_argument("bad type"); } } }; template struct traits_as { static Type* as(const octave_value& obj) { Type *v = 0; int res = traits_asptr::asptr(obj, &v); if (SWIG_IsOK(res)) { return v; } else { if (!Octave_Error_Occurred()) { %type_error(swig::type_name()); } throw std::invalid_argument("bad type"); } } }; template inline Type as(const octave_value& obj) { return traits_as::category>::as(obj); } template struct traits_check { static bool check(const octave_value& obj) { int res = asval(obj, (Type *)(0)); return SWIG_IsOK(res) ? true : false; } }; template struct traits_check { static bool check(const octave_value& obj) { int res = asptr(obj, (Type **)(0)); return SWIG_IsOK(res) ? true : false; } }; template inline bool check(const octave_value& obj) { return traits_check::category>::check(obj); } } } %define %specialize_std_container(Type,Check,As,From) %{ namespace swig { template <> struct traits_asval { typedef Type value_type; static int asval(const octave_value& obj, value_type *val) { if (Check(obj)) { if (val) *val = As(obj); return SWIG_OK; } return SWIG_ERROR; } }; template <> struct traits_from { typedef Type value_type; static octave_value from(const value_type& val) { return From(val); } }; template <> struct traits_check { static int check(const octave_value& obj) { int res = Check(obj); return obj && res ? res : 0; } }; } %} %enddef #define specialize_std_vector(Type,Check,As,From) %specialize_std_container(%arg(Type),Check,As,From) #define specialize_std_list(Type,Check,As,From) %specialize_std_container(%arg(Type),Check,As,From) #define specialize_std_deque(Type,Check,As,From) %specialize_std_container(%arg(Type),Check,As,From) #define specialize_std_set(Type,Check,As,From) %specialize_std_container(%arg(Type),Check,As,From) #define specialize_std_multiset(Type,Check,As,From) %specialize_std_container(%arg(Type),Check,As,From) swig-4.0.1/Lib/octave/director.swg0000644000175000017500000000653513527063513016705 0ustar williamwilliam/* ----------------------------------------------------------------------------- * director.swg * * This file contains support for director classes so that Octave proxy * methods can be called from C++. * ----------------------------------------------------------------------------- */ # define SWIG_DIRECTOR_CAST(ARG) dynamic_cast(ARG) #include namespace Swig { class Director { octave_swig_type *self; bool swig_disowned; Director(const Director &x); Director &operator=(const Director &rhs); public: Director(void *vptr):self(0), swig_disowned(false) { set_rtdir(vptr, this); } ~Director() { swig_director_destroyed(self, this); if (swig_disowned) self->decref(); } void swig_set_self(octave_swig_type *new_self) { assert(!swig_disowned); self = new_self; } octave_swig_type *swig_get_self() const { return self; } void swig_disown() { if (swig_disowned) return; swig_disowned = true; self->incref(); } }; // Base class for director exceptions. class DirectorException : public std::exception { public: static void raise(const char *msg) { // ... todo throw DirectorException(); } static void raise(const octave_value &ov, const char *msg) { // ... todo raise(msg); } }; class DirectorTypeMismatchException : public DirectorException { public: static void raise(const char *msg) { // ... todo throw DirectorTypeMismatchException(); } static void raise(const octave_value &ov, const char *msg) { // ... todo raise(msg); } }; class DirectorPureVirtualException : public DirectorException { public: static void raise(const char *msg) { // ... todo throw DirectorPureVirtualException(); } static void raise(const octave_value &ov, const char *msg) { // ... todo raise(msg); } }; SWIGINTERN rtdir_map *get_rtdir_map() { static swig_module_info *module = 0; if (!module) module = SWIG_GetModule(0); if (!module) return 0; if (!module->clientdata) module->clientdata = new rtdir_map; return (rtdir_map *) module->clientdata; } SWIGINTERNINLINE void set_rtdir(void *vptr, Director *d) { rtdir_map *rm = get_rtdir_map(); if (rm) (*rm)[vptr] = d; } SWIGINTERNINLINE void erase_rtdir(void *vptr) { rtdir_map *rm = get_rtdir_map(); if (rm) (*rm).erase(vptr); } SWIGINTERNINLINE Director *get_rtdir(void *vptr) { rtdir_map *rm = get_rtdir_map(); if (!rm) return 0; rtdir_map::const_iterator pos = rm->find(vptr); Director *rtdir = (pos != rm->end())? pos->second : 0; return rtdir; } SWIGRUNTIME void swig_director_destroyed(octave_swig_type *self, Director *d) { self->director_destroyed(d); } SWIGRUNTIME octave_swig_type *swig_director_get_self(Director *d) { return d->swig_get_self(); } SWIGRUNTIME void swig_director_set_self(Director *d, octave_swig_type *self) { d->swig_set_self(self); } } SWIGRUNTIME void swig_acquire_ownership(void *vptr) { // assert(0); // ... todo } SWIGRUNTIME void swig_acquire_ownership_array(void *vptr) { // assert(0); // ... todo } SWIGRUNTIME void swig_acquire_ownership_obj(void *vptr, int own) { // assert(0); // ... todo } swig-4.0.1/Lib/octave/std_shared_ptr.i0000644000175000017500000000010413527063513017511 0ustar williamwilliam#define SWIG_SHARED_PTR_NAMESPACE std %include swig-4.0.1/Lib/octave/octopers.swg0000644000175000017500000000510113527063513016714 0ustar williamwilliam/* ------------------------------------------------------------ * Overloaded operator support * ------------------------------------------------------------ */ #ifdef __cplusplus // operators supported in Octave, and the methods they are routed to // __brace__ a{args} // __brace_asgn__ a{args} = rhs // __paren__ a(args) // __paren_asgn__ a(args) = rhs // __str__ generates string rep // __not__ !a // __uplus__ +a // __uminus__ -a // __transpose__ a.' // __hermitian__ a' // __incr__ a++ // __decr__ a-- // __add__ a + b // __sub__ a - b // __mul__ a * b // __div__ a / b // __pow__ a ^ b // __ldiv__ a \ b // __lt__ a < b // __le__ a <= b // __eq__ a == b // __ge__ a >= b // __gt__ a > b // __ne__ a != b // __el_mul__ a .* b // __el_div__ a ./ b // __el_pow__ a .^ b // __el_ldiv__ a .\ b // __el_and__ a & b // __el_or__ a | b // operators supported in C++, and the methods that route to them %rename(__add__) *::operator+; %rename(__add__) *::operator+(); %rename(__add__) *::operator+() const; %rename(__sub__) *::operator-; %rename(__uminus__) *::operator-(); %rename(__uminus__) *::operator-() const; %rename(__mul__) *::operator*; %rename(__div__) *::operator/; %rename(__mod__) *::operator%; %rename(__el_and__) *::operator&&; %rename(__el_or__) *::operator||; %rename(__xor__) *::operator^; %rename(__invert__) *::operator~; %rename(__lt__) *::operator<; %rename(__le__) *::operator<=; %rename(__gt__) *::operator>; %rename(__ge__) *::operator>=; %rename(__eq__) *::operator==; %rename(__ne__) *::operator!=; %rename(__not__) *::operator!; %rename(__incr__) *::operator++; %rename(__decr__) *::operator--; %rename(__paren__) *::operator(); %rename(__brace__) *::operator[]; // Ignored inplace operators %ignoreoperator(PLUSEQ) operator+=; %ignoreoperator(MINUSEQ) operator-=; %ignoreoperator(MULEQ) operator*=; %ignoreoperator(DIVEQ) operator/=; %ignoreoperator(MODEQ) operator%=; %ignoreoperator(LSHIFTEQ) operator<<=; %ignoreoperator(RSHIFTEQ) operator>>=; %ignoreoperator(ANDEQ) operator&=; %ignoreoperator(OREQ) operator|=; %ignoreoperator(XOREQ) operator^=; // Ignored operators %ignoreoperator(EQ) operator=; %ignoreoperator(ARROWSTAR) operator->*; %ignoreoperator(LSHIFT) operator<<; %ignoreoperator(RSHIFT) operator>>; #endif /* __cplusplus */ swig-4.0.1/Lib/octave/std_vector.i0000644000175000017500000000127413527063513016671 0ustar williamwilliam// Vectors %fragment("StdVectorTraits","header",fragment="StdSequenceTraits") %{ namespace swig { template struct traits_asptr > { static int asptr(const octave_value& obj, std::vector **vec) { return traits_asptr_stdseq >::asptr(obj, vec); } }; template struct traits_from > { static octave_value from(const std::vector& vec) { return traits_from_stdseq >::from(vec); } }; } %} #define %swig_vector_methods(Type...) %swig_sequence_methods(Type) #define %swig_vector_methods_val(Type...) %swig_sequence_methods_val(Type); %include swig-4.0.1/Lib/octave/octave.swg0000644000175000017500000000033613527063513016344 0ustar williamwilliam%include %include %include %include %include %include %define %docstring %feature("docstring") %enddef swig-4.0.1/Lib/octave/std_alloc.i0000644000175000017500000000003313527063513016451 0ustar williamwilliam%include swig-4.0.1/Lib/octave/octfragments.swg0000644000175000017500000000000113527063513017544 0ustar williamwilliam swig-4.0.1/Lib/octave/std_container.i0000644000175000017500000000007313527063513017345 0ustar williamwilliam%include %include swig-4.0.1/Lib/octave/std_carray.i0000644000175000017500000000000013527063513016632 0ustar williamwilliamswig-4.0.1/Lib/octave/std_wstring.i0000644000175000017500000000004313527063513017055 0ustar williamwilliam%include swig-4.0.1/Lib/octave/attribute.i0000644000175000017500000000004213527063513016510 0ustar williamwilliam%include swig-4.0.1/Lib/octave/cmalloc.i0000644000175000017500000000004013527063513016115 0ustar williamwilliam%include swig-4.0.1/Lib/octave/std_basic_string.i0000644000175000017500000000315513527063513020036 0ustar williamwilliam#if !defined(SWIG_STD_STRING) #define SWIG_STD_BASIC_STRING #define SWIG_STD_MODERN_STL %include #define %swig_basic_string(Type...) %swig_sequence_methods_val(Type) %fragment(SWIG_AsPtr_frag(std::basic_string),"header", fragment="SWIG_AsCharPtrAndSize") { SWIGINTERN int SWIG_AsPtr(std::basic_string)(octave_value obj, std::string **val) { if (obj.is_string()) { if (val) *val = new std::string(obj.string_value()); return SWIG_NEWOBJ; } return SWIG_ERROR; } } %fragment(SWIG_From_frag(std::basic_string),"header", fragment="SWIG_FromCharPtrAndSize") { SWIGINTERNINLINE octave_value SWIG_From(std::basic_string)(const std::string& s) { return SWIG_FromCharPtrAndSize(s.data(), s.size()); } } %ignore std::basic_string::operator +=; %include %typemaps_asptrfromn(%checkcode(STRING), std::basic_string); #endif #if !defined(SWIG_STD_WSTRING) %fragment(SWIG_AsPtr_frag(std::basic_string),"header", fragment="SWIG_AsWCharPtrAndSize") { SWIGINTERN int SWIG_AsPtr(std::basic_string)(octave_value obj, std::wstring **val) { if (obj.is_string()) { if (val) *val = new std::wstring(obj.string_value()); return SWIG_NEWOBJ; } return SWIG_ERROR; } } %fragment(SWIG_From_frag(std::basic_string),"header", fragment="SWIG_FromWCharPtrAndSize") { SWIGINTERNINLINE PyObject* SWIG_From(std::basic_string)(const std::wstring& s) { return SWIG_FromWCharPtrAndSize(s.data(), s.size()); } } %typemaps_asptrfromn(%checkcode(UNISTRING), std::basic_string); #endif swig-4.0.1/Lib/octave/octiterators.swg0000644000175000017500000002164113527063513017607 0ustar williamwilliam/* ----------------------------------------------------------------------------- * octiterators.swg * * Users can derive form the OctSwigIterator to implement their * own iterators. As an example (real one since we use it for STL/STD * containers), the template OctSwigIterator_T does the * implementation for generic C++ iterators. * ----------------------------------------------------------------------------- */ %include %fragment("OctSwigIterator","header",fragment="") { namespace swig { struct stop_iteration { }; struct OctSwigIterator { private: octave_value _seq; protected: OctSwigIterator(octave_value seq) : _seq(seq) { } public: virtual ~OctSwigIterator() {} virtual octave_value value() const = 0; virtual OctSwigIterator *incr(size_t n = 1) = 0; virtual OctSwigIterator *decr(size_t n = 1) { throw stop_iteration(); } virtual ptrdiff_t distance(const OctSwigIterator &x) const { throw std::invalid_argument("operation not supported"); } virtual bool equal (const OctSwigIterator &x) const { throw std::invalid_argument("operation not supported"); } virtual OctSwigIterator *copy() const = 0; octave_value next() { octave_value obj = value(); incr(); return obj; } octave_value previous() { decr(); return value(); } OctSwigIterator *advance(ptrdiff_t n) { return (n > 0) ? incr(n) : decr(-n); } bool operator == (const OctSwigIterator& x) const { return equal(x); } bool operator != (const OctSwigIterator& x) const { return ! operator==(x); } OctSwigIterator* operator ++ () { incr(); return this; } OctSwigIterator* operator -- () { decr(); return this; } OctSwigIterator* operator + (ptrdiff_t n) const { return copy()->advance(n); } OctSwigIterator* operator - (ptrdiff_t n) const { return copy()->advance(-n); } ptrdiff_t operator - (const OctSwigIterator& x) const { return x.distance(*this); } static swig_type_info* descriptor() { static int init = 0; static swig_type_info* desc = 0; if (!init) { desc = SWIG_TypeQuery("swig::OctSwigIterator *"); init = 1; } return desc; } }; } } %fragment("OctSwigIterator_T","header",fragment="",fragment="OctSwigIterator",fragment="StdTraits",fragment="StdIteratorTraits") { namespace swig { template class OctSwigIterator_T : public OctSwigIterator { public: typedef OutIterator out_iterator; typedef typename std::iterator_traits::value_type value_type; typedef OctSwigIterator_T self_type; OctSwigIterator_T(out_iterator curr, octave_value seq) : OctSwigIterator(seq), current(curr) { } const out_iterator& get_current() const { return current; } bool equal (const OctSwigIterator &iter) const { const self_type *iters = dynamic_cast(&iter); if (iters) { return (current == iters->get_current()); } else { throw std::invalid_argument("bad iterator type"); } } ptrdiff_t distance(const OctSwigIterator &iter) const { const self_type *iters = dynamic_cast(&iter); if (iters) { return std::distance(current, iters->get_current()); } else { throw std::invalid_argument("bad iterator type"); } } protected: out_iterator current; }; template struct from_oper { typedef const ValueType& argument_type; typedef octave_value result_type; result_type operator()(argument_type v) const { return swig::from(v); } }; template::value_type, typename FromOper = from_oper > class OctSwigIteratorOpen_T : public OctSwigIterator_T { public: FromOper from; typedef OutIterator out_iterator; typedef ValueType value_type; typedef OctSwigIterator_T base; typedef OctSwigIteratorOpen_T self_type; OctSwigIteratorOpen_T(out_iterator curr, octave_value seq) : OctSwigIterator_T(curr, seq) { } octave_value value() const { return from(static_cast(*(base::current))); } OctSwigIterator *copy() const { return new self_type(*this); } OctSwigIterator *incr(size_t n = 1) { while (n--) { ++base::current; } return this; } OctSwigIterator *decr(size_t n = 1) { while (n--) { --base::current; } return this; } }; template::value_type, typename FromOper = from_oper > class OctSwigIteratorClosed_T : public OctSwigIterator_T { public: FromOper from; typedef OutIterator out_iterator; typedef ValueType value_type; typedef OctSwigIterator_T base; typedef OctSwigIteratorClosed_T self_type; OctSwigIteratorClosed_T(out_iterator curr, out_iterator first, out_iterator last, octave_value seq) : OctSwigIterator_T(curr, seq), begin(first), end(last) { } octave_value value() const { if (base::current == end) { throw stop_iteration(); } else { return from(static_cast(*(base::current))); } } OctSwigIterator *copy() const { return new self_type(*this); } OctSwigIterator *incr(size_t n = 1) { while (n--) { if (base::current == end) { throw stop_iteration(); } else { ++base::current; } } return this; } OctSwigIterator *decr(size_t n = 1) { while (n--) { if (base::current == begin) { throw stop_iteration(); } else { --base::current; } } return this; } private: out_iterator begin; out_iterator end; }; template inline OctSwigIterator* make_output_iterator(const OutIter& current, const OutIter& begin,const OutIter& end, octave_value seq = octave_value()) { return new OctSwigIteratorClosed_T(current, begin, end, seq); } template inline OctSwigIterator* make_output_iterator(const OutIter& current, octave_value seq = octave_value()) { return new OctSwigIteratorOpen_T(current, seq); } } } %fragment("OctSwigIterator"); namespace swig { // Throw a StopIteration exception %ignore stop_iteration; struct stop_iteration {}; %typemap(throws) stop_iteration { error("stop_iteration exception"); SWIG_fail; } // Mark methods that return new objects %newobject OctSwigIterator::copy; %newobject OctSwigIterator::operator + (ptrdiff_t n) const; %newobject OctSwigIterator::operator - (ptrdiff_t n) const; %nodirector OctSwigIterator; %catches(swig::stop_iteration) OctSwigIterator::value() const; %catches(swig::stop_iteration) OctSwigIterator::incr(size_t n = 1); %catches(swig::stop_iteration) OctSwigIterator::decr(size_t n = 1); %catches(std::invalid_argument) OctSwigIterator::distance(const OctSwigIterator &x) const; %catches(std::invalid_argument) OctSwigIterator::equal (const OctSwigIterator &x) const; %catches(swig::stop_iteration) OctSwigIterator::next(); %catches(swig::stop_iteration) OctSwigIterator::previous(); %catches(swig::stop_iteration) OctSwigIterator::advance(ptrdiff_t n); %catches(swig::stop_iteration) OctSwigIterator::operator += (ptrdiff_t n); %catches(swig::stop_iteration) OctSwigIterator::operator -= (ptrdiff_t n); %catches(swig::stop_iteration) OctSwigIterator::operator + (ptrdiff_t n) const; %catches(swig::stop_iteration) OctSwigIterator::operator - (ptrdiff_t n) const; struct OctSwigIterator { protected: OctSwigIterator(octave_value seq); public: virtual ~OctSwigIterator(); virtual octave_value value() const = 0; virtual OctSwigIterator *incr(size_t n = 1) = 0; virtual OctSwigIterator *decr(size_t n = 1); virtual ptrdiff_t distance(const OctSwigIterator &x) const; virtual bool equal (const OctSwigIterator &x) const; virtual OctSwigIterator *copy() const = 0; octave_value next(); octave_value previous(); OctSwigIterator *advance(ptrdiff_t n); bool operator == (const OctSwigIterator& x) const; bool operator != (const OctSwigIterator& x) const; OctSwigIterator* operator ++ (); OctSwigIterator* operator -- (); OctSwigIterator* operator + (ptrdiff_t n) const; OctSwigIterator* operator - (ptrdiff_t n) const; ptrdiff_t operator - (const OctSwigIterator& x) const; }; } swig-4.0.1/Lib/octave/implicit.i0000644000175000017500000000043713527063513016327 0ustar williamwilliam%include %include #warning "This file provides the %implicit directive, which is an old and fragile" #warning "way to implement the C++ implicit conversion mechanism." #warning "Try using the more robust '%implicitconv Type;' directive instead." swig-4.0.1/Lib/octave/std_common.i0000644000175000017500000000443013527063513016654 0ustar williamwilliam%include %include // Generate the traits for a 'primitive' type, such as 'double', // for which the SWIG_AsVal and SWIG_From methods are already defined. %define %traits_ptypen(Type...) %fragment(SWIG_Traits_frag(Type),"header", fragment=SWIG_AsVal_frag(Type), fragment=SWIG_From_frag(Type), fragment="StdTraits") { namespace swig { template <> struct traits< Type > { typedef value_category category; static const char* type_name() { return #Type; } }; template <> struct traits_asval< Type > { typedef Type value_type; static int asval(octave_value obj, value_type *val) { return SWIG_AsVal(Type)(obj, val); } }; template <> struct traits_from< Type > { typedef Type value_type; static octave_value from(const value_type& val) { return SWIG_From(Type)(val); } }; } } %enddef /* Traits for enums. This is bit of a sneaky trick needed because a generic template specialization of enums is not possible (unless using template meta-programming which SWIG doesn't support because of the explicit instantiations required using %template). The STL containers define the 'front' method and the typemap below is used whenever the front method is wrapped returning an enum. This typemap simply picks up the standard enum typemap, but additionally drags in a fragment containing the traits_asval and traits_from required in the generated code for enums. */ %define %traits_enum(Type...) %fragment("SWIG_Traits_enum_"{Type},"header", fragment=SWIG_AsVal_frag(int), fragment=SWIG_From_frag(int), fragment="StdTraits") { namespace swig { template <> struct traits_asval< Type > { typedef Type value_type; static int asval(octave_value obj, value_type *val) { return SWIG_AsVal(int)(obj, (int *)val); } }; template <> struct traits_from< Type > { typedef Type value_type; static octave_value from(const value_type& val) { return SWIG_From(int)((int)val); } }; } } %typemap(out, fragment="SWIG_Traits_enum_"{Type}) const enum SWIGTYPE& front %{$typemap(out, const enum SWIGTYPE&)%} %enddef %include // // Generates the traits for all the known primitive // C++ types (int, double, ...) // %apply_cpptypes(%traits_ptypen); swig-4.0.1/Lib/octave/std_except.i0000644000175000017500000000004313527063513016650 0ustar williamwilliam%include swig-4.0.1/Lib/octave/octprimtypes.swg0000644000175000017500000001344713527063513017634 0ustar williamwilliam/* ------------------------------------------------------------ * Primitive Types * ------------------------------------------------------------ */ // boolean %fragment(SWIG_From_frag(bool),"header") { SWIGINTERNINLINE octave_value SWIG_From_dec(bool)(bool value) { return octave_value(value); } } %fragment(SWIG_AsVal_frag(bool),"header", fragment=SWIG_AsVal_frag(long)) { SWIGINTERN int SWIG_AsVal_dec(bool)(const octave_value& ov, bool *val) { %#if SWIG_OCTAVE_PREREQ(4,4,0) if (!ov.islogical()) %#else if (!ov.is_bool_type()) %#endif return SWIG_ERROR; if (val) *val = ov.bool_value(); return SWIG_OK; } } // long %fragment(SWIG_From_frag(long),"header") { SWIGINTERNINLINE octave_value SWIG_From_dec(long) (long value) { return octave_value(value); } } %fragment(SWIG_AsVal_frag(long),"header") { SWIGINTERN int SWIG_AsVal_dec(long)(const octave_value& ov, long* val) { if (!ov.is_scalar_type()) return SWIG_TypeError; if (ov.is_complex_scalar()) return SWIG_TypeError; if (ov.is_double_type()||ov.is_single_type()) { double v=ov.double_value(); if (v!=floor(v)) return SWIG_TypeError; } if (val) *val = ov.long_value(); return SWIG_OK; } } // unsigned long %fragment(SWIG_From_frag(unsigned long),"header") { SWIGINTERNINLINE octave_value SWIG_From_dec(unsigned long) (unsigned long value) { return octave_value(value); } } %fragment(SWIG_AsVal_frag(unsigned long),"header") { SWIGINTERN int SWIG_AsVal_dec(unsigned long)(const octave_value& ov, unsigned long* val) { if (!ov.is_scalar_type()) return SWIG_TypeError; if (ov.is_complex_scalar()) return SWIG_TypeError; if (ov.is_double_type()||ov.is_single_type()) { double v=ov.double_value(); if (v<0) return SWIG_OverflowError; if (v!=floor(v)) return SWIG_TypeError; } if (ov.is_int8_type()||ov.is_int16_type()|| ov.is_int32_type()) { long v=ov.long_value(); if (v<0) return SWIG_OverflowError; } if (ov.is_int64_type()) { long long v=ov.int64_scalar_value().value(); if (v<0) return SWIG_OverflowError; } if (val) *val = ov.ulong_value(); return SWIG_OK; } } // long long %fragment(SWIG_From_frag(long long),"header", fragment="SWIG_LongLongAvailable") { %#ifdef SWIG_LONG_LONG_AVAILABLE SWIGINTERNINLINE octave_value SWIG_From_dec(long long) (long long value) { return octave_int64(value); } %#endif } %fragment(SWIG_AsVal_frag(long long),"header", fragment="SWIG_LongLongAvailable") { %#ifdef SWIG_LONG_LONG_AVAILABLE SWIGINTERN int SWIG_AsVal_dec(long long)(const octave_value& ov, long long* val) { if (!ov.is_scalar_type()) return SWIG_TypeError; if (ov.is_complex_scalar()) return SWIG_TypeError; if (ov.is_double_type()||ov.is_single_type()) { double v=ov.double_value(); if (v!=floor(v)) return SWIG_TypeError; } if (val) { if (ov.is_int64_type()) *val = ov.int64_scalar_value().value(); else if (ov.is_uint64_type()) *val = ov.uint64_scalar_value().value(); else *val = ov.long_value(); } return SWIG_OK; } %#endif } %fragment(SWIG_From_frag(unsigned long long),"header", fragment="SWIG_LongLongAvailable") { %#ifdef SWIG_LONG_LONG_AVAILABLE SWIGINTERNINLINE octave_value SWIG_From_dec(unsigned long long) (unsigned long long value) { return octave_uint64(value); } %#endif } %fragment(SWIG_AsVal_frag(unsigned long long),"header", fragment="SWIG_LongLongAvailable") { %#ifdef SWIG_LONG_LONG_AVAILABLE SWIGINTERN int SWIG_AsVal_dec(unsigned long long)(const octave_value& ov, unsigned long long* val) { if (!ov.is_scalar_type()) return SWIG_TypeError; if (ov.is_complex_scalar()) return SWIG_TypeError; if (ov.is_double_type()||ov.is_single_type()) { double v=ov.double_value(); if (v<0) return SWIG_OverflowError; if (v!=floor(v)) return SWIG_TypeError; } if (ov.is_int8_type()||ov.is_int16_type()|| ov.is_int32_type()) { long v=ov.long_value(); if (v<0) return SWIG_OverflowError; } if (ov.is_int64_type()) { long long v=ov.int64_scalar_value().value(); if (v<0) return SWIG_OverflowError; } if (val) { if (ov.is_int64_type()) *val = ov.int64_scalar_value().value(); else if (ov.is_uint64_type()) *val = ov.uint64_scalar_value().value(); else *val = ov.long_value(); } return SWIG_OK; } %#endif } // double %fragment(SWIG_From_frag(double),"header") { SWIGINTERNINLINE octave_value SWIG_From_dec(double) (double value) { return octave_value(value); } } %fragment(SWIG_AsVal_frag(double),"header") { SWIGINTERN int SWIG_AsVal_dec(double)(const octave_value& ov, double* val) { if (!ov.is_scalar_type()) return SWIG_TypeError; if (ov.is_complex_scalar()) return SWIG_TypeError; if (val) *val = ov.double_value(); return SWIG_OK; } } // const char* (strings) %fragment("SWIG_AsCharPtrAndSize","header") { SWIGINTERN int SWIG_AsCharPtrAndSize(octave_value ov, char** cptr, size_t* psize, int *alloc) { if ( %#if SWIG_OCTAVE_PREREQ(4,4,0) ov.iscell() %#else ov.is_cell() %#endif && ov.rows() == 1 && ov.columns() == 1) ov = ov.cell_value()(0); if (!ov.is_string()) return SWIG_TypeError; std::string str=ov.string_value(); size_t len=str.size(); char* cstr=(char*)str.c_str(); if (alloc) { *cptr = %new_copy_array(cstr, len + 1, char); *alloc = SWIG_NEWOBJ; } else if (cptr) *cptr = cstr; if (psize) *psize = len + 1; return SWIG_OK; } } %fragment("SWIG_FromCharPtrAndSize","header",fragment="SWIG_pchar_descriptor") { SWIGINTERNINLINE octave_value SWIG_FromCharPtrAndSize(const char* carray, size_t size) { return std::string(carray,carray+size); } } swig-4.0.1/Lib/octave/typemaps.i0000644000175000017500000000004113527063513016346 0ustar williamwilliam%include swig-4.0.1/Lib/octave/octcomplex.swg0000644000175000017500000000450013527063513017235 0ustar williamwilliam/* Defines the As/From conversors for double/float complex, you need to provide complex Type, the Name you want to use in the conversors, the complex Constructor method, and the Real and Imag complex accesor methods. See the std_complex.i and ccomplex.i for concrete examples. */ /* the common from conversor */ %define %swig_fromcplx_conv(Type, OctConstructor, Real, Imag) %fragment(SWIG_From_frag(Type),"header") { SWIGINTERNINLINE octave_value SWIG_From(Type)(const Type& c) { return octave_value(OctConstructor(Real(c), Imag(c))); } } %enddef // the double case %define %swig_cplxdbl_conv(Type, Constructor, Real, Imag) %fragment(SWIG_AsVal_frag(Type),"header", fragment=SWIG_AsVal_frag(double)) { SWIGINTERN int SWIG_AsVal(Type) (const octave_value& ov, Type* val) { if (ov.is_complex_scalar()) { if (val) { Complex c(ov.complex_value()); *val=Constructor(c.real(),c.imag()); } return SWIG_OK; } else { double d; int res = SWIG_AddCast(SWIG_AsVal(double)(ov, &d)); if (SWIG_IsOK(res)) { if (val) *val = Constructor(d, 0.0); return res; } } return SWIG_TypeError; } } %swig_fromcplx_conv(Type, Complex, Real, Imag); %enddef // the float case %define %swig_cplxflt_conv(Type, Constructor, Real, Imag) %fragment(SWIG_AsVal_frag(Type),"header", fragment=SWIG_AsVal_frag(float)) { SWIGINTERN int SWIG_AsVal(Type) (const octave_value& ov, Type* val) { if (ov.is_complex_scalar()) { if (val) { Complex c(ov.complex_value()); double re = c.real(); double im = c.imag(); if ((-FLT_MAX <= re && re <= FLT_MAX) && (-FLT_MAX <= im && im <= FLT_MAX)) { if (val) *val = Constructor(%numeric_cast(re, float), %numeric_cast(im, float)); return SWIG_OK; } else return SWIG_OverflowError; } } else { float d; int res = SWIG_AddCast(SWIG_AsVal(float)(ov, &d)); if (SWIG_IsOK(res)) { if (val) *val = Constructor(d, 0.0); return res; } } return SWIG_TypeError; } } %swig_fromcplx_conv(Type, FloatComplex, Real, Imag); %enddef #define %swig_cplxflt_convn(Type, Constructor, Real, Imag) \ %swig_cplxflt_conv(Type, Constructor, Real, Imag) #define %swig_cplxdbl_convn(Type, Constructor, Real, Imag) \ %swig_cplxdbl_conv(Type, Constructor, Real, Imag) swig-4.0.1/Lib/octave/carrays.i0000644000175000017500000000020113527063513016146 0ustar williamwilliam%define %array_class(TYPE,NAME) %array_class_wrap(TYPE,NAME,__paren__,__paren_asgn__) %enddef %include swig-4.0.1/Lib/octave/std_pair.i0000644000175000017500000000666413527063513016332 0ustar williamwilliam// Pairs %include //#define SWIG_STD_PAIR_ASVAL %fragment("StdPairTraits","header",fragment="StdTraits") { namespace swig { #ifdef SWIG_STD_PAIR_ASVAL template struct traits_asval > { typedef std::pair value_type; static int get_pair(const octave_value& first, octave_value second, std::pair *val) { if (val) { T *pfirst = &(val->first); int res1 = swig::asval(first, pfirst); if (!SWIG_IsOK(res1)) return res1; U *psecond = &(val->second); int res2 = swig::asval(second, psecond); if (!SWIG_IsOK(res2)) return res2; return res1 > res2 ? res1 : res2; } else { T *pfirst = 0; int res1 = swig::asval(first, pfirst); if (!SWIG_IsOK(res1)) return res1; U *psecond = 0; int res2 = swig::asval((PyObject*)second, psecond); if (!SWIG_IsOK(res2)) return res2; return res1 > res2 ? res1 : res2; } } static int asval(const octave_value& obj, std::pair *val) { if ( %#if SWIG_OCTAVE_PREREQ(4,4,0) obj.iscell() %#else obj.is_cell() %#endif ) { Cell c=obj.cell_value(); if (c.numel()<2) { error("pair from Cell array requires at least two elements"); return SWIG_ERROR; } return get_pair(c(0),c(1),val); } else { value_type *p; swig_type_info *descriptor = swig::type_info(); int res = descriptor ? SWIG_ConvertPtr(obj, (void **)&p, descriptor, 0) : SWIG_ERROR; if (SWIG_IsOK(res) && val) *val = *p; return res; } return SWIG_ERROR; } }; #else template struct traits_asptr > { typedef std::pair value_type; static int get_pair(const octave_value& first, octave_value second, std::pair **val) { if (val) { value_type *vp = %new_instance(std::pair); T *pfirst = &(vp->first); int res1 = swig::asval(first, pfirst); if (!SWIG_IsOK(res1)) { %delete(vp); return res1; } U *psecond = &(vp->second); int res2 = swig::asval(second, psecond); if (!SWIG_IsOK(res2)) { %delete(vp); return res2; } *val = vp; return SWIG_AddNewMask(res1 > res2 ? res1 : res2); } else { T *pfirst = 0; int res1 = swig::asval(first, pfirst); if (!SWIG_IsOK(res1)) return res1; U *psecond = 0; int res2 = swig::asval(second, psecond); if (!SWIG_IsOK(res2)) return res2; return res1 > res2 ? res1 : res2; } return SWIG_ERROR; } static int asptr(const octave_value& obj, std::pair **val) { if ( %#if SWIG_OCTAVE_PREREQ(4,4,0) obj.iscell() %#else obj.is_cell() %#endif ) { Cell c=obj.cell_value(); if (c.numel()<2) { error("pair from Cell array requires at least two elements"); return SWIG_ERROR; } return get_pair(c(0),c(1),val); } else { value_type *p; swig_type_info *descriptor = swig::type_info(); int res = descriptor ? SWIG_ConvertPtr(obj, (void **)&p, descriptor, 0) : SWIG_ERROR; if (SWIG_IsOK(res) && val) *val = p; return res; } return SWIG_ERROR; } }; #endif template struct traits_from > { static octave_value from(const std::pair& val) { Cell c(1,2); c(0)=swig::from(val.first); c(1)=swig::from(val.second); return c; } }; } } %define %swig_pair_methods(pair...) %enddef %include swig-4.0.1/Lib/octave/std_char_traits.i0000644000175000017500000000004113527063513017661 0ustar williamwilliam%include swig-4.0.1/Lib/octave/octuserdir.swg0000644000175000017500000000342613527063513017251 0ustar williamwilliam/* ------------------------------------------------------------------------- * Special user directives * ------------------------------------------------------------------------- */ /* ------------------------------------------------------------------------- */ /* Implicit Conversion using the C++ constructor mechanism */ #define %implicitconv %feature("implicitconv") #define %noimplicitconv %feature("implicitconv", "0") #define %clearimplicitconv %feature("implicitconv", "") /* ------------------------------------------------------------------------- */ /* %extend_smart_pointer extend the smart pointer support. For example, if you have a smart pointer as: template class RCPtr { public: ... RCPtr(Type *p); Type * operator->() const; ... }; you use the %extend_smart_pointer directive as: %extend_smart_pointer(RCPtr); %template(RCPtr_A) RCPtr; then, if you have something like: RCPtr make_ptr(); int foo(A *); you can do the following: a = make_ptr(); b = foo(a); ie, swig will accept a RCPtr object where a 'A *' is expected. Also, when using vectors %extend_smart_pointer(RCPtr); %template(RCPtr_A) RCPtr; %template(vector_A) std::vector >; you can type a = A(); v = vector_A(2) v[0] = a ie, an 'A *' object is accepted, via implicit conversion, where a RCPtr object is expected. Additionally x = v[0] returns (and sets 'x' as) a copy of v[0], making reference counting possible and consistent. */ %define %extend_smart_pointer(Type...) %implicitconv Type; %apply const SWIGTYPE& SMARTPOINTER { const Type& }; %apply SWIGTYPE SMARTPOINTER { Type }; %enddef swig-4.0.1/Lib/octave/stl.i0000644000175000017500000000044313527063513015314 0ustar williamwilliam/* ----------------------------------------------------------------------------- * stl.i * ----------------------------------------------------------------------------- */ %include %include %include %include %include swig-4.0.1/Lib/octave/octrun.swg0000644000175000017500000014112213527063513016374 0ustar williamwilliam#if !SWIG_OCTAVE_PREREQ(3,2,0) #define SWIG_DEFUN(cname, wname, doc) DEFUNX_DLD(#cname, wname, FS ## cname, args, nargout, doc) #else #define SWIG_DEFUN(cname, wname, doc) DEFUNX_DLD(#cname, wname, G ## cname, args, nargout, doc) #endif SWIGRUNTIME bool SWIG_check_num_args(const char *func_name, int num_args, int max_args, int min_args, int varargs) { if (num_args > max_args && !varargs) error("function %s takes at most %i arguments", func_name, max_args); else if (num_args < min_args) error("function %s requires at least %i arguments", func_name, min_args); else return true; return false; } SWIGRUNTIME octave_value_list *SWIG_Octave_AppendOutput(octave_value_list *ovl, const octave_value &ov) { ovl->append(ov); return ovl; } SWIGRUNTIME octave_value SWIG_ErrorType(int code) { switch (code) { case SWIG_MemoryError: return "SWIG_MemoryError"; case SWIG_IOError: return "SWIG_IOError"; case SWIG_RuntimeError: return "SWIG_RuntimeError"; case SWIG_IndexError: return "SWIG_IndexError"; case SWIG_TypeError: return "SWIG_TypeError"; case SWIG_DivisionByZero: return "SWIG_DivisionByZero"; case SWIG_OverflowError: return "SWIG_OverflowError"; case SWIG_SyntaxError: return "SWIG_SyntaxError"; case SWIG_ValueError: return "SWIG_ValueError"; case SWIG_SystemError: return "SWIG_SystemError"; case SWIG_AttributeError: return "SWIG_AttributeError"; } return "SWIG unknown error"; } SWIGRUNTIME octave_value SWIG_Error(int code, const char *msg) { octave_value type(SWIG_ErrorType(code)); std::string r = msg; r += " (" + type.string_value() + ")"; error("%s", r.c_str()); return octave_value(r); } #define SWIG_fail goto fail #define SWIG_Octave_ConvertPtr(obj, pptr, type, flags) SWIG_Octave_ConvertPtrAndOwn(obj, pptr, type, flags, 0) #define SWIG_ConvertPtr(obj, pptr, type, flags) SWIG_Octave_ConvertPtr(obj, pptr, type, flags) #define SWIG_ConvertPtrAndOwn(obj,pptr,type,flags,own) SWIG_Octave_ConvertPtrAndOwn(obj, pptr, type, flags, own) #define SWIG_ConvertPtr(obj, pptr, type, flags) SWIG_Octave_ConvertPtr(obj, pptr, type, flags) #define SWIG_NewPointerObj(ptr, type, flags) SWIG_Octave_NewPointerObj(ptr, type, flags) #define swig_owntype int #define SWIG_ConvertPacked(obj, ptr, sz, ty) SWIG_Octave_ConvertPacked(obj, ptr, sz, ty) #define SWIG_NewPackedObj(ptr, sz, type) SWIG_Octave_NewPackedObj(ptr, sz, type) #define SWIG_ConvertFunctionPtr(obj, pptr, type) SWIG_ConvertPtr(obj, pptr, type, 0) #define SWIG_NewFunctionPtrObj(ptr, type) SWIG_NewPointerObj(ptr, type, 0) #define SWIG_ConvertMember(obj, ptr, sz, ty) SWIG_Octave_ConvertPacked(obj, ptr, sz, ty) #define SWIG_NewMemberObj(ptr, sz, type) SWIG_Octave_NewPackedObj(ptr, sz, type) #define SWIG_GetModule(clientdata) SWIG_Octave_GetModule(clientdata) #define SWIG_SetModule(clientdata, pointer) SWIG_Octave_SetModule(clientdata,pointer); #define SWIG_MODULE_CLIENTDATA_TYPE void* #define Octave_Error_Occurred() 0 #define SWIG_Octave_AddErrorMsg(msg) {;} SWIGRUNTIME swig_module_info *SWIG_Octave_GetModule(void *clientdata); SWIGRUNTIME void SWIG_Octave_SetModule(void *clientdata, swig_module_info *pointer); // For backward compatibility only #define SWIG_POINTER_EXCEPTION 0 #define SWIG_arg_fail(arg) 0 // Runtime API implementation #include #include #include typedef octave_value_list(*octave_func) (const octave_value_list &, int); class octave_swig_type; namespace Swig { #ifdef SWIG_DIRECTORS class Director; typedef std::map < void *, Director * > rtdir_map; SWIGINTERN rtdir_map* get_rtdir_map(); SWIGINTERNINLINE void set_rtdir(void *vptr, Director *d); SWIGINTERNINLINE void erase_rtdir(void *vptr); SWIGINTERNINLINE Director *get_rtdir(void *vptr); SWIGRUNTIME void swig_director_destroyed(octave_swig_type *self, Director *d); SWIGRUNTIME octave_swig_type *swig_director_get_self(Director *d); SWIGRUNTIME void swig_director_set_self(Director *d, octave_swig_type *self); #endif SWIGRUNTIME octave_base_value *swig_value_ref(octave_swig_type *ost); SWIGRUNTIME octave_swig_type *swig_value_deref(octave_value ov); SWIGRUNTIME octave_swig_type *swig_value_deref(const octave_base_value &ov); } #ifdef SWIG_DIRECTORS SWIGRUNTIME void swig_acquire_ownership(void *vptr); SWIGRUNTIME void swig_acquire_ownership_array(void *vptr); SWIGRUNTIME void swig_acquire_ownership_obj(void *vptr, int own); #endif struct swig_octave_member { const char *name; octave_func method; octave_func get_method; octave_func set_method; int flags; // 1 static, 2 global const char *doc; bool is_static() const { return flags &1; } bool is_global() const { return flags &2; } }; struct swig_octave_class { const char *name; swig_type_info **type; int director; octave_func constructor; const char *constructor_doc; octave_func destructor; const swig_octave_member *members; const char **base_names; const swig_type_info **base; }; #if SWIG_OCTAVE_PREREQ(4,4,0) // in Octave 4.4 behaviour of octave_builtin() appears to have changed and 'self' argument is no longer passed // to function (maybe because this is now a 'method'??) so need to create our own octave_function subclass #define SWIG_OCTAVE_BOUND_FUNC(func, args) octave_value(new octave_swig_bound_func(func, args)) class octave_swig_bound_func : public octave_function { public: octave_swig_bound_func(void) : octave_function(), method(0), first_args() { } octave_swig_bound_func(octave_function* _method, octave_value_list _first_args) : octave_function("", ""), method(_method), first_args(_first_args) { } octave_swig_bound_func(const octave_swig_bound_func& f) = delete; octave_swig_bound_func& operator= (const octave_swig_bound_func& f) = delete; ~octave_swig_bound_func(void) = default; bool is_function(void) const { return true; } octave_function* function_value(bool = false) { return this; } octave_value_list call(octave::tree_evaluator& tw, int nargout = 0, const octave_value_list& args = octave_value_list()) { octave_value_list all_args; all_args.append(first_args); all_args.append(args); return method->call(tw, nargout, all_args); } octave_value subsref(const std::string &ops, const std::list < octave_value_list > &idx) { octave_value_list ovl = subsref(ops, idx, 1); return ovl.length() ? ovl(0) : octave_value(); } octave_value_list subsref(const std::string &ops, const std::list < octave_value_list > &idx, int nargout) { assert(ops.size() > 0); assert(ops.size() == idx.size()); if (ops != "(") error("invalid function call"); octave::tree_evaluator& tw = octave::interpreter::the_interpreter()->get_evaluator(); return call(tw, nargout, *idx.begin()); } protected: octave_function* method; octave_value_list first_args; std::set dispatch_classes; private: DECLARE_OV_TYPEID_FUNCTIONS_AND_DATA }; DEFINE_OV_TYPEID_FUNCTIONS_AND_DATA(octave_swig_bound_func, "octave_swig_bound_func", "octave_swig_bound_func"); #else #define SWIG_OCTAVE_BOUND_FUNC(func, args) octave_value(func) #endif // octave_swig_type plays the role of both the shadow class and the class // representation within Octave, since there is no support for classes. // // These should really be decoupled, with the class support added to Octave // and the shadow class given by an m-file script. That would dramatically // reduce the runtime complexity, and be more in line w/ other modules. class octave_swig_type:public octave_base_value { struct cpp_ptr { void *ptr; bool destroyed; cpp_ptr(void *_ptr):ptr(_ptr), destroyed(false) { }}; typedef std::pair < const swig_type_info *, cpp_ptr > type_ptr_pair; mutable swig_module_info *module; const swig_type_info *construct_type; // type of special type object std::vector < type_ptr_pair > types; // our c++ base classes int own; // whether we call c++ destructors when we die typedef std::pair < const swig_octave_member *, octave_value > member_value_pair; typedef std::map < std::string, member_value_pair > member_map; member_map members; bool always_static; const swig_octave_member *find_member(const swig_type_info *type, const std::string &name) { if (!type->clientdata) return 0; swig_octave_class *c = (swig_octave_class *) type->clientdata; const swig_octave_member *m; for (m = c->members; m->name; ++m) if (m->name == name) return m; for (int j = 0; c->base_names[j]; ++j) { if (!c->base[j]) { if (!module) module = SWIG_GetModule(0); assert(module); c->base[j] = SWIG_MangledTypeQueryModule(module, module, c->base_names[j]); } if (!c->base[j]) return 0; if ((m = find_member(c->base[j], name))) return m; } return 0; } member_value_pair *find_member(const std::string &name, bool insert_if_not_found) { member_map::iterator it = members.find(name); if (it != members.end()) return &it->second; const swig_octave_member *m; for (unsigned int j = 0; j < types.size(); ++j) if ((m = find_member(types[j].first, name))) return &members.insert(std::make_pair(name, std::make_pair(m, octave_value()))).first->second; if (!insert_if_not_found) return 0; return &members[name]; } const swig_type_info *find_base(const std::string &name, const swig_type_info *base) { if (!base) { for (unsigned int j = 0; j < types.size(); ++j) { assert(types[j].first->clientdata); swig_octave_class *cj = (swig_octave_class *) types[j].first->clientdata; if (cj->name == name) return types[j].first; } return 0; } assert(base->clientdata); swig_octave_class *c = (swig_octave_class *) base->clientdata; for (int j = 0; c->base_names[j]; ++j) { if (!c->base[j]) { if (!module) module = SWIG_GetModule(0); assert(module); c->base[j] = SWIG_MangledTypeQueryModule(module, module, c->base_names[j]); } if (!c->base[j]) return 0; assert(c->base[j]->clientdata); swig_octave_class *cj = (swig_octave_class *) c->base[j]->clientdata; if (cj->name == name) return c->base[j]; } return 0; } void load_members(const swig_octave_class* c,member_map& out) const { for (const swig_octave_member *m = c->members; m->name; ++m) { if (out.find(m->name) == out.end()) out.insert(std::make_pair(m->name, std::make_pair(m, octave_value()))); } for (int j = 0; c->base_names[j]; ++j) { if (!c->base[j]) { if (!module) module = SWIG_GetModule(0); assert(module); c->base[j] = SWIG_MangledTypeQueryModule(module, module, c->base_names[j]); } if (!c->base[j]) continue; assert(c->base[j]->clientdata); const swig_octave_class *cj = (const swig_octave_class *) c->base[j]->clientdata; load_members(cj,out); } } void load_members(member_map& out) const { out=members; for (unsigned int j = 0; j < types.size(); ++j) if (types[j].first->clientdata) load_members((const swig_octave_class *) types[j].first->clientdata, out); } octave_value_list member_invoke(member_value_pair *m, const octave_value_list &args, int nargout) { if (m->second.is_defined()) return m->second.subsref("(", std::list < octave_value_list > (1, args), nargout); else if (m->first && m->first->method) return m->first->method(args, nargout); error("member not defined or not invocable"); return octave_value_list(); } bool dispatch_unary_op(const std::string &symbol, octave_value &ret) const { octave_swig_type *nc_this = const_cast < octave_swig_type *>(this); member_value_pair *m = nc_this->find_member(symbol, false); if (!m || m->first->is_static() || m->first->is_global()) return false; octave_value_list args; args.append(nc_this->as_value()); octave_value_list argout(nc_this->member_invoke(m, args, 1)); if (argout.length() < 1) return false; ret = argout(0); return true; } bool dispatch_binary_op(const std::string &symbol, const octave_base_value &rhs, octave_value &ret) const { octave_swig_type *nc_this = const_cast < octave_swig_type *>(this); member_value_pair *m = nc_this->find_member(symbol, false); if (!m || m->first->is_static() || m->first->is_global()) return false; octave_value_list args; args.append(nc_this->as_value()); args.append(make_value_hack(rhs)); octave_value_list argout(nc_this->member_invoke(m, args, 1)); if (argout.length() < 1) return false; ret = argout(0); return true; } bool dispatch_index_op(const std::string &symbol, const octave_value_list &rhs, octave_value_list &ret) const { octave_swig_type *nc_this = const_cast < octave_swig_type *>(this); member_value_pair *m = nc_this->find_member(symbol, false); if (!m || m->first->is_static() || m->first->is_global()) return false; octave_value_list args; args.append(nc_this->as_value()); args.append(rhs); octave_value_list argout(nc_this->member_invoke(m, args, 1)); if (argout.length() >= 1) ret = argout(0); return true; } octave_value_list member_deref(member_value_pair *m, const octave_value_list &args) { if (m->second.is_defined()) { if (m->second.is_function() || m->second.is_function_handle()) { return SWIG_OCTAVE_BOUND_FUNC(m->second.function_value(), args); } else { return m->second; } } else if (m->first) { if (m->first->get_method) return m->first->get_method(args, 1); else if (m->first->method) return SWIG_OCTAVE_BOUND_FUNC(new octave_builtin(m->first->method), args); } error("undefined member"); return octave_value_list(); } static octave_value make_value_hack(const octave_base_value &x) { ((octave_swig_type &) x).count++; return octave_value((octave_base_value *) &x); } octave_swig_type(const octave_swig_type &x); octave_swig_type &operator=(const octave_swig_type &rhs); public: octave_swig_type(void *_ptr = 0, const swig_type_info *_type = 0, int _own = 0, bool _always_static = false) : module(0), construct_type(_ptr ? 0 : _type), own(_own), always_static(_always_static) { if (_type || _ptr) types.push_back(std::make_pair(_type, _ptr)); #ifdef SWIG_DIRECTORS if (_ptr) { Swig::Director *d = Swig::get_rtdir(_ptr); if (d) Swig::swig_director_set_self(d, this); } #endif } ~octave_swig_type() { if (own) { ++count; for (unsigned int j = 0; j < types.size(); ++j) { if (!types[j].first || !types[j].first->clientdata) continue; swig_octave_class *c = (swig_octave_class *) types[j].first->clientdata; if (c->destructor && !types[j].second.destroyed && types[j].second.ptr) { c->destructor(as_value(), 0); } } } #ifdef SWIG_DIRECTORS for (unsigned int j = 0; j < types.size(); ++j) Swig::erase_rtdir(types[j].second.ptr); #endif } dim_vector dims(void) const { octave_value out; if (!dispatch_unary_op("__dims__", out)) return dim_vector(1,1); // Return value should be cell or matrix of integers #if SWIG_OCTAVE_PREREQ(4,4,0) if (out.iscell()) { #else if (out.is_cell()) { #endif const Cell & c=out.cell_value(); int ndim = c.rows(); if (ndim==1 && c.columns()!=1) ndim = c.columns(); dim_vector d; d.resize(ndim < 2 ? 2 : ndim); d(0) = d(1) = 1; // Fill in dim_vector for (int k=0;k a = out.int_vector_value(); if (error_state) return dim_vector(1,1); dim_vector d; d.resize(a.numel() < 2 ? 2 : a.numel()); d(0) = d(1) = 1; for (int k=0;kclientdata) return 0; swig_octave_class *c = (swig_octave_class *) types[0].first->clientdata; return c->constructor_doc; } std::string swig_type_name() const { // * need some way to manually name subclasses. // * eg optional first arg to subclass(), or named_subclass() std::string ret; for (unsigned int j = 0; j < types.size(); ++j) { if (j) ret += "_"; if (types[j].first->clientdata) { swig_octave_class *c = (swig_octave_class *) types[j].first->clientdata; ret += c->name; } else ret += types[j].first->name; } return ret; } void merge(octave_swig_type &rhs) { rhs.own = 0; for (unsigned int j = 0; j < rhs.types.size(); ++j) { assert(!rhs.types[j].second.destroyed); #ifdef SWIG_DIRECTORS Swig::Director *d = Swig::get_rtdir(rhs.types[j].second.ptr); if (d) Swig::swig_director_set_self(d, this); #endif } types.insert(types.end(), rhs.types.begin(), rhs.types.end()); members.insert(rhs.members.begin(), rhs.members.end()); #if SWIG_OCTAVE_PREREQ(4,4,0) assign(rhs.swig_type_name(), rhs.as_value()); #else rhs.types.clear(); rhs.members.clear(); #endif } typedef member_map::const_iterator swig_member_const_iterator; swig_member_const_iterator swig_members_begin() { return members.begin(); } swig_member_const_iterator swig_members_end() { return members.end(); } int cast(void **vptr, swig_type_info *type, int *_own, int flags) { int res = SWIG_ERROR; if (_own) *_own = own; if (flags &SWIG_POINTER_DISOWN) own = 0; if (!type && types.size()) { if(vptr) *vptr = types[0].second.ptr; return SWIG_OK; } for (unsigned int j = 0; j < types.size(); ++j) if (type == types[j].first) { if(vptr) *vptr = types[j].second.ptr; return SWIG_OK; } for (unsigned int j = 0; j < types.size(); ++j) { swig_cast_info *tc = SWIG_TypeCheck(types[j].first->name, type); if (!tc) continue; if(vptr) { int newmemory = 0; *vptr = SWIG_TypeCast(tc, types[j].second.ptr, &newmemory); if (newmemory == SWIG_CAST_NEW_MEMORY) { assert(_own); /* badly formed typemap which will lead to a memory leak - it must set and use own to delete *ptr */ if (_own) *_own = *_own | SWIG_CAST_NEW_MEMORY; } } res = SWIG_OK; break; } return res; } bool is_owned() const { return own; } #ifdef SWIG_DIRECTORS void director_destroyed(Swig::Director *d) { bool found = false; for (unsigned int j = 0; j < types.size(); ++j) { Swig::Director *dj = Swig::get_rtdir(types[j].second.ptr); if (dj == d) { types[j].second.destroyed = true; found = true; } } assert(found); } #endif void assign(const std::string &name, const octave_value &ov) { members[name] = std::make_pair((const swig_octave_member *) 0, ov); } void assign(const std::string &name, const swig_octave_member *m) { members[name] = std::make_pair(m, octave_value()); } octave_base_value *clone() const { // pass-by-value is probably not desired, and is harder; // requires calling copy constructors of contained types etc. assert(0); *(int *) 0 = 0; return 0; } octave_base_value *empty_clone() const { return new octave_swig_type(); } bool is_defined() const { return true; } virtual bool is_map() const { return true; } virtual octave_value subsref(const std::string &ops, const std::list < octave_value_list > &idx) { octave_value_list ovl = subsref(ops, idx, 1); return ovl.length()? ovl(0) : octave_value(); } virtual octave_value_list subsref(const std::string &ops, const std::list < octave_value_list > &idx, int nargout) { assert(ops.size() > 0); assert(ops.size() == idx.size()); std::list < octave_value_list >::const_iterator idx_it = idx.begin(); int skip = 0; octave_value_list sub_ovl; // constructor invocation if (ops[skip] == '(' && construct_type) { assert(construct_type->clientdata); swig_octave_class *c = (swig_octave_class *) construct_type->clientdata; if (!c->constructor) { error("cannot create instance"); return octave_value_list(); } octave_value_list args; if (c->director) args.append(Swig::swig_value_ref(new octave_swig_type(this, 0, 0))); args.append(*idx_it++); ++skip; sub_ovl = c->constructor(args, nargout); } // member dereference or invocation else if (ops[skip] == '.') { std::string subname; const swig_type_info *base = 0; // eg, a.base.base_cpp_mem for (;;) { octave_value_list subname_ovl(*idx_it++); ++skip; assert(subname_ovl.length() == 1 && subname_ovl(0).is_string()); subname = subname_ovl(0).string_value(); const swig_type_info *next_base = find_base(subname, base); if (!next_base || skip >= (int) ops.size() || ops[skip] != '.') break; base = next_base; } member_value_pair tmp, *m = &tmp; if (!base || !(m->first = find_member(base, subname))) m = find_member(subname, false); if (!m) { error("member not found"); return octave_value_list(); } octave_value_list args; if (!always_static && (!m->first || (!m->first->is_static() && !m->first->is_global()))) args.append(as_value()); if (skip < (int) ops.size() && ops[skip] == '(' && ((m->first && m->first->method) || m->second.is_function() || m->second.is_function_handle())) { args.append(*idx_it++); ++skip; sub_ovl = member_invoke(m, args, nargout); } else { sub_ovl = member_deref(m, args); } } // index operator else { if (ops[skip] == '(' || ops[skip] == '{') { const char *op_name = ops[skip] == '(' ? "__paren__" : "__brace__"; octave_value_list args; args.append(*idx_it++); ++skip; if (!dispatch_index_op(op_name, args, sub_ovl)) { error("error evaluating index operator"); return octave_value_list(); } } else { error("unsupported subsref"); return octave_value_list(); } } if (skip >= (int) ops.size()) return sub_ovl; if (sub_ovl.length() < 1) { error("bad subs ref"); return octave_value_list(); } return sub_ovl(0).next_subsref(nargout, ops, idx, skip); } octave_value subsasgn(const std::string &ops, const std::list < octave_value_list > &idx, const octave_value &rhs) { assert(ops.size() > 0); assert(ops.size() == idx.size()); std::list < octave_value_list >::const_iterator idx_it = idx.begin(); int skip = 0; if (ops.size() > 1) { std::list < octave_value_list >::const_iterator last = idx.end(); --last; std::list < octave_value_list > next_idx(idx.begin(), last); octave_value next_ov = subsref(ops.substr(0, ops.size() - 1), next_idx); next_ov.subsasgn(ops.substr(ops.size() - 1), std::list < octave_value_list > (1, *last), rhs); } else if (ops[skip] == '(' || ops[skip] == '{') { const char *op_name = ops[skip] == '(' ? "__paren_asgn__" : "__brace_asgn__"; member_value_pair *m = find_member(op_name, false); if (m) { octave_value_list args; args.append(as_value()); args.append(*idx_it); args.append(rhs); member_invoke(m, args, 1); } else error("%s member not found", op_name); } else if (ops[skip] == '.') { octave_value_list subname_ovl(*idx_it++); ++skip; assert(subname_ovl.length() == 1 &&subname_ovl(0).is_string()); std::string subname = subname_ovl(0).string_value(); member_value_pair *m = find_member(subname, true); if (!m->first || !m->first->set_method) { m->first = 0; m->second = rhs; } else if (m->first->set_method) { octave_value_list args; if (!m->first->is_static() && !m->first->is_global()) args.append(as_value()); args.append(rhs); m->first->set_method(args, 1); } else error("member not assignable"); } else error("unsupported subsasgn"); return as_value(); } virtual bool is_object() const { return true; } virtual bool is_string() const { octave_swig_type *nc_this = const_cast < octave_swig_type *>(this); return !!nc_this->find_member("__str__", false); } virtual std::string string_value(bool force = false) const { octave_value ret; if (!dispatch_unary_op("__str__", ret)) { error("__str__ method not defined"); return std::string(); } if (!ret.is_string()) { error("__str__ method did not return a string"); return std::string(); } return ret.string_value(); } virtual double scalar_value(bool frc_str_conv = false) const { octave_value ret; if (!dispatch_unary_op("__float__", ret)) { error("__float__ method not defined"); } return ret.scalar_value(); } #if SWIG_OCTAVE_PREREQ(4,2,0) virtual octave_value as_double(void) const { octave_value ret; if (!dispatch_unary_op("__float__", ret)) { error("__float__ method not defined"); } return ret.as_double(); } virtual octave_value as_single(void) const { octave_value ret; if (!dispatch_unary_op("__float__", ret)) { error("__float__ method not defined"); } return ret.as_single(); } #endif #if SWIG_OCTAVE_PREREQ(3,8,0) virtual octave_value map(octave_base_value::unary_mapper_t umap) const { const std::string opname = std::string("__") + octave_base_value::get_umap_name(umap) + std::string("__"); octave_value ret; if (!dispatch_unary_op(opname, ret)) { error("%s", (opname + std::string(" method not found")).c_str()); return octave_value(); } return ret; } #endif #if SWIG_OCTAVE_PREREQ(3,3,52) virtual octave_map map_value() const { return octave_map(); } #else virtual Octave_map map_value() const { return Octave_map(); } #endif virtual string_vector map_keys() const { member_map tmp; load_members(tmp); string_vector keys(tmp.size()); int k = 0; for (member_map::iterator it = tmp.begin(); it != tmp.end(); ++it) keys(k++) = it->first; return keys; } virtual bool save_ascii (std::ostream& os) { return true; } virtual bool load_ascii (std::istream& is) { return true; } virtual bool save_binary (std::ostream& os, bool& save_as_floats) { return true; } virtual bool load_binary (std::istream& is, bool swap, oct_mach_info::float_format fmt) { return true; } #if defined (HAVE_HDF5) # if SWIG_OCTAVE_PREREQ(4,0,0) virtual bool save_hdf5 (octave_hdf5_id loc_id, const char *name, bool save_as_floats) { return true; } virtual bool load_hdf5 (octave_hdf5_id loc_id, const char *name, bool have_h5giterate_bug) { return true; } # else virtual bool save_hdf5 (hid_t loc_id, const char *name, bool save_as_floats) { return true; } virtual bool load_hdf5 (hid_t loc_id, const char *name, bool have_h5giterate_bug) { return true; } # endif #endif virtual octave_value convert_to_str(bool pad = false, bool force = false, char type = '"') const { return string_value(); } virtual octave_value convert_to_str_internal(bool pad, bool force, char type) const { return string_value(); } static bool dispatch_global_op(const std::string &symbol, const octave_value_list &args, octave_value &ret) { // we assume that SWIG_op_prefix-prefixed functions are installed in global namespace // (rather than any module namespace). octave_function *fcn = is_valid_function(symbol, std::string(), false); if (!fcn) return false; #if SWIG_OCTAVE_PREREQ(4,4,0) octave::tree_evaluator& tw = octave::interpreter::the_interpreter()->get_evaluator(); octave_value_list retval = fcn->call(tw, 1, args); if (retval.length() == 1) ret = retval(0); #else ret = fcn->do_multi_index_op(1, args)(0); #endif return true; } static octave_value dispatch_unary_op(const octave_base_value &x, const char *op_name) { octave_swig_type *ost = Swig::swig_value_deref(x); assert(ost); octave_value ret; if (ost->dispatch_unary_op(std::string("__") + op_name + std::string("__"), ret)) return ret; std::string symbol = SWIG_op_prefix + ost->swig_type_name() + "_" + op_name; octave_value_list args; args.append(make_value_hack(x)); if (dispatch_global_op(symbol, args, ret)) return ret; error("could not dispatch unary operator"); return octave_value(); } static octave_value dispatch_binary_op(const octave_base_value &lhs, const octave_base_value &rhs, const char *op_name) { octave_swig_type *lhs_ost = Swig::swig_value_deref(lhs); octave_swig_type *rhs_ost = Swig::swig_value_deref(rhs); octave_value ret; if (lhs_ost && lhs_ost->dispatch_binary_op(std::string("__") + op_name + std::string("__"), rhs, ret)) return ret; if (rhs_ost) { if (strlen(op_name) == 2 && (op_name[1] == 't' || op_name[1] == 'e')) { if (op_name[0] == 'l' && rhs_ost->dispatch_binary_op(std::string("__g") + op_name[1] + std::string("__"), lhs, ret)) return ret; if (op_name[0] == 'g' && rhs_ost->dispatch_binary_op(std::string("__l") + op_name[1] + std::string("__"), lhs, ret)) return ret; } if (rhs_ost->dispatch_binary_op(std::string("__r") + op_name + std::string("__"), lhs, ret)) return ret; } std::string symbol; octave_value_list args; args.append(make_value_hack(lhs)); args.append(make_value_hack(rhs)); symbol = SWIG_op_prefix; symbol += lhs_ost ? lhs_ost->swig_type_name() : lhs.type_name(); symbol += "_"; symbol += op_name; symbol += "_"; symbol += rhs_ost ? rhs_ost->swig_type_name() : rhs.type_name(); if (dispatch_global_op(symbol, args, ret)) return ret; symbol = SWIG_op_prefix; symbol += lhs_ost ? lhs_ost->swig_type_name() : lhs.type_name(); symbol += "_"; symbol += op_name; symbol += "_"; symbol += "any"; if (dispatch_global_op(symbol, args, ret)) return ret; symbol = SWIG_op_prefix; symbol += "any"; symbol += "_"; symbol += op_name; symbol += "_"; symbol += rhs_ost ? rhs_ost->swig_type_name() : rhs.type_name(); if (dispatch_global_op(symbol, args, ret)) return ret; error("could not dispatch binary operator"); return octave_value(); } #if SWIG_OCTAVE_PREREQ(4,0,0) void print(std::ostream &os, bool pr_as_read_syntax = false) #else void print(std::ostream &os, bool pr_as_read_syntax = false) const #endif { if (is_string()) { os << string_value(); return; } member_map tmp; load_members(tmp); indent(os); os << "{"; newline(os); increment_indent_level(); for (unsigned int j = 0; j < types.size(); ++j) { indent(os); if (types[j].first->clientdata) { const swig_octave_class *c = (const swig_octave_class *) types[j].first->clientdata; os << c->name << ", ptr = " << types[j].second.ptr; newline(os); } else { os << types[j].first->name << ", ptr = " << types[j].second.ptr; newline(os); } } for (member_map::const_iterator it = tmp.begin(); it != tmp.end(); ++it) { indent(os); if (it->second.first) { const char *objtype = it->second.first->method ? "method" : "variable"; const char *modifier = (it->second.first->flags &1) ? "static " : (it->second.first->flags &2) ? "global " : ""; os << it->second.first->name << " (" << modifier << objtype << ")"; newline(os); assert(it->second.first->name == it->first); } else { os << it->first; newline(os); } } decrement_indent_level(); indent(os); os << "}"; newline(os); } }; // Octave tries hard to preserve pass-by-value semantics. Eg, assignments // will call clone() via make_unique() if there is more than one outstanding // reference to the lhs, and forces the clone's reference count to 1 // (so you can't just increment your own count and return this). // // One way to fix this (without modifying Octave) is to add a level of // indirection such that clone copies ref-counted pointer and we keep // pass-by-ref semantics (which are more natural/expected for C++ bindings). // // Supporting both pass-by-{ref,value} and toggling via %feature/option // might be nice. class octave_swig_ref:public octave_base_value { octave_swig_type *ptr; public: octave_swig_ref(octave_swig_type *_ptr = 0) :ptr(_ptr) { } ~octave_swig_ref() { if (ptr) ptr->decref(); } octave_swig_type *get_ptr() const { return ptr; } octave_base_value *clone() const { if (ptr) ptr->incref(); return new octave_swig_ref(ptr); } octave_base_value *empty_clone() const { return new octave_swig_ref(0); } dim_vector dims(void) const { return ptr->dims(); } bool is_defined() const { return ptr->is_defined(); } virtual bool is_map() const { return ptr->is_map(); } virtual octave_value subsref(const std::string &ops, const std::list < octave_value_list > &idx) { return ptr->subsref(ops, idx); } virtual octave_value_list subsref(const std::string &ops, const std::list < octave_value_list > &idx, int nargout) { return ptr->subsref(ops, idx, nargout); } octave_value subsasgn(const std::string &ops, const std::list < octave_value_list > &idx, const octave_value &rhs) { return ptr->subsasgn(ops, idx, rhs); } virtual bool is_object() const { return ptr->is_object(); } virtual bool is_string() const { return ptr->is_string(); } virtual std::string string_value(bool force = false) const { return ptr->string_value(force); } virtual double scalar_value(bool frc_str_conv = false) const { return ptr->scalar_value(frc_str_conv); } #if SWIG_OCTAVE_PREREQ(4,2,0) virtual octave_value as_double(void) const { return ptr->as_double(); } virtual octave_value as_single(void) const { return ptr->as_single(); } #endif #if SWIG_OCTAVE_PREREQ(3,8,0) virtual octave_value map(octave_base_value::unary_mapper_t umap) const { return ptr->map(umap); } #endif #if SWIG_OCTAVE_PREREQ(3,3,52) virtual octave_map map_value() const { return ptr->map_value(); } #else virtual Octave_map map_value() const { return ptr->map_value(); } #endif virtual string_vector map_keys() const { return ptr->map_keys(); } virtual bool save_ascii (std::ostream& os) { return ptr->save_ascii(os); } virtual bool load_ascii (std::istream& is) { return ptr->load_ascii(is); } virtual bool save_binary (std::ostream& os, bool& save_as_floats) { return ptr->save_binary(os, save_as_floats); } virtual bool load_binary (std::istream& is, bool swap, oct_mach_info::float_format fmt) { return ptr->load_binary(is, swap, fmt); } #if defined (HAVE_HDF5) # if SWIG_OCTAVE_PREREQ(4,0,0) virtual bool save_hdf5 (octave_hdf5_id loc_id, const char *name, bool save_as_floats) { return ptr->save_hdf5(loc_id, name, save_as_floats); } virtual bool load_hdf5 (octave_hdf5_id loc_id, const char *name, bool have_h5giterate_bug) { return ptr->load_hdf5(loc_id, name, have_h5giterate_bug); } # else virtual bool save_hdf5 (hid_t loc_id, const char *name, bool save_as_floats) { return ptr->save_hdf5(loc_id, name, save_as_floats); } virtual bool load_hdf5 (hid_t loc_id, const char *name, bool have_h5giterate_bug) { return ptr->load_hdf5(loc_id, name, have_h5giterate_bug); } # endif #endif virtual octave_value convert_to_str(bool pad = false, bool force = false, char type = '"') const { return ptr->convert_to_str(pad, force, type); } virtual octave_value convert_to_str_internal(bool pad, bool force, char type) const { return ptr->convert_to_str_internal(pad, force, type); } #if SWIG_OCTAVE_PREREQ(4,0,0) void print(std::ostream &os, bool pr_as_read_syntax = false) #else void print(std::ostream &os, bool pr_as_read_syntax = false) const #endif { return ptr->print(os, pr_as_read_syntax); } virtual type_conv_info numeric_conversion_function(void) const { return octave_base_value::type_conv_info (default_numeric_conversion_function, octave_scalar::static_type_id ()); } private: static octave_base_value *default_numeric_conversion_function (const octave_base_value& a) { const octave_swig_ref& v = dynamic_cast(a); return new octave_scalar(v.scalar_value()); } #if !SWIG_OCTAVE_PREREQ(4,0,0) DECLARE_OCTAVE_ALLOCATOR; #endif DECLARE_OV_TYPEID_FUNCTIONS_AND_DATA; }; #if !SWIG_OCTAVE_PREREQ(4,0,0) DEFINE_OCTAVE_ALLOCATOR(octave_swig_ref); #endif DEFINE_OV_TYPEID_FUNCTIONS_AND_DATA(octave_swig_ref, "swig_ref", "swig_ref"); class octave_swig_packed:public octave_base_value { swig_type_info *type; std::vector < char > buf; public: octave_swig_packed(swig_type_info *_type = 0, const void *_buf = 0, size_t _buf_len = 0) : type(_type), buf((const char*)_buf, (const char*)_buf + _buf_len) { } bool copy(swig_type_info *outtype, void *ptr, size_t sz) const { if (outtype && outtype != type) return false; assert(sz <= buf.size()); std::copy(buf.begin(), buf.begin()+sz, (char*)ptr); return true; } octave_base_value *clone() const { return new octave_swig_packed(*this); } octave_base_value *empty_clone() const { return new octave_swig_packed(); } bool is_defined() const { return true; } #if SWIG_OCTAVE_PREREQ(4,0,0) void print(std::ostream &os, bool pr_as_read_syntax = false) #else void print(std::ostream &os, bool pr_as_read_syntax = false) const #endif { indent(os); os << "swig packed type: name = " << (type ? type->name : std::string()) << ", len = " << buf.size(); newline(os); } virtual bool save_ascii (std::ostream& os) { return true; } virtual bool load_ascii (std::istream& is) { return true; } virtual bool save_binary (std::ostream& os, bool& save_as_floats) { return true; } virtual bool load_binary (std::istream& is, bool swap, oct_mach_info::float_format fmt) { return true; } #if defined (HAVE_HDF5) # if SWIG_OCTAVE_PREREQ(4,0,0) virtual bool save_hdf5 (octave_hdf5_id loc_id, const char *name, bool save_as_floats) { return true; } virtual bool load_hdf5 (octave_hdf5_id loc_id, const char *name, bool have_h5giterate_bug) { return true; } # else virtual bool save_hdf5 (hid_t loc_id, const char *name, bool save_as_floats) { return true; } virtual bool load_hdf5 (hid_t loc_id, const char *name, bool have_h5giterate_bug) { return true; } # endif #endif private: #if !SWIG_OCTAVE_PREREQ(4,0,0) DECLARE_OCTAVE_ALLOCATOR; #endif DECLARE_OV_TYPEID_FUNCTIONS_AND_DATA; }; #if !SWIG_OCTAVE_PREREQ(4,0,0) DEFINE_OCTAVE_ALLOCATOR(octave_swig_packed); #endif DEFINE_OV_TYPEID_FUNCTIONS_AND_DATA(octave_swig_packed, "swig_packed", "swig_packed"); SWIGRUNTIME octave_value_list octave_set_immutable(const octave_value_list &args, int nargout) { error("attempt to set immutable member variable"); return octave_value_list(); } struct octave_value_ref { const octave_value_list &ovl; int j; octave_value_ref(const octave_value_list &_ovl, int _j) :ovl(_ovl), j(_j) { } operator octave_value() const { return ovl(j); } octave_value operator*() const { return ovl(j); } }; namespace Swig { SWIGRUNTIME octave_base_value *swig_value_ref(octave_swig_type *ost) { return new octave_swig_ref(ost); } SWIGRUNTIME octave_swig_type *swig_value_deref(octave_value ov) { if ( #if SWIG_OCTAVE_PREREQ(4,4,0) ov.iscell() #else ov.is_cell() #endif && ov.rows() == 1 && ov.columns() == 1) ov = ov.cell_value()(0); return swig_value_deref(*ov.internal_rep()); } SWIGRUNTIME octave_swig_type *swig_value_deref(const octave_base_value &ov) { if (ov.type_id() != octave_swig_ref::static_type_id()) return 0; const octave_swig_ref *osr = static_cast < const octave_swig_ref *>(&ov); return osr->get_ptr(); } } #define swig_unary_op(name) \ SWIGRUNTIME octave_value swig_unary_op_##name(const octave_base_value &x) { \ return octave_swig_type::dispatch_unary_op(x,#name); \ } #define swig_binary_op(name) \ SWIGRUNTIME octave_value swig_binary_op_##name(const octave_base_value&lhs,const octave_base_value &rhs) { \ return octave_swig_type::dispatch_binary_op(lhs,rhs,#name); \ } #if SWIG_OCTAVE_PREREQ(4,4,0) #define swigreg_unary_op(name) \ if (!octave_value_typeinfo::lookup_unary_op(octave_value::op_##name,tid)) \ typeinfo.register_unary_op(octave_value::op_##name,tid,swig_unary_op_##name); #else #define swigreg_unary_op(name) \ if (!octave_value_typeinfo::lookup_unary_op(octave_value::op_##name,tid)) \ octave_value_typeinfo::register_unary_op(octave_value::op_##name,tid,swig_unary_op_##name); #endif #if SWIG_OCTAVE_PREREQ(4,4,0) #define swigreg_binary_op(name) \ if (!octave_value_typeinfo::lookup_binary_op(octave_value::op_##name,tid1,tid2)) \ typeinfo.register_binary_op(octave_value::op_##name,tid1,tid2,swig_binary_op_##name); #else #define swigreg_binary_op(name) \ if (!octave_value_typeinfo::lookup_binary_op(octave_value::op_##name,tid1,tid2)) \ octave_value_typeinfo::register_binary_op(octave_value::op_##name,tid1,tid2,swig_binary_op_##name); #endif swig_unary_op(not); swig_unary_op(uplus); swig_unary_op(uminus); swig_unary_op(transpose); swig_unary_op(hermitian); swig_unary_op(incr); swig_unary_op(decr); swig_binary_op(add); swig_binary_op(sub); swig_binary_op(mul); swig_binary_op(div); swig_binary_op(pow); swig_binary_op(ldiv); #if !SWIG_OCTAVE_PREREQ(4,2,0) swig_binary_op(lshift); swig_binary_op(rshift); #endif swig_binary_op(lt); swig_binary_op(le); swig_binary_op(eq); swig_binary_op(ge); swig_binary_op(gt); swig_binary_op(ne); swig_binary_op(el_mul); swig_binary_op(el_div); swig_binary_op(el_pow); swig_binary_op(el_ldiv); swig_binary_op(el_and); swig_binary_op(el_or); SWIGRUNTIME void SWIG_InstallUnaryOps(int tid) { #if SWIG_OCTAVE_PREREQ(4,4,0) octave::type_info& typeinfo = octave::interpreter::the_interpreter()->get_type_info(); #endif swigreg_unary_op(not); swigreg_unary_op(uplus); swigreg_unary_op(uminus); swigreg_unary_op(transpose); swigreg_unary_op(hermitian); swigreg_unary_op(incr); swigreg_unary_op(decr); } SWIGRUNTIME void SWIG_InstallBinaryOps(int tid1, int tid2) { #if SWIG_OCTAVE_PREREQ(4,4,0) octave::type_info& typeinfo = octave::interpreter::the_interpreter()->get_type_info(); #endif swigreg_binary_op(add); swigreg_binary_op(sub); swigreg_binary_op(mul); swigreg_binary_op(div); swigreg_binary_op(pow); swigreg_binary_op(ldiv); #if !SWIG_OCTAVE_PREREQ(4,2,0) swigreg_binary_op(lshift); swigreg_binary_op(rshift); #endif swigreg_binary_op(lt); swigreg_binary_op(le); swigreg_binary_op(eq); swigreg_binary_op(ge); swigreg_binary_op(gt); swigreg_binary_op(ne); swigreg_binary_op(el_mul); swigreg_binary_op(el_div); swigreg_binary_op(el_pow); swigreg_binary_op(el_ldiv); swigreg_binary_op(el_and); swigreg_binary_op(el_or); } SWIGRUNTIME void SWIG_InstallOps(int tid) { // here we assume that tid are conseq integers increasing from zero, and // that our tid is the last one. might be better to have explicit string // list of types we should bind to, and use lookup_type to resolve their tid. SWIG_InstallUnaryOps(tid); SWIG_InstallBinaryOps(tid, tid); for (int j = 0; j < tid; ++j) { SWIG_InstallBinaryOps(j, tid); SWIG_InstallBinaryOps(tid, j); } } SWIGRUNTIME octave_value SWIG_Octave_NewPointerObj(void *ptr, swig_type_info *type, int flags) { int own = (flags &SWIG_POINTER_OWN) ? SWIG_POINTER_OWN : 0; #ifdef SWIG_DIRECTORS Swig::Director *d = Swig::get_rtdir(ptr); if (d && Swig::swig_director_get_self(d)) return Swig::swig_director_get_self(d)->as_value(); #endif return Swig::swig_value_ref(new octave_swig_type(ptr, type, own)); } SWIGRUNTIME int SWIG_Octave_ConvertPtrAndOwn(octave_value ov, void **ptr, swig_type_info *type, int flags, int *own) { if ( #if SWIG_OCTAVE_PREREQ(4,4,0) ov.iscell() #else ov.is_cell() #endif && ov.rows() == 1 && ov.columns() == 1) ov = ov.cell_value()(0); if (!ov.is_defined() || (ov.is_matrix_type() && ov.rows() == 0 && ov.columns() == 0) ) { if (ptr) *ptr = 0; return (flags & SWIG_POINTER_NO_NULL) ? SWIG_NullReferenceError : SWIG_OK; } if (ov.type_id() != octave_swig_ref::static_type_id()) return SWIG_ERROR; octave_swig_ref *osr = static_cast < octave_swig_ref *>(ov.internal_rep()); octave_swig_type *ost = osr->get_ptr(); return ost->cast(ptr, type, own, flags); } SWIGRUNTIME octave_value SWIG_Octave_NewPackedObj(void *ptr, size_t sz, swig_type_info *type) { return new octave_swig_packed(type, (char *) ptr, sz); } SWIGRUNTIME int SWIG_Octave_ConvertPacked(const octave_value &ov, void *ptr, size_t sz, swig_type_info *type) { if (!ov.is_defined()) return SWIG_ERROR; if (ov.type_id() != octave_swig_packed::static_type_id()) return SWIG_ERROR; octave_swig_packed *ost = static_cast < octave_swig_packed *>(ov.internal_rep()); return ost->copy(type, (char *) ptr, sz) ? SWIG_OK : SWIG_ERROR; } SWIGRUNTIMEINLINE void SWIG_Octave_SetConstant(octave_swig_type *module_ns, const std::string &name, const octave_value &ov) { module_ns->assign(name, ov); } SWIGRUNTIMEINLINE octave_value SWIG_Octave_GetGlobalValue(std::string name) { #if SWIG_OCTAVE_PREREQ(4,4,0) octave::symbol_table& symtab = octave::interpreter::the_interpreter()->get_symbol_table(); return symtab.global_varval(name); #else return get_global_value(name, true); #endif } SWIGRUNTIME void SWIG_Octave_SetGlobalValue(std::string name, const octave_value& value) { #if SWIG_OCTAVE_PREREQ(4,4,0) octave::symbol_table& symtab = octave::interpreter::the_interpreter()->get_symbol_table(); symtab.global_assign(name, value); #else set_global_value(name, value); #endif } SWIGRUNTIME void SWIG_Octave_LinkGlobalValue(std::string name) { #if SWIG_OCTAVE_PREREQ(4,4,0) octave::symbol_table& symtab = octave::interpreter::the_interpreter()->get_symbol_table(); octave::symbol_scope symscope = octave::interpreter::the_interpreter()->get_current_scope(); symscope.assign(name, symtab.global_varval(name)); symscope.mark_global(name); #else #if !SWIG_OCTAVE_PREREQ(3,2,0) link_to_global_variable(curr_sym_tab->lookup(name, true)); #else #if !SWIG_OCTAVE_PREREQ(3,8,0) symbol_table::varref(name); #endif symbol_table::mark_global(name); #endif #endif } SWIGRUNTIME swig_module_info *SWIG_Octave_GetModule(void *clientdata) { octave_value ov = SWIG_Octave_GetGlobalValue("__SWIG_MODULE__" SWIG_TYPE_TABLE_NAME SWIG_RUNTIME_VERSION); if (!ov.is_defined() || ov.type_id() != octave_swig_packed::static_type_id()) return 0; const octave_swig_packed* osp = static_cast < const octave_swig_packed *> (ov.internal_rep()); swig_module_info *pointer = 0; osp->copy(0, &pointer, sizeof(swig_module_info *)); return pointer; } SWIGRUNTIME void SWIG_Octave_SetModule(void *clientdata, swig_module_info *pointer) { octave_value ov = new octave_swig_packed(0, &pointer, sizeof(swig_module_info *)); SWIG_Octave_SetGlobalValue("__SWIG_MODULE__" SWIG_TYPE_TABLE_NAME SWIG_RUNTIME_VERSION, ov); } swig-4.0.1/Lib/octave/exception.i0000644000175000017500000000065313527063513016513 0ustar williamwilliam%include %insert("runtime") { %define_as(SWIG_exception(code, msg), %block(%error(code, msg); SWIG_fail; )) } %define SWIG_RETHROW_OCTAVE_EXCEPTIONS /* rethrow any exceptions thrown by Octave */ %#if SWIG_OCTAVE_PREREQ(4,2,0) catch (octave::execution_exception& _e) { throw; } catch (octave::exit_exception& _e) { throw; } catch (octave::interrupt_exception& _e) { throw; } %#endif %enddef swig-4.0.1/Lib/octave/std_list.i0000644000175000017500000000124413527063513016337 0ustar williamwilliam// Lists %fragment("StdListTraits","header",fragment="StdSequenceTraits") %{ namespace swig { template struct traits_asptr > { static int asptr(const octave_value& obj, std::list **lis) { return traits_asptr_stdseq >::asptr(obj, lis); } }; template struct traits_from > { static octave_value *from(const std::list& vec) { return traits_from_stdseq >::from(vec); } }; } %} #define %swig_list_methods(Type...) %swig_sequence_methods(Type) #define %swig_list_methods_val(Type...) %swig_sequence_methods_val(Type); %include swig-4.0.1/Lib/octave/cdata.i0000644000175000017500000000003613527063513015564 0ustar williamwilliam%include swig-4.0.1/Lib/octave/octruntime.swg0000644000175000017500000004171513527063513017262 0ustar williamwilliam%insert(runtime) %{ #include #include #include #include // Macro for enabling features which require Octave version >= major.minor.patch // - Use (OCTAVE_PATCH_VERSION + 0) to handle both '' (released) and '+' (in development) patch numbers #define SWIG_OCTAVE_PREREQ(major, minor, patch) \ ( (OCTAVE_MAJOR_VERSION<<16) + (OCTAVE_MINOR_VERSION<<8) + (OCTAVE_PATCH_VERSION + 0) >= ((major)<<16) + ((minor)<<8) + (patch) ) // Reconstruct Octave major, minor, and patch versions for releases prior to 3.8.1 #if !defined(OCTAVE_MAJOR_VERSION) # if !defined(OCTAVE_API_VERSION_NUMBER) // Hack to distinguish between Octave 3.8.0, which removed OCTAVE_API_VERSION_NUMBER but did not yet // introduce OCTAVE_MAJOR_VERSION, and Octave <= 3.2, which did not define OCTAVE_API_VERSION_NUMBER # include # if defined(octave_ov_h) # define OCTAVE_MAJOR_VERSION 3 # define OCTAVE_MINOR_VERSION 8 # define OCTAVE_PATCH_VERSION 0 # else // Hack to distinguish between Octave 3.2 and earlier versions, before OCTAVE_API_VERSION_NUMBER existed # define ComplexLU __ignore # include # undef ComplexLU # if defined(octave_Complex_LU_h) // We know only that this version is prior to Octave 3.2, i.e. OCTAVE_API_VERSION_NUMBER < 37 # define OCTAVE_MAJOR_VERSION 3 # define OCTAVE_MINOR_VERSION 1 # define OCTAVE_PATCH_VERSION 99 # else // OCTAVE_API_VERSION_NUMBER == 37 # define OCTAVE_MAJOR_VERSION 3 # define OCTAVE_MINOR_VERSION 2 # define OCTAVE_PATCH_VERSION 0 # endif // defined(octave_Complex_LU_h) # endif // defined(octave_ov_h) // Correlation between Octave API and version numbers extracted from Octave's // ChangeLogs; version is the *earliest* released Octave with that API number # elif OCTAVE_API_VERSION_NUMBER >= 48 # define OCTAVE_MAJOR_VERSION 3 # define OCTAVE_MINOR_VERSION 6 # define OCTAVE_PATCH_VERSION 0 # elif OCTAVE_API_VERSION_NUMBER >= 45 # define OCTAVE_MAJOR_VERSION 3 # define OCTAVE_MINOR_VERSION 4 # define OCTAVE_PATCH_VERSION 1 # elif OCTAVE_API_VERSION_NUMBER >= 42 # define OCTAVE_MAJOR_VERSION 3 # define OCTAVE_MINOR_VERSION 3 # define OCTAVE_PATCH_VERSION 54 # elif OCTAVE_API_VERSION_NUMBER >= 41 # define OCTAVE_MAJOR_VERSION 3 # define OCTAVE_MINOR_VERSION 3 # define OCTAVE_PATCH_VERSION 53 # elif OCTAVE_API_VERSION_NUMBER >= 40 # define OCTAVE_MAJOR_VERSION 3 # define OCTAVE_MINOR_VERSION 3 # define OCTAVE_PATCH_VERSION 52 # elif OCTAVE_API_VERSION_NUMBER >= 39 # define OCTAVE_MAJOR_VERSION 3 # define OCTAVE_MINOR_VERSION 3 # define OCTAVE_PATCH_VERSION 51 # else // OCTAVE_API_VERSION_NUMBER == 38 # define OCTAVE_MAJOR_VERSION 3 # define OCTAVE_MINOR_VERSION 3 # define OCTAVE_PATCH_VERSION 50 # endif // !defined(OCTAVE_API_VERSION_NUMBER) #endif // !defined(OCTAVE_MAJOR_VERSION) #include #include #include #include #include #include #include #if SWIG_OCTAVE_PREREQ(4,2,0) #include #else #include #endif #include #if SWIG_OCTAVE_PREREQ(4,2,0) #include #endif %} %insert(runtime) "swigrun.swg"; %insert(runtime) "swigerrors.swg"; %insert(runtime) "octrun.swg"; %insert(initbeforefunc) "swiginit.swg" %insert(initbeforefunc) %{ static bool SWIG_init_user(octave_swig_type* module_ns); SWIGINTERN bool SWIG_Octave_LoadModule(std::string name) { bool retn = false; { #if SWIG_OCTAVE_PREREQ(4,2,0) octave::unwind_protect frame; frame.protect_var(discard_error_messages); discard_error_messages = true; frame.protect_var(discard_warning_messages); discard_warning_messages = true; #elif SWIG_OCTAVE_PREREQ(3,3,50) unwind_protect frame; frame.protect_var(error_state); error_state = 0; frame.protect_var(warning_state); warning_state = 0; frame.protect_var(discard_error_messages); discard_error_messages = true; frame.protect_var(discard_warning_messages); discard_warning_messages = true; #else unwind_protect::begin_frame("SWIG_Octave_LoadModule"); unwind_protect_int(error_state); error_state = 0; unwind_protect_int(warning_state); warning_state = 0; unwind_protect_bool(discard_error_messages); discard_error_messages = true; unwind_protect_bool(discard_warning_messages); discard_warning_messages = true; #endif #if SWIG_OCTAVE_PREREQ(4,2,0) try { #if SWIG_OCTAVE_PREREQ(4,4,0) octave::feval(name, octave_value_list(), 0); #else feval(name, octave_value_list(), 0); #endif retn = true; } catch (octave::execution_exception&) { } #else feval(name, octave_value_list(), 0); retn = (error_state == 0); #endif #if !SWIG_OCTAVE_PREREQ(3,3,50) unwind_protect::run_frame("SWIG_Octave_LoadModule"); #endif } if (!retn) { error(SWIG_name_d ": could not load module `%s'", name.c_str()); } return retn; } SWIGINTERN bool SWIG_Octave_InstallFunction(octave_function *octloadfcn, std::string name) { bool retn = false; { #if SWIG_OCTAVE_PREREQ(4,2,0) octave::unwind_protect frame; frame.protect_var(discard_error_messages); discard_error_messages = true; frame.protect_var(discard_warning_messages); discard_warning_messages = true; #elif SWIG_OCTAVE_PREREQ(3,3,50) unwind_protect frame; frame.protect_var(error_state); error_state = 0; frame.protect_var(warning_state); warning_state = 0; frame.protect_var(discard_error_messages); discard_error_messages = true; frame.protect_var(discard_warning_messages); discard_warning_messages = true; #else unwind_protect::begin_frame("SWIG_Octave_InstallFunction"); unwind_protect_int(error_state); error_state = 0; unwind_protect_int(warning_state); warning_state = 0; unwind_protect_bool(discard_error_messages); discard_error_messages = true; unwind_protect_bool(discard_warning_messages); discard_warning_messages = true; #endif octave_value_list args; args.append(name); args.append(octloadfcn->fcn_file_name()); #if SWIG_OCTAVE_PREREQ(4,2,0) try { #if SWIG_OCTAVE_PREREQ(4,4,0) octave::feval("autoload", args, 0); #else feval("autoload", args, 0); #endif retn = true; } catch (octave::execution_exception&) { } #else feval("autoload", args, 0); retn = (error_state == 0); #endif #if !SWIG_OCTAVE_PREREQ(3,3,50) unwind_protect::run_frame("SWIG_Octave_InstallFunction"); #endif } if (!retn) { error(SWIG_name_d ": could not load function `%s'", name.c_str()); } return retn; } static const char *const subclass_usage = "-*- texinfo -*- \n\ @deftypefn {Loadable Function} {} subclass()\n\ @deftypefnx{Loadable Function} {} subclass(@var{swigclass}, @var{name}, @var{fcn}, @dots{})\n\ Subclass a C++ class from within Octave, and provide implementations of its virtual methods.\n\ \n\ See the SWIG manual for usage examples.\n\ @end deftypefn"; DEFUN_DLD( subclass, args, nargout, subclass_usage ) { octave_swig_type *top = new octave_swig_type; for (int j = 0; j < args.length(); ++j) { if (args(j).type_id() == octave_swig_ref::static_type_id()) { octave_swig_ref *osr = static_cast < octave_swig_ref *>(args(j).internal_rep()); octave_swig_type *ost = osr->get_ptr(); if (!ost->is_owned()) { error("subclass: cannot subclass object not constructed on octave side"); return octave_value_list(); } top->merge(*ost); } else if (args(j).is_function_handle()) { top->assign(args(j).fcn_handle_value()->fcn_name(), args(j)); } else if (args(j).is_string()) { if (j + 1 >= args.length()) { error("subclass: member assignments must be of string,value form"); return octave_value_list(); } top->assign(args(j).string_value(), args(j + 1)); ++j; } else { error("subclass: invalid arguments to subclass()"); return octave_value_list(); } } return octave_value(Swig::swig_value_ref(top)); } static const char *const swig_type_usage = "-*- texinfo -*- \n\ @deftypefn {Loadable Function} {} swig_type(@var{swigref})\n\ Return the underlying C/C++ type name of a SWIG-wrapped object.\n\ @end deftypefn"; DEFUN_DLD( swig_type, args, nargout, swig_type_usage ) { if (args.length() != 1) { error("swig_type: must be called with only a single object"); return octave_value_list(); } octave_swig_type *ost = Swig::swig_value_deref(args(0)); if (!ost) { error("swig_type: object is not a swig_ref"); return octave_value_list(); } return octave_value(ost->swig_type_name()); } static const char *const swig_typequery_usage = "-*- texinfo -*- \n\ @deftypefn {Loadable Function} {} swig_typequery(@var{string})\n\ Return @var{string} if it is a recognised SWIG-wrapped C/C++ type name;\n\ otherwise return `'.\n\ @end deftypefn"; DEFUN_DLD( swig_typequery, args, nargout, swig_typequery_usage ) { if (args.length() != 1 || !args(0).is_string()) { error("swig_typequery: must be called with single string argument"); return octave_value_list(); } swig_module_info *module = SWIG_GetModule(0); swig_type_info *type = SWIG_TypeQueryModule(module, module, args(0).string_value().c_str()); if (!type) return octave_value(""); return octave_value(type->name); } static const char *const swig_this_usage = "-*- texinfo -*- \n\ @deftypefn {Loadable Function} {} swig_this(@var{swigref})\n\ Return the underlying C/C++ pointer of a SWIG-wrapped object.\n\ @end deftypefn"; DEFUN_DLD( swig_this, args, nargout, swig_this_usage ) { if (args.length() != 1) { error("swig_this: must be called with only a single object"); return octave_value_list(); } if (args(0).is_matrix_type() && args(0).rows() == 0 && args(0).columns() == 0) return octave_value(octave_uint64(0)); octave_swig_type *ost = Swig::swig_value_deref(args(0)); if (!ost) { error("swig_this: object is not a swig_ref"); return octave_value_list(); } return octave_value(octave_uint64((unsigned long long) ost->swig_this())); } static const char *const swig_octave_prereq_usage = "-*- texinfo -*- \n\ @deftypefn {Loadable Function} {} swig_octave_prereq(@var{major}, @var{minor}, @var{patch})\n\ Return true if the version of Octave is at least @var{major}.@var{minor}.@var{patch}.\n\ @end deftypefn"; DEFUN_DLD( swig_octave_prereq, args, nargout, swig_octave_prereq_usage ) { if (args.length() != 3) { error("swig_octave_prereq: must be called with 3 arguments"); return octave_value_list(); } const int major = args(0).int_value(); const int minor = args(1).int_value(); const int patch = args(2).int_value(); const bool prereq = SWIG_OCTAVE_PREREQ(major, minor, patch); return octave_value(prereq); } static const char *const SWIG_name_usage = "-*- texinfo -*- \n\ @deftypefn {Loadable Module} {} " SWIG_name_d "\n\ Loads the SWIG-generated module `" SWIG_name_d "'.\n\ @end deftypefn"; void __swig_atexit__(void) { ::_Exit(0); } DEFUN_DLD( SWIG_name, args, nargout, SWIG_name_usage ) { static octave_swig_type* module_ns = 0; // workaround to prevent octave seg-faulting on exit: set Octave exit function // octave_exit to _Exit, which exits immediately without trying to cleanup memory. // definitely affected version 3.2.*, not sure about 3.3.*, seems to be fixed in // version 3.4.*, but reappeared in 4.2.*, so turn on for all versions after 3.2.*. // can be turned off with macro definition. #ifndef SWIG_OCTAVE_NO_SEGFAULT_HACK #if SWIG_OCTAVE_PREREQ(4,4,0) atexit(__swig_atexit__); #elif SWIG_OCTAVE_PREREQ(3,2,0) octave_exit = ::_Exit; #endif #endif // check for no input and output args if (args.length() != 0 || nargout != 0) { print_usage(); return octave_value_list(); } // create module on first function call if (!module_ns) { // workaround bug in octave where installing global variable of custom type and then // exiting without explicitly clearing the variable causes octave to segfault. #if SWIG_OCTAVE_PREREQ(3,2,0) octave_value_list eval_args; eval_args.append("base"); eval_args.append("function __swig_atexit__; " " if mislocked() " " clear -all; " " else " " mlock(); " " endif; " "endfunction; " "__swig_atexit__; " "atexit(\"__swig_atexit__\", false); " "atexit(\"__swig_atexit__\")"); #if SWIG_OCTAVE_PREREQ(4,4,0) octave::feval("evalin", eval_args, 0); #else feval("evalin", eval_args, 0); #endif #endif #if SWIG_OCTAVE_PREREQ(4,4,0) { octave::type_info& typeinfo = octave::interpreter::the_interpreter()->get_type_info(); string_vector types = typeinfo.installed_type_names(); bool register_octave_swig_ref = true; bool register_octave_swig_packed = true; bool register_octave_swig_bound_func = true; for (int i = 0; i < types.numel(); ++i) { if (types(i) == octave_swig_ref::static_type_name()) { register_octave_swig_ref = false; } if (types(i) == octave_swig_packed::static_type_name()) { register_octave_swig_packed = false; } if (types(i) == octave_swig_bound_func::static_type_name()) { register_octave_swig_bound_func = false; } } if (register_octave_swig_ref) { octave_swig_ref::register_type(); } if (register_octave_swig_packed) { octave_swig_packed::register_type(); } if (register_octave_swig_bound_func) { octave_swig_bound_func::register_type(); } } #else octave_swig_ref::register_type(); octave_swig_packed::register_type(); #endif SWIG_InitializeModule(0); SWIG_PropagateClientData(); #if SWIG_OCTAVE_PREREQ(4,4,0) octave::call_stack& stack = octave::interpreter::the_interpreter()->get_call_stack(); octave_function *me = stack.current(); #else octave_function *me = octave_call_stack::current(); #endif if (!SWIG_Octave_InstallFunction(me, "subclass")) { return octave_value_list(); } if (!SWIG_Octave_InstallFunction(me, "swig_type")) { return octave_value_list(); } if (!SWIG_Octave_InstallFunction(me, "swig_typequery")) { return octave_value_list(); } if (!SWIG_Octave_InstallFunction(me, "swig_this")) { return octave_value_list(); } if (!SWIG_Octave_InstallFunction(me, "swig_octave_prereq")) { return octave_value_list(); } octave_swig_type* cvar_ns=0; if (std::string(SWIG_global_name) != ".") { cvar_ns=new octave_swig_type; for (int j=0;swig_globals[j].name;++j) if (swig_globals[j].get_method) cvar_ns->assign(swig_globals[j].name,&swig_globals[j]); } module_ns=new octave_swig_type(0, 0, 0, true); if (std::string(SWIG_global_name) != ".") { module_ns->assign(SWIG_global_name,Swig::swig_value_ref(cvar_ns)); } else { for (int j=0;swig_globals[j].name;++j) if (swig_globals[j].get_method) module_ns->assign(swig_globals[j].name,&swig_globals[j]); } for (int j=0;swig_globals[j].name;++j) if (swig_globals[j].method) module_ns->assign(swig_globals[j].name,&swig_globals[j]); // * need better solution here; swig_type -> octave_class mapping is // * really n-to-1, in some cases such as template partial spec, etc. // * see failing tests. for (int j=0;swig_types[j];++j) if (swig_types[j]->clientdata) { swig_octave_class* c=(swig_octave_class*)swig_types[j]->clientdata; module_ns->assign(c->name, Swig::swig_value_ref (new octave_swig_type(0,swig_types[j]))); } if (!SWIG_init_user(module_ns)) { delete module_ns; module_ns=0; return octave_value_list(); } SWIG_InstallOps(octave_swig_ref::static_type_id()); octave_swig_type::swig_member_const_iterator mb; for (mb = module_ns->swig_members_begin(); mb != module_ns->swig_members_end(); ++mb) { if (mb->second.first && mb->second.first->method) { if (!SWIG_Octave_InstallFunction(me, mb->first)) { return octave_value_list(); } } } #if SWIG_OCTAVE_PREREQ(4,4,0) octave::interpreter::the_interpreter()->mlock(); #elif SWIG_OCTAVE_PREREQ(3,2,0) mlock(); #else mlock(me->name()); #endif } octave_swig_type::swig_member_const_iterator mb; for (mb = module_ns->swig_members_begin(); mb != module_ns->swig_members_end(); ++mb) { if (mb->second.second.is_defined()) { SWIG_Octave_SetGlobalValue(mb->first, mb->second.second); SWIG_Octave_LinkGlobalValue(mb->first); } } SWIG_Octave_SetGlobalValue(SWIG_name_d, module_ns->as_value()); SWIG_Octave_LinkGlobalValue(SWIG_name_d); return octave_value_list(); } %} swig-4.0.1/Lib/octave/std_string.i0000644000175000017500000000004313527063513016666 0ustar williamwilliam%include swig-4.0.1/Lib/octave/std_map.i0000644000175000017500000001116013527063513016137 0ustar williamwilliam// Maps %include %fragment("StdMapCommonTraits","header",fragment="StdSequenceTraits") { namespace swig { template struct from_key_oper { typedef const ValueType& argument_type; typedef octave_value result_type; result_type operator()(argument_type v) const { return swig::from(v.first); } }; template struct from_value_oper { typedef const ValueType& argument_type; typedef octave_value result_type; result_type operator()(argument_type v) const { return swig::from(v.second); } }; template struct OctMapIterator_T : OctSwigIteratorClosed_T { OctMapIterator_T(OutIterator curr, OutIterator first, OutIterator last, octave_value seq) : OctSwigIteratorClosed_T(curr, first, last, seq) { } }; template > struct OctMapKeyIterator_T : OctMapIterator_T { OctMapKeyIterator_T(OutIterator curr, OutIterator first, OutIterator last, octave_value seq) : OctMapIterator_T(curr, first, last, seq) { } }; template inline OctSwigIterator* make_output_key_iterator(const OutIter& current, const OutIter& begin, const OutIter& end, octave_value seq = octave_value()) { return new OctMapKeyIterator_T(current, begin, end, seq); } template > struct OctMapValueIterator_T : OctMapIterator_T { OctMapValueIterator_T(OutIterator curr, OutIterator first, OutIterator last, octave_value seq) : OctMapIterator_T(curr, first, last, seq) { } }; template inline OctSwigIterator* make_output_value_iterator(const OutIter& current, const OutIter& begin, const OutIter& end, octave_value seq = 0) { return new OctMapValueIterator_T(current, begin, end, seq); } } } %fragment("StdMapTraits","header",fragment="StdMapCommonTraits") { namespace swig { template inline void assign(const OctSeq& octseq, std::map *map) { typedef typename std::map::value_type value_type; typename OctSeq::const_iterator it = octseq.begin(); for (;it != octseq.end(); ++it) { map->insert(value_type(it->first, it->second)); } } template struct traits_asptr > { typedef std::map map_type; static int asptr(octave_value obj, map_type **val) { /* int res = SWIG_ERROR; if (PyDict_Check(obj)) { SwigVar_PyObject items = PyObject_CallMethod(obj,(char *)"items",NULL); res = traits_asptr_stdseq, std::pair >::asptr(items, val); } else { map_type *p; swig_type_info *descriptor = swig::type_info(); res = descriptor ? SWIG_ConvertPtr(obj, (void **)&p, descriptor, 0) : SWIG_ERROR; if (SWIG_IsOK(res) && val) *val = p; } return res; */ return SWIG_ERROR; } }; template struct traits_from > { typedef std::map map_type; typedef typename map_type::const_iterator const_iterator; typedef typename map_type::size_type size_type; static octave_value from(const map_type& map) { /* swig_type_info *desc = swig::type_info(); if (desc && desc->clientdata) { return SWIG_NewPointerObj(new map_type(map), desc, SWIG_POINTER_OWN); } else { size_type size = map.size(); int pysize = (size <= (size_type) INT_MAX) ? (int) size : -1; if (pysize < 0) { SWIG_PYTHON_THREAD_BEGIN_BLOCK; PyErr_SetString(PyExc_OverflowError, "map size not valid in python"); SWIG_PYTHON_THREAD_END_BLOCK; return NULL; } PyObject *obj = PyDict_New(); for (const_iterator i= map.begin(); i!= map.end(); ++i) { swig::SwigVar_PyObject key = swig::from(i->first); swig::SwigVar_PyObject val = swig::from(i->second); PyDict_SetItem(obj, key, val); } return obj; } */ return octave_value(); } }; } } %define %swig_map_common(Map...) %swig_sequence_iterator(Map); %swig_container_methods(Map); %enddef %define %swig_map_methods(Map...) %swig_map_common(Map) %enddef %include swig-4.0.1/Lib/octave/octtypemaps.swg0000644000175000017500000000463213527063513017436 0ustar williamwilliam // Include fundamental fragment definitions %include // Look for user fragments file. %include // Octave fragments for primitive types %include // Octave fragments for char* strings //%include #ifndef SWIG_DIRECTOR_TYPEMAPS #define SWIG_DIRECTOR_TYPEMAPS #endif // Octave types #define SWIG_Object octave_value #define VOID_Object octave_value() /* // Octave allows implicit conversion #define %implicitconv_flag $implicitconv */ // append output #define SWIG_AppendOutput(result, obj) SWIG_Octave_AppendOutput(result, obj) // set constant #define SWIG_SetConstant(name, obj) SWIG_Octave_SetConstant(module_ns,name,obj) // raise #define SWIG_Octave_Raise(OBJ, TYPE, DESC) error("C++ side threw an exception of type " TYPE) #define SWIG_Raise(obj, type, desc) SWIG_Octave_Raise(obj, type, desc) // Include the unified typemap library %include %typecheck(SWIG_TYPECHECK_SWIGOBJECT) SWIG_Object "$1 = (*$input).is_defined();"; %typecheck(SWIG_TYPECHECK_SWIGOBJECT) octave_value_list "$1 = true;"; %typemap(in) (octave_value_list varargs,...) { for (int j=$argnum-1;jappend($1); } %typemap(out,noblock=1) octave_map, Octave_map { $result=$1; } %typemap(out,noblock=1) NDArray { $result=$1; } %typemap(out,noblock=1) Cell { $result=$1; } /* // Smart Pointers %typemap(out,noblock=1) const SWIGTYPE & SMARTPOINTER { $result = SWIG_NewPointerObj(%new_copy(*$1, $*ltype), $descriptor, SWIG_POINTER_OWN | %newpointer_flags); } %typemap(ret) const SWIGTYPE & SMARTPOINTER, SWIGTYPE SMARTPOINTER { octave_swig_type* lobj=Swig::swig_value_deref($result); if (lobj) { std::list idx; idx.push_back(octave_value("__deref__")); idx.push_back(octave_value_list()); octave_value_list ovl(lobj->subsref(".(",idx)); octave_swig_type* robj=ovl.length()>=1?Swig::swig_value_deref(ovl(0)):0; if (robj && !error_state) lobj->append(robj); } } */ swig-4.0.1/Lib/octave/factory.i0000644000175000017500000000004013527063513016152 0ustar williamwilliam%include swig-4.0.1/Lib/octave/boost_shared_ptr.i0000644000175000017500000005160213527063513020056 0ustar williamwilliam%include // Set SHARED_PTR_DISOWN to $disown if required, for example // #define SHARED_PTR_DISOWN $disown #if !defined(SHARED_PTR_DISOWN) #define SHARED_PTR_DISOWN 0 #endif // Language specific macro implementing all the customisations for handling the smart pointer %define SWIG_SHARED_PTR_TYPEMAPS(CONST, TYPE...) // %naturalvar is as documented for member variables %naturalvar TYPE; %naturalvar SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >; // destructor wrapper customisation %feature("unref") TYPE //"if (debug_shared) { cout << \"deleting use_count: \" << (*smartarg1).use_count() << \" [\" << (boost::get_deleter(*smartarg1) ? std::string(\"CANNOT BE DETERMINED SAFELY\") : ( (*smartarg1).get() ? (*smartarg1)->getValue() : std::string(\"NULL PTR\") )) << \"]\" << endl << flush; }\n" "(void)arg1; delete smartarg1;" // Typemap customisations... // plain value %typemap(in) CONST TYPE (void *argp, int res = 0) { int newmem = 0; res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } if (!argp) { %argument_nullref("$type", $symname, $argnum); } else { $1 = *(%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *)->get()); if (newmem & SWIG_CAST_NEW_MEMORY) delete %reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); } } %typemap(out) CONST TYPE { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(new $1_ltype(($1_ltype &)$1)); %set_output(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } %typemap(varin) CONST TYPE { void *argp = 0; int newmem = 0; int res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %variable_fail(res, "$type", "$name"); } if (!argp) { %variable_nullref("$type", "$name"); } else { $1 = *(%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *)->get()); if (newmem & SWIG_CAST_NEW_MEMORY) delete %reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); } } %typemap(varout) CONST TYPE { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(new $1_ltype(($1_ltype &)$1)); %set_varoutput(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } %typemap(directorin,noblock=1) CONST TYPE (SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0) %{ smartarg = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(new $1_ltype(($1_ltype &)$1)); $input = SWIG_NewPointerObj(%as_voidptr(smartarg), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN | %newpointer_flags); %} %typemap(directorout,noblock=1) CONST TYPE (void *swig_argp, int swig_res = 0) { int newmem = 0; swig_res = SWIG_ConvertPtrAndOwn($input, &swig_argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(swig_res)) { %dirout_fail(swig_res, "$type"); } if (!swig_argp) { %dirout_nullref("$type"); } else { $result = *(%reinterpret_cast(swig_argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *)->get()); if (newmem & SWIG_CAST_NEW_MEMORY) delete %reinterpret_cast(swig_argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); } } // plain pointer // Note: $disown not implemented by default as it will lead to a memory leak of the shared_ptr instance %typemap(in) CONST TYPE * (void *argp = 0, int res = 0, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > tempshared, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0) { int newmem = 0; res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SHARED_PTR_DISOWN | %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } if (newmem & SWIG_CAST_NEW_MEMORY) { tempshared = *%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); delete %reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); $1 = %const_cast(tempshared.get(), $1_ltype); } else { smartarg = %reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); $1 = %const_cast((smartarg ? smartarg->get() : 0), $1_ltype); } } %typemap(out, fragment="SWIG_null_deleter") CONST TYPE * { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1 SWIG_NO_NULL_DELETER_$owner) : 0; %set_output(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), $owner | SWIG_POINTER_OWN)); } %typemap(varin) CONST TYPE * { void *argp = 0; int newmem = 0; int res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %variable_fail(res, "$type", "$name"); } SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > tempshared; SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0; if (newmem & SWIG_CAST_NEW_MEMORY) { tempshared = *%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); delete %reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); $1 = %const_cast(tempshared.get(), $1_ltype); } else { smartarg = %reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); $1 = %const_cast((smartarg ? smartarg->get() : 0), $1_ltype); } } %typemap(varout, fragment="SWIG_null_deleter") CONST TYPE * { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1 SWIG_NO_NULL_DELETER_0) : 0; %set_varoutput(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } %typemap(directorin,noblock=1, fragment="SWIG_null_deleter") CONST TYPE * (SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0) %{ smartarg = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1 SWIG_NO_NULL_DELETER_0) : 0; $input = SWIG_NewPointerObj(%as_voidptr(smartarg), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN | %newpointer_flags); %} %typemap(directorout,noblock=1) CONST TYPE * %{ #error "directorout typemap for plain pointer not implemented" %} // plain reference %typemap(in) CONST TYPE & (void *argp = 0, int res = 0, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > tempshared) { int newmem = 0; res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } if (!argp) { %argument_nullref("$type", $symname, $argnum); } if (newmem & SWIG_CAST_NEW_MEMORY) { tempshared = *%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); delete %reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); $1 = %const_cast(tempshared.get(), $1_ltype); } else { $1 = %const_cast(%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *)->get(), $1_ltype); } } %typemap(out, fragment="SWIG_null_deleter") CONST TYPE & { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1 SWIG_NO_NULL_DELETER_$owner); %set_output(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } %typemap(varin) CONST TYPE & { void *argp = 0; int newmem = 0; int res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %variable_fail(res, "$type", "$name"); } SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > tempshared; if (!argp) { %variable_nullref("$type", "$name"); } if (newmem & SWIG_CAST_NEW_MEMORY) { tempshared = *%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); delete %reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); $1 = *%const_cast(tempshared.get(), $1_ltype); } else { $1 = *%const_cast(%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *)->get(), $1_ltype); } } %typemap(varout, fragment="SWIG_null_deleter") CONST TYPE & { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(&$1 SWIG_NO_NULL_DELETER_0); %set_varoutput(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } %typemap(directorin,noblock=1, fragment="SWIG_null_deleter") CONST TYPE & (SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0) %{ smartarg = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(&$1 SWIG_NO_NULL_DELETER_0); $input = SWIG_NewPointerObj(%as_voidptr(smartarg), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN | %newpointer_flags); %} %typemap(directorout,noblock=1) CONST TYPE & %{ #error "directorout typemap for plain reference not implemented" %} // plain pointer by reference // Note: $disown not implemented by default as it will lead to a memory leak of the shared_ptr instance %typemap(in) TYPE *CONST& (void *argp = 0, int res = 0, $*1_ltype temp = 0, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > tempshared) { int newmem = 0; res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SHARED_PTR_DISOWN | %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } if (newmem & SWIG_CAST_NEW_MEMORY) { tempshared = *%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); delete %reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); temp = %const_cast(tempshared.get(), $*1_ltype); } else { temp = %const_cast(%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *)->get(), $*1_ltype); } $1 = &temp; } %typemap(out, fragment="SWIG_null_deleter") TYPE *CONST& { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = *$1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(*$1 SWIG_NO_NULL_DELETER_$owner) : 0; %set_output(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } %typemap(varin) TYPE *CONST& %{ #error "varin typemap not implemented" %} %typemap(varout) TYPE *CONST& %{ #error "varout typemap not implemented" %} %typemap(directorin,noblock=1, fragment="SWIG_null_deleter") TYPE *CONST& (SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0) %{ smartarg = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1 SWIG_NO_NULL_DELETER_0) : 0; $input = SWIG_NewPointerObj(%as_voidptr(smartarg), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN | %newpointer_flags); %} %typemap(directorout,noblock=1) TYPE *CONST& %{ #error "directorout typemap for plain pointer by reference not implemented" %} // shared_ptr by value %typemap(in) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > (void *argp, int res = 0) { int newmem = 0; res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } if (argp) $1 = *(%reinterpret_cast(argp, $<ype)); if (newmem & SWIG_CAST_NEW_MEMORY) delete %reinterpret_cast(argp, $<ype); } %typemap(out) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1) : 0; %set_output(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } %typemap(varin) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > { int newmem = 0; void *argp = 0; int res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %variable_fail(res, "$type", "$name"); } $1 = argp ? *(%reinterpret_cast(argp, $<ype)) : SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE >(); if (newmem & SWIG_CAST_NEW_MEMORY) delete %reinterpret_cast(argp, $<ype); } %typemap(varout) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1) : 0; %set_varoutput(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } %typemap(directorin,noblock=1) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > (SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0) %{ smartarg = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1) : 0; $input = SWIG_NewPointerObj(%as_voidptr(smartarg), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN | %newpointer_flags); %} %typemap(directorout,noblock=1) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > (void *swig_argp, int swig_res = 0) { int newmem = 0; swig_res = SWIG_ConvertPtrAndOwn($input, &swig_argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(swig_res)) { %dirout_fail(swig_res, "$type"); } if (swig_argp) { $result = *(%reinterpret_cast(swig_argp, $<ype)); if (newmem & SWIG_CAST_NEW_MEMORY) delete %reinterpret_cast(swig_argp, $<ype); } } // shared_ptr by reference %typemap(in) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > & (void *argp, int res = 0, $*1_ltype tempshared) { int newmem = 0; res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } if (newmem & SWIG_CAST_NEW_MEMORY) { if (argp) tempshared = *%reinterpret_cast(argp, $ltype); delete %reinterpret_cast(argp, $ltype); $1 = &tempshared; } else { $1 = (argp) ? %reinterpret_cast(argp, $ltype) : &tempshared; } } %typemap(out) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > & { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = *$1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(*$1) : 0; %set_output(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } %typemap(varin) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > & %{ #error "varin typemap not implemented" %} %typemap(varout) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > & %{ #error "varout typemap not implemented" %} %typemap(directorin,noblock=1) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > & (SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0) %{ smartarg = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1) : 0; $input = SWIG_NewPointerObj(%as_voidptr(smartarg), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN | %newpointer_flags); %} %typemap(directorout,noblock=1) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > & %{ #error "directorout typemap for shared_ptr ref not implemented" %} // shared_ptr by pointer %typemap(in) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * (void *argp, int res = 0, $*1_ltype tempshared) { int newmem = 0; res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } if (newmem & SWIG_CAST_NEW_MEMORY) { if (argp) tempshared = *%reinterpret_cast(argp, $ltype); delete %reinterpret_cast(argp, $ltype); $1 = &tempshared; } else { $1 = (argp) ? %reinterpret_cast(argp, $ltype) : &tempshared; } } %typemap(out) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = ($1 && *$1) ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(*$1) : 0; %set_output(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); if ($owner) delete $1; } %typemap(varin) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * %{ #error "varin typemap not implemented" %} %typemap(varout) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * %{ #error "varout typemap not implemented" %} %typemap(directorin,noblock=1) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * (SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0) %{ smartarg = ($1 && *$1) ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(*$1) : 0; $input = SWIG_NewPointerObj(%as_voidptr(smartarg), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN | %newpointer_flags); %} %typemap(directorout,noblock=1) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * %{ #error "directorout typemap for pointer to shared_ptr not implemented" %} // shared_ptr by pointer reference %typemap(in) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& (void *argp, int res = 0, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > tempshared, $*1_ltype temp = 0) { int newmem = 0; res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } if (argp) tempshared = *%reinterpret_cast(argp, $*ltype); if (newmem & SWIG_CAST_NEW_MEMORY) delete %reinterpret_cast(argp, $*ltype); temp = &tempshared; $1 = &temp; } %typemap(out) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = (*$1 && **$1) ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(**$1) : 0; %set_output(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } %typemap(varin) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& %{ #error "varin typemap not implemented" %} %typemap(varout) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& %{ #error "varout typemap not implemented" %} %typemap(directorin,noblock=1) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& (SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0) %{ smartarg = ($1 && *$1) ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(*$1) : 0; $input = SWIG_NewPointerObj(%as_voidptr(smartarg), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN | %newpointer_flags); %} %typemap(directorout,noblock=1) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& %{ #error "directorout typemap for pointer ref to shared_ptr not implemented" %} // Typecheck typemaps // Note: SWIG_ConvertPtr with void ** parameter set to 0 instead of using SWIG_ConvertPtrAndOwn, so that the casting // function is not called thereby avoiding a possible smart pointer copy constructor call when casting up the inheritance chain. %typemap(typecheck, precedence=SWIG_TYPECHECK_POINTER, equivalent="TYPE *", noblock=1) TYPE CONST, TYPE CONST &, TYPE CONST *, TYPE *CONST&, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > &, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& { int res = SWIG_ConvertPtr($input, 0, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), 0); $1 = SWIG_CheckState(res); } // various missing typemaps - If ever used (unlikely) ensure compilation error rather than runtime bug %typemap(in) CONST TYPE[], CONST TYPE[ANY], CONST TYPE (CLASS::*) %{ #error "typemaps for $1_type not available" %} %typemap(out) CONST TYPE[], CONST TYPE[ANY], CONST TYPE (CLASS::*) %{ #error "typemaps for $1_type not available" %} %template() SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >; %enddef swig-4.0.1/Lib/intrusive_ptr.i0000644000175000017500000000524113527063513016147 0ustar williamwilliam// Allow for different namespaces for shared_ptr / intrusive_ptr - they could be boost or std or std::tr1 // For example for std::tr1, use: // #define SWIG_SHARED_PTR_NAMESPACE std // #define SWIG_SHARED_PTR_SUBNAMESPACE tr1 // #define SWIG_INTRUSIVE_PTR_NAMESPACE boost // #define SWIG_INTRUSIVE_PTR_SUBNAMESPACE #if !defined(SWIG_INTRUSIVE_PTR_NAMESPACE) # define SWIG_INTRUSIVE_PTR_NAMESPACE boost #endif #if defined(SWIG_INTRUSIVE_PTR_SUBNAMESPACE) # define SWIG_INTRUSIVE_PTR_QNAMESPACE SWIG_INTRUSIVE_PTR_NAMESPACE::SWIG_INTRUSIVE_PTR_SUBNAMESPACE #else # define SWIG_INTRUSIVE_PTR_QNAMESPACE SWIG_INTRUSIVE_PTR_NAMESPACE #endif namespace SWIG_INTRUSIVE_PTR_NAMESPACE { #if defined(SWIG_INTRUSIVE_PTR_SUBNAMESPACE) namespace SWIG_INTRUSIVE_PTR_SUBNAMESPACE { #endif template class intrusive_ptr { }; #if defined(SWIG_INTRUSIVE_PTR_SUBNAMESPACE) } #endif } %fragment("SWIG_intrusive_deleter", "header") { template struct SWIG_intrusive_deleter { void operator()(T *p) { if (p) intrusive_ptr_release(p); } }; } %fragment("SWIG_null_deleter", "header") { struct SWIG_null_deleter { void operator() (void const *) const { } }; %#define SWIG_NO_NULL_DELETER_0 , SWIG_null_deleter() %#define SWIG_NO_NULL_DELETER_1 } // Main user macro for defining intrusive_ptr typemaps for both const and non-const pointer types %define %intrusive_ptr(TYPE...) %feature("smartptr", noblock=1) TYPE { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > } SWIG_INTRUSIVE_PTR_TYPEMAPS(, TYPE) SWIG_INTRUSIVE_PTR_TYPEMAPS(const, TYPE) %enddef %define %intrusive_ptr_no_wrap(TYPE...) %feature("smartptr", noblock=1) TYPE { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > } SWIG_INTRUSIVE_PTR_TYPEMAPS_NO_WRAP(, TYPE) SWIG_INTRUSIVE_PTR_TYPEMAPS_NO_WRAP(const, TYPE) %enddef // Legacy macros %define SWIG_INTRUSIVE_PTR(PROXYCLASS, TYPE...) #warning "SWIG_INTRUSIVE_PTR(PROXYCLASS, TYPE) is deprecated. Please use %intrusive_ptr(TYPE) instead." %intrusive_ptr(TYPE) %enddef %define SWIG_INTRUSIVE_PTR_DERIVED(PROXYCLASS, BASECLASSTYPE, TYPE...) #warning "SWIG_INTRUSIVE_PTR_DERIVED(PROXYCLASS, BASECLASSTYPE, TYPE) is deprecated. Please use %intrusive_ptr(TYPE) instead." %intrusive_ptr(TYPE) %enddef %define SWIG_INTRUSIVE_PTR_NO_WRAP(PROXYCLASS, TYPE...) #warning "SWIG_INTRUSIVE_PTR_NO_WRAP(PROXYCLASS, TYPE) is deprecated. Please use %intrusive_ptr_no_wrap(TYPE) instead." %intrusive_ptr_no_wrap(TYPE) %enddef %define SWIG_INTRUSIVE_PTR_DERIVED_NO_WRAP(PROXYCLASS, BASECLASSTYPE, TYPE...) #warning "SWIG_INTRUSIVE_PTR_DERIVED_NO_WRAP(PROXYCLASS, BASECLASSTYPE, TYPE) is deprecated. Please use %intrusive_ptr_no_wrap(TYPE) instead." %intrusive_ptr_no_wrap(TYPE) %enddef swig-4.0.1/Lib/ruby/0000755000175000017500000000000013527063513014037 5ustar williamwilliamswig-4.0.1/Lib/ruby/std_complex.i0000644000175000017500000000114413527063513016532 0ustar williamwilliam/* * STD C++ complex typemaps */ %include %{ #include %} namespace std { %naturalvar complex; template class complex; %template() complex; %template() complex; } /* defining the complex as/from converters */ %swig_cplxdbl_convn(std::complex, std::complex, std::real, std::imag) %swig_cplxflt_convn(std::complex, std::complex, std::real, std::imag) /* defining the typemaps */ %typemaps_primitive(%checkcode(CPLXDBL), std::complex); %typemaps_primitive(%checkcode(CPLXFLT), std::complex); swig-4.0.1/Lib/ruby/std_deque.i0000644000175000017500000000133313527063513016166 0ustar williamwilliam/* Deques */ %fragment("StdDequeTraits","header",fragment="StdSequenceTraits") %{ namespace swig { template struct traits_asptr > { static int asptr(VALUE obj, std::deque **vec) { return traits_asptr_stdseq >::asptr(obj, vec); } }; template struct traits_from > { static VALUE from(const std::deque& vec) { return traits_from_stdseq >::from(vec); } }; } %} %ignore std::deque::push_back; %ignore std::deque::pop_back; #define %swig_deque_methods(Type...) %swig_sequence_methods(Type) #define %swig_deque_methods_val(Type...) %swig_sequence_methods_val(Type); %include swig-4.0.1/Lib/ruby/rubyautodoc.swg0000644000175000017500000001041713527063513017124 0ustar williamwilliam/* ----------------------------------------------------------------------------- * rubyautodoc.swg * * This file implements autodoc typemaps for some common ruby methods. * ----------------------------------------------------------------------------- */ %define AUTODOC(func, str) %feature("autodoc", str) func; %enddef AUTODOC(to_i, "Convert $class to an Integer"); AUTODOC(to_f, "Convert $class to a Float"); AUTODOC(coerce, "Coerce class to a number"); AUTODOC(to_a, "Convert $class to an Array"); AUTODOC(to_s, "Convert class to a String representation"); AUTODOC(inspect, "Inspect class and its contents"); AUTODOC(at, "Return element at a certain index"); AUTODOC(__getitem__, "Element accessor/slicing"); AUTODOC(__setitem__, "Element setter/slicing"); AUTODOC(slice, "Return a slice (portion of) the $class"); AUTODOC(push, "Add an element at the end of the $class"); AUTODOC(pop, "Remove and return element at the end of the $class"); AUTODOC(shift, "Remove and return element at the beginning of the $class"); AUTODOC(unshift, "Add one or more elements at the beginning of the $class"); AUTODOC(first, "Return the first element in $class"); AUTODOC(last, "Return the last element in $class"); // // Common Object methods // AUTODOC(hash, "Hashing function for class"); AUTODOC(dup, "Create a duplicate of the class and unfreeze it if needed"); AUTODOC(clone, "Create a duplicate of the class"); // // Container methods // AUTODOC(empty, "Check if $class is empty"); AUTODOC(size, "Size or Length of the $class"); AUTODOC(insert, "Insert one or more new elements in the $class"); // // Iterator methods (block) // AUTODOC(each, "Iterate thru each element in the $class. A block must be provided"); AUTODOC(find, "Find an element in the class"); AUTODOC(each_key, "Iterate thru each key element in the $class. A block must be provided"); AUTODOC(each_value, "Iterate thru each key element in the $class. A block must be provided"); AUTODOC(reject, "Iterate thru each element in the $class and reject those that fail a condition returning a new $class. A block must be provided"); AUTODOC(reject_bang, "Iterate thru each element in the $class and reject those that fail a condition. A block must be provided. $class is modified in place"); AUTODOC(select, "Iterate thru each element in the $class and select those that match a condition. A block must be provided"); AUTODOC(delete_at, "Delete an element at a certain index"); AUTODOC(__delete__, "Delete a matching element"); // // Hash methods // AUTODOC(keys, "Return an Array of key elements"); AUTODOC(values, "Return an Array of value elements"); AUTODOC(values_at, "Return an Array of value elements matching the conditions"); // // Operators // #ifdef __cplusplus AUTODOC(operator==, "Equality comparison operator"); AUTODOC(operator<=, "Lower or equal comparison operator"); AUTODOC(operator>=, "Higher or equal comparison operator"); AUTODOC(operator<, "Lower than comparison operator"); AUTODOC(operator>, "Higher than comparison operator"); AUTODOC(operator<<, "Left shifting or appending operator"); AUTODOC(operator>>, "Right shifting operator or extracting operator"); AUTODOC(operator+, "Add operator"); AUTODOC(operator-, "Substraction operator"); AUTODOC(operator+(), "Positive operator"); AUTODOC(operator-(), "Negation operator"); AUTODOC(operator&, "AND operator"); AUTODOC(operator|, "OR operator"); AUTODOC(operator^, "XOR operator"); AUTODOC(operator~, "Invert operator"); #endif AUTODOC(__eq__, "Equality comparison operator"); AUTODOC(__le__, "Lower or equal comparison operator"); AUTODOC(__ge__, "Higher or equal comparison operator"); AUTODOC(__lt__, "Lower than comparison operator"); AUTODOC(__gt__, "Higher than comparison operator"); AUTODOC(__lshift__, "Left shifting or appending operator"); AUTODOC(__rshift__, "Right shifting operator or extracting operator"); AUTODOC(__add___, "Add operator"); AUTODOC(__sub__, "Substraction operator"); AUTODOC(__pos__, "Positive operator"); AUTODOC(__neg__, "Negation operator"); AUTODOC(__and__, "AND operator"); AUTODOC(__or__, "OR operator"); AUTODOC(__xor__, "XOR operator"); AUTODOC(__negate__, "Invert operator"); AUTODOC(__pow__, "Exponential operator"); AUTODOC(__divmod__, "Modulo of division"); AUTODOC(__cmp__, "Comparison operator. Returns < 0 for less than, 0 for equal or > 1 for higher than."); swig-4.0.1/Lib/ruby/rubyhead.swg0000644000175000017500000001040213527063513016361 0ustar williamwilliam#include /* Ruby 1.9.1 has a "memoisation optimisation" when compiling with GCC which * breaks using rb_intern as an lvalue, as SWIG does. We work around this * issue for now by disabling this. * https://sourceforge.net/tracker/?func=detail&aid=2859614&group_id=1645&atid=101645 */ #ifdef rb_intern # undef rb_intern #endif /* Remove global macros defined in Ruby's win32.h */ #ifdef write # undef write #endif #ifdef read # undef read #endif #ifdef bind # undef bind #endif #ifdef close # undef close #endif #ifdef connect # undef connect #endif /* Ruby 1.7 defines NUM2LL(), LL2NUM() and ULL2NUM() macros */ #ifndef NUM2LL #define NUM2LL(x) NUM2LONG((x)) #endif #ifndef LL2NUM #define LL2NUM(x) INT2NUM((long) (x)) #endif #ifndef ULL2NUM #define ULL2NUM(x) UINT2NUM((unsigned long) (x)) #endif /* Ruby 1.7 doesn't (yet) define NUM2ULL() */ #ifndef NUM2ULL #ifdef HAVE_LONG_LONG #define NUM2ULL(x) rb_num2ull((x)) #else #define NUM2ULL(x) NUM2ULONG(x) #endif #endif /* RSTRING_LEN, etc are new in Ruby 1.9, but ->ptr and ->len no longer work */ /* Define these for older versions so we can just write code the new way */ #ifndef RSTRING_LEN # define RSTRING_LEN(x) RSTRING(x)->len #endif #ifndef RSTRING_PTR # define RSTRING_PTR(x) RSTRING(x)->ptr #endif #ifndef RSTRING_END # define RSTRING_END(x) (RSTRING_PTR(x) + RSTRING_LEN(x)) #endif #ifndef RARRAY_LEN # define RARRAY_LEN(x) RARRAY(x)->len #endif #ifndef RARRAY_PTR # define RARRAY_PTR(x) RARRAY(x)->ptr #endif #ifndef RFLOAT_VALUE # define RFLOAT_VALUE(x) RFLOAT(x)->value #endif #ifndef DOUBLE2NUM # define DOUBLE2NUM(x) rb_float_new(x) #endif #ifndef RHASH_TBL # define RHASH_TBL(x) (RHASH(x)->tbl) #endif #ifndef RHASH_ITER_LEV # define RHASH_ITER_LEV(x) (RHASH(x)->iter_lev) #endif #ifndef RHASH_IFNONE # define RHASH_IFNONE(x) (RHASH(x)->ifnone) #endif #ifndef RHASH_SIZE # define RHASH_SIZE(x) (RHASH(x)->tbl->num_entries) #endif #ifndef RHASH_EMPTY_P # define RHASH_EMPTY_P(x) (RHASH_SIZE(x) == 0) #endif #ifndef RSTRUCT_LEN # define RSTRUCT_LEN(x) RSTRUCT(x)->len #endif #ifndef RSTRUCT_PTR # define RSTRUCT_PTR(x) RSTRUCT(x)->ptr #endif #ifndef RTYPEDDATA_P # define RTYPEDDATA_P(x) (TYPE(x) != T_DATA) #endif /* * Need to be very careful about how these macros are defined, especially * when compiling C++ code or C code with an ANSI C compiler. * * VALUEFUNC(f) is a macro used to typecast a C function that implements * a Ruby method so that it can be passed as an argument to API functions * like rb_define_method() and rb_define_singleton_method(). * * VOIDFUNC(f) is a macro used to typecast a C function that implements * either the "mark" or "free" stuff for a Ruby Data object, so that it * can be passed as an argument to API functions like Data_Wrap_Struct() * and Data_Make_Struct(). */ #ifdef __cplusplus # ifndef RUBY_METHOD_FUNC /* These definitions should work for Ruby 1.4.6 */ # define PROTECTFUNC(f) ((VALUE (*)()) f) # define VALUEFUNC(f) ((VALUE (*)()) f) # define VOIDFUNC(f) ((void (*)()) f) # else # ifndef ANYARGS /* These definitions should work for Ruby 1.6 */ # define PROTECTFUNC(f) ((VALUE (*)()) f) # define VALUEFUNC(f) ((VALUE (*)()) f) # define VOIDFUNC(f) ((RUBY_DATA_FUNC) f) # else /* These definitions should work for Ruby 1.7+ */ # define PROTECTFUNC(f) ((VALUE (*)(VALUE)) f) # define VALUEFUNC(f) ((VALUE (*)(ANYARGS)) f) # define VOIDFUNC(f) ((RUBY_DATA_FUNC) f) # endif # endif #else # define VALUEFUNC(f) (f) # define VOIDFUNC(f) (f) #endif /* Don't use for expressions have side effect */ #ifndef RB_STRING_VALUE #define RB_STRING_VALUE(s) (TYPE(s) == T_STRING ? (s) : (*(volatile VALUE *)&(s) = rb_str_to_str(s))) #endif #ifndef StringValue #define StringValue(s) RB_STRING_VALUE(s) #endif #ifndef StringValuePtr #define StringValuePtr(s) RSTRING_PTR(RB_STRING_VALUE(s)) #endif #ifndef StringValueLen #define StringValueLen(s) RSTRING_LEN(RB_STRING_VALUE(s)) #endif #ifndef SafeStringValue #define SafeStringValue(v) do {\ StringValue(v);\ rb_check_safe_str(v);\ } while (0) #endif #ifndef HAVE_RB_DEFINE_ALLOC_FUNC #define rb_define_alloc_func(klass, func) rb_define_singleton_method((klass), "new", VALUEFUNC((func)), -1) #define rb_undef_alloc_func(klass) rb_undef_method(CLASS_OF((klass)), "new") #endif static VALUE _mSWIG = Qnil; swig-4.0.1/Lib/ruby/std_multiset.i0000644000175000017500000000263513527063513016737 0ustar williamwilliam/* Multisets */ %include %fragment("StdMultisetTraits","header",fragment="StdSequenceTraits") %{ namespace swig { template inline void assign(const RubySeq& rubyseq, std::multiset* seq) { // seq->insert(rubyseq.begin(), rubyseq.end()); // not used as not always implemented typedef typename RubySeq::value_type value_type; typename RubySeq::const_iterator it = rubyseq.begin(); for (;it != rubyseq.end(); ++it) { seq->insert(seq->end(),(value_type)(*it)); } } template struct traits_asptr > { static int asptr(VALUE obj, std::multiset **m) { return traits_asptr_stdseq >::asptr(obj, m); } }; template struct traits_from > { static VALUE from(const std::multiset& vec) { return traits_from_stdseq >::from(vec); } }; } %} #define %swig_multiset_methods(Set...) %swig_set_methods(Set) %mixin std::multiset "Enumerable"; %rename("delete") std::multiset::__delete__; %rename("reject!") std::multiset::reject_bang; %rename("map!") std::multiset::map_bang; %rename("empty?") std::multiset::empty; %rename("include?" ) std::multiset::__contains__ const; %rename("has_key?" ) std::multiset::has_key const; %alias std::multiset::push "<<"; %include swig-4.0.1/Lib/ruby/rubyruntime.swg0000644000175000017500000000064713527063513017155 0ustar williamwilliam %runtime "swiglabels.swg" /* Common C API type-checking code */ %runtime "swigrun.swg" /* Common C API type-checking code */ %runtime "swigerrors.swg" /* SWIG errors */ %runtime "rubyhead.swg" /* Ruby includes and fixes */ %runtime "rubyerrors.swg" /* Ruby errors */ %runtime "rubytracking.swg" /* API for tracking C++ classes to Ruby objects */ %runtime "rubyapi.swg" %runtime "rubyrun.swg" swig-4.0.1/Lib/ruby/rubytracking.swg0000644000175000017500000001074313527063513017272 0ustar williamwilliam/* ----------------------------------------------------------------------------- * rubytracking.swg * * This file contains support for tracking mappings from * Ruby objects to C++ objects. This functionality is needed * to implement mark functions for Ruby's mark and sweep * garbage collector. * ----------------------------------------------------------------------------- */ #ifdef __cplusplus extern "C" { #endif #if !defined(ST_DATA_T_DEFINED) /* Needs to be explicitly included for Ruby 1.8 and earlier */ #include #endif /* Ruby 1.8 actually assumes the first case. */ #if SIZEOF_VOIDP == SIZEOF_LONG # define SWIG2NUM(v) LONG2NUM((unsigned long)v) # define NUM2SWIG(x) (unsigned long)NUM2LONG(x) #elif SIZEOF_VOIDP == SIZEOF_LONG_LONG # define SWIG2NUM(v) LL2NUM((unsigned long long)v) # define NUM2SWIG(x) (unsigned long long)NUM2LL(x) #else # error sizeof(void*) is not the same as long or long long #endif /* Global hash table to store Trackings from C/C++ structs to Ruby Objects. */ static st_table* swig_ruby_trackings = NULL; static VALUE swig_ruby_trackings_count(ANYARGS) { return SWIG2NUM(swig_ruby_trackings->num_entries); } /* Setup a hash table to store Trackings */ SWIGRUNTIME void SWIG_RubyInitializeTrackings(void) { /* Create a hash table to store Trackings from C++ objects to Ruby objects. */ /* Try to see if some other .so has already created a tracking hash table, which we keep hidden in an instance var in the SWIG module. This is done to allow multiple DSOs to share the same tracking table. */ VALUE trackings_value = Qnil; /* change the variable name so that we can mix modules compiled with older SWIG's - this used to be called "@__trackings__" */ ID trackings_id = rb_intern( "@__safetrackings__" ); VALUE verbose = rb_gv_get("VERBOSE"); rb_gv_set("VERBOSE", Qfalse); trackings_value = rb_ivar_get( _mSWIG, trackings_id ); rb_gv_set("VERBOSE", verbose); /* The trick here is that we have to store the hash table pointer in a Ruby variable. We do not want Ruby's GC to treat this pointer as a Ruby object, so we convert it to a Ruby numeric value. */ if (trackings_value == Qnil) { /* No, it hasn't. Create one ourselves */ swig_ruby_trackings = st_init_numtable(); rb_ivar_set( _mSWIG, trackings_id, SWIG2NUM(swig_ruby_trackings) ); } else { swig_ruby_trackings = (st_table*)NUM2SWIG(trackings_value); } rb_define_virtual_variable("SWIG_TRACKINGS_COUNT", swig_ruby_trackings_count, NULL); } /* Add a Tracking from a C/C++ struct to a Ruby object */ SWIGRUNTIME void SWIG_RubyAddTracking(void* ptr, VALUE object) { /* Store the mapping to the global hash table. */ st_insert(swig_ruby_trackings, (st_data_t)ptr, object); } /* Get the Ruby object that owns the specified C/C++ struct */ SWIGRUNTIME VALUE SWIG_RubyInstanceFor(void* ptr) { /* Now lookup the value stored in the global hash table */ VALUE value; if (st_lookup(swig_ruby_trackings, (st_data_t)ptr, &value)) { return value; } else { return Qnil; } } /* Remove a Tracking from a C/C++ struct to a Ruby object. It is very important to remove objects once they are destroyed since the same memory address may be reused later to create a new object. */ SWIGRUNTIME void SWIG_RubyRemoveTracking(void* ptr) { /* Delete the object from the hash table */ st_delete(swig_ruby_trackings, (st_data_t *)&ptr, NULL); } /* This is a helper method that unlinks a Ruby object from its underlying C++ object. This is needed if the lifetime of the Ruby object is longer than the C++ object. */ SWIGRUNTIME void SWIG_RubyUnlinkObjects(void* ptr) { VALUE object = SWIG_RubyInstanceFor(ptr); if (object != Qnil) { // object might have the T_ZOMBIE type, but that's just // because the GC has flagged it as such for a deferred // destruction. Until then, it's still a T_DATA object. DATA_PTR(object) = 0; } } /* This is a helper method that iterates over all the trackings passing the C++ object pointer and its related Ruby object to the passed callback function. */ /* Proxy method to abstract the internal trackings datatype */ static int swig_ruby_internal_iterate_callback(void* ptr, VALUE obj, void(*meth)(void* ptr, VALUE obj)) { (*meth)(ptr, obj); return ST_CONTINUE; } SWIGRUNTIME void SWIG_RubyIterateTrackings( void(*meth)(void* ptr, VALUE obj) ) { st_foreach(swig_ruby_trackings, (int (*)(ANYARGS))&swig_ruby_internal_iterate_callback, (st_data_t)meth); } #ifdef __cplusplus } #endif swig-4.0.1/Lib/ruby/director.swg0000644000175000017500000001564613527063513016410 0ustar williamwilliam/* ----------------------------------------------------------------------------- * director.swg * * This file contains support for director classes so that Ruby proxy * methods can be called from C++. * ----------------------------------------------------------------------------- */ /* Use -DSWIG_DIRECTOR_NOUEH if you prefer to avoid the use of the Undefined Exception Handler provided by swig. */ #ifndef SWIG_DIRECTOR_NOUEH #ifndef SWIG_DIRECTOR_UEH #define SWIG_DIRECTOR_UEH #endif #endif #include #include #include #include # define SWIG_DIRECTOR_CAST(ARG) dynamic_cast(ARG) namespace Swig { /* memory handler */ struct GCItem { virtual ~GCItem() { } virtual swig_ruby_owntype get_own() const { swig_ruby_owntype own = {0, 0}; return own; } }; struct GCItem_var { GCItem_var(GCItem *item = 0) : _item(item) { } GCItem_var& operator=(GCItem *item) { GCItem *tmp = _item; _item = item; delete tmp; return *this; } ~GCItem_var() { delete _item; } GCItem *operator->() const { return _item; } private: GCItem *_item; }; template struct GCItem_T : GCItem { GCItem_T(Type *ptr) : _ptr(ptr) { } virtual ~GCItem_T() { delete _ptr; } private: Type *_ptr; }; struct GCItem_Object : GCItem { GCItem_Object(swig_ruby_owntype own) : _own(own) { } virtual ~GCItem_Object() { } swig_ruby_owntype get_own() const { return _own; } private: swig_ruby_owntype _own; }; template struct GCArray_T : GCItem { GCArray_T(Type *ptr) : _ptr(ptr) { } virtual ~GCArray_T() { delete[] _ptr; } private: Type *_ptr; }; /* body args */ struct body_args { VALUE recv; ID id; int argc; VALUE *argv; }; /* Base class for director exceptions */ class DirectorException : public std::exception { protected: VALUE swig_error; std::string swig_msg; protected: DirectorException(VALUE error) : swig_error(error) { } DirectorException(VALUE error, const char *hdr, const char *msg ="") : swig_error(error), swig_msg(hdr) { if (msg[0]) { swig_msg += " "; swig_msg += msg; } if (swig_msg.size()) { VALUE str = rb_str_new(swig_msg.data(), swig_msg.size()); swig_error = rb_exc_new3(error, str); } else { swig_error = error; } } public: virtual ~DirectorException() throw() { } VALUE getType() const { return CLASS_OF(swig_error); } VALUE getError() const { return swig_error; } /* Deprecated, use what() instead */ const std::string& getMessage() const { return swig_msg; } const char *what() const throw() { return swig_msg.c_str(); } }; /* Type mismatch in the return value from a Ruby method call */ class DirectorTypeMismatchException : public DirectorException { public: DirectorTypeMismatchException(VALUE error, const char *msg="") : DirectorException(error, "SWIG director type mismatch", msg) { } DirectorTypeMismatchException(const char *msg="") : DirectorException(rb_eTypeError, "SWIG director type mismatch", msg) { } static void raise(VALUE error, const char *msg) { throw DirectorTypeMismatchException(error, msg); } static void raise(const char *msg) { throw DirectorTypeMismatchException(msg); } }; /* Any Ruby exception that occurs during a director method call */ class DirectorMethodException : public DirectorException { public: DirectorMethodException(VALUE error) : DirectorException(error) { } DirectorMethodException(const char *msg = "") : DirectorException(rb_eRuntimeError, "SWIG director method error.", msg) { } static void raise(VALUE error) { throw DirectorMethodException(error); } }; /* Attempted to call a pure virtual method via a director method */ class DirectorPureVirtualException : public DirectorException { public: DirectorPureVirtualException(const char *msg = "") : DirectorException(rb_eRuntimeError, "SWIG director pure virtual method called", msg) { } static void raise(const char *msg) { throw DirectorPureVirtualException(msg); } }; /* Simple thread abstraction for pthreads on win32 */ #ifdef __THREAD__ # define __PTHREAD__ # if defined(_WIN32) || defined(__WIN32__) # define pthread_mutex_lock EnterCriticalSection # define pthread_mutex_unlock LeaveCriticalSection # define pthread_mutex_t CRITICAL_SECTION # define SWIG_MUTEX_INIT(var) var # else # include # define SWIG_MUTEX_INIT(var) var = PTHREAD_MUTEX_INITIALIZER # endif #endif #ifdef __PTHREAD__ struct Guard { pthread_mutex_t *_mutex; Guard(pthread_mutex_t &mutex) : _mutex(&mutex) { pthread_mutex_lock(_mutex); } ~Guard() { pthread_mutex_unlock(_mutex); } }; # define SWIG_GUARD(mutex) Guard _guard(mutex) #else # define SWIG_GUARD(mutex) #endif /* director base class */ class Director { private: /* pointer to the wrapped Ruby object */ VALUE swig_self; /* flag indicating whether the object is owned by Ruby or c++ */ mutable bool swig_disown_flag; public: /* wrap a Ruby object. */ Director(VALUE self) : swig_self(self), swig_disown_flag(false) { } /* discard our reference at destruction */ virtual ~Director() { } /* return a pointer to the wrapped Ruby object */ VALUE swig_get_self() const { return swig_self; } /* acquire ownership of the wrapped Ruby object (the sense of "disown" is from Ruby) */ void swig_disown() const { if (!swig_disown_flag) { swig_disown_flag = true; } } /* ownership management */ private: typedef std::map swig_ownership_map; mutable swig_ownership_map swig_owner; #ifdef __PTHREAD__ static pthread_mutex_t swig_mutex_own; #endif public: template void swig_acquire_ownership_array(Type *vptr) const { if (vptr) { SWIG_GUARD(swig_mutex_own); swig_owner[vptr] = new GCArray_T(vptr); } } template void swig_acquire_ownership(Type *vptr) const { if (vptr) { SWIG_GUARD(swig_mutex_own); swig_owner[vptr] = new GCItem_T(vptr); } } void swig_acquire_ownership_obj(void *vptr, swig_ruby_owntype own) const { if (vptr && own.datafree) { SWIG_GUARD(swig_mutex_own); swig_owner[vptr] = new GCItem_Object(own); } } swig_ruby_owntype swig_release_ownership(void *vptr) const { swig_ruby_owntype own = {0, 0}; if (vptr) { SWIG_GUARD(swig_mutex_own); swig_ownership_map::iterator iter = swig_owner.find(vptr); if (iter != swig_owner.end()) { own.datafree = iter->second->get_own().datafree; swig_owner.erase(iter); } } return own; } }; } swig-4.0.1/Lib/ruby/rubyiterators.swg0000644000175000017500000005445013527063513017507 0ustar williamwilliam/* ----------------------------------------------------------------------------- * rubyiterators.swg * * Implement a C++ 'output' iterator for Ruby. * * Users can derive form the Iterator to implement their * own iterators. As an example (real one since we use it for STL/STD * containers), the template Iterator_T does the * implementation for generic C++ iterators. * ----------------------------------------------------------------------------- */ %include %fragment("ConstIterator","header",fragment="",fragment="GC_VALUE_definition") { namespace swig { struct stop_iteration { }; /** * Abstract base class used to represent all iterators of STL containers. */ struct ConstIterator { public: typedef ConstIterator self_type; protected: GC_VALUE _seq; protected: ConstIterator(VALUE seq) : _seq(seq) { } // Random access iterator methods, but not required in Ruby virtual ptrdiff_t distance(const ConstIterator &x) const { throw std::invalid_argument("distance not supported"); } virtual bool equal (const ConstIterator &x) const { throw std::invalid_argument("equal not supported"); } virtual self_type* advance(ptrdiff_t n) { throw std::invalid_argument("advance not supported"); } public: virtual ~ConstIterator() {} // Access iterator method, required by Ruby virtual VALUE value() const { throw std::invalid_argument("value not supported"); return Qnil; }; virtual VALUE setValue( const VALUE& v ) { throw std::invalid_argument("value= not supported"); return Qnil; } virtual self_type* next( size_t n = 1 ) { return this->advance( n ); } virtual self_type* previous( size_t n = 1 ) { ptrdiff_t nn = n; return this->advance( -nn ); } virtual VALUE to_s() const { throw std::invalid_argument("to_s not supported"); return Qnil; } virtual VALUE inspect() const { throw std::invalid_argument("inspect not supported"); return Qnil; } virtual ConstIterator *dup() const { throw std::invalid_argument("dup not supported"); return NULL; } // // C++ common/needed methods. We emulate a bidirectional // operator, to be compatible with all the STL. // The iterator traits will then tell the STL what type of // iterator we really are. // ConstIterator() : _seq( Qnil ) { } ConstIterator( const self_type& b ) : _seq( b._seq ) { } self_type& operator=( const self_type& b ) { _seq = b._seq; return *this; } bool operator == (const ConstIterator& x) const { return equal(x); } bool operator != (const ConstIterator& x) const { return ! operator==(x); } // Pre-decrement operator self_type& operator--() { return *previous(); } // Pre-increment operator self_type& operator++() { return *next(); } // Post-decrement operator self_type operator--(int) { self_type r = *this; previous(); return r; } // Post-increment operator self_type operator++(int) { self_type r = *this; next(); return r; } ConstIterator& operator += (ptrdiff_t n) { return *advance(n); } ConstIterator& operator -= (ptrdiff_t n) { return *advance(-n); } ConstIterator* operator + (ptrdiff_t n) const { return dup()->advance(n); } ConstIterator* operator - (ptrdiff_t n) const { return dup()->advance(-n); } ptrdiff_t operator - (const ConstIterator& x) const { return x.distance(*this); } static swig_type_info* descriptor() { static int init = 0; static swig_type_info* desc = 0; if (!init) { desc = SWIG_TypeQuery("swig::ConstIterator *"); init = 1; } return desc; } }; /** * Abstract base class used to represent all non-const iterators of STL containers. * */ struct Iterator : public ConstIterator { public: typedef Iterator self_type; protected: Iterator(VALUE seq) : ConstIterator(seq) { } virtual self_type* advance(ptrdiff_t n) { throw std::invalid_argument("operation not supported"); } public: static swig_type_info* descriptor() { static int init = 0; static swig_type_info* desc = 0; if (!init) { desc = SWIG_TypeQuery("swig::Iterator *"); init = 1; } return desc; } virtual Iterator *dup() const { throw std::invalid_argument("dup not supported"); return NULL; } virtual self_type* next( size_t n = 1 ) { return this->advance( n ); } virtual self_type* previous( size_t n = 1 ) { ptrdiff_t nn = n; return this->advance( -nn ); } bool operator == (const ConstIterator& x) const { return equal(x); } bool operator != (const Iterator& x) const { return ! operator==(x); } Iterator& operator += (ptrdiff_t n) { return *advance(n); } Iterator& operator -= (ptrdiff_t n) { return *advance(-n); } Iterator* operator + (ptrdiff_t n) const { return dup()->advance(n); } Iterator* operator - (ptrdiff_t n) const { return dup()->advance(-n); } ptrdiff_t operator - (const Iterator& x) const { return x.distance(*this); } }; } } %fragment("ConstIterator_T","header",fragment="",fragment="ConstIterator",fragment="StdTraits",fragment="StdIteratorTraits") { namespace swig { /** * Templated base classes for all custom const_iterators. * */ template class ConstIterator_T : public ConstIterator { public: typedef OutConstIterator const_iter; typedef typename std::iterator_traits::value_type value_type; typedef ConstIterator_T self_type; protected: virtual bool equal (const ConstIterator &iter) const { const self_type *iters = dynamic_cast(&iter); if (iters) { return (current == iters->get_current()); } else { throw std::invalid_argument("bad iterator type"); } } virtual ptrdiff_t distance(const ConstIterator &iter) const { const self_type *iters = dynamic_cast(&iter); if (iters) { return std::distance(current, iters->get_current()); } else { throw std::invalid_argument("bad iterator type"); } } virtual ConstIterator* advance(ptrdiff_t n) { std::advance( current, n ); return this; } public: ConstIterator_T() : ConstIterator(Qnil) { } ConstIterator_T(const_iter curr, VALUE seq = Qnil) : ConstIterator(seq), current(curr) { } const const_iter& get_current() const { return current; } const value_type& operator*() const { return *current; } virtual VALUE inspect() const { VALUE ret = rb_str_new2("#<"); ret = rb_str_cat2( ret, rb_obj_classname(_seq) ); ret = rb_str_cat2( ret, "::const_iterator " ); VALUE cur = value(); ret = rb_str_concat( ret, rb_inspect(cur) ); ret = rb_str_cat2( ret, ">" ); return ret; } virtual VALUE to_s() const { VALUE ret = rb_str_new2( rb_obj_classname(_seq) ); ret = rb_str_cat2( ret, "::const_iterator " ); VALUE cur = value(); ret = rb_str_concat( ret, rb_obj_as_string(cur) ); return ret; } protected: const_iter current; }; /** * Templated base classes for all custom non-const iterators. * */ template class Iterator_T : public Iterator { public: typedef InOutIterator nonconst_iter; // Make this class iterator STL compatible, by using iterator_traits typedef typename std::iterator_traits::iterator_category iterator_category; typedef typename std::iterator_traits::value_type value_type; typedef typename std::iterator_traits::difference_type difference_type; typedef typename std::iterator_traits::pointer pointer; typedef typename std::iterator_traits::reference reference; typedef Iterator base; typedef Iterator_T< nonconst_iter > self_type; protected: virtual bool equal (const ConstIterator &iter) const { const self_type *iters = dynamic_cast(&iter); if (iters) { return (current == iters->get_current()); } else { throw std::invalid_argument("bad iterator type"); } } virtual ptrdiff_t distance(const ConstIterator &iter) const { const self_type *iters = dynamic_cast(&iter); if (iters) { return std::distance(current, iters->get_current()); } else { throw std::invalid_argument("bad iterator type"); } } virtual Iterator* advance(ptrdiff_t n) { std::advance( current, n ); return this; } public: Iterator_T(nonconst_iter curr, VALUE seq = Qnil) : Iterator(seq), current(curr) { } const nonconst_iter& get_current() const { return current; } self_type& operator=( const self_type& b ) { base::operator=( b ); return *this; } self_type& operator=( const value_type& b ) { *current = b; return *this; } const value_type& operator*() const { return *current; } value_type& operator*() { return *current; } virtual VALUE inspect() const { VALUE ret = rb_str_new2("#<"); ret = rb_str_cat2( ret, rb_obj_classname(_seq) ); ret = rb_str_cat2( ret, "::iterator " ); VALUE cur = value(); ret = rb_str_concat( ret, rb_inspect(cur) ); ret = rb_str_cat2( ret, ">" ); return ret; } virtual VALUE to_s() const { VALUE ret = rb_str_new2( rb_obj_classname(_seq) ); ret = rb_str_cat2( ret, "::iterator " ); VALUE cur = value(); ret = rb_str_concat( ret, rb_obj_as_string(cur) ); return ret; } protected: nonconst_iter current; }; /** * Auxiliary functor to store the value of a ruby object inside * a reference of a compatible C++ type. ie: Ruby -> C++ * */ template struct asval_oper { typedef ValueType value_type; typedef bool result_type; bool operator()(VALUE obj, value_type& v) const { return ( swig::asval< value_type >(obj, &v) == SWIG_OK ); } }; /** * Auxiliary functor to return a ruby object from a C++ type. * ie: C++ -> Ruby * */ template struct from_oper { typedef const ValueType& argument_type; typedef VALUE result_type; result_type operator()(argument_type v) const { return swig::from(v); } }; /** * ConstIterator class for a const_iterator with no end() boundaries. * */ template::value_type, typename FromOper = from_oper > class ConstIteratorOpen_T : public ConstIterator_T { public: FromOper from; typedef OutConstIterator const_iter; typedef ValueType value_type; typedef ConstIterator_T base; typedef ConstIteratorOpen_T self_type; ConstIteratorOpen_T(const_iter curr, VALUE seq = Qnil) : ConstIterator_T(curr, seq) { } virtual VALUE value() const { return from(static_cast(*(base::current))); } ConstIterator *dup() const { return new self_type(*this); } }; /** * Iterator class for an iterator with no end() boundaries. * */ template::value_type, typename FromOper = from_oper, typename AsvalOper = asval_oper > class IteratorOpen_T : public Iterator_T { public: FromOper from; AsvalOper asval; typedef InOutIterator nonconst_iter; typedef ValueType value_type; typedef Iterator_T base; typedef IteratorOpen_T self_type; public: IteratorOpen_T(nonconst_iter curr, VALUE seq = Qnil) : Iterator_T(curr, seq) { } virtual VALUE value() const { return from(static_cast(*(base::current))); } virtual VALUE setValue( const VALUE& v ) { value_type& dst = *base::current; if ( asval(v, dst) ) return v; return Qnil; } Iterator *dup() const { return new self_type(*this); } }; /** * ConstIterator class for a const_iterator where begin() and end() boundaries are known. * */ template::value_type, typename FromOper = from_oper > class ConstIteratorClosed_T : public ConstIterator_T { public: FromOper from; typedef OutConstIterator const_iter; typedef ValueType value_type; typedef ConstIterator_T base; typedef ConstIteratorClosed_T self_type; protected: virtual ConstIterator* advance(ptrdiff_t n) { std::advance( base::current, n ); if ( base::current == end ) throw stop_iteration(); return this; } public: ConstIteratorClosed_T(const_iter curr, const_iter first, const_iter last, VALUE seq = Qnil) : ConstIterator_T(curr, seq), begin(first), end(last) { } virtual VALUE value() const { if (base::current == end) { throw stop_iteration(); } else { return from(static_cast(*(base::current))); } } ConstIterator *dup() const { return new self_type(*this); } private: const_iter begin; const_iter end; }; /** * Iterator class for a iterator where begin() and end() boundaries are known. * */ template::value_type, typename FromOper = from_oper, typename AsvalOper = asval_oper > class IteratorClosed_T : public Iterator_T { public: FromOper from; AsvalOper asval; typedef InOutIterator nonconst_iter; typedef ValueType value_type; typedef Iterator_T base; typedef IteratorClosed_T self_type; protected: virtual Iterator* advance(ptrdiff_t n) { std::advance( base::current, n ); if ( base::current == end ) throw stop_iteration(); return this; } public: IteratorClosed_T(nonconst_iter curr, nonconst_iter first, nonconst_iter last, VALUE seq = Qnil) : Iterator_T(curr, seq), begin(first), end(last) { } virtual VALUE value() const { if (base::current == end) { throw stop_iteration(); } else { return from(static_cast(*(base::current))); } } // Iterator setter method, required by Ruby virtual VALUE setValue( const VALUE& v ) { if (base::current == end) throw stop_iteration(); value_type& dst = *base::current; if ( asval( v, dst ) ) return v; return Qnil; } Iterator *dup() const { return new self_type(*this); } private: nonconst_iter begin; nonconst_iter end; }; /* Partial specialization for bools which don't allow de-referencing */ template< typename InOutIterator, typename FromOper, typename AsvalOper > class IteratorOpen_T< InOutIterator, bool, FromOper, AsvalOper > : public Iterator_T { public: FromOper from; AsvalOper asval; typedef InOutIterator nonconst_iter; typedef bool value_type; typedef Iterator_T base; typedef IteratorOpen_T self_type; IteratorOpen_T(nonconst_iter curr, VALUE seq = Qnil) : Iterator_T(curr, seq) { } virtual VALUE value() const { return from(static_cast(*(base::current))); } virtual VALUE setValue( const VALUE& v ) { bool tmp = *base::current; if ( asval( v, tmp ) ) { *base::current = tmp; return v; } return Qnil; } Iterator *dup() const { return new self_type(*this); } }; /* Partial specialization for bools which don't allow de-referencing */ template< typename InOutIterator, typename FromOper, typename AsvalOper > class IteratorClosed_T< InOutIterator, bool, FromOper, AsvalOper > : public Iterator_T { public: FromOper from; AsvalOper asval; typedef InOutIterator nonconst_iter; typedef bool value_type; typedef Iterator_T base; typedef IteratorClosed_T self_type; protected: virtual Iterator* advance(ptrdiff_t n) { std::advance( base::current, n ); if ( base::current == end ) throw stop_iteration(); return this; } public: IteratorClosed_T(nonconst_iter curr, nonconst_iter first, nonconst_iter last, VALUE seq = Qnil) : Iterator_T(curr, seq), begin(first), end(last) { } virtual VALUE value() const { if (base::current == end) { throw stop_iteration(); } else { return from(static_cast(*(base::current))); } } virtual VALUE setValue( const VALUE& v ) { if (base::current == end) throw stop_iteration(); bool tmp = *base::current; if ( asval( v, tmp ) ) { *base::current = tmp; return v; } return Qnil; } Iterator *dup() const { return new self_type(*this); } private: nonconst_iter begin; nonconst_iter end; }; /** * Helper function used to wrap a bounded const_iterator. This is to be used in * a %typemap(out), for example. * */ template inline Iterator* make_nonconst_iterator(const InOutIter& current, const InOutIter& begin, const InOutIter& end, VALUE seq = Qnil) { return new IteratorClosed_T(current, begin, end, seq); } /** * Helper function used to wrap an unbounded const_iterator. This is to be used in * a %typemap(out), for example. * */ template inline Iterator* make_nonconst_iterator(const InOutIter& current, VALUE seq = Qnil) { return new IteratorOpen_T(current, seq); } /** * Helper function used to wrap a bounded const_iterator. This is to be used in * a %typemap(out), for example. * */ template inline ConstIterator* make_const_iterator(const OutIter& current, const OutIter& begin, const OutIter& end, VALUE seq = Qnil) { return new ConstIteratorClosed_T(current, begin, end, seq); } /** * Helper function used to wrap an unbounded const_iterator. This is to be used in * a %typemap(out), for example. * */ template inline ConstIterator* make_const_iterator(const OutIter& current, VALUE seq = Qnil) { return new ConstIteratorOpen_T(current, seq); } } } %fragment("ConstIterator"); // // This part is just so SWIG is aware of the base abstract iterator class. // namespace swig { /* Throw a StopIteration exception */ %ignore stop_iteration; struct stop_iteration {}; %typemap(throws) stop_iteration { (void)$1; SWIG_Ruby_ExceptionType(NULL, Qnil); SWIG_fail; } /* Mark methods that return new objects */ %newobject ConstIterator::dup; %newobject ConstIterator::operator + (ptrdiff_t n) const; %newobject ConstIterator::operator - (ptrdiff_t n) const; %nodirector ConstIterator; %catches(swig::stop_iteration) ConstIterator::value() const; %catches(swig::stop_iteration) ConstIterator::incr(size_t n = 1); %catches(swig::stop_iteration) ConstIterator::decr(size_t n = 1); %catches(std::invalid_argument) ConstIterator::distance(const ConstIterator &x) const; %catches(std::invalid_argument) ConstIterator::equal (const ConstIterator &x) const; %catches(swig::stop_iteration) ConstIterator::next(); %catches(swig::stop_iteration) ConstIterator::previous(); %catches(swig::stop_iteration) ConstIterator::advance(ptrdiff_t n); %catches(swig::stop_iteration) ConstIterator::operator += (ptrdiff_t n); %catches(swig::stop_iteration) ConstIterator::operator -= (ptrdiff_t n); %catches(swig::stop_iteration) ConstIterator::operator + (ptrdiff_t n) const; %catches(swig::stop_iteration) ConstIterator::operator - (ptrdiff_t n) const; struct ConstIterator { protected: ConstIterator(VALUE seq); public: virtual ~ConstIterator(); // Access iterator method, required by Ruby virtual VALUE value() const; // C++ common/needed methods virtual ConstIterator *dup() const; virtual VALUE inspect() const; virtual VALUE to_s() const; virtual ConstIterator* next(size_t n = 1); virtual ConstIterator* previous(size_t n = 1); bool operator == (const ConstIterator& x) const; ConstIterator* operator + (ptrdiff_t n) const; ConstIterator* operator - (ptrdiff_t n) const; ptrdiff_t operator - (const ConstIterator& x) const; }; struct Iterator : public ConstIterator { %rename("value=") setValue( const VALUE& v ); virtual VALUE setValue( const VALUE& v ); virtual Iterator *dup() const; virtual Iterator* next(size_t n = 1); virtual Iterator* previous(size_t n = 1); virtual VALUE inspect() const; virtual VALUE to_s() const; bool operator == (const Iterator& x) const; Iterator* operator + (ptrdiff_t n) const; Iterator* operator - (ptrdiff_t n) const; ptrdiff_t operator - (const Iterator& x) const; }; } swig-4.0.1/Lib/ruby/rubyerrors.swg0000644000175000017500000000720213527063513017000 0ustar williamwilliam/* ----------------------------------------------------------------------------- * error manipulation * ----------------------------------------------------------------------------- */ /* Define some additional error types */ #define SWIG_ObjectPreviouslyDeletedError -100 /* Define custom exceptions for errors that do not map to existing Ruby exceptions. Note this only works for C++ since a global cannot be initialized by a function in C. For C, fallback to rb_eRuntimeError.*/ SWIGINTERN VALUE getNullReferenceError(void) { static int init = 0; static VALUE rb_eNullReferenceError ; if (!init) { init = 1; rb_eNullReferenceError = rb_define_class("NullReferenceError", rb_eRuntimeError); } return rb_eNullReferenceError; } SWIGINTERN VALUE getObjectPreviouslyDeletedError(void) { static int init = 0; static VALUE rb_eObjectPreviouslyDeleted ; if (!init) { init = 1; rb_eObjectPreviouslyDeleted = rb_define_class("ObjectPreviouslyDeleted", rb_eRuntimeError); } return rb_eObjectPreviouslyDeleted; } SWIGINTERN VALUE SWIG_Ruby_ErrorType(int SWIG_code) { VALUE type; switch (SWIG_code) { case SWIG_MemoryError: type = rb_eNoMemError; break; case SWIG_IOError: type = rb_eIOError; break; case SWIG_RuntimeError: type = rb_eRuntimeError; break; case SWIG_IndexError: type = rb_eIndexError; break; case SWIG_TypeError: type = rb_eTypeError; break; case SWIG_DivisionByZero: type = rb_eZeroDivError; break; case SWIG_OverflowError: type = rb_eRangeError; break; case SWIG_SyntaxError: type = rb_eSyntaxError; break; case SWIG_ValueError: type = rb_eArgError; break; case SWIG_SystemError: type = rb_eFatal; break; case SWIG_AttributeError: type = rb_eRuntimeError; break; case SWIG_NullReferenceError: type = getNullReferenceError(); break; case SWIG_ObjectPreviouslyDeletedError: type = getObjectPreviouslyDeletedError(); break; case SWIG_UnknownError: type = rb_eRuntimeError; break; default: type = rb_eRuntimeError; } return type; } /* This function is called when a user inputs a wrong argument to a method. */ SWIGINTERN const char* Ruby_Format_TypeError( const char* msg, const char* type, const char* name, const int argn, VALUE input ) { char buf[128]; VALUE str; VALUE asStr; if ( msg && *msg ) { str = rb_str_new2(msg); } else { str = rb_str_new(NULL, 0); } str = rb_str_cat2( str, "Expected argument " ); sprintf( buf, "%d of type ", argn-1 ); str = rb_str_cat2( str, buf ); str = rb_str_cat2( str, type ); str = rb_str_cat2( str, ", but got " ); str = rb_str_cat2( str, rb_obj_classname(input) ); str = rb_str_cat2( str, " " ); asStr = rb_inspect(input); if ( RSTRING_LEN(asStr) > 30 ) { str = rb_str_cat( str, StringValuePtr(asStr), 30 ); str = rb_str_cat2( str, "..." ); } else { str = rb_str_append( str, asStr ); } if ( name ) { str = rb_str_cat2( str, "\n\tin SWIG method '" ); str = rb_str_cat2( str, name ); str = rb_str_cat2( str, "'" ); } return StringValuePtr( str ); } /* This function is called when an overloaded method fails */ SWIGINTERN void Ruby_Format_OverloadedError( const int argc, const int maxargs, const char* method, const char* prototypes ) { const char* msg = "Wrong # of arguments"; if ( argc <= maxargs ) msg = "Wrong arguments"; rb_raise(rb_eArgError,"%s for overloaded method '%s'.\n" "Possible C/C++ prototypes are:\n%s", msg, method, prototypes); } swig-4.0.1/Lib/ruby/cpointer.i0000644000175000017500000000004113527063513016027 0ustar williamwilliam%include swig-4.0.1/Lib/ruby/std_shared_ptr.i0000644000175000017500000001022713527063513017220 0ustar williamwilliam#define SWIG_SHARED_PTR_NAMESPACE std %include %include %fragment("StdSharedPtrTraits","header",fragment="StdTraitsForwardDeclaration",fragment="") { namespace swig { /* Template specialization for functions defined in rubystdcommon.swg. Special handling for shared_ptr is required as, shared_ptr * is used rather than the usual T *, see shared_ptr.i. */ template struct traits_asptr > { static int asptr(VALUE obj, std::shared_ptr **val) { std::shared_ptr *p = 0; swig_type_info *descriptor = type_info >(); swig_ruby_owntype newmem = {0, 0}; int res = descriptor ? SWIG_ConvertPtrAndOwn(obj, (void **)&p, descriptor, 0, &newmem) : SWIG_ERROR; if (SWIG_IsOK(res)) { if (val) { if (*val) { **val = p ? *p : std::shared_ptr(); } else { *val = p; if (newmem.own & SWIG_CAST_NEW_MEMORY) { // Upcast for pointers to shared_ptr in this generic framework has not been implemented res = SWIG_ERROR; } } } if (newmem.own & SWIG_CAST_NEW_MEMORY) delete p; } return res; } }; template struct traits_asval > { static int asval(VALUE obj, std::shared_ptr *val) { if (val) { std::shared_ptr ret; std::shared_ptr *p = &ret; int res = traits_asptr >::asptr(obj, &p); if (!SWIG_IsOK(res)) return res; *val = ret; return SWIG_OK; } else { return traits_asptr >::asptr(obj, (std::shared_ptr **)(0)); } } }; template struct traits_asval *> { static int asval(VALUE obj, std::shared_ptr **val) { if (val) { typedef typename noconst_traits >::noconst_type noconst_type; if (*val) { noconst_type ret; noconst_type *p = &ret; int res = traits_asptr::asptr(obj, &p); if (SWIG_IsOK(res)) **(const_cast(val)) = ret; return res; } else { noconst_type *p = 0; int res = traits_asptr::asptr(obj, &p); if (SWIG_IsOK(res)) *val = p; return res; } } else { return traits_asptr >::asptr(obj, (std::shared_ptr **)(0)); } } }; template struct traits_as, pointer_category> { static std::shared_ptr as(VALUE obj) { std::shared_ptr ret; std::shared_ptr *v = &ret; int res = traits_asptr >::asptr(obj, &v); if (SWIG_IsOK(res)) { return ret; } else { VALUE lastErr = rb_gv_get("$!"); if (lastErr == Qnil) SWIG_Error(SWIG_TypeError, swig::type_name >()); throw std::invalid_argument("bad type"); } } }; template struct traits_as *, pointer_category> { static std::shared_ptr * as(VALUE obj) { std::shared_ptr *p = 0; int res = traits_asptr >::asptr(obj, &p); if (SWIG_IsOK(res)) { return p; } else { VALUE lastErr = rb_gv_get("$!"); if (lastErr == Qnil) SWIG_Error(SWIG_TypeError, swig::type_name *>()); throw std::invalid_argument("bad type"); } } }; template struct traits_from_ptr > { static VALUE from(std::shared_ptr *val, int owner = 0) { if (val && *val) { return SWIG_NewPointerObj(val, type_info >(), owner); } else { return Qnil; } } }; /* The descriptors in the shared_ptr typemaps remove the const qualifier for the SWIG type system. Remove const likewise here, otherwise SWIG_TypeQuery("std::shared_ptr") will return NULL. */ template struct traits_from > { static VALUE from(const std::shared_ptr& val) { std::shared_ptr p = std::const_pointer_cast(val); return swig::from(p); } }; } } %fragment("StdSharedPtrTraits"); swig-4.0.1/Lib/ruby/timeval.i0000644000175000017500000000223413527063513015653 0ustar williamwilliam/* struct timeval * time_t Ruby has builtin class Time. INPUT/OUTPUT typemap for timeval and time_t is provided. */ %{ #ifdef __cplusplus extern "C" { #endif #ifdef HAVE_SYS_TIME_H # include struct timeval rb_time_timeval(VALUE); #endif #ifdef __cplusplus } #endif %} %typemap(in) struct timeval *INPUT (struct timeval temp) { if (NIL_P($input)) $1 = NULL; else { temp = rb_time_timeval($input); $1 = &temp; } } %typemap(in,numinputs=0) struct timeval *OUTPUT(struct timeval temp) { $1 = &temp; } %typemap(argout) struct timeval *OUTPUT { $result = rb_time_new($1->tv_sec, $1->tv_usec); } %typemap(out) struct timeval * { $result = rb_time_new($1->tv_sec, $1->tv_usec); } %typemap(out) struct timespec * { $result = rb_time_new($1->tv_sec, $1->tv_nsec / 1000); } // time_t %typemap(in) time_t { if (NIL_P($input)) $1 = (time_t)-1; else $1 = NUM2LONG(rb_funcall($input, rb_intern("tv_sec"), 0)); } %typemap(typecheck) time_t { $1 = (NIL_P($input) || TYPE(rb_funcall($input, rb_intern("respond_to?"), 1, ID2SYM(rb_intern("tv_sec")))) == T_TRUE); } %typemap(out) time_t { $result = rb_time_new($1, 0); } swig-4.0.1/Lib/ruby/std_multimap.i0000644000175000017500000001375013527063513016721 0ustar williamwilliam/* Multimaps */ %include %fragment("StdMultimapTraits","header",fragment="StdMapCommonTraits") { namespace swig { template inline void assign(const RubySeq& rubyseq, std::multimap *multimap) { typedef typename std::multimap::value_type value_type; typename RubySeq::const_iterator it = rubyseq.begin(); for (;it != rubyseq.end(); ++it) { multimap->insert(value_type(it->first, it->second)); } } template struct traits_asptr > { typedef std::multimap multimap_type; static int asptr(VALUE obj, std::multimap **val) { int res = SWIG_ERROR; if ( TYPE(obj) == T_HASH ) { static ID id_to_a = rb_intern("to_a"); VALUE items = rb_funcall(obj, id_to_a, 0); return traits_asptr_stdseq, std::pair >::asptr(items, val); } else { multimap_type *p; res = SWIG_ConvertPtr(obj,(void**)&p,swig::type_info(),0); if (SWIG_IsOK(res) && val) *val = p; } return res; } }; template struct traits_from > { typedef std::multimap multimap_type; typedef typename multimap_type::const_iterator const_iterator; typedef typename multimap_type::size_type size_type; static VALUE from(const multimap_type& multimap) { swig_type_info *desc = swig::type_info(); if (desc && desc->clientdata) { return SWIG_NewPointerObj(new multimap_type(multimap), desc, SWIG_POINTER_OWN); } else { size_type size = multimap.size(); int rubysize = (size <= (size_type) INT_MAX) ? (int) size : -1; if (rubysize < 0) { SWIG_RUBY_THREAD_BEGIN_BLOCK; rb_raise(rb_eRuntimeError, "multimap size not valid in Ruby"); SWIG_RUBY_THREAD_END_BLOCK; return Qnil; } VALUE obj = rb_hash_new(); for (const_iterator i= multimap.begin(); i!= multimap.end(); ++i) { VALUE key = swig::from(i->first); VALUE val = swig::from(i->second); VALUE oldval = rb_hash_aref( obj, key ); if ( oldval == Qnil ) rb_hash_aset(obj, key, val); else { // Multiple values for this key, create array if needed // and add a new element to it. VALUE ary; if ( TYPE(oldval) == T_ARRAY ) ary = oldval; else { ary = rb_ary_new2(2); rb_ary_push( ary, oldval ); rb_hash_aset( obj, key, ary ); } rb_ary_push( ary, val ); } } return obj; } } }; } } %define %swig_multimap_methods(MultiMap...) %swig_map_common(%arg(MultiMap)); %extend { VALUE __getitem__(const key_type& key) const { std::pair r = $self->equal_range(key); if ( r.first != r.second ) { VALUE ary = rb_ary_new(); for (MultiMap::const_iterator i = r.first ; i != r.second; ++i ) { rb_ary_push( ary, swig::from( i->second ) ); } if ( RARRAY_LEN(ary) == 1 ) return RARRAY_PTR(ary)[0]; return ary; } else return Qnil; } void __setitem__(const key_type& key, const mapped_type& x) throw (std::out_of_range) { self->insert(MultiMap::value_type(key,x)); } VALUE inspect() { MultiMap::iterator i = $self->begin(); MultiMap::iterator e = $self->end(); const char *type_name = swig::type_name< MultiMap >(); VALUE str = rb_str_new2( type_name ); str = rb_str_cat2( str, " {" ); VALUE tmp; while ( i != e ) { const MultiMap::key_type& key = i->first; const MultiMap::key_type& oldkey = key; tmp = swig::from( key ); str = rb_str_buf_append( str, rb_inspect(tmp) ); str = rb_str_cat2( str, "=>" ); VALUE vals = rb_ary_new(); for ( ; i != e && key == oldkey; ++i ) { const MultiMap::mapped_type& val = i->second; tmp = swig::from( val ); rb_ary_push( vals, tmp ); } if ( RARRAY_LEN(vals) == 1 ) { str = rb_str_buf_append( str, rb_inspect(tmp) ); } else { str = rb_str_buf_append( str, rb_inspect(vals) ); } } str = rb_str_cat2( str, "}" ); return str; } VALUE to_a() { MultiMap::const_iterator i = $self->begin(); MultiMap::const_iterator e = $self->end(); VALUE ary = rb_ary_new2( std::distance( i, e ) ); VALUE tmp; while ( i != e ) { const MultiMap::key_type& key = i->first; const MultiMap::key_type& oldkey = key; tmp = swig::from( key ); rb_ary_push( ary, tmp ); VALUE vals = rb_ary_new(); for ( ; i != e && key == oldkey; ++i ) { const MultiMap::mapped_type& val = i->second; tmp = swig::from( val ); rb_ary_push( vals, tmp ); } if ( RARRAY_LEN(vals) == 1 ) { rb_ary_push( ary, tmp ); } else { rb_ary_push( ary, vals ); } } return ary; } VALUE to_s() { MultiMap::iterator i = $self->begin(); MultiMap::iterator e = $self->end(); VALUE str = rb_str_new2( "" ); VALUE tmp; while ( i != e ) { const MultiMap::key_type& key = i->first; const MultiMap::key_type& oldkey = key; tmp = swig::from( key ); tmp = rb_obj_as_string( tmp ); str = rb_str_buf_append( str, tmp ); VALUE vals = rb_ary_new(); for ( ; i != e && key == oldkey; ++i ) { const MultiMap::mapped_type& val = i->second; tmp = swig::from( val ); rb_ary_push( vals, tmp ); } tmp = rb_obj_as_string( vals ); str = rb_str_buf_append( str, tmp ); } return str; } } %enddef %mixin std::multimap "Enumerable"; %rename("delete") std::multimap::__delete__; %rename("reject!") std::multimap::reject_bang; %rename("map!") std::multimap::map_bang; %rename("empty?") std::multimap::empty; %rename("include?" ) std::multimap::__contains__ const; %rename("has_key?" ) std::multimap::has_key const; %alias std::multimap::push "<<"; %include swig-4.0.1/Lib/ruby/rubytypemaps.swg0000644000175000017500000000342013527063513017324 0ustar williamwilliam/* ------------------------------------------------------------ * Typemap specializations for Ruby * ------------------------------------------------------------ */ /* ------------------------------------------------------------ * Fragment section * ------------------------------------------------------------ */ /* bool is dangerous in Ruby, change precedence */ #undef SWIG_TYPECHECK_BOOL %define SWIG_TYPECHECK_BOOL 10000 %enddef /* Include fundamental fragment definitions */ %include /* Look for user fragments file. */ %include /* Ruby fragments for primitive types */ %include /* Ruby fragments for char* strings */ %include /* Backward compatibility output helper */ %fragment("output_helper","header") %{ #define output_helper SWIG_Ruby_AppendOutput %} /* ------------------------------------------------------------ * Unified typemap section * ------------------------------------------------------------ */ /* Directors are supported in Ruby */ #ifndef SWIG_DIRECTOR_TYPEMAPS #define SWIG_DIRECTOR_TYPEMAPS #endif /* Ruby types */ #define SWIG_Object VALUE #define VOID_Object Qnil /* Overload of the output/constant/exception handling */ /* append output */ #define SWIG_AppendOutput(result,obj) SWIG_Ruby_AppendOutput(result, obj) /* set constant */ #define SWIG_SetConstant(name, obj) rb_define_const($module, name, obj) /* raise */ #define SWIG_Raise(obj, type, desc) rb_exc_raise(SWIG_Ruby_ExceptionType(desc, obj)) /* Get the address of the 'Ruby self' object */ %typemap(in,numinputs=0,noblock=1) VALUE* RUBY_SELF { $1 = &self; } /* Include the unified typemap library */ %include swig-4.0.1/Lib/ruby/std_unordered_multiset.i0000644000175000017500000000356613527063513021012 0ustar williamwilliam/* Multisets */ %include %fragment("StdUnorderedMultisetTraits","header",fragment="StdUnorderedSetTraits") %{ namespace swig { template inline void assign(const RubySeq& rubyseq, std::unordered_multiset* seq) { // seq->insert(rubyseq.begin(), rubyseq.end()); // not used as not always implemented typedef typename RubySeq::value_type value_type; typename RubySeq::const_iterator it = rubyseq.begin(); for (;it != rubyseq.end(); ++it) { seq->insert(seq->end(),(value_type)(*it)); } } template struct traits_asptr > { static int asptr(VALUE obj, std::unordered_multiset **m) { return traits_asptr_stdseq >::asptr(obj, m); } }; template struct traits_from > { static VALUE from(const std::unordered_multiset& vec) { return traits_from_stdseq >::from(vec); } }; } %} #define %swig_unordered_multiset_methods(Set...) %swig_unordered_set_methods(Set) %mixin std::unordered_multiset "Enumerable"; %rename("delete") std::unordered_multiset::__delete__; %rename("reject!") std::unordered_multiset::reject_bang; %rename("map!") std::unordered_multiset::map_bang; %rename("empty?") std::unordered_multiset::empty; %rename("include?") std::unordered_multiset::__contains__ const; %rename("has_key?") std::unordered_multiset::has_key const; %alias std::unordered_multiset::push "<<"; %include swig-4.0.1/Lib/ruby/std_vector.i0000644000175000017500000000230213527063513016362 0ustar williamwilliam/* Vectors */ %fragment("StdVectorTraits","header",fragment="StdSequenceTraits") %{ namespace swig { template struct traits_asptr > { static int asptr(VALUE obj, std::vector **vec) { return traits_asptr_stdseq >::asptr(obj, vec); } }; template struct traits_from > { static VALUE from(const std::vector& vec) { return traits_from_stdseq >::from(vec); } }; } %} %define %swig_vector_methods(Type...) %swig_sequence_methods(Type) %swig_sequence_front_inserters(Type); %enddef %define %swig_vector_methods_val(Type...) %swig_sequence_methods_val(Type); %swig_sequence_front_inserters(Type); %enddef %mixin std::vector "Enumerable"; %ignore std::vector::push_back; %ignore std::vector::pop_back; %rename("delete") std::vector::__delete__; %rename("reject!") std::vector::reject_bang; %rename("map!") std::vector::map_bang; %rename("empty?") std::vector::empty; %rename("include?" ) std::vector::__contains__ const; %rename("has_key?" ) std::vector::has_key const; %alias std::vector::push "<<"; %include swig-4.0.1/Lib/ruby/Makefile.swig0000644000175000017500000000165613527063513016457 0ustar williamwilliam# File : Makefile.swig # Makefile for a SWIG module. Use this file if you are # producing a Ruby extension for general use or distribution. # # 1. Prepare extconf.rb. # 2. Modify this file as appropriate. # 3. Type 'make -f Makefile.swig' to generate wrapper code and Makefile. # 4. Type 'make' to build your extension. # 5. Type 'make install' to install your extension. # MODULE = yourmodule FEATURE = $(MODULE) INTERFACE = $(MODULE).i RUBY = ruby SWIG = swig # for C extension SWIGOPT = -ruby WRAPPER = $(MODULE)_wrap.c ## for C++ extension #SWIGOPT = -ruby -c++ #WRAPPER = $(MODULE)_wrap.cc swigall: $(WRAPPER) Makefile $(WRAPPER): $(INTERFACE) $(SWIG) $(SWIGOPT) -o $@ $(INTERFACE) Makefile: extconf.rb $(RUBY) extconf.rb @if [ -f Makefile ] ; then\ echo "include Makefile.swig" >> Makefile;\ fi swigclean: @if [ -f Makefile ] ; then\ make -f Makefile clean;\ fi rm -f Makefile $(WRAPPER) swig-4.0.1/Lib/ruby/std_alloc.i0000644000175000017500000000003313527063513016151 0ustar williamwilliam%include swig-4.0.1/Lib/ruby/rubystrings.swg0000644000175000017500000000304113527063513017152 0ustar williamwilliam/* ------------------------------------------------------------ * utility methods for char strings * ------------------------------------------------------------ */ %fragment("SWIG_AsCharPtrAndSize","header",fragment="SWIG_pchar_descriptor") { SWIGINTERN int SWIG_AsCharPtrAndSize(VALUE obj, char** cptr, size_t* psize, int *alloc) { if (TYPE(obj) == T_STRING) { char *cstr = StringValuePtr(obj); size_t size = RSTRING_LEN(obj) + 1; if (cptr) { if (alloc) { if (*alloc == SWIG_NEWOBJ) { *cptr = %new_copy_array(cstr, size, char); } else { *cptr = cstr; *alloc = SWIG_OLDOBJ; } } } if (psize) *psize = size; return SWIG_OK; } else { swig_type_info* pchar_descriptor = SWIG_pchar_descriptor(); if (pchar_descriptor) { void* vptr = 0; if (SWIG_ConvertPtr(obj, &vptr, pchar_descriptor, 0) == SWIG_OK) { if (cptr) *cptr = (char *)vptr; if (psize) *psize = vptr ? (strlen((char*)vptr) + 1) : 0; if (alloc) *alloc = SWIG_OLDOBJ; return SWIG_OK; } } } return SWIG_TypeError; } } %fragment("SWIG_FromCharPtrAndSize","header",fragment="SWIG_pchar_descriptor") { SWIGINTERNINLINE VALUE SWIG_FromCharPtrAndSize(const char* carray, size_t size) { if (carray) { if (size > LONG_MAX) { swig_type_info* pchar_descriptor = SWIG_pchar_descriptor(); return pchar_descriptor ? SWIG_NewPointerObj(%const_cast(carray,char *), pchar_descriptor, 0) : Qnil; } else { return rb_str_new(carray, %numeric_cast(size,long)); } } else { return Qnil; } } } swig-4.0.1/Lib/ruby/rubystdautodoc.swg0000644000175000017500000000343313527063513017637 0ustar williamwilliam/* ----------------------------------------------------------------------------- * rubystdautodoc.swg * * This file contains autodocs for standard STL functions. * ----------------------------------------------------------------------------- */ // // For STL autodocumentation // AUTODOC(c_str, "Convert class to a String representation"); AUTODOC(begin, "Return an iterator to the beginning of the $class"); AUTODOC(end, "Return an iterator to past the end of the $class"); AUTODOC(rbegin, "Return a reverse iterator to the beginning (the end) of the $class"); AUTODOC(rend, "Return a reverse iterator to past the end (past the beginning) of the $class"); AUTODOC(length, "Size or Length of the $class"); AUTODOC(replace, "Replace all or a portion of the $class"); AUTODOC(resize, "Resize the size of the $class"); AUTODOC(capacity, "Reserved capacity of the $class"); AUTODOC(reserve, "Reserve memory in the $class for a number of elements"); AUTODOC(erase, "Delete a portion of the $class"); AUTODOC(max_size, "Maximum size of elements allowed in the $class"); AUTODOC(iterator, "Return an iterator to the $class"); AUTODOC(empty, "Check if the $class is empty or not"); AUTODOC(rfind, "Find an element in reverse usually starting from the end of the $class"); AUTODOC(assign, "Assign a new $class or portion of it"); AUTODOC(front, "Return the first element in $class"); AUTODOC(back, "Return the last element in $class"); AUTODOC(second, "Return the second element in $class"); AUTODOC(push_front, "Add an element at the beginning of the $class"); AUTODOC(push_back, "Add an element at the end of the $class"); AUTODOC(pop_front, "Remove and return element at the beginning of the $class"); AUTODOC(pop_back, "Remove and return an element at the end of the $class"); AUTODOC(clear, "Clear $class contents"); swig-4.0.1/Lib/ruby/std_set.i0000644000175000017500000001460313527063513015662 0ustar williamwilliam/* Sets */ %fragment("StdSetTraits","header",fragment="",fragment="StdSequenceTraits") %{ namespace swig { template inline void assign(const RubySeq& rubyseq, std::set* seq) { // seq->insert(rubyseq.begin(), rubyseq.end()); // not used as not always implemented typedef typename RubySeq::value_type value_type; typename RubySeq::const_iterator it = rubyseq.begin(); for (;it != rubyseq.end(); ++it) { seq->insert(seq->end(),(value_type)(*it)); } } template struct traits_asptr > { static int asptr(VALUE obj, std::set **s) { return traits_asptr_stdseq >::asptr(obj, s); } }; template struct traits_from > { static VALUE from(const std::set& vec) { return traits_from_stdseq >::from(vec); } }; /** * Set Iterator class for an iterator with no end() boundaries. * */ template::value_type, typename FromOper = from_oper, typename AsvalOper = asval_oper > class SetIteratorOpen_T : public Iterator_T { public: FromOper from; AsvalOper asval; typedef InOutIterator nonconst_iter; typedef ValueType value_type; typedef Iterator_T base; typedef SetIteratorOpen_T self_type; public: SetIteratorOpen_T(nonconst_iter curr, VALUE seq = Qnil) : Iterator_T(curr, seq) { } virtual VALUE value() const { return from(static_cast(*(base::current))); } // no setValue allowed Iterator *dup() const { return new self_type(*this); } }; /** * Set Iterator class for a iterator where begin() and end() boundaries are known. * */ template::value_type, typename FromOper = from_oper, typename AsvalOper = asval_oper > class SetIteratorClosed_T : public Iterator_T { public: FromOper from; AsvalOper asval; typedef InOutIterator nonconst_iter; typedef ValueType value_type; typedef Iterator_T base; typedef SetIteratorClosed_T self_type; protected: virtual Iterator* advance(ptrdiff_t n) { std::advance( base::current, n ); if ( base::current == end ) throw stop_iteration(); return this; } public: SetIteratorClosed_T(nonconst_iter curr, nonconst_iter first, nonconst_iter last, VALUE seq = Qnil) : Iterator_T(curr, seq), begin(first), end(last) { } virtual VALUE value() const { if (base::current == end) { throw stop_iteration(); } else { return from(static_cast(*(base::current))); } } // no setValue allowed Iterator *dup() const { return new self_type(*this); } private: nonconst_iter begin; nonconst_iter end; }; // Template specialization to construct a closed iterator for sets // this turns a nonconst iterator into a const one for ruby to avoid // allowing the user to change the value template< typename InOutIter > inline Iterator* make_set_nonconst_iterator(const InOutIter& current, const InOutIter& begin, const InOutIter& end, VALUE seq = Qnil) { return new SetIteratorClosed_T< InOutIter >(current, begin, end, seq); } // Template specialization to construct an open iterator for sets // this turns a nonconst iterator into a const one for ruby to avoid // allowing the user to change the value template< typename InOutIter > inline Iterator* make_set_nonconst_iterator(const InOutIter& current, VALUE seq = Qnil) { return new SetIteratorOpen_T< InOutIter >(current, seq); } } %} %define %swig_sequence_methods_extra_set(Sequence...) %extend { %alias reject_bang "delete_if"; Sequence* reject_bang() { if ( !rb_block_given_p() ) rb_raise( rb_eArgError, "no block given" ); for ( Sequence::iterator i = $self->begin(); i != $self->end(); ) { VALUE r = swig::from< Sequence::value_type >(*i); Sequence::iterator current = i++; if ( RTEST( rb_yield(r) ) ) $self->erase(current); } return self; } } %enddef %define %swig_set_methods(set...) %swig_sequence_methods_common(%arg(set)); %swig_sequence_methods_extra_set(%arg(set)); %fragment("RubyPairBoolOutputIterator","header",fragment=SWIG_From_frag(bool),fragment="RubySequence_Cont") {} // Redefine std::set iterator/reverse_iterator typemap %typemap(out,noblock=1) iterator, reverse_iterator { $result = SWIG_NewPointerObj(swig::make_set_nonconst_iterator(%static_cast($1,const $type &), self), swig::Iterator::descriptor(),SWIG_POINTER_OWN); } // Redefine std::set std::pair typemap %typemap(out,noblock=1,fragment="RubyPairBoolOutputIterator") std::pair { $result = rb_ary_new2(2); rb_ary_push($result, SWIG_NewPointerObj(swig::make_set_nonconst_iterator(%static_cast($1,$type &).first), swig::Iterator::descriptor(),SWIG_POINTER_OWN)); rb_ary_push($result, SWIG_From(bool)(%static_cast($1,const $type &).second)); } %extend { %alias push "<<"; value_type push(const value_type& x) { self->insert(x); return x; } bool __contains__(const value_type& x) { return self->find(x) != self->end(); } value_type __getitem__(difference_type i) const throw (std::out_of_range) { return *(swig::cgetpos(self, i)); } }; %enddef %mixin std::set "Enumerable"; %rename("delete") std::set::__delete__; %rename("reject!") std::set::reject_bang; %rename("map!") std::set::map_bang; %rename("empty?") std::set::empty; %rename("include?" ) std::set::__contains__ const; %rename("has_key?" ) std::set::has_key const; %alias std::set::push "<<"; %include swig-4.0.1/Lib/ruby/rubydef.swg0000644000175000017500000000005213527063513016216 0ustar williamwilliam/* empty file added for backward comp. */ swig-4.0.1/Lib/ruby/std_container.i0000644000175000017500000000007413527063513017046 0ustar williamwilliam%include %include swig-4.0.1/Lib/ruby/rubystdcommon.swg0000644000175000017500000001147013527063513017471 0ustar williamwilliam /* ------------------------------------------------------------ * The Ruby classes, for C++ * ------------------------------------------------------------ */ %include %include %fragment("StdTraits","header",fragment="StdTraitsCommon",fragment="StdTraitsForwardDeclaration") { namespace swig { /* Traits that provides the from method */ template struct traits_from_ptr { static VALUE from(Type *val, int owner = 0) { return SWIG_NewPointerObj(val, type_info(), owner); } }; template struct traits_from { static VALUE from(const Type& val) { return traits_from_ptr::from(new Type(val), 1); } }; template struct traits_from { static VALUE from(Type* val) { return traits_from_ptr::from(val, 0); } }; template struct traits_from { static VALUE from(const Type* val) { return traits_from_ptr::from(const_cast(val), 0); } }; template inline VALUE from(const Type& val) { return traits_from::from(val); } template inline VALUE from_ptr(Type* val, int owner) { return traits_from_ptr::from(val, owner); } /* Traits that provides the asval/as/check method */ template struct traits_asptr { static int asptr(VALUE obj, Type **val) { Type *p = 0; swig_type_info *descriptor = type_info(); int res = descriptor ? SWIG_ConvertPtr(obj, (void **)&p, descriptor, 0) : SWIG_ERROR; if (SWIG_IsOK(res)) { if (val) *val = p; } return res; } }; template inline int asptr(VALUE obj, Type **vptr) { return traits_asptr::asptr(obj, vptr); } template struct traits_asval { static int asval(VALUE obj, Type *val) { if (val) { Type *p = 0; int res = traits_asptr::asptr(obj, &p); if (!SWIG_IsOK(res)) return res; if (p) { typedef typename noconst_traits::noconst_type noconst_type; *(const_cast(val)) = *p; if (SWIG_IsNewObj(res)){ %delete(p); res = SWIG_DelNewMask(res); } return res; } else { return SWIG_ERROR; } } else { return traits_asptr::asptr(obj, (Type **)(0)); } } }; template struct traits_asval { static int asval(VALUE obj, Type **val) { if (val) { typedef typename noconst_traits::noconst_type noconst_type; noconst_type *p = 0; int res = traits_asptr::asptr(obj, &p); if (SWIG_IsOK(res)) { *(const_cast(val)) = p; } return res; } else { return traits_asptr::asptr(obj, (Type **)(0)); } } }; template inline int asval(VALUE obj, Type *val) { return traits_asval::asval(obj, val); } template struct traits_as { static Type as(VALUE obj) { Type v; int res = asval(obj, &v); if (!SWIG_IsOK(res)) { VALUE lastErr = rb_gv_get("$!"); if (lastErr == Qnil) { %type_error(swig::type_name()); } throw std::invalid_argument("bad type"); } return v; } }; template struct traits_as { static Type as(VALUE obj) { Type *v = 0; int res = traits_asptr::asptr(obj, &v); if (SWIG_IsOK(res) && v) { if (SWIG_IsNewObj(res)) { Type r(*v); %delete(v); return r; } else { return *v; } } else { VALUE lastErr = rb_gv_get("$!"); if (lastErr == Qnil) { %type_error(swig::type_name()); } throw std::invalid_argument("bad type"); } } }; template struct traits_as { static Type* as(VALUE obj) { Type *v = 0; int res = traits_asptr::asptr(obj, &v); if (SWIG_IsOK(res)) { return v; } else { VALUE lastErr = rb_gv_get("$!"); if (lastErr == Qnil) { %type_error(swig::type_name()); } throw std::invalid_argument("bad type"); } } }; template inline Type as(VALUE obj) { return traits_as< Type, typename traits< Type >::category >::as(obj); } template struct traits_check { static bool check(VALUE obj) { int res = asval(obj, (Type *)(0)); return SWIG_IsOK(res) ? true : false; } }; template struct traits_check { static bool check(VALUE obj) { int res = asptr(obj, (Type **)(0)); return SWIG_IsOK(res) ? true : false; } }; template inline bool check(VALUE obj) { return traits_check::category>::check(obj); } } } swig-4.0.1/Lib/ruby/std_wstring.i0000644000175000017500000000246513527063513016567 0ustar williamwilliam%{ #ifdef __cplusplus extern "C" { #endif #ifdef HAVE_RUBY_ENCODING_H #include "ruby/encoding.h" #endif /** * The internal encoding of std::wstring is defined based on * the size of wchar_t. If it is not appropriate for your library, * SWIG_RUBY_WSTRING_ENCODING must be given when compiling. */ #ifndef SWIG_RUBY_WSTRING_ENCODING #if WCHAR_MAX == 0x7fff || WCHAR_MAX == 0xffff #define SWIG_RUBY_WSTRING_ENCODING "UTF-16LE" #elif WCHAR_MAX == 0x7fffffff || WCHAR_MAX == 0xffffffff #define SWIG_RUBY_WSTRING_ENCODING "UTF-32LE" #else #error unsupported wchar_t size. SWIG_RUBY_WSTRING_ENCODING must be given. #endif #endif /** * If Encoding.default_internal is nil, this encoding will be used * when converting from std::wstring to String object in Ruby. */ #ifndef SWIG_RUBY_INTERNAL_ENCODING #define SWIG_RUBY_INTERNAL_ENCODING "UTF-8" #endif static rb_encoding *swig_ruby_wstring_encoding; static rb_encoding *swig_ruby_internal_encoding; #ifdef __cplusplus } #endif %} %fragment("SWIG_ruby_wstring_encoding_init", "init") { swig_ruby_wstring_encoding = rb_enc_find( SWIG_RUBY_WSTRING_ENCODING ); swig_ruby_internal_encoding = rb_enc_find( SWIG_RUBY_INTERNAL_ENCODING ); } %warnfilter(SWIGWARN_RUBY_WRONG_NAME) std::basic_string; %include %include swig-4.0.1/Lib/ruby/file.i0000644000175000017500000000120213527063513015123 0ustar williamwilliam// FILE * %{ #ifdef __cplusplus extern "C" { #endif /* Ruby 1.9 changed the file name of this header */ #ifdef HAVE_RUBY_IO_H #include "ruby/io.h" #else #include "rubyio.h" #endif #ifdef __cplusplus } #endif %} %typemap(in) FILE *READ { OpenFile *of; GetOpenFile($input, of); rb_io_check_readable(of); $1 = GetReadFile(of); rb_read_check($1); } %typemap(in) FILE *READ_NOCHECK { OpenFile *of; GetOpenFile($input, of); rb_io_check_readable(of); $1 = GetReadFile(of); } %typemap(in) FILE *WRITE { OpenFile *of; GetOpenFile($input, of); rb_io_check_writable(of); $1 = GetWriteFile(of); } swig-4.0.1/Lib/ruby/std_unordered_map.i0000644000175000017500000000566013527063513017716 0ustar williamwilliam// // Maps // %include %fragment("StdUnorderedMapTraits","header",fragment="StdMapCommonTraits") { namespace swig { template inline void assign(const RubySeq& rubyseq, std::unordered_map *map) { typedef typename std::unordered_map::value_type value_type; typename RubySeq::const_iterator it = rubyseq.begin(); for (;it != rubyseq.end(); ++it) { map->insert(value_type(it->first, it->second)); } } template struct traits_asptr > { typedef std::unordered_map map_type; static int asptr(VALUE obj, map_type **val) { int res = SWIG_ERROR; if (TYPE(obj) == T_HASH) { static ID id_to_a = rb_intern("to_a"); VALUE items = rb_funcall(obj, id_to_a, 0); res = traits_asptr_stdseq, std::pair >::asptr(items, val); } else { map_type *p; swig_type_info *descriptor = swig::type_info(); res = descriptor ? SWIG_ConvertPtr(obj, (void **)&p, descriptor, 0) : SWIG_ERROR; if (SWIG_IsOK(res) && val) *val = p; } return res; } }; template struct traits_from > { typedef std::unordered_map map_type; typedef typename map_type::const_iterator const_iterator; typedef typename map_type::size_type size_type; static VALUE from(const map_type& map) { swig_type_info *desc = swig::type_info(); if (desc && desc->clientdata) { return SWIG_NewPointerObj(new map_type(map), desc, SWIG_POINTER_OWN); } else { size_type size = map.size(); int rubysize = (size <= (size_type) INT_MAX) ? (int) size : -1; if (rubysize < 0) { SWIG_RUBY_THREAD_BEGIN_BLOCK; rb_raise(rb_eRuntimeError, "map size not valid in Ruby"); SWIG_RUBY_THREAD_END_BLOCK; return Qnil; } VALUE obj = rb_hash_new(); for (const_iterator i= map.begin(); i!= map.end(); ++i) { VALUE key = swig::from(i->first); VALUE val = swig::from(i->second); rb_hash_aset(obj, key, val); } return obj; } } }; } } #define %swig_unordered_map_common(Map...) %swig_map_common(Map) #define %swig_unordered_map_methods(Map...) %swig_map_methods(Map) %rename("delete") std::unordered_map::__delete__; %rename("reject!") std::unordered_map::reject_bang; %rename("map!") std::unordered_map::map_bang; %rename("empty?") std::unordered_map::empty; %rename("include?") std::unordered_map::__contains__ const; %rename("has_key?") std::unordered_map::has_key const; %mixin std::unordered_map "Enumerable"; %alias std::unordered_map::push "<<"; %include swig-4.0.1/Lib/ruby/extconf.rb0000644000175000017500000000035213527063513016032 0ustar williamwilliamrequire 'mkmf' dir_config('yourlib') if have_header('yourlib.h') and have_library('yourlib', 'yourlib_init') # If you use swig -c option, you may have to link libswigrb. # have_library('swigrb') create_makefile('yourlib') end swig-4.0.1/Lib/ruby/ruby.swg0000644000175000017500000000513613527063513015547 0ustar williamwilliam/* ------------------------------------------------------------ * ruby.swg * * Ruby configuration module. * ------------------------------------------------------------ */ /* ------------------------------------------------------------ * The Ruby auto rename rules * ------------------------------------------------------------ */ #if defined(SWIG_RUBY_AUTORENAME) /* Class names are CamelCase */ %rename("%(camelcase)s", %$isclass) ""; /* Constants created by %constant or #define are UPPER_CASE */ %rename("%(uppercase)s", %$isconstant) ""; /* SWIG only considers static class members with inline initializers to be constants. For examples of what is and isn't considered a constant by SWIG see naming.i in the Ruby test suite. */ %rename("%(uppercase)s", %$ismember, %$isvariable,%$isimmutable,%$isstatic,%$hasvalue,%$hasconsttype) ""; /* Enums are mapped to constants but all we do is make sure the first letter is uppercase */ %rename("%(firstuppercase)s", %$isenumitem) ""; /* Method names should be lower_case_with_underscores */ %rename("%(undercase)s", %$isfunction, %$not %$ismemberget, %$not %$ismemberset) ""; #endif /* ------------------------------------------------------------ * Inner macros * ------------------------------------------------------------ */ %include /* ------------------------------------------------------------ * The runtime part * ------------------------------------------------------------ */ %include /* ------------------------------------------------------------ * Special user directives * ------------------------------------------------------------ */ %include /* ------------------------------------------------------------ * Typemap specializations * ------------------------------------------------------------ */ %include /* ------------------------------------------------------------ * Overloaded operator support * ------------------------------------------------------------ */ %include /* ------------------------------------------------------------ * Warnings for Ruby keywords * ------------------------------------------------------------ */ %include /* ------------------------------------------------------------ * Documentation for common Ruby methods * ------------------------------------------------------------ */ %include /* ------------------------------------------------------------ * The Ruby initialization function * ------------------------------------------------------------ */ %include swig-4.0.1/Lib/ruby/std_sstream.i0000644000175000017500000000003613527063513016540 0ustar williamwilliam %include swig-4.0.1/Lib/ruby/std_unordered_multimap.i0000644000175000017500000000674713527063513021000 0ustar williamwilliam/* Multimaps */ %include %fragment("StdUnorderedMultimapTraits","header",fragment="StdMapCommonTraits") { namespace swig { template inline void assign(const RubySeq& rubyseq, std::unordered_multimap *multimap) { typedef typename std::unordered_multimap::value_type value_type; typename RubySeq::const_iterator it = rubyseq.begin(); for (;it != rubyseq.end(); ++it) { multimap->insert(value_type(it->first, it->second)); } } template struct traits_asptr > { typedef std::unordered_multimap multimap_type; static int asptr(VALUE obj, std::unordered_multimap **val) { int res = SWIG_ERROR; if ( TYPE(obj) == T_HASH ) { static ID id_to_a = rb_intern("to_a"); VALUE items = rb_funcall(obj, id_to_a, 0); return traits_asptr_stdseq, std::pair >::asptr(items, val); } else { multimap_type *p; res = SWIG_ConvertPtr(obj,(void**)&p,swig::type_info(),0); if (SWIG_IsOK(res) && val) *val = p; } return res; } }; template struct traits_from > { typedef std::unordered_multimap multimap_type; typedef typename multimap_type::const_iterator const_iterator; typedef typename multimap_type::size_type size_type; static VALUE from(const multimap_type& multimap) { swig_type_info *desc = swig::type_info(); if (desc && desc->clientdata) { return SWIG_NewPointerObj(new multimap_type(multimap), desc, SWIG_POINTER_OWN); } else { size_type size = multimap.size(); int rubysize = (size <= (size_type) INT_MAX) ? (int) size : -1; if (rubysize < 0) { SWIG_RUBY_THREAD_BEGIN_BLOCK; rb_raise(rb_eRuntimeError, "multimap_ size not valid in Ruby"); SWIG_RUBY_THREAD_END_BLOCK; return Qnil; } VALUE obj = rb_hash_new(); for (const_iterator i= multimap.begin(); i!= multimap.end(); ++i) { VALUE key = swig::from(i->first); VALUE val = swig::from(i->second); VALUE oldval = rb_hash_aref(obj, key); if (oldval == Qnil) { rb_hash_aset(obj, key, val); } else { // Multiple values for this key, create array if needed // and add a new element to it. VALUE ary; if (TYPE(oldval) == T_ARRAY) { ary = oldval; } else { ary = rb_ary_new2(2); rb_ary_push(ary, oldval); rb_hash_aset(obj, key, ary); } rb_ary_push(ary, val); } } return obj; } } }; } } #define %swig_unordered_multimap_methods(MultiMap...) %swig_multimap_methods(MultiMap) %mixin std::unordered_multimap "Enumerable"; %rename("delete") std::unordered_multimap::__delete__; %rename("reject!") std::unordered_multimap::reject_bang; %rename("map!") std::unordered_multimap::map_bang; %rename("empty?") std::unordered_multimap::empty; %rename("include?" ) std::unordered_multimap::__contains__ const; %rename("has_key?" ) std::unordered_multimap::has_key const; %alias std::unordered_multimap::push "<<"; %include swig-4.0.1/Lib/ruby/attribute.i0000644000175000017500000000004213527063513016210 0ustar williamwilliam%include swig-4.0.1/Lib/ruby/std_unordered_set.i0000644000175000017500000000342213527063513017726 0ustar williamwilliam/* Sets */ %include %fragment("StdUnorderedSetTraits","header",fragment="",fragment="StdSetTraits") %{ namespace swig { template inline void assign(const RubySeq& rubyseq, std::unordered_set* seq) { // seq->insert(rubyseq.begin(), rubyseq.end()); // not used as not always implemented typedef typename RubySeq::value_type value_type; typename RubySeq::const_iterator it = rubyseq.begin(); for (;it != rubyseq.end(); ++it) { seq->insert(seq->end(),(value_type)(*it)); } } template struct traits_asptr > { static int asptr(VALUE obj, std::unordered_set **s) { return traits_asptr_stdseq >::asptr(obj, s); } }; template struct traits_from > { static VALUE from(const std::unordered_set& vec) { return traits_from_stdseq >::from(vec); } }; } %} #define %swig_unordered_set_methods(set...) %swig_set_methods(set) %mixin std::unordered_set "Enumerable"; %rename("delete") std::unordered_set::__delete__; %rename("reject!") std::unordered_set::reject_bang; %rename("map!") std::unordered_set::map_bang; %rename("empty?") std::unordered_set::empty; %rename("include?" ) std::unordered_set::__contains__ const; %rename("has_key?" ) std::unordered_set::has_key const; %alias std::unordered_set::push "<<"; %include swig-4.0.1/Lib/ruby/rubyrun.swg0000644000175000017500000003340713527063513016276 0ustar williamwilliam/* ----------------------------------------------------------------------------- * rubyrun.swg * * This file contains the runtime support for Ruby modules * and includes code for managing global variables and pointer * type checking. * ----------------------------------------------------------------------------- */ /* For backward compatibility only */ #define SWIG_POINTER_EXCEPTION 0 /* for raw pointers */ #define SWIG_ConvertPtr(obj, pptr, type, flags) SWIG_Ruby_ConvertPtrAndOwn(obj, pptr, type, flags, 0) #define SWIG_ConvertPtrAndOwn(obj,pptr,type,flags,own) SWIG_Ruby_ConvertPtrAndOwn(obj, pptr, type, flags, own) #define SWIG_NewPointerObj(ptr, type, flags) SWIG_Ruby_NewPointerObj(ptr, type, flags) #define SWIG_AcquirePtr(ptr, own) SWIG_Ruby_AcquirePtr(ptr, own) #define swig_owntype swig_ruby_owntype /* for raw packed data */ #define SWIG_ConvertPacked(obj, ptr, sz, ty) SWIG_Ruby_ConvertPacked(obj, ptr, sz, ty, flags) #define SWIG_NewPackedObj(ptr, sz, type) SWIG_Ruby_NewPackedObj(ptr, sz, type) /* for class or struct pointers */ #define SWIG_ConvertInstance(obj, pptr, type, flags) SWIG_ConvertPtr(obj, pptr, type, flags) #define SWIG_NewInstanceObj(ptr, type, flags) SWIG_NewPointerObj(ptr, type, flags) /* for C or C++ function pointers */ #define SWIG_ConvertFunctionPtr(obj, pptr, type) SWIG_ConvertPtr(obj, pptr, type, 0) #define SWIG_NewFunctionPtrObj(ptr, type) SWIG_NewPointerObj(ptr, type, 0) /* for C++ member pointers, ie, member methods */ #define SWIG_ConvertMember(obj, ptr, sz, ty) SWIG_Ruby_ConvertPacked(obj, ptr, sz, ty) #define SWIG_NewMemberObj(ptr, sz, type) SWIG_Ruby_NewPackedObj(ptr, sz, type) /* Runtime API */ #define SWIG_GetModule(clientdata) SWIG_Ruby_GetModule(clientdata) #define SWIG_SetModule(clientdata, pointer) SWIG_Ruby_SetModule(pointer) /* Error manipulation */ #define SWIG_ErrorType(code) SWIG_Ruby_ErrorType(code) #define SWIG_Error(code, msg) rb_raise(SWIG_Ruby_ErrorType(code), "%s", msg) #define SWIG_fail goto fail /* Ruby-specific SWIG API */ #define SWIG_InitRuntime() SWIG_Ruby_InitRuntime() #define SWIG_define_class(ty) SWIG_Ruby_define_class(ty) #define SWIG_NewClassInstance(value, ty) SWIG_Ruby_NewClassInstance(value, ty) #define SWIG_MangleStr(value) SWIG_Ruby_MangleStr(value) #define SWIG_CheckConvert(value, ty) SWIG_Ruby_CheckConvert(value, ty) #include "assert.h" /* ----------------------------------------------------------------------------- * pointers/data manipulation * ----------------------------------------------------------------------------- */ #ifdef __cplusplus extern "C" { #endif typedef struct { VALUE klass; VALUE mImpl; void (*mark)(void *); void (*destroy)(void *); int trackObjects; } swig_class; /* Global pointer used to keep some internal SWIG stuff */ static VALUE _cSWIG_Pointer = Qnil; static VALUE swig_runtime_data_type_pointer = Qnil; /* Global IDs used to keep some internal SWIG stuff */ static ID swig_arity_id = 0; static ID swig_call_id = 0; /* If your swig extension is to be run within an embedded ruby and has director callbacks, you should set -DRUBY_EMBEDDED during compilation. This will reset ruby's stack frame on each entry point from the main program the first time a virtual director function is invoked (in a non-recursive way). If this is not done, you run the risk of Ruby trashing the stack. */ #ifdef RUBY_EMBEDDED # define SWIG_INIT_STACK \ if ( !swig_virtual_calls ) { RUBY_INIT_STACK } \ ++swig_virtual_calls; # define SWIG_RELEASE_STACK --swig_virtual_calls; # define Ruby_DirectorTypeMismatchException(x) \ rb_raise( rb_eTypeError, "%s", x ); return c_result; static unsigned int swig_virtual_calls = 0; #else /* normal non-embedded extension */ # define SWIG_INIT_STACK # define SWIG_RELEASE_STACK # define Ruby_DirectorTypeMismatchException(x) \ throw Swig::DirectorTypeMismatchException( x ); #endif /* RUBY_EMBEDDED */ SWIGRUNTIME VALUE getExceptionClass(void) { static int init = 0; static VALUE rubyExceptionClass ; if (!init) { init = 1; rubyExceptionClass = rb_const_get(_mSWIG, rb_intern("Exception")); } return rubyExceptionClass; } /* This code checks to see if the Ruby object being raised as part of an exception inherits from the Ruby class Exception. If so, the object is simply returned. If not, then a new Ruby exception object is created and that will be returned to Ruby.*/ SWIGRUNTIME VALUE SWIG_Ruby_ExceptionType(swig_type_info *desc, VALUE obj) { VALUE exceptionClass = getExceptionClass(); if (rb_obj_is_kind_of(obj, exceptionClass)) { return obj; } else { return rb_exc_new3(rb_eRuntimeError, rb_obj_as_string(obj)); } } /* Initialize Ruby runtime support */ SWIGRUNTIME void SWIG_Ruby_InitRuntime(void) { if (_mSWIG == Qnil) { _mSWIG = rb_define_module("SWIG"); swig_call_id = rb_intern("call"); swig_arity_id = rb_intern("arity"); } } /* Define Ruby class for C type */ SWIGRUNTIME void SWIG_Ruby_define_class(swig_type_info *type) { char *klass_name = (char *) malloc(4 + strlen(type->name) + 1); sprintf(klass_name, "TYPE%s", type->name); if (NIL_P(_cSWIG_Pointer)) { _cSWIG_Pointer = rb_define_class_under(_mSWIG, "Pointer", rb_cObject); rb_undef_method(CLASS_OF(_cSWIG_Pointer), "new"); } rb_define_class_under(_mSWIG, klass_name, _cSWIG_Pointer); free((void *) klass_name); } /* Create a new pointer object */ SWIGRUNTIME VALUE SWIG_Ruby_NewPointerObj(void *ptr, swig_type_info *type, int flags) { int own = flags & SWIG_POINTER_OWN; int track; char *klass_name; swig_class *sklass; VALUE klass; VALUE obj; if (!ptr) return Qnil; assert(type); if (type->clientdata) { sklass = (swig_class *) type->clientdata; /* Are we tracking this class and have we already returned this Ruby object? */ track = sklass->trackObjects; if (track) { obj = SWIG_RubyInstanceFor(ptr); /* Check the object's type and make sure it has the correct type. It might not in cases where methods do things like downcast methods. */ if (obj != Qnil) { VALUE value = rb_iv_get(obj, "@__swigtype__"); const char* type_name = RSTRING_PTR(value); if (strcmp(type->name, type_name) == 0) { return obj; } } } /* Create a new Ruby object */ obj = Data_Wrap_Struct(sklass->klass, VOIDFUNC(sklass->mark), ( own ? VOIDFUNC(sklass->destroy) : (track ? VOIDFUNC(SWIG_RubyRemoveTracking) : 0 ) ), ptr); /* If tracking is on for this class then track this object. */ if (track) { SWIG_RubyAddTracking(ptr, obj); } } else { klass_name = (char *) malloc(4 + strlen(type->name) + 1); sprintf(klass_name, "TYPE%s", type->name); klass = rb_const_get(_mSWIG, rb_intern(klass_name)); free((void *) klass_name); obj = Data_Wrap_Struct(klass, 0, 0, ptr); } rb_iv_set(obj, "@__swigtype__", rb_str_new2(type->name)); return obj; } /* Create a new class instance (always owned) */ SWIGRUNTIME VALUE SWIG_Ruby_NewClassInstance(VALUE klass, swig_type_info *type) { VALUE obj; swig_class *sklass = (swig_class *) type->clientdata; obj = Data_Wrap_Struct(klass, VOIDFUNC(sklass->mark), VOIDFUNC(sklass->destroy), 0); rb_iv_set(obj, "@__swigtype__", rb_str_new2(type->name)); return obj; } /* Get type mangle from class name */ SWIGRUNTIMEINLINE char * SWIG_Ruby_MangleStr(VALUE obj) { VALUE stype = rb_iv_get(obj, "@__swigtype__"); return StringValuePtr(stype); } /* Acquire a pointer value */ typedef struct { void (*datafree)(void *); int own; } swig_ruby_owntype; SWIGRUNTIME swig_ruby_owntype SWIG_Ruby_AcquirePtr(VALUE obj, swig_ruby_owntype own) { swig_ruby_owntype oldown = {0, 0}; if (TYPE(obj) == T_DATA && !RTYPEDDATA_P(obj)) { oldown.datafree = RDATA(obj)->dfree; RDATA(obj)->dfree = own.datafree; } return oldown; } /* Convert a pointer value */ SWIGRUNTIME int SWIG_Ruby_ConvertPtrAndOwn(VALUE obj, void **ptr, swig_type_info *ty, int flags, swig_ruby_owntype *own) { char *c; swig_cast_info *tc; void *vptr = 0; /* Grab the pointer */ if (NIL_P(obj)) { if (ptr) *ptr = 0; return (flags & SWIG_POINTER_NO_NULL) ? SWIG_NullReferenceError : SWIG_OK; } else { if (TYPE(obj) != T_DATA || (TYPE(obj) == T_DATA && RTYPEDDATA_P(obj))) { return SWIG_ERROR; } Data_Get_Struct(obj, void, vptr); } if (own) { own->datafree = RDATA(obj)->dfree; own->own = 0; } /* Check to see if the input object is giving up ownership of the underlying C struct or C++ object. If so then we need to reset the destructor since the Ruby object no longer owns the underlying C++ object.*/ if (flags & SWIG_POINTER_DISOWN) { /* Is tracking on for this class? */ int track = 0; if (ty && ty->clientdata) { swig_class *sklass = (swig_class *) ty->clientdata; track = sklass->trackObjects; } if (track) { /* We are tracking objects for this class. Thus we change the destructor * to SWIG_RubyRemoveTracking. This allows us to * remove the mapping from the C++ to Ruby object * when the Ruby object is garbage collected. If we don't * do this, then it is possible we will return a reference * to a Ruby object that no longer exists thereby crashing Ruby. */ RDATA(obj)->dfree = SWIG_RubyRemoveTracking; } else { RDATA(obj)->dfree = 0; } } /* Do type-checking if type info was provided */ if (ty) { if (ty->clientdata) { if (rb_obj_is_kind_of(obj, ((swig_class *) (ty->clientdata))->klass)) { if (vptr == 0) { /* The object has already been deleted */ return SWIG_ObjectPreviouslyDeletedError; } } } if ((c = SWIG_MangleStr(obj)) == NULL) { return SWIG_ERROR; } tc = SWIG_TypeCheck(c, ty); if (!tc) { return SWIG_ERROR; } else { if (ptr) { if (tc->type == ty) { *ptr = vptr; } else { int newmemory = 0; *ptr = SWIG_TypeCast(tc, vptr, &newmemory); if (newmemory == SWIG_CAST_NEW_MEMORY) { assert(own); /* badly formed typemap which will lead to a memory leak - it must set and use own to delete *ptr */ if (own) own->own = own->own | SWIG_CAST_NEW_MEMORY; } } } } } else { if (ptr) *ptr = vptr; } return SWIG_OK; } /* Check convert */ SWIGRUNTIMEINLINE int SWIG_Ruby_CheckConvert(VALUE obj, swig_type_info *ty) { char *c = SWIG_MangleStr(obj); if (!c) return 0; return SWIG_TypeCheck(c,ty) != 0; } SWIGRUNTIME VALUE SWIG_Ruby_NewPackedObj(void *ptr, int sz, swig_type_info *type) { char result[1024]; char *r = result; if ((2*sz + 1 + strlen(type->name)) > 1000) return 0; *(r++) = '_'; r = SWIG_PackData(r, ptr, sz); strcpy(r, type->name); return rb_str_new2(result); } /* Convert a packed pointer value */ SWIGRUNTIME int SWIG_Ruby_ConvertPacked(VALUE obj, void *ptr, int sz, swig_type_info *ty) { swig_cast_info *tc; const char *c; if (TYPE(obj) != T_STRING) goto type_error; c = StringValuePtr(obj); /* Pointer values must start with leading underscore */ if (*c != '_') goto type_error; c++; c = SWIG_UnpackData(c, ptr, sz); if (ty) { tc = SWIG_TypeCheck(c, ty); if (!tc) goto type_error; } return SWIG_OK; type_error: return SWIG_ERROR; } SWIGRUNTIME swig_module_info * SWIG_Ruby_GetModule(void *SWIGUNUSEDPARM(clientdata)) { VALUE pointer; swig_module_info *ret = 0; VALUE verbose = rb_gv_get("VERBOSE"); /* temporarily disable warnings, since the pointer check causes warnings with 'ruby -w' */ rb_gv_set("VERBOSE", Qfalse); /* first check if pointer already created */ pointer = rb_gv_get("$swig_runtime_data_type_pointer" SWIG_RUNTIME_VERSION SWIG_TYPE_TABLE_NAME); if (pointer != Qnil) { Data_Get_Struct(pointer, swig_module_info, ret); } /* reinstate warnings */ rb_gv_set("VERBOSE", verbose); return ret; } SWIGRUNTIME void SWIG_Ruby_SetModule(swig_module_info *pointer) { /* register a new class */ VALUE cl = rb_define_class("swig_runtime_data", rb_cObject); /* create and store the structure pointer to a global variable */ swig_runtime_data_type_pointer = Data_Wrap_Struct(cl, 0, 0, pointer); rb_define_readonly_variable("$swig_runtime_data_type_pointer" SWIG_RUNTIME_VERSION SWIG_TYPE_TABLE_NAME, &swig_runtime_data_type_pointer); } /* This function can be used to check whether a proc or method or similarly callable function has been passed. Usually used in a %typecheck, like: %typecheck(c_callback_t, precedence=SWIG_TYPECHECK_POINTER) { $result = SWIG_Ruby_isCallable( $input ); } */ SWIGINTERN int SWIG_Ruby_isCallable( VALUE proc ) { if ( rb_respond_to( proc, swig_call_id ) ) return 1; return 0; } /* This function can be used to check the arity (number of arguments) a proc or method can take. Usually used in a %typecheck. Valid arities will be that equal to minimal or those < 0 which indicate a variable number of parameters at the end. */ SWIGINTERN int SWIG_Ruby_arity( VALUE proc, int minimal ) { if ( rb_respond_to( proc, swig_arity_id ) ) { VALUE num = rb_funcall( proc, swig_arity_id, 0 ); int arity = NUM2INT(num); if ( arity < 0 && (arity+1) < -minimal ) return 1; if ( arity == minimal ) return 1; return 1; } return 0; } #ifdef __cplusplus } #endif swig-4.0.1/Lib/ruby/rubystdcommon_forward.swg0000644000175000017500000000103613527063513021212 0ustar williamwilliam%fragment("StdTraitsForwardDeclaration","header") { namespace swig { template struct traits_asptr; template struct traits_asval; struct pointer_category; template struct traits_as; template struct traits_from; template struct traits_from_ptr; template struct noconst_traits; template swig_type_info* type_info(); template const char* type_name(); template VALUE from(const Type& val); } } swig-4.0.1/Lib/ruby/cmalloc.i0000644000175000017500000000004013527063513015615 0ustar williamwilliam%include swig-4.0.1/Lib/ruby/progargcargv.i0000644000175000017500000000140213527063513016672 0ustar williamwilliam/* int PROG_ARGC char **PROG_ARGV Some C function receive argc and argv from C main function. This typemap provides ignore typemap which pass Ruby ARGV contents as argc and argv to C function. */ // argc and argv %typemap(in,numinputs=0) int PROG_ARGC { $1 = RARRAY_LEN(rb_argv) + 1; } %typemap(in,numinputs=0) char **PROG_ARGV { int i, n; VALUE ary = rb_eval_string("[$0] + ARGV"); n = RARRAY_LEN(ary); $1 = (char **)malloc(n + 1); for (i = 0; i < n; i++) { VALUE v = rb_obj_as_string(RARRAY_PTR(ary)[i]); $1[i] = (char *)malloc(RSTRING_LEN(v) + 1); strcpy($1[i], RSTRING_PTR(v)); } } %typemap(freearg) char **PROG_ARGV { int i, n = RARRAY_LEN(rb_argv) + 1; for (i = 0; i < n; i++) free($1[i]); free($1); } swig-4.0.1/Lib/ruby/std_basic_string.i0000644000175000017500000000514413527063513017536 0ustar williamwilliam#if !defined(SWIG_STD_STRING) #define SWIG_STD_BASIC_STRING %include #define %swig_basic_string(Type...) %swig_sequence_methods_val(Type) %traits_swigtype(std::basic_string); %fragment(SWIG_Traits_frag(std::basic_string)); %fragment(SWIG_AsPtr_frag(std::basic_string),"header", fragment="SWIG_AsCharPtrAndSize") { SWIGINTERN int SWIG_AsPtr(std::basic_string)(VALUE obj, std::string **val) { static swig_type_info* string_info = SWIG_TypeQuery("std::basic_string *"); std::string *vptr; if (SWIG_IsOK(SWIG_ConvertPtr(obj, (void**)&vptr, string_info, 0))) { if (val) *val = vptr; return SWIG_OLDOBJ; } else { char* buf = 0 ; size_t size = 0; int alloc = 0; if (SWIG_IsOK(SWIG_AsCharPtrAndSize(obj, &buf, &size, &alloc))) { if (buf) { if (val) *val = new std::string(buf, size - 1); if (alloc == SWIG_NEWOBJ) %delete_array(buf); return SWIG_NEWOBJ; } } return SWIG_ERROR; } } } %fragment(SWIG_From_frag(std::basic_string),"header", fragment="SWIG_FromCharPtrAndSize") { SWIGINTERNINLINE VALUE SWIG_From(std::basic_string)(const std::string& s) { return SWIG_FromCharPtrAndSize(s.data(), s.size()); } } %ignore std::basic_string::operator!=; %ignore std::basic_string::operator+=; %include %typemaps_asptrfromn(%checkcode(STRING), std::basic_string); #endif #if !defined(SWIG_STD_WSTRING) %traits_swigtype(std::basic_string); %fragment(SWIG_Traits_frag(std::basic_string)); %fragment(SWIG_AsPtr_frag(std::basic_string),"header", fragment="SWIG_AsWCharPtrAndSize") { SWIGINTERN int SWIG_AsPtr(std::basic_string)(VALUE obj, std::wstring **val) { static swig_type_info* string_info = SWIG_TypeQuery("std::basic_string *"); std::wstring *vptr; if (SWIG_IsOK(SWIG_ConvertPtr(obj, (void**)&vptr, string_info, 0))) { if (val) *val = vptr; return SWIG_OLDOBJ; } else { wchar_t *buf = 0 ; size_t size = 0; int alloc = 0; if (SWIG_IsOK(SWIG_AsWCharPtrAndSize(obj, &buf, &size, &alloc))) { if (buf) { if (val) *val = new std::wstring(buf, size - 1); if (alloc == SWIG_NEWOBJ) %delete_array(buf); return SWIG_NEWOBJ; } } return SWIG_ERROR; } } } %fragment(SWIG_From_frag(std::basic_string),"header", fragment="SWIG_FromWCharPtrAndSize") { SWIGINTERNINLINE VALUE SWIG_From(std::basic_string)(const std::wstring& s) { return SWIG_FromWCharPtrAndSize(s.data(), s.size()); } } %typemaps_asptrfromn(%checkcode(UNISTRING), std::basic_string); #endif swig-4.0.1/Lib/ruby/extra-install.list0000644000175000017500000000006513527063513017524 0ustar williamwilliam# see top-level Makefile.in Makefile.swig extconf.rb swig-4.0.1/Lib/ruby/std_stack.i0000644000175000017500000000152413527063513016172 0ustar williamwilliam/* Stacks */ %fragment("StdStackTraits","header",fragment="StdSequenceTraits") %{ namespace swig { template struct traits_asptr > { static int asptr(VALUE obj, std::stack **vec) { return traits_asptr_stdseq >::asptr(obj, vec); } }; template struct traits_from > { static VALUE from(const std::stack& vec) { return traits_from_stdseq >::from(vec); } }; } %} %rename("delete") std::stack::__delete__; %rename("reject!") std::stack::reject_bang; %rename("map!") std::stack::map_bang; %rename("empty?") std::stack::empty; %rename("include?" ) std::stack::__contains__ const; %rename("has_key?" ) std::stack::has_key const; %alias std::stack::push "<<"; %include swig-4.0.1/Lib/ruby/argcargv.i0000644000175000017500000000231313527063513016004 0ustar williamwilliam/* ------------------------------------------------------------ * --- Argc & Argv --- * ------------------------------------------------------------ */ /* ------------------------------------------------------------ Use it as follow: %apply (int ARGC, char **ARGV) { (size_t argc, const char **argv) } %inline %{ int mainApp(size_t argc, const char **argv) { return argc; } then in the ruby side: args = ["asdf", "asdf2"] mainApp(args); * ------------------------------------------------------------ */ %typemap(in) (int ARGC, char **ARGV) { if (rb_obj_is_kind_of($input,rb_cArray)) { int i; int size = RARRAY_LEN($input); $1 = ($1_ltype) size; $2 = (char **) malloc((size+1)*sizeof(char *)); VALUE *ptr = RARRAY_PTR($input); for (i=0; i < size; i++, ptr++) { $2[i]= StringValuePtr(*ptr); } $2[i]=NULL; } else { $1 = 0; $2 = 0; %argument_fail(SWIG_TypeError, "int ARGC, char **ARGV", $symname, $argnum); } } %typemap(typecheck, precedence=SWIG_TYPECHECK_STRING_ARRAY) (int ARGC, char **ARGV) { $1 = rb_obj_is_kind_of($input,rb_cArray); } %typemap(freearg) (int ARGC, char **ARGV) { free((char *) $2); } swig-4.0.1/Lib/ruby/std_streambuf.i0000644000175000017500000000003713527063513017053 0ustar williamwilliam%include swig-4.0.1/Lib/ruby/std_common.i0000644000175000017500000000443613527063513016362 0ustar williamwilliam%include %include %include /* Generate the traits for a 'primitive' type, such as 'double', for which the SWIG_AsVal and SWIG_From methods are already defined. */ %define %traits_ptypen(Type...) %fragment(SWIG_Traits_frag(Type),"header", fragment=SWIG_AsVal_frag(Type), fragment=SWIG_From_frag(Type), fragment="StdTraits") { namespace swig { template <> struct traits< Type > { typedef value_category category; static const char* type_name() { return #Type; } }; template <> struct traits_asval< Type > { typedef Type value_type; static int asval(VALUE obj, value_type *val) { return SWIG_AsVal(Type)(obj, val); } }; template <> struct traits_from< Type > { typedef Type value_type; static VALUE from(const value_type& val) { return SWIG_From(Type)(val); } }; } } %enddef /* Traits for enums. This is bit of a sneaky trick needed because a generic template specialization of enums is not possible (unless using template meta-programming which SWIG doesn't support because of the explicit instantiations required using %template). The STL containers define the 'front' method and the typemap below is used whenever the front method is wrapped returning an enum. This typemap simply picks up the standard enum typemap, but additionally drags in a fragment containing the traits_asval and traits_from required in the generated code for enums. */ %define %traits_enum(Type...) %fragment("SWIG_Traits_enum_"{Type},"header", fragment=SWIG_AsVal_frag(int), fragment=SWIG_From_frag(int), fragment="StdTraits") { namespace swig { template <> struct traits_asval< Type > { typedef Type value_type; static int asval(VALUE obj, value_type *val) { return SWIG_AsVal(int)(obj, (int *)val); } }; template <> struct traits_from< Type > { typedef Type value_type; static VALUE from(const value_type& val) { return SWIG_From(int)((int)val); } }; } } %typemap(out, fragment="SWIG_Traits_enum_"{Type}) const enum SWIGTYPE& front %{$typemap(out, const enum SWIGTYPE&)%} %enddef %include // // Generates the traits for all the known primitive // C++ types (int, double, ...) // %apply_cpptypes(%traits_ptypen); swig-4.0.1/Lib/ruby/std_except.i0000644000175000017500000000004313527063513016350 0ustar williamwilliam%include swig-4.0.1/Lib/ruby/rubywstrings.swg0000644000175000017500000000404113527063513017342 0ustar williamwilliam/* ----------------------------------------------------------------------------- * rubywstrings.swg * * utility methods for wchar_t strings * ------------------------------------------------------------ */ %fragment("SWIG_AsWCharPtrAndSize","header",fragment="",fragment="SWIG_pwchar_descriptor",fragment="SWIG_AsCharPtrAndSize",fragment="SWIG_ruby_wstring_encoding_init") { SWIGINTERN int SWIG_AsWCharPtrAndSize(VALUE obj, wchar_t **cptr, size_t *psize, int *alloc) { rb_encoding* wstr_enc = swig_ruby_wstring_encoding; if (TYPE(obj) == T_STRING) { VALUE rstr = rb_str_conv_enc(obj, rb_enc_get(obj), wstr_enc); wchar_t* cstr = (wchar_t*) StringValuePtr(rstr); size_t size = RSTRING_LEN(rstr) / sizeof(wchar_t) + 1; if ( RSTRING_LEN(rstr) % sizeof(wchar_t) != 0 ) { rb_raise(rb_eRuntimeError, "The length of the byte sequence of converted string is not a multiplier of sizeof(wchar_t). Invalid byte sequence is given. Or invalid SWIG_RUBY_WSTRING_ENCODING is given when compiling this binding."); } if (cptr && alloc) { *alloc = SWIG_NEWOBJ; *cptr = %new_array(size, wchar_t); memmove(*cptr, cstr, RSTRING_LEN(rstr)); } if (psize) *psize = size; return SWIG_OK; } else { return SWIG_TypeError; } } } %fragment("SWIG_FromWCharPtrAndSize","header",fragment="",fragment="SWIG_pwchar_descriptor",fragment="SWIG_FromCharPtrAndSize",fragment="SWIG_ruby_wstring_encoding_init") { SWIGINTERNINLINE VALUE SWIG_FromWCharPtrAndSize(const wchar_t * carray, size_t size) { rb_encoding* wstr_enc = swig_ruby_wstring_encoding; rb_encoding* rb_enc = swig_ruby_internal_encoding; if (carray && size <= LONG_MAX/sizeof(wchar_t)) { VALUE rstr = rb_str_new( (const char*)carray, %numeric_cast(size*sizeof(wchar_t),long) ); rb_encoding* new_enc = rb_default_internal_encoding(); rb_enc_associate(rstr, wstr_enc); if ( !new_enc ) { new_enc = rb_enc; } return rb_str_conv_enc(rstr, wstr_enc, new_enc); } else { return Qnil; } } } swig-4.0.1/Lib/ruby/rubycomplex.swg0000644000175000017500000000742413527063513017141 0ustar williamwilliam/* Defines the As/From conversors for double/float complex, you need to provide complex Type, the Name you want to use in the converters, the complex Constructor method, and the Real and Imag complex accessor methods. See the std_complex.i and ccomplex.i for concrete examples. */ %fragment("rb_complex_new","header") { %#if !defined(T_COMPLEX) /* Ruby versions prior to 1.9 did not have native complex numbers. They were an extension in the STD library. */ SWIGINTERN VALUE rb_complex_new(VALUE x, VALUE y) { static ID new_id = rb_intern("new"); static VALUE cComplex = rb_const_get(rb_cObject, rb_intern("Complex")); return rb_funcall(cComplex, new_id, 2, x, y); } %#endif } %fragment("SWIG_Complex_Numbers","header") { %#if !defined(T_COMPLEX) SWIGINTERN int SWIG_Is_Complex( VALUE obj ) { static ID real_id = rb_intern("real"); static ID imag_id = rb_intern("imag"); return ( (rb_respond_to( obj, real_id ) ) && (rb_respond_to( obj, imag_id ) ) ); } %#else SWIGINTERN int SWIG_Is_Complex( VALUE obj ) { return TYPE(obj) == T_COMPLEX; } %#endif SWIGINTERN VALUE SWIG_Complex_Real(VALUE obj) { static ID real_id = rb_intern("real"); return rb_funcall(obj, real_id, 0); } SWIGINTERN VALUE SWIG_Complex_Imaginary(VALUE obj) { static ID imag_id = rb_intern("imag"); return rb_funcall(obj, imag_id, 0); } } %init { %#if !defined(T_COMPLEX) rb_require("complex"); %#endif } /* the common from converter */ %define %swig_fromcplx_conv(Type, Real, Imag) %fragment(SWIG_From_frag(Type),"header",fragment="rb_complex_new") { SWIGINTERNINLINE VALUE SWIG_From(Type)(%ifcplusplus(const Type&, Type) c) { VALUE re = rb_float_new(Real(c)); VALUE im = rb_float_new(Imag(c)); return rb_complex_new(re, im); } } %enddef /* the double case */ %define %swig_cplxdbl_conv(Type, Constructor, Real, Imag) %fragment(SWIG_AsVal_frag(Type),"header", fragment=SWIG_AsVal_frag(double), fragment="SWIG_Complex_Numbers") { SWIGINTERN int SWIG_AsVal(Type) (VALUE o, Type* val) { if ( SWIG_Is_Complex( o ) ) { if (val) { VALUE real = SWIG_Complex_Real(o); VALUE imag = SWIG_Complex_Imaginary(o); double re = 0; SWIG_AsVal_double( real, &re ); double im = 0; SWIG_AsVal_double( imag, &im ); *val = Constructor(re, im); } return SWIG_OK; } else { double d; int res = SWIG_AddCast(SWIG_AsVal(double)(o, &d)); if (SWIG_IsOK(res)) { if (val) *val = Constructor(d, 0.0); return res; } } return SWIG_TypeError; } } %swig_fromcplx_conv(Type, Real, Imag); %enddef /* the float case */ %define %swig_cplxflt_conv(Type, Constructor, Real, Imag) %fragment(SWIG_AsVal_frag(Type),"header", fragment=SWIG_AsVal_frag(float), fragment=SWIG_AsVal_frag(double), fragment="SWIG_Complex_Numbers") { SWIGINTERN int SWIG_AsVal(Type)(VALUE o, Type *val) { if ( SWIG_Is_Complex( o ) ) { VALUE real = SWIG_Complex_Real(o); VALUE imag = SWIG_Complex_Imaginary(o); double re = 0; SWIG_AsVal_double( real, &re ); double im = 0; SWIG_AsVal_double( imag, &im ); if ((-FLT_MAX <= re && re <= FLT_MAX) && (-FLT_MAX <= im && im <= FLT_MAX)) { if (val) *val = Constructor(%numeric_cast(re, float), %numeric_cast(im, float)); return SWIG_OK; } else { return SWIG_OverflowError; } } else { float re; int res = SWIG_AddCast(SWIG_AsVal(float)(o, &re)); if (SWIG_IsOK(res)) { if (val) *val = Constructor(re, 0.0); return res; } } return SWIG_TypeError; } } %swig_fromcplx_conv(Type, Real, Imag); %enddef #define %swig_cplxflt_convn(Type, Constructor, Real, Imag) \ %swig_cplxflt_conv(Type, Constructor, Real, Imag) #define %swig_cplxdbl_convn(Type, Constructor, Real, Imag) \ %swig_cplxdbl_conv(Type, Constructor, Real, Imag) swig-4.0.1/Lib/ruby/typemaps.i0000644000175000017500000002606213527063513016061 0ustar williamwilliam/* ----------------------------------------------------------------------------- * typemaps.i * * Pointer handling * * These mappings provide support for input/output arguments and * common uses for C/C++ pointers. INOUT mappings allow for C/C++ * pointer variables in addition to input/output arguments. * ----------------------------------------------------------------------------- */ #if !defined(SWIG_USE_OLD_TYPEMAPS) %include #else /* The SWIG typemap library provides a language independent mechanism for supporting output arguments, input values, and other C function calling mechanisms. The primary use of the library is to provide a better interface to certain C function--especially those involving pointers. */ // ------------------------------------------------------------------------ // Pointer handling // // These mappings provide support for input/output arguments and common // uses for C/C++ pointers. // ------------------------------------------------------------------------ // INPUT typemaps. // These remap a C pointer to be an "INPUT" value which is passed by value // instead of reference. /* The following methods can be applied to turn a pointer into a simple "input" value. That is, instead of passing a pointer to an object, you would use a real value instead. int *INPUT short *INPUT long *INPUT long long *INPUT unsigned int *INPUT unsigned short *INPUT unsigned long *INPUT unsigned long long *INPUT unsigned char *INPUT bool *INPUT float *INPUT double *INPUT To use these, suppose you had a C function like this : double fadd(double *a, double *b) { return *a+*b; } You could wrap it with SWIG as follows : %include typemaps.i double fadd(double *INPUT, double *INPUT); or you can use the %apply directive : %include typemaps.i %apply double *INPUT { double *a, double *b }; double fadd(double *a, double *b); */ %define INPUT_TYPEMAP(type, converter) %typemap(in) type *INPUT($*1_ltype temp), type &INPUT($*1_ltype temp) { temp = ($*1_ltype) converter($input); $1 = &temp; } %typemap(typecheck) type *INPUT = type; %typemap(typecheck) type &INPUT = type; %enddef INPUT_TYPEMAP(float, NUM2DBL); INPUT_TYPEMAP(double, NUM2DBL); INPUT_TYPEMAP(int, NUM2INT); INPUT_TYPEMAP(short, NUM2SHRT); INPUT_TYPEMAP(long, NUM2LONG); INPUT_TYPEMAP(long long, NUM2LL); INPUT_TYPEMAP(unsigned int, NUM2UINT); INPUT_TYPEMAP(unsigned short, NUM2USHRT); INPUT_TYPEMAP(unsigned long, NUM2ULONG); INPUT_TYPEMAP(unsigned long long, NUM2ULL); INPUT_TYPEMAP(unsigned char, NUM2UINT); INPUT_TYPEMAP(signed char, NUM2INT); INPUT_TYPEMAP(bool, RTEST); #undef INPUT_TYPEMAP // OUTPUT typemaps. These typemaps are used for parameters that // are output only. The output value is appended to the result as // a array element. /* The following methods can be applied to turn a pointer into an "output" value. When calling a function, no input value would be given for a parameter, but an output value would be returned. In the case of multiple output values, they are returned in the form of a Ruby Array. int *OUTPUT short *OUTPUT long *OUTPUT long long *OUTPUT unsigned int *OUTPUT unsigned short *OUTPUT unsigned long *OUTPUT unsigned long long *OUTPUT unsigned char *OUTPUT bool *OUTPUT float *OUTPUT double *OUTPUT For example, suppose you were trying to wrap the modf() function in the C math library which splits x into integral and fractional parts (and returns the integer part in one of its parameters).K: double modf(double x, double *ip); You could wrap it with SWIG as follows : %include typemaps.i double modf(double x, double *OUTPUT); or you can use the %apply directive : %include typemaps.i %apply double *OUTPUT { double *ip }; double modf(double x, double *ip); The Ruby output of the function would be a Array containing both output values. */ %define OUTPUT_TYPEMAP(type, converter, convtype) %typemap(in,numinputs=0) type *OUTPUT($*1_ltype temp), type &OUTPUT($*1_ltype temp) "$1 = &temp;"; %typemap(argout, fragment="output_helper") type *OUTPUT, type &OUTPUT { VALUE o = converter(convtype (*$1)); $result = output_helper($result, o); } %enddef OUTPUT_TYPEMAP(int, INT2NUM, (int)); OUTPUT_TYPEMAP(short, INT2NUM, (int)); OUTPUT_TYPEMAP(long, INT2NUM, (long)); OUTPUT_TYPEMAP(long long, LL2NUM, (long long)); OUTPUT_TYPEMAP(unsigned int, UINT2NUM, (unsigned int)); OUTPUT_TYPEMAP(unsigned short, UINT2NUM, (unsigned int)); OUTPUT_TYPEMAP(unsigned long, UINT2NUM, (unsigned long)); OUTPUT_TYPEMAP(unsigned long long, ULL2NUM, (unsigned long long)); OUTPUT_TYPEMAP(unsigned char, UINT2NUM, (unsigned int)); OUTPUT_TYPEMAP(signed char, INT2NUM, (int)); OUTPUT_TYPEMAP(float, rb_float_new, (double)); OUTPUT_TYPEMAP(double, rb_float_new, (double)); #undef OUTPUT_TYPEMAP %typemap(in,numinputs=0) bool *OUTPUT(bool temp), bool &OUTPUT(bool temp) "$1 = &temp;"; %typemap(argout, fragment="output_helper") bool *OUTPUT, bool &OUTPUT { VALUE o = (*$1) ? Qtrue : Qfalse; $result = output_helper($result, o); } // INOUT // Mappings for an argument that is both an input and output // parameter /* The following methods can be applied to make a function parameter both an input and output value. This combines the behavior of both the "INPUT" and "OUTPUT" methods described earlier. Output values are returned in the form of a Ruby array. int *INOUT short *INOUT long *INOUT long long *INOUT unsigned int *INOUT unsigned short *INOUT unsigned long *INOUT unsigned long long *INOUT unsigned char *INOUT bool *INOUT float *INOUT double *INOUT For example, suppose you were trying to wrap the following function : void neg(double *x) { *x = -(*x); } You could wrap it with SWIG as follows : %include typemaps.i void neg(double *INOUT); or you can use the %apply directive : %include typemaps.i %apply double *INOUT { double *x }; void neg(double *x); Unlike C, this mapping does not directly modify the input value (since this makes no sense in Ruby). Rather, the modified input value shows up as the return value of the function. Thus, to apply this function to a Ruby variable you might do this : x = neg(x) Note : previous versions of SWIG used the symbol 'BOTH' to mark input/output arguments. This is still supported, but will be slowly phased out in future releases. */ %typemap(in) int *INOUT = int *INPUT; %typemap(in) short *INOUT = short *INPUT; %typemap(in) long *INOUT = long *INPUT; %typemap(in) long long *INOUT = long long *INPUT; %typemap(in) unsigned *INOUT = unsigned *INPUT; %typemap(in) unsigned short *INOUT = unsigned short *INPUT; %typemap(in) unsigned long *INOUT = unsigned long *INPUT; %typemap(in) unsigned long long *INOUT = unsigned long long *INPUT; %typemap(in) unsigned char *INOUT = unsigned char *INPUT; %typemap(in) signed char *INOUT = signed char *INPUT; %typemap(in) bool *INOUT = bool *INPUT; %typemap(in) float *INOUT = float *INPUT; %typemap(in) double *INOUT = double *INPUT; %typemap(in) int &INOUT = int &INPUT; %typemap(in) short &INOUT = short &INPUT; %typemap(in) long &INOUT = long &INPUT; %typemap(in) long long &INOUT = long long &INPUT; %typemap(in) unsigned &INOUT = unsigned &INPUT; %typemap(in) unsigned short &INOUT = unsigned short &INPUT; %typemap(in) unsigned long &INOUT = unsigned long &INPUT; %typemap(in) unsigned long long &INOUT = unsigned long long &INPUT; %typemap(in) unsigned char &INOUT = unsigned char &INPUT; %typemap(in) signed char &INOUT = signed char &INPUT; %typemap(in) bool &INOUT = bool &INPUT; %typemap(in) float &INOUT = float &INPUT; %typemap(in) double &INOUT = double &INPUT; %typemap(argout) int *INOUT = int *OUTPUT; %typemap(argout) short *INOUT = short *OUTPUT; %typemap(argout) long *INOUT = long *OUTPUT; %typemap(argout) long long *INOUT = long long *OUTPUT; %typemap(argout) unsigned *INOUT = unsigned *OUTPUT; %typemap(argout) unsigned short *INOUT = unsigned short *OUTPUT; %typemap(argout) unsigned long *INOUT = unsigned long *OUTPUT; %typemap(argout) unsigned long long *INOUT = unsigned long long *OUTPUT; %typemap(argout) unsigned char *INOUT = unsigned char *OUTPUT; %typemap(argout) signed char *INOUT = signed char *OUTPUT; %typemap(argout) bool *INOUT = bool *OUTPUT; %typemap(argout) float *INOUT = float *OUTPUT; %typemap(argout) double *INOUT = double *OUTPUT; %typemap(argout) int &INOUT = int &OUTPUT; %typemap(argout) short &INOUT = short &OUTPUT; %typemap(argout) long &INOUT = long &OUTPUT; %typemap(argout) long long &INOUT = long long &OUTPUT; %typemap(argout) unsigned &INOUT = unsigned &OUTPUT; %typemap(argout) unsigned short &INOUT = unsigned short &OUTPUT; %typemap(argout) unsigned long &INOUT = unsigned long &OUTPUT; %typemap(argout) unsigned long long &INOUT = unsigned long long &OUTPUT; %typemap(argout) unsigned char &INOUT = unsigned char &OUTPUT; %typemap(argout) signed char &INOUT = signed char &OUTPUT; %typemap(argout) bool &INOUT = bool &OUTPUT; %typemap(argout) float &INOUT = float &OUTPUT; %typemap(argout) double &INOUT = double &OUTPUT; /* Overloading information */ %typemap(typecheck) double *INOUT = double; %typemap(typecheck) signed char *INOUT = signed char; %typemap(typecheck) unsigned char *INOUT = unsigned char; %typemap(typecheck) unsigned long *INOUT = unsigned long; %typemap(typecheck) unsigned long long *INOUT = unsigned long long; %typemap(typecheck) unsigned short *INOUT = unsigned short; %typemap(typecheck) unsigned int *INOUT = unsigned int; %typemap(typecheck) long *INOUT = long; %typemap(typecheck) long long *INOUT = long long; %typemap(typecheck) short *INOUT = short; %typemap(typecheck) int *INOUT = int; %typemap(typecheck) float *INOUT = float; %typemap(typecheck) double &INOUT = double; %typemap(typecheck) signed char &INOUT = signed char; %typemap(typecheck) unsigned char &INOUT = unsigned char; %typemap(typecheck) unsigned long &INOUT = unsigned long; %typemap(typecheck) unsigned long long &INOUT = unsigned long long; %typemap(typecheck) unsigned short &INOUT = unsigned short; %typemap(typecheck) unsigned int &INOUT = unsigned int; %typemap(typecheck) long &INOUT = long; %typemap(typecheck) long long &INOUT = long long; %typemap(typecheck) short &INOUT = short; %typemap(typecheck) int &INOUT = int; %typemap(typecheck) float &INOUT = float; #endif // -------------------------------------------------------------------- // Special types // -------------------------------------------------------------------- %include %include %include swig-4.0.1/Lib/ruby/std_queue.i0000644000175000017500000000152213527063513016207 0ustar williamwilliam/* Queues */ %fragment("StdQueueTraits","header",fragment="StdSequenceTraits") %{ namespace swig { template struct traits_asptr > { static int asptr(VALUE obj, std::queue **vec) { return traits_asptr_stdseq >::asptr(obj, vec); } }; template struct traits_from > { static VALUE from(const std::queue& vec) { return traits_from_stdseq >::from(vec); } }; } %} %rename("delete") std::queue::__delete__; %rename("reject!") std::queue::reject_bang; %rename("map!") std::queue::map_bang; %rename("empty?") std::queue::empty; %rename("include?" ) std::queue::__contains__ const; %rename("has_key?" ) std::queue::has_key const; %alias std::queue::push "<<"; %include swig-4.0.1/Lib/ruby/rubystdfunctors.swg0000644000175000017500000000773113527063513020051 0ustar williamwilliam/** * @file rubystdfunctors.swg * @date Sun May 6 00:44:33 2007 * * @brief This file provides unary and binary functors for STL * containers, that will invoke a Ruby proc or method to do * their operation. * * You can use them in a swig file like: * * %include * %include * * %template< IntSet > std::set< int, swig::BinaryPredicate<> >; * * * which will then allow calling them from Ruby either like: * * # order of set is defined by C++ default * a = IntSet.new * * # sort order defined by Ruby proc * b = IntSet.new( proc { |a,b| a > b } ) * */ %include rubyclasses.swg namespace swig { %apply GC_VALUE { UnaryPredicate, BinaryPredicate, UnaryFunction, BinaryFunction }; %typecheck(SWIG_TYPECHECK_POINTER,noblock=1) UnaryPredicate, UnaryPredicate&, UnaryFunction, UnaryFunction& { $1 = SWIG_Ruby_isCallable($input) && SWIG_Ruby_arity($input, 1); } %typecheck(SWIG_TYPECHECK_POINTER,noblock=1) BinaryPredicate, BinaryPredicate&, BinaryFunction, BinaryFunction& { $1 = SWIG_Ruby_isCallable($input) && SWIG_Ruby_arity($input, 2); } %typemap(in,noblock=1) BinaryFunction&, BinaryFunction { $1 = new swig::BinaryFunction< >($input); } %typemap(in,noblock=1) UnaryFunction&, UnaryFunction { $1 = new swig::UnaryFunction< >($input); } %typemap(in,noblock=1) BinaryPredicate&, BinaryPredicate { $1 = new swig::BinaryPredicate<>($input); } %typemap(in,noblock=1) UnaryPredicate&, UnaryPredicate { $1 = new swig::UnaryPredicate< >($input); } %ignore BinaryFunction; template< class _T = GC_VALUE > struct BinaryFunction { }; %ignore UnaryFunction; template< class _T = GC_VALUE > struct UnaryFunction { }; %ignore BinaryPredicate; template< class _T = GC_VALUE > struct BinaryPredicate { }; %ignore UnaryPredicate; template< class _T = GC_VALUE > struct UnaryPredicate { }; } %fragment("StdFunctors","header",fragment="StdTraits",fragment="GC_VALUE_definition") { namespace swig { static ID call_id = rb_intern("call"); template > struct BinaryPredicate : GC_VALUE { BinaryPredicate(VALUE obj = Qnil) : GC_VALUE(obj) { } bool operator()(_T a, _T b) const { if (_obj != Qnil) { SWIG_RUBY_THREAD_BEGIN_BLOCK; VALUE arg1 = swig::from(a); VALUE arg2 = swig::from(b); VALUE res = rb_funcall( _obj, swig::call_id, 2, arg1, arg2); SWIG_RUBY_THREAD_END_BLOCK; return RTEST(res); } else { return _DefaultFunc()(a, b); } } }; template > struct BinaryFunction : GC_VALUE { BinaryFunction(VALUE obj = Qnil) : GC_VALUE(obj) { } _T operator()(_T a, _T b) const { if (_obj != Qnil) { SWIG_RUBY_THREAD_BEGIN_BLOCK; VALUE arg1 = swig::from(a); VALUE arg2 = swig::from(b); VALUE res = rb_funcall( _obj, swig::call_id, 2, arg1, arg2); SWIG_RUBY_THREAD_END_BLOCK; return swig::as<_T >(res); } else { return _DefaultFunc()(a, b); } } }; template< class _T = GC_VALUE > struct UnaryPredicate : GC_VALUE { UnaryPredicate(VALUE obj = Qnil) : GC_VALUE(obj) { } bool operator()(_T a) const { SWIG_RUBY_THREAD_BEGIN_BLOCK; VALUE arg1 = swig::from<_T >(a); VALUE res = rb_funcall( _obj, swig::call_id, 1, arg1); SWIG_RUBY_THREAD_END_BLOCK; return RTEST(res); } }; template< class _T = GC_VALUE > struct UnaryFunction : GC_VALUE { UnaryFunction(VALUE obj = Qnil) : GC_VALUE(obj) { } _T operator()(_T a) const { SWIG_RUBY_THREAD_BEGIN_BLOCK; VALUE arg1 = swig::from(a); VALUE res = rb_funcall( _obj, swig::call_id, 1, VALUE(arg1)); SWIG_RUBY_THREAD_END_BLOCK; return swig::as< _T >(res); } }; } // namespace swig } swig-4.0.1/Lib/ruby/rubyapi.swg0000644000175000017500000000144113527063513016234 0ustar williamwilliam/* ----------------------------------------------------------------------------- * Ruby API portion that goes into the runtime * ----------------------------------------------------------------------------- */ #ifdef __cplusplus extern "C" { #endif SWIGINTERN VALUE SWIG_Ruby_AppendOutput(VALUE target, VALUE o) { if (NIL_P(target)) { target = o; } else { if (TYPE(target) != T_ARRAY) { VALUE o2 = target; target = rb_ary_new(); rb_ary_push(target, o2); } rb_ary_push(target, o); } return target; } /* For ruby1.8.4 and earlier. */ #ifndef RUBY_INIT_STACK RUBY_EXTERN void Init_stack(VALUE* addr); # define RUBY_INIT_STACK \ VALUE variable_in_this_stack_frame; \ Init_stack(&variable_in_this_stack_frame); #endif #ifdef __cplusplus } #endif swig-4.0.1/Lib/ruby/rubymacros.swg0000644000175000017500000000071013527063513016745 0ustar williamwilliam // Redefine these macros so argument index for ruby is done properly, // ignoring self and we get some more info about the input. #define %argfail_fmt(_type,_name,_argn) Ruby_Format_TypeError( "", _type, #_name, _argn, $input ) #define %argnullref_fmt(_type,_name,_argn) Ruby_Format_TypeError(%nullref_fmt(), _type, #_name, _argn, $input) %{ #define SWIG_RUBY_THREAD_BEGIN_BLOCK #define SWIG_RUBY_THREAD_END_BLOCK %} %include swig-4.0.1/Lib/ruby/std_array.i0000644000175000017500000000671513527063513016212 0ustar williamwilliam/* std::array */ %fragment("StdArrayTraits","header",fragment="StdSequenceTraits") %{ namespace swig { template struct traits_asptr > { static int asptr(VALUE obj, std::array **vec) { return traits_asptr_stdseq >::asptr(obj, vec); } }; template struct traits_from > { static VALUE from(const std::array& vec) { return traits_from_stdseq >::from(vec); } }; template inline void assign(const RubySeq& rubyseq, std::array* seq) { if (rubyseq.size() < seq->size()) throw std::invalid_argument("std::array cannot be expanded in size"); else if (rubyseq.size() > seq->size()) throw std::invalid_argument("std::array cannot be reduced in size"); std::copy(rubyseq.begin(), rubyseq.end(), seq->begin()); } template inline void resize(std::array *seq, typename std::array::size_type n, typename std::array::value_type x) { throw std::invalid_argument("std::array is a fixed size container and does not support resizing"); } // Only limited slicing is supported as std::array is fixed in size template inline std::array* getslice(const std::array* self, Difference i, Difference j) { typedef std::array Sequence; typename Sequence::size_type size = self->size(); typename Sequence::size_type ii = swig::check_index(i, size, (i == size && j == size)); typename Sequence::size_type jj = swig::slice_index(j, size); if (ii == 0 && jj == size) { Sequence *sequence = new Sequence(); std::copy(self->begin(), self->end(), sequence->begin()); return sequence; } else { throw std::invalid_argument("std::array object only supports getting a slice that is the size of the array"); } } template inline void setslice(std::array* self, Difference i, Difference j, const InputSeq& v) { typedef std::array Sequence; typename Sequence::size_type size = self->size(); typename Sequence::size_type ii = swig::check_index(i, size, true); typename Sequence::size_type jj = swig::slice_index(j, size); if (ii == 0 && jj == size) { std::copy(v.begin(), v.end(), self->begin()); } else { throw std::invalid_argument("std::array object only supports setting a slice that is the size of the array"); } } template inline void delslice(std::array* self, Difference i, Difference j) { throw std::invalid_argument("std::array object does not support item deletion"); } } %} %define %swig_array_methods(Type...) %swig_sequence_methods_non_resizable(Type) %enddef %define %swig_array_methods_val(Type...) %swig_sequence_methods_non_resizable_val(Type); %enddef %mixin std::array "Enumerable"; %ignore std::array::push_back; %ignore std::array::pop_back; %rename("delete") std::array::__delete__; %rename("reject!") std::array::reject_bang; %rename("map!") std::array::map_bang; %rename("empty?") std::array::empty; %rename("include?" ) std::array::__contains__ const; %rename("has_key?" ) std::array::has_key const; %include swig-4.0.1/Lib/ruby/rubyprimtypes.swg0000644000175000017500000001252513527063513017524 0ustar williamwilliam/* ----------------------------------------------------------------------------- * rubyprimtypes.swg * ----------------------------------------------------------------------------- */ /* ------------------------------------------------------------ * Primitive Types * ------------------------------------------------------------ */ /* auxiliary ruby fail method */ %fragment("SWIG_ruby_failed","header") { SWIGINTERN VALUE SWIG_ruby_failed(void) { return Qnil; } } %define %ruby_aux_method(Type, Method, Action) SWIGINTERN VALUE SWIG_AUX_##Method##(VALUE *args) { VALUE obj = args[0]; VALUE type = TYPE(obj); Type *res = (Type *)(args[1]); *res = Action; return obj; } %enddef /* boolean */ %fragment(SWIG_From_frag(bool),"header") { SWIGINTERNINLINE VALUE SWIG_From_dec(bool)(bool value) { return value ? Qtrue : Qfalse; } } %fragment(SWIG_AsVal_frag(bool),"header", fragment=SWIG_AsVal_frag(int)) { SWIGINTERN int SWIG_AsVal_dec(bool)(VALUE obj, bool *val) { if (obj == Qtrue) { if (val) *val = true; return SWIG_OK; } else if (obj == Qfalse) { if (val) *val = false; return SWIG_OK; } else { int res = 0; if (SWIG_AsVal(int)(obj, &res) == SWIG_OK) { if (val) *val = res ? true : false; return SWIG_OK; } } return SWIG_TypeError; } } /* long */ %fragment(SWIG_From_frag(long),"header", fragment="") { %define_as(SWIG_From_dec(long), LONG2NUM) } %fragment(SWIG_AsVal_frag(long),"header",fragment="SWIG_ruby_failed") { %ruby_aux_method(long, NUM2LONG, type == T_FIXNUM ? NUM2LONG(obj) : rb_big2long(obj)) SWIGINTERN int SWIG_AsVal_dec(long)(VALUE obj, long* val) { VALUE type = TYPE(obj); if ((type == T_FIXNUM) || (type == T_BIGNUM)) { long v; VALUE a[2]; a[0] = obj; a[1] = (VALUE)(&v); if (rb_rescue(RUBY_METHOD_FUNC(SWIG_AUX_NUM2LONG), (VALUE)a, RUBY_METHOD_FUNC(SWIG_ruby_failed), 0) != Qnil) { if (val) *val = v; return SWIG_OK; } } return SWIG_TypeError; } } /* unsigned long */ %fragment(SWIG_From_frag(unsigned long),"header", fragment=SWIG_From_frag(long)) { SWIGINTERNINLINE VALUE SWIG_From_dec(unsigned long)(unsigned long value) { return ULONG2NUM(value); } } %fragment(SWIG_AsVal_frag(unsigned long),"header",fragment="SWIG_ruby_failed") { %ruby_aux_method(unsigned long, NUM2ULONG, type == T_FIXNUM ? NUM2ULONG(obj) : rb_big2ulong(obj)) SWIGINTERN int SWIG_AsVal_dec(unsigned long)(VALUE obj, unsigned long *val) { VALUE type = TYPE(obj); if ((type == T_FIXNUM) || (type == T_BIGNUM)) { unsigned long v; VALUE a[2]; a[0] = obj; a[1] = (VALUE)(&v); if (rb_rescue(RUBY_METHOD_FUNC(SWIG_AUX_NUM2ULONG), (VALUE)a, RUBY_METHOD_FUNC(SWIG_ruby_failed), 0) != Qnil) { if (val) *val = v; return SWIG_OK; } } return SWIG_TypeError; } } /* long long */ %fragment(SWIG_From_frag(long long),"header", fragment=SWIG_From_frag(long), fragment="SWIG_LongLongAvailable") { %#ifdef SWIG_LONG_LONG_AVAILABLE SWIGINTERNINLINE VALUE SWIG_From_dec(long long)(long long value) { return LL2NUM(value); } %#endif } %fragment(SWIG_AsVal_frag(long long),"header", fragment="SWIG_ruby_failed", fragment="SWIG_LongLongAvailable") { %#ifdef SWIG_LONG_LONG_AVAILABLE %ruby_aux_method(long long, NUM2LL, type == T_FIXNUM ? NUM2LL(obj) : rb_big2ll(obj)) SWIGINTERN int SWIG_AsVal_dec(long long)(VALUE obj, long long *val) { VALUE type = TYPE(obj); if ((type == T_FIXNUM) || (type == T_BIGNUM)) { long long v; VALUE a[2]; a[0] = obj; a[1] = (VALUE)(&v); if (rb_rescue(RUBY_METHOD_FUNC(SWIG_AUX_NUM2LL), (VALUE)a, RUBY_METHOD_FUNC(SWIG_ruby_failed), 0) != Qnil) { if (val) *val = v; return SWIG_OK; } } return SWIG_TypeError; } %#endif } /* unsigned long long */ %fragment(SWIG_From_frag(unsigned long long),"header", fragment="SWIG_LongLongAvailable") { %#ifdef SWIG_LONG_LONG_AVAILABLE SWIGINTERNINLINE VALUE SWIG_From_dec(unsigned long long)(unsigned long long value) { return ULL2NUM(value); } %#endif } %fragment(SWIG_AsVal_frag(unsigned long long),"header", fragment="SWIG_ruby_failed", fragment="SWIG_LongLongAvailable") { %#ifdef SWIG_LONG_LONG_AVAILABLE %ruby_aux_method(long long, NUM2ULL, type == T_FIXNUM ? NUM2ULL(obj) : rb_big2ull(obj)) SWIGINTERN int SWIG_AsVal_dec(unsigned long long)(VALUE obj, unsigned long long *val) { VALUE type = TYPE(obj); if ((type == T_FIXNUM) || (type == T_BIGNUM)) { unsigned long long v; VALUE a[2]; a[0] = obj; a[1] = (VALUE)(&v); if (rb_rescue(RUBY_METHOD_FUNC(SWIG_AUX_NUM2ULL), (VALUE)a, RUBY_METHOD_FUNC(SWIG_ruby_failed), 0) != Qnil) { if (val) *val = v; return SWIG_OK; } } return SWIG_TypeError; } %#endif } /* double */ %fragment(SWIG_From_frag(double),"header") { %define_as(SWIG_From_dec(double), rb_float_new) } %fragment(SWIG_AsVal_frag(double),"header",fragment="SWIG_ruby_failed") { %ruby_aux_method(double, NUM2DBL, NUM2DBL(obj); (void)type) SWIGINTERN int SWIG_AsVal_dec(double)(VALUE obj, double *val) { VALUE type = TYPE(obj); if ((type == T_FLOAT) || (type == T_FIXNUM) || (type == T_BIGNUM)) { double v; VALUE a[2]; a[0] = obj; a[1] = (VALUE)(&v); if (rb_rescue(RUBY_METHOD_FUNC(SWIG_AUX_NUM2DBL), (VALUE)a, RUBY_METHOD_FUNC(SWIG_ruby_failed), 0) != Qnil) { if (val) *val = v; return SWIG_OK; } } return SWIG_TypeError; } } swig-4.0.1/Lib/ruby/embed.i0000644000175000017500000000025113527063513015263 0ustar williamwilliam%wrapper %{ #include int main(argc, argv) int argc; char **argv; { ruby_init(); ruby_options(argc, argv); ruby_run(); return 0; } %} swig-4.0.1/Lib/ruby/carrays.i0000644000175000017500000000020113527063513015646 0ustar williamwilliam%define %array_class(TYPE,NAME) %array_class_wrap(TYPE,NAME,__getitem__,__setitem__) %enddef %include swig-4.0.1/Lib/ruby/std_functors.i0000644000175000017500000000140013527063513016721 0ustar williamwilliam/** * @file std_functors.i * @date Sun May 6 00:44:33 2007 * * @brief This file provides unary and binary functors for STL * containers, that will invoke a Ruby proc or method to do * their operation. * * You can use them in a swig file like: * * %include * %include * * %template< IntSet > std::set< int, swig::BinaryPredicate >; * * * which will then allow calling them from Ruby either like: * * # order of set is defined by C++ default * a = IntSet.new * * # sort order defined by Ruby proc * b = IntSet.new( proc { |a,b| a > b } ) * */ %include %fragment("StdFunctors"); swig-4.0.1/Lib/ruby/std_pair.i0000644000175000017500000001263713527063513016027 0ustar williamwilliam/* Pairs */ %include //#define SWIG_STD_PAIR_ASVAL %fragment("StdPairTraits","header",fragment="StdTraits") { namespace swig { template struct traits_asval > { typedef std::pair value_type; static int get_pair(VALUE first, VALUE second, std::pair *val) { if (val) { T *pfirst = &(val->first); int res1 = swig::asval((VALUE)first, pfirst); if (!SWIG_IsOK(res1)) return res1; U *psecond = &(val->second); int res2 = swig::asval((VALUE)second, psecond); if (!SWIG_IsOK(res2)) return res2; return res1 > res2 ? res1 : res2; } else { T *pfirst = 0; int res1 = swig::asval((VALUE)first, pfirst); if (!SWIG_IsOK(res1)) return res1; U *psecond = 0; int res2 = swig::asval((VALUE)second, psecond); if (!SWIG_IsOK(res2)) return res2; return res1 > res2 ? res1 : res2; } } static int asval(VALUE obj, std::pair *val) { int res = SWIG_ERROR; if ( TYPE(obj) == T_ARRAY ) { if (RARRAY_LEN(obj) == 2) { VALUE first = rb_ary_entry(obj,0); VALUE second = rb_ary_entry(obj,1); res = get_pair(first, second, val); } } else { value_type *p; swig_type_info *descriptor = swig::type_info(); res = descriptor ? SWIG_ConvertPtr(obj, (void **)&p, descriptor, 0) : SWIG_ERROR; if (SWIG_IsOK(res) && val) *val = *p; } return res; } }; template struct traits_asptr > { typedef std::pair value_type; static int get_pair(VALUE first, VALUE second, std::pair **val) { if (val) { value_type *vp = %new_instance(std::pair); T *pfirst = &(vp->first); int res1 = swig::asval((VALUE)first, pfirst); if (!SWIG_IsOK(res1)) { %delete(vp); return res1; } U *psecond = &(vp->second); int res2 = swig::asval((VALUE)second, psecond); if (!SWIG_IsOK(res2)) { %delete(vp); return res2; } *val = vp; return SWIG_AddNewMask(res1 > res2 ? res1 : res2); } else { T *pfirst = 0; int res1 = swig::asval((VALUE)first, pfirst); if (!SWIG_IsOK(res1)) return res1; U *psecond = 0; int res2 = swig::asval((VALUE)second, psecond); if (!SWIG_IsOK(res2)) return res2; return res1 > res2 ? res1 : res2; } } static int asptr(VALUE obj, std::pair **val) { int res = SWIG_ERROR; if ( TYPE(obj) == T_ARRAY ) { if ( RARRAY_LEN(obj) == 2) { VALUE first = rb_ary_entry(obj,0); VALUE second = rb_ary_entry(obj,1); res = get_pair(first, second, val); } } else { value_type *p; swig_type_info *descriptor = swig::type_info(); res = descriptor ? SWIG_ConvertPtr(obj, (void **)&p, descriptor, 0) : SWIG_ERROR; if (SWIG_IsOK(res) && val) *val = p; } return res; } }; template struct traits_from > { static VALUE _wrap_pair_second( VALUE self ) { std::pair< typename swig::noconst_traits::noconst_type,U>* p = NULL; swig::asptr( self, &p ); return swig::from( p->second ); } static VALUE _wrap_pair_second_eq( VALUE self, VALUE arg ) { std::pair< typename swig::noconst_traits::noconst_type,U>* p = NULL; swig::asptr( self, &p ); return swig::from( p->second ); } static VALUE from(const std::pair& val) { VALUE obj = rb_ary_new2(2); rb_ary_push(obj, swig::from::noconst_type>(val.first)); rb_ary_push(obj, swig::from(val.second)); rb_define_singleton_method(obj, "second", VALUEFUNC(_wrap_pair_second), 0 ); rb_define_singleton_method(obj, "second=", VALUEFUNC(_wrap_pair_second_eq), 1 ); rb_obj_freeze(obj); // treat as immutable tuple return obj; } }; } } // Missing typemap %typemap(in) std::pair* (int res) { res = swig::asptr( $input, &$1 ); if (!SWIG_IsOK(res)) %argument_fail(res, "$1_type", $symname, $argnum); } %define %swig_pair_methods(pair...) %extend { VALUE inspect() const { VALUE tmp; const char *type_name = swig::type_name< pair >(); VALUE str = rb_str_new2( type_name ); str = rb_str_cat2( str, " (" ); tmp = swig::from( $self->first ); tmp = rb_obj_as_string( tmp ); str = rb_str_buf_append( str, tmp ); str = rb_str_cat2( str, "," ); tmp = swig::from( $self->second ); tmp = rb_obj_as_string( tmp ); str = rb_str_buf_append( str, tmp ); str = rb_str_cat2( str, ")" ); return str; } VALUE to_s() const { VALUE tmp; VALUE str = rb_str_new2( "(" ); tmp = swig::from( $self->first ); tmp = rb_obj_as_string( tmp ); str = rb_str_buf_append( str, tmp ); str = rb_str_cat2( str, "," ); tmp = swig::from( $self->second ); tmp = rb_obj_as_string( tmp ); str = rb_str_buf_append( str, tmp ); str = rb_str_cat2( str, ")" ); return str; } VALUE __getitem__( int index ) { if (( index % 2 ) == 0 ) return swig::from( $self->first ); else return swig::from( $self->second ); } VALUE __setitem__( int index, VALUE obj ) { int res; if (( index % 2 ) == 0 ) { res = swig::asval( obj, &($self->first) ); } else { res = swig::asval(obj, &($self->second) ); } if (!SWIG_IsOK(res)) rb_raise( rb_eArgError, "invalid item for " #pair ); return obj; } } // extend %enddef %include swig-4.0.1/Lib/ruby/rubykw.swg0000644000175000017500000000223113527063513016102 0ustar williamwilliam#ifndef RUBY_RUBYKW_SWG_ #define RUBY_RUBYKW_SWG_ /* Warnings for Ruby keywords */ #define RUBYKW(x) %keywordwarn("'" `x` "' is a ruby keyword, renaming to 'C_" `x` "'",rename="C_%s",fullname=1) `x` /* from http://www.rubycentral.com/book/language.html */ RUBYKW(BEGIN); RUBYKW(END); RUBYKW(alias); RUBYKW(and); RUBYKW(begin); RUBYKW(break); RUBYKW(case); RUBYKW(class); RUBYKW(def); RUBYKW("defined"); RUBYKW(do); RUBYKW(else); RUBYKW(elsif); RUBYKW(end); RUBYKW(ensure); RUBYKW(false); RUBYKW(fatal); RUBYKW(for); RUBYKW(if); RUBYKW(in); RUBYKW(module); RUBYKW(next); RUBYKW(nil); RUBYKW(not); RUBYKW(or); RUBYKW(redo); RUBYKW(rescue); RUBYKW(retry); RUBYKW(return); RUBYKW(self); RUBYKW(super); RUBYKW(then); RUBYKW(true); RUBYKW(undef); RUBYKW(unless); RUBYKW(until); RUBYKW(when); RUBYKW(while); RUBYKW(yield); // RUBYKW(FalseClass); // RUBYKW(TrueClass); // RUBYKW(Numeric); // RUBYKW(Integer); // RUBYKW(Fixnum); // RUBYKW(Float); // RUBYKW(Range); // RUBYKW(Array); // RUBYKW(String); // RUBYKW(IO); // RUBYKW(File); // RUBYKW(FileUtils); // RUBYKW(Find); // RUBYKW(Struct); // RUBYKW(OpenStruct); // RUBYKW(Regexp); #undef RUBYKW #endif //RUBY_RUBYKW_SWG_ swig-4.0.1/Lib/ruby/rubyclasses.swg0000644000175000017500000002617013527063513017126 0ustar williamwilliam#ifdef __cplusplus /* GC_VALUE is used as a replacement of Ruby's VALUE. GC_VALUE automatically handles registering and unregistering of the underlying Ruby object with the GC. It can be used if you want to create STL containers of VALUEs, such as: std::vector< GC_VALUE >; or as a member variable: struct A { GC_VALUE _obj; A(VALUE o) : _obj(o) { } }; or as a input/output value (not much use for this, as VALUE works just as well here, thou): GC_VALUE func(GC_VALUE obj) { GC_VALUE out = rb_obj_classname(obj); return out; } GC_VALUE is 'visible' at the wrapped side, so you can do: %template(RubyVector) std::vector; and all the proper typemaps will be used. */ %fragment("GC_VALUE_definition","header") { namespace swig { class SwigGCReferences { VALUE _hash; SwigGCReferences() : _hash(Qnil) { } ~SwigGCReferences() { if (_hash != Qnil) rb_gc_unregister_address(&_hash); } static void EndProcHandler(VALUE) { // Ruby interpreter ending - _hash can no longer be accessed. SwigGCReferences &s_references = instance(); s_references._hash = Qnil; } public: static SwigGCReferences& instance() { // Hash of all GC_VALUE's currently in use static SwigGCReferences s_references; return s_references; } static void initialize() { SwigGCReferences &s_references = instance(); if (s_references._hash == Qnil) { rb_set_end_proc(&EndProcHandler, Qnil); s_references._hash = rb_hash_new(); rb_gc_register_address(&s_references._hash); } } void GC_register(VALUE& obj) { if (FIXNUM_P(obj) || SPECIAL_CONST_P(obj) || SYMBOL_P(obj)) return; if (_hash != Qnil) { VALUE val = rb_hash_aref(_hash, obj); unsigned n = FIXNUM_P(val) ? NUM2UINT(val) : 0; ++n; rb_hash_aset(_hash, obj, INT2NUM(n)); } } void GC_unregister(const VALUE& obj) { if (FIXNUM_P(obj) || SPECIAL_CONST_P(obj) || SYMBOL_P(obj)) return; // this test should not be needed but I've noticed some very erratic // behavior of none being unregistered in some very rare situations. if (BUILTIN_TYPE(obj) == T_NONE) return; if (_hash != Qnil) { VALUE val = rb_hash_aref(_hash, obj); unsigned n = FIXNUM_P(val) ? NUM2UINT(val) : 1; --n; if (n) rb_hash_aset(_hash, obj, INT2NUM(n)); else rb_hash_delete(_hash, obj); } } }; class GC_VALUE { protected: VALUE _obj; static ID hash_id; static ID lt_id; static ID gt_id; static ID eq_id; static ID le_id; static ID ge_id; static ID pos_id; static ID neg_id; static ID inv_id; static ID add_id; static ID sub_id; static ID mul_id; static ID div_id; static ID mod_id; static ID and_id; static ID or_id; static ID xor_id; static ID lshift_id; static ID rshift_id; struct OpArgs { VALUE src; ID id; int nargs; VALUE target; }; public: GC_VALUE() : _obj(Qnil) { } GC_VALUE(const GC_VALUE& item) : _obj(item._obj) { SwigGCReferences::instance().GC_register(_obj); } GC_VALUE(VALUE obj) :_obj(obj) { SwigGCReferences::instance().GC_register(_obj); } ~GC_VALUE() { SwigGCReferences::instance().GC_unregister(_obj); } GC_VALUE & operator=(const GC_VALUE& item) { SwigGCReferences::instance().GC_unregister(_obj); _obj = item._obj; SwigGCReferences::instance().GC_register(_obj); return *this; } operator VALUE() const { return _obj; } VALUE inspect() const { return rb_inspect(_obj); } VALUE to_s() const { return rb_inspect(_obj); } static VALUE swig_rescue_swallow(VALUE) { /* VALUE errstr = rb_obj_as_string(rb_errinfo()); printf("Swallowing error: '%s'\n", RSTRING_PTR(StringValue(errstr))); */ return Qnil; /* Swallow Ruby exception */ } static VALUE swig_rescue_funcall(VALUE p) { OpArgs* args = (OpArgs*) p; return rb_funcall(args->src, args->id, args->nargs, args->target); } bool relational_equal_op(const GC_VALUE& other, const ID& op_id, bool (*op_func)(const VALUE& a, const VALUE& b)) const { if (FIXNUM_P(_obj) && FIXNUM_P(other._obj)) { return op_func(_obj, other._obj); } bool res = false; VALUE ret = Qnil; SWIG_RUBY_THREAD_BEGIN_BLOCK; if (rb_respond_to(_obj, op_id)) { OpArgs args; args.src = _obj; args.id = op_id; args.nargs = 1; args.target = VALUE(other); ret = rb_rescue(RUBY_METHOD_FUNC(swig_rescue_funcall), VALUE(&args), (RUBY_METHOD_FUNC(swig_rescue_swallow)), Qnil); } if (ret == Qnil) { VALUE a = rb_funcall( _obj, hash_id, 0 ); VALUE b = rb_funcall( VALUE(other), hash_id, 0 ); res = op_func(a, b); } else { res = RTEST(ret); } SWIG_RUBY_THREAD_END_BLOCK; return res; } static bool operator_eq(const VALUE& a, const VALUE& b) { return a == b; } static bool operator_lt(const VALUE& a, const VALUE& b) { return a < b; } static bool operator_le(const VALUE& a, const VALUE& b) { return a <= b; } static bool operator_gt(const VALUE& a, const VALUE& b) { return a > b; } static bool operator_ge(const VALUE& a, const VALUE& b) { return a >= b; } bool operator==(const GC_VALUE& other) const { return relational_equal_op(other, eq_id, operator_eq); } bool operator<(const GC_VALUE& other) const { return relational_equal_op(other, lt_id, operator_lt); } bool operator<=(const GC_VALUE& other) const { return relational_equal_op(other, le_id, operator_le); } bool operator>(const GC_VALUE& other) const { return relational_equal_op(other, gt_id, operator_gt); } bool operator>=(const GC_VALUE& other) const { return relational_equal_op(other, ge_id, operator_ge); } bool operator!=(const GC_VALUE& other) const { return !(this->operator==(other)); } GC_VALUE unary_op(const ID& op_id) const { VALUE ret = Qnil; SWIG_RUBY_THREAD_BEGIN_BLOCK; OpArgs args; args.src = _obj; args.id = op_id; args.nargs = 0; args.target = Qnil; ret = rb_rescue(RUBY_METHOD_FUNC(swig_rescue_funcall), VALUE(&args), (RUBY_METHOD_FUNC(swig_rescue_swallow)), Qnil); SWIG_RUBY_THREAD_END_BLOCK; return ret; } GC_VALUE operator+() const { return unary_op(pos_id); } GC_VALUE operator-() const { return unary_op(neg_id); } GC_VALUE operator~() const { return unary_op(inv_id); } GC_VALUE binary_op(const GC_VALUE& other, const ID& op_id) const { VALUE ret = Qnil; SWIG_RUBY_THREAD_BEGIN_BLOCK; OpArgs args; args.src = _obj; args.id = op_id; args.nargs = 1; args.target = VALUE(other); ret = rb_rescue(RUBY_METHOD_FUNC(swig_rescue_funcall), VALUE(&args), (RUBY_METHOD_FUNC(swig_rescue_swallow)), Qnil); SWIG_RUBY_THREAD_END_BLOCK; return GC_VALUE(ret); } GC_VALUE operator+(const GC_VALUE& other) const { return binary_op(other, add_id); } GC_VALUE operator-(const GC_VALUE& other) const { return binary_op(other, sub_id); } GC_VALUE operator*(const GC_VALUE& other) const { return binary_op(other, mul_id); } GC_VALUE operator/(const GC_VALUE& other) const { return binary_op(other, div_id); } GC_VALUE operator%(const GC_VALUE& other) const { return binary_op(other, mod_id); } GC_VALUE operator&(const GC_VALUE& other) const { return binary_op(other, and_id); } GC_VALUE operator^(const GC_VALUE& other) const { return binary_op(other, xor_id); } GC_VALUE operator|(const GC_VALUE& other) const { return binary_op(other, or_id); } GC_VALUE operator<<(const GC_VALUE& other) const { return binary_op(other, lshift_id); } GC_VALUE operator>>(const GC_VALUE& other) const { return binary_op(other, rshift_id); } }; ID GC_VALUE::hash_id = rb_intern("hash"); ID GC_VALUE::lt_id = rb_intern("<"); ID GC_VALUE::gt_id = rb_intern(">"); ID GC_VALUE::eq_id = rb_intern("=="); ID GC_VALUE::le_id = rb_intern("<="); ID GC_VALUE::ge_id = rb_intern(">="); ID GC_VALUE::pos_id = rb_intern("+@"); ID GC_VALUE::neg_id = rb_intern("-@"); ID GC_VALUE::inv_id = rb_intern("~"); ID GC_VALUE::add_id = rb_intern("+"); ID GC_VALUE::sub_id = rb_intern("-"); ID GC_VALUE::mul_id = rb_intern("*"); ID GC_VALUE::div_id = rb_intern("/"); ID GC_VALUE::mod_id = rb_intern("%"); ID GC_VALUE::and_id = rb_intern("&"); ID GC_VALUE::or_id = rb_intern("|"); ID GC_VALUE::xor_id = rb_intern("^"); ID GC_VALUE::lshift_id = rb_intern("<<"); ID GC_VALUE::rshift_id = rb_intern(">>"); typedef GC_VALUE LANGUAGE_OBJ; } // namespace swig } // %fragment(GC_VALUE_definition) namespace swig { %apply VALUE {GC_VALUE}; // Make sure this is the last typecheck done %typecheck(999999,fragment="GC_VALUE_definition",noblock=1) GC_VALUE, GC_VALUE&, const GC_VALUE& { $1 = 1; }; /* For input */ %typemap(in,fragment="GC_VALUE_definition",noblock=1) GC_VALUE* (GC_VALUE r), GC_VALUE& (GC_VALUE r) { r = $input; $1 = &r; } /* For output */ %typemap(out,fragment="GC_VALUE_definition",noblock=1) GC_VALUE { $result = (VALUE)$1; } %typemap(out,fragment="GC_VALUE_definition",noblock=1) GC_VALUE*, GC_VALUE const & { $result = (VALUE)*$1; } %nodirector GC_VALUE; // We ignore the constructor so that user can never create a GC_VALUE // manually %ignore GC_VALUE::GC_VALUE; struct GC_VALUE { VALUE inspect() const; VALUE to_s() const; GC_VALUE(); protected: GC_VALUE(const GC_VALUE&); ~GC_VALUE(); }; %exception GC_VALUE {}; %ignore LANGUAGE_OBJ; typedef GC_VALUE LANGUAGE_OBJ; } %init { swig::SwigGCReferences::initialize(); } // // Fragment that contains traits to properly deal with GC_VALUE. // These functions may be invoked as a need of the from(), asval(), // asptr() and as() template functors, usually used in %typemaps. // %fragment(SWIG_Traits_frag(swig::GC_VALUE),"header",fragment="StdTraits",fragment="GC_VALUE_definition") { namespace swig { template <> struct traits { typedef value_category category; static const char* type_name() { return "GC_VALUE"; } }; template <> struct traits_from { typedef GC_VALUE value_type; static VALUE from(const value_type& val) { return static_cast(val); } }; template <> struct traits_check { static bool check(GC_VALUE) { return true; } }; template <> struct traits_asval { typedef GC_VALUE value_type; static int asval(VALUE obj, value_type *val) { if (val) *val = obj; return SWIG_OK; } }; } // swig } // %fragment(traits for swig::GC_VALUE) #endif // __cplusplus swig-4.0.1/Lib/ruby/rubycontainer.swg0000644000175000017500000007020213527063513017446 0ustar williamwilliam/* ----------------------------------------------------------------------------- * rubycontainer.swg * * Ruby sequence <-> C++ container wrapper * * This wrapper, and its iterator, allows a general use (and reuse) of * the mapping between C++ and Ruby, thanks to the C++ templates. * * Of course, it needs the C++ compiler to support templates, but * since we will use this wrapper with the STL containers, that should * be the case. * ----------------------------------------------------------------------------- */ %{ #include %} #if !defined(SWIG_NO_EXPORT_ITERATOR_METHODS) # if !defined(SWIG_EXPORT_ITERATOR_METHODS) # define SWIG_EXPORT_ITERATOR_METHODS SWIG_EXPORT_ITERATOR_METHODS # endif #endif %include /**** The RubySequence C++ Wrap ***/ %fragment(""); %include %fragment("RubySequence_Base","header") { %#include namespace swig { template < class T > struct yield { bool operator()( const T& v ) const { return RTEST( rb_yield( swig::from< T >(v) ) ); } }; inline size_t check_index(ptrdiff_t i, size_t size, bool insert = false) { if ( i < 0 ) { if ((size_t) (-i) <= size) return (size_t) (i + size); } else if ( (size_t) i < size ) { return (size_t) i; } else if (insert && ((size_t) i == size)) { return size; } throw std::out_of_range("index out of range"); } inline size_t slice_index(ptrdiff_t i, size_t size) { if ( i < 0 ) { if ((size_t) (-i) <= size) { return (size_t) (i + size); } else { throw std::out_of_range("index out of range"); } } else { return ( (size_t) i < size ) ? ((size_t) i) : size; } } template inline typename Sequence::iterator getpos(Sequence* self, Difference i) { typename Sequence::iterator pos = self->begin(); std::advance(pos, check_index(i,self->size())); return pos; } template inline typename Sequence::const_iterator cgetpos(const Sequence* self, Difference i) { typename Sequence::const_iterator pos = self->begin(); std::advance(pos, check_index(i,self->size())); return pos; } template inline void resize(Sequence *seq, typename Sequence::size_type n, typename Sequence::value_type x) { seq->resize(n, x); } template inline Sequence* getslice(const Sequence* self, Difference i, Difference j) { typename Sequence::size_type size = self->size(); typename Sequence::size_type ii = swig::check_index(i, size, (i == size && j == size)); typename Sequence::size_type jj = swig::slice_index(j, size); if (jj > ii) { typename Sequence::const_iterator vb = self->begin(); typename Sequence::const_iterator ve = self->begin(); std::advance(vb,ii); std::advance(ve,jj); return new Sequence(vb, ve); } else { return new Sequence(); } } template inline void setslice(Sequence* self, Difference i, Difference j, const InputSeq& v) { typename Sequence::size_type size = self->size(); typename Sequence::size_type ii = swig::check_index(i, size, true); typename Sequence::size_type jj = swig::slice_index(j, size); if (jj < ii) jj = ii; size_t ssize = jj - ii; if (ssize <= v.size()) { typename Sequence::iterator sb = self->begin(); typename InputSeq::const_iterator vmid = v.begin(); std::advance(sb,ii); std::advance(vmid, jj - ii); self->insert(std::copy(v.begin(), vmid, sb), vmid, v.end()); } else { typename Sequence::iterator sb = self->begin(); typename Sequence::iterator se = self->begin(); std::advance(sb,ii); std::advance(se,jj); self->erase(sb,se); self->insert(sb, v.begin(), v.end()); } } template inline void delslice(Sequence* self, Difference i, Difference j) { typename Sequence::size_type size = self->size(); typename Sequence::size_type ii = swig::check_index(i, size, true); typename Sequence::size_type jj = swig::slice_index(j, size); if (jj > ii) { typename Sequence::iterator sb = self->begin(); typename Sequence::iterator se = self->begin(); std::advance(sb,ii); std::advance(se,jj); self->erase(sb,se); } } } } %fragment("RubySequence_Cont","header", fragment="", fragment="StdTraits", fragment="RubySequence_Base", fragment="ConstIterator_T") { namespace swig { /** * This class is a proxy class for references, used to return and set values * of an element of a Ruby Array of stuff. * It can be used by RubySequence_InputIterator to make it work with STL * algorithms. */ template struct RubySequence_Ref { RubySequence_Ref(VALUE seq, int index) : _seq(seq), _index(index) { } operator T () const { VALUE item = rb_ary_entry(_seq, _index ); try { return swig::as(item); } catch (const std::invalid_argument& e) { char msg[1024]; sprintf(msg, "in sequence element %d ", _index); VALUE lastErr = rb_gv_get("$!"); if ( lastErr == Qnil ) { %type_error(swig::type_name()); } VALUE str = rb_str_new2(msg); str = rb_str_cat2( str, e.what() ); SWIG_Ruby_ExceptionType( NULL, str ); throw; } } RubySequence_Ref& operator=(const T& v) { rb_ary_set(_seq, _index, swig::from< T >(v)); return *this; } private: VALUE _seq; int _index; }; /** * This class is a proxy to return a pointer to a class, usually * RubySequence_Ref. * It can be used by RubySequence_InputIterator to make it work with STL * algorithms. */ template struct RubySequence_ArrowProxy { RubySequence_ArrowProxy(const T& x): m_value(x) {} const T* operator->() const { return &m_value; } operator const T*() const { return &m_value; } T m_value; }; /** * Input Iterator. This adapator class is a random access iterator that * allows you to use STL algorithms with a Ruby class (a Ruby Array by default). */ template > struct RubySequence_InputIterator { typedef RubySequence_InputIterator self; typedef std::random_access_iterator_tag iterator_category; typedef Reference reference; typedef T value_type; typedef T* pointer; typedef ptrdiff_t difference_type; RubySequence_InputIterator() { } RubySequence_InputIterator(VALUE seq, int index) : _seq(seq), _index(index) { } reference operator*() const { return reference(_seq, _index); } RubySequence_ArrowProxy operator->() const { return RubySequence_ArrowProxy(operator*()); } bool operator==(const self& ri) const { return (_index == ri._index) && (_seq == ri._seq); } bool operator!=(const self& ri) const { return !(operator==(ri)); } self& operator ++ () { ++_index; return *this; } self& operator -- () { --_index; return *this; } self& operator += (difference_type n) { _index += n; return *this; } self operator +(difference_type n) const { return self(_seq, _index + n); } self& operator -= (difference_type n) { _index -= n; return *this; } self operator -(difference_type n) const { return self(_seq, _index - n); } difference_type operator - (const self& ri) const { return _index - ri._index; } bool operator < (const self& ri) const { return _index < ri._index; } reference operator[](difference_type n) const { return reference(_seq, _index + n); } private: VALUE _seq; difference_type _index; }; /** * This adaptor class allows you to use a Ruby Array as if it was an STL * container, giving it begin(), end(), and iterators. */ template struct RubySequence_Cont { typedef RubySequence_Ref reference; typedef const RubySequence_Ref const_reference; typedef T value_type; typedef T* pointer; typedef int difference_type; typedef int size_type; typedef const pointer const_pointer; typedef RubySequence_InputIterator iterator; typedef RubySequence_InputIterator const_iterator; RubySequence_Cont(VALUE seq) : _seq(0) { if (!rb_obj_is_kind_of(seq, rb_cArray)) { throw std::invalid_argument("an Array is expected"); } _seq = seq; } ~RubySequence_Cont() { } size_type size() const { return RARRAY_LEN(_seq); } bool empty() const { return size() == 0; } iterator begin() { return iterator(_seq, 0); } const_iterator begin() const { return const_iterator(_seq, 0); } iterator end() { return iterator(_seq, size()); } const_iterator end() const { return const_iterator(_seq, size()); } reference operator[](difference_type n) { return reference(_seq, n); } const_reference operator[](difference_type n) const { return const_reference(_seq, n); } bool check() const { int s = (int) size(); for (int i = 0; i < s; ++i) { VALUE item = rb_ary_entry(_seq, i ); if (!swig::check(item)) return false; } return true; } private: VALUE _seq; }; } } /** * Macros used to typemap an STL iterator -> SWIGIterator conversion. */ %define %swig_sequence_iterator(Sequence...) #if defined(SWIG_EXPORT_ITERATOR_METHODS) %typemap(out,noblock=1,fragment="RubySequence_Cont") const_iterator, const_reverse_iterator { $result = SWIG_NewPointerObj(swig::make_const_iterator(%static_cast($1,const $type &), self), swig::ConstIterator::descriptor(),SWIG_POINTER_OWN); } %typemap(out,noblock=1,fragment="RubySequence_Cont") iterator, reverse_iterator { $result = SWIG_NewPointerObj(swig::make_nonconst_iterator(%static_cast($1,const $type &), self), swig::Iterator::descriptor(),SWIG_POINTER_OWN); } %typemap(out,noblock=1,fragment="RubySequence_Cont") std::pair { $result = rb_ary_new2(2); rb_ary_push($result, SWIG_NewPointerObj(swig::make_const_iterator(%static_cast($1,const $type &).first), swig::ConstIterator::descriptor(),SWIG_POINTER_OWN)); rb_ary_push($result, SWIG_NewPointerObj(swig::make_const_iterator(%static_cast($1,const $type &).second), swig::ConstIterator::descriptor(),SWIG_POINTER_OWN)); } // std::map/multimap/set allow returning std::pair< iterator, iterator > from // equal_range, but we cannot still modify the key, so the iterator is // const. %typemap(out,noblock=1,fragment="RubySequence_Cont") std::pair { $result = rb_ary_new2(2); rb_ary_push($result, SWIG_NewPointerObj(swig::make_const_iterator(%static_cast($1,const $type &).first), swig::ConstIterator::descriptor(),SWIG_POINTER_OWN)); rb_ary_push($result, SWIG_NewPointerObj(swig::make_const_iterator(%static_cast($1,const $type &).second), swig::ConstIterator::descriptor(),SWIG_POINTER_OWN)); } %typemap(in,noblock=1,fragment="RubySequence_Cont") const_iterator(swig::ConstIterator *iter = 0, int res), const_reverse_iterator(swig::ConstIterator *iter = 0, int res) { res = SWIG_ConvertPtr($input, %as_voidptrptr(&iter), swig::ConstIterator::descriptor(), 0); if (!SWIG_IsOK(res) || !iter) { %argument_fail(SWIG_TypeError, "$type", $symname, $argnum); } else { swig::ConstIterator_T<$type > *iter_t = dynamic_cast *>(iter); if (iter_t) { $1 = iter_t->get_current(); } else { %argument_fail(SWIG_TypeError, "$type", $symname, $argnum); } } } %typemap(in,noblock=1,fragment="RubySequence_Cont") iterator(swig::Iterator *iter = 0, int res), reverse_iterator(swig::Iterator *iter = 0, int res) { res = SWIG_ConvertPtr($input, %as_voidptrptr(&iter), swig::Iterator::descriptor(), 0); if (!SWIG_IsOK(res) || !iter) { %argument_fail(SWIG_TypeError, "$type", $symname, $argnum); } else { swig::Iterator_T<$type > *iter_t = dynamic_cast *>(iter); if (iter_t) { $1 = iter_t->get_current(); } else { %argument_fail(SWIG_TypeError, "$type", $symname, $argnum); } } } %typecheck(%checkcode(ITERATOR),noblock=1,fragment="RubySequence_Cont") const_iterator, const_reverse_iterator { swig::ConstIterator *iter = 0; int res = SWIG_ConvertPtr($input, %as_voidptrptr(&iter), swig::ConstIterator::descriptor(), 0); $1 = (SWIG_IsOK(res) && iter && (dynamic_cast *>(iter) != 0)); } %typecheck(%checkcode(ITERATOR),noblock=1,fragment="RubySequence_Cont") iterator, reverse_iterator { swig::ConstIterator *iter = 0; int res = SWIG_ConvertPtr($input, %as_voidptrptr(&iter), swig::Iterator::descriptor(), 0); $1 = (SWIG_IsOK(res) && iter && (dynamic_cast *>(iter) != 0)); } %fragment("RubySequence_Cont"); // %newobject iterator; // %newobject const_iterator; // %extend { // swig::Iterator* iterator(VALUE* RUBY_SELF) { // return swig::make_nonconst_iterator($self->begin(), $self->begin(), // $self->end(), *RUBY_SELF); // } // swig::ConstIterator* const_iterator(VALUE* RUBY_SELF) { // return swig::make_const_iterator($self->begin(), $self->begin(), // $self->end(), *RUBY_SELF); // } // } #endif //SWIG_EXPORT_ITERATOR_METHODS %enddef /**** The Ruby container methods ****/ %define %swig_container_methods(Container...) %extend { %newobject dup; Container* dup() { return new Container(*$self); } } %enddef /** * Macro used to define common Ruby printing methods for STL container */ %define %swig_sequence_printing_methods(Sequence...) %extend { VALUE inspect() { Sequence::const_iterator i = $self->begin(); Sequence::const_iterator e = $self->end(); const char *type_name = swig::type_name< Sequence >(); VALUE str = rb_str_new2(type_name); str = rb_str_cat2( str, " [" ); bool comma = false; VALUE tmp; for ( ; i != e; ++i, comma = true ) { if (comma) str = rb_str_cat2( str, "," ); tmp = swig::from< Sequence::value_type >( *i ); tmp = rb_inspect( tmp ); str = rb_str_buf_append( str, tmp ); } str = rb_str_cat2( str, "]" ); return str; } VALUE to_a() { Sequence::const_iterator i = $self->begin(); Sequence::const_iterator e = $self->end(); VALUE ary = rb_ary_new2( std::distance( i, e ) ); VALUE tmp; for ( ; i != e; ++i ) { tmp = swig::from< Sequence::value_type >( *i ); rb_ary_push( ary, tmp ); } return ary; } VALUE to_s() { Sequence::iterator i = $self->begin(); Sequence::iterator e = $self->end(); VALUE str = rb_str_new2( "" ); VALUE tmp; for ( ; i != e; ++i ) { tmp = swig::from< Sequence::value_type >( *i ); tmp = rb_obj_as_string( tmp ); str = rb_str_buf_append( str, tmp ); } return str; } } %enddef /** * Macro used to add common methods to all STL sequence-type containers */ %define %swig_sequence_methods_non_resizable_common(Sequence...) %swig_container_methods(%arg(Sequence)) %swig_sequence_iterator(%arg(Sequence)) %swig_sequence_printing_methods(%arg(Sequence)) %fragment("RubySequence_Base"); %extend { VALUE slice( difference_type i, difference_type length ) throw (std::invalid_argument) { if ( length < 0 ) return Qnil; std::size_t len = $self->size(); if ( i < 0 ) { if ( i + static_cast(len) < 0 ) return Qnil; else i = len + i; } Sequence::difference_type j = length + i; if ( j > static_cast(len) ) j = len; VALUE r = Qnil; try { r = swig::from< const Sequence* >( swig::getslice(self, i, j) ); } catch( std::out_of_range ) { } return r; } Sequence* each() { if ( !rb_block_given_p() ) rb_raise( rb_eArgError, "no block given"); VALUE r; Sequence::const_iterator i = self->begin(); Sequence::const_iterator e = self->end(); for ( ; i != e; ++i ) { r = swig::from< Sequence::value_type >(*i); rb_yield(r); } return self; } VALUE __delete2__(const value_type& i) { VALUE r = Qnil; return r; } } %enddef %define %swig_sequence_methods_resizable_common(Sequence...) %extend { %newobject select; Sequence* select() { if ( !rb_block_given_p() ) rb_raise( rb_eArgError, "no block given" ); Sequence* r = new Sequence(); Sequence::const_iterator i = $self->begin(); Sequence::const_iterator e = $self->end(); for ( ; i != e; ++i ) { VALUE v = swig::from< Sequence::value_type >(*i); if ( RTEST( rb_yield(v) ) ) $self->insert( r->end(), *i); } return r; } VALUE delete_at(difference_type i) { VALUE r = Qnil; try { Sequence::iterator at = swig::getpos(self, i); r = swig::from< Sequence::value_type >( *(at) ); $self->erase(at); } catch (std::out_of_range) { } return r; } } %enddef %define %swig_sequence_methods_common(Sequence...) %swig_sequence_methods_non_resizable_common(%arg(Sequence)) %swig_sequence_methods_resizable_common(%arg(Sequence)) %enddef /** * Macro used to add functions for back insertion of values in * STL sequence containers */ %define %swig_sequence_back_inserters( Sequence... ) %extend { VALUE pop() { if ($self->empty()) return Qnil; Sequence::value_type x = self->back(); $self->pop_back(); return swig::from< Sequence::value_type >( x ); } %alias push "<<"; const value_type push( const value_type& e ) { $self->push_back( e ); return e; } %newobject reject; Sequence* reject() { if ( !rb_block_given_p() ) rb_raise( rb_eArgError, "no block given" ); Sequence* r = new Sequence(); std::remove_copy_if( $self->begin(), $self->end(), std::back_inserter(*r), swig::yield< Sequence::value_type >() ); return r; } } %enddef %define %swig_sequence_methods_extra(Sequence...) %extend { %alias reject_bang "delete_if"; Sequence* reject_bang() { if ( !rb_block_given_p() ) rb_raise( rb_eArgError, "no block given" ); $self->erase( std::remove_if( $self->begin(), $self->end(), swig::yield< Sequence::value_type >() ), $self->end() ); return $self; } } %enddef %define %swig_sequence_methods_non_resizable_accessors(Sequence...) %extend { VALUE at(difference_type i) const { VALUE r = Qnil; try { r = swig::from< Sequence::value_type >( *(swig::cgetpos(self, i)) ); } catch( std::out_of_range ) { } return r; } VALUE __getitem__(difference_type i, difference_type length) const throw (std::invalid_argument) { if ( length < 0 ) return Qnil; std::size_t len = $self->size(); if ( i < 0 ) { if ( i + static_cast(len) < 0 ) return Qnil; else i = len + i; } Sequence::difference_type j = length + i; if ( j > static_cast(len) ) j = len; VALUE r = Qnil; try { r = swig::from< const Sequence* >( swig::getslice(self, i, j) ); } catch( std::out_of_range ) { } return r; } VALUE __getitem__(difference_type i) const { VALUE r = Qnil; try { r = swig::from< Sequence::value_type >( *(swig::cgetpos(self, i)) ); } catch( std::out_of_range ) { } return r; } VALUE __getitem__(VALUE i) const throw (std::invalid_argument) { if ( rb_obj_is_kind_of( i, rb_cRange ) == Qfalse ) { rb_raise( rb_eTypeError, "not a valid index or range" ); } static ID id_end = rb_intern("end"); static ID id_start = rb_intern("begin"); static ID id_noend = rb_intern("exclude_end?"); VALUE start = rb_funcall( i, id_start, 0 ); VALUE end = rb_funcall( i, id_end, 0 ); bool noend = ( rb_funcall( i, id_noend, 0 ) == Qtrue ); int len = $self->size(); int s = NUM2INT( start ); if ( s < 0 ) { s = len + s; if ( s < 0 ) return Qnil; } else if ( s > len ) return Qnil; int e = NUM2INT( end ); if ( e < 0 ) e = len + e; if ( noend ) e -= 1; if ( e < 0 ) e = -1; if ( e >= len ) e = len - 1; if ( s == len ) e = len - 1; return swig::from< Sequence* >( swig::getslice(self, s, e+1) ); } VALUE __setitem__(difference_type i, const value_type& x) throw (std::invalid_argument, std::out_of_range) { if ( i >= static_cast( $self->size()) ) swig::resize( $self, i+1, x ); else *(swig::getpos($self, i)) = x; return swig::from< Sequence::value_type >( x ); } VALUE __setitem__(difference_type i, difference_type length, const Sequence& v) throw (std::invalid_argument) { if ( length < 0 ) return Qnil; std::size_t len = $self->size(); if ( i < 0 ) { if ( i + static_cast(len) < 0 ) return Qnil; else i = len + i; } Sequence::difference_type j = length + i; if ( j > static_cast(len) ) { swig::resize( $self, j, *(v.begin()) ); } VALUE r = Qnil; swig::setslice($self, i, j, v); r = swig::from< const Sequence* >( &v ); return r; } } %enddef /** * Macro used to add functions for non resizable sequences */ %define %swig_sequence_methods_non_resizable(Sequence...) %swig_sequence_methods_non_resizable_common(%arg(Sequence)) %swig_sequence_methods_non_resizable_accessors(%arg(Sequence)) %enddef /** * Macro used to add functions for sequences */ %define %swig_sequence_methods(Sequence...) %swig_sequence_methods_non_resizable_common(%arg(Sequence)) %swig_sequence_methods_resizable_common(%arg(Sequence)) %swig_sequence_methods_non_resizable_accessors(%arg(Sequence)) %swig_sequence_methods_extra(%arg(Sequence)); %swig_sequence_back_inserters(%arg(Sequence)); %enddef %define %swig_sequence_methods_non_resizable_val(Sequence...) %swig_sequence_methods_non_resizable(%arg(Sequence)) %enddef %define %swig_sequence_methods_val(Sequence...) %swig_sequence_methods(%arg(Sequence)) %enddef /** * Macro used to add functions for front insertion of * elements in STL sequence containers that support it. */ %define %swig_sequence_front_inserters( Sequence... ) %extend { VALUE shift() { if ($self->empty()) return Qnil; Sequence::value_type x = self->front(); $self->erase( $self->begin() ); return swig::from< Sequence::value_type >( x ); } %typemap(in) (int argc, VALUE* argv) { $1 = argc - 1; $2 = argv + 1; } Sequence* insert( difference_type pos, int argc, VALUE* argv, ... ) { std::size_t len = $self->size(); std::size_t i = swig::check_index( pos, len, true ); Sequence::iterator start; VALUE elem = argv[0]; int idx = 0; try { Sequence::value_type val = swig::as( elem ); if ( i >= len ) { $self->resize(i-1, val); return $self; } start = $self->begin(); std::advance( start, i ); $self->insert( start++, val ); for ( ++idx; idx < argc; ++idx ) { elem = argv[idx]; val = swig::as( elem ); $self->insert( start++, val ); } } catch(const std::invalid_argument &) { rb_raise( rb_eArgError, "%s", Ruby_Format_TypeError( "", swig::type_name(), __FUNCTION__, idx+2, elem )); } return $self; } %typemap(in) (int argc, VALUE* argv) { $1 = argc; $2 = argv; } Sequence* unshift( int argc, VALUE* argv, ... ) { for ( int idx = argc-1; idx >= 0; --idx ) { Sequence::iterator start = $self->begin(); VALUE elem = argv[idx]; try { Sequence::value_type val = swig::as( elem ); $self->insert( start, val ); } catch(const std::invalid_argument &) { rb_raise( rb_eArgError, "%s", Ruby_Format_TypeError( "", swig::type_name(), __FUNCTION__, idx+2, elem )); } } return $self; } } %enddef // // Common fragments // %fragment("StdSequenceTraits","header", fragment="StdTraits", fragment="RubySequence_Cont", fragment="GC_VALUE_definition") { namespace swig { template inline void assign(const RubySeq& rubyseq, Seq* seq) { // seq->assign(rubyseq.begin(), rubyseq.end()); // not used as not always implemented typedef typename RubySeq::value_type value_type; typename RubySeq::const_iterator it = rubyseq.begin(); for (;it != rubyseq.end(); ++it) { seq->insert(seq->end(),(value_type)(*it)); } } template struct traits_asptr_stdseq { typedef Seq sequence; typedef T value_type; static int asptr(VALUE obj, sequence **seq) { if (rb_obj_is_kind_of(obj, rb_cArray) == Qtrue) { try { RubySequence_Cont rubyseq(obj); if (seq) { sequence *pseq = new sequence(); assign(rubyseq, pseq); *seq = pseq; return SWIG_NEWOBJ; } else { return rubyseq.check() ? SWIG_OK : SWIG_ERROR; } } catch (std::exception& e) { if (seq) { VALUE lastErr = rb_gv_get("$!"); if (lastErr == Qnil) { rb_raise(rb_eTypeError, "%s", e.what()); } } return SWIG_ERROR; } } else { sequence *p; swig_type_info *descriptor = swig::type_info(); if (descriptor && SWIG_IsOK(SWIG_ConvertPtr(obj, (void **)&p, descriptor, 0))) { if (seq) *seq = p; return SWIG_OLDOBJ; } } return SWIG_ERROR; } }; // Partial specialization for GC_VALUE's. No need to typecheck each // element. template< class Seq > struct traits_asptr_stdseq< Seq, swig::GC_VALUE > { typedef Seq sequence; typedef swig::GC_VALUE value_type; static int asptr(VALUE obj, sequence **seq) { if (rb_obj_is_kind_of(obj, rb_cArray) == Qtrue) { try { if (seq) { RubySequence_Cont rubyseq(obj); sequence *pseq = new sequence(); assign(rubyseq, pseq); *seq = pseq; return SWIG_NEWOBJ; } else { return true; } } catch (std::exception& e) { if (seq) { VALUE lastErr = rb_gv_get("$!"); if (lastErr == Qnil) { rb_raise(rb_eTypeError, "%s", e.what()); } } return SWIG_ERROR; } } else { sequence *p; swig_type_info *descriptor = swig::type_info(); if (descriptor && SWIG_IsOK(SWIG_ConvertPtr(obj, (void **)&p, descriptor, 0))) { if (seq) *seq = p; return SWIG_OLDOBJ; } } return SWIG_ERROR; } }; template struct traits_from_stdseq { typedef Seq sequence; typedef T value_type; typedef typename Seq::size_type size_type; typedef typename sequence::const_iterator const_iterator; static VALUE from(const sequence& seq) { #ifdef SWIG_RUBY_EXTRA_NATIVE_CONTAINERS swig_type_info *desc = swig::type_info(); if (desc && desc->clientdata) { return SWIG_NewPointerObj(new sequence(seq), desc, SWIG_POINTER_OWN); } #endif size_type size = seq.size(); if (size <= (size_type)INT_MAX) { VALUE obj = rb_ary_new2((int)size); int i = 0; for (const_iterator it = seq.begin(); it != seq.end(); ++it, ++i) { rb_ary_push(obj, swig::from< value_type >(*it)); } rb_obj_freeze(obj); // treat as immutable result return obj; } else { rb_raise(rb_eRangeError,"sequence size not valid in ruby"); return Qnil; } } }; } } %include swig-4.0.1/Lib/ruby/std_char_traits.i0000644000175000017500000000004113527063513017361 0ustar williamwilliam%include swig-4.0.1/Lib/ruby/stl.i0000644000175000017500000000044313527063513015014 0ustar williamwilliam/* ----------------------------------------------------------------------------- * stl.i * ----------------------------------------------------------------------------- */ %include %include %include %include %include swig-4.0.1/Lib/ruby/rubyinit.swg0000644000175000017500000000004713527063513016427 0ustar williamwilliam%insert(initbeforefunc) "swiginit.swg" swig-4.0.1/Lib/ruby/rubyopers.swg0000644000175000017500000000347413527063513016623 0ustar williamwilliam/* ------------------------------------------------------------ * Overloaded operator support * ------------------------------------------------------------ */ #ifdef __cplusplus %rename(__add__) *::operator+; %rename(__pos__) *::operator+(); %rename(__pos__) *::operator+() const; %rename(__sub__) *::operator-; %rename(__neg__) *::operator-(); %rename(__neg__) *::operator-() const; %rename(__mul__) *::operator*; %rename(__div__) *::operator/; %rename(__mod__) *::operator%; %rename(__lshift__) *::operator<<; %rename(__rshift__) *::operator>>; %rename(__and__) *::operator&; %rename(__or__) *::operator|; %rename(__xor__) *::operator^; %rename(__invert__) *::operator~; %rename(__lt__) *::operator<; %rename(__le__) *::operator<=; %rename(__gt__) *::operator>; %rename(__ge__) *::operator>=; %rename(__eq__) *::operator==; /* Special cases */ %rename(__call__) *::operator(); /* Ignored inplace operators */ %ignoreoperator(NOTEQUAL) operator!=; %ignoreoperator(PLUSEQ) operator+=; %ignoreoperator(MINUSEQ) operator-=; %ignoreoperator(MULEQ) operator*=; %ignoreoperator(DIVEQ) operator/=; %ignoreoperator(MODEQ) operator%=; %ignoreoperator(LSHIFTEQ) operator<<=; %ignoreoperator(RSHIFTEQ) operator>>=; %ignoreoperator(ANDEQ) operator&=; %ignoreoperator(OREQ) operator|=; %ignoreoperator(XOREQ) operator^=; /* Ignored operators */ %ignoreoperator(LNOT) operator!; %ignoreoperator(LAND) operator&&; %ignoreoperator(LOR) operator||; %ignoreoperator(EQ) operator=; %ignoreoperator(PLUSPLUS) operator++; %ignoreoperator(MINUSMINUS) operator--; %ignoreoperator(ARROWSTAR) operator->*; %ignoreoperator(INDEX) operator[]; #endif /* __cplusplus */ swig-4.0.1/Lib/ruby/rubycontainer_extended.swg0000644000175000017500000000672213527063513021334 0ustar williamwilliam/* ----------------------------------------------------------------------------- * rubycontainer_extended.swg * * This file contains additional functions that make containers * behave closer to ruby primitive types. * However, some of these functions place some restrictions on * the underlying object inside of the container and the iterator * (that it has to have an == comparison function, that it has to have * an = assignment operator, etc). * ----------------------------------------------------------------------------- */ /** * Macro used to add extend functions that require operator== in object. * * @param Container STL container * @param Type class inside container * */ %define %swig_container_with_equal_operator( Container, Type ) VALUE __delete__( const Type& val ) { VALUE r = Qnil; Container::iterator e = $self->end(); Container::iterator i = std::remove( $self->begin(), e, val ); // remove dangling elements now $self->erase( i, e ); if ( i != e ) r = swig::from< Type >( val ); else if ( rb_block_given_p() ) r = rb_yield(Qnil); return r; } %enddef // end of %swig_container_with_equal_operator /** * Macro used to add extend functions that require the assignment * operator (ie. = ) of contained class * * @param Container STL container * @param Type class inside container * */ %define %swig_container_with_assignment( Container, Type ) // // map! -- the equivalent of std::transform // Container< Type >* map_bang() { if ( !rb_block_given_p() ) rb_raise( rb_eArgError, "No block given" ); VALUE r = Qnil; Container< Type >::iterator i = $self->begin(); Container< Type >::iterator e = $self->end(); try { for ( ; i != e; ++i ) { r = swig::from< Type >( *i ); r = rb_yield( r ); *i = swig::as< Type >( r ); } } catch (const std::invalid_argument&) { rb_raise(rb_eTypeError, "Yield block did not return a valid element for " "Container"); } return $self; } %enddef // end of %swig_container_with_assignment /** * Macro used to add all extended functions to a container * * @param Container STL container * @param Type class inside container * */ %define %swig_container_extend( Container, Type ) %extend Container< Type > { %swig_container_with_assignment( %arg(Container), Type ); %swig_container_with_equal_operator( %arg(Container), Type ); } %enddef /** * Private macro used to add all extended functions to C/C++ * primitive types * * @param Container an STL container, like std::vector (with no class template) * */ %define %__swig_container_extend_primtypes( Container ) %swig_container_extend( %arg( Container ), bool ); %swig_container_extend( %arg( Container ), char ); %swig_container_extend( %arg( Container ), short ); %swig_container_extend( %arg( Container ), int ); %swig_container_extend( %arg( Container ), unsigned short ); %swig_container_extend( %arg( Container ), unsigned int ); %swig_container_extend( %arg( Container ), float ); %swig_container_extend( %arg( Container ), double ); %swig_container_extend( %arg( Container ), std::complex ); %swig_container_extend( %arg( Container ), std::string ); %swig_container_extend( %arg( Container ), swig::GC_VALUE ); %enddef %__swig_container_extend_primtypes( std::vector ); %__swig_container_extend_primtypes( std::deque ); %__swig_container_extend_primtypes( std::list ); swig-4.0.1/Lib/ruby/exception.i0000644000175000017500000000017613527063513016213 0ustar williamwilliam%include %insert("runtime") { %define_as(SWIG_exception(code, msg), %block(%error(code, msg);)) } swig-4.0.1/Lib/ruby/std_list.i0000644000175000017500000000205313527063513016036 0ustar williamwilliam/* Lists */ %fragment("StdListTraits","header",fragment="StdSequenceTraits") %{ namespace swig { template struct traits_asptr > { static int asptr(VALUE obj, std::list **lis) { return traits_asptr_stdseq >::asptr(obj, lis); } }; template struct traits_from > { static VALUE from(const std::list& vec) { return traits_from_stdseq >::from(vec); } }; } %} %ignore std::list::push_back; %ignore std::list::pop_back; #define %swig_list_methods(Type...) %swig_sequence_methods(Type) #define %swig_list_methods_val(Type...) %swig_sequence_methods_val(Type); %mixin std::list "Enumerable"; %rename("delete") std::list::__delete__; %rename("reject!") std::list::reject_bang; %rename("map!") std::list::map_bang; %rename("empty?") std::list::empty; %rename("include?" ) std::list::__contains__ const; %rename("has_key?" ) std::list::has_key const; %alias std::list::push "<<"; %include swig-4.0.1/Lib/ruby/rubyuserdir.swg0000644000175000017500000000122113527063513017134 0ustar williamwilliam#define %alias %feature("alias") #define %freefunc %feature("freefunc") #define %markfunc %feature("markfunc") #define %mixin %feature("mixin") #define %predicate %feature("predicate", "1") #define %bang %feature("bang", "1") #define %trackobjects %feature("trackobjects") #define %nooutput %feature("outputs","0") #define %initstack %feature("initstack", "1") #define %ignorestack %feature("initstack", "0") /* ------------------------------------------------------------------------- */ /* Enable keywords parameters */ #define %kwargs %feature("kwargs") #define %nokwargs %feature("kwargs", "0") #define %clearkwargs %feature("kwargs", "") swig-4.0.1/Lib/ruby/std_iostream.i0000644000175000017500000000034313527063513016706 0ustar williamwilliamnamespace std { %callback("%s") endl; %callback("%s") ends; %callback("%s") flush; } %warnfilter(365) operator+=; %warnfilter(802) std::basic_iostream; // turn off multiple inheritance warning %include swig-4.0.1/Lib/ruby/cdata.i0000644000175000017500000000003613527063513015264 0ustar williamwilliam%include swig-4.0.1/Lib/ruby/std_vectora.i0000644000175000017500000000166613527063513016537 0ustar williamwilliam/* Vectors + allocators */ %fragment("StdVectorATraits","header",fragment="StdSequenceTraits") %{ namespace swig { template struct traits_asptr > { typedef std::vector vector_type; typedef T value_type; static int asptr(VALUE obj, vector_type **vec) { return traits_asptr_stdseq::asptr(obj, vec); } }; template struct traits_from > { typedef std::vector vector_type; static VALUE from(const vector_type& vec) { return traits_from_stdseq::from(vec); } }; } %} #define %swig_vector_methods(Type...) %swig_sequence_methods(Type) #define %swig_vector_methods_val(Type...) %swig_sequence_methods_val(Type); %mixin std::vector "Enumerable"; %ignore std::vector::push_back; %ignore std::vector::pop_back; %alias std::vector::push "<<"; %include swig-4.0.1/Lib/ruby/std_string.i0000644000175000017500000000023113527063513016365 0ustar williamwilliam %warnfilter(SWIGWARN_RUBY_WRONG_NAME) std::basic_string; AUTODOC(substr, "Return a portion of the String"); %include swig-4.0.1/Lib/ruby/std_ios.i0000644000175000017500000000057413527063513015663 0ustar williamwilliam #pragma SWIG nowarn=801 %rename(ios_base_in) std::ios_base::in; AUTODOC(cerr, "Standard C++ error stream"); AUTODOC(cout, "Standard C++ output stream"); AUTODOC(cin, "Standard C++ input stream"); AUTODOC(clog, "Standard C++ logging stream"); AUTODOC(endl, "Add an end line to stream"); AUTODOC(ends, "Ends stream"); AUTODOC(flush, "Flush stream"); %include swig-4.0.1/Lib/ruby/std_map.i0000644000175000017500000002607213527063513015647 0ustar williamwilliam// // Maps // %fragment("StdMapCommonTraits","header",fragment="StdSequenceTraits") { namespace swig { template struct from_key_oper { typedef const ValueType& argument_type; typedef VALUE result_type; result_type operator()(argument_type v) const { return swig::from(v.first); } }; template struct from_value_oper { typedef const ValueType& argument_type; typedef VALUE result_type; result_type operator()(argument_type v) const { return swig::from(v.second); } }; template struct MapIterator_T : ConstIteratorClosed_T { MapIterator_T(OutIterator curr, OutIterator first, OutIterator last, VALUE seq) : ConstIteratorClosed_T(curr, first, last, seq) { } }; template > struct MapKeyIterator_T : MapIterator_T { MapKeyIterator_T(OutIterator curr, OutIterator first, OutIterator last, VALUE seq) : MapIterator_T(curr, first, last, seq) { } }; template inline ConstIterator* make_output_key_iterator(const OutIter& current, const OutIter& begin, const OutIter& end, VALUE seq = 0) { return new MapKeyIterator_T(current, begin, end, seq); } template > struct MapValueIterator_T : MapIterator_T { MapValueIterator_T(OutIterator curr, OutIterator first, OutIterator last, VALUE seq) : MapIterator_T(curr, first, last, seq) { } }; template inline ConstIterator* make_output_value_iterator(const OutIter& current, const OutIter& begin, const OutIter& end, VALUE seq = 0) { return new MapValueIterator_T(current, begin, end, seq); } } } %fragment("StdMapTraits","header",fragment="StdMapCommonTraits") { namespace swig { template inline void assign(const RubySeq& rubyseq, std::map *map) { typedef typename std::map::value_type value_type; typename RubySeq::const_iterator it = rubyseq.begin(); for (;it != rubyseq.end(); ++it) { map->insert(value_type(it->first, it->second)); } } template struct traits_asptr > { typedef std::map map_type; static int asptr(VALUE obj, map_type **val) { int res = SWIG_ERROR; if ( TYPE(obj) == T_HASH ) { static ID id_to_a = rb_intern("to_a"); VALUE items = rb_funcall(obj, id_to_a, 0); res = traits_asptr_stdseq, std::pair >::asptr(items, val); } else { map_type *p; swig_type_info *descriptor = swig::type_info(); res = descriptor ? SWIG_ConvertPtr(obj, (void **)&p, descriptor, 0) : SWIG_ERROR; if (SWIG_IsOK(res) && val) *val = p; } return res; } }; template struct traits_from > { typedef std::map map_type; typedef typename map_type::const_iterator const_iterator; typedef typename map_type::size_type size_type; static VALUE from(const map_type& map) { swig_type_info *desc = swig::type_info(); if (desc && desc->clientdata) { return SWIG_NewPointerObj(new map_type(map), desc, SWIG_POINTER_OWN); } else { size_type size = map.size(); int rubysize = (size <= (size_type) INT_MAX) ? (int) size : -1; if (rubysize < 0) { SWIG_RUBY_THREAD_BEGIN_BLOCK; rb_raise( rb_eRuntimeError, "map size not valid in Ruby"); SWIG_RUBY_THREAD_END_BLOCK; return Qnil; } VALUE obj = rb_hash_new(); for (const_iterator i= map.begin(); i!= map.end(); ++i) { VALUE key = swig::from(i->first); VALUE val = swig::from(i->second); rb_hash_aset(obj, key, val); } return obj; } } }; } } %define %swig_map_common(Map...) %swig_container_methods(%arg(Map)); // %swig_sequence_iterator(%arg(Map)); %extend { VALUE __delete__(const key_type& key) { Map::iterator i = self->find(key); if (i != self->end()) { self->erase(i); return swig::from( key ); } else { return Qnil; } } bool has_key(const key_type& key) const { Map::const_iterator i = self->find(key); return i != self->end(); } VALUE keys() { Map::size_type size = self->size(); int rubysize = (size <= (Map::size_type) INT_MAX) ? (int) size : -1; if (rubysize < 0) { SWIG_RUBY_THREAD_BEGIN_BLOCK; rb_raise(rb_eRuntimeError, "map size not valid in Ruby"); SWIG_RUBY_THREAD_END_BLOCK; return Qnil; } VALUE ary = rb_ary_new2(rubysize); Map::const_iterator i = self->begin(); Map::const_iterator e = self->end(); for ( ; i != e; ++i ) { rb_ary_push( ary, swig::from(i->first) ); } return ary; } Map* each() { if ( !rb_block_given_p() ) rb_raise( rb_eArgError, "no block given"); VALUE k, v; Map::iterator i = self->begin(); Map::iterator e = self->end(); for ( ; i != e; ++i ) { const Map::key_type& key = i->first; const Map::mapped_type& val = i->second; k = swig::from(key); v = swig::from(val); rb_yield_values(2, k, v); } return self; } %newobject select; Map* select() { if ( !rb_block_given_p() ) rb_raise( rb_eArgError, "no block given" ); Map* r = new Map; Map::iterator i = $self->begin(); Map::iterator e = $self->end(); for ( ; i != e; ++i ) { VALUE k = swig::from(i->first); VALUE v = swig::from(i->second); if ( RTEST( rb_yield_values(2, k, v) ) ) $self->insert(r->end(), *i); } return r; } %typemap(in) (int argc, VALUE* argv) { $1 = argc; $2 = argv; } VALUE values_at(int argc, VALUE* argv, ...) { VALUE r = rb_ary_new(); ID id = rb_intern("[]"); swig_type_info* type = swig::type_info< Map >(); VALUE me = SWIG_NewPointerObj( $self, type, 0 ); for ( int i = 0; i < argc; ++i ) { VALUE key = argv[i]; VALUE tmp = rb_funcall( me, id, 1, key ); rb_ary_push( r, tmp ); } return r; } Map* each_key() { if ( !rb_block_given_p() ) rb_raise( rb_eArgError, "no block given"); VALUE r; Map::iterator i = self->begin(); Map::iterator e = self->end(); for ( ; i != e; ++i ) { r = swig::from( i->first ); rb_yield(r); } return self; } VALUE values() { Map::size_type size = self->size(); int rubysize = (size <= (Map::size_type) INT_MAX) ? (int) size : -1; if (rubysize < 0) { SWIG_RUBY_THREAD_BEGIN_BLOCK; rb_raise(rb_eRuntimeError, "map size not valid in Ruby"); SWIG_RUBY_THREAD_END_BLOCK; return Qnil; } VALUE ary = rb_ary_new2(rubysize); Map::const_iterator i = self->begin(); Map::const_iterator e = self->end(); for ( ; i != e; ++i ) { rb_ary_push( ary, swig::from(i->second) ); } return ary; } Map* each_value() { if ( !rb_block_given_p() ) rb_raise( rb_eArgError, "no block given"); VALUE r; Map::iterator i = self->begin(); Map::iterator e = self->end(); for ( ; i != e; ++i ) { r = swig::from( i->second ); rb_yield(r); } return self; } VALUE entries() { Map::size_type size = self->size(); int rubysize = (size <= (Map::size_type) INT_MAX) ? (int) size : -1; if (rubysize < 0) { SWIG_RUBY_THREAD_BEGIN_BLOCK; rb_raise(rb_eRuntimeError, "map size not valid in Ruby"); SWIG_RUBY_THREAD_END_BLOCK; return Qnil; } VALUE ary = rb_ary_new2(rubysize); Map::const_iterator i = self->begin(); Map::const_iterator e = self->end(); for ( ; i != e; ++i ) { rb_ary_push( ary, swig::from >(*i) ); } return ary; } bool __contains__(const key_type& key) { return self->find(key) != self->end(); } %newobject key_iterator(VALUE *RUBY_SELF); swig::ConstIterator* key_iterator(VALUE *RUBY_SELF) { return swig::make_output_key_iterator($self->begin(), $self->begin(), $self->end(), *RUBY_SELF); } %newobject value_iterator(VALUE *RUBY_SELF); swig::ConstIterator* value_iterator(VALUE *RUBY_SELF) { return swig::make_output_value_iterator($self->begin(), $self->begin(), $self->end(), *RUBY_SELF); } } %enddef %define %swig_map_methods(Map...) %swig_map_common(Map) %extend { VALUE __getitem__(const key_type& key) const { Map::const_iterator i = self->find(key); if ( i != self->end() ) return swig::from( i->second ); else return Qnil; } void __setitem__(const key_type& key, const mapped_type& x) throw (std::out_of_range) { (*self)[key] = x; } VALUE inspect() { Map::const_iterator i = $self->begin(); Map::const_iterator e = $self->end(); const char *type_name = swig::type_name< Map >(); VALUE str = rb_str_new2( type_name ); str = rb_str_cat2( str, " {" ); bool comma = false; VALUE tmp; for ( ; i != e; ++i, comma = true ) { if (comma) str = rb_str_cat2( str, "," ); tmp = swig::from< Map::key_type >( i->first ); tmp = rb_inspect( tmp ); str = rb_str_buf_append( str, tmp ); str = rb_str_cat2( str, "=>" ); tmp = swig::from< Map::mapped_type >( i->second ); tmp = rb_inspect( tmp ); str = rb_str_buf_append( str, tmp ); } str = rb_str_cat2( str, "}" ); return str; } VALUE to_a() { Map::const_iterator i = $self->begin(); Map::const_iterator e = $self->end(); VALUE ary = rb_ary_new2( std::distance( i, e ) ); VALUE tmp; for ( ; i != e; ++i ) { // @todo: improve -- this should just be swig::from(*i) tmp = swig::from< std::pair >( *i ); rb_ary_push( ary, tmp ); } return ary; } VALUE to_s() { Map::iterator i = $self->begin(); Map::iterator e = $self->end(); VALUE str = rb_str_new2( "" ); VALUE tmp; for ( ; i != e; ++i ) { // @todo: improve -- this should just be swig::from(*i) tmp = swig::from< std::pair >( *i ); tmp = rb_obj_as_string( tmp ); str = rb_str_buf_append( str, tmp ); } return str; } } %enddef %mixin std::map "Enumerable"; %rename("delete") std::map::__delete__; %rename("reject!") std::map::reject_bang; %rename("map!") std::map::map_bang; %rename("empty?") std::map::empty; %rename("include?" ) std::map::__contains__ const; %rename("has_key?" ) std::map::has_key const; %alias std::map::push "<<"; %include swig-4.0.1/Lib/ruby/cstring.i0000644000175000017500000000004013527063513015654 0ustar williamwilliam%include swig-4.0.1/Lib/ruby/rubyfragments.swg0000644000175000017500000000105013527063513017445 0ustar williamwilliam/* Create a file with this name, 'rubyfragments.swg', in your working directory and add all the %fragments you want to take precedence over the ones defined by default by swig. For example, if you add: %fragment(SWIG_AsVal_frag(int),"header") { SWIGINTERNINLINE int SWIG_AsVal(int)(VALUE obj, int *val) { ; } } this will replace the code used to retrieve an integer value for all the typemaps that need it, including: int, std::vector, std::list >, etc. */ swig-4.0.1/Lib/ruby/factory.i0000644000175000017500000000004013527063513015652 0ustar williamwilliam%include swig-4.0.1/Lib/ruby/boost_shared_ptr.i0000644000175000017500000005167213527063513017565 0ustar williamwilliam%include // Set SHARED_PTR_DISOWN to $disown if required, for example // #define SHARED_PTR_DISOWN $disown #if !defined(SHARED_PTR_DISOWN) #define SHARED_PTR_DISOWN 0 #endif // Language specific macro implementing all the customisations for handling the smart pointer %define SWIG_SHARED_PTR_TYPEMAPS(CONST, TYPE...) // %naturalvar is as documented for member variables %naturalvar TYPE; %naturalvar SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >; // destructor wrapper customisation %feature("unref") TYPE %{(void)arg1; delete reinterpret_cast< SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > * >(self);%} // Typemap customisations... // plain value %typemap(in) CONST TYPE (void *argp, int res = 0) { swig_ruby_owntype newmem = {0, 0}; res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } if (!argp) { %argument_nullref("$type", $symname, $argnum); } else { $1 = *(%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *)->get()); if (newmem.own & SWIG_CAST_NEW_MEMORY) delete %reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); } } %typemap(out) CONST TYPE { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(new $1_ltype(($1_ltype &)$1)); %set_output(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } %typemap(varin) CONST TYPE { void *argp = 0; swig_ruby_owntype newmem = {0, 0}; int res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %variable_fail(res, "$type", "$name"); } if (!argp) { %variable_nullref("$type", "$name"); } else { $1 = *(%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *)->get()); if (newmem.own & SWIG_CAST_NEW_MEMORY) delete %reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); } } %typemap(varout) CONST TYPE { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(new $1_ltype(($1_ltype &)$1)); %set_varoutput(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } %typemap(directorin,noblock=1) CONST TYPE (SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0) %{ smartarg = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(new $1_ltype(($1_ltype &)$1)); $input = SWIG_NewPointerObj(%as_voidptr(smartarg), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN | %newpointer_flags); %} %typemap(directorout,noblock=1) CONST TYPE (void *swig_argp, int swig_res = 0) { swig_ruby_owntype newmem = {0, 0}; swig_res = SWIG_ConvertPtrAndOwn($input, &swig_argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(swig_res)) { %dirout_fail(swig_res, "$type"); } if (!swig_argp) { %dirout_nullref("$type"); } else { $result = *(%reinterpret_cast(swig_argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *)->get()); if (newmem.own & SWIG_CAST_NEW_MEMORY) delete %reinterpret_cast(swig_argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); } } // plain pointer // Note: $disown not implemented by default as it will lead to a memory leak of the shared_ptr instance %typemap(in) CONST TYPE * (void *argp = 0, int res = 0, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > tempshared, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0) { swig_ruby_owntype newmem = {0, 0}; res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SHARED_PTR_DISOWN | %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } if (newmem.own & SWIG_CAST_NEW_MEMORY) { tempshared = *%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); delete %reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); $1 = %const_cast(tempshared.get(), $1_ltype); } else { smartarg = %reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); $1 = %const_cast((smartarg ? smartarg->get() : 0), $1_ltype); } } %typemap(out, fragment="SWIG_null_deleter") CONST TYPE * { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1 SWIG_NO_NULL_DELETER_$owner) : 0; %set_output(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), $owner | SWIG_POINTER_OWN)); } %typemap(varin) CONST TYPE * { void *argp = 0; swig_ruby_owntype newmem = {0, 0}; int res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %variable_fail(res, "$type", "$name"); } SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > tempshared; SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0; if (newmem.own & SWIG_CAST_NEW_MEMORY) { tempshared = *%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); delete %reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); $1 = %const_cast(tempshared.get(), $1_ltype); } else { smartarg = %reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); $1 = %const_cast((smartarg ? smartarg->get() : 0), $1_ltype); } } %typemap(varout, fragment="SWIG_null_deleter") CONST TYPE * { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1 SWIG_NO_NULL_DELETER_0) : 0; %set_varoutput(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } %typemap(directorin,noblock=1, fragment="SWIG_null_deleter") CONST TYPE * (SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0) %{ smartarg = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1 SWIG_NO_NULL_DELETER_0) : 0; $input = SWIG_NewPointerObj(%as_voidptr(smartarg), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN | %newpointer_flags); %} %typemap(directorout,noblock=1) CONST TYPE * %{ #error "directorout typemap for plain pointer not implemented" %} // plain reference %typemap(in) CONST TYPE & (void *argp = 0, int res = 0, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > tempshared) { swig_ruby_owntype newmem = {0, 0}; res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } if (!argp) { %argument_nullref("$type", $symname, $argnum); } if (newmem.own & SWIG_CAST_NEW_MEMORY) { tempshared = *%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); delete %reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); $1 = %const_cast(tempshared.get(), $1_ltype); } else { $1 = %const_cast(%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *)->get(), $1_ltype); } } %typemap(out, fragment="SWIG_null_deleter") CONST TYPE & { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1 SWIG_NO_NULL_DELETER_$owner); %set_output(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } %typemap(varin) CONST TYPE & { void *argp = 0; swig_ruby_owntype newmem = {0, 0}; int res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %variable_fail(res, "$type", "$name"); } SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > tempshared; if (!argp) { %variable_nullref("$type", "$name"); } if (newmem.own & SWIG_CAST_NEW_MEMORY) { tempshared = *%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); delete %reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); $1 = *%const_cast(tempshared.get(), $1_ltype); } else { $1 = *%const_cast(%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *)->get(), $1_ltype); } } %typemap(varout, fragment="SWIG_null_deleter") CONST TYPE & { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(&$1 SWIG_NO_NULL_DELETER_0); %set_varoutput(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } %typemap(directorin,noblock=1, fragment="SWIG_null_deleter") CONST TYPE & (SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0) %{ smartarg = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(&$1 SWIG_NO_NULL_DELETER_0); $input = SWIG_NewPointerObj(%as_voidptr(smartarg), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN | %newpointer_flags); %} %typemap(directorout,noblock=1) CONST TYPE & %{ #error "directorout typemap for plain reference not implemented" %} // plain pointer by reference // Note: $disown not implemented by default as it will lead to a memory leak of the shared_ptr instance %typemap(in) TYPE *CONST& (void *argp = 0, int res = 0, $*1_ltype temp = 0, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > tempshared) { swig_ruby_owntype newmem = {0, 0}; res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SHARED_PTR_DISOWN | %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } if (newmem.own & SWIG_CAST_NEW_MEMORY) { tempshared = *%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); delete %reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); temp = %const_cast(tempshared.get(), $*1_ltype); } else { temp = %const_cast(%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *)->get(), $*1_ltype); } $1 = &temp; } %typemap(out, fragment="SWIG_null_deleter") TYPE *CONST& { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = *$1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(*$1 SWIG_NO_NULL_DELETER_$owner) : 0; %set_output(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } %typemap(varin) TYPE *CONST& %{ #error "varin typemap not implemented" %} %typemap(varout) TYPE *CONST& %{ #error "varout typemap not implemented" %} %typemap(directorin,noblock=1, fragment="SWIG_null_deleter") TYPE *CONST& (SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0) %{ smartarg = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1 SWIG_NO_NULL_DELETER_0) : 0; $input = SWIG_NewPointerObj(%as_voidptr(smartarg), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN | %newpointer_flags); %} %typemap(directorout,noblock=1) TYPE *CONST& %{ #error "directorout typemap for plain pointer by reference not implemented" %} // shared_ptr by value %typemap(in) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > (void *argp, int res = 0) { swig_ruby_owntype newmem = {0, 0}; res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } if (argp) $1 = *(%reinterpret_cast(argp, $<ype)); if (newmem.own & SWIG_CAST_NEW_MEMORY) delete %reinterpret_cast(argp, $<ype); } %typemap(out) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1) : 0; %set_output(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } %typemap(varin) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > { swig_ruby_owntype newmem = {0, 0}; void *argp = 0; int res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %variable_fail(res, "$type", "$name"); } $1 = argp ? *(%reinterpret_cast(argp, $<ype)) : SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE >(); if (newmem.own & SWIG_CAST_NEW_MEMORY) delete %reinterpret_cast(argp, $<ype); } %typemap(varout) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1) : 0; %set_varoutput(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } %typemap(directorin,noblock=1) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > (SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0) %{ smartarg = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1) : 0; $input = SWIG_NewPointerObj(%as_voidptr(smartarg), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN | %newpointer_flags); %} %typemap(directorout,noblock=1) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > (void *swig_argp, int swig_res = 0) { swig_ruby_owntype newmem = {0, 0}; swig_res = SWIG_ConvertPtrAndOwn($input, &swig_argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(swig_res)) { %dirout_fail(swig_res, "$type"); } if (swig_argp) { $result = *(%reinterpret_cast(swig_argp, $<ype)); if (newmem.own & SWIG_CAST_NEW_MEMORY) delete %reinterpret_cast(swig_argp, $<ype); } } // shared_ptr by reference %typemap(in) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > & (void *argp, int res = 0, $*1_ltype tempshared) { swig_ruby_owntype newmem = {0, 0}; res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } if (newmem.own & SWIG_CAST_NEW_MEMORY) { if (argp) tempshared = *%reinterpret_cast(argp, $ltype); delete %reinterpret_cast(argp, $ltype); $1 = &tempshared; } else { $1 = (argp) ? %reinterpret_cast(argp, $ltype) : &tempshared; } } %typemap(out) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > & { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = *$1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(*$1) : 0; %set_output(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } %typemap(varin) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > & %{ #error "varin typemap not implemented" %} %typemap(varout) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > & %{ #error "varout typemap not implemented" %} %typemap(directorin,noblock=1) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > & (SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0) %{ smartarg = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1) : 0; $input = SWIG_NewPointerObj(%as_voidptr(smartarg), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN | %newpointer_flags); %} %typemap(directorout,noblock=1) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > & %{ #error "directorout typemap for shared_ptr ref not implemented" %} // shared_ptr by pointer %typemap(in) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * (void *argp, int res = 0, $*1_ltype tempshared) { swig_ruby_owntype newmem = {0, 0}; res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } if (newmem.own & SWIG_CAST_NEW_MEMORY) { if (argp) tempshared = *%reinterpret_cast(argp, $ltype); delete %reinterpret_cast(argp, $ltype); $1 = &tempshared; } else { $1 = (argp) ? %reinterpret_cast(argp, $ltype) : &tempshared; } } %typemap(out) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = ($1 && *$1) ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(*$1) : 0; %set_output(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); if ($owner) delete $1; } %typemap(varin) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * %{ #error "varin typemap not implemented" %} %typemap(varout) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * %{ #error "varout typemap not implemented" %} %typemap(directorin,noblock=1) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * (SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0) %{ smartarg = ($1 && *$1) ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(*$1) : 0; $input = SWIG_NewPointerObj(%as_voidptr(smartarg), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN | %newpointer_flags); %} %typemap(directorout,noblock=1) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * %{ #error "directorout typemap for pointer to shared_ptr not implemented" %} // shared_ptr by pointer reference %typemap(in) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& (void *argp, int res = 0, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > tempshared, $*1_ltype temp = 0) { swig_ruby_owntype newmem = {0, 0}; res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } if (argp) tempshared = *%reinterpret_cast(argp, $*ltype); if (newmem.own & SWIG_CAST_NEW_MEMORY) delete %reinterpret_cast(argp, $*ltype); temp = &tempshared; $1 = &temp; } %typemap(out) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = (*$1 && **$1) ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(**$1) : 0; %set_output(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } %typemap(varin) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& %{ #error "varin typemap not implemented" %} %typemap(varout) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& %{ #error "varout typemap not implemented" %} %typemap(directorin,noblock=1) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& (SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0) %{ smartarg = ($1 && *$1) ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(*$1) : 0; $input = SWIG_NewPointerObj(%as_voidptr(smartarg), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN | %newpointer_flags); %} %typemap(directorout,noblock=1) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& %{ #error "directorout typemap for pointer ref to shared_ptr not implemented" %} // Typecheck typemaps // Note: SWIG_ConvertPtr with void ** parameter set to 0 instead of using SWIG_ConvertPtrAndOwn, so that the casting // function is not called thereby avoiding a possible smart pointer copy constructor call when casting up the inheritance chain. %typemap(typecheck, precedence=SWIG_TYPECHECK_POINTER, equivalent="TYPE *", noblock=1) TYPE CONST, TYPE CONST &, TYPE CONST *, TYPE *CONST&, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > &, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& { int res = SWIG_ConvertPtr($input, 0, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), 0); $1 = SWIG_CheckState(res); } // various missing typemaps - If ever used (unlikely) ensure compilation error rather than runtime bug %typemap(in) CONST TYPE[], CONST TYPE[ANY], CONST TYPE (CLASS::*) %{ #error "typemaps for $1_type not available" %} %typemap(out) CONST TYPE[], CONST TYPE[ANY], CONST TYPE (CLASS::*) %{ #error "typemaps for $1_type not available" %} %template() SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >; %enddef swig-4.0.1/Lib/python/0000755000175000017500000000000013527063513014377 5ustar williamwilliamswig-4.0.1/Lib/python/std_wiostream.i0000644000175000017500000000024613527063513017437 0ustar williamwilliamnamespace std { %callback(1) wendl; %callback(1) wends; %callback(1) wflush; } %include %include %include swig-4.0.1/Lib/python/std_complex.i0000644000175000017500000000114013527063513017066 0ustar williamwilliam/* * STD C++ complex typemaps */ %include %{ #include %} namespace std { %naturalvar complex; template class complex; %template() complex; %template() complex; } /* defining the complex as/from converters */ %swig_cplxdbl_convn(std::complex, std::complex, std::real, std::imag) %swig_cplxflt_convn(std::complex, std::complex, std::real, std::imag) /* defining the typemaps */ %typemaps_primitive(%checkcode(CPLXDBL), std::complex); %typemaps_primitive(%checkcode(CPLXFLT), std::complex); swig-4.0.1/Lib/python/std_deque.i0000644000175000017500000000124513527063513016530 0ustar williamwilliam/* Deques */ %fragment("StdDequeTraits","header",fragment="StdSequenceTraits") %{ namespace swig { template struct traits_asptr > { static int asptr(PyObject *obj, std::deque **vec) { return traits_asptr_stdseq >::asptr(obj, vec); } }; template struct traits_from > { static PyObject *from(const std::deque& vec) { return traits_from_stdseq >::from(vec); } }; } %} #define %swig_deque_methods(Type...) %swig_sequence_methods(Type) #define %swig_deque_methods_val(Type...) %swig_sequence_methods_val(Type); %include swig-4.0.1/Lib/python/pythreads.swg0000644000175000017500000000531313527063513017126 0ustar williamwilliam#if defined(SWIG_PYTHON_NO_THREADS) # if defined(SWIG_PYTHON_THREADS) # undef SWIG_PYTHON_THREADS # endif #endif #if defined(SWIG_PYTHON_THREADS) /* Threading support is enabled */ # if !defined(SWIG_PYTHON_USE_GIL) && !defined(SWIG_PYTHON_NO_USE_GIL) # define SWIG_PYTHON_USE_GIL # endif # if defined(SWIG_PYTHON_USE_GIL) /* Use PyGILState threads calls */ # ifndef SWIG_PYTHON_INITIALIZE_THREADS # define SWIG_PYTHON_INITIALIZE_THREADS PyEval_InitThreads() # endif # ifdef __cplusplus /* C++ code */ class SWIG_Python_Thread_Block { bool status; PyGILState_STATE state; public: void end() { if (status) { PyGILState_Release(state); status = false;} } SWIG_Python_Thread_Block() : status(true), state(PyGILState_Ensure()) {} ~SWIG_Python_Thread_Block() { end(); } }; class SWIG_Python_Thread_Allow { bool status; PyThreadState *save; public: void end() { if (status) { PyEval_RestoreThread(save); status = false; }} SWIG_Python_Thread_Allow() : status(true), save(PyEval_SaveThread()) {} ~SWIG_Python_Thread_Allow() { end(); } }; # define SWIG_PYTHON_THREAD_BEGIN_BLOCK SWIG_Python_Thread_Block _swig_thread_block # define SWIG_PYTHON_THREAD_END_BLOCK _swig_thread_block.end() # define SWIG_PYTHON_THREAD_BEGIN_ALLOW SWIG_Python_Thread_Allow _swig_thread_allow # define SWIG_PYTHON_THREAD_END_ALLOW _swig_thread_allow.end() # else /* C code */ # define SWIG_PYTHON_THREAD_BEGIN_BLOCK PyGILState_STATE _swig_thread_block = PyGILState_Ensure() # define SWIG_PYTHON_THREAD_END_BLOCK PyGILState_Release(_swig_thread_block) # define SWIG_PYTHON_THREAD_BEGIN_ALLOW PyThreadState *_swig_thread_allow = PyEval_SaveThread() # define SWIG_PYTHON_THREAD_END_ALLOW PyEval_RestoreThread(_swig_thread_allow) # endif # else /* Old thread way, not implemented, user must provide it */ # if !defined(SWIG_PYTHON_INITIALIZE_THREADS) # define SWIG_PYTHON_INITIALIZE_THREADS # endif # if !defined(SWIG_PYTHON_THREAD_BEGIN_BLOCK) # define SWIG_PYTHON_THREAD_BEGIN_BLOCK # endif # if !defined(SWIG_PYTHON_THREAD_END_BLOCK) # define SWIG_PYTHON_THREAD_END_BLOCK # endif # if !defined(SWIG_PYTHON_THREAD_BEGIN_ALLOW) # define SWIG_PYTHON_THREAD_BEGIN_ALLOW # endif # if !defined(SWIG_PYTHON_THREAD_END_ALLOW) # define SWIG_PYTHON_THREAD_END_ALLOW # endif # endif #else /* No thread support */ # define SWIG_PYTHON_INITIALIZE_THREADS # define SWIG_PYTHON_THREAD_BEGIN_BLOCK # define SWIG_PYTHON_THREAD_END_BLOCK # define SWIG_PYTHON_THREAD_BEGIN_ALLOW # define SWIG_PYTHON_THREAD_END_ALLOW #endif swig-4.0.1/Lib/python/std_multiset.i0000644000175000017500000000207513527063513017275 0ustar williamwilliam/* Multisets */ %include %fragment("StdMultisetTraits","header",fragment="StdSequenceTraits") %{ namespace swig { template inline void assign(const SwigPySeq& swigpyseq, std::multiset* seq) { // seq->insert(swigpyseq.begin(), swigpyseq.end()); // not used as not always implemented typedef typename SwigPySeq::value_type value_type; typename SwigPySeq::const_iterator it = swigpyseq.begin(); for (;it != swigpyseq.end(); ++it) { seq->insert(seq->end(),(value_type)(*it)); } } template struct traits_asptr > { static int asptr(PyObject *obj, std::multiset **m) { return traits_asptr_stdseq >::asptr(obj, m); } }; template struct traits_from > { static PyObject *from(const std::multiset& vec) { return traits_from_stdseq >::from(vec); } }; } %} #define %swig_multiset_methods(Set...) %swig_set_methods(Set) %include swig-4.0.1/Lib/python/pyinit.swg0000644000175000017500000003660213527063513016444 0ustar williamwilliam/* ------------------------------------------------------------ * The start of the Python initialization function * ------------------------------------------------------------ */ %insert(init) "swiginit.swg" #if defined(SWIGPYTHON_BUILTIN) %fragment(""); // For offsetof #endif %insert(runtime) %{ #ifdef __cplusplus extern "C" { #endif /* Method creation and docstring support functions */ SWIGINTERN PyMethodDef *SWIG_PythonGetProxyDoc(const char *name); SWIGINTERN PyObject *SWIG_PyInstanceMethod_New(PyObject *SWIGUNUSEDPARM(self), PyObject *func); SWIGINTERN PyObject *SWIG_PyStaticMethod_New(PyObject *SWIGUNUSEDPARM(self), PyObject *func); #ifdef __cplusplus } #endif %} %init %{ #ifdef __cplusplus extern "C" { #endif /* Python-specific SWIG API */ #define SWIG_newvarlink() SWIG_Python_newvarlink() #define SWIG_addvarlink(p, name, get_attr, set_attr) SWIG_Python_addvarlink(p, name, get_attr, set_attr) #define SWIG_InstallConstants(d, constants) SWIG_Python_InstallConstants(d, constants) /* ----------------------------------------------------------------------------- * global variable support code. * ----------------------------------------------------------------------------- */ typedef struct swig_globalvar { char *name; /* Name of global variable */ PyObject *(*get_attr)(void); /* Return the current value */ int (*set_attr)(PyObject *); /* Set the value */ struct swig_globalvar *next; } swig_globalvar; typedef struct swig_varlinkobject { PyObject_HEAD swig_globalvar *vars; } swig_varlinkobject; SWIGINTERN PyObject * swig_varlink_repr(swig_varlinkobject *SWIGUNUSEDPARM(v)) { #if PY_VERSION_HEX >= 0x03000000 return PyUnicode_InternFromString(""); #else return PyString_FromString(""); #endif } SWIGINTERN PyObject * swig_varlink_str(swig_varlinkobject *v) { #if PY_VERSION_HEX >= 0x03000000 PyObject *str = PyUnicode_InternFromString("("); PyObject *tail; PyObject *joined; swig_globalvar *var; for (var = v->vars; var; var=var->next) { tail = PyUnicode_FromString(var->name); joined = PyUnicode_Concat(str, tail); Py_DecRef(str); Py_DecRef(tail); str = joined; if (var->next) { tail = PyUnicode_InternFromString(", "); joined = PyUnicode_Concat(str, tail); Py_DecRef(str); Py_DecRef(tail); str = joined; } } tail = PyUnicode_InternFromString(")"); joined = PyUnicode_Concat(str, tail); Py_DecRef(str); Py_DecRef(tail); str = joined; #else PyObject *str = PyString_FromString("("); swig_globalvar *var; for (var = v->vars; var; var=var->next) { PyString_ConcatAndDel(&str,PyString_FromString(var->name)); if (var->next) PyString_ConcatAndDel(&str,PyString_FromString(", ")); } PyString_ConcatAndDel(&str,PyString_FromString(")")); #endif return str; } SWIGINTERN void swig_varlink_dealloc(swig_varlinkobject *v) { swig_globalvar *var = v->vars; while (var) { swig_globalvar *n = var->next; free(var->name); free(var); var = n; } } SWIGINTERN PyObject * swig_varlink_getattr(swig_varlinkobject *v, char *n) { PyObject *res = NULL; swig_globalvar *var = v->vars; while (var) { if (strcmp(var->name,n) == 0) { res = (*var->get_attr)(); break; } var = var->next; } if (res == NULL && !PyErr_Occurred()) { PyErr_Format(PyExc_AttributeError, "Unknown C global variable '%s'", n); } return res; } SWIGINTERN int swig_varlink_setattr(swig_varlinkobject *v, char *n, PyObject *p) { int res = 1; swig_globalvar *var = v->vars; while (var) { if (strcmp(var->name,n) == 0) { res = (*var->set_attr)(p); break; } var = var->next; } if (res == 1 && !PyErr_Occurred()) { PyErr_Format(PyExc_AttributeError, "Unknown C global variable '%s'", n); } return res; } SWIGINTERN PyTypeObject* swig_varlink_type(void) { static char varlink__doc__[] = "Swig var link object"; static PyTypeObject varlink_type; static int type_init = 0; if (!type_init) { const PyTypeObject tmp = { #if PY_VERSION_HEX >= 0x03000000 PyVarObject_HEAD_INIT(NULL, 0) #else PyObject_HEAD_INIT(NULL) 0, /* ob_size */ #endif "swigvarlink", /* tp_name */ sizeof(swig_varlinkobject), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor) swig_varlink_dealloc, /* tp_dealloc */ 0, /* tp_print */ (getattrfunc) swig_varlink_getattr, /* tp_getattr */ (setattrfunc) swig_varlink_setattr, /* tp_setattr */ 0, /* tp_compare */ (reprfunc) swig_varlink_repr, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ 0, /* tp_as_mapping */ 0, /* tp_hash */ 0, /* tp_call */ (reprfunc) swig_varlink_str, /* tp_str */ 0, /* tp_getattro */ 0, /* tp_setattro */ 0, /* tp_as_buffer */ 0, /* tp_flags */ varlink__doc__, /* tp_doc */ 0, /* tp_traverse */ 0, /* tp_clear */ 0, /* tp_richcompare */ 0, /* tp_weaklistoffset */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* tp_iter -> tp_weaklist */ 0, /* tp_del */ 0, /* tp_version_tag */ #if PY_VERSION_HEX >= 0x03040000 0, /* tp_finalize */ #endif #ifdef COUNT_ALLOCS 0, /* tp_allocs */ 0, /* tp_frees */ 0, /* tp_maxalloc */ 0, /* tp_prev */ 0 /* tp_next */ #endif }; varlink_type = tmp; type_init = 1; if (PyType_Ready(&varlink_type) < 0) return NULL; } return &varlink_type; } /* Create a variable linking object for use later */ SWIGINTERN PyObject * SWIG_Python_newvarlink(void) { swig_varlinkobject *result = PyObject_NEW(swig_varlinkobject, swig_varlink_type()); if (result) { result->vars = 0; } return ((PyObject*) result); } SWIGINTERN void SWIG_Python_addvarlink(PyObject *p, const char *name, PyObject *(*get_attr)(void), int (*set_attr)(PyObject *p)) { swig_varlinkobject *v = (swig_varlinkobject *) p; swig_globalvar *gv = (swig_globalvar *) malloc(sizeof(swig_globalvar)); if (gv) { size_t size = strlen(name)+1; gv->name = (char *)malloc(size); if (gv->name) { memcpy(gv->name, name, size); gv->get_attr = get_attr; gv->set_attr = set_attr; gv->next = v->vars; } } v->vars = gv; } SWIGINTERN PyObject * SWIG_globals(void) { static PyObject *globals = 0; if (!globals) { globals = SWIG_newvarlink(); } return globals; } /* ----------------------------------------------------------------------------- * constants/methods manipulation * ----------------------------------------------------------------------------- */ /* Install Constants */ SWIGINTERN void SWIG_Python_InstallConstants(PyObject *d, swig_const_info constants[]) { PyObject *obj = 0; size_t i; for (i = 0; constants[i].type; ++i) { switch(constants[i].type) { case SWIG_PY_POINTER: obj = SWIG_InternalNewPointerObj(constants[i].pvalue, *(constants[i]).ptype,0); break; case SWIG_PY_BINARY: obj = SWIG_NewPackedObj(constants[i].pvalue, constants[i].lvalue, *(constants[i].ptype)); break; default: obj = 0; break; } if (obj) { PyDict_SetItemString(d, constants[i].name, obj); Py_DECREF(obj); } } } /* -----------------------------------------------------------------------------*/ /* Fix SwigMethods to carry the callback ptrs when needed */ /* -----------------------------------------------------------------------------*/ SWIGINTERN void SWIG_Python_FixMethods(PyMethodDef *methods, swig_const_info *const_table, swig_type_info **types, swig_type_info **types_initial) { size_t i; for (i = 0; methods[i].ml_name; ++i) { const char *c = methods[i].ml_doc; if (!c) continue; c = strstr(c, "swig_ptr: "); if (c) { int j; swig_const_info *ci = 0; const char *name = c + 10; for (j = 0; const_table[j].type; ++j) { if (strncmp(const_table[j].name, name, strlen(const_table[j].name)) == 0) { ci = &(const_table[j]); break; } } if (ci) { void *ptr = (ci->type == SWIG_PY_POINTER) ? ci->pvalue : 0; if (ptr) { size_t shift = (ci->ptype) - types; swig_type_info *ty = types_initial[shift]; size_t ldoc = (c - methods[i].ml_doc); size_t lptr = strlen(ty->name)+2*sizeof(void*)+2; char *ndoc = (char*)malloc(ldoc + lptr + 10); if (ndoc) { char *buff = ndoc; memcpy(buff, methods[i].ml_doc, ldoc); buff += ldoc; memcpy(buff, "swig_ptr: ", 10); buff += 10; SWIG_PackVoidPtr(buff, ptr, ty->name, lptr); methods[i].ml_doc = ndoc; } } } } } } /* ----------------------------------------------------------------------------- * Method creation and docstring support functions * ----------------------------------------------------------------------------- */ /* ----------------------------------------------------------------------------- * Function to find the method definition with the correct docstring for the * proxy module as opposed to the low-level API * ----------------------------------------------------------------------------- */ SWIGINTERN PyMethodDef *SWIG_PythonGetProxyDoc(const char *name) { /* Find the function in the modified method table */ size_t offset = 0; int found = 0; while (SwigMethods_proxydocs[offset].ml_meth != NULL) { if (strcmp(SwigMethods_proxydocs[offset].ml_name, name) == 0) { found = 1; break; } offset++; } /* Use the copy with the modified docstring if available */ return found ? &SwigMethods_proxydocs[offset] : NULL; } /* ----------------------------------------------------------------------------- * Wrapper of PyInstanceMethod_New() used in Python 3 * It is exported to the generated module, used for -fastproxy * ----------------------------------------------------------------------------- */ SWIGINTERN PyObject *SWIG_PyInstanceMethod_New(PyObject *SWIGUNUSEDPARM(self), PyObject *func) { if (PyCFunction_Check(func)) { PyCFunctionObject *funcobj = (PyCFunctionObject *)func; PyMethodDef *ml = SWIG_PythonGetProxyDoc(funcobj->m_ml->ml_name); if (ml) func = PyCFunction_NewEx(ml, funcobj->m_self, funcobj->m_module); } #if PY_VERSION_HEX >= 0x03000000 return PyInstanceMethod_New(func); #else return PyMethod_New(func, NULL, NULL); #endif } /* ----------------------------------------------------------------------------- * Wrapper of PyStaticMethod_New() * It is exported to the generated module, used for -fastproxy * ----------------------------------------------------------------------------- */ SWIGINTERN PyObject *SWIG_PyStaticMethod_New(PyObject *SWIGUNUSEDPARM(self), PyObject *func) { if (PyCFunction_Check(func)) { PyCFunctionObject *funcobj = (PyCFunctionObject *)func; PyMethodDef *ml = SWIG_PythonGetProxyDoc(funcobj->m_ml->ml_name); if (ml) func = PyCFunction_NewEx(ml, funcobj->m_self, funcobj->m_module); } return PyStaticMethod_New(func); } #ifdef __cplusplus } #endif /* -----------------------------------------------------------------------------* * Partial Init method * -----------------------------------------------------------------------------*/ #ifdef __cplusplus extern "C" #endif SWIGEXPORT #if PY_VERSION_HEX >= 0x03000000 PyObject* #else void #endif SWIG_init(void) { PyObject *m, *d, *md, *globals; #if PY_VERSION_HEX >= 0x03000000 static struct PyModuleDef SWIG_module = { PyModuleDef_HEAD_INIT, SWIG_name, NULL, -1, SwigMethods, NULL, NULL, NULL, NULL }; #endif #if defined(SWIGPYTHON_BUILTIN) static SwigPyClientData SwigPyObject_clientdata = {0, 0, 0, 0, 0, 0, 0}; static PyGetSetDef this_getset_def = { (char *)"this", &SwigPyBuiltin_ThisClosure, NULL, NULL, NULL }; static SwigPyGetSet thisown_getset_closure = { SwigPyObject_own, SwigPyObject_own }; static PyGetSetDef thisown_getset_def = { (char *)"thisown", SwigPyBuiltin_GetterClosure, SwigPyBuiltin_SetterClosure, NULL, &thisown_getset_closure }; PyTypeObject *builtin_pytype; int builtin_base_count; swig_type_info *builtin_basetype; PyObject *tuple; PyGetSetDescrObject *static_getset; PyTypeObject *metatype; PyTypeObject *swigpyobject; SwigPyClientData *cd; PyObject *public_interface, *public_symbol; PyObject *this_descr; PyObject *thisown_descr; PyObject *self = 0; int i; (void)builtin_pytype; (void)builtin_base_count; (void)builtin_basetype; (void)tuple; (void)static_getset; (void)self; /* Metaclass is used to implement static member variables */ metatype = SwigPyObjectType(); assert(metatype); #endif (void)globals; /* Create singletons now to avoid potential deadlocks with multi-threaded usage after module initialization */ SWIG_This(); SWIG_Python_TypeCache(); SwigPyPacked_type(); #ifndef SWIGPYTHON_BUILTIN SwigPyObject_type(); #endif /* Fix SwigMethods to carry the callback ptrs when needed */ SWIG_Python_FixMethods(SwigMethods, swig_const_table, swig_types, swig_type_initial); #if PY_VERSION_HEX >= 0x03000000 m = PyModule_Create(&SWIG_module); #else m = Py_InitModule(SWIG_name, SwigMethods); #endif md = d = PyModule_GetDict(m); (void)md; SWIG_InitializeModule(0); #ifdef SWIGPYTHON_BUILTIN swigpyobject = SwigPyObject_TypeOnce(); SwigPyObject_stype = SWIG_MangledTypeQuery("_p_SwigPyObject"); assert(SwigPyObject_stype); cd = (SwigPyClientData*) SwigPyObject_stype->clientdata; if (!cd) { SwigPyObject_stype->clientdata = &SwigPyObject_clientdata; SwigPyObject_clientdata.pytype = swigpyobject; } else if (swigpyobject->tp_basicsize != cd->pytype->tp_basicsize) { PyErr_SetString(PyExc_RuntimeError, "Import error: attempted to load two incompatible swig-generated modules."); # if PY_VERSION_HEX >= 0x03000000 return NULL; # else return; # endif } /* All objects have a 'this' attribute */ this_descr = PyDescr_NewGetSet(SwigPyObject_type(), &this_getset_def); (void)this_descr; /* All objects have a 'thisown' attribute */ thisown_descr = PyDescr_NewGetSet(SwigPyObject_type(), &thisown_getset_def); (void)thisown_descr; public_interface = PyList_New(0); public_symbol = 0; (void)public_symbol; PyDict_SetItemString(md, "__all__", public_interface); Py_DECREF(public_interface); for (i = 0; SwigMethods[i].ml_name != NULL; ++i) SwigPyBuiltin_AddPublicSymbol(public_interface, SwigMethods[i].ml_name); for (i = 0; swig_const_table[i].name != 0; ++i) SwigPyBuiltin_AddPublicSymbol(public_interface, swig_const_table[i].name); #endif SWIG_InstallConstants(d,swig_const_table); %} swig-4.0.1/Lib/python/director.swg0000644000175000017500000002226113527063513016737 0ustar williamwilliam/* ----------------------------------------------------------------------------- * director.swg * * This file contains support for director classes so that Python proxy * methods can be called from C++. * ----------------------------------------------------------------------------- */ #ifndef SWIG_DIRECTOR_PYTHON_HEADER_ #define SWIG_DIRECTOR_PYTHON_HEADER_ #include #include #include #include #include /* Use -DSWIG_PYTHON_DIRECTOR_NO_VTABLE if you don't want to generate a 'virtual table', and avoid multiple GetAttr calls to retrieve the python methods. */ #ifndef SWIG_PYTHON_DIRECTOR_NO_VTABLE #ifndef SWIG_PYTHON_DIRECTOR_VTABLE #define SWIG_PYTHON_DIRECTOR_VTABLE #endif #endif /* Use -DSWIG_DIRECTOR_NO_UEH if you prefer to avoid the use of the Undefined Exception Handler provided by swig. */ #ifndef SWIG_DIRECTOR_NO_UEH #ifndef SWIG_DIRECTOR_UEH #define SWIG_DIRECTOR_UEH #endif #endif /* Use -DSWIG_DIRECTOR_NORTTI if you prefer to avoid the use of the native C++ RTTI and dynamic_cast<>. But be aware that directors could stop working when using this option. */ #ifdef SWIG_DIRECTOR_NORTTI /* When we don't use the native C++ RTTI, we implement a minimal one only for Directors. */ # ifndef SWIG_DIRECTOR_RTDIR # define SWIG_DIRECTOR_RTDIR namespace Swig { class Director; SWIGINTERN std::map& get_rtdir_map() { static std::map rtdir_map; return rtdir_map; } SWIGINTERNINLINE void set_rtdir(void *vptr, Director *rtdir) { get_rtdir_map()[vptr] = rtdir; } SWIGINTERNINLINE Director *get_rtdir(void *vptr) { std::map::const_iterator pos = get_rtdir_map().find(vptr); Director *rtdir = (pos != get_rtdir_map().end()) ? pos->second : 0; return rtdir; } } # endif /* SWIG_DIRECTOR_RTDIR */ # define SWIG_DIRECTOR_CAST(ARG) Swig::get_rtdir(static_cast(ARG)) # define SWIG_DIRECTOR_RGTR(ARG1, ARG2) Swig::set_rtdir(static_cast(ARG1), ARG2) #else # define SWIG_DIRECTOR_CAST(ARG) dynamic_cast(ARG) # define SWIG_DIRECTOR_RGTR(ARG1, ARG2) #endif /* SWIG_DIRECTOR_NORTTI */ extern "C" { struct swig_type_info; } namespace Swig { /* memory handler */ struct GCItem { virtual ~GCItem() {} virtual int get_own() const { return 0; } }; struct GCItem_var { GCItem_var(GCItem *item = 0) : _item(item) { } GCItem_var& operator=(GCItem *item) { GCItem *tmp = _item; _item = item; delete tmp; return *this; } ~GCItem_var() { delete _item; } GCItem * operator->() const { return _item; } private: GCItem *_item; }; struct GCItem_Object : GCItem { GCItem_Object(int own) : _own(own) { } virtual ~GCItem_Object() { } int get_own() const { return _own; } private: int _own; }; template struct GCItem_T : GCItem { GCItem_T(Type *ptr) : _ptr(ptr) { } virtual ~GCItem_T() { delete _ptr; } private: Type *_ptr; }; template struct GCArray_T : GCItem { GCArray_T(Type *ptr) : _ptr(ptr) { } virtual ~GCArray_T() { delete[] _ptr; } private: Type *_ptr; }; /* base class for director exceptions */ class DirectorException : public std::exception { protected: std::string swig_msg; public: DirectorException(PyObject *error, const char *hdr ="", const char *msg ="") : swig_msg(hdr) { SWIG_PYTHON_THREAD_BEGIN_BLOCK; if (msg[0]) { swig_msg += " "; swig_msg += msg; } if (!PyErr_Occurred()) { PyErr_SetString(error, what()); } SWIG_PYTHON_THREAD_END_BLOCK; } virtual ~DirectorException() throw() { } /* Deprecated, use what() instead */ const char *getMessage() const { return what(); } const char *what() const throw() { return swig_msg.c_str(); } static void raise(PyObject *error, const char *msg) { throw DirectorException(error, msg); } static void raise(const char *msg) { raise(PyExc_RuntimeError, msg); } }; /* type mismatch in the return value from a python method call */ class DirectorTypeMismatchException : public DirectorException { public: DirectorTypeMismatchException(PyObject *error, const char *msg="") : DirectorException(error, "SWIG director type mismatch", msg) { } DirectorTypeMismatchException(const char *msg="") : DirectorException(PyExc_TypeError, "SWIG director type mismatch", msg) { } static void raise(PyObject *error, const char *msg) { throw DirectorTypeMismatchException(error, msg); } static void raise(const char *msg) { throw DirectorTypeMismatchException(msg); } }; /* any python exception that occurs during a director method call */ class DirectorMethodException : public DirectorException { public: DirectorMethodException(const char *msg = "") : DirectorException(PyExc_RuntimeError, "SWIG director method error.", msg) { } static void raise(const char *msg) { throw DirectorMethodException(msg); } }; /* attempt to call a pure virtual method via a director method */ class DirectorPureVirtualException : public DirectorException { public: DirectorPureVirtualException(const char *msg = "") : DirectorException(PyExc_RuntimeError, "SWIG director pure virtual method called", msg) { } static void raise(const char *msg) { throw DirectorPureVirtualException(msg); } }; #if defined(SWIG_PYTHON_THREADS) /* __THREAD__ is the old macro to activate some thread support */ # if !defined(__THREAD__) # define __THREAD__ 1 # endif #endif #ifdef __THREAD__ # include "pythread.h" class Guard { PyThread_type_lock &mutex_; public: Guard(PyThread_type_lock & mutex) : mutex_(mutex) { PyThread_acquire_lock(mutex_, WAIT_LOCK); } ~Guard() { PyThread_release_lock(mutex_); } }; # define SWIG_GUARD(mutex) Guard _guard(mutex) #else # define SWIG_GUARD(mutex) #endif /* director base class */ class Director { private: /* pointer to the wrapped python object */ PyObject *swig_self; /* flag indicating whether the object is owned by python or c++ */ mutable bool swig_disown_flag; /* decrement the reference count of the wrapped python object */ void swig_decref() const { if (swig_disown_flag) { SWIG_PYTHON_THREAD_BEGIN_BLOCK; Py_DECREF(swig_self); SWIG_PYTHON_THREAD_END_BLOCK; } } public: /* wrap a python object. */ Director(PyObject *self) : swig_self(self), swig_disown_flag(false) { } /* discard our reference at destruction */ virtual ~Director() { swig_decref(); } /* return a pointer to the wrapped python object */ PyObject *swig_get_self() const { return swig_self; } /* acquire ownership of the wrapped python object (the sense of "disown" is from python) */ void swig_disown() const { if (!swig_disown_flag) { swig_disown_flag=true; swig_incref(); } } /* increase the reference count of the wrapped python object */ void swig_incref() const { if (swig_disown_flag) { Py_INCREF(swig_self); } } /* methods to implement pseudo protected director members */ virtual bool swig_get_inner(const char * /* swig_protected_method_name */) const { return true; } virtual void swig_set_inner(const char * /* swig_protected_method_name */, bool /* swig_val */) const { } /* ownership management */ private: typedef std::map swig_ownership_map; mutable swig_ownership_map swig_owner; #ifdef __THREAD__ static PyThread_type_lock swig_mutex_own; #endif public: template void swig_acquire_ownership_array(Type *vptr) const { if (vptr) { SWIG_GUARD(swig_mutex_own); swig_owner[vptr] = new GCArray_T(vptr); } } template void swig_acquire_ownership(Type *vptr) const { if (vptr) { SWIG_GUARD(swig_mutex_own); swig_owner[vptr] = new GCItem_T(vptr); } } void swig_acquire_ownership_obj(void *vptr, int own) const { if (vptr && own) { SWIG_GUARD(swig_mutex_own); swig_owner[vptr] = new GCItem_Object(own); } } int swig_release_ownership(void *vptr) const { int own = 0; if (vptr) { SWIG_GUARD(swig_mutex_own); swig_ownership_map::iterator iter = swig_owner.find(vptr); if (iter != swig_owner.end()) { own = iter->second->get_own(); swig_owner.erase(iter); } } return own; } template static PyObject *swig_pyobj_disown(PyObject *pyobj, PyObject *SWIGUNUSEDPARM(args)) { SwigPyObject *sobj = (SwigPyObject *)pyobj; sobj->own = 0; Director *d = SWIG_DIRECTOR_CAST(reinterpret_cast(sobj->ptr)); if (d) d->swig_disown(); return PyWeakref_NewProxy(pyobj, NULL); } }; #ifdef __THREAD__ PyThread_type_lock Director::swig_mutex_own = PyThread_allocate_lock(); #endif } #endif swig-4.0.1/Lib/python/cpointer.i0000644000175000017500000000004113527063513016367 0ustar williamwilliam%include swig-4.0.1/Lib/python/wchar.i0000644000175000017500000000027213527063513015656 0ustar williamwilliam#ifdef __cplusplus %{ #include %} #else %{ #include %} #endif %types(wchar_t *); %include /* Enable swig wchar support. */ #define SWIG_WCHAR swig-4.0.1/Lib/python/std_shared_ptr.i0000644000175000017500000000010413527063513017551 0ustar williamwilliam#define SWIG_SHARED_PTR_NAMESPACE std %include swig-4.0.1/Lib/python/std_multimap.i0000644000175000017500000000576513527063513017270 0ustar williamwilliam/* Multimaps */ %include %fragment("StdMultimapTraits","header",fragment="StdMapCommonTraits") { namespace swig { template inline void assign(const SwigPySeq& swigpyseq, std::multimap *multimap) { typedef typename std::multimap::value_type value_type; typename SwigPySeq::const_iterator it = swigpyseq.begin(); for (;it != swigpyseq.end(); ++it) { multimap->insert(value_type(it->first, it->second)); } } template struct traits_asptr > { typedef std::multimap multimap_type; static int asptr(PyObject *obj, std::multimap **val) { int res = SWIG_ERROR; if (PyDict_Check(obj)) { SwigVar_PyObject items = PyObject_CallMethod(obj,(char *)"items",NULL); %#if PY_VERSION_HEX >= 0x03000000 /* In Python 3.x the ".items()" method returns a dict_items object */ items = PySequence_Fast(items, ".items() didn't return a sequence!"); %#endif res = traits_asptr_stdseq, std::pair >::asptr(items, val); } else { multimap_type *p; swig_type_info *descriptor = swig::type_info(); res = descriptor ? SWIG_ConvertPtr(obj, (void **)&p, descriptor, 0) : SWIG_ERROR; if (SWIG_IsOK(res) && val) *val = p; } return res; } }; template struct traits_from > { typedef std::multimap multimap_type; typedef typename multimap_type::const_iterator const_iterator; typedef typename multimap_type::size_type size_type; static PyObject *from(const multimap_type& multimap) { swig_type_info *desc = swig::type_info(); if (desc && desc->clientdata) { return SWIG_InternalNewPointerObj(new multimap_type(multimap), desc, SWIG_POINTER_OWN); } else { size_type size = multimap.size(); Py_ssize_t pysize = (size <= (size_type) INT_MAX) ? (Py_ssize_t) size : -1; if (pysize < 0) { SWIG_PYTHON_THREAD_BEGIN_BLOCK; PyErr_SetString(PyExc_OverflowError, "multimap size not valid in python"); SWIG_PYTHON_THREAD_END_BLOCK; return NULL; } PyObject *obj = PyDict_New(); for (const_iterator i= multimap.begin(); i!= multimap.end(); ++i) { swig::SwigVar_PyObject key = swig::from(i->first); swig::SwigVar_PyObject val = swig::from(i->second); PyDict_SetItem(obj, key, val); } return obj; } } }; } } %define %swig_multimap_methods(Type...) %swig_map_common(Type); #if defined(SWIGPYTHON_BUILTIN) %feature("python:slot", "mp_ass_subscript", functype="objobjargproc") __setitem__; #endif %extend { // This will be called through the mp_ass_subscript slot to delete an entry. void __setitem__(const key_type& key) { self->erase(key); } void __setitem__(const key_type& key, const mapped_type& x) throw (std::out_of_range) { self->insert(Type::value_type(key,x)); } } %enddef %include swig-4.0.1/Lib/python/std_unordered_multiset.i0000644000175000017500000000343713527063513021347 0ustar williamwilliam/* Unordered Multisets */ %include %fragment("StdUnorderedMultisetTraits","header",fragment="StdSequenceTraits") %{ namespace swig { template inline void assign(const SwigPySeq& swigpyseq, std::unordered_multiset* seq) { // seq->insert(swigpyseq.begin(), swigpyseq.end()); // not used as not always implemented typedef typename SwigPySeq::value_type value_type; typename SwigPySeq::const_iterator it = swigpyseq.begin(); for (;it != swigpyseq.end(); ++it) { seq->insert(seq->end(),(value_type)(*it)); } } template struct traits_reserve > { static void reserve(std::unordered_multiset &seq, typename std::unordered_multiset::size_type n) { seq.reserve(n); } }; template struct traits_asptr > { static int asptr(PyObject *obj, std::unordered_multiset **m) { return traits_asptr_stdseq >::asptr(obj, m); } }; template struct traits_from > { static PyObject *from(const std::unordered_multiset& vec) { return traits_from_stdseq >::from(vec); } }; } %} #define %swig_unordered_multiset_methods(Set...) %swig_unordered_set_methods(Set) %include swig-4.0.1/Lib/python/std_vector.i0000644000175000017500000000156613527063513016735 0ustar williamwilliam/* Vectors */ %fragment("StdVectorTraits","header",fragment="StdSequenceTraits") %{ namespace swig { template struct traits_reserve > { static void reserve(std::vector &seq, typename std::vector::size_type n) { seq.reserve(n); } }; template struct traits_asptr > { static int asptr(PyObject *obj, std::vector **vec) { return traits_asptr_stdseq >::asptr(obj, vec); } }; template struct traits_from > { static PyObject *from(const std::vector& vec) { return traits_from_stdseq >::from(vec); } }; } %} #define %swig_vector_methods(Type...) %swig_sequence_methods(Type) #define %swig_vector_methods_val(Type...) %swig_sequence_methods_val(Type); %include swig-4.0.1/Lib/python/Makefile.in0000644000175000017500000000656013527063513016453 0ustar williamwilliam# --------------------------------------------------------------- # SWIG Python Makefile # # This file can be used to build various Python extensions with SWIG. # By default this file is set up for dynamic loading, but it can # be easily customized for static extensions by modifying various # portions of the file. # # SRCS = C source files # CXXSRCS = C++ source files # OBJCSRCS = Objective-C source files # OBJS = Additional .o files (compiled previously) # INTERFACE = SWIG interface file # TARGET = Name of target module or executable # # Many portions of this file were created by the SWIG configure # script and should already reflect your machine. #---------------------------------------------------------------- SRCS = CXXSRCS = OBJCSRCS = OBJS = INTERFACE = WRAPFILE = $(INTERFACE:.i=_wrap.c) WRAPOBJ = $(INTERFACE:.i=_wrap.o) TARGET = module@SO@ # Use this kind of target for dynamic loading #TARGET = mypython # Use this target for static linking prefix = @prefix@ exec_prefix = @exec_prefix@ CC = @CC@ CXX = @CXX@ OBJC = @CC@ -Wno-import # -Wno-import needed for gcc CFLAGS = INCLUDES = LIBS = # SWIG Options # SWIG = location of the SWIG executable # SWIGOPT = SWIG compiler options # SWIGCC = Compiler used to compile the wrapper file SWIG = $(exec_prefix)/bin/swig SWIGOPT = -python SWIGCC = $(CC) # SWIG Library files. Uncomment if rebuilding the Python interpreter #SWIGLIBS = -lembed.i # Rules for creating .o files from source. COBJS = $(SRCS:.c=.o) CXXOBJS = $(CXXSRCS:.cxx=.o) OBJCOBJS = $(OBJCSRCS:.m=.o) ALLOBJS = $(COBJS) $(CXXOBJS) $(OBJCOBJS) $(OBJS) # Command that will be used to build the final extension. BUILD = $(SWIGCC) # Uncomment the following if you are using dynamic loading CCSHARED = @CCSHARED@ BUILD = @LDSHARED@ # Uncomment the following if you are using dynamic loading with C++ and # need to provide additional link libraries (this is not always required). #DLL_LIBS = -L/usr/local/lib/gcc-lib/sparc-sun-solaris2.5.1/2.7.2 \ -L/usr/local/lib -lg++ -lstdc++ -lgcc # Python installation PY_INCLUDE = -DHAVE_CONFIG_H @PYINCLUDE@ PY_LIB = @PYLIB@ # Build libraries (needed for static builds) LIBM = @LIBM@ LIBC = @LIBC@ SYSLIBS = $(LIBM) $(LIBC) @LIBS@ # Build options BUILD_LIBS = $(LIBS) # Dynamic loading # Compilation rules for non-SWIG components .SUFFIXES: .c .cxx .m .c.o: $(CC) $(CCSHARED) $(CFLAGS) $(INCLUDES) -c $< .cxx.o: $(CXX) $(CCSHARED) $(CXXFLAGS) $(INCLUDES) -c $< .m.o: $(OBJC) $(CCSHARED) $(CFLAGS) $(INCLUDES) -c $< # ---------------------------------------------------------------------- # Rules for building the extension # ---------------------------------------------------------------------- all: $(TARGET) # Convert the wrapper file into an object file $(WRAPOBJ) : $(WRAPFILE) $(SWIGCC) -c $(CCSHARED) $(CFLAGS) $(WRAPFILE) $(INCLUDES) $(PY_INCLUDE) $(WRAPFILE) : $(INTERFACE) $(SWIG) $(SWIGOPT) -o $(WRAPFILE) $(SWIGLIBS) $(INTERFACE) $(TARGET): $(WRAPOBJ) $(ALLOBJS) $(BUILD) $(WRAPOBJ) $(ALLOBJS) $(BUILD_LIBS) -o $(TARGET) clean: rm -f $(COBJS) $(CXXOBJS) $(OBJCOBJS) $(WRAPOBJ) $(WRAPFILE) $(TARGET) swig-4.0.1/Lib/python/pyruntime.swg0000644000175000017500000000175413527063513017164 0ustar williamwilliam%insert(runtime) %{ #if defined(__GNUC__) && defined(_WIN32) && !defined(SWIG_PYTHON_NO_HYPOT_WORKAROUND) /* Workaround for '::hypot' has not been declared', see https://bugs.python.org/issue11566 */ # include #endif #if defined(_DEBUG) && defined(SWIG_PYTHON_INTERPRETER_NO_DEBUG) /* Use debug wrappers with the Python release dll */ # undef _DEBUG # include # define _DEBUG 1 #else # include #endif %} %insert(runtime) "swigrun.swg"; /* SWIG API */ %insert(runtime) "swigerrors.swg"; /* SWIG errors */ %insert(runtime) "pyhead.swg"; /* Python includes and fixes */ %insert(runtime) "pyerrors.swg"; /* Python errors */ %insert(runtime) "pythreads.swg"; /* Python thread code */ %insert(runtime) "pyapi.swg"; /* Python API */ %insert(runtime) "pyrun.swg"; /* Python run-time code */ #if defined(SWIGPYTHON_BUILTIN) %insert(runtime) "builtin.swg"; /* Specialization for classes with single inheritance */ #endif swig-4.0.1/Lib/python/std_alloc.i0000644000175000017500000000003313527063513016511 0ustar williamwilliam%include swig-4.0.1/Lib/python/pyiterators.swg0000644000175000017500000003047413527063513017516 0ustar williamwilliam/* ----------------------------------------------------------------------------- * pyiterators.swg * * Implement a python 'output' iterator for Python 2.2 or higher. * * Users can derive form the SwigPyIterator to implement their * own iterators. As an example (real one since we use it for STL/STD * containers), the template SwigPyIterator_T does the * implementation for generic C++ iterators. * ----------------------------------------------------------------------------- */ %include %fragment("SwigPyIterator","header",fragment="") { namespace swig { struct stop_iteration { }; struct SwigPyIterator { private: SwigPtr_PyObject _seq; protected: SwigPyIterator(PyObject *seq) : _seq(seq) { } public: virtual ~SwigPyIterator() {} // Access iterator method, required by Python virtual PyObject *value() const = 0; // Forward iterator method, required by Python virtual SwigPyIterator *incr(size_t n = 1) = 0; // Backward iterator method, very common in C++, but not required in Python virtual SwigPyIterator *decr(size_t /*n*/ = 1) { throw stop_iteration(); } // Random access iterator methods, but not required in Python virtual ptrdiff_t distance(const SwigPyIterator &/*x*/) const { throw std::invalid_argument("operation not supported"); } virtual bool equal (const SwigPyIterator &/*x*/) const { throw std::invalid_argument("operation not supported"); } // C++ common/needed methods virtual SwigPyIterator *copy() const = 0; PyObject *next() { SWIG_PYTHON_THREAD_BEGIN_BLOCK; // disable threads PyObject *obj = value(); incr(); SWIG_PYTHON_THREAD_END_BLOCK; // re-enable threads return obj; } /* Make an alias for Python 3.x */ PyObject *__next__() { return next(); } PyObject *previous() { SWIG_PYTHON_THREAD_BEGIN_BLOCK; // disable threads decr(); PyObject *obj = value(); SWIG_PYTHON_THREAD_END_BLOCK; // re-enable threads return obj; } SwigPyIterator *advance(ptrdiff_t n) { return (n > 0) ? incr(n) : decr(-n); } bool operator == (const SwigPyIterator& x) const { return equal(x); } bool operator != (const SwigPyIterator& x) const { return ! operator==(x); } SwigPyIterator& operator += (ptrdiff_t n) { return *advance(n); } SwigPyIterator& operator -= (ptrdiff_t n) { return *advance(-n); } SwigPyIterator* operator + (ptrdiff_t n) const { return copy()->advance(n); } SwigPyIterator* operator - (ptrdiff_t n) const { return copy()->advance(-n); } ptrdiff_t operator - (const SwigPyIterator& x) const { return x.distance(*this); } static swig_type_info* descriptor() { static int init = 0; static swig_type_info* desc = 0; if (!init) { desc = SWIG_TypeQuery("swig::SwigPyIterator *"); init = 1; } return desc; } }; %#if defined(SWIGPYTHON_BUILTIN) inline PyObject* make_output_iterator_builtin (PyObject *pyself) { Py_INCREF(pyself); return pyself; } %#endif } } %fragment("SwigPyIterator_T","header",fragment="",fragment="SwigPyIterator",fragment="StdTraits",fragment="StdIteratorTraits") { namespace swig { template class SwigPyIterator_T : public SwigPyIterator { public: typedef OutIterator out_iterator; typedef typename std::iterator_traits::value_type value_type; typedef SwigPyIterator_T self_type; SwigPyIterator_T(out_iterator curr, PyObject *seq) : SwigPyIterator(seq), current(curr) { } const out_iterator& get_current() const { return current; } bool equal (const SwigPyIterator &iter) const { const self_type *iters = dynamic_cast(&iter); if (iters) { return (current == iters->get_current()); } else { throw std::invalid_argument("bad iterator type"); } } ptrdiff_t distance(const SwigPyIterator &iter) const { const self_type *iters = dynamic_cast(&iter); if (iters) { return std::distance(current, iters->get_current()); } else { throw std::invalid_argument("bad iterator type"); } } protected: out_iterator current; }; template struct from_oper { typedef const ValueType& argument_type; typedef PyObject *result_type; result_type operator()(argument_type v) const { return swig::from(v); } }; template::value_type, typename FromOper = from_oper > class SwigPyForwardIteratorOpen_T : public SwigPyIterator_T { public: FromOper from; typedef OutIterator out_iterator; typedef ValueType value_type; typedef SwigPyIterator_T base; typedef SwigPyForwardIteratorOpen_T self_type; SwigPyForwardIteratorOpen_T(out_iterator curr, PyObject *seq) : SwigPyIterator_T(curr, seq) { } PyObject *value() const { return from(static_cast(*(base::current))); } SwigPyIterator *copy() const { return new self_type(*this); } SwigPyIterator *incr(size_t n = 1) { while (n--) { ++base::current; } return this; } }; template::value_type, typename FromOper = from_oper > class SwigPyIteratorOpen_T : public SwigPyForwardIteratorOpen_T { public: FromOper from; typedef OutIterator out_iterator; typedef ValueType value_type; typedef SwigPyIterator_T base; typedef SwigPyIteratorOpen_T self_type; SwigPyIteratorOpen_T(out_iterator curr, PyObject *seq) : SwigPyForwardIteratorOpen_T(curr, seq) { } SwigPyIterator *decr(size_t n = 1) { while (n--) { --base::current; } return this; } }; template::value_type, typename FromOper = from_oper > class SwigPyForwardIteratorClosed_T : public SwigPyIterator_T { public: FromOper from; typedef OutIterator out_iterator; typedef ValueType value_type; typedef SwigPyIterator_T base; typedef SwigPyForwardIteratorClosed_T self_type; SwigPyForwardIteratorClosed_T(out_iterator curr, out_iterator first, out_iterator last, PyObject *seq) : SwigPyIterator_T(curr, seq), begin(first), end(last) { } PyObject *value() const { if (base::current == end) { throw stop_iteration(); } else { return from(static_cast(*(base::current))); } } SwigPyIterator *copy() const { return new self_type(*this); } SwigPyIterator *incr(size_t n = 1) { while (n--) { if (base::current == end) { throw stop_iteration(); } else { ++base::current; } } return this; } protected: out_iterator begin; out_iterator end; }; template::value_type, typename FromOper = from_oper > class SwigPyIteratorClosed_T : public SwigPyForwardIteratorClosed_T { public: FromOper from; typedef OutIterator out_iterator; typedef ValueType value_type; typedef SwigPyIterator_T base; typedef SwigPyForwardIteratorClosed_T base0; typedef SwigPyIteratorClosed_T self_type; SwigPyIteratorClosed_T(out_iterator curr, out_iterator first, out_iterator last, PyObject *seq) : SwigPyForwardIteratorClosed_T(curr, first, last, seq) { } SwigPyIterator *decr(size_t n = 1) { while (n--) { if (base::current == base0::begin) { throw stop_iteration(); } else { --base::current; } } return this; } }; template inline SwigPyIterator* make_output_forward_iterator(const OutIter& current, const OutIter& begin,const OutIter& end, PyObject *seq = 0) { return new SwigPyForwardIteratorClosed_T(current, begin, end, seq); } template inline SwigPyIterator* make_output_iterator(const OutIter& current, const OutIter& begin,const OutIter& end, PyObject *seq = 0) { return new SwigPyIteratorClosed_T(current, begin, end, seq); } template inline SwigPyIterator* make_output_forward_iterator(const OutIter& current, PyObject *seq = 0) { return new SwigPyForwardIteratorOpen_T(current, seq); } template inline SwigPyIterator* make_output_iterator(const OutIter& current, PyObject *seq = 0) { return new SwigPyIteratorOpen_T(current, seq); } } } %fragment("SwigPyIterator"); namespace swig { /* Throw a StopIteration exception */ %ignore stop_iteration; struct stop_iteration {}; %typemap(throws) stop_iteration { (void)$1; SWIG_SetErrorObj(PyExc_StopIteration, SWIG_Py_Void()); SWIG_fail; } /* Mark methods that return new objects */ %newobject SwigPyIterator::copy; %newobject SwigPyIterator::operator + (ptrdiff_t n) const; %newobject SwigPyIterator::operator - (ptrdiff_t n) const; %nodirector SwigPyIterator; #if defined(SWIGPYTHON_BUILTIN) %feature("python:tp_iter") SwigPyIterator "&swig::make_output_iterator_builtin"; %feature("python:slot", "tp_iternext", functype="iternextfunc") SwigPyIterator::__next__; #else %extend SwigPyIterator { %pythoncode %{def __iter__(self): return self%} } #endif %catches(swig::stop_iteration) SwigPyIterator::value() const; %catches(swig::stop_iteration) SwigPyIterator::incr(size_t n = 1); %catches(swig::stop_iteration) SwigPyIterator::decr(size_t n = 1); %catches(std::invalid_argument) SwigPyIterator::distance(const SwigPyIterator &x) const; %catches(std::invalid_argument) SwigPyIterator::equal (const SwigPyIterator &x) const; %catches(swig::stop_iteration) SwigPyIterator::__next__(); %catches(swig::stop_iteration) SwigPyIterator::next(); %catches(swig::stop_iteration) SwigPyIterator::previous(); %catches(swig::stop_iteration) SwigPyIterator::advance(ptrdiff_t n); %catches(swig::stop_iteration) SwigPyIterator::operator += (ptrdiff_t n); %catches(swig::stop_iteration) SwigPyIterator::operator -= (ptrdiff_t n); %catches(swig::stop_iteration) SwigPyIterator::operator + (ptrdiff_t n) const; %catches(swig::stop_iteration) SwigPyIterator::operator - (ptrdiff_t n) const; struct SwigPyIterator { protected: SwigPyIterator(PyObject *seq); public: virtual ~SwigPyIterator(); // Access iterator method, required by Python virtual PyObject *value() const = 0; // Forward iterator method, required by Python virtual SwigPyIterator *incr(size_t n = 1) = 0; // Backward iterator method, very common in C++, but not required in Python virtual SwigPyIterator *decr(size_t n = 1); // Random access iterator methods, but not required in Python virtual ptrdiff_t distance(const SwigPyIterator &x) const; virtual bool equal (const SwigPyIterator &x) const; // C++ common/needed methods virtual SwigPyIterator *copy() const = 0; PyObject *next(); PyObject *__next__(); PyObject *previous(); SwigPyIterator *advance(ptrdiff_t n); bool operator == (const SwigPyIterator& x) const; bool operator != (const SwigPyIterator& x) const; SwigPyIterator& operator += (ptrdiff_t n); SwigPyIterator& operator -= (ptrdiff_t n); SwigPyIterator* operator + (ptrdiff_t n) const; SwigPyIterator* operator - (ptrdiff_t n) const; ptrdiff_t operator - (const SwigPyIterator& x) const; }; } swig-4.0.1/Lib/python/cwstring.i0000644000175000017500000000007413527063513016412 0ustar williamwilliam%include %include swig-4.0.1/Lib/python/std_set.i0000644000175000017500000000322313527063513016216 0ustar williamwilliam/* Sets */ %fragment("StdSetTraits","header",fragment="StdSequenceTraits") %{ namespace swig { template inline void assign(const SwigPySeq& swigpyseq, std::set* seq) { // seq->insert(swigpyseq.begin(), swigpyseq.end()); // not used as not always implemented typedef typename SwigPySeq::value_type value_type; typename SwigPySeq::const_iterator it = swigpyseq.begin(); for (;it != swigpyseq.end(); ++it) { seq->insert(seq->end(),(value_type)(*it)); } } template struct traits_asptr > { static int asptr(PyObject *obj, std::set **s) { return traits_asptr_stdseq >::asptr(obj, s); } }; template struct traits_from > { static PyObject *from(const std::set& vec) { return traits_from_stdseq >::from(vec); } }; } %} %define %swig_set_methods(set...) %swig_sequence_iterator(set); %swig_container_methods(set); #if defined(SWIGPYTHON_BUILTIN) %feature("python:slot", "mp_subscript", functype="binaryfunc") __getitem__; %feature("python:slot", "sq_contains", functype="objobjproc") __contains__; #endif %extend { void append(value_type x) { self->insert(x); } bool __contains__(value_type x) { return self->find(x) != self->end(); } value_type __getitem__(difference_type i) const throw (std::out_of_range) { return *(swig::cgetpos(self, i)); } void add(value_type x) { self->insert(x); } void discard(value_type x) { self->erase(x); } } %enddef %include swig-4.0.1/Lib/python/defarg.swg0000644000175000017500000000220513527063513016350 0ustar williamwilliam/* This file defines an internal function for processing default arguments with proxy classes. There seems to be no straightforward way to write proxy functions involving default arguments. For example : def foo(arg1,arg2,*args): proxyc.foo(arg1,arg2,args) This fails because args is now a tuple and SWIG doesn't know what to do with it. This file allows a different approach : def foo(arg1,arg2,*args): proxyc.__call_defarg(proxyc.foo,(arg1,arg2,)+args) Basically, we form a new tuple from the object, call this special __call_defarg method and it passes control to the real wrapper function. An ugly hack, but it works. */ SWIGINTERN PyObject *swig_call_defargs(PyObject *self, PyObject *args) { PyObject *func; PyObject *parms; if (!PyArg_ParseTuple(args, "OO", &func, &parms)) return NULL; if (!PyCallable_Check(func)) { SWIG_PYTHON_THREAD_BEGIN_BLOCK; PyErr_SetString(PyExc_TypeError, "__call_defarg : Need a callable object!"); SWIG_PYTHON_THREAD_END_BLOCK; return NULL; } return PyEval_CallObject(func,parms); } swig-4.0.1/Lib/python/pytuplehlp.swg0000644000175000017500000000046413527063513017333 0ustar williamwilliam/* Helper function to return output types, now we need to use a list instead of a tuple since all the other types (std::pair,std::vector,std::list,etc) return tuples. */ #warning "Deprecated file: Don't use t_output_helper anymore," #warning "use SWIG_Python_AppendOutput or %append_output instead." swig-4.0.1/Lib/python/std_container.i0000644000175000017500000000007213527063513017404 0ustar williamwilliam%include %include swig-4.0.1/Lib/python/pyrun.swg0000644000175000017500000013307413527063513016306 0ustar williamwilliam/* ----------------------------------------------------------------------------- * pyrun.swg * * This file contains the runtime support for Python modules * and includes code for managing global variables and pointer * type checking. * * ----------------------------------------------------------------------------- */ #if PY_VERSION_HEX < 0x02070000 /* 2.7.0 */ # error "This version of SWIG only supports Python >= 2.7" #endif #if PY_VERSION_HEX >= 0x03000000 && PY_VERSION_HEX < 0x03020000 # error "This version of SWIG only supports Python 3 >= 3.2" #endif /* Common SWIG API */ /* for raw pointers */ #define SWIG_Python_ConvertPtr(obj, pptr, type, flags) SWIG_Python_ConvertPtrAndOwn(obj, pptr, type, flags, 0) #define SWIG_ConvertPtr(obj, pptr, type, flags) SWIG_Python_ConvertPtr(obj, pptr, type, flags) #define SWIG_ConvertPtrAndOwn(obj,pptr,type,flags,own) SWIG_Python_ConvertPtrAndOwn(obj, pptr, type, flags, own) #ifdef SWIGPYTHON_BUILTIN #define SWIG_NewPointerObj(ptr, type, flags) SWIG_Python_NewPointerObj(self, ptr, type, flags) #else #define SWIG_NewPointerObj(ptr, type, flags) SWIG_Python_NewPointerObj(NULL, ptr, type, flags) #endif #define SWIG_InternalNewPointerObj(ptr, type, flags) SWIG_Python_NewPointerObj(NULL, ptr, type, flags) #define SWIG_CheckImplicit(ty) SWIG_Python_CheckImplicit(ty) #define SWIG_AcquirePtr(ptr, src) SWIG_Python_AcquirePtr(ptr, src) #define swig_owntype int /* for raw packed data */ #define SWIG_ConvertPacked(obj, ptr, sz, ty) SWIG_Python_ConvertPacked(obj, ptr, sz, ty) #define SWIG_NewPackedObj(ptr, sz, type) SWIG_Python_NewPackedObj(ptr, sz, type) /* for class or struct pointers */ #define SWIG_ConvertInstance(obj, pptr, type, flags) SWIG_ConvertPtr(obj, pptr, type, flags) #define SWIG_NewInstanceObj(ptr, type, flags) SWIG_NewPointerObj(ptr, type, flags) /* for C or C++ function pointers */ #define SWIG_ConvertFunctionPtr(obj, pptr, type) SWIG_Python_ConvertFunctionPtr(obj, pptr, type) #define SWIG_NewFunctionPtrObj(ptr, type) SWIG_Python_NewPointerObj(NULL, ptr, type, 0) /* for C++ member pointers, ie, member methods */ #define SWIG_ConvertMember(obj, ptr, sz, ty) SWIG_Python_ConvertPacked(obj, ptr, sz, ty) #define SWIG_NewMemberObj(ptr, sz, type) SWIG_Python_NewPackedObj(ptr, sz, type) /* Runtime API */ #define SWIG_GetModule(clientdata) SWIG_Python_GetModule(clientdata) #define SWIG_SetModule(clientdata, pointer) SWIG_Python_SetModule(pointer) #define SWIG_NewClientData(obj) SwigPyClientData_New(obj) #define SWIG_SetErrorObj SWIG_Python_SetErrorObj #define SWIG_SetErrorMsg SWIG_Python_SetErrorMsg #define SWIG_ErrorType(code) SWIG_Python_ErrorType(code) #define SWIG_Error(code, msg) SWIG_Python_SetErrorMsg(SWIG_ErrorType(code), msg) #define SWIG_fail goto fail /* Runtime API implementation */ /* Error manipulation */ SWIGINTERN void SWIG_Python_SetErrorObj(PyObject *errtype, PyObject *obj) { SWIG_PYTHON_THREAD_BEGIN_BLOCK; PyErr_SetObject(errtype, obj); Py_DECREF(obj); SWIG_PYTHON_THREAD_END_BLOCK; } SWIGINTERN void SWIG_Python_SetErrorMsg(PyObject *errtype, const char *msg) { SWIG_PYTHON_THREAD_BEGIN_BLOCK; PyErr_SetString(errtype, msg); SWIG_PYTHON_THREAD_END_BLOCK; } #define SWIG_Python_Raise(obj, type, desc) SWIG_Python_SetErrorObj(SWIG_Python_ExceptionType(desc), obj) /* Set a constant value */ #if defined(SWIGPYTHON_BUILTIN) SWIGINTERN void SwigPyBuiltin_AddPublicSymbol(PyObject *seq, const char *key) { PyObject *s = PyString_InternFromString(key); PyList_Append(seq, s); Py_DECREF(s); } SWIGINTERN void SWIG_Python_SetConstant(PyObject *d, PyObject *public_interface, const char *name, PyObject *obj) { PyDict_SetItemString(d, name, obj); Py_DECREF(obj); if (public_interface) SwigPyBuiltin_AddPublicSymbol(public_interface, name); } #else SWIGINTERN void SWIG_Python_SetConstant(PyObject *d, const char *name, PyObject *obj) { PyDict_SetItemString(d, name, obj); Py_DECREF(obj); } #endif /* Append a value to the result obj */ SWIGINTERN PyObject* SWIG_Python_AppendOutput(PyObject* result, PyObject* obj) { if (!result) { result = obj; } else if (result == Py_None) { Py_DECREF(result); result = obj; } else { if (!PyList_Check(result)) { PyObject *o2 = result; result = PyList_New(1); PyList_SetItem(result, 0, o2); } PyList_Append(result,obj); Py_DECREF(obj); } return result; } /* Unpack the argument tuple */ SWIGINTERN Py_ssize_t SWIG_Python_UnpackTuple(PyObject *args, const char *name, Py_ssize_t min, Py_ssize_t max, PyObject **objs) { if (!args) { if (!min && !max) { return 1; } else { PyErr_Format(PyExc_TypeError, "%s expected %s%d arguments, got none", name, (min == max ? "" : "at least "), (int)min); return 0; } } if (!PyTuple_Check(args)) { if (min <= 1 && max >= 1) { Py_ssize_t i; objs[0] = args; for (i = 1; i < max; ++i) { objs[i] = 0; } return 2; } PyErr_SetString(PyExc_SystemError, "UnpackTuple() argument list is not a tuple"); return 0; } else { Py_ssize_t l = PyTuple_GET_SIZE(args); if (l < min) { PyErr_Format(PyExc_TypeError, "%s expected %s%d arguments, got %d", name, (min == max ? "" : "at least "), (int)min, (int)l); return 0; } else if (l > max) { PyErr_Format(PyExc_TypeError, "%s expected %s%d arguments, got %d", name, (min == max ? "" : "at most "), (int)max, (int)l); return 0; } else { Py_ssize_t i; for (i = 0; i < l; ++i) { objs[i] = PyTuple_GET_ITEM(args, i); } for (; l < max; ++l) { objs[l] = 0; } return i + 1; } } } /* A functor is a function object with one single object argument */ #define SWIG_Python_CallFunctor(functor, obj) PyObject_CallFunctionObjArgs(functor, obj, NULL); /* Helper for static pointer initialization for both C and C++ code, for example static PyObject *SWIG_STATIC_POINTER(MyVar) = NewSomething(...); */ #ifdef __cplusplus #define SWIG_STATIC_POINTER(var) var #else #define SWIG_STATIC_POINTER(var) var = 0; if (!var) var #endif /* ----------------------------------------------------------------------------- * Pointer declarations * ----------------------------------------------------------------------------- */ /* Flags for new pointer objects */ #define SWIG_POINTER_NOSHADOW (SWIG_POINTER_OWN << 1) #define SWIG_POINTER_NEW (SWIG_POINTER_NOSHADOW | SWIG_POINTER_OWN) #define SWIG_POINTER_IMPLICIT_CONV (SWIG_POINTER_DISOWN << 1) #define SWIG_BUILTIN_TP_INIT (SWIG_POINTER_OWN << 2) #define SWIG_BUILTIN_INIT (SWIG_BUILTIN_TP_INIT | SWIG_POINTER_OWN) #ifdef __cplusplus extern "C" { #endif /* The python void return value */ SWIGRUNTIMEINLINE PyObject * SWIG_Py_Void(void) { PyObject *none = Py_None; Py_INCREF(none); return none; } /* SwigPyClientData */ typedef struct { PyObject *klass; PyObject *newraw; PyObject *newargs; PyObject *destroy; int delargs; int implicitconv; PyTypeObject *pytype; } SwigPyClientData; SWIGRUNTIMEINLINE int SWIG_Python_CheckImplicit(swig_type_info *ty) { SwigPyClientData *data = (SwigPyClientData *)ty->clientdata; int fail = data ? data->implicitconv : 0; if (fail) PyErr_SetString(PyExc_TypeError, "Implicit conversion is prohibited for explicit constructors."); return fail; } SWIGRUNTIMEINLINE PyObject * SWIG_Python_ExceptionType(swig_type_info *desc) { SwigPyClientData *data = desc ? (SwigPyClientData *) desc->clientdata : 0; PyObject *klass = data ? data->klass : 0; return (klass ? klass : PyExc_RuntimeError); } SWIGRUNTIME SwigPyClientData * SwigPyClientData_New(PyObject* obj) { if (!obj) { return 0; } else { SwigPyClientData *data = (SwigPyClientData *)malloc(sizeof(SwigPyClientData)); /* the klass element */ data->klass = obj; Py_INCREF(data->klass); /* the newraw method and newargs arguments used to create a new raw instance */ if (PyClass_Check(obj)) { data->newraw = 0; data->newargs = obj; Py_INCREF(obj); } else { data->newraw = PyObject_GetAttrString(data->klass, "__new__"); if (data->newraw) { Py_INCREF(data->newraw); data->newargs = PyTuple_New(1); PyTuple_SetItem(data->newargs, 0, obj); } else { data->newargs = obj; } Py_INCREF(data->newargs); } /* the destroy method, aka as the C++ delete method */ data->destroy = PyObject_GetAttrString(data->klass, "__swig_destroy__"); if (PyErr_Occurred()) { PyErr_Clear(); data->destroy = 0; } if (data->destroy) { int flags; Py_INCREF(data->destroy); flags = PyCFunction_GET_FLAGS(data->destroy); data->delargs = !(flags & (METH_O)); } else { data->delargs = 0; } data->implicitconv = 0; data->pytype = 0; return data; } } SWIGRUNTIME void SwigPyClientData_Del(SwigPyClientData *data) { Py_XDECREF(data->newraw); Py_XDECREF(data->newargs); Py_XDECREF(data->destroy); } /* =============== SwigPyObject =====================*/ typedef struct { PyObject_HEAD void *ptr; swig_type_info *ty; int own; PyObject *next; #ifdef SWIGPYTHON_BUILTIN PyObject *dict; #endif } SwigPyObject; #ifdef SWIGPYTHON_BUILTIN SWIGRUNTIME PyObject * SwigPyObject_get___dict__(PyObject *v, PyObject *SWIGUNUSEDPARM(args)) { SwigPyObject *sobj = (SwigPyObject *)v; if (!sobj->dict) sobj->dict = PyDict_New(); Py_INCREF(sobj->dict); return sobj->dict; } #endif SWIGRUNTIME PyObject * SwigPyObject_long(SwigPyObject *v) { return PyLong_FromVoidPtr(v->ptr); } SWIGRUNTIME PyObject * SwigPyObject_format(const char* fmt, SwigPyObject *v) { PyObject *res = NULL; PyObject *args = PyTuple_New(1); if (args) { if (PyTuple_SetItem(args, 0, SwigPyObject_long(v)) == 0) { PyObject *ofmt = SWIG_Python_str_FromChar(fmt); if (ofmt) { #if PY_VERSION_HEX >= 0x03000000 res = PyUnicode_Format(ofmt,args); #else res = PyString_Format(ofmt,args); #endif Py_DECREF(ofmt); } Py_DECREF(args); } } return res; } SWIGRUNTIME PyObject * SwigPyObject_oct(SwigPyObject *v) { return SwigPyObject_format("%o",v); } SWIGRUNTIME PyObject * SwigPyObject_hex(SwigPyObject *v) { return SwigPyObject_format("%x",v); } SWIGRUNTIME PyObject * SwigPyObject_repr(SwigPyObject *v) { const char *name = SWIG_TypePrettyName(v->ty); PyObject *repr = SWIG_Python_str_FromFormat("", (name ? name : "unknown"), (void *)v); if (v->next) { PyObject *nrep = SwigPyObject_repr((SwigPyObject *)v->next); # if PY_VERSION_HEX >= 0x03000000 PyObject *joined = PyUnicode_Concat(repr, nrep); Py_DecRef(repr); Py_DecRef(nrep); repr = joined; # else PyString_ConcatAndDel(&repr,nrep); # endif } return repr; } /* We need a version taking two PyObject* parameters so it's a valid * PyCFunction to use in swigobject_methods[]. */ SWIGRUNTIME PyObject * SwigPyObject_repr2(PyObject *v, PyObject *SWIGUNUSEDPARM(args)) { return SwigPyObject_repr((SwigPyObject*)v); } SWIGRUNTIME int SwigPyObject_compare(SwigPyObject *v, SwigPyObject *w) { void *i = v->ptr; void *j = w->ptr; return (i < j) ? -1 : ((i > j) ? 1 : 0); } /* Added for Python 3.x, would it also be useful for Python 2.x? */ SWIGRUNTIME PyObject* SwigPyObject_richcompare(SwigPyObject *v, SwigPyObject *w, int op) { PyObject* res; if( op != Py_EQ && op != Py_NE ) { Py_INCREF(Py_NotImplemented); return Py_NotImplemented; } res = PyBool_FromLong( (SwigPyObject_compare(v, w)==0) == (op == Py_EQ) ? 1 : 0); return res; } SWIGRUNTIME PyTypeObject* SwigPyObject_TypeOnce(void); #ifdef SWIGPYTHON_BUILTIN static swig_type_info *SwigPyObject_stype = 0; SWIGRUNTIME PyTypeObject* SwigPyObject_type(void) { SwigPyClientData *cd; assert(SwigPyObject_stype); cd = (SwigPyClientData*) SwigPyObject_stype->clientdata; assert(cd); assert(cd->pytype); return cd->pytype; } #else SWIGRUNTIME PyTypeObject* SwigPyObject_type(void) { static PyTypeObject *SWIG_STATIC_POINTER(type) = SwigPyObject_TypeOnce(); return type; } #endif SWIGRUNTIMEINLINE int SwigPyObject_Check(PyObject *op) { #ifdef SWIGPYTHON_BUILTIN PyTypeObject *target_tp = SwigPyObject_type(); if (PyType_IsSubtype(op->ob_type, target_tp)) return 1; return (strcmp(op->ob_type->tp_name, "SwigPyObject") == 0); #else return (Py_TYPE(op) == SwigPyObject_type()) || (strcmp(Py_TYPE(op)->tp_name,"SwigPyObject") == 0); #endif } SWIGRUNTIME PyObject * SwigPyObject_New(void *ptr, swig_type_info *ty, int own); SWIGRUNTIME void SwigPyObject_dealloc(PyObject *v) { SwigPyObject *sobj = (SwigPyObject *) v; PyObject *next = sobj->next; if (sobj->own == SWIG_POINTER_OWN) { swig_type_info *ty = sobj->ty; SwigPyClientData *data = ty ? (SwigPyClientData *) ty->clientdata : 0; PyObject *destroy = data ? data->destroy : 0; if (destroy) { /* destroy is always a VARARGS method */ PyObject *res; /* PyObject_CallFunction() has the potential to silently drop the active exception. In cases of unnamed temporary variable or where we just finished iterating over a generator StopIteration will be active right now, and this needs to remain true upon return from SwigPyObject_dealloc. So save and restore. */ PyObject *type = NULL, *value = NULL, *traceback = NULL; PyErr_Fetch(&type, &value, &traceback); if (data->delargs) { /* we need to create a temporary object to carry the destroy operation */ PyObject *tmp = SwigPyObject_New(sobj->ptr, ty, 0); res = SWIG_Python_CallFunctor(destroy, tmp); Py_DECREF(tmp); } else { PyCFunction meth = PyCFunction_GET_FUNCTION(destroy); PyObject *mself = PyCFunction_GET_SELF(destroy); res = ((*meth)(mself, v)); } if (!res) PyErr_WriteUnraisable(destroy); PyErr_Restore(type, value, traceback); Py_XDECREF(res); } #if !defined(SWIG_PYTHON_SILENT_MEMLEAK) else { const char *name = SWIG_TypePrettyName(ty); printf("swig/python detected a memory leak of type '%s', no destructor found.\n", (name ? name : "unknown")); } #endif } Py_XDECREF(next); PyObject_DEL(v); } SWIGRUNTIME PyObject* SwigPyObject_append(PyObject* v, PyObject* next) { SwigPyObject *sobj = (SwigPyObject *) v; if (!SwigPyObject_Check(next)) { PyErr_SetString(PyExc_TypeError, "Attempt to append a non SwigPyObject"); return NULL; } sobj->next = next; Py_INCREF(next); return SWIG_Py_Void(); } SWIGRUNTIME PyObject* SwigPyObject_next(PyObject* v, PyObject *SWIGUNUSEDPARM(args)) { SwigPyObject *sobj = (SwigPyObject *) v; if (sobj->next) { Py_INCREF(sobj->next); return sobj->next; } else { return SWIG_Py_Void(); } } SWIGINTERN PyObject* SwigPyObject_disown(PyObject* v, PyObject *SWIGUNUSEDPARM(args)) { SwigPyObject *sobj = (SwigPyObject *)v; sobj->own = 0; return SWIG_Py_Void(); } SWIGINTERN PyObject* SwigPyObject_acquire(PyObject* v, PyObject *SWIGUNUSEDPARM(args)) { SwigPyObject *sobj = (SwigPyObject *)v; sobj->own = SWIG_POINTER_OWN; return SWIG_Py_Void(); } SWIGINTERN PyObject* SwigPyObject_own(PyObject *v, PyObject *args) { PyObject *val = 0; if (!PyArg_UnpackTuple(args, "own", 0, 1, &val)) { return NULL; } else { SwigPyObject *sobj = (SwigPyObject *)v; PyObject *obj = PyBool_FromLong(sobj->own); if (val) { if (PyObject_IsTrue(val)) { SwigPyObject_acquire(v,args); } else { SwigPyObject_disown(v,args); } } return obj; } } static PyMethodDef swigobject_methods[] = { {"disown", SwigPyObject_disown, METH_NOARGS, "releases ownership of the pointer"}, {"acquire", SwigPyObject_acquire, METH_NOARGS, "acquires ownership of the pointer"}, {"own", SwigPyObject_own, METH_VARARGS, "returns/sets ownership of the pointer"}, {"append", SwigPyObject_append, METH_O, "appends another 'this' object"}, {"next", SwigPyObject_next, METH_NOARGS, "returns the next 'this' object"}, {"__repr__",SwigPyObject_repr2, METH_NOARGS, "returns object representation"}, {0, 0, 0, 0} }; SWIGRUNTIME PyTypeObject* SwigPyObject_TypeOnce(void) { static char swigobject_doc[] = "Swig object carries a C/C++ instance pointer"; static PyNumberMethods SwigPyObject_as_number = { (binaryfunc)0, /*nb_add*/ (binaryfunc)0, /*nb_subtract*/ (binaryfunc)0, /*nb_multiply*/ /* nb_divide removed in Python 3 */ #if PY_VERSION_HEX < 0x03000000 (binaryfunc)0, /*nb_divide*/ #endif (binaryfunc)0, /*nb_remainder*/ (binaryfunc)0, /*nb_divmod*/ (ternaryfunc)0,/*nb_power*/ (unaryfunc)0, /*nb_negative*/ (unaryfunc)0, /*nb_positive*/ (unaryfunc)0, /*nb_absolute*/ (inquiry)0, /*nb_nonzero*/ 0, /*nb_invert*/ 0, /*nb_lshift*/ 0, /*nb_rshift*/ 0, /*nb_and*/ 0, /*nb_xor*/ 0, /*nb_or*/ #if PY_VERSION_HEX < 0x03000000 0, /*nb_coerce*/ #endif (unaryfunc)SwigPyObject_long, /*nb_int*/ #if PY_VERSION_HEX < 0x03000000 (unaryfunc)SwigPyObject_long, /*nb_long*/ #else 0, /*nb_reserved*/ #endif (unaryfunc)0, /*nb_float*/ #if PY_VERSION_HEX < 0x03000000 (unaryfunc)SwigPyObject_oct, /*nb_oct*/ (unaryfunc)SwigPyObject_hex, /*nb_hex*/ #endif #if PY_VERSION_HEX >= 0x03050000 /* 3.5 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 /* nb_inplace_add -> nb_inplace_matrix_multiply */ #elif PY_VERSION_HEX >= 0x03000000 /* 3.0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 /* nb_inplace_add -> nb_index, nb_inplace_divide removed */ #else 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 /* nb_inplace_add -> nb_index */ #endif }; static PyTypeObject swigpyobject_type; static int type_init = 0; if (!type_init) { const PyTypeObject tmp = { #if PY_VERSION_HEX >= 0x03000000 PyVarObject_HEAD_INIT(NULL, 0) #else PyObject_HEAD_INIT(NULL) 0, /* ob_size */ #endif "SwigPyObject", /* tp_name */ sizeof(SwigPyObject), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor)SwigPyObject_dealloc, /* tp_dealloc */ 0, /* tp_print */ (getattrfunc)0, /* tp_getattr */ (setattrfunc)0, /* tp_setattr */ #if PY_VERSION_HEX >= 0x03000000 0, /* tp_reserved in 3.0.1, tp_compare in 3.0.0 but not used */ #else (cmpfunc)SwigPyObject_compare, /* tp_compare */ #endif (reprfunc)SwigPyObject_repr, /* tp_repr */ &SwigPyObject_as_number, /* tp_as_number */ 0, /* tp_as_sequence */ 0, /* tp_as_mapping */ (hashfunc)0, /* tp_hash */ (ternaryfunc)0, /* tp_call */ 0, /* tp_str */ PyObject_GenericGetAttr, /* tp_getattro */ 0, /* tp_setattro */ 0, /* tp_as_buffer */ Py_TPFLAGS_DEFAULT, /* tp_flags */ swigobject_doc, /* tp_doc */ 0, /* tp_traverse */ 0, /* tp_clear */ (richcmpfunc)SwigPyObject_richcompare,/* tp_richcompare */ 0, /* tp_weaklistoffset */ 0, /* tp_iter */ 0, /* tp_iternext */ swigobject_methods, /* tp_methods */ 0, /* tp_members */ 0, /* tp_getset */ 0, /* tp_base */ 0, /* tp_dict */ 0, /* tp_descr_get */ 0, /* tp_descr_set */ 0, /* tp_dictoffset */ 0, /* tp_init */ 0, /* tp_alloc */ 0, /* tp_new */ 0, /* tp_free */ 0, /* tp_is_gc */ 0, /* tp_bases */ 0, /* tp_mro */ 0, /* tp_cache */ 0, /* tp_subclasses */ 0, /* tp_weaklist */ 0, /* tp_del */ 0, /* tp_version_tag */ #if PY_VERSION_HEX >= 0x03040000 0, /* tp_finalize */ #endif #ifdef COUNT_ALLOCS 0, /* tp_allocs */ 0, /* tp_frees */ 0, /* tp_maxalloc */ 0, /* tp_prev */ 0 /* tp_next */ #endif }; swigpyobject_type = tmp; type_init = 1; if (PyType_Ready(&swigpyobject_type) < 0) return NULL; } return &swigpyobject_type; } SWIGRUNTIME PyObject * SwigPyObject_New(void *ptr, swig_type_info *ty, int own) { SwigPyObject *sobj = PyObject_NEW(SwigPyObject, SwigPyObject_type()); if (sobj) { sobj->ptr = ptr; sobj->ty = ty; sobj->own = own; sobj->next = 0; } return (PyObject *)sobj; } /* ----------------------------------------------------------------------------- * Implements a simple Swig Packed type, and use it instead of string * ----------------------------------------------------------------------------- */ typedef struct { PyObject_HEAD void *pack; swig_type_info *ty; size_t size; } SwigPyPacked; SWIGRUNTIME PyObject * SwigPyPacked_repr(SwigPyPacked *v) { char result[SWIG_BUFFER_SIZE]; if (SWIG_PackDataName(result, v->pack, v->size, 0, sizeof(result))) { return SWIG_Python_str_FromFormat("", result, v->ty->name); } else { return SWIG_Python_str_FromFormat("", v->ty->name); } } SWIGRUNTIME PyObject * SwigPyPacked_str(SwigPyPacked *v) { char result[SWIG_BUFFER_SIZE]; if (SWIG_PackDataName(result, v->pack, v->size, 0, sizeof(result))){ return SWIG_Python_str_FromFormat("%s%s", result, v->ty->name); } else { return SWIG_Python_str_FromChar(v->ty->name); } } SWIGRUNTIME int SwigPyPacked_compare(SwigPyPacked *v, SwigPyPacked *w) { size_t i = v->size; size_t j = w->size; int s = (i < j) ? -1 : ((i > j) ? 1 : 0); return s ? s : strncmp((const char *)v->pack, (const char *)w->pack, 2*v->size); } SWIGRUNTIME PyTypeObject* SwigPyPacked_TypeOnce(void); SWIGRUNTIME PyTypeObject* SwigPyPacked_type(void) { static PyTypeObject *SWIG_STATIC_POINTER(type) = SwigPyPacked_TypeOnce(); return type; } SWIGRUNTIMEINLINE int SwigPyPacked_Check(PyObject *op) { return ((op)->ob_type == SwigPyPacked_TypeOnce()) || (strcmp((op)->ob_type->tp_name,"SwigPyPacked") == 0); } SWIGRUNTIME void SwigPyPacked_dealloc(PyObject *v) { if (SwigPyPacked_Check(v)) { SwigPyPacked *sobj = (SwigPyPacked *) v; free(sobj->pack); } PyObject_DEL(v); } SWIGRUNTIME PyTypeObject* SwigPyPacked_TypeOnce(void) { static char swigpacked_doc[] = "Swig object carries a C/C++ instance pointer"; static PyTypeObject swigpypacked_type; static int type_init = 0; if (!type_init) { const PyTypeObject tmp = { #if PY_VERSION_HEX>=0x03000000 PyVarObject_HEAD_INIT(NULL, 0) #else PyObject_HEAD_INIT(NULL) 0, /* ob_size */ #endif "SwigPyPacked", /* tp_name */ sizeof(SwigPyPacked), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor)SwigPyPacked_dealloc, /* tp_dealloc */ 0, /* tp_print */ (getattrfunc)0, /* tp_getattr */ (setattrfunc)0, /* tp_setattr */ #if PY_VERSION_HEX>=0x03000000 0, /* tp_reserved in 3.0.1 */ #else (cmpfunc)SwigPyPacked_compare, /* tp_compare */ #endif (reprfunc)SwigPyPacked_repr, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ 0, /* tp_as_mapping */ (hashfunc)0, /* tp_hash */ (ternaryfunc)0, /* tp_call */ (reprfunc)SwigPyPacked_str, /* tp_str */ PyObject_GenericGetAttr, /* tp_getattro */ 0, /* tp_setattro */ 0, /* tp_as_buffer */ Py_TPFLAGS_DEFAULT, /* tp_flags */ swigpacked_doc, /* tp_doc */ 0, /* tp_traverse */ 0, /* tp_clear */ 0, /* tp_richcompare */ 0, /* tp_weaklistoffset */ 0, /* tp_iter */ 0, /* tp_iternext */ 0, /* tp_methods */ 0, /* tp_members */ 0, /* tp_getset */ 0, /* tp_base */ 0, /* tp_dict */ 0, /* tp_descr_get */ 0, /* tp_descr_set */ 0, /* tp_dictoffset */ 0, /* tp_init */ 0, /* tp_alloc */ 0, /* tp_new */ 0, /* tp_free */ 0, /* tp_is_gc */ 0, /* tp_bases */ 0, /* tp_mro */ 0, /* tp_cache */ 0, /* tp_subclasses */ 0, /* tp_weaklist */ 0, /* tp_del */ 0, /* tp_version_tag */ #if PY_VERSION_HEX >= 0x03040000 0, /* tp_finalize */ #endif #ifdef COUNT_ALLOCS 0, /* tp_allocs */ 0, /* tp_frees */ 0, /* tp_maxalloc */ 0, /* tp_prev */ 0 /* tp_next */ #endif }; swigpypacked_type = tmp; type_init = 1; if (PyType_Ready(&swigpypacked_type) < 0) return NULL; } return &swigpypacked_type; } SWIGRUNTIME PyObject * SwigPyPacked_New(void *ptr, size_t size, swig_type_info *ty) { SwigPyPacked *sobj = PyObject_NEW(SwigPyPacked, SwigPyPacked_type()); if (sobj) { void *pack = malloc(size); if (pack) { memcpy(pack, ptr, size); sobj->pack = pack; sobj->ty = ty; sobj->size = size; } else { PyObject_DEL((PyObject *) sobj); sobj = 0; } } return (PyObject *) sobj; } SWIGRUNTIME swig_type_info * SwigPyPacked_UnpackData(PyObject *obj, void *ptr, size_t size) { if (SwigPyPacked_Check(obj)) { SwigPyPacked *sobj = (SwigPyPacked *)obj; if (sobj->size != size) return 0; memcpy(ptr, sobj->pack, size); return sobj->ty; } else { return 0; } } /* ----------------------------------------------------------------------------- * pointers/data manipulation * ----------------------------------------------------------------------------- */ static PyObject *Swig_This_global = NULL; SWIGRUNTIME PyObject * SWIG_This(void) { if (Swig_This_global == NULL) Swig_This_global = SWIG_Python_str_FromChar("this"); return Swig_This_global; } /* #define SWIG_PYTHON_SLOW_GETSET_THIS */ /* TODO: I don't know how to implement the fast getset in Python 3 right now */ #if PY_VERSION_HEX>=0x03000000 #define SWIG_PYTHON_SLOW_GETSET_THIS #endif SWIGRUNTIME SwigPyObject * SWIG_Python_GetSwigThis(PyObject *pyobj) { PyObject *obj; if (SwigPyObject_Check(pyobj)) return (SwigPyObject *) pyobj; #ifdef SWIGPYTHON_BUILTIN (void)obj; # ifdef PyWeakref_CheckProxy if (PyWeakref_CheckProxy(pyobj)) { pyobj = PyWeakref_GET_OBJECT(pyobj); if (pyobj && SwigPyObject_Check(pyobj)) return (SwigPyObject*) pyobj; } # endif return NULL; #else obj = 0; #if !defined(SWIG_PYTHON_SLOW_GETSET_THIS) if (PyInstance_Check(pyobj)) { obj = _PyInstance_Lookup(pyobj, SWIG_This()); } else { PyObject **dictptr = _PyObject_GetDictPtr(pyobj); if (dictptr != NULL) { PyObject *dict = *dictptr; obj = dict ? PyDict_GetItem(dict, SWIG_This()) : 0; } else { #ifdef PyWeakref_CheckProxy if (PyWeakref_CheckProxy(pyobj)) { PyObject *wobj = PyWeakref_GET_OBJECT(pyobj); return wobj ? SWIG_Python_GetSwigThis(wobj) : 0; } #endif obj = PyObject_GetAttr(pyobj,SWIG_This()); if (obj) { Py_DECREF(obj); } else { if (PyErr_Occurred()) PyErr_Clear(); return 0; } } } #else obj = PyObject_GetAttr(pyobj,SWIG_This()); if (obj) { Py_DECREF(obj); } else { if (PyErr_Occurred()) PyErr_Clear(); return 0; } #endif if (obj && !SwigPyObject_Check(obj)) { /* a PyObject is called 'this', try to get the 'real this' SwigPyObject from it */ return SWIG_Python_GetSwigThis(obj); } return (SwigPyObject *)obj; #endif } /* Acquire a pointer value */ SWIGRUNTIME int SWIG_Python_AcquirePtr(PyObject *obj, int own) { if (own == SWIG_POINTER_OWN) { SwigPyObject *sobj = SWIG_Python_GetSwigThis(obj); if (sobj) { int oldown = sobj->own; sobj->own = own; return oldown; } } return 0; } /* Convert a pointer value */ SWIGRUNTIME int SWIG_Python_ConvertPtrAndOwn(PyObject *obj, void **ptr, swig_type_info *ty, int flags, int *own) { int res; SwigPyObject *sobj; int implicit_conv = (flags & SWIG_POINTER_IMPLICIT_CONV) != 0; if (!obj) return SWIG_ERROR; if (obj == Py_None && !implicit_conv) { if (ptr) *ptr = 0; return (flags & SWIG_POINTER_NO_NULL) ? SWIG_NullReferenceError : SWIG_OK; } res = SWIG_ERROR; sobj = SWIG_Python_GetSwigThis(obj); if (own) *own = 0; while (sobj) { void *vptr = sobj->ptr; if (ty) { swig_type_info *to = sobj->ty; if (to == ty) { /* no type cast needed */ if (ptr) *ptr = vptr; break; } else { swig_cast_info *tc = SWIG_TypeCheck(to->name,ty); if (!tc) { sobj = (SwigPyObject *)sobj->next; } else { if (ptr) { int newmemory = 0; *ptr = SWIG_TypeCast(tc,vptr,&newmemory); if (newmemory == SWIG_CAST_NEW_MEMORY) { assert(own); /* badly formed typemap which will lead to a memory leak - it must set and use own to delete *ptr */ if (own) *own = *own | SWIG_CAST_NEW_MEMORY; } } break; } } } else { if (ptr) *ptr = vptr; break; } } if (sobj) { if (own) *own = *own | sobj->own; if (flags & SWIG_POINTER_DISOWN) { sobj->own = 0; } res = SWIG_OK; } else { if (implicit_conv) { SwigPyClientData *data = ty ? (SwigPyClientData *) ty->clientdata : 0; if (data && !data->implicitconv) { PyObject *klass = data->klass; if (klass) { PyObject *impconv; data->implicitconv = 1; /* avoid recursion and call 'explicit' constructors*/ impconv = SWIG_Python_CallFunctor(klass, obj); data->implicitconv = 0; if (PyErr_Occurred()) { PyErr_Clear(); impconv = 0; } if (impconv) { SwigPyObject *iobj = SWIG_Python_GetSwigThis(impconv); if (iobj) { void *vptr; res = SWIG_Python_ConvertPtrAndOwn((PyObject*)iobj, &vptr, ty, 0, 0); if (SWIG_IsOK(res)) { if (ptr) { *ptr = vptr; /* transfer the ownership to 'ptr' */ iobj->own = 0; res = SWIG_AddCast(res); res = SWIG_AddNewMask(res); } else { res = SWIG_AddCast(res); } } } Py_DECREF(impconv); } } } if (!SWIG_IsOK(res) && obj == Py_None) { if (ptr) *ptr = 0; if (PyErr_Occurred()) PyErr_Clear(); res = SWIG_OK; } } } return res; } /* Convert a function ptr value */ SWIGRUNTIME int SWIG_Python_ConvertFunctionPtr(PyObject *obj, void **ptr, swig_type_info *ty) { if (!PyCFunction_Check(obj)) { return SWIG_ConvertPtr(obj, ptr, ty, 0); } else { void *vptr = 0; swig_cast_info *tc; /* here we get the method pointer for callbacks */ const char *doc = (((PyCFunctionObject *)obj) -> m_ml -> ml_doc); const char *desc = doc ? strstr(doc, "swig_ptr: ") : 0; if (desc) desc = ty ? SWIG_UnpackVoidPtr(desc + 10, &vptr, ty->name) : 0; if (!desc) return SWIG_ERROR; tc = SWIG_TypeCheck(desc,ty); if (tc) { int newmemory = 0; *ptr = SWIG_TypeCast(tc,vptr,&newmemory); assert(!newmemory); /* newmemory handling not yet implemented */ } else { return SWIG_ERROR; } return SWIG_OK; } } /* Convert a packed pointer value */ SWIGRUNTIME int SWIG_Python_ConvertPacked(PyObject *obj, void *ptr, size_t sz, swig_type_info *ty) { swig_type_info *to = SwigPyPacked_UnpackData(obj, ptr, sz); if (!to) return SWIG_ERROR; if (ty) { if (to != ty) { /* check type cast? */ swig_cast_info *tc = SWIG_TypeCheck(to->name,ty); if (!tc) return SWIG_ERROR; } } return SWIG_OK; } /* ----------------------------------------------------------------------------- * Create a new pointer object * ----------------------------------------------------------------------------- */ /* Create a new instance object, without calling __init__, and set the 'this' attribute. */ SWIGRUNTIME PyObject* SWIG_Python_NewShadowInstance(SwigPyClientData *data, PyObject *swig_this) { PyObject *inst = 0; PyObject *newraw = data->newraw; if (newraw) { inst = PyObject_Call(newraw, data->newargs, NULL); if (inst) { #if !defined(SWIG_PYTHON_SLOW_GETSET_THIS) PyObject **dictptr = _PyObject_GetDictPtr(inst); if (dictptr != NULL) { PyObject *dict = *dictptr; if (dict == NULL) { dict = PyDict_New(); *dictptr = dict; PyDict_SetItem(dict, SWIG_This(), swig_this); } } #else PyObject *key = SWIG_This(); PyObject_SetAttr(inst, key, swig_this); #endif } } else { #if PY_VERSION_HEX >= 0x03000000 PyObject *empty_args = PyTuple_New(0); if (empty_args) { PyObject *empty_kwargs = PyDict_New(); if (empty_kwargs) { inst = ((PyTypeObject *)data->newargs)->tp_new((PyTypeObject *)data->newargs, empty_args, empty_kwargs); Py_DECREF(empty_kwargs); if (inst) { PyObject_SetAttr(inst, SWIG_This(), swig_this); Py_TYPE(inst)->tp_flags &= ~Py_TPFLAGS_VALID_VERSION_TAG; } } Py_DECREF(empty_args); } #else PyObject *dict = PyDict_New(); if (dict) { PyDict_SetItem(dict, SWIG_This(), swig_this); inst = PyInstance_NewRaw(data->newargs, dict); Py_DECREF(dict); } #endif } return inst; } SWIGRUNTIME void SWIG_Python_SetSwigThis(PyObject *inst, PyObject *swig_this) { PyObject *dict; #if !defined(SWIG_PYTHON_SLOW_GETSET_THIS) PyObject **dictptr = _PyObject_GetDictPtr(inst); if (dictptr != NULL) { dict = *dictptr; if (dict == NULL) { dict = PyDict_New(); *dictptr = dict; } PyDict_SetItem(dict, SWIG_This(), swig_this); return; } #endif dict = PyObject_GetAttrString(inst, "__dict__"); PyDict_SetItem(dict, SWIG_This(), swig_this); Py_DECREF(dict); } SWIGINTERN PyObject * SWIG_Python_InitShadowInstance(PyObject *args) { PyObject *obj[2]; if (!SWIG_Python_UnpackTuple(args, "swiginit", 2, 2, obj)) { return NULL; } else { SwigPyObject *sthis = SWIG_Python_GetSwigThis(obj[0]); if (sthis) { SwigPyObject_append((PyObject*) sthis, obj[1]); } else { SWIG_Python_SetSwigThis(obj[0], obj[1]); } return SWIG_Py_Void(); } } /* Create a new pointer object */ SWIGRUNTIME PyObject * SWIG_Python_NewPointerObj(PyObject *self, void *ptr, swig_type_info *type, int flags) { SwigPyClientData *clientdata; PyObject * robj; int own; if (!ptr) return SWIG_Py_Void(); clientdata = type ? (SwigPyClientData *)(type->clientdata) : 0; own = (flags & SWIG_POINTER_OWN) ? SWIG_POINTER_OWN : 0; if (clientdata && clientdata->pytype) { SwigPyObject *newobj; if (flags & SWIG_BUILTIN_TP_INIT) { newobj = (SwigPyObject*) self; if (newobj->ptr) { PyObject *next_self = clientdata->pytype->tp_alloc(clientdata->pytype, 0); while (newobj->next) newobj = (SwigPyObject *) newobj->next; newobj->next = next_self; newobj = (SwigPyObject *)next_self; #ifdef SWIGPYTHON_BUILTIN newobj->dict = 0; #endif } } else { newobj = PyObject_New(SwigPyObject, clientdata->pytype); #ifdef SWIGPYTHON_BUILTIN newobj->dict = 0; #endif } if (newobj) { newobj->ptr = ptr; newobj->ty = type; newobj->own = own; newobj->next = 0; return (PyObject*) newobj; } return SWIG_Py_Void(); } assert(!(flags & SWIG_BUILTIN_TP_INIT)); robj = SwigPyObject_New(ptr, type, own); if (robj && clientdata && !(flags & SWIG_POINTER_NOSHADOW)) { PyObject *inst = SWIG_Python_NewShadowInstance(clientdata, robj); Py_DECREF(robj); robj = inst; } return robj; } /* Create a new packed object */ SWIGRUNTIMEINLINE PyObject * SWIG_Python_NewPackedObj(void *ptr, size_t sz, swig_type_info *type) { return ptr ? SwigPyPacked_New((void *) ptr, sz, type) : SWIG_Py_Void(); } /* -----------------------------------------------------------------------------* * Get type list * -----------------------------------------------------------------------------*/ #ifdef SWIG_LINK_RUNTIME void *SWIG_ReturnGlobalTypeList(void *); #endif SWIGRUNTIME swig_module_info * SWIG_Python_GetModule(void *SWIGUNUSEDPARM(clientdata)) { static void *type_pointer = (void *)0; /* first check if module already created */ if (!type_pointer) { #ifdef SWIG_LINK_RUNTIME type_pointer = SWIG_ReturnGlobalTypeList((void *)0); #else type_pointer = PyCapsule_Import(SWIGPY_CAPSULE_NAME, 0); if (PyErr_Occurred()) { PyErr_Clear(); type_pointer = (void *)0; } #endif } return (swig_module_info *) type_pointer; } SWIGRUNTIME void SWIG_Python_DestroyModule(PyObject *obj) { swig_module_info *swig_module = (swig_module_info *) PyCapsule_GetPointer(obj, SWIGPY_CAPSULE_NAME); swig_type_info **types = swig_module->types; size_t i; for (i =0; i < swig_module->size; ++i) { swig_type_info *ty = types[i]; if (ty->owndata) { SwigPyClientData *data = (SwigPyClientData *) ty->clientdata; if (data) SwigPyClientData_Del(data); } } Py_DECREF(SWIG_This()); Swig_This_global = NULL; } SWIGRUNTIME void SWIG_Python_SetModule(swig_module_info *swig_module) { #if PY_VERSION_HEX >= 0x03000000 /* Add a dummy module object into sys.modules */ PyObject *module = PyImport_AddModule("swig_runtime_data" SWIG_RUNTIME_VERSION); #else static PyMethodDef swig_empty_runtime_method_table[] = { {NULL, NULL, 0, NULL} }; /* Sentinel */ PyObject *module = Py_InitModule("swig_runtime_data" SWIG_RUNTIME_VERSION, swig_empty_runtime_method_table); #endif PyObject *pointer = PyCapsule_New((void *) swig_module, SWIGPY_CAPSULE_NAME, SWIG_Python_DestroyModule); if (pointer && module) { PyModule_AddObject(module, "type_pointer_capsule" SWIG_TYPE_TABLE_NAME, pointer); } else { Py_XDECREF(pointer); } } /* The python cached type query */ SWIGRUNTIME PyObject * SWIG_Python_TypeCache(void) { static PyObject *SWIG_STATIC_POINTER(cache) = PyDict_New(); return cache; } SWIGRUNTIME swig_type_info * SWIG_Python_TypeQuery(const char *type) { PyObject *cache = SWIG_Python_TypeCache(); PyObject *key = SWIG_Python_str_FromChar(type); PyObject *obj = PyDict_GetItem(cache, key); swig_type_info *descriptor; if (obj) { descriptor = (swig_type_info *) PyCapsule_GetPointer(obj, NULL); } else { swig_module_info *swig_module = SWIG_GetModule(0); descriptor = SWIG_TypeQueryModule(swig_module, swig_module, type); if (descriptor) { obj = PyCapsule_New((void*) descriptor, NULL, NULL); PyDict_SetItem(cache, key, obj); Py_DECREF(obj); } } Py_DECREF(key); return descriptor; } /* For backward compatibility only */ #define SWIG_POINTER_EXCEPTION 0 #define SWIG_arg_fail(arg) SWIG_Python_ArgFail(arg) #define SWIG_MustGetPtr(p, type, argnum, flags) SWIG_Python_MustGetPtr(p, type, argnum, flags) SWIGRUNTIME int SWIG_Python_AddErrMesg(const char* mesg, int infront) { if (PyErr_Occurred()) { PyObject *type = 0; PyObject *value = 0; PyObject *traceback = 0; PyErr_Fetch(&type, &value, &traceback); if (value) { PyObject *old_str = PyObject_Str(value); const char *tmp = SWIG_Python_str_AsChar(old_str); const char *errmesg = tmp ? tmp : "Invalid error message"; Py_XINCREF(type); PyErr_Clear(); if (infront) { PyErr_Format(type, "%s %s", mesg, errmesg); } else { PyErr_Format(type, "%s %s", errmesg, mesg); } SWIG_Python_str_DelForPy3(tmp); Py_DECREF(old_str); } return 1; } else { return 0; } } SWIGRUNTIME int SWIG_Python_ArgFail(int argnum) { if (PyErr_Occurred()) { /* add information about failing argument */ char mesg[256]; PyOS_snprintf(mesg, sizeof(mesg), "argument number %d:", argnum); return SWIG_Python_AddErrMesg(mesg, 1); } else { return 0; } } SWIGRUNTIMEINLINE const char * SwigPyObject_GetDesc(PyObject *self) { SwigPyObject *v = (SwigPyObject *)self; swig_type_info *ty = v ? v->ty : 0; return ty ? ty->str : ""; } SWIGRUNTIME void SWIG_Python_TypeError(const char *type, PyObject *obj) { if (type) { #if defined(SWIG_COBJECT_TYPES) if (obj && SwigPyObject_Check(obj)) { const char *otype = (const char *) SwigPyObject_GetDesc(obj); if (otype) { PyErr_Format(PyExc_TypeError, "a '%s' is expected, 'SwigPyObject(%s)' is received", type, otype); return; } } else #endif { const char *otype = (obj ? obj->ob_type->tp_name : 0); if (otype) { PyObject *str = PyObject_Str(obj); const char *cstr = str ? SWIG_Python_str_AsChar(str) : 0; if (cstr) { PyErr_Format(PyExc_TypeError, "a '%s' is expected, '%s(%s)' is received", type, otype, cstr); SWIG_Python_str_DelForPy3(cstr); } else { PyErr_Format(PyExc_TypeError, "a '%s' is expected, '%s' is received", type, otype); } Py_XDECREF(str); return; } } PyErr_Format(PyExc_TypeError, "a '%s' is expected", type); } else { PyErr_Format(PyExc_TypeError, "unexpected type is received"); } } /* Convert a pointer value, signal an exception on a type mismatch */ SWIGRUNTIME void * SWIG_Python_MustGetPtr(PyObject *obj, swig_type_info *ty, int SWIGUNUSEDPARM(argnum), int flags) { void *result; if (SWIG_Python_ConvertPtr(obj, &result, ty, flags) == -1) { PyErr_Clear(); #if SWIG_POINTER_EXCEPTION if (flags) { SWIG_Python_TypeError(SWIG_TypePrettyName(ty), obj); SWIG_Python_ArgFail(argnum); } #endif } return result; } #ifdef SWIGPYTHON_BUILTIN SWIGRUNTIME int SWIG_Python_NonDynamicSetAttr(PyObject *obj, PyObject *name, PyObject *value) { PyTypeObject *tp = obj->ob_type; PyObject *descr; PyObject *encoded_name; descrsetfunc f; int res = -1; # ifdef Py_USING_UNICODE if (PyString_Check(name)) { name = PyUnicode_Decode(PyString_AsString(name), PyString_Size(name), NULL, NULL); if (!name) return -1; } else if (!PyUnicode_Check(name)) # else if (!PyString_Check(name)) # endif { PyErr_Format(PyExc_TypeError, "attribute name must be string, not '%.200s'", name->ob_type->tp_name); return -1; } else { Py_INCREF(name); } if (!tp->tp_dict) { if (PyType_Ready(tp) < 0) goto done; } descr = _PyType_Lookup(tp, name); f = NULL; if (descr != NULL) f = descr->ob_type->tp_descr_set; if (!f) { if (PyString_Check(name)) { encoded_name = name; Py_INCREF(name); } else { encoded_name = PyUnicode_AsUTF8String(name); if (!encoded_name) return -1; } PyErr_Format(PyExc_AttributeError, "'%.100s' object has no attribute '%.200s'", tp->tp_name, PyString_AsString(encoded_name)); Py_DECREF(encoded_name); } else { res = f(descr, obj, value); } done: Py_DECREF(name); return res; } #endif #ifdef __cplusplus } #endif swig-4.0.1/Lib/python/std_carray.i0000644000175000017500000000305713527063513016711 0ustar williamwilliam%include %fragment("StdCarrayTraits","header",fragment="StdSequenceTraits") { namespace swig { template struct traits_asptr > { static int asptr(PyObject *obj, std::carray **array) { return traits_asptr_stdseq >::asptr(obj, array); } }; } } %warnfilter(SWIGWARN_IGNORE_OPERATOR_INDEX) std::carray::operator[]; %extend std::carray { %fragment(SWIG_Traits_frag(std::carray<_Type, _Size >), "header", fragment="SwigPyIterator_T", fragment=SWIG_Traits_frag(_Type), fragment="StdCarrayTraits") { namespace swig { template <> struct traits > { typedef pointer_category category; static const char* type_name() { return "std::carray<" #_Type "," #_Size " >"; } }; } } %typemaps_asptr(SWIG_TYPECHECK_VECTOR, swig::asptr, SWIG_Traits_frag(std::carray<_Type, _Size >), std::carray<_Type, _Size >); %typemap(out,noblock=1) iterator, const_iterator { $result = SWIG_NewPointerObj(swig::make_output_iterator((const $type &)$1), swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN); } inline size_t __len__() const { return self->size(); } inline const _Type& __getitem__(size_t i) const { return (*self)[i]; } inline void __setitem__(size_t i, const _Type& v) { (*self)[i] = v; } swig::SwigPyIterator* __iter__(PyObject **PYTHON_SELF) { return swig::make_output_iterator(self->begin(), self->begin(), self->end(), *PYTHON_SELF); } } %include swig-4.0.1/Lib/python/ccomplex.i0000644000175000017500000000137313527063513016367 0ustar williamwilliam/* ----------------------------------------------------------------------------- * ccomplex.i * * C complex typemaps * ISO C99: 7.3 Complex arithmetic * ----------------------------------------------------------------------------- */ %include %{ #include %} /* C complex constructor */ #define CCplxConst(r, i) ((r) + I*(i)) %swig_cplxflt_convn(float complex, CCplxConst, creal, cimag); %swig_cplxdbl_convn(double complex, CCplxConst, creal, cimag); %swig_cplxdbl_convn(complex, CCplxConst, creal, cimag); /* declaring the typemaps */ %typemaps_primitive(SWIG_TYPECHECK_CPLXFLT, float complex); %typemaps_primitive(SWIG_TYPECHECK_CPLXDBL, double complex); %typemaps_primitive(SWIG_TYPECHECK_CPLXDBL, complex); swig-4.0.1/Lib/python/python.swg0000644000175000017500000000376313527063513016453 0ustar williamwilliam/* ------------------------------------------------------------ * python.swg * * Python configuration module. * ------------------------------------------------------------ */ /* ------------------------------------------------------------ * Inner macros * ------------------------------------------------------------ */ %include /* ------------------------------------------------------------ * The runtime part * ------------------------------------------------------------ */ %include /* ------------------------------------------------------------ * Special user directives * ------------------------------------------------------------ */ %include /* ------------------------------------------------------------ * Typemap specializations * ------------------------------------------------------------ */ %include /* ------------------------------------------------------------ * Overloaded operator support * ------------------------------------------------------------ */ %include /* ------------------------------------------------------------ * Warnings for Python keywords * ------------------------------------------------------------ */ %include /* ------------------------------------------------------------ * The Python autodoc support * ------------------------------------------------------------ */ %include /* ------------------------------------------------------------ * The Python classes, for C++ * ------------------------------------------------------------ */ %include /* ------------------------------------------------------------ * The Python initialization function * ------------------------------------------------------------ */ %include /* ------------------------------------------------------------ * For backward compatibility * ------------------------------------------------------------ */ %include swig-4.0.1/Lib/python/std_wstring.i0000644000175000017500000000007713527063513017124 0ustar williamwilliam%include %include swig-4.0.1/Lib/python/file.i0000644000175000017500000000201313527063513015464 0ustar williamwilliam/* ----------------------------------------------------------------------------- * file.i * * Typemaps for FILE* * ----------------------------------------------------------------------------- */ %types(FILE *); /* defining basic methods */ %fragment("SWIG_AsValFilePtr","header") { SWIGINTERN int SWIG_AsValFilePtr(PyObject *obj, FILE **val) { static swig_type_info* desc = 0; void *vptr = 0; if (!desc) desc = SWIG_TypeQuery("FILE *"); if ((SWIG_ConvertPtr(obj, &vptr, desc, 0)) == SWIG_OK) { if (val) *val = (FILE *)vptr; return SWIG_OK; } %#if PY_VERSION_HEX < 0x03000000 if (PyFile_Check(obj)) { if (val) *val = PyFile_AsFile(obj); return SWIG_OK; } %#endif return SWIG_TypeError; } } %fragment("SWIG_AsFilePtr","header",fragment="SWIG_AsValFilePtr") { SWIGINTERNINLINE FILE* SWIG_AsFilePtr(PyObject *obj) { FILE *val = 0; SWIG_AsValFilePtr(obj, &val); return val; } } /* defining the typemaps */ %typemaps_asval(%checkcode(POINTER), SWIG_AsValFilePtr, "SWIG_AsValFilePtr", FILE*); swig-4.0.1/Lib/python/std_unordered_map.i0000644000175000017500000002430113527063513020247 0ustar williamwilliam/* Unordered Maps */ %include %fragment("StdUnorderedMapForwardIteratorTraits","header") { namespace swig { template struct SwigPyMapForwardIterator_T : SwigPyForwardIteratorClosed_T { SwigPyMapForwardIterator_T(OutIterator curr, OutIterator first, OutIterator last, PyObject *seq) : SwigPyForwardIteratorClosed_T(curr, first, last, seq) { } }; template > struct SwigPyMapKeyForwardIterator_T : SwigPyMapForwardIterator_T { SwigPyMapKeyForwardIterator_T(OutIterator curr, OutIterator first, OutIterator last, PyObject *seq) : SwigPyMapForwardIterator_T(curr, first, last, seq) { } }; template inline SwigPyIterator* make_output_key_forward_iterator(const OutIter& current, const OutIter& begin, const OutIter& end, PyObject *seq = 0) { return new SwigPyMapKeyForwardIterator_T(current, begin, end, seq); } template > struct SwigPyMapValueForwardIterator_T : SwigPyMapForwardIterator_T { SwigPyMapValueForwardIterator_T(OutIterator curr, OutIterator first, OutIterator last, PyObject *seq) : SwigPyMapForwardIterator_T(curr, first, last, seq) { } }; template inline SwigPyIterator* make_output_value_forward_iterator(const OutIter& current, const OutIter& begin, const OutIter& end, PyObject *seq = 0) { return new SwigPyMapValueForwardIterator_T(current, begin, end, seq); } } } %fragment("StdUnorderedMapTraits","header",fragment="StdMapCommonTraits",fragment="StdUnorderedMapForwardIteratorTraits") { namespace swig { template inline void assign(const SwigPySeq& swigpyseq, std::unordered_map *unordered_map) { typedef typename std::unordered_map::value_type value_type; typename SwigPySeq::const_iterator it = swigpyseq.begin(); for (;it != swigpyseq.end(); ++it) { unordered_map->insert(value_type(it->first, it->second)); } } template struct traits_reserve > { static void reserve(std::unordered_map &seq, typename std::unordered_map::size_type n) { seq.reserve(n); } }; template struct traits_asptr > { typedef std::unordered_map unordered_map_type; static int asptr(PyObject *obj, unordered_map_type **val) { int res = SWIG_ERROR; SWIG_PYTHON_THREAD_BEGIN_BLOCK; if (PyDict_Check(obj)) { SwigVar_PyObject items = PyObject_CallMethod(obj,(char *)"items",NULL); %#if PY_VERSION_HEX >= 0x03000000 /* In Python 3.x the ".items()" method returns a dict_items object */ items = PySequence_Fast(items, ".items() didn't return a sequence!"); %#endif res = traits_asptr_stdseq, std::pair >::asptr(items, val); } else { unordered_map_type *p; swig_type_info *descriptor = swig::type_info(); res = descriptor ? SWIG_ConvertPtr(obj, (void **)&p, descriptor, 0) : SWIG_ERROR; if (SWIG_IsOK(res) && val) *val = p; } SWIG_PYTHON_THREAD_END_BLOCK; return res; } }; template struct traits_from > { typedef std::unordered_map unordered_map_type; typedef typename unordered_map_type::const_iterator const_iterator; typedef typename unordered_map_type::size_type size_type; static PyObject *asdict(const unordered_map_type& map) { SWIG_PYTHON_THREAD_BEGIN_BLOCK; size_type size = map.size(); Py_ssize_t pysize = (size <= (size_type) INT_MAX) ? (Py_ssize_t) size : -1; if (pysize < 0) { PyErr_SetString(PyExc_OverflowError, "map size not valid in python"); SWIG_PYTHON_THREAD_END_BLOCK; return NULL; } PyObject *obj = PyDict_New(); for (const_iterator i= map.begin(); i!= map.end(); ++i) { swig::SwigVar_PyObject key = swig::from(i->first); swig::SwigVar_PyObject val = swig::from(i->second); PyDict_SetItem(obj, key, val); } SWIG_PYTHON_THREAD_END_BLOCK; return obj; } static PyObject *from(const unordered_map_type& map) { swig_type_info *desc = swig::type_info(); if (desc && desc->clientdata) { return SWIG_InternalNewPointerObj(new unordered_map_type(map), desc, SWIG_POINTER_OWN); } else { return asdict(map); } } }; } } %define %swig_unordered_map_common(Map...) %swig_sequence_forward_iterator(Map); %swig_container_methods(Map) #if defined(SWIGPYTHON_BUILTIN) %feature("python:slot", "mp_length", functype="lenfunc") __len__; %feature("python:slot", "mp_subscript", functype="binaryfunc") __getitem__; %feature("python:slot", "tp_iter", functype="getiterfunc") key_iterator; %feature("python:slot", "sq_contains", functype="objobjproc") __contains__; %extend { %newobject iterkeys(PyObject **PYTHON_SELF); swig::SwigPyIterator* iterkeys(PyObject **PYTHON_SELF) { return swig::make_output_key_forward_iterator(self->begin(), self->begin(), self->end(), *PYTHON_SELF); } %newobject itervalues(PyObject **PYTHON_SELF); swig::SwigPyIterator* itervalues(PyObject **PYTHON_SELF) { return swig::make_output_value_forward_iterator(self->begin(), self->begin(), self->end(), *PYTHON_SELF); } %newobject iteritems(PyObject **PYTHON_SELF); swig::SwigPyIterator* iteritems(PyObject **PYTHON_SELF) { return swig::make_output_forward_iterator(self->begin(), self->begin(), self->end(), *PYTHON_SELF); } } #else %extend { %pythoncode %{def __iter__(self): return self.key_iterator()%} %pythoncode %{def iterkeys(self): return self.key_iterator()%} %pythoncode %{def itervalues(self): return self.value_iterator()%} %pythoncode %{def iteritems(self): return self.iterator()%} } #endif %extend { mapped_type const & __getitem__(const key_type& key) throw (std::out_of_range) { Map::const_iterator i = self->find(key); if (i != self->end()) return i->second; else throw std::out_of_range("key not found"); } void __delitem__(const key_type& key) throw (std::out_of_range) { Map::iterator i = self->find(key); if (i != self->end()) self->erase(i); else throw std::out_of_range("key not found"); } bool has_key(const key_type& key) const { Map::const_iterator i = self->find(key); return i != self->end(); } PyObject* keys() { Map::size_type size = self->size(); Py_ssize_t pysize = (size <= (Map::size_type) INT_MAX) ? (Py_ssize_t) size : -1; SWIG_PYTHON_THREAD_BEGIN_BLOCK; if (pysize < 0) { PyErr_SetString(PyExc_OverflowError, "unordered_map size not valid in python"); SWIG_PYTHON_THREAD_END_BLOCK; return NULL; } PyObject* keyList = PyList_New(pysize); Map::const_iterator i = self->begin(); for (Py_ssize_t j = 0; j < pysize; ++i, ++j) { PyList_SET_ITEM(keyList, j, swig::from(i->first)); } SWIG_PYTHON_THREAD_END_BLOCK; return keyList; } PyObject* values() { Map::size_type size = self->size(); Py_ssize_t pysize = (size <= (Map::size_type) INT_MAX) ? (Py_ssize_t) size : -1; SWIG_PYTHON_THREAD_BEGIN_BLOCK; if (pysize < 0) { PyErr_SetString(PyExc_OverflowError, "unordered_map size not valid in python"); SWIG_PYTHON_THREAD_END_BLOCK; return NULL; } PyObject* valList = PyList_New(pysize); Map::const_iterator i = self->begin(); for (Py_ssize_t j = 0; j < pysize; ++i, ++j) { PyList_SET_ITEM(valList, j, swig::from(i->second)); } SWIG_PYTHON_THREAD_END_BLOCK; return valList; } PyObject* items() { Map::size_type size = self->size(); Py_ssize_t pysize = (size <= (Map::size_type) INT_MAX) ? (Py_ssize_t) size : -1; SWIG_PYTHON_THREAD_BEGIN_BLOCK; if (pysize < 0) { PyErr_SetString(PyExc_OverflowError, "unordered_map size not valid in python"); SWIG_PYTHON_THREAD_END_BLOCK; return NULL; } PyObject* itemList = PyList_New(pysize); Map::const_iterator i = self->begin(); for (Py_ssize_t j = 0; j < pysize; ++i, ++j) { PyList_SET_ITEM(itemList, j, swig::from(*i)); } SWIG_PYTHON_THREAD_END_BLOCK; return itemList; } bool __contains__(const key_type& key) { return self->find(key) != self->end(); } %newobject key_iterator(PyObject **PYTHON_SELF); swig::SwigPyIterator* key_iterator(PyObject **PYTHON_SELF) { return swig::make_output_key_forward_iterator(self->begin(), self->begin(), self->end(), *PYTHON_SELF); } %newobject value_iterator(PyObject **PYTHON_SELF); swig::SwigPyIterator* value_iterator(PyObject **PYTHON_SELF) { return swig::make_output_value_forward_iterator(self->begin(), self->begin(), self->end(), *PYTHON_SELF); } } %enddef %define %swig_unordered_map_methods(Map...) %swig_unordered_map_common(Map) #if defined(SWIGPYTHON_BUILTIN) %feature("python:slot", "mp_ass_subscript", functype="objobjargproc") __setitem__; #endif %extend { // This will be called through the mp_ass_subscript slot to delete an entry. void __setitem__(const key_type& key) { self->erase(key); } void __setitem__(const key_type& key, const mapped_type& x) throw (std::out_of_range) { (*self)[key] = x; } PyObject* asdict() { return swig::traits_from< Map >::asdict(*self); } } %enddef %include swig-4.0.1/Lib/python/pywstrings.swg0000644000175000017500000000461013527063513017353 0ustar williamwilliam/* ------------------------------------------------------------ * utility methods for wchar_t strings * ------------------------------------------------------------ */ %{ #if PY_VERSION_HEX >= 0x03020000 # define SWIGPY_UNICODE_ARG(obj) ((PyObject*) (obj)) #else # define SWIGPY_UNICODE_ARG(obj) ((PyUnicodeObject*) (obj)) #endif %} %fragment("SWIG_AsWCharPtrAndSize","header",fragment="",fragment="SWIG_pwchar_descriptor") { SWIGINTERN int SWIG_AsWCharPtrAndSize(PyObject *obj, wchar_t **cptr, size_t *psize, int *alloc) { PyObject *tmp = 0; int isunicode = PyUnicode_Check(obj); %#if PY_VERSION_HEX < 0x03000000 && !defined(SWIG_PYTHON_STRICT_UNICODE_WCHAR) if (!isunicode && PyString_Check(obj)) { tmp = PyUnicode_FromObject(obj); if (tmp) { isunicode = 1; obj = tmp; } else { PyErr_Clear(); return SWIG_TypeError; } } %#endif if (isunicode) { %#if PY_VERSION_HEX >= 0x03030000 Py_ssize_t len = PyUnicode_GetLength(obj); %#else Py_ssize_t len = PyUnicode_GetSize(obj); %#endif if (cptr) { Py_ssize_t length; *cptr = %new_array(len + 1, wchar_t); length = PyUnicode_AsWideChar(SWIGPY_UNICODE_ARG(obj), *cptr, len); if (length == -1) { PyErr_Clear(); Py_XDECREF(tmp); return SWIG_TypeError; } (*cptr)[length] = 0; } if (psize) *psize = (size_t) len + 1; if (alloc) *alloc = cptr ? SWIG_NEWOBJ : 0; Py_XDECREF(tmp); return SWIG_OK; } else { swig_type_info* pwchar_descriptor = SWIG_pwchar_descriptor(); if (pwchar_descriptor) { void * vptr = 0; if (SWIG_ConvertPtr(obj, &vptr, pwchar_descriptor, 0) == SWIG_OK) { if (cptr) *cptr = (wchar_t *)vptr; if (psize) *psize = vptr ? (wcslen((wchar_t *)vptr) + 1) : 0; return SWIG_OK; } } } return SWIG_TypeError; } } %fragment("SWIG_FromWCharPtrAndSize","header",fragment="",fragment="SWIG_pwchar_descriptor") { SWIGINTERNINLINE PyObject * SWIG_FromWCharPtrAndSize(const wchar_t * carray, size_t size) { if (carray) { if (size > INT_MAX) { swig_type_info* pwchar_descriptor = SWIG_pwchar_descriptor(); return pwchar_descriptor ? SWIG_InternalNewPointerObj(%const_cast(carray,wchar_t *), pwchar_descriptor, 0) : SWIG_Py_Void(); } else { return PyUnicode_FromWideChar(carray, %numeric_cast(size, Py_ssize_t)); } } else { return SWIG_Py_Void(); } } } swig-4.0.1/Lib/python/std_sstream.i0000644000175000017500000000003513527063513017077 0ustar williamwilliam%include swig-4.0.1/Lib/python/std_unordered_multimap.i0000644000175000017500000000767713527063513021343 0ustar williamwilliam/* Unordered Multimaps */ %include %fragment("StdUnorderedMultimapTraits","header",fragment="StdMapCommonTraits",fragment="StdUnorderedMapForwardIteratorTraits") { namespace swig { template inline void assign(const SwigPySeq& swigpyseq, std::unordered_multimap *unordered_multimap) { typedef typename std::unordered_multimap::value_type value_type; typename SwigPySeq::const_iterator it = swigpyseq.begin(); for (;it != swigpyseq.end(); ++it) { unordered_multimap->insert(value_type(it->first, it->second)); } } template struct traits_reserve > { static void reserve(std::unordered_multimap &seq, typename std::unordered_multimap::size_type n) { seq.reserve(n); } }; template struct traits_asptr > { typedef std::unordered_multimap unordered_multimap_type; static int asptr(PyObject *obj, std::unordered_multimap **val) { int res = SWIG_ERROR; if (PyDict_Check(obj)) { SwigVar_PyObject items = PyObject_CallMethod(obj,(char *)"items",NULL); %#if PY_VERSION_HEX >= 0x03000000 /* In Python 3.x the ".items()" method returns a dict_items object */ items = PySequence_Fast(items, ".items() didn't return a sequence!"); %#endif res = traits_asptr_stdseq, std::pair >::asptr(items, val); } else { unordered_multimap_type *p; swig_type_info *descriptor = swig::type_info(); res = descriptor ? SWIG_ConvertPtr(obj, (void **)&p, descriptor, 0) : SWIG_ERROR; if (SWIG_IsOK(res) && val) *val = p; } return res; } }; template struct traits_from > { typedef std::unordered_multimap unordered_multimap_type; typedef typename unordered_multimap_type::const_iterator const_iterator; typedef typename unordered_multimap_type::size_type size_type; static PyObject *from(const unordered_multimap_type& unordered_multimap) { swig_type_info *desc = swig::type_info(); if (desc && desc->clientdata) { return SWIG_InternalNewPointerObj(new unordered_multimap_type(unordered_multimap), desc, SWIG_POINTER_OWN); } else { size_type size = unordered_multimap.size(); Py_ssize_t pysize = (size <= (size_type) INT_MAX) ? (Py_ssize_t) size : -1; if (pysize < 0) { SWIG_PYTHON_THREAD_BEGIN_BLOCK; PyErr_SetString(PyExc_OverflowError, "unordered_multimap size not valid in python"); SWIG_PYTHON_THREAD_END_BLOCK; return NULL; } PyObject *obj = PyDict_New(); for (const_iterator i= unordered_multimap.begin(); i!= unordered_multimap.end(); ++i) { swig::SwigVar_PyObject key = swig::from(i->first); swig::SwigVar_PyObject val = swig::from(i->second); PyDict_SetItem(obj, key, val); } return obj; } } }; } } %define %swig_unordered_multimap_methods(Type...) %swig_unordered_map_common(Type); #if defined(SWIGPYTHON_BUILTIN) %feature("python:slot", "mp_ass_subscript", functype="objobjargproc") __setitem__; #endif %extend { // This will be called through the mp_ass_subscript slot to delete an entry. void __setitem__(const key_type& key) { self->erase(key); } void __setitem__(const key_type& key, const mapped_type& x) throw (std::out_of_range) { self->insert(Type::value_type(key,x)); } } %enddef %include swig-4.0.1/Lib/python/attribute.i0000644000175000017500000000004213527063513016550 0ustar williamwilliam%include swig-4.0.1/Lib/python/pyclasses.swg0000644000175000017500000000662213527063513017135 0ustar williamwilliam#ifdef __cplusplus /* SwigPtr_PyObject is used as a replacement of PyObject *, where the INCREF/DECREF are applied as needed. You can use SwigPtr_PyObject in a container, such as std::vector; or as a member variable: struct A { SwigPtr_PyObject obj; A(PyObject *o) : _obj(o) { } }; or as a input/output value SwigPtr_PyObject func(SwigPtr_PyObject obj) { SwigPtr_PyObject out = PyString_FromFormat("hello %s", PyObject_AsString(obj)); Py_DECREF(out); return out; } just remember to pair the object creation with the proper DECREF, the same as with plain PyObject *ptr, since SwigPtr_PyObject always add one reference at construction. SwigPtr_PyObject is 'visible' at the wrapped side, so you can do: %template(pyvector) std::vector; and all the proper typemaps will be used. */ namespace swig { %ignore SwigPtr_PyObject; struct SwigPtr_PyObject {}; %apply PyObject * {SwigPtr_PyObject}; %apply PyObject * const& {SwigPtr_PyObject const&}; %typemap(typecheck,precedence=SWIG_TYPECHECK_SWIGOBJECT,noblock=1) SwigPtr_PyObject const& "$1 = ($input != 0);"; /* For output */ %typemap(out,noblock=1) SwigPtr_PyObject { $result = (PyObject *)$1; Py_INCREF($result); } %typemap(out,noblock=1) SwigPtr_PyObject const & { $result = (PyObject *)*$1; Py_INCREF($result); } } %{ namespace swig { class SwigPtr_PyObject { protected: PyObject *_obj; public: SwigPtr_PyObject() :_obj(0) { } SwigPtr_PyObject(const SwigPtr_PyObject& item) : _obj(item._obj) { SWIG_PYTHON_THREAD_BEGIN_BLOCK; Py_XINCREF(_obj); SWIG_PYTHON_THREAD_END_BLOCK; } SwigPtr_PyObject(PyObject *obj, bool initial_ref = true) :_obj(obj) { if (initial_ref) { SWIG_PYTHON_THREAD_BEGIN_BLOCK; Py_XINCREF(_obj); SWIG_PYTHON_THREAD_END_BLOCK; } } SwigPtr_PyObject & operator=(const SwigPtr_PyObject& item) { SWIG_PYTHON_THREAD_BEGIN_BLOCK; Py_XINCREF(item._obj); Py_XDECREF(_obj); _obj = item._obj; SWIG_PYTHON_THREAD_END_BLOCK; return *this; } ~SwigPtr_PyObject() { SWIG_PYTHON_THREAD_BEGIN_BLOCK; Py_XDECREF(_obj); SWIG_PYTHON_THREAD_END_BLOCK; } operator PyObject *() const { return _obj; } PyObject *operator->() const { return _obj; } }; } %} /* SwigVar_PyObject is used to manage 'in the scope' PyObject * variables, as in int func () { SwigVar_PyObject obj = PyString_FromString("hello"); } ie, 'obj' is created and destructed in the same scope from a python object that carries at least one reference value. SwigVar_PyObject just take care of applying the proper Py_DECREF. Hence, this class is purely internal and not visible at the wrapped side. */ namespace swig { %ignore SwigVar_PyObject; struct SwigVar_PyObject {}; %apply PyObject * {SwigVar_PyObject}; %apply PyObject * const& {SwigVar_PyObject const&}; } %{ namespace swig { struct SwigVar_PyObject : SwigPtr_PyObject { SwigVar_PyObject(PyObject* obj = 0) : SwigPtr_PyObject(obj, false) { } SwigVar_PyObject & operator = (PyObject* obj) { Py_XDECREF(_obj); _obj = obj; return *this; } }; } %} #endif swig-4.0.1/Lib/python/std_unordered_set.i0000644000175000017500000000437213527063513020273 0ustar williamwilliam/* Unordered Sets */ %fragment("StdUnorderedSetTraits","header",fragment="StdSequenceTraits") %{ namespace swig { template inline void assign(const SwigPySeq& swigpyseq, std::unordered_set* seq) { // seq->insert(swigpyseq.begin(), swigpyseq.end()); // not used as not always implemented typedef typename SwigPySeq::value_type value_type; typename SwigPySeq::const_iterator it = swigpyseq.begin(); for (;it != swigpyseq.end(); ++it) { seq->insert(seq->end(),(value_type)(*it)); } } template struct traits_reserve > { static void reserve(std::unordered_set &seq, typename std::unordered_set::size_type n) { seq.reserve(n); } }; template struct traits_asptr > { static int asptr(PyObject *obj, std::unordered_set **s) { return traits_asptr_stdseq >::asptr(obj, s); } }; template struct traits_from > { static PyObject *from(const std::unordered_set& vec) { return traits_from_stdseq >::from(vec); } }; } %} %define %swig_unordered_set_methods(unordered_set...) %swig_sequence_forward_iterator(unordered_set); %swig_container_methods(unordered_set); #if defined(SWIGPYTHON_BUILTIN) %feature("python:slot", "sq_contains", functype="objobjproc") __contains__; %feature("python:slot", "mp_subscript", functype="binaryfunc") __getitem__; #endif %extend { void append(value_type x) { self->insert(x); } bool __contains__(value_type x) { return self->find(x) != self->end(); } value_type __getitem__(difference_type i) const throw (std::out_of_range) { return *(swig::cgetpos(self, i)); } } %enddef %include swig-4.0.1/Lib/python/cmalloc.i0000644000175000017500000000004013527063513016155 0ustar williamwilliam%include swig-4.0.1/Lib/python/pyerrors.swg0000644000175000017500000000513613527063513017013 0ustar williamwilliam/* ----------------------------------------------------------------------------- * error manipulation * ----------------------------------------------------------------------------- */ SWIGRUNTIME PyObject* SWIG_Python_ErrorType(int code) { PyObject* type = 0; switch(code) { case SWIG_MemoryError: type = PyExc_MemoryError; break; case SWIG_IOError: type = PyExc_IOError; break; case SWIG_RuntimeError: type = PyExc_RuntimeError; break; case SWIG_IndexError: type = PyExc_IndexError; break; case SWIG_TypeError: type = PyExc_TypeError; break; case SWIG_DivisionByZero: type = PyExc_ZeroDivisionError; break; case SWIG_OverflowError: type = PyExc_OverflowError; break; case SWIG_SyntaxError: type = PyExc_SyntaxError; break; case SWIG_ValueError: type = PyExc_ValueError; break; case SWIG_SystemError: type = PyExc_SystemError; break; case SWIG_AttributeError: type = PyExc_AttributeError; break; default: type = PyExc_RuntimeError; } return type; } SWIGRUNTIME void SWIG_Python_AddErrorMsg(const char* mesg) { PyObject *type = 0; PyObject *value = 0; PyObject *traceback = 0; if (PyErr_Occurred()) PyErr_Fetch(&type, &value, &traceback); if (value) { PyObject *old_str = PyObject_Str(value); const char *tmp = SWIG_Python_str_AsChar(old_str); PyErr_Clear(); Py_XINCREF(type); if (tmp) PyErr_Format(type, "%s %s", tmp, mesg); else PyErr_Format(type, "%s", mesg); SWIG_Python_str_DelForPy3(tmp); Py_DECREF(old_str); Py_DECREF(value); } else { PyErr_SetString(PyExc_RuntimeError, mesg); } } SWIGRUNTIME int SWIG_Python_TypeErrorOccurred(PyObject *obj) { PyObject *error; if (obj) return 0; error = PyErr_Occurred(); return error && PyErr_GivenExceptionMatches(error, PyExc_TypeError); } SWIGRUNTIME void SWIG_Python_RaiseOrModifyTypeError(const char *message) { if (SWIG_Python_TypeErrorOccurred(NULL)) { /* Use existing TypeError to preserve stacktrace and enhance with given message */ PyObject *newvalue; PyObject *type = NULL, *value = NULL, *traceback = NULL; PyErr_Fetch(&type, &value, &traceback); #if PY_VERSION_HEX >= 0x03000000 newvalue = PyUnicode_FromFormat("%S\nAdditional information:\n%s", value, message); #else newvalue = PyString_FromFormat("%s\nAdditional information:\n%s", PyString_AsString(value), message); #endif Py_XDECREF(value); PyErr_Restore(type, newvalue, traceback); } else { /* Raise TypeError using given message */ PyErr_SetString(PyExc_TypeError, message); } } swig-4.0.1/Lib/python/std_basic_string.i0000644000175000017500000000501113527063513020067 0ustar williamwilliam#if !defined(SWIG_STD_STRING) #define SWIG_STD_BASIC_STRING %include #define %swig_basic_string(Type...) %swig_sequence_methods_val(Type) %fragment(SWIG_AsPtr_frag(std::basic_string),"header", fragment="SWIG_AsCharPtrAndSize") { SWIGINTERN int SWIG_AsPtr(std::basic_string)(PyObject* obj, std::string **val) { static swig_type_info* string_info = SWIG_TypeQuery("std::basic_string *"); std::string *vptr; if (SWIG_IsOK(SWIG_ConvertPtr(obj, (void**)&vptr, string_info, 0))) { if (val) *val = vptr; return SWIG_OLDOBJ; } else { PyErr_Clear(); char* buf = 0 ; size_t size = 0; int alloc = 0; if (SWIG_IsOK(SWIG_AsCharPtrAndSize(obj, &buf, &size, &alloc))) { if (buf) { if (val) *val = new std::string(buf, size - 1); if (alloc == SWIG_NEWOBJ) %delete_array(buf); return SWIG_NEWOBJ; } else { if (val) *val = 0; return SWIG_OLDOBJ; } } return SWIG_ERROR; } } } %fragment(SWIG_From_frag(std::basic_string),"header", fragment="SWIG_FromCharPtrAndSize") { SWIGINTERNINLINE PyObject* SWIG_From(std::basic_string)(const std::string& s) { return SWIG_FromCharPtrAndSize(s.data(), s.size()); } } %include %typemaps_asptrfromn(%checkcode(STRING), std::basic_string); #endif #if !defined(SWIG_STD_WSTRING) %fragment(SWIG_AsPtr_frag(std::basic_string),"header", fragment="SWIG_AsWCharPtrAndSize") { SWIGINTERN int SWIG_AsPtr(std::basic_string)(PyObject* obj, std::wstring **val) { static swig_type_info* string_info = SWIG_TypeQuery("std::basic_string *"); std::wstring *vptr; if (SWIG_IsOK(SWIG_ConvertPtr(obj, (void**)&vptr, string_info, 0))) { if (val) *val = vptr; return SWIG_OLDOBJ; } else { PyErr_Clear(); wchar_t *buf = 0 ; size_t size = 0; int alloc = 0; if (SWIG_IsOK(SWIG_AsWCharPtrAndSize(obj, &buf, &size, &alloc))) { if (buf) { if (val) *val = new std::wstring(buf, size - 1); if (alloc == SWIG_NEWOBJ) %delete_array(buf); return SWIG_NEWOBJ; } else { if (val) *val = 0; return SWIG_OLDOBJ; } } return SWIG_ERROR; } } } %fragment(SWIG_From_frag(std::basic_string),"header", fragment="SWIG_FromWCharPtrAndSize") { SWIGINTERNINLINE PyObject* SWIG_From(std::basic_string)(const std::wstring& s) { return SWIG_FromWCharPtrAndSize(s.data(), s.size()); } } %typemaps_asptrfromn(%checkcode(UNISTRING), std::basic_string); #endif swig-4.0.1/Lib/python/pycontainer.swg0000644000175000017500000007601713527063513017467 0ustar williamwilliam/* ----------------------------------------------------------------------------- * pycontainer.swg * * Python sequence <-> C++ container wrapper * * This wrapper, and its iterator, allows a general use (and reuse) of * the mapping between C++ and Python, thanks to the C++ templates. * * Of course, it needs the C++ compiler to support templates, but * since we will use this wrapper with the STL containers, that should * be the case. * ----------------------------------------------------------------------------- */ %{ #include #if PY_VERSION_HEX >= 0x03020000 # define SWIGPY_SLICE_ARG(obj) ((PyObject*) (obj)) #else # define SWIGPY_SLICE_ARG(obj) ((PySliceObject*) (obj)) #endif %} #if !defined(SWIG_NO_EXPORT_ITERATOR_METHODS) # if !defined(SWIG_EXPORT_ITERATOR_METHODS) # define SWIG_EXPORT_ITERATOR_METHODS SWIG_EXPORT_ITERATOR_METHODS # endif #endif %include /**** The PySequence C++ Wrap ***/ %fragment(""); %include %fragment("container_owner_attribute_init", "init") { // thread safe initialization swig::container_owner_attribute(); } %fragment("reference_container_owner", "header", fragment="container_owner_attribute_init") { namespace swig { static PyObject* container_owner_attribute() { static PyObject* attr = SWIG_Python_str_FromChar("__swig_container"); return attr; } template struct container_owner { // By default, do not add the back-reference (for value types) // Specialization below will check the reference for pointer types. static bool back_reference(PyObject* child, PyObject* owner) { return false; } }; template <> struct container_owner { /* * Call to add a back-reference to the owning object when returning a * reference from a container. Will only set the reference if child * is a SWIG wrapper object that does not own the pointer. * * returns whether the reference was set or not */ static bool back_reference(PyObject* child, PyObject* owner) { SwigPyObject* swigThis = SWIG_Python_GetSwigThis(child); if (swigThis && (swigThis->own & SWIG_POINTER_OWN) != SWIG_POINTER_OWN) { PyObject_SetAttr(child, container_owner_attribute(), owner); return true; } return false; } }; } } %fragment(SWIG_Traits_frag(swig::SwigPtr_PyObject),"header",fragment="StdTraits") { namespace swig { template <> struct traits { typedef value_category category; static const char* type_name() { return "SwigPtr_PyObject"; } }; template <> struct traits_from { typedef SwigPtr_PyObject value_type; static PyObject *from(const value_type& val) { PyObject *obj = static_cast(val); Py_XINCREF(obj); return obj; } }; template <> struct traits_check { static bool check(SwigPtr_PyObject) { return true; } }; template <> struct traits_asval { typedef SwigPtr_PyObject value_type; static int asval(PyObject *obj, value_type *val) { if (val) *val = obj; return SWIG_OK; } }; } } %fragment(SWIG_Traits_frag(swig::SwigVar_PyObject),"header",fragment="StdTraits") { namespace swig { template <> struct traits { typedef value_category category; static const char* type_name() { return "SwigVar_PyObject"; } }; template <> struct traits_from { typedef SwigVar_PyObject value_type; static PyObject *from(const value_type& val) { PyObject *obj = static_cast(val); Py_XINCREF(obj); return obj; } }; template <> struct traits_check { static bool check(SwigVar_PyObject) { return true; } }; template <> struct traits_asval { typedef SwigVar_PyObject value_type; static int asval(PyObject *obj, value_type *val) { if (val) *val = obj; return SWIG_OK; } }; } } %fragment("SwigPySequence_Base","header",fragment="",fragment="StdTraits") { %#include namespace std { template <> struct less { bool operator()(PyObject * v, PyObject *w) const { bool res; SWIG_PYTHON_THREAD_BEGIN_BLOCK; res = PyObject_RichCompareBool(v, w, Py_LT) ? true : false; /* This may fall into a case of inconsistent eg. ObjA > ObjX > ObjB but ObjA < ObjB */ if( PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_TypeError) ) { /* Objects can't be compared, this mostly occurred in Python 3.0 */ /* Compare their ptr directly for a workaround */ res = (v < w); PyErr_Clear(); } SWIG_PYTHON_THREAD_END_BLOCK; return res; } }; template <> struct less { bool operator()(const swig::SwigPtr_PyObject& v, const swig::SwigPtr_PyObject& w) const { return std::less()(v, w); } }; template <> struct less { bool operator()(const swig::SwigVar_PyObject& v, const swig::SwigVar_PyObject& w) const { return std::less()(v, w); } }; } namespace swig { template <> struct traits { typedef value_category category; static const char* type_name() { return "PyObject *"; } }; template <> struct traits_asval { typedef PyObject * value_type; static int asval(PyObject *obj, value_type *val) { if (val) *val = obj; return SWIG_OK; } }; template <> struct traits_check { static bool check(PyObject *) { return true; } }; template <> struct traits_from { typedef PyObject * value_type; static PyObject *from(const value_type& val) { Py_XINCREF(val); return val; } }; } namespace swig { template inline size_t check_index(Difference i, size_t size, bool insert = false) { if ( i < 0 ) { if ((size_t) (-i) <= size) return (size_t) (i + size); } else if ( (size_t) i < size ) { return (size_t) i; } else if (insert && ((size_t) i == size)) { return size; } throw std::out_of_range("index out of range"); } template void slice_adjust(Difference i, Difference j, Py_ssize_t step, size_t size, Difference &ii, Difference &jj, bool insert = false) { if (step == 0) { throw std::invalid_argument("slice step cannot be zero"); } else if (step > 0) { // Required range: 0 <= i < size, 0 <= j < size, i <= j if (i < 0) { ii = 0; } else if (i < (Difference)size) { ii = i; } else if (insert && (i >= (Difference)size)) { ii = (Difference)size; } if (j < 0) { jj = 0; } else { jj = (j < (Difference)size) ? j : (Difference)size; } if (jj < ii) jj = ii; } else { // Required range: -1 <= i < size-1, -1 <= j < size-1, i >= j if (i < -1) { ii = -1; } else if (i < (Difference) size) { ii = i; } else if (i >= (Difference)(size-1)) { ii = (Difference)(size-1); } if (j < -1) { jj = -1; } else { jj = (j < (Difference)size ) ? j : (Difference)(size-1); } if (ii < jj) ii = jj; } } template inline typename Sequence::iterator getpos(Sequence* self, Difference i) { typename Sequence::iterator pos = self->begin(); std::advance(pos, check_index(i,self->size())); return pos; } template inline typename Sequence::const_iterator cgetpos(const Sequence* self, Difference i) { typename Sequence::const_iterator pos = self->begin(); std::advance(pos, check_index(i,self->size())); return pos; } template inline void erase(Sequence* seq, const typename Sequence::iterator& position) { seq->erase(position); } template struct traits_reserve { static void reserve(Sequence & /*seq*/, typename Sequence::size_type /*n*/) { // This should be specialized for types that support reserve } }; template inline Sequence* getslice(const Sequence* self, Difference i, Difference j, Py_ssize_t step) { typename Sequence::size_type size = self->size(); Difference ii = 0; Difference jj = 0; swig::slice_adjust(i, j, step, size, ii, jj); if (step > 0) { typename Sequence::const_iterator sb = self->begin(); typename Sequence::const_iterator se = self->begin(); std::advance(sb,ii); std::advance(se,jj); if (step == 1) { return new Sequence(sb, se); } else { Sequence *sequence = new Sequence(); swig::traits_reserve::reserve(*sequence, (jj - ii + step - 1) / step); typename Sequence::const_iterator it = sb; while (it!=se) { sequence->push_back(*it); for (Py_ssize_t c=0; c::reserve(*sequence, (ii - jj - step - 1) / -step); typename Sequence::const_reverse_iterator sb = self->rbegin(); typename Sequence::const_reverse_iterator se = self->rbegin(); std::advance(sb,size-ii-1); std::advance(se,size-jj-1); typename Sequence::const_reverse_iterator it = sb; while (it!=se) { sequence->push_back(*it); for (Py_ssize_t c=0; c<-step && it!=se; ++c) it++; } return sequence; } } template inline void setslice(Sequence* self, Difference i, Difference j, Py_ssize_t step, const InputSeq& is = InputSeq()) { typename Sequence::size_type size = self->size(); Difference ii = 0; Difference jj = 0; swig::slice_adjust(i, j, step, size, ii, jj, true); if (step > 0) { if (step == 1) { size_t ssize = jj - ii; if (ssize <= is.size()) { // expanding/staying the same size swig::traits_reserve::reserve(*self, self->size() - ssize + is.size()); typename Sequence::iterator sb = self->begin(); typename InputSeq::const_iterator isit = is.begin(); std::advance(sb,ii); std::advance(isit, jj - ii); self->insert(std::copy(is.begin(), isit, sb), isit, is.end()); } else { // shrinking typename Sequence::iterator sb = self->begin(); typename Sequence::iterator se = self->begin(); std::advance(sb,ii); std::advance(se,jj); self->erase(sb,se); sb = self->begin(); std::advance(sb,ii); self->insert(sb, is.begin(), is.end()); } } else { size_t replacecount = (jj - ii + step - 1) / step; if (is.size() != replacecount) { char msg[1024]; sprintf(msg, "attempt to assign sequence of size %lu to extended slice of size %lu", (unsigned long)is.size(), (unsigned long)replacecount); throw std::invalid_argument(msg); } typename Sequence::const_iterator isit = is.begin(); typename Sequence::iterator it = self->begin(); std::advance(it,ii); for (size_t rc=0; rcend(); ++rc) { *it++ = *isit++; for (Py_ssize_t c=0; c<(step-1) && it != self->end(); ++c) it++; } } } else { size_t replacecount = (ii - jj - step - 1) / -step; if (is.size() != replacecount) { char msg[1024]; sprintf(msg, "attempt to assign sequence of size %lu to extended slice of size %lu", (unsigned long)is.size(), (unsigned long)replacecount); throw std::invalid_argument(msg); } typename Sequence::const_iterator isit = is.begin(); typename Sequence::reverse_iterator it = self->rbegin(); std::advance(it,size-ii-1); for (size_t rc=0; rcrend(); ++rc) { *it++ = *isit++; for (Py_ssize_t c=0; c<(-step-1) && it != self->rend(); ++c) it++; } } } template inline void delslice(Sequence* self, Difference i, Difference j, Py_ssize_t step) { typename Sequence::size_type size = self->size(); Difference ii = 0; Difference jj = 0; swig::slice_adjust(i, j, step, size, ii, jj, true); if (step > 0) { typename Sequence::iterator sb = self->begin(); std::advance(sb,ii); if (step == 1) { typename Sequence::iterator se = self->begin(); std::advance(se,jj); self->erase(sb,se); } else { typename Sequence::iterator it = sb; size_t delcount = (jj - ii + step - 1) / step; while (delcount) { it = self->erase(it); for (Py_ssize_t c=0; c<(step-1) && it != self->end(); ++c) it++; delcount--; } } } else { typename Sequence::reverse_iterator sb = self->rbegin(); std::advance(sb,size-ii-1); typename Sequence::reverse_iterator it = sb; size_t delcount = (ii - jj - step - 1) / -step; while (delcount) { it = typename Sequence::reverse_iterator(self->erase((++it).base())); for (Py_ssize_t c=0; c<(-step-1) && it != self->rend(); ++c) it++; delcount--; } } } } } %fragment("SwigPySequence_Cont","header", fragment="StdTraits", fragment="SwigPySequence_Base", fragment="SwigPyIterator_T") { namespace swig { template struct SwigPySequence_Ref { SwigPySequence_Ref(PyObject* seq, Py_ssize_t index) : _seq(seq), _index(index) { } operator T () const { swig::SwigVar_PyObject item = PySequence_GetItem(_seq, _index); try { return swig::as(item); } catch (const std::invalid_argument& e) { char msg[1024]; sprintf(msg, "in sequence element %d ", (int)_index); if (!PyErr_Occurred()) { ::%type_error(swig::type_name()); } SWIG_Python_AddErrorMsg(msg); SWIG_Python_AddErrorMsg(e.what()); throw; } } SwigPySequence_Ref& operator=(const T& v) { PySequence_SetItem(_seq, _index, swig::from(v)); return *this; } private: PyObject* _seq; Py_ssize_t _index; }; template struct SwigPySequence_ArrowProxy { SwigPySequence_ArrowProxy(const T& x): m_value(x) {} const T* operator->() const { return &m_value; } operator const T*() const { return &m_value; } T m_value; }; template struct SwigPySequence_InputIterator { typedef SwigPySequence_InputIterator self; typedef std::random_access_iterator_tag iterator_category; typedef Reference reference; typedef T value_type; typedef T* pointer; typedef Py_ssize_t difference_type; SwigPySequence_InputIterator() { } SwigPySequence_InputIterator(PyObject* seq, Py_ssize_t index) : _seq(seq), _index(index) { } reference operator*() const { return reference(_seq, _index); } SwigPySequence_ArrowProxy operator->() const { return SwigPySequence_ArrowProxy(operator*()); } bool operator==(const self& ri) const { return (_index == ri._index) && (_seq == ri._seq); } bool operator!=(const self& ri) const { return !(operator==(ri)); } self& operator ++ () { ++_index; return *this; } self& operator -- () { --_index; return *this; } self& operator += (difference_type n) { _index += n; return *this; } self operator +(difference_type n) const { return self(_seq, _index + n); } self& operator -= (difference_type n) { _index -= n; return *this; } self operator -(difference_type n) const { return self(_seq, _index - n); } difference_type operator - (const self& ri) const { return _index - ri._index; } bool operator < (const self& ri) const { return _index < ri._index; } reference operator[](difference_type n) const { return reference(_seq, _index + n); } private: PyObject* _seq; difference_type _index; }; // STL container wrapper around a Python sequence template struct SwigPySequence_Cont { typedef SwigPySequence_Ref reference; typedef const SwigPySequence_Ref const_reference; typedef T value_type; typedef T* pointer; typedef Py_ssize_t difference_type; typedef size_t size_type; typedef const pointer const_pointer; typedef SwigPySequence_InputIterator iterator; typedef SwigPySequence_InputIterator const_iterator; SwigPySequence_Cont(PyObject* seq) : _seq(0) { if (!PySequence_Check(seq)) { throw std::invalid_argument("a sequence is expected"); } _seq = seq; Py_INCREF(_seq); } ~SwigPySequence_Cont() { Py_XDECREF(_seq); } size_type size() const { return static_cast(PySequence_Size(_seq)); } bool empty() const { return size() == 0; } iterator begin() { return iterator(_seq, 0); } const_iterator begin() const { return const_iterator(_seq, 0); } iterator end() { return iterator(_seq, size()); } const_iterator end() const { return const_iterator(_seq, size()); } reference operator[](difference_type n) { return reference(_seq, n); } const_reference operator[](difference_type n) const { return const_reference(_seq, n); } bool check() const { Py_ssize_t s = size(); for (Py_ssize_t i = 0; i < s; ++i) { swig::SwigVar_PyObject item = PySequence_GetItem(_seq, i); if (!swig::check(item)) return false; } return true; } private: PyObject* _seq; }; } } %define %swig_sequence_iterator(Sequence...) %swig_sequence_iterator_with_making_function(swig::make_output_iterator,Sequence...) %enddef %define %swig_sequence_forward_iterator(Sequence...) %swig_sequence_iterator_with_making_function(swig::make_output_forward_iterator,Sequence...) %enddef %define %swig_sequence_iterator_with_making_function(Make_output_iterator,Sequence...) #if defined(SWIG_EXPORT_ITERATOR_METHODS) class iterator; class reverse_iterator; class const_iterator; class const_reverse_iterator; %typemap(out,noblock=1,fragment="SwigPySequence_Cont") iterator, reverse_iterator, const_iterator, const_reverse_iterator { $result = SWIG_NewPointerObj(Make_output_iterator(%static_cast($1,const $type &)), swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN); } %typemap(out,noblock=1,fragment="SwigPySequence_Cont") std::pair, std::pair { $result = PyTuple_New(2); PyTuple_SetItem($result,0,SWIG_NewPointerObj(Make_output_iterator(%static_cast($1,const $type &).first), swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN)); PyTuple_SetItem($result,1,SWIG_NewPointerObj(Make_output_iterator(%static_cast($1,const $type &).second), swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN)); } %fragment("SwigPyPairBoolOutputIterator","header",fragment=SWIG_From_frag(bool),fragment="SwigPySequence_Cont") {} %typemap(out,noblock=1,fragment="SwigPyPairBoolOutputIterator") std::pair, std::pair { $result = PyTuple_New(2); PyTuple_SetItem($result,0,SWIG_NewPointerObj(Make_output_iterator(%static_cast($1,const $type &).first), swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN)); PyTuple_SetItem($result,1,SWIG_From(bool)(%static_cast($1,const $type &).second)); } %typemap(in,noblock=1,fragment="SwigPySequence_Cont") iterator(swig::SwigPyIterator *iter = 0, int res), reverse_iterator(swig::SwigPyIterator *iter = 0, int res), const_iterator(swig::SwigPyIterator *iter = 0, int res), const_reverse_iterator(swig::SwigPyIterator *iter = 0, int res) { res = SWIG_ConvertPtr($input, %as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0); if (!SWIG_IsOK(res) || !iter) { %argument_fail(SWIG_TypeError, "$type", $symname, $argnum); } else { swig::SwigPyIterator_T<$type > *iter_t = dynamic_cast *>(iter); if (iter_t) { $1 = iter_t->get_current(); } else { %argument_fail(SWIG_TypeError, "$type", $symname, $argnum); } } } %typecheck(%checkcode(ITERATOR),noblock=1,fragment="SwigPySequence_Cont") iterator, reverse_iterator, const_iterator, const_reverse_iterator { swig::SwigPyIterator *iter = 0; int res = SWIG_ConvertPtr($input, %as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0); $1 = (SWIG_IsOK(res) && iter && (dynamic_cast *>(iter) != 0)); } %fragment("SwigPySequence_Cont"); %newobject iterator(PyObject **PYTHON_SELF); %extend { swig::SwigPyIterator* iterator(PyObject **PYTHON_SELF) { return Make_output_iterator(self->begin(), self->begin(), self->end(), *PYTHON_SELF); } #if defined(SWIGPYTHON_BUILTIN) %feature("python:slot", "tp_iter", functype="getiterfunc") iterator; #else %pythoncode %{def __iter__(self): return self.iterator()%} #endif } #endif //SWIG_EXPORT_ITERATOR_METHODS %enddef /**** The python container methods ****/ %define %swig_container_methods(Container...) /* deprecated in Python 2 */ #if 1 %newobject __getslice__; #endif %newobject __getitem__(PySliceObject *slice); #if defined(SWIGPYTHON_BUILTIN) %feature("python:slot", "nb_nonzero", functype="inquiry") __nonzero__; %feature("python:slot", "sq_length", functype="lenfunc") __len__; #endif // SWIGPYTHON_BUILTIN %extend { bool __nonzero__() const { return !(self->empty()); } /* Alias for Python 3 compatibility */ bool __bool__() const { return !(self->empty()); } size_type __len__() const { return self->size(); } // Although __getitem__, front, back actually use a const value_type& return type, the typemaps below // use non-const so that they can be easily overridden by users if necessary. %typemap(ret, fragment="reference_container_owner", noblock=1) value_type& __getitem__, value_type& front, value_type& back { (void)swig::container_owner::category>::back_reference($result, $self); } } %enddef %define %swig_sequence_methods_common(Sequence...) %swig_sequence_iterator(%arg(Sequence)) %swig_container_methods(%arg(Sequence)) %fragment("SwigPySequence_Base"); #if defined(SWIGPYTHON_BUILTIN) //%feature("python:slot", "sq_item", functype="ssizeargfunc") __getitem__; //%feature("python:slot", "sq_slice", functype="ssizessizeargfunc") __getslice__; //%feature("python:slot", "sq_ass_item", functype="ssizeobjargproc") __setitem__; //%feature("python:slot", "sq_ass_slice", functype="ssizessizeobjargproc") __setslice__; %feature("python:slot", "mp_subscript", functype="binaryfunc") __getitem__; %feature("python:slot", "mp_ass_subscript", functype="objobjargproc") __setitem__; #endif // SWIGPYTHON_BUILTIN %extend { /* typemap for slice object support */ %typemap(in) PySliceObject* { if (!PySlice_Check($input)) { %argument_fail(SWIG_TypeError, "$type", $symname, $argnum); } $1 = (PySliceObject *) $input; } %typemap(typecheck,precedence=SWIG_TYPECHECK_POINTER) PySliceObject* { $1 = PySlice_Check($input); } /* deprecated in Python 2 */ #if 1 Sequence* __getslice__(difference_type i, difference_type j) throw (std::out_of_range, std::invalid_argument) { return swig::getslice(self, i, j, 1); } void __setslice__(difference_type i, difference_type j) throw (std::out_of_range, std::invalid_argument) { swig::setslice(self, i, j, 1, Sequence()); } void __setslice__(difference_type i, difference_type j, const Sequence& v) throw (std::out_of_range, std::invalid_argument) { swig::setslice(self, i, j, 1, v); } void __delslice__(difference_type i, difference_type j) throw (std::out_of_range, std::invalid_argument) { swig::delslice(self, i, j, 1); } #endif void __delitem__(difference_type i) throw (std::out_of_range, std::invalid_argument) { swig::erase(self, swig::getpos(self, i)); } /* Overloaded methods for Python 3 compatibility * (Also useful in Python 2.x) */ Sequence* __getitem__(PySliceObject *slice) throw (std::out_of_range, std::invalid_argument) { Py_ssize_t i, j, step; if( !PySlice_Check(slice) ) { SWIG_Error(SWIG_TypeError, "Slice object expected."); return NULL; } PySlice_GetIndices(SWIGPY_SLICE_ARG(slice), (Py_ssize_t)self->size(), &i, &j, &step); Sequence::difference_type id = i; Sequence::difference_type jd = j; return swig::getslice(self, id, jd, step); } void __setitem__(PySliceObject *slice, const Sequence& v) throw (std::out_of_range, std::invalid_argument) { Py_ssize_t i, j, step; if( !PySlice_Check(slice) ) { SWIG_Error(SWIG_TypeError, "Slice object expected."); return; } PySlice_GetIndices(SWIGPY_SLICE_ARG(slice), (Py_ssize_t)self->size(), &i, &j, &step); Sequence::difference_type id = i; Sequence::difference_type jd = j; swig::setslice(self, id, jd, step, v); } void __setitem__(PySliceObject *slice) throw (std::out_of_range, std::invalid_argument) { Py_ssize_t i, j, step; if( !PySlice_Check(slice) ) { SWIG_Error(SWIG_TypeError, "Slice object expected."); return; } PySlice_GetIndices(SWIGPY_SLICE_ARG(slice), (Py_ssize_t)self->size(), &i, &j, &step); Sequence::difference_type id = i; Sequence::difference_type jd = j; swig::delslice(self, id, jd, step); } void __delitem__(PySliceObject *slice) throw (std::out_of_range, std::invalid_argument) { Py_ssize_t i, j, step; if( !PySlice_Check(slice) ) { SWIG_Error(SWIG_TypeError, "Slice object expected."); return; } PySlice_GetIndices(SWIGPY_SLICE_ARG(slice), (Py_ssize_t)self->size(), &i, &j, &step); Sequence::difference_type id = i; Sequence::difference_type jd = j; swig::delslice(self, id, jd, step); } } %enddef %define %swig_sequence_methods_non_resizable(Sequence...) %swig_sequence_methods_common(%arg(Sequence)) %extend { const value_type& __getitem__(difference_type i) const throw (std::out_of_range) { return *(swig::cgetpos(self, i)); } void __setitem__(difference_type i, const value_type& x) throw (std::out_of_range) { *(swig::getpos(self,i)) = x; } #if defined(SWIGPYTHON_BUILTIN) // This will be called through the mp_ass_subscript slot to delete an entry. void __setitem__(difference_type i) throw (std::out_of_range, std::invalid_argument) { swig::erase(self, swig::getpos(self, i)); } #endif } %enddef %define %swig_sequence_methods(Sequence...) %swig_sequence_methods_non_resizable(%arg(Sequence)) %extend { value_type pop() throw (std::out_of_range) { if (self->size() == 0) throw std::out_of_range("pop from empty container"); Sequence::value_type x = self->back(); self->pop_back(); return x; } void append(const value_type& x) { self->push_back(x); } } %enddef %define %swig_sequence_methods_non_resizable_val(Sequence...) %swig_sequence_methods_common(%arg(Sequence)) %extend { value_type __getitem__(difference_type i) throw (std::out_of_range) { return *(swig::cgetpos(self, i)); } void __setitem__(difference_type i, value_type x) throw (std::out_of_range) { *(swig::getpos(self,i)) = x; } #if defined(SWIGPYTHON_BUILTIN) // This will be called through the mp_ass_subscript slot to delete an entry. void __setitem__(difference_type i) throw (std::out_of_range, std::invalid_argument) { swig::erase(self, swig::getpos(self, i)); } #endif } %enddef %define %swig_sequence_methods_val(Sequence...) %swig_sequence_methods_non_resizable_val(%arg(Sequence)) %extend { value_type pop() throw (std::out_of_range) { if (self->size() == 0) throw std::out_of_range("pop from empty container"); Sequence::value_type x = self->back(); self->pop_back(); return x; } void append(value_type x) { self->push_back(x); } } %enddef // // Common fragments // %fragment("StdSequenceTraits","header", fragment="StdTraits", fragment="SwigPySequence_Cont") { namespace swig { template inline void assign(const SwigPySeq& swigpyseq, Seq* seq) { // seq->assign(swigpyseq.begin(), swigpyseq.end()); // not used as not always implemented typedef typename SwigPySeq::value_type value_type; typename SwigPySeq::const_iterator it = swigpyseq.begin(); for (;it != swigpyseq.end(); ++it) { seq->insert(seq->end(),(value_type)(*it)); } } template struct traits_asptr_stdseq { typedef Seq sequence; typedef T value_type; static int asptr(PyObject *obj, sequence **seq) { if (obj == Py_None || SWIG_Python_GetSwigThis(obj)) { sequence *p; swig_type_info *descriptor = swig::type_info(); if (descriptor && SWIG_IsOK(::SWIG_ConvertPtr(obj, (void **)&p, descriptor, 0))) { if (seq) *seq = p; return SWIG_OLDOBJ; } } else if (PySequence_Check(obj)) { try { SwigPySequence_Cont swigpyseq(obj); if (seq) { sequence *pseq = new sequence(); assign(swigpyseq, pseq); *seq = pseq; return SWIG_NEWOBJ; } else { return swigpyseq.check() ? SWIG_OK : SWIG_ERROR; } } catch (std::exception& e) { if (seq) { if (!PyErr_Occurred()) { PyErr_SetString(PyExc_TypeError, e.what()); } } return SWIG_ERROR; } } return SWIG_ERROR; } }; template struct traits_from_stdseq { typedef Seq sequence; typedef T value_type; typedef typename Seq::size_type size_type; typedef typename sequence::const_iterator const_iterator; static PyObject *from(const sequence& seq) { %#ifdef SWIG_PYTHON_EXTRA_NATIVE_CONTAINERS swig_type_info *desc = swig::type_info(); if (desc && desc->clientdata) { return SWIG_InternalNewPointerObj(new sequence(seq), desc, SWIG_POINTER_OWN); } %#endif size_type size = seq.size(); if (size <= (size_type)INT_MAX) { PyObject *obj = PyTuple_New((Py_ssize_t)size); Py_ssize_t i = 0; for (const_iterator it = seq.begin(); it != seq.end(); ++it, ++i) { PyTuple_SetItem(obj,i,swig::from(*it)); } return obj; } else { PyErr_SetString(PyExc_OverflowError,"sequence size not valid in python"); return NULL; } } }; } } swig-4.0.1/Lib/python/pyuserdir.swg0000644000175000017500000001410313527063513017146 0ustar williamwilliam/* ------------------------------------------------------------------------- * Special user directives * ------------------------------------------------------------------------- */ /* ------------------------------------------------------------------------- */ /* shadow code */ #define %shadow %insert("shadow") #define %pythoncode %insert("python") #define %pythonbegin %insert("pythonbegin") /* ------------------------------------------------------------------------- */ /* Use the "nondynamic" feature to make a wrapped class behave as a "nondynamic" one, ie, a python class that doesn't dynamically add new attributes. For example, for the class %pythonnondynamic A; struct A { int a; int b; }; you will get: aa = A() aa.a = 1 # Ok aa.b = 1 # Ok aa.c = 3 # error Since nondynamic is a feature, if you use it like %pythonnondynamic; it will make all the wrapped classes nondynamic ones. The implementation is based on this recipe: http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/252158 */ #define %pythonnondynamic %feature("python:nondynamic", "1") #define %nopythonnondynamic %feature("python:nondynamic", "0") #define %clearpythonnondynamic %feature("python:nondynamic", "") #define %pythondynamic %nopythonnondynamic /* ------------------------------------------------------------------------- */ /* Use %pythonmaybecall to flag a method like __add__ or __radd__. These don't produce an error when called, they just return NotImplemented. These methods "may be called" if needed. */ #define %pythonmaybecall %feature("python:maybecall", "1") #define %nopythonmaybecall %feature("python:maybecall", "0") #define %clearpythonmaybecall %feature("python:maybecall", "") /* ------------------------------------------------------------------------- */ /* The %pythoncallback feature produce a more natural callback wrapper than the %callback mechanism, ie, it uses the original name for the callback and callable objects. Just use it as %pythoncallback(1) foo; int foo(int a); %pythoncallback(1) A::foo; struct A { static int foo(int a); }; int bar(int, int (*pf)(int)); then, you can use it as: a = foo(1) b = bar(2, foo) c = A.foo(3) d = bar(4, A.foo) If you use it with a member method %pythoncallback(1) A::foom; struct A { int foom(int a); }; then you can use it as r = a.foom(3) # eval the method mptr = A.foom_cb_ptr # returns the callback pointer where the '_cb_ptr' suffix is added for the callback pointer. */ #define %pythoncallback %feature("python:callback") #define %nopythoncallback %feature("python:callback","0") #define %clearpythoncallback %feature("python:callback","") /* ------------------------------------------------------------------------- */ /* Support for the old %callback directive name */ #ifdef %callback #undef %callback #endif #ifdef %nocallback #undef %nocallback #endif #ifdef %clearcallback #undef %clearcallback #endif #define %callback(x) %feature("python:callback",`x`) #define %nocallback %nopythoncallback #define %clearcallback %clearpythoncallback /* ------------------------------------------------------------------------- */ /* Thread support - Advance control */ #define %nothread %feature("nothread") #define %thread %feature("nothread","0") #define %clearnothread %feature("nothread","") #define %nothreadblock %feature("nothreadblock") #define %threadblock %feature("nothreadblock","0") #define %clearnothreadblock %feature("nothreadblock","") #define %nothreadallow %feature("nothreadallow") #define %threadallow %feature("nothreadallow","0") #define %clearnothreadallow %feature("nothreadallow","") /* ------------------------------------------------------------------------- */ /* Implicit Conversion using the C++ constructor mechanism */ #define %implicitconv %feature("implicitconv") #define %noimplicitconv %feature("implicitconv", "0") #define %clearimplicitconv %feature("implicitconv", "") /* ------------------------------------------------------------------------- */ /* Enable keywords parameters */ #define %kwargs %feature("kwargs") #define %nokwargs %feature("kwargs", "0") #define %clearkwargs %feature("kwargs", "") /* ------------------------------------------------------------------------- */ /* Add python code to the proxy/shadow code %pythonprepend - Add code before the C++ function is called %pythonappend - Add code after the C++ function is called */ #define %pythonprepend %feature("pythonprepend") #define %clearpythonprepend %feature("pythonprepend","") #define %pythonappend %feature("pythonappend") #define %clearpythonappend %feature("pythonappend","") /* ------------------------------------------------------------------------- */ /* %extend_smart_pointer extend the smart pointer support. For example, if you have a smart pointer as: template class RCPtr { public: ... RCPtr(Type *p); Type * operator->() const; ... }; you use the %extend_smart_pointer directive as: %extend_smart_pointer(RCPtr); %template(RCPtr_A) RCPtr; then, if you have something like: RCPtr make_ptr(); int foo(A *); you can do the following: a = make_ptr(); b = foo(a); ie, swig will accept a RCPtr object where a 'A *' is expected. Also, when using vectors %extend_smart_pointer(RCPtr); %template(RCPtr_A) RCPtr; %template(vector_A) std::vector >; you can type a = A(); v = vector_A(2) v[0] = a ie, an 'A *' object is accepted, via implicit conversion, where a RCPtr object is expected. Additionally x = v[0] returns (and sets 'x' as) a copy of v[0], making reference counting possible and consistent. */ %define %extend_smart_pointer(Type...) %implicitconv Type; %apply const SWIGTYPE& SMARTPOINTER { const Type& }; %apply SWIGTYPE SMARTPOINTER { Type }; %enddef swig-4.0.1/Lib/python/argcargv.i0000644000175000017500000000512213527063513016345 0ustar williamwilliam/* ------------------------------------------------------------ * --- Argc & Argv --- * ------------------------------------------------------------ */ %fragment("SWIG_AsArgcArgv","header",fragment="SWIG_AsCharPtrAndSize") { SWIGINTERN int SWIG_AsArgcArgv(PyObject *input, swig_type_info *ppchar_info, size_t *argc, char ***argv, int *owner) { void *vptr; int res = SWIG_ConvertPtr(input, &vptr, ppchar_info, 0); if (!SWIG_IsOK(res)) { int list = 0; PyErr_Clear(); list = PyList_Check(input); if (list || PyTuple_Check(input)) { size_t i = 0; size_t size = list ? PyList_Size(input) : PyTuple_Size(input); if (argc) *argc = size; if (argv) { *argv = %new_array(size + 1, char*); for (; i < size; ++i) { PyObject *obj = list ? PyList_GetItem(input,i) : PyTuple_GetItem(input,i); char *cptr = 0; size_t sz = 0; int alloc = 0; res = SWIG_AsCharPtrAndSize(obj, &cptr, &sz, &alloc); if (SWIG_IsOK(res)) { if (cptr && sz) { (*argv)[i] = (alloc == SWIG_NEWOBJ) ? cptr : %new_copy_array(cptr, sz, char); } else { (*argv)[i] = 0; } } else { return SWIG_TypeError; } } (*argv)[i] = 0; if (owner) *owner = 1; } else { for (; i < size; ++i) { PyObject *obj = list ? PyList_GetItem(input,i) : PyTuple_GetItem(input,i); res = SWIG_AsCharPtrAndSize(obj, 0, 0, 0); if (!SWIG_IsOK(res)) return SWIG_TypeError; } if (owner) *owner = 0; } return SWIG_OK; } else { return SWIG_TypeError; } } else { /* seems dangerous, but the user asked for it... */ size_t i = 0; if (argv) { while (*argv[i] != 0) ++i;} if (argc) *argc = i; if (owner) *owner = 0; return SWIG_OK; } } } /* This typemap works with either a char **, a python list or a python tuple */ %typemap(in,noblock=0,fragment="SWIG_AsArgcArgv") (int ARGC, char **ARGV) (int res,char **argv = 0, size_t argc = 0, int owner= 0) { res = SWIG_AsArgcArgv($input, $descriptor(char**), &argc, &argv, &owner); if (!SWIG_IsOK(res)) { $1 = 0; $2 = 0; %argument_fail(SWIG_TypeError, "int ARGC, char **ARGV", $symname, $argnum); } else { $1 = %static_cast(argc,$1_ltype); $2 = %static_cast(argv, $2_ltype); } } %typemap(typecheck, precedence=SWIG_TYPECHECK_STRING_ARRAY) (int ARGC, char **ARGV) { int res = SWIG_AsArgcArgv($input, $descriptor(char**), 0, 0, 0); $1 = SWIG_IsOK(res); } %typemap(freearg,noblock=1) (int ARGC, char **ARGV) { if (owner$argnum) { size_t i = argc$argnum; while (i) { %delete_array(argv$argnum[--i]); } %delete_array(argv$argnum); } } swig-4.0.1/Lib/python/implicit.i0000644000175000017500000000043713527063513016367 0ustar williamwilliam%include %include #warning "This file provides the %implicit directive, which is an old and fragile" #warning "way to implement the C++ implicit conversion mechanism." #warning "Try using the more robust '%implicitconv Type;' directive instead." swig-4.0.1/Lib/python/std_streambuf.i0000644000175000017500000000003713527063513017413 0ustar williamwilliam%include swig-4.0.1/Lib/python/std_common.i0000644000175000017500000000441713527063513016721 0ustar williamwilliam%include %include /* Generate the traits for a 'primitive' type, such as 'double', for which the SWIG_AsVal and SWIG_From methods are already defined. */ %define %traits_ptypen(Type...) %fragment(SWIG_Traits_frag(Type),"header", fragment=SWIG_AsVal_frag(Type), fragment=SWIG_From_frag(Type), fragment="StdTraits") { namespace swig { template <> struct traits< Type > { typedef value_category category; static const char* type_name() { return #Type; } }; template <> struct traits_asval< Type > { typedef Type value_type; static int asval(PyObject *obj, value_type *val) { return SWIG_AsVal(Type)(obj, val); } }; template <> struct traits_from< Type > { typedef Type value_type; static PyObject *from(const value_type& val) { return SWIG_From(Type)(val); } }; } } %enddef /* Traits for enums. This is bit of a sneaky trick needed because a generic template specialization of enums is not possible (unless using template meta-programming which SWIG doesn't support because of the explicit instantiations required using %template). The STL containers define the 'front' method and the typemap below is used whenever the front method is wrapped returning an enum. This typemap simply picks up the standard enum typemap, but additionally drags in a fragment containing the traits_asval and traits_from required in the generated code for enums. */ %define %traits_enum(Type...) %fragment("SWIG_Traits_enum_"{Type},"header", fragment=SWIG_AsVal_frag(int), fragment=SWIG_From_frag(int), fragment="StdTraits") { namespace swig { template <> struct traits_asval< Type > { typedef Type value_type; static int asval(PyObject *obj, value_type *val) { return SWIG_AsVal(int)(obj, (int *)val); } }; template <> struct traits_from< Type > { typedef Type value_type; static PyObject *from(const value_type& val) { return SWIG_From(int)((int)val); } }; } } %typemap(out, fragment="SWIG_Traits_enum_"{Type}) const enum SWIGTYPE& front %{$typemap(out, const enum SWIGTYPE&)%} %enddef %include // // Generates the traits for all the known primitive // C++ types (int, double, ...) // %apply_cpptypes(%traits_ptypen); swig-4.0.1/Lib/python/std_wstreambuf.i0000644000175000017500000000004013527063513017574 0ustar williamwilliam%include swig-4.0.1/Lib/python/pytypemaps.swg0000644000175000017500000000620113527063513017333 0ustar williamwilliam/* ------------------------------------------------------------ * Typemap specializations for Python * ------------------------------------------------------------ */ /* ------------------------------------------------------------ * Fragment section * ------------------------------------------------------------ */ #ifdef SWIG_PYTHON_LEGACY_BOOL // Default prior to SWIG 3.0.0 #undef SWIG_TYPECHECK_BOOL %define SWIG_TYPECHECK_BOOL 10000 %enddef #endif /* Include fundamental fragment definitions */ %include /* Look for user fragments file. */ %include /* Python fragments for fundamental types */ %include /* Python fragments for char* strings */ %include /* Backward compatibility output helper */ %fragment("t_output_helper","header") %{ #define t_output_helper SWIG_Python_AppendOutput %} /* ------------------------------------------------------------ * Unified typemap section * ------------------------------------------------------------ */ /* directors are supported in Python */ #ifndef SWIG_DIRECTOR_TYPEMAPS #define SWIG_DIRECTOR_TYPEMAPS #endif /* Python types */ #define SWIG_Object PyObject * #define VOID_Object SWIG_Py_Void() /* Python allows implicit conversion */ #define %implicitconv_flag $implicitconv /* Overload of the output/constant/exception/dirout handling */ /* append output */ #define SWIG_AppendOutput(result, obj) SWIG_Python_AppendOutput(result, obj) /* set constant */ #if defined(SWIGPYTHON_BUILTIN) #define SWIG_SetConstant(name, obj) SWIG_Python_SetConstant(d, d == md ? public_interface : NULL, name,obj) #else #define SWIG_SetConstant(name, obj) SWIG_Python_SetConstant(d, name,obj) #endif /* raise */ #define SWIG_Raise(obj, type, desc) SWIG_Python_Raise(obj, type, desc) /* Include the unified typemap library */ %include /* ------------------------------------------------------------ * Python extra typemaps / typemap overrides * ------------------------------------------------------------ */ /* Get the address of the 'python self' object */ %typemap(in,numinputs=0,noblock=1) PyObject **PYTHON_SELF { $1 = &$self; } /* Consttab, needed for callbacks, it should be removed later */ %typemap(consttab) SWIGTYPE ((*)(ANY)) { SWIG_PY_POINTER, "$symname", 0, 0, (void *)($value), &$descriptor } %typemap(consttab) SWIGTYPE ((* const)(ANY)) = SWIGTYPE ((*)(ANY)); %typemap(constcode) SWIGTYPE ((*)(ANY)) ""; %typemap(constcode) SWIGTYPE ((* const)(ANY)) = SWIGTYPE ((*)(ANY)); /* Smart Pointers */ %typemap(out,noblock=1) const SWIGTYPE & SMARTPOINTER { $result = SWIG_NewPointerObj(%new_copy(*$1, $*ltype), $descriptor, SWIG_POINTER_OWN | %newpointer_flags); } %typemap(ret,noblock=1) const SWIGTYPE & SMARTPOINTER, SWIGTYPE SMARTPOINTER { if ($result) { PyObject *robj = PyObject_CallMethod($result, (char *)"__deref__", NULL); if (robj && !PyErr_Occurred()) { SwigPyObject_append((PyObject *) SWIG_Python_GetSwigThis($result), (PyObject *) SWIG_Python_GetSwigThis(robj)); Py_DECREF(robj); } } } swig-4.0.1/Lib/python/std_wsstream.i0000644000175000017500000000003613527063513017267 0ustar williamwilliam%include swig-4.0.1/Lib/python/std_except.i0000644000175000017500000000004313527063513016710 0ustar williamwilliam%include swig-4.0.1/Lib/python/complex.i0000644000175000017500000000012013527063513016211 0ustar williamwilliam#ifdef __cplusplus %include #else %include #endif swig-4.0.1/Lib/python/pybackward.swg0000644000175000017500000000221213527063513017245 0ustar williamwilliam/* adding backward compatibility macros */ #define SWIG_arg(x...) %arg(x) #define SWIG_Mangle(x...) %mangle(x) #define SWIG_As_frag(Type...) %fragment_name(As, Type) #define SWIG_As_name(Type...) %symbol_name(As, Type) #define SWIG_As(Type...) SWIG_As_name(Type) SWIG_AS_CALL_ARGS #define SWIG_Check_frag(Type...) %fragment_name(Check, Type) #define SWIG_Check_name(Type...) %symbol_name(Check, Type) #define SWIG_Check(Type...) SWIG_Check_name(Type) SWIG_AS_CALL_ARGS %define %ascheck_methods(Code, Type...) %fragment(SWIG_As_frag(Type),"header", fragment=SWIG_AsVal_frag(Type)) { SWIGINTERNINLINE Type SWIG_As(Type)(PyObject* obj) { Type v; int res = SWIG_AsVal(Type)(obj, &v); if (!SWIG_IsOK(res)) { /* this is needed to make valgrind/purify happier. */ memset((void*)&v, 0, sizeof(Type)); SWIG_Error(res, ""); } return v; } } %fragment(SWIG_Check_frag(Type),"header",fragment=SWIG_AsVal_frag(Type)) { SWIGINTERNINLINE int SWIG_Check(Type)(PyObject* obj) { int res = SWIG_AsVal(Type)(obj, (Type*)0); return SWIG_IsOK(res); } } %enddef %apply_checkctypes(%ascheck_methods) swig-4.0.1/Lib/python/typemaps.i0000644000175000017500000001054513527063513016420 0ustar williamwilliam/* ----------------------------------------------------------------------------- * typemaps.i * * Pointer handling * These mappings provide support for input/output arguments and common * uses for C/C++ pointers. * ----------------------------------------------------------------------------- */ // INPUT typemaps. // These remap a C pointer to be an "INPUT" value which is passed by value // instead of reference. /* The following methods can be applied to turn a pointer into a simple "input" value. That is, instead of passing a pointer to an object, you would use a real value instead. int *INPUT short *INPUT long *INPUT long long *INPUT unsigned int *INPUT unsigned short *INPUT unsigned long *INPUT unsigned long long *INPUT unsigned char *INPUT bool *INPUT float *INPUT double *INPUT To use these, suppose you had a C function like this : double fadd(double *a, double *b) { return *a+*b; } You could wrap it with SWIG as follows : %include double fadd(double *INPUT, double *INPUT); or you can use the %apply directive : %include %apply double *INPUT { double *a, double *b }; double fadd(double *a, double *b); */ // OUTPUT typemaps. These typemaps are used for parameters that // are output only. The output value is appended to the result as // a list element. /* The following methods can be applied to turn a pointer into an "output" value. When calling a function, no input value would be given for a parameter, but an output value would be returned. In the case of multiple output values, they are returned in the form of a Python tuple. int *OUTPUT short *OUTPUT long *OUTPUT long long *OUTPUT unsigned int *OUTPUT unsigned short *OUTPUT unsigned long *OUTPUT unsigned long long *OUTPUT unsigned char *OUTPUT bool *OUTPUT float *OUTPUT double *OUTPUT For example, suppose you were trying to wrap the modf() function in the C math library which splits x into integral and fractional parts (and returns the integer part in one of its parameters).K: double modf(double x, double *ip); You could wrap it with SWIG as follows : %include double modf(double x, double *OUTPUT); or you can use the %apply directive : %include %apply double *OUTPUT { double *ip }; double modf(double x, double *ip); The Python output of the function would be a tuple containing both output values. */ // INOUT // Mappings for an argument that is both an input and output // parameter /* The following methods can be applied to make a function parameter both an input and output value. This combines the behavior of both the "INPUT" and "OUTPUT" methods described earlier. Output values are returned in the form of a Python tuple. int *INOUT short *INOUT long *INOUT long long *INOUT unsigned int *INOUT unsigned short *INOUT unsigned long *INOUT unsigned long long *INOUT unsigned char *INOUT bool *INOUT float *INOUT double *INOUT For example, suppose you were trying to wrap the following function : void neg(double *x) { *x = -(*x); } You could wrap it with SWIG as follows : %include void neg(double *INOUT); or you can use the %apply directive : %include %apply double *INOUT { double *x }; void neg(double *x); Unlike C, this mapping does not directly modify the input value (since this makes no sense in Python). Rather, the modified input value shows up as the return value of the function. Thus, to apply this function to a Python variable you might do this : x = neg(x) Note : previous versions of SWIG used the symbol 'BOTH' to mark input/output arguments. This is still supported, but will be slowly phased out in future releases. */ %include swig-4.0.1/Lib/python/pyprimtypes.swg0000644000175000017500000001760613527063513017540 0ustar williamwilliam/* ------------------------------------------------------------ * Primitive Types * ------------------------------------------------------------ */ /* boolean */ %fragment(SWIG_From_frag(bool),"header") { SWIGINTERNINLINE PyObject* SWIG_From_dec(bool)(bool value) { return PyBool_FromLong(value ? 1 : 0); } } #ifdef SWIG_PYTHON_LEGACY_BOOL // Default prior to SWIG 3.0.0 %fragment(SWIG_AsVal_frag(bool),"header", fragment=SWIG_AsVal_frag(long)) { SWIGINTERN int SWIG_AsVal_dec(bool)(PyObject *obj, bool *val) { int r = PyObject_IsTrue(obj); if (r == -1) return SWIG_ERROR; if (val) *val = r ? true : false; return SWIG_OK; } } #else %fragment(SWIG_AsVal_frag(bool),"header", fragment=SWIG_AsVal_frag(long)) { SWIGINTERN int SWIG_AsVal_dec(bool)(PyObject *obj, bool *val) { int r; if (!PyBool_Check(obj)) return SWIG_ERROR; r = PyObject_IsTrue(obj); if (r == -1) return SWIG_ERROR; if (val) *val = r ? true : false; return SWIG_OK; } } #endif /* int */ %fragment(SWIG_From_frag(int),"header") { SWIGINTERNINLINE PyObject* SWIG_From_dec(int)(int value) { return PyInt_FromLong((long) value); } } /* unsigned int */ %fragment(SWIG_From_frag(unsigned int),"header") { SWIGINTERNINLINE PyObject* SWIG_From_dec(unsigned int)(unsigned int value) { return PyInt_FromSize_t((size_t) value); } } /* long */ %fragment(SWIG_From_frag(long),"header") { %define_as(SWIG_From_dec(long), PyInt_FromLong) } %fragment(SWIG_AsVal_frag(long),"header", fragment="SWIG_CanCastAsInteger") { SWIGINTERN int SWIG_AsVal_dec(long)(PyObject *obj, long* val) { %#if PY_VERSION_HEX < 0x03000000 if (PyInt_Check(obj)) { if (val) *val = PyInt_AsLong(obj); return SWIG_OK; } else %#endif if (PyLong_Check(obj)) { long v = PyLong_AsLong(obj); if (!PyErr_Occurred()) { if (val) *val = v; return SWIG_OK; } else { PyErr_Clear(); return SWIG_OverflowError; } } %#ifdef SWIG_PYTHON_CAST_MODE { int dispatch = 0; long v = PyInt_AsLong(obj); if (!PyErr_Occurred()) { if (val) *val = v; return SWIG_AddCast(SWIG_OK); } else { PyErr_Clear(); } if (!dispatch) { double d; int res = SWIG_AddCast(SWIG_AsVal(double)(obj,&d)); if (SWIG_IsOK(res) && SWIG_CanCastAsInteger(&d, LONG_MIN, LONG_MAX)) { if (val) *val = (long)(d); return res; } } } %#endif return SWIG_TypeError; } } /* unsigned long */ %fragment(SWIG_From_frag(unsigned long),"header", fragment=SWIG_From_frag(long)) { SWIGINTERNINLINE PyObject* SWIG_From_dec(unsigned long)(unsigned long value) { return (value > LONG_MAX) ? PyLong_FromUnsignedLong(value) : PyInt_FromLong(%numeric_cast(value,long)); } } %fragment(SWIG_AsVal_frag(unsigned long),"header", fragment="SWIG_CanCastAsInteger") { SWIGINTERN int SWIG_AsVal_dec(unsigned long)(PyObject *obj, unsigned long *val) { %#if PY_VERSION_HEX < 0x03000000 if (PyInt_Check(obj)) { long v = PyInt_AsLong(obj); if (v >= 0) { if (val) *val = v; return SWIG_OK; } else { return SWIG_OverflowError; } } else %#endif if (PyLong_Check(obj)) { unsigned long v = PyLong_AsUnsignedLong(obj); if (!PyErr_Occurred()) { if (val) *val = v; return SWIG_OK; } else { PyErr_Clear(); return SWIG_OverflowError; } } %#ifdef SWIG_PYTHON_CAST_MODE { int dispatch = 0; unsigned long v = PyLong_AsUnsignedLong(obj); if (!PyErr_Occurred()) { if (val) *val = v; return SWIG_AddCast(SWIG_OK); } else { PyErr_Clear(); } if (!dispatch) { double d; int res = SWIG_AddCast(SWIG_AsVal(double)(obj,&d)); if (SWIG_IsOK(res) && SWIG_CanCastAsInteger(&d, 0, ULONG_MAX)) { if (val) *val = (unsigned long)(d); return res; } } } %#endif return SWIG_TypeError; } } /* long long */ %fragment(SWIG_From_frag(long long),"header", fragment="SWIG_LongLongAvailable") { %#ifdef SWIG_LONG_LONG_AVAILABLE SWIGINTERNINLINE PyObject* SWIG_From_dec(long long)(long long value) { return ((value < LONG_MIN) || (value > LONG_MAX)) ? PyLong_FromLongLong(value) : PyInt_FromLong(%numeric_cast(value,long)); } %#endif } %fragment(SWIG_AsVal_frag(long long),"header", fragment=SWIG_AsVal_frag(long), fragment="SWIG_CanCastAsInteger", fragment="SWIG_LongLongAvailable") { %#ifdef SWIG_LONG_LONG_AVAILABLE SWIGINTERN int SWIG_AsVal_dec(long long)(PyObject *obj, long long *val) { int res = SWIG_TypeError; if (PyLong_Check(obj)) { long long v = PyLong_AsLongLong(obj); if (!PyErr_Occurred()) { if (val) *val = v; return SWIG_OK; } else { PyErr_Clear(); res = SWIG_OverflowError; } } else { long v; res = SWIG_AsVal(long)(obj,&v); if (SWIG_IsOK(res)) { if (val) *val = v; return res; } } %#ifdef SWIG_PYTHON_CAST_MODE { const double mant_max = 1LL << DBL_MANT_DIG; const double mant_min = -mant_max; double d; res = SWIG_AsVal(double)(obj,&d); if (SWIG_IsOK(res) && !SWIG_CanCastAsInteger(&d, mant_min, mant_max)) return SWIG_OverflowError; if (SWIG_IsOK(res) && SWIG_CanCastAsInteger(&d, mant_min, mant_max)) { if (val) *val = (long long)(d); return SWIG_AddCast(res); } res = SWIG_TypeError; } %#endif return res; } %#endif } /* unsigned long long */ %fragment(SWIG_From_frag(unsigned long long),"header", fragment="SWIG_LongLongAvailable") { %#ifdef SWIG_LONG_LONG_AVAILABLE SWIGINTERNINLINE PyObject* SWIG_From_dec(unsigned long long)(unsigned long long value) { return (value > LONG_MAX) ? PyLong_FromUnsignedLongLong(value) : PyInt_FromLong(%numeric_cast(value,long)); } %#endif } %fragment(SWIG_AsVal_frag(unsigned long long),"header", fragment=SWIG_AsVal_frag(unsigned long), fragment="SWIG_CanCastAsInteger", fragment="SWIG_LongLongAvailable") { %#ifdef SWIG_LONG_LONG_AVAILABLE SWIGINTERN int SWIG_AsVal_dec(unsigned long long)(PyObject *obj, unsigned long long *val) { int res = SWIG_TypeError; if (PyLong_Check(obj)) { unsigned long long v = PyLong_AsUnsignedLongLong(obj); if (!PyErr_Occurred()) { if (val) *val = v; return SWIG_OK; } else { PyErr_Clear(); res = SWIG_OverflowError; } } else { unsigned long v; res = SWIG_AsVal(unsigned long)(obj,&v); if (SWIG_IsOK(res)) { if (val) *val = v; return res; } } %#ifdef SWIG_PYTHON_CAST_MODE { const double mant_max = 1LL << DBL_MANT_DIG; double d; res = SWIG_AsVal(double)(obj,&d); if (SWIG_IsOK(res) && !SWIG_CanCastAsInteger(&d, 0, mant_max)) return SWIG_OverflowError; if (SWIG_IsOK(res) && SWIG_CanCastAsInteger(&d, 0, mant_max)) { if (val) *val = (unsigned long long)(d); return SWIG_AddCast(res); } res = SWIG_TypeError; } %#endif return res; } %#endif } /* double */ %fragment(SWIG_From_frag(double),"header") { %define_as(SWIG_From_dec(double), PyFloat_FromDouble) } %fragment(SWIG_AsVal_frag(double),"header") { SWIGINTERN int SWIG_AsVal_dec(double)(PyObject *obj, double *val) { int res = SWIG_TypeError; if (PyFloat_Check(obj)) { if (val) *val = PyFloat_AsDouble(obj); return SWIG_OK; %#if PY_VERSION_HEX < 0x03000000 } else if (PyInt_Check(obj)) { if (val) *val = (double) PyInt_AsLong(obj); return SWIG_OK; %#endif } else if (PyLong_Check(obj)) { double v = PyLong_AsDouble(obj); if (!PyErr_Occurred()) { if (val) *val = v; return SWIG_OK; } else { PyErr_Clear(); } } %#ifdef SWIG_PYTHON_CAST_MODE { int dispatch = 0; double d = PyFloat_AsDouble(obj); if (!PyErr_Occurred()) { if (val) *val = d; return SWIG_AddCast(SWIG_OK); } else { PyErr_Clear(); } if (!dispatch) { long v = PyLong_AsLong(obj); if (!PyErr_Occurred()) { if (val) *val = v; return SWIG_AddCast(SWIG_AddCast(SWIG_OK)); } else { PyErr_Clear(); } } } %#endif return res; } } swig-4.0.1/Lib/python/pyopers.swg0000644000175000017500000002375713527063513016640 0ustar williamwilliam/* ------------------------------------------------------------ * Overloaded operator support The directives in this file apply whether or not you use the -builtin option to SWIG, but operator overloads are particularly attractive when using -builtin, because they are much faster than named methods. If you're using the -builtin option to SWIG, and you want to define python operator overloads beyond the defaults defined in this file, here's what you need to know: There are two ways to define a python slot function: dispatch to a statically defined function; or dispatch to a method defined on the operand. To dispatch to a statically defined function, use %feature("python:"), where is the name of a field in a PyTypeObject, PyNumberMethods, PyMappingMethods, PySequenceMethods, or PyBufferProcs. For example: %feature("python:tp_hash") MyClass "myHashFunc"; class MyClass { public: ... }; %{ // Note: Py_hash_t was introduced in Python 3.2 static Py_hash_t myHashFunc(PyObject *pyobj) { MyClass *cobj; // Convert pyobj to cobj return (cobj->field1 * (cobj->field2 << 7)); } %} NOTE: It is the responsibility of the programmer (that's you) to ensure that a statically defined slot function has the correct signature. If, instead, you want to dispatch to an instance method, you can use %feature("python:slot"). For example: %feature("python:slot", "tp_hash", functype="hashfunc") MyClass::myHashFunc; class MyClass { public: Py_hash_t myHashFunc () const; ... }; NOTE: Some python slots use a method signature which does not match the signature of SWIG-wrapped methods. For those slots, SWIG will automatically generate a "closure" function to re-marshall the arguments before dispatching to the wrapped method. Setting the "functype" attribute of the feature enables SWIG to generate a correct closure function. -------------------------------------------------------------- The tp_richcompare slot is a special case: SWIG automatically generates a rich compare function for all wrapped types. If a type defines C++ operator overloads for comparison (operator==, operator<, etc.), they will be called from the generated rich compare function. If you want to explicitly choose a method to handle a certain comparison operation, you may use a different feature, %feature("python:compare") like this: %feature("python:compare", "Py_LT") MyClass::lessThan; class MyClass { public: bool lessThan(const MyClass& other) const; ... }; ... where "Py_LT" is one of the rich comparison opcodes defined in the python header file object.h. If there's no method defined to handle a particular comparison operation, the default behavior is to compare pointer values of the wrapped C++ objects. -------------------------------------------------------------- For more information about python slots, including their names and signatures, you may refer to the python documentation : http://docs.python.org/c-api/typeobj.html * ------------------------------------------------------------ */ #ifdef __cplusplus #if defined(SWIGPYTHON_BUILTIN) #define %pybinoperator(pyname,oper,functp,slt) %rename(pyname) oper; %pythonmaybecall oper; %feature("python:slot", #slt, functype=#functp) oper; %feature("python:slot", #slt, functype=#functp) pyname; #define %pycompare(pyname,oper,comptype) %rename(pyname) oper; %pythonmaybecall oper; %feature("python:compare", #comptype) oper; %feature("python:compare", #comptype) pyname; #else #define %pybinoperator(pyname,oper,functp,slt) %rename(pyname) oper; %pythonmaybecall oper #define %pycompare(pyname,oper,comptype) %pybinoperator(pyname,oper,,comptype) #endif %pybinoperator(__add__, *::operator+, binaryfunc, nb_add); %pybinoperator(__pos__, *::operator+(), unaryfunc, nb_positive); %pybinoperator(__pos__, *::operator+() const, unaryfunc, nb_positive); %pybinoperator(__sub__, *::operator-, binaryfunc, nb_subtract); %pybinoperator(__neg__, *::operator-(), unaryfunc, nb_negative); %pybinoperator(__neg__, *::operator-() const, unaryfunc, nb_negative); %pybinoperator(__mul__, *::operator*, binaryfunc, nb_multiply); %pybinoperator(__mod__, *::operator%, binaryfunc, nb_remainder); %pybinoperator(__lshift__, *::operator<<, binaryfunc, nb_lshift); %pybinoperator(__rshift__, *::operator>>, binaryfunc, nb_rshift); %pybinoperator(__and__, *::operator&, binaryfunc, nb_and); %pybinoperator(__or__, *::operator|, binaryfunc, nb_or); %pybinoperator(__xor__, *::operator^, binaryfunc, nb_xor); %pycompare(__lt__, *::operator<, Py_LT); %pycompare(__le__, *::operator<=, Py_LE); %pycompare(__gt__, *::operator>, Py_GT); %pycompare(__ge__, *::operator>=, Py_GE); %pycompare(__eq__, *::operator==, Py_EQ); %pycompare(__ne__, *::operator!=, Py_NE); /* Special cases */ %rename(__invert__) *::operator~; %feature("python:slot", "nb_invert", functype="unaryfunc") *::operator~; %rename(__call__) *::operator(); %feature("python:slot", "tp_call", functype="ternarycallfunc") *::operator(); #if defined(SWIGPYTHON_BUILTIN) %pybinoperator(__nonzero__, *::operator bool, inquiry, nb_nonzero); %pybinoperator(__truediv__, *::operator/ , binaryfunc, nb_divide); #else %feature("shadow") *::operator bool %{ def __nonzero__(self): return $action(self) __bool__ = __nonzero__ %}; %rename(__nonzero__) *::operator bool; %feature("shadow") *::operator/ %{ def __truediv__(self, *args): return $action(self, *args) __div__ = __truediv__ %}; %rename(__truediv__) *::operator/; %pythonmaybecall *::operator/; #endif /* Ignored operators */ %ignoreoperator(LNOT) operator!; %ignoreoperator(LAND) operator&&; %ignoreoperator(LOR) operator||; %ignoreoperator(EQ) *::operator=; %ignoreoperator(PLUSPLUS) *::operator++; %ignoreoperator(MINUSMINUS) *::operator--; %ignoreoperator(ARROWSTAR) *::operator->*; %ignoreoperator(INDEX) *::operator[]; /* Inplace operator declarations. They translate the inplace C++ operators (+=, -=, ...) into the corresponding python equivalents(__iadd__,__isub__), etc, disabling the ownership of the input 'this' pointer, and assigning it to the returning object: %feature("del") *::Operator; // disables ownership by generating SWIG_POINTER_DISOWN %feature("new") *::Operator; // claims ownership by generating SWIG_POINTER_OWN This makes the most common case safe, ie: A& A::operator+=(int i) { ...; return *this; } ^^^^ ^^^^^^ will work fine, even when the resulting python object shares the 'this' pointer with the input one. The input object is usually deleted after the operation, including the shared 'this' pointer, producing 'strange' seg faults, as reported by Lucriz (lucriz@sitilandia.it). If you have an interface that already takes care of that, ie, you already are using inplace operators and you are not getting seg. faults, with the new scheme you could end with 'free' elements that never get deleted (maybe, not sure, it depends). But if that is the case, you could recover the old behaviour using %feature("del","0") A::operator+=; %feature("new","0") A::operator+=; which recovers the old behaviour for the class 'A', or if you are 100% sure your entire system works fine in the old way, use: %feature("del","") *::operator+=; %feature("new","") *::operator+=; The default behaviour assumes that the 'this' pointer's memory is already owned by the SWIG object; it relinquishes ownership then takes it back. This may not be the case though as the SWIG object might be owned by memory managed elsewhere, eg after calling a function that returns a C++ reference. In such case you will need to use the features above to recover the old behaviour too. */ #if defined(SWIGPYTHON_BUILTIN) #define %pyinplaceoper(SwigPyOper, Oper, functp, slt) %delobject Oper; %newobject Oper; %feature("python:slot", #slt, functype=#functp) Oper; %rename(SwigPyOper) Oper #else #define %pyinplaceoper(SwigPyOper, Oper, functp, slt) %delobject Oper; %newobject Oper; %rename(SwigPyOper) Oper #endif %pyinplaceoper(__iadd__ , *::operator +=, binaryfunc, nb_inplace_add); %pyinplaceoper(__isub__ , *::operator -=, binaryfunc, nb_inplace_subtract); %pyinplaceoper(__imul__ , *::operator *=, binaryfunc, nb_inplace_multiply); %pyinplaceoper(__imod__ , *::operator %=, binaryfunc, nb_inplace_remainder); %pyinplaceoper(__iand__ , *::operator &=, binaryfunc, nb_inplace_and); %pyinplaceoper(__ior__ , *::operator |=, binaryfunc, nb_inplace_or); %pyinplaceoper(__ixor__ , *::operator ^=, binaryfunc, nb_inplace_xor); %pyinplaceoper(__ilshift__, *::operator <<=, binaryfunc, nb_inplace_lshift); %pyinplaceoper(__irshift__, *::operator >>=, binaryfunc, nb_inplace_rshift); /* Special cases */ #if defined(SWIGPYTHON_BUILTIN) %pyinplaceoper(__itruediv__ , *::operator /=, binaryfunc, nb_inplace_divide); #else %delobject *::operator /=; %newobject *::operator /=; %feature("shadow") *::operator /= %{ def __itruediv__(self, *args): return $action(self, *args) __idiv__ = __itruediv__ %}; %rename(__itruediv__) *::operator /=; #endif /* Finally, in python we need to mark the binary operations to fail as 'maybecall' methods */ #define %pybinopermaybecall(oper) %pythonmaybecall __ ## oper ## __; %pythonmaybecall __r ## oper ## __ %pybinopermaybecall(add); %pybinopermaybecall(pos); %pybinopermaybecall(pos); %pybinopermaybecall(sub); %pybinopermaybecall(neg); %pybinopermaybecall(neg); %pybinopermaybecall(mul); %pybinopermaybecall(div); %pybinopermaybecall(truediv); %pybinopermaybecall(mod); %pybinopermaybecall(lshift); %pybinopermaybecall(rshift); %pybinopermaybecall(and); %pybinopermaybecall(or); %pybinopermaybecall(xor); %pybinopermaybecall(lt); %pybinopermaybecall(le); %pybinopermaybecall(gt); %pybinopermaybecall(ge); %pybinopermaybecall(eq); %pybinopermaybecall(ne); #endif swig-4.0.1/Lib/python/std_array.i0000644000175000017500000000715513527063513016551 0ustar williamwilliam/* std::array */ %fragment("StdArrayTraits","header",fragment="StdSequenceTraits") %{ namespace swig { template struct traits_asptr > { static int asptr(PyObject *obj, std::array **vec) { return traits_asptr_stdseq >::asptr(obj, vec); } }; template struct traits_from > { static PyObject *from(const std::array& vec) { return traits_from_stdseq >::from(vec); } }; template inline void assign(const SwigPySeq& swigpyseq, std::array* seq) { if (swigpyseq.size() < seq->size()) throw std::invalid_argument("std::array cannot be expanded in size"); else if (swigpyseq.size() > seq->size()) throw std::invalid_argument("std::array cannot be reduced in size"); std::copy(swigpyseq.begin(), swigpyseq.end(), seq->begin()); } template inline void erase(std::array* SWIGUNUSEDPARM(seq), const typename std::array::iterator& SWIGUNUSEDPARM(position)) { throw std::invalid_argument("std::array object does not support item deletion"); } // Only limited slicing is supported as std::array is fixed in size template inline std::array* getslice(const std::array* self, Difference i, Difference j, Py_ssize_t step) { typedef std::array Sequence; typename Sequence::size_type size = self->size(); Difference ii = 0; Difference jj = 0; swig::slice_adjust(i, j, step, size, ii, jj); if (step == 1 && ii == 0 && static_cast(jj) == size) { Sequence *sequence = new Sequence(); std::copy(self->begin(), self->end(), sequence->begin()); return sequence; } else if (step == -1 && static_cast(ii) == (size - 1) && jj == -1) { Sequence *sequence = new Sequence(); std::copy(self->rbegin(), self->rend(), sequence->begin()); return sequence; } else { throw std::invalid_argument("std::array object only supports getting a slice that is the size of the array"); } } template inline void setslice(std::array* self, Difference i, Difference j, Py_ssize_t step, const InputSeq& is = InputSeq()) { typedef std::array Sequence; typename Sequence::size_type size = self->size(); Difference ii = 0; Difference jj = 0; swig::slice_adjust(i, j, step, size, ii, jj, true); if (step == 1 && ii == 0 && static_cast(jj) == size) { std::copy(is.begin(), is.end(), self->begin()); } else if (step == -1 && static_cast(ii) == (size - 1) && jj == -1) { std::copy(is.rbegin(), is.rend(), self->begin()); } else { throw std::invalid_argument("std::array object only supports setting a slice that is the size of the array"); } } template inline void delslice(std::array* SWIGUNUSEDPARM(self), Difference SWIGUNUSEDPARM(i), Difference SWIGUNUSEDPARM(j), Py_ssize_t SWIGUNUSEDPARM(step)) { throw std::invalid_argument("std::array object does not support item deletion"); } } %} #define %swig_array_methods(Type...) %swig_sequence_methods_non_resizable(Type) #define %swig_array_methods_val(Type...) %swig_sequence_methods_non_resizable_val(Type); %include swig-4.0.1/Lib/python/embed.i0000644000175000017500000000474213527063513015634 0ustar williamwilliam// // embed.i // SWIG file embedding the Python interpreter in something else. // This file is deprecated and no longer actively maintained, but it still // seems to work with Python 2.7. Status with Python 3 is unknown. // // This file makes it possible to extend Python and all of its // built-in functions without having to hack its setup script. // #ifdef AUTODOC %subsection "embed.i" %text %{ This module provides support for building a new version of the Python executable. This will be necessary on systems that do not support shared libraries and may be necessary with C++ extensions. This file contains everything you need to build a new version of Python from include files and libraries normally installed with the Python language. This module will automatically grab all of the Python modules present in your current Python executable (including any special purpose modules you have enabled such as Tkinter). Thus, you may need to provide additional link libraries when compiling. As far as I know, this module is C++ safe. %} #endif %wrapper %{ #include #ifdef __cplusplus extern "C" #endif void SWIG_init(); /* Forward reference */ #define _PyImport_Inittab swig_inittab /* Grab Python's inittab[] structure */ #ifdef __cplusplus extern "C" { #endif #include #undef _PyImport_Inittab /* Now define our own version of it. Hopefully someone does not have more than 1000 built-in modules */ struct _inittab SWIG_Import_Inittab[1000]; static int swig_num_modules = 0; /* Function for adding modules to Python */ static void swig_add_module(char *name, void (*initfunc)()) { SWIG_Import_Inittab[swig_num_modules].name = name; SWIG_Import_Inittab[swig_num_modules].initfunc = initfunc; swig_num_modules++; SWIG_Import_Inittab[swig_num_modules].name = (char *) 0; SWIG_Import_Inittab[swig_num_modules].initfunc = 0; } /* Function to add all of Python's built-in modules to our interpreter */ static void swig_add_builtin() { int i = 0; while (swig_inittab[i].name) { swig_add_module(swig_inittab[i].name, swig_inittab[i].initfunc); i++; } #ifdef SWIGMODINIT SWIGMODINIT #endif /* Add SWIG builtin function */ swig_add_module(SWIG_name, SWIG_init); } #ifdef __cplusplus } #endif #ifdef __cplusplus extern "C" { #endif extern int Py_Main(int, char **); #ifdef __cplusplus } #endif extern struct _inittab *PyImport_Inittab; int main(int argc, char **argv) { swig_add_builtin(); PyImport_Inittab = SWIG_Import_Inittab; return Py_Main(argc,argv); } %} swig-4.0.1/Lib/python/carrays.i0000644000175000017500000000052213527063513016214 0ustar williamwilliam%define %array_class(TYPE,NAME) #if defined(SWIGPYTHON_BUILTIN) %feature("python:slot", "sq_item", functype="ssizeargfunc") NAME::__getitem__; %feature("python:slot", "sq_ass_item", functype="ssizeobjargproc") NAME::__setitem__; #endif %array_class_wrap(TYPE,NAME,__getitem__,__setitem__) %enddef %include swig-4.0.1/Lib/python/pystdcommon.swg0000644000175000017500000001522613527063513017503 0ustar williamwilliam%fragment("StdTraits","header",fragment="StdTraitsCommon") { namespace swig { /* Traits that provides the from method */ template struct traits_from_ptr { static PyObject *from(Type *val, int owner = 0) { return SWIG_InternalNewPointerObj(val, type_info(), owner); } }; template struct traits_from { static PyObject *from(const Type& val) { return traits_from_ptr::from(new Type(val), 1); } }; template struct traits_from { static PyObject *from(Type* val) { return traits_from_ptr::from(val, 0); } }; template struct traits_from { static PyObject *from(const Type* val) { return traits_from_ptr::from(const_cast(val), 0); } }; template inline PyObject *from(const Type& val) { return traits_from::from(val); } template inline PyObject *from_ptr(Type* val, int owner) { return traits_from_ptr::from(val, owner); } /* Traits that provides the asval/as/check method */ template struct traits_asptr { static int asptr(PyObject *obj, Type **val) { Type *p = 0; swig_type_info *descriptor = type_info(); int res = descriptor ? SWIG_ConvertPtr(obj, (void **)&p, descriptor, 0) : SWIG_ERROR; if (SWIG_IsOK(res)) { if (val) *val = p; } return res; } }; template inline int asptr(PyObject *obj, Type **vptr) { return traits_asptr::asptr(obj, vptr); } template struct traits_asval { static int asval(PyObject *obj, Type *val) { if (val) { Type *p = 0; int res = traits_asptr::asptr(obj, &p); if (!SWIG_IsOK(res)) return res; if (p) { typedef typename noconst_traits::noconst_type noconst_type; *(const_cast(val)) = *p; if (SWIG_IsNewObj(res)){ %delete(p); res = SWIG_DelNewMask(res); } return res; } else { return SWIG_ERROR; } } else { return traits_asptr::asptr(obj, (Type **)(0)); } } }; template struct traits_asval { static int asval(PyObject *obj, Type **val) { if (val) { typedef typename noconst_traits::noconst_type noconst_type; noconst_type *p = 0; int res = traits_asptr::asptr(obj, &p); if (SWIG_IsOK(res)) { *(const_cast(val)) = p; } return res; } else { return traits_asptr::asptr(obj, (Type **)(0)); } } }; template inline int asval(PyObject *obj, Type *val) { return traits_asval::asval(obj, val); } template struct traits_as { static Type as(PyObject *obj) { Type v; int res = asval(obj, &v); if (!obj || !SWIG_IsOK(res)) { if (!PyErr_Occurred()) { ::%type_error(swig::type_name()); } throw std::invalid_argument("bad type"); } return v; } }; template struct traits_as { static Type as(PyObject *obj) { Type *v = 0; int res = (obj ? traits_asptr::asptr(obj, &v) : SWIG_ERROR); if (SWIG_IsOK(res) && v) { if (SWIG_IsNewObj(res)) { Type r(*v); %delete(v); return r; } else { return *v; } } else { if (!PyErr_Occurred()) { %type_error(swig::type_name()); } throw std::invalid_argument("bad type"); } } }; template struct traits_as { static Type* as(PyObject *obj) { Type *v = 0; int res = (obj ? traits_asptr::asptr(obj, &v) : SWIG_ERROR); if (SWIG_IsOK(res)) { return v; } else { if (!PyErr_Occurred()) { %type_error(swig::type_name()); } throw std::invalid_argument("bad type"); } } }; template inline Type as(PyObject *obj) { return traits_as::category>::as(obj); } template struct traits_check { static bool check(PyObject *obj) { int res = obj ? asval(obj, (Type *)(0)) : SWIG_ERROR; return SWIG_IsOK(res) ? true : false; } }; template struct traits_check { static bool check(PyObject *obj) { int res = obj ? asptr(obj, (Type **)(0)) : SWIG_ERROR; return SWIG_IsOK(res) ? true : false; } }; template inline bool check(PyObject *obj) { return traits_check::category>::check(obj); } } } // // Backward compatibility // #ifdef SWIG_PYTHON_BACKWARD_COMP %fragment(""); %{ PyObject* SwigInt_FromBool(bool b) { return PyInt_FromLong(b ? 1L : 0L); } double SwigNumber_Check(PyObject* o) { return PyFloat_Check(o) || PyInt_Check(o) || PyLong_Check(o); } double SwigNumber_AsDouble(PyObject* o) { return PyFloat_Check(o) ? PyFloat_AsDouble(o) : (PyInt_Check(o) ? double(PyInt_AsLong(o)) : double(PyLong_AsLong(o))); } PyObject* SwigString_FromString(const std::string& s) { return PyString_FromStringAndSize(s.data(),s.size()); } std::string SwigString_AsString(PyObject* o) { return std::string(PyString_AsString(o)); } %} #endif %define %specialize_std_container(Type,Check,As,From) %{ namespace swig { template <> struct traits_asval { typedef Type value_type; static int asval(PyObject *obj, value_type *val) { if (Check(obj)) { if (val) *val = As(obj); return SWIG_OK; } return SWIG_ERROR; } }; template <> struct traits_from { typedef Type value_type; static PyObject *from(const value_type& val) { return From(val); } }; template <> struct traits_check { static int check(PyObject *obj) { int res = Check(obj); return obj && res ? res : 0; } }; } %} %enddef #define specialize_std_vector(Type,Check,As,From) %specialize_std_container(%arg(Type),Check,As,From) #define specialize_std_list(Type,Check,As,From) %specialize_std_container(%arg(Type),Check,As,From) #define specialize_std_deque(Type,Check,As,From) %specialize_std_container(%arg(Type),Check,As,From) #define specialize_std_set(Type,Check,As,From) %specialize_std_container(%arg(Type),Check,As,From) #define specialize_std_multiset(Type,Check,As,From) %specialize_std_container(%arg(Type),Check,As,From) #define specialize_std_unordered_set(Type,Check,As,From) %specialize_std_container(%arg(Type),Check,As,From) #define specialize_std_unordered_multiset(Type,Check,As,From) %specialize_std_container(%arg(Type),Check,As,From) swig-4.0.1/Lib/python/pymacros.swg0000644000175000017500000000004613527063513016756 0ustar williamwilliam%include swig-4.0.1/Lib/python/std_pair.i0000644000175000017500000001402713527063513016362 0ustar williamwilliam/* Pairs */ %include //#define SWIG_STD_PAIR_ASVAL %fragment("StdPairTraits","header",fragment="StdTraits") { namespace swig { #ifdef SWIG_STD_PAIR_ASVAL template struct traits_asval > { typedef std::pair value_type; static int get_pair(PyObject* first, PyObject* second, std::pair *val) { if (val) { T *pfirst = &(val->first); int res1 = swig::asval((PyObject*)first, pfirst); if (!SWIG_IsOK(res1)) return res1; U *psecond = &(val->second); int res2 = swig::asval((PyObject*)second, psecond); if (!SWIG_IsOK(res2)) return res2; return res1 > res2 ? res1 : res2; } else { T *pfirst = 0; int res1 = swig::asval((PyObject*)first, 0); if (!SWIG_IsOK(res1)) return res1; U *psecond = 0; int res2 = swig::asval((PyObject*)second, psecond); if (!SWIG_IsOK(res2)) return res2; return res1 > res2 ? res1 : res2; } } static int asval(PyObject *obj, std::pair *val) { int res = SWIG_ERROR; if (PyTuple_Check(obj)) { if (PyTuple_GET_SIZE(obj) == 2) { res = get_pair(PyTuple_GET_ITEM(obj,0),PyTuple_GET_ITEM(obj,1), val); } } else if (PySequence_Check(obj)) { if (PySequence_Size(obj) == 2) { swig::SwigVar_PyObject first = PySequence_GetItem(obj,0); swig::SwigVar_PyObject second = PySequence_GetItem(obj,1); res = get_pair(first, second, val); } } else { value_type *p; swig_type_info *descriptor = swig::type_info(); res = descriptor ? SWIG_ConvertPtr(obj, (void **)&p, descriptor, 0) : SWIG_ERROR; if (SWIG_IsOK(res) && val) *val = *p; } return res; } }; #else template struct traits_asptr > { typedef std::pair value_type; static int get_pair(PyObject* first, PyObject* second, std::pair **val) { if (val) { value_type *vp = %new_instance(std::pair); T *pfirst = &(vp->first); int res1 = swig::asval((PyObject*)first, pfirst); if (!SWIG_IsOK(res1)) { %delete(vp); return res1; } U *psecond = &(vp->second); int res2 = swig::asval((PyObject*)second, psecond); if (!SWIG_IsOK(res2)) { %delete(vp); return res2; } *val = vp; return SWIG_AddNewMask(res1 > res2 ? res1 : res2); } else { T *pfirst = 0; int res1 = swig::asval((PyObject*)first, pfirst); if (!SWIG_IsOK(res1)) return res1; U *psecond = 0; int res2 = swig::asval((PyObject*)second, psecond); if (!SWIG_IsOK(res2)) return res2; return res1 > res2 ? res1 : res2; } } static int asptr(PyObject *obj, std::pair **val) { int res = SWIG_ERROR; if (PyTuple_Check(obj)) { if (PyTuple_GET_SIZE(obj) == 2) { res = get_pair(PyTuple_GET_ITEM(obj,0),PyTuple_GET_ITEM(obj,1), val); } } else if (PySequence_Check(obj)) { if (PySequence_Size(obj) == 2) { swig::SwigVar_PyObject first = PySequence_GetItem(obj,0); swig::SwigVar_PyObject second = PySequence_GetItem(obj,1); res = get_pair(first, second, val); } } else { value_type *p; swig_type_info *descriptor = swig::type_info(); res = descriptor ? SWIG_ConvertPtr(obj, (void **)&p, descriptor, 0) : SWIG_ERROR; if (SWIG_IsOK(res) && val) *val = p; } return res; } }; #endif template struct traits_from > { static PyObject *from(const std::pair& val) { PyObject* obj = PyTuple_New(2); PyTuple_SetItem(obj,0,swig::from(val.first)); PyTuple_SetItem(obj,1,swig::from(val.second)); return obj; } }; } #if defined(SWIGPYTHON_BUILTIN) SWIGINTERN Py_ssize_t SwigPython_std_pair_len (PyObject *a) { return 2; } SWIGINTERN PyObject* SwigPython_std_pair_repr (PyObject *o) { PyObject *tuple = PyTuple_New(2); assert(tuple); PyTuple_SET_ITEM(tuple, 0, PyObject_GetAttrString(o, (char*) "first")); PyTuple_SET_ITEM(tuple, 1, PyObject_GetAttrString(o, (char*) "second")); PyObject *result = PyObject_Repr(tuple); Py_DECREF(tuple); return result; } SWIGINTERN PyObject* SwigPython_std_pair_getitem (PyObject *a, Py_ssize_t b) { PyObject *result = PyObject_GetAttrString(a, b % 2 ? (char*) "second" : (char*) "first"); return result; } SWIGINTERN int SwigPython_std_pair_setitem (PyObject *a, Py_ssize_t b, PyObject *c) { int result = PyObject_SetAttrString(a, b % 2 ? (char*) "second" : (char*) "first", c); return result; } #endif } %feature("python:sq_length") std::pair "SwigPython_std_pair_len"; %feature("python:sq_length") std::pair "SwigPython_std_pair_len"; %feature("python:sq_length") std::pair "SwigPython_std_pair_len"; %feature("python:sq_length") std::pair "SwigPython_std_pair_len"; %feature("python:tp_repr") std::pair "SwigPython_std_pair_repr"; %feature("python:tp_repr") std::pair "SwigPython_std_pair_repr"; %feature("python:tp_repr") std::pair "SwigPython_std_pair_repr"; %feature("python:tp_repr") std::pair "SwigPython_std_pair_repr"; %feature("python:sq_item") std::pair "SwigPython_std_pair_getitem"; %feature("python:sq_item") std::pair "SwigPython_std_pair_getitem"; %feature("python:sq_item") std::pair "SwigPython_std_pair_getitem"; %feature("python:sq_item") std::pair "SwigPython_std_pair_getitem"; %feature("python:sq_ass_item") std::pair "SwigPython_std_pair_setitem"; %feature("python:sq_ass_item") std::pair "SwigPython_std_pair_setitem"; %feature("python:sq_ass_item") std::pair "SwigPython_std_pair_setitem"; %feature("python:sq_ass_item") std::pair "SwigPython_std_pair_setitem"; %define %swig_pair_methods(pair...) #if !defined(SWIGPYTHON_BUILTIN) %extend { %pythoncode %{def __len__(self): return 2 def __repr__(self): return str((self.first, self.second)) def __getitem__(self, index): if not (index % 2): return self.first else: return self.second def __setitem__(self, index, val): if not (index % 2): self.first = val else: self.second = val%} } #endif %enddef %include swig-4.0.1/Lib/python/std_wios.i0000644000175000017500000000003213527063513016377 0ustar williamwilliam%include swig-4.0.1/Lib/python/std_auto_ptr.i0000644000175000017500000000111113527063513017252 0ustar williamwilliam/* The typemaps here allow to handle functions returning std::auto_ptr<>, which is the most common use of this type. If you have functions taking it as parameter, these typemaps can't be used for them and you need to do something else (e.g. use shared_ptr<> which SWIG supports fully). */ %define %auto_ptr(TYPE) %typemap (out) std::auto_ptr %{ %set_output(SWIG_NewPointerObj($1.release(), $descriptor(TYPE *), SWIG_POINTER_OWN | %newpointer_flags)); %} %template() std::auto_ptr; %enddef namespace std { template class auto_ptr {}; } swig-4.0.1/Lib/python/pydocs.swg0000644000175000017500000000332513527063513016425 0ustar williamwilliam // Documentation for use with the autodoc feature. #ifdef SWIG_DOC_DOXYGEN_STYLE %typemap(doc) SWIGTYPE "@param $1_name $1_type"; %typemap(doc) SWIGTYPE * "@param $1_name $1_type"; %typemap(doc) const SWIGTYPE & "@param $1_name $1_type"; %typemap(doc) const SWIGTYPE && "@param $1_name $1_type"; %typemap(doc) enum SWIGTYPE "@param $1_name enum $1_type"; %typemap(doc) SWIGTYPE *INOUT, SWIGTYPE &INOUT "@param $1_name $1_type (input/output)"; %typemap(doc) SWIGTYPE *INPUT, SWIGTYPE &INPUT "@param $1_name $1_type (input)"; %typemap(doc) SWIGTYPE *OUTPUT, SWIGTYPE &OUTPUT "@param $1_name $1_type (output)"; #else %typemap(doc) SWIGTYPE "$1_name: $1_type"; %typemap(doc) SWIGTYPE * "$1_name: $1_type"; %typemap(doc) const SWIGTYPE & "$1_name: $1_type"; %typemap(doc) const SWIGTYPE && "$1_name: $1_type"; %typemap(doc) enum SWIGTYPE "$1_name: enum $1_type"; %typemap(doc) SWIGTYPE *INOUT, SWIGTYPE &INOUT "$1_name: $1_type (input/output)"; %typemap(doc) SWIGTYPE *INPUT, SWIGTYPE &INPUT "$1_name: $1_type (input)"; %typemap(doc) SWIGTYPE *OUTPUT, SWIGTYPE &OUTPUT "$1_name: $1_type (output)"; #endif // Types to use in Python documentation for the parameters of the given C++ type. %typemap(doctype) bool "boolean"; %define int_doctype_for_cppint_type(cppint_type) %typemap(doctype) cppint_type, unsigned cppint_type "int"; %enddef %formacro(int_doctype_for_cppint_type, short, int, long, long long) %typemap(doctype) size_t "int"; %typemap(doctype) enum SWIGTYPE "int"; %typemap(doctype) float, double, long double "float"; %typemap(doctype) char*, std::string "string"; %typemap(doctype) SWIGTYPE "$1_basetype" %typemap(doctype) SWIGTYPE * "$typemap(doctype, $*1_ltype)" %typemap(doctype) SWIGTYPE & "$typemap(doctype, $*1_ltype)" swig-4.0.1/Lib/python/std_char_traits.i0000644000175000017500000000004113527063513017721 0ustar williamwilliam%include swig-4.0.1/Lib/python/pystrings.swg0000644000175000017500000000747013527063513017173 0ustar williamwilliam/* ------------------------------------------------------------ * utility methods for char strings * ------------------------------------------------------------ */ %fragment("SWIG_AsCharPtrAndSize","header",fragment="SWIG_pchar_descriptor") { SWIGINTERN int SWIG_AsCharPtrAndSize(PyObject *obj, char** cptr, size_t* psize, int *alloc) { %#if PY_VERSION_HEX>=0x03000000 %#if defined(SWIG_PYTHON_STRICT_BYTE_CHAR) if (PyBytes_Check(obj)) %#else if (PyUnicode_Check(obj)) %#endif %#else if (PyString_Check(obj)) %#endif { char *cstr; Py_ssize_t len; int ret = SWIG_OK; %#if PY_VERSION_HEX>=0x03000000 %#if !defined(SWIG_PYTHON_STRICT_BYTE_CHAR) if (!alloc && cptr) { /* We can't allow converting without allocation, since the internal representation of string in Python 3 is UCS-2/UCS-4 but we require a UTF-8 representation. TODO(bhy) More detailed explanation */ return SWIG_RuntimeError; } obj = PyUnicode_AsUTF8String(obj); if (!obj) return SWIG_TypeError; if (alloc) *alloc = SWIG_NEWOBJ; %#endif PyBytes_AsStringAndSize(obj, &cstr, &len); %#else PyString_AsStringAndSize(obj, &cstr, &len); %#endif if (cptr) { if (alloc) { if (*alloc == SWIG_NEWOBJ) { *cptr = %new_copy_array(cstr, len + 1, char); *alloc = SWIG_NEWOBJ; } else { *cptr = cstr; *alloc = SWIG_OLDOBJ; } } else { %#if PY_VERSION_HEX>=0x03000000 %#if defined(SWIG_PYTHON_STRICT_BYTE_CHAR) *cptr = PyBytes_AsString(obj); %#else assert(0); /* Should never reach here with Unicode strings in Python 3 */ %#endif %#else *cptr = SWIG_Python_str_AsChar(obj); if (!*cptr) ret = SWIG_TypeError; %#endif } } if (psize) *psize = len + 1; %#if PY_VERSION_HEX>=0x03000000 && !defined(SWIG_PYTHON_STRICT_BYTE_CHAR) Py_XDECREF(obj); %#endif return ret; } else { %#if defined(SWIG_PYTHON_2_UNICODE) %#if defined(SWIG_PYTHON_STRICT_BYTE_CHAR) %#error "Cannot use both SWIG_PYTHON_2_UNICODE and SWIG_PYTHON_STRICT_BYTE_CHAR at once" %#endif %#if PY_VERSION_HEX<0x03000000 if (PyUnicode_Check(obj)) { char *cstr; Py_ssize_t len; if (!alloc && cptr) { return SWIG_RuntimeError; } obj = PyUnicode_AsUTF8String(obj); if (!obj) return SWIG_TypeError; if (PyString_AsStringAndSize(obj, &cstr, &len) != -1) { if (cptr) { if (alloc) *alloc = SWIG_NEWOBJ; *cptr = %new_copy_array(cstr, len + 1, char); } if (psize) *psize = len + 1; Py_XDECREF(obj); return SWIG_OK; } else { Py_XDECREF(obj); } } %#endif %#endif swig_type_info* pchar_descriptor = SWIG_pchar_descriptor(); if (pchar_descriptor) { void* vptr = 0; if (SWIG_ConvertPtr(obj, &vptr, pchar_descriptor, 0) == SWIG_OK) { if (cptr) *cptr = (char *) vptr; if (psize) *psize = vptr ? (strlen((char *)vptr) + 1) : 0; if (alloc) *alloc = SWIG_OLDOBJ; return SWIG_OK; } } } return SWIG_TypeError; } } %fragment("SWIG_FromCharPtrAndSize","header",fragment="SWIG_pchar_descriptor") { SWIGINTERNINLINE PyObject * SWIG_FromCharPtrAndSize(const char* carray, size_t size) { if (carray) { if (size > INT_MAX) { swig_type_info* pchar_descriptor = SWIG_pchar_descriptor(); return pchar_descriptor ? SWIG_InternalNewPointerObj(%const_cast(carray,char *), pchar_descriptor, 0) : SWIG_Py_Void(); } else { %#if PY_VERSION_HEX >= 0x03000000 %#if defined(SWIG_PYTHON_STRICT_BYTE_CHAR) return PyBytes_FromStringAndSize(carray, %numeric_cast(size, Py_ssize_t)); %#else return PyUnicode_DecodeUTF8(carray, %numeric_cast(size, Py_ssize_t), "surrogateescape"); %#endif %#else return PyString_FromStringAndSize(carray, %numeric_cast(size, Py_ssize_t)); %#endif } } else { return SWIG_Py_Void(); } } } swig-4.0.1/Lib/python/pyfragments.swg0000644000175000017500000000104713527063513017462 0ustar williamwilliam/* Create a file with this name, 'pyfragments.swg', in your working directory and add all the %fragments you want to take precedence over the default ones defined by swig. For example, if you add: %fragment(SWIG_AsVal_frag(int),"header") { SWIGINTERNINLINE int SWIG_AsVal(int)(PyObject *obj, int *val) { ; } } this will replace the code used to retrieve an integer value for all the typemaps that need it, including: int, std::vector, std::list >, etc. */ swig-4.0.1/Lib/python/pyhead.swg0000644000175000017500000000464613527063513016405 0ustar williamwilliam/* Compatibility macros for Python 3 */ #if PY_VERSION_HEX >= 0x03000000 #define PyClass_Check(obj) PyObject_IsInstance(obj, (PyObject *)&PyType_Type) #define PyInt_Check(x) PyLong_Check(x) #define PyInt_AsLong(x) PyLong_AsLong(x) #define PyInt_FromLong(x) PyLong_FromLong(x) #define PyInt_FromSize_t(x) PyLong_FromSize_t(x) #define PyString_Check(name) PyBytes_Check(name) #define PyString_FromString(x) PyUnicode_FromString(x) #define PyString_Format(fmt, args) PyUnicode_Format(fmt, args) #define PyString_AsString(str) PyBytes_AsString(str) #define PyString_Size(str) PyBytes_Size(str) #define PyString_InternFromString(key) PyUnicode_InternFromString(key) #define Py_TPFLAGS_HAVE_CLASS Py_TPFLAGS_BASETYPE #define PyString_AS_STRING(x) PyUnicode_AS_STRING(x) #define _PyLong_FromSsize_t(x) PyLong_FromSsize_t(x) #endif #ifndef Py_TYPE # define Py_TYPE(op) ((op)->ob_type) #endif /* SWIG APIs for compatibility of both Python 2 & 3 */ #if PY_VERSION_HEX >= 0x03000000 # define SWIG_Python_str_FromFormat PyUnicode_FromFormat #else # define SWIG_Python_str_FromFormat PyString_FromFormat #endif /* Warning: This function will allocate a new string in Python 3, * so please call SWIG_Python_str_DelForPy3(x) to free the space. */ SWIGINTERN char* SWIG_Python_str_AsChar(PyObject *str) { #if PY_VERSION_HEX >= 0x03000000 char *newstr = 0; str = PyUnicode_AsUTF8String(str); if (str) { char *cstr; Py_ssize_t len; PyBytes_AsStringAndSize(str, &cstr, &len); newstr = (char *) malloc(len+1); memcpy(newstr, cstr, len+1); Py_XDECREF(str); } return newstr; #else return PyString_AsString(str); #endif } #if PY_VERSION_HEX >= 0x03000000 # define SWIG_Python_str_DelForPy3(x) free( (void*) (x) ) #else # define SWIG_Python_str_DelForPy3(x) #endif SWIGINTERN PyObject* SWIG_Python_str_FromChar(const char *c) { #if PY_VERSION_HEX >= 0x03000000 return PyUnicode_FromString(c); #else return PyString_FromString(c); #endif } #ifndef PyObject_DEL # define PyObject_DEL PyObject_Del #endif // SWIGPY_USE_CAPSULE is no longer used within SWIG itself, but some user // interface files check for it. # define SWIGPY_USE_CAPSULE # define SWIGPY_CAPSULE_NAME ("swig_runtime_data" SWIG_RUNTIME_VERSION ".type_pointer_capsule" SWIG_TYPE_TABLE_NAME) #if PY_VERSION_HEX < 0x03020000 #define PyDescr_TYPE(x) (((PyDescrObject *)(x))->d_type) #define PyDescr_NAME(x) (((PyDescrObject *)(x))->d_name) #define Py_hash_t long #endif swig-4.0.1/Lib/python/stl.i0000644000175000017500000000044313527063513015354 0ustar williamwilliam/* ----------------------------------------------------------------------------- * stl.i * ----------------------------------------------------------------------------- */ %include %include %include %include %include swig-4.0.1/Lib/python/pythonkw.swg0000644000175000017500000000452513527063513017012 0ustar williamwilliam/* Warnings for Python keywords, built-in names and bad names. */ #define PYTHONKW(x) %keywordwarn("'" `x` "' is a python keyword, renaming to '_" `x` "'", rename="_%s") `x` #define PYTHONBN(x) %builtinwarn("'" `x` "' conflicts with a built-in name in python") `x` /* Warnings for Python keywords https://docs.python.org/2/reference/lexical_analysis.html#keywords */ PYTHONKW(and); PYTHONKW(as); PYTHONKW(assert); PYTHONKW(async); PYTHONKW(await); PYTHONKW(break); PYTHONKW(class); PYTHONKW(continue); PYTHONKW(def); PYTHONKW(del); PYTHONKW(elif); PYTHONKW(else); PYTHONKW(except); PYTHONKW(exec); PYTHONKW(finally); PYTHONKW(for); PYTHONKW(from); PYTHONKW(global); PYTHONKW(if); PYTHONKW(import); PYTHONKW(in); PYTHONKW(is); PYTHONKW(lambda); PYTHONKW(not); PYTHONKW(or); PYTHONKW(pass); PYTHONKW(print); PYTHONKW(raise); PYTHONKW(return); PYTHONKW(try); PYTHONKW(while); PYTHONKW(with); PYTHONKW(yield); /* built-in functions https://docs.python.org/2/library/functions.html */ PYTHONBN(abs); PYTHONBN(apply); PYTHONBN(bool); PYTHONBN(buffer); PYTHONBN(callable); PYTHONBN(chr); PYTHONBN(classmethod); PYTHONBN(cmp); PYTHONBN(coerce); PYTHONBN(compile); PYTHONBN(complex); PYTHONBN(delattr); PYTHONBN(dict); PYTHONBN(dir); PYTHONBN(divmod); PYTHONBN(enumerate); PYTHONBN(eval); PYTHONBN(execfile); PYTHONBN(file); PYTHONBN(filter); PYTHONBN(float); PYTHONBN(frozenset); PYTHONBN(getattr); PYTHONBN(globals); PYTHONBN(hasattr); PYTHONBN(hash); PYTHONBN(hex); PYTHONBN(id); PYTHONBN(input); PYTHONBN(int); PYTHONBN(intern); PYTHONBN(isinstance); PYTHONBN(issubclass); PYTHONBN(iter); PYTHONBN(len); PYTHONBN(list); PYTHONBN(locals); PYTHONBN(long); PYTHONBN(map); PYTHONBN(max); PYTHONBN(min); PYTHONBN(object); PYTHONBN(oct); PYTHONBN(open); PYTHONBN(ord); PYTHONBN(pow); PYTHONBN(property); PYTHONBN(range); PYTHONBN(raw_input); PYTHONBN(reduce); PYTHONBN(reload); PYTHONBN(repr); PYTHONBN(reversed); PYTHONBN(round); PYTHONBN(set); PYTHONBN(setattr); PYTHONBN(slice); PYTHONBN(sorted); PYTHONBN(staticmethod); PYTHONBN(str); PYTHONBN(sum); PYTHONBN(super); PYTHONBN(tuple); PYTHONBN(type); PYTHONBN(unichr); PYTHONBN(unicode); PYTHONBN(vars); PYTHONBN(xrange); PYTHONBN(zip); /* built-in names boolean type and None */ PYTHONBN(True); PYTHONBN(False); PYTHONKW(None); /* 'self' is also a bad Name */ PYTHONKW(self); #undef PYTHONBN #undef PYTHONKW swig-4.0.1/Lib/python/pyabc.i0000644000175000017500000000067613527063513015660 0ustar williamwilliam%define %pythonabc(Type, Abc) %feature("python:abc", #Abc) Type; %enddef %pythoncode %{import collections.abc%} %pythonabc(std::vector, collections.abc.MutableSequence); %pythonabc(std::list, collections.abc.MutableSequence); %pythonabc(std::map, collections.abc.MutableMapping); %pythonabc(std::multimap, collections.abc.MutableMapping); %pythonabc(std::set, collections.abc.MutableSet); %pythonabc(std::multiset, collections.abc.MutableSet); swig-4.0.1/Lib/python/README0000644000175000017500000000756013527063513015267 0ustar williamwilliam/* ----------------------------------------------------------------------------- * * User interfaces: include these ones as needed * * ----------------------------------------------------------------------------- */ /* ----------------------------------------------------------------------------- * Special types and user helpers * ----------------------------------------------------------------------------- */ argcargv.i Handler for (int argc, char **argv) attribute.i Convert a pair of set/get methods into a "native" python attribute ccomplex.i C99 complex type complex.i C99 or C++ complex type cstring.i Various forms of C character string handling cwstring.i Various forms of C wchar_t string handling embed.i embedding the Python interpreter in something else file.i FILE C type implicit.i Allow the use of implicit C++ constructors wchar.i wchar_t C type /* ----------------------------------------------------------------------------- * C++ STD + STL * ----------------------------------------------------------------------------- */ std_alloc.i allocator std_basic_string.i basic string std_char_traits.i char traits std_complex.i complex std_deque.i deque std_except.i exceptions std_ios.i ios std_iostream.i istream/ostream std_list.i list std_map.i map std_multimap.i multimap std_multiset.i multiset std_pair.i pair std_set.i set std_sstream.i string stream std_streambuf.i streambuf std_string.i string std_vector.i vector std_wios.i wios std_wiostream.i wistream/wostream std_wsstream.i wstring stream std_wstreambuf.i wstreambuf std_wstring.i wstring /* ----------------------------------------------------------------------------- /* * Implementation files: don't look at them unless you are really drunk * * ----------------------------------------------------------------------------- */ /* ----------------------------------------------------------------------------- * Basic files * ----------------------------------------------------------------------------- */ python.swg Main language file, it just includes what is needed. pyuserdir.swg User visible directives (%pythonnondynamic, etc) pymacros.swg Internal macros used for typemaps pyfragments.swg Allow the user to overload the default fragments pyopers.swg Python operations (+=, *=, etc) pythonkw.swg Python keywords and special names pyinit.swg Python Init method /* ----------------------------------------------------------------------------- * The runtime part * ----------------------------------------------------------------------------- */ pyruntime.swg Main runtime file definition pyapi.swg SWIG/Python API declarations pyrun.swg Python run-time code /* ----------------------------------------------------------------------------- * Internal typemap specializations * ----------------------------------------------------------------------------- */ pyswigtype.swg SWIGTYPE pystrings.swg Char strings (char *) pywstrings.swg Wchar Strings (wchar_t *) pyprimtypes.swg Primitive types (shot,int,double,etc) pycomplex.swg PyComplex and helper for C/C++ complex types pydocs.swg Typemaps documentation /* ----------------------------------------------------------------------------- * C++ STD + STL * ----------------------------------------------------------------------------- */ pycontainer.swg python container iterators std_common.i general common code for the STD/STL implementation std_container.i general common code for the STD/STL containers /*----------------------------------------------------------------------------- * Backward compatibility and deprecated * ----------------------------------------------------------------------------- */ std_vectora.i vector + allocator (allocators are now supported in STD/STL) typemaps.i old in/out typemaps (doesn't need to be included) defarg.swg for processing default arguments with shadow classes swig-4.0.1/Lib/python/exception.i0000644000175000017500000000021313527063513016543 0ustar williamwilliam%include %insert("runtime") { %define_as(SWIG_exception(code, msg), %block(%error(code, msg); SWIG_fail; )) } swig-4.0.1/Lib/python/pybuffer.i0000644000175000017500000000573613527063513016406 0ustar williamwilliam/* Implementing buffer protocol typemaps */ /* %pybuffer_mutable_binary(TYPEMAP, SIZE) * * Macro for functions accept mutable buffer pointer with a size. * This can be used for both input and output. For example: * * %pybuffer_mutable_binary(char *buff, int size); * void foo(char *buff, int size) { * for(int i=0; i struct traits_asptr > { static int asptr(PyObject *obj, std::list **lis) { return traits_asptr_stdseq >::asptr(obj, lis); } }; template struct traits_from > { static PyObject *from(const std::list& vec) { return traits_from_stdseq >::from(vec); } }; } %} #define %swig_list_methods(Type...) %swig_sequence_methods(Type) #define %swig_list_methods_val(Type...) %swig_sequence_methods_val(Type); %include swig-4.0.1/Lib/python/pycomplex.swg0000644000175000017500000000430313527063513017141 0ustar williamwilliam/* Defines the As/From converters for double/float complex, you need to provide complex Type, the Name you want to use in the converters, the complex Constructor method, and the Real and Imag complex accessor methods. See the std_complex.i and ccomplex.i for concrete examples. */ /* the common from converter */ %define %swig_fromcplx_conv(Type, Real, Imag) %fragment(SWIG_From_frag(Type),"header") { SWIGINTERNINLINE PyObject* SWIG_From(Type)(%ifcplusplus(const Type&, Type) c) { return PyComplex_FromDoubles(Real(c), Imag(c)); } } %enddef /* the double case */ %define %swig_cplxdbl_conv(Type, Constructor, Real, Imag) %fragment(SWIG_AsVal_frag(Type),"header", fragment=SWIG_AsVal_frag(double)) { SWIGINTERN int SWIG_AsVal(Type) (PyObject *o, Type* val) { if (PyComplex_Check(o)) { if (val) *val = Constructor(PyComplex_RealAsDouble(o), PyComplex_ImagAsDouble(o)); return SWIG_OK; } else { double d; int res = SWIG_AddCast(SWIG_AsVal(double)(o, &d)); if (SWIG_IsOK(res)) { if (val) *val = Constructor(d, 0.0); return res; } } return SWIG_TypeError; } } %swig_fromcplx_conv(Type, Real, Imag); %enddef /* the float case */ %define %swig_cplxflt_conv(Type, Constructor, Real, Imag) %fragment(SWIG_AsVal_frag(Type),"header", fragment=SWIG_AsVal_frag(float)) { SWIGINTERN int SWIG_AsVal(Type)(PyObject *o, Type *val) { if (PyComplex_Check(o)) { double re = PyComplex_RealAsDouble(o); double im = PyComplex_ImagAsDouble(o); if ((-FLT_MAX <= re && re <= FLT_MAX) && (-FLT_MAX <= im && im <= FLT_MAX)) { if (val) *val = Constructor(%numeric_cast(re, float), %numeric_cast(im, float)); return SWIG_OK; } else { return SWIG_OverflowError; } } else { float re; int res = SWIG_AddCast(SWIG_AsVal(float)(o, &re)); if (SWIG_IsOK(res)) { if (val) *val = Constructor(re, 0.0); return res; } } return SWIG_TypeError; } } %swig_fromcplx_conv(Type, Real, Imag); %enddef #define %swig_cplxflt_convn(Type, Constructor, Real, Imag) \ %swig_cplxflt_conv(Type, Constructor, Real, Imag) #define %swig_cplxdbl_convn(Type, Constructor, Real, Imag) \ %swig_cplxdbl_conv(Type, Constructor, Real, Imag) swig-4.0.1/Lib/python/builtin.swg0000644000175000017500000006212613527063513016576 0ustar williamwilliam#ifdef __cplusplus extern "C" { #endif SWIGINTERN Py_hash_t SwigPyObject_hash(PyObject *obj) { SwigPyObject *sobj = (SwigPyObject *)obj; void *ptr = sobj->ptr; return (Py_hash_t)ptr; } SWIGINTERN Py_hash_t SWIG_PyNumber_AsPyHash(PyObject *obj) { Py_hash_t result = -1; #if PY_VERSION_HEX < 0x03020000 if (PyInt_Check(obj)) result = PyInt_AsLong(obj); else if (PyLong_Check(obj)) result = PyLong_AsLong(obj); #else if (PyNumber_Check(obj)) result = PyNumber_AsSsize_t(obj, NULL); #endif else PyErr_Format(PyExc_TypeError, "Wrong type for hash function"); return PyErr_Occurred() ? -1 : result; } SWIGINTERN int SwigPyBuiltin_BadInit(PyObject *self, PyObject *SWIGUNUSEDPARM(args), PyObject *SWIGUNUSEDPARM(kwds)) { PyErr_Format(PyExc_TypeError, "Cannot create new instances of type '%.300s'", self->ob_type->tp_name); return -1; } SWIGINTERN void SwigPyBuiltin_BadDealloc(PyObject *obj) { SwigPyObject *sobj = (SwigPyObject *)obj; if (sobj->own) { PyErr_Format(PyExc_TypeError, "Swig detected a memory leak in type '%.300s': no callable destructor found.", obj->ob_type->tp_name); } } typedef struct { PyCFunction get; PyCFunction set; } SwigPyGetSet; SWIGINTERN PyObject * SwigPyBuiltin_GetterClosure (PyObject *obj, void *closure) { SwigPyGetSet *getset; PyObject *tuple, *result; if (!closure) return SWIG_Py_Void(); getset = (SwigPyGetSet *)closure; if (!getset->get) return SWIG_Py_Void(); tuple = PyTuple_New(0); assert(tuple); result = (*getset->get)(obj, tuple); Py_DECREF(tuple); return result; } SWIGINTERN PyObject * SwigPyBuiltin_FunpackGetterClosure (PyObject *obj, void *closure) { SwigPyGetSet *getset; PyObject *result; if (!closure) return SWIG_Py_Void(); getset = (SwigPyGetSet *)closure; if (!getset->get) return SWIG_Py_Void(); result = (*getset->get)(obj, NULL); return result; } SWIGINTERN int SwigPyBuiltin_SetterClosure (PyObject *obj, PyObject *val, void *closure) { SwigPyGetSet *getset; PyObject *tuple, *result; if (!closure) { PyErr_Format(PyExc_TypeError, "Missing getset closure"); return -1; } getset = (SwigPyGetSet *)closure; if (!getset->set) { PyErr_Format(PyExc_TypeError, "Illegal member variable assignment in type '%.300s'", obj->ob_type->tp_name); return -1; } tuple = PyTuple_New(1); assert(tuple); Py_INCREF(val); PyTuple_SET_ITEM(tuple, 0, val); result = (*getset->set)(obj, tuple); Py_DECREF(tuple); Py_XDECREF(result); return result ? 0 : -1; } SWIGINTERN int SwigPyBuiltin_FunpackSetterClosure (PyObject *obj, PyObject *val, void *closure) { SwigPyGetSet *getset; PyObject *result; if (!closure) { PyErr_Format(PyExc_TypeError, "Missing getset closure"); return -1; } getset = (SwigPyGetSet *)closure; if (!getset->set) { PyErr_Format(PyExc_TypeError, "Illegal member variable assignment in type '%.300s'", obj->ob_type->tp_name); return -1; } result = (*getset->set)(obj, val); Py_XDECREF(result); return result ? 0 : -1; } SWIGINTERN void SwigPyStaticVar_dealloc(PyDescrObject *descr) { PyObject_GC_UnTrack(descr); Py_XDECREF(PyDescr_TYPE(descr)); Py_XDECREF(PyDescr_NAME(descr)); PyObject_GC_Del(descr); } SWIGINTERN PyObject * SwigPyStaticVar_repr(PyGetSetDescrObject *descr) { #if PY_VERSION_HEX >= 0x03000000 return PyUnicode_FromFormat("", PyDescr_NAME(descr), PyDescr_TYPE(descr)->tp_name); #else return PyString_FromFormat("", PyString_AsString(PyDescr_NAME(descr)), PyDescr_TYPE(descr)->tp_name); #endif } SWIGINTERN int SwigPyStaticVar_traverse(PyObject *self, visitproc visit, void *arg) { PyDescrObject *descr; descr = (PyDescrObject *)self; Py_VISIT((PyObject*) PyDescr_TYPE(descr)); return 0; } SWIGINTERN PyObject * SwigPyStaticVar_get(PyGetSetDescrObject *descr, PyObject *obj, PyObject *SWIGUNUSEDPARM(type)) { if (descr->d_getset->get != NULL) return descr->d_getset->get(obj, descr->d_getset->closure); #if PY_VERSION_HEX >= 0x03000000 PyErr_Format(PyExc_AttributeError, "attribute '%.300S' of '%.100s' objects is not readable", PyDescr_NAME(descr), PyDescr_TYPE(descr)->tp_name); #else PyErr_Format(PyExc_AttributeError, "attribute '%.300s' of '%.100s' objects is not readable", PyString_AsString(PyDescr_NAME(descr)), PyDescr_TYPE(descr)->tp_name); #endif return NULL; } SWIGINTERN int SwigPyStaticVar_set(PyGetSetDescrObject *descr, PyObject *obj, PyObject *value) { if (descr->d_getset->set != NULL) return descr->d_getset->set(obj, value, descr->d_getset->closure); #if PY_VERSION_HEX >= 0x03000000 PyErr_Format(PyExc_AttributeError, "attribute '%.300S' of '%.100s' objects is not writable", PyDescr_NAME(descr), PyDescr_TYPE(descr)->tp_name); #else PyErr_Format(PyExc_AttributeError, "attribute '%.300s' of '%.100s' objects is not writable", PyString_AsString(PyDescr_NAME(descr)), PyDescr_TYPE(descr)->tp_name); #endif return -1; } SWIGINTERN int SwigPyObjectType_setattro(PyObject *typeobject, PyObject *name, PyObject *value) { PyObject *attribute; PyTypeObject *type; descrsetfunc local_set; assert(PyType_Check(typeobject)); type = (PyTypeObject *)typeobject; attribute = _PyType_Lookup(type, name); if (attribute != NULL) { /* Implement descriptor functionality, if any */ local_set = attribute->ob_type->tp_descr_set; if (local_set != NULL) return local_set(attribute, (PyObject *)type, value); #if PY_VERSION_HEX >= 0x03000000 PyErr_Format(PyExc_AttributeError, "cannot modify read-only attribute '%.50s.%.400S'", type->tp_name, name); #else PyErr_Format(PyExc_AttributeError, "cannot modify read-only attribute '%.50s.%.400s'", type->tp_name, PyString_AS_STRING(name)); #endif } else { #if PY_VERSION_HEX >= 0x03000000 PyErr_Format(PyExc_AttributeError, "type '%.50s' has no attribute '%.400S'", type->tp_name, name); #else PyErr_Format(PyExc_AttributeError, "type '%.50s' has no attribute '%.400s'", type->tp_name, PyString_AS_STRING(name)); #endif } return -1; } SWIGINTERN PyTypeObject* SwigPyStaticVar_Type(void) { static PyTypeObject staticvar_type; static int type_init = 0; if (!type_init) { const PyTypeObject tmp = { #if PY_VERSION_HEX >= 0x03000000 PyVarObject_HEAD_INIT(&PyType_Type, 0) #else PyObject_HEAD_INIT(&PyType_Type) 0, /* ob_size */ #endif "swig_static_var_getset_descriptor", /* tp_name */ sizeof(PyGetSetDescrObject), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor)SwigPyStaticVar_dealloc, /* tp_dealloc */ 0, /* tp_print */ 0, /* tp_getattr */ 0, /* tp_setattr */ 0, /* tp_compare */ (reprfunc)SwigPyStaticVar_repr, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ 0, /* tp_as_mapping */ 0, /* tp_hash */ 0, /* tp_call */ 0, /* tp_str */ PyObject_GenericGetAttr, /* tp_getattro */ 0, /* tp_setattro */ 0, /* tp_as_buffer */ Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_GC|Py_TPFLAGS_HAVE_CLASS, /* tp_flags */ 0, /* tp_doc */ SwigPyStaticVar_traverse, /* tp_traverse */ 0, /* tp_clear */ 0, /* tp_richcompare */ 0, /* tp_weaklistoffset */ 0, /* tp_iter */ 0, /* tp_iternext */ 0, /* tp_methods */ 0, /* tp_members */ 0, /* tp_getset */ 0, /* tp_base */ 0, /* tp_dict */ (descrgetfunc)SwigPyStaticVar_get, /* tp_descr_get */ (descrsetfunc)SwigPyStaticVar_set, /* tp_descr_set */ 0, /* tp_dictoffset */ 0, /* tp_init */ 0, /* tp_alloc */ 0, /* tp_new */ 0, /* tp_free */ 0, /* tp_is_gc */ 0, /* tp_bases */ 0, /* tp_mro */ 0, /* tp_cache */ 0, /* tp_subclasses */ 0, /* tp_weaklist */ 0, /* tp_del */ 0, /* tp_version_tag */ #if PY_VERSION_HEX >= 0x03040000 0, /* tp_finalize */ #endif #ifdef COUNT_ALLOCS 0, /* tp_allocs */ 0, /* tp_frees */ 0, /* tp_maxalloc */ 0, /* tp_prev */ 0 /* tp_next */ #endif }; staticvar_type = tmp; type_init = 1; if (PyType_Ready(&staticvar_type) < 0) return NULL; } return &staticvar_type; } SWIGINTERN PyTypeObject* SwigPyObjectType(void) { static char swigpyobjecttype_doc[] = "Metaclass for SWIG wrapped types"; static PyTypeObject swigpyobjecttype_type; static int type_init = 0; if (!type_init) { const PyTypeObject tmp = { #if PY_VERSION_HEX >= 0x03000000 PyVarObject_HEAD_INIT(&PyType_Type, 0) #else PyObject_HEAD_INIT(&PyType_Type) 0, /* ob_size */ #endif "SwigPyObjectType", /* tp_name */ PyType_Type.tp_basicsize, /* tp_basicsize */ 0, /* tp_itemsize */ 0, /* tp_dealloc */ 0, /* tp_print */ 0, /* tp_getattr */ 0, /* tp_setattr */ 0, /* tp_compare */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ 0, /* tp_as_mapping */ 0, /* tp_hash */ 0, /* tp_call */ 0, /* tp_str */ 0, /* tp_getattro */ SwigPyObjectType_setattro, /* tp_setattro */ 0, /* tp_as_buffer */ Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_CLASS, /* tp_flags */ swigpyobjecttype_doc, /* tp_doc */ 0, /* tp_traverse */ 0, /* tp_clear */ 0, /* tp_richcompare */ 0, /* tp_weaklistoffset */ 0, /* tp_iter */ 0, /* tp_iternext */ 0, /* tp_methods */ 0, /* tp_members */ 0, /* tp_getset */ 0, /* tp_base */ 0, /* tp_dict */ 0, /* tp_descr_get */ 0, /* tp_descr_set */ 0, /* tp_dictoffset */ 0, /* tp_init */ 0, /* tp_alloc */ 0, /* tp_new */ 0, /* tp_free */ 0, /* tp_is_gc */ 0, /* tp_bases */ 0, /* tp_mro */ 0, /* tp_cache */ 0, /* tp_subclasses */ 0, /* tp_weaklist */ 0, /* tp_del */ 0, /* tp_version_tag */ #if PY_VERSION_HEX >= 0x03040000 0, /* tp_finalize */ #endif #ifdef COUNT_ALLOCS 0, /* tp_allocs */ 0, /* tp_frees */ 0, /* tp_maxalloc */ 0, /* tp_prev */ 0 /* tp_next */ #endif }; swigpyobjecttype_type = tmp; type_init = 1; swigpyobjecttype_type.tp_base = &PyType_Type; if (PyType_Ready(&swigpyobjecttype_type) < 0) return NULL; } return &swigpyobjecttype_type; } SWIGINTERN PyGetSetDescrObject * SwigPyStaticVar_new_getset(PyTypeObject *type, PyGetSetDef *getset) { PyGetSetDescrObject *descr; descr = (PyGetSetDescrObject *)PyType_GenericAlloc(SwigPyStaticVar_Type(), 0); assert(descr); Py_XINCREF(type); PyDescr_TYPE(descr) = type; PyDescr_NAME(descr) = PyString_InternFromString(getset->name); descr->d_getset = getset; if (PyDescr_NAME(descr) == NULL) { Py_DECREF(descr); descr = NULL; } return descr; } SWIGINTERN void SwigPyBuiltin_InitBases (PyTypeObject *type, PyTypeObject **bases) { Py_ssize_t base_count = 0; PyTypeObject **b; PyObject *tuple; Py_ssize_t i; if (!bases[0]) { bases[0] = SwigPyObject_type(); bases[1] = NULL; } type->tp_base = bases[0]; Py_INCREF((PyObject *)bases[0]); for (b = bases; *b != NULL; ++b) ++base_count; tuple = PyTuple_New(base_count); for (i = 0; i < base_count; ++i) { Py_INCREF((PyObject *)bases[i]); PyTuple_SET_ITEM(tuple, i, (PyObject *)bases[i]); } type->tp_bases = tuple; } SWIGINTERN PyObject * SwigPyBuiltin_ThisClosure (PyObject *self, void *SWIGUNUSEDPARM(closure)) { PyObject *result; result = (PyObject *)SWIG_Python_GetSwigThis(self); Py_XINCREF(result); return result; } SWIGINTERN void SwigPyBuiltin_SetMetaType (PyTypeObject *type, PyTypeObject *metatype) { #if PY_VERSION_HEX >= 0x03000000 type->ob_base.ob_base.ob_type = metatype; #else type->ob_type = metatype; #endif } /* Start of callback function macros for use in PyTypeObject */ typedef PyObject *(*SwigPyWrapperFunction)(PyObject *, PyObject *); #define SWIGPY_UNARYFUNC_CLOSURE(wrapper) \ SWIGINTERN PyObject * \ wrapper##_unaryfunc_closure(PyObject *a) { \ return SwigPyBuiltin_unaryfunc_closure(wrapper, a); \ } SWIGINTERN PyObject * SwigPyBuiltin_unaryfunc_closure(SwigPyWrapperFunction wrapper, PyObject *a) { return wrapper(a, NULL); } #define SWIGPY_DESTRUCTOR_CLOSURE(wrapper) \ SWIGINTERN void \ wrapper##_destructor_closure(PyObject *a) { \ SwigPyBuiltin_destructor_closure(wrapper, #wrapper, a); \ } SWIGINTERN void SwigPyBuiltin_destructor_closure(SwigPyWrapperFunction wrapper, const char *wrappername, PyObject *a) { SwigPyObject *sobj; sobj = (SwigPyObject *)a; Py_XDECREF(sobj->dict); if (sobj->own) { PyObject *o; PyObject *type = 0, *value = 0, *traceback = 0; PyErr_Fetch(&type, &value, &traceback); o = wrapper(a, NULL); if (!o) { PyObject *deallocname = PyString_FromString(wrappername); PyErr_WriteUnraisable(deallocname); Py_DECREF(deallocname); } PyErr_Restore(type, value, traceback); Py_XDECREF(o); } if (PyType_IS_GC(a->ob_type)) { PyObject_GC_Del(a); } else { PyObject_Del(a); } } #define SWIGPY_INQUIRY_CLOSURE(wrapper) \ SWIGINTERN int \ wrapper##_inquiry_closure(PyObject *a) { \ return SwigPyBuiltin_inquiry_closure(wrapper, a); \ } SWIGINTERN int SwigPyBuiltin_inquiry_closure(SwigPyWrapperFunction wrapper, PyObject *a) { PyObject *pyresult; int result; pyresult = wrapper(a, NULL); result = pyresult && PyObject_IsTrue(pyresult) ? 1 : 0; Py_XDECREF(pyresult); return result; } #define SWIGPY_GETITERFUNC_CLOSURE(wrapper) \ SWIGINTERN PyObject * \ wrapper##_getiterfunc_closure(PyObject *a) { \ return SwigPyBuiltin_getiterfunc_closure(wrapper, a); \ } SWIGINTERN PyObject * SwigPyBuiltin_getiterfunc_closure(SwigPyWrapperFunction wrapper, PyObject *a) { return wrapper(a, NULL); } #define SWIGPY_BINARYFUNC_CLOSURE(wrapper) \ SWIGINTERN PyObject * \ wrapper##_binaryfunc_closure(PyObject *a, PyObject *b) { \ return SwigPyBuiltin_binaryfunc_closure(wrapper, a, b); \ } SWIGINTERN PyObject * SwigPyBuiltin_binaryfunc_closure(SwigPyWrapperFunction wrapper, PyObject *a, PyObject *b) { PyObject *tuple, *result; tuple = PyTuple_New(1); assert(tuple); Py_INCREF(b); PyTuple_SET_ITEM(tuple, 0, b); result = wrapper(a, tuple); Py_DECREF(tuple); return result; } typedef ternaryfunc ternarycallfunc; #define SWIGPY_TERNARYFUNC_CLOSURE(wrapper) \ SWIGINTERN PyObject * \ wrapper##_ternaryfunc_closure(PyObject *a, PyObject *b, PyObject *c) { \ return SwigPyBuiltin_ternaryfunc_closure(wrapper, a, b, c); \ } SWIGINTERN PyObject * SwigPyBuiltin_ternaryfunc_closure(SwigPyWrapperFunction wrapper, PyObject *a, PyObject *b, PyObject *c) { PyObject *tuple, *result; tuple = PyTuple_New(2); assert(tuple); Py_INCREF(b); PyTuple_SET_ITEM(tuple, 0, b); Py_INCREF(c); PyTuple_SET_ITEM(tuple, 1, c); result = wrapper(a, tuple); Py_DECREF(tuple); return result; } #define SWIGPY_TERNARYCALLFUNC_CLOSURE(wrapper) \ SWIGINTERN PyObject * \ wrapper##_ternarycallfunc_closure(PyObject *a, PyObject *b, PyObject *c) { \ return SwigPyBuiltin_ternarycallfunc_closure(wrapper, a, b, c); \ } SWIGINTERN PyObject * SwigPyBuiltin_ternarycallfunc_closure(SwigPyWrapperFunction wrapper, PyObject *a, PyObject *b, PyObject *c) { (void) c; return wrapper(a, b); } #define SWIGPY_LENFUNC_CLOSURE(wrapper) \ SWIGINTERN Py_ssize_t \ wrapper##_lenfunc_closure(PyObject *a) { \ return SwigPyBuiltin_lenfunc_closure(wrapper, a); \ } SWIGINTERN Py_ssize_t SwigPyBuiltin_lenfunc_closure(SwigPyWrapperFunction wrapper, PyObject *a) { PyObject *resultobj; Py_ssize_t result; resultobj = wrapper(a, NULL); result = PyNumber_AsSsize_t(resultobj, NULL); Py_DECREF(resultobj); return result; } #define SWIGPY_SSIZESSIZEARGFUNC_CLOSURE(wrapper) \ SWIGINTERN PyObject * \ wrapper##_ssizessizeargfunc_closure(PyObject *a, Py_ssize_t b, Py_ssize_t c) { \ return SwigPyBuiltin_ssizessizeargfunc_closure(wrapper, a, b, c); \ } SWIGINTERN PyObject * SwigPyBuiltin_ssizessizeargfunc_closure(SwigPyWrapperFunction wrapper, PyObject *a, Py_ssize_t b, Py_ssize_t c) { PyObject *tuple, *result; tuple = PyTuple_New(2); assert(tuple); PyTuple_SET_ITEM(tuple, 0, _PyLong_FromSsize_t(b)); PyTuple_SET_ITEM(tuple, 1, _PyLong_FromSsize_t(c)); result = wrapper(a, tuple); Py_DECREF(tuple); return result; } #define SWIGPY_SSIZESSIZEOBJARGPROC_CLOSURE(wrapper) \ SWIGINTERN int \ wrapper##_ssizessizeobjargproc_closure(PyObject *a, Py_ssize_t b, Py_ssize_t c, PyObject *d) { \ return SwigPyBuiltin_ssizessizeobjargproc_closure(wrapper, a, b, c, d); \ } SWIGINTERN int SwigPyBuiltin_ssizessizeobjargproc_closure(SwigPyWrapperFunction wrapper, PyObject *a, Py_ssize_t b, Py_ssize_t c, PyObject *d) { PyObject *tuple, *resultobj; int result; tuple = PyTuple_New(d ? 3 : 2); assert(tuple); PyTuple_SET_ITEM(tuple, 0, _PyLong_FromSsize_t(b)); PyTuple_SET_ITEM(tuple, 1, _PyLong_FromSsize_t(c)); if (d) { Py_INCREF(d); PyTuple_SET_ITEM(tuple, 2, d); } resultobj = wrapper(a, tuple); result = resultobj ? 0 : -1; Py_DECREF(tuple); Py_XDECREF(resultobj); return result; } #define SWIGPY_SSIZEARGFUNC_CLOSURE(wrapper) \ SWIGINTERN PyObject * \ wrapper##_ssizeargfunc_closure(PyObject *a, Py_ssize_t b) { \ return SwigPyBuiltin_funpack_ssizeargfunc_closure(wrapper, a, b); \ } SWIGINTERN PyObject * SwigPyBuiltin_funpack_ssizeargfunc_closure(SwigPyWrapperFunction wrapper, PyObject *a, Py_ssize_t b) { PyObject *tuple, *result; tuple = PyTuple_New(1); assert(tuple); PyTuple_SET_ITEM(tuple, 0, _PyLong_FromSsize_t(b)); result = wrapper(a, tuple); Py_DECREF(tuple); return result; } #define SWIGPY_FUNPACK_SSIZEARGFUNC_CLOSURE(wrapper) \ SWIGINTERN PyObject * \ wrapper##_ssizeargfunc_closure(PyObject *a, Py_ssize_t b) { \ return SwigPyBuiltin_ssizeargfunc_closure(wrapper, a, b); \ } SWIGINTERN PyObject * SwigPyBuiltin_ssizeargfunc_closure(SwigPyWrapperFunction wrapper, PyObject *a, Py_ssize_t b) { PyObject *arg, *result; arg = _PyLong_FromSsize_t(b); result = wrapper(a, arg); Py_DECREF(arg); return result; } #define SWIGPY_SSIZEOBJARGPROC_CLOSURE(wrapper) \ SWIGINTERN int \ wrapper##_ssizeobjargproc_closure(PyObject *a, Py_ssize_t b, PyObject *c) { \ return SwigPyBuiltin_ssizeobjargproc_closure(wrapper, a, b, c); \ } SWIGINTERN int SwigPyBuiltin_ssizeobjargproc_closure(SwigPyWrapperFunction wrapper, PyObject *a, Py_ssize_t b, PyObject *c) { PyObject *tuple, *resultobj; int result; tuple = PyTuple_New(2); assert(tuple); PyTuple_SET_ITEM(tuple, 0, _PyLong_FromSsize_t(b)); Py_INCREF(c); PyTuple_SET_ITEM(tuple, 1, c); resultobj = wrapper(a, tuple); result = resultobj ? 0 : -1; Py_XDECREF(resultobj); Py_DECREF(tuple); return result; } #define SWIGPY_OBJOBJPROC_CLOSURE(wrapper) \ SWIGINTERN int \ wrapper##_objobjproc_closure(PyObject *a, PyObject *b) { \ return SwigPyBuiltin_objobjproc_closure(wrapper, a, b); \ } SWIGINTERN int SwigPyBuiltin_objobjproc_closure(SwigPyWrapperFunction wrapper, PyObject *a, PyObject *b) { int result; PyObject *pyresult; PyObject *tuple; tuple = PyTuple_New(1); assert(tuple); Py_INCREF(b); PyTuple_SET_ITEM(tuple, 0, b); pyresult = wrapper(a, tuple); result = pyresult ? (PyObject_IsTrue(pyresult) ? 1 : 0) : -1; Py_XDECREF(pyresult); Py_DECREF(tuple); return result; } #define SWIGPY_FUNPACK_OBJOBJPROC_CLOSURE(wrapper) \ SWIGINTERN int \ wrapper##_objobjproc_closure(PyObject *a, PyObject *b) { \ return SwigPyBuiltin_funpack_objobjproc_closure(wrapper, a, b); \ } SWIGINTERN int SwigPyBuiltin_funpack_objobjproc_closure(SwigPyWrapperFunction wrapper, PyObject *a, PyObject *b) { int result; PyObject *pyresult; pyresult = wrapper(a, b); result = pyresult ? (PyObject_IsTrue(pyresult) ? 1 : 0) : -1; Py_XDECREF(pyresult); return result; } #define SWIGPY_OBJOBJARGPROC_CLOSURE(wrapper) \ SWIGINTERN int \ wrapper##_objobjargproc_closure(PyObject *a, PyObject *b, PyObject *c) { \ return SwigPyBuiltin_objobjargproc_closure(wrapper, a, b, c); \ } SWIGINTERN int SwigPyBuiltin_objobjargproc_closure(SwigPyWrapperFunction wrapper, PyObject *a, PyObject *b, PyObject *c) { PyObject *tuple, *resultobj; int result; tuple = PyTuple_New(c ? 2 : 1); assert(tuple); Py_INCREF(b); PyTuple_SET_ITEM(tuple, 0, b); if (c) { Py_INCREF(c); PyTuple_SET_ITEM(tuple, 1, c); } resultobj = wrapper(a, tuple); result = resultobj ? 0 : -1; Py_XDECREF(resultobj); Py_DECREF(tuple); return result; } #define SWIGPY_REPRFUNC_CLOSURE(wrapper) \ SWIGINTERN PyObject * \ wrapper##_reprfunc_closure(PyObject *a) { \ return SwigPyBuiltin_reprfunc_closure(wrapper, a); \ } SWIGINTERN PyObject * SwigPyBuiltin_reprfunc_closure(SwigPyWrapperFunction wrapper, PyObject *a) { return wrapper(a, NULL); } #define SWIGPY_HASHFUNC_CLOSURE(wrapper) \ SWIGINTERN Py_hash_t \ wrapper##_hashfunc_closure(PyObject *a) { \ return SwigPyBuiltin_hashfunc_closure(wrapper, a); \ } SWIGINTERN Py_hash_t SwigPyBuiltin_hashfunc_closure(SwigPyWrapperFunction wrapper, PyObject *a) { PyObject *pyresult; Py_hash_t result; pyresult = wrapper(a, NULL); if (!pyresult) return -1; result = SWIG_PyNumber_AsPyHash(pyresult); Py_DECREF(pyresult); return result; } #define SWIGPY_ITERNEXTFUNC_CLOSURE(wrapper) \ SWIGINTERN PyObject * \ wrapper##_iternextfunc_closure(PyObject *a) { \ return SwigPyBuiltin_iternextfunc_closure(wrapper, a);\ } SWIGINTERN PyObject * SwigPyBuiltin_iternextfunc_closure(SwigPyWrapperFunction wrapper, PyObject *a) { return wrapper(a, NULL); } /* End of callback function macros for use in PyTypeObject */ #ifdef __cplusplus } #endif swig-4.0.1/Lib/python/std_iostream.i0000644000175000017500000000015313527063513017245 0ustar williamwilliamnamespace std { %callback(1) endl; %callback(1) ends; %callback(1) flush; } %include swig-4.0.1/Lib/python/pyname_compat.i0000644000175000017500000000775613527063513017424 0ustar williamwilliam/* * From SWIG 1.3.37 we deprecated all SWIG symbols that start with Py, * since they are inappropriate and discouraged in Python documentation * (from http://www.python.org/doc/2.5.2/api/includes.html): * * "All user visible names defined by Python.h (except those defined by the included * standard headers) have one of the prefixes "Py" or "_Py". Names beginning with * "_Py" are for internal use by the Python implementation and should not be used * by extension writers. Structure member names do not have a reserved prefix. * * Important: user code should never define names that begin with "Py" or "_Py". * This confuses the reader, and jeopardizes the portability of the user code to * future Python versions, which may define additional names beginning with one * of these prefixes." * * This file defined macros to provide backward compatibility for these deprecated * symbols. In the case you have these symbols in your interface file, you can simply * include this file at beginning of it. * * However, this file may be removed in future release of SWIG, so using this file to * keep these inappropriate names in your SWIG interface file is also not recommended. * Instead, we provide a simple tool for converting your interface files to * the new naming convention. You can get the tool from the SWIG distribution: * Tools/pyname_patch.py */ %fragment("PySequence_Base", "header", fragment="SwigPySequence_Base") {} %fragment("PySequence_Cont", "header", fragment="SwigPySequence_Cont") {} %fragment("PySwigIterator_T", "header", fragment="SwigPyIterator_T") {} %fragment("PyPairBoolOutputIterator", "header", fragment="SwigPyPairBoolOutputIterator") {} %fragment("PySwigIterator", "header", fragment="SwigPyIterator") {} %fragment("PySwigIterator_T", "header", fragment="SwigPyIterator_T") {} %inline %{ #define PyMapIterator_T SwigPyMapIterator_T #define PyMapKeyIterator_T SwigPyMapKeyIterator_T #define PyMapValueIterator_T SwigPyMapValueIterator_T #define PyObject_ptr SwigPtr_PyObject #define PyObject_var SwigVar_PyObject #define PyOper SwigPyOper #define PySeq SwigPySeq #define PySequence_ArrowProxy SwigPySequence_ArrowProxy #define PySequence_Cont SwigPySequence_Cont #define PySequence_InputIterator SwigPySequence_InputIterator #define PySequence_Ref SwigPySequence_Ref #define PySwigClientData SwigPyClientData #define PySwigClientData_Del SwigPyClientData_Del #define PySwigClientData_New SwigPyClientData_New #define PySwigIterator SwigPyIterator #define PySwigIteratorClosed_T SwigPyIteratorClosed_T #define PySwigIteratorOpen_T SwigPyIteratorOpen_T #define PySwigIterator_T SwigPyIterator_T #define PySwigObject SwigPyObject #define PySwigObject_Check SwigPyObject_Check #define PySwigObject_GetDesc SwigPyObject_GetDesc #define PySwigObject_New SwigPyObject_New #define PySwigObject_acquire SwigPyObject_acquire #define PySwigObject_append SwigPyObject_append #define PySwigObject_as_number SwigPyObject_as_number #define PySwigObject_compare SwigPyObject_compare #define PySwigObject_dealloc SwigPyObject_dealloc #define PySwigObject_disown SwigPyObject_disown #define PySwigObject_format SwigPyObject_format #define PySwigObject_getattr SwigPyObject_getattr #define PySwigObject_hex SwigPyObject_hex #define PySwigObject_long SwigPyObject_long #define PySwigObject_next SwigPyObject_next #define PySwigObject_oct SwigPyObject_oct #define PySwigObject_own SwigPyObject_own #define PySwigObject_repr SwigPyObject_repr #define PySwigObject_richcompare SwigPyObject_richcompare #define PySwigObject_type SwigPyObject_type #define PySwigPacked SwigPyPacked #define PySwigPacked_Check SwigPyPacked_Check #define PySwigPacked_New SwigPyPacked_New #define PySwigPacked_UnpackData SwigPyPacked_UnpackData #define PySwigPacked_compare SwigPyPacked_compare #define PySwigPacked_dealloc SwigPyPacked_dealloc #define PySwigPacked_repr SwigPyPacked_repr #define PySwigPacked_str SwigPyPacked_str #define PySwigPacked_type SwigPyPacked_type #define pyseq swigpyseq #define pyswigobject_type swigpyobject_type #define pyswigpacked_type swigpypacked_type %} swig-4.0.1/Lib/python/cdata.i0000644000175000017500000000003613527063513015624 0ustar williamwilliam%include swig-4.0.1/Lib/python/pyapi.swg0000644000175000017500000000135313527063513016245 0ustar williamwilliam/* ----------------------------------------------------------------------------- * Python API portion that goes into the runtime * ----------------------------------------------------------------------------- */ #ifdef __cplusplus extern "C" { #endif /* ----------------------------------------------------------------------------- * Constant declarations * ----------------------------------------------------------------------------- */ /* Constant Types */ #define SWIG_PY_POINTER 4 #define SWIG_PY_BINARY 5 /* Constant information structure */ typedef struct swig_const_info { int type; const char *name; long lvalue; double dvalue; void *pvalue; swig_type_info **ptype; } swig_const_info; #ifdef __cplusplus } #endif swig-4.0.1/Lib/python/std_vectora.i0000644000175000017500000000147513527063513017075 0ustar williamwilliam/* Vectors + allocators */ %fragment("StdVectorATraits","header",fragment="StdSequenceTraits") %{ namespace swig { template struct traits_asptr > { typedef std::vector vector_type; typedef T value_type; static int asptr(PyObject *obj, vector_type **vec) { return traits_asptr_stdseq::asptr(obj, vec); } }; template struct traits_from > { typedef std::vector vector_type; static PyObject *from(const vector_type& vec) { return traits_from_stdseq::from(vec); } }; } %} #define %swig_vector_methods(Type...) %swig_sequence_methods(Type) #define %swig_vector_methods_val(Type...) %swig_sequence_methods_val(Type); %include swig-4.0.1/Lib/python/std_string.i0000644000175000017500000000004313527063513016726 0ustar williamwilliam%include swig-4.0.1/Lib/python/std_ios.i0000644000175000017500000000010213527063513016206 0ustar williamwilliam%rename(ios_base_in) std::ios_base::in; %include swig-4.0.1/Lib/python/std_map.i0000644000175000017500000002345313527063513016207 0ustar williamwilliam/* Maps */ %fragment("StdMapCommonTraits","header",fragment="StdSequenceTraits") { namespace swig { template struct from_key_oper { typedef const ValueType& argument_type; typedef PyObject *result_type; result_type operator()(argument_type v) const { return swig::from(v.first); } }; template struct from_value_oper { typedef const ValueType& argument_type; typedef PyObject *result_type; result_type operator()(argument_type v) const { return swig::from(v.second); } }; template struct SwigPyMapIterator_T : SwigPyIteratorClosed_T { SwigPyMapIterator_T(OutIterator curr, OutIterator first, OutIterator last, PyObject *seq) : SwigPyIteratorClosed_T(curr, first, last, seq) { } }; template > struct SwigPyMapKeyIterator_T : SwigPyMapIterator_T { SwigPyMapKeyIterator_T(OutIterator curr, OutIterator first, OutIterator last, PyObject *seq) : SwigPyMapIterator_T(curr, first, last, seq) { } }; template inline SwigPyIterator* make_output_key_iterator(const OutIter& current, const OutIter& begin, const OutIter& end, PyObject *seq = 0) { return new SwigPyMapKeyIterator_T(current, begin, end, seq); } template > struct SwigPyMapValueIterator_T : SwigPyMapIterator_T { SwigPyMapValueIterator_T(OutIterator curr, OutIterator first, OutIterator last, PyObject *seq) : SwigPyMapIterator_T(curr, first, last, seq) { } }; template inline SwigPyIterator* make_output_value_iterator(const OutIter& current, const OutIter& begin, const OutIter& end, PyObject *seq = 0) { return new SwigPyMapValueIterator_T(current, begin, end, seq); } } } %fragment("StdMapTraits","header",fragment="StdMapCommonTraits") { namespace swig { template inline void assign(const SwigPySeq& swigpyseq, std::map *map) { typedef typename std::map::value_type value_type; typename SwigPySeq::const_iterator it = swigpyseq.begin(); for (;it != swigpyseq.end(); ++it) { map->insert(value_type(it->first, it->second)); } } template struct traits_asptr > { typedef std::map map_type; static int asptr(PyObject *obj, map_type **val) { int res = SWIG_ERROR; SWIG_PYTHON_THREAD_BEGIN_BLOCK; if (PyDict_Check(obj)) { SwigVar_PyObject items = PyObject_CallMethod(obj,(char *)"items",NULL); %#if PY_VERSION_HEX >= 0x03000000 /* In Python 3.x the ".items()" method returns a dict_items object */ items = PySequence_Fast(items, ".items() didn't return a sequence!"); %#endif res = traits_asptr_stdseq >::asptr(items, val); } else { map_type *p; swig_type_info *descriptor = swig::type_info(); res = descriptor ? SWIG_ConvertPtr(obj, (void **)&p, descriptor, 0) : SWIG_ERROR; if (SWIG_IsOK(res) && val) *val = p; } SWIG_PYTHON_THREAD_END_BLOCK; return res; } }; template struct traits_from > { typedef std::map map_type; typedef typename map_type::const_iterator const_iterator; typedef typename map_type::size_type size_type; static PyObject *asdict(const map_type& map) { SWIG_PYTHON_THREAD_BEGIN_BLOCK; size_type size = map.size(); Py_ssize_t pysize = (size <= (size_type) INT_MAX) ? (Py_ssize_t) size : -1; if (pysize < 0) { PyErr_SetString(PyExc_OverflowError, "map size not valid in python"); SWIG_PYTHON_THREAD_END_BLOCK; return NULL; } PyObject *obj = PyDict_New(); for (const_iterator i= map.begin(); i!= map.end(); ++i) { swig::SwigVar_PyObject key = swig::from(i->first); swig::SwigVar_PyObject val = swig::from(i->second); PyDict_SetItem(obj, key, val); } SWIG_PYTHON_THREAD_END_BLOCK; return obj; } static PyObject *from(const map_type& map) { swig_type_info *desc = swig::type_info(); if (desc && desc->clientdata) { return SWIG_InternalNewPointerObj(new map_type(map), desc, SWIG_POINTER_OWN); } else { return asdict(map); } } }; } } %define %swig_map_common(Map...) %swig_sequence_iterator(Map); %swig_container_methods(Map) #if defined(SWIGPYTHON_BUILTIN) %feature("python:slot", "mp_length", functype="lenfunc") __len__; %feature("python:slot", "mp_subscript", functype="binaryfunc") __getitem__; %feature("python:slot", "tp_iter", functype="getiterfunc") key_iterator; %feature("python:slot", "sq_contains", functype="objobjproc") __contains__; %extend { %newobject iterkeys(PyObject **PYTHON_SELF); swig::SwigPyIterator* iterkeys(PyObject **PYTHON_SELF) { return swig::make_output_key_iterator(self->begin(), self->begin(), self->end(), *PYTHON_SELF); } %newobject itervalues(PyObject **PYTHON_SELF); swig::SwigPyIterator* itervalues(PyObject **PYTHON_SELF) { return swig::make_output_value_iterator(self->begin(), self->begin(), self->end(), *PYTHON_SELF); } %newobject iteritems(PyObject **PYTHON_SELF); swig::SwigPyIterator* iteritems(PyObject **PYTHON_SELF) { return swig::make_output_iterator(self->begin(), self->begin(), self->end(), *PYTHON_SELF); } } #else %extend { %pythoncode %{def __iter__(self): return self.key_iterator()%} %pythoncode %{def iterkeys(self): return self.key_iterator()%} %pythoncode %{def itervalues(self): return self.value_iterator()%} %pythoncode %{def iteritems(self): return self.iterator()%} } #endif %extend { mapped_type const & __getitem__(const key_type& key) throw (std::out_of_range) { Map::const_iterator i = self->find(key); if (i != self->end()) return i->second; else throw std::out_of_range("key not found"); } void __delitem__(const key_type& key) throw (std::out_of_range) { Map::iterator i = self->find(key); if (i != self->end()) self->erase(i); else throw std::out_of_range("key not found"); } bool has_key(const key_type& key) const { Map::const_iterator i = self->find(key); return i != self->end(); } PyObject* keys() { Map::size_type size = self->size(); Py_ssize_t pysize = (size <= (Map::size_type) INT_MAX) ? (Py_ssize_t) size : -1; SWIG_PYTHON_THREAD_BEGIN_BLOCK; if (pysize < 0) { PyErr_SetString(PyExc_OverflowError, "map size not valid in python"); SWIG_PYTHON_THREAD_END_BLOCK; return NULL; } PyObject* keyList = PyList_New(pysize); Map::const_iterator i = self->begin(); for (Py_ssize_t j = 0; j < pysize; ++i, ++j) { PyList_SET_ITEM(keyList, j, swig::from(i->first)); } SWIG_PYTHON_THREAD_END_BLOCK; return keyList; } PyObject* values() { Map::size_type size = self->size(); Py_ssize_t pysize = (size <= (Map::size_type) INT_MAX) ? (Py_ssize_t) size : -1; SWIG_PYTHON_THREAD_BEGIN_BLOCK; if (pysize < 0) { PyErr_SetString(PyExc_OverflowError, "map size not valid in python"); SWIG_PYTHON_THREAD_END_BLOCK; return NULL; } PyObject* valList = PyList_New(pysize); Map::const_iterator i = self->begin(); for (Py_ssize_t j = 0; j < pysize; ++i, ++j) { PyList_SET_ITEM(valList, j, swig::from(i->second)); } SWIG_PYTHON_THREAD_END_BLOCK; return valList; } PyObject* items() { Map::size_type size = self->size(); Py_ssize_t pysize = (size <= (Map::size_type) INT_MAX) ? (Py_ssize_t) size : -1; SWIG_PYTHON_THREAD_BEGIN_BLOCK; if (pysize < 0) { PyErr_SetString(PyExc_OverflowError, "map size not valid in python"); SWIG_PYTHON_THREAD_END_BLOCK; return NULL; } PyObject* itemList = PyList_New(pysize); Map::const_iterator i = self->begin(); for (Py_ssize_t j = 0; j < pysize; ++i, ++j) { PyList_SET_ITEM(itemList, j, swig::from(*i)); } SWIG_PYTHON_THREAD_END_BLOCK; return itemList; } bool __contains__(const key_type& key) { return self->find(key) != self->end(); } %newobject key_iterator(PyObject **PYTHON_SELF); swig::SwigPyIterator* key_iterator(PyObject **PYTHON_SELF) { return swig::make_output_key_iterator(self->begin(), self->begin(), self->end(), *PYTHON_SELF); } %newobject value_iterator(PyObject **PYTHON_SELF); swig::SwigPyIterator* value_iterator(PyObject **PYTHON_SELF) { return swig::make_output_value_iterator(self->begin(), self->begin(), self->end(), *PYTHON_SELF); } } %enddef %define %swig_map_methods(Map...) %swig_map_common(Map) #if defined(SWIGPYTHON_BUILTIN) %feature("python:slot", "mp_ass_subscript", functype="objobjargproc") __setitem__; #endif %extend { // This will be called through the mp_ass_subscript slot to delete an entry. void __setitem__(const key_type& key) { self->erase(key); } void __setitem__(const key_type& key, const mapped_type& x) throw (std::out_of_range) { (*self)[key] = x; } PyObject* asdict() { return swig::traits_from< Map >::asdict(*self); } } %enddef %include swig-4.0.1/Lib/python/cstring.i0000644000175000017500000000004013527063513016214 0ustar williamwilliam%include swig-4.0.1/Lib/python/factory.i0000644000175000017500000000004013527063513016212 0ustar williamwilliam%include swig-4.0.1/Lib/python/boost_shared_ptr.i0000644000175000017500000005255713527063513020130 0ustar williamwilliam%include // Set SHARED_PTR_DISOWN to $disown if required, for example // #define SHARED_PTR_DISOWN $disown #if !defined(SHARED_PTR_DISOWN) #define SHARED_PTR_DISOWN 0 #endif %fragment("SWIG_null_deleter_python", "header", fragment="SWIG_null_deleter") { %#define SWIG_NO_NULL_DELETER_SWIG_BUILTIN_INIT } // Language specific macro implementing all the customisations for handling the smart pointer %define SWIG_SHARED_PTR_TYPEMAPS(CONST, TYPE...) // %naturalvar is as documented for member variables %naturalvar TYPE; %naturalvar SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >; // destructor wrapper customisation %feature("unref") TYPE //"if (debug_shared) { cout << \"deleting use_count: \" << (*smartarg1).use_count() << \" [\" << (boost::get_deleter(*smartarg1) ? std::string(\"CANNOT BE DETERMINED SAFELY\") : ( (*smartarg1).get() ? (*smartarg1)->getValue() : std::string(\"NULL PTR\") )) << \"]\" << endl << flush; }\n" "(void)arg1; delete smartarg1;" // Typemap customisations... // plain value %typemap(in) CONST TYPE (void *argp, int res = 0) { int newmem = 0; res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } if (!argp) { %argument_nullref("$type", $symname, $argnum); } else { $1 = *(%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *)->get()); if (newmem & SWIG_CAST_NEW_MEMORY) delete %reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); } } %typemap(out) CONST TYPE { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(new $1_ltype(($1_ltype &)$1)); %set_output(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } %typemap(varin) CONST TYPE { void *argp = 0; int newmem = 0; int res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %variable_fail(res, "$type", "$name"); } if (!argp) { %variable_nullref("$type", "$name"); } else { $1 = *(%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *)->get()); if (newmem & SWIG_CAST_NEW_MEMORY) delete %reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); } } %typemap(varout) CONST TYPE { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(new $1_ltype(($1_ltype &)$1)); %set_varoutput(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } %typemap(directorin,noblock=1) CONST TYPE (SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0) %{ smartarg = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(new $1_ltype(($1_ltype &)$1)); $input = SWIG_NewPointerObj(%as_voidptr(smartarg), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN | %newpointer_flags); %} %typemap(directorout,noblock=1) CONST TYPE (void *swig_argp, int swig_res = 0) { int newmem = 0; swig_res = SWIG_ConvertPtrAndOwn($input, &swig_argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(swig_res)) { %dirout_fail(swig_res, "$type"); } if (!swig_argp) { %dirout_nullref("$type"); } else { $result = *(%reinterpret_cast(swig_argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *)->get()); if (newmem & SWIG_CAST_NEW_MEMORY) delete %reinterpret_cast(swig_argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); } } // plain pointer // Note: $disown not implemented by default as it will lead to a memory leak of the shared_ptr instance %typemap(in) CONST TYPE * (void *argp = 0, int res = 0, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > tempshared, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0) { int newmem = 0; res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SHARED_PTR_DISOWN | %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } if (newmem & SWIG_CAST_NEW_MEMORY) { tempshared = *%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); delete %reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); $1 = %const_cast(tempshared.get(), $1_ltype); } else { smartarg = %reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); $1 = %const_cast((smartarg ? smartarg->get() : 0), $1_ltype); } } %typemap(out, fragment="SWIG_null_deleter_python") CONST TYPE * { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1 SWIG_NO_NULL_DELETER_$owner) : 0; %set_output(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), $owner | SWIG_POINTER_OWN)); } %typemap(varin) CONST TYPE * { void *argp = 0; int newmem = 0; int res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %variable_fail(res, "$type", "$name"); } SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > tempshared; SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0; if (newmem & SWIG_CAST_NEW_MEMORY) { tempshared = *%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); delete %reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); $1 = %const_cast(tempshared.get(), $1_ltype); } else { smartarg = %reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); $1 = %const_cast((smartarg ? smartarg->get() : 0), $1_ltype); } } %typemap(varout, fragment="SWIG_null_deleter_python") CONST TYPE * { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1 SWIG_NO_NULL_DELETER_0) : 0; %set_varoutput(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } %typemap(directorin,noblock=1, fragment="SWIG_null_deleter_python") CONST TYPE * (SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0) %{ smartarg = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1 SWIG_NO_NULL_DELETER_0) : 0; $input = SWIG_NewPointerObj(%as_voidptr(smartarg), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN | %newpointer_flags); %} %typemap(directorout,noblock=1) CONST TYPE * %{ #error "directorout typemap for plain pointer not implemented" %} // plain reference %typemap(in) CONST TYPE & (void *argp = 0, int res = 0, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > tempshared) { int newmem = 0; res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } if (!argp) { %argument_nullref("$type", $symname, $argnum); } if (newmem & SWIG_CAST_NEW_MEMORY) { tempshared = *%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); delete %reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); $1 = %const_cast(tempshared.get(), $1_ltype); } else { $1 = %const_cast(%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *)->get(), $1_ltype); } } %typemap(out, fragment="SWIG_null_deleter_python") CONST TYPE & { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1 SWIG_NO_NULL_DELETER_$owner); %set_output(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } %typemap(varin) CONST TYPE & { void *argp = 0; int newmem = 0; int res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %variable_fail(res, "$type", "$name"); } SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > tempshared; if (!argp) { %variable_nullref("$type", "$name"); } if (newmem & SWIG_CAST_NEW_MEMORY) { tempshared = *%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); delete %reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); $1 = *%const_cast(tempshared.get(), $1_ltype); } else { $1 = *%const_cast(%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *)->get(), $1_ltype); } } %typemap(varout, fragment="SWIG_null_deleter_python") CONST TYPE & { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(&$1 SWIG_NO_NULL_DELETER_0); %set_varoutput(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } %typemap(directorin,noblock=1, fragment="SWIG_null_deleter_python") CONST TYPE & (SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0) %{ smartarg = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(&$1 SWIG_NO_NULL_DELETER_0); $input = SWIG_NewPointerObj(%as_voidptr(smartarg), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN | %newpointer_flags); %} %typemap(directorout,noblock=1) CONST TYPE & %{ #error "directorout typemap for plain reference not implemented" %} // plain pointer by reference // Note: $disown not implemented by default as it will lead to a memory leak of the shared_ptr instance %typemap(in) TYPE *CONST& (void *argp = 0, int res = 0, $*1_ltype temp = 0, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > tempshared) { int newmem = 0; res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SHARED_PTR_DISOWN | %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } if (newmem & SWIG_CAST_NEW_MEMORY) { tempshared = *%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); delete %reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); temp = %const_cast(tempshared.get(), $*1_ltype); } else { temp = %const_cast(%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *)->get(), $*1_ltype); } $1 = &temp; } %typemap(out, fragment="SWIG_null_deleter_python") TYPE *CONST& { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = *$1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(*$1 SWIG_NO_NULL_DELETER_$owner) : 0; %set_output(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } %typemap(varin) TYPE *CONST& %{ #error "varin typemap not implemented" %} %typemap(varout) TYPE *CONST& %{ #error "varout typemap not implemented" %} %typemap(directorin,noblock=1, fragment="SWIG_null_deleter_python") TYPE *CONST& (SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0) %{ smartarg = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1 SWIG_NO_NULL_DELETER_0) : 0; $input = SWIG_NewPointerObj(%as_voidptr(smartarg), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN | %newpointer_flags); %} %typemap(directorout,noblock=1) TYPE *CONST& %{ #error "directorout typemap for plain pointer by reference not implemented" %} // shared_ptr by value %typemap(in) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > (void *argp, int res = 0) { int newmem = 0; res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } if (argp) $1 = *(%reinterpret_cast(argp, $<ype)); if (newmem & SWIG_CAST_NEW_MEMORY) delete %reinterpret_cast(argp, $<ype); } %typemap(out) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1) : 0; %set_output(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } %typemap(varin) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > { int newmem = 0; void *argp = 0; int res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %variable_fail(res, "$type", "$name"); } $1 = argp ? *(%reinterpret_cast(argp, $<ype)) : SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE >(); if (newmem & SWIG_CAST_NEW_MEMORY) delete %reinterpret_cast(argp, $<ype); } %typemap(varout) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1) : 0; %set_varoutput(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } %typemap(directorin,noblock=1) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > (SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0) %{ smartarg = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1) : 0; $input = SWIG_NewPointerObj(%as_voidptr(smartarg), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN | %newpointer_flags); %} %typemap(directorout,noblock=1) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > (void *swig_argp, int swig_res = 0) { int newmem = 0; swig_res = SWIG_ConvertPtrAndOwn($input, &swig_argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(swig_res)) { %dirout_fail(swig_res, "$type"); } if (swig_argp) { $result = *(%reinterpret_cast(swig_argp, $<ype)); if (newmem & SWIG_CAST_NEW_MEMORY) delete %reinterpret_cast(swig_argp, $<ype); } } // shared_ptr by reference %typemap(in) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > & (void *argp, int res = 0, $*1_ltype tempshared) { int newmem = 0; res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } if (newmem & SWIG_CAST_NEW_MEMORY) { if (argp) tempshared = *%reinterpret_cast(argp, $ltype); delete %reinterpret_cast(argp, $ltype); $1 = &tempshared; } else { $1 = (argp) ? %reinterpret_cast(argp, $ltype) : &tempshared; } } %typemap(out) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > & { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = *$1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(*$1) : 0; %set_output(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } %typemap(varin) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > & %{ #error "varin typemap not implemented" %} %typemap(varout) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > & %{ #error "varout typemap not implemented" %} %typemap(directorin,noblock=1) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > & (SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0) %{ smartarg = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1) : 0; $input = SWIG_NewPointerObj(%as_voidptr(smartarg), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN | %newpointer_flags); %} %typemap(directorout,noblock=1) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > & %{ #error "directorout typemap for shared_ptr ref not implemented" %} // shared_ptr by pointer %typemap(in) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * (void *argp, int res = 0, $*1_ltype tempshared) { int newmem = 0; res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } if (newmem & SWIG_CAST_NEW_MEMORY) { if (argp) tempshared = *%reinterpret_cast(argp, $ltype); delete %reinterpret_cast(argp, $ltype); $1 = &tempshared; } else { $1 = (argp) ? %reinterpret_cast(argp, $ltype) : &tempshared; } } %typemap(out) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = ($1 && *$1) ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(*$1) : 0; %set_output(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); if ($owner) delete $1; } %typemap(varin) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * %{ #error "varin typemap not implemented" %} %typemap(varout) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * %{ #error "varout typemap not implemented" %} %typemap(directorin,noblock=1) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * (SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0) %{ smartarg = ($1 && *$1) ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(*$1) : 0; $input = SWIG_NewPointerObj(%as_voidptr(smartarg), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN | %newpointer_flags); %} %typemap(directorout,noblock=1) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * %{ #error "directorout typemap for pointer to shared_ptr not implemented" %} // shared_ptr by pointer reference %typemap(in) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& (void *argp, int res = 0, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > tempshared, $*1_ltype temp = 0) { int newmem = 0; res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } if (argp) tempshared = *%reinterpret_cast(argp, $*ltype); if (newmem & SWIG_CAST_NEW_MEMORY) delete %reinterpret_cast(argp, $*ltype); temp = &tempshared; $1 = &temp; } %typemap(out) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = (*$1 && **$1) ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(**$1) : 0; %set_output(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } %typemap(varin) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& %{ #error "varin typemap not implemented" %} %typemap(varout) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& %{ #error "varout typemap not implemented" %} %typemap(directorin,noblock=1) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& (SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0) %{ smartarg = ($1 && *$1) ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(*$1) : 0; $input = SWIG_NewPointerObj(%as_voidptr(smartarg), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN | %newpointer_flags); %} %typemap(directorout,noblock=1) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& %{ #error "directorout typemap for pointer ref to shared_ptr not implemented" %} // Typecheck typemaps // Note: SWIG_ConvertPtr with void ** parameter set to 0 instead of using SWIG_ConvertPtrAndOwn, so that the casting // function is not called thereby avoiding a possible smart pointer copy constructor call when casting up the inheritance chain. %typemap(typecheck, precedence=SWIG_TYPECHECK_POINTER, equivalent="TYPE *", noblock=1) TYPE CONST, TYPE CONST &, TYPE CONST *, TYPE *CONST&, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > &, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& { int res = SWIG_ConvertPtr($input, 0, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), 0); $1 = SWIG_CheckState(res); } // various missing typemaps - If ever used (unlikely) ensure compilation error rather than runtime bug %typemap(in) CONST TYPE[], CONST TYPE[ANY], CONST TYPE (CLASS::*) %{ #error "typemaps for $1_type not available" %} %typemap(out) CONST TYPE[], CONST TYPE[ANY], CONST TYPE (CLASS::*) %{ #error "typemaps for $1_type not available" %} %typemap(doctype) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > &, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& %{TYPE%} %template() SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >; %enddef swig-4.0.1/Lib/stl.i0000644000175000017500000000037113527063513014033 0ustar williamwilliam/* ----------------------------------------------------------------------------- * stl.i * ----------------------------------------------------------------------------- */ #warning "stl.i not implemented for this target" #define SWIG_STL_UNIMPL swig-4.0.1/Lib/mzscheme/0000755000175000017500000000000013527063513014671 5ustar williamwilliamswig-4.0.1/Lib/mzscheme/std_deque.i0000644000175000017500000000003413527063513017015 0ustar williamwilliam%include swig-4.0.1/Lib/mzscheme/std_vector.i0000644000175000017500000004372313527063513017230 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_vector.i * * SWIG typemaps for std::vector * ----------------------------------------------------------------------------- */ %include // ------------------------------------------------------------------------ // std::vector // // The aim of all that follows would be to integrate std::vector with // MzScheme as much as possible, namely, to allow the user to pass and // be returned MzScheme vectors or lists. // const declarations are used to guess the intent of the function being // exported; therefore, the following rationale is applied: // // -- f(std::vector), f(const std::vector&), f(const std::vector*): // the parameter being read-only, either a MzScheme sequence or a // previously wrapped std::vector can be passed. // -- f(std::vector&), f(std::vector*): // the parameter must be modified; therefore, only a wrapped std::vector // can be passed. // -- std::vector f(): // the vector is returned by copy; therefore, a MzScheme vector of T:s // is returned which is most easily used in other MzScheme functions // -- std::vector& f(), std::vector* f(), const std::vector& f(), // const std::vector* f(): // the vector is returned by reference; therefore, a wrapped std::vector // is returned // ------------------------------------------------------------------------ %{ #include #include #include %} // exported class namespace std { template class vector { %typemap(in) vector { if (SCHEME_VECTORP($input)) { unsigned int size = SCHEME_VEC_SIZE($input); $1 = std::vector(size); Scheme_Object** items = SCHEME_VEC_ELS($input); for (unsigned int i=0; i(); } else if (SCHEME_PAIRP($input)) { Scheme_Object *head, *tail; $1 = std::vector(); tail = $input; while (!SCHEME_NULLP(tail)) { head = scheme_car(tail); tail = scheme_cdr(tail); $1.push_back(*((T*)SWIG_MustGetPtr(head, $descriptor(T *), $argnum, 0))); } } else { $1 = *(($&1_type) SWIG_MustGetPtr($input,$&1_descriptor,$argnum, 0)); } } %typemap(in) const vector& (std::vector temp), const vector* (std::vector temp) { if (SCHEME_VECTORP($input)) { unsigned int size = SCHEME_VEC_SIZE($input); temp = std::vector(size); $1 = &temp; Scheme_Object** items = SCHEME_VEC_ELS($input); for (unsigned int i=0; i(); $1 = &temp; } else if (SCHEME_PAIRP($input)) { temp = std::vector(); $1 = &temp; Scheme_Object *head, *tail; tail = $input; while (!SCHEME_NULLP(tail)) { head = scheme_car(tail); tail = scheme_cdr(tail); temp.push_back(*((T*) SWIG_MustGetPtr(head, $descriptor(T *), $argnum, 0))); } } else { $1 = ($1_ltype) SWIG_MustGetPtr($input,$1_descriptor,$argnum, 0); } } %typemap(out) vector { $result = scheme_make_vector($1.size(),scheme_undefined); Scheme_Object** els = SCHEME_VEC_ELS($result); for (unsigned int i=0; i<$1.size(); i++) { T* x = new T((($1_type &)$1)[i]); els[i] = SWIG_NewPointerObj(x,$descriptor(T *), 1); } } %typecheck(SWIG_TYPECHECK_VECTOR) vector { /* native sequence? */ if (SCHEME_VECTORP($input)) { unsigned int size = SCHEME_VEC_SIZE($input); if (size == 0) { /* an empty sequence can be of any type */ $1 = 1; } else { /* check the first element only */ T* x; Scheme_Object** items = SCHEME_VEC_ELS($input); if (SWIG_ConvertPtr(items[0],(void**) &x, $descriptor(T *), 0) != -1) $1 = 1; else $1 = 0; } } else if (SCHEME_NULLP($input)) { /* again, an empty sequence can be of any type */ $1 = 1; } else if (SCHEME_PAIRP($input)) { /* check the first element only */ T* x; Scheme_Object *head = scheme_car($input); if (SWIG_ConvertPtr(head,(void**) &x, $descriptor(T *), 0) != -1) $1 = 1; else $1 = 0; } else { /* wrapped vector? */ std::vector* v; if (SWIG_ConvertPtr($input,(void **) &v, $&1_descriptor, 0) != -1) $1 = 1; else $1 = 0; } } %typecheck(SWIG_TYPECHECK_VECTOR) const vector&, const vector* { /* native sequence? */ if (SCHEME_VECTORP($input)) { unsigned int size = SCHEME_VEC_SIZE($input); if (size == 0) { /* an empty sequence can be of any type */ $1 = 1; } else { /* check the first element only */ T* x; Scheme_Object** items = SCHEME_VEC_ELS($input); if (SWIG_ConvertPtr(items[0],(void**) &x, $descriptor(T *), 0) != -1) $1 = 1; else $1 = 0; } } else if (SCHEME_NULLP($input)) { /* again, an empty sequence can be of any type */ $1 = 1; } else if (SCHEME_PAIRP($input)) { /* check the first element only */ T* x; Scheme_Object *head = scheme_car($input); if (SWIG_ConvertPtr(head,(void**) &x, $descriptor(T *), 0) != -1) $1 = 1; else $1 = 0; } else { /* wrapped vector? */ std::vector* v; if (SWIG_ConvertPtr($input,(void **) &v, $1_descriptor, 0) != -1) $1 = 1; else $1 = 0; } } public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef T value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; vector(unsigned int size = 0); vector(unsigned int size, const T& value); vector(const vector& other); %rename(length) size; unsigned int size() const; %rename("empty?") empty; bool empty() const; %rename("clear!") clear; void clear(); %rename("set!") set; %rename("pop!") pop; %rename("push!") push_back; void push_back(const T& x); %extend { T pop() throw (std::out_of_range) { if (self->size() == 0) throw std::out_of_range("pop from empty vector"); T x = self->back(); self->pop_back(); return x; } T& ref(int i) throw (std::out_of_range) { int size = int(self->size()); if (i>=0 && isize()); if (i>=0 && i class vector { %typemap(in) vector { if (SCHEME_VECTORP($input)) { unsigned int size = SCHEME_VEC_SIZE($input); $1 = std::vector(size); Scheme_Object** items = SCHEME_VEC_ELS($input); for (unsigned int i=0; i", $argnum - 1, argc, argv); } } else if (SCHEME_NULLP($input)) { $1 = std::vector(); } else if (SCHEME_PAIRP($input)) { Scheme_Object *head, *tail; $1 = std::vector(); tail = $input; while (!SCHEME_NULLP(tail)) { head = scheme_car(tail); tail = scheme_cdr(tail); if (CHECK(head)) $1.push_back((T)(CONVERT_FROM(head))); else scheme_wrong_type(FUNC_NAME, "vector<" #T ">", $argnum - 1, argc, argv); } } else { $1 = *(($&1_type) SWIG_MustGetPtr($input,$&1_descriptor,$argnum, 0)); } } %typemap(in) const vector& (std::vector temp), const vector* (std::vector temp) { if (SCHEME_VECTORP($input)) { unsigned int size = SCHEME_VEC_SIZE($input); temp = std::vector(size); $1 = &temp; Scheme_Object** items = SCHEME_VEC_ELS($input); for (unsigned int i=0; i", $argnum - 1, argc, argv); } } else if (SCHEME_NULLP($input)) { temp = std::vector(); $1 = &temp; } else if (SCHEME_PAIRP($input)) { temp = std::vector(); $1 = &temp; Scheme_Object *head, *tail; tail = $input; while (!SCHEME_NULLP(tail)) { head = scheme_car(tail); tail = scheme_cdr(tail); if (CHECK(head)) temp.push_back((T)(CONVERT_FROM(head))); else scheme_wrong_type(FUNC_NAME, "vector<" #T ">", $argnum - 1, argc, argv); } } else { $1 = ($1_ltype) SWIG_MustGetPtr($input,$1_descriptor,$argnum - 1, 0); } } %typemap(out) vector { $result = scheme_make_vector($1.size(),scheme_undefined); Scheme_Object** els = SCHEME_VEC_ELS($result); for (unsigned int i=0; i<$1.size(); i++) els[i] = CONVERT_TO((($1_type &)$1)[i]); } %typecheck(SWIG_TYPECHECK_VECTOR) vector { /* native sequence? */ if (SCHEME_VECTORP($input)) { unsigned int size = SCHEME_VEC_SIZE($input); if (size == 0) { /* an empty sequence can be of any type */ $1 = 1; } else { /* check the first element only */ T* x; Scheme_Object** items = SCHEME_VEC_ELS($input); $1 = CHECK(items[0]) ? 1 : 0; } } else if (SCHEME_NULLP($input)) { /* again, an empty sequence can be of any type */ $1 = 1; } else if (SCHEME_PAIRP($input)) { /* check the first element only */ T* x; Scheme_Object *head = scheme_car($input); $1 = CHECK(head) ? 1 : 0; } else { /* wrapped vector? */ std::vector* v; $1 = (SWIG_ConvertPtr($input,(void **) &v, $&1_descriptor, 0) != -1) ? 1 : 0; } } %typecheck(SWIG_TYPECHECK_VECTOR) const vector&, const vector* { /* native sequence? */ if (SCHEME_VECTORP($input)) { unsigned int size = SCHEME_VEC_SIZE($input); if (size == 0) { /* an empty sequence can be of any type */ $1 = 1; } else { /* check the first element only */ T* x; Scheme_Object** items = SCHEME_VEC_ELS($input); $1 = CHECK(items[0]) ? 1 : 0; } } else if (SCHEME_NULLP($input)) { /* again, an empty sequence can be of any type */ $1 = 1; } else if (SCHEME_PAIRP($input)) { /* check the first element only */ T* x; Scheme_Object *head = scheme_car($input); $1 = CHECK(head) ? 1 : 0; } else { /* wrapped vector? */ std::vector* v; $1 = (SWIG_ConvertPtr($input,(void **) &v, $1_descriptor, 0) != -1) ? 1 : 0; } } public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef T value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; vector(unsigned int size = 0); vector(unsigned int size, const T& value); vector(const vector& other); %rename(length) size; unsigned int size() const; %rename("empty?") empty; bool empty() const; %rename("clear!") clear; void clear(); %rename("set!") set; %rename("pop!") pop; %rename("push!") push_back; void push_back(T x); %extend { T pop() throw (std::out_of_range) { if (self->size() == 0) throw std::out_of_range("pop from empty vector"); T x = self->back(); self->pop_back(); return x; } T ref(int i) throw (std::out_of_range) { int size = int(self->size()); if (i>=0 && isize()); if (i>=0 && i #include #include #include #include #include #ifdef __cplusplus extern "C" { #endif /* Common SWIG API */ #define SWIG_ConvertPtr(s, result, type, flags) \ SWIG_MzScheme_ConvertPtr(s, result, type, flags) #define SWIG_NewPointerObj(ptr, type, owner) \ SWIG_MzScheme_NewPointerObj((void *)ptr, type, owner) #define SWIG_MustGetPtr(s, type, argnum, flags) \ SWIG_MzScheme_MustGetPtr(s, type, argnum, flags, FUNC_NAME, argc, argv) #define SWIG_contract_assert(expr,msg) \ if (!(expr)) { \ char *m=(char *) scheme_malloc(strlen(msg)+1000); \ sprintf(m,"SWIG contract, assertion failed: function=%s, message=%s", \ (char *) FUNC_NAME,(char *) msg); \ scheme_signal_error(m); \ } /* Runtime API */ #define SWIG_GetModule(clientdata) SWIG_MzScheme_GetModule((Scheme_Env *)(clientdata)) #define SWIG_SetModule(clientdata, pointer) SWIG_MzScheme_SetModule((Scheme_Env *) (clientdata), pointer) #define SWIG_MODULE_CLIENTDATA_TYPE Scheme_Env * /* MzScheme-specific SWIG API */ #define SWIG_malloc(size) SWIG_MzScheme_Malloc(size, FUNC_NAME) #define SWIG_free(mem) free(mem) #define SWIG_NewStructFromPtr(ptr,type) \ _swig_convert_struct_##type##(ptr) #define MAXVALUES 6 #define swig_make_boolean(b) (b ? scheme_true : scheme_false) static long SWIG_convert_integer(Scheme_Object *o, long lower_bound, long upper_bound, const char *func_name, int argnum, int argc, Scheme_Object **argv) { long value; int status = scheme_get_int_val(o, &value); if (!status) scheme_wrong_type(func_name, "integer", argnum, argc, argv); if (value < lower_bound || value > upper_bound) scheme_wrong_type(func_name, "integer", argnum, argc, argv); return value; } static int SWIG_is_integer(Scheme_Object *o) { long value; return scheme_get_int_val(o, &value); } static unsigned long SWIG_convert_unsigned_integer(Scheme_Object *o, unsigned long lower_bound, unsigned long upper_bound, const char *func_name, int argnum, int argc, Scheme_Object **argv) { unsigned long value; int status = scheme_get_unsigned_int_val(o, &value); if (!status) scheme_wrong_type(func_name, "integer", argnum, argc, argv); if (value < lower_bound || value > upper_bound) scheme_wrong_type(func_name, "integer", argnum, argc, argv); return value; } static int SWIG_is_unsigned_integer(Scheme_Object *o) { unsigned long value; return scheme_get_unsigned_int_val(o, &value); } /* ----------------------------------------------------------------------- * mzscheme 30X support code * ----------------------------------------------------------------------- */ #ifndef SCHEME_STR_VAL #define MZSCHEME30X 1 #endif #ifdef MZSCHEME30X /* * This is MZSCHEME 299.100 or higher (30x). From version 299.100 of * mzscheme upwards, strings are in unicode. These functions convert * to and from utf8 encodings of these strings. NB! strlen(s) will be * the size in bytes of the string, not the actual length. */ #define SCHEME_STR_VAL(obj) SCHEME_BYTE_STR_VAL(scheme_char_string_to_byte_string(obj)) #define SCHEME_STRLEN_VAL(obj) SCHEME_BYTE_STRLEN_VAL(scheme_char_string_to_byte_string(obj)) #define SCHEME_STRINGP(obj) SCHEME_CHAR_STRINGP(obj) #define scheme_make_string(s) scheme_make_utf8_string(s) #define scheme_make_sized_string(s,l) scheme_make_sized_utf8_string(s,l) #define scheme_make_sized_offset_string(s,d,l) \ scheme_make_sized_offset_utf8_string(s,d,l) #define SCHEME_MAKE_STRING(s) scheme_make_utf8_string(s) #else #define SCHEME_MAKE_STRING(s) scheme_make_string_without_copying(s) #endif /* ----------------------------------------------------------------------- * End of mzscheme 30X support code * ----------------------------------------------------------------------- */ struct swig_mz_proxy { Scheme_Type mztype; swig_type_info *type; void *object; }; static Scheme_Type swig_type; static void mz_free_swig(void *p, void *data) { struct swig_mz_proxy *proxy = (struct swig_mz_proxy *) p; if (SCHEME_NULLP((Scheme_Object*)p) || SCHEME_TYPE((Scheme_Object*)p) != swig_type) return; if (proxy->type) { if (proxy->type->clientdata) { ((Scheme_Prim *)proxy->type->clientdata)(1, (Scheme_Object **)&proxy); } } } static Scheme_Object * SWIG_MzScheme_NewPointerObj(void *ptr, swig_type_info *type, int owner) { struct swig_mz_proxy *new_proxy; new_proxy = (struct swig_mz_proxy *) scheme_malloc(sizeof(struct swig_mz_proxy)); new_proxy->mztype = swig_type; new_proxy->type = type; new_proxy->object = ptr; if (owner) { scheme_add_finalizer(new_proxy, mz_free_swig, NULL); } return (Scheme_Object *) new_proxy; } static int SWIG_MzScheme_ConvertPtr(Scheme_Object *s, void **result, swig_type_info *type, int flags) { swig_cast_info *cast; if (SCHEME_NULLP(s)) { *result = NULL; return (flags & SWIG_POINTER_NO_NULL) ? SWIG_NullReferenceError : SWIG_OK; } else if (SCHEME_TYPE(s) == swig_type) { struct swig_mz_proxy *proxy = (struct swig_mz_proxy *) s; if (type) { cast = SWIG_TypeCheckStruct(proxy->type, type); if (cast) { int newmemory = 0; *result = SWIG_TypeCast(cast, proxy->object, &newmemory); assert(!newmemory); /* newmemory handling not yet implemented */ return 0; } else { return 1; } } else { *result = proxy->object; return 0; } } return 1; } static SWIGINLINE void * SWIG_MzScheme_MustGetPtr(Scheme_Object *s, swig_type_info *type, int argnum, int flags, const char *func_name, int argc, Scheme_Object **argv) { void *result; if (SWIG_MzScheme_ConvertPtr(s, &result, type, flags)) { scheme_wrong_type(func_name, type->str ? type->str : "void *", argnum - 1, argc, argv); } return result; } static SWIGINLINE void * SWIG_MzScheme_Malloc(size_t size, const char *func_name) { void *p = malloc(size); if (p == NULL) { scheme_signal_error("swig-memory-error"); } else return p; } static Scheme_Object * SWIG_MzScheme_PackageValues(int num, Scheme_Object **values) { /* ignore first value if void */ if (num > 0 && SCHEME_VOIDP(values[0])) num--, values++; if (num == 0) return scheme_void; else if (num == 1) return values[0]; else return scheme_values(num, values); } #ifndef scheme_make_inspector #define scheme_make_inspector(x,y) \ _scheme_apply(scheme_builtin_value("make-inspector"), x, y) #endif /* Function to create a new struct. */ static Scheme_Object * SWIG_MzScheme_new_scheme_struct (Scheme_Env* env, const char* basename, int num_fields, char** field_names) { Scheme_Object *new_type; int count_out, i; Scheme_Object **struct_names; Scheme_Object **vals; Scheme_Object **a = (Scheme_Object**) \ scheme_malloc(num_fields*sizeof(Scheme_Object*)); for (i=0; i #else #include #endif static char **mz_dlopen_libraries=NULL; static void **mz_libraries=NULL; static char **mz_dynload_libpaths=NULL; static void mz_set_dlopen_libraries(const char *_libs) { int i,k,n; int mz_dynload_debug=(1==0); char *extra_paths[1000]; char *EP; { char *dbg=getenv("MZ_DYNLOAD_DEBUG"); if (dbg!=NULL) { mz_dynload_debug=atoi(dbg); } } { char *ep=getenv("MZ_DYNLOAD_LIBPATH"); int i,k,j; k=0; if (ep!=NULL) { EP=strdup(ep); for(i=0,j=0;EP[i]!='\0';i++) { if (EP[i]==':') { EP[i]='\0'; extra_paths[k++]=&EP[j]; j=i+1; } } if (j!=i) { extra_paths[k++]=&EP[j]; } } else { EP=strdup(""); } extra_paths[k]=NULL; k+=1; if (mz_dynload_debug) { fprintf(stderr,"SWIG:mzscheme:MZ_DYNLOAD_LIBPATH=%s\n",(ep==NULL) ? "(null)" : ep); fprintf(stderr,"SWIG:mzscheme:extra_paths[%d]\n",k-1); for(i=0;i %p\n",libp,mz_libraries[i]); } free(libp); } } } } { int i; void *func=NULL; for(i=0;mz_dlopen_libraries[i]!=NULL && func==NULL;i++) { if (mz_libraries[i]!=NULL) { #ifdef __OS_WIN32 func=GetProcAddress(mz_libraries[i],function); #else func=dlsym(mz_libraries[i],function); #endif } if (mz_dynload_debug) { fprintf(stderr, "SWIG:mzscheme:library:%s;dlopen=%p,function=%s,func=%p\n", mz_dlopen_libraries[i],mz_libraries[i],function,func ); } } return func; } } } /* The interpreter will store a pointer to this structure in a global variable called swig-runtime-data-type-pointer. The instance of this struct is only used if no other module has yet been loaded */ struct swig_mzscheme_runtime_data { swig_module_info *module_head; Scheme_Type type; }; static struct swig_mzscheme_runtime_data swig_mzscheme_runtime_data; static swig_module_info * SWIG_MzScheme_GetModule(Scheme_Env *env) { Scheme_Object *pointer, *symbol; struct swig_mzscheme_runtime_data *data; /* first check if pointer already created */ symbol = scheme_intern_symbol("swig-runtime-data-type-pointer" SWIG_RUNTIME_VERSION SWIG_TYPE_TABLE_NAME); pointer = scheme_lookup_global(symbol, env); if (pointer && SCHEME_CPTRP(pointer)) { data = (struct swig_mzscheme_runtime_data *) SCHEME_CPTR_VAL(pointer); swig_type = data->type; return data->module_head; } else { return NULL; } } static void SWIG_MzScheme_SetModule(Scheme_Env *env, swig_module_info *module) { Scheme_Object *pointer, *symbol; struct swig_mzscheme_runtime_data *data; /* first check if pointer already created */ symbol = scheme_intern_symbol("swig-runtime-data-type-pointer" SWIG_RUNTIME_VERSION SWIG_TYPE_TABLE_NAME); pointer = scheme_lookup_global(symbol, env); if (pointer && SCHEME_CPTRP(pointer)) { data = (struct swig_mzscheme_runtime_data *) SCHEME_CPTR_VAL(pointer); swig_type = data->type; data->module_head = module; } else { /* create a new type for wrapped pointer values */ swig_type = scheme_make_type((char *)"swig"); swig_mzscheme_runtime_data.module_head = module; swig_mzscheme_runtime_data.type = swig_type; /* create a new pointer */ #ifndef MZSCHEME30X pointer = scheme_make_cptr((void *) &swig_mzscheme_runtime_data, "swig_mzscheme_runtime_data"); #else pointer = scheme_make_cptr((void *) &swig_mzscheme_runtime_data, scheme_make_byte_string("swig_mzscheme_runtime_data")); #endif scheme_add_global_symbol(symbol, pointer, env); } } #ifdef __cplusplus } #endif swig-4.0.1/Lib/mzscheme/Makefile0000644000175000017500000000003513527063513016327 0ustar williamwilliam co: co RCS/*.i* RCS/*.swg* swig-4.0.1/Lib/mzscheme/std_common.i0000644000175000017500000000104213527063513017202 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_common.i * * SWIG typemaps for STL - common utilities * ----------------------------------------------------------------------------- */ %include %apply size_t { std::size_t }; %{ #include SWIGINTERNINLINE std::string swig_scm_to_string(Scheme_Object *x) { return std::string(SCHEME_STR_VAL(x)); } SWIGINTERNINLINE Scheme_Object *swig_make_string(const std::string &s) { return scheme_make_string(s.c_str()); } %} swig-4.0.1/Lib/mzscheme/typemaps.i0000644000175000017500000002463113527063513016713 0ustar williamwilliam/* ----------------------------------------------------------------------------- * typemaps.i * ----------------------------------------------------------------------------- */ /* The MzScheme module handles all types uniformly via typemaps. Here are the definitions. */ /* Pointers */ %typemap(in) SWIGTYPE * { $1 = ($ltype) SWIG_MustGetPtr($input, $descriptor, $argnum, 0); } %typemap(in) void * { $1 = SWIG_MustGetPtr($input, NULL, $argnum, 0); } %typemap(varin) SWIGTYPE * { $1 = ($ltype) SWIG_MustGetPtr($input, $descriptor, 1, 0); } %typemap(varin) SWIGTYPE & { $1 = *(($1_ltype)SWIG_MustGetPtr($input, $descriptor, 1, 0)); } %typemap(varin) SWIGTYPE && { $1 = *(($1_ltype)SWIG_MustGetPtr($input, $descriptor, 1, 0)); } %typemap(varin) SWIGTYPE [ANY] { void *temp; int ii; $1_basetype *b = 0; temp = SWIG_MustGetPtr($input, $1_descriptor, 1, 0); b = ($1_basetype *) $1; for (ii = 0; ii < $1_size; ii++) b[ii] = *(($1_basetype *) temp + ii); } %typemap(varin) void * { $1 = SWIG_MustGetPtr($input, NULL, 1, 0); } %typemap(out) SWIGTYPE * { $result = SWIG_NewPointerObj ($1, $descriptor, $owner); } %typemap(out) SWIGTYPE *DYNAMIC { swig_type_info *ty = SWIG_TypeDynamicCast($1_descriptor,(void **) &$1); $result = SWIG_NewPointerObj ($1, ty, $owner); } %typemap(varout) SWIGTYPE *, SWIGTYPE [] { $result = SWIG_NewPointerObj ($1, $descriptor, 0); } %typemap(varout) SWIGTYPE & { $result = SWIG_NewPointerObj((void *) &$1, $1_descriptor, 0); } %typemap(varout) SWIGTYPE && { $result = SWIG_NewPointerObj((void *) &$1, $1_descriptor, 0); } /* C++ References */ #ifdef __cplusplus %typemap(in) SWIGTYPE &, SWIGTYPE && { $1 = ($ltype) SWIG_MustGetPtr($input, $descriptor, $argnum, 0); if ($1 == NULL) scheme_signal_error("swig-type-error (null reference)"); } %typemap(out) SWIGTYPE &, SWIGTYPE && { $result = SWIG_NewPointerObj ($1, $descriptor, $owner); } %typemap(out) SWIGTYPE &DYNAMIC { swig_type_info *ty = SWIG_TypeDynamicCast($1_descriptor,(void **) &$1); $result = SWIG_NewPointerObj ($1, ty, $owner); } #endif /* Arrays */ %typemap(in) SWIGTYPE[] { $1 = ($ltype) SWIG_MustGetPtr($input, $descriptor, $argnum, 0); } %typemap(out) SWIGTYPE[] { $result = SWIG_NewPointerObj ($1, $descriptor, $owner); } /* Enums */ %typemap(in) enum SWIGTYPE { if (!SWIG_is_integer($input)) scheme_wrong_type(FUNC_NAME, "integer", $argnum - 1, argc, argv); $1 = ($1_type) SWIG_convert_int($input); } %typemap(varin) enum SWIGTYPE { if (!SWIG_is_integer($input)) scheme_wrong_type(FUNC_NAME, "integer", 0, argc, argv); $1 = ($1_type) SWIG_convert_int($input); } %typemap(out) enum SWIGTYPE "$result = scheme_make_integer_value($1);"; %typemap(varout) enum SWIGTYPE "$result = scheme_make_integer_value($1);"; /* Pass-by-value */ %typemap(in) SWIGTYPE($&1_ltype argp) { argp = ($&1_ltype) SWIG_MustGetPtr($input, $&1_descriptor, $argnum, 0); $1 = *argp; } %typemap(varin) SWIGTYPE { $&1_ltype argp; argp = ($&1_ltype) SWIG_MustGetPtr($input, $&1_descriptor, 1, 0); $1 = *argp; } %typemap(out) SWIGTYPE #ifdef __cplusplus { $&1_ltype resultptr; resultptr = new $1_ltype(($1_ltype &) $1); $result = SWIG_NewPointerObj (resultptr, $&1_descriptor, 1); } #else { $&1_ltype resultptr; resultptr = ($&1_ltype) malloc(sizeof($1_type)); memmove(resultptr, &$1, sizeof($1_type)); $result = SWIG_NewPointerObj(resultptr, $&1_descriptor, 1); } #endif %typemap(varout) SWIGTYPE #ifdef __cplusplus { $&1_ltype resultptr; resultptr = new $1_ltype(($1_ltype &) $1); $result = SWIG_NewPointerObj (resultptr, $&1_descriptor, 0); } #else { $&1_ltype resultptr; resultptr = ($&1_ltype) malloc(sizeof($1_type)); memmove(resultptr, &$1, sizeof($1_type)); $result = SWIG_NewPointerObj(resultptr, $&1_descriptor, 0); } #endif /* The SIMPLE_MAP macro below defines the whole set of typemaps needed for simple types. */ %define SIMPLE_MAP(C_NAME, MZ_PREDICATE, MZ_TO_C, C_TO_MZ, MZ_NAME) %typemap(in) C_NAME { if (!MZ_PREDICATE($input)) scheme_wrong_type(FUNC_NAME, #MZ_NAME, $argnum - 1, argc, argv); $1 = MZ_TO_C($input); } %typemap(varin) C_NAME { if (!MZ_PREDICATE($input)) scheme_wrong_type(FUNC_NAME, #MZ_NAME, 0, argc, argv); $1 = MZ_TO_C($input); } %typemap(out) C_NAME { $result = C_TO_MZ($1); } %typemap(varout) C_NAME { $result = C_TO_MZ($1); } %typemap(in) C_NAME *INPUT (C_NAME temp) { temp = (C_NAME) MZ_TO_C($input); $1 = &temp; } %typemap(in,numinputs=0) C_NAME *OUTPUT (C_NAME temp) { $1 = &temp; } %typemap(argout) C_NAME *OUTPUT { Scheme_Object *s; s = C_TO_MZ(*$1); SWIG_APPEND_VALUE(s); } %typemap(in) C_NAME *BOTH = C_NAME *INPUT; %typemap(argout) C_NAME *BOTH = C_NAME *OUTPUT; %typemap(in) C_NAME *INOUT = C_NAME *INPUT; %typemap(argout) C_NAME *INOUT = C_NAME *OUTPUT; %enddef SIMPLE_MAP(bool, SCHEME_BOOLP, SCHEME_TRUEP, swig_make_boolean, boolean); SIMPLE_MAP(char, SCHEME_CHARP, SCHEME_CHAR_VAL, scheme_make_character, character); SIMPLE_MAP(unsigned char, SCHEME_CHARP, SCHEME_CHAR_VAL, scheme_make_character, character); SIMPLE_MAP(int, SWIG_is_integer, SWIG_convert_int, scheme_make_integer_value, integer); SIMPLE_MAP(short, SWIG_is_integer, SWIG_convert_short, scheme_make_integer_value, integer); SIMPLE_MAP(long, SWIG_is_integer, SWIG_convert_long, scheme_make_integer_value, integer); SIMPLE_MAP(ptrdiff_t, SWIG_is_integer, SWIG_convert_long, scheme_make_integer_value, integer); SIMPLE_MAP(unsigned int, SWIG_is_unsigned_integer, SWIG_convert_unsigned_int, scheme_make_integer_value_from_unsigned, integer); SIMPLE_MAP(unsigned short, SWIG_is_unsigned_integer, SWIG_convert_unsigned_short, scheme_make_integer_value_from_unsigned, integer); SIMPLE_MAP(unsigned long, SWIG_is_unsigned_integer, SWIG_convert_unsigned_long, scheme_make_integer_value_from_unsigned, integer); SIMPLE_MAP(size_t, SWIG_is_unsigned_integer, SWIG_convert_unsigned_long, scheme_make_integer_value_from_unsigned, integer); SIMPLE_MAP(float, SCHEME_REALP, scheme_real_to_double, scheme_make_double, real); SIMPLE_MAP(double, SCHEME_REALP, scheme_real_to_double, scheme_make_double, real); SIMPLE_MAP(char *, SCHEME_STRINGP, SCHEME_STR_VAL, SCHEME_MAKE_STRING, string); SIMPLE_MAP(const char *, SCHEME_STRINGP, SCHEME_STR_VAL, SCHEME_MAKE_STRING, string); /* For MzScheme 30x: Use these typemaps if you are not going to use UTF8 encodings in your C code. SIMPLE_MAP(char *,SCHEME_BYTE_STRINGP, SCHEME_BYTE_STR_VAL, scheme_make_byte_string_without_copying,bytestring); SIMPLE_MAP(const char *,SCHEME_BYTE_STRINGP, SCHEME_BYTE_STR_VAL, scheme_make_byte_string_without_copying,bytestring); */ /* Const primitive references. Passed by value */ %define REF_MAP(C_NAME, MZ_PREDICATE, MZ_TO_C, C_TO_MZ, MZ_NAME) %typemap(in) const C_NAME & (C_NAME temp) { if (!MZ_PREDICATE($input)) scheme_wrong_type(FUNC_NAME, #MZ_NAME, $argnum - 1, argc, argv); temp = MZ_TO_C($input); $1 = &temp; } %typemap(out) const C_NAME & { $result = C_TO_MZ(*$1); } %enddef REF_MAP(bool, SCHEME_BOOLP, SCHEME_TRUEP, swig_make_boolean, boolean); REF_MAP(char, SCHEME_CHARP, SCHEME_CHAR_VAL, scheme_make_character, character); REF_MAP(unsigned char, SCHEME_CHARP, SCHEME_CHAR_VAL, scheme_make_character, character); REF_MAP(int, SWIG_is_integer, SWIG_convert_int, scheme_make_integer_value, integer); REF_MAP(short, SWIG_is_integer, SWIG_convert_short, scheme_make_integer_value, integer); REF_MAP(long, SWIG_is_integer, SWIG_convert_long, scheme_make_integer_value, integer); REF_MAP(unsigned int, SWIG_is_unsigned_integer, SWIG_convert_unsigned_int, scheme_make_integer_value_from_unsigned, integer); REF_MAP(unsigned short, SWIG_is_unsigned_integer, SWIG_convert_unsigned_short, scheme_make_integer_value_from_unsigned, integer); REF_MAP(unsigned long, SWIG_is_unsigned_integer, SWIG_convert_unsigned_long, scheme_make_integer_value_from_unsigned, integer); REF_MAP(float, SCHEME_REALP, scheme_real_to_double, scheme_make_double, real); REF_MAP(double, SCHEME_REALP, scheme_real_to_double, scheme_make_double, real); /* Void */ %typemap(out) void "$result = scheme_void;"; /* Pass through Scheme_Object * */ %typemap (in) Scheme_Object * "$1=$input;"; %typemap (out) Scheme_Object * "$result=$1;"; %typecheck(SWIG_TYPECHECK_POINTER) Scheme_Object * "$1=1;"; /* ------------------------------------------------------------ * String & length * ------------------------------------------------------------ */ //%typemap(in) (char *STRING, int LENGTH) { // int temp; // $1 = ($1_ltype) SWIG_Guile_scm2newstr($input, &temp); // $2 = ($2_ltype) temp; //} /* ------------------------------------------------------------ * Typechecking rules * ------------------------------------------------------------ */ %typecheck(SWIG_TYPECHECK_INTEGER) int, short, long, unsigned int, unsigned short, unsigned long, signed char, unsigned char, long long, unsigned long long, const int &, const short &, const long &, const unsigned int &, const unsigned short &, const unsigned long &, const long long &, const unsigned long long &, enum SWIGTYPE { $1 = (SWIG_is_integer($input)) ? 1 : 0; } %typecheck(SWIG_TYPECHECK_BOOL) bool, bool &, const bool & { $1 = (SCHEME_BOOLP($input)) ? 1 : 0; } %typecheck(SWIG_TYPECHECK_DOUBLE) float, double, const float &, const double & { $1 = (SCHEME_REALP($input)) ? 1 : 0; } %typecheck(SWIG_TYPECHECK_STRING) char { $1 = (SCHEME_STRINGP($input)) ? 1 : 0; } %typecheck(SWIG_TYPECHECK_STRING) char * { $1 = (SCHEME_STRINGP($input)) ? 1 : 0; } %typecheck(SWIG_TYPECHECK_POINTER) SWIGTYPE *, SWIGTYPE [] { void *ptr; if (SWIG_ConvertPtr($input, (void **) &ptr, $1_descriptor, 0)) { $1 = 0; } else { $1 = 1; } } %typecheck(SWIG_TYPECHECK_POINTER) SWIGTYPE &, SWIGTYPE && { void *ptr; if (SWIG_ConvertPtr($input, (void **) &ptr, $1_descriptor, SWIG_POINTER_NO_NULL)) { $1 = 0; } else { $1 = 1; } } %typecheck(SWIG_TYPECHECK_POINTER) SWIGTYPE { void *ptr; if (SWIG_ConvertPtr($input, (void **) &ptr, $&1_descriptor, SWIG_POINTER_NO_NULL)) { $1 = 0; } else { $1 = 1; } } %typecheck(SWIG_TYPECHECK_VOIDPTR) void * { void *ptr; if (SWIG_ConvertPtr($input, (void **) &ptr, 0, 0)) { $1 = 0; } else { $1 = 1; } } /* Array reference typemaps */ %apply SWIGTYPE & { SWIGTYPE ((&)[ANY]) } %apply SWIGTYPE && { SWIGTYPE ((&&)[ANY]) } /* const pointers */ %apply SWIGTYPE * { SWIGTYPE *const } swig-4.0.1/Lib/mzscheme/std_pair.i0000644000175000017500000012555213527063513016662 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_pair.i * * SWIG typemaps for std::pair * ----------------------------------------------------------------------------- */ %include %include // ------------------------------------------------------------------------ // std::pair // // See std_vector.i for the rationale of typemap application // ------------------------------------------------------------------------ %{ #include %} // exported class namespace std { template struct pair { %typemap(in) pair (std::pair* m) { if (SCHEME_PAIRP($input)) { T* x; U* y; Scheme_Object *first, *second; first = scheme_car($input); second = scheme_cdr($input); x = (T*) SWIG_MustGetPtr(first,$descriptor(T *),$argnum, 0); y = (U*) SWIG_MustGetPtr(second,$descriptor(U *),$argnum, 0); $1 = std::make_pair(*x,*y); } else { $1 = *(($&1_type) SWIG_MustGetPtr($input,$&1_descriptor,$argnum, 0)); } } %typemap(in) const pair& (std::pair temp, std::pair* m), const pair* (std::pair temp, std::pair* m) { if (SCHEME_PAIRP($input)) { T* x; U* y; Scheme_Object *first, *second; first = scheme_car($input); second = scheme_cdr($input); x = (T*) SWIG_MustGetPtr(first,$descriptor(T *),$argnum, 0); y = (U*) SWIG_MustGetPtr(second,$descriptor(U *),$argnum, 0); temp = std::make_pair(*x,*y); $1 = &temp; } else { $1 = ($1_ltype) SWIG_MustGetPtr($input,$1_descriptor,$argnum, 0); } } %typemap(out) pair { T* x = new T($1.first); U* y = new U($1.second); Scheme_Object* first = SWIG_NewPointerObj(x,$descriptor(T *), 1); Scheme_Object* second = SWIG_NewPointerObj(y,$descriptor(U *), 1); $result = scheme_make_pair(first,second); } %typecheck(SWIG_TYPECHECK_PAIR) pair { /* native pair? */ if (SCHEME_PAIRP($input)) { T* x; U* y; Scheme_Object* first = scheme_car($input); Scheme_Object* second = scheme_cdr($input); if (SWIG_ConvertPtr(first,(void**) &x, $descriptor(T *), 0) != -1 && SWIG_ConvertPtr(second,(void**) &y, $descriptor(U *), 0) != -1) { $1 = 1; } else { $1 = 0; } } else { /* wrapped pair? */ std::pair* p; if (SWIG_ConvertPtr($input,(void **) &p, $&1_descriptor, 0) != -1) $1 = 1; else $1 = 0; } } %typecheck(SWIG_TYPECHECK_PAIR) const pair&, const pair* { /* native pair? */ if (SCHEME_PAIRP($input)) { T* x; U* y; Scheme_Object* first = scheme_car($input); Scheme_Object* second = scheme_cdr($input); if (SWIG_ConvertPtr(first,(void**) &x, $descriptor(T *), 0) != -1 && SWIG_ConvertPtr(second,(void**) &y, $descriptor(U *), 0) != -1) { $1 = 1; } else { $1 = 0; } } else { /* wrapped pair? */ std::pair* p; if (SWIG_ConvertPtr($input,(void **) &p, $1_descriptor, 0) != -1) $1 = 1; else $1 = 0; } } typedef T first_type; typedef U second_type; pair(); pair(T first, U second); pair(const pair& other); template pair(const pair &other); T first; U second; }; // specializations for built-ins %define specialize_std_pair_on_first(T,CHECK,CONVERT_FROM,CONVERT_TO) template struct pair { %typemap(in) pair (std::pair* m) { if (SCHEME_PAIRP($input)) { U* y; Scheme_Object *first, *second; first = scheme_car($input); second = scheme_cdr($input); if (!CHECK(first)) SWIG_exception(SWIG_TypeError, "pair<" #T "," #U "> expected"); y = (U*) SWIG_MustGetPtr(second,$descriptor(U *),$argnum, 0); $1 = std::make_pair(CONVERT_FROM(first),*y); } else { $1 = *(($&1_type) SWIG_MustGetPtr($input,$&1_descriptor,$argnum, 0)); } } %typemap(in) const pair& (std::pair temp, std::pair* m), const pair* (std::pair temp, std::pair* m) { if (SCHEME_PAIRP($input)) { U* y; Scheme_Object *first, *second; first = scheme_car($input); second = scheme_cdr($input); if (!CHECK(first)) SWIG_exception(SWIG_TypeError, "pair<" #T "," #U "> expected"); y = (U*) SWIG_MustGetPtr(second,$descriptor(U *),$argnum, 0); temp = std::make_pair(CONVERT_FROM(first),*y); $1 = &temp; } else { $1 = ($1_ltype) SWIG_MustGetPtr($input,$1_descriptor,$argnum, 0); } } %typemap(out) pair { U* y = new U($1.second); Scheme_Object* second = SWIG_NewPointerObj(y,$descriptor(U *), 1); $result = scheme_make_pair(CONVERT_TO($1.first),second); } %typecheck(SWIG_TYPECHECK_PAIR) pair { /* native pair? */ if (SCHEME_PAIRP($input)) { U* y; Scheme_Object* first = scheme_car($input); Scheme_Object* second = scheme_cdr($input); if (CHECK(first) && SWIG_ConvertPtr(second,(void**) &y, $descriptor(U *), 0) != -1) { $1 = 1; } else { $1 = 0; } } else { /* wrapped pair? */ std::pair* p; if (SWIG_ConvertPtr($input,(void **) &p, $&1_descriptor, 0) != -1) $1 = 1; else $1 = 0; } } %typecheck(SWIG_TYPECHECK_PAIR) const pair&, const pair* { /* native pair? */ if (SCHEME_PAIRP($input)) { U* y; Scheme_Object* first = scheme_car($input); Scheme_Object* second = scheme_cdr($input); if (CHECK(first) && SWIG_ConvertPtr(second,(void**) &y, $descriptor(U *), 0) != -1) { $1 = 1; } else { $1 = 0; } } else { /* wrapped pair? */ std::pair* p; if (SWIG_ConvertPtr($input,(void **) &p, $1_descriptor, 0) != -1) $1 = 1; else $1 = 0; } } pair(); pair(T first, U second); pair(const pair& other); template pair(const pair &other); T first; U second; }; %enddef %define specialize_std_pair_on_second(U,CHECK,CONVERT_FROM,CONVERT_TO) template struct pair { %typemap(in) pair (std::pair* m) { if (SCHEME_PAIRP($input)) { T* x; Scheme_Object *first, *second; first = scheme_car($input); second = scheme_cdr($input); x = (T*) SWIG_MustGetPtr(first,$descriptor(T *),$argnum, 0); if (!CHECK(second)) SWIG_exception(SWIG_TypeError, "pair<" #T "," #U "> expected"); $1 = std::make_pair(*x,CONVERT_FROM(second)); } else { $1 = *(($&1_type) SWIG_MustGetPtr($input,$&1_descriptor,$argnum, 0)); } } %typemap(in) const pair& (std::pair temp, std::pair* m), const pair* (std::pair temp, std::pair* m) { if (SCHEME_PAIRP($input)) { T* x; Scheme_Object *first, *second; first = scheme_car($input); second = scheme_cdr($input); x = (T*) SWIG_MustGetPtr(first,$descriptor(T *),$argnum, 0); if (!CHECK(second)) SWIG_exception(SWIG_TypeError, "pair<" #T "," #U "> expected"); temp = std::make_pair(*x,CONVERT_FROM(second)); $1 = &temp; } else { $1 = ($1_ltype) SWIG_MustGetPtr($input,$1_descriptor,$argnum, 0); } } %typemap(out) pair { T* x = new T($1.first); Scheme_Object* first = SWIG_NewPointerObj(x,$descriptor(T *), 1); $result = scheme_make_pair(first,CONVERT_TO($1.second)); } %typecheck(SWIG_TYPECHECK_PAIR) pair { /* native pair? */ if (SCHEME_PAIRP($input)) { T* x; Scheme_Object* first = scheme_car($input); Scheme_Object* second = scheme_cdr($input); if (SWIG_ConvertPtr(first,(void**) &x, $descriptor(T *), 0) != -1 && CHECK(second)) { $1 = 1; } else { $1 = 0; } } else { /* wrapped pair? */ std::pair* p; if (SWIG_ConvertPtr($input,(void **) &p, $&1_descriptor, 0) != -1) $1 = 1; else $1 = 0; } } %typecheck(SWIG_TYPECHECK_PAIR) const pair&, const pair* { /* native pair? */ if (SCHEME_PAIRP($input)) { T* x; Scheme_Object* first = scheme_car($input); Scheme_Object* second = scheme_cdr($input); if (SWIG_ConvertPtr(first,(void**) &x, $descriptor(T *), 0) != -1 && CHECK(second)) { $1 = 1; } else { $1 = 0; } } else { /* wrapped pair? */ std::pair* p; if (SWIG_ConvertPtr($input,(void **) &p, $1_descriptor, 0) != -1) $1 = 1; else $1 = 0; } } pair(); pair(T first, U second); pair(const pair& other); template pair(const pair &other); T first; U second; }; %enddef %define specialize_std_pair_on_both(T,CHECK_T,CONVERT_T_FROM,CONVERT_T_TO, U,CHECK_U,CONVERT_U_FROM,CONVERT_U_TO) template<> struct pair { %typemap(in) pair (std::pair* m) { if (SCHEME_PAIRP($input)) { Scheme_Object *first, *second; first = scheme_car($input); second = scheme_cdr($input); if (!CHECK_T(first) || !CHECK_U(second)) SWIG_exception(SWIG_TypeError, "pair<" #T "," #U "> expected"); $1 = make_pair(CONVERT_T_FROM(first), CONVERT_U_FROM(second)); } else { $1 = *(($&1_type) SWIG_MustGetPtr($input,$&1_descriptor,$argnum, 0)); } } %typemap(in) const pair& (std::pair temp, std::pair* m), const pair* (std::pair temp, std::pair* m) { if (SCHEME_PAIRP($input)) { Scheme_Object *first, *second; T *x; first = scheme_car($input); second = scheme_cdr($input); x = (T*) SWIG_MustGetPtr(first,$descriptor(T *),$argnum, 0); if (!CHECK_T(first) || !CHECK_U(second)) SWIG_exception(SWIG_TypeError, "pair<" #T "," #U "> expected"); temp = make_pair(CONVERT_T_FROM(first), CONVERT_U_FROM(second)); $1 = &temp; } else { $1 = ($1_ltype) SWIG_MustGetPtr($input,$1_descriptor,$argnum, 0); } } %typemap(out) pair { $result = scheme_make_pair(CONVERT_T_TO($1.first), CONVERT_U_TO($1.second)); } %typecheck(SWIG_TYPECHECK_PAIR) pair { /* native pair? */ if (SCHEME_PAIRP($input)) { Scheme_Object* first = scheme_car($input); Scheme_Object* second = scheme_cdr($input); if (CHECK_T(first) && CHECK_U(second)) { $1 = 1; } else { $1 = 0; } } else { /* wrapped pair? */ std::pair* p; if (SWIG_ConvertPtr($input,(void **) &p, $&1_descriptor, 0) != -1) $1 = 1; else $1 = 0; } } %typecheck(SWIG_TYPECHECK_PAIR) const pair&, const pair* { /* native pair? */ if (SCHEME_PAIRP($input)) { Scheme_Object* first = scheme_car($input); Scheme_Object* second = scheme_cdr($input); if (CHECK_T(first) && CHECK_U(second)) { $1 = 1; } else { $1 = 0; } } else { /* wrapped pair? */ std::pair* p; if (SWIG_ConvertPtr($input,(void **) &p, $1_descriptor, 0) != -1) $1 = 1; else $1 = 0; } } pair(); pair(T first, U second); pair(const pair& other); template pair(const pair &other); T first; U second; }; %enddef specialize_std_pair_on_first(bool,SCHEME_BOOLP, SCHEME_TRUEP,swig_make_boolean); specialize_std_pair_on_first(int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_first(short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_first(long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_first(unsigned int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_first(unsigned short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_first(unsigned long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_first(double,SCHEME_REALP, scheme_real_to_double,scheme_make_double); specialize_std_pair_on_first(float,SCHEME_REALP, scheme_real_to_double,scheme_make_double); specialize_std_pair_on_first(std::string,SCHEME_STRINGP, swig_scm_to_string,swig_make_string); specialize_std_pair_on_second(bool,SCHEME_BOOLP, SCHEME_TRUEP,swig_make_boolean); specialize_std_pair_on_second(int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_second(short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_second(long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_second(unsigned int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_second(unsigned short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_second(unsigned long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_second(double,SCHEME_REALP, scheme_real_to_double,scheme_make_double); specialize_std_pair_on_second(float,SCHEME_REALP, scheme_real_to_double,scheme_make_double); specialize_std_pair_on_second(std::string,SCHEME_STRINGP, swig_scm_to_string,swig_make_string); specialize_std_pair_on_both(bool,SCHEME_BOOLP, SCHEME_TRUEP,swig_make_boolean, bool,SCHEME_BOOLP, SCHEME_TRUEP,swig_make_boolean); specialize_std_pair_on_both(bool,SCHEME_BOOLP, SCHEME_TRUEP,swig_make_boolean, int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(bool,SCHEME_BOOLP, SCHEME_TRUEP,swig_make_boolean, short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(bool,SCHEME_BOOLP, SCHEME_TRUEP,swig_make_boolean, long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(bool,SCHEME_BOOLP, SCHEME_TRUEP,swig_make_boolean, unsigned int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(bool,SCHEME_BOOLP, SCHEME_TRUEP,swig_make_boolean, unsigned short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(bool,SCHEME_BOOLP, SCHEME_TRUEP,swig_make_boolean, unsigned long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(bool,SCHEME_BOOLP, SCHEME_TRUEP,swig_make_boolean, double,SCHEME_REALP, scheme_real_to_double,scheme_make_double); specialize_std_pair_on_both(bool,SCHEME_BOOLP, SCHEME_TRUEP,swig_make_boolean, float,SCHEME_REALP, scheme_real_to_double,scheme_make_double); specialize_std_pair_on_both(bool,SCHEME_BOOLP, SCHEME_TRUEP,swig_make_boolean, std::string,SCHEME_STRINGP, swig_scm_to_string,swig_make_string); specialize_std_pair_on_both(int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, bool,SCHEME_BOOLP, SCHEME_TRUEP,swig_make_boolean); specialize_std_pair_on_both(int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, unsigned int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, unsigned short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, unsigned long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, double,SCHEME_REALP, scheme_real_to_double,scheme_make_double); specialize_std_pair_on_both(int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, float,SCHEME_REALP, scheme_real_to_double,scheme_make_double); specialize_std_pair_on_both(int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, std::string,SCHEME_STRINGP, swig_scm_to_string,swig_make_string); specialize_std_pair_on_both(short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, bool,SCHEME_BOOLP, SCHEME_TRUEP,swig_make_boolean); specialize_std_pair_on_both(short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, unsigned int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, unsigned short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, unsigned long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, double,SCHEME_REALP, scheme_real_to_double,scheme_make_double); specialize_std_pair_on_both(short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, float,SCHEME_REALP, scheme_real_to_double,scheme_make_double); specialize_std_pair_on_both(short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, std::string,SCHEME_STRINGP, swig_scm_to_string,swig_make_string); specialize_std_pair_on_both(long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, bool,SCHEME_BOOLP, SCHEME_TRUEP,swig_make_boolean); specialize_std_pair_on_both(long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, unsigned int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, unsigned short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, unsigned long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, double,SCHEME_REALP, scheme_real_to_double,scheme_make_double); specialize_std_pair_on_both(long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, float,SCHEME_REALP, scheme_real_to_double,scheme_make_double); specialize_std_pair_on_both(long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, std::string,SCHEME_STRINGP, swig_scm_to_string,swig_make_string); specialize_std_pair_on_both(unsigned int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, bool,SCHEME_BOOLP, SCHEME_TRUEP,swig_make_boolean); specialize_std_pair_on_both(unsigned int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(unsigned int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(unsigned int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(unsigned int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, unsigned int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(unsigned int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, unsigned short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(unsigned int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, unsigned long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(unsigned int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, double,SCHEME_REALP, scheme_real_to_double,scheme_make_double); specialize_std_pair_on_both(unsigned int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, float,SCHEME_REALP, scheme_real_to_double,scheme_make_double); specialize_std_pair_on_both(unsigned int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, std::string,SCHEME_STRINGP, swig_scm_to_string,swig_make_string); specialize_std_pair_on_both(unsigned short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, bool,SCHEME_BOOLP, SCHEME_TRUEP,swig_make_boolean); specialize_std_pair_on_both(unsigned short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(unsigned short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(unsigned short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(unsigned short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, unsigned int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(unsigned short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, unsigned short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(unsigned short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, unsigned long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(unsigned short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, double,SCHEME_REALP, scheme_real_to_double,scheme_make_double); specialize_std_pair_on_both(unsigned short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, float,SCHEME_REALP, scheme_real_to_double,scheme_make_double); specialize_std_pair_on_both(unsigned short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, std::string,SCHEME_STRINGP, swig_scm_to_string,swig_make_string); specialize_std_pair_on_both(unsigned long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, bool,SCHEME_BOOLP, SCHEME_TRUEP,swig_make_boolean); specialize_std_pair_on_both(unsigned long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(unsigned long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(unsigned long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(unsigned long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, unsigned int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(unsigned long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, unsigned short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(unsigned long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, unsigned long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(unsigned long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, double,SCHEME_REALP, scheme_real_to_double,scheme_make_double); specialize_std_pair_on_both(unsigned long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, float,SCHEME_REALP, scheme_real_to_double,scheme_make_double); specialize_std_pair_on_both(unsigned long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, std::string,SCHEME_STRINGP, swig_scm_to_string,swig_make_string); specialize_std_pair_on_both(double,SCHEME_REALP, scheme_real_to_double,scheme_make_double, bool,SCHEME_BOOLP, SCHEME_TRUEP,swig_make_boolean); specialize_std_pair_on_both(double,SCHEME_REALP, scheme_real_to_double,scheme_make_double, int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(double,SCHEME_REALP, scheme_real_to_double,scheme_make_double, short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(double,SCHEME_REALP, scheme_real_to_double,scheme_make_double, long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(double,SCHEME_REALP, scheme_real_to_double,scheme_make_double, unsigned int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(double,SCHEME_REALP, scheme_real_to_double,scheme_make_double, unsigned short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(double,SCHEME_REALP, scheme_real_to_double,scheme_make_double, unsigned long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(double,SCHEME_REALP, scheme_real_to_double,scheme_make_double, double,SCHEME_REALP, scheme_real_to_double,scheme_make_double); specialize_std_pair_on_both(double,SCHEME_REALP, scheme_real_to_double,scheme_make_double, float,SCHEME_REALP, scheme_real_to_double,scheme_make_double); specialize_std_pair_on_both(double,SCHEME_REALP, scheme_real_to_double,scheme_make_double, std::string,SCHEME_STRINGP, swig_scm_to_string,swig_make_string); specialize_std_pair_on_both(float,SCHEME_REALP, scheme_real_to_double,scheme_make_double, bool,SCHEME_BOOLP, SCHEME_TRUEP,swig_make_boolean); specialize_std_pair_on_both(float,SCHEME_REALP, scheme_real_to_double,scheme_make_double, int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(float,SCHEME_REALP, scheme_real_to_double,scheme_make_double, short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(float,SCHEME_REALP, scheme_real_to_double,scheme_make_double, long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(float,SCHEME_REALP, scheme_real_to_double,scheme_make_double, unsigned int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(float,SCHEME_REALP, scheme_real_to_double,scheme_make_double, unsigned short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(float,SCHEME_REALP, scheme_real_to_double,scheme_make_double, unsigned long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(float,SCHEME_REALP, scheme_real_to_double,scheme_make_double, double,SCHEME_REALP, scheme_real_to_double,scheme_make_double); specialize_std_pair_on_both(float,SCHEME_REALP, scheme_real_to_double,scheme_make_double, float,SCHEME_REALP, scheme_real_to_double,scheme_make_double); specialize_std_pair_on_both(float,SCHEME_REALP, scheme_real_to_double,scheme_make_double, std::string,SCHEME_STRINGP, swig_scm_to_string,swig_make_string); specialize_std_pair_on_both(std::string,SCHEME_STRINGP, swig_scm_to_string,swig_make_string, bool,SCHEME_BOOLP, SCHEME_TRUEP,swig_make_boolean); specialize_std_pair_on_both(std::string,SCHEME_STRINGP, swig_scm_to_string,swig_make_string, int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(std::string,SCHEME_STRINGP, swig_scm_to_string,swig_make_string, short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(std::string,SCHEME_STRINGP, swig_scm_to_string,swig_make_string, long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(std::string,SCHEME_STRINGP, swig_scm_to_string,swig_make_string, unsigned int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(std::string,SCHEME_STRINGP, swig_scm_to_string,swig_make_string, unsigned short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(std::string,SCHEME_STRINGP, swig_scm_to_string,swig_make_string, unsigned long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(std::string,SCHEME_STRINGP, swig_scm_to_string,swig_make_string, double,SCHEME_REALP, scheme_real_to_double,scheme_make_double); specialize_std_pair_on_both(std::string,SCHEME_STRINGP, swig_scm_to_string,swig_make_string, float,SCHEME_REALP, scheme_real_to_double,scheme_make_double); specialize_std_pair_on_both(std::string,SCHEME_STRINGP, swig_scm_to_string,swig_make_string, std::string,SCHEME_STRINGP, swig_scm_to_string,swig_make_string); } swig-4.0.1/Lib/mzscheme/mzscheme.swg0000644000175000017500000000353613527063513017235 0ustar williamwilliam/* ----------------------------------------------------------------------------- * mzscheme.swg * * SWIG Configuration File for MzScheme. * This file is parsed by SWIG before reading any other interface file. * ----------------------------------------------------------------------------- */ /* Include headers */ %runtime "swigrun.swg" // Common C API type-checking code %runtime "swigerrors.swg" // SWIG errors %runtime "mzrun.swg" %define SWIG_APPEND_VALUE(value) values[lenv++] = value %enddef /* Definitions */ #define SWIG_malloc(size) swig_malloc(size, FUNC_NAME) #define SWIG_free(mem) free(mem) #define SWIG_convert_short(o) \ SWIG_convert_integer(o, - (1 << (8 * sizeof(short) - 1)), \ (1 << (8 * sizeof(short) - 1)) - 1, \ FUNC_NAME, $argnum-1, argc, argv) #define SWIG_convert_int(o) \ SWIG_convert_integer(o, INT_MIN, INT_MAX, \ FUNC_NAME, $argnum-1, argc, argv) #define SWIG_convert_long(o) \ SWIG_convert_integer(o, LONG_MIN, LONG_MAX, \ FUNC_NAME, $argnum-1, argc, argv) #define SWIG_convert_unsigned_short(o) \ SWIG_convert_unsigned_integer(o, 0, \ (1 << (8 * sizeof(short))) - 1, \ FUNC_NAME, $argnum-1, argc, argv) #define SWIG_convert_unsigned_int(o) \ SWIG_convert_unsigned_integer(o, 0, UINT_MAX, \ FUNC_NAME, $argnum-1, argc, argv) #define SWIG_convert_unsigned_long(o) \ SWIG_convert_unsigned_integer(o, 0, ULONG_MAX, \ FUNC_NAME, $argnum-1, argc, argv) /* Guile compatibility kludges */ #define SCM_VALIDATE_VECTOR(argnum, value) (void)0 #define SCM_VALIDATE_LIST(argnum, value) (void)0 /* Read in standard typemaps. */ %include %insert(init) "swiginit.swg" %init %{ Scheme_Object *scheme_reload(Scheme_Env *env) { Scheme_Env *menv = SWIG_MZSCHEME_CREATE_MENV(env); SWIG_InitializeModule((void *) env); %} swig-4.0.1/Lib/mzscheme/stl.i0000644000175000017500000000044313527063513015646 0ustar williamwilliam/* ----------------------------------------------------------------------------- * stl.i * ----------------------------------------------------------------------------- */ %include %include %include %include %include swig-4.0.1/Lib/mzscheme/std_string.i0000644000175000017500000000263313527063513017227 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_string.i * * SWIG typemaps for std::string types * ----------------------------------------------------------------------------- */ // ------------------------------------------------------------------------ // std::string is typemapped by value // This can prevent exporting methods which return a string // in order for the user to modify it. // However, I think I'll wait until someone asks for it... // ------------------------------------------------------------------------ %include %{ #include %} namespace std { %naturalvar string; class string; /* Overloading check */ %typemap(typecheck) string = char *; %typemap(typecheck) const string & = char *; %typemap(in) string { if (SCHEME_STRINGP($input)) $1.assign(SCHEME_STR_VAL($input)); else SWIG_exception(SWIG_TypeError, "string expected"); } %typemap(in) const string & ($*1_ltype temp) { if (SCHEME_STRINGP($input)) { temp.assign(SCHEME_STR_VAL($input)); $1 = &temp; } else { SWIG_exception(SWIG_TypeError, "string expected"); } } %typemap(out) string { $result = scheme_make_string($1.c_str()); } %typemap(out) const string & { $result = scheme_make_string($1->c_str()); } } swig-4.0.1/Lib/mzscheme/std_map.i0000644000175000017500000020200713527063513016473 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_map.i * * SWIG typemaps for std::map * ----------------------------------------------------------------------------- */ %include // ------------------------------------------------------------------------ // std::map // // The aim of all that follows would be to integrate std::map with // MzScheme as much as possible, namely, to allow the user to pass and // be returned Scheme association lists. // const declarations are used to guess the intent of the function being // exported; therefore, the following rationale is applied: // // -- f(std::map), f(const std::map&), f(const std::map*): // the parameter being read-only, either a Scheme alist or a // previously wrapped std::map can be passed. // -- f(std::map&), f(std::map*): // the parameter must be modified; therefore, only a wrapped std::map // can be passed. // -- std::map f(): // the map is returned by copy; therefore, a Scheme alist // is returned which is most easily used in other Scheme functions // -- std::map& f(), std::map* f(), const std::map& f(), // const std::map* f(): // the map is returned by reference; therefore, a wrapped std::map // is returned // ------------------------------------------------------------------------ %{ #include #include #include %} // exported class namespace std { template > class map { %typemap(in) map< K, T, C > (std::map< K, T, C >* m) { if (SCHEME_NULLP($input)) { $1 = std::map< K, T, C >(); } else if (SCHEME_PAIRP($input)) { $1 = std::map< K, T, C >(); Scheme_Object* alist = $input; while (!SCHEME_NULLP(alist)) { K* k; T* x; Scheme_Object *entry, *key, *val; entry = scheme_car(alist); if (!SCHEME_PAIRP(entry)) SWIG_exception(SWIG_TypeError,"alist expected"); key = scheme_car(entry); val = scheme_cdr(entry); k = (K*) SWIG_MustGetPtr(key,$descriptor(K *),$argnum, 0); if (SWIG_ConvertPtr(val,(void**) &x, $descriptor(T *), 0) == -1) { if (!SCHEME_PAIRP(val)) SWIG_exception(SWIG_TypeError,"alist expected"); val = scheme_car(val); x = (T*) SWIG_MustGetPtr(val,$descriptor(T *),$argnum, 0); } (($1_type &)$1)[*k] = *x; alist = scheme_cdr(alist); } } else { $1 = *(($&1_type) SWIG_MustGetPtr($input,$&1_descriptor,$argnum, 0)); } } %typemap(in) const map< K, T, C >& (std::map< K, T, C > temp, std::map< K, T, C >* m), const map< K, T, C >* (std::map< K, T, C > temp, std::map< K, T, C >* m) { if (SCHEME_NULLP($input)) { temp = std::map< K, T, C >(); $1 = &temp; } else if (SCHEME_PAIRP($input)) { temp = std::map< K, T, C >(); $1 = &temp; Scheme_Object* alist = $input; while (!SCHEME_NULLP(alist)) { K* k; T* x; Scheme_Object *entry, *key, *val; entry = scheme_car(alist); if (!SCHEME_PAIRP(entry)) SWIG_exception(SWIG_TypeError,"alist expected"); key = scheme_car(entry); val = scheme_cdr(entry); k = (K*) SWIG_MustGetPtr(key,$descriptor(K *),$argnum, 0); if (SWIG_ConvertPtr(val,(void**) &x, $descriptor(T *), 0) == -1) { if (!SCHEME_PAIRP(val)) SWIG_exception(SWIG_TypeError,"alist expected"); val = scheme_car(val); x = (T*) SWIG_MustGetPtr(val,$descriptor(T *),$argnum, 0); } temp[*k] = *x; alist = scheme_cdr(alist); } } else { $1 = ($1_ltype) SWIG_MustGetPtr($input,$1_descriptor,$argnum, 0); } } %typemap(out) map< K, T, C > { Scheme_Object* alist = scheme_null; for (std::map< K, T, C >::reverse_iterator i=$1.rbegin(); i!=$1.rend(); ++i) { K* key = new K(i->first); T* val = new T(i->second); Scheme_Object* k = SWIG_NewPointerObj(key,$descriptor(K *), 1); Scheme_Object* x = SWIG_NewPointerObj(val,$descriptor(T *), 1); Scheme_Object* entry = scheme_make_pair(k,x); alist = scheme_make_pair(entry,alist); } $result = alist; } %typecheck(SWIG_TYPECHECK_MAP) map< K, T, C > { /* native sequence? */ if (SCHEME_NULLP($input)) { /* an empty sequence can be of any type */ $1 = 1; } else if (SCHEME_PAIRP($input)) { /* check the first element only */ K* k; T* x; Scheme_Object* head = scheme_car($input); if (SCHEME_PAIRP(head)) { Scheme_Object* key = scheme_car(head); Scheme_Object* val = scheme_cdr(head); if (SWIG_ConvertPtr(key,(void**) &k, $descriptor(K *), 0) == -1) { $1 = 0; } else { if (SWIG_ConvertPtr(val,(void**) &x, $descriptor(T *), 0) != -1) { $1 = 1; } else if (SCHEME_PAIRP(val)) { val = scheme_car(val); if (SWIG_ConvertPtr(val,(void**) &x, $descriptor(T *), 0) != -1) $1 = 1; else $1 = 0; } else { $1 = 0; } } } else { $1 = 0; } } else { /* wrapped map? */ std::map< K, T, C >* m; if (SWIG_ConvertPtr($input,(void **) &m, $&1_descriptor, 0) != -1) $1 = 1; else $1 = 0; } } %typecheck(SWIG_TYPECHECK_MAP) const map< K, T, C >&, const map< K, T, C >* { /* native sequence? */ if (SCHEME_NULLP($input)) { /* an empty sequence can be of any type */ $1 = 1; } else if (SCHEME_PAIRP($input)) { /* check the first element only */ K* k; T* x; Scheme_Object* head = scheme_car($input); if (SCHEME_PAIRP(head)) { Scheme_Object* key = scheme_car(head); Scheme_Object* val = scheme_cdr(head); if (SWIG_ConvertPtr(key,(void**) &k, $descriptor(K *), 0) == -1) { $1 = 0; } else { if (SWIG_ConvertPtr(val,(void**) &x, $descriptor(T *), 0) != -1) { $1 = 1; } else if (SCHEME_PAIRP(val)) { val = scheme_car(val); if (SWIG_ConvertPtr(val,(void**) &x, $descriptor(T *), 0) != -1) $1 = 1; else $1 = 0; } else { $1 = 0; } } } else { $1 = 0; } } else { /* wrapped map? */ std::map< K, T, C >* m; if (SWIG_ConvertPtr($input,(void **) &m, $1_descriptor, 0) != -1) $1 = 1; else $1 = 0; } } %rename("length") size; %rename("null?") empty; %rename("clear!") clear; %rename("ref") __getitem__; %rename("set!") __setitem__; %rename("delete!") __delitem__; %rename("has-key?") has_key; public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef K key_type; typedef T mapped_type; typedef std::pair< const K, T > value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; map(); map(const map& other); unsigned int size() const; bool empty() const; void clear(); %extend { T& __getitem__(const K& key) throw (std::out_of_range) { std::map< K, T, C >::iterator i = self->find(key); if (i != self->end()) return i->second; else throw std::out_of_range("key not found"); } void __setitem__(const K& key, const T& x) { (*self)[key] = x; } void __delitem__(const K& key) throw (std::out_of_range) { std::map< K, T, C >::iterator i = self->find(key); if (i != self->end()) self->erase(i); else throw std::out_of_range("key not found"); } bool has_key(const K& key) { std::map< K, T, C >::iterator i = self->find(key); return i != self->end(); } Scheme_Object* keys() { Scheme_Object* result = scheme_null; for (std::map< K, T, C >::reverse_iterator i=self->rbegin(); i!=self->rend(); ++i) { K* key = new K(i->first); Scheme_Object* k = SWIG_NewPointerObj(key,$descriptor(K *), 1); result = scheme_make_pair(k,result); } return result; } } }; // specializations for built-ins %define specialize_std_map_on_key(K,CHECK,CONVERT_FROM,CONVERT_TO) template class map< K, T, C > { %typemap(in) map< K, T, C > (std::map< K, T, C >* m) { if (SCHEME_NULLP($input)) { $1 = std::map< K, T, C >(); } else if (SCHEME_PAIRP($input)) { $1 = std::map< K, T, C >(); Scheme_Object* alist = $input; while (!SCHEME_NULLP(alist)) { T* x; Scheme_Object *entry, *key, *val; entry = scheme_car(alist); if (!SCHEME_PAIRP(entry)) SWIG_exception(SWIG_TypeError,"alist expected"); key = scheme_car(entry); val = scheme_cdr(entry); if (!CHECK(key)) SWIG_exception(SWIG_TypeError, "map<" #K "," #T "," #C "> expected"); if (SWIG_ConvertPtr(val,(void**) &x, $descriptor(T *), 0) == -1) { if (!SCHEME_PAIRP(val)) SWIG_exception(SWIG_TypeError,"alist expected"); val = scheme_car(val); x = (T*) SWIG_MustGetPtr(val,$descriptor(T *),$argnum, 0); } (($1_type &)$1)[CONVERT_FROM(key)] = *x; alist = scheme_cdr(alist); } } else { $1 = *(($&1_type) SWIG_MustGetPtr($input,$&1_descriptor,$argnum, 0)); } } %typemap(in) const map< K, T, C >& (std::map< K, T, C > temp, std::map< K, T, C >* m), const map< K, T, C >* (std::map< K, T, C > temp, std::map< K, T, C >* m) { if (SCHEME_NULLP($input)) { temp = std::map< K, T, C >(); $1 = &temp; } else if (SCHEME_PAIRP($input)) { temp = std::map< K, T, C >(); $1 = &temp; Scheme_Object* alist = $input; while (!SCHEME_NULLP(alist)) { T* x; Scheme_Object *entry, *key, *val; entry = scheme_car(alist); if (!SCHEME_PAIRP(entry)) SWIG_exception(SWIG_TypeError,"alist expected"); key = scheme_car(entry); val = scheme_cdr(entry); if (!CHECK(key)) SWIG_exception(SWIG_TypeError, "map<" #K "," #T "," #C "> expected"); if (SWIG_ConvertPtr(val,(void**) &x, $descriptor(T *), 0) == -1) { if (!SCHEME_PAIRP(val)) SWIG_exception(SWIG_TypeError,"alist expected"); val = scheme_car(val); x = (T*) SWIG_MustGetPtr(val,$descriptor(T *),$argnum, 0); } temp[CONVERT_FROM(key)] = *x; alist = scheme_cdr(alist); } } else { $1 = ($1_ltype) SWIG_MustGetPtr($input,$1_descriptor,$argnum, 0); } } %typemap(out) map< K, T, C > { Scheme_Object* alist = scheme_null; for (std::map< K, T, C >::reverse_iterator i=$1.rbegin(); i!=$1.rend(); ++i) { T* val = new T(i->second); Scheme_Object* k = CONVERT_TO(i->first); Scheme_Object* x = SWIG_NewPointerObj(val,$descriptor(T *), 1); Scheme_Object* entry = scheme_make_pair(k,x); alist = scheme_make_pair(entry,alist); } $result = alist; } %typecheck(SWIG_TYPECHECK_MAP) map< K, T, C > { // native sequence? if (SCHEME_NULLP($input)) { /* an empty sequence can be of any type */ $1 = 1; } else if (SCHEME_PAIRP($input)) { // check the first element only T* x; Scheme_Object* head = scheme_car($input); if (SCHEME_PAIRP(head)) { Scheme_Object* key = scheme_car(head); Scheme_Object* val = scheme_cdr(head); if (!CHECK(key)) { $1 = 0; } else { if (SWIG_ConvertPtr(val,(void**) &x, $descriptor(T *), 0) != -1) { $1 = 1; } else if (SCHEME_PAIRP(val)) { val = scheme_car(val); if (SWIG_ConvertPtr(val,(void**) &x, $descriptor(T *), 0) != -1) $1 = 1; else $1 = 0; } else { $1 = 0; } } } else { $1 = 0; } } else { // wrapped map? std::map< K, T, C >* m; if (SWIG_ConvertPtr($input,(void **) &m, $&1_descriptor, 0) != -1) $1 = 1; else $1 = 0; } } %typecheck(SWIG_TYPECHECK_MAP) const map< K, T, C >&, const map< K, T, C >* { // native sequence? if (SCHEME_NULLP($input)) { /* an empty sequence can be of any type */ $1 = 1; } else if (SCHEME_PAIRP($input)) { // check the first element only T* x; Scheme_Object* head = scheme_car($input); if (SCHEME_PAIRP(head)) { Scheme_Object* key = scheme_car(head); Scheme_Object* val = scheme_cdr(head); if (!CHECK(key)) { $1 = 0; } else { if (SWIG_ConvertPtr(val,(void**) &x, $descriptor(T *), 0) != -1) { $1 = 1; } else if (SCHEME_PAIRP(val)) { val = scheme_car(val); if (SWIG_ConvertPtr(val,(void**) &x, $descriptor(T *), 0) != -1) $1 = 1; else $1 = 0; } else { $1 = 0; } } } else { $1 = 0; } } else { // wrapped map? std::map< K, T, C >* m; if (SWIG_ConvertPtr($input,(void **) &m, $1_descriptor, 0) != -1) $1 = 1; else $1 = 0; } } %rename("length") size; %rename("null?") empty; %rename("clear!") clear; %rename("ref") __getitem__; %rename("set!") __setitem__; %rename("delete!") __delitem__; %rename("has-key?") has_key; public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef K key_type; typedef T mapped_type; typedef std::pair< const K, T > value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; map(); map(const map& other); unsigned int size() const; bool empty() const; void clear(); %extend { T& __getitem__(K key) throw (std::out_of_range) { std::map< K, T, C >::iterator i = self->find(key); if (i != self->end()) return i->second; else throw std::out_of_range("key not found"); } void __setitem__(K key, const T& x) { (*self)[key] = x; } void __delitem__(K key) throw (std::out_of_range) { std::map< K, T, C >::iterator i = self->find(key); if (i != self->end()) self->erase(i); else throw std::out_of_range("key not found"); } bool has_key(K key) { std::map< K, T, C >::iterator i = self->find(key); return i != self->end(); } Scheme_Object* keys() { Scheme_Object* result = scheme_null; for (std::map< K, T, C >::reverse_iterator i=self->rbegin(); i!=self->rend(); ++i) { Scheme_Object* k = CONVERT_TO(i->first); result = scheme_make_pair(k,result); } return result; } } }; %enddef %define specialize_std_map_on_value(T,CHECK,CONVERT_FROM,CONVERT_TO) template class map< K, T, C > { %typemap(in) map< K, T, C > (std::map< K, T, C >* m) { if (SCHEME_NULLP($input)) { $1 = std::map< K, T, C >(); } else if (SCHEME_PAIRP($input)) { $1 = std::map< K, T, C >(); Scheme_Object* alist = $input; while (!SCHEME_NULLP(alist)) { K* k; Scheme_Object *entry, *key, *val; entry = scheme_car(alist); if (!SCHEME_PAIRP(entry)) SWIG_exception(SWIG_TypeError,"alist expected"); key = scheme_car(entry); val = scheme_cdr(entry); k = (K*) SWIG_MustGetPtr(key,$descriptor(K *),$argnum, 0); if (!CHECK(val)) { if (!SCHEME_PAIRP(val)) SWIG_exception(SWIG_TypeError,"alist expected"); val = scheme_car(val); if (!CHECK(val)) SWIG_exception(SWIG_TypeError, "map<" #K "," #T "," #C "> expected"); } (($1_type &)$1)[*k] = CONVERT_FROM(val); alist = scheme_cdr(alist); } } else { $1 = *(($&1_type) SWIG_MustGetPtr($input,$&1_descriptor,$argnum, 0)); } } %typemap(in) const map< K, T, C >& (std::map< K, T, C > temp, std::map< K, T, C >* m), const map< K, T, C >* (std::map< K, T, C > temp, std::map< K, T, C >* m) { if (SCHEME_NULLP($input)) { temp = std::map< K, T, C >(); $1 = &temp; } else if (SCHEME_PAIRP($input)) { temp = std::map< K, T, C >(); $1 = &temp; Scheme_Object* alist = $input; while (!SCHEME_NULLP(alist)) { K* k; Scheme_Object *entry, *key, *val; entry = scheme_car(alist); if (!SCHEME_PAIRP(entry)) SWIG_exception(SWIG_TypeError,"alist expected"); key = scheme_car(entry); val = scheme_cdr(entry); k = (K*) SWIG_MustGetPtr(key,$descriptor(K *),$argnum, 0); if (!CHECK(val)) { if (!SCHEME_PAIRP(val)) SWIG_exception(SWIG_TypeError,"alist expected"); val = scheme_car(val); if (!CHECK(val)) SWIG_exception(SWIG_TypeError, "map<" #K "," #T "," #C "> expected"); } temp[*k] = CONVERT_FROM(val); alist = scheme_cdr(alist); } } else { $1 = ($1_ltype) SWIG_MustGetPtr($input,$1_descriptor,$argnum, 0); } } %typemap(out) map< K, T, C > { Scheme_Object* alist = scheme_null; for (std::map< K, T, C >::reverse_iterator i=$1.rbegin(); i!=$1.rend(); ++i) { K* key = new K(i->first); Scheme_Object* k = SWIG_NewPointerObj(key,$descriptor(K *), 1); Scheme_Object* x = CONVERT_TO(i->second); Scheme_Object* entry = scheme_make_pair(k,x); alist = scheme_make_pair(entry,alist); } $result = alist; } %typecheck(SWIG_TYPECHECK_MAP) map< K, T, C > { // native sequence? if (SCHEME_NULLP($input)) { /* an empty sequence can be of any type */ $1 = 1; } else if (SCHEME_PAIRP($input)) { // check the first element only K* k; Scheme_Object* head = scheme_car($input); if (SCHEME_PAIRP(head)) { Scheme_Object* key = scheme_car(head); Scheme_Object* val = scheme_cdr(head); if (SWIG_ConvertPtr(val,(void **) &k, $descriptor(K *), 0) == -1) { $1 = 0; } else { if (CHECK(val)) { $1 = 1; } else if (SCHEME_PAIRP(val)) { val = scheme_car(val); if (CHECK(val)) $1 = 1; else $1 = 0; } else { $1 = 0; } } } else { $1 = 0; } } else { // wrapped map? std::map< K, T, C >* m; if (SWIG_ConvertPtr($input,(void **) &m, $&1_descriptor, 0) != -1) $1 = 1; else $1 = 0; } } %typecheck(SWIG_TYPECHECK_MAP) const map< K, T, C >&, const map< K, T, C >* { // native sequence? if (SCHEME_NULLP($input)) { /* an empty sequence can be of any type */ $1 = 1; } else if (SCHEME_PAIRP($input)) { // check the first element only K* k; Scheme_Object* head = scheme_car($input); if (SCHEME_PAIRP(head)) { Scheme_Object* key = scheme_car(head); Scheme_Object* val = scheme_cdr(head); if (SWIG_ConvertPtr(val,(void **) &k, $descriptor(K *), 0) == -1) { $1 = 0; } else { if (CHECK(val)) { $1 = 1; } else if (SCHEME_PAIRP(val)) { val = scheme_car(val); if (CHECK(val)) $1 = 1; else $1 = 0; } else { $1 = 0; } } } else { $1 = 0; } } else { // wrapped map? std::map< K, T, C >* m; if (SWIG_ConvertPtr($input,(void **) &m, $1_descriptor, 0) != -1) $1 = 1; else $1 = 0; } } %rename("length") size; %rename("null?") empty; %rename("clear!") clear; %rename("ref") __getitem__; %rename("set!") __setitem__; %rename("delete!") __delitem__; %rename("has-key?") has_key; public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef K key_type; typedef T mapped_type; typedef std::pair< const K, T > value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; map(); map(const map& other); unsigned int size() const; bool empty() const; void clear(); %extend { T __getitem__(const K& key) throw (std::out_of_range) { std::map< K, T, C >::iterator i = self->find(key); if (i != self->end()) return i->second; else throw std::out_of_range("key not found"); } void __setitem__(const K& key, T x) { (*self)[key] = x; } void __delitem__(const K& key) throw (std::out_of_range) { std::map< K, T, C >::iterator i = self->find(key); if (i != self->end()) self->erase(i); else throw std::out_of_range("key not found"); } bool has_key(const K& key) { std::map< K, T, C >::iterator i = self->find(key); return i != self->end(); } Scheme_Object* keys() { Scheme_Object* result = scheme_null; for (std::map< K, T, C >::reverse_iterator i=self->rbegin(); i!=self->rend(); ++i) { K* key = new K(i->first); Scheme_Object* k = SWIG_NewPointerObj(key,$descriptor(K *), 1); result = scheme_make_pair(k,result); } return result; } } }; %enddef %define specialize_std_map_on_both(K,CHECK_K,CONVERT_K_FROM,CONVERT_K_TO, T,CHECK_T,CONVERT_T_FROM,CONVERT_T_TO) template<> class map< K, T, C > { %typemap(in) map< K, T, C > (std::map< K, T, C >* m) { if (SCHEME_NULLP($input)) { $1 = std::map< K, T, C >(); } else if (SCHEME_PAIRP($input)) { $1 = std::map< K, T, C >(); Scheme_Object* alist = $input; while (!SCHEME_NULLP(alist)) { Scheme_Object *entry, *key, *val; entry = scheme_car(alist); if (!SCHEME_PAIRP(entry)) SWIG_exception(SWIG_TypeError,"alist expected"); key = scheme_car(entry); val = scheme_cdr(entry); if (!CHECK_K(key)) SWIG_exception(SWIG_TypeError, "map<" #K "," #T "," #C "> expected"); if (!CHECK_T(val)) { if (!SCHEME_PAIRP(val)) SWIG_exception(SWIG_TypeError,"alist expected"); val = scheme_car(val); if (!CHECK_T(val)) SWIG_exception(SWIG_TypeError, "map<" #K "," #T "," #C "> expected"); } (($1_type &)$1)[CONVERT_K_FROM(key)] = CONVERT_T_FROM(val); alist = scheme_cdr(alist); } } else { $1 = *(($&1_type) SWIG_MustGetPtr($input,$&1_descriptor,$argnum, 0)); } } %typemap(in) const map< K, T, C >& (std::map< K, T, C > temp, std::map< K, T, C >* m), const map< K, T, C >* (std::map< K, T, C > temp, std::map< K, T, C >* m) { if (SCHEME_NULLP($input)) { temp = std::map< K, T, C >(); $1 = &temp; } else if (SCHEME_PAIRP($input)) { temp = std::map< K, T, C >(); $1 = &temp; Scheme_Object* alist = $input; while (!SCHEME_NULLP(alist)) { Scheme_Object *entry, *key, *val; entry = scheme_car(alist); if (!SCHEME_PAIRP(entry)) SWIG_exception(SWIG_TypeError,"alist expected"); key = scheme_car(entry); val = scheme_cdr(entry); if (!CHECK_K(key)) SWIG_exception(SWIG_TypeError, "map<" #K "," #T "," #C "> expected"); if (!CHECK_T(val)) { if (!SCHEME_PAIRP(val)) SWIG_exception(SWIG_TypeError,"alist expected"); val = scheme_car(val); if (!CHECK_T(val)) SWIG_exception(SWIG_TypeError, "map<" #K "," #T "," #C "> expected"); } temp[CONVERT_K_FROM(key)] = CONVERT_T_FROM(val); alist = scheme_cdr(alist); } } else { $1 = ($1_ltype) SWIG_MustGetPtr($input,$1_descriptor,$argnum, 0); } } %typemap(out) map< K, T, C > { Scheme_Object* alist = scheme_null; for (std::map< K, T, C >::reverse_iterator i=$1.rbegin(); i!=$1.rend(); ++i) { Scheme_Object* k = CONVERT_K_TO(i->first); Scheme_Object* x = CONVERT_T_TO(i->second); Scheme_Object* entry = scheme_make_pair(k,x); alist = scheme_make_pair(entry,alist); } $result = alist; } %typecheck(SWIG_TYPECHECK_MAP) map< K, T, C > { // native sequence? if (SCHEME_NULLP($input)) { /* an empty sequence can be of any type */ $1 = 1; } else if (SCHEME_PAIRP($input)) { // check the first element only Scheme_Object* head = scheme_car($input); if (SCHEME_PAIRP(head)) { Scheme_Object* key = scheme_car(head); Scheme_Object* val = scheme_cdr(head); if (!CHECK_K(key)) { $1 = 0; } else { if (CHECK_T(val)) { $1 = 1; } else if (SCHEME_PAIRP(val)) { val = scheme_car(val); if (CHECK_T(val)) $1 = 1; else $1 = 0; } else { $1 = 0; } } } else { $1 = 0; } } else { // wrapped map? std::map< K, T, C >* m; if (SWIG_ConvertPtr($input,(void **) &m, $&1_descriptor, 0) != -1) $1 = 1; else $1 = 0; } } %typecheck(SWIG_TYPECHECK_MAP) const map< K, T, C >&, const map< K, T, C >* { // native sequence? if (SCHEME_NULLP($input)) { /* an empty sequence can be of any type */ $1 = 1; } else if (SCHEME_PAIRP($input)) { // check the first element only Scheme_Object* head = scheme_car($input); if (SCHEME_PAIRP(head)) { Scheme_Object* key = scheme_car(head); Scheme_Object* val = scheme_cdr(head); if (!CHECK_K(key)) { $1 = 0; } else { if (CHECK_T(val)) { $1 = 1; } else if (SCHEME_PAIRP(val)) { val = scheme_car(val); if (CHECK_T(val)) $1 = 1; else $1 = 0; } else { $1 = 0; } } } else { $1 = 0; } } else { // wrapped map? std::map< K, T, C >* m; if (SWIG_ConvertPtr($input,(void **) &m, $1_descriptor, 0) != -1) $1 = 1; else $1 = 0; } } %rename("length") size; %rename("null?") empty; %rename("clear!") clear; %rename("ref") __getitem__; %rename("set!") __setitem__; %rename("delete!") __delitem__; %rename("has-key?") has_key; public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef K key_type; typedef T mapped_type; typedef std::pair< const K, T > value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; map(); map(const map& other); unsigned int size() const; bool empty() const; void clear(); %extend { T __getitem__(K key) throw (std::out_of_range) { std::map< K, T, C >::iterator i = self->find(key); if (i != self->end()) return i->second; else throw std::out_of_range("key not found"); } void __setitem__(K key, T x) { (*self)[key] = x; } void __delitem__(K key) throw (std::out_of_range) { std::map< K, T, C >::iterator i = self->find(key); if (i != self->end()) self->erase(i); else throw std::out_of_range("key not found"); } bool has_key(K key) { std::map< K, T, C >::iterator i = self->find(key); return i != self->end(); } Scheme_Object* keys() { Scheme_Object* result = scheme_null; for (std::map< K, T, C >::reverse_iterator i=self->rbegin(); i!=self->rend(); ++i) { Scheme_Object* k = CONVERT_K_TO(i->first); result = scheme_make_pair(k,result); } return result; } } }; %enddef specialize_std_map_on_key(bool,SCHEME_BOOLP, SCHEME_TRUEP,swig_make_boolean); specialize_std_map_on_key(int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_key(short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_key(long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_key(unsigned int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_key(unsigned short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_key(unsigned long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_key(double,SCHEME_REALP, scheme_real_to_double,scheme_make_double); specialize_std_map_on_key(float,SCHEME_REALP, scheme_real_to_double,scheme_make_double); specialize_std_map_on_key(std::string,SCHEME_STRINGP, swig_scm_to_string,swig_make_string); specialize_std_map_on_value(bool,SCHEME_BOOLP, SCHEME_TRUEP,swig_make_boolean); specialize_std_map_on_value(int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_value(short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_value(long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_value(unsigned int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_value(unsigned short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_value(unsigned long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_value(double,SCHEME_REALP, scheme_real_to_double,scheme_make_double); specialize_std_map_on_value(float,SCHEME_REALP, scheme_real_to_double,scheme_make_double); specialize_std_map_on_value(std::string,SCHEME_STRINGP, swig_scm_to_string,swig_make_string); specialize_std_map_on_both(bool,SCHEME_BOOLP, SCHEME_TRUEP,swig_make_boolean, bool,SCHEME_BOOLP, SCHEME_TRUEP,swig_make_boolean); specialize_std_map_on_both(bool,SCHEME_BOOLP, SCHEME_TRUEP,swig_make_boolean, int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(bool,SCHEME_BOOLP, SCHEME_TRUEP,swig_make_boolean, short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(bool,SCHEME_BOOLP, SCHEME_TRUEP,swig_make_boolean, long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(bool,SCHEME_BOOLP, SCHEME_TRUEP,swig_make_boolean, unsigned int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(bool,SCHEME_BOOLP, SCHEME_TRUEP,swig_make_boolean, unsigned short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(bool,SCHEME_BOOLP, SCHEME_TRUEP,swig_make_boolean, unsigned long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(bool,SCHEME_BOOLP, SCHEME_TRUEP,swig_make_boolean, double,SCHEME_REALP, scheme_real_to_double,scheme_make_double); specialize_std_map_on_both(bool,SCHEME_BOOLP, SCHEME_TRUEP,swig_make_boolean, float,SCHEME_REALP, scheme_real_to_double,scheme_make_double); specialize_std_map_on_both(bool,SCHEME_BOOLP, SCHEME_TRUEP,swig_make_boolean, std::string,SCHEME_STRINGP, swig_scm_to_string,swig_make_string); specialize_std_map_on_both(int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, bool,SCHEME_BOOLP, SCHEME_TRUEP,swig_make_boolean); specialize_std_map_on_both(int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, unsigned int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, unsigned short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, unsigned long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, double,SCHEME_REALP, scheme_real_to_double,scheme_make_double); specialize_std_map_on_both(int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, float,SCHEME_REALP, scheme_real_to_double,scheme_make_double); specialize_std_map_on_both(int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, std::string,SCHEME_STRINGP, swig_scm_to_string,swig_make_string); specialize_std_map_on_both(short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, bool,SCHEME_BOOLP, SCHEME_TRUEP,swig_make_boolean); specialize_std_map_on_both(short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, unsigned int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, unsigned short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, unsigned long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, double,SCHEME_REALP, scheme_real_to_double,scheme_make_double); specialize_std_map_on_both(short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, float,SCHEME_REALP, scheme_real_to_double,scheme_make_double); specialize_std_map_on_both(short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, std::string,SCHEME_STRINGP, swig_scm_to_string,swig_make_string); specialize_std_map_on_both(long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, bool,SCHEME_BOOLP, SCHEME_TRUEP,swig_make_boolean); specialize_std_map_on_both(long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, unsigned int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, unsigned short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, unsigned long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, double,SCHEME_REALP, scheme_real_to_double,scheme_make_double); specialize_std_map_on_both(long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, float,SCHEME_REALP, scheme_real_to_double,scheme_make_double); specialize_std_map_on_both(long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, std::string,SCHEME_STRINGP, swig_scm_to_string,swig_make_string); specialize_std_map_on_both(unsigned int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, bool,SCHEME_BOOLP, SCHEME_TRUEP,swig_make_boolean); specialize_std_map_on_both(unsigned int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(unsigned int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(unsigned int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(unsigned int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, unsigned int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(unsigned int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, unsigned short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(unsigned int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, unsigned long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(unsigned int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, double,SCHEME_REALP, scheme_real_to_double,scheme_make_double); specialize_std_map_on_both(unsigned int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, float,SCHEME_REALP, scheme_real_to_double,scheme_make_double); specialize_std_map_on_both(unsigned int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, std::string,SCHEME_STRINGP, swig_scm_to_string,swig_make_string); specialize_std_map_on_both(unsigned short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, bool,SCHEME_BOOLP, SCHEME_TRUEP,swig_make_boolean); specialize_std_map_on_both(unsigned short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(unsigned short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(unsigned short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(unsigned short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, unsigned int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(unsigned short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, unsigned short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(unsigned short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, unsigned long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(unsigned short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, double,SCHEME_REALP, scheme_real_to_double,scheme_make_double); specialize_std_map_on_both(unsigned short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, float,SCHEME_REALP, scheme_real_to_double,scheme_make_double); specialize_std_map_on_both(unsigned short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, std::string,SCHEME_STRINGP, swig_scm_to_string,swig_make_string); specialize_std_map_on_both(unsigned long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, bool,SCHEME_BOOLP, SCHEME_TRUEP,swig_make_boolean); specialize_std_map_on_both(unsigned long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(unsigned long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(unsigned long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(unsigned long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, unsigned int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(unsigned long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, unsigned short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(unsigned long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, unsigned long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(unsigned long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, double,SCHEME_REALP, scheme_real_to_double,scheme_make_double); specialize_std_map_on_both(unsigned long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, float,SCHEME_REALP, scheme_real_to_double,scheme_make_double); specialize_std_map_on_both(unsigned long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, std::string,SCHEME_STRINGP, swig_scm_to_string,swig_make_string); specialize_std_map_on_both(double,SCHEME_REALP, scheme_real_to_double,scheme_make_double, bool,SCHEME_BOOLP, SCHEME_TRUEP,swig_make_boolean); specialize_std_map_on_both(double,SCHEME_REALP, scheme_real_to_double,scheme_make_double, int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(double,SCHEME_REALP, scheme_real_to_double,scheme_make_double, short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(double,SCHEME_REALP, scheme_real_to_double,scheme_make_double, long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(double,SCHEME_REALP, scheme_real_to_double,scheme_make_double, unsigned int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(double,SCHEME_REALP, scheme_real_to_double,scheme_make_double, unsigned short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(double,SCHEME_REALP, scheme_real_to_double,scheme_make_double, unsigned long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(double,SCHEME_REALP, scheme_real_to_double,scheme_make_double, double,SCHEME_REALP, scheme_real_to_double,scheme_make_double); specialize_std_map_on_both(double,SCHEME_REALP, scheme_real_to_double,scheme_make_double, float,SCHEME_REALP, scheme_real_to_double,scheme_make_double); specialize_std_map_on_both(double,SCHEME_REALP, scheme_real_to_double,scheme_make_double, std::string,SCHEME_STRINGP, swig_scm_to_string,swig_make_string); specialize_std_map_on_both(float,SCHEME_REALP, scheme_real_to_double,scheme_make_double, bool,SCHEME_BOOLP, SCHEME_TRUEP,swig_make_boolean); specialize_std_map_on_both(float,SCHEME_REALP, scheme_real_to_double,scheme_make_double, int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(float,SCHEME_REALP, scheme_real_to_double,scheme_make_double, short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(float,SCHEME_REALP, scheme_real_to_double,scheme_make_double, long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(float,SCHEME_REALP, scheme_real_to_double,scheme_make_double, unsigned int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(float,SCHEME_REALP, scheme_real_to_double,scheme_make_double, unsigned short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(float,SCHEME_REALP, scheme_real_to_double,scheme_make_double, unsigned long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(float,SCHEME_REALP, scheme_real_to_double,scheme_make_double, double,SCHEME_REALP, scheme_real_to_double,scheme_make_double); specialize_std_map_on_both(float,SCHEME_REALP, scheme_real_to_double,scheme_make_double, float,SCHEME_REALP, scheme_real_to_double,scheme_make_double); specialize_std_map_on_both(float,SCHEME_REALP, scheme_real_to_double,scheme_make_double, std::string,SCHEME_STRINGP, swig_scm_to_string,swig_make_string); specialize_std_map_on_both(std::string,SCHEME_STRINGP, swig_scm_to_string,swig_make_string, bool,SCHEME_BOOLP, SCHEME_TRUEP,swig_make_boolean); specialize_std_map_on_both(std::string,SCHEME_STRINGP, swig_scm_to_string,swig_make_string, int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(std::string,SCHEME_STRINGP, swig_scm_to_string,swig_make_string, short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(std::string,SCHEME_STRINGP, swig_scm_to_string,swig_make_string, long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(std::string,SCHEME_STRINGP, swig_scm_to_string,swig_make_string, unsigned int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(std::string,SCHEME_STRINGP, swig_scm_to_string,swig_make_string, unsigned short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(std::string,SCHEME_STRINGP, swig_scm_to_string,swig_make_string, unsigned long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(std::string,SCHEME_STRINGP, swig_scm_to_string,swig_make_string, double,SCHEME_REALP, scheme_real_to_double,scheme_make_double); specialize_std_map_on_both(std::string,SCHEME_STRINGP, swig_scm_to_string,swig_make_string, float,SCHEME_REALP, scheme_real_to_double,scheme_make_double); specialize_std_map_on_both(std::string,SCHEME_STRINGP, swig_scm_to_string,swig_make_string, std::string,SCHEME_STRINGP, swig_scm_to_string,swig_make_string); } swig-4.0.1/Lib/scilab/0000755000175000017500000000000013527063513014313 5ustar williamwilliamswig-4.0.1/Lib/scilab/std_deque.i0000644000175000017500000000144213527063513016443 0ustar williamwilliam/* * * C++ type : STL deque * Scilab type : matrix (for primitive types) or list (for pointer types) * */ %fragment("StdDequeTraits", "header", fragment="StdSequenceTraits") %{ namespace swig { template struct traits_asptr > { static int asptr(const SwigSciObject &obj, std::deque **deq) { return traits_asptr_stdseq >::asptr(obj, deq); } }; template struct traits_from > { static SwigSciObject from(const std::deque& deq) { return traits_from_stdseq >::from(deq); } }; } %} #define %swig_deque_methods(Type...) %swig_sequence_methods(Type) #define %swig_deque_methods_val(Type...) %swig_sequence_methods_val(Type); %include swig-4.0.1/Lib/scilab/scistdcommon.swg0000644000175000017500000001340213527063513017537 0ustar williamwilliam%fragment("StdTraits","header",fragment="StdTraitsCommon") { namespace swig { // Traits that provides the from method template struct traits_from_ptr { static SwigSciObject from(Type *val, int owner = 0) { return SWIG_OK; //SWIG_NewPointerObj(val, type_info(), owner); } }; template struct traits_from { static SwigSciObject from(const Type& val) { return traits_from_ptr::from(new Type(val), 1); } }; template struct traits_from { static SwigSciObject from(Type* val) { return traits_from_ptr::from(val, 0); } }; template struct traits_from { static SwigSciObject from(const Type* val) { return traits_from_ptr::from(const_cast(val), 0); } }; template inline SwigSciObject from(const Type& val) { return traits_from::from(val); } template inline SwigSciObject from_ptr(Type* val, int owner) { return traits_from_ptr::from(val, owner); } // Traits that provides the asval/as/check method template struct traits_asptr { static int asptr(const SwigSciObject& obj, Type **val) { Type *p = 0; swig_type_info *descriptor = type_info(); int res = descriptor ? SWIG_ConvertPtr(obj, (void **)&p, descriptor, 0) : SWIG_ERROR; if (SWIG_IsOK(res)) { if (val) *val = p; } return res; } }; template inline int asptr(const SwigSciObject& obj, Type **vptr) { return traits_asptr::asptr(obj, vptr); } template struct traits_asval { static int asval(const SwigSciObject& obj, Type *val) { if (val) { Type *p = 0; int res = traits_asptr::asptr(obj, &p); if (!SWIG_IsOK(res)) return res; if (p) { typedef typename noconst_traits::noconst_type noconst_type; *(const_cast(val)) = *p; if (SWIG_IsNewObj(res)){ %delete(p); res = SWIG_DelNewMask(res); } return res; } else { return SWIG_ERROR; } } else { return traits_asptr::asptr(obj, (Type **)(0)); } } }; template struct traits_asval { static int asval(const SwigSciObject& obj, Type **val) { if (val) { typedef typename noconst_traits::noconst_type noconst_type; noconst_type *p = 0; int res = traits_asptr::asptr(obj, &p); if (SWIG_IsOK(res)) { *(const_cast(val)) = p; } return res; } else { return traits_asptr::asptr(obj, (Type **)(0)); } } }; template inline int asval(const SwigSciObject& obj, Type *val) { return traits_asval::asval(obj, val); } template struct traits_as { static Type as(const SwigSciObject& obj) { Type v; int res = asval(obj, &v); if (SWIG_IsOK(res)) { return v; } else { %type_error(swig::type_name()); throw std::invalid_argument("bad type"); } } }; template struct traits_as { static Type as(const SwigSciObject& obj) { Type *v = 0; int res = traits_asptr::asptr(obj, &v); if (SWIG_IsOK(res) && v) { if (SWIG_IsNewObj(res)) { Type r(*v); %delete(v); return r; } else { return *v; } } else { %type_error(swig::type_name()); throw std::invalid_argument("bad type"); } } }; template struct traits_as { static Type* as(const SwigSciObject& obj) { Type *v = 0; int res = traits_asptr::asptr(obj, &v); if (SWIG_IsOK(res)) { return v; } else { %type_error(swig::type_name()); throw std::invalid_argument("bad type"); } } }; template inline Type as(const SwigSciObject& obj) { return traits_as::category>::as(obj); } template struct traits_check { static bool check(const SwigSciObject& obj) { int res = asval(obj, (Type *)(0)); return SWIG_IsOK(res) ? true : false; } }; template struct traits_check { static bool check(const SwigSciObject& obj) { int res = asptr(obj, (Type **)(0)); return SWIG_IsOK(res) ? true : false; } }; template inline bool check(const SwigSciObject& obj) { return traits_check::category>::check(obj); } } } %define %specialize_std_container(Type,Check,As,From) %{ namespace swig { template <> struct traits_asval { typedef Type value_type; static int asval(const SwigSciObject& obj, value_type *val) { if (Check(obj)) { if (val) *val = As(obj); return SWIG_OK; } return SWIG_ERROR; } }; template <> struct traits_from { typedef Type value_type; static SwigSciObject from(const value_type& val) { return From(val); } }; template <> struct traits_check { static int check(const SwigSciObject& obj) { int res = Check(obj); return obj && res ? res : 0; } }; } %} %enddef #define specialize_std_vector(Type,Check,As,From) %specialize_std_container(%arg(Type),Check,As,From) #define specialize_std_list(Type,Check,As,From) %specialize_std_container(%arg(Type),Check,As,From) #define specialize_std_deque(Type,Check,As,From) %specialize_std_container(%arg(Type),Check,As,From) #define specialize_std_set(Type,Check,As,From) %specialize_std_container(%arg(Type),Check,As,From) #define specialize_std_multiset(Type,Check,As,From) %specialize_std_container(%arg(Type),Check,As,From) swig-4.0.1/Lib/scilab/scifloat.swg0000644000175000017500000000425213527063513016644 0ustar williamwilliam/* * FLOAT SCALAR */ %fragment(SWIG_AsVal_frag(float), "header", fragment=SWIG_AsVal_frag(double)) { SWIGINTERN int SWIG_AsVal_dec(float)(SwigSciObject iVar, float *pfValue) { double dblValue = 0.0; if(SWIG_AsVal_dec(double)(iVar, &dblValue) != SWIG_OK) { return SWIG_ERROR; } if (pfValue) *pfValue = (float) dblValue; return SWIG_OK; } } %fragment(SWIG_From_frag(float), "header") { SWIGINTERN int SWIG_From_dec(float)(float flValue) { if (createScalarDouble(pvApiCtx, SWIG_NbInputArgument(pvApiCtx) + SWIG_Scilab_GetOutputPosition(), (double)flValue)) return SWIG_ERROR; return SWIG_OK; } } %fragment("SWIG_SciDouble_AsFloatArrayAndSize", "header") { SWIGINTERN int SWIG_SciDouble_AsFloatArrayAndSize(void *pvApiCtx, int iVar, int *iRows, int *iCols, float **pfValue, char *fname) { SciErr sciErr; int *piAddrVar = NULL; double *pdValue = NULL; sciErr = getVarAddressFromPosition(pvApiCtx, iVar, &piAddrVar); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (isDoubleType(pvApiCtx, piAddrVar) && !isVarComplex(pvApiCtx, piAddrVar)) { int i; sciErr = getMatrixOfDouble(pvApiCtx, piAddrVar, iRows, iCols, &pdValue); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } *pfValue = (float *) malloc((*iRows) * (*iCols) * sizeof(float)); for (i=0; i < (*iRows) * (*iCols); i++) (*pfValue)[i] = (float) pdValue[i]; return SWIG_OK; } else { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong type for input argument #%d: A real matrix expected.\n"), fname, iVar); return SWIG_ERROR; } } } %fragment("SWIG_SciDouble_FromFloatArrayAndSize", "header") { SWIGINTERN int SWIG_SciDouble_FromFloatArrayAndSize(void *pvApiCtx, int iVarOut, int iRows, int iCols, float *pfValue) { SciErr sciErr; double *pdValue; int i; pdValue = (double *) malloc(iRows * iCols * sizeof(double)); for (i = 0; i < iRows * iCols; i++) pdValue[i] = pfValue[i]; sciErr = createMatrixOfDouble(pvApiCtx, SWIG_NbInputArgument(pvApiCtx) + iVarOut, iRows, iCols, pdValue); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } free(pdValue); return SWIG_OK; } } swig-4.0.1/Lib/scilab/scipointer.swg0000644000175000017500000000262613527063513017222 0ustar williamwilliam/* * POINTER */ %fragment("SWIG_ConvertPtr", "header") { #define SWIG_ConvertPtr(scilabValue, voidPointer, pointerDescriptor, flags) SwigScilabPtrToObject(pvApiCtx, scilabValue, voidPointer, pointerDescriptor, flags, SWIG_Scilab_GetFuncName()) } %fragment("SWIG_NewPointerObj", "header") { #define SWIG_NewPointerObj(pointer, pointerDescriptor, flags) SwigScilabPtrFromObject(pvApiCtx, SWIG_Scilab_GetOutputPosition(), pointer, pointerDescriptor, flags, NULL) } /* * FUNCTION POINTER */ %fragment("SWIG_ConvertFunctionPtr", "header") { #define SWIG_ConvertFunctionPtr(scilabValue, voidPointer, pointerDescriptor) SwigScilabPtrToObject(pvApiCtx, scilabValue, voidPointer, pointerDescriptor, 0, SWIG_Scilab_GetFuncName()) } %fragment("SWIG_NewFunctionPtrObj", "header") { #define SWIG_NewFunctionPtrObj(pointer, pointerDescriptor) SwigScilabPtrFromObject(pvApiCtx, SWIG_Scilab_GetOutputPosition(), pointer, pointerDescriptor, 0, NULL) } // No fragment used here, the functions "SwigScilabPtrToObject" and "SwigScilabPtrFromObject" are defined in sciruntime.swg /* * C++ member pointers, ie, member methods */ %fragment("SWIG_NewMemberObj", "header") { #define SWIG_NewMemberObj(ptr, sz, tp) SWIG_Scilab_NewMemberObj(pvApiCtx, $result, ptr, sz, tp) } %fragment("SWIG_ConvertMember", "header") { #define SWIG_ConvertMember(obj, ptr, sz, ty) SWIG_Scilab_ConvertPacked(pvApiCtx, obj, ptr, sz, ty, SWIG_Scilab_GetFuncName()) } swig-4.0.1/Lib/scilab/scidouble.swg0000644000175000017500000000636013527063513017013 0ustar williamwilliam/* * DOUBLE SCALAR */ %fragment(SWIG_AsVal_frag(double), "header", fragment="SWIG_SciDouble_AsDouble") { %#define SWIG_AsVal_double(scilabValue, valuePointer) SWIG_SciDouble_AsDouble(pvApiCtx, scilabValue, valuePointer, SWIG_Scilab_GetFuncName()) } %fragment("SWIG_SciDouble_AsDouble", "header") { SWIGINTERN int SWIG_SciDouble_AsDouble(void *pvApiCtx, SwigSciObject iVar, double *pdblValue, char *fname) { SciErr sciErr; int iRet = 0; int *piAddrVar = NULL; sciErr = getVarAddressFromPosition(pvApiCtx, iVar, &piAddrVar); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (!isDoubleType(pvApiCtx, piAddrVar) || isVarComplex(pvApiCtx, piAddrVar)) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong type for input argument #%d: A real expected.\n"), fname, iVar); return SWIG_ERROR; } if (!isScalar(pvApiCtx, piAddrVar)) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong size for input argument #%d: A real expected.\n"), fname, iVar); return SWIG_ERROR; } iRet = getScalarDouble(pvApiCtx, piAddrVar, pdblValue); if (iRet) { return SWIG_ERROR; } return SWIG_OK; } } %fragment(SWIG_From_frag(double), "header", fragment="SWIG_SciDouble_FromDouble") { %#define SWIG_From_double(scilabValue) SWIG_SciDouble_FromDouble(pvApiCtx, SWIG_Scilab_GetOutputPosition(), scilabValue, SWIG_Scilab_GetFuncName()) } %fragment("SWIG_SciDouble_FromDouble", "header") { SWIGINTERN int SWIG_SciDouble_FromDouble(void *pvApiCtx, int iVarOut, double dblValue, char *fname) { if (createScalarDouble(pvApiCtx, SWIG_NbInputArgument(pvApiCtx) + iVarOut, dblValue)) return SWIG_ERROR; return SWIG_OK; } } /* * DOUBLE ARRAY */ %fragment("SWIG_SciDouble_AsDoubleArrayAndSize", "header") { SWIGINTERN int SWIG_SciDouble_AsDoubleArrayAndSize(void *pvApiCtx, int iVar, int *iRows, int *iCols, double **pdValue, char *fname) { SciErr sciErr; int *piAddrVar = NULL; sciErr = getVarAddressFromPosition(pvApiCtx, iVar, &piAddrVar); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (isDoubleType(pvApiCtx, piAddrVar) && !isVarComplex(pvApiCtx, piAddrVar)) { sciErr = getMatrixOfDouble(pvApiCtx, piAddrVar, iRows, iCols, pdValue); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } } else { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong type for input argument #%d: A real matrix expected.\n"), fname, iVar); return SWIG_ERROR; } return SWIG_OK; } } %fragment("SWIG_SciDouble_FromDoubleArrayAndSize", "header") { SWIGINTERN int SWIG_SciDouble_FromDoubleArrayAndSize(void *pvApiCtx, int iVarOut, int iRows, int iCols, double *pdblValue) { SciErr sciErr; sciErr = createMatrixOfDouble(pvApiCtx, SWIG_NbInputArgument(pvApiCtx) + iVarOut, iRows, iCols, pdblValue); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } return SWIG_OK; } } %fragment(SWIG_CreateScilabVariable_frag(double), "wrapper") { SWIGINTERN int SWIG_CreateScilabVariable_dec(double)(void *pvApiCtx, const char* psVariableName, const double dVariableValue) { SciErr sciErr; sciErr = createNamedMatrixOfDouble(pvApiCtx, psVariableName, 1, 1, &dVariableValue); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } return SWIG_OK; } } swig-4.0.1/Lib/scilab/std_multiset.i0000644000175000017500000000152613527063513017211 0ustar williamwilliam/* * * C++ type : STL multiset * Scilab type : matrix (for primitive types) or list (for pointer types) * */ %fragment("StdMultisetTraits", "header", fragment="StdSequenceTraits") %{ namespace swig { template struct traits_asptr > { static int asptr(const SwigSciObject &obj, std::multiset **multiset) { return traits_asptr_stdseq >::asptr(obj, multiset); } }; template struct traits_from > { static SwigSciObject from(const std::multiset& multiset) { return traits_from_stdseq >::from(multiset); } }; } %} #define %swig_multiset_methods(Set...) %swig_sequence_methods(Type) #define %swig_multiset_methods_val(Type...) %swig_sequence_methods_val(Type); %include swig-4.0.1/Lib/scilab/sciexception.swg0000644000175000017500000000354413527063513017540 0ustar williamwilliam/* * Exception typemaps (throws) */ %include %typemap(throws, noblock=1) int, unsigned int, signed int, int&,unsigned int&, signed int&, long, unsigned long, signed long, short, unsigned short,signed short, long long, unsigned long long, unsigned char, signed char, long&, unsigned long&, signed long&, short&, unsigned short&, signed short&, long long&, unsigned long long&, unsigned char&, signed char&, size_t, size_t&, ptrdiff_t, ptrdiff_t& { char obj[20]; sprintf(obj, "%d", (int)$1); SWIG_Scilab_Raise_Ex(obj, "$type", $descriptor); } %typemap(throws, noblock=1) enum SWIGTYPE { char obj[20]; sprintf(obj, "%d", (int)$1); SWIG_Scilab_Raise_Ex(obj, "$type", $descriptor); } %typemap(throws, noblock=1) float, double, float&, double& { char obj[20]; sprintf(obj, "%5.3f", (double)$1); SWIG_Scilab_Raise_Ex(obj, "$type", $descriptor); } %typemap(throws, noblock=1) bool, bool& { SWIG_Scilab_Raise_Ex($1 ? "true" : "false", "$type", $descriptor); } %typemap(throws, noblock=1) char*, char[ANY] { SWIG_Scilab_Raise_Ex($1, "$type", $descriptor); } %typemap(throws, noblock=1) char, char& { char obj[2]; sprintf(obj, "%c", (char)$1); SWIG_Scilab_Raise_Ex(obj, "$type", $descriptor); } %typemap(throws, noblock=1) SWIGTYPE, SWIGTYPE*, SWIGTYPE [ANY], SWIGTYPE & { SWIG_Scilab_Raise_Ex((char*)NULL, "$type", $descriptor); } %typemap(throws, noblock=1) (...) { SWIG_exception(SWIG_RuntimeError, "unknown exception"); } swig-4.0.1/Lib/scilab/scirun.swg0000644000175000017500000003501713527063513016346 0ustar williamwilliam/* ----------------------------------------------------------------------------- * Scilab support runtime * -----------------------------------------------------------------------------*/ /* Scilab version macro */ #include "version.h" #define SWIG_SCILAB_VERSION (SCI_VERSION_MAJOR * 100) + (SCI_VERSION_MINOR * 10) + SCI_VERSION_MAINTENANCE /* Scilab standard headers */ #ifdef __cplusplus extern "C" { #endif #include "api_scilab.h" #if SWIG_SCILAB_VERSION < 540 #define __USE_DEPRECATED_STACK_FUNCTIONS__ #include "stack-c.h" #endif #if SWIG_SCILAB_VERSION < 600 #include "MALLOC.h" #endif #include "Scierror.h" #include "localization.h" #include "freeArrayOfString.h" #include #include #ifdef __cplusplus } #endif /* Gateway signature */ #if SWIG_SCILAB_VERSION >= 600 #define SWIG_GatewayParameters char* fname, void *pvApiCtx #define SWIG_GatewayArguments fname, pvApiCtx #else #define SWIG_GatewayParameters char* fname, unsigned long fname_len #define SWIG_GatewayArguments fname, fname_len #endif /* Function name management functions */ #include static char *SwigFuncName = NULL; static char *SWIG_Scilab_GetFuncName(void) { return SwigFuncName; } static void SWIG_Scilab_SetFuncName(char *funcName) { if (SwigFuncName != NULL) { free(SwigFuncName); SwigFuncName = NULL; } if (funcName) { SwigFuncName = (char *)malloc(strlen(funcName) + 1); if (SwigFuncName) strcpy(SwigFuncName, funcName); } } /* Api context management functions */ #if SWIG_SCILAB_VERSION >= 600 static void *pvApiCtx = NULL; static void SWIG_Scilab_SetApiContext(void *apiCtx) { pvApiCtx = apiCtx; } #else #define SWIG_Scilab_SetApiContext(apiCtx) #endif /* Argument management functions */ #if SWIG_SCILAB_VERSION >= 540 #define SWIG_CheckInputArgument(pvApiCtx, minInputArgument, maxInputArgument) CheckInputArgument(pvApiCtx, minInputArgument, maxInputArgument) #define SWIG_CheckInputArgumentAtLeast(pvApiCtx, minInputArgument) CheckInputArgumentAtLeast(pvApiCtx, minInputArgument) #define SWIG_CheckOutputArgument(pvApiCtx, minOutputArgument, maxOutputArgument) CheckOutputArgument(pvApiCtx, minOutputArgument, maxOutputArgument) #define SWIG_NbInputArgument(pvApiCtx) nbInputArgument(pvApiCtx) #define SWIG_AssignOutputArgument(pvApiCtx, outputArgumentPos, argumentPos) AssignOutputVariable(pvApiCtx, outputArgumentPos) = argumentPos #else #define SWIG_CheckInputArgument(pvApiCtx, minInputArgument, maxInputArgument) CheckRhs(minInputArgument, maxInputArgument) #define SWIG_CheckInputArgumentAtLeast(pvApiCtx, minInputArgument) CheckRhs(minInputArgument, 256) #define SWIG_CheckOutputArgument(pvApiCtx, minOutputArgument, maxOutputArgument) CheckLhs(minOutputArgument, maxOutputArgument) #define SWIG_NbInputArgument(pvApiCtx) Rhs #define SWIG_AssignOutputArgument(pvApiCtx, outputArgumentPos, argumentPos) LhsVar(outputArgumentPos) = argumentPos #endif typedef int SwigSciObject; static int SwigOutputPosition = -1; static int SWIG_Scilab_GetOutputPosition(void) { return SwigOutputPosition; } static void SWIG_Scilab_SetOutputPosition(int outputPosition) { SwigOutputPosition = outputPosition; } SWIGRUNTIME int SWIG_Scilab_SetOutput(void *pvApiCtx, SwigSciObject output) { int outputPosition = SWIG_Scilab_GetOutputPosition(); if (outputPosition < 0) return SWIG_ERROR; SWIG_AssignOutputArgument(pvApiCtx, outputPosition, SWIG_NbInputArgument(pvApiCtx) + outputPosition); return SWIG_OK; } /* Error functions */ #define SCILAB_API_ARGUMENT_ERROR 999 SWIGINTERN const char* SWIG_Scilab_ErrorType(int code) { switch(code) { case SWIG_MemoryError: return "MemoryError"; case SWIG_IOError: return "IOError"; case SWIG_RuntimeError: return "RuntimeError"; case SWIG_IndexError: return "IndexError"; case SWIG_TypeError: return "TypeError"; case SWIG_DivisionByZero: return "ZeroDivisionError"; case SWIG_OverflowError: return "OverflowError"; case SWIG_SyntaxError: return "SyntaxError"; case SWIG_ValueError: return "ValueError"; case SWIG_SystemError: return "SystemError"; case SWIG_AttributeError: return "AttributeError"; default: return "RuntimeError"; } } #define SWIG_ErrorType(code) SWIG_Scilab_ErrorType(code) #ifndef SWIG_SCILAB_ERROR #define SWIG_SCILAB_ERROR 20000 #endif SWIGINTERN void SWIG_Scilab_Error(int code, const char *msg) { Scierror(SWIG_SCILAB_ERROR - code, _("SWIG/Scilab: %s: %s\n"), SWIG_Scilab_ErrorType(code), msg); } #define SWIG_Error(code, msg) SWIG_Scilab_Error(code, msg) #define SWIG_fail return SWIG_ERROR; SWIGRUNTIME void SWIG_Scilab_Raise_Ex(const char *obj, const char *type, swig_type_info *descriptor) { if (type) { if (obj) Scierror(SWIG_SCILAB_ERROR, "SWIG/Scilab: Exception (%s) occurred: %s\n", type, obj); else Scierror(SWIG_SCILAB_ERROR, "SWIG/Scilab: Exception (%s) occurred.\n", type); } } SWIGRUNTIME void SWIG_Scilab_Raise(const int obj, const char *type, swig_type_info *descriptor) { Scierror(SWIG_SCILAB_ERROR, "SWIG/Scilab: Exception (%s) occurred.\n", type); } /* Module initialization */ static int swig_module_initialized = 0; SWIGRUNTIME int SWIG_Module_Initialized() { return swig_module_initialized; } /* Pointer conversion functions */ SWIGRUNTIME swig_type_info * SWIG_Scilab_TypeQuery(const char *name); SWIGINTERN int SwigScilabCheckPtr(void *pvApiCtx, int iVar, swig_type_info *descriptor, char *fname) { SciErr sciErr; int *piAddrVar = NULL; int iType = 0; sciErr = getVarAddressFromPosition(pvApiCtx, iVar, &piAddrVar); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } sciErr = getVarType(pvApiCtx, piAddrVar, &iType); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (iType == sci_mlist) { int iItemCount = 0; void *pvTypeinfo = NULL; sciErr = getListItemNumber(pvApiCtx, piAddrVar, &iItemCount); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (iItemCount < 3) { return SWIG_ERROR; } sciErr = getPointerInList(pvApiCtx, piAddrVar, 2, &pvTypeinfo); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (descriptor) { swig_cast_info *cast = SWIG_TypeCheck(SWIG_TypeName((swig_type_info*)pvTypeinfo), descriptor); return (cast != NULL); } else { return SWIG_ERROR; } } else { return (iType == sci_pointer); } } SWIGINTERN int SwigScilabPtrToObject(void *pvApiCtx, int iVar, void **pvObj, swig_type_info *descriptor, int flags, char *fname) { SciErr sciErr; int *piAddrVar = NULL; int iType = 0; void *pvPtr = NULL; sciErr = getVarAddressFromPosition(pvApiCtx, iVar, &piAddrVar); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } sciErr = getVarType(pvApiCtx, piAddrVar, &iType); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (iType == sci_mlist) { int iItemCount = 0; void *pvTypeinfo = NULL; sciErr = getListItemNumber(pvApiCtx, piAddrVar, &iItemCount); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (iItemCount < 3) { return SWIG_ERROR; } sciErr = getPointerInList(pvApiCtx, piAddrVar, 2, &pvTypeinfo); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } sciErr = getPointerInList(pvApiCtx, piAddrVar, 3, &pvPtr); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (pvPtr) { if (descriptor) { swig_cast_info *cast = SWIG_TypeCheck(SWIG_TypeName((swig_type_info *)pvTypeinfo), descriptor); if (cast) { int newmemory = 0; pvPtr = SWIG_TypeCast(cast, pvPtr, &newmemory); // TODO newmemory } else { return SWIG_ERROR; } } } } else if (iType == sci_pointer) { sciErr = getPointer(pvApiCtx, piAddrVar, &pvPtr); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } } else { return SWIG_ERROR; } if (pvObj) { *pvObj = pvPtr; if (pvPtr) return SWIG_OK; else return (flags & SWIG_POINTER_NO_NULL) ? SWIG_NullReferenceError : SWIG_OK; } else { return SWIG_ERROR; } } SWIGRUNTIMEINLINE int SwigScilabPtrFromObject(void *pvApiCtx, int iVarOut, void *pvObj, swig_type_info *descriptor, int flags, const char *pstTypeName) { SciErr sciErr; if (descriptor) { int *piMListAddr = NULL; sciErr = createMList(pvApiCtx, SWIG_NbInputArgument(pvApiCtx) + iVarOut, 3, &piMListAddr); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (pstTypeName == NULL) { pstTypeName = SWIG_TypeName(descriptor); } sciErr = createMatrixOfStringInList(pvApiCtx, SWIG_NbInputArgument(pvApiCtx) + iVarOut, piMListAddr, 1, 1, 1, &pstTypeName); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } sciErr = createPointerInList(pvApiCtx, SWIG_NbInputArgument(pvApiCtx) + iVarOut, piMListAddr, 2, descriptor); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } sciErr = createPointerInList(pvApiCtx, SWIG_NbInputArgument(pvApiCtx) + iVarOut, piMListAddr, 3, pvObj); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } } else { sciErr = createPointer(pvApiCtx, SWIG_NbInputArgument(pvApiCtx) + iVarOut, pvObj); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } } return SWIG_OK; } /* Pointer argument conversions */ SWIGRUNTIME int SWIG_Scilab_ConvertPacked(void *pvApiCtx, int iVar, void *ptr, int sz, swig_type_info *ty, char *fname) { swig_cast_info *tc; int *piAddrVar = NULL; char *pstString = NULL; char *pstStringPtr = NULL; SciErr sciErr; sciErr = getVarAddressFromPosition(pvApiCtx, iVar, &piAddrVar); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (getAllocatedSingleString(pvApiCtx, piAddrVar, &pstString)) { return SWIG_ERROR; } /* Pointer values must start with leading underscore */ if (*pstString != '_') { freeAllocatedSingleString(pstString); return SWIG_ERROR; } pstStringPtr = pstString; pstStringPtr++; pstStringPtr = (char*)SWIG_UnpackData(pstStringPtr, ptr, sz); if (ty) { if (!pstStringPtr) { freeAllocatedSingleString(pstString); return SWIG_ERROR; } tc = SWIG_TypeCheck(pstStringPtr, ty); if (!tc) { freeAllocatedSingleString(pstString); return SWIG_ERROR; } } freeAllocatedSingleString(pstString); return SWIG_OK; } SWIGRUNTIME int SWIG_Scilab_NewMemberObj(void *pvApiCtx, int iVarOut, void *ptr, int sz, swig_type_info *type) { char result[1024]; char *r = result; if ((2*sz + 1 + strlen(type->name)) > 1000) { return SWIG_ERROR; } *(r++) = '_'; r = SWIG_PackData(r, ptr, sz); strcpy(r, type->name); if (createSingleString(pvApiCtx, SWIG_NbInputArgument(pvApiCtx) + iVarOut, &result[0])) return SWIG_ERROR; return SWIG_OK; } /* * Pointer utility functions */ #include #ifdef __cplusplus extern "C" #endif int SWIG_this(SWIG_GatewayParameters) { void *ptrValue = NULL; if (SwigScilabPtrToObject(pvApiCtx, 1, &ptrValue, NULL, 0, fname) == SWIG_OK) { SWIG_Scilab_SetOutputPosition(1); return SWIG_Scilab_SetOutput(pvApiCtx, createScalarDouble(pvApiCtx, SWIG_NbInputArgument(pvApiCtx) + 1, (double)(uintptr_t)ptrValue)); } else { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Incorrect value for input argument #%d: The value is not a pointer.\n"), fname, 1); return SWIG_ERROR; } } #ifdef __cplusplus extern "C" #endif int SWIG_ptr(SWIG_GatewayParameters) { if (SWIG_NbInputArgument(pvApiCtx) > 0) { SciErr sciErr; int *piAddrVar1 = NULL; int iTypeVar1 = 0; char *pstInputPtrTypeName = NULL; char *pstOutputMListTypeName = NULL; if (SWIG_NbInputArgument(pvApiCtx) > 2) { int *piAddrVar2 = NULL; int *piAddrVar3 = NULL; sciErr = getVarAddressFromPosition(pvApiCtx, 2, &piAddrVar2); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (getAllocatedSingleString(pvApiCtx, piAddrVar2, &pstInputPtrTypeName)) { return SWIG_ERROR; } sciErr = getVarAddressFromPosition(pvApiCtx, 3, &piAddrVar3); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (getAllocatedSingleString(pvApiCtx, piAddrVar3, &pstOutputMListTypeName)) { return SWIG_ERROR; } } sciErr = getVarAddressFromPosition(pvApiCtx, 1, &piAddrVar1); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } sciErr = getVarType(pvApiCtx, piAddrVar1, &iTypeVar1); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if ((iTypeVar1 == sci_pointer) || (iTypeVar1 == sci_mlist)) { void *ptrValue = NULL; if (SwigScilabPtrToObject(pvApiCtx, 1, &ptrValue, SWIG_Scilab_TypeQuery(pstInputPtrTypeName), 0, (char *) "SWIG_ptr") == SWIG_OK) { SWIG_Scilab_SetOutputPosition(1); return SWIG_Scilab_SetOutput(pvApiCtx, SwigScilabPtrFromObject(pvApiCtx, 1, ptrValue, SWIG_Scilab_TypeQuery(pstInputPtrTypeName), 0, pstOutputMListTypeName)); } else { return SWIG_ERROR; } } else if (iTypeVar1 == sci_matrix) { double dValue = 0; if (getScalarDouble(pvApiCtx, piAddrVar1, &dValue) == 0) { if (dValue != (uintptr_t)dValue) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Incorrect value for input argument #%d: The double value cannot be converted to a pointer.\n"), fname, 1); return SWIG_ValueError; } if ((dValue < 0) || (dValue > ULONG_MAX)) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Overflow error for input argument #%d: The double value cannot be converted to a pointer.\n"), fname, 1); return SWIG_OverflowError; } SWIG_Scilab_SetOutputPosition(1); return SWIG_Scilab_SetOutput(pvApiCtx, SwigScilabPtrFromObject(pvApiCtx, 1, (void *) (uintptr_t)dValue, SWIG_Scilab_TypeQuery(pstInputPtrTypeName), 0, pstOutputMListTypeName)); } else { return SWIG_TypeError; } } else { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong type for input argument #%d: A mlist, pointer or a double expected.\n"), (char *) "SWIG_ptr", 1); return SWIG_TypeError; } } else { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: A mlist, pointer, or a double expected.\n"), "SWIG_ptr", 1); return SWIG_TypeError; } } swig-4.0.1/Lib/scilab/scimatrixdouble.swg0000644000175000017500000001075513527063513020243 0ustar williamwilliam/* * C-type: double array * Scilab type: double matrix */ %include // in (double *IN, int IN_ROWCOUNT, int IN_COLCOUNT) %typemap(in, noblock=1, fragment="SWIG_SciDouble_AsDoubleArrayAndSize") (double *IN, int IN_ROWCOUNT, int IN_COLCOUNT) { if (SWIG_SciDouble_AsDoubleArrayAndSize(pvApiCtx, $input, &$2, &$3, &$1, fname) != SWIG_OK) { return SWIG_ERROR; } } // in (int IN_ROWCOUNT, int IN_COLCOUNT, double *IN) %typemap(in, noblock=1, fragment="SWIG_SciDouble_AsDoubleArrayAndSize") (int IN_ROWCOUNT, int IN_COLCOUNT, double *IN) { if (SWIG_SciDouble_AsDoubleArrayAndSize(pvApiCtx, $input, &$1, &$2, &$3, fname) != SWIG_OK) { return SWIG_ERROR; } } // in (double *IN, int IN_SIZE) %typemap(in, noblock=1, fragment="SWIG_SciDouble_AsDoubleArrayAndSize") (double *IN, int IN_SIZE) (int rowCount, int colCount) { if (SWIG_SciDouble_AsDoubleArrayAndSize(pvApiCtx, $input, &rowCount, &colCount, &$1, fname) == SWIG_OK) { $2 = rowCount * colCount; } else { return SWIG_ERROR; } } // in (int IN_SIZE, double *IN) %typemap(in, noblock=1, fragment="SWIG_SciDouble_AsDoubleArrayAndSize") (int IN_SIZE, double *IN) (int rowCount, int colCount) { if (SWIG_SciDouble_AsDoubleArrayAndSize(pvApiCtx, $input, &rowCount, &colCount, &$2, fname) == SWIG_OK) { $1 = rowCount * colCount; } else { return SWIG_ERROR; } } // out (double **OUT, int *OUT_ROWCOUNT, int *OUT_COLCOUNT) %typemap(in, noblock=1, numinputs=0) (double **OUT, int *OUT_ROWCOUNT, int *OUT_COLCOUNT) { } %typemap(arginit, noblock=1) (double **OUT, int *OUT_ROWCOUNT, int *OUT_COLCOUNT) { $1 = (double**) malloc(sizeof(double*)); $2 = (int*) malloc(sizeof(int)); $3 = (int*) malloc(sizeof(int)); } %typemap(freearg, noblock=1) (double **OUT, int *OUT_ROWCOUNT, int *OUT_COLCOUNT) { free(*$1); free($1); free($2); free($3); } %typemap(argout, noblock=1, fragment="SWIG_SciDouble_FromDoubleArrayAndSize") (double **OUT, int *OUT_ROWCOUNT, int *OUT_COLCOUNT) { if (SWIG_SciDouble_FromDoubleArrayAndSize(pvApiCtx, SWIG_Scilab_GetOutputPosition(), *$2, *$3, *$1) == SWIG_OK) { SWIG_Scilab_SetOutput(pvApiCtx, SWIG_NbInputArgument(pvApiCtx) + SWIG_Scilab_GetOutputPosition()); } else { return SWIG_ERROR; } } // out (int *OUT_ROWCOUNT, int *OUT_COLCOUNT, double **OUT) %typemap(in, noblock=1, numinputs=0) (int *OUT_ROWCOUNT, int *OUT_COLCOUNT, double **OUT) { } %typemap(arginit, noblock=1) (int *OUT_ROWCOUNT, int *OUT_COLCOUNT, double **OUT) { $1 = (int*) malloc(sizeof(int)); $2 = (int*) malloc(sizeof(int)); $3 = (double**) malloc(sizeof(double*)); } %typemap(argout, noblock=1, fragment="SWIG_SciDouble_FromDoubleArrayAndSize") (int *IN_ROWCOUNT, int *IN_COLCOUNT, double **OUT) { if (SWIG_SciDouble_FromDoubleArrayAndSize(pvApiCtx, SWIG_Scilab_GetOutputPosition(), *$1, *$2, *$3) == SWIG_OK) { SWIG_Scilab_SetOutput(pvApiCtx, SWIG_NbInputArgument(pvApiCtx) + SWIG_Scilab_GetOutputPosition()); } else { return SWIG_ERROR; } } %typemap(freearg, noblock=1) (int *OUT_ROWCOUNT, int *OUT_COLCOUNT, double **OUT) { free($1); free($2); free(*$3); free($3); } // out (double **OUT, int *OUT_SIZE) %typemap(in, noblock=1, numinputs=0) (double **OUT, int *OUT_SIZE) { } %typemap(arginit, noblock=1) (double **OUT, int *OUT_SIZE) { $1 = (double**) malloc(sizeof(double*)); $2 = (int*) malloc(sizeof(int)); } %typemap(argout, noblock=1, fragment="SWIG_SciDouble_FromDoubleArrayAndSize") (double **OUT, int *OUT_SIZE) { if (SWIG_SciDouble_FromDoubleArrayAndSize(pvApiCtx, SWIG_Scilab_GetOutputPosition(), 1, *$2, *$1) == SWIG_OK) { SWIG_Scilab_SetOutput(pvApiCtx, SWIG_NbInputArgument(pvApiCtx) + SWIG_Scilab_GetOutputPosition()); } else { return SWIG_ERROR; } } %typemap(freearg, noblock=1) (double **OUT, int *OUT_SIZE) { free(*$1); free($1); free($2); } // out (int *OUT_SIZE, double **OUT) %typemap(in, noblock=1, numinputs=0) (int *OUT_SIZE, double **OUT) { } %typemap(arginit, noblock=1) (int *OUT_SIZE, double **OUT) { $1 = (int*) malloc(sizeof(int)); $2 = (double**) malloc(sizeof(double*)); } %typemap(argout, noblock=1, fragment="SWIG_SciDouble_FromDoubleArrayAndSize") (int *OUT_SIZE, double **OUT) { if (SWIG_SciDouble_FromDoubleArrayAndSize(pvApiCtx, SWIG_Scilab_GetOutputPosition(), 1, *$1, *$2) == SWIG_OK) { SWIG_Scilab_SetOutput(pvApiCtx, SWIG_NbInputArgument(pvApiCtx) + SWIG_Scilab_GetOutputPosition()); } else { return SWIG_ERROR; } } %typemap(freearg, noblock=1) (int *OUT_SIZE, double **OUT) { free($1); free(*$2); free($2); } swig-4.0.1/Lib/scilab/cpointer.i0000644000175000017500000000004113527063513016303 0ustar williamwilliam%include swig-4.0.1/Lib/scilab/std_shared_ptr.i0000644000175000017500000000010413527063513017465 0ustar williamwilliam#define SWIG_SHARED_PTR_NAMESPACE std %include swig-4.0.1/Lib/scilab/scisignedchar.swg0000644000175000017500000001354213527063513017650 0ustar williamwilliam/* * C-type: signed char * Scilab type: double or int8 */ %fragment(SWIG_AsVal_frag(signed char), "header", fragment="SWIG_SciDoubleOrInt8_AsSignedChar", fragment="") { #define SWIG_AsVal_signed_SS_char(scilabValue, valuePointer) SWIG_SciDoubleOrInt8_AsSignedChar(pvApiCtx, scilabValue, valuePointer, SWIG_Scilab_GetFuncName()) } %fragment("SWIG_SciDoubleOrInt8_AsSignedChar", "header") { SWIGINTERN int SWIG_SciDoubleOrInt8_AsSignedChar(void *pvApiCtx, int iVar, signed char *pscValue, char *fname) { SciErr sciErr; int iType = 0; int iRows = 0; int iCols = 0; int iPrec = 0; int *piAddrVar = NULL; sciErr = getVarAddressFromPosition(pvApiCtx, iVar, &piAddrVar); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } sciErr = getVarType(pvApiCtx, piAddrVar, &iType); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (iType == sci_ints) { char *pcData = NULL; sciErr = getMatrixOfIntegerPrecision(pvApiCtx, piAddrVar, &iPrec); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (iPrec != SCI_INT8) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong type for input argument #%d: A 8-bit signed integer or a double expected.\n"), fname, iVar); return SWIG_TypeError; } sciErr = getMatrixOfInteger8(pvApiCtx, piAddrVar, &iRows, &iCols, &pcData); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (iRows * iCols != 1) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong size for input argument #%d: A 8-bit signed integer or a double expected.\n"), fname, iVar); return SWIG_TypeError; } *pscValue = *pcData; } else if (iType == sci_matrix) { double *pdData = NULL; double dValue = 0.0f; sciErr = getMatrixOfDouble(pvApiCtx, piAddrVar, &iRows, &iCols, &pdData); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (iRows * iCols != 1) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong size for input argument #%d: A 8-bit signed integer or a double expected.\n"), fname, iVar); return SWIG_TypeError; } dValue = *pdData; if (dValue != floor(dValue)) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Incorrect value for input argument #%d: The double value cannot be converted to a 8-bit signed integer.\n"), fname, iVar); return SWIG_ValueError; } if ((dValue < SCHAR_MIN) || (dValue > SCHAR_MAX)) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Overflow error for input argument #%d: The double value cannot be converted to a 8-bit signed integer.\n"), fname, iVar); return SWIG_OverflowError; } *pscValue = (signed char) dValue; } else { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong type for input argument #%d: A 8-bit signed integer or a double expected.\n"), fname, iVar); return SWIG_TypeError; } return SWIG_OK; } } %fragment(SWIG_From_frag(signed char), "header", fragment="SWIG_SciDouble_FromSignedChar") { #define SWIG_From_signed_SS_char(scilabValue) SWIG_SciDouble_FromSignedChar(pvApiCtx, SWIG_Scilab_GetOutputPosition(), scilabValue) } %fragment("SWIG_SciDouble_FromSignedChar", "header") { SWIGINTERN int SWIG_SciDouble_FromSignedChar(void *pvApiCtx, int iVarOut, signed char scValue) { if (createScalarDouble(pvApiCtx, SWIG_NbInputArgument(pvApiCtx) + iVarOut, (double) scValue)) return SWIG_ERROR; return SWIG_OK; } } /* * C-type: signed char[] * Scilab type: double or int8 matrix */ %fragment("SWIG_SciDoubleOrInt8_AsSignedCharArrayAndSize", "header") { SWIGINTERN int SWIG_SciDoubleOrInt8_AsSignedCharArrayAndSize(void *pvApiCtx, int iVar, int *iRows, int *iCols, signed char **pscValue, char *fname) { SciErr sciErr; int iType = 0; int *piAddrVar = NULL; sciErr = getVarAddressFromPosition(pvApiCtx, iVar, &piAddrVar); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } sciErr = getVarType(pvApiCtx, piAddrVar, &iType); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (iType == sci_matrix) { double *pdData = NULL; int size = 0; int i; sciErr = getMatrixOfDouble(pvApiCtx, piAddrVar, iRows, iCols, &pdData); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } size = (*iRows) * (*iCols); *pscValue = (signed char*) malloc(size * sizeof(int*)); for (i = 0; i < size; i++) (*pscValue)[i] = (signed char) pdData[i]; } else if (iType == sci_ints) { int iPrec = 0; sciErr = getMatrixOfIntegerPrecision(pvApiCtx, piAddrVar, &iPrec); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (iPrec != SCI_INT8) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong type for input argument #%d: A 8-bit signed integer or a double matrix expected.\n"), fname, iVar); return SWIG_ERROR; } sciErr = getMatrixOfInteger8(pvApiCtx, piAddrVar, iRows, iCols, (char **)pscValue); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } } else { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong type for input argument #%d: A 8-bit signed integer or a double matrix expected.\n"), fname, iVar); return SWIG_ERROR; } return SWIG_OK; } } %fragment("SWIG_SciDouble_FromSignedCharArrayAndSize", "header") { SWIGINTERN int SWIG_SciDouble_FromSignedCharArrayAndSize(void *pvApiCtx, int iVarOut, int iRows, int iCols, const signed char *pscValue) { SciErr sciErr; int i; double *pdValues = NULL; pdValues = (double*) malloc(iRows * iCols * sizeof(double)); for (i=0; i struct traits_asptr > { static int asptr(const SwigSciObject &obj, std::vector **vec) { return traits_asptr_stdseq >::asptr(obj, vec); } }; template struct traits_from > { static SwigSciObject from(const std::vector& vec) { return traits_from_stdseq >::from(vec); } }; } %} #define %swig_vector_methods(Type...) %swig_sequence_methods(Type) #define %swig_vector_methods_val(Type...) %swig_sequence_methods_val(Type); %include swig-4.0.1/Lib/scilab/sciarray.swg0000644000175000017500000000730613527063513016660 0ustar williamwilliam/* -------------------------------------------------------------------------- * * Arrays typemaps * * --------------------------------------------------------------------------*/ %{ #include %} %define %scilab_asarray_withallocatecopy(TYPEMAPTYPE, FRAGMENTNAME, CTYPE, TEMPDATATYPE) %typemap(TYPEMAPTYPE, fragment="FRAGMENTNAME") CTYPE { size_t i = 0; int iRows = 0; int iCols = 0; TEMPDATATYPE *pTempData = NULL; if (FRAGMENTNAME(pvApiCtx, $input, &iRows, &iCols, &pTempData, fname)) { return SWIG_ERROR; } $1 = ($1_ltype)MALLOC(sizeof($*1_ltype) * iRows * iCols); for (i = 0; i < iRows * iCols; i++) { $1[i] = ($*1_ltype) pTempData[i]; } } %enddef %define %scilab_asarrayandsize_withcopy(TYPEMAPTYPE, FRAGMENTNAME, CTYPE, TEMPDATATYPE) %typemap(TYPEMAPTYPE, fragment="FRAGMENTNAME") CTYPE { int iRows = 0; int iCols = 0; TEMPDATATYPE *pTempData = NULL; if (FRAGMENTNAME(pvApiCtx, $input, &iRows, &iCols, &pTempData, fname)) { return SWIG_ERROR; } if (iRows*iCols <= $1_dim0) { size_t i; for (i = 0; i < $1_dim0; i++) { $1[i] = ($*1_ltype) pTempData[i]; } } else { char errmsg[100]; sprintf(errmsg, "Size of input data (%d) is too big (maximum is %d)", iRows*iCols, $1_dim0); SWIG_exception_fail(SWIG_OverflowError, errmsg); } } %enddef %define %scilab_fromarrayandsize(TYPEMAPTYPE, FRAGMENTNAME, CTYPE) %typemap(TYPEMAPTYPE, noblock=1, fragment="FRAGMENTNAME") CTYPE { %set_output(FRAGMENTNAME(pvApiCtx, $result, 1, $1_dim0, $1)); } %enddef %define %scilab_array_typemaps(CTYPE, ASARRAY_FRAGMENT, FROMARRAY_FRAGMENT, TEMPDATATYPE) %scilab_asarrayandsize_withcopy(varin, ASARRAY_FRAGMENT, CTYPE[ANY], TEMPDATATYPE); %scilab_asarray_withallocatecopy(in, ASARRAY_FRAGMENT, CTYPE[ANY], TEMPDATATYPE); %scilab_fromarrayandsize(varout, FROMARRAY_FRAGMENT, CTYPE[ANY]); %scilab_fromarrayandsize(out, FROMARRAY_FRAGMENT, CTYPE[ANY]); %apply SWIGTYPE[] { CTYPE[] }; %scilab_asarray_withallocatecopy(in, ASARRAY_FRAGMENT, CTYPE[], TEMPDATATYPE); %enddef // Double %scilab_array_typemaps(double, SWIG_SciDouble_AsDoubleArrayAndSize, SWIG_SciDouble_FromDoubleArrayAndSize, double); // Signed char %scilab_array_typemaps(signed char, SWIG_SciDoubleOrInt8_AsSignedCharArrayAndSize, SWIG_SciDouble_FromSignedCharArrayAndSize, signed char); // Unsigned char %scilab_array_typemaps(unsigned char, SWIG_SciDoubleOrUint8_AsUnsignedCharArrayAndSize, SWIG_SciDouble_FromUnsignedCharArrayAndSize, unsigned char); // Short %scilab_array_typemaps(short, SWIG_SciDoubleOrInt16_AsShortArrayAndSize, SWIG_SciDouble_FromShortArrayAndSize, short); // Unsigned short %scilab_array_typemaps(unsigned short, SWIG_SciDoubleOrUint16_AsUnsignedShortArrayAndSize, SWIG_SciDouble_FromUnsignedShortArrayAndSize, unsigned short); // Int %scilab_array_typemaps(int, SWIG_SciDoubleOrInt32_AsIntArrayAndSize, SWIG_SciDouble_FromIntArrayAndSize, int); // Unsigned int %scilab_array_typemaps(unsigned int, SWIG_SciDoubleOrUint32_AsUnsignedIntArrayAndSize, SWIG_SciDouble_FromUnsignedIntArrayAndSize, unsigned int); // Long %scilab_array_typemaps(long, SWIG_SciDoubleOrInt32_AsIntArrayAndSize, SWIG_SciDouble_FromLongArrayAndSize, int); // Unsigned long %scilab_array_typemaps(unsigned long, SWIG_SciDoubleOrUint32_AsUnsignedIntArrayAndSize, SWIG_SciDouble_FromUnsignedLongArrayAndSize, unsigned int); // Float %scilab_array_typemaps(float, SWIG_SciDouble_AsFloatArrayAndSize, SWIG_SciDouble_FromFloatArrayAndSize, float); // Bool %scilab_array_typemaps(bool, SWIG_SciBoolean_AsIntArrayAndSize, SWIG_SciBoolean_FromBoolArrayAndSize, int); // Char * %scilab_array_typemaps(char *, SWIG_SciString_AsCharPtrArrayAndSize, SWIG_SciString_FromCharPtrArrayAndSize, char *); swig-4.0.1/Lib/scilab/std_alloc.i0000644000175000017500000000003413527063513016426 0ustar williamwilliam%include swig-4.0.1/Lib/scilab/scisequenceint.swg0000644000175000017500000000552713527063513020070 0ustar williamwilliam/* * * Scilab matrix of int <-> C++ int container * */ %include %fragment(SWIG_AsCheck_Sequence_frag(int), "header") { SWIGINTERN int SWIG_AsCheck_Sequence_dec(int)(SwigSciObject obj) { SciErr sciErr; int *piAddrVar; int iType = 0; sciErr = getVarAddressFromPosition(pvApiCtx, obj, &piAddrVar); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } sciErr = getVarType(pvApiCtx, piAddrVar, &iType); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if ((iType == sci_matrix) || (iType == sci_ints)) { return SWIG_OK; } else { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong type for input argument #%d: An integer is expected.\n"), SWIG_Scilab_GetFuncName(), obj); return SWIG_ERROR; } } } %fragment(SWIG_AsGet_Sequence_frag(int), "header", fragment="SWIG_SciDoubleOrInt32_AsIntArrayAndSize") { SWIGINTERN int SWIG_AsGet_Sequence_dec(int)(SwigSciObject obj, int **pSequence) { int iMatrixRowCount; int iMatrixColCount; return (SWIG_SciDoubleOrInt32_AsIntArrayAndSize(pvApiCtx, obj, &iMatrixRowCount, &iMatrixColCount, pSequence, SWIG_Scilab_GetFuncName())); } } %fragment(SWIG_AsSize_Sequence_frag(int), "header", fragment="SWIG_SciDoubleOrInt32_AsIntArrayAndSize") { SWIGINTERN int SWIG_AsSize_Sequence_dec(int)(SwigSciObject obj, int *piSize) { int *piMatrix; int iMatrixRowCount; int iMatrixColCount; if (SWIG_SciDoubleOrInt32_AsIntArrayAndSize(pvApiCtx, obj, &iMatrixRowCount, &iMatrixColCount, &piMatrix, SWIG_Scilab_GetFuncName()) == SWIG_OK) { if ((iMatrixRowCount > 1) && (iMatrixColCount > 1)) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong size for input argument #%d: An integer vector is expected.\n"), SWIG_Scilab_GetFuncName(), obj); return SWIG_ERROR; } *piSize = iMatrixRowCount * iMatrixColCount; return SWIG_OK; } return SWIG_ERROR; } } %fragment(SWIG_FromCreate_Sequence_frag(int), "header") { SWIGINTERN int SWIG_FromCreate_Sequence_dec(int)(int size, int **pSequence) { *pSequence = new int[size]; return *pSequence != NULL ? SWIG_OK : SWIG_ERROR; } } %fragment(SWIG_FromSet_Sequence_frag(int), "header", fragment="SWIG_SciDouble_FromIntArrayAndSize") { SWIGINTERN SwigSciObject SWIG_FromSet_Sequence_dec(int)(int size, int *pSequence) { SwigSciObject obj = SWIG_SciDouble_FromIntArrayAndSize(pvApiCtx, SWIG_Scilab_GetOutputPosition(), 1, size, pSequence); delete (int *)pSequence; return obj; } } %fragment(SWIG_AsVal_SequenceItem_frag(int), "header") { SWIGINTERN int SWIG_AsVal_SequenceItem_dec(int)(SwigSciObject obj, int *pSequence, int iItemIndex) { return pSequence[iItemIndex]; } } %fragment(SWIG_From_SequenceItem_frag(int), "header") { SWIGINTERN int SWIG_From_SequenceItem_dec(int)(int *pSequence, int iItemIndex, int itemValue) { pSequence[iItemIndex] = itemValue; return SWIG_OK; } } swig-4.0.1/Lib/scilab/scilong.swg0000644000175000017500000000775013527063513016504 0ustar williamwilliam/* * C-type: long * Scilab type: double or int32 */ %fragment(SWIG_AsVal_frag(long), "header", fragment="SWIG_SciDoubleOrInt32_AsLong", fragment="") { %#define SWIG_AsVal_long(scilabValue, valuePointer) SWIG_SciDoubleOrInt32_AsLong(pvApiCtx, scilabValue, valuePointer, SWIG_Scilab_GetFuncName()); } %fragment("SWIG_SciDoubleOrInt32_AsLong", "header") { SWIGINTERN int SWIG_SciDoubleOrInt32_AsLong(void *pvApiCtx, SwigSciObject iVar, long *plValue, char *fname) { SciErr sciErr; int iType = 0; int iRows = 0; int iCols = 0; int *piAddrVar = NULL; sciErr = getVarAddressFromPosition(pvApiCtx, iVar, &piAddrVar); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } sciErr = getVarType(pvApiCtx, piAddrVar, &iType); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (iType == sci_ints) { int iPrec = 0; int *piData = NULL; sciErr = getMatrixOfIntegerPrecision(pvApiCtx, piAddrVar, &iPrec); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (iPrec != SCI_INT32) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong type for input argument #%d: A 32-bit signed integer or a double expected.\n"), fname, iVar); return SWIG_TypeError; } sciErr = getMatrixOfInteger32(pvApiCtx, piAddrVar, &iRows, &iCols, &piData); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (iRows * iCols != 1) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong size for input argument #%d: A 32-bit signed integer or a double expected.\n"), fname, iVar); return SWIG_TypeError; } *plValue = (long) *piData; } else if (iType == sci_matrix) { double *pdData = NULL; double dValue = 0.0f; sciErr = getMatrixOfDouble(pvApiCtx, piAddrVar, &iRows, &iCols, &pdData); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (iRows * iCols != 1) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong size for input argument #%d: A 32-bit signed integer or a double expected.\n"), fname, iVar); return SWIG_TypeError; } dValue = *pdData; if (dValue != floor(dValue)) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Incorrect value for input argument #%d: The double value cannot be converted to a 32-bit signed integer.\n"), fname, iVar); return SWIG_ValueError; } if ((dValue < LONG_MIN) || (dValue > LONG_MAX)) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Overflow error for input argument #%d: The double value cannot be converted to a 32-bit signed integer.\n"), fname, iVar); return SWIG_OverflowError; } *plValue = (long) dValue; } else { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong type for input argument #%d: A 32-bit signed integer or a double expected.\n"), fname, iVar); return SWIG_TypeError; } return SWIG_OK; } } %fragment(SWIG_From_frag(long), "header", fragment="SWIG_SciDouble_FromLong") { %#define SWIG_From_long(scilabValue) SWIG_SciDouble_FromLong(pvApiCtx, SWIG_Scilab_GetOutputPosition(), scilabValue, SWIG_Scilab_GetFuncName()) } %fragment("SWIG_SciDouble_FromLong", "header") { SWIGINTERN int SWIG_SciDouble_FromLong(void *pvApiCtx, int iVarOut, long lValue, char *fname) { if (createScalarDouble(pvApiCtx, SWIG_NbInputArgument(pvApiCtx) + iVarOut, (double) lValue)) return SWIG_ERROR; return SWIG_OK; } } %fragment("SWIG_SciDouble_FromLongArrayAndSize", "header") { SWIGINTERN int SWIG_SciDouble_FromLongArrayAndSize(void *pvApiCtx, int iVarOut, int iRows, int iCols, const long *plData) { SciErr sciErr; int i; double *pdValues = NULL; pdValues = (double*) malloc(iRows * iCols * sizeof(double)); for (i=0; i // in (int *IN, int IN_ROWCOUNT, int IN_COLCOUNT) %typemap(in, noblock=1, fragment="SWIG_SciDoubleOrInt32_AsIntArrayAndSize") (int *IN, int IN_ROWCOUNT, int IN_COLCOUNT) { if (SWIG_SciDoubleOrInt32_AsIntArrayAndSize(pvApiCtx, $input, &$2, &$3, &$1, fname) != SWIG_OK) { return SWIG_ERROR; } } // in (int IN_ROWCOUNT, int IN_COLCOUNT, int *IN) %typemap(in, noblock=1, fragment="SWIG_SciDoubleOrInt32_AsIntArrayAndSize") (int IN_ROWCOUNT, int IN_COLCOUNT, int *IN) { if (SWIG_SciDoubleOrInt32_AsIntArrayAndSize(pvApiCtx, $input, &$1, &$2, &$3, fname) != SWIG_OK) { return SWIG_ERROR; } } // in (int *IN, int IN_SIZE) %typemap(in, noblock=1, fragment="SWIG_SciDoubleOrInt32_AsIntArrayAndSize") (int *IN, int IN_SIZE) (int rowCount, int colCount) { if (SWIG_SciDoubleOrInt32_AsIntArrayAndSize(pvApiCtx, $input, &rowCount, &colCount, &$1, fname) == SWIG_OK) { $2 = rowCount * colCount; } else { return SWIG_ERROR; } } // in (int IN_SIZE, int *IN) %typemap(in, noblock=1, fragment="SWIG_SciDoubleOrInt32_AsIntArrayAndSize") (int IN_SIZE, int *IN) (int rowCount, int colCount) { if (SWIG_SciDoubleOrInt32_AsIntArrayAndSize(pvApiCtx, $input, &rowCount, &colCount, &$2, fname) == SWIG_OK) { $1 = rowCount * colCount; } else { return SWIG_ERROR; } } // out (int **OUT, int *OUT_ROWCOUNT, int *OUT_COLCOUNT) %typemap(in, noblock=1, numinputs=0) (int **OUT, int *OUT_ROWCOUNT, int *OUT_COLCOUNT) { } %typemap(arginit, noblock=1) (int **OUT, int *OUT_ROWCOUNT, int *OUT_COLCOUNT) { $1 = (int**) malloc(sizeof(int*)); $2 = (int*) malloc(sizeof(int)); $3 = (int*) malloc(sizeof(int)); } %typemap(argout, noblock=1, fragment="SWIG_SciDouble_FromIntArrayAndSize") (int **OUT, int *OUT_ROWCOUNT, int *OUT_COLCOUNT) { if (SWIG_SciDouble_FromIntArrayAndSize(pvApiCtx, SWIG_Scilab_GetOutputPosition(), *$2, *$3, *$1) == SWIG_OK) { SWIG_Scilab_SetOutput(pvApiCtx, SWIG_NbInputArgument(pvApiCtx) + SWIG_Scilab_GetOutputPosition()); } else { return SWIG_ERROR; } } %typemap(freearg, noblock=1) (int **OUT, int *OUT_ROWCOUNT, int *OUT_COLCOUNT) { free(*$1); free($1); free($2); free($3); } // out (int *OUT_ROWCOUNT, int *OUT_COLCOUNT, int **OUT) %typemap(in, noblock=1, numinputs=0) (int *OUT_ROWCOUNT, int *OUT_COLCOUNT, int **OUT) { } %typemap(arginit, noblock=1) (int *OUT_ROWCOUNT, int *OUT_COLCOUNT, int **OUT) { $1 = (int*) malloc(sizeof(int)); $2 = (int*) malloc(sizeof(int)); $3 = (int**) malloc(sizeof(int*)); } %typemap(argout, noblock=1, fragment="SWIG_SciDouble_FromIntArrayAndSize") (int *OUT_ROWCOUNT, int *OUT_COLCOUNT, int **OUT) { if (SWIG_SciDouble_FromIntArrayAndSize(pvApiCtx, SWIG_Scilab_GetOutputPosition(), *$1, *$2, *$3) == SWIG_OK) { SWIG_Scilab_SetOutput(pvApiCtx, SWIG_NbInputArgument(pvApiCtx) + SWIG_Scilab_GetOutputPosition()); } else { return SWIG_ERROR; } } %typemap(freearg, noblock=1) (int *OUT_ROWCOUNT, int *OUT_COLCOUNT, int **OUT) { free($1); free($2); free(*$3); free($3); } // out (int **OUT, int *OUT_SIZE) %typemap(in, noblock=1, numinputs=0) (int **OUT, int *OUT_SIZE) { } %typemap(arginit) (int **OUT, int *OUT_SIZE) { $1 = (int**) malloc(sizeof(int*)); $2 = (int*) malloc(sizeof(int)); } %typemap(argout, noblock=1, fragment="SWIG_SciDouble_FromIntArrayAndSize") (int **OUT, int *OUT_SIZE) { if (SWIG_SciDouble_FromIntArrayAndSize(pvApiCtx, SWIG_Scilab_GetOutputPosition(), 1, *$2, *$1) == SWIG_OK) { SWIG_Scilab_SetOutput(pvApiCtx, SWIG_NbInputArgument(pvApiCtx) + SWIG_Scilab_GetOutputPosition()); } else { return SWIG_ERROR; } } %typemap(freearg, noblock=1) (int **OUT, int *OUT_SIZE) { free(*$1); free($1); free($2); } // out (int *OUT_SIZE, int **OUT) %typemap(in, noblock=1, numinputs=0) (int *OUT_SIZE, int **OUT) { } %typemap(arginit, noblock=1) (int *OUT_SIZE, int **OUT) { $1 = (int*) malloc(sizeof(int)); $2 = (int**) malloc(sizeof(int*)); } %typemap(argout, noblock=1, fragment="SWIG_SciDouble_FromIntArrayAndSize") (int *OUT_SIZE, int **OUT) { if (SWIG_SciDouble_FromIntArrayAndSize(pvApiCtx, SWIG_Scilab_GetOutputPosition(), 1, *$1, *$2) == SWIG_OK) { SWIG_Scilab_SetOutput(pvApiCtx, SWIG_NbInputArgument(pvApiCtx) + SWIG_Scilab_GetOutputPosition()); } else { return SWIG_ERROR; } } %typemap(freearg, noblock=1) (int *IN_SIZE, int **OUT) { free($1); free(*$2); free($2); } swig-4.0.1/Lib/scilab/std_set.i0000644000175000017500000000141613527063513016134 0ustar williamwilliam/* * * C++ type : STL set * Scilab type : matrix (for primitive types) or list (for pointer types) * */ %fragment("StdSetTraits", "header", fragment="StdSequenceTraits") %{ namespace swig { template struct traits_asptr > { static int asptr(const SwigSciObject &obj, std::set **set) { return traits_asptr_stdseq >::asptr(obj, set); } }; template struct traits_from > { static SwigSciObject from(const std::set& set) { return traits_from_stdseq >::from(set); } }; } %} #define %swig_set_methods(Type...) %swig_sequence_methods(Type) #define %swig_set_methods_val(Type...) %swig_sequence_methods_val(Type); %include swig-4.0.1/Lib/scilab/scimacros.swg0000644000175000017500000000041213527063513017015 0ustar williamwilliam #define %scilabconst(flag) %feature("scilab:const","flag") // Create Scilab variable #define SWIG_CreateScilabVariable_frag(Type...) %fragment_name(CreateScilabVariable, Type) #define SWIG_CreateScilabVariable_dec(Type...) %symbol_name(CreateScilabVariable, Type) swig-4.0.1/Lib/scilab/std_container.i0000644000175000017500000000007413527063513017322 0ustar williamwilliam%include %include swig-4.0.1/Lib/scilab/sciiterators.swg0000644000175000017500000002211513527063513017551 0ustar williamwilliam/* ----------------------------------------------------------------------------- * sciiterators.swg * * Users can derive form the SciSwigIterator to implement their * own iterators. As an example (real one since we use it for STL/STD * containers), the template SwigSciIterator_T does the * implementation for generic C++ iterators. * ----------------------------------------------------------------------------- */ %include %fragment("SciSwigIterator","header",fragment="") { namespace swig { struct stop_iteration { }; struct SciSwigIterator { private: SwigSciObject _seq; protected: SciSwigIterator(SwigSciObject seq) : _seq(seq) { } public: virtual ~SciSwigIterator() {} virtual SwigSciObject value() const = 0; virtual SciSwigIterator *incr(size_t n = 1) = 0; virtual SciSwigIterator *decr(size_t n = 1) { throw stop_iteration(); } virtual ptrdiff_t distance(const SciSwigIterator &x) const { throw std::invalid_argument("operation not supported"); } virtual bool equal (const SciSwigIterator &x) const { throw std::invalid_argument("operation not supported"); } virtual SciSwigIterator *copy() const = 0; SwigSciObject next() { SwigSciObject obj = value(); incr(); return obj; } SwigSciObject previous() { decr(); return value(); } SciSwigIterator *advance(ptrdiff_t n) { return (n > 0) ? incr(n) : decr(-n); } bool operator == (const SciSwigIterator& x) const { return equal(x); } bool operator != (const SciSwigIterator& x) const { return ! operator==(x); } SciSwigIterator* operator ++ () { incr(); return this; } SciSwigIterator* operator -- () { decr(); return this; } SciSwigIterator* operator + (ptrdiff_t n) const { return copy()->advance(n); } SciSwigIterator* operator - (ptrdiff_t n) const { return copy()->advance(-n); } ptrdiff_t operator - (const SciSwigIterator& x) const { return x.distance(*this); } static swig_type_info* descriptor() { static int init = 0; static swig_type_info* desc = 0; if (!init) { desc = SWIG_TypeQuery("swig::SciSwigIterator *"); init = 1; } return desc; } }; } } %fragment("SwigSciIterator_T","header",fragment="",fragment="SciSwigIterator",fragment="StdTraits",fragment="StdIteratorTraits") { namespace swig { template class SwigSciIterator_T : public SciSwigIterator { public: typedef OutIterator out_iterator; typedef typename std::iterator_traits::value_type value_type; typedef SwigSciIterator_T self_type; SwigSciIterator_T(out_iterator curr, SwigSciObject seq) : SciSwigIterator(seq), current(curr) { } const out_iterator& get_current() const { return current; } bool equal (const SciSwigIterator &iter) const { const self_type *iters = dynamic_cast(&iter); if (iters) { return (current == iters->get_current()); } else { throw std::invalid_argument("bad iterator type"); } } ptrdiff_t distance(const SciSwigIterator &iter) const { const self_type *iters = dynamic_cast(&iter); if (iters) { return std::distance(current, iters->get_current()); } else { throw std::invalid_argument("bad iterator type"); } } protected: out_iterator current; }; template struct from_oper { typedef const ValueType& argument_type; typedef SwigSciObject result_type; result_type operator()(argument_type v) const { return swig::from(v); } }; template::value_type, typename FromOper = from_oper > class SciSwigIteratorOpen_T : public SwigSciIterator_T { public: FromOper from; typedef OutIterator out_iterator; typedef ValueType value_type; typedef SwigSciIterator_T base; typedef SciSwigIteratorOpen_T self_type; SciSwigIteratorOpen_T(out_iterator curr, SwigSciObject seq) : SwigSciIterator_T(curr, seq) { } SwigSciObject value() const { return from(static_cast(*(base::current))); } SciSwigIterator *copy() const { return new self_type(*this); } SciSwigIterator *incr(size_t n = 1) { while (n--) { ++base::current; } return this; } SciSwigIterator *decr(size_t n = 1) { while (n--) { --base::current; } return this; } }; template::value_type, typename FromOper = from_oper > class SciSwigIteratorClosed_T : public SwigSciIterator_T { public: FromOper from; typedef OutIterator out_iterator; typedef ValueType value_type; typedef SwigSciIterator_T base; typedef SciSwigIteratorClosed_T self_type; SciSwigIteratorClosed_T(out_iterator curr, out_iterator first, out_iterator last, SwigSciObject seq) : SwigSciIterator_T(curr, seq), begin(first), end(last) { } SwigSciObject value() const { if (base::current == end) { throw stop_iteration(); } else { return from(static_cast(*(base::current))); } } SciSwigIterator *copy() const { return new self_type(*this); } SciSwigIterator *incr(size_t n = 1) { while (n--) { if (base::current == end) { throw stop_iteration(); } else { ++base::current; } } return this; } SciSwigIterator *decr(size_t n = 1) { while (n--) { if (base::current == begin) { throw stop_iteration(); } else { --base::current; } } return this; } private: out_iterator begin; out_iterator end; }; template inline SciSwigIterator* make_output_iterator(const OutIter& current, const OutIter& begin,const OutIter& end, SwigSciObject seq = SwigSciObject()) { return new SciSwigIteratorClosed_T(current, begin, end, seq); } template inline SciSwigIterator* make_output_iterator(const OutIter& current, SwigSciObject seq = SwigSciObject()) { return new SciSwigIteratorOpen_T(current, seq); } } } %fragment("SciSwigIterator"); namespace swig { // Throw a StopIteration exception %ignore stop_iteration; struct stop_iteration {}; %typemap(throws, noblock=1) stop_iteration { SWIG_Scilab_Raise(0, "stop_iteration", NULL); return SWIG_ERROR; } // Mark methods that return new objects %newobject SciSwigIterator::copy; %newobject SciSwigIterator::operator + (ptrdiff_t n) const; %newobject SciSwigIterator::operator - (ptrdiff_t n) const; %nodirector SciSwigIterator; %catches(swig::stop_iteration) SciSwigIterator::value() const; %catches(swig::stop_iteration) SciSwigIterator::incr(size_t n = 1); %catches(swig::stop_iteration) SciSwigIterator::decr(size_t n = 1); %catches(std::invalid_argument) SciSwigIterator::distance(const SciSwigIterator &x) const; %catches(std::invalid_argument) SciSwigIterator::equal (const SciSwigIterator &x) const; %catches(swig::stop_iteration) SciSwigIterator::next(); %catches(swig::stop_iteration) SciSwigIterator::previous(); %catches(swig::stop_iteration) SciSwigIterator::advance(ptrdiff_t n); %catches(swig::stop_iteration) SciSwigIterator::operator += (ptrdiff_t n); %catches(swig::stop_iteration) SciSwigIterator::operator -= (ptrdiff_t n); %catches(swig::stop_iteration) SciSwigIterator::operator + (ptrdiff_t n) const; %catches(swig::stop_iteration) SciSwigIterator::operator - (ptrdiff_t n) const; %ignore SciSwigIterator::operator==; %ignore SciSwigIterator::operator!=; %ignore SciSwigIterator::operator++; %ignore SciSwigIterator::operator--; %ignore SciSwigIterator::operator+; %ignore SciSwigIterator::operator-; struct SciSwigIterator { protected: SciSwigIterator(SwigSciObject seq); public: virtual ~SciSwigIterator(); virtual SwigSciObject value() const = 0; virtual SciSwigIterator *incr(size_t n = 1) = 0; virtual SciSwigIterator *decr(size_t n = 1); virtual ptrdiff_t distance(const SciSwigIterator &x) const; virtual bool equal (const SciSwigIterator &x) const; virtual SciSwigIterator *copy() const = 0; SwigSciObject next(); SwigSciObject previous(); SciSwigIterator *advance(ptrdiff_t n); bool operator == (const SciSwigIterator& x) const; bool operator != (const SciSwigIterator& x) const; SciSwigIterator* operator ++ (); SciSwigIterator* operator -- (); SciSwigIterator* operator + (ptrdiff_t n) const; SciSwigIterator* operator - (ptrdiff_t n) const; ptrdiff_t operator - (const SciSwigIterator& x) const; }; } swig-4.0.1/Lib/scilab/scisequencefloat.swg0000644000175000017500000000534013527063513020374 0ustar williamwilliam/* * * Scilab matrix of float <-> C++ float container * */ %include %fragment(SWIG_AsCheck_Sequence_frag(float), "header") { SWIGINTERN int SWIG_AsCheck_Sequence_dec(float)(SwigSciObject obj) { SciErr sciErr; int *piAddrVar; sciErr = getVarAddressFromPosition(pvApiCtx, obj, &piAddrVar); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (isDoubleType(pvApiCtx, piAddrVar)) { return SWIG_OK; } else { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong type for input argument #%d: A double is expected.\n"), SWIG_Scilab_GetFuncName(), obj); return SWIG_ERROR; } } } %fragment(SWIG_AsGet_Sequence_frag(float), "header", fragment="SWIG_SciDouble_AsFloatArrayAndSize") { SWIGINTERN int SWIG_AsGet_Sequence_dec(float)(SwigSciObject obj, float **pSequence) { int iMatrixRowCount; int iMatrixColCount; return (SWIG_SciDouble_AsFloatArrayAndSize(pvApiCtx, obj, &iMatrixRowCount, &iMatrixColCount, pSequence, SWIG_Scilab_GetFuncName())); } } %fragment(SWIG_AsSize_Sequence_frag(float), "header", fragment="SWIG_SciDouble_AsFloatArrayAndSize") { SWIGINTERN int SWIG_AsSize_Sequence_dec(float)(SwigSciObject obj, int *piSize) { float *pdblMatrix; int iMatrixRowCount; int iMatrixColCount; if (SWIG_SciDouble_AsFloatArrayAndSize(pvApiCtx, obj, &iMatrixRowCount, &iMatrixColCount, &pdblMatrix, SWIG_Scilab_GetFuncName()) == SWIG_OK) { if ((iMatrixRowCount > 1) && (iMatrixColCount > 1)) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong size for input argument #%d: A float vector is expected.\n"), SWIG_Scilab_GetFuncName(), obj); return SWIG_ERROR; } *piSize = iMatrixRowCount * iMatrixColCount; return SWIG_OK; } return SWIG_ERROR; } } %fragment(SWIG_FromCreate_Sequence_frag(float), "header") { SWIGINTERN int SWIG_FromCreate_Sequence_dec(float)(int size, float **pSequence) { *pSequence = new float[size]; return *pSequence != NULL ? SWIG_OK : SWIG_ERROR; } } %fragment(SWIG_FromSet_Sequence_frag(float), "header", fragment="SWIG_SciDouble_FromFloatArrayAndSize") { SWIGINTERN SwigSciObject SWIG_FromSet_Sequence_dec(float)(int size, float *pSequence) { SwigSciObject obj = SWIG_SciDouble_FromFloatArrayAndSize(pvApiCtx, SWIG_Scilab_GetOutputPosition(), 1, size, pSequence); delete (float *)pSequence; return obj; } } %fragment(SWIG_AsVal_SequenceItem_frag(float), "header") { SWIGINTERN float SWIG_AsVal_SequenceItem_dec(float)(SwigSciObject obj, float *pSequence, int iItemIndex) { return pSequence[iItemIndex]; } } %fragment(SWIG_From_SequenceItem_frag(float), "header") { SWIGINTERN int SWIG_From_SequenceItem_dec(float)(float *pSequence, int iItemIndex, float itemValue) { pSequence[iItemIndex] = itemValue; return SWIG_OK; } } swig-4.0.1/Lib/scilab/sciprimtypes.swg0000644000175000017500000000062613527063513017574 0ustar williamwilliam%include %include %include %include %include %include %include %include %include %include %include %include %include %include %include swig-4.0.1/Lib/scilab/cmalloc.i0000644000175000017500000000004013527063513016071 0ustar williamwilliam%include swig-4.0.1/Lib/scilab/std_basic_string.i0000644000175000017500000000224513527063513020011 0ustar williamwilliam/* * C++: basic_string * Scilab: string */ #define %swig_basic_string(Type...) %swig_sequence_methods_val(Type) %fragment(SWIG_AsPtr_frag(std::basic_string), "header", fragment="SWIG_SciString_AsCharPtrAndLength") { SWIGINTERN int SWIG_AsPtr_dec(std::basic_string)(int _iVar, std::basic_string **_pstValue) { char* buf = 0; size_t len = 0; int alloc = SWIG_OLDOBJ; if (SWIG_IsOK((SWIG_SciString_AsCharPtrAndSize(pvApiCtx, _iVar, &buf, &len, &alloc, SWIG_Scilab_GetFuncName())))) { if (buf) { if (_pstValue) { *_pstValue = new std::string(buf, len - 1); } if (alloc == SWIG_NEWOBJ) { delete[] buf; } return SWIG_NEWOBJ; } else { if (_pstValue) { *_pstValue = NULL; } return SWIG_OLDOBJ; } } else { return SWIG_ERROR; } } } %fragment(SWIG_From_frag(std::basic_string), "header", fragment="SWIG_SciString_FromCharPtr") { SWIGINTERN int SWIG_From_dec(std::basic_string)(std::basic_string _pstValue) { return SWIG_SciString_FromCharPtr(pvApiCtx, SWIG_Scilab_GetOutputPosition(), _pstValue.c_str()); } } %include swig-4.0.1/Lib/scilab/scisequencebool.swg0000644000175000017500000000527713527063513020233 0ustar williamwilliam/* * * Scilab matrix of bool <-> C++ bool container * */ %include %fragment(SWIG_AsCheck_Sequence_frag(bool), "header") { SWIGINTERN int SWIG_AsCheck_Sequence_dec(bool)(SwigSciObject obj) { SciErr sciErr; int *piAddrVar; sciErr = getVarAddressFromPosition(pvApiCtx, obj, &piAddrVar); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (isBooleanType(pvApiCtx, piAddrVar)) { return SWIG_OK; } else { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong type for input argument #%d: A boolean is expected.\n"), SWIG_Scilab_GetFuncName(), obj); return SWIG_ERROR; } } } %fragment(SWIG_AsGet_Sequence_frag(bool), "header", fragment="SWIG_SciBoolean_AsIntArrayAndSize") { SWIGINTERN int SWIG_AsGet_Sequence_dec(bool)(SwigSciObject obj, int **pSequence) { int iMatrixRowCount; int iMatrixColCount; return (SWIG_SciBoolean_AsIntArrayAndSize(pvApiCtx, obj, &iMatrixRowCount, &iMatrixColCount, pSequence, SWIG_Scilab_GetFuncName())); } } %fragment(SWIG_AsSize_Sequence_frag(bool), "header", fragment="SWIG_SciBoolean_AsIntArrayAndSize") { SWIGINTERN int SWIG_AsSize_Sequence_dec(bool)(SwigSciObject obj, int *piSize) { int *piMatrix; int iMatrixRowCount; int iMatrixColCount; if (SWIG_SciBoolean_AsIntArrayAndSize(pvApiCtx, obj, &iMatrixRowCount, &iMatrixColCount, &piMatrix, SWIG_Scilab_GetFuncName()) == SWIG_OK) { if ((iMatrixRowCount > 1) && (iMatrixColCount > 1)) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong size for input argument #%d: An integer vector is expected.\n"), SWIG_Scilab_GetFuncName(), obj); return SWIG_ERROR; } *piSize = iMatrixRowCount * iMatrixColCount; return SWIG_OK; } return SWIG_ERROR; } } %fragment(SWIG_FromCreate_Sequence_frag(bool), "header") { SWIGINTERN int SWIG_FromCreate_Sequence_dec(bool)(int size, int **pSequence) { *pSequence = new int[size]; return *pSequence != NULL ? SWIG_OK : SWIG_ERROR; } } %fragment(SWIG_FromSet_Sequence_frag(bool), "header", fragment="SWIG_SciBoolean_FromIntArrayAndSize") { SWIGINTERN SwigSciObject SWIG_FromSet_Sequence_dec(bool)(int size, int *pSequence) { SwigSciObject obj = SWIG_SciBoolean_FromIntArrayAndSize(pvApiCtx, SWIG_Scilab_GetOutputPosition(), 1, size, pSequence); delete (int *)pSequence; return obj; } } %fragment(SWIG_AsVal_SequenceItem_frag(bool), "header") { SWIGINTERN bool SWIG_AsVal_SequenceItem_dec(bool)(SwigSciObject obj, int *pSequence, int iItemIndex) { return (bool) pSequence[iItemIndex]; } } %fragment(SWIG_From_SequenceItem_frag(bool), "header") { SWIGINTERN int SWIG_From_SequenceItem_dec(bool)(int *pSequence, int iItemIndex, bool itemValue) { pSequence[iItemIndex] = itemValue; return SWIG_OK; } } swig-4.0.1/Lib/scilab/std_common.i0000644000175000017500000000443413527063513016634 0ustar williamwilliam%include %include // Generate the traits for a 'primitive' type, such as 'double', // for which the SWIG_AsVal and SWIG_From methods are already defined. %define %traits_ptypen(Type...) %fragment(SWIG_Traits_frag(Type),"header", fragment=SWIG_AsVal_frag(Type), fragment=SWIG_From_frag(Type), fragment="StdTraits") { namespace swig { template <> struct traits< Type > { typedef value_category category; static const char* type_name() { return #Type; } }; template <> struct traits_asval< Type > { typedef Type value_type; static int asval(SwigSciObject obj, value_type *val) { return SWIG_AsVal(Type)(obj, val); } }; template <> struct traits_from< Type > { typedef Type value_type; static SwigSciObject from(const value_type& val) { return SWIG_From(Type)(val); } }; } } %enddef /* Traits for enums. This is bit of a sneaky trick needed because a generic template specialization of enums is not possible (unless using template meta-programming which SWIG doesn't support because of the explicit instantiations required using %template). The STL containers define the 'front' method and the typemap below is used whenever the front method is wrapped returning an enum. This typemap simply picks up the standard enum typemap, but additionally drags in a fragment containing the traits_asval and traits_from required in the generated code for enums. */ %define %traits_enum(Type...) %fragment("SWIG_Traits_enum_"{Type},"header", fragment=SWIG_AsVal_frag(int), fragment=SWIG_From_frag(int), fragment="StdTraits") { namespace swig { template <> struct traits_asval< Type > { typedef Type value_type; static int asval(SwigSciObject obj, value_type *val) { return SWIG_AsVal(int)(obj, (int *)val); } }; template <> struct traits_from< Type > { typedef Type value_type; static SwigSciObject from(const value_type& val) { return SWIG_From(int)((int)val); } }; } } %typemap(out, fragment="SWIG_Traits_enum_"{Type}) const enum SWIGTYPE& front %{$typemap(out, const enum SWIGTYPE&)%} %enddef %include // // Generates the traits for all the known primitive // C++ types (int, double, ...) // %apply_cpptypes(%traits_ptypen); swig-4.0.1/Lib/scilab/std_except.i0000644000175000017500000000004313527063513016624 0ustar williamwilliam%include swig-4.0.1/Lib/scilab/sciunsignedlong.swg0000644000175000017500000000357513527063513020242 0ustar williamwilliam/* * C-type: unsigned long * Scilab type: see unsigned int */ %fragment(SWIG_AsVal_frag(unsigned long), "header", fragment="SWIG_UnsignedInt_AsUnsignedLong") { #define SWIG_AsVal_unsigned_SS_long(scilabValue, valuePointer) SWIG_UnsignedInt_AsUnsignedLong(pvApiCtx, scilabValue, valuePointer, SWIG_Scilab_GetFuncName()) } %fragment("SWIG_UnsignedInt_AsUnsignedLong", "header", fragment=SWIG_AsVal_frag(unsigned int)) { SWIGINTERN int SWIG_UnsignedInt_AsUnsignedLong(void *pvApiCtx, SwigSciObject iVar, unsigned long *pulValue, char *fname) { unsigned int uiValue = 0; if(SWIG_AsVal_unsigned_SS_int(iVar, &uiValue) != SWIG_OK) { return SWIG_ERROR; } *pulValue = (unsigned long) uiValue; return SWIG_OK; } } %fragment(SWIG_From_frag(unsigned long), "header", fragment="SWIG_UnsignedInt_FromUnsignedLong") { #define SWIG_From_unsigned_SS_long(scilabValue) SWIG_UnsignedInt_FromUnsignedLong(pvApiCtx, SWIG_Scilab_GetOutputPosition(), scilabValue, SWIG_Scilab_GetFuncName()) } %fragment("SWIG_UnsignedInt_FromUnsignedLong", "header", fragment=SWIG_From_frag(unsigned int)) { SWIGINTERN int SWIG_UnsignedInt_FromUnsignedLong(void *pvApiCtx, int iVarOut, unsigned long ulValue, char *fname) { return SWIG_From_unsigned_SS_int((unsigned int)ulValue); } } %fragment("SWIG_SciDouble_FromUnsignedLongArrayAndSize", "header") { SWIGINTERN int SWIG_SciDouble_FromUnsignedLongArrayAndSize(void *pvApiCtx, int iVarOut, int iRows, int iCols, const unsigned long *pulValues) { SciErr sciErr; double *pdValues = NULL; int i; pdValues = (double*) malloc(iRows * iCols * sizeof(double)); for (i=0; i %include %include %include %include swig-4.0.1/Lib/scilab/typemaps.i0000644000175000017500000000315313527063513016331 0ustar williamwilliam/* ----------------------------------------------------------------------------- * typemaps.i * * ----------------------------------------------------------------------------- */ // INPUT typemaps %define %scilab_input_typemap(Type) %typemap(in, noblock=1, fragment=SWIG_AsVal_frag(Type)) Type *INPUT(Type temp)(int ecode), Type &INPUT(Type temp)(int ecode) { ecode = SWIG_AsVal_dec(Type)($input, &temp); if (!SWIG_IsOK(ecode)) { %argument_fail(ecode, "$type", $symname, $argnum); } $1 = &temp; } %typemap(freearg, noblock=1) Type *INPUT, Type &INPUT { } %typemap(typecheck) Type *INPUT, Type &INPUT { } %enddef // OUTPUT typemaps %define %scilab_output_typemap(Type) %typemap(argout, noblock=1, fragment=SWIG_From_frag(Type)) Type *OUTPUT, Type &OUTPUT { %set_output(SWIG_From_dec(Type)(*$1)); } %enddef // INOUT typemaps %define %scilab_inout_typemap(Type) %typemap(in) Type *INOUT = Type *INPUT; %typemap(in) Type &INOUT = Type &INPUT; %typemap(argout) Type *INOUT = Type *OUTPUT; %typemap(argout) Type &INOUT = Type &OUTPUT; %enddef %define %scilab_inout_typemaps(Type) %scilab_input_typemap(%arg(Type)) %scilab_output_typemap(%arg(Type)) %scilab_inout_typemap(%arg(Type)) %enddef %scilab_inout_typemaps(double); %scilab_inout_typemaps(signed char); %scilab_inout_typemaps(unsigned char); %scilab_inout_typemaps(short); %scilab_inout_typemaps(unsigned short); %scilab_inout_typemaps(int); %scilab_inout_typemaps(unsigned int); %scilab_inout_typemaps(long); %scilab_inout_typemaps(unsigned long); %scilab_inout_typemaps(bool); %scilab_inout_typemaps(float); //%apply_ctypes(%scilab_inout_typemaps); swig-4.0.1/Lib/scilab/scisequencestring.swg0000644000175000017500000000516113527063513020576 0ustar williamwilliam/* * * Scilab matrix of string <-> C++ std::string container * */ %include %fragment(SWIG_AsCheck_Sequence_frag(std::string), "header") { SWIGINTERN int SWIG_AsCheck_Sequence_dec(std::string)(SwigSciObject obj) { SciErr sciErr; int *piAddrVar; sciErr = getVarAddressFromPosition(pvApiCtx, obj, &piAddrVar); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (isStringType(pvApiCtx, piAddrVar)) { return SWIG_OK; } else { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong type for input argument #%d: A string is expected.\n"), SWIG_Scilab_GetFuncName(), obj); return SWIG_ERROR; } } } %fragment(SWIG_AsGet_Sequence_frag(std::string), "header", fragment="SWIG_SciString_AsCharPtrArrayAndSize") { SWIGINTERN int SWIG_AsGet_Sequence_dec(std::string)(SwigSciObject obj, char ***pSequence) { int iRows = 0; int iCols = 0; return (SWIG_SciString_AsCharPtrArrayAndSize(pvApiCtx, obj, &iRows, &iCols, pSequence, SWIG_Scilab_GetFuncName())); } } %fragment(SWIG_AsSize_Sequence_frag(std::string), "header", fragment="SWIG_SciString_AsCharPtrArrayAndSize") { SWIGINTERN int SWIG_AsSize_Sequence_dec(std::string)(SwigSciObject obj, int *piSize) { char **pstMatrix; int iCols = 0; int iRows = 0; if (SWIG_SciString_AsCharPtrArrayAndSize(pvApiCtx, obj, &iRows, &iCols, &pstMatrix, SWIG_Scilab_GetFuncName()) == SWIG_OK) { *piSize = iRows * iCols; return SWIG_OK; } return SWIG_ERROR; } } %fragment(SWIG_FromCreate_Sequence_frag(std::string), "header") { SWIGINTERN int SWIG_FromCreate_Sequence_dec(std::string)(int size, char ***pSequence) { *pSequence = new char*[size]; return *pSequence != NULL ? SWIG_OK : SWIG_ERROR; } } %fragment(SWIG_FromSet_Sequence_frag(std::string), "header", fragment="SWIG_SciString_FromCharPtrArrayAndSize") { SWIGINTERN SwigSciObject SWIG_FromSet_Sequence_dec(std::string)(int size, char **pSequence) { SwigSciObject obj = SWIG_SciString_FromCharPtrArrayAndSize(pvApiCtx, SWIG_Scilab_GetOutputPosition(), 1, size, pSequence); delete (char **)pSequence; return obj; } } %fragment(SWIG_AsVal_SequenceItem_frag(std::string), "header") { SWIGINTERN std::string SWIG_AsVal_SequenceItem_dec(std::string)(SwigSciObject obj, char **pSequence, int iItemIndex) { return std::string(pSequence[iItemIndex]); } } %fragment(SWIG_From_SequenceItem_frag(std::string), "header") { SWIGINTERN int SWIG_From_SequenceItem_dec(std::string)(char **pSequence, int iItemIndex, std::string itemValue) { char *pChar = new char((int) itemValue.size() + 1); strcpy(pChar, itemValue.c_str()); pSequence[iItemIndex] = pChar; return SWIG_OK; } } swig-4.0.1/Lib/scilab/scilist.swg0000644000175000017500000000344213527063513016512 0ustar williamwilliam/* * Scilab list related functions * */ %fragment("SWIG_ScilabList", "header") { SWIGINTERN int SWIG_GetScilabList(SwigSciObject obj, int **piListAddr) { SciErr sciErr; sciErr = getVarAddressFromPosition(pvApiCtx, obj, piListAddr); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } return SWIG_OK; } SWIGINTERN int SWIG_GetScilabListSize(SwigSciObject obj, int *piListSize) { SciErr sciErr; int *piListAddr; sciErr = getVarAddressFromPosition(pvApiCtx, obj, &piListAddr); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } sciErr = getListItemNumber(pvApiCtx, piListAddr, piListSize); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } return SWIG_OK; } SWIGINTERN int SWIG_GetScilabListAndSize(SwigSciObject obj, int **piListAddr, int *piListSize) { SciErr sciErr; sciErr = getVarAddressFromPosition(pvApiCtx, obj, piListAddr); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } sciErr = getListItemNumber(pvApiCtx, *piListAddr, piListSize); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } return SWIG_OK; } SWIGINTERN int SWIG_CheckScilabList(SwigSciObject obj) { SciErr sciErr; int *piListAddr; int iType; sciErr = getVarAddressFromPosition(pvApiCtx, obj, &piListAddr); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } sciErr = getVarType(pvApiCtx, piListAddr, &iType); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if ((iType != sci_list) && (iType != sci_tlist) && (iType != sci_mlist)) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong type for input argument #%d: A list is expected.\n"), SWIG_Scilab_GetFuncName(), obj); return SWIG_ERROR; } return SWIG_OK; } } swig-4.0.1/Lib/scilab/sciunsignedint.swg0000644000175000017500000001473413527063513020074 0ustar williamwilliam/* * C-type: unsigned int * Scilab type: double or uint32 */ %fragment(SWIG_AsVal_frag(unsigned int), "header", fragment="SWIG_SciDoubleOrUint32_AsUnsignedInt", fragment="") { %#define SWIG_AsVal_unsigned_SS_int(scilabValue, valuePointer) SWIG_SciDoubleOrUint32_AsUnsignedInt(pvApiCtx, scilabValue, valuePointer, SWIG_Scilab_GetFuncName()) } %fragment("SWIG_SciDoubleOrUint32_AsUnsignedInt", "header") { SWIGINTERN int SWIG_SciDoubleOrUint32_AsUnsignedInt(void *pvApiCtx, int iVar, unsigned int *puiValue, char *fname) { SciErr sciErr; int iType = 0; int iRows = 0; int iCols = 0; int iPrec = 0; int *piAddrVar = NULL; unsigned int *puiData = NULL; sciErr = getVarAddressFromPosition(pvApiCtx, iVar, &piAddrVar); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } sciErr = getVarType(pvApiCtx, piAddrVar, &iType); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (iType == sci_ints) { if (puiValue) { sciErr = getMatrixOfIntegerPrecision(pvApiCtx, piAddrVar, &iPrec); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (iPrec != SCI_UINT32) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong type for input argument #%d: A 32-bit unsigned integer or a double expected.\n"), fname, iVar); return SWIG_ERROR; } sciErr = getMatrixOfUnsignedInteger32(pvApiCtx, piAddrVar, &iRows, &iCols, &puiData); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (iRows * iCols != 1) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong size for input argument #%d: A 32-bit unsigned integer or a double expected.\n"), fname, iVar); return SWIG_ERROR; } *puiValue = *puiData; } } else if (iType == sci_matrix) { if (puiValue) { double *pdData = NULL; double dValue = 0.0f; sciErr = getMatrixOfDouble(pvApiCtx, piAddrVar, &iRows, &iCols, &pdData); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (iRows * iCols != 1) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong size for input argument #%d: A 32-bit unsigned integer or a double expected.\n"), fname, iVar); return SWIG_TypeError; } dValue = *pdData; if (dValue != floor(dValue)) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Incorrect value for input argument #%d: The double value cannot be converted to a 32-bit unsigned integer.\n"), fname, iVar); return SWIG_ValueError; } if ((dValue < 0) || (dValue > UINT_MAX)) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Overflow error for input argument #%d: The double value cannot be converted to a 32-bit unsigned integer.\n"), fname, iVar); return SWIG_OverflowError; } *puiValue = (unsigned int) dValue; } } else { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong type for input argument #%d: A 32-bit unsigned integer or a double expected.\n"), fname, iVar); return SWIG_ERROR; } return SWIG_OK; } } %fragment(SWIG_From_frag(unsigned int), "header", fragment="SWIG_SciDouble_FromUnsignedInt") { %#define SWIG_From_unsigned_SS_int(scilabValue) SWIG_SciDouble_FromUnsignedInt(pvApiCtx, SWIG_Scilab_GetOutputPosition(), scilabValue, SWIG_Scilab_GetFuncName()) } %fragment("SWIG_SciDouble_FromUnsignedInt", "header") { SWIGINTERN int SWIG_SciDouble_FromUnsignedInt(void *pvApiCtx, int iVarOut, unsigned int uiValue, char *fname) { if (createScalarDouble(pvApiCtx, SWIG_NbInputArgument(pvApiCtx) + iVarOut, (double) uiValue)) return SWIG_ERROR; return SWIG_OK; } } /* * C-type: unsigned int[] * Scilab type: uint32 vector */ %fragment("SWIG_SciDoubleOrUint32_AsUnsignedIntArrayAndSize", "header") { SWIGINTERN int SWIG_SciDoubleOrUint32_AsUnsignedIntArrayAndSize(void *pvApiCtx, int iVar, int *iRows, int *iCols, unsigned int **puiValue, char *fname) { SciErr sciErr; int iType = 0; int iPrec = 0; int *piAddrVar = NULL; sciErr = getVarAddressFromPosition(pvApiCtx, iVar, &piAddrVar); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } sciErr = getVarType(pvApiCtx, piAddrVar, &iType); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (iType == sci_matrix) { double *pdData = NULL; int size = 0; int i; sciErr = getMatrixOfDouble(pvApiCtx, piAddrVar, iRows, iCols, &pdData); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } size = (*iRows) * (*iCols); *puiValue = (unsigned int*) malloc(size * sizeof(int*)); for (i = 0; i < size; i++) (*puiValue)[i] = (unsigned int) pdData[i]; } else if (iType == sci_ints) { sciErr = getMatrixOfIntegerPrecision(pvApiCtx, piAddrVar, &iPrec); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (iPrec != SCI_UINT32) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong type for input argument #%d: A 32-bit unsigned integer or a double vector expected.\n"), fname, iVar); return SWIG_ERROR; } sciErr = getMatrixOfUnsignedInteger32(pvApiCtx, piAddrVar, iRows, iCols, puiValue); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } } else { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong type for input argument #%d: A 32-bit unsigned integer or a double vector expected.\n"), fname, iVar); return SWIG_ERROR; } return SWIG_OK; } } %fragment("SWIG_SciDouble_FromUnsignedIntArrayAndSize", "header") { SWIGINTERN int SWIG_SciDouble_FromUnsignedIntArrayAndSize(void *pvApiCtx, int iVarOut, int iRows, int iCols, unsigned int *puiValues) { SciErr sciErr; double *pdValues = NULL; int i; pdValues = (double*) malloc(iRows * iCols * sizeof(double)); for (i=0; i UCHAR_MAX)) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Overflow error for input argument #%d: The double value cannot be converted to a 8-bit unsigned integer.\n"), fname, iVar); return SWIG_OverflowError; } *pucValue = (unsigned char) dValue; } } else { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong type for input argument #%d: A 8-bit unsigned integer or a double expected.\n"), fname, iVar); return SWIG_ERROR; } return SWIG_OK; } } %fragment(SWIG_From_frag(unsigned char), "header", fragment="SWIG_SciDouble_FromUnsignedChar") { #define SWIG_From_unsigned_SS_char(value) SWIG_SciDouble_FromUnsignedChar(pvApiCtx, SWIG_Scilab_GetOutputPosition(), value) } %fragment("SWIG_SciDouble_FromUnsignedChar", "header") { SWIGINTERN int SWIG_SciDouble_FromUnsignedChar(void *pvApiCtx, int iVarOut, unsigned char ucValue) { if (createScalarDouble(pvApiCtx, SWIG_NbInputArgument(pvApiCtx) + iVarOut, (double) ucValue)) return SWIG_ERROR; return SWIG_OK; } } /* * C-type: unsigned char[] * Scilab type: double or uint8 matrix */ %fragment("SWIG_SciDoubleOrUint8_AsUnsignedCharArrayAndSize", "header") { SWIGINTERN int SWIG_SciDoubleOrUint8_AsUnsignedCharArrayAndSize(void *pvApiCtx, int iVar, int *iRows, int *iCols, unsigned char **pucValue, char *fname) { SciErr sciErr; int iType = 0; int iPrec = 0; int *piAddrVar = NULL; sciErr = getVarAddressFromPosition(pvApiCtx, iVar, &piAddrVar); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } sciErr = getVarType(pvApiCtx, piAddrVar, &iType); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (iType == sci_matrix) { double *pdData = NULL; int size = 0; int i; sciErr = getMatrixOfDouble(pvApiCtx, piAddrVar, iRows, iCols, &pdData); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } size = (*iRows) * (*iCols); *pucValue = (unsigned char*) malloc(size * sizeof(int*)); for (i = 0; i < size; i++) (*pucValue)[i] = (unsigned char) pdData[i]; } else if (iType == sci_ints) { sciErr = getMatrixOfIntegerPrecision(pvApiCtx, piAddrVar, &iPrec); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (iPrec != SCI_UINT8) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong type for input argument #%d: A 8-bit unsigned integer or a double vector expected.\n"), fname, iVar); return SWIG_ERROR; } sciErr = getMatrixOfUnsignedInteger8(pvApiCtx, piAddrVar, iRows, iCols, pucValue); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } } else { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong type for input argument #%d: A 8-bit unsigned integer or a double vector expected.\n"), fname, iVar); return SWIG_ERROR; } return SWIG_OK; } } %fragment("SWIG_SciDouble_FromUnsignedCharArrayAndSize", "header") { SWIGINTERN int SWIG_SciDouble_FromUnsignedCharArrayAndSize(void *pvApiCtx, int iVarOut, int iRows, int iCols, const unsigned char *pucValues) { SciErr sciErr; double *pdValues = NULL; int i; pdValues = (double*) malloc(iRows * iCols * sizeof(double)); for (i=0; i swig-4.0.1/Lib/scilab/scilonglong.swg0000644000175000017500000000446213527063513017361 0ustar williamwilliam/* * C-type: long long * Scilab 5 type: NONE * Scilab 6 type: int64 */ %fragment(SWIG_AsVal_frag(long long), "header", fragment="SWIG_SciInt64_ToLongLong") { %#define SWIG_AsVal_long_SS_long(scilabValue, valuePointer) SWIG_SciInt64_ToLongLong(pvApiCtx, scilabValue, valuePointer, SWIG_Scilab_GetFuncName()) } %fragment("SWIG_SciInt64_ToLongLong", "header") { SWIGINTERN int SWIG_SciInt64_ToLongLong(void *pvApiCtx, int iVar, long long *pllValue, char *fname) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Scilab 5.X does not manage '%s' data type.\n"), "SWIG_SciInt64_ToLongLong", "int64"); return SWIG_ERROR; } } %fragment(SWIG_From_frag(long long), "header", fragment="SWIG_SciInt64_FromLongLong") { #define SWIG_From_long_SS_long(value) SWIG_SciInt64_FromLongLong(pvApiCtx, $result, value) } %fragment("SWIG_SciInt64_FromLongLong", "header") { SWIGINTERN int SWIG_SciInt64_FromLongLong(void *pvApiCtx, int iVarOut, long long llValue) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Scilab 5.X does not manage '%s' data type.\n"), "SWIG_SciInt64_ToLongLong", "int64"); return SWIG_ERROR; } } /* * C-type: unsigned long long * Scilab 5 type: NONE * Scilab 6 type: uint64 */ %fragment(SWIG_AsVal_frag(unsigned long long), "header", fragment="SWIG_SciUint64_ToUnsignedLongLong") { #define SWIG_AsVal_unsigned_SS_long_SS_long(scilabValue, valuePointer) SWIG_SciUint64_ToUnsignedLongLong(pvApiCtx, scilabValue, valuePointer, SWIG_Scilab_GetFuncName()) } %fragment("SWIG_SciUint64_ToUnsignedLongLong", "header") { SWIGINTERN int SWIG_SciUint64_ToUnsignedLongLong(void *pvApiCtx, int iVar, unsigned long long *pullValue, char *fname) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Scilab 5.X does not manage '%s' data type.\n"), "SWIG_SciUint64_ToLongLong", "uint64"); return SWIG_ERROR; } } %fragment(SWIG_From_frag(unsigned long long), "header", fragment="SWIG_SciUint64_FromUnsignedLongLong") { #define SWIG_From_unsigned_SS_long_SS_long(value) SWIG_SciUint64_FromUnsignedLongLong(pvApiCtx, $result, value) } %fragment("SWIG_SciUint64_FromUnsignedLongLong", "header") { SWIGINTERN int SWIG_SciUint64_FromUnsignedLongLong(void *pvApiCtx, int iVarOut, unsigned long long llValue) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Scilab 5.X does not manage '%s' data type.\n"), "SWIG_SciUint64_ToLongLong", "uint64"); return SWIG_ERROR; } } swig-4.0.1/Lib/scilab/std_pair.i0000644000175000017500000000140013527063513016265 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_pair.i * * Typemaps for std::pair * ----------------------------------------------------------------------------- */ %include %include // ------------------------------------------------------------------------ // std::pair // ------------------------------------------------------------------------ %{ #include %} namespace std { template struct pair { typedef T first_type; typedef U second_type; pair(); pair(T first, U second); pair(const pair& other); template pair(const pair &other); T first; U second; }; // add specializations here } swig-4.0.1/Lib/scilab/scimatrixbool.swg0000644000175000017500000001055013527063513017715 0ustar williamwilliam/* * C-type: bool array * Scilab type: bool matrix */ %include // in (bool *IN, int IN_ROWCOUNT, int IN_COLCOUNT) %typemap(in, noblock=1, fragment="SWIG_SciBoolean_AsBoolArrayAndSize") (bool *IN, int IN_ROWCOUNT, int IN_COLCOUNT) { if (SWIG_SciBoolean_AsBoolArrayAndSize(pvApiCtx, $input, &$2, &$3, &$1, fname) != SWIG_OK) { return SWIG_ERROR; } } // in (int IN_ROWCOUNT, int IN_COLCOUNT, bool *IN) %typemap(in, noblock=1, fragment="SWIG_SciBoolean_AsBoolArrayAndSize") (int IN_ROWCOUNT, int IN_COLCOUNT, bool *IN) { if (SWIG_SciBoolean_AsBoolArrayAndSize(pvApiCtx, $input, &$1, &$2, &$3, fname) != SWIG_OK) { return SWIG_ERROR; } } // in (bool *IN, int IN_SIZE) %typemap(in, noblock=1, fragment="SWIG_SciBoolean_AsBoolArrayAndSize") (bool *IN, int IN_SIZE) (int rowCount, int colCount) { if (SWIG_SciBoolean_AsBoolArrayAndSize(pvApiCtx, $input, &rowCount, &colCount, &$1, fname) == SWIG_OK) { $2 = rowCount * colCount; } else { return SWIG_ERROR; } } // in (int IN_SIZE, bool *IN) %typemap(in, noblock=1) (int IN_SIZE, bool *IN) (int rowCount, int colCount) { if (SWIG_SciBoolean_AsBoolArrayAndSize(pvApiCtx, $input, &rowCount, &colCount, &$2, fname) == SWIG_OK) { $1 = rowCount * colCount; } else { return SWIG_ERROR; } } // out (bool **OUT, int *OUT_ROWCOUNT, int *OUT_COLCOUNT) %typemap(in, noblock=1, numinputs=0) (bool **OUT, int *OUT_ROWCOUNT, int *OUT_COLCOUNT) { } %typemap(arginit, noblock=1) (bool **OUT, int *OUT_ROWCOUNT, int *OUT_COLCOUNT) { $1 = (bool**) malloc(sizeof(bool*)); $2 = (int*) malloc(sizeof(int)); $3 = (int*) malloc(sizeof(int)); } %typemap(freearg, noblock=1) (bool **OUT, int *OUT_ROWCOUNT, int *OUT_COLCOUNT) { free(*$1); free($1); free($2); free($3); } %typemap(argout, noblock=1, fragment="SWIG_SciBoolean_FromBoolArrayAndSize") (bool **OUT, int *OUT_ROWCOUNT, int *OUT_COLCOUNT) { if (SWIG_SciBoolean_FromBoolArrayAndSize(pvApiCtx, SWIG_Scilab_GetOutputPosition(), *$2, *$3, *$1) == SWIG_OK) { SWIG_Scilab_SetOutput(pvApiCtx, SWIG_NbInputArgument(pvApiCtx) + SWIG_Scilab_GetOutputPosition()); } else { return SWIG_ERROR; } } // out (int *OUT_ROWCOUNT, int *OUT_COLCOUNT, bool **OUT) %typemap(in, noblock=1, numinputs=0) (int *OUT_ROWCOUNT, int *OUT_COLCOUNT, bool **OUT) { } %typemap(arginit, noblock=1) (int *OUT_ROWCOUNT, int *OUT_COLCOUNT, bool **OUT) { $1 = (int*) malloc(sizeof(int)); $2 = (int*) malloc(sizeof(int)); $3 = (bool**) malloc(sizeof(bool*)); } %typemap(argout, noblock=1, fragment="SWIG_SciBoolean_FromBoolArrayAndSize") (int *OUT_ROWCOUNT, int *OUT_COLCOUNT, bool **OUT) { if (SWIG_SciBoolean_FromBoolArrayAndSize(pvApiCtx, SWIG_Scilab_GetOutputPosition(), *$1, *$2, *$3) == SWIG_OK) { SWIG_Scilab_SetOutput(pvApiCtx, SWIG_NbInputArgument(pvApiCtx) + SWIG_Scilab_GetOutputPosition()); } else { return SWIG_ERROR; } } %typemap(freearg, noblock=1) (int *OUT_ROWCOUNT, int *OUT_COLCOUNT, bool **OUT) { free($1); free($2); free(*$3); free($3); } // out (bool **OUT, int *OUT_SIZE) %typemap(in, noblock=1, numinputs=0) (bool **OUT, int *OUT_SIZE) { } %typemap(arginit, noblock=1) (bool **OUT, int *OUT_SIZE) { $1 = (bool**) malloc(sizeof(bool*)); $2 = (int*) malloc(sizeof(int)); } %typemap(argout, noblock=1, fragment="SWIG_SciBoolean_FromBoolArrayAndSize") (bool **OUT, int *OUT_SIZE) { if (SWIG_SciBoolean_FromBoolArrayAndSize(pvApiCtx, SWIG_Scilab_GetOutputPosition(), 1, *$2, *$1) == SWIG_OK) { SWIG_Scilab_SetOutput(pvApiCtx, SWIG_NbInputArgument(pvApiCtx) + SWIG_Scilab_GetOutputPosition()); } else { return SWIG_ERROR; } } %typemap(freearg, noblock=1) (bool **OUT, int *OUT_SIZE) { free(*$1); free($1); free($2); } // out (int *OUT_SIZE, bool **OUT) %typemap(in, noblock=1, numinputs=0) (int *OUT_SIZE, bool **OUT) { } %typemap(arginit, noblock=1) (int *OUT_SIZE, bool **OUT) { $1 = (int*) malloc(sizeof(int)); $2 = (bool**) malloc(sizeof(bool*)); } %typemap(argout, noblock=1, fragment="SWIG_SciBoolean_FromBoolArrayAndSize") (int *OUT_SIZE, bool **OUT) { if (SWIG_SciBoolean_FromBoolArrayAndSize(pvApiCtx, SWIG_Scilab_GetOutputPosition(), 1, *$1, *$2) == SWIG_OK) { SWIG_Scilab_SetOutput(pvApiCtx, SWIG_NbInputArgument(pvApiCtx) + SWIG_Scilab_GetOutputPosition()); } else { return SWIG_ERROR; } } %typemap(freearg, noblock=1) (int *OUT_SIZE, bool **OUT) { free($1); free(*$2); free($2); } swig-4.0.1/Lib/scilab/scibool.swg0000644000175000017500000000775413527063513016504 0ustar williamwilliam/* * C-type: bool * Scilab type: boolean scalar */ %fragment(SWIG_AsVal_frag(bool), "header") { SWIGINTERN int SWIG_AsVal_dec(bool)(SwigSciObject iVar, bool *pbValue) { SciErr sciErr; int iRet = 0; int *piAddrVar = NULL; int iTempValue = 0; sciErr = getVarAddressFromPosition(pvApiCtx, iVar, &piAddrVar); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (!isBooleanType(pvApiCtx, piAddrVar)) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong type for input argument #%d: A boolean expected.\n"), SWIG_Scilab_GetFuncName(), iVar); return SWIG_ERROR; } if (!isScalar(pvApiCtx, piAddrVar)) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong size for input argument #%d: A boolean expected.\n"), SWIG_Scilab_GetFuncName(), iVar); return SWIG_ERROR; } iRet = getScalarBoolean(pvApiCtx, piAddrVar, &iTempValue); if (iRet) { return SWIG_ERROR; } *pbValue = iTempValue; return SWIG_OK; } } %fragment(SWIG_From_frag(bool), "header") { SWIGINTERN int SWIG_From_dec(bool)(bool bValue) { if (createScalarBoolean(pvApiCtx, SWIG_NbInputArgument(pvApiCtx) + SWIG_Scilab_GetOutputPosition(), bValue)) return SWIG_ERROR; return SWIG_OK; } } /* * C-type: bool[] * Scilab type: boolean matrix */ %fragment("SWIG_SciBoolean_AsBoolArrayAndSize", "header") { SWIGINTERN int SWIG_SciBoolean_AsBoolArrayAndSize(void *pvApiCtx, int iVar, int *iRows, int *iCols, bool **pbValue, char *fname) { SciErr sciErr; int *piAddrVar = NULL; int *piValue = NULL; sciErr = getVarAddressFromPosition(pvApiCtx, iVar, &piAddrVar); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (isBooleanType(pvApiCtx, piAddrVar)) { int i; sciErr = getMatrixOfBoolean(pvApiCtx, piAddrVar, iRows, iCols, &piValue); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } *pbValue = (bool*) malloc((*iRows) * (*iCols) * sizeof(bool)); for (i = 0; i < (*iRows) * (*iCols); i++) (*pbValue)[i] = piValue[i] != 0; } else { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong type for input argument #%d: A boolean matrix expected.\n"), fname, iVar); return SWIG_ERROR; } return SWIG_OK; } } %fragment("SWIG_SciBoolean_FromBoolArrayAndSize", "header") { SWIGINTERN int SWIG_SciBoolean_FromBoolArrayAndSize(void *pvApiCtx, int iVarOut, int iRows, int iCols, bool *pbValue) { SciErr sciErr; int *piValue = NULL; int i; piValue = (int*) malloc(iRows * iCols * sizeof(int)); for (i = 0; i < iRows * iCols; i++) piValue[i] = pbValue[i]; sciErr = createMatrixOfBoolean(pvApiCtx, SWIG_NbInputArgument(pvApiCtx) + iVarOut, iRows, iCols, piValue); if(sciErr.iErr) { printError(&sciErr, 0); free(piValue); return SWIG_ERROR; } free(piValue); return SWIG_OK; } } /* * C-type: int[] * Scilab type: boolean matrix */ %fragment("SWIG_SciBoolean_AsIntArrayAndSize", "header") { SWIGINTERN int SWIG_SciBoolean_AsIntArrayAndSize(void *pvApiCtx, int iVar, int *iRows, int *iCols, int **piValue, char *fname) { SciErr sciErr; int *piAddrVar = NULL; sciErr = getVarAddressFromPosition(pvApiCtx, iVar, &piAddrVar); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (isBooleanType(pvApiCtx, piAddrVar)) { sciErr = getMatrixOfBoolean(pvApiCtx, piAddrVar, iRows, iCols, piValue); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } } else { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong type for input argument #%d: A boolean matrix expected.\n"), fname, iVar); return SWIG_ERROR; } return SWIG_OK; } } %fragment("SWIG_SciBoolean_FromIntArrayAndSize", "header") { SWIGINTERN int SWIG_SciBoolean_FromIntArrayAndSize(void *pvApiCtx, int iVarOut, int iRows, int iCols, int *piValue) { SciErr sciErr; sciErr = createMatrixOfBoolean(pvApiCtx, SWIG_NbInputArgument(pvApiCtx) + iVarOut, iRows, iCols, piValue); if(sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } return SWIG_OK; } } swig-4.0.1/Lib/scilab/scisequence.swg0000644000175000017500000001622213527063513017347 0ustar williamwilliam/* * * Scilab sequence conversions * */ #define SWIG_Traits_Sequence_frag(Type) %fragment_name(AsVal_Traits_Sequence, Type) #define SWIG_AsCheck_Sequence_frag(Type...) %fragment_name(AsCheck_Sequence, Type) #define SWIG_AsCheck_Sequence_dec(Type...) %symbol_name(AsCheck_Sequence, Type) #define SWIG_AsGet_Sequence_frag(Type...) %fragment_name(AsGet_Sequence, Type) #define SWIG_AsGet_Sequence_dec(Type...) %symbol_name(AsGet_Sequence, Type) #define SWIG_AsSize_Sequence_frag(Type...) %fragment_name(AsSize_Sequence, Type) #define SWIG_AsSize_Sequence_dec(Type...) %symbol_name(AsSize_Sequence, Type) #define SWIG_FromCreate_Sequence_frag(Type...) %fragment_name(FromCreate_Sequence, Type) #define SWIG_FromCreate_Sequence_dec(Type...) %symbol_name(FromCreate_Sequence, Type) #define SWIG_FromSet_Sequence_frag(Type...) %fragment_name(FromSet_Sequence, Type) #define SWIG_FromSet_Sequence_dec(Type...) %symbol_name(FromSet_Sequence, Type) #define SWIG_Traits_SequenceItem_frag(Type) %fragment_name(AsVal_Traits_SequenceItem, Type) #define SWIG_AsVal_SequenceItem_frag(Type...) %fragment_name(AsVal_SequenceItem, Type) #define SWIG_AsVal_SequenceItem_dec(Type...) %symbol_name(AsVal_SequenceItem, Type) #define SWIG_From_SequenceItem_frag(Type...) %fragment_name(From_SequenceItem, Type) #define SWIG_From_SequenceItem_dec(Type...) %symbol_name(From_SequenceItem, Type) %include %include %include %include %include %include // // Sequence conversion // %fragment(SWIG_Traits_Sequence_frag(ptr), "header", fragment=SWIG_AsCheck_Sequence_frag(ptr), fragment=SWIG_AsGet_Sequence_frag(ptr), fragment=SWIG_AsSize_Sequence_frag(ptr), fragment=SWIG_FromCreate_Sequence_frag(ptr), fragment=SWIG_FromSet_Sequence_frag(ptr), fragment="StdTraits", fragment="") { namespace swig { // Error returned for sequence containers of default item type template struct traits_as_sequence { static int check(SwigSciObject obj) { throw std::invalid_argument("The container data type is not supported."); } static int get(SwigSciObject obj, void **sequence) { throw std::invalid_argument("The container data type is not supported."); } static int size(SwigSciObject obj, int *size) { throw std::invalid_argument("The container data type is not supported."); } }; template struct traits_from_sequence { static int create(int size, void **sequence) { throw std::invalid_argument("The container data type is not supported."); } static SwigSciObject set(int size, void *sequence) { throw std::invalid_argument("The container data type is not supported."); } }; // Support sequence containers of pointers template struct traits_as_sequence { static int check(SwigSciObject obj) { return SWIG_AsCheck_Sequence_dec(ptr)(obj); } static int get(SwigSciObject obj, void **sequence) { return SWIG_AsGet_Sequence_dec(ptr)(obj, (int **)sequence); } static int size(SwigSciObject obj, int *size) { return SWIG_AsSize_Sequence_dec(ptr)(obj, size); } }; template struct traits_from_sequence { static int create(int size, void **sequence) { return SWIG_FromCreate_Sequence_dec(ptr)(size, (uintptr_t **)sequence); } static SwigSciObject set(int size, void *sequence) { return SWIG_FromSet_Sequence_dec(ptr)(size, (uintptr_t *)sequence); } }; } } %define %traits_sequence(CppType, ScilabType) %fragment(SWIG_Traits_Sequence_frag(CppType), "header", fragment=SWIG_Traits_Sequence_frag(ptr), fragment=SWIG_AsCheck_Sequence_frag(CppType), fragment=SWIG_AsGet_Sequence_frag(CppType), fragment=SWIG_AsSize_Sequence_frag(CppType), fragment=SWIG_FromCreate_Sequence_frag(CppType), fragment=SWIG_FromSet_Sequence_frag(CppType)) { namespace swig { template <> struct traits_as_sequence { static int check(SwigSciObject obj) { return SWIG_AsCheck_Sequence_dec(CppType)(obj); } static int get(SwigSciObject obj, void **sequence) { return SWIG_AsGet_Sequence_dec(CppType)(obj, (ScilabType **)sequence); } static int size(SwigSciObject obj, int *size) { return SWIG_AsSize_Sequence_dec(CppType)(obj, size); } }; template <> struct traits_from_sequence { static int create(int size, void **sequence) { return SWIG_FromCreate_Sequence_dec(CppType)(size, (ScilabType **)sequence); } static SwigSciObject set(int size, void *sequence) { return SWIG_FromSet_Sequence_dec(CppType)(size, (ScilabType *)sequence); } }; } } %enddef // // Sequence item conversion // %fragment(SWIG_Traits_SequenceItem_frag(ptr), "header", fragment=SWIG_AsVal_SequenceItem_frag(ptr), fragment=SWIG_From_SequenceItem_frag(ptr), fragment="StdTraits", fragment="") { namespace swig { // Error returned for sequence containers of default item type template struct traits_asval_sequenceitem { static T asval(SwigSciObject obj, void *pSequence, int iItemIndex) { throw std::invalid_argument("The container data type is not supported."); } }; template struct traits_from_sequenceitem { static int from(void *pSequence, int iItemIndex, T itemValue) { throw std::invalid_argument("The container data type is not supported."); } }; // Support sequence containers of pointers template struct traits_asval_sequenceitem { static T* asval(SwigSciObject obj, void *pSequence, int iItemIndex) { return static_cast(SWIG_AsVal_SequenceItem_dec(ptr)(obj, (int *)pSequence, iItemIndex)); } }; template struct traits_from_sequenceitem { static int from(void *pSequence, int iItemIndex, T *itemValue) { return SWIG_From_SequenceItem_dec(ptr)((uintptr_t *)pSequence, iItemIndex, (uintptr_t) itemValue); } }; } } %define %traits_sequenceitem(CppType, ScilabType) %fragment(SWIG_Traits_SequenceItem_frag(CppType), "header", fragment=SWIG_Traits_SequenceItem_frag(ptr), fragment=SWIG_AsVal_SequenceItem_frag(CppType), fragment=SWIG_From_SequenceItem_frag(CppType)) { namespace swig { template <> struct traits_asval_sequenceitem { static CppType asval(SwigSciObject obj, void *pSequence, int iItemIndex) { return SWIG_AsVal_SequenceItem_dec(CppType)(obj, (ScilabType *)pSequence, iItemIndex); } }; template <> struct traits_from_sequenceitem { static int from(void *pSequence, int iItemIndex, CppType itemValue) { return SWIG_From_SequenceItem_dec(CppType)((ScilabType *)pSequence, iItemIndex, itemValue); } }; } } %enddef %define %add_traits_sequence(CppType, ScilabType) %traits_sequence(CppType, ScilabType); %fragment(SWIG_Traits_Sequence_frag(CppType)); %traits_sequenceitem(CppType, ScilabType); %fragment(SWIG_Traits_SequenceItem_frag(CppType)); %enddef %add_traits_sequence(int, int); %add_traits_sequence(double, double); %add_traits_sequence(float, float); %add_traits_sequence(std::string, char*); %add_traits_sequence(bool, int); swig-4.0.1/Lib/scilab/sciint.swg0000644000175000017500000001432613527063513016334 0ustar williamwilliam/* * C-type: int * Scilab type: double or int32 */ %fragment(SWIG_AsVal_frag(int), "header", fragment="SWIG_SciDoubleOrInt32_AsInt", fragment="") { %#define SWIG_AsVal_int(scilabValue, valuePointer) SWIG_SciDoubleOrInt32_AsInt(pvApiCtx, scilabValue, valuePointer, SWIG_Scilab_GetFuncName()) } %fragment("SWIG_SciDoubleOrInt32_AsInt", "header") { SWIGINTERN int SWIG_SciDoubleOrInt32_AsInt(void *pvApiCtx, SwigSciObject iVar, int *piValue, char *fname) { SciErr sciErr; int iType = 0; int iRows = 0; int iCols = 0; int *piAddrVar = NULL; sciErr = getVarAddressFromPosition(pvApiCtx, iVar, &piAddrVar); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } sciErr = getVarType(pvApiCtx, piAddrVar, &iType); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (iType == sci_ints) { if (piValue) { int iPrec = 0; int *piData = NULL; sciErr = getMatrixOfIntegerPrecision(pvApiCtx, piAddrVar, &iPrec); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (iPrec != SCI_INT32) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong type for input argument #%d: A 32-bit signed integer or a double expected.\n"), fname, iVar); return SWIG_TypeError; } sciErr = getMatrixOfInteger32(pvApiCtx, piAddrVar, &iRows, &iCols, &piData); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (iRows * iCols != 1) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong size for input argument #%d: A 32-bit signed integer or a double expected.\n"), fname, iVar); return SWIG_TypeError; } *piValue = *piData; } } else if (iType == sci_matrix) { if (piValue) { double *pdData = NULL; double dValue = 0.0f; sciErr = getMatrixOfDouble(pvApiCtx, piAddrVar, &iRows, &iCols, &pdData); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (iRows * iCols != 1) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong size for input argument #%d: A 32-bit signed integer or a double expected.\n"), fname, iVar); return SWIG_TypeError; } dValue = *pdData; if (dValue != floor(dValue)) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Incorrect value for input argument #%d: The double value cannot be converted to a 32-bit signed integer.\n"), fname, iVar); return SWIG_ValueError; } if ((dValue < INT_MIN) || (dValue > INT_MAX)) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Overflow error for input argument #%d: The double value cannot be converted to a 32-bit signed integer.\n"), fname, iVar); return SWIG_OverflowError; } *piValue = (int) dValue; } } else { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong type for input argument #%d: A 32-bit signed integer or a double expected.\n"), fname, iVar); return SWIG_TypeError; } return SWIG_OK; } } %fragment(SWIG_From_frag(int), "header", fragment="SWIG_SciDouble_FromInt") { %#define SWIG_From_int(scilabValue) SWIG_SciDouble_FromInt(pvApiCtx, SWIG_Scilab_GetOutputPosition(), scilabValue, SWIG_Scilab_GetFuncName()) } %fragment("SWIG_SciDouble_FromInt", "header") { SWIGINTERN int SWIG_SciDouble_FromInt(void *pvApiCtx, int iVarOut, int iValue, char *fname){ if (createScalarDouble(pvApiCtx, SWIG_NbInputArgument(pvApiCtx) + iVarOut, (double) iValue)) return SWIG_ERROR; return SWIG_OK; } } /* * C-type: int[] * Scilab type: double or int32 matrix */ %fragment("SWIG_SciDoubleOrInt32_AsIntArrayAndSize", "header") { SWIGINTERN int SWIG_SciDoubleOrInt32_AsIntArrayAndSize(void *pvApiCtx, int iVar, int *iRows, int *iCols, int **piValue, char *fname) { SciErr sciErr; int iType = 0; int *piAddrVar = NULL; sciErr = getVarAddressFromPosition(pvApiCtx, iVar, &piAddrVar); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } sciErr = getVarType(pvApiCtx, piAddrVar, &iType); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (iType == sci_matrix) { double *pdData = NULL; int size = 0; int i; sciErr = getMatrixOfDouble(pvApiCtx, piAddrVar, iRows, iCols, &pdData); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } size = (*iRows) * (*iCols); *piValue = (int*) malloc(size * sizeof(int*)); for (i = 0; i < size; i++) (*piValue)[i] = (int) pdData[i]; } else if (iType == sci_ints) { int iPrec = 0; sciErr = getMatrixOfIntegerPrecision(pvApiCtx, piAddrVar, &iPrec); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (iPrec != SCI_INT32) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong type for input argument #%d: A 32-bit signed integer or a double matrix expected.\n"), fname, iVar); return SWIG_ERROR; } sciErr = getMatrixOfInteger32(pvApiCtx, piAddrVar, iRows, iCols, piValue); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } } else { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong type for input argument #%d: A 32-bit signed integer or a double matrix expected.\n"), fname, iVar); return SWIG_ERROR; } return SWIG_OK; } } %fragment("SWIG_SciDouble_FromIntArrayAndSize", "header") { SWIGINTERN int SWIG_SciDouble_FromIntArrayAndSize(void *pvApiCtx, int iVarOut, int iRows, int iCols, const int *piData) { SciErr sciErr; double *pdValues = NULL; int i; pdValues = (double*) malloc(iRows * iCols * sizeof(double)); for (i=0; i SHRT_MAX)) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Overflow error for input argument #%d: The double value cannot be converted to a 16-bit signed integer.\n"), fname, iVar); return SWIG_OverflowError; } *psValue = (short) dValue; } else { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong type for input argument #%d: A 16-bit signed integer or a double expected.\n"), fname, iVar); return SWIG_TypeError; } return SWIG_OK; } } %fragment(SWIG_From_frag(short), "header", fragment="SWIG_SciDouble_FromShort") { #define SWIG_From_short(scilabValue) SWIG_SciDouble_FromShort(pvApiCtx, SWIG_Scilab_GetOutputPosition(), scilabValue, SWIG_Scilab_GetFuncName()) } %fragment("SWIG_SciDouble_FromShort", "header") { SWIGINTERN int SWIG_SciDouble_FromShort(void *pvApiCtx, int iVarOut, short sValue, char *fname) { if (createScalarDouble(pvApiCtx, SWIG_NbInputArgument(pvApiCtx) + iVarOut, (double) sValue)) return SWIG_ERROR; return SWIG_OK; } } /* * C-type: short[] * Scilab type: double or int16 matrix */ %fragment("SWIG_SciDoubleOrInt16_AsShortArrayAndSize", "header") { SWIGINTERN int SWIG_SciDoubleOrInt16_AsShortArrayAndSize(void *pvApiCtx, int iVar, int *iRows, int *iCols, short **psValue, char *fname) { SciErr sciErr; int iType = 0; int iPrec = 0; int *piAddrVar = NULL; sciErr = getVarAddressFromPosition(pvApiCtx, iVar, &piAddrVar); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } sciErr = getVarType(pvApiCtx, piAddrVar, &iType); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (iType == sci_matrix) { double *pdData = NULL; int size = 0; int i; sciErr = getMatrixOfDouble(pvApiCtx, piAddrVar, iRows, iCols, &pdData); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } size = (*iRows) * (*iCols); *psValue = (short*) malloc(size * sizeof(int*)); for (i = 0; i < size; i++) (*psValue)[i] = (short) pdData[i]; } else if (iType == sci_ints) { int iPrec = 0; sciErr = getMatrixOfIntegerPrecision(pvApiCtx, piAddrVar, &iPrec); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (iPrec != SCI_INT16) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong type for input argument #%d: A 16-bit signed integer or a double matrix expected.\n"), fname, iVar); return SWIG_ERROR; } sciErr = getMatrixOfInteger16(pvApiCtx, piAddrVar, iRows, iCols, psValue); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } } else { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong type for input argument #%d: A 16-bit signed integer or a double matrix expected.\n"), fname, iVar); return SWIG_ERROR; } return SWIG_OK; } } %fragment("SWIG_SciDouble_FromShortArrayAndSize", "header") { SWIGINTERN int SWIG_SciDouble_FromShortArrayAndSize(void *pvApiCtx, int iVarOut, int iRows, int iCols, short *psValue) { SciErr sciErr; int i; double *pdValues = NULL; pdValues = (double*) malloc(iRows * iCols * sizeof(double)); for (i=0; i swig-4.0.1/Lib/scilab/matrix.i0000644000175000017500000000022513527063513015770 0ustar williamwilliam/* * Matrix typemaps * */ %include %include %include %include swig-4.0.1/Lib/scilab/scichar.swg0000644000175000017500000001741213527063513016456 0ustar williamwilliam/* * C-type: char or char* * Scilab type: string */ /* * CHAR */ %fragment(SWIG_AsVal_frag(char), "header", fragment="SWIG_SciString_AsChar") { #define SWIG_AsVal_char(scilabValue, valuePointer) SWIG_SciString_AsChar(pvApiCtx, scilabValue, valuePointer, SWIG_Scilab_GetFuncName()) } %fragment("SWIG_SciString_AsChar", "header") { SWIGINTERN int SWIG_SciString_AsChar(void *pvApiCtx, int iVar, char *pcValue, char *fname) { SciErr sciErr; int *piAddrVar = NULL; char *pstValue = NULL; int iRet; sciErr = getVarAddressFromPosition(pvApiCtx, iVar, &piAddrVar); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (isStringType(pvApiCtx, piAddrVar) == 0) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong type for input argument #%d: A single string expected.\n"), fname, iVar); return SWIG_TypeError; } iRet = getAllocatedSingleString(pvApiCtx, piAddrVar, &pstValue); if (iRet) { return SWIG_ERROR; } if (pcValue != NULL) { *pcValue = pstValue[0]; } freeAllocatedSingleString(pstValue); return SWIG_OK; } } %fragment(SWIG_From_frag(char), "header", fragment="SWIG_SciString_FromChar") { #define SWIG_From_char(value) SWIG_SciString_FromChar(pvApiCtx, SWIG_Scilab_GetOutputPosition(), value) } %fragment("SWIG_SciString_FromChar", "header") { SWIGINTERN int SWIG_SciString_FromChar(void *pvApiCtx, int iVarOut, char chValue) { char *pchValue = (char*)malloc(sizeof(char) * 2); pchValue[0] = chValue; pchValue[1] = '\0'; if (createSingleString(pvApiCtx, SWIG_NbInputArgument(pvApiCtx) + iVarOut, pchValue)) return SWIG_ERROR; free(pchValue); return SWIG_OK; } } /* * CHAR * */ %fragment("SWIG_AsCharArray", "header", fragment = "SWIG_SciString_AsCharPtr") { #define SWIG_AsCharArray(scilabValue, charPtrPointer, charPtrLength) SWIG_SciString_AsCharPtr(pvApiCtx, scilabValue, charPtrPointer, charPtrLength, SWIG_Scilab_GetFuncName()) } %fragment("SWIG_SciString_AsCharPtr", "header") { SWIGINTERN int SWIG_SciString_AsCharPtr(void *pvApiCtx, int iVar, char *pcValue, int iLength, char *fname) { SciErr sciErr; int *piAddrVar = NULL; char* pcTmpValue = NULL; int iRet; sciErr = getVarAddressFromPosition(pvApiCtx, iVar, &piAddrVar); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } iRet = getAllocatedSingleString(pvApiCtx, piAddrVar, &pcTmpValue); if (iRet) { return SWIG_ERROR; } if (pcValue != NULL) { strncpy(pcValue, pcTmpValue, iLength); } freeAllocatedSingleString(pcTmpValue); return SWIG_OK; } } %fragment("SWIG_AsCharPtrAndSize", "header", fragment = "SWIG_SciString_AsCharPtrAndSize") { #define SWIG_AsCharPtrAndSize(scilabValue, charPtrPointer, charPtrLength, allocMemory) SWIG_SciString_AsCharPtrAndSize(pvApiCtx, scilabValue, charPtrPointer, charPtrLength, allocMemory, SWIG_Scilab_GetFuncName()) } %fragment("SWIG_SciString_AsCharPtrAndSize", "header") { SWIGINTERN int SWIG_SciString_AsCharPtrAndSize(void *pvApiCtx, int iVar, char **pcValue, size_t *piLength, int *alloc, char *fname) { SciErr sciErr; int *piAddrVar = NULL; char *pstString = NULL; int iRows = 0; int iCols = 0; int iLen = 0; sciErr = getVarAddressFromPosition(pvApiCtx, iVar, &piAddrVar); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (isScalar(pvApiCtx, piAddrVar) == 0 || isStringType(pvApiCtx, piAddrVar) == 0) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong type for input argument #%d: A single string expected.\n"), fname, iVar); return SWIG_TypeError; } sciErr = getMatrixOfString(pvApiCtx, piAddrVar, &iRows, &iCols, &iLen, NULL); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } pstString = %new_array(iLen + 1, char); sciErr = getMatrixOfString(pvApiCtx, piAddrVar, &iRows, &iCols, &iLen, &pstString); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } // TODO: return SWIG_ERROR if pcValue NULL (now returning SWIG_ERROR fails some typechecks) if (pcValue) { *pcValue = pstString; } if (alloc != NULL) { *alloc = SWIG_NEWOBJ; } if (piLength != NULL) { *piLength = strlen(pstString); } return SWIG_OK; } } %fragment("SWIG_FromCharPtr", "header", fragment = "SWIG_SciString_FromCharPtr") { #define SWIG_FromCharPtr(charPtr) SWIG_SciString_FromCharPtr(pvApiCtx, SWIG_Scilab_GetOutputPosition(), charPtr) } %fragment("SWIG_SciString_FromCharPtr", "header") { SWIGINTERN int SWIG_SciString_FromCharPtr(void *pvApiCtx, int iVarOut, const char *pchValue) { if (pchValue) { SciErr sciErr; const char* pstStrings[1]; pstStrings[0] = pchValue; sciErr = createMatrixOfString(pvApiCtx, SWIG_NbInputArgument(pvApiCtx) + iVarOut, 1, 1, pstStrings); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } } else { int iRet = createEmptyMatrix(pvApiCtx, SWIG_NbInputArgument(pvApiCtx) + iVarOut); if (iRet) { return SWIG_ERROR; } } return SWIG_OK; } } /* * CHAR * ARRAY */ %fragment("SWIG_SciString_AsCharPtrArrayAndSize", "header") { SWIGINTERN int SWIG_SciString_AsCharPtrArrayAndSize(void *pvApiCtx, int iVar, int *iRows, int *iCols, char ***charPtrArray, char *fname) { SciErr sciErr; int i = 0; int *piAddrVar = NULL; int* piLength = NULL; sciErr = getVarAddressFromPosition(pvApiCtx, iVar, &piAddrVar); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } sciErr = getMatrixOfString(pvApiCtx, piAddrVar, iRows, iCols, NULL, NULL); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } piLength = (int*) malloc((*iRows) * (*iCols) * sizeof(int)); sciErr = getMatrixOfString(pvApiCtx, piAddrVar, iRows, iCols, piLength, NULL); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } *charPtrArray = (char**) malloc((*iRows) * (*iCols) * sizeof(char*)); for(i = 0 ; i < (*iRows) * (*iCols); i++) { (*charPtrArray)[i] = (char*) malloc(sizeof(char) * (piLength[i] + 1)); } sciErr = getMatrixOfString(pvApiCtx, piAddrVar, iRows, iCols, piLength, *charPtrArray); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } free(piLength); return SWIG_OK; } } %fragment("SWIG_SciString_FromCharPtrArrayAndSize", "header") { SWIGINTERN int SWIG_SciString_FromCharPtrArrayAndSize(void *pvApiCtx, int iVarOut, int iRows, int iCols, char **charPtrArray) { SciErr sciErr; sciErr = createMatrixOfString(pvApiCtx, SWIG_NbInputArgument(pvApiCtx) + iVarOut, iRows, iCols, (const char* const*) charPtrArray); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } return SWIG_OK; } } %fragment("SWIG_FromCharPtrAndSize", "header", fragment = "SWIG_SciString_FromCharPtr") { #define SWIG_FromCharPtrAndSize(charPtr, charPtrLength) SWIG_SciString_FromCharPtr(pvApiCtx, SWIG_Scilab_GetOutputPosition(), charPtr) } /* * Char* Scilab variable */ %fragment(SWIG_CreateScilabVariable_frag(char), "wrapper") { SWIGINTERN int SWIG_CreateScilabVariable_dec(char)(void *pvApiCtx, const char* psVariableName, const char cVariableValue) { SciErr sciErr; char sValue[2]; const char* psStrings[1]; sValue[0] = cVariableValue; sValue[1] = '\0'; psStrings[0] = sValue; sciErr = createNamedMatrixOfString(pvApiCtx, psVariableName, 1, 1, psStrings); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } return SWIG_OK; } } %fragment(SWIG_CreateScilabVariable_frag(charptr), "wrapper") { SWIGINTERN int SWIG_CreateScilabVariable_dec(charptr)(void *pvApiCtx, const char* psVariableName, const char* psVariableValue) { SciErr sciErr; const char* psStrings[1]; psStrings[0] = psVariableValue; sciErr = createNamedMatrixOfString(pvApiCtx, psVariableName, 1, 1, psStrings); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } return SWIG_OK; } } swig-4.0.1/Lib/scilab/stl.i0000644000175000017500000000044313527063513015270 0ustar williamwilliam/* ----------------------------------------------------------------------------- * stl.i * ----------------------------------------------------------------------------- */ %include %include %include %include %include swig-4.0.1/Lib/scilab/scicontainer.swg0000644000175000017500000002507413527063513017526 0ustar williamwilliam/* ----------------------------------------------------------------------------- * scicontainer.swg * * Scilab list <-> C++ container wrapper * * This wrapper, and its iterator, allows a general use (and reuse) of * the mapping between C++ and Scilab, thanks to the C++ templates. * * Of course, it needs the C++ compiler to support templates, but * since we will use this wrapper with the STL containers, that should * be the case. * ----------------------------------------------------------------------------- */ %{ #include %} #if !defined(SWIG_NO_EXPORT_ITERATOR_METHODS) # if !defined(SWIG_EXPORT_ITERATOR_METHODS) # define SWIG_EXPORT_ITERATOR_METHODS SWIG_EXPORT_ITERATOR_METHODS # endif #endif // #define (SWIG_SCILAB_EXTRA_NATIVE_CONTAINERS) // if defined: sequences in return are converted from/to Scilab lists or matrices // if not defined: sequences are passed from/to Scilab as pointers %{ #define SWIG_STD_NOASSIGN_STL %} %include %include %{ #include %} %include %include %fragment("SciSequence_Cont", "header", fragment="StdTraits", fragment="SwigSciIterator_T", fragment=SWIG_Traits_Sequence_frag(ptr), fragment=SWIG_Traits_SequenceItem_frag(ptr)) { namespace swig { template struct SciSequence_Ref { SciSequence_Ref(const SwigSciObject& seq, int index) : _seq(seq), _index(index) { if (traits_as_sequence::get(_seq, &piSeqAddr) != SWIG_OK) { throw std::invalid_argument("Cannot get sequence data."); } } operator T () const { return traits_asval_sequenceitem::asval(_seq, piSeqAddr, _index); } SciSequence_Ref& operator=(const T& v) { // TODO return *this; } private: SwigSciObject _seq; int _index; void *piSeqAddr; }; template struct SciSequence_ArrowProxy { SciSequence_ArrowProxy(const T& x): m_value(x) {} const T* operator->() const { return &m_value; } operator const T*() const { return &m_value; } T m_value; }; template struct SwigSciSequence_InputIterator { typedef SwigSciSequence_InputIterator self; typedef std::random_access_iterator_tag iterator_category; typedef Reference reference; typedef T value_type; typedef T* pointer; typedef int difference_type; SwigSciSequence_InputIterator() { } SwigSciSequence_InputIterator(const SwigSciObject& seq, int index) : _seq(seq), _index(index) { } reference operator*() const { return reference(_seq, _index); } SciSequence_ArrowProxy operator->() const { return SciSequence_ArrowProxy(operator*()); } bool operator==(const self& ri) const { return (_index == ri._index); } bool operator!=(const self& ri) const { return !(operator==(ri)); } self& operator ++ () { ++_index; return *this; } self& operator -- () { --_index; return *this; } self& operator += (difference_type n) { _index += n; return *this; } self operator +(difference_type n) const { return self(_seq, _index + n); } self& operator -= (difference_type n) { _index -= n; return *this; } self operator -(difference_type n) const { return self(_seq, _index - n); } difference_type operator - (const self& ri) const { return _index - ri._index; } bool operator < (const self& ri) const { return _index < ri._index; } reference operator[](difference_type n) const { return reference(_seq, _index + n); } private: SwigSciObject _seq; difference_type _index; }; template struct SciSequence_Cont { typedef SciSequence_Ref reference; typedef const SciSequence_Ref const_reference; typedef T value_type; typedef T* pointer; typedef int difference_type; typedef int size_type; typedef const pointer const_pointer; typedef SwigSciSequence_InputIterator iterator; typedef SwigSciSequence_InputIterator const_iterator; SciSequence_Cont(const SwigSciObject& seq) : _seq(seq) { } ~SciSequence_Cont() { } size_type size() const { int iSeqSize; if (traits_as_sequence::size(_seq, &iSeqSize) == SWIG_OK) { return iSeqSize; } else { return SWIG_ERROR; } } bool empty() const { return size() == 0; } iterator begin() { return iterator(_seq, 0); } const_iterator begin() const { return const_iterator(_seq, 0); } iterator end() { return iterator(_seq, size()); } const_iterator end() const { return const_iterator(_seq, size()); } reference operator[](difference_type n) { return reference(_seq, n); } const_reference operator[](difference_type n) const { return const_reference(_seq, n); } private: SwigSciObject _seq; }; } } %define %swig_sequence_iterator(Sequence...) #if defined(SWIG_EXPORT_ITERATOR_METHODS) class iterator; class reverse_iterator; class const_iterator; class const_reverse_iterator; %typemap(out,noblock=1,fragment="SciSequence_Cont") iterator, reverse_iterator, const_iterator, const_reverse_iterator { %set_output(SWIG_NewPointerObj(swig::make_output_iterator(%static_cast($1,const $type &)), swig::SciSwigIterator::descriptor(),SWIG_POINTER_OWN)); } %typemap(out,fragment="SciSequence_Cont") std::pair, std::pair { // TODO: return a Scilab list from the pair (see code for Octave) } %fragment("SciSwigPairBoolOutputIterator", "header", fragment=SWIG_From_frag(bool), fragment="SciSequence_Cont") {} %typemap(out,fragment="SciSwigPairBoolOutputIterator") std::pair, std::pair { // TODO: return a Scilab list from the pair (see code for Octave) } %typemap(in,noblock=1,fragment="SciSequence_Cont") iterator(swig::SciSwigIterator *iter = 0, int res), reverse_iterator(swig::SciSwigIterator *iter = 0, int res), const_iterator(swig::SciSwigIterator *iter = 0, int res), const_reverse_iterator(swig::SciSwigIterator *iter = 0, int res) { res = SWIG_ConvertPtr((SwigSciObject)$input, %as_voidptrptr(&iter), swig::SciSwigIterator::descriptor(), 0); if (!SWIG_IsOK(res) || !iter) { %argument_fail(SWIG_TypeError, "$type", $symname, $argnum); } else { swig::SwigSciIterator_T<$type > *iter_t = dynamic_cast *>(iter); if (iter_t) { $1 = iter_t->get_current(); } else { %argument_fail(SWIG_TypeError, "$type", $symname, $argnum); } } } %typecheck(%checkcode(ITERATOR),noblock=1,fragment="SciSequence_Cont") iterator, reverse_iterator, const_iterator, const_reverse_iterator { swig::SciSwigIterator *iter = 0; int res = SWIG_ConvertPtr((SwigSciObject)$input, %as_voidptrptr(&iter), swig::SciSwigIterator::descriptor(), 0); $1 = (SWIG_IsOK(res) && iter && (dynamic_cast *>(iter) != 0)); } %fragment("SciSequence_Cont"); #endif //SWIG_EXPORT_ITERATOR_METHODS %enddef // The Scilab container methods %define %swig_container_methods(Container...) %enddef %define %swig_sequence_methods_common(Sequence...) %swig_sequence_iterator(%arg(Sequence)) %swig_container_methods(%arg(Sequence)) %enddef %define %swig_sequence_methods(Sequence...) %swig_sequence_methods_common(%arg(Sequence)) %enddef %define %swig_sequence_methods_val(Sequence...) %swig_sequence_methods_common(%arg(Sequence)) %enddef // // Common fragments // %fragment("StdSequenceTraits","header", fragment="StdTraits", fragment="SciSequence_Cont") { namespace swig { template inline void assign(const SciSeq& sciSeq, Seq* seq) { %#ifdef SWIG_STD_NOASSIGN_STL typedef typename SciSeq::value_type value_type; typename SciSeq::const_iterator it = sciSeq.begin(); for (;it != sciSeq.end(); ++it) { seq->insert(seq->end(),(value_type)(*it)); } %#else seq->assign(sciSeq.begin(), sciSeq.end()); %#endif } template struct traits_asptr_stdseq { typedef Seq sequence; typedef T value_type; static int asptr(const SwigSciObject& obj, sequence **seq) { swig_type_info *typeInfo = swig::type_info(); if (typeInfo) { sequence *p; if (SWIG_ConvertPtr(obj, (void**)&p, typeInfo, 0) == SWIG_OK) { if (seq) *seq = p; return SWIG_OLDOBJ; } } if (traits_as_sequence::check(obj) == SWIG_OK) { try { SciSequence_Cont sciSeq(obj); if (seq) { *seq = new sequence(); assign(sciSeq, *seq); return SWIG_NEWOBJ; } else { return SWIG_ERROR; } } catch (std::exception& e) { SWIG_exception(SWIG_RuntimeError, e.what()); return SWIG_ERROR; } } else { return SWIG_ERROR; } } }; template struct traits_from_stdseq { typedef Seq sequence; typedef T value_type; typedef typename Seq::size_type size_type; typedef typename sequence::const_iterator const_iterator; static SwigSciObject from(const sequence& seq) { %#ifdef SWIG_SCILAB_EXTRA_NATIVE_CONTAINERS swig_type_info *typeInfo = swig::type_info(); if (typeInfo) { return SWIG_NewPointerObj(new sequence(seq), typeInfo, SWIG_POINTER_OWN); } %#endif try { void *data; size_type size = seq.size(); if (traits_from_sequence::create(size, &data) == SWIG_OK) { const_iterator it; int index = 0; for (it = seq.begin(); it != seq.end(); ++it) { traits_from_sequenceitem::from(data, index, *it); index++; } return traits_from_sequence::set(size, data); } return SWIG_OK; } catch (std::exception& e) { SWIG_exception(SWIG_RuntimeError, e.what()); return SWIG_ERROR; } } }; } } swig-4.0.1/Lib/scilab/scisequencepointer.swg0000644000175000017500000000551713527063513020755 0ustar williamwilliam/* * * Scilab list of pointer <-> C++ pointer container * */ %include %fragment("", "header") { %#include } %fragment(SWIG_AsCheck_Sequence_frag(ptr), "header", fragment="SWIG_ScilabList") { SWIGINTERN int SWIG_AsCheck_Sequence_dec(ptr)(SwigSciObject obj) { return SWIG_CheckScilabList(obj); } } %fragment(SWIG_AsGet_Sequence_frag(ptr), "header", fragment="SWIG_ScilabList") { SWIGINTERN int SWIG_AsGet_Sequence_dec(ptr)(SwigSciObject obj, int **piSequence) { return SWIG_GetScilabList(obj, piSequence); } } %fragment(SWIG_AsSize_Sequence_frag(ptr), "header", fragment="SWIG_ScilabList") { SWIGINTERN int SWIG_AsSize_Sequence_dec(ptr)(SwigSciObject obj, int *piSize) { return SWIG_GetScilabListSize(obj, piSize); } } %fragment(SWIG_FromCreate_Sequence_frag(ptr), "header", fragment="") { SWIGINTERN int SWIG_FromCreate_Sequence_dec(ptr)(int size, uintptr_t **pSequence) { *pSequence = new uintptr_t[size]; return *pSequence != NULL ? SWIG_OK : SWIG_ERROR; } } %fragment(SWIG_FromSet_Sequence_frag(ptr), "header", fragment="") { SWIGINTERN SwigSciObject SWIG_FromSet_Sequence_dec(ptr)(int size, uintptr_t *pSequence) { SciErr sciErr; int *piListAddr; int iVarOut = SWIG_NbInputArgument(pvApiCtx) + SWIG_Scilab_GetOutputPosition(); sciErr = createList(pvApiCtx, iVarOut, size, &piListAddr); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } for (int i=0; i C++ double container * */ %include %fragment(SWIG_AsCheck_Sequence_frag(double), "header") { SWIGINTERN int SWIG_AsCheck_Sequence_dec(double)(SwigSciObject obj) { SciErr sciErr; int *piAddrVar; sciErr = getVarAddressFromPosition(pvApiCtx, obj, &piAddrVar); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (isDoubleType(pvApiCtx, piAddrVar)) { return SWIG_OK; } else { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong type for input argument #%d: A double is expected.\n"), SWIG_Scilab_GetFuncName(), obj); return SWIG_ERROR; } } } %fragment(SWIG_AsGet_Sequence_frag(double), "header", fragment="SWIG_SciDouble_AsDoubleArrayAndSize") { SWIGINTERN int SWIG_AsGet_Sequence_dec(double)(SwigSciObject obj, double **pSequence) { int iMatrixRowCount; int iMatrixColCount; return (SWIG_SciDouble_AsDoubleArrayAndSize(pvApiCtx, obj, &iMatrixRowCount, &iMatrixColCount, pSequence, SWIG_Scilab_GetFuncName())); } } %fragment(SWIG_AsSize_Sequence_frag(double), "header", fragment="SWIG_SciDouble_AsDoubleArrayAndSize") { SWIGINTERN int SWIG_AsSize_Sequence_dec(double)(SwigSciObject obj, int *piSize) { double *pdblMatrix; int iMatrixRowCount; int iMatrixColCount; if (SWIG_SciDouble_AsDoubleArrayAndSize(pvApiCtx, obj, &iMatrixRowCount, &iMatrixColCount, &pdblMatrix, SWIG_Scilab_GetFuncName()) == SWIG_OK) { if ((iMatrixRowCount > 1) && (iMatrixColCount > 1)) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong size for input argument #%d: A double vector is expected.\n"), SWIG_Scilab_GetFuncName(), obj); return SWIG_ERROR; } *piSize = iMatrixRowCount * iMatrixColCount; return SWIG_OK; } return SWIG_ERROR; } } %fragment(SWIG_FromCreate_Sequence_frag(double), "header") { SWIGINTERN int SWIG_FromCreate_Sequence_dec(double)(int size, double **pSequence) { *pSequence = new double[size]; return *pSequence != NULL ? SWIG_OK : SWIG_ERROR; } } %fragment(SWIG_FromSet_Sequence_frag(double), "header", fragment="SWIG_SciDouble_FromDoubleArrayAndSize") { SWIGINTERN SwigSciObject SWIG_FromSet_Sequence_dec(double)(int size, double *pSequence) { SwigSciObject obj = SWIG_SciDouble_FromDoubleArrayAndSize(pvApiCtx, SWIG_Scilab_GetOutputPosition(), 1, size, pSequence); delete (double *)pSequence; return obj; } } %fragment(SWIG_AsVal_SequenceItem_frag(double), "header") { SWIGINTERN double SWIG_AsVal_SequenceItem_dec(double)(SwigSciObject obj, double *pSequence, int iItemIndex) { return pSequence[iItemIndex]; } } %fragment(SWIG_From_SequenceItem_frag(double), "header") { SWIGINTERN int SWIG_From_SequenceItem_dec(double)(double *pSequence, int iItemIndex, double itemValue) { pSequence[iItemIndex] = itemValue; return SWIG_OK; } } swig-4.0.1/Lib/scilab/exception.i0000644000175000017500000000020213527063513016455 0ustar williamwilliam%include %insert("runtime") { %define_as(SWIG_exception(code, msg), SWIG_Scilab_Error(code, msg);) } swig-4.0.1/Lib/scilab/std_list.i0000644000175000017500000000141713527063513016315 0ustar williamwilliam/* * * C++ type : STL list * Scilab type : matrix (for primitive types) or list (for pointer types) * */ %fragment("StdListTraits", "header", fragment="StdSequenceTraits") %{ namespace swig { template struct traits_asptr > { static int asptr(SwigSciObject obj, std::list **lis) { return traits_asptr_stdseq >::asptr(obj, lis); } }; template struct traits_from > { static SwigSciObject from(const std::list &lis) { return traits_from_stdseq >::from(lis); } }; } %} #define %swig_list_methods(Type...) %swig_sequence_methods(Type) #define %swig_list_methods_val(Type...) %swig_sequence_methods_val(Type); %include swig-4.0.1/Lib/scilab/scimisctypes.swg0000644000175000017500000000417113527063513017557 0ustar williamwilliam// Other primitive such as size_t and ptrdiff_t /* * C-type: size_t * Scilab type: double or int32 */ %fragment(SWIG_AsVal_frag(size_t), "header", fragment="SWIG_Int_AsSize") { %#define SWIG_AsVal_size_t(scilabValue, valuePointer) SWIG_Int_AsSize(pvApiCtx, scilabValue, valuePointer, SWIG_Scilab_GetFuncName()) } %fragment("SWIG_Int_AsSize", "header", fragment=SWIG_AsVal_frag(int)) { SWIGINTERN int SWIG_Int_AsSize(void *pvApiCtx, SwigSciObject iVar, size_t *piValue, char *fname) { int iValue = 0; if (SWIG_AsVal_dec(int)(iVar, &iValue) != SWIG_OK) return SWIG_ERROR; if (piValue) *piValue = (size_t) iValue; return SWIG_OK; } } %fragment(SWIG_From_frag(size_t), "header", fragment="SWIG_Int_FromSize") { %#define SWIG_From_size_t(scilabValue) SWIG_Int_FromSize(pvApiCtx, SWIG_Scilab_GetOutputPosition(), scilabValue, SWIG_Scilab_GetFuncName()) } %fragment("SWIG_Int_FromSize", "header", fragment=SWIG_From_frag(int)) { SWIGINTERN int SWIG_Int_FromSize(void *pvApiCtx, int iVarOut, size_t iValue, char *fname) { return SWIG_From_dec(int)((int)iValue); } } /* * C-type: ptrdiff_t * Scilab type: double or int32 */ %fragment(SWIG_AsVal_frag(ptrdiff_t), "header", fragment="SWIG_Int_AsPtrDiff") { %#define SWIG_AsVal_ptrdiff_t(scilabValue, valuePointer) SWIG_Int_AsPtrDiff(pvApiCtx, scilabValue, valuePointer, SWIG_Scilab_GetFuncName()) } %fragment("SWIG_Int_AsPtrDiff", "header", fragment=SWIG_AsVal_frag(int)) { SWIGINTERN int SWIG_Int_AsPtrDiff(void *pvApiCtx, SwigSciObject iVar, ptrdiff_t *piValue, char *fname) { int iValue = 0; if (SWIG_AsVal_dec(int)(iVar, &iValue) != SWIG_OK) return SWIG_ERROR; if (piValue) *piValue = (ptrdiff_t) iValue; return SWIG_OK; } } %fragment(SWIG_From_frag(ptrdiff_t), "header", fragment="SWIG_Int_FromPtrDiff") { %#define SWIG_From_ptrdiff_t(scilabValue) SWIG_Int_FromPtrDiff(pvApiCtx, SWIG_Scilab_GetOutputPosition(), scilabValue, SWIG_Scilab_GetFuncName()) } %fragment("SWIG_Int_FromPtrDiff", "header", fragment=SWIG_From_frag(int)) { SWIGINTERN int SWIG_Int_FromPtrDiff(void *pvApiCtx, int iVarOut, ptrdiff_t iValue, char *fname) { return SWIG_From_dec(int)((int)iValue); } } swig-4.0.1/Lib/scilab/scimatrixchar.swg0000644000175000017500000001201313527063513017673 0ustar williamwilliam/* * C-type: char* * Scilab type: string matrix */ %include // in (char **IN, int IN_ROWCOUNT, int IN_COLCOUNT) %typemap(in, noblock=1, fragment="SWIG_SciString_AsCharPtrArrayAndSize") (char **IN, int IN_ROWCOUNT, int IN_COLCOUNT) { if (SWIG_SciString_AsCharPtrArrayAndSize(pvApiCtx, $input, &$2, &$3, &$1, fname) != SWIG_OK) { return SWIG_ERROR; } } // in (int IN_ROWCOUNT, int IN_COLCOUNT, char **IN) %typemap(in, noblock=1, fragment="SWIG_SciString_AsCharPtrArrayAndSize") (int IN_ROWCOUNT, int IN_COLCOUNT, char **IN) { if (SWIG_SciString_AsCharPtrArrayAndSize(pvApiCtx, $input, &$1, &$2, &$3, fname) != SWIG_OK) { return SWIG_ERROR; } } // in (char **IN, int IN_SIZE) %typemap(in, noblock=1, fragment="SWIG_SciString_AsCharPtrArrayAndSize") (char **IN, int IN_SIZE) (int rowCount, int colCount) { if (SWIG_SciString_AsCharPtrArrayAndSize(pvApiCtx, $input, &rowCount, &colCount, &$1, fname) == SWIG_OK) { $2 = rowCount * colCount; } else { return SWIG_ERROR; } } // in (int IN_SIZE, char **IN) %typemap(in, noblock=1, fragment="SWIG_SciString_AsCharPtrArrayAndSize") (int IN_SIZE, char **IN) (int rowCount, int colCount) { if (SWIG_SciString_AsCharPtrArrayAndSize(pvApiCtx, $input, &rowCount, &colCount, &$2, fname) == SWIG_OK) { $1 = rowCount * colCount; } else { return SWIG_ERROR; } } // out (char ***OUT, int *OUT_ROWCOUNT, int *OUT_COLCOUNT) %typemap(in, noblock=1, numinputs=0) (char ***OUT, int *OUT_ROWCOUNT, int *OUT_COLCOUNT) { } %typemap(arginit, noblock=1) (char ***OUT, int *OUT_ROWCOUNT, int *OUT_COLCOUNT) { $1 = (char***) malloc(sizeof(char**)); $2 = (int*) malloc(sizeof(int)); $3 = (int*) malloc(sizeof(int)); } %typemap(argout, noblock=1, fragment="SWIG_SciString_FromCharPtrArrayAndSize") (char ***OUT, int *OUT_ROWCOUNT, int *OUT_COLCOUNT) { if (SWIG_SciString_FromCharPtrArrayAndSize(pvApiCtx, SWIG_Scilab_GetOutputPosition(), *$2, *$3, *$1) == SWIG_OK) { SWIG_Scilab_SetOutput(pvApiCtx, SWIG_NbInputArgument(pvApiCtx) + SWIG_Scilab_GetOutputPosition()); } else { return SWIG_ERROR; } } %typemap(freearg, noblock=1) (char ***OUT, int *OUT_ROWCOUNT, int *OUT_COLCOUNT) { { int i; for (i = 0; i < (*$2) * (*$3); i++) free((*$1)[i]); } free(*$1); free($1); free($2); free($3); } // out (int *OUT_ROWCOUNT, int *OUT_COLCOUNT, char ***OUT) %typemap(in, noblock=1, numinputs=0) (int *OUT_ROWCOUNT, int *OUT_COLCOUNT, char ***OUT) { } %typemap(arginit, noblock=1) (int *OUT_ROWCOUNT, int *OUT_COLCOUNT, char ***OUT) { $1 = (char***) malloc(sizeof(char**)); $2 = (int*) malloc(sizeof(int)); $3 = (int**) malloc(sizeof(int*)); } %typemap(argout, noblock=1, fragment="SWIG_SciString_FromCharPtrArrayAndSize") (int *OUT_ROWCOUNT, int *OUT_COLCOUNT, char ***OUT) { if (SWIG_SciString_FromCharPtrArrayAndSize(pvApiCtx, SWIG_Scilab_GetOutputPosition(), *$1, *$2, *$3) == SWIG_OK) { SWIG_Scilab_SetOutput(pvApiCtx, SWIG_NbInputArgument(pvApiCtx) + SWIG_Scilab_GetOutputPosition()); } else { return SWIG_ERROR; } } %typemap(freearg, noblock=1) (int *OUT_ROWCOUNT, int *OUT_COLCOUNT, char ***OUT) { free($1); free($2); { int i; for (i = 0; i < (*$1) * (*$2); i++) free((*$3)[i]); } free(*$3); free($3); } // out (char ***OUT, int *OUT_SIZE) %typemap(in, noblock=1, numinputs=0) (char ***OUT, int *OUT_SIZE) { } %typemap(arginit, noblock=1) (char ***OUT, int *OUT_SIZE) { $1 = (char***) malloc(sizeof(char**)); $2 = (int*) malloc(sizeof(int)); } %typemap(freearg, noblock=1) (char ***OUT, int *OUT_SIZE) { { int i; for (i = 0; i < *$2; i++) free((*$1)[i]); } free(*$1); free($1); free($2); } %typemap(argout, noblock=1, fragment="SWIG_SciString_FromCharPtrArrayAndSize") (char ***OUT, int *OUT_SIZE) { if (SWIG_SciString_FromCharPtrArrayAndSize(pvApiCtx, SWIG_Scilab_GetOutputPosition(), 1, *$2, *$1) == SWIG_OK) { SWIG_Scilab_SetOutput(pvApiCtx, SWIG_NbInputArgument(pvApiCtx) + SWIG_Scilab_GetOutputPosition()); } else { return SWIG_ERROR; } } // in (int IN_SIZE, char **IN) %typemap(in, noblock=1, fragment="SWIG_SciString_AsCharPtrArrayAndSize") (int IN_SIZE, char **IN) { if (SWIG_SciString_AsCharPtrArrayAndSize(pvApiCtx, $input, 1, &$1, &$2, fname) != SWIG_OK) { return SWIG_ERROR; } } // out (int *OUT_SIZE, char ***OUT) %typemap(in, noblock=1, numinputs=0) (int *OUT_SIZE, char ***OUT) { } %typemap(arginit, noblock=1) (int *OUT_SIZE, char ***OUT) { $1 = (int*) malloc(sizeof(int)); $2 = (char***) malloc(sizeof(char**)); } %typemap(argout, noblock=1, fragment="SWIG_SciString_FromCharPtrArrayAndSize") (int *OUT_SIZE, char ***OUT) { if (SWIG_SciString_FromCharPtrArrayAndSize(pvApiCtx, SWIG_Scilab_GetOutputPosition(), 1, *$1, *$2) == SWIG_OK) { SWIG_Scilab_SetOutput(pvApiCtx, SWIG_NbInputArgument(pvApiCtx) + SWIG_Scilab_GetOutputPosition()); } else { return SWIG_ERROR; } } %typemap(freearg, noblock=1) (int *OUT_SIZE, char ***OUT) { free($1); { int i; for (i = 0; i < *$1; i++) free((*$2)[i]); } free(*$2); free($2); } swig-4.0.1/Lib/scilab/sciunsignedshort.swg0000644000175000017500000001416313527063513020435 0ustar williamwilliam/* * C-type: unsigned short * Scilab type: double or uint16 */ %fragment(SWIG_AsVal_frag(unsigned short), "header", fragment="SWIG_SciDoubleOrUint16_AsUnsignedShort", fragment="") { %#define SWIG_AsVal_unsigned_SS_short(scilabValue, valuePointer) SWIG_SciDoubleOrUint16_AsUnsignedShort(pvApiCtx, scilabValue, valuePointer, SWIG_Scilab_GetFuncName()) } %fragment("SWIG_SciDoubleOrUint16_AsUnsignedShort", "header") { SWIGINTERN int SWIG_SciDoubleOrUint16_AsUnsignedShort(void *pvApiCtx, int iVar, unsigned short *pusValue, char *fname) { SciErr sciErr; int iType = 0; int iRows = 0; int iCols = 0; int iPrec = 0; int *piAddrVar = NULL; unsigned short *pusData = NULL; sciErr = getVarAddressFromPosition(pvApiCtx, iVar, &piAddrVar); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } sciErr = getVarType(pvApiCtx, piAddrVar, &iType); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (iType == sci_ints) { if (pusValue) { sciErr = getMatrixOfIntegerPrecision(pvApiCtx, piAddrVar, &iPrec); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (iPrec != SCI_UINT16) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong type for input argument #%d: A 16-bit unsigned integer or a double expected.\n"), fname, iVar); return SWIG_ERROR; } sciErr = getMatrixOfUnsignedInteger16(pvApiCtx, piAddrVar, &iRows, &iCols, &pusData); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (iRows * iCols != 1) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong size for input argument #%d: A 16-bit unsigned integer or a double expected.\n"), fname, iVar); return SWIG_ERROR; } *pusValue = *pusData; } } else if (iType == sci_matrix) { if (pusValue) { double *pdData = NULL; double dValue = 0.0f; sciErr = getMatrixOfDouble(pvApiCtx, piAddrVar, &iRows, &iCols, &pdData); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (iRows * iCols != 1) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong size for input argument #%d: A 16-bit unsigned integer or a double expected.\n"), fname, iVar); return SWIG_TypeError; } dValue = *pdData; if (dValue != floor(dValue)) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Incorrect value for input argument #%d: The double value cannot be converted to a 16-bit unsigned integer.\n"), fname, iVar); return SWIG_ValueError; } if ((dValue < 0) || (dValue > USHRT_MAX)) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Overflow error for input argument #%d: The double value cannot be converted to a 16-bit unsigned integer.\n"), fname, iVar); return SWIG_OverflowError; } *pusValue = (unsigned short) dValue; } } else { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong type for input argument #%d: A 16-bit unsigned integer or a double expected.\n"), fname, iVar); return SWIG_ERROR; } return SWIG_OK; } } %fragment(SWIG_From_frag(unsigned short), "header", fragment="SWIG_SciDouble_FromUnsignedShort") { %#define SWIG_From_unsigned_SS_short(scilabValue) SWIG_SciDouble_FromUnsignedShort(pvApiCtx, SWIG_Scilab_GetOutputPosition(), scilabValue, SWIG_Scilab_GetFuncName()) } %fragment("SWIG_SciDouble_FromUnsignedShort", "header") { SWIGINTERN int SWIG_SciDouble_FromUnsignedShort(void *pvApiCtx, int iVarOut, unsigned short usValue, char *fname) { if (createScalarDouble(pvApiCtx, SWIG_NbInputArgument(pvApiCtx) + iVarOut, (double) usValue)) return SWIG_ERROR; return SWIG_OK; } } /* * C-type: unsigned short[] * Scilab type: uint16 vector */ %fragment("SWIG_SciDoubleOrUint16_AsUnsignedShortArrayAndSize", "header") { SWIGINTERN int SWIG_SciDoubleOrUint16_AsUnsignedShortArrayAndSize(void *pvApiCtx, int iVar, int *iRows, int *iCols, unsigned short **pusValue, char *fname) { SciErr sciErr; int iType = 0; int iPrec = 0; int *piAddrVar = NULL; sciErr = getVarAddressFromPosition(pvApiCtx, iVar, &piAddrVar); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } sciErr = getVarType(pvApiCtx, piAddrVar, &iType); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (iType == sci_matrix) { double *pdData = NULL; int size = 0; int i; sciErr = getMatrixOfDouble(pvApiCtx, piAddrVar, iRows, iCols, &pdData); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } size = (*iRows) * (*iCols); *pusValue = (unsigned short*) malloc(size * sizeof(int*)); for (i = 0; i < size; i++) (*pusValue)[i] = (unsigned short) pdData[i]; } else if (iType == sci_ints) { sciErr = getMatrixOfIntegerPrecision(pvApiCtx, piAddrVar, &iPrec); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (iPrec != SCI_UINT16) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong type for input argument #%d: A 16-bit unsigned integer or a double vector expected.\n"), fname, iVar); return SWIG_ERROR; } sciErr = getMatrixOfUnsignedInteger16(pvApiCtx, piAddrVar, iRows, iCols, pusValue); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } } else { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong type for input argument #%d: A 16-bit unsigned integer or a double vector expected.\n"), fname, iVar); return SWIG_ERROR; } return SWIG_OK; } } %fragment("SWIG_SciDouble_FromUnsignedShortArrayAndSize", "header") { SWIGINTERN int SWIG_SciDouble_FromUnsignedShortArrayAndSize(void *pvApiCtx, int iVarOut, int iRows, int iCols, unsigned short *pusValues) { SciErr sciErr; double *pdValues = NULL; int i; pdValues = (double*) malloc(iRows * iCols * sizeof(double)); for (i=0; i swig-4.0.1/Lib/scilab/sciruntime.swg0000644000175000017500000000170213527063513017217 0ustar williamwilliam%insert(runtime) "swigrun.swg"; %insert(runtime) "swigerrors.swg"; %insert(runtime) "scirun.swg"; %insert(init) %{ /* Module management functions */ #define SWIG_GetModule(clientdata) SWIG_Scilab_GetModule() #define SWIG_SetModule(clientdata, pointer) SWIG_Scilab_SetModule(pointer) SWIGRUNTIME swig_module_info* SWIG_Scilab_GetModule(void) { return NULL; } SWIGRUNTIME void SWIG_Scilab_SetModule(swig_module_info *swig_module) { } %} %insert(init) "swiginit.swg" %insert(init) %{ SWIGRUNTIME swig_type_info * SWIG_Scilab_TypeQuery(const char *name) { if (SWIG_Module_Initialized()) { if (name) { return SWIG_TypeQuery(name); } } else { SWIG_Error(SWIG_RuntimeError, "the module is not initialized"); } return NULL; } %} %insert(init) %{ #ifdef __cplusplus extern "C" #endif int _Init(SWIG_GatewayParameters) { SWIG_InitializeModule(NULL); SWIG_CreateScilabVariables(pvApiCtx); swig_module_initialized = 1; %} swig-4.0.1/Lib/scilab/std_map.i0000644000175000017500000000463013527063513016117 0ustar williamwilliam// // SWIG typemaps for std::map // // Common implementation %include // ------------------------------------------------------------------------ // std::map // ------------------------------------------------------------------------ %{ #include #include #include %} // exported class namespace std { template > class map { // add typemaps here public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef K key_type; typedef T mapped_type; typedef std::pair< const K, T > value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; map(); map(const map& other); unsigned int size() const; bool empty() const; void clear(); %extend { const T& get(const K& key) throw (std::out_of_range) { std::map< K, T, C >::iterator i = self->find(key); if (i != self->end()) return i->second; else throw std::out_of_range("key not found"); } void set(const K& key, const T& x) { (*self)[key] = x; } void del(const K& key) throw (std::out_of_range) { std::map< K, T, C >::iterator i = self->find(key); if (i != self->end()) self->erase(i); else throw std::out_of_range("key not found"); } bool has_key(const K& key) { std::map< K, T, C >::iterator i = self->find(key); return i != self->end(); } } }; // Legacy macros (deprecated) %define specialize_std_map_on_key(K,CHECK,CONVERT_FROM,CONVERT_TO) #warning "specialize_std_map_on_key ignored - macro is deprecated and no longer necessary" %enddef %define specialize_std_map_on_value(T,CHECK,CONVERT_FROM,CONVERT_TO) #warning "specialize_std_map_on_value ignored - macro is deprecated and no longer necessary" %enddef %define specialize_std_map_on_both(K,CHECK_K,CONVERT_K_FROM,CONVERT_K_TO, T,CHECK_T,CONVERT_T_FROM,CONVERT_T_TO) #warning "specialize_std_map_on_both ignored - macro is deprecated and no longer necessary" %enddef } swig-4.0.1/Lib/scilab/scitypemaps.swg0000644000175000017500000002372213527063513017404 0ustar williamwilliam// Scilab fragments for primitive types %include %include // Scilab object type #define SWIG_Object int #define %append_output(obj) if (!SWIG_IsOK(SWIG_Scilab_SetOutput(pvApiCtx, obj))) return SWIG_ERROR #define %set_constant(name, obj) if (!SWIG_IsOK(SWIG_Scilab_SetOutput(pvApiCtx, obj))) return SWIG_ERROR // Name is managed by the function name #define %raise(obj, type, desc) SWIG_Scilab_Raise(obj, type, desc) #define %set_output(obj) if (!SWIG_IsOK(SWIG_Scilab_SetOutput(pvApiCtx, obj))) return SWIG_ERROR #define %set_varoutput(obj) if (!SWIG_IsOK(SWIG_Scilab_SetOutput(pvApiCtx, obj))) return SWIG_ERROR #define %set_argoutput(obj) if (!SWIG_IsOK(SWIG_Scilab_SetOutput(pvApiCtx, obj))) return SWIG_ERROR // Include the unified typemap library %include /* ---------------------------------------------------------------------------*/ /* Generic typmemaps */ /* */ /* This typemap is used when Scilab does not store this type directly */ /* For example, a 'float' is stored in Scilab as a 'double' */ /* So we read a 'double' in Scilab and cast it to a 'float' */ /* ---------------------------------------------------------------------------*/ %define %scilab_in_typemap_withcast(TYPEMAPTYPE, FRAGMENTNAME, CTYPE, TEMPTYPE, TEMPINIT) %typemap(TYPEMAPTYPE, fragment="FRAGMENTNAME") CTYPE { TEMPTYPE tempValue = TEMPINIT; if(FRAGMENTNAME(pvApiCtx, $input, &tempValue, SWIG_Scilab_GetFuncName()) != SWIG_OK) { return SWIG_ERROR; } $1 = (CTYPE) tempValue; } %enddef %define %scilab_inptr_typemap(TYPEMAPTYPE, FRAGMENTNAME, CTYPE) %typemap(TYPEMAPTYPE, noblock=1, fragment="FRAGMENTNAME") CTYPE { if (FRAGMENTNAME(pvApiCtx, $input, %as_voidptrptr(&$1), SWIG_Scilab_GetFuncName()) != SWIG_OK) { return SWIG_ERROR; } } %enddef %define %scilab_out_typemap(TYPEMAPTYPE, FRAGMENTNAME, CTYPE) %typemap(TYPEMAPTYPE, noblock=1, fragment="FRAGMENTNAME") CTYPE { if (FRAGMENTNAME(pvApiCtx, $result, $1) != SWIG_OK) { return SWIG_ERROR; } } %enddef %define %scilab_outptr_typemap(TYPEMAPTYPE, FRAGMENTNAME, CTYPE) %typemap(TYPEMAPTYPE, noblock=1, fragment="FRAGMENTNAME") CTYPE { if (FRAGMENTNAME(pvApiCtx, $result, %as_voidptr($1)) != SWIG_OK) { return SWIG_ERROR; } } %enddef %define %scilab_varout_typemap(TYPEMAPTYPE, FRAGMENTNAME, CTYPE) %typemap(TYPEMAPTYPE, noblock=1, fragment="FRAGMENTNAME") CTYPE { if (FRAGMENTNAME(pvApiCtx, $result, $value) != SWIG_OK) { return SWIG_ERROR; } } %enddef %define %scilab_varoutptr_typemap(TYPEMAPTYPE, FRAGMENTNAME, CTYPE) %typemap(TYPEMAPTYPE, noblock=1, fragment="FRAGMENTNAME") CTYPE { if (FRAGMENTNAME(pvApiCtx, $result, %as_voidptr($value)) != SWIG_OK) { return SWIG_ERROR; } } %enddef %define %scilab_in_typemap(TYPEMAPTYPE, FRAGMENTNAME, CTYPE) %typemap(TYPEMAPTYPE, noblock=1, fragment="FRAGMENTNAME") CTYPE { if (FRAGMENTNAME(pvApiCtx, $input, &$1, SWIG_Scilab_GetFuncName()) != SWIG_OK) { return SWIG_ERROR; } } %enddef /* ---------------------------------------------------------------------------*/ /* Array typmemaps */ /* ---------------------------------------------------------------------------*/ %include /* ---------------------------------------------------------------------------*/ /* Enum typemaps */ /* ---------------------------------------------------------------------------*/ %typemap(in, noblock=1, fragment=SWIG_AsVal_frag(Enum)) enum SWIGTYPE (int val) { if (SWIG_AsVal_dec(Enum)($input, &val) != SWIG_OK) { return SWIG_ERROR; } $1 = %static_cast(val, $1_ltype); } %typemap(out, fragment=SWIG_From_frag(Enum)) enum SWIGTYPE { if (SWIG_From_dec(Enum)($1) != SWIG_OK) { return SWIG_ERROR; } } /* ---------------------------------------------------------------------------*/ /* Typecheck typemaps */ /* ---------------------------------------------------------------------------*/ %define %scilab_typecheck_generic(PRECEDENCE, TYPE_CHECK_FUNCTION, TYPE) %typecheck(PRECEDENCE) TYPE { int *piAddrVar = NULL; SciErr sciErr = getVarAddressFromPosition(pvApiCtx, $input, &piAddrVar); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } $1 = TYPE_CHECK_FUNCTION(pvApiCtx, piAddrVar); } %enddef %fragment("SWIG_Check_SciDoubleOrInt", "header") { SWIGINTERN int SWIG_Check_SciDoubleOrInt(void *pvApiCtx, SwigSciObject iVar, int iIntegerType) { int *piAddrVar = NULL; int ret = 0; SciErr sciErr = getVarAddressFromPosition(pvApiCtx, iVar, &piAddrVar); if (sciErr.iErr) { printError(&sciErr, 0); return 0; } ret = isIntegerType(pvApiCtx, piAddrVar); if (ret == 1) { int iPrec = 0; sciErr = getMatrixOfIntegerPrecision(pvApiCtx, piAddrVar, &iPrec); if (sciErr.iErr) { printError(&sciErr, 0); return 0; } ret = (iPrec == iIntegerType) ? 1 : 0; } else { ret = isDoubleType(pvApiCtx, piAddrVar); } return ret; } } /* Scilab equivalent for C integers can be sci_intXX or sci_matrix */ %define %scilab_typecheck_integer(PRECEDENCE, INTTYPE, TYPE) %typecheck(PRECEDENCE, fragment="SWIG_Check_SciDoubleOrInt") TYPE { $1 = SWIG_Check_SciDoubleOrInt(pvApiCtx, $input, INTTYPE); } %enddef %define %scilab_typecheck_pointer(PRECEDENCE, TYPE) %typecheck(PRECEDENCE) TYPE { $1 = SwigScilabCheckPtr(pvApiCtx, $input, $descriptor, SWIG_Scilab_GetFuncName()); } %enddef // Double (and Float) have priority over before Integer type. // Primitive types %scilab_typecheck_pointer(SWIG_TYPECHECK_VOIDPTR, SWIGTYPE *) %scilab_typecheck_pointer(SWIG_TYPECHECK_POINTER, SWIGTYPE *) %scilab_typecheck_generic(SWIG_TYPECHECK_BOOL, isBooleanType, bool) %scilab_typecheck_generic(16, isDoubleType, double) %scilab_typecheck_generic(17, isDoubleType, float) %scilab_typecheck_integer(SWIG_TYPECHECK_INT8, SCI_INT8, signed char) %scilab_typecheck_integer(SWIG_TYPECHECK_UINT8, SCI_UINT8, unsigned char) %scilab_typecheck_integer(SWIG_TYPECHECK_INT16, SCI_INT16, short) %scilab_typecheck_integer(SWIG_TYPECHECK_UINT16, SCI_UINT16, unsigned short) %scilab_typecheck_integer(SWIG_TYPECHECK_INT32, SCI_INT32, int) %scilab_typecheck_integer(SWIG_TYPECHECK_INT32, SCI_INT32, long) %scilab_typecheck_integer(SWIG_TYPECHECK_UINT32, SCI_UINT32, unsigned int) %scilab_typecheck_integer(SWIG_TYPECHECK_UINT32, SCI_UINT32, unsigned long) %scilab_typecheck_integer(SWIG_TYPECHECK_INT32, SCI_INT32, enum SWIGTYPE) %scilab_typecheck_generic(SWIG_TYPECHECK_CHAR, isStringType, char) // Arrays %scilab_typecheck_generic(SWIG_TYPECHECK_BOOL_ARRAY, isBooleanType, bool) %scilab_typecheck_generic(1016, isDoubleType, double [ANY]) %scilab_typecheck_generic(1017, isDoubleType, float [ANY]) %scilab_typecheck_integer(SWIG_TYPECHECK_INT8_ARRAY, SCI_INT8, signed char [ANY]) %scilab_typecheck_integer(1026, SCI_UINT8, unsigned char [ANY]) %scilab_typecheck_integer(SWIG_TYPECHECK_INT16_ARRAY, SCI_INT16, short [ANY]) %scilab_typecheck_integer(1036, SCI_UINT16, unsigned short [ANY]) %scilab_typecheck_integer(SWIG_TYPECHECK_INT32_ARRAY, SCI_INT32, int [ANY]) %scilab_typecheck_integer(SWIG_TYPECHECK_INT32_ARRAY, SCI_INT32, long [ANY]) %scilab_typecheck_integer(1046, SCI_UINT32, unsigned int [ANY]) %scilab_typecheck_integer(1046, SCI_UINT32, unsigned long [ANY]) %scilab_typecheck_generic(SWIG_TYPECHECK_CHAR_ARRAY, isStringType, char [ANY]) %scilab_typecheck_generic(SWIG_TYPECHECK_STRING_ARRAY, isStringType, char *[ANY]) %scilab_typecheck_generic(SWIG_TYPECHECK_STRING_ARRAY, isStringType, char **) /* ---------------------------------------------------------------------------*/ /* %scilabconstcode() feature typemaps */ /* ---------------------------------------------------------------------------*/ %typemap(scilabconstcode, fragment=SWIG_CreateScilabVariable_frag(double)) double %{ if (SWIG_CreateScilabVariable_double(pvApiCtx, "$result", $value) != SWIG_OK) return SWIG_ERROR; %} %typemap(scilabconstcode, fragment=SWIG_CreateScilabVariable_frag(int)) int %{ if (SWIG_CreateScilabVariable_int(pvApiCtx, "$result", $value) != SWIG_OK) return SWIG_ERROR; %} %typemap(scilabconstcode, fragment=SWIG_CreateScilabVariable_frag(uint)) unsigned int %{ if (SWIG_CreateScilabVariable_uint(pvApiCtx, "$result", $value) != SWIG_OK) return SWIG_ERROR; %} %typemap(scilabconstcode, fragment=SWIG_CreateScilabVariable_frag(int)) long %{ if (SWIG_CreateScilabVariable_int(pvApiCtx, "$result", $value) != SWIG_OK) return SWIG_ERROR; %} %typemap(scilabconstcode, fragment=SWIG_CreateScilabVariable_frag(uint)) unsigned long %{ if (SWIG_CreateScilabVariable_uint(pvApiCtx, "$result", $value) != SWIG_OK) return SWIG_ERROR; %} %typemap(scilabconstcode, fragment=SWIG_CreateScilabVariable_frag(char)) char %{ if (SWIG_CreateScilabVariable_char(pvApiCtx, "$result", $value) != SWIG_OK) return SWIG_ERROR; %} %typemap(scilabconstcode, fragment=SWIG_CreateScilabVariable_frag(charptr)) char * %{ if (SWIG_CreateScilabVariable_charptr(pvApiCtx, "$result", $value) != SWIG_OK) return SWIG_ERROR; %} %typemap(scilabconstcode, fragment=SWIG_CreateScilabVariable_frag(double)) enum SWIGTYPE %{ if (SWIG_CreateScilabVariable_double(pvApiCtx, "$result", $value) != SWIG_OK) return SWIG_ERROR; %} /* ---------------------------------------------------------------------------*/ /* Exception typmemaps */ /* ---------------------------------------------------------------------------*/ %include swig-4.0.1/Lib/scilab/boost_shared_ptr.i0000644000175000017500000005160213527063513020032 0ustar williamwilliam%include // Set SHARED_PTR_DISOWN to $disown if required, for example // #define SHARED_PTR_DISOWN $disown #if !defined(SHARED_PTR_DISOWN) #define SHARED_PTR_DISOWN 0 #endif // Language specific macro implementing all the customisations for handling the smart pointer %define SWIG_SHARED_PTR_TYPEMAPS(CONST, TYPE...) // %naturalvar is as documented for member variables %naturalvar TYPE; %naturalvar SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >; // destructor wrapper customisation %feature("unref") TYPE //"if (debug_shared) { cout << \"deleting use_count: \" << (*smartarg1).use_count() << \" [\" << (boost::get_deleter(*smartarg1) ? std::string(\"CANNOT BE DETERMINED SAFELY\") : ( (*smartarg1).get() ? (*smartarg1)->getValue() : std::string(\"NULL PTR\") )) << \"]\" << endl << flush; }\n" "(void)arg1; delete smartarg1;" // Typemap customisations... // plain value %typemap(in) CONST TYPE (void *argp, int res = 0) { int newmem = 0; res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } if (!argp) { %argument_nullref("$type", $symname, $argnum); } else { $1 = *(%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *)->get()); if (newmem & SWIG_CAST_NEW_MEMORY) delete %reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); } } %typemap(out) CONST TYPE { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(new $1_ltype(($1_ltype &)$1)); %set_output(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } %typemap(varin) CONST TYPE { void *argp = 0; int newmem = 0; int res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %variable_fail(res, "$type", "$name"); } if (!argp) { %variable_nullref("$type", "$name"); } else { $1 = *(%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *)->get()); if (newmem & SWIG_CAST_NEW_MEMORY) delete %reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); } } %typemap(varout) CONST TYPE { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(new $1_ltype(($1_ltype &)$1)); %set_varoutput(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } %typemap(directorin,noblock=1) CONST TYPE (SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0) %{ smartarg = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(new $1_ltype(($1_ltype &)$1)); $input = SWIG_NewPointerObj(%as_voidptr(smartarg), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN | %newpointer_flags); %} %typemap(directorout,noblock=1) CONST TYPE (void *swig_argp, int swig_res = 0) { int newmem = 0; swig_res = SWIG_ConvertPtrAndOwn($input, &swig_argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(swig_res)) { %dirout_fail(swig_res, "$type"); } if (!swig_argp) { %dirout_nullref("$type"); } else { $result = *(%reinterpret_cast(swig_argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *)->get()); if (newmem & SWIG_CAST_NEW_MEMORY) delete %reinterpret_cast(swig_argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); } } // plain pointer // Note: $disown not implemented by default as it will lead to a memory leak of the shared_ptr instance %typemap(in) CONST TYPE * (void *argp = 0, int res = 0, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > tempshared, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0) { int newmem = 0; res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SHARED_PTR_DISOWN | %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } if (newmem & SWIG_CAST_NEW_MEMORY) { tempshared = *%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); delete %reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); $1 = %const_cast(tempshared.get(), $1_ltype); } else { smartarg = %reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); $1 = %const_cast((smartarg ? smartarg->get() : 0), $1_ltype); } } %typemap(out, fragment="SWIG_null_deleter") CONST TYPE * { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1 SWIG_NO_NULL_DELETER_$owner) : 0; %set_output(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), $owner | SWIG_POINTER_OWN)); } %typemap(varin) CONST TYPE * { void *argp = 0; int newmem = 0; int res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %variable_fail(res, "$type", "$name"); } SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > tempshared; SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0; if (newmem & SWIG_CAST_NEW_MEMORY) { tempshared = *%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); delete %reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); $1 = %const_cast(tempshared.get(), $1_ltype); } else { smartarg = %reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); $1 = %const_cast((smartarg ? smartarg->get() : 0), $1_ltype); } } %typemap(varout, fragment="SWIG_null_deleter") CONST TYPE * { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1 SWIG_NO_NULL_DELETER_0) : 0; %set_varoutput(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } %typemap(directorin,noblock=1, fragment="SWIG_null_deleter") CONST TYPE * (SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0) %{ smartarg = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1 SWIG_NO_NULL_DELETER_0) : 0; $input = SWIG_NewPointerObj(%as_voidptr(smartarg), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN | %newpointer_flags); %} %typemap(directorout,noblock=1) CONST TYPE * %{ #error "directorout typemap for plain pointer not implemented" %} // plain reference %typemap(in) CONST TYPE & (void *argp = 0, int res = 0, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > tempshared) { int newmem = 0; res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } if (!argp) { %argument_nullref("$type", $symname, $argnum); } if (newmem & SWIG_CAST_NEW_MEMORY) { tempshared = *%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); delete %reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); $1 = %const_cast(tempshared.get(), $1_ltype); } else { $1 = %const_cast(%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *)->get(), $1_ltype); } } %typemap(out, fragment="SWIG_null_deleter") CONST TYPE & { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1 SWIG_NO_NULL_DELETER_$owner); %set_output(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } %typemap(varin) CONST TYPE & { void *argp = 0; int newmem = 0; int res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %variable_fail(res, "$type", "$name"); } SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > tempshared; if (!argp) { %variable_nullref("$type", "$name"); } if (newmem & SWIG_CAST_NEW_MEMORY) { tempshared = *%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); delete %reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); $1 = *%const_cast(tempshared.get(), $1_ltype); } else { $1 = *%const_cast(%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *)->get(), $1_ltype); } } %typemap(varout, fragment="SWIG_null_deleter") CONST TYPE & { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(&$1 SWIG_NO_NULL_DELETER_0); %set_varoutput(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } %typemap(directorin,noblock=1, fragment="SWIG_null_deleter") CONST TYPE & (SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0) %{ smartarg = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(&$1 SWIG_NO_NULL_DELETER_0); $input = SWIG_NewPointerObj(%as_voidptr(smartarg), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN | %newpointer_flags); %} %typemap(directorout,noblock=1) CONST TYPE & %{ #error "directorout typemap for plain reference not implemented" %} // plain pointer by reference // Note: $disown not implemented by default as it will lead to a memory leak of the shared_ptr instance %typemap(in) TYPE *CONST& (void *argp = 0, int res = 0, $*1_ltype temp = 0, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > tempshared) { int newmem = 0; res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SHARED_PTR_DISOWN | %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } if (newmem & SWIG_CAST_NEW_MEMORY) { tempshared = *%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); delete %reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); temp = %const_cast(tempshared.get(), $*1_ltype); } else { temp = %const_cast(%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *)->get(), $*1_ltype); } $1 = &temp; } %typemap(out, fragment="SWIG_null_deleter") TYPE *CONST& { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = *$1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(*$1 SWIG_NO_NULL_DELETER_$owner) : 0; %set_output(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } %typemap(varin) TYPE *CONST& %{ #error "varin typemap not implemented" %} %typemap(varout) TYPE *CONST& %{ #error "varout typemap not implemented" %} %typemap(directorin,noblock=1, fragment="SWIG_null_deleter") TYPE *CONST& (SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0) %{ smartarg = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1 SWIG_NO_NULL_DELETER_0) : 0; $input = SWIG_NewPointerObj(%as_voidptr(smartarg), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN | %newpointer_flags); %} %typemap(directorout,noblock=1) TYPE *CONST& %{ #error "directorout typemap for plain pointer by reference not implemented" %} // shared_ptr by value %typemap(in) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > (void *argp, int res = 0) { int newmem = 0; res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } if (argp) $1 = *(%reinterpret_cast(argp, $<ype)); if (newmem & SWIG_CAST_NEW_MEMORY) delete %reinterpret_cast(argp, $<ype); } %typemap(out) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1) : 0; %set_output(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } %typemap(varin) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > { int newmem = 0; void *argp = 0; int res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %variable_fail(res, "$type", "$name"); } $1 = argp ? *(%reinterpret_cast(argp, $<ype)) : SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE >(); if (newmem & SWIG_CAST_NEW_MEMORY) delete %reinterpret_cast(argp, $<ype); } %typemap(varout) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1) : 0; %set_varoutput(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } %typemap(directorin,noblock=1) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > (SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0) %{ smartarg = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1) : 0; $input = SWIG_NewPointerObj(%as_voidptr(smartarg), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN | %newpointer_flags); %} %typemap(directorout,noblock=1) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > (void *swig_argp, int swig_res = 0) { int newmem = 0; swig_res = SWIG_ConvertPtrAndOwn($input, &swig_argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(swig_res)) { %dirout_fail(swig_res, "$type"); } if (swig_argp) { $result = *(%reinterpret_cast(swig_argp, $<ype)); if (newmem & SWIG_CAST_NEW_MEMORY) delete %reinterpret_cast(swig_argp, $<ype); } } // shared_ptr by reference %typemap(in) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > & (void *argp, int res = 0, $*1_ltype tempshared) { int newmem = 0; res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } if (newmem & SWIG_CAST_NEW_MEMORY) { if (argp) tempshared = *%reinterpret_cast(argp, $ltype); delete %reinterpret_cast(argp, $ltype); $1 = &tempshared; } else { $1 = (argp) ? %reinterpret_cast(argp, $ltype) : &tempshared; } } %typemap(out) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > & { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = *$1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(*$1) : 0; %set_output(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } %typemap(varin) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > & %{ #error "varin typemap not implemented" %} %typemap(varout) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > & %{ #error "varout typemap not implemented" %} %typemap(directorin,noblock=1) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > & (SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0) %{ smartarg = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1) : 0; $input = SWIG_NewPointerObj(%as_voidptr(smartarg), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN | %newpointer_flags); %} %typemap(directorout,noblock=1) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > & %{ #error "directorout typemap for shared_ptr ref not implemented" %} // shared_ptr by pointer %typemap(in) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * (void *argp, int res = 0, $*1_ltype tempshared) { int newmem = 0; res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } if (newmem & SWIG_CAST_NEW_MEMORY) { if (argp) tempshared = *%reinterpret_cast(argp, $ltype); delete %reinterpret_cast(argp, $ltype); $1 = &tempshared; } else { $1 = (argp) ? %reinterpret_cast(argp, $ltype) : &tempshared; } } %typemap(out) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = ($1 && *$1) ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(*$1) : 0; %set_output(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); if ($owner) delete $1; } %typemap(varin) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * %{ #error "varin typemap not implemented" %} %typemap(varout) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * %{ #error "varout typemap not implemented" %} %typemap(directorin,noblock=1) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * (SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0) %{ smartarg = ($1 && *$1) ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(*$1) : 0; $input = SWIG_NewPointerObj(%as_voidptr(smartarg), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN | %newpointer_flags); %} %typemap(directorout,noblock=1) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * %{ #error "directorout typemap for pointer to shared_ptr not implemented" %} // shared_ptr by pointer reference %typemap(in) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& (void *argp, int res = 0, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > tempshared, $*1_ltype temp = 0) { int newmem = 0; res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } if (argp) tempshared = *%reinterpret_cast(argp, $*ltype); if (newmem & SWIG_CAST_NEW_MEMORY) delete %reinterpret_cast(argp, $*ltype); temp = &tempshared; $1 = &temp; } %typemap(out) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = (*$1 && **$1) ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(**$1) : 0; %set_output(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } %typemap(varin) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& %{ #error "varin typemap not implemented" %} %typemap(varout) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& %{ #error "varout typemap not implemented" %} %typemap(directorin,noblock=1) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& (SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0) %{ smartarg = ($1 && *$1) ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(*$1) : 0; $input = SWIG_NewPointerObj(%as_voidptr(smartarg), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN | %newpointer_flags); %} %typemap(directorout,noblock=1) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& %{ #error "directorout typemap for pointer ref to shared_ptr not implemented" %} // Typecheck typemaps // Note: SWIG_ConvertPtr with void ** parameter set to 0 instead of using SWIG_ConvertPtrAndOwn, so that the casting // function is not called thereby avoiding a possible smart pointer copy constructor call when casting up the inheritance chain. %typemap(typecheck, precedence=SWIG_TYPECHECK_POINTER, equivalent="TYPE *", noblock=1) TYPE CONST, TYPE CONST &, TYPE CONST *, TYPE *CONST&, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > &, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& { int res = SWIG_ConvertPtr($input, 0, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), 0); $1 = SWIG_CheckState(res); } // various missing typemaps - If ever used (unlikely) ensure compilation error rather than runtime bug %typemap(in) CONST TYPE[], CONST TYPE[ANY], CONST TYPE (CLASS::*) %{ #error "typemaps for $1_type not available" %} %typemap(out) CONST TYPE[], CONST TYPE[ANY], CONST TYPE (CLASS::*) %{ #error "typemaps for $1_type not available" %} %template() SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >; %enddef swig-4.0.1/Lib/inttypes.i0000644000175000017500000000451413527063513015113 0ustar williamwilliam/* ----------------------------------------------------------------------------- * inttypes.i * * SWIG library file for ISO C99 types: 7.8 Format conversion of integer types * ----------------------------------------------------------------------------- */ %{ #include %} %include %include #ifdef __cplusplus extern "C" { #endif #ifdef SWIGWORDSIZE64 /* We have to define the `uintmax_t' type using `ldiv_t'. */ typedef struct { long int quot; /* Quotient. */ long int rem; /* Remainder. */ } imaxdiv_t; #else /* We have to define the `uintmax_t' type using `lldiv_t'. */ typedef struct { long long int quot; /* Quotient. */ long long int rem; /* Remainder. */ } imaxdiv_t; #endif /* Compute absolute value of N. */ extern intmax_t imaxabs (intmax_t n); /* Return the `imaxdiv_t' representation of the value of NUMER over DENOM. */ extern imaxdiv_t imaxdiv (intmax_t numer, intmax_t denom); #ifdef SWIG_WCHAR /* Like `wcstol' but convert to `intmax_t'. */ extern intmax_t wcstoimax (const wchar_t *nptr, wchar_t **endptr, int base); /* Like `wcstoul' but convert to `uintmax_t'. */ extern uintmax_t wcstoumax (const wchar_t *nptr, wchar_t ** endptr, int base); #endif #ifdef SWIGWORDSIZE64 /* Like `strtol' but convert to `intmax_t'. */ extern intmax_t strtoimax (const char *nptr, char **endptr, int base); /* Like `strtoul' but convert to `uintmax_t'. */ extern uintmax_t strtoumax (const char *nptr, char **endptr,int base); #ifdef SWIG_WCHAR /* Like `wcstol' but convert to `intmax_t'. */ extern intmax_t wcstoimax (const wchar_t *nptr, wchar_t **endptr, int base); /* Like `wcstoul' but convert to `uintmax_t'. */ extern uintmax_t wcstoumax (const wchar_t *nptr, wchar_t **endptr, int base); #endif #else /* SWIGWORDSIZE32 */ /* Like `strtol' but convert to `intmax_t'. */ extern intmax_t strtoimax (const char *nptr, char **endptr, int base); /* Like `strtoul' but convert to `uintmax_t'. */ extern uintmax_t strtoumax (const char *nptr, char **endptr, int base); #ifdef SWIG_WCHAR /* Like `wcstol' but convert to `intmax_t'. */ extern uintmax_t wcstoumax (const wchar_t *nptr, wchar_t **endptr, int base); #endif #endif /* SWIGWORDSIZE64 */ #ifdef __cplusplus } #endif swig-4.0.1/Lib/exception.i0000644000175000017500000002051113527063513015225 0ustar williamwilliam/* ----------------------------------------------------------------------------- * exception.i * * SWIG library file providing language independent exception handling * ----------------------------------------------------------------------------- */ #if defined(SWIGUTL) #error "This version of exception.i should not be used" #endif %insert("runtime") "swigerrors.swg" #ifdef SWIGPHP7 %{ #include "zend_exceptions.h" #define SWIG_exception(code, msg) do { zend_throw_exception(NULL, (char*)msg, code); goto thrown; } while (0) %} #endif #ifdef SWIGGUILE %{ SWIGINTERN void SWIG_exception_ (int code, const char *msg, const char *subr) { #define ERROR(scmerr) \ scm_error(scm_from_locale_string((char *) (scmerr)), \ (char *) subr, (char *) msg, \ SCM_EOL, SCM_BOOL_F) #define MAP(swigerr, scmerr) \ case swigerr: \ ERROR(scmerr); \ break switch (code) { MAP(SWIG_MemoryError, "swig-memory-error"); MAP(SWIG_IOError, "swig-io-error"); MAP(SWIG_RuntimeError, "swig-runtime-error"); MAP(SWIG_IndexError, "swig-index-error"); MAP(SWIG_TypeError, "swig-type-error"); MAP(SWIG_DivisionByZero, "swig-division-by-zero"); MAP(SWIG_OverflowError, "swig-overflow-error"); MAP(SWIG_SyntaxError, "swig-syntax-error"); MAP(SWIG_ValueError, "swig-value-error"); MAP(SWIG_SystemError, "swig-system-error"); default: ERROR("swig-error"); } #undef ERROR #undef MAP } #define SWIG_exception(a,b) SWIG_exception_(a, b, FUNC_NAME) %} #endif #ifdef SWIGMZSCHEME %{ SWIGINTERN void SWIG_exception_ (int code, const char *msg) { #define ERROR(errname) \ scheme_signal_error(errname " (%s)", msg); #define MAP(swigerr, errname) \ case swigerr: \ ERROR(errname); \ break switch (code) { MAP(SWIG_MemoryError, "swig-memory-error"); MAP(SWIG_IOError, "swig-io-error"); MAP(SWIG_RuntimeError, "swig-runtime-error"); MAP(SWIG_IndexError, "swig-index-error"); MAP(SWIG_TypeError, "swig-type-error"); MAP(SWIG_DivisionByZero, "swig-division-by-zero"); MAP(SWIG_OverflowError, "swig-overflow-error"); MAP(SWIG_SyntaxError, "swig-syntax-error"); MAP(SWIG_ValueError, "swig-value-error"); MAP(SWIG_SystemError, "swig-system-error"); default: ERROR("swig-error"); } #undef ERROR #undef MAP } #define SWIG_exception(a,b) SWIG_exception_(a, b) %} #endif #ifdef SWIGJAVA %{ SWIGINTERN void SWIG_JavaException(JNIEnv *jenv, int code, const char *msg) { SWIG_JavaExceptionCodes exception_code = SWIG_JavaUnknownError; switch(code) { case SWIG_MemoryError: exception_code = SWIG_JavaOutOfMemoryError; break; case SWIG_IOError: exception_code = SWIG_JavaIOException; break; case SWIG_SystemError: case SWIG_RuntimeError: exception_code = SWIG_JavaRuntimeException; break; case SWIG_OverflowError: case SWIG_IndexError: exception_code = SWIG_JavaIndexOutOfBoundsException; break; case SWIG_DivisionByZero: exception_code = SWIG_JavaArithmeticException; break; case SWIG_SyntaxError: case SWIG_ValueError: case SWIG_TypeError: exception_code = SWIG_JavaIllegalArgumentException; break; case SWIG_UnknownError: default: exception_code = SWIG_JavaUnknownError; break; } SWIG_JavaThrowException(jenv, exception_code, msg); } %} #define SWIG_exception(code, msg)\ { SWIG_JavaException(jenv, code, msg); return $null; } #endif // SWIGJAVA #ifdef SWIGOCAML %{ SWIGINTERN void SWIG_OCamlException(int code, const char *msg) { CAMLparam0(); SWIG_OCamlExceptionCodes exception_code = SWIG_OCamlUnknownError; switch (code) { case SWIG_DivisionByZero: exception_code = SWIG_OCamlArithmeticException; break; case SWIG_IndexError: exception_code = SWIG_OCamlIndexOutOfBoundsException; break; case SWIG_IOError: case SWIG_SystemError: exception_code = SWIG_OCamlSystemException; break; case SWIG_MemoryError: exception_code = SWIG_OCamlOutOfMemoryError; break; case SWIG_OverflowError: exception_code = SWIG_OCamlOverflowException; break; case SWIG_RuntimeError: exception_code = SWIG_OCamlRuntimeException; break; case SWIG_SyntaxError: case SWIG_TypeError: case SWIG_ValueError: exception_code = SWIG_OCamlIllegalArgumentException; break; case SWIG_UnknownError: default: exception_code = SWIG_OCamlUnknownError; break; } SWIG_OCamlThrowException(exception_code, msg); CAMLreturn0; } #define SWIG_exception(code, msg) SWIG_OCamlException(code, msg) %} #endif #ifdef SWIGCSHARP %{ SWIGINTERN void SWIG_CSharpException(int code, const char *msg) { if (code == SWIG_ValueError) { SWIG_CSharpExceptionArgumentCodes exception_code = SWIG_CSharpArgumentOutOfRangeException; SWIG_CSharpSetPendingExceptionArgument(exception_code, msg, 0); } else { SWIG_CSharpExceptionCodes exception_code = SWIG_CSharpApplicationException; switch(code) { case SWIG_MemoryError: exception_code = SWIG_CSharpOutOfMemoryException; break; case SWIG_IndexError: exception_code = SWIG_CSharpIndexOutOfRangeException; break; case SWIG_DivisionByZero: exception_code = SWIG_CSharpDivideByZeroException; break; case SWIG_IOError: exception_code = SWIG_CSharpIOException; break; case SWIG_OverflowError: exception_code = SWIG_CSharpOverflowException; break; case SWIG_RuntimeError: case SWIG_TypeError: case SWIG_SyntaxError: case SWIG_SystemError: case SWIG_UnknownError: default: exception_code = SWIG_CSharpApplicationException; break; } SWIG_CSharpSetPendingException(exception_code, msg); } } %} #define SWIG_exception(code, msg)\ { SWIG_CSharpException(code, msg); return $null; } #endif // SWIGCSHARP #ifdef SWIGLUA %{ #define SWIG_exception(a,b)\ { lua_pushfstring(L,"%s:%s",#a,b);SWIG_fail; } %} #endif // SWIGLUA #ifdef SWIGD %{ SWIGINTERN void SWIG_DThrowException(int code, const char *msg) { SWIG_DExceptionCodes exception_code; switch(code) { case SWIG_IndexError: exception_code = SWIG_DNoSuchElementException; break; case SWIG_IOError: exception_code = SWIG_DIOException; break; case SWIG_ValueError: exception_code = SWIG_DIllegalArgumentException; break; case SWIG_DivisionByZero: case SWIG_MemoryError: case SWIG_OverflowError: case SWIG_RuntimeError: case SWIG_TypeError: case SWIG_SyntaxError: case SWIG_SystemError: case SWIG_UnknownError: default: exception_code = SWIG_DException; break; } SWIG_DSetPendingException(exception_code, msg); } %} #define SWIG_exception(code, msg)\ { SWIG_DThrowException(code, msg); return $null; } #endif // SWIGD #ifdef __cplusplus /* You can use the SWIG_CATCH_STDEXCEPT macro with the %exception directive as follows: %exception { try { $action } catch (my_except& e) { ... } SWIG_CATCH_STDEXCEPT // catch std::exception catch (...) { SWIG_exception(SWIG_UnknownError, "Unknown exception"); } } */ %{ #include #include %} %define SWIG_CATCH_STDEXCEPT /* catching std::exception */ catch (std::invalid_argument& e) { SWIG_exception(SWIG_ValueError, e.what() ); } catch (std::domain_error& e) { SWIG_exception(SWIG_ValueError, e.what() ); } catch (std::overflow_error& e) { SWIG_exception(SWIG_OverflowError, e.what() ); } catch (std::out_of_range& e) { SWIG_exception(SWIG_IndexError, e.what() ); } catch (std::length_error& e) { SWIG_exception(SWIG_IndexError, e.what() ); } catch (std::runtime_error& e) { SWIG_exception(SWIG_RuntimeError, e.what() ); } catch (std::bad_cast& e) { SWIG_exception(SWIG_TypeError, e.what() ); } catch (std::exception& e) { SWIG_exception(SWIG_SystemError, e.what() ); } %enddef %define SWIG_CATCH_UNKNOWN catch (std::exception& e) { SWIG_exception(SWIG_SystemError, e.what() ); } catch (...) { SWIG_exception(SWIG_UnknownError, "unknown exception"); } %enddef /* rethrow the unknown exception */ #if defined(SWIGCSHARP) || defined(SWIGD) %typemap(throws,noblock=1, canthrow=1) (...) { SWIG_exception(SWIG_RuntimeError,"unknown exception"); } #else %typemap(throws,noblock=1) (...) { SWIG_exception(SWIG_RuntimeError,"unknown exception"); } #endif #endif /* __cplusplus */ /* exception.i ends here */ swig-4.0.1/Lib/ocaml/0000755000175000017500000000000013527063513014151 5ustar williamwilliamswig-4.0.1/Lib/ocaml/std_complex.i0000644000175000017500000000301413527063513016642 0ustar williamwilliam// -*- C++ -*- #ifndef SWIG_STD_COMPLEX_I_ #define SWIG_STD_COMPLEX_I_ #ifdef SWIG %{ #include %} namespace std { template class complex; %define specialize_std_complex(T) %typemap(in) complex { if (PyComplex_Check($input)) { $1 = std::complex(PyComplex_RealAsDouble($input), PyComplex_ImagAsDouble($input)); } else if (PyFloat_Check($input)) { $1 = std::complex(PyFloat_AsDouble($input), 0); } else if (PyInt_Check($input)) { $1 = std::complex(PyInt_AsLong($input), 0); } else { PyErr_SetString(PyExc_TypeError,"Expected a complex"); SWIG_fail; } } %typemap(in) const complex& (std::complex temp) { if (PyComplex_Check($input)) { temp = std::complex(PyComplex_RealAsDouble($input), PyComplex_ImagAsDouble($input)); $1 = &temp; } else if (PyFloat_Check($input)) { temp = std::complex(PyFloat_AsDouble($input), 0); $1 = &temp; } else if (PyInt_Check($input)) { temp = std::complex(PyInt_AsLong($input), 0); $1 = &temp; } else { PyErr_SetString(PyExc_TypeError,"Expected a complex"); SWIG_fail; } } %typemap(out) complex { $result = PyComplex_FromDoubles($1.real(), $1.imag()); } %typemap(out) const complex & { $result = PyComplex_FromDoubles($1->real(), $1->imag()); } %enddef specialize_std_complex(double); specialize_std_complex(float); } #endif // SWIG #endif //SWIG_STD_COMPLEX_I_ swig-4.0.1/Lib/ocaml/std_deque.i0000644000175000017500000000132213527063513016276 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_deque.i * * Default std_deque wrapper * ----------------------------------------------------------------------------- */ %module std_deque %rename(__getitem__) std::deque::getitem; %rename(__setitem__) std::deque::setitem; %rename(__delitem__) std::deque::delitem; %rename(__getslice__) std::deque::getslice; %rename(__setslice__) std::deque::setslice; %rename(__delslice__) std::deque::delslice; %extend std::deque { int __len__() { return (int) self->size(); } int __nonzero__() { return ! self->empty(); } void append(const T &x) { self->push_back(x); } }; %include swig-4.0.1/Lib/ocaml/ocamlrundec.swg0000644000175000017500000001445313527063513017176 0ustar williamwilliam/* ----------------------------------------------------------------------------- * ocamlrundec.swg * * Ocaml runtime code -- declarations * ----------------------------------------------------------------------------- */ #include #include #include #ifdef __cplusplus #define SWIGEXT extern "C" SWIGEXT { #else #define SWIGEXT #endif #define value caml_value_t #define CAML_VALUE caml_value_t #define CAML_NAME_SPACE #include #include #include #include #include #include #include #if defined(CAMLassert) /* Both this macro and version.h were introduced in version 4.02.0 */ #include #else #define OCAML_VERSION 0 /* Unknown, but < 40200 */ #endif #define caml_array_set swig_caml_array_set /* Adapted from memory.h and mlvalues.h */ #define SWIG_CAMLlocal1(x) \ caml_value_t x = 0; \ CAMLxparam1 (x) #define SWIG_CAMLlocal2(x, y) \ caml_value_t x = 0, y = 0; \ CAMLxparam2 (x, y) #define SWIG_CAMLlocal3(x, y, z) \ caml_value_t x = 0, y = 0, z = 0; \ CAMLxparam3 (x, y, z) #define SWIG_CAMLlocal4(x, y, z, t) \ caml_value_t x = 0, y = 0, z = 0, t = 0; \ CAMLxparam4 (x, y, z, t) #define SWIG_CAMLlocal5(x, y, z, t, u) \ caml_value_t x = 0, y = 0, z = 0, t = 0, u = 0; \ CAMLxparam5 (x, y, z, t, u) #define SWIG_CAMLlocalN(x, size) \ caml_value_t x [(size)] = { 0, /* 0, 0, ... */ }; \ CAMLxparamN (x, (size)) #define SWIG_Field(x, i) (((caml_value_t *)(x)) [i]) /* Also an l-value. */ #define SWIG_Store_field(block, offset, val) do{ \ mlsize_t caml__temp_offset = (offset); \ caml_value_t caml__temp_val = (val); \ caml_modify (&SWIG_Field ((block), caml__temp_offset), caml__temp_val); \ }while(0) #define SWIG_Data_custom_val(v) ((void *) &SWIG_Field((v), 1)) #ifdef ARCH_BIG_ENDIAN #define SWIG_Tag_val(val) (((unsigned char *) (val)) [-1]) /* Also an l-value. */ #define SWIG_Tag_hp(hp) (((unsigned char *) (hp)) [sizeof(caml_value_t)-1]) /* Also an l-value. */ #else #define SWIG_Tag_val(val) (((unsigned char *) (val)) [-sizeof(caml_value_t)]) /* Also an l-value. */ #define SWIG_Tag_hp(hp) (((unsigned char *) (hp)) [0]) /* Also an l-value. */ #endif #ifdef CAMLreturn0 #undef CAMLreturn0 #endif #define CAMLreturn0 do{ \ caml_local_roots = caml__frame; \ return; \ }while (0) #ifdef CAMLreturn #undef CAMLreturn #endif #define CAMLreturn(result) do{ \ caml_value_t caml__temp_result = (result); \ caml_local_roots = caml__frame; \ return (caml__temp_result); \ }while(0) #define CAMLreturn_type(result) do{ \ caml_local_roots = caml__frame; \ return result; \ }while(0) #ifdef CAMLnoreturn #undef CAMLnoreturn #endif #define CAMLnoreturn ((void) caml__frame) #ifndef ARCH_ALIGN_INT64 #if OCAML_VERSION >= 40300 #define SWIG_Int64_val(v) (*((int64_t *) SWIG_Data_custom_val(v))) #else #define SWIG_Int64_val(v) (*((int64 *) SWIG_Data_custom_val(v))) #endif #else #if OCAML_VERSION >= 40300 CAMLextern int64_t Int64_val(caml_value_t v); #else CAMLextern int64 Int64_val(caml_value_t v); #endif #define SWIG_Int64_val(v) Int64_val(v) #endif #define SWIG_NewPointerObj(p,type,flags) caml_val_ptr(p,type) #define SWIG_GetModule(clientdata) SWIG_Ocaml_GetModule(clientdata) #define SWIG_SetModule(clientdata, pointer) SWIG_Ocaml_SetModule(pointer) typedef enum { SWIG_OCamlArithmeticException, SWIG_OCamlDirectorPureVirtual, SWIG_OCamlOutOfMemoryError, SWIG_OCamlOverflowException, SWIG_OCamlIllegalArgumentException, SWIG_OCamlIndexOutOfBoundsException, SWIG_OCamlRuntimeException, SWIG_OCamlSystemException, SWIG_OCamlUnknownError } SWIG_OCamlExceptionCodes; SWIGINTERN void SWIG_OCamlThrowException(SWIG_OCamlExceptionCodes code, const char *msg) { CAMLparam0(); SWIG_CAMLlocal1(str); switch (code) { case SWIG_OCamlIllegalArgumentException: caml_invalid_argument(msg); break; case SWIG_OCamlSystemException: str = caml_copy_string(msg); caml_raise_sys_error(str); break; case SWIG_OCamlArithmeticException: case SWIG_OCamlIndexOutOfBoundsException: case SWIG_OCamlOutOfMemoryError: case SWIG_OCamlOverflowException: case SWIG_OCamlRuntimeException: case SWIG_OCamlUnknownError: default: caml_failwith(msg); break; } CAMLreturn0; } #define SWIG_contract_assert(expr, msg) if(!(expr)) {SWIG_OCamlThrowException(SWIG_OCamlRuntimeException, msg);} SWIGINTERN int SWIG_GetPtr(void *source, void **result, swig_type_info *type, swig_type_info *result_type); SWIGINTERN CAML_VALUE caml_list_nth( CAML_VALUE lst, int n ); SWIGINTERN CAML_VALUE caml_list_append( CAML_VALUE lst, CAML_VALUE elt ); SWIGINTERN int caml_list_length( CAML_VALUE lst ); SWIGINTERN CAML_VALUE caml_array_new( int n ); SWIGINTERN void caml_array_set( CAML_VALUE arr, int n, CAML_VALUE item ); SWIGINTERN CAML_VALUE caml_array_nth( CAML_VALUE arr, int n ); SWIGINTERN int caml_array_len( CAML_VALUE arr ); SWIGINTERN CAML_VALUE caml_val_char( char c ); SWIGINTERN CAML_VALUE caml_val_uchar( unsigned char c ); SWIGINTERN CAML_VALUE caml_val_short( short s ); SWIGINTERN CAML_VALUE caml_val_ushort( unsigned short s ); SWIGINTERN CAML_VALUE caml_val_int( int x ); SWIGINTERN CAML_VALUE caml_val_uint( unsigned int x ); SWIGINTERN CAML_VALUE caml_val_long( long x ); SWIGINTERN CAML_VALUE caml_val_ulong( unsigned long x ); SWIGINTERN CAML_VALUE caml_val_float( float f ); SWIGINTERN CAML_VALUE caml_val_double( double d ); SWIGINTERN CAML_VALUE caml_val_ptr( void *p, swig_type_info *descriptor ); SWIGINTERN CAML_VALUE caml_val_string( const char *str ); SWIGINTERN CAML_VALUE caml_val_string_len( const char *str, int len ); SWIGINTERN long caml_long_val( CAML_VALUE v ); SWIGINTERN double caml_double_val( CAML_VALUE v ); SWIGINTERN int caml_ptr_val_internal( CAML_VALUE v, void **out, swig_type_info *descriptor ); SWIGINTERN void *caml_ptr_val( CAML_VALUE v, swig_type_info *descriptor ); SWIGINTERN char *caml_string_val( CAML_VALUE v ); SWIGINTERN int caml_string_len( CAML_VALUE v ); #ifdef __cplusplus } #endif swig-4.0.1/Lib/ocaml/director.swg0000644000175000017500000000572313527063513016515 0ustar williamwilliam/* ----------------------------------------------------------------------------- * director.swg * * This file contains support for director classes so that Ocaml proxy * methods can be called from C++. * ----------------------------------------------------------------------------- */ #include #include # define SWIG_DIRECTOR_CAST(ARG) dynamic_cast(ARG) namespace Swig { /* base class for director exceptions */ class DirectorException : public std::exception { protected: std::string swig_msg; public: DirectorException(const char *msg="") : swig_msg(msg) { } virtual ~DirectorException() throw() { } const char *what() const throw() { return swig_msg.c_str(); } }; /* type mismatch in the return value from a Ocaml method call */ class DirectorTypeMismatchException : public DirectorException { public: DirectorTypeMismatchException(const char *msg="") : DirectorException(msg) { } }; /* any Ocaml exception that occurs during a director method call */ class DirectorMethodException : public DirectorException {}; /* attempt to call a pure virtual method via a director method */ class DirectorPureVirtualException : public DirectorException { public: DirectorPureVirtualException(const char *msg="") : DirectorException(msg) { } static void raise(const char *msg) { throw DirectorPureVirtualException(msg); } }; /* simple thread abstraction for pthreads on win32 */ #ifdef __THREAD__ #define __PTHREAD__ #if defined(_WIN32) || defined(__WIN32__) #define pthread_mutex_lock EnterCriticalSection #define pthread_mutex_unlock LeaveCriticalSection #define pthread_mutex_t CRITICAL_SECTION #define MUTEX_INIT(var) CRITICAL_SECTION var #else #include #define MUTEX_INIT(var) pthread_mutex_t var = PTHREAD_MUTEX_INITIALIZER #endif #endif /* director base class */ class Director { private: /* pointer to the wrapped ocaml object */ CAML_VALUE swig_self; /* flag indicating whether the object is owned by ocaml or c++ */ mutable bool swig_disown_flag; public: /* wrap a ocaml object. */ Director(CAML_VALUE self) : swig_self(self), swig_disown_flag(false) { caml_register_global_root(&swig_self); } /* discard our reference at destruction */ virtual ~Director() { caml_remove_global_root(&swig_self); swig_disown(); // Disown is safe here because we're just divorcing a reference that points to us. } /* return a pointer to the wrapped ocaml object */ CAML_VALUE swig_get_self() const { return swig_self; } /* acquire ownership of the wrapped ocaml object (the sense of "disown" is from ocaml) */ void swig_disown() const { if (!swig_disown_flag) { swig_disown_flag=true; caml_callback(*caml_named_value("caml_obj_disown"),swig_self); } } }; } swig-4.0.1/Lib/ocaml/std_vector.i0000644000175000017500000000575313527063513016511 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_vector.i * * SWIG typemaps for std::vector types * ----------------------------------------------------------------------------- */ %include // ------------------------------------------------------------------------ // std::vector // // The aim of all that follows would be to integrate std::vector with // Python as much as possible, namely, to allow the user to pass and // be returned Python tuples or lists. // const declarations are used to guess the intent of the function being // exported; therefore, the following rationale is applied: // // -- f(std::vector), f(const std::vector&), f(const std::vector*): // the parameter being read-only, either a Python sequence or a // previously wrapped std::vector can be passed. // -- f(std::vector&), f(std::vector*): // the parameter must be modified; therefore, only a wrapped std::vector // can be passed. // -- std::vector f(): // the vector is returned by copy; therefore, a Python sequence of T:s // is returned which is most easily used in other Python functions // -- std::vector& f(), std::vector* f(), const std::vector& f(), // const std::vector* f(): // the vector is returned by reference; therefore, a wrapped std::vector // is returned // ------------------------------------------------------------------------ %{ #include #include #include %} // exported class namespace std { template class vector { public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef T value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; vector(unsigned int size = 0); vector(unsigned int size, const T& value); vector(const vector& other); unsigned int size() const; bool empty() const; void clear(); void push_back(const T& x); T operator [] ( int f ); vector &operator = ( vector &other ); %extend { void set( int i, const T &x ) { self->resize(i+1); (*self)[i] = x; } }; %extend { T *to_array() { T *array = new T[self->size() + 1]; for( int i = 0; i < self->size(); i++ ) array[i] = (*self)[i]; return array; } }; }; }; %insert(ml) %{ let array_to_vector v argcons array = for i = 0 to (Array.length array) - 1 do ignore ((invoke v) "set" (C_list [ C_int i ; (argcons array.(i)) ])) done ; v let vector_to_array v argcons array = for i = 0; to (get_int ((invoke v) "size" C_void)) - 1 do array.(i) <- argcons ((invoke v) "[]" (C_int i)) done ; v %} %insert(mli) %{ val array_to_vector : c_obj -> ('a -> c_obj) -> 'a array -> c_obj val vector_to_array : c_obj -> (c_obj -> 'a) -> 'a array -> c_obj %} swig-4.0.1/Lib/ocaml/ocaml.swg0000644000175000017500000002054313527063513015772 0ustar williamwilliam/* ----------------------------------------------------------------------------- * ocaml.swg * * The Ocaml module handles all types uniformly via typemaps. Here * are the definitions. * ----------------------------------------------------------------------------- */ /* Pointers */ %typemap(in) void "" %typemap(out) void "$result = Val_int(0);" %typemap(in) void * { $1 = caml_ptr_val($input,$descriptor); } %typemap(varin) void * { $1 = ($ltype)caml_ptr_val($input,$descriptor); } %typemap(out) void * { $result = caml_val_ptr($1,$descriptor); } %typemap(varout) void * { $result = caml_val_ptr($1,$descriptor); } %typemap(in) char *& (char *temp) { temp = (char*)caml_val_ptr($1,$descriptor); $1 = &temp; } %typemap(argout) char *& { swig_result = caml_list_append(swig_result,caml_val_string_len(*$1, strlen(*$1))); } %typemap(in) SWIGTYPE & { $1 = ($ltype) caml_ptr_val($input,$1_descriptor); } %typemap(in) SWIGTYPE && { $1 = ($ltype) caml_ptr_val($input,$1_descriptor); } %typemap(varin) SWIGTYPE & { $1 = *(($ltype) caml_ptr_val($input,$1_descriptor)); } %typemap(varin) SWIGTYPE && { $1 = *(($ltype) caml_ptr_val($input,$1_descriptor)); } %typemap(varout) SWIGTYPE &, SWIGTYPE && { $result = SWIG_Ocaml_ptr_to_val("create_$ntype_from_ptr", (void *)&$1, $1_descriptor); } %typemap(out) SWIGTYPE &, SWIGTYPE && { $result = SWIG_Ocaml_ptr_to_val("create_$ntype_from_ptr", (void *)$1, $1_descriptor); } #if 0 %typemap(argout) SWIGTYPE & { CAML_VALUE *fromval = caml_named_value("create_$ntype_from_ptr"); if( fromval ) { swig_result = caml_list_append(swig_result, caml_callback(*fromval,caml_val_ptr((void *) $1, $1_descriptor))); } else { swig_result = caml_list_append(swig_result, caml_val_ptr ((void *) $1,$1_descriptor)); } } %typemap(argout) SWIGTYPE && { CAML_VALUE *fromval = caml_named_value("create_$ntype_from_ptr"); if( fromval ) { swig_result = caml_list_append(swig_result, caml_callback(*fromval,caml_val_ptr((void *) $1, $1_descriptor))); } else { swig_result = caml_list_append(swig_result, caml_val_ptr ((void *) $1,$1_descriptor)); } } #endif %typemap(in) SWIGTYPE { $1 = *(($&1_ltype) caml_ptr_val($input,$&1_descriptor)) ; } #ifdef __cplusplus %typemap(out) SWIGTYPE { $&1_ltype temp = new $ltype((const $1_ltype &) $1); $result = SWIG_Ocaml_ptr_to_val("create_$ntype_from_ptr", (void *)temp, $&1_descriptor); } #else %typemap(out) SWIGTYPE { void *temp = calloc(1,sizeof($ltype)); memmove(temp, &$1, sizeof($1_type)); $result = SWIG_Ocaml_ptr_to_val("create_$ntype_from_ptr", temp, $&1_descriptor); } #endif %typemap(directorin) SWIGTYPE { $<ype temp = new $ltype((const $ltype &)$1); swig_result = SWIG_Ocaml_ptr_to_val("create_$ltype_from_ptr", (void *)temp, $&1_descriptor); args = caml_list_append(args, swig_result); } %typemap(directorin) SWIGTYPE *, SWIGTYPE [], SWIGTYPE &, SWIGTYPE && { swig_result = SWIG_Ocaml_ptr_to_val("create_$ltype_from_ptr", (void *)&$1, $&1_descriptor); args = caml_list_append(args, swig_result); } /* The SIMPLE_MAP macro below defines the whole set of typemaps needed for simple types. */ %define SIMPLE_MAP(C_NAME, C_TO_OCAML, OCAML_TO_C) /* In */ %typemap(in) C_NAME { $1 = OCAML_TO_C($input); } %typemap(varin) C_NAME { $1 = OCAML_TO_C($input); } %typemap(in) const C_NAME & ($*1_ltype temp) { temp = ($*1_ltype) OCAML_TO_C($input); $1 = &temp; } %typemap(varin) const C_NAME & { $1 = OCAML_TO_C($input); } %typemap(directorout) C_NAME { $1 = OCAML_TO_C($input); } /* Out */ %typemap(out) C_NAME { $result = C_TO_OCAML($1); } %typemap(varout) C_NAME { $result = C_TO_OCAML($1); } %typemap(varout) const C_NAME & { $result = C_TO_OCAML($1); } %typemap(out) const C_NAME & { $result = C_TO_OCAML(*$1); } %typemap(directorin) C_NAME { args = caml_list_append(args, C_TO_OCAML($1)); } %enddef SIMPLE_MAP(bool, caml_val_bool, caml_long_val); SIMPLE_MAP(char, caml_val_char, caml_long_val); SIMPLE_MAP(signed char, caml_val_char, caml_long_val); SIMPLE_MAP(unsigned char, caml_val_uchar, caml_long_val); SIMPLE_MAP(int, caml_val_int, caml_long_val); SIMPLE_MAP(short, caml_val_short, caml_long_val); SIMPLE_MAP(wchar_t, caml_val_short, caml_long_val); SIMPLE_MAP(long, caml_val_long, caml_long_val); SIMPLE_MAP(ptrdiff_t, caml_val_int, caml_long_val); SIMPLE_MAP(unsigned int, caml_val_uint, caml_long_val); SIMPLE_MAP(unsigned short, caml_val_ushort, caml_long_val); SIMPLE_MAP(unsigned long, caml_val_ulong, caml_long_val); SIMPLE_MAP(size_t, caml_val_int, caml_long_val); SIMPLE_MAP(float, caml_val_float, caml_double_val); SIMPLE_MAP(double, caml_val_double, caml_double_val); SIMPLE_MAP(long long,caml_val_ulong,caml_long_val); SIMPLE_MAP(unsigned long long,caml_val_ulong,caml_long_val); /* Void */ %typemap(out) void "$result = Val_unit;"; /* Pass through value */ %typemap (in) CAML_VALUE "$1=$input;"; %typemap (out) CAML_VALUE "$result=$1;"; #if 0 %include #endif /* Handle char arrays as strings */ %define %char_ptr_in(how) %typemap(how) char *, signed char *, unsigned char * { $1 = ($ltype)caml_string_val($input); } /* Again work around the empty array bound bug */ %typemap(how) char [ANY], signed char [ANY], unsigned char [ANY] { char *temp = caml_string_val($input); strcpy((char *)$1,temp); } %enddef %char_ptr_in(in); %char_ptr_in(varin); %char_ptr_in(directorout); %define %char_ptr_out(how) %typemap(how) char *, signed char *, unsigned char *, const char *, const signed char *, const unsigned char * { $result = caml_val_string((char *)$1); } /* I'd like to use the length here but can't because it might be empty */ %typemap(how) char [ANY], signed char [ANY], unsigned char [ANY], const char [ANY], const signed char [ANY], const unsigned char [ANY] { $result = caml_val_string((char *)$1); } %enddef %char_ptr_out(out); %char_ptr_out(varout); %char_ptr_out(directorin); %define %swigtype_ptr_in(how) %typemap(how) SWIGTYPE * { $1 = ($ltype)caml_ptr_val($input,$1_descriptor); } %typemap(how) SWIGTYPE (CLASS::*) { void *v = caml_ptr_val($input,$1_descriptor); memcpy(& $1, &v, sizeof(v)); } %enddef %typemap(out) SWIGTYPE * { $result = SWIG_Ocaml_ptr_to_val("create_$ntype_from_ptr", (void *)$1, $1_descriptor); } %define %swigtype_ptr_out(how) %typemap(how) SWIGTYPE (CLASS::*) { void *v; memcpy(&v,& $1, sizeof(void *)); $result = caml_val_ptr (v,$1_descriptor); } %enddef %swigtype_ptr_in(in); %swigtype_ptr_in(varin); %swigtype_ptr_in(directorout); %swigtype_ptr_out(out); %swigtype_ptr_out(varout); %swigtype_ptr_out(directorin); %define %swigtype_array_fail(how,msg) %typemap(how) SWIGTYPE [] { caml_failwith(msg); } %enddef %swigtype_array_fail(in,"Array arguments for arbitrary types need a typemap"); %swigtype_array_fail(varin,"Assignment to global arrays for arbitrary types need a typemap"); %swigtype_array_fail(out,"Array arguments for arbitrary types need a typemap"); %swigtype_array_fail(varout,"Array variables need a typemap"); %swigtype_array_fail(directorin,"Array results with arbitrary types need a typemap"); %swigtype_array_fail(directorout,"Array arguments with arbitrary types need a typemap"); /* C++ References */ /* Enums */ %define %swig_enum_in(how) %typemap(how) enum SWIGTYPE { $1 = ($type)caml_long_val_full($input,"$type_marker"); } %enddef %define %swig_enum_out(how) %typemap(how) enum SWIGTYPE { $result = caml_callback2(*caml_named_value(SWIG_MODULE "_int_to_enum"),*caml_named_value("$type_marker"),Val_int((int)$1)); } %enddef %swig_enum_in(in) %swig_enum_in(varin) %swig_enum_in(directorout) %swig_enum_out(out) %swig_enum_out(varout) %swig_enum_out(directorin) %typemap(in) (char *STRING, int LENGTH), (char *STRING, size_t LENGTH) { $1 = ($1_ltype) caml_string_val($input); $2 = ($2_ltype) caml_string_len($input); } %typemap(out) SWIGTYPE *DYNAMIC, SWIGTYPE &DYNAMIC { swig_type_info *ty = SWIG_TypeDynamicCast($1_descriptor, (void **)&$1); $result = SWIG_Ocaml_ptr_to_val("create_$ntype_from_ptr", (void *)$1, ty); } /* Array reference typemaps */ %apply SWIGTYPE & { SWIGTYPE ((&)[ANY]) } %apply SWIGTYPE && { SWIGTYPE ((&)[ANY]) } /* const pointers */ %apply SWIGTYPE * { SWIGTYPE *const } %apply SWIGTYPE (CLASS::*) { SWIGTYPE (CLASS::*const) } %apply SWIGTYPE & { SWIGTYPE (CLASS::*const&) } swig-4.0.1/Lib/ocaml/preamble.swg0000644000175000017500000000073113527063513016463 0ustar williamwilliam%insert(mli) %{ exception BadArgs of string exception BadMethodName of c_obj * string * string exception NotObject of c_obj exception NotEnumType of c_obj exception LabelNotFromThisEnum of c_obj exception InvalidDirectorCall of c_obj %} %insert(ml) %{ exception BadArgs of string exception BadMethodName of c_obj * string * string exception NotObject of c_obj exception NotEnumType of c_obj exception LabelNotFromThisEnum of c_obj exception InvalidDirectorCall of c_obj %}swig-4.0.1/Lib/ocaml/ocamlrun.swg0000644000175000017500000003513613527063513016523 0ustar williamwilliam/* -*-c-*- */ /* SWIG pointer structure */ #include #include #ifdef __cplusplus extern "C" { #endif #define C_bool 0 #define C_char 1 #define C_uchar 2 #define C_short 3 #define C_ushort 4 #define C_int 5 #define C_uint 6 #define C_int32 7 #define C_int64 8 #define C_float 9 #define C_double 10 #define C_ptr 11 #define C_array 12 #define C_list 13 #define C_obj 14 #define C_string 15 #define C_enum 16 #define C_director_core 17 /* Cast a pointer if possible; returns 1 if successful */ SWIGINTERN int SWIG_Cast (void *source, swig_type_info *source_type, void **ptr, swig_type_info *dest_type) { if( !source ) { /* Special case for NULL. This is a popular question for other modules on the list, so I want an easy way out... */ *ptr = 0; return 0; } #ifdef TYPE_CAST_VERBOSE fprintf( stderr, "Trying to cast %s to %s\n", source_type ? source_type->str : "", dest_type ? dest_type->str : "" ); #endif if (dest_type != source_type) { /* We have a type mismatch. Will have to look through our type mapping table to figure out whether or not we can accept this datatype. -- Ignore typechecks for void *. Allow any conversion. */ if( !dest_type || !source_type || !strcmp(dest_type->name,"_p_void") || !strcmp(source_type->name,"_p_void") ) { *ptr = source; return 0; } else { swig_cast_info *tc = SWIG_TypeCheckStruct(source_type, dest_type ); #ifdef TYPE_CAST_VERBOSE fprintf( stderr, "Typecheck -> %s\n", tc ? tc->type->str : "" ); #endif if( tc ) { int newmemory = 0; *ptr = SWIG_TypeCast(tc, source, &newmemory); assert(!newmemory); /* newmemory handling not yet implemented */ return 0; } else return -1; } } else { *ptr = source; return 0; } } /* Return 0 if successful. */ SWIGINTERN int SWIG_GetPtr(void *inptr, void **outptr, swig_type_info *intype, swig_type_info *outtype) { if (intype) { return SWIG_Cast(inptr, intype, outptr, outtype) == -1; } else { *outptr = inptr; return 0; } } SWIGINTERN void caml_print_list( CAML_VALUE v ); SWIGINTERN void caml_print_val( CAML_VALUE v ) { switch( SWIG_Tag_val(v) ) { case C_bool: if( Bool_val(SWIG_Field(v,0)) ) fprintf( stderr, "true " ); else fprintf( stderr, "false " ); break; case C_char: case C_uchar: fprintf( stderr, "'%c' (\\%03d) ", (Int_val(SWIG_Field(v,0)) >= ' ' && Int_val(SWIG_Field(v,0)) < 127) ? Int_val(SWIG_Field(v,0)) : '.', Int_val(SWIG_Field(v,0)) ); break; case C_short: case C_ushort: case C_int: fprintf( stderr, "%d ", (int)caml_long_val(v) ); break; case C_uint: case C_int32: fprintf( stderr, "%ud ", (unsigned int)caml_long_val(v) ); break; case C_int64: fprintf( stderr, "%ld ", caml_long_val(v) ); break; case C_float: case C_double: fprintf( stderr, "%f ", caml_double_val(v) ); break; case C_ptr: { void *vout = 0; swig_type_info *ty = (swig_type_info *)(long)SWIG_Int64_val(SWIG_Field(v,1)); caml_ptr_val_internal(v,&vout,0); fprintf( stderr, "PTR(%p,%s) ", vout, ty ? ty->name : "(null)" ); } break; case C_array: { unsigned int i; for( i = 0; i < Wosize_val( SWIG_Field(v,0) ); i++ ) caml_print_val( SWIG_Field(SWIG_Field(v,0),i) ); } break; case C_list: caml_print_list( SWIG_Field(v,0) ); break; case C_obj: fprintf( stderr, "OBJ(%p) ", (void *)SWIG_Field(v,0) ); break; case C_string: { void *cout; caml_ptr_val_internal(v,&cout,0); fprintf( stderr, "'%s' ", (char *)cout ); } break; } } SWIGINTERN void caml_print_list( CAML_VALUE v ) { CAMLparam1(v); while( v && Is_block(v) ) { fprintf( stderr, "[ " ); caml_print_val( SWIG_Field(v,0) ); fprintf( stderr, "]\n" ); v = SWIG_Field(v,1); } CAMLreturn0; } SWIGINTERN CAML_VALUE caml_list_nth( CAML_VALUE lst, int n ) { CAMLparam1(lst); int i = 0; while( i < n && lst && Is_block(lst) ) { i++; lst = SWIG_Field(lst,1); } if( lst == Val_unit ) CAMLreturn(Val_unit); else CAMLreturn(SWIG_Field(lst,0)); } SWIGINTERN CAML_VALUE caml_list_append( CAML_VALUE lst, CAML_VALUE elt ) { CAMLparam2(lst,elt); SWIG_CAMLlocal3(v,vt,lh); lh = Val_unit; v = Val_unit; /* Appending C_void should have no effect */ if( !Is_block(elt) ) return lst; while( lst && Is_block(lst) ) { if( v && v != Val_unit ) { vt = caml_alloc_tuple(2); SWIG_Store_field(v,1,vt); v = vt; } else { v = lh = caml_alloc_tuple(2); } SWIG_Store_field(v,0,SWIG_Field(lst,0)); lst = SWIG_Field(lst,1); } if( v && Is_block(v) ) { vt = caml_alloc_tuple(2); SWIG_Store_field(v,1,vt); v = vt; } else { v = lh = caml_alloc_tuple(2); } SWIG_Store_field(v,0,elt); SWIG_Store_field(v,1,Val_unit); CAMLreturn(lh); } SWIGINTERN int caml_list_length( CAML_VALUE lst ) { CAMLparam1(lst); int i = 0; while( lst && Is_block(lst) ) { i++; lst = SWIG_Field(lst,1); } CAMLreturn(i); } SWIGINTERN void caml_array_set( CAML_VALUE arr, int n, CAML_VALUE item ) { CAMLparam2(arr,item); SWIG_Store_field(SWIG_Field(arr,0),n,item); CAMLreturn0; } SWIGINTERN value caml_array_nth( CAML_VALUE arr, int n ) { CAMLparam1(arr); if( SWIG_Tag_val(arr) == C_array ) CAMLreturn(SWIG_Field(SWIG_Field(arr,0),n)); else if( SWIG_Tag_val(arr) == C_list ) CAMLreturn(caml_list_nth(arr,0)); else caml_failwith("Need array or list"); } SWIGINTERN int caml_array_len( CAML_VALUE arr ) { CAMLparam1(arr); if( SWIG_Tag_val(arr) == C_array ) CAMLreturn(Wosize_val(SWIG_Field(arr,0))); else if( SWIG_Tag_val(arr) == C_list ) CAMLreturn(caml_list_length(arr)); else caml_failwith("Need array or list"); } SWIGINTERN CAML_VALUE caml_swig_alloc(int x,int y) { return caml_alloc(x,y); } SWIGINTERN value caml_array_new( int n ) { CAMLparam0(); SWIG_CAMLlocal1(vv); vv = caml_swig_alloc(1,C_array); SWIG_Store_field(vv,0,caml_alloc_tuple(n)); CAMLreturn(vv); } SWIGINTERN CAML_VALUE caml_val_bool( int b ) { CAMLparam0(); SWIG_CAMLlocal1(bv); bv = caml_swig_alloc(1,C_bool); SWIG_Store_field(bv,0,Val_bool(b)); CAMLreturn(bv); } SWIGINTERN CAML_VALUE caml_val_char( char c ) { CAMLparam0(); SWIG_CAMLlocal1(cv); cv = caml_swig_alloc(1,C_char); SWIG_Store_field(cv,0,Val_int(c)); CAMLreturn(cv); } SWIGINTERN CAML_VALUE caml_val_uchar( unsigned char uc ) { CAMLparam0(); SWIG_CAMLlocal1(ucv); ucv = caml_swig_alloc(1,C_uchar); SWIG_Store_field(ucv,0,Val_int(uc)); CAMLreturn(ucv); } SWIGINTERN CAML_VALUE caml_val_short( short s ) { CAMLparam0(); SWIG_CAMLlocal1(sv); sv = caml_swig_alloc(1,C_short); SWIG_Store_field(sv,0,Val_int(s)); CAMLreturn(sv); } SWIGINTERN CAML_VALUE caml_val_ushort( unsigned short us ) { CAMLparam0(); SWIG_CAMLlocal1(usv); usv = caml_swig_alloc(1,C_ushort); SWIG_Store_field(usv,0,Val_int(us)); CAMLreturn(usv); } SWIGINTERN CAML_VALUE caml_val_int( int i ) { CAMLparam0(); SWIG_CAMLlocal1(iv); iv = caml_swig_alloc(1,C_int); SWIG_Store_field(iv,0,Val_int(i)); CAMLreturn(iv); } SWIGINTERN CAML_VALUE caml_val_uint( unsigned int ui ) { CAMLparam0(); SWIG_CAMLlocal1(uiv); uiv = caml_swig_alloc(1,C_int); SWIG_Store_field(uiv,0,Val_int(ui)); CAMLreturn(uiv); } SWIGINTERN CAML_VALUE caml_val_long( long l ) { CAMLparam0(); SWIG_CAMLlocal1(lv); lv = caml_swig_alloc(1,C_int64); SWIG_Store_field(lv,0,caml_copy_int64(l)); CAMLreturn(lv); } SWIGINTERN CAML_VALUE caml_val_ulong( unsigned long ul ) { CAMLparam0(); SWIG_CAMLlocal1(ulv); ulv = caml_swig_alloc(1,C_int64); SWIG_Store_field(ulv,0,caml_copy_int64(ul)); CAMLreturn(ulv); } SWIGINTERN CAML_VALUE caml_val_float( float f ) { CAMLparam0(); SWIG_CAMLlocal1(fv); fv = caml_swig_alloc(1,C_float); SWIG_Store_field(fv,0,caml_copy_double((double)f)); CAMLreturn(fv); } SWIGINTERN CAML_VALUE caml_val_double( double d ) { CAMLparam0(); SWIG_CAMLlocal1(fv); fv = caml_swig_alloc(1,C_double); SWIG_Store_field(fv,0,caml_copy_double(d)); CAMLreturn(fv); } SWIGINTERN CAML_VALUE caml_val_ptr( void *p, swig_type_info *info ) { CAMLparam0(); SWIG_CAMLlocal1(vv); vv = caml_swig_alloc(2,C_ptr); SWIG_Store_field(vv,0,caml_copy_int64((long)p)); SWIG_Store_field(vv,1,caml_copy_int64((long)info)); CAMLreturn(vv); } SWIGINTERN CAML_VALUE caml_val_string( const char *p ) { CAMLparam0(); SWIG_CAMLlocal1(vv); if( !p ) CAMLreturn(caml_val_ptr( (void *)p, 0 )); vv = caml_swig_alloc(1,C_string); SWIG_Store_field(vv,0,caml_copy_string(p)); CAMLreturn(vv); } SWIGINTERN CAML_VALUE caml_val_string_len( const char *p, int len ) { CAMLparam0(); SWIG_CAMLlocal1(vv); if( !p || len < 0 ) CAMLreturn(caml_val_ptr( (void *)p, 0 )); vv = caml_swig_alloc(1,C_string); SWIG_Store_field(vv,0,caml_alloc_string(len)); memcpy(String_val(SWIG_Field(vv,0)),p,len); CAMLreturn(vv); } #define caml_val_obj(v, name) caml_val_obj_helper(v, SWIG_TypeQuery((name)), name) SWIGINTERN CAML_VALUE caml_val_obj_helper( void *v, swig_type_info *type, char *name) { CAMLparam0(); CAMLreturn(caml_callback2(*caml_named_value("caml_create_object_fn"), caml_val_ptr(v,type), caml_copy_string(name))); } SWIGINTERN long caml_long_val_full( CAML_VALUE v, const char *name ) { CAMLparam1(v); if( !Is_block(v) ) return 0; switch( SWIG_Tag_val(v) ) { case C_bool: case C_char: case C_uchar: case C_short: case C_ushort: case C_int: CAMLreturn(Int_val(SWIG_Field(v,0))); case C_uint: case C_int32: CAMLreturn(Int32_val(SWIG_Field(v,0))); case C_int64: CAMLreturn((long)SWIG_Int64_val(SWIG_Field(v,0))); case C_float: case C_double: CAMLreturn((long)Double_val(SWIG_Field(v,0))); case C_string: CAMLreturn((long)String_val(SWIG_Field(v,0))); case C_ptr: CAMLreturn((long)SWIG_Int64_val(SWIG_Field(SWIG_Field(v,0),0))); case C_enum: { SWIG_CAMLlocal1(ret); CAML_VALUE *enum_to_int = caml_named_value(SWIG_MODULE "_enum_to_int"); if( !name ) caml_failwith( "Not an enum conversion" ); ret = caml_callback2(*enum_to_int,*caml_named_value(name),v); CAMLreturn(caml_long_val(ret)); } default: caml_failwith("No conversion to int"); } } SWIGINTERN long caml_long_val( CAML_VALUE v ) { return caml_long_val_full(v,0); } SWIGINTERN double caml_double_val( CAML_VALUE v ) { CAMLparam1(v); if( !Is_block(v) ) return 0.0; switch( SWIG_Tag_val(v) ) { case C_bool: case C_char: case C_uchar: case C_short: case C_ushort: case C_int: CAMLreturn_type(Int_val(SWIG_Field(v,0))); case C_uint: case C_int32: CAMLreturn_type(Int32_val(SWIG_Field(v,0))); case C_int64: CAMLreturn_type(SWIG_Int64_val(SWIG_Field(v,0))); case C_float: case C_double: CAMLreturn_type(Double_val(SWIG_Field(v,0))); default: fprintf( stderr, "Unknown block tag %d\n", SWIG_Tag_val(v) ); caml_failwith("No conversion to double"); } } SWIGINTERN int caml_ptr_val_internal( CAML_VALUE v, void **out, swig_type_info *descriptor ) { CAMLparam1(v); void *outptr = NULL; swig_type_info *outdescr = NULL; static CAML_VALUE *func_val = NULL; if( v == Val_unit ) { *out = 0; CAMLreturn_type(0); } if( !Is_block(v) ) return -1; switch( SWIG_Tag_val(v) ) { case C_obj: if (!func_val) { func_val = caml_named_value("caml_obj_ptr"); } CAMLreturn_type(caml_ptr_val_internal(caml_callback(*func_val, v), out, descriptor)); case C_string: outptr = (void *)String_val(SWIG_Field(v,0)); break; case C_ptr: outptr = (void *)(long)SWIG_Int64_val(SWIG_Field(v,0)); outdescr = (swig_type_info *)(long)SWIG_Int64_val(SWIG_Field(v,1)); break; default: *out = 0; CAMLreturn_type(1); break; } CAMLreturn_type(SWIG_GetPtr(outptr, out, outdescr, descriptor)); } SWIGINTERN void *caml_ptr_val( CAML_VALUE v, swig_type_info *descriptor ) { CAMLparam0(); #ifdef TYPE_CAST_VERBOSE caml_print_val( v ); #endif void *out = NULL; if( !caml_ptr_val_internal( v, &out, descriptor ) ) CAMLreturn_type(out); else caml_failwith( "No appropriate conversion found." ); } SWIGINTERN char *caml_string_val( CAML_VALUE v ) { return (char *)caml_ptr_val( v, 0 ); } SWIGINTERN int caml_string_len( CAML_VALUE v ) { switch( SWIG_Tag_val(v) ) { case C_string: return caml_string_length(SWIG_Field(v,0)); default: return strlen((char *)caml_ptr_val(v,0)); } } SWIGINTERN int caml_bool_check( CAML_VALUE v ) { CAMLparam1(v); if( !Is_block(v) ) return 0; switch( SWIG_Tag_val(v) ) { case C_bool: case C_ptr: case C_string: CAMLreturn(1); default: CAMLreturn(0); } } SWIGINTERN int caml_int_check( CAML_VALUE v ) { CAMLparam1(v); if( !Is_block(v) ) return 0; switch( SWIG_Tag_val(v) ) { case C_char: case C_uchar: case C_short: case C_ushort: case C_int: case C_uint: case C_int32: case C_int64: CAMLreturn(1); default: CAMLreturn(0); } } SWIGINTERN int caml_float_check( CAML_VALUE v ) { CAMLparam1(v); if( !Is_block(v) ) return 0; switch( SWIG_Tag_val(v) ) { case C_float: case C_double: CAMLreturn(1); default: CAMLreturn(0); } } SWIGINTERN int caml_ptr_check( CAML_VALUE v ) { CAMLparam1(v); if( !Is_block(v) ) return 0; switch( SWIG_Tag_val(v) ) { case C_string: case C_ptr: case C_int64: CAMLreturn(1); default: CAMLreturn(0); } } SWIGINTERN CAML_VALUE SWIG_Ocaml_ptr_to_val(const char *name, void *ptr, swig_type_info *descriptor) { CAMLparam0(); SWIG_CAMLlocal1(result); CAML_VALUE *fromval = caml_named_value(name); if (fromval) { result = caml_callback(*fromval, caml_val_ptr(ptr, descriptor)); } else { result = caml_val_ptr(ptr, descriptor); } CAMLreturn(result); } static swig_module_info *SWIG_Ocaml_GetModule(void *SWIGUNUSEDPARM(clientdata)) { CAML_VALUE pointer; pointer = caml_callback(*caml_named_value("swig_find_type_info"), caml_val_int(0)); if (Is_block(pointer) && SWIG_Tag_val(pointer) == C_ptr) { return (swig_module_info *)(void *)(long)SWIG_Int64_val(SWIG_Field(pointer,0)); } return 0; } static void SWIG_Ocaml_SetModule(swig_module_info *pointer) { CAML_VALUE mod_pointer; mod_pointer = caml_val_ptr(pointer, NULL); caml_callback(*caml_named_value("swig_set_type_info"), mod_pointer); } #ifdef __cplusplus } #endif #undef value swig-4.0.1/Lib/ocaml/swig.ml0000644000175000017500000001136513527063513015462 0ustar williamwilliam(* -*- tuareg -*- *) open Int32 open Int64 type enum = [ `Int of int ] type 'a c_obj_t = C_void | C_bool of bool | C_char of char | C_uchar of char | C_short of int | C_ushort of int | C_int of int | C_uint of int32 | C_int32 of int32 | C_int64 of int64 | C_float of float | C_double of float | C_ptr of int64 * int64 | C_array of 'a c_obj_t array | C_list of 'a c_obj_t list | C_obj of (string -> 'a c_obj_t -> 'a c_obj_t) | C_string of string | C_enum of 'a | C_director_core of 'a c_obj_t * 'a c_obj_t option ref type c_obj = enum c_obj_t exception BadArgs of string exception BadMethodName of string * string exception NotObject of c_obj exception NotEnumType of c_obj exception LabelNotFromThisEnum of c_obj exception InvalidDirectorCall of c_obj exception NoSuchClass of string let rec invoke obj = match obj with C_obj o -> o | C_director_core (o,r) -> invoke o | _ -> raise (NotObject (Obj.magic obj)) let _ = Callback.register "swig_runmethod" invoke let fnhelper arg = match arg with C_list l -> l | C_void -> [] | _ -> [ arg ] let director_core_helper fnargs = try match List.hd fnargs with | C_director_core (o,r) -> fnargs | _ -> C_void :: fnargs with Failure _ -> C_void :: fnargs let rec get_int x = match x with C_bool b -> if b then 1 else 0 | C_char c | C_uchar c -> (int_of_char c) | C_short s | C_ushort s | C_int s -> s | C_uint u | C_int32 u -> (Int32.to_int u) | C_int64 u -> (Int64.to_int u) | C_float f -> (int_of_float f) | C_double d -> (int_of_float d) | C_ptr (p,q) -> (Int64.to_int p) | C_obj o -> (try (get_int (o "int" C_void)) with _ -> (get_int (o "&" C_void))) | _ -> raise (Failure "Can't convert to int") let rec get_float x = match x with C_char c | C_uchar c -> (float_of_int (int_of_char c)) | C_short s -> (float_of_int s) | C_ushort s -> (float_of_int s) | C_int s -> (float_of_int s) | C_uint u | C_int32 u -> (float_of_int (Int32.to_int u)) | C_int64 u -> (float_of_int (Int64.to_int u)) | C_float f -> f | C_double d -> d | C_obj o -> (try (get_float (o "float" C_void)) with _ -> (get_float (o "double" C_void))) | _ -> raise (Failure "Can't convert to float") let rec get_char x = (char_of_int (get_int x)) let rec get_string x = match x with C_string str -> str | _ -> raise (Failure "Can't convert to string") let rec get_bool x = match x with C_bool b -> b | _ -> (try if get_int x != 0 then true else false with _ -> raise (Failure "Can't convert to bool")) let disown_object obj = match obj with C_director_core (o,r) -> r := None | _ -> raise (Failure "Not a director core object") let _ = Callback.register "caml_obj_disown" disown_object let addr_of obj = match obj with C_obj _ -> (invoke obj) "&" C_void | C_director_core (self,r) -> (invoke self) "&" C_void | C_ptr _ -> obj | _ -> raise (Failure "Not a pointer.") let _ = Callback.register "caml_obj_ptr" addr_of let make_float f = C_float f let make_double f = C_double f let make_string s = C_string s let make_bool b = C_bool b let make_char c = C_char c let make_char_i c = C_char (char_of_int c) let make_uchar c = C_uchar c let make_uchar_i c = C_uchar (char_of_int c) let make_short i = C_short i let make_ushort i = C_ushort i let make_int i = C_int i let make_uint i = C_uint (Int32.of_int i) let make_int32 i = C_int32 (Int32.of_int i) let make_int64 i = C_int64 (Int64.of_int i) let new_derived_object cfun x_class args = begin let get_object ob = match !ob with None -> raise (NotObject C_void) | Some o -> o in let ob_ref = ref None in let class_fun class_f ob_r = (fun meth args -> class_f (get_object ob_r) meth args) in let new_class = class_fun x_class ob_ref in let dircore = C_director_core (C_obj new_class,ob_ref) in let obj = cfun (match args with C_list argl -> (C_list ((dircore :: argl))) | C_void -> (C_list [ dircore ]) | a -> (C_list [ dircore ; a ])) in ob_ref := Some obj ; obj end let swig_current_type_info = ref C_void let find_type_info obj = !swig_current_type_info let _ = Callback.register "swig_find_type_info" find_type_info let set_type_info obj = match obj with C_ptr _ -> swig_current_type_info := obj ; obj | _ -> raise (Failure "Internal error: passed non pointer to set_type_info") let _ = Callback.register "swig_set_type_info" set_type_info let class_master_list = Hashtbl.create 20 let register_class_byname nm co = Hashtbl.replace class_master_list nm (Obj.magic co) let create_class nm = try (Obj.magic (Hashtbl.find class_master_list nm)) with _ -> raise (NoSuchClass nm) swig-4.0.1/Lib/ocaml/extra-install.list0000644000175000017500000000006713527063513017640 0ustar williamwilliam# see top-level Makefile.in swigp4.ml swig.mli swig.ml swig-4.0.1/Lib/ocaml/std_common.i0000644000175000017500000000112513527063513016464 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_common.i * * SWIG typemaps for STL - common utilities * ----------------------------------------------------------------------------- */ %include %apply size_t { std::size_t }; %apply const size_t& { const std::size_t& }; %{ #include SWIGINTERNINLINE CAML_VALUE SwigString_FromString(const std::string &s) { return caml_val_string((char *)s.c_str()); } SWIGINTERNINLINE std::string SwigString_AsString(CAML_VALUE o) { return std::string((char *)caml_ptr_val(o,0)); } %} swig-4.0.1/Lib/ocaml/std_except.i0000644000175000017500000000263413527063513016472 0ustar williamwilliam%{ #include #include %} namespace std { %ignore exception; struct exception {}; } %typemap(throws) std::bad_cast "SWIG_OCamlThrowException(SWIG_OCamlRuntimeException, $1.what());" %typemap(throws) std::bad_exception "SWIG_OCamlThrowException(SWIG_OCamlRuntimeException, $1.what());" %typemap(throws) std::domain_error "SWIG_OCamlThrowException(SWIG_OCamlRuntimeException, $1.what());" %typemap(throws) std::exception "SWIG_OCamlThrowException(SWIG_OCamlRuntimeException, $1.what());" %typemap(throws) std::invalid_argument "SWIG_OCamlThrowException(SWIG_OCamlIllegalArgumentException, $1.what());" %typemap(throws) std::length_error "SWIG_OCamlThrowException(SWIG_OCamlIndexOutOfBoundsException, $1.what());" %typemap(throws) std::logic_error "SWIG_OCamlThrowException(SWIG_OCamlRuntimeException, $1.what());" %typemap(throws) std::out_of_range "SWIG_OCamlThrowException(SWIG_OCamlIndexOutOfBoundsException, $1.what());" %typemap(throws) std::overflow_error "SWIG_OCamlThrowException(SWIG_OCamlArithmeticException, $1.what());" %typemap(throws) std::range_error "SWIG_OCamlThrowException(SWIG_OCamlIndexOutOfBoundsException, $1.what());" %typemap(throws) std::runtime_error "SWIG_OCamlThrowException(SWIG_OCamlRuntimeException, $1.what());" %typemap(throws) std::underflow_error "SWIG_OCamlThrowException(SWIG_OCamlArithmeticException, $1.what());" swig-4.0.1/Lib/ocaml/typemaps.i0000644000175000017500000000376313527063513016176 0ustar williamwilliam/* ---------------------------------------------------------------------------- * typemaps.i * * These typemaps provide support for input/output arguments for C/C++ pointers * and C++ references. * ---------------------------------------------------------------------------- */ %define INPUT_OUTPUT_INOUT_TYPEMAPS(type, c_to_ocaml, ocaml_to_c) %typemap(in) type *INPUT(type temp), type &INPUT(type temp) { temp = (type)ocaml_to_c($input); $1 = &temp; } %typemap(typecheck) type *INPUT = type; %typemap(typecheck) type &INPUT = type; %typemap(in, numinputs=0) type *OUTPUT($*1_ltype temp), type &OUTPUT($*1_ltype temp) "$1 = &temp;" %typemap(argout) type *OUTPUT, type &OUTPUT { swig_result = caml_list_append(swig_result, c_to_ocaml(*$1)); } %typemap(in) type *INOUT = type *INPUT; %typemap(in) type &INOUT = type &INPUT; %typemap(argout) type *INOUT = type *OUTPUT; %typemap(argout) type &INOUT = type &OUTPUT; %typemap(typecheck) type *INOUT = type; %typemap(typecheck) type &INOUT = type; %enddef INPUT_OUTPUT_INOUT_TYPEMAPS(bool, caml_val_bool, caml_long_val); INPUT_OUTPUT_INOUT_TYPEMAPS(int, caml_val_int, caml_long_val); INPUT_OUTPUT_INOUT_TYPEMAPS(long, caml_val_long, caml_long_val); INPUT_OUTPUT_INOUT_TYPEMAPS(short, caml_val_int, caml_long_val); INPUT_OUTPUT_INOUT_TYPEMAPS(char, caml_val_char, caml_long_val); INPUT_OUTPUT_INOUT_TYPEMAPS(signed char, caml_val_char, caml_long_val); INPUT_OUTPUT_INOUT_TYPEMAPS(float, caml_val_float, caml_double_val); INPUT_OUTPUT_INOUT_TYPEMAPS(double, caml_val_double, caml_double_val); INPUT_OUTPUT_INOUT_TYPEMAPS(unsigned int, caml_val_uint, caml_long_val); INPUT_OUTPUT_INOUT_TYPEMAPS(unsigned long, caml_val_ulong, caml_long_val); INPUT_OUTPUT_INOUT_TYPEMAPS(unsigned short, caml_val_ushort, caml_long_val); INPUT_OUTPUT_INOUT_TYPEMAPS(unsigned char, caml_val_uchar, caml_long_val); INPUT_OUTPUT_INOUT_TYPEMAPS(long long, caml_val_long, caml_long_val); INPUT_OUTPUT_INOUT_TYPEMAPS(unsigned long long, caml_val_ulong, caml_long_val); #undef INPUT_OUTPUT_INOUT_TYPEMAPS swig-4.0.1/Lib/ocaml/typeregister.swg0000644000175000017500000000006713527063513017424 0ustar williamwilliamSWIGEXT void SWIG_init() { SWIG_InitializeModule(0); swig-4.0.1/Lib/ocaml/std_pair.i0000644000175000017500000000140513527063513016130 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_pair.i * * SWIG typemaps for std::pair * ----------------------------------------------------------------------------- */ %include %include // ------------------------------------------------------------------------ // std::pair // ------------------------------------------------------------------------ %{ #include %} namespace std { template struct pair { typedef T first_type; typedef U second_type; pair(); pair(T first, U second); pair(const pair& other); template pair(const pair &other); T first; U second; }; // add specializations here } swig-4.0.1/Lib/ocaml/ocamlkw.swg0000644000175000017500000000224213527063513016330 0ustar williamwilliam#ifndef OCAML_OCAMLKW_SWG_ #define OCAML_OCAMLKW_SWG_ /* Warnings for Ocaml keywords */ #define OCAMLKW(x) %namewarn("314: '" #x "' is an ocaml keyword and it will be appropriately renamed") #x /* from https://caml.inria.fr/pub/docs/manual-ocaml/lex.html */ OCAMLKW(and); OCAMLKW(as); OCAMLKW(asr); OCAMLKW(assert); OCAMLKW(begin); OCAMLKW(class); OCAMLKW(constraint); OCAMLKW(do); OCAMLKW(done); OCAMLKW(downto); OCAMLKW(else); OCAMLKW(end); OCAMLKW(exception); OCAMLKW(external); OCAMLKW(false); OCAMLKW(for); OCAMLKW(fun); OCAMLKW(function); OCAMLKW(functor); OCAMLKW(if); OCAMLKW(in); OCAMLKW(include); OCAMLKW(inherit); OCAMLKW(initializer); OCAMLKW(land); OCAMLKW(lazy); OCAMLKW(let); OCAMLKW(lor); OCAMLKW(lsl); OCAMLKW(lsr); OCAMLKW(lxor); OCAMLKW(match); OCAMLKW(method); OCAMLKW(mod); OCAMLKW(module); OCAMLKW(mutable); OCAMLKW(new); OCAMLKW(nonrec); OCAMLKW(object); OCAMLKW(of); OCAMLKW(open); OCAMLKW(or); OCAMLKW(private); OCAMLKW(rec); OCAMLKW(sig); OCAMLKW(struct); OCAMLKW(then); OCAMLKW(to); OCAMLKW(true); OCAMLKW(try); OCAMLKW(type); OCAMLKW(val); OCAMLKW(virtual); OCAMLKW(when); OCAMLKW(while); OCAMLKW(with); #undef OCAMLKW #endif //OCAML_OCAMLKW_SWG_ swig-4.0.1/Lib/ocaml/class.swg0000644000175000017500000000337313527063513016006 0ustar williamwilliam(*Stream:class_ctors*) let create_$classname_from_ptr raw_ptr = C_obj begin let h = Hashtbl.create 20 in List.iter (fun (nm,fn) -> Hashtbl.replace h nm fn) [ "nop", (fun args -> C_void) ; $classbody "&", (fun args -> raw_ptr) ; ":parents", (fun args -> C_list (let out = ref [] in Hashtbl.iter (fun x y -> out := (x,y) :: !out) h ; (List.map (fun (x,y) -> C_string (String.sub x 2 ((String.length x) - 2))) (List.filter (fun (x,y) -> ((String.length x) > 2) && x.[0] == ':' && x.[1] == ':') !out)))) ; ":classof", (fun args -> C_string "$realname") ; ":methods", (fun args -> C_list (let out = ref [] in Hashtbl.iter (fun x y -> out := (C_string x) :: !out) h ; !out)) ] ; let rec invoke_inner raw_ptr mth arg = begin try let application = Hashtbl.find h mth in application (match arg with C_list l -> (C_list (raw_ptr :: l)) | C_void -> (C_list [ raw_ptr ]) | v -> (C_list [ raw_ptr ; v ])) with Not_found -> (* Try parent classes *) begin let parent_classes = [ $baselist ] in let rec try_parent plist raw_ptr = match plist with p :: tl -> begin try (invoke (p raw_ptr)) mth arg with (BadMethodName (p,m,s)) -> try_parent tl raw_ptr end | [] -> raise (BadMethodName (raw_ptr,mth,"$realname")) in try_parent parent_classes raw_ptr end end in (fun mth arg -> invoke_inner raw_ptr mth arg) end let _ = register_class_byname "$realname" create_$classname_from_ptr let _ = Callback.register "create_$normalized_from_ptr" create_$classname_from_ptr (*Stream:mli*) val create_$classname_from_ptr : c_obj -> c_obj swig-4.0.1/Lib/ocaml/stl.i0000644000175000017500000000044313527063513015126 0ustar williamwilliam/* ----------------------------------------------------------------------------- * stl.i * ----------------------------------------------------------------------------- */ %include %include %include %include %include swig-4.0.1/Lib/ocaml/carray.i0000644000175000017500000000613713527063513015613 0ustar williamwilliam%insert(mli) %{ type _value = c_obj %} %insert(ml) %{ type _value = c_obj %} %define %array_tmap_out(type,what,out_f) %typemap(type) what [ANY] { int i; $result = caml_array_new($1_dim0); for( i = 0; i < $1_dim0; i++ ) { caml_array_set($result,i,out_f($1[i])); } } %enddef %define %array_tmap_in(type,what,in_f) %typemap(type) what [ANY] { int i; $1 = ($*1_type *)malloc( $1_size ); for( i = 0; i < $1_dim0 && i < caml_array_len($input); i++ ) { $1[i] = in_f(caml_array_nth($input,i)); } } %typemap(free) what [ANY] { free( (void *)$1 ); } %enddef %define %make_simple_array_typemap(type,out_f,in_f) %array_tmap_out(out,type,out_f); %array_tmap_out(varout,type,out_f); %array_tmap_out(directorin,type,out_f); %array_tmap_in(in,type,in_f); %array_tmap_in(varin,type,in_f); %array_tmap_in(directorout,type,in_f); %enddef %make_simple_array_typemap(bool,caml_val_bool,caml_long_val); %make_simple_array_typemap(short,caml_val_short,caml_long_val); %make_simple_array_typemap(unsigned short,caml_val_ushort,caml_long_val); %make_simple_array_typemap(int,caml_val_int,caml_long_val); %make_simple_array_typemap(unsigned int,caml_val_uint,caml_long_val); %make_simple_array_typemap(long,caml_val_long,caml_long_val); %make_simple_array_typemap(unsigned long,caml_val_ulong,caml_long_val); %make_simple_array_typemap(size_t,caml_val_int,caml_long_val); %make_simple_array_typemap(float,caml_val_float,caml_double_val); %make_simple_array_typemap(double,caml_val_double,caml_double_val); #ifdef __cplusplus %typemap(in) SWIGTYPE [] { int i; $1 = new $*1_type [$1_dim0]; for( i = 0; i < $1_dim0 && i < caml_array_len($input); i++ ) { $1[i] = *(($*1_ltype *) caml_ptr_val(caml_array_nth($input,i), $*1_descriptor)) ; } } #else %typemap(in) SWIGTYPE [] { int i; $1 = ($*1_type *)malloc( $1_size ); for( i = 0; i < $1_dim0 && i < caml_array_len($input); i++ ) { $1[i] = *(($*1_ltype) caml_ptr_val(caml_array_nth($input), $*1_descriptor)); } } #endif %typemap(out) SWIGTYPE [] { int i; CAML_VALUE *fromval = caml_named_value("create_$ntype_from_ptr"); $result = caml_array_new($1_dim0); for( i = 0; i < $1_dim0; i++ ) { if( fromval ) { caml_array_set ($result, i, caml_callback(*fromval,caml_val_ptr((void *)&$1[i],$*1_descriptor))); } else { caml_array_set ($result, i, caml_val_ptr ((void *)&$1[i],$&1_descriptor)); } } } %typemap(in) enum SWIGTYPE [] { int i; $1 = ($*1_type *)malloc( $1_size ); for( i = 0; i < $1_dim0 && i < caml_array_len($input); i++ ) { $1[i] = ($type) caml_long_val_full(caml_array_nth($input), "$type_marker"); } } %typemap(out) enum SWIGTYPE [] { int i; $result = caml_array_new($1_dim0); for( i = 0; i < $1_dim0; i++ ) { caml_array_set ($result, i, caml_callback2(*caml_named_value(SWIG_MODULE "_int_to_enum"), *caml_named_value("$type_marker"), Val_int($1[i]))); } } #ifdef __cplusplus %typemap(freearg) SWIGTYPE [ANY] { delete [] $1; } #else %typemap(freearg) SWIGTYPE [ANY] { free( (void *)$1 ); } #endif swig-4.0.1/Lib/ocaml/std_list.i0000644000175000017500000001052113527063513016147 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_list.i * * SWIG typemaps for std::list types * ----------------------------------------------------------------------------- */ %include %module std_list %{ #include #include %} namespace std { template class list { public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef T value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; typedef T &iterator; typedef const T& const_iterator; list(); list(unsigned int size, const T& value = T()); list(const list& other); void assign(unsigned int n, const T& value); void swap(list &x); const_reference front(); const_reference back(); const_iterator begin(); const_iterator end(); void resize(unsigned int n, T c = T()); bool empty() const; void push_front(const T& x); void push_back(const T& x); void pop_front(); void pop_back(); void clear(); unsigned int size() const; unsigned int max_size() const; void resize(unsigned int n, const T& value); void remove(const T& value); void unique(); void reverse(); void sort(); %extend { const_reference __getitem__(int i) throw (std::out_of_range) { std::list::iterator first = self->begin(); int size = int(self->size()); if (i<0) i += size; if (i>=0 && i::iterator first = self->begin(); int size = int(self->size()); if (i<0) i += size; if (i>=0 && i::iterator first = self->begin(); int size = int(self->size()); if (i<0) i += size; if (i>=0 && ierase(first); } else throw std::out_of_range("list index out of range"); } std::list __getslice__(int i,int j) { std::list::iterator first = self->begin(); std::list::iterator end = self->end(); int size = int(self->size()); if (i<0) i += size; if (j<0) j += size; if (i<0) i = 0; if (j>size) j = size; if (i>=j) i=j; if (i>=0 && i=0) { for (int k=0;k tmp(j-i); if (j>i) std::copy(first,end,tmp.begin()); return tmp; } else throw std::out_of_range("list index out of range"); } void __delslice__(int i,int j) { std::list::iterator first = self->begin(); std::list::iterator end = self->end(); int size = int(self->size()); if (i<0) i += size; if (j<0) j += size; if (i<0) i = 0; if (j>size) j = size; for (int k=0;kerase(first,end); } void __setslice__(int i,int j, const std::list& v) { std::list::iterator first = self->begin(); std::list::iterator end = self->end(); int size = int(self->size()); if (i<0) i += size; if (j<0) j += size; if (i<0) i = 0; if (j>size) j = size; for (int k=0;kerase(first,end); if (i+1 <= int(self->size())) { first = self->begin(); for (int k=0;kinsert(first,v.begin(),v.end()); } else self->insert(self->end(),v.begin(),v.end()); } } unsigned int __len__() { return self->size(); } bool __nonzero__() { return !(self->empty()); } void append(const T& x) { self->push_back(x); } void pop() { self->pop_back(); } } }; } swig-4.0.1/Lib/ocaml/swigp4.ml0000644000175000017500000001477413527063513015735 0ustar williamwilliamopen Camlp4 module Id : Sig.Id = struct let name = "swigp4" let version = "0.1" end module Make (Syntax : Sig.Camlp4Syntax) = struct open Sig include Syntax let _loc = Loc.ghost let lap x y = x :: y let c_ify e loc = match e with <:expr< $int:_$ >> -> <:expr< (C_int $e$) >> | <:expr< $str:_$ >> -> <:expr< (C_string $e$) >> | <:expr< $chr:_$ >> -> <:expr< (C_char $e$) >> | <:expr< $flo:_$ >> -> <:expr< (C_double $e$) >> | <:expr< True >> -> <:expr< (C_bool $e$) >> | <:expr< False >> -> <:expr< (C_bool $e$) >> | _ -> <:expr< $e$ >> let mk_list args loc f = let rec mk_list_inner args loc f = match args with [] -> <:expr< [] >> | x :: xs -> (let loc = Ast.loc_of_expr x in <:expr< [ ($f x _loc$) ] @ ($mk_list_inner xs loc f$) >>) in match args with [] -> <:expr< (Obj.magic C_void) >> | [ a ] -> <:expr< (Obj.magic $f a _loc$) >> | _ -> <:expr< (Obj.magic (C_list ($mk_list_inner args loc f$))) >> ;; EXTEND Gram GLOBAL: expr; expr: LEVEL "top" [ [ e1 = expr ; "'" ; "[" ; e2 = expr ; "]" -> <:expr< (invoke $e1$) "[]" (C_list [ $c_ify e2 _loc$ ]) >> | e1 = expr ; "->" ; l = LIDENT ; "(" ; args = LIST0 (expr LEVEL "simple") SEP "," ; ")" -> <:expr< (invoke $e1$) $str:l$ ($mk_list args _loc c_ify$) >> | e1 = expr ; "->" ; u = UIDENT ; "(" ; args = LIST0 (expr LEVEL "simple") SEP "," ; ")" -> <:expr< (invoke $e1$) $str:u$ ($mk_list args _loc c_ify$) >> | e1 = expr ; "->" ; s = expr LEVEL "simple" ; "(" ; args = LIST0 (expr LEVEL "simple") SEP "," ; ")" -> <:expr< (invoke $e1$) $s$ ($mk_list args _loc c_ify$) >> | e1 = expr ; "'" ; "." ; "(" ; args = LIST0 (expr LEVEL "simple") SEP "," ; ")" -> <:expr< (invoke $e1$) "()" ($mk_list args _loc c_ify$) >> | e1 = expr ; "'" ; "->" ; l = LIDENT ; "(" ; args = LIST0 (expr LEVEL "simple") SEP "," ; ")" -> <:expr< (invoke ((invoke $e1$) "->" C_void)) $str:l$ ($mk_list args _loc c_ify$) >> | e1 = expr ; "'" ; "->" ; u = UIDENT ; "(" ; args = LIST0 (expr LEVEL "simple") SEP "," ; ")" -> <:expr< (invoke ((invoke $e1$) "->" C_void)) $str:u$ ($mk_list args _loc c_ify$) >> | e1 = expr ; "'" ; "->" ; s = expr LEVEL "simple" ; "(" ; args = LIST0 (expr LEVEL "simple") SEP "," ; ")" -> <:expr< (invoke ((invoke $e1$) "->" C_void)) $s$ ($mk_list args _loc c_ify$) >> | e1 = expr ; "'" ; "++" -> <:expr< (invoke $e1$) "++" C_void >> | e1 = expr ; "'" ; "--" -> <:expr< (invoke $e1$) "--" C_void >> | e1 = expr ; "'" ; "-" ; e2 = expr -> <:expr< (invoke $e1$) "-" (C_list [ $c_ify e2 _loc$ ]) >> | e1 = expr ; "'" ; "+" ; e2 = expr -> <:expr< (invoke $e1$) "+" (C_list [ $c_ify e2 _loc$ ]) >> | e1 = expr ; "'" ; "*" ; e2 = expr -> <:expr< (invoke $e1$) "*" (C_list [ $c_ify e2 _loc$ ]) >> | "'" ; "&" ; e1 = expr -> <:expr< (invoke $e1$) "&" C_void >> | "'" ; "!" ; e1 = expr -> <:expr< (invoke $e1$) "!" C_void >> | "'" ; "~" ; e1 = expr -> <:expr< (invoke $e1$) "~" C_void >> | e1 = expr ; "'" ; "/" ; e2 = expr -> <:expr< (invoke $e1$) "/" (C_list [ $c_ify e2 _loc$ ]) >> | e1 = expr ; "'" ; "%" ; e2 = expr -> <:expr< (invoke $e1$) "%" (C_list [ $c_ify e2 _loc$ ]) >> | e1 = expr ; "'" ; "lsl" ; e2 = expr -> <:expr< (invoke $e1$) ("<" ^ "<") (C_list [ $c_ify e2 _loc$ ]) >> | e1 = expr ; "'" ; "lsr" ; e2 = expr -> <:expr< (invoke $e1$) (">" ^ ">") (C_list [ $c_ify e2 _loc$ ]) >> | e1 = expr ; "'" ; "<" ; e2 = expr -> <:expr< (invoke $e1$) "<" (C_list [ $c_ify e2 _loc$ ]) >> | e1 = expr ; "'" ; "<=" ; e2 = expr -> <:expr< (invoke $e1$) "<=" (C_list [ $c_ify e2 _loc$ ]) >> | e1 = expr ; "'" ; ">" ; e2 = expr -> <:expr< (invoke $e1$) ">" (C_list [ $c_ify e2 _loc$ ]) >> | e1 = expr ; "'" ; ">=" ; e2 = expr -> <:expr< (invoke $e1$) ">=" (C_list [ $c_ify e2 _loc$ ]) >> | e1 = expr ; "'" ; "==" ; e2 = expr -> <:expr< (invoke $e1$) "==" (C_list [ $c_ify e2 _loc$ ]) >> | e1 = expr ; "'" ; "!=" ; e2 = expr -> <:expr< (invoke $e1$) "!=" (C_list [ $c_ify e2 _loc$ ]) >> | e1 = expr ; "'" ; "&" ; e2 = expr -> <:expr< (invoke $e1$) "&" (C_list [ $c_ify e2 _loc$ ]) >> | e1 = expr ; "'" ; "^" ; e2 = expr -> <:expr< (invoke $e1$) "^" (C_list [ $c_ify e2 _loc$ ]) >> | e1 = expr ; "'" ; "|" ; e2 = expr -> <:expr< (invoke $e1$) "|" (C_list [ $c_ify e2 _loc$ ]) >> | e1 = expr ; "'" ; "&&" ; e2 = expr -> <:expr< (invoke $e1$) "&&" (C_list [ $c_ify e2 _loc$ ]) >> | e1 = expr ; "'" ; "||" ; e2 = expr -> <:expr< (invoke $e1$) "||" (C_list [ $c_ify e2 _loc$ ]) >> | e1 = expr ; "'" ; "=" ; e2 = expr -> <:expr< (invoke $e1$) "=" (C_list [ $c_ify e2 _loc$ ]) >> | e1 = expr ; "'" ; "+=" ; e2 = expr -> <:expr< (invoke $e1$) "+=" (C_list [ $c_ify e2 _loc$ ]) >> | e1 = expr ; "'" ; "-=" ; e2 = expr -> <:expr< (invoke $e1$) "-=" (C_list [ $c_ify e2 _loc$ ]) >> | e1 = expr ; "'" ; "*=" ; e2 = expr -> <:expr< (invoke $e1$) "*=" (C_list [ $c_ify e2 _loc$ ]) >> | e1 = expr ; "'" ; "/=" ; e2 = expr -> <:expr< (invoke $e1$) "/=" (C_list [ $c_ify e2 _loc$ ]) >> | e1 = expr ; "'" ; "%=" ; e2 = expr -> <:expr< (invoke $e1$) "%=" (C_list [ $c_ify e2 _loc$ ]) >> | e1 = expr ; "'" ; "lsl" ; "=" ; e2 = expr -> <:expr< (invoke $e1$) ("<" ^ "<=") (C_list [ $c_ify e2 _loc$ ]) >> | e1 = expr ; "'" ; "lsr" ; "=" ; e2 = expr -> <:expr< (invoke $e1$) (">" ^ ">=") (C_list [ $c_ify e2 _loc$ ]) >> | e1 = expr ; "'" ; "&=" ; e2 = expr -> <:expr< (invoke $e1$) "&=" (C_list [ $c_ify e2 _loc$ ]) >> | e1 = expr ; "'" ; "^=" ; e2 = expr -> <:expr< (invoke $e1$) "^=" (C_list [ $c_ify e2 _loc$ ]) >> | e1 = expr ; "'" ; "|=" ; e2 = expr -> <:expr< (invoke $e1$) "|=" (C_list [ $c_ify e2 _loc$ ]) >> | "'" ; e = expr -> c_ify e _loc | c = expr ; "as" ; id = LIDENT -> <:expr< $lid:"get_" ^ id$ $c$ >> | c = expr ; "to" ; id = LIDENT -> <:expr< $uid:"C_" ^ id$ $c$ >> | "`" ; "`" ; l = LIDENT -> <:expr< C_enum `$lid:l$ >> | "`" ; "`" ; u = UIDENT -> <:expr< C_enum `$uid:u$ >> | f = expr ; "'" ; "(" ; args = LIST0 (expr LEVEL "simple") SEP "," ; ")" -> <:expr< $f$ ($mk_list args _loc c_ify$) >> ] ] ; END ;; end module M = Register.OCamlSyntaxExtension(Id)(Make) swig-4.0.1/Lib/ocaml/std_string.i0000644000175000017500000000612013527063513016502 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_string.i * * SWIG typemaps for std::string * ----------------------------------------------------------------------------- */ // ------------------------------------------------------------------------ // std::string is typemapped by value // This can prevent exporting methods which return a string // in order for the user to modify it. // However, I think I'll wait until someone asks for it... // ------------------------------------------------------------------------ %{ #include #include %} %include %include namespace std { %naturalvar string; %naturalvar wstring; class string; class wstring; /* Overloading check */ %typemap(in) string { if (caml_ptr_check($input)) $1.assign((char *)caml_ptr_val($input,0), caml_string_len($input)); else SWIG_exception(SWIG_TypeError, "string expected"); } %typemap(in) const string & ($*1_ltype temp) { if (caml_ptr_check($input)) { temp.assign((char *)caml_ptr_val($input,0), caml_string_len($input)); $1 = &temp; } else { SWIG_exception(SWIG_TypeError, "string expected"); } } %typemap(in) string & ($*1_ltype temp) { if (caml_ptr_check($input)) { temp.assign((char *)caml_ptr_val($input,0), caml_string_len($input)); $1 = &temp; } else { SWIG_exception(SWIG_TypeError, "string expected"); } } %typemap(in) string * ($*1_ltype *temp) { if (caml_ptr_check($input)) { temp = new $*1_ltype((char *)caml_ptr_val($input,0), caml_string_len($input)); $1 = temp; } else { SWIG_exception(SWIG_TypeError, "string expected"); } } %typemap(free) string * ($*1_ltype *temp) { delete temp; } %typemap(argout) string & { swig_result = caml_list_append(swig_result,caml_val_string_len((*$1).c_str(), (*$1).size())); } %typemap(directorin) string { swig_result = caml_val_string_len($1.c_str(), $1.size()); args = caml_list_append(args, swig_result); } %typemap(directorout) string { $result.assign((char *)caml_ptr_val($input,0), caml_string_len($input)); } %typemap(out) string { $result = caml_val_string_len($1.c_str(),$1.size()); } %typemap(out) string * { $result = caml_val_string_len((*$1).c_str(),(*$1).size()); } %typemap(typecheck) string, const string & = char *; } #ifdef ENABLE_CHARPTR_ARRAY char **c_charptr_array( const std::vector &str_v ); %{ SWIGEXT char **c_charptr_array( const std::vector &str_v ) { char **out = new char *[str_v.size() + 1]; out[str_v.size()] = 0; for( int i = 0; i < str_v.size(); i++ ) { out[i] = (char *)str_v[i].c_str(); } return out; } %} #endif #ifdef ENABLE_STRING_VECTOR %template (StringVector) std::vector; %insert(ml) %{ (* Some STL convenience items *) let string_array_to_vector sa = let nv = _new_StringVector C_void in ignore (array_to_vector nv (fun x -> C_string x) sa) ; nv let c_string_array ar = _c_charptr_array (string_array_to_vector ar) %} %insert(mli) %{ val c_string_array: string array -> c_obj %} #endif swig-4.0.1/Lib/ocaml/std_map.i0000644000175000017500000000505513527063513015757 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_map.i * * SWIG typemaps for std::map * ----------------------------------------------------------------------------- */ %include // ------------------------------------------------------------------------ // std::map // ------------------------------------------------------------------------ %{ #include #include #include %} // exported class namespace std { template > class map { // add typemaps here public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef K key_type; typedef T mapped_type; typedef std::pair< const K, T > value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; map(); map(const map& other); unsigned int size() const; bool empty() const; void clear(); %extend { const T& get(const K& key) throw (std::out_of_range) { std::map< K, T, C >::iterator i = self->find(key); if (i != self->end()) return i->second; else throw std::out_of_range("key not found"); } void set(const K& key, const T& x) { (*self)[key] = x; } void del(const K& key) throw (std::out_of_range) { std::map< K, T, C >::iterator i = self->find(key); if (i != self->end()) self->erase(i); else throw std::out_of_range("key not found"); } bool has_key(const K& key) { std::map< K, T, C >::iterator i = self->find(key); return i != self->end(); } } }; // Legacy macros (deprecated) %define specialize_std_map_on_key(K,CHECK,CONVERT_FROM,CONVERT_TO) #warning "specialize_std_map_on_key ignored - macro is deprecated and no longer necessary" %enddef %define specialize_std_map_on_value(T,CHECK,CONVERT_FROM,CONVERT_TO) #warning "specialize_std_map_on_value ignored - macro is deprecated and no longer necessary" %enddef %define specialize_std_map_on_both(K,CHECK_K,CONVERT_K_FROM,CONVERT_K_TO, T,CHECK_T,CONVERT_T_FROM,CONVERT_T_TO) #warning "specialize_std_map_on_both ignored - macro is deprecated and no longer necessary" %enddef } swig-4.0.1/Lib/ocaml/cstring.i0000644000175000017500000001367413527063513016007 0ustar williamwilliam/* ----------------------------------------------------------------------------- * cstring.i * * This file provides typemaps and macros for dealing with various forms * of C character string handling. The primary use of this module * is in returning character data that has been allocated or changed in * some way. * ----------------------------------------------------------------------------- */ /* %cstring_input_binary(TYPEMAP, SIZE) * * Macro makes a function accept binary string data along with * a size. */ %define %cstring_input_binary(TYPEMAP, SIZE) %apply (char *STRING, int LENGTH) { (TYPEMAP, SIZE) }; %enddef /* * %cstring_bounded_output(TYPEMAP, MAX) * * This macro is used to return a NULL-terminated output string of * some maximum length. For example: * * %cstring_bounded_output(char *outx, 512); * void foo(char *outx) { * sprintf(outx,"blah blah\n"); * } * */ %define %cstring_bounded_output(TYPEMAP,MAX) %typemap(ignore) TYPEMAP(char temp[MAX+1]) { $1 = ($1_ltype) temp; } %typemap(argout) TYPEMAP { $1[MAX] = 0; $result = caml_list_append($result,caml_val_string(str)); } %enddef /* * %cstring_chunk_output(TYPEMAP, SIZE) * * This macro is used to return a chunk of binary string data. * Embedded NULLs are okay. For example: * * %cstring_chunk_output(char *outx, 512); * void foo(char *outx) { * memmove(outx, somedata, 512); * } * */ %define %cstring_chunk_output(TYPEMAP,SIZE) %typemap(ignore) TYPEMAP(char temp[SIZE]) { $1 = ($1_ltype) temp; } %typemap(argout) TYPEMAP { $result = caml_list_append($result,caml_val_string_len($1,SIZE)); } %enddef /* * %cstring_bounded_mutable(TYPEMAP, SIZE) * * This macro is used to wrap a string that's going to mutate. * * %cstring_bounded_mutable(char *in, 512); * void foo(in *x) { * while (*x) { * *x = toupper(*x); * x++; * } * } * */ %define %cstring_bounded_mutable(TYPEMAP,MAX) %typemap(in) TYPEMAP(char temp[MAX+1]) { char *t = (char *)caml_ptr_val($input); strncpy(temp,t,MAX); $1 = ($1_ltype) temp; } %typemap(argout) TYPEMAP { $result = caml_list_append($result,caml_val_string_len($1,MAX)); } %enddef /* * %cstring_mutable(TYPEMAP [, expansion]) * * This macro is used to wrap a string that will mutate in place. * It may change size up to a user-defined expansion. * * %cstring_mutable(char *in); * void foo(in *x) { * while (*x) { * *x = toupper(*x); * x++; * } * } * */ %define %cstring_mutable(TYPEMAP,...) %typemap(in) TYPEMAP { char *t = String_val($input); int n = caml_string_length($input); $1 = ($1_ltype) t; #if #__VA_ARGS__ == "" #ifdef __cplusplus $1 = ($1_ltype) new char[n+1]; #else $1 = ($1_ltype) malloc(n+1); #endif #else #ifdef __cplusplus $1 = ($1_ltype) new char[n+1+__VA_ARGS__]; #else $1 = ($1_ltype) malloc(n+1+__VA_ARGS__); #endif #endif memmove($1,t,n); $1[n] = 0; } %typemap(argout) TYPEMAP { $result = caml_list_append($result,caml_val_string($1)); #ifdef __cplusplus delete[] $1; #else free($1); #endif } %enddef /* * %cstring_output_maxsize(TYPEMAP, SIZE) * * This macro returns data in a string of some user-defined size. * * %cstring_output_maxsize(char *outx, int max) { * void foo(char *outx, int max) { * sprintf(outx,"blah blah\n"); * } */ %define %cstring_output_maxsize(TYPEMAP, SIZE) %typemap(in) (TYPEMAP, SIZE) { $2 = caml_val_long($input); #ifdef __cplusplus $1 = ($1_ltype) new char[$2+1]; #else $1 = ($1_ltype) malloc($2+1); #endif } %typemap(argout) (TYPEMAP,SIZE) { $result = caml_list_append($result,caml_val_string($1)); #ifdef __cplusplus delete [] $1; #else free($1); #endif } %enddef /* * %cstring_output_withsize(TYPEMAP, SIZE) * * This macro is used to return character data along with a size * parameter. * * %cstring_output_maxsize(char *outx, int *max) { * void foo(char *outx, int *max) { * sprintf(outx,"blah blah\n"); * *max = strlen(outx); * } */ %define %cstring_output_withsize(TYPEMAP, SIZE) %typemap(in) (TYPEMAP, SIZE) { int n = caml_val_long($input); #ifdef __cplusplus $1 = ($1_ltype) new char[n+1]; $2 = ($2_ltype) new $*1_ltype; #else $1 = ($1_ltype) malloc(n+1); $2 = ($2_ltype) malloc(sizeof($*1_ltype)); #endif *$2 = n; } %typemap(argout) (TYPEMAP,SIZE) { $result = caml_list_append($result,caml_val_string_len($1,$2)); #ifdef __cplusplus delete [] $1; delete $2; #else free($1); free($2); #endif } %enddef /* * %cstring_output_allocate(TYPEMAP, RELEASE) * * This macro is used to return character data that was * allocated with new or malloc. * * %cstring_output_allocated(char **outx, free($1)); * void foo(char **outx) { * *outx = (char *) malloc(512); * sprintf(outx,"blah blah\n"); * } */ %define %cstring_output_allocate(TYPEMAP, RELEASE) %typemap(ignore) TYPEMAP($*1_ltype temp = 0) { $1 = &temp; } %typemap(argout) TYPEMAP { if (*$1) { $result = caml_list_append($result,caml_val_string($1)); RELEASE; } else { $result = caml_list_append($result,caml_val_ptr($1)); } } %enddef /* * %cstring_output_allocate_size(TYPEMAP, SIZE, RELEASE) * * This macro is used to return character data that was * allocated with new or malloc. * * %cstring_output_allocated(char **outx, int *sz, free($1)); * void foo(char **outx, int *sz) { * *outx = (char *) malloc(512); * sprintf(outx,"blah blah\n"); * *sz = strlen(outx); * } */ %define %cstring_output_allocate_size(TYPEMAP, SIZE, RELEASE) %typemap(ignore) (TYPEMAP, SIZE) ($*1_ltype temp = 0, $*2_ltype tempn) { $1 = &temp; $2 = &tempn; } %typemap(argout)(TYPEMAP,SIZE) { if (*$1) { $result = caml_list_append($result,caml_val_string_len($1,$2)); RELEASE; } else $result = caml_list_append($result,caml_val_ptr($1)); } %enddef swig-4.0.1/Lib/ocaml/typecheck.i0000644000175000017500000001233413527063513016305 0ustar williamwilliam/* ----------------------------------------------------------------------------- * typecheck.i * * Typechecking rules * ----------------------------------------------------------------------------- */ %typecheck(SWIG_TYPECHECK_INT8) char, signed char, const char &, const signed char & { if( !Is_block($input) ) $1 = 0; else { switch( SWIG_Tag_val($input) ) { case C_char: $1 = 1; break; default: $1 = 0; break; } } } %typecheck(SWIG_TYPECHECK_UINT8) unsigned char, const unsigned char & { if( !Is_block($input) ) $1 = 0; else { switch( SWIG_Tag_val($input) ) { case C_uchar: $1 = 1; break; default: $1 = 0; break; } } } %typecheck(SWIG_TYPECHECK_INT16) short, signed short, const short &, const signed short &, wchar_t { if( !Is_block($input) ) $1 = 0; else { switch( SWIG_Tag_val($input) ) { case C_short: $1 = 1; break; default: $1 = 0; break; } } } %typecheck(SWIG_TYPECHECK_UINT16) unsigned short, const unsigned short & { if( !Is_block($input) ) $1 = 0; else { switch( SWIG_Tag_val($input) ) { case C_ushort: $1 = 1; break; default: $1 = 0; break; } } } // XXX arty // Will move enum SWIGTYPE later when I figure out what to do with it... %typecheck(SWIG_TYPECHECK_INT32) int, signed int, const int &, const signed int &, enum SWIGTYPE { if( !Is_block($input) ) $1 = 0; else { switch( SWIG_Tag_val($input) ) { case C_int: $1 = 1; break; default: $1 = 0; break; } } } %typecheck(SWIG_TYPECHECK_UINT32) unsigned int, const unsigned int & { if( !Is_block($input) ) $1 = 0; else { switch( SWIG_Tag_val($input) ) { case C_uint: $1 = 1; break; case C_int32: $1 = 1; break; default: $1 = 0; break; } } } %typecheck(SWIG_TYPECHECK_INT64) long, signed long, unsigned long, long long, signed long long, unsigned long long, const long &, const signed long &, const unsigned long &, const long long &, const signed long long &, const unsigned long long &, size_t, const size_t & { if( !Is_block($input) ) $1 = 0; else { switch( SWIG_Tag_val($input) ) { case C_int64: $1 = 1; break; default: $1 = 0; break; } } } %typecheck(SWIG_TYPECHECK_BOOL) bool, const bool & { if( !Is_block($input) ) $1 = 0; else { switch( SWIG_Tag_val($input) ) { case C_bool: $1 = 1; break; default: $1 = 0; break; } } } %typecheck(SWIG_TYPECHECK_FLOAT) float, const float & { if( !Is_block($input) ) $1 = 0; else { switch( SWIG_Tag_val($input) ) { case C_float: $1 = 1; break; default: $1 = 0; break; } } } %typecheck(SWIG_TYPECHECK_DOUBLE) double, const double & { if( !Is_block($input) ) $1 = 0; else { switch( SWIG_Tag_val($input) ) { case C_double: $1 = 1; break; default: $1 = 0; break; } } } %typecheck(SWIG_TYPECHECK_STRING) char * { if( !Is_block($input) ) $1 = 0; else { switch( SWIG_Tag_val($input) ) { case C_string: $1 = 1; break; case C_ptr: { swig_type_info *typeinfo = (swig_type_info *)(long)SWIG_Int64_val(SWIG_Field($input,1)); $1 = SWIG_TypeCheck("char *",typeinfo) || SWIG_TypeCheck("signed char *",typeinfo) || SWIG_TypeCheck("unsigned char *",typeinfo) || SWIG_TypeCheck("const char *",typeinfo) || SWIG_TypeCheck("const signed char *",typeinfo) || SWIG_TypeCheck("const unsigned char *",typeinfo) || SWIG_TypeCheck("std::string",typeinfo); } break; default: $1 = 0; break; } } } %typecheck(SWIG_TYPECHECK_POINTER) SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE [] { if (!Is_block($input) || !(SWIG_Tag_val($input) == C_obj || SWIG_Tag_val($input) == C_ptr)) { $1 = 0; } else { void *ptr; $1 = !caml_ptr_val_internal($input, &ptr, $descriptor); } } %typecheck(SWIG_TYPECHECK_POINTER) SWIGTYPE { swig_type_info *typeinfo; if (!Is_block($input)) { $1 = 0; } else { switch (SWIG_Tag_val($input)) { case C_obj: { void *ptr; $1 = !caml_ptr_val_internal($input, &ptr, $&1_descriptor); break; } case C_ptr: { typeinfo = (swig_type_info *)SWIG_Int64_val(SWIG_Field($input, 1)); $1 = SWIG_TypeCheck("$1_type", typeinfo) != NULL; break; } default: $1 = 0; break; } } } %typecheck(SWIG_TYPECHECK_VOIDPTR) void * { void *ptr; $1 = !caml_ptr_val_internal($input, &ptr, 0); } %typecheck(SWIG_TYPECHECK_SWIGOBJECT) CAML_VALUE "$1 = 1;" /* ------------------------------------------------------------ * Exception handling * ------------------------------------------------------------ */ %typemap(throws) int, long, short, unsigned int, unsigned long, unsigned short { char error_msg[256]; sprintf(error_msg, "C++ $1_type exception thrown, value: %d", $1); SWIG_OCamlThrowException(SWIG_OCamlRuntimeException, error_msg); } %typemap(throws) SWIGTYPE, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE *, SWIGTYPE [], SWIGTYPE [ANY] { (void)$1; SWIG_OCamlThrowException(SWIG_OCamlRuntimeException, "C++ $1_type exception thrown"); } %typemap(throws) char * { SWIG_OCamlThrowException(SWIG_OCamlRuntimeException, $1); } swig-4.0.1/Lib/ocaml/ocaml.i0000644000175000017500000000243213527063513015417 0ustar williamwilliam/* ----------------------------------------------------------------------------- * ocaml.i * * SWIG Configuration File for Ocaml * ----------------------------------------------------------------------------- */ /* Insert common stuff */ %insert(runtime) "swigrun.swg" /* Include headers */ %insert(runtime) "ocamlrundec.swg" /* Type registration */ %insert(init) "swiginit.swg" %insert(init) "typeregister.swg" %insert(mlitail) %{ val swig_val : c_enum_type -> c_obj -> Swig.c_obj %} %insert(mltail) %{ let rec swig_val t v = match v with C_enum e -> enum_to_int t v | C_list l -> Swig.C_list (List.map (swig_val t) l) | C_array a -> Swig.C_array (Array.map (swig_val t) a) | _ -> Obj.magic v %} /*#ifndef SWIG_NOINCLUDE*/ %insert(runtime) "ocamlrun.swg" /*#endif*/ %insert(classtemplate) "class.swg" /* Read in standard typemaps. */ %include %include %include %include %include /* ocaml keywords */ /* There's no need to use this, because of my rewriting machinery. C++ * words never collide with ocaml keywords */ /* still we include the file, but the warning says that the offending name will be properly renamed. Just to let the user to know about it. */ %include swig-4.0.1/Lib/ocaml/swig.mli0000644000175000017500000000333613527063513015632 0ustar williamwilliam(* -*- tuareg -*- *) type enum = [ `Int of int ] type 'a c_obj_t = C_void | C_bool of bool | C_char of char | C_uchar of char | C_short of int | C_ushort of int | C_int of int | C_uint of int32 | C_int32 of int32 | C_int64 of int64 | C_float of float | C_double of float | C_ptr of int64 * int64 | C_array of 'a c_obj_t array | C_list of 'a c_obj_t list | C_obj of (string -> 'a c_obj_t -> 'a c_obj_t) | C_string of string | C_enum of 'a | C_director_core of 'a c_obj_t * 'a c_obj_t option ref type c_obj = enum c_obj_t exception InvalidDirectorCall of c_obj exception NoSuchClass of string val invoke : ('a c_obj_t) -> (string -> 'a c_obj_t -> 'a c_obj_t) val fnhelper : 'a c_obj_t -> 'a c_obj_t list val director_core_helper : 'a c_obj_t list -> 'a c_obj_t list val get_int : 'a c_obj_t -> int val get_float : 'a c_obj_t -> float val get_string : 'a c_obj_t -> string val get_char : 'a c_obj_t -> char val get_bool : 'a c_obj_t -> bool val make_float : float -> 'a c_obj_t val make_double : float -> 'a c_obj_t val make_string : string -> 'a c_obj_t val make_bool : bool -> 'a c_obj_t val make_char : char -> 'a c_obj_t val make_char_i : int -> 'a c_obj_t val make_uchar : char -> 'a c_obj_t val make_uchar_i : int -> 'a c_obj_t val make_short : int -> 'a c_obj_t val make_ushort : int -> 'a c_obj_t val make_int : int -> 'a c_obj_t val make_uint : int -> 'a c_obj_t val make_int32 : int -> 'a c_obj_t val make_int64 : int -> 'a c_obj_t val new_derived_object: ('a c_obj_t -> 'a c_obj_t) -> ('a c_obj_t -> string -> 'a c_obj_t -> 'a c_obj_t) -> 'a c_obj_t -> 'a c_obj_t val register_class_byname : string -> ('a c_obj_t -> 'a c_obj_t) -> unit val create_class : string -> 'a c_obj_t -> 'a c_obj_t swig-4.0.1/Lib/xml/0000755000175000017500000000000013527063513013656 5ustar williamwilliamswig-4.0.1/Lib/xml/xml.swg0000644000175000017500000000002513527063513015175 0ustar williamwilliam/* nothing special */swig-4.0.1/Lib/xml/typemaps.i0000644000175000017500000000026313527063513015673 0ustar williamwilliam// -------------------------------------------------------------------- // Empty file for %include to work // -------------------------------------------------------------------- swig-4.0.1/Lib/swiginit.swg0000644000175000017500000001752513527063513015447 0ustar williamwilliam/* ----------------------------------------------------------------------------- * Type initialization: * This problem is tough by the requirement that no dynamic * memory is used. Also, since swig_type_info structures store pointers to * swig_cast_info structures and swig_cast_info structures store pointers back * to swig_type_info structures, we need some lookup code at initialization. * The idea is that swig generates all the structures that are needed. * The runtime then collects these partially filled structures. * The SWIG_InitializeModule function takes these initial arrays out of * swig_module, and does all the lookup, filling in the swig_module.types * array with the correct data and linking the correct swig_cast_info * structures together. * * The generated swig_type_info structures are assigned statically to an initial * array. We just loop through that array, and handle each type individually. * First we lookup if this type has been already loaded, and if so, use the * loaded structure instead of the generated one. Then we have to fill in the * cast linked list. The cast data is initially stored in something like a * two-dimensional array. Each row corresponds to a type (there are the same * number of rows as there are in the swig_type_initial array). Each entry in * a column is one of the swig_cast_info structures for that type. * The cast_initial array is actually an array of arrays, because each row has * a variable number of columns. So to actually build the cast linked list, * we find the array of casts associated with the type, and loop through it * adding the casts to the list. The one last trick we need to do is making * sure the type pointer in the swig_cast_info struct is correct. * * First off, we lookup the cast->type name to see if it is already loaded. * There are three cases to handle: * 1) If the cast->type has already been loaded AND the type we are adding * casting info to has not been loaded (it is in this module), THEN we * replace the cast->type pointer with the type pointer that has already * been loaded. * 2) If BOTH types (the one we are adding casting info to, and the * cast->type) are loaded, THEN the cast info has already been loaded by * the previous module so we just ignore it. * 3) Finally, if cast->type has not already been loaded, then we add that * swig_cast_info to the linked list (because the cast->type) pointer will * be correct. * ----------------------------------------------------------------------------- */ #ifdef __cplusplus extern "C" { #if 0 } /* c-mode */ #endif #endif #if 0 #define SWIGRUNTIME_DEBUG #endif SWIGRUNTIME void SWIG_InitializeModule(void *clientdata) { size_t i; swig_module_info *module_head, *iter; int init; /* check to see if the circular list has been setup, if not, set it up */ if (swig_module.next==0) { /* Initialize the swig_module */ swig_module.type_initial = swig_type_initial; swig_module.cast_initial = swig_cast_initial; swig_module.next = &swig_module; init = 1; } else { init = 0; } /* Try and load any already created modules */ module_head = SWIG_GetModule(clientdata); if (!module_head) { /* This is the first module loaded for this interpreter */ /* so set the swig module into the interpreter */ SWIG_SetModule(clientdata, &swig_module); } else { /* the interpreter has loaded a SWIG module, but has it loaded this one? */ iter=module_head; do { if (iter==&swig_module) { /* Our module is already in the list, so there's nothing more to do. */ return; } iter=iter->next; } while (iter!= module_head); /* otherwise we must add our module into the list */ swig_module.next = module_head->next; module_head->next = &swig_module; } /* When multiple interpreters are used, a module could have already been initialized in a different interpreter, but not yet have a pointer in this interpreter. In this case, we do not want to continue adding types... everything should be set up already */ if (init == 0) return; /* Now work on filling in swig_module.types */ #ifdef SWIGRUNTIME_DEBUG printf("SWIG_InitializeModule: size %lu\n", (unsigned long)swig_module.size); #endif for (i = 0; i < swig_module.size; ++i) { swig_type_info *type = 0; swig_type_info *ret; swig_cast_info *cast; #ifdef SWIGRUNTIME_DEBUG printf("SWIG_InitializeModule: type %lu %s\n", (unsigned long)i, swig_module.type_initial[i]->name); #endif /* if there is another module already loaded */ if (swig_module.next != &swig_module) { type = SWIG_MangledTypeQueryModule(swig_module.next, &swig_module, swig_module.type_initial[i]->name); } if (type) { /* Overwrite clientdata field */ #ifdef SWIGRUNTIME_DEBUG printf("SWIG_InitializeModule: found type %s\n", type->name); #endif if (swig_module.type_initial[i]->clientdata) { type->clientdata = swig_module.type_initial[i]->clientdata; #ifdef SWIGRUNTIME_DEBUG printf("SWIG_InitializeModule: found and overwrite type %s \n", type->name); #endif } } else { type = swig_module.type_initial[i]; } /* Insert casting types */ cast = swig_module.cast_initial[i]; while (cast->type) { /* Don't need to add information already in the list */ ret = 0; #ifdef SWIGRUNTIME_DEBUG printf("SWIG_InitializeModule: look cast %s\n", cast->type->name); #endif if (swig_module.next != &swig_module) { ret = SWIG_MangledTypeQueryModule(swig_module.next, &swig_module, cast->type->name); #ifdef SWIGRUNTIME_DEBUG if (ret) printf("SWIG_InitializeModule: found cast %s\n", ret->name); #endif } if (ret) { if (type == swig_module.type_initial[i]) { #ifdef SWIGRUNTIME_DEBUG printf("SWIG_InitializeModule: skip old type %s\n", ret->name); #endif cast->type = ret; ret = 0; } else { /* Check for casting already in the list */ swig_cast_info *ocast = SWIG_TypeCheck(ret->name, type); #ifdef SWIGRUNTIME_DEBUG if (ocast) printf("SWIG_InitializeModule: skip old cast %s\n", ret->name); #endif if (!ocast) ret = 0; } } if (!ret) { #ifdef SWIGRUNTIME_DEBUG printf("SWIG_InitializeModule: adding cast %s\n", cast->type->name); #endif if (type->cast) { type->cast->prev = cast; cast->next = type->cast; } type->cast = cast; } cast++; } /* Set entry in modules->types array equal to the type */ swig_module.types[i] = type; } swig_module.types[i] = 0; #ifdef SWIGRUNTIME_DEBUG printf("**** SWIG_InitializeModule: Cast List ******\n"); for (i = 0; i < swig_module.size; ++i) { int j = 0; swig_cast_info *cast = swig_module.cast_initial[i]; printf("SWIG_InitializeModule: type %lu %s\n", (unsigned long)i, swig_module.type_initial[i]->name); while (cast->type) { printf("SWIG_InitializeModule: cast type %s\n", cast->type->name); cast++; ++j; } printf("---- Total casts: %d\n",j); } printf("**** SWIG_InitializeModule: Cast List ******\n"); #endif } /* This function will propagate the clientdata field of type to * any new swig_type_info structures that have been added into the list * of equivalent types. It is like calling * SWIG_TypeClientData(type, clientdata) a second time. */ SWIGRUNTIME void SWIG_PropagateClientData(void) { size_t i; swig_cast_info *equiv; static int init_run = 0; if (init_run) return; init_run = 1; for (i = 0; i < swig_module.size; i++) { if (swig_module.types[i]->clientdata) { equiv = swig_module.types[i]->cast; while (equiv) { if (!equiv->converter) { if (equiv->type && !equiv->type->clientdata) SWIG_TypeClientData(equiv->type, swig_module.types[i]->clientdata); } equiv = equiv->next; } } } } #ifdef __cplusplus #if 0 { /* c-mode */ #endif } #endif swig-4.0.1/Lib/javascript/0000755000175000017500000000000013527063513015224 5ustar williamwilliamswig-4.0.1/Lib/javascript/v8/0000755000175000017500000000000013527063513015561 5ustar williamwilliamswig-4.0.1/Lib/javascript/v8/javascriptprimtypes.swg0000644000175000017500000001056413527063513022434 0ustar williamwilliam/* ------------------------------------------------------------ * Primitive Types * ------------------------------------------------------------ */ /* boolean */ %fragment(SWIG_From_frag(bool),"header") { SWIGINTERNINLINE v8::Handle SWIG_From_dec(bool)(bool value) { return SWIGV8_BOOLEAN_NEW(value); } } %fragment(SWIG_AsVal_frag(bool),"header", fragment=SWIG_AsVal_frag(long)) { SWIGINTERN int SWIG_AsVal_dec(bool)(v8::Handle obj, bool *val) { if(!obj->IsBoolean()) { return SWIG_ERROR; } if (val) *val = SWIGV8_BOOLEAN_VALUE(obj); return SWIG_OK; } } /* int */ %fragment(SWIG_From_frag(int),"header") { SWIGINTERNINLINE v8::Handle SWIG_From_dec(int)(int value) { return SWIGV8_INT32_NEW(value); } } %fragment(SWIG_AsVal_frag(int),"header") { SWIGINTERN int SWIG_AsVal_dec(int)(v8::Handle valRef, int* val) { if (!valRef->IsNumber()) { return SWIG_TypeError; } if(val) *val = SWIGV8_INTEGER_VALUE(valRef); return SWIG_OK; } } /* long */ %fragment(SWIG_From_frag(long),"header") { SWIGINTERNINLINE v8::Handle SWIG_From_dec(long)(long value) { return SWIGV8_NUMBER_NEW(value); } } %fragment(SWIG_AsVal_frag(long),"header", fragment="SWIG_CanCastAsInteger") { SWIGINTERN int SWIG_AsVal_dec(long)(v8::Handle obj, long* val) { if (!obj->IsNumber()) { return SWIG_TypeError; } if(val) *val = (long) SWIGV8_INTEGER_VALUE(obj); return SWIG_OK; } } /* unsigned long */ %fragment(SWIG_From_frag(unsigned long),"header", fragment=SWIG_From_frag(long)) { SWIGINTERNINLINE v8::Handle SWIG_From_dec(unsigned long)(unsigned long value) { return (value > LONG_MAX) ? SWIGV8_INTEGER_NEW_UNS(value) : SWIGV8_INTEGER_NEW(%numeric_cast(value,long)); } } %fragment(SWIG_AsVal_frag(unsigned long),"header", fragment="SWIG_CanCastAsInteger") { SWIGINTERN int SWIG_AsVal_dec(unsigned long)(v8::Handle obj, unsigned long *val) { if(!obj->IsNumber()) { return SWIG_TypeError; } long longVal = (long) SWIGV8_NUMBER_VALUE(obj); if(longVal < 0) { return SWIG_OverflowError; } if(val) *val = longVal; return SWIG_OK; } } /* long long */ // Note: these are copied from 'long' and probably need fixing %fragment(SWIG_From_frag(long long),"header", fragment=SWIG_From_frag(long), fragment="SWIG_LongLongAvailable") { %#ifdef SWIG_LONG_LONG_AVAILABLE SWIGINTERNINLINE v8::Handle SWIG_From_dec(long long)(long long value) { return SWIGV8_NUMBER_NEW(value); } %#endif } %fragment(SWIG_AsVal_frag(long long),"header", fragment=SWIG_AsVal_frag(long), fragment="SWIG_CanCastAsInteger", fragment="SWIG_LongLongAvailable") { %#ifdef SWIG_LONG_LONG_AVAILABLE SWIGINTERN int SWIG_AsVal_dec(long long)(v8::Handle obj, long long* val) { if (!obj->IsNumber()) { return SWIG_TypeError; } if(val) *val = (long long) SWIGV8_INTEGER_VALUE(obj); return SWIG_OK; } %#endif } /* unsigned long long */ // Note: these are copied from 'unsigned long' and probably need fixing %fragment(SWIG_From_frag(unsigned long long),"header", fragment=SWIG_From_frag(long long), fragment="SWIG_LongLongAvailable") { %#ifdef SWIG_LONG_LONG_AVAILABLE SWIGINTERNINLINE v8::Handle SWIG_From_dec(unsigned long long)(unsigned long long value) { return (value > LONG_MAX) ? SWIGV8_INTEGER_NEW_UNS(value) : SWIGV8_INTEGER_NEW(%numeric_cast(value,long)); } %#endif } %fragment(SWIG_AsVal_frag(unsigned long long),"header", fragment=SWIG_AsVal_frag(unsigned long), fragment="SWIG_CanCastAsInteger", fragment="SWIG_LongLongAvailable") { %#ifdef SWIG_LONG_LONG_AVAILABLE SWIGINTERN int SWIG_AsVal_dec(unsigned long long)(v8::Handle obj, unsigned long long *val) { if(!obj->IsNumber()) { return SWIG_TypeError; } long long longVal = (long long) SWIGV8_NUMBER_VALUE(obj); if(longVal < 0) { return SWIG_OverflowError; } if(val) *val = longVal; return SWIG_OK; } %#endif } /* double */ %fragment(SWIG_From_frag(double),"header") { SWIGINTERN v8::Handle SWIG_From_dec(double) (double val) { return SWIGV8_NUMBER_NEW(val); } } %fragment(SWIG_AsVal_frag(double),"header") { SWIGINTERN int SWIG_AsVal_dec(double)(v8::Handle obj, double *val) { if(!obj->IsNumber()) { return SWIG_TypeError; } if(val) *val = SWIGV8_NUMBER_VALUE(obj); return SWIG_OK; } } swig-4.0.1/Lib/javascript/v8/std_complex.i0000644000175000017500000000114713527063513020257 0ustar williamwilliam/* * STD C++ complex typemaps */ %include %{ #include %} namespace std { %naturalvar complex; template class complex; %template() complex; %template() complex; } /* defining the complex as/from converters */ %swig_cplxdbl_convn(std::complex, std::complex, std::real, std::imag) %swig_cplxflt_convn(std::complex, std::complex, std::real, std::imag) /* defining the typemaps */ %typemaps_primitive(%checkcode(CPLXDBL), std::complex); %typemaps_primitive(%checkcode(CPLXFLT), std::complex); swig-4.0.1/Lib/javascript/v8/std_deque.i0000644000175000017500000000003413527063513017705 0ustar williamwilliam%include swig-4.0.1/Lib/javascript/v8/javascripthelpers.swg0000644000175000017500000001051413527063513022035 0ustar williamwilliam%insert(runtime) %{ // Note: since 3.19 there are new CallBack types, since 03.21.9 the old ones have been removed #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031903) typedef v8::InvocationCallback SwigV8FunctionCallback; typedef v8::AccessorGetter SwigV8AccessorGetterCallback; typedef v8::AccessorSetter SwigV8AccessorSetterCallback; typedef v8::AccessorInfo SwigV8PropertyCallbackInfoVoid; #elif (V8_MAJOR_VERSION-0) < 5 typedef v8::FunctionCallback SwigV8FunctionCallback; typedef v8::AccessorGetterCallback SwigV8AccessorGetterCallback; typedef v8::AccessorSetterCallback SwigV8AccessorSetterCallback; typedef v8::PropertyCallbackInfo SwigV8PropertyCallbackInfoVoid; #else typedef v8::FunctionCallback SwigV8FunctionCallback; typedef v8::AccessorNameGetterCallback SwigV8AccessorGetterCallback; typedef v8::AccessorNameSetterCallback SwigV8AccessorSetterCallback; typedef v8::PropertyCallbackInfo SwigV8PropertyCallbackInfoVoid; #endif /** * Creates a class template for a class with specified initialization function. */ SWIGRUNTIME v8::Handle SWIGV8_CreateClassTemplate(const char* symbol) { SWIGV8_HANDLESCOPE_ESC(); v8::Local class_templ = SWIGV8_FUNCTEMPLATE_NEW_VOID(); class_templ->SetClassName(SWIGV8_SYMBOL_NEW(symbol)); v8::Handle inst_templ = class_templ->InstanceTemplate(); inst_templ->SetInternalFieldCount(1); v8::Handle equals_templ = class_templ->PrototypeTemplate(); equals_templ->Set(SWIGV8_SYMBOL_NEW("equals"), SWIGV8_FUNCTEMPLATE_NEW(_SWIGV8_wrap_equals)); v8::Handle cptr_templ = class_templ->PrototypeTemplate(); cptr_templ->Set(SWIGV8_SYMBOL_NEW("getCPtr"), SWIGV8_FUNCTEMPLATE_NEW(_wrap_getCPtr)); SWIGV8_ESCAPE(class_templ); } /** * Registers a class method with given name for a given class template. */ SWIGRUNTIME void SWIGV8_AddMemberFunction(v8::Handle class_templ, const char* symbol, SwigV8FunctionCallback _func) { v8::Handle proto_templ = class_templ->PrototypeTemplate(); proto_templ->Set(SWIGV8_SYMBOL_NEW(symbol), SWIGV8_FUNCTEMPLATE_NEW(_func)); } /** * Registers a class property with given name for a given class template. */ SWIGRUNTIME void SWIGV8_AddMemberVariable(v8::Handle class_templ, const char* symbol, SwigV8AccessorGetterCallback getter, SwigV8AccessorSetterCallback setter) { v8::Handle proto_templ = class_templ->InstanceTemplate(); proto_templ->SetAccessor(SWIGV8_SYMBOL_NEW(symbol), getter, setter); } /** * Registers a class method with given name for a given object. */ SWIGRUNTIME void SWIGV8_AddStaticFunction(v8::Handle obj, const char* symbol, const SwigV8FunctionCallback& _func) { obj->Set(SWIGV8_SYMBOL_NEW(symbol), SWIGV8_FUNCTEMPLATE_NEW(_func)->GetFunction()); } /** * Registers a class method with given name for a given object. */ SWIGRUNTIME void SWIGV8_AddStaticVariable(v8::Handle obj, const char* symbol, SwigV8AccessorGetterCallback getter, SwigV8AccessorSetterCallback setter) { #if (V8_MAJOR_VERSION-0) < 5 obj->SetAccessor(SWIGV8_SYMBOL_NEW(symbol), getter, setter); #else obj->SetAccessor(SWIGV8_CURRENT_CONTEXT(), SWIGV8_SYMBOL_NEW(symbol), getter, setter); #endif } #if (V8_MAJOR_VERSION-0) < 5 SWIGRUNTIME void JS_veto_set_variable(v8::Local property, v8::Local value, const SwigV8PropertyCallbackInfoVoid& info) #else SWIGRUNTIME void JS_veto_set_variable(v8::Local property, v8::Local value, const SwigV8PropertyCallbackInfoVoid& info) #endif { char buffer[256]; char msg[512]; int res; #if (V8_MAJOR_VERSION-0) < 5 property->WriteUtf8(buffer, 256); res = sprintf(msg, "Tried to write read-only variable: %s.", buffer); #else v8::Local sproperty; if (property->ToString(SWIGV8_CURRENT_CONTEXT()).ToLocal(&sproperty)) { SWIGV8_WRITE_UTF8(sproperty, buffer, 256); res = sprintf(msg, "Tried to write read-only variable: %s.", buffer); } else { res = -1; } #endif if(res<0) { SWIG_exception(SWIG_ERROR, "Tried to write read-only variable."); } else { SWIG_exception(SWIG_ERROR, msg); } fail: ; } %} // v8_helper_functions swig-4.0.1/Lib/javascript/v8/javascript.swg0000644000175000017500000000066713527063513020462 0ustar williamwilliam/* ----------------------------------------------------------------------------- * javascript.swg * * Javascript typemaps * ----------------------------------------------------------------------------- */ %include %include %include %include %include %include %include swig-4.0.1/Lib/javascript/v8/javascriptruntime.swg0000644000175000017500000000332013527063513022053 0ustar williamwilliam/* ----------------------------------------------------------------------------- * javascriptruntime.swg * * ----------------------------------------------------------------------------- */ // V8 Version Macro // ---------------- // // v8 added version macros V8_MAJOR_VERSION, V8_MINOR_VERSION, V8_BUILD_NUMBER // and V8_PATCH_LEVEL in version 4.3.0. SWIG generated code uses these if // they are defined - to support earlier versions you can specify the V8 version // in use via the command line when you run SWIG: // // swig -c++ -javascript -v8 -DV8_VERSION=0x032530 example.i // // Or code in the interface file using SWIG_V8_VERSION: // // %begin %{#define SWIG_V8_VERSION 0x031110%} // // This is specified as a hex constant, but the constant is read as pairs of // decimal digits, so for V8 3.25.30 use constant 0x032530. This scheme can't // represent components > 99, but this constant is only useful for V8 < 4.3.0, // and no V8 versions from that era had a component > 99. %define %swig_v8_define_version(version) %insert("runtime") %{ #ifndef SWIG_V8_VERSION #define SWIG_V8_VERSION version #endif %} %enddef #ifdef V8_VERSION %swig_v8_define_version(V8_VERSION) #else // HACK: defining a default version %swig_v8_define_version(0x031110) #endif // Node support // ------------ #ifdef BUILDING_NODE_EXTENSION %insert("runtime") %{ #include //Older version of node.h does not include this #include %} #endif // V8 runtime // ---------- %insert(runtime) %{ #include #include #include #include %} %insert(runtime) "swigrun.swg"; /* SWIG API */ %insert(runtime) "swigerrors.swg"; /* SWIG errors */ %insert(runtime) "javascriptrun.swg" swig-4.0.1/Lib/javascript/v8/javascriptrun.swg0000644000175000017500000006307713527063513021213 0ustar williamwilliam/* --------------------------------------------------------------------------- * These typedefs and defines are used to deal with v8 API changes * * ---------------------------------------------------------------------------*/ // First v8 version that uses "SetWeak" and not "MakeWeak" #define SWIGV8_SETWEAK_VERSION 0x032224 #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031803) #define SWIGV8_STRING_NEW2(cstr, len) v8::String::New(cstr, len) #else #define SWIGV8_STRING_NEW2(cstr, len) v8::String::NewFromUtf8(v8::Isolate::GetCurrent(), cstr, v8::String::kNormalString, len) #endif #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031903) typedef v8::Handle SwigV8ReturnValue; typedef v8::Arguments SwigV8Arguments; typedef v8::AccessorInfo SwigV8PropertyCallbackInfo; #define SWIGV8_RETURN(val) return scope.Close(val) #define SWIGV8_RETURN_INFO(val, info) return scope.Close(val) #else typedef void SwigV8ReturnValue; typedef v8::FunctionCallbackInfo SwigV8Arguments; typedef v8::PropertyCallbackInfo SwigV8PropertyCallbackInfo; #define SWIGV8_RETURN(val) args.GetReturnValue().Set(val); return #define SWIGV8_RETURN_INFO(val, info) info.GetReturnValue().Set(val); return #endif #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x032117) #define SWIGV8_HANDLESCOPE() v8::HandleScope scope #define SWIGV8_HANDLESCOPE_ESC() v8::HandleScope scope #define SWIGV8_ESCAPE(val) return scope.Close(val) #elif (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x032224) #define SWIGV8_HANDLESCOPE() v8::HandleScope scope(v8::Isolate::GetCurrent()); #define SWIGV8_HANDLESCOPE_ESC() v8::HandleScope scope(v8::Isolate::GetCurrent()); #define SWIGV8_ESCAPE(val) return scope.Close(val) #else #define SWIGV8_HANDLESCOPE() v8::HandleScope scope(v8::Isolate::GetCurrent()); #define SWIGV8_HANDLESCOPE_ESC() v8::EscapableHandleScope scope(v8::Isolate::GetCurrent()); #define SWIGV8_ESCAPE(val) return scope.Escape(val) #endif #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x032224) #define SWIGV8_ADJUST_MEMORY(size) v8::V8::AdjustAmountOfExternalAllocatedMemory(size) #define SWIGV8_CURRENT_CONTEXT() v8::Context::GetCurrent() #define SWIGV8_THROW_EXCEPTION(err) v8::ThrowException(err) #define SWIGV8_STRING_NEW(str) v8::String::New(str) #define SWIGV8_SYMBOL_NEW(sym) v8::String::NewSymbol(sym) #else #define SWIGV8_ADJUST_MEMORY(size) v8::Isolate::GetCurrent()->AdjustAmountOfExternalAllocatedMemory(size) #define SWIGV8_CURRENT_CONTEXT() v8::Isolate::GetCurrent()->GetCurrentContext() #define SWIGV8_THROW_EXCEPTION(err) v8::Isolate::GetCurrent()->ThrowException(err) #define SWIGV8_STRING_NEW(str) v8::String::NewFromUtf8(v8::Isolate::GetCurrent(), str) #define SWIGV8_SYMBOL_NEW(sym) v8::String::NewFromUtf8(v8::Isolate::GetCurrent(), sym) #endif #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x032318) #define SWIGV8_ARRAY_NEW() v8::Array::New() #define SWIGV8_BOOLEAN_NEW(bool) v8::Boolean::New(bool) #define SWIGV8_EXTERNAL_NEW(val) v8::External::New(val) #define SWIGV8_FUNCTEMPLATE_NEW(func) v8::FunctionTemplate::New(func) #define SWIGV8_FUNCTEMPLATE_NEW_VOID() v8::FunctionTemplate::New() #define SWIGV8_INT32_NEW(num) v8::Int32::New(num) #define SWIGV8_INTEGER_NEW(num) v8::Integer::New(num) #define SWIGV8_INTEGER_NEW_UNS(num) v8::Integer::NewFromUnsigned(num) #define SWIGV8_NUMBER_NEW(num) v8::Number::New(num) #define SWIGV8_OBJECT_NEW() v8::Object::New() #define SWIGV8_UNDEFINED() v8::Undefined() #define SWIGV8_NULL() v8::Null() #else #define SWIGV8_ARRAY_NEW() v8::Array::New(v8::Isolate::GetCurrent()) #define SWIGV8_BOOLEAN_NEW(bool) v8::Boolean::New(v8::Isolate::GetCurrent(), bool) #define SWIGV8_EXTERNAL_NEW(val) v8::External::New(v8::Isolate::GetCurrent(), val) #define SWIGV8_FUNCTEMPLATE_NEW(func) v8::FunctionTemplate::New(v8::Isolate::GetCurrent(), func) #define SWIGV8_FUNCTEMPLATE_NEW_VOID() v8::FunctionTemplate::New(v8::Isolate::GetCurrent()) #define SWIGV8_INT32_NEW(num) v8::Int32::New(v8::Isolate::GetCurrent(), num) #define SWIGV8_INTEGER_NEW(num) v8::Integer::New(v8::Isolate::GetCurrent(), num) #define SWIGV8_INTEGER_NEW_UNS(num) v8::Integer::NewFromUnsigned(v8::Isolate::GetCurrent(), num) #define SWIGV8_NUMBER_NEW(num) v8::Number::New(v8::Isolate::GetCurrent(), num) #define SWIGV8_OBJECT_NEW() v8::Object::New(v8::Isolate::GetCurrent()) #define SWIGV8_UNDEFINED() v8::Undefined(v8::Isolate::GetCurrent()) #define SWIGV8_NULL() v8::Null(v8::Isolate::GetCurrent()) #endif #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031710) #define SWIGV8_SET_CLASS_TEMPL(class_templ, class) class_templ = v8::Persistent::New(class); #elif (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031900) #define SWIGV8_SET_CLASS_TEMPL(class_templ, class) class_templ = v8::Persistent::New(v8::Isolate::GetCurrent(), class); #else #define SWIGV8_SET_CLASS_TEMPL(class_templ, class) class_templ.Reset(v8::Isolate::GetCurrent(), class); #endif #ifdef NODE_VERSION #if NODE_VERSION_AT_LEAST(10, 12, 0) #define SWIG_NODE_AT_LEAST_1012 #endif #endif //Necessary to check Node.js version because V8 API changes are backported in Node.js #if (defined(NODE_VERSION) && !defined(SWIG_NODE_AT_LEAST_1012)) || \ (!defined(NODE_VERSION) && (V8_MAJOR_VERSION-0) < 7) #define SWIGV8_TO_OBJECT(handle) (handle)->ToObject() #define SWIGV8_TO_STRING(handle) (handle)->ToString() #define SWIGV8_NUMBER_VALUE(handle) (handle)->NumberValue() #define SWIGV8_INTEGER_VALUE(handle) (handle)->IntegerValue() #define SWIGV8_BOOLEAN_VALUE(handle) (handle)->BooleanValue() #define SWIGV8_WRITE_UTF8(handle, buffer, len) (handle)->WriteUtf8(buffer, len) #define SWIGV8_UTF8_LENGTH(handle) (handle)->Utf8Length() #else #define SWIGV8_TO_OBJECT(handle) (handle)->ToObject(SWIGV8_CURRENT_CONTEXT()).ToLocalChecked() #define SWIGV8_TO_STRING(handle) (handle)->ToString(SWIGV8_CURRENT_CONTEXT()).ToLocalChecked() #define SWIGV8_NUMBER_VALUE(handle) (handle)->NumberValue(SWIGV8_CURRENT_CONTEXT()).ToChecked() #define SWIGV8_INTEGER_VALUE(handle) (handle)->IntegerValue(SWIGV8_CURRENT_CONTEXT()).ToChecked() #define SWIGV8_BOOLEAN_VALUE(handle) (handle)->BooleanValue(SWIGV8_CURRENT_CONTEXT()).ToChecked() #define SWIGV8_WRITE_UTF8(handle, buffer, len) (handle)->WriteUtf8(v8::Isolate::GetCurrent(), buffer, len) #define SWIGV8_UTF8_LENGTH(handle) (handle)->Utf8Length(v8::Isolate::GetCurrent()) #endif /* --------------------------------------------------------------------------- * Error handling * * ---------------------------------------------------------------------------*/ #define SWIG_Error(code, msg) SWIGV8_ErrorHandler.error(code, msg) #define SWIG_exception(code, msg) do { SWIGV8_ErrorHandler.error(code, msg); SWIG_fail; } while (0) #define SWIG_fail goto fail #define SWIGV8_OVERLOAD false SWIGINTERN void SWIG_V8_Raise(const char *msg) { SWIGV8_THROW_EXCEPTION(v8::Exception::Error(SWIGV8_STRING_NEW(msg))); } /* Note: There are two contexts for handling errors. A static V8ErrorHandler is used in not overloaded methods. For overloaded methods the throwing type checking mechanism is used during dispatching. As V8 exceptions can not be reset properly the trick is to use a dynamic ErrorHandler with same local name as the global one. - See definition of SWIG_Error above. - See code templates 'JS_function_dispatcher', 'JS_functionwrapper_overload', and 'JS_function_dispatch_case' in javascriptcode.swg */ class V8ErrorHandler { public: virtual ~V8ErrorHandler() {} virtual void error(int code, const char *msg) { SWIG_V8_Raise(msg); } }; // this is used in usually SWIGRUNTIME V8ErrorHandler SWIGV8_ErrorHandler; // instances of this are used in overloaded functions class OverloadErrorHandler: public V8ErrorHandler { public: virtual void error(int code, const char *msg) { err = v8::Exception::Error(SWIGV8_STRING_NEW(msg)); if(code != SWIG_TypeError) { SWIGV8_THROW_EXCEPTION(err); } } v8::Handle err; }; /* --------------------------------------------------------------------------- * Basic Proxy object * * ---------------------------------------------------------------------------*/ // Note: to trigger the v8 gc more often one can tell v8 about the memory consumption // TODO: we could add a v8 specific parameter to control this value #define SWIGV8_AVG_OBJ_SIZE 1000 class SWIGV8_Proxy { public: SWIGV8_Proxy(): swigCMemOwn(false), swigCObject(0), info(0) { SWIGV8_ADJUST_MEMORY(SWIGV8_AVG_OBJ_SIZE); }; ~SWIGV8_Proxy() { #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031710) handle.ClearWeak(); handle.Dispose(); #elif (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x032100) handle.ClearWeak(v8::Isolate::GetCurrent()); handle.Dispose(v8::Isolate::GetCurrent()); #elif (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < SWIGV8_SETWEAK_VERSION) handle.ClearWeak(); handle.Dispose(); #else handle.ClearWeak(); handle.Reset(); #endif #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < SWIGV8_SETWEAK_VERSION) handle.Clear(); #endif SWIGV8_ADJUST_MEMORY(-SWIGV8_AVG_OBJ_SIZE); } bool swigCMemOwn; void *swigCObject; swig_type_info *info; v8::Persistent handle; }; class SWIGV8_ClientData { public: v8::Persistent class_templ; #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031710) void (*dtor) (v8::Persistent< v8::Value> object, void *parameter); #elif (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031900) void (*dtor) (v8::Isolate *isolate, v8::Persistent< v8::Value> object, void *parameter); #elif (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < SWIGV8_SETWEAK_VERSION) void (*dtor) (v8::Isolate *isolate, v8::Persistent< v8::Object > *object, SWIGV8_Proxy *proxy); #elif (V8_MAJOR_VERSION-0) < 5 void (*dtor) (const v8::WeakCallbackData &data); #else void (*dtor) (const v8::WeakCallbackInfo &data); #endif }; SWIGRUNTIME v8::Persistent SWIGV8_SWIGTYPE_Proxy_class_templ; SWIGRUNTIME int SWIG_V8_ConvertInstancePtr(v8::Handle objRef, void **ptr, swig_type_info *info, int flags) { SWIGV8_HANDLESCOPE(); if(objRef->InternalFieldCount() < 1) return SWIG_ERROR; #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031511) v8::Handle cdataRef = objRef->GetInternalField(0); SWIGV8_Proxy *cdata = static_cast(v8::External::Unwrap(cdataRef)); #else SWIGV8_Proxy *cdata = static_cast(objRef->GetAlignedPointerFromInternalField(0)); #endif if(cdata == NULL) { return SWIG_ERROR; } if(cdata->info != info) { swig_cast_info *tc = SWIG_TypeCheckStruct(cdata->info, info); if (!tc && cdata->info->name) { tc = SWIG_TypeCheck(cdata->info->name, info); } bool type_valid = tc != 0; if(!type_valid) { return SWIG_TypeError; } } *ptr = cdata->swigCObject; if(flags & SWIG_POINTER_DISOWN) { cdata->swigCMemOwn = false; } return SWIG_OK; } #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031710) SWIGRUNTIME void SWIGV8_Proxy_DefaultDtor(v8::Persistent< v8::Value > object, void *parameter) { SWIGV8_Proxy *proxy = static_cast(parameter); #elif (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031900) SWIGRUNTIME void SWIGV8_Proxy_DefaultDtor(v8::Isolate *, v8::Persistent< v8::Value > object, void *parameter) { SWIGV8_Proxy *proxy = static_cast(parameter); #elif (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < SWIGV8_SETWEAK_VERSION) SWIGRUNTIME void SWIGV8_Proxy_DefaultDtor(v8::Isolate *, v8::Persistent< v8::Object > *object, SWIGV8_Proxy *proxy) { #elif (V8_MAJOR_VERSION-0) < 5 SWIGRUNTIME void SWIGV8_Proxy_DefaultDtor(const v8::WeakCallbackData &data) { SWIGV8_Proxy *proxy = data.GetParameter(); #else SWIGRUNTIME void SWIGV8_Proxy_DefaultDtor(const v8::WeakCallbackInfo &data) { SWIGV8_Proxy *proxy = data.GetParameter(); #endif delete proxy; } SWIGRUNTIME int SWIG_V8_GetInstancePtr(v8::Handle valRef, void **ptr) { if(!valRef->IsObject()) { return SWIG_TypeError; } v8::Handle objRef = SWIGV8_TO_OBJECT(valRef); if(objRef->InternalFieldCount() < 1) return SWIG_ERROR; #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031511) v8::Handle cdataRef = objRef->GetInternalField(0); SWIGV8_Proxy *cdata = static_cast(v8::External::Unwrap(cdataRef)); #else SWIGV8_Proxy *cdata = static_cast(objRef->GetAlignedPointerFromInternalField(0)); #endif if(cdata == NULL) { return SWIG_ERROR; } *ptr = cdata->swigCObject; return SWIG_OK; } SWIGRUNTIME void SWIGV8_SetPrivateData(v8::Handle obj, void *ptr, swig_type_info *info, int flags) { SWIGV8_Proxy *cdata = new SWIGV8_Proxy(); cdata->swigCObject = ptr; cdata->swigCMemOwn = (flags & SWIG_POINTER_OWN) ? 1 : 0; cdata->info = info; #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031511) obj->SetPointerInInternalField(0, cdata); #else obj->SetAlignedPointerInInternalField(0, cdata); #endif #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031710) cdata->handle = v8::Persistent::New(obj); #elif (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031900) cdata->handle = v8::Persistent::New(v8::Isolate::GetCurrent(), obj); #else cdata->handle.Reset(v8::Isolate::GetCurrent(), obj); #endif #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031710) // clientdata must be set for owned data as we need to register the dtor if(cdata->swigCMemOwn && (SWIGV8_ClientData*)info->clientdata) { cdata->handle.MakeWeak(cdata, ((SWIGV8_ClientData*)info->clientdata)->dtor); } else { cdata->handle.MakeWeak(cdata, SWIGV8_Proxy_DefaultDtor); } #elif (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031918) if(cdata->swigCMemOwn && (SWIGV8_ClientData*)info->clientdata) { cdata->handle.MakeWeak(v8::Isolate::GetCurrent(), cdata, ((SWIGV8_ClientData*)info->clientdata)->dtor); } else { cdata->handle.MakeWeak(v8::Isolate::GetCurrent(), cdata, SWIGV8_Proxy_DefaultDtor); } #elif (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < SWIGV8_SETWEAK_VERSION) if(cdata->swigCMemOwn && (SWIGV8_ClientData*)info->clientdata) { cdata->handle.MakeWeak(cdata, ((SWIGV8_ClientData*)info->clientdata)->dtor); } else { cdata->handle.MakeWeak(cdata, SWIGV8_Proxy_DefaultDtor); } #elif (V8_MAJOR_VERSION-0) < 5 if(cdata->swigCMemOwn && (SWIGV8_ClientData*)info->clientdata) { cdata->handle.SetWeak(cdata, ((SWIGV8_ClientData*)info->clientdata)->dtor); } else { cdata->handle.SetWeak(cdata, SWIGV8_Proxy_DefaultDtor); } #else if(cdata->swigCMemOwn && (SWIGV8_ClientData*)info->clientdata) { cdata->handle.SetWeak(cdata, ((SWIGV8_ClientData*)info->clientdata)->dtor, v8::WeakCallbackType::kParameter); } else { cdata->handle.SetWeak(cdata, SWIGV8_Proxy_DefaultDtor, v8::WeakCallbackType::kParameter); } #endif #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031710) cdata->handle.MarkIndependent(); #elif (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x032100) cdata->handle.MarkIndependent(v8::Isolate::GetCurrent()); #else cdata->handle.MarkIndependent(); #endif } SWIGRUNTIME int SWIG_V8_ConvertPtr(v8::Handle valRef, void **ptr, swig_type_info *info, int flags) { SWIGV8_HANDLESCOPE(); /* special case: JavaScript null => C NULL pointer */ if(valRef->IsNull()) { *ptr=0; return (flags & SWIG_POINTER_NO_NULL) ? SWIG_NullReferenceError : SWIG_OK; } if(!valRef->IsObject()) { return SWIG_TypeError; } v8::Handle objRef = SWIGV8_TO_OBJECT(valRef); return SWIG_V8_ConvertInstancePtr(objRef, ptr, info, flags); } SWIGRUNTIME v8::Handle SWIG_V8_NewPointerObj(void *ptr, swig_type_info *info, int flags) { SWIGV8_HANDLESCOPE_ESC(); v8::Handle class_templ; if (ptr == NULL) { #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031903) SWIGV8_ESCAPE(SWIGV8_NULL()); #else v8::Local result = SWIGV8_NULL(); SWIGV8_ESCAPE(result); #endif } #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031903) if(info->clientdata != 0) { class_templ = ((SWIGV8_ClientData*) info->clientdata)->class_templ; } else { class_templ = SWIGV8_SWIGTYPE_Proxy_class_templ; } #else v8::Isolate *isolate = v8::Isolate::GetCurrent(); if(info->clientdata != 0) { class_templ = v8::Local::New(isolate, ((SWIGV8_ClientData*) info->clientdata)->class_templ); } else { class_templ = v8::Local::New(isolate, SWIGV8_SWIGTYPE_Proxy_class_templ); } #endif // v8::Handle result = class_templ->InstanceTemplate()->NewInstance(); v8::Local result = class_templ->InstanceTemplate()->NewInstance(); SWIGV8_SetPrivateData(result, ptr, info, flags); SWIGV8_ESCAPE(result); } #define SWIG_ConvertPtr(obj, ptr, info, flags) SWIG_V8_ConvertPtr(obj, ptr, info, flags) #define SWIG_NewPointerObj(ptr, info, flags) SWIG_V8_NewPointerObj(ptr, info, flags) #define SWIG_ConvertInstance(obj, pptr, type, flags) SWIG_V8_ConvertInstancePtr(obj, pptr, type, flags) #define SWIG_NewInstanceObj(thisvalue, type, flags) SWIG_V8_NewPointerObj(thisvalue, type, flags) #define SWIG_ConvertFunctionPtr(obj, pptr, type) SWIG_V8_ConvertPtr(obj, pptr, type, 0) #define SWIG_NewFunctionPtrObj(ptr, type) SWIG_V8_NewPointerObj(ptr, type, 0) #define SWIG_GetInstancePtr(obj, ptr) SWIG_V8_GetInstancePtr(obj, ptr) SWIGRUNTIME SwigV8ReturnValue _SWIGV8_wrap_equals(const SwigV8Arguments &args) { SWIGV8_HANDLESCOPE(); v8::Handle jsresult; void *arg1 = (void *) 0 ; void *arg2 = (void *) 0 ; bool result; int res1; int res2; if(args.Length() != 1) SWIG_exception_fail(SWIG_ERROR, "Illegal number of arguments for equals."); res1 = SWIG_GetInstancePtr(args.Holder(), &arg1); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ERROR, "Could not get pointer from 'this' object for equals."); } res2 = SWIG_GetInstancePtr(args[0], &arg2); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "equals" "', argument " "1"" of type '" "void *""'"); } result = (bool)(arg1 == arg2); jsresult = SWIGV8_BOOLEAN_NEW(result); SWIGV8_RETURN(jsresult); goto fail; fail: SWIGV8_RETURN(SWIGV8_UNDEFINED()); } SWIGRUNTIME SwigV8ReturnValue _wrap_getCPtr(const SwigV8Arguments &args) { SWIGV8_HANDLESCOPE(); v8::Handle jsresult; void *arg1 = (void *) 0 ; long result; int res1; res1 = SWIG_GetInstancePtr(args.Holder(), &arg1); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "getCPtr" "', argument " "1"" of type '" "void *""'"); } result = (long)arg1; jsresult = SWIGV8_NUMBER_NEW(result); SWIGV8_RETURN(jsresult); goto fail; fail: SWIGV8_RETURN(SWIGV8_UNDEFINED()); } /* --------------------------------------------------------------------------- * PackedData object * * ---------------------------------------------------------------------------*/ class SwigV8PackedData { public: SwigV8PackedData(void *data, size_t size, swig_type_info *type): data(data), size(size), type(type) {}; ~SwigV8PackedData() { }; void *data; size_t size; swig_type_info *type; v8::Persistent handle; }; SWIGRUNTIMEINLINE int SwigV8Packed_Check(v8::Handle valRef) { SWIGV8_HANDLESCOPE(); v8::Handle objRef = SWIGV8_TO_OBJECT(valRef); if(objRef->InternalFieldCount() < 1) return false; #if (V8_MAJOR_VERSION-0) < 5 v8::Handle flag = objRef->GetHiddenValue(SWIGV8_STRING_NEW("__swig__packed_data__")); #else v8::Local privateKey = v8::Private::ForApi(v8::Isolate::GetCurrent(), SWIGV8_STRING_NEW("__swig__packed_data__")); v8::Local flag; if (!objRef->GetPrivate(SWIGV8_CURRENT_CONTEXT(), privateKey).ToLocal(&flag)) return false; #endif return (flag->IsBoolean() && SWIGV8_BOOLEAN_VALUE(flag)); } SWIGRUNTIME swig_type_info *SwigV8Packed_UnpackData(v8::Handle valRef, void *ptr, size_t size) { if (SwigV8Packed_Check(valRef)) { SWIGV8_HANDLESCOPE(); SwigV8PackedData *sobj; v8::Handle objRef = SWIGV8_TO_OBJECT(valRef); #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031511) v8::Handle cdataRef = objRef->GetInternalField(0); sobj = static_cast(v8::External::Unwrap(cdataRef)); #else sobj = static_cast(objRef->GetAlignedPointerFromInternalField(0)); #endif if (sobj == NULL || sobj->size != size) return 0; memcpy(ptr, sobj->data, size); return sobj->type; } else { return 0; } } SWIGRUNTIME int SWIGV8_ConvertPacked(v8::Handle valRef, void *ptr, size_t sz, swig_type_info *ty) { swig_type_info *to = SwigV8Packed_UnpackData(valRef, ptr, sz); if (!to) return SWIG_ERROR; if (ty) { if (to != ty) { /* check type cast? */ swig_cast_info *tc = SWIG_TypeCheck(to->name,ty); if (!tc) return SWIG_ERROR; } } return SWIG_OK; } #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031710) SWIGRUNTIME void _wrap_SwigV8PackedData_delete(v8::Persistent< v8::Value > object, void *parameter) { SwigV8PackedData *cdata = static_cast(parameter); #elif (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031900) SWIGRUNTIME void _wrap_SwigV8PackedData_delete(v8::Isolate *isolate, v8::Persistent object, void *parameter) { SwigV8PackedData *cdata = static_cast(parameter); #elif (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < SWIGV8_SETWEAK_VERSION) SWIGRUNTIME void _wrap_SwigV8PackedData_delete(v8::Isolate *isolate, v8::Persistent *object, SwigV8PackedData *cdata) { #elif (V8_MAJOR_VERSION-0) < 5 SWIGRUNTIME void _wrap_SwigV8PackedData_delete(const v8::WeakCallbackData &data) { v8::Local object = data.GetValue(); SwigV8PackedData *cdata = data.GetParameter(); #else SWIGRUNTIME void _wrap_SwigV8PackedData_delete(const v8::WeakCallbackInfo &data) { SwigV8PackedData *cdata = data.GetParameter(); #endif delete cdata; #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031710) object.Clear(); object.Dispose(); #elif (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031900) object.Clear(); object.Dispose(isolate); #elif (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x032100) object->Dispose(isolate); #elif (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < SWIGV8_SETWEAK_VERSION) object->Dispose(); #elif (V8_MAJOR_VERSION-0) < 5 object.Clear(); #endif } SWIGRUNTIME v8::Handle SWIGV8_NewPackedObj(void *data, size_t size, swig_type_info *type) { SWIGV8_HANDLESCOPE_ESC(); SwigV8PackedData *cdata = new SwigV8PackedData(data, size, type); // v8::Handle obj = SWIGV8_OBJECT_NEW(); v8::Local obj = SWIGV8_OBJECT_NEW(); #if (V8_MAJOR_VERSION-0) < 5 obj->SetHiddenValue(SWIGV8_STRING_NEW("__swig__packed_data__"), SWIGV8_BOOLEAN_NEW(true)); #else v8::Local privateKey = v8::Private::ForApi(v8::Isolate::GetCurrent(), SWIGV8_STRING_NEW("__swig__packed_data__")); obj->SetPrivate(SWIGV8_CURRENT_CONTEXT(), privateKey, SWIGV8_BOOLEAN_NEW(true)); #endif #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031511) obj->SetPointerInInternalField(0, cdata); #else obj->SetAlignedPointerInInternalField(0, cdata); #endif #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031710) cdata->handle = v8::Persistent::New(obj); #elif (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031900) cdata->handle = v8::Persistent::New(v8::Isolate::GetCurrent(), obj); #else cdata->handle.Reset(v8::Isolate::GetCurrent(), obj); #endif #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031710) cdata->handle.MakeWeak(cdata, _wrap_SwigV8PackedData_delete); #elif (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031918) cdata->handle.MakeWeak(v8::Isolate::GetCurrent(), cdata, _wrap_SwigV8PackedData_delete); #elif (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < SWIGV8_SETWEAK_VERSION) cdata->handle.MakeWeak(cdata, _wrap_SwigV8PackedData_delete); #elif (V8_MAJOR_VERSION-0) < 5 cdata->handle.SetWeak(cdata, _wrap_SwigV8PackedData_delete); // v8::V8::SetWeak(&cdata->handle, cdata, _wrap_SwigV8PackedData_delete); #else cdata->handle.SetWeak(cdata, _wrap_SwigV8PackedData_delete, v8::WeakCallbackType::kParameter); #endif #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031710) cdata->handle.MarkIndependent(); #elif (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x032100) cdata->handle.MarkIndependent(v8::Isolate::GetCurrent()); #else cdata->handle.MarkIndependent(); #endif SWIGV8_ESCAPE(obj); } #define SWIG_ConvertMember(obj, ptr, sz, ty) SWIGV8_ConvertPacked(obj, ptr, sz, ty) #define SWIG_NewMemberObj(ptr, sz, type) SWIGV8_NewPackedObj(ptr, sz, type) /* --------------------------------------------------------------------------- * Support for IN/OUTPUT typemaps (see Lib/typemaps/inoutlist.swg) * * ---------------------------------------------------------------------------*/ SWIGRUNTIME #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031903) v8::Handle SWIGV8_AppendOutput(v8::Handle result, v8::Handle obj) { #else v8::Handle SWIGV8_AppendOutput(v8::Local result, v8::Handle obj) { #endif SWIGV8_HANDLESCOPE_ESC(); if (result->IsUndefined()) { result = SWIGV8_ARRAY_NEW(); } #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031903) v8::Handle arr = v8::Handle::Cast(result); #else v8::Local arr = v8::Local::Cast(result); #endif arr->Set(arr->Length(), obj); SWIGV8_ESCAPE(arr); } swig-4.0.1/Lib/javascript/v8/std_vector.i0000644000175000017500000000574713527063513020124 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_vector.i * ----------------------------------------------------------------------------- */ %include %{ #include #include %} namespace std { template class vector { public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef T value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; vector(); vector(size_type n); vector(const vector& other); size_type size() const; size_type capacity() const; void reserve(size_type n); %rename(isEmpty) empty; bool empty() const; void clear(); %rename(add) push_back; void push_back(const value_type& x); %extend { const_reference get(int i) throw (std::out_of_range) { int size = int(self->size()); if (i>=0 && isize()); if (i>=0 && i class vector { public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef bool value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef bool const_reference; vector(); vector(size_type n); vector(const vector& other); size_type size() const; size_type capacity() const; void reserve(size_type n); %rename(isEmpty) empty; bool empty() const; void clear(); %rename(add) push_back; void push_back(const value_type& x); %extend { bool get(int i) throw (std::out_of_range) { int size = int(self->size()); if (i>=0 && isize()); if (i>=0 && i self = args.Holder(); $jslocals if(args.Length() != $jsargcount) SWIG_exception_fail(SWIG_ERROR, "Illegal number of arguments for $jswrapper."); $jscode SWIGV8_SetPrivateData(self, result, SWIGTYPE_$jsmangledtype, SWIG_POINTER_OWN); SWIGV8_RETURN(self); goto fail; fail: SWIGV8_RETURN(SWIGV8_UNDEFINED()); } %} /* ----------------------------------------------------------------------------- * js_veto_ctor: a vetoing ctor for abstract classes * - $jswrapper: name of wrapper * - $jsname: class name * ----------------------------------------------------------------------------- */ %fragment ("js_veto_ctor", "templates") %{ static SwigV8ReturnValue $jswrapper(const SwigV8Arguments &args) { SWIGV8_HANDLESCOPE(); SWIG_exception(SWIG_ERROR, "Class $jsname can not be instantiated"); fail: SWIGV8_RETURN(SWIGV8_UNDEFINED()); } %} /* ----------------------------------------------------------------------------- * js_ctor_dispatcher: dispatcher for overloaded constructors * - $jswrapper: name of wrapper * - $jsname: class name * - $jsdispatchcases: part containing code for dispatching * ----------------------------------------------------------------------------- */ %fragment ("js_ctor_dispatcher", "templates") %{ static SwigV8ReturnValue $jswrapper(const SwigV8Arguments &args) { SWIGV8_HANDLESCOPE(); OverloadErrorHandler errorHandler; v8::Handle self; // switch all cases by means of series of if-returns. $jsdispatchcases // default: SWIG_exception_fail(SWIG_ERROR, "Illegal arguments for construction of $jsmangledname"); fail: SWIGV8_RETURN(SWIGV8_UNDEFINED()); } %} /* ----------------------------------------------------------------------------- * js_overloaded_ctor: template for wrapping a ctor. * - $jswrapper: wrapper of called ctor * - $jslocals: locals part of wrapper * - $jscode: code part of wrapper * - $jsargcount: number of arguments * - $jsmangledtype: mangled type of class * ----------------------------------------------------------------------------- */ %fragment("js_overloaded_ctor", "templates") %{ static SwigV8ReturnValue $jswrapper(const SwigV8Arguments &args, V8ErrorHandler &SWIGV8_ErrorHandler) { SWIGV8_HANDLESCOPE(); v8::Handle self = args.Holder(); $jslocals if(args.Length() != $jsargcount) SWIG_exception_fail(SWIG_ERROR, "Illegal number of arguments for $jswrapper."); $jscode SWIGV8_SetPrivateData(self, result, SWIGTYPE_$jsmangledtype, SWIG_POINTER_OWN); SWIGV8_RETURN(self); goto fail; fail: SWIGV8_RETURN(SWIGV8_UNDEFINED()); } %} /* ----------------------------------------------------------------------------- * js_ctor_dispatch_case: template for a dispatch case for calling an overloaded ctor. * - $jsargcount: number of arguments of called ctor * - $jswrapper: wrapper of called ctor * * Note: a try-catch-like mechanism is used to switch cases * ----------------------------------------------------------------------------- */ %fragment ("js_ctor_dispatch_case", "templates") %{ if(args.Length() == $jsargcount) { errorHandler.err.Clear(); #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031903) self = $jswrapper(args, errorHandler); if(errorHandler.err.IsEmpty()) { SWIGV8_ESCAPE(self); } #else $jswrapper(args, errorHandler); if(errorHandler.err.IsEmpty()) { return; } #endif } %} /* ----------------------------------------------------------------------------- * js_dtor: template for a destructor wrapper * - $jsmangledname: mangled class name * - $jstype: class type * ----------------------------------------------------------------------------- */ %fragment ("js_dtor", "templates") %{ #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031710) static void $jswrapper(v8::Persistent< v8::Value > object, void *parameter) { SWIGV8_Proxy *proxy = static_cast(parameter); #elif (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031900) static void $jswrapper(v8::Isolate *isolate, v8::Persistent object, void *parameter) { SWIGV8_Proxy *proxy = static_cast(parameter); #elif (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < SWIGV8_SETWEAK_VERSION) static void $jswrapper(v8::Isolate *isolate, v8::Persistent *object, SWIGV8_Proxy *proxy) { #elif (V8_MAJOR_VERSION-0) < 5 static void $jswrapper(const v8::WeakCallbackData &data) { v8::Local object = data.GetValue(); SWIGV8_Proxy *proxy = data.GetParameter(); #else static void $jswrapper(const v8::WeakCallbackInfo &data) { SWIGV8_Proxy *proxy = data.GetParameter(); #endif if(proxy->swigCMemOwn && proxy->swigCObject) { #ifdef SWIGRUNTIME_DEBUG printf("Deleting wrapped instance: %s\n", proxy->info->name); #endif $jsfree proxy->swigCObject; } delete proxy; #if (V8_MAJOR_VERSION-0) < 5 object.Clear(); #endif #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031710) object.Dispose(); #elif (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031900) object.Dispose(isolate); #elif (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x032100) object->Dispose(isolate); #elif (V8_MAJOR_VERSION-0) < 5 object->Dispose(); #endif } %} /* ----------------------------------------------------------------------------- * js_dtoroverride: template for a destructor wrapper * - $jsmangledname: mangled class name * - $jstype: class type * - ${destructor_action}: The custom destructor action to invoke. * ----------------------------------------------------------------------------- */ %fragment ("js_dtoroverride", "templates") %{ #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031710) static void $jswrapper(v8::Persistent object, void *parameter) { SWIGV8_Proxy *proxy = static_cast(parameter); #elif (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031900) static void $jswrapper(v8::Isolate *isolate, v8::Persistent object, void *parameter) { SWIGV8_Proxy *proxy = static_cast(parameter); #elif (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < SWIGV8_SETWEAK_VERSION) static void $jswrapper(v8::Isolate *isolate, v8::Persistent< v8::Object> *object, SWIGV8_Proxy *proxy) { #elif (V8_MAJOR_VERSION-0) < 5 static void $jswrapper(const v8::WeakCallbackData &data) { v8::Local object = data.GetValue(); SWIGV8_Proxy *proxy = data.GetParameter(); #else static void $jswrapper(const v8::WeakCallbackInfo &data) { SWIGV8_Proxy *proxy = data.GetParameter(); #endif if(proxy->swigCMemOwn && proxy->swigCObject) { $jstype arg1 = ($jstype)proxy->swigCObject; ${destructor_action} } delete proxy; #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031710) object.Dispose(); #elif (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031900) object.Dispose(isolate); #elif (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x032100) object->Dispose(isolate); #elif (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < SWIGV8_SETWEAK_VERSION) object->Dispose(); #elif (V8_MAJOR_VERSION-0) < 5 object.Clear(); #endif } %} /* ----------------------------------------------------------------------------- * js_getter: template for getter function wrappers * - $jswrapper: wrapper function name * - $jslocals: locals part of wrapper * - $jscode: code part of wrapper * ----------------------------------------------------------------------------- */ %fragment("js_getter", "templates") %{ #if (V8_MAJOR_VERSION-0) < 5 static SwigV8ReturnValue $jswrapper(v8::Local property, const SwigV8PropertyCallbackInfo &info) { #else static SwigV8ReturnValue $jswrapper(v8::Local property, const SwigV8PropertyCallbackInfo &info) { #endif SWIGV8_HANDLESCOPE(); v8::Handle jsresult; $jslocals $jscode SWIGV8_RETURN_INFO(jsresult, info); goto fail; fail: SWIGV8_RETURN_INFO(SWIGV8_UNDEFINED(), info); } %} /* ----------------------------------------------------------------------------- * js_setter: template for setter function wrappers * - $jswrapper: wrapper function name * - $jslocals: locals part of wrapper * - $jscode: code part of wrapper * ----------------------------------------------------------------------------- */ %fragment("js_setter", "templates") %{ #if (V8_MAJOR_VERSION-0) < 5 static void $jswrapper(v8::Local property, v8::Local value, const SwigV8PropertyCallbackInfoVoid &info) { #else static void $jswrapper(v8::Local property, v8::Local value, const SwigV8PropertyCallbackInfoVoid &info) { #endif SWIGV8_HANDLESCOPE(); $jslocals $jscode goto fail; fail: return; } %} /* ----------------------------------------------------------------------------- * js_function: template for function wrappers * - $jswrapper: wrapper function name * - $jslocals: locals part of wrapper * - $jscode: code part of wrapper * ----------------------------------------------------------------------------- */ %fragment("js_function", "templates") %{ static SwigV8ReturnValue $jswrapper(const SwigV8Arguments &args) { SWIGV8_HANDLESCOPE(); v8::Handle jsresult; $jslocals if(args.Length() != $jsargcount) SWIG_exception_fail(SWIG_ERROR, "Illegal number of arguments for $jswrapper."); $jscode SWIGV8_RETURN(jsresult); goto fail; fail: SWIGV8_RETURN(SWIGV8_UNDEFINED()); } %} /* ----------------------------------------------------------------------------- * js_function_dispatcher: template for a function dispatcher for overloaded functions * - $jswrapper: wrapper function name * - $jsname: name of the wrapped function * - $jslocals: locals part of wrapper * - $jscode: code part of wrapper * ----------------------------------------------------------------------------- */ %fragment("js_function_dispatcher", "templates") %{ static SwigV8ReturnValue $jswrapper(const SwigV8Arguments &args) { SWIGV8_HANDLESCOPE(); v8::Handle jsresult; OverloadErrorHandler errorHandler; $jscode SWIG_exception_fail(SWIG_ERROR, "Illegal arguments for function $jsname."); goto fail; fail: SWIGV8_RETURN(SWIGV8_UNDEFINED()); } %} /* ----------------------------------------------------------------------------- * js_overloaded_function: template for a overloaded function * - $jswrapper: wrapper function name * - $jslocals: locals part of wrapper * - $jscode: code part of wrapper * ----------------------------------------------------------------------------- */ %fragment ("js_overloaded_function", "templates") %{ static SwigV8ReturnValue $jswrapper(const SwigV8Arguments &args, V8ErrorHandler &SWIGV8_ErrorHandler) { SWIGV8_HANDLESCOPE(); v8::Handle jsresult; $jslocals $jscode SWIGV8_RETURN(jsresult); goto fail; fail: SWIGV8_RETURN(SWIGV8_UNDEFINED()); } %} /* ----------------------------------------------------------------------------- * js_function_dispatch_case: template for a case used in the function dispatcher * - $jswrapper: wrapper function name * - $jsargcount: number of arguments of overloaded function * - $jscode: code part of wrapper * ----------------------------------------------------------------------------- */ %fragment ("js_function_dispatch_case", "templates") %{ if(args.Length() == $jsargcount) { errorHandler.err.Clear(); #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031903) jsresult = $jswrapper(args, errorHandler); if(errorHandler.err.IsEmpty()) { SWIGV8_ESCAPE(jsresult); } #else $jswrapper(args, errorHandler); if(errorHandler.err.IsEmpty()) { return; } #endif } %} /* ----------------------------------------------------------------------------- * jsv8_declare_class_template: template for a class template declaration. * - $jsmangledname: mangled class name * ----------------------------------------------------------------------------- */ %fragment("jsv8_declare_class_template", "templates") %{ SWIGV8_ClientData $jsmangledname_clientData; %} /* ----------------------------------------------------------------------------- * jsv8_define_class_template: template for a class template definition. * - $jsmangledname: mangled class name * - $jsmangledtype: mangled class type * - $jsdtor: the dtor wrapper * ----------------------------------------------------------------------------- */ %fragment("jsv8_define_class_template", "templates") %{ /* Name: $jsmangledname, Type: $jsmangledtype, Dtor: $jsdtor */ v8::Handle $jsmangledname_class = SWIGV8_CreateClassTemplate("$jsmangledname"); SWIGV8_SET_CLASS_TEMPL($jsmangledname_clientData.class_templ, $jsmangledname_class); $jsmangledname_clientData.dtor = $jsdtor; if (SWIGTYPE_$jsmangledtype->clientdata == 0) { SWIGTYPE_$jsmangledtype->clientdata = &$jsmangledname_clientData; } %} /* ----------------------------------------------------------------------------- * jsv8_inherit: template for an class inherit statement. * - $jsmangledname: mangled class name * - $jsbaseclass: mangled name of the base class * ----------------------------------------------------------------------------- */ %fragment("jsv8_inherit", "templates") %{ if (SWIGTYPE_p$jsbaseclass->clientdata && !(static_cast(SWIGTYPE_p$jsbaseclass->clientdata)->class_templ.IsEmpty())) { #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031903) $jsmangledname_class->Inherit(static_cast(SWIGTYPE_p$jsbaseclass->clientdata)->class_templ); #else $jsmangledname_class->Inherit( v8::Local::New( v8::Isolate::GetCurrent(), static_cast(SWIGTYPE_p$jsbaseclass->clientdata)->class_templ) ); #endif #ifdef SWIGRUNTIME_DEBUG printf("Inheritance successful $jsmangledname $jsbaseclass\n"); #endif } else { #ifdef SWIGRUNTIME_DEBUG printf("Unable to inherit baseclass, it didn't exist $jsmangledname $jsbaseclass\n"); #endif } %} /* ----------------------------------------------------------------------------- * jsv8_create_class_instance: template for creating an class object. * - $jsname: class name * - $jsmangledname: mangled class name * ----------------------------------------------------------------------------- */ %fragment("jsv8_create_class_instance", "templates") %{ /* Class: $jsname ($jsmangledname) */ v8::Handle $jsmangledname_class_0 = SWIGV8_CreateClassTemplate("$jsname"); $jsmangledname_class_0->SetCallHandler($jsctor); $jsmangledname_class_0->Inherit($jsmangledname_class); $jsmangledname_class_0->SetHiddenPrototype(true); v8::Handle $jsmangledname_obj = $jsmangledname_class_0->GetFunction(); %} /* ----------------------------------------------------------------------------- * jsv8_register_class: template for a statement that registers a class in a parent namespace. * - $jsname: class name * - $jsmangledname: mangled class name * - $jsparent: mangled name of parent namespace * ----------------------------------------------------------------------------- */ %fragment("jsv8_register_class", "templates") %{ $jsparent_obj->Set(SWIGV8_SYMBOL_NEW("$jsname"), $jsmangledname_obj); %} /* ----------------------------------------------------------------------------- * jsv8_create_namespace: template for a statement that creates a namespace object. * - $jsmangledname: mangled namespace name * ----------------------------------------------------------------------------- */ %fragment("jsv8_create_namespace", "templates") %{ v8::Handle $jsmangledname_obj = SWIGV8_OBJECT_NEW(); %} /* ----------------------------------------------------------------------------- * jsv8_register_namespace: template for a statement that registers a namespace in a parent namespace. * - $jsname: name of namespace * - $jsmangledname: mangled name of namespace * - $jsparent: mangled name of parent namespace * ----------------------------------------------------------------------------- */ %fragment("jsv8_register_namespace", "templates") %{ $jsparent_obj->Set(SWIGV8_SYMBOL_NEW("$jsname"), $jsmangledname_obj); %} /* ----------------------------------------------------------------------------- * jsv8_register_member_function: template for a statement that registers a member function. * - $jsmangledname: mangled class name * - $jsname: name of the function * - $jswrapper: wrapper of the member function * ----------------------------------------------------------------------------- */ %fragment("jsv8_register_member_function", "templates") %{ SWIGV8_AddMemberFunction($jsmangledname_class, "$jsname", $jswrapper); %} /* ----------------------------------------------------------------------------- * jsv8_register_member_variable: template for a statement that registers a member variable. * - $jsmangledname: mangled class name * - $jsname: name of the function * - $jsgetter: wrapper of the getter function * - $jssetter: wrapper of the setter function * ----------------------------------------------------------------------------- */ %fragment("jsv8_register_member_variable", "templates") %{ SWIGV8_AddMemberVariable($jsmangledname_class, "$jsname", $jsgetter, $jssetter); %} /* ----------------------------------------------------------------------------- * jsv8_register_static_function: template for a statement that registers a static class function. * - $jsname: function name * - $jswrapper: wrapper of the function * - $jsparent: mangled name of parent namespace * * Note: this template is also used for global functions. * ----------------------------------------------------------------------------- */ %fragment("jsv8_register_static_function", "templates") %{ SWIGV8_AddStaticFunction($jsparent_obj, "$jsname", $jswrapper); %} /* ----------------------------------------------------------------------------- * jsv8_register_static_variable: template for a statement that registers a static variable. * - $jsname: variable name * - $jsparent: mangled name of parent namespace * - $jsgetter: wrapper of the getter function * - $jssetter: wrapper of the setter function * * Note: this template is also used for global variables. * ----------------------------------------------------------------------------- */ %fragment("jsv8_register_static_variable", "templates") %{ SWIGV8_AddStaticVariable($jsparent_obj, "$jsname", $jsgetter, $jssetter); %} swig-4.0.1/Lib/javascript/v8/javascriptkw.swg0000644000175000017500000000176713527063513021026 0ustar williamwilliam#ifndef JAVASCRIPT_JAVASCRIPTKW_SWG_ #define JAVASCRIPT_JAVASCRIPTKW_SWG_ /* Warnings for Java keywords */ #define JAVASCRIPTKW(x) %keywordwarn("'" `x` "' is a javascript keyword, renaming to '_"`x`"'",rename="_%s") `x` /* Taken from https://developer.mozilla.org/En/Core_JavaScript_1.5_Reference/Reserved_Words */ JAVASCRIPTKW(break); JAVASCRIPTKW(case); JAVASCRIPTKW(catch); JAVASCRIPTKW(continue); JAVASCRIPTKW(default); JAVASCRIPTKW(delete); JAVASCRIPTKW(do); JAVASCRIPTKW(else); JAVASCRIPTKW(finally); JAVASCRIPTKW(for); JAVASCRIPTKW(function); JAVASCRIPTKW(if); JAVASCRIPTKW(in); JAVASCRIPTKW(instanceof); JAVASCRIPTKW(new); JAVASCRIPTKW(return); JAVASCRIPTKW(switch); JAVASCRIPTKW(this); JAVASCRIPTKW(throw); JAVASCRIPTKW(try); JAVASCRIPTKW(typeof); JAVASCRIPTKW(var); JAVASCRIPTKW(void); JAVASCRIPTKW(while); JAVASCRIPTKW(with); /* others bad names if any*/ // for example %namewarn("321:clone() is a javascript bad method name") *::clone(); #undef JAVASCRIPTKW #endif //JAVASCRIPT_JAVASCRIPTKW_SWG_ swig-4.0.1/Lib/javascript/v8/ccomplex.i0000644000175000017500000000140213527063513017542 0ustar williamwilliam/* ----------------------------------------------------------------------------- * ccomplex.i * * C complex typemaps * ISO C99: 7.3 Complex arithmetic * ----------------------------------------------------------------------------- */ %include %{ #include %} /* C complex constructor */ #define CCplxConst(r, i) ((r) + I*(i)) %swig_cplxflt_convn(float complex, CCplxConst, creal, cimag); %swig_cplxdbl_convn(double complex, CCplxConst, creal, cimag); %swig_cplxdbl_convn(complex, CCplxConst, creal, cimag); /* declaring the typemaps */ %typemaps_primitive(SWIG_TYPECHECK_CPLXFLT, float complex); %typemaps_primitive(SWIG_TYPECHECK_CPLXDBL, double complex); %typemaps_primitive(SWIG_TYPECHECK_CPLXDBL, complex); swig-4.0.1/Lib/javascript/v8/javascripttypemaps.swg0000644000175000017500000000244313527063513022237 0ustar williamwilliam/* ------------------------------------------------------------ * Typemap specializations for Javascript * ------------------------------------------------------------ */ /* ------------------------------------------------------------ * Fragment section * ------------------------------------------------------------ */ /* Include fundamental fragemt definitions */ %include /* Look for user fragments file. */ %include /* Javascript fragments for fundamental types */ %include /* Javascript fragments for char* strings */ %include /* ------------------------------------------------------------ * Unified typemap section * ------------------------------------------------------------ */ /* Javascript types */ #define SWIG_Object v8::Handle #define VOID_Object SWIGV8_UNDEFINED() /* Overload of the output/constant/exception/dirout handling */ /* append output */ #define SWIG_AppendOutput(result, obj) SWIGV8_AppendOutput(result, obj) /* set constant */ #define SWIG_SetConstant(name, obj) /* raise */ #define SWIG_Raise(obj, type, desc) SWIG_V8_Raise(type) /* Include the unified typemap library */ %include swig-4.0.1/Lib/javascript/v8/std_common.i0000644000175000017500000000014613527063513020076 0ustar williamwilliam%include %apply size_t { std::size_t }; %apply const size_t& { const std::size_t& }; swig-4.0.1/Lib/javascript/v8/std_except.i0000644000175000017500000000004313527063513020072 0ustar williamwilliam%include swig-4.0.1/Lib/javascript/v8/complex.i0000644000175000017500000000012013527063513017373 0ustar williamwilliam#ifdef __cplusplus %include #else %include #endif swig-4.0.1/Lib/javascript/v8/typemaps.i0000644000175000017500000001047613527063513017605 0ustar williamwilliam/* ----------------------------------------------------------------------------- * typemaps.i * * Pointer handling * These mappings provide support for input/output arguments and common * uses for C/C++ pointers. * ----------------------------------------------------------------------------- */ // INPUT typemaps. // These remap a C pointer to be an "INPUT" value which is passed by value // instead of reference. /* The following methods can be applied to turn a pointer into a simple "input" value. That is, instead of passing a pointer to an object, you would use a real value instead. int *INPUT short *INPUT long *INPUT long long *INPUT unsigned int *INPUT unsigned short *INPUT unsigned long *INPUT unsigned long long *INPUT unsigned char *INPUT bool *INPUT float *INPUT double *INPUT To use these, suppose you had a C function like this : double fadd(double *a, double *b) { return *a+*b; } You could wrap it with SWIG as follows : %include double fadd(double *INPUT, double *INPUT); or you can use the %apply directive : %include %apply double *INPUT { double *a, double *b }; double fadd(double *a, double *b); */ // OUTPUT typemaps. These typemaps are used for parameters that // are output only. The output value is appended to the result as // a list element. /* The following methods can be applied to turn a pointer into an "output" value. When calling a function, no input value would be given for a parameter, but an output value would be returned. In the case of multiple output values, they are returned in the form of a Python tuple. int *OUTPUT short *OUTPUT long *OUTPUT long long *OUTPUT unsigned int *OUTPUT unsigned short *OUTPUT unsigned long *OUTPUT unsigned long long *OUTPUT unsigned char *OUTPUT bool *OUTPUT float *OUTPUT double *OUTPUT For example, suppose you were trying to wrap the modf() function in the C math library which splits x into integral and fractional parts (and returns the integer part in one of its parameters).K: double modf(double x, double *ip); You could wrap it with SWIG as follows : %include double modf(double x, double *OUTPUT); or you can use the %apply directive : %include %apply double *OUTPUT { double *ip }; double modf(double x, double *ip); The Python output of the function would be a tuple containing both output values. */ // INOUT // Mappings for an argument that is both an input and output // parameter /* The following methods can be applied to make a function parameter both an input and output value. This combines the behavior of both the "INPUT" and "OUTPUT" methods described earlier. Output values are returned in the form of a Python tuple. int *INOUT short *INOUT long *INOUT long long *INOUT unsigned int *INOUT unsigned short *INOUT unsigned long *INOUT unsigned long long *INOUT unsigned char *INOUT bool *INOUT float *INOUT double *INOUT For example, suppose you were trying to wrap the following function : void neg(double *x) { *x = -(*x); } You could wrap it with SWIG as follows : %include void neg(double *INOUT); or you can use the %apply directive : %include %apply double *INOUT { double *x }; void neg(double *x); Unlike C, this mapping does not directly modify the input value (since this makes no sense in Python). Rather, the modified input value shows up as the return value of the function. Thus, to apply this function to a Python variable you might do this : x = neg(x) Note : previous versions of SWIG used the symbol 'BOTH' to mark input/output arguments. This is still supported, but will be slowly phased out in future releases. */ %include swig-4.0.1/Lib/javascript/v8/javascriptstrings.swg0000644000175000017500000000336313527063513022070 0ustar williamwilliam /* ------------------------------------------------------------ * utility methods for char strings * ------------------------------------------------------------ */ %fragment("SWIG_AsCharPtrAndSize", "header", fragment="SWIG_pchar_descriptor") { SWIGINTERN int SWIG_AsCharPtrAndSize(v8::Handle valRef, char** cptr, size_t* psize, int *alloc) { if(valRef->IsString()) { v8::Handle js_str = SWIGV8_TO_STRING(valRef); size_t len = SWIGV8_UTF8_LENGTH(js_str) + 1; char* cstr = new char[len]; SWIGV8_WRITE_UTF8(js_str, cstr, len); if(alloc) *alloc = SWIG_NEWOBJ; if(psize) *psize = len; if(cptr) *cptr = cstr; return SWIG_OK; } else { if(valRef->IsObject()) { v8::Handle obj = SWIGV8_TO_OBJECT(valRef); // try if the object is a wrapped char[] swig_type_info* pchar_descriptor = SWIG_pchar_descriptor(); if (pchar_descriptor) { void* vptr = 0; if (SWIG_ConvertPtr(obj, &vptr, pchar_descriptor, 0) == SWIG_OK) { if (cptr) *cptr = (char *) vptr; if (psize) *psize = vptr ? (strlen((char *)vptr) + 1) : 0; if (alloc) *alloc = SWIG_OLDOBJ; return SWIG_OK; } } return SWIG_TypeError; } else { return SWIG_TypeError; } } } } %fragment("SWIG_FromCharPtrAndSize","header",fragment="SWIG_pchar_descriptor") { SWIGINTERNINLINE v8::Handle SWIG_FromCharPtrAndSize(const char* carray, size_t size) { if (carray) { if (size > INT_MAX) { // TODO: handle extra long strings return SWIGV8_UNDEFINED(); } else { v8::Handle js_str = SWIGV8_STRING_NEW2(carray, size); return js_str; } } else { return SWIGV8_UNDEFINED(); } } } swig-4.0.1/Lib/javascript/v8/javascriptinit.swg0000644000175000017500000001015413527063513021336 0ustar williamwilliam%insert(header) %{ #include %} %insert(init) %{ SWIGRUNTIME void SWIG_V8_SetModule(void *, swig_module_info *swig_module) { v8::Local global_obj = SWIGV8_CURRENT_CONTEXT()->Global(); v8::Local mod = SWIGV8_EXTERNAL_NEW(swig_module); assert(!mod.IsEmpty()); #if (V8_MAJOR_VERSION-0) < 5 global_obj->SetHiddenValue(SWIGV8_STRING_NEW("swig_module_info_data"), mod); #else v8::Local privateKey = v8::Private::ForApi(v8::Isolate::GetCurrent(), SWIGV8_STRING_NEW("swig_module_info_data")); global_obj->SetPrivate(SWIGV8_CURRENT_CONTEXT(), privateKey, mod); #endif } SWIGRUNTIME swig_module_info * SWIG_V8_GetModule(void *) { v8::Local global_obj = SWIGV8_CURRENT_CONTEXT()->Global(); #if (V8_MAJOR_VERSION-0) < 5 v8::Local moduleinfo = global_obj->GetHiddenValue(SWIGV8_STRING_NEW("swig_module_info_data")); #else v8::Local privateKey = v8::Private::ForApi(v8::Isolate::GetCurrent(), SWIGV8_STRING_NEW("swig_module_info_data")); v8::Local moduleinfo; if (!global_obj->GetPrivate(SWIGV8_CURRENT_CONTEXT(), privateKey).ToLocal(&moduleinfo)) return 0; #endif if (moduleinfo.IsEmpty() || moduleinfo->IsNull() || moduleinfo->IsUndefined()) { // It's not yet loaded return 0; } v8::Local moduleinfo_extern = v8::Local::Cast(moduleinfo); if (moduleinfo_extern.IsEmpty() || moduleinfo_extern->IsNull() || moduleinfo_extern->IsUndefined()) { // Something's not right return 0; } void *ptr = moduleinfo_extern->Value(); assert(ptr); swig_module_info *retptr = static_cast(ptr); assert(retptr); return retptr; } #define SWIG_GetModule(clientdata) SWIG_V8_GetModule(clientdata) #define SWIG_SetModule(clientdata, pointer) SWIG_V8_SetModule(clientdata, pointer) %} %insert(init) "swiginit.swg" // Open the initializer function definition here %fragment ("js_initializer_define", "templates") %{ #define SWIGV8_INIT $jsname_initialize %} %insert(init) %{ // Note: 'extern "C"'' disables name mangling which makes it easier to load the symbol manually // TODO: is it ok to do that? extern "C" #if (NODE_MODULE_VERSION < 0x000C) void SWIGV8_INIT (v8::Handle exports) #else void SWIGV8_INIT (v8::Handle exports, v8::Handle /*module*/) #endif { SWIG_InitializeModule(static_cast(&exports)); SWIGV8_HANDLESCOPE(); v8::Handle exports_obj = exports; %} /* ----------------------------------------------------------------------------- * js_initializer: template for the module initializer function * - $jsname: module name * - $jsv8nspaces: part with code creating namespace objects * - $jsv8classtemplates: part with code creating class templates * - $jsv8wrappers: part with code that registers wrapper functions * - $jsv8inheritance: part with inherit statements * - $jsv8classinstances: part with code creating class objects * - $jsv8staticwrappers: part with code adding static functions to class objects * - $jsv8registerclasses: part with code that registers class objects in namespaces * - $jsv8registernspaces: part with code that registers namespaces in parent namespaces * ----------------------------------------------------------------------------- */ %fragment("js_initializer", "templates") %{ // a class template for creating proxies of undefined types SWIGV8_SET_CLASS_TEMPL(SWIGV8_SWIGTYPE_Proxy_class_templ, SWIGV8_CreateClassTemplate("SwigProxy")); /* create objects for namespaces */ $jsv8nspaces /* create class templates */ $jsv8classtemplates /* register wrapper functions */ $jsv8wrappers /* setup inheritances */ $jsv8inheritance /* class instances */ $jsv8classinstances /* add static class functions and variables */ $jsv8staticwrappers /* register classes */ $jsv8registerclasses /* create and register namespace objects */ $jsv8registernspaces } #if defined(BUILDING_NODE_EXTENSION) NODE_MODULE($jsname, $jsname_initialize) #endif %} swig-4.0.1/Lib/javascript/v8/std_pair.i0000644000175000017500000000135613527063513017545 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_pair.i * * SWIG typemaps for std::pair * ----------------------------------------------------------------------------- */ %include // ------------------------------------------------------------------------ // std::pair // ------------------------------------------------------------------------ %{ #include %} namespace std { template struct pair { typedef T first_type; typedef U second_type; pair(); pair(T first, U second); pair(const pair& other); template pair(const pair &other); T first; U second; }; // add specializations here } swig-4.0.1/Lib/javascript/v8/stl.i0000644000175000017500000000044313527063513016536 0ustar williamwilliam/* ----------------------------------------------------------------------------- * stl.i * ----------------------------------------------------------------------------- */ %include %include %include %include %include swig-4.0.1/Lib/javascript/v8/exception.i0000644000175000017500000000004213527063513017725 0ustar williamwilliam%include swig-4.0.1/Lib/javascript/v8/javascriptfragments.swg0000644000175000017500000000105713527063513022363 0ustar williamwilliam/* Create a file with this name, 'javascriptfragments.swg', in your working directory and add all the %fragments you want to take precedence over the default ones defined by swig. For example, if you add: %fragment(SWIG_AsVal_frag(int),"header") { SWIGINTERNINLINE int SWIG_AsVal(int)(PyObject *obj, int *val) { ; } } this will replace the code used to retrieve an integer value for all the typemaps that need it, including: int, std::vector, std::list >, etc. */ swig-4.0.1/Lib/javascript/v8/cdata.i0000644000175000017500000000003613527063513017006 0ustar williamwilliam%include swig-4.0.1/Lib/javascript/v8/javascriptcomplex.swg0000644000175000017500000000637713527063513022056 0ustar williamwilliam/* Defines the As/From converters for double/float complex, you need to provide complex Type, the Name you want to use in the converters, the complex Constructor method, and the Real and Imag complex accessor methods. See the std_complex.i and ccomplex.i for concrete examples. */ /* the common from converter */ %define %swig_fromcplx_conv(Type, Real, Imag) %fragment(SWIG_From_frag(Type),"header", fragment=SWIG_From_frag(double)) { SWIGINTERNINLINE v8::Handle SWIG_From_dec(Type)(%ifcplusplus(const Type&, Type) c) { SWIGV8_HANDLESCOPE_ESC(); v8::Local vals = SWIGV8_ARRAY_NEW(); vals->Set(0, SWIG_From(double)(Real(c))); vals->Set(1, SWIG_From(double)(Imag(c))); SWIGV8_ESCAPE(vals); } } %enddef /* the double case */ %define %swig_cplxdbl_conv(Type, Constructor, Real, Imag) %fragment(SWIG_AsVal_frag(Type),"header", fragment=SWIG_AsVal_frag(double)) { SWIGINTERN int SWIG_AsVal_dec(Type) (v8::Handle o, Type* val) { SWIGV8_HANDLESCOPE(); if (o->IsArray()) { v8::Handle array = v8::Handle::Cast(o); if(array->Length() != 2) SWIG_Error(SWIG_TypeError, "Illegal argument for complex: must be array[2]."); double re, im; int res; res = SWIG_AsVal(double)(array->Get(0), &re); if(!SWIG_IsOK(res)) { return SWIG_TypeError; } res = SWIG_AsVal(double)(array->Get(1), &im); if(!SWIG_IsOK(res)) { return SWIG_TypeError; } if (val) *val = Constructor(re, im); return SWIG_OK; } else if(o->IsNumber()){ double d; int res = SWIG_AddCast(SWIG_AsVal(double)(o, &d)); if (SWIG_IsOK(res)) { if (val) *val = Constructor(d, 0.0); return res; } } return SWIG_TypeError; } } %swig_fromcplx_conv(Type, Real, Imag); %enddef /* the float case */ %define %swig_cplxflt_conv(Type, Constructor, Real, Imag) %fragment(SWIG_AsVal_frag(Type),"header", fragment=SWIG_AsVal_frag(float)) { SWIGINTERN int SWIG_AsVal_dec(Type) (v8::Handle o, Type* val) { SWIGV8_HANDLESCOPE(); if (o->IsArray()) { v8::Handle array = v8::Handle::Cast(o); if(array->Length() != 2) SWIG_Error(SWIG_TypeError, "Illegal argument for complex: must be array[2]."); double re, im; int res; res = SWIG_AsVal(double)(array->Get(0), &re); if(!SWIG_IsOK(res)) { return SWIG_TypeError; } res = SWIG_AsVal(double)(array->Get(1), &im); if(!SWIG_IsOK(res)) { return SWIG_TypeError; } if ((-FLT_MAX <= re && re <= FLT_MAX) && (-FLT_MAX <= im && im <= FLT_MAX)) { if (val) *val = Constructor(%numeric_cast(re, float), %numeric_cast(im, float)); return SWIG_OK; } else { return SWIG_OverflowError; } } else if(o->IsNumber()){ float re; int res = SWIG_AddCast(SWIG_AsVal(float)(o, &re)); if (SWIG_IsOK(res)) { if (val) *val = Constructor(re, 0.0); return res; } } return SWIG_TypeError; } } %swig_fromcplx_conv(Type, Real, Imag); %enddef #define %swig_cplxflt_convn(Type, Constructor, Real, Imag) \ %swig_cplxflt_conv(Type, Constructor, Real, Imag) #define %swig_cplxdbl_convn(Type, Constructor, Real, Imag) \ %swig_cplxdbl_conv(Type, Constructor, Real, Imag) swig-4.0.1/Lib/javascript/v8/std_string.i0000644000175000017500000000004313527063513020110 0ustar williamwilliam%include swig-4.0.1/Lib/javascript/v8/std_map.i0000644000175000017500000000505613527063513017370 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_map.i * * SWIG typemaps for std::map * ----------------------------------------------------------------------------- */ %include // ------------------------------------------------------------------------ // std::map // ------------------------------------------------------------------------ %{ #include #include #include %} // exported class namespace std { template > class map { // add typemaps here public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef K key_type; typedef T mapped_type; typedef std::pair< const K, T > value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; map(); map(const map& other); unsigned int size() const; bool empty() const; void clear(); %extend { const T& get(const K& key) throw (std::out_of_range) { std::map< K, T, C >::iterator i = self->find(key); if (i != self->end()) return i->second; else throw std::out_of_range("key not found"); } void set(const K& key, const T& x) { (*self)[key] = x; } void del(const K& key) throw (std::out_of_range) { std::map< K, T, C >::iterator i = self->find(key); if (i != self->end()) self->erase(i); else throw std::out_of_range("key not found"); } bool has_key(const K& key) { std::map< K, T, C >::iterator i = self->find(key); return i != self->end(); } } }; // Legacy macros (deprecated) %define specialize_std_map_on_key(K,CHECK,CONVERT_FROM,CONVERT_TO) #warning "specialize_std_map_on_key ignored - macro is deprecated and no longer necessary" %enddef %define specialize_std_map_on_value(T,CHECK,CONVERT_FROM,CONVERT_TO) #warning "specialize_std_map_on_value ignored - macro is deprecated and no longer necessary" %enddef %define specialize_std_map_on_both(K,CHECK_K,CONVERT_K_FROM,CONVERT_K_TO, T,CHECK_T,CONVERT_T_FROM,CONVERT_T_TO) #warning "specialize_std_map_on_both ignored - macro is deprecated and no longer necessary" %enddef } swig-4.0.1/Lib/javascript/v8/arrays_javascript.i0000644000175000017500000000626313527063513021471 0ustar williamwilliam/* ----------------------------------------------------------------------------- * arrays_javascript.i * * These typemaps give more natural support for arrays. The typemaps are not efficient * as there is a lot of copying of the array values whenever the array is passed to C/C++ * from JavaScript and vice versa. The JavaScript array is expected to be the same size as the C array. * An exception is thrown if they are not. * * Example usage: * Wrapping: * * %include * %inline %{ * extern int FiddleSticks[3]; * %} * * Use from JavaScript like this: * * var fs = [10, 11, 12]; * example.FiddleSticks = fs; * fs = example.FiddleSticks; * ----------------------------------------------------------------------------- */ %fragment("SWIG_JSCGetIntProperty", "header", fragment=SWIG_AsVal_frag(int)) {} %fragment("SWIG_JSCGetNumberProperty", "header", fragment=SWIG_AsVal_frag(double)) {} %typemap(in, fragment="SWIG_JSCGetIntProperty") int[], int[ANY] (int length = 0, v8::Local array, v8::Local jsvalue, int i = 0, int res = 0, $*1_ltype temp) { if ($input->IsArray()) { // Convert into Array array = v8::Local::Cast($input); length = $1_dim0; $1 = ($*1_ltype *)malloc(sizeof($*1_ltype) * length); // Get each element from array for (i = 0; i < length; i++) { jsvalue = array->Get(i); // Get primitive value from JSObject res = SWIG_AsVal(int)(jsvalue, &temp); if (!SWIG_IsOK(res)) { SWIG_exception_fail(SWIG_ERROR, "Failed to convert $input to double"); } arg$argnum[i] = temp; } } else { SWIG_exception_fail(SWIG_ERROR, "$input is not JSObjectRef"); } } %typemap(freearg) int[], int[ANY] { free($1); } %typemap(out, fragment=SWIG_From_frag(int)) int[], int[ANY] (int length = 0, int i = 0) { length = $1_dim0; v8::Local array = v8::Array::New(length); for (i = 0; i < length; i++) { array->Set(i, SWIG_From(int)($1[i])); } $result = array; } %typemap(in, fragment="SWIG_JSCGetNumberProperty") double[], double[ANY] (int length = 0, v8::Local array, v8::Local jsvalue, int i = 0, int res = 0, $*1_ltype temp) { if ($input->IsArray()) { // Convert into Array array = v8::Local::Cast($input); length = $1_dim0; $1 = ($*1_ltype *)malloc(sizeof($*1_ltype) * length); // Get each element from array for (i = 0; i < length; i++) { jsvalue = array->Get(i); // Get primitive value from JSObject res = SWIG_AsVal(double)(jsvalue, &temp); if (!SWIG_IsOK(res)) { SWIG_exception_fail(SWIG_ERROR, "Failed to convert $input to double"); } arg$argnum[i] = temp; } } else { SWIG_exception_fail(SWIG_ERROR, "$input is not JSObjectRef"); } } %typemap(freearg) double[], double[ANY] { free($1); } %typemap(out, fragment=SWIG_From_frag(double)) double[], double[ANY] (int length = 0, int i = 0) { length = $1_dim0; v8::Local array = v8::Array::New(length); for (i = 0; i < length; i++) { array->Set(i, SWIG_From(double)($1[i])); } $result = array; } swig-4.0.1/Lib/javascript/jsc/0000755000175000017500000000000013527063513016003 5ustar williamwilliamswig-4.0.1/Lib/javascript/jsc/javascriptprimtypes.swg0000644000175000017500000001032413527063513022650 0ustar williamwilliam/* ------------------------------------------------------------ * Primitive Types * ------------------------------------------------------------ */ /* boolean */ %fragment(SWIG_From_frag(bool),"header") { SWIGINTERNINLINE JSValueRef SWIG_From_dec(bool)(bool value) { return JSValueMakeBoolean(context, value); } } %fragment(SWIG_AsVal_frag(bool),"header", fragment=SWIG_AsVal_frag(long)) { SWIGINTERN int SWIG_AsVal_dec(bool)(JSValueRef obj, bool *val) { if(!JSValueIsBoolean(context, obj)) { return SWIG_ERROR; } if (val) *val = JSValueToBoolean(context, obj); return SWIG_OK; } } /* int */ %fragment(SWIG_From_frag(int),"header") { SWIGINTERNINLINE JSValueRef SWIG_From_dec(int)(int value) { return JSValueMakeNumber(context, value); } } /* long */ %fragment(SWIG_From_frag(long),"header") { SWIGINTERNINLINE JSValueRef SWIG_From_dec(long)(long value) { return JSValueMakeNumber(context, value); } } %fragment(SWIG_AsVal_frag(long),"header", fragment="SWIG_CanCastAsInteger") { SWIGINTERN int SWIG_AsVal_dec(long)(JSValueRef obj, long* val) { if (!JSValueIsNumber(context, obj)) { return SWIG_TypeError; } if(val) *val = (long) JSValueToNumber(context, obj, NULL); return SWIG_OK; } } /* unsigned long */ %fragment(SWIG_From_frag(unsigned long),"header", fragment=SWIG_From_frag(long)) { SWIGINTERNINLINE JSValueRef SWIG_From_dec(unsigned long)(unsigned long value) { return (value > LONG_MAX) ? JSValueMakeNumber(context, value) : JSValueMakeNumber(context, %numeric_cast(value,long)); } } %fragment(SWIG_AsVal_frag(unsigned long),"header", fragment="SWIG_CanCastAsInteger") { SWIGINTERN int SWIG_AsVal_dec(unsigned long)(JSValueRef obj, unsigned long *val) { long longVal; if(!JSValueIsNumber(context, obj)) { return SWIG_TypeError; } longVal = (long) JSValueToNumber(context, obj, NULL); if(longVal < 0) { return SWIG_OverflowError; } if(val) *val = longVal; return SWIG_OK; } } /* long long */ // Note: these are copied from 'long' and probably need fixing %fragment(SWIG_From_frag(long long),"header", fragment=SWIG_From_frag(long), fragment="SWIG_LongLongAvailable") { %#ifdef SWIG_LONG_LONG_AVAILABLE SWIGINTERNINLINE JSValueRef SWIG_From_dec(long long)(long long value) { return JSValueMakeNumber(context, value); } %#endif } %fragment(SWIG_AsVal_frag(long long),"header", fragment=SWIG_AsVal_frag(long), fragment="SWIG_CanCastAsInteger", fragment="SWIG_LongLongAvailable") { %#ifdef SWIG_LONG_LONG_AVAILABLE SWIGINTERN int SWIG_AsVal_dec(long long)(JSValueRef obj, long long* val) { if (!JSValueIsNumber(context, obj)) { return SWIG_TypeError; } if(val) *val = (long long) JSValueToNumber(context, obj, NULL); return SWIG_OK; } %#endif } /* unsigned long long */ // Note: these are copied from 'unsigned long' and probably need fixing %fragment(SWIG_From_frag(unsigned long long),"header", fragment=SWIG_From_frag(long long), fragment="SWIG_LongLongAvailable") { %#ifdef SWIG_LONG_LONG_AVAILABLE SWIGINTERN JSValueRef SWIG_From_dec(unsigned long long)(unsigned long long value) { return (value > LONG_MAX) ? JSValueMakeNumber(context, value) : JSValueMakeNumber(context, %numeric_cast(value,long)); } %#endif } %fragment(SWIG_AsVal_frag(unsigned long long),"header", fragment=SWIG_AsVal_frag(unsigned long), fragment="SWIG_CanCastAsInteger", fragment="SWIG_LongLongAvailable") { %#ifdef SWIG_LONG_LONG_AVAILABLE SWIGINTERN int SWIG_AsVal_dec(unsigned long long)(JSValueRef obj, unsigned long long *val) { long long longVal; if(!JSValueIsNumber(context, obj)) { return SWIG_TypeError; } longVal = (unsigned long long) JSValueToNumber(context, obj, NULL); if(longVal < 0) { return SWIG_OverflowError; } if(val) *val = longVal; return SWIG_OK; } %#endif } /* double */ %fragment(SWIG_From_frag(double),"header") { SWIGINTERN JSValueRef SWIG_From_dec(double) (double val) { return JSValueMakeNumber(context, val); } } %fragment(SWIG_AsVal_frag(double),"header") { SWIGINTERN int SWIG_AsVal_dec(double)(JSValueRef obj, double *val) { if(!JSValueIsNumber(context, obj)) { return SWIG_TypeError; } if(val) *val = JSValueToNumber(context, obj, NULL); return SWIG_OK; } } swig-4.0.1/Lib/javascript/jsc/std_complex.i0000644000175000017500000000114713527063513020501 0ustar williamwilliam/* * STD C++ complex typemaps */ %include %{ #include %} namespace std { %naturalvar complex; template class complex; %template() complex; %template() complex; } /* defining the complex as/from converters */ %swig_cplxdbl_convn(std::complex, std::complex, std::real, std::imag) %swig_cplxflt_convn(std::complex, std::complex, std::real, std::imag) /* defining the typemaps */ %typemaps_primitive(%checkcode(CPLXDBL), std::complex); %typemaps_primitive(%checkcode(CPLXFLT), std::complex); swig-4.0.1/Lib/javascript/jsc/std_deque.i0000644000175000017500000000003413527063513020127 0ustar williamwilliam%include swig-4.0.1/Lib/javascript/jsc/javascripthelpers.swg0000644000175000017500000000451113527063513022257 0ustar williamwilliam%insert(wrapper) %{ SWIGINTERN bool JS_registerClass(JSGlobalContextRef context, JSObjectRef parentObject, const char* className, JSClassDefinition* definition) { JSStringRef js_className = JSStringCreateWithUTF8CString(className); JSObjectRef classObject = JSObjectMake(context, JSClassCreate(definition), NULL); JSObjectSetProperty(context, parentObject, js_className, classObject, kJSPropertyAttributeNone, NULL); JSStringRelease(js_className); return true; } SWIGINTERN bool JS_registerNamespace(JSGlobalContextRef context, JSObjectRef namespaceObj, JSObjectRef parentNamespace, const char* name) { JSStringRef js_name = JSStringCreateWithUTF8CString(name); JSObjectSetProperty(context, parentNamespace, js_name, namespaceObj, kJSPropertyAttributeNone, NULL); JSStringRelease(js_name); return true; } SWIGINTERN bool JS_registerFunction(JSGlobalContextRef context, JSObjectRef object, const char* functionName, JSObjectCallAsFunctionCallback callback) { JSStringRef js_functionName = JSStringCreateWithUTF8CString(functionName); JSObjectSetProperty(context, object, js_functionName, JSObjectMakeFunctionWithCallback(context, js_functionName, callback), kJSPropertyAttributeNone, NULL); JSStringRelease(js_functionName); return true; } SWIGINTERN bool JS_veto_set_variable(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef value, JSValueRef* exception) { char buffer[256]; char msg[512]; int res; JSStringGetUTF8CString(propertyName, buffer, 256); res = sprintf(msg, "Tried to write read-only variable: %s.", buffer); if(res<0) { SWIG_exception(SWIG_ERROR, "Tried to write read-only variable."); } else { SWIG_exception(SWIG_ERROR, msg); } fail: return false; } SWIGINTERN JSValueRef JS_CharPtrToJSValue(JSContextRef context, char* cstr) { JSValueRef val; JSStringRef jsstring = JSStringCreateWithUTF8CString((char*) cstr); val = JSValueMakeString(context, jsstring); JSStringRelease(jsstring); return val; } %} swig-4.0.1/Lib/javascript/jsc/javascript.swg0000644000175000017500000000066713527063513020704 0ustar williamwilliam/* ----------------------------------------------------------------------------- * javascript.swg * * Javascript typemaps * ----------------------------------------------------------------------------- */ %include %include %include %include %include %include %include swig-4.0.1/Lib/javascript/jsc/javascriptruntime.swg0000644000175000017500000000105513527063513022300 0ustar williamwilliam/* ----------------------------------------------------------------------------- * javascriptruntime.swg * * Javascript support code * ----------------------------------------------------------------------------- */ %insert(runtime) %{ #include #include #include #include #include #include %} %insert(runtime) "swigrun.swg"; /* SWIG API */ %insert(runtime) "swigerrors.swg"; /* SWIG errors */ %insert(runtime) "javascriptrun.swg"; /* SWIG errors */ swig-4.0.1/Lib/javascript/jsc/javascriptrun.swg0000644000175000017500000002406513527063513021427 0ustar williamwilliam/* ---------------------------------------------------------------------------- * Errors and exceptions * * ---------------------------------------------------------------------------*/ #define SWIG_Error(code, msg) SWIG_JSC_exception(context, exception, code, msg) #define SWIG_exception(code, msg) do { SWIG_JSC_exception(context, exception, code, msg); SWIG_fail; } while (0) #define SWIG_fail goto fail SWIGRUNTIME void SWIG_Javascript_Raise(JSContextRef context, JSValueRef *exception, const char* type) { JSStringRef message = JSStringCreateWithUTF8CString(type); JSValueRef error_arguments[1]; JSObjectRef exception_object; JSValueRef exception_value; exception_value = JSValueMakeString(context, message); /* Converting the result to an object will let JavascriptCore add "sourceURL" (file) and "line" (number) and "message" to the exception, instead of just returning a raw string. This is extremely important for debugging your errors. Using JSObjectMakeError is better than JSValueToObject because the latter only populates "sourceURL" and "line", but not "message" or any others I don't know about. */ error_arguments[0] = exception_value; exception_object = JSObjectMakeError(context, 1, error_arguments, NULL); /* Return the exception_object */ *exception = exception_object; JSStringRelease(message); } SWIGRUNTIME void SWIG_JSC_exception(JSContextRef context, JSValueRef *exception, int code, const char* msg) { SWIG_Javascript_Raise(context, exception, msg); } /* ---------------------------------------------------------------------------- * The parent class of all Proxies * * ---------------------------------------------------------------------------*/ typedef struct { bool swigCMemOwn; void *swigCObject; swig_type_info *info; } SwigPrivData; SWIGRUNTIME JSValueRef _wrap_SwigObject_disown(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argc, const JSValueRef argv[], JSValueRef* exception) { JSValueRef jsresult; JSObjectRef obj = JSValueToObject(context, thisObject, NULL); SwigPrivData *cdata = (SwigPrivData *) JSObjectGetPrivate(obj); cdata->swigCMemOwn = false; jsresult = JSValueMakeUndefined(context); return jsresult; } SWIGRUNTIME JSValueRef _wrap_SwigObject_getCPtr(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argc, const JSValueRef argv[], JSValueRef* exception) { JSValueRef jsresult; long result; JSObjectRef obj = JSValueToObject(context, thisObject, NULL); SwigPrivData *cdata = (SwigPrivData*) JSObjectGetPrivate(obj); result = (long) cdata->swigCObject; jsresult = JSValueMakeNumber(context, result); return jsresult; } SWIGRUNTIME JSValueRef _wrap_SwigObject_equals(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argc, const JSValueRef argv[], JSValueRef* exception) { JSValueRef jsresult; bool result; JSObjectRef obj = JSValueToObject(context, thisObject, NULL); SwigPrivData *cdata = (SwigPrivData*) JSObjectGetPrivate(obj); JSObjectRef obj2 = JSValueToObject(context, argv[0], NULL); SwigPrivData *cdata2 = (SwigPrivData*) JSObjectGetPrivate(obj2); result = (cdata->swigCObject == cdata2->swigCObject); jsresult = JSValueMakeBoolean(context, result); return jsresult; } SWIGRUNTIME JSStaticValue _SwigObject_values[] = { { 0, 0, 0, 0 } }; SWIGRUNTIME JSStaticFunction _SwigObject_functions[] = { { "disown",_wrap_SwigObject_disown, kJSPropertyAttributeNone }, { "equals",_wrap_SwigObject_equals, kJSPropertyAttributeNone }, { "getCPtr",_wrap_SwigObject_getCPtr, kJSPropertyAttributeNone }, { 0, 0, 0 } }; SWIGRUNTIME JSClassDefinition _SwigObject_objectDefinition; SWIGRUNTIME JSClassRef _SwigObject_classRef; SWIGRUNTIME int SWIG_JSC_ConvertInstancePtr(JSContextRef context, JSObjectRef objRef, void** ptr, swig_type_info *info, int flags) { SwigPrivData *cdata; cdata = (SwigPrivData *) JSObjectGetPrivate(objRef); if(cdata == NULL) { return SWIG_ERROR; } if(cdata->info != info) { bool type_valid = false; swig_cast_info *t = info->cast; while(t != NULL) { if(t->type == cdata->info) { type_valid = true; break; } t = t->next; } if(!type_valid) { return SWIG_TypeError; } } *ptr = cdata->swigCObject; if(flags & SWIG_POINTER_DISOWN) { cdata->swigCMemOwn = false; } return SWIG_OK; } SWIGRUNTIME int SWIG_JSC_ConvertPtr(JSContextRef context, JSValueRef valRef, void** ptr, swig_type_info *info, int flags) { JSObjectRef objRef; /* special case: JavaScript null => C NULL pointer */ if(JSValueIsNull(context, valRef)) { *ptr=0; return (flags & SWIG_POINTER_NO_NULL) ? SWIG_NullReferenceError : SWIG_OK; } if(!JSValueIsObject(context, valRef)) { return SWIG_TypeError; } objRef = JSValueToObject(context, valRef, NULL); if(objRef == NULL) { return SWIG_ERROR; } return SWIG_JSC_ConvertInstancePtr(context, objRef, ptr, info, flags); } SWIGRUNTIME JSObjectRef SWIG_JSC_NewPointerObj(JSContextRef context, void *ptr, swig_type_info *info, int flags) { JSClassRef classRef; JSObjectRef result; SwigPrivData *cdata; if (ptr == NULL) { // HACK: it is not possible to use JSValueToObject (causing seg-fault) // This static cast turned out to be a workaround // In future, we should change the interface of this method // to return JSValueRef instead of JSObjectRef. return (JSObjectRef) JSValueMakeNull(context); } if(info->clientdata == NULL) { classRef = _SwigObject_classRef; } else { classRef = (JSClassRef) info->clientdata; } result = JSObjectMake(context, classRef, NULL); cdata = (SwigPrivData*) malloc(sizeof(SwigPrivData)); cdata->swigCObject = ptr; cdata->swigCMemOwn = (flags & SWIG_POINTER_OWN) ? 1 : 0; cdata->info = info; JSObjectSetPrivate(result, cdata); return result; } #define SWIG_ConvertPtr(obj, ptr, info, flags) SWIG_JSC_ConvertPtr(context, obj, ptr, info, flags) #define SWIG_NewPointerObj(ptr, info, flags) SWIG_JSC_NewPointerObj(context, ptr, info, flags) #define SWIG_ConvertInstance(obj, pptr, type, flags) SWIG_JSC_ConvertInstancePtr(context, obj, pptr, type, flags) #define SWIG_NewInstanceObj(thisvalue, type, flags) SWIG_JSC_NewPointerObj(context, thisvalue, type, flags) #define SWIG_ConvertFunctionPtr(obj, pptr, type) SWIG_JSC_ConvertPtr(context, obj, pptr, type, 0) #define SWIG_NewFunctionPtrObj(ptr, type) SWIG_JSC_NewPointerObj(context, ptr, type, 0) /* ---------------------------------------------------------------------------- * A class for packed data * * ---------------------------------------------------------------------------*/ typedef struct { void *data; size_t size; swig_type_info *type; } SwigPackedData; SWIGRUNTIME JSStaticValue _SwigPackedData_values[] = { { 0, 0, 0, 0 } }; SWIGRUNTIME JSStaticFunction _SwigPackedData_functions[] = { { 0, 0, 0 } }; SWIGRUNTIME JSClassDefinition _SwigPackedData_objectDefinition; SWIGRUNTIME JSClassRef _SwigPackedData_classRef; SWIGRUNTIMEINLINE int SwigJSCPacked_Check(JSContextRef context, JSValueRef valRef) { return JSValueIsObjectOfClass(context, valRef, _SwigPackedData_classRef); } SWIGRUNTIME swig_type_info* SwigJSCPacked_UnpackData(JSContextRef context, JSValueRef valRef, void *ptr, size_t size) { if (SwigJSCPacked_Check(context, valRef)) { JSObjectRef objRef = JSValueToObject(context, valRef, NULL); SwigPackedData *sobj = (SwigPackedData *) JSObjectGetPrivate(objRef); if (sobj->size != size) return 0; memcpy(ptr, sobj->data, size); return sobj->type; } else { return 0; } } SWIGRUNTIME int SWIG_JSC_ConvertPacked(JSContextRef context, JSValueRef valRef, void *ptr, size_t sz, swig_type_info *ty) { swig_type_info *to = SwigJSCPacked_UnpackData(context, valRef, ptr, sz); if (!to) return SWIG_ERROR; if (ty) { if (to != ty) { /* check type cast? */ swig_cast_info *tc = SWIG_TypeCheck(to->name,ty); if (!tc) return SWIG_ERROR; } } return SWIG_OK; } SWIGRUNTIME JSValueRef SWIG_JSC_NewPackedObj(JSContextRef context, void *data, size_t size, swig_type_info *type) { JSClassRef classRef = _SwigObject_classRef; JSObjectRef result = JSObjectMake(context, classRef, NULL); SwigPackedData* cdata = (SwigPackedData*) malloc(sizeof(SwigPackedData)); cdata->data = data; cdata->size = size; cdata->type = type; JSObjectSetPrivate(result, cdata); return result; } /* SwigPackedData wrappers */ SWIGRUNTIME void _wrap_SwigPackedData_delete(JSObjectRef obj) { SwigPackedData* cdata = (SwigPackedData*) JSObjectGetPrivate(obj); if (cdata) { free(cdata->data); } } /* for C++ member pointers, ie, member methods */ #define SWIG_ConvertMember(obj, ptr, sz, ty) SWIG_JSC_ConvertPacked(context, obj, ptr, sz, ty) #define SWIG_NewMemberObj(ptr, sz, type) SWIG_JSC_NewPackedObj(context, ptr, sz, type) /* --------------------------------------------------------------------------- * Support for IN/OUTPUT typemaps (see Lib/typemaps/inoutlist.swg) * * ---------------------------------------------------------------------------*/ SWIGRUNTIME unsigned int SWIGJSC_ArrayLength(JSContextRef context, JSObjectRef arr) { static JSStringRef LENGTH = 0; JSValueRef exception = NULL; JSValueRef js_length; double length; if (LENGTH == 0) { LENGTH = JSStringCreateWithUTF8CString("length"); } js_length = JSObjectGetProperty(context, arr, LENGTH, &exception); if (exception == 0 && JSValueIsNumber(context, js_length)) { length = JSValueToNumber(context, js_length, 0); return (unsigned int) length; } else { return 0; } } SWIGRUNTIME JSValueRef SWIGJSC_AppendOutput(JSContextRef context, JSValueRef value, JSValueRef obj) { JSObjectRef arr; unsigned int length; if (JSValueIsUndefined(context, value)) { arr = JSObjectMakeArray(context, 0, 0, 0); } else { arr = JSValueToObject(context, value, 0); } length = SWIGJSC_ArrayLength(context, arr); JSObjectSetPropertyAtIndex(context, arr, length, obj, 0); return arr; } swig-4.0.1/Lib/javascript/jsc/std_vector.i0000644000175000017500000000574713527063513020346 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_vector.i * ----------------------------------------------------------------------------- */ %include %{ #include #include %} namespace std { template class vector { public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef T value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; vector(); vector(size_type n); vector(const vector& other); size_type size() const; size_type capacity() const; void reserve(size_type n); %rename(isEmpty) empty; bool empty() const; void clear(); %rename(add) push_back; void push_back(const value_type& x); %extend { const_reference get(int i) throw (std::out_of_range) { int size = int(self->size()); if (i>=0 && isize()); if (i>=0 && i class vector { public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef bool value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef bool const_reference; vector(); vector(size_type n); vector(const vector& other); size_type size() const; size_type capacity() const; void reserve(size_type n); %rename(isEmpty) empty; bool empty() const; void clear(); %rename(add) push_back; void push_back(const value_type& x); %extend { bool get(int i) throw (std::out_of_range) { int size = int(self->size()); if (i>=0 && isize()); if (i>=0 && iswigCMemOwn) { free (($jstype)t->swigCObject); } JSObjectSetPrivate(thisObject, NULL); free(t); } } %} /* ----------------------------------------------------------------------------- * js_dtor: template for a destructor wrapper * - $jsmangledname: mangled class name * - $jstype: class type * - ${destructor_action}: The custom destructor action to invoke. * ----------------------------------------------------------------------------- */ %fragment ("js_dtoroverride", "templates") %{ static void $jswrapper(JSObjectRef thisObject) { SwigPrivData* t = (SwigPrivData*) JSObjectGetPrivate(thisObject); if(t) { if (t->swigCMemOwn) { $jstype arg1 = ($jstype)t->swigCObject; ${destructor_action} } /* remove the private data to make sure that it isn't accessed elsewhere */ JSObjectSetPrivate(thisObject, NULL); free(t); } } %} /* ----------------------------------------------------------------------------- * js_getter: template for getter function wrappers * - $jswrapper: wrapper function name * - $jslocals: locals part of wrapper * - $jscode: code part of wrapper * ----------------------------------------------------------------------------- */ %fragment ("js_getter", "templates") %{ static JSValueRef $jswrapper(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception) { $jslocals JSValueRef jsresult; $jscode return jsresult; goto fail; fail: return JSValueMakeUndefined(context); } %} /* ----------------------------------------------------------------------------- * js_setter: template for setter function wrappers * - $jswrapper: wrapper function name * - $jslocals: locals part of wrapper * - $jscode: code part of wrapper * ----------------------------------------------------------------------------- */ %fragment ("js_setter", "templates") %{ static bool $jswrapper(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef value, JSValueRef* exception) { $jslocals $jscode return true; goto fail; fail: return false; } %} /* ----------------------------------------------------------------------------- * js_function: template for function wrappers * - $jswrapper: wrapper function name * - $jslocals: locals part of wrapper * - $jscode: code part of wrapper * ----------------------------------------------------------------------------- */ %fragment ("js_function", "templates") %{ static JSValueRef $jswrapper(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argc, const JSValueRef argv[], JSValueRef* exception) { $jslocals JSValueRef jsresult; if(argc != $jsargcount) SWIG_exception_fail(SWIG_ERROR, "Illegal number of arguments for $jswrapper."); $jscode return jsresult; goto fail; fail: return JSValueMakeUndefined(context); } %} /* ----------------------------------------------------------------------------- * js_function_dispatcher: template for a function dispatcher for overloaded functions * - $jswrapper: wrapper function name * - $jsname: name of the wrapped function * - $jslocals: locals part of wrapper * - $jscode: code part of wrapper * ----------------------------------------------------------------------------- */ %fragment ("js_function_dispatcher", "templates") %{ static JSValueRef $jswrapper(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argc, const JSValueRef argv[], JSValueRef* exception) { $jslocals JSValueRef jsresult; int res; $jscode SWIG_exception_fail(SWIG_ERROR, "Illegal arguments for function $jsname."); return jsresult; goto fail; fail: return JSValueMakeUndefined(context); } %} /* ----------------------------------------------------------------------------- * js_overloaded_function: template for a overloaded function * - $jswrapper: wrapper function name * - $jslocals: locals part of wrapper * - $jscode: code part of wrapper * ----------------------------------------------------------------------------- */ %fragment ("js_overloaded_function", "templates") %{ static int $jswrapper(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argc, const JSValueRef argv[], JSValueRef* exception, JSValueRef* p_result) { $jslocals JSValueRef jsresult; if(argc != $jsargcount) SWIG_exception_fail(SWIG_ERROR, "Illegal number of arguments for $jswrapper."); $jscode *p_result = jsresult; return SWIG_OK; goto fail; fail: return SWIG_TypeError; } %} /* ----------------------------------------------------------------------------- * js_function_dispatch_case: template for a case used in the function dispatcher * - $jswrapper: wrapper function name * - $jsargcount: number of arguments of overloaded function * - $jscode: code part of wrapper * ----------------------------------------------------------------------------- */ %fragment ("js_function_dispatch_case", "templates") %{ if(argc == $jsargcount) { res = $jswrapper(context, function, thisObject, argc, argv, exception, &jsresult); if(res == SWIG_OK) { *exception = 0; return jsresult; } } %} /* ----------------------------------------------------------------------------- * jsc_variable_declaration: template for a variable table entry * - $jsname: name of the variable * - $jsgetter: wrapper of getter function * - $jssetter: wrapper of setter function * ----------------------------------------------------------------------------- */ %fragment ("jsc_variable_declaration", "templates") %{ {"$jsname", $jsgetter, $jssetter, kJSPropertyAttributeNone}, %} /* ----------------------------------------------------------------------------- * jsc_function_declaration: template for a function table entry * - $jsname: name of the variable * - $jswrapper: wrapper function * ----------------------------------------------------------------------------- */ %fragment ("jsc_function_declaration", "templates") %{ {"$jsname", $jswrapper, kJSPropertyAttributeNone}, %} /* ----------------------------------------------------------------------------- * jsc_classtemplate_declaration: template for a namespace declaration * - $jsmangledname: mangled class name * ----------------------------------------------------------------------------- */ %fragment ("jsc_class_declaration", "templates") %{ static JSClassDefinition $jsmangledname_classDefinition; static JSClassDefinition $jsmangledname_objectDefinition; static JSClassRef $jsmangledname_classRef; %} /* ----------------------------------------------------------------------------- * jsc_class_tables: template for a namespace declaration * - $jsmangledname: mangled class name * - $jsstaticclassvariables: list of static variable entries * - $jsstaticclassfunctions: list of static function entries * - $jsclassvariables: list of member variable entries * - $jsclassfunctions: list of member function entries * ----------------------------------------------------------------------------- */ %fragment ("jsc_class_tables", "templates") %{ static JSStaticValue $jsmangledname_staticValues[] = { $jsstaticclassvariables { 0, 0, 0, 0 } }; static JSStaticFunction $jsmangledname_staticFunctions[] = { $jsstaticclassfunctions { 0, 0, 0 } }; static JSStaticValue $jsmangledname_values[] = { $jsclassvariables { 0, 0, 0, 0 } }; static JSStaticFunction $jsmangledname_functions[] = { $jsclassfunctions { 0, 0, 0 } }; %} /* ----------------------------------------------------------------------------- * jsc_define_class_template: template for defining a class template * - $jsmangledname: mangled class name * - $jsmangledtype: mangled class type * - $jsctor: wrapper of ctor * - $jsbaseclass: mangled name of base class * ----------------------------------------------------------------------------- */ %fragment ("jsc_class_definition", "templates") %{ $jsmangledname_classDefinition.staticFunctions = $jsmangledname_staticFunctions; $jsmangledname_classDefinition.staticValues = $jsmangledname_staticValues; $jsmangledname_classDefinition.callAsConstructor = $jsctor; $jsmangledname_objectDefinition.finalize = $jsdtor; $jsmangledname_objectDefinition.staticValues = $jsmangledname_values; $jsmangledname_objectDefinition.staticFunctions = $jsmangledname_functions; $jsclass_inheritance $jsmangledname_classRef = JSClassCreate(&$jsmangledname_objectDefinition); SWIGTYPE_$jsmangledtype->clientdata = $jsmangledname_classRef; %} %fragment ("jsc_class_inherit", templates) %{ if (SWIGTYPE_p$jsbaseclassmangled != NULL) { $jsmangledname_objectDefinition.parentClass = (JSClassRef) SWIGTYPE_p$jsbaseclassmangled->clientdata; } %} %fragment ("jsc_class_noinherit", templates) %{ $jsmangledname_objectDefinition.parentClass = _SwigObject_classRef; %} /* ----------------------------------------------------------------------------- * jsc_register_class: template for registration of a class * - $jsname: class name * - $jsmangledname: mangled class name * - $jsnspace: mangled name of namespace * ----------------------------------------------------------------------------- */ %fragment ("jsc_class_registration", "templates") %{ JS_registerClass(context, $jsnspace_object, "$jsname", &$jsmangledname_classDefinition); %} /* ----------------------------------------------------------------------------- * jsc_nspace_declaration: template for a namespace declaration * - $jsnspace: mangled name of the namespace * - $jsglobalvariables: list of variable entries * - $jsglobalfunctions: list of function entries * ----------------------------------------------------------------------------- */ %fragment ("jsc_nspace_declaration", "templates") %{ static JSStaticValue $jsnspace_values[] = { $jsglobalvariables { 0, 0, 0, 0 } }; static JSStaticFunction $jsnspace_functions[] = { $jsglobalfunctions { 0, 0, 0 } }; static JSClassDefinition $jsnspace_classDefinition; static JSObjectRef $jsmangledname_object; %} /* ----------------------------------------------------------------------------- * jsc_nspace_definition: template for definition of a namespace object * - $jsmangledname: mangled name of namespace * ----------------------------------------------------------------------------- */ %fragment ("jsc_nspace_definition", "templates") %{ $jsmangledname_classDefinition.staticFunctions = $jsmangledname_functions; $jsmangledname_classDefinition.staticValues = $jsmangledname_values; $jsmangledname_object = JSObjectMake(context, JSClassCreate(&$jsmangledname_classDefinition), NULL); %} /* ----------------------------------------------------------------------------- * jsc_nspace_registration: template for registration of a namespace object * - $jsname: name of namespace * - $jsmangledname: mangled name of namespace * - $jsparent: mangled name of parent namespace * ----------------------------------------------------------------------------- */ %fragment ("jsc_nspace_registration", "templates") %{ JS_registerNamespace(context, $jsmangledname_object, $jsparent_object, "$jsname"); %} swig-4.0.1/Lib/javascript/jsc/javascriptkw.swg0000644000175000017500000000176713527063513021250 0ustar williamwilliam#ifndef JAVASCRIPT_JAVASCRIPTKW_SWG_ #define JAVASCRIPT_JAVASCRIPTKW_SWG_ /* Warnings for Java keywords */ #define JAVASCRIPTKW(x) %keywordwarn("'" `x` "' is a javascript keyword, renaming to '_"`x`"'",rename="_%s") `x` /* Taken from https://developer.mozilla.org/En/Core_JavaScript_1.5_Reference/Reserved_Words */ JAVASCRIPTKW(break); JAVASCRIPTKW(case); JAVASCRIPTKW(catch); JAVASCRIPTKW(continue); JAVASCRIPTKW(default); JAVASCRIPTKW(delete); JAVASCRIPTKW(do); JAVASCRIPTKW(else); JAVASCRIPTKW(finally); JAVASCRIPTKW(for); JAVASCRIPTKW(function); JAVASCRIPTKW(if); JAVASCRIPTKW(in); JAVASCRIPTKW(instanceof); JAVASCRIPTKW(new); JAVASCRIPTKW(return); JAVASCRIPTKW(switch); JAVASCRIPTKW(this); JAVASCRIPTKW(throw); JAVASCRIPTKW(try); JAVASCRIPTKW(typeof); JAVASCRIPTKW(var); JAVASCRIPTKW(void); JAVASCRIPTKW(while); JAVASCRIPTKW(with); /* others bad names if any*/ // for example %namewarn("321:clone() is a javascript bad method name") *::clone(); #undef JAVASCRIPTKW #endif //JAVASCRIPT_JAVASCRIPTKW_SWG_ swig-4.0.1/Lib/javascript/jsc/ccomplex.i0000644000175000017500000000140313527063513017765 0ustar williamwilliam/* ----------------------------------------------------------------------------- * ccomplex.i * * C complex typemaps * ISO C99: 7.3 Complex arithmetic * ----------------------------------------------------------------------------- */ %include %{ #include %} /* C complex constructor */ #define CCplxConst(r, i) ((r) + I*(i)) %swig_cplxflt_convn(float complex, CCplxConst, creal, cimag); %swig_cplxdbl_convn(double complex, CCplxConst, creal, cimag); %swig_cplxdbl_convn(complex, CCplxConst, creal, cimag); /* declaring the typemaps */ %typemaps_primitive(SWIG_TYPECHECK_CPLXFLT, float complex); %typemaps_primitive(SWIG_TYPECHECK_CPLXDBL, double complex); %typemaps_primitive(SWIG_TYPECHECK_CPLXDBL, complex); swig-4.0.1/Lib/javascript/jsc/javascripttypemaps.swg0000644000175000017500000000367413527063513022470 0ustar williamwilliam/* ------------------------------------------------------------ * Typemap specializations for Javascript * ------------------------------------------------------------ */ /* ------------------------------------------------------------ * Fragment section * ------------------------------------------------------------ */ /* These macros are necessary to provide an extra parameter to SWIG_AsVal_dec functions (JSContextRef context). They must be defined before including `typemaps/fragments.swg` */ #define SWIG_FROM_DECL_ARGS SWIG_JSC_FROM_DECL_ARGS #define SWIG_FROM_CALL_ARGS SWIG_JSC_FROM_CALL_ARGS #define SWIG_AS_DECL_ARGS SWIG_JSC_AS_DECL_ARGS #define SWIG_AS_CALL_ARGS SWIG_JSC_AS_CALL_ARGS /* Include fundamental fragemt definitions */ %include /* Look for user fragments file. */ %include /* Javascript fragments for fundamental types */ %include /* Javascript fragments for char* strings */ %include /* ------------------------------------------------------------ * Unified typemap section * ------------------------------------------------------------ */ #define SWIG_Object JSValueRef #define VOID_Object JSValueMakeUndefined(context) /* append output */ #define SWIG_AppendOutput(result, obj) SWIGJSC_AppendOutput(context, result, obj) /* set constant */ #define SWIG_SetConstant(name, obj) /* raise */ #define SWIG_Raise(obj, type, desc) SWIG_Javascript_Raise(context, exception, type) %insert("runtime") %{ #define SWIG_JSC_FROM_DECL_ARGS(arg1) (JSContextRef context, arg1) #define SWIG_JSC_FROM_CALL_ARGS(arg1) (context, arg1) #define SWIG_JSC_AS_DECL_ARGS(arg1, arg2) (JSContextRef context, arg1, arg2) #define SWIG_JSC_AS_CALL_ARGS(arg1, arg2) (context, arg1, arg2) %} /* Include the unified typemap library */ %include swig-4.0.1/Lib/javascript/jsc/std_common.i0000644000175000017500000000014613527063513020320 0ustar williamwilliam%include %apply size_t { std::size_t }; %apply const size_t& { const std::size_t& }; swig-4.0.1/Lib/javascript/jsc/std_except.i0000644000175000017500000000004313527063513020314 0ustar williamwilliam%include swig-4.0.1/Lib/javascript/jsc/complex.i0000644000175000017500000000012013527063513017615 0ustar williamwilliam#ifdef __cplusplus %include #else %include #endif swig-4.0.1/Lib/javascript/jsc/typemaps.i0000644000175000017500000001047613527063513020027 0ustar williamwilliam/* ----------------------------------------------------------------------------- * typemaps.i * * Pointer handling * These mappings provide support for input/output arguments and common * uses for C/C++ pointers. * ----------------------------------------------------------------------------- */ // INPUT typemaps. // These remap a C pointer to be an "INPUT" value which is passed by value // instead of reference. /* The following methods can be applied to turn a pointer into a simple "input" value. That is, instead of passing a pointer to an object, you would use a real value instead. int *INPUT short *INPUT long *INPUT long long *INPUT unsigned int *INPUT unsigned short *INPUT unsigned long *INPUT unsigned long long *INPUT unsigned char *INPUT bool *INPUT float *INPUT double *INPUT To use these, suppose you had a C function like this : double fadd(double *a, double *b) { return *a+*b; } You could wrap it with SWIG as follows : %include double fadd(double *INPUT, double *INPUT); or you can use the %apply directive : %include %apply double *INPUT { double *a, double *b }; double fadd(double *a, double *b); */ // OUTPUT typemaps. These typemaps are used for parameters that // are output only. The output value is appended to the result as // a list element. /* The following methods can be applied to turn a pointer into an "output" value. When calling a function, no input value would be given for a parameter, but an output value would be returned. In the case of multiple output values, they are returned in the form of a Python tuple. int *OUTPUT short *OUTPUT long *OUTPUT long long *OUTPUT unsigned int *OUTPUT unsigned short *OUTPUT unsigned long *OUTPUT unsigned long long *OUTPUT unsigned char *OUTPUT bool *OUTPUT float *OUTPUT double *OUTPUT For example, suppose you were trying to wrap the modf() function in the C math library which splits x into integral and fractional parts (and returns the integer part in one of its parameters).K: double modf(double x, double *ip); You could wrap it with SWIG as follows : %include double modf(double x, double *OUTPUT); or you can use the %apply directive : %include %apply double *OUTPUT { double *ip }; double modf(double x, double *ip); The Python output of the function would be a tuple containing both output values. */ // INOUT // Mappings for an argument that is both an input and output // parameter /* The following methods can be applied to make a function parameter both an input and output value. This combines the behavior of both the "INPUT" and "OUTPUT" methods described earlier. Output values are returned in the form of a Python tuple. int *INOUT short *INOUT long *INOUT long long *INOUT unsigned int *INOUT unsigned short *INOUT unsigned long *INOUT unsigned long long *INOUT unsigned char *INOUT bool *INOUT float *INOUT double *INOUT For example, suppose you were trying to wrap the following function : void neg(double *x) { *x = -(*x); } You could wrap it with SWIG as follows : %include void neg(double *INOUT); or you can use the %apply directive : %include %apply double *INOUT { double *x }; void neg(double *x); Unlike C, this mapping does not directly modify the input value (since this makes no sense in Python). Rather, the modified input value shows up as the return value of the function. Thus, to apply this function to a Python variable you might do this : x = neg(x) Note : previous versions of SWIG used the symbol 'BOTH' to mark input/output arguments. This is still supported, but will be slowly phased out in future releases. */ %include swig-4.0.1/Lib/javascript/jsc/javascriptstrings.swg0000644000175000017500000001350013527063513022304 0ustar williamwilliam/* ------------------------------------------------------------ * utility methods for char strings * ------------------------------------------------------------ */ %fragment("SWIG_AsCharPtrAndSize","header",fragment="SWIG_pchar_descriptor") { SWIGINTERN int SWIG_JSC_AsCharPtrAndSize(JSContextRef context, JSValueRef valRef, char** cptr, size_t* psize, int *alloc) { if(JSValueIsString(context, valRef)) { JSStringRef js_str = JSValueToStringCopy(context, valRef, NULL); size_t len = JSStringGetMaximumUTF8CStringSize(js_str); char* cstr = (char*) %new_array(len, char); /* JSStringGetUTF8CString returns the length including 0-terminator */ len = JSStringGetUTF8CString(js_str, cstr, len); if(alloc) *alloc = SWIG_NEWOBJ; if(psize) *psize = len; if(cptr) *cptr = cstr; return SWIG_OK; } else { if(JSValueIsObject(context, valRef)) { JSObjectRef obj = JSValueToObject(context, valRef, NULL); // try if the object is a wrapped char[] swig_type_info* pchar_descriptor = SWIG_pchar_descriptor(); if (pchar_descriptor) { void* vptr = 0; if (SWIG_ConvertPtr(obj, &vptr, pchar_descriptor, 0) == SWIG_OK) { if (cptr) *cptr = (char *) vptr; if (psize) *psize = vptr ? (strlen((char *)vptr) + 1) : 0; if (alloc) *alloc = SWIG_OLDOBJ; return SWIG_OK; } } return SWIG_TypeError; } else { return SWIG_TypeError; } } } } %fragment("SWIG_FromCharPtrAndSize","header",fragment="SWIG_pchar_descriptor") { SWIGINTERNINLINE JSValueRef SWIG_JSC_FromCharPtrAndSize(JSContextRef context, const char* carray, size_t size) { if (carray) { if (size > INT_MAX) { // TODO: handle extra long strings //swig_type_info* pchar_descriptor = SWIG_pchar_descriptor(); //return pchar_descriptor ? // SWIG_InternalNewPointerObj(%const_cast(carray,char *), pchar_descriptor, 0) : SWIG_Py_Void(); return JSValueMakeUndefined(context); } else { JSStringRef jsstring; JSValueRef result; if(size < 2) { char c[2]; int i; for(i=0;i %include // ------------------------------------------------------------------------ // std::pair // ------------------------------------------------------------------------ %{ #include %} namespace std { template struct pair { typedef T first_type; typedef U second_type; pair(); pair(T first, U second); pair(const pair& other); template pair(const pair &other); T first; U second; }; // add specializations here } swig-4.0.1/Lib/javascript/jsc/stl.i0000644000175000017500000000044313527063513016760 0ustar williamwilliam/* ----------------------------------------------------------------------------- * stl.i * ----------------------------------------------------------------------------- */ %include %include %include %include %include swig-4.0.1/Lib/javascript/jsc/exception.i0000644000175000017500000000004213527063513020147 0ustar williamwilliam%include swig-4.0.1/Lib/javascript/jsc/javascriptfragments.swg0000644000175000017500000000105713527063513022605 0ustar williamwilliam/* Create a file with this name, 'javascriptfragments.swg', in your working directory and add all the %fragments you want to take precedence over the default ones defined by swig. For example, if you add: %fragment(SWIG_AsVal_frag(int),"header") { SWIGINTERNINLINE int SWIG_AsVal(int)(PyObject *obj, int *val) { ; } } this will replace the code used to retrieve an integer value for all the typemaps that need it, including: int, std::vector, std::list >, etc. */ swig-4.0.1/Lib/javascript/jsc/cdata.i0000644000175000017500000000003613527063513017230 0ustar williamwilliam%include swig-4.0.1/Lib/javascript/jsc/javascriptcomplex.swg0000644000175000017500000000721613527063513022271 0ustar williamwilliam/* Defines the As/From converters for double/float complex, you need to provide complex Type, the Name you want to use in the converters, the complex Constructor method, and the Real and Imag complex accessor methods. See the std_complex.i and ccomplex.i for concrete examples. */ /* the common from converter */ %define %swig_fromcplx_conv(Type, Real, Imag) %fragment(SWIG_From_frag(Type),"header", fragment=SWIG_From_frag(double)) { SWIGINTERNINLINE JSObjectRef SWIG_From_dec(Type)(%ifcplusplus(const Type&, Type) c) { JSValueRef vals[2]; vals[0] = SWIG_From(double)(Real(c)); vals[1] = SWIG_From(double)(Imag(c)); return JSObjectMakeArray(context, 2, vals, NULL); } } %enddef /* the double case */ %define %swig_cplxdbl_conv(Type, Constructor, Real, Imag) %fragment(SWIG_AsVal_frag(Type),"header", fragment=SWIG_AsVal_frag(double)) { SWIGINTERN int SWIG_AsVal_dec(Type) (JSValueRef o, Type* val) { if (JSValueIsObject(context, o)) { JSObjectRef array; JSValueRef exception, js_re, js_im; double re, im; int res; exception = 0; res = 0; array = JSValueToObject(context, o, &exception); if(exception != 0) return SWIG_TypeError; js_re = JSObjectGetPropertyAtIndex(context, array, 0, &exception); if(exception != 0) return SWIG_TypeError; js_im = JSObjectGetPropertyAtIndex(context, array, 1, &exception); if(exception != 0) return SWIG_TypeError; res = SWIG_AsVal(double)(js_re, &re); if(!SWIG_IsOK(res)) { return SWIG_TypeError; } res = SWIG_AsVal(double)(js_im, &im); if(!SWIG_IsOK(res)) { return SWIG_TypeError; } if (val) *val = Constructor(re, im); return SWIG_OK; } else { double d; int res = SWIG_AddCast(SWIG_AsVal(double)(o, &d)); if (SWIG_IsOK(res)) { if (val) *val = Constructor(d, 0.0); return res; } } return SWIG_TypeError; } } %swig_fromcplx_conv(Type, Real, Imag); %enddef /* the float case */ %define %swig_cplxflt_conv(Type, Constructor, Real, Imag) %fragment(SWIG_AsVal_frag(Type),"header", fragment=SWIG_AsVal_frag(float)) { SWIGINTERN int SWIG_AsVal_dec(Type)(JSValueRef o, Type *val) { if (JSValueIsObject(context, o)) { JSObjectRef array; JSValueRef exception, js_re, js_im; double re, im; int res; exception = 0; res = 0; array = JSValueToObject(context, o, &exception); if(exception != 0) return SWIG_TypeError; js_re = JSObjectGetPropertyAtIndex(context, array, 0, &exception); if(exception != 0) return SWIG_TypeError; js_im = JSObjectGetPropertyAtIndex(context, array, 1, &exception); if(exception != 0) return SWIG_TypeError; res = SWIG_AsVal(double)(js_re, &re); if(!SWIG_IsOK(res)) { return SWIG_TypeError; } res = SWIG_AsVal(double)(js_im, &im); if(!SWIG_IsOK(res)) { return SWIG_TypeError; } if ((-FLT_MAX <= re && re <= FLT_MAX) && (-FLT_MAX <= im && im <= FLT_MAX)) { if (val) *val = Constructor(%numeric_cast(re, float), %numeric_cast(im, float)); return SWIG_OK; } else { return SWIG_OverflowError; } } else { float re; int res = SWIG_AddCast(SWIG_AsVal(float)(o, &re)); if (SWIG_IsOK(res)) { if (val) *val = Constructor(re, 0.0); return res; } } return SWIG_TypeError; } } %swig_fromcplx_conv(Type, Real, Imag); %enddef #define %swig_cplxflt_convn(Type, Constructor, Real, Imag) \ %swig_cplxflt_conv(Type, Constructor, Real, Imag) #define %swig_cplxdbl_convn(Type, Constructor, Real, Imag) \ %swig_cplxdbl_conv(Type, Constructor, Real, Imag) swig-4.0.1/Lib/javascript/jsc/std_string.i0000644000175000017500000000004313527063513020332 0ustar williamwilliam%include swig-4.0.1/Lib/javascript/jsc/std_map.i0000644000175000017500000000505713527063513017613 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_map.i * * SWIG typemaps for std::map * ----------------------------------------------------------------------------- */ %include // ------------------------------------------------------------------------ // std::map // ------------------------------------------------------------------------ %{ #include #include #include %} // exported class namespace std { template > class map { // add typemaps here public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef K key_type; typedef T mapped_type; typedef std::pair< const K, T > value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; map(); map(const map& other); unsigned int size() const; bool empty() const; void clear(); %extend { const T& get(const K& key) throw (std::out_of_range) { std::map< K, T, C >::iterator i = self->find(key); if (i != self->end()) return i->second; else throw std::out_of_range("key not found"); } void set(const K& key, const T& x) { (*self)[key] = x; } void del(const K& key) throw (std::out_of_range) { std::map< K, T, C >::iterator i = self->find(key); if (i != self->end()) self->erase(i); else throw std::out_of_range("key not found"); } bool has_key(const K& key) { std::map< K, T, C >::iterator i = self->find(key); return i != self->end(); } } }; // Legacy macros (deprecated) %define specialize_std_map_on_key(K,CHECK,CONVERT_FROM,CONVERT_TO) #warning "specialize_std_map_on_key ignored - macro is deprecated and no longer necessary" %enddef %define specialize_std_map_on_value(T,CHECK,CONVERT_FROM,CONVERT_TO) #warning "specialize_std_map_on_value ignored - macro is deprecated and no longer necessary" %enddef %define specialize_std_map_on_both(K,CHECK_K,CONVERT_K_FROM,CONVERT_K_TO, T,CHECK_T,CONVERT_T_FROM,CONVERT_T_TO) #warning "specialize_std_map_on_both ignored - macro is deprecated and no longer necessary" %enddef } swig-4.0.1/Lib/javascript/jsc/arrays_javascript.i0000644000175000017500000000643113527063513021710 0ustar williamwilliam/* ----------------------------------------------------------------------------- * arrays_javascript.i * * These typemaps give more natural support for arrays. The typemaps are not efficient * as there is a lot of copying of the array values whenever the array is passed to C/C++ * from JavaScript and vice versa. The JavaScript array is expected to be the same size as the C array. * An exception is thrown if they are not. * * Example usage: * Wrapping: * * %include * %inline %{ * extern int FiddleSticks[3]; * %} * * Use from JavaScript like this: * * var fs = [10, 11, 12]; * example.FiddleSticks = fs; * fs = example.FiddleSticks; * ----------------------------------------------------------------------------- */ %fragment("SWIG_JSCGetIntProperty", "header", fragment=SWIG_AsVal_frag(int)) {} %fragment("SWIG_JSCGetNumberProperty", "header", fragment=SWIG_AsVal_frag(double)) {} %typemap(in, fragment="SWIG_JSCGetIntProperty") int[], int[ANY] (int length = 0, JSObjectRef array, JSValueRef jsvalue, int i = 0, int res = 0, $*1_ltype temp) { if (JSValueIsObject(context, $input)) { // Convert into Array array = JSValueToObject(context, $input, NULL); length = $1_dim0; $1 = ($*1_ltype *)malloc(sizeof($*1_ltype) * length); // Get each element from array for (i = 0; i < length; i++) { jsvalue = JSObjectGetPropertyAtIndex(context, array, i, NULL); // Get primitive value from JSObject res = SWIG_AsVal(int)(jsvalue, &temp); if (!SWIG_IsOK(res)) { SWIG_exception_fail(SWIG_ERROR, "Failed to convert $input to double"); } arg$argnum[i] = temp; } } else { SWIG_exception_fail(SWIG_ERROR, "$input is not JSObjectRef"); } } %typemap(freearg) int[], int[ANY] { free($1); } %typemap(out, fragment=SWIG_From_frag(int)) int[], int[ANY] (int length = 0, int i = 0) { length = $1_dim0; JSValueRef values[length]; for (i = 0; i < length; i++) { values[i] = SWIG_From(int)($1[i]); } $result = JSObjectMakeArray(context, length, values, NULL); } %typemap(in, fragment="SWIG_JSCGetNumberProperty") double[], double[ANY] (int length = 0, JSObjectRef array, JSValueRef jsvalue, int i = 0, int res = 0, $*1_ltype temp) { if (JSValueIsObject(context, $input)) { // Convert into Array array = JSValueToObject(context, $input, NULL); length = $1_dim0; $1 = ($*1_ltype *)malloc(sizeof($*1_ltype) * length); // Get each element from array for (i = 0; i < length; i++) { jsvalue = JSObjectGetPropertyAtIndex(context, array, i, NULL); // Get primitive value from JSObject res = SWIG_AsVal(double)(jsvalue, &temp); if (!SWIG_IsOK(res)) { SWIG_exception_fail(SWIG_ERROR, "Failed to convert $input to double"); } arg$argnum[i] = temp; } } else { SWIG_exception_fail(SWIG_ERROR, "$input is not JSObjectRef"); } } %typemap(freearg) double[], double[ANY] { free($1); } %typemap(out, fragment=SWIG_From_frag(double)) double[], double[ANY] (int length = 0, int i = 0) { length = $1_dim0; JSValueRef values[length]; for (i = 0; i < length; i++) { values[i] = SWIG_From(double)($1[i]); } $result = JSObjectMakeArray(context, length, values, NULL); } swig-4.0.1/Lib/java/0000755000175000017500000000000013527063513013777 5ustar williamwilliamswig-4.0.1/Lib/java/std_deque.i0000644000175000017500000000003413527063513016123 0ustar williamwilliam%include swig-4.0.1/Lib/java/javakw.swg0000644000175000017500000000236613527063513016013 0ustar williamwilliam#ifndef JAVA_JAVAKW_SWG_ #define JAVA_JAVAKW_SWG_ /* Warnings for Java keywords */ #define JAVAKW(x) %keywordwarn("'" `x` "' is a java keyword, renaming to '_"`x`"'",rename="_%s") `x` /* from http://java.sun.com/docs/books/tutorial/java/nutsandbolts/_keywords.html */ JAVAKW(abstract); JAVAKW(double); JAVAKW(int); JAVAKW(strictfp); JAVAKW(boolean); JAVAKW(else); JAVAKW(interface); JAVAKW(super); JAVAKW(break); JAVAKW(extends); JAVAKW(long); JAVAKW(switch); JAVAKW(byte); JAVAKW(final); JAVAKW(native); JAVAKW(synchronized); JAVAKW(case); JAVAKW(finally); JAVAKW(new); JAVAKW(this); JAVAKW(catch); JAVAKW(float); JAVAKW(package); JAVAKW(throw); JAVAKW(char); JAVAKW(for); JAVAKW(private); JAVAKW(throws); JAVAKW(class); JAVAKW(goto); JAVAKW(protected); JAVAKW(transient); JAVAKW(const); JAVAKW(if); JAVAKW(public); JAVAKW(try); JAVAKW(continue); JAVAKW(implements); JAVAKW(return); JAVAKW(void); JAVAKW(default); JAVAKW(import); JAVAKW(short); JAVAKW(volatile); JAVAKW(do); JAVAKW(instanceof); JAVAKW(static); JAVAKW(while); /* others bad names */ /* Note here that only *::clone() is bad, and *::clone(int) is ok */ %namewarn("321:clone() is a java bad method name") *::clone(); #undef JAVAKW #endif //JAVA_JAVAKW_SWG_ swig-4.0.1/Lib/java/director.swg0000644000175000017500000003732313527063513016344 0ustar williamwilliam/* ----------------------------------------------------------------------------- * director.swg * * This file contains support for director classes so that Java proxy * methods can be called from C++. * ----------------------------------------------------------------------------- */ #if defined(DEBUG_DIRECTOR_OWNED) || defined(DEBUG_DIRECTOR_EXCEPTION) || defined(DEBUG_DIRECTOR_THREAD_NAME) #include #endif #include #if defined(SWIG_JAVA_USE_THREAD_NAME) #if !defined(SWIG_JAVA_GET_THREAD_NAME) namespace Swig { SWIGINTERN int GetThreadName(char *name, size_t len); } #if defined(__linux__) #include SWIGINTERN int Swig::GetThreadName(char *name, size_t len) { (void)len; #if defined(PR_GET_NAME) return prctl(PR_GET_NAME, (unsigned long)name, 0, 0, 0); #else (void)name; return 1; #endif } #elif defined(__unix__) || defined(__APPLE__) #include SWIGINTERN int Swig::GetThreadName(char *name, size_t len) { return pthread_getname_np(pthread_self(), name, len); } #else SWIGINTERN int Swig::GetThreadName(char *name, size_t len) { (void)len; (void)name; return 1; } #endif #endif #endif namespace Swig { /* Java object wrapper */ class JObjectWrapper { public: JObjectWrapper() : jthis_(NULL), weak_global_(true) { } ~JObjectWrapper() { jthis_ = NULL; weak_global_ = true; } bool set(JNIEnv *jenv, jobject jobj, bool mem_own, bool weak_global) { if (!jthis_) { weak_global_ = weak_global || !mem_own; // hold as weak global if explicitly requested or not owned if (jobj) jthis_ = weak_global_ ? jenv->NewWeakGlobalRef(jobj) : jenv->NewGlobalRef(jobj); #if defined(DEBUG_DIRECTOR_OWNED) std::cout << "JObjectWrapper::set(" << jobj << ", " << (weak_global ? "weak_global" : "global_ref") << ") -> " << jthis_ << std::endl; #endif return true; } else { #if defined(DEBUG_DIRECTOR_OWNED) std::cout << "JObjectWrapper::set(" << jobj << ", " << (weak_global ? "weak_global" : "global_ref") << ") -> already set" << std::endl; #endif return false; } } jobject get(JNIEnv *jenv) const { #if defined(DEBUG_DIRECTOR_OWNED) std::cout << "JObjectWrapper::get("; if (jthis_) std::cout << jthis_; else std::cout << "null"; std::cout << ") -> return new local ref" << std::endl; #endif return (jthis_ ? jenv->NewLocalRef(jthis_) : jthis_); } void release(JNIEnv *jenv) { #if defined(DEBUG_DIRECTOR_OWNED) std::cout << "JObjectWrapper::release(" << jthis_ << "): " << (weak_global_ ? "weak global ref" : "global ref") << std::endl; #endif if (jthis_) { if (weak_global_) { if (jenv->IsSameObject(jthis_, NULL) == JNI_FALSE) jenv->DeleteWeakGlobalRef((jweak)jthis_); } else jenv->DeleteGlobalRef(jthis_); } jthis_ = NULL; weak_global_ = true; } /* Only call peek if you know what you are doing wrt to weak/global references */ jobject peek() { return jthis_; } /* Java proxy releases ownership of C++ object, C++ object is now responsible for destruction (creates NewGlobalRef to pin Java proxy) */ void java_change_ownership(JNIEnv *jenv, jobject jself, bool take_or_release) { if (take_or_release) { /* Java takes ownership of C++ object's lifetime. */ if (!weak_global_) { jenv->DeleteGlobalRef(jthis_); jthis_ = jenv->NewWeakGlobalRef(jself); weak_global_ = true; } } else { /* Java releases ownership of C++ object's lifetime */ if (weak_global_) { jenv->DeleteWeakGlobalRef((jweak)jthis_); jthis_ = jenv->NewGlobalRef(jself); weak_global_ = false; } } } private: /* pointer to Java object */ jobject jthis_; /* Local or global reference flag */ bool weak_global_; }; /* Local JNI reference deleter */ class LocalRefGuard { JNIEnv *jenv_; jobject jobj_; // non-copyable LocalRefGuard(const LocalRefGuard &); LocalRefGuard &operator=(const LocalRefGuard &); public: LocalRefGuard(JNIEnv *jenv, jobject jobj): jenv_(jenv), jobj_(jobj) {} ~LocalRefGuard() { if (jobj_) jenv_->DeleteLocalRef(jobj_); } }; /* director base class */ class Director { /* pointer to Java virtual machine */ JavaVM *swig_jvm_; protected: #if defined (_MSC_VER) && (_MSC_VER<1300) class JNIEnvWrapper; friend class JNIEnvWrapper; #endif /* Utility class for managing the JNI environment */ class JNIEnvWrapper { const Director *director_; JNIEnv *jenv_; int env_status; public: JNIEnvWrapper(const Director *director) : director_(director), jenv_(0), env_status(0) { #if defined(__ANDROID__) JNIEnv **jenv = &jenv_; #else void **jenv = (void **)&jenv_; #endif env_status = director_->swig_jvm_->GetEnv((void **)&jenv_, JNI_VERSION_1_2); JavaVMAttachArgs args; args.version = JNI_VERSION_1_2; args.group = NULL; args.name = NULL; #if defined(SWIG_JAVA_USE_THREAD_NAME) char thread_name[64]; // MAX_TASK_COMM_LEN=16 is hard-coded in the Linux kernel and MacOS has MAXTHREADNAMESIZE=64. if (Swig::GetThreadName(thread_name, sizeof(thread_name)) == 0) { args.name = thread_name; #if defined(DEBUG_DIRECTOR_THREAD_NAME) std::cout << "JNIEnvWrapper: thread name: " << thread_name << std::endl; } else { std::cout << "JNIEnvWrapper: Couldn't set Java thread name" << std::endl; #endif } #endif #if defined(SWIG_JAVA_ATTACH_CURRENT_THREAD_AS_DAEMON) // Attach a daemon thread to the JVM. Useful when the JVM should not wait for // the thread to exit upon shutdown. Only for jdk-1.4 and later. director_->swig_jvm_->AttachCurrentThreadAsDaemon(jenv, &args); #else director_->swig_jvm_->AttachCurrentThread(jenv, &args); #endif } ~JNIEnvWrapper() { #if !defined(SWIG_JAVA_NO_DETACH_CURRENT_THREAD) // Some JVMs, eg jdk-1.4.2 and lower on Solaris have a bug and crash with the DetachCurrentThread call. // However, without this call, the JVM hangs on exit when the thread was not created by the JVM and creates a memory leak. if (env_status == JNI_EDETACHED) director_->swig_jvm_->DetachCurrentThread(); #endif } JNIEnv *getJNIEnv() const { return jenv_; } }; /* Java object wrapper */ JObjectWrapper swig_self_; /* Disconnect director from Java object */ void swig_disconnect_director_self(const char *disconn_method) { JNIEnvWrapper jnienv(this) ; JNIEnv *jenv = jnienv.getJNIEnv() ; jobject jobj = swig_self_.get(jenv); LocalRefGuard ref_deleter(jenv, jobj); #if defined(DEBUG_DIRECTOR_OWNED) std::cout << "Swig::Director::disconnect_director_self(" << jobj << ")" << std::endl; #endif if (jobj && jenv->IsSameObject(jobj, NULL) == JNI_FALSE) { jmethodID disconn_meth = jenv->GetMethodID(jenv->GetObjectClass(jobj), disconn_method, "()V"); if (disconn_meth) { #if defined(DEBUG_DIRECTOR_OWNED) std::cout << "Swig::Director::disconnect_director_self upcall to " << disconn_method << std::endl; #endif jenv->CallVoidMethod(jobj, disconn_meth); } } } public: Director(JNIEnv *jenv) : swig_jvm_((JavaVM *) NULL), swig_self_() { /* Acquire the Java VM pointer */ jenv->GetJavaVM(&swig_jvm_); } virtual ~Director() { JNIEnvWrapper jnienv(this) ; JNIEnv *jenv = jnienv.getJNIEnv() ; swig_self_.release(jenv); } bool swig_set_self(JNIEnv *jenv, jobject jself, bool mem_own, bool weak_global) { return swig_self_.set(jenv, jself, mem_own, weak_global); } jobject swig_get_self(JNIEnv *jenv) const { return swig_self_.get(jenv); } // Change C++ object's ownership, relative to Java void swig_java_change_ownership(JNIEnv *jenv, jobject jself, bool take_or_release) { swig_self_.java_change_ownership(jenv, jself, take_or_release); } }; // Zero initialized bool array template class BoolArray { bool array_[N]; public: BoolArray() { memset(array_, 0, sizeof(array_)); } bool& operator[](size_t n) { return array_[n]; } bool operator[](size_t n) const { return array_[n]; } }; // Utility classes and functions for exception handling. // Simple holder for a Java string during exception handling, providing access to a c-style string class JavaString { public: JavaString(JNIEnv *jenv, jstring jstr) : jenv_(jenv), jstr_(jstr), cstr_(0) { if (jenv_ && jstr_) cstr_ = (const char *) jenv_->GetStringUTFChars(jstr_, NULL); } ~JavaString() { if (jenv_ && jstr_ && cstr_) jenv_->ReleaseStringUTFChars(jstr_, cstr_); } const char *c_str(const char *null_string = "null JavaString") const { return cstr_ ? cstr_ : null_string; } private: // non-copyable JavaString(const JavaString &); JavaString &operator=(const JavaString &); JNIEnv *jenv_; jstring jstr_; const char *cstr_; }; // Helper class to extract the exception message from a Java throwable class JavaExceptionMessage { public: JavaExceptionMessage(JNIEnv *jenv, jthrowable throwable) : message_(jenv, exceptionMessageFromThrowable(jenv, throwable)) { } // Return a C string of the exception message in the jthrowable passed in the constructor // If no message is available, null_string is return instead const char *message(const char *null_string = "Could not get exception message in JavaExceptionMessage") const { return message_.c_str(null_string); } private: // non-copyable JavaExceptionMessage(const JavaExceptionMessage &); JavaExceptionMessage &operator=(const JavaExceptionMessage &); // Get exception message by calling Java method Throwable.getMessage() static jstring exceptionMessageFromThrowable(JNIEnv *jenv, jthrowable throwable) { jstring jmsg = NULL; if (jenv && throwable) { jenv->ExceptionClear(); // Cannot invoke methods with any pending exceptions jclass throwclz = jenv->GetObjectClass(throwable); if (throwclz) { // All Throwable classes have a getMessage() method, so call it to extract the exception message jmethodID getMessageMethodID = jenv->GetMethodID(throwclz, "getMessage", "()Ljava/lang/String;"); if (getMessageMethodID) jmsg = (jstring)jenv->CallObjectMethod(throwable, getMessageMethodID); } if (jmsg == NULL && jenv->ExceptionCheck()) jenv->ExceptionClear(); } return jmsg; } JavaString message_; }; // C++ Exception class for handling Java exceptions thrown during a director method Java upcall class DirectorException : public std::exception { public: // Construct exception from a Java throwable DirectorException(JNIEnv *jenv, jthrowable throwable) : jenv_(jenv), throwable_(throwable), classname_(0), msg_(0) { // Call Java method Object.getClass().getName() to obtain the throwable's class name (delimited by '/') if (jenv && throwable) { jenv->ExceptionClear(); // Cannot invoke methods with any pending exceptions jclass throwclz = jenv->GetObjectClass(throwable); if (throwclz) { jclass clzclz = jenv->GetObjectClass(throwclz); if (clzclz) { jmethodID getNameMethodID = jenv->GetMethodID(clzclz, "getName", "()Ljava/lang/String;"); if (getNameMethodID) { jstring jstr_classname = (jstring)(jenv->CallObjectMethod(throwclz, getNameMethodID)); // Copy strings, since there is no guarantee that jenv will be active when handled if (jstr_classname) { JavaString jsclassname(jenv, jstr_classname); const char *classname = jsclassname.c_str(0); if (classname) classname_ = copypath(classname); } } } } } JavaExceptionMessage exceptionmsg(jenv, throwable); msg_ = copystr(exceptionmsg.message(0)); } // More general constructor for handling as a java.lang.RuntimeException DirectorException(const char *msg) : jenv_(0), throwable_(0), classname_(0), msg_(msg ? copystr(msg) : 0) { } ~DirectorException() throw() { delete[] classname_; delete[] msg_; } const char *what() const throw() { return msg_ ? msg_ : "Unspecified DirectorException message"; } // Reconstruct and raise/throw the Java Exception that caused the DirectorException // Note that any error in the JNI exception handling results in a Java RuntimeException void throwException(JNIEnv *jenv) const { if (jenv) { if (jenv == jenv_ && throwable_) { // Throw original exception if not already pending jthrowable throwable = jenv->ExceptionOccurred(); if (throwable && jenv->IsSameObject(throwable, throwable_) == JNI_FALSE) { jenv->ExceptionClear(); throwable = 0; } if (!throwable) jenv->Throw(throwable_); } else { // Try and reconstruct original exception, but original stacktrace is not reconstructed jenv->ExceptionClear(); jmethodID ctorMethodID = 0; jclass throwableclass = 0; if (classname_) { throwableclass = jenv->FindClass(classname_); if (throwableclass) ctorMethodID = jenv->GetMethodID(throwableclass, "", "(Ljava/lang/String;)V"); } if (ctorMethodID) { jenv->ThrowNew(throwableclass, what()); } else { SWIG_JavaThrowException(jenv, SWIG_JavaRuntimeException, what()); } } } } // Deprecated - use throwException void raiseJavaException(JNIEnv *jenv) const { throwException(jenv); } // Create and throw the DirectorException static void raise(JNIEnv *jenv, jthrowable throwable) { throw DirectorException(jenv, throwable); } private: static char *copypath(const char *srcmsg) { char *target = copystr(srcmsg); for (char *c=target; *c; ++c) { if ('.' == *c) *c = '/'; } return target; } static char *copystr(const char *srcmsg) { char *target = 0; if (srcmsg) { size_t msglen = strlen(srcmsg) + 1; target = new char[msglen]; strncpy(target, srcmsg, msglen); } return target; } JNIEnv *jenv_; jthrowable throwable_; const char *classname_; const char *msg_; }; // Helper method to determine if a Java throwable matches a particular Java class type // Note side effect of clearing any pending exceptions SWIGINTERN bool ExceptionMatches(JNIEnv *jenv, jthrowable throwable, const char *classname) { bool matches = false; if (throwable && jenv && classname) { // Exceptions need to be cleared for correct behavior. // The caller of ExceptionMatches should restore pending exceptions if desired - // the caller already has the throwable. jenv->ExceptionClear(); jclass clz = jenv->FindClass(classname); if (clz) { jclass classclz = jenv->GetObjectClass(clz); jmethodID isInstanceMethodID = jenv->GetMethodID(classclz, "isInstance", "(Ljava/lang/Object;)Z"); if (isInstanceMethodID) { matches = jenv->CallBooleanMethod(clz, isInstanceMethodID, throwable) != 0; } } #if defined(DEBUG_DIRECTOR_EXCEPTION) if (jenv->ExceptionCheck()) { // Typically occurs when an invalid classname argument is passed resulting in a ClassNotFoundException JavaExceptionMessage exc(jenv, jenv->ExceptionOccurred()); std::cout << "Error: ExceptionMatches: class '" << classname << "' : " << exc.message() << std::endl; } #endif } return matches; } } swig-4.0.1/Lib/java/std_shared_ptr.i0000644000175000017500000000010413527063513017151 0ustar williamwilliam#define SWIG_SHARED_PTR_NAMESPACE std %include swig-4.0.1/Lib/java/arrays_java.i0000644000175000017500000003260513527063513016461 0ustar williamwilliam/* ----------------------------------------------------------------------------- * arrays_java.i * * These typemaps give more natural support for arrays. The typemaps are not efficient * as there is a lot of copying of the array values whenever the array is passed to C/C++ * from Java and vice versa. The Java array is expected to be the same size as the C array. * An exception is thrown if they are not. * * Example usage: * Wrapping: * * %include * %inline %{ * short FiddleSticks[3]; * %} * * Use from Java like this: * * short[] fs = new short[] {10, 11, 12}; * example.setFiddleSticks(fs); * fs = example.getFiddleSticks(); * ----------------------------------------------------------------------------- */ /* Primitive array support is a combination of SWIG macros and functions in order to reduce * code bloat and aid maintainability. The SWIG preprocessor expands the macros into functions * for inclusion in the generated code. */ /* Array support functions declarations macro */ %define JAVA_ARRAYS_DECL(CTYPE, JNITYPE, JAVATYPE, JFUNCNAME) %{ static int SWIG_JavaArrayIn##JFUNCNAME (JNIEnv *jenv, JNITYPE **jarr, CTYPE **carr, JNITYPE##Array input); static void SWIG_JavaArrayArgout##JFUNCNAME (JNIEnv *jenv, JNITYPE *jarr, CTYPE *carr, JNITYPE##Array input); static JNITYPE##Array SWIG_JavaArrayOut##JFUNCNAME (JNIEnv *jenv, CTYPE *result, jsize sz); %} %enddef /* Array support functions macro */ %define JAVA_ARRAYS_IMPL(CTYPE, JNITYPE, JAVATYPE, JFUNCNAME) %{ /* CTYPE[] support */ static int SWIG_JavaArrayIn##JFUNCNAME (JNIEnv *jenv, JNITYPE **jarr, CTYPE **carr, JNITYPE##Array input) { int i; jsize sz; if (!input) { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null array"); return 0; } sz = JCALL1(GetArrayLength, jenv, input); *jarr = JCALL2(Get##JAVATYPE##ArrayElements, jenv, input, 0); if (!*jarr) return 0; %} #ifdef __cplusplus %{ *carr = new CTYPE[sz]; %} #else %{ *carr = (CTYPE*) malloc(sz * sizeof(CTYPE)); %} #endif %{ if (!*carr) { SWIG_JavaThrowException(jenv, SWIG_JavaOutOfMemoryError, "array memory allocation failed"); return 0; } for (i=0; i %{ #include #include %} %fragment("SWIG_VectorSize", "header", fragment="SWIG_JavaIntFromSize_t") { SWIGINTERN jint SWIG_VectorSize(size_t size) { jint sz = SWIG_JavaIntFromSize_t(size); if (sz == -1) throw std::out_of_range("vector size is too large to fit into a Java int"); return sz; } } %define SWIG_STD_VECTOR_MINIMUM_INTERNAL(CTYPE, CONST_REFERENCE) %typemap(javabase) std::vector< CTYPE > "java.util.AbstractList<$typemap(jboxtype, CTYPE)>" %typemap(javainterfaces) std::vector< CTYPE > "java.util.RandomAccess" %proxycode %{ public $javaclassname($typemap(jstype, CTYPE)[] initialElements) { this(); reserve(initialElements.length); for ($typemap(jstype, CTYPE) element : initialElements) { add(element); } } public $javaclassname(Iterable<$typemap(jboxtype, CTYPE)> initialElements) { this(); for ($typemap(jstype, CTYPE) element : initialElements) { add(element); } } public $typemap(jboxtype, CTYPE) get(int index) { return doGet(index); } public $typemap(jboxtype, CTYPE) set(int index, $typemap(jboxtype, CTYPE) e) { return doSet(index, e); } public boolean add($typemap(jboxtype, CTYPE) e) { modCount++; doAdd(e); return true; } public void add(int index, $typemap(jboxtype, CTYPE) e) { modCount++; doAdd(index, e); } public $typemap(jboxtype, CTYPE) remove(int index) { modCount++; return doRemove(index); } protected void removeRange(int fromIndex, int toIndex) { modCount++; doRemoveRange(fromIndex, toIndex); } public int size() { return doSize(); } %} public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef CTYPE value_type; typedef CTYPE *pointer; typedef CTYPE const *const_pointer; typedef CTYPE &reference; typedef CONST_REFERENCE const_reference; vector(); vector(const vector &other); size_type capacity() const; void reserve(size_type n) throw (std::length_error); %rename(isEmpty) empty; bool empty() const; void clear(); %extend { %fragment("SWIG_VectorSize"); vector(jint count, const CTYPE &value) throw (std::out_of_range) { if (count < 0) throw std::out_of_range("vector count must be positive"); return new std::vector< CTYPE >(static_cast::size_type>(count), value); } jint doSize() const throw (std::out_of_range) { return SWIG_VectorSize(self->size()); } void doAdd(const value_type& x) { self->push_back(x); } void doAdd(jint index, const value_type& x) throw (std::out_of_range) { jint size = static_cast(self->size()); if (0 <= index && index <= size) { self->insert(self->begin() + index, x); } else { throw std::out_of_range("vector index out of range"); } } value_type doRemove(jint index) throw (std::out_of_range) { jint size = static_cast(self->size()); if (0 <= index && index < size) { CTYPE const old_value = (*self)[index]; self->erase(self->begin() + index); return old_value; } else { throw std::out_of_range("vector index out of range"); } } CONST_REFERENCE doGet(jint index) throw (std::out_of_range) { jint size = static_cast(self->size()); if (index >= 0 && index < size) return (*self)[index]; else throw std::out_of_range("vector index out of range"); } value_type doSet(jint index, const value_type& val) throw (std::out_of_range) { jint size = static_cast(self->size()); if (index >= 0 && index < size) { CTYPE const old_value = (*self)[index]; (*self)[index] = val; return old_value; } else throw std::out_of_range("vector index out of range"); } void doRemoveRange(jint fromIndex, jint toIndex) throw (std::out_of_range) { jint size = static_cast(self->size()); if (0 <= fromIndex && fromIndex <= toIndex && toIndex <= size) { self->erase(self->begin() + fromIndex, self->begin() + toIndex); } else { throw std::out_of_range("vector index out of range"); } } } %enddef %javamethodmodifiers std::vector::doSize "private"; %javamethodmodifiers std::vector::doAdd "private"; %javamethodmodifiers std::vector::doGet "private"; %javamethodmodifiers std::vector::doSet "private"; %javamethodmodifiers std::vector::doRemove "private"; %javamethodmodifiers std::vector::doRemoveRange "private"; namespace std { template class vector { SWIG_STD_VECTOR_MINIMUM_INTERNAL(T, const value_type&) }; // bool specialization template<> class vector { SWIG_STD_VECTOR_MINIMUM_INTERNAL(bool, bool) }; } %define specialize_std_vector(T) #warning "specialize_std_vector - specialization for type T no longer needed" %enddef swig-4.0.1/Lib/java/std_set.i0000644000175000017500000001221613527063513015620 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_set.i * * SWIG typemaps for std::set * The Java proxy class extends java.util.AbstractSet. The std::set * container looks and feels much like a java.util.HashSet from Java. * ----------------------------------------------------------------------------- */ %include // ------------------------------------------------------------------------ // std::set // ------------------------------------------------------------------------ %{ #include #include %} %fragment("SWIG_SetSize", "header", fragment="SWIG_JavaIntFromSize_t") { SWIGINTERN jint SWIG_SetSize(size_t size) { jint sz = SWIG_JavaIntFromSize_t(size); if (sz == -1) { throw std::out_of_range("set size is too large to fit into a Java int"); } return sz; } } %javamethodmodifiers std::set::sizeImpl "private"; %javamethodmodifiers std::set::containsImpl "private"; %javamethodmodifiers std::set::removeImpl "private"; %javamethodmodifiers std::set::hasNextImpl "private"; %javamethodmodifiers std::set::begin "private"; %javamethodmodifiers std::set::end "private"; %rename(Iterator) std::set::iterator; %nodefaultctor std::set::iterator; %javamethodmodifiers std::set::iterator::incrementUnchecked "private"; %javamethodmodifiers std::set::iterator::derefUnchecked "private"; %javamethodmodifiers std::set::iterator::isNot "private"; namespace std { template class set { %typemap(javabase) std::set "java.util.AbstractSet<$typemap(jboxtype, T)>" %proxycode %{ public $javaclassname(java.util.Collection collection) { this(); addAll(collection); } public int size() { return sizeImpl(); } public boolean add($typemap(jboxtype, T) key) { return addImpl(key); } public boolean addAll(java.util.Collection collection) { boolean didAddElement = false; for (java.lang.Object object : collection) { didAddElement |= add(($typemap(jboxtype, T))object); } return didAddElement; } public java.util.Iterator<$typemap(jboxtype, T)> iterator() { return new java.util.Iterator<$typemap(jboxtype, T)>() { private Iterator curr; private Iterator end; private java.util.Iterator<$typemap(jboxtype, T)> init() { curr = $javaclassname.this.begin(); end = $javaclassname.this.end(); return this; } public $typemap(jboxtype, T) next() { if (!hasNext()) { throw new java.util.NoSuchElementException(); } // Save the current position, increment it, // then return the value at the position before the increment. final $typemap(jboxtype, T) currValue = curr.derefUnchecked(); curr.incrementUnchecked(); return currValue; } public boolean hasNext() { return curr.isNot(end); } }.init(); } public boolean containsAll(java.util.Collection collection) { for (java.lang.Object object : collection) { if (!contains(object)) { return false; } } return true; } public boolean contains(java.lang.Object object) { if (!(object instanceof $typemap(jboxtype, T))) { return false; } return containsImpl(($typemap(jboxtype, T))object); } public boolean removeAll(java.util.Collection collection) { boolean didRemoveElement = false; for (java.lang.Object object : collection) { didRemoveElement |= remove(object); } return didRemoveElement; } public boolean remove(java.lang.Object object) { if (!(object instanceof $typemap(jboxtype, T))) { return false; } return removeImpl(($typemap(jboxtype, T))object); } %} public: struct iterator { %typemap(javaclassmodifiers) iterator "protected class" %extend { void incrementUnchecked() { ++(*$self); } T derefUnchecked() const { return **$self; } bool isNot(iterator other) const { return (*$self != other); } } }; typedef size_t size_type; typedef ptrdiff_t difference_type; typedef T key_type; typedef T value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; set(); set(const set& other); %rename(isEmpty) empty; bool empty() const; void clear(); iterator begin(); iterator end(); %extend { %fragment("SWIG_SetSize"); // Returns whether item was inserted. bool addImpl(const T& key) { return self->insert(key).second; } // Returns whether set contains key. bool containsImpl(const T& key) { return (self->count(key) > 0); } // Returns whether the item was erased. bool removeImpl(const T& key) { return (self->erase(key) > 0); } jint sizeImpl() const throw (std::out_of_range) { return SWIG_SetSize(self->size()); } bool hasNextImpl(const iterator& itr) const { return (itr != $self->end()); } } }; } swig-4.0.1/Lib/java/std_wstring.i0000644000175000017500000001170313527063513016522 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_wstring.i * * Typemaps for std::wstring and const std::wstring& * * These are mapped to a Java String and are passed around by value. * Warning: Unicode / multibyte characters are handled differently on different * OSs so the std::wstring typemaps may not always work as intended. * * To use non-const std::wstring references use the following %apply. Note * that they are passed by value. * %apply const std::wstring & {std::wstring &}; * ----------------------------------------------------------------------------- */ namespace std { %naturalvar wstring; class wstring; // wstring %typemap(jni) wstring "jstring" %typemap(jtype) wstring "String" %typemap(jstype) wstring "String" %typemap(javadirectorin) wstring "$jniinput" %typemap(javadirectorout) wstring "$javacall" %typemap(in) wstring %{if(!$input) { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::wstring"); return $null; } const jchar *$1_pstr = jenv->GetStringChars($input, 0); if (!$1_pstr) return $null; jsize $1_len = jenv->GetStringLength($input); if ($1_len) { $1.reserve($1_len); for (jsize i = 0; i < $1_len; ++i) { $1.push_back((wchar_t)$1_pstr[i]); } } jenv->ReleaseStringChars($input, $1_pstr); %} %typemap(directorout) wstring %{if(!$input) { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::wstring"); return $null; } const jchar *$1_pstr = jenv->GetStringChars($input, 0); if (!$1_pstr) return $null; jsize $1_len = jenv->GetStringLength($input); if ($1_len) { $result.reserve($1_len); for (jsize i = 0; i < $1_len; ++i) { $result.push_back((wchar_t)$1_pstr[i]); } } jenv->ReleaseStringChars($input, $1_pstr); %} %typemap(directorin,descriptor="Ljava/lang/String;") wstring %{ jsize $1_len = $1.length(); jchar *$1_conv_buf = new jchar[$1_len]; for (jsize i = 0; i < $1_len; ++i) { $1_conv_buf[i] = (jchar)$1[i]; } $input = jenv->NewString($1_conv_buf, $1_len); Swig::LocalRefGuard $1_refguard(jenv, $input); delete [] $1_conv_buf; %} %typemap(out) wstring %{jsize $1_len = $1.length(); jchar *conv_buf = new jchar[$1_len]; for (jsize i = 0; i < $1_len; ++i) { conv_buf[i] = (jchar)$1[i]; } $result = jenv->NewString(conv_buf, $1_len); delete [] conv_buf; %} %typemap(javain) wstring "$javainput" %typemap(javaout) wstring { return $jnicall; } //%typemap(typecheck) wstring = wchar_t *; %typemap(throws) wstring %{ std::string message($1.begin(), $1.end()); SWIG_JavaThrowException(jenv, SWIG_JavaRuntimeException, message.c_str()); return $null; %} // const wstring & %typemap(jni) const wstring & "jstring" %typemap(jtype) const wstring & "String" %typemap(jstype) const wstring & "String" %typemap(javadirectorin) const wstring & "$jniinput" %typemap(javadirectorout) const wstring & "$javacall" %typemap(in) const wstring & %{if(!$input) { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::wstring"); return $null; } const jchar *$1_pstr = jenv->GetStringChars($input, 0); if (!$1_pstr) return $null; jsize $1_len = jenv->GetStringLength($input); std::wstring $1_str; if ($1_len) { $1_str.reserve($1_len); for (jsize i = 0; i < $1_len; ++i) { $1_str.push_back((wchar_t)$1_pstr[i]); } } $1 = &$1_str; jenv->ReleaseStringChars($input, $1_pstr); %} %typemap(directorout,warning=SWIGWARN_TYPEMAP_THREAD_UNSAFE_MSG) const wstring & %{if(!$input) { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::wstring"); return $null; } const jchar *$1_pstr = jenv->GetStringChars($input, 0); if (!$1_pstr) return $null; jsize $1_len = jenv->GetStringLength($input); /* possible thread/reentrant code problem */ static std::wstring $1_str; if ($1_len) { $1_str.reserve($1_len); for (jsize i = 0; i < $1_len; ++i) { $1_str.push_back((wchar_t)$1_pstr[i]); } } $result = &$1_str; jenv->ReleaseStringChars($input, $1_pstr); %} %typemap(directorin,descriptor="Ljava/lang/String;") const wstring & %{ jsize $1_len = $1.length(); jchar *$1_conv_buf = new jchar[$1_len]; for (jsize i = 0; i < $1_len; ++i) { $1_conv_buf[i] = (jchar)($1)[i]; } $input = jenv->NewString($1_conv_buf, $1_len); Swig::LocalRefGuard $1_refguard(jenv, $input); delete [] $1_conv_buf; %} %typemap(out) const wstring & %{jsize $1_len = $1->length(); jchar *conv_buf = new jchar[$1_len]; for (jsize i = 0; i < $1_len; ++i) { conv_buf[i] = (jchar)(*$1)[i]; } $result = jenv->NewString(conv_buf, $1_len); delete [] conv_buf; %} %typemap(javain) const wstring & "$javainput" %typemap(javaout) const wstring & { return $jnicall; } //%typemap(typecheck) const wstring & = wchar_t *; %typemap(throws) const wstring & %{ std::string message($1.begin(), $1.end()); SWIG_JavaThrowException(jenv, SWIG_JavaRuntimeException, message.c_str()); return $null; %} } swig-4.0.1/Lib/java/std_unordered_map.i0000644000175000017500000001357713527063513017664 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_unordered_map.i * * SWIG typemaps for std::unordered_map * The Java proxy class extends java.util.AbstractMap. The std::unordered_map * container looks and feels much like a java.util.HashMap from Java. * ----------------------------------------------------------------------------- */ %include // ------------------------------------------------------------------------ // std::unordered_map // ------------------------------------------------------------------------ %{ #include #include %} %fragment("SWIG_MapSize", "header", fragment="SWIG_JavaIntFromSize_t") { SWIGINTERN jint SWIG_MapSize(size_t size) { jint sz = SWIG_JavaIntFromSize_t(size); if (sz == -1) { throw std::out_of_range("map size is too large to fit into a Java int"); } return sz; } } %javamethodmodifiers std::unordered_map::sizeImpl "private"; %javamethodmodifiers std::unordered_map::containsImpl "private"; %javamethodmodifiers std::unordered_map::putUnchecked "private"; %javamethodmodifiers std::unordered_map::removeUnchecked "private"; %javamethodmodifiers std::unordered_map::find "private"; %javamethodmodifiers std::unordered_map::begin "private"; %javamethodmodifiers std::unordered_map::end "private"; %rename(Iterator) std::unordered_map::iterator; %nodefaultctor std::unordered_map::iterator; %javamethodmodifiers std::unordered_map::iterator::getNextUnchecked "private"; %javamethodmodifiers std::unordered_map::iterator::isNot "private"; %javamethodmodifiers std::unordered_map::iterator::getKey "private"; %javamethodmodifiers std::unordered_map::iterator::getValue "private"; %javamethodmodifiers std::unordered_map::iterator::setValue "private"; namespace std { template class unordered_map { %typemap(javabase) std::unordered_map "java.util.AbstractMap<$typemap(jboxtype, K), $typemap(jboxtype, T)>" %proxycode %{ public int size() { return sizeImpl(); } public boolean containsKey(java.lang.Object key) { if (!(key instanceof $typemap(jboxtype, K))) { return false; } return containsImpl(($typemap(jboxtype, K))key); } public $typemap(jboxtype, T) get(java.lang.Object key) { if (!(key instanceof $typemap(jboxtype, K))) { return null; } Iterator itr = find(($typemap(jboxtype, K)) key); if (itr.isNot(end())) { return itr.getValue(); } return null; } public $typemap(jboxtype, T) put($typemap(jboxtype, K) key, $typemap(jboxtype, T) value) { Iterator itr = find(($typemap(jboxtype, K)) key); if (itr.isNot(end())) { $typemap(jboxtype, T) oldValue = itr.getValue(); itr.setValue(value); return oldValue; } else { putUnchecked(key, value); return null; } } public $typemap(jboxtype, T) remove(java.lang.Object key) { if (!(key instanceof $typemap(jboxtype, K))) { return null; } Iterator itr = find(($typemap(jboxtype, K)) key); if (itr.isNot(end())) { $typemap(jboxtype, T) oldValue = itr.getValue(); removeUnchecked(itr); return oldValue; } else { return null; } } public java.util.Set> entrySet() { java.util.Set> setToReturn = new java.util.HashSet>(); Iterator itr = begin(); final Iterator end = end(); while (itr.isNot(end)) { setToReturn.add(new Entry<$typemap(jboxtype, K), $typemap(jboxtype, T)>() { private Iterator iterator; private Entry<$typemap(jboxtype, K), $typemap(jboxtype, T)> init(Iterator iterator) { this.iterator = iterator; return this; } public $typemap(jboxtype, K) getKey() { return iterator.getKey(); } public $typemap(jboxtype, T) getValue() { return iterator.getValue(); } public $typemap(jboxtype, T) setValue($typemap(jboxtype, T) newValue) { $typemap(jboxtype, T) oldValue = iterator.getValue(); iterator.setValue(newValue); return oldValue; } }.init(itr)); itr = itr.getNextUnchecked(); } return setToReturn; } %} public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef K key_type; typedef T mapped_type; typedef std::pair< const K, T > value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; unordered_map(); unordered_map(const unordered_map& other); struct iterator { %typemap(javaclassmodifiers) iterator "protected class" %extend { std::unordered_map< K, T >::iterator getNextUnchecked() { std::unordered_map< K, T >::iterator copy = (*$self); return ++copy; } bool isNot(iterator other) const { return (*$self != other); } K getKey() const { return (*$self)->first; } T getValue() const { return (*$self)->second; } void setValue(const T& newValue) { (*$self)->second = newValue; } } }; %rename(isEmpty) empty; bool empty() const; void clear(); iterator find(const K& key); iterator begin(); iterator end(); %extend { %fragment("SWIG_MapSize"); jint sizeImpl() const throw (std::out_of_range) { return SWIG_MapSize(self->size()); } bool containsImpl(const K& key) { return (self->count(key) > 0); } void putUnchecked(const K& key, const T& value) { (*self)[key] = value; } void removeUnchecked(const std::unordered_map< K, T >::iterator itr) { self->erase(itr); } } }; } swig-4.0.1/Lib/java/std_unordered_set.i0000644000175000017500000001254413527063513017673 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_unordered_set.i * * SWIG typemaps for std::unordered_set * The Java proxy class extends java.util.AbstractSet. The std::unordered_set * container looks and feels much like a java.util.HashSet from Java. * ----------------------------------------------------------------------------- */ %include // ------------------------------------------------------------------------ // std::unordered_set // ------------------------------------------------------------------------ %{ #include #include %} %fragment("SWIG_UnorderedSetSize", "header", fragment="SWIG_JavaIntFromSize_t") { SWIGINTERN jint SWIG_UnorderedSetSize(size_t size) { jint sz = SWIG_JavaIntFromSize_t(size); if (sz == -1) { throw std::out_of_range("unordered_set size is too large to fit into a Java int"); } return sz; } } %javamethodmodifiers std::unordered_set::sizeImpl "private"; %javamethodmodifiers std::unordered_set::containsImpl "private"; %javamethodmodifiers std::unordered_set::removeImpl "private"; %javamethodmodifiers std::unordered_set::hasNextImpl "private"; %javamethodmodifiers std::unordered_set::begin "private"; %javamethodmodifiers std::unordered_set::end "private"; %rename(Iterator) std::unordered_set::iterator; %nodefaultctor std::unordered_set::iterator; %javamethodmodifiers std::unordered_set::iterator::incrementUnchecked "private"; %javamethodmodifiers std::unordered_set::iterator::derefUnchecked "private"; %javamethodmodifiers std::unordered_set::iterator::isNot "private"; namespace std { template class unordered_set { %typemap(javabase) std::unordered_set "java.util.AbstractSet<$typemap(jboxtype, Key)>" %proxycode %{ public $javaclassname(java.util.Collection collection) { this(); addAll(collection); } public int size() { return sizeImpl(); } public boolean addAll(java.util.Collection collection) { boolean didAddElement = false; for (java.lang.Object object : collection) { didAddElement |= add(($typemap(jboxtype, Key))object); } return didAddElement; } public java.util.Iterator<$typemap(jboxtype, Key)> iterator() { return new java.util.Iterator<$typemap(jboxtype, Key)>() { private Iterator curr; private Iterator end; private java.util.Iterator<$typemap(jboxtype, Key)> init() { curr = $javaclassname.this.begin(); end = $javaclassname.this.end(); return this; } public $typemap(jboxtype, Key) next() { if (!hasNext()) { throw new java.util.NoSuchElementException(); } // Save the current position, increment it, // then return the value at the position before the increment. final $typemap(jboxtype, Key) currValue = curr.derefUnchecked(); curr.incrementUnchecked(); return currValue; } public boolean hasNext() { return curr.isNot(end); } }.init(); } public boolean containsAll(java.util.Collection collection) { for (java.lang.Object object : collection) { if (!contains(object)) { return false; } } return true; } public boolean contains(java.lang.Object object) { if (!(object instanceof $typemap(jboxtype, Key))) { return false; } return containsImpl(($typemap(jboxtype, Key))object); } public boolean removeAll(java.util.Collection collection) { boolean didRemoveElement = false; for (java.lang.Object object : collection) { didRemoveElement |= remove(object); } return didRemoveElement; } public boolean remove(java.lang.Object object) { if (!(object instanceof $typemap(jboxtype, Key))) { return false; } return removeImpl(($typemap(jboxtype, Key))object); } %} public: struct iterator { %typemap(javaclassmodifiers) iterator "protected class" %extend { void incrementUnchecked() { ++(*$self); } Key derefUnchecked() const { return **$self; } bool isNot(iterator other) const { return (*$self != other); } } }; typedef size_t size_type; typedef ptrdiff_t difference_type; typedef Key value_type; typedef Key key_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; unordered_set(); unordered_set(const unordered_set& other); %rename(isEmpty) empty; bool empty() const; void clear(); iterator begin(); iterator end(); %extend { %fragment("SWIG_UnorderedSetSize"); // Returns whether item was inserted. bool add(const Key& key) { return self->insert(key).second; } // Returns whether set contains key. bool containsImpl(const Key& key) { return (self->count(key) > 0); } // Returns whether the item was erased. bool removeImpl(const Key& key) { return (self->erase(key) > 0); } jint sizeImpl() const throw (std::out_of_range) { return SWIG_UnorderedSetSize(self->size()); } bool hasNextImpl(const iterator& itr) const { return (itr != $self->end()); } } }; } swig-4.0.1/Lib/java/enumtypeunsafe.swg0000644000175000017500000000524313527063513017575 0ustar williamwilliam/* ----------------------------------------------------------------------------- * enumtypeunsafe.swg * * Include this file in order for C/C++ enums to be wrapped by integers values. * Each enum has an equivalent class named after the enum and the enum items are * wrapped by constant integers within this class. The enum items are not * typesafe as they are all integers. * ----------------------------------------------------------------------------- */ // const enum SWIGTYPE & typemaps %typemap(jni) const enum SWIGTYPE & "jint" %typemap(jtype) const enum SWIGTYPE & "int" %typemap(jstype) const enum SWIGTYPE & "int" %typemap(in) const enum SWIGTYPE & ($*1_ltype temp) %{ temp = ($*1_ltype)$input; $1 = &temp; %} %typemap(out) const enum SWIGTYPE & %{ $result = (jint)*$1; %} %typemap(directorout,warning=SWIGWARN_TYPEMAP_THREAD_UNSAFE_MSG) const enum SWIGTYPE & %{ static $*1_ltype temp = ($*1_ltype)$input; $result = &temp; %} %typemap(directorin, descriptor="I") const enum SWIGTYPE & "$input = (jint)$1;" %typemap(javadirectorin) const enum SWIGTYPE & "$jniinput" %typemap(javadirectorout) const enum SWIGTYPE & "$javacall" %typecheck(SWIG_TYPECHECK_INT32) const enum SWIGTYPE & "" %typemap(throws) const enum SWIGTYPE & %{ (void)$1; SWIG_JavaThrowException(jenv, SWIG_JavaRuntimeException, "C++ $1_type exception thrown"); %} %typemap(javain) const enum SWIGTYPE & "$javainput" %typemap(javaout) const enum SWIGTYPE & { return $jnicall; } // enum SWIGTYPE typemaps %typemap(jni) enum SWIGTYPE "jint" %typemap(jtype) enum SWIGTYPE "int" %typemap(jstype) enum SWIGTYPE "int" %typemap(in) enum SWIGTYPE %{ $1 = ($1_ltype)$input; %} %typemap(out) enum SWIGTYPE %{ $result = (jint)$1; %} %typemap(directorout) enum SWIGTYPE %{ $result = ($1_ltype)$input; %} %typemap(directorin, descriptor="I") enum SWIGTYPE "$input = (jint) $1;" %typemap(javadirectorin) enum SWIGTYPE "$jniinput" %typemap(javadirectorout) enum SWIGTYPE "$javacall" %typecheck(SWIG_TYPECHECK_INT32) enum SWIGTYPE "" %typemap(throws) enum SWIGTYPE %{ (void)$1; SWIG_JavaThrowException(jenv, SWIG_JavaRuntimeException, "C++ $1_type exception thrown"); %} %typemap(javain) enum SWIGTYPE "$javainput" %typemap(javaout) enum SWIGTYPE { return $jnicall; } // '$static' will be replaced with either 'static' or nothing depending on whether the enum is an inner Java class or not %typemap(javaclassmodifiers) enum SWIGTYPE "public final $static class" %typemap(javabase) enum SWIGTYPE "" %typemap(javacode) enum SWIGTYPE "" %typemap(javaimports) enum SWIGTYPE "" %typemap(javainterfaces) enum SWIGTYPE "" %typemap(javabody) enum SWIGTYPE "" %javaenum(typeunsafe); swig-4.0.1/Lib/java/boost_intrusive_ptr.i0000644000175000017500000005015413527063513020301 0ustar williamwilliam// Users can provide their own SWIG_INTRUSIVE_PTR_TYPEMAPS or SWIG_INTRUSIVE_PTR_TYPEMAPS_NO_WRAP macros before including this file to change the // visibility of the constructor and getCPtr method if desired to public if using multiple modules. #ifndef SWIG_INTRUSIVE_PTR_TYPEMAPS_NO_WRAP #define SWIG_INTRUSIVE_PTR_TYPEMAPS_NO_WRAP(CONST, TYPE...) SWIG_INTRUSIVE_PTR_TYPEMAPS_NO_WRAP_IMPLEMENTATION(protected, protected, CONST, TYPE) #endif #ifndef SWIG_INTRUSIVE_PTR_TYPEMAPS #define SWIG_INTRUSIVE_PTR_TYPEMAPS(CONST, TYPE...) SWIG_INTRUSIVE_PTR_TYPEMAPS_IMPLEMENTATION(protected, protected, CONST, TYPE) #endif %include // Language specific macro implementing all the customisations for handling the smart pointer %define SWIG_INTRUSIVE_PTR_TYPEMAPS_IMPLEMENTATION(PTRCTOR_VISIBILITY, CPTR_VISIBILITY, CONST, TYPE...) // %naturalvar is as documented for member variables %naturalvar TYPE; %naturalvar SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE >; // destructor wrapper customisation %feature("unref") TYPE "(void)arg1; delete smartarg1;" // Typemap customisations... %typemap(in) CONST TYPE ($&1_type argp = 0, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0) %{ // plain value argp = (*(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input) ? (*(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input)->get() : 0; if (!argp) { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "Attempt to dereference null $1_type"); return $null; } $1 = *argp; %} %typemap(out, fragment="SWIG_intrusive_deleter") CONST TYPE %{ //plain value(out) $1_ltype* resultp = new $1_ltype(($1_ltype &)$1); intrusive_ptr_add_ref(resultp); *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(resultp, SWIG_intrusive_deleter< CONST TYPE >()); %} %typemap(in) CONST TYPE * (SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0) %{ // plain pointer smartarg = *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input; $1 = (TYPE *)(smartarg ? smartarg->get() : 0); %} %typemap(out, fragment="SWIG_intrusive_deleter,SWIG_null_deleter") CONST TYPE * %{ //plain pointer(out) #if ($owner) if ($1) { intrusive_ptr_add_ref($1); *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1, SWIG_intrusive_deleter< CONST TYPE >()); } else { *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = 0; } #else *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1 SWIG_NO_NULL_DELETER_0) : 0; #endif %} %typemap(in) CONST TYPE & (SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0) %{ // plain reference $1 = ($1_ltype)((*(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input) ? (*(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input)->get() : 0); if(!$1) { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "$1_type reference is null"); return $null; } %} %typemap(out, fragment="SWIG_intrusive_deleter,SWIG_null_deleter") CONST TYPE & %{ //plain reference(out) #if ($owner) if ($1) { intrusive_ptr_add_ref($1); *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1, SWIG_intrusive_deleter< CONST TYPE >()); } else { *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = 0; } #else *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1 SWIG_NO_NULL_DELETER_0) : 0; #endif %} %typemap(in) TYPE *CONST& ($*1_ltype temp = 0, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0) %{ // plain pointer by reference temp = ($*1_ltype)((*(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input) ? (*(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input)->get() : 0); $1 = &temp; %} %typemap(out, fragment="SWIG_intrusive_deleter,SWIG_null_deleter") TYPE *CONST& %{ // plain pointer by reference(out) #if ($owner) if (*$1) { intrusive_ptr_add_ref(*$1); *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(*$1, SWIG_intrusive_deleter< CONST TYPE >()); } else { *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = 0; } #else *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(*$1 SWIG_NO_NULL_DELETER_0); #endif %} %typemap(in) SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > ($&1_type argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * smartarg) %{ // intrusive_ptr by value smartarg = *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >**)&$input; if (smartarg) { $1 = SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE >(smartarg->get(), true); } %} %typemap(out, fragment="SWIG_intrusive_deleter") SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > %{ if ($1) { intrusive_ptr_add_ref(result.get()); *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(result.get(), SWIG_intrusive_deleter< CONST TYPE >()); } else { *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = 0; } %} %typemap(in) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > swigSharedPtrUpcast ($&1_type smartarg) %{ // shared_ptr by value smartarg = *($&1_ltype*)&$input; if (smartarg) $1 = *smartarg; %} %typemap(out) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > ANY_TYPE_SWIGSharedPtrUpcast %{ *($&1_ltype*)&$result = $1 ? new $1_ltype($1) : 0; %} %typemap(in) SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > & ($*1_ltype tempnull, $*1_ltype temp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * smartarg) %{ // intrusive_ptr by reference if ( $input ) { smartarg = *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >**)&$input; temp = SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE >(smartarg->get(), true); $1 = &temp; } else { $1 = &tempnull; } %} %typemap(memberin) SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > & %{ delete &($1); if ($self) { SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > * temp = new SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE >(*$input); $1 = *temp; } %} %typemap(out, fragment="SWIG_intrusive_deleter") SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > & %{ if (*$1) { intrusive_ptr_add_ref($1->get()); *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1->get(), SWIG_intrusive_deleter< CONST TYPE >()); } else { *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = 0; } %} %typemap(in) SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > * ($*1_ltype tempnull, $*1_ltype temp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * smartarg) %{ // intrusive_ptr by pointer if ( $input ) { smartarg = *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >**)&$input; temp = SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE >(smartarg->get(), true); $1 = &temp; } else { $1 = &tempnull; } %} %typemap(memberin) SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > * %{ delete $1; if ($self) $1 = new SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE >(*$input); %} %typemap(out, fragment="SWIG_intrusive_deleter") SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > * %{ if ($1 && *$1) { intrusive_ptr_add_ref($1->get()); *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1->get(), SWIG_intrusive_deleter< CONST TYPE >()); } else { *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = 0; } if ($owner) delete $1; %} %typemap(in) SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > *& (SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > temp, $*1_ltype tempp = 0, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * smartarg) %{ // intrusive_ptr by pointer reference smartarg = *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >**)&$input; if ($input) { temp = SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE >(smartarg->get(), true); } tempp = &temp; $1 = &tempp; %} %typemap(memberin) SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > *& %{ if ($self) $1 = *$input; %} %typemap(out, fragment="SWIG_intrusive_deleter") SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > *& %{ if (*$1 && **$1) { intrusive_ptr_add_ref((*$1)->get()); *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >((*$1)->get(), SWIG_intrusive_deleter< CONST TYPE >()); } else { *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = 0; } %} // various missing typemaps - If ever used (unlikely) ensure compilation error rather than runtime bug %typemap(in) CONST TYPE[], CONST TYPE[ANY], CONST TYPE (CLASS::*) %{ #error "typemaps for $1_type not available" %} %typemap(out) CONST TYPE[], CONST TYPE[ANY], CONST TYPE (CLASS::*) %{ #error "typemaps for $1_type not available" %} %typemap (jni) SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE >, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >, SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > &, SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > *, SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > *& "jlong" %typemap (jtype) SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE >, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >, SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > &, SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > *, SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > *& "long" %typemap (jstype) SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE >, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >, SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > &, SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > *, SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > *& "$typemap(jstype, TYPE)" %typemap(javain) SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE >, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >, SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > &, SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > *, SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > *& "$typemap(jstype, TYPE).getCPtr($javainput)" %typemap(javaout) SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > { long cPtr = $jnicall; return (cPtr == 0) ? null : new $typemap(jstype, TYPE)(cPtr, true); } %typemap(javaout) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > { long cPtr = $jnicall; return (cPtr == 0) ? null : new $typemap(jstype, TYPE)(cPtr, true); } %typemap(javaout) SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > & { long cPtr = $jnicall; return (cPtr == 0) ? null : new $typemap(jstype, TYPE)(cPtr, true); } %typemap(javaout) SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > * { long cPtr = $jnicall; return (cPtr == 0) ? null : new $typemap(jstype, TYPE)(cPtr, true); } %typemap(javaout) SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > *& { long cPtr = $jnicall; return (cPtr == 0) ? null : new $typemap(jstype, TYPE)(cPtr, true); } %typemap(javaout) CONST TYPE { return new $typemap(jstype, TYPE)($jnicall, true); } %typemap(javaout) CONST TYPE & { return new $typemap(jstype, TYPE)($jnicall, true); } %typemap(javaout) CONST TYPE * { long cPtr = $jnicall; return (cPtr == 0) ? null : new $typemap(jstype, TYPE)(cPtr, true); } %typemap(javaout) TYPE *CONST& { long cPtr = $jnicall; return (cPtr == 0) ? null : new $typemap(jstype, TYPE)(cPtr, true); } // Base proxy classes %typemap(javabody) TYPE %{ private transient long swigCPtr; private transient boolean swigCMemOwnBase; PTRCTOR_VISIBILITY $javaclassname(long cPtr, boolean cMemoryOwn) { swigCMemOwnBase = cMemoryOwn; swigCPtr = cPtr; } CPTR_VISIBILITY static long getCPtr($javaclassname obj) { return (obj == null) ? 0 : obj.swigCPtr; } %} // Derived proxy classes %typemap(javabody_derived) TYPE %{ private transient long swigCPtr; private transient boolean swigCMemOwnDerived; PTRCTOR_VISIBILITY $javaclassname(long cPtr, boolean cMemoryOwn) { super($imclassname.$javaclazznameSWIGSmartPtrUpcast(cPtr), true); swigCMemOwnDerived = cMemoryOwn; swigCPtr = cPtr; } CPTR_VISIBILITY static long getCPtr($javaclassname obj) { return (obj == null) ? 0 : obj.swigCPtr; } %} %typemap(javadestruct, methodname="delete", methodmodifiers="public synchronized") TYPE { if(swigCPtr != 0 && swigCMemOwnBase) { swigCMemOwnBase = false; $jnicall; } swigCPtr = 0; } %typemap(javadestruct_derived, methodname="delete", methodmodifiers="public synchronized") TYPE { if(swigCPtr != 0 && swigCMemOwnDerived) { swigCMemOwnDerived = false; $jnicall; } swigCPtr = 0; super.delete(); } // CONST version needed ???? also for C# %typemap(jtype, nopgcpp="1") SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > swigSharedPtrUpcast "long" %typemap(jtype, nopgcpp="1") SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > swigSharedPtrUpcast "long" %template() SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >; %template() SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE >; %enddef ///////////////////////////////////////////////////////////////////// %include %define SWIG_INTRUSIVE_PTR_TYPEMAPS_NO_WRAP_IMPLEMENTATION(PTRCTOR_VISIBILITY, CPTR_VISIBILITY, CONST, TYPE...) %naturalvar TYPE; %naturalvar SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >; // destructor mods %feature("unref") TYPE "(void)arg1; delete smartarg1;" // plain value %typemap(in) CONST TYPE ($&1_type argp = 0) %{ argp = (*(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input) ? (*(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input)->get() : 0; if (!argp) { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "Attempt to dereference null $1_type"); return $null; } $1 = *argp; %} %typemap(out) CONST TYPE %{ *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(new $1_ltype(($1_ltype &)$1)); %} // plain pointer %typemap(in) CONST TYPE * (SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0) %{ smartarg = *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input; $1 = (TYPE *)(smartarg ? smartarg->get() : 0); %} %typemap(out, fragment="SWIG_null_deleter") CONST TYPE * %{ *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1 SWIG_NO_NULL_DELETER_$owner) : 0; %} // plain reference %typemap(in) CONST TYPE & %{ $1 = ($1_ltype)((*(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input) ? (*(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input)->get() : 0); if (!$1) { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "$1_type reference is null"); return $null; } %} %typemap(out, fragment="SWIG_null_deleter") CONST TYPE & %{ *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1 SWIG_NO_NULL_DELETER_$owner); %} // plain pointer by reference %typemap(in) TYPE *CONST& ($*1_ltype temp = 0) %{ temp = ($*1_ltype)((*(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input) ? (*(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input)->get() : 0); $1 = &temp; %} %typemap(out, fragment="SWIG_null_deleter") TYPE *CONST& %{ *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(*$1 SWIG_NO_NULL_DELETER_$owner); %} %typemap(in) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > swigSharedPtrUpcast ($&1_type smartarg) %{ // shared_ptr by value smartarg = *($&1_ltype*)&$input; if (smartarg) $1 = *smartarg; %} %typemap(out) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > ANY_TYPE_SWIGSharedPtrUpcast %{ *($&1_ltype*)&$result = $1 ? new $1_ltype($1) : 0; %} // various missing typemaps - If ever used (unlikely) ensure compilation error rather than runtime bug %typemap(in) CONST TYPE[], CONST TYPE[ANY], CONST TYPE (CLASS::*) %{ #error "typemaps for $1_type not available" %} %typemap(out) CONST TYPE[], CONST TYPE[ANY], CONST TYPE (CLASS::*) %{ #error "typemaps for $1_type not available" %} %typemap (jni) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > "jlong" %typemap (jtype) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > "long" %typemap (jstype) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > "$typemap(jstype, TYPE)" %typemap (javain) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > "$typemap(jstype, TYPE).getCPtr($javainput)" %typemap(javaout) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > { long cPtr = $jnicall; return (cPtr == 0) ? null : new $typemap(jstype, TYPE)(cPtr, true); } %typemap(javaout) CONST TYPE { return new $typemap(jstype, TYPE)($jnicall, true); } %typemap(javaout) CONST TYPE & { return new $typemap(jstype, TYPE)($jnicall, true); } %typemap(javaout) CONST TYPE * { long cPtr = $jnicall; return (cPtr == 0) ? null : new $typemap(jstype, TYPE)(cPtr, true); } %typemap(javaout) TYPE *CONST& { long cPtr = $jnicall; return (cPtr == 0) ? null : new $typemap(jstype, TYPE)(cPtr, true); } // Base proxy classes %typemap(javabody) TYPE %{ private transient long swigCPtr; private transient boolean swigCMemOwnBase; PTRCTOR_VISIBILITY $javaclassname(long cPtr, boolean cMemoryOwn) { swigCMemOwnBase = cMemoryOwn; swigCPtr = cPtr; } CPTR_VISIBILITY static long getCPtr($javaclassname obj) { return (obj == null) ? 0 : obj.swigCPtr; } %} // Derived proxy classes %typemap(javabody_derived) TYPE %{ private transient long swigCPtr; private transient boolean swigCMemOwnDerived; PTRCTOR_VISIBILITY $javaclassname(long cPtr, boolean cMemoryOwn) { super($imclassname.$javaclazznameSWIGSmartPtrUpcast(cPtr), true); swigCMemOwnDerived = cMemoryOwn; swigCPtr = cPtr; } CPTR_VISIBILITY static long getCPtr($javaclassname obj) { return (obj == null) ? 0 : obj.swigCPtr; } %} %typemap(javadestruct, methodname="delete", methodmodifiers="public synchronized") TYPE { if (swigCPtr != 0) { if (swigCMemOwnBase) { swigCMemOwnBase = false; $jnicall; } swigCPtr = 0; } } %typemap(javadestruct_derived, methodname="delete", methodmodifiers="public synchronized") TYPE { if (swigCPtr != 0) { if (swigCMemOwnDerived) { swigCMemOwnDerived = false; $jnicall; } swigCPtr = 0; } super.delete(); } // CONST version needed ???? also for C# %typemap(jtype, nopgcpp="1") SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > swigSharedPtrUpcast "long" %typemap(jtype, nopgcpp="1") SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > swigSharedPtrUpcast "long" // Typecheck typemaps %typemap(typecheck, precedence=SWIG_TYPECHECK_POINTER, equivalent="TYPE *") TYPE CONST, TYPE CONST &, TYPE CONST *, TYPE *CONST&, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > &, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& "" %template() SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >; %enddef swig-4.0.1/Lib/java/std_common.i0000644000175000017500000000014613527063513016314 0ustar williamwilliam%include %apply size_t { std::size_t }; %apply const size_t& { const std::size_t& }; swig-4.0.1/Lib/java/std_except.i0000644000175000017500000000402713527063513016316 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_except.i * * Typemaps used by the STL wrappers that throw exceptions. * These typemaps are used when methods are declared with an STL exception specification, such as * size_t at() const throw (std::out_of_range); * ----------------------------------------------------------------------------- */ %{ #include #include %} namespace std { %ignore exception; struct exception {}; } %typemap(throws) std::bad_cast "SWIG_JavaThrowException(jenv, SWIG_JavaRuntimeException, $1.what());\n return $null;" %typemap(throws) std::bad_exception "SWIG_JavaThrowException(jenv, SWIG_JavaRuntimeException, $1.what());\n return $null;" %typemap(throws) std::domain_error "SWIG_JavaThrowException(jenv, SWIG_JavaRuntimeException, $1.what());\n return $null;" %typemap(throws) std::exception "SWIG_JavaThrowException(jenv, SWIG_JavaRuntimeException, $1.what());\n return $null;" %typemap(throws) std::invalid_argument "SWIG_JavaThrowException(jenv, SWIG_JavaIllegalArgumentException, $1.what());\n return $null;" %typemap(throws) std::length_error "SWIG_JavaThrowException(jenv, SWIG_JavaIndexOutOfBoundsException, $1.what());\n return $null;" %typemap(throws) std::logic_error "SWIG_JavaThrowException(jenv, SWIG_JavaRuntimeException, $1.what());\n return $null;" %typemap(throws) std::out_of_range "SWIG_JavaThrowException(jenv, SWIG_JavaIndexOutOfBoundsException, $1.what());\n return $null;" %typemap(throws) std::overflow_error "SWIG_JavaThrowException(jenv, SWIG_JavaArithmeticException, $1.what());\n return $null;" %typemap(throws) std::range_error "SWIG_JavaThrowException(jenv, SWIG_JavaIndexOutOfBoundsException, $1.what());\n return $null;" %typemap(throws) std::runtime_error "SWIG_JavaThrowException(jenv, SWIG_JavaRuntimeException, $1.what());\n return $null;" %typemap(throws) std::underflow_error "SWIG_JavaThrowException(jenv, SWIG_JavaArithmeticException, $1.what());\n return $null;" swig-4.0.1/Lib/java/enumtypesafe.swg0000644000175000017500000001103113527063513017222 0ustar williamwilliam/* ----------------------------------------------------------------------------- * enumtypesafe.swg * * Include this file in order for C/C++ enums to be wrapped by the so called * typesafe enum pattern. Each enum has an equivalent Java class named after the * enum and each enum item is a static instance of this class. * ----------------------------------------------------------------------------- */ // const enum SWIGTYPE & typemaps %typemap(jni) const enum SWIGTYPE & "jint" %typemap(jtype) const enum SWIGTYPE & "int" %typemap(jstype) const enum SWIGTYPE & "$*javaclassname" %typemap(in) const enum SWIGTYPE & ($*1_ltype temp) %{ temp = ($*1_ltype)$input; $1 = &temp; %} %typemap(out) const enum SWIGTYPE & %{ $result = (jint)*$1; %} %typemap(directorout,warning=SWIGWARN_TYPEMAP_THREAD_UNSAFE_MSG) const enum SWIGTYPE & %{ static $*1_ltype temp = ($*1_ltype)$input; $result = &temp; %} %typemap(directorin, descriptor="L$packagepath/$*javaclassname;") const enum SWIGTYPE & "$input = (jint)$1;" %typemap(javadirectorin) const enum SWIGTYPE & "$*javaclassname.swigToEnum($jniinput)" %typemap(javadirectorout) const enum SWIGTYPE & "($javacall).swigValue()" %typecheck(SWIG_TYPECHECK_POINTER) const enum SWIGTYPE & "" %typemap(throws) const enum SWIGTYPE & %{ (void)$1; SWIG_JavaThrowException(jenv, SWIG_JavaRuntimeException, "C++ $1_type exception thrown"); %} %typemap(javain) const enum SWIGTYPE & "$javainput.swigValue()" %typemap(javaout) const enum SWIGTYPE & { return $*javaclassname.swigToEnum($jnicall); } // enum SWIGTYPE typemaps %typemap(jni) enum SWIGTYPE "jint" %typemap(jtype) enum SWIGTYPE "int" %typemap(jstype) enum SWIGTYPE "$javaclassname" %typemap(in) enum SWIGTYPE %{ $1 = ($1_ltype)$input; %} %typemap(out) enum SWIGTYPE %{ $result = (jint)$1; %} %typemap(directorout) enum SWIGTYPE %{ $result = ($1_ltype)$input; %} %typemap(directorin, descriptor="L$packagepath/$javaclassname;") enum SWIGTYPE "$input = (jint) $1;" %typemap(javadirectorin) enum SWIGTYPE "$javaclassname.swigToEnum($jniinput)" %typemap(javadirectorout) enum SWIGTYPE "($javacall).swigValue()" %typecheck(SWIG_TYPECHECK_POINTER) enum SWIGTYPE "" %typemap(throws) enum SWIGTYPE %{ (void)$1; SWIG_JavaThrowException(jenv, SWIG_JavaRuntimeException, "C++ $1_type exception thrown"); %} %typemap(javain) enum SWIGTYPE "$javainput.swigValue()" %typemap(javaout) enum SWIGTYPE { return $javaclassname.swigToEnum($jnicall); } // '$static' will be replaced with either 'static' or nothing depending on whether the enum is an inner Java class or not %typemap(javaclassmodifiers) enum SWIGTYPE "public final $static class" %typemap(javabase) enum SWIGTYPE "" %typemap(javacode) enum SWIGTYPE "" %typemap(javaimports) enum SWIGTYPE "" %typemap(javainterfaces) enum SWIGTYPE "" /* * The swigToEnum method is used to find the Java enum from a C++ enum integer value. The default one here takes * advantage of the fact that most enums do not have initial values specified, so the lookup is fast. If initial * values are specified then a lengthy linear search through all possible enums might occur. Specific typemaps could be * written to possibly optimise this lookup by taking advantage of characteristics peculiar to the targeted enum. * The special variable, $enumvalues, is replaced with a comma separated list of all the enum values. */ %typemap(javabody) enum SWIGTYPE %{ public final int swigValue() { return swigValue; } public String toString() { return swigName; } public static $javaclassname swigToEnum(int swigValue) { if (swigValue < swigValues.length && swigValue >= 0 && swigValues[swigValue].swigValue == swigValue) return swigValues[swigValue]; for (int i = 0; i < swigValues.length; i++) if (swigValues[i].swigValue == swigValue) return swigValues[i]; throw new IllegalArgumentException("No enum " + $javaclassname.class + " with value " + swigValue); } private $javaclassname(String swigName) { this.swigName = swigName; this.swigValue = swigNext++; } private $javaclassname(String swigName, int swigValue) { this.swigName = swigName; this.swigValue = swigValue; swigNext = swigValue+1; } private $javaclassname(String swigName, $javaclassname swigEnum) { this.swigName = swigName; this.swigValue = swigEnum.swigValue; swigNext = this.swigValue+1; } private static $javaclassname[] swigValues = { $enumvalues }; private static int swigNext = 0; private final int swigValue; private final String swigName; %} %javaenum(typesafe); swig-4.0.1/Lib/java/java.swg0000644000175000017500000014457213527063513015457 0ustar williamwilliam/* ----------------------------------------------------------------------------- * java.swg * * Java typemaps * ----------------------------------------------------------------------------- */ %include /* The jni, jtype and jstype typemaps work together and so there should be one of each. * The jni typemap contains the JNI type used in the JNI (C/C++) code. * The jtype typemap contains the Java type used in the JNI intermediary class. * The jstype typemap contains the Java type used in the Java proxy classes, type wrapper classes and module class. */ /* Fragments */ %fragment("SWIG_PackData", "header") { /* Pack binary data into a string */ SWIGINTERN char * SWIG_PackData(char *c, void *ptr, size_t sz) { static const char hex[17] = "0123456789abcdef"; const unsigned char *u = (unsigned char *) ptr; const unsigned char *eu = u + sz; for (; u != eu; ++u) { unsigned char uu = *u; *(c++) = hex[(uu & 0xf0) >> 4]; *(c++) = hex[uu & 0xf]; } return c; } } %fragment("SWIG_UnPackData", "header") { /* Unpack binary data from a string */ SWIGINTERN const char * SWIG_UnpackData(const char *c, void *ptr, size_t sz) { unsigned char *u = (unsigned char *) ptr; const unsigned char *eu = u + sz; for (; u != eu; ++u) { char d = *(c++); unsigned char uu; if ((d >= '0') && (d <= '9')) uu = ((d - '0') << 4); else if ((d >= 'a') && (d <= 'f')) uu = ((d - ('a'-10)) << 4); else return (char *) 0; d = *(c++); if ((d >= '0') && (d <= '9')) uu |= (d - '0'); else if ((d >= 'a') && (d <= 'f')) uu |= (d - ('a'-10)); else return (char *) 0; *u = uu; } return c; } } %fragment("SWIG_JavaIntFromSize_t", "header") { /* Check for overflow converting to Java int (always signed 32-bit) from (unsigned variable-bit) size_t */ SWIGINTERN jint SWIG_JavaIntFromSize_t(size_t size) { static const jint JINT_MAX = 0x7FFFFFFF; return (size > (size_t)JINT_MAX) ? -1 : (jint)size; } } /* Primitive types */ %typemap(jni) bool, const bool & "jboolean" %typemap(jni) char, const char & "jchar" %typemap(jni) signed char, const signed char & "jbyte" %typemap(jni) unsigned char, const unsigned char & "jshort" %typemap(jni) short, const short & "jshort" %typemap(jni) unsigned short, const unsigned short & "jint" %typemap(jni) int, const int & "jint" %typemap(jni) unsigned int, const unsigned int & "jlong" %typemap(jni) long, const long & "jint" %typemap(jni) unsigned long, const unsigned long & "jlong" %typemap(jni) long long, const long long & "jlong" %typemap(jni) unsigned long long, const unsigned long long & "jobject" %typemap(jni) float, const float & "jfloat" %typemap(jni) double, const double & "jdouble" %typemap(jni) void "void" %typemap(jtype) bool, const bool & "boolean" %typemap(jtype) char, const char & "char" %typemap(jtype) signed char, const signed char & "byte" %typemap(jtype) unsigned char, const unsigned char & "short" %typemap(jtype) short, const short & "short" %typemap(jtype) unsigned short, const unsigned short & "int" %typemap(jtype) int, const int & "int" %typemap(jtype) unsigned int, const unsigned int & "long" %typemap(jtype) long, const long & "int" %typemap(jtype) unsigned long, const unsigned long & "long" %typemap(jtype) long long, const long long & "long" %typemap(jtype) unsigned long long, const unsigned long long & "java.math.BigInteger" %typemap(jtype) float, const float & "float" %typemap(jtype) double, const double & "double" %typemap(jtype) void "void" %typemap(jstype) bool, const bool & "boolean" %typemap(jstype) char, const char & "char" %typemap(jstype) signed char, const signed char & "byte" %typemap(jstype) unsigned char, const unsigned char & "short" %typemap(jstype) short, const short & "short" %typemap(jstype) unsigned short, const unsigned short & "int" %typemap(jstype) int, const int & "int" %typemap(jstype) unsigned int, const unsigned int & "long" %typemap(jstype) long, const long & "int" %typemap(jstype) unsigned long, const unsigned long & "long" %typemap(jstype) long long, const long long & "long" %typemap(jstype) unsigned long long, const unsigned long long & "java.math.BigInteger" %typemap(jstype) float, const float & "float" %typemap(jstype) double, const double & "double" %typemap(jstype) void "void" %typemap(jboxtype) bool, const bool & "Boolean" %typemap(jboxtype) char, const char & "Character" %typemap(jboxtype) signed char, const signed char & "Byte" %typemap(jboxtype) unsigned char, const unsigned char & "Short" %typemap(jboxtype) short, const short & "Short" %typemap(jboxtype) unsigned short, const unsigned short & "Integer" %typemap(jboxtype) int, const int & "Integer" %typemap(jboxtype) unsigned int, const unsigned int & "Long" %typemap(jboxtype) long, const long & "Integer" %typemap(jboxtype) unsigned long, const unsigned long & "Long" %typemap(jboxtype) long long, const long long & "Long" %typemap(jboxtype) unsigned long long, const unsigned long long & "java.math.BigInteger" %typemap(jboxtype) float, const float & "Float" %typemap(jboxtype) double, const double & "Double" %typemap(jni) char *, char *&, char[ANY], char[] "jstring" %typemap(jtype) char *, char *&, char[ANY], char[] "String" %typemap(jstype) char *, char *&, char[ANY], char[] "String" /* JNI types */ %typemap(jni) jboolean "jboolean" %typemap(jni) jchar "jchar" %typemap(jni) jbyte "jbyte" %typemap(jni) jshort "jshort" %typemap(jni) jint "jint" %typemap(jni) jlong "jlong" %typemap(jni) jfloat "jfloat" %typemap(jni) jdouble "jdouble" %typemap(jni) jstring "jstring" %typemap(jni) jobject "jobject" %typemap(jni) jbooleanArray "jbooleanArray" %typemap(jni) jcharArray "jcharArray" %typemap(jni) jbyteArray "jbyteArray" %typemap(jni) jshortArray "jshortArray" %typemap(jni) jintArray "jintArray" %typemap(jni) jlongArray "jlongArray" %typemap(jni) jfloatArray "jfloatArray" %typemap(jni) jdoubleArray "jdoubleArray" %typemap(jni) jobjectArray "jobjectArray" %typemap(jtype) jboolean "boolean" %typemap(jtype) jchar "char" %typemap(jtype) jbyte "byte" %typemap(jtype) jshort "short" %typemap(jtype) jint "int" %typemap(jtype) jlong "long" %typemap(jtype) jfloat "float" %typemap(jtype) jdouble "double" %typemap(jtype) jstring "String" %typemap(jtype) jobject "java.lang.Object" %typemap(jtype) jbooleanArray "boolean[]" %typemap(jtype) jcharArray "char[]" %typemap(jtype) jbyteArray "byte[]" %typemap(jtype) jshortArray "short[]" %typemap(jtype) jintArray "int[]" %typemap(jtype) jlongArray "long[]" %typemap(jtype) jfloatArray "float[]" %typemap(jtype) jdoubleArray "double[]" %typemap(jtype) jobjectArray "java.lang.Object[]" %typemap(jstype) jboolean "boolean" %typemap(jstype) jchar "char" %typemap(jstype) jbyte "byte" %typemap(jstype) jshort "short" %typemap(jstype) jint "int" %typemap(jstype) jlong "long" %typemap(jstype) jfloat "float" %typemap(jstype) jdouble "double" %typemap(jstype) jstring "String" %typemap(jstype) jobject "java.lang.Object" %typemap(jstype) jbooleanArray "boolean[]" %typemap(jstype) jcharArray "char[]" %typemap(jstype) jbyteArray "byte[]" %typemap(jstype) jshortArray "short[]" %typemap(jstype) jintArray "int[]" %typemap(jstype) jlongArray "long[]" %typemap(jstype) jfloatArray "float[]" %typemap(jstype) jdoubleArray "double[]" %typemap(jstype) jobjectArray "java.lang.Object[]" /* Non primitive types */ %typemap(jni) SWIGTYPE "jlong" %typemap(jtype) SWIGTYPE "long" %typemap(jstype) SWIGTYPE "$&javaclassname" %typemap(jboxtype) SWIGTYPE "$typemap(jstype, $1_type)" %typemap(jni) SWIGTYPE [] "jlong" %typemap(jtype) SWIGTYPE [] "long" %typemap(jstype) SWIGTYPE [] "$javaclassname" %typemap(jni) SWIGTYPE * "jlong" %typemap(jtype) SWIGTYPE * "long" %typemap(jstype) SWIGTYPE * "$javaclassname" %typemap(jni) SWIGTYPE & "jlong" %typemap(jtype) SWIGTYPE & "long" %typemap(jstype) SWIGTYPE & "$javaclassname" %typemap(jni) SWIGTYPE && "jlong" %typemap(jtype) SWIGTYPE && "long" %typemap(jstype) SWIGTYPE && "$javaclassname" /* pointer to a class member */ %typemap(jni) SWIGTYPE (CLASS::*) "jstring" %typemap(jtype) SWIGTYPE (CLASS::*) "String" %typemap(jstype) SWIGTYPE (CLASS::*) "$javaclassname" /* The following are the in, out, freearg, argout typemaps. These are the JNI code generating typemaps for converting from Java to C and visa versa. */ /* primitive types */ %typemap(in) bool %{ $1 = $input ? true : false; %} %typemap(directorout) bool %{ $result = $input ? true : false; %} %typemap(javadirectorin) bool "$jniinput" %typemap(javadirectorout) bool "$javacall" %typemap(in) char, signed char, unsigned char, short, unsigned short, int, unsigned int, long, unsigned long, long long, float, double %{ $1 = ($1_ltype)$input; %} %typemap(directorout) char, signed char, unsigned char, short, unsigned short, int, unsigned int, long, unsigned long, long long, float, double %{ $result = ($1_ltype)$input; %} %typemap(directorin, descriptor="Z") bool "$input = (jboolean) $1;" %typemap(directorin, descriptor="C") char "$input = (jint) $1;" %typemap(directorin, descriptor="B") signed char "$input = (jbyte) $1;" %typemap(directorin, descriptor="S") unsigned char "$input = (jshort) $1;" %typemap(directorin, descriptor="S") short "$input = (jshort) $1;" %typemap(directorin, descriptor="I") unsigned short "$input = (jint) $1;" %typemap(directorin, descriptor="I") int "$input = (jint) $1;" %typemap(directorin, descriptor="J") unsigned int "$input = (jlong) $1;" %typemap(directorin, descriptor="I") long "$input = (jint) $1;" %typemap(directorin, descriptor="J") unsigned long "$input = (jlong) $1;" %typemap(directorin, descriptor="J") long long "$input = (jlong) $1;" %typemap(directorin, descriptor="F") float "$input = (jfloat) $1;" %typemap(directorin, descriptor="D") double "$input = (jdouble) $1;" %typemap(javadirectorin) char, signed char, unsigned char, short, unsigned short, int, unsigned int, long, unsigned long, long long, float, double "$jniinput" %typemap(javadirectorout) char, signed char, unsigned char, short, unsigned short, int, unsigned int, long, unsigned long, long long, float, double "$javacall" %typemap(out) bool %{ $result = (jboolean)$1; %} %typemap(out) char %{ $result = (jchar)$1; %} %typemap(out) signed char %{ $result = (jbyte)$1; %} %typemap(out) unsigned char %{ $result = (jshort)$1; %} %typemap(out) short %{ $result = (jshort)$1; %} %typemap(out) unsigned short %{ $result = (jint)$1; %} %typemap(out) int %{ $result = (jint)$1; %} %typemap(out) unsigned int %{ $result = (jlong)$1; %} %typemap(out) long %{ $result = (jint)$1; %} %typemap(out) unsigned long %{ $result = (jlong)$1; %} %typemap(out) long long %{ $result = (jlong)$1; %} %typemap(out) float %{ $result = (jfloat)$1; %} %typemap(out) double %{ $result = (jdouble)$1; %} /* unsigned long long */ /* Convert from BigInteger using the toByteArray member function */ %typemap(in) unsigned long long { jclass clazz; jmethodID mid; jbyteArray ba; jbyte* bae; jsize sz; int i; if (!$input) { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "BigInteger null"); return $null; } clazz = JCALL1(GetObjectClass, jenv, $input); mid = JCALL3(GetMethodID, jenv, clazz, "toByteArray", "()[B"); ba = (jbyteArray)JCALL2(CallObjectMethod, jenv, $input, mid); bae = JCALL2(GetByteArrayElements, jenv, ba, 0); sz = JCALL1(GetArrayLength, jenv, ba); $1 = 0; if (sz > 0) { $1 = ($1_type)(signed char)bae[0]; for(i=1; i 0) { $result = ($1_type)(signed char)bae[0]; for(i=1; i", "([B)V"); jobject bigint; int i; bae[0] = 0; for(i=1; i<9; i++ ) { bae[i] = (jbyte)($1>>8*(8-i)); } JCALL3(ReleaseByteArrayElements, jenv, ba, bae, 0); bigint = JCALL3(NewObject, jenv, clazz, mid, ba); JCALL1(DeleteLocalRef, jenv, ba); $result = bigint; } /* Convert to BigInteger (see out typemap) */ %typemap(directorin, descriptor="Ljava/math/BigInteger;", noblock=1) unsigned long long, const unsigned long long & { { jbyteArray ba = JCALL1(NewByteArray, jenv, 9); jbyte* bae = JCALL2(GetByteArrayElements, jenv, ba, 0); jclass clazz = JCALL1(FindClass, jenv, "java/math/BigInteger"); jmethodID mid = JCALL3(GetMethodID, jenv, clazz, "", "([B)V"); jobject bigint; int swig_i; bae[0] = 0; for(swig_i=1; swig_i<9; swig_i++ ) { bae[swig_i] = (jbyte)($1>>8*(8-swig_i)); } JCALL3(ReleaseByteArrayElements, jenv, ba, bae, 0); bigint = JCALL3(NewObject, jenv, clazz, mid, ba); JCALL1(DeleteLocalRef, jenv, ba); $input = bigint; } Swig::LocalRefGuard $1_refguard(jenv, $input); } %typemap(javadirectorin) unsigned long long "$jniinput" %typemap(javadirectorout) unsigned long long "$javacall" /* char * - treat as String */ %typemap(in, noblock=1) char * { $1 = 0; if ($input) { $1 = ($1_ltype)JCALL2(GetStringUTFChars, jenv, $input, 0); if (!$1) return $null; } } %typemap(directorout, noblock=1, warning=SWIGWARN_TYPEMAP_DIRECTOROUT_PTR_MSG) char * { $1 = 0; if ($input) { $result = ($1_ltype)JCALL2(GetStringUTFChars, jenv, $input, 0); if (!$result) return $null; } } %typemap(directorin, descriptor="Ljava/lang/String;", noblock=1) char * { $input = 0; if ($1) { $input = JCALL1(NewStringUTF, jenv, (const char *)$1); if (!$input) return $null; } Swig::LocalRefGuard $1_refguard(jenv, $input); } %typemap(freearg, noblock=1) char * { if ($1) JCALL2(ReleaseStringUTFChars, jenv, $input, (const char *)$1); } %typemap(out, noblock=1) char * { if ($1) $result = JCALL1(NewStringUTF, jenv, (const char *)$1); } %typemap(javadirectorin) char * "$jniinput" %typemap(javadirectorout) char * "$javacall" /* char *& - treat as String */ %typemap(in, noblock=1) char *& ($*1_ltype temp = 0) { $1 = 0; if ($input) { temp = ($*1_ltype)JCALL2(GetStringUTFChars, jenv, $input, 0); if (!temp) return $null; } $1 = &temp; } %typemap(freearg, noblock=1) char *& { if ($1 && *$1) JCALL2(ReleaseStringUTFChars, jenv, $input, (const char *)*$1); } %typemap(out, noblock=1) char *& { if (*$1) $result = JCALL1(NewStringUTF, jenv, (const char *)*$1); } %typemap(out) void "" %typemap(javadirectorin) void "$jniinput" %typemap(javadirectorout) void "$javacall" %typemap(directorin, descriptor="V") void "" /* primitive types by reference */ %typemap(in) const bool & ($*1_ltype temp) %{ temp = $input ? true : false; $1 = &temp; %} %typemap(directorout,warning=SWIGWARN_TYPEMAP_THREAD_UNSAFE_MSG) const bool & %{ static $*1_ltype temp; temp = $input ? true : false; $result = &temp; %} %typemap(javadirectorin) const bool & "$jniinput" %typemap(javadirectorout) const bool & "$javacall" %typemap(in) const char & ($*1_ltype temp), const signed char & ($*1_ltype temp), const unsigned char & ($*1_ltype temp), const short & ($*1_ltype temp), const unsigned short & ($*1_ltype temp), const int & ($*1_ltype temp), const unsigned int & ($*1_ltype temp), const long & ($*1_ltype temp), const unsigned long & ($*1_ltype temp), const long long & ($*1_ltype temp), const float & ($*1_ltype temp), const double & ($*1_ltype temp) %{ temp = ($*1_ltype)$input; $1 = &temp; %} %typemap(directorout,warning=SWIGWARN_TYPEMAP_THREAD_UNSAFE_MSG) const char &, const signed char &, const unsigned char &, const short &, const unsigned short &, const int &, const unsigned int &, const long &, const unsigned long &, const long long &, const float &, const double & %{ static $*1_ltype temp; temp = ($*1_ltype)$input; $result = &temp; %} %typemap(directorin, descriptor="Z") const bool & "$input = (jboolean)$1;" %typemap(directorin, descriptor="C") const char & "$input = (jchar)$1;" %typemap(directorin, descriptor="B") const signed char & "$input = (jbyte)$1;" %typemap(directorin, descriptor="S") const unsigned char & "$input = (jshort)$1;" %typemap(directorin, descriptor="S") const short & "$input = (jshort)$1;" %typemap(directorin, descriptor="I") const unsigned short & "$input = (jint)$1;" %typemap(directorin, descriptor="I") const int & "$input = (jint)$1;" %typemap(directorin, descriptor="J") const unsigned int & "$input = (jlong)$1;" %typemap(directorin, descriptor="I") const long & "$input = (jint)$1;" %typemap(directorin, descriptor="J") const unsigned long & "$input = (jlong)$1;" %typemap(directorin, descriptor="J") const long long & "$input = (jlong)$1;" %typemap(directorin, descriptor="F") const float & "$input = (jfloat)$1;" %typemap(directorin, descriptor="D") const double & "$input = (jdouble)$1;" %typemap(javadirectorin) const char & ($*1_ltype temp), const signed char & ($*1_ltype temp), const unsigned char & ($*1_ltype temp), const short & ($*1_ltype temp), const unsigned short & ($*1_ltype temp), const int & ($*1_ltype temp), const unsigned int & ($*1_ltype temp), const long & ($*1_ltype temp), const unsigned long & ($*1_ltype temp), const long long & ($*1_ltype temp), const float & ($*1_ltype temp), const double & ($*1_ltype temp) "$jniinput" %typemap(javadirectorout) const char & ($*1_ltype temp), const signed char & ($*1_ltype temp), const unsigned char & ($*1_ltype temp), const short & ($*1_ltype temp), const unsigned short & ($*1_ltype temp), const int & ($*1_ltype temp), const unsigned int & ($*1_ltype temp), const long & ($*1_ltype temp), const unsigned long & ($*1_ltype temp), const long long & ($*1_ltype temp), const float & ($*1_ltype temp), const double & ($*1_ltype temp) "$javacall" %typemap(out) const bool & %{ $result = (jboolean)*$1; %} %typemap(out) const char & %{ $result = (jchar)*$1; %} %typemap(out) const signed char & %{ $result = (jbyte)*$1; %} %typemap(out) const unsigned char & %{ $result = (jshort)*$1; %} %typemap(out) const short & %{ $result = (jshort)*$1; %} %typemap(out) const unsigned short & %{ $result = (jint)*$1; %} %typemap(out) const int & %{ $result = (jint)*$1; %} %typemap(out) const unsigned int & %{ $result = (jlong)*$1; %} %typemap(out) const long & %{ $result = (jint)*$1; %} %typemap(out) const unsigned long & %{ $result = (jlong)*$1; %} %typemap(out) const long long & %{ $result = (jlong)*$1; %} %typemap(out) const float & %{ $result = (jfloat)*$1; %} %typemap(out) const double & %{ $result = (jdouble)*$1; %} /* const unsigned long long & */ /* Similar to unsigned long long */ %typemap(in) const unsigned long long & ($*1_ltype temp) { jclass clazz; jmethodID mid; jbyteArray ba; jbyte* bae; jsize sz; int i; if (!$input) { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "BigInteger null"); return $null; } clazz = JCALL1(GetObjectClass, jenv, $input); mid = JCALL3(GetMethodID, jenv, clazz, "toByteArray", "()[B"); ba = (jbyteArray)JCALL2(CallObjectMethod, jenv, $input, mid); bae = JCALL2(GetByteArrayElements, jenv, ba, 0); sz = JCALL1(GetArrayLength, jenv, ba); $1 = &temp; temp = 0; if (sz > 0) { temp = ($*1_ltype)(signed char)bae[0]; for(i=1; i 0) { temp = ($*1_ltype)(signed char)bae[0]; for(i=1; i", "([B)V"); jobject bigint; int i; bae[0] = 0; for(i=1; i<9; i++ ) { bae[i] = (jbyte)(*$1>>8*(8-i)); } JCALL3(ReleaseByteArrayElements, jenv, ba, bae, 0); bigint = JCALL3(NewObject, jenv, clazz, mid, ba); JCALL1(DeleteLocalRef, jenv, ba); $result = bigint; } %typemap(javadirectorin) const unsigned long long & "$jniinput" %typemap(javadirectorout) const unsigned long long & "$javacall" /* Default handling. Object passed by value. Convert to a pointer */ %typemap(in) SWIGTYPE ($&1_type argp) %{ argp = *($&1_ltype*)&$input; if (!argp) { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "Attempt to dereference null $1_type"); return $null; } $1 = *argp; %} %typemap(directorout) SWIGTYPE ($&1_type argp) %{ argp = *($&1_ltype*)&$input; if (!argp) { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "Unexpected null return for type $1_type"); return $null; } $result = *argp; %} %typemap(out) SWIGTYPE #ifdef __cplusplus %{ *($&1_ltype*)&$result = new $1_ltype((const $1_ltype &)$1); %} #else { $&1_ltype $1ptr = ($&1_ltype) malloc(sizeof($1_ltype)); memmove($1ptr, &$1, sizeof($1_type)); *($&1_ltype*)&$result = $1ptr; } #endif %typemap(directorin,descriptor="L$packagepath/$&javaclassname;") SWIGTYPE %{ $input = 0; *(($&1_ltype*)&$input) = new $1_ltype((const $1_ltype &)$1); %} %typemap(javadirectorin) SWIGTYPE "new $&javaclassname($jniinput, true)" %typemap(javadirectorout) SWIGTYPE "$&javaclassname.getCPtr($javacall)" /* Generic pointers and references */ %typemap(in) SWIGTYPE * %{ $1 = *($&1_ltype)&$input; %} %typemap(in, fragment="SWIG_UnPackData") SWIGTYPE (CLASS::*) { const char *temp = 0; if ($input) { temp = JCALL2(GetStringUTFChars, jenv, $input, 0); if (!temp) return $null; } SWIG_UnpackData(temp, (void *)&$1, sizeof($1)); } %typemap(in) SWIGTYPE & %{ $1 = *($&1_ltype)&$input; if (!$1) { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "$1_type reference is null"); return $null; } %} %typemap(in) SWIGTYPE && %{ $1 = *($&1_ltype)&$input; if (!$1) { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "$1_type reference is null"); return $null; } %} %typemap(out) SWIGTYPE * %{ *($&1_ltype)&$result = $1; %} %typemap(out, fragment="SWIG_PackData", noblock=1) SWIGTYPE (CLASS::*) { char buf[128]; char *data = SWIG_PackData(buf, (void *)&$1, sizeof($1)); *data = '\0'; $result = JCALL1(NewStringUTF, jenv, buf); } %typemap(out) SWIGTYPE & %{ *($&1_ltype)&$result = $1; %} %typemap(out) SWIGTYPE && %{ *($&1_ltype)&$result = $1; %} %typemap(directorout, warning=SWIGWARN_TYPEMAP_DIRECTOROUT_PTR_MSG) SWIGTYPE * %{ $result = *($&1_ltype)&$input; %} %typemap(directorout, warning=SWIGWARN_TYPEMAP_DIRECTOROUT_PTR_MSG) SWIGTYPE (CLASS::*) %{ $result = *($&1_ltype)&$input; %} %typemap(directorin,descriptor="L$packagepath/$javaclassname;") SWIGTYPE * %{ *(($&1_ltype)&$input) = ($1_ltype) $1; %} %typemap(directorin,descriptor="L$packagepath/$javaclassname;") SWIGTYPE (CLASS::*) %{ *(($&1_ltype)&$input) = ($1_ltype) $1; %} %typemap(directorout, warning=SWIGWARN_TYPEMAP_DIRECTOROUT_PTR_MSG) SWIGTYPE & %{ if (!$input) { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "Unexpected null return for type $1_type"); return $null; } $result = *($&1_ltype)&$input; %} %typemap(directorout, warning=SWIGWARN_TYPEMAP_DIRECTOROUT_PTR_MSG) SWIGTYPE && %{ if (!$input) { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "Unexpected null return for type $1_type"); return $null; } $result = *($&1_ltype)&$input; %} %typemap(directorin,descriptor="L$packagepath/$javaclassname;") SWIGTYPE & %{ *($&1_ltype)&$input = ($1_ltype) &$1; %} %typemap(directorin,descriptor="L$packagepath/$javaclassname;") SWIGTYPE && %{ *($&1_ltype)&$input = ($1_ltype) &$1; %} %typemap(javadirectorin) SWIGTYPE *, SWIGTYPE (CLASS::*) "($jniinput == 0) ? null : new $javaclassname($jniinput, false)" %typemap(javadirectorin) SWIGTYPE & "new $javaclassname($jniinput, false)" %typemap(javadirectorin) SWIGTYPE && "new $javaclassname($jniinput, false)" %typemap(javadirectorout) SWIGTYPE *, SWIGTYPE (CLASS::*), SWIGTYPE &, SWIGTYPE && "$javaclassname.getCPtr($javacall)" /* Default array handling */ %typemap(in) SWIGTYPE [] %{ $1 = *($&1_ltype)&$input; %} %typemap(out) SWIGTYPE [] %{ *($&1_ltype)&$result = $1; %} %typemap(freearg) SWIGTYPE [ANY], SWIGTYPE [] "" /* char arrays - treat as String */ %typemap(in, noblock=1) char[ANY], char[] { $1 = 0; if ($input) { $1 = ($1_ltype)JCALL2(GetStringUTFChars, jenv, $input, 0); if (!$1) return $null; } } %typemap(directorout, noblock=1) char[ANY], char[] { $1 = 0; if ($input) { $result = ($1_ltype)JCALL2(GetStringUTFChars, jenv, $input, 0); if (!$result) return $null; } } %typemap(directorin, descriptor="Ljava/lang/String;", noblock=1) char[ANY], char[] { $input = 0; if ($1) { $input = JCALL1(NewStringUTF, jenv, (const char *)$1); if (!$input) return $null; } Swig::LocalRefGuard $1_refguard(jenv, $input); } %typemap(argout) char[ANY], char[] "" %typemap(freearg, noblock=1) char[ANY], char[] { if ($1) JCALL2(ReleaseStringUTFChars, jenv, $input, (const char *)$1); } %typemap(out, noblock=1) char[ANY], char[] { if ($1) $result = JCALL1(NewStringUTF, jenv, (const char *)$1); } %typemap(javadirectorin) char[ANY], char[] "$jniinput" %typemap(javadirectorout) char[ANY], char[] "$javacall" /* JNI types */ %typemap(in) jboolean, jchar, jbyte, jshort, jint, jlong, jfloat, jdouble, jstring, jobject, jbooleanArray, jcharArray, jbyteArray, jshortArray, jintArray, jlongArray, jfloatArray, jdoubleArray, jobjectArray %{ $1 = $input; %} %typemap(directorout) jboolean, jchar, jbyte, jshort, jint, jlong, jfloat, jdouble, jstring, jobject, jbooleanArray, jcharArray, jbyteArray, jshortArray, jintArray, jlongArray, jfloatArray, jdoubleArray, jobjectArray %{ $result = $input; %} %typemap(out) jboolean, jchar, jbyte, jshort, jint, jlong, jfloat, jdouble, jstring, jobject, jbooleanArray, jcharArray, jbyteArray, jshortArray, jintArray, jlongArray, jfloatArray, jdoubleArray, jobjectArray %{ $result = $1; %} %typemap(directorin,descriptor="Z") jboolean "$input = $1;" %typemap(directorin,descriptor="C") jchar "$input = $1;" %typemap(directorin,descriptor="B") jbyte "$input = $1;" %typemap(directorin,descriptor="S") jshort "$input = $1;" %typemap(directorin,descriptor="I") jint "$input = $1;" %typemap(directorin,descriptor="J") jlong "$input = $1;" %typemap(directorin,descriptor="F") jfloat "$input = $1;" %typemap(directorin,descriptor="D") jdouble "$input = $1;" %typemap(directorin,descriptor="Ljava/lang/String;") jstring "$input = $1;" %typemap(directorin,descriptor="Ljava/lang/Object;",nouse="1") jobject "$input = $1;" %typemap(directorin,descriptor="[Z") jbooleanArray "$input = $1;" %typemap(directorin,descriptor="[C") jcharArray "$input = $1;" %typemap(directorin,descriptor="[B") jbyteArray "$input = $1;" %typemap(directorin,descriptor="[S") jshortArray "$input = $1;" %typemap(directorin,descriptor="[I") jintArray "$input = $1;" %typemap(directorin,descriptor="[J") jlongArray "$input = $1;" %typemap(directorin,descriptor="[F") jfloatArray "$input = $1;" %typemap(directorin,descriptor="[D") jdoubleArray "$input = $1;" %typemap(directorin,descriptor="[Ljava/lang/Object;",nouse="1") jobjectArray "$input = $1;" %typemap(javadirectorin) jboolean, jchar, jbyte, jshort, jint, jlong, jfloat, jdouble, jstring, jobject, jbooleanArray, jcharArray, jbyteArray, jshortArray, jintArray, jlongArray, jfloatArray, jdoubleArray, jobjectArray "$jniinput" %typemap(javadirectorout) jboolean, jchar, jbyte, jshort, jint, jlong, jfloat, jdouble, jstring, jobject, jbooleanArray, jcharArray, jbyteArray, jshortArray, jintArray, jlongArray, jfloatArray, jdoubleArray, jobjectArray "$javacall" /* Typecheck typemaps - The purpose of these is merely to issue a warning for overloaded C++ functions * that cannot be overloaded in Java as more than one C++ type maps to a single Java type */ %typecheck(SWIG_TYPECHECK_BOOL) /* Java boolean */ jboolean, bool, const bool & "" %typecheck(SWIG_TYPECHECK_CHAR) /* Java char */ jchar, char, const char & "" %typecheck(SWIG_TYPECHECK_INT8) /* Java byte */ jbyte, signed char, const signed char & "" %typecheck(SWIG_TYPECHECK_INT16) /* Java short */ jshort, unsigned char, short, const unsigned char &, const short & "" %typecheck(SWIG_TYPECHECK_INT32) /* Java int */ jint, unsigned short, int, long, const unsigned short &, const int &, const long & "" %typecheck(SWIG_TYPECHECK_INT64) /* Java long */ jlong, unsigned int, unsigned long, long long, const unsigned int &, const unsigned long &, const long long & "" %typecheck(SWIG_TYPECHECK_INT128) /* Java BigInteger */ unsigned long long, const unsigned long long & "" %typecheck(SWIG_TYPECHECK_FLOAT) /* Java float */ jfloat, float, const float & "" %typecheck(SWIG_TYPECHECK_DOUBLE) /* Java double */ jdouble, double, const double & "" %typecheck(SWIG_TYPECHECK_STRING) /* Java String */ jstring, char *, char *&, char[ANY], char [] "" %typecheck(SWIG_TYPECHECK_BOOL_ARRAY) /* Java boolean[] */ jbooleanArray "" %typecheck(SWIG_TYPECHECK_CHAR_ARRAY) /* Java char[] */ jcharArray "" %typecheck(SWIG_TYPECHECK_INT8_ARRAY) /* Java byte[] */ jbyteArray "" %typecheck(SWIG_TYPECHECK_INT16_ARRAY) /* Java short[] */ jshortArray "" %typecheck(SWIG_TYPECHECK_INT32_ARRAY) /* Java int[] */ jintArray "" %typecheck(SWIG_TYPECHECK_INT64_ARRAY) /* Java long[] */ jlongArray "" %typecheck(SWIG_TYPECHECK_FLOAT_ARRAY) /* Java float[] */ jfloatArray "" %typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY) /* Java double[] */ jdoubleArray "" %typecheck(SWIG_TYPECHECK_OBJECT_ARRAY) /* Java jobject[] */ jobjectArray "" %typecheck(SWIG_TYPECHECK_POINTER) /* Default */ SWIGTYPE, SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE *const&, SWIGTYPE [], SWIGTYPE (CLASS::*) "" /* Exception handling */ %typemap(throws) int, long, short, unsigned int, unsigned long, unsigned short %{ char error_msg[256]; sprintf(error_msg, "C++ $1_type exception thrown, value: %d", $1); SWIG_JavaThrowException(jenv, SWIG_JavaRuntimeException, error_msg); return $null; %} %typemap(throws) SWIGTYPE, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE *, SWIGTYPE [], SWIGTYPE [ANY] %{ (void)$1; SWIG_JavaThrowException(jenv, SWIG_JavaRuntimeException, "C++ $1_type exception thrown"); return $null; %} %typemap(throws) char * %{ SWIG_JavaThrowException(jenv, SWIG_JavaRuntimeException, $1); return $null; %} /* For methods to raise/throw the original Java exception thrown in a director method */ %typemap(throws) Swig::DirectorException %{ $1.throwException(jenv); return $null; %} /* Java to C++ DirectorException should already be handled. Suppress warning and do nothing in the event a user specifies a global: %catches(Swig::DirectorException); */ %typemap(directorthrows) Swig::DirectorException "" /* Typemaps for code generation in proxy classes and Java type wrapper classes */ /* The javain typemap is used for converting function parameter types from the type * used in the proxy, module or type wrapper class to the type used in the JNI class. */ %typemap(javain) bool, const bool &, char, const char &, signed char, const signed char &, unsigned char, const unsigned char &, short, const short &, unsigned short, const unsigned short &, int, const int &, unsigned int, const unsigned int &, long, const long &, unsigned long, const unsigned long &, long long, const long long &, unsigned long long, const unsigned long long &, float, const float &, double, const double & "$javainput" %typemap(javain) char *, char *&, char[ANY], char[] "$javainput" %typemap(javain) jboolean, jchar, jbyte, jshort, jint, jlong, jfloat, jdouble, jstring, jobject, jbooleanArray, jcharArray, jbyteArray, jshortArray, jintArray, jlongArray, jfloatArray, jdoubleArray, jobjectArray "$javainput" %typemap(javain) SWIGTYPE "$&javaclassname.getCPtr($javainput)" %typemap(javain) SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE [] "$javaclassname.getCPtr($javainput)" %typemap(javain) SWIGTYPE (CLASS::*) "$javaclassname.getCMemberPtr($javainput)" /* The javaout typemap is used for converting function return types from the return type * used in the JNI class to the type returned by the proxy, module or type wrapper class. */ %typemap(javaout) bool, const bool &, char, const char &, signed char, const signed char &, unsigned char, const unsigned char &, short, const short &, unsigned short, const unsigned short &, int, const int &, unsigned int, const unsigned int &, long, const long &, unsigned long, const unsigned long &, long long, const long long &, unsigned long long, const unsigned long long &, float, const float &, double, const double & { return $jnicall; } %typemap(javaout) char *, char *&, char[ANY], char[] { return $jnicall; } %typemap(javaout) jboolean, jchar, jbyte, jshort, jint, jlong, jfloat, jdouble, jstring, jobject, jbooleanArray, jcharArray, jbyteArray, jshortArray, jintArray, jlongArray, jfloatArray, jdoubleArray, jobjectArray { return $jnicall; } %typemap(javaout) void { $jnicall; } %typemap(javaout) SWIGTYPE { return new $&javaclassname($jnicall, true); } %typemap(javaout) SWIGTYPE & { return new $javaclassname($jnicall, $owner); } %typemap(javaout) SWIGTYPE && { return new $javaclassname($jnicall, $owner); } %typemap(javaout) SWIGTYPE *, SWIGTYPE [] { long cPtr = $jnicall; return (cPtr == 0) ? null : new $javaclassname(cPtr, $owner); } %typemap(javaout) SWIGTYPE (CLASS::*) { String cMemberPtr = $jnicall; return (cMemberPtr == null) ? null : new $javaclassname(cMemberPtr, $owner); } /* Pointer reference typemaps */ %typemap(jni) SWIGTYPE *const& "jlong" %typemap(jtype) SWIGTYPE *const& "long" %typemap(jstype) SWIGTYPE *const& "$*javaclassname" %typemap(javain) SWIGTYPE *const& "$*javaclassname.getCPtr($javainput)" %typemap(javaout) SWIGTYPE *const& { long cPtr = $jnicall; return (cPtr == 0) ? null : new $*javaclassname(cPtr, $owner); } %typemap(in) SWIGTYPE *const& ($*1_ltype temp = 0) %{ temp = *($1_ltype)&$input; $1 = ($1_ltype)&temp; %} %typemap(out) SWIGTYPE *const& %{ *($1_ltype)&$result = *$1; %} %typemap(directorin,descriptor="L$packagepath/$*javaclassname;") SWIGTYPE *const& %{ *(($1_ltype)&$input) = ($*1_ltype) $1; %} %typemap(directorout, warning=SWIGWARN_TYPEMAP_THREAD_UNSAFE_MSG) SWIGTYPE *const& %{ static $*1_ltype swig_temp; swig_temp = *($1_ltype)&$input; $result = &swig_temp; %} %typemap(javadirectorin) SWIGTYPE *const& "($jniinput == 0) ? null : new $*javaclassname($jniinput, false)" %typemap(javadirectorout) SWIGTYPE *const& "$*javaclassname.getCPtr($javacall)" /* Typemaps used for the generation of proxy and type wrapper class code */ %typemap(javabase) SWIGTYPE, SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE [], SWIGTYPE (CLASS::*) "" %typemap(javaclassmodifiers) SWIGTYPE, SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE [], SWIGTYPE (CLASS::*) "public class" %typemap(javacode) SWIGTYPE, SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE [], SWIGTYPE (CLASS::*) "" %typemap(javaimports) SWIGTYPE, SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE [], SWIGTYPE (CLASS::*) "" %typemap(javainterfaces) SWIGTYPE, SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE [], SWIGTYPE (CLASS::*) "" /* javabody typemaps */ %define SWIG_JAVABODY_METHODS(PTRCTOR_VISIBILITY, CPTR_VISIBILITY, TYPE...) SWIG_JAVABODY_PROXY(PTRCTOR_VISIBILITY, CPTR_VISIBILITY, TYPE) %enddef // legacy name %define SWIG_JAVABODY_PROXY(PTRCTOR_VISIBILITY, CPTR_VISIBILITY, TYPE...) // Base proxy classes %typemap(javabody) TYPE %{ private transient long swigCPtr; protected transient boolean swigCMemOwn; PTRCTOR_VISIBILITY $javaclassname(long cPtr, boolean cMemoryOwn) { swigCMemOwn = cMemoryOwn; swigCPtr = cPtr; } CPTR_VISIBILITY static long getCPtr($javaclassname obj) { return (obj == null) ? 0 : obj.swigCPtr; } %} // Derived proxy classes %typemap(javabody_derived) TYPE %{ private transient long swigCPtr; PTRCTOR_VISIBILITY $javaclassname(long cPtr, boolean cMemoryOwn) { super($imclassname.$javaclazznameSWIGUpcast(cPtr), cMemoryOwn); swigCPtr = cPtr; } CPTR_VISIBILITY static long getCPtr($javaclassname obj) { return (obj == null) ? 0 : obj.swigCPtr; } %} %enddef %define SWIG_JAVABODY_TYPEWRAPPER(PTRCTOR_VISIBILITY, DEFAULTCTOR_VISIBILITY, CPTR_VISIBILITY, TYPE...) // Typewrapper classes %typemap(javabody) TYPE *, TYPE &, TYPE &&, TYPE [] %{ private transient long swigCPtr; PTRCTOR_VISIBILITY $javaclassname(long cPtr, @SuppressWarnings("unused") boolean futureUse) { swigCPtr = cPtr; } DEFAULTCTOR_VISIBILITY $javaclassname() { swigCPtr = 0; } CPTR_VISIBILITY static long getCPtr($javaclassname obj) { return (obj == null) ? 0 : obj.swigCPtr; } %} %typemap(javabody) TYPE (CLASS::*) %{ private transient String swigCMemberPtr; PTRCTOR_VISIBILITY $javaclassname(String cMemberPtr, @SuppressWarnings("unused") boolean futureUse) { swigCMemberPtr = cMemberPtr; } DEFAULTCTOR_VISIBILITY $javaclassname() { swigCMemberPtr = null; } CPTR_VISIBILITY static String getCMemberPtr($javaclassname obj) { return obj.swigCMemberPtr; } %} %enddef /* Set the default javabody typemaps to use protected visibility. Use the macros to change to public if using multiple modules. */ SWIG_JAVABODY_PROXY(protected, protected, SWIGTYPE) SWIG_JAVABODY_TYPEWRAPPER(protected, protected, protected, SWIGTYPE) %typemap(javafinalize) SWIGTYPE %{ @SuppressWarnings("deprecation") protected void finalize() { delete(); } %} /* * Java constructor typemaps: * * The javaconstruct typemap is inserted when a proxy class's constructor is generated. * This typemap allows control over what code is executed in the constructor as * well as specifying who owns the underlying C/C++ object. Normally, Java has * ownership and the underlying C/C++ object is deallocated when the Java object * is finalized (swigCMemOwn is true.) If swigCMemOwn is false, C/C++ is * ultimately responsible for deallocating the underlying object's memory. * * The SWIG_PROXY_CONSTRUCTOR macro defines the javaconstruct typemap for a proxy * class for a particular TYPENAME. OWNERSHIP is passed as the value of * swigCMemOwn to the pointer constructor method. WEAKREF determines which kind * of Java object reference will be used by the C++ director class (WeakGlobalRef * vs. GlobalRef.) * * The SWIG_DIRECTOR_OWNED macro sets the ownership of director-based proxy * classes and the weak reference flag to false, meaning that the underlying C++ * object will be reclaimed by C++. */ %define SWIG_PROXY_CONSTRUCTOR(OWNERSHIP, WEAKREF, TYPENAME...) %typemap(javaconstruct,directorconnect="\n $imclassname.$javaclazznamedirector_connect(this, swigCPtr, OWNERSHIP, WEAKREF);") TYPENAME { this($imcall, OWNERSHIP);$directorconnect } %enddef %define SWIG_DIRECTOR_OWNED(TYPENAME...) SWIG_PROXY_CONSTRUCTOR(true, false, TYPENAME) %enddef // Set the default for SWIGTYPE: Java owns the C/C++ object. SWIG_PROXY_CONSTRUCTOR(true, true, SWIGTYPE) %typemap(javadestruct, methodname="delete", methodmodifiers="public synchronized", parameters="") SWIGTYPE { if (swigCPtr != 0) { if (swigCMemOwn) { swigCMemOwn = false; $jnicall; } swigCPtr = 0; } } %typemap(javadestruct_derived, methodname="delete", methodmodifiers="public synchronized", parameters="") SWIGTYPE { if (swigCPtr != 0) { if (swigCMemOwn) { swigCMemOwn = false; $jnicall; } swigCPtr = 0; } super.delete(); } %typemap(directordisconnect, methodname="swigDirectorDisconnect") SWIGTYPE %{ protected void $methodname() { swigCMemOwn = false; $jnicall; } %} %typemap(directorowner_release, methodname="swigReleaseOwnership") SWIGTYPE %{ public void $methodname() { swigCMemOwn = false; $jnicall; } %} %typemap(directorowner_take, methodname="swigTakeOwnership") SWIGTYPE %{ public void $methodname() { swigCMemOwn = true; $jnicall; } %} /* Java specific directives */ #define %javaconst(flag) %feature("java:const","flag") #define %javaconstvalue(value) %feature("java:constvalue",value) #define %javaenum(wrapapproach) %feature("java:enum","wrapapproach") #define %javamethodmodifiers %feature("java:methodmodifiers") #define %javaexception(exceptionclasses) %feature("except",throws=exceptionclasses) #define %nojavaexception %feature("except","0",throws="") #define %clearjavaexception %feature("except","",throws="") #define %proxycode %insert("proxycode") %pragma(java) jniclassclassmodifiers="public class" %pragma(java) moduleclassmodifiers="public class" /* Some ANSI C typemaps */ %apply unsigned long { size_t }; %apply const unsigned long & { const size_t & }; /* Array reference typemaps */ %apply SWIGTYPE & { SWIGTYPE ((&)[ANY]) } %apply SWIGTYPE && { SWIGTYPE ((&&)[ANY]) } /* const pointers */ %apply SWIGTYPE * { SWIGTYPE *const } %apply SWIGTYPE (CLASS::*) { SWIGTYPE (CLASS::*const) } %apply SWIGTYPE & { SWIGTYPE (CLASS::*const&) } /* String & length */ %typemap(jni) (const char *STRING, size_t LENGTH) "jbyteArray" %typemap(jtype) (const char *STRING, size_t LENGTH) "byte[]" %typemap(jstype) (const char *STRING, size_t LENGTH) "byte[]" %typemap(javain) (const char *STRING, size_t LENGTH) "$javainput" %typemap(freearg) (const char *STRING, size_t LENGTH) "" %typemap(in) (const char *STRING, size_t LENGTH) { if ($input) { $1 = ($1_ltype) JCALL2(GetByteArrayElements, jenv, $input, 0); $2 = ($2_type) JCALL1(GetArrayLength, jenv, $input); } else { $1 = 0; $2 = 0; } } %typemap(argout) (const char *STRING, size_t LENGTH) { if ($input) JCALL3(ReleaseByteArrayElements, jenv, $input, (jbyte *)$1, JNI_ABORT); } %typemap(directorin, descriptor="[B", noblock=1) (const char *STRING, size_t LENGTH) { $input = 0; if ($1) { $input = JCALL1(NewByteArray, jenv, (jsize)$2); if (!$input) return $null; JCALL4(SetByteArrayRegion, jenv, $input, 0, (jsize)$2, (jbyte *)$1); } Swig::LocalRefGuard $1_refguard(jenv, $input); } %typemap(javadirectorin, descriptor="[B") (const char *STRING, size_t LENGTH) "$jniinput" %apply (const char *STRING, size_t LENGTH) { (char *STRING, size_t LENGTH) } /* Enable write-back for non-const version */ %typemap(argout) (char *STRING, size_t LENGTH) { if ($input) JCALL3(ReleaseByteArrayElements, jenv, $input, (jbyte *)$1, 0); } %typemap(directorargout, noblock=1) (char *STRING, size_t LENGTH) { if ($input && $1) JCALL4(GetByteArrayRegion, jenv, $input, 0, (jsize)$2, (jbyte *)$1); } %apply (char *STRING, size_t LENGTH) { (char *STRING, int LENGTH) } /* java keywords */ %include // Default enum handling %include swig-4.0.1/Lib/java/typemaps.i0000644000175000017500000004567113527063513016030 0ustar williamwilliam/* ----------------------------------------------------------------------------- * typemaps.i * * Pointer and reference handling typemap library * * These mappings provide support for input/output arguments and common * uses for C/C++ pointers and C++ references. * ----------------------------------------------------------------------------- */ /* INPUT typemaps -------------- These typemaps remap a C pointer or C++ reference to be an "INPUT" value which is passed by value instead of reference. The following typemaps can be applied to turn a pointer or reference into a simple input value. That is, instead of passing a pointer or reference to an object, you would use a real value instead. bool *INPUT, bool &INPUT signed char *INPUT, signed char &INPUT unsigned char *INPUT, unsigned char &INPUT short *INPUT, short &INPUT unsigned short *INPUT, unsigned short &INPUT int *INPUT, int &INPUT unsigned int *INPUT, unsigned int &INPUT long *INPUT, long &INPUT unsigned long *INPUT, unsigned long &INPUT long long *INPUT, long long &INPUT unsigned long long *INPUT, unsigned long long &INPUT float *INPUT, float &INPUT double *INPUT, double &INPUT To use these, suppose you had a C function like this : double fadd(double *a, double *b) { return *a+*b; } You could wrap it with SWIG as follows : %include double fadd(double *INPUT, double *INPUT); or you can use the %apply directive : %include %apply double *INPUT { double *a, double *b }; double fadd(double *a, double *b); In Java you could then use it like this: double answer = modulename.fadd(10.0, 20.0); There are no char *INPUT typemaps, however you can apply the signed char * typemaps instead: %include %apply signed char *INPUT {char *input}; void f(char *input); */ %define INPUT_TYPEMAP(TYPE, JNITYPE, JTYPE, JNIDESC) %typemap(jni) TYPE *INPUT, TYPE &INPUT "JNITYPE" %typemap(jtype) TYPE *INPUT, TYPE &INPUT "JTYPE" %typemap(jstype) TYPE *INPUT, TYPE &INPUT "JTYPE" %typemap(javain) TYPE *INPUT, TYPE &INPUT "$javainput" %typemap(in) TYPE *INPUT, TYPE &INPUT %{ $1 = ($1_ltype)&$input; %} %typemap(freearg) TYPE *INPUT, TYPE &INPUT "" %typemap(typecheck) TYPE *INPUT = TYPE; %typemap(typecheck) TYPE &INPUT = TYPE; %enddef INPUT_TYPEMAP(bool, jboolean, boolean, "Z"); INPUT_TYPEMAP(signed char, jbyte, byte, "B"); INPUT_TYPEMAP(unsigned char, jshort, short, "S"); INPUT_TYPEMAP(short, jshort, short, "S"); INPUT_TYPEMAP(unsigned short, jint, int, "I"); INPUT_TYPEMAP(int, jint, int, "I"); INPUT_TYPEMAP(unsigned int, jlong, long, "J"); INPUT_TYPEMAP(long, jint, int, "I"); INPUT_TYPEMAP(unsigned long, jlong, long, "J"); INPUT_TYPEMAP(long long, jlong, long, "J"); INPUT_TYPEMAP(unsigned long long, jobject, java.math.BigInteger, "Ljava/math/BigInteger;"); INPUT_TYPEMAP(float, jfloat, float, "F"); INPUT_TYPEMAP(double, jdouble, double, "D"); #undef INPUT_TYPEMAP /* Convert from BigInteger using the toByteArray member function */ /* Overrides the typemap in the INPUT_TYPEMAP macro */ %typemap(in) unsigned long long *INPUT($*1_ltype temp), unsigned long long &INPUT($*1_ltype temp) { jclass clazz; jmethodID mid; jbyteArray ba; jbyte* bae; jsize sz; int i; if (!$input) { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "BigInteger null"); return $null; } clazz = JCALL1(GetObjectClass, jenv, $input); mid = JCALL3(GetMethodID, jenv, clazz, "toByteArray", "()[B"); ba = (jbyteArray)JCALL2(CallObjectMethod, jenv, $input, mid); bae = JCALL2(GetByteArrayElements, jenv, ba, 0); sz = JCALL1(GetArrayLength, jenv, ba); temp = 0; if (sz > 0) { temp = ($*1_ltype)(signed char)bae[0]; for(i=1; i double modf(double x, double *OUTPUT); or you can use the %apply directive : %include %apply double *OUTPUT { double *ip }; double modf(double x, double *ip); The Java output of the function would be the function return value and the value in the single element array. In Java you would use it like this: double[] ptr = {0.0}; double fraction = modulename.modf(5.0,ptr); There are no char *OUTPUT typemaps, however you can apply the signed char * typemaps instead: %include %apply signed char *OUTPUT {char *output}; void f(char *output); */ /* Java BigInteger[] */ %typecheck(SWIG_TYPECHECK_INT128_ARRAY) SWIGBIGINTEGERARRAY "" %define OUTPUT_TYPEMAP(TYPE, JNITYPE, JTYPE, JAVATYPE, JNIDESC, TYPECHECKTYPE) %typemap(jni) TYPE *OUTPUT, TYPE &OUTPUT %{JNITYPE##Array%} %typemap(jtype) TYPE *OUTPUT, TYPE &OUTPUT "JTYPE[]" %typemap(jstype) TYPE *OUTPUT, TYPE &OUTPUT "JTYPE[]" %typemap(javain) TYPE *OUTPUT, TYPE &OUTPUT "$javainput" %typemap(javadirectorin) TYPE *OUTPUT, TYPE &OUTPUT "$jniinput" %typemap(javadirectorout) TYPE *OUTPUT, TYPE &OUTPUT "$javacall" %typemap(in) TYPE *OUTPUT($*1_ltype temp), TYPE &OUTPUT($*1_ltype temp) { if (!$input) { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "array null"); return $null; } if (JCALL1(GetArrayLength, jenv, $input) == 0) { SWIG_JavaThrowException(jenv, SWIG_JavaIndexOutOfBoundsException, "Array must contain at least 1 element"); return $null; } temp = ($*1_ltype)0; $1 = &temp; } %typemap(freearg) TYPE *OUTPUT, TYPE &OUTPUT "" %typemap(argout) TYPE *OUTPUT, TYPE &OUTPUT { JNITYPE jvalue = (JNITYPE)temp$argnum; JCALL4(Set##JAVATYPE##ArrayRegion, jenv, $input, 0, 1, &jvalue); } %typemap(directorin,descriptor=JNIDESC) TYPE &OUTPUT %{ $input = JCALL1(New##JAVATYPE##Array, jenv, 1); if (!$input) return $null; Swig::LocalRefGuard $1_refguard(jenv, $input); %} %typemap(directorin,descriptor=JNIDESC) TYPE *OUTPUT %{ if ($1) { $input = JCALL1(New##JAVATYPE##Array, jenv, 1); if (!$input) return $null; } Swig::LocalRefGuard $1_refguard(jenv, $input); %} %typemap(directorargout, noblock=1) TYPE &OUTPUT { JNITYPE $1_jvalue; JCALL4(Get##JAVATYPE##ArrayRegion, jenv, $input, 0, 1, &$1_jvalue); $result = ($*1_ltype)$1_jvalue; } %typemap(directorargout, noblock=1) TYPE *OUTPUT { if ($result) { JNITYPE $1_jvalue; JCALL4(Get##JAVATYPE##ArrayRegion, jenv, $input, 0, 1, &$1_jvalue); *$result = ($*1_ltype)$1_jvalue; } } %typemap(typecheck) TYPE *OUTPUT = TYPECHECKTYPE; %typemap(typecheck) TYPE &OUTPUT = TYPECHECKTYPE; %enddef OUTPUT_TYPEMAP(bool, jboolean, boolean, Boolean, "[Z", jbooleanArray); OUTPUT_TYPEMAP(signed char, jbyte, byte, Byte, "[B", jbyteArray); OUTPUT_TYPEMAP(unsigned char, jshort, short, Short, "[S", jshortArray); OUTPUT_TYPEMAP(short, jshort, short, Short, "[S", jshortArray); OUTPUT_TYPEMAP(unsigned short, jint, int, Int, "[I", jintArray); OUTPUT_TYPEMAP(int, jint, int, Int, "[I", jintArray); OUTPUT_TYPEMAP(unsigned int, jlong, long, Long, "[J", jlongArray); OUTPUT_TYPEMAP(long, jint, int, Int, "[I", jintArray); OUTPUT_TYPEMAP(unsigned long, jlong, long, Long, "[J", jlongArray); OUTPUT_TYPEMAP(long long, jlong, long, Long, "[J", jlongArray); OUTPUT_TYPEMAP(unsigned long long, jobject, java.math.BigInteger, Object, "[Ljava/math/BigInteger;", jobjectArray); OUTPUT_TYPEMAP(float, jfloat, float, Float, "[F", jfloatArray); OUTPUT_TYPEMAP(double, jdouble, double, Double, "[D", jdoubleArray); #undef OUTPUT_TYPEMAP %typemap(in) bool *OUTPUT($*1_ltype temp), bool &OUTPUT($*1_ltype temp) { if (!$input) { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "array null"); return $null; } if (JCALL1(GetArrayLength, jenv, $input) == 0) { SWIG_JavaThrowException(jenv, SWIG_JavaIndexOutOfBoundsException, "Array must contain at least 1 element"); return $null; } temp = false; $1 = &temp; } %typemap(directorargout, noblock=1) bool &OUTPUT { jboolean $1_jvalue; JCALL4(GetBooleanArrayRegion, jenv, $input, 0, 1, &$1_jvalue); $result = $1_jvalue ? true : false; } %typemap(directorargout, noblock=1) bool *OUTPUT { if ($result) { jboolean $1_jvalue; JCALL4(GetBooleanArrayRegion, jenv, $input, 0, 1, &$1_jvalue); *$result = $1_jvalue ? true : false; } } /* Convert to BigInteger - byte array holds number in 2's complement big endian format */ /* Use first element in BigInteger array for output */ /* Overrides the typemap in the OUTPUT_TYPEMAP macro */ %typemap(argout) unsigned long long *OUTPUT, unsigned long long &OUTPUT { jbyteArray ba = JCALL1(NewByteArray, jenv, 9); jbyte* bae = JCALL2(GetByteArrayElements, jenv, ba, 0); jclass clazz = JCALL1(FindClass, jenv, "java/math/BigInteger"); jmethodID mid = JCALL3(GetMethodID, jenv, clazz, "", "([B)V"); jobject bigint; int i; bae[0] = 0; for(i=1; i<9; i++ ) { bae[i] = (jbyte)(temp$argnum>>8*(8-i)); } JCALL3(ReleaseByteArrayElements, jenv, ba, bae, 0); bigint = JCALL3(NewObject, jenv, clazz, mid, ba); JCALL1(DeleteLocalRef, jenv, ba); JCALL3(SetObjectArrayElement, jenv, $input, 0, bigint); } /* INOUT typemaps -------------- Mappings for a parameter that is both an input and an output parameter The following typemaps can be applied to make a function parameter both an input and output value. This combines the behavior of both the "INPUT" and "OUTPUT" typemaps described earlier. Output values are returned as an element in a Java array. bool *INOUT, bool &INOUT signed char *INOUT, signed char &INOUT unsigned char *INOUT, unsigned char &INOUT short *INOUT, short &INOUT unsigned short *INOUT, unsigned short &INOUT int *INOUT, int &INOUT unsigned int *INOUT, unsigned int &INOUT long *INOUT, long &INOUT unsigned long *INOUT, unsigned long &INOUT long long *INOUT, long long &INOUT unsigned long long *INOUT, unsigned long long &INOUT float *INOUT, float &INOUT double *INOUT, double &INOUT For example, suppose you were trying to wrap the following function : void neg(double *x) { *x = -(*x); } You could wrap it with SWIG as follows : %include void neg(double *INOUT); or you can use the %apply directive : %include %apply double *INOUT { double *x }; void neg(double *x); This works similarly to C in that the mapping directly modifies the input value - the input must be an array with a minimum of one element. The element in the array is the input and the output is the element in the array. double x[] = {5.0}; neg(x); The implementation of the OUTPUT and INOUT typemaps is different to other languages in that other languages will return the output value as part of the function return value. This difference is due to Java being a typed language. There are no char *INOUT typemaps, however you can apply the signed char * typemaps instead: %include %apply signed char *INOUT {char *inout}; void f(char *inout); */ %define INOUT_TYPEMAP(TYPE, JNITYPE, JTYPE, JAVATYPE, JNIDESC, TYPECHECKTYPE) %typemap(jni) TYPE *INOUT, TYPE &INOUT %{JNITYPE##Array%} %typemap(jtype) TYPE *INOUT, TYPE &INOUT "JTYPE[]" %typemap(jstype) TYPE *INOUT, TYPE &INOUT "JTYPE[]" %typemap(javain) TYPE *INOUT, TYPE &INOUT "$javainput" %typemap(javadirectorin) TYPE *INOUT, TYPE &INOUT "$jniinput" %typemap(javadirectorout) TYPE *INOUT, TYPE &INOUT "$javacall" %typemap(in) TYPE *INOUT, TYPE &INOUT { if (!$input) { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "array null"); return $null; } if (JCALL1(GetArrayLength, jenv, $input) == 0) { SWIG_JavaThrowException(jenv, SWIG_JavaIndexOutOfBoundsException, "Array must contain at least 1 element"); return $null; } $1 = ($1_ltype) JCALL2(Get##JAVATYPE##ArrayElements, jenv, $input, 0); } %typemap(freearg) TYPE *INOUT, TYPE &INOUT "" %typemap(argout) TYPE *INOUT, TYPE &INOUT { JCALL3(Release##JAVATYPE##ArrayElements, jenv, $input, (JNITYPE *)$1, 0); } %typemap(directorin,descriptor=JNIDESC) TYPE &INOUT %{ $input = JCALL1(New##JAVATYPE##Array, jenv, 1); if (!$input) return $null; JNITYPE $1_jvalue = (JNITYPE)$1; JCALL4(Set##JAVATYPE##ArrayRegion, jenv, $input, 0, 1, &$1_jvalue); Swig::LocalRefGuard $1_refguard(jenv, $input); %} %typemap(directorin,descriptor=JNIDESC) TYPE *INOUT %{ if ($1) { $input = JCALL1(New##JAVATYPE##Array, jenv, 1); if (!$input) return $null; JNITYPE $1_jvalue = (JNITYPE)*$1; JCALL4(Set##JAVATYPE##ArrayRegion, jenv, $input, 0, 1, &$1_jvalue); } Swig::LocalRefGuard $1_refguard(jenv, $input); %} %typemap(directorargout, noblock=1) TYPE &INOUT { JCALL4(Get##JAVATYPE##ArrayRegion, jenv, $input, 0, 1, &$1_jvalue); $result = ($*1_ltype)$1_jvalue; } %typemap(directorargout, noblock=1) TYPE *INOUT { if ($result) { JNITYPE $1_jvalue; JCALL4(Get##JAVATYPE##ArrayRegion, jenv, $input, 0, 1, &$1_jvalue); *$result = ($*1_ltype)$1_jvalue; } } %typemap(typecheck) TYPE *INOUT = TYPECHECKTYPE; %typemap(typecheck) TYPE &INOUT = TYPECHECKTYPE; %enddef INOUT_TYPEMAP(bool, jboolean, boolean, Boolean, "[Z", jbooleanArray); INOUT_TYPEMAP(signed char, jbyte, byte, Byte, "[B", jbyteArray); INOUT_TYPEMAP(unsigned char, jshort, short, Short, "[S", jshortArray); INOUT_TYPEMAP(short, jshort, short, Short, "[S", jshortArray); INOUT_TYPEMAP(unsigned short, jint, int, Int, "[I", jintArray); INOUT_TYPEMAP(int, jint, int, Int, "[I", jintArray); INOUT_TYPEMAP(unsigned int, jlong, long, Long, "[J", jlongArray); INOUT_TYPEMAP(long, jint, int, Int, "[I", jintArray); INOUT_TYPEMAP(unsigned long, jlong, long, Long, "[J", jlongArray); INOUT_TYPEMAP(long long, jlong, long, Long, "[J", jlongArray); INOUT_TYPEMAP(unsigned long long, jobject, java.math.BigInteger, Object, "[java/math/BigInteger;", jobjectArray); INOUT_TYPEMAP(float, jfloat, float, Float, "[F", jfloatArray); INOUT_TYPEMAP(double, jdouble, double, Double, "[D", jdoubleArray); #undef INOUT_TYPEMAP /* Override typemaps in the INOUT_TYPEMAP macro for booleans to fix casts as a jboolean isn't always the same size as a bool */ %typemap(in) bool *INOUT (bool btemp, jboolean *jbtemp), bool &INOUT (bool btemp, jboolean *jbtemp) { if (!$input) { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "array null"); return $null; } if (JCALL1(GetArrayLength, jenv, $input) == 0) { SWIG_JavaThrowException(jenv, SWIG_JavaIndexOutOfBoundsException, "Array must contain at least 1 element"); return $null; } jbtemp = JCALL2(GetBooleanArrayElements, jenv, $input, 0); btemp = (*jbtemp) ? true : false; $1 = &btemp; } %typemap(argout) bool *INOUT, bool &INOUT { *jbtemp$argnum = btemp$argnum ? (jboolean)1 : (jboolean)0; JCALL3(ReleaseBooleanArrayElements, jenv, $input , (jboolean *)jbtemp$argnum, 0); } %typemap(directorargout, noblock=1) bool &INOUT { JCALL4(GetBooleanArrayRegion, jenv, $input, 0, 1, &$1_jvalue); $result = $1_jvalue ? true : false; } %typemap(directorargout, noblock=1) bool *INOUT { if ($result) { jboolean $1_jvalue; JCALL4(GetBooleanArrayRegion, jenv, $input, 0, 1, &$1_jvalue); *$result = $1_jvalue ? true : false; } } /* Override the typemap in the INOUT_TYPEMAP macro for unsigned long long */ %typemap(in) unsigned long long *INOUT ($*1_ltype temp), unsigned long long &INOUT ($*1_ltype temp) { jobject bigint; jclass clazz; jmethodID mid; jbyteArray ba; jbyte* bae; jsize sz; int i; if (!$input) { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "array null"); return $null; } if (JCALL1(GetArrayLength, jenv, $input) == 0) { SWIG_JavaThrowException(jenv, SWIG_JavaIndexOutOfBoundsException, "Array must contain at least 1 element"); return $null; } bigint = JCALL2(GetObjectArrayElement, jenv, $input, 0); if (!bigint) { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "array element null"); return $null; } clazz = JCALL1(GetObjectClass, jenv, bigint); mid = JCALL3(GetMethodID, jenv, clazz, "toByteArray", "()[B"); ba = (jbyteArray)JCALL2(CallObjectMethod, jenv, bigint, mid); bae = JCALL2(GetByteArrayElements, jenv, ba, 0); sz = JCALL1(GetArrayLength, jenv, ba); temp = 0; if (sz > 0) { temp = ($*1_ltype)(signed char)bae[0]; for(i=1; i namespace std { template class array { public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef T value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; array(); array(const array& other); size_type size() const; %rename(isEmpty) empty; bool empty() const; void fill(const T& u); %extend { const_reference get(int i) throw (std::out_of_range) { int size = int(self->size()); if (i>=0 && isize()); if (i>=0 && i %include // ------------------------------------------------------------------------ // std::pair // ------------------------------------------------------------------------ %{ #include %} namespace std { template struct pair { typedef T first_type; typedef U second_type; pair(); pair(T first, U second); pair(const pair& other); template pair(const pair &other); T first; U second; }; // add specializations here } swig-4.0.1/Lib/java/enumsimple.swg0000644000175000017500000000501713527063513016702 0ustar williamwilliam/* ----------------------------------------------------------------------------- * enumsimple.swg * * This file provides backwards compatible enum wrapping. SWIG versions 1.3.21 * and earlier wrapped global enums with constant integers in the module class * or Constants interface. Enums declared within a C++ class were wrapped by * constant integers in the Java proxy class. * ----------------------------------------------------------------------------- */ // const enum SWIGTYPE & typemaps %typemap(jni) const enum SWIGTYPE & "jint" %typemap(jtype) const enum SWIGTYPE & "int" %typemap(jstype) const enum SWIGTYPE & "int" %typemap(in) const enum SWIGTYPE & ($*1_ltype temp) %{ temp = ($*1_ltype)$input; $1 = &temp; %} %typemap(out) const enum SWIGTYPE & %{ $result = (jint)*$1; %} %typemap(directorout,warning=SWIGWARN_TYPEMAP_THREAD_UNSAFE_MSG) const enum SWIGTYPE & %{ static $*1_ltype temp = ($*1_ltype)$input; $result = &temp; %} %typemap(directorin, descriptor="I") const enum SWIGTYPE & "$input = (jint)$1;" %typemap(javadirectorin) const enum SWIGTYPE & "$jniinput" %typemap(javadirectorout) const enum SWIGTYPE & "$javacall" %typecheck(SWIG_TYPECHECK_INT32) const enum SWIGTYPE & "" %typemap(throws) const enum SWIGTYPE & %{ (void)$1; SWIG_JavaThrowException(jenv, SWIG_JavaRuntimeException, "C++ $1_type exception thrown"); %} %typemap(javain) const enum SWIGTYPE & "$javainput" %typemap(javaout) const enum SWIGTYPE & { return $jnicall; } // enum SWIGTYPE typemaps %typemap(jni) enum SWIGTYPE "jint" %typemap(jtype) enum SWIGTYPE "int" %typemap(jstype) enum SWIGTYPE "int" %typemap(in) enum SWIGTYPE %{ $1 = ($1_ltype)$input; %} %typemap(out) enum SWIGTYPE %{ $result = (jint)$1; %} %typemap(directorout) enum SWIGTYPE %{ $result = ($1_ltype)$input; %} %typemap(directorin, descriptor="I") enum SWIGTYPE "$input = (jint) $1;" %typemap(javadirectorin) enum SWIGTYPE "$jniinput" %typemap(javadirectorout) enum SWIGTYPE "$javacall" %typecheck(SWIG_TYPECHECK_INT32) enum SWIGTYPE "" %typemap(throws) enum SWIGTYPE %{ (void)$1; SWIG_JavaThrowException(jenv, SWIG_JavaRuntimeException, "C++ $1_type exception thrown"); %} %typemap(javain) enum SWIGTYPE "$javainput" %typemap(javaout) enum SWIGTYPE { return $jnicall; } %typemap(javaclassmodifiers) enum SWIGTYPE "" %typemap(javabase) enum SWIGTYPE "" %typemap(javacode) enum SWIGTYPE "" %typemap(javaimports) enum SWIGTYPE "" %typemap(javainterfaces) enum SWIGTYPE "" %typemap(javabody) enum SWIGTYPE "" %javaenum(simple); swig-4.0.1/Lib/java/enums.swg0000644000175000017500000001065313527063513015655 0ustar williamwilliam/* ----------------------------------------------------------------------------- * enums.swg * * Include this file in order for C/C++ enums to be wrapped by proper Java enums. * Note that the JNI layer handles the enum as an int. The Java enum has extra * code generated to store the C++ int value. This is required for C++ enums that * specify a value for the enum item, as native Java enums do not support this. * ----------------------------------------------------------------------------- */ // const enum SWIGTYPE & typemaps %typemap(jni) const enum SWIGTYPE & "jint" %typemap(jtype) const enum SWIGTYPE & "int" %typemap(jstype) const enum SWIGTYPE & "$*javaclassname" %typemap(in) const enum SWIGTYPE & ($*1_ltype temp) %{ temp = ($*1_ltype)$input; $1 = &temp; %} %typemap(out) const enum SWIGTYPE & %{ $result = (jint)*$1; %} %typemap(directorout,warning=SWIGWARN_TYPEMAP_THREAD_UNSAFE_MSG) const enum SWIGTYPE & %{ static $*1_ltype temp = ($*1_ltype)$input; $result = &temp; %} %typemap(directorin, descriptor="L$packagepath/$*javaclassname;") const enum SWIGTYPE & "$input = (jint)$1;" %typemap(javadirectorin) const enum SWIGTYPE & "$*javaclassname.swigToEnum($jniinput)" %typemap(javadirectorout) const enum SWIGTYPE & "($javacall).swigValue()" %typecheck(SWIG_TYPECHECK_POINTER) const enum SWIGTYPE & "" %typemap(throws) const enum SWIGTYPE & %{ (void)$1; SWIG_JavaThrowException(jenv, SWIG_JavaRuntimeException, "C++ $1_type exception thrown"); %} %typemap(javain) const enum SWIGTYPE & "$javainput.swigValue()" %typemap(javaout) const enum SWIGTYPE & { return $*javaclassname.swigToEnum($jnicall); } // enum SWIGTYPE typemaps %typemap(jni) enum SWIGTYPE "jint" %typemap(jtype) enum SWIGTYPE "int" %typemap(jstype) enum SWIGTYPE "$javaclassname" %typemap(in) enum SWIGTYPE %{ $1 = ($1_ltype)$input; %} %typemap(out) enum SWIGTYPE %{ $result = (jint)$1; %} %typemap(directorout) enum SWIGTYPE %{ $result = ($1_ltype)$input; %} %typemap(directorin, descriptor="L$packagepath/$javaclassname;") enum SWIGTYPE "$input = (jint) $1;" %typemap(javadirectorin) enum SWIGTYPE "$javaclassname.swigToEnum($jniinput)" %typemap(javadirectorout) enum SWIGTYPE "($javacall).swigValue()" %typecheck(SWIG_TYPECHECK_POINTER) enum SWIGTYPE "" %typemap(throws) enum SWIGTYPE %{ (void)$1; SWIG_JavaThrowException(jenv, SWIG_JavaRuntimeException, "C++ $1_type exception thrown"); %} %typemap(javain) enum SWIGTYPE "$javainput.swigValue()" %typemap(javaout) enum SWIGTYPE { return $javaclassname.swigToEnum($jnicall); } %typemap(javaclassmodifiers) enum SWIGTYPE "public enum" %typemap(javabase) enum SWIGTYPE "" %typemap(javacode) enum SWIGTYPE "" %typemap(javaimports) enum SWIGTYPE "" %typemap(javainterfaces) enum SWIGTYPE "" /* * SwigNext static inner class used instead of a static int as static fields cannot be accessed from enum initialisers. * The swigToEnum method is used to find the Java enum from a C++ enum integer value. The default one here takes * advantage of the fact that most enums do not have initial values specified, so the lookup is fast. If initial * values are specified then a lengthy linear search through all possible enums might occur. Specific typemaps could be * written to possibly optimise this lookup by taking advantage of characteristics peculiar to the targeted enum. */ %typemap(javabody) enum SWIGTYPE %{ public final int swigValue() { return swigValue; } public static $javaclassname swigToEnum(int swigValue) { $javaclassname[] swigValues = $javaclassname.class.getEnumConstants(); if (swigValue < swigValues.length && swigValue >= 0 && swigValues[swigValue].swigValue == swigValue) return swigValues[swigValue]; for ($javaclassname swigEnum : swigValues) if (swigEnum.swigValue == swigValue) return swigEnum; throw new IllegalArgumentException("No enum " + $javaclassname.class + " with value " + swigValue); } @SuppressWarnings("unused") private $javaclassname() { this.swigValue = SwigNext.next++; } @SuppressWarnings("unused") private $javaclassname(int swigValue) { this.swigValue = swigValue; SwigNext.next = swigValue+1; } @SuppressWarnings("unused") private $javaclassname($javaclassname swigEnum) { this.swigValue = swigEnum.swigValue; SwigNext.next = this.swigValue+1; } private final int swigValue; private static class SwigNext { private static int next = 0; } %} %javaenum(proper); swig-4.0.1/Lib/java/std_auto_ptr.i0000644000175000017500000000151613527063513016663 0ustar williamwilliam/* The typemaps here allow to handle functions returning std::auto_ptr<>, which is the most common use of this type. If you have functions taking it as parameter, these typemaps can't be used for them and you need to do something else (e.g. use shared_ptr<> which SWIG supports fully). */ %define %auto_ptr(TYPE) %typemap (jni) std::auto_ptr "jlong" %typemap (jtype) std::auto_ptr "long" %typemap (jstype) std::auto_ptr "$typemap(jstype, TYPE)" %typemap (out) std::auto_ptr %{ jlong lpp = 0; *(TYPE**) &lpp = $1.release(); $result = lpp; %} %typemap(javaout) std::auto_ptr { long cPtr = $jnicall; return (cPtr == 0) ? null : new $typemap(jstype, TYPE)(cPtr, true); } %template() std::auto_ptr; %enddef namespace std { template class auto_ptr {}; } swig-4.0.1/Lib/java/javahead.swg0000644000175000017500000001027713527063513016273 0ustar williamwilliam/* ----------------------------------------------------------------------------- * javahead.swg * * Java support code * ----------------------------------------------------------------------------- */ /* JNI function calls require different calling conventions for C and C++. These JCALL macros are used so * that the same typemaps can be used for generating code for both C and C++. The SWIG preprocessor can expand * the macros thereby generating the correct calling convention. It is thus essential that all typemaps that * use the macros are not within %{ %} brackets as they won't be run through the SWIG preprocessor. */ #ifdef __cplusplus # define JCALL0(func, jenv) jenv->func() # define JCALL1(func, jenv, ar1) jenv->func(ar1) # define JCALL2(func, jenv, ar1, ar2) jenv->func(ar1, ar2) # define JCALL3(func, jenv, ar1, ar2, ar3) jenv->func(ar1, ar2, ar3) # define JCALL4(func, jenv, ar1, ar2, ar3, ar4) jenv->func(ar1, ar2, ar3, ar4) # define JCALL5(func, jenv, ar1, ar2, ar3, ar4, ar5) jenv->func(ar1, ar2, ar3, ar4, ar5) # define JCALL6(func, jenv, ar1, ar2, ar3, ar4, ar5, ar6) jenv->func(ar1, ar2, ar3, ar4, ar5, ar6) # define JCALL7(func, jenv, ar1, ar2, ar3, ar4, ar5, ar6, ar7) jenv->func(ar1, ar2, ar3, ar4, ar5, ar6, ar7) #else # define JCALL0(func, jenv) (*jenv)->func(jenv) # define JCALL1(func, jenv, ar1) (*jenv)->func(jenv, ar1) # define JCALL2(func, jenv, ar1, ar2) (*jenv)->func(jenv, ar1, ar2) # define JCALL3(func, jenv, ar1, ar2, ar3) (*jenv)->func(jenv, ar1, ar2, ar3) # define JCALL4(func, jenv, ar1, ar2, ar3, ar4) (*jenv)->func(jenv, ar1, ar2, ar3, ar4) # define JCALL5(func, jenv, ar1, ar2, ar3, ar4, ar5) (*jenv)->func(jenv, ar1, ar2, ar3, ar4, ar5) # define JCALL6(func, jenv, ar1, ar2, ar3, ar4, ar5, ar6) (*jenv)->func(jenv, ar1, ar2, ar3, ar4, ar5, ar6) # define JCALL7(func, jenv, ar1, ar2, ar3, ar4, ar5, ar6, ar7) (*jenv)->func(jenv, ar1, ar2, ar3, ar4, ar5, ar6, ar7) #endif %insert(runtime) %{ /* Fix for jlong on some versions of gcc on Windows */ #if defined(__GNUC__) && !defined(__INTEL_COMPILER) typedef long long __int64; #endif /* Fix for jlong on 64-bit x86 Solaris */ #if defined(__x86_64) # ifdef _LP64 # undef _LP64 # endif #endif #include #include #include %} %insert(runtime) %{ /* Support for throwing Java exceptions */ typedef enum { SWIG_JavaOutOfMemoryError = 1, SWIG_JavaIOException, SWIG_JavaRuntimeException, SWIG_JavaIndexOutOfBoundsException, SWIG_JavaArithmeticException, SWIG_JavaIllegalArgumentException, SWIG_JavaNullPointerException, SWIG_JavaDirectorPureVirtual, SWIG_JavaUnknownError, SWIG_JavaIllegalStateException, } SWIG_JavaExceptionCodes; typedef struct { SWIG_JavaExceptionCodes code; const char *java_exception; } SWIG_JavaExceptions_t; %} %insert(runtime) { static void SWIGUNUSED SWIG_JavaThrowException(JNIEnv *jenv, SWIG_JavaExceptionCodes code, const char *msg) { jclass excep; static const SWIG_JavaExceptions_t java_exceptions[] = { { SWIG_JavaOutOfMemoryError, "java/lang/OutOfMemoryError" }, { SWIG_JavaIOException, "java/io/IOException" }, { SWIG_JavaRuntimeException, "java/lang/RuntimeException" }, { SWIG_JavaIndexOutOfBoundsException, "java/lang/IndexOutOfBoundsException" }, { SWIG_JavaArithmeticException, "java/lang/ArithmeticException" }, { SWIG_JavaIllegalArgumentException, "java/lang/IllegalArgumentException" }, { SWIG_JavaNullPointerException, "java/lang/NullPointerException" }, { SWIG_JavaDirectorPureVirtual, "java/lang/RuntimeException" }, { SWIG_JavaUnknownError, "java/lang/UnknownError" }, { SWIG_JavaIllegalStateException, "java/lang/IllegalStateException" }, { (SWIG_JavaExceptionCodes)0, "java/lang/UnknownError" } }; const SWIG_JavaExceptions_t *except_ptr = java_exceptions; while (except_ptr->code != code && except_ptr->code) except_ptr++; JCALL0(ExceptionClear, jenv); excep = JCALL1(FindClass, jenv, except_ptr->java_exception); if (excep) JCALL2(ThrowNew, jenv, excep, msg); } } %insert(runtime) %{ /* Contract support */ #define SWIG_contract_assert(nullreturn, expr, msg) if (!(expr)) {SWIG_JavaThrowException(jenv, SWIG_JavaIllegalArgumentException, msg); return nullreturn; } else %} swig-4.0.1/Lib/java/stl.i0000644000175000017500000000044313527063513014754 0ustar williamwilliam/* ----------------------------------------------------------------------------- * stl.i * ----------------------------------------------------------------------------- */ %include %include %include %include %include swig-4.0.1/Lib/java/std_list.i0000644000175000017500000001475513527063513016012 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_list.i * * SWIG typemaps for std::list. * The Java proxy class extends java.util.AbstractSequentialList. The std::list * container looks and feels much like a java.util.LinkedList from Java. * ----------------------------------------------------------------------------- */ %include %{ #include #include %} %fragment("SWIG_ListSize", "header", fragment="SWIG_JavaIntFromSize_t") { SWIGINTERN jint SWIG_ListSize(size_t size) { jint sz = SWIG_JavaIntFromSize_t(size); if (sz == -1) throw std::out_of_range("list size is too large to fit into a Java int"); return sz; } } %javamethodmodifiers std::list::begin "private"; %javamethodmodifiers std::list::insert "private"; %javamethodmodifiers std::list::doSize "private"; %javamethodmodifiers std::list::doPreviousIndex "private"; %javamethodmodifiers std::list::doNextIndex "private"; %javamethodmodifiers std::list::doHasNext "private"; // Match Java style better: %rename(Iterator) std::list::iterator; %nodefaultctor std::list::iterator; namespace std { template class list { %typemap(javabase) std::list "java.util.AbstractSequentialList<$typemap(jboxtype, T)>" %proxycode %{ public $javaclassname(java.util.Collection c) { this(); java.util.ListIterator<$typemap(jboxtype, T)> it = listIterator(0); // Special case the "copy constructor" here to avoid lots of cross-language calls for (java.lang.Object o : c) { it.add(($typemap(jboxtype, T))o); } } public int size() { return doSize(); } public boolean add($typemap(jboxtype, T) value) { addLast(value); return true; } public java.util.ListIterator<$typemap(jboxtype, T)> listIterator(int index) { return new java.util.ListIterator<$typemap(jboxtype, T)>() { private Iterator pos; private Iterator last; private java.util.ListIterator<$typemap(jboxtype, T)> init(int index) { if (index < 0 || index > $javaclassname.this.size()) throw new IndexOutOfBoundsException("Index: " + index); pos = $javaclassname.this.begin(); pos = pos.advance_unchecked(index); return this; } public void add($typemap(jboxtype, T) v) { // Technically we can invalidate last here, but this makes more sense last = $javaclassname.this.insert(pos, v); } public void set($typemap(jboxtype, T) v) { if (null == last) { throw new IllegalStateException(); } last.set_unchecked(v); } public void remove() { if (null == last) { throw new IllegalStateException(); } $javaclassname.this.remove(last); last = null; } public int previousIndex() { return $javaclassname.this.doPreviousIndex(pos); } public int nextIndex() { return $javaclassname.this.doNextIndex(pos); } public $typemap(jboxtype, T) previous() { if (previousIndex() < 0) { throw new java.util.NoSuchElementException(); } last = pos; pos = pos.previous_unchecked(); return last.deref_unchecked(); } public $typemap(jboxtype, T) next() { if (!hasNext()) { throw new java.util.NoSuchElementException(); } last = pos; pos = pos.next_unchecked(); return last.deref_unchecked(); } public boolean hasPrevious() { // This call to previousIndex() will be much slower than the hasNext() implementation, but it's simpler like this with C++ forward iterators return previousIndex() != -1; } public boolean hasNext() { return $javaclassname.this.doHasNext(pos); } }.init(index); } %} public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef T value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; /* * We'd actually be better off having the nested class *not* be static in the wrapper * output, but this doesn't actually remove the $static from the nested class still. * (This would allow us to somewhat simplify the implementation of the ListIterator * interface and give "natural" semantics to Java users of the C++ iterator) */ //%typemap(javaclassmodifiers) iterator "public class" //%typemap(javainterfaces) iterator "java.util.ListIterator<$typemap(jboxtype, T)>" struct iterator { %extend { void set_unchecked(const T &v) { **$self = v; } iterator next_unchecked() const { std::list::iterator ret = *$self; ++ret; return ret; } iterator previous_unchecked() const { std::list::iterator ret = *$self; --ret; return ret; } T deref_unchecked() const { return **$self; } iterator advance_unchecked(size_type index) const { std::list::iterator ret = *$self; std::advance(ret, index); return ret; } } }; list(); list(const list& other); %rename(isEmpty) empty; bool empty() const; void clear(); %rename(remove) erase; iterator erase(iterator pos); %rename(removeLast) pop_back; void pop_back(); %rename(removeFirst) pop_front; void pop_front(); %rename(addLast) push_back; void push_back(const T &value); %rename(addFirst) push_front; void push_front(const T &value); iterator begin(); iterator end(); iterator insert(iterator pos, const T &value); %extend { %fragment("SWIG_ListSize"); list(jint count, const T &value) throw (std::out_of_range) { if (count < 0) throw std::out_of_range("list count must be positive"); return new std::list(static_cast::size_type>(count), value); } jint doSize() const throw (std::out_of_range) { return SWIG_ListSize(self->size()); } jint doPreviousIndex(const iterator &pos) const throw (std::out_of_range) { return pos == self->begin() ? -1 : SWIG_ListSize(std::distance(self->begin(), static_cast::const_iterator>(pos))); } jint doNextIndex(const iterator &pos) const throw (std::out_of_range) { return pos == self->end() ? SWIG_ListSize(self->size()) : SWIG_ListSize(std::distance(self->begin(), static_cast::const_iterator>(pos))); } bool doHasNext(const iterator &pos) const { return pos != $self->end(); } } }; } swig-4.0.1/Lib/java/various.i0000644000175000017500000001335713527063513015652 0ustar williamwilliam/* ----------------------------------------------------------------------------- * various.i * * SWIG Typemap library for Java. * Various useful typemaps. * ----------------------------------------------------------------------------- */ /* * char **STRING_ARRAY typemaps. * These typemaps are for C String arrays which are NULL terminated. * char *values[] = { "one", "two", "three", NULL }; // note NULL * char ** is mapped to a Java String[]. * * Example usage wrapping: * %apply char **STRING_ARRAY { char **input }; * char ** foo(char **input); * * Java usage: * String numbers[] = { "one", "two", "three" }; * String[] ret = modulename.foo( numbers }; */ %typemap(jni) char **STRING_ARRAY "jobjectArray" %typemap(jtype) char **STRING_ARRAY "String[]" %typemap(jstype) char **STRING_ARRAY "String[]" %typemap(in) char **STRING_ARRAY (jint size) { int i = 0; if ($input) { size = JCALL1(GetArrayLength, jenv, $input); #ifdef __cplusplus $1 = new char*[size+1]; #else $1 = (char **)malloc((size+1) * sizeof(char *)); #endif for (i = 0; i %} namespace std { %naturalvar string; class string; // string %typemap(jni) string "jstring" %typemap(jtype) string "String" %typemap(jstype) string "String" %typemap(javadirectorin) string "$jniinput" %typemap(javadirectorout) string "$javacall" %typemap(in) string %{ if(!$input) { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null string"); return $null; } const char *$1_pstr = (const char *)jenv->GetStringUTFChars($input, 0); if (!$1_pstr) return $null; $1.assign($1_pstr); jenv->ReleaseStringUTFChars($input, $1_pstr); %} %typemap(directorout) string %{ if(!$input) { if (!jenv->ExceptionCheck()) { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null string"); } return $null; } const char *$1_pstr = (const char *)jenv->GetStringUTFChars($input, 0); if (!$1_pstr) return $null; $result.assign($1_pstr); jenv->ReleaseStringUTFChars($input, $1_pstr); %} %typemap(directorin,descriptor="Ljava/lang/String;") string %{ $input = jenv->NewStringUTF($1.c_str()); Swig::LocalRefGuard $1_refguard(jenv, $input); %} %typemap(out) string %{ $result = jenv->NewStringUTF($1.c_str()); %} %typemap(javain) string "$javainput" %typemap(javaout) string { return $jnicall; } %typemap(typecheck) string = char *; %typemap(throws) string %{ SWIG_JavaThrowException(jenv, SWIG_JavaRuntimeException, $1.c_str()); return $null; %} // const string & %typemap(jni) const string & "jstring" %typemap(jtype) const string & "String" %typemap(jstype) const string & "String" %typemap(javadirectorin) const string & "$jniinput" %typemap(javadirectorout) const string & "$javacall" %typemap(in) const string & %{ if(!$input) { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null string"); return $null; } const char *$1_pstr = (const char *)jenv->GetStringUTFChars($input, 0); if (!$1_pstr) return $null; $*1_ltype $1_str($1_pstr); $1 = &$1_str; jenv->ReleaseStringUTFChars($input, $1_pstr); %} %typemap(directorout,warning=SWIGWARN_TYPEMAP_THREAD_UNSAFE_MSG) const string & %{ if(!$input) { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null string"); return $null; } const char *$1_pstr = (const char *)jenv->GetStringUTFChars($input, 0); if (!$1_pstr) return $null; /* possible thread/reentrant code problem */ static $*1_ltype $1_str; $1_str = $1_pstr; $result = &$1_str; jenv->ReleaseStringUTFChars($input, $1_pstr); %} %typemap(directorin,descriptor="Ljava/lang/String;") const string & %{ $input = jenv->NewStringUTF($1.c_str()); Swig::LocalRefGuard $1_refguard(jenv, $input); %} %typemap(out) const string & %{ $result = jenv->NewStringUTF($1->c_str()); %} %typemap(javain) const string & "$javainput" %typemap(javaout) const string & { return $jnicall; } %typemap(typecheck) const string & = char *; %typemap(throws) const string & %{ SWIG_JavaThrowException(jenv, SWIG_JavaRuntimeException, $1.c_str()); return $null; %} } swig-4.0.1/Lib/java/std_map.i0000644000175000017500000001433713527063513015610 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_map.i * * SWIG typemaps for std::map * The Java proxy class extends java.util.AbstractMap. The std::map * container looks and feels much like a java.util.HashMap from Java. * ----------------------------------------------------------------------------- */ %include // ------------------------------------------------------------------------ // std::map // ------------------------------------------------------------------------ %{ #include #include %} %fragment("SWIG_MapSize", "header", fragment="SWIG_JavaIntFromSize_t") { SWIGINTERN jint SWIG_MapSize(size_t size) { jint sz = SWIG_JavaIntFromSize_t(size); if (sz == -1) { throw std::out_of_range("map size is too large to fit into a Java int"); } return sz; } } %javamethodmodifiers std::map::sizeImpl "private"; %javamethodmodifiers std::map::containsImpl "private"; %javamethodmodifiers std::map::putUnchecked "private"; %javamethodmodifiers std::map::removeUnchecked "private"; %javamethodmodifiers std::map::find "private"; %javamethodmodifiers std::map::begin "private"; %javamethodmodifiers std::map::end "private"; %rename(Iterator) std::map::iterator; %nodefaultctor std::map::iterator; %javamethodmodifiers std::map::iterator::getNextUnchecked "private"; %javamethodmodifiers std::map::iterator::isNot "private"; %javamethodmodifiers std::map::iterator::getKey "private"; %javamethodmodifiers std::map::iterator::getValue "private"; %javamethodmodifiers std::map::iterator::setValue "private"; namespace std { template > class map { %typemap(javabase) std::map< K, T, C > "java.util.AbstractMap<$typemap(jboxtype, K), $typemap(jboxtype, T)>" %proxycode %{ public int size() { return sizeImpl(); } public boolean containsKey(java.lang.Object key) { if (!(key instanceof $typemap(jboxtype, K))) { return false; } return containsImpl(($typemap(jboxtype, K))key); } public $typemap(jboxtype, T) get(java.lang.Object key) { if (!(key instanceof $typemap(jboxtype, K))) { return null; } Iterator itr = find(($typemap(jboxtype, K)) key); if (itr.isNot(end())) { return itr.getValue(); } return null; } public $typemap(jboxtype, T) put($typemap(jboxtype, K) key, $typemap(jboxtype, T) value) { Iterator itr = find(($typemap(jboxtype, K)) key); if (itr.isNot(end())) { $typemap(jboxtype, T) oldValue = itr.getValue(); itr.setValue(value); return oldValue; } else { putUnchecked(key, value); return null; } } public $typemap(jboxtype, T) remove(java.lang.Object key) { if (!(key instanceof $typemap(jboxtype, K))) { return null; } Iterator itr = find(($typemap(jboxtype, K)) key); if (itr.isNot(end())) { $typemap(jboxtype, T) oldValue = itr.getValue(); removeUnchecked(itr); return oldValue; } else { return null; } } public java.util.Set> entrySet() { java.util.Set> setToReturn = new java.util.HashSet>(); Iterator itr = begin(); final Iterator end = end(); while (itr.isNot(end)) { setToReturn.add(new Entry<$typemap(jboxtype, K), $typemap(jboxtype, T)>() { private Iterator iterator; private Entry<$typemap(jboxtype, K), $typemap(jboxtype, T)> init(Iterator iterator) { this.iterator = iterator; return this; } public $typemap(jboxtype, K) getKey() { return iterator.getKey(); } public $typemap(jboxtype, T) getValue() { return iterator.getValue(); } public $typemap(jboxtype, T) setValue($typemap(jboxtype, T) newValue) { $typemap(jboxtype, T) oldValue = iterator.getValue(); iterator.setValue(newValue); return oldValue; } }.init(itr)); itr = itr.getNextUnchecked(); } return setToReturn; } %} public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef K key_type; typedef T mapped_type; typedef std::pair< const K, T > value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; map(); map(const map& other); struct iterator { %typemap(javaclassmodifiers) iterator "protected class" %extend { std::map< K, T, C >::iterator getNextUnchecked() { std::map< K, T, C >::iterator copy = (*$self); return ++copy; } bool isNot(iterator other) const { return (*$self != other); } K getKey() const { return (*$self)->first; } T getValue() const { return (*$self)->second; } void setValue(const T& newValue) { (*$self)->second = newValue; } } }; %rename(isEmpty) empty; bool empty() const; void clear(); iterator find(const K& key); iterator begin(); iterator end(); %extend { %fragment("SWIG_MapSize"); jint sizeImpl() const throw (std::out_of_range) { return SWIG_MapSize(self->size()); } bool containsImpl(const K& key) { return (self->count(key) > 0); } void putUnchecked(const K& key, const T& value) { (*self)[key] = value; } void removeUnchecked(const std::map< K, T, C >::iterator itr) { self->erase(itr); } } }; // Legacy macros (deprecated) %define specialize_std_map_on_key(K,CHECK,CONVERT_FROM,CONVERT_TO) #warning "specialize_std_map_on_key ignored - macro is deprecated and no longer necessary" %enddef %define specialize_std_map_on_value(T,CHECK,CONVERT_FROM,CONVERT_TO) #warning "specialize_std_map_on_value ignored - macro is deprecated and no longer necessary" %enddef %define specialize_std_map_on_both(K,CHECK_K,CONVERT_K_FROM,CONVERT_K_TO, T,CHECK_T,CONVERT_T_FROM,CONVERT_T_TO) #warning "specialize_std_map_on_both ignored - macro is deprecated and no longer necessary" %enddef } swig-4.0.1/Lib/java/swiginterface.i0000644000175000017500000000651513527063513017012 0ustar williamwilliam/* ----------------------------------------------------------------------------- * swiginterface.i * * SWIG interface feature and typemaps implementation providing: * %interface * %interface_impl * %interface_custom * ----------------------------------------------------------------------------- */ %define INTERFACE_TYPEMAPS(CTYPE...) %typemap(jtype) CTYPE, CTYPE *, CTYPE *const&, CTYPE [], CTYPE & "long" %typemap(jstype) CTYPE "$&javainterfacename" %typemap(jstype) CTYPE *, CTYPE [], CTYPE & "$javainterfacename" %typemap(jstype) CTYPE *const& "$*javainterfacename" %typemap(javain) CTYPE "$javainput.$&interfacename_GetInterfaceCPtr()" %typemap(javain) CTYPE & "$javainput.$interfacename_GetInterfaceCPtr()" %typemap(javain) CTYPE *, CTYPE [] "($javainput == null) ? 0 : $javainput.$interfacename_GetInterfaceCPtr()" %typemap(javain) CTYPE *const& "($javainput == null) ? 0 : $javainput.$*interfacename_GetInterfaceCPtr()" %typemap(javaout) CTYPE { return ($&javainterfacename)new $&javaclassname($jnicall, true); } %typemap(javaout) CTYPE & { return ($javainterfacename)new $javaclassname($jnicall, $owner); } %typemap(javaout) CTYPE *, CTYPE [] { long cPtr = $jnicall; return (cPtr == 0) ? null : ($javainterfacename)new $javaclassname(cPtr, $owner); } %typemap(javaout) CTYPE *const& { long cPtr = $jnicall; return (cPtr == 0) ? null : ($javainterfacename)new $javaclassname(cPtr, $owner); } %typemap(javadirectorin) CTYPE "($&javainterfacename)new $&javaclassname($jniinput, true)" %typemap(javadirectorin) CTYPE & "($javainterfacename)new $javaclassname($jniinput, false)" %typemap(javadirectorin) CTYPE *, CTYPE [] "($jniinput == 0) ? null : ($javainterfacename)new $javaclassname($jniinput, false)" %typemap(javadirectorin) CTYPE *const& "($jniinput == 0) ? null : ($*javainterfacename)new $*javaclassname($jniinput, false)" %typemap(javadirectorout) CTYPE "$javacall.$&interfacename_GetInterfaceCPtr()" %typemap(javadirectorout) CTYPE *, CTYPE [], CTYPE & "$javacall.$interfacename_GetInterfaceCPtr()" %typemap(javadirectorout) CTYPE *const& "$javacall.$*interfacename_GetInterfaceCPtr()" %typemap(directorin,descriptor="L$packagepath/$&javainterfacename;") CTYPE %{ $input = 0; *(($&1_ltype*)&$input) = new $1_ltype((const $1_ltype &)$1); %} %typemap(directorin,descriptor="L$packagepath/$javainterfacename;") CTYPE *, CTYPE [] %{ *(($&1_ltype)&$input) = ($1_ltype) $1; %} %typemap(directorin,descriptor="L$packagepath/$javainterfacename;") CTYPE & %{ *($&1_ltype)&$input = ($1_ltype) &$1; %} %typemap(directorin,descriptor="L$packagepath/$*javainterfacename;") CTYPE *const& %{ *($&1_ltype)&$input = ($1_ltype) &$1; %} %typemap(javainterfacecode, declaration=" long $interfacename_GetInterfaceCPtr();\n", cptrmethod="$interfacename_GetInterfaceCPtr") CTYPE %{ public long $interfacename_GetInterfaceCPtr() { return $imclassname.$javaclazzname$interfacename_GetInterfaceCPtr(swigCPtr); } %} %enddef %define %interface(CTYPE...) %feature("interface", name="%sSwigInterface") CTYPE; INTERFACE_TYPEMAPS(CTYPE) %enddef %define %interface_impl(CTYPE...) %rename("%sSwigImpl") CTYPE; %feature("interface", name="%(rstrip:[SwigImpl])s") CTYPE; INTERFACE_TYPEMAPS(CTYPE) %enddef %define %interface_custom(PROXY, INTERFACE, CTYPE...) %rename(PROXY) CTYPE; %feature("interface", name=INTERFACE) CTYPE; INTERFACE_TYPEMAPS(CTYPE) %enddef swig-4.0.1/Lib/java/boost_shared_ptr.i0000644000175000017500000003340213527063513017514 0ustar williamwilliam// Users can provide their own SWIG_SHARED_PTR_TYPEMAPS macro before including this file to change the // visibility of the constructor and getCPtr method if desired to public if using multiple modules. #ifndef SWIG_SHARED_PTR_TYPEMAPS #define SWIG_SHARED_PTR_TYPEMAPS(CONST, TYPE...) SWIG_SHARED_PTR_TYPEMAPS_IMPLEMENTATION(protected, protected, CONST, TYPE) #endif %include // Language specific macro implementing all the customisations for handling the smart pointer %define SWIG_SHARED_PTR_TYPEMAPS_IMPLEMENTATION(PTRCTOR_VISIBILITY, CPTR_VISIBILITY, CONST, TYPE...) // %naturalvar is as documented for member variables %naturalvar TYPE; %naturalvar SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >; // destructor wrapper customisation %feature("unref") TYPE //"if (debug_shared) { cout << \"deleting use_count: \" << (*smartarg1).use_count() << \" [\" << (boost::get_deleter(*smartarg1) ? std::string(\"CANNOT BE DETERMINED SAFELY\") : ( (*smartarg1).get() ? (*smartarg1)->getValue() : std::string(\"NULL PTR\") )) << \"]\" << endl << flush; }\n" "(void)arg1; delete smartarg1;" // Typemap customisations... // plain value %typemap(in) CONST TYPE ($&1_type argp = 0) %{ argp = (*(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input) ? (*(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input)->get() : 0; if (!argp) { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "Attempt to dereference null $1_type"); return $null; } $1 = *argp; %} %typemap(out) CONST TYPE %{ *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(new $1_ltype(($1_ltype &)$1)); %} %typemap(directorin,descriptor="L$packagepath/$&javaclassname;") CONST TYPE %{ $input = 0; *((SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input) = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > (new $1_ltype((const $1_ltype &)$1)); %} %typemap(directorout) CONST TYPE %{ if (!$input) { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "Attempt to dereference null $1_type"); return $null; } SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input; $result = *smartarg->get(); %} // plain pointer %typemap(in) CONST TYPE * (SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0) %{ smartarg = *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input; $1 = (TYPE *)(smartarg ? smartarg->get() : 0); %} %typemap(out, fragment="SWIG_null_deleter") CONST TYPE * %{ *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1 SWIG_NO_NULL_DELETER_$owner) : 0; %} %typemap(directorin,descriptor="L$packagepath/$javaclassname;") CONST TYPE * %{ $input = 0; if ($1) { *((SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input) = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > ($1 SWIG_NO_NULL_DELETER_0); } %} %typemap(directorout) CONST TYPE * %{ #error "typemaps for $1_type not available" %} // plain reference %typemap(in) CONST TYPE & %{ $1 = ($1_ltype)((*(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input) ? (*(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input)->get() : 0); if (!$1) { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "$1_type reference is null"); return $null; } %} %typemap(out, fragment="SWIG_null_deleter") CONST TYPE & %{ *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1 SWIG_NO_NULL_DELETER_$owner); %} %typemap(directorin,descriptor="L$packagepath/$javaclassname;") CONST TYPE & %{ $input = 0; *((SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input) = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > (&$1 SWIG_NO_NULL_DELETER_0); %} %typemap(directorout) CONST TYPE & %{ #error "typemaps for $1_type not available" %} // plain pointer by reference %typemap(in) TYPE *CONST& ($*1_ltype temp = 0) %{ temp = (TYPE *)((*(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input) ? (*(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input)->get() : 0); $1 = &temp; %} %typemap(out, fragment="SWIG_null_deleter") TYPE *CONST& %{ *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(*$1 SWIG_NO_NULL_DELETER_$owner); %} %typemap(directorin,descriptor="L$packagepath/$*javaclassname;") TYPE *CONST& %{ $input = 0; if ($1) { *((SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input) = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > ($1 SWIG_NO_NULL_DELETER_0); } %} %typemap(directorout) TYPE *CONST& %{ #error "typemaps for $1_type not available" %} // shared_ptr by value %typemap(in) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > ($&1_type argp) %{ argp = *($&1_ltype*)&$input; if (argp) $1 = *argp; %} %typemap(out) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > %{ *($&1_ltype*)&$result = $1 ? new $1_ltype($1) : 0; %} %typemap(directorin,descriptor="L$packagepath/$typemap(jstype, TYPE);") SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > %{ $input = 0; if ($1) { *((SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input) = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1); } %} %typemap(directorout) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > %{ if ($input) { $&1_type smartarg = *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input; $result = *smartarg; } %} // shared_ptr by reference %typemap(in) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > & ($*1_ltype tempnull) %{ $1 = $input ? *($&1_ltype)&$input : &tempnull; %} %typemap(out) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > & %{ *($&1_ltype)&$result = *$1 ? new $*1_ltype(*$1) : 0; %} %typemap(directorin,descriptor="L$packagepath/$typemap(jstype, TYPE);") SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > & %{ $input = 0; if ($1) { *((SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input) = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1); } %} %typemap(directorout) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > & %{ #error "typemaps for $1_type not available" %} // shared_ptr by pointer %typemap(in) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * ($*1_ltype tempnull) %{ $1 = $input ? *($&1_ltype)&$input : &tempnull; %} %typemap(out) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * %{ *($&1_ltype)&$result = ($1 && *$1) ? new $*1_ltype(*$1) : 0; if ($owner) delete $1; %} %typemap(directorin,descriptor="L$packagepath/$typemap(jstype, TYPE);") SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * %{ $input = 0; if ($1 && *$1) { *((SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input) = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(*$1); } %} %typemap(directorout) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * %{ #error "typemaps for $1_type not available" %} // shared_ptr by pointer reference %typemap(in) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& (SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > tempnull, $*1_ltype temp = 0) %{ temp = $input ? *($1_ltype)&$input : &tempnull; $1 = &temp; %} %typemap(out) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& %{ *($1_ltype)&$result = (*$1 && **$1) ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(**$1) : 0; %} %typemap(directorin,descriptor="L$packagepath/$typemap(jstype, TYPE);") SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& %{ $input = 0; if ($1 && *$1) { *((SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input) = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(*$1); } %} %typemap(directorout) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& %{ #error "typemaps for $1_type not available" %} // various missing typemaps - If ever used (unlikely) ensure compilation error rather than runtime bug %typemap(in) CONST TYPE[], CONST TYPE[ANY], CONST TYPE (CLASS::*) %{ #error "typemaps for $1_type not available" %} %typemap(out) CONST TYPE[], CONST TYPE[ANY], CONST TYPE (CLASS::*) %{ #error "typemaps for $1_type not available" %} %typemap (jni) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > &, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& "jlong" %typemap (jtype) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > &, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& "long" %typemap (jstype) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > &, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& "$typemap(jstype, TYPE)" %typemap(javain) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > &, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& "$typemap(jstype, TYPE).getCPtr($javainput)" %typemap(javaout) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > { long cPtr = $jnicall; return (cPtr == 0) ? null : new $typemap(jstype, TYPE)(cPtr, true); } %typemap(javaout) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > & { long cPtr = $jnicall; return (cPtr == 0) ? null : new $typemap(jstype, TYPE)(cPtr, true); } %typemap(javaout) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * { long cPtr = $jnicall; return (cPtr == 0) ? null : new $typemap(jstype, TYPE)(cPtr, true); } %typemap(javaout) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& { long cPtr = $jnicall; return (cPtr == 0) ? null : new $typemap(jstype, TYPE)(cPtr, true); } %typemap(javaout) CONST TYPE { return new $typemap(jstype, TYPE)($jnicall, true); } %typemap(javaout) CONST TYPE & { return new $typemap(jstype, TYPE)($jnicall, true); } %typemap(javaout) CONST TYPE * { long cPtr = $jnicall; return (cPtr == 0) ? null : new $typemap(jstype, TYPE)(cPtr, true); } %typemap(javaout) TYPE *CONST& { long cPtr = $jnicall; return (cPtr == 0) ? null : new $typemap(jstype, TYPE)(cPtr, true); } %typemap(javadirectorout) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > "$typemap(jstype, TYPE).getCPtr($javacall)" %typemap(javadirectorin) CONST TYPE, CONST TYPE *, CONST TYPE &, TYPE *CONST& "($jniinput == 0) ? null : new $typemap(jstype, TYPE)($jniinput, true)" %typemap(javadirectorin) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > &, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& "($jniinput == 0) ? null : new $typemap(jstype, TYPE)($jniinput, true)" // Base proxy classes %typemap(javabody) TYPE %{ private transient long swigCPtr; private transient boolean swigCMemOwn; PTRCTOR_VISIBILITY $javaclassname(long cPtr, boolean cMemoryOwn) { swigCMemOwn = cMemoryOwn; swigCPtr = cPtr; } CPTR_VISIBILITY static long getCPtr($javaclassname obj) { return (obj == null) ? 0 : obj.swigCPtr; } CPTR_VISIBILITY void swigSetCMemOwn(boolean own) { swigCMemOwn = own; } %} // Derived proxy classes %typemap(javabody_derived) TYPE %{ private transient long swigCPtr; private transient boolean swigCMemOwnDerived; PTRCTOR_VISIBILITY $javaclassname(long cPtr, boolean cMemoryOwn) { super($imclassname.$javaclazznameSWIGSmartPtrUpcast(cPtr), true); swigCMemOwnDerived = cMemoryOwn; swigCPtr = cPtr; } CPTR_VISIBILITY static long getCPtr($javaclassname obj) { return (obj == null) ? 0 : obj.swigCPtr; } CPTR_VISIBILITY void swigSetCMemOwn(boolean own) { swigCMemOwnDerived = own; super.swigSetCMemOwn(own); } %} %typemap(javadestruct, methodname="delete", methodmodifiers="public synchronized") TYPE { if (swigCPtr != 0) { if (swigCMemOwn) { swigCMemOwn = false; $jnicall; } swigCPtr = 0; } } %typemap(javadestruct_derived, methodname="delete", methodmodifiers="public synchronized") TYPE { if (swigCPtr != 0) { if (swigCMemOwnDerived) { swigCMemOwnDerived = false; $jnicall; } swigCPtr = 0; } super.delete(); } %typemap(directordisconnect, methodname="swigDirectorDisconnect") TYPE %{ protected void $methodname() { swigSetCMemOwn(false); $jnicall; } %} %typemap(directorowner_release, methodname="swigReleaseOwnership") TYPE %{ public void $methodname() { swigSetCMemOwn(false); $jnicall; } %} %typemap(directorowner_take, methodname="swigTakeOwnership") TYPE %{ public void $methodname() { swigSetCMemOwn(true); $jnicall; } %} // Typecheck typemaps %typemap(typecheck, precedence=SWIG_TYPECHECK_POINTER, equivalent="TYPE *") TYPE CONST, TYPE CONST &, TYPE CONST *, TYPE *CONST&, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > &, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& "" %template() SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >; %enddef swig-4.0.1/Lib/stdint.i0000644000175000017500000000450013527063513014534 0ustar williamwilliam/* ----------------------------------------------------------------------------- * stdint.i * * SWIG library file for ISO C99 types: 7.18 Integer types * ----------------------------------------------------------------------------- */ %{ #include // Use the C99 official header %} %include /* Exact integral types. */ /* Signed. */ typedef signed char int8_t; typedef short int int16_t; typedef int int32_t; #if defined(SWIGWORDSIZE64) typedef long int int64_t; #else typedef long long int int64_t; #endif /* Unsigned. */ typedef unsigned char uint8_t; typedef unsigned short int uint16_t; typedef unsigned int uint32_t; #if defined(SWIGWORDSIZE64) typedef unsigned long int uint64_t; #else typedef unsigned long long int uint64_t; #endif /* Small types. */ /* Signed. */ typedef signed char int_least8_t; typedef short int int_least16_t; typedef int int_least32_t; #if defined(SWIGWORDSIZE64) typedef long int int_least64_t; #else typedef long long int int_least64_t; #endif /* Unsigned. */ typedef unsigned char uint_least8_t; typedef unsigned short int uint_least16_t; typedef unsigned int uint_least32_t; #if defined(SWIGWORDSIZE64) typedef unsigned long int uint_least64_t; #else typedef unsigned long long int uint_least64_t; #endif /* Fast types. */ /* Signed. */ typedef signed char int_fast8_t; #if defined(SWIGWORDSIZE64) typedef long int int_fast16_t; typedef long int int_fast32_t; typedef long int int_fast64_t; #else typedef int int_fast16_t; typedef int int_fast32_t; typedef long long int int_fast64_t; #endif /* Unsigned. */ typedef unsigned char uint_fast8_t; #if defined(SWIGWORDSIZE64) typedef unsigned long int uint_fast16_t; typedef unsigned long int uint_fast32_t; typedef unsigned long int uint_fast64_t; #else typedef unsigned int uint_fast16_t; typedef unsigned int uint_fast32_t; typedef unsigned long long int uint_fast64_t; #endif /* Types for `void *' pointers. */ #if defined(SWIGWORDSIZE64) typedef long int intptr_t; typedef unsigned long int uintptr_t; #else typedef int intptr_t; typedef unsigned int uintptr_t; #endif /* Largest integral types. */ #if defined(SWIGWORDSIZE64) typedef long int intmax_t; typedef unsigned long int uintmax_t; #else typedef long long int intmax_t; typedef unsigned long long int uintmax_t; #endif swig-4.0.1/Lib/swigrun.swg0000644000175000017500000004047513527063513015310 0ustar williamwilliam/* ----------------------------------------------------------------------------- * swigrun.swg * * This file contains generic C API SWIG runtime support for pointer * type checking. * ----------------------------------------------------------------------------- */ /* This should only be incremented when either the layout of swig_type_info changes, or for whatever reason, the runtime changes incompatibly */ #define SWIG_RUNTIME_VERSION "4" /* define SWIG_TYPE_TABLE_NAME as "SWIG_TYPE_TABLE" */ #ifdef SWIG_TYPE_TABLE # define SWIG_QUOTE_STRING(x) #x # define SWIG_EXPAND_AND_QUOTE_STRING(x) SWIG_QUOTE_STRING(x) # define SWIG_TYPE_TABLE_NAME SWIG_EXPAND_AND_QUOTE_STRING(SWIG_TYPE_TABLE) #else # define SWIG_TYPE_TABLE_NAME #endif /* You can use the SWIGRUNTIME and SWIGRUNTIMEINLINE macros for creating a static or dynamic library from the SWIG runtime code. In 99.9% of the cases, SWIG just needs to declare them as 'static'. But only do this if strictly necessary, ie, if you have problems with your compiler or suchlike. */ #ifndef SWIGRUNTIME # define SWIGRUNTIME SWIGINTERN #endif #ifndef SWIGRUNTIMEINLINE # define SWIGRUNTIMEINLINE SWIGRUNTIME SWIGINLINE #endif /* Generic buffer size */ #ifndef SWIG_BUFFER_SIZE # define SWIG_BUFFER_SIZE 1024 #endif /* Flags for pointer conversions */ #define SWIG_POINTER_DISOWN 0x1 #define SWIG_CAST_NEW_MEMORY 0x2 #define SWIG_POINTER_NO_NULL 0x4 /* Flags for new pointer objects */ #define SWIG_POINTER_OWN 0x1 /* Flags/methods for returning states. The SWIG conversion methods, as ConvertPtr, return an integer that tells if the conversion was successful or not. And if not, an error code can be returned (see swigerrors.swg for the codes). Use the following macros/flags to set or process the returning states. In old versions of SWIG, code such as the following was usually written: if (SWIG_ConvertPtr(obj,vptr,ty.flags) != -1) { // success code } else { //fail code } Now you can be more explicit: int res = SWIG_ConvertPtr(obj,vptr,ty.flags); if (SWIG_IsOK(res)) { // success code } else { // fail code } which is the same really, but now you can also do Type *ptr; int res = SWIG_ConvertPtr(obj,(void **)(&ptr),ty.flags); if (SWIG_IsOK(res)) { // success code if (SWIG_IsNewObj(res) { ... delete *ptr; } else { ... } } else { // fail code } I.e., now SWIG_ConvertPtr can return new objects and you can identify the case and take care of the deallocation. Of course that also requires SWIG_ConvertPtr to return new result values, such as int SWIG_ConvertPtr(obj, ptr,...) { if () { if () { *ptr = ; return SWIG_NEWOBJ; } else { *ptr = ; return SWIG_OLDOBJ; } } else { return SWIG_BADOBJ; } } Of course, returning the plain '0(success)/-1(fail)' still works, but you can be more explicit by returning SWIG_BADOBJ, SWIG_ERROR or any of the SWIG errors code. Finally, if the SWIG_CASTRANK_MODE is enabled, the result code allows to return the 'cast rank', for example, if you have this int food(double) int fooi(int); and you call food(1) // cast rank '1' (1 -> 1.0) fooi(1) // cast rank '0' just use the SWIG_AddCast()/SWIG_CheckState() */ #define SWIG_OK (0) #define SWIG_ERROR (-1) #define SWIG_IsOK(r) (r >= 0) #define SWIG_ArgError(r) ((r != SWIG_ERROR) ? r : SWIG_TypeError) /* The CastRankLimit says how many bits are used for the cast rank */ #define SWIG_CASTRANKLIMIT (1 << 8) /* The NewMask denotes the object was created (using new/malloc) */ #define SWIG_NEWOBJMASK (SWIG_CASTRANKLIMIT << 1) /* The TmpMask is for in/out typemaps that use temporal objects */ #define SWIG_TMPOBJMASK (SWIG_NEWOBJMASK << 1) /* Simple returning values */ #define SWIG_BADOBJ (SWIG_ERROR) #define SWIG_OLDOBJ (SWIG_OK) #define SWIG_NEWOBJ (SWIG_OK | SWIG_NEWOBJMASK) #define SWIG_TMPOBJ (SWIG_OK | SWIG_TMPOBJMASK) /* Check, add and del mask methods */ #define SWIG_AddNewMask(r) (SWIG_IsOK(r) ? (r | SWIG_NEWOBJMASK) : r) #define SWIG_DelNewMask(r) (SWIG_IsOK(r) ? (r & ~SWIG_NEWOBJMASK) : r) #define SWIG_IsNewObj(r) (SWIG_IsOK(r) && (r & SWIG_NEWOBJMASK)) #define SWIG_AddTmpMask(r) (SWIG_IsOK(r) ? (r | SWIG_TMPOBJMASK) : r) #define SWIG_DelTmpMask(r) (SWIG_IsOK(r) ? (r & ~SWIG_TMPOBJMASK) : r) #define SWIG_IsTmpObj(r) (SWIG_IsOK(r) && (r & SWIG_TMPOBJMASK)) /* Cast-Rank Mode */ #if defined(SWIG_CASTRANK_MODE) # ifndef SWIG_TypeRank # define SWIG_TypeRank unsigned long # endif # ifndef SWIG_MAXCASTRANK /* Default cast allowed */ # define SWIG_MAXCASTRANK (2) # endif # define SWIG_CASTRANKMASK ((SWIG_CASTRANKLIMIT) -1) # define SWIG_CastRank(r) (r & SWIG_CASTRANKMASK) SWIGINTERNINLINE int SWIG_AddCast(int r) { return SWIG_IsOK(r) ? ((SWIG_CastRank(r) < SWIG_MAXCASTRANK) ? (r + 1) : SWIG_ERROR) : r; } SWIGINTERNINLINE int SWIG_CheckState(int r) { return SWIG_IsOK(r) ? SWIG_CastRank(r) + 1 : 0; } #else /* no cast-rank mode */ # define SWIG_AddCast(r) (r) # define SWIG_CheckState(r) (SWIG_IsOK(r) ? 1 : 0) #endif #include #ifdef __cplusplus extern "C" { #endif typedef void *(*swig_converter_func)(void *, int *); typedef struct swig_type_info *(*swig_dycast_func)(void **); /* Structure to store information on one type */ typedef struct swig_type_info { const char *name; /* mangled name of this type */ const char *str; /* human readable name of this type */ swig_dycast_func dcast; /* dynamic cast function down a hierarchy */ struct swig_cast_info *cast; /* linked list of types that can cast into this type */ void *clientdata; /* language specific type data */ int owndata; /* flag if the structure owns the clientdata */ } swig_type_info; /* Structure to store a type and conversion function used for casting */ typedef struct swig_cast_info { swig_type_info *type; /* pointer to type that is equivalent to this type */ swig_converter_func converter; /* function to cast the void pointers */ struct swig_cast_info *next; /* pointer to next cast in linked list */ struct swig_cast_info *prev; /* pointer to the previous cast */ } swig_cast_info; /* Structure used to store module information * Each module generates one structure like this, and the runtime collects * all of these structures and stores them in a circularly linked list.*/ typedef struct swig_module_info { swig_type_info **types; /* Array of pointers to swig_type_info structures that are in this module */ size_t size; /* Number of types in this module */ struct swig_module_info *next; /* Pointer to next element in circularly linked list */ swig_type_info **type_initial; /* Array of initially generated type structures */ swig_cast_info **cast_initial; /* Array of initially generated casting structures */ void *clientdata; /* Language specific module data */ } swig_module_info; /* Compare two type names skipping the space characters, therefore "char*" == "char *" and "Class" == "Class", etc. Return 0 when the two name types are equivalent, as in strncmp, but skipping ' '. */ SWIGRUNTIME int SWIG_TypeNameComp(const char *f1, const char *l1, const char *f2, const char *l2) { for (;(f1 != l1) && (f2 != l2); ++f1, ++f2) { while ((*f1 == ' ') && (f1 != l1)) ++f1; while ((*f2 == ' ') && (f2 != l2)) ++f2; if (*f1 != *f2) return (*f1 > *f2) ? 1 : -1; } return (int)((l1 - f1) - (l2 - f2)); } /* Check type equivalence in a name list like ||... Return 0 if equal, -1 if nb < tb, 1 if nb > tb */ SWIGRUNTIME int SWIG_TypeCmp(const char *nb, const char *tb) { int equiv = 1; const char* te = tb + strlen(tb); const char* ne = nb; while (equiv != 0 && *ne) { for (nb = ne; *ne; ++ne) { if (*ne == '|') break; } equiv = SWIG_TypeNameComp(nb, ne, tb, te); if (*ne) ++ne; } return equiv; } /* Check type equivalence in a name list like ||... Return 0 if not equal, 1 if equal */ SWIGRUNTIME int SWIG_TypeEquiv(const char *nb, const char *tb) { return SWIG_TypeCmp(nb, tb) == 0 ? 1 : 0; } /* Check the typename */ SWIGRUNTIME swig_cast_info * SWIG_TypeCheck(const char *c, swig_type_info *ty) { if (ty) { swig_cast_info *iter = ty->cast; while (iter) { if (strcmp(iter->type->name, c) == 0) { if (iter == ty->cast) return iter; /* Move iter to the top of the linked list */ iter->prev->next = iter->next; if (iter->next) iter->next->prev = iter->prev; iter->next = ty->cast; iter->prev = 0; if (ty->cast) ty->cast->prev = iter; ty->cast = iter; return iter; } iter = iter->next; } } return 0; } /* Identical to SWIG_TypeCheck, except strcmp is replaced with a pointer comparison */ SWIGRUNTIME swig_cast_info * SWIG_TypeCheckStruct(swig_type_info *from, swig_type_info *ty) { if (ty) { swig_cast_info *iter = ty->cast; while (iter) { if (iter->type == from) { if (iter == ty->cast) return iter; /* Move iter to the top of the linked list */ iter->prev->next = iter->next; if (iter->next) iter->next->prev = iter->prev; iter->next = ty->cast; iter->prev = 0; if (ty->cast) ty->cast->prev = iter; ty->cast = iter; return iter; } iter = iter->next; } } return 0; } /* Cast a pointer up an inheritance hierarchy */ SWIGRUNTIMEINLINE void * SWIG_TypeCast(swig_cast_info *ty, void *ptr, int *newmemory) { return ((!ty) || (!ty->converter)) ? ptr : (*ty->converter)(ptr, newmemory); } /* Dynamic pointer casting. Down an inheritance hierarchy */ SWIGRUNTIME swig_type_info * SWIG_TypeDynamicCast(swig_type_info *ty, void **ptr) { swig_type_info *lastty = ty; if (!ty || !ty->dcast) return ty; while (ty && (ty->dcast)) { ty = (*ty->dcast)(ptr); if (ty) lastty = ty; } return lastty; } /* Return the name associated with this type */ SWIGRUNTIMEINLINE const char * SWIG_TypeName(const swig_type_info *ty) { return ty->name; } /* Return the pretty name associated with this type, that is an unmangled type name in a form presentable to the user. */ SWIGRUNTIME const char * SWIG_TypePrettyName(const swig_type_info *type) { /* The "str" field contains the equivalent pretty names of the type, separated by vertical-bar characters. We choose to print the last name, as it is often (?) the most specific. */ if (!type) return NULL; if (type->str != NULL) { const char *last_name = type->str; const char *s; for (s = type->str; *s; s++) if (*s == '|') last_name = s+1; return last_name; } else return type->name; } /* Set the clientdata field for a type */ SWIGRUNTIME void SWIG_TypeClientData(swig_type_info *ti, void *clientdata) { swig_cast_info *cast = ti->cast; /* if (ti->clientdata == clientdata) return; */ ti->clientdata = clientdata; while (cast) { if (!cast->converter) { swig_type_info *tc = cast->type; if (!tc->clientdata) { SWIG_TypeClientData(tc, clientdata); } } cast = cast->next; } } SWIGRUNTIME void SWIG_TypeNewClientData(swig_type_info *ti, void *clientdata) { SWIG_TypeClientData(ti, clientdata); ti->owndata = 1; } /* Search for a swig_type_info structure only by mangled name Search is a O(log #types) We start searching at module start, and finish searching when start == end. Note: if start == end at the beginning of the function, we go all the way around the circular list. */ SWIGRUNTIME swig_type_info * SWIG_MangledTypeQueryModule(swig_module_info *start, swig_module_info *end, const char *name) { swig_module_info *iter = start; do { if (iter->size) { size_t l = 0; size_t r = iter->size - 1; do { /* since l+r >= 0, we can (>> 1) instead (/ 2) */ size_t i = (l + r) >> 1; const char *iname = iter->types[i]->name; if (iname) { int compare = strcmp(name, iname); if (compare == 0) { return iter->types[i]; } else if (compare < 0) { if (i) { r = i - 1; } else { break; } } else if (compare > 0) { l = i + 1; } } else { break; /* should never happen */ } } while (l <= r); } iter = iter->next; } while (iter != end); return 0; } /* Search for a swig_type_info structure for either a mangled name or a human readable name. It first searches the mangled names of the types, which is a O(log #types) If a type is not found it then searches the human readable names, which is O(#types). We start searching at module start, and finish searching when start == end. Note: if start == end at the beginning of the function, we go all the way around the circular list. */ SWIGRUNTIME swig_type_info * SWIG_TypeQueryModule(swig_module_info *start, swig_module_info *end, const char *name) { /* STEP 1: Search the name field using binary search */ swig_type_info *ret = SWIG_MangledTypeQueryModule(start, end, name); if (ret) { return ret; } else { /* STEP 2: If the type hasn't been found, do a complete search of the str field (the human readable name) */ swig_module_info *iter = start; do { size_t i = 0; for (; i < iter->size; ++i) { if (iter->types[i]->str && (SWIG_TypeEquiv(iter->types[i]->str, name))) return iter->types[i]; } iter = iter->next; } while (iter != end); } /* neither found a match */ return 0; } /* Pack binary data into a string */ SWIGRUNTIME char * SWIG_PackData(char *c, void *ptr, size_t sz) { static const char hex[17] = "0123456789abcdef"; const unsigned char *u = (unsigned char *) ptr; const unsigned char *eu = u + sz; for (; u != eu; ++u) { unsigned char uu = *u; *(c++) = hex[(uu & 0xf0) >> 4]; *(c++) = hex[uu & 0xf]; } return c; } /* Unpack binary data from a string */ SWIGRUNTIME const char * SWIG_UnpackData(const char *c, void *ptr, size_t sz) { unsigned char *u = (unsigned char *) ptr; const unsigned char *eu = u + sz; for (; u != eu; ++u) { char d = *(c++); unsigned char uu; if ((d >= '0') && (d <= '9')) uu = (unsigned char)((d - '0') << 4); else if ((d >= 'a') && (d <= 'f')) uu = (unsigned char)((d - ('a'-10)) << 4); else return (char *) 0; d = *(c++); if ((d >= '0') && (d <= '9')) uu |= (unsigned char)(d - '0'); else if ((d >= 'a') && (d <= 'f')) uu |= (unsigned char)(d - ('a'-10)); else return (char *) 0; *u = uu; } return c; } /* Pack 'void *' into a string buffer. */ SWIGRUNTIME char * SWIG_PackVoidPtr(char *buff, void *ptr, const char *name, size_t bsz) { char *r = buff; if ((2*sizeof(void *) + 2) > bsz) return 0; *(r++) = '_'; r = SWIG_PackData(r,&ptr,sizeof(void *)); if (strlen(name) + 1 > (bsz - (r - buff))) return 0; strcpy(r,name); return buff; } SWIGRUNTIME const char * SWIG_UnpackVoidPtr(const char *c, void **ptr, const char *name) { if (*c != '_') { if (strcmp(c,"NULL") == 0) { *ptr = (void *) 0; return name; } else { return 0; } } return SWIG_UnpackData(++c,ptr,sizeof(void *)); } SWIGRUNTIME char * SWIG_PackDataName(char *buff, void *ptr, size_t sz, const char *name, size_t bsz) { char *r = buff; size_t lname = (name ? strlen(name) : 0); if ((2*sz + 2 + lname) > bsz) return 0; *(r++) = '_'; r = SWIG_PackData(r,ptr,sz); if (lname) { strncpy(r,name,lname+1); } else { *r = 0; } return buff; } SWIGRUNTIME const char * SWIG_UnpackDataName(const char *c, void *ptr, size_t sz, const char *name) { if (*c != '_') { if (strcmp(c,"NULL") == 0) { memset(ptr,0,sz); return name; } else { return 0; } } return SWIG_UnpackData(++c,ptr,sz); } #ifdef __cplusplus } #endif swig-4.0.1/Lib/cdata.i0000644000175000017500000000533413527063513014311 0ustar williamwilliam/* ----------------------------------------------------------------------------- * cdata.i * * SWIG library file containing macros for manipulating raw C data as strings. * ----------------------------------------------------------------------------- */ %{ typedef struct SWIGCDATA { char *data; int len; } SWIGCDATA; %} /* ----------------------------------------------------------------------------- * Typemaps for returning binary data * ----------------------------------------------------------------------------- */ #if SWIGGUILE %typemap(out) SWIGCDATA { $result = scm_from_locale_stringn($1.data,$1.len); } %typemap(in) (const void *indata, int inlen) = (char *STRING, int LENGTH); #elif SWIGPHP7 %typemap(out) SWIGCDATA { ZVAL_STRINGL($result, $1.data, $1.len); } %typemap(in) (const void *indata, int inlen) = (char *STRING, int LENGTH); #elif SWIGJAVA %apply (char *STRING, int LENGTH) { (const void *indata, int inlen) } %typemap(jni) SWIGCDATA "jbyteArray" %typemap(jtype) SWIGCDATA "byte[]" %typemap(jstype) SWIGCDATA "byte[]" %fragment("SWIG_JavaArrayOutCDATA", "header") { static jbyteArray SWIG_JavaArrayOutCDATA(JNIEnv *jenv, char *result, jsize sz) { jbyte *arr; int i; jbyteArray jresult = JCALL1(NewByteArray, jenv, sz); if (!jresult) return NULL; arr = JCALL2(GetByteArrayElements, jenv, jresult, 0); if (!arr) return NULL; for (i=0; i Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . swig-4.0.1/CHANGES.current0000644000175000017500000001313713527063513015031 0ustar williamwilliamBelow are the changes for the current release. See the CHANGES file for changes in older releases. See the RELEASENOTES file for a summary of changes in each release. Issue # numbers mentioned below can be found on Github. For more details, add the issue number to the end of the URL: https://github.com/swig/swig/issues/ Version 4.0.1 (21 Aug 2019) =========================== 2019-08-20: TekuConcept [Javascript] #1535 Add %native support to Javascript. 2019-08-20: bkotzz [Java] #1616 Add SWIG_JavaIllegalStateException to support throwing java.lang.IllegalStateException from JNI code. 2019-08-19: sjml [Lua] #1596 tostring output changes to show the underlying C/C++ pointer. 2019-08-08: rokups [C#, Java] #1601 Fix invalid code generated for "%constant enum EnumType. 2019-08-07: wsfulton [Python] Fix method overloading of methods that take STL containers of different types. The following usage (using std::vector) would fail when using -builtin: %include %include %inline %{ struct X {}; %} %template(VectorX) std::vector; %template(VectorInt) std::vector; %inline %{ using namespace std; string VectorOverload(vector v); string VectorOverload(vector v); %} The following would incorrectly fail: s = VectorOverload([1, 2, 3]) With: Traceback (most recent call last): File "runme3.py", line 20, in ret = VectorOverload([1, 2, 3]) TypeError: Wrong number or type of arguments for overloaded function 'VectorOverload'. Possible C/C++ prototypes are: VectorOverload(std::vector< Number,std::allocator< Number > >) VectorOverload(std::vector< int,std::allocator< int > >) The problem was due to some error handling that was not cleared during typehecking. In this case an error was not cleared when the elements in the list failed the typecheck for converting to X. Only occurs in Python 3+. In some combinations of overloaded methods, the following type of error message would occur: RuntimeError: in sequence element 0 The above exception was the direct cause of the following exception: Traceback (most recent call last): File "runme3.py", line 23, in check(VectorOverload(v), "vector") SystemError: returned a result with an error set 2019-08-01: wsfulton #1602 Fix regression in 4.0.0 where a template function containing a parameter with the same name as the function name led to the parameter name used in the target language being incorrectly modified. 2019-07-29: wsfulton Remove all generated files on error. Previously generated files were not removed, potentially breaking Makefiles using file dependencies, especially when -Werror (warnings as errors) was used. 2019-07-23: smithx [C#] #1530 #1532 Fix marshalling of std::wstring to C#. 2019-07-18: gicmo [Python] #1587 Python 3.8 support - remove use of deprecated PyObject_GC_UnTrack. 2019-07-18: cher-nov [Python] #1573 Generated Python code uses consistent string quoting style - double quotes. 2019-07-16: geefr [C#] #616 #1576 Fix C# bool INPUT[], bool OUTPUT[], bool INOUT[] typemaps to marshall as 1-byte. 2019-07-12: vadz [C#, Java] #1568 #1583 Fix std::set<> typemaps for primitive types. 2019-07-12: vadz #1566 #1584 Regression in 4.0.0 - fix missing value for first item of enums with trailing comma. 2019-07-11: mcfarljm #1548 #1578 Fix segfault in Doxygen parser parsing empty lines in some commands like \code. 2019-07-09: IsaacPascual [C#, Java] #1570 Fix name of generated C#/Java classes for %interface macros in swiginterface.i when wrapping nested C++ classes. 2019-07-05: wsfulton [Python] #1547 Whitespace fixes in Doxygen translated comments into pydoc comments for Sphinx compatibility. 2019-06-28: wsfulton [MzScheme, OCaml] #1559 $arg and $input were incorrectly substituted in the argout typemap when two or more arguments were present. 2019-06-24: wsfulton [Python, Ruby] #1538 Remove the UnknownExceptionHandler class in order to be C++17 compliant as it uses std::unexpected_handler which was removed in C++17. This class was intended for director exception handling but was never used by SWIG and was never documented. *** POTENTIAL INCOMPATIBILITY *** 2019-06-06: bkotzz [Java] #1552 Improve performance in Java std::vector constructor wrapper that takes a native Java array as input. 2019-06-03: olly [Python] Fix regression in implicit_conv handling of tuples, introduced in SWIG 4.0.0. Fixes #1553, reported by Alexandre Duret-Lutz. 2019-05-24: wsfulton [Octave] Fix detection of Octave on MacOS. 2019-05-24: opoplawski [Octave] #1522 Adapt OCTAVE_LDFLAGS for Octave 5.1. 2019-05-22: ferdynator [PHP] #1528 Don't add a closing '?>' PHP tag to generated files. PSR-2 says it MUST be omitted for files containing only PHP. swig-4.0.1/.travis.yml0000644000175000017500000003313113527063513014462 0ustar williamwilliamlanguage: cpp matrix: include: - compiler: clang os: linux env: SWIGLANG= sudo: required dist: xenial - compiler: gcc os: linux env: SWIGLANG= sudo: required dist: xenial - os: linux env: SWIGLANG= GCC=4.4 sudo: required dist: xenial - os: linux env: SWIGLANG= GCC=4.6 sudo: required dist: xenial - os: linux env: SWIGLANG= GCC=4.7 sudo: required dist: xenial - os: linux env: SWIGLANG= GCC=4.8 sudo: required dist: xenial - os: linux env: SWIGLANG= GCC=4.9 sudo: required dist: xenial - os: linux env: SWIGLANG= GCC=6 sudo: required dist: xenial - os: linux env: SWIGLANG= GCC=7 sudo: required dist: xenial - os: linux env: SWIGLANG= GCC=8 sudo: required dist: xenial - os: linux env: SWIGLANG= GCC=9 sudo: required dist: xenial - compiler: gcc os: linux env: SWIGLANG=csharp sudo: required dist: xenial - compiler: gcc os: linux env: SWIGLANG=d sudo: required dist: xenial - compiler: gcc os: linux env: SWIGLANG=go VER=1.3 sudo: required dist: xenial - compiler: gcc os: linux env: SWIGLANG=go VER=1.8 sudo: required dist: xenial - compiler: gcc os: linux env: SWIGLANG=go VER=1.12 sudo: required dist: xenial - compiler: gcc os: linux env: SWIGLANG=guile sudo: required dist: xenial - compiler: gcc os: linux env: SWIGLANG=java sudo: required dist: xenial - compiler: gcc os: linux env: SWIGLANG=javascript ENGINE=node VER=0.10 sudo: required dist: xenial - compiler: gcc os: linux env: SWIGLANG=javascript ENGINE=node VER=4 CPP11=1 sudo: required dist: xenial - compiler: gcc os: linux env: SWIGLANG=javascript ENGINE=node VER=6 CPP11=1 sudo: required dist: xenial - compiler: gcc os: linux env: SWIGLANG=javascript ENGINE=node VER=8 CPP11=1 sudo: required dist: xenial - compiler: gcc os: linux env: SWIGLANG=javascript ENGINE=node VER=10 CPP11=1 sudo: required dist: xenial - compiler: gcc os: linux env: SWIGLANG=javascript ENGINE=jsc sudo: required dist: xenial - compiler: gcc os: linux env: SWIGLANG=javascript ENGINE=v8 sudo: required dist: xenial - compiler: gcc os: linux env: SWIGLANG=lua sudo: required dist: xenial - compiler: gcc os: linux env: SWIGLANG=lua VER=5.3 sudo: required dist: xenial - compiler: gcc os: linux env: SWIGLANG=mzscheme sudo: required dist: xenial - compiler: gcc os: linux env: SWIGLANG=ocaml sudo: required dist: xenial - compiler: gcc os: linux env: SWIGLANG=octave SWIGJOBS=-j2 sudo: required dist: xenial - compiler: gcc os: linux env: SWIGLANG=perl5 sudo: required dist: xenial - compiler: gcc os: linux env: SWIGLANG=php VER=7.0 sudo: required dist: xenial - compiler: gcc os: linux env: SWIGLANG=php VER=7.1 sudo: required dist: xenial - compiler: gcc os: linux env: SWIGLANG=php VER=7.2 sudo: required dist: xenial - compiler: gcc os: linux env: SWIGLANG=php VER=7.3 sudo: required dist: xenial - compiler: gcc os: linux env: SWIGLANG=python # 2.7 sudo: required dist: xenial - compiler: gcc os: linux env: SWIGLANG=python PY3=3 VER=3.2 sudo: required dist: xenial - compiler: gcc os: linux env: SWIGLANG=python PY3=3 VER=3.3 sudo: required dist: xenial - compiler: gcc os: linux env: SWIGLANG=python PY3=3 VER=3.4 sudo: required dist: xenial - compiler: gcc os: linux env: SWIGLANG=python PY3=3 VER=3.5 sudo: required dist: xenial - compiler: gcc os: linux env: SWIGLANG=python PY3=3 VER=3.6 sudo: required dist: xenial - compiler: gcc os: linux env: SWIGLANG=python PY3=3 VER=3.7 sudo: required dist: xenial - compiler: gcc os: linux env: SWIGLANG=python SWIG_FEATURES=-builtin sudo: required dist: xenial - compiler: gcc os: linux env: SWIGLANG=python SWIG_FEATURES="-builtin -O" sudo: required dist: xenial - os: linux env: SWIGLANG=python SWIG_FEATURES=-builtin GCC=6 CPP11=1 sudo: required dist: xenial - os: linux env: SWIGLANG=python SWIG_FEATURES=-builtin GCC=6 CPP11=1 PY3=3 VER=3.7 sudo: required dist: xenial - compiler: gcc os: linux env: SWIGLANG=python SWIG_FEATURES=-builtin PY3=3 VER=3.4 sudo: required dist: xenial - compiler: gcc os: linux env: SWIGLANG=python SWIG_FEATURES=-builtin PY3=3 VER=3.5 sudo: required dist: xenial - compiler: gcc os: linux env: SWIGLANG=python SWIG_FEATURES=-builtin PY3=3 VER=3.7 sudo: required dist: xenial - compiler: gcc os: linux env: SWIGLANG=python SWIG_FEATURES="-builtin -O" PY3=3 VER=3.7 sudo: required dist: xenial - compiler: gcc os: linux env: SWIGLANG=python SWIG_FEATURES=-builtin PY3=3 VER=3.7 SWIGOPTPY3= sudo: required dist: xenial - compiler: gcc os: linux env: SWIGLANG=python SWIG_FEATURES=-O sudo: required dist: xenial - compiler: gcc os: linux env: SWIGLANG=python SWIG_FEATURES=-O PY3=3 VER=3.7 sudo: required dist: xenial - compiler: gcc os: linux env: SWIGLANG=r sudo: required dist: xenial - compiler: gcc os: linux env: SWIGLANG=ruby VER=1.9 sudo: required dist: xenial - compiler: gcc os: linux env: SWIGLANG=ruby VER=2.0 sudo: required dist: xenial - compiler: gcc os: linux env: SWIGLANG=ruby VER=2.1 sudo: required dist: xenial - compiler: gcc os: linux env: SWIGLANG=ruby VER=2.2 sudo: required dist: xenial - compiler: gcc os: linux env: SWIGLANG=ruby VER=2.3 sudo: required dist: xenial - compiler: gcc os: linux env: SWIGLANG=ruby VER=2.4 sudo: required dist: xenial - compiler: gcc os: linux env: SWIGLANG=ruby VER=2.5 sudo: required dist: xenial - compiler: gcc os: linux env: SWIGLANG=ruby VER=2.6 sudo: required dist: xenial - compiler: gcc os: linux env: SWIGLANG=scilab sudo: required dist: xenial - compiler: gcc os: linux env: SWIGLANG=tcl sudo: required dist: xenial - os: linux env: SWIGLANG=csharp CPP11=1 sudo: required dist: xenial - os: linux env: SWIGLANG=go VER=1.6 CPP11=1 sudo: required dist: xenial - os: linux env: SWIGLANG=java CPP11=1 sudo: required dist: xenial - compiler: gcc os: linux env: SWIGLANG=octave SWIGJOBS=-j2 VER=4.4 CPP11=1 sudo: required dist: trusty - os: linux env: SWIGLANG=python CPP11=1 sudo: required dist: xenial - os: linux env: SWIGLANG=r CPP11=1 # Note: making 'R CMD SHLIB' use a different compiler is non-trivial sudo: required dist: xenial - os: linux env: SWIGLANG=ruby CPP11=1 sudo: required dist: xenial - os: linux env: SWIGLANG=tcl CPP11=1 sudo: required dist: xenial - os: linux env: SWIGLANG=csharp GCC=6 CPP14=1 sudo: required dist: xenial - os: linux env: SWIGLANG=go VER=1.6 GCC=6 CPP14=1 sudo: required dist: xenial - os: linux env: SWIGLANG=java GCC=6 CPP14=1 sudo: required dist: xenial - os: linux env: SWIGLANG=python GCC=6 CPP14=1 sudo: required dist: xenial - os: linux env: SWIGLANG=ruby GCC=6 CPP14=1 sudo: required dist: xenial - os: linux env: SWIGLANG=tcl GCC=6 CPP14=1 sudo: required dist: xenial - os: linux env: SWIGLANG=java GCC=7 CPP14=1 sudo: required dist: xenial - os: linux env: SWIGLANG=python GCC=7 CPP14=1 sudo: required dist: xenial - os: linux env: SWIGLANG=csharp GCC=8 CPP17=1 sudo: required dist: xenial - os: linux env: SWIGLANG=java GCC=8 CPP17=1 sudo: required dist: xenial - os: linux env: SWIGLANG=python GCC=8 CPP17=1 PY3=3 VER=3.7 sudo: required dist: xenial - os: linux env: SWIGLANG=csharp GCC=9 CPP17=1 sudo: required dist: xenial - os: linux env: SWIGLANG=java GCC=9 CPP17=1 sudo: required dist: xenial - os: linux env: SWIGLANG=python GCC=9 CPP17=1 PY3=3 VER=3.7 sudo: required dist: xenial - compiler: gcc os: osx env: SWIGLANG= - compiler: clang os: osx env: SWIGLANG= - compiler: clang os: osx env: SWIGLANG=csharp - compiler: clang os: osx env: SWIGLANG=go - compiler: clang os: osx env: SWIGLANG=guile - compiler: clang os: osx env: SWIGLANG=java - compiler: clang os: osx env: SWIGLANG=lua - compiler: clang os: osx env: SWIGLANG=octave SWIGJOBS=-j2 - compiler: clang os: osx env: SWIGLANG=perl5 - compiler: clang os: osx env: SWIGLANG=python - compiler: clang os: osx env: SWIGLANG=python PY3=3 - compiler: clang os: osx env: SWIGLANG=ruby - compiler: clang os: osx env: SWIGLANG=tcl - compiler: clang os: osx env: SWIGLANG=java CPP17=1 osx_image: xcode10.2 - compiler: clang os: osx env: SWIGLANG=python PY3=3 CPP17=1 osx_image: xcode10.2 allow_failures: # seg fault in director_basic testcase - compiler: gcc os: linux env: SWIGLANG=php VER=7.2 sudo: required dist: xenial # Sometimes hits the Travis 50 minute time limit - compiler: clang os: osx env: SWIGLANG=octave SWIGJOBS=-j2 # Experimental languages - compiler: gcc os: linux env: SWIGLANG=mzscheme sudo: required dist: xenial - compiler: gcc os: linux env: SWIGLANG=ocaml sudo: required dist: xenial before_install: - date -u - uname -a - if test "$TRAVIS_OS_NAME" = "linux"; then lscpu && cat /proc/cpuinfo | grep "model name" && cat /proc/meminfo | grep MemTotal; fi - if test "$TRAVIS_OS_NAME" = "osx"; then sysctl -a | grep brand_string; fi # Travis overrides CC environment with compiler predefined values - if test -n "$GCC"; then export CC="gcc-$GCC" && export CXX="g++-$GCC"; fi install: - if test "$TRAVIS_OS_NAME" = "linux"; then source Tools/travis-linux-install.sh; fi - if test "$TRAVIS_OS_NAME" = "osx"; then source Tools/travis-osx-install.sh; fi - ls -la $(which $CC) $(which $CXX) && $CC --version && $CXX --version script: - echo 'Configuring...' && echo -en 'travis_fold:start:script.1\\r' - if test -n "$CPP11"; then CONFIGOPTS+=(--enable-cpp11-testing --without-maximum-compile-warnings "CXXFLAGS=-std=c++11 -Wall -Wextra" "CFLAGS=-std=c11 -Wall -Wextra") && export CSTD=c11 && export CPPSTD=c++11; fi - if test -n "$CPP14"; then CONFIGOPTS+=(--enable-cpp11-testing --without-maximum-compile-warnings "CXXFLAGS=-std=c++14 -Wall -Wextra" "CFLAGS=-std=c11 -Wall -Wextra") && export CSTD=c11 && export CPPSTD=c++14; fi - if test -n "$CPP17"; then CONFIGOPTS+=(--enable-cpp11-testing --without-maximum-compile-warnings "CXXFLAGS=-std=c++17 -Wall -Wextra" "CFLAGS=-std=c17 -Wall -Wextra") && export CSTD=c17 && export CPPSTD=c++17; fi - if test -n "$SWIGLANG"; then CONFIGOPTS+=(--without-alllang --with-$WITHLANG); fi - echo "${CONFIGOPTS[@]}" - ./autogen.sh && mkdir -p build/build && cd build/build && ../../configure "${CONFIGOPTS[@]}" - echo -en 'travis_fold:end:script.1\\r' - make -s $SWIGJOBS - ./swig -version && ./swig -pcreversion - if test -z "$SWIGLANG"; then make -s $SWIGJOBS check-ccache; fi - if test -z "$SWIGLANG"; then make -s $SWIGJOBS check-errors-test-suite; fi - echo 'Installing...' && echo -en 'travis_fold:start:script.2\\r' - if test -z "$SWIGLANG"; then sudo make -s install && swig -version && ccache-swig -V; fi - echo -en 'travis_fold:end:script.2\\r' # Stricter compile flags for examples. Various headers and SWIG generated code prevents full use of -pedantic. - if test -n "$SWIGLANG"; then cflags=$($TRAVIS_BUILD_DIR/Tools/testflags.py --language $SWIGLANG --cflags --std=$CSTD --compiler=$CC) && echo $cflags; fi - if test -n "$SWIGLANG"; then cxxflags=$($TRAVIS_BUILD_DIR/Tools/testflags.py --language $SWIGLANG --cxxflags --std=$CPPSTD --compiler=$CC) && echo $cxxflags; fi - if test -n "$SWIGLANG"; then make -s check-$SWIGLANG-version; fi - if test -n "$SWIGLANG"; then make check-$SWIGLANG-enabled; fi - if test -n "$SWIGLANG"; then make $SWIGJOBS check-$SWIGLANG-examples CFLAGS="$cflags" CXXFLAGS="$cxxflags"; fi - if test -n "$SWIGLANG"; then make $SWIGJOBS check-$SWIGLANG-test-suite CFLAGS="$cflags" CXXFLAGS="$cxxflags"; fi - echo 'Cleaning...' && echo -en 'travis_fold:start:script.3\\r' - make check-maintainer-clean && ../../configure $CONFIGOPTS - echo -en 'travis_fold:end:script.3\\r' swig-4.0.1/preinst-swig.in0000644000175000017500000000035613527063513015337 0ustar williamwilliam#!/bin/sh # Convenience script for running SWIG before it is installed. # Intended for ad-hoc usage and not by the test-suite or examples. builddir=`dirname "$0"` SWIG_LIB='@SWIG_LIB_PREINST@' export SWIG_LIB exec "$builddir/swig" "$@" swig-4.0.1/CHANGES0000644000175000017500000401554113527063513013355 0ustar williamwilliamSWIG (Simplified Wrapper and Interface Generator) See the CHANGES.current file for changes in the current version. See the RELEASENOTES file for a summary of changes in each release. Issue # numbers mentioned below can be found on Github. For more details, add the issue number to the end of the URL: https://github.com/swig/swig/issues/ Version 4.0.0 (27 Apr 2019) =========================== 2019-04-24: vadz #1517 Fix crash if "@return" Doxygen tag was used on a node without any return type. 2019-04-24: vadz #1515 Fix parsing of enums with trailing comma when using -doxygen. 2019-04-19: ianlancetaylor [Go] #1055 When generating Go code, make -cgo the default. Add new -no-cgo option to disable the default. 2019-04-19: pbecherer [Tcl] #1508 Fix Visual Studio 2015 and later compilation errors due to snprintf macro definition. 2019-04-09: wsfulton [C#] Fix FxCop warning CA2002 in SWIGPendingException - a lock on a reference of type 'Type'. 2019-03-30: wsfulton [Java, D] Add the parameters typemap attribute to the javadestruct, javadestruct_derived, ddispose, ddispose_derived typemaps to mirror enhanced flexibility in the csdisposing and csdisposing_derived (C#) typemaps. If provided the contents are generated as the delete/dispose method's parameters declaration. 2019-03-30: wsfulton [C#] #421 Fix FxCop warning CA1063 by implementing the recommended Dispose methods for the IDisposable interface. Previously just the Dispose() method was generated. Now the Dispose() and Dispose(bool disposing) methods are generated. Changes are required if custom "csfinalize", "csdestruct" or "csdestruct_derived" typemaps are being used. Details in #421 on Github. SWIG will error out if one of the "csfinalize, "csdestruct" or "csdestruct_derived" typemaps are found. Example error message: foo.h:60: Error: A deprecated csfinalize typemap was found for Foo, please remove it and replace all csdestruct, csdestruct_derived and csfinalize typemaps by the csdispose, csdispose_derived, csdisposing and csdisposing_derived typemaps. *** POTENTIAL INCOMPATIBILITY *** 2019-03-25: Liryna [C#] #1143 Add std_list.i for std::list support. The C# std::list wrappers are made to look and feel like a C# System.Collections.Generic.LinkedList<> collection. The IEnumerable<> interface is implemented in the proxy class. The ICollection<> interface can also be implemented to provide enhanced functionality whenever a C++ operator== is available. This is the case for when T is a primitive type or a pointer. If T does define an operator==, then use the SWIG_STD_LIST_ENHANCED macro to obtain this enhanced functionality, for example: SWIG_STD_LIST_ENHANCED(SomeNamespace::Klass) %template(ListKlass) std::list; 2019-03-18: richardbeare [R] #1328 Non-trivial enums are working now. The enum values are now obtained from the C/C++ layer. const reference enums and C++11 enum classes are also now working. 2019-03-14: mochizk [Javascript] #1500 Fix compilation errors due to deprecating V8 API in Node.js. New V8 API is used if node.js >= v10.12, or if V8 >= v7.0. 2019-03-12: vadz [C#] #1495 Add std_set.i for std::set support. 2019-03-11: dirteat,opoplawski [Octave] Fix compilation errors in Octave 5.1. error: format not a string literal and no format arguments [-Werror=format-security] 2019-02-28: wsfulton [Java] std::vector improvements for types that do not have a default constructor. The std::vector wrappers have been changed to work by default for elements that are not default insertable, i.e. have no default constructor. This has been achieved by not wrapping: vector(size_type n); Previously the above had to be ignored via %ignore. If the above constructor is still required it can be added back in again via %extend: %extend std::vector { vector(size_type count) { return new std::vector< T >(count); } } Alternatively, the following wrapped constructor could be used as it provides near-enough equivalent functionality: vector(jint count, const value_type& value); *** POTENTIAL INCOMPATIBILITY *** 2019-02-25: wsfulton [Python] Fix compile errors wrapping overloaded functions/constructors where a vararg function is declared after a non-vararg function. 2019-02-23: zphensley42 Use fully qualified name 'java.lang.Object' instead of 'Object' in generated code to avoid clashes with wrapped C++ classes called 'Object'. 2019-02-23: gtbX [Java] #1035 Add (const char *STRING, size_t LENGTH) typemaps in addition to the non-const typemaps (char *STRING, size_t LENGTH) which does not attempt to write back to the const string. 2019-02-22: tamuratak [Ruby] #984 Add support for RTypedData introduced in Ruby 1.9.3. 2019-02-22: ZackerySpytz #1483 Fix compilation failures when a director class has final methods. 2019-02-21: wsfulton [Java] #1240 Suppress Java 9 deprecation warnings on finalize method. 2019-02-21: ZackerySpytz #1480 Fix some rejections of valid floating-point literals. 2019-02-19: wsfulton #1475 Fix regression parsing gcc preprocessor linemarkers in the form: # linenum filename flags 2019-02-18: jakecobb [Python] #945 #1234 Elements in std::vector memory access fix. Accessing an element in a std::vector obtains a reference to the element via an iterator pointing to the element in the container. If the vector is garbage collected, the SWIG wrapper containing the pointer to the element becomes invalid. The fix is to obtain a back-reference to the container by the wrapper to the element in the Python layer to prevent the garbage collector from destroying the underlying container. 2019-02-17: wsfulton Fix typemap matching to expand template parameters when the name contains template parameters. In the %typemap below the type is T and the name is X::make and the name now expands correctly to X< int >::make template struct X { %typemap(out) T X::make "..." T make(); }; %template(Xint) X; 2019-02-16: wsfulton Fix parser error containing multiple #define statements inside an enum. The second #define fails to parse: enum FooEnum { ENUM1 = 0, ENUM2 = 1, #define MACRO_DEF1 "Hello" #define MACRO_DEF2 "World!" ENUM3 = 2, ENUM4 = 3, }; Bug mentioned at https://sourceforge.net/p/swig/patches/333/ 2019-02-14: wsfulton Add some missing copy constructors into STL containers. 2019-02-14: bkotzz [Java] #1356 Add STL containers: std::unordered_map std::unordered_set std::set 2019-02-14: bkotzz [Java] #1356 std::map wrappers have been modified. Now the Java proxy class extends java.util.AbstractMap. The std::map container looks and feels much like a java.util.HashMap from Java. A few members have changed their names. If the old method signatures are needed, then copy std_map.i from swig-3.0.12 and use that instead. Alternatively, add the old missing methods to the new methods by using the following %proxycode: %extend std::map { %proxycode %{ // Old API public boolean empty() { return isEmpty(); } public void set($typemap(jboxtype, K) key, $typemap(jboxtype, T) x) { put(key, x); } public void del($typemap(jboxtype, K) key) { remove(key); } public boolean has_key($typemap(jboxtype, K) key) { return containsKey(key); } %} } *** POTENTIAL INCOMPATIBILITY *** 2019-02-13: ZackerySpytz #1469 Add support for C++17 hexadecimal floating literals. 2019-02-11: wsfulton [OCaml] #1437 OCaml has been give the 'Experimental' language status. The examples work and most of the test-suite is also working, so it is quite close to being a 'Supported' language. 2019-02-10: ZackerySpytz #1464 Add support for C++14 binary integer literals. 2019-02-10: ZackerySpytz #1450 Add support for C++11 UCS-2 and UCS-4 character literals. Also, add support for C++17 UTF-8 character literals. 2019-02-10: wsfulton [MzScheme] #1437 MzScheme/Racket is now an 'Experimental' language. The examples work and a large portion of the test-suite is also working. 2019-02-10: wsfulton [MzScheme] Destructor wrappers were not being generated. 2019-02-10: wsfulton [MzScheme] Static variable wrappers fixed - $argnum was not expanded. 2019-02-10: sethrj #1452 Fix %apply for anonymous template instantiations 2019-02-09: olly [PHP] Fix access to already released memory during PHP module shutdown, which often didn't cause visible problems, but could result in segmentation faults, bus errors, etc. Fixes #1170, reported by Jitka Plesníková. 2019-02-09: olly [PHP] A renamed constructor is now wrapped as a static method in PHP. 2019-02-08: olly [PHP] Don't generate code which references $r when $r hasn't been defined. This could happen in overloaded methods which returned void and took at least one const std::string& parameter. 2019-02-08: olly [PHP] The generated code is now compatible with PHP 7.3, and the testsuite now runs cleanly with this version too. 2019-02-05: wsfulton #1437 SWIG now classifies the status of target languages into either 'Experimental' or 'Supported'. This status is provided to indicate the level of maturity to expect when using a particular target language as not all target languages are fully developed. Details are in the Introduction.html chapter of the documentation. 2019-02-04: wsfulton [CFFI] #1447 Common Lisp CFFI has been disabled as a target language in SWIG as part of a clean up to remove target languages that have been neglected/not functional. 2019-02-04: wsfulton [Allegrocl] #1447 Allegro Common Lisp has been disabled as a target language in SWIG as part of a clean up to remove target languages that have been neglected/not functional. 2019-02-04: wsfulton [Chicken] #1447 CHICKEN has been disabled as a target language in SWIG as part of a clean up to remove target languages that have been neglected/not functional. 2019-02-04: wsfulton [CLISP] #1447 GNU Common Lisp has been disabled as a target language in SWIG as part of a clean up to remove target languages that have been neglected/not functional. 2019-02-04: wsfulton [S-EXP] #1447 Common Lisp S-Exp has been disabled as a target language in SWIG as part of a clean up to remove target languages that have been neglected/not functional. 2019-02-04: wsfulton [UFFI] #1447 Common Lisp UFFI has been disabled as a target language in SWIG as part of a clean up to remove target languages that have been neglected/not functional. 2019-02-04: wsfulton [Pike] #1447 Pike has been disabled as a target language in SWIG as part of a clean up to remove target languages that have been neglected/not functional. 2019-02-04: wsfulton [Modula3] #1447 Modula3 has been disabled as a target language in SWIG as part of a clean up to remove target languages that have been neglected/not functional. 2019-02-02: ahnolds [Python] Documentation enhancements for Python: #728 Fixed the handling of autodoc when using -fastproxy. #1367 Added documentation to wrapped member variables using the property(... doc="...") construct. Only show a single documentation entry for functions with default arguments when using autodoc. Fixed a bug where a cached doxygen docstring could be deleted while still in use, causing swig to segfault. 2019-01-31: olly SWIG now requires a target language to be specified instead of defaulting to wrapping for Tcl. Specifying swig --help without a target language now just shows the generic help. The -nolang option has been removed. 2019-01-28: ZackerySpytz [OCaml] #1429 Remove support for OCaml versions < 3.12.0. *** POTENTIAL INCOMPATIBILITY *** 2019-01-22: vadz [Ruby, Octave] #1424 Improve autodoc parameter naming. 2019-01-22: vadz [Python] #1271 #1423 Always include default parameter values in autodoc strings. 2019-01-19: vadz #1272, #1421 When a function's parameter is a keyword, the name of the paramater is no longer simply changed to argN, where N is the argument number. Instead the parameter name is changed to the renaming rules for keywords that normally apply to symbols such as classes/functions etc. Note that unlike other symbol renaming, parameter renaming does not issue a warning when the parameter is renamed. This change only affects languages where the parameter names are actually used, for example, Java function parameter lists in the proxy class or Python documentation comments. 2019-01-18: wsfulton #1420 Fix gdb debugger functions 'swigprint' and 'locswigprint' from swig.gdb to work with newer versions of gdb-8. Fixes errors when debugging SWIG source with gdb: (gdb) swigprint n Undefined command: "Printf". Try "help". 2019-01-16: wsfulton Python static method wrapper changes - Static method wrappers were using the 'fastproxy' approach by default. This is inconsistent with instance method wrappers. The fastproxy approach is now turned off by default to be consistent with instance methods. Static method wrappers can now also be controlled using the -fastproxy and -olddefs options. Example: struct Klass { static int statmethod(int a = 2); }; generates by default: class Klass(object): ... @staticmethod def statmethod(a=2): return _example.Klass_statmethod(a) instead of the following (which can be restored by using -fastproxy): class Klass(object): ... statmethod = staticmethod(_example.Klass_statmethod) - Modernise wrappers for static methods to use decorator syntax - @staticmethod. - Add missing runtime test for static class methods and using the actual class method. 2019-01-12: ZackerySpytz [OCaml] #1403 #1194 Fix compilation problems for OCaml >= 4.03.0 due to OCaml using int64_t instead of int64. 2019-01-11: ZackerySpytz [OCaml] #1400 Fix the getters and setters of non-static member variables. 2019-01-07: wsfulton #358 Add VOID to windows.i 2019-01-05: wsfulton #948 #1019 #1273 Fix for C++11 raw strings where the delimiters were mistakenly left in the string contents in situations where the string was copied into generated code. For example, %constant, the "docstring" feature and for C#/Java/D constants turned on with %javaconst/%csconst/%dmanifestconst. 2019-01-05: wsfulton [Ruby] #538. Fix Ruby support for %feature("docstring"). 2019-01-03: wsfulton #1202 Fix overloading of non-pointer class types in scripting languages when overloaded with a pointer and a NULL scripting language equivalent is used, eg None in Python. The implementation changes the SWIGTYPE, SWIGTYPE& and SWIGTYPE&& typecheck typemaps to prevent accepting a conversion to a NULL pointer. 2019-01-03: ZackerySpytz [OCaml] #1386 Fix the OCaml examples and test suite for out-of-source builds. 2019-01-01: wsfulton [Python] #639 remove duplicate proxy method definitions for global function wrappers. Global functions previously generated two definitions, eg: def foo(): return _example.foo() foo = _example.foo The first definition is replaced by the second definition and so the second definition is the one used when the method is actually called. Now just the first definition is generated by default and if the -fastproxy command line option is used, just the second definition is generated. The second definition is faster as it avoids the proxy Python method as it calls the low-level C wrapper directly. Using both -fastproxy and -olddefs command line options will restore the previously generated code as it will generate both method definitions. With this change, the wrappers for global C/C++ functions and C++ class methods now work in the same way wrt to generating just a proxy method by default and control via -fastproxy/-olddefs options. 2018-12-20: hasinoff,wsfulton [Java] #1334 Set Java thread name to native thread name when using directors. Default is to use name "Thread-XXX" and is still works like this by default. However, adding the following will turn on the thread name setting (works for more recent versions of Linux and MacOS): %begin %{ #define SWIG_JAVA_USE_THREAD_NAME %} 2018-12-20: chlandsi [Python] #1357. Fix overriding __new__ in Python 3.6. Fixes SystemError: Objects/tupleobject.c:81: bad argument to internal function" 2018-12-16: wsfulton [Python] #848 #1343 The module import logic has changed to stop obfuscating real ImportError problems. Only one import of the low-level C/C++ module from the pure Python module is attempted now. Previously a second import of the low-level C/C++ module was attempted after an ImportError occurred and was done to support 'split modules'. A 'split module' is a configuration where the pure Python module is a module within a Python package and the low-level C/C++ module is a global Python module. Now a 'split module' configuration is no longer supported by default. This configuration can be supported with a simple customization, such as: %module(package="mypackage", moduleimport="import $module") foo or if using -builtin: %module(package="mypackage", moduleimport="from $module import *") foo instead of %module(package="mypackage") foo See the updated Python chapter titled "Location of modules" in the documentation. 2018-12-11: tlby [Perl] #1374 repair EXTEND() handling in typemaps 2018-12-06: vadz #1359 #1364 Add missing nested class destructor wrapper when the nested class is inside a template. Removes associated bogus 'Illegal destructor name' warning. Only occurred when the nested class' destructor is explicitly specified. 2018-12-04: adr26 [Python] #1368 #1369 Access Violation in tp_print caused by mismatched Python/extension CRT usage Remove all use of tp_print, as this API uses a FILE*, which can be mismatched when modules are built with different C libraries from the main python executable. This change also brings consistent output between Python 2 and 3 for the 'cvar' SWIG object (that contains the global variables) and SWIG packed objects (such as callback constants). 2018-12-04: wsfulton [Python] #1282 Fix running 'python -m' when using 'swig -builtin' Similar to the earlier PEP 366 conforming fix for non-builtin. 2018-11-29: adr26 [Python] #1360 Leak of SWIG var link object Fix reference counting on _SWIG_globals to allow var link to be freed on module unload. 2018-11-28: wsfulton [Python] When using -builtin, the two step C-extension module import is now one step and the wrapped API is only available once and not in an underlying module attribute like it is without -builtin. To understand this, consider a module named 'example' (using: %module example). The C-extension is compiled into a Python module called '_example' and a pure Python module provides the actual API from the module called 'example'. It was previously possible to additionally access the API from the module attribute 'example._example'. The latter was an implementation detail and is no longer available. It shouldn't have been used, but if necessary it can be resurrected using the moduleimport attribute described in the Python chapter of the documentation. If both modules are provided in a Python package, try: %module(moduleimport="from . import _example\nfrom ._example import *") example or more generically: %module(moduleimport="from . import $module\nfrom .$module import *") example and if both are provided as global modules, try: %module(moduleimport="import _example\nfrom _example import *") example or more generically: %module(moduleimport="import $module\nfrom $module import *") example The module import code shown will appear in the example.py file. 2018-11-24: vadz #1358 Fix handling of abstract base classes nested inside templates Correct detecting of whether a derived class method overrides a pure virtual base class method when both classes are nested inside a template class: this notably didn't work correctly for methods taking parameters of the base class type. 2018-11-22: rupertnash [Python] #1282 Make generated module runnable via python -m (PEP 366 conforming) Previously any SWIG generated modules in a package would fail with an ImportError when using 'python -m' for example 'python -m mypkg.mymodule'. This fix also allows the SWIG generated module to be placed into a directory and then renamed __init__.py to convert the module into a package again. This ability stopped working in swig-3.0.9. However, only Python 2.7 or 3.3 and later work. If Python 3.2 support is needed, use moduleimport in %module to customise the import code. 2018-11-13: wsfulton #1340 Remove -cppcast and -nocppcast command line options (this was an option available to the scripting language targets). The -cppcast option is still turned on by default. The -nocppcast option to turn off the use of c++ casts (const_cast, static_cast etc) has been removed. However, defining SWIG_NO_CPLUSPLUS_CAST will still generate C casts instead of C++ casts for C++ wrappers. *** POTENTIAL INCOMPATIBILITY *** 2018-11-13: wsfulton [Python] #1340 Remove -outputtuple and -nooutputtuple command line options. Both the command line and %module options of the same name have been removed. These were undocumented. The -outputtuple option returned a Python tuple instead of a list, mostly typically in the OUTPUT typemap implementations. It unclear why a tuple instead of a list return type is needed and hence this option has been removed as part of the simplification of the SWIG Python command line options for SWIG 4. 2018-11-13: wsfulton [Python] #1340 Remove -noproxyimport command line option. This option turned off the insertion of Python import statements derived from a %import directive. For example given: %module module_b %import "module_a.i" then module_b.py will contain: import module_a *** POTENTIAL INCOMPATIBILITY *** 2018-10-29: AlexanderGabriel [PHP] The following PHP7 reserved keywords are now only renamed by SWIG when used as function names in the API being wrapper: __halt_compiler array die echo empty eval exit include include_once isset list print require require_once return unset 2018-10-22: olly,wsfulton [Python] #1261 #1340 Turn on many optimisation options by default and rationalise the number of command line options. There were an unnecessary number of command line options and many of these have now been removed in a drive for simplification. Some were needed to support older versions of Python (2.6 and earlier). Many of the options could be turned on individually and when using -O. Previously -O resulted in turning on a set of options: -modern -fastdispatch -nosafecstrings -fvirtual -noproxydel -fastproxy -fastinit -fastunpack -fastquery -modernargs -nobuildnone Now -O results in turning on this reduced set: -fastdispatch -fastproxy -fvirtual The following options are now on by default, a deprecated warning is displayed if they are used: -fastinit Class initialisation code done in C/C++ rather than in Python code. -fastquery Python dictionary used for lookup of types. -fastunpack Faster unpacking of function arguments in C/C++ wrappers. -modern Use Python 2.3 features such as object and property. -modernargs Use Python 2.3 C APIs for unpacking arguments in tuples. -noproxydel Stop generating a proxy __del__ method for backwards compatiblity. -safecstrings No discernable difference The following options have been removed altogether: -aliasobj0 -buildnone -classptr -new_repr -newrepr -noaliasobj0 -nobuildnone -nocastmode -nodirvtable -noextranative -nofastinit -nofastproxy -nofastquery -nomodern -nomodernargs -nooutputtuple -nosafecstrings -old_repr -oldrepr -proxydel -new_vwm is no longer supported. Use the -newvwm alias instead. *** POTENTIAL INCOMPATIBILITY *** 2018-10-22: olly [Python] #1261 Remove command line option no longer needed as Python 2.3 and earlier are no longer supported: -classic 2018-10-09: wsfulton [D, Go, Guile, Lua, Mzscheme, Ocaml, Perl5, Php, Scilab, Tcl] Allow wrapping of std::map using non-default comparison function. 2018-10-09: vadz [Java] #1274 Allow wrapping of std::map using non-default comparison function. 2018-10-04: wsfulton [Python] #1126 Fix C default arguments with -builtin and -fastunpack and -modernargs. Problem occurred when there is just one (defaulted) parameter in the parameter list. 2018-09-24: wsfulton [Python] #1319 C++11 hash tables implementation is finished now (including for -builtin): std::unordered_map std::unordered_set std::unordered_multimap std::unordered_multiset 2018-09-21: wsfulton [Python] Fix when using -builtin and wrapping std::map, std::set, std::unordered_map or std::unordered_set to ensure __contains__ is called. This is a wrapper for the STL container's find method. Without it, Python will do its own slower sequence search. 2018-09-19: wsfulton [Python] Fix functors (wrapped as __call__) when using -builtin -modern -fastunpack. 2018-09-02: andreas.gaeer,tkrasnukha [Python] #1321 Fix assert in PyTuple_GET_SIZE in debug interpreter builds of python-3.7 when calling tp_new. 2018-09-01: ChristopherHogan [Guile] #1288 Fix garbage collection for guile >= 2.0.12. 2018-08-31: wsfulton [Python] #1319 C++11 hash tables support: std::unordered_map std::unordered_set std::unordered_multimap std::unordered_multiset is now compiling and working (sorting using -builtin not fully functional yet though). 2018-08-20: wkalinin #1305 Fix nested structure symbol tables in C mode to fix member name conflicts in different structs with the same nested struct member name. 2018-08-18: wsfulton [Python] #688 Fix makefile recursion when running python test-suite. 2018-08-18: wsfulton [Python] #1310 Re-implement Python -fastproxy option. The previous implementation failed with Python 3 and abstract base clases. The new implementation replaces the Python 2 implementation using new.instancemethod with the C API PyMethod_New to match the equivalent Python 3 implementation which uses PyInstanceMethod_New. The new approach runs slightly faster. See #1310. 2018-08-12: gmazzamuto [Python] #1283 Update pybuffer.i library to use new-style Python buffer C API. 2018-08-12: brianhatwood,wsfulton [Java] #1303 #1304 Fix crash in directors when using OUTPUT and INOUT typemaps in typemaps.i and passing NULL pointers in C++ to director method overloaded and implemented in Java. 2018-08-10: wsfulton [Python] #1293 Improve TypeError message inconsistencies between default and fastdispatch mode when handling overloaded C++ functions. Previously the error message did not always display the possible C/C++ prototypes in fastdispatch mode. 2018-08-02: furylynx,jacobwgillespie,p2k [Javascript] #1290, #968. Add support for NodeJS versions 2-10. 2018-07-31: wsfulton [Python] #1293 Overloaded C++ function wrappers now raise a TypeError instead of NotImplementedError when the types passed are incorrect. This change means there is now consistency with non-overloaded function wrappers which have always raised TypeError when the incorrect types are passed. The error message remains the same and is for example now: TypeError: Wrong number or type of arguments for overloaded function 'f'. Possible C/C++ prototypes are: f(int) f(char const *) instead of: NotImplementedError: Wrong number or type of arguments for overloaded function 'f'. Possible C/C++ prototypes are: f(int) f(char const *) *** POTENTIAL INCOMPATIBILITY *** 2018-06-23: wsfulton [Python] #718 Fix pythonnondynamic feature for modern classes Fixes nondynamic mode when an instance variable is set with the same name as a class variable in a class derived from a SWIG proxy class. This corner case set an instance variable instead of raising an AttributeError. Also fix %pythonnondynamic in Python 3 with -modern. The metaclass containing the implementation was previously not being applied in Python 3. 2018-07-17: petrmitrichev,wsfulton [Python] #1275 #1279 Initialize function-local statics (singletons) that call Python code during Python module initialization in order to avoid deadlocks with subsequent multi-threaded usage. 2018-06-15: wsfulton [Python] Fix seg fault using Python 2 when passing a Python string, containing invalid utf-8 content, to a wstring or wchar * parameter. A TypeError is thrown instead, eg: %include void instring(const std::wstring& s); instring(b"h\xe9llooo") # Python 2018-06-15: wsfulton [Python] Python 3.7 support: Replace use of deprecated PyUnicode_GetSize with PyUnicode_GetLength to remove deprecated warnings compiling the C/C++ wrappers. 2018-06-12: wsfulton [Python] Python 3.7 support: The %pythonabc feature in pyabc.i now uses base classes collections.abc.MutableSequence collections.abc.MutableMapping collections.abc.MutableSet instead of collections.MutableSequence collections.MutableMapping collections.MutableSet as the latter are deprecated in Python 3.7 and are due to be removed in Python 3.8. The classes in collections.abc.* are available from Python 3.3 onwards. If you require support for Python 3.2, then copy the pyabc.i file and modify by removing the few instances of the .abc sub-module. *** POTENTIAL INCOMPATIBILITY *** 2018-06-12: olly,wsfulton [Python] #701 Remove support for Python versions < 2.7 and 3.0 and 3.1. *** POTENTIAL INCOMPATIBILITY *** 2018-06-11: olly [Python] Fix new GCC8 warnings in generated code by avoiding casts between incompatible function types where possible, and by suppressing the warning when it's due to the design of Python's C API. Fixes #1259. 2018-06-08: philippkraft [Python] Stop exposing _swigregister to Python. It's not useful for user Python code to call this, and it just clutters the API unnecessarily. Fixes #1225. 2018-06-07: cmfoil, kabbi, Jamie Kirkpatrick, markok314, vadz, wsfulton, Yann Diorcet #170 Doxygen documentation support added. This allows translation of Doxygen comments into JavaDoc and PyDoc documentation. It is enabled via the -doxygen command line option. See the Doxygen.html chapter in the documentation for further information. 2018-06-07: olly [PHP] We've finally removed support for %pragma(php4) which was deprecated back in 2008. Use %pragma(php) instead, which has been supported since at least 2005. *** POTENTIAL INCOMPATIBILITY *** 2018-06-07: olly [PHP5] Support for PHP5 has been removed. PHP5 is no longer actively supported by the PHP developers and security support for it ends completely at the end of 2018, so it doesn't make sense to include support for it in the upcoming SWIG 4.0.0 release. *** POTENTIAL INCOMPATIBILITY *** 2018-06-06: olly [Lua] Improve configure probes for Lua headers and libs used in testsuite. 2018-05-15: kwwette [Octave] add support for version 4.4 - Should not introduce any user-visible incompatibilities 2018-05-15: wsfulton [C#, D, Java] Fix lookup of csconstruct, dconstruct and javaconstruct typemaps. The C++ namespace was previously ignored when looking up the typemap. 2018-05-15: wsfulton [Javascript] Fix generated C++ code when using %nspace on namespaces that are more than two levels deep. 2018-05-14: wsfulton Issue #1251 Add support for C++17 nested namespace definitions, for example: namespace A::B { ... } 2018-05-11: wsfulton [C#, D, Java] Add support so that the %csmethodmodifiers, %dmethodmodifiers, %javamethodmodifiers can modify the method modifiers for the destructor wrappers in the proxy class: dispose, Dispose, delete. With this feature, it is now possible to make a C# proxy class sealed, eg when wrapping a class X, the virtual method modifiers can be removed using: %typemap(csclassmodifiers) X "public sealed class" %csmethodmodifiers X::~X "public /*virtual*/"; 2018-04-18: olly [Python] Suppress new pycodestyle warning: E252 missing whitespace around parameter equals 2018-04-07: goatshriek [Ruby] #1213 Fix ruby %alias directive for global C/C++ functions. 2018-04-03: olly [Ruby] Fix to pass Qnil instead of NULL to rb_funcall(), which silences GCC -Wconversion-null warning (on by default with recent GCC). 2018-03-09: wsfulton [Java] #1184 Fix swigReleaseOwnership() and swigTakeOwnership() regression for non-director classes. Restores a dynamic_cast which was previously removed. 2018-03-07: llongi Github PR #1166 - Fix preprocessor handling of macros with commas in a // comment. 2018-02-18: JPEWdev Patch #1164 - Add support for a command-line options file, also sometimes called a response file. This is useful if the command-line options exceed the system command-line length limit. To use, put the command-line options into a file, then provide the file name prefixed with @, for example using a file called args.txt: swig @args.txt 2018-02-11: wsfulton [Javascript] #1187 Fix compilation error wrapping std::complex via std_complex.i. 2018-01-30: smarchetto [Scilab] add type name argument in SWIG_ptr() function to cast from pointer address to typed pointers 2018-01-16: wsfulton Expressions following a preprocessor directive must now be separated by whitespace or non-numeric characters. This syntax change makes the SWIG preprocessor work like the C preprocessor in this area. For example, the following code used be accepted as valid syntax: #if1 #define ABC 123 #endif Now you get an error: example.h:1: Error: Unknown SWIG preprocessor directive: if1 (if this is a block of target language code, delimit it with %{ and %}) example.h:3: Error: Extraneous #endif. The following is the correct syntax: #if 1 #define ABC 123 #endif The following of course also works: #if(1) #define ABC 123 #endif *** POTENTIAL INCOMPATIBILITY *** 2018-01-15: wsfulton Fix issue #1183. Floating point exception evaluating preprocessor expressions resulting in division by zero. 2018-01-14: wsfulton Fix issue #1172. Seg fault parsing invalid exponents in the preprocessor. 2018-01-12: Liryna [C#] Patch #1128. Add ToArray function to std::vector wrappers. 2018-01-12: wsfulton [Java] Fix issue #1156. Add missing throws clause for interfaces when using the %interface family of macros. 2018-01-05: wsfulton Fix default arguments using expressions containing -> syntax error. Problem reported on swig-user mailing list. 2017-12-30: wsfulton [Python] Replace pep8 with pycodestyle for checking the Python code style when running Python tests. 2017-12-30: davedissian Fixed a symbol lookup issue when encountering a typedef of a symbol from the tag namespace to the global namespace when the names are identical, such as 'typedef struct Foo Foo;'. 2017-12-13: wsfulton [Perl] add missing support for directorfree typemaps. 2017-12-13: wsfulton Issue #1167 Fix directorout typemaps which were causing undefined behaviour when returning pointers by reference. 2017-12-08: olly [PHP] Use ZEND_MODULE_GLOBALS_ACCESSOR to access globals so the generated code builds when PHP was built with ZTS enabled. 2017-12-04: wsfulton [Python] Add missing checks for failures in calls to PyUnicode_AsUTF8String. Previously a seg fault could occur when passing invalid UTF8 strings (low surrogates), eg passing u"\udcff" to the C layer (Python 3). 2017-11-24: joequant [R] Fix #1124 and return R_NilValue for null pointers 2017-11-29: wsfulton [Java] director exception handling improvements. When a director method throws an exception and it is caught by DirectorException and passed back to Java using Swig::DirectorException::throwException, the Java stack trace now contains the original source line that threw the exception. Deprecate Swig::DirectorException::raiseJavaException, please replace usage with Swig::DirectorException::throwException. *** POTENTIAL INCOMPATIBILITY *** 2017-10-26: wsfulton Add support for C++11 ref-qualifiers when using directors. 2017-10-26: wsfulton Fix generated code when using directors and methods returning const ref pointers. 2017-10-26: wsfulton [C#, D, Java, Octave, R, Scilab] Port director typemaps to these additional languages. Issue #700. 2017-10-26: radarsat1 [Ruby Python] Patch #1029 - Correct handling of null using directors and shared_ptr. 2017-10-10: joequant [R] pass enum expressions to R. This will generate incorrect files when there is an arithmetic expression in the enum, but this is better than silently generating incorrect code 2017-10-09: olly [PHP] Fix incorrect wrapper code generated when there's a combination of overloading, parameters with a default value and %newobject. Fixes https://sourceforge.net/p/swig/bugs/1350/ 2017-10-09: olly Remove GCJ support. It isn't in a good state and doesn't seem to be used, and GCC7 dropped GCJ. Closes https://sourceforge.net/p/swig/bugs/823/ 2017-10-07: olly Fix preprocessor handling of empty macro arguments to match that of C/C++ compilers. Fixes issue #1111 and https://sourceforge.net/p/swig/bugs/826/ 2017-10-06: wsfulton [Python] Issue #1108. Fix platform inconsistency in Python default argument handling. 32 bit and 64 bit compiled versions of SWIG generated different Python files when default arguments were outside the range of 32 bit signed integers. The default arguments specified in Python are now only those that are in the range of a 32 bit signed integer, otherwise the default is obtained from C/C++ code. 2017-10-02: wsfulton [C#] Fix std::complex types passed by value. 2017-10-02: wsfulton [Javascript, Python, Ruby] Issue #732 - Missing type information for std::complex in std_complex.i meant that previously std::complex always had to be fully qualified in order to be wrapped with the appropriate typemaps. 2017-10-01: joequant allow R package names with docs allowing multiple get accessors in R fix smart-pointer and NAMESPACE support constructors now returning smart pointers (if class declared as such) smart-pointer classes deriving from parent smart-pointers 2017-09-29: wsfulton Issue #1100 - Allow an instantiated template to have the same name in the target language as the C++ template name, for example, this is now possible: template struct X { ... }; %template(X) X; 2017-09-23: wsfulton Issue #1098. Fix overloading of shared_ptr with underlying pointer types, eg: void m(std::shared_ptr p); void m(T &p); void m(T *p); Only the first method is wrapped and the others are ignored/shadowed. The implementation is done via a new attribute in the 'typecheck' typemap called 'equivalent'. If specified, it must contain the equivalent pointer type for overloading and can only be used for the special SWIG_TYPECHECK_POINTER precedence level. The shared_ptr 'typecheck' typemaps have been modified accordingly. Here is a simplified version: %typemap(typecheck, precedence=SWIG_TYPECHECK_POINTER, equivalent="T *") T, T CONST &, T CONST *, T *CONST&, std::shared_ptr< T >, std::shared_ptr< T > &, std::shared_ptr< T > *, std::shared_ptr< T > *& { ... } Overloading with any of these types will result in SWIG ignoring all but the first overloaded method by default. Without the 'equivalent' attribute, wrapping the overloaded methods resulted in types being shadowed (scripting languages) or code that did not compile (statically typed languages). 2017-09-19: futatuki [Python] #1003 Add --with-2to3=/path/to/2to3 option to configure. 2017-09-18: wsfulton Fix type promotion wrapping constant expressions of the form: # define EXPR_MIXED1 (0x80 + 11.1) - 1 This was previously an integral type instead of a floating point type. 2017-09-17: wsfulton Fix generated code for constant expressions containing wchar_t L literals such as: # define __WCHAR_MAX (0x7fffffff + L'\0') # define __WCHAR_MIN (-__WCHAR_MAX - 1) 2017-09-10: mlamarre [Python] Patch #1083. Define_DEBUG to 1 to do exactly like Visual Studio /LDd, /MDd or /MTd compiler options. 2017-08-25: wsfulton Issue #1059. Add support for C++11 ref-qualifiers on non-static member functions. Members with lvalue ref-qualifiers such as: struct RQ { void m1(int x) &; void m2(int x) const &; }; are wrapped like any other member function. Member functions with rvalue ref-qualifiers are ignored by default, such as: struct RQ { void m3(int x) &&; void m4(int x) const &&; }; example.i:7: Warning 405: Method with rvalue ref-qualifier m3(int) && ignored. example.i:8: Warning 405: Method with rvalue ref-qualifier m4(int) const && ignored. These can be unignored and exposed to the target language, see further documentation in CPlusPlus11.html. 2017-08-16: wsfulton Fix #1063. Add using declarations to templates into typedef table. Using declarations to templates were missing in SWIG's internal typedef tables. This led to a few problems, such as, templates that did not instantiate and generated C++ code that did not compile as SWIG did not know what scope the template was in. This happened mostly when a using declaration was used on a template type in a completely unrelated namespace. 2017-08-16: wsfulton Fix type lookup in the presence of using directives and using declarations. Fix some cases of type lookup failure via a combination of both using directives and using declarations resulting in C++ code that did not compile as the generated type was not fully qualified for use in the global namespace. Example below: namespace Space5 { namespace SubSpace5 { namespace SubSubSpace5 { struct F {}; } } using namespace SubSpace5; using SubSubSpace5::F; void func(SubSubSpace5::F f); } 2017-08-16: wsfulton Issue #1051. %template scope enforcement and class definition fixes. The scoping rules around %template have been specified and enforced. The %template directive for a class template is the equivalent to an explicit instantiation of a C++ class template. The scope for a valid %template instantiation is now the same as the scope required for a valid explicit instantiation of a C++ template. A definition of the template for the explicit instantiation must be in scope where the instantiation is declared and must not be enclosed within a different namespace. For example, a few %template and C++ explicit instantiations of std::vector are shown below: // valid namespace std { %template(vin) vector; template class vector; } // valid using namespace std; %template(vin) vector; template class vector; // valid using std::vector; %template(vin) vector; template class vector; // ill-formed namespace unrelated { using std::vector; %template(vin) vector; template class vector; } // ill-formed namespace unrelated { using namespace std; %template(vin) vector; template class vector; } // ill-formed namespace unrelated { namespace std { %template(vin) vector; template class vector; } } // ill-formed namespace unrelated { %template(vin) std::vector; template class std::vector; } When the scope is incorrect, an error now occurs such as: cpp_template_scope.i:34: Error: 'vector' resolves to 'std::vector' and was incorrectly instantiated in scope 'unrelated' instead of within scope 'std'. Previously SWIG accepted the ill-formed examples above but this led to numerous subtle template scope problems especially in the presence of using declarations and using directives as well as with %feature and %typemap. Actually, a valid instantiation is one which conforms to the C++03 standard as C++11 made a change to disallow using declarations and using directives to find a template. // valid C++03, ill-formed C++11 using std::vector; template class vector; Similar fixes for defining classes using forward class references have also been put in place. For example: namespace Space1 { struct A; } namespace Space2 { struct Space1::A { void x(); } } will now error out with: cpp_class_definition.i:5: Error: 'Space1::A' resolves to 'Space1::A' and was incorrectly instantiated in scope 'Space2' instead of within scope 'Space1'. Previously some symbols would have been instantiated in the wrong scope and led to lots of scope problems involving SWIG typemaps, features, renames etc. You will need to correct the scope used in other SWIG directives which do not support 'using declarations' and 'using directives'. For example, if you previously had: %rename(Zap) vector::clear; using namespace std; %template(VectorInt) vector; Prior versions of SWIG incorrectly instantiated vector in the global namespace and so the %rename matched. Now the template is instantiated in the correct namespace, so is fully qualified as std::vector. The other SWIG directives need correcting as they do not follow 'using declarations' and 'using directives'. Change it to: %rename(Zap) std::vector::clear; using namespace std; %template(vin) vector; *** POTENTIAL INCOMPATIBILITY *** 2017-08-16: wsfulton Fix scope lookup for template parameters containing unary scope operators. Fixes cases like: namespace Alloc { template struct Rebind { typedef int Integer; }; } %template(RebindBucket) Alloc::Rebind< Bucket >; OR %template(RebindBucket) Alloc::Rebind< ::Bucket >; Alloc::Rebind< Bucket >::Integer Bucket1(); Alloc::Rebind< ::Bucket >::Integer Bucket2(); Alloc::Rebind<::template TemplateBucket>::Integer Bucket3(); 2017-08-16: wsfulton For templates only, the template parameters are fully resolved when handling typemaps. Without this, it is too hard to have decent rules to apply typemaps when parameter types are typedef'd and template parameters have default values. Fixes %clear for typedefs in templates, eg: %typemap("in") XXX::Long "..." template typename struct XXX { typedef long Long; }; %clear XXX::Long; as the typemap was previously incorrectly stored as a typemap for long instead of XXX::Long. 2017-08-05: olly [C++11] Allow static_assert at the top level (and disallow it right after template). Fixes issue 1031 reported by Artem V L. 2017-08-02: wsfulton Fix incorrectly shown warning when an empty template instantiation was used on a class used as a base class and that base class was explicitly ignored with %ignore. Example of the warning which will no longer appear: Warning 401: Base class 'Functor< int,int >' has no name as it is an empty template instantiated with '%template()'. Ignored. 2017-07-17: fflexo [Java] #674 Add std_list.i to add support for std::list containers. The Java proxy extends java.util.AbstractSequentialList and makes the C++ std::list container look and feel much like a java.util.LinkedList from Java. 2017-07-07: wsfulton [Python] Fix display of documented template types when using the autodoc feature. For example when wrapping: %feature("autodoc"); template struct T {}; %template(TInteger) T; the generated documentation contains: """Proxy of C++ T< int > class.""" instead of: """Proxy of C++ T<(int)> class.""" and """__init__(TInteger self) -> TInteger""" instead of """__init__(T<(int)> self) -> TInteger""" 2017-06-27: nihaln [PHP] Update the OUTPUT Typemap to add return statement to the PHP Wrapper. 2017-06-27: nihaln [PHP] Update the enum and value examples to use the OO wrappers rather than the flat functions produced with -noproxy. There's not been a good reason to use -noproxy for since PHP5 OO wrapping was fixed back in 2005. 2017-06-23: m7thon [Python] fix and improve default argument handling: 1. Fix negative octals. Currently not handled correctly by `-py3` (unusual case, but incorrect). 2. Fix arguments of type "octal + something" (e.g. `0640 | 04`). Currently drops everything after the first octal. Nasty! 3. Fix bool arguments "0 + something" (e.g. `0 | 1`) are always "False" (unusual case, but incorrect). 4. Remove special handling of "TRUE" and "FALSE" from `convertValue` since there's no reason these have to match "true" and "false". 5. Remove the Python 2 vs. Python 3 distinction based on the `-py3` flag. Now the same python code is produced for default arguments for Python 2 and Python 3. For this, octal default arguments, e.g. 0644, are now wrapped as `int('644', 8)`. This is required, as Python 2 and Python 3 have incompatible syntax for octal literals. Fixes #707 2017-06-21: futatuki #1004 - Fix ccache-swig executable name to respect configure's --program-prefix and --program-suffix values if used. 2017-06-21: tamuratak [Ruby] #911 - Add std::wstring support. 2017-06-19: wsfulton [Python] Fix handling of rich comparisons when wrapping overloaded operators: operator< operator<= operator> operator>= operator== operator!= Previously a TypeError was always thrown if the type was not correct. NotImplemented is now returned from these wrapped functions if the type being compared with is not correct. The subsequent behaviour varies between different versions of Python and the comparison function being used, but is now consistent with normal Python behaviour. For example, for the first 4 operator overloads above, a TypeError 'unorderable types' is thrown in Python 3, but Python 2 will return True or False. NotImplemented should be returned when the comparison cannot be done, see PEP 207 and https://docs.python.org/3/library/constants.html#NotImplemented Note that the bug was only present when overloaded operators did not also have a function overload. Fixes SF bug #1208 (3441262) and SF patch #303. *** POTENTIAL INCOMPATIBILITY *** 2017-06-17: fabrice102 [Go] Fix Go callback example. Fixes github #600, #955, #1000. 2017-06-16: wsfulton Make sure warning and error messages are not split up by other processes writing to stdout at the same time. 2017-06-16: wsfulton [R] Fix wrapping function pointers containing rvalue and lvalue reference parameters. 2017-06-13: olly [Perl] Fix testsuite to work without . in @INC - it was removed in Perl 5.26 for security reasons, and has also been removed from older versions in some distros. Fixes #997 reported by lfam. 2017-06-03: wsfulton Fix %import on a file containing a file scope %fragment forced inclusion to not generate the fragment contents as %import should not result in code being generated. The behaviour is now the same as importing code insertion blocks. Wrapping FileC.i in the following example will result in no generated code, whereas previously "#include " was generated: // FileA.i %fragment("", "header") %{ #include %} %{ #include %} %fragment(""); // FileC.i %import "FileA.i" *** POTENTIAL INCOMPATIBILITY *** 2017-05-26: Volker Diels-Grabsch, vadz [Java] #842 Extend from java.util.AbstractList<> and implement java.util.RandomAccess for std::vector wrappers. This notably allows to iterate over wrapped vectors in a natural way. Note that boxed types are now used in the Java layer when wrapping vector of C primitive types, for example. This may introduce some subtle incompatibilities due to some differences in how Java converts boxed types and unboxed types. For example, int i=0; double d1 = i; // ok Double d2 = i; // error: incompatible types: int cannot be converted to Double This can be a problem when calling the add and set functions. A suggested backwards compatible workaround is to use something like (shown for std::vector: #if defined(SWIGJAVA) // Add in old api that uses non-boxed types %extend std::vector { %proxycode %{ public void add(double x) { add(Double.valueOf(x)); } public void set(int i, double val) { set(i, Double.valueOf(val)); } %} } #endif %include "std_vector.i" %template(VectorDouble) std::vector; *** POTENTIAL INCOMPATIBILITY *** 2017-05-30: davidcl [Scilab] #994 Undefined symbol error when loading in Scilab 6 2017-05-25: asibross [Java] #370 #417 Missing smart pointer handling in Java director extra methods swigReleaseOwnership() and swigTakeOwnership(). 2017-05-23: wsfulton [Java] #230 #759 Fix Java shared_ptr and directors for derived classes java compilation error. For shared_ptr proxy proxy classes, add a protected method swigSetCMemOwn for modifying the swigCMemOwn and swigCMemOwnDerived member variables which are used by various other methods for controlling memory ownership. 2017-05-21: Sghirate [Java, C#, D] #449 Remove unnecessary use of dynamic_cast in directors to enable non-RTTI compilation. 2017-05-21: wsfulton [Python] #993 Fix handling of default -ve unsigned values, such as: void f(unsigned = -1U); 2017-05-20: jschueller [Python] #991 Fix E731 PEP8 warning: do not assign a lambda expression 2017-05-16: nihal95 [PHP] Add %pragma version directive to allow the version of the extension to be set. Patch #970, fixes #360. 2017-05-13: yag00 Patch #975 - Add support for noexcept on director methods. 2017-04-27: redbrain Issue #974, Patch #976 - Fix preprocessor handling of macros with commas in a comment. 2017-04-25: jleveque [Lua] #959 - Fix Visual Studio C4244 conversion warnings in Lua wrappers. 2017-04-21: tamuratak [Ruby] #964 - Add shared_ptr director typemaps. 2017-04-20: wsfulton [Ruby] #586, #935 Add assert for invalid NULL type parameter when calling SWIG_Ruby_NewPointerObj. 2017-04-20: tamuratak [Ruby] #930, #937 - Fix containers of std::shared_ptr. Upcasting, const types (eg vector>) and NULL/nullptr support added. 2017-04-12: smarchetto [Scilab] New parameter targetversion to specify the Scilab target version (5, 6, ..) for code generation With Scilab 6 target specified, identifier names truncation is disabled (no longer necessary) 2017-03-24: tamuratak [Ruby] Fix #939 - Wrapping std::vector fix due to incorrect null checks on VALUE obj. 2017-03-17: vadz [C#] #947 Add support for std::complex 2017-03-17: wsfulton [Go] Fix handling of typedef'd function pointers and typedef'd member function pointers such as: typedef int (*FnPtr_td)(int, int); int do_op(int x, int y, FnPtr_td op); 2017-03-16: wsfulton Add support for member const function pointers such as: int fn(short (Funcs::* parm)(bool)) const; Also fix parsing of references/pointers and qualifiers to member pointers such as: int fn(short (Funcs::* const parm)(bool)); int fn(short (Funcs::* & parm)(bool)); 2017-03-10: wsfulton Extend C++11 alternate function syntax parsing to support const and noexcept, such as: auto sum1(int x, int y) const -> int { return x + y; } auto sum2(int x, int y) noexcept -> int { return x + y; } 2017-02-29: tamuratak [Ruby] #917 - Add Enumerable module to all container class wrappers. It was missing for std::list, std::multiset, std::unordered_multiset and std::unordered_map. 2017-02-27: assambar [C++11] Extend parser to support throw specifier in combination with override and/or final. 2017-02-10: tamuratak [Ruby] #883 - Add support for C++11 hash tables: std::unordered_map std::unordered_set std::unordered_multimap std::unordered_multiset 2017-02-08: jcsharp [C#] #887 Improve std::vector wrapper constructors - Replace constructor taking ICollection with IEnumerable and also add IEnumerable constructor to avoid the boxing and unboxing overhead of the original constructor, when the type parameter is a value type. Version 3.0.12 (27 Jan 2017) ============================ 2017-01-27: wsfulton [C#] #882 Fix missing filename in error messages when there is a problem writing out C# files. 2017-01-27: briancaine [Guile] #744 Fix compilation errors in Guile wrappers - regression introduced in swig-3.0.11. 2017-01-24: andrey-starodubtsev [Java] Apply #704 - director typemap improvements. Memory leak fixes, add support for "directorargout" typemap and add director support to typemaps.i. 2017-01-24: wsfulton Enhance %extend to extend a class with template constructors, eg: struct Foo { %extend { template Foo(int a, T b) { ... } } }; %template(Foo) Foo::Foo; 2017-01-22: wsfulton Issue #876 Enhance %extend to extend a class with template methods, eg: struct Foo { %extend { template void do_stuff(int a, T b) { ... } } }; %template(do_stuff_inst) Foo::do_stuff; Similarly for static template methods. 2017-01-22: kwwette [Octave] add support for version 4.2 - The Octave API now uses some C++11 features. It is recommended to use the mkoctfile program supplied by Octave to compile the SWIG-generated wrapper code, as mkoctfile will ensure the correct C++ compiler/options are used. Otherwise, the value of `mkoctfile -p CXX` should be parsed for any -std=* flags which might be present. - Octave has dropped support for << and >> operators, so SWIG now ignores them. - The Octave error() function now raises C++ exceptions to propagate Octave errors, so %exception directives may need to be modified. For convenience the SWIG_RETHROW_OCTAVE_EXCEPTIONS macro can be used to rethrow any Octave exceptions for Octave itself to handle, e.g.: try { $action // may call error() } SWIG_RETHROW_OCTAVE_EXCEPTIONS // error() exceptions are rethrown catch(...) { ... // all other exceptions } *** POTENTIAL INCOMPATIBILITY *** 2017-01-16: wkalinin [C#] Fix #733 regression introduced in swig-3.0.9. Missing virtual function override in C# layer when using %import. 2017-01-16: fschlimb Fix #813 template symbol name lookup bug when typedef names are the same but in different namespaces. 2017-01-15: wsfulton [C# D Java] The SWIG library no longer uses the javatype, dtype or cstype typemaps, thereby completely freeing them up for users to use without having to replicate the library code that they previously added. The code previously generated by these typemaps has been replaced by the new %proxycode directive. Their use in the library code was fairly minimal: C# cstype: std_array.i std_map.i std_vector.i D dtype: std_vector.i Java javatype: arrays_java.i 2017-01-14: wsfulton The %extend directive can now optionally support one of the 'class', 'struct' or 'union' keywords before the identifier name, for example: struct X { ... }; %extend struct X { ... } Previously this had to specified as: struct X { ... }; %extend X { ... } 2017-01-13: wsfulton [C# D Java] Add new %proxycode directive which is a macro for %insert("proxycode"). This is a way of adding pure C#/D/Java code into the appropriate proxy class, eg: %extend Proxy2 { %proxycode %{ public int proxycode2(int i) { return i+2; } %} } %inline %{ struct Proxy2 {}; %} There will then be a pure Java/C#/D method called proxycode2 in the Proxy2 class. 2016-12-31: ajrheading1 Issue #860 - Remove use of std::unary_function and std::binary_function which is deprecated in C++11. 2016-12-30: olly [PHP7] Register internal 'swig_runtime_data_type_pointer' constant as "CONST_PERSISTENT" to avoid segmentation fault on module unload. Fixes #859 reported by Timotheus Pokorra. Thanks also to Javier Torres for a minimal reproducer. Version 3.0.11 (29 Dec 2016) ============================ 2016-12-24: wsfulton [C#] Add %feature("csdirectordelegatemodifiers") to enable customization of the delegate access modifiers generated in director classes. Fixes issue #748. 2016-12-23: wsfulton [Python] Fix builtin "python:slot" feature failing for tp_hash when using hashfunc closure with a "Wrong type for hash function" for Python 2. Issue #843. 2016-12-21: joequamt Changed generation of functions so that only functions that end in _set generate accessor functions rather than looking for "set". Change generation of operators to not have underscores to start in R. Users need to provide custom names for these operator overloads. 2016-12-21: olly Fix isfinite() checks to work with all C++11 compilers. Fixes issues #615, #788 and #849. 2016-12-20: wsfulton %namewarn unnecessarily caused keyword warnings for non-instantiated template classes and duplicate warnings for instantiated template classes when keywords were used. Issue #845. 2016-12-18: ezralanglois [Python, Ruby, Octave] Memory leak fix on error in std::pair wrappers. Issue #851. 2016-12-18: wsfulton Zero initialize arrays when using %array_class and %array_functions. 2016-12-18: t-ikegami [Python] Fix #446 Python %array_class of carrays.i failed with -builtin option. 2016-12-16: briancaine [Guile] Patch #744 Added support for Guile's native pointer functionality 2016-12-01: wsfulton [Python] Issue #769. Add optional moduleimport attribute to %module so that the default module import code can be overridden. See the "Searching for the wrapper module" documentation in Python.html. Example: %module(moduleimport="import _foo") foo $module also expands to the low-level C/C++ module name, so the following is the same as above %module(moduleimport="import $module") foo 2016-11-30: olly [PHP] Add support for PHP7. PHP5's C extension API has changed substantially so you need to use -php7 to specify you want PHP7 compatible wrappers. The default extension for generated wrappers is now .cxx (to match SWIG's default for every other language - to generate foo_wrap.cpp you can run SWIG with -cppext cpp). Fixes issue #571. As part of this change, the language subdirectory for PHP5 has changed from "php" to "php5" - if you are making use of the search path feature where the language subdirectory of each directory is also searched, you'll need to update your bindings. A simple fix which works for older and newer SWIG is to add a symlink: ln -s php php5 *** POTENTIAL INCOMPATIBILITY *** 2016-11-30: olly [PHP] Only emit one copy of each distinct arginfo. Previously we emitted a separate one for every wrapped function, but typically many functions have the same number of parameters and combinations of parameters passed by reference or not. This change significantly reduces both the size of the generated wrapper, and of the compiled PHP extension module (e.g. by ~6% for the stripped extension module for Xapian's PHP7 bindings). 2016-11-28: wsfulton Fix %rename override of wildcard %rename for templates. For example: %rename(GlobalIntOperator) *::operator bool; // wildcard %rename %rename(XIntOperator) X::operator bool; // fix now overrides first %rename above OR %rename(XIntOperator) X::operator bool; // fix now overrides first %rename above template struct X { operator bool(); ... }; %template(Xint) X; This also fixes %rename override of global %rename for templates. For example: // Global rename to make all functions start with a lower case letter %rename("%(firstlowercase)s", %$isfunction ) ""; %rename(woohoo) W::Woo; // fix now overrides above %rename template struct W { W Woo(); ... }; %template(Wint) W; The above also introduces a possibly unexpected change. Many of the STL containers provided by SWIG use %rename to rename some methods, eg in std::vector, push_back is renamed to add in Java. Previously this intended rename did not happen when using using global %rename rules and the method would remain as push_back, but is now renamed to add. Some more info in issue #856. *** POTENTIAL INCOMPATIBILITY *** 2016-11-26: m7thon [Python] Issue #709 - improved wrapping of division operators 'from __future__ import division' now works in Python 2 whether or not the -py3 flag is used. 2016-11-12: joequant [R] Issue #697 - fix comma issue with overload methods 2016-11-12: joequant [R] Issue #555 - R runtime needs stdio.h 2016-11-02: wsfulton [Python] Issue #816 - fix compilation error when using -extranative and -builtin. 2016-11-02: liorgold Patch #741 - Add support for C++11 alias templates, see updated CPlusPlus11.html documentation. 2016-10-30: myd7349 [C#] Patch #740 Add std_array.i for C# for wrapping std::array. Patch also enhances std::vector C# wrappers with additional functions (Contains, IndexOf, LastIndexOf and Remove). 2016-10-30: tobilau [Java] Fix wrappers for wstring parameters in director methods to cleanup local ref after director callback has finished. 2016-10-23: wsfulton [C#] Add missing csdirectorin VOID_INT_PTR and csdirectorout VOID_INT_PTR typemaps. 2016-10-23: jiulongw Patch #781 - Fix wrapping of C compound expressions containing char constants in quotes such as: #define H_SUPPRESS_SCALING_MAGIC (('s'<<24) | ('u'<<16) | ('p'<<8) | 'p') enum DifferentTypes { typecharcompound='A'+1, typecharcompound2='B' << 2 }; 2016-10-13: wsfulton [Python] Issue #808 - fix Python pickling and metaclass for builtin wrappers. The metaclass (SwigPyObjectType) for SWIG objects was not defined in a way that let importlib successfully import the Python wrappers. The pickle module previously failed to pickle objects because it couldn't determine what module the SWIG wrapped objects were in. 2016-09-29: wsfulton [Allegrocl, CFFI, GO, Javascript, Ocaml, R, Scilab] Add missing support for the "ret" typemap in a few target languages. The documentation also now has info on the "ret" typemap. 2016-09-27: ahmed-usman [xml] Handle template parameters correctly. 2016-09-27: dontpanic92 [Go] Fix argument names in inherited functions taking more than 8 parameters. Fixes #795. 2016-09-26: smarchetto [Scilab] mlists that map pointers can be given a custom type name. 2016-09-25: wsfulton Patch #793 from q-p to expand exception handling to include std::bad_cast in std_except.i. 2016-09-24: olly [PHP] Fix code generated for feature("director:except") - previously the return value of call_user_function() was ignored and we checked an uninitialised value instead. Fixes #627. Based on patch from Sergey Seroshtan. 2016-09-22: wsfulton [Python] More flexible python builtin slots for overloaded C++ function. The closure names used for builtin slots are mangled with their functype so that overloaded C++ method names can be used for multiple slots. For example: %feature("python:slot", "mp_subscript", functype="binaryfunc") SimpleArray::__getitem__; %feature("python:slot", "sq_item", functype="ssizeargfunc") SimpleArray::__getitem__(Py_ssize_t n); will generate closures: SWIGPY_SSIZEARGFUNC_CLOSURE(_wrap_SimpleArray___getitem__) /* defines _wrap_SimpleArray___getitem___ssizeargfunc_closure */ SWIGPY_BINARYFUNC_CLOSURE(_wrap_SimpleArray___getitem__) /* defines _wrap_SimpleArray___getitem___binaryfunc_closure */ Previously only one name was defined: _wrap_SimpleArray___getitem___closure. Hence the overloaded __getitem__ method can be used to support both mp_subscript and sq_item slots. 2016-09-17: wsfulton [Python] Fix iterators for containers of NULL pointers (or Python None) when using -builtin. Previously iteration would stop at the first element that was NULL. 2016-09-16: olly [Javascript] Fix SWIG_exception() macro to return from the current function. Fixes #789, reported by Julien Dutriaux. 2016-09-16: olly [PHP] Fix SWIG_exception() macro to return from the current function. Fixes #240, reported by Sergey Seroshtan. 2016-09-12: xypron [C#] Patch #786 Keyword rename to be CLS compliant by adding an underscore suffix instead of an underscore prefix to the C symbol name. Please use an explicit %rename to rename the symbol with a _ prefix if you want the old symbol name. *** POTENTIAL INCOMPATIBILITY *** 2016-09-09: olly [Python] Fix import handling for Python 2.6 to work in a frozen application. Fixes #145, reported by Thomas Kluyver. 2016-09-02: smarchetto [Scilab] Pointers are mapped to mlist instead of tlist (mlist better for scilab overloading) 2016-09-02: olly [PHP] Fix "out" typemap for member function pointers and "in" typemap for char INPUT[ANY]. 2016-09-01: wsfulton [Python] More efficient Python slicing. Call reserve for container types that support it to avoid repeated memory reallocations for new slices or slices that grow in size. 2016-09-01: wsfulton [Python] #771 - Make builtin types hashable by default. Default hash is the underlying C/C++ pointer. This matches up with testing for equivalence (Py_EQ in SwigPyObject_richcompare) which compares the pointers. 2016-08-22: wsfulton [Python] The following builtin slots can be customized like other slots via the "python:" and "python:slot" features where is the appropriate slot name: tp_allocs tp_bases tp_basicsize tp_cache tp_del tp_dealloc tp_flags tp_frees tp_getset tp_is_gc tp_maxalloc tp_methods tp_mro tp_new tp_next tp_prev tp_richcompare tp_subclasses tp_weaklist was_sq_ass_slice was_sq_slice A few documentation improvements for slot customization. 2016-08-09: joequant [R] Patch #765 Fix extern "C" header includes for C++ code. 2016-08-05: olly [xml] Fix how the output filename is built to avoid problems when it contains the embedded strings ".c", ".cpp" or ".cxx". Fixes #540 reported by djack42. 2016-07-01: wsfulton Fix corner case of wrapping std::vector of T pointers where a pointer to a pointer of T also exists in the wrapped code. SF Bug 2359417 (967). 2016-06-26: wkalinin [Java, C#] Patch #681 Fix seg fault when ignoring nested classes. 2016-06-25: mromberg [Python] #711 Fix -castmode and conversion of signed and unsigned integer types. See 2015-12-23 CHANGES entry for details of these improvements when they were implemented for the default options (ie not using -castmode). 2016-06-25: ahnolds Patch #730 - Fix %implicitconv for overloaded functions when using -castmode or -fastdispatch options. The result is that in all overload cases where there are multiple possibilities with the same number of arguments, the dispatch function will first check for exact (aka non implicit) matches, and then subsequently check for implicit casting matches. This was already happening in the normal dispatch situation, and in the -fastdispatch case two passes through the candidates were happening, just with SWIG_POINTER_IMPLICIT_CONV always set. After this patch, it is not set on the first pass, and then set on the second pass. 2016-06-25: liorgold Patch #727 - Add support for C++11 type aliasing. Version 3.0.10 (12 Jun 2016) ============================ 2016-06-06: mromberg [Python] Patch #698. Add support for -relativeimport for python 2.7, so -py3 is no longer also required for relative import support. 2016-06-05: mromberg [Python] Patch #694 - Fix package import regressions introduced in swig-3.0.9. 1) The code in 3.0.9 did not fall back to 'import _foo' if 'import bar._foo' failed (assuming bar.foo was the main module). Every place _foo is imported now first tries it from the package where foo was found and if that fails tries _foo as a global module. 2) The separate block of Python code that injected code to pull in the attributes from _foo when -builtin is used made use of the -py3 switch to either do 'from ._foo import *' or "from _foo import *". This block of code no longer does this and instead checks the Python version at runtime to switch between the two syntaxes. In summary, swig-3.0.10 has been modified to ease the creation of wrapper modules that can be fully made part of a Python package. SWIG no longer assumes the dynamically linked C module is a global module. The dynamic module can now be placed into either the same package as the pure Python module or as a global module. Both locations are used by the Python wrapper to locate the C module. However, this could cause a backwards incompatibility with some code that was relying on the ability of "from package import _module" to pull attributes out of the package directly. If your code populates a module (which is also a package) with attributes that are SWIG generated modules which were not loaded in a conventional way, swig-3.0.8 and earlier may have worked due to 'from package import _module' bypassing a real import and pulling your module in as an attribute. This will no longer work. Since this is not a common (or even recommended) practice, most folk should not be affected. *** POTENTIAL INCOMPATIBILITY *** 2016-05-31: wsfulton Fix #690 - Smart pointer to %ignored class doesn't expose inherited methods. Regression introduced in swig-3.0.9. Version 3.0.9 (29 May 2016) =========================== 2016-05-24: mromberg [Python] Patch #612 - Add support for Python's implicit namespace packages. 2016-05-23: wsfulton [Ruby] Fix #602 - Error handling regression of opaque pointers introduced in swig-3.0.8 when C functions explicitly reset a pointer using 'DATA_PTR(self) = 0'. An ObjectPreviouslyDeleted error was incorrectly thrown when the pointer was used as a parameter. 2016-05-17: tamuratak [Ruby] Patch #651 - Correct overloaded function error message when function is using %newobject. 2016-05-17: aurelj [Ruby] Patch #582 - add support for docstring option in %module() 2016-05-14: wsfulton Fix #434 - Passing classes by value as parameters in director methods did not create a copy of the argument leading to invalid memory accesses if the object was used after the upcall into the target language. Passing arguments by value shouldn't give rise to these sorts of memory problems and so the objects are now copied and ownership of their lifetime is controlled by the target language. 2016-05-07: wsfulton Fix #611. Fix assertion handling defaultargs when using %extend for a template class and the extended methods contain default arguments. 2016-05-05: ejulian [Python] Patch #617. Fix operator/ wrappers. 2016-05-02: wsfulton Fix #669. Don't issue warning about ignoring base classes when the derived class is itself ignored. 2016-04-18: ianlancetaylor [Go] Fix use of goout typemap when calling base method by forcing the "type" attribute to the value we need. 2016-04-17: ianlancetaylor [Go] Fixes for Go 1.6: avoid returning Go pointers from directors that return string values; add a trailing 0 byte when treating Go string as C char*. 2016-04-06: smarchetto [Scilab] #552 Make Scilab runtime keep track of pointer types Instead of a Scilab pointer which has no type, SWIG Scilab maps a pointer to a structure tlist containing the pointer adress and its type. 2016-04-02: ahnolds [Python] Apply #598. Fix misleading error message when attempting to read a non-existent attribute. The previous cryptic error message: AttributeError: type object 'object' has no attribute '__getattr__' is now replaced with one mentioning the attribute name, eg: AttributeError: 'Foo' object has no attribute 'bar' 2016-04-02: derkuci [Python] Patch #610 to fix #607. Fix single arguments when using python -builtin -O with %feature("compactdefaultargs") 2016-03-31: wsfulton Fixes #594. Fix assertion for some languages when wrapping a C++11 enum class that is private in a class. Also don't wrap private enums for a few languages that attempted to do so. 2016-03-31: wsfulton [Java] unsigned long long marshalling improvements when a negative number is passed from Java to C. A cast to signed long long in the C layer will now result in the expected value. No change for positive numbers passed to C. Fixes #623. 2016-03-22: alexwarg [Lua] #398 Fix lua __getitem + inheritance The new handling of classes in Lua (not merging methods into the derived classes) breaks for classes that provide a __getitem function. The __getitem function prevents method calls to any method defined in a base class. This fix calls __getitem only if the member is not found using recursive lookup. 2016-03-18: ptomulik [Python] #563 Stop generating unnecessary _swigconstant helpers. 2016-03-16: richardbeare [R] #636 Add extra std::vector numeric types 2016-03-14: wsfulton [Java] Add std_array.i for C++11 std::array support. 2016-03-12: wsfulton [Java, C#, D] Fix static const char member variables wrappers with %javaconst(1) %csconst(1) or %dmanifestconst. This fixes the case when an integer is used as the initializer, such as: struct W { static const char w = 100; }; Fix generated code parsing enum values using char escape sequences when these values appear in the Java code (usually when using %javaconst(1)) such as: enum X { x1 = '\n', x2 = '\1' }; Similarly for static const member char variables such as: struct Y { static const char y = '\n'; } Likewise for D and %dmanifestconstant. For C# and %csconst(1), char values in C# are now hex escaped as C# doesn't support C octal escaping. 2016-03-11: wsfulton [Java C#] Add support for treating C++ base classes as Java interfaces instead of Java proxy classes. This enable some sort of support for multiple inheritance. The implementation is in swiginterface.i and provides additional macros (see Java.html for full documentation): %interface(CTYPE) %interface_impl(CTYPE) %interface_custom("PROXY", "INTERFACE", CTYPE) 2016-03-01: wsfulton Add rstrip encoder for use in %rename. This is like the strip encoder but strips the symbol's suffix instead of the prefix. The example below will rename SomeThingCls to SomeThing and AnotherThingCls to AnotherThing: %rename("%(rstrip:[Cls])s") ""; class SomeThingCls {}; struct AnotherThingCls {}; 2016-03-01: olly Fix isfinite() check to work with GCC6. Fixes issue #615 reported by jplesnik. 2016-02-17: olly [Python] Add missing keywords 'as' and 'with' to pythonkw.swg. 2016-02-07: kwwette [Octave] recognise various unary functions * Use __float__() for numeric conversions, e.g. when calling double() * Map various unary functions, e.g. abs() to __abs__(), see full list in section 32.3.10 of manual; only available in Octave 3.8.0 or later 2016-02-07: kwwette [Octave] export function swig_octave_prereq() for testing Octave version 2016-02-06: pjohangustavsson [C#] Fix duplicate symbol problems when linking the source generated from multiple SWIG modules into one shared library for the -namespace option. The namespace is now mangled into the global PInvoke function names. *** POTENTIAL INCOMPATIBILITY *** 2016-01-27: ahnolds [Python] Added support for differentiating between Python Bytes and Unicode objects using by defining SWIG_PYTHON_STRICT_BYTE_CHAR and SWIG_PYTHON_STRICT_UNICODE_WCHAR. 2016-01-27: steeve [Go] Ensure structs are properly packed between gc and GCC/clang. 2016-01-25: ahnolds [Python] Support the full Python test suite in -classic mode * Convert long/unsigned long/long long/unsigned long long to PyInt rather than PyLong when possible. Certain python functions like len() require a PyInt when operating on old-style classes. * Add support for static methods in classic mode, including support for pythonappend, pythonprepend, and docstrings. * Removing the use of __swig_getmethods__ for static member methods since they will always be found by the standard argument lookup * Fix a bug where the wrong type of exception was caught when checking for new-style class support 2016-01-23: ahnolds [Go] Enable support for the Go test-suite on OSX: * The linker on OSX requires that all symbols (even weak symbols) are defined at link time. Because the function _cgo_topofstack is only defined starting in Go version 1.4, we explicitly mark it as undefined for older versions of Go on OSX. * Avoid writing empty swigargs structs, since empty structs are not allowed in extern "C" blocks. 2016-01-12: olly [Javascript] Look for "nodejs" as well as "node", as it's packaged as the former on Debian. 2016-01-12: olly [Javascript] For v8 >= 4.3.0, use V8_MAJOR_VERSION. Fixes issue 561. 2016-01-10: ahnolds Improved size_t and ptrdiff_t typemaps to support large values on platforms where sizeof(size_t) > sizeof(unsigned long) and sizeof(ptrdiff_t) > sizeof(long). Version 3.0.8 (31 Dec 2015) =========================== 2015-12-30: wsfulton The pdf documentation is now generated by wkhtmltopdf and has colour for the code snippets just like the html documentation! 2015-12-23: ahnolds [Python] Fixes for conversion of signed and unsigned integer types: No longer check for PyInt objects in Python3. Because PyInt_Check and friends are #defined to the corresponding PyLong methods, this had caused errors in Python3 where values greater than what could be stored in a long were incorrectly interpreted as the value -1 with the Python error indicator set to OverflowError. This applies to both the conversions PyLong->long and PyLong->double. Conversion from PyLong to long, unsigned long, long long, and unsigned long long now raise OverflowError instead of TypeError in both Python2 and Python3 for PyLong values outside the range expressible by the corresponding C type. This matches the existing behavior for other integral types (signed and unsigned ints, shorts, and chars), as well as the conversion for PyInt to all numeric types. This also indirectly applies to the size_t and ptrdiff_t types, which depend on the conversions for unsigned long and long. 2015-12-19: wsfulton [Python] Python 2 Unicode UTF-8 strings can be used as inputs to char * or std::string types if the generated C/C++ code has SWIG_PYTHON_2_UNICODE defined. 2015-12-17: wsfulton Issues #286, #128 Remove ccache-swig.1 man page - please use the CCache.html docs instead. The yodl2man and yodl2html tools are no longer used and so SWIG no longer has a dependency on these packages which were required when building from git. 2015-12-16: zturner/coleb [Python] Fix Python3.5 interpreter assertions when objects are being deleted due to an existing exception. Most notably in generators which terminate using a StopIteration exception. Fixes #559 #560 #573. If a further exception is raised during an object destruction, PyErr_WriteUnraisable is used on this second exception and the original exception bubbles through. 2015-12-14: ahnolds/wsfulton [Python] Add in missing initializers for tp_finalize, nb_matrix_multiply, nb_inplace_matrix_multiply, ht_qualname ht_cached_keys and tp_prev. 2015-12-12: wsfulton Fix STL wrappers to not generate <: digraphs. For example std::vector<::X::Y> was sometimes generated, now corrected to std::vector< ::X::Y >. 2015-11-25: wsfulton [Ruby] STL ranges and slices fixes. Ruby STL container setting slices fixes: Setting an STL container wrapper slice better matches the way Ruby arrays work. The behaviour is now the same as Ruby arrays. The only exception is the default value used when expanding a container cannot be nil as this is not a valid type/value for C++ container elements. Obtaining a Ruby STL container ranges and slices fixes: Access via ranges and slices now behave identically to Ruby arrays. The fixes are mostly for out of range indices and lengths. - Zero length slice requests return an empty container instead of nil. - Slices which request a length greater than the size of the container no longer chop off the last element. - Ranges which used to return nil now return an empty array when the the start element is a valid index. Ruby STL container negative indexing support improved. Using negative indexes to set values works the same as Ruby arrays, eg %template(IntVector) std::vector; iv = IntVector.new([1,2,3,4]) iv[-4] = 9 # => [1,2,3,9] iv[-5] = 9 # => IndexError 2015-11-21: wsfulton [Ruby, Python] Add std::array container wrappers. These work much like any of the other STL containers except Python/Ruby slicing is somewhat limited because the array is a fixed size. Only slices of the full size are supported. 2015-10-10: wsfulton [Python] #539 - Support Python 3.5 and -builtin. PyAsyncMethods is a new member in PyHeapTypeObject. 2015-10-06: ianlancetaylor [Go] Don't emit a constructor function for a director class with an abstract method, since the function will always panic. 2015-10-01: wsfulton Fix %shared_ptr support for private and protected inheritance. - Remove unnecessary Warning 520: Derived class 'Derived' of 'Base' is not similarly marked as a smart pointer - Do not generate code that attempts to cast up the inheritance chain in the type system runtime in such cases as it doesn't compile and can't be used. Remove unnecessary warning 520 for %shared_ptr when the base class is ignored. 2015-10-01: vkalinin Fix #508: Fix segfault parsing anonymous typedef nested classes. 2015-09-26: wsfulton [Ruby] Add shared_ptr support 2015-09-13: kkaempf [Ruby] Resolve tracking bug - issue #225. The bug is that the tracking code uses a ruby hash and thus may allocate objects (Bignum) while running the GC. This was tolerated in 1.8 but is invalid (raises an exception) in 1.9. The patch uses a C hash (also used by ruby) instead. 2015-09-09: lyze [CFFI] Extend the "export" feature in the CFFI module to support exporting to a specified package. 2015-09-04: olly [Python] Fix docstrings for %callback functions. 2015-09-03: demi-rluddy [Go] Removed golang stringing for signed/unsigned char Changed default handling of signed char* and unsigned char* to be opaque pointers rather than strings, similarly to how other languages work. Any existing code relying on treating signed char* or unsigned char* as a string can restore the old behavior with typemaps.i by using %apply to copy the [unchanged] char* behavior. *** POTENTIAL INCOMPATIBILITY *** 2015-08-07: talby [Perl] tidy -Wtautological-constant-out-of-range-compare warnings when building generated code under clang 2015-08-07: xantares [Python] pep257 & numpydoc conforming docstrings: - Mono-line module docsstring - Rewrite autodoc parameters section in numpydoc style: https://github.com/numpy/numpy/blob/master/doc/HOWTO_DOCUMENT.rst.txt - One line summary should end with "." - Adds a blank line after class docstring 2015-08-05: vadz [Java] Make (char* STRING, size_t LENGTH) typemaps usable for strings of other types, e.g. "unsigned char*". Version 3.0.7 (3 Aug 2015) ========================== 2015-08-02: wsfulton [Java] Fix potential security exploit in generated Java classes. The swigCPtr and swigCMemOwn member variables in the generated Java classes are now declared 'transient' by default. Further details of the exploit in Android is being published in an academic paper as part of USENIX WOOT '15: https://www.usenix.org/conference/woot15/workshop-program/presentation/peles. In the unlikely event that you are relying on these members being serializable, then you will need to override the default javabody and javabody_derived typemaps to generate the old generated code. The relevant typemaps are in the Lib directory in the java.swg, boost_shared_ptr.i and boost_intrusive_ptr.i files. Copy the relevant default typemaps into your interface file and remove the 'transient' keyword. *** POTENTIAL INCOMPATIBILITY *** 2015-08-01: vadz Make configure --without-alllang option more useful: it can now be overridden by the following --with-xxx options, allowing to easily enable just one or two languages. 2015-07-30: wsfulton Fix #440 - Initialise all newly created arrays when using %array_functions and %array_class in the carrays.i library - bug is only relevant when using C++. 2015-07-29: wsfulton [Python] Improve indentation warning and error messages for code in the following directives: %pythonprepend %pythonappend %pythoncode %pythonbegin %feature("shadow") Old error example: Error: Line indented less than expected (line 3 of pythoncode) New error example: Error: Line indented less than expected (line 3 of %pythoncode or %insert("python") block) as no line should be indented less than the indentation in line 1 Old warning example: Warning 740: Whitespace prefix doesn't match (line 2 of %pythoncode or %insert("python") block) New warning example: Warning 740: Whitespace indentation is inconsistent compared to earlier lines (line 3 of %pythoncode or %insert("python") block) 2015-07-28: wsfulton [Python] Fix #475. Improve docstring indentation handling. SWIG-3.0.5 and earlier sometimes truncated text provided in the docstring feature. This occurred when the indentation (whitespace) in the docstring was less in the second or later lines when compared to the first line. SWIG-3.0.6 gave a 'Line indented less than expected' error instead of truncating the docstring text. Now the indentation for the 'docstring' feature is smarter and is appropriately adjusted so that no truncation occurs. 2015-07-22: wsfulton Support for special variable expansion in typemap attributes. Example usage expansion in the 'out' attribute (C# specific): %typemap(ctype, out="$*1_ltype") unsigned int& "$*1_ltype" is equivalent to the following as $*1_ltype expands to 'unsigned int': %typemap(ctype, out="unsigned int") unsigned int& "unsigned int" Special variables can be used within special variable macros too. Example usage expansion: %typemap(cstype) unsigned int "uint" %typemap(cstype, out="$typemap(cstype, $*1_ltype)") unsigned int& "$typemap(cstype, $*1_ltype)" Special variables are expanded first and hence the above is equivalent to: %typemap(cstype, out="$typemap(cstype, unsigned int)") unsigned int& "$typemap(cstype, unsigned int)" which then expands to: %typemap(cstype, out="uint") unsigned int& "uint" 2015-07-22: lindleyf Apply patch #439 - support for $typemap() (aka embedded typemaps or special variable macros) in typemap attributes. A simple example where $typemap() is expanded in the 'out' attribute (C# specific): %typemap(cstype) unsigned int "uint" %typemap(cstype, out="$typemap(cstype, unsigned int)") unsigned int& "$typemap(cstype, unsigned int)" is equivalent to: %typemap(cstype, out="uint") unsigned int& "uint" 2015-07-18: m7thon [Python] Docstrings provided via %feature("docstring") are now quoted and added to the tp_doc slot when using python builtin classes (-builtin). When no docstring is provided, the tp_doc slot is set to the fully qualified C/C++ class name. Github issues #445 and #461. 2015-07-17: kwwette [octave] Support Octave version 4.0.0 (thanks to patches from Orion Poplawski). 2015-07-07: wsfulton SWIG no longer generates a wrapper for a class' constructor if that class has any base class with a private destructor. This is because your compiler should not allow a class to be instantiated if a base has a private destructor. Some compilers do, so if you need the old behaviour, use the "notabstract" feature, eg: %feature("notabstract") Derived; class Base { ~Base() {} }; struct Derived : Base {}; Version 3.0.6 (5 Jul 2015) ========================== 2015-07-02: wsfulton Fix syntax error when the template keyword is used in types, eg: std::template vector v; 2015-07-02: ngladitz [Lua] Push characters as unformatted 1-character strings to avoid unprintable characters such as (char)127 being converted to "<\127>" with Lua 5.3 and later. (github PR #452) 2015-06-29: olly [Python] Improve handling of whitespace in %pythoncode. Previously SWIG looked at the indentation of the first line and removed that many characters from each subsequent line, regardless of what those characters were. This was made worse because SWIG's preprocessor removes any whitespace before a '#'. Fixes github issue #379, reported by Joe Orton. 2015-06-12: wsfulton [R] Fix #430 - call to SWIG_createNewRef in copyToC was incorrectly named. 2015-06-11: sghirate [C#] Patch #427 adds in new command line option -outfile to combine all the generated C# code into a single file. 2015-06-09: wsfulton Fix seg fault processing C++11 type aliasing. Issue #424. 2015-05-28: wsfulton [Python] Add new feature "python:cdefaultargs" to control default argument code generation. By default, SWIG attempts to convert C/C++ default argument values into Python values and generates code into the Python layer with these values. Recent versions of SWIG are able to convert more of these values, however, the new behaviour can be circumvented if desired via this new feature, such that the default argument values are obtained from the C layer and not the Python layer. For example: struct CDA { int fff(int a = 1, bool b = false); }; The default code generation in the Python layer is: class CDA(_object): ... def fff(self, a=1, b=False): return _default_args.CDA_fff(self, a, b) Adding the feature: %feature("python:cdefaultargs") CDA::fff; Results in: class CDA(_object): ... def fff(self, *args): return _default_args.CDA_fff(self, *args) Some code generation modes, eg -builtin and -fastproxy, are unaffected by this as the default values are always obtained from the C layer. 2015-05-27: wsfulton [Python] Deal with an integer as the default value of a typedef to bool parameter in the C++ prototype. See #327. Regression from 3.0.0 onwards. 2015-05-19: olly [Python] Fix warning when compiling generated code with MSVC. (Fixes https://sourceforge.net/p/swig/patches/351/ reported by Mateusz Szyma¿ski). 2015-05-14: wsfulton Fix seg fault wrapping shared_ptr of classes with private constructors and destructors. This also fixes the "unref" feature when used on classes with private destructors. 2015-05-10: wsfulton [Java] Fix multi-argument typemaps (char *STRING, size_t LENGTH) so that they can be applied to a wider range of types. Fixes #385. 2015-05-07: olly [Python] Deal with an integer as the default value of a bool parameter in the C++ prototype. Fixes github #327, reported by Greg Allen. 2015-05-07: LindleyF [Java] Allow feature("director") and feature("ref") to be used together. Github PR#403. 2015-05-05: olly Suppress warning 325 "Nested class not currently supported (Foo ignored)" when Foo has already been explicitly ignored with "%ignore". 2015-05-04: wsfulton Add support for friend templates, including operator overloading - fixes #196. Considering the example below, previously the operator gave a syntax error and friendfunc incorrectly warned with: "Warning 503: Can't wrap 'friendfunc<(Type)>' unless renamed to a valid identifier." template class MyClass { friend int friendfunc (double is, MyClass & x); friend int operator<< (double un, const MyClass &x); }; The following also previously incorrectly warned with: "Warning 302: Identifier 'template_friend' redefined (ignored)," template T template_friend(T); struct MyTemplate { template friend T template_friend(T); }; 2015-05-01: wsfulton Fix handling of conversion operators where the operator is split over multiple lines or has comments within the operator type. Fixes #401. Also fix similar problem with normal operators which gave a syntax error if split over multiple lines or had a comment within the operator declaration. 2015-04-30: olly Ignore unknown preprocessor directives which are inside an inactive conditional (github issue #394, reported by Dan Wilcox). Regression introduced in 3.0.3. 2015-04-27: vadz [Python] Fix "default" typemap used after an argument with "numinputs=0" (#377). 2015-04-24: wsfulton [Python] Fix #256. Code generated with '-builtin -modernargs' segfaults for any method taking zero arguments. Also fixes: "SystemError: error return without exception set" during error checking when using just -builtin and the incorrect number of arguments is passed to a class method expecting zero arguments. 2015-04-23: wsfulton [Java] Bug #386 - Memory leak fix in (char *STRING, size_t LENGTH) typemaps. 2015-04-23: vadz [Python] Make "default" typemap work again (#330, #377). 2015-04-23: vadz [Python] Fix the use of default values for the pointer types (#365, #376). 2015-04-23: wsfulton Fix 'make check-ccache' which is part of 'make check' when one of the CCACHE_ environment variables, for example CCACHE_DISABLE, is set. 2015-04-14: wsfulton Clearer warning message for badly constructed typecheck typemaps. For example, was: example.i:3: Warning 467: Overloaded foo(int) not supported (no type checking rule for 'int'). Now: example.i:3: Warning 467: Overloaded foo(int) not supported (incomplete type checking rule - no precedence level in typecheck typemap for 'int'). 2015-04-11: wsfulton [Java] Fix #353 - Linker multiple definition of 'ExceptionMatches' when using directors and multiple modules. 2015-04-11: wsfulton Merge #320 - Make __dict__ accessible for Python builtin classes. 2015-04-07: wsfulton Fix #375 - parsing of extern "C" and typedef for example: extern "C" typedef void (*Hook2_t)(int, const char *); extern "C" typedef int Integer; 2015-03-12: olly -DSWIG_DIRECTOR_STATIC is now supported for all languages with director support, not only Python and PHP. 2015-03-02: ianlancetaylor [Go] Add -cgo option, required for Go versions 1.5 and later. 2015-02-26: olly Fix segmentation fault when top==NULL, introduced by nested class handling (reported in issue#346 by Pawe¿ Tomulik). 2015-02-09: wsfulton [Guile] Fix generated code for static const char member variables when defined and declared inline. 2015-02-09: mishas [Go] Fix %import of files in sub directories. 2015-02-05: ianlancetaylor [Go] Ignore Go specific type maps (goin, goout, etc.) if they are empty. 2015-02-05: ianlancetaylor [Go] Generated Go code no longer calls _swig_goallocate or _swig_makegostring, as they will no longer work as of Go 1.5. Version 3.0.5 (31 Jan 2015) =========================== 2015-01-30: wsfulton [Python] Fix Python -classic and property setting. Setting properties on classic classes was broken in swig-3.0.3 by attempting to use __setattr__. This regression is fixed now by using __dict__ again when using -classic. Fixes patch #232. 2015-01-27: smarchetto [Scilab] Support for the Scilab language has been added 2015-01-23: olly [PHP] When wrapping a returned resource as an object, check if all cases wrap it in the same class, and if so eliminate the pointless switch statement wrapper we previously generated. 2015-01-22: wsfulton [Octave] Merge patch #297 for SF bug #1277 - Octave shared_ptr support 2015-01-15: wsfulton [Python] Merge patch #250 - Fixes for using %constant and objects (non-primitive types) 2015-01-15: wsfulton [C# Go] Merge patch #308 and fix #307 - C++11 strongly typed enum support in directors 2015-01-15: wsfulton [Python] Second fix for #294 #296 - Regression introduced in SWIG-3.0.3 when wrapping functions with default arguments, this time when using kwargs. Version 3.0.4 (14 Jan 2015) =========================== 2015-01-12: olly [PHP] Fix segfault in director upcall check when using PHP built with ZTS enabled. Fixes #155, reported by Pierre Labastie. 2015-01-12: vadz [Python] Fix #294 #296 - Regression introduced in SWIG-3.0.3 when wrapping functions with default arguments. Invalid or missing default arguments were sometimes being generated into the python layer. 2015-01-08: olly Allow C++11 "explicit constexpr". Fixes github issue #284 reported by Pawel Tomulik. Also handle "constexpr explicit" and "constexpr static". 2015-01-08: olly When reporting an error for a construct which hasn't been terminated when the end of the file is reached, report it at the start line rather than "EOF" as then tools like editors and IDEs will take you to a generally more useful place for fixing the problem. 2015-01-08: olly Improve error messages for a few cases which previously gave the one of the cryptic catch-all errors "Syntax error in input". 2015-01-08: olly Provide -cppext as a general command line option for setting the extension used for generated C++ files (previously it was specific to the PHP backend). Deprecate the equivalent -suffix option provided by the Ocaml backend, but continue to support that for now. Version 3.0.3 (30 Dec 2014) =========================== 2014-12-27: wsfulton Fix #280 - abort using all default template parameters within other template parameters. 2014-12-27: talby [Perl] Issue #282 perl5 archlib vs archlibexp [Perl] tidy "warning: duplicate 'extern' declaration specifier" when building generated code under clang 2014-12-18: wsfulton Add support for %constant and structs/classes - issue #272 2014-12-09: wsfulton Fix #245 - regression (since swig-3.0.0) in templated constructors. Templated constructors could not be instantiated - they were incorrectly ignored with a warning 504: "Function: xyz must have a return type. Ignored." 2014-12-07: wsfulton Add support for C++11 strongly typed enumerations. 2014-11-21: wsfulton [Java C#] Fix multiply defined error when using %rename of enum items when using the "simple enum" wrappers. 2014-10-28: vadz [Python] Patch #201 The generated .py file no longer uses *args for all Python parameters. Instead, the parameters are named using the C++ parameter names. "compactdefaultargs" feature can be enabled to restore the old behaviour. *** POTENTIAL INCOMPATIBILITY *** 2014-10-24: timotheecour [D] Patch #204 Use core.atomic.atomicOp to mutate shared variables 2014-10-21: wsfulton Fix issue #242 - Use of the "kwargs" feature no longer automatically turns on the "compactdefaultargs" feature if the target language does not support kwargs. This change affects all languages except Python and Ruby. *** POTENTIAL INCOMPATIBILITY *** 2014-10-10: diorcety [Python] Patch #232 Fix property access using directors 2014-10-06: wsfulton [Python] Fixes when using -builtin and std::vector/std::list wrappers to allow deletion of single elements, such as 'del vec[0]'. 2014-09-30: oliverb [Javascript] Merge patch #216 by Richie765 - Added support for many versions of v8 javascript. 2014-09-30: oliverb [Javascript] Merge patch #195 by zittix - Fixed JSClassRef declaration not using the static one. 2014-09-30: ianlancetaylor [Go] In configure script, require Go 1.1 or later. 2014-09-30: wsfulton [Python] Patch #207 - Fix No module error with -relativeimport when using single header file import. 2014-09-27: wsfulton Patch #208 - Initialise newly created array when using array_functions in the carrays.i library (C++ usage). 2014-09-27: wsfulton [Ruby] Patch #187 - Fix crash on shutdown of the Ruby interpreter if more than one module was loaded at a time when data is being shared between modules. 2014-09-27: wsfulton [Java] Patch #168 - Fix leak in Java director string handling after the Java upcall when called from a native thread. 2014-09-25: ianlancetaylor [Go] Adjust generated code to work with upcoming Go 1.4 release. 2014-09-23: wsfulton [Python] Add patch from Thomas Maslach to fix crash in wrappers when using -threads in the STL iterators (SwigPyIterator destructor). 2014-09-17: wsfulton [C#] Merge patch #229 from contre - Add bool array types to arrays_csharp.i 2014-09-12: olly [PHP] Add support for specifying any PHP interfaces a wrapped class implements, e.g.: %typemap("phpinterfaces") MyIterator "Iterator"; 2014-09-11: olly [PHP] Fix throwing a PHP exception through C++ from a subclassed director method - PHP NULL gets returned by the subclassed method in this case, so the directorout typemap needs to allow that (at least if an exception is active). 2014-09-09: ianlancetaylor [Go] Add goargout typemap. 2014-09-09: olly [PHP] Fix segmentation faults with directors in PHP >= 5.4, and reenable runme tests for director_basic testcase. Fix from pavel-charvat in issue#164. 2014-09-05: ianlancetaylor [Go] Add imtype, goin, goout, godirectorin, and godirectorout typemaps, to support writing Go code to convert between types. 2014-09-02: olly [Python] Fix regression in indentation of python code produced with -modern, introduced by changes in #188. Reported by fabiencastan in #218. 2014-09-01: olly Issue an error for unknown SWIG preprocessor directives, rather than quietly ignoring them. Reported by jrhelsey in issue#217. *** POTENTIAL INCOMPATIBILITY *** 2014-08-15: talby [Perl] Include guard fix for nested modules from Anthony Heading (SF Patch #350). 2014-08-04: wsfulton [C#] Merge patch #200 from gpetrou - Changed CSharp license header to include auto-generated tag so that StyleCop ignores the files. 2014-08-04: wsfulton [Java] Merge patch #198 from Yuval Kashtan - Support for java.nio.ByteBuffer mapping to unsigned char * in various.i in NIOBUFFER typemaps. 2014-07-14: ianlancetaylor [Go] Change struct definition to use void *, not uint8, so that the type is recorded as possibly containing pointers. This ensures that the 1.3 garbage collector does not collect pointers passed to C++ code. 2014-07-01: wsfulton Fix SF Bug #1375 - Expansion of the $parentclassname special variable incorrectly contains brackets in the expanded name. Version 3.0.2 (4 Jun 2014) ========================== 2014-06-02: v-for-vandal [Lua] Pull request #176: If class has no __eq implemented, then default __eq is generated. Default __eq compares actual pointers stored inside Lua userdata. 2014-06-02: vkalinin Fix #183 - %extend and unnamed nested structs 2014-05-28: kwwette Fix install failure when using an 'out of source' build using the shipped tarball - regression introduced in swig-3.0.1. 2014-05-24: kwwette [Octave] Remove deprecated -global/-noglobal command-line arguments *** POTENTIAL INCOMPATIBILITY *** Version 3.0.1 (27 May 2014) =========================== 2014-05-25: hfalcic [Python] Python 3 byte string output: use errors="surrogateescape" if available on the version of Python that's in use. This allows obtaining the original byte string (and potentially trying a fallback encoding) if the bytes can't be decoded as UTF-8. Previously, a UnicodeDecodeError would be raised with no way to treat the data as bytes or try another codec. 2014-05-18: vkalinin Bug #175 - Restore %extend to work for unnamed nested structures by using a C symbol comprising the outer structure name and unnamed variable instance name. 2014-05-15: kwwette Add #166 - 'make check' now works out of source. This required the examples to build out of source. The main languages have been tested - C#, Go, Guile, Java, Javascript, Lua, Octave, Perl, PHP, Python, Ruby and Tcl. 2014-05-01: Oliver Buchtala Javascript support added, see Javascript chapter in the documentation. 2014-05-01: olly [PHP] The generated __isset() method now returns true for read-only properties. 2014-04-24: kwwette [Go] Fix go ./configure parsing of gccgo --version, and goruntime.swg typo in __GNUC_PATCHLEVEL__ (SF Bug #1298) 2014-04-24: kwwette Fix {python|perl5|ruby|tcl}/java examples In Lib/gcj/cni.i, for compatibility with newer gcj versions: - remove JvAllocObject() which gcj no longer defines, from gcj Changelog: 2004-04-16 Bryce McKinlay * gcj/cni.h (JvAllocObject): Remove these obsolete, undocumented CNI calls. - change JvCreateJavaVM() argument from void* to JvVMInitArgs*, from gcj Changelog: 2005-02-23 Thomas Fitzsimmons PR libgcj/16923 ... (JvCreateJavaVM): Declare vm_args as JvVMInitArgs* rather than void*. *** POTENTIAL INCOMPATIBILITY *** 2014-04-08: wsfulton SF Bug #1366 - Remove duplicate declarations of strtoimax and strtoumax in inttypes.i 2014-04-08: wsfulton [Java C#] Enums which have been ignored via %ignore and are subsequently used are handled slightly differently. Type wrapper classes are now generated which are effectively a wrapper of an empty enum. Previously in Java uncompilable code was generated and in C# an int was used. 2014-04-04: wsfulton Fix regression in 3.0.0 where legal code following an operator<< definition might give a syntax error. SF Bug #1365. 2014-04-03: olly [PHP] Fix wrapping director constructors with default parameters with a ZTS-enabled build of PHP. 2014-04-02: olly [PHP] Pass the ZTS context we already have to avoid needing to call TSRMLS_FETCH, which is relatively expensive. 2014-04-02: olly [PHP] Pass ZTS context through to t_output_helper() so it works with a ZTS-enabled build of PHP. Reported by Pierre Labastie in github PR#155. 2014-03-28: wsfulton [Java C# D Go] Fixes for C enums used in an API and the definition of the enum has not been parsed. For D, this fixes a segfault in SWIG. The other languages now produce code that compiles, although the definition of the enum is needed in order to use the enum properly from the target language. 2014-03-23: v-for-vandal [Lua] Fix for usage of snprintf in Lua runtime which Visual Studio does not have. Version 3.0.0 (16 Mar 2014) =========================== 2014-03-16: wsfulton C++11 support initially developed as C++0x support by Matevz Jekovec as a Google Summer of Code project has been further extended. The C++11 support is comprehensive, but by no means complete or without limitations. Full details for each new feature in C++11 is covered in the CPlusPlus11.html chapter in the documentation which is included in SWIG and also available online at http://www.swig.org/Doc3.0/CPlusPlus11.html. 2014-03-14: v-for-vandal [Lua] Numerous Lua improvements: 1. %nspace support has been added. Namespaces are mapped to tables in the module, with the same name as the C++ namespace. 2. Inheritance is now handled differently. Each class metatable keeps a list of class bases instead of merging all members of all bases into the derived class. 3. The new metatables result in differences in accessing class members. For example: %module example struct Test { enum { TEST1 = 10, TEST2 = 20 }; static const int ICONST = 12; }; Now this can be used as follows: print(example.Test.TEST1) print(example.Test.ICONST) The old way was: print(example.Test_TEST1) print(example.Test_ICONST) 4. The special class metatable member ".constructor" was removed. Now SWIG generates the proxy function by itself and assigns it directly to the class table "__call" method. 5. eLua should also now support inheritance. 6. 'const' subtable in eLua is considered deprecated. Changes in behaviour: a. You can no longer assign to non-existing class members in classes without a __setitem__ method. It will cause a Lua error. b. You can no longer iterate over a module table and copy everything into the global namespace. Actually, this was never the case, but it is now explicitly prohibited. c. Now changing a base class will immediately affect all derived classes. d. There might be some issues with inheritance. Although the bases iteration scheme is the same as was used for merging base classes into derived one, some unknown issues may arise. The old metatable behaviour can be restored by using the -no-old-metatable-bindings option. *** POTENTIAL INCOMPATIBILITY *** 2014-03-06: wsfulton [Python] Change in default behaviour wrapping C++ bool. Only a Python True or False will now work for C++ bool parameters. This fixes overloading bool with other types. Python 2.3 minimum is now required for wrapping bool. When wrapping: const char* overloaded(bool value) { return "bool"; } const char* overloaded(int value) { return "int"; } Previous behaviour: >>> overloaded(False) 'int' >>> overloaded(True) 'int' >>> overloaded(0) 'int' Now we get the expected behaviour: >>> overloaded(False) 'bool' >>> overloaded(0) 'int' The consequence is when wrapping bool in non-overloaded functions: const char* boolfunction(bool value) { return value ? "true" : "false"; } The previous behaviour was very Pythonic: >>> boolfunction("") 'false' >>> boolfunction("hi") 'true' >>> boolfunction(12.34) 'true' >>> boolfunction(0) 'false' >>> boolfunction(1) 'true' Now the new behaviour more along the lines of C++ due to stricter type checking. The above calls result in an exception and need to be explicitly converted into a bool as follows: >>> boolfunction(0) Traceback (most recent call last): File "", line 1, in TypeError: in method 'boolfunction', argument 1 of type 'bool' >>> boolfunction(bool(0)) 'false' The old behaviour can be resurrected by passing the -DSWIG_PYTHON_LEGACY_BOOL command line parameter when executing SWIG. Typemaps can of course be written to customise the behaviour for specific parameters. *** POTENTIAL INCOMPATIBILITY *** 2014-03-06: wsfulton Fix SF Bug #1363 - Problem with method overloading when some methods are added by %extend and others are real methods and using template default parameters with smart pointers. This is noticeable as a regression since 2.0.12 when using the default smart pointer handling for some languages when the smart pointer wraps std::map and other STL containers. 2014-03-02: wsfulton [Python] SF Patch #346 from Jens Krueger. Correct exception thrown attempting to access a non-existent C/C++ global variable on the 'cvar' object. The exception thrown used to be a NameError. However, as this access is via a primary, an AttributeError is more correct and so the exception thrown now is an AttributeError. Reference: http://docs.python.org/2/reference/expressions.html#attribute-references *** POTENTIAL INCOMPATIBILITY *** 2014-03-01: wsfulton [Python] Patch #143 Fix type shown when using type() to include the module and package name when using -builtin. 2014-03-01: wsfulton [Python] SF patch #347 Fix missing argument count checking with -modern. Fixes regression introduced when builtin changes were introduced in SWIG-2.0.3. 2014-02-21: wsfulton [PHP] Fix warning suppression using %warnfilter for PHP reserved class names. 2014-02-19: olly [Lua] Add keyword warnings for Lua keywords and Basic Functions. 2014-02-19: olly -Wallkw now includes keywords for all languages with keyword warnings (previously Go and R were missing). 2014-02-19: olly [PHP] Update the lists of PHP keywords with new ones from PHP 5.4 and newer (and some missing ones from 5.3). Reserved PHP constants names are now checked against enum values and constants, instead of against function and method names. Built-in PHP function names no longer match methods added by %extend. Functions and methods named '__sleep', '__wakeup', 'not', 'parent', or 'virtual' are no longer needlessly renamed. 2014-02-15: wsfulton Fix the %$ismember %rename predicates to also apply to members added via %extend. Add %$isextendmember for %rename of members added via %extend. This can be used to distinguish between normal class/struct members and %extend members. For example '%$ismember, %$not %$isextendmember' will now identify just class/struct members. *** POTENTIAL INCOMPATIBILITY *** 2014-02-16: hfalcic [Python] Patch #137 - fix crashes/exceptions in exception handling in Python 3.3 2014-02-15: wsfulton [Java] Add support for the cdata library. 2014-02-08: vkalinin Nested class support added. This primarily allows SWIG to properly parse nested classes and keep the nested class information in the parse tree. Java and C# have utilised this information wrapping the C++ nested classes as Java/C# nested classes. The remaining target languages ignore nested classes as in previous versions. Help is needed by users of these remaining languages to design how C++ nested classes can be best wrapped. Please talk to us on the swig-devel mailing list if you think you can help. Previously, there was limited nested class support. Nested classes were treated as opaque pointers. However, the "nestedworkaround" feature provided a way to wrap a nested class as if it was a global class. This feature no longer exists and is replaced by the new "flatnested" feature. This effectively does the same thing with less manual code to be written. Please see the 'Nested classes' section in the documentation in SWIGPlus.html if you were previously using this feature. SWIG now parses the contents of nested classes where previously it did not. You may find that you will need to make adjustments to your interface file as effectively extra code is being wrapped. *** POTENTIAL INCOMPATIBILITY *** 2014-02-06: gjanssens [Guile] Patch #133. Make scm to string conversion work with non-ascii strings. Guile 2 has a completely rewritten string implementation. SWIG made some assumptions that are no longer valid as to the internals of guile's string representation. 2014-01-30: wsfulton [C#] Add new swigtype_inout.i library containing SWIGTYPE *& OUTPUT typemaps. Example usage wrapping: void f(XXX *& x) { x = new XXX(111); } would be: XXX x = null; f(out x); // use x x.Dispose(); // manually clear memory or otherwise leave out and leave it to the garbage collector 2014-01-21: ianlancetaylor [Go] Add %go_import directive. 2014-01-21: ianlancetaylor [Go] Add support for Go 1.3, not yet released. 2014-01-20: wsfulton Director exceptions (Swig::DirectorException) now derive from std::exception and hence provide the what() method. In Python and Ruby, this replaces the now deprecated DirectorException::getMessage() method. 2014-01-14: diorcety Patch #112 - Fix symbol resolution involving scopes that have multiple levels of typedefs - fixes some template resolutions as well as some typemap searches. 2014-01-11: wsfulton Fix and document the naturalvar feature override behaviour - the naturalvar feature attached to a variable name has precedence over the naturalvar feature attached to the variable's type. The overriding was not working when turning the feature off on the variable's name. Fix so that any use of the naturalvar feature will override the global setting. Previously when set globally by -naturalvar or %module(naturalvar=1), use of the naturalvar feature was not always honoured. 2014-01-06: ianlancetaylor [Go] Fix bug that broke using directors from a thread not created by Go. 2013-12-24: ptomulik [Python] SF Bug #1297 Resolve several issues related to python imports. For example, it's now possible to import modules having the same module names, but belonging in different packages. From the user's viewpoint, this patch gives a little bit more control on import statements generated by SWIG. The user may choose to use relative or absolute imports. Some details: - we (still) generate import statements in the form 'import a.b.c' which corresponds to absolute imports in python3 and (the only available) ambiguous one in python2. - added -relativeimport option to use explicit relative import syntax (python3), The "Python Packages" section in the documentation discusses how to work with importing packages including the new -relativeimport command line option. 2013-12-23: vadz [Octave, Perl, Python, R, Ruby, Tcl] Change the length of strings created from fixed-size char buffers in C code. This is a potential backwards compatibility break: a "char buf[5]" containing "ho\0la" was returned as a string of length 5 before, but is returned as a string of length 2 now. Also, it was possible to assign a (non-NUL-terminated) string "hello" to such a buffer before but now this fails and only "helo" can fit. Apply "char FIXSIZE[ANY]" typemaps to explicitly choose the old behaviour. *** POTENTIAL INCOMPATIBILITY *** 2013-12-23: talby [Perl] Add support for directors. 2013-12-18: ianlancetaylor [Go] Don't require that Go environment variables be set when running examples or testsuite when using Go 1 or later. 2013-12-17: ianlancetaylor [Go] Remove -longsize option (for backward compatibility, ignore it if seen). 2013-12-17: ianlancetaylor [Go] Add -go-pkgpath option. 2013-12-16: ianlancetaylor [Go] Update for Go 1.2 release. Add support for linking SWIG code directly into executable, rather than using a shared library. 2013-12-13: ianlancetaylor [Go] Add SWIG source file name as comments in generated files. This can be used by Go documentation tools. 2013-12-12: jleveque [Lua] Fix typo (wchar instead of wchar_t) which made wchar.i for Lua useless. 2013-12-12: vmiklos [PHP] PHP's peculiar call-time pass-by-reference feature was deprecated in PHP 5.3 and removed in PHP 5.4, so update the REF typemaps in phppointers.i to specify pass-by-reference in the function definition. Examples/php/pointer has been updated accordingly. 2013-12-12: olly [PHP] The usage of $input in PHP directorout typemaps has been changed to be consistent with other languages. The typemaps provided by SWIG have been updated accordingly, but if you have written your own directorout typemaps, you'll need to update $input to &$input (or make equivalent changes). *** POTENTIAL INCOMPATIBILITY *** 2013-11-27: vadz [C#, Java, Python] Add std_auto_ptr.i defining typemaps for returning std::auto_ptr<>. 2013-11-09: wsfulton [C#] Apply patch #79 from Brant Kyser - Remove using directives from the generated C# code and fully qualify the use of all .NET framework types in order to minimize potential name collisions from input files defining types, namespace, etc with the same name as .NET framework members. - Globally qualify the use of .NET framework types in the System namespace - Remove .NET 1.1 support, .NET 2 is the minimum for the C# module This is a potential backwards compatibility break if code has been added relying on these using statements that used to be generated: using System; using System.Runtime.InteropServices; The quick fix to add these back in is to add the -DSWIG2_CSHARP command line option when executing SWIG. See CSharp.html documentation for more info. *** POTENTIAL INCOMPATIBILITY *** 2013-11-05: wsfulton [Java] Fix some corner cases for the $packagepath/$javaclassname special variable substitution. 2013-11-05: wsfulton [Java] Apply patch #91 from Marvin Greenberg - Add director:except feature for improved exception handling in director methods for Java. 2013-10-15: vadz Allow using \l, \L, \u, \U and \E in the substitution part of %(regex:/pattern/subst/) inside %rename to change the case of the text being replaced. 2013-10-12: wsfulton [CFFI] Apply #96 - superclass not lispify 2013-10-12: wsfulton Merge in C++11 support from the gsoc2009-matevz branch where Matevz Jekovec first started the C++0x additions. Documentation of the C++11 features supported is in a new Chapter of the documentation, "SWIG and C++11" in Doc/Manual/CPlusPlus11.html. 2013-10-04: wsfulton Fix %naturalvar not having any affect on templated classes instantiated with an enum as the template parameter type. Problem reported by Vadim Zeitlin. 2013-09-20: wsfulton [Java] Fix a memory leak for the java char **STRING_ARRAY typemaps. Version 2.0.12 (9 Feb 2014) =========================== 2014-01-16: wsfulton [PHP] Fix compilation error in ZTS mode (64 bit windows) due to incorrect placement of TSRMLS_FETCH() in SWIG_Php_GetModule() as reported by Mark Dawson-Butterworth. 2014-01-13: kwwette [Octave] update support to Octave version 3.8.0 - Octave 3.8.0 no longer defines OCTAVE_API_VERSION_NUMBER, but 3.8.1 will define OCTAVE_{MAJOR,MINOR,PATCH}_VERSION instead: see http://hg.savannah.gnu.org/hgweb/octave/rev/b6b6e0dc700e So we now use a new macro SWIG_OCTAVE_PREREQ(major,minor,patch) to enable features requiring Octave version major.minor.patch or later. For Octave versions prior to 3.8.1, we reconstruct values for OCTAVE_{MAJOR,MINOR,PATCH}_VERSION based on OCTAVE_API_VERSION_NUMBER, extracted from Octave's ChangeLogs. An additional hack is needed to distinguish between Octave <= 3.2.x and 3.8.0, neither of which define OCTAVE_API_VERSION_NUMBER. - Octave 3.8.0 deprecates symbol_table::varref(), so remove its use for this and future versions of Octave. - Octave 3.8.0 removes octave_value::is_real_nd_array(), used in octave_swig_type::dims(). Its use is not required here, so remove it. - Retested against Octave versions 3.0.5, 3.2.4, 3.4.3, 3.6.4, and 3.8.0. - Updated Octave documentation with tested Octave versions, and added a warning against using versions <= 3.x.x, which are no longer tested. 2013-12-22: wsfulton C++11 support for new versions of erase and insert in the STL containers. The erase and insert methods in the containers use const_iterator instead of iterator in C++11. There are times when the methods wrapped must match the parameters exactly. Specifically when full type information for template types is missing or SWIG fails to look up the type correctly, for example: %include typedef float Real; %template(RealVector) std::vector; SWIG does not find std::vector::iterator because %template using typedefs does not always work and so SWIG doesn't know if the type is copyable and so uses SwigValueWrapper which does not support conversion to another type (const_iterator). This resulted in compilation errors when using the C++11 version of the containers. Closes #73 2013-10-17: wsfulton [R] Fix SF #1340 - Visual Studio compile error in C++ wrappers due to #include within extern "C" block. 2013-10-17: wsfulton [Python] Fix SF #1345 - Missing #include for offsetof when using -builtin. 2013-10-12: wsfulton [Lua] Apply #92 - missing return statements for SWIG_Lua_add_namespace_details() and SWIG_Lua_namespace_register(). Version 2.0.11 (15 Sep 2013) ============================ 2013-09-15: wsfulton [R] Fix attempt to free a non-heap object in OUTPUT typemaps for: unsigned short *OUTPUT unsigned long *OUTPUT signed long long *OUTPUT char *OUTPUT signed char*OUTPUT unsigned char*OUTPUT 2013-09-12: wsfulton [Lua] Pull Git patch #62. 1) Static members and static functions inside class can be accessed as ModuleName.ClassName.FunctionName (MemberName respectively). Old way such as ModuleName.ClassName_FunctionName still works. 2) Same goes for enums inside classes: ModuleName.ClassName.EnumValue1 etc. 2013-09-12: wsfulton [UTL] Infinity is now by default an acceptable value for type 'float'. This fix makes the handling of type 'float' and 'double' the same. The implementation requires the C99 isfinite() macro, or otherwise some platform dependent equivalents, to be available. Users requiring the old behaviour of not accepting infinity, can define a 'check' typemap wherever a float is used, such as: %typemap(check,fragment="") float, const float & %{ if ($1 < -FLT_MAX || $1 > FLT_MAX) { SWIG_exception_fail(SWIG_TypeError, "Overflow in type float"); } %} *** POTENTIAL INCOMPATIBILITY *** 2013-08-30: wsfulton [Lua] Pull Git patch #81: Include Lua error locus in SWIG error messages. This is standard information in Lua error messages, and makes it much easier to find bugs. 2013-08-29: wsfulton Pull Git patch #75: Handle UTF-8 files with BOM at beginning of file. Was giving an 'Illegal token' syntax error. 2013-08-29: wsfulton [C#] Pull Git patch #77: Allow exporting std::map using non-default comparison function. 2013-08-28: wsfulton [Python] %implicitconv is improved for overloaded functions. Like in C++, the methods with the actual types are considered before trying implicit conversions. Example: %implicitconv A; struct A { A(int i); }; class CCC { public: int xx(int i) { return 11; } int xx(const A& i) { return 22; } }; The following python code: CCC().xx(-1) will now return 11 instead of 22 - the implicit conversion is not done. 2013-08-23: olly [Python] Fix clang++ warning in generated wrapper code. 2013-08-16: wsfulton [Python] %implicitconv will now accept None where the implicit conversion takes a C/C++ pointer. Problem highlighted by Bo Peng. Closes SF patch #230. 2013-08-07: wsfulton [Python] SF Patch #326 from Kris Thielemans - Remove SwigPyObject_print and SwigPyObject_str and make the generated wrapper use the default python implementations, which will fall back to repr (for -builtin option). Advantages: - it avoids the swig user having to jump through hoops to get print to work as expected when redefining repr/str slots. - typing the name of a variable on the python prompt now prints the result of a (possibly redefined) repr, without the swig user having to do any extra work. - when redefining repr, the swig user doesn't necessarily have to redefine str as it will call the redefined repr - the behaviour is exactly the same as without the -builtin option while requiring no extra work by the user (aside from adding the %feature("python:slot...) statements of course) Disadvantage: - default str() will give different (but clearer?) output on swigged classes 2013-07-30: wsfulton [Python, Ruby] Fix #64 #65: Missing code in std::multimap wrappers. Previously an instantiation of a std::map was erroneously required in addition to an instantiation of std::multimap with the same template parameters to prevent compilation errors for the wrappers of a std::multimap. 2013-07-14: joequant [R] Change types file to allow for SEXP return values 2013-07-05: wsfulton [Python] Add %pythonbegin directive which works like %pythoncode, except the specified code is added at the beginning of the generated .py file. This is primarily needed for importing from __future__ statements required to be at the very beginning of the file. Example: %pythonbegin %{ from __future__ import print_function print("Loading", "Whizz", "Bang", sep=' ... ') %} 2013-07-01: wsfulton [Python] Apply SF patch #340 - Uninitialized variable fix in SWIG_Python_NonDynamicSetAttr when using -builtin. 2013-07-01: wsfulton [Python, Ruby, Ocaml] Apply SF patch #341 - fix a const_cast in generated code that was generating a <:: digraph when using the unary scope operator (::) (global scope) in a template type. 2013-07-01: wsfulton [Python] Add SF patch #342 from Christian Delbaere to fix some director classes crashing on object deletion when using -builtin. Fixes SF bug #1301. 2013-06-11: wsfulton [Python] Add SWIG_PYTHON_INTERPRETER_NO_DEBUG macro which can be defined to use the Release version of the Python interpreter in Debug builds of the wrappers. The Visual Studio .dsp example files have been modified to use this so that Debug builds will now work without having to install or build a Debug build of the interpreter. 2013-06-07: wsfulton [Ruby] Git issue #52. Fix regression with missing rb_complex_new function for Ruby versions prior to 1.9 using std::complex wrappers if just using std::complex as an output type. Also fix the Complex helper functions external visibility (to static by default). 2013-06-04: olly [PHP] Fix SWIG_ZTS_ConvertResourcePtr() not to dereference NULL if the type lookup fails. Version 2.0.10 (27 May 2013) ============================ 2013-05-25: wsfulton [Python] Fix Python 3 inconsistency when negative numbers are passed where a parameter expects an unsigned C type. An OverFlow error is now consistently thrown instead of a TypeError. 2013-05-25: Artem Serebriyskiy SVN Patch ticket #338 - fixes to %attribute macros for template usage with %arg. 2013-05-19: wsfulton Fix ccache-swig internal error bug due to premature file cleanup. Fixes SF bug 1319 which shows up as a failure in the ccache tests on Debian 64 bit Wheezy, possibly because ENABLE_ZLIB is defined. This is a corner case which will be hit when the maximum number of files in the cache is set to be quite low (-F option), resulting in a cache miss. 2013-05-09: kwwette [Octave] Fix bugs in Octave module loading: - fix a memory leak in setting of global variables - install functions only once, to speed up module loads 2013-04-28: gjanssens [Guile] Updates in guile module: - Add support for guile 2.0 - Drop support for guile 1.6 - Drop support for generating wrappers using guile's gh interface. All generated wrappers will use the scm interface from now on. - Deprecate -gh and -scm options. They are no longer needed. A warning will be issued when these options are still used. - Fix all tests and examples to have a successful travis test 2013-04-18: wsfulton Apply Patch #36 from Jesus Lopez to add support for $descriptor() special variable macro expansion in fragments. For example: %fragment("nameDescriptor", "header") %{ static const char *nameDescriptor = "$descriptor(Name)"; %} which will generate into the wrapper if the fragment is used: static const char *nameDescriptor = "SWIGTYPE_Name"; 2013-04-18: wsfulton Fix SF Bug #428 - Syntax error when preprocessor macros are defined inside of enum lists, such as: typedef enum { eZero = 0 #define ONE 1 } EFoo; The macros are silently ignored. 2013-04-17: wsfulton [C#] Pull patch #34 from BrantKyser to fix smart pointers in conjunction with directors. 2013-04-15: kwwette [Octave] Fix bugs in output of cleanup code. - Cleanup code is now written also after the "fail:" label, so it will be called if a SWIG_exception is raised by the wrapping function, consistent with other modules. - Octave module now also recognises the "$cleanup" special variable, if needed. 2013-04-08: kwwette Add -MP option to SWIG for generating phony targets for all dependencies. - Prevents make from complaining if header files have been deleted before the dependency file has been updated. - Modelled on similar option in GCC. 2013-04-09: olly [PHP] Add missing directorin typemap for char* and char[] which fixes director_string testcase failure. 2013-04-05: wsfulton [Ruby] SF Bug #1292 - Runtime fixes for Proc changes in ruby-1.9 when using STL wrappers that override the default predicate, such as: %template(Map) std::map >; 2013-04-05: wsfulton [Ruby] SF Bug #1159 - Correctly check rb_respond_to call return values to fix some further 1.9 problems with functors and use of Complex wrappers. 2013-04-02: wsfulton [Ruby] Runtime fixes for std::complex wrappers for ruby-1.9 - new native Ruby complex numbers are used. 2013-03-30: wsfulton [Ruby] Fix seg fault when using STL containers of generic Ruby types, GC_VALUE or LANGUAGE_OBJECT, on exit of the Ruby interpreter. More frequently observed in ruby-1.9. 2013-03-29: wsfulton [Ruby] Fix delete_if (reject!) for the STL container wrappers which previously would sometimes seg fault or not work. 2013-03-25: wsfulton [Python] Fix some undefined behaviour deleting slices in the STL containers. 2013-03-19: wsfulton [C#, Java, D] Fix seg fault in SWIG using directors when class and virtual method names are the same except being in different namespaces when the %nspace feature is not being used. 2013-02-19: kwwette Fix bug in SWIG's handling of qualified (e.g. const) variables of array type. Given the typedef a(7).q(volatile).double myarray // typedef volatile double[7] myarray; the type q(const).myarray // const myarray becomes a(7).q(const volatile).double // const volatile double[7] Previously, SwigType_typedef_resolve() produces the type q(const).a(7).q(volatile).double // non-sensical type which would never match %typemap declarations, whose types were parsed correctly. Add typemap_array_qualifiers.i to the test suite which checks for the correct behaviour. 2013-02-18: wsfulton Deprecate typedef names used as constructor and destructor names in %extend. The real class/struct name should be used. typedef struct tagEStruct { int ivar; } EStruct; %extend tagEStruct { EStruct() // illegal name, should be tagEStruct() { EStruct *s = new EStruct(); s->ivar = ivar0; return s; } ~EStruct() // illegal name, should be ~tagEStruct() { delete $self; } } For now these trigger a warning: extend_constructor_destructor.i:107: Warning 522: Use of an illegal constructor name 'EStruct' in %extend is deprecated, the constructor name should be 'tagEStruct'. extend_constructor_destructor.i:111: Warning 523: Use of an illegal destructor name 'EStruct' in %extend is deprecated, the destructor name should be 'tagEStruct'. These %extend destructor and constructor names were valid up to swig-2.0.4, however swig-2.0.5 ignored them altogether for C code as reported in SF bug #1306. The old behaviour of using them has been restored for now, but is officially deprecated. This does not apply to anonymously defined typedef classes/structs such as: typedef struct {...} X; 2013-02-17: kwwette When generating functions provided by %extend, use "(void)" for no-argument functions instead of "()". This prevents warnings when compiling with "gcc -Wstrict-prototypes". 2013-02-17: kwwette [Octave] Minor fix to autodoc generation: get the right type for functions returning structs. 2013-02-15: wsfulton Deprecate typedef names used in %extend that are not the real class/struct name. For example: typedef struct StructBName { int myint; } StructB; %extend StructB { void method() {} } will now trigger a warning: swig_extend.i:19: Warning 326: Deprecated %extend name used - the struct name StructBName should be used instead of the typedef name StructB. This is only partially working anyway (the %extend only worked if placed after the class definition). 2013-02-09: wsfulton [CFFI] Apply patch #22 - Fix missing package before &body 2013-01-29: wsfulton [Java] Ensure 'javapackage' typemap is used as it stopped working from version 2.0.5. 2013-01-28: wsfulton [Python] Apply patch SF #334 - Fix default value conversions "TRUE"->True, "FALSE"->False. 2013-01-28: wsfulton [Java] Apply patch SF #335 - Truly ignore constructors in directors with %ignore. 2013-01-18: Brant Kyser [Java] Patch #15 - Allow the use of the nspace feature without the -package commandline option. This works as long and the new jniclasspackage pragma is used to place the JNI intermediate class into a package and the nspace feature is used to place all exposed types into a package. 2013-01-15: wsfulton Fix Visual Studio examples to work when SWIG is unzipped into a directory containing spaces. 2013-01-15: wsfulton [C#] Fix cstype typemap lookup for member variables so that a fully qualified variable name matches. For example: %typemap(cstype) bool MVar::mvar "MyBool" struct MVar { bool mvar; }; 2013-01-11: Brant Kyser [Java, C#, D] SF Bug #1299 - Fix generated names for when %nspace is used on classes with the same name in two different namespaces. 2013-01-11: Vladimir Kalinin [C#] Add support for csdirectorin 'pre', 'post' and 'terminator' attributes. 2013-01-08: olly [PHP] Fix to work with a ZTS build of PHP (broken in 2.0.7). 2013-01-07: olly Fix bashism in configure, introduced in 2.0.9. 2013-01-06: wsfulton Pull patch #4 from ptomulik to fix SF Bug #1296 - Fix incorrect warning for virtual destructors in templates, such as: Warning 521: Illegal destructor name B< A >::~B(). Ignored. 2013-01-05: wsfulton [Python] Pull patch #3 from ptomulik to fix SF Bug #1295 - standard exceptions as classes using the SWIG_STD_EXCEPTIONS_AS_CLASSES macro. 2013-01-04: wsfulton [Java] Pull patch #2 from BrantKyser to fix SF Bug #1283 - fix smart pointers in conjuction with directors. 2013-01-03: wsfulton [Java] Pull patch #1 from BrantKyser to fix SF Bug #1278 - fix directors and nspace feature when multilevel namespaces are used. Version 2.0.9 (16 December 2012) ================================ 2012-12-16: wsfulton Fix garbage line number / empty file name reporting for some missing '}' or ')' error messages. 2012-12-15: kkaempf [Ruby] Apply patch 3530444, Class#methods and Class#constants returns array of symbols in Ruby 1.9+ 2012-12-14: kkaempf [Ruby] Apply patch 3530439 and finally replace all occurrences of the STR2CSTR() macro with StringValuePtr(). STR2CSTR was deprecated since years and got removed in Ruby 1.9 2012-12-14: kkaempf [Ruby] Applied patches #3530442 and 3530443 to adapt compile and runtime include paths to match Ruby 1.9+ 2012-12-14: wsfulton [CFFI] Fix #3161614 - Some string constants are incorrect 2012-12-13: wsfulton [CFFI] Fix #3529690 - Fix incorrect constant names. 2012-12-12: drjoe [R] add fix to finalizer that was missed earlier 2012-12-11: wsfulton [Python] Apply patch #3590522 - fully qualified package paths for Python 3 even if a module is in the same package. 2012-12-08: wsfulton [Python] Bug #3563647 - PyInt_FromSize_t unavailable prior to Python 2.5 for unsigned int types. 2012-12-08: wsfulton [Perl] Fix bug #3571361 - C++ comment in C wrappers. 2012-12-07: wsfulton [C#] Apply patch #3571029 which adds missing director support for const unsigned long long &. 2012-11-28: kwwette [Octave] Simplified module loading: now just the syntax $ example; is accepted, which loads functions globally but constants and variables relative to the current scope. This make module loading behaviour reliably consistent, and reduces problems when loading modules which depend on other modules which may not have been previously loaded. 2012-11-27: wsfulton [cffi] Fix junk output when wrapping single character literal constants. 2012-11-17: wsfulton [Tcl, Modula3] Add missing support for -outdir. 2012-11-17: wsfulton Fix segfaults when using filename paths greater than 1024 characters in length. 2012-11-14: wsfulton [ccache-swig] Apply patch #3586392 from Frederik Deweerdt to fix some error cases - incorrectly using memory after it has been deleted. 2012-11-09: vzeitlin [Python] Fix overflow when passing values greater than LONG_MAX from Python 3 for parameters with unsigned long C type. 2012-11-09: wsfulton Fix some feature matching issues for implicit destructors and implicit constructors and implicit copy constructors added with %copyctor. Previously a feature for these had to be fully qualified in order to match. Now the following will also match: %feature("xyz") ~XXX(); struct XXX {}; 2012-11-09: wsfulton Further consistency in named output typemap lookups for implicit constructors and destructors and implicit copy constructors added with %copyctor. Previously only the fully qualified name was being used, now the unqualified name will also be used. For example, previously: example.i:38: Searching for a suitable 'out' typemap for: void Space::More::~More Looking for: void Space::More::~More Looking for: void Now the unqualified name is also used: example.i:38: Searching for a suitable 'out' typemap for: void Space::More::~More Looking for: void Space::More::~More Looking for: void ~More Looking for: void 2012-11-02: wsfulton Fix some subtle named output typemap lookup misses, the fully qualified name was not always being used for variables, for example: struct Glob { int MyVar; }; Previously the search rules (as shown by -debug-tmsearch) for the getter wrapper were: example.i:44: Searching for a suitable 'out' typemap for: int MyVar Looking for: int MyVar Looking for: int Now the scope is named correctly: example.i:44: Searching for a suitable 'out' typemap for: int Glob::MyVar Looking for: int Glob::MyVar Looking for: int MyVar Looking for: int 2012-10-26: wsfulton Fix director typemap searching so that a typemap specified with a name will be correctly matched. Previously the name was ignored during the typemap search. Applies to the following list of typemaps: directorout, csdirectorout, cstype, imtype, ctype, ddirectorout, dtype, gotype, jtype, jni, javadirectorout. 2012-10-11: wsfulton Most of the special variables available for use in %exception are now also available for expansion in %extend blocks. These are: $name $symname $overname $decl $fulldecl $parentclassname $parentclasssymname, see docs on "Class extension" in SWIGPlus.html. Patch based on submission from Kris Thielemans. 2012-10-10: wsfulton Additional new special variables in %exception are expanded as follows: $parentclassname - The parent class name (if any) for a method. $parentclasssymname - The target language parent class name (if any) for a method. 2012-10-08: iant [Go] Generating Go code now requires using the -intgosize option to indicate the size of the 'int' type in Go. This is because the size of the type is changing from Go 1.0 to Go 1.1 for x86_64. 2012-09-14: wsfulton Add new warning if the empty template instantiation is used as a base class, for example: template class Base {}; %template() Base; class Derived : public Base {}; gives the following warning instead of silently ignoring the base: cpp_inherit.i:52: Warning 401: Base class 'Base< int >' has no name as it is an empty template instantiated with '%template()'. Ignored. cpp_inherit.i:51: Warning 401: The %template directive must be written before 'Base< int >' is used as a base class and be declared with a name. 2012-09-11: wsfulton [Java] Fix #3535304 - Direct use of a weak global reference in directors sometimes causing seg faults especially on Android. 2012-09-06: wsfulton [Java] Fix (char *STRING, size_t LENGTH) typemaps to accept NULL string. 2012-08-26: drjoe [R] make ExternalReference slot ref to contain reference 2012-08-26: drjoe [R] fix Examples/Makefile to use C in $(CC) rather than $(CXX) Version 2.0.8 (20 August 2012) ============================== 2012-08-15: wsfulton [Perl] Add size_type, value_type, const_reference to the STL containers. 2012-08-15: wsfulton [Python] Add discard and add methods to std::set wrappers so that pyabc.i can be used ensuring MutableSet is a valid abstract base class for std::set. As reported by Alexey Sokolov. Similarly for std::multiset. 2012-08-15: wsfulton [Python] Fix #3541744 - Missing PyInt_FromSize_t calls for Python 3. 2012-08-13: wsfulton [Java] Patch from David Baum to add the assumeoverride feature for Java directors to improve performance when all overridden methods can be assumed to be overridden. 2012-08-05: wsfulton [Python] #3530021 Fix unused variable warning. 2012-08-05: wsfulton [C#] Fix #3536360 - Invalid code sometimes being generated for director methods with many arguments. 2012-08-05: wsfulton [Perl] #3545877 - Don't undefine bool if defined by C99 stdbool.h - problem using Perl 5.16 and later. 2012-08-04: wsfulton Remove incorrect warning (314) about target language keywords which were triggered by using declarations and using directives. For example 'string' is a keyword in C#: namespace std { class string; } using std::string; 2012-07-21: wsfulton Fix display of pointers in various places on 64 bit systems - only 32 bits were being shown. 2012-07-21: wsfulton Fix gdb debugger functions 'swigprint' and 'locswigprint' to display to the gdb output window rather than stdout. This fixes display problems in gdbtui and the ensures the output appears where expected in other gdb based debuggers such as Eclipse CDT. 2012-07-20: kwwette [Octave] segfault-on-exit prevention hack now preserves exit status, and uses C99 _Exit(). 2012-07-02: wsfulton Fix Debian bug http://bugs.debian.org/672035, typemap copy failure - regression introduced in swig-2.0.5: %include using std::pair; %template(StrPair) pair; 2012-07-02: wsfulton Fix using declarations combined with using directives with forward class declarations so that types are correctly found in scope for templates. Example: namespace Outer2 { namespace Space2 { template class Thing2; } } using namespace Outer2; using Space2::Thing2; template class Thing2 {}; // STILL BROKEN void useit2(Thing2 t) {} void useit2a(Outer2::Space2::Thing2 t) {} void useit2b(::Outer2::Space2::Thing2 t) {} void useit2c(Space2::Thing2 t) {} namespace Outer2 { void useit2d(Space2::Thing2 t) {} } %template(Thing2Int) Thing2; 2012-06-30: wsfulton Fix template namespace problems for symbols declared with a forward class declarations, such as: namespace Space1 { namespace Space2 { template struct YYY; } template struct Space2::YYY { T yyy(T h) { return h; } }; void testYYY1(Space1::Space2::YYY yy) {} void testYYY2(Space2::YYY yy) {} void testYYY3(::Space1::Space2::YYY yy) {} } %template(YYYInt) Space1::Space2::YYY; 2012-06-30: wsfulton Fix namespace problems for symbols declared with a forward class declarations, such as: namespace Space1 { namespace Space2 { struct XXX; struct YYY; } struct Space2::YYY {}; struct Space1::Space2::XXX {}; void testXXX2(Space2::XXX xx) {} void testYYY2(Space2::YYY yy) {} } where xx and yy were not recognised as the proxy classes XXX and YYY. 2012-06-30: wsfulton Fix using declarations combined with using directives with forward class declarations so that types are correctly found in scope. namespace Outer2 { namespace Space2 { class Thing2; } } using namespace Outer2; using Space2::Thing2; class Thing2 {}; // None of the methods below correctly used the Thing2 proxy class void useit2(Thing2 t) {} void useit2a(Outer2::Space2::Thing2 t) {} void useit2b(::Outer2::Space2::Thing2 t) {} void useit2c(Space2::Thing2 t) {} namespace Outer2 { void useit2d(Space2::Thing2 t) {} } 2012-06-25: wsfulton Fix using declarations combined with using directives so that types are correctly found in scope. Example: namespace Outer2 { namespace Space2 { class Thing2 {}; } } using namespace Outer2; // using directive using Space2::Thing2; // using declaration void useit2(Thing2 t) {} Similarly for templated classes. 2012-05-29: wsfulton Fix #3529601 - seg fault when a protected method has the "director" feature but the parent class does not. Also fix similar problems with the allprotected feature. 2012-05-28: wsfulton Fix seg fault when attempting to warn about an illegal destructor - #3530055, 3530078 and #3530118. Version 2.0.7 (26 May 2012) =========================== 2012-05-26: wsfulton std::string typemap modifications so they can be used with %apply for other string classes. 2012-05-25: wsfulton [Lua] Fixes for -external-runtime to work again. 2012-05-22: szager [python] Disambiguate SWIG_From_unsigned_SS_int and SWIG_From_unsigned_SS_long. 2012-05-18: olly [PHP] Fix getters for template members. (SF#3428833, SF#3528035) 2012-05-14: wsfulton Fix some language's std::map wrappers to recognise difference_type, size_type, key_type and mapped_type. 2012-05-14: kwwette (signed off by xavier98) [Octave] Prevent Octave from seg-faulting at exit when SWIG modules are loaded, due to bugs in Octave's cleanup code: * Wrapping functions now declared with Octave DEFUN_DLD macro, and loaded through Octave's dynamic module loader * Global variables of swigref type are now assigned a new() copy of the swigref class, to prevent double-free errors * SWIG module at-exit cleanup function now created in Octave through eval(), so not dependent on loaded .oct library * For Octave versions 3.1.* to 3.3.*, register C-level at-exit function which terminates Octave immediately (with correct status code) without performing memory cleanup. This function can be controlled with macros in Lib/octave/octruntime.swg [Octave] New syntax for determing whether SWIG module should be loaded globally or non-globally. To load module "example" globally, type the module name $ example; as before; to load module non-globally, assign it to a variable: $ example = example; or $ ex = example; for a shorter (local) module name. -global/-noglobal command-line options and module command line are deprecated. Added usage info to module, so typing $ help example or incorrect usage should display proper usage, with examples. *** POTENTIAL INCOMPATIBILITY *** 2012-05-12: olly [PHP] Fix memory leak in code generated for a callback. Patch from SF bug #3510806. 2012-05-12: olly [PHP] Avoid using zend_error_noreturn() as it doesn't work with all builds of PHP (SF bug #3166423). Instead we now wrap it in a SWIG_FAIL() function which we annotate as "noreturn" for GCC to avoids warnings. This also reduces the size of the compiled wrapper (e.g. the stripped size is reduced by 6% for Xapian's PHP bindings). 2012-05-11: wsfulton [Java] SF patch #3522855 Fix unintended uninitialised memory access in OUTPUT typemaps. 2012-05-11: wsfulton [Java] SF patch #3522674 Fix possible uninitialised memory access in char **STRING_OUT typemap. 2012-05-11: wsfulton [Java] SF patch #3522611 Fix uninitialised size regression in char **STRING_ARRAY introduced in swig-2.0.6. 2012-05-11: wsfulton SF bug #3525050 - Fix regression introduced in swig-2.0.5 whereby defining one typemap method such as an 'out' typemap may hide another typemap method such as an 'in' typemap - only occurs when the type is a template type where the template parameters are the same via a typedef. 2012-05-10: olly [PHP] Fix the constant typemaps for SWIGTYPE, etc - previously these used the wrong name for renamed constants. Add autodoc_runme.php to the testsuite as a regression test for this. 2012-05-02: ianlancetaylor [Go] Remove compatibility support for gccgo 4.6. Using SWIG with gccgo will now require gccgo 4.7. Using SWIG with the more commonly used gc compiler is unaffected. 2012-05-01: wsfulton Fix generated code for C forward enum declarations in some languages. Version 2.0.6 (30 April 2012) ============================= 2012-04-25: wsfulton [Lua] Fix uninitialised variable in SWIGTYPE **OUTPUT typemaps as reported by Jim Anderson. 2012-04-28: wsfulton [Python] Fix compilation errors when wrapping STL containers on Mac OS X and possibly other systems. 2012-04-28: wsfulton [Java] Patch 3521811 from Leo Davis - char **STRING_ARRAY typemaps fixed to handle null pointers. Version 2.0.5 (19 April 2012) ============================= 2012-04-14: wsfulton [Lua] Apply patch #3517435 from Miles Bader - prefer to use Lua_pushglobaltable 2012-04-14: wsfulton [Ruby] Apply patch #3517769 from Robin Stocker to fix compile error on MacRuby using RSTRING_PTR. 2012-04-13: wsfulton Apply patch #3511009 from Leif Middelschulte for slightly optimised char * variable wrappers. 2012-04-13: wsfulton [Lua] Apply #3219676 from Shane Liesegang which adds: - support for %factory - a __tostring method - a __disown method 2012-04-13: wsfulton [Xml] Apply #3513569 which adds a catchlist to the xml output. 2012-04-05: olly [Lua] Add support for Lua 5.2 (patch SF#3514593 from Miles Bader) 2012-03-26: xavier98 [octave] Apply patch #3425993 from jgillis: add extra logic to the octave_swig_type::dims(void) method: it checks if the user has defined a __dims__ method and uses this in stead of returning (1,1) [octave] Apply patch #3424833 from jgillis: make is_object return true for swig types 2012-03-24: wsfulton [D] Apply #3502431 to fix duplicate symbols in multiple modules. 2012-03-21: wsfulton Fix #3494791 - %$isglobal for %rename matching. 2012-03-20: wsfulton Fix #3487706 and #3391906 - missing stddef.h include for ptrdiff_t when using %import for STL containers and compiling with g++-4.6. An include of stddef.h is now only generated when SWIG generates STL helper templates which require ptrdiff_t. If you were previously relying on "#include " always being generated when using a %include of an STL header, you may now need to add this in manually. 2012-03-16: wsfulton Apply patch #3392264 from Sebastien Bine to parse (unsigned) long long types in enum value assignment. 2012-03-16: wsfulton Apply patch #3505530 from Karl Wette to allow custom allocators in STL string classes for the UTL languages. 2012-03-13: wsfulton Apply patch #3468362 from Karl Wette to fix %include inside %define. 2012-03-13: wsfulton [Python, Ruby, Octave, R] Fix #3475492 - iterating through std::vector wrappers of enumerations. 2012-02-27: xavier98 (patches from Karl Wette) [Octave] Use -globals . to load global variables in module namespace [Octave] Comment declaration of unimplemented function swig_register_director [Octave] Fix OCTAVE_PATH in octave Makefiles [Octave] Add support for std::list - fix li_std_containers_int test [Octave] Fix imports test 2012-02-16: wsfulton [Java] Make generated support functions in arrays_java.i static so that generated code from multiple instances of SWIG can be compiled and linked together - problem reported by Evan Krause. 2012-01-24: wsfulton Fix crash with bad regex - bug #3474250. 2012-01-24: wsfulton [Python] Add Python stepped slicing support to the STL wrappers (std::vector, std::list). Assigning to a slice, reading a slice and deleting a slice with steps now work. For example: %template(vector_i) std::vector vi = vector_i(range(10)) print list(vi) vi[1:4:2] = [111, 333] print list(vi) del vi[3:10:3] print list(vi) print list(vi[::-1]) gives (same behaviour as native Python sequences such as list): [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] [0, 111, 2, 333, 4, 5, 6, 7, 8, 9] [0, 111, 2, 4, 5, 7, 8] [8, 7, 5, 4, 2, 111, 0] 2012-01-23: klickverbot [D] Correctly annotate function pointers with C linkage. [D] Exception and Error have become blessed names; removed d_exception_name test case. 2012-01-20: wsfulton [Python] Fix some indexing bugs in Python STL wrappers when the index is negative, eg: %template(vector_i) std::vector iv=vector_i([0,1,2,3,4,5]) iv[-7:] now returns [0, 1, 2, 3, 4, 5] instead of [5]. vv[7:9] = [22,33] now returns [0, 1, 2, 3, 4, 5, 22, 33] instead of "index out range" error. Also fix some segfaults when replacing ranges, eg when il is a std::list wrapper: il[0:2] = [11] 2012-01-17: wsfulton [Go] Fix forward class declaration within a class when used as a base. 2012-01-07: wsfulton [C#] Add support for %nspace when using directors. 2012-01-06: wsfulton [Java] Patch #3452560 from Brant Kyser - add support for %nspace when using directors. 2011-12-21: wsfulton The 'directorin' typemap now accepts $1, $2 etc expansions instead of having to use workarounds - $1_name, $2_name etc. 2011-12-20: wsfulton [Java] Add (char *STRING, size_t LENGTH) director typemaps. 2011-12-20: wsfulton [C#, Go, Java, D] Add support for the 'directorargout' typemap. 2011-12-20: wsfulton [Ocaml, Octave, PHP, Python, Ruby] Correct special variables in 'directorargout' typemap. This change will break any 'directorargout' typemaps you may have written. Please change: $result to $1 $input to $result Also fix the named 'directorargout' DIRECTOROUT typemaps for these languages which didn't previously compile and add in $1, $2 etc expansion. *** POTENTIAL INCOMPATIBILITY *** 2011-12-10: talby [perl5] SWIG_error() now gets decorated with perl source file/line number. [perl5] error handling now conforms to public XS api (fixes perl v5.14 issue). 2011-12-10: wsfulton [Android/Java] Fix directors to compile on Android. Added documentation and examples for Android. 2011-12-08: vadz Bug fix: Handle methods renamed or ignored in the base class correctly in the derived classes (they could be sometimes mysteriously not renamed or ignored there before). 2011-12-03: klickverbot [D] Fix exception glue code for newer DMD 2 versions. [D] Do not default to 32 bit glue code for DMD anymore. [D] Use stdc.config.c_long/c_ulong to represent C long types. 2011-12-01: szager [python] Fixed bug 3447426: memory leak in vector.__getitem__. 2011-11-30: wsfulton [R] Remove C++ comments from generated C code. 2011-11-27: olly [Python] Fix some warnings when compiling generated wrappers with certain GCC warning options (Debian bug #650246). 2011-11-28: wsfulton Fix #3433541 %typemap(in, numinputs=0) with 10+ arguments. 2011-11-28: olly [Perl] Fix warnings when compiling generated wrappers with certain GCC warning options (Debian bug #436711). 2011-11-28: olly [PHP] Update keyword list to include keywords added in PHP releases up to 5.3. 2011-11-25: wsfulton [C#] Provide an easy way to override the default visibility for the proxy class pointer constructors and getCPtr() method. The visibility is 'internal' by default and if multiple SWIG modules are being used and compiled into different assemblies, then they need to be 'public' in order to use the constructor or getCPtr() method from a different assembly. Use the following macros to change the visibilities in the proxy and type wrapper class: SWIG_CSBODY_PROXY(public, public, SWIGTYPE) SWIG_CSBODY_TYPEWRAPPER(public, public, public, SWIGTYPE) [Java] Provide an easy way to override the default visibility for the proxy class pointer constructors and getCPtr() method. The visibility is 'protected' by default and if multiple SWIG modules are being used and compiled into different packages, then they need to be 'public' in order to use the constructor or getCPtr() method from a different package. Use the following macros to change the visibilities in the proxy and type wrapper class: SWIG_JAVABODY_PROXY(public, public, SWIGTYPE) SWIG_JAVABODY_TYPEWRAPPER(public, public, public, SWIGTYPE) The default for Java has changed from public to protected for the proxy classes. Use the SWIG_JAVABODY_PROXY macro above to restore to the previous visibilities. *** POTENTIAL INCOMPATIBILITY *** 2011-11-22: szager [python] Bug 3440044: #ifdef out SWIG_Python_NonDynamicSetAttr if -builtin isn't being used, to avoid unnecessary binary incompatibilities between python installations. 2011-11-17: wsfulton Bug fix: Remove root directory from directory search list in Windows. 2011-11-13: wsfulton [Ruby] Apply patch #3421876 from Robin Stocker to fix #3416818 - same class name in different namespaces confusion when using multiple modules. 2011-11-11: wsfulton Fix pcre-build.sh to work with non-compressed tarballs - problem reported by Adrian Blakely. 2011-11-03: wsfulton Expand special variables in typemap warnings, eg: %typemap(in, warning="1000:Test warning for 'in' typemap for $1_type $1_name") int "..." 2011-11-01: wsfulton Fix named output typemaps not being used when the symbol uses a qualifier and contains a number, eg: %typemap(out) double ABC::m1 "..." 2011-10-24: talby [perl5] SF bug #3423119 - overload dispatch stack corruption fix. Better, but more research is needed on a stable path for tail calls in XS. Also, fix for large long longs in 32 bit perl. 2011-10-13: xavier98 [octave] Allow Octave modules to be re-loaded after a "clear all". 2011-09-19: wsfulton Fix regression introduced in swig-2.0.1 reported by Teemu Ikonone leading to uncompilable code when using typedef and function pointer references, for example: typedef int FN(const int &a, int b); void *typedef_call1(FN *& precallback, FN * postcallback); 2011-09-14: wsfulton [Lua] Patch #3408012 from Raman Gopalan - add support for embedded Lua (eLua) including options for targeting Lua Tiny RAM (LTR). 2011-09-14: wsfulton [C#] Add boost_intrusive_ptr.i library contribution from patch #3401571. 2011-09-13: wsfulton Add warnings for badly named destructors, eg: struct KStruct { ~NOT_KStruct() {} }; cpp_extend_destructors.i:92: Warning 521: Illegal destructor name ~NOT_KStruct. Ignored. 2011-09-13: wsfulton Fix %extend and destructors for templates. The destructor in %extend was not always wrapped, for example: %extend FooT { ~FooT() { delete $self; } // was not wrapped as expected }; template class FooT {}; %template(FooTi) FooT; 2011-09-13: wsfulton Fix special variables such as "$decl" and "$fulldecl" in destructors to include the ~ character. 2011-09-10: talby [perl5] SF bug #1481958 - Improve range checking for integer types. Enhance li_typemaps_runme.pl 2011-09-08: wsfulton Fix %extend on typedef classes in a namespace using the typedef name, for example: namespace Space { %extend CStruct { ... } typedef struct tagCStruct { ... } CStruct; } 2011-08-31: xavier98 [octave] patches from Karl Wette: improvements to module loading behavior; added example of friend operator to operator example; fixed octave panic/crash in 3.0.5; documentation improvements 2011-08-30: szager [python] Bug 3400486, fix error signalling for built-in constructors. 2011-08-26: wsfulton [Go] Fix file/line number display for "gotype" when using typemap debugging options -tmsearch and -tmused. 2011-08-26: wsfulton [C#, D] Fix %callback which was generating uncompilable code. 2011-08-25: wsfulton Fix constructors in named typedef class declarations as reported by Gregory Bronner: typedef struct A { A(){} // Constructor which was not accepted by SWIG B(){} // NOT a constructor --illegal, but was accepted by SWIG } B; For C code, the fix now results in the use of 'struct A *' instead of just 'B *' in the generated code when wrapping members in A, but ultimately this does not matter, as they are the same thing. 2011-08-23: wsfulton Fix %newobject when used in conjunction with %feature("ref") as reported by Jan Becker. The code from the "ref" feature was not always being generated for the function specified by %newobject. Documentation for "ref" and "unref" moved from Python to the C++ chapter. 2011-08-22: szager [python] Fixed memory leak with --builtin option (bug 3385089). 2011-08-22: wsfulton [Lua] SF patch #3394339 from Torsten Landschoff - new option -nomoduleglobal to disable installing the module table into the global namespace. Require call also returns the module table instead of a string. 2011-08-09: xavier98 Fix bug 3387394; Octave patches for 3.4.0 compatibility, etc. (from Karl Wette) 2011-08-04: wsfulton Add in $symname expansion for director methods. 2011-07-29: olly [PHP] Don't generate "return $r;" in cases where $r hasn't been set. This was basically harmless, except it generated a PHP E_NOTICE if the calling code had enabled them. 2011-07-26: wsfulton Fix scoping of forward class declarations nested within a class (for C++). Previously the symbol was incorrectly put into the outer namespace, eg namespace std { template struct map { class iterator; }; } iterator was scoped as std::iterator, but now it is correctly std::map::iterator; Also fixed is %template and template parameters that are a typedef when the template contains default template parameters, eg: namespace Std { template struct Map { typedef Key key_type; typedef T mapped_type; }; } typedef double DOUBLE; %template(MM) Std::Map; All symbols within Map will be resolved correctly, eg key_type and mapped_type no matter if the wrapped code uses Std::Map or std::Map or Std::Map Also fixes bug #3378145 - regression introduced in 2.0.4 - %template using traits. 2011-07-20 szager [python] Fix closure for tp_call slot. 2011-07-16: wsfulton [python] Fix director typemap using PyObject *. 2011-07-13: szager [python] SF patch #3365908 - Add all template parameters to map support code in std_map.i 2011-07-13: szager [python] Fix for bug 3324753: %rename member variables with -builtin. 2011-07-01: wsfulton Fix some scope and symbol lookup problems when template default parameters are being used with typedef. For example: template struct Foo { typedef XX X; typedef TT T; }; template struct UsesFoo { void x(typename Foo::T, typename Foo::X); }; Also fixes use of std::vector::size_type for Python as reported by Aubrey Barnard. 2011-06-23: olly [PHP] Fix director code to work when PHP is built with ZTS enabled, which is the standard configuration on Microsoft Windows. 2011-06-21: mutandiz [allegrocl] - various small tweaks and bug fixes. - Avoid name conflicts between smart pointer wrappers and the wrappers for the actual class. - Fix default typemaps for C bindings, which were incorrectly attempting to call non-existent destructors on user-defined types. - New feature, feature:aclmixins, for adding superclass to the foreign class wrappers. - Improve longlong typemaps. 2011-06-19: wsfulton Fix incorrect typemaps being used for a symbol within a templated type, eg: A::value_type would incorrectly use a typemap for type A. 2011-06-18: olly [Tcl] Fix variable declarations in middle of blocks which isn't permitted in C90 (issue probably introduced in 2.0.3 by patch #3224663). Reported by Paul Obermeier in SF#3288586. 2011-06-17: wsfulton [Java] SF #3312505 - slightly easier to wrap char[] or char[ANY] with a Java byte[] using arrays_java.i. 2011-06-13: wsfulton [Ruby, Octave] SF #3310528 Autodoc fixes similar to those described below for Python. 2011-06-10: wsfulton [Python] Few subtle bugfixes in autodoc documentation generation, - Unnamed argument names fix for autodoc levels > 0. - Display of template types fixed for autodoc levels > 1. - Fix SF #3310528 - display of typedef structs for autodoc levels > 1. - Add missing type for self for autodoc levels 1 and 3. - autodoc levels 2 and 3 documented. - Minor tweaks to autodoc style to conform with PEP8. 2011-05-30: olly [PHP] Fix handling of directors when -prefix is used. 2011-05-24: olly [PHP] Fix handling of methods of classes with a virtual base class (SF#3124665). Version 2.0.4 (21 May 2011) =========================== 2011-05-19: wsfulton [Guile] Patch #3191625 fixing overloading of integer types. 2011-05-19: wsfulton [Perl] Patch #3260265 fixing overloading of non-primitive types and integers in Perl 5.12 and later. 2011-05-19: wsfulton [Ruby] Fix %import where one of the imported files %include one of the STL include files such as std_vector.i. 2011-05-17: wsfulton [Java] Apply #3289851 from Alan Harder to fix memory leak in directors when checking for pending exceptions. 2011-05-17: wsfulton [Tcl] Apply #3300072 from Christian Delbaere to fix multiple module loading not always sharing variables across modules. 2011-05-16: xavier98 [octave] Fix an incompatibility with never versions of Octave. Case on Octave API >= 40 to handle rename of Octave_map to octave_map. [octave] Add support for y.__rop__(x) operators when x.__op__(y) doesn't exist. [octave] Allow global operators to be defined by SWIG-wrapped functions. [octave] Fix several bugs around module namespaces; add -global, -noglobal, -globals command line options to the module. 2011-05-14: wsfulton %varargs when used with a numeric argument used to create an additional argument which was intended to provide a guaranteed sentinel value. This never worked and now the additional argument is not generated. 2011-05-13: wsfulton [python] Additional fixes for python3.2 support. 2011-05-07: szager [python] Fixed PyGetSetDescr for python3.2. 2011-05-05: wsfulton [Lua, Python, Tcl] C/C++ prototypes shown in error message when calling an overloaded method with incorrect arguments improved to show always show fully qualified name and if a const method. Also fixed other Lua error messages in generated code which weren't consistently using the fully qualified C++ name - requested by Gedalia Pasternak. 2011-04-29: szager Bug 2635919: Convenience method to convert std::map to a python dict. 2011-04-29: szager [Python] Fixed bug 2811549: return non-const iterators from STL methods begin(), end(), rbegin(), rend(). 2011-04-25: szager [Python] Fixed bug 1498929: Access to member fields in map elements 2011-04-23: klickverbot [D] nspace: Correctly generate identifiers for base classes when not in split proxy mode. 2011-04-13: szager Fixed bug 3286333: infinite recursion with mutual 'using namespace' clauses. 2011-04-12: szager Fixed bug 1163440: vararg typemaps. 2011-04-12: szager Fixed bug #3285386: parse error from 'operator T*&()'. Added operator_pointer_ref test case to demonstrate. 2011-04-11: szager [Python] Fixed PyVarObject_HEAD_INIT to eliminate VC++ compiler errors about static initialization of struct members with pointers. 2011-04-11: wsfulton [Tcl] Apply patch #3284326 from Colin McDonald to fix some compiler warnings. 2011-04-11: szager [Python] Fixed PyVarObject_HEAD_INIT to eliminate VC++ compiler errors about static initialization of struct members with pointers. 2011-04-10: klickverbot [D] Fixed wrapping of enums that are type char, for example: enum { X = 'X'; } (this was already in 2.0.3 for C# and Java) 2011-04-10: klickverbot [D] nspace: Fixed referencing types in the root namespace when not in split proxy mode. 2011-04-09: szager [Python] Applied patch #1932484: migrate PyCObject to PyCapsule. 2011-04-09: szager [Python] Added preprocessor guards for python functions PyUnicode_AsWideChar and PySlice_GetIndices, which changed signatures in python3.2. 2011-04-07: wsfulton Fix wrapping of const array typedefs which were generating uncompilable code as reported by Karl Wette. 2011-04-03: szager [Python] Fixed the behavior of %pythonnondynamic to conform to the spec in Lib/pyuserdir.swg. 2011-04-03: szager [Python] Merged in the szager-python-builtin branch, adding the -builtin feature for python. The -builtin option may provide a significant performance gain in python wrappers. For full details and limitations, refer to Doc/Manual/Python.html. A small test suite designed to demonstrate the performance gain is in Examples/python/performance. 2011-04-01: wsfulton Add in missing wrappers for friend functions for some target languages, mostly the non-scripting languages like Java and C#. Version 2.0.3 (29 March 2011) ============================= 2011-03-29: wsfulton [R] Apply patch #3239076 from Marie White fixing strings for R >= 2.7.0 2011-03-29: wsfulton [Tcl] Apply patch #3248280 from Christian Delbaere which adds better error messages when the incorrect number or type of arguments are passed to overloaded methods. 2011-03-29: wsfulton [Tcl] Apply patch #3224663 from Christian Delbaere. 1. Fix when function returns a NULL value, a "NULL" command will be created in the Tcl interpreter and calling this command will cause a segmentation fault. 2. Previous implementation searches for class methods using a linear search causing performance issues in wrappers for classes with many member functions. The patch adds a method hash table to classes and changes method name lookup to use the hash table instead of doing a linear search. 2011-03-26: wsfulton [C#, Java] SF bug #3195112 - fix wrapping of enums that are type char, for example: enum { X = 'X'; } 2011-03-21: vadz Allow setting PCRE_CFLAGS and PCRE_LIBS during configuration to override the values returned by pcre-config, e.g. to allow using a static version of PCRE library. 2011-03-17: wsfulton [UTL] Add missing headers in generated STL wrappers to fix compilation with gcc-4.6. 2011-03-17: wsfulton Fix regression introduced in swig-2.0.2 where filenames with spaces were not found when used with %include and %import. Reported by Shane Liesegang. 2011-03-15: wsfulton [UTL] Fix overloading when using const char[], problem reported by David Maxwell. Similarly for char[ANY] and const char[ANY]. 2011-03-15: wsfulton [C#] Apply patch #3212624 fixing std::map Keys property. 2011-03-14: olly [PHP] Fix handling of overloaded methods/functions where some return void and others don't - whether this worked or not depended on the order they were encountered in (SF#3208299). 2011-03-13: klickverbot [D] Extended support for C++ namespaces (nspace feature). 2011-03-12: olly [PHP] Fix sharing of type information between multiple SWIG-wrapped modules (SF#3202463). 2011-03-09: wsfulton [Python] Fix SF #3194294 - corner case bug when 'NULL' is used as the default value for a primitive type parameter in a method declaration. 2011-03-07: olly [PHP] Don't use zend_error_noreturn() for cases where the function returns void - now this issue can only matter if you have a function or method which is directed and returns non-void. 2011-03-06: olly [PHP] Add casts to the typemaps for long long and unsigned long long to avoid issues when they are used with shorter types via %apply. 2011-03-02: wsfulton Templated smart pointers overloaded with both const and non const operator-> generated uncompilable code when the pointee was a class with either public member variables or static methods. Regression in 2.0.x reported as working in 1.3.40 by xantares on swig-user mailing list. Version 2.0.2 (20 February 2011) ================================ 2011-02-19: wsfulton [PHP] Add missing INPUT, OUTPUT and INOUT typemaps in the typemaps.i library for primitive reference types as well as signed char * and bool *. 2011-02-19: olly [PHP] Address bug in PHP on some platforms/architectures which results in zend_error_noreturn() not being available using SWIG_ZEND_ERROR_NORETURN which defaults to zend_error_noreturn but can be overridden when building the module by passing -DSWIG_ZEND_ERROR_NORETURN=zend_error to the compiler. This may result in compiler warnings, but should at least allow a module to be built on those platforms/architectures (SF#3166423). 2011-02-18: wsfulton Fix #3184549 - vararg functions and function overloading when using the -fastdispatch option. 2011-02-18: olly [PHP] An overloaded method which can return an object or a primitive type no longer causes SWIG to segfault. Reported by Paul Colby in SF#3168531. 2011-02-18: olly [PHP] Fix invalid erase during iteration of std::map in generated director code. Reported by Cory Bennett in SF#3175820. 2011-02-17: wsfulton Preprocessing now warns if extra tokens appear after #else and #end. 2011-02-16: wsfulton Fix #1653092 Preprocessor does not error out when #elif is missing an expression. This and other cases of missing preprocessor expressions now result in an error. 2011-02-14: wsfulton [Ocaml] Apply patch #3151788 from Joel Reymont. Brings Ocaml support up to date (ver 3.11 and 3.12), including std::string. 2011-02-13: wsfulton [Ruby] Apply patch #3176274 from James Masters - typecheck typemap for time_t. 2011-02-13: wsfulton Apply patch #3171793 from szager - protected director methods failing when -fvirtual is used. 2011-02-13: wsfulton Fix #1927852 - #include directives don't preprocess the file passed to it. The fix is for #include with -importall or -includeall, %include and %import, for example: #define FILENAME "abc.h" %include FILENAME 2011-02-12: wsfulton Fix #1940536, overactive preprocessor which was expanding defined(...) outside of #if and #elif preprocessor directives. 2011-02-05: wsfulton [MzScheme] SF #2942899 Add user supplied documentation to help getting started with MzScheme. Update chapter name to MzScheme/Racket accounting for the rename of MzScheme to Racket. 2011-02-05: wsfulton [C#] SF #3085906 - Possible fix running test-suite on Mac OS X. 2011-02-05: wsfulton SF #3173367 Better information during configure about Boost prerequisite for running the test-suite. 2011-02-05: wsfulton SF #3127633 Fix infinite loop in recursive typedef resolution. 2011-02-04: wsfulton [R] SF #3168676 Fix %rename not working for member variables and methods. 2011-02-04: wsfulton [clisp] SF #3148200 Fix segfault parsing nested unions. 2011-02-01: wsfulton [C#] Directors - a call to a method being defined in the base class, not overridden in a subclass, but again overridden in a class derived from the first subclass was not being dispatched correctly to the most derived class. See director_alternating.i for an example. 2011-02-01: wsfulton [C#, Java] Any 'using' statements in the protected section of a class were previously ignored with director protected (dirprot) mode. 2011-01-30: wsfulton Fix overloading with const pointer reference (SWIGTYPE *const&) parameters for a number of scripting languages. 2011-01-17: wsfulton New warning for smart pointers if only some of the classes in the inheritance chain are marked as smart pointer, eg, %shared_ptr should be used for all classes in an inheritance hierarchy, so this new warning highlights code where this is not the case. example.i:12: Warning 520: Base class 'A' of 'B' is not similarly marked as a smart pointer. example.i:16: Warning 520: Derived class 'C' of 'B' is not similarly marked as a smart pointer. 2011-01-14: wsfulton Added some missing multi-argument typemaps: (char *STRING, size_t LENGTH) and (char *STRING, int LENGTH). Documentation for this updated. Java patch from Volker Grabsch. 2011-01-11: iant Require Go version 7077 or later. 2010-12-30: klickverbot [C#, D, Java] Check for collision of parameter names with target language keywords when generating the director glue code. The situation in which the generated could would previously be invalid is illustrated in the new 'director_keywords' test case. 2010-12-23: wsfulton [C#] Fix $csinput special variable not being expanded for csvarin typemaps when used for global variables. Reported by Vadim Zeitlin. 2010-12-14: wsfulton Fix $basemangle expansion in array typemaps. For example if type is int *[3], $basemangle expands to _p_int. 2010-12-07: iant Check that we are using a sufficiently new version of the 6g or 8g Go compiler during configure time. If not, disable Go. Minimum version is now 6707. *** POTENTIAL INCOMPATIBILITY *** 2010-12-06: wsfulton Fix #3127394 - use of network paths on Windows/MSys. 2010-11-18: klickverbot [D] Added the D language module. 2010-11-12: vadz Fix handling of multiple regex-using %renames attached to the same declaration. For example, now %rename("%(regex:/^Set(.*)/put\\1/)s") ""; %rename("%(regex:/^Get(.*)/get\\1/)s") ""; works as expected whereas before only the last anonymous rename was taken into account. 2010-10-17: drjoe [R] Fix failure in overloaded functions which was breaking QuantLib-SWIG 2010-10-14: olly [PHP] Allow compilation on non-conforming Microsoft C++ compilers which don't accept: return function_returning_void(); Reported by Frank Vanden Berghen on the SWIG mailing list. 2010-10-12: wsfulton Fix unary scope operator (::) (global scope) regression introduced in 2.0.0, reported by Ben Walker. The mangled symbol names were incorrect, sometimes resulting in types being incorrectly treated as opaque types. Also fixes #2958781 and some other type problems due to better typedef resolution, eg std::vector::value_type didn't resolve to T * when it should have. The mangled type was incorrectly SWIGTYPE_std__vectorT_Test_p_std__allocatorT_Test_p_t_t__value_type and now it is correctly SWIGTYPE_p_Test. Version 2.0.1 (4 October 2010) ============================== 2010-10-03: wsfulton Apply patch #3066958 from Mikael Johansson to fix default smart pointer handling when the smart pointer contains both a const and non-const operator->. 2010-10-01: wsfulton Add -pcreversion option to display PCRE version information. 2010-10-01: olly [Ruby] Avoid segfault when a method node has no parentNode (SF#3034054). 2010-10-01: olly [Python] Allow reinitialisation to work with an embedded Python interpreter (patch from Jim Carroll in SF#3075178). 2010-09-28: wsfulton [C#] Apply patch from Tomas Dirvanauskas for std::map wrappers to avoid throwing exceptions with normal usage of iterators. 2010-09-27: olly [Python] Improve error message given when a parameter of the wrong type is passed to an overloaded method (SF#3027355). 2010-09-25: wsfulton Apply SF patch #3075150 - Java directors using static variables in named namespace. 2010-09-24: wsfulton More file and line error/warning reporting fixes where SWIG macros are used within {} braces (where the preprocessor expands macros), for example macros within %inline {...} and %fragment(...) {...} and nested structs. 2010-09-18: wsfulton More file and line error/warning reporting fixes for various inherited class problems. 2010-09-15: wsfulton A much improved debugging of SWIG source experience is now available and documented in the "Debugging SWIG" section in the Doc/Devel/internals.html file, including a swig.dbg support file for the gdb debugger. 2010-09-11: wsfulton Fix incorrect line number reporting in errors/warnings when a macro definition ends with '/' and it is not the end of a C comment. 2010-09-11: wsfulton Fix incorrect line number reporting in errors/warnings after parsing macro invocations with parameters given over more than one line. 2010-09-10: wsfulton Remove extraneous extra line in preprocessed output after including files which would sometimes lead to error/warning messages two lines after the end of the file. 2010-09-10: wsfulton Fix #2149523 - Incorrect line number reporting in errors after parsing macros containing C++ comments. 2010-09-08: olly [PHP] Fix handling of OUTPUT typemaps (Patch from Ryan in SF#3058394). 2010-09-03: wsfulton Fix erroneous line numbers in error messages for macro expansions, for example, the error message now points to instantiation of the macro, ie the last line here: #define MACRO2(a, b) #define MACRO1(NAME) MACRO2(NAME,2,3) MACRO1(abc) 2010-09-02: wsfulton Fix line numbers in error and warning messages for preprocessor messages within %inline, for example: %inline %{ #define FOOBAR 1 #define FOOBAR "hi" %} 2010-09-02: wsfulton Fix line numbers in error and warning messages which were cumulatively one less than they should have been after parsing each %include/%import - bug introduced in swig-1.3.32. Also fix line numbers in error and warning messages when new line characters appear between the %include / %import statement and the filename. 2010-08-30: wsfulton Fix line number and file name reporting for some macro preprocessor warnings. The line number of the macro argument has been corrected and the line number of the start of the macro instead of one past the end of the macro is used. Some examples: file.h:11: Error: Illegal macro argument name '..' file.h:19: Error: Macro 'DUPLICATE' redefined, file.h:15: Error: previous definition of 'DUPLICATE'. file.h:25: Error: Variable-length macro argument must be last parameter file.h:32: Error: Illegal character in macro argument name file.i:37: Error: Macro 'SIT' expects 2 arguments 2010-08-26: wsfulton Fix __LINE__ and __FILE__ expansion reported by Camille Gillot. Mostly this did not work at all. Also fixes SF #2822822. 2010-08-17: wsfulton [Perl] Fix corner case marshalling of doubles - errno was not being correctly set before calling strtod - patch from Justin Vallon - SF Bug #3038936. 2010-08-17: wsfulton Fix make distclean when some of the more obscure languages are detected by configure - fixes from Torsten Landschoff. 2010-07-28: wsfulton Restore configuring out of source for the test-suite since it broke in 1.3.37. As previously, if running 'make check-test-suite' out of source, it needs to be done by invoking configure with a relative path. Invoking configure with an absolute path will not work. Running the full 'make check' still needs to be done in the source tree. 2010-07-16: wsfulton Fix wrapping of function pointers and member function pointers when the function returns by reference. 2010-07-13: vadz Removed support for the old experimental "rxspencer" encoder and "[not]rxsmatch" in %rename (see the 01/16/2006 entry). The new and officially supported "regex" encoder and "[not]regexmatch" checks should be used instead (see the two previous entries). Please replace "%(rxspencer:[pat][subst])s" with "%(regex:/pat/subst/)s" when upgrading. Notice that you will also need to replace the back- references of form "@1" with the more standard "\\1" and may need to adjust your regular expressions syntax as the new regex encoder uses Perl-compatible syntax and not (extended) POSIX syntax as the old one. *** POTENTIAL INCOMPATIBILITY *** 2010-07-13: vadz Add "regexmatch", "regextarget" and "notregexmatch" which can be used to apply %rename directives to the declarations matching the specified regular expression only. The first two can be used interchangeably, both of the %renames below do the same thing: %rename("$ignore", regexmatch$name="Old$") ""; %rename("$ignore", regextarget=1) "Old$"; (namely ignore the declarations having "Old" suffix). "notregexmatch" restricts the match to only the declarations which do not match the regular expression, e.g. here is how to rename to lower case versions all declarations except those consisting from capital letters only: %rename("$(lowercase)s", notregexmatch$name="^[A-Z]+$") ""; 2010-07-13: vadz Add the new "regex" encoder that can be used in %rename, e.g. %rename("regex:/(\\w+)_(.*)/\\2/") ""; to remove any alphabetical prefix from all identifiers. The syntax of the regular expressions is Perl-like and PCRE library (http://www.pcre.org/) is used to implement this feature but notice that backslashes need to be escaped as usual inside C strings. Original patch from Torsten Landschoff. 2010-07-08: wsfulton Fix #3024875 - shared_ptr of classes with non-public destructors. This also fixes the "unref" feature when used on classes with non-public destructors. 2010-06-17: ianlancetaylor [Go] Add the Go language module. 2010-06-10: wsfulton [Lua] Fix SWIG_lua_isnilstring multiply defined when using multiple modules and wrapping strings. Patch from 'Number Cruncher'. 2010-06-10: olly [PHP] Fix directors to correctly call a method with has a different name in PHP to C++ (we were always using the C++ name in this case). 2010-06-03: wsfulton Fix uncompilable code when %rename results in two enum items with the same name. Reported by Vadim Zeitlin. Version 2.0.0 (2 June 2010) =========================== 2010-06-02: wsfulton [C#] Fix SWIG_STD_VECTOR_ENHANCED macro used in std::vector to work with types containing commas, for example: SWIG_STD_VECTOR_ENHANCED(std::pair< double, std::string >) 2010-06-01: wsfulton Add in std_shared_ptr.i for wrapping std::shared_ptr. Requires the %shared_ptr macro like in the boost_shared_ptr.i library. std::tr1::shared_ptr can also be wrapped if the following macro is defined: #define SWIG_SHARED_PTR_SUBNAMESPACE tr1 %include shared_ptr is also documented in Library.html now. 2010-05-27: wsfulton Add the ability for $typemap special variable macros to call other $typemap special variable macros, for example: %typemap(cstype) CC "CC" %typemap(cstype) BB "$typemap(cstype, CC)" %typemap(cstype) AA "$typemap(cstype, BB)" void hah(AA aa); This also fixes C# std::vector containers of shared_ptr and %shared_ptr. Also added diagnostics for $typemap with -debug-tmsearch, for example, the above displays additional diagnostic lines starting "Containing: ": example.i:34: Searching for a suitable 'cstype' typemap for: AA aa Looking for: AA aa Looking for: AA Using: %typemap(cstype) AA Containing: $typemap(cstype, BB) example.i:31: Searching for a suitable 'cstype' typemap for: BB Looking for: BB Using: %typemap(cstype) BB Containing: $typemap(cstype, CC) example.i:29: Searching for a suitable 'cstype' typemap for: CC Looking for: CC Using: %typemap(cstype) CC 2010-05-26: olly Fix %attribute2ref not to produce a syntax error if the last argument (AccessorMethod) is omitted. Patch from David Piepgras in SF#2235756. 2010-05-26: olly [PHP] When using %throws or %catches, SWIG-generated PHP5 wrappers now throw PHP Exception objects instead of giving a PHP error of type E_ERROR. This change shouldn't cause incompatibility issues, since you can't set an error handler for E_ERROR, so previously PHP would just exit which also happens for unhandled exceptions. The benefit is you can now catch them if you want to. Fixes SF#2545578 and SF#2955522. 2010-05-25: olly [PHP] Add missing directorin typemap for const std::string &. Fixes SF#3006404 reported by t-Legiaw. 2010-05-23: wsfulton [C#] Fix #2957375 - SWIGStringHelper and SWIGExceptionHelper not always being initialized before use in .NET 4 as the classes were not marked beforefieldinit. A static constructor has been added to the intermediary class like this: %pragma(csharp) imclasscode=%{ static $imclassname() { } %} If you had added your own custom static constructor to the intermediary class in the same way as above, you will have to modify your approach to use static variable initialization or define SWIG_CSHARP_NO_IMCLASS_STATIC_CONSTRUCTOR - See csharphead.swg. *** POTENTIAL INCOMPATIBILITY *** 2010-05-23: wsfulton Fix #2408232. Improve shared_ptr and intrusive_ptr wrappers for classes in an inheritance hierarchy. No special treatment is needed for derived classes. The proxy class also no longer needs to be specified, it is automatically deduced. The following macros are deprecated: SWIG_SHARED_PTR(PROXYCLASS, TYPE) SWIG_SHARED_PTR_DERIVED(PROXYCLASS, BASECLASSTYPE, TYPE) and have been replaced by %shared_ptr(TYPE) Similarly for intrusive_ptr wrappers, the following macro is deprecated: SWIG_INTRUSIVE_PTR(PROXYCLASS, TYPE) SWIG_INTRUSIVE_PTR_DERIVED(PROXYCLASS, BASECLASSTYPE, TYPE) and have been replaced by %intrusive_ptr(TYPE) 2010-05-21: olly [PHP] Stop generating a bogus line of code in certain constructors. This was mostly harmless, but caused a PHP notice to be issued, if enabled (SF#2985684). 2010-05-18: wsfulton [Java] Fix member pointers on 64 bit platforms. 2010-05-14: wsfulton Fix wrapping of C++ enum boolean values reported by Torsten Landschoff: typedef enum { PLAY = true, STOP = false } play_state; 2010-05-14: olly [PHP] Fix wrapping of global variables which was producing uncompilable code in some cases. 2010-05-12: drjoe [R] Add two more changes from Wil Nolan. Get garbage collection to work. Implement newfree 2010-05-09: drjoe Fix bug reported by Wil Nolan change creation of string so that R 2.7.0+ can use char hashes 2010-05-07: wsfulton Apply patch #2955146 from Sergey Satskiy to fix expressions containing divide by operator in constructor initialization lists. 2010-05-05: wsfulton [R] Memory leak fix handling const std::string & inputs, reported by Will Nolan. 2010-05-01: wsfulton Typemap matching enhancement for non-default typemaps. Previously all qualifiers were stripped in one step, now they are stripped one at a time starting with the left most qualifier. For example, int const*const is first stripped to int *const then int *. *** POTENTIAL INCOMPATIBILITY *** 2010-04-25: bhy [Python] Fix #2985655 - broken constructor renaming. 2010-04-14: wsfulton Typemap fragments are now official and documented in Typemaps.html. 2010-04-09: wsfulton [Ruby] Fix #2048064 and #2408020. Apply Ubuntu patch to fix Ruby and std::vector wrappers with -minherit. https://bugs.launchpad.net/ubuntu/+source/swig1.3/+bug/522874 2010-04-09: wsfulton [Mzscheme] Apply Ubuntu patch to fix std::map wrappers: https://bugs.launchpad.net/ubuntu/+source/swig1.3/+bug/203876 2010-04-09: wsfulton [Python] Apply patch #2952374 - fix directors and the -nortti option. 2010-04-09: wsfulton [Lua] Fix #2887254 and #2946032 - SWIG_Lua_typename using wrong stack index. 2010-04-03: wsfulton [Python] Fix exceptions being thrown with the -threads option based on patch from Arto Vuori. Fixes bug #2818499. 2010-04-03: wsfulton Fix Makefile targets: distclean and maintainer-clean 2010-04-02: wsfulton [Lua] Fix char pointers, wchar_t pointers and char arrays so that nil can be passed as a valid value. Bug reported by Gedalia Pasternak. 2010-04-01: wsfulton Numerous subtle typemap matching rule fixes when using the default type. The typemap matching rules are to take a type and find the best default typemap (SWIGTYPE, SWIGTYPE* etc), then look for the next best match by reducing the chosen default type. The type deduction now follows C++ class template partial specialization matching rules. Below are the set of changes made showing the default type deduction along with the old reduced type and the new version of the reduced type: SWIGTYPE const &[ANY] new: SWIGTYPE const &[] old: SWIGTYPE (&)[ANY] SWIGTYPE *const [ANY] new: SWIGTYPE const [ANY] old: SWIGTYPE *[ANY] SWIGTYPE const *const [ANY] new: SWIGTYPE *const [ANY] old: SWIGTYPE const *[ANY] SWIGTYPE const *const & new: SWIGTYPE *const & old: SWIGTYPE const *& SWIGTYPE *const * new: SWIGTYPE const * old: SWIGTYPE ** SWIGTYPE *const & new: SWIGTYPE const & old: SWIGTYPE *& Additionally, a const SWIGTYPE lookup is used now for any constant type. Some examples, where T is some reduced type, eg int, struct Foo: T const new: SWIGTYPE const old: SWIGTYPE T *const new: SWIGTYPE *const old: SWIGTYPE * T const[] new: SWIGTYPE const[] old: SWIGTYPE[] enum T const new: enum SWIGTYPE const old: enum SWIGTYPE T (*const )[] new: SWIGTYPE (*const )[] old: SWIGTYPE (*)[] Reminder: the typemap matching rules can now be seen for any types being wrapped by using either the -debug-tmsearch or -debug-tmused options. In practice this leads to some subtle matching rule changes and the majority of users won't notice any changes, except in the prime area of motivation for this change: Improve STL containers of const pointers and passing const pointers by reference. This is fixed because many of the STL containers use a type 'T const&' as parameters and when T is a const pointer, for example, 'K const*', then the full type is 'K const*const&'. This means that the 'SWIGTYPE *const&' typemaps now match when T is either a non-const or const pointer. Furthermore, some target languages incorrectly had 'SWIGTYPE *&' typemaps when these should have been 'SWIGTYPE *const&'. These have been corrected (Java, C#, Lua, PHP). *** POTENTIAL INCOMPATIBILITY *** 2010-03-13: wsfulton [Java] Some very old deprecated pragma warnings are now errors. 2010-03-13: wsfulton Improve handling of file names and directories containing double/multiple path separators. 2010-03-10: mutandiz (Mikel Bancroft) [allegrocl] Use fully qualified symbol name of cl::identity in emit_defun(). 2010-03-06: wsfulton [Java] The intermediary JNI class modifiers are now public by default meaning these intermediary low level functions are now accessible by default from outside any package used. The proxy class pointer constructor and getCPtr() methods are also now public. These are needed in order for the nspace option to work without any other mods. The previous default of protected access can be restored using: SWIG_JAVABODY_METHODS(protected, protected, SWIGTYPE) %pragma(java) jniclassclassmodifiers = "class" 2010-03-06: wsfulton [C#] Added the nspace feature for C#. Documentation for the nspace feature is now available. 2010-03-04: wsfulton Added the nspace feature. This adds some improved namespace support. Currently only Java is supported for target languages, where C++ namespaces are automatically translated into Java packages. The feature only applies to classes,struct,unions and enums declared within a namespace. Methods and variables declared in namespaces still effectively have their namespaces flattened. Example usage: %feature(nspace) Outer::Inner1::Color; %feature(nspace) Outer::Inner2::Color; namespace Outer { namespace Inner1 { struct Color { ... }; } namespace Inner2 { struct Color { ... }; } } For Java, the -package option is also required when using the nspace feature. Say we use -package com.myco, the two classes can then be accessed as follows from Java: com.myco.Outer.Inner1.Color and com.myco.Outer.Inner2.Color. 2010-02-27: wsfulton [Python] Remove -dirvtable from the optimizations included by -O as it this option currently leads to memory leaks as reported by Johan Blake. 2010-02-27: wsfulton License code changes: SWIG Source is GPL-v3 and library code license is now clearer and is provided under a very permissive license. See http://www.swig.org/legal.html. 2010-02-13: wsfulton [Ruby] A few fixes for compiling under ruby-1.9.x including patch from 'Nibble'. 2010-02-13: wsfulton [Ruby] Apply patch from Patrick Bennett to fix RARRAY_LEN and RARRAY_PTR usage for Ruby 1.9.x used in various STL wrappers. 2010-02-13: wsfulton [C#, Java] Fix incorrect multiply defined symbol name error when an enum item and class name have the same name, as reported by Nathan Krieger. Example: class Vector {}; namespace Text { enum Preference { Vector }; } This also fixes other incorrect corner case target language symbol name clashes. 2010-02-11: wsfulton Add the -debug-lsymbols option for displaying the target language layer symbols. 2010-02-09: wsfulton Fix -MM and -MMD options on Windows. They were not omitting files in the SWIG library as they should be. 2010-02-08: wsfulton Fix #1807329 - When Makefile dependencies are being generated using the -M family of options on Windows, the file paths have been corrected to use single backslashes rather than double backslashes as path separators. 2010-02-06: wsfulton Fix #2918902 - language specific files not being generated in correct directory on Windows when using forward slashes for -o, for example: swig -python -c++ -o subdirectory/theinterface_wrap.cpp subdirectory/theinterface.i 2010-02-05: wsfulton Fix #2894405 - assertion when using -xmlout. 2010-01-28: wsfulton Fix typemap matching bug when a templated type has a typemap both specialized and not specialized. For example: template struct XX { ... }; %typemap(in) const XX & "..." %typemap(in) const XX< int > & "..." resulted in the 2nd typemap being applied for all T in XX< T >. 2010-01-22: wsfulton Fix #2933129 - typemaps not being found when the unary scope operator (::) is used to denote global scope, the typemap is now used in situations like this: struct X {}; %typemap(in) const X & "..." void m(const ::X &); and this: struct X {}; %typemap(in) const ::X & "..." void m(const X &); 2010-01-20: wsfulton Fix some unary scope operator (::) denoting global scope problems in the types generated into the C++ layer. Previously the unary scope operator was dropped in the generated code if the type had any sort of qualifier, for example when using pointers, references, like ::foo*, ::foo&, bar< ::foo* >. 2010-01-13: olly [PHP] Add datetime to the list of PHP predefined classes (patch from David Fletcher in SF#2931042). 2010-01-11: wsfulton Slight change to warning, error and diagnostic reporting. The warning number is no longer shown within brackets. This is to help default parsing of warning messages by other tools, vim on Unix in particular. Example original display using -Fstandard: example.i:20: Warning(401): Nothing known about base class 'B'. Ignored. New display: example.i:20: Warning 401: Nothing known about base class 'B'. Ignored. Also subtle fix to -Fmicrosoft format adding in missing space. Example original display: example.i(20): Warning(401): Nothing known about base class 'Base'. Ignored. New display: example.i(20) : Warning 401: Nothing known about base class 'Base'. Ignored. 2010-01-10: wsfulton Fix a few inconsistencies in reporting of file/line numberings including modifying the overload warnings 509, 512, 516, 474, 475 to now be two line warnings. 2010-01-10: wsfulton Modify -debug-tags output to use standard file name/line reporting so that editors can easily navigate to the appropriate lines. Was typically: . top . include . include (/usr/share/swig/temp/trunk/Lib/swig.swg:312) . top . include . include . include (/usr/share/swig/temp/trunk/Lib/swigwarnings.swg:39) now: /usr/share/swig/temp/trunk/Lib/swig.swg:312: . top . include . include /usr/share/swig/temp/trunk/Lib/swigwarnings.swg:39: . top . include . include . include 2010-01-03: wsfulton Fix missing file/line numbers for typemap warnings and in output from the -debug-tmsearch/-debug-tmused options. 2010-01-03: wsfulton Add typemaps used debugging option (-debug-tmused). When used each line displays the typemap used for each type for which code is being generated including the file and line number related to the type. This is effectively a condensed form of the -debug-tmsearch option. Documented in Typemaps.html. 2009-12-23: wsfulton Fix for %javaexception and directors so that all the appropriate throws clauses are generated. Problem reported by Peter Greenwood. 2009-12-20: wsfulton Add -debug-tmsearch option for debugging the typemap pattern matching rules. Documented in Typemaps.html. 2009-12-12: wsfulton [Octave] Remove the -api option and use the new OCTAVE_API_VERSION_NUMBER macro provided in the octave headers for determining the api version instead. 2009-12-04: olly [Ruby] Improve support for Ruby 1.9 under GCC. Addresses part of SF#2859614. 2009-12-04: olly Fix handling of modulo operator (%) in constant expressions (SF#2818562). 2009-12-04: olly [PHP] "empty" is a reserved word in PHP, so rename empty() method on STL classes to "is_empty()" (previously this was automatically renamed to "c_empty()"). *** POTENTIAL INCOMPATIBILITY *** 2009-12-03: olly [PHP] Add typemaps for long long and unsigned long long, and for pointer to method. 2009-12-02: olly [PHP] Fix warning and rename of reserved class name to be case insensitive. 2009-12-01: wsfulton Revert support for %extend and memberin typemaps added in swig-1.3.39. The memberin typemaps are ignored again for member variables within a %extend block. Documentation inconsistency reported by Torsten Landschoff. 2009-11-29: wsfulton [Java, C#] Fix generated quoting when using %javaconst(1)/%csconst(1) for static const char member variables. %javaconst(1) A; %csconst(1) A; struct X { static const char A = 'A'; }; 2009-11-26: wsfulton [Java, C#] Fix %javaconst(1)/%csconst(1) for static const member variables to use the actual constant value if it is specified, rather than the C++ code to access the member. %javaconst(1) EN; %csconst(1) EN; struct X { static const int EN = 2; }; 2009-11-23: wsfulton C++ nested typedef classes can now be handled too, for example: struct Outer { typedef Foo { } FooTypedef1, FooTypedef2; }; 2009-11-18: wsfulton The wrappers for C nested structs are now generated in the same order as declared in the parsed code. 2009-11-18: wsfulton Fix #491476 - multiple declarations of nested structs, for example: struct Outer { struct { int val; } inner1, inner2, *inner3, inner4[1]; } outer; 2009-11-17: wsfulton Fix parsing of enum declaration and initialization, for example: enum ABC { a, b, c } A = a, *pC = &C, array[3] = {a, b, c}; 2009-11-17: wsfulton Fix parsing of struct declaration and initialization, for example: struct S { int x; } instance = { 10 }; 2009-11-15: wsfulton Fix #1960977 - Syntax error parsing derived nested class declaration and member variable instance. 2009-11-14: wsfulton Fix #2310483 - function pointer typedef within extern "C" block. 2009-11-13: wsfulton Fix usage of nested template classes within templated classes so that compilable code is generated. 2009-11-13: olly [php] Fix place where class prefix (as specified with -prefix) wasn't being used. Patch from gverbruggen in SF#2892647. 2009-11-12: wsfulton Fix usage of nested template classes so that compilable code is generated - the nested template class is now treated like a normal nested classes, that is, as an opaque type unless the nestedworkaround feature is used. 2009-11-12: wsfulton Replace SWIGWARN_PARSE_NESTED_CLASS with SWIGWARN_PARSE_NAMED_NESTED_CLASS and SWIGWARN_PARSE_UNNAMED_NESTED_CLASS for named and unnamed nested classes respectively. Named nested class ignored warnings can now be suppressed by name using %warnfilter, eg: %warnfilter(SWIGWARN_PARSE_NAMED_NESTED_CLASS) Outer::Inner; but clearly unnamed nested classes cannot and the global suppression is still required, eg: #pragma SWIG nowarn=SWIGWARN_PARSE_UNNAMED_NESTED_CLASS 2009-11-11: wsfulton Added the nestedworkaround feature as a way to use the full functionality of a nested class (C++ mode only). It removes the nested class from SWIG's type information so it is as if SWIG had never parsed the nested class. The documented nested class workarounds using a global fake class stopped working when SWIG treated the nested class as an opaque pointer, and this feature reverts this behaviour. The documentation has been updated with details of how to use and implement it, see the "Nested classes" section in SWIGPlus.html. 2009-11-11: wsfulton There were a number of C++ cases where nested classes/structs/unions were being handled as if C code was being parsed which would oftentimes lead to uncompilable code as an attempt was made to wrap the nested structs like it is documented for C code. Now all nested structs/classes/unions are ignored in C++ mode, as was always documented. However, there is an improvement as usage of nested structs/classes/unions is now always treated as an opaque type by default, resulting in generated code that should always compile. *** POTENTIAL INCOMPATIBILITY *** 2009-11-09: drjoe Fix R for -fcompact and add std_map.i 2009-11-08: wsfulton Fix inconsistency for nested structs/unions/classes. Uncompilable code was being generated when inner struct and union declarations were used as types within the inner struct. The inner struct/union is now treated as a forward declaration making the behaviour the same as an inner class. (C++ code), eg: struct Outer { struct InnerStruct { int x; }; InnerStruct* getInnerStruct(); }; 2009-11-08: wsfulton Ignored nested class/struct warnings now display the name of the ignored class/struct. 2009-11-07: wsfulton Bug #1514681 - Fix nested template classes within a namespace generated uncompilable code and introduced strange side effects to other wrapper code especially code after the nested template class. Note that nested template classes are still ignored. 2009-11-07: wsfulton Add new debug options: -debug-symtabs - Display symbol tables information -debug-symbols - Display target language symbols in the symbol tables -debug-csymbols - Display C symbols in the symbol tables 2009-11-03: wsfulton Fix some usage of unary scope operator (::) denoting global scope, for example: namespace AA { /* ... */ } using namespace ::AA; and bug #1816802 - SwigValueWrapper should be used: struct CC { CC(int); // no default constructor }; ::CC x(); and in template parameter specializations: struct S {}; template struct X { void a() {} }; template <> struct X { void b() {} }; %template(MyTConcrete) X< ::S >; plus probably some other corner case usage of ::. 2009-11-02: olly [Python] Fix potential memory leak in initialisation code for the generated module. 2009-10-23: wsfulton Fix seg fault when using a named nested template instantiation using %template(name) within a class. A warning that these are not supported is now issued plus processing continues as if no name was given. 2009-10-20: wsfulton [Python] Fix std::vector. This would previously compile, but not run correctly. 2009-10-20: wsfulton Fixed previously fairly poor template partial specialization and explicit specialization support. Numerous bugs in this area have been fixed including: - Template argument deduction implemented for template type arguments, eg this now works: template class X {}; template class X {}; %template(X1) X; // Chooses T * specialization and more complex cases with multiple parameters and a mix of template argument deduction and explicitly specialised parameters, eg: template struct TwoParm { void a() {} }; template struct TwoParm { void e() {} }; %template(E) TwoParm; Note that the primary template must now be in scope, like in C++, when an explicit or partial specialization is instantiated with %template. *** POTENTIAL INCOMPATIBILITY *** 2009-09-14: wsfulton [C#] Add %csattributes for adding C# attributes to enum values, see docs for example. 2009-09-11: wsfulton Fix memmove regression in cdata.i as reported by Adriaan Renting. 2009-09-07: wsfulton Fix constant expressions containing <= or >=. 2009-09-02: wsfulton The following operators in constant expressions now result in type bool for C++ wrappers and remain as type int for C wrappers, as per each standard: && || == != < > <= >= (Actually the last 4 are still broken). For example: #define A 10 #define B 10 #define A_EQ_B A == B // now wrapped as type bool for C++ #define A_AND_B A && B // now wrapped as type bool for C++ 2009-09-02: wsfulton Fix #2845746. true and false are now recognised keywords (only when wrapping C++). Constants such as the following are now wrapped (as type bool): #define FOO true #define BAR FOO && false Version 1.3.40 (18 August 2009) =============================== 2009-08-17: olly [Perl] Add "#undef do_exec" to our clean up of Perl global namespace pollution. 2009-08-17: olly [PHP] Fix to wrap a resource returned by __get() in a PHP object (SF#2549217). 2009-08-17: wsfulton Fix #2797485 After doing a 'make clean', install fails if yodl2man or yodl2html is not available. 2009-08-16: wsfulton [Octave] Caught exceptions display the type of the C++ exception instead of the generic "c++-side threw an exception" message. 2009-08-16: wsfulton [Java] When %catches is used, fix so that any classes specified in the "throws" attribute of the "throws" typemap are generated into the Java method's throws clause. 2009-08-16: wsfulton [C#] Fix exception handling when %catches is used, reported by Juan Manuel Alvarez. 2009-08-15: wsfulton Fix %template seg fault on some cases of overloading the templated method. Bug reported by Jan Kupec. 2009-08-15: wsfulton [Ruby] Add numerous missing wrapped methods for std::vector specialization as reported by Youssef Jones. 2009-08-14: wsfulton [Perl] Add SWIG_ConvertPtrAndOwn() method into the runtime for smart pointer memory ownership control. shared_ptr support still to be added. Patch from David Fletcher. 2009-08-14: olly [PHP] PHP5 now wraps static member variables as documented. 2009-08-14: olly [PHP] Update the PHP "class" example to work with PHP5 and use modern wrapping features. 2009-08-13: wsfulton [PHP] std::vector wrappers overhaul. They no longer require the specialize_std_vector() macro. Added wrappers for capacity() and reserve(). 2009-08-13: wsfulton [PHP] Add const reference typemaps. const reference primitive types are now passed by value rather than pointer like the other target languages. Fixes SF#2524029. 2009-08-08: wsfulton [Python] More user friendly AttributeError is raised when there are no constructors generated for the proxy class in the event that the class is abstract - the error message is now "No constructor defined - class is abstract" whereas if there are no public constructors for any other reason and the class is not abstract, the message remains "No constructor defined". [tcl] Similarly for tcl when using -itcl. 2009-08-04: olly [PHP] Fix generated code to work with PHP 5.3. 2009-08-04: vmiklos [PHP] Various mathematical functions (which would conflict with the built-in PHP ones) are now automatically handled by adding a 'c_' prefix. 2009-08-03: wsfulton [C#] The std::vector implementation is improved and now uses $typemap such that the proxy class for T no longer has to be specified in some macros for correct C# compilation; the following macros are deprecated, where CSTYPE was the C# type for the C++ class CTYPE: SWIG_STD_VECTOR_SPECIALIZE_MINIMUM(CSTYPE, CTYPE) usage should be removed altogether SWIG_STD_VECTOR_SPECIALIZE(CSTYPE, CTYPE) should be replaced with: SWIG_STD_VECTOR_ENHANCED(CTYPE) Some more details in csharp/std_vector.i *** POTENTIAL INCOMPATIBILITY *** 2009-07-31: olly [Python] Fix indentation so that we give a useful error if the module can't be loaded. Patch from Gaetan Lehmann in SF#2829853. 2009-07-29: wsfulton Add $typemap(method, typelist) special variable macro. This allows the contents of a typemap to be inserted within another typemap. Fully documented in Typemaps.html. 2009-07-29: vmiklos [PHP] Static member variables are now prefixed with the class name. This allows static member variables with the same name in different classes. 2009-07-29: olly [Python] Add missing locks to std::map wrappers. Patch from Paul Hampson in SF#2813836. 2009-07-29: olly [PHP] Fix memory leak in PHP OUTPUT typemaps. Reported by Hitoshi Amano in SF#2826322. 2009-07-29: olly [PHP] Fix memory leak in PHP resource destructor for classes without a destructor and non-class types. Patch from Hitoshi Amano in SF#2825303. 2009-07-28: olly [PHP] Update warnings about clashes between identifiers and PHP keywords and automatic renaming to work with the PHP5 class wrappers. Fixes SF#1613679. 2009-07-28: vmiklos [PHP] If a member function is not public but it has a base which is public, then now a warning is issued and the member function will be public, as PHP requires this. 2009-07-21: vmiklos [PHP] Director support added. 2009-07-15: olly [Perl] Don't specify Perl prototype "()" for a constructor with a different name to the class, as such constructors can still take parameters. 2009-07-12: xavier98 [Octave] Add support for Octave 3.2 API 2009-07-05: olly [PHP] Update the list of PHP keywords - "cfunction" is no longer a keyword in PHP5 and PHP 5.3 added "goto", "namespace", "__DIR__", and "__NAMESPACE__". 2009-07-03: olly [Tcl] To complement USE_TCL_STUBS, add support for USE_TK_STUBS and SWIG_TCL_STUBS_VERSION. Document all three in the Tcl chapter of the manual. Based on patch from SF#2810380 by Christian Gollwitzer. 2009-07-02: vmiklos [PHP] Added factory.i for PHP, see the li_factory testcase for more info on how to use it. 2009-07-02: wsfulton Fix -Wallkw option as reported by Solomon Gibbs. 2009-07-02: wsfulton Fix syntax error when a nested struct contains a comment containing a * followed eventually by a /. Regression from 1.3.37, reported by Solomon Gibbs. 2009-07-01: vmiklos [PHP] Unknown properties are no longer ignored in proxy classes. 2009-07-01: vmiklos [PHP] Fixed %newobject behaviour, previously any method marked with %newobject was handled as a constructor. 2009-06-30: olly [Ruby] Undefine close and connect macros defined by Ruby API headers as we don't need them and they can clash with C++ methods being wrapped. Patch from Vit Ondruch in SF#2814430. 2009-06-26: olly [Ruby] Fix to handle FIXNUM values greater than MAXINT passed for a double parameter. 2009-06-24: wsfulton Fix wrapping methods with default arguments and the compactdefaultargs feature where a class is passed by value and is assigned a default value. The SwigValueWrapper template workaround for a missing default constructor is no longer used as the code generated does not call the default constructor. 2009-06-16: wsfulton [Java,C#] Fix enum marshalling when %ignore is used on one of the enum items. Incorrect enum values were being passed to the C++ layer or compilation errors resulted. 2009-06-02: talby [Perl] Resolved reference.i overload support problem identified by John Potowsky. 2009-05-26: wsfulton [C#] Improved std::map wrappers based on patch from Yuval Baror. The C# proxy now implements System.Collections.Generic.IDictionary<>. These std:map wrappers have a non-backwards compatible overhaul to make them like a .NET IDictionary. Some method names have changed as following: set -> setitem (use this[] property now) get -> getitem (use this[] property now) has_key -> ContainsKey del -> Remove clear -> Clear The following macros used for std::map wrappers are deprecated and will no longer work: specialize_std_map_on_key specialize_std_map_on_value specialize_std_map_on_both *** POTENTIAL INCOMPATIBILITY *** 2009-05-20: vmiklos [PHP] Add the 'thisown' member to classes. The usage of it is the same as the Python thisown one: it's 1 by default and you can set it to 0 if you want to prevent freeing it. (For example to prevent a double free.) 2009-05-14: bhy [Python] Fix the wrong pointer value returned by SwigPyObject_repr(). 2009-05-13: mutandiz (Mikel Bancroft) [allegrocl] Minor tweak when wrapping in -nocwrap mode. 2009-05-11: wsfulton [C#] Improved std::vector wrappers on the C# proxy side from Yuval Baror. These implement IList<> instead of IEnumerable<> where possible. 2009-04-29: wsfulton [Java, C#] Add the 'notderived' attribute to the javabase and csbase typemaps. When this attribute is set, the typemap will not apply to classes that are derived from a C++ base class, eg %typemap(csbase, notderived="1") SWIGTYPE "CommonBase" 2009-04-29: olly [Python] Don't attempt to acquire the GIL in situations where we know that it will already be locked. This avoids some dead-locks with mod_python (due to mod_python bugs which are apparently unlikely to ever be fixed), and results in smaller wrappers which run a little faster (in tests with Xapian on x86-64 Ubuntu 9.04, the stripped wrapper library was 11% smaller and ran 2.7% faster). 2009-04-21: wsfulton [C#] Fix #2753469 - bool &OUTPUT and bool *OUTPUT typemaps initialisation. 2009-04-09: wsfulton Fix #2746858 - C macro expression using floating point numbers 2009-03-30: olly [PHP] The default out typemap for char[ANY] now returns the string up to a zero byte, or the end of the array if there is no zero byte. This is the same as Python does, and seems more generally useful than the previous behaviour of returning the whole contents of the array including any zero bytes. If you want the old behaviour, you can provide your own typemap to do this: %typemap(out) char [ANY] %{ RETVAL_STRINGL($1, $1_dim0, 1); %} Version 1.3.39 (21 March 2009) ============================== 2009-03-19: bhy [Python] Fix the memory leak related to Python 3 unicode and C char* conversion, which can be shown in the following example before this fix: from li_cstring import * i=0 while True: i += 1 n = str(i)*10 test3(n) This fix affected SWIG_AsCharPtrAndSize() so you cannot call this function with a null alloc and non-null cptr argument in Python 3, otherwise a runtime error will be raised. 2009-03-18: wsfulton [C#] std::vector wrapper improvements for .NET 2 and also providing the necessary machinery to use the std::vector wrappers with more advanced features such as LINQ - the C# proxy class now derives from IEnumerable<>. The default is now to generate code requiring .NET 2 as a minimum, although the C# code can be compiled for .NET 1 by defining the SWIG_DOTNET_1 C# preprocessor constant. See the std_vector.i file for more details. *** POTENTIAL INCOMPATIBILITY *** 2009-03-12: wsfulton [Ruby] Fix #2676738 SWIG generated symbol name clashes. 2009-03-01: bhy [Python] Some fixes for Python 3.0.1 and higher support. In 3.0.1, the C API function PyObject_Compare is removed, so PyObject_RichCompareBool is used for replacement. Struct initilization of SwigPyObject and SwigPyObject_as_number changed to reflect the drop of tp_compare and nb_long. 2009-03-01: bhy [Python] Fix SF#2583160. Now the importer in Python shadow wrapper take care of the case that module already imported at other place. 2009-02-28: bhy [Python] Fix SF#2637352. Move struct declaration of SWIG_module in pyinit.swg before the method calls, since some C compiler don't allow declaration in middle of function body. 2009-02-21: wsfulton [Allegrocl] Fix seg fault wrapping some constant variable (%constant) types. 2009-02-20: wsfulton [CFFI] Fix seg faults when for %extend and using statements. 2009-02-20: wsfulton Fix SF #2605955: -co option which broke in 1.3.37. 2009-02-20: wsfulton New %insert("begin") section added. Also can be used as %begin. This is a new code section reserved entirely for users and the code within the section is generated at the top of the C/C++ wrapper file and so provides a means to put custom code into the wrapper file before anything else that SWIG generates. 2009-02-17: wsfulton 'make clean-test-suite' will now run clean on ALL languages. Previously it only ran the correctly configured languages. This way it is now possible to clean up properly after running 'make partialcheck-test-suite'. 2009-02-14: wsfulton Extend attribute library support for structs/classes and the accessor functions use pass/return by value semantics. Two new macros are available and usage is identical to %attribute. These are %attributeval for structs/classes and %attributestring for string classes, like std::string. See attribute.swg for more details. 2009-02-13: wsfulton Add support for %extend and memberin typemaps. Previously the memberin typemaps were ignored for member variables within a %extend block. 2009-02-12: wsfulton Remove unnecessary temporary variable when wrapping return values that are references. Example of generated code for wrapping: struct XYZ { std::string& refReturn(); }; used to be: std::string *result = 0 ; ... { std::string &_result_ref = (arg1)->refReturn(); result = (std::string *) &_result_ref; } Now it is: std::string *result = 0 ; ... result = (std::string *) &(arg1)->refReturn(); 2009-02-08: bhy Change the SIZE mapped by %pybuffer_mutable_binary and %pybuffer_binary in pybuffer.i from the length of the buffer to the number of items in the buffer. 2009-02-08: wsfulton Fix %feature not working for conversion operators, reported by Matt Sprague, for example: %feature("cs:methodmodifiers") operator bool "protected"; 2009-02-07: wsfulton [MzScheme] Apply #2081967 configure changes for examples to build with recent PLT versions. Also fixes Makefile errors building SWIG executable when mzscheme package is installed (version 3.72 approx and later). 2009-02-04: talby [Perl] Fix SF#2564192 reported by David Kolovratnk. SWIG_AsCharPtrAndSize() now handles "get" magic. Version 1.3.38 (31 January 2009) ================================ 2009-01-31: bhy [Python] Fix SF#2552488 reported by Gaetan Lehmann. Now %pythonprepend and %pythonappend have correct indentation. 2009-01-31: bhy [Python] Fix SF#2552048 reported by Gaetan Lehmann. The parameter list of static member function in generated proxy code should not have the 'self' parameter. 2009-01-29: wsfulton Fix regression introduced in 1.3.37 where the default output directory for target language specific files (in the absence of -outdir) was no longer the same directory as the generated c/c++ file. 2009-01-28: wsfulton [Java, C#] Fix proxy class not being used when the global scope operator was used for parameters passed by value. Reported by David Piepgrass. 2009-01-15: wsfulton [Perl] Fix seg fault when running with -v option, reported by John Ky. Version 1.3.37 (13 January 2009) ================================ 2009-01-13: mgossage [Lua] Added contract support for requiring that unsigned numbers are >=0 Rewrote much of Examples/Lua/embed3. Added a lot to the Lua documentation. 2009-01-13: wsfulton Fix compilation error when using directors on protected virtual overloaded methods reported by Sam Hendley. 2009-01-12: drjoe [R] Fixed handling of integer arrays 2009-01-10: drjoe [R] Fix integer handling in r to deal correctly with signed and unsigned issues 2009-01-10: wsfulton Patch #1992756 from Colin McDonald - %contract not working for classes in namespace 2009-01-05: olly Mark SWIGPERL5, SWIGPHP5, and SWIGTCL8 as deprecated in the source code and remove documentation of them. 2008-12-30: wsfulton Bug #2430756. All the languages now define a macro in the generated C/C++ wrapper file indicating which language is being wrapped. The macro name is the same as those defined when SWIG is run, eg SWIGJAVA, SWIGOCTAVE, SWIGCSHARP etc and are listed in the "Conditional Compilation" section in the documentation. 2008-12-23: wsfulton [Java] Fix #2153773 - %nojavaexception was clearing the exception feature instead of disabling it. Clearing checked Java exceptions also didn't work. The new %clearjavaexception can be used for clearing the exception feature. 2008-12-22: wsfulton Fix #2432801 - Make SwigValueWrapper exception safe for when copy constructors throw exceptions. 2008-12-21: wsfulton Apply patch #2440046 which fixes possible seg faults for member and global variable char arrays when the strings are larger than the string array size. 2008-12-20: wsfulton The ccache compiler cache has been adapted to work with SWIG and named ccache-swig. It now works with C/C++ compilers as well as SWIG and can result in impressive speedups when used to recompile unchanged code with either a C/C++ compiler or SWIG. Documentation is in CCache.html or the installed ccache-swig man page. 2008-12-12: wsfulton Apply patch from Kalyanov Dmitry which fixes parsing of nested structs containing comments. 2008-12-12: wsfulton Fix error message in some nested struct and %inline parsing error situations such as unterminated strings and comments. 2008-12-07: olly [PHP] Fix warnings when compiling generated wrapper with GCC 4.3. 2008-12-06: wsfulton [PHP] Deprecate %pragma(php4). Please use %pragma(php) instead. The following two warnings have been renamed: WARN_PHP4_MULTIPLE_INHERITANCE -> WARN_PHP_MULTIPLE_INHERITANCE WARN_PHP4_UNKNOWN_PRAGMA -> WARN_PHP_UNKNOWN_PRAGMA *** POTENTIAL INCOMPATIBILITY *** 2008-12-04: bhy [Python] Applied patch SF#2158938: all the SWIG symbol names started with Py are changed, since they are inappropriate and discouraged in Python documentation (from http://www.python.org/doc/2.5.2/api/includes.html): "All user visible names defined by Python.h (except those defined by the included standard headers) have one of the prefixes "Py" or "_Py". Names beginning with "_Py" are for internal use by the Python implementation and should not be used by extension writers. Structure member names do not have a reserved prefix. Important: user code should never define names that begin with "Py" or "_Py". This confuses the reader, and jeopardizes the portability of the user code to future Python versions, which may define additional names beginning with one of these prefixes." Here is a brief list of what changed: PySwig* -> SwigPy* PyObject_ptr -> SwigPtr_PyObject PyObject_var -> SwigVar_PyObject PySequence_Base, PySequence_Cont, PySequence_Ref -> SwigPySequence_Base, SwigPySequence_Cont, SwigPySequence_Ref PyMap* -> SwigPyMap* We provided a pyname_compat.i for backward compatibility. Users whose code having these symbols and do not want to change it could simply include this file at front of your code. A better solution is to run the converting tool on your code, which has been put in SWIG's SVN trunk (Tools/pyname_patch.py) and you can download it here: https://swig.svn.sourceforge.net/svnroot/swig/trunk/Tools/pyname_patch.py *** POTENTIAL INCOMPATIBILITY *** 2008-12-02: wsfulton [Python] Apply patch #2143727 from Serge Monkewitz to fix importing base classes when the package option is specified in %module and that module is %import'ed. 2008-11-28: wsfulton [UTL] Fix #2080497. Some incorrect acceptance of types in the STL, eg a double * element passed into a vector constructor would be accepted, but the ensuing behaviour was undefined. Now the type conversion correctly raises an exception. 2008-11-24: wsfulton Add -outcurrentdir option. This sets the default output directory to the current directory instead of the path specified by the input file. This option enables behaviour similar to c/c++ compilers. Note that this controls the output directory, but only in the absence of the -o and/or -outdir options. 2008-11-23: wsfulton [ruby] Apply patch #2263850 to fix ruby/file.i ... rubyio.h filename change in ruby 1.9. 2008-11-23: wsfulton Apply patch #2319790 from Johan Hake to fix shared_ptr usage in std::tr1 namespace. 2008-11-21: wsfulton The use of the include path to find the input file is now deprecated. This makes the behaviour of SWIG the same as C/C++ compilers in preparation for use with ccache. 2008-11-16: wsfulton Fix -nopreprocess option to: - correctly report file names in warning and error messages. - use the original input filename that created the preprocessed output when determining the C++ wrapper file name (in the absence of -o). Previously the name of the input file containing the preprocessed output was used. 2008-11-11: wsfulton [Java] Add patch #2152691 from MATSUURA Takanori which fixes compiles using the Intel compiler 2008-11-01: wsfulton Add patch #2128249 from Anatoly Techtonik which corrects the C/C++ proxy class being reported for Python docstrings when %rename is used. 2008-11-01: wsfulton Add the strip encoder patch from Anatoly Techtonik #2130016. This enables an easy way to rename symbols by stripping a commonly used prefix in all the function/struct names. It works in the same way as the other encoders, such as title, lower, command etc outlined in CHANGES file dated 12/30/2005. Example below will rename wxAnotherWidget to AnotherWidget and wxDoSomething to DoSomething: %rename("%(strip:[wx])s") ""; struct wxAnotherWidget { void wxDoSomething(); }; 2008-09-26: mutandiz [allegrocl] Lots of test-suite work. - Fix ordering of wrapper output and %{ %} header output. - Fix declarations of local vars in C wrappers. - Fix declaration of defined constants in C wrappers. - Fix declaration of EnumValues in C wrappers. - add some const typemaps to allegrocl.swg - add rename for operator bool() overloads. 2008-09-25: olly [PHP5] Fill in typemaps for SWIGTYPE and void * (SF#2095186). 2008-09-22: mutandiz (Mikel Bancroft) [allegrocl] - Support wrapping of types whose definitions are not seen by SWIG. They are treated as forward-referenced classes and if a definition is not seen are treated as (* :void). - Don't wrap the contents of unnamed namespaces. - More code cleanup. Removed some extraneous warnings. - start work on having the allegrocl mod pass the cpp test-suite. 2008-09-19: olly [PHP5] Add typemaps for long long and unsigned long long. 2008-09-18: wsfulton [C#] Added C# array typemaps provided by Antti Karanta. The arrays provide a way to use MarshalAs(UnmanagedType.LPArray) and pinning the array using 'fixed'. See arrays_csharp.i library file for details. 2008-09-18: wsfulton Document the optional module attribute in the %import directive, see Modules.html. Add a warning for Python wrappers when the module name for an imported base class is missing, requiring the module attribute to be added to %import, eg %import(module="FooModule") foo.h 2008-09-18: olly [PHP5] Change the default input typemap for char * to turn PHP Null into C NULL (previously it was converted to an empty string). The new behaviour is consistent with how the corresponding output typemap works (SF#2025719). If you want to keep the old behaviour, add the following typemap to your interface file (PHP's convert_to_string_ex() function does the converting from PHP Null to an empty string): %typemap(in) char * { convert_to_string_ex($input); $1 = Z_STRVAL_PP($input); } 2008-09-18: olly [PHP5] Fix extra code added to proxy class constructors in the case where the only constructor takes no arguments. 2008-09-18: olly [PHP5] Fix wrapping of a renamed enumerated value of an enum class member (SF#2095273). 2008-09-17: mutandiz (Mikel Bancroft) [allegrocl] - Fix how forward reference typedefs are handled, so as not to conflict with other legit typedefs. - Don't (for now) perform an ffitype typemap lookup when trying to when calling compose_foreign_type(). This is actually a useful thing to do in certain cases, the test cases for which I can't currently locate :/. It's breaking some wrapping behavior that is more commonly seen, however. I'll readd in a more appropriate way when I can recreate the needed test case, or a user complains (which means they probably have a test case). - document the -isolate command-line arg in the 'swig -help' output. It was in the html docs, but not there. - small amount of code cleanup, removed some unused code. - some minor aesthetic changes. 2008-09-12: bhy [Python] Python 3.0 support branch merged into SWIG trunk. Thanks to Google Summer of Code 2008 for supporting this project! By default SWIG will generate interface files compatible with both Python 2.x and 3.0. And there's also some Python 3 new features that can be enabled by passing a "-py3" command line option to SWIG. These features are: - Function annotation support Also, the parameter list of proxy function will be generated, even without the "-py3" option. However, the parameter list will fallback to *args if the function (or method) is overloaded. - Buffer interface support - Abstract base class support For details of Python 3 support and these features, please see the "Python 3 Support" section in the "SWIG and Python" chapter of the SWIG documentation. The "-apply" command line option and support of generating codes using apply() is removed. Since this is only required by very old Python. This merge also patched SWIG's parser to solve a bug. By this patch, SWIG features able to be correctly applied on C++ conversion operator, such like this: %feature("shadow") *::operator bool %{ ... %} 2008-09-02: richardb [Python] Commit patch #2089149: Director exception handling mangles returned exception. Exceptions raised by Python code in directors are now passed through to the caller without change. Also, remove the ": " prefix which used to be added to other director exceptions (eg, those due to incorrect return types). 2008-09-02: wsfulton [Python] Commit patch #1988296 GCItem multiple module linking issue when using directors. 2008-09-02: wsfulton [C#] Support for 'using' and 'fixed' blocks in the 'csin' typemap is now possible through the use of the pre attribute and the new terminator attribute, eg %typemap(csin, pre=" using (CDate temp$csinput = new CDate($csinput)) {", terminator=" } // terminate temp$csinput using block", ) const CDate & "$csclassname.getCPtr(temp$csinput)" See CSharp.html for more info. 2008-09-01: wsfulton [CFFI] Commit patch #2079381 submitted by Boris Smilga - constant exprs put into no-eval context in DEFCENUM 2008-08-02: wuzzeb [Chicken,Allegro] Commit Patch 2019314 Fixes a build error in chicken, and several build errors and other errors in Allegro CL 2008-07-19: wsfulton Fix building of Tcl examples/test-suite on Mac OS X reported by Gideon Simpson. 2008-07-17: wsfulton Fix SF #2019156 Configuring with --without-octave or --without-alllang did not disable octave. 2008-07-14: wsfulton [Java, C#] Fix director typemaps for pointers so that NULL pointers are correctly marshalled to C#/Java null in director methods. 2008-07-04: olly [PHP] For std_vector.i and std_map.i, rename empty() to is_empty() since "empty" is a PHP reserved word. Based on patch from Mark Klein in SF#1943417. 2008-07-04: olly [PHP] The deprecated command line option "-make" has been removed. Searches on Google codesearch suggest that nobody is using it now anyway. 2008-07-04: olly [PHP] The SWIG cdata.i library module is now supported. 2008-07-03: olly [PHP] The deprecated command line option "-phpfull" has been removed. We recommend building your extension as a dynamically loadable module. 2008-07-02: olly [PHP4] Support for PHP4 has been removed. The PHP developers are no longer making new PHP4 releases, and won't even be providing patches for critical security issues after 2008-08-08. 2008-07-02: olly [Python] Import the C extension differently for Python 2.6 and later so that an implicit relative import doesn't produce a deprecation warning for 2.6 and a failure for 2.7 and later. Patch from Richard Boulton in SF#2008229, plus follow-up patches from Richard and Haoyu Bai. Version 1.3.36 (24 June 2008) ============================= 06/24/2008: wsfulton Remove deprecated -c commandline option (runtime library generation). 06/24/2008: olly [PHP] Fix assertion failure when handling %typemap(in,numinputs=0) (testcase ignore_parameter). 06/24/2008: olly [PHP] Fix segfault when wrapping a non-class function marked with %newobject (testcase char_strings). 06/22/2008: wsfulton [Java] Add a way to use AttachCurrentThreadAsDaemon instead of AttachCurrentThread in director code. Define the SWIG_JAVA_ATTACH_CURRENT_THREAD_AS_DAEMON macro, see Lib/java/director.swg. 06/21/2008: wsfulton [Ruby] Fix crashing in the STL wrappers (reject! and delete_if methods) 06/19/2008: wsfulton [Java, C#] C# and Java keywords will be renamed instead of just issuing a warning and then generating uncompilable code. Warning 314 gives the new name when a keyword is found. 06/19/2008: wsfulton [R] Keyword handling added. R Keywords will be renamed as necessary. Warning 314 gives the new name when a keyword is found. 06/17/2008: mgossage [Lua] Added missing support for bool& and bool*. Added runtest for li_typemaps testcase. (Bug #1938142) 06/07/2008: bhy Added test case keyword_rename, then made the keyword renaming works properly by fixing Swig_name_make() for a incomplete condition checking. 06/02/2008: wsfulton [Java, C#] Fix enum wrappers when using -noproxy. 05/30/2008: bhy Added std::wstring into Lib/typemaps/primtypes.swg, since it is also a primitive type in SWIG - fixed SF #1976978. 05/29/2008: wsfulton [Java, C#] Fix variable wrappers when using -noproxy. 05/29/2008: bhy [Python] Fixed a typo of %#ifdef in Lib/python/pycontainer.swg, which is related to -extranative SWIG option - SF #1971977. 05/20/2008: wsfulton New partialcheck makefile targets for partial testing of the test-suite. These just invoke SWIG, ie no compilation and no runtime testing. It can be faster when developing by just doing a directory diff of the files SWIG generates against those from a previous run. Example usage from the top level directory: make partialcheck-test-suite make partialcheck-java-test-suite This change also encompasses more flexibility in running the test-suite, eg it is possible to prefix the command line which runs any target language test with a tool. See the RUNTOOL, COMPILETOOL and SWIGTOOL targets in the common.mk file and makefiles in the test-suite directory. For example it is possible to run the runtime tests through valgrind using: make check RUNTOOL="valgrind --leak-check=full" or invoke SWIG under valgrind using: make check SWIGTOOL="valgrind --tool=memcheck" 05/19/2008: drjoe [R] Fixed define that was breaking pre-2.7. Checked in patch from Soren Sonnenburg that creates strings in version independent way 05/15/2008: wsfulton [Java] Fix variable name clash in directors - SF #1963316 reported by Tristan. 05/14/2008: wsfulton Add an optimisation for functions that return objects by value, reducing the number of copies of the object that are made. Implemented using an optional attribute in the "out" typemap called "optimal". Details in Typemaps.html. 05/11/2008: olly [PHP] Check for %feature("notabstract") when generating PHP5 class wrapper. 05/11/2008: wsfulton Fix SF #1943608 - $self substitution in %contract, patch submitted by Toon Verstraelen. 05/09/2008: olly [PHP] Fix char * typemaps to work when applied to signed char * and unsigned char * (uncovered by testcase apply_strings). 05/09/2008: wsfulton Fix wrapping of char * member variables when using allprotected mode. Bug reported by Warren Wang. 05/09/2008: olly [PHP] Fix bad PHP code generated when wrapping an enum in a namespace (uncovered by testcase arrays_scope). 05/09/2008: olly [PHP] SWIG now runs the PHP testsuite using PHP5, not PHP4. PHP4 is essentially obsolete now, so we care much more about solid PHP5 support. 05/07/2008: wsfulton STL fixes when using %import rather than %include and the Solaris Workshop compiler and the Roguewave STL. 05/07/2008: wsfulton Fix wrapping of overloaded protected methods when using allprotected mode. Bug reported by Warren Wang. 05/03/2008: wsfulton Commit patch #1956607 to add -MT support from Richard Boulton. This patch mirrors the gcc -MT option which allows one to change the default Makefile target being generated when generating makefiles with the -M family of options. For example: $ swig -java -MM -MT overriddenname -c++ example.i overriddenname: \ example.i \ example.h 04/30/2008: mgossage [Lua] Removed generation of _wrap_delete_XXXXX (wrappered destructor) which was unused and causing warning with g++ -Wall. Removed other unused warning in typemaps.i and other places. Added Examples/lua/embed3, and run tests a few test cases. 04/24/2008: olly [Python] Fix generated code for IBM's C++ compiler on AIX (patch from Goeran Uddeborg in SF#1928048). 04/24/2008: olly Rename BSIZE in Examples/test-suite/arrays_scope.i to BBSIZE to avoid a clash with BSIZE defined by headers on AIX with Perl (reported in SF#1928048). 04/20/2008: wsfulton Add the ability to wrap all protected members when using directors. Previously only the virtual methods were available to the target language. Now all protected members, (static and non-static variables, non-virtual methods and static methods) are wrapped when using the allprotected mode. The allprotected mode is turned on in the module declaration: %module(directors="1", allprotected="1") modulename Version 1.3.35 (7 April 2008) ============================= 04/07/2008: wsfulton [Lua] Add missing pointer reference typemaps 04/06/2008: wsfulton Fix stack overflow when using typemap warning suppression, eg %warnfilter(SWIGWARN_TYPEMAP_CHARLEAK_MSG) 04/05/2008: wsfulton [Python] Fix shared_ptr typemaps so that %pythonnondynamic can be used. Also corrects display of the proxy class type. Reported by Robert Lupton. 04/04/2008: olly [Python] Add %newobject reference to python memory management subsection of manual (patch from mdbeachy in SF#1894610). 03/27/2008: wsfulton [Python] Fix shared_ptr typemaps where the pointer type is a templated type with with more than one parameter. Reported by Robert Lupton. 03/27/2008: mgossage [Lua] Added a typemap DISOWN for SWIGTYPE* and SWIGTYPE[], and support for %delobject feature. Added Examples/lua/owner which demonstrates the use of the memory management. 03/26/2008: wsfulton [Java] Apply patch #1844301 from Monty Taylor to suppress enum constructor unused warnings. 03/26/2008: wsfulton [Python] Apply patch #1924524 from Casey Raymondson which ensures the "No constructor defined" message is displayed when attempting to call a constructor on a class that doesn't have a constructor wrapper, eg if the C++ class is abstract. 03/26/2008: wsfulton [Python] Apply patch #1925702 from Casey Raymondson which removes warning 512 for std::vector wrappers. 03/26/2008: olly [Python] Apply GCC 4.3 warnings patch from Philipp Thomas (SF#1925122). 03/21/2008: wsfulton [Python] Thread safety patch for STL iterators from Abhinandan Jain. 03/17/2008: mgossage [Lua] Added %luacode feature to add source code into wrappers. Updated documentation to document this. Added Examples/lua/arrays to show its use (and typemaps) 03/17/2008: olly Fix nonportable sed usage which failed on Mac OS X (and probably other platforms). Fixes SF#1903612. 03/17/2008: olly Fix memory leak in SWIG's parser (based on patch from Russell Bryant in SF#1914023). 03/12/2008: wsfulton Fix bug #1878285 - unnecessary cast for C struct creation wrappers. 03/12/2008: wsfulton [Python] Remove debugging info when using shared_ptr support 03/06/2008: mgossage [Lua] Updated documentation for Lua exceptions. Added Examples/lua/exception and Examples/lua/embed2. Small updates to the typemaps. 03/04/2008: wsfulton [Java, C#] Add char *& typemaps. 03/04/2008: wsfulton Fix occasional seg fault when attempting to report overloaded methods as being ignored. 02/29/2008: wsfulton [Perl] Fix #1904537 Swig causes a Perl warning "x used only once" in Perl 5.10 reported by Ari Jolma 02/29/2008: wsfulton [Python] Add shared_ptr varin/varout typemaps for wrapping global variables. 02/25/2008: wsfulton Fix $wrapname to work in %exception (fixes some wrap:name assertions) Version 1.3.34 (27 February 2008) ================================= 02/13/2008: wsfulton [R] Fix wrapping of global function pointer variables. 02/13/2008: wsfulton Add new special variables for use within %exception: $wrapname - language specific wrapper name $overname - if a method is overloaded this contains the extra mangling used on the overloaded method $decl - the fully qualified C/C++ declaration of the method being wrapped without the return type $fulldecl - the fully qualified C/C++ declaration of the method being wrapped including the return type 02/12/2008: drjoe [R] Now setting S4 flag in SWIG created objects. This fixes R-SWIG for 2.6 and warning for 2.6 failure has been removed. 02/11/2008: mgossage [Lua] Added a patch by Torsten Landschoff to fix the unary minus issue Ran 'astyle --style=kr -2' across lua.cxx to neaten it up 02/10/2008: wsfulton Bump SWIG_RUNTIME_VERSION to 4. This is because of the recently introduced API change in the conversion functions, ie change in definition of swig_converter_func. Anyone calling SWIG_TypeCast must pass in a valid value for the new additional (third) parameter and then handle the newly created memory if the returned value is set to SWIG_CAST_NEW_MEMORY else a memory leak will ensue. 02/09/2008: wsfulton [Python] Experimental shared_ptr typemaps added. Usage is the same as the recently added Java and C# shared_ptr typemaps. Two macros are available, although these may well change in a future version: For base classes or classes not in an inheritance chain: SWIG_SHARED_PTR(PROXYCLASS, TYPE) For derived classes: SWIG_SHARED_PTR_DERIVED(PROXYCLASS, BASECLASSTYPE, TYPE) The PROXYCLASS is the name of the proxy class, but is only required for Java/C#. Example usage: %include "boost_shared_ptr.i" SWIG_SHARED_PTR(Klass, Space::Klass) SWIG_SHARED_PTR_DERIVED(KlassDerived, Space::Klass, Space::KlassDerived) namespace Space { struct Klass { ... }; struct KlassDerived : Klass { ... }; } Further details to follow in future documentation, but the following features should be noted: - Not restricted to boost::shared_ptr, eg std::tr1::shared_ptr can also be used. - Available typemap groups: (a) Typemaps for shared_ptr passed by value, reference, pointer and pointer reference. - (b) Typemaps for passing by raw value, raw pointer, raw reference, raw pointer reference. - The code being wrapped does not even have to use shared_ptr, SWIG can use shared_ptr as the underlying storage mechanism instead of a raw pointer due to the typemaps in group (b) above. - No array support as shared_ptr does not support arrays. - This works quite differently to the usual SWIG smart pointer support when operator-> is parsed by SWIG: - An additional smart pointer class is not generated reducing code bloat in the wrappers. - Using smart pointers and raw pointers can be mixed seamlessly. - Missing constructors for the smart pointers is no longer a problem and so separate factory type functions do not have to be written and wrapped. - The implicit C++ shared_ptr< derived class > to shared_ptr< base class > cast also works in the target language. This negates the necessity to write an explicit helper cast function providing the upcast which would need calling prior to passing a derived class to a method taking a shared_ptr to a base class. 02/09/2008: wsfulton [Python] Add support for overriding the class registration function via a new "smartptr" feature. This is a very low level of customisation most users would never need to know. The feature will typically be used for intrusive smart pointers along with additional typemaps. Example usage of the feature: %feature("smartptr", noblock=1) Foo { boost::shared_ptr< Foo > } class Foo {}; The generated Foo_swigregister function will then register boost::shared < Foo > (SWIGTYPE_p_boost__shared_ptrTFoo_t instead of SWIGTYPE_p_Foo) as the underlying type for instantiations of Foo. 02/09/2008: wsfulton Features now supports the optional 'noblock' attribute for all usage of %feature. When specified, the { } braces are removed from the feature code. This is identical in behaviour to usage of 'noblock' in typemaps and is used when the preprocessor is required to operate on the code in the feature and the enclosing { } braces are not required. Example: #define FOO foo %feature("smartptr", noblock="1") { FOO::bar } The preprocessor then reduces this as if this had been used instead: %feature("smartptr") "foo::bar" 02/01/2008: olly [Python] Fix format string bug (SF#1882220). 01/31/2008: wsfulton Additions to the %types directive. Now the conversion / casting code can be overridden to some custom code in the %types directive, like so: %types(fromtype = totype) %{ ... code to convert fromtype to totype and return ... %} The special variable $from will be replaced by the name of the parameter of the type being converted from. The code must return the totype cast to void *. Example: class Time; class Date; Date &Time::dateFromTime(); %types(Time = Date) %{ Time *t = (Time *)$from; Date &d = t->dateFromTime(); return (void *) &d; %} resulting in the conversion / casting code looking something like: static void *_p_TimeTo_p_Date(void *x) { Time *t = (Time *)x; Date &d = t->dateFromTime(); return (void *) &d; } This is advanced usage, please use only if you understand the runtime type system. 01/30/2008: mgossage Small update to documentation in Typemaps.html, to warn about use of local variables in typemaps for multiple types. 01/25/2008: wsfulton [Java] Fix bug reported by Kevin Mills in ARRAYSOFCLASSES typemaps where any changes made to an array element passed from Java to C are not reflected back into Java. 01/24/2008: mgossage More updates to the configure script for detecting lua. Also looks in /usr/include/lua* Also changed typemaps.i not to check for NULL before freeing a pointer 01/21/2008: wsfulton [Python] For STL containers, SWIG no longer attempts to convert from one STL container to another, eg from std::vector to std::vector or std::list to std::vector or even std::vector to std::vector as it previously did. In fact SWIG no longer attempts to convert any SWIG wrapped C++ proxy class that is also a Python sequence, whereas previously it would. Any non-SWIG Python sequence will still be accepted wherever an STL container is accepted. Overloaded methods using containers should be faster. 01/18/2008: wsfulton [C#] Add 'directorinattributes' and 'directoroutattributes' typemap attributes for the imtype typemap. These should contain C# attributes which will be generated into the C# director delegate methods. 01/18/2008: olly Fix handling of byte value 255 in input files on platforms where char is signed (it was getting mapped to EOF). Fixes SF#1518219. 01/16/2008: wsfulton Fix template member variables wrapped by a smart pointer. Bug reported by Robert Lupton. 01/14/2008: mgossage Substantial changes to configure script for detecting lua. Code can now link to liblua.a, liblua50.a or liblua51.a It's also a lot neater now. 12/16/2007: wsfulton [Perl] Backed out #1798728 - numbers can be passed to functions taking char * 12/16/2007: wsfulton Fix #1832613 - Templates and some typedefs involving pointers or function pointers 12/12/2007: wsfulton [Java] Fix #1632625 - Compilation errors on Visual C++ 6 when using directors. 12/12/2007: wsfulton [Perl] Fix #1798728 - numbers can be passed to functions taking char *. 12/12/2007: wsfulton Fix #1819847 %template with just one default template parameter template class Foo {...}; %template(FooDefault) Foo<>; 12/12/2007: mgossage [Lua] Small correction on Lua.html 12/09/2007: wsfulton Apply patch #1838248 from Monty Taylor for vpath builds of SWIG. 12/08/2007: wsfulton [Lua] Fixes to remove gcc-4.2 warnings 12/06/2007: wsfulton Fix #1734415 - template template parameters with default arguments such as: template class t_alloc = pfc::alloc_fast > class list_t : public list_impl_t > { ... }; 12/04/2007: mgossage [lua] Fix a bug in the class hierachy code, where the methods were not propagated, if the name ordering was in a certain order. Added new example programs (dual, embed) and runtime tests for test-suite. 11/30/2007: wsfulton Fix using statements using a base class method where the methods were overloaded. Depending on the order of the using statements and method declarations, these were previously generating uncompilable wrappers, eg: struct Derived : Base { virtual void funk(); using Base::funk; }; Version 1.3.33 (November 23, 2007) ================================== 11/21/2007: mikel [allegrocl] omit private slot type info in the classes/types defined on the lisp side. Fix bug in mapping of C/++ types to lisp types. Fix typo in modules generated defpackage form. Have std::string *'s automatically marshalled between foreign and lisp strings. 11/20/2007: olly [Python] Fill in Python Dictionary functions list (patch from Jelmer Vernooij posted to swig-devel). 11/20/2007: beazley Fixed a bug in the C scanner related to backslash characters. 11/19/2007: wsfulton [Perl] Fix broken compilation of C++ wrappers on some compilers. 11/16/2007: olly [Python] Don't pass Py_ssize_t for a %d printf-like format as that's undefined behaviour when sizeof(Py_ssize_t) != sizeof(int). Version 1.3.32 (November 15, 2007) ================================== 11/14/2007: wsfulton [R] Package name and dll name is now the same as the SWIG module name. It used to be the module name with _wrap as a suffix. The package and dll names can be modified using the -package and -dll commandline options. *** POTENTIAL INCOMPATIBILITY *** 11/11/2007: wsfulton [R] Add support for Windows (Visual C++ 8 tested) 11/10/2007: olly [php] Fix makefile generated by -make (SF#1633679). Update documentation to mark "-make" as deprecated (none of the other SWIG backends seem to offer such a feature, it can't realistically generate a fully portable makefile, and the commands to build an extension are easy enough to write for the user's preferred build tool). Also recommend against the use of "-phpfull" (it's only really useful when static linking, and a dynamically loadable module is virtually always the better approach). 11/09/2007: olly Fix --help output to note that `export SWIG_FEATURES' is required. 10/29/2007: wsfulton [R] Fix seg fault on Windows [R] Examples R scripts are now platform independent 10/30/2007: mgossage [lua] fixed bug in template classes which cases template_default2 and template_specialization_defarg to fail. Added several warning filters into the overload's test cases. Added runtime tests for several codes. You can now make check-lua-test-suite with no errors and only a few warnings. 10/30/2007: olly [guile] Fix the configure test to put GUILELINK in LIBS not LDFLAGS (SF#1822430). 10/30/2007: olly [guile] Fix the guile examples on 64-bit platforms. 10/29/2007: wsfulton [C#] Fix member pointers on 64 bit platforms. 10/28/2007: olly [lua] Fix swig_lua_class instances to be static to allow multiple SWIG wrappers to be compiled into the same executable statically. Patch from Andreas Fredriksson (posted to the swig mailing list). 10/28/2007: olly [lua] Fix Examples/lua to pass SRCS for C tests rather than CXXSRCS. The code as it was happened to work on x86, but broke on x86_64 (and probably any other platforms which require -fPIC). 10/28/2007: wsfulton [Java, C#] New approach for fixing uninitialised variable usage on error in director methods using the new templated initialisation function SwigValueInit(). 10/28/2007: wsfulton [Perl] Use more efficient SvPV_nolen(x) instead of SvPV(x,PL_na) if SvPV_nolen is supported. 10/26/2007: wuzzeb [Chicken] Fix global variables of class member function pointers. Other minor fixes, so all tests in the chicken test suite now pass 10/25/2007: olly Fix UTL typecheck macro for a function taking char[] or const char[] (SF#1820132). 10/22/2007: mkoeppe [Guile] Filter out -ansi -pedantic from CFLAGS while compiling test programs for Guile in configure. This enables running the test suite for Guile if it is installed and usable. 10/22/2007: mkoeppe [Guile -scm] Fix testcases apply_signed_char and apply_strings by adding explicit casts to the appropriate $ltype. 10/22/2007: wsfulton [Java, C#] Fix uninitialised variable usage on error in director methods. 10/19/2007: wsfulton [Java, C#] Bug #1794247 - fix generated code for derived classes when csbase or javabase typemaps are used with the replace="1" attribute. 10/19/2007: wsfulton [Python] Docs updated to suggest using distutils. Patch #1796681 from Christopher Barker. 10/19/2007: olly [perl5] Clear errno before calls to strtol(), strtoul(), strtoll() and strtoull() which we check errno after to avoid seeing a junk value of errno if there isn't an error in the call. 10/16/2007: wsfulton Deprecate %attribute_ref and replace with %attributeref. There is just an argument order change in order to maintain consistency with %attribute, from: %attribute_ref(Class, AttributeType, AccessorMethod, AttributeName) to %attributeref(Class, AttributeType, AttributeName, AccessorMethod) 10/16/2007: olly [Tcl] Fix several occurrences of "warning: deprecated conversion from string constant to 'char*'" from GCC 4.2 in generated C/C++ code. 10/16/2007: olly [PHP] Fix many occurrences of "warning: deprecated conversion from string constant to 'char*'" from GCC 4.2 in generated C/C++ code when compiling with a new enough version of PHP 5 (tested with PHP 5.2.3, but PHP 5.2.1 is probably the minimum requirement). 10/15/2007: wsfulton Patch #1797133 from David Piepgrass fixes %attribute when the getter has the same name as the attribute name and no longer generate non-functional setter for read-only attributes. 10/15/2007: olly [Tcl] Prevent SWIG_Tcl_ConvertPtr from calling the unknown proc. Add Examples/tcl/std_vector/ which this change fixes. Patch is from "Cliff C" in SF#1809819. 10/12/2007: wsfulton [Java] Add DetachCurrentThread back in for directors. See entry dated 08/11/2006 and search for DetachCurrentThread on the mailing lists for details. The crashes on Solaris seem to be only present in jdk-1.4.2 and lower (jdk-1.5.0 and jdk-1.6.0 are okay), so anyone using directors should use a recent jdk on Solaris, or define (see director.swg) SWIG_JAVA_NO_DETACH_CURRENT_THREAD to the C++ compiler to get old behaviour. 10/12/2007: wsfulton [Java] Ensure the premature garbage collection prevention parameter (pgcpp) is generated when there are C comments in the jtype and jstype typemaps. 10/12/2007: wuzzeb Added a testsuite entry for Bug #1735931 10/09/2007: olly Automatically rerun autogen.sh if configure.in is modified. 10/09/2007: olly Enhance check-%-test-suite rule and friends to give a more helpful error message if you try them for a language which doesn't exist (e.g. "make check-php-test-suite" rather than the correct "make check-php4-test-suite"). 10/09/2007: olly Add make rule to regenerate Makefile from Makefile.in if it has changed. 10/09/2007: olly [php] Fix long-standing memory leak in wrapped constructors and wrapped functions/methods which return an object. 10/08/2007: olly Fix Makefile.in to read check.list files correctly in a VPATH build. 10/07/2007: wsfulton [C#, Java] Experimental shared_ptr typemaps added 09/27/2007: mgossage [lua] added more verbose error messages for incorrect typechecks. Added a routine which checks the exact number of parameters passed to a function (breaks operator_overloading for unary minus operator, currently disabled). Reorganised the luatypemaps.swg to tidy it up. Added a lot of %ignores on the operators not supported by lua. Added support for constant member function pointers & runtest for member_pointer.i Added first version of wchar.i 09/25/2007: wsfulton [C#, Java] throws typemaps for std::wstring using C# patch #1799064 from David Piepgrass 09/24/2007: wsfulton [Tcl] Apply #1771313 to fix bug #1650229 - fixes long long and unsigned long long handling. 09/20/2007: olly [Java] Eliminate some unnecessary uses of a temporary buffer allocated using new[]. SF#1796609. 09/19/2007: wsfulton [C#] The $csinput special variable can be used in the csvarin typemap where it is always expanded to 'value'. 09/19/2007: wsfulton [C#] Fix bug reported by Glenn A Watson and #1795260 where the cstype typemap used the 'ref' keyword in the typemap body, it produced uncompilable C# properties (variable wrappers). The type for the property now correctly comes from the 'out' attribute in the cstype typemap. 09/19/2007: wsfulton [Java] Fix const std::wstring& typemaps 09/19/2007: wsfulton [Java] Ensure the premature garbage collection prevention parameter (pgcpp) is generated where a parameter is passed by pointer reference, eg in the std::vector wrappers. The pgcpp is also generated now when user's custom typemaps use a proxy class in the jstype typemap and a 'long' in the jtype typemap. 09/18/2007: olly [php] Add typemaps for handling parameters of type std::string & which are modified by the wrapped function. 09/17/2007: olly [python] Split potentially long string literals to avoid hitting MSVC's low fixed limit on string literal length - patch from SF#1723770, also reported as SF#1630855. 09/17/2007: olly [ocaml] Fix renaming of overloaded methods in the method_table - my patch from SF#940399. 09/17/2007: olly [python] Simpler code for SWIG_AsVal_bool() which fixes a "strict aliasing" warning from GCC - patch from SF#1724581 by Andrew Baumann. 09/17/2007: olly [perl5] Use sv_setpvn() to set a scalar from a pointer and length - patch from SF#174460 by "matsubaray". 09/17/2007: olly When wrapping C++ code, generate code which uses std::string::assign(PTR, LEN) rather than assigning std::string(PTR, LEN). Using assign generates more efficient code (tested with GCC 4.1.2). 09/07/2007: wsfulton Fix %ignore on constructors which are not explicitly declared [SF #1777712] 09/05/2007: wuzzeb (John Lenz) - Change r_ltype in typesys.c to store a hashtable instead of a single value. several very subtle bugs were being caused by multiple ltypes being mapped to a single mangled type, mostly when using typedefed template parameters. Now, r_ltype stores a hashtable of possible ltypes, and when generating the type table, all the ltypes are added into the swig_type_info structure. 08/31/2007: wsfulton SF #1754967 from James Bigler. - Fix bug in turning on warnings that were turned off by default. Eg 'swig -w+309' will now turn on the normally suppressed warning 309. - New -Wextra commandline option which enables the extra warning numbers: 202,309,403,512,321,322 (this is the list of warnings that have always been suppressed by default). By specifying -Wextra, all warnings will be turned on, but unlike -Wall, warnings can still be selectively turned on/off using %warnfilter, #pragma SWIG nowarn or further -w commandline options, eg: swig -Wextra -w309 will turn on all warnings except 309. 08/28/2007: wsfulton - New debugging options, -debug-module and -debug-top to display the parse tree at various stages, where is a comma separated list of stages 1-4.For example, to display top of parse tree at stages 1 and 3: swig -debug-top 1,3 - Deprecate the following options which have equivalents below: -dump_parse_module => -debug-module 1 -dump_module => -debug-module 4 -dump_parse_top => -debug-top 1 -dump_top => -debug-top 4 - Renamed some commandline options for naming consistency across all options: -debug_template => -debug-template -debug_typemap => -debug-typemap -dump_classes => -debug-classes -dump_tags => -debug-tags -dump_typedef => -debug-typedef -dump_memory => -debug-memory 08/25/2007: olly [PHP5] Fix handling of double or float parameters with an integer default value. 08/25/2007: olly [PHP5] Generate __isset() methods for setters for PHP 5.1 and later. 08/20/2007: wsfulton [Java C#] Fix director bug #1776651 reported by Stephane Routelous which occurred when the director class name is the same as the start of some other symbols used within the director class. 08/17/2007: wsfulton Correct behaviour for templated methods used with %rename or %ignore and the empty template declaration - %template(). A warning is issued if the method has not been renamed. 08/16/2007: mutandiz (Mikel Bancroft) [allegrocl] Name generated cl file based on input file rather than by module name. It was possible to end up with a mypackage.cl and a test_wrap.c when parsing a test.i input file. Confusing. Also, include external-format templates for :fat and :fat-le automatically to avoid these being compiled at runtime. 08/15/2007: efuzzyone [cffi] Apply patch #1766076 from Leigh Smith adding support for newly introduced in cffi :long-long and :unsigned-long-long. 08/10/2007: wsfulton [Java] Add documentation patch #1743573 from Jeffrey Sorensen. It contains a neat idea with respect to better memory management by the JVM of C++ allocated memory. 08/10/2007: wsfulton [Perl] Apply patch #1771410 from Wade Brainerd to fix typedef XS(SwigPerlWrapper) in perlrun.swg for ActiveState Perl build 822 and Perl 5.8.9 and 5.10 branches. 08/10/2007: wsfulton [Lua] const enum reference typemaps fixed. 08/09/2007: wsfulton [C#] Added missing support for C++ class member pointers. 08/09/2007: wsfulton [C#, Java] Add support for $owner in the "out" typemaps like in the scripting language modules. Note that $owner has always been supported in the "javaout" / "csout" typemaps. 08/01/2007: wsfulton Fix smart pointer handling for classes that have templated methods within the smart pointer type. Problem reported by craigdo at ee.washington.edu. 07/31/2007: efuzzyone [cffi] fixed memory access after being freed bug. thanks to Martin Percossi. package name clos changed to cl. thanks to Ralf Mattes 07/24/2007: wsfulton Parallel make support added for the examples and test-suite for developers who have more than one CPU. Now parallel make can be used for checking in addition to building the SWIG executable. Some typical checking examples: make -j8 -k check make -j4 check-java-test-suite make -j2 check-java-examples 07/19/2007: mgossage Fixed bug that stopped configure working on mingw (applied dos2unix to configure.in) 07/10/2007: mgossage [lua] Extra compatibility with Lua 5.1 (updated SWIG_init, docs, examples, test suite) Removed name clash for static link of multiple modules 07/05/2007: mgossage [lua] Fix a bug in SWIG_ALLOC_ARRAY() improved the error messages for incorrect arguments. Changed the output of swig_type() to use the human readable form of the type, rather than the raw swig type. 07/03/2007: wsfulton [C#] Fix directors for some overloaded methods where the imtype resulted in identical methods being generated in the C# director class, eg void foo(int *) and void foo(double *) used to generated two of these: private void SwigDirectorfoo(IntPtr p) { ... } 06/25/2007: wsfulton [Java, C#] Some parameter name changes in std_vector.i allowing better targeting of typemaps for method parameters (for memory management of containers of pointers). 06/07/2007: mutandiz (Mikel Bancroft) [allegrocl] fix foreign-type constructor to properly look for ffitype typemap bindings. fix inout_typemaps.i for strings. 06/06/2007: olly [Ruby] Use whichever of "long" or "long long" is the same size as "void*" to hold pointers as integers, rather than whichever matches off_t. Fixes compilation on OS X and GCC warnings on platforms where sizeof(void*) < sizeof(off_t) (SF patch #1731979). 06/06/2007: olly [PHP5] Fix handling of a particular case involving overloaded functions with default parameters. 06/05/2007: mutandiz (Mikel Bancroft) [allegrocl] Fix case where we'd pass fully qualified identifiers (i.e. NS1::NS2::FOO) to swig-insert-id. All namespaces should be stripped. Fix bug in TypedefHandler introduced by last fix. 06/05/2007: olly Fix reporting of filenames in errors after %include (patch from Leigh Smith in #1731040; also reported as #1699940). 05/31/2007: olly [Python] Fix "missing initialiser" warning when compiling generated C/C++ wrapper code with Python 2.5 with warnings enabled (patch from bug#1727668 from Luke Moore). 05/29/2007: olly [Python] Split docstrings into separate string literals at each newline when generating C/C++ wrapper code (the C/C++ compiler will just combine them back into a single string literal). This avoids MSVC complaining that the strings are too long (problem reported by Bo Peng on the mailing list). 05/28/2007: olly [Python] Escape backslashes in docstrings. 05/26/2007: olly [Python] Fix autodoc generation of enums to be more consistent with how the enums are wrapped - patch #1697226 from Josh Cherry. 05/26/2007: olly [PHP5] Fix wrapping of methods and functions which return a pointer to a class (bug#1700788) and those which have overloaded forms returning both classes and non-classes (bug#1712717, thanks to Simon Berthiaume for the patch). 05/25/2007: wsfulton Fixed %rename inconsistency in conversion operators as reported by Zhong Ren. The matching is now done on the operator name in the same way as it is done for parameters. For example: %rename(opABC) Space::ABC::operator ABC() const; %rename(methodABC) Space::ABC::method(ABC a) const; namespace Space { class ABC { public: void method(ABC a) const {} operator ABC() const { ABC a; return a; } }; } Note that qualifying the conversion operator previously may or may not have matched. Now it definitely won't, so this will not match: %rename(opABC) Space::ABC::operator Space::ABC() const; in the same way that this does not match: %rename(methodABC) Space::ABC::method(Space::ABC a) const; The documentation has been improved with respect to %rename, namespaces and templates. Conversion operators documentation too. *** POTENTIAL INCOMPATIBILITY *** 05/16/2007: mutandiz [allegrocl] Fix bad generation of local var ltype's in functionWrapper(). Try to work better with the backward order in which swig unrolls nested class definitions. cleaned up a little unnecessary code/debug printf's. Remove warning when replacing $ldestructor for ff:foreign-pointer 05/12/2007: olly [Python] swig -python -threads now generates C/C++ code which uses Python's own threading abstraction (from pythread.h) rather than OS specific code. The old code failed to compile on MS Windows. (See SF patch tracker #1710341). 05/04/2007: gga [Ruby] Changed STL renames to be global renames. This fixes STL functions not being renamed when autorename is on. This is a not a totally perfect work-around, but better. Someone really needs to fix the template renaming code. (See bug #1545634) 05/04/2007 gga [All] Changed %rename("%(undercase)s") a little so that single numbers at the end of a function are not undercased. That is: getSomething -> get_something get2D -> get_2d get234 -> get_234 BUT: asFloat2 -> as_float2 (Bug #1699714) 05/03/2007: gga [Ruby] Made __swigtype__ => @__swigtype__ so it can be accessed from the scripting language (and follows Ruby's official documentation, just in case). Made tracking => @__trackings__ for same reason. Currently storing ivars without the @ seems valid, but the PickAxe says this is not correct, so just in case... 05/03/2007: gga [Ruby] Applied patch for -minherit bug and exception classes. This issue should be revisited more closely, as Multiple Inheritance in Ruby is still problematic. (patch/bug #1604878) 05/03/2007: gga [Ruby] Overloaded functions in ruby will now report to the user the possible prototypes when the user mistypes the number or type of a parameter. 05/03/2007: gga [Ruby] Forgot to document the bug fixing of an old bug regarding exceptions. (bug #1458247) 05/03/2007: gga [Ruby] Fixed Ruby documentation to use the proper css styles for each section. Added autodoc section to Ruby's docs to document the features supported by Ruby in documenting its modules. Made rdoc documentation spit out the full name of the class + method name. Albeit this will make the current rdoc not recognize the method, this is still needed to disambiguate between different classes with similar methods (rdoc was created to document the ruby source which only contains one class per c file, unlike swig) I have patched rdoc to make it more friendly to swig. This patch needs to be merged in the ruby std library now. 05/03/2007: gga [Ruby] Changed flag -feature to be -init_name to better reflect its purpose and avoid confusion with -features. 05/03/2007: gga [Ruby] Improved autodoc generation. Added autodoc .swg files to Ruby library for easily adding documentation to common Ruby methods and STL methods. Fixed autodoc documenting of getters and setters and module. Made test suite always generate autodocs. 05/03/2007: gga [Ruby] Removed some warnings from STL and test suite. 05/02/2007: mgossage [Lua] Fixed issues with C++ classes and hierachies across multiple source files. Fixed imports test case & added run test. Added Examples/imports. Added typename for raw lua_State* Added documentation on native functions. 05/02/2007: gga [Ruby] Docstrings are now supported. %feature("autodoc") and %feature("docstring") are now properly supported in Ruby. These features will generate a _wrap.cxx file with rdoc comments in them. 05/02/2007: gga [Ruby] STL files have been upgraded to follow the new swig/python Lib/std conventions. This means std::vector, std::set, std::map, set::multimap, std::multiset, std::deque and std::string are now properly supported, including their iterators, support for containing ruby objects (swig::GC_VALUE) and several other ruby enhancements. std::complex, std::ios, std::iostream, std::iostreambuf and std::sstream are now also supported. std::wstring, std::wios, std::wiostream, std::wiostreambuf and std::wsstream are supported verbatim with no unicode conversion. std_vector.i now mimics the behavior of Ruby Arrays much more closely, supporting slicing, shifting, unshifting, multiple indexing and proper return values on assignment. COMPATABILITY NOTE: this changes the older api a little bit in that improper indexing would previously (incorrectly) raise exceptions. Now, nil is returned instead, following ruby's standard Array behavior. 05/02/2007: gga [Ruby] Changed the value of SWIG_TYPECHECK_BOOL to be 10000 (ie. higher than that of all integers). This is because Ruby allows typecasting integers down to booleans which can make overloaded functions on bools and integers to fail. (bug# 1488142) 05/02/2007: gga [Ruby] Fixed a subtle bug in multiple argouts that could get triggered if the user returned two or more arguments and the first one was an array. 05/01/2007: gga [Ruby] Improved the documentation to document the new features added, add directorin/out/argout typemaps, etc. 05/01/2007: gga [Ruby] Added %initstack and %ignorestack directives for director functions. These allow you to control whether a director function should re-init the Ruby stack. This is sometimes needed for an embedded Ruby where the director method is used as a C++ callback and not called by the user from ruby code. Explanation: Ruby's GC needs to be aware of the running OS stack in order to mark any VALUE (Ruby objects) it finds there to avoid collection of them. This allows the ruby API to be very simple and allows you to write code like "VALUE a = sth" anywhere without needing to do things like refcounting like python. By default, the start of the stack is set when ruby_init() is called. If ruby is inited within main(), as it usually is the case with the main ruby executable, ruby will be able to calculate its stack properly. However, when this is not possible, as when ruby is embedded as a plugin to an application where main is not available, ruby_init() will be called in the wrong place, and ruby will be incorrectly tracking the stack from the function that called ruby_init() forwards only, which can lead to all sorts of weird crashes or to ruby thinking it has run out of stack space incorrectly. To avoid this, director (callback) functions can now be tagged to try to reset the ruby stack, which will solve the issues. NOTE: ruby1.8.6 still contains a bug in it in that its function to reset the stack will not always do so. This bug is triggered very rarely, when ruby is called from two very distinct places in memory, like a branch of main() and another dso. This bug has now been reported to ruby-core and is pending further investigation. (bug #1700535 and patch #1702907) 04/30/2007: wsfulton Fix #1707582 - Restore building from read-only source directories. 04/30/2007: gga [Ruby] Ruby will now report the parameter index properly on type errors as well as the class and value of the incorrect argument passed. (feature request #1699670) 04/30/2007: gga [Ruby] Ruby no longer creates the free_Class function if the class contains its own user defined free function (%freefunc). (bug #1702882) 04/30/2007: gga [Ruby] Made directors raise a ruby exception for incorrect argout returned values if RUBY_EMBEDDED is set, instead of throwing an actual SwigDirector exception. This will prevent crashes when ruby is embedded and unaware of the SwigDirector exception. 04/30/2007: gga [Ruby] Removed the need for -DSWIGEXTERN. Changed swig_ruby_trackings to be a static variable, but also be kept within a hidden instance variable in the SWIG module. This allows properly dealing with trackings across multiple DSOs, which was previously broken. (bug #1700535 and improvement to patch #1702907) 04/29/2007: gga [Ruby] Fixed GC memory issues with trackings that could lead to segfaults when dealing, mainly, with static variables. (bug #1700535 and patch #1702907) 04/29/2007: gga [Ruby] Fixed String conversion using old ruby1.6 macros. Now StringValuePtr() is used if available. This removes warnings when converting strings with \0 in them. (bug #1700535 and patch #1702907) 04/29/2007: gga [Ruby] Fixed the argout count in directors for Ruby. Previously, ignored or "numinputs=0" typemaps would incorrectly not get counted towards the argout count. (bug/patch #1545585) 04/29/2007: gga [Ruby] Upgraded Ruby converter to recognize "numinputs=0". Previously, only the old "ignore" flag was checked (which would currently still work properly, but is deprecated). 04/29/2007: gga [Ruby - but should be made generic] %feature("numoutputs","0") added. This feature allows you to ignore the output of a function so that it is not added to a list of output values ( ie. argouts ). This should also become a feature of %typemap(directorout) as "numoutputs"=0, just like "numinputs"=0 exists. %feature("directors"=1) %include %feature("numoutputs","0") { Class::member_function1 }; %typemap(out) MStatus { // some code, like check mstatus // and raise exception if wrong }; %inline %{ typedef int MStatus; class Class { // one argument returned, but director out code added // MStatus is discarded as a return (out) parameter. virtual MStatus member_function1( int& OUTPUT ); // two arguments returned, director out code added // MStatus is not discarded virtual MStatus member_function2( int& OUTPUT ); }; %} 04/21/2007: olly Fix parsing of float constants with an exponent (e.g. 1e-02f) (bug #1699646). 04/20/2007: olly [Python] Fix lack of generation of docstrings when -O is used. Also, fix generation of docstrings containing a double quote character. Patch from Richard Boulton in bug#1700146. 04/17/2007: wsfulton [Java, C#] Support for adding in Java/C# code before and after the intermediary call, specifically related to the marshalling of the proxy type to the intermediary type. The javain/csin typemap now supports the 'pre' and 'post' attributes to achieve this. The javain typemap also supports an optional 'pgcppname' attribute for premature garbage collection prevention parameter naming and the csin typemap supports an optional 'cshin' attribute for the parameter type used in a constructor helper generated when the type is used in a constructor. Details in the Java.html and CSharp.html documentation. 04/16/2007: olly Don't treat `restrict' as a reserved identifier in C++ mode (bug#1685534). 04/16/2007: olly [PHP5] Fix how zend_throw_exception() is called (bug #1700785). 04/10/2007: olly Define SWIGTEMPLATEDISAMBIGUATOR to template for aCC (reported on swig-user that this is needed). 04/04/2007: olly [PHP5] If ZTS is enabled, release _globals_id in MSHUTDOWN to avoid PHP interpreter crash on shutdown. This solution was suggested here: http://bugs.php.net/bug.php?id=40985 04/03/2007: olly [PHP4] Add missing ZTS annotations to generated C++ wrapper code to fix compilation failures when using ZTS enabled SWIG (Linux distributions tend to disable ZTS, but notably the Windows build uses it by default). 04/01/2007: efuzzyone [CFFI] Patch #1684261: fixes handling of unsigned int literals, thanks Leigh Smith. Also, improved documentation. 03/30/2007: olly Avoid generating '<:' token when using SwigValueWrapper<> on a type which starts with '::' (patch #1690948). 03/25/2007: wuzzeb (John Lenz) [perl5] Add SWIG_fail to the SWIG_exception macro. Fixes a few problems reported on the mailing list. 03/23/2007: wsfulton String copying patch from Josh Cherry reducing memory consumption by about 25%. 03/21/2007: wsfulton [Java] Apply patch #1631987 from Ulrik Peterson - bool INOUT typemaps fail on big endian machines. 03/16/2007: wsfulton Fix seg fault given dodgy C++ code: namespace abc::def { } 03/16/2007: wsfulton [Java] Fixes so that ARRAYSOFCLASSES and ARRAYSOFENUMS in arrays_java.i can be applied to pointer types. 03/03/2007: olly [PHP5] When we know the literal numeric value for a constant, use that to initialise the const member in the PHP wrapper class. 03/02/2007: olly [PHP5] Fix PHP wrapper code generated for certain cases of overloaded forms with default arguments. 02/26/2007: efuzzyone [CFFI] Patch #1656395: fixed hex and octal values bug, thanks to Arthur Smyles. 02/22/2007: mgossage [Lua] Fixed bug in typemaps which caused derived_byvalue and rname test cases to fail. Updated derived_byvalue.i to explain how to find and fix the problem 01/25/2007: wsfulton Fix #1538522 and #1338527, forward templated class declarations without a name for the templated class parameters, such as: template class X; 01/23/2007: mgossage [Lua] Patch #1640862: replaced by Patch #1598063 Typo in typemaps.i 01/22/2007: mgossage [Lua] Added a lua specific carrays.i which adds the operator[] support. modified the main code to make it not emit all the class member functions & accessors Note: C structs are created using new_XXX() while C++ classes use XXX() (should be standardised) Updated test case: li_carrays Updated the documentation. 01/12/2007: wsfulton [Php] Add support for newfree typemaps (sometimes used by %newobject) 01/12/2007: beazley New command line option -macroerrors. When supplied, this will force the C scanner/parser to report proper location information for code contained inside SWIG macros (defined with %define). By default, SWIG merely reports errors on the line at which a macro is used. With this option, you can expand the error back to its source---something which may simplify debugging. 01/12/2007: beazley [Internals] Major overhaul of C/C++ scanning implementation. For quite some time, SWIG contained two completely independent C/C++ tokenizers-- the legacy scanner in CParse/cscanner.c and a general purpose scanner in Swig/scanner.c. SWIG still has two scanning modules, but the C parser scanner (CParse/cscanner.c) now relies upon the general purpose scanner found in Swig/scanner.c. As a result, it is much smaller and less complicated. This change also makes it possible to maintain all of the low-level C tokenizing in one central location instead of two places as before. ***POTENTIAL FLAKINESS*** This change may cause problems with accurate line number reporting as well as error reporting more generally. I have tried to resolve this as much as possible, but there might be some corner cases. 01/12/2007: mgossage [Lua] Added typemap throws for std::string*, typemap for SWIGTYPE DYNAMIC, changed the existing throws typemap to throw a string instead of making a copy of the object (updating a few test cases to deal with the change). fixed test case: dynamic_casts, exception_partial_info, li_std_string, size_t 01/03/2007: beazley [Internals]. Use of swigkeys.c/.h variables is revoked. Please use simple strings for attribute names. 12/30/2006: beazley Internal API functions HashGetAttr() and HashCheckAttr() have been revoked. Please use Getattr() to retrieve attributes. The function Checkattr() can be used to check attributes. Note: These functions have been revoked because they only added a marginal performance improvement at the expense code clarity. 12/26/2006: mgossage [Lua] Added more STL (more exceptions, map, size_t), fixed test case: conversion_ns_template. 12/21/2006: mgossage [Lua] Update to throw errors when setting immutables, and allowing user addition of module variables. 12/20/2006: wsfulton Fix typedef'd variable wrappers that use %naturalvar, eg, std::string. 12/14/2006: wsfulton [C#] Add std::wstring and wchar_t typemaps 12/14/2006: olly [php] Fix bug #1613673 (bad PHP5 code generated for getters and setters). 12/02/2006: wsfulton, John Lenz, Dave Beazley Move from cvs to Subversion for source control 11/30/2006: beazley Cleaned up swigwarnings.swg file not to use nested macro definitions. 11/12/2006: wsfulton [Java, C#] Fix for %extend to work for static member variables. Version 1.3.31 (November 20, 2006) ================================== 11/12/2006: Luigi Ballabio [Python] Alternate fix for Python exceptions bug #1578346 (the previous one broke Python properties in modern classes) 11/12/2006: wsfulton -fakeversion commandline option now generates the fake version into the generated wrappers as well as displaying it when the -version commandline option is used. 14/11/2006: mgossage [lua] update to typemap for object by value, to make it c89 compliant Version 1.3.30 (November 13, 2006) ================================== 11/12/2006: wsfulton [java] Remove DetachCurrentThread patch from 08/11/2006 - it causes segfaults on some systems. 11/12/2006: wsfulton [python] Fix #1578346 - Python exceptions with -modern 11/10/2006: wsfulton Fix #1593291 - Smart pointers and inheriting from templates 11/09/2006: wsfulton Fix director operator pointer/reference casts - #1592173. 11/07/2006: wsfulton Add $self special variable for %extend methods. Please use this instead of just 'self' as the C++ 'this' pointer. 11/07/2006: mutandiz [allegrocl] allegrocl.swg: swig-defvar updated to allow specifying of non-default foreign type (via :ftype keyword arg). allegrocl.cxx: Specify proper access type for enum values. 11/03/2006: wsfulton [Java/C#] Fix const std::string& return types for directors as reported by Mark Donselzmann 10/29/2006: wsfulton [Java] Remove DeleteLocalRef from end of director methods for now as it is causing a seg fault when run on Solaris 8. 10/29/2006: wuzzeb (John Lenz) [Guile] Patch from Chris Shoemaker to clean up some warnings in the generated code. 10/29/2006: wsfulton [Java] Important fix to prevent early garbage collection of the Java proxy class while it is being used in a native method. The finalizer could destroy the underlying C++ object while it was being used. The problem occurs when the proxy class is no longer strongly reachable after a native call. The problem seems to occur in memory stress situations on some JVMs. It does not seem to occur on the Sun client JVM up to jdk 1.5. However the 1.6 client jdk has a more aggressive garbage collector and so the problem does occur. It does occur on the Sun server JVMs (certainly 1.4 onwards). The fix entails passing the proxy class into the native method in addition to the C++ pointer in the long parameter, as Java classes are not collected when they are passed into JNI methods. The extra parameter can be suppressed by setting the nopgcpp attribute in the jtype typemap to "1" or using the new -nopgcpp commandline option. See Java.html#java_pgcpp for further details on this topic. 10/24/2006: wsfulton [C#] Fix smart pointer wrappers. The virtual/override/new keyword is not generated for each method as the smart pointer class does not mirror the underlying pointer class inheritance hierarchy. SF #1496535 10/24/2006: mgossage [lua] added support for native methods & member function pointers. fixed test cases arrays_dimensionless & cpp_basic. Added new example (functor). tidied up a little of the code (around classHandler). 10/17/2006: wsfulton [C#, Java] directorout typemap changes to fall in line with the other director languages. $result is now used where $1 used to be used. Please change your typemaps if you have a custom directorout typemap. 10/18/2006: wsfulton Some fixes for applying the char array typemaps to unsigned char arrays. 10/17/2006: wsfulton [C#, Java] Add in const size_t& and const std::size_t& typemaps. 10/15/2006: efuzzyone [CFFI] Suppress generating defctype for enums, thanks to Arthur Smyles. Patch 1560983. 10/14/2006: wuzzeb (John Lenz) [Chicken] Minor fix to make SWIG work with the (as yet unreleased) chicken 2.5 [Guile,Chicken] Fix SF Bug 1573892. Added an ext_test to the test suite to test this bug, but this test can not really be made generic because the external code must plug into the target language interpreter directly. See Examples/test-suite/chicken/ext_test.i and ext_test_external.cxx Added a %.externaltest to common.mk, and any interested language modules can copy and slightly modify either the chicken or the guile ext_test.i 10/14/2006: mgossage [Lua] added OUTPUT& for all number types, added a long long type fixed several test cases. update: changed typemaps to use SWIG_ConvertPtr rather than SWIG_MustGetPointer started spliting lua.swg into smaller parts to make it neater 10/13/2006: wsfulton [C#, Java] Marginally better support for multiple inheritance only in that you can control what the base class is. This is done using the new 'replace' attribute in the javabase/csbase typemap, eg in the following, 'Me' will be the base class, no matter what Foo is really derived from in the C++ layer. %typemap(javabase, replace="1") Foo "Me"; %typemap(csbase, replace="1") Foo "Me"; Previously it was not possible for the javabase/csbase typemaps to override the C++ base. 10/12/2006: wsfulton [Java] Remove potential race condition on the proxy class' delete() method (it is now a synchronized method, but is now customisable by changing the methodmodifiers attribute in the javadestruct or javadestruct_derived typemap) [C#] Remove potential race condition on the proxy class' Dispose() method, similar to Java's delete() above. *** POTENTIAL INCOMPATIBILITY *** 10/12/2006: wsfulton [Ruby, Python] Remove redundant director code in %extend methods (%extend methods cannot be director methods) 10/12/2006: wsfulton [Ruby, Python] Fix #1505594 - director objects not returned as director objects in %extend methods. 10/11/2006: wsfulton [Java] Fix #1238798 - Directors using unsigned long long or any other type marshalled across the JNI boundary using a Java class (where the jni typemap contains jobject). 10/06/2006: wsfulton Fix #1162194 - #include/%include within a structure 10/06/2006: wsfulton Fix #1450661, string truncation in String_seek truncating Java/C# enums. 10/06/2006: mgossage [Lua] Fix #1569587. The name is now correct. 10/04/2006: wsfulton Director fixes for virtual conversion operators 10/04/2006: olly [php] Fix #1569587 for PHP. Don't use sizeof() except with string literals. Change some "//" comments to "/* */" for portability. 10/04/2006: mgossage [Lua] Partial Fix #1569587. The type is now correct, but the name is still not correct. 10/03/2006: wsfulton [Ruby] Fix #1527885 - Overloaded director virtual methods sometimes produced uncompilable code when used with the director:except feature. 10/03/2006: wsfulton Directors: Directors are output in the order in which they are declared in the C++ class rather than in some pseudo-random order. 10/03/2006: mmatus Fix #1486281 and #1471039. 10/03/2006: olly [Perl] Fix for handling strings with zero bytes from Stephen Hutsal. 09/30/2006: efuzzyone [CFFI] Bitfield support and vararg support due to Arthur Smyles. C expression to Lisp conversion, thanks to Arthur Smyles for the initial idea, it now supports conversion for a whole range of C expressions. 09/28/2006: wsfulton Fix #1508327 - Overloaded methods are hidden when using -fvirtual optimisation. Overloaded methods are no longer candidates for elimination - this mimics C++ behaviour where all overloaded methods must be defined and implemented in a derived class in order for them to be available. 09/25/2006: wsfulton [Ruby, Python, Ocaml] Fix #1505591 Throwing exceptions in extended directors 09/25/2006: wsfulton Fix #1056100 - virtual operators. 09/24/2006: olly Don't accidentally create a "<:" token (which is the same as "[" in C++). Fixes bug # 1521788. 09/23/2006: olly [Ruby] Support building with recent versions of the Ruby 1.9 development branch. Fixes bug #1560092. 09/23/2006: olly Templates can now be instantiated using negative numbers and constant expressions, e.g.: template class x {}; %template(x_minus1) x<-1>; %template(x_1plus2) x<1+2>; Also, constant expressions can now include comparisons (>, <, >=, <=, !=, ==), modulus (%), and ternary conditionals (a ? b : c). Fixes bugs #646275, #925555, #956282, #994301. 09/22/2006: wsfulton Fix %ignore on director methods - Bugs #1546254, #1543533 09/20/2006: wsfulton Fix %ignore on director constructors 09/20/2006: wsfulton Fix seg faults and asserts when director methods are ignored (#1543533) 09/20/2006: wsfulton Fix out of source builds - bug #1544718 09/20/2006: olly Treat a nested class definition as a forward declaration rather than ignoring it completely, so that we generate correct code for passing opaque pointers to the nested class (fixes SF bug #909387). 09/20/2006: olly *** POTENTIAL INCOMPATIBILITY *** [php] Overload resolution now works. However to allow this, SWIG generated wrappers no longer coerce PHP types (which reverts a change made in 1.3.26). So for example, if a method takes a string, you can no longer pass a number without explicitly converting it to a string in PHP using: (string)x 09/18/2006: mgossage [ALL] fix on swiginit.swg, has been reported to crash on several test cases found and fixed problem in imports under python (mingw) 09/16/2006: wsfulton [Python] Patch from Michal Marek for Python 2.5 to fix 64 bit array indexes on 64 bit machines. 09/13/2006: wsfulton The explicitcall feature has been scrapped. This feature was introduced primarily to solve recursive director method calls. Director upcall improvements made instead: [Python, Ruby, Ocaml] The swig_up flag is no longer used. The required mutexes wrapping this flag are also no longer needed. The recursive calls going from C++ to the target language and back again etc are now avoided by a subtlely different approach. Instead of using the swig_up flag in each director method to indicate whether the explicit C++ call to the appropriate base class method or a normal polymorphic C++ call should be made, the new approach makes one of these calls directly from the wrapper method. [Java, C#] The recursive call problem when calling a C++ base class method from Java/C# is now fixed. The implementation is slightly different to the other languages as the detection as to whether the explicit call or a normal polymorphic call is made in the Java/C# layer rather than in the C++ layer. 09/11/2006: mgossage [ALL] updated swiginit.swg to allow multiple interpreters to use multiple swig modules at once. This has been tested in Lua (mingw & linux), perl5 & python (linux) only. 09/11/2006: mgossage [lua] added support for passing function pointers as well as native lua object into wrappered function. Added example funcptr3 to demonstrate this feature 09/05/2006: olly [php] Rename ErrorCode and ErrorMsg #define-s to SWIG_ErrorCode and SWIG_ErrorMsg to avoid clashes with code the user might be wrapping (patch from Darren Warner in SF bug #1466086). Any user typemaps which use ErrorCode and/or ErrorMsg directly will need adjusting - you can easily fix them to work with both old and new SWIG by changing to use SWIG_ErrorMsg and adding: #ifndef SWIG_ErrorMsg #define SWIG_ErrorMsg() ErrorMsg() #endif 08/29/2006: olly [php] Move constant initialisation from RINIT to MINIT to fix a warning when using Apache and mod_php. We only need to create PHP constants once when we're first initialised, not for every HTTP request. 08/21/2006: mgossage [Lua] Bugfix #1542466 added code to allow mapping Lua nil's <-> C/C++ NULL's updated various typemaps to work correctly with the changes added voidtest_runme.lua to show the features working 08/19/2006: wuzzeb (John Lenz) [Guile] Add feature:constasvar to export constants as variables instead of functions that return the constant value. 08/11/2006: wsfulton [Java] DetachCurrentThread calls have been added so that natively created threads no longer prevent the JVM from exiting. Bug reported by Thomas Dudziak and Paul Noll. 08/10/2006: wsfulton [C#] Fix director protected methods so they work 07/25/2006: mutandiz [allegrocl] more additions to std::string, some tweaks and small bug fixes -nocwrap mode. 07/21/2006: mgossage [Lua] Bugfix #1526022 pdated std::string to support strings with '\0' inside them updated typemaps.i to add support for pointer to pointers 07/19/2006: mutandiz [allegrocl] - Add std_string.i support. - Add newobject patch submitted by mkoeppe (thanks!) - Fix type name mismatch issue for nested type definitions. specifically typedefs in templated class defns. 07/18/2006: mgossage Bugfix #1522858 updated lua.cxx to support -external-runtime command 07/14/2006: wuzzeb (John Lenz) Increment the SWIG_RUNTIME_VERSION to 3, because of the addition of the owndata member in swig_type_info. Reported by: Prabhu Ramachandran 07/05/2006: wsfulton Search path fixes: - Fix search path for library files to behave as documented in Library.html. - Fix mingw/msys builds which did not find the SWIG library when installed. - Windows builds also output the mingw/msys install location when running swig -swiglib. - The non-existent and undocumented config directory in the search path has been removed. 07/05/2006: wsfulton Fix $symname special variable expansion. 07/04/2006: wuzzeb (John Lenz) [Chicken] Add %feature("constasvar"), which instead of exporting a constant as a scheme function, exports the constant as a scheme variable. Update the documentation as well. 07/04/2006: wsfulton [See entry of 09/13/2006 - explicitcall feature and documentation to it removed] New explicitcall feature which generates additional wrappers for virtual methods that call the method explicitly, not relying on polymorphism to make the method call. The feature is a feature flag and is enabled like any other feature flag. It also recognises an attribute, "suffix" for mangling the feature name, see SWIGPlus.html#SWIGPlus_explicitcall documentation for more details. [Java, C#] The explicitcall feature is also a workaround for solving the recursive calls problem when a director method makes a call to a base class method. See Java.html#java_directors_explicitcall for updated documentation. 06/28/2006: joe (Joseph Wang) [r] Initial support for R 06/20/2006: wuzzeb (John Lenz) [Chicken] Minor fixes to get apply_strings.i testsuite to pass Remove integers_runme.scm from the testsuite, because SWIG and Chicken does handle overflows. 06/19/2005: olly [php] Add support for generating PHP5 class wrappers for C++ classes (use "swig -php5"). 06/17/2006: olly [php] Added some missing keywords to the PHP4 keyword list, and fixed __LINE__ and __FILE__ which were in the wrong category. Also added all the keywords new in PHP5, and added comments noting the PHP4 keywords which aren't keywords in PHP5. 06/17/2006: olly [php] Don't segfault if PHP Null is passed as this pointer (e.g. Class_method(Null)) - give a PHP Error instead. 06/15/2006: mutandiz [allegrocl] Add initial support for std::list container class. Fix a few bugs in helper functions. 05/13/2006: wsfulton [Java] Replace JNIEXPORT with SWIGEXPORT, thereby enabling the possibility of using gcc -fvisibility=hidden for potentially smaller faster loading wrappers. 05/13/2006: wsfulton Fix for Makefiles for autoconf-2.60 beta 05/13/2006: wsfulton Vladimir Menshakov patch for compiling wrappers with python-2.5 alpha. 05/12/2006: wsfulton Fix buffer overflow error when using large %feature(docstring) reported by Joseph Winston. 05/12/2006: wsfulton [Perl] Operator overload fix from Daniel Moore. 05/25/2006: mutandiz [allegrocl] Fix bug in generation of CLOS type declarations for unions and equivalent types. 05/24/2006: mutandiz [allegrocl] Don't require a full class definition to generate a CLOS wrapper. 05/20/2006: olly [php] GCC Visibility support now works with PHP. 05/19/2006: olly [php] Removed support for -dlname (use -module instead). Fixed naming of PHP extension module to be consistent with PHP conventions (no "php_" prefix on Unix; on PHP >= 4.3.0, handle Unix platforms which use something other than ".so" as the extension.) 05/13/2006: wsfulton [C#] Director support added 05/07/2006: olly [php] Don't segfault if PHP Null is passed where a C++ reference is wanted. 05/05/2006: olly [php] Fix wrappers generated for global 'char' variables to not include a terminating zero byte in the PHP string. 05/03/2006: wsfulton Modify typemaps so that char * can be applied to unsigned char * or signed char * types and visa versa. 05/03/2006: efuzzyone [cffi]Thanks to Luke J Crook for this idea. - a struct/enum/union is replaced with :pointer only if that slot is actually a pointer to that type. So,: struct a_struct { int x; } and struct b_struct { a_struct struct_1; }; will be converted as: (cffi:defcstruct b_struct (struct_1 a_struct)) - Other minor fixes in lispifying names. 05/02/2006: wsfulton Fix possible redefinition of _CRT_SECURE_NO_DEPRECATE for VC++. 04/14/2006: efuzzyone [cffi] Thanks to Thomas Weidner for the patch. - when feature export is set (export 'foo) is generated for every symbol - when feature inline is set (declaim (inline foo)) is generated before every function definition - when feature intern_function is set #.(value-of-intern-function "name" "nodeType" package) is emitted instead of the plain symbol. A sample swig-lispify is provided. - every symbol is prefixed by it's package. 04/13/2006: efuzzyone [cffi] Fixed the generation of wrappers for global variables. Added the option [no]swig-lisp which turns on/off generation of code for swig helper lisp macro, functions, etc. Version 1.3.29 (March 21, 2006) =============================== 04/05/2006: mutandiz [allegrocl] Fix output typemap of char so it produces a character instead of an integer. Also adds input/output typemaps for 'char *'. add command-line argument -isolate to generate an interface file that won't interfere with other SWIG generated files that may be used in the same application. 03/20/2005: mutandiz [allegrocl] More tweaks to INPUT/OUTPUT typemaps for bool. Fix constantWrapper for char and string literals. find-definition keybindings should work in ELI/SLIME. Output (in-package ) to lisp wrapper instead of (in-package #.*swig-module-name*). slight rework of multiple return values. doc updates. 03/17/2005: mutandiz [allegrocl] mangle names of constants generated via constantWrapper. When using OUTPUT typemaps and the function has a non-void return value, it should be first in the values-list, followed by the OUTPUT mapped values. Fix bug with boolean parameters, which needed to be passed in as int values, rather than T or NIL. 03/15/2006: mutandiz [allegrocl] Generate wrappers for constants when in C++ or -cwrap mode. Make -cwrap the default, since it is most correct. Users can use the -nocwrap option to avoid the creation of a .cxx file when interfacing to C code. When in -nocwrap mode, improve the handling of converting infix literals to prefix notation for lisp. This is very basic and not likely to be improved upon since this only applies to the -nocwrap case. Literals we can't figure out will result in a warning and be included in the generated code. validIdentifier now more closely approximates what may be a legal common lisp symbol. Fix typemap error in allegrocl.swg 03/12/2006: mutandiz [allegrocl] fix up INPUT/OUTPUT typemaps for bool. Generate c++ style wrapper functions for struct/union members when -cwrap option specified. 03/10/2006: mutandiz [allegrocl] Fix bug in C wrapper generation introduced by last allegrocl commit. 03/10/2006: wsfulton [Java] Commit #1447337 - Delete LocalRefs at the end of director methods to fix potential leak 03/10/2006: wsfulton Fix #1444949 - configure does not honor --program-prefix. Removed non-standard configure option --with-release-suffix. Fix the autoconf standard options --program-prefix and --program-suffix which were being shown in the help, but were being ignored. Use --program-suffix instead of --with-release-suffix now. 03/10/2006: wsfulton [Java] Fix #1446319 with patch from andreasth - more than one wstring parameter in director methods 03/07/2006: mkoeppe [Guile] Fix for module names containing a "-" in non-"shadow" mode. Patch from Aaron VanDevender (#1441474). 03/04/2006: mmatus - Add -O to the main program, which now enables -fastdispatch [Python] - Add the -fastinit option to enable faster __init__ methods. Setting 'this' as 'self.this.append(this)' in the python code confuses PyLucene. Now the initialization is done in the the C++ side, as reported by Andi and Robin. - Add the -fastquery option to enable faster SWIG_TypeQuery via a python dict cache, as proposed by Andi Vajda - Avoid to call PyObject_GetAttr inside SWIG_Python_GetSwigThis, since this confuses PyLucene, as reported by Andi Vajda. 03/02/2006: wsfulton [Java] Removed extra (void *) cast when casting pointers to and from jlong as this was suppressing gcc's "dereferencing type-punned pointer will break strict-aliasing rules" warning. This warning could be ignored in versions of gcc prior to 4.0, but now the warning is useful as gcc -O2 and higher optimisation levels includes -fstrict-aliasing which generates code that doesn't work with these casts. The assignment is simply never made. Please use -fno-strict-aliasing to both suppress the warning and fix the bad assembly code generated. Note that the warning is only generated by the C compiler, but not the C++ compiler, yet the C++ compiler will also generate broken code. Alternatively use -Wno-strict-aliasing to suppress the warning for gcc-3.x. The typemaps affected are the "in" and "out" typemaps in java.swg and arrays_java.swg. Users ought to fix their own typemaps to do the same. Note that removal of the void * cast simply prevents suppression of the warning for the C compiler and nothing else. Typical change: From: %typemap(in) SWIGTYPE * %{ $1 = *($&1_ltype)(void *)&$input; %} To: %typemap(in) SWIGTYPE * %{ $1 = *($&1_ltype)&$input; %} From: %typemap(out) SWIGTYPE * %{ *($&1_ltype)(void *)&$result = $1; %} To: %typemap(out) SWIGTYPE * %{ *($&1_ltype)&$result = $1; %} 03/02/2006: mkoeppe [Guile -scm] Add typemaps for "long long"; whether the generated code compiles, however, depends on the version and configuration of Guile. 03/02/2006: wsfulton [C#] Add support for inner exceptions. If any of the delegates are called which construct a pending exception and there is already a pending exception, it will create the new exception with the pending exception as an inner exception. 03/02/2006: wsfulton [Php] Added support for Php5 exceptions if compiling against Php5 (patch from Olly Betts). 03/01/2006: mmatus Use the GCC visibility attribute in SWIGEXPORT. Now you can compile (with gcc 3.4 or later) using CFLAGS="-fvisibility=hidden". Check the difference for the 'std_containers.i' python test case: Sizes: 3305432 _std_containers.so 2383992 _std_containers.so.hidden Exported symbols (nm -D .so | wc -l): 6146 _std_containers.so 174 _std_containers.so.hidden Execution times: real 0m0.050s user 0m0.039s sys 0m0.005s _std_containers.so real 0m0.039s user 0m0.026s sys 0m0.007s _std_containers.so.hidden Read http://gcc.gnu.org/wiki/Visibility for more details. 02/27/2006: mutandiz [allegrocl] Add support for INPUT, OUTPUT, and INOUT typemaps. For OUTPUT variables, the lisp wrapper returns multiple values. 02/26/2006: mmatus [Ruby] add argcargv.i library file. Use it as follow: %include argcargv.i %apply (int ARGC, char **ARGV) { (size_t argc, const char **argv) } %inline { int mainApp(size_t argc, const char **argv) { return argc; } } then in the ruby side: args = ["asdf", "asdf2"] n = mainApp(args); This is the similar to the python version Lib/python/argcargv.i 02/24/2006: mgossage Small update Lua documents on troubleshooting problems 02/22/2006: mmatus Fix all the errors reported for 1.3.28. - fix bug #1158178 - fix bug #1060789 - fix bug #1263457 - fix 'const char*&' typemap in the UTL, reported by Geoff Hutchison - fixes for python 2.1 and the runtime library - fix copyctor + template bug #1432125 - fix [ 1432152 ] %rename friend operators in namespace - fix gcc warning reported by R. Bernstein - avoid assert when finding a recursive scope inheritance, emit a warning in the worst case, reported by Nitro - fix premature object deletion reported by Paul in tcl3d - fix warning reported by Nitro in VC7 - more fixes for old Solaris compiler - fix for python 2.3 and gc_refs issue reported by Luigi - fix fastproxy for methods using kwargs - fix overload + protected member issue reported by Colin McDonald - fix seterrormsg as reported by Colin McDonald - fix directors, now the test-suite runs again using -directors - fix for friend operator and Visual studio and bug 1432152 - fix bug #1435090 - fix using + %extend as reported by William - fix bug #1094964 - fix for Py_NotImplemented as reported by Olly and Amaury - fix nested namespace issue reported by Charlie and also: - allow director protected members by default - delete extra new lines in swigmacros[UTL] - cosmetic for generated python code - add the factory.i library for UTL - add swigregister proxy method and move __repr__ to a single global module [python] 02/22/2006: mmatus When using directors, now swig will emit all the virtual protected methods by default. In previous releases, you needed to use the 'dirprot' option to achieve the same. If you want, you can disable the new default behaviour, use the 'nodirprot' option: swig -nodirprot ... and/or the %nodirector feature for specific methods, i.e.: %nodirector Foo::bar; struct Foo { virtual ~Foo(); protected: virtual void bar(); }; As before, pure abstract protected members are allways emitted, independent of the 'dirprot/nodirprot' options. 02/22/2006: mmatus Add the factory.i library for languages using the UTL (python,tcl,ruby,perl). factory.i implements a more natural wrap for factory methods. For example, if you have: ---- geometry.h -------- struct Geometry { enum GeomType{ POINT, CIRCLE }; virtual ~Geometry() {} virtual int draw() = 0; // // Factory method for all the Geometry objects // static Geometry *create(GeomType i); }; struct Point : Geometry { int draw() { return 1; } double width() { return 1.0; } }; struct Circle : Geometry { int draw() { return 2; } double radius() { return 1.5; } }; // // Factory method for all the Geometry objects // Geometry *Geometry::create(GeomType type) { switch (type) { case POINT: return new Point(); case CIRCLE: return new Circle(); default: return 0; } } ---- geometry.h -------- You can use the %factory with the Geometry::create method as follows: %newobject Geometry::create; %factory(Geometry *Geometry::create, Point, Circle); %include "geometry.h" and Geometry::create will return a 'Point' or 'Circle' instance instead of the plain 'Geometry' type. For example, in python: circle = Geometry.create(Geometry.CIRCLE) r = circle.radius() where 'circle' now is a Circle proxy instance. 02/17/2006: mkoeppe [MzScheme] Typemaps for all integral types now accept the full range of integral values, and they signal an error when a value outside the valid range is passed. [Guile] Typemaps for all integral types now signal an error when a value outside the valid range is passed. 02/13/2006: mgossage [Documents] updated the extending documents to give a skeleton swigging code with a few typemaps. [Lua] added an extra typemap for void* [in], so a function which requires a void* can take any kind of pointer Version 1.3.28 (February 12, 2006) ================================== 02/11/2006: mmatus Fix many issues with line counting and error reports. 02/11/2006: mmatus [Python] Better static data member support, if you have struct Foo { static int bar; }; then now is valid to access the static data member, ie: f = Foo() f.bar = 3 just as in C++. 02/11/2006: wsfulton [Perl] Fixed code generation to work again with old versions of Perl (5.004 and later tested) 02/04/2006: mmatus [Python] Add the %extend_smart_pointer() directive to extend SWIG smart pointer support in python. For example, if you have a smart pointer as: template class RCPtr { public: ... RCPtr(Type *p); Type * operator->() const; ... }; you use the %extend_smart_pointer directive as: %extend_smart_pointer(RCPtr); %template(RCPtr_A) RCPtr; then, if you have something like: RCPtr make_ptr(); int foo(A *); you can do the following: a = make_ptr(); b = foo(a); ie, swig will accept a RCPtr object where a 'A *' is expected. Also, when using vectors %extend_smart_pointer(RCPtr); %template(RCPtr_A) RCPtr; %template(vector_A) std::vector >; you can type a = A(); v = vector_A(2) v[0] = a ie, an 'A *' object is accepted, via implicit conversion, where a RCPtr object is expected. Additionally x = v[0] returns (and sets 'x' as) a copy of v[0], making reference counting possible and consistent. %extend_smart_pointer is just a collections of new/old tricks, including %typemaps and the new %implicitconv directive. 02/02/2006: mgossage bugfix #1356577, changed double=>lua_number in a few places. added the std::pair wrapping 01/30/2006: wsfulton std::string and std::wstring member variables and global variables now use %naturalvar by default, meaning they will now be wrapped as expected in all languages. Previously these were wrapped as a pointer rather than a target language string. It is no longer necessary to add the following workaround to wrap these as strings: %apply const std::string & { std::string *} *** POTENTIAL INCOMPATIBILITY *** 01/28/2006: mkoeppe [Guile -scm] Add typemaps for handling of member function pointers. 01/24/2006: mmatus - Better support for the %naturalvar directive, now it works with the scripting languages as well as Java/C#. Now, it can also be applied to class types: %naturalvar std::string; %include that will tell swig to use the 'natural' wrapping mechanism to all std::string global and member variables. - Add support for the %allowexcept feature along the scripting languages, which allows the %exception feature to be applied to the variable access methods. Also, add the %exceptionvar directive to specify a distintic exception mechanism only for variables. - Add more docs for the %delobject directive to mark a method as a destructor, 'disowning' the first argument. For example: %newobject create_foo; %delobject destroy_foo; Foo *create_foo() { return new Foo(); } void destroy_foo(Foo *foo) { delete foo; } or in a member method as: %delobject Foo::destroy; class Foo { public: void destroy() { delete this;} private: ~Foo(); }; 01/24/2006: mgossage [Lua] - Removed the type swig_lua_command_info & replace with luaL_reg (which then broke the code), fixed this - added an additional cast in the typemaps for enum's due to the issue that VC.Net will not allow casting of a double to an enum directly. Therefore cast to int then to enum (thanks to Jason Rego for this observation) 01/16/2006: mmatus (Change disabled... will be back in CVS soon) Add initial support for regexp via the external library RxSpencer. SWIG doesn't require this library to compile and/or run. But if you specify --with-rxspencer, and the library is found during installation, then swig will use it in three places: - In %renames rules, via the new rxsmatch rules, for example: %rename("%(lowercase)",rxsmatch$name="GSL_.*") ""; %rename("%(lowercase)",rxsmatch$nodeType="enum GSL_.*") ""; rxsmatch is similar to the match rule, it just uses the RxSpencer regexp library to decide if there is a match with the provided regexp. As with the match rule, you can also use the negate rule notrxsmatch. - In the %rename target name via the rxstarget option, for example: %rename("%(lowercase)",rxstarget=1) "GSL_.*"; where the target name "GSL.*" is now understood as a regexp to be matched. - In the new encoder "rxspencer", which looks like: %(rxspencer:[regexp][replace])s where "regexp" is the regular expression and "replace" is a string used as a replacement, where the @0,@1,...,@9 pseudo arguments are used to represent the corresponding matching items in the reg expression. For example: %(rxspencer:[GSL.*][@0])s <- Hello -> %(rxspencer:[GSL.*][@0])s <- GSLHello -> GSLHello %(rxspencer:[GSL(.*)][@1])s <- GSLHello -> Hello %(rxspencer:[GSL(.*)][gsl@1])s <- GSLHello -> gslHello Another example could be: %rename("%(lowercase)s",sourcefmt="%(rxspencer:[GSL_(.*)][@1])s",%$isfunction) ""; which take out the prefix "GSL_" and returns all the function names in lower cases, as following: void GSL_Hello(); -> hello(); void GSL_Hi(); -> hi(); const int GSL_MAX; -> GSL_MAX; // no change, is not a function We use the RxSpencer as an initial test bed to implemention while we decide which library will be finally added to swig. You can obtain the RxSpencer library from http://arglist.com/regex (Unix) or http://gnuwin32.sourceforge.net/packages.html (Windows) Once installed, use "man rxspencer" to get more info about the regexp format, or just google rxspencer. Since now you can enable the rxsmatch rules (see above), the simple or '|' support for the match rules (01/12/2006: mmatus) is disabled. Still, if you have problems with the rxspencer library, you can re-enable the simple 'match or' support using -DSWIG_USE_SIMPLE_MATCHOR. 01/16/2006: mmatus Change the %rename predicates to use the prefix '%$', as in: %rename("%(utitle)s",%$isfunction,%$ismember) ""; to avoid clashes with other swig macros/directives. 01/14/2006: cfisavage [Ruby] Added support for Ruby bang! methods via a new %bang feature. Bang methods end in exclamation points and indicate that the object being processed will be modified in-place as opposed to being copied. 01/12/2006: cfisavage [Ruby] Updated the Ruby module to automatically convert method names to lower_case_with_underscores using the new %rename functionality. 01/12/2006: mmatus - Add aliases for 'case' encoders used with %rename/%namewarn %(uppercase)s hello_world -> HELLO_WORLD %(lowercase)s HelloWorld -> helloworld %(camelcase)s hello_world -> HelloWorld %(undercase)s HelloWorld -> hello_world 01/12/2006: mmatus - Add the -dump_parse_module and -dump_parse_top options, which are similar to -dump_module and -dump_top, but they dump the node trees just after parsing, showing only the attributes visible at the parsing stage, and not the added later in typemap.cxx, allocate.cxx, lang.cxx or elsewhere. Besides debugging porpuses, these options are very useful if you plan to use %rename in an "advance way", since it shows only and all the node's attributes you can use inside the match rules. 01/12/2006: mmatus - Add predicates to %rename, so, you don't need to remember, for example, how to match a member function. Now it is easy, for example to use the 'utitle' encoder in all the member methods, you type: %rename("%(utitle)s",%isfunction,%ismember) ""; or to ignore all the enumitems in a given class: %rename("$ignore", %isenumitem, %classname="MyClass") ""; Available predicates are (see swig.swg): %isenum %isenumitem %isaccess %isclass %isextend %isextend %isconstructor %isdestructor %isnamespace %istemplate %isconstant %isunion %isfunction %isvariable %isimmutable %isstatic %isfriend %istypedef %isvirtual %isexplicit %isextern %ismember %isglobal %innamespace %ispublic %isprotected %isprivate %classname These predicates correspond to specific 'match' declarations, which sometimes are not as evident as the predicates names. - Add the or '|' operation in %rename match, for example to capitalize all the constants (%constant or const cdecl): %rename("%(upper)s",match="cdecl|constant",%isimmutable) ""; 01/12/2006: mgossage - Partial fixed of errors under C89, bug #1356574 (converted C++ style comments to C style) - Added patches from neomantra@users.sf.net #1379988 and #1388343 missing a 'return' statement for error conditions also updated the %init block bug #1356586 01/10/2006: mmatus - Add the 'utitle' encoder, as an example of how to add your own encoder. I added the encoder method in misc.c but developers can add others, the same way, inside any target language. Well, 'utitle' is the reverse of 'ctitle', ie: %rename("%(ctitle)s") camel_case; -> CamelCase; %rename("%(utitle)s") CamelCase; -> camel_case; 01/10/2006: cfisavage [Ruby] Updated Ruby Exception handling. Classes that are specified in throws clauses, or are marked as %exceptionclass, are now inherited from rb_eRuntimeError. This allows instances of these classes to be returned to Ruby as exceptions. Thus if a C++ method throws an instance of MyException, the calling Ruby method will get back a MyException object. To see an example, look at ruby/examples/exception_class. 01/10/2006: mmatus - Add the %catches directive, which complements the %exception directive in a more automatic way. For example, if you have int foo() throw(E1); swig generates the proper try/catch code to dispatch E1. But if you have: int barfoo(int i) { if (i == 1) { throw E1(); } else { throw E2(); } return 0; } ie, where there is no explicit exception specification in the decl, you end up doing: %exception barfoo { try { $action } catch(E1) { ... } } catch(E2) { ... } } which is very tedious. Well, the %catches directive defines the list of exceptions to catch, and from swig: %catches(E1,E2) barfoo(int i); int barfoo(int i); is equivalent to int barfoo(int i) throw(E1,E2); Note, however, that the %catches list doesn't have to correspond to the C++ exception specification. For example, if you have: struct E {}; struct E1 : E {}; struct E2 : E {}; int barfoo(int i) throw(E1,E2); you can define %catches(E) barfoo(int i); and swig will generate an action code equivalent to try { $action } catch(E &_e) { ; } Of course, you still have to satisfy the C++ restrictions, and the catches list must be compatible (not the same) as the original list of types in the exception specification. Also, you can now specify that you want to catch the unknown exception '...', for example: %catches(E1,E2,...) barfoo(int); In any case, the %catches directive will emit the code to convert into the target language error/exception using the 'throws' typemap. For the '...' case to work, you need to write the proper typemap in your target language. In the UTL, this looks like: %typemap(throws) (...) { SWIG_exception(SWIG_RuntimeError,"unknown exception"); } 01/09/2006: mutandiz [Allegrocl] Fixes a number of SEGVs primarily in the handling of various anonymous types. Found in a pass through the swig test-suite. Still more to do here, but this is a good checkpoint. Adds -cwrap and -nocwrap as an allegrocl specific command-line argument. Controls generating of a C wrapper file when wrapping C code. By default only a lisp file is created for C code wrapping. Doc updates for the command-line arguments and fixes as pointed out on swig-devel 01/05/2006: wsfulton [Java] Fix unsigned long long and const unsigned long long & typemaps - Bug #1398394 with patch from Dries Decock 01/06/2006: mmatus Add 'named' warning codes, now in addition to: %warnfilter(813); you can use %warnfilter(SWIGWARN_JAVA_MULTIPLE_INHERITANCE); just use the same code name found in Source/Include/swigwarn.h plus the 'SWIG' prefix. If a developer adds a new warning code, the Lib/swigwarn.swg file will be generated when running the top level make. 01/05/2006: cfisavage [Ruby] Reimplemented object tracking for Ruby. The new implementation works by expanding the swig_class structure for Ruby by adding a trackObjects field. This field can be set/unset via %trackobjects as explained in the Ruby documentation. The new implementation is more robust and takes less code to implement. 01/05/2006: wsfulton Fix for %extend and static const integral types, eg: class Foo { public: %extend { static const int bar = 42; } }; 12/30/2005: mmatus - Add info for old and new debug options: -dump_top - Print information of the entire node tree, including system nodes -dump_module - Print information of the module node tree, avoiding system nodes -dump_classes - Print information about the classes found in the interface -dump_typedef - Print information about the types and typedefs found in the interface -dump_tags - Print information about the tags found in the interface -debug_typemap - Print information for debugging typemaps -debug_template - Print information for debugging templates - Add the fakeversion. If you have a project that uses configure/setup.py, or another automatic building system and requires a specific swig version, let say 1.3.22 you can use: SWIG_FEATURES="-fakeversion 1.3.22" or swig -fakeversion 1.3.22 and then swig -version will report 1.3.22 instead of the current version. Typical use would be SWIG_FEATURES="-fakeversion 1.3.22" ./configure 12/30/2005: mmatus - Add option/format support to %rename and %namewarn. Now %namewarn can force renaming, for example: %namewarn("314: import is a keyword",rename="_%s") "import"; and rename can also support format forms: %rename("swig_%s") import; Now, since the format is processed via swig Printf, you can use encoders as follows: %rename("%(title)s") import; -> Import %rename("%(upper)s") import; -> IMPORT %rename("%(lower)s") Import; -> import %rename("%(ctitle)s") camel_case; -> CamelCase This will allow us to add more encoders, as the expected one for regular expressions. - Add the above 'ctitle' encoder, which does the camel case: camel_case -> CamelCase - Also, while we get the regexp support, add the 'command' encoder, you can use it as follows %rename("%(command:sed -e 's/\([a-z]\)/\U\\1/' <<< )s") import; then swig will popen the command "sed -e 's/\([a-z]\)/\U\\1/' <<< import" see below for anonymous renames for better examples. - The rename directive now also allows: - simple match: only apply the rename if a type match happen, for example %rename(%(title)s,match="enumitem") hello; enum Hello { hi, hello -> hi, Hello }; int hello() -> hello; - extended match: only apply the rename if the 'extended attribute' match occurred, for example: // same as simple match %rename(%(title)s,match$nodeType="enumitem") hello; enum Hello { hi, hello -> hi, Hello }; Note that the symbol '$' is used to define the attribute name in a 'recursive' way, for example: // match only hello in 'enum Hello' %rename(%(title)s,match$parentNode$type="enum Hello") hello; enum Hello { hi, hello -> hi, Hello // match }; enum Hi { hi, hello -> hi, hello // no match }; here, for Hello::hi, the "parentNode" is "Hello", and its "type" is "enum Hello". - Anonymous renames: you can use 'anonymous' rename directives, for example: // rename all the enum items in Hello %rename(%(title)s,match$parentNode$type="enum Hello") ""; enum Hello { hi, hello -> Hi, Hello // match both }; enum Hi { hi, hello -> hi, hello // no match }; // rename all the enum items %rename(%(title)s,match$nodeType="enumitem") ""; // rename all the items in given command (sloooow, but...) %rename(%(command:)s) ""; Anonymous renames with commands can be very powerful, since you can 'outsource' all the renaming mechanism (or part of it) to an external program: // Uppercase all (and only) the names that start with 'i' %rename("%(command:awk '/^i/{print toupper($1)}' <<<)s") ""; int imported() -> IMPORTED; int hello() -> hello Note that if the 'command' encoder returns an empty string, swig understands that no rename is necessary. Also note that %rename 'passes' the matched name. For example, in this case namespace ns1 { int foo(); } namespace ns2 { int bar(); } the external program only receives "foo" and "bar". If needed, however, you can request the 'fullname' %rename("%(command:awk 'awk '/ns1::/{l=split($1,a,"::"); print toupper(a[l])}'' <<<)s",fullname=1) ""; ns1::foo -> FOO ns2::bar -> bar - Mixing encoders and matching: of course, you can do mix commands and match fields, for example: %rename("%()",match="cdecl") ""; %rename("%()",match="enumitem") ""; %rename("%()",match="enumitem", match$parentNode$parentNode$nodeType="class") ""; Use "swig -dump_parse_module" to see the attribute names you can use to match a specific case. - 'sourcefmt' and 'targetfmt': sometimes you need to process the 'source' name before comparing, for example %namewarn("314: empty is a keyword",sourcefmt="%(lower)s") "empty"; then if you have int Empty(); // "Empty" is the source you will get the keyword warning since 'Empty' will be lower cased, via the sourcefmt="%(lower)s" option, before been compared to the 'target' "empty". There is an additional 'targetfmt' option to process the 'target' before comparing. - complementing 'match': you can use 'notmatch', for example %namewarn("314: empty is a keyword",sourcefmt="%(lower)s",notmatch="namespace") "empty"; here, the name warning will be applied to all the symbols except namespaces. 12/30/2005: mmatus - Add initial support for gcj and Java -> mechanism. See examples in: Examples/python/java Examples/ruby/java Examples/tcl/java to see how to use gcj+swig to export java classes into python/ruby/tcl. The idea is to put all the common code for gcj inside Lib/gcj and localize specific types such as jstring, as can be found in Lib/python/jstring.i Lib/ruby/jstring.i Lib/tcl/jstring.i Using the UTL, this is very easy, and the perl version for jstring.i will be next. 12/29/2005: mmatus - Add the copyctor feature/directive/option to enable the automatic generation of copy constructors. Use as in: %copyctor A; struct A { }; then this will work a1 = A(); a2 = A(a1); Also, since it is a feature, if you just type %copyctor; that will enable the automatic generation for all the classes. It is also equivalent to swig -copyctor -c++ ... Notes: 1.- The feature only works in C++ mode. 2.- The automatic creation of the copy constructor will usually produce overloading. Hence, if the target language doesn't support overloading, a special name will be used (A_copy). 3.- For the overloading reasons above, it is probably not a good idea to use the flag when, for example, you are using keywords in Python. 4.- The copyctor automatic mechanism follows more or less the same rules as the default constructor mechanism, i.e., a copy constructor will not be added if the class is abstract or if there is a pertinent non-public copy ctor in the class or its hierarchy. Hence, it might be necessary for you to complete the class declaration with the proper non-public copy ctor to avoid a wrong constructor addition. - Fix features/rename for templates ctor/dtor and other things around while adding the copyctor mechanism. 12/27/2005: mmatus - Add the 'match' option to typemaps. Assume you have: %typemap(in) SWIGTYPE * (int res) {..} %typemap(freearg) SWIGTYPE * { if (res$argnum) ...} then if you do %typemap(in) A * {...} swig will 'overload the 'in' typemap, but the 'freearg' typemap will be also applied, even when this is wrong. The old solutions is to write: %typemap(in) A * {...} %typemap(freeag) A * ""; overload 'freearg' with an empty definition. The problem is, however, there is no way to know you need to do that until you start getting broken C++ code, or worse, broken runtime code. The same applies to the infamous 'typecheck' typemap, which always confuses people, since the first thing you do is to just write the 'in' typemap. The 'match' option solves the problem, and if instead you write: %typemap(in) SWIGTYPE * (int res) {..} %typemap(freearg,match="in") SWIGTYPE * { if (res$argnum) ...} %typemap(typecheck,match="in",precedence...) SWIGTYPE * {...} it will tell swig to apply the 'freearg/typecheck' typemaps only if they 'match' the type of the 'in' typemap. The same can be done with other typemaps as: %typemap(directorout) SWIGTYPE * {...} %typemap(directorfree,match="directorout") SWIGTYPE * {...} 12/27/2005: mmatus - Add the 'naturalvar' option/mode/feature to treat member variables in a more natural way, ie, similar to the global variable behavior. You can use it in a global way via the command line swig -naturalvar ... or the module mode option %module(naturalvar=1) both forms make swig treat all the member variables in the same way it treats global variables. Also, you can use it in a case by case approach for specific member variables using the directive form: %naturalvar Bar::s; Then, in the following case for example: std::string s; struct Bar { std::string s; }; you can do: b = Bar() b.s ="hello" cvar.s = "hello" if (b.s != cvar.s): raise RuntimeError This is valid for all the languages, and the implementation is based on forcing the use of the const SWIGTYPE& (C++)/SWIGTYPE (C) typemaps for the get/set methods instead of the SWIGTYPE * typemaps. Hence, for 'naturalvar' to work, each target language must implement 'typemap(in/out) const Type&' properly. The 'naturalvar' option replaces or makes workarounds such as: %apply const std::string & { std::string *} unnecessary. Note1: If your interface has other kinds of workarounds to deal with the old 'unnatural' way to deal with member variables (returning/expecting pointers), the 'naturalvar' option could break them. Note2: the option has no effect on unnamed types, such as unnamed nested unions. 12/27/2005: mmatus - Add more 'expressive' result states for the typemap libraries. In the past, for scripting languages, you would do checking something like: if (ConvertPtr(obj,&vptr,ty,flags) != -1) { // success } else { // error } Now the result state can carry more information, including: - Error state: like the old -1/0, but with error codes from swigerrors.swg. int res = ConvertPtr(obj,&vptr,ty,flags); if (SWIG_IsOK(res)) { // success code } else { SWIG_Error(res); // res carries the error code } - Cast rank: when returning a simple successful conversion, you just return SWIG_OK, but if you need to do a 'cast', you can add the casting rank, ie: if (PyFloat_Check(obj)) { value = PyFloat_AsDouble(obj); return SWIG_OK; } else if (PyInt_Check(obj)) { value = (double) PyInt_AsLong(obj); return SWIG_AddCast(SWIG_OK); } later, the casting rank is used to properly dispatch the overloaded function, for example. This of course requires your language to support and use the new dispatch cast/rank mechanism (Now mainly supported in perl and python, and easily expandable to ruby and tcl). - [UTL] Add support for the new 'expressive' result states. 12/27/2005: mmatus - Add support for the C++ implicit conversion mechanism, which required some modifications in parser.y (to recognize 'explicit') and overload.cxx (to replace $implicitconv as needed). Still, real support in each target language requires each target language to be modified. Python provides an example, see below. - Add support for native C++ implicit conversions, ie, if you have %implicitconv A; struct A { int ii; A() {ii = 1;} A(int) {ii = 2;} A(double) {ii = 3;} explicit A(char *s) {ii = 4;} }; int get(const A& a) {return a.ii;} you can call: a = A() ai = A(1) ad = A(1.0) as = A("hello") # old forms get(a) -> 1 get(ai) -> 2 get(ad) -> 3 get(as) -> 4 #implicit conversions get(1) -> 2 get(1.0) -> 3 get("hello") -> Error, explicit constructor Also, as in C++, now implicit conversions are supported in variable assigments, and if you have: A ga; struct Bar { A a; }; you can do: cvar.ga = A(1) cvar.ga = 1 cvar.ga = 1.0 cvar.ga = A("hello") cvar.ga = "hello" -> error, explicit constructor b = Bar() b.a = A("hello") b.a = 1 b.a = 1.0 b.a = "hello" -> error, explicit constructor Note that the last case, assigning a member var directly, also requires the 'naturalvar' option. This support now makes the old '%implicit' macro, which was found in 'implicit.i' and it was fragile in many ways, obsolete, and you should use the new '%implicitconv' directive instead. Note that we follow the C++ conventions, ie, in the following the implicit conversion is allowed: int get(A a) {return a.ii;} int get(const A& a) {return a.ii;} but not in these cases: int get(A *a) {return a->ii;} int get(A& a) {return a.ii;} Also, it works for director methods that return a by value result, ie, the following will work: virtual A get_a() = 0; def get_a(self): return 1 but not in this case: virtual const A& get_a() = 0; virtual A& get_a() = 0; virtual A* get_a() = 0; Notes: - the implicitconv mechanism is implemented by directly calling/dispatching the python constructor, triggering a call to the __init__method. Hence, if you expanded the __init__ method, like in: class A: def __init__(self,args): then 'my code' will also be executed. - Since the %implicitconv directive is a SWIG feature, if you type: %implicitconv; that will enable implicit conversion for all the classes in your module. But if you are worried about performance, maybe that will be too much, especially if you have overloaded methods, since to resolve the dispatching problem, python will efectively try to call all the implicit constructors as needed. - For the same reason, it is highly recommended that you use the new 'castmode' when mixing implicit conversion and overloading. - [python] The %implicit directive is declared obsolete, and you should use %implicitconv instead. If you include the implicit.i file, a warning will remind you of this. Note: Since %implicit is fragile, just replacing it by %implicitconv could lead to different behavior. Hence, we don't automatically switch from to the other, and the user must migrate to the new %implicitconv directive manually. 12/26/2005: wsfulton [C#] Modify std::vector wrappers to use std::vector::value_type as this is closer to the real STL declarations for some methods, eg for push_back(). Fixes some compilation errors for some compilers eg when the templated type is a pointer. [Java] std::vector improvements - a few more methods are wrapped and specializations are no longer required. The specialize_std_vector macro is no longer needed (a warning is issued if an attempt is made to use it). 12/26/2005: wsfulton [Java, C#] Add in pointer reference typemaps. This also enables one to easily wrap std::vector where T is a pointer. 12/24/2005: efuzzyone [CFFI] The cffi module for SWIG: - Fully supports C, but provides limited supports for C++, in particular C++ support for templates and overloading needs to be worked upon. 12/23/2005: mmatus [python] Add the castmode that allows the python type casting to occur. For example, if you have 'int foo(int)', now class Ai(): def __init__(self,x): self.x = x def __int__(self): return self.x foo(1) // Ok foo(1.0) // Ok foo(1.3) // Error a = Ai(4) foo(ai) // Ok The castmode, which can be enabled either with the '-castmode' option or the %module("castmode") option, uses the new cast/rank dispatch mechanism. Hence, now if you have 'int foo(int); int foo(double);', the following works as expected: foo(1) -> foo(int) foo(1.0) -> foo(double) ai = Ai(4) foo(ai) -> foo(int) Note1: the 'castmode' could disrupt some specialized typemaps. In particular, the "implicit.i" library seems to have problem with the castmode. But besides that one, the entire test-suite compiles fine with and without the castmode. Note2: the cast mode can't be combined with the fast dispatch mode, ie, the -fastdispatch option has no effect when the cast mode is selected. The penalties, however, are minimum since the cast dispatch code is already based on the same fast dispatch mechanism. See the file overload_dispatch_cast_runme.py file for new cases and examples. 12/22/2005: mmatus Add the cast and rank mechanism to dispatch overloading functions. The UTF supports it now, but for each language it must be decided how to implement and/or when to use it. [perl] Now perl uses the new cast and rank dispatch mechanism, which solves all the past problems known in perl, such as the old '+ 1' problem: int foo(int); $n = 1 $n = $n + 1 $r = foo(n) also works: foo(1); foo("1"); foo(1.0); foo("1.0"); but fails foo("l"); and when overloading foo(int) and foo(double); foo(1) -> foo(int) foo(1.0) -> foo(double) foo("1") -> foo(int) foo("1.0") -> foo(double) foo("l") -> error foo($n) -> foo(int) for good perl versions foo($n) -> foo(double) for old bad perl versions when overloading foo(int), foo(char*) and foo(double): foo(1) -> foo(int) foo(1.0) -> foo(double) foo("1") -> foo(char*) foo("1.0") -> foo(char*) foo("l") -> foo(char*) Note: In perl the old dispatch mechanism was broken, so, we don't provide an option to enable the old one since, again, it was really really broken. See 'overload_simple_runme.pl' for more cases and tests. PS: all the old known issues are declared resolved, any new "problem" that could be discovered is declared, a priori, as "features" of the new dispatch mechanism (until we find another solution at least). *** POTENTIAL INCOMPATIBILITY *** As with the introduction of the UTF, some things could now start to work as expected, and people used to deal or workaround previous bugs related to the dispatch mechanism, could see now a difference in perl behavior. 12/21/2005: mmatus - The '-nodefault' flag (pragma and feature) now generates a warning, and recommends to use the explicit -nodefaultctor and -nodefaultdtor options. The reason to split the 'nodefault' behavior is that, in general, ignoring the default destructor generates memory leaks in the target language. Hence, is too risky just to disable both the default constructor and destructor at the same time. If you need to disable the default destructor, it is also recommended you use the directive form: %nodefaultdtor MyVerySpecialClass; for specific classes, and always avoid using the global -nodefault and -nodefaultdtor options. 12/21/2005: wsfulton [Java, C#] Fix incorrect code generation when the intermediary classname is changed in the module directive from its default. For example: %module(jniclassname="myimclassnewname") "mymodule" // Java %module(imclassname="myimclassnewname") "mymodule" // C# Add in new special variable $imclassname. See docs. 12/17/2005: mmatus [Python] - Add the -aliasobj0/-noaliasobj0 options to use with -fastunpack and/or -O and old typemaps that use 'obj0' directly. So, if you compile your code using -O and get errors about the undeclared 'obj0' variable, run again using swig -O -aliasobj0 -python .... For new typemaps, never use 'obj0' directly, if needed, use the '$self' name that will be properly expanded to 'obj0' (nofastunpack) or 'swig_obj[0]' (fastunpack). If you have no idea what I am talking about, better, that means you have no typemap with this problem. 12/14/2005: mmatus [Python] - Add the -fastunpack/-nofastunpack options to enable/disable the use of the internal UnpackTuple method, instead of calling the one from the python C API. The option -O now also implies -fastunpack. 12/11/2005: mmatus [Python] - Add the -proxydel/-noproxydel options to enable/disable the generation of proxy/shadow __del__ methods, even when now they are redundant, since they are empty. However, old interfaces could rely on calling them. The default behavior is to generate the __del__ methods as in 1.3.27 or older swig versions. The option -O now also implies -noproxydel. 12/10/2005: mmatus [UTF] - Fix unnecessary calls to SWIG_TypeQuery for 'char *' and 'wchar_t *', problem found by Clay Culver while profiling the PyOgre project. [Python] - Add the -dirvtable/-nodirvtable to enable/disable a pseudo virtual table used for directors, avoiding the need to resolve the python method at each call. - Add the -safecstrings/-nosafecstrings options to enable/disable the use of safe conversions from PyString to char *. Python requires you to never change the internal buffer directly, and hence 'safectrings' warranties that but returning a copy of the internal python string buffer. The default, as in previous releases, is to return a pointer to the buffer (nosafecstrings), so, it is the user's responsibility to avoid its modification. - Add the -O option to enable all the optimization options at once, initially equivalent to -modern -fastdispatch -dirvtable -nosafecstrings -fvirtual 12/08/2005: mmatus - Add the -fastdispatch option (fastdispatch feature). This enables the "fast dispatch" mechanism for overloaded methods provided by Salvador Fandi~no Garc'ia (#930586). The resulting code is smaller and faster since less type checking is performed. However, the error messages you get when the overloading is not resolved could be different from what the traditional method returns. With the old method you always get an error such as "No matching function for overloaded ..." with the new method you can also get errors such as "Type error in argument 1 of type ..." See bug report #930586 for more details. So, this optimization must be explicitly enabled by users. The new mechanism can be used as: swig -fastdispatch or using the feature form %feature("fastdispatch") method; or %fastdispatch method; 12/06/2005: mmatus - Several memory and speed improvements, specially for templates. Now swig is up to 20 faster than before for large template interfaces, such as the std_containers.i and template_matrix.i files in the python test-suite. Memory footprint is also reduced in consideration of small pcs/architectures. - add commandline options -cpperraswarn and -nocpperraswarn" to force the swig preprocessor to treat the #error directive as a #warning. the pragmas #pragma SWIG cpperraswarn=1 #pragma SWIG cpperraswarn=0 are equivalent to the command line options, respectively. 12/06/2005: mmatus [Python] The generated code is now more portable, especially for Windows. Following http://www.python.org/doc/faq/windows.html Py_None is never accessed as a structure, plus other tricks mentioned there. 12/06/2005: mmatus [Python] Added initial support for threads based in the proposal by Joseph Winston. The user interface is as follows: 1.- the module thread support is enable via the "threads" module option, i.e. %module("threads"=1) 2.- Equivalent to that, is the new '-threads' swig option swig -threads -python ... 3.- You can partially disable thread support for a given method using: %feature("nothread") method; or %nothread method; also, you can disable sections of the thread support, for example %feature("nothreadblock") method; or %nothreadblock method; %feature("nothreadallow") method; or %nothreadallow method; the first disables the C++/python thread protection, and the second disables the python/C++ thread protection. 4.- The current thread support is based in the PyGIL extension present in python version 2.3 or later, but you can provide the thread code for older versions by defining the macros in pythreads.swg. If you get a working implementation for older versions, please send us a patch. For the curious about performance, here are some numbers for the profiletest.i test, which is used to check the speed of the wrapped code: nothread 9.6s (no thread code) nothreadblock 12.2s (only 'allow' code) nothreadallow 13.6s (only 'block' code) full thread 15.5s ('allow' + 'block' code) i.e., full thread code decreases the wrapping performance by around 60%. If that is important to your application, you can tune each method using the different 'nothread', 'nothreadblock' or 'nothreadallow' features as needed. Note that for some methods deactivating the 'thread block' or 'thread allow' code is not an option, so, be careful. 11/26/2005: wsfulton SWIG library files use system angle brackets everywhere for %include, eg %include "std_common.i" becomes %include 11/26/2005: wsfulton [Java, C#] Typesafe enums and proper enums have an extra constructor so that enum item values that are initialised by another enum item value can be wrapped without having to use %javaconstvalue/ %csconstvalue for when using %javaconst(1)/%csconst(1). Suggestion by Bob Marinier/Douglas Pearson. For example: typedef enum { xyz, last = xyz } repeat; 11/21/2005: mmatus [ruby + python] Fixes for directors + pointers. This is an ugly problem without an easy solution. Before we identified this case as problematic: virtual const MyClass& my_method(); but it turns out that all the cases where a pointer, array or reference is returned, are problematic, even for primitive types (as int, double, char*, etc). To try to fix the issue, a new typemap was added, 'directorfree', which is used to 'free' the resources allocated during the 'directorout' phase. At the same time, a primitive garbage collector engine was added to deal with orphaned addresses, when needed. The situation is much better now, but still it is possible to have memory exhaustation if recursion is used. So, still you need to avoid returning pointers, arrays or references when using director methods. - Added stdint.i - typemaps for latest C99 integral types found in stdint.h. 11/14/2005: wsfulton More types added to windows.i, eg UINT8, WORD, BYTE etc. Including windows.i will also enable SWIG to parse the __declspec Microsoft extension, eg __declspec(dllimport). Also other Windows calling conventions such as __stdcall. 11/10/2005: wsfulton New library file for Windows - windows.i. This file will contain useful type information for users who include windows.h. Initial support is for the non ISO integral types: __int8, __int16, __int32, __int64 and unsigned versions. The unsigned versions previously could not be parsed by SWIG. SF #872013. 11/09/2005: wsfulton [Java, C#] Portability warning for files which will overwrite each other on case insensitive file systems such as FAT32/NTFS. This will occur, for example, when two class names are the same barring case. The warning is issued on all platforms and can be suppressed with the usual warning suppression techniques. SF bug #1084507. 11/09/2005: wsfulton ./configure --with-python --with-ruby --with-perl5 etc enable these languages, ie the --with-xxxx options, where no path is specified, work the same as if the option was not specified at all. Based on patches #1335042 #1329048 #1329047. 11/09/2005: dancy [Allegrocl] Add C++ support to the Allegrocl module. Further enhances the C support as well. Some of the features: - MUCH better generation of foreign types based on the C/C++ types for use in defining the FFI on the lisp side. We don't pass everything as a (* :void) any longer. - Uses typemaps for better control of type conversions and code generation in the generated lisp and c++ wrapper code. - CLOS wrapping of pointers returned from foreign space makes it easier to differentiate pointers in user code. The wrapping objects can be passed directly to FF calls. - Defun wrapping of FF calls, allowing for more lispy interface. Conversion, GCing, of lisp objects to foreign objects can be done in the wrapping defun via the use of typemaps. - overload dispatching implemented on the lisp side using generic functions. - Templates and synonymous types supported. 11/07/2005: mmatus [Python] Adding proper support for multi-inheritance in the python side, ie, if you have two C++ wrapped class, Foo and Bar, now: class MyPythonClass(Foo,Bar): .... will properly work, even with directors, and the deallocation of Foo.this and Bar.this will follow correctly. Before, a class could only have one 'this' instance (unlike C++), only the last base class was properly deleted, or detected with directors. Now 'self.this' can be a list, which will contain the C++ instance pointers for all the base classes. Also, swig.this is responsible for deallocating the C++ instance(s), and the __del__ method is not emitted unless the user preppend/append some code to it. - Swig can now detect memory leaks, ie, if you still don't use proxy/shadow classes, and type something like import _example f = _example.new_Foo() and forget to call _example.delete_Foo(f), then swig will tell you that there is a memory leak. Otherwise, if you always use the proxy classes, you probably you will never ever see this warning unless there is something wrong inside the swig wrapping code. *** POTENTIAL INCOMPATIBILITY *** If you overloaded the __del__ method, and call the base one without a try block, as in class MyClass(SwigClass): def __del__(self): SwigClass.__del__(self) python could complain that the method SwigClass.__del__ is undefined. Try to use instead: def __del__(self): try: SwigClass.__del__(self) except: pass or simply def __del__(self): 11/02/2005: mmatus [Python] Adding more fun to STL/STD containers, now you can do %template(pyset) std::set; %template(pyvector) std::vector; %template() std::pair; %template(pyvector) std::map; .... The same applies to std::list, std::deque, std::multiset, etc. Then, at the python side you can do now: # C++ std::vector as native python sequence v = pyvector([1,"hello",(1,2)]) print v[1] >> 'hello' print v[2] >> (1,2) # C++ std::set as native python sequence s = pyset() s.insert((1,2)) s.insert(1) s.insert("hello") sum=() for i in s: sum +=(i,) print sum >>> (1, 'hello', (1, 2)) # C++ std::map as native python sequence m = pymap() m["foo"] = "hello" m[1] = (1,2) pm = {} for k in m: pm[k] = m[k] print pm >>> {1: (1, 2), 'foo': 'hello'} ie, the STD/STL containers work as real native python container, with arbitrary item types and so. But since normal C++ containers do not properly ref/unref their items, you should use the safer versions: %template(pyset) std::set; %template(pyvector) std::vector; %template() std::pair; %template(pyvector) std::map; .... where swig::PyObject_ptr is a PyObject * envelope class provided to safely incref/decref the python object. So, now you can use all the STL/STD containers as native Python containers. Note 1: std::map, std::set and the other 'ordered' containers will properly use PyObject_Compare for sorting, when needed. Note 2: all the STL/STD containers have a limit size of SIZE_MAX, ie, you can have manage containers larger than INT_MAX, the python limit. 11/02/2005: mmatus [Python] - add 'iterator()' method for all sequences and additionally 'key_iterator()' for maps. 'iterator()' will always return the native C++ iterator. Additionally, in maps, 'key_iterator()' will return a python iterator using only the map keys. In general the sequence method __iter__ will call 'iterator()', returning the native C++ iterator, but in maps it will call 'key_iterator()', maintaining backward compatibility. Hence, for std::maps, you can play then with the native C++ iterator, which value is a (key, value) pair, by calling map.iterator(), as with map.begin(), map.end(), etc. The difference is that map.iterator() returns a safe 'closed' iterator, while map.begin() and map.end() are 'open' iterators. A 'closed' iterator knows the begin and the end of the sequence, and it never can seg. fault. An 'open' iterator, as in C++, can seg. fault at the C++ side. # a closed iterator is safe in the following example. # the next() method will throw a StopIteration # exception as needed i = seq.iterator() try: while True: sum += i.next() except: pass # an open iterator always need to be checked, # or it will crash at the C++ side current = seq.begin() end = seq.end() while (current != end): sum += current.next() [Python] - Finally, when we call f = Foo() the construction is 'one-way'. Before construction was done something like Foo() (python) -> _new_Foo() (C++) new_Foo() (C++) -> FooPtr() (python) FooPtr() (python) -> Foo() (python) and returning a pointer was done like NewPointerObj() (C++) -> FooPtr() (python) FooPtr(python) -> Foo() (python) ie, we when going back and forward between the C++ and python side. Now since there is no FooPtr the construction process is Foo() (python) -> _new_Foo() (C++) _new_Foo() (C++) -> NewPointerObj() (C++) (no shadow class) and returning a pointer is done NewPointerObj() (C++) (with shadow class) -> NewInstaceObj() (C++) where NewInstanceObj creates a new instance without calling __init__ and it doesn't go 'back' to python, is 'pure' C API. - With this change, and the other ones in the PySwigObject type, which now carries the thisown and swig_type_info pointer, the generated code should be as fast as boost::Python and/or the other python wrappers based in pure Python/C API calls. As a reference, the profiletest_runme.py example, which does a simple call function many times, such as this code: import profiletest a = profiletest.A() b = profiletest.B() for i in range(0,1000000) a = b.fn(a) where fn is defined as 'A* B::fn(A *a) {return a;}', produces the following times nomodern modern swig-1.3.26 19.70s 5.98s swig-CVS 0.99s 0.98s Clearly, there is a large improvement for the python 'nomodern' mode. Still, the 'modern' mode is around 6 times faster than before. For the same test, but using the non-shadow version of the module, we get _profiletest (non-shadow) swig-1.3.26 0.80s swig-CVS 0.60s Hence, now for practical purposes, the proxy overhead is insignificant. Note that the performance numbers we are showing is for a simple module (two types) and a simple function (one argument). For real situations, for modules with many more types and/or functions with many more parameters, you will see even better results. 10/31/2005: mmatus [Python] - Finally, no more ClassPtr proxy classes. You will see only a clean Class proxy class in the .py file. - No more 'real' thisown attribute either, the PySwigObject now carries the ownership info. You can also do something like print self.this.own() >>> True self.this.disown() self.this.own(0) print self.this.own() >>> False self.this.acquire() self.this.own(1) print self.this.own() >>> True Still the old way, print self.thisown >>> True self.thisown = 0 print self.thisown >>> False self.thisown = 1 print self.thisown >>> True is supported, and python dispatches the proper method calls as needed. - Support for iterators in STL/STD containers, for example, if you have %template std::set; you can use the C++ iterators as: s = set_string() s.append("c") s.append("a") s.append("b") b = s.begin() e = s.end() sum = "" while (b != e): sum += b.next() print sum >>> "abc" advance the iterator as in C++ current = s.begin() current += 1 print current.value() >>> "b" now using the reverse operators b = s.rbegin() e = s.rend() sum = "" while (b != e): sum += b.next() print sum >>> "cba" or the 'previous' method b = s.begin() e = s.end() sum = "" while (b != e): sum += e.previous() print sum >>> "cba" or just as in a python fashion for i in s: sum += i Note 1: Iterators in C++ are very powerful, but dangerous too. And in python you can shoot yourself in the foot just like in C++, so, be careful. Note 2: the iterators are 'light', ie, they do not convert sequence elements until you request to do so, via next(), value() or previous(). If you just increment/decrement one no conversion is performed, for example: b = s.begin() b += 1 b.incr() b.incr(2) b.decr(2) b.decr() b -= 1 only the iterator is modified, and not value wrapper is generated. Other typical C++ operations are also available, such as: print s.end() - s.begin() >>> 3 f = s.begin() + 1 print f.value() >>> "b" l = s.end() - 1 print l.value() >>> "c" etc. Of course, the 'find', 'insert', 'erase', and so on methods also supports iterators now, ie: i = s.begin() i += 1 s.erase(i) for i in s: sum += i print sum >>> "ac" *** POTENTIAL INCOMPATIBILITY *** There is no more 'thisown' attribute. If you use it, python will translate the following code as follows: if (self.thisown): ==> if (self.this.own()): self.thisown = 1 ==> self.this.own(1) self.thisown = 0 ==> self.this.own(0) Still, maybe in some unusual cases the translation will not be 100% correct, so if you have a problem, please report it and/or use the new 'self.this.own()' accessor. *** POTENTIAL INCOMPATIBILITY *** There is no more ClassPtr classes in the python code. Hence, if in the past you needed to resort to some kind of trickery with them, or overcome their presence, it is no longer required, but the extra code you added could now break things. If needed, you can use the option -classptr, i.e., swig -classptr -python ... to generate the old ClassPtr classes. 10/30/2005: mkoeppe [Guile] Make declared and defined linkage of SWIG_init consistent. Reported by Steven G. Johnson (SF patch 1315498). 10/26/2005: mmatus - Added the attribute.i file to the global library director. Now it can be used from other languages that do not use the unified typemap library as well. So, if you have something like: %include attribute.i %attribute(A, int, a, get_a, set_a); struct A { int get_a() const; void set_a(int aa); }; %attribute_ref(B, int, c); struct B { int& c(); }; then in the target language the 'A.a' and 'B.c' attributes will be visible, ie, you can access them as plain variables: f = A() f.a = 3 g = B() g.c = 3 h = f.a + g.c and the proper get/set methods will be dispatched. See attribute.i for more info. - More cleanups around and adding more test-cases. The DISOWN typemap now is tested and working in all the languages that use the unified typemap library, ie, tcl, ruby, perl and python. 10/25/2005: mmatus - Perl, complete the DISOWN typemap. - added the attribute.i file to the unified typemap library (before was only usable from python). - unify the names for the setter and getter methods in perl,tcl,ruby and python, so, the attribute.i library can work across them. - see the li_attribute.i test-case or the library file Lib/typemaps/attribute.swg for more info about how to use it. 10/24/2005: mmatus - Perl now uses the unified typemap library. - Changes in ruby to use the $track option in typemaps. - Changes in the unified typemap library to follow the convention that all macros that are not used in the C/C++ side starts with %, such as %delete %new_array etc. - Documenting fragments, see fragments.swg. - Cleaner way to use the unified typemap library, include just . Check some of the supported languages: perl, tcl, ruby, python. Always start with the head file, such as python/python.swg tcl/tcl8.swg ruby/ruby.swg perl5/perl5.swg and the principal file that invokes the unified library, such as python/pytypemaps.swg tcl/tcltypemaps.swg ruby/rubytypemaps.swg perl/perltypemaps.swg The file that provide the specialization for each language are the one that provides the basic types: python/pyprimtypes.swg ruby/rubyprimtypes.swg tcl/tclprimtypes.swg perl5/perlprimtypes.swg and the string manipulation: python/pystrings.swg ruby/rubystrings.swg tcl/tclstrings.swg perl5/perlstrings.swg The rest of the files, such as carray.i, are mostly one line files that include the proper typemap library version. *** POTENTIAL INCOMPATIBILITY in Perl *** Some missing/wrong typemaps could start working properly, and change the old expected behavior in Perl. 10/23/2005: wuzzeb Chicken: + pointers to member functions finally work properly + add test of member function pointers to cpp_basic.i 10/20/2005: dancy [allegrocl] Added C++ support. Large update, many changes. See newly added Allegro Common Lisp section in lisp.html 10/20/2005: mmatus Ruby, Tcl, Python: - Uniform way to fail (label fail:), now finally SWIG_exception works across the three languages and all the typemaps. - Add proper cleanup code to ruby - More valgrind fixes - Simplify the inline use, it seems a small interface of 20,000 lines (plus many many templates) can break gcc -O3 easily. - Finalize the typemaps library. All the old *.i files (carray.i, cpointer.i, exception.i) had been implemented in the new typemaps library. 10/19/2005: wuzzeb Update the Runtime Typemap documentation in Typemaps.html 10/18/2005: wuzzeb Chicken: - Correctly handle %ignored classes - Correctly convert long, long long, unsigned long, etc to chicken primitives. (Thanks to Felix Winkelmann) - Using argout parameters when the return value was a wrapped pointer caused a memory corruption. The chicken garbage collector moved a pointer out from under us. This is now fixed by running all the proxy creation functions as continuations after the wrapper function returns. As part of this, we no longer need the chickenfastproxy flag on output typemaps. - using -proxy and -nocollection together works now Before, it was not exporting the destructor in the proxy wrapper. 10/18/2005: mmatus Added the Unified Typemap Library (UTL). It unifies the typemaps for python, ruby, tcl and in the process, fixes several problems in each of the three languages to work in a "canonical" way now established in the typemap library SWIG/Lib/typempas The current status of the unification is that everything compiles and runs inside the test-suite and examples directories. And for the first time we have three languages than pass the primitive_types.i case. Also, we have a uniform way to treat the errors, for example if you do something like >>> from primitive_types import * >>> print val_uchar(10) 10 >>> print val_uchar(1000) Traceback (most recent call last): File "", line 1, in ? OverflowError: in argument 1 of type 'unsigned char' you get the same exception in all the three languages. And well, many more good things will come from this unification, for example, proper support of the STL/STD classes for all the languages, and hopefully, we can keep adding other languages. The hardest part, writing a common typemap library that suites the three different languages, is done, and adding another language should now be easy. Still the global unification is not complete, the STL/STD part is next, and probably as well as adding one or two more languages. If you are curious, look at the python, ruby and/or tcl directories to see what is needed to support the new common typemaps library. Still, the final way to integrate a new language could change as we move to integrate the STD/STL. *** POTENTIAL INCOMPATIBILITY in Ruby/Tcl *** Some missing/wrong typemaps could start working properly, and change the old behavior, specially in ruby and tcl. Version 1.3.27 (October 15, 2005) ================================= 10/15/2005: wsfulton [Java] Fix for typesafe enum wrapping so that it is possible to overload a method with 2 different enum types. 10/15/2005: wsfulton Fix for %feature("immutable","0") attempting to generate setters for constants. Restored %immutable and %makedefault to clear the feature as it behaved in SWIG-1.3.25 and earlier. 10/14/2005: mmatus Fix bug in anonymous typedef structures which was leading to strange behaviour. 10/13/2005: mmatus Several minor changes: - Improve the wchar_t type support - Add a warning for when you define the 'in' typemap but you don't define the 'typecheck' one. Very common mistake. - Add proper default rule for function pointers, now you can define a typemap such as: %typemap(in) SWIGTYPE ((*)(ANY)) {...} That will apply to all the pointer to functions. The rule in C++ also apply to the function 'reference', ie, in both cases typedef int (*fptr)(int a); typedef int (func)(int a); This was needed since it seems to be 'illegal' in C++ to do something like: void *ptr = static_cast(fptr); and probably, as for member functions, it is not warrantied that the pointer sizes will match. - Add the #error/#warning directives to swig's cpp. - Add the noblock option for typemaps, which is used as follows: supposed you a typemap, like this %typemap(in,noblock=1) Hello { .... } then the typemap will be inserted without the block imposed by the brackets, similar to %typemap(in) Hello "..."; So, why you don't just use the quote style?, because: 1.- The quote style doesn't get preprocessed, for example %typemap(in) Hello "$1= SWIG_macro($1);"; here, SWIG_macro doesn't get expanded 2.- Inside a quote typemap, you have to use quotes carefully %typemap(in) Hello "$1 = \"hello\" "; 3.- You can't make emacs and/or other editors to indent inside a string!. So, why do you want to remove the block?, because an extra block when not needed (no local variables in it): 1.- makes the code harder to read 2.- makes the code larger 3.- or in short, for the same reason we have the quote style. Version 1.3.26 (October 9, 2005) ================================ 10/08/2005: wsfulton [Php] Added 'throws' typemaps. 10/08/2005: wsfulton Fixes for languages that don't support multiple inheritance. The first non-ignored class in the public base class list is used for inheritance. by the proxy class. Previously, if the first class in the list was ignored, then the proxy class wouldn't have any base classes. 10/07/2005: mmatus Update more features to follow new convention, including: callback ref/unref except All of them use not only the feature as a flag, but also as code value. To deal with those features, we use now GetFlagAttr, which is similar to GetFlag, but instead or returning 1 or 0, it returns the attr value, if happens to be different of "0" of course. Now there are also more uniform directive names for the ones based in features, for example, for the old %newobject directive now we have tree directives defined: #define %newobject %feature("new") #define %nonewobject %feature("new","0") #define %clearnewobject %feature("new","") and so on for all the other feature directives. *** POTENTIAL INCOMPATIBILITY *** 09/30/2005: wsfulton Subtle change to some features. Previously it was not possible to disable many features once they had been enabled. This was for most features that behave as flags. These features now work as follows: %feature("name") // enables the feature %feature("name", "1") // enables the feature %feature("name", "0") // disables the feature %feature("name", "") // clears the feature In fact any non-empty value other than "0" will enable the feature (like C boolean logic). Previously "1", "0" or any other non-empty value would enable the feature and it would only be possible to disable the feature by clearing it (assuming there was no global enable). The following features are affected: allowexcept compactdefaultargs classic (Python) cs:const (C#) director exceptionclass (Python) ignore immutable java:const (Java) java:downcast (Java) kwargs modern (Python) new noautodoc (Python) nodefault nodirector noref notabstract nounref novaluewrapper python:maybecall (Python) python:nondynamic (Python) modula3:multiretval (Modula3) predicate (Ruby) trackobjects (Ruby) valuewrapper It is now possible, for example to ignore all methods/classes in a header file, except for a few targetted methods, for example: %feature("ignore"); // ignore all methods/classes %feature("ignore","0") some_function(int, double); // do not ignore this function %feature("ignore","0") SomeClass; // do not ignore this Class %feature("ignore","0") SomeClass::method; // do not ignore this method %include "bigheader.h" Removed %pythondynamic - it never worked properly. Use %pythonnondynamic instead. Removed %feature("nokwargs") - it wasn't fully implemented - use %feature("kwargs","0") instead. *** POTENTIAL INCOMPATIBILITY *** 09/25/2005: mkoeppe [Guile] Add "throws" typemaps. 09/24/2005: cfisavage [Ruby] Adds new %trackobjects functionality that maps C++ objects to Ruby objects. This functionality makes it much easier to implement mark functions for the garbage collector. For more information refer to the update documentation and examples. 09/20/2005: wsfulton [Perl] Patch 1116431 from Josh Cherry. Fixes non member functions inadvertently being called instead of member functions. 09/20/2005: wsfulton [Lua] Patch from Mark Gossage to add support for Lua-5.1, std::string, std::vector, std::exception and documentation. 09/14/2005: mmatus [Python] Add -nocppcast. Now the default behavior is to always use the cppcast operators. Before that was the case only when you used the -cppcast option. If this seems to break your code... your welcome!, it means it was broken before, and you never notice. If you thing the error is due to one of the SWIG typemaps, send us an example. Use -nocppcast only with very old C++ compilers that do not support the cppcast operations. So, here applies: This change doesn't break compatibility, it was broken before. 09/13/2005: wsfulton [Java] Fix for director methods when a class is passed by value as a parameter. 09/11/2005: mmatus Adding the module option to the %import directive. Now you can use it as %import(module="BigModule") foo.i where subfile could (or not) define the module name via the %module directive. The module option take precedence and it has the same effects than having the directive %module BigModule inside the imported file foo.i. You can use the option in mainly two cases: 1.- You used the -module option when you generated the module to be imported, and hence the module name in the imported %module directive is not really useful. 2.- The module you want to import is very large, and it has several .i/.h files. Then, if you just one to import a class or so from the module, says 'foo', and not the entire module via importing the main BigModule.i file, then you just do: %import(module="BigModule") foo.h or %import(module="BigModule") foo.i where foo.i contains the 'foo' declaration and maybe a couple of extra %include directives, as needed. 09/11/2005: mmatus Fix bug #1282637, about the -module option not having effect in places where it was needed. 09/11/2005: wsfulton When wrapping variables, ensure that none of the typemaps used for the set wrappers are used when generating the get wrappers. I doubt this was a problem for any languages except for the recently introduced null attribute in the out typemap (C# only). 09/08/2005: wsfulton More descriptive error messages when files fail to open. 09/06/2005: mmatus Allow a %define a macro inside another %define macro, for example %define hello(name, Type) %define name ## a(Type) %typemap(in) Type "hello;"; %enddef %enddef To learn how to use this new features in your own typemaps library, see python/cstring.i, python/cwstring.i and python/cwstrbase.i. [Python] Normalize the cstring.i implementation to use fragments, and add cwstring.i, which implements the same typemaps but for wchar_t strings. [Python] Bug fixed: 1247477, 1245591, 1249878 and others. 08/18/2005: wsfulton [Ruby] Implement support for SWIGTYPE* DISOWN typemap (like in Python) for better control of memory management, eg when adding an object created in Ruby to a C++ container. Patch #1261692 from Charlie Savage. 08/18/2005: wsfulton [Tcl] 64 bit platform fixes for the varargs handling in SWIG_GetArgs. This is an improved fix for bug #1011604 as suggested by Jeremy Lin. 08/18/2005: wsfulton [Tcl] Bug #1240469 - %newobject support for Tcl. Patch from Bob Marinier. 08/16/2005: wsfulton [Perl] Bug #1254494 - Fix for global namespace pollution by perl header files (bool define) prevented STL headers from being used on some systems, eg Windows with Visual Studio. 08/16/2005: wsfulton [Java] Bug #1240937 - Redefinition of __int64 typedef for Intel compilers. 08/15/2005: wsfulton [Xml] Bug #1251832 - C++ template may generate invalid XML file 08/15/2005: wsfulton [Lua] Support added for Lua. Patch #1242772 from Mark Gossage. It supports most C/C++ features (functions, struct, classes, arrays, pointers, exceptions), as well as lots of documentation and a few test cases & examples. 08/14/2005: wsfulton [Xml] Fix incorrect xml escaping in base class name when base class is a template. 08/13/2005: efuzzyone [CLISP] Added support for handling enums. Does not adds the return type declaration to the function definition, if a function returns void. 08/09/2005: mkoeppe New language module, Common Lisp with UFFI, from Utz-Uwe Haus. 08/09/2005: mkoeppe Fix the Lisp s-expression output module; it no longer complains about "unknown targets". 07/27/2005: wsfulton Modifications to STL wrappers so that it is possible for a user's %exception directive to be applied to the STL wrapper methods. Previously the following global %exception directive would not be used on the wrapper methods: %exception { try { $action } catch (...) { // handle uncaught exceptions } } This has been implemented by replacing %exception directives for specific STL wrapper methods with an exception specification declared on the wrapper methods. throws typemaps are now supplied for handling the STL exception specification. These can also be easily overridden, for example the std::out_of_range exception, which is used a lot in the STL wrappers, can be customised easily: %include "std_vector.i" %typemap(throws) std::out_of_range { // custom exception handler } %template(VectInt) std::vector; 07/22/2005: efuzzyone [CLISP] The clisp module for SWIG: - It can only handle C, clisp currently does not supports ffi bindings to C++. - It has two options, (a) -extern-all this will generate wrappers for all functions and variablestions, (b) -generate-typedef this will generate wrappers "def-c-type" wrappers for typedefs - Can handle pointers to functions, complex types such as n-dimensional arrays of pointers of depth d - Generates wrappers for constants as well as variables - Correctly distinguishes between the declaration of variables in structures and functions - Creates a defpackage "declaration" with the module name as the package name, the created package exports both functions and variables - tries to guess when should a pointer variable be declared as c-ptr or c-pointer 07/22/2005: wsfulton [C#] Changes to support C# structs returned by value. The changes required are: - Using an optional 'null' attribute in the out typemap. If this attribute is specified, then it is used for the $null special variable substitution. - The ctype used in the C/C++ wrappers is no longer initialised to 0 on declaration. Both of these changes fix the situations where an attempt was made to assign 0 to the returned struct. Marshalling structs as value types still requires user defined typemaps. See documentation for an example. 07/22/2005: wsfulton [C#, Java] Fix SWIG_exception usage to work with compilers that don't support empty macro arguments. Unfortunately this fix will stop usage of SWIG_exception being used within typemaps that use "" or %{ %} delimiters, but continues to work with typemaps using {} delimiters. Please use the SWIG_CSharpSetPendingExceptionArgument or SWIG_JavaThrowException methods instead as SWIG_exception is really intended as a platform independent macro for the SWIG library writers. 07/16/2005: mkoeppe [Allegro CL] Use specific foreign types rather than (* :void). Use *swig-identifier-converter*. 06/27/2005: wsfulton Functions declared as 'extern' no longer have an additional function declaration added to the wrapper files. There are some cases where SWIG does not get this right, eg bug #1205859 (extern functions with default arguments declared in a namespace). Also SWIG cannot get non-standard calling conventions correct, eg Windows calling conventions are usually handled like this: %{ #define DLLIMPORT __declspec(dllimport) #define STDCALL __stdcall %} #define DLLIMPORT #define STDCALL %inline %{ DLLIMPORT extern STDCALL void function(int); %} SWIG incorrectly generates: extern void function(int); To which there is no solution as SWIG doesn't handle non-standard calling conventions. The extra 'extern' function that SWIG generates is superfluous unless a user has forgotten to add the function declaration into the wrappers. The -noextern commandline argument is now redundant and a new commandline argument -addextern can be used to obtain the original behaviour. This shouldn't be necessary unless the header file containing the function declaration was inadvertently not added to the wrappers. To fix this add the function declaration into your wrappers, For example, replace: extern void foo(int); with: %inline %{ extern void foo(int); %} *** POTENTIAL INCOMPATIBILITY *** 06/22/2005: wsfulton [C#, Java, Modula3, Ocaml] The intermediary function names have been changed when wrapping variables to match the other language modules so that %extend for a member variable works uniformly across all language modules, eg: %extend ExtendMe { Var; }; %{ void ExtendMe_Var_set(ExtendMe *, double) {...} double ExtendMe_Var_get(ExtendMe *) {...} %} The methods implementing the get/set used to be: %{ void set_ExtendMe_Var(ExtendMe *, double) {...} double get_ExtendMe_Var(ExtendMe *) {...} %} This also changes the name of variable wrapper functions when using -noproxy. The original names can be generated with the -oldvarnames commandline option. *** POTENTIAL INCOMPATIBILITY *** Version 1.3.25 (June 11, 2005) ============================== 06/11/2006: mkoeppe [Guile] Fix handling of anonymous-enum variables. 06/10/2005: mkoeppe [Guile] Fix for function arguments that are passed by copy-of-value. Fix for global "const char *" variables. Fix testcases arrays_dimensionless, arrays_global. 06/08/2005: wsfulton Fix for when a base class defines a symbol as a member variable and a derived class defines the same symbol as a member method. 06/08/2005: wsfulton [C#] More fixes for virtual/new/override modifiers - when a method has protected access in base and public access in derived class. 06/02/2005: wsfulton Fix #1066363 - Follow convention of release tarball name matching directory name. 06/02/2005: wsfulton [C#, Java] Fix #1211353 - typesafe enums (and Java proper enums) wrappers when enum value is negative. 05/27/2005: wsfulton Modernised and tidied up Windows macros --> SWIGEXPORT, SWIGSTDCALL. They can be overridden by users via -D compiler directives if need be. 05/26/2005: wsfulton %csmethodmodifiers can be applied to variables as well as methods now. In addition to the default 'public' modifier that SWIG generates, %csmethodmodifiers will also replace the virtual/new/override modifiers that SWIG thinks is appropriate. This feature is useful for some obscure cases where SWIG might get the modifiers incorrect, for example with multiple inheritance and overriding a method in the base class. *** POTENTIAL INCOMPATIBILITY FOR C# MODULE *** 05/25/2005: wsfulton Added missing constructors to std::pair wrappers (std_pair.i) for all languages. 05/25/2005: wsfulton [C#] Added std::pair wrappers in std_pair.i 05/25/2005: wsfulton [C#] The C# 'new' and 'override' modifiers will be generated when a C++ class inherits methods via a C++ 'using' declaration. 05/25/2005: wsfulton Fix for exception specifications previously being ignored in classes that inherited methods from 'using' declarations, eg calls to Derived::bar below will convert C++ exceptions into a target language exception/error, like it always has done for Base::Bar. class Base { virtual bar() throw (std::string); }; class Derived : public Base { using Base::bar; }; 05/23/2005: wsfulton Fixes for detecting virtual methods in %extend for the -fvirtual option and C# override and new method modifiers. 05/23/2005: wsfulton [C#] The 'new' modifier is now generated on the proxy method when a method in a derived class is not polymorphic and the same method exists in the derived class (ie it hides the base class' non-virtual method). 05/23/2005: wsfulton [Java, C#] Fixes to detection of covariant return types - when the class hierarchy is more than 2 classes deep. 05/21/2005: wsfulton [Java] std::wstring typemaps moved from std_string.i to std_wstring.i 05/21/2005: wsfulton Fix for crash in DohStrstr, bug #1190921 05/21/2005: wsfulton [TCL] Fix for methods with similar names when showing list of names on error - bug #1191828. Patch from Jeroen Dobbelaere. 05/21/2005: wsfulton [TCL] long long overloading fix - bug #1191835, patch from Jeroen Dobbelaere. 05/21/2005: wsfulton Fix bug #1196755 to remove debug from swigtcl8.swg. 05/19/2005: wsfulton [C# and -fvirtual option] Fix for the override key not being generated in the derived class when a virtual method's return type was a typedef in either the base or derived class. Also ensures the method is eliminated when using the -fvirtual option. For example, Derived.method now has the C# override keyword generated: typedef int* IntegerPtr; struct Base { virtual IntegerPtr method(); }; struct Derived : Base { int * method() const; }; [C#] Fix for the override key being incorrectly generated for virtual methods when a base class is ignored with %ignore. 05/13/2005: wsfulton [Java] Fixes to remove "dereferencing type-punned pointer will break strict-aliasing rules" warnings in C wrappers when compiling C code with 'gcc -Wall -fstrict-aliasing'. Patch from Michael Cahill. This modifies many of the casts slightly, for example arg1 = *(DB_ENV **)&jarg1; to arg1 = *(DB_ENV **)(void *)&jarg1; 05/12/2005: wsfulton [C#] Support for C# attributes. C# attributes can be generated: 1) On a C/C++ type basis by specifying an inattributes and/or outattributes typemap attribute in the imtype or cstype typemaps (for C# return type or C# parameter type attributes). 2) On a wrapped method or variable by specifying a csattributes feature (%feature). 3) On a wrapped proxy class or enum by specifying a csattributes typemap. Examples are in the C# documentation (CSharp.html). 04/29/2005: wsfulton New configure option to turn off the default maximum compiler warning as they couldn't be removed even when overriding CFLAGS and CXXFLAGS with configure (./configure CFLAGS= CXXFLAGS=). To turn the maximum warnings off, run: ./configure --without-maximum-compile-warnings 04/28/2005: wsfulton Patch from Scott Michel which reworks the Java constructor and finalize/destructor typemaps, for directors to reduce the number of overall Java typemaps. Added the director_take and director_release typemaps to emulate other modules' __disown__ functionality. *** POTENTIAL INCOMPATIBILITY FOR JAVA DIRECTORS *** 04/28/2005: wsfulton [C#] Fixed problems due to the over eager garbage collector. Occasionally the garbage collector would collect a C# proxy class instance while it was being used in unmanaged code if the object was passed as a parameter to a wrapped function. Needless to say this caused havoc as the C# proxy class calls the C++ destructor when it is collected. Proxy classes and type wrapper classes now use a HandleRef, which holds an IntPtr, instead of a plain IntPtr to marshal the C++ pointer to unmanaged code. There doesn't appear to be any performance degradation as a result of this modification. The changes are in the proxy and type wrapper classes. The swigCPtr is now of type HandleRef instead of IntPtr and consequently the getCPtr method return type has also changed. The net effect is that any custom written typemaps might have to be modified to suite. Affected users should note that the implementation uses the new 'out' attribute in the imtype typemap as the input type is now a HandleRef and the output type is still an IntPtr. *** POTENTIAL INCOMPATIBILITY FOR C# MODULE *** 04/28/2005: wsfulton [C#] Support for asymmetric type marshalling added. Sometimes the output type needs to be different to the input type. Support for this comes in the form of a new optional 'out' attribute for the ctype, imtype and cstype typemaps. If this typemap attribute is not specified, then the type used for both input and output is the type specified in the typemap, as has always previously been the case. If this typemap attribute is specified, then the type specified in the attribute is used for output types and the type specified in the typemap itself is used for the input type. An output type is a return value from a wrapped method or wrapped constant and an input type is a parameter in a wrapped method. An example shows that char * could be marshalled in different ways, %typemap(imtype, out="IntPtr") char * "string" char * function(char *); The output type is thus IntPtr and the input type is string. The resulting intermediary C# code is: public static extern IntPtr function(string jarg1); 04/22/2005: mkoeppe (Matthias Koeppe) [Guile] Fix generation of "define-method" for methods of classes with a constructor. Reported by Luigi Ballabio. 04/15/2005: wuzzeb (John Lenz) [Chicken] For wrapped functions that return multiple values (using argout), SWIG CHICKEN now returns them as multiple values instead of as a list. They can then be accessed using (call-with-values). 04/14/2005: wuzzeb (John Lenz) [Chicken] + Added a whole bunch of new _runme scripts into the chicken test suite. Also fix some bugs these new scripts turned up. + Added optimization when returning a wrapped proxy class. Before, a minor garbage collection was invoked every time a function returned. + All the chicken Examples should now run correctly 04/14/2005: wsfulton [C#] More fixes for typemap matching when wrapping variables, in particular std::string, so that std::string variables can be easily marshalled with a C# string property using: %include "std_string.i" %apply const std::string & { std::string *variable_name }; std::string variable_name; (Recall that all class variables are wrapped using pointers) 04/05/2005: wuzzeb (John Lenz) [Chicken] + Added Examples/chicken/egg, an example on how to build a chicken extension library in the form of an egg. Also updated the documentation on the different linking options. + chicken test-suite now has support to check SWIG with the -proxy argument if there exists a _proxy_runme.ss file. + More fixes for overloaded functions and -proxy 03/31/2005: wsfulton Turned on extra template features for all languages which were previously only available to Python. This enables typemaps defined within a templated class to be used as expected. Requires %template on the templated class, %template() will also pick up the typemaps. Example: template struct Foo { ... %typemap(in) Foo "in typemap for Foo " or %typemap(in) Foo "in typemap for Foo " }; %template(Foo_i) Foo; %template() Foo; will generate the proper 'in' typemaps wherever Foo and Foo are used. 03/30/2005: mkoeppe (Matthias Koeppe) [MzScheme] Patch from Hans Oesterholt for supporting MzScheme 30x. 03/29/2005: wuzzeb (John Lenz) [Chicken] + Reallow older versions of chicken (1.40 to 1.89) by passing -nocollection argument to SWIG + %import now works correctly with tinyclos. (declare (uses ...)) will be exported correctly. + TinyCLOS proxy classes now work correctly with overloaded functions and constructors. 03/29/2005: wsfulton [Java] Patch from Scott Michel for directorout typemaps. Java directors require the directorout typemaps like the other languages now. The new typemaps provide fixes for methods where the return type is returned by reference (this cannot automatically be made thread safe though). 03/22/2005: wsfulton Enum casting fixes. Visual C++ didn't like the C type casting SWIG produced when wrapping C++ enum references, as reported by Admire Kandawasvika. 03/21/2005: wsfulton [Perl] SF #1124490. Fix Perl macro clashes when using Visual Studio's STL string, so now projects can #include . 03/21/2005: wsfulton Fixed %varargs which got broken with the recent default argument changes. Also works for Java and C# for the first time now. 03/17/2005: wuzzeb (John Lenz) [Chicken] + Fix a whole bunch of bugs in the chicken module. The entire test suite now compiles, with the exception of the tests that require std_vector.i, std_deque.i, and so on, which chicken does not have yet. + Add support for %exception and %typemap(exceptions). Exceptions are thrown with a call to (abort) and can be handled by (handle-exceptions) 03/15/2005: wsfulton [Java] Patch from Scott Michel for directors. Modifications to the typemaps giving users fine control over memory ownership and lifetime of director classes. Director classes no longer live forever by default as they are now collectable by the GC. 03/15/2005: wuzzeb (John Lenz) [Chicken] Add support for adding finalizers garbage collected objects. Functions that return new objects should be marked with %newobject and input arguments which consume (or take ownership) of a pointer should be marked with the DISOWN typemap. Also add support for correctly checking the number of arguments passed to a function, and raising an error if the wrong number are passed. 03/14/2005: wuzzeb (John Lenz) Add --without-alllang option to configure.in, which is the same as passing all the --without-python --without-perl5 etc... that Matthias added. 03/09/2005: wsfulton [Php] Memory leak fix for functions returning classes/structs by value. 03/08/2005: wsfulton [Perl] Fix for Perl incorrectly taking memory ownership for return types that are typedefs to a struct/class pointer. Reported by Josh Cherry. 03/07/2005: wsfulton [C#] Various exception changes for the std::vector wrappers. These now more accurately mirror the same exceptions that System.Collections.ArrayList throw. 03/07/2005: wsfulton [C#] Fix undefined behaviour after any of the std::vector methods throw an exception. 03/07/2005: wsfulton [C#] When null is passed for a C++ reference or value parameter, the exception thrown has been corrected to an ArgumentNullException instead of NullReferenceException as recommended in the .NET Framework documentation. The default throws typemaps turn a C++ exception into an ApplicationException, not a SystemException now. 03/07/2005: wsfulton [C#] Numerous changes in C# exception handling have been made over the past few weeks. A summary follows: The way in which C++ exceptions are mapped to C# exceptions is quite different. The change is to fix C# exceptions so that the C++ exception stack is correctly unwound as previously C++ exceptions were being thrown across the C PInvoke layer into the managed world. New typemap attributes (canthrow and excode) have been introduced to control the mapping of C++ to C# exceptions. Essentially a callback into the unmanaged world is made to set a pending exception. The exception to throw is stored in thread local storage (so the approach is thread-safe). The typemaps are expected to return from unmanaged code as soon as the pending exception is set. Any pending exceptions are checked for and thrown once managed code starts executing. There should be minimal impact on execution speed during normal behaviour. Full details will be documented in CSharp.html. The SWIG_CSharpThrowException() function has been removed and replaced with the SWIG_CSharpSetPendingExceptionArgument() and SWIG_CSharpSetPendingException() functions. The original name has been deliberately changed to break old code as the old approach was somewhat flawed. Any user defined exceptions that follow the same pattern as the old approach should also be fixed. Numerous new .NET framework exceptions are now available for easy throwing from unmanaged code. The complete list is: ApplicationException, ArithmeticException, DivideByZeroException, IndexOutOfRangeException, InvalidOperationException, IOException, NullReferenceException, OutOfMemoryException, OverflowException, SystemException, ArgumentException, ArgumentNullException and ArgumentOutOfRangeException. *** POTENTIAL INCOMPATIBILITY FOR C# MODULE *** 05/05/2005: mmatus Fix several memory leaks around. Even when we survive knowning swig is a memory leak factory, it was a little out of control. To run std_containers.i in the python test-suite, swig was using ~260MB, now it uses 'only' ~40MB, which is the same ammount that g++ uses, so, is not that bad. In the process, I found a couple of extra Deletes, which in some cases could trigger seg. faults and/or DOH/asserts. [python] Better support for directors + exception. More verbose errors and added an unexpected exception handler. [python] Fix memory leak for the std::vector > case,reported by Bo Peng. [python] Fix SwigPyObject compare problem reporte by Cameron Patrick. [python] Fix several warnings in the generated code for gnu-gcc, Intel and VC7.1 compilers. 02/25/2005: wuzzeb (John Lenz) Update documentation to use CSS and
    instead of
    I used a script to convert the docs, and it set all the box classes to be "code". There are actually 4 different classes, "shell", "code", "targetlang", and "diagram". We need to go through and convert the divs depending on what they contain. 02/23/2005: mmatus [Python] Added option -nortti to disable the use of native C++ RTTI with directors (dynamic_cast<> is not used). Add more code for directors to detect and report errors in the python side. Extend the use of SWIGINTERN whenever is possible. Remove template warnings reported by VC7.1. Remove warnings reported by gcc/g++. Finally you can compile using g++ -W -Wall -c mymodule_wrap.cxx and no spurious errors will be generated in the wrapper code. 02/23/2005: wuzzeb (John Lenz) Added -external-runtime argument. This argument is used to dump out all the code needed for external access to the runtime system, and it replaces including the files directly. This change adds two new virtual functions to the Language class, which are used to find the language specific runtime code. I also updated all languages that use the runtime to implement these two functions. 02/22/2005: mmatus Fix %template + private error SF#1099976. 02/21/2005: mmatus Fix swigrun.swg warnings reported when using "gcc -W -Wall" (static/inline not used in front of a function declaration), and add SWIGUNUSED attribute to avoid unused warnings elsewhere. Fix unused variable warnings. [Python] Use new SWIGUNUSED attribute to avoid warnings in SWIGINTERN methods. [Python] Fix PyOS_snprintf for python versions < 2.2 (SF #1104919). [Python] Fix map/multimap to allow empty maps (reported by Philippe Hetroy). [Docs] Add some documentation to Python.html and SWIGPlus.html, including for example the fact that 'friends' are now supported. 02/21/2005: wsfulton [PHP] Patch from Olly Betts, so that wrappers compile with Zend thread safety enabled. 02/17/2005: wsfulton Memory leak fix in some of the scripting language modules when using default arguments in constructors. The scripting language was not taking ownership of the C++ object memory when any of the constructors that use default arguments was called. 02/16/2005: wsfulton SF #1115055: Failed make install. Patch from Rob Stone. 02/16/2005: wsfulton [Java] SF #1123416 from Paul Moore. Correct memory allocation for STRINGARRAY typemaps in various.i. 02/15/2005: wsfulton Disabled typemap search changes for now (see entry 19/12/2004). It breaks old typemaps, lengthens the execution time by about 25% and introduces inconsistencies. 02/15/2005: wsfulton swig -help follows other software by printing to stdout instead of stderr now. swig -version also displays to stdout instead of stderr now. Behaviour reported by Torsten Landschoff. 02/15/2005: wsfulton [Ruby] Fix for the less commonly used ordering of %include and #include, so that the generated code compiles. Bug reported by reported by Max Bowsher. %include foo.h %{ #include foo.h %} 02/15/2005: wsfulton [C#, Java] SWIG_exception macro will now return from unmanaged code / native code as soon as it is called. Fixes possible JVM crashes and other code unexpectedly being executed. Note SWIG_exception is only occasionally used by SWIG library writers, and is best avoided by SWIG users. 02/15/2005: wsfulton [C#, Java] Typemaps can now be targeted at global variable names and static member variable names. Previously the typemaps for the setters were ignored, for example: %typemap(in) int globalint "..." int globalint; 02/13/2005: mkoeppe (Matthias Koeppe) [Guile] Add %typecheck for SWIGTYPE, add %typecheck for ptrdiff_t, fix typemaps for size_t. [Pike] Merge patch from Torsten Landschoff for improved Pike configuration. 02/12/2005: mkoeppe (Matthias Koeppe) New configure switches --without-tcl, --without-python etc. allow to disable the search for installed languages. 01/31/2005: wuzzeb (John Lenz) - Add DohSortList to DOH - Improve the runtime type system: + Speed. Type loading is now O(n log n) instead of O(N^2), which for large modules is a huge improvement. + A whole bunch of functions in swigrun.swg no longer need the swig_type_list_handle passed to them. The only one left is TypeQuery. This also makes runtime.swg a lot smaller. + Split up swig_type_info structure into two structures (swig_type_info and swig_cast_info) + Store a pointer to a swig_type_info rather than just the type name string in the linked list of casts. First off, this makes the guile module a little faster, and second, the SWIG_TypeClientData() function is faster too. + Add the idea of a module into the type system. Before, all the types were stored in one huge linked list. Now, another level is added, and the type system stores a linked list of modules, each of which stores an array of types associated with it. + For more information of how the runtime type system now works, please see Doc/Manual/typemaps.html and Doc/Devel/runtime.txt - Update all language modules to use the new type system. The changes to each language module are minor. All languages are now able to use runtime.swg for external access to the type system. Before only python and perl did. - [guile, mzscheme, ocaml, and php4] These languages opened up the init function inside the .cxx code, and any code in the .swg files in the init section was inside this function. This was a problem for swiginit.swg, which needs to be inserted before the SWIG_init function is opened. Thus I changed these languages to be like python or perl, where the init function is declared in the .swg file. - [Ruby] Instead of moving the init function to the .swg file, I added a new section initbeforefunc, and then added %insert(initbeforefunc) "swiginit.swg" - [MzScheme] Fix enums and fix Examples/Makefile.in so that if multiple -I arguments are specified in the INCLUDES variable, each gets a ++ccf. - [Guile GH] Update Guile GH to use the new type system. See Doc/Manual/Guile.html for how smobs are now used. 01/11/2005: wsfulton [C#] New typemap called 'csconstruct'. The code in this typemaps was previously hard coded and could not be customised by a user. This typemap contains the code that is generated into a proxy class's constructor. [Java] New typemap called 'javaconstruct'. The code in this typemaps was previously hard coded and could not be customised by a user. This typemap contains the code that is generated into a proxy class's constructor. Another typemap named 'javaconstruct_director' is used instead when the proxy class is a director class. [C#, Java] If a C++ class did not have a default constructor, a protected default constructor was automatically generated by SWIG. This seems is unnecessary and has been removed and thereby giving the user almost complete control over the generated code along with the new typemaps above. 19/12/2004: mmatus [Disabled, see entry 02/15/2004] - Fix typemap search, now the "out" typemap search is done as follows int *Foo::foo(int bar) -> int *Foo::foo(int bar) -> int *Foo::foo -> int *foo(int bar) -> int *foo -> int * then, now you can be more specific, and define /* apply only for 'Foo::foo' method */ %typemap(out) int * Foo::foo(int *bar) ...; /* apply for all 'foo' functions/methods */ %typemap(out) int * foo(int *bar) ...; %inline { struct Foo { int *foo(int *bar); }; } 15/12/2004: mmatus - More fixes for templates and template default args. See template_default.i for scary cases that now are supported, besides the already ugly STL/std cases. - Cosmetics and more use of 'const' where it was implicit. - Other fixes for OSS, which is now working again with 1.3.25. Version 1.3.24 (December 14, 2004) ================================== 12/12/2004: wuzzeb (John Lenz) [Chicken] Fix a bunch of bugs relating to -proxy support + non-class variables now export properly using -proxy + static member functions now export properly using -proxy + member class variables now export properly using -proxy + added a -nounit argument, which does not export the (declare (unit ...)) + correctly install swigclosprefix.scm + constants (enums, defines) now correcly export when using -proxy 12/11/2004: wsfulton configure fix for when more than one version of jni_md.h is found in the Java include directory (was generating lots of sed error messages). 12/08/2004: wsfulton [Java] Fixes to arrays_java.i so that one can apply the array typemaps to functions taking pointers as input, eg %include "arrays_java.i" %apply int[] {int*}; void foo(int *a); 12/05/2004: wsfulton [Java] Director mods contributed by Scott Michel. New typemaps directordisconnect and directordisconnect_derived for the swigDirectorDisconnect() method. Also fix to get the javapackage typemap working again. 12/05/2004: mmatus - Finishing the fixes for templates + default template args + specializations. - [Python] Now we use the new templates + default template args in the std/STL library. That means the internal swig files are getting uglier since we now support the original declarations: template > class vector { .... }; template, class _Alloc = std::allocator > > class map { .... }; and the user can use the %template directive as %template() std::vector; %template() std::vector >; %template() std::vector >; Now we are closer to the cleaning/rewriting of the python std/STL support, such that we recover support for MSVC++ 6.0, and we can add support for other languages too. 12/02/2004: wsfulton [Java] Fix for directors when wrapping methods using a member enum and typesafe/proper enums enabled. 12/01/2004: mmatus - Fix typemaps to work with templates and default template args, ie template struct Foo { }; %typemap(in) Foo *{...} %typemap(out) Foo *{...} Foo * foo( Foo *f1, Foo *f2); now 'f1', 'f2' and the return value resolve the provided typemaps properly. This is highly needed for proper STL support, see new std_basic_string.i, std_sstream.i, etc. - Added std_sstream.i, and fix std_basic_string.i to use the new typemaps + template def. arg mechanism. Also, added the needed std_alloc.i. Now, all the containers can be modified to support std::allocator, like in: template > class vector { public: .... }; This change is only completed by now for basic_string. - Fix for smart pointers + members + extensions: %extend Foo { int extension(int i, int j) { return i; } int extension() { return 1; } } %inline %{ class Foo { public: int y; static const int z; }; class Bar { Foo *f; public: Bar(Foo *f) : f(f) { } Foo *operator->() { return f; } }; now you can f = Foo() f.y = 3 a = f.z f->extension() b = Bar(f) b.y = 3 a = b.z b->extension() - Other small errors fixes, mostly python. 11/25/2004: wsfulton [Java] Numerous director bug fixes so that the correct java types and canonicalized types in the JNI code are emitted. Use of the $javaclassname special variables in the director typemaps now consistent with the non-director typemaps. The types used for typemap lookups are also corrected in a few places. If you previously had your own director typemaps, ensure they are using the correct C++ type. *** POTENTIAL INCOMPATIBILITY FOR JAVA DIRECTORS *** 11/25/2004: wsfulton const enum SWIGTYPE & typemaps added. These wrap const enum references as if they were passed by value. Const enum references thus work the same as const reference primitive types such as const double &, const int & etc. Typemaps added for Java, C#, Ruby, Tcl, Perl and Pike. 11/25/2004: wsfulton [Java, C#] New special variable: $*javaclassname, similar to $javaclassname and $&javaclassname. The new one removes a pointer from the C type before obtaining the Java class name. One or more of $javaclassname, $&javaclassname or $*javaclassname may now appear in a typemap. Likewise for C# using csclassname instead of javaclassname. 11/25/2004: wsfulton The last vestiges of enums being handled as integers removed from the internals. The wrapper methods use the enum type rather than an int now. The net result is added type safety for enums when handled as pointers, references etc. Previously in situations such as a method taking a pointer to an enum, a pointer to an int or a pointer to an enum of some other type could inadvertantly be passed to the method. This is now fixed as the descriptor for an enum is no longer based on an int, but the enum type instead. Anonymous enums are still handled as integers. The consequence for scripting language users in correct usage of enums should not be noticeable. There is no change for any of the languages where enums are passed by value - most of the scripting languages will still accept an integer for an enum value and the strongly typed languages still use either typesafe enums, integers or proper enums depending on what the user configures. For Java and C# users a change in the typewrapper class name has occurred (for enum pointers, references etc). For example: enum Numbers { one=1, two }; enum Numbers* number(); In Java and C# this must now be coded as SWIGTYPE_p_Numbers n = modulename.number(); rather than SWIGTYPE_p_int n = modulename.number(); *** POTENTIAL INCOMPATIBILITY *** 11/21/2004: wsfulton/mmatus Added missing deprecated warning for %name and remove remaining %name usage in the SWIG libraries. 11/21/04: mmatus - [Python] Adding the PySwigObject to be used for carrying the instance C/C++ pointers. This is used instead of string and PyCObjects. The new PySwigObject is even safer than PyCObject, and more friendly than plain strings: now you can do print a.this print str(a.this) _00691608_p_A print long(a.this) 135686400 print "%s 0x%x" % (a.this, a.this) _00691608_p_A 0x8166900 the last one is very useful when debugging the C/C++ side, since is the pointer value you will usually get from the debugger. Also, if you have some old code that uses the string representation "_00691608_p_A", you can use it now again using 'str(ptr)', or by calling 'str = PyObject_Str(obj)' in the C/C++ side. This change is mainly for nostalgic swig users that miss the string representation, but also allows to say again if a.this == b.this: return "a is b" and well, since the change were really simple, maybe in the future we will be able to do next = a.this + 1 or add native python iteration over native C/C++ arrays, ie, no need to create/copy new tuples when returning and array or vector. Also, a PySwigPacked object was adding to carry a member method pointer, but this is probably a temporal solution until a more general object for methods is added. Be aware that to simplify maintaining and compatibility with other tools, the old string and PyCObjects representation could disappear very soon, and the SWIG_COBJECTS_TYPES or SWIG_NO_OBJECT_TYPES macros will have no effect at compilation time. Still, the three mechanisms are present in the code just for testing, debugging and comparison purposes. 11/21/04: mmatus - [Python] Adding back support for using the swig runtime code inside the user code. We just allow the user to include the minimal code needed to implement the runtime mechanism statically, just as in done in the swig modules. To use the swig runtime code, for example with python, the user needs include the following: #include // or using your favorite language #include #include // or using your favorite language #include the files swigrun.swg, pyrun.swg and runtime.swg can be checked out by using swig -co, or they can simply be found by adding the swig lib directory to the compiler include directory list, for example SWIGLIB=`swig -swiglib` c++ -I${SWIGLIB} .. of better, using the CPPFLAGS, but that depends on your environment. This change can be ported to the other languages too, you just need to isolate the needed runtime code in a single file like 'pyrun.swg', and provide the SWIG_Runtime_GetTypeList() method. Look at the Lib/python/pyrun.swg file and the Examples/python/swigrun example. 11/15/04: mmatus - Fix mixed_types.i + gcc-3.4, ie, arrays + references + typedefs - Fix multidim arrays + typedefs,ie typedef char character[1]; typedef character word[64]; - Process protected/private bases in the same way before we process protected/private members, ie, we check for constructors, operator new, virtual members, etc. - Fix Ruby/Java to work (or ignore) multi-inheritance + directors. Allow other languages to define if it is supported or not. - Now you can run SWIG_FEATURES="-directors -dirprot" make check-ruby-test-suite make check-python-test-suite make check-java-test-suite make check-ocaml-test-suite and you will get only 'real' errors. ruby and python compile with no errors, java shows some problems. Version 1.3.23 (November 11, 2004) ================================== 11/05/2004: wsfulton Patch #982753 from Fabrice Salvaire: Adds dependencies generation for constructing makefiles. New command line options -MF -MD -MMD to work with the current options -M and -MM. These options are named the same and work the same as in gcc. 11/05/2004: wsfulton %ignore/%rename changes for methods with default arguments to mirror %feature behaviour. See previous entry. *** POTENTIAL INCOMPATIBILITY *** 11/04/2004: wsfulton %feature improvements for fine tuning when wrapping methods with default arguments. Any %feature targeting a method with default arguments will apply to all the extra overloaded methods that SWIG generates if the default arguments are specified in the feature. If the default arguments are not specified in the feature, then the feature will match that exact wrapper method only and not the extra overloaded methods that SWIG generates. For example: %feature("except") hello(int i=0, double d=0.0); void hello(int i=0, double d=0.0); will apply the feature to all three wrapper methods, that is: void hello(int i, double d); void hello(int i); void hello(); If the default arguments are not specified in the feature: %feature("except") hello(int i, double d); void hello(int i=0, double d=0.0); then the feature will only apply to this wrapper method: void hello(int i, double d); and not these wrapper methods: void hello(int i); void hello(); This has been introduced to make %feature more powerful to ease the migration to new default arguments wrapping approach. *** POTENTIAL INCOMPATIBILITY *** If you previously had a %feature and didn't specify the default arguments, you will have to add them in now or you can obtain the original behaviour by using %feature("compactdefaultargs"). 11/04/2004: wsfulton [C#] Typemaps for std::vector added into std_vector.i. The proxy classes generated are modelled on the .NET ArrayList class. This isn't quite ready for general consumption yet, but will work with vectors of primitive types and some classes. 10/3/2004: wuzzeb (John Lenz) [GUILE] The -scm interface is now the default. The old GH interface can still be enabled by passing -gh to SWIG. 10/2/2004: mmatus - More fixes for namespace + class declarations. As an extra bonus, we get %template support for static/members class methods, ie, now you can say: namespace space { struct A { template static void fooT(Y y) { } }; } struct B { template void barT(Y y) {} }; %template(foo) space::A::fooT; %template(foo) space::A::fooT; %template(foo) space::A::fooT; %template(bar) B::barT; %template(bar) B::barT; %template(bar) B::barT; and call A.foo(1) b = B() b.bar(1) note the methods are emitted inside the classes, and hence, the %template name refers to the 'member' method name, not a global namespace name. 10/31/2004: mmatus - Solve namespace + class declarations, as in namespace foo { struct Bar; struct Foo { }; } struct foo::Bar : Foo { }; see namespace_class.i for more examples. - Fix %template directive to properly use namespaces, including the case: namespace one { template struct Ptr {}; } namespace one { struct Obj1 {}; typedef Ptr Obj1_ptr; %template(Obj1_ptr) Ptr; } namespace two { struct Obj2 {}; typedef one::Ptr Obj2_ptr; %template(Obj2_ptr) one::Ptr; } this is done by using the namespace name 'one' to create a namespace node to emit the template instantiation, just as before, but the template parameters are resolved and qualified in the current namespace ('one' or 'two'). This is same way that typedef works. This resolve the smart_pointer_namespace2.i case, and at the same time, several other ones where before swig was generating the "Can't instantiate template 'xx' inside namespace 'yy'" error message. In fact, that error doesn't exist anymore. You can only get an error if you use a bad namespace name or so. 10/30/2004: mmatus - [ruby] Directors fixes: - enums and std::strings are working now (several reports in bug track system) - added patch 1025861 for director + exceptions *** Attention ***: ruby with directors + protected members work with version 1.7+. Older versions seems to have a broken signature for'rb_protect'. If you need to use an old version, look at http://excruby.sourceforge.net/docs/html/ruby__hacks_8hpp-source.html for workarounds. - [ruby] Fix memory allocation problem in typemap (bug 1037259) - [tcl] Fix (enums|constants) + namespace option (reported by jason.m.surprise@intel.com). - [perl] Add patch 962168 for multiple inheretance - Fix 'defined' as variable name. 10/29/2004: wsfulton Seg fault fix for global scope operator used for friend methods: class B { friend void ::globalscope(); ... }; 10/28/2004:mmatus - Added module and swig option "templatereduce" to force swig to reduce any type needed with templates, ie, in these cases %module("templatereduce") test template struct A { }; typedef int Int; %template(A_Int) A ==> %template(A_Int) A typedef B* Bp; %template(A_Bp) A ==> %template(A_Bp) A swig reduces the types Int and Bp to their primitives int and B*. This is closer to the usual compiler resolution mechanism, and it is really needed sometimes when you mix templates + typedefs + specializations. Don't use it if you don't have any problem already, since the type reduction can interfere with some user typemaps, specially if you defined something like typedef int Int; %typemap(in) Int ...; in this case, when you use the "templatereduce" option, swig will ignore the user typemap, since the "typedef int Int" will take precedence, and the usual "int" typemap will be applied. Note that the previous case is not common, and should be avoided, ie, is not recommended to use a typedef and a typemap at the same time, specially if you are going to use templates + specializations. - Directors: virtual destructor is always emitted now, this doesn't cause any harm, and could solve some nasty and mysterious errors, like the one mentioned by Scott. also the destructor is not in-lined, so, that can solve some other mysterious errors when mixing directors + imports + embedded applications + some specific compilers. 10/27/2004: wsfulton [C#] typemaps.i library file with INPUT, OUTPUT and INOUT typemaps added. 10/27/2004: wsfulton [Java] std::wstring typemap fixes in std_string.i from Russell Keith-Magee. 10/25/2004: mmatus - Using + namespace is working now (using_namespace.i). - Derived + nested classes is working now (deriver_nested.i), but of course, we are still waiting for the nested class support. - Directors: - unnamed parameters support, - protected constructor support (automatic and with dirprot mode), - detection of really needed protected declarations (members and constructors) now is done automatically. Even if you don't use the 'dirprot' mode, swig will wrap what is minimally needed (and protected) for the code to compile. what is public, as usual, is always wrapped, and if you use the 'dirport' - Final fixes for the OSS to compile with SWIG 1.3.23 (my very very ugly C++ + templates + everything mounters wrap). 10/25/2004: wsfulton [C#] New commandline option -dllimport. This enables one to specify the name of the DLL for the DllImport attribute. Normally this name comes from the module name, so now it is possible to override this: swig -csharp -dllimport xyz example.i will generate for all the wrapped PInvoke methods: [DllImport("xyz", EntryPoint="...")] public static extern ... The wrappers from many different SWIG invocations can thus be compiled into one DLL. A new special variable $dllimport can also be used in typemaps, pragmas, features etc. This will get translated into the value specified by -dllimport if specified, otherwise the module name. 10/22/2004: wsfulton [Java] Patch #1049496 from Scott Michel fixes directors methods with enums when wrapped with typesafe or proper Java enums. 10/21/2004: wsfulton Fixes for default arguments in director constructors (Python, Ruby, Ocaml). 10/21/2004: mmatus - [Python] Add the '-cpluscast' option to enable the 'new' C++ casting operators, such as 'static_cast', inside the typemaps. By default swig use the old C cast style, even when parsing C++. - [Python] Add the '-new_vwm' option to enable the new SwigValueWrapper mode. Now this is mainly for testing that the typemaps are really safe for any future solution, but you can use it if you have a very strange error with default cosntructors missing + %apply + %typemap, and if everything else fails (see valuwrapper_opaque.i for alternative and current solutions). If you are a user that don't know what is SwigValueWrapper, don't even try it. - [Python] Add the '-noh' option to be used with directors and when you prefer to disable the generation of the director header file. If not used, swig will work as usual generating both the wrap.cxx and wrap.h files. If you use it, swig will only generate wrap.cxx. 10/21/2004: wuzzeb (John Lenz) - If you define SWIG_TYPE_TABLE when compiling a wrapper file, the runtime types will be stored in the given type table name. Using this, you can seperate different modules to share their own type systems. -DSWIG_TYPE_TABLE=Mytable - [Python] If you define SWIG_STATIC_RUNTIME then the type information will be static to this wrapper. Nothing will be shared with any other modules - [Python] If you define SWIG_LINK_RUNTIME, then instead of using the new way of sharing type information, the wrapper will expect to be linked against the Lib/linkruntime.c file. Any modules compiled with SWIG_LINK_RUNTIME and linked against linkruntime.c will all share type information. 10/20/2004: mmatus - [Python] Initial fix for python/import example. Please update the Makefile (autoconf, configure, etc, expert), since now probably is only working with g++, icc and a few other compilers that have the -shared option. We need to create additional shared libraries for the virtual destructors. Old and usually forgotten C++ requirement. Same fix need to be used in perl, I think. - [Python] Fix generation of header file for directors, now directors.swg is also included, so, it can be really used from C++, and it solves some problem with compiler that require that, even with the simple swig inclusion. - [Python] Reordering the methods and moving some bodies outside the class declaration. This is needed due to some gcc-2.96 internal compiler errors. It seems the PYTHON class is getting too large to been declared and defined at the same time. - Add the -oh option to change the output header file name if needed: swig -c++ -python test.i -o test.CC -oh test.HH this is mainly needed when using directors, and if the current default header file name is not good for you, which is generated as follow: swig -c++ -python test.i => test_wrap.h swig -c++ -python test.i -o test.CC => test.h 10/20/2004: wsfulton 1) Compact default arguments feature added. This feature allows one to use the default argument code generation that was used in SWIG-1.3.22 and earlier versions. It produces more compact wrappers as only one wrapper method is generated for any method with default arguments. So the advantage is it generates less code but has the original limitations, like it it does not work with all default arguments and default arguments cannot be taken advantage of in the strongly typed languages (C# and Java). It is implemented via the usual %feature mechanism: %feature("compactdefaultargs"); 2) Keyword arguments (kwargs) are working again for default arguments in the languages that support it, ie, Python and Ruby. The new default argument wrapping approach using overloaded methods cannot support kwargs so the compact default argument feature is automatically turned on when kwargs are specified, by %feature("kwargs"). 3) Compact default arguments are also automatically turned on when wrapping C (not C++) code. This is to support the bizarre notion of default arguments for C code. 10/20/2004: wsfulton Overloaded templated functions in namespaces also working now. Templated functions with default arguments in namespaces too. 10/19/2004: mmatus - Allow to disable the new SwigValueWrapper mechanism, if you add the following line in your language main. /* Turn on safe value wrapper use mode */ Swig_value_wrapper_mode(1); Now is only active in python. All the other languages are using the old resolution, but they can also use the "valuewrapper"/"novaluewrapper" features to fix some of the old broken cases. Note, however, that not all the broken cases can be solved in that way. The new mechanism seems to be working fine in perl, ruby and tcl, but failing in some typemaps in java. Hence, is upto the language maintainer to test it, and decide to enable it or not. Look at the valuewrapper_opaque.i for examples. - Fix more SwigValueWrapper cases when the new mechanism is active. Now it also check for local typemap variables, see valuewrapper_opaque.i for an example when this is needed. But again, this extra checking will only be activated when using the new value wrapper mode. - [Python] Fix variable wrapping of classes with private assign operators. It should be easy to fix in all the other modules, instead of checking if (!Getattr(n,"immutable")) ... you need to verify if (is_assignable(n)) ... Look at the private_assign.i for an example. 10/18/2004: mmatus - %features "director"/"nodirector" now work as expected. - General fixes in %feature to resolve function decl properly, %feature("hello") foo(); char foo() -> f() // was working char *foo() -> f().p // it wasn't - Template + specialization + default template args now is working, (don't confuse with template + default arg values, that was solved before), now this ugly case is working: template > struct Vector { Vector(T a){} }; template <> struct Vector { Vector(){} int foo() { return 0; } }; %template(V_c) Vector >; %template(V_i) Vector; // picks Vector > %template(V_d) Vector; // picks the specialization this is needed for automatic STL support (later will be). - Fix the template + typedef errors in test-suite, which probably will fix another group of strange template + namespaces + typedefs errors. - %warnfilter is working better now, parser.y tries to use them when needed. - **** New default type resolution method (stype.c) ***** It preserves the original mixed types, then it goes 'backward' first deleting the qualifier, then the inner types, for example: typedef A *Aptr; const Aptr&; r.q(const).Aptr -> r.q(const).p.SWIGTYPE r.q(const).p.SWIGTYPE -> r.p.SWIGTYPE r.p.SWIGTYPE -> r.SWIGTYPE r.SWIGTYPE -> SWIGTYPE enum Hello {}; const Hello& hi; r.q(const).Hello -> r.q(const).enum SWIGTYPE r.q(const).enum SWIGTYPE -> r.enum SWIGTYPE r.enum SWIGTYPE -> r.SWIGTYPE r.SWIGTYPE -> SWIGTYPE int a[2][4]; a(2).a(4).int -> a(ANY).a(ANY).SWIGTYPE a(ANY).a(ANY).SWIGTYPE -> a(ANY).a().SWIGTYPE a(ANY).a().SWIGTYPE -> a(ANY).p.SWIGTYPE a(ANY).p.SWIGTYPE -> a(ANY).SWIGTYPE a(ANY).SWIGTYPE -> a().SWIGTYPE a().SWIGTYPE -> p.SWIGTYPE p.SWIGTYPE -> SWIGTYPE before it always stops after finding ref/pointer/enum/array/etc. Now, then, you can define (use and apply) 'higher' typemaps such as: %typemap(in) SWIGTYPE* const& %typemap(out) char FIXSIZE[ANY] %typemap(in) SWIGTYPE* const& %typemap(in) const enum SWIGTYPE& %typemap(in) SWIGTYPE[ANY][ANY] %typemap(in) const char (&)[ANY] It is possible with this change that previous typemaps that were defined (but ignored), now will start to work. Also, it is necessary check for the '%typemap(varin) SWIGTYPE[]', before it was usually not defined (but char[] was), and that can produce some inconsistencies. *** POTENTIAL INCOMPATIBILITY *** This change was needed for STL, since std::vector std::vector, etc, will always generate methods that mix const references with the vector type. Now that is working, all the std::container specialization will not be needed anymore, well, in theory. In the practice, everythin is working as before until the proper mixed types are defined and the libraries simplified to use them. - Change the behavior of extern "java"/"fortran"/"etc", now swig produces a warning, and use extern "C" instead. The warning can also be disable with the "-w 313" flag. (WARN_PARSE_UNDEFINED_EXTERN). - SwigValueWrapper is now more selective (lang.cxx). [Perl/Tcl] - Fix some typemaps (perl/tcl) to work properly with SwigValueWrapper. This was not a problem with SwigValueWrapper, but with the typemaps that now are safe to use with %apply. [Python] - Fix %callback/%pythoncallback work now as before after the def args changes. Also, %callback now is an alias for %pythoncallback, so, they do the same. [Python/Ruby] - %callback is more usable and uniform: %callback("%s_cb") foo(); // for both, python/ruby %callback("%s_cb"); // for both, python/ruby %callback(1) foo(); // only in python. 10/17/2004: arty [OCAML] - Tweak to enum typing for soundness in the presence of multiple modules. - global functions are now unambiguous in multiple loaded modules. - Fixed test case code to build multimodule test cases correctly. - There is no way to share overload resolution across modules because of soundness issues. If the user wants to call some function foo from an arbitrary module bar, they will have to use Bar._foo to call it correctly. Later I will fix the camlp4 module to do something clever in this case. - Promided performance overhaul of class mechanism. - Removed symbol hack for ocaml-3.07 and below which is not needed for ocaml-3.08 and above. 10/16/2004: wuzzeb (John Lenz) [CHICKEN] - Completly change how chicken.cxx handles CLOS and generic code. chicken no longer exports -clos.scm and -generic.scm. The clos code is exported directly into the module.scm file if -proxy is passed. - The code now always exports a unit. Running the test-suite is now majorly broken, and needs to be fixed. - CLOS now generates virtual slots for member variables similar to how GOOPS support works in the guile module. - chicken no longer prefixes symbols by the module name, and no longer forces all names to lower case. It now has -useclassprefix and -closprefix similar to how guile handles GOOPS names. 10/16/2004: wsfulton Templated functions with default arguments working with new default argument wrapping approach. The new approach no longer fails with the following default argument pattern (previously failed with some primitive types, like unsigned primitive types): template int foo(const T& u = T()); %template(foo) foo; This relies on the templated function overloading support just added, so all the combinations of overloading by template parameters and normal parameters as well as overloading with default parameters works. 10/16/2004: wsfulton Added support for the large range of templated function overloading that C++ supports. - Overloaded templated functions, eg template int overload(T t); template int overload(T t, const T &r); - Fixes where the templated type is not used in the parameter list, eg template void xyz(); template<> void xyz(); - Fixes for overloading of plain functions by a templated function: void abc(double d); template void abc(T t); - Overloading by templated parameters fixed: template void foo(T t) {} template void foo(T t, U u) {} %template(foo) foo; - All combinations of the above also working including specializations, eg: void abc(double d); template void abc(T t); template<> void abc(double t); template<> void abc(int t); 10/16/2004: wuzzeb (John Lenz) - Remove the ability to share type information by using c linking. All type sharing happens through a global variable in the target language. + Remove SWIG_NOIMPORT, SWIG_RUNTIME, and related defines. + Deprecate -runtime, -noruntime command line options + Update test-suite common.mk to correctly build multicpptest + Remove reference to precommon.swg + Update the guile_gh interface to share data by a global var instead of c linkage. - Remove Advanced.html, since everything in it is now obsolete 10/09/2004: mmatus - Split the python std/STL C++ library files, now all the language independent definitions are under the directory Lib/std and hence, can be used from other languages. - Add more documentation to the Python STL, and clean unnecessary code. - Add initial C99 complex support, and some fixes for long double. 10/08/2004: mmatus - Fix the SwigValueWrapper for opaque types, now it is applied for opaque templates and classes, for which we don't know if there is or not a default constructor, ie struct A { A(int); }; Still, if you know that you class has a default constructor, and for some very very particular reason you want to avoid the SwigValueWrapper, and you don't want or can't expose the class to swig, now you can say %feature("novaluewrapper") A; class A; or the other way around, if the class has a default constructor, but you want to use the value wrapper, you can say %feature("valuewrapper") A; struct A { A(); .... }; - Fix for char > 128, ie const char tilde_a = '\341'; - Add patch 1041858 for $lextype, which carries the literal type of a symbol. See lextype.i in the test-suite for more details. 10/07/2004: wsfulton {Ruby, Java] Fix director + 'empty' throws struct A { A() throw(); virtual ~A() throw(); int foo() throw(); }; 10/06/2004: wuzzeb (John Lenz) [TCL] - Fix bug reported by William A. Hoffman propagating clientdata between modules. Added clientdata_prop.multicpptest to check for this bug. The fix involved the following changes: + SwigType_clientdata_collect does not need to check types in r_resolved because we only want to propagate clientdata to typedefed classes, and r_mangled already takes care of typedefs. + SWIG_TypeRegister now copies the clientdata field correctly + Move SWIG_Guile_PropagateClientData function from guile module into common.swg, because we need to call it from both guile and tcl. + Add base_names to swig_class to delay the lookup of bases. SWIG now exports the base names and only when the base swig_class is needed is SWIG_TypeQuery(name)->clientdata looked up. - conversion_ns_template testsuite test was failing because the name of the wrapped constructor function was not calculated correctly for structs. Fixed. 10/06/2004: wsfulton Fixes for default arguments used in directors - in virtual methods and director constructors. 10/06/2004: mmatus Fix the __cplusplus macro, and bug 1041170. Now it is working as supposed, ie, you can safely use #ifdef __cplusplus ... all over swig, including inside %defines and %{ %} bodies. *** POTENTIAL INCOMPATIBILITY *** The old trick of using #if __cplusplus doesn't work any more. So, if you have your own typemaps using that syntax, you will need to migrate them to use "#ifdef __cplusplus". 10/05/2004: wuzzeb (John Lenz) - Reorganize how runtime type information is stored and shared between modules. For chicken and mzscheme, I removed the ability to use runtime libraries, while perl, tcl, python, and ruby default to using the new method but can go back to the old method by declaring SWIG_ALLOW_RUNTIME. - line 582 in mzscheme.cxx was generating a segfault on imports.multicpptest, so I fixed it. 10/05/2004: wsfulton Fixes for %extend and overloaded static methods with default arguments. 10/05/2004: mmatus - [python] Fix director + method with 'empty' throw, ie struct A { virtual int foo() throw(); }; other languages should also easy to fix, look for Getattr(n,"throw") in python.cxx. - Fix director + destructor with 'empty' throw struct A { virtual ~A() throw(); }; - Now SWIG_FEATURES parse all and the same options you can pass to swig in the command line. - New command line flag: -features , as in swig -features autodoc=3,director ie, any global feature can be initialized from the command line. This is mainly for testing, but users can also take advantage of it. 10/04/2004: mmatus - Properly qualify type in syntax as 'long(2)' or 'Foo()', this solve old problem with default args, and probably other problems around. However, the default arg problem was also already solved by William (see below). - Fix feature_set and feature_get methods. Before they look from particular to general and keep the first feature found. This didn't work well with templates. Now the methods look from general to particular, and override any found feature. - Previously a feature could not be applied to constructors or destructors that weren't explicitly declared in the class. This is now fixed, for example: %feature("featurename") Foo() "..." %feature("featurename") ~Foo() "..." class Foo { // implicit Foo() and ~Foo() }; - Fix missing features for default const/dest, by really 'creating' the methods and applying the features. - Fix return_const_value.i case by adding SwigValueWrapper specialization. - Fix %extend + overload, including overloading actual class methods. - Adding more cases in related files in the test-suite. 10/04/2004: wsfulton Changes to the way default arguments are wrapped. Previously a single method was generated for each method that had default arguments. If a method had 5 arguments, say, of which 1 had a default argument then the call to the wrapped method would pass 5 arguments. The default value was copied into the wrapper method and used if the scripting language passed just 4 arguments. However, this was flawed as the default argument sometimes does not have global access, for example SWIG would generate code that couldn't compile when wrapping: class Tricky { public: void foo(int val = privatevalue); void bar(int val = Tricky::getDefault()); private: static int getDefault(); enum { privatevalue = 200 }; }; Also bugs in resolving symbols generated code that wouldn't compile, for example (probably fixable though): namespace Space { class Klass { }; Klass constructorcall(const Klass& k = Klass()); } The approach also does not work for statically typed languages (C# and Java) as these languages do not allow methods to have variable number of arguments. Although C# has a mechanism to pass a variable number of arguments they must be of the same type and are more like varargs. The new approach solves the above problems and wraps methods with default arguments as if the method was overloaded. So SWIG will now treat void foo(int val=0); as if it had parsed: void foo(int); void foo(); The code generated is then exactly the same as if SWIG had parsed the two overloaded methods. The scripting languages count the arguments passed and call the appropriate method, just like overloaded methods. C# and Java are now able to properly wrap methods with default arguments by generating extra methods, again as if the method was overloaded, so for: void bar(string s="hello", double d=10.0, int i=0); the following proxy methods are generated: void bar(string s, double d, int i); void bar(string s, double d); void bar(string s); void bar(); The new approach comes with a couple of minor knock on effects. 1) SWIG support for default arguments for C (not C++) code no longer works. Previously you could have this interface: %{ void foo(int val); %} void foo(int val=0); and call the wrapped method from a scripting language and pass no arguments whereupon the default of 0 was used. You can get the same behaviour for C code by using the "default" typemap: %typemap(default) int val "$1 = 0;"; %{ void foo(int val); %} void foo(int val); or you could of course compile your code as C++ if you want C++ features :) : %{ void foo(int val=0); %} void foo(int val=0); A couple of SWIG's libraries used this C extension and these have been modified to use the "default" typemap. The "default" typemap is thus unchanged (and still is not and is not fully supported by C# and Java, and is likely to remain so). 2) All features (%feature, %rename, %ignore etc) no longer work as if the method with default arguments is just one method. For example, previously %ignore foo(int); would have ignored the method completely. Now it will only ignore foo(int) but not the extra foo() method. Instead use: %ignore foo; to ignore them all. or %ignore foo(int); %ignore foo(); This of course allows one to fine tune the wrapping, for example one could use: %rename(fooint) foo(int); %rename(foodefaults) foo(); void foo(int val=0); and call them from any language like so: fooint(200) foodefaults() or for example ignore the extra overloaded method, so the defaults cannot be used: %ignore foo(); void foo(int val=0); *** POTENTIAL INCOMPATIBILITY *** 10/2/2004: mmatus [Python] - More cleaning up and uniformation on the Python Lib - Added Robin's docstring patch, plus some fixes, plus some extensions, see autodoc.i example in the test-suite, and try using %feature("autodoc","extended"). This patch is not a complete solution for the documentation problem, just enough to inform python about the parameter list. The expected swig documentation support is far far away yet. 10/1/2004: mmatus - Fix the %callback feature (only used in ruby and python examples, by now, but it should be generic), now member callbacks are working again - Fix wrapping of functions pointers like std::ostream& std::endl(std::ostream&); ie, the ones that return references or enums. [Python] Add the %pythoncallback directive, which is an improved version of %callback, ie, %pythoncallback(1) foo; %pythoncallback(1) A::bar; %pythoncallback(1) A::barm; int foo(int a) { return a; } struct A { static int bar(int a); int barm(int a); }; int foobar(int a, int (*pf)(int a)); in python you can use foo(2) foobar(2,foo) A.bar(2) foobar(2,A.bar) ie, no additional pointer elements are created, and the original 'foo' and 'A.bar' can be used as parameters. In the case of member function however, still you need to use the special variable Class::_cb_ptr, ie: foobarm(3, a, A.barm_cb_ptr) we will try to fix this situation also, but later. [Python] Add more elements from the STL library, now you can use import std std.cout << "hello " << 123 << std.endl [Python] Fix in/out return mechanism, now swig will behave as 1.3.21 but using a python list when needed. The problem is that the types std::pair,std::vector,etc, use tuples, and they interfer with the previous inout tuple type. By using lists we solve the conflicts, swig acts as before, but returns a list when more than one parameter are using the OUT typemap. See the new inout.i example in the test-suite. *** POTENTIAL INCOMPATIBILITY FOR PYTHON MODULE *** [Python] Much better error messages for bad arguments, now you always get the argument number where the error occurred. 09/27/2004: wsfulton Patch from Bill Clarke - 1) Warning emitted when -importall and -includeall is used together, with -includeall taking precedence. 2) Ensure SWIGIMPORTED is always defined when a file is being imported with %import. Note that this is not the same as SWIGIMPORT, which gets defined in all generated wrapper files. 09/26/2004: mmatus - add %feature("exceptionclass") to identify a class used as exception. Before swig identified and marked a class using the "cplus:exceptionclass" attribute. However, the class needed to appear on an throw() statement. Now swig keeps trying to identify the exception classes, as before, but it also allows the user to mark a class by using the %feature explicitly. (mostly relevant for python and chicken) [Python] - fix -modern option + exceptions, which mix old class style with the new one. So, we always need to emit the "nonmodern" python code. - add the "python:nondynamic" feature and its handler now if you have %pythonnondynamic A; struct A { int a; int b; }; then, in the python side aa = A() aa.a = 1 # ok aa.b = 2 # ok aa.c = 3 # error, the class can not be extended dynamically. Since this is a feature, you can use %pythonnondynamic; or %pythondynamic; [ Note: %pythondynamic since deprecated ] to force all the wrapped classes to be "nondynamic" ones. The default, as in regular python, is that all the wrapped classes are dynamics. So, careful with your spelling. 09/14/2004: mmatus - Support the -I- option. - Differentiate between %include and %include "file". This fix several corner cases. [Python] Several patches: - Normalize the Lib file names: *.swg internal files, *.i user files. - Fix Char[ANY] typemaps, so they also delete any extra '\0' chars, now they behave as before (1.3.21). Still, you can use the SWIG_PRESERVE_CARRAY_SIZE macro if you need to preserve the original size (see pystrbase.swg). - Add the Char FIXSIZE[ANY] typemaps, to preserve the original C array sizes (see above). Though, you can't use them yet since %apply and arrays are not working together. - Add pyfragments.swg, now the user can add fragments to override the default ones. 09/10/2004: wsfulton Patch from Bill Clarke which fixes spurious preprocessor bug which shows on Solaris and gcc, eg: Warning(202): Could not evaluate '!defined(SWIGJAVA) && !(defined(SWIGCSHARP)' Also fixes a bug where '#if "a" == "b" == 1' wouldn't have worked 09/10/2004: wsfulton Restored multiple build directories for the test-suite. Patch from Bill Clarke. 09/06/2004: wsfulton Added the missing runtime.dsp Visual Studio project files for the import examples to work. Version 1.3.22 (September 4, 2004) ================================== 09/03/2004: wsfulton The swig.m4 macro for use with the Autoconf/Automake/Libtool has been removed and is no longer installed. Please use the new and better maintained version derived from swig.m4 in the Autoconf macro archive. See http://www.gnu.org/software/ac-archive/htmldoc/ac_pkg_swig.html and http://www.gnu.org/software/ac-archive/htmldoc/ac_python_devel.html. 09/01/2004: wsfulton [Perl] Applied patch #1019669 from Christoph Flamm. Adds support for %feature("shadow") in the same way as it works in Python. This enables one to override the generated shadow/proxy methods, including constructors and destructors. For example: /* Let's make the constructor of the class Square more verbose */ %feature("shadow") Square(double w) %{ sub new { my $pkg = shift; my $self = examplec::new_Square(@_); print STDERR "Constructed an @{[ref($self)]}\n"; bless $self, $pkg if defined($self); } %} class Square { public: Square(double w); ... }; 08/31/2004: mmatus [Python] Incompatibility reported by Bill Clarke (llib@computer.org): If you are using Sun Studio 8 (and possibly earlier versions) to compile the output produced by swig 1.3.22rc1, and you are using C++ and STL templates then you need to use either "-runtime" or "-noruntime". If you use neither of these options then you will probably get compiler errors when trying to compile the wrapper file; the error message will be like this: The name SWIG_Python_ConvertPtr[...] is unusable in static swigpy::traits_asptr[...] If you get this error message, you need to regenerate your wrapper file using 'swig -runtime' or 'swig -noruntime'. You shouldn't get this problem with Sun Studio 9. *** POTENTIAL INCOMPATIBILITY FOR PYTHON MODULE *** 08/26/2004: wsfulton [Perl] Applied #932333 from Ikegami Tsutomu. Fixes long long *OUTPUT and unsigned long long *OUTPUT typemaps in typemaps.i. 08/26/2004: wsfulton Applied patch #857344 from Art Yerkes. Workaround for autoconf bug when running 'make install'. 08/26/2004: wsfulton [Perl] Part of patch #982753 applied. This implements a %perlcode directive. It allows one to add Perl code to the generated .pm file. Works the same as %pythoncode. 08/26/2004: wsfulton [Java] Fix for directors when wrapping virtual methods with exception specifications that were not simple types. Previously code was generated that didn't compile, for example when the exception specification was a pointer. 08/25/2004: wsfulton [C#] Typemap fix for methods that return char *. The CLR would incorrectly delete the memory pointed to by char *. Also applied the same correction to the char array typemaps. 08/24/2004: wsfulton Fixes for -fmicrosoft error/warning message display: - End of file (EOF) warning messages not displaying in correct format - Some messages containing a file path were displaying a double backslash instead of a single backslash 08/23/2004: wsfulton Applied patch #1011604 submitted by Charles Schwieters. Fix for 64 bit tcl interpreters. 08/23/2004: wsfulton Fix for bug #875583 - enum forward declarations previously gave a syntax error. 08/23/2004: mkoeppe [Allegro CL] Use typemaps "ffitype" and "lisptype" to determine the FFI type specifiers from the C type. This makes it possible, for instance, to control whether a C "char" argument takes a Lisp character or a Lisp integer value. The default (taking Lisp characters) is done by these built-in typemaps: %typemap(ffitype) char ":char"; %typemap(lisptype) char "character"; If char means an integer instead, use these typemaps: %typemap(ffitype) char ":char"; %typemap(lisptype) char "integer"; 08/22/2004: wsfulton As discussed in bug #772453, the SWIG library directory is now installed into a different default directory. The library used to be installed to /usr/local/lib/swig1.3. It is now in the more usual architecture independent directory and I have additionally used a version specific subdirectory as the library will rarely work with older versions of SWIG. This release will thus use /usr/local/share/swig/1.3.22 by default, which can be tailored as before using './configure --swiglibdir'. 08/17/2004: mkoeppe [MzScheme] Add support to create native MzScheme structures from C structures. To convert a C structure to an MzScheme structure, use the new runtime macro SWIG_NewStructFromPtr in a typemap. Patch from Dmitriy Zavin. 08/12/2004: wsfulton Patch #837715 from Ben Reser to correctly detect Python lib directory on 64 bit systems. 08/12/2004: wsfulton [C# and Java] Prevent memory leaks in the case of early return from wrapper methods using const std::string & parameters. Modified Mark Traudt patch #951565. 08/12/2004: wsfulton Bug #943783 with patch fixes php char * out typemap NULL values. 08/03/2004: Ahmon Dancy [allegrocl] Additional case mode fixes. Also, make sure foreign types are exported. 07/24/2004: mkoeppe [Guile] In -scm mode, SWIG modules now exchange their pointer type information via the Guile interpreter. It is no longer necessary to build a runtime library or to use -noruntime and -runtime etc. The module (Swig swigrun) which was introduced in the change of 05/17/2004 is no longer automatically built. If you need it, run SWIG on the interface file swigrun.i. 07/23/2004: wsfulton [C#] Bug #917601 Mapping C++ bool fix from Mark Traudt 07/23/2004: wsfulton RPM fixes for latest CVS version including removal of runtime library. 07/23/2004: wsfulton Patch #908955 from Robert H De Vries. RPM file generation fix for Fedore Core 1 and Redhat AS2.1. 07/12/2004: wsfulton Patch #864689 from Robin Dunn: This patch corrects two problems in the XML output of SWIG: 1. There were often extra '/>\n' in the output. 2. value attributes were output with '\n' in them but since that is not technically legal most (all?) XML parsers will strip them out. Replacing the '\n' with the ' ' entity reference solves this as that is legal and XML parsers will convert it to a '\n' when reading the values back in. This patch also adds a new global command line option that will allow the parse tree to be written out in XML *after* some other language module has been run, in order to be able to get extra info that the language module puts in the tree. In this way the XML is a post-processed version of the tree rather than a pre-processed version. Command line option is -dump_xml or -xmlout 07/12/2004: wsfulton [Java] Patch from Scott Michel to fix typesafe enums and proper enums with directors. 07/12/2004: wsfulton HTML documentation (makechap.py) file generator missing end of line patch #908951 from Robert de Vries. 07/08/2004: wsfulton The deprecated runtime library build has been removed. This also removes the dependency on Libtool. Libtool is no longer required to build SWIG. The associated -ldflags SWIG commandline option has also been removed. The examples and test-suite testcases that used the runtime library have been updated to use the replacement approach to using SWIG across multiple modules, that is they use the -noruntime and -runtime commandline options, see Modules.html. Effectively they build their own runtime libraries using -runtime. The examples are import and import_template. The test cases are in the imports and template_typedef_import directories. Anyone who wants the original runtime libraries can either run the test-suite or build the examples and use the appropriate shared object/DLL that is generated with the -runtime commandline option. For example libimports_runtime.so (Python calls it lib_imports_runtime.so) is generated after running the 'make imports.multicpptest' testcase in the Examples/test-suite/ directory. Or use libruntime.so / runtime.dll after building the import examples in Examples//import. 07/07/2004: mkoeppe [Allegro CL] Convert character and string literals in constants to CL syntax. Fix FF:DEF-FOREIGN-CALL for mixed-case C functions. 06/27/2004: wsfulton [Java] New feature for Java exceptions with format %javaexception(exceptionclasses). This feature is a slight enhancement to %exception and the only difference is the addition of the exception classes which are generated into a throws clause. The 'exceptionclasses' is a comma separated list of classes which will be added to the associated proxy method's throws clause. The 'exceptionclasses' are specified like the exception classes in the 'throws' attribute in the typemaps. This feature should be used for correctly handling checked exceptions thrown from JNI code. For example: %javaexception("java.lang.Exception") throwException %{ ... convert a std::logic_error into a java.lang.Exception using JNI code ... %} #include void throwException() { throw std::logic_error("Logic error!"); } will generate a method with a throws clause in the module class: public static void throwException() throws java.lang.Exception { ... } 06/27/2004: wsfulton [C#] New %csconstvalue(value) feature directive for use with constants and enums. This works the same way as %javaconstvalue. For C#, this directive is the only way that one can fix wrapping of C/C++ enums with proper C# enums if the enum item's initialiser cannot compile as C# code. This is because Java enums can use a call into C code to initialise the enum item, whereas in C#, the enum value must be a compile time constant. That is, using %csconst(0) cannot be used in C# to initialise the C# enum item via a PINVOKE call. 06/27/2004: wsfulton [Java] New %javaconstvalue(value) feature directive for use with constants and enums. Sometimes the use of %javaconst(1) will produce code that won't compile under Java. If a compile time constant is required, %javaconst(0) is not an option. The %javaconstvalue directive achieves this goal and the value specified is generated as Java code to initialise the constant. For example: %javaconst(1); %javaconstvalue(1000) BIG; %javaconstvalue("new java.math.BigInteger(\"2000\")") LARGE; %javaconstvalue(10) bar; %{ const int bar = 10; %} %inline %{ #define BIG 1000LL #define LARGE 2000ULL enum Foo { BAR = ::bar }; %} Generates: public interface exampleConstants { public final static long BIG = 1000; public final static java.math.BigInteger LARGE = new java.math.BigInteger("2000"); } public final class Foo { public final static Foo BAR = new Foo("BAR", 10); ... } Previously, none of BIG, LARGE or BAR would have produced compilable code when using %javaconst(1). 06/27/2004: wsfulton %feature enhancements. Features can now take an unlimited number of attributes in addition to the feature name and feature value. The attributes are optional and are much the same as the typemap attributes. For example, the following specifies two optional attributes, attrib1 and attrib2: %feature(featurename, attrib1="attribval1", attrib2="attribval2") name "val"; %feature(featurename, val, attrib1="attribval1", attrib2="attribval2") name; 06/27/2004: wsfulton %feature improvements for the syntax that takes the feature value within the %feature() brackets. The value specified is no longer restricted to being just a string. It can be a string or a number. For example, this is now acceptable syntax: %feature("featurename",20.0); whereas previously it would have to have been: %feature("featurename","20.0"); Useful for features that are implemented as a macro, for example: #define %somefeature(value) %feature("somefeature",value) These will now work accepting either a string or a number: %somefeature("Fred"); %somefeature(4); 06/06/2004: wuzzeb (John Lenz) [Chicken, Guile] - Created the Examples/test-suite/schemerunme directory, which holds all the runme scripts for guile and chicken (and possibly mzscheme...). The guile and chicken _runme files then (load "../schemerunme/foo.scm"). - In chicken module, fix a few bugs invlolving dynamic casts. 06/03/2004: wsfulton Patch to fix wrapping of templated methods. ISO compliant compilers, like Comeau and GCC-3.4.0, don't like the template specifier that SWIG was generating when calling the method. This fix may break some non standard compliant compilers, for example, Sun workshop compilers prior to version 6.2.p2. Patch submitted by Bill Clarke. 06/03/2004: wsfulton [Java, C#] Undocumented special variable $imclassname removed. New special variable $module is replaced by the module name, as specified by %module or -module commandline option. $imclassname can be created from $module. 06/03/2004: wsfulton [C#] Same as for Java below. The new typemaps are named differently, namely, csbody and csbody_derived. The deprecated typemaps are csgetcptr and csptrconstructormodifiers. *** POTENTIAL INCOMPATIBILITY FOR C# MODULE *** 06/03/2004: wsfulton [Java] Typemap changes for the Java proxy / typewrapper and enum classes. A new typemap called javabody contains the essential support code for generation into the body of these classes. There is also a new javabody_derived typemap which is used instead for wrapped classes that have a wrapped base class. The code is basically, the getCPtr() method and swigCPtr and swigCMemOwn member variables. These used to be hard coded with no way to modify the code. The introduction of this typemap makes it possible for the user to tailor nearly every aspect of the code generation. The exception now is the code for director classes. The javagetcptr and javaptrconstructormodifiers typemaps are deprecated and are no longer used as the code that these generated can be put in the more flexible javabody and javabody_derived typemaps. *** POTENTIAL INCOMPATIBILITY FOR JAVA MODULE *** The following macros contributed by Scott Michel may help you upgrade if you have used the javagetcptr typemap: /* Utility macro for manipulating the Java body code method attributes */ %define SWIGJAVA_ATTRIBS(TYPENAME, CTOR_ATTRIB, GETCPTR_ATTRIB) %typemap(javabody) TYPENAME %{ private long swigCPtr; protected boolean swigCMemOwn; CTOR_ATTRIB $javaclassname(long cPtr, boolean cMemoryOwn) { swigCMemOwn = cMemoryOwn; swigCPtr = cPtr; } GETCPTR_ATTRIB static long getCPtr($javaclassname obj) { return (obj == null) ? 0 : obj.swigCPtr; } %} %typemap(javabody_derived) TYPENAME %{ private long swigCPtr; CTOR_ATTRIB $javaclassname(long cPtr, boolean cMemoryOwn) { super($moduleJNI.SWIG$javaclassnameUpcast(cPtr), cMemoryOwn); swigCPtr = cPtr; } GETCPTR_ATTRIB static long getCPtr($javaclassname obj) { return (obj == null) ? 0 : obj.swigCPtr; } %} %enddef /* The default is protected getCPtr, protected constructor */ SWIGJAVA_ATTRIBS(SWIGTYPE, protected, protected) /* Public getCPtr method, protected constructor */ %define PUBLIC_GETCPTR(TYPENAME) SWIGJAVA_ATTRIBS(TYPENAME, protected, public) %enddef /* Public getCPtr method, public constructor */ %define PUBLIC_BODYMETHODS(TYPENAME) SWIGJAVA_ATTRIBS(TYPENAME, public, public) %enddef 06/03/2004: wsfulton [Java, C#] The contents of the class modifier typemaps and pragmas have changed. They must now include the class type. Previously 'class' was hard coded. This change enables flexibility into what type of class is generated, for example the proxy class could be an interface instead of a class. For Java this affects the javaclassmodifiers typemap and the jniclassclassmodifiers and moduleclassmodifiers pragmas. For C# this affects the csclassmodifiers typemap and the imclassclassmodifiers and moduleclassmodifiers pragmas. Unless you have overridden the default versions of these typemaps or pragmas, you shouldn't be affected. However, if you have, upgrading is easy, for example class Foo {}; %typemap(javaclassmodifiers) Foo "public final" must now be: class Foo {}; %typemap(javaclassmodifiers) Foo "public final class" *** POTENTIAL INCOMPATIBILITY FOR C# MODULE *** *** POTENTIAL INCOMPATIBILITY FOR JAVA MODULE *** 05/31/2004: wsfulton Fix for C++ exception specifications that are references. Problem reported by Oren Miller. Also improves the generated exception declarations in the catch handler for pointers - a pointer is used instead of a reference to a pointer. Added default throws typemaps for SWIGTYPE &, SWIGTYPE * and SWIGTYPE[ANY] (Java and C#). 05/31/2004: wsfulton [Java, C#] Some minor typesafe enum improvements, including storing the name of the enum item. The toSring() / ToString() methods are overridden to return this name. 05/30/2004: wuzzeb (John Lenz) [Chicken] - Update how examples and the test suite are built. - Symbol names are no longer converted to lower case - Added union_runme.ss, which was copied and modified from the guile module 05/26/2004: lballabio (Luigi Ballabio) Committed on behalf of Marcelo (who still has problems with the SourceForge CVS.) Added Python typemaps for FILE* with (Python-only) test. 5/24/2004: dancy * Allegro CL module: Now using some macros (defined in Lib/allegrocl/allegrocl.swg), swig-defconstant and swig-defun, for defining constants and foreign functions. This makes the generated file a bit neater. Now strips a layer of parenthesis from constants. Uses (* :void) instead of :foreign-address now. 05/20/2004: wsfulton Unnamed enum global variables are now supported in addition to the recently added support for unnamed enum member variables. For example: struct Foo { enum { enum1, enum2 } MemberInstance; }; enum { enum3, enum4 } GlobalInstance; The int typemaps are used for wrapping the get/set accessor methods. If the sizeof an enum is not the same size as an int then setting the variable will silently do nothing as the casts cannot be easily and portably generated. If you need to solve this highly obscure situation, write the assignment using the %exception feature. 05/20/2004: wsfulton [C#] C# enum wrapping mods. Similar to the Java module, enums can be wrapped using one of 3 approaches: 1) Proper C# enums - use %include "enums.swg" 2) Typesafe enums - use %include "enumtypesafe.swg" 3) Simple constant integers (original approach) - use %include "enumsimple.swg" See each of these files for further details. Each of these files use typemaps and a new feature to control the generated code. The feature is: %csenum(wrapapproach); where wrapapproach should be one of: "proper", "typesafe", "typeunsafe" or "simple". [No implementation deemed necessary for type unsafe enums]. The default approach is proper C# enums. Anonymous enums are always wrapped by constant integers. *** POTENTIAL INCOMPATIBILITY FOR C# MODULE *** 05/20/2004: wsfulton [Java] Java enum support added. There are now 4 ways in which enums can be wrapped: 1) Proper Java enums - use %include "enums.swg" 2) Typesafe enums - use %include "enumtypesafe.swg" 3) Type unsafe enums (constant integers) - use %include "enumtypeunsafe.swg" 4) Simple constant integers (original approach) - use %include "enumsimple.swg" See each of these files for further details. Each of these files use typemaps and a new feature to control the generated code. The feature is: %javaenum(wrapapproach); where wrapapproach should be one of: "proper", "typesafe", "typeunsafe" or "simple". The default typemaps will handle enums that may or may not have specified initial values, for example ten is specified: enum Numbers { zero, ten(10) }; However, the amount of generated Java code can be cut down, by modifying these typemaps if none of the enums have initial values (proper Java enums and typesafe enums approach). The default approach is typesafe enums. Anonymous enums are always wrapped by constant integers. *** POTENTIAL INCOMPATIBILITY FOR JAVA MODULE *** 05/11/2004: wsfulton [Java, C#] Fix bug using %rename on enum items and when using %javaconst(1) / %csconst(1) For example, the following used to generate code that wouldn't compile: %rename(Obj) Object; enum Grammar { Subject, Object }; 04/28/2004: wsfulton [Java, C#] Minor fixes when using combinations of the javainterfaces, javabase, csinterfaces and csbase typemaps. 05/18/2004: wsfulton [Java] JVM link failure on some systems fixed when using std_vector.i. Also adds default vector constructor for use from Java. 05/17/2004: mkoeppe (Matthias Koeppe) [Guile] New runtime functions SWIG_PointerAddress, SWIG_PointerType, SWIG_IsPointerOfType, SWIG_IsPointer. [Guile] In -scm mode, wrap several SWIG runtime functions and export them into the module (Swig swigrun). The runtime module is now built with "module" linkage. [Guile] GOOPS proxy objects now also print the pointer address of the C object. 05/14/2004: lyle Added Kou's patch for the Ruby %import directive so that modules with "nested" names are handled properly. Consider an interface file foo.i that has this %module declaration at its top: %module "misc::text::foo" Now consider another interface file spam.i that imports foo.i: %import foo.i Before this patch, this would result in the following code being generated for spam_wrap.c: rb_require("misc::text::foo"); With this patch, however, you'll get the correct path name for the call to rb_require(), e.g. rb_require("misc/text/foo"); See SourceForge Bug #928299. 05/12/2004: wsfulton Patch for emitting directors when %feature("director") specified for a class with no virtual methods, but does have a virtual destructor. Submitted by Kevin Smith. 05/06/2004: mkoeppe (Matthias Koeppe) New SWIG runtime function SWIG_TypePrettyName, which returns an unmangled type name for a swig_type_info object. [Guile]: Use it for printing pointer objects. 05/03/2004: dancy (Ahmon Dancy) * Lib/allegrocl/allegrocl.swg: Updated comments about identifer conversion. * Sources/Modules/allegrocl.cxx: Register /dev/null for "header" target. Also, disregard "const" qualifiers during type conversion. 05/02/2004: wuzzeb (John Lenz) [Chicken] Fix bug 782468. To fix this bug, the runtime code has been rewritten, and pointers are now represented as a C_SWIG_POINTER_TYPE. Chicken version > 1.40 is now required! * Typemap incompatibility: typemaps no longer use chicken_words. If a typemap needs some space, it should just call C_alloc * argout typemaps no longer use the /* if ONE */ construct to build an output list. A SWIG_APPEND_VALUE macro, exactly like guile and mzscheme is now used. 04/25/2004: mkoeppe (Matthias Koeppe) [Guile] In the generated GOOPS code, don't create methods that would not specialize any arguments; simply re-export the primitive functions. (This is a performance optimization which reduces load time and execution time.) [Guile] In -gh mode, fix the "too many initializers" error which was caused by an incompatible swig_type_info layout. [Guile] The typemap for FILE * in ports.i now also accepts a regular FILE * pointer object. Also a bug with Scheme file ports that are open for input and output has been fixed. 04/25/2004: wsfulton Change entry 03/21/2004 revoked. The change introduced another inconsistency (reference typemaps beings used instead of pointer typemaps for member variables as well as static member variables and global variables for some languages, but only for C++ and not C). This would break user's current typemaps and introduce further inconsistencies. Alternative solution required and being discussed. 04/10/2004: mmatus (Marcelo Matus) Added the -directors flag. This enables the director mode for the interface and all the classes that don't set the "feature:nodirector" explicitly. You can use this in your module if you want to use the director feature in all your classes, but it is most intended for testing purposes, like: make check-python-test-suite SWIG="../../../swig -directors" make check-ruby-test-suite SWIG="../../../swig -directors" make check-java-test-suite SWIG="../../../../swig -directors" These commands will run the entire test-suite using directors, and not only the specific 'directors_*' cases. This should be done from time to time. 04/10/2004: mmatus (Marcelo Matus) [python] Added support for std::wstring and wchar_t, for compiler and python versions that support them. When needed, use %inlcude std_string.i // 'char' strings %inlcude std_wstring.i // 'wchar_t' strings 04/10/2004: mmatus (Marcelo Matus) [python] Fix the default behaviour (seg. fault) when an inplace operator (+=,-=,...) was wrapped, as reported by Lucriz (lucriz@sitilandia.it), when the most common form was used: A& A::operator+=(int i) { ...; return *this; } ^^^^ ^^^^^^ ie, an object is returned and its contains the same 'this' value than the input object, which is deleted after the operation "a += b", leaving the result with no real object, but a seg. fault. To fix it, we needed to introduce a new feature and use an old one: %feature("self:disown") A::operator+=; %feature("new") A::operator+=; here, "self:disown" disable the ownership of the 'self' or input object, and the "new" feature transfers the ownership to the result object. The feature/solution could also be used in other languages that use gc and implement the inplace operators, or other operators, in a similar way. *** POTENTIAL INCOMPATIBILITY FOR Python MODULE *** If you already are using the inplace operators in python, and you implemented some kind of workaround to the problem fixed here, it is possible you could end with 'free' objects that never get deleted. If that is the case, and you want to disable the current fix, use: %feature("self:disown","") A::operator+=; %feature("new","") A::operator+=; 04/07/2004: cheetah (William Fulton) [C#] C++ enums are no longer wrapped by integers, they are now wrapped by C# enums. For Example, given C++: enum AnEnum { foo, bar }; typedef AnEnum AnEnumeration; void something(AnEnum e, AnEnumeration f); The following is generated: public enum AnEnum { foo, bar } public static void something(AnEnum e, AnEnum f) {...} Note that a global enum like AnEnum above is generated into its own file called AnEnum.cs. Enums defined within a C++ class are defined within the C# proxy class. Some of the typemaps for modifying C# proxy classes also work for enums. For example global enums can use %typemap(csimports) to add in extra using statements. Global enums and class enums can use %typemap(csclassmodifiers) to make the enum private, public etc. %typemap(csbase) to change the underlying enum type (enum base) If we add this for the above example: %typemap(csclassmodifiers) AnEnum "protected" %typemap(csbase) AnEnum "long" the following is generated: protected enum AnEnum : long { foo, bar } *** POTENTIAL INCOMPATIBILITY FOR C# MODULE *** 04/07/2004: cheetah (William Fulton) Seg fault fix for empty enums, like enum Foo {}; 03/21/2004: mmatus [Note: this change revoked on 04/25/2004] [Python] Makes the following 'var' cases more uniform: std::string ga; struct A { static std::string sa; std::string ma; }; now the three variables (ga, sa, ma) can be assigned as: cvar.ga = "hello"; A.sa = "hello"; a.ma = "hello"; ie, now 'ma' will also use a std::string typemap 'in' if defined, before it was only accepting a 'p_std_string' pointer. Note, however, that 'ma' will not use the 'varin/varout' typemaps (that probably could be more natural), but it will pick up the 'in' typemap for const std::string& (which is easier). The changes in cwrap.c and lang.cxx will probably fix the behaviour in other languages that do not overload the membervarHandler method "too much". 03/21/2004: mmatus [Python] Disabling the default instantiations like: %template() std::pair; for all the primitive types and STL containers/classes. They are expensive, specially for pair and map, and the previous behaviour also requires the user to perform manual instantiations. Still, if the speed difference is not important, it can be re-enabled by defining the macro SWIG_STD_DEFAULT_INSTANTIATION (see std_common.i). Also, normalizing the INPUT/OUTPUT/INOUT typemaps. Now they use the same conversors than the rest of the typemaps, and you can use them for std::pair, std::string and all the other STL types, like in: void p_inoutd(std::pair *INOUT); Added the attribute.i and implicit.i files with macros to transform functions pairs like 'set_x'/'get_x' (or 'T& x()'/'const T& x() const') into an attribute, and allowing the use of implicit constructors in typemaps (see the files for more details). 03/21/2004: mkoeppe [Guile] Fix the documentation strings of functions with anonymous arguments. 03/18/2004: mmatus [Python] More general std_string.i interface. Now you can wrap it using %template(string) std::basic_string; and use the std::string as a base class: struct A : std::string { }; But more important, swig will recognize both std::basic_string and std::string as the same type. 03/16/2004: mmatus Previously added, but not mentioned before: - friend declaration support, swig now emits a global function in the same class scope. - ref/unref features: to mix ref counting C++ classes and native script ref counting mechanisms (like in python). Use it like: %feature("ref") RCObj "$this->ref();" %feature("unref") RCObj "$this->unref();" And the class RCObj, and all the derived ones, will perform the right ref/unref calls when a new pointer is returned to the target language, or when the target language attempts to delete the object. See the refcount.i file in the test-suite for more details. 03/16/2004: mmatus [Python] Using the new %fragment support, major rewrote of the python swig library, including: - Almost automatic template/typemap instantiation for the STL components. For example, now you can write: %template(vector_i) std::vector; and a specialized vector_i class is emitted with all the needed typemaps. No need to use the old 'specialize_vector' macros. Note you can also define %template(matrix_i) std::vector >; %template(vector_pii) std::vector >; - The empty template instantiation %template() std::vector; defines the vector typemaps, but no proxy class. For all the fundamental types, the empty template instantiation are defined, so, you can say %include std_vector int func(const std::vector& a); where the proper typemap is applied to 'a', but no std::vector proxy is generated. - All the STL containers present a more uniform behavior and more complete interface declaration. The following are now supported: std::vector std::list std::deque std::set std::multiset std::map std::multimap not a container, but also supported: std::pair also, more typemaps are defined for all of them, including varin, varout, typecheck, etc. - Initial attempt to implement the STL containers considering allocators, ie: std::vector it is partially working, but it is just a workaround while swig improves its template type support. Please test with your particular setup. It seems to be working with g++ 3.2.2, g++ 2.96, Intel icc and SGI CC compilers, plus python 1.5.2, 2.0 and 2.3, but since we are using templates, there is a chance you can find some problems when using with an old C++ compiler. 03/16/2004: mmatus - Allowing the empty %template directive, such as %template() std::vector; to process the class "typedef"s and "typemap"s. Before only the internal "typedef"s were processed. This makes possible to emit the default in/out typemaps without the need of wrapping an specialized vector instance. - Adding the preprocessor extension #@ which mangles the following macro argument, like in: #define macro(X) #@X macro(int) -> int macro(std::string) -> std_s_s_string - Fragments can now be "type specialized", as the typemaps. The syntax is as follows %fragment("name","header") { /* a type independent fragment (old syntax) */ } %fragment("name" {Type}, "header") { /* the fragment is type dependent */} Now fragments can also be used inside templates: template struct A { %fragment("incode"{A},"header") { /* 'incode' specialized fragment */ } %typemap(in,fragment="incode"{A}) { /* here we use the 'type specialized' fragment "incode"{A} */ } }; 03/11/2004: cheetah (William Fulton) [Java] Director bug which meant that some virtual functions overridden in Java were not being called on some operating systems. Bug reported and fixed by Robert de Vries and Scott Michel. 03/02/2004: mkoeppe (Matthias Koeppe) [Guile] In -scm mode, don't forget to check the type of string arguments. 02/24/2004: cheetah (William Fulton) [C#] New commandline option -namespace . This allows one to specify a C# namespace into which all C# classes are generated. 02/23/2004: mkoeppe (Matthias Koeppe) [MzScheme] Use FUNC_NAME rather than a bogus typemap variable for signalling errors. Call scheme_wrong_type with a zero-based argument number. Reported by Ondrej Pacovsky, SF #902621. [Guile] Define FUNC_NAME also in the dispatch wrapper for overloaded functions. Patch by John Lenz, SF #896255. 02/22/2004: mkoeppe (Matthias Koeppe) [Guile] In -scm mode, don't try to invoke a null destructor function. 02/20/2004: cheetah (William Fulton) Fixes so that the SWIG source will compile using the Digital Mars Compiler (formerly Symantic compiler) on Windows. Submitted by Scott Michel. 02/13/2004: mkoeppe (Matthias Koeppe) [MzScheme] New command-line argument -noinit. Use it for building the runtime library, where we don't want to define the functions scheme_initialize etc. Reported by Tim Brown, SF #891754. [MzScheme] Don't produce invalid C code when invoked with the -declaremodule option. Reported by Tim Brown, SF #891108. [Guile] Build the runtime library with passive linkage, to rename the SWIG_init function uniquely. 02/12/2004: cheetah (William Fulton) [Java, C#] Patch submitted by Bill Hoffman which prevents SWIG from crashing when a file for the typewrapper class cannot be opened. 02/11/2004: cheetah (William Fulton) [Java, C#] Overloading changes: - Methods which are overloaded in const only no longer generate Java code that won't compile - the first method parsed is used and a warning is displayed. Note that this behaviour is slightly different to the scripting languages which always uses the non-const method. - Warning messages 509 and 512 replaced by new warning number 516, which is more relevant to these statically typed languages as the overloaded methods aren't 'shadowed', they are ignored. 01/23/2004: mkoeppe (Matthias Koeppe) [Guile] Replace the "known_classes" hash table by a node attribute. Methods of classes in C++ namespaces now get the proper specializer in the GOOPS declaration. Reported by rm@mh-freiburg.de. 01/23/2004: mkoeppe (Matthias Koeppe) [Guile] Uniquify the argument names in GOOPS shadow method declarations. Reported by rm@mh-freiburg.de. 01/21/2004: sunshine (Eric Sunshine) Revived the NextStep port of SWIG. Fixed fatal problem in DohStrstr() caused by difference in strstr() implementation which made %apply become entirely dysfunctional. On NextStep, strstr("foo","") evaluates to NULL; whereas, on modern platforms, it evaluates to "foo". %apply relies extensively upon strstr("foo","") evaluating to non-NULL, therefore it failed catastrophically when faced with NextStep's strstr(). Added `bool' check to configure.in since NextStep's C++ compiler does not supply this type. swig.h now fakes up `bool' if needed. Worked around NextStep C++ compiler bug in which C++ code is disallowed inside extern "C" functions. This problem affected all language modules, since they publish hook functions of the form: extern "C" Language *swig_foo(void) { return new FOO(); } Fixed by creating a C++ wrapper: static Language *new_swig_foo() { return new FOO(); } extern "C" Language *swig_foo(void) { return new_swig_foo(); } Ensured that Swig_copy_string() is used in place of strdup() since NextStep does not supply strdup(). Fixed detection of Ruby library name and location in configure.in. Problem 1: Assumed that library always resided in Ruby's "archdir", which was correct for Ruby 1.6.x, but which is incorrect for Ruby 1.8.x, in which case the library normally resides in Ruby's "libdir". Problem 2: Assumed that the library could always be linked via "-l"+RUBY_INSTALL_NAME (where RUBY_INSTALL_NAME typically is "ruby"), however this failed for platforms, such as NextStep, which do not support shared libraries. In this case, the static library name in 1.8.x is libruby-static.a, thus -lruby-static is required. The new logic works correctly for static and shared libraries for 1.6.x and 1.8.x. Fixed detection of Perl CFLAGS in configure.in for NextStep. Detection code extracted CFLAGS from Perl's %Config hash but neglected to add a newline to the value before passing it through `sed'. NextStep's ancient `sed' discards input which is not terminated with a newline, thus Perl CFLAGS always evaluated to the empty string. 01/16/2004: cheetah (William Fulton) Tidy up in the exception handling code that is generated when C++ exception specifications are wrapped with the throws typemap. This redundant code is no longer generated: catch(...) { throw; } 01/12/2004: wsfulton on behalf of mmatus (marcelo matus) if a method uses %exception and the method requires the use of the throws typemap, the code in a throws typemap will be generated inside the try body. For example: %exception method { try { // method action $action } catch (int i) { // method int catch handler } catch (...) { // method generic catch handler } } %typemap(throws) Except %{ // throws typemap Except catch handler %} %inline %{ class Except {}; void method(int i) throw (Except); Will generate: { try { // method action try { method(arg1); } catch(Except &_e) { // throws typemap Except catch handler } } catch (int i) { // method int catch handler } catch (...) { // method generic catch handler } } As can be seen, the inner try catch block is for the throws typemaps. Previously, this was reversed so that the inner try catch block was the %exception code. In the example above, it would have been impossible to catch Except as the catch all (...) would catch the exception instead. Version 1.3.21 (January 11, 2004) ================================= 01/10/2004: cheetah (William Fulton) The output format for both warnings and errors can be selected for integration with your favourite IDE/editor. Editors and IDEs can usually parse error messages and if in the appropriate format will easily take you directly to the source of the error. The standard format is used by default except on Windows where the Microsoft format is used by default. These can be overridden using command line options, for example: $ swig -python -Fstandard example.i example.i:4: Syntax error in input. $ swig -python -Fmicrosoft example.i example.i(4): Syntax error in input. 01/09/2004: beazley Fixed [ 871909 ] simple namespace problem. This was a problem using anonymous structures in a namespace. For example: namespace ns { typedef struct { int n; } S; }; Reported by Josh Cherry. 01/09/2004: beazley Fixed some broken Perl examples. 12/28/2003: cheetah (William Fulton) [Java and C#] Fixes for wrapping covariant (polymorphic) return types. For example: struct Base { virtual ~Base(); virtual Base* copy() const = 0; }; struct Derived : Base { virtual Derived* copy() const; }; The Derived::copy proxy method returns Base not Derived. A warning is issued about this. Previously the pointer used by the proxy class was incorrectly treated as a Base* instead of a Derived*. 12/18/2003: cheetah (William Fulton) Fix so that Windows paths are displayed correctly when reporting errors. An error previously would have been shown something like: .?xample.i:14: Syntax error in input. instead of: .\example.i:14: Syntax error in input. Version 1.3.20 (December 17, 2003) ================================== 12/17/2003: beazley Last minute modifications. Perl5 module now generates shadow classes by default like all of the other modules. PHP4 wrappers no longer include "config.h". 12/14/2003: beazley Weakened warning message related to constructor names so that an unusual nested-class wrapping technique would work again (apparently it worked in some older SWIG releases). For example: class Scope { class ClassA; class ClassB; }; class Scope::ClassA { ... }; class Scope::ClassB { ... } Note: There is still some odd interaction with the SWIG symbol table/type system that will need to be looked at in a future release. Reported by Gustavo Niemeyer. 12/11/2003: cheetah (William Fulton) [Java] Protected class methods are wrapped as protected Java methods when using the dirprot director feature. This can be changed using %javamethodmodifiers to something else should the need arise, for example, private or package access. 12/11/2003: cheetah (William Fulton) [Java, C#] %javamethodmodifiers (Java) and %csmethodmodifiers (C#) operate slightly differently. Previously this feature had to be present to set the method modifiers. Now it is only used if it exists for the method being wrapped. The default is "public" as previous however, when wrapping protected director methods it is "protected". This change will not affect existing use of the %javamethodmodifiers or %csmethodmodifiers. 12/11/2003: mmatus (Marcelo Matus) This fix some recurring reports about keywords not been properly identified and warned, and it solves the problem of how to add a test file to the test-suite such that it doesn't use any keyword of all the supported languages (and doing it without compiling the test for all the supported languages, thing that is not always possible, and without requiring you to know all the supported language keywords, thing that is always impossible). So these are the changes globally speaking: - Uniform the definition of the keyword warnings through the supported languages: all the languages has now a separate file that defines the keywords or bad names: python/pythonkw.swg chicken/chickenkw.swg .... - Added keyword list for most of the languages that didn't have one (using the new separated file). - Added the "All keywords" warning support: -Wallkw option. This option allows you to include all the known keywords for all the supported languages, and can be used as: swig -Wallkw .... This will help to the process of adding a test-suite file that can be compiled in all the swig supported languages, and it will be also helpful for users who want to create multi-language libraries. And these are the detailed changes (mostly file addition): - For the languages that already have some sort of keyword warning list, move it to an external languagekw.swg file, ie: move keywords from python.swg -> pythonkw.swg move keywords from chicken.swg -> chickenkw.swg move keywords from tcl8.swg -> tclkw.swg and re-include languagekw.swg from language.swg. - For the language that didn't have a keyword list, and for the ones that I could find a list, add the languagekw.swg file, ie: csharp/csharpkw.swg java/javakw.swg php4/phpkw.swg pike/pikekw.swg ruby/rubykw.swg also add a line in language.swg to include languagekw.swg, but now it is commented!!!, like in java.swg: /* java keywords */ /* please test and activate */ //%include "javakw.swg" ie, there will be no change in how swig runs normally until the language maintainer test and uncomment that line. So, please check each languagekw.swg file (I left the link to the keyword list source for checking), and after testing, uncomment the %include line. - Added the file allkw.swg, which includes all the languagekw.swg files. For the languages that has no languagekw.swg file right now, and if they need one, add the file into the language directory, and add the corresponding include line into the allkw.swg file. - Added the -Wallkw that includes the allkw.swg file. Note that the old -lallkw.swg option couldn't be used since it include the file after it would be needed. Hopefully, the -Wallkw option will be added to the default rules in the related test-suite Makefiles, so, when creating a new test, or adding a new swig library file (like _std_deque.i), swig will warn you if you are using a bad name, considering all the language where it needs to run. Right now you can test it by using: make check-python-test-suite SWIG="swig -Wallkw" or using your favorite target language, it doesn't matter. And yes, there are several examples that are using reserved keywords, specially from csharp. *** Remember ****: the new keyword warning lists are not included by default in any of language that before didn't have one. To enable the keyword warnings as the default behavior, the inclusion of the languagekw.swg file has to be uncommented at each language.swg file. So, all the language maintainers, please check the keywords list. Also, you can add buit-in names, and not only keywords, like 'True/False' in python. Remember that you can be more specific and refer only to member names, like *::configure or *::cget (see an example in the tcl8/tcl8kw.swg file), or only global names, like ::range (see an example in the python/pythonkw.swg file. Just to be consistent, use the following codes: - Use code 314 for keyword and/or fatal bad names. - Use code 321 for buit-in and/or not fatal bad names. so, they can't be disabled/enabled independently (see python/pyhtonkw.swg for examples). **** And don't add any new test file without checking it with the -Wallkw option!! (that includes me) *****. 12/11/2003: cheetah (William Fulton) SF bug #854634 Added support for accepting the Unix directory separator '/' on Windows and the Mac in addition to the native one ( '\' on Windows). This can be used in %import, %include and commandline options taking a path, for example -I. On Cygwin, both the Windows and Unix directory separator can now be used (was '/' only). 12/10/2003: mmatus (Marcelo Matus) [python] Implementing the runtime "reprotected" director members, if you have: %feature("director") B; class Bar { public: virtual ~Bar(); virtual int hello() { return do_hello();) protected: virtual int do_hi() {return 0;} virtual int do_hello() {return 0;} }; then, at the python side import my_module class Foo(my_module.Bar): def do_hello(self): return 1 pass b = Bar() # Pure C++ Director class f = Foo() # C++ Director + python methods b.hello() # Ok, and it calls C++ Bar::do_hello() f.hello() # Ok, and it calls Python Foo::do_hello() b.do_hi() # RuntimeError, do_hi() is protected!! f.do_hi() # RuntimeError, do_hi() is protected!! b.do_hello() # RuntimeError, do_hello() is protected!! f.do_hello() # Ok, since it its redefined in python. Here Bar.do_hello is always protected, but Foo.do_hello is "public", because it is redefined in python. Before, all the 'do_hello' methods were public. This seems to be a good compromise between C++ and python philosophies, ie, all the director protected methods keep protected at the user side (C++ way) until they are redefined (python way, were all defined methods are always public). And this is not only a good compromise, it also seems to be the only way to do it :). Now ruby has native director protected members, and python pure runtime support. I guess these are the two possible extreme cases. And hopefully, they could be used as templates to modify the other languages that support directors, so they can "reprotect" the protected director members at the target language side. This finished the director protected support for the python language. Ocalm will need to add the "reprotection" later. 12/10/2003: mmatus (Marcelo Matus) The following case (reported by Lyle Johnson) was fixed: %rename(x) Foo::y(); class Foo { public: void y(); protected: int x; }; swig warned that the symbol 'x' was already defined, and the renaming fails. 'x' was not emitted, since it is protected, but it was kept in the symbol table with too much information. Now swig works for all the cases (plain, director and dirprot) again. This was fixed by allowing the parser.y to decide much closer what to do with 'x'. Before all the discarding or generation was resolved at the lang.cxx stage. Also the changes in parser.y to implement the director protected mode are now much more encapsulated, and they get disabled if the mode is not enabled. Before the deactivation was done at the generation stage (lang.cxx). By the other hand, if the director mode is enabled, and %rename is done, reusing a protected member name, there is a pathological case: %rename(x) Foo::y(); class Foo : public A { public: void y(); protected: int x; /* works */ static int x; /* works */ static void x(); /* works */ typedef void x(); /* works */ virtual void x(); /* always fails, as it should, since Foo::x() will be emitted in the director */ void x(); /* always fails, but sometimes it shouldn't, since the Foo::x() will not be emitted if it is not virtual */ }; The last case is not always right because at the parser.py stage it is not possible to decide if the protected member Foo::x() could or not conflict with the renamed Foo::y(), since Foo::x() could be virtual by inheritance. I guess this just an intrinsic limitation, and no much can be done about it without resorting into larger changes to postpone, under certain conditions, the multiply symbol detection (lang.cxx stage). So, by now, it is just considered a well known "feature" in the director protected mode. The good news is that it seems to be a rare case, and it can be avoided by the user by hiding 'x' before renaming 'y': %rename(_x) Foo::x(); %rename(x) Foo::y(); 12/08/2003: mmatus (Marcelo Matus) The virtual method detections now properly treats the following cases: namespace foo { typedef int Int; } struct A {}; typedef A B; struct Foo { virtual ~Foo() {} virtual Foo* cloner() = 0; virtual int get_value() = 0; virtual A* get_class() = 0; virtual void just_do_it() = 0; }; struct Bar : Foo { Bar* cloner(); foo::Int get_value(); B* get_class(); void just_do_it(); }; All the Foo and Bar methods are virtual. A new attribute "virtual:type" record the base polymorphic type. In the previous cases we have: type : Bar virtual:type : Foo type : foo::Int virtual:type : int type : B virtual:type : A type : void virtual:type : void This attribute is useful in languages (java+directors) that could have problems redefining Bar* Bar::cloner(). If you never had code like the above, you will see no effects. But if you have some code like that, you will see some effects since some methods that before were not properly treated as virtual, will start to act like that. This could enlarge your director classes. 12/08/2003: mmatus (Marcelo Matus) The director protected member support (dirprot) is disabled by default. It can be enable by using '-dirprot' or by adding the option to the module declaration, like: %module(directors="1",dirprot="1") my_module This module option was added to properly compile the director_protected.i and director_nested.i examples. The feature has been tested with python[2.2,2.3] and ruby[1.6.7], both at compilation and runtime, and java[j2sdk1.4.1_01], but only at compilation (my java installation doesn't run any of the director examples, olds nor news). Please test for ocaml and java. The errors reported by William and Scott were fixed, except for a warning about SWIG_JavaThrowExecption() multiply defined. I can't reproduce this error with my examples. We will wait for Scott to send us a minimal case. 12/07/2003: mmatus (Marcelo Matus) The director protected member support has been completly moved out from python.cxx, and now resides in the common lang.cxx, emit.cxx and allocate.cxx files. This means it should work for all the other languages that currently support directors, ie, python, java, ocalm and ruby. The change has been tested with python (compilation+runtime) and java (just compilation). Please add runtime tests for the missing languages and test it. The '-nodirprot' option was moved to the principal main, and can be used from all the languages. 12/07/2003: cheetah (William Fulton) [Java] Fixed and improved error checking of STRING_OUT typemaps in various.i. 12/04/2003: mmatus (Marcelo Matus) - Now the virtual members with no explicit declarator are properly identified: struct A { virtual int f() = 0; }; struct B : A { int f(); }; Here, B::f() is virtual, and the director and the virtual elimination mechanism now recognize that. - [C#] This fix also fixes the problem where 'override' was not being used on any overridden virtual method, so for struct B above, this C# code is generated: public class B : A { ... public override int f() { ... } ... } - Initial support for protected virtual methods. They are now properly emitted when using with director (python only by now). %feature("director") A; struct A { protected: virtual int f1() = 0; }; %feature("director") B; struct B : A{ protected: int f1(); virtual f2(); }; This can be dissabled by using the '-nodirprot' option. - The feature 'nodirector' is working now at the top level, so, it must work for all the languages: %feature("director") A; %feature("nodirector") A::f2; struct A { virtual int f1(); virtual int f2(); }; in this case, only 'f1' is exported to the director class. - Added director support for const TYPE& arguments (python). 12/02/2003: cheetah (William Fulton) [Java] Fix for INOUT and OUTPUT typemaps in typemaps.i for when the JNI type is bigger than the C type. For example, unsigned long (32bits on most systems) is mapped to jlong (64bits). Returned value was incorrect. Bug reported by Brian Hawley. 12/02/2003: cheetah (William Fulton) [C# and Java] Better fix for entry dated 05/11/2003. Fixes the following typemaps: Java: javabase, javainterfaces, javaimports, javaclassmodifiers, javaptrconstructormodifiers, javafinalize, javagetcptr & javacode. C#: csbase, csinterfaces, csimports, csclassmodifiers, csptrconstructormodifiers, csfinalize, csgetcptr & cscode. It also fixes bug in using arrays of C structs with arrays_java.i as reported Scott Michel. 12/02/2003: beazley [Perl] Fixed [ 852119 ] recursive inheritance in output .pm, perl5. Reported by William Dowling. 12/02/2003: beazley [Tcl] Fixed [ 755382 ] calling func(const vector& p) evaluates p[0] in interp. The Tcl type checker was improperly handling the interpreter result when type violations were supposed to be ignored. Reported by Flaviu Popp-Nowak. 11/30/2003: cheetah (William Fulton) Fixed [ 545058 ] configure's --with-tclincl has no effect 11/30/2003: cheetah (William Fulton) [Java] Fixed [ 766409 ] missing symbol SWIG_JavaThrowException during module load SWIG's internal functions are all static as there is no need for different SWIG generated modules to share any code at runtime. 11/30/2003: beazley [Tcl] Added support for C++ pointers to members. 11/28/2003: cheetah (William Fulton) Fixed [ 848335 ] Directors: #include wrapper .h file - was incorrectly adding a directory to the generated #include "foo_wrap.h" statement in some situations. 11/28/2003: cheetah (William Fulton) [Java] Fixed [ 849064 ] JAVA : Access modifier for derived class wrong. The delete() method is always public now. It used to be protected whenever a destructor was non public. An UnsupportedOperationException runtime exception is thrown instead of making delete() protected now. 11/28/2003: beazley [Perl5] Added support for C++ pointers to members. 11/28/2003: beazley Fixed [ 850151 ] PYVERSION with python2.3 in configure of SWIG 1.3.19 (Maybe). 11/28/2003: beazley Fixed [ 850666 ] #include extra line added. This should fix some problems with getting correct line numbers on error messages. 11/26/2003: beazley Fixed another one of Marcelo's evil template bugs (infinite recursion). [ 849504 ] template and typedef -> inf. recursion. 11/26/2003: beazley Fixed parsing problem with declarations like this: int *x = &somearray[0]; 11/25/2003: beazley Fixed [ 756552 ] missing default argument class scope with "|". This is really only a band-aid fix for use of class-enums in expressions. For example: class A { public: enum Flag { flag1 = 0x1, flag2 = 0x2 }; void foo(int x = flag1 | flag2); }; Note: there are still some (more subtle) cases that are broken, but hard to fix due to an issue with template expansion. Will address later. Reported by Dmitry Mironov. 11/25/2003: beazley Incorporated [ 840878 ] support for %inline { ... } (PATCH). This adds support for the following: %inline { ... some code ... } The difference between this and %inline %{ ... %} is that the enclosed text is processed by the SWIG preprocessor. This allows special macros and other processing to be used in conjunction with %inline. Contributed by Salvador Fandino Garcia. 11/25/2003: beazley Fixed [ 836903 ] C++ inconsistency (with void arguments). SWIG was having difficulty with f() vs f(void) in C++ programs. For instance: class A { public: virtual void f(void) = 0; }; class B { public: virtual void f(); // Not matched to f(void) correctly }; The parser now normalizes all declarations of the form f(void) in C++ classes to f(). This should fix a variety of subtle problems with inheritance, optimizations, overloading, etc. Problem reported by Partho Bhowmick. 11/25/2003: beazley [Perl5] Incorporated [ 841074 ] better croaking (PATCH). This fixes some problems with strings and provides some new error functions. Contributed by Salvador Fandino Garcia. 11/25/2003: beazley Fixed [ 791835 ] Default argument with cast: txt = (char *)"txt" syntax Error. The parser should now accept things like this: void foo(char *s = (char *) "Hello"); Problem reported by Claudius Schnorr. 11/24/2003: beazley [Tcl] Fixed problem with cross module linking. Previously modules referred to base classes through a global variable. Now, the module looks up base classes through the type system itself---avoiding the need to link to a global like before. Caveat: modules with base classes must be loaded before modules with derived classes. 11/24/2003: mkoeppe (Matthias Koeppe) [Guile] In -scm mode, use () to represent null pointers, as it is done in -gh mode. 11/23/2003: mkoeppe (Matthias Koeppe) Add a generated script "preinst-swig", which can be used to invoke SWIG before it has been installed. It arranges that the runtime libraries from the source directory are used. 11/23/2003: mkoeppe (Matthias Koeppe) [Guile] In -gh mode, don't forget to call SWIG_Guile_Init. Add a SWIG_contract_assert macro. 11/23/2003: mkoeppe (Matthias Koeppe) [MzScheme] Update the configure check for the dynext object to work with MzScheme 205. 11/20/2003: mmatus Fixed the include/import error reported by Kerim Borchaev, where two files with names like 'dir1/hello.i' 'dir2/hello.i' can not be include at the same time. Swig was including just the first one, assuming the second one was not a different one, since it was checking/keeping just the basename 'hello.i'. 11/19/2003: beazley Changes to the SWIG runtime library support. - The -c command line option has been renamed to -noruntime - New command line option: -runtime. When supplied, this inserts the symbol SWIG_GLOBAL into the wrapper code. This, in turn, makes all of the runtime support functions globally visible. - New library file: swigrun.i. Used to create modules for runtime library (if needed). 11/18/2003: cheetah (William Fulton) 'make srcrpm' rpmbuild fix - patch from Joe Cooper 11/18/2003: mkoeppe (Matthias Koeppe) [Guile] Change meaning of configure option --with-guile to the name of the Guile executable. The new option --with-guile-prefix can be used to specify the tree where Guile is installed. (However, usually it suffices to use the single option --with-guile-config.) When running the run tests test-suite, make sure to use the version of Guile that SWIG was configured for. 11/17/2003: mkoeppe (Matthias Koeppe) [Guile] Improvements to object-ownership management in "-scm" mode. (They do not apply to the default "-gh" mode.) * Renamed the smob type that indicates that the object can be garbage collected from "collected swig" to "collectable swig", which is more precise. * Export the destructor functions again. It is now allowed to explicitly call destructors, even for garbage-collected pointer objects. A pointer object that has been passed to a destructor is marked in a special way using a new smob type, "destroyed swig". (This helps avoid nasty memory bugs, where references to dead C objects are still held in Scheme. Moreover, the garbage collector will not try to free a destroyed object once more.) * Destructor-like functions can also mark their arguments as destroyed by applying the typemap SWIGTYPE *DESTROYED. (It calls the function SWIG_Guile_MarkPointerDestroyed.) * Functions that "consume" their objects (or that "own" them after the call) can mark their arguments as not garbage collectable. This can be done by applying the typemap SWIGTYPE *CONSUMED. (It calls the function SWIG_Guile_MarkPointerNoncollectable.) * The macro TYPEMAP_POINTER_INPUT_OUTPUT from library pointer-in-out.i creates additional typemaps PTRTYPE *INPUT_CONSUMED, PTRTYPE *INPUT_DESTROYED. They mark the passed pointer object likewise. The typemap PTRTYPE *OUTPUT creates a garbage-collectable pointer object, like %newobject does for a returned pointer. Use the new typemap PTRTYPE *OUTPUT_NONCOLLECTABLE to create a pointer object that will not be garbage collected. 11/17/2003: mkoeppe (Matthias Koeppe) [Guile] Handle $input in "freearg" typemaps. Never qualify GOOPS slot names with the class name. Handle optional arguments properly in the GOOPS methods. 11/16/2003: cheetah (William Fulton) Fixes for installation to work with the upcoming Automake-1.8. mkinstalldirs was being used by a non-Automake makefile. mkinstalldirs is being phased out and so was not being created by Automake. install-sh used instead. 11/16/2003: cheetah (William Fulton) [Java] Numerous director improvements, tweaks and bug fixes since the initial implementation have been contributed by Scott Michel. 11/12/2003: beazley [Python] When %feature("shadow") is used to add code to shadow classes, the special variable $action expands to the name of the underlying wrapper function that would have been called normally. 11/12/2003: beazley [Python] When generating proxy class code, SWIG emits a few default methods for __repr__() and other Python special methods. Some of these methods are emitted after all of the contents of a class. However, this makes it hard to override the methods using %pythoncode and some other directives that allow code to be inserted into a class. These special methods are now emitted into the code *before* all of the other methods. Suggested by Eric Jones. 11/11/2003: beazley Preprocessor enhancement. For include statements like this: %include "foo/bar.i" the directory "foo" is now added to the search path while processing the contents of bar.i. Thus, if bar.i includes other files in the same directory, they will be found. Previously, you would have to add additional directories using -I to make this work correctly. Note: the C preprocessor seems to behave in an identical manner on many (most? all?) systems. Suggested by Kerim Borchaev. 11/11/2003: beazley Configuration changes to make SWIG work on Mac OS X 10.3.x (Panther). Tested with Python, Tcl, Perl, and Ruby---all of which seem to work. 11/08/2003: cheetah (William Fulton) [Java] Fixed the typemaps in various.i which were mostly broken. char **STRING_IN and char **STRING_RET typemaps replaced with STRING_ARRAY. float *FLOAT_ARRAY_RETURN typemap removed. 11/08/2003: beazley [Tcl] Tcl module now emits a safe module initialization function by default. It can be removed by running 'swig -nosafe'. 11/04/2003: mkoeppe (Matthias Koeppe) [Guile] Only use the SCM_ API when the function `scm_slot_exists_p' exists (needed for GOOPS support). This function was renamed during the Guile 1.5 series from `scm_slots_exists_p'. Report the right runtime library when invoked with -scm -ldflags. 11/03/2003: mkoeppe (Matthias Koeppe) [Chicken] Fix #782052. The --with-chickencfg configure option (and others) were not accepted. 11/02/2003: mkoeppe (Matthias Koeppe) [Guile] Merge new set of GOOPS changes by John Lenz. GOOPS objects are now manipulated directly by the C code. Some fixes to typemap-GOOPS interaction. 11/02/2003: mkoeppe (Matthias Koeppe) [Guile] Remove the file argument to -scmstub and -goops. The Scheme files are now always called MODULE.scm or MODULE-primitive.scm, where MODULE is the module name and "primitive" can be changed by the -primsuffix option. The Scheme files are now placed in the directory given by the -outdir option, or the current directory. (Patch by John Lenz, slightly modified.) *** INCOMPATIBILITY [Guile] *** 11/02/2003: mkoeppe (Matthias Koeppe) Unify the pointer-conversion runtime API. The standard functions are: * SWIG_NewPointerObj (POINTER, TYPE, FLAGS) -- Create an scripting object that represents a typed pointer. FLAGS are language specific. * SWIG_ConvertPtr (INPUT, RESULT, TYPE, FLAGS) -- Get a pointer from the scripting object INPUT and store it in the place RESULT. When a type mismatch occurs, return nonzero. * SWIG_MustGetPtr (INPUT, TYPE, ARGNUM, FLAGS) -- Get a pointer from the scripting object INPUT and return it. When a type mismatch occurs, throw an exception. If ARGNUM > 0, report it as the argument number that has the type mismatch. [Guile]: No changes. [MzScheme]: No changes. [Perl]: Add the function SWIG_NewPointerObj. The function SWIG_MakePtr is kept. The function SWIG_MustGetPtr is currently not supported. [Python]: Add the function SWIG_MustGetPtr. [Ruby]: Add the function SWIG_MustGetPtr. [Tcl]: Remove the "interp" argument of SWIG_NewInstanceObj, SWIG_ConvertPtr, SWIG_ConvertPacked, and SWIG_ConvertPtrFromString. The function SWIG_MustGetPtr is currently not supported. No changes to Pike because its pointer conversion code did not look complete. No changes to PHP4, because I did not understand its runtime code. No changes to Chicken because major changes are expected soon anyway. No changes to Java, OCaml, C# because they do not seem to have a pointer-conversion runtime API. *** INCOMPATIBILITY [Tcl] *** 11/02/2003: mkoeppe (Matthias Koeppe) [Perl5, PHP4, Pike, Python, Ruby, Tcl]: Use the preprocessor to rename external functions of the SWIG runtime API to follow the naming convention SWIG__. This should allow linking more than one interpreter into a program. 10/31/2003: cheetah (William Fulton) [C#] Fix since introducing the exception and std::string delegates. The fix overcomes linker errors when using more than one SWIG module. Problem reported by Andreas Schörk. 10/31/2003: beazley Incorporated patch: [ 823302 ] Incr Tcl support. Contributed by Alexey Dyachenko. Note: needs documentation. 10/31/2003: beazley Incorporated patch: [ 829325 ] new Python Module options and features. Robin Dunn writes: This patch makes a number of changes to the SWIG python module. 1. Add -apply option, and change the default code output to use the foo(*args, **kw) calling syntax instead of using apply(). If the -apply option is given then code is generated as before. This is very similar to Patch #737281 but the new -modern option makes the second half of that patch unnecessary so it is not included here. 2. Add -new_repr option. This is the same as my Patch #797002 which I will mark as closed since it is no longer needed. When this new option is used then the __repr__ methods that are generated for proxy classes will be more informative and give details about the python class and the C++ class. 3. Add %feature("addtofunc"). It allows you to insert one or more lines of code inside the shadow method or function that is already generated, instead of replacing the whole thing like %feature("shadow") does. For __init__ it goes at the end, for __del__ it goes at the begining and for all others the code generated is expanded out to be like def Bar(*args, **kwargs): val = _module.Foo_Bar(*args, **kwargs) return val and the "addtofunc" code is inserted just before the return statement. If the feature is not used for a particular method or function then the shorter code is generated just like before. 4. A little bit of refactoring to make implementing addtofunc a little easier. 5. Added a -modern command-line flag that will cause SWIG to omit the cruft in the proxy modules that allows it to work with versions of Python prior to 2.2. The result is a simpler, cleaner and faster python proxy module, but one that requires Python 2.2 or greater. 10/31/2003: beazley Incorporated patch: [ 829319 ] XML module tweaks. This adds a new command line option -xmllite that greatly reduces the amount of emitted XML code by eliminating some fields mostly used in SWIG's internal processing. Contributed by Robin Dunn. 10/31/2003: beazley Incorporated patch: [ 829317 ] Adds DohSplitLines function. Contributed by Robin Dunn. 10/29/2003: beazley Fixed [ 827907 ] argout objects not being wrapped properly (PATH). Patch contributed by Salvador Fandiño García. 10/29/2003: beazley Fixed [ 826996 ] perl type checking ignores perl subclasses. This enhancement makes it so wrapped classes and structs can be subclassed in Perl and used normally. Patch contributed by Salvador Fandiño García. 10/16/2003: cheetah (William Fulton) [C#] IntPtr marshalled with a void* instead of int in C function declarations. The casts thus look more conventional, for example: // old DllExport double SWIGSTDCALL CSharp_get_Shape_x(int jarg1) { ... Shape *arg1 = (Shape *) 0 ; arg1 = *(Shape **)&jarg1; ... } // new DllExport double SWIGSTDCALL CSharp_get_Shape_x(void * jarg1) { ... Shape *arg1 = (Shape *) 0 ; arg1 = (Shape *)jarg1; ... } 10/14/2003: beazley Fixed a subtle problem with overloaded methods and smart pointers. If a class has overloaded methods like this: class Foo { public: int bar(int x); static int bar(int x, int y); }; and the class is used as a smart pointer: class FooPtr { public: Foo *operator->(); }; The SWIG would try to expose the static member Foo::bar through FooPtr---resulting bogus wrapper code and a compiler error. Due to the way in which overloading is handled, it is extremely difficult to eliminate the static method in this case. Therefore, it is still exposed. However, the generated code now compiles and works. 10/05/2003: mkoeppe (Matthias Koeppe) [Guile, MzScheme, Chicken]: Remove symbol clashes between the runtime libraries by renaming all extern common.swg functions with the preprocessor. 10/05/2003: mkoeppe (Matthias Koeppe) [Guile] Added basic GOOPS support, contributed by John Lenz. See the documentation for details. *** NEW FEATURE *** 10/04/2003: mkoeppe (Matthias Koeppe) [Guile] New option, -only-setters, which disables traditional getter and setter procedures for structure slots. 10/03/2003: mkoeppe (Matthias Koeppe) [Guile] Added run test for reference_global_vars by John Lenz. 09/30/2003: beazley Partial solution to [ 792180 ] C++ smart-pointer/namespace mixup revisited. The problem is not easy to fix (at least it doesn't seem so), but is related to the instantiation of qualified templates inside of other namespaces. SWIG now generates an error message in this case rather than generating broken wrappers. 09/30/2003: beazley Fixed [ 800012 ] ENTER macro from CORE/scope.h clashes with libc search.h. Reported by Britton Leo Kerin. 09/30/2003: beazley Fixed [ 811518 ] Casting ints to doubles (w/ solution?) Addresses a problem with overloading in the Perl module. Reported by Gerald Dalley. 09/28/2003: mkoeppe [Guile with -scm option] Fix typo in generated code for procedures-with-setters. Reported by John Lenz. 09/26/2003: beazley Fixed [ 812528 ] externs not correct when throw is in signature. Reported by Joseph Winston. 09/23/2003: cheetah (William Fulton) SWIG was generating a number of symbols that didn't comply with the ISO C/C++ standard, in particular ISO/IEC 14882:1998(E) 17.4.3.1.2 where double underscores are forbidden as well as symbols starting with an underscore followed by an upper case letter. Most of these have been rooted out. See new section added to internals.html development manual 'Symbol Naming Guidelines for Generated C/C++ Code'. 09/23/2003: cheetah (William Fulton) Director typemap name changes: inv => directorin outv => directorout argoutv => directorargout *** POTENTIAL INCOMPATIBILITY *** 09/19/2003: mrose (Mark Rose) [Python] Director constructors now default to __disown = 0, which is the intended behavior and fixes the director_finalizer test case under python. 09/12/2003: cheetah (William Fulton) [C#] - Typemaps added for std::string and const std::string &. - New delegate for creating a C# string given a char *. It can be used by calling SWIG_csharp_string_callback as shown in the std::string 'out' typemap. Useful if the return type is mapped to a C# string and the calling function is responsible for cleaning up memory as the C# garbage collector doesn't free the memory created in C/C++ and then returned as a C# string. - The exception delegates have moved into an inner class in the intermediate class, thereby freeing up the static constructor. 09/11/2003: beazley (Internals) Major refactoring of iteration over lists and hashes. The DOH library now uses iterators. They work like this: List *l = (some list); Iterator i; for (i = First(l); i.item; i = Next(i)) { // i.item contains the actual list item. // i.item is NULL at end of list ... } Hash *h = (some hash); Iterator j; for (j = First(h); j.item; j = Next(j)) { // j.item contains hash table item // j.key contains hash table key // Both j.item and j.key are NULL at end ... } The old iteration functions Firstitem(), Nextitem(), Firstkey(), and Nextkey() are gone. The new iterators are simpler, result in better memory use, and may be faster. Also, there are no longer any problems iterating over the same list/hash in multiple places at the same time. For example, this is fine: Iterator i,j; for (i = First(l); i.item; i = Next(i)) { for (j = First(l); j.item; j = Next(j)) { ... } } (This never worked in previous versions). *** POTENTIAL INCOMPATIBILITY ***. This will probably break third party extensions to SWIG (or give them further encouragement to join the SWIG CVS-tree :-). 09/10/2003: mkoeppe (Matthias Koeppe) [Guile] Fix memory leaks in the "list-vector.i" typemaps. 09/09/2003: mkoeppe (Matthias Koeppe) [Chicken] Use C_mk_bool rather than C_mkbool. This fixes the wrapping of boolean values for Chicken 1.10 and newer. Reported by Dave / Felix Winkelmann . 09/05/2003: cheetah (William Fulton) [Java] Directors implemented for Java. In summary this is a big new feature which supports upcalls from C++ to Java. Code is generated to support C++ callbacks to call into Java and true polymorphic behaviour for Java classes derived from C++ classes. See java.html for details. Contributed by Scott Michel. 09/05/2003: Tiger Created contract example directory at /SWIG/Examples/contract Added simple contract examples (simple_c & simple_cxx) Modified contract module's output format *** NEW FEATURE *** 09/01/2003: cheetah (William Fulton) Test-suite build improvements: - Multiple build directories working for the test suite, so it is now possible to run configure in multiple subdirectories and run the test suite in each of these sub directories. - 'make distclean' fixed so it doesn't bomb out on the Examples directory when using multiple subdiretory builds. Required the following directories to be moved: Examples/GIFPlot/Perl -> Examples/GIFPlot/Perl5 Examples/GIFPlot/Php -> Examples/GIFPlot/Php4 These new directories used to be symbolic links to the old directory. Also the Examples/test-suite/Perl symbolic link has been removed. - Running the test-suite, other than from the root directory, say in Examples/test-suite/python will now display all the code being executed. - The following 3 C# compilers are detected during configure and work with the test-suite: Mono, Portable.NET and Microsoft. 09/01/2003: Tiger Added inheritance support for design by contract feature. 09/01/2003: beazley Fixed [ 794914 ] Wrong types in template specialization. SWIG was not handling arguments correctly in template partial specialization. For example, template class Foo { public: T *blah(); }; %template(FooInt) Foo; in this class, the return type of blah was set to 'int **', but it should really be 'int *'. This has been fixed, but it will affect all prior uses of partial specialization. 09/01/2003: beazley Fixed [ 786394 ] Patch for generated perl code does not compile under RedHat9. Reported by Scott Finneran. 09/01/2003: beazley Fixed [ 791579 ] (unsigned) long long handled incorrectly (Tcl). This was an error in the Tcl typemaps.i file. Reported by Kjell Wooding. 09/01/2003: beazley Fixed [ 797573 ] no way to rename classes coming from C structures. This problem relates to renaming of anonymous structures with a typedef. For example: %rename(Bar) Foo; typedef struct { ... } Foo; Reported by Britton Leo Kerin. 09/01/2003: beazley Fixed [ 797576 ] -help seems to imply that only tcl-specific options exist. Added a comment to alert user to other options. Reported by Britton Leo Kerin. 09/01/2003: beazley Fixed [ 798205 ] Segfault in SWIG_ConvertPtr. Reported by Prabhu Ramachandran. 08/30/2003: mrose (Mark Rose) Modified the director typemaps in python/std_complex.i to use the new-style macro and conversion functions, which eliminated some redundant code. Fixed a few bugs in these typemaps as well, although more testing is needed. 08/29/2003: mrose (Mark Rose) Completed initial support for wrapping abstract classes with directors. Constructor wrappers will be generated for abstract classes that have directors, and instances of the director classes will be created regardless of whether the proxy class has been subclassed in the target language. No checks are made during construction to ensure that all pure virtual methods are implemented in the target language. Instead, calls to unimplemented methods will throw SWIG_DIRECTOR_PURE_VIRTUAL_EXCEPTION exceptions in C++. Integrated Prabhu Ramachandran's typemap patches, which provide director typemap support for enums and std::size_t, and fix a couple bugs in the director std::vector<> typemaps. 08/29/2003: cheetah (William Fulton) [C#] Implemented exception handling for throwing C# exceptions from C/C++ code. A few delegate functions are available for calling which then throw the C# exception. Use the SWIG_CSharpThrowException function from C/C++ typemaps. See the generated wrapper code or csharphead.swg for all available exceptions. Example: SWIG_CSharpThrowException(SWIG_CSharpException, "exception description"); The 'throws' typemaps are also now implemented, so code is automatically generated to convert any C++ exception into a C# System.Exception when the C++ method declares an exception specification such as: int foo() throw(Bar); Also any parameters that are references to a C++ class or a class passed by value and are passed as a C# null will now throw a C# NullReferenceException. 08/29/2003: cheetah (William Fulton) [C#] Fix to match the calling convention of all pinvoke methods so that they match the calling convention used by default in the C# 'static extern' declarations (__stdcall is used on Windows). 08/19/2003: cheetah (William Fulton) [Java] Reworked std::string typemaps. Fixes a number of string in std namespace problems. For example %template vector. The templated class' get method wasn't returning a Java String, but a SWIGTYPE_p_string. Reported by Zach Baum. 08/15/2003: beazley Fixed [ 763522 ] 1.3.19 segfault in SwigType_add_pointer/DohInsertitem. Related to problem with unnamed class handling in Perl module. 08/15/2003: beazley Fixed [ 763563 ] Missing indication of optional arguments. Tcl module. Reported by Krzysztof Kozminski. 08/15/2003: beazley Fixed [ 787432 ] long param handled as int. Tcl module now uses Tcl_GetLongFromObj to convert integer values. 08/11/2003: beazley Fixed [ 775989 ] numeric template parameters. There were some errors in template expansion related to the use of arrays where the array dimension was a template parameter. It should work now. Reported by Bryan Green. 08/10/2003: mrose (Mark Rose) Added a director typemap (outv) for return by value and cleaned up up a few of the commented director typemaps. 08/10/2003: mrose (Mark Rose) Fixed constructor generation for director classes to ignore private constructors. Protected constructors are also ignored for now, pending a solution to the problem of wrapping classes that only define protected constructors. 08/07/2003: cheetah (William Fulton) New commandline option -outdir to specify where the language specific files are to be generated. This is useful for target languages like Python, Java etc which generate proxy files in the appropriate language. This option does not apply to the C/C++ wrapper file. 08/07/2003: cheetah (William Fulton) On Windows the generated files (other than the _wrap.c or _wrap.cxx files) were sometimes incorrectly being generated into the current directory unless the input file used the Unix path separator. The Windows path separator should now be used. Bug reported by Robert Davies. 08/07/2003: beazley Added array variable set typemap to Perl module. 08/07/2003: beazley Fixed [ 775677 ] Array init causes codegen bug.. 08/07/2003: beazley Fixed [ 779062 ] Class"\n"::foo not supported. SWIG should now correctly handle whitespace in between namespace qualifiers. For example "A :: Foo :: Bar". 07/31/2003: cheetah (William Fulton) Fixes for parameters which are classes that are passed by value and have a default value. A copy constructor for SwigValueWrapper is required (SF #780056). Also fixed memory leak in these circumstances. These mods also fix SF #780054. 07/28/2003: beazley Improved run-time error message for pointers in Python module. Contributed by Zooko. 07/10/2003: ballabio (Luigi Ballabio) [Almost all languages] Wrappers for std::pair added. Typemaps for Python, Ruby, Guile and MzScheme. 07/01/2003: mkoeppe (Matthias Koeppe) [Chicken] Handle the case of more than one argout typemap per function. 06/29/2003: cheetah (William Fulton) [Java, C#] SF #670949 request. The destructor wrapper function name is now configurable. A new attribute called methodname in the javadestruct/javadestruct_derived (Java) or csdestruct/csdestruct_derived (C#) typemaps specifies the method name. For example in Java the destructor is wrapped by default with the delete method: %typemap(javadestruct, methodname="delete") SWIGTYPE {...} 06/27/2003: cheetah (William Fulton) [Java, C#] The throws attribute for adding exception classes to the throws clause also now works with the following typemaps: newfree javain, javaout (Java) csin, csout (C#) For example, the 'AnException' will be added to the throws clause in the proxy function: %typemap(javaout, throws="AnException") int { int returnValue=$jnicall; if (returnValue==0) throw new AnException("Value must not be zero"); return returnValue; } 06/25/2003: mrose (Mark Rose) [Python] Director typemap marshalling checks for null pointers when walking the parameter list instead of relying soley on the parameter count. Cures a segfault that occurred for multiple argument inv typemaps. Someone with more Swig experience should probably review this code. 06/24/2003: mkoeppe (Matthias Koeppe) [Chicken] Don't emit calls to "C_check_for_interrupt", which may result in an endless loop. Patch by felix@proxima-mt.de. 06/20/2003: cheetah (William Fulton) [C#] Finalizers now use destructor syntax as the override which was used in the Finalize method is not in the ECMA standards, spotted by the MS compiler. 06/10/2003: cheetah (William Fulton) [C#] A number of changes have been made to remove the Java naming that was used in the C# module. Typemap name changes: jni -> ctype jtype -> imtype jstype -> cstype javain -> csin javaout -> csout javainterfaces -> csinterfaces javabase -> csbase javaclassmodifiers -> csclassmodifiers javacode -> cscode javaimports -> csimports javaptrconstructormodifiers -> csptrconstructormodifiers javagetcptr -> csgetcptr javafinalize -> csfinalize Feature name changes: javaconst -> csconst javamethodmodifiers -> csmethodmodifiers Pragma changes: pragma(java) -> pragma(csharp) jniclassbase -> imclassbase jniclassclassmodifiers -> imclassclassmodifiers jniclasscode -> imclasscode jniclassimports -> imclassimports jniclassinterfaces -> imclassinterfaces Special variable name changes: $javaclassname -> $csclassname $javainput -> $csinput $jnicall -> $imcall This will break SWIG interface files that use these typemaps, features and pragmas. Please update your code or use macros for backwards compatibility. *** POTENTIAL INCOMPATIBILITY FOR C# MODULE *** 06/10/2003: mkoeppe (Matthias Koeppe) [MzScheme] Applied MzScheme module updates contributed by John Lenz . - Updated mzscheme to use SWIG's common runtime type system from common.swg. - The Lib/mzscheme directory has been reorganized to standardize names across the language modules: mzscheme.i was moved to mzscheme.swg, mzscheme.swg and mzschemedec.swg have been removed, mzrun.swg (which contains the runtime code) has been added. - The swig_proxy structure was renamed to swig_mz_proxy. swig_mz_proxy now contains a pointer to a swig_type_info structure. - Added varin and varout typemaps for SWIGTYPE [] and SWIGTYPE &. - Garbage collection by calling scheme_add_finalizer() has been added. *** NEW FEATURE [MzScheme] *** 06/10/2003: cheetah (William Fulton) [Java] New typemaps: javadestruct and javadestruct_derived for the C++ destructor wrapper. The javadestruct version gets used by classes at the top of an inheritance chain and the javadestruct_derived version gets used by other classes. [C#] cildispose and cildisposeoverride typemaps replaced by csdestruct and csdestruct_derived typemaps. The delete() method has been removed and its functionality put into these typemaps designed for the Dispose() method. - New typemaps csinterfaces and csinterfaces_derived replace the javainterfaces typemap. Also fixes the peculiarity of all classes in an inheritance chain individually deriving from the IDisposable interface. - New typemap csfinalize for finalizers. C++ destructors are now called by garbage collector during finalization. Problem reported by Andreas Schörk. 06/10/2003: Tiger Modified contract code for error message output. Contract code can now print out simple error message. Modified contract code to prepare for inheritance 06/03/2003: mkoeppe [Guile] Applied Guile module updates contributed by John Lenz . - SWIG currently uses Guile's gh_ API, which is marked as deprecated in Guile 1.6 and will be removed in Guile 1.9. This change introduces a command-line flag "-scm" which causes SWIG to generate wrappers that use Guile's SCM API instead; this requires Guile >= 1.6. - The Lib/guile directory has been reorganized to standardize names across language modules: guiledec.swg and guile.swg have been moved into guile_gh_run.swg, guile.i has been moved to guile_gh.swg, guile_scm.swg and guile_scm_run.swg which contain the SCM API stuff have been added - ghinterface.i, which contains the defines from the gh_ functions to the scm_functions has been added - The API for dealing with pointer objects is now SWIG_ConvertPtr, SWIG_MustGetPtr, SWIG_NewPointerObj. - Added varin and varout typemaps for SWIGTYPE [] and SWIGTYPE & - Garbage collection has been added. *** NEW FEATURE [Guile] *** 06/01/2003: cheetah (William Fulton) Dimensionless arrays such as int foo[] = {1, 2}; extern int bar[]; produce a warning that the variable is read-only. Depending on the target language, this used to cause compile errors or generate a setter that generated a runtime error. A setter cannot be automatically generated because the array size cannot be determined by SWIG. A varin, globalin or memberin typemap (depending on the target language) must be written by the user. 05/29/2003: beazley Refinement to default typemap matching and arrays. When an array is declared like this: int foo[4]; The default typemap now resolves to SWIGTYPE [ANY] If no match is found for that, it then resolves to SWIGTYPE [] If no array dimension is specified in the original declaration, the SWIGTYPE [] is used right away. Note: This change has been made to resolve problems related to arrays with and without dimensions. For example, sometimes SWIG was generating setter functions for array variables with no dimensions (an error). Likewise, SWIG sometimes made arrays with dimensions read-only (also an error). This fixes the arrays_global test problem. 05/28/2003: beazley Fixed subtle type handling bug with references and pointers. If you had functions like this: typedef Foo Bar; Foo *func1(); void func2(Bar &x); Then func2() wouldn't accept objects returned by func1() because of a type error. It should work now. Reported by Brian Yang. 05/21/2003: cheetah (William Fulton) Fixes to some of the Visual C++ example project files which would not work with spaces in the paths held in the environment variables used to point to the target language's library / include directory. SF bug #740769 05/21/2003: songyanf (Tiger) Added -contracts option. First try of the idea of "Wrap by Contract": build up realiable cross-language module by wrapping with SWIG. Implemented basic assertion (preassertion & postassertion & invariant) for simple C/C++ functions. Current format of contracts are: %contract class_name :: func_name (paras...) { require: boolean exprs; exprs; ensure: boolean expr; exprs; invariant: boolean expr; exprs; } *** NEW FEATURE *** 05/19/2003: cheetah (William Fulton) Build tweaks. There were a few preprocessor definitions which were specified in the Makefile for passing on the commandline when compiling. These are now all defined in swigconfig.h. Autoconf doesn't normally allow installation directories to be defined in this config header file, but an autoconf archive macro enables this. This macro along with future autoconf macros are going to be put in the Tools/config directory. 'swig -version' now reports the target build platform. 05/11/2003: cheetah (William Fulton) [C# and Java] Fix to the following typemaps: javabase, javainterfaces, javaimports, javaclassmodifiers, javaptrconstructormodifiers, javafinalize, javagetcptr & javacode. These are the typemaps for modifying/generating proxy classes. Previously the typemaps would use the proxy class name and not the C++ type, which was inconsistent with all other typemaps. In most circumstances the proxy class name and the C++ class name/type is the same except for classes in namespace, templated classes etc. so this shouldn't affect most cases. *** POTENTIAL INCOMPATIBILITY FOR JAVA and C# MODULES *** 05/09/2003: cheetah (William Fulton) Visual C++ Project files have been added so that the runtime libraries can be built on Windows (for Tcl, Perl, Python and Ruby). 05/01/2003: beazley Fixed problem with return by value, const, and private constructors. For example: class B { private: B(); public: B(const B&); }; class A { ... const B returnB() const; ... }; Problem and patch suggestion reported by Bill Hoffman. 04/29/2003: cheetah (William Fulton) Build changes: - Single autoconf invocation - autoconf in the Tools directory has gone. - Libtool bootstrapped when running autogen.sh. This requires anyone using the cvs version of SWIG to have libtool installed on their machine. Suggest version 1.4.2 or higher, preferably the latest - 1.5. - Automake is now used to build the runtime libraries in conjunction with libtool. - Runtime libraries are now successfully built as DLLs on Cygwin. - Skipping languages is no longer just determined in the top level makefile but in configure.in. This info is used for building the runtime libraries and for running the examples and test-suite. - These changes have fixed multiple build directory builds, that is building from directories other than the top level directory. Installation from multiple build directories also working. An initial configure in the top level directory is no longer needed as described in 04/02/2003 entry. A 'make distclean' will be needed before building in a directory other than the top level directory if the autotools have been run from this top level directory at some point, but autoconf will tell you this. Note that 'make check' only works from the top level directory at the moment. 04/28/2003: beazley Fixed [ 723471 ] Wrapper_print() fails with preprocessor directives. 04/28/2003: beazley Minor refinement of const static member variable handling described in CHANGES 08/11/2002. Previously, SWIG merely checked to see if there was an initializer in the declaration. Now, SWIG additionally checks to make sure the static member is const. 04/25/2003: ljohnson (Lyle Johnson) [Ruby] Added a kind of limited support for multiple inheritance, activated using the -minherit command-line option. I've also updated the "C++ Inheritance" section of the Ruby documentation to discuss how this works, and its limitations. Also also modified the minherit.i test case to run against this. 04/25/2003: ljohnson (Lyle Johnson) [Ruby] Added the -globalmodule command-line option for the Ruby module, for wrapping stuff into the global module (Kernel) instead of a nested module. Updated documentation accordingly. 04/23/2003: mrose (Mark Rose) Fixed symname error in director calls to Python methods that extend C++ operators. Stopped director destructor wrappers from calling __set_up, which was leaving the director flag in an inconsistent state. 04/23/2003: beazley Fixed problem with namespace resolution and nested namespaces. Reported by Alfred Lorber (and Marcelo Matus). 04/16/2003: cheetah (William Fulton) Patch for Java examples and test-suite to run on Mac OS X. 04/15/2003: ljohnson (Lyle Johnson) [Ruby] Incorporated Nobu Nakada's patches for supporting the Ruby 1.8 allocation framework. 04/15/2003: ljohnson (Lyle Johnson) [Ruby] Replaced all uses of the deprecated STR2CSTR() macro with the safer StringValuePtr() macro. For more information, see ruby-talk:67059 and follow-ups to that post. 04/11/2003: beazley Fixed problem with preprocessor macro expansion. For example: #define min(x,y) ((x) < (y)) ? (x) : (y) int f(int min); Reported by Sebastien Recio. 04/10/2003: cheetah (William Fulton) [Java] Added a runtime check to typemaps in arrays_java.i library to check that the Java array passed in is the same size as the C array and throw an exception if not. Also fix to use delete instead of free for arrays created using new. 04/07/2003: cheetah (William Fulton) Remove GCC3 warning when compiling the examples and test-suite: cc1plus: warning: changing search order for system directory "/usr/include" cc1plus: warning: as it has already been specified as a non-system directory See SF patch #715531 submitted by Gerald Williams 04/03/2003: cheetah (William Fulton) [C#] Improved wrapping of enums and constants. These were previously wrapped as C# variables rather than constants. Either these are wrapped as readonly (runtime) constants or compile time constants, depending on the %javaconst directive (The directive is likely to change name soon). For example wrapping: %javaconst(0); #define ABC 22 %javaconst(1) XYZ; #define XYZ 33 is now: public static readonly int ABC = examplePINVOKE.get_ABC(); public const int XYZ = 33; 04/03/2003: cheetah (William Fulton) [Java] Global constants and enums are put in their own interface called xxxConstants, where xxx is the module name. This is an improvement as it is possible to derive (implement) a Java class from the xxxConstants interface to improve the syntax; namely when wrapping: enum {ONE=1, TWO, THREE}; accessing these from a Java class implementing xxxConstants is neater: int number = ONE; than the previous: int number = xxx.ONE; Patch submitted by Dave Dribin. 04/02/2003: cheetah (William Fulton) Build improvements for multiple builds. This allows one to build the SWIG executable and runtime libraries for different platforms/compilers etc by running configure in different directories. This isn't 100% just yet and won't be until libtool is better configured... a 'configure' and 'make distclean' needs to be run in the root directory before it all works. For example: $ ./configure $ make distclean $ mkdir config1; cd config1; ../configure CC=gcc CXX=g++; make; cd .. $ mkdir config2; cd config2; ../configure CC=cc CXX=c++; make; cd .. To be improved. A 'make check' does not work yet either. 04/01/2003: beazley Fixed template partial specialization argument expansion bug. This showed up when trying to use std_vector.i with vectors of pointers. 03/31/2003: cheetah (William Fulton) Fix for parallel make builds of SWIG, for example make -j 4 Build failure reported by Bill Clarke. 03/28/2003: beazley Released 1.3.19. Version 1.3.19 (March 28, 2003) =============================== 03/28/2003: beazley Variety of minor bug fixes to the 1.3.18 release including: - Segmentation fault with %extend directive. - Typemap variable substitution bug. - Expression evaluation bug. - Large memory leak with template expansion. Version 1.3.18 (March 23, 2003) =============================== 03/21/2003: beazley Fixed two problems with the %extend directive, overloading, and template expansion. See the 'template_extend_overload' and 'template_extend_overload_2' tests in Examples/test-suite for details. 03/20/2003: cheetah (William Fulton) [C#] Added some typemaps as suggested by Andreas Schoerk for handling parameters that are passed as pointers or by reference. These have been put in typemaps.i. 03/20/2003: beazley Fixed a C++ scoping bug related to code like this: class Foo { public: int Foo::bar(); }; Previously, SWIG just tossed out the Foo::bar() declaration. Now, the declaration is wrapped provided that the prefix is exactly the same as the current scope (including any enclosing namespaces). Reported by Bruce Lowery. 03/20/2003: beazley Incorporated [ 696516 ] Enabling exception processing for data member access. In some compilers, attribute access can generate exceptions. However, SWIG ordinarily assumes that no exceptions will be raised. To disable this, use the %feature("allowexcept"). For example: %feature("allowexcept") Foo::x; ... class Foo { public: int x; /* Exception handling enabled */ ... }; Patch contributed by Yakov Markovitch. 03/20/2003: beazley Incorporated Patch. [ 701860 ] Improve Performance (python proxies). Gives a performance boost to proxy class code and the management of the .this and .thisown attributes. Contributed by Mike Romberg. 03/19/2003: cheetah (William Fulton) [C# and Java] Added missing vararg support. 03/18/2003: mrose (Mark Rose) Removed code related to tagging individual methods for directors. The concept of having directors for some but not all virtual methods of a class is deeply flawed. The %feature("nodirector") tag is also gone. Directors are off by default. To enable them for a class, issue %feature("director") classname; which will create director methods for every virtual method in the hierarchy of the class. 03/17/2003: beazley Fixed a subtle problem with passing arguments of type function. For example: int foo(int x(int, int)); or typedef int binop_t(int, int); int foo(binop_t x); In old versions, this would produce code that wouldn't compile. Now, SWIG merely adds an extra pointer, making these declarations the same as: int foo(int (*x)(int, int)); typedef int binop_t(int, int); int foo(binop_t *x); Reported by Garth Bushell. 03/17/2003: mrose (Mark Rose) Fixed the return statement for director base class calls that have no return value. 03/15/2003: beazley Fixed a problem with const smart-pointer wrapping. For example: class Foo { public: int x; void bar() const; void spam(); }; class Blah { ... const Foo *operator->(); ... }; In this case, only "x" and "bar" are visible from Blah (since application of spam violates constness). Moreover, access to "x" is read-only. 03/15/2003: mrose (Mark Rose) Cleaned up two signed versus unsigned comparisons in python/std_vector.i. 03/15/2003: cheetah (William Fulton) [C#] Global variables are wrapped using properties instead of get and set methods. Member variable wrapping bug fixes, for example wrapping pointers work now. Typemaps are used for all variable wrapping to generate the property code. 03/13/2003: mrose (Mark Rose) Fixed a bug in the virtual method unrolling for directors. The order of unrolling is now from base to derived, to ensure that the most derived implementation of a director method is found. Director methods for pure virtual methods now throw DIRECTOR_PURE_VIRTUAL_EXCEPTION if _up is set. 03/12/2003: cheetah (William Fulton) [C#] Polymorphism fix: virtual functions now use the appropriate keyword in the C# proxy class, virtual or override. Some 'using System;' statement fixes needed by the Mono compiler. 03/11/2003: beazley Fixed subtle bug in the application of SwigValueWrapper<> to template classes with default constructors. Reported by Bruce Lowery. 03/11/2003: beazley The $descriptor(type) variable is now expanded in code supplied to %extend. This is useful for certain kinds of advanced wrapping (especially container classes). 03/11/2003: luigi Support for std::map. (a) Integration with scripting language (a la std::vector) for Python, Ruby, MzScheme, and Guile; (b) Simple wrapper for other languages 03/10/2003: beazley Fixed problem with escape sequences in string and character constants. SWIG wasn't parsing certain octal codes correctly. 03/07/2003: beazley Fixed a variety of subtle preprocessor problems reported by Sebastien Recio. (a) Empty preprocessor values no longer generate "bad constant value" errors. For example: #define FOO #define FOO BAR (b) Macro names can now span multiple lines (technically valid, although questionable practice). For example: #define A_LONG_MACRO_\ NAME 42 (c) Whitespace is no longer required before certain macro values. For example: #define FOO"Hello" #define BAR\ "Hello" 03/07/2003: ljohnson (Lyle Johnson) [Ruby] Added missing long long and unsigned long long typemaps in the Lib/ruby/typemaps.i library file. 03/07/2003: mrose (Mark Rose) Added Examples/python/callback to demostrate how directors can be used to implement callbacks in Python Added Examples/python/extend to demonstrate virtual method calls from C++ to Python (really the same as the callback example, just a different context). Added four tests for very basic director functionality. These have runtime tests under python. The Python module now emits #define SWIG_DIRECTORS near the top of the output file if directors are enabled. This is useful for disabling parts of tests in target languages that don't support directors. 03/06/2003: mrose (Mark Rose) Added a section to Doc/Manual/Python.html on cross language polymorphism (directors). 03/06/2003: mrose (Mark Rose) The short-lived "-fdirectors" command line option has been removed. To enable directors, instead use the extended %module directive as follows: %module(directors="1") modulename 03/06/2003: cheetah (William Fulton) The long long typemaps have been rewritten so that they can be more easily used with non ISO compilers, like Visual C++. For example if you are wrapping the Windows 64 bit type __int64 the long long typemaps can be used with %apply: %apply long long { __int64 }; __int64 value1(__int64 x); __int64 will now appear in the generated code instead of long long. 03/06/2003: beazley *** DEVELOPER CHANGE *** Swig module mutation has been changed slightly. When a language class method wants to save node attributes, it now uses one of the following functions: Swig_require() Swig_save() The first argument to these functions is a namespace in which saved attributes are placed. For example,this code Node *n; Swig_save("cDeclaration",n,"type","parms","name",NIL); saves the attributes as "cDeclaration:type", "cDeclaration:parms", and so forth. If necessary, a language module can refer to old values by using this special namespace qualifier. In addition to this, a special attribute "view" contains the name of the last namespace used to save attributes. In the above example, "view" would have the value "cDeclaration". The value of "cDeclaration:view" would have the previous view and so forth. Swig_restore(n) restores a node to the state before the last Swig_require() or Swig_save() call. Note: This change makes it easier for language modules to refer to old values of attributes. 03/06/2003: mrose (Mark Rose) Merged the cross-language polymorphism patch. When enabled, C++ "proxy" classes (called directors) are generated for each specified C++ class. Directors pass method calls from C++ to Python, similar to the way the usual proxy (shadow) classes pass method calls from Python to C++. Together, these two types of proxies allow C++ classes that are extended in Python to behave just like ordinary C++ classes and be used in C++ like native objects. This feature is still very experimental and is disabled by default. To enable director support, specify '-fdirectors' on the SWIG command line or in the SWIG_FEATURES environment variable. In the interface file, add %feature("director") to generate directors for all classes that have virtual methods. See http://stm.lbl.gov/~tm2/swig/ProxyDoc.html for more details. 03/03/2003: beazley Fixed a small glitch in typemap local variable replacement. If you had a typemap like this: %typemap(in) type ($1_type temp) { ... temp = ...; ... } and no occurrence of "$1_type" appeared in the body, then the local variable type wouldn't be substituted. 03/03/2003: cheetah (William Fulton) [C#] New version of the CSharp module which is typemap based. It also uses ECMA C# and no longer uses Microsoft Visual C++.NET glue. This means that it will work on non-Windows platforms. Contributed by Neil Cawse. 02/27/2003: beazley Fixed [ 653548 ] error parsing casting operator definition. SWIG now ignores casting operators declared outside of a class. For example: inline A::operator char *() { ... } Bug reported by Martin Casado. 02/27/2003: beazley Added support for anonymous bit-fields. For example: struct Foo { int x : 4; int : 4; int y : 8; }; Anonymous bit-fields are ignored by SWIG. Problem reported by Franz Höpfinger. 02/26/2003: cheetah (William Fulton) [Java] Better typemaps in the Examples/java/typemap example and also fixes subtle bug when using the StringBuffer typemaps more than once. 02/26/2003: beazley Fixed [ 642112 ] Constants char bug. 02/26/2003: beazley Fixed [ 675337 ] Partial template specialization not entirely working. There was a subtle problem related to the naming and ordering of template partial specialization arguments. Matching worked okay, the resulting templates weren't expanded correctly. 02/25/2003: beazley Fixed problem with parsing (and generating code) for references to arrays. For example: int foo(int (&x)[10]); 02/25/2003: beazley Fixed [ 635347 ] Compilation warning from libpy.c. Reported by Daniel L. Rall. 02/25/2003: beazley Fixed a subtle problem with virtual method implementation checking and typedef. typedef int *intptr; struct A { virtual int *foo() = 0; }; struct B : public A { virtual intptr foo() { }; }; SWIG was treating these declarations as different even though they are the same (via typedef). 02/25/2003: ljohnson (Lyle Johnson) [Ruby] Added range checking for the NUM2USHRT macro, per [ 675353 ]. 02/24/2003: beazley Fixed a subtle problem with the code that determined if a class is abstract and can be instantiated. If you had classes like this: struct A { virtual int foo(int) = 0; }; struct B : virtual A { virtual int foo(int); }; struct C : virtual A { }; /* Note order of base classes */ struct D : B, C { }; /* Ok */ struct E : C, B { }; /* Broken */ then SWIG determined that it could instantiate D(), but not E(). This inconsistency arose from the depth-first search of the inheritance hierarchy to locate the implementations of virtual methods. This problem should now be fixed---SWIG will attempt to locate any valid implementation of a virtual method by traversing over the entire hierarchy. 02/22/2003: cheetah (William Fulton) [Java] Fix for using enum typemaps. The Java final static variable type can be set using the jstype typemap, enabling enums to be mapped to something other than int. Bug reported by Heiner Petith. 02/21/2003: songyanf (Tiger) Added CSharp (C#) module prototype i.e. csharp.cxx & csharp.h at Source/Modules/. They are for test usage only now and need improvement. The interface also need to be modified. *** NEW FEATURE *** 02/20/2003: songyanf (Tiger) Fixed problem with typedef with -fvirtual. Similar as beazley's modification today. 02/20/2003: beazley Added support for gcc-style variadic preprocessor macros. Patch [ 623258 ] GCC-style vararg macro support. Contributed by Joe Mason. 02/20/2003: beazley Fixed [ 605162 ] Typemap local variables. Reported by Lyle Johnson. 02/20/2003: beazley Fixed problem with abstract classes and typedef. For example: class Foo { public: virtual void foo(int x) = 0; }; typedef int Integer; class Bar : public Foo { public: virtual void foo(Integer x); }; SWIG was getting confused about the latter method---making Bar abstract. Reported by Marcelo Matus. 02/19/2003: cheetah (William Fulton) [Java] %javaconst(flag) can also be used on enums as well as constants. This feature enables true Java compiler constants so that they can be used in Java switch statements. Thanks to Heiner Petith for patches. 02/19/2003: songyanf (Tiger) Modified -fcompact feature to deal with PP lines 02/18/2003: beazley Fixed [ 689040 ] Missing return value in std_vector.i. Reported by Robert H. de Vries. 02/18/2003: beazley Fixed a few evil scoping problems with templates, namespaces, and the %extend directive. Problem reported by Luigi Ballabio. 02/18/2003: cheetah (William Fulton) [Ruby] Improved support for Visual C++ and other native Windows compilers. It is no longer necessary to specify "/EXPORT:Init_", where is the swig module name when linking using these native Windows compilers. 02/15/2003: songyanf (Tiger) Added -fvirtual option. Reduce the lines and size of the wrapper file by omitting redifined virtual function in children classes. Modified -compact option to -fcompact option Added -small option. -small = -fvirtual -fcompact And it can be extended by future feature options, which are used to reduce wrapper file szie. Added SWIG_FEATURES environment variable check. To dynamically set the feature options such as -fcompact & -fvirtual *** NEW FEATURE *** 02/13/2003: lenz Updated Doc/Manual/Perl5.html to talk about C++ compile problems configure.in now checks for PERL5_CCFLAGS Runtime/Makefile.in and Example/Makefile.in now use PERL5_CCFLAGS Added Lib/perl5/noembed.h which contains all the known macro conflicts 02/12/2003: beazley Fixed [ 685410 ] C++ Explicit template instantiation causes SWIG to exit. Fixes a syntax error with declarations similar to this: template class std::vector; SWIG now ignores the instantiation and generates a warning message. We might do more later. Reported by Thomas Williamson. 02/11/2003: cheetah (William Fulton) Rewrote bool typemaps to remove performance warning for compiling generated code under Visual C++. 02/11/2003: cheetah (William Fulton) Fix for wrapping reference variables (const non-primitive and all non-const types) for example: int& i; Class& c; const Class& c; 02/11/2003: beazley Fixed more very subtle preprocessor corner cases related to recursive macro expansion. For example: #define cat(x,y) x ## y cat(cat(1,2),3) // Produces: cat(1,2)3 #define xcat(x,y) cat(x,y) xcat(xcat(1,2),3) // Produces 123 See K&R, 2nd Ed. p. 231. 02/10/2003: cheetah (William Fulton) Fixed [ 683882 ] - patch submitted by F. Postma for SWIG to compile on HP-UX. 02/10/2003: beazley Fixed subtle preprocessor argument expansion bug. Reported by Marcelo Matus. 02/10/2003: songyanf Added -compact option. Reduce the lines and size of the wrapper file by omitting comments and combining short lines. *** NEW FEATURE *** 02/07/2003: beazley Fixed [ 651355 ] Syntax error with cstring.i Reported by Omri Barel. 02/07/2003: beazley Fixed [ 663632 ] incompatibility with standard cpp. This is a refinement that fixes this problem: // Some macro with an argument #define FOO(x) x int FOO; /* Not a macro---no arguments */ 02/05/2003: beazley Fixed [ 675491 ] parse error with global namespace qualification. Submitted by Jeremy Yallop. 02/04/2003: beazley Fixed bug in varargs processing introduced by the numinputs typemap parameter. 01/08/2003: ttn [xml] Fix string-replacement ordering buglet. Thanks to Gary Herron. 12/23/2002: cheetah (William Fulton) Further build changes: - The SWIG executable is now built using a single Makefile. - This makefile is generated by Automake (Source/Makefile.am). - Dependency tracking and tags support are in this makefile. - Automake 1.7.2 and Autoconf 2.54 minimum versions are needed to build SWIG from CVS. - Running ./autogen.sh now installs Autoconf/Automake support files into Tools/config and these files are no longer stored in CVS. - Bug fixes in 'make install' for systems using .exe executable extension and ./configure --with-release-suffix=whatever 12/16/2002: cheetah (William Fulton) More build changes: - Autoconf's AC_CANONICAL_HOST replaces proprietary approach for detecting build host. - Autoconf support files moved to Tools/config. 12/16/2002: cheetah (William Fulton) Modifications to run on MacOS, submitted by Bernard Desgraupes. Mainly ensuring generated files are output in the appropriate directory for some modules. 12/11/2002: cheetah (William Fulton) Various build modifications and bug fixes: - Simplification of version string. Use autoconf's PACKAGE_VERSION instead. - Build time removed from SWIG version. - Using standard autoconf config header generation. - Updated old autoconf macros as reported by autoupdate. - Removed $prefix in autoconf from search paths as autoconf won't expand them. - Subtle bug fix where 'make prefix=/somewhere; make clean; make prefix=/somwhere/else' produced an executable using the incorrect library directories. - Added -ldflags commandline option for MzScheme, Ocaml, Pike and PHP. - Fixed reporting of compiler used when using -version commandline option. - SWIG web address added to -version commandline option. 12/11/2002: beazley Minor fix to Tcl dynamic cast typemaps. Reported by Kristopher Blom. 12/10/2002: beazley Fixed subtle template argument replace bug. Reported by Chris Flatley. 12/10/2002: beazley Reverted CHANGES 09/03/2002, preprocessor argument evaluation. Arguments are not evaluated during collection, K&R, p. 230. 12/06/2002: beazley Fixed [ 649022 ] Compilation problems with KAI/KCC 12/02/2002: beazley SWIG 'rel-1-3' CVS branch merged back into the main branch. Version 1.3.17 (November 22, 2002) ================================== 11/19/2002: beazley Fixed [ 613922 ] preprocessor errors with HAVE_LONG_LONG. 11/19/2002: beazley Fixed [ 615480 ] mzscheme SWIG_MustGetPtr_. 11/19/2002: beazley Fixed [ 635119 ] SWIG_croak causes compiler warning. 11/16/2002: cheetah (William Fulton) [Java] Added typemaps for pointers to class members. 11/15/2002: cheetah (William Fulton) [Java] Bug fix: Overloaded C++ functions which cannot be overloaded in Java once again issue a warning. 11/14/2002: cheetah (William Fulton) [Java] Handling of NULL pointers is improved. A java null object will now be translated to and from a NULL C/C++ pointer by default. Previously when wrapping: class SomeClass {...}; void foo(SomeClass *s); and it was called from Java with null: modulename.foo(null) a Java NullPointerException was thrown. Extra typemaps had to be written in order to obtain a NULL pointer to pass to functions like this one. Now the default wrapping will detect 'null' and translate it into a NULL pointer. Also if a function returns a NULL pointer, eg: SomeClass *bar() { return NULL; } Then this used to be wrapped with a SomeClass proxy class holding a NULL pointer. Now null is returned instead. These changes are subtle but useful. The original behaviour can be obtained by using the original typemaps: %typemap(javaout) SWIGTYPE { return new $&javaclassname($jnicall, true); } %typemap(javaout) SWIGTYPE *, SWIGTYPE &, SWIGTYPE [] { return new $javaclassname($jnicall, $owner); } %typemap(javagetcptr) SWIGTYPE, SWIGTYPE *, SWIGTYPE &, SWIGTYPE [] %{ protected static long getCPtr($javaclassname obj) { return obj.swigCPtr; } %} *** POTENTIAL INCOMPATIBILITY FOR JAVA MODULE *** 11/12/2002: beazley Fixed problem with abstract methods and signatures. For example: class abstract_foo { public: virtual int meth(int meth_param) = 0; }; class abstract_bar : public abstract_foo { public: int meth(int meth_param_1, int meth_param_2) { return 0; } }; In this case, abstract_bar is still abstract. Fixes [ 628438 ] Derived abstract class not abstract. Reported and patched by Scott Michel. 11/11/2002: beazley Fixed a matching problem with typemaps and array dimensions. For example, if you had this: typedef char blah[20]; and a typemap: %typemap() char [ANY] { ... $1_dim0 ... } then $1_dim* variables weren't be expanded properly. It should work now. Problem reported by Pankaj Kumar Goel. 11/07/2002: mkoeppe Added an experimental new module that dumps SWIG's parse tree as (Common) Lisp s-expressions. The module is invoked with SWIG's -sexp command-line switch. The output can be read into Common Lisp. There is (prototype) example Lisp code that generates Foreign Function Interface definitions for use with Kevin Rosenberg's UFFI. *** EXPERIMENTAL NEW FEATURE *** 11/07/2002: mkoeppe Removed duplicate declaration of "cpp_template_decl" in parser.y; bison 1.75 complained. 11/06/2002: cheetah (William Fulton) [Java] Default primitive array handling has changed like arrays of classes. C primitive arrays are no longer wrapped by a Java array but with a pointer (type wrapper class). Again the changes have been made for efficiency reasons. The original typemaps have been moved into arrays_java.i, so the original behaviour can be obtained merely including this file: %include "arrays_java.i" The array support functions are no longer generated by default. They are only generated when including this file, thus this often unused code is only generated when specifically requiring this type of array support. *** POTENTIAL INCOMPATIBILITY FOR JAVA MODULE *** 11/05/2002: ljohnson (Lyle Johnson) [Ruby] Added support for nested module declarations (as was previously added for the Perl module). So a %module directive of the form: %module "Outer::Inner::Foo" will nest everything as (in Ruby code): module Outer module Inner module Foo # stuff goes here end end end 11/05/2002: mkoeppe [MzScheme] Add an argument (-declaremodule) that generates code to correctly declare a primitive module extension. Patch submitted by Bruce Butterfield. 11/02/2002: cheetah (William Fulton) [Java] Added patch submitted by Michael Cahill to remove unused parameter warnings for the jenv and cls parameters. This patch also also allows one to use "void" in the jni typemap for any type without code being generated attempting to return a value. 10/29/2002: cheetah (William Fulton) [Java] Array handling is different. Arrays of classes are no longer wrapped with proxy arrays, eg wrapping class X {...}; X foo[10]; used to be wrapped with these Java getters and setters: public static void setFoo(X[] value) {...} public static X[] getFoo() {...} This approach is very inefficient as the entire array is copied numerous times on each invocation of the getter or setter. These arrays are now wrapped with a pointer so it is only possible to access the first array element using a proxy class: public static void setFoo(X value) {...} public static X getFoo() {...} Arrays of enums have also been similarly changed. This behaviour is now like the other SWIG language's implementation and the array library should be used to access the other elements. The original behaviour can be achieved using the macros and typemaps in arrays_java.i, for example: %include "arrays_java.i" JAVA_ARRAYSOFCLASSES(X) class X {...}; X foo[10]; *** POTENTIAL INCOMPATIBILITY FOR JAVA MODULE *** 10/29/2002: cheetah (William Fulton) [Java] Two new typemaps javain and javaout for generating the proxy class and type wrapper class method calls to the JNI class. The new typemaps are really used for transforming the jstype (used in proxy class and type wrapper classes) to the jtype (used in the JNI class) and visa versa. A javain typemap is required whenever an in typemap is written and similarly javaout for an out typemap. An example is probably best to show them working: %typemap(javain) Class "Class.getCPtr($javainput)" %typemap(javain) unsigned short "$javainput" %typemap(javaout) Class * { return new Class($jnicall, $owner); } %inline %{ class Class {}; Class * bar(Class cls, unsigned short ush) { return new Class(); }; %} The generated proxy code is then: public static Class bar(Class cls, int ush) { return new Class(exampleJNI.bar(Class.getCPtr(cls), ush), false); } Some new special variables have been introduced in order to use these typemaps. Here $javainput has been replaced by 'cls' and 'ush'. $jnicall has been replaced by the native method call, 'exampleJNI.bar(...)' and $owner has been replaced by 'false'. $javainput is analogous to the $input special variable. It is replaced by the parameter name. $jnicall is analogous to $action in %exception. It is replaced by the call to the native method in the JNI class. $owner is replaced by either true if %newobject has been used otherwise false. The java.swg file contains default javain and javout typemaps which will produce the same code as previously. This change is only of concern to those who have written their own typemaps as you will then most likely have to write your own javain and javaout typemaps. The javaout typemap also makes it possible to use a Java downcast to be used on abstract proxy base classes. See the Java documentation on dynamic_cast. *** POTENTIAL INCOMPATIBILITY FOR JAVA MODULE *** 10/24/2002: ttn [Methodology] Upgaded to libtool 1.4.3, presumably w/ better support for newish platforms (like MacOS X). 10/21/2002: ttn Fixed Runtime/Makefile.in bug -- thanks to Richard Calmbach. 10/18/2002: ttn Fixed typo in doh.h -- thanks to Max Horn. Version 1.3.16 (October 14, 2002) ================================= 10/13/2002: beazley Fixed bug with %extend directive and %feature reported by William Fulton. 10/13/2002: beazley Added OpenVMS build directory (vms). Contributed by Jean-François Pieronne. 10/09/2002: cheetah (William Fulton) [Java] Added throws clause to the native functions in the JNI class. The throws clause is the same as the one generated for proxy functions and module class functions. 09/27/2002: beazley Fixed some problems with the %import directive and classes that were defined but not wrapped. Problem reported by Leslie Brooks, Gerry Woods, and others. 09/23/2002: cheetah (William Fulton) [Java] Some error checking added: 1) OutOfMemoryException check in the char * typemaps. 2) As SWIG treats pointers, references and passing by value all the same, it is possible to pass a NULL pointer to a function that expects an object passed by value or by reference. A NullPointerException is now thrown under this scenario. 09/20/2002: ttn [Methodology] Reworked "make clean" and "make install" to be more table driven. [Docs] Explain how to extend "make install" w/ extra-install.list. 09/15/2002: beazley Deprecation of the "ignore" typemap. The "ignore" typemap has been deprecated in favor of a generalization of the "in" typemap. To ignore an argument, use something like this instead: %typemap(in,numinputs=0) int *output (int temp) { $1 = &temp; } This change fixes a number of subtle bugs related to the interaction of the "in" and "ignore" typemaps (which were supposed to be mutually exclusive). The use of the numinputs argument is reserved for future expansion. Currently, values >1 will generate an error. However, future releases of SWIG may utilize that to support multi-input typemaps. %typemap(ignore) still works, but generates a warning message and is translated to %typemap(in,numinputs=0). *** POTENTIAL INCOMPATIBILITY *** *** NEW FEATURE *** 09/15/2002: beazley Fixed segmentation fault for unnamed structures. For example: typedef struct { } *blah; Reported by Roger Gibson. Note: we might be able to generate wrappers in special cases. 09/13/2002: beazley Minor modification to generated wrapper functions. Pointer arguments are now always set to an initial value of 0. Simplifies typemap writing and cleanup code (since you can rely on zero-value initialization). This also greatly reduces the need to ever write an "arginit" typemap. 09/12/2002: beazley Minor enhancement to smart-pointer support. If operator->() is part of an ignored base class like this, %ignore Bar; class Foo { public: int blah(); }; class Bar { /* Ignored */ public: ... Foo *operator->(); ... }; class Spam : public Bar { }; then methods from Foo are still available. For example, >>> s = Spam() >>> s.blah() 0 >>> The only catch is that the operator->() itself is not available (since it wasn't wrapped). Therefore, there won't be any __deref__() operation unless it is explicitly added to Spam (either using %extend or just placing operator->() in the definition of Spam). 09/11/2002: ttn [Methodology] Reworked "make check" to be more table driven. [Docs] Docuemented methodology in Manual/Extending.html. 09/11/2002: ttn [Docs] Prefixed Manual/*.html with "" to pander dotingly to (over-)sensitive editors. 09/10/2002: ttn [Guile] Converted Examples/guile/simple "make check" behavior to actually check execution results. Reduced iteration counts so that the test doesn't take too long. 09/10/2002: beazley SWIG-1.3.15 released. Version 1.3.15 (September 9, 2002) ================================== 09/09/2002: beazley Fixed nasty runtime type checking bug with subtypes and inheritance and templates. 09/09/2002: cheetah (William Fulton) [Java] Java exception classes for a method's throws clause can be generated by specifying them in a comma separated list in the throws attribute in any one of the following typemaps: in, out, check, freearg, argout and throws. A classic example would be to convert C++ exceptions into a standard Java exception: %typemap(throws, throws="java.io.IOException") file_exception { jclass excep = jenv->FindClass("java/io/IOException"); if (excep) jenv->ThrowNew(excep, $1.what()); return $null; // or use SWIG_fail } class file_exception {...}; void open(const char *filename) throw(file_exception); The Java method will then be declared with a throws clause: public static void open(String filename) throws java.io.IOException {...} 09/08/2002: mkoeppe * [Guile] Improved the documentation system. The arglist no longer gets cluttered with type specification, making it more readable. (Also the ILISP function C-u M-x `arglist-lisp' RET works better this way.) The types of arguments are explained in an extra sentence after the arglist. There are now two documentation-related typemap arguments: %typemap(in, doc="$NAME is a vector of integers", arglist="$name") int *VECTOR { ... } The "arglist" texts of all arguments of a function make up its arglist in the documentation. The "doc" texts of all arguments are collected to make a sentence that describes the types of the arguments. Reasonable defaults are provided. As usual, $name is substituted by the name of the argument. The new typemap variable $NAME is like $name, but marked-up as a variable. This means that it is upper-cased; in TeXinfo mode ("-procdocformat texinfo") it comes out as @var{name}. The directives %values_as_list, %values_as_vector, %multiple_values now also have an effect on the documentation. (This is achieved via the new pragmas return_nothing_doc, return_one_doc, return_multi_doc.) Documentation has also improved for variables that are wrapped as procedures-with-setters (command-line switch "-emit-setters"). * [Guile] Emit constants as _immutable_ variables. (This was broken recently.) 09/07/2002: mkoeppe [Guile] Updated the typemaps in list-vector.i. 09/07/2002: mkoeppe Short-circuit the typechecks for overloaded functions. (The changes in code generation are visible in the new testcase "overload_complicated".) 09/06/2002: cheetah (William Fulton) [Java] Solution for [ 596413 ] New typemap so that the Java proxy classes and type wrapper classes wrapper constructor modifier can be tailored by users. The default value is protected. Normally SWIG generates a constructor like this which can only be accessed within one package: protected Bar(long cPtr, boolean cMemoryOwn) { ... } If you are using SWIG across multiple packages or want to use this constructor anyway, it can now be accessed outside the package. To modify use for example: %typemap(javaptrconstructormodifiers) SWIGTYPE "public" to change to public for all proxy classes and similarly for all type wrapper classes: %typemap(javaptrconstructormodifiers) SWIGTYPE, SWIGTYPE *, SWIGTYPE &, SWIGTYPE [] "public" 09/06/2002: cheetah (William Fulton) [Java] Added throws typemaps for the Java module. C++ exceptions get converted into java.lang.RuntimeException Java exceptions. Warning: This may change from java.lang.Runtime exception in the future. 09/05/2002: cheetah (William Fulton) [Java] Fix for variables declared as references. 09/05/2002: beazley Fixed [ 605162 ] Typemap local variables. Reported by Lyle Johnson. 09/05/2002: ljohnson (Lyle Johnson) [Ruby] More updates to the Ruby module documentation, including a new typemap example that demonstrates how to collect key-value pairs from an argument list into a Hash. 09/05/2002: beazley Fixed bug with template expansion and constructors. template class Foo { public: Foo() { } }; The extra in the constructor was carried through in the name--causing runtime problems in generated modules. Reported by Jordi Arnabat Benedicto. 09/05/2002: mkoeppe [Guile] Support overloading. 09/04/2002: ljohnson (Lyle Johnson) [Ruby] Updated typemaps for long long and unsigned long long types to use Ruby 1.7 support for these types when available. 09/04/2002: ljohnson (Lyle Johnson) [Ruby] Added output typemaps for const reference to primitive types. 09/04/2002: mkoeppe [Guile] Fix pass-by-value typemaps. Reported by Arno Peters via Debian bugtracking (#156902), patch by Torsten Landschoff . 09/03/2002: samjam (Sam Liddicott) Better reference support. Functions that want a void** can take a NULL by reference and the void* will be made for you and then passed-by-reference Also all integer-class native types can be passed by reference where an int* or int& etc is needed 09/03/2002: beazley Changed the evaluation order of preprocessor macro arguments. Arguments are now expanded by the preprocessor *before* they are passed to macro expansion. This fixes a subtle expansion bug reported by Anthony Heading. 09/03/2002: beazley Fixed the file include order (again, apparently). See 2/27/99. 09/02/2002: beazley [Perl] Better exception handling support. Since Perl error handling relies on setjmp/longjmp, wrapper functions have been modified slightly to provide an extra block scope: XS(foo) { char _swigmsg[SWIG_MAX_ERRMSG] = ""; const char *_swigerr = _swigmsg; { /* Normal wrapper function here */ ... SWIG_croak("An error occurred\n"); ... XSRETURN(argvi); /* Successful return */ fail: /* cleanup code */ } croak(_swig_err); } The macro SWIG_croak(x) sets the value of _swigerr to x and executes a "goto fail". The whole wrapper function is enclosed block scope to provide proper cleanup of C++ objects. Since croak executes a longjmp(), there is no way to properly reclaim resources if this executes in the same scope as the wrapper function. The _swigmsg[] variable is normally unused, but can be used to store small error messages using sprintf or snprintf. It has a capacity of at least 256 bytes (SWIG_MAX_ERRMSG). 09/02/2002: beazley [Tcl] Added better support for exceptions. Instead of returning TCL_ERROR, use the macro SWIG_fail to return with an error. This ensures that arguments are properly cleaned up. Exception specifiers are now handled by default. 09/02/2002: ljohnson (Lyle Johnson) [Ruby] The type-checking system for the Ruby module has had a flaw in that some types which should be considered equivalent weren't. This bug was best demonstrated by the inherit_missing.i test suite case, which defines a base class "Foo" that is subclassed by "Bar". The "Foo" class isn't actually wrapped (i.e. it's not directly accessible from Ruby) but we'd still like to be able to pass "Bar" instances to functions expecting Foos and have that work; it wasn't. The revised implementation (similar to that used for some other language modules) adds a new instance variable (__swigtype__) to each object that indicates its SWIG type; that is, each "Bar" instance will now have a string instance variable called "__swigtype__" whose value is "_p_Bar". Unless developers were taking advantage of this low-level implementation detail, they shouldn't notice any compatibility problems; nevertheless, I'm marking it as a "potential incompatibility". *** POTENTIAL INCOMPATIBILITY *** 09/01/2002: ljohnson (Lyle Johnson) [Ruby] Fixed SF Bug #603199. 08/08/2002: cheetah (William Fulton) [Java] Added OUTPUT, INPUT and INOUT typemaps in typemaps.i for C++ references. 08/27/2002: mkoeppe [Guile] Fixed error in "lib_std_vector" testcase and compiler warning in "lib_cdata" testcase. 08/27/2002: ljohnson (Lyle Johnson) [Ruby] Added the "%mixin" directive, which allows the user to specify a comma-separated list of module names to mix-in to a class. So, for example, if you'd like to specify that Ruby's Enumerable module should be mixed-in to your class Foo, you'd write: %mixin Foo "Enumerable"; or to specify that the modules Fee, Fie and Fo should be mixed in to Foo: %mixin Foo "Fee,Fie,Fo"; *** NEW FEATURE *** 08/27/2002: ljohnson (Lyle Johnson) [Ruby] Modified the %alias directive so that multiple aliases can be specified for an instance method by using a comma-separated list of aliases. 08/27/2002: ljohnson (Lyle Johnson) [Ruby] Added "throw" typemaps for the Ruby module. 08/26/2002: beazley Two new command line options for printing dependencies. 'swig -M' lists all file dependencies. 'swig -MM' lists dependencies, but excludes files in the SWIG library. Example: % swig -M -python example.i example_wrap.cxx: \ /u0/beazley/Projects/lib/swig1.3/swig.swg \ /u0/beazley/Projects/lib/swig1.3/python/python.swg \ example.i \ example.h % swig -MM -python example.i example_wrap.cxx: \ example.i \ example.h *** NEW FEATURE *** 08/26/2002: beazley Fixed [ 597599 ] union in class: incorrect scope. Reported by Art Yerkes. 08/26/2002: beazley Fixed [ 600132 ] Default argument with namespace. Reported by Shibukawa Yoshiki. 08/24/2002: beazley Automatic C++ exception handling enabled for all language modules. This is pretty simple. If you have a class like this: class Foo { }; class Bar { public: void blah() throw(Foo); } then the generated wrapper code looks like this: wrap_Bar_blah() { ... try { arg1->blah(); } catch (Foo &_e) { /* "throw" typemap code inserted. $1 = _e */ } catch (...) { throw; } } The "throw" typemap can be used to raise an error in the target language. It can do anything. Here is a very simple example: %typemap("throw") Foo { PyErr_SetString(PyExc_RuntimeError, "Foo exception"); return NULL; } To make this work in each language module, simply define a few default "throw" typemaps for SWIGTYPE, SWIGTYPE *, int, const char *, and a few common exception types. That's all there is to it. Automatic exception handling can be disabled using -noexcept or setting the NoExcept global variable to 1. *** NEW FEATURE *** 08/23/2002: beazley [ Python ] Automatic translation of C++ exception specifications into error handling code. For example: class Foo { }; class Bar { public: void blah() throw(Foo); } In this case, Foo is wrapped as a classic-style class (compatible with exception handling). Furthermore, you can write Python code like this: b = Bar() try: b.blah(); except Foo,e: # Note use of exception class here! # Handle Foo error ... The object "e" in the exception handler is just a wrapped Foo object. Access it like a normal object. If an exception is not wrapped as a class, a RuntimeError exception is raised. The argument to this exception is the exception object. For example: class Bar { public: void blah() throw(int); } b = Bar() try: b.blah(); except RuntimeError,e: print e.args[0] # Integer exception value Comments: - If a class is used as an exception, it *must* be wrapped as a Python classic-style class (new classes don't work). - Automatic exception handling is compatible with %exception. - Use -noexcept to turn off this feature. - The newly introduced "throw" typemap is used to raise Python errors (naturally). *** EXPERIMENTAL NEW FEATURE *** 08/23/2002: beazley Information from throw() specifiers is now stored in the parse tree. For example: class Foo { public: int blah() throw(spam,bar); } The stored information is fully corrected for namespaces and works with templates. Uses will follow. 08/22/2002: beazley Exception handling code is no longer applied to member access function. For example, in this code %exception { try { $action } catch(whatever) { ... } } class Foo { public: int x; ... } The exception handling code is not applied to accessor functions for Foo::x. This should reduce the amount of extra code generated. Caveat: Exception handling code *is* used when attributes are accessed through a smart-pointer or a synthesized attributed added with %extend is used. 08/22/2002: beazley Made more patches to hopefully eliminate problems when compiling SWIG as a 64-bit executable. 08/22/2002: beazley Fixed a bug with const reference members, variables, and static members. For example: class Foo { public: static const int &ref; }; SWIG was trying to generate "set" functions which wouldn't compile. 08/21/2002: beazley Made the warning message for "Class X might abstract" off by default. Enable with -Wall. 08/21/2002: beazley Refined handling of const and non-const overloaded methods. If a class defines a method like this: class Foo { public: int bar(int); int bar(int) const; } Then the non-const method is *always* selected in overloading and the const method silently discarded. If running with -Wall, a warning message will be generated. 08/19/2002: beazley Better support for using declarations and inheritance. Consider this: class Foo { public: int blah(int x); }; class Bar { public: double blah(double x); }; class FooBar : public Foo, public Bar { public: char *blah(char *x); using Foo::blah; using Bar::blah; }; Now SWIG wraps FooBar::blah as an overloaded method that uses all accessible versions of blah(). See section 15.2.2 in Stroustrup, 3rd Ed. SWIG also supports access change through using declarations. For example: class Foo { protected: int x; int blah(int x); }; class Bar : public Foo { public: using Foo::x; using Foo::blah; }; Caveat: SWIG does not actually check to see if declarations imported via 'using' are in the inheritance hierarchy. If this occurs, the wrapper code won't compile anyways---not sure it's worth worrying about. 08/18/2002: beazley Modified overloading dispatch to not include nodes with an "error" attribute. A language module can set this if a node couldn't be wrapped and you don't want it included in the dispatch function. 08/18/2002: beazley Enhancement to overloaded function dispatch. The dispatcher is now aware of inheritance relationships. For example: class Foo { }; class Bar : public Foo { }; void spam(Foo *f); void spam(Bar *b); In this case, the dispatcher re-orders the functions so that spam(Bar *b) is checked first---it is more specific than spam(Foo *f). 08/17/2002: beazley Added -Werror command line option. If supplied, warning messages are treated as errors and SWIG will return a non-zero exit code. 08/17/2002: beazley Fixed [ 596135 ] Typedef of reference can't compile. For example: typedef int &IntRef; void foo(IntRef i); SWIG-1.3.14 generated code that wouldn't compile. Version 1.3.14 (August 12, 2002) ================================ 08/11/2002: mmatus Static const members initialized during declaration, and only them, ie: struct A { static const int a = 1 ; // this one static const int b; // not this one }; are emitted like constants (equivalent to enums or explicit %constant). This is because they cannot be added directly to 'cvar' since they lack the needed reference (well, you can force them to have a real reference, but in an ugly way which goes completely again the original purpose of initialize them during declaration, you also have to deal with extra linking matters, and it take a while to figure out what is the problem and how to solve it). Please test it with your preferred target language, and not only the code generation, but really run the example in the test-suite (static-const-member-2.i) because the problem and the solution cannot be "fully" appreciated until you try to load the module and run it. In some target languages (python specially), this can produces a difference in the way that the static constant members 'a' and 'b' are internally wrapped. Hopefully, they still can be accessed in the same way. 08/11/2002: mmatus [python] Now static const members can be accessed in a more natural way, ie, if you have struct A { typedef unsigned int viewflags; static const viewflags forward_field = 0; static const viewflags backward_field; }; now you can do: print A.backward_field and also a = A() print a.forward_field Note that if the static const members don't have an initializer (like backward_field), still you can access them in the same way in the python side, but the implementation is a quite different: backward_field will still appear in the cvar entity, and also, you are responsible to initialize it in some code unit, and link it properly. forward_field, by the other hand, will not appear in the cvar entity but only as a A member, similar to what happen with enum or %constant members. 08/11/2002: mmatus [python] Common code in the __setattr__/__getattr__ now goes to two "free" methods at the beginning of the proxy file, from where each class use it. This change reduces the size of the proxy file, specially if you wrap a lot of small classes in one module (up to 33% in some cases), making it faster to load too. 08/09/2002: beazley [Perl5] If a function that returns char * returns NULL, undef is returned to the Perl interpreter. 08/09/2002: beazley Fix to conversion operators and namespaces. For example: namespace ns { struct Foo { }; struct Bar { operator Foo*(); }; } In the wrapper code, SWIG was using ->operator Foo*() when it should have been using ->operator ns::Foo*(). Note: if using %rename with a conversion operator, you might have to do this: %rename(toFooPtr) ns::operator ns::Foo*(); // ^^^^ note extra qualifier namespace ns { ... 08/09/2002: beazley [Python] Minor enhancement to 'const' variable declarations. Normally const declarations are wrapped as read-only variables accessible only through the cvar attribute (see SWIG.html for a discussion of why). However, in many programs, "const" declarations may just be constants---making the cvar. access awkward. To fix this, "const" declarations are now available both through cvar. and as a simple name. For example: const int FOO = 42; In Python: >>> print example.cvar.FOO 42 >>> print example.FOO 42 Note: There are cases where the value of a "const" variable might change. For example: char *const BAR = "Hello World"; In this case, the pointer itself can not change, but the data being pointed to could be modified. In these situations, cvar.BAR should be accessed to obtained the current value. 08/08/2002: beazley [Python] Fixed generation of the proxy code (.py files) to more closely follow the order of declarations as they appear in the .i file. In the past, all of the class wrappers appeared first, followed by function stubs, inserted Python code, and other details. 08/08/2002: cheetah (William Fulton) [Java] Proxy method _delete() changed to delete(). There shouldn't ever be a wrapped function called delete() as it is a C++ keyword and there is no such thing as a member function in C. *** POTENTIAL INCOMPATIBILITY FOR JAVA MODULE *** Backwards compatibility can be achieved by adding the function back in for all proxy classes: %typemap(javacode) SWIGTYPE %{ public void _delete() { delete(); } %} Java backwards compatibility summary ------------------------------------ There are a number of changes that have been made in improving the Java module for ver 1.3.14. If at all possible change your code to take advantages of the improvements. If you were using proxy classes you may not notice any backwards compatibility issues. Here is an example which will help with most backwards compatibility problems where it is not possible to modify the code that uses the generated output: Replace: %module modulename With: %module (jniclassname="modulename") modulename; %typemap(javacode) SWIGTYPE %{ public long getCPtr$javaclassname() { return swigCPtr; } public void _delete() { delete(); } %} %pragma(java) jniclassclassmodifiers="public"; The proxy constructors that took parameters (long cPtr, boolean cMemoryOwn) were public and are now protected. If you were making use of these then you'll have to modify your code and the best solution would be to use the new type wrapper classes. The other main areas are the pragmas and global variable wrapping. Replace the pragmas with one of the new directives or typemaps mentioned below and use %rename on the variables. If you were not using proxy classes, you will have to define a jstype typemap as well as a jtype typemap. 08/08/2002: cheetah (William Fulton) [Java] Fix for wrapping two dimension array variables. 08/07/2002: beazley [Python,Tcl] Object management now has a much better sense of ownership. Ownership bits is changed whenever an object is stored in a global variable or structure member. For example: struct Foo { int val; Foo *next; }; Now in Python >>> f = Foo() >>> f.thisown 1 >>> g = Foo() >>> g.next = f # Assign a pointer >>> f.thisown # Notice ownership change 0 >>> This scheme is mostly a conservative heuristic designed to provide segmentation faults. It could cause a memory leak if ownership is changed unnecessarily. In this case, you can either write a typemap (that doesn't change ownership), or manually set the thisown attribute back to 1. 08/07/2002: beazley [Tcl] Major usability improvements to the object interface. Suppose you had code like this: struct Foo { int x; int spam(); }; void blah(Foo *f); In past versions of SWIG, you could create objects and use them like this: % Foo f % f configure -x 3 % f spam 37 The only problem is that if you tried to call blah(), it didn't work: % blah f Type Error. Expected _p_Foo % Instead, you had to do this: % blah [f cget -this] SWIG now automatically extracts the -this pointer, avoiding this problem. This means that saying "blah f" is perfectly legal and everything will still work normally. Caveat: Since pointer strings start with a leading underscore (_), don't use this in object names. For example: % Foo _f % blah _f # Potential crash Objects now have a -thisown attribute that shows the ownership. This builds upon the CHANGES 11/24/2001 entry. 08/07/2002: samjam, Sam Liddicott Properly implemented pointer system using php resources. Still need to work out whether or not to let script-users call destructors directly 08/06/2002: beazley Upgraded mzscheme module to support version 201 and added overloading support. 08/05/2002: beazley Added parsing support for extra grouping (in very limited cases). For example: typedef int (FuncPtr)(int, double); *** EXPERIMENTAL *** 08/03/2002: ljohnson (Lyle Johnson) [Ruby] Updates to typemaps.i as those done previously for Perl, Python and Tcl modules. Now supports reference types with INPUT, OUTPUT and INOUT typemaps. 08/02/2002: beazley New library file cstring.i added. Provides macros for manipulating char * data. 08/02/2002: beazley Deprecated the %new directive. Use %newobject instead. For example: %newobject foo; ... char *foo(); %newobject follows the same rules as %rename, %ignore, %feature, etc. *** POTENTIAL INCOMPATIBILITY *** 08/01/2002: cheetah (William Fulton) [Java] New attribute 'jniclassname' for the module directive allows a way of changing the JNI class name from the default which uses the modulename with JNI appended after it. %module (jniclassname="name") modulename If 'name' is the same as 'modulename' then the module class name gets changed from 'modulename' to modulenameModule. 08/01/2002: beazley Fixed problem with file include order. Language specific directories should take precedence over generic directories. For example: "swig_lib/python/foo.i" should be loaded before "swig_lib/foo.i". I thought this was the case already, but apparently it has been broken for quite some time. 08/01/2002: beazley Added std_deque.i library file. Work in progress. 08/01/2002: beazley [Python,Tcl,Perl] Improvements to typemaps.i. INPUT/INOUT typemaps perform better error checking. Typemaps are now supplied for references like int &OUTPUT, double &INOUT, etc. 08/01/2002: beazley [Python] Deprecated the T_* and L_* typemaps in typemaps.i. Multiple return values are always placed in a tuple. Deprecated the BOTH typemaps. This is now INOUT (e.g., int *INOUT). *** POTENTIAL INCOMPATIBILITY FOR PYTHON MODULE *** 08/01/2002: beazley Deprecated the array.i, carray.i, and timer.i library files. 08/01/2002: beazley Deprecated the pointer.i library file. Use cpointer.i instead. *** POTENTIAL INCOMPATIBILITY *** 08/01/2002: cheetah (William Fulton) [Java] For consistency the global variable getters and setters use the JavaBean property design pattern like member variables always have. This means if you are wrapping a variable called foo, the getter is called getFoo() and the setter is called setFoo(). Before the recent changes to the Java module the getters and setters were called get_foo() and set_foo(). If you really want the original function names use the %rename directive like this: %rename(_foo) Foo; 07/31/2002: beazley Fixed casting problem with multiple inheritance. If you had this, class foo {}; class bar : public foo {}; class baz : public foo {}; class spam : public bar, public baz {}; then the wrappers wouldn't compile due to an ambiguous cast. Reported by Art Yerkes. 07/30/2002: cheetah (William Fulton) [Java] Due to new static typechecking all pointers held in a Java long are part of the internal workings and this pointer value in the Java long has become abstracted data. The type wrapper constructor and getCPtr() methods are as such protected. If you need to mess around with pointers from Java or for example create a proxy class or type wrapper class around a null pointer, add a function/constructor to do so with the %javacode typemap. You can also make getCPtr() public again with the %javagetcptr typemap. 07/30/2002: cheetah (William Fulton) [Java] Fixes for %typemap(ignore). In particular when ignoring the last parameter in a function. Also for all parameters in constructors. These mods have also fixed multi-argument typemaps for proxy classes - SF 581791. 07/30/2002: cheetah (William Fulton) [Java] %newobject (replacement for %new) now implemented for Java. 07/29/2002: beazley Fixed problem with typemap copies, %apply, and %clear inside C++ namespaces. 07/28/2002: cheetah (William Fulton) [Java] The JNI class now has package access as the class modifier has been changed from "public" to nothing. This has been done as this class is now more for the internal workings of SWIG since the module class has static type checking for all types. *** POTENTIAL INCOMPATIBILITY FOR JAVA MODULE *** Backwards compatibility can be achieved by using the %jniclassclassmodifier pragma to change it back to "public". 07/28/2002: cheetah (William Fulton) [Java] Proxy/Shadow classes are generated by default. The -proxy and -shadow command line options are deprecated. If you want to use the low-level functional interface then use the new -noproxy commandline option. *** POTENTIAL INCOMPATIBILITY FOR JAVA MODULE *** 07/28/2002: cheetah (William Fulton) [Java] Remaining pragmas shakeup. These were the remaining pragmas and their new names where changed: modulebase modulecode moduleclassmodifiers moduleimport => moduleimports moduleinterface => moduleinterfaces The moduleimports works slightly differently to how the moduleimport pragma worked. Now it actually takes code which gets placed before the class definition so the whole import statement has to be given, for example: %pragma(java) moduleimports=%{ import java.io.*; import java.math.*; %} The moduleinterfaces is slightly different to the old moduleinterface in that if more than one interface is required they must be comma separated in one use of the pragma, for example: %pragma(java) moduleinterfaces="Serializable, MyInterface" These last two pragmas are consistent with the javainterfaces and javaimports typemap. A similar set of pragmas has been introduced, namely: jniclassbase jniclasscode jniclassclassmodifiers jniclassimport jniclassinterface These work in the same way as their module counterparts. Note that previously the moduleXXX pragmas worked on the old module class which is now called the JNI class (the class with the native functions). The jniclassXXX pragmas now work on the new module class (the class that has all the global functions and global variable getters and setters when using proxy classes, plus all other remaining functions when using the low-level procedural interface). In summary the contents of the pragmas make up a class like this: class modulename extends implements { ... SWIG generated functions ... } } *** POTENTIAL INCOMPATIBILITY FOR JAVA MODULE *** 07/28/2002: cheetah (William Fulton) [Java] Deprecated modulemethodmodifiers pragma and replaced with a better %feature based directive called %javamethodmodifiers. A useful example would be for synchronisation in multi-threaded apps: %javamethodmodifiers foo(int a) "public synchronized"; Changes this function from the default ("public") to "public synchronized". *** POTENTIAL INCOMPATIBILITY FOR JAVA MODULE *** 07/26/2002: beazley Several directives now allow optional configuration parameters. These include: %module(name="value", name="value", ...) modulename %import(name="value", ...) "filename.i" %extend(name="value", ...) classname { ... } These currently have no effect and are reserved for future expansion. 07/26/2002: beazley Enhancements to smart-pointer handling. SWIG only provides extra support for a smart-pointer if operator->() returns a proper pointer. For example: Foo *operator->(); If operator->() returns an object by value or reference, then SWIG examines the returned object to see if it also implements operator->(). If so, SWIG chases operator->() until it can find one that returns a pointer. This allows cases like this to work: class Foo { public: void blah(); }; class Bar { ... Foo *operator->(); ... }; class Spam { ... Bar operator->(); ... }; For example: >>> s = Spam() >>> s.blah() # Invokes Foo::blah() The s.blah() call actually invokes: ((s.operator->()).operator->())->blah(); 07/26/2002: beazley Fixed a bug with typedef and references. For example: typedef Foo & FooRef; FooRef blah(); Previous versions of SWIG generated code that wouldn't compile. 07/25/2002: beazley Wrapping of static methods has been improved in proxy classes. In older versions of SWIG, if you had this: class Foo { public: static void bar(); }; The static method was only available as a function Foo_bar(). For example: >>> Foo_bar() Now, the static method can also be invoked through an instance like this: >>> f = Foo() >>> f.bar() # Invokes static method This works with all versions of Python. Additionally, for Python-2.2, the static method can be invoked as: >>> Foo.bar() The old-style function is still support for backwards compatibility. If you care about making your code across different versions of Python, either use Foo_bar() or access the method through an instance. 07/25/2002: beazley Changes to the Python module. Proxy classes now utilize new Python-2.2 features including properties and static methods. However, these features are supported in a way that provides backwards compatibility with older Python versions. In other words, proxy classes work with all versions of Python and only use new features when running on Python-2.2. 07/25/2002: beazley Modified %extend so that overloaded methods can be added. For example: %extend Foo { void bar(int x) { }; void bar(char *s) { }; ... } This works with both C++ *and* C. 07/24/2002: cheetah (William Fulton) [Java] More new typemaps so that the Java proxy classes and type wrapper classes can be further tailored by users. These are the default code for generating the finalize() methods (proxy classes only) and the getCPtr() methods for proxy classes and type wrapper classes: %typemap(javafinalize) SWIGTYPE %{ protected void finalize() { _delete(); } %} %typemap(javagetcptr) SWIGTYPE, SWIGTYPE *, SWIGTYPE &, SWIGTYPE [] %{ public static long getCPtr($javaclassname obj) { return obj.swigCPtr; } %} The javagetcptr typemap will enable users to handle Java null by overriding this typemap - a requested feature. The -nofinalize commandline option has been deprecated. The javafinalize typemap is more powerful as it will allow the removal of the finalize methods for all or any one or more particular proxy class. 07/23/2002: cheetah (William Fulton) [Java] The getCPtrXXX() function has been changed to a static function and is now of the form: protected static long getCPtr(XXX obj) {...} This is a requested change which will allow Java null pointers to be used as null can be passed in for obj. However, to achieve this the appropriate code must be written using the new javagetcptr typemap directive. *** POTENTIAL INCOMPATIBILITY FOR JAVA MODULE *** Backwards compatibility can be achieved by adding this function back in using the new javacode typemap: %typemap(javacode) SWIGTYPE %{ // SWIG-1.3.12 and SWIG-1.3.13 public long getCPtr$javaclassname() { return swigCPtr; } // SWIG-1.3.11 and earlier public long getCPtr() { return swigCPtr; } %} 07/23/2002: cheetah (William Fulton) [Java] New directive to control constant code generation - %javaconst. The default handling for handling constants is to get the value through a JNI call, eg #define YELLOW 5 #define BIG 1234LL results in: public final static int YELLOW = modulename.get_YELLOW(); public final static long BIG = modulename.get_BIG(); Earlier versions of the Java module initialised the value using the C value: public final static int YELLOW = 5; public final static long BIG = 1234LL; This works in most cases, but the value for BIG won't compile as 1234LL is not valid Java code and this is one of the reasons why the default is now to get the values through a JNI call. The side effect is that these 'constants' cannot be used in switch statements. The %javaconst directive allows one to specify the way the constant value is initialised and works like other %feature directives, eg %javaconst(0); // all constants from this point on are initialised using the C value %javaconst(1) BIG; // just BIG initialised using JNI call (must be parsed before BIG is defined) 07/23/2002: beazley *** IMPORTANT CHANGES TO THE PYTHON MODULE *** (1) The Python module now enables shadow/proxy classes by default. This means that two files are always created by SWIG. For instance, if you have this: // file: foo.i %module foo ... Then swig generates two files "foo_wrap.c" and "foo.py". (2) The name of the low-level C extension module has been changed to start with a leading underscore. This means that you have to compile the module as follows: $ cc -c -I/usr/local/include/python2.2 foo_wrap.c $ cc -shared foo_wrap.o $(OBJS) -o _foo.so ^^^^ note extra underscore This naming scheme is consistent with other Python modules that utilize extension code. For instance, the socket module consists of "_socket.so" and "socket.py". In previous versions of SWIG, the shared object file was named "foocmodule.so". (3) A new directive can be used to insert Python code into the corresponding .py file. For example: %pythoncode %{ def foo(): print "Hello World" %} This directive allows you to create modules as a mix of C and Python. Python code is seamlessly added to the module. (4) The -shadow command line option is deprecated. This is turned on by default. (5) To disable the generation of the extra python file, use the "-noproxy" command line option. *** POTENTIAL INCOMPATIBILITY *** This change will likely break the build environment of projects that utilize shadow classes. To fix this, you probably only need to change the name of the target .so file. For example, if you have Makefile information like this: TARGET = examplecmodule.so Just change it to: TARGET = _example.so *** DOCUMENTATION UPDATE *** The file Doc/Manual/Python.html has been updated to describe these changes. 07/23/2002: beazley Added -noextern option. If supplied, SWIG will not generate extra extern declarations. This is sometimes an issue on non-unix platforms. 07/23/2002: beazley Added a warning for ignored friend functions. 07/23/2002: beazley Fixed [ 574498 ] -proxy and %include "pointer.i" clash. Reported by David Creasy. 07/23/2002: beazley Fixed [ 576103 ] global destruction warning with shadow. Perl extensions should no longer report the warning "Use of uninitialized value during global destruction." when running with "perl -w". Reported by Brett Williams. 07/23/2002: beazley In C++ mode, SWIG now always defines namespace std. By default, it's empty. However, this will silence errors from programs that include statements such as "using namespace std;". This fixes Bug [ 584017 ] using namespace std generates error. Reported by Joseph Winston. 07/22/2002: beazley Added a new warning message for %apply. If you use %apply but no typemaps are defined, you will get a warning message. This should help with problems like this: %apply char *OUTPUT { ... }; In old versions of SWIG, this silently did nothing. Now you get an error like this: file:line. Warning. Can't apply (char *OUTPUT). No typemaps are defined. 07/22/2002: cheetah (William Fulton) [Java] Started Java pragma deprecation. Replacements use %typemap based directives and enable proxy classes and the new type wrapper classes to be tailored in various ways. These are the new typemaps: %typemap(javabase) - base (extends) for Java class %typemap(javaclassmodifiers) - class modifiers for the Java class: default is "public" %typemap(javacode) - java code is copied verbatim to the Java class %typemap(javaimports) - import statements for Java class %typemap(javainterfaces) - interfaces (extends) for Java class And these are the %pragma directives being deprecated: allshadowbase allshadowclassmodifiers allshadowcode allshadowimport allshadowinterface shadowbase shadowclassmodifiers shadowcode shadowimport shadowinterface Note that it is possible to target a particular proxy class: %typemap(javaimports) Foo "import java.util.*"; or a particular type wrapper class: %typemap(javaimports) double* "import java.math.*"; Note that $javaclassname in these typemaps are substituted with either the proxy classname when using proxy classes or the SWIGTYPE class name. 07/18/2002: cheetah (William Fulton) [Java] Java module overhaul to implement static type checking of all types. 1) Changes when using Java Proxy classes ---------------------------------------- Previously when wrapping global functions: class SomeClass{}; void foo(SomeClass* s); SomeClass* bar(); The native method prototypes used a long for pointers and looked like this: public class modulename { ... public final static native void foo(long jarg1); public final static native long bar(); } and unlike member functions of a C++ class there was no wrapper around the native calls to make the use of them more user friendly. They would be used from Java like this: SomeClass s = new SomeClass(modulename.bar(), false); modulename.foo(s.getCPtrSomeClass()); Note that the following will have the same effect, but then it would not have been possible to call any proxy member functions in SomeClass: long s = modulename.bar(); modulename.foo(s); Now wrapper functions are generated: public class modulename { public static void foo(SomeClass s) { // calls the native function } public static SomeClass bar() { // calls the native function } } Which means these functions can now be used more naturally with proxy classes: SomeClass s = modulename.bar(); modulename.foo(s); 2) Changes when not using Java Proxy classes -------------------------------------------- The so called low-level interface was rather low-level indeed. The new static type checking implementation makes it less so but it remains a functional interface to the C/C++ world. Proxy classes are the obvious way to use SWIG generated code, but for those who want a functional interface all non-primitive types now have a simple Java class wrapper around the C/C++ type. Pointers and references to primitive types are also wrapped by type wrapper classes. The type wrapper classnames are based on the SWIG descriptors used by the other language modules. For example: C/C++ type Java type wrapper class name ---------- ---------------------------- int* SWIGTYPE_p_int double** SWIGTYPE_p_p_double SomeClass* SWIGTYPE_p_SomeClass SomeClass& SWIGTYPE_p_SomeClass SomeClass SWIGTYPE_p_SomeClass Note that everything wrapped by SWIG is accessed via a pointer even when wrapping functions that pass by value or reference. So the previous example would now be used like this: SWIGTYPE_p_SomeClass s = example.bar(); example.foo(s); Note that typedefs that SWIG knows about are resolved, so that if one has class Foo{}; typedef Foo Bar; then any use of Bar will require one to use SWIGTYPE_p_Foo; Some considerations: Make sure you make a firm decision to use either proxy classes or the functional interface early on as the classnames are different. 3) Pointers and non-parsed types -------------------------------- Sometimes SWIG cannot generate a proxy class. This occurs when the definition of a type is not parsed by SWIG, but is then used as a variable or a parameter. For example, void foo(Snazzy sds); If SWIG has not parsed Snazzy it handles it simply as a pointer to a Snazzy. The Java module gives it a type wrapper class around the pointer and calls it SWIGTYPE_p_Snazzy. In other words it handles it in the same manner as types are handled in the low-level functional interface. This approach is used for all non-proxy classes, eg all pointer to pointers and pointers to primitive types. 4) Backwards compatibility ----------------------- Backwards compatibility is not an issue if you have been using proxy classes and no global variables/functions. Otherwise some changes will have to be made. The native methods still exist but they are now in a JNI class, which is called modulenameJNI. As this class is really part of the internal workings, it should not be required so the class has become protected. Some pragmas/directives will hopefully be added to help with backwards compatibility. *** POTENTIAL INCOMPATIBILITY FOR JAVA MODULE *** 07/18/2002: beazley Modified wrapping of uninstantiated templates returned by value. Just to be safe, they are now wrapped by SwigValueWrapper<> just in case they don't define a default constructor. This would be used if you had code like this Foo blah(); void moreblah(Foo x); but you didn't instantiate Foo using %template. We should probably add a warning for this. 07/17/2002: beazley Added an error check to detect shadowed template paramaters. For example: template class Foo { public: int T; }; This results in an error, not a warning. This warning is also needed to fix some rather insidious problems like this: struct T { int blah; }; template class Foo { public: typedef T Traits; // Which T is this???? }; In this case, the template parameter T shadows the outer structure (which is what you want). 07/16/2002: beazley Improved support for templates with integer arguments. SWIG is much more aware of situations such as this: const int Size = 100; %template(Foo100) Foo<100>; void bar(Foo *x); // Knows that Foo is the same as Foo<100>; 07/15/2002: beazley Fixed bug with %feature/%ignore/%rename and namespaces. For example: %ignore Foo::Bar namespace Foo { class Bar { ... }; } Reported by Marcelo Matus. 07/09/2002: beazley Added parsing support for constructors that try to catch exceptions in initializers. For example: class Foo { Bar b; public: Foo(int x) try : b(x) { ... } catch(int) { ... } } This has no effect on the generated wrappers. However, the try and catch parts of the declaration are ignored. See Stroustrup, 3rd Ed, section 14.4.6.1 for details. 07/06/2002: beazley Fixed bug in template symbol table management. This fixes two bugs. First, mixing abstract methods, templates, and inheritance no longer generates a failed assertion. template class A { public: virtual void foo() = 0; }; template class B : public A { }; %template(A_int) A; %template(B_int) B; This fix also fixes a subtle problem with default values and templates. For example: template struct B { typedef unsigned int size_type; static const size_type nindex = static_cast(-1); void foo(size_type index = nindex); }; Bugs reported by Marcelo Matus. 07/05/2002: ljohnson (Lyle Johnson) [Ruby] Changed the definition of the SWIG_ConvertPtr() function for the SWIG/Ruby runtime support so that it looks like the Python version. If the last argument (flags) is non-zero, SWIG_ConvertPtr() will raise an exception for type mismatches as before. If flags is zero, this function will return -1 for type mismatches without raising an exception. *** POTENTIAL INCOMPATIBILITY FOR RUBY MODULE *** 07/04/2002: beazley Overloaded functions/methods/constructors now work in many language modules. The support is completely transparent--just call the function normally and SWIG will dispatch to the correct implementation. There are a variety of issues associated with this. Please refer to the overloading section of Doc/Manual/SWIGPlus.html for details. *** NEW FEATURE *** 07/04/2002: beazley Fixed a bug with namespaces, enums, and templates. For example: namespace hello { enum Hello { Hi, Hola }; template struct traits { typedef double value_type; }; traits::value_type say_hi() { return traits::value_type(1); } } SWIG wasn't generating wrappers that properly qualified traits. Reported by Marcelo Matus. 06/30/2002: beazley Supplied array variable typemaps for Tcl module. If you have a variable like this: int foo[10]; then a set function like this is generated: void foo_set(int *x) { memmove(foo,x,10*sizeof(int)); } 06/30/2002: beazley New %fragment directive. When writing typemaps, it can be easy to get carried away and write a lot of code. However, doing so causes tremendous code bloat. A common way to solve this is to write helper functions. For example: %{ void some_helper_function() { ... } %} %typemap(in) type { some_helper_function(...); } The only problem with this is that the wrapper file gets polluted with helper functions even if they aren't used. To fix this, a new fragment directive is available. For example: (corrected typo in line below - 06/26/2008) %fragment("type_header","header") %{ void some_helper_function() { ... } %} %typemap(in, fragment="type_header") type { some_helper_function(...); } In this case, the code fragment is only emitted if the typemap is actually used. A similar capability is provided for declaration annotation and the %feature directive. For example: %feature("fragment","type_header") SomeDeclaration; The first argument to %fragment is the fragment name. The second argument is the file section where the fragment should be emitted. The primary use of this directive is for writers of language modules and advanced users wanting to streamline typemap code. *** EXPERIMENTAL NEW FEATURE *** 06/30/2002: beazley Supplied memberin typemaps for all arrays in an attempt to eliminate confusion about their use. 06/29/2002: beazley Experimental support for smart-pointers. When a class defines operator->() like this class Foo { ... Bar *operator->(); ... }; SWIG locates class Bar and tries to wrap its member variables and methods as part of Foo. For example, if Bar was defined like this: class Bar { public: int x; int spam(); }; You could do this (in the target language): f = Foo() f.x = 4 # Accesses Bar::x f.spam() # Accesses Bar::spam The primary use of this feature is to emulate the behavior of C++ smart-pointers---which allow attributes to accessed transparently through operator->. This feature is supported automatically in SWIG---no special directives are needed. To disable this behavior. Use %ignore to ignore operator->. *** NEW FEATURE *** 06/26/2002: beazley Deprecated the %except directive. %exception should be used instead. 06/25/2002: beazley Major cleanup of the modules directory. Eliminated most header files, consolidated module code into single files. 06/24/2002: beazley Reworked the instantiation of language modules. All language modules must now define a factory function similar to this: extern "C" Language * swig_python(void) { return new PYTHON(); } This function is then placed in a table and associated with a command line option in swigmain.cxx. This approach has a number of benefits. It decouples the SWIG main program from having to know about the class definitions for each module. Also, by using a factory function, it will be easier to implement dynamic loading of modules (simply load the file and invoke the factory function). 06/24/2002: beazley Fixed syntax error for reference conversions. For example: operator Foo &(); 06/24/2002: beazley Fixed syntax error for operator new[] and operator delete[]. 06/24/2002: beazley Fixed code generation problem for constants and default arguments involving templates. 06/19/2002: ljohnson (Lyle Johnson) [Ruby] Fixed a bug for the '-feature' command line argument; that setting was effectively being ignored and so the feature name was always set equal to the module name. 06/17/2002: beazley Fixed problems with static members and enums in templates. Version 1.3.13 (June 17, 2002) ============================== 06/16/2002: beazley Fixed a bug with __FILE__ expansion in the preprocessor. On Windows, the backslash (\) is now converted to (\\) in the string literal used for __FILE__. Reported by Steve Glaser. 06/14/2002: beazley Fixed warning message about 'name private in this context'. The warning is only generated for public methods. Reported by Scott Michel. 06/14/2002: beazley Fixed some problems related to template instantiation and namespaces. When SWIG expands a template, it does so with fully resolved types. For example, if you have this: template class foo { }; typedef double Double; %template(foo_d) foo; then, it is handled as foo in the typesystem. This fixes a number of subtle problems with inheritance and templates. 06/14/2002: ljohnson (Lyle Johnson) [Ruby] Added missing bool typemaps for INPUT, OUTPUT and INOUT in Lib/ruby/typemaps.i. 05/29/2002: cheetah (William Fulton) [Java] Fix for a couple of broken pragmas. 05/29/2002: cheetah (William Fulton) Fix for unnecessary cast when wrapping global variable where the type is not parsed by SWIG - Java variables example failure as reported by Larry Virden. 06/10/2002: beazley Modified %template to allow for empty instantiations. %template() foo; This registers foo with the type system, but doesn't wrap it (same as %ignore). This may only be a temporary measure. SWIG might be able to automatically instantiate templates in certain cases. 06/10/2002: beazley Fixed function prototype problems with Tcl 8.4 06/09/2002: beazley Fixed problem with templates and location of base classes. This one is a little mind-bending, but here is an example that illustrates: template struct traits { typedef ArgType arg_type; typedef ResType res_type; }; template struct Function { }; template struct Class : Function::arg_type, typename traits::res_type> { }; %template(traits_dd) traits ; %template(Function_dd) Function ; %template(Class_dd) Class ; In this example, the base class of 'Class' is determined from the Function template, but the types are obtained through typedefs. Because of this, SWIG could not locate the wrapped base class (Function). Should be fixed in 1.3.13 even though I can think of a million other things that might also be broken. 06/07/2002: beazley Fixed a problem with conversion operators. If you had an operator like this, operator double() const; SWIG was ommitting the "const" qualifier. This affected %rename and other directives. Reported by Zhong Ren. 06/07/2002: beazley Lessened the strictness of abstract class checking. If you have code like this: class Foo { public: virtual int method() = 0; }; class Bar : public Foo { public: Bar(); ~Bar(); }; SWIG will go ahead and generate constructor/destructors for Bar. However, it will also generate a warning message that "Bar" might be abstract (since method() isn't defined). In SWIG-1.3.12, SWIG refused to generate a constructor at all. 06/07/2002: beazley Change to %template directive. If you specify something like this: %template(vi) std::vector; It is *exactly* the same as this: namespace std { %template(vi) vector; } SWIG-1.3.12 tried to instantiate the template outside of the namespace using some trick. However, this was extremely problematic and full holes. This version is safer. 06/07/2002: beazley Fixed bug with scope qualification and templates. For example: A::DD Before, this was separated as scopes A, and DD. Fixed now. 06/06/2002: beazley Allow the following syntax: class A { }; struct B : A { ... }; A base class without a specifier is assumed to be public for a struct. 06/06/2002: beazley Fixed syntax error with template constructor initializers. Reported by Marcelo Matus. 06/06/2002: beazley Fixed bug with default template arguments. Reported by Marcelo Matus. 06/05/2002: beazley Fixed subtle problems with %rename directive and template expansion. Code like this should now work: %rename(blah) foo::method; ... template class foo { public: void method(); }; %template(whatever) foo; 06/05/2002: beazley Resolved some tricky issues of multi-pass compilation and and inheritance. The following situation now generates an error: class Foo : public Bar { ... }; class Bar { ... }; The following code generates a warning about incomplete classes. class Bar; class Foo : public Bar { }; The following code generates a warning about an undefined class. class Foo : public Bar { }; // Bar undefined This fixes a failed assertion bug reported by Jason Stewart. 06/05/2002: ljohnson [Ruby] Added a warning message for the Ruby module about the lack of support for multiple inheritance. Only the first base class listed is used and the others are ignored. (Reported by Craig Files). 06/03/2002: beazley Fixed a bug with struct declarations and typedef. For example: typedef struct Foo Foo; struct Foo { ... }; A few other subtle struct related typing problems were also resolved. Version 1.3.12 (June 2, 2002) ============================= 05/30/2002: beazley Fixed problem related to forward template class declarations and namespaces. Bug reported by Marcelo Matus. 05/30/2002: beazley Added 'make uninstall' target. Contributed by Joel Reed. 05/29/2002: beazley Fixed rather insidious bug with %rename, %feature and template specialization. For example: %exception vector::__getitem__ { ... some exception ... } template class vector { ... T __getitem__(int index); // Fine ... }; template<> class vector { ... T __getitem__(int index); // Oops. ... }; Now, the %exception directive (and other features) should correctly apply to both vector and specializations. 05/29/2002: beazley Subtle changes to %template() directive. Template arguments are now reduced to primitive types in template matching. For example: template class vector { ... partial specialization ... } typedef int *IntPtr; // Gross typedef // Gets the above partial specialization %template(vectorIntPtr) vector; This change is extremely subtle, but it fixes a number of potential holes in Luigi's STL library modules. For example: typedef int Integer; %template(vectori) vector; 05/29/2002: beazley Fixed rather insidious typemap bug related to const. const was being discarded through typedefs. 05/29/2002: ljohnson (Lyle Johnson) [Ruby] Added input typemaps for const references to primitive types (in Lib/ruby/ruby.swg). 05/29/2002: cheetah (William Fulton) [Java] The java arrray support functions are enclosed by a SWIG_NOARRAYS #define. Useful if not using arrays and it is desirable to minimise the amount of compiled code. 05/29/2002: cheetah (William Fulton) [Java] Enums were not renamed when using %name or %rename fix. 05/28/2002: ljohnson [Ruby] Modified the name of the wrapper functions for the "new" singleton method and "initialize" instance method for consistency with the other language modules. The wrapper name for the function that implements "new" is alloc_classname and the wrapper name for the function that implements "initialize" is new_classname. 05/27/2002: beazley Changes to runtime. Pointer conversion/creation functions now almost always have an extra "flags" argument. For example: SWIG_ConvertPtr(obj, void **, swig_type_info *ty, int flags); ^^^^^^^^^^ This extra parameter is reserved for future expansion and will be used for more control over pointers in future versions. 05/27/2002: beazley Fix for C++ classes with private assignment operators. It is now possible to safely return objects like this by value. Caveat: the class must provide a copy constructor. 05/26/2002: beazley -proxy option added to many language modules. This is the same as -shadow. We are merely changing terminology. 05/26/2002: beazley [perl] Fixed some inconsistencies in the -package option. -package merely sets the package name to be used on the wrappers. It does not change the name of the shared library file or the name of the generated .pm file. This was broken at some point, but works again now. 05/25/2002: beazley [perl] Fixed [ 475452 ] memory leak in return-by-value. Problem related to static member variables returning newly allocated objects. Reported by Roy Lecates. 05/25/2002: beazley [perl] Fixed [ 513134 ] %BLESSEDMEMBERS isn't always right. Reported by Fleur Diana Dragan. 05/25/2002: beazley Fixed [ 540735 ] -importall and the -I option. 05/25/2002: beazley [guile] Fixed [ 532723 ] Default arg for char* can SegV. Error in guile module. Reported by Brett Williams. 05/25/2002: beazley Subtle change to typemap application code. The "freearg" typemap must exactly match up with the "in" or "ignore" typemap. For example: %typemap(in) (char *data, int len) { ... }; %typemap(freearg) char *data { ... }; void foo(char *data, int len); In this case, the "in" typemap is applied, but the freearg typemap is not. This is because the freearg typemap doesn't match up with the input argument sequence. 05/25/2002: beazley Fixed [ 548272 ] Default argument code missing braces. Reported by Brett Williams. 05/25/2002: beazley Fixed [ 547730 ] SwigValueWrapper needed for constructors. Reported by William Fulton. 05/25/2002: beazley Undefined identifiers now evaluate to 0 when evaluating preprocessor expressions. For example: #if !FOO ... #endif where FOO is undefined or set to some non-numeric value. Fixes [ 540868 ] #if defined whatever - not parsed. Reported by Adam Hupp. 05/24/2002: beazley SWIG now ignores the C++ 'export' keyword. 05/23/2002: beazley Some refinement of type-name mangling to account for pointers, arrays, references, and other embedded type constructs. 05/23/2002: beazley Initial attempt at supporting template partial specialization. At the very least, it is parsed and the classes are stored. Matching of instantiations to specialized version is more limited and based on the SWIG default typemap rules: SWIGTYPE * SWIGTYPE [] SWIGTYPE & Now, why in the world would you want to use this feature? Other than allowing for slightly modified class APIs, this capability is primarily used to provide advanced wrapping support for STL-like objects. It can also be mixed with typemaps. Here is an example: /* Generic version */ template class vector { %typemap(in) vector * { // A container of objects } }; /* Partial specialization (pointers) */ template class vector { %typemap(in) vector * { // A container of pointers to objects. } }; /* Specialization (integers). */ template<> class vector { %typemap(in) vector * { // A container of integers. } }; *** EXPERIMENTAL FEATURE *** 05/23/2002: beazley Enhancement to typemaps. Normally, typemap variables are renamed to avoid conflicts. For example: %typemap(in) int * (int temp) { $1 = &temp; } This results in code that creates and uses variables "temp1","temp2", "temp3" and so forth depending on how many times the typemap is used. Sometimes you want a single variable instead. To do that, using the following naming scheme: %typemap(in) int *(int _global_temp) { } Is this case, a single variable _global_temp is emitted in the wrapper functions. It is shared across all typemaps. Repeated typemaps do not replicate the variable---they use the first one emitted. *** NEW FEATURE *** 05/23/2002: beazley Minor enhancement to typemaps. If you have this code, %typemap(in) Foo (int somevar = 3) { ... } the default value for somevar is now emitted into the wrapper code. 05/22/2002: beazley Fixed %extend to be better behaved in namespaces. If you have code like this: namespace foo { struct bar { %extend { void blah(); }; }; } SWIG matches the blah() method to a C function named void foo_bar_blah(foo::bar *self). This is consistent with the non-namespace version. Bug reported by Marcelo Matus. 05/22/2002: beazley New library files: cpointer.i, carrays.i, cmalloc.i. These provide access to C pointers and memory allocation functions. See Doc/Manual/Library.html for details. 05/22/2002: cheetah (William Fulton) [Java] C type char no longer maps to Java type byte, but to Java type char. It is now treated as a character rather than a signed number. This fits in with the other language modules and is a more natural mapping as char* is mapped as a string of characters. Note that the C signed char type is still mapped to a Java byte. *** POTENTIAL INCOMPATIBILITY FOR JAVA MODULE *** 05/22/2002: cheetah (William Fulton) [Java] Improved constants wrapping. Constants (#define and %constant) values are now obtained through a JNI call. Previously the value was compiled as Java code, but this didn't work for all cases, eg #define 123ULL. 05/22/2002: beazley Fixed bogus error message with %extend directive and C++ access specifiers. Reported by Marcelo Matus. 05/22/2002: beazley Namespaces and enums now work correctly. For example: namespace Foo { enum Bar { A, B }; } Bug reported by Marcelo Matus. 05/21/2002: beazley The %types directive can now be used to specify inheritance relationships in the runtime type system. For example, %types(Foo = Bar); specifies that Foo isa Bar. Using this is potentially quite dangerous. However, this is useful in certain cases (and in the SWIG library). 05/20/2002: beazley %nodefault and %makedefault directives now require a trailing semicolon. For example: %nodefault; ... %makedefault; In addition both directives can take a class name. For example: %nodefault Foo; class Foo { /* No default constructor/destructor */ }; class Bar { /* Default constructor/destructor generated */ }; *** POTENTIAL INCOMPATIBILITY *** If you don't use the trailing semicolon, things will mysteriously break. 05/20/2002: beazley More improvements to type system handling. SWIG now correctly handles template names and parameters in a namespace. For example: namespace foo { template class bar { }; typedef int Integer; void blah(bar *x); }; In the generated code, all of the typenames are properly qualified. 05/17/2002: cheetah (William Fulton) [Java] deprecated broken -jnic and -jnicpp commandline options. The C or C++ JNI calling convention is now determined from the -c++ commandline option. 05/16/2002: cheetah (William Fulton) [Java] The JCALL macros which exist so that the same typemaps can be used for generating both the C and C++ JNI calling conventions no longer appear in the generated code. This is because the output is now passed through the SWIG preprocessor which does the macro expansion for either C or C++ (depending on whether -c++ is passed on the SWIG commandline). The generation of the functions used in the array typemaps have been adjusted to take account of this. The side effect is that any typemaps which contained JCALL macros within %{ %} brackets will have to be moved within {} brackets so that the SWIG preprocessor can expand the macros. *** POTENTIAL INCOMPATIBILITY FOR JAVA MODULE *** 05/13/2002: beazley Class templates may now be used as template parameters. For example: template class C> class Foo { ... }; template class Bar { ... }; %template(Fooi) Foo; SWIG doesn't really do anything special with this---it's just another way of specifying a template parameter. 05/13/2002: beazley Minor refinement of template support. Template parameter names are no longer required for types. For example: template class Foo { }; Obviously, names are required for template; 05/12/2002: beazley New macro expansion in typemaps. The sequence: $descriptor(type) Will expand into the SWIG type descriptor structor for the given type. Type may be any abstract datatype. For example: $descriptor(int *) $descriptor(int (*)(int,double)) $descriptor(vector *) Caveat: It is *NOT* currently legal to use other typemap substitution variables in the macro. For example $descriptor($1_type). The primary purpose of this modification is to better support typemaps for container objects or to allow typemaps that might be performing type conversions. *** NEW FEATURE *** 05/11/2002: beazley The wrapping of references to primitive types has been changed as follows: Arguments of type 'const primitive &' are now passed by value as opposed to pointers. Return values of type 'const primitive &' are returned as values instead of pointers. 'primitive' is any one of int, short, long, long long, char, float, double, bool (as well as unsigned variants). This change is being made to better support C++ wrapping--especially code that makes use of templates and the STL. 05/11/2002: beazley The %template directive can now be used to access templates in a namespace. For example: namespace std { template class complex { T re, im; public: complex(T _r = T(), T _i = T()) : re(_r), im(_i) { } T real() { return re; } T imag() { return im; } }; } %template(complex) std::complex; Note: There are some very subtle namespace/symbol table management issues involved in the implementation of this. It may not work in certain cases. 05/10/2002: beazley Member template constructor support added. For example: template struct pair { _T1 first; _T2 second; pair() : first(_T1()), second(_T2()) { } template pair(const pair<_U1,_U2> &x); }; To instantiate the template, use %template and %extend. For example, this expands the constructor into a default copy constructor: %extend pair { %template(pair) pair<_T1,_T2>; } Highly experimental. Other uses may be broken. 05/10/2002: beazley The %extend (%addmethods) directive no longer works unless it appears in the public section of a class. An error message is now generated (as opposed to a segmentation fault). 05/09/2002: beazley New %warnfilter() directive. This directive attaches a warning filter to specific declarations and has the same semantics as %rename, %ignore, %feature, and so forth. For example: %warnfilter(501) foo; // Suppress overloaded warning int foo(int); int foo(double); or %warnfilter(501) Object::foo(double); class Object { public: int foo(int); int foo(double); }; This feature only suppresses warnings in later stages of code generation. It does not suppress warnings related to preprocessing or parsing. *** NEW FEATURE *** 05/09/2002: beazley SWIG now supports C99 variadic preprocessor macros. For example: #define debugf(fmt,...) fprintf(stderr,fmt,__VA_ARGS__) The argument "..." is used to indicate variable arguments which are all placed into the special argument name __VA_ARGS__ in the macro expansion. SWIG also implements the GNU (##) extension for swallowing the preceding comma when __VA_ARGS__ is empty. For example: #define debugf(fmt,...) fprintf(stderr,fmt, ##__VA_ARGS__) Here is how this is expanded: debugf("%d", 3) --> fprintf(stderr,"%d",3) debugf("Hello") --> fprintf(stderr,"Hello" ) (notice the deleted comma). *** NEW FEATURE *** 05/08/2002: samjam (Sam Liddicott) Many changes to php module. Shadow classes are now implemented entirely in native C and no need for php-code shadow wrappers Populated template config.m4 and Makefile.in as needed by phpize are generated. 05/08/2002: ljohnson (Lyle Johnson) [Ruby] A copy constructor is now turned into a "clone" instance method (see Dave's change for copy constructors dated 4/7/2002). This seems like the appropriate thing to do for Ruby code. 05/08/2002: ljohnson (Lyle Johnson) [Ruby] Fixed [ 553864 ] Inline destructor code not written. 05/08/2002: beazley %ignore behaves better with constructors, destructors, and the type system in general. For constructors and destructors, %ignore now suppresses the creation of a default constructor or destructor. For example: %ignore ~Foo; class Foo { public: Foo(); ~Foo(); ... }; In SWIG-1.3.11, ~Foo() simply "disappeared" and the code generator created a wrapper for a default destructor (as if it was never declared in the interface). In SWIG-1.3.12, %ignore suppresses the creation of a destructor if one is actually defined. Similarly, even though a declaration is ignored, information may still be needed to properly handle types. For example, here is a very subtle error that is fixed by this change: %ignore std::string; // Prevent class wrapping namespace std { class string { ... }; %typemap(in) string * { ... } } void foo(std::string *s); // Broken. Before this fix, %ignore would cause the class definition to disappear. This, in turn, would cause the typemap to be misapplied. 05/08/2002: beazley Minor changes to %rename, %ignore, %feature, and related directives for better support of destructors. Destructors can now be precisely tagged. For example: %ignore Foo::~Foo; %feature("action") ~Bar { ... } *Developer warning* Operations such as renaming and feature attachment for classes used to be applied to destructors as well. For instance, if you did this: %rename(Bar) Foo; The operation applied to the class itself, the constructor, and the destructor. This is no longer the case. Now such operations will only apply to the class and the constructor. Note: if you were relying on this for class renaming, be aware that renamed classes should really only be handled at the level of the class itself and not the level of individual declarations in the class (although they can be renamed individually if needed). As far as I know, the Language class is already taking care of this case correctly. 05/07/2002: beazley New set of tests. The Examples/test-suite/errors directory contains tests that try to exercise all of SWIG's error and warning messages. 05/07/2002: beazley Start of a warning framework. Warning messages are now assigned numeric values that are shown in warning messages. These can be suppressed using the -w option. For example: swig -w302 example.i swig -w302,305 example.i Alternatively, the #pragma preprocessor directive can be used to disable this: #pragma SWIG nowarn=302 #pragma SWIG nowarn=302,305 Note: Since SWIG is a multi-pass compiler, this pragma should only be used to change global settings of the warning filter. It should not be used to selectively enable/disable warnings in an interface file. The handling of #pragma occurs in the C++ preprocoessor and affects all subsequent stages of compilation. The -Wall option turns on all warnings and overrides any filters that might have been set. Warnings can be issued from an interface using %warn. For example: %warn "110:%section is deprecated" The first part of a warning message is an optional warning number. A complete set of warning numbers is found in Source/Include/swigwarn.h. *** NEW FEATURE *** 05/07/2002: beazley Internal parsing change. Directives to include files now use brackets [ ... ] instead of { ... }. %includefile "foo.i" [ ... ] The use of { ... } was a bad choice because they were included implicitly by the preprocessor and made it impossible to properly detect legitimate missing '}' errors. 04/16/2002- 05/02/2002: beazley SWIG European Tour: Paris-Amsterdam-Bath. 04/23/2002: beazley The %addmethods directive has been renamed to %extend. For example: class Foo { ... }; %extend Foo { int blah() { ... }; int bar() { ... }; ... }; Motivation: the %addmethods directive can be used for many other tasks including adding synthesized attributes, constructors, and typemaps. Because of this, "addmethods" is somewhat misleading. %extend more precisely describes this operation---extension of a class or structure. *** POTENTIAL INCOMPATIBILITY *** %addmethods still works via a macro definition. However, a warning message may be generated. Errors involving %addmethods will actually refer to the %extend directive. 04/23/2002: beazley Further refinement of the type system. Typedef now propagates through functions, pointers to functions, and pointers to member functions. For example: typedef int Integer; void foo(int (*x)(int), Integer (*y)(Integer)); In this case, arguments 'x' and 'y' have exactly the same type (and would obviously accept objects of either type). Similarly, consider this: class Foo { }; typedef Foo Bar; void bar(int (Foo::*x)(int), int (Bar::*y)(int)); In this case, arguments x and y are the same type (via typedef). 04/22/2002: beazley SWIG now generates a warning message if any part of an expression involves values from a private part of a class. For example: class Foo { private: static int X; public: void blah(int a, int b = X); // Warning }; In this case, the default argument is ignored. There are workarounds, but they are rather clumsy. For instance, you might do this: %feature("action") blah(int,int) { if ($nargs == 1) { result = blah(arg1); } else { result = blah(arg1,arg2); } } void blah(int a, int b = 0); 04/21/2002: beazley Use of the %inline directive inside a namespace is forbidden and now generates an error message. This is not allowed since the inlined code that is emitted is not placed inside a namespace. This confuses other stages of parsing. 04/21/2002: beazley Some bug fixes to casting operations and expression parsing. Due to some parsing issues, it is not currently possible to use casts for all possible datatypes. However, the common cases work. 04/20/2002: beazley (Amsterdam) Member templates now work. Simply use the %template directive inside a class or %addmethods to create instantiations (see Doc/Manual/SWIGPlus.html). Supporting this was easy---earlier changes to templates made it possible using only a two-line modification to the parser and a few minor modifications elsewhere. Hmmm, come to think of it, the smoke was rather thick in that Internet "cafe". *** NEW FEATURE *** 04/19/2002: beazley (TGV) Improved handling of non-type template parameters. For example: vector; Simple numbers and strings can be used with the %template directive as well. For example: %template(vecint100) vector; Note: Arithmetic expressions are not currently allowed. Default template arguments now work and do not have to be given to %template. 04/18/2002: beazley (Paris) Change in internal template handling. Template parameters are now fully integrated into the type system and are aware of typedefs, etc. This builds upon the change below. *** DEVELOPER WARNING *** Word of caution to language module writers. The "name" parameter of certain parse tree nodes (classes, functions, etc.) may be parameterized with types. This parameterization is done using SWIG type-strings and not the underlying C version. For example, int max(int *,int *) has a name of "max<(p.int)>". If you use the name directly, you may get syntax errors in the generated code. To fix this, use SwigType_namestr(name) to convert a parameterized name to a C name with valid syntax. The internal version is used to reduce template types to a common representation and to handle issues of typedef. 04/16/2002: beazley (somewhere over the Atlantic) Enhancement of typedef resolution. The type system is now aware of template arguments and typedef. For example: typedef int Integer; foo(vector *x, vector *y); In this case, vector and vector are the same type. There is some interaction between this mechanism and the implementation of typemaps. For example, a typemap defined for vector * would apply to either type. However, a typemap for vector * would only apply to that type. Typedefs and typemaps and matched by left-most expansion. For example: vector --> vector --> vector 04/24/2002: cheetah (William Fulton) [Java] Changes to Java shadow classes. Overcomes a bug where the module assumed that a pointer to a derived class could be used in place of a pointer to a base class. Thanks to Stephen McCaul for analysing the bug and submitting patches. A consequence is that the getCPtr() method in each shadow class has disappeared and has been replaced with a getCPtrXXX(), where XXX is the shadow class name. If you have code that previously used getCPtr(), and the associated class is wrapping a C struct or a C++ class that is not involved in an inheritance chain, just use the new method. If however, the class is involved in an inheritance chain, you'll have to choose which pointer you really want. Backwards compatibility has been broken as not using the correct pointer can lead to weird bugs through ill-defined behaviour. If you are sure you want the old methods, you could add them back into all shadow classes by adding this at the beginning of your interface file: %pragma(java) allshadowcode=%{ public long getCPtr(){ return swigCPtr; } %} Please see entry dated 07/23/2002 to see how to do this after the deprecation of the allshadowcode pragma. *** POTENTIAL INCOMPATIBILITY FOR JAVA MODULE *** 04/13/2002: beazley Fixed problem with default arguments and references. Declarations such as this should now work: void foo(const string &x = "Hello"); 04/12/2002: beazley Added typemap $* substitutions for typemaps involving arrays. Requested by William Fulton. 04/11/2002: beazley Template specialization is now supported. For example: template<> class vector { ... }; When the %template directive is used, it will use a specialization if one is defined. There are still some limitations. Partial specialization is not supported. A template of type does not match all pointers. *** NEW FEATURE *** 04/11/2002: beazley Major change to template wrapping internals. Template declarations are no longer processed as macros but now result in real parse-tree nodes. The %template directive expands these nodes into a specific instantiation. This change enables a number of new and interesting capabilities: Directives such as %rename, %feature, and %addmethods can now be applied to uninstantiated templates. For example: %rename(barsize) vector::bar(char *buf, int len); ... template class vector { public: ... void bar(char *buf); void bar(char *buf, int len); // Renamed ... }; %template(intvector) vector; // Renaming carries through By parsing templates into an internal data structure, it will be possible to support specialization (and maybe partial specialization). This is highly experimental and a work in progress. *** POTENTIAL INCOMPATIBILITY *** In SWIG-1.3.11, template declarations were simply processed as weird macros. No other information was retained. This made it impossible to support more advanced features and complicated many other parts of the implementation. 04/09/2002: beazley Change to template class wrapping. There were a variety of "issues" with the old approach related to parsing, the type system, and namespaces. These changes are meant to rectify some of these problems: A specific instantiation of a template can now be specified by including the class inline like this: class vector { public: vector(); ~vector(); ... whatever ... }; This is template specialization, but partial specialization is not yet implemented. The %template directive has been modified to expand roughly as follows: %template(vecint) vector; becomes %rename(vecint> vector; class vector { public: vector(); ... }; Note that this simply builds upon the code above (templates included inline). This modified approach to wrapping fixes some subtle type issues. For instance, you can now define typemaps and typedefs like this: %typemap(in) vector * { ... } typedef vector intvector; ... void blah(intvector *v); // Gets the above typemap This did not work in SWIG-1.3.11 due to a peculiarity of the template implementation. %template(name) no longer installs the template as a class with name "name". This might break %addmethods as described in the manual. For example: %template(vecint) vector; %addmethods vecint { // Fails. vecint not a class ... }; To fix this, just use the template name instead: %addmethods vector { ... } Note: This technique might be a way to implement some bizarre template specialization techniques. For example: %addmethods vector { // Only applied if vector instantiated later %typemap(in) vector * { ... } ... }; *** POTENTIAL INCOMPATIBILITY *** 04/08/2002: beazley Fixed [ 540868 ] #if defined whatever - not parsed. SWIG should now correctly handle preprocessor directives like this: #if defined __cplusplus ... #endif Note: was implemented previously, but there was a minor bug. Reported by Adam Hupp. 04/07/2002: beazley %readonly and %readwrite are deprecated due to a change in the implementation. Instead of being pragmas, mutability is now controlled as a "feature" using the following two directives: %immutable; int x; // read-only variable int y; // read-only variable %mutable; int z; // Modifiable %immutable and %mutable are much more powerful than their older counterparts. They can now pinpoint a specific declaration like this: %immutable x; /* Any x */ %immutable Foo::x; /* x in class Foo */ In fact, the matching algorithm is the same as for %rename, %ignore, and other directives. This means that the declaration %immutable Foo::x; would not only apply to class Foo but to all derived classes as well. *** POTENTIAL INCOMPATIBILITY *** %immutable and %mutable must be terminated by a semi-colon. This differs slightly from the older %readonly and %readwrite directives. Since %immutable and %mutable can be applied to declarations the semicolon is needed to distinguish between a global feature and one targeted to a single declaration. Note: this incompatibility is the primary reason for changing the name of the directive. 04/07/2002: beazley New handling of copy constructors. If a class defines constructors like this: class Foo { public: Foo(); Foo(const Foo &); // Copy constructor ... }; SWIG now generates a function copy_Foo() for the copy constructor. In previous verions, this generated a name-clash and an error message. To preserve backwards compatibility, SWIG does not change the behavior if %rename is used to resolve the name conflict. However, if no name resolution is made, this new approach is used. Copy constructors may be handled as a special case in the target language. However, this is up to the language module itself. 04/07/2002: beazley The %template directive is now namespace aware. This allows code like this: namespace foo { template max(T a, T b) { return a > b ? a : b; } } using namespace foo; %template(maxint) max; // Ok namespace bar { using foo::max; %template(maxdouble) max; // Ok } Caveat: the template name supplied to %template must be defined in the same scope in which the %template directive appears. This code is illegal: %template(maxint) foo::max; 04/07/2002: beazley Minor enhancement to preprocessor. The preprocessor can now perform string comparison. For example: #define A "hello" ... #if A == "hello" ... #endif The primary use of this is in SWIG macros. For example: %define FOO(x) #if #x == "int" /* Special handling for int */ ... #endif %enddef Normal users can probably safely ignore this feature. However, it may be used in parts of the SWIG library. 04/07/2002: beazley Further refinement of default constructor/destructor wrapper generation. SWIG is now much more aware of pure virtual methods. For instance: class A { /* Abstract */ public: virtual void method1() = 0; virtual void method2() = 0; }; class B : public A { /* Abstract */ public: virtual void method1() { }; }; class C : public B { /* Ok */ public: virtual void method2() { }; }; In this case, SWIG will only generate default constructors for C. Even though B looks fine, it's missing a required method and is abstract. 04/04/2002: beazley Subtle change to structure data member access. If you have a structure like this: struct Foo { Bar b; }; The accessor functions for b are generated as follows: (1) If b is *not* defined as a structure or class: Bar Foo_b_get(Foo *self) { return self->b; } void Foo_b_set(Foo *self, Bar value) { self->b = value; } (2) If b *is* defined as a structure or class: Bar *Foo_b_get(Foo *self) { return &self->b; } void Foo_b_set(Foo *self, Bar *value) { self->b = *value; } See the "Structure data members" section of Doc/Manual/SWIG.html for further details. *** POTENTIAL INCOMPATIBILITY *** This may break interfaces that relied on a lot of a undeclared structure and class names. To get the old behavior, simply use a forward declaration such as "struct Bar;" 04/04/2002: beazley C++ namespace support added. SWIG supports all aspects of namespaces including namespace, using, and namespace alias declarations. The default behavior of SWIG is to flatten namespaces in the target language. However, namespaces are fully supported at the C++ level and in the type system. See Doc/Manual/SWIGPlus.html for details on the implementation. 04/02/2002: cheetah (William Fulton) [Java] Sun has modified javac in jdk1.4 to no longer compile an import of an unnamed namespace. To fix this SWIG no longer generates the import for packageless classes. http://developer.java.sun.com/developer/bugParade/bugs/4361575.html As reported SF #538415. 03/27/2002: ljohnson (Lyle Johnson) [Ruby] Added support for pointer-to-member, similar to that for the Python module. Remarkably similar. Also added a new example for this (Examples/ruby/mpointer), which is remarkably similar to the Python example of the same name. 03/26/2002: ljohnson (Lyle Johnson) [Ruby] Made a few minor edits to the "Advanced Topics" chapter of the SWIG manual and added a new major section about how to create multi-module Ruby packages with SWIG. 03/26/2002: ljohnson (Lyle Johnson) [Ruby] Removed all of the old Ruby pragmas. If any of this functionality is truly missed we can resurrect it, preferably with some kind of feature-based directive. 03/25/2002: ljohnson (Lyle Johnson) [Ruby] Fixed SWIG exception library support for Ruby, which has apparently been broken for some time. Luckily, no one seems to have noticed. 03/23/2002: beazley C++-namespace support in SWIG directives. %addmethods: The %addmethods directive now accepts a fully qualified classname and can be used inside C++ namespace declarations. For example: // Attaches to the class Foo::Bar below %addmethods Foo::Bar { int somemethod() { ... } }; namespace Foo { class Bar { public: ... }; // Attaches to the class Bar above %addmethods Bar { int othermethod() { ... }; } } %feature, %rename, %ignore, %exception, and related directives: Namespaces are fully integrated into the renaming and declaration matcher. For example: %rename(display) Foo::print; // Rename in namespace Foo %ignore Foo::Bar::blah; // Ignore a declaration %rename directives can be placed inside namespace blocks as well. For example: namespace Foo { %rename(display) print; // Applies to print below void print(); }; Most other SWIG directives should work properly inside namespaces. No other changes are needed. 03/22/2002: beazley Some changes to internal symbol table handling. SWIG no longer manages structures and unions in a separate namespace than normal declarations like ANSI C. This means you can't have a structure with the same name as a function. For example: struct Foo { ... } int Foo() { ... } This approach is more like C++. It's not clear that SWIG ever really supported the ANSI C anyways---using the same name would almost certainly generate a name-clash in the target language. 03/22/2002: ljohnson (Lyle Johnson) [Ruby] Fixed [ 517302 ] for handling of renamed overloaded constructors. Now, renamed overloaded constructors are converted into class singleton methods (basically acting as "factory" methods). 03/21/2002: beazley Fixed [ 532957 ] %ignore parse error and casting operator. Reported by William Fulton. 03/18/2002: beazley (** ADVANCED USERS ONLY **) Added support for dynamic casting in return values. A somewhat common problem in certain C++ programs is functions that hide the identity of underlying objects when they are returned from methods and functions. For example, a program might include some generic method like this: Node *getNode(); However, Node * may just be base class to a whole hierarchy of different objects. Instead of returning this generic Node *, it might be nice to automatically downcast the object into the appropriate type using some kind dynamic cast. Assuming you understand the peril involved, a downcast can now be performed using the following function in the run-time type checker: swig_type_info *SWIG_TypeDynamicCast(swig_type_info *, void **ptr); This function checks to see if the type can be converted to another type. If so, a different type descriptor (for the converted type) is returned. This type descriptor would then be used to create a pointer in the target language. To use this, you would write a typemap similar to this: %typemap(out) Node * { swig_type_info *ty = SWIG_TypeDynamicCast($1_descriptor, (void **) &$1); $result = SWIG_NewPointerObj($1, ty); } Alternatively, %typemap(out) Node * = SWIGTYPE *DYNAMIC; To make the typemap have any effect, you have to write a supporting function that knows how to perform downcasting. For example: %{ static swig_type_info * Node_dynamic_cast(void **ptr) { Node **nptr = (Node **) ptr; Element *e = dynamic_cast(*nptr); if (e) { *ptr = (void *) e; return SWIGTYPE_p_Element; } Data *d = dynamic_cast(*nptr); if (d) { *ptr = (void *) d; return SWIGTYPE_p_Data; } return 0; } %} There is no restriction on how types are determined. dynamic_cast<> uses C++ RTTI. However, if you had some other mechanism for determining the type, you could use that here. Note: it is important to save the new pointer value back into the argument as shown. When downcasting, the value of the pointer could change. Finally, to make the casting function available, you have to register it with the run-time type checker. Put this macro in your interface file. DYNAMIC_CAST(SWIGTYPE_p_Node, Node_dynamic_cast); Note: this feature does not introduce a performance penalty on normal SWIG operation. The feature is only enabled by writing a new typemap that explicitly calls SWIG_TypeDynamicCast() to make a conversion. Examples/test-suite/dynamic_cast.i contains a simple example. This feature is not supported in the Java module due to differences in the type-checking implementation. *** EXPERIMENTAL FEATURE *** 03/17/2002: beazley Small change to type-name handling of unnamed structures and typedef. If a structure of this form appears: typedef struct { ... } Foo; Then 'Foo' is used as the proper typename for the structure. Furthermore, Foo can now be used as a name in C++ inheritance. SWIG was already kind of doing this, but this modification refines the implementation to more closely follow the C++ ARM, section 7.1.3, p. 106. This fixes a couple of obscure corner cases. 03/16/2002: beazley Modified C++ inheritance with a few enhancements. First, type information needed for casting and type-equivalence is generated even when base-classes aren't defined in the interface. For example: class Foo : public Bar { /* Bar unspecified */ public: ... }; void blah(Bar *b); In this case, the blah() function still accepts Foo * even though nothing is really known about Bar. Previous SWIG versions would just generate a type error. Inheritance has also been modified to work through typedef. For example: class Bar { }; typedef Bar OtherBar; class Foo: public OtherBar { } In this case, the base class of OtherBar is correctly resolved back to Bar. The use of the name OtherBar is lost in this resolution (the wrappers will simply use Bar instead of the typedef name OtherBar). 03/13/2002: beazley %typemap, %apply, and related directives can now appear inside class definitions. 03/13/2002: beazley Fixed a variety of problems related to compiling SWIG on 64-bit platforms. 03/12/2002: beazley Fixed problem with "ignore" and "in" typemaps. Local variables associated with "in" were being added to the wrapper function even though they were never used. Mostly harmless, but it would lead to a variety of compilation warnings. 03/12/2002: beazley Some changes to the internal type system and handling of nested C++ types. In previous versions of SWIG, if you had the following: class Foo { public: typedef int Blah; }; class Bar : public Foo { public: void somemethod(Blah x); }; The argument type in somemethod() would implicitly be set to Bar::Blah. Although this is technically allowed, it breaks typemaps. For example: %typemap(in) Foo::Blah { ... } doesn't match like you expect. This has been changed in SWIG-1.3.12. Now, types are expanded using the class in which they were defined. So, the argument type in somemethod() will be Foo::Blah---since the type Blah was defined in Foo. 03/10/2002: beazley Fixed some subtle type scoping problems with typedef and C++ classes. For example: typedef int Blah; class Bar { public: typedef double Blah; void foo(Blah x, ::Blah y); ... } 03/10/2002: beazley Highly experimental change to handle variable length arguments. First, there is no portable or reliable way to wrap a varargs function in full generality. However, you *can* change the function signature using %varargs. %varargs(char *) fprintf; ... void fprintf(FILE *f, char *fmt, ...); In this case, the variable length parameter "..." is simply replaced by the parameters given in %varargs. This results in a function like this: void fprintf(FILE *f, char *fmt, char *s); More than one argument can be used and default values can be defined. For example, this code specifies a maximum of four arguments. %varargs(char *x1 = 0, char *x2 = 0, char *x3 = 0, char *x4 = 0) fprintf; *** EXPERIMENTAL NEW FEATURE *** 03/10/2002: beazley Change to handling of variable length arguments. varargs is now handled as a proper parameter and is passed to the code generator. However, it still can't be handled correctly (and will generate a typemap warning). This change has been made to better incorporate variable length arguments with other directives such as %ignore, %rename, %feature, and so forth. 03/10/2002: beazley Fixed [ 522555 ] Syntax error parsing "define" construct. SWIG is a little more restrictive in determining #define statements that will be wrapped as constants. Also added a better parser error rule for handling bad constants. 03/08/2002: cheetah (William Fulton) [Java] Bug fix: Classes renamed with %rename that are derived from another class generate more appropriate shadow class code. 03/08/2002: cheetah (William Fulton) [Java] Fixed SF [ #523632 ] and [ #513335 ] both reported by Israel Tanner. Support for types that are used which are in a typedef. The appropriate shadow class name is generated. Also generated correct shadow classname when a templated class is used within another templated class. See the cpp_typedef.i testcase. 03/08/2002: cheetah (William Fulton) [Java] Bug fix: No type was generated in shadow classes for types that weren't wrapped by SWIG. The type is treated as a raw pointer, ie no shadow class. 02/22/2002: beazley Refined the matching algorithm used by %rename, %ignore, and %feature. If a type signature is supplied, it must exactly match that used in the declaration---including any use of const. For example: %rename(foo1) foo(int); %rename(bar1) bar(int) const; class Blah { public: void foo(int); // Matched --> foo1 void foo(int) const; // Not matched void bar(int); // Not matched void bar(int) const; // Matched --> bar1 } In previous versions, a non-const specification would match both the non-const and const declarations. However, the whole point of %rename and related directives is that they be able to precisely pinpoint exact declarations in an interface. This fixes the problem. 02/21/2002: beazley Reworked the handling of default constructor and destructors. SWIG now makes a preliminary pass over the parse tree to discover which classes support default allocation. This fixes a number of very subtle issues in code generation and call/return by value. 02/18/2002: cheetah (William Fulton) Improved support on Cygwin: Perl, Python, Tcl, Ruby and Java should work out of the box, barring the runtime library. Removed dllwrap and replaced with newly working gcc -shared instead for Cygwin. All this will require the new improved binutils 20010802 and later, but the latest Cygwin is usually the best recommendation. 02/15/2002: beazley Fixed some problems related to wrapping of global variables and Perl shadow classes. Reported by Chia-liang Kao. 02/15/2002: ljohnson (Lyle Johnson) [Ruby] Made a fix to the code generation for C++ class constructors so that we get both a "new" singleton method and an "initialize" instance method for each class. This change enables developers to derive new Ruby classes from SWIG-wrapped C++ classes and then override their initialize methods to provide subclass-specific instance initialization. 02/15/2002: ljohnson (Lyle Johnson) [Ruby] Massive documentation update for the Ruby module, contributed by Craig Files. 02/14/2002: ljohnson (Lyle Johnson) [Ruby] Bug fix: An error in the SWIG runtime support for Ruby was causing several of the examples to fail. Reported by William Fulton. 02/14/2002: ljohnson (Lyle Johnson) [Ruby] Bug fix: Enumerations defined within a class (such as those seen in the Examples/ruby/enum example) were not being exported with the correct names. Reported by William Fulton. 02/13/2002: ljohnson (Lyle Johnson) [Ruby] Added a warning message when we run across overloaded class constructors for C++ code, that this is currently not supported (even if the overloads have been %renamed). For an example of where this doesn't work, see Examples/ruby/operator. 02/13/2002: ljohnson (Lyle Johnson) [Ruby] Added an "ignored" warning message when the parser runs across an operator!=() declaration for C++ code. 02/11/2002: ljohnson (Lyle Johnson) [Ruby] Added the "import", "import_template", "operator" and "template" examples. 02/11/2002: ljohnson (Lyle Johnson) [Ruby] Added multi-module support. 02/09/2002: ljohnson (Lyle Johnson) [Ruby] Added the missing "#define SWIG_NOINCLUDE" at the top of the wrapper code when the '-c' option is used. 02/09/2002: ljohnson (Lyle Johnson) Corrected a minor off-by-one error for the size of the swig_types[] array that's generated in the wrapper code. 02/08/2002: beazley Fixed SF [ #515058 ] Wrong code for C++ templates. Reported by Israel Taller. Version 1.3.11 (January 31, 2002) ================================= 01/30/2002: beazley Fix to pass/return by value for C++ objects that define no default constructor. Changes to the typemap system made it impossible to wrap C++ objects with no default constructor. This has been fixed, but the solution involves some clever template magic contributed by William Fulton. Please see the comments in the file Lib/swig.swg for further details. This solution is experimental and may be refined in a future release. 01/30/2002: beazley Global variables and member data of type "const char *" can be set, but the old value is silently discarded without any garbage collection. This may generate a memory leak. This change is needed to more safely handle variables like this: const char *foo = "Hello World\n"; In this case, it's not safe to free the old value. However, SWIG can dynamically allocate a new value and make foo point to it. To fix this memory leak, you can probably do this: %clear const char *foo; %apply char * {const char *foo}; *** POTENTIAL INCOMPATIBILITY *** 01/30/2002: beazley Two minor typemap enhancements have been added. First, typemaps can issue a warning message by including a special warning attribute. For example: %typemap(in,warning="I'm going to do something dangerous") ... The warning message will show up whenever the typemap is applied. Second, a typemap can force a no-match by defining %typemap(in) sometype "pass"; If this is used, the typemap system will *not* record a typemap match for "sometype". This can be used to block selected typemaps. For example, if you wanted to disable a typemap feature for some type, you could do this. // Do not allow global variables of type 'const char *' to be set. %typemap(varin) const char * "pass"; It might also be possible to use this to do subtle and strange things with typemaps. For example, if you wanted to make 'blah *' an output value and 'const blah *' an input parameter, you might do this: %typemap(ignore) blah *(blah temp) { $1 = &temp; } %typemap(argout) blah * { ... return a value ... } /* Block unqualified typemaps defined above */ %typemap(ignore) const blah * "pass"; %typemap(argout) const blah * "pass"; %typemap(in) const blah * { ... get input value ... } (This potential applications of typemaps suggested by Greg Stein). *** NEW FEATURE *** 01/29/2002: cheetah (william fulton) [Java] Bug fix: No enumerations were wrapped when the -shadow commandline option was not specified. Reported by Israel Taller. 01/28/2002: cheetah (william fulton) [Java] Global arrays are successfully wrapped. In fact they started mostly working in SWIG-1.3.10. 01/28/2002:richardp Added first attempt at C++ and -shadow support for PHP4 module, please test and mail me if any problems/ideas on improving it. There is a known problem with uninitialized member variables, please see Examples/php4/sync/README for details. Also more PHP documentation added to Doc/Manual/Php.html 01/27/2002:beazley The ANSI C size_t type is now recognized as an integer by default. 01/26/2002:beazley long long and unsigned long long support added to many language modules. This is not a portable feature and will require compiler support for the long long type. In target languages that do not support long long (e.g., Tcl and Perl), numbers are converted to a string of digits. This prevents their use in arithmetic calculations, but still allows values to be set from a string. long long support requires the use of the strtoll() and strtoull() functions as well as the 'lld' and 'llu' format specifiers of sprintf(). 01/26/2002:beazley Fixed [ #501827 ] Delete method is not called. The Tcl module wasn't correctly calling destructors when they were defined using %addmethods. This has been fixed. Reported by Reinhard Fobbe. 01/26/2002: beazley Better support for long long and unsigned long long. Typemaps have been included in a number of modules for handling these types. In addition, the parser has been modified to accept long long literals such as 1234LL and 1234ULL. 01/27/2002: cheetah (william fulton) [Java] A C char[] is mapped to a Java String which is the default SWIG handling of char[] and char*. It used to be mapped to byte[]. Note that a C signed char[] array is mapped to byte[]. *** POTENTIAL INCOMPATIBILITY *** 01/25/2002: beazley Fixed a problem with return-by-value, C++, and objects that define no default constructor. Reported by Joel Reed. 01/25/2002: cheetah (william fulton) [Java] Overhaul of the Java module. The C code generation is now done from typemaps. 01/24/2002: cheetah (william fulton) [Java] Support for arrays of enum pointers 01/20/2002: cheetah (william fulton) [Java] Error checking for null Java objects being passed to native functions. Exception thrown now whereas before the JVM crashed. 01/18/2002: cheetah (william fulton) [Java] Corrected behaviour for functions that take arrays. For example, when this c function: void arrayfn(int array[]); is wrapped the corresponding native function public final static native void arrayfn(int[] array); is produced. Previously if the C function made any changes to the array elements, these were not reflected back into the Java array. This has now been corrected so that the changes are propogated back to Java and the calling function will see these changes. This is how pure Java functions work, ie arrays are passed by reference. 01/15/2002:mkoeppe [Guile] New file cplusplus.i with C++ typemaps contributed by Marcio Luis Teixeira . 01/11/2002: cheetah (william fulton) [Java] Changed mapping of C long to Java type. Was mapped to Java long, now mapped to Java int. If you want the previous mapping to Java long use this approach in your interface file: %clear long; %typemap(jni) long "jlong" %typemap(jtype) long "long" %typemap(jstype) long "long" %clear long[ANY]; %typemap(jni) long[ANY] "jlongArray" %typemap(jtype) long[ANY] "long[]" %typemap(jstype) long[ANY] "long[]" %typemap(in) long[ANY] {write me for array support} %typemap(out) long[ANY] {write me for array support} %typemap(argout) long[ANY] {write me for array support} %typemap(freearg) long[ANY] {write me for array support} *** POTENTIAL INCOMPATIBILITY *** This new mapping is more appropriate when interfacing to 32 bit applications which are used in the current 32-bit JVMs. For future 64-bit JVMs you may have to change these mappings - eg on Unix LP64 systems, but not on Microsoft 64bit Windows which will be using a P64 IL32 model. This may be automated in a future version of SWIG. 01/10/2002:beazley Fixed [ 501677 ] %init block in wrong place. Reported by Luigi Ballabio. 01/09/2002: cheetah (william fulton) [Java] Default support for the long long type. signed long long is mapped to a Java long. unsigned long long is mapped to BigInteger. 01/09/2002:beazley Experimental change to parser to better support mixing of int, long, short, unsigned, float, and double. The parser should now support types like this: short unsigned int int unsigned short unsigned short int unsigned int short This change also enables a type of 'long double' (previously unsupported) to be used. *** NEW FEATURE *** 01/05/2002: cheetah (william fulton) [Java] Casting fix for when function return type is a pointer as reported by Gary Pennington 2002-01-05. The upper 32bits of the 64 bit jlong will have contained junk for 32bit pointers. 01/05/2002: cheetah (william fulton) [Java] Better pointer handling in Java is possible as the INPUT, OUTPUT and INOUT typemaps have been added into typemaps.i. 01/05/2002: cheetah (william fulton) [Java] $null can be used in input typemaps to return early from JNI functions that have either void or a non-void return type. Example: %typemap(check) int * %{ if (error) { SWIG_exception(SWIG_IndexError, "Array element error"); return $null; } %} If the typemap gets put into a function with void as return, $null will expand to nothing: void jni_fn(...) { if (error) { SWIG_exception(SWIG_IndexError, "Array element error"); return ; } ... } otherwise $null expands to zero, where javareturntype is either a pointer or a primitive type: javareturntype jni_fn(...) { if (error) { SWIG_exception(SWIG_IndexError, "Array element error"); return 0; } ... } 01/02/2002: cheetah (william fulton) [Java] The Java module incorrectly used argout typemaps for strings. This is now corrected and the code now resides in the freearg typemap. The argout array typemaps have been split into argout and freearg typemaps. This correction may require some user written typemaps to be modified. *** POTENTIAL INCOMPATIBILITY *** 12/28/2001: cheetah (william fulton) [Java] Multi typemaps now working for Java see multimap example. [Java] Fix for recently introduced bug - freearg typemap code was appearing before the function call. 12/28/2001: cheetah (william fulton) [Java] JCALL macro for JNI calls that work in both C and C++ typemaps have been replaced with JCALL0, JCALL1, JCALL2, JCALL3 and JCALL4 macros. *** POTENTIAL INCOMPATIBILITY *** 12/22/2001:beazley Resolved some inconsistent behavior with %rename and class renaming. If you specify the following: %rename(Foo) Bar; class Bar { public: Bar(); ~Bar(); } Then the %rename directive applies to the class itself, the constructor, and the destructor (all will be renamed to Foo). If a class defines more than one constructor, the overloaded variants can still be renamed by specifying parameters to %rename. For example: %rename(Bar_copy) Bar(Bar &); class Bar { public: Bar(); Bar(Bar &); ~Bar(); }; There are still some odd corner cases. If you specify %rename(Foo) ::Bar; then only the name of the class is changed and the constructor/destructor names are left unmodified. If you specify %rename(Foo) *::Bar; then the names of the constructor/destructor functions are modified but the name of the class is not. 12/21/2001: cheetah (william fulton) [Java] jni, jtype and jstype typemaps no longer hardcoded but real typemaps. New variable substitution, $javaclassname, can be used in the jstype typemaps. It is replaced with the Java shadow class name where applicable. [Java] Fix for recently introduced bug to do with inheritance when using %import. [Java] A few more bug fixes, todo with %rename and using the kind with the type, eg void fn(union uni myuni, struct str mystr, class cl mycl); 12/20/2001:beazley Fixed [ #494524 ] Preprocessor bug - apostrophe and #subst. 12/20/2001:beazley Added SWIG_VERSION preprocessor symbol. This is a hexadecimal integer such as 0x010311 (corresponding to SWIG-1.3.11). This can be used in the interface as follows: #if SWIG_VERSION >= 0x010311 /* Use some fancy new feature */ #endif Note: The version symbol is not defined in the generated SWIG wrapper file. *** NEW FEATURE *** 12/20/2001:mkoeppe [MzScheme]: Renamed mzswig_make_boolean to swig_make_boolean, as the latter is used in the typemaps. Reported by Luigi Ballabio. 12/17/2001:mkoeppe [Guile]: Rewrote list-vector.i using multi-dispatch typemaps. Updated pointer-in-out.i. Make the deprecated typemap-substitution of "$source" in "argout" work as before. 12/16/2001:mkoeppe [Guile]: Fixed macros %values_as_list, %values_as_vector, %multiple_values to use the proper %pragma syntax. New Guile example/test "multivalue"; new Guile run-test for test-suite item "list-vector" (currently broken). 12/14/2001:mkoeppe [Guile]: Fixed typemap-substition bug for "varin". Relaxed valid-identifier check to allow all R5RS identifiers. Version 1.3.10 (December 10, 2001) ================================== 12/08/2001:beazley Modified %typemap so that %{ ... %} can also be used as a code block (mostly for completeness). For example: %typemap(in) blah %{ ... %} This form does not introduce a new block scope. Also, the code enclosed in %{ ... %} is not processed by the preprocessor. 12/08/2001:beazley Fixed [ #459614 ] SWIG with multiple TCL interpreters. 12/08/2001:beazley Fixed [ #417141 ] rubydec.swg is wrong Reported by Paul Brannan. 12/08/2001:beazley Fixed [ #410557 ] Problem with %addmethods on NT. Reported by Magnus Ljung. 12/08/2001:beazley Fixed [ #445233 ] Enhancement: handle access change. SWIG now parses (but ignores) C++ access changes for the the following: class A { protected: void something() { } public: A() {} }; class B : private A { public: B() : A() { } protected: A::something; <---- Parsed, but ignored }; Suggested by Krzysztof Kozminski. 12/08/2001: cheetah (william fulton) Fix for Ruby to work using Visual C++. 12/06/2001:beazley Fixed [ #465687 ] unsigned short parameters fail. Reported by Gerald Williams. 12/06/2001:beazley Fixed SF [ #489594 ] PyString_FromString can't take NULL arg. Reported by John Merritt. SWIG now converts string values to Python using code like this: resultobj = result ? PyString_FromString(result) : Py_BuildValue(""); 12/06/2001:beazley Fixed SF [ #463561 ] Type conversions not generated. Reported by Gerald Williams. 12/04/2001:beazley Fixed SF [ #470217 ] Tcl default argument handling. Reported by Shaun Lowry. 12/04/2001:beazley Fixed SF [ #472088 ] defined(MACRO) expanded everywhere. Embedded preprocessor directives such as %#if defined(FOO) are not expanded by the SWIG preprocessor. Reported by Gerald Williams. 12/04/2001:beazley Fixed SF [ #476467 ] Problems with #define & commas. 12/04/2001:beazley Fixed SF [ #477547 ] wrong declaration of pointer functions. Bad prototypes in Lib/tcl/ptrlang.i. 12/04/2001:beazley Fixed SF [ #483182 ] Constants can take args by mistake. When swig -perl5 -const is used, constants are declared with a void prototype. For example: sub ICONST () { $examplec::ICONST } Patch submitted by Rich Wales. 12/03/2001:beazley New %exception directive. This is intended to replace %except. It works in exactly the same manner except it does not accept a language specifier. For example: %exception { try { $action } catch(SomeError) { error } } %exception is also name aware---allowing it to be applied to specific declarations in an interface. For example: %exception foo { ... exception for any function/method foo ... } %exception Foo::bar { ... exception for method bar in class Foo ... } %exception Foo::bar(double) { ... exception for method bar(double) in class Foo ... } The semantics of this name matching is exactly the same as for %rename. *** NEW FEATURE *** 12/03/2001:beazley Substantial cleanup of the Python shadow class code. Shadow classes used to be created in this rather complicated manner involving about a half-dozen strings created in bits and pieces. Shadow classes are now generated in a more straightforward manner--in the same order that appears in the interface file. *** POTENTIAL INCOMPATIBILITY *** The order in which declarations appear in the shadow file may differ. 12/03/2001:beazley The %insert directive (%{ ... %}, %runtime, %header, %wrapper, etc.) can now be used inside of a class definition. This has potential uses when generating shadow class code. For example: class Foo { ... %insert("shadow") %{ # Some python code def blah(self): print "I'm blah!" %} ... }; The support for class code insertion depends on the language module. However, the intent of this feature is to simplify the task of extending shadow class code. In the Python module, this inserts code with the proper level of indendation (regardless of what was used in the SWIG interface). *** NEW FEATURE *** 11/29/2001: cheetah (william fulton) Modifications for Java and Python modules to work on cygwin. Unfortunately a lot of the python module has started to produces code which cannot be auto-imported using cygwin libtools so most of it is still broken. 11/28/2001:beazley The %rename and %feature directive can now be used inside of a class definition. For example: class Foo { %rename(foo_i) foo(int); %rename(foo_d) foo(double); public: ... void foo(int); void foo(double); ... }; When used in this manner, the %rename directive only applies to members of the class in which it appears as well as all derived classes. In fact, this is really just the same as saying: %rename(foo_i) Foo::foo(int); %rename(foo_d) Foo::foo(double); class Foo { ... }; *** NEW FEATURE *** 11/26/2001:beazley Added the experimental %feature directive. %feature can be used to attach arbitrary string attributes to parse tree nodes. For example: %feature("except") blah { try { $function } catch (Error) { whatever; } } or %feature("set") *::x_set "x"; or %feature("blah") Foo::bar(int,double) const "spam"; The syntax is borrowed from the %rename directive. In fact, the exact same semantics apply (inheritance, matching, etc.). %feature is a very powerful low-level primitive that can be used to customize individual language modules and to provide hints to any stage of code generation. Features are attached to parse tree nodes as attributes with names like "feature:*" where * is replaced by the feature name (e.g., "feature:except", "feature:set", etc.). Language modules can then look for the features using a simple attribute lookup. %feature is intended to be a replacement for a number of older SWIG directives including %except and specialized pragmas. It is more powerful (due to its parameterized name matching) and it provides very precise control over how customization features are attached to individual declarations. There are future expansion plans that will build upon this capability as well. It's not certain that %feature will ever be used directly by SWIG users. Instead, it may be a low-level primitive that is used in high-level macro definitions. For instance, to support properties, you might define a macro like this: %define %property(name, setf, getf) %feature("set") setf #name; %feature("get") getf #name; %enddef Which allows a user to specify things like this: %property(p, get_p, set_p); class Blah { public: int get_p(); void set_p(int); }; *** EXPERIMENTAL NEW FEATURE *** 11/24/2001:beazley The Tcl module has been expanded with some new features for managing object ownership. For example: set c [Circle -args 20] $c area # Invoke a method $c -disown # Releases ownership of the object $c -acquire # Acquires ownership of the object If Tcl owns the object, its destructor is invoked when the corresponding object command is deleted in Tcl. To simplify the destruction of objects, the following syntax can be used: $c -delete # Delete an object This is an alternative for the more obscure variant of rename $c {} These features also add functionality at the C API level. The following functions manage ownership from C and can be used in typemaps. SWIG_Acquire(void *ptr); SWIG_Disown(void *ptr); A new function for constructing instances is also available: Tcl_Obj * SWIG_NewInstanceObj(Tcl_Interp *interp, void *ptr, swig_type_info *type, int own); When used in a typemap, this creates a pointer object and an interpreter command that can be used to issue methods and access attributes as shown above. *** NEW FEATURE *** 11/23/2001:beazley All Python-related %pragma operations have been eliminated. Most of these were written for older SWIG versions in order to compensate for limitations in earlier releases. In an effort to reduce the amount of code-clutter and potential for errors, it is easier to simply eliminate the pragmas and to start over (if needed). To be honest, I'm not even sure the pragmas worked in 1.3.9 and recent releases. Note: If you need to insert code into the shadow class file created by SWIG, simply use the %shadow directive like this: %shadow %{ def some_python_code(): print "blah!" %} *** POTENTIAL INCOMPATIBILITY *** 11/22/2001:beazley Sweeping changes to the way in which the Python module handles shadow classes. In early implementations, shadow classes were merely Python wrappers around typed pointer objects. However, some users actually wanted to receive the shadow class object in C. To accommodate this, the dereferencing of the "this" pointer in a shadow class was moved to C as described in CHANGES [8/8/99]. However, the process of returning pointers to Python was still somewhat problematic. Specifically, shadow classes never worked in situations such as these: - Use of any kind of output typemap ('out' or 'argout') - Global variables (broken as far as I can tell). In the past, some users have dealt with this by manually trying to create shadow class objects themselves from C/C++. However, this was difficult because the C wrappers don't really know how to get access to the corresponding Python class. The Python module has now been modified to automatically attach shadow class objects to pointers when they are returned to Python. This process occurs in the function SWIG_NewPointerObj() so the process is completely transparent to users. As a result, shadow classes are now more seamlessly integrated with typemaps and other features of SWIG. This change may introduce a number of incompatibilities. The SWIG_NewPointerObj() now takes an extra parameter "own" to indicate object ownership. This can be used to return a pointer to Python that Python should destroy. In addition, older code that tries to manually construct shadow class objects or which expects bare pointers may break---such pointers may already be encapsulated by a shadow class. *** POTENTIAL INCOMPATIBILITY *** 11/20/2001:beazley Modified the %insert directive to accept single braces { ... }. For example: %insert("header") { ... some code ... } This works exactly like %{ ... %} except that the code in the braces is processed using the preprocessor. This can be useful in certain contexts such as low-level code generation in language modules. *** NEW FEATURE *** 11/20/2001:beazley Command line options are now translated into preprocessor symbols. For example: ./swig -python -shadow -module blah interface.i Creates the symbols: SWIGOPT_PYTHON 1 SWIGOPT_SHADOW 1 SWIGOPT_MODULE blah Modules can look for these symbols to alter their code generation if needed. *** NEW FEATURE *** 11/20/2001:beazley Massive overhaul of the Perl5 module. A lot of code generation is now driven by tables and typemaps. The generated wrapper code also makes use of tables to install constants, variables, and functions instead of inlining a bunch of procedure calls. The separate variable initialization function is gone. Most code generation is controlled via the perl5.swg file in the library. *** POTENTIAL INCOMPATIBILITY *** 11/13/2001:beazley Added parsing support for the C++ typename keyword. Primarily this is added to better support templates. For example: template void blah(C& v) { typename C::iterator i = v.begin(); } Note: typename is supported in the parser in the same way as 'struct' or 'class'. You probably shouldn't use it anywhere except in templates. *** NEW FEATURE *** 11/11/2001:beazley Massive overhaul of the language module API. Most functions now use a common, very simple, API. There are also a number of interesting semantic side-effects of how code is actually generated. Details will be forthcoming in Doc/Manual/Extending.html. *** POTENTIAL INCOMPATIBILITY *** Language modules written for previous versions of SWIG will no longer work, 11/10/2001:beazley Fixed a very subtle bug due to unnamed class wrapping. For example, if you did this typedef struct { int x,y; } gdPoint, *gdPointPtr; void foo(gdPointPtr x); Then the foo function would get a type-error. The problem has to do with internal typedef handling and the fact that the typedef declarations after the struct appear later in the parse tree. It should work now. Problem reported by Vin Jovanovic. 11/09/2001:beazley Subtle change to "out" typemaps (and related variations). The name that is attached to the typemap is now the raw C identifier that appears on a declaration. This changes the behavior of member functions. For example: %typemap(out) int foo { ... } class Blah { public: int foo(); // typemap gets applied } Previous versions never really specified how this was supposed to work. In SWIG1.1, you could probably write a typemap for the wrapper name like this: %typemap(out) int Blah_foo { ... } However, this old behavior is now withdrawn and not supported. Just use the member name without any sort of special prefix. *** POTENTIAL INCOMPATIBILITY *** 11/06/2001:beazley Changes to Tcl module initialization: (1) SWIG now automatically includes the code needed to work with Tcl stubs. Simply compile with -DUSE_TCL_STUBS. (2) SWIG now automatically calls Tcl_PkgProvide to register a package name. The package name is the same as the name specified with the %module directive. The version number is set to "0.0" by default. To change the version number, use swig -pkgversion 1.2 interface.i. *** POTENTIAL INCOMPATIBILITY *** Modules that provided stubs and Tcl_PkgProvide on their own might break. Simply remove that code. 11/05/2001:beazley Changed code generation of constants in the Tcl module. Constants are now stored in a large table that get installed at module startup. There are also no longer any static variables so it should generate somewhat less code. 11/04/2001:beazley The "const" typemap has been renamed to "constant" in many language modules. "const" is a C keyword which made the handling of the typemap directive somewhat awkward in the parser. *** POTENTIAL INCOMPATIBILITY *** 11/04/2001:beazley %typemap directive can now accept nearly arbitrary keyword parameters. For example: %typemap(in,parse="i",doc="integer") int "..."; The purpose of the keyword parameters is to supply code generation hints to the target language module. The intepretation of the parameters is language specific. *** NEW FEATURE *** 11/04/2001:beazley Slight semantic change to internal call/return by value handling. In previous versions of SWIG, call-by-value was translated into pointers. For example: double dot_product(Vector a, Vector b); turned into this: double wrap_dot_product(Vector *a, Vector *b) { return dot_product(*a,*b); } This translation was normally performed by the SWIG core, outside of the control of language modules. However, a side effect of this was a lot of bizarre typemap behavior. For example, if you did something like this: %typemap(in) int32 { ... } You would find that int32 was transformed into a pointer everywhere! (needless to say, such behavior is unexpected and quite awkward to deal with). To make matters worse, if a typedef was also used, the pointer behavior suddenly disappeared. To fix this, the pointer transformation is now pushed to the language modules. This produces wrappers that look roughly like this: double wrap_dot_product(Vector *a, Vector *b) { Vector arg1 = *a; Vector arg2 = *b; return dot_product(arg1,arg2); } This change also makes it easy to define typemaps for arbitrary undefined types. For example, you can do this (and it will work regardless what int32 is): %typemap(in) int32 { $1 = (int32) PyInt_AsLong($input); } *** POTENTIAL IMCOMPATIBILITY *** This change may break call/return by value code generation in some language modules. 11/03/2001:beazley Changed the name of the default typemaps to the following: %typemap() SWIGTYPE { ... an object ... } %typemap() SWIGTYPE * { ... a pointer ... } %typemap() SWIGTYPE & { ... a reference ... } %typemap() SWIGTYPE [] { ... an array ... } %typemap() enum SWIGTYPE { ... an enum value ... } %typemap() SWIGTYPE (CLASS::*) { ... pointer to member ... } These types are used as the default for all types that don't match anything else. See CHANGES log entry for 8/27/2000 for the old behavior. The role of these types is also described in Doc/Manual/Typemaps.html *** POTENTIAL INCOMPATIBILITY *** 10/25/2001:beazley Modified Guile and Mzscheme modules to support multi-argument typemaps. 10/25/2001: cheetah (william fulton) [Java] Fix to handle pointers to arrays. 10/24/2001:beazley Defining a typemap rule for enum SWIGENUM can now be used to define default behavior for enum variables. 10/22/2001:beazley Ruby module modified to support multi-argument typemaps. 10/22/2001:beazley The Ruby module can now handle functions with an arbitrary number of arguments. Previous versions were limited to to functions with only 9 or 16 arguments depending on the use of default arguments. Note: from some inspection of the Ruby interpreter source, the new approach might be a little faster as well. 10/18/2001:beazley Fixed a bug with forward class declarations and templates. class Foo ; Bug reported by Irina Kotlova. 10/16/2001:beazley Support for multivalued typemaps added. The typemaps are specified using the syntax below. Within each typemap, variable substitution is handled as follows: %typemap(in) (int argc, char *argv[]) { $arg; // The input object in the target language $1; // C local variable for first argument $2; // C local variable for second argument // These variables refer to either argument $1_type, $1_ltype, $1_basetype, etc... (argc) $2_type, $2_ltype, $2_basetype, etc... (argv[]) // Array dimension of argv $2_dim0 } Basically any variable that was available in normal typemaps is available for either argument by prefacing the variable name by '$n_' where n is the argument position. Notes: (1) Multi-valued typemaps can only be applied to a single object in the target scripting language. For example, you can split a string into a (char *, int) pair or split a list into a (int, char []) pair. It is not possible to map multiple objects to multiple arguments. (2) To maintain compatibility with older SWIG versions, the variables such as $target and $type are preserved and are mapped onto the first argument only. (3) This should not affect compatibility with older code. Multi-valued typemaps are an extension to typemap handling. Single valued typemaps can be specified in the usual way. The old $source and $target variables are officially deprecated. Input variables are referenced through $arg$ and output values are reference through $result$. *** NEW FEATURE *** 10/16/2001:beazley Added parsing support for multivalued typemaps. The syntax is a little funky, but here goes: // Define a multivalued typemap %typemap(in) (int argc, char *argv[]) { ... typemap code ... } // Multivalued typemap with locals %typemap(in) (int argc, char *argv[])(int temp) { ... typemap code ... } // Copy a multivalued typemap %typemap(in) (int argcount, char **argv) = (int argc, char *argv[]); // Apply a multivalued typemap %apply (int argc, char *argv[]) { (int argcount, char **argv) }; Note: this extra parsing support is added for future extension. No language modules currently support multi-valued typemaps. 10/11/2001:beazley Modified the typemap matching code to discard qualifiers when checking for a match. For example, if you have a declaration like this: void blah(const char *x); The typemap checker checks for a match in the following order: const char *x const char * char *x char * If typedef's are involved, qualifier stripping occurs before typedef resolution. So if you had this, typedef char *string; void blah(const string x); typemap checking would be as follows: const string x const string string x string const char *x const char * char *x char * The primary reason for this change is to simplify the implementation of language modules. Without qualifier stripping, one has to write seperate typemaps for all variations of const and volatile (which is a pain). *** POTENTIAL INCOMPATIBILITY *** Typemaps might be applied in places where they weren't before. 10/9/2001: beazley SWIG now generates wrappers that properly disambiguate overloaded methods that only vary in constness. For example: class Foo { ... void blah(); void blah() const; ... }; To handle this, the %rename directive can be used normally. %rename(blah_const) blah() const; In the resulting wrapper code, method calls like this are now generated: (obj)->blah() // Non-const version ((Foo const *)obj)->blah() // const version This should force the right method to be invoked. Admittedly, this is probably obscure, but we might as well get it right. 10/8/2001: beazley The preprocessor now ignores '\r' in the input. This should fix the following bug: [ #468416 ] SWIG thinks macro defs are declarations? 10/8/2001: beazley Added support for ||, &&, and ! in constants. This fixes SF [ #468988 ] Logical ops break preprocessor. However, at this time, constants using these operators are not supported (the parser will issue a warning). 10/4/2001: beazley Added -show_templates command line option. This makes SWIG display the code it actually parses to generate template wrappers. Mostly useful for debugging. *** NEW FEATURE *** 10/4/2001: beazley Change to semantics of %template directive. When using %template, the template arguments are handled as types by default. For example: %template(vecint) vector; %template(vecdouble) vector; To specify a template argument that is *not* a type, you need to use default-value syntax. For example: %template(vecint) vector; %template(vecdouble) vector; In this case, the type name doesn't really matter--only the default value (e.g., 50, 100) is used during expansion. This differs from normal C++, but I couldn't figure out a better way to do it in the parser. Might implement an alternative later. *** POTENTIAL INCOMPATIBILITY *** 10/4/2001: beazley Major changes to template handling in order to provide better integration with the C++ type-system. The main problem is as follows: Suppose you have a template like this: template void blah(const T x) { stuff }; Now suppose, that you instantiate the template on a type like this in SWIG: %template(blahint) blah; In C++, this is *supposed* to generate code like this: void blah(int *const x) { stuff }; However, in SWIG-1.3.9, the template substitution gets it wrong and produces void blah(const int *x) { stuff }; (notice the bad placement of the 'const' qualifier). To fix this, the SWIG parser now generates implicit typedefs for template type arguments that produces code roughly equivalent to doing this: typedef int *__swigtmpl1; %template(blahint) blah<__swigtmpl1>; which generates code like this: void blah(const __swigtmpl1 x) { stuff }; Since this is correct in both C++ and SWIG, it provides the right semantics and allows everything to compile properly. However, to clean up the generated code a little bit, the parser keeps track of the template types and performs back-substitution to the original type when building the parse tree. Thus, even though the implicit typedef is used in the input and may appear in the generated wrapper file (for proper compilation), the parse tree will hide a lot of these details. For example: void blah(const __swigtmpl1 x) { stuff }; will look like it was declared as follows (which is what you want): void blah(int *const x) { stuff } The only place you are likely to notice the typedef hack is in bodies of template functions. For example, if you did this, template class blah { ... %addmethods { void spam() { T tempvalue; ... } } } you will find that 'T tempvalue' got expanded into some strange typedef type. This *still* compiles correctly so it's not a big deal (other than looking kind of ugly in the wrapper file). 10/4/2001: beazley Fixed some inheritance problems in Tcl Object interface. 10/1/2001: beazley Tcl module has changed to use byte-backed pointer strings. This implementation should be safe on 64-bit platforms. However, the order in which digits appear in pointer values no longer directly corresponds to the actual numerical value of a pointer (on little-endian machines, pairs of digits appear in reverse order). 10/1/2001: beazley Perl5 module is now driven by a configuration file 'perl5.swg' in the SWIG library. 10/1/2001: beazley The perl5 module no longer tries to apply the "out" typemap in code generated for magic variables. I'm surprised that this ever worked at all (since all of the code that was there was wrong anyways). Use the "varout" typemap to handle global variables. 10/1/2001: beazley Fixed a bug related to character array members of structures. For example: struct Foo { char name[32]; }; SWIG is normally supposed to return a string, but this was broken in 1.3.9. The reason it was broken was actually due to a subtle new feature of typemaps. When a data member is set to an array like this, the return type of the related accessor function is actually set to an array. This means that you can now write typemaps like this: %typemap(python,out) char [ANY] { $target = PyString_FromStringAndSize($source,$dim0); } This functionality can be used to replace the defunct memberout typemap in a more elegant manner. 9/29/2001: beazley Some further refinement of qualified C++ member functions. For example: class Foo { ... void foo() const; ... }; (i) The SWIG parser was extended slightly to allow 'volatile' and combinations of 'const' and 'volatile' to be used. This is probably rare, but technically legal. Only added for completeness. (ii) For the purposes of overloading, qualified and non-qualified functions are different. Thus, when a class has methods like this: void foo(); void foo() const; Two distinct methods are declared. To deal with this, %rename and similar directives have been extended to recognize const. Thus, one can disambiguate the two functions like this: %rename(fooconst) Foo::foo() const; or simply ignore the const variant like this: %ignore Foo::foo() const; Note: SWIG currently has no way to actually invoke the const member since the 'const' is discarded when generating wrappers for objects. 9/27/2001: beazley New directive. %namewarn can be used to issue warning messages for certain declaration names. The name matching is the same as for the %rename directive. The intent of this directive is to issue warnings for possible namespace conflicts. For example: %namewarn("print is a python keyword") print; The name matching algorithm is performed after a name has been resolved using %rename. Therefore, a declaration like this will not generate a warning: %rename("Print") print; ... void print(); /* No warning generated */ Since the warning mechanism follows %rename semantics, it is also to issue warnings for specific classes or just for certain member function names. (Dave - I've been thinking about adding something like this for quite some time. Just never got around to it) *** NEW FEATURE *** 9/27/2001: beazley Enhanced the %ignore directive so that warning messages can be issued to users. This is done using %ignorewarn like this: %ignorewarn("operator new ignored") operator new; The names and semantics of %ignorewarn is exactly the same as %ignore. The primary purpose of this directive is for module writers who want to ignore certain types of declarations, but who also want to alert users about it. A user might also use this for debugging (since messages will appear whenever an ignored declaration appears). *** NEW FEATURE *** 9/26/2001: beazley Super-experimental support for overloaded operators. This implementation consists of a few different parts. (i) Operator names such as 'operator+' are now allowed as valid declarator names. Thus the 'operator' syntax can appear *anyplace* a normal declarator name was used before. On the surface, this means that operators can be parsed just like normal functions and methods. However, it also means that operator names can be used in many other SWIG directives like %rename. For example: %rename(__add__) Complex::operator+(const Complex &); (ii) Operators are wrapped *exactly* like normal functions and methods. Internally, the operator name is used directly meaning that the wrapper code might contain statements like this: arg0->operator*((Complex const &)*arg1); This all seems to parse and compile correctly (at least on my machine). (iii) SWIG will no longer wrap a declaration if its symbol table name contains illegal identifier characters. If illegal characters are detected, you will see an error like this: Warning. Can't wrap operator* unless renamed to a valid identifier. The only way to fix this is to use %rename or %name to bind the operator to a nice name like "add" or something. Note: the legal identifier characters are determined by the target language. There are certain issues with friend functions and operators. Sometimes, friends are used to define mixed operators such as adding a Complex and a double together. Currently, SWIG ignores all friend declarations in a class. A global operator declaration can probably be made to work, but you'll have to rename it and it probably won't work very cleanly in the target language since it's not a class member. SWIG doesn't know how to handle operator specifications sometimes used for automatic type conversion. For example: class String { ... operator const char*(); ... }; (this doesn't parse correctly and generates a syntax error). Also: operators no longer show up as separate parse-tree nodes (instead they are normal 'cdecl' nodes). I may separate them as a special case later. See Examples/python/operator for an example. *** SUPER-EXPERIMENTAL NEW FEATURE *** Version 1.3.9 (September 25, 2001) ================================== 9/25/2001: beazley Fixed parsing problem with type declarations like 'char ** const'. SWIG parsed this correctly, but the internal type was represented incorrectly (the pointers and qualifiers were in the wrong order). 9/25/2001: beazley Withdrew experimental feature (noted below) that was causing serious parsing problems. Version 1.3.8 (September 23, 2001) ================================== 9/23/2001: beazley Included improved distutils setup.py file in the Tools directory (look for the setup.py.tmpl file). Contributed by Tony Seward. 9/23/2001: beazley Included two new RPM spec files in the Tools directory. Contributed by Tony Seward and Uwe Steinmann. 9/21/2001: beazley Fixed SF Bug [ #463635 ] Perl5.swg does not compile in Visual C++ 9/21/2001: beazley Two new directives control the creation of default constructors and destructors: %nodefault %makedefault These replace %pragma nodefault and %pragma makedefault. (old code will still work, but documentation will only describe the new directives). 9/21/2001: beazley Fixed SF Bug [ #462354 ] %import broken in 1.3.7. 9/20/2001: beazley Parser modified to ignore out-of-class constructor and destructor declarations. For example: inline Foo::Foo() : Bar("foo") { } inline Foo::~Foo() { } Suggested by Jason Stewart. *** EXPERIMENTAL FEATURE *** 9/20/2001: beazley Modified the parser to ignore forward template class declarations. For example: template class MapIter; Suggested by an email example from Irina Kotlova. 9/20/2001: beazley Fixed problem with undeclared tcl_result variable in the "out" typemap for Tcl. Reported by Shaun Lowry. 9/20/2001: beazley Incorporated changes to make SWIG work with ActivePerl. Contributed by Joel Reed. 9/20/2001: beazley Slight change to the parsing of C++ constructor initializers. For example: class Foo : public Bar { public: Foo() : Bar(...) {...} }; SWIG now discards the contents of the (...) regardless of what might enclosed (even if syntactically wrong). SWIG doesn't need this information and there is no reason to needless add syntax rules to handle all of the possibilities here. 9/20/2001: beazley Change to typemaps for structure members. If you have a structure like this: struct Vector { int *bar; }; The member name 'bar' is now used in any accessor functions. This allows the "in" typemap to be used when setting the value. For example, this typemap %typemap(python,in) int *bar { ... } now matches Vector::bar. It should be noted that this will also match any function with an argument of "int *bar" (so you should be careful). *** NEW FEATURE. POTENTIAL INCOMPATIBILITY *** 9/20/2001: beazley Fixed SF bug #462642 setting string values in structures 9/20/2001: beazley Fixed SF bug #462398 problem with nested templates. 9/20/2001: beazley Fixed SF bug #461626 problem with formatting and C++ comments. 9/20/2001: beazley Fixed SF bug #462845 Wrong ownership of returned objects. 9/19/2001: beazley Fixed SF bug #459367. Default constructors for classes with pure virtual methods. 9/19/2001: beazley Fixed problem with default arguments and class scope. For example: class Foo { public: enum bar { FOO, BAR }; void blah(bar b = FOO); ... } SWIG now correctly generates a default value of "Foo::FOO" for the blah() method above. This used to work in 1.1, but was broken in 1.3.7. Bug reported by Mike Romberg. Version 1.3.7 (September 3, 2001) ================================== 9/02/2001: beazley Added special %ignore directive to ignore declarations. This feature works exactly like %rename. For example: %ignore foo; // Ignore all declarations foo %ignore ::foo; // Only ignore foo in global scope %ignore Spam::foo; // Only ignore in class Spam %ignore *::foo; // Ignore in all classes %ignore can also be parameterized. For example: %ignore foo(int); %ignore ::foo(int); %ignore Spam::foo(int); %ignore *::foo(int); *** NEW FEATURE *** 9/02/2001: cheetah (william fulton) [Java] shadowcode pragma modified so that the code that is output in the shadow file is placed relative to where it is placed in the c/c++ code. This allows support for JavaDoc function comments. 9/01/2001: beazley Fixed SF Patch [ #447791 ] Fix for python -interface option. Submitted by Tarn Weisner Burton. 9/01/2001: beazley SWIG no longer generates default constructors/destructors for a class if it only defines a private/protected constructor or destructor or if any one of its base classes only has private constructors/destructors. This was reported in SF Patch [ #444281 ] nonpublic/default/inhereted ctor/dtor by Marcelo Matus. 9/01/2001: beazley Added patch to Perl5 module that allows constants to be wrapped as constants that don't require the leading $. This feature is enabled using the -const option. Patch contributed by Rich Wales. *** NEW FEATURE *** 8/31/2001: beazley Added parsing support for the 'volatile' type qualifier. volatile doesn't mean anything to SWIG, but it is needed to properly generate prototypes for declarations that use it. It's also been added to make the SWIG type system more complete. *** NEW FEATURE *** 8/30/2001: beazley Added support for parameterized %rename directive. *** This new feature can be used to greatly simplify the task of resolving overloaded methods and functions. *** In prior versions of SWIG, the %rename directive was used to consistently apply an identifier renaming. For example, if you said this: %rename foo bar; Every occurrence of 'foo' would be renamed to 'bar'. Although this works fine for resolving a conflict with a target language reserved word, it is useless for for dealing with overloaded methods. This is because all methods are simply renamed to the same thing (generating the same conflict as before). Therefore, the only way to deal with overloaded methods was to go through and individually rename them all using %name. For example: class Foo { public: virtual void bar(void); %name(bar_i) virtual void bar(int); ... }; To make matters worse, you had to do this for all derived classes too. class Spam : public Foo { public: virtual void bar(void); %name(bar_i) virtual void bar(int); ... }; Needless to say, this makes it extremely hard to resolve overloading without a lot of work and makes it almost impossible to use SWIG on raw C++ .h files. To fix this, %rename now accepts parameter declarators. The syntax has also been changed slightly. For example, the following declaration renames all occurrences of 'bar(int)' to 'bar_i', leaving any other occurrence of 'bar' alone. %rename(bar_i) bar(int); Using this feature, you can now selectively rename certain declarations in advance. For example: %rename(bar_i) bar(int); %rename(bar_d) bar(double); // Include raw C++ header %include "header.h" When %rename is used in this manner, all occurrence of bar(int) are renamed wherever they might occur. More control is obtained through explicit qualification. For example, %rename(bar_i) ::bar(int); only applies the renaming if bar(int) is defined in the global scope. The declaration, %rename(bar_i) Foo::bar(int); applies the renaming if bar(int) is defined in a class Foo. This latter form also supports inheritance. Therefore, if you had a class like this: class Spam : public Foo { public: void bar(int); } The Spam::bar(int) method would also be renamed (since Spam is a subclass of Foo). This latter feature makes it easy for SWIG to apply a consistent renaming across an entire class hierarchy simply by specifying renaming rules for the base class. A class wildcard of * can be used if you want to renaming all matching members of all classes. For example: %rename(bar_i) *::bar(int); will rename all members bar(int) that are defined in classes. It will not renamed definitions of bar(int) in the global scope. The old use of %rename is still supported, but is somewhat enhanced. %rename(foo) bar; // Renames all occurrences of 'bar'. %rename(foo) ::bar; // Rename all 'bar' in global scope only. %rename(foo) *::bar; // Rename all 'bar' in classes only. %rename(foo) Foo::bar; // Rename all 'bar' defined in class Foo. *** NEW FEATURE *** 8/30/2001: beazley Added support for data-member to member-function transformation. For example, suppose you had a structure like this: struct Vector { double x,y; }; Now suppose that you wanted to access x and y through a member function interface instead of the usual SWIG behavior. For example: f.set_x(3.4) # instead of f.x = 3.4 x = f.get_x() # instead of x = f.x To do this, simply use the new %attributefunc directive. For example: %attributefunc(get_%s,set_%s) struct Vector { double x,y; }; %noattributefunc The arguments to %attributefunc are C-style printf format strings that determine the naming convention to use. %s is replaced with the actual name of the data member. SWIG provides a number of printf extensions that might help. For example, if you wanted to title case all of the attributes, you could do this: %attributefunc(get%(title)s,set%(title)s); This will turn an attribute 'bar' to 'getBar()' and 'setBar()'. (someone requested this long ago, but I finally figured how to implement it in a straightforward manner). *** EXPERIMENTAL NEW FEATURE *** 8/30/2001: beazley SWIG now automatically generates default constructors and destructors if none are defined. This used to be enabled with a command line switch -make_default, but most people want these functions anyways. To turn off this behavior use the -no_default option or include the following pragma in the interface file: %pragma no_default; This may break certain interfaces that defined their own constructors/destructors using the same naming convention as SWIG. If so, you will get duplicate symbols when compiling the SWIG wrapper file. *** POTENTIAL INCOMPATIBILITY *** 8/29/2001: beazley Changes to Perl5 shadow class code generation. Iterators are no longer supported (FIRSTKEY, NEXTKEY). Also, attribute access has been changed to rely on inheritance in order to provide better behavior across modules. 8/28/2001: beazley Various obscure improvements to the type system and classes. Strange declarations like this are now wrapped correctly (i.e., the generated wrapper code doesn't cause the C++ compiler to die with a type error). class Foo { public: typedef double Real; Real foo(Real (*op)(Real,Real), Real x, Real y); }; Inheritance of types is also handled correctly. 8/28/2001: beazley Changes to class wrappers. When SWIG sees two classes like this, class X { public: void foo(); ... } class Y : public X { public: void bar(); ... } it now only generates two wrapper functions: X_foo(X *x) { x->foo(); } Y_bar(Y *y) { y->bar(); } Unlike SWIG1.15, the foo() method does *not* propagate to a wrapper function Y_foo(). Instead, the base class method X_foo() must be used. This change should not affect modules that use shadow classes, but it might break modules that directly use the low-level C wrappers. This change is being made for a number of reasons: - It greatly simplifies the implementation of SWIG--especially with anticipated future changes such as overloaded methods. - It results in substantially less wrapper code--especially for big C++ class hierarchies (inherited declarations are no longer copied into every single derived class). - It allows for better code generation across multiple SWIG generated modules (code isn't replicated in every single module). *** POTENTIAL INCOMPATIBILITY *** 8/22/2001: cheetah (william fulton) Provided some Windows documentation in the Win directory and some Visual C++ project files for running examples on Windows. 8/28/2001: mkoeppe [Guile] Handle renamed overloaded functions properly; thanks to Marc Zonzon for the patch. See the new test case name_cxx. 8/27/2001: mkoeppe [Tcl] Removed lots of warnings issued by the Sun Forte compilers, which were caused by mixing function pointers of different linkages (C++/C). 8/23/2001: mkoeppe Improved the MzScheme module by porting Guile's pointer type checking system and making type dispatch typemap-driven. 8/22/2001: beazley Entirely new symbol table processing. SWIG should be able to report much better error messages for multiple declarations. Also, the new symbol table allows for overloaded functions (although overloading isn't quite supported in the language modules yet). 8/22/2001: cheetah (william fulton) * [Java] %new support added. * [Java] Package JNI name refixed! 8/19/2001: beazley Python module modified to support pointers to C++ members. This is an experimental feature. *** NEW FEATURE *** 8/19/2001: beazley Added limited parsing and full type-system support for pointers to members. None of SWIG's language modules really know how to deal with this so this is really only provided for completeness and future expansion. Note: SWIG does not support pointers to members which are themselves pointers to members, references to pointers to members, or other complicated declarations like this. *** NEW FEATURE *** 8/19/2001: beazley SWIG is much better at parsing certain C++ declarations. Operators and friends generally don't cause anymore syntax errors. However, neither are really supported. 8/18/2001: beazley Added *highly* experimental support for wrapping of C++ template declarations. Since C++ templates are essentially glorified macros and SWIG has a fully operational C preprocessor with macro support, the parser now converts template declarations to macros. For example, a function template like this template T max(T a, T b); is internally converted into a macro like this: %define %_template_max(__name,T) %name(__name) T max(T a, T b); %enddef To instantiate a version of the template, a special %template declaration is used like this: %template(maxint) max; %template(maxdouble) max; The parameter to the %template directive must be proper C identifier that's used to uniquely name the resulting instantiation. When used, the the expanded macro looks like this: %name(maxint) int max(int a, int b); %name(maxdouble) double max(double a, double b); A similar technique is used for template classes. For instance: template class vector { T *data; int sz; public: vector(int nitems); T *get(int n); ... }; Gets converted into a macro like this: %define %_template_vector(__name, T) %{ typedef vector __name; %} class __name { T *data; int sz; public: __name(int nitems); T *get(int n); ... }; typedef __name vector; %enddef A specific instantiation is created in exactly the same way: %template(intvec) vector; The resulting code parsed by SWIG is then: %{ typedef vector intvec; %} class intvec { int *data; int sz; public: intvec(int nitems); int *get(int n); ... }; typedef intvec vector; Note: the last typedef is non-standard C and is used by SWIG to provide an association between the name "intvec" and the template type "vector". CAUTION: This is an experimental feature and the first time SWIG has supported C++ templates. Error reporting is essential non-existent. It will probably break in certain cases. *** EXPERIMENTAL NEW FEATURE **** 8/15/2001: beazley Change to wrapping of multi-dimensional arrays. Arrays are now properly mapped to a pointer to an array of one less dimension. For example: int [10]; --> int * int [10][20]; --> int (*)[20]; int [10][20][30]; --> int (*)[20][30]; This change may break certain SWIG extensions because older versions simply mapped all arrays into a single pointer such as "int *". Although possibly unusual, the new version is correct in terms of the C type system. *** POTENTIAL INCOMPATIBILITY *** 8/06/2001: cheetah (william fulton) * [Java] Array setters generated for struct/class array members. 8/13/2001: beazley Many improvements to Tcl/Perl/Python modules to better work with multiple interface files and the %import directive. 8/13/2001: beazley Fixed up the behavior of %import in the Python module. SWIG no longer pollutes the module namespace by using 'from module import *' to refer to the other module. Instead, it does a proper 'import module'. Also, SWIG may work a lot better when importing modules that include references to other imported modules. 8/13/2001: mkoeppe Added new typemap substitutions, generalizing those of the Guile-specific 5/27/2001 changes: * $descriptor is the same as SWIGTYPE$mangle, but also ensures that the type descriptor of this name gets defined. * $*type, $*ltype, $*mangle, $*descriptor are the same as the variants without star, but they REMOVE one level of pointers from the type. (This is only valid for pointer types.) * $&type, $<ype, $&mangle, $&descriptor are the same as the variants without ampersand, but they ADD one level of pointers to the type. The Guile-specific substitution $basedescriptor was removed because it was useless. 8/12/2001: beazley The %extern directive is now deprecated and withdrawn. The purpose of this directive was to import selected definitions from other interface files and headers. However, the same functionality is better handled through %import. This leaves SWIG with two file inclusion directives: %include filename - Inserts into current interface %import filename - Import types and classes from another module *** POTENTIAL INCOMPATIBILITY *** 8/09/2001: beazley Added new support for wrapping C/C++ callback functions. A common problem with some C libraries is that many functions take a function pointer as an argument. For example: int do_op(..., int (*op)(int,int), ...); Unfortunately, the only way to call such a function is to pass it a function pointer of some compatible type. In previous versions of SWIG, you had to solve this problem with some really gross hacks. For example, if you wanted to use the following function as a callback, int foo(int, int); you had to install a pointer to it as a constant. For example: %constant int (*FOO)(int,int) = foo; or const int (*FOO)(int,int) = foo; or if you had a really old SWIG version: typedef int (*OP_FUNC)(int,int); int do_op(..., OP_FUNC, ...); const OP_FUNC FOO = foo; Now, you can do one of two things: %constant int foo(int,int); This creates a constant 'foo' of type int (*)(int,int). Alternatively, you can do this: %callback("%s"); int foo(int,int); int bar(int,int); %nocallback; In this case, the functions are installed as constants where the name is defined by the format string given to %callback(). If the names generated by the format string differ from the actual function name, both a function wrapper and a callback constant are created. For example: %callback("%(upper)s"); int foo(int,int); int bar(int,int); %nocallback; Creates two wrapper functions 'foo', 'bar' and additionally creates two callback constants 'FOO', 'BAR'. Note: SWIG still does not provide automatic support for writing callback functions in the target language. *** NEW FEATURE *** 8/06/2001: cheetah (william fulton) * struct nesting fixes as per SF bug #447488. 8/03/2001: beazley The %name directive now applies to constants created with #define and %constant. However, most language modules were never written to support this and will have to be modified to make it work. Tcl, Python, and Perl modules are working now. *** NEW FEATURE *** 8/03/2001: beazley Massive changes and simplification of C declaration parsing. Although SWIG is still not a full C parser, its ability to handle complex datatypes including pointers to functions and pointers to arrays has been vastly improved. 8/03/2001: cheetah (william fulton) * Distribution fixes: autoconf no longer needed to install SWIG. 8/02/2001: beazley Removed two undocumented parsing features. SWIG no longer supports out-of-class static function or variable declarations. For example: static int Foo::bar; This feature may return if there is sufficient demand. However, since SWIG is most often used with header files, it is more likely for these definitions to be included in the class definition. *** POTENTIAL INCOMPATIBILITY *** 8/02/2001: cheetah (william fulton) * Cleanup of the GIFPlot examples. Upgraded Java GIFPlot example. 8/01/2001: cheetah (william fulton) * [Java] Efficiency changes: _cPtr used where possible rather than getCPtr(). Bug fixes for inheritance - derived class sometimes didn't delete the c memory when _delete() was called. * [Java] Abstract c++ classes are wrapped with a java abstract shadow class. Also a pure virtual function is mapped with an abstract method. * The default output file has always been _wrap.c. It is now _wrap.cxx if the -c++ commandline option is passed to swig. This has been done as otherwise c++ code would appear in a c file. *** POTENTIAL INCOMPATIBILITY *** 7/31/2001: beazley Modified the %constant directive to be more C-like in syntax. The syntax is now: %constant NAME = VALUE; %constant TYPE NAME = VALUE; For example: %constant Foo *Bar = &Spam; A more subtle case is as follows: %constant int (*FOO)(int,int) = blah; *** POTENTIAL INCOMPATIBILITY *** Modules that were using the %constant directive directly will need to be modified. 7/30/2001: beazley Removed obscure and undocumented form of the %inline directive: %inline int blah(int a, int b) { ... } *** POTENTIAL INCOMPATIBILITY *** (note: this feature was never documented and is withdrawn) 7/30/2001: beazley Removed support for functions with no explicitly declared return type. For example: foo(int); In C, such functions were implicitly assumed to return an 'int'. In C++, this is illegal. Either way, it's considered bad style. Removing support for this in SWIG will simplify certain issues in parsing. *** POTENTIAL INCOMPATIBILITY *** 7/30/2001: mkoeppe * Partial merge from the CVS trunk. The Source/DOH directory and most of the Source/Swig directory is up-to-date now. * [Guile] %scheme is now a macro for %insert("scheme"). New syntax: %scheme "FILENAME"; New syntax: %scheme %{ SCHEME-CODE %} New macros %multiple_values, %values_as_list, %values_as_vector. 7/29/2001: beazley %readonly and %readwrite have been turned into SWIG pragmas. %pragma(swig) readonly and %pragma(swig) readwrite. Macros are used to provide backwards compatibility. 7/29/2001: beazley Minor changes to %pragma directive. %pragma must always be directed to a specific language. For example: %pragma(swig) make_default; %pragma(perl5) include = "blah.i"; Also extended the pragma directive to allow code blocks %pragma(foo) code = %{ ... some code ... %} *** POTENTIAL INCOMPATIBILITY *** 7/29/2001: beazley Change to the way 'const' variables are wrapped. In previous versions of SWIG, a 'const' variable was wrapped as a constant. Now, 'const' variables are wrapped as read-only variables. There are several reasons for making this change, mostly pertaining to subtle details of how 'const' actually works. This will probably break old interfaces that used 'const' to create constants. As a replacement, consider using this: const int a = 4; ===> %constant int a = 4; *** POTENTIAL INCOMPATIBILITY *** 7/29/2001: beazley Reorganization and simplification of type parsing. Types with 'const' should work correctly now. 7/29/2001: beazley Most swig directives related to the documentation system are now deprecated. 7/29/2001: beazley Removed support for Objective-C in order to simplify parser reconstruction. Will return if there is sufficient demand. *** POTENTIAL INCOMPATIBILITY *** 7/29/2001: beazley Code inclusion has been modified in the parser. A common directive %insert is now used for everything. This inserts a file into the output: %insert(header) "foo.swg" This inserts some inline code into the output %insert(header) %{ ... some code ... %} There are five predefined targets for the insert directive: "header" - Header section of wrapper file "runtime" - Runtime section of wrapper file "wrapper" - Wrapper section "init" - Initialization function "null" - Nothing. Discard. The following directives are still supported, but are now defined in terms of macros: %{ ... %} -> %insert(header) %{ ... %} %init %{ ... %} -> %insert(init) %{ ... %} %wrapper %{ ... %} -> %insert(wrapper) %{ ... %} %runtime %{ ... %} -> %insert(runtime) %{ ... %} Language modules can define new named targets by using the C API function Swig_register_filebyname() (see main.cxx). For example, if you wanted to expose a shadow class file, you could do this: Swig_register_filebyname("shadow", f_shadow); Then in the interface file: %insert(shadow) %{ ... %} Note: this change should not affect any old interfaces, but does open up new possibilities for enhancements. 7/29/2001: beazley SWIG now always includes a standard library file 'swig.swg'. This file defines a large number of macro definitions that define the behavior of various SWIG directives. Previously, all SWIG directives were handled as special cases in the parser. This made the parser a large bloated mess. Now, the parser is stripped down to a few simple directives and macros are used to handle everything else. 7/26/2001: cheetah (william fulton) * Fixes for Sourceforge bug #444748 - new testcase cpp_static: [TCL] Class with just static member variable/function fix [Java] Fixed static variables support [Ruby] Static variables workaround removed 7/27/2001: mkoeppe * stype.c (SwigType_default): Strip qualifiers first. The default type of "int * const" is now "SWIGPOINTER *". * main.cxx: Define "__cplusplus" in SWIG's preprocessor if in C++ mode. * [Guile]: Added some support for arrays and C++ references, fixing the "constant_pointers" test case. * Moved most tests from the old Guile-specific test-suite to the new test-suite. Also moved perl5/pointer-cxx example there. 7/26/2001: cheetah (william fulton) * Test-suite added. * Initial testcases: constant_pointers cpp_enum defines sizeof_pointers unions virtual_destructor * Make clean improvements. 7/24/2001: cheetah (william fulton) * [Java] Underscores in the package name and/or module name no longer give linking problems. 7/17/2001: cheetah (william fulton) * More parser bug fixes for constant pointers 7/19/2001: mkoeppe * [Guile] Aesthetic improvement in variable wrappers. 7/18/2001: beazley * Fixed core-dump problem in pointer library when freeing character arrays. SF Bug [ #415837 ] pointer lib core dump 7/18/2001: beazley * Fixed problem with default destructors and shadow classes. SF bug #221128. 7/18/2001: beazley * To provide better line-number tracking in interfaces with lots of macros, special locator comments are now generated by the SWIG preprocessor. For example: /*@foo.i,42,BLAH@*/expanded macro/*@@*/ The first /*@...@*/ sequence sets the context to point to the macro code. The /*@@*/ comment terminates the context. The SWIG parser should ignore all of the locator comments as should the C compiler (should such comments end up in generated wrapper code). 7/18/2001: mkoeppe * The parser now handles severely constified types in typemaps. This introduced a new shift/reduce conflict, but only with a heuristic function-pointer catch-all rule. * [Guile]: Added typemaps for severely constified types. * Fixed the "template-whitespace" problem by canonicalizing whitespace, especially around angle brackets and commas. 7/17/2001: mkoeppe * [Guile]: A Scheme file is emitted if the -scmstub FILE.SCM command-line option is used. The %scheme directive (implemented as a macro for a pragma) allows to insert arbitrary code here. In "simple" and "passive" linkage, the file gets filled with define-module and export declarations. 7/17/2001: cheetah (william fulton) * Parser bug fix to support constant pointers, eg int* const ptr. Fixed everywhere - variables, parameters, return types etc. Note that when wrapping a constant pointer variable only the getter is generated. 7/17/2001: mkoeppe * Fixed SF bug #441470 (#define X "//" would not be parsed, see test-suite entry "preproc-1"), reported by T. W. Burton . * Changed the type of character constants to "char", rather than "char *". Changed the individual language modules to keep the old behaviour, except for the Guile module, where it is desired to make them Scheme characters. This fixes SF bug #231409, test-suite entry "char-constant". * Applied patch for DOH/Doh/memory.c by Les Schaffer (avoid required side effects in assert). 7/17/2001: cheetah (william fulton) * Bug fix in parser for virtual destructor with void as parameter * Bug fix in parser #defines embedded within classes/structs/unions Consequently %constant can now also be placed within a struct/class/union. * Bug fix in parser to allow sizeof(*I_am_a_pointer) within a #define 7/16/2001: mkoeppe * Added changes for the Macintosh contributed by Luigi Ballabio . * Some "const" fixes in the code. * [Guile]: Made the constant-wrapper functions much shorter. 7/13/2001: mkoeppe * [Guile]: Some "const" fixes for Guile version 1.3.4. * Handle anonymous arguments with default values and static array members of classes. Both bugs reported by Annalisa Terracina ; see the files Examples/guile/test-suite/static-array-member.i and anonymous-arg.i. Version 1.3.6 (July 9, 2001) ============================= 7/09/2001: cheetah (william fulton) * GIFPlot examples: FOREGROUND and BACKGROUND definition missing after TRANSPARENT #define fix in GIFPlot 7/03/2001: beazley Fixed up the version numbers so that the release is known as 1.3.6. All future releases should have a similar version format. 7/02/2001: mkoeppe * [Python]: Prevent the problem of self.thisown not being defined if the C++ class constructor raised an exception. Thanks to Luigi Ballabio . 6/29/2001: mkoeppe * More portability fixes; fixed "gcc -Wall" warnings. 6/29/2001: cheetah (william fulton) * GIFPlot examples: TRANSPARENT #define multiple times on Solaris (clashes with stream.h). * Multiple definition bug fix for shadow classes. The perl and python modules had workarounds which have been replaced with fixes in the core. Many of the Language::cpp_xxxx functions now set a flag which the derived classes can access through is_multiple_definition() to see whether or not code should be generated. The code below would have produced varying degrees of incorrect shadow class code for the various modules: class TestClass { public: TestClass() {} TestClass(int a) {} ~TestClass() {} unsigned long xyz(short k) {} unsigned long xyz(int n) {} static void static_func() {} static void static_func(int a) {} }; void delete_TestClass(int a); 6/27/2001: mkoeppe * [Perl] Another const-related portability fix. 6/26/2001: cheetah (william fulton) * [Java] Added in cpp_pragma() support with a host of new pragmas - see jswig.html. These are designed for better mixing of Java and c++. It enables the user to specify pure Java classes as bases and/or interfaces for the wrapped c/c++. * [Java] Old pragmas renamed. Warning given for the moment if used. *** POTENTIAL INCOMPATIBILITY FOR JAVA MODULE *** 6/25/2001: mkoeppe * Incorporated more build changes contributed by Wyss Clemens for swig/ruby on cygwin. 6/20/2001: cheetah (william fulton) * Makefile mods so that 'make check' uses the swig options in the makefiles * [Java] Removed Generating wrappers message * [Java] NULL pointer bug fix * [Java] Bug fix for Kaffe JVM 6/20/2001: mkoeppe * SWIG_TypeQuery from common.swg now returns a swig_type_info* rather than a void*. This fixes a problem when using pointer.i and C++, as illustrated by the new test-suite example perl5/pointer-cxx. * Portability fixes (const char *). * Incorporated build changes contributed by Wyss Clemens , which make swig runnable on cygwin. 6/19/2001: cheetah (william fulton) * [Java] Bug fix for SF bug #211144. This fix is a workaround until fixed in the core. 6/19/2001: mkoeppe * [Guile]: Portability fixes for use with the Sun Forte compilers. * [Tcl]: Portability fix (const char *). * [Tcl]: Configure now first tries to find a tclConfig.sh file in order to find the Tcl include directory, library location and library name. * [Python]: Added a few possible library locations. 6/18/2001: mkoeppe * [Guile]: Don't call scm_c_export if nothing is to be exported. Don't warn on %module if module has been set already (this frequently occurs when %import is used). 6/16/2001: mkoeppe * [Guile]: New "passive" linkage, which is appropriate for multi-module extensions without Guile module magic. 6/15/2001: mkoeppe * [Guile]: Fixed printing of smobs (space and angle were missing). * Properly generate type information for base classes imported with the %import directive. Thanks to Marcelo Matus for the report and the patch; this closes SF bug #231619; see also Examples/guile/test-suite/import*. * [Guile]: Fix casting between class and base class; the runtime type system had it the wrong way around; see Examples/guile/test-suite/casts.i * Make typemaps for SWIGPOINTER * with arg name take precedence over those without arg name, to match normal typemap precedence rules. * Fixed the random-line-numbers problem reported as SF bug #217310; thanks to Michael Scharf . * [Guile]: Handle the %name and %rename directives. * New syntax: %name and %rename now optionally take double quotes around the scripting name. This is to allow scripting names that aren't valid C identifiers. 6/14/2001: beazley Made a minor change to the way files are loaded in order to get file/line number reporting correct in the preprocessor. 6/14/2001: mkoeppe * The parser now understands the (non-standard) "long long" types. It is up to the individual language modules to provide typemaps if needed. Reported by Sam Steingold, SF bug #429176. * The parser now understands arguments like "const int * const i". This fixes SF bug #215649. * Fixed the Guile test-suite. 6/13/2001: mkoeppe Partial merge from the CVS trunk at tag "mkoeppe-merge-1". This covers the following changes: | 01/16/01: ttn | Wrote table of contents for Doc/engineering.html. Added section | on CVS tagging conventions. Added copyright to other docs. | 9/25/00 : beazley | Modified the preprocessor so that macro names can start with a '%'. | This may allow new SWIG "directives" to be defined as macros instead | of having to be hard-coded into the parser. | | *** Also a yet-to-be-documented quoting mechanism with backquotes | *** has been implemented? 6/13/2001: mkoeppe * When configure does not find a language, don't use default paths like /usr/local/include; this only causes build problems. * New directory: Examples/Guile/test-suite, where a few bugs in 1.3a5 are demonstrated. * Handle C++ methods that have both a "const" and a "throw" directive (see Examples/Guile/test-suite/cplusplus-throw.i); thanks to Scott B. Drummonds for the report and the fix. * Handle C++ pointer-reference arguments (like "int *& arg") (see Examples/Guile/test-suite/pointer-reference.i, reported as SF bug #432224). * [Ruby] Fixed typo in rubydec.swg; thanks to Lyle Johnson! * Don't stop testing when one test fails. * [Guile, MzScheme] Don't print "Generating wrappers...". 6/12/2001: mkoeppe [Guile] VECTORLENINPUT and LISTLENINPUT now have separate list length variables. TYPEMAP_POINTER_INPUT_OUTPUT attaches argument documentation involving SCM_TYPE to the standard pointer typemaps. INOUT is now an alias for BOTH. 6/12/2001: cheetah (william fulton) Some Java documentation added. [Java] Fixed bugs in import pragma and shadow pragma. 6/12/2001: mkoeppe Fix declarations of SWIG_define_class (Lib/ruby/rubydec.swg) and SWIG_TypeQuery (Lib/common.swg). Thanks to Lyle Johnson for the patches. 6/11/2001: mkoeppe [Guile] Use long instead of scm_bits_t; this makes the generated wrapper code compatible with Guile 1.3.4 again. Thanks to Masaki Fukushima for pointing this out. 6/11/2001: cheetah (william fulton) The generic INSTALL file from autoconf added. Few changes to README file. 6/11/2001: mkoeppe Fixed typo in Makefile.in; thanks to Greg Troxel . 6/08/2001: cheetah (william fulton) make check works again. Examples/GIFPlot configure generated by top level autoconf now. 6/08/2001: mkoeppe Another build change: The new script autogen.sh runs autoconf in the appropriate directories. The top-level configure also configures in Examples/GIFPlot. 6/07/2001: mkoeppe Made the Makefile work with non-GNU make again. 6/07/2001: cheetah (william fulton) [Java] Class/struct members that are arrays of pointers to classes/structs - Shadow class's get/set accessors now use Java classes instead of longs (pointers). [Java] Shadow classes will now clean up memory if function return type is a class/struct. [Java] New example called reference based on the same example from other modules. 6/06/2001: mkoeppe New configure option --with-release-suffix allows for attaching a suffix to the swig binary and the swig runtime libraries. Minor changes to the build system. "swig -swiglib" works again. If invoked with the new option "-ldflags", SWIG prints a line of linker flags needed to link with the runtime library of the selected language module. 6/06/2001: mkoeppe [Guile] gswig_list_p is an int, not a SCM. This typo caused warnings when compiling with a Guile configured with strict C type checking. In INPUT and BOTH typemaps generated by the SIMPLE_MAP macro, use the SCM_TO_C function to convert from Guile to C (rather than C_TO_SCM). Use scm_intprint to print pointers (rather than sprintf). Allow using "-linkage" instead of "-Linkage". 6/05/2001: cheetah (william fulton) [Java] Mods for using inherited c++ classes from Java [Java] New example called class based on the same example from other modules 6/05/2001: cheetah (william fulton) [Java] destructor (_delete()) was not aware of %name renaming [Java] extends baseclass did not know about %name renaming [Java] extends baseclass did extend even when the baseclass was not known to swig [Java] sometimes enum-declarations occurred before the Java class declaration [Java] unrelated enum initialisations no longer appear in Java class [Java] if module ends in '_' correct JNI names are now produced 6/04/2001: cheetah (william fulton) [Java] Shadow class mods - Modified constructor replaces newInstance(). _delete() now thread safe. getCPtr() replaces _self. _selfClass() removed as now redundant. *** POTENTIAL INCOMPATIBILITY FOR JAVA MODULE *** [Java] Not all output java files had SWIG banner. New banner. [Java] Shadow class finalizers are output by default: Command line option -finalize deprecated and replaced with -nofinalize. *** POTENTIAL INCOMPATIBILITY FOR JAVA MODULE *** 6/ 1/2001: mkoeppe [Guile] Cast SCM_CAR() to scm_bits_t before shifting it. This is required for compiling with a Guile configured with strict C type checking. 6/ 1/2001: mkoeppe Added configure option "--with-swiglibdir". 5/31/2001: mkoeppe [Guile] Support multiple parallel lists or vectors in the typemaps provided by list-vector.i. New typemaps file, pointer-in-out.i. 5/25/2001: cheetah (william fulton) [Java] HTML update for examples. 5/28/2001: mkoeppe Minor changes to the build system. Added subdirectory for Debian package control files. 5/28/2001: mkoeppe [Guile] Build a runtime library, libswigguile. 5/28/2001: mkoeppe [Guile] New typemap substitution $*descriptor. Use the {} syntax, rather than the "" syntax for the standard typemaps, in order to work around strange macro-expansion behavior of the SWIG preprocessor. This introduces some extra braces. 5/27/2001: mkoeppe [Guile] Handle pointer types with typemaps, rather than hard-coded. New typemap substitutions $descriptor, $basedescriptor; see documentation. Some clean-up in the variable/constants wrapper generator code. New convenience macro SWIG_Guile_MustGetPtr, which allows getting pointers from smobs in a functional style. New typemap file "list-vector.i", providing macros that define typemaps for converting between C arrays and Scheme lists and vectors. 5/25/2001: cheetah (william fulton) [Java] STL string moved into its own typemap as it is c++ code and it break any c code using the typemaps.i file. - Fixes for wrappers around global variables - applies to primitive types and user types (class/struct) and pointers to these. - Structure member variables and class public member variables getters and setters pass a pointer to the member as was in 1.3a3 and 1.1 (1.3a5 was passing by value) - Parameters that were arrays and return types were incorrectly being passed to create_function() as pointers. - Fix for arrays of enums. [Java] Updated java examples and added two more. [Java] Java module updated from SWIG1.3a3 including code cleanup etc. [Java] enum support added. [Java] Array support implemented [Java] Shadow classes improved - Java objects used rather than longs holding the c pointer to the wrapped structure/c++class 5/22/2001: mkoeppe [Guile] Fixed extern "C" declarations in C++ mode. Thanks to Greg Troxel . 5/21/2001: mkoeppe [Guile] New linkage "module" for creating Guile modules for Guile versions >= 1.5.0. 4/18/2001: mkoeppe [MzScheme] Added typemaps for passing through Scheme_Object pointers. 4/9/2001 : mkoeppe [MzScheme] Added typemaps for `bool'. Inclusion of headers and support routines is now data-driven via mzscheme.i. Headers come from the new file mzschemdec.swg. Don't abort immediately when a type-handling error is reported. When searching for typemaps for enums, fall back to using int, like the Guile backend does. Support char constants. Emit correct wrapper code for variables. 3/12/2001: mkoeppe [Guile] Fixed typemaps for char **OUTPUT, char **BOTH. 3/2/2001 : mkoeppe [Guile] Every wrapper function now gets a boolean variable gswig_list_p which indicates whether multiple values are present. The macros GUILE_APPEND_RESULT, GUILE_MAYBE_VALUES and GUILE_MAYBE_VECTOR use this variable, rather than checking whether the current return value is a list. This allows for typemaps returning a list as a single value (a list was erroneously converted into a vector or a multiple-value object in this case). 3/1/2001 : mkoeppe [Guile] Added support for returning multiple values as vectors, or passing them to a muliple-value continuation. By default, multiple values still get returned as a list. 3/1/2001 : mkoeppe [Guile] Added a "beforereturn" pragma. The value of this pragma is inserted just before every return statement. 3/1/2001 : mkoeppe [Guile] Added support for Guile 1.4.1 procedure documentation formats, see internals.html. 2/26/2001: mkoeppe [Guile] Made the wrapper code compile with C++ if the "-c++" command-line switch is given. Thanks to . 2/26/2001: mkoeppe [Guile] Now two type tables, swig_types and swig_types_initial, are used, as all other SWIG language modules do. This removes the need for the tricky construction used before that the broken Redhat 7.0 gcc doesn't parse. Reported by . 2/26/2001: mkoeppe [Guile] Fixed typemaps for char *OUTPUT, char *BOTH; a bad free() would be emitted. Added typemap for SCM. Version 1.3 Alpha 5 =================== 9/19/00 : beazley [Python] Python module generates more efficient code for creating the return value of a wrapper function. Modification suggested by Jon Travis. 9/19/00 : beazley Library files specified with the -l option are now included at the end of the interface file (reverting to the old behavior). 9/19/00 : beazley Fixed some problems with enum handling. enums are now manipulated as 'int', but cast into the enum type when values are passed to the corresponding C function. 9/19/00 : mkoeppe [Guile] Removed "-with-smobs" command-line option, as this is the default now. Added "-emit-setters" command-line option, which turns on generating procedures-with-setters; see internals.html. 9/18/00 : mkoeppe Incorporated patch #101430, fixing bugs in the Guile module: 1. Some arguments were erroneously taken as *optional* arguments when ignored arguments were present. 2. Guile 1.3.4 was not supported since functions introduced in Guile 1.4 were used. 3. Added handling of `const char *'. 9/17/00 : beazley Fixed problem with failed assertion and large files. 9/17/00 : beazley Fixed problem with the '%' character appearing in added methods and function bodies. Preprocessor bug. Version 1.3 Alpha 4 (September 4, 2000) ======================================= 9/3/00 : ttn Added instructions for maintainers in Examples/README on how to make examples also be useful in the testing framework. Also, "make check" now uses ./Lib by via env var `SWIG_LIB'. This is overridable like so: make chk-swiglib=/my/experimental/swig/Lib check 9/3/00 : beazley Added $typemap variable to typemaps. This gets replaced with a string indicating the typemap that is applied. Feature request from rsalz. 9/3/00 : beazley Experimental optimization to code generation for virtual member functions. If you have two classes like this: class A() { virtual void foo(); } class B() : public A { virtual void foo(); } Swig now will generate a single wrapper function for this A_foo(A *a) { a->foo(); } and use it as the implementation of both A_foo() and B_foo(). This optimization only takes place if both methods are declared as virtual and both take identical parameters. *** EXPERIMENTAL FEATURE *** 9/3/00 : beazley Restored the "memberin" typemap for setting structure members. Unlike the old version, the new version is expanded inline in the wrapper function allowing access to scripting language internals (a sometimes requested feature). The "memberout" typemap is gone. Use the "out" typemaps instead. *** POTENTIAL INCOMPATIBILITY *** 9/3/00 : beazley Attribute set methods no longer return the value of a member. For example: struct Foo { int x; ... } now gets set as follows: void Foo_x_set(Foo *f, int x) { f->x = x; } In SWIG1.1 it used to be this: int Foo_x_set(Foo *f, int x) { return (f->x = x); } This has been changed due to the complexity created by trying to do this with more exotic datatypes such as arrays. It also complicates inlining and handling of the "memberin" typemap. *** POTENTIAL INCOMPATIBILITY *** 9/2/00 : beazley Removed the ptrcast() and ptrmap() functions from the pointer.i library file. Old implementation is incompatible with new type system. *** POTENTIAL INCOMPATIBILITY *** 9/2/00 : beazley New runtime function SWIG_TypeQuery(const char *name) added. This function can be used to extract the type info structure that is used for type-checking. It works with either the nice C name or mangled version of a datatype. For example: swig_type_info *ty = Swig_TypeQuery("int *"); swig_type_info *ty = Swig_TypeQuery("_p_int"); This is an advanced feature that has been added to support some exotic extension modules that need to directly manipulate scripting language objects. *** NEW FEATURE *** 9/2/00 : beazley New directive %types() added. This is used to explicitly list datatypes that should be included in the runtime type-checking code. Normally it is never necessary to use this but sometimes advanced extensions (such as the pointer.i library) may need to manually add types to the type-checker. *** NEW FEATURE *** 8/31/00 : beazley Improved handling of string array variables. For example, a global variable of the form "char name[64]" is automatically managed as a 64 character string. Previously this didn't work at all or required the use of a special typemap. *** NEW FEATURE (Tcl, Perl, Python) *** 8/31/00 : ttn Added Makefile target `check-c++-examples', which uses new files under Examples/C++ contributed by Tal Shalif. Now "make check" also does "make check-c++-examples". Also, expanded actions in `check-gifplot-example' and `check-aliveness'. 8/30/00 : mkoeppe Major clean-up in the Guile module. Added typemap-driven documentation system. Changed to handle more than 10 args. Updated and extended examples. *** NEW FEATURE *** 8/29/00 : beazley Added new %insert directive that inserts the contents of a file into a portion of the output wrapper file. This is only intended for use by writers of language modules. Works as follows: %insert(headers) "file.swg"; %insert(runtime) "file.swg"; %insert(wrappers) "file.swg"; %insert(init) "file.swg"; *** NEW FEATURE *** 8/29/00 : beazley Added new %runtime directive which includes code into the runtime portion of the wrapper code. For example: %runtime %{ ... some internal runtime code ... %} There is no practical reason for ordinary users to use this feature (almost everything can be done using %{ ... %} instead). However, writers of language modules may want to use this in language configuration files. *** NEW FEATURE *** 8/28/00 : beazley Typemaps can now be specified using string literals like this: %typemap(in) int "$target = SvIV($source);"; When code is specified like this, it is *NOT* enclosed inside a local scope (as with older typemap declarations). Note: character escape sequences are interpreted in the code string so if you want to include a quote or some other special character, make sure you use a (\). *** NEW FEATURE *** 8/27/00 : beazley Typemaps have been modified to follow typedef declarations. For example, if you have this: typedef int Number; %typemap(in) int { ... get an integer ... } void foo(Number a); The typemap for 'int' will be applied to the argument 'Number a'. Of course, if you specify a typemap for 'Number' it will take precedence (nor will it ever be applied to an 'int'). *** POTENTIAL INCOMPATIBILITY *** 8/27/00 : beazley Default typemap specification has changed. In older versions of swig, you could do this: %typemap(in) int SWIG_DEFAULT_TYPE { ... } To specify the default handling of a datatype. Now that SWIG follows typedef declarations, this is unnecessary. Simply specifying a typemap for 'int' will work for all variations of integers that are typedef'd to 'int'. Caveat, specifying the default behavior for pointers, references, arrays, and user defined types is a little different. This must be done as follows: %typemap() SWIGPOINTER * { ... a pointer ... } %typemap() SWIGREFERENCE & { ... a reference ... } %typemap() SWIGARRAY [] { ... an array ... } %typemap() SWIGTYPE { ... a user-defined type (by value) ... } *** POTENTIAL INCOMPATIBILITY *** 8/15/00 : dustin The file swig-1.3a1-1.spec has been added to the Tools directory. It can be used to build a redhat package for SWIG, although it will need to be updated for the next public release. 8/15/00 : beazley Typemaps have been completely rewritten. Eventually they may be replaced with something better, but for now they stay. However, there are a number of a significant changes that may trip some people up: 1. Typemap scoping is currently broken. Because of this, the following code won't work. %typemap(in) blah * { ... } class Foo { ... int bar(blah *x); } %typemap(in) blah *; /* Clear typemap */ (this breaks because the code for the class Foo is actually generated after the entire interface file has been processed). This is only a temporary bug. 2. In SWIG1.1, the %apply directive worked by performing a very complex type-aliasing procedure. From this point on, %apply is simply a generalized typemap copy operation. For example, %apply double *OUTPUT { double *x, double *y }; Copies *ALL* currently defined typemaps for 'double *OUTPUT' and copies them to 'double *x' and 'double *y'. Most people probably won't even notice this change in %apply. However, where it will break things is in code like this: %apply double *OUTPUT { double *x }; %typemap(in) double *OUTPUT { ... whatever ... } void foo(double *x); In SWIG1.1, you will find that 'foo' uses the 'double *OUTPUT' rule even though it was defined after the %apply directive (this is the weird aliasing scheme at work). In SWIG1.3 and later, the 'double *OUTPUT' rule is ignored because it is defined after the %apply directive. 3. The %clear directive has been modified to erase all currently defined typemaps for a particular type. This differs from SWIG1.1 where %clear only removed rules that were added using the %apply directive. 4. Typemap matching is now performed using *exact* types. This means that things like this %typemap(in) char * { } %typemap(in) const char * { } are different typemaps. A similar rule applies for pointers, arrays, and references. For example: %typemap(in) double * { } used to apply to 'double &', 'double []', Now, it only applies to 'double *'. If you want a 'double &', you'll need to handle that separately. 5. Array matching has been simplfied. In SWIG1.1, array matching was performed by trying various combinations of dimensions. For example, 'double a[10][20]' was matched as follows: double [10][20] double [ANY][20] double [10][ANY] double [ANY][ANY] In SWIG1.3, only the following matches are attempted: double [10][20] double [ANY][ANY] On the positive side, typemap matching is now *significantly* faster than before. *** POTENTIAL INCOMPATIBILITY *** 8/15/00 : beazley Secret developer feature. Since datatypes are now represented as strings internally, you can bypass limitations of the parser and create a wild datatype by simply enclosing the raw string encoding in backticks (``) and sticking it in the interface file anywhere a type is expected. For example, `a(20).a(10).p.f(int,int)`. This feature is only intended for testing (i.e., you want to see what happens to your language module if it gets a reference to a pointer to an array of pointers to functions or something). *** SICK HACK *** 8/14/00 : beazley Completely new type-system added to the implementation. More details later. 8/11/00 : beazley Cleaned up some of the I/O handling. SWIG no longer generates any temporary files such as _wrap.wrap, _wrap.ii, _wrap.init. Instead, these "files" are kept around in memory as strings (although this is transparent to language modules). 8/4/00 : ttn Added Makefile target "check" and variants. This can be used like "make check" or, to explicitly skip a language LANG: "make skip-LANG=true check". LANG is skipped automatically if ./configure determines that LANG support is insufficient. Currently, the check is limited to doing the equivalent of "make all" in some of the Examples directories. This should be expanded both horizontally (different types of tests) and vertically (after "make all" in an Examples subdir succeeds, do some additional tests with the resulting interpreter, etc). 8/4/00 : ttn Added Makefile target "distclean", which deletes all the files ./configure creates, including config.status and friends. 8/3/00 : harcoh java changes??? [todo: document changes] 7/23/00 : beazley Typemaps have been modified to key off of the real datatypes used in the interface file. This means that typemaps for "const char *" and "char *" will be difference as will typemaps for "Vector" and "Vector *." *** POTENTIAL INCOMPATIBILITY *** This is likely to break interfaces that rely on the odd type handling behavior of typemaps in SWIG1.1--especially with respect to interfaces involving pass-by-value. 7/23/00 : beazley New %constant directive. This directive can be used to create true constants in the target scripting language. It's most simple form is something like this: %constant FOO 42; In this case, the type is inferred from the syntax of the value (in reality, all #define macros are translated into directives of this form). An expanded version is as follows: %constant(Foo *) FOO = &FooObj; In this case, an explicit type can be specified. This latter form may be useful for creating constants that used to be specified as const Foo *FOO = &FooObj; (which are now treated as variables). *** EXPERIMENTAL FEATURE *** The syntax may change in the final release. 7/23/00 : beazley Modified the parser so that variable declarations of the form "const type *a" are handled as variables, not constants. Note: SWIG1.1 handled this case erroneously because const char *a is a pointer variable that can be reassigned. *** POTENTIAL INCOMPATIBILITY *** Note: just because this is the "right" way to do things, doesn't mean it's the most appropriate interpretation. I suspect that many C programmers might use 'const char *' with the intent of creating a constant, without realizing that they've created a reassignable global variable. 7/23/00 : beazley The C/C++ wrapping layer has been completely redesigned and reimplemented. This change should iron out a few rough spots with the handling of datatypes. In addition, the wrapper code is somewhat cleaner. *** POTENTIAL INCOMPATIBILITY *** This change may break interfaces that involve subtle corner-cases with typemaps and the %addmethods directive since some of these features had somewhat type handling behavior in SWIG1.1. 7/23/00 : beazley The "memberin" and "memberout" typemaps are gone for the moment, but they might return as soon as I figure out how to integrate them with some of the streamlined C wrapper functions. *** POTENTIAL INCOMPATIBILITY *** 7/22/00 : beazley A variety of old type handling functions such as print_type(), print_full(), print_mangle(), etc... are gone and have been replaced with a smaller set of functions. See the file Doc/internals.html for details. This will break all third party language modules. *** POTENTIAL INCOMPATIBILITY *** 7/20/00 : beazley Deprecated the %val and %out directives. These directives shouldn't really be necessary since typemaps can be used to achieve similar results. This also cleans up the handling of types and parameters quite a bit. *** POTENTIAL INCOMPATIBILITY *** 7/20/00 : ttn Fixed unspecified-module bug in Guile support and removed more non-"with-smobs" functionality using patches submitted by Matthias Koeppe. Re-enable recognition of "-with-smobs" (with no effect since we use smobs by default now) for the time being. After the 1.3a4 release, this option will signal an error. 7/17/00 : ttn Fixed NULL-input bug in parameter list handling. Reported by Matthias Koeppe. 7/12/00 : beazley Fixed memory leak in Python type-checking code. Reported by Keith Davidson. Bug #109379. 7/10/00 : beazley Changed internal data structures related to function parameters. 7/10/00 : beazley Fixed some bugs related to the handling of the %name() directive and classes in the Tcl module. Problem reported by James Bailey. 7/10/00 : beazley Fixed parsing and enum handling problems with character constants. Reported by Greg Kochanski. 7/10/00 : beazley Removed WrapperFunction class from the core and updated the language module. This will break third party modules. *** POTENTIAL INCOMPATIBILITY *** 7/9/00 : beazley Implementation of SWIG no longer makes use of C++ operator overloading. This will almost certainly break *all* third party language modules that are not part of the main SWIG CVS tree. Sorry. *** POTENTIAL INCOMPATIBILITY *** 7/8/00 : beazley Removed the experimental and undocumented "build" typemap that was intended to work with multiple arguments. Simply too weird to keep around. Besides, a better replacement is in the works. 7/6/00 : ttn Removed non-"with-smobs" functionality (Guile support), i.e., "-with-smobs" is now the default and no longer needs to be specified on the command-line. 7/5/00 : ttn Incorporated Ruby support contributed by Masaki Fukushima. 6/28/00 : ttn Applied more-than-10-args bugfix patch contributed by Matthias Koeppe. 6/27/00 : beazley Rewrote some of the string handling and eliminated the C++ implementation (which is now just a wrapper). 6/27/00 : ttn Added Doc/index.html and Doc/internals.html. The target audience for the latter is new SWIG developers. Version 1.3 Alpha 3 (June 18, 2000) =================================== 6/18/00 : beazley Removed the naming.cxx, hash.cxx, and symbol.cxx files from the SWIG1.1 directory. Continued to migrate things away from the C++ base (although there's still a lot of work to do). 6/17/00 : beazley Added a few more examples to the Examples directory. Still need to do a lot of work on this. 6/16/00 : beazley Added -includeall to follow all #include statements in the preprocessor. 6/15/00 : beazley Tried to fix as many C++ warnings as possible when compiling with the Sun Workshop C++ compiler. Unfortunately, this means that there are a lot of statements that contain string literals of the form (char*)"Blah". 6/15/00: beazley A variety of cleanup and performance optimization in the low-level DOH library. This seems to result in a speedup of 50-100% for preprocessing and other related tasks. 5/10/00 : ttn Applied variable-wrapping bugfix patch contributed by Matthias Koeppe. 4/17/00 : ttn Updated MzScheme support contributed by Oleg Tolmatcev. We now use a `Scheme_Type'-based structure to wrap pointers. 4/11/00 : ttn Incorporated further Guile-support patch by Matthias Koeppe. Typemaps previously deleted have been re-added. There is now exception handling (see Doc/engineering.html). `SWIG_init' is now declared extern only for simple linkage. Some bugs were fixed. 4/06/00 : ttn Incorporated MzScheme support contributed by Oleg Tolmatcev. This includes new directories Lib/mzscheme and Examples/mzscheme. 4/03/00 : ttn Added Examples/guile and children. This is an adaptation of the same-named directory from the SWIG-1.1p5 distribution. Added Guile-specific section to Doc/engineering.html. 4/02/00 : ttn Incorporated new guilemain.i by Martin Froehlich. Incorporated Guile-support rewrite patch by Matthias Koeppe. The command line option "-with-smobs" enables implementation of pointer type handling using smobs, the canonical mechanism for defining new types in Guile. Previous implementation (using strings) is at the moment still supported but deprecated. At some point, "-with-smobs" will be the default and no longer required. 3/13/00 : beazley Added purify patches submitted by Ram Bhamidipaty. 3/02/00 : ttn Added support for different Guile "linkage" schemes. Currently, "-Linkage hobbit" works. Version 1.3 Alpha 2 (March 1, 2000) =================================== 2/29/00 : beazley Made SWIG ignore the 'mutable' keyword. 2/29/00 : beazley Incorporated some patches to the Perl5 module related to the -hide option and the destruction of objects. Patch submitted by Karl Forner. 2/27/00 : ttn Incorporated Guile support contributed by Matthias Koeppe. This includes a cpp macro in Lib/guile/guile.swg and the entire file Lib/guile/typemaps.i. 2/25/00 : ttn Modified configure.in and Makefile.in files to support non-local build (useful in multi-arch environments). 2/24/00 : ttn Incorporated Guile support contributed by Clark McGrew. This works with Guile 1.3, but since it depends heavily on the gh_ interface, it should work for all later versions. It has not been tested with versions before 1.3. WARNING: Code is unstable due to experimentation by ttn. 2/16/00 : beazley A variety of performance improvements to the Python shadow class code generation. Many of these result in substantial runtime performance gains. However, these have come at a cost of requiring the use of Python 1.5.2. For older versions, use 'swig -noopt -python' to turn off these optimization features. Version 1.3 Alpha 1 (February 11, 2000) ======================================= 2/11/00 : Added 'void' to prototype of Python module initializer. Reported by Mark Howson (1/20/00). 2/11/00 : beazley Modified the Python shadow class code to discard ownership of an object whenever it is assigned to a member of another object. This problem has been around for awhile, but was most recently reported by Burkhard Kloss (12/30/99). 2/11/00 : beazley Added braces around macros in the exception.i library. Reported by Buck Hodges (12/19/99) 2/11/00 : beazley Fixed bug in the constraints.i library. Reported by Buck Hodges (12/14/99) 2/11/00 : beazley The %native directive now generates Tcl8 object-style command calls. A full solution for Tcl7 and Tcl8 is still needed. Patch suggested by Mike Weiblen (11/29/99) 2/11/00 : beazley Modified the typemap code to include the $ndim variable for arrays. Patch provided by Michel Sanner (11/12/99). 2/11/00 : beazley Modified the Python module to raise a Runtime error if an attempt is made to set a read-only member of a shadow class. Reported by Michel Sanner (11/5/99). 2/10/00 : The documentation system has been removed. However, it is likely to return at some point in the future. 2/1/00 : Added a number of performance enhancements to the Python shadow classing and type-checking code. Contributed by Vadim Chugunov. 1. Remove _kwargs argument from the shadow wrappers when -keyword option is not specified. This saves us a construction of keyword dictionary on each method call. def method1(self, *_args, **_kwargs): val = apply(test2c.PyClass1_method1, (self,) + _args, _kwargs) return val becomes def method1(self, *_args): val = apply(test2c.PyClass1_method1, (self,) + _args) return val 2. Incorporate self into the _args tuple. This saves at least one tuple allocation per method call. def method1(self, *_args): val = apply(test2c.PyClass1_method1, (self,) + _args) return val becomes def method1(*_args): val = apply(test2c.PyClass1_method1, _args) return val 3. Remove *Ptr classes. Assume that we are SWIGging a c++ class CppClass. Currently SWIG will generate both CppClassPtr class that hosts all methods and also CppClass that is derived from the former and contains just the constructor. When CppClass method is called, the interpreter will try to find it in the CppClass's dictionary first, and only then check the base class. CppClassPtr functionality may be emulated with: import new _new_instance = new.instance def CppClassPtr(this): return _new_instance(CppClass, {"this":this,"thisown":0}) This saves us one dictionary lookup per call. The new module was first added in Python-1.5.2 so it won't work with older versions. I've implemented an alternative that achieves the same thing 4. Use CObjects instead of strings for pointers. Dave: This enhancements result in speedups of up to 50% in some of the preliminary tests I ran. 2/1/00 : Upgraded the Python module to use a new type-checking scheme that is more memory efficient, provides better performance, and is less error prone. Unfortunately, it will break all code that depends on the SWIG_GetPtr() function call in typemaps. These functions should be changed as follows: if (SWIG_GetPtr(string,&ptr,"_Foo_p")) { return NULL; } becomes if (SWIG_ConvertPtr(pyobj, &ptr, SWIG_TYPE_Foo_p) == -1) { return NULL; } Note: In the new implementation SWIG_TYPE_Foo_p is no longer a type-signature string, but rather an index into a type encoding table that contains type information. *** POTENTIAL INCOMPATIBILITY *** 1/30/00 : loic Conditionally compile experimental code with --enable-experiment configure flag. Fix .cvsignore to ignore configure & yacc generated files 1/28/00 : loic Apply automake everywhere Keep configure scripts so that people are not *forced* to autoconf Keep sources generated by yacc so that compilation without yacc is possible. Source/LParse/cscanner.c: change lyacc.h into parser.h to please default yacc generation rules. Use AC_CONFIG_SUBDIRS in configure.in instead of hand made script. Update all relevant .cvsignore to include .deps Fixed missing ; line 136 Source/Swig/swig.h 1/13/00 : beazley Fixed a number of minor end-of-file parsing problems in the preprocessor. 1/13/00 : beazley Added -freeze option that forces SWIG to freeze upon exit. This is only used as a debugging tool so that I can more easily examine SWIG's memory footprint. 1/13/00 : beazley Added patch to guile module for supporting optional arguments Patch contributed by Dieter Baron. 1/13/00 : loic Added .cvsignore, Examples/.cvsignore, Source/DOH/Doh/.cvsignore Source/SWIG1.1/main.cxx: Fixed -I handling bug Source/Modules1.1/java.cxx: fixed char* -> const char* warnings that are errors when compiling with gcc-2.95.2 Source/SWIG1.1/main.cxx: cast const char* to char* for String_replace token and rep should really be const. 1/12/00 : beazley Added Harco's Java modules. 1/12/00 : beazley Revoked the %ifdef, %ifndef, %endif, %if, %elif, and %else directives. These are no longer needed as SWIG now has a real preprocessor. *** POTENTIAL INCOMPATIBILITY *** 1/12/00 : beazley Moved the documentation modules from the SWIG directory to the Modules directory (where they really should have been to begin with). 1/12/00 : beazley Removed the -stat option for printing statistics. The statistics reporting was inadequate and mostly broken anyway. *** POTENTIAL INCOMPATIBILITY *** 1/12/00 : beazley Removed the -t option for reading a typemap file. More trouble than it's worth. Just include typemaps at the top of the interface file. *** POTENTIAL INCOMPATIBILITY *** 1/12/00 : beazley Removed the %checkout directive. *** POTENTIAL INCOMPATIBILITY *** 1/12/00 : beazley Removed the -ci option for file checkin. Too problematic to implement. Probably better to just put your SWIG library under CVS instead. *** POTENTIAL INCOMPATIBILITY ***. 1/11/00 : beazley Deleted the LATEX module. Sorry... Didn't know anyone who was using it. Besides, I'm looking to simplify the documentation system. *** POTENTIAL INCOMPATIBILITY *** 1/11/00 : beazley Modified the ASCII documentation module to use a .txt suffix for its output file instead of .doc. 1/11/00 : beazley Added the long-lost SWIG preprocessor back to the system. It should be enabled by default. Raw preprocessed output can be viewed using swig -E file.i. *** NEW FEATURE *** 1/11/00 : beazley and djmitche Completely reorganized the SWIG directory structure. The basic organization is now: Source/ SWIG source code Lib/ SWIG library files (swig_lib) Doc/ Documentation Examples/ Examples More directories will be added as needed. 12/08/99: Loic Dachary (loic@senga.org) Enhanced package handling for perl5 and c++. With new option -hide Foo::Bar, every perl5 object (Frob) is qualified by Foo::Bar::Frob. The package name is solely used to encapsulate C/C++ wrappers output in _wrap.c and the corresponding perl package in .pm. Note that a package name may contain :: (Frob::Nitz) and will be relative to the package name provided by -hide (Foo::Bar::Frob::Nitz). In *_wrap.c, SWIG_init macro is used. Was previously defined but not used and simplifies code. Added typemap(perl5,perl5in) and typemap(perl5,perl5out) that do the equivalent of typemap(perl5,in) and typemap(perl5,out) but contain perl code and applies to wrappers generated by -shadow. Lacking proper regression tests I used Examples/perl5/{c++,constraint,defarg,except, graph/graph[1234],multinherit,nested,shadow,simple,tree, typemaps/{argv,argv2,arraymember,database,file,ignore,integer, output,passref,reference,return}}/. I ran swig with and without the patches, diff the generatedsources, run the .pl files and checked that the results are identical. In all those examples I had no error. 11/21/99: Modified the Tcl module to provide full variable linking capabilities to all datatypes. In previous versions, a pair of accessor functions were created for datatypes incompatible with the Tcl_LinkVar() function. Now, we simply use variable traces to support everything. This may break scripts that rely upon the older behavior. *** POTENTIAL INCOMPATIBILITY *** 11/21/99: Added slight tweak to wrapper generator to collect local variables of similar type. Produces somewhat more compact wrapper code. 11/20/99: Modified the Tcl module to use SWIG_GetArgs() to parse arguments. This is a technique borrowed from Python in which arguments are converted using a format string convention similiar to fprintf(). This results in a *substantial* reduction in the size of the resulting wrapper code with only a modest runtime overhead in going through the extra conversion function. 11/13/99: Completely rewrote the class/structure generation code for the Tcl module. Now, a small set of runtime functions are used to implement the functionality for all classes (instead of a massive amount of runtime code being generated for each class). Class specific information is simply encoded in a series of static tables. This results in a *HUGE* reduction in wrapper code size--especially for C++. 11/13/99: Removed the -tcl (Tcl 7.x) module. Tcl 8.0 is now several years old and the defacto standard--no real reason to keep supporting the old version at this point. 11/13/99: Cleaned up -c option for Python module. The pyexp.swg file is now gone. 11/13/99: Fixed external declarations to work better with static linking on Windows. Static linking should now be possible by defining the -DSTATIC_LINK option on the command line. Patch contributed by Alberto Fonseca. 11/5/99 : Fixed an obscure code generation bug related to the generation of default constructors. Bug reported by Brad Clements. 11/5/99 : Fixed a few memory problems found by purify. 11/5/99 : Officially deprecated the -htcl, -htk, and -plugin options from the Tcl and Tcl8 modules. 10/26/99: Removed unused variable from python/typemaps.i. Patch contributed by Keith Davidson. 8/16/99 : Added _WIN32 symbol to libraries to better support Windows. 8/16/99 : Deprecated the Perl4 module. It is no longer included in the distribution and no longer supported. In the entire 3 years SWIG has been around I never received a single comment about it so I'm assuming no one will miss it... 8/16/99 : Modified the type-checking code to register type mappings using a table instead of repeated calls to SWIG_RegisterMapping(). This reduces the size of the module initialization function somewhat. 8/15/99 : Cleaned up the pointer type-checking code in the Tcl module. 8/15/99 : Many changes to the libraries to support runtime libraries. 8/13/99 : Eliminated C++ compiler warning messages about extern "C" linkage. 8/13/99 : Some cleanup of Python .swg files to better support runtime libraries on Windows. 8/13/99 : Modified the %pragma directive to attach pragmas declared inside a class definition to the class itself. For example: class foo { ... %pragma(python) addtomethod = "insert:print `hello world'" ... } Most people don't need to worry about how this works. For people writing backend modules, class-based pragmas work like this: lang->cpp_open_class() // Open a class lang->cpp_pragma() // Supply pragmas ... // Emit members lang->cpp_close_class() // Close the class All of the pragmas are passed first since they might be used to affect the code generation of other members. Please see the Python module for an example. Patches contributed by Robin Dunn. 8/13/99 : Patch to Python shadow classes to eliminate ignored exception errors in destructors. Patch contributed by Robin Dunn. 8/11/99 : Minor patch to swig_lib/python/swigptr.swg (added SWIGSTATIC declaration). Patch contributed by Lyle Johnson. 8/11/99 : Added FIRSTKEY/NEXTKEY methods to Perl5 shadow classes Patch contributed by Dennis Marsa. 8/11/99 : Modified Python module so that NULL pointers are returned and passed as 'None.' Patch contributed by Tal Shalif. 8/10/99 : Fixed missing 'int' specifiers in various places. 8/10/99 : Added Windows makefile for Runtime libraries. Contributed by Bob Techentin. 8/10/99 : Fixed minor problem in Python runtime makefile introduced by keyword arguments. 8/8/99 : Changed $target of perl5(out) typemap from ST(0) to ST(argvi). Patch contributed by Geoffrey Hort. 8/8/99 : Fixed bug in typemap checking related to the ANY keyword in arrays and ignored arguments. Error reported by Geoffrey Hort. 8/8/99 : %enabledoc and %disabledoc directives can now be used inside class/structure definitions. However, no check is made to see if they are balanced (i.e., a %disabledoc directive inside a class does not have to have a matching %enabledoc in the same class). 8/8/99 : Keyword argument handling is now supported in the Python module. For example: int foo(char *bar, int spam, double x); Can be called from Python as foo(x = 3.4, bar="hello", spam=42) To enable this feature, run SWIG with the '-keyword' command line option. Mixing keyword and default arguments should work as well. Unnamed arguments are assigned names such as "arg1", "arg2", etc... *** POTENTIAL INCOMPATIBILITY *** Functions with duplicate argument names such as bar(int *OUTPUT, int *OUTPUT) will likely cause problematic wrapper code to be generated. To fix this, use different names or use %apply to map typemaps to alternate names. 8/8/99 : Handling of the 'this' pointer has been changed in Python shadow classes. Previously, dereferencing of '.this' occurred in the Python shadow class itself. Now, this step occurs in the C wrappers using the following function: SWIG_GetPtrObj(PyObject *, void **ptr, char *type) This function can accept either a string containing a pointer or a shadow class instance with a '.this' attribute of appropriate type. This change allows the following: 1. The real shadow class instance for an object is passed to the C wrappers where it can be examined/modified by typemaps. 2. Handling of default/keyword arguments is now greatly simplified. 3. The Python wrapper code is much more simple. Plus, it eliminated more than 300 lines of C++ code in the Python module. *** CAVEAT : This requires the abstract object interface. It should work with Python 1.4, but probably nothing older than that. 8/8/99 : Fixed handling of "const" and pointers in classes. In particular, declarations such as class foo { ... const char *msg; const int *iptr; } are handled as assignable variables as opposed to constant values (this is the correct behavior in C/C++). Note: declarations such as "char *const msg" are still unsupported. Constants declared at the global level using const are also broken (because I have a number of interfaces that rely upon this behavior). *** POTENTIAL INCOMPATIBILITY *** This may break interfaces that mistakenly treat 'const char *' types as constant values. 8/8/99 : Modified the parser to support bit-fields. For example: typedef struct { unsigned int is_keyword : 1; unsigned int is_extern : 1; unsigned int is_static : 1; } flags; Bit-fields can only be applied to integer types and their are other restrictions. SWIG performs no such type-checking (although the C compiler will catch problems when it tries to compile the wrapper code). 8/8/99 : Removed trailing space of $basetype substitution in typemaps. This is to allow things like this: %typemap(python, argout) spam** OUTPUT{ ... char* a = "$basetype_p"; ... } (Patch suggested by Nathan Dunfield). 6/22/99 : Made a very slight tweak to the Perl5 shadow class code that allows typemaps to alter the return type of objects (to support polymorphic types). Patch contributed by Drake Diedrich. 4/8/99 : Fixed null pointer handling bug in Perl module. Patch contributed by Junio Hamano. 3/17/99 : Fixed bug in perl5ptr.swg for ActiveState Perl. Patch contributed by Greg Anderson. 2/27/99 : Eliminated segmentation fault when Swig runs on empty files. 2/27/99 : Added patch to Guile module to eliminate unused variables. Contributed by Mike Simons. 2/27/99 : Fixed problem with %addmethods returning references. 2/27/99 : Fixed Runtime/Makefile. Patch contributed by Mike Romberg. 2/27/99 : Incorporated patches to the type-checker. 2/27/99 : Fixed problem with -exportall switch and shadow classes in Perl5 module. Patch contributed by Dennis Marsa. 2/27/99 : Modified Perl5 module to recognize 'undef' as a NULL char *. Patch contributed by Junio Hamano. 2/27/99 : Fixed the Perl5 module to support the newer versions of ActiveState Perl for Win32. 2/27/99 : Fixed the include order of files specified with the -I option. 2/5/98- : Dave finishes his dissertation, goes job hunting, moves to 2/5/99 Chicago and generally thrashes about. Version 1.1 Patch 5 (February 5, 1998) ====================================== 2/4/98 : Fixed a bug in the configure script when different package locations are specified (--with-tclincl, etc...). 2/2/98 : Fixed name-clash bug related to the switch to C macros for accessor functions. The new scheme did not work correctly for objects with members such as 'obj', 'val', etc... Fixed the bug by appending the word 'swig' to macro argument names. Patch contributed by Rudy Albachten. 2/2/98 : Slight fix to the Perl5 module to eliminate warning messages about 'varname used only once : possible typo'. Fix contributed by Rudy Albachten. 1/9/98 : Fixed a bug in the Perl 5 module related to the creation of constants and shadow classes. 1/9/98 : Fixed linking bug with Python 1.5 embed.i library file. Version 1.1 Patch 4 (January 4, 1998) ===================================== 1/4/98 : Changed structured of the Examples directory to be more friendly to Borland C++. 1/4/98 : Added the function Makefile.win.bc for compiling the examples under Borland 5.2. 1/4/98 : Slight change to the perl5 module and C++ compilation. The library is now included before any Perl headers because Perl the extern "C" linkage of math.h screws alot of things up (especially on Windows). 1/2/98 : Change to the Python module that reduces the number of constants created by C++ classes, inheritance, and shadow classes. This modification may introduce a few slight incompatibilities if you attempt to use the non-shadow class interface with shadow classes enabled. Patch contributed by Mike Romberg. 1/2/98 : Support for Tcl 8.0 namespaces has been added. This *replaces* the original SWIG mechanism that assumed [incr Tcl] namespaces. To use namespaces, simply run SWIG with the following options swig -tcl -namespace foo.i This places everything in a namespace that matches the module name swig -tcl -namespace -prefix bar foo.i This places everything in the namespace 'bar' The use of namespaces is new in Tcl 8.0. However, the wrapper code generated by SWIG will still work with all versions of Tcl newer than and including Tcl 7.3/Tk3.6 even if the -namespace option is used. *** POTENTIAL INCOMPATIBILITY *** This change may break existing applications that relied on the -prefix and -namespace options. 1/2/98 : Added the following constants to the Tcl wrapper code SWIG_name - Name of the SWIG module SWIG_prefix - Prefix/namespace appended to command names SWIG_namespace - Name of the namespace SWIG library writers can use these to their advantages. 1/2/98 : Fixed a bug in the Tcl8 module related to the creation of pointer constants (the function SWIG_MakePtr was missing from the wrapper code). 1/2/98 : Added the consthash.i library file to the Tcl and Tcl8 modules. 1/1/98 : Changed and cleaned up the Python typemaps.i file. The following significant changes were made : 1. The OUTPUT typemap now returns Python tuples instead of lists. Lists can be returned as before by using the L_OUTPUT type. If compatibility with older versions is needed, run SWIG with the -DOUTPUT_LIST option. 2. The BOTH typemap has been renamed to INOUT. For backwards compatibility, the "BOTH" method still exists however. 3. Output typemaps now generate less code than before. Changes to typemaps.i may break existing Python scripts that assume output in the form of a list. *** POTENTIAL INCOMPATIBILITY *** 12/31/97: Fixed long overdue problems with the testing scripts and certain makefiles that required the use of the bash shell. Everything should work properly with the standard Bourne shell (sh) now. 12/31/97: Modified typemaps to allow $basetype as a valid local variable. This allows for all sorts of bizarre hackish typemaps that do cool things. Patch contributed by Dominique Dumont. 12/31/97: Switched accessor functions generated for member data to C preprocessor macros (except in cases involving typemaps or char *). 12/31/97: Fixed a bug related to C++ member data involving references. 12/31/97: Changed accessor functions for C++ member functions to preprocessor macros. This cleans up the wrapper code and results in fewer function definitions. 12/31/97: Changed the default C constructor to use calloc() instead of malloc() 12/30/97: Changed the creation of constants in the Perl5 module. For all practical purposes, they should work in exactly the same way as before except that they now require much less wrapper code. Modules containing large numbers of constants may see greater than a 50% reduction in wrapper code size. 12/30/97: Modified the Python module to be more intelligent about the creation of constants. SWIG no longer generates redundant global variables and the size of the module initialization function should be reduced. (Many thanks to Jim Fulton). 12/29/97: Fixed a bug in C++ code generation related to member functions, default arguments, and references. 12/29/97: Fixed configure script and a few makefiles to support Python 1.5 12/29/97: Added 'embed15.i' library file. This file should be used to statically link versions of Python 1.5. To make it the default, simply copy 'swig_lib/python/embed15.i' to 'swig_lib/python/embed.i' Version 1.1 Patch 3 (November 24, 1997) ======================================== 11/23/97: Fixed a bug in the Perl5 module with shadow classes and static class functions that return class instances. Note : The fix for this bug requires a slight restructuring of of the .pm files created by SWIG. 11/23/97: Fixed a bug in the Tcl/Tcl8 modules related to variable linking of character arrays. If you declared a global variable 'char foo[10]', the generated wrapper code would either cause a segmentation fault immediately upon loading or weird memory corruption elsewhere. This should now be fixed although character arrays can only be read-only. 11/23/97: Fixed a bug with the %import directive that caused it to fail if files were imported from directories other than the current working directory. 11/23/97: Fixed incorrect diagnostic message in the ASCII documentation module. 11/23/97: Changed the behavior of the -o option when used with shadow classes. If -o was used to specify both the pathname and filename of SWIG's output such as swig -o /home/swig/wrapper.c -shadow -perl5 foo.i The wrapper code would be placed the file specified with -o, but the .pm file and documentation would be placed in the directory where SWIG was run. Now, these files are placed in the same directory as the file specified with the -o option. This change is also needed for proper operation on the Macintosh. 11/23/97: Added a 'this()' method to Perl5 shadow classes. This can be used to return the normal pointer value from a shadow class that is represented as a tied hash. To use just invoke as a method like this : $l = new List; # Create an object $ptr = $l->this(); # Get the normal pointer value *** NEW FEATURE *** 11/23/97: Fixed the Tcl 8 pointer.i library file (which was completely broken in 1.1p2). 11/23/97: Modified the Perl5 type-checker to fix a few problems with global variables of pointer types and to allow tied hashes to be used interchangably with normal pointer values. 11/23/97: Modified the typemap mechanism to allow output typemaps of type 'void'. These were ignored previously, but now if you specify, %typemap(lang,out) void { ... return a void ... } You can change or assign a return value to the function. 11/23/97: Fixed processing of 'bool' datatypes in the Python module. 11/23/97: Fixed minor parsing error with C++ initializers. For example, class B : public A { public: B() : A() { ... }; ... } 11/23/97: Fixed the Tcl8 module so that C functions that call back into Tcl don't corrupt the return result object (SWIG was gathering the result object too early which leads to problems if subsequent Tcl calls are made). 11/23/97: Fixed a code generation bug in the Python module when two or more output parameters were used as the first arguments of a function. For example : %include typemaps.i void foo(double *OUTPUT, double *OUTPUT, double a); Previously, doing this resulted in the creation of an extraneous comma in the output, resulting in a C syntax error. 11/22/97: Fixed a bug when template handling that was stripping whitespace around nested templates. For example : Foo > was getting munged into Foo> which is a syntax error in in the C++ compiler. 11/22/97: Fixed bugs in the Borland C++ makefiles. 11/22/97: Fixed memory corruption bug when processing integer arguments in Tcl8 module. 11/21/97: Fixed a bug in the Runtime/Makefile related to Tcl 8. 11/21/97: Fixed a bug with the %new directive and Perl5 shadow classes. No longer generates a perl syntax error. 11/9/97 : Changed a strncpy() to strcpy() in the pointer type-checker. This results in a substantial performance improvement in type-checking. 10/29/97: Fixed a bug in the code generation of default arguments and user-defined types. For example : void foo(Vector a, Vector b = d); should now work properly. Version 1.1 Patch 2 (September 4, 1997) ======================================= 9/4/97 : Fixed problem with handling of virtual functions that was introduced by some changes in the C++ module. Version 1.1 Patch 1 (August 27, 1997) ===================================== 8/26/97 : Fixed compilation and run-time bugs with Tcl 8.0 final. 8/21/97 : Fixed code generation bug with arrays appearing as arguments to C++ member functions. For example : class Foo { public: void Bar(int a[20][20]); }; There is still a bug using arrays with added methods however. 8/20/97 : Fixed a bug with generating the code for added methods involving pass-by-value. 8/19/97 : Modified the typemapper to substitute the '$arg' value when declaring local variables. For example : %typemap(in) double * (double temp_$arg) { ... do something ... } When applied to a real function such as the following : void foo(double *a, double *b, double *result); three local variables will be created as follows : double temp_a; double temp_b; double temp_result; This can be used when writing multiple typemaps that need to access the same local variables. 7/27/97 : Fixed a variety of problems with the %apply directive and arrays. The following types of declarations should now work : %apply double [ANY] { Real [ANY] }; %apply double [4] { double [10] }; A generic version of apply like this : %apply double { Real }; should now work--even if arrays involving doubles and Reals are used later. 7/27/97 : Changed warning message about "Array X has been converted to Y" to only appear if running SWIG in verbose mode. 7/27/97 : Added the variables $parmname and $basemangle to the typemap generator. $parmname is the name of the parameter used when the typemap was matched. It may be "" if no parameter was used. $basemangle is a mangled version of the base datatype. Sometimes used for array handling. 7/27/97 : Changed the behavior of output arguments with Python shadow classes. Originally, if a function returned an object 'Foo', the shadow class mechanism would create code like this : def return_foo(): val = FooPtr(shadowc.return_foo()) val.this = 1 return val The problem with this is that typemaps allow a user to redefine the output behavior of a function--as a result, we can no longer make any assumptions about the return type being a pointer or even being a single value for that matter (it could be a list, tuple, etc...). If SWIG detects the use of output typemaps (either "out" or "argout") it returns the result unmodified like this : def return_foo(): val = shadowc.return_foo() return val In this case, it is up to the user to figure out what to do with the return value (including the possibility of converting it into a Python class). 7/26/97 : Fixed a parsing problem with types like 'unsigned long int', 'unsigned short int', etc... 7/24/97 : Minor bug fix to Tcl 8 module to parse enums properly. Also fixed a memory corruption problem in the type-checker. (patch contributed by Henry Rowley. 7/24/97 : Added Python-tuple typemaps contributed by Robin Dunn. 7/24/97 : Incorporated some changes to the Python module in support of Mark Hammond's COM support. I'm not entirely sure they work yet however. Needs documentation and testing. 7/24/97 : Fixed code generation bugs when structures had array members and typemaps were used. For example : %typemap(memberin) double [20][20] { ... get a double [20][20] ... } struct Foo { double a[20][20]; } Originally, this would generate a compiler-type error when the wrapper code was compiled. Now, a helper function like this is generated : double *Foo_a_set(Foo *a, double val[20][20]) { ... memberin typemap here ... return (double *) val; } When writing typemaps, one can assume that the source variable is an array of the *same* type as the structure member. This may break some codes that managed to work around the array bug. *** POTENTIAL INCOMPATIBILITY *** 7/13/97 : Fixed bug in Perl5 module when using C global variables that are pointers. When used in function calls and other operations, the value of the pointer would be invalid---causing core dumps and other problems. SWIG implements global variables using Perl magic variables. As it turns out, the error was caused by the fact that the pointer-extraction code was somehow bypassing the procedure used to resolve magical variables (hence, leaving the value undefined). To fix the problem, SWIG now explicitly resolves magic before extracting pointer values. 7/12/97 : Eliminated the last remnants of free() and malloc() from the SWIG compiler. 7/12/97 : Fixed parsing problems with typemaps involving arrays and temporary variables of arrays. Also made it possible for SWIG to handle typemaps like this : %typemap(in) double [ANY] (double temp[$dim0]) { ... store data in temp[$dim0] ... } Not only does this typemap match any double [] array, it creates a local variable with precisely the right dimensions. (ie. $dim0 gets filled in with the real number of dimensions). Of course, off the record, this will be a way to add more functionality to the typemaps.i libraries. 7/9/97 : Fixed some problems with Perl5, static linking, and shadow classes. When statically linking multiple modules together, write a top-level interface file like this when shadow classes are not used : %module swig, foo, bar, glob; %include perlmain.i When shadow classes are used, the module names have an extra 'c' appended so it should read as : %module swig, fooc, barc, globc; %include perlmain.i When linking multiple modules, consider using the SWIG runtime library. 7/8/97 : Incorporated fixed versions of the Borland C++ Makefiles. 7/8/97 : First cut at trying to eliminate excessive compiler warnings. As it turns out, alot of warnings go away if you just make declarations like this clientData = clientData; in the resulting wrapper code. Most compilers should just ignore this code (at least would can hope). 7/8/97 : Fixed bizarre code generation bug with typemaps and C++ classes. In some cases, typemaps containing printf formatting strings such as %typemap(memberout) int * { printf("%d",42); } Would generate completely bogus code with garbage replacing the '%d'. Caused by one faulty use of printf (wasn't able to find any other occurrences). 7/7/97 : Fixed bug in Python shadow class generation with non-member functions that are returning more than one value. 7/7/97 : Incorporated modifications to make SWIG work with Guile 1.2. Still need to test it out, but it is rumored to work. 7/2/97 : Fixed some bugs related to output arguments and Python shadow classes. If an output argument is detected, SWIG assumes that the result is a list and handles it appropriately. If the normal return type of an function is an object, it will be converted into a shadow class as before, but with the assumption that it is the first element of a list. *** NOTE : This behavior has been subsequently changed *** 6/29/97 : Changed EXPORT to SWIGEXPORT in all of the language modules. Should provide better compatibility with Windows. 6/29/97 : Modified Python shadow classes so that output arguments work correctly (when typemaps are used). Version 1.1 (June 24, 1997) =========================== 6/24/97 : Fixed Objective-C constructor bug when working with Perl5 shadow classes. 6/23/97 : Fixed some parsing problems with Objective-C. Declarations such as the following should work now : - foo : (int) a with: (int) b; 6/22/97 : Added SWIG Runtime library. This library contains the SWIG pointer type-checker and support functions that are normally included in every module. By using the library, it is easier to work with multiple SWIG generated modules. 6/22/97 : Fixed minor bug in Perl5 module related to static linking of multiple modules. 6/22/97 : Fixed some bugs with the %import directive. When used with Perl5 shadow classes, this generates a 'require' statement to load in external modules. 6/22/97 : Added -swiglib option. This prints out the location of the SWIG library and exits. This option is only really useful to configuration tools that are looking for SWIG and its library location (e.g. autoconf, configure, etc...). 6/21/97 : Fixed export bug with Perl5.004 on Windows-NT. 6/20/97 : Minor change to code generation of class/structure members in order to work better with typemaps. Should have no noticable impact on existing SWIG modules. 6/19/97 : Added -t option. This allows SWIG to load a typemap file before processing any declarations. For example : swig -t typemaps.i -python example.i At most, only one typemap file can be specified in this manner. *** NEW FEATURE *** 6/18/97 : Need a Makefile fast? Type swig [-tcl, -perl5, -python] -co Makefile and you will get a Makefile specific to that target language. You just need to modify it for your application and you're ready to run. 6/18/97 : Completed the -ci option. This option checks a file into the SWIG library. It should be used in conjunction with a language option. For example : swig -tcl -ci foobar.i Checks the file foobar.i into the Tcl part of the library. In order to check a file into the general library (accessible to all languages modules), do the following swig -ci -o ../foobar.i foobar.i (Admittedly this looks a little strange but is unavoidable). The check-in option is primarily designed for SWIG maintenance and library development. The command will fail if the user does not have write permission to the SWIG library. Third party library extensions can easily install themselves by simply providing a shell script that uses 'swig -ci' to install the appropriate library files. It is not necessary to know where the SWIG library is located if you use this mechanism. *** NEW FEATURE *** 6/16/97 : Fixed a bug in shadow class generation when %name() was applied to a class definition. Unfortunately, fixing the bug required a change in the Language C API by adding an extra argument to the Language::cpp_class_decl() function. This may break SWIG C++ extensions. *** POTENTIAL INCOMPATIBILITY *** 6/15/97 : Added a warning message if no module name is specified with the %module directive or -module option. 6/15/97 : Fixed line number bug when reporting errors for undefined base classes. 6/15/97 : Added new %rename directive. This allows the forward declaration of a renaming. For example : %rename OldName NewName; .... later ... int OldName(int); Unlike %name, %rename will rename any occurrence of the old name. This applies to functions, variables, class members and so forth. There is no way to disable %rename once set, but you can change the name by redeclaring it to something else. *** NEW FEATURE *** 6/15/97 : Improved the implementation of the %name directive so that it could be used with conditional compilation : #ifdef SWIG %name(NewName) #endif int OldName(int); 6/15/97 : Added support for functions with no return datatype. In this case, SWIG assumes a return type of 'int'. 6/11/97 : Improved error reporting in the parser. It should be a little less sensitive to errors that occur inside class definitions now. Also reports errors for function pointers. 6/11/97 : Made '$' a legal symbol in identifiers. This is to support some Objective-C libraries. Some compilers (such as gcc) may also allow identifiers to contain a $ in C/C++ code as well (this is an obscure feature of C). When '$' appears in identifier, SWIG remaps it to the string '_S_' when creating the scripting language function. Thus a function 'foo$bar' would be called 'foo_S_bar'. 6/11/97 : Fixed bug in Python shadow classes with __repr__ method. If supplied by the user, it was ignored, but now it should work. 6/9/97 : Fixed the Tcl 8.0 module to work with Tcl 8.0b1. SWIG is no longer compatible with *any* alpha release of Tcl 8.0. *** POTENTIAL INCOMPATIBILITY *** 6/7/97 : Put a maximal error count in (currently set to 20). SWIG will bail out if it generates more errors than this (useful for preventing SWIG from printing 4000 syntax errors when it gets confused). 6/7/97 : Fixed segmentation fault when parsing variable length arguments. 6/7/97 : Minor change to Perl5 module. C++ static functions are now put in the same package as their class when using shadow classes. 6/7/97 : Centralized the naming of functions, members, wrappers etc... By centralizing the naming scheme, it should be possible to make some multi-file optimizations. Also, it should be possible to change SWIG's naming scheme (perhaps a new feature to be added later). 6/2/97 : Added 'arginit' typemap. This can be used to assign initial values to function arguments. Doing so makes it somewhat easier to detect improper argument passing when working with other typemaps. 6/2/97 : Fixed code generation bug when read-only variables were inherited into other classes. Under inheritance, the variables would become writable, but this has now been corrected. 5/30/97 : An empty %name() directive is no longer allowed or supported. This directive was originally used to strip the prefix off of a class or structure. Unfortunately, this never really seemed to work right and it complicated the C++ code generator significantly. As far as I can tell no one uses it, so it is now history. *** POTENTIAL INCOMPATIBILITY *** 5/28/97 : Fixed a parsing bug with #define and C++ comments. Declarations such as the following now work properly : #define CONST 4 // A Comment 5/28/97 : Made some performance improvements to the SWIG String class. (only affects the SWIG compiler itself). 5/28/97 : Modified the parser to skip template definitions and issue a warning message. 5/28/97 : Preliminary support for parameterized types added (ie. templates). Types such as the following should pass through the SWIG compiler void foo(vector *a, vector *b); When used, the entire name 'vector' becomes the name of the datatype. Due to space limitations in datatype representations, the name should not exceed 96 characters. Note : This is only part of what is needed for template support. Template class definitions are not yet supported by SWIG. The template notation above may also be used when specifying Objective-C protocol lists. *** NEW FEATURE *** 5/24/97 : First cut at Objective-C support added. As it turns out, almost everything can be handled with only a few minor modifications to the C++ module. *** NEW FEATURE *** 5/23/97 : Fixed repeated definition bug in multiple inheritance handling when multiple base classes share a common base class (ie. the evil diamond). 5/21/97 : Fixed rather embarrassing typo that worked its way into the Tests/Build directory. 5/19/97 : Fixed code generation bug when using native methods and shadow classes with Python and Perl5 modules. 5/19/97 : Modified the %apply directive slightly so that it would work with pointers a little better. For example : %apply unsigned long { DWORD }; Applies *all* typemaps associated with "unsigned long" to "DWORD". This now includes pointers to the two datatypes. For example, a typemap applied to "unsigned long **" would also be applied to any occurrence of "DWORD **" as well. 5/19/97 : Fixed an ownership assignment bug in the Perl5 module when class members were returning new objects belonging to different classes. 5/17/97 : Added a few more typemap variables. $name - Name of function/variable/member $basetype - Base datatype (type without pointers) $argnum - Argument number 5/16/97 : Fixed embarrassing underscore error in local variable allocator. 5/16/97 : Fixed namespace clash bug in parameterized typemaps when creating arrays as new local variables. 5/15/97 : Fixed some bugs with inheritance of added methods across multiple files. SWIG now uses names of base classes when generating such functions. 5/14/97 : Finished support for default typemaps. Primarily used internally, they can be used to match the basic built-in datatypes used inside of SWIG. You can specify them in interface files as well like this : %typemap(tcl,in) int SWIG_DEFAULT_TYPE { $target = atoi($target); } Unlike normal typemaps, this default map will get applied to *all* integer datatypes encountered, including those renamed with typedef, etc... 5/13/97 : Fixed substring bug in type checker. 5/12/97 : Fixed bug in parameterized typemaps when declaring local variables of structures. Version 1.1 Beta6 (May 9, 1997) =============================== 5/9/97 : Fixed bizarre NULL pointer handling bug in Perl5 module. 5/8/97 : Fixed mysterious segmentation fault when running SWIG on an empty file. 5/7/97 : The code generator will now replace the special symbol "$cleanup" with the cleanup code specified with the "freearg" typemap. This change needed to properly manage memory and exceptions. 5/5/97 : Added the 'typemaps.i' library file. This contains a variety of common typemaps for input values, pointers, and so on. 5/5/97 : Changed behavior of "argout" typemap in Python module. Old versions automatically turned the result into a Python list. The new version does nothing, leaving the implementation up to the user. This provides more flexibility but may break older codes that rely on typemaps. *** POTENTIAL INCOMPATIBILITY *** 5/5/97 : Fixed bug in Python module related to the interaction of "argout" and "ignore" typemaps. 5/5/97 : Fixed bug in Python module that would generate incorrect code if all function arguments are "ignored". 5/4/97 : Added %apply and %clear directives. These form a higher level interface to the typemap mechanism. In a nutshell, they can be used to change the processing of various datatypes without ever having to write a typemap. See the SWIG documentation for more details. ** NEW FEATURE ** 5/4/97 : Added a local variable extension to the typemap handler. For example : %typemap(tcl,in) double *(double temp) { temp = atof($source); $target = &temp; } In this case, 'temp' is a local variable that exists in the entire wrapper function (not just the typemap code). This mechanism provides better support for certain types of argument handling and also makes it possible to write thread-safe typemaps. Any number local variables can be declared by supplying a comma separated list. Local variables are guaranteed to be unique, even if the same typemap is applied many times in a given function. ** Not currently supported in Perl4 or Guile modules. 5/2/97 : Fixed processing of %ifdef, %endif, %if, etc... (These are SWIG equivalents of the C preprocessor directives that can pass through the C preprocessor without modification). 5/2/97 : Fixed major (but subtle) bug in the run-time type checker related to searching and type-checking for C++ inheritance. To make a long story short, if you had two classes named "Foo" and "FooObject" the type checker would sometimes get confused and be unable to locate "Foo" in an internal table. 5/2/97 : Fixed some bugs in the -co option. 4/24/97 : Pointer library added to the SWIG library. 4/19/97 : Added the %new directive. This is a "hint" that can be used to tell SWIG that a function is returning a new object. For example : %new Foo *create_foo(); This tells SWIG that create_foo() is creating a new object and returning a pointer to it. Many language modules may choose to ignore the hint, but when working with shadow classes, the %new is used to handle proper ownership of objects. %new can also be used with dynamically allocated strings. For example : %new char *create_string(); When used, all of the language modules will automatically cleanup the returned string--eliminating memory leaks. ** NEW FEATURE ** 4/19/97 : Added a new typemap "newfree". This is used in conjunction with the %new directive and can be used to change the method by which a new object returned by a function is deleted. 4/19/97 : The symbol "__cplusplus" is now defined in the SWIG interpreter when running with the -c++ option. 4/17/97 : Added support for static member functions when used inside the %addmethods directive. 4/15/97 : Added a special typemap symbol PREVIOUS that can be used to restore a previous typemap. For example : %typemap(tcl,in) int * = PREVIOUS; This is primarily used in library files. 4/13/97 : Added %pragma directive for Perl5 module. Two new pragmas are available : %pragma(perl5) code = "string" %pragma(perl5) include = "file.pl" Both insert code into the .pm file created by SWIG. This can be used to automatically customize the .pm file created by SWIG. 4/13/97 : Scanner modified to only recognize C++ keywords when the -c++ option has been specified. This provides support for C programs that make use of these keywords for identifiers. SWIG may need to be explicitly run with the -c++ option when compiling C++ code (this was allowed, but not recommended in previous versions). **POTENTIAL INCOMPATIBILITY** 4/11/97 : Fixed a rather nasty bug in the Perl5 module related to using variable linking with complex datatypes and pointers. On Unix, code would work (somehow), but would cause an access violation under Windows-NT. The fix should correct the problem, but there may still be a problem using global variables of complex datatypes in conjunction with shadow classes. Fortunately, this sort of thing seems to be relatively rare (considering that the bug has been around for more than a year - yikes!). 4/11/97 : Fixed bizarre constant evaluation bug in Perl5 code generation when running under Windows-NT. 4/8/97 : Bug when using default arguments and C++ references fixed. 4/8/97 : Fixed code generation bugs in Python and Perl5 modules related to using class renaming (applying the %name directive to a class definition) and shadow classes. 4/7/97 : Fixed minor bugs in swigptr.swg, tcl8ptr.swg, and perl5ptr.swg to prevent infinite loops when weird datatypes are passed. 3/29/97 : 'Makefile.win' added. This is used to build most of the examples in the Examples directory under Windows NT/95. 3/27/97 : Fixes to SWIG's error return codes. SWIG now returns non-zero exit codes for certain kinds of errors (which makes it more friendly to makefiles). An overhaul of the error handling is on the to-do list and will probably show up in a later release. 3/25/97 : Bug fix. "freearg" and "argout" typemaps have been fixed in the Perl5 module. In previous versions, function input parameters and function output parameters shared the same memory space--causing all sorts of nasty problems when trying to pass perl values by reference. SWIG now internally makes a "copy" (which is really just a pointer) of affected parameters and uses that. This is done transparently so there is no noticable impact on any SWIG generated modules. This change is probably only noticable to expert users. 3/25/97 : Added type-check to verbose and stat mode. SWIG will now generate a list of all datatypes that were used but undefined (useful for tracking down weird bugs). This is enabled with the -v option (which is now officially known as "overly verbose" mode) or the -stat option. 3/25/97 : Slight change to the parser to make include guards work correctly. For example : #ifndef INTERFACE_I #define INTERFACE_I %module foobar.i ... declarations ... #endif 3/24/97 : %checkout directive added. This allows an interface file to extract files from the SWIG library and place them in the current directory. This can be used to extract scripts and other helper code that might be associated with library files. For example : %checkout array.tcl Will look for a file "array.tcl" in the library and copy it to the current directory. If the file already exists in the directory, this directive does nothing (it will not overwrite an existing file). This only an experimental feature for now. 3/24/97 : SWIG will now look in the SWIG Library for a file if it can't find it in the current directory. As a result, it is easy to make modules from SWIG library files. For example, if you want to make a Python module from the SWIG timers library, just type this in any directory : swig -python timers.i You will get the files timers_wrap.c and timers_wrap.doc in the current directory that you can now compile. The file remains in the SWIG library (although you can check it out using the -co option). *** New Feature *** 3/24/97 : -co option added to SWIG to allow easy access to the SWIG library. When used, this instructs SWIG to check out a library file and place it in the current directory. For example : unix > swig -co array.i array.i checked out from the SWIG library unix > Once in your directory you can customize the file to suit your particular purposes. The checkout option makes it easy to grab library files without knowing anything about the SWIG installation, but it also makes it possible to start including scripts, C code, and other miscellaneous files in the library. For example, you could put a cool script in the library and check it out whenever you wanted to use it. *** New Feature *** 3/24/97 : #pragma export directives added to Tcl output for compiling shared libraries on the Mac. 3/24/97 : Minor changes to wish.i and tclsh.i library files to provide support for the Macintosh. 3/19/97 : SWIG's policy towards NULL pointers has been relaxed. The policy of requiring a special compiler directive -DALLOW_NULL to use NULL pointers is no longer supported. While this may seem "unsafe", it turns out that you can use a "check" typemap to achieve some safety. For example : %typemap(perl5,check) Node * { if (!$target) croak("NULL Pointers not allowed."); } This prevents any NULL value of a "Node *" pointer to be passed to a function. (I think this is much cleaner than the old -DALLOW_NULL hack anyways). 3/19/97 : Fixed pointer handling errors in Perl5 module. Modules no longer core dump when a Perl reference is inadvertently passed in as a C pointer. 3/18/97 : Added a "check" typemap. This can be used to check the validity of function input values. For example : %typemap(perl5,check) int posint { if ($target < 0) croak("Argument is not a positive integer"); } 3/18/97 : Added an $arg variable to Tcl typemaps. This makes it easier to return argument values by "reference". 3/18/97 : Fixed a code generation bug when using C++ references and the %addmethods directive. 3/18/97 : Fixed a few glitches in the typemap module with respect to chaining. For example : %typemap(tcl,in) int { $in // Inserts prexisting typemap printf("Received a %d\n", $target); } This has been allowed for quite some time, but didn't work if no existing typemap was defined. Now, it still doesn't work if no existing typemap is defined, but it issues a warning message. There is some support using default typemaps, but none of the language modules take advantage of it. This should be considered experimental at this time. Version 1.1b5 Patch 1 (March 16, 1997) ====================================== 3/16/97 : Fixed references bug with C++ code generation. 3/16/97 : Fixed initialization bug in the documentation system that was causing weird problems. 3/16/97 : Fixed fatal bug with -c option in the Python module. 3/13/97 : Fixed bug in the documentation system involving the %text directive and sorting. In the old system, %text entries would float to the top of a section because they were "nameless". Now they are attached to the previous declaration and will stay in the proper location relative to the previous entry. Version 1.1b5 (March 12, 1997) ============================== 3/11/97 : Fixed compilation problems introduced by Tcl/Tk 8.0a2. *** INCOMPATIBILITY *** SWIG no longer works with Tcl/Tk 8.0a1. 3/10/97 : Fixed bug with ignored arguments and C++ member functions in the Python module. 3/9/97 : Parsing bugs with nested class definitions and privately declared nested class definitions fixed. 3/9/97 : Fixed a few minor code generation bugs with C++ classes and constructors. In some cases, the resulting wrapper code would not compile properly. SWIG now attempts to use the default copy constructor instead. 3/8/97 : Added a -l option to SWIG that allows additional SWIG library files to be grabbed without having them specified in the interface file. This makes it easier to keep the interface file clean and move certain options into a Makefile. For example : swig -tcl example.i # Build a normal Tcl extension swig -tcl -lwish.i example.i # Build it as a wish extension # by including the 'wish.i' file. swig -python example.i # Build a dynamically loaded extension swig -python -lembed.i example.i # Build a static extension These kinds of options could previously be accomplished with conditional compilation such as : %module example ... #ifdef STATIC %include embed.i #endif 3/8/97 : Incorporated changes to Guile module to use the new gh interface in FSF Guile 1.0. The older gscm interface used in Cygnus Guile releases is no longer supported by SWIG. 3/8/97 : Cleaned up the Tcl Netscape plugin example. It should work with version 1.1 of the plugin now. 3/8/97 : Added better array support to the typemap module. The keyword ANY can now be used to match any array dimension. For example : %typemap(tcl,in) double [ANY] { ... get an array ... } This will match any single-dimensional double array. The array dimension is passed in the variables $dim0, $dim1, ... $dim9. For example : %typemap(tcl,in) double [ANY][ANY][ANY] { printf("Received a double[%d][%d][%d]\n",$dim0,$dim1,$dim2); } Any typemap involving a specific array dimension will override any specified with the ANY tag. Thus, a %typemap(tcl,in) double [5][4][ANY] {} would override a double [ANY][ANY][ANY]. However, overuse of the ANY tag in arrays of high-dimensions may not work as you expect due to the pattern matching rule used. For example, which of the following typemaps has precedence? %typemap(in) double [ANY][5] {} // Avoid this! %typemap(in) double [5][ANY] {} 3/7/97 : Fixed a number of bugs related to multi-dimensional array handling. Typedefs involving multi-dimensional arrays now works correctly. For example : typedef double MATRIX[4][4]; ... extern double foo(MATRIX a); Typecasting of pointers into multi-dimensional arrays is now implemented properly when making C/C++ function calls. 3/6/97 : Fixed potentially dangerous bug in the Tcl Object-oriented interface. Well, actually, didn't fix it but issued a Tcl error instead. The bug would manifest itself as follows: % set l [List] # Create an object ... % set m [List -this $l] # Make $m into an object assuming $l # contains a pointer. # Since $m == $l, $l gets destroyed # (since its the same command name) % $m insert Foo Segmentation fault # Note : the list no longer exists! Now, an error will be generated instead of redefining the command. As in : % set l [List] ... % set m [List -this $l] Object name already exists! Use catch{} to ignore the error. 3/3/97 : Better support for enums added. Datatypes of 'enum MyEnum' and typedefs such as 'typedef enum MyEnum Foo;' now work. 3/3/97 : Parser modified to ignore constructor initializers such as : class Foo : public Bar { int a,b; public: Foo(int i) : a(0), b(i), Bar(i,0) { }; }; 3/3/97 : Modified parser to ignore C++ exception specifications such as : int foo(double) throw(X,Y); 3/3/97 : Added %import directive. This works exactly like %extern except it tells the language module that the declarations are coming from a separate module. This is usually only needed when working with shadow classes. 3/2/97 : Changed pointer type-checker to be significantly more efficient when working with derived datatypes. This has been accomplished by storing type-mappings in sorted order, using binary search schemes, and caching recently used datatypes. For SWIG generated C++ modules that make a large number of C function calls with derived types, this could result in speedups of between 100 and 50000 percent. However, due to the required sorting operation, module loading time may increased slightly when there are lots of datatypes. 3/2/97 : Fixed some C++ compilation problems with Python embed.i library files. 2/27/97 : Slight change to C++ code generation to use copy constructors when returning complex data type by value. 2/26/97 : Fixed bug in Python module with -c option. 2/26/97 : Slight tweak of parser to allow trailing comma in enumerations such as enum Value (ALE, STOUT, LAGER, }; 2/25/97 : Fixed code generation bug in Tcl module when using the %name() directive on a classname. 2/25/97 : Finished code-size optimization of C++ code generation with inheritance of attributes. Inherited attributes now only generate one set of wrapper functions that are re-used in any derived classes. This could provide big code size improvements in some scripting language interfaces. 2/25/97 : Perl5 module modified to support both the Unix and Windows versions. The windows version has been tested with the Activeware port of Perl 5.003 running under Windows 95. The C source generated by SWIG should compile without modification under both versions of Perl, but is now even more hideous than before. 2/25/97 : Modified parser to allow scope resolution operation to appear in expressions and default arguments as in : void foo(int a = Bar::defvalue); 2/25/97 : Fixed bug when resolving symbols inside C++ classes. For example : class Foo { public: enum Value {ALE, STOUT, LAGER}; ... void defarg(Value v = STOUT); }; 2/24/97 : Fixed bug with member functions returning void *. 2/23/97 : Modified Python module to be better behaved under Windows - Module initialization function is now properly exported. It should not be necessary to explicitly export this function yourself. - Bizarre compilation problems when compiling the SWIG wrapper code as ANSI C under Visual C++ 4.x fixed. - Tested with both the stock Python-1.4 distribution and Pythonwin running under Win95. 2/19/97 : Fixed typedef handling bug in Perl5 shadow classes. 2/19/97 : Added exception support. To use it, do the following : %except(lang) { ... try part of the exception ... $function ... catch part of exception ... } $function is a SWIG variable that will be replaced by the actual C/C++ function call in a wrapper function. Thus, a real exception specification might look like this : %except(perl5) { try { $function } catch (char *& sz) { ... process an exception ... } catch(...) { croak("Unknown exception. Bailing out..."); } } 2/19/97 : Added support for managing generic code fragments (needed for exceptions). 2/19/97 : Fixed some really obscure typemap scoping bugs in the C++ handler. 2/18/97 : Cleaned up perlmain.i file by removing some problematic, but seemingly unnecessary declarations. 2/18/97 : Optimized handling of member functions under inheritance. SWIG can now use wrapper functions generated for a base class instead of regenerating wrappers for the same functions in a derived class. This could make a drastic reduction in wrapper code size for C++ applications with deep inheritance hierarchies and lots of functions. 2/18/97 : Additional methods specified with %addmethods can now be inherited along with normal C++ member functions. 2/18/97 : Minor internal fixes to make SWIG's string handling a little safer. 2/16/97 : Moved some code generation of Tcl shadow classes to library files. 2/16/97 : Fixed documentation error of '-configure' method in Tcl modules. 2/16/97 : Modified Perl5 module slightly to allow typemaps to use Perl references. 2/12/97 : Fixed argument checking bug that was introduced by default arguments (function calls with too many arguments would still be executed). Functions now must have the same number of arguments as C version (with possibility of default/optional arguments still supported). 2/12/97 : Fixed default argument bug in Perl5 module when generating wrapper functions involving default arguments of complex datatypes. 2/12/97 : Fixed typemap scoping problems. For example : %typemap(tcl,in) double { .. get a double .. } class Foo { public: double bar(double); } %typemap(tcl,in) double { .. new get double .. } Would apply the second typemap to all functions in Foo due to delayed generation of C++ wrapper code (clearly this is not the desired effect). Problem has been fixed by assigning unique numerical identifiers to every datatype in an interface file and recording the "range of effect" of each typemap. 2/11/97 : Added support for "ignore" and "default" typemaps. Only use if you absolutely know what you're doing. 2/9/97 : Added automatic creation of constructors and destructors for C structs and C++ classes that do not specify any sort of constructor or destructor. This feature can be enabled by running SWIG with the '-make_default' option or by inserting the following pragma into an interface file : %pragma make_default The following pragma disables automatic constructor generation %pragma no_default 2/9/97 : Added -make_default option for producing default constructors and destructors for classes without them. 2/9/97 : Changed the syntax of the SWIG %pragma directive to %pragma option=value or %pragma(lang) option=value. This change makes the syntax a little more consistent between general pragmas and language-specific pragmas. The old syntax still works, but will probably be phased out (a warning message is currently printed). 2/9/97 : Improved Tcl support of global variables that are of structures, classes, and unions. 2/9/97 : Fixed C++ compilation problem in Python 'embed.i' library file. 2/9/97 : Fixed missing return value in perlmain.i library file. 2/9/97 : Fixed Python shadow classes to return an AttributeError when undefined attributes are accessed (older versions returned a NameError). 2/9/97 : Fixed bug when %addmethods is used after a class definition whose last section is protected or private. 2/8/97 : Made slight changes in include file processing to support the Macintosh. 2/8/97 : Extended swigmain.cxx to provide a rudimentary Macintosh interface. It's a really bad interface, but works until something better is written. 1/29/97 : Fixed type-casting bug introduced by 1.1b4 when setting/getting the value of global variables involving complex data types. 1/29/97 : Removed erroneous white space before an #endif in the code generated by the Python module (was causing errors on DEC Alpha compilers). 1/26/97 : Fixed errors when using default/optional arguments in Python shadow shadow classes. 1/23/97 : Fixed bug with nested %extern declarations. 1/21/97 : Fixed problem with typedef involving const datatypes. 1/21/97 : Somewhat obscure, but serious bug with having multiple levels of typedefs fixed. For example : typedef char *String; typedef String Name; Version 1.1 Beta4 (January 16, 1997) ==================================== Note : SWIG 1.1b3 crashed and burned shortly after take off due to a few major run-time problems that surfaced after release. This release should fix most, if not all, of those problems. 1/16/97 : Fixed major memory management bug on Linux 1/14/97 : Fixed bug in functions returning constant C++ references. 1/14/97 : Modified C++ module to handle datatypes better. 1/14/97 : Modified parser to allow a *single* scope resolution operator in datatypes. Ie : Foo::bar. SWIG doesn't yet handle nested classes, so this should be sufficient for now. 1/14/97 : Modified parser to allow typedef inside a C++ class. 1/14/97 : Fixed some problems related to datatypes defined inside a C++ class. SWIG was not generating correct code, but a new scoping mechanism and method for handling datatypes inside a C++ class have been added. 1/14/97 : Changed enumerations to use the value name instead of any values that might have appeared in the interface file. This makes the code a little more friendly to C++ compilers. 1/14/97 : Removed typedef bug that made all enumerations equivalent to each other in the type checker (since it generated alot of unnecessary code). Version 1.1 Beta3 (January 9, 1997) =================================== Note : A *huge* number of changes related to ongoing modifications. 1. Support for C++ multiple inheritance added. 2. Typemaps added. 3. Some support for nested structure definitions added. 4. Default argument handling added. 5. -c option added for building bare wrapper code modules. 6. Rewrote Pointer type-checking to support multiple inheritance correctly. 7. Tcl 8.0 module added. 8. Perl4 and Guile modules resurrected from the dead (well, they at least work again). 9. New Object Oriented Tcl interface added. 10. Bug fixes to Perl5 shadow classes. 11. Cleaned up many of the internal modules of the parser. 12. Tons of examples and testing modules added. 13. Fixed bugs related to use of "const" return values. 14. Fixed bug with C++ member functions returning void *. 15. Changed SWIG configuration script. Version 1.1 Beta2 (December 3, 1996) ==================================== 1. Completely rewrote the SWIG documentation system. The changes involved are too numerous to mention. Basically, take everything you knew about the old system, throw them out, and read the file Doc/doc.ps. 2. Limited support for #if defined() added. 3. Type casts are now allowed in constant expressions. ie #define A (int) 3 4. Added support for typedef lists. For example : typedef struct { double x,y,z; } Vector, *VectorPtr; 5. New SWIG directives (related to documentation system) %style %localstyle %subsection %subsubsection 6. Reorganized the C++ handling and made it a little easier to work with internally. 7. Fixed problem with inheriting data members in Python shadow classes. 8. Fixed symbol table problems with shadow classes in both Python and Perl. 9. Fixed annoying segmentation fault bug in wrapper code generated for Perl5. 10. Fixed bug with %addmethods directive. Now it can be placed anywhere in a class. 11. More test cases added to the SWIG self-test. Documentation tests are now performed along with other things. 12. Reorganized the SWIG library a little bit and set it up to self-document itself using SWIG. 13. Lots and lots of minor bug fixes (mostly obscure, but bugs nonetheless). Version 1.1 Beta1 (October 30, 1996) ==================================== 1. Added new %extern directive for handling multiple files 2. Perl5 shadow classes added 3. Rewrote conditional compilation to work better 4. Added 'bool' datatype 5. %{,%} block is now optional. 6. Fixed some bugs in the Python shadow class module 7. Rewrote all of the SWIG tests to be more informative (and less scary). 8. Rewrote parameter list handling to be more memory efficient and flexible. 9. Changed parser to ignore 'static' declarations. 10. Initializers are now ignored. For example : struct FooBar a = {3,4,5}; 11. Somewhat better parsing of arrays (although it's usually just a better error message now). 12. Lot's of minor bug fixes. Version 1.0 Final (August 31, 1996) =================================== 1. Fixed minor bug in C++ module 2. Fixed minor bug in pointer type-checker when using -DALLOW_NULL. 3. Fixed configure script to work with Python 1.4beta3 4. Changed configure script to allow compilation without yacc or bison. Version 1.0 Final (August 28, 1996) =================================== 1. Changed parser to support more C/C++ datatypes (well, more variants). Types like "unsigned", "short int", "long int", etc... now work. 2. "unions" added to parser. 3. Use of "typedef" as in : typedef struct { double x,y,z; } Vector; Now works correctly. The name of the typedef is used as the structure name. 4. Conditional compilation with #ifdef, #else, #endif, etc... added. 5. New %disabledoc, %enabledoc directives allow documentation to selectively be disabled for certain parts of a wrapper file. 6. New Python module supports better variable linking, constants, and shadow classes. 7. Perl5 module improved with better compatibility with XS and xsubpp. SWIG pointers and now created so that they are compatible with xsubpp pointers. 8. Support for [incr Tcl] namespaces added to Tcl module. 9. %pragma directive added. 10. %addmethods directive added. 11. %native directive added to allow pre-existing wrapper functions to be used. 12. Wrote configure script for SWIG installation. 13. Function pointers now allowed with typedef statements. 14. %typedef modified to insert a corresponding C typedef into the output file. 15. Fixed some problems related to C++ references. 16. New String and WrapperFunction classes add to make generating wrapper code easier. 17. Fixed command line option processing to eliminate core dumps and to allow help messages. 18. Lot's of minor bug fixes to almost all code modules Version 1.0 Beta 3 (Patch 1) July 17, 1996 ========================================== 1.0 Final is not quite ready yet, but this release fixes a number of immediate problems : 1. Compiler errors when using -strict 1 type checking have been fixed. 2. Pointer type checker now recognizes pointers of the form _0_Type correctly. 3. A few minor fixes were made in the Makefile Version 1.0 Beta 3 (June 14, 1996) ================================== There are lots of changes in this release : 1. SWIG is now invoked using the "swig" command instead of "wrap". Hey, swig sounds cooler. 2. The SWIG_LIB environment variable can be set to change the location where SWIG looks for library files. 3. C++ support has been added. You should use the -c++ option to enable it. 4. The %init directive has been replaced by the %module directive. %module constructs a valid name for the initialization function for whatever target language you're using (actually this makes SWIG files a little cleaner). The old %init directive still works. 5. The syntax of the %name directive has been changed. Use of the old one should generate a warning message, but may still work. 6. To support Tcl/Tk on non-unix platforms, SWIG imports a file called swigtcl.cfg from the $(SWIG_LIB)/tcl directory. I don't have access to an NT machine, but this file is supposedly allows SWIG to produce wrapper code that compiles on both UNIX and non UNIX machines. If this doesn't work, you'll have to edit the file swigtcl.cfg. Please let me know if this doesn't work so I can update the file as necessary. 7. The SWIG run-time typechecker has been improved. You can also now redefine how it works by supplying a file called "swigptr.cfg" in the same directory as your SWIG interface files. By default, SWIG reads this file from $(SWIG_LIB)/config. 8. The documentation system has been changed to support the following : - Documentation order is printed in interface file order by default. This can be overridden by putting an %alpha directive in the beginning of the interface file. - You can supply additional documentation text using %text %{ put your text here %} - A few minor bugs were fixed. 9. A few improvements have been made to the handling of command line options (but it's still not finished). 10. Lots of minor bug fixes in most of the language modules have been made. 11. Filenames have been changed to 8.3 for compatibility with a SWIG port to non-unix platforms (work in progress). 12. C++ file suffix is now .cxx (for same reason). 13. The documentation has been upgraded significantly and is now around 100 pages. I added new examples and a section on C++. The documentation now includes a Table of Contents. 14. The SWIG Examples directory is still woefully sparse, but is getting better. Special notice about C++ ------------------------ This is the first version of SWIG to support C++ parsing. Currently the C++ is far from complete, but seems to work for simple cases. No work has been done to add special C++ processing to any of the target languages. See the user manual for details about how C++ is handled. If you find problems with the C++ implementation, please let me know. Expect major improvements in this area. Note : I have only successfully used SWIG and C++ with Tcl and Python. Notice about Version 1.0Final ----------------------------- Version 1.0B3 is the last Beta release before version 1.0 Final is released. I have frozen the list of features supported in version 1.0 and will only fix bugs as they show up. Work on SWIG version 2.0 is already in progress, but is going to result in rather significant changes to SWIG's internal structure (hopefully for the better). No anticipated date for version 2.0 is set, but if you've got an idea, let me know. Version 1.0 Beta 2 (April 26, 1996) =================================== This release is identical to Beta1 except a few minor bugs are fixed and the SWIG library has been updated to work with Tcl 7.5/Tk 4.1. A tcl7.5 examples directory is now included. - Fixed a bug in the Makefile that didn't install the libraries correctly. - SWIG Library files are now updated to work with Tcl 7.5 and Tk 4.1. - Minor bug fixes in other modules. Version 1.0 Beta 1 (April 10, 1996). ===================================== This is the first "semi-official" release of SWIG. It has a number of substantial improvements over the Alpha release. These notes are in no particular order--hope I remembered everything.... 1. Tcl/Tk SWIG is known to work with Tcl7.3, Tk3.6 and later versions. I've also tested SWIG with expect-5.19. Normally SWIG expects to use the header files "tcl.h" and "tk.h". Newer versions of Tcl/Tk use version numbers. You can specify these in SWIG as follows : % wrap -htcl tcl7.4.h -htk tk4.0.h example.i Of course, I prefer to simply set up symbolic links between "tcl.h" and the most recent stable version on the machine. 2. Perl4 This implementation has been based on Perl-4.035. SWIG's interface to Perl4 is based on the documentation provided in the "Programming Perl" book by Larry Wall, and files located in the "usub" directory of the Perl4 distribution. In order to compile with Perl4, you'll need to link with the uperl.o file found in the Perl4 source directory. You may want to move this file to a more convenient location. 3. Perl5 This is a somewhat experimental implementation, but is alot less buggy than the alpha release. SWIG operates independently of the XS language and xsubpp supplied with Perl5. Currently SWIG produces the necessary C code and .pm file needed to dynamically load a module into Perl5. To support Perl5's notion of modules and packages (as with xsubpp), you can use the following command line options : % wrap -perl5 -module MyModule -package MyPackage example.i Note : In order for dynamic loading to be effective, you need to be careful about naming. For a module named "MyModule", you'll need to create a shared object file called "MyModule.so" using something like % ld -shared my_obj.o -o MyModule.so The use of the %init directive must match the module name since Perl5 calls a function "boot_ModuleName" in order to initialize things. See the Examples directory for some examples of how to get things to work. 4. Python1.3 This is the first release supporting Python. The Python port is experimental and may be rewritten. Variable linkage is done through functions which is sort of a kludge. I also think it would be nice to import SWIG pointers into Python as a new object (instead of strings). Of course, this needs a little more work. 5. Guile3 If you really want to live on the edge, pick up a copy of Guile-iii and play around with this. This is highly experimental---especially since I'm not sure what the official state of Guile is these days. This implementation may change at any time should I suddenly figure out better ways to do things. 6. Extending SWIG SWIG is written in C++ although I tend to think of the code as mostly being ANSI C with a little inheritance thrown in. Each target language is implemented as a C++ class that can be plugged into the system. If you want to add your own modifications, see Appendix C of the user manual. Then take a look at the "user" directory which contains some code for building your own extenions. 7. The SWIG library The SWIG library is still incomplete. Some of the files mentioned in the user manual are unavailable. These files will be made available when they are ready. Subscribe to the SWIG mailing list for announcements and updates. 8. SWIG Documentation I have sometimes experienced problems viewing the SWIG documentation in some postscript viewers. However, the documentation seems to print normally. I'm working on making much of the documentation online, but this takes time. Version 0.1 Alpha (February 9, 1996) ==================================== 1. Run-time type-checking of SWIG pointers. Pointers are now represented as strings with both numeric and encoded type information. This makes it a little harder to shoot yourself in the foot (and it eliminates some segmentation faults and other oddities). 2. Python 1.3 now supported. 3. #define and enum can be used to install constants. 4. Completely rewrote the %include directive and made it alot more powerful. 5. Restructured the SWIG library to make it work better. 6. Various bug fixes to Tcl, Perl4, Perl5, and Guile implementations. 7. Better implementation of %typedef directive. 8. Made some changes to SWIG's class structure to make it easier to expand. SWIG is now built into a library file that you can use to make your own extenions. 9. Made extensive changes to the documentation. 10. Minor changes to the SWIG parser to make it use less memory. Also took out some extraneous rules that were undocumented and didn't work in the first place. 11. The SWIG library files "tclsh", "wish", "expect", etc... in the first release have been restructured and renamed to "tclsh.i", "wish.i", and so on. swig-4.0.1/Examples/0000755000175000017500000000000013527063513014126 5ustar williamwilliamswig-4.0.1/Examples/pike/0000755000175000017500000000000013527063513015056 5ustar williamwilliamswig-4.0.1/Examples/pike/class/0000755000175000017500000000000013527063513016163 5ustar williamwilliamswig-4.0.1/Examples/pike/class/example.i0000644000175000017500000000021513527063513017766 0ustar williamwilliam/* File : example.i */ %module example %{ #include "example.h" %} /* Let's just grab the original header file here */ %include "example.h" swig-4.0.1/Examples/pike/class/example.cxx0000644000175000017500000000065013527063513020343 0ustar williamwilliam/* File : example.cxx */ #include "example.h" #define M_PI 3.14159265358979323846 /* Move the shape to a new location */ void Shape::move(double dx, double dy) { x += dx; y += dy; } int Shape::nshapes = 0; double Circle::area() { return M_PI*radius*radius; } double Circle::perimeter() { return 2*M_PI*radius; } double Square::area() { return width*width; } double Square::perimeter() { return 4*width; } swig-4.0.1/Examples/pike/class/example.h0000644000175000017500000000107613527063513017773 0ustar williamwilliam/* File : example.h */ class Shape { public: Shape() { nshapes++; } virtual ~Shape() { nshapes--; } double x, y; void move(double dx, double dy); virtual double area() = 0; virtual double perimeter() = 0; static int nshapes; }; class Circle : public Shape { private: double radius; public: Circle(double r) : radius(r) { } virtual double area(); virtual double perimeter(); }; class Square : public Shape { private: double width; public: Square(double w) : width(w) { } virtual double area(); virtual double perimeter(); }; swig-4.0.1/Examples/pike/class/Makefile0000644000175000017500000000130213527063513017617 0ustar williamwilliamTOP = ../.. SWIGEXE = $(TOP)/../swig SWIG_LIB_DIR = $(TOP)/../$(TOP_BUILDDIR_TO_TOP_SRCDIR)Lib CXXSRCS = example.cxx TARGET = example INTERFACE = example.i LIBS = -lm check: build $(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' pike_run build: $(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' CXXSRCS='$(CXXSRCS)' \ SWIG_LIB_DIR='$(SWIG_LIB_DIR)' SWIGEXE='$(SWIGEXE)' \ TARGET='$(TARGET)' INTERFACE='$(INTERFACE)' pike_cpp static: $(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' CXXSRCS='$(CXXSRCS)' \ SWIG_LIB_DIR='$(SWIG_LIB_DIR)' SWIGEXE='$(SWIGEXE)' \ TARGET='mypike' INTERFACE='$(INTERFACE)' pike_cpp_static clean: $(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' pike_clean swig-4.0.1/Examples/pike/class/runme.pike0000644000175000017500000000250613527063513020166 0ustar williamwilliamimport .example; int main() { // ----- Object creation ----- write("Creating some objects:\n"); Circle c = Circle(10.0); write(" Created circle.\n"); Square s = Square(10.0); write(" Created square.\n"); // ----- Access a static member ----- write("\nA total of " + Shape_nshapes_get() + " shapes were created\n"); // ----- Member data access ----- // Set the location of the object c->x_set(20.0); c->y_set(30.0); s->x_set(-10.0); s->y_set(5.0); write("\nHere is their current position:\n"); write(" Circle = (%f, %f)\n", c->x_get(), c->y_get()); write(" Square = (%f, %f)\n", s->x_get(), s->y_get()); // ----- Call some methods ----- write("\nHere are some properties of the shapes:\n"); write(" The circle:\n"); write(" area = %f.\n", c->area()); write(" perimeter = %f.\n", c->perimeter()); write(" The square:\n"); write(" area = %f.\n", s->area()); write(" perimeter = %f.\n", s->perimeter()); write("\nGuess I'll clean up now\n"); /* See if we can force 's' to be garbage-collected */ s = 0; /* Now we should be down to only 1 shape */ write("%d shapes remain\n", Shape_nshapes_get()); /* Done */ write("Goodbye\n"); return 0; } swig-4.0.1/Examples/pike/enum/0000755000175000017500000000000013527063513016022 5ustar williamwilliamswig-4.0.1/Examples/pike/enum/example.i0000644000175000017500000000021713527063513017627 0ustar williamwilliam/* File : example.i */ %module example %{ #include "example.h" %} /* Let's just grab the original header file here */ %include "example.h" swig-4.0.1/Examples/pike/enum/example.cxx0000644000175000017500000000150713527063513020204 0ustar williamwilliam/* File : example.c */ #include "example.h" #include void Foo::enum_test(speed s) { if (s == IMPULSE) { printf("IMPULSE speed\n"); } else if (s == WARP) { printf("WARP speed\n"); } else if (s == LUDICROUS) { printf("LUDICROUS speed\n"); } else { printf("Unknown speed\n"); } } void enum_test(color c, Foo::speed s) { if (c == RED) { printf("color = RED, "); } else if (c == BLUE) { printf("color = BLUE, "); } else if (c == GREEN) { printf("color = GREEN, "); } else { printf("color = Unknown color!, "); } if (s == Foo::IMPULSE) { printf("speed = IMPULSE speed\n"); } else if (s == Foo::WARP) { printf("speed = WARP speed\n"); } else if (s == Foo::LUDICROUS) { printf("speed = LUDICROUS speed\n"); } else { printf("speed = Unknown speed!\n"); } } swig-4.0.1/Examples/pike/enum/example.h0000644000175000017500000000031513527063513017625 0ustar williamwilliam/* File : example.h */ enum color { RED, BLUE, GREEN }; class Foo { public: Foo() { } enum speed { IMPULSE, WARP, LUDICROUS }; void enum_test(speed s); }; void enum_test(color c, Foo::speed s); swig-4.0.1/Examples/pike/enum/Makefile0000644000175000017500000000130213527063513017456 0ustar williamwilliamTOP = ../.. SWIGEXE = $(TOP)/../swig SWIG_LIB_DIR = $(TOP)/../$(TOP_BUILDDIR_TO_TOP_SRCDIR)Lib CXXSRCS = example.cxx TARGET = example INTERFACE = example.i LIBS = -lm check: build $(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' pike_run build: $(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' CXXSRCS='$(CXXSRCS)' \ SWIG_LIB_DIR='$(SWIG_LIB_DIR)' SWIGEXE='$(SWIGEXE)' \ TARGET='$(TARGET)' INTERFACE='$(INTERFACE)' pike_cpp static: $(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' CXXSRCS='$(CXXSRCS)' \ SWIG_LIB_DIR='$(SWIG_LIB_DIR)' SWIGEXE='$(SWIGEXE)' \ TARGET='mypike' INTERFACE='$(INTERFACE)' pike_cpp_static clean: $(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' pike_clean swig-4.0.1/Examples/pike/enum/runme.pike0000644000175000017500000000165613527063513020032 0ustar williamwilliamint main() { write("*** color ***\n"); write(" RED = " + .example.RED + "\n"); write(" BLUE = " + .example.BLUE + "\n"); write(" GREEN = " + .example.GREEN + "\n"); write("\n*** Foo::speed ***\n"); write(" Foo_IMPULSE = " + .example.Foo.IMPULSE + "\n"); write(" Foo_WARP = " + .example.Foo.WARP + "\n"); write(" Foo_LUDICROUS = " + .example.Foo.LUDICROUS + "\n"); write("\nTesting use of enums with functions\n\n"); .example.enum_test(.example.RED, .example.Foo.IMPULSE); .example.enum_test(.example.BLUE, .example.Foo.WARP); .example.enum_test(.example.GREEN, .example.Foo.LUDICROUS); .example.enum_test(1234, 5678); write("\nTesting use of enum with class method\n"); .example.Foo f = .example.Foo(); f->enum_test(.example.Foo.IMPULSE); f->enum_test(.example.Foo.WARP); f->enum_test(.example.Foo.LUDICROUS); return 0; } swig-4.0.1/Examples/pike/enum/README0000644000175000017500000000056113527063513016704 0ustar williamwilliamThis example will not compile with Pike versions 7.4.20 unless you first patch the Pike sources. The problem is for line 91 of Pike's "stralloc.h" (usually installed as /usr/local/pike/7.4.10/include/pike/stralloc.h). That line reads: tmp.ptr=ptr; but should be patched to read: tmp.ptr=(p_wchar0 *) ptr; This bug has been reported to the Pike developers. swig-4.0.1/Examples/pike/template/0000755000175000017500000000000013527063513016671 5ustar williamwilliamswig-4.0.1/Examples/pike/template/example.i0000644000175000017500000000051413527063513020476 0ustar williamwilliam/* File : example.i */ %module example %{ #include "example.h" %} /* Let's just grab the original header file here */ %include "example.h" /* Now instantiate some specific template declarations */ %template(maxint) max; %template(maxdouble) max; %template(vecint) vector; %template(vecdouble) vector; swig-4.0.1/Examples/pike/template/example.h0000644000175000017500000000077713527063513020510 0ustar williamwilliam/* File : example.h */ // Some template definitions template T max(T a, T b) { return a>b ? a : b; } template class vector { T *v; int sz; public: vector(int _sz) { v = new T[_sz]; sz = _sz; } T &get(int index) { return v[index]; } void set(int index, T &val) { v[index] = val; } #ifdef SWIG %extend { T getitem(int index) { return $self->get(index); } void setitem(int index, T val) { $self->set(index,val); } } #endif }; swig-4.0.1/Examples/pike/template/Makefile0000644000175000017500000000135513527063513020335 0ustar williamwilliamTOP = ../.. SWIGEXE = $(TOP)/../swig SWIG_LIB_DIR = $(TOP)/../$(TOP_BUILDDIR_TO_TOP_SRCDIR)Lib CXXSRCS = TARGET = example INTERFACE = example.i LIBS = -lm SWIGOPT = check: build $(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' pike_run build: $(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' CXXSRCS='$(CXXSRCS)' \ SWIG_LIB_DIR='$(SWIG_LIB_DIR)' SWIGEXE='$(SWIGEXE)' \ SWIGOPT='$(SWIGOPT)' TARGET='$(TARGET)' INTERFACE='$(INTERFACE)' pike_cpp static: $(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' CXXSRCS='$(CXXSRCS)' \ SWIG_LIB_DIR='$(SWIG_LIB_DIR)' SWIGEXE='$(SWIGEXE)' \ SWIGOPT='$(SWIGOPT)' TARGET='mypike' INTERFACE='$(INTERFACE)' pike_cpp_static clean: $(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' pike_clean swig-4.0.1/Examples/pike/template/runme.pike0000644000175000017500000000134613527063513020675 0ustar williamwilliamint main() { // Call some templated functions write(sprintf("%d\n", .example.maxint(3, 7))); write(sprintf("%f\n", .example.maxdouble(3.14, 2.18))); // Create some objects .example.vecint iv = .example.vecint(100); .example.vecdouble dv = .example.vecdouble(1000); for (int i = 0; i < 100; i++) { iv->setitem(i, 2*i); } for (int i = 0; i < 1000; i++) { dv->setitem(i, 1.0/(i+1)); } int isum = 0; for (int i = 0; i < 100; i++) { isum += iv->getitem(i); } write(sprintf("%d\n", isum)); float fsum = 0.0; for (int i = 0; i < 1000; i++) { fsum += dv->getitem(i); } write(sprintf("%f\n", fsum)); return 0; } swig-4.0.1/Examples/pike/simple/0000755000175000017500000000000013527063513016347 5ustar williamwilliamswig-4.0.1/Examples/pike/simple/example.i0000644000175000017500000000015213527063513020152 0ustar williamwilliam/* File : example.i */ %module example %inline %{ extern int gcd(int x, int y); extern double Foo; %} swig-4.0.1/Examples/pike/simple/Makefile0000644000175000017500000000123313527063513020006 0ustar williamwilliamTOP = ../.. SWIGEXE = $(TOP)/../swig SWIG_LIB_DIR = $(TOP)/../$(TOP_BUILDDIR_TO_TOP_SRCDIR)Lib SRCS = example.c TARGET = example INTERFACE = example.i check: build $(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' pike_run build: $(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' SRCS='$(SRCS)' \ SWIG_LIB_DIR='$(SWIG_LIB_DIR)' SWIGEXE='$(SWIGEXE)' \ TARGET='$(TARGET)' INTERFACE='$(INTERFACE)' pike static: $(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' SRCS='$(SRCS)' \ SWIG_LIB_DIR='$(SWIG_LIB_DIR)' SWIGEXE='$(SWIGEXE)' \ TARGET='mypike' INTERFACE='$(INTERFACE)' pike_static clean: $(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' pike_clean swig-4.0.1/Examples/pike/simple/runme.pike0000644000175000017500000000071513527063513020352 0ustar williamwilliamint main() { /* Call our gcd() function */ int x = 42; int y = 105; int g = .example.gcd(x, y); write("The gcd of %d and %d is %d\n", x, y, g); /* Manipulate the Foo global variable */ /* Output its current value */ write("Foo = %f\n", .example->Foo_get()); /* Change its value */ .example->Foo_set(3.1415926); /* See if the change took effect */ write("Foo = %f\n", .example->Foo_get()); return 0; } swig-4.0.1/Examples/pike/simple/example.c0000644000175000017500000000036713527063513020154 0ustar williamwilliam/* File : example.c */ /* A global variable */ double Foo = 3.0; /* Compute the greatest common divisor of positive integers */ int gcd(int x, int y) { int g; g = y; while (x > 0) { g = x; x = y % x; y = g; } return g; } swig-4.0.1/Examples/pike/check.list0000644000175000017500000000011213527063513017022 0ustar williamwilliam# see top-level Makefile.in class constants enum overload simple template swig-4.0.1/Examples/pike/overload/0000755000175000017500000000000013527063513016671 5ustar williamwilliamswig-4.0.1/Examples/pike/overload/example.i0000644000175000017500000000120613527063513020475 0ustar williamwilliam/* File : example.i */ %module example %{ #include "example.h" %} /** * These overloaded declarations conflict with other overloads (as far as * SWIG's Ruby module's implementation for overloaded methods is concerned). * One option is use the %rename directive to rename the conflicting methods; * here, we're just using %ignore to avoid wrapping some of the overloaded * functions altogether. */ %ignore Bar; %ignore Bar::Bar(Bar *); %ignore Bar::Bar(long); %ignore Bar::foo(const Bar&); %ignore Bar::foo(long); %ignore ::foo(const Bar&); %ignore ::foo(int); /* Let's just grab the original header file here */ %include "example.h" swig-4.0.1/Examples/pike/overload/example.cxx0000644000175000017500000000571713527063513021062 0ustar williamwilliam#include #include "example.h" // Overloaded constructors for class Bar Bar::Bar() { std::cout << "Called Bar::Bar()" << std::endl; } Bar::Bar(const Bar&) { std::cout << "Called Bar::Bar(const Bar&)" << std::endl; } Bar::Bar(double x) { std::cout << "Called Bar::Bar(double) with x = " << x << std::endl; } Bar::Bar(double x, char *y) { std::cout << "Called Bar::Bar(double, char *) with x, y = " << x << ", \"" << y << "\"" << std::endl; } Bar::Bar(int x, int y) { std::cout << "Called Bar::Bar(int, int) with x, y = " << x << ", " << y << std::endl; } Bar::Bar(char *x) { std::cout << "Called Bar::Bar(char *) with x = \"" << x << "\"" << std::endl; } Bar::Bar(int x) { std::cout << "Called Bar::Bar(int) with x = " << x << std::endl; } Bar::Bar(long x) { std::cout << "Called Bar::Bar(long) with x = " << x << std::endl; } Bar::Bar(Bar *x) { std::cout << "Called Bar::Bar(Bar *) with x = " << x << std::endl; } // Overloaded member functions void Bar::foo(const Bar& x) { std::cout << "Called Bar::foo(const Bar&) with &x = " << &x << std::endl; } void Bar::foo(double x) { std::cout << "Called Bar::foo(double) with x = " << x << std::endl; } void Bar::foo(double x, char *y) { std::cout << "Called Bar::foo(double, char *) with x, y = " << x << ", \"" << y << "\"" << std::endl; } void Bar::foo(int x, int y) { std::cout << "Called Bar::foo(int, int) with x, y = " << x << ", " << y << std::endl; } void Bar::foo(char *x) { std::cout << "Called Bar::foo(char *) with x = \"" << x << "\"" << std::endl; } void Bar::foo(int x) { std::cout << "Called Bar::foo(int) with x = " << x << std::endl; } void Bar::foo(long x) { std::cout << "Called Bar::foo(long) with x = " << x << std::endl; } void Bar::foo(Bar *x) { std::cout << "Called Bar::foo(Bar *) with x = " << x << std::endl; } void Bar::spam(int x, int y, int z) { std::cout << "Called Bar::spam(int, int, int) with x, y, z = " << x << ", " << y << ", " << z << std::endl; } void Bar::spam(double x, int y, int z) { std::cout << "Called Bar::spam(double, int, int) with x, y, z = " << x << ", " << y << ", " << z << std::endl; } // Overloaded global methods void foo(const Bar& x) { std::cout << "Called foo(const Bar& x) with &x = " << &x << std::endl; } void foo(double x) { std::cout << "Called foo(double) with x = " << x << std::endl; } void foo(double x, char *y) { std::cout << "Called foo(double, char *) with x, y = " << x << ", \"" << y << "\"" << std::endl; } void foo(int x, int y) { std::cout << "Called foo(int, int) with x, y = " << x << ", " << y << std::endl; } void foo(char *x) { std::cout << "Called foo(char *) with x = \"" << x << "\"" << std::endl; } void foo(int x) { std::cout << "Called foo(int) with x = " << x << std::endl; } void foo(long x) { std::cout << "Called foo(long) with x = " << x << std::endl; } void foo(Bar *x) { std::cout << "Called foo(Bar *) with x = " << x << std::endl; } swig-4.0.1/Examples/pike/overload/example.h0000644000175000017500000000132513527063513020476 0ustar williamwilliam#ifndef EXAMPLE_H #define EXAMPLE_H class Bar { public: Bar(); Bar(const Bar&); Bar(double); Bar(double, char *); Bar(int, int); Bar(char *); Bar(long); Bar(int); Bar(Bar *); void foo(const Bar&); void foo(double); void foo(double, char *); void foo(int, int); void foo(char *); void foo(long); void foo(int); void foo(Bar *); void spam(int x, int y=2, int z=3); void spam(double x, int y=2, int z=3); }; void foo(const Bar&); void foo(double); void foo(double, char *); void foo(int, int); void foo(char *); void foo(int); void foo(long); void foo(Bar *); void spam(int x, int y=2, int z=3); void spam(double x, int y=2, int z=3); #endif swig-4.0.1/Examples/pike/overload/Makefile0000644000175000017500000000131313527063513020327 0ustar williamwilliamTOP = ../.. SWIGEXE = $(TOP)/../swig SWIG_LIB_DIR = $(TOP)/../$(TOP_BUILDDIR_TO_TOP_SRCDIR)Lib CXXSRCS = example.cxx TARGET = example INTERFACE = example.i LIBS = -lstdc++ -lm check: build $(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' pike_run build: $(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' CXXSRCS='$(CXXSRCS)' \ SWIG_LIB_DIR='$(SWIG_LIB_DIR)' SWIGEXE='$(SWIGEXE)' \ TARGET='$(TARGET)' INTERFACE='$(INTERFACE)' pike_cpp static: $(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' CXXSRCS='$(CXXSRCS)' \ SWIG_LIB_DIR='$(SWIG_LIB_DIR)' SWIGEXE='$(SWIGEXE)' \ TARGET='mypike' INTERFACE='$(INTERFACE)' pike_cpp_static clean: $(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' pike_clean swig-4.0.1/Examples/pike/overload/runme.pike0000644000175000017500000000314513527063513020674 0ustar williamwilliam// import .example; int main() { // This should invoke foo(double) .example.foo(3.14159); // This should invoke foo(double, char *) .example.foo(3.14159, "Pi"); // This should invoke foo(int, int) .example.foo(3, 4); // This should invoke foo(char *) .example.foo("This is a test"); // This should invoke foo(long) .example.foo(42); /* // This should invoke Bar::Bar() followed by foo(Bar *) foo(Bar.new); // Skip a line write("\n"); // This should invoke Bar::Bar(double) Bar.new(3.14159); // This should invoke Bar::Bar(double, char *) Bar.new(3.14159, "Pi"); // This should invoke Bar::Bar(int, int) Bar.new(3, 4); // This should invoke Bar::Bar(char *) Bar.new("This is a test"); // This should invoke Bar::Bar(int) Bar.new(42); // This should invoke Bar::Bar() for the input argument, // followed by Bar::Bar(const Bar&). Bar.new(Bar.new); // Skip a line write("\n"); */ // Construct a new Bar instance (invokes Bar::Bar()) /* bar = Bar.new; // This should invoke Bar::foo(double) bar.foo(3.14159); // This should invoke Bar::foo(double, char *) bar.foo(3.14159, "Pi"); // This should invoke Bar::foo(int, int) bar.foo(3, 4); // This should invoke Bar::foo(char *) bar.foo("This is a test"); // This should invoke Bar::foo(int) bar.foo(42); // This should invoke Bar::Bar() to construct the input // argument, followed by Bar::foo(Bar *). bar.foo(Example::Bar.new); // This should invoke Bar::spam(int x, int y, int z) bar.spam(1); // This should invoke Bar::spam(double x, int y, int z) bar.spam(3.14159); */ write("Goodbye\n"); return 0; } swig-4.0.1/Examples/pike/constants/0000755000175000017500000000000013527063513017072 5ustar williamwilliamswig-4.0.1/Examples/pike/constants/example.i0000644000175000017500000000113513527063513020677 0ustar williamwilliam/* File : example.i */ %module example /* A few preprocessor macros */ #define ICONST 42 #define FCONST 2.1828 #define CCONST 'x' #define CCONST2 '\n' #define SCONST "Hello World" #define SCONST2 "\"Hello World\"" /* This should work just fine */ #define EXPR ICONST + 3*(FCONST) /* This shouldn't do anything */ #define EXTERN extern /* Neither should this (BAR isn't defined) */ #define FOO (ICONST + BAR) /* The following directives also produce constants */ %constant int iconst = 37; %constant double fconst = 3.14; swig-4.0.1/Examples/pike/constants/Makefile0000644000175000017500000000122113527063513020526 0ustar williamwilliamTOP = ../.. SWIGEXE = $(TOP)/../swig SWIG_LIB_DIR = $(TOP)/../$(TOP_BUILDDIR_TO_TOP_SRCDIR)Lib SRCS = TARGET = example INTERFACE = example.i check: build $(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' pike_run build: $(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' SRCS='$(SRCS)' \ SWIG_LIB_DIR='$(SWIG_LIB_DIR)' SWIGEXE='$(SWIGEXE)' \ TARGET='$(TARGET)' INTERFACE='$(INTERFACE)' pike static: $(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' SRCS='$(SRCS)' \ SWIG_LIB_DIR='$(SWIG_LIB_DIR)' SWIGEXE='$(SWIGEXE)' \ TARGET='mypike' INTERFACE='$(INTERFACE)' pike_static clean: $(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' pike_clean swig-4.0.1/Examples/pike/constants/runme.pike0000644000175000017500000000156613527063513021102 0ustar williamwilliamint main() { write("ICONST = %d (should be 42)\n", .example.ICONST); write("FCONST = %f (should be 2.1828)\n", .example.FCONST); write("CCONST = %c (should be 'x')\n", .example.CCONST); write("CCONST2 = %c (this should be on a new line)\n", .example.CCONST2); write("SCONST = %s (should be 'Hello World')\n", .example.SCONST); write("SCONST2 = %s (should be '\"Hello World\"')\n", .example.SCONST2); write("EXPR = %f (should be 48.5484)\n", .example.EXPR); write("iconst = %d (should be 37)\n", .example.iconst); write("fconst = %f (should be 3.14)\n", .example.fconst); if (search(indices(.example), "EXTERN") == -1) write("EXTERN isn't defined (good)\n"); else write("EXTERN is defined (bad)\n"); if (search(indices(.example), "FOO") == -1) write("FOO isn't defined (good)\n"); else write("FOO is defined (bad)\n"); return 0; } swig-4.0.1/Examples/index.html0000644000175000017500000000271213527063513016125 0ustar williamwilliam SWIG Examples

    SWIG Examples

    Welcome to the browsable SWIG Examples directory. This directory contains a collection of examples that illustrate various SWIG features for a variety of target languages. First, it is important to cover a few preliminaries:

    • All of the examples depend on the file Examples/Makefile found within the SWIG distribution. This file is created by 'configure' and usually requires no modifications. However, if you have an usual installation of packages or experience compilation problems, you may need to make a few modifications.

    • The examples directory is a work in progress and will probably remain somewhat incomplete. At this time, the Examples directory is somewhat sparse since it is being rewritten and reoganized.

    • The SWIG user manual also contains a large variety of examples.

    Fundamentals

    Follow one of these links to see some simple examples for a specific target language:
    If your target platform is Windows, make sure you also see the Windows page in the main manual. swig-4.0.1/Examples/android/0000755000175000017500000000000013527063513015546 5ustar williamwilliamswig-4.0.1/Examples/android/class/0000755000175000017500000000000013527063513016653 5ustar williamwilliamswig-4.0.1/Examples/android/class/local.properties0000644000175000017500000000066313527063513022070 0ustar williamwilliam# This file is automatically generated by Android Tools. # Do not modify this file -- YOUR CHANGES WILL BE ERASED! # # This file must *NOT* be checked in Version Control Systems, # as it contains information specific to your local configuration. # location of the SDK. This is only used by Ant # For customization when using a Version Control System, please read the # header note. sdk.dir=/home/william/android/android-sdk-linux_x86 swig-4.0.1/Examples/android/class/proguard.cfg0000644000175000017500000000234013527063513021156 0ustar williamwilliam-optimizationpasses 5 -dontusemixedcaseclassnames -dontskipnonpubliclibraryclasses -dontpreverify -verbose -optimizations !code/simplification/arithmetic,!field/*,!class/merging/* -keep public class * extends android.app.Activity -keep public class * extends android.app.Application -keep public class * extends android.app.Service -keep public class * extends android.content.BroadcastReceiver -keep public class * extends android.content.ContentProvider -keep public class * extends android.app.backup.BackupAgentHelper -keep public class * extends android.preference.Preference -keep public class com.android.vending.licensing.ILicensingService -keepclasseswithmembernames class * { native ; } -keepclasseswithmembers class * { public (android.content.Context, android.util.AttributeSet); } -keepclasseswithmembers class * { public (android.content.Context, android.util.AttributeSet, int); } -keepclassmembers class * extends android.app.Activity { public void *(android.view.View); } -keepclassmembers enum * { public static **[] values(); public static ** valueOf(java.lang.String); } -keep class * implements android.os.Parcelable { public static final android.os.Parcelable$Creator *; } swig-4.0.1/Examples/android/class/Makefile0000644000175000017500000000206613527063513020317 0ustar williamwilliamTOP = ../.. SWIGEXE = $(TOP)/../swig SWIG_LIB_DIR = $(TOP)/../$(TOP_BUILDDIR_TO_TOP_SRCDIR)Lib TARGET = example INTERFACE = example.i INTERFACEDIR = jni/ PACKAGEDIR = $(SRCDIR)src/org/swig PACKAGENAME= org.swig.classexample SWIGOPT = -package $(PACKAGENAME) -outdir $(PACKAGEDIR)/classexample PROJECTNAME= SwigClass TARGETID = 1 #INSTALLOPTIONS = -s # To install on SD Card check: build build: $(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' CXXSRCS='$(CXXSRCS)' \ SWIG_LIB_DIR='$(SWIG_LIB_DIR)' SWIGEXE='$(SWIGEXE)' \ SWIGOPT='$(SWIGOPT)' TARGET='$(TARGET)' INTERFACE='$(INTERFACE)' INTERFACEDIR='$(INTERFACEDIR)' \ PROJECTNAME='$(PROJECTNAME)' TARGETID='$(TARGETID)' android_cpp install: $(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' INSTALLOPTIONS='$(INSTALLOPTIONS)' PROJECTNAME='$(PROJECTNAME)' \ PACKAGEDIR='$(PACKAGEDIR)' PACKAGENAME='$(PACKAGENAME)' android_install clean: $(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' TARGET='$(TARGET)' PROJECTNAME='$(PROJECTNAME)' \ PACKAGEDIR='$(PACKAGEDIR)' INTERFACEDIR='$(INTERFACEDIR)' android_clean swig-4.0.1/Examples/android/class/ant.properties0000644000175000017500000000127013527063513021553 0ustar williamwilliam# This file is used to override default values used by the Ant build system. # # This file must be checked in Version Control Systems, as it is # integral to the build system of your project. # This file is only used by the Ant script. # You can use this to override default values such as # 'source.dir' for the location of your java source folder and # 'out.dir' for the location of your output folder. # You can also use it define how the release builds are signed by declaring # the following properties: # 'key.store' for the location of your keystore and # 'key.alias' for the name of the key to use. # The password will be asked during the build when you use the 'release' target. swig-4.0.1/Examples/android/class/src/0000755000175000017500000000000013527063513017442 5ustar williamwilliamswig-4.0.1/Examples/android/class/src/org/0000755000175000017500000000000013527063513020231 5ustar williamwilliamswig-4.0.1/Examples/android/class/src/org/swig/0000755000175000017500000000000013527063513021202 5ustar williamwilliamswig-4.0.1/Examples/android/class/src/org/swig/classexample/0000755000175000017500000000000013527063513023663 5ustar williamwilliamswig-4.0.1/Examples/android/class/src/org/swig/classexample/SwigClass.java0000644000175000017500000000616713527063513026437 0ustar williamwilliampackage org.swig.classexample; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.TextView; import android.widget.ScrollView; import android.text.method.ScrollingMovementMethod; public class SwigClass extends Activity { TextView outputText = null; ScrollView scroller = null; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); outputText = (TextView)findViewById(R.id.OutputText); outputText.setText("Press 'Run' to start...\n"); outputText.setMovementMethod(new ScrollingMovementMethod()); scroller = (ScrollView)findViewById(R.id.Scroller); } public void onRunButtonClick(View view) { outputText.append("Started...\n"); nativeCall(); outputText.append("Finished!\n"); // Ensure scroll to end of text scroller.post(new Runnable() { public void run() { scroller.fullScroll(ScrollView.FOCUS_DOWN); } }); } /** Calls into C/C++ code */ public void nativeCall() { // ----- Object creation ----- outputText.append( "Creating some objects:\n" ); Circle c = new Circle(10); outputText.append( " Created circle " + c + "\n"); Square s = new Square(10); outputText.append( " Created square " + s + "\n"); // ----- Access a static member ----- outputText.append( "\nA total of " + Shape.getNshapes() + " shapes were created\n" ); // ----- Member data access ----- // Notice how we can do this using functions specific to // the 'Circle' class. c.setX(20); c.setY(30); // Now use the same functions in the base class Shape shape = s; shape.setX(-10); shape.setY(5); outputText.append( "\nHere is their current position:\n" ); outputText.append( " Circle = (" + c.getX() + " " + c.getY() + ")\n" ); outputText.append( " Square = (" + s.getX() + " " + s.getY() + ")\n" ); // ----- Call some methods ----- outputText.append( "\nHere are some properties of the shapes:\n" ); Shape[] shapes = {c,s}; for (int i=0; i swig-4.0.1/Examples/android/class/res/0000755000175000017500000000000013527063513017444 5ustar williamwilliamswig-4.0.1/Examples/android/class/res/values/0000755000175000017500000000000013527063513020743 5ustar williamwilliamswig-4.0.1/Examples/android/class/res/values/strings.xml0000644000175000017500000000015713527063513023161 0ustar williamwilliam SwigClass swig-4.0.1/Examples/android/class/res/layout/0000755000175000017500000000000013527063513020761 5ustar williamwilliamswig-4.0.1/Examples/android/class/res/layout/main.xml0000644000175000017500000000132213527063513022425 0ustar williamwilliam